From jython-checkins at python.org Wed Mar 7 05:07:30 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:07:30 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_unicode=5Fliterals_support?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/jython/rev/01869de23bfd changeset: 6309:01869de23bfd user: Frank Wierzbicki date: Tue Mar 06 20:07:15 2012 -0800 summary: unicode_literals support. files: grammar/Python.g | 14 ++++++++--- src/org/python/antlr/GrammarActions.java | 9 ++++--- src/org/python/compiler/Future.java | 2 + src/org/python/core/CodeFlag.java | 6 ++++- src/org/python/core/FutureFeature.java | 4 +++ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -166,6 +166,7 @@ private String encoding; private boolean printStatement = true; + private boolean unicodeLiterals = false; public void setErrorHandler(ErrorHandler eh) { this.errorHandler = eh; @@ -935,9 +936,14 @@ if (dottedText != null && dottedText.equals("__future__")) { List aliases = $i1.atypes; for(alias a: aliases) { - if (a != null && a.getInternalName().equals("print_function")) { - printStatement = false; - break; + if (a != null) { + if (a.getInternalName().equals("print_function")) { + printStatement = false; + break; + } else if (a.getInternalName().equals("unicode_literals")) { + unicodeLiterals = true; + break; + } } } } @@ -1736,7 +1742,7 @@ } | (S+=STRING)+ { - etype = new Str(actions.extractStringToken($S), actions.extractStrings($S, encoding)); + etype = new Str(actions.extractStringToken($S), actions.extractStrings($S, encoding, unicodeLiterals)); } ; diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -429,14 +429,14 @@ } } - PyString extractStrings(List s, String encoding) { + PyString extractStrings(List s, String encoding, boolean unicodeLiterals) { boolean ustring = false; Token last = null; StringBuffer sb = new StringBuffer(); Iterator iter = s.iterator(); while (iter.hasNext()) { last = (Token)iter.next(); - StringPair sp = extractString(last, encoding); + StringPair sp = extractString(last, encoding, unicodeLiterals); if (sp.isUnicode()) { ustring = true; } @@ -448,12 +448,12 @@ return new PyString(sb.toString()); } - StringPair extractString(Token t, String encoding) { + StringPair extractString(Token t, String encoding, boolean unicodeLiterals) { String string = t.getText(); char quoteChar = string.charAt(0); int start = 0; int end; - boolean ustring = false; + boolean ustring = unicodeLiterals; if (quoteChar == 'u' || quoteChar == 'U') { ustring = true; @@ -462,6 +462,7 @@ if (quoteChar == 'b' || quoteChar == 'B') { // In 2.x this is just a str, and the parser prevents a 'u' and a // 'b' in the same identifier, so just advance start. + ustring = false; start++; } quoteChar = string.charAt(start); diff --git a/src/org/python/compiler/Future.java b/src/org/python/compiler/Future.java --- a/src/org/python/compiler/Future.java +++ b/src/org/python/compiler/Future.java @@ -62,6 +62,8 @@ FutureFeature.absolute_import.addTo(features); if (cflags.isFlagSet(CodeFlag.CO_FUTURE_PRINT_FUNCTION)) FutureFeature.print_function.addTo(features); + if (cflags.isFlagSet(CodeFlag.CO_FUTURE_UNICODE_LITERALS)) + FutureFeature.unicode_literals.addTo(features); } int beg = 0; List suite = null; diff --git a/src/org/python/core/CodeFlag.java b/src/org/python/core/CodeFlag.java --- a/src/org/python/core/CodeFlag.java +++ b/src/org/python/core/CodeFlag.java @@ -54,7 +54,11 @@ /** * print function. */ - CO_FUTURE_PRINT_FUNCTION(0x10000); + CO_FUTURE_PRINT_FUNCTION(0x10000), + /** + * unicode literals. + */ + CO_FUTURE_UNICODE_LITERALS(0x20000); public final int flag; diff --git a/src/org/python/core/FutureFeature.java b/src/org/python/core/FutureFeature.java --- a/src/org/python/core/FutureFeature.java +++ b/src/org/python/core/FutureFeature.java @@ -28,6 +28,10 @@ */ print_function(CodeFlag.CO_FUTURE_PRINT_FUNCTION), /** + * Enables unicode literals. + */ + unicode_literals(CodeFlag.CO_FUTURE_UNICODE_LITERALS), + /** * Use braces for block delimiters instead of indentation. */ braces { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 7 05:24:07 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:24:07 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_with=5Fitem=2E?= Message-ID: http://hg.python.org/jython/rev/a75007ed1f48 changeset: 6310:a75007ed1f48 parent: 6308:e49a734162b9 user: Frank Wierzbicki date: Tue Mar 06 11:28:51 2012 -0800 summary: Add with_item. files: grammar/Python.g | 18 +++++++++-- src/org/python/antlr/GrammarActions.java | 7 ++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -1171,17 +1171,27 @@ @after { $with_stmt.tree = stype; } - : WITH test[expr_contextType.Load] (with_var)? COLON suite[false] + : WITH with_item COLON suite[false] { - stype = new With($WITH, actions.castExpr($test.tree), $with_var.etype, + stype = new With($WITH, $with_item.item, $with_item.var, actions.castStmts($suite.stypes)); } ; -//with_var: ('as' | NAME) expr +//with_item: test ['as' expr] +with_item + returns [expr item, expr var] + : test[expr_contextType.Load] (with_var)? + { + $item = actions.castExpr($test.tree); + $var = $with_var.etype; + } + ; + +//with_var: 'as' expr with_var returns [expr etype] - : (AS | NAME) expr[expr_contextType.Store] + : AS expr[expr_contextType.Store] { $etype = actions.castExpr($expr.tree); actions.checkAssign($etype); diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -41,6 +41,7 @@ import org.python.antlr.ast.Str; import org.python.antlr.ast.UnaryOp; import org.python.antlr.ast.While; +import org.python.antlr.ast.With; import org.python.antlr.ast.Yield; import org.python.antlr.base.excepthandler; import org.python.antlr.base.expr; @@ -240,6 +241,12 @@ return new While(t, test, b, o); } + stmt makeWith(Token t, List withs, List body) { + With w = (With)withs.get(0); + With result = new With(t, w.getInternalContext_expr(), w.getInternalOptional_vars(), w.getInternalBody()); + return result; + } + stmt makeFor(Token t, expr target, expr iter, List body, List orelse) { if (target == null || iter == null) { return errorHandler.errorStmt(new PythonTree(t)); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 7 05:24:07 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:24:07 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Complete_multi-context_with_?= =?utf8?q?statement=2E?= Message-ID: http://hg.python.org/jython/rev/427e560506e3 changeset: 6311:427e560506e3 user: Frank Wierzbicki date: Tue Mar 06 14:23:04 2012 -0800 summary: Complete multi-context with statement. files: grammar/Python.g | 35 +++++------ src/org/python/antlr/GrammarActions.java | 14 +++- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -1163,7 +1163,7 @@ ) ; -//with_stmt: 'with' test [ with_var ] ':' suite +//with_stmt: 'with' with_item (',' with_item)* ':' suite with_stmt @init { stmt stype = null; @@ -1171,30 +1171,29 @@ @after { $with_stmt.tree = stype; } - : WITH with_item COLON suite[false] + : WITH w+=with_item (options {greedy=true;}:COMMA w+=with_item)* COLON suite[false] { - stype = new With($WITH, $with_item.item, $with_item.var, - actions.castStmts($suite.stypes)); + stype = actions.makeWith($WITH, $w, $suite.stypes); } ; //with_item: test ['as' expr] with_item - returns [expr item, expr var] - : test[expr_contextType.Load] (with_var)? + at init { + stmt stype = null; +} + at after { + $with_item.tree = stype; +} + : test[expr_contextType.Load] (AS expr[expr_contextType.Store])? { - $item = actions.castExpr($test.tree); - $var = $with_var.etype; - } - ; - -//with_var: 'as' expr -with_var - returns [expr etype] - : AS expr[expr_contextType.Store] - { - $etype = actions.castExpr($expr.tree); - actions.checkAssign($etype); + expr item = actions.castExpr($test.tree); + expr var = null; + if ($expr.start != null) { + var = actions.castExpr($expr.tree); + actions.checkAssign(var); + } + stype = new With($test.start, item, var, null); } ; diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -241,9 +241,17 @@ return new While(t, test, b, o); } - stmt makeWith(Token t, List withs, List body) { - With w = (With)withs.get(0); - With result = new With(t, w.getInternalContext_expr(), w.getInternalOptional_vars(), w.getInternalBody()); + stmt makeWith(Token t, List items, List body) { + int last = items.size() - 1; + With result = null; + for (int i = last; i>=0; i--) { + With current = items.get(i); + if (i != last) { + body = new ArrayList(); + body.add(result); + } + result = new With(current.getToken(), current.getInternalContext_expr(), current.getInternalOptional_vars(), body); + } return result; } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 7 05:24:07 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:24:07 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Multiple_context_managers=2E?= Message-ID: http://hg.python.org/jython/rev/587310b11b26 changeset: 6312:587310b11b26 parent: 6309:01869de23bfd parent: 6311:427e560506e3 user: Frank Wierzbicki date: Tue Mar 06 20:23:59 2012 -0800 summary: Multiple context managers. files: grammar/Python.g | 29 +++++++---- src/org/python/antlr/GrammarActions.java | 15 ++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -1169,7 +1169,7 @@ ) ; -//with_stmt: 'with' test [ with_var ] ':' suite +//with_stmt: 'with' with_item (',' with_item)* ':' suite with_stmt @init { stmt stype = null; @@ -1177,20 +1177,29 @@ @after { $with_stmt.tree = stype; } - : WITH test[expr_contextType.Load] (with_var)? COLON suite[false] + : WITH w+=with_item (options {greedy=true;}:COMMA w+=with_item)* COLON suite[false] { - stype = new With($WITH, actions.castExpr($test.tree), $with_var.etype, - actions.castStmts($suite.stypes)); + stype = actions.makeWith($WITH, $w, $suite.stypes); } ; -//with_var: ('as' | NAME) expr -with_var - returns [expr etype] - : (AS | NAME) expr[expr_contextType.Store] +//with_item: test ['as' expr] +with_item + at init { + stmt stype = null; +} + at after { + $with_item.tree = stype; +} + : test[expr_contextType.Load] (AS expr[expr_contextType.Store])? { - $etype = actions.castExpr($expr.tree); - actions.checkAssign($etype); + expr item = actions.castExpr($test.tree); + expr var = null; + if ($expr.start != null) { + var = actions.castExpr($expr.tree); + actions.checkAssign(var); + } + stype = new With($test.start, item, var, null); } ; diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -41,6 +41,7 @@ import org.python.antlr.ast.Str; import org.python.antlr.ast.UnaryOp; import org.python.antlr.ast.While; +import org.python.antlr.ast.With; import org.python.antlr.ast.Yield; import org.python.antlr.base.excepthandler; import org.python.antlr.base.expr; @@ -240,6 +241,20 @@ return new While(t, test, b, o); } + stmt makeWith(Token t, List items, List body) { + int last = items.size() - 1; + With result = null; + for (int i = last; i>=0; i--) { + With current = items.get(i); + if (i != last) { + body = new ArrayList(); + body.add(result); + } + result = new With(current.getToken(), current.getInternalContext_expr(), current.getInternalOptional_vars(), body); + } + return result; + } + stmt makeFor(Token t, expr target, expr iter, List body, List orelse) { if (target == null || iter == null) { return errorHandler.errorStmt(new PythonTree(t)); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 7 05:27:21 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:27:21 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Set_literals=2E?= Message-ID: http://hg.python.org/jython/rev/039641b01639 changeset: 6313:039641b01639 parent: 6308:e49a734162b9 user: Frank Wierzbicki date: Tue Mar 06 15:27:30 2012 -0800 summary: Set literals. files: ast/Python.asdl | 9 +- grammar/Python.g | 39 +- src/org/python/antlr/ast/DictComp.java | 225 ++++++++++ src/org/python/antlr/ast/Set.java | 171 +++++++ src/org/python/antlr/ast/SetComp.java | 197 ++++++++ src/org/python/antlr/ast/VisitorBase.java | 18 + src/org/python/antlr/ast/VisitorIF.java | 3 + src/org/python/compiler/CodeCompiler.java | 15 + src/org/python/core/BaseSet.java | 13 + src/org/python/core/PySet.java | 4 + 10 files changed, 679 insertions(+), 15 deletions(-) diff --git a/ast/Python.asdl b/ast/Python.asdl --- a/ast/Python.asdl +++ b/ast/Python.asdl @@ -1,6 +1,6 @@ -- ASDL's five builtin types are identifier, int, string, object, bool -module Python version "$Revision: 62047 $" +module Python version "$Revision$" { mod = Module(stmt* body) | Interactive(stmt* body) @@ -11,7 +11,7 @@ stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list) - | ClassDef(identifier name, expr* bases, stmt* body, expr *decorator_list) + | ClassDef(identifier name, expr* bases, stmt* body, expr* decorator_list) | Return(expr? value) | Delete(expr* targets) @@ -34,7 +34,7 @@ | Assert(expr test, expr? msg) | Import(alias* names) - | ImportFrom(identifier module, alias* names, int? level) + | ImportFrom(identifier? module, alias* names, int? level) -- Doesn't capture requirement that locals must be -- defined if globals is @@ -56,7 +56,10 @@ | Lambda(arguments args, expr body) | IfExp(expr test, expr body, expr orelse) | Dict(expr* keys, expr* values) + | Set(expr* elts) | ListComp(expr elt, comprehension* generators) + | SetComp(expr elt, comprehension* generators) + | DictComp(expr key, expr value, comprehension* generators) | GeneratorExp(expr elt, comprehension* generators) -- the grammar constrains where yield expressions can occur | Yield(expr? value) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -131,6 +131,7 @@ import org.python.antlr.ast.Raise; import org.python.antlr.ast.Repr; import org.python.antlr.ast.Return; +import org.python.antlr.ast.Set; import org.python.antlr.ast.Slice; import org.python.antlr.ast.Str; import org.python.antlr.ast.Subscript; @@ -1660,7 +1661,7 @@ //atom: ('(' [yield_expr|testlist_gexp] ')' | // '[' [listmaker] ']' | -// '{' [dictmaker] '}' | +// '{' [dictorsetmaker] '}' | // '`' testlist1 '`' | // NAME | NUMBER | STRING+) atom @@ -1699,10 +1700,14 @@ ) RBRACK | LCURLY - (dictmaker + (dictorsetmaker { - etype = new Dict($LCURLY, actions.castExprs($dictmaker.keys), - actions.castExprs($dictmaker.values)); + if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) { + etype = new Set($LCURLY, actions.castExprs($dictorsetmaker.keys)); + } else { + etype = new Dict($LCURLY, actions.castExprs($dictorsetmaker.keys), + actions.castExprs($dictorsetmaker.values)); + } } | { @@ -1946,16 +1951,26 @@ | test[ctype] ; +//dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) | +// (test (comp_for | (',' test)* [','])) ) + //dictmaker: test ':' test (',' test ':' test)* [','] -dictmaker +dictorsetmaker returns [List keys, List values] - : k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load] - (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* - (COMMA)? - { - $keys = $k; - $values= $v; - } + : k+=test[expr_contextType.Load] + (COLON v+=test[expr_contextType.Load] + (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + { + $keys = $k; + $values= $v; + } + |(COMMA k+=test[expr_contextType.Load])* + { + $keys = $k; + $values = null; + } + ) + (COMMA)? ; //classdef: 'class' NAME ['(' [testlist] ')'] ':' suite diff --git a/src/org/python/antlr/ast/DictComp.java b/src/org/python/antlr/ast/DictComp.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/DictComp.java @@ -0,0 +1,225 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.DictComp", base = AST.class) +public class DictComp extends expr { +public static final PyType TYPE = PyType.fromClass(DictComp.class); + private expr key; + public expr getInternalKey() { + return key; + } + @ExposedGet(name = "key") + public PyObject getKey() { + return key; + } + @ExposedSet(name = "key") + public void setKey(PyObject key) { + this.key = AstAdapters.py2expr(key); + } + + private expr value; + public expr getInternalValue() { + return value; + } + @ExposedGet(name = "value") + public PyObject getValue() { + return value; + } + @ExposedSet(name = "value") + public void setValue(PyObject value) { + this.value = AstAdapters.py2expr(value); + } + + private java.util.List generators; + public java.util.List getInternalGenerators() { + return generators; + } + @ExposedGet(name = "generators") + public PyObject getGenerators() { + return new AstList(generators, AstAdapters.comprehensionAdapter); + } + @ExposedSet(name = "generators") + public void setGenerators(PyObject generators) { + this.generators = AstAdapters.py2comprehensionList(generators); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("key"), new PyString("value"), new PyString("generators")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public DictComp(PyType subType) { + super(subType); + } + public DictComp() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void DictComp___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("DictComp", args, keywords, new String[] + {"key", "value", "generators", "lineno", "col_offset"}, 3, true); + setKey(ap.getPyObject(0, Py.None)); + setValue(ap.getPyObject(1, Py.None)); + setGenerators(ap.getPyObject(2, Py.None)); + int lin = ap.getInt(3, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(4, -1); + if (col != -1) { + setLineno(col); + } + + } + + public DictComp(PyObject key, PyObject value, PyObject generators) { + setKey(key); + setValue(value); + setGenerators(generators); + } + + public DictComp(Token token, expr key, expr value, java.util.List generators) { + super(token); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public DictComp(Integer ttype, Token token, expr key, expr value, java.util.List + generators) { + super(ttype, token); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public DictComp(PythonTree tree, expr key, expr value, java.util.List + generators) { + super(tree); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "DictComp"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("DictComp("); + sb.append("key="); + sb.append(dumpThis(key)); + sb.append(","); + sb.append("value="); + sb.append(dumpThis(value)); + sb.append(","); + sb.append("generators="); + sb.append(dumpThis(generators)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitDictComp(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (key != null) + key.accept(visitor); + if (value != null) + value.accept(visitor); + if (generators != null) { + for (PythonTree t : generators) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/Set.java b/src/org/python/antlr/ast/Set.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/Set.java @@ -0,0 +1,171 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.Set", base = AST.class) +public class Set extends expr { +public static final PyType TYPE = PyType.fromClass(Set.class); + private java.util.List elts; + public java.util.List getInternalElts() { + return elts; + } + @ExposedGet(name = "elts") + public PyObject getElts() { + return new AstList(elts, AstAdapters.exprAdapter); + } + @ExposedSet(name = "elts") + public void setElts(PyObject elts) { + this.elts = AstAdapters.py2exprList(elts); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("elts")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public Set(PyType subType) { + super(subType); + } + public Set() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void Set___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("Set", args, keywords, new String[] + {"elts", "lineno", "col_offset"}, 1, true); + setElts(ap.getPyObject(0, Py.None)); + int lin = ap.getInt(1, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(2, -1); + if (col != -1) { + setLineno(col); + } + + } + + public Set(PyObject elts) { + setElts(elts); + } + + public Set(Token token, java.util.List elts) { + super(token); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + public Set(Integer ttype, Token token, java.util.List elts) { + super(ttype, token); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + public Set(PythonTree tree, java.util.List elts) { + super(tree); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "Set"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("Set("); + sb.append("elts="); + sb.append(dumpThis(elts)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitSet(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (elts != null) { + for (PythonTree t : elts) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/SetComp.java b/src/org/python/antlr/ast/SetComp.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/SetComp.java @@ -0,0 +1,197 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.SetComp", base = AST.class) +public class SetComp extends expr { +public static final PyType TYPE = PyType.fromClass(SetComp.class); + private expr elt; + public expr getInternalElt() { + return elt; + } + @ExposedGet(name = "elt") + public PyObject getElt() { + return elt; + } + @ExposedSet(name = "elt") + public void setElt(PyObject elt) { + this.elt = AstAdapters.py2expr(elt); + } + + private java.util.List generators; + public java.util.List getInternalGenerators() { + return generators; + } + @ExposedGet(name = "generators") + public PyObject getGenerators() { + return new AstList(generators, AstAdapters.comprehensionAdapter); + } + @ExposedSet(name = "generators") + public void setGenerators(PyObject generators) { + this.generators = AstAdapters.py2comprehensionList(generators); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("elt"), new PyString("generators")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public SetComp(PyType subType) { + super(subType); + } + public SetComp() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void SetComp___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("SetComp", args, keywords, new String[] + {"elt", "generators", "lineno", "col_offset"}, 2, true); + setElt(ap.getPyObject(0, Py.None)); + setGenerators(ap.getPyObject(1, Py.None)); + int lin = ap.getInt(2, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(3, -1); + if (col != -1) { + setLineno(col); + } + + } + + public SetComp(PyObject elt, PyObject generators) { + setElt(elt); + setGenerators(generators); + } + + public SetComp(Token token, expr elt, java.util.List generators) { + super(token); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public SetComp(Integer ttype, Token token, expr elt, java.util.List generators) { + super(ttype, token); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public SetComp(PythonTree tree, expr elt, java.util.List generators) { + super(tree); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "SetComp"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("SetComp("); + sb.append("elt="); + sb.append(dumpThis(elt)); + sb.append(","); + sb.append("generators="); + sb.append(dumpThis(generators)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitSetComp(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (elt != null) + elt.accept(visitor); + if (generators != null) { + for (PythonTree t : generators) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/VisitorBase.java b/src/org/python/antlr/ast/VisitorBase.java --- a/src/org/python/antlr/ast/VisitorBase.java +++ b/src/org/python/antlr/ast/VisitorBase.java @@ -221,12 +221,30 @@ return ret; } + public R visitSet(Set node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + public R visitListComp(ListComp node) throws Exception { R ret = unhandled_node(node); traverse(node); return ret; } + public R visitSetComp(SetComp node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + + public R visitDictComp(DictComp node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + public R visitGeneratorExp(GeneratorExp node) throws Exception { R ret = unhandled_node(node); traverse(node); diff --git a/src/org/python/antlr/ast/VisitorIF.java b/src/org/python/antlr/ast/VisitorIF.java --- a/src/org/python/antlr/ast/VisitorIF.java +++ b/src/org/python/antlr/ast/VisitorIF.java @@ -35,7 +35,10 @@ public R visitLambda(Lambda node) throws Exception; public R visitIfExp(IfExp node) throws Exception; public R visitDict(Dict node) throws Exception; + public R visitSet(Set node) throws Exception; public R visitListComp(ListComp node) throws Exception; + public R visitSetComp(SetComp node) throws Exception; + public R visitDictComp(DictComp node) throws Exception; public R visitGeneratorExp(GeneratorExp node) throws Exception; public R visitYield(Yield node) throws Exception; public R visitCompare(Compare node) throws Exception; diff --git a/src/org/python/compiler/CodeCompiler.java b/src/org/python/compiler/CodeCompiler.java --- a/src/org/python/compiler/CodeCompiler.java +++ b/src/org/python/compiler/CodeCompiler.java @@ -52,6 +52,7 @@ import org.python.antlr.ast.Raise; import org.python.antlr.ast.Repr; import org.python.antlr.ast.Return; +import org.python.antlr.ast.Set; import org.python.antlr.ast.Slice; import org.python.antlr.ast.Str; import org.python.antlr.ast.Subscript; @@ -88,6 +89,7 @@ import org.python.core.PyList; import org.python.core.PyLong; import org.python.core.PyObject; +import org.python.core.PySet; import org.python.core.PySlice; import org.python.core.PyString; import org.python.core.PyTuple; @@ -2180,6 +2182,19 @@ } @Override + public Object visitSet(Set node) throws Exception { + int content = makeArray(node.getInternalElts()); + + code.new_(p(PySet.class)); + code.dup(); + code.aload(content); + code.invokespecial(p(PySet.class), "", sig(Void.TYPE, PyObject[].class)); + freeArray(content); + return null; + } + + + @Override public Object visitRepr(Repr node) throws Exception { visit(node.getInternalValue()); code.invokevirtual(p(PyObject.class), "__repr__", sig(PyString.class)); diff --git a/src/org/python/core/BaseSet.java b/src/org/python/core/BaseSet.java --- a/src/org/python/core/BaseSet.java +++ b/src/org/python/core/BaseSet.java @@ -42,6 +42,19 @@ } /** + * Update the underlying set with the contents of the iterable. + */ + protected static Set _update(Set set, PyObject[] data) { + if (data == null) { + return set; + } + for (PyObject item : data) { + set.add(item); + } + return set; + } + + /** * The union of this with other.


(I.e. all elements * that are in either set) * diff --git a/src/org/python/core/PySet.java b/src/org/python/core/PySet.java --- a/src/org/python/core/PySet.java +++ b/src/org/python/core/PySet.java @@ -26,6 +26,10 @@ super(TYPE, _update(Generic.concurrentSet(), data)); } + public PySet(PyObject[] data) { + super(TYPE, _update(Generic.concurrentSet(), data)); + } + @ExposedNew @ExposedMethod(doc = BuiltinDocs.set___init___doc) final void set___init__(PyObject[] args, String[] kwds) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 7 05:27:21 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 07 Mar 2012 05:27:21 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Updated_AST_based_on_2=2E7_CPython_and_added_support_for_?= =?utf8?q?set_literals=2E?= Message-ID: http://hg.python.org/jython/rev/1939ab4891d8 changeset: 6314:1939ab4891d8 parent: 6312:587310b11b26 parent: 6313:039641b01639 user: Frank Wierzbicki date: Tue Mar 06 20:27:14 2012 -0800 summary: Updated AST based on 2.7 CPython and added support for set literals. files: ast/Python.asdl | 9 +- grammar/Python.g | 39 +- src/org/python/antlr/ast/DictComp.java | 225 ++++++++++ src/org/python/antlr/ast/Set.java | 171 +++++++ src/org/python/antlr/ast/SetComp.java | 197 ++++++++ src/org/python/antlr/ast/VisitorBase.java | 18 + src/org/python/antlr/ast/VisitorIF.java | 3 + src/org/python/compiler/CodeCompiler.java | 15 + src/org/python/core/BaseSet.java | 13 + src/org/python/core/PySet.java | 4 + 10 files changed, 679 insertions(+), 15 deletions(-) diff --git a/ast/Python.asdl b/ast/Python.asdl --- a/ast/Python.asdl +++ b/ast/Python.asdl @@ -1,6 +1,6 @@ -- ASDL's five builtin types are identifier, int, string, object, bool -module Python version "$Revision: 62047 $" +module Python version "$Revision$" { mod = Module(stmt* body) | Interactive(stmt* body) @@ -11,7 +11,7 @@ stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list) - | ClassDef(identifier name, expr* bases, stmt* body, expr *decorator_list) + | ClassDef(identifier name, expr* bases, stmt* body, expr* decorator_list) | Return(expr? value) | Delete(expr* targets) @@ -34,7 +34,7 @@ | Assert(expr test, expr? msg) | Import(alias* names) - | ImportFrom(identifier module, alias* names, int? level) + | ImportFrom(identifier? module, alias* names, int? level) -- Doesn't capture requirement that locals must be -- defined if globals is @@ -56,7 +56,10 @@ | Lambda(arguments args, expr body) | IfExp(expr test, expr body, expr orelse) | Dict(expr* keys, expr* values) + | Set(expr* elts) | ListComp(expr elt, comprehension* generators) + | SetComp(expr elt, comprehension* generators) + | DictComp(expr key, expr value, comprehension* generators) | GeneratorExp(expr elt, comprehension* generators) -- the grammar constrains where yield expressions can occur | Yield(expr? value) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -131,6 +131,7 @@ import org.python.antlr.ast.Raise; import org.python.antlr.ast.Repr; import org.python.antlr.ast.Return; +import org.python.antlr.ast.Set; import org.python.antlr.ast.Slice; import org.python.antlr.ast.Str; import org.python.antlr.ast.Subscript; @@ -1675,7 +1676,7 @@ //atom: ('(' [yield_expr|testlist_gexp] ')' | // '[' [listmaker] ']' | -// '{' [dictmaker] '}' | +// '{' [dictorsetmaker] '}' | // '`' testlist1 '`' | // NAME | NUMBER | STRING+) atom @@ -1714,10 +1715,14 @@ ) RBRACK | LCURLY - (dictmaker + (dictorsetmaker { - etype = new Dict($LCURLY, actions.castExprs($dictmaker.keys), - actions.castExprs($dictmaker.values)); + if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) { + etype = new Set($LCURLY, actions.castExprs($dictorsetmaker.keys)); + } else { + etype = new Dict($LCURLY, actions.castExprs($dictorsetmaker.keys), + actions.castExprs($dictorsetmaker.values)); + } } | { @@ -1961,16 +1966,26 @@ | test[ctype] ; +//dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) | +// (test (comp_for | (',' test)* [','])) ) + //dictmaker: test ':' test (',' test ':' test)* [','] -dictmaker +dictorsetmaker returns [List keys, List values] - : k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load] - (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* - (COMMA)? - { - $keys = $k; - $values= $v; - } + : k+=test[expr_contextType.Load] + (COLON v+=test[expr_contextType.Load] + (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + { + $keys = $k; + $values= $v; + } + |(COMMA k+=test[expr_contextType.Load])* + { + $keys = $k; + $values = null; + } + ) + (COMMA)? ; //classdef: 'class' NAME ['(' [testlist] ')'] ':' suite diff --git a/src/org/python/antlr/ast/DictComp.java b/src/org/python/antlr/ast/DictComp.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/DictComp.java @@ -0,0 +1,225 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.DictComp", base = AST.class) +public class DictComp extends expr { +public static final PyType TYPE = PyType.fromClass(DictComp.class); + private expr key; + public expr getInternalKey() { + return key; + } + @ExposedGet(name = "key") + public PyObject getKey() { + return key; + } + @ExposedSet(name = "key") + public void setKey(PyObject key) { + this.key = AstAdapters.py2expr(key); + } + + private expr value; + public expr getInternalValue() { + return value; + } + @ExposedGet(name = "value") + public PyObject getValue() { + return value; + } + @ExposedSet(name = "value") + public void setValue(PyObject value) { + this.value = AstAdapters.py2expr(value); + } + + private java.util.List generators; + public java.util.List getInternalGenerators() { + return generators; + } + @ExposedGet(name = "generators") + public PyObject getGenerators() { + return new AstList(generators, AstAdapters.comprehensionAdapter); + } + @ExposedSet(name = "generators") + public void setGenerators(PyObject generators) { + this.generators = AstAdapters.py2comprehensionList(generators); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("key"), new PyString("value"), new PyString("generators")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public DictComp(PyType subType) { + super(subType); + } + public DictComp() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void DictComp___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("DictComp", args, keywords, new String[] + {"key", "value", "generators", "lineno", "col_offset"}, 3, true); + setKey(ap.getPyObject(0, Py.None)); + setValue(ap.getPyObject(1, Py.None)); + setGenerators(ap.getPyObject(2, Py.None)); + int lin = ap.getInt(3, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(4, -1); + if (col != -1) { + setLineno(col); + } + + } + + public DictComp(PyObject key, PyObject value, PyObject generators) { + setKey(key); + setValue(value); + setGenerators(generators); + } + + public DictComp(Token token, expr key, expr value, java.util.List generators) { + super(token); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public DictComp(Integer ttype, Token token, expr key, expr value, java.util.List + generators) { + super(ttype, token); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public DictComp(PythonTree tree, expr key, expr value, java.util.List + generators) { + super(tree); + this.key = key; + addChild(key); + this.value = value; + addChild(value); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "DictComp"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("DictComp("); + sb.append("key="); + sb.append(dumpThis(key)); + sb.append(","); + sb.append("value="); + sb.append(dumpThis(value)); + sb.append(","); + sb.append("generators="); + sb.append(dumpThis(generators)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitDictComp(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (key != null) + key.accept(visitor); + if (value != null) + value.accept(visitor); + if (generators != null) { + for (PythonTree t : generators) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/Set.java b/src/org/python/antlr/ast/Set.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/Set.java @@ -0,0 +1,171 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.Set", base = AST.class) +public class Set extends expr { +public static final PyType TYPE = PyType.fromClass(Set.class); + private java.util.List elts; + public java.util.List getInternalElts() { + return elts; + } + @ExposedGet(name = "elts") + public PyObject getElts() { + return new AstList(elts, AstAdapters.exprAdapter); + } + @ExposedSet(name = "elts") + public void setElts(PyObject elts) { + this.elts = AstAdapters.py2exprList(elts); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("elts")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public Set(PyType subType) { + super(subType); + } + public Set() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void Set___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("Set", args, keywords, new String[] + {"elts", "lineno", "col_offset"}, 1, true); + setElts(ap.getPyObject(0, Py.None)); + int lin = ap.getInt(1, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(2, -1); + if (col != -1) { + setLineno(col); + } + + } + + public Set(PyObject elts) { + setElts(elts); + } + + public Set(Token token, java.util.List elts) { + super(token); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + public Set(Integer ttype, Token token, java.util.List elts) { + super(ttype, token); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + public Set(PythonTree tree, java.util.List elts) { + super(tree); + this.elts = elts; + if (elts == null) { + this.elts = new ArrayList(); + } + for(PythonTree t : this.elts) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "Set"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("Set("); + sb.append("elts="); + sb.append(dumpThis(elts)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitSet(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (elts != null) { + for (PythonTree t : elts) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/SetComp.java b/src/org/python/antlr/ast/SetComp.java new file mode 100644 --- /dev/null +++ b/src/org/python/antlr/ast/SetComp.java @@ -0,0 +1,197 @@ +// Autogenerated AST node +package org.python.antlr.ast; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import org.python.antlr.AST; +import org.python.antlr.PythonTree; +import org.python.antlr.adapter.AstAdapters; +import org.python.antlr.base.excepthandler; +import org.python.antlr.base.expr; +import org.python.antlr.base.mod; +import org.python.antlr.base.slice; +import org.python.antlr.base.stmt; +import org.python.core.ArgParser; +import org.python.core.AstList; +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedSet; +import org.python.expose.ExposedType; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; + + at ExposedType(name = "_ast.SetComp", base = AST.class) +public class SetComp extends expr { +public static final PyType TYPE = PyType.fromClass(SetComp.class); + private expr elt; + public expr getInternalElt() { + return elt; + } + @ExposedGet(name = "elt") + public PyObject getElt() { + return elt; + } + @ExposedSet(name = "elt") + public void setElt(PyObject elt) { + this.elt = AstAdapters.py2expr(elt); + } + + private java.util.List generators; + public java.util.List getInternalGenerators() { + return generators; + } + @ExposedGet(name = "generators") + public PyObject getGenerators() { + return new AstList(generators, AstAdapters.comprehensionAdapter); + } + @ExposedSet(name = "generators") + public void setGenerators(PyObject generators) { + this.generators = AstAdapters.py2comprehensionList(generators); + } + + + private final static PyString[] fields = + new PyString[] {new PyString("elt"), new PyString("generators")}; + @ExposedGet(name = "_fields") + public PyString[] get_fields() { return fields; } + + private final static PyString[] attributes = + new PyString[] {new PyString("lineno"), new PyString("col_offset")}; + @ExposedGet(name = "_attributes") + public PyString[] get_attributes() { return attributes; } + + public SetComp(PyType subType) { + super(subType); + } + public SetComp() { + this(TYPE); + } + @ExposedNew + @ExposedMethod + public void SetComp___init__(PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("SetComp", args, keywords, new String[] + {"elt", "generators", "lineno", "col_offset"}, 2, true); + setElt(ap.getPyObject(0, Py.None)); + setGenerators(ap.getPyObject(1, Py.None)); + int lin = ap.getInt(2, -1); + if (lin != -1) { + setLineno(lin); + } + + int col = ap.getInt(3, -1); + if (col != -1) { + setLineno(col); + } + + } + + public SetComp(PyObject elt, PyObject generators) { + setElt(elt); + setGenerators(generators); + } + + public SetComp(Token token, expr elt, java.util.List generators) { + super(token); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public SetComp(Integer ttype, Token token, expr elt, java.util.List generators) { + super(ttype, token); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + public SetComp(PythonTree tree, expr elt, java.util.List generators) { + super(tree); + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators == null) { + this.generators = new ArrayList(); + } + for(PythonTree t : this.generators) { + addChild(t); + } + } + + @ExposedGet(name = "repr") + public String toString() { + return "SetComp"; + } + + public String toStringTree() { + StringBuffer sb = new StringBuffer("SetComp("); + sb.append("elt="); + sb.append(dumpThis(elt)); + sb.append(","); + sb.append("generators="); + sb.append(dumpThis(generators)); + sb.append(","); + sb.append(")"); + return sb.toString(); + } + + public R accept(VisitorIF visitor) throws Exception { + return visitor.visitSetComp(this); + } + + public void traverse(VisitorIF visitor) throws Exception { + if (elt != null) + elt.accept(visitor); + if (generators != null) { + for (PythonTree t : generators) { + if (t != null) + t.accept(visitor); + } + } + } + + private int lineno = -1; + @ExposedGet(name = "lineno") + public int getLineno() { + if (lineno != -1) { + return lineno; + } + return getLine(); + } + + @ExposedSet(name = "lineno") + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; + @ExposedGet(name = "col_offset") + public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } + return getCharPositionInLine(); + } + + @ExposedSet(name = "col_offset") + public void setCol_offset(int num) { + col_offset = num; + } + +} diff --git a/src/org/python/antlr/ast/VisitorBase.java b/src/org/python/antlr/ast/VisitorBase.java --- a/src/org/python/antlr/ast/VisitorBase.java +++ b/src/org/python/antlr/ast/VisitorBase.java @@ -221,12 +221,30 @@ return ret; } + public R visitSet(Set node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + public R visitListComp(ListComp node) throws Exception { R ret = unhandled_node(node); traverse(node); return ret; } + public R visitSetComp(SetComp node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + + public R visitDictComp(DictComp node) throws Exception { + R ret = unhandled_node(node); + traverse(node); + return ret; + } + public R visitGeneratorExp(GeneratorExp node) throws Exception { R ret = unhandled_node(node); traverse(node); diff --git a/src/org/python/antlr/ast/VisitorIF.java b/src/org/python/antlr/ast/VisitorIF.java --- a/src/org/python/antlr/ast/VisitorIF.java +++ b/src/org/python/antlr/ast/VisitorIF.java @@ -35,7 +35,10 @@ public R visitLambda(Lambda node) throws Exception; public R visitIfExp(IfExp node) throws Exception; public R visitDict(Dict node) throws Exception; + public R visitSet(Set node) throws Exception; public R visitListComp(ListComp node) throws Exception; + public R visitSetComp(SetComp node) throws Exception; + public R visitDictComp(DictComp node) throws Exception; public R visitGeneratorExp(GeneratorExp node) throws Exception; public R visitYield(Yield node) throws Exception; public R visitCompare(Compare node) throws Exception; diff --git a/src/org/python/compiler/CodeCompiler.java b/src/org/python/compiler/CodeCompiler.java --- a/src/org/python/compiler/CodeCompiler.java +++ b/src/org/python/compiler/CodeCompiler.java @@ -52,6 +52,7 @@ import org.python.antlr.ast.Raise; import org.python.antlr.ast.Repr; import org.python.antlr.ast.Return; +import org.python.antlr.ast.Set; import org.python.antlr.ast.Slice; import org.python.antlr.ast.Str; import org.python.antlr.ast.Subscript; @@ -88,6 +89,7 @@ import org.python.core.PyList; import org.python.core.PyLong; import org.python.core.PyObject; +import org.python.core.PySet; import org.python.core.PySlice; import org.python.core.PyString; import org.python.core.PyTuple; @@ -2180,6 +2182,19 @@ } @Override + public Object visitSet(Set node) throws Exception { + int content = makeArray(node.getInternalElts()); + + code.new_(p(PySet.class)); + code.dup(); + code.aload(content); + code.invokespecial(p(PySet.class), "", sig(Void.TYPE, PyObject[].class)); + freeArray(content); + return null; + } + + + @Override public Object visitRepr(Repr node) throws Exception { visit(node.getInternalValue()); code.invokevirtual(p(PyObject.class), "__repr__", sig(PyString.class)); diff --git a/src/org/python/core/BaseSet.java b/src/org/python/core/BaseSet.java --- a/src/org/python/core/BaseSet.java +++ b/src/org/python/core/BaseSet.java @@ -42,6 +42,19 @@ } /** + * Update the underlying set with the contents of the iterable. + */ + protected static Set _update(Set set, PyObject[] data) { + if (data == null) { + return set; + } + for (PyObject item : data) { + set.add(item); + } + return set; + } + + /** * The union of this with other.


(I.e. all elements * that are in either set) * diff --git a/src/org/python/core/PySet.java b/src/org/python/core/PySet.java --- a/src/org/python/core/PySet.java +++ b/src/org/python/core/PySet.java @@ -26,6 +26,10 @@ super(TYPE, _update(Generic.concurrentSet(), data)); } + public PySet(PyObject[] data) { + super(TYPE, _update(Generic.concurrentSet(), data)); + } + @ExposedNew @ExposedMethod(doc = BuiltinDocs.set___init___doc) final void set___init__(PyObject[] args, String[] kwds) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 9 00:59:47 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 09 Mar 2012 00:59:47 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Set_comprehension=2E?= Message-ID: http://hg.python.org/jython/rev/1370d5c27aa4 changeset: 6315:1370d5c27aa4 user: Frank Wierzbicki date: Thu Mar 08 15:59:09 2012 -0800 summary: Set comprehension. files: grammar/Python.g | 73 ++++++--- src/org/python/antlr/GrammarActions.java | 6 +- src/org/python/antlr/ast/AstModule.java | 1 + src/org/python/compiler/CodeCompiler.java | 36 ++++- src/org/python/compiler/ScopesCompiler.java | 10 + 5 files changed, 93 insertions(+), 33 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -132,6 +132,7 @@ import org.python.antlr.ast.Repr; import org.python.antlr.ast.Return; import org.python.antlr.ast.Set; +import org.python.antlr.ast.SetComp; import org.python.antlr.ast.Slice; import org.python.antlr.ast.Str; import org.python.antlr.ast.Subscript; @@ -1717,7 +1718,10 @@ | LCURLY (dictorsetmaker { - if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) { + if ($dictorsetmaker.etype != null) { + etype = $dictorsetmaker.etype; + } + else if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) { etype = new Set($LCURLY, actions.castExprs($dictorsetmaker.keys)); } else { etype = new Dict($LCURLY, actions.castExprs($dictorsetmaker.keys), @@ -1783,7 +1787,7 @@ ) (COMMA)? ; -//testlist_gexp: test ( gen_for | (',' test)* [','] ) +//testlist_gexp: test ( comp_for | (',' test)* [','] ) testlist_gexp @init { expr etype = null; @@ -1801,7 +1805,7 @@ etype = new Tuple($testlist_gexp.start, actions.castExprs($t), $expr::ctype); } | -> test - | (gen_for[gens] + | (comp_for[gens] { Collections.reverse(gens); List c = gens; @@ -1971,21 +1975,36 @@ //dictmaker: test ':' test (',' test ':' test)* [','] dictorsetmaker - returns [List keys, List values] + returns [List keys, List values, expr etype] + at init { + List gens = new ArrayList(); +} : k+=test[expr_contextType.Load] - (COLON v+=test[expr_contextType.Load] - (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + ( + (COLON v+=test[expr_contextType.Load] + (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + { + $keys = $k; + $values= $v; + } + |(COMMA k+=test[expr_contextType.Load])* + { + $keys = $k; + $values = null; + } + ) + (COMMA)? + | comp_for[gens] { - $keys = $k; - $values= $v; + Collections.reverse(gens); + List c = gens; + expr e = actions.castExpr($k.get(0)); + if (e instanceof Context) { + ((Context)e).setContext(expr_contextType.Load); + } + $etype = new SetComp($dictorsetmaker.start, actions.castExpr($k.get(0)), c); } - |(COMMA k+=test[expr_contextType.Load])* - { - $keys = $k; - $values = null; - } ) - (COMMA)? ; //classdef: 'class' NAME ['(' [testlist] ')'] ':' suite @@ -2046,7 +2065,7 @@ } ; -//argument: test [gen_for] | test '=' test # Really [keyword '='] test +//argument: test [comp_for] | test '=' test # Really [keyword '='] test argument [List arguments, List kws, List gens, boolean first, boolean afterStar] returns [boolean genarg] : t1=test[expr_contextType.Load] @@ -2068,10 +2087,10 @@ exprs.add(actions.castExpr($t2.tree)); $kws.add(exprs); } - | gen_for[$gens] + | comp_for[$gens] { if (!first) { - actions.errorGenExpNotSoleArg($gen_for.tree); + actions.errorGenExpNotSoleArg($comp_for.tree); } $genarg = true; Collections.reverse($gens); @@ -2116,27 +2135,27 @@ } ; -//gen_iter: gen_for | gen_if -gen_iter [List gens, List ifs] - : gen_for[gens] - | gen_if[gens, ifs] +//comp_iter: comp_for | comp_if +comp_iter [List gens, List ifs] + : comp_for[gens] + | comp_if[gens, ifs] ; -//gen_for: 'for' exprlist 'in' or_test [gen_iter] -gen_for [List gens] +//comp_for: 'for' exprlist 'in' or_test [comp_iter] +comp_for [List gens] @init { List ifs = new ArrayList(); } - : FOR exprlist[expr_contextType.Store] IN or_test[expr_contextType.Load] gen_iter[gens, ifs]? + : FOR exprlist[expr_contextType.Store] IN or_test[expr_contextType.Load] comp_iter[gens, ifs]? { Collections.reverse(ifs); gens.add(new comprehension($FOR, $exprlist.etype, actions.castExpr($or_test.tree), ifs)); } ; -//gen_if: 'if' old_test [gen_iter] -gen_if[List gens, List ifs] - : IF test[expr_contextType.Load] gen_iter[gens, ifs]? +//comp_if: 'if' old_test [comp_iter] +comp_if[List gens, List ifs] + : IF test[expr_contextType.Load] comp_iter[gens, ifs]? { ifs.add(actions.castExpr($test.tree)); } diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -38,6 +38,7 @@ import org.python.antlr.ast.TryFinally; import org.python.antlr.ast.Tuple; import org.python.antlr.ast.Repr; +import org.python.antlr.ast.SetComp; import org.python.antlr.ast.Str; import org.python.antlr.ast.UnaryOp; import org.python.antlr.ast.While; @@ -330,7 +331,10 @@ } else if (tree instanceof ListComp) { ListComp lc = (ListComp)tree; recurseSetContext(lc.getInternalElt(), context); - } else if (!(tree instanceof ListComp)) { + } else if (tree instanceof SetComp) { + SetComp lc = (SetComp)tree; + recurseSetContext(lc.getInternalElt(), context); + } else if (!(tree instanceof ListComp) && (!(tree instanceof SetComp))) { for (int i=0; i", sig(Void.TYPE)); + + code.dup(); + + code.ldc("add"); + + code.invokevirtual(p(PyObject.class), "__getattr__", sig(PyObject.class, String.class)); + String tmp_append = "_{" + node.getLine() + "_" + node.getCharPositionInLine() + "}"; + + finishComp(node, node.getInternalElt(), node.getInternalGenerators(), tmp_append); + + return null; + } + + private void finishComp(expr node, expr elt, java.util.List generators, + String tmp_append) throws Exception { set(new Name(node, tmp_append, expr_contextType.Store)); java.util.List args = new ArrayList(); - args.add(node.getInternalElt()); + args.add(elt); stmt n = new Expr(node, new Call(node, new Name(node, tmp_append, expr_contextType.Load), args, new ArrayList(), null, null)); - for (int i = node.getInternalGenerators().size() - 1; i >= 0; i--) { - comprehension lc = node.getInternalGenerators().get(i); + for (int i = generators.size() - 1; i >= 0; i--) { + comprehension lc = generators.get(i); for (int j = lc.getInternalIfs().size() - 1; j >= 0; j--) { java.util.List body = new ArrayList(); body.add(n); @@ -2160,8 +2188,6 @@ java.util.List targets = new ArrayList(); targets.add(new Name(n, tmp_append, expr_contextType.Del)); visit(new Delete(n, targets)); - - return null; } @Override diff --git a/src/org/python/compiler/ScopesCompiler.java b/src/org/python/compiler/ScopesCompiler.java --- a/src/org/python/compiler/ScopesCompiler.java +++ b/src/org/python/compiler/ScopesCompiler.java @@ -17,6 +17,7 @@ import org.python.antlr.ast.ListComp; import org.python.antlr.ast.Name; import org.python.antlr.ast.Return; +import org.python.antlr.ast.SetComp; import org.python.antlr.ast.With; import org.python.antlr.ast.Yield; import org.python.antlr.ast.arguments; @@ -284,6 +285,15 @@ } @Override + public Object visitSetComp(SetComp node) throws Exception { + String tmp = "_{" + node.getLine() + "_" + node.getCharPositionInLine() + + "}"; + cur.addBound(tmp); + traverse(node); + return null; + } + + @Override public Object visitYield(Yield node) throws Exception { cur.defineAsGenerator(node); cur.yield_count++; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 9 06:27:09 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 09 Mar 2012 06:27:09 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Cleanup_dictorsetmaker=2E?= Message-ID: http://hg.python.org/jython/rev/25e8eff398f2 changeset: 6316:25e8eff398f2 user: Frank Wierzbicki date: Thu Mar 08 21:27:00 2012 -0800 summary: Cleanup dictorsetmaker. files: grammar/Python.g | 31 ++++++++++++------------------- 1 files changed, 12 insertions(+), 19 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -1716,18 +1716,8 @@ ) RBRACK | LCURLY - (dictorsetmaker - { - if ($dictorsetmaker.etype != null) { - etype = $dictorsetmaker.etype; - } - else if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) { - etype = new Set($LCURLY, actions.castExprs($dictorsetmaker.keys)); - } else { - etype = new Dict($LCURLY, actions.castExprs($dictorsetmaker.keys), - actions.castExprs($dictorsetmaker.values)); - } - } + (dictorsetmaker[$LCURLY] + -> dictorsetmaker | { etype = new Dict($LCURLY, new ArrayList(), new ArrayList()); @@ -1974,23 +1964,26 @@ // (test (comp_for | (',' test)* [','])) ) //dictmaker: test ':' test (',' test ':' test)* [','] -dictorsetmaker - returns [List keys, List values, expr etype] +dictorsetmaker[Token lcurly] @init { List gens = new ArrayList(); + expr etype = null; +} + at after { + if (etype != null) { + $dictorsetmaker.tree = etype; + } } : k+=test[expr_contextType.Load] ( (COLON v+=test[expr_contextType.Load] (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* { - $keys = $k; - $values= $v; + etype = new Dict($lcurly, actions.castExprs($k), actions.castExprs($v)); } |(COMMA k+=test[expr_contextType.Load])* { - $keys = $k; - $values = null; + etype = new Set($lcurly, actions.castExprs($k)); } ) (COMMA)? @@ -2002,7 +1995,7 @@ if (e instanceof Context) { ((Context)e).setContext(expr_contextType.Load); } - $etype = new SetComp($dictorsetmaker.start, actions.castExpr($k.get(0)), c); + etype = new SetComp($lcurly, actions.castExpr($k.get(0)), c); } ) ; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Sun Mar 11 23:34:54 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Sun, 11 Mar 2012 23:34:54 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Dictionary_Comprehensions=2E?= Message-ID: http://hg.python.org/jython/rev/a4fc69ee524b changeset: 6317:a4fc69ee524b user: Frank Wierzbicki date: Sun Mar 11 15:34:46 2012 -0700 summary: Dictionary Comprehensions. files: grammar/Python.g | 16 ++- src/org/python/antlr/GrammarActions.java | 13 ++- src/org/python/compiler/CodeCompiler.java | 42 ++++++++- src/org/python/compiler/ScopesCompiler.java | 10 ++ 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -102,6 +102,7 @@ import org.python.antlr.ast.Continue; import org.python.antlr.ast.Delete; import org.python.antlr.ast.Dict; +import org.python.antlr.ast.DictComp; import org.python.antlr.ast.Ellipsis; import org.python.antlr.ast.ErrorMod; import org.python.antlr.ast.ExceptHandler; @@ -1977,10 +1978,17 @@ : k+=test[expr_contextType.Load] ( (COLON v+=test[expr_contextType.Load] - (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* - { - etype = new Dict($lcurly, actions.castExprs($k), actions.castExprs($v)); - } + ( comp_for[gens] + { + Collections.reverse(gens); + List c = gens; + etype = new DictComp($dictorsetmaker.start, actions.castExpr($k.get(0)), actions.castExpr($v.get(0)), c); + } + | (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + { + etype = new Dict($lcurly, actions.castExprs($k), actions.castExprs($v)); + } + ) |(COMMA k+=test[expr_contextType.Load])* { etype = new Set($lcurly, actions.castExprs($k)); diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java --- a/src/org/python/antlr/GrammarActions.java +++ b/src/org/python/antlr/GrammarActions.java @@ -23,6 +23,7 @@ import org.python.antlr.ast.BinOp; import org.python.antlr.ast.BoolOp; import org.python.antlr.ast.Call; +import org.python.antlr.ast.DictComp; import org.python.antlr.ast.ExtSlice; import org.python.antlr.ast.For; import org.python.antlr.ast.FunctionDef; @@ -332,9 +333,15 @@ ListComp lc = (ListComp)tree; recurseSetContext(lc.getInternalElt(), context); } else if (tree instanceof SetComp) { - SetComp lc = (SetComp)tree; - recurseSetContext(lc.getInternalElt(), context); - } else if (!(tree instanceof ListComp) && (!(tree instanceof SetComp))) { + SetComp sc = (SetComp)tree; + recurseSetContext(sc.getInternalElt(), context); + } else if (tree instanceof DictComp) { + DictComp dc = (DictComp)tree; + recurseSetContext(dc.getInternalKey(), context); + recurseSetContext(dc.getInternalValue(), context); + } else if (!(tree instanceof ListComp) && + (!(tree instanceof DictComp)) && + (!(tree instanceof SetComp))) { for (int i=0; i args = new ArrayList(); + args.add(node.getInternalElt()); + + finishComp(node, args, node.getInternalGenerators(), tmp_append); return null; } @@ -2156,20 +2160,44 @@ code.invokevirtual(p(PyObject.class), "__getattr__", sig(PyObject.class, String.class)); String tmp_append = "_{" + node.getLine() + "_" + node.getCharPositionInLine() + "}"; - finishComp(node, node.getInternalElt(), node.getInternalGenerators(), tmp_append); + java.util.List args = new ArrayList(); + args.add(node.getInternalElt()); + + finishComp(node, args, node.getInternalGenerators(), tmp_append); return null; } - private void finishComp(expr node, expr elt, java.util.List generators, + @Override + public Object visitDictComp(DictComp node) throws Exception { + code.new_(p(PyDictionary.class)); + + code.dup(); + code.invokespecial(p(PyDictionary.class), "", sig(Void.TYPE)); + + code.dup(); + + code.ldc("__setitem__"); + + code.invokevirtual(p(PyDictionary.class), "__getattr__", sig(PyObject.class, String.class)); + String tmp_append = "_{" + node.getLine() + "_" + node.getCharPositionInLine() + "}"; + + java.util.List args = new ArrayList(); + args.add(node.getInternalKey()); + args.add(node.getInternalValue()); + + finishComp(node, args, node.getInternalGenerators(), tmp_append); + + return null; + } + + + private void finishComp(expr node, java.util.List args, java.util.List generators, String tmp_append) throws Exception { set(new Name(node, tmp_append, expr_contextType.Store)); - java.util.List args = new ArrayList(); - args.add(elt); stmt n = new Expr(node, new Call(node, new Name(node, tmp_append, expr_contextType.Load), - args, - new ArrayList(), null, null)); + args, new ArrayList(), null, null)); for (int i = generators.size() - 1; i >= 0; i--) { comprehension lc = generators.get(i); diff --git a/src/org/python/compiler/ScopesCompiler.java b/src/org/python/compiler/ScopesCompiler.java --- a/src/org/python/compiler/ScopesCompiler.java +++ b/src/org/python/compiler/ScopesCompiler.java @@ -5,6 +5,7 @@ import org.python.antlr.Visitor; import org.python.antlr.PythonTree; import org.python.antlr.ast.ClassDef; +import org.python.antlr.ast.DictComp; import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expression; import org.python.antlr.ast.FunctionDef; @@ -294,6 +295,15 @@ } @Override + public Object visitDictComp(DictComp node) throws Exception { + String tmp = "_{" + node.getLine() + "_" + node.getCharPositionInLine() + + "}"; + cur.addBound(tmp); + traverse(node); + return null; + } + + @Override public Object visitYield(Yield node) throws Exception { cur.defineAsGenerator(node); cur.yield_count++; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 13 07:37:06 2012 From: jython-checkins at python.org (alex.gronholm) Date: Tue, 13 Mar 2012 07:37:06 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Added_the_io_and_=5Ffileio_m?= =?utf8?q?odules?= Message-ID: http://hg.python.org/jython/rev/eda2b3279587 changeset: 6318:eda2b3279587 user: Alex Gr?nholm date: Mon Mar 12 17:49:35 2012 -0700 summary: Added the io and _fileio modules files: CPythonLib.includes | 1 + CoreExposed.includes | 1 + src/org/python/modules/Setup.java | 3 +- src/org/python/modules/_fileio/PyFileIO.java | 318 ++ src/org/python/modules/_fileio/PyFileIODerived.java | 1117 ++++++++++ src/org/python/modules/_fileio/_fileio.java | 24 + src/org/python/modules/_functools/PyPartialDerived.java | 24 + src/templates/PyFileIO.derived | 4 + src/templates/mappings | 1 + src/templates/partial.derived | 2 +- 10 files changed, 1493 insertions(+), 2 deletions(-) diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -77,6 +77,7 @@ ihooks.py imaplib.py imghdr.py +io.py keyword.py linecache.py locale.py diff --git a/CoreExposed.includes b/CoreExposed.includes --- a/CoreExposed.includes +++ b/CoreExposed.includes @@ -55,6 +55,7 @@ org/python/modules/_csv/PyDialect.class org/python/modules/_csv/PyReader.class org/python/modules/_csv/PyWriter.class +org/python/modules/_fileio/PyFileIO.class org/python/modules/_functools/PyPartial.class org/python/modules/_hashlib$Hash.class org/python/modules/jffi/ArrayCData.class diff --git a/src/org/python/modules/Setup.java b/src/org/python/modules/Setup.java --- a/src/org/python/modules/Setup.java +++ b/src/org/python/modules/Setup.java @@ -60,6 +60,7 @@ "_marshal", "_threading:org.python.modules._threading._threading", PosixModule.getOSName() + ":org.python.modules.posix.PosixModule", - "jffi:org.python.modules.jffi.jffi" + "jffi:org.python.modules.jffi.jffi", + "_fileio:org.python.modules._fileio._fileio" }; } diff --git a/src/org/python/modules/_fileio/PyFileIO.java b/src/org/python/modules/_fileio/PyFileIO.java new file mode 100644 --- /dev/null +++ b/src/org/python/modules/_fileio/PyFileIO.java @@ -0,0 +1,318 @@ +/* Copyright (c) Jython Developers */ +package org.python.modules._fileio; + +import java.nio.ByteBuffer; +import java.util.concurrent.Callable; + +import org.python.core.ArgParser; +import org.python.core.BuiltinDocs; +import org.python.core.Py; +import org.python.core.PyArray; +import org.python.core.PyInteger; +import org.python.core.PyJavaType; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PySystemState; +import org.python.core.PyType; +import org.python.core.PyUnicode; +import org.python.core.io.FileIO; +import org.python.core.util.StringUtil; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedType; + + at ExposedType(name = "_fileio._FileIO") +public class PyFileIO extends PyObject { + + public static final PyType TYPE = PyType.fromClass(PyFileIO.class); + + private FileIO file; + private PyObject name; + private Boolean seekable; + + @ExposedGet + public boolean closefd; + + /** The mode string */ + @ExposedGet(doc = BuiltinDocs.file_mode_doc) + public String mode; + + /** The file's closer object; ensures the file is closed at shutdown */ + private Closer closer; + + public PyFileIO() { + super(TYPE); + } + + public PyFileIO(PyType subType) { + super(subType); + } + + public PyFileIO(String name, String mode, boolean closefd) { + this(); + _FileIO___init__(Py.newString(name), mode, closefd); + } + + public PyFileIO(String name, String mode) { + this(name, mode, true); + } + + @ExposedNew + @ExposedMethod(doc = BuiltinDocs.file___init___doc) + final void _FileIO___init__(PyObject[] args, String[] kwds) { + ArgParser ap = new ArgParser("file", args, kwds, new String[] {"name", "mode", "closefd"}, 1); + PyObject name = ap.getPyObject(0); + if (!(name instanceof PyString)) { + throw Py.TypeError("coercing to Unicode: need string, '" + name.getType().fastGetName() + + "' type found"); + } + String mode = ap.getString(1, "r"); + boolean closefd = Py.py2boolean(ap.getPyObject(2, Py.True)); + // TODO: make this work with file channels so closefd=False can be used + if (!closefd) + throw Py.ValueError("Cannot use closefd=False with file name"); + + _FileIO___init__((PyString)name, mode, closefd); + closer = new Closer(file, Py.getSystemState()); + } + + private void _FileIO___init__(PyString name, String mode, boolean closefd) { + mode = parseMode(mode); + this.name = name; + this.mode = mode; + this.closefd = closefd; + this.file = new FileIO((PyString) name, mode.replaceAll("b", "")); + } + + private String parseMode(String mode) { + if (mode.length() == 0) { + throw Py.ValueError("empty mode string"); + } + + String origMode = mode; + if ("rwa".indexOf(mode.charAt(0)) == -1) { + throw Py.ValueError("mode string must begin with one of 'r', 'w', 'a' or 'U', not '" + + origMode + "'"); + } + + boolean reading = mode.contains("r"); + boolean writing = mode.contains("w"); + boolean appending = mode.contains("a"); + boolean updating = mode.contains("+"); + + return (reading ? "r" : "") + (writing ? "w" : "") + (appending ? "a" : "") + + "b" + (updating ? "+" : ""); + } + + @ExposedMethod(doc = BuiltinDocs.file_close_doc) + final synchronized void _FileIO_close() { + if (closer != null) { + closer.close(); + closer = null; + } else { + file.close(); + } + } + + public void close() { + _FileIO_close(); + } + + public boolean readable() { + return _FileIO_readable(); + } + + @ExposedMethod(doc = "True if file was opened in a read mode.") + final boolean _FileIO_readable() { + return file.readable(); + } + + @ExposedMethod(defaults = {"0"}, doc = BuiltinDocs.file_seek_doc) + final synchronized PyObject _FileIO_seek(long pos, int how) { + checkClosed(); + return Py.java2py(file.seek(pos, how)); + } + + public boolean seekable() { + return _FileIO_seekable(); + } + + @ExposedMethod(doc = "True if file supports random-access.") + final boolean _FileIO_seekable() { + if (seekable == null) + seekable = file.seek(0, 0) >= 0; + return seekable; + } + + @ExposedMethod(doc = BuiltinDocs.file_tell_doc) + final synchronized long _FileIO_tell() { + checkClosed(); + return file.tell(); + } + + public long tell() { + return _FileIO_tell(); + } + + @ExposedMethod(defaults = {"null"}, doc = BuiltinDocs.file_truncate_doc) + final PyObject _FileIO_truncate(PyObject position) { + if (position == null) + return Py.java2py(_FileIO_truncate()); + return Py.java2py(_FileIO_truncate(position.asLong())); + } + + final synchronized long _FileIO_truncate(long position) { + return file.truncate(position); + } + + public long truncate(long position) { + return _FileIO_truncate(position); + } + + final synchronized long _FileIO_truncate() { + return file.truncate(file.tell()); + } + + public void truncate() { + _FileIO_truncate(); + } + + public boolean isatty() { + return _FileIO_isatty(); + } + + @ExposedMethod(doc = BuiltinDocs.file_isatty_doc) + final boolean _FileIO_isatty() { + return file.isatty(); + } + + public boolean writable() { + return _FileIO_writable(); + } + + @ExposedMethod(doc = "True if file was opened in a write mode.") + final boolean _FileIO_writable() { + return file.writable(); + } + + public PyObject fileno() { + return _FileIO_fileno(); + } + + @ExposedMethod(doc = BuiltinDocs.file_fileno_doc) + final PyObject _FileIO_fileno() { + return PyJavaType.wrapJavaObject(file.fileno()); + } + + @ExposedMethod(doc = BuiltinDocs.file_read_doc) + final synchronized PyString _FileIO_read(int size) { + checkClosed(); + ByteBuffer buf = file.read(size); + return new PyString(StringUtil.fromBytes(buf)); + } + + public PyString read(int size) { + return _FileIO_read(size); + } + + @ExposedMethod(doc = BuiltinDocs.file_read_doc) + final synchronized PyString _FileIO_readall() { + return _FileIO_read(-1); + } + + /** + * Return a String for writing to the underlying file from obj. + */ + private String asWritable(PyObject obj, String message) { + if (obj instanceof PyUnicode) { + return ((PyUnicode)obj).encode(); + } else if (obj instanceof PyString) { + return ((PyString) obj).getString(); + } else if (obj instanceof PyArray) { + return ((PyArray)obj).tostring(); + } + if (message == null) { + message = String.format("argument 1 must be string or buffer, not %.200s", + obj.getType().fastGetName()); + } + throw Py.TypeError(message); + } + + @ExposedMethod(doc = BuiltinDocs.file_write_doc) + final PyObject _FileIO_write(PyObject obj) { + String writable = asWritable(obj, null); + byte[] bytes = StringUtil.toBytes(writable); + int written = write(ByteBuffer.wrap(bytes)); + return new PyInteger(written); + } + + final synchronized int write(ByteBuffer buf) { + checkClosed(); + return file.write(buf); + } + + @ExposedMethod(names = {"__str__", "__repr__"}, doc = BuiltinDocs.file___str___doc) + final String _FileIO_toString() { + if (name instanceof PyUnicode) { + String escapedName = PyString.encode_UnicodeEscape(name.toString(), false); + return String.format("<_fileio.FileIO name='%s', mode='%s'>", escapedName, mode); + } + return String.format("<_fileio.FileIO name='%s', mode='%s'>", name, mode); + } + + @Override + public String toString() { + return _FileIO_toString(); + } + + private void checkClosed() { + file.checkClosed(); + } + + @ExposedGet(name = "closed", doc = BuiltinDocs.file_closed_doc) + public boolean getClosed() { + return file.closed(); + } + + /** + * XXX update docs - A mechanism to make sure PyFiles are closed on exit. On creation Closer adds itself + * to a list of Closers that will be run by PyFileCloser on JVM shutdown. When a + * PyFile's close or finalize methods are called, PyFile calls its Closer.close which + * clears Closer out of the shutdown queue. + * + * We use a regular object here rather than WeakReferences and their ilk as they may + * be collected before the shutdown hook runs. There's no guarantee that finalize will + * be called during shutdown, so we can't use it. It's vital that this Closer has no + * reference to the PyFile it's closing so the PyFile remains garbage collectable. + */ + private static class Closer implements Callable { + + /** + * The underlying file + */ + private final FileIO file; + private PySystemState sys; + + public Closer(FileIO file, PySystemState sys) { + this.file = file; + this.sys = sys; + sys.registerCloser(this); + } + + /** For closing directly */ + public void close() { + sys.unregisterCloser(this); + file.close(); + sys = null; + } + + /** For closing as part of a shutdown process */ + public Void call() { + file.close(); + sys = null; + return null; + } + + } +} diff --git a/src/org/python/modules/_fileio/PyFileIODerived.java b/src/org/python/modules/_fileio/PyFileIODerived.java new file mode 100644 --- /dev/null +++ b/src/org/python/modules/_fileio/PyFileIODerived.java @@ -0,0 +1,1117 @@ +/* Generated file, do not modify. See jython/src/templates/gderived.py. */ +package org.python.modules._fileio; + +import java.io.Serializable; +import org.python.core.*; + +public class PyFileIODerived extends PyFileIO implements Slotted { + + public PyObject getSlot(int index) { + return slots[index]; + } + + public void setSlot(int index,PyObject value) { + slots[index]=value; + } + + private PyObject[]slots; + + private PyObject dict; + + public PyObject fastGetDict() { + return dict; + } + + public PyObject getDict() { + return dict; + } + + public void setDict(PyObject newDict) { + if (newDict instanceof PyStringMap||newDict instanceof PyDictionary) { + dict=newDict; + } else { + throw Py.TypeError("__dict__ must be set to a Dictionary "+newDict.getClass().getName()); + } + } + + public void delDict() { + // deleting an object's instance dict makes it grow a new one + dict=new PyStringMap(); + } + + public PyFileIODerived(PyType subtype) { + super(subtype); + slots=new PyObject[subtype.getNumSlots()]; + dict=subtype.instDict(); + } + + public PyString __str__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__str__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__str__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); + } + return super.__str__(); + } + + public PyString __repr__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__repr__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__repr__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); + } + return super.__repr__(); + } + + public PyString __hex__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__hex__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__hex__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); + } + return super.__hex__(); + } + + public PyString __oct__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__oct__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__oct__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); + } + return super.__oct__(); + } + + public PyFloat __float__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__float__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyFloat) + return(PyFloat)res; + throw Py.TypeError("__float__"+" returned non-"+"float"+" (type "+res.getType().fastGetName()+")"); + } + return super.__float__(); + } + + public PyComplex __complex__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__complex__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyComplex) + return(PyComplex)res; + throw Py.TypeError("__complex__"+" returned non-"+"complex"+" (type "+res.getType().fastGetName()+")"); + } + return super.__complex__(); + } + + public PyObject __pos__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__pos__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__pos__(); + } + + public PyObject __neg__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__neg__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__neg__(); + } + + public PyObject __abs__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__abs__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__abs__(); + } + + public PyObject __invert__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__invert__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__invert__(); + } + + public PyObject __reduce__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__reduce__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__reduce__(); + } + + public PyObject __add__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__add__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__add__(other); + } + + public PyObject __radd__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__radd__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__radd__(other); + } + + public PyObject __sub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__sub__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__sub__(other); + } + + public PyObject __rsub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rsub__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rsub__(other); + } + + public PyObject __mul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__mul__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__mul__(other); + } + + public PyObject __rmul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rmul__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rmul__(other); + } + + public PyObject __div__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__div__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__div__(other); + } + + public PyObject __rdiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rdiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rdiv__(other); + } + + public PyObject __floordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__floordiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__floordiv__(other); + } + + public PyObject __rfloordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rfloordiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rfloordiv__(other); + } + + public PyObject __truediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__truediv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__truediv__(other); + } + + public PyObject __rtruediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rtruediv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rtruediv__(other); + } + + public PyObject __mod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__mod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__mod__(other); + } + + public PyObject __rmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rmod__(other); + } + + public PyObject __divmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__divmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__divmod__(other); + } + + public PyObject __rdivmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rdivmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rdivmod__(other); + } + + public PyObject __rpow__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rpow__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rpow__(other); + } + + public PyObject __lshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__lshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__lshift__(other); + } + + public PyObject __rlshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rlshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rlshift__(other); + } + + public PyObject __rshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rshift__(other); + } + + public PyObject __rrshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rrshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rrshift__(other); + } + + public PyObject __and__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__and__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__and__(other); + } + + public PyObject __rand__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rand__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rand__(other); + } + + public PyObject __or__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__or__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__or__(other); + } + + public PyObject __ror__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ror__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ror__(other); + } + + public PyObject __xor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__xor__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__xor__(other); + } + + public PyObject __rxor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rxor__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rxor__(other); + } + + public PyObject __lt__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__lt__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__lt__(other); + } + + public PyObject __le__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__le__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__le__(other); + } + + public PyObject __gt__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__gt__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__gt__(other); + } + + public PyObject __ge__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ge__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ge__(other); + } + + public PyObject __eq__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__eq__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__eq__(other); + } + + public PyObject __ne__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ne__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ne__(other); + } + + public PyObject __iadd__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iadd__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__iadd__(other); + } + + public PyObject __isub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__isub__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__isub__(other); + } + + public PyObject __imul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__imul__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__imul__(other); + } + + public PyObject __idiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__idiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__idiv__(other); + } + + public PyObject __ifloordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ifloordiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ifloordiv__(other); + } + + public PyObject __itruediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__itruediv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__itruediv__(other); + } + + public PyObject __imod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__imod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__imod__(other); + } + + public PyObject __ipow__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ipow__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ipow__(other); + } + + public PyObject __ilshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ilshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ilshift__(other); + } + + public PyObject __irshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__irshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__irshift__(other); + } + + public PyObject __iand__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iand__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__iand__(other); + } + + public PyObject __ior__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ior__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ior__(other); + } + + public PyObject __ixor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ixor__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ixor__(other); + } + + public PyObject __int__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__int__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger||res instanceof PyLong) + return res; + throw Py.TypeError("__int__"+" should return an integer"); + } + return super.__int__(); + } + + public PyObject __long__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__long__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyLong||res instanceof PyInteger) + return res; + throw Py.TypeError("__long__"+" returned non-"+"long"+" (type "+res.getType().fastGetName()+")"); + } + return super.__long__(); + } + + public int hashCode() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__hash__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger) { + return((PyInteger)res).getValue(); + } else + if (res instanceof PyLong) { + return((PyLong)res).getValue().intValue(); + } + throw Py.TypeError("__hash__ should return a int"); + } + if (self_type.lookup("__eq__")!=null||self_type.lookup("__cmp__")!=null) { + throw Py.TypeError(String.format("unhashable type: '%.200s'",getType().fastGetName())); + } + return super.hashCode(); + } + + public PyUnicode __unicode__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__unicode__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyUnicode) + return(PyUnicode)res; + if (res instanceof PyString) + return new PyUnicode((PyString)res); + throw Py.TypeError("__unicode__"+" should return a "+"unicode"); + } + return super.__unicode__(); + } + + public int __cmp__(PyObject other) { + PyType self_type=getType(); + PyObject[]where_type=new PyObject[1]; + PyObject impl=self_type.lookup_where("__cmp__",where_type); + // Full Compatibility with CPython __cmp__: + // If the derived type don't override __cmp__, the + // *internal* super().__cmp__ should be called, not the + // exposed one. The difference is that the exposed __cmp__ + // throws a TypeError if the argument is an instance of the same type. + if (impl==null||where_type[0]==TYPE||Py.isSubClass(TYPE,where_type[0])) { + return super.__cmp__(other); + } + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) { + return-2; + } + int c=res.asInt(); + return c<0?-1:c>0?1:0; + } + + public boolean __nonzero__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__nonzero__"); + if (impl==null) { + impl=self_type.lookup("__len__"); + if (impl==null) + return super.__nonzero__(); + } + PyObject o=impl.__get__(this,self_type).__call__(); + Class c=o.getClass(); + if (c!=PyInteger.class&&c!=PyBoolean.class) { + throw Py.TypeError(String.format("__nonzero__ should return bool or int, returned %s",self_type.getName())); + } + return o.__nonzero__(); + } + + public boolean __contains__(PyObject o) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__contains__"); + if (impl==null) + return super.__contains__(o); + return impl.__get__(this,self_type).__call__(o).__nonzero__(); + } + + public int __len__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__len__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger) + return((PyInteger)res).getValue(); + throw Py.TypeError("__len__ should return a int"); + } + return super.__len__(); + } + + public PyObject __iter__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iter__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + impl=self_type.lookup("__getitem__"); + if (impl==null) + return super.__iter__(); + return new PySequenceIter(this); + } + + public PyObject __iternext__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("next"); + if (impl!=null) { + try { + return impl.__get__(this,self_type).__call__(); + } catch (PyException exc) { + if (exc.match(Py.StopIteration)) + return null; + throw exc; + } + } + return super.__iternext__(); // ??? + } + + public PyObject __finditem__(PyObject key) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getitem__"); + if (impl!=null) + try { + return impl.__get__(this,self_type).__call__(key); + } catch (PyException exc) { + if (exc.match(Py.LookupError)) + return null; + throw exc; + } + return super.__finditem__(key); + } + + public PyObject __finditem__(int key) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getitem__"); + if (impl!=null) + try { + return impl.__get__(this,self_type).__call__(new PyInteger(key)); + } catch (PyException exc) { + if (exc.match(Py.LookupError)) + return null; + throw exc; + } + return super.__finditem__(key); + } + + public PyObject __getitem__(PyObject key) { + // Same as __finditem__, without swallowing LookupErrors. This allows + // __getitem__ implementations written in Python to raise custom + // exceptions (such as subclasses of KeyError). + // + // We are forced to duplicate the code, instead of defining __finditem__ + // in terms of __getitem__. That's because PyObject defines __getitem__ + // in terms of __finditem__. Therefore, we would end with an infinite + // loop when self_type.lookup("__getitem__") returns null: + // + // __getitem__ -> super.__getitem__ -> __finditem__ -> __getitem__ + // + // By duplicating the (short) lookup and call code, we are safe, because + // the call chains will be: + // + // __finditem__ -> super.__finditem__ + // + // __getitem__ -> super.__getitem__ -> __finditem__ -> super.__finditem__ + + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getitem__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(key); + return super.__getitem__(key); + } + + public void __setitem__(PyObject key,PyObject value) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__setitem__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(key,value); + return; + } + super.__setitem__(key,value); + } + + public PyObject __getslice__(PyObject start,PyObject stop,PyObject step) { // ??? + if (step!=null) { + return __getitem__(new PySlice(start,stop,step)); + } + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getslice__"); + if (impl!=null) { + PyObject[]indices=PySlice.indices2(this,start,stop); + return impl.__get__(this,self_type).__call__(indices[0],indices[1]); + } + return super.__getslice__(start,stop,step); + } + + public void __setslice__(PyObject start,PyObject stop,PyObject step,PyObject value) { + if (step!=null) { + __setitem__(new PySlice(start,stop,step),value); + return; + } + PyType self_type=getType(); + PyObject impl=self_type.lookup("__setslice__"); + if (impl!=null) { + PyObject[]indices=PySlice.indices2(this,start,stop); + impl.__get__(this,self_type).__call__(indices[0],indices[1],value); + return; + } + super.__setslice__(start,stop,step,value); + } + + public void __delslice__(PyObject start,PyObject stop,PyObject step) { + if (step!=null) { + __delitem__(new PySlice(start,stop,step)); + return; + } + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delslice__"); + if (impl!=null) { + PyObject[]indices=PySlice.indices2(this,start,stop); + impl.__get__(this,self_type).__call__(indices[0],indices[1]); + return; + } + super.__delslice__(start,stop,step); + } + + public void __delitem__(PyObject key) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delitem__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(key); + return; + } + super.__delitem__(key); + } + + public PyObject __call__(PyObject args[],String keywords[]) { + ThreadState ts=Py.getThreadState(); + if (ts.recursion_depth++>ts.systemState.getrecursionlimit()) + throw Py.RuntimeError("maximum __call__ recursion depth exceeded"); + try { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__call__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(args,keywords); + return super.__call__(args,keywords); + } finally { + --ts.recursion_depth; + } + } + + public PyObject __findattr_ex__(String name) { + return Deriveds.__findattr_ex__(this,name); + } + + public void __setattr__(String name,PyObject value) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__setattr__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(PyString.fromInterned(name),value); + return; + } + super.__setattr__(name,value); + } + + public void __delattr__(String name) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delattr__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(PyString.fromInterned(name)); + return; + } + super.__delattr__(name); + } + + public PyObject __get__(PyObject obj,PyObject type) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__get__"); + if (impl!=null) { + if (obj==null) + obj=Py.None; + if (type==null) + type=Py.None; + return impl.__get__(this,self_type).__call__(obj,type); + } + return super.__get__(obj,type); + } + + public void __set__(PyObject obj,PyObject value) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__set__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(obj,value); + return; + } + super.__set__(obj,value); + } + + public void __delete__(PyObject obj) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delete__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(obj); + return; + } + super.__delete__(obj); + } + + public PyObject __pow__(PyObject other,PyObject modulo) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__pow__"); + if (impl!=null) { + PyObject res; + if (modulo==null) { + res=impl.__get__(this,self_type).__call__(other); + } else { + res=impl.__get__(this,self_type).__call__(other,modulo); + } + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__pow__(other,modulo); + } + + public void dispatch__init__(PyObject[]args,String[]keywords) { + Deriveds.dispatch__init__(this,args,keywords); + } + + public PyObject __index__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__index__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger||res instanceof PyLong) { + return res; + } + throw Py.TypeError(String.format("__index__ returned non-(int,long) (type %s)",res.getType().fastGetName())); + } + return super.__index__(); + } + + public Object __tojava__(Class c) { + // If we are not being asked by the "default" conversion to java, then + // we can provide this as the result, as long as it is a instance of the + // specified class. Without this, derived.__tojava__(PyObject.class) + // would broke. (And that's not pure speculation: PyReflectedFunction's + // ReflectedArgs asks for things like that). + if ((c!=Object.class)&&(c!=Serializable.class)&&(c.isInstance(this))) { + return this; + } + // Otherwise, we call the derived __tojava__, if it exists: + PyType self_type=getType(); + PyObject impl=self_type.lookup("__tojava__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(Py.java2py(c)).__tojava__(Object.class); + return super.__tojava__(c); + } + + public Object __coerce_ex__(PyObject o) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__coerce__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(o); + if (res==Py.NotImplemented) + return Py.None; + if (!(res instanceof PyTuple)) + throw Py.TypeError("__coerce__ didn't return a 2-tuple"); + return((PyTuple)res).getArray(); + } + return super.__coerce_ex__(o); + } + + public String toString() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__repr__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (!(res instanceof PyString)) + throw Py.TypeError("__repr__ returned non-string (type "+res.getType().fastGetName()+")"); + return((PyString)res).toString(); + } + return super.toString(); + } + +} diff --git a/src/org/python/modules/_fileio/_fileio.java b/src/org/python/modules/_fileio/_fileio.java new file mode 100644 --- /dev/null +++ b/src/org/python/modules/_fileio/_fileio.java @@ -0,0 +1,24 @@ +/* Copyright (c) Jython Developers */ +package org.python.modules._fileio; + +import org.python.core.ClassDictInit; +import org.python.core.PyObject; +import org.python.core.PyString; + +/** + * The Python _fileio module. + */ +public class _fileio implements ClassDictInit { + + public static final PyString __doc__ = new PyString("Fast implementation of io.FileIO."); + + public static void classDictInit(PyObject dict) { + dict.__setitem__("__name__", new PyString("_fileio")); + dict.__setitem__("__doc__", __doc__); + dict.__setitem__("_FileIO", PyFileIO.TYPE); + + // Hide from Python + dict.__setitem__("classDictInit", null); + } + +} diff --git a/src/org/python/modules/_functools/PyPartialDerived.java b/src/org/python/modules/_functools/PyPartialDerived.java --- a/src/org/python/modules/_functools/PyPartialDerived.java +++ b/src/org/python/modules/_functools/PyPartialDerived.java @@ -16,9 +16,33 @@ private PyObject[]slots; + private PyObject dict; + + public PyObject fastGetDict() { + return dict; + } + + public PyObject getDict() { + return dict; + } + + public void setDict(PyObject newDict) { + if (newDict instanceof PyStringMap||newDict instanceof PyDictionary) { + dict=newDict; + } else { + throw Py.TypeError("__dict__ must be set to a Dictionary "+newDict.getClass().getName()); + } + } + + public void delDict() { + // deleting an object's instance dict makes it grow a new one + dict=new PyStringMap(); + } + public PyPartialDerived(PyType subtype) { super(subtype); slots=new PyObject[subtype.getNumSlots()]; + dict=subtype.instDict(); } public PyString __str__() { diff --git a/src/templates/PyFileIO.derived b/src/templates/PyFileIO.derived new file mode 100644 --- /dev/null +++ b/src/templates/PyFileIO.derived @@ -0,0 +1,4 @@ +base_class: PyFileIO +want_dict: true +ctr: +incl: object diff --git a/src/templates/mappings b/src/templates/mappings --- a/src/templates/mappings +++ b/src/templates/mappings @@ -8,6 +8,7 @@ BaseException.derived:org.python.core.PyBaseExceptionDerived ClasspathPyImporter.derived:org.python.core.ClasspathPyImporterDerived +PyFileIO.derived:org.python.modules._fileio.PyFileIODerived array.derived:org.python.core.PyArrayDerived classmethod.derived:org.python.core.PyClassMethodDerived complex.derived:org.python.core.PyComplexDerived diff --git a/src/templates/partial.derived b/src/templates/partial.derived --- a/src/templates/partial.derived +++ b/src/templates/partial.derived @@ -1,4 +1,4 @@ base_class: PyPartial -want_dict: false +want_dict: true ctr: incl: object -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 13 20:00:03 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 13 Mar 2012 20:00:03 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Remove_breaks_as_=5F=5Ffutur?= =?utf8?q?e=5F=5F_could_have_multiple_imports_on_one_line=2E?= Message-ID: http://hg.python.org/jython/rev/15f8ffe89c47 changeset: 6319:15f8ffe89c47 user: Frank Wierzbicki date: Tue Mar 13 11:59:54 2012 -0700 summary: Remove breaks as __future__ could have multiple imports on one line. files: grammar/Python.g | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -942,10 +942,8 @@ if (a != null) { if (a.getInternalName().equals("print_function")) { printStatement = false; - break; } else if (a.getInternalName().equals("unicode_literals")) { unicodeLiterals = true; - break; } } } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 13 20:23:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 13 Mar 2012 20:23:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_printStatement_-=3E_printFun?= =?utf8?q?ction_to_be_consistent_with_unicodeLiterals_and?= Message-ID: http://hg.python.org/jython/rev/1453c98a1999 changeset: 6320:1453c98a1999 user: Frank Wierzbicki date: Tue Mar 13 12:22:55 2012 -0700 summary: printStatement -> printFunction to be consistent with unicodeLiterals and start as false. files: grammar/Python.g | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -168,7 +168,7 @@ private String encoding; - private boolean printStatement = true; + private boolean printFunction = false; private boolean unicodeLiterals = false; public void setErrorHandler(ErrorHandler eh) { @@ -387,7 +387,7 @@ : NAME { $tok = $name_or_print.start; } - | {!printStatement}? => PRINT { + | {printFunction}? => PRINT { $tok = $name_or_print.start; } ; @@ -610,7 +610,7 @@ | global_stmt | exec_stmt | assert_stmt - | {printStatement}? => print_stmt + | {!printFunction}? => print_stmt ; //expr_stmt: testlist (augassign (yield_expr|testlist) | @@ -941,7 +941,7 @@ for(alias a: aliases) { if (a != null) { if (a.getInternalName().equals("print_function")) { - printStatement = false; + printFunction = true; } else if (a.getInternalName().equals("unicode_literals")) { unicodeLiterals = true; } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 13 20:42:42 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 13 Mar 2012 20:42:42 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_test=5Ffuture=2E?= Message-ID: http://hg.python.org/jython/rev/bce3c8cd9f48 changeset: 6321:bce3c8cd9f48 user: Frank Wierzbicki date: Tue Mar 13 12:42:35 2012 -0700 summary: Fix test_future. files: grammar/Python.g | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -954,6 +954,21 @@ } | LPAREN i2=import_as_names COMMA? RPAREN { + //XXX: this is almost a complete C&P of the code above - is there some way + // to factor it out? + String dottedText = $dotted_name.text; + if (dottedText != null && dottedText.equals("__future__")) { + List aliases = $i2.atypes; + for(alias a: aliases) { + if (a != null) { + if (a.getInternalName().equals("print_function")) { + printFunction = true; + } else if (a.getInternalName().equals("unicode_literals")) { + unicodeLiterals = true; + } + } + } + } stype = new ImportFrom($FROM, actions.makeFromText($d, $dotted_name.names), actions.makeModuleNameNode($d, $dotted_name.names), actions.makeAliases($i2.atypes), actions.makeLevel($d)); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Pull_from_CPython_2=2E7=2E?= Message-ID: http://hg.python.org/jython/rev/a1e817b5c938 changeset: 6322:a1e817b5c938 parent: 6317:a4fc69ee524b user: Frank Wierzbicki date: Mon Mar 12 12:51:59 2012 -0700 summary: Pull from CPython 2.7. files: .hgsub | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/.hgsub b/.hgsub --- a/.hgsub +++ b/.hgsub @@ -1,1 +1,1 @@ -CPythonLib = [svn] https://svn.python.org/projects/python/branches/release26-maint/Lib/ +CPythonLib = [svn] https://svn.python.org/projects/python/branches/release27-maint/Lib/ -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_HORRIBLE_KLUDGE=2C_using_sha?= =?utf8?q?256_for_sha224=2E_Fix_before_we_leave_sandbox=2E?= Message-ID: http://hg.python.org/jython/rev/8a80ee87027d changeset: 6323:8a80ee87027d user: Frank Wierzbicki date: Mon Mar 12 13:23:17 2012 -0700 summary: HORRIBLE KLUDGE, using sha256 for sha224. Fix before we leave sandbox. files: src/org/python/modules/_hashlib.java | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/src/org/python/modules/_hashlib.java b/src/org/python/modules/_hashlib.java --- a/src/org/python/modules/_hashlib.java +++ b/src/org/python/modules/_hashlib.java @@ -30,6 +30,7 @@ /** A mapping of Python algorithm names to MessageDigest names. */ private static final Map algorithmMap = new HashMap() {{ put("sha1", "sha-1"); + put("sha224", "sha-224"); put("sha256", "sha-256"); put("sha384", "sha-384"); put("sha512", "sha-512"); @@ -75,6 +76,16 @@ return new$("sha1", obj); } + public static PyObject openssl_sha224() { + return openssl_sha224(null); + } + + public static PyObject openssl_sha224(PyObject obj) { + //FIXME: WRONG! + return new$("sha256", obj); + //return new$("sha224", obj); + } + public static PyObject openssl_sha256() { return openssl_sha256(null); } @@ -118,6 +129,7 @@ private static final Map blockSizes = new HashMap() {{ put("md5", 64); put("sha-1", 64); + put("sha-224", 64); put("sha-256", 64); put("sha-384", 128); put("sha-512", 128); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Include_importlib=2C_unittes?= =?utf8?q?t/=2C_argparse=2E?= Message-ID: http://hg.python.org/jython/rev/c9866f57d73c changeset: 6324:c9866f57d73c user: Frank Wierzbicki date: Mon Mar 12 13:24:47 2012 -0700 summary: Include importlib, unittest/, argparse. files: CPythonLib.includes | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -6,8 +6,10 @@ distutils/** email/** encodings/** +importlib/* logging/* test/** +unittest/** xml/etree/** # Lib files, in alphabetical order: @@ -18,6 +20,7 @@ _threading_local.py aifc.py anydbm.py +argparse.py ast.py atexit.py asynchat.py @@ -147,7 +150,6 @@ trace.py traceback.py tzparse.py -unittest.py urllib2.py urlparse.py user.py @@ -155,6 +157,7 @@ UserList.py UserString.py uuid.py +warnings.py whichdb.py whrandom.py wsgiref.egg-info -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_test=5Fsupport=2E?= Message-ID: http://hg.python.org/jython/rev/b2cda5e87c25 changeset: 6325:b2cda5e87c25 user: Frank Wierzbicki date: Mon Mar 12 13:29:09 2012 -0700 summary: Update test_support. files: .hgsubstate | 2 +- Lib/test/test_support.py | 94 +++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,1 +1,1 @@ -88766 CPythonLib +88741 CPythonLib diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -11,6 +11,7 @@ import shutil import warnings import unittest +import importlib import re __all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", @@ -24,7 +25,7 @@ "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", - "threading_cleanup", "reap_children"] + "import_fresh_module", "threading_cleanup", "reap_children"] class Error(Exception): """Base class for regression test exceptions.""" @@ -50,6 +51,21 @@ and unexpected skips. """ + at contextlib.contextmanager +def _ignore_deprecated_imports(ignore=True): + """Context manager to suppress package and module deprecation + warnings when importing them. + + If ignore is False, this context manager has no effect.""" + if ignore: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", ".+ (module|package)", + DeprecationWarning) + yield + else: + yield + + def import_module(name, deprecated=False): """Import the module to be tested, raising TestSkipped if it is not available.""" @@ -64,6 +80,72 @@ else: return module + +def _save_and_remove_module(name, orig_modules): + """Helper function to save and remove a module from sys.modules + + Raise ImportError if the module can't be imported.""" + # try to import the module and raise an error if it can't be imported + if name not in sys.modules: + __import__(name) + del sys.modules[name] + for modname in list(sys.modules): + if modname == name or modname.startswith(name + '.'): + orig_modules[modname] = sys.modules[modname] + del sys.modules[modname] + + +def _save_and_block_module(name, orig_modules): + """Helper function to save and block a module in sys.modules + + Return True if the module was in sys.modules, False otherwise.""" + saved = True + try: + orig_modules[name] = sys.modules[name] + except KeyError: + saved = False + sys.modules[name] = None + return saved + + +def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): + """Imports and returns a module, deliberately bypassing the sys.modules cache + and importing a fresh copy of the module. Once the import is complete, + the sys.modules cache is restored to its original state. + + Modules named in fresh are also imported anew if needed by the import. + If one of these modules can't be imported, None is returned. + + Importing of modules named in blocked is prevented while the fresh import + takes place. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + # NOTE: test_heapq, test_json, and test_warnings include extra sanity + # checks to make sure that this utility function is working as expected + with _ignore_deprecated_imports(deprecated): + # Keep track of modules saved for later restoration as well + # as those which just need a blocking entry removed + orig_modules = {} + names_to_remove = [] + _save_and_remove_module(name, orig_modules) + try: + for fresh_name in fresh: + _save_and_remove_module(fresh_name, orig_modules) + for blocked_name in blocked: + if not _save_and_block_module(blocked_name, orig_modules): + names_to_remove.append(blocked_name) + fresh_module = importlib.import_module(name) + except ImportError: + fresh_module = None + finally: + for orig_name, module in orig_modules.items(): + sys.modules[orig_name] = module + for name_to_remove in names_to_remove: + del sys.modules[name_to_remove] + return fresh_module + + verbose = 1 # Flag set to 0 by regrtest.py use_resources = None # Flag set to [] by regrtest.py junit_xml_dir = None # Option set by regrtest.py @@ -951,3 +1033,13 @@ break except: break + +def strip_python_stderr(stderr): + """Strip the stderr of a Python process from potential debug output + emitted by the interpreter. + + This will typically be run on the result of the communicate() method + of a subprocess.Popen object. + """ + stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip() + return stderr -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Make_check=5Fpy3k=5Fwarnings?= =?utf8?q?_public=2E?= Message-ID: http://hg.python.org/jython/rev/7d761a8c8c0f changeset: 6326:7d761a8c8c0f user: Frank Wierzbicki date: Mon Mar 12 13:58:52 2012 -0700 summary: Make check_py3k_warnings public. files: Lib/test/test_support.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -20,7 +20,7 @@ "is_resource_enabled", "requires", "find_unused_port", "bind_port", "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", "findfile", "verify", "vereq", "sortdict", "check_syntax_error", - "open_urlresource", "check_warnings", "_check_py3k_warnings", + "open_urlresource", "check_warnings", "check_py3k_warnings", "CleanImport", "EnvironmentVarGuard", "captured_output", "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", @@ -613,7 +613,7 @@ @contextlib.contextmanager -def _check_py3k_warnings(*filters, **kwargs): +def check_py3k_warnings(*filters, **kwargs): """Context manager to silence py3k warnings. Accept 2-tuples as positional arguments: @@ -624,7 +624,7 @@ (default False) Without argument, it defaults to: - _check_py3k_warnings(("", DeprecationWarning), quiet=False) + check_py3k_warnings(("", DeprecationWarning), quiet=False) """ if sys.py3kwarning: if not filters: -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_in_cpython=5Fonly_etc=2E?= Message-ID: http://hg.python.org/jython/rev/728b704d3f9f changeset: 6327:728b704d3f9f user: Frank Wierzbicki date: Mon Mar 12 14:11:18 2012 -0700 summary: Add in cpython_only etc. files: Lib/test/test_support.py | 52 ++++++++++++++++++++++++++++ 1 files changed, 52 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -8,6 +8,7 @@ import socket import sys import os +import platform import shutil import warnings import unittest @@ -907,6 +908,57 @@ return result +def _id(obj): + return obj + +def requires_resource(resource): + if is_resource_enabled(resource): + return _id + else: + return unittest.skip("resource {0!r} is not enabled".format(resource)) + +def cpython_only(test): + """ + Decorator for tests only applicable on CPython. + """ + return impl_detail(cpython=True)(test) + +def impl_detail(msg=None, **guards): + if check_impl_detail(**guards): + return _id + if msg is None: + guardnames, default = _parse_guards(guards) + if default: + msg = "implementation detail not available on {0}" + else: + msg = "implementation detail specific to {0}" + guardnames = sorted(guardnames.keys()) + msg = msg.format(' or '.join(guardnames)) + return unittest.skip(msg) + +def _parse_guards(guards): + # Returns a tuple ({platform_name: run_me}, default_value) + if not guards: + return ({'cpython': True}, False) + is_true = guards.values()[0] + assert guards.values() == [is_true] * len(guards) # all True or all False + return (guards, not is_true) + +# Use the following check to guard CPython's implementation-specific tests -- +# or to run them only on the implementation(s) guarded by the arguments. +def check_impl_detail(**guards): + """This function returns True or False depending on the host platform. + Examples: + if check_impl_detail(): # only on CPython (default) + if check_impl_detail(jython=True): # only on Jython + if check_impl_detail(cpython=False): # everywhere except on CPython + """ + guards, default = _parse_guards(guards) + return guards.get(platform.python_implementation().lower(), default) + + + + def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" if not junit_xml_dir: -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Some_update_of_regrtest=2C_a?= =?utf8?q?dded_json=2C_fixed_test=5Fatexit=2E?= Message-ID: http://hg.python.org/jython/rev/04ba7316b47f changeset: 6328:04ba7316b47f user: Frank Wierzbicki date: Mon Mar 12 15:55:20 2012 -0700 summary: Some update of regrtest, added json, fixed test_atexit. files: CPythonLib.includes | 1 + Lib/test/regrtest.py | 9 +- Lib/test/test_atexit.py | 84 ++++++++++++++++++++++++++++ Lib/test/test_builtin.py | 6 +- Lib/test/test_support.py | 74 +++++++++++++++--------- 5 files changed, 140 insertions(+), 34 deletions(-) diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -11,6 +11,7 @@ test/** unittest/** xml/etree/** +json/** # Lib files, in alphabetical order: __future__.py diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -133,6 +133,7 @@ import time import traceback import warnings +import unittest # keep a reference to the ascii module to workaround #7140 bug # (see issue #7027) import encodings.ascii @@ -359,7 +360,7 @@ tests = map(removepy, tests) stdtests = STDTESTS[:] - nottests = NOTTESTS[:] + nottests = NOTTESTS.copy() if exclude: for arg in args: if arg in stdtests: @@ -508,11 +509,11 @@ 'test_py3kwarn', ] -NOTTESTS = [ +NOTTESTS = { 'test_support', 'test_future1', 'test_future2', - ] +} def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): """Return a list of all applicable test modules.""" @@ -613,7 +614,7 @@ stdout=stdout.getvalue(), stderr=stderr.getvalue()) return -2 - except (ImportError, test_support.TestSkipped), msg: + except (ImportError, unittest.SkipTest), msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_atexit.py @@ -0,0 +1,84 @@ +import sys +import unittest +import StringIO +import atexit +from test import test_support +if not test_support.is_jython: + from imp import reload + +class TestCase(unittest.TestCase): + def setUp(self): + s = StringIO.StringIO() + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + sys.stdout = sys.stderr = self.subst_io = s + self.save_handlers = atexit._exithandlers + atexit._exithandlers = [] + + def tearDown(self): + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + atexit._exithandlers = self.save_handlers + + def test_args(self): + atexit.register(self.h1) + atexit.register(self.h4) + atexit.register(self.h4, 4, kw="abc") + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), + "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") + + def test_badargs(self): + atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + def test_order(self): + atexit.register(self.h1) + atexit.register(self.h2) + atexit.register(self.h3) + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n") + + if not test_support.is_jython: + def test_sys_override(self): + # be sure a preset sys.exitfunc is handled properly + exfunc = sys.exitfunc + sys.exitfunc = self.h1 + reload(atexit) + try: + atexit.register(self.h2) + atexit._run_exitfuncs() + finally: + sys.exitfunc = exfunc + self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n") + + def test_raise(self): + atexit.register(self.raise1) + atexit.register(self.raise2) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + ### helpers + def h1(self): + print "h1" + + def h2(self): + print "h2" + + def h3(self): + print "h3" + + def h4(self, *args, **kwargs): + print "h4", args, kwargs + + def raise1(self): + raise TypeError + + def raise2(self): + raise SystemError + +def test_main(): + test_support.run_unittest(TestCase) + + +if __name__ == "__main__": + test_main() diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -4,7 +4,7 @@ import unittest import warnings from test.test_support import (fcmp, have_unicode, TESTFN, unlink, - run_unittest, _check_py3k_warnings, check_warnings, + run_unittest, check_py3k_warnings, check_warnings, is_jython) from operator import neg @@ -418,7 +418,7 @@ f.write('z = z+1\n') f.write('z = z*2\n') f.close() - with _check_py3k_warnings(("execfile.. not supported in 3.x", + with check_py3k_warnings(("execfile.. not supported in 3.x", DeprecationWarning)): execfile(TESTFN) @@ -1581,7 +1581,7 @@ self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0) def _run_unittest(*args): - with _check_py3k_warnings( + with check_py3k_warnings( (".+ not supported in 3.x", DeprecationWarning), (".+ is renamed to imp.reload", DeprecationWarning), ("classic int division", DeprecationWarning)): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -15,18 +15,21 @@ import importlib import re -__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", +__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", "get_original_stdout", "unload", "unlink", "rmtree", "forget", "is_resource_enabled", "requires", "find_unused_port", "bind_port", "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", - "findfile", "verify", "vereq", "sortdict", "check_syntax_error", + "SAVEDCWD", "temp_cwd", "findfile", "sortdict", "check_syntax_error", "open_urlresource", "check_warnings", "check_py3k_warnings", "CleanImport", "EnvironmentVarGuard", "captured_output", "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", - "import_fresh_module", "threading_cleanup", "reap_children"] + "threading_cleanup", "reap_children", "cpython_only", + "check_impl_detail", "get_attribute", "py3k_bytes", + "import_fresh_module", "threading_cleanup", "reap_children", + "strip_python_stderr"] class Error(Exception): """Base class for regression test exceptions.""" @@ -34,17 +37,7 @@ class TestFailed(Error): """Test failed.""" -class TestSkipped(Error): - """Test skipped. - - This can be raised to indicate that a test was deliberatly - skipped, but not because a feature wasn't available. For - example, if some resource can't be used, such as the network - appears to be unavailable, this should be raised instead of - TestFailed. - """ - -class ResourceDenied(TestSkipped): +class ResourceDenied(unittest.SkipTest): """Test skipped because it requested a disallowed resource. This is raised when a test calls requires() for a resource that @@ -68,18 +61,16 @@ def import_module(name, deprecated=False): - """Import the module to be tested, raising TestSkipped if it is not - available.""" - with warnings.catch_warnings(): - if deprecated: - warnings.filterwarnings("ignore", ".+ (module|package)", - DeprecationWarning) + """Import and return the module to be tested, raising SkipTest if + it is not available. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + with _ignore_deprecated_imports(deprecated): try: - module = __import__(name, level=0) - except ImportError: - raise TestSkipped("No module named " + name) - else: - return module + return importlib.import_module(name) + except ImportError, msg: + raise unittest.SkipTest(str(msg)) def _save_and_remove_module(name, orig_modules): @@ -95,7 +86,6 @@ orig_modules[modname] = sys.modules[modname] del sys.modules[modname] - def _save_and_block_module(name, orig_modules): """Helper function to save and block a module in sys.modules @@ -147,6 +137,17 @@ return fresh_module +def get_attribute(obj, name): + """Get an attribute, raising SkipTest if AttributeError is raised.""" + try: + attribute = getattr(obj, name) + except AttributeError: + raise unittest.SkipTest("module %s has no attribute %s" % ( + obj.__name__, name)) + else: + return attribute + + verbose = 1 # Flag set to 0 by regrtest.py use_resources = None # Flag set to [] by regrtest.py junit_xml_dir = None # Option set by regrtest.py @@ -438,12 +439,14 @@ unlink(TESTFN) del fp -def findfile(file, here=__file__): +def findfile(file, here=__file__, subdir=None): """Try to find a file on sys.path and the working directory. If it is not found the argument passed to the function is returned (this does not necessarily signal failure; could still be the legitimate path).""" if os.path.isabs(file): return file + if subdir is not None: + file = os.path.join(subdir, file) path = sys.path path = [os.path.dirname(here)] + path for dn in path: @@ -1066,6 +1069,23 @@ count += 1 time.sleep(0.1) +def reap_threads(func): + """Use this function when threads are being used. This will + ensure that the threads are cleaned up even when the test fails. + If threading is unavailable this function does nothing. + """ + if not thread: + return func + + @functools.wraps(func) + def decorator(*args): + key = threading_setup() + try: + return func(*args) + finally: + threading_cleanup(*key) + return decorator + def reap_children(): """Use this function at the end of test_main() whenever sub-processes are started. This will help ensure that no extra children (zombies) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:28 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:28 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_usage_of_regrtest=2Er?= =?utf8?q?untest?= Message-ID: http://hg.python.org/jython/rev/c0134e1fbe00 changeset: 6329:c0134e1fbe00 parent: 6326:7d761a8c8c0f user: Jim Baker date: Mon Mar 12 15:46:45 2012 -0700 summary: Update usage of regrtest.runtest files: Lib/test/test_pbcvm.py | 5 +- b/.idea/libraries/extlibs.xml | 48 +++++++++++++++++++ b/.idea/libraries/jar.xml | 12 ++++ b/.idea/libraries/svnant_jars.xml | 11 ++++ b/.idea/libraries/test.xml | 14 +++++ build.xml | 2 +- 6 files changed, 89 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_pbcvm.py b/Lib/test/test_pbcvm.py --- a/Lib/test/test_pbcvm.py +++ b/Lib/test/test_pbcvm.py @@ -53,8 +53,9 @@ # use subprocess asap 'test_types_pyc', 'test_exceptions_pyc'): - ok = runtest(test, generate=False, verbose=False, quiet=True, testdir=None, - huntrleaks=False, junit_xml=None) + test_times = [] + ok = runtest(test, False, True, test_times) + print "got", ok self.assertTrue(ok > 0) def tearDown(self): diff --git a/b/.idea/libraries/extlibs.xml b/b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/extlibs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/jar.xml b/b/.idea/libraries/jar.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/jar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/svnant_jars.xml b/b/.idea/libraries/svnant_jars.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/svnant_jars.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/test.xml b/b/.idea/libraries/test.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -190,7 +190,7 @@ - + -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:29 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:29 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge_trunk?= Message-ID: http://hg.python.org/jython/rev/8c4ff6487a0d changeset: 6331:8c4ff6487a0d parent: 6330:46f79d2ef0dd parent: 6327:728b704d3f9f user: Jim Baker date: Mon Mar 12 15:49:25 2012 -0700 summary: Merge trunk files: Lib/test/test_support.py | 52 ++++++++++++++++++++++++++++ 1 files changed, 52 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -8,6 +8,7 @@ import socket import sys import os +import platform import shutil import warnings import unittest @@ -907,6 +908,57 @@ return result +def _id(obj): + return obj + +def requires_resource(resource): + if is_resource_enabled(resource): + return _id + else: + return unittest.skip("resource {0!r} is not enabled".format(resource)) + +def cpython_only(test): + """ + Decorator for tests only applicable on CPython. + """ + return impl_detail(cpython=True)(test) + +def impl_detail(msg=None, **guards): + if check_impl_detail(**guards): + return _id + if msg is None: + guardnames, default = _parse_guards(guards) + if default: + msg = "implementation detail not available on {0}" + else: + msg = "implementation detail specific to {0}" + guardnames = sorted(guardnames.keys()) + msg = msg.format(' or '.join(guardnames)) + return unittest.skip(msg) + +def _parse_guards(guards): + # Returns a tuple ({platform_name: run_me}, default_value) + if not guards: + return ({'cpython': True}, False) + is_true = guards.values()[0] + assert guards.values() == [is_true] * len(guards) # all True or all False + return (guards, not is_true) + +# Use the following check to guard CPython's implementation-specific tests -- +# or to run them only on the implementation(s) guarded by the arguments. +def check_impl_detail(**guards): + """This function returns True or False depending on the host platform. + Examples: + if check_impl_detail(): # only on CPython (default) + if check_impl_detail(jython=True): # only on Jython + if check_impl_detail(cpython=False): # everywhere except on CPython + """ + guards, default = _parse_guards(guards) + return guards.get(platform.python_implementation().lower(), default) + + + + def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" if not junit_xml_dir: -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:30 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:30 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Skip_test=5Fcprofile=2C_gc_c?= =?utf8?q?ollect_in_test=5Fabc=2E?= Message-ID: http://hg.python.org/jython/rev/963905961b66 changeset: 6333:963905961b66 user: Frank Wierzbicki date: Mon Mar 12 16:53:21 2012 -0700 summary: Skip test_cprofile, gc collect in test_abc. files: Lib/test/regrtest.py | 2 +- Lib/test/test_abc.py | 234 +++++++++++++++++++++++++++++++ 2 files changed, 235 insertions(+), 1 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1190,7 +1190,7 @@ test_bsddb185 test_bsddb3 test_bz2 - test_cProfile + test_cprofile test_capi test_cd test_cl diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_abc.py @@ -0,0 +1,234 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Unit tests for abc.py.""" + +import unittest, weakref +from test import test_support + +import abc +from inspect import isabstract + + +class TestABC(unittest.TestCase): + + def test_abstractmethod_basics(self): + @abc.abstractmethod + def foo(self): pass + self.assertTrue(foo.__isabstractmethod__) + def bar(self): pass + self.assertFalse(hasattr(bar, "__isabstractmethod__")) + + def test_abstractproperty_basics(self): + @abc.abstractproperty + def foo(self): pass + self.assertTrue(foo.__isabstractmethod__) + def bar(self): pass + self.assertFalse(hasattr(bar, "__isabstractmethod__")) + + class C: + __metaclass__ = abc.ABCMeta + @abc.abstractproperty + def foo(self): return 3 + class D(C): + @property + def foo(self): return super(D, self).foo + self.assertEqual(D().foo, 3) + + def test_abstractmethod_integration(self): + for abstractthing in [abc.abstractmethod, abc.abstractproperty]: + class C: + __metaclass__ = abc.ABCMeta + @abstractthing + def foo(self): pass # abstract + def bar(self): pass # concrete + self.assertEqual(C.__abstractmethods__, set(["foo"])) + self.assertRaises(TypeError, C) # because foo is abstract + self.assertTrue(isabstract(C)) + class D(C): + def bar(self): pass # concrete override of concrete + self.assertEqual(D.__abstractmethods__, set(["foo"])) + self.assertRaises(TypeError, D) # because foo is still abstract + self.assertTrue(isabstract(D)) + class E(D): + def foo(self): pass + self.assertEqual(E.__abstractmethods__, set()) + E() # now foo is concrete, too + self.assertFalse(isabstract(E)) + class F(E): + @abstractthing + def bar(self): pass # abstract override of concrete + self.assertEqual(F.__abstractmethods__, set(["bar"])) + self.assertRaises(TypeError, F) # because bar is abstract now + self.assertTrue(isabstract(F)) + + def test_subclass_oldstyle_class(self): + class A: + __metaclass__ = abc.ABCMeta + class OldstyleClass: + pass + self.assertFalse(issubclass(OldstyleClass, A)) + self.assertFalse(issubclass(A, OldstyleClass)) + + def test_isinstance_class(self): + class A: + __metaclass__ = abc.ABCMeta + class OldstyleClass: + pass + self.assertFalse(isinstance(OldstyleClass, A)) + self.assertTrue(isinstance(OldstyleClass, type(OldstyleClass))) + self.assertFalse(isinstance(A, OldstyleClass)) + # This raises a recursion depth error, but is low-priority: + # self.assertTrue(isinstance(A, abc.ABCMeta)) + + def test_registration_basics(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + pass + b = B() + self.assertFalse(issubclass(B, A)) + self.assertFalse(issubclass(B, (A,))) + self.assertNotIsInstance(b, A) + self.assertNotIsInstance(b, (A,)) + A.register(B) + self.assertTrue(issubclass(B, A)) + self.assertTrue(issubclass(B, (A,))) + self.assertIsInstance(b, A) + self.assertIsInstance(b, (A,)) + class C(B): + pass + c = C() + self.assertTrue(issubclass(C, A)) + self.assertTrue(issubclass(C, (A,))) + self.assertIsInstance(c, A) + self.assertIsInstance(c, (A,)) + + def test_isinstance_invalidation(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + pass + b = B() + self.assertFalse(isinstance(b, A)) + self.assertFalse(isinstance(b, (A,))) + A.register(B) + self.assertTrue(isinstance(b, A)) + self.assertTrue(isinstance(b, (A,))) + + def test_registration_builtins(self): + class A: + __metaclass__ = abc.ABCMeta + A.register(int) + self.assertIsInstance(42, A) + self.assertIsInstance(42, (A,)) + self.assertTrue(issubclass(int, A)) + self.assertTrue(issubclass(int, (A,))) + class B(A): + pass + B.register(basestring) + self.assertIsInstance("", A) + self.assertIsInstance("", (A,)) + self.assertTrue(issubclass(str, A)) + self.assertTrue(issubclass(str, (A,))) + + def test_registration_edge_cases(self): + class A: + __metaclass__ = abc.ABCMeta + A.register(A) # should pass silently + class A1(A): + pass + self.assertRaises(RuntimeError, A1.register, A) # cycles not allowed + class B(object): + pass + A1.register(B) # ok + A1.register(B) # should pass silently + class C(A): + pass + A.register(C) # should pass silently + self.assertRaises(RuntimeError, C.register, A) # cycles not allowed + C.register(B) # ok + + def test_register_non_class(self): + class A(object): + __metaclass__ = abc.ABCMeta + self.assertRaisesRegexp(TypeError, "Can only register classes", + A.register, 4) + + def test_registration_transitiveness(self): + class A: + __metaclass__ = abc.ABCMeta + self.assertTrue(issubclass(A, A)) + self.assertTrue(issubclass(A, (A,))) + class B: + __metaclass__ = abc.ABCMeta + self.assertFalse(issubclass(A, B)) + self.assertFalse(issubclass(A, (B,))) + self.assertFalse(issubclass(B, A)) + self.assertFalse(issubclass(B, (A,))) + class C: + __metaclass__ = abc.ABCMeta + A.register(B) + class B1(B): + pass + self.assertTrue(issubclass(B1, A)) + self.assertTrue(issubclass(B1, (A,))) + class C1(C): + pass + B1.register(C1) + self.assertFalse(issubclass(C, B)) + self.assertFalse(issubclass(C, (B,))) + self.assertFalse(issubclass(C, B1)) + self.assertFalse(issubclass(C, (B1,))) + self.assertTrue(issubclass(C1, A)) + self.assertTrue(issubclass(C1, (A,))) + self.assertTrue(issubclass(C1, B)) + self.assertTrue(issubclass(C1, (B,))) + self.assertTrue(issubclass(C1, B1)) + self.assertTrue(issubclass(C1, (B1,))) + C1.register(int) + class MyInt(int): + pass + self.assertTrue(issubclass(MyInt, A)) + self.assertTrue(issubclass(MyInt, (A,))) + self.assertIsInstance(42, A) + self.assertIsInstance(42, (A,)) + + def test_all_new_methods_are_called(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + counter = 0 + def __new__(cls): + B.counter += 1 + return super(B, cls).__new__(cls) + class C(A, B): + pass + self.assertEqual(B.counter, 0) + C() + self.assertEqual(B.counter, 1) + + @test_support.cpython_only + def test_cache_leak(self): + # See issue #2521. + class A(object): + __metaclass__ = abc.ABCMeta + @abc.abstractmethod + def f(self): + pass + class C(A): + def f(self): + A.f(self) + r = weakref.ref(C) + # Trigger cache. + C().f() + del C + test_support.gc_collect() + self.assertEqual(r(), None) + +def test_main(): + test_support.run_unittest(TestABC) + + +if __name__ == "__main__": + unittest.main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:30 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:30 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Adding_the_changes_related_t?= =?utf8?q?o_the_ASM4_update=2E?= Message-ID: http://hg.python.org/jython/rev/751fc2258335 changeset: 6335:751fc2258335 user: Shashank Bharadwaj date: Mon Mar 12 16:17:00 2012 -0700 summary: Adding the changes related to the ASM4 update. This changeset does not contain CodeCompiler change since I think that is only required when we change the generated class file version to Java7 The changes made under the jffi module are just so that jython builds, maybe we shoud modify the jffi upstream? Also updating the build and classpath files files: .classpath | 4 +- build.xml | 16 +- src/org/python/compiler/Code.java | 13 +- src/org/python/core/AnnotationReader.java | 11 +- src/org/python/expose/generate/ExposedFieldFinder.java | 4 +- src/org/python/expose/generate/ExposedMethodFinder.java | 9 +- src/org/python/expose/generate/ExposedTypeProcessor.java | 8 +- src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 11 +- src/org/python/modules/jffi/AsmClassBuilder.java | 1 - src/org/python/modules/jffi/EmptyVisitor.java | 93 ++++++++++ src/org/python/modules/jffi/SkinnyMethodAdapter.java | 15 +- tests/java/org/python/expose/generate/ExposeMethodFinderTest.java | 6 +- 12 files changed, 154 insertions(+), 37 deletions(-) diff --git a/.classpath b/.classpath --- a/.classpath +++ b/.classpath @@ -12,9 +12,9 @@ - + - + diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -186,9 +186,9 @@ - - - + + + @@ -219,8 +219,8 @@ - - + + @@ -618,9 +618,9 @@ - - - + + + diff --git a/src/org/python/compiler/Code.java b/src/org/python/compiler/Code.java --- a/src/org/python/compiler/Code.java +++ b/src/org/python/compiler/Code.java @@ -5,11 +5,12 @@ import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; +import org.objectweb.asm.Handle; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -class Code implements MethodVisitor, Opcodes { +class Code extends MethodVisitor implements Opcodes { MethodVisitor mv; String sig; String locals[]; @@ -21,6 +22,7 @@ //XXX: I'd really like to get sig and access out of here since MethodVistitor // should already have this information. public Code(MethodVisitor mv, String sig, int access) { + super(ASM4); this.mv = mv; this.sig = sig; nlocals = -sigSize(sig, false); @@ -163,7 +165,7 @@ return mv.visitParameterAnnotation(arg0, arg1, arg2); } - public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, Label[] arg3) { + public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, Label... arg3) { mv.visitTableSwitchInsn(arg0, arg1, arg2, arg3); } @@ -598,4 +600,11 @@ public void setline(int line) { mv.visitLineNumber(line, new Label()); } + + @Override + public void visitInvokeDynamicInsn(String name, String descriptor, Handle bsmHandle, + Object... bmsArgs) { + mv.visitInvokeDynamicInsn(name, descriptor, bsmHandle, bmsArgs); + } + } diff --git a/src/org/python/core/AnnotationReader.java b/src/org/python/core/AnnotationReader.java --- a/src/org/python/core/AnnotationReader.java +++ b/src/org/python/core/AnnotationReader.java @@ -8,7 +8,8 @@ import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; -import org.objectweb.asm.commons.EmptyVisitor; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Opcodes; /** * This class reads a classfile from a byte array and pulls out the value of the class annotation @@ -19,7 +20,7 @@ * cost too much, we will want to implement a special purpose ClassReader that only reads out the * APIVersion annotation I think. */ -public class AnnotationReader extends EmptyVisitor { +public class AnnotationReader extends ClassVisitor { private boolean nextVisitIsVersion = false; private boolean nextVisitIsMTime = false; @@ -32,6 +33,7 @@ * @throws IOException - if the classfile is malformed. */ public AnnotationReader(byte[] data) throws IOException { + super(Opcodes.ASM4); ClassReader r; try { r = new ClassReader(data); @@ -43,11 +45,12 @@ } r.accept(this, 0); } - + + @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { nextVisitIsVersion = desc.equals("Lorg/python/compiler/APIVersion;"); nextVisitIsMTime = desc.equals("Lorg/python/compiler/MTime;"); - return this; + return super.visitAnnotation(desc, visible); } public void visit(String name, Object value) { diff --git a/src/org/python/expose/generate/ExposedFieldFinder.java b/src/org/python/expose/generate/ExposedFieldFinder.java --- a/src/org/python/expose/generate/ExposedFieldFinder.java +++ b/src/org/python/expose/generate/ExposedFieldFinder.java @@ -3,8 +3,9 @@ import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Opcodes; -public abstract class ExposedFieldFinder implements FieldVisitor, PyTypes { +public abstract class ExposedFieldFinder extends FieldVisitor implements PyTypes { private String fieldName; @@ -13,6 +14,7 @@ private String doc; public ExposedFieldFinder(String name, FieldVisitor delegate) { + super(Opcodes.ASM4, delegate); fieldName = name; this.delegate = delegate; } diff --git a/src/org/python/expose/generate/ExposedMethodFinder.java b/src/org/python/expose/generate/ExposedMethodFinder.java --- a/src/org/python/expose/generate/ExposedMethodFinder.java +++ b/src/org/python/expose/generate/ExposedMethodFinder.java @@ -4,7 +4,6 @@ import org.python.expose.MethodType; import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -15,7 +14,7 @@ * annotation is visited, calls handleResult with the exposer constructed with that annotation. Only * one of the handleResult methods will be called, if any. */ -public abstract class ExposedMethodFinder extends MethodAdapter implements PyTypes, Opcodes { +public abstract class ExposedMethodFinder extends MethodVisitor implements PyTypes, Opcodes { private Exposer newExp; @@ -36,7 +35,7 @@ String desc, String[] exceptions, MethodVisitor delegate) { - super(delegate); + super(Opcodes.ASM4, delegate); this.typeName = typeName; this.onType = onType; this.access = access; @@ -136,6 +135,10 @@ class ExposedMethodVisitor extends RestrictiveAnnotationVisitor { + public ExposedMethodVisitor() { + super(); + } + @Override public void visit(String name, Object value) { if (name.equals("doc")) { diff --git a/src/org/python/expose/generate/ExposedTypeProcessor.java b/src/org/python/expose/generate/ExposedTypeProcessor.java --- a/src/org/python/expose/generate/ExposedTypeProcessor.java +++ b/src/org/python/expose/generate/ExposedTypeProcessor.java @@ -8,12 +8,10 @@ import org.python.expose.ExposedType; import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -105,7 +103,7 @@ /** * The actual visitor that runs over the bytecode and figures out what to expose. */ - private final class TypeProcessor extends ClassAdapter { + private final class TypeProcessor extends ClassVisitor { private Type baseType = OBJECT; @@ -116,7 +114,7 @@ private boolean generatedStaticBlock; private TypeProcessor(ClassVisitor cv) { - super(cv); + super(Opcodes.ASM4, cv); } @Override @@ -227,7 +225,7 @@ desc, signature, exceptions); - return new MethodAdapter(passthroughVisitor) { + return new MethodVisitor(Opcodes.ASM4, passthroughVisitor) { @Override public void visitCode() { diff --git a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java --- a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java +++ b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java @@ -1,12 +1,21 @@ package org.python.expose.generate; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Opcodes; /** * An Annotation visitor that throws an IllegalArgumentException if it visits anything other than * visitEnd. Should be subclasses by something interested in only certain events. */ -public class RestrictiveAnnotationVisitor implements AnnotationVisitor { +public class RestrictiveAnnotationVisitor extends AnnotationVisitor { + + public RestrictiveAnnotationVisitor(int arg0) { + super(arg0); + } + + public RestrictiveAnnotationVisitor() { + this(Opcodes.ASM4); + } public AnnotationVisitor visitAnnotation(String name, String desc) { throw new IllegalArgumentException("Unknown annotation field '" + name + "'"); diff --git a/src/org/python/modules/jffi/AsmClassBuilder.java b/src/org/python/modules/jffi/AsmClassBuilder.java --- a/src/org/python/modules/jffi/AsmClassBuilder.java +++ b/src/org/python/modules/jffi/AsmClassBuilder.java @@ -3,7 +3,6 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.commons.EmptyVisitor; import java.io.PrintWriter; import java.lang.reflect.Constructor; diff --git a/src/org/python/modules/jffi/EmptyVisitor.java b/src/org/python/modules/jffi/EmptyVisitor.java new file mode 100644 --- /dev/null +++ b/src/org/python/modules/jffi/EmptyVisitor.java @@ -0,0 +1,93 @@ +package org.python.modules.jffi; + +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + + +public class EmptyVisitor extends ClassVisitor { + + AnnotationVisitor av = new AnnotationVisitor(Opcodes.ASM4) { + + @Override + public AnnotationVisitor visitAnnotation( + String name, + String desc) + { + return this; + } + + @Override + public AnnotationVisitor visitArray(String name) { + return this; + } + }; + + public EmptyVisitor() { + super(Opcodes.ASM4); + } + + @Override + public AnnotationVisitor visitAnnotation( + String desc, + boolean visible) + { + return av; + } + + @Override + public FieldVisitor visitField( + int access, + String name, + String desc, + String signature, + Object value) + { + return new FieldVisitor(Opcodes.ASM4) { + + @Override + public AnnotationVisitor visitAnnotation( + String desc, + boolean visible) + { + return av; + } + }; + } + + @Override + public MethodVisitor visitMethod( + int access, + String name, + String desc, + String signature, + String[] exceptions) + { + return new MethodVisitor(Opcodes.ASM4) { + + @Override + public AnnotationVisitor visitAnnotationDefault() { + return av; + } + + @Override + public AnnotationVisitor visitAnnotation( + String desc, + boolean visible) + { + return av; + } + + @Override + public AnnotationVisitor visitParameterAnnotation( + int parameter, + String desc, + boolean visible) + { + return av; + } + }; + } +} \ No newline at end of file diff --git a/src/org/python/modules/jffi/SkinnyMethodAdapter.java b/src/org/python/modules/jffi/SkinnyMethodAdapter.java --- a/src/org/python/modules/jffi/SkinnyMethodAdapter.java +++ b/src/org/python/modules/jffi/SkinnyMethodAdapter.java @@ -10,11 +10,11 @@ package org.python.modules.jffi; import org.objectweb.asm.*; +import org.objectweb.asm.util.ASMifier; import org.objectweb.asm.util.TraceMethodVisitor; import java.io.PrintStream; import java.io.PrintWriter; -import java.util.Map; import static org.python.modules.jffi.CodegenUtils.*; @@ -22,7 +22,7 @@ * * @author headius */ -public class SkinnyMethodAdapter implements MethodVisitor, Opcodes { +public class SkinnyMethodAdapter extends MethodVisitor implements Opcodes { private final static boolean DEBUG = Boolean.getBoolean("jython.compile.dump"); private MethodVisitor method; private String name; @@ -30,16 +30,19 @@ /** Creates a new instance of SkinnyMethodAdapter */ public SkinnyMethodAdapter(MethodVisitor method) { + super(Opcodes.ASM4); setMethodVisitor(method); } public SkinnyMethodAdapter(ClassVisitor cv, int flags, String name, String signature, String something, String[] exceptions) { + super(Opcodes.ASM4); setMethodVisitor(cv.visitMethod(flags, name, signature, something, exceptions)); this.cv = cv; this.name = name; } public SkinnyMethodAdapter() { + super(Opcodes.ASM4); } public MethodVisitor getMethodVisitor() { @@ -48,7 +51,7 @@ public void setMethodVisitor(MethodVisitor mv) { if (DEBUG) { - this.method = new TraceMethodVisitor(mv); + this.method = new TraceMethodVisitor(mv, new ASMifier()); } else { this.method = mv; } @@ -530,7 +533,7 @@ } else { pw.write("*** Dumping ***\n"); } - ((TraceMethodVisitor)getMethodVisitor()).print(pw); + ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(1, 1); @@ -865,7 +868,7 @@ } public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, - Label[] arg3) { + Label... arg3) { getMethodVisitor().visitTableSwitchInsn(arg0, arg1, arg2, arg3); } @@ -895,7 +898,7 @@ if (DEBUG) { PrintWriter pw = new PrintWriter(System.out); pw.write("*** Dumping ***\n"); - ((TraceMethodVisitor)getMethodVisitor()).print(pw); + ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(arg0, arg1); diff --git a/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java b/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java --- a/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java +++ b/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java @@ -3,11 +3,9 @@ import junit.framework.TestCase; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import org.objectweb.asm.commons.EmptyVisitor; -import org.python.expose.ExposedMethod; -import org.python.expose.ExposedNew; public class ExposeMethodFinderTest extends TestCase implements Opcodes, PyTypes { @@ -18,7 +16,7 @@ methodName, descriptor, null, - new EmptyVisitor()) { + new MethodVisitor(Opcodes.ASM4) {}) { @Override public void handleResult(InstanceMethodExposer exposer) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_the_AnnotationReader_to_?= =?utf8?q?pass_the_correct_AnnotationVisitor_wrt_ASM4=2E_Fixes?= Message-ID: http://hg.python.org/jython/rev/1afee01eac12 changeset: 6338:1afee01eac12 user: Shashank Bharadwaj date: Tue Mar 13 12:55:33 2012 -0700 summary: Fix the AnnotationReader to pass the correct AnnotationVisitor wrt ASM4. Fixes a few of Java integration/visibility issues. There are a few more test failures, and the fix will be on it's way soon. files: src/org/python/core/AnnotationReader.java | 21 +- src/org/python/expose/generate/DescriptorVisitor.java | 1 + src/org/python/expose/generate/ExposedFieldFinder.java | 2 +- src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 7 +- src/org/python/modules/jffi/AsmClassBuilder.java | 2 +- src/org/python/modules/jffi/EmptyVisitor.java | 93 ---------- src/org/python/modules/jffi/SkinnyMethodAdapter.java | 23 +- 7 files changed, 24 insertions(+), 125 deletions(-) diff --git a/src/org/python/core/AnnotationReader.java b/src/org/python/core/AnnotationReader.java --- a/src/org/python/core/AnnotationReader.java +++ b/src/org/python/core/AnnotationReader.java @@ -50,17 +50,18 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { nextVisitIsVersion = desc.equals("Lorg/python/compiler/APIVersion;"); nextVisitIsMTime = desc.equals("Lorg/python/compiler/MTime;"); - return super.visitAnnotation(desc, visible); - } + return new AnnotationVisitor(Opcodes.ASM4) { - public void visit(String name, Object value) { - if (nextVisitIsVersion) { - version = (Integer)value; - nextVisitIsVersion = false; - } else if (nextVisitIsMTime) { - mtime = (Long)value; - nextVisitIsVersion = false; - } + public void visit(String name, Object value) { + if (nextVisitIsVersion) { + version = (Integer)value; + nextVisitIsVersion = false; + } else if (nextVisitIsMTime) { + mtime = (Long)value; + nextVisitIsVersion = false; + } + } + }; } public int getVersion() { diff --git a/src/org/python/expose/generate/DescriptorVisitor.java b/src/org/python/expose/generate/DescriptorVisitor.java --- a/src/org/python/expose/generate/DescriptorVisitor.java +++ b/src/org/python/expose/generate/DescriptorVisitor.java @@ -12,6 +12,7 @@ @Override public void visit(String name, Object value) { + System.err.println("DescriptorVisitor::visit:: " + name + " value: " + value); if (name.equals("name")) { val = (String)value; } else if (name.equals("doc")) { diff --git a/src/org/python/expose/generate/ExposedFieldFinder.java b/src/org/python/expose/generate/ExposedFieldFinder.java --- a/src/org/python/expose/generate/ExposedFieldFinder.java +++ b/src/org/python/expose/generate/ExposedFieldFinder.java @@ -14,7 +14,7 @@ private String doc; public ExposedFieldFinder(String name, FieldVisitor delegate) { - super(Opcodes.ASM4, delegate); + super(Opcodes.ASM4); fieldName = name; this.delegate = delegate; } diff --git a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java --- a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java +++ b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java @@ -9,12 +9,9 @@ */ public class RestrictiveAnnotationVisitor extends AnnotationVisitor { - public RestrictiveAnnotationVisitor(int arg0) { - super(arg0); - } - public RestrictiveAnnotationVisitor() { - this(Opcodes.ASM4); + super(Opcodes.ASM4); + System.err.println("RestrictiveAnnotationVisitor:: constructed "); } public AnnotationVisitor visitAnnotation(String name, String desc) { diff --git a/src/org/python/modules/jffi/AsmClassBuilder.java b/src/org/python/modules/jffi/AsmClassBuilder.java --- a/src/org/python/modules/jffi/AsmClassBuilder.java +++ b/src/org/python/modules/jffi/AsmClassBuilder.java @@ -142,7 +142,7 @@ Constructor c = tmvClass.getDeclaredConstructor(PrintWriter.class); return c.newInstance(out); } catch (Throwable t) { - return new EmptyVisitor(); + return null; } } diff --git a/src/org/python/modules/jffi/EmptyVisitor.java b/src/org/python/modules/jffi/EmptyVisitor.java deleted file mode 100644 --- a/src/org/python/modules/jffi/EmptyVisitor.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.python.modules.jffi; - -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - - -public class EmptyVisitor extends ClassVisitor { - - AnnotationVisitor av = new AnnotationVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotation( - String name, - String desc) - { - return this; - } - - @Override - public AnnotationVisitor visitArray(String name) { - return this; - } - }; - - public EmptyVisitor() { - super(Opcodes.ASM4); - } - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - - @Override - public FieldVisitor visitField( - int access, - String name, - String desc, - String signature, - Object value) - { - return new FieldVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - }; - } - - @Override - public MethodVisitor visitMethod( - int access, - String name, - String desc, - String signature, - String[] exceptions) - { - return new MethodVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotationDefault() { - return av; - } - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - - @Override - public AnnotationVisitor visitParameterAnnotation( - int parameter, - String desc, - boolean visible) - { - return av; - } - }; - } -} \ No newline at end of file diff --git a/src/org/python/modules/jffi/SkinnyMethodAdapter.java b/src/org/python/modules/jffi/SkinnyMethodAdapter.java --- a/src/org/python/modules/jffi/SkinnyMethodAdapter.java +++ b/src/org/python/modules/jffi/SkinnyMethodAdapter.java @@ -10,7 +10,8 @@ package org.python.modules.jffi; import org.objectweb.asm.*; -import org.objectweb.asm.util.ASMifier; +import org.objectweb.asm.util.Printer; +import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceMethodVisitor; import java.io.PrintStream; @@ -25,33 +26,25 @@ public class SkinnyMethodAdapter extends MethodVisitor implements Opcodes { private final static boolean DEBUG = Boolean.getBoolean("jython.compile.dump"); private MethodVisitor method; + private Printer printer; private String name; private ClassVisitor cv; - /** Creates a new instance of SkinnyMethodAdapter */ - public SkinnyMethodAdapter(MethodVisitor method) { - super(Opcodes.ASM4); - setMethodVisitor(method); - } - public SkinnyMethodAdapter(ClassVisitor cv, int flags, String name, String signature, String something, String[] exceptions) { - super(Opcodes.ASM4); + super(ASM4); setMethodVisitor(cv.visitMethod(flags, name, signature, something, exceptions)); this.cv = cv; this.name = name; } - public SkinnyMethodAdapter() { - super(Opcodes.ASM4); - } - public MethodVisitor getMethodVisitor() { return method; } public void setMethodVisitor(MethodVisitor mv) { if (DEBUG) { - this.method = new TraceMethodVisitor(mv, new ASMifier()); + this.printer = new Textifier(); + this.method = new TraceMethodVisitor(mv, printer); } else { this.method = mv; } @@ -533,7 +526,7 @@ } else { pw.write("*** Dumping ***\n"); } - ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(1, 1); @@ -898,7 +891,7 @@ if (DEBUG) { PrintWriter pw = new PrintWriter(System.out); pw.write("*** Dumping ***\n"); - ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(arg0, arg1); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_extlibs=2Exml_for_intell?= =?utf8?q?ij_use?= Message-ID: http://hg.python.org/jython/rev/d7a0bfce8485 changeset: 6339:d7a0bfce8485 parent: 6337:83d195d9e5e4 user: Jim Baker date: Tue Mar 13 13:06:30 2012 -0700 summary: Add extlibs.xml for intellij use files: .idea/libraries/extlibs.xml | 45 +++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/.idea/libraries/extlibs.xml b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/extlibs.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_upstream?= Message-ID: http://hg.python.org/jython/rev/6e947ec9b01a changeset: 6340:6e947ec9b01a parent: 6339:d7a0bfce8485 parent: 6338:1afee01eac12 user: Jim Baker date: Tue Mar 13 13:07:44 2012 -0700 summary: Merged upstream files: src/org/python/core/AnnotationReader.java | 21 +- src/org/python/expose/generate/DescriptorVisitor.java | 1 + src/org/python/expose/generate/ExposedFieldFinder.java | 2 +- src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 7 +- src/org/python/modules/jffi/AsmClassBuilder.java | 2 +- src/org/python/modules/jffi/EmptyVisitor.java | 93 ---------- src/org/python/modules/jffi/SkinnyMethodAdapter.java | 23 +- 7 files changed, 24 insertions(+), 125 deletions(-) diff --git a/src/org/python/core/AnnotationReader.java b/src/org/python/core/AnnotationReader.java --- a/src/org/python/core/AnnotationReader.java +++ b/src/org/python/core/AnnotationReader.java @@ -50,17 +50,18 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { nextVisitIsVersion = desc.equals("Lorg/python/compiler/APIVersion;"); nextVisitIsMTime = desc.equals("Lorg/python/compiler/MTime;"); - return super.visitAnnotation(desc, visible); - } + return new AnnotationVisitor(Opcodes.ASM4) { - public void visit(String name, Object value) { - if (nextVisitIsVersion) { - version = (Integer)value; - nextVisitIsVersion = false; - } else if (nextVisitIsMTime) { - mtime = (Long)value; - nextVisitIsVersion = false; - } + public void visit(String name, Object value) { + if (nextVisitIsVersion) { + version = (Integer)value; + nextVisitIsVersion = false; + } else if (nextVisitIsMTime) { + mtime = (Long)value; + nextVisitIsVersion = false; + } + } + }; } public int getVersion() { diff --git a/src/org/python/expose/generate/DescriptorVisitor.java b/src/org/python/expose/generate/DescriptorVisitor.java --- a/src/org/python/expose/generate/DescriptorVisitor.java +++ b/src/org/python/expose/generate/DescriptorVisitor.java @@ -12,6 +12,7 @@ @Override public void visit(String name, Object value) { + System.err.println("DescriptorVisitor::visit:: " + name + " value: " + value); if (name.equals("name")) { val = (String)value; } else if (name.equals("doc")) { diff --git a/src/org/python/expose/generate/ExposedFieldFinder.java b/src/org/python/expose/generate/ExposedFieldFinder.java --- a/src/org/python/expose/generate/ExposedFieldFinder.java +++ b/src/org/python/expose/generate/ExposedFieldFinder.java @@ -14,7 +14,7 @@ private String doc; public ExposedFieldFinder(String name, FieldVisitor delegate) { - super(Opcodes.ASM4, delegate); + super(Opcodes.ASM4); fieldName = name; this.delegate = delegate; } diff --git a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java --- a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java +++ b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java @@ -9,12 +9,9 @@ */ public class RestrictiveAnnotationVisitor extends AnnotationVisitor { - public RestrictiveAnnotationVisitor(int arg0) { - super(arg0); - } - public RestrictiveAnnotationVisitor() { - this(Opcodes.ASM4); + super(Opcodes.ASM4); + System.err.println("RestrictiveAnnotationVisitor:: constructed "); } public AnnotationVisitor visitAnnotation(String name, String desc) { diff --git a/src/org/python/modules/jffi/AsmClassBuilder.java b/src/org/python/modules/jffi/AsmClassBuilder.java --- a/src/org/python/modules/jffi/AsmClassBuilder.java +++ b/src/org/python/modules/jffi/AsmClassBuilder.java @@ -142,7 +142,7 @@ Constructor c = tmvClass.getDeclaredConstructor(PrintWriter.class); return c.newInstance(out); } catch (Throwable t) { - return new EmptyVisitor(); + return null; } } diff --git a/src/org/python/modules/jffi/EmptyVisitor.java b/src/org/python/modules/jffi/EmptyVisitor.java deleted file mode 100644 --- a/src/org/python/modules/jffi/EmptyVisitor.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.python.modules.jffi; - -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - - -public class EmptyVisitor extends ClassVisitor { - - AnnotationVisitor av = new AnnotationVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotation( - String name, - String desc) - { - return this; - } - - @Override - public AnnotationVisitor visitArray(String name) { - return this; - } - }; - - public EmptyVisitor() { - super(Opcodes.ASM4); - } - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - - @Override - public FieldVisitor visitField( - int access, - String name, - String desc, - String signature, - Object value) - { - return new FieldVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - }; - } - - @Override - public MethodVisitor visitMethod( - int access, - String name, - String desc, - String signature, - String[] exceptions) - { - return new MethodVisitor(Opcodes.ASM4) { - - @Override - public AnnotationVisitor visitAnnotationDefault() { - return av; - } - - @Override - public AnnotationVisitor visitAnnotation( - String desc, - boolean visible) - { - return av; - } - - @Override - public AnnotationVisitor visitParameterAnnotation( - int parameter, - String desc, - boolean visible) - { - return av; - } - }; - } -} \ No newline at end of file diff --git a/src/org/python/modules/jffi/SkinnyMethodAdapter.java b/src/org/python/modules/jffi/SkinnyMethodAdapter.java --- a/src/org/python/modules/jffi/SkinnyMethodAdapter.java +++ b/src/org/python/modules/jffi/SkinnyMethodAdapter.java @@ -10,7 +10,8 @@ package org.python.modules.jffi; import org.objectweb.asm.*; -import org.objectweb.asm.util.ASMifier; +import org.objectweb.asm.util.Printer; +import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceMethodVisitor; import java.io.PrintStream; @@ -25,33 +26,25 @@ public class SkinnyMethodAdapter extends MethodVisitor implements Opcodes { private final static boolean DEBUG = Boolean.getBoolean("jython.compile.dump"); private MethodVisitor method; + private Printer printer; private String name; private ClassVisitor cv; - /** Creates a new instance of SkinnyMethodAdapter */ - public SkinnyMethodAdapter(MethodVisitor method) { - super(Opcodes.ASM4); - setMethodVisitor(method); - } - public SkinnyMethodAdapter(ClassVisitor cv, int flags, String name, String signature, String something, String[] exceptions) { - super(Opcodes.ASM4); + super(ASM4); setMethodVisitor(cv.visitMethod(flags, name, signature, something, exceptions)); this.cv = cv; this.name = name; } - public SkinnyMethodAdapter() { - super(Opcodes.ASM4); - } - public MethodVisitor getMethodVisitor() { return method; } public void setMethodVisitor(MethodVisitor mv) { if (DEBUG) { - this.method = new TraceMethodVisitor(mv, new ASMifier()); + this.printer = new Textifier(); + this.method = new TraceMethodVisitor(mv, printer); } else { this.method = mv; } @@ -533,7 +526,7 @@ } else { pw.write("*** Dumping ***\n"); } - ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(1, 1); @@ -898,7 +891,7 @@ if (DEBUG) { PrintWriter pw = new PrintWriter(System.out); pw.write("*** Dumping ***\n"); - ((TraceMethodVisitor)getMethodVisitor()).p.print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(arg0, arg1); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_doctest=2Epy_from_CPy?= =?utf8?q?thonLib=40r85505?= Message-ID: http://hg.python.org/jython/rev/d5f2af98d603 changeset: 6342:d5f2af98d603 user: Alex Gr?nholm date: Tue Mar 13 13:19:21 2012 -0700 summary: Update doctest.py from CPythonLib at r85505 files: Lib/doctest.py | 168 +++++++++++++++++++++++++----------- 1 files changed, 117 insertions(+), 51 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -99,6 +99,9 @@ import unittest, difflib, pdb, tempfile import warnings from StringIO import StringIO +from collections import namedtuple + +TestResults = namedtuple('TestResults', 'failed attempted') # There are 4 basic classes: # - Example: a pair, plus an intra-docstring line number. @@ -213,13 +216,21 @@ # get_data() opens files as 'rb', so one must do the equivalent # conversion as universal newlines would do. return file_contents.replace(os.linesep, '\n'), filename - return open(filename).read(), filename + with open(filename) as f: + return f.read(), filename + +# Use sys.stdout encoding for ouput. +_encoding = getattr(sys.__stdout__, 'encoding', None) or 'utf-8' def _indent(s, indent=4): """ - Add the given number of space characters to the beginning every - non-blank line in `s`, and return the result. + Add the given number of space characters to the beginning of + every non-blank line in `s`, and return the result. + If the string `s` is Unicode, it is encoded using the stdout + encoding and the `backslashreplace` error handler. """ + if isinstance(s, unicode): + s = s.encode(_encoding, 'backslashreplace') # This regexp matches the start of non-blank lines: return re.sub('(?m)^(?!$)', indent*' ', s) @@ -253,6 +264,9 @@ StringIO.truncate(self, size) if hasattr(self, "softspace"): del self.softspace + if not self.buf: + # Reset it to an empty string, to make sure it's not unicode. + self.buf = '' # Worst-case linear-time ellipsis matching. def _ellipsis_match(want, got): @@ -322,6 +336,8 @@ self.__out = out self.__debugger_used = False pdb.Pdb.__init__(self, stdout=out) + # still use input() to get user input + self.use_rawinput = 1 def set_trace(self, frame=None): self.__debugger_used = True @@ -817,7 +833,15 @@ # given object's docstring. try: file = inspect.getsourcefile(obj) or inspect.getfile(obj) - source_lines = linecache.getlines(file) + if module is not None: + # Supply the module globals in case the module was + # originally loaded via a PEP 302 loader and + # file is not a valid filesystem path + source_lines = linecache.getlines(file, module.__dict__) + else: + # No access to a loader, so assume it's a normal + # filesystem path + source_lines = linecache.getlines(file) if not source_lines: source_lines = None except TypeError: @@ -833,6 +857,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' # provide a default module name # Recursively expore `obj`, extracting DocTests. tests = [] @@ -851,18 +877,12 @@ """ if module is None: return True + elif inspect.getmodule(object) is not None: + return module is inspect.getmodule(object) elif inspect.isfunction(object): return module.__dict__ is object.func_globals elif inspect.isclass(object): - # XXX: Jython transition 2.5 - # Java classes appear as Python classes to inspect, but they - # have no __module__ http://jython.org/bugs/1758279 - # org.python.modules uses Java classes to masq - if not hasattr(object, '__module__'): - return False return module.__name__ == object.__module__ - elif inspect.getmodule(object) is not None: - return module is inspect.getmodule(object) elif hasattr(object, '__module__'): return module.__name__ == object.__module__ elif isinstance(object, property): @@ -967,8 +987,6 @@ filename = getattr(module, '__file__', module.__name__) if filename[-4:] in (".pyc", ".pyo"): filename = filename[:-1] - elif filename.endswith('$py.class'): - filename = '%s.py' % filename[:-9] return self._parser.get_doctest(docstring, globs, name, filename, lineno) @@ -1036,10 +1054,10 @@ >>> tests.sort(key = lambda test: test.name) >>> for test in tests: ... print test.name, '->', runner.run(test) - _TestClass -> (0, 2) - _TestClass.__init__ -> (0, 2) - _TestClass.get -> (0, 2) - _TestClass.square -> (0, 1) + _TestClass -> TestResults(failed=0, attempted=2) + _TestClass.__init__ -> TestResults(failed=0, attempted=2) + _TestClass.get -> TestResults(failed=0, attempted=2) + _TestClass.square -> TestResults(failed=0, attempted=1) The `summarize` method prints a summary of all the test cases that have been run by the runner, and returns an aggregated `(f, t)` @@ -1054,7 +1072,7 @@ 7 tests in 4 items. 7 passed and 0 failed. Test passed. - (0, 7) + TestResults(failed=0, attempted=7) The aggregated number of tried examples and failed examples is also available via the `tries` and `failures` attributes: @@ -1270,9 +1288,9 @@ # Another chance if they didn't care about the detail. elif self.optionflags & IGNORE_EXCEPTION_DETAIL: - m1 = re.match(r'[^:]*:', example.exc_msg) - m2 = re.match(r'[^:]*:', exc_msg) - if m1 and m2 and check(m1.group(0), m2.group(0), + m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg) + m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg) + if m1 and m2 and check(m1.group(1), m2.group(1), self.optionflags): outcome = SUCCESS @@ -1297,7 +1315,7 @@ # Record and return the number of failures and tries. self.__record_outcome(test, failures, tries) - return failures, tries + return TestResults(failures, tries) def __record_outcome(self, test, f, t): """ @@ -1310,13 +1328,16 @@ self.tries += t __LINECACHE_FILENAME_RE = re.compile(r'[\w\.]+)' + r'(?P.+)' r'\[(?P\d+)\]>$') def __patched_linecache_getlines(self, filename, module_globals=None): m = self.__LINECACHE_FILENAME_RE.match(filename) if m and m.group('name') == self.test.name: example = self.test.examples[int(m.group('examplenum'))] - return example.source.splitlines(True) + source = example.source + if isinstance(source, unicode): + source = source.encode('ascii', 'backslashreplace') + return source.splitlines(True) else: return self.save_linecache_getlines(filename, module_globals) @@ -1365,12 +1386,17 @@ self.save_linecache_getlines = linecache.getlines linecache.getlines = self.__patched_linecache_getlines + # Make sure sys.displayhook just prints the value to stdout + save_displayhook = sys.displayhook + sys.displayhook = sys.__displayhook__ + try: return self.__run(test, compileflags, out) finally: sys.stdout = save_stdout pdb.set_trace = save_set_trace linecache.getlines = self.save_linecache_getlines + sys.displayhook = save_displayhook if clear_globs: test.globs.clear() @@ -1429,7 +1455,7 @@ print "***Test Failed***", totalf, "failures." elif verbose: print "Test passed." - return totalf, totalt + return TestResults(totalf, totalt) #///////////////////////////////////////////////////////////////// # Backward compatibility cruft to maintain doctest.master. @@ -1438,8 +1464,10 @@ d = self._name2ft for name, (f, t) in other._name2ft.items(): if name in d: - print "*** DocTestRunner.merge: '" + name + "' in both" \ - " testers; summing outcomes." + # Don't print here by default, since doing + # so breaks some of the buildbots + #print "*** DocTestRunner.merge: '" + name + "' in both" \ + # " testers; summing outcomes." f2, t2 = d[name] f = f + f2 t = t + t2 @@ -1675,8 +1703,7 @@ If a failure or error occurs, the globals are left intact: - >>> if '__builtins__' in test.globs: - ... del test.globs['__builtins__'] + >>> del test.globs['__builtins__'] >>> test.globs {'x': 1} @@ -1690,8 +1717,7 @@ ... UnexpectedException: - >>> if '__builtins__' in test.globs: - ... del test.globs['__builtins__'] + >>> del test.globs['__builtins__'] >>> test.globs {'x': 2} @@ -1702,7 +1728,7 @@ ... ''', {}, 'foo', 'foo.py', 0) >>> runner.run(test) - (0, 1) + TestResults(failed=0, attempted=1) >>> test.globs {} @@ -1748,7 +1774,7 @@ Return (#failures, #tests). - See doctest.__doc__ for an overview. + See help(doctest) for an overview. Optional keyword arg "name" gives the name of the module; by default use m.__name__. @@ -1832,7 +1858,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def testfile(filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, @@ -1934,6 +1960,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' if raise_on_error: runner = DebugRunner(verbose=verbose, optionflags=optionflags) @@ -1955,7 +1983,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def run_docstring_examples(f, globs, verbose=False, name="NoName", compileflags=None, optionflags=0): @@ -2014,7 +2042,7 @@ (f,t) = self.testrunner.run(test) if self.verbose: print f, "of", t, "examples failed in string", name - return (f,t) + return TestResults(f,t) def rundoc(self, object, name=None, module=None): f = t = 0 @@ -2023,19 +2051,19 @@ for test in tests: (f2, t2) = self.testrunner.run(test) (f,t) = (f+f2, t+t2) - return (f,t) + return TestResults(f,t) def rundict(self, d, name, module=None): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__dict__.update(d) if module is None: module = False return self.rundoc(m, name, module) def run__test__(self, d, name): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__test__ = d return self.rundoc(m, name) @@ -2218,7 +2246,7 @@ self.setUp() runner = DebugRunner(optionflags=self._dt_optionflags, checker=self._dt_checker, verbose=False) - runner.run(self._dt_test) + runner.run(self._dt_test, clear_globs=False) self.tearDown() def id(self): @@ -2233,6 +2261,19 @@ def shortDescription(self): return "Doctest: " + self._dt_test.name +class SkipDocTestCase(DocTestCase): + def __init__(self): + DocTestCase.__init__(self, None) + + def setUp(self): + self.skipTest("DocTestSuite will not work with -O2 and above") + + def test_skip(self): + pass + + def shortDescription(self): + return "Skipping tests from %s" % module.__name__ + def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, **options): """ @@ -2275,15 +2316,20 @@ module = _normalize_module(module) tests = test_finder.find(module, globs=globs, extraglobs=extraglobs) - if globs is None: - globs = module.__dict__ - if not tests: + + if not tests and sys.flags.optimize >=2: + # Skip doctests when running with -O2 + suite = unittest.TestSuite() + suite.addTest(SkipDocTestCase()) + return suite + elif not tests: # Why do we want to do this? Because it reveals a bug that might # otherwise be hidden. raise ValueError(module, "has no tests") tests.sort() suite = unittest.TestSuite() + for test in tests: if len(test.examples) == 0: continue @@ -2291,8 +2337,6 @@ filename = module.__file__ if filename[-4:] in (".pyc", ".pyo"): filename = filename[:-1] - elif filename.endswith('$py.class'): - filename = '%s.py' % filename[:-9] test.filename = filename suite.addTest(DocTestCase(test, **options)) @@ -2657,9 +2701,31 @@ """, } + def _test(): - r = unittest.TextTestRunner() - r.run(DocTestSuite()) + testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-'] + if not testfiles: + name = os.path.basename(sys.argv[0]) + if '__loader__' in globals(): # python -m + name, _ = os.path.splitext(name) + print("usage: {0} [-v] file ...".format(name)) + return 2 + for filename in testfiles: + if filename.endswith(".py"): + # It is a module -- insert its dir into sys.path and try to + # import it. If it is part of a package, that possibly + # won't work because of package imports. + dirname, filename = os.path.split(filename) + sys.path.insert(0, dirname) + m = __import__(filename[:-3]) + del sys.path[0] + failures, _ = testmod(m) + else: + failures, _ = testfile(filename, module_relative=False) + if failures: + return 1 + return 0 + if __name__ == "__main__": - _test() + sys.exit(_test()) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_new_ASM_jars_to_intellij?= =?utf8?q?_support?= Message-ID: http://hg.python.org/jython/rev/1bde50fae0be changeset: 6341:1bde50fae0be user: Jim Baker date: Tue Mar 13 13:27:04 2012 -0700 summary: Add new ASM jars to intellij support files: .idea/libraries/extlibs.xml | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/.idea/libraries/extlibs.xml b/.idea/libraries/extlibs.xml --- a/.idea/libraries/extlibs.xml +++ b/.idea/libraries/extlibs.xml @@ -38,6 +38,9 @@ + + + -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:31 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Reapplied_Jython-specific_ch?= =?utf8?q?anges_to_doctest=2Epy?= Message-ID: http://hg.python.org/jython/rev/aaf9d8a9b1e5 changeset: 6343:aaf9d8a9b1e5 user: Alex Gr?nholm date: Tue Mar 13 13:20:33 2012 -0700 summary: Reapplied Jython-specific changes to doctest.py files: Lib/doctest.py | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -882,6 +882,12 @@ elif inspect.isfunction(object): return module.__dict__ is object.func_globals elif inspect.isclass(object): + # XXX: Jython transition 2.5 + # Java classes appear as Python classes to inspect, but they + # have no __module__ http://jython.org/bugs/1758279 + # org.python.modules uses Java classes to masq + if not hasattr(object, '__module__'): + return False return module.__name__ == object.__module__ elif hasattr(object, '__module__'): return module.__name__ == object.__module__ @@ -987,6 +993,8 @@ filename = getattr(module, '__file__', module.__name__) if filename[-4:] in (".pyc", ".pyo"): filename = filename[:-1] + elif filename.endswith('$py.class'): + filename = '%s.py' % filename[:-9] return self._parser.get_doctest(docstring, globs, name, filename, lineno) @@ -1703,7 +1711,8 @@ If a failure or error occurs, the globals are left intact: - >>> del test.globs['__builtins__'] + >>> if '__builtins__' in test.globs: + ... del test.globs['__builtins__'] >>> test.globs {'x': 1} @@ -1717,7 +1726,8 @@ ... UnexpectedException: - >>> del test.globs['__builtins__'] + >>> if '__builtins__' in test.globs: + ... del test.globs['__builtins__'] >>> test.globs {'x': 2} @@ -2337,6 +2347,8 @@ filename = module.__file__ if filename[-4:] in (".pyc", ".pyo"): filename = filename[:-1] + elif filename.endswith('$py.class'): + filename = '%s.py' % filename[:-9] test.filename = filename suite.addTest(DocTestCase(test, **options)) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Mark_the_synthetic_return_no?= =?utf8?q?de_used_by_lambda=2E_This_allows_this_node?= Message-ID: http://hg.python.org/jython/rev/a7d12eca6887 changeset: 6344:a7d12eca6887 parent: 6341:1bde50fae0be user: Jim Baker date: Tue Mar 13 15:08:50 2012 -0700 summary: Mark the synthetic return node used by lambda. This allows this node to be ignored in the case of an expression returning within a generator introduced by a yield. Normal usage of return within a lambda is still caught by the parser. files: src/org/python/compiler/CodeCompiler.java | 15 ++++++++-- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/org/python/compiler/CodeCompiler.java b/src/org/python/compiler/CodeCompiler.java --- a/src/org/python/compiler/CodeCompiler.java +++ b/src/org/python/compiler/CodeCompiler.java @@ -846,7 +846,7 @@ } int tmp = 0; if (node.getInternalValue() != null) { - if (my_scope.generator) { + if (my_scope.generator && !(node instanceof LambdaSyntheticReturn)) { throw new ParseException("'return' with argument " + "inside generator", node); } @@ -2255,13 +2255,22 @@ return null; } + + // a marker class to distinguish this usage; future generator rewriting may likely + // want to remove this support + private class LambdaSyntheticReturn extends Return { + private LambdaSyntheticReturn(PythonTree tree, expr value) { + super(tree, value); + } + } + @Override public Object visitLambda(Lambda node) throws Exception { String name = ""; - //Add a return node onto the outside of suite; + //Add a synthetic return node onto the outside of suite; java.util.List bod = new ArrayList(); - bod.add(new Return(node, node.getInternalBody())); + bod.add(new LambdaSyntheticReturn(node, node.getInternalBody())); mod retSuite = new Suite(node, bod); setline(node); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_sys=2Eflags=2Eoptimize_?= =?utf8?q?=28always_=3D0_for_CPython_compatibility=29?= Message-ID: http://hg.python.org/jython/rev/9e9f72d78bd6 changeset: 6346:9e9f72d78bd6 user: Jim Baker date: Tue Mar 13 15:23:09 2012 -0700 summary: Add sys.flags.optimize (always =0 for CPython compatibility) files: src/org/python/core/Options.java | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/Options.java b/src/org/python/core/Options.java --- a/src/org/python/core/Options.java +++ b/src/org/python/core/Options.java @@ -85,6 +85,10 @@ //XXX: place holder public static int bytes_warning = 0; + // Corresponds to -O (Python bytecode optimization), -OO (remove docstrings) + // flags in CPython; it's not clear how Jython should expose its optimization, + // but this is user visible as of 2.7. + public static int optimize = 0; /** * Enable division warning. The value maps to the registry values of -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge_trunk?= Message-ID: http://hg.python.org/jython/rev/147686717ab0 changeset: 6345:147686717ab0 parent: 6344:a7d12eca6887 parent: 6343:aaf9d8a9b1e5 user: Jim Baker date: Tue Mar 13 15:09:16 2012 -0700 summary: Merge trunk files: Lib/doctest.py | 152 +++++++++++++++++++++++++++--------- 1 files changed, 115 insertions(+), 37 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -99,6 +99,9 @@ import unittest, difflib, pdb, tempfile import warnings from StringIO import StringIO +from collections import namedtuple + +TestResults = namedtuple('TestResults', 'failed attempted') # There are 4 basic classes: # - Example: a pair, plus an intra-docstring line number. @@ -213,13 +216,21 @@ # get_data() opens files as 'rb', so one must do the equivalent # conversion as universal newlines would do. return file_contents.replace(os.linesep, '\n'), filename - return open(filename).read(), filename + with open(filename) as f: + return f.read(), filename + +# Use sys.stdout encoding for ouput. +_encoding = getattr(sys.__stdout__, 'encoding', None) or 'utf-8' def _indent(s, indent=4): """ - Add the given number of space characters to the beginning every - non-blank line in `s`, and return the result. + Add the given number of space characters to the beginning of + every non-blank line in `s`, and return the result. + If the string `s` is Unicode, it is encoded using the stdout + encoding and the `backslashreplace` error handler. """ + if isinstance(s, unicode): + s = s.encode(_encoding, 'backslashreplace') # This regexp matches the start of non-blank lines: return re.sub('(?m)^(?!$)', indent*' ', s) @@ -253,6 +264,9 @@ StringIO.truncate(self, size) if hasattr(self, "softspace"): del self.softspace + if not self.buf: + # Reset it to an empty string, to make sure it's not unicode. + self.buf = '' # Worst-case linear-time ellipsis matching. def _ellipsis_match(want, got): @@ -322,6 +336,8 @@ self.__out = out self.__debugger_used = False pdb.Pdb.__init__(self, stdout=out) + # still use input() to get user input + self.use_rawinput = 1 def set_trace(self, frame=None): self.__debugger_used = True @@ -817,7 +833,15 @@ # given object's docstring. try: file = inspect.getsourcefile(obj) or inspect.getfile(obj) - source_lines = linecache.getlines(file) + if module is not None: + # Supply the module globals in case the module was + # originally loaded via a PEP 302 loader and + # file is not a valid filesystem path + source_lines = linecache.getlines(file, module.__dict__) + else: + # No access to a loader, so assume it's a normal + # filesystem path + source_lines = linecache.getlines(file) if not source_lines: source_lines = None except TypeError: @@ -833,6 +857,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' # provide a default module name # Recursively expore `obj`, extracting DocTests. tests = [] @@ -851,6 +877,8 @@ """ if module is None: return True + elif inspect.getmodule(object) is not None: + return module is inspect.getmodule(object) elif inspect.isfunction(object): return module.__dict__ is object.func_globals elif inspect.isclass(object): @@ -861,8 +889,6 @@ if not hasattr(object, '__module__'): return False return module.__name__ == object.__module__ - elif inspect.getmodule(object) is not None: - return module is inspect.getmodule(object) elif hasattr(object, '__module__'): return module.__name__ == object.__module__ elif isinstance(object, property): @@ -1036,10 +1062,10 @@ >>> tests.sort(key = lambda test: test.name) >>> for test in tests: ... print test.name, '->', runner.run(test) - _TestClass -> (0, 2) - _TestClass.__init__ -> (0, 2) - _TestClass.get -> (0, 2) - _TestClass.square -> (0, 1) + _TestClass -> TestResults(failed=0, attempted=2) + _TestClass.__init__ -> TestResults(failed=0, attempted=2) + _TestClass.get -> TestResults(failed=0, attempted=2) + _TestClass.square -> TestResults(failed=0, attempted=1) The `summarize` method prints a summary of all the test cases that have been run by the runner, and returns an aggregated `(f, t)` @@ -1054,7 +1080,7 @@ 7 tests in 4 items. 7 passed and 0 failed. Test passed. - (0, 7) + TestResults(failed=0, attempted=7) The aggregated number of tried examples and failed examples is also available via the `tries` and `failures` attributes: @@ -1270,9 +1296,9 @@ # Another chance if they didn't care about the detail. elif self.optionflags & IGNORE_EXCEPTION_DETAIL: - m1 = re.match(r'[^:]*:', example.exc_msg) - m2 = re.match(r'[^:]*:', exc_msg) - if m1 and m2 and check(m1.group(0), m2.group(0), + m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg) + m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg) + if m1 and m2 and check(m1.group(1), m2.group(1), self.optionflags): outcome = SUCCESS @@ -1297,7 +1323,7 @@ # Record and return the number of failures and tries. self.__record_outcome(test, failures, tries) - return failures, tries + return TestResults(failures, tries) def __record_outcome(self, test, f, t): """ @@ -1310,13 +1336,16 @@ self.tries += t __LINECACHE_FILENAME_RE = re.compile(r'[\w\.]+)' + r'(?P.+)' r'\[(?P\d+)\]>$') def __patched_linecache_getlines(self, filename, module_globals=None): m = self.__LINECACHE_FILENAME_RE.match(filename) if m and m.group('name') == self.test.name: example = self.test.examples[int(m.group('examplenum'))] - return example.source.splitlines(True) + source = example.source + if isinstance(source, unicode): + source = source.encode('ascii', 'backslashreplace') + return source.splitlines(True) else: return self.save_linecache_getlines(filename, module_globals) @@ -1365,12 +1394,17 @@ self.save_linecache_getlines = linecache.getlines linecache.getlines = self.__patched_linecache_getlines + # Make sure sys.displayhook just prints the value to stdout + save_displayhook = sys.displayhook + sys.displayhook = sys.__displayhook__ + try: return self.__run(test, compileflags, out) finally: sys.stdout = save_stdout pdb.set_trace = save_set_trace linecache.getlines = self.save_linecache_getlines + sys.displayhook = save_displayhook if clear_globs: test.globs.clear() @@ -1429,7 +1463,7 @@ print "***Test Failed***", totalf, "failures." elif verbose: print "Test passed." - return totalf, totalt + return TestResults(totalf, totalt) #///////////////////////////////////////////////////////////////// # Backward compatibility cruft to maintain doctest.master. @@ -1438,8 +1472,10 @@ d = self._name2ft for name, (f, t) in other._name2ft.items(): if name in d: - print "*** DocTestRunner.merge: '" + name + "' in both" \ - " testers; summing outcomes." + # Don't print here by default, since doing + # so breaks some of the buildbots + #print "*** DocTestRunner.merge: '" + name + "' in both" \ + # " testers; summing outcomes." f2, t2 = d[name] f = f + f2 t = t + t2 @@ -1702,7 +1738,7 @@ ... ''', {}, 'foo', 'foo.py', 0) >>> runner.run(test) - (0, 1) + TestResults(failed=0, attempted=1) >>> test.globs {} @@ -1748,7 +1784,7 @@ Return (#failures, #tests). - See doctest.__doc__ for an overview. + See help(doctest) for an overview. Optional keyword arg "name" gives the name of the module; by default use m.__name__. @@ -1832,7 +1868,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def testfile(filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, @@ -1934,6 +1970,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' if raise_on_error: runner = DebugRunner(verbose=verbose, optionflags=optionflags) @@ -1955,7 +1993,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def run_docstring_examples(f, globs, verbose=False, name="NoName", compileflags=None, optionflags=0): @@ -2014,7 +2052,7 @@ (f,t) = self.testrunner.run(test) if self.verbose: print f, "of", t, "examples failed in string", name - return (f,t) + return TestResults(f,t) def rundoc(self, object, name=None, module=None): f = t = 0 @@ -2023,19 +2061,19 @@ for test in tests: (f2, t2) = self.testrunner.run(test) (f,t) = (f+f2, t+t2) - return (f,t) + return TestResults(f,t) def rundict(self, d, name, module=None): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__dict__.update(d) if module is None: module = False return self.rundoc(m, name, module) def run__test__(self, d, name): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__test__ = d return self.rundoc(m, name) @@ -2218,7 +2256,7 @@ self.setUp() runner = DebugRunner(optionflags=self._dt_optionflags, checker=self._dt_checker, verbose=False) - runner.run(self._dt_test) + runner.run(self._dt_test, clear_globs=False) self.tearDown() def id(self): @@ -2233,6 +2271,19 @@ def shortDescription(self): return "Doctest: " + self._dt_test.name +class SkipDocTestCase(DocTestCase): + def __init__(self): + DocTestCase.__init__(self, None) + + def setUp(self): + self.skipTest("DocTestSuite will not work with -O2 and above") + + def test_skip(self): + pass + + def shortDescription(self): + return "Skipping tests from %s" % module.__name__ + def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, **options): """ @@ -2275,15 +2326,20 @@ module = _normalize_module(module) tests = test_finder.find(module, globs=globs, extraglobs=extraglobs) - if globs is None: - globs = module.__dict__ - if not tests: + + if not tests and sys.flags.optimize >=2: + # Skip doctests when running with -O2 + suite = unittest.TestSuite() + suite.addTest(SkipDocTestCase()) + return suite + elif not tests: # Why do we want to do this? Because it reveals a bug that might # otherwise be hidden. raise ValueError(module, "has no tests") tests.sort() suite = unittest.TestSuite() + for test in tests: if len(test.examples) == 0: continue @@ -2657,9 +2713,31 @@ """, } + def _test(): - r = unittest.TextTestRunner() - r.run(DocTestSuite()) + testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-'] + if not testfiles: + name = os.path.basename(sys.argv[0]) + if '__loader__' in globals(): # python -m + name, _ = os.path.splitext(name) + print("usage: {0} [-v] file ...".format(name)) + return 2 + for filename in testfiles: + if filename.endswith(".py"): + # It is a module -- insert its dir into sys.path and try to + # import it. If it is part of a package, that possibly + # won't work because of package imports. + dirname, filename = os.path.split(filename) + sys.path.insert(0, dirname) + m = __import__(filename[:-3]) + del sys.path[0] + failures, _ = testmod(m) + else: + failures, _ = testfile(filename, module_relative=False) + if failures: + return 1 + return 0 + if __name__ == "__main__": - _test() + sys.exit(_test()) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Remove_debugging_print_state?= =?utf8?q?ments?= Message-ID: http://hg.python.org/jython/rev/e91fc9096c9e changeset: 6347:e91fc9096c9e parent: 6343:aaf9d8a9b1e5 user: Shashank Bharadwaj date: Tue Mar 13 16:03:34 2012 -0700 summary: Remove debugging print statements files: src/org/python/expose/generate/DescriptorVisitor.java | 1 - src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 1 - 2 files changed, 0 insertions(+), 2 deletions(-) diff --git a/src/org/python/expose/generate/DescriptorVisitor.java b/src/org/python/expose/generate/DescriptorVisitor.java --- a/src/org/python/expose/generate/DescriptorVisitor.java +++ b/src/org/python/expose/generate/DescriptorVisitor.java @@ -12,7 +12,6 @@ @Override public void visit(String name, Object value) { - System.err.println("DescriptorVisitor::visit:: " + name + " value: " + value); if (name.equals("name")) { val = (String)value; } else if (name.equals("doc")) { diff --git a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java --- a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java +++ b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java @@ -11,7 +11,6 @@ public RestrictiveAnnotationVisitor() { super(Opcodes.ASM4); - System.err.println("RestrictiveAnnotationVisitor:: constructed "); } public AnnotationVisitor visitAnnotation(String name, String desc) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_an_indy_switch_to_the_bu?= =?utf8?q?ild_process=2E_Jython_is_build_using_invokedyanmic?= Message-ID: http://hg.python.org/jython/rev/e3e82ea6bc53 changeset: 6348:e3e82ea6bc53 user: Shashank Bharadwaj date: Tue Mar 13 16:06:09 2012 -0700 summary: Add an indy switch to the build process. Jython is build using invokedyanmic support only if it's built on JDK 1.7. Anything else would cause it to build a non-indy version The user can override this by passing "jython.use.invokedyanmic=true" to ant like so: "ant -Djython.use.invokedynamic=true" but the build will fail for all JDK's less than 1.7 Added a dummy indy compiler which does nothing just to test the build process. files: build.xml | 17 +++++- src/org/python/compiler/InvokedynamicCodeCompiler.java | 24 ++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -130,7 +130,14 @@ - + + + + + + + + @@ -145,8 +152,8 @@ - - + + @@ -295,6 +302,7 @@ templates.lazy = '${templates.lazy}' python.lib = '${python.lib}' build.compiler = '${build.compiler}' + jython.use.invokedynamic = '${jython.use.invokedynamic}' jdk.target.version = '${jdk.target.version}' jdk.source.version = '${jdk.source.version}' deprecation = '${deprecation}' @@ -528,7 +536,8 @@ - + + diff --git a/src/org/python/compiler/InvokedynamicCodeCompiler.java b/src/org/python/compiler/InvokedynamicCodeCompiler.java new file mode 100644 --- /dev/null +++ b/src/org/python/compiler/InvokedynamicCodeCompiler.java @@ -0,0 +1,24 @@ +package org.python.compiler; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.invoke.MutableCallSite; + +/** + * + * @author shashank + */ +public class InvokedynamicCodeCompiler extends CodeCompiler { + + public InvokedynamicCodeCompiler(Module module, boolean print_results) { + super(module, print_results); + } + + // just use indy functions to make sure the build process is proper. + public void foo(){ + Class mhClazz = MethodHandles.class; + MethodType target = null; + new MutableCallSite(target); + } + +} -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge?= Message-ID: http://hg.python.org/jython/rev/2584e1ab76c0 changeset: 6349:2584e1ab76c0 parent: 6348:e3e82ea6bc53 parent: 6346:9e9f72d78bd6 user: Shashank Bharadwaj date: Tue Mar 13 16:08:11 2012 -0700 summary: merge files: src/org/python/compiler/CodeCompiler.java | 15 ++++++++-- src/org/python/core/Options.java | 4 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/org/python/compiler/CodeCompiler.java b/src/org/python/compiler/CodeCompiler.java --- a/src/org/python/compiler/CodeCompiler.java +++ b/src/org/python/compiler/CodeCompiler.java @@ -846,7 +846,7 @@ } int tmp = 0; if (node.getInternalValue() != null) { - if (my_scope.generator) { + if (my_scope.generator && !(node instanceof LambdaSyntheticReturn)) { throw new ParseException("'return' with argument " + "inside generator", node); } @@ -2255,13 +2255,22 @@ return null; } + + // a marker class to distinguish this usage; future generator rewriting may likely + // want to remove this support + private class LambdaSyntheticReturn extends Return { + private LambdaSyntheticReturn(PythonTree tree, expr value) { + super(tree, value); + } + } + @Override public Object visitLambda(Lambda node) throws Exception { String name = ""; - //Add a return node onto the outside of suite; + //Add a synthetic return node onto the outside of suite; java.util.List bod = new ArrayList(); - bod.add(new Return(node, node.getInternalBody())); + bod.add(new LambdaSyntheticReturn(node, node.getInternalBody())); mod retSuite = new Suite(node, bod); setline(node); diff --git a/src/org/python/core/Options.java b/src/org/python/core/Options.java --- a/src/org/python/core/Options.java +++ b/src/org/python/core/Options.java @@ -85,6 +85,10 @@ //XXX: place holder public static int bytes_warning = 0; + // Corresponds to -O (Python bytecode optimization), -OO (remove docstrings) + // flags in CPython; it's not clear how Jython should expose its optimization, + // but this is user visible as of 2.7. + public static int optimize = 0; /** * Enable division warning. The value maps to the registry values of -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Added_two_utility_scripts_fo?= =?utf8?q?r_migrating_the_Jython_specific_changes_in_the?= Message-ID: http://hg.python.org/jython/rev/84b241e45cec changeset: 6350:84b241e45cec user: Alex Gr?nholm date: Tue Mar 13 17:06:14 2012 -0700 summary: Added two utility scripts for migrating the Jython specific changes in the standard library to a newer CPython version files: Misc/applypatches.py | 44 +++++++++++++++ Misc/genpatches.py | 92 ++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 0 deletions(-) diff --git a/Misc/applypatches.py b/Misc/applypatches.py new file mode 100755 --- /dev/null +++ b/Misc/applypatches.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +""" +This script copies the relevant files from CPythonLib and applies the patches previously +made with genpatches.py. You will probably need to tweak some patches by hand, or delete +them entirely and do the migration for those modules manually. +""" + +import os.path +import sys +import shutil + + +if not os.path.exists('patches'): + print >>sys.stderr, 'Run genpatches.py first.' + sys.exit(1) + +succeeded = [] +failed = [] +for dirpath, dirnames, filenames in os.walk('patches'): + for filename in filenames: + realfilename = filename[:-6] + patchpath = os.path.join(dirpath, filename) + srcpath = os.path.join('CPythonLib', dirpath[8:], realfilename) + dstpath = srcpath.replace('CPythonLib', 'Lib') + print '\nCopying %s -> %s' % (srcpath, dstpath) + shutil.copyfile(srcpath, dstpath) + + retcode = os.system('patch -p1 -N <%s' % patchpath) + if retcode != 0: + failed.append(dstpath) + else: + succeeded.append(dstpath) + +if succeeded: + print '\nTh following files were successfully patched:' + for path in succeeded: + for path in succeeded: + print path + +if failed: + print '\nPatching failed for the following files:' + for path in failed: + print path + print '\nYou will need to migrate these modules manually.' diff --git a/Misc/genpatches.py b/Misc/genpatches.py new file mode 100755 --- /dev/null +++ b/Misc/genpatches.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +""" +This script generates patches containing the Jython-specific deviations from the stdlib +modules. It looks for the string "svn.python.org" in the changeset summary and generates +a patch for all the changes made after that in each module. + +The script expects to be run in the jython root directory and there should be a "cpython" +directory in the parent directory. That directory should be a clone of the CPython release +against which the modules in Lib/ have currently been patched. +Only modules that are common to Lib/, CPythonLib/ and ../cpython/Lib will be included in +the patches. +""" +from StringIO import StringIO +import os.path +import subprocess +import sys +import shutil + + +def get_modules(path): + modules = set() + for dirpath, dirnames, filenames in os.walk(path): + for filename in filenames: + if filename.endswith('.py'): + cutoff = len(path) + 1 + fullpath = os.path.join(dirpath[cutoff:], filename) + modules.add(fullpath) + return modules + +if not os.path.exists('CPythonLib'): + print >>sys.stderr, 'You need to run this script from the Jython root directory.' + sys.exit(1) + +if not os.path.exists('../cpython'): + print >>sys.stderr, 'You need to have the CPython clone in ../cpython.' + sys.exit(1) + +jymodules = get_modules(u'Lib') +cpymodules = get_modules(u'CPythonLib') +cpy25modules = get_modules(u'../cpython/Lib') +common_modules = jymodules.intersection(cpy25modules).intersection(cpymodules) + +# Run mercurial to get the changesets where each file was last synced with CPython stdlib +print 'Parsing mercurial logs for the last synchronized changesets' +changesets = {} +for mod in common_modules: + path = 'Lib/' + mod + pipe = subprocess.Popen(['hg', 'log', '-v', path], stdout=subprocess.PIPE) + stdoutdata, stderrdata = pipe.communicate() + if pipe.returncode != 0: + print >>sys.stderr, stderrdata + sys.exit(1) + + buf = StringIO(stdoutdata) + changeset = None + found = False + iterator = iter(list(buf)) + for line in iterator: + if line.startswith('changeset:'): + changeset = line.split(':')[1].strip() + if line.startswith('description:'): + for descline in iterator: + if descline == '\n': + break + if 'svn.python.org' in descline: + found = True + break + if found: + break + + if not found: + print >>sys.stderr,'No sync changeset found for %s' % path + else: + changesets[path] = changeset + +if os.path.exists('patches'): + shutil.rmtree('patches') +os.mkdir('patches') + +print 'Generating patches' +for path, changeset in changesets.iteritems(): + patchname = 'patches/%s.patch' % path[4:] + patch_dir = os.path.dirname(patchname) + if not os.path.exists(patch_dir): + os.makedirs(patch_dir) + + retcode = os.system('hg diff -r {} {} > {}'.format(changeset, path, patchname)) + if retcode != 0: + print >>sys.stderr, "Error creating patch for %s" % path + sys.exit(3) + +print 'All done. You can now run applypatches.py to update and patch the modules.' -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fixed_a_typo?= Message-ID: http://hg.python.org/jython/rev/5beb02df573a changeset: 6351:5beb02df573a user: Alex Gr?nholm date: Tue Mar 13 17:35:08 2012 -0700 summary: Fixed a typo files: Misc/applypatches.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/applypatches.py b/Misc/applypatches.py --- a/Misc/applypatches.py +++ b/Misc/applypatches.py @@ -32,7 +32,7 @@ succeeded.append(dstpath) if succeeded: - print '\nTh following files were successfully patched:' + print '\nThe following files were successfully patched:' for path in succeeded: for path in succeeded: print path -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Flush_stdout_in_applypatches?= =?utf8?q?=2Epy_so_the_output_makes_a_little_more_sense?= Message-ID: http://hg.python.org/jython/rev/0216ef75e9a7 changeset: 6352:0216ef75e9a7 user: Alex Gr?nholm date: Tue Mar 13 18:11:14 2012 -0700 summary: Flush stdout in applypatches.py so the output makes a little more sense files: Misc/applypatches.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Misc/applypatches.py b/Misc/applypatches.py --- a/Misc/applypatches.py +++ b/Misc/applypatches.py @@ -23,6 +23,7 @@ srcpath = os.path.join('CPythonLib', dirpath[8:], realfilename) dstpath = srcpath.replace('CPythonLib', 'Lib') print '\nCopying %s -> %s' % (srcpath, dstpath) + sys.stdout.flush() shutil.copyfile(srcpath, dstpath) retcode = os.system('patch -p1 -N <%s' % patchpath) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 04:09:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_this_is_2=2E7?= Message-ID: http://hg.python.org/jython/rev/0a6bd576d0b9 changeset: 6353:0a6bd576d0b9 user: Philip Jenvey date: Tue Mar 13 19:36:43 2012 -0700 summary: this is 2.7 files: build.xml | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -123,8 +123,8 @@ - - + + @@ -464,7 +464,7 @@ - ======================= -- Repository URL: http://hg.python.org/jython From fwierzbicki at gmail.com Tue Mar 13 18:52:31 2012 From: fwierzbicki at gmail.com (fwierzbicki at gmail.com) Date: Tue, 13 Mar 2012 10:52:31 -0700 Subject: [Jython-checkins] jython: Added the io and _fileio modules In-Reply-To: References: Message-ID: On Mon, Mar 12, 2012 at 11:37 PM, alex.gronholm wrote: > http://hg.python.org/jython/rev/eda2b3279587 > changeset: ? 6318:eda2b3279587 > user: ? ? ? ?Alex Gr?nholm > date: ? ? ? ?Mon Mar 12 17:49:35 2012 -0700 > summary: > ?Added the io and _fileio modules Congratulations on your first checkin! > > files: > ?CPythonLib.includes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ? 1 + > ?CoreExposed.includes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? 1 + > ?src/org/python/modules/Setup.java ? ? ? ? ? ? ? ? ? ? ? | ? ? 3 +- > ?src/org/python/modules/_fileio/PyFileIO.java ? ? ? ? ? ?| ? 318 ++ > ?src/org/python/modules/_fileio/PyFileIODerived.java ? ? | ?1117 ++++++++++ > ?src/org/python/modules/_fileio/_fileio.java ? ? ? ? ? ? | ? ?24 + > ?src/org/python/modules/_functools/PyPartialDerived.java | ? ?24 + > ?src/templates/PyFileIO.derived ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? 4 + > ?src/templates/mappings ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? 1 + > ?src/templates/partial.derived ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ? 2 +- > ?10 files changed, 1493 insertions(+), 2 deletions(-) > > > diff --git a/CPythonLib.includes b/CPythonLib.includes > --- a/CPythonLib.includes > +++ b/CPythonLib.includes > @@ -77,6 +77,7 @@ > ?ihooks.py > ?imaplib.py > ?imghdr.py > +io.py > ?keyword.py > ?linecache.py > ?locale.py > diff --git a/CoreExposed.includes b/CoreExposed.includes > --- a/CoreExposed.includes > +++ b/CoreExposed.includes > @@ -55,6 +55,7 @@ > ?org/python/modules/_csv/PyDialect.class > ?org/python/modules/_csv/PyReader.class > ?org/python/modules/_csv/PyWriter.class > +org/python/modules/_fileio/PyFileIO.class > ?org/python/modules/_functools/PyPartial.class > ?org/python/modules/_hashlib$Hash.class > ?org/python/modules/jffi/ArrayCData.class > diff --git a/src/org/python/modules/Setup.java b/src/org/python/modules/Setup.java > --- a/src/org/python/modules/Setup.java > +++ b/src/org/python/modules/Setup.java > @@ -60,6 +60,7 @@ > ? ? ? ? "_marshal", > ? ? ? ? "_threading:org.python.modules._threading._threading", > ? ? ? ? PosixModule.getOSName() + ":org.python.modules.posix.PosixModule", > - ? ? ? ?"jffi:org.python.modules.jffi.jffi" > + ? ? ? ?"jffi:org.python.modules.jffi.jffi", > + ? ? ? ?"_fileio:org.python.modules._fileio._fileio" > ? ? }; > ?} > diff --git a/src/org/python/modules/_fileio/PyFileIO.java b/src/org/python/modules/_fileio/PyFileIO.java > new file mode 100644 > --- /dev/null > +++ b/src/org/python/modules/_fileio/PyFileIO.java > @@ -0,0 +1,318 @@ > +/* Copyright (c) Jython Developers */ > +package org.python.modules._fileio; > + > +import java.nio.ByteBuffer; > +import java.util.concurrent.Callable; > + > +import org.python.core.ArgParser; > +import org.python.core.BuiltinDocs; > +import org.python.core.Py; > +import org.python.core.PyArray; > +import org.python.core.PyInteger; > +import org.python.core.PyJavaType; > +import org.python.core.PyObject; > +import org.python.core.PyString; > +import org.python.core.PySystemState; > +import org.python.core.PyType; > +import org.python.core.PyUnicode; > +import org.python.core.io.FileIO; > +import org.python.core.util.StringUtil; > +import org.python.expose.ExposedGet; > +import org.python.expose.ExposedMethod; > +import org.python.expose.ExposedNew; > +import org.python.expose.ExposedType; > + > + at ExposedType(name = "_fileio._FileIO") > +public class PyFileIO extends PyObject { > + > + ? ?public static final PyType TYPE = PyType.fromClass(PyFileIO.class); > + > + ? ?private FileIO file; > + ? ? ? private PyObject name; > + ? ? ? private Boolean seekable; > + > + ? ?@ExposedGet > + ? ? ? public boolean closefd; > + > + ? ?/** The mode string */ > + ? ?@ExposedGet(doc = BuiltinDocs.file_mode_doc) > + ? ?public String mode; > + > + ? ?/** The file's closer object; ensures the file is closed at shutdown */ > + ? ?private Closer closer; > + > + ? ?public PyFileIO() { > + ? ? ? ?super(TYPE); > + ? ?} > + > + ? ?public PyFileIO(PyType subType) { > + ? ? ? ?super(subType); > + ? ?} > + > + ? ?public PyFileIO(String name, String mode, boolean closefd) { > + ? ? ? this(); > + ? ? ? ?_FileIO___init__(Py.newString(name), mode, closefd); > + ? ?} > + > + ? ?public PyFileIO(String name, String mode) { > + ? ? ? this(name, mode, true); > + ? ?} > + > + ? ?@ExposedNew > + ? ?@ExposedMethod(doc = BuiltinDocs.file___init___doc) > + ? ?final void _FileIO___init__(PyObject[] args, String[] kwds) { > + ? ? ? ?ArgParser ap = new ArgParser("file", args, kwds, new String[] {"name", "mode", "closefd"}, 1); > + ? ? ? ?PyObject name = ap.getPyObject(0); > + ? ? ? ?if (!(name instanceof PyString)) { > + ? ? ? ? ? ?throw Py.TypeError("coercing to Unicode: need string, '" + name.getType().fastGetName() > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + "' type found"); > + ? ? ? ?} > + ? ? ? ?String mode = ap.getString(1, "r"); > + ? ? ? ?boolean closefd = Py.py2boolean(ap.getPyObject(2, Py.True)); > + ? ? ? ?// TODO: make this work with file channels so closefd=False can be used > + ? ? ? ?if (!closefd) > + ? ? ? ? ? ? ? throw Py.ValueError("Cannot use closefd=False with file name"); > + > + ? ? ? ?_FileIO___init__((PyString)name, mode, closefd); > + ? ? ? ?closer = new Closer(file, Py.getSystemState()); > + ? ?} > + > + ? ?private void _FileIO___init__(PyString name, String mode, boolean closefd) { > + ? ? ? mode = parseMode(mode); > + ? ? ? ?this.name = name; > + ? ? ? ?this.mode = mode; > + ? ? ? ?this.closefd = closefd; > + ? ? ? ?this.file = new FileIO((PyString) name, mode.replaceAll("b", "")); > + ? ?} > + > + ? ?private String parseMode(String mode) { > + ? ? ? ?if (mode.length() == 0) { > + ? ? ? ? ? ?throw Py.ValueError("empty mode string"); > + ? ? ? ?} > + > + ? ? ? ?String origMode = mode; > + ? ? ? ?if ("rwa".indexOf(mode.charAt(0)) == -1) { > + ? ? ? ? ? ?throw Py.ValueError("mode string must begin with one of 'r', 'w', 'a' or 'U', not '" > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ origMode + "'"); > + ? ? ? ?} > + > + ? ? ? ?boolean reading = mode.contains("r"); > + ? ? ? ?boolean writing = mode.contains("w"); > + ? ? ? ?boolean appending = mode.contains("a"); > + ? ? ? ?boolean updating = mode.contains("+"); > + > + ? ? ? ?return (reading ? "r" : "") + (writing ? "w" : "") + (appending ? "a" : "") > + ? ? ? ? ? ? ? ?+ "b" + (updating ? "+" : ""); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_close_doc) > + ? ?final synchronized void _FileIO_close() { > + ? ? ? ?if (closer != null) { > + ? ? ? ? ? ?closer.close(); > + ? ? ? ? ? ?closer = null; > + ? ? ? ?} else { > + ? ? ? ? ? ?file.close(); > + ? ? ? ?} > + ? ?} > + > + ? ?public void close() { > + ? ? ? ?_FileIO_close(); > + ? ?} > + > + ? ?public boolean readable() { > + ? ? ? ?return _FileIO_readable(); > + ? ?} > + > + ? ?@ExposedMethod(doc = "True if file was opened in a read mode.") > + ? ?final boolean _FileIO_readable() { > + ? ? ? ?return file.readable(); > + ? ?} > + > + ? ?@ExposedMethod(defaults = {"0"}, doc = BuiltinDocs.file_seek_doc) > + ? ?final synchronized PyObject _FileIO_seek(long pos, int how) { > + ? ? ? ?checkClosed(); > + ? ? ? ?return Py.java2py(file.seek(pos, how)); > + ? ?} > + > + ? ?public boolean seekable() { > + ? ? ? ?return _FileIO_seekable(); > + ? ?} > + > + ? ?@ExposedMethod(doc = "True if file supports random-access.") > + ? ?final boolean _FileIO_seekable() { > + ? ? ? if (seekable == null) > + ? ? ? ? ? ? ? seekable = file.seek(0, 0) >= 0; > + ? ? ? return seekable; > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_tell_doc) > + ? ?final synchronized long _FileIO_tell() { > + ? ? ? ?checkClosed(); > + ? ? ? ?return file.tell(); > + ? ?} > + > + ? ?public long tell() { > + ? ? ? ?return _FileIO_tell(); > + ? ?} > + > + ? ?@ExposedMethod(defaults = {"null"}, doc = BuiltinDocs.file_truncate_doc) > + ? ?final PyObject _FileIO_truncate(PyObject position) { > + ? ? ? ?if (position == null) > + ? ? ? ? ? ?return Py.java2py(_FileIO_truncate()); > + ? ? ? return Py.java2py(_FileIO_truncate(position.asLong())); > + ? ?} > + > + ? ?final synchronized long _FileIO_truncate(long position) { > + ? ? ? ?return file.truncate(position); > + ? ?} > + > + ? ?public long truncate(long position) { > + ? ? ? ?return _FileIO_truncate(position); > + ? ?} > + > + ? ?final synchronized long _FileIO_truncate() { > + ? ? ? ?return file.truncate(file.tell()); > + ? ?} > + > + ? ?public void truncate() { > + ? ? ? ?_FileIO_truncate(); > + ? ?} > + > + ? ?public boolean isatty() { > + ? ? ? ?return _FileIO_isatty(); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_isatty_doc) > + ? ?final boolean _FileIO_isatty() { > + ? ? ? ?return file.isatty(); > + ? ?} > + > + ? ?public boolean writable() { > + ? ? ? ?return _FileIO_writable(); > + ? ?} > + > + ? ?@ExposedMethod(doc = "True if file was opened in a write mode.") > + ? ?final boolean _FileIO_writable() { > + ? ? ? ?return file.writable(); > + ? ?} > + > + ? ?public PyObject fileno() { > + ? ? ? ?return _FileIO_fileno(); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_fileno_doc) > + ? ?final PyObject _FileIO_fileno() { > + ? ? ? ?return PyJavaType.wrapJavaObject(file.fileno()); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_read_doc) > + ? ?final synchronized PyString _FileIO_read(int size) { > + ? ? ? ?checkClosed(); > + ? ? ? ?ByteBuffer buf = file.read(size); > + ? ? ? ?return new PyString(StringUtil.fromBytes(buf)); > + ? ?} > + > + ? ?public PyString read(int size) { > + ? ? ? ?return _FileIO_read(size); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_read_doc) > + ? ?final synchronized PyString _FileIO_readall() { > + ? ? ? return _FileIO_read(-1); > + ? ?} > + > + ? ?/** > + ? ? * Return a String for writing to the underlying file from obj. > + ? ? */ > + ? ?private String asWritable(PyObject obj, String message) { > + ? ? ? ?if (obj instanceof PyUnicode) { > + ? ? ? ? ? ?return ((PyUnicode)obj).encode(); > + ? ? ? ?} else if (obj instanceof PyString) { > + ? ? ? ? ? ?return ((PyString) obj).getString(); > + ? ? ? ?} else if (obj instanceof PyArray) { > + ? ? ? ? ? ?return ((PyArray)obj).tostring(); > + ? ? ? ?} > + ? ? ? ?if (message == null) { > + ? ? ? ? ? ?message = String.format("argument 1 must be string or buffer, not %.200s", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?obj.getType().fastGetName()); > + ? ? ? ?} > + ? ? ? ?throw Py.TypeError(message); > + ? ?} > + > + ? ?@ExposedMethod(doc = BuiltinDocs.file_write_doc) > + ? ?final PyObject _FileIO_write(PyObject obj) { > + ? ? ? String writable = asWritable(obj, null); > + ? ? ? byte[] bytes = StringUtil.toBytes(writable); > + ? ? ? ?int written = write(ByteBuffer.wrap(bytes)); > + ? ? ? return new PyInteger(written); > + ? ?} > + > + ? ?final synchronized int write(ByteBuffer buf) { > + ? ? ? ?checkClosed(); > + ? ? ? ?return file.write(buf); > + ? ?} > + > + ? ?@ExposedMethod(names = {"__str__", "__repr__"}, doc = BuiltinDocs.file___str___doc) > + ? ?final String _FileIO_toString() { > + ? ? ? ?if (name instanceof PyUnicode) { > + ? ? ? ? ? ?String escapedName = PyString.encode_UnicodeEscape(name.toString(), false); > + ? ? ? ? ? ?return String.format("<_fileio.FileIO name='%s', mode='%s'>", escapedName, mode); > + ? ? ? ?} > + ? ? ? ?return String.format("<_fileio.FileIO name='%s', mode='%s'>", name, mode); > + ? ?} > + > + ? ?@Override > + ? ?public String toString() { > + ? ? ? ?return _FileIO_toString(); > + ? ?} > + > + ? ?private void checkClosed() { > + ? ? ? ?file.checkClosed(); > + ? ?} > + > + ? ?@ExposedGet(name = "closed", doc = BuiltinDocs.file_closed_doc) > + ? ?public boolean getClosed() { > + ? ? ? ?return file.closed(); > + ? ?} > + > + ? ?/** > + ? ? * XXX update docs - A mechanism to make sure PyFiles are closed on exit. On creation Closer adds itself > + ? ? * to a list of Closers that will be run by PyFileCloser on JVM shutdown. When a > + ? ? * PyFile's close or finalize methods are called, PyFile calls its Closer.close which > + ? ? * clears Closer out of the shutdown queue. > + ? ? * > + ? ? * We use a regular object here rather than WeakReferences and their ilk as they may > + ? ? * be collected before the shutdown hook runs. There's no guarantee that finalize will > + ? ? * be called during shutdown, so we can't use it. It's vital that this Closer has no > + ? ? * reference to the PyFile it's closing so the PyFile remains garbage collectable. > + ? ? */ > + ? ?private static class Closer implements Callable { > + > + ? ? ? ?/** > + ? ? ? ? * The underlying file > + ? ? ? ? */ > + ? ? ? ?private final FileIO file; > + ? ? ? ?private PySystemState sys; > + > + ? ? ? ?public Closer(FileIO file, PySystemState sys) { > + ? ? ? ? ? ?this.file = file; > + ? ? ? ? ? ?this.sys = sys; > + ? ? ? ? ? ?sys.registerCloser(this); > + ? ? ? ?} > + > + ? ? ? ?/** For closing directly */ > + ? ? ? ?public void close() { > + ? ? ? ? ? ?sys.unregisterCloser(this); > + ? ? ? ? ? ?file.close(); > + ? ? ? ? ? ?sys = null; > + ? ? ? ?} > + > + ? ? ? ?/** For closing as part of a shutdown process */ > + ? ? ? ?public Void call() { > + ? ? ? ? ? ?file.close(); > + ? ? ? ? ? ?sys = null; > + ? ? ? ? ? ?return null; > + ? ? ? ?} > + > + ? ?} > +} > diff --git a/src/org/python/modules/_fileio/PyFileIODerived.java b/src/org/python/modules/_fileio/PyFileIODerived.java > new file mode 100644 > --- /dev/null > +++ b/src/org/python/modules/_fileio/PyFileIODerived.java > @@ -0,0 +1,1117 @@ > +/* Generated file, do not modify. ?See jython/src/templates/gderived.py. */ > +package org.python.modules._fileio; > + > +import java.io.Serializable; > +import org.python.core.*; > + > +public class PyFileIODerived extends PyFileIO implements Slotted { > + > + ? ?public PyObject getSlot(int index) { > + ? ? ? ?return slots[index]; > + ? ?} > + > + ? ?public void setSlot(int index,PyObject value) { > + ? ? ? ?slots[index]=value; > + ? ?} > + > + ? ?private PyObject[]slots; > + > + ? ?private PyObject dict; > + > + ? ?public PyObject fastGetDict() { > + ? ? ? ?return dict; > + ? ?} > + > + ? ?public PyObject getDict() { > + ? ? ? ?return dict; > + ? ?} > + > + ? ?public void setDict(PyObject newDict) { > + ? ? ? ?if (newDict instanceof PyStringMap||newDict instanceof PyDictionary) { > + ? ? ? ? ? ?dict=newDict; > + ? ? ? ?} else { > + ? ? ? ? ? ?throw Py.TypeError("__dict__ must be set to a Dictionary "+newDict.getClass().getName()); > + ? ? ? ?} > + ? ?} > + > + ? ?public void delDict() { > + ? ? ? ?// deleting an object's instance dict makes it grow a new one > + ? ? ? ?dict=new PyStringMap(); > + ? ?} > + > + ? ?public PyFileIODerived(PyType subtype) { > + ? ? ? ?super(subtype); > + ? ? ? ?slots=new PyObject[subtype.getNumSlots()]; > + ? ? ? ?dict=subtype.instDict(); > + ? ?} > + > + ? ?public PyString __str__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__str__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyString) > + ? ? ? ? ? ? ? ?return(PyString)res; > + ? ? ? ? ? ?throw Py.TypeError("__str__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__str__(); > + ? ?} > + > + ? ?public PyString __repr__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__repr__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyString) > + ? ? ? ? ? ? ? ?return(PyString)res; > + ? ? ? ? ? ?throw Py.TypeError("__repr__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__repr__(); > + ? ?} > + > + ? ?public PyString __hex__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__hex__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyString) > + ? ? ? ? ? ? ? ?return(PyString)res; > + ? ? ? ? ? ?throw Py.TypeError("__hex__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__hex__(); > + ? ?} > + > + ? ?public PyString __oct__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__oct__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyString) > + ? ? ? ? ? ? ? ?return(PyString)res; > + ? ? ? ? ? ?throw Py.TypeError("__oct__"+" returned non-"+"string"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__oct__(); > + ? ?} > + > + ? ?public PyFloat __float__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__float__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyFloat) > + ? ? ? ? ? ? ? ?return(PyFloat)res; > + ? ? ? ? ? ?throw Py.TypeError("__float__"+" returned non-"+"float"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__float__(); > + ? ?} > + > + ? ?public PyComplex __complex__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__complex__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyComplex) > + ? ? ? ? ? ? ? ?return(PyComplex)res; > + ? ? ? ? ? ?throw Py.TypeError("__complex__"+" returned non-"+"complex"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__complex__(); > + ? ?} > + > + ? ?public PyObject __pos__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__pos__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?return super.__pos__(); > + ? ?} > + > + ? ?public PyObject __neg__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__neg__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?return super.__neg__(); > + ? ?} > + > + ? ?public PyObject __abs__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__abs__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?return super.__abs__(); > + ? ?} > + > + ? ?public PyObject __invert__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__invert__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?return super.__invert__(); > + ? ?} > + > + ? ?public PyObject __reduce__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__reduce__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?return super.__reduce__(); > + ? ?} > + > + ? ?public PyObject __add__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__add__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__add__(other); > + ? ?} > + > + ? ?public PyObject __radd__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__radd__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__radd__(other); > + ? ?} > + > + ? ?public PyObject __sub__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__sub__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__sub__(other); > + ? ?} > + > + ? ?public PyObject __rsub__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rsub__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rsub__(other); > + ? ?} > + > + ? ?public PyObject __mul__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__mul__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__mul__(other); > + ? ?} > + > + ? ?public PyObject __rmul__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rmul__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rmul__(other); > + ? ?} > + > + ? ?public PyObject __div__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__div__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__div__(other); > + ? ?} > + > + ? ?public PyObject __rdiv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rdiv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rdiv__(other); > + ? ?} > + > + ? ?public PyObject __floordiv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__floordiv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__floordiv__(other); > + ? ?} > + > + ? ?public PyObject __rfloordiv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rfloordiv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rfloordiv__(other); > + ? ?} > + > + ? ?public PyObject __truediv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__truediv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__truediv__(other); > + ? ?} > + > + ? ?public PyObject __rtruediv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rtruediv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rtruediv__(other); > + ? ?} > + > + ? ?public PyObject __mod__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__mod__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__mod__(other); > + ? ?} > + > + ? ?public PyObject __rmod__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rmod__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rmod__(other); > + ? ?} > + > + ? ?public PyObject __divmod__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__divmod__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__divmod__(other); > + ? ?} > + > + ? ?public PyObject __rdivmod__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rdivmod__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rdivmod__(other); > + ? ?} > + > + ? ?public PyObject __rpow__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rpow__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rpow__(other); > + ? ?} > + > + ? ?public PyObject __lshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__lshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__lshift__(other); > + ? ?} > + > + ? ?public PyObject __rlshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rlshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rlshift__(other); > + ? ?} > + > + ? ?public PyObject __rshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rshift__(other); > + ? ?} > + > + ? ?public PyObject __rrshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rrshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rrshift__(other); > + ? ?} > + > + ? ?public PyObject __and__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__and__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__and__(other); > + ? ?} > + > + ? ?public PyObject __rand__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rand__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rand__(other); > + ? ?} > + > + ? ?public PyObject __or__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__or__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__or__(other); > + ? ?} > + > + ? ?public PyObject __ror__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ror__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ror__(other); > + ? ?} > + > + ? ?public PyObject __xor__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__xor__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__xor__(other); > + ? ?} > + > + ? ?public PyObject __rxor__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__rxor__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__rxor__(other); > + ? ?} > + > + ? ?public PyObject __lt__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__lt__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__lt__(other); > + ? ?} > + > + ? ?public PyObject __le__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__le__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__le__(other); > + ? ?} > + > + ? ?public PyObject __gt__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__gt__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__gt__(other); > + ? ?} > + > + ? ?public PyObject __ge__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ge__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ge__(other); > + ? ?} > + > + ? ?public PyObject __eq__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__eq__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__eq__(other); > + ? ?} > + > + ? ?public PyObject __ne__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ne__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ne__(other); > + ? ?} > + > + ? ?public PyObject __iadd__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__iadd__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__iadd__(other); > + ? ?} > + > + ? ?public PyObject __isub__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__isub__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__isub__(other); > + ? ?} > + > + ? ?public PyObject __imul__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__imul__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__imul__(other); > + ? ?} > + > + ? ?public PyObject __idiv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__idiv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__idiv__(other); > + ? ?} > + > + ? ?public PyObject __ifloordiv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ifloordiv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ifloordiv__(other); > + ? ?} > + > + ? ?public PyObject __itruediv__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__itruediv__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__itruediv__(other); > + ? ?} > + > + ? ?public PyObject __imod__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__imod__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__imod__(other); > + ? ?} > + > + ? ?public PyObject __ipow__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ipow__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ipow__(other); > + ? ?} > + > + ? ?public PyObject __ilshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ilshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ilshift__(other); > + ? ?} > + > + ? ?public PyObject __irshift__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__irshift__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__irshift__(other); > + ? ?} > + > + ? ?public PyObject __iand__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__iand__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__iand__(other); > + ? ?} > + > + ? ?public PyObject __ior__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ior__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ior__(other); > + ? ?} > + > + ? ?public PyObject __ixor__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__ixor__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__ixor__(other); > + ? ?} > + > + ? ?public PyObject __int__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__int__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyInteger||res instanceof PyLong) > + ? ? ? ? ? ? ? ?return res; > + ? ? ? ? ? ?throw Py.TypeError("__int__"+" should return an integer"); > + ? ? ? ?} > + ? ? ? ?return super.__int__(); > + ? ?} > + > + ? ?public PyObject __long__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__long__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyLong||res instanceof PyInteger) > + ? ? ? ? ? ? ? ?return res; > + ? ? ? ? ? ?throw Py.TypeError("__long__"+" returned non-"+"long"+" (type "+res.getType().fastGetName()+")"); > + ? ? ? ?} > + ? ? ? ?return super.__long__(); > + ? ?} > + > + ? ?public int hashCode() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__hash__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyInteger) { > + ? ? ? ? ? ? ? ?return((PyInteger)res).getValue(); > + ? ? ? ? ? ?} else > + ? ? ? ? ? ? ? ?if (res instanceof PyLong) { > + ? ? ? ? ? ? ? ? ? ?return((PyLong)res).getValue().intValue(); > + ? ? ? ? ? ? ? ?} > + ? ? ? ? ? ?throw Py.TypeError("__hash__ should return a int"); > + ? ? ? ?} > + ? ? ? ?if (self_type.lookup("__eq__")!=null||self_type.lookup("__cmp__")!=null) { > + ? ? ? ? ? ?throw Py.TypeError(String.format("unhashable type: '%.200s'",getType().fastGetName())); > + ? ? ? ?} > + ? ? ? ?return super.hashCode(); > + ? ?} > + > + ? ?public PyUnicode __unicode__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__unicode__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyUnicode) > + ? ? ? ? ? ? ? ?return(PyUnicode)res; > + ? ? ? ? ? ?if (res instanceof PyString) > + ? ? ? ? ? ? ? ?return new PyUnicode((PyString)res); > + ? ? ? ? ? ?throw Py.TypeError("__unicode__"+" should return a "+"unicode"); > + ? ? ? ?} > + ? ? ? ?return super.__unicode__(); > + ? ?} > + > + ? ?public int __cmp__(PyObject other) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject[]where_type=new PyObject[1]; > + ? ? ? ?PyObject impl=self_type.lookup_where("__cmp__",where_type); > + ? ? ? ?// Full Compatibility with CPython __cmp__: > + ? ? ? ?// If the derived type don't override __cmp__, the > + ? ? ? ?// *internal* super().__cmp__ should be called, not the > + ? ? ? ?// exposed one. The difference is that the exposed __cmp__ > + ? ? ? ?// throws a TypeError if the argument is an instance of the same type. > + ? ? ? ?if (impl==null||where_type[0]==TYPE||Py.isSubClass(TYPE,where_type[0])) { > + ? ? ? ? ? ?return super.__cmp__(other); > + ? ? ? ?} > + ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ?if (res==Py.NotImplemented) { > + ? ? ? ? ? ?return-2; > + ? ? ? ?} > + ? ? ? ?int c=res.asInt(); > + ? ? ? ?return c<0?-1:c>0?1:0; > + ? ?} > + > + ? ?public boolean __nonzero__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__nonzero__"); > + ? ? ? ?if (impl==null) { > + ? ? ? ? ? ?impl=self_type.lookup("__len__"); > + ? ? ? ? ? ?if (impl==null) > + ? ? ? ? ? ? ? ?return super.__nonzero__(); > + ? ? ? ?} > + ? ? ? ?PyObject o=impl.__get__(this,self_type).__call__(); > + ? ? ? ?Class c=o.getClass(); > + ? ? ? ?if (c!=PyInteger.class&&c!=PyBoolean.class) { > + ? ? ? ? ? ?throw Py.TypeError(String.format("__nonzero__ should return bool or int, returned %s",self_type.getName())); > + ? ? ? ?} > + ? ? ? ?return o.__nonzero__(); > + ? ?} > + > + ? ?public boolean __contains__(PyObject o) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__contains__"); > + ? ? ? ?if (impl==null) > + ? ? ? ? ? ?return super.__contains__(o); > + ? ? ? ?return impl.__get__(this,self_type).__call__(o).__nonzero__(); > + ? ?} > + > + ? ?public int __len__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__len__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyInteger) > + ? ? ? ? ? ? ? ?return((PyInteger)res).getValue(); > + ? ? ? ? ? ?throw Py.TypeError("__len__ should return a int"); > + ? ? ? ?} > + ? ? ? ?return super.__len__(); > + ? ?} > + > + ? ?public PyObject __iter__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__iter__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ?impl=self_type.lookup("__getitem__"); > + ? ? ? ?if (impl==null) > + ? ? ? ? ? ?return super.__iter__(); > + ? ? ? ?return new PySequenceIter(this); > + ? ?} > + > + ? ?public PyObject __iternext__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("next"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?try { > + ? ? ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?} catch (PyException exc) { > + ? ? ? ? ? ? ? ?if (exc.match(Py.StopIteration)) > + ? ? ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ? ? ?throw exc; > + ? ? ? ? ? ?} > + ? ? ? ?} > + ? ? ? ?return super.__iternext__(); // ??? > + ? ?} > + > + ? ?public PyObject __finditem__(PyObject key) { // ??? > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__getitem__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?try { > + ? ? ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(key); > + ? ? ? ? ? ?} catch (PyException exc) { > + ? ? ? ? ? ? ? ?if (exc.match(Py.LookupError)) > + ? ? ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ? ? ?throw exc; > + ? ? ? ? ? ?} > + ? ? ? ?return super.__finditem__(key); > + ? ?} > + > + ? ?public PyObject __finditem__(int key) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__getitem__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?try { > + ? ? ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(new PyInteger(key)); > + ? ? ? ? ? ?} catch (PyException exc) { > + ? ? ? ? ? ? ? ?if (exc.match(Py.LookupError)) > + ? ? ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ? ? ?throw exc; > + ? ? ? ? ? ?} > + ? ? ? ?return super.__finditem__(key); > + ? ?} > + > + ? ?public PyObject __getitem__(PyObject key) { > + ? ? ? ?// Same as __finditem__, without swallowing LookupErrors. This allows > + ? ? ? ?// __getitem__ implementations written in Python to raise custom > + ? ? ? ?// exceptions (such as subclasses of KeyError). > + ? ? ? ?// > + ? ? ? ?// We are forced to duplicate the code, instead of defining __finditem__ > + ? ? ? ?// in terms of __getitem__. That's because PyObject defines __getitem__ > + ? ? ? ?// in terms of __finditem__. Therefore, we would end with an infinite > + ? ? ? ?// loop when self_type.lookup("__getitem__") returns null: > + ? ? ? ?// > + ? ? ? ?// ?__getitem__ -> super.__getitem__ -> __finditem__ -> __getitem__ > + ? ? ? ?// > + ? ? ? ?// By duplicating the (short) lookup and call code, we are safe, because > + ? ? ? ?// the call chains will be: > + ? ? ? ?// > + ? ? ? ?// __finditem__ -> super.__finditem__ > + ? ? ? ?// > + ? ? ? ?// __getitem__ -> super.__getitem__ -> __finditem__ -> super.__finditem__ > + > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__getitem__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(key); > + ? ? ? ?return super.__getitem__(key); > + ? ?} > + > + ? ?public void __setitem__(PyObject key,PyObject value) { // ??? > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__setitem__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(key,value); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__setitem__(key,value); > + ? ?} > + > + ? ?public PyObject __getslice__(PyObject start,PyObject stop,PyObject step) { // ??? > + ? ? ? ?if (step!=null) { > + ? ? ? ? ? ?return __getitem__(new PySlice(start,stop,step)); > + ? ? ? ?} > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__getslice__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject[]indices=PySlice.indices2(this,start,stop); > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(indices[0],indices[1]); > + ? ? ? ?} > + ? ? ? ?return super.__getslice__(start,stop,step); > + ? ?} > + > + ? ?public void __setslice__(PyObject start,PyObject stop,PyObject step,PyObject value) { > + ? ? ? ?if (step!=null) { > + ? ? ? ? ? ?__setitem__(new PySlice(start,stop,step),value); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__setslice__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject[]indices=PySlice.indices2(this,start,stop); > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(indices[0],indices[1],value); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__setslice__(start,stop,step,value); > + ? ?} > + > + ? ?public void __delslice__(PyObject start,PyObject stop,PyObject step) { > + ? ? ? ?if (step!=null) { > + ? ? ? ? ? ?__delitem__(new PySlice(start,stop,step)); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__delslice__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject[]indices=PySlice.indices2(this,start,stop); > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(indices[0],indices[1]); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__delslice__(start,stop,step); > + ? ?} > + > + ? ?public void __delitem__(PyObject key) { // ??? > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__delitem__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(key); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__delitem__(key); > + ? ?} > + > + ? ?public PyObject __call__(PyObject args[],String keywords[]) { > + ? ? ? ?ThreadState ts=Py.getThreadState(); > + ? ? ? ?if (ts.recursion_depth++>ts.systemState.getrecursionlimit()) > + ? ? ? ? ? ?throw Py.RuntimeError("maximum __call__ recursion depth exceeded"); > + ? ? ? ?try { > + ? ? ? ? ? ?PyType self_type=getType(); > + ? ? ? ? ? ?PyObject impl=self_type.lookup("__call__"); > + ? ? ? ? ? ?if (impl!=null) > + ? ? ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(args,keywords); > + ? ? ? ? ? ?return super.__call__(args,keywords); > + ? ? ? ?} finally { > + ? ? ? ? ? ?--ts.recursion_depth; > + ? ? ? ?} > + ? ?} > + > + ? ?public PyObject __findattr_ex__(String name) { > + ? ? ? ?return Deriveds.__findattr_ex__(this,name); > + ? ?} > + > + ? ?public void __setattr__(String name,PyObject value) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__setattr__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(PyString.fromInterned(name),value); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__setattr__(name,value); > + ? ?} > + > + ? ?public void __delattr__(String name) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__delattr__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(PyString.fromInterned(name)); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__delattr__(name); > + ? ?} > + > + ? ?public PyObject __get__(PyObject obj,PyObject type) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__get__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?if (obj==null) > + ? ? ? ? ? ? ? ?obj=Py.None; > + ? ? ? ? ? ?if (type==null) > + ? ? ? ? ? ? ? ?type=Py.None; > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(obj,type); > + ? ? ? ?} > + ? ? ? ?return super.__get__(obj,type); > + ? ?} > + > + ? ?public void __set__(PyObject obj,PyObject value) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__set__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(obj,value); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__set__(obj,value); > + ? ?} > + > + ? ?public void __delete__(PyObject obj) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__delete__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?impl.__get__(this,self_type).__call__(obj); > + ? ? ? ? ? ?return; > + ? ? ? ?} > + ? ? ? ?super.__delete__(obj); > + ? ?} > + > + ? ?public PyObject __pow__(PyObject other,PyObject modulo) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__pow__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res; > + ? ? ? ? ? ?if (modulo==null) { > + ? ? ? ? ? ? ? ?res=impl.__get__(this,self_type).__call__(other); > + ? ? ? ? ? ?} else { > + ? ? ? ? ? ? ? ?res=impl.__get__(this,self_type).__call__(other,modulo); > + ? ? ? ? ? ?} > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return null; > + ? ? ? ? ? ?return res; > + ? ? ? ?} > + ? ? ? ?return super.__pow__(other,modulo); > + ? ?} > + > + ? ?public void dispatch__init__(PyObject[]args,String[]keywords) { > + ? ? ? ?Deriveds.dispatch__init__(this,args,keywords); > + ? ?} > + > + ? ?public PyObject __index__() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__index__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (res instanceof PyInteger||res instanceof PyLong) { > + ? ? ? ? ? ? ? ?return res; > + ? ? ? ? ? ?} > + ? ? ? ? ? ?throw Py.TypeError(String.format("__index__ returned non-(int,long) (type %s)",res.getType().fastGetName())); > + ? ? ? ?} > + ? ? ? ?return super.__index__(); > + ? ?} > + > + ? ?public Object __tojava__(Class c) { > + ? ? ? ?// If we are not being asked by the "default" conversion to java, then > + ? ? ? ?// we can provide this as the result, as long as it is a instance of the > + ? ? ? ?// specified class. Without this, derived.__tojava__(PyObject.class) > + ? ? ? ?// would broke. (And that's not pure speculation: PyReflectedFunction's > + ? ? ? ?// ReflectedArgs asks for things like that). > + ? ? ? ?if ((c!=Object.class)&&(c!=Serializable.class)&&(c.isInstance(this))) { > + ? ? ? ? ? ?return this; > + ? ? ? ?} > + ? ? ? ?// Otherwise, we call the derived __tojava__, if it exists: > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__tojava__"); > + ? ? ? ?if (impl!=null) > + ? ? ? ? ? ?return impl.__get__(this,self_type).__call__(Py.java2py(c)).__tojava__(Object.class); > + ? ? ? ?return super.__tojava__(c); > + ? ?} > + > + ? ?public Object __coerce_ex__(PyObject o) { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__coerce__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(o); > + ? ? ? ? ? ?if (res==Py.NotImplemented) > + ? ? ? ? ? ? ? ?return Py.None; > + ? ? ? ? ? ?if (!(res instanceof PyTuple)) > + ? ? ? ? ? ? ? ?throw Py.TypeError("__coerce__ didn't return a 2-tuple"); > + ? ? ? ? ? ?return((PyTuple)res).getArray(); > + ? ? ? ?} > + ? ? ? ?return super.__coerce_ex__(o); > + ? ?} > + > + ? ?public String toString() { > + ? ? ? ?PyType self_type=getType(); > + ? ? ? ?PyObject impl=self_type.lookup("__repr__"); > + ? ? ? ?if (impl!=null) { > + ? ? ? ? ? ?PyObject res=impl.__get__(this,self_type).__call__(); > + ? ? ? ? ? ?if (!(res instanceof PyString)) > + ? ? ? ? ? ? ? ?throw Py.TypeError("__repr__ returned non-string (type "+res.getType().fastGetName()+")"); > + ? ? ? ? ? ?return((PyString)res).toString(); > + ? ? ? ?} > + ? ? ? ?return super.toString(); > + ? ?} > + > +} > diff --git a/src/org/python/modules/_fileio/_fileio.java b/src/org/python/modules/_fileio/_fileio.java > new file mode 100644 > --- /dev/null > +++ b/src/org/python/modules/_fileio/_fileio.java > @@ -0,0 +1,24 @@ > +/* Copyright (c) Jython Developers */ > +package org.python.modules._fileio; > + > +import org.python.core.ClassDictInit; > +import org.python.core.PyObject; > +import org.python.core.PyString; > + > +/** > + * The Python _fileio module. > + */ > +public class _fileio implements ClassDictInit { > + > + ? ?public static final PyString __doc__ = new PyString("Fast implementation of io.FileIO."); > + > + ? ?public static void classDictInit(PyObject dict) { > + ? ? ? ?dict.__setitem__("__name__", new PyString("_fileio")); > + ? ? ? ?dict.__setitem__("__doc__", __doc__); > + ? ? ? ?dict.__setitem__("_FileIO", PyFileIO.TYPE); > + > + ? ? ? ?// Hide from Python > + ? ? ? ?dict.__setitem__("classDictInit", null); > + ? ?} > + > +} > diff --git a/src/org/python/modules/_functools/PyPartialDerived.java b/src/org/python/modules/_functools/PyPartialDerived.java > --- a/src/org/python/modules/_functools/PyPartialDerived.java > +++ b/src/org/python/modules/_functools/PyPartialDerived.java > @@ -16,9 +16,33 @@ > > ? ? private PyObject[]slots; > > + ? ?private PyObject dict; > + > + ? ?public PyObject fastGetDict() { > + ? ? ? ?return dict; > + ? ?} > + > + ? ?public PyObject getDict() { > + ? ? ? ?return dict; > + ? ?} > + > + ? ?public void setDict(PyObject newDict) { > + ? ? ? ?if (newDict instanceof PyStringMap||newDict instanceof PyDictionary) { > + ? ? ? ? ? ?dict=newDict; > + ? ? ? ?} else { > + ? ? ? ? ? ?throw Py.TypeError("__dict__ must be set to a Dictionary "+newDict.getClass().getName()); > + ? ? ? ?} > + ? ?} > + > + ? ?public void delDict() { > + ? ? ? ?// deleting an object's instance dict makes it grow a new one > + ? ? ? ?dict=new PyStringMap(); > + ? ?} > + > ? ? public PyPartialDerived(PyType subtype) { > ? ? ? ? super(subtype); > ? ? ? ? slots=new PyObject[subtype.getNumSlots()]; > + ? ? ? ?dict=subtype.instDict(); > ? ? } > > ? ? public PyString __str__() { > diff --git a/src/templates/PyFileIO.derived b/src/templates/PyFileIO.derived > new file mode 100644 > --- /dev/null > +++ b/src/templates/PyFileIO.derived > @@ -0,0 +1,4 @@ > +base_class: PyFileIO > +want_dict: true > +ctr: > +incl: object > diff --git a/src/templates/mappings b/src/templates/mappings > --- a/src/templates/mappings > +++ b/src/templates/mappings > @@ -8,6 +8,7 @@ > > ?BaseException.derived:org.python.core.PyBaseExceptionDerived > ?ClasspathPyImporter.derived:org.python.core.ClasspathPyImporterDerived > +PyFileIO.derived:org.python.modules._fileio.PyFileIODerived > ?array.derived:org.python.core.PyArrayDerived > ?classmethod.derived:org.python.core.PyClassMethodDerived > ?complex.derived:org.python.core.PyComplexDerived > diff --git a/src/templates/partial.derived b/src/templates/partial.derived > --- a/src/templates/partial.derived > +++ b/src/templates/partial.derived > @@ -1,4 +1,4 @@ > ?base_class: PyPartial > -want_dict: false > +want_dict: true > ?ctr: > ?incl: object > > -- > Repository URL: http://hg.python.org/jython > > _______________________________________________ > Jython-checkins mailing list > Jython-checkins at python.org > http://mail.python.org/mailman/listinfo/jython-checkins > From jython-checkins at python.org Wed Mar 14 04:09:30 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 14 Mar 2012 04:09:30 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_adding_the_new_binary_files_?= =?utf8?q?for_ASM_4?= Message-ID: http://hg.python.org/jython/rev/3902f56625e5 changeset: 6334:3902f56625e5 parent: 6327:728b704d3f9f user: Shashank Bharadwaj date: Mon Mar 12 15:33:53 2012 -0700 summary: adding the new binary files for ASM 4 files: .classpath | 3 +++ extlibs/asm-3.1.jar | Bin extlibs/asm-4.0.jar | Bin extlibs/asm-commons-3.1.jar | Bin extlibs/asm-commons-4.0.jar | Bin extlibs/asm-util-3.1.jar | Bin extlibs/asm-util-4.0.jar | Bin 7 files changed, 3 insertions(+), 0 deletions(-) diff --git a/.classpath b/.classpath --- a/.classpath +++ b/.classpath @@ -12,6 +12,9 @@ + + + diff --git a/extlibs/asm-3.1.jar b/extlibs/asm-3.1.jar deleted file mode 100644 Binary file extlibs/asm-3.1.jar has changed diff --git a/extlibs/asm-4.0.jar b/extlibs/asm-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d63075eb7331f7120ef25603a2ade856d12f715 GIT binary patch literal 46018 zc$|d#1B@?B at GXjtZQHhO+twc2w*4F1w(Z$t+qP}((fw}TJIVW>oOf^1-RY`yCzVvM ztm at QKk_81r0|J7A0^$|c7o;PQ>IMJ-0ge7Q|MLRLi>nFKODjk)$_pzA_h~4fH<8S;dq%g6bNlW;spTk#c&SNGwn2 z6N2a9rAck~FZB2MoC^tqGdYG(h#5eFJ02H9Tw76wq25*cAHi=By}@Jx0|6z00s&F~ z7rcYB1*3zpwV8>lhnX>>k&7Lpu)V#5tC6dfgT028iOqORwkb#l;=} z8Mni~*PkyCLwxjLbB#FYF6~q$=4wcPrS|XSr%fwQRo=$j(bC={FaPtw@>tDI-Q}Z%cZgY^->rW0w_XVRarzh;{E^)SgHs2calGkGWzUd7cxrM zGqPe$6IIW{qAZ}H!G!@o)4~zgGQ|*t;kkzO5Rr~Q8^I-$s6t3E+dFa)s~}}!WFlvx zQ(uy=D*u$K_@?N(l*xL;VK-3LHRJnFi5}%tYXs#rI3jw1&7&0b=d;IYUqL@<93Z=_ zUXse#CCpIl!NFFW(&o*J_n$(3Mw9L0cnP;E8ptfbS%={XX zrrez~1bt));FcfSIq&g{Y5g<);1I-2mcsyOi;9Gvq=EVZ{m=YvrJ0byKmY-mApikU z{lDZ_)7i?^?0=o at TCvVWc5-cGD3QS-dfo7Y_4 z8~2RuyzMDTjC=Ud9jmwH#9&A1$XIwaH<7k~6O_nlx5{C{?k1-M&l;4_!)6T~CwZc?<=tcc+b2dWYX9>>`4#Fx52K+RU4~C0}>?@jzYO;r6)y}^=12N!|NraVY5wtUoffT zFuUOfDr^4!BRe{032yKWz8$bPZFJUAlxJC(f(a2f9y-xH_j*qf7f4n5l;;pjZL#Gu z!zRQR9B?>CxO+H}D5NMR=tC&ejwr}-p{X+)j>2=eBqi0sAu)ngOc)e88a8yf4(sv0 z at GP?&=hoRp9JCfXzlCMGO!iaV%R|pse#8KZV-w}Hv=lcmrKMAN-No; zMg#n;9g{K-0g&ubs&pC zBC}3mR`IGD4WG1M`Iup_O#4#*buj77>Ne;HpQgmj;*AKk7^^uPe)o?fmoTq}Edu4} zb%l~rwPAB`Ihw6HtJuOs4#jtfarJ5%Z zGa4%wmIiYQQ;k`Ld4*Ah`oRbeL{@c#ekmbAcC>`8N+W!Hky8S7im;h?N&Pp?3(K2c7A-+j#zi{d!C+Mq at 7p3TlOu4w`i-ki at q%THORla z`uUGDZuGdlb2`l1!{04d0PXFhww}w{oblvMin-H{KEvGMC}LN5Akiwe%?Om~zYr|v zx0(GaHZDN*EwjjwT<@t at S(G at i#cAw%Wa`bQb<@K6AmR0D?R~!8w1TNW$Y& z{tX-c&hp(D!r_u^OHd5P?0{HPYG_NFYLShsQT)&H9H8p)q7S8)u^gL;{gbUHTd_;F zEitNS4lQG{lQR;xM%1vdMER5YZcWQ4{G6q%q-RcKSf6VPv=o`;xgkPmoP0)j} zuj`+))tN{rwRDF6yWysW1Wm8DYk~};ewg|t#-v%Q9wtWRH#5ECH@}1ezpM7ivRT!Q zK~l0~rkVl{4dq3X3UmfdcUsjoWh#ScDS&}CwV-mbK at 2<~S*E>kQ9eCYCZck&;$TXg zW-oElO7w(HUxVhRY?1>$pHU?$agti}1nobMUD>2Nd_KKOVKB>DZOUeOma| z3kCh#ApVf|lNrCvugg-v4p+xDY{KFt>Q4BCL<+m;Pn zjg=Aps6X5ktH)*Sp#?UmXNFkKP^)s1sOJw;*nE#ua-QvaFH$l@ zq6MOM4G{e%nurz2Is2(U$qe+am^F7%Tu^XsLp^E5G<`J+|y z#zv{d9VhjIujvj^O#dXRo}!pyP-{M411cCu*1R{&Oc~G27+qe60}3Mkn%MUT{BL|x zKs9m%0t5v8AEyxipZUbq)!E9}&DHGxLnN^(%Bm>JXg>_FK0zF!0Bcp2DHM#9Nfz)H zu-1$PD+<-o40Ao#2qtg~Z4=MCzV}1X86b|0_jA$u at 6^0zm!KvzW%u{l-Z$Sj-aYQ_ zy#T)*NTyJ-kYhwP$Hq7ZEbp(NXWN14aM(p#UtQLv>Jb7ei$Bvi2)6He8BU^$ zruTeOX3#Mo at 1DX`@&;VKvfuA4|LV2Gz(eG5%D~oJNMLtuaTPJP>z^$vZq1!O`ySCV zQDy6<&1a+SEaF*ZPbZsD(x2|3%js;&FBTc5a!$k-li53O at 1LLEJ8d7IpLCQKfN}sU zfNRc^?>B)knu2Q{APa2~ID-3iRP1x$!Q4W102ILA90$UH20_BXW4a0s{su-cfH7Z> z0zvHD9|dJMiGqx7r{JUAYxPG4Qrd^!N6LUjB1)a3{X-IDQHnQ>n+NZ{hw;vQ$%!TC zue~|U#Hb;8?VL4Jk}e*&C>W>Oyyl(Reo5x8Ol&^F`HnwXFE_8tui|tba!i0UG(-#{ zuMJ*jI7F^<-s7}DUoZq$^ieYqR(tdtD4G0)ns3Ph5pJ5He!Uge-5gO9(=c0%(qP`z zy4GYaoQwq!T;{SfzAC3sd6#BzVDbo!Nsfx3i=DP12DsmSm3C)8TUC+7#91M0;~Z4^ z1{N03Bp=}zl=QeF!F}|&*B6J2fuj<5d1*IDF_AbB{@g#3N|#c10%e{8k+Cm40He?d zE=F=mE4MH_+j!RTNVkS(rqBRRI+pn|6rfee2HO$eaO>gvfd3~#NFB9FLDJypyvaS5J4Q-%_F!FB>7Pa>@Lf!NlXlskIs|po);$G^zoW{3JQ*zYq*n-!35G$ zUIoeI2%GLAPQ;arh02rZ5IJM=WL>H4HaF1;2=eZ$((gm7>V_0uES?ro4_Eg?Lc>xU z*-mnsPz|okzH~Fg7T&)b&@e1;L2`u&8yR!;c1i-0haV$yM%%{om(n&e2*!3+COeaL zNkcLm?S}L$SOG`I32V2yd=^SOmN~@#0o}H9I6db-}M^ zQ19t at rU-aqc^6v?*l22B;b2OMg|SUp>ZNzEC11od%kX2In1vgXne@&9DX|)y$hv_7 zBn%R9K~5)-kZlrmPH#1WSuAmp5xaHEefR1$h{cq#QZ)zBwuCVbaf2MYX`|#S`^6yJ zwg=!GO8!~w^rx~RYR%jeo>`7~)upNf;b*v;gdKwV$`CP^iNduMndHDqYJz}>)sN$k zz;mRlqMbR}mhY%0M(R?YpR=;fn at FPlf+o$D8Q`ox!-B;g9gh at P==%lKI2T>`^;?#| zffayJU3dOEK)#c|&?5N(yux|X>oq=Gx)4q2O$#)M zdB5E73+xBYSCT*GCI1E`EZrUmp+?{hni&1X^S#zI)N6geK2LRGRfc~xzl&~~ECnB4 zpCgesf^AcX#oAJZ|28rQXx%>nwwdWX{}6rsZ(yWakwxeu1Ok$g00JWYKY~&8|3;vS znUU%L`uWuI!F#H$q at MltVtq1yOp^0wxR-)Jfg+ZpfClsJC;K7;Cc}Xu2L`jwCB`O3 zNy?B at vjw!o)z*G1e{Dc?M^;{4YuHtWK}Q$4>#nz12Q1s`R=>`z+Iwu>xOcbNko(N` z-p$Ajf at yhtc%JS0+;X4g`P_D%<$azGw9oQ;;Q(2usw2>00fz<32)P7;>;tVp#_5iZ zjpasy(v9g??}9u;1QlBg(}o;Yf!nQ#+ea?HNc?kOa~p>6`RC5blo5aaGqB_K-CYN8 zAF+?QtpdQ^RNGu$UB!zV^MCv4`hFGHV=w>TQo|;>2rvfHpflYv`X<^< z0H5j$(iNQPPNv_F at a5#WB_;_@(?N}u#Tr9O?U4%8aL-#Wi-j@^fOz#q%%^+Fzxl2= zF3rxU39g+OXKN{+*+8`I!CkK^-GcpkHVq#WKLhTnK5NsgBEWlvtgoRaqm=T5nYMxw z(8*xN(~=uJoG<@rf at hhqC=GxS|1lUq>U|}a$O&08f9Or+1hR~qNiB-u=(ur{)}+ca0Vm$ zXC(eaUMx@;hK->dx)Xb!NI>egz`DyG^)R at O0yuF8h zv4ewsT^LleP$n;Sh-~5Z&e+7z%y8=3%!pFRAY^1`B^Ob)xoo)&Z#fjJySa&#VoPuf zc)13&z3v1mL$)gNLgI88JKvR!8=C$>gUk>z*D}>@j?7?fWb6h~980auuCucGBWgf) zX|u}VFhD+w48Ik at htJ>rNz!;A+~VXU`Fn4u=_>EKc7NN-Ia1^&N)_D!?yZkl8?uTF zaJ|_CPtU%}TPDoT=sLa+(&OrKwz;=)w6 at -Ab)RO zq53sZUCA$Juml%1l6Hub=pSFIVPi!u8a#?YK$3oT|ATy0{SKE>tX~G)3_`j&yWK>= zaS%r&yTiK?p%(98^!jrx0ys?84x4d1JtR%!sq$Vs<1a(HBi_V6jgR9a7m>;FOh`BJ zZvy2vK||Igx+=Eh?bOszRBFLFdE;~=XW$dFkI}Y@{JKqi$lAC6lIgdZy(ilxEim&T z;irUPFK-Kmif~Fs40o}?PuOZA&}Cx5tiFnczmDG at Zj$=qJ at CUldjB(?;cqOQ{c-F4 zMpgspN7y9D zMntt3JIz=5AnyQ%q;s63wb7H%+D1n|z-~bGJ2=CetW9tDp1qoEP{YvS%+J5E znAm7a;(aPMNtS at M%T at 8-h*xy2#$apM;RmR`6$|J&QP1gfuhI(dqG=>{cKnpPan0bL zjrD}f3J>%}(@3ow{kJGrGL%-O%b`CSsg at YRp0Y!w$*BxBh%M47ajhtyph9B^vnuM* zg;%Q(?wY|POWVOCC2aPT{#1D=jY=(8-dtQI<*LlM!WhG*^>(SZXD!v7!hib|+q}Ms zzrJXxlq}PRzrmX#SZ(OSSY72Y8T0fGIMOj^LPJVW!EW?rGj<+K*>jzS*LNH^ar&;n zkL@@P!b@|;bRLx8<~a@}+k0-pm+#!i;O4mvx!AvF;r=YZ|M3{&+;$v=x7fK?w0|$d z{aZT3F;1x at RFELV46INP+OG%V29}1pE>)1*Zw`XbqX)irbq~B=EsCjEF3P!5N8S+8 z&jfer2)c3zW>1Gw_o!5)OzHi;AS+`QZ8yyivCbSR{e29?DM)@1Y10hFJ(6$;7wB+x%?BJ_pG> z+mHaacicfg1aCJkIAZ*`K^A-hvU~6jxrm60R}ZmArr5-S%{|n2$c(xn%u06{V=$%a z@&b(rhoMhb&%DU|2sbc}i+hmi`2%sN^Lu=)f+3H}5B`dUgHOZrdz9(r1G7uNFdly( zah@;Ml*@b3 at s$I~lFfJ{j35bogD`Zk)$@DQ at udTHt*W7`28{?#%V0tBdseO5p}9hl zh(8I90njHrJ<_oEw3dqpYb^v0%1 at m0MMHf;sR(^xv~KU36>A536(78os|Rll!Vv+K zU4s35_&*_H-^e(w?}{kDloiVdeTJn74nwy1KX7(DU*M_Ki|yNX0I`#c~%(AT8*=!n%upU~UaMy2CX2>k;~ zi2kV=>qbF(DpPWQL{Ci$J-K6Y`p1SbWA;dz*M=>|V-t&YTB8votwpQ>M?@`2L$(lO zkRnRQ(9|i)j-ESwkfN71IIPbG->Wu=2TDhFzaQAoD4@)S$Pth}Qyz5MjOepqO$${+ zHm|Vn2gZSVPSg>X!h?hH^z&zZ@|Wvsq3I zy8+`obS1oe}G5s==K zgZ!azoSwSW77PLgSwqDNc4ia72J-9=L=-{8(v$DwGPdfEVA+Ie6U`a*_-q_WR4se}U5UF~GP!2_)961syiX^s#gOFL zU>d~y3J`jM=D at h`Oo|?BeYN=3rCSw+*sCpZ1$O>VYUb8uX-N1T;ICm4c^fWt_k{(g=cR zCU8`o=sTKS(aOd$RfckdP(;P;cn%eEZXK*k^n?hlQ=L=o_QUb$>Qg{CB3tz at 05a3b9u+mNK2gBwf?+1jz0cOS|`u#0_I%aeg7PS z`Rk58IpWOGuw1S|%Q~g2u1`E;aiMU8a1{c*86J!bVwcINWTqOvgop1)ga4*cXocMK2eetXmat^Yf%ml`Q*PKuo0awVhF<0z&;CnTyUz>r%9Idp zNucs{4mP>&^Kd7^j@L zczB{?%apZFQJX|b;0`EEDa5zTLf3`{YRtr@%YSkvUw^Y29)??3jyO z at kj!7w(v;m?S)U}8px|=?18 zUr8Er%n3Jbvu#MuHC*PPUt3jef86UnG{VQ$1HznR at ERRUXxFa8rv5{LUzmCD zLPCwOyJM+hL|BJEntNH$I|W3KXJC%$+30#c`3%E9a|lFuhKh9E<(H0GF at 0>Vk<-J0 zhb`+rwe<`W{>i4lI`5ib(ytDb8`akC(gu at z^wJi}N#Q4$AQr at TXh&NBteD31d}y)_ zT16{dJX%oUfcq9g$|uoB$`dLzBOkQrZ$&F&i+Lk1{Ga4&k8l at Jreiv6U{02wen)~Q z7xo?$>Ua at S=AI`eTKK z?tEd?lOdcQXrR1qA2IIG_Mp#M*5&ejXWA at 9NjyKN(9iV;wrVYL-%9Jn;RG2=c zs7D{jlP(z_PVuKqe%ltuh3N3l{DetRPWVpoC~t)>y%(B@`!y?I`_!uY9%Z;;{`qP4 z=uYvKM at l7WjCHizlaON?Xt6}zeme5E2wsP`KrX{=6o9w7Fko|H~ki)EAy4i#c@ zi#aDu059gZc#%%!;8g7!UkrlaX0aYv6E#kY5x|0tfufK+k!1=DbsI^zs*wo{>c5%P3QA>L)a$*D1kq;qci4B1oHOJB5w2q?tE^rvD#3j#+Lnn zUz;Rl>NfLh-HA~>6r#`a{A^%8!u$~zbZp_j6$o=gFSe-RcSf%tC^#_Bzpfp=2g3)} zQBroJz6TsyFxk?sb(Wj>w^8`^7x-Gqv`K0(haXu==fboI?~d(B9)cbQdiTb91sOzF zW(Z61-DLQ3*MWf;50UV%(dayYZ$j%e%I5UGz(H{Au}| z7Cfb6&N3I01P79NfcM0RuW^&lL`gdR2AvM2%z;k9Rw#cJ?B9PP%`w^*`x>d+|NPe{ z0hHa-FjHoe6K0d~1w3g}Sj{Q|syVON41Q&Jkp9|mzfd33HP8Yk(8nPUSo?FjhGpfL>l~@t$Zs9dSj}?zbFc_Q zh}1ch`#$2+R)xKh6N>$;7b|b2Vh4+qP4wS|&orpK3=ac?F4$1hcAw2&V{t8{NZ55_ z|47o(gEEtWnjVSO-aM6V%{5;$58Rw3Y at Jzj@#mA`nIdFGWsI)#`quSNlgEe} zHrd8{wXoA%*D~M9-2&MUZuhQI)U+r>;kgK`ZV!4 at Q?bv_fa{&98?g#K<&IV79F%L@ zL76zD;&4O z^JxJ+6nCuh+~y at a;luxM$>*MRBe<%LrZU=^$TlP+r`zS*v&)U;Dh&Ajnp&e#YFy30 z%BF<3xipL<4e|>+$d7-3Lrj37MPFPPvoI{aZ;w&rcCSH_i8w|C1N&&3byFBdwQsgw zn3lw?;fISnClx50EFZeLYlFyKmrb`^njVJfw`q9rOcxB*IAydVG|w6_xMl$G%zKCQ zu9?!grl+*VO$$q_I_2;pGrgM}%*_D=w42+3+EBQO(yC0gI-S!Ak526kh&tUCoys%m zYx&?Y#8V at BZG;wkN{D%ed;3#2a74bqRi1w}uPYhRneT>eYbgfG(3#uAwiRePn=V26 z`YITThBVH=cv0sxM=Jg>8jG(2sr$bL4c#Z8>1I#TT`h_-$o1Qa*UT5yV>~y)F7V3f zbfDNh?CNtGKp>j(ldsXG~eqINnP-Vjte~_`DYC-r402_>954|`5?uX*`{Jy z3}ViNlfJWz$MClAW;Eom+VUXjzG|D$+y?i|R`wK*Cw<>R{`sn z3ax(uwY8P2uzU at Z2Q18!cmV^E2LTbkBsk}>JgAdYK~7m;>Xc_)4O{SeNOJ>e}@I%LB% z3gdJw1_68|*~55Az1c0qm$j$`Q9?5dz~EZ#;{2g&N-`E+k)Lt`lL6&2(wUDj5>N0{ zWyjPGHI8XuAGMEZQhB;LJ-j(ZaRI+n6w#C;wgrc7=4Qwi`^(15&7fBt{fS2^-g|-y z>ol}xD5aQ_oiA{NdmiIZz`FY|JB{lVh;PP=IiSvycmdvYU z=yIQanK$HO&!OXp%v;`?rUnj*IIC2`l||lGM-ZN@;5n_pe>LRJv at zgnMN6i87|+s| zpt}TiW0;Fl+aISSFZ7cQI|sGqbV0vh23CDj`1f^h0XiTVM!rqO{vK*{qK)!TdxAw%~eK6h~CPCf)C9cuMGQQil( z<{DbH8CG}Q(Y=w1=_6t=MBRmsqUrKxcc`K4*9^Vlwr>@8|F`b*0Klj}eoCG+?r}O; zL8 at 0ueU>KAIdEZ_4|N`^^Eq%RDc#vlxL zgpsJP>@SH}Gu-hVT&k-IlYKYpD at N#-T=!aGw`*QO<#Wa!aJ=7vQP~_TI^+TqG zSt#s7A>rkeY|DLd5Q-*O1xpT$#){)SaaE+RYcT&qi%Na- at jU&LcJ;Sp%@QO?y|!I- z%T?x0CBdp=kU-pAJj38`r24MgLu1q9o^gfeR53VAbpDWke07TBcFek}?Wns`B5H32 ze8(-0iC`0T9g1&eZ^Xb8mk%CeR(x~)rrL{$!Uq|*M|>lv9ZY@!6NNI~e+S#BQuY?4 z232jR6;-efB#O at Box&y0*Hri^Q&TxUOoC-*ke=?2d!SG9T1=eJjGXx_Jm!O3rC%Wr zP?K{4^&9|h-RnV$a5tD at +i+19^^+>g9!F1xUHmJc0Ubhn>7B{`5H68(JUK04PVovl zNwZuok at 3{KLcQ?m8BdxTv>?UtfZtB$yiCNQC_w1+g;Y<^!LG9yd=nL$e ze`E at FOJE8+r(bN&T_T;-v)mH5$IOaNoVymReG=2198VOc?n{cE)TccYLwTn4c6t3d z7Ocf%ohwua|IfaXABpKkTq;smY4V1;fkp9n6yCn?>&1k zo_;H(@y&Nf^4^f at _f;@=#W1 at nM*QmcGBDK@!JO($m5=;2%SvIld*~~rzw08wcn z<~C4&+Bs*`Sw=U_i)Ja=HfBst+A9x1Y1Jc8CQV#PMpiV;ReZU zjWu5arkYEvfjHO*EU-dtV1BhHMd!Iopddb~YodY0EK^0O;HBY z$m%+;8Pa07!AaBQJ7{!`D77IRbFxfJhnWr!DRL7o?K96i%R<%kW#p(C<|UcFf3p!F znCUhb8xFEc2Hyr6O6Y~GToXPgO7+{>!DYm<0(6-z+v(J&e9b<~D+#@(jeW2|Ft%h& zi++cS4X(ldIbW9a36v~4-Lfp3m|6zd6$`0`rbQ&YyHnoanx)lXDkou1)u*N`p3yu5 zdX|1F#c2y2b_tkrNHnquu6(H8V_I1)wPo%vM$d+}N!#KhWO^PytvhIMjkjGaWkK3d zAIpmkl|H6LmHPSrZa^YrX2}TpvKi9m>nJ>!WQHpsG+LH4M z_^uv`){k6VMfm&L51gT5%&5)fmao^`v=l2($e4kW?qT`hZ#9eS;+hDKNkrKi zn*O)p#<-tC^$1g!CB}(I&J?B7VmW5Z0q%1{ch)9M3fm56{RU1Ads)2ta|PO%aE1nJ zKgNH@!Sn}T)m&?D{u}Xs_WxrTB@^^OfPkLCfq=;V|M&m at hq66aRbLTR8HvArr)}PV zN=e9CkSe-~p8l%cI5vtngH70r=s-BX?WT+&O at E2uy`3qM{9!wXxY45||58V at oo6#>iM3Y2FK7JoikRVD zIk#aqb=?1H+>-m{F>mL}vhD3*!_wOOSIfr^XXmwWgA>176O$|NxkdR>67Ox)QD9wj zR=51AuGziIyN at ub0~+^|3n!zKAH&7<_6gbrH$c{(vkJVPZpz(ttfkfnSLTwcNK`$G zGVUM>(8ol-B1RBph1NLgNE-#Bk$jwrWzSl}x^2`k z)i6-Nl7dYGmpzGN6!i0m%#%izP~HI3L=B~aL7Y=q4_9;y8YQEkC-e#O!%R$o6rt#ITVZDaKWMs6k0YKFh-o6=Q1D5RV&QNx6 at g*29FsZE_1#yHsQ%K zUC at cm2k&!Vsz)+0IwJZ9&i{W?ryLCw{W18 at 3}pU)RHyv^>hfE4VSUv`Rs@^tySqDs zW|GhuaPvq)v%zSrm!T{{#6ZcYgpn%PWwk`eHex3rMs(Do<5yQTYF8?#Xs|{wiMoZ0 z1M3ZMwydjb?d)v)+WxkxS6_V0<@$kf5I_3q`@adYTFmCSoK9!5x;XgreV&l|L|R7I zuK&faKGr? zZDhbOn7*;BR?AAIB(H~g%n4IhcbxT1iAbW#^hyB8YF8di4m{z*nSBh9LDA9j$$4cA zVMp+H1aRX273RxkkKpABX%f;&T^XJnbzGVpiM5Mey<{V-YqPaU6xVm-YU9Z&tPgy7 zIpUP_*E`r24z<+CQ;VDpEBG1=;h=lfD_{bobHPM6FCb6@`Tyrc8Ms7HBo|9z74?Z~fvSZsBD*AUfEt{F>df&}tLj?*H&NS~{{I5(MZ_ zH8oLhQzDz2rm+8lHiG7Ih2*$;k)gzf8OJV2 at leibTJlU~#N>eJT;H)G|;u+d)5ri+-9{W}(l-MAn!z&xKH(G--vWUe4jCJ z>{@ZEdf~0DYAR~#=}F2DvzX51b=VC8J$=MY+ULanBhH3n185D`snPv|oBYvgGF}6| zQl8&wIm?|2J5_zQ46~RVdimJgft{etS;@dgTIAlZ3h*9l)YVZKFI{w=VZCN zc9ga05I}>iHyy+i7CjTY%r3ISyGo-e%bT3D`f{wfP*0TVP>+Tmf?DT{&;JPi+OUU1 zg^)|35de?HVVZ%)@vB(Ja)|^Rt9+j4e6)A)s2bNH=qjSldBytNR_X;bKSLY1D%zQdlA+l+oS at Iv$F{YvMp#5>ws1~&5 at E!( zFcUI%iPs%>0R47J*}8G9YRw&aX>Q(M+Um{%?C9GE~3OaR(Oik z))u0!Y)lRHs(R=U}~7< zGwHwAEzWab855kpHy=+8%T)0rCu+og^$`*iVSz>YtW7(dW z2YGVAW95?7w$0m1-CJFo at A~lu>-jeR4F7wqvpH%oZLd2hk20x_x{;PZS+bjf!dyL% z3!T#>NLJrvXRfB<1iTRUkLUYuq{Gb61`=8PfQEa(i;%dh?& zUNz6l(P9(Lj~2`S+@;opZyTpAY*kyxKc2FT2ySEq~Tw6_%~hW!0KJ>#+oGe^}?x zbwR at EHzohpc@dAZQ at D_eW4B;gE#YCcT)D7=vs1jl5qrCGE)aXWb`Bg%ux!~a!OP|? zQcTJ2EmK_1ez{=TCoyOFj2fG_a$b(}Emuy?2FHZMgslXVfmi{t41{sviXrZ%BT>r} zR-s?cRJ&w_u3x1J%6_pdb>+r`*#OayrsKLPBnmVHObP^HNM?v;$Yw}qh-b*RPt`9b zgj|4i&))A8$kOlHFDC?U$g$7X&({yqe-X$E)EWpO1m at VNuvgZ}V^>lcXyV!x6SsQd zoZ-Yx*MS$!P#zWt0W^05Gr4vllLf(r;0RFw+~2!bSfH?1ikDkgBq4+v==Z|E==M*5 z&y_tRK&X at FJAuZnD|~k8Lg!vzb|#P`w~jPlL9mD~x2_!3?H}`pTNkh+X#r?n4>TQT z$Oi at +XQ4Z-b-QwuLblQIjgl)bk9$!YYHNhjmbj=}ba7fihJt>@&1eik88r{T2&?O5 z88i>S#0k$$DXQyc#O~O at n@g8i`5&bqg}xG2w}0r?eH5zYXG)*&_|;2K`#!+QKlJ#8 zOLz0W$oDAVuK)PU?jhw~%=)jiqB-Y3DI|Kt;Rz0q-3SiQ(Fqbs&4EvShLMzku)wk4 zu|Tn4u^_P!xlovZ9nlOigyQs}xL_OL8t{-na$qe%av&|ihkF at YF>^Mtar#>WuYd#}BMT342 at X(C0 zWb>nO82u=+dY?PFmSlgCEkG}U;R7Xvz>r=RF^wzJ|DtL7RBHO}Ol6vOXhIRt+7|85 zUK at iO#%glSABaWB(t*?f`>xTlB_d{kR)Fcl3n?z8lt1k(11U<&{DCT#1+N7jikzxDQbk^-Ru^H~vYr$khq z4lMFHffXPbf~dT%i`y(nsutiH52=c`zt&);cGrKs0-A|D4;a?8npgNa9>Y=G5si_;f5c7G*fqG zNjSl+`jt2P)s?x^u9|_2r|YYe5ePBWW|S3-BhcoUOmc)_#z^j87}cWmI~m^NzYtlv zyF~frz;|j~xyIm@?H=B8a!SvnJZDbC#LP7p at S4^ya+yQ7sfz=2XHq&?rQ4b6Z70{+ z%WB at qYu>Sj#J%8`aPv$U#RF!{=Q9_2>>~bwUZGT}aG;O7ouo3sb`6({n~V4wV~mX8 zV^|P;N5!e-q&L3UGpuC}bgUa=43B)5X(u(nM*$$GlR7$99G{iytZ?E&=>-`G*x=9n z7q4^q(1)lu+HmU#vg|uvw`EExFr6BQj;(GzmvJ$9Z%TE9M6VE7I at TxPhtTKC9>&3O z*%vlGtrtty&dJPFptBK<#?W69?6bsG9z;j at j}^OGxrha#0s0e#0p-an^CHgsb8~7$ z5sgkx1ZkQi7E062I2f2w#}$H0c%vVEB4<^MANed4pD}TxVmj6$t<2}d^QeqgbXIQi*(;rbLhNT1>4;= z;$-69Vc}Itoy~F{li{=lCTbZZNg0FFr<%R)S9<_H?Mn9Tj&v`-&9Yxc^$uXiw_5s~ zI|3oJoGbT9aqE_-!g=%eT^Hot!zQ1@^I5aI?boGRQQ1>D;mr}jxcDTIOu1T|JC3&~ zf*X`yX0x-qYuBX=rwnZWxt~0K2#yE zjYT(?#GoolX4qM1kBOHtl#rhCzunR9eT3a>B;9hqywc8j at fiY%)w*ACFMo?2&MLs$ zX_G%uM|N_pd^{Fk-_#s5%^fsFdMJDZm3q5beLN_A_B4AD-{#MOwx1kDdXzOU2Zsqb z!gkDMBRQ|iioGzOsW{tasnxZI&z2yG#GZP*% zOXQ{Y6W#&+c3Ta*hXMUGZKND#X9&yJrFns4GNh7Hm$QKuFgzUIToFC?mf$p1W~RsK zSUQ6oB>3oeSXt;d7xP&5Tmx*>taQ7^9O=eK>r^K4EI2A{L=rh}t8#=hC6mrf;(2fj=pjI z=ZK3R6 at YZn9((cfYahX#cHWJ##>{jWNu<5Q)f;?QwRWtgl&7b1vpoAkMs_xh4RQev zzUfECq2vbeHrcGyL at 0*fy$5RPOC{>+mzhFs#coH1q at a@H!oH z&z3!RtK0p@|Ha2UHt7O1>zYs7wzb-}?bWtz+xBYP zwr$(CZQGiCX7)_Pd*bZ*P(Pp|v#!d#@2VWDs-eroxi-La=3x(0ak^ob$_6T(ZA|BE zQ%S1}zutPOcrk8L5r+@`;4()=cvi_A?i|AReR*h%%^gKKn7rN&OmT&YmdjWB`j!3H zi%vSEhkRhCbI|Igf`5v^mwW(nk at mQ!UZ8Uj{)r0H`$3r!a^-+~m)zz4$`P@)-{R25 zw6$pBr1A))8s**p`K+_ at IFGy)Xn$v;6PjpOIjq(f>blM|O!=<9c-Szud$PCy-9ibb zl-E~UuJn^lL)B8OVy*UaE4#jH7C}51O#R8&znTlxQ)@bqb47OabU&aFaZLO$w%8tG zvVA&ayM>i=A8miX@`CM`rDN!?UKCqAGvF z;vjX0Ia5^sby7>i=pMT-mT0wIFKt`{grYe}s;d;-7!V0ffB+0k`$Y^JeA>;O&a za-VOPWa+)U2iqH#+x>M#Em*bjV7%gRwVybQWnUT--v${=lnAneF at CYN+!-Ahep zd-Vrp##fo^b6yc|2jNVoh44y0-8(dzH5&JYXVcA2!9hT7EoKOLHRchiW$pt_gYn=B#hw{$Q&E?{PDQwARw)?fwJnJf zey~2bB%KedUbt%0{da}q4Ij=5cih}F*pz~Ga2bz(Gzt64$GTiz8qPX$(LX~FDMvb#@vMrGN>r2v`=l28gUNTpf8VrW)066=Cs1{%7K^D( zz88a54F*?Nt1Q;H^)y}mnwz>(W#u1YuYr_c<%N&atHKX+7a0C>`>3|)T{_?`BxFz`fZ>ZwW&Tte$HQG`=G3oj?Pvg z(nBg2^Js+Z-{bocd6G)VvTLN;{Wfq_LU$V*N!%y}2;DJj z-})Nes(uygpiTcIG~Hvgj+=!xPc)gFy)}c8>-cjz)O^21r-&TZ4l6s_7}eBz=0ozCB3}iiqs)uL*G&FRDc8u{RL+P` zmh9{!dZ+#4wLQ3do}JiY)%#0$M|7K044g0(`kj~!Cw2vR&)iGG)L*@XCu(COE0J3W z!mkDPVfJJ+YqOv&mUyzoRL60)q7>`Uh^s;eSoHhw(wM;uLtmXE2G0ZwIolH4p>NQY zu_ChyZZADrS-XLdzf0)4J_xDo72RG^c!S$o6vU!46!tZ)OVhZ+mzpOO_Ekf?FQ!zf zW_3>32`&i9m~<`vvG3 at 7LpmH{+o6%MZZ?|QJV6Wg%h)$eYG${OIN9CV-JeHl>9S5s zXzxey1iK5&X#um0*HTLX zsHtCwjx>$^*&!ZJ4}~`#Kdq;mW~gaiH+z-pf=IESg|*(ttdVRRZ-#d*?{RI52?D=h z|0z#S2|Vl-0RVur|5~{JM|o1z*zCW*dD}$sLJtTaiuE%3VHb{wH8m>3yaFPk)gghn zKevscpcsMRJn5+W2SD5 at 92#6q-5=qmjCy)sA^Nb1`ZZ~0LESQwHM&XGKB?wGxsXc~ zTx3Lx9r0EXs)M_9hKMAeLm8|%MHSBj?fzg54+S%%x=})FlpGiv4-|cuL+lFk3qTx^ z^dUOIasWl%>lc>OX(#e>@Pr#=cRGxif at Cej6qe54LHy_LP@PIz%zyv at SK$B28W6KE zu{Qn>Yak?EN^U?NF=VzmNk^D0;5YWjx;G;vz*olsh!6MnBS=0-EBDPRqee~)Ac zks&@^1tT{T{guq|?a zM!_R^LYdOZ6`}(8z?Z>LxzGp|;3-PzPB`4b_+cfa1WH$tMW?e0jW3k0GDnrpkR(P@ z^g|fHVNP(Ky(hnGfU4Rb$ zw?L72t|mHw0s!>T|C37oe+TM6r`KrN;iw?~#9Xggt;*`8qGm}gdKuZFv}#Lbg|e_S z1fwUc5K*Gm9!7W9cjH{S2(^izRlEUp9mkjU+yNA?B$N*rCBA{aa3`j2HsJTT5YN4t z%}i&eyq#jYJYG&~dx0hi5A!xIWlQQWHUj7u9Sm1q~sdkXiZOhp$TC2P2M z`g=AgXKi%YrH7Ybd8<`eJCmJAvVmnL5~|ZJ7fhG35k^tDho_Q~EM3|Q(k)5TKipz} z7Z-35RVH!OY?{4Bx4T!iwRvlXg3gtxh7WT;<>E(U=eYCFGdL*;ODv}6sM8r8D+J6( z<|<1HGA)Xg3w`uex2wvmBFaxFVzAqmo-4A+KtnrpoBHk;Svago*w zX-a~lTXmEtFDLbgmNt+!Z(FJmUbrvfdH;~o)>4~R7c}$~W`Zp*t(b#DSJTk0c#s`o zTmsiT(<(kRK{v5z;sEpMZ1?!t{gm{D9F~f0yQZi2>9U_KJ< z54sT8zTH(I)V|+&A|knC{RvGJ%o>qLq-WF?KnThu8bUPX7`}rR_Cv(b==>KzNLTNg zz7IX95{d*1j$}j|YL4gtp1zNriziC>k9`m3K<4c$Z2*Md)@VK!t84ZSXfT1mscqCg zmuR|f>JDlUdXQ?c6gHQU=gA140D?jp41%yK-9B)o{!L>yTqLHAOc-pA}if_hPWR9rD! zd<)`Dbw~WhEi3NO z%x8RJX)QYtz1zb`u8Cg%U(lTasM054sx4v1d&&|u_`Bom`8U1?CQ|b~YWC{m(lkwj zOf%=EQ$VuA>>mC{0Y1~Yi}9g?9Nq_t2uNnJhjr9DV~+I zY2*6hCJQPzo$v$kA2)PK(!{W%~Rto?Q2akEl!tVXRX$)Yix)u)^N(qST`f)p5z<4 zg~!`GBD(-7cqH4@%7E&rp*}g<7^2L=w*ZcXU!sH0f1?&$JSv{fkzuNs&OWVDsX`T| zk#If4uSL8tw??hza{6zgDCVIWUD-1A#Yp1f%$nHG_}GT)0<_GO2o4IJM;h&{eryv@ zPp)f+A{^CG-DSyq?JhVkUYi=WE+=mZey?a+tmMB6jb}@LfEC(Zq-02VEf!CXILJ3- z2OW^77sc)VO>NHLe8K!Du at KMLF(hCC00$fZ0Pp`yEJp*I|Gqh^)qU)hm(lp`b~kgm;jnE65W?ZTd$OL1B&*LRBCyidykc2+e>3>S&<>9qJ at GrFsi{2fgM3 zew4d%r6i%={Zz3=n?9hn>BsT9;fGeMK(a~Uuhzr`?TR6zvqMVD-3{x|qv#2^xq7s> z3Guo{viUCdwS-MY&upZFyh${CRjS+bc#)%u&B$#PqQd2JA_d6W=GMr5)6Z)P zu;Ymmz!sdysvh?~R$7&sIIGFQiSr5W#3~D`yPKI3B?a*b*Y(P3lHvuWt^8=mXcyFy zPbG%oZJ;!}$ka1R>&g2s=Ij@^nGRJ4-jBibv{R%}UaLU5zC3ohWG6 z5_n}-XVB!Aife)(P%)6W!C>* zT>cn!my00db;KDWm({!f=^zOvI+5mu$|Xgf%1Nk#E}hG_|M(aYEETE#zE`dy-)Ji& zp{h{g=;mlseXPCF-puw7&gf6D7=@Q z(7b`V?bBD&hDFxq9<=OBdhD(2qWfY!b*WEqe0^?x4OcWT4^{z&ORl zcBwm79}KHDZ{@FLb&t-$pbekgge~cFK7sU>pz{!T^}SGWeTaTp z_CNbjfo4#?LU&4mxkz7Gd!&J at kh*Td1U$lbO#QxrAhr_yk)ZS*dj=e50k&%=0r+b- z0UTWdcQAqMknkRaf*YV$q;HJukxWKKs9-)0UOlYJjwPENn$J8csiy__=gt7hO0}DiHcoZ}^L5#(;(We6$ z{s9LHH{hS~DMU6x8)W9Oakr at 6y>a|h8?l>5ix!#H*%>v7%+iw#ZlP$#Y2+vjNiBVt zQPlB_Y3kEy8jRq*_)~c-WuVR>in~#A?P~E0sXg_este*aoctrZSbbVTKM{K(pK&{N z&t?UswRx9DjX^UkRfZu$8Ed$PuXV(RZj8}uHd8WF#$ZF}3@j^yn zH at I0DYmdWPy(qi5)wzJ_q#y=*?)aoJvMh;Ytdhkf!Er`9&Xfsoiy7JdPDV%_R4R&p zw+yHckUfy#5{ER%KTR(?;dysyl!d02;B=@47xv`~hTTE41=v9+NX#H8ckNE8$XH=8 zZ*gM#J{&mF1EEA&ld^P+(qQk#Z7J5OIKu;)A&2<92>6SVmlqVzZynfZmzFGUI(W_1 z)V9(H%oD52W%Mk`&%}&VpBz!4Uot_{1KwCLpt5}oDm`p)Cg4u6b?w6TAkYXn(pc)w zz&knxc`Eh9)>&d=@KjvaScQXkgmC55$!{B3(%6t4aXQS1$}Y*%IKVn?`9F{oSs=+a zPaAe3A$*{#4#SZ18a2^z8*|yhdrxL>QTWK8*!mBxkw at a94-hgs`4_m1CWa(TALy1K z5P1vwOia0~7rLd!UOn;|x0ynG)PIZ`Y9bm3Rf%YYG(EvA z5t~-T5Fj&}Jk}zllAe)VC#sb?ZX=S0CEfy*Zp1GHHt38KpMV#39pBxugP8v*b4PEM zLs_scc>bx1ee at _oi0=WlpBA+gy%5}p4$jQKjQ;JN-7Sr7`+0-)cEkUHTF8z2iFvXk z+BI8NcY)51Q~H)PBaq9c_V%n|L#h?#)ATVpxVLRMW8%j-bp*C`FD*)? zj<)IY?nlqPmwNLz>9y7L)2NGJ@4%rzjMpQnqOMsJheBn?T$apj zw>jsGi!p4UQw~iJ2gg&m;?+JU9O%$6n^O*$T~F=085Z(WP8R0{&okGW=ea^7Mt}AG z<&)(ibCjbF7k at a{i-}q5Mcf6=GCTr^^F}+`G@{Def;F%rqiAK?O&}@ z+t?`c8ySjl!6T0EX}`#T9ig>=rErCqrHG~t6TjQnkTLti2v*{D9}YoURWQ4ljOr9l zn2am0U6&~nf!!5zdOwcb15ZlZ``xguhBlZj3$?7U;UR~&dYcEVEL!L2-Vx*iIit%&`y$sdhw4GGCHjNcy|;vTK_dt4 zxj%+;ve7Ni6y553`pZ9LWn(Vliy4ErwT=tE(#kJKF4$P4)#Zu25-W(Id>F4AmZuAB zJVxHJyMG#a7z{3uuSn6(mvy5ES@<`38W6I|>Iq2O!zRvC&PJ20bp*Bx+bd#6CDG<| zO5>(cnQlacYqCHI|fB-&Ooc`3_eMMoozBO#=Ns2z~ zvkK0%NE^b=DbV-F6QFwL^O^- at CP zkmPs6(`>1oK-`t6C;ji*UBE7w9vLtIKn4l`;Qt?65D5cYW9$EKNaL>Ef;{RE9c_}q z^1z6(@RmN;<^TnSEbd6yG=$_*y16t9pL!k$x+)pNYwKB}+{Zu=*#NRkRL_Sv)@*l( zs17Sz`|kUFwo{K&g75GBIgCFK8z%51S5Og-N+{=cTc=fTQ+3QWTXk5F?xu|@=zAJb zxm~s~JA$igmTpMnvR at sJ=kw9t at 3{Sb+mDoQXUpXh1ll2`u z3l2O;VUUsUDN|;|^|#Ncjl6uJTB*42n1_SD+Xw95MXW8?50}|ayW9CT29M3Kn#Dpc zM}l>kiRLTcNu|Xfp8eLO(rJdNgWvM5l at jrqCM;6-BYiC0v!Nn#P{2_O!qLq+ at 60Y++18B^g zLOWB@`sr3As8e7b!3Pj`vHQ3xp1cYTQPy)`|Gw;nW`!T}t6x#LZlo|up0en5vKAT* ztz`KNY5z1JG at NLG9vi&iFx4U at g|63*Z5_fKpLGkyMVB}!$;I1FTvD39FfVnz z)-UNs>D>7kS6PG37;W7l4$1#B!w%eOA5(w;fW809GJ^k~4Et|M&PPE;3RnS^m)`8; zozX`_NybD&0iuo8oB??Q`n&9ECv2V!r|mS0 z`?beuhap$*mH at yO2etj|$r~Wg`AkXWv~Z<+fXiR_SZ>8LO~E z{kGg6G{tWVJR;k!YI_51?)6+iPY4fs at E+lI-L6ur>L`~H?N}`m>GZp?268yQP)H at 8 zt%O$2aU!ID#eS at g_a`#|3wRL(`OnCo5z+%P7TENE#6yUTNJb0>3~|_ at EQ|x!6az at o zhN1nYX+~*g5)3pV`UY$fP|~91Dh$zo_CdetgCf5A<*H^)b18-I|7`%1Bf%@oZxiMv zVw0l}bu5l-L~6o3R(~GSRX^m%EQZkK;GLqCTi?K)11J|FYt^?&Ws&VHHN<#VMLFm+ z<2Y^Mq*|LGwlu{KpjK0I+=r at 6)HiqyuUwV_Pmh3UTI^pQxo`;A2Miz*&1|adB()v_ zX*t8h{?dS{D;je4H6T+1sU}I>FRu;OlTMmFE4+dKZ<081uMQyy0005;KMDSl&L%eh zFEXV5*U-uzIvXsC!X#q)&4)U|#eIb#cG_b~O(7PALm_tA{1oCQq=+kL6GIk8nyB!R z5N;G!GBVY0nC(xJFUkW>H(Tx`apMf99U61XbpU*>be?e_m-kqHtbbGA$qNP^Q ztr2JA6>yJC1B{?9QY;=Z#e;wGSy~PFn)4>qso^^mRi;kqYX&sZ at W`CK8Q~{NQs?gj zVq9p=E2;(KLY}0isTn5bOs;jc<8$gqE&c|$B{5e_`nc+0$SR|a?bbwsV5JW*7C?fF z&>6eE?3n_Wg6aQ^;)^6sB+)^!F&-|b74l5yHMNwtjU`h+y=9pfnQ8^PjWYJN(F9*gsH9&IlWuwh9)FC?Ir53B z^0kCxLv``^+MHPiYYRhEs4Ll6E;!&@V*oK{kOi9JkfY8`jTZvRF|vFv{d$qUuniFn z*oH0<%NnYu>N@%^^DrQTx+3-?Feo6pPx~yDkC?=*l77pY$QK}A%@o!u5^$15WPe(y zuawt{4`d6%o$;We!90PvSP`LxV&Cx=_4NJtmMGkqE6yO?*KNQfFdYmpl&4hwo)Blz zjHZ3-AyE^LVA2!MaA*!u7!~{jJyb_BiaHdHVwOc^RG8S-uGxiat=hFzb?O0-Kf)v~ zK-}l6IaNOJ&o^p zwlbWfUi#EWo~Sgbi990m9U7Pmcf|nhh-PN8A-#>wyGc|?z8Q!~u!OKeyChIQz+HK9 zlc2#r`3*+tv^wJuYHW=zow(v2|1 at cI2Kk+z2) zsP}PPuFxjZq^&LQe{xCAWl%@bv2ATfGx5dypFb?nCv at +l5_wF9NUgI#F(lrtl zDHnT_pO+PBBMv+qJ!k7--qHQ$|Id^4JDGA#1_l6ZL;X*RptOOZiS>WGOv+M9N at ke8 z at SLfCM5NvYG#8;Qks?`9i)mFSM5h99g&2etu)%~FBLl%S`z8B zm#_k5U7Smqzkzg|=R+0==Je!0dUiRrsrs3ma$bGEbsskQd-=fTqAQVk>R*zAL)Aa$ zx*Vn at j-rLw7!5I;Lab|pO%=6DjOS3 zCWITwg|s&gRu4ZoiQ~_5njffNq@;o#-cs3uE@?fJC!c|UA=$al#X`de0HyiYm{5~ zE2o8}6ewbq82X2USG0P4J;6d8qgruhMkC}bOCbWChMUVKBgA~3M&sSel&r&e1Nowr zUR6jb86TWUBT;&vs)Sk8$bfwFgLYZkJ`%jymWD1PBnmWFfd*TOdF22ZtK>X0KlTZE zmRU+K#k-+|mnM|RBc>-SSf9=a{VJ>5d4*z{^Ki0#ph|Sb11f&nLGisSo%MmF#UK+z zZ#FHm3ns$PMIXwma(B|tTRi1&OS^z*&0KTWO*n?Qo at Qg@BA_ zI97UN#MDO0Vkt%kh8L@|`PtH3alY2zCN{j4yZB%{;DU(x3OWxAJ1Dh(RDN_0QGgmX zQ~>a)fFls>f^-E#IH8Ry1B9!8Lzn?#Zghh<05r6RKsd7k%H0dY>R$*ex%6faOz>%s zOuz`snDx33a`K_R8s-E$2%F2`J#mLM2o^f~%@OL$?`b~~s|zv1RD{`ccgO*bCHAF! zMm$)SYZ<3UAj|AM#?WUUnsHkwA^<5c(W1%vKL!hFVrh2le`G!kfI120u z at d;e`3M32GmO?Y%5B8FPMoRuibssjyhiHqugF3-WTr8fJc|e_}ShL$-Gs?lH`uih1 z#YeJy{OP}GITqa}jRZX(|NPHZrzd*EUB;@!3CsxL-o$L03cAn)H at ww$UcHF3uO?qs zb}Pdn>w at i%)sjVRXzUPeN}(dtyws6#mw*jV8Q;B{eq5UA@?s|kg}J;8|9!66%HlCn zhWOZMC$1U^pV-f#V at II#;~jNG%02`RGx&A`eR)~#*=kCPY>v={NC-T6?bCKL@$lW7C z83xxj22WOxOMcY$r6EYTqaxXTDB1Z=-fN~7hQwU=l}pq@>9O-dr-7~GR1D%4l{K6; z&fM`d`*Yi)*cQpUu+mhQKRW&3>=iWKcft;!a`0cglxv99Bh->*JIr zKK5(MSJ{{mcE{$3FcMuJoysgIu}4SGZ_g}S^78HD=+{{N*328bzbB+0YF*+`)U)?y z>gNiB7tqoPD&@e9hnx*nY0w at X;LTkx;_7%##&lcwHK ztaEGhd8+2U)6t}r8TQSY(WFC{>r at 3xqDJblbwm|V)roae)fA9*vyM1FvboetxCGgK z!4mn2kXI-uS-*hc0^z8an)l2>i4%D>J+3u8s%^g61AG~_&o at CKSop-~pSjh3cc at Md zW9#Z7wy0{_Fz)I96R at TT0$_;$)$26F005-_N5IOMIGfx3r=6djtfRCkh8n6D0M}2G z1|XBq1W>Y!usQT5C}xq7#<9r4Nk(3_-D~W5&+oe=InXfwd-)aG&;TYm9v-&vzB8o*IgzX at U|Ik zDvj|oW46aE&gAG)S%MQhYzM}>R%;Y-7<%(kqcv??ZGuZp%`a^C1^Aa6S+_SP`Ci(z z=P(bI#=WKVM=jD;axm0kpr4oq5}gDSb6+gStsA}%I6oEjy(jHot}7-6v}x9Dr*F|u z*L7hapI8=ZHd=sgU50mbUu|Q;I#jB$+S#-^(BoRnZch^h^Mo}f$Yb`8{=nW2NDY>~L!GYkeyWYNUYS z=9O-AIAlxjs^eu2+kF)aqY9bwcvcyX;Kn at ZJ-$CxRU8nc3stAJMw1wcA+SBO`;cyl z>@?A^k|d4w-h6%?Cj5As5u&G^q-ryNaMKUxCBMs_!E(~6B=avC9Rt7?nOfv7OoCE) z=)|ugbg9qbl;~H>s?zw)3370+v(jZvdYijwzh8}#|6)@VsvSYD8`aq1m|aGP`qGgs z>K=v9M7l^2xqoY)Sq|j at uXx!9W*I74gnR)a*piK&=@Jy1V)M`M}Xwhua#A at W!c at I9&PQptuHVJq} z`T~D4jH4^i578;$K-lnpNS2;i1bX@`!IvCtP=DQ#zr_X^5d2eW%iS=)KczAmbf&)!+kOPLg7NX~M2Ad&A( zkg*eb-g|DNTtLlCgwadEwF%=xanAqt*ClT;p{8uh`LzR8M}=a0Zbr+RBB92??4g|) zqjTd^x;pa4n;Zjqr-LRrjSr8{XPLkIuv(nA at nAri#z&0{wSTpsME>K%nSE82#b?Od zGk#`-uz4{d$9#c#f6YJAhm~a8h5H57v#`0x_JphW6kF3PMO_ZW1ga zWMu3CQ`!QV-0MZlW-ECj(5p6TmP{H!R1o#goJl3+BD(FX#unFQRmR`P&R1XNL2A?^ns3<1p;9H0YcSi z#9erUylt<#+dDfq#V>Z{O%adqI4gwa`r->qw&T>3IXbx%8sDzgpIuZ~BS)dJ`_DEy zhRs%W-Gm(#zAuhk%*a(~xV;QzWNds2dMa8>ZI>e|J~p^cqK=NTQrhS=cvW4Q)CRx; z3rNIidEl*#kB*E~(wiPWE)&m2Ff|x08}baYj^h|DYuJlyA4K{_Ux6 zx7R0NX*gJe0?p^a*f(Y{=V4Pj1S7vh5heM=@4_~Wsedw&6?CP0Y4_P%pEu;ZL*tZ3 z8-;YBm7kXq$JlN4J2B;NCo);@X2IY~?VZx-yfl&IU zkGNVC|M)Y8r2S6sn!4!ojF^&>HD$D^ms3_=B^xu{%<*|+GxIBG=Q#X}uyQpQ-;Q~y zG2udenW*?vr%j__fXc(#?%q&%(uUsf}s?$9ylYgKLkN7RbT(FPl7Gfbt%8WdkaXHjVTp~DV`cnR`zWAq^%;O z;^RJWNJJ0}3rZ zMXUdx6sOL}xuYx(E at SdyDu)b85`T3C8K=>4!)1bt6Y{D`W7mK-gf%x#drOJ0WJ8bT zygI`w-CyNdnI)C{`V at vT@&uz)vMdKCvV+Gp2Vrjd0+i_k3!mX+jd2l^hc;XbQrYo- z2gzf at r`sni+c!=7t+TkwVy}G6mC{4AYfo}bT%Php4`5W=Gh)}c{O9Io;Yt*j$i%@k zj-W+pSvC8PghiSa_mzo^j|!9Vhzyl2gjpq1u{F1uGnsDUfOtne-Zk85HukW8`@9zI zV34|n0qZJ}R>;rPmuo6tjh85qDY9}j7)!IXmh{j?cyXE2`$GnUjrPa@?$>nkW_XQ5 zZSRjh667vel*v?bD|b#XWEYq4=19xbT9W~ntTrvD`2>+|kt)$D_LXsIUl)@C?8CO4 zMMJ^;;qi}fmq;}_sg)%oFa`?=bj#tPj0p`%e9P&p3LHUL1_e)GW14;CVYaf0^4!ca z-SLOVN>%;lQZ*pvtv=l>jU=??vT#$?QdNR|jslMkfoH4(Q9 z6~-yM-TKD&m`^)aY`%J1TtV6Re+0$XBZDMa#z(m-?XxPs%em zNZK`JLkhBpDLIL&^8yn72wS+y{jKJ7u_7nOWH0Yfso$ueQgu3LrbfiF zdr}I>t$A9s=AV9ET=v!6E4}~(M*m(aK#$av0K`D=!QYx!5#3`hpBJt at E{Fb!B4m_Cr3|2sStP#Uy7tpKY4EgRgbtGy|A6P6CK_GvFs(^9flru=H)E=uO~LfSD-ZbEG+LQE+ynl zoZ=g@`x|q_wy2+I1F!{NRu2|TduBsT_5}3r0}3sKLUdC2iLe4e at N5teJJ%a>M(K}- z3Nhp6j-)kotG2GE0o6xIf2 zfYImcYX(618wSpqBpRe`F5 z)nV(?_C*8qAk-o5;QYb;?SQ{<`dR@!aQ57Ncz|7?Hf9MwjDA8NniPn0lzK9WU&MUE zZzUSgHadyiz>o4a+&tjD7D6Ag5^xXIPoOA38$e$%j@$#ZPZXdBP=~%-CY<#^Bt+0h z?PKxJ1X=;v0=Bn`JN0Ji;{==nM*(pl?0NfF0(!vhmEw4bF^w_e@<8)o_XY^%yb<$w z#uhO_F`*dX_YD291P$uxc)l}T9Vkh1A2a;J{uHXD2l$F*g_OmRE#-zbZ zjgzh-lb^g952VR2%4|QKmPh^f3GZ0j*QSx%<@ahXKh at JumR)-1Z=3B~?v9_Dn%M=H z9YbT^|kt7FqZa(DVI{~V3(Ah*P}!Q0Y0)iiC+%$l at u zlGgn+D~8?w>tuAw7wx*$HsGBLICT`^Us_nj_Z4u8&% zIk+gEtx)eQr69F6Odl7s$j!EytAD`g+CQl^@$QBAd2t;n*=Hi(izNyDnY z#gF9{ZaQU%Q at 951kDQ~Q=`hSG;NY8eVqDyPw(T;mdJpsTi*9;KOSszv*Pga3a?DWr z-Qc)(~-2Ub9Q77H`$I-hI_1S?W4%7b+eJ%0jKRJ41uNyjE8HcB7k z_}*T9G|IyRQAe*R5NlgPXtvohVJ(NEafMjgiT4YUUBX>+5W`rxTJ|&YazS75$(FI$$z5DJoUmi?nWVvCKB47Hiu!+KAlc@#Fvq^ZWZL3~U>Qc!hj ziVdm^bZuk|pJ_iiy^zCWo7tEW-Nk>wOK;`o6*)7+OU26S1jJD zb1H*Ro+_FnFs!aoa((PyDppHA4eGyjaB0vsIV#l+V*KC&+tb;_^o~clHY at nCC$Du6 zN?GKBtx{BXK}!3-8{#T)i9U}t!&=LB6Vky*Kdr!81f}S*NU|6X88E}{<1*_af- at xz zwI6SU{S}&&n)a~s1V35j_>y>T)=F7|T?y`*F(u+kM=*Z);$IRt{Rv`q+9Vu3x~d#W zEd#e}&_FY>b)vbBpHz?SZ1o;fIgX3_5?}V|#ZisKr4G^-SsonZXdK|VK@&858uic! zjYlzL<2|!2-t4LyDeZJKC3lr?i6JzHD5{>YzMSBppVoRL*_pz1jw7XcxMC2Tx^D&% zg=M%c>qcv>bAAgUo@>#b54|L at qLwe+$9$L<`%FsFP661bh`ckv8}ZlRht^IYAyRp< z;n#o92NQ$((=3C1WB3Xn+lQx~D-!tZ at 3pLK24QBVo$;-SwGGHg= z4`?l3VGS!w*%Y#MeVG-T(ijog6hxr{W5QN!2uqE7s3ujlcY+vt$??+7yS+G$MZwdt z421h?22nym@$CiLVq<&w_XdnS*HzK0N=-k&Q7sjjl>{J^)!Q}Ci{c^B933q%p6REt z5l$NXeH%hP?iCi=mdm8$u^4TawI*;3dbiq{9HowKioMvWJS<_B78Ew+=^IkVC)$GA zjr^iWrm+65;(t#5SEYh?CXc94#$BA`|nPG;$KCUf4ddLNv%-^9j9Pqqz{ zn$msxjChoBWrAIty2;i}%1 at Z8mHFn~abe&(E00X~RFMsUxe{{C5Btib2 zJnBKea+)>Wff#+YrP!wCsgtl#FU1(ImL`HQH}=z at rkU8;(38leSh0G(OkNRAS^-%I z$R{FB&EH9a5c9n4xRTx0qTt8w at qoGCw)bh=B7GK%IH?j*##;iX5DMBc;Flb&VYg^o zF{S+^$e~ZM7)_kd*yOpQgWPXs8Q0XcptVEEouN+FwfuxVzEX$Gt$&+68E5V>a(?hh zE9~YZiXE>}G?RRvk?L94+IRXmJ8EXzlav}vB~QhM&4w{UQ^s;CyVUvAKkz`sr1vtLfA=bX5wFAb`HzP-&}&#iO zP{PDz6I$DM4`Ji(Nl>jHzE5t6sE$Ek|AdHhaWGrkU)$lRx%>EmTHSn6lIW>wDuH}$ zWJ^*)UOaLA(R1#(`2xAYg@|b7Ow%3S;(j?qJkwov6(}yvTTsg51h;iRpm-S=H4eFD z6E{jPg|-1leFiHQb$*Il0}8*6TZ7+_l%zQ)MXG$+LiVU=d>gR}DLwEu2`M$6vAHmI zT;okIy5+8I^J0xY4LIy!4t;lhmUqBV-hx7N3sfy&5gF|yUjO{Dvh8EMIT)1WpXnvS z8+76|t7cxyYkeGIZ*)t+(O!!PjD^vXXK26c^L at bhiJtwYNY(nVwcS_MJ#q8K%5{Yu z_4cP*qvW|lQ}yVB(wBeb0+PP)$*SLPX^r?yr=O#0DeS1;l5pXl4OC)Q+^*EP(|uWT ztn%n;s52UG#g&CPR+`*rlVb=SbEr_uDSb)Nidhz=9Hn~YR*ih4T>UOk`C7V{;vB0} zVpZ%pOpSm~j;MG5Eq0Dv+kzS)KX4yuoUS%r2jcT(wDj_rgL0imC0`@H3F3W75|YJ_ zgm~Ctlhf50gJ)eJ-1D7aK04w=XBjinNjv;`(68`vtMCd?UcG(mG}lA84sCD+VxkBI*$Zw058Cy3p5hSnE(+TIeDjvH9#k5jRIbQd0wP)Ve&urs!nt~I;;I7rsMRc&O z6W-y3BZ|QzX#3Z7m&3`(eKuSuPqSJnwZD7h1(PF+=&y-)Q!}_&i$;2OB!wbRf z0 at E3r4F%~*%pbLX^kF)IqM+5gHB?l&4Xvi+Tap!J2ee>?T(f!?jQ$d~sy<-_>tbr0 z32Ul660|n5`Oa7AU~TrJr>G3~^tp)NqCnk}^Sss=5AS~5(x9e4xx08mndCI6P!(A- zgq(`UwxFJreD=9yb36|WBEGc`7iuqUfU}D$@jf{qyb5kZ!sGnDq1D9Ew5fU{<-(ti z#6vE1=N`^>U&J%ScwGK=c;jL(h5|RO{A$cYs;F?f?yFs1 zgP)l`4N=S9?nN3ao_nE-8`&nu-L at otH-s_`?F{khc{Id!HPXkZJqYfW@)D0#Omn)U zxMO`ot&)l34NSV@(b9Q+`!`Z|sQUhkOU~wB;!}u`W{i3FlO%P*|pALd-)XK(EhZftz>k&JnF1#Qp!P93J6?#*!VnXWXO zz0QfwK6eu4cr1nV_XyJwj;5}}`gZPd6v_Xqv$KF|<7?MFZK1dnX>fOUcPs8*+}$NW zfKseLf#SuByO!b_0+beahajbRfC9l!&-(7Y{r;TK?s<~zWM-}Tt<1{Wd)}Ryd7k?j z0+SwRH@}HpuB+T7i5s!z6`sbO&ztSl8!jr)_L>$EV~^akc{?DQ*lFrAp_rPlIC1E) zWbC}gPeTBC--RTDmZJD;^3-5wjoT1>h2{6F{PGDqVSyRJ*#1so z-i&E){CK}|LHleY6TYa&Hw*JsOxe;%A z-p!#X$847ZQ6UuZc8i8PLAj*?n#uPaWs14 at CvK#rsM*YdL9BDst6$%B4eo0Dqf%eL zpOUGsD*cgWa1qAMYOh#WVlPv5Ipz8CWWV0Zw9IXsaS1R69vupe%aHTXMi-WtJxjc& zwdFtDI_f)=IgkY9;aYx+ZY_(k>j^KXDR-_1(N z*^kFPL?OGe*(IKBN}GYDf{C{pT`^N^tTocnS)={Rx*oWI(z1;RW8+UT8qP_~SeqNx zx}=c)g^G`Z{pE}ooVk7Sa7hwOK*d-k_tcLrCXnIX3cZOYtAt9%o zzI%@Vkwt}v at nY#?y}jn-d#-NS<>AI$;8yhE9O&#L02Sbv1|)pZW}_$?|ATDL0V)X% zVPPK^?x8CeG2TNa+KcD)NmmY%kXcDBA>S>CZFsg}d-uBzcYYRiN*pL}6V-*`+VGX)B zr^?0XYuGlMXps7d>ryn)J at hGLmCj5Z3;!NfuzGrofGo57z-U8X3ANE*NGwy|c#nd| zDyUfXR!Y;%r<}sJthS`Q)@K4k at lHXL?dq;ISxUc{e9I|EzW6p^=1WFopJT1u;6b{k zSP?T0e@$;+`}ynlf?G)Bqo7_ z-IL;7e$Gy`d)eh_G6RWea0DqiPorQlD(y=WU# zcEa-OKHwe}LJhYHMZx!)`1_G6Q%M~T!=*`!1;|SciS%Bx6|Q6eg3WIe+5V&pNldOI z_#tlx7>nFJgcx at kXb|-7RcNN+iUy}s+sTX>koo;v=cnu<;Td5B+E`I*tDM%I| zSfRXf9ac3f(qJT!8j(`%XKi$>)Eq2Pd0z8-<>wC#=QS$(G*%d} zBasay-Rr&7Qj$nY9Q`5uS-rF;{ahe+31T+QooSqnRmrL;r at Ih^e_wF at B=j2X+LC8M zvdfyJaQngm7JYm-Oia2mN8G4O5u*A)yz|+Am#*BQdslIjAfS!DDUBH0$tRc{d?hUeBi<1V) z81U}3gE0rw7gdpQXmkqFp?Pn>;_yfql7Qc5K at g{)+cV6l`Dyxhsb*(S#X*aFcQ(PC zgkHodt5v~E=GR)kY7RG at hS!s{YF!)?f3yYEVb6k3PY$PD9J2ICeXe-OV^h&?3|UGE zfuk&O at Fe$lg{*6Xt~V44ST`oo$}P{Bj;I};h$$25KRddk*H&}k6hg_KG!M|yVT^j2 zB*R0LkoR1TeV2Em{q44YF*9~5Fh|r)(Jl%eR6d95udL~LswC{n-y+7(E;5*t{5QSN)<(Mm_ANR!!VSJJ82mPAprb#8t2f?`*U z!z)02yWu`pEkqC1PfRnZA31M>C4R8d+W*Lpm1JijO>OCh&$Q|1;`<@*np7LQW^kymeQiii|I^BFwYb|t2n)vOjRw*1VdbwxI zPZ;r|GJnjkvH2C&FrF>-sFkuk5+qA>;L`q5M;(v-E=1KwRVH7gW4U at vhxi7 z>n#Ua2iK5Whd&CyJ0rWq0_IzrOEoaxi#3KLg21zHv!8TmUc3eCr&A9jQt at f#-#W|K zSlR>e$>-&iv|2c%A25Jj3?ld9w!b#XSKPRe`lt8;1pQq$YQKe-3Q=|KnDbsTJ1tyU z0gEuN4tPV}?5(klDf at Ke^bNihm^M8aT)X(${Kn#XWj+LI72_n0mF>IF zI?8>_s(wvg$+F)Rl)ok9M369KhGGbJ{-jg% z at W{7g?zMIH8Y%(;0r5Y(K|tNz%FWuw>u;A%*kt&D at Mnl4?dDY*Lc?u)4eG5zC4avA zX6;8W!kuC0YbSs>PA6H!kTNdEgvP9O5NCOeNfHxtSaBH;cy_UI*m+sdb)1ni(o7Q~ zx)V5>>-7UvI=pqcd6$4iF~RE+9!z<`b>ENU6t4D*%2GDFjJhJ4m|AKYHz+z-mP}Lq z7sGR$XVFp+^9{lc14|SS(g{fnI(eKph=L{lgzS6z0UWDn4+zlmDOci0SrsZ#Y8e%p z2HAL6w5TTK;=5g05w5V0io?|GbnG-S5a)uhk21q_KVIZOwjm(PC-ol;WLfFcaFnCj z3$hI4SsCO z?MIVAFd=G|fcmU?nPr7#*=3bw>1Cy5`DL|bsb$4wxn

sC%7lv9v^`bz*JzIpmc{? zhg64Rhg^qhhfIfZ2lCGj;-GheiImTAWuloRDOPho@{2~kbQV9zep}NYwZMv-yu)rd z|D|q++N3g<^m!x{D6cfgWp+Lx~ z)M$9JmWd~sFFDf9G8>UaMPRMM=?ezi5+A8arJZwoSH_q3MTW$X{&z?U5=!(=08ZI* z2m1XhTdlaVOxx3u_#9Tnc+CQsa~w8 at ZAbIHpXmm`s`>u350P{wyz&&f#=@RrS58 z%0s2OU)^dq&Ul}Y-OItF5|hHqQD&T!9prV at Y%7vHmapx at eal94ua~8gHB_$iKI0&F zF1k~d&oHKmn*OCa5!0^yYWioSHmgoSS<(yG$oK>}$hATRbVClIRf){L%#GSE>ge#>y%vB~^zVm6#S| zKotaAmJzK6+s0K|?0QUqN&!G+wlX2VM;Rp>3!!4Fu{?{ynAUE8H6=@Bb}E6bO?efr z-o#gH6 at Ar;k1Byg1O~l{buohI71VZ(nWV3fvK3-?UpMW-dMGi*Ts!*D#7Lpu^_Q2y zO5m4alP#P`ZWT;5BX8>1)47uQIrJVpRm)$uD)x?E`|}fJ|Jb6wgRQHWiW1_+fAYdR zD6#D?vQ(PT^2Ya2-0-cF^L2<_H_jmzSuPJ>Y3K1h9-ZILLG7F9gnnFgXVt61Z#wl} zbR^kqvQg7UT9aS}=?aDlg|>F^Fp3Jae4cry`{r9gXjmT?xMjM zNWrSEcAZI;VJcaTqWf28pRd=83Ip!RC3YS;b+v3DlNsc|WJkX^y)O}Yi>oU=780({qzO zTzKWj95&CH%Sk~(d0_4b0uUY~Y>MDJ;}ie3Kn{cI7E`WaGHteQJ5MMHyZ$}SmJ-EV zV9iJm at DB9MZS_R^tx^EV7EY|J(MEOl8u1~Z=PN>1S87lv7?XuQXa at sQ#ocdJro;}Gxf^jXc8 z%kc{IuFenaza4O;a}wU+^{p~q{K=LT>$dof_->K-u8sKaTKJIZFk1LfCdf4B!c8(y zwh=Ejnh!!BWLn*&y{39V1#1yYTit#}`hk+N+v9nZkru z?merPy2%zdm^!~BerOC(aT*su55ez}gQLQ#!Rp~=Y`3&~kTzJ at MAdn*o?f?oES z;oT$LVnVUOc?9=3w at 6UzzC6G^%B-8qcEHd5h`F9xoZL5VIHu at k`mMp&y5O5$0kqmM zGo}u5)7PzL0c+pxCXvx<-(trMH-}hvohM$+%KZ?bh~4b6U9<+9zOTk1{Koe3}mE)kCXCPW=B3BQcMej8GLYPu%|PI!9*PKZpv z3&!Z6yft`#$pMvFm%tAuy(NQU{tN+ab#Ci*H8)D={%+jBf%R4t-W-vK9U>2RhXW!K z-h{{jX$H)gK(wG}m?o?koHhOc0Ke)Bp#fpsHiHMjAxt3BTYd0gUkDrMX>PL;ToxDx zQ-tY30iPZyBGe;8C~u`3o5Rfzk8y&z7DHG;Xtz6H%ti{14x&|h(ddhZ7rAdA6k4J$ z>`y9SC_e9hkvyVY}|?KoOAAwx3}h6Np}v4fGOJ15<`tMVLLO zpzc7C(1Sa}xxgap at h~A+Id})m at j@JX|1uDo1Cv1MCcPJdo>!#SZ&&^Yj1?;wg9HU%5#8K?-xvR)YO7A}C=jVo>p*M+?R3-scF1^Qf|uh+ka zyG7K#4CVtx!kpGez|FlJ1YKnNHzCkDa0v6QFgy at k`|4pE?APNIzJ_r8vJ20Y4Fu>= zhP%T1!IwQ8_`x){)KGz52J~*C;857>b at cExG&9EA-*syZYzdl25R80#20jiC(S at 53 zx)s3Mp*i47FbALuTigsD48H6!W!En+6GW3O`9a{==+SgxxBG$P<{8Jl>{;mxRS?=qs&=C*} z3IExhhC2T4|L5l990PPvmM(#Wz*;&;@!AD6lIdcSDU=$=J7h#yj284>{NkrVR(;xN z%|>RE14$Y^o$B)}PN|rfcZ at NDlKhc1Z%AyziV3XWav++)pAzK3*D(X%Ve5Pox@=eM zZW>zOsqMazNC-S?-N_9+>NLBCWMPvdy+Lb|&6H*iMUXeA{(xfrlqWPolBy1O9_0X0 z4n6LnEi|}gmU2~OEyK!8-|hh|>$q0~6aA#v`|f-^ zm%)-3DSiST0xSL zZ?#iH at h5|yE)cw*bZEr#j3qX@!svvlKDj#EMd#q at z7mP0cZzp1%TN#bwhTav?$}0E z`ZYR2nwjUqs~(PAAZTWzEy|y%QgoekB75&5czO7W0Hd3FZGP6>lW{dKq at h9^i&1b) zsFc_@=2y)L{vL}UquV^-Rw5Wpe*0owQ%LSX3tK`dB3AdrdMq=#$7l%<2caGcc%Ej| z`;mm-#qp=~)POl>T}ggiD053SnF-0MaO-*H1DJ73TIf at l$*P_a at v-ItS%X z6)0-sEw=<0YbudSb3m(<{;M`%98okS*xkkZyl4{C8;$~R&eg(>fJ z&c;8i&`L_Hzjz?vFwk>B)urZgAvK`S_pp##A3h31R2~ib_MPZ^(RlwmIbzJg=gBe# z-zEg}cpso(QU);1ga(D at 4^6SH0_$vCdTuw>fzP4em$;Z&rVaAHqXAw+W%Pd5OXm at Q z_26{`u61C$Dwq(GFB9wqQjONSBa(PU4XXdvm(eSCP)(>WHH1HoR8 zYTa9Nx?X?gY-|!;ds=&XgID9yIF$A at KPg*K-ZDGWyQ1shW-G#i-(oU*_XVPW5O*qI zQt&ruughr=ODo5fml1TzI8jUqB72IZ5!1 at tQL~G|{J71%M9i}JIuRC(+EiF}csiBt zOy~3#8E8zziBG%H(!-(%-sa(mD#Enin&FDd!FX4xI>u${t?d{y(fZmo+bOzx zluv5$_z|p%f1SjK6xS_MDl-ZYSrctP4|A4pU7>uf(bYrA!dNTtRWIc=W&`H-m*)%d zo}E(c(*DU(dYWD1lw&eP=xMcEAgL at Q7yL$<@i(8?-Zr7O#cLxI2$dSlXS))3a+H>C zIs>Z^B*Ha}dgrj}AR4`qZbG=;d#_ at 2 zFsU{aG;%6#soZ{)#GACS#s#8a`Cb(=-k* z+ at SAL{E=-PJJpIK2HxU^+K>cX?YPeGiD85+V1Kg!3dJ3)3EmLbhpZoXLGBYjkKx at g zjCM&Lm|TJ=>MbK-_4DE5J*{8?$79N0rLUY$dr)^=5ZR%%k)9p-(+pF9gCO^Kf7%|kS z5J%xQ&vqa?ySjuKl!IoT2o%@zis;auZV~p$^0$=($JT?}_M)5fXW-KwVOhmi&W at xn zNqC#MY>5XC3Zu$jkk{qpQi+*2p>PnOIwa2N`fyxyhE~6LEzne1ZxVfIo8K)pE&$g= z0C9QWJA?)Mw$JvI+MXZwG-bsj%!um>6Nsk@<$Q3q(5|*(Hn9=YonjF$|NgN&f^q+; zt&;bo;+%6?YT!?AyH{h}b%7?H>KV)G^v0T7sU1^uPx>}rGy8rqIA~vpwegqqe&w~o zB8$qF=rpk|*o0T(+?aB%Z at j<-*NWwGC6!^1{Y+C=L^`EA_;UzQatU21d^kQRTsYod zac at _1XL;gSU;T1P{$ju0+qikr zXeB_up3DB;Tq<%T&m8BI`QEo9gpr*Vp+1$YK^0(t8k}22{(F17C)cJ$&YKXYR3o|P z_vy9^^H#0%=@ti#!%3oj4YSYS!J}eki?rIGUzQs$+8VMB8)5w5w at T~paNcX)wlrdP zbwy?icv|w*bPe(INx#R^{!bpId48Ba at j9u+(%zgX(Ez{lx$D|Q&_{|(W(lkx%~M z_^e(zp{o4D+s15&Fq?|rnDv`V|I(pPwRB}s5U$>mr=A!0Mqg=IE1H5y4SgXY!{cxac%CCc%N!6`^CLYP zI}W$A>W8)}e%~~EfM&zF1lsqA^8gQ%nYKo>4qOu>ca9e0YmGR-)~!jV4+EB70M_t$ zUX$`vxGC^3$`k6t5b%XE&Ohj;mz4r0hKB5h^x3=T5=H#0&P=d#phBPWvM&R#_DaEp zwO(KWc`@EhLzZwr#fWREKLu+s%Chdf*D{m7hc;^j7ZJ~?v#XDYXRAGa-m{rS(M-EC zevu`#%uhA%+iN(yj-Qq44eRUc&G6`ar-)4V0-US1E?Hh54c^Fd at UfV-x=sY4oALIX z{|Z+au2&cUYy|`3WHW?b?r(U}W at Z!`0L&;Sz@(Y%;_3xpQgojaUEJzn&4O5tvq98q zz|T`0IXTPkg>PDiAFQ%PfXX%%zqDAjO1b%f at CYC#ksiAE-_dyVquc(N&x7b>W z{$ko^`+Z at 3P7}JG&IX|FjVddxb+m1m4u)lK3_-|SBo!SR$vbaM9;pov at o_)0?B(IxSJon?IL@!eK2vMPR5#E&;-(pHT&;WGSyqlzE945q!=UK*`Qt`RZi>zqAxGELo*-^gQ~ z;~)hC5 at yl!M3Mz9G0Cd898IfJOGWUB3G~4biy&nz)Ev)+6$iz4$g$^vBDDJ7nn^?A z4Zi%)U2bO)p!gAO**%sW}rGUD!T6 zde!B{@$)X6@<&by3B-z;eLBb1t83zdISjWKG3kXAtEVfq!Rof*G_mOi3A(Svk==*W z8LdCyqfJX2qv|m_6KBRD_I(o{=!R5F56HhtQ#;cN9!$9Q-PN>tTe*ESbUJPc&KUc^ z$xb*rdNp&=wErctHEDA$ySlA%gNq__IdkWG}g;<#`j5qVFiAD1!gVzs?y}%W ztY=-cu4xZRd}Iy&4VVopRQniLqigUGo>>q`;g0ftJom_AVYyi)0O+P!dy|&ScNIO< zWOI7()1z}tdqIF_LLu^b6?x;W5ywfNA)sNU&^p!m^2R$ga zmECzScQl}O>7kc>uA94fTXhj1OXux5dnew zKOGJJa+`f>(t_)hB!1+>&}1W(VwNj!N;Ud=c)z=eq*5G3?={%3x){(`z-Z(Gwf%;j-?WDNhp1v{XXL30hOhN at XsJU_|62~zh~$>8=^ zZ|UuC6QQ$!)wW5 at H6G4bPqqhR&XfanvG$u at s`@^SBkvs3cBch~R~T|To8>|BPAAdd z>pWLZX^q}P`(2u>%S;?=tMR+{OjPZC`EarPDK~&ZF>DFQz4;QUJD-yjqP1Vr^v*i- z`F3OV(|QLHomDG{p3Zy>G!oj5Nswc-zcmUM)eq0$30}gFDO2SZE+c_J!_X(}5 at uC|zrP z#f{R6akHEi1IEf1yY5G`{}dx)Zm*R>v(%%+JgV7|9dl+dmorqGtT#ZNLlDDXX#8pU z8ny7t-LtVSnGlT2x|A)QLad^Zar(Ff%{bPnmUA`>Z0`9 at 3}1;bv0?KBZUdSymruOM z0qtjQUAYq{N4E`!SN6#L_?7|_(vAj419jE at HtKNmXM4zwy at A-@o<9)sp#x2McJa-idI~jUZ=bYmFRj)Z;Y!7 zLZJ92=yl=UPQtE~JerYn)#b)6v~!t9(TzZfUTN_TfpNUrh97&L>U(O2;WrndCX2L} z1Ro)FHtC*v&^Lgbv5pT`UzBQWQ&fITyW}o80{shZ1=HeE>e7Z-KFrQ?px4Y?UJ6;1 zFa|2Gpm?5oJCAeKn7Cd>z7^B&)hzKD;>5H=vYD$Et9jFqFZpoJ{Y~VSr>NdBH7gLV z*%R{O;pe5PYM-eaPx(`;2c)%n%qWOe{I;GprH2A;Wz$G}Q$mHHYCB3*J+WW62;?## zW5&@*FXvjFmxi5|{%I{^y5|aqoT(4Scki=1YWQLUOO;BZz_2X=yYMblR76= zARold?uio)_~(~caX7hc!Dycu6r!_xS+9A9ioFb$soV}o)54RDKWWI& zuvL7Jf2v*qnCu=}u1oJbkyCR)1C|YvGt&_moudPx+flA%oEzJ`h8B|U>K1BhTnx;P zp)m=fv*Fg5e1?bOPyI6xd|;W0;)oiTl+2o)p7kEm#dooR8*FCjAEojegZ!bf!K*7y z!a$0j<~^n47v*lxXZ+MHy0)i?h6Sc60y?U;FgG1d(OfSmmNk#}RKHi2?uM7=O6Ezv z5~mghRwlKDG-=wWqMv$lxquV_Lp-dw-Zd$SN^nenA&;RYo?+6gwig;qBn&`j;{NF?K1h106VCmy+^N(>f?uOK=zxSK#_jpA87aTUmKf+1-d)w&!UjAo0%{Zfs z)lGqbpd|mdWRgG1#{Q>i-hW>xKL$RItN%M7$A1=H|CsnVV*HPUx&NcU at yEc&p+JAM zApfr;f*z9|2k`t+^Q-?Xj^}^;zK at b({>WVMKgx}H4165q at JG06|0dSqG3v1)>mQ{W z{X2Ws$E?TJn}2j^{BMmo|Hsep$n^1#zM1}O3&_W$$0m1wL~HqPEbktp9@{znQH0%p zXzuhF`Pk0okLI2JGjo^6#K#vn{Sjf at zrEb)?_vMwjMyLXrvK~nV~@Yqoh`9WJQ9^1cBR&7`jRC(O(!Y_8RsX&8U*6P4t^fc4 diff --git a/extlibs/asm-commons-3.1.jar b/extlibs/asm-commons-3.1.jar deleted file mode 100644 Binary file extlibs/asm-commons-3.1.jar has changed diff --git a/extlibs/asm-commons-4.0.jar b/extlibs/asm-commons-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..8d564b1e029e7b4f5c984c3fa67293ded9962e5b GIT binary patch literal 37774 zc$|E at Q;aT5*91Cv#^xT|wz0>yZQHhO+qS)Do;|j0+r~ccIXO4q&3{qJ>Xl9>t2?Pw zRnm$w-~eRft|nUYt=*NM1@@OhuJJPTVY> zA8v>VIsEna4^XaHBpRhCu}&QjL1O8YaE<{!UZ&gfb{mIC;_A0EJCjW4G;zdwp##M*oN1}A>EH7?n-V4|Vhm2%euV4|uj#$l%_B`bjH~!R6Z{~qQ-Q#MfY4!q zfYARpfrGOJql2-vnTe~1nK7f0iyfnhgPom&y$hp|sk at blnUJZGqpO)SgNdz?i_5Tv zk7MdG#y`Jxjb`89o^*|5D2=e=8N*cc=s+MOn2`vGj4`rR8e>nvc(Pwtg5eo(W5YVe zZ&kfAEikNYiKcL!-B`&wM(s1(>BE5cTK3;w!q1_s1<&{7ORmpt$2wULnHk=8p36+% zsoQMd>DK7$%V&cwm?PXz>EQet`ch+KQ`Kc6w`sfRv}eF%e!qx1Rf`a`4?7obh at 1}l zTV$$=F|$<{PDpS)dRcczJxo>O$U>=)a#~ zg>AWp6nGr=mbG|Plf07?9$HyJqMe+{@usL%2&_2yd3CmQtZmMd=d=}TIza(Q4X>&{ z at DZ?V=}~P{sXpN;m{ko775WS%(g8}?eo7?#W&krT75rPK!~IGzHC6YpuL(O2w5WDl zInffbNU{TA^lFiiumNbo_M+ZeZ1roM8c=MhCV)C5xw8%GCKgwqw# zwS~g@`T~P`suKkS0};FN33suDTF#EpwnxlqmGE& zZNA~BAOGj=miVA at 9`BT6W at l(e>6EACZ(yzQru3rjXSAG$x}#3DAa2V6Hew{8C8}+8!c at h{-11IwfY&)xyX{bB zDSzxmEQ;MCcR4NcRbej4hBt^@Lme1=FJ>!KHf5x*i|{zo#XI!`Lf^pun;9H^C-ix> zaP+TsN0_jBcJb?keNP&qRb at 0nk`M{QViSFSlO_L?@xMXncO4G77t0X2<+T)eCGL60 zn2A$0V0BfnA_->6-`3W!2omBNdRq!HK5?^YL|XeYS=i!A-IUhaL4DTjGUDo#s8Z_{ zvX*nuWp}a`HhPbVX!7vNOWBw$uSINDwoZPt5w4_j+XZO|D+|#ns;I7^aL;b%lqr#F0fO9jeW4>zW&qWqfIP?Q5VDD<+K8pe^y))JSskErwr{lpUp>QQ2k6wx}^v z&XoY(cqk-UK>gmNtK^LF__#Q0Qv3FbkrJPBv!bN8EX}0yuSarT_TFW(opehQHp|hG zD4IN#hO7g7_6vT^%RwF_f%8FcB>UIGqC>?&wSHm2rO}8cBpe09%7?1r3 z3qCD&-H;qlwj!`nJtAnBC%Z{i0)+EI6QM%>Hc=d(o~|!#-p-LZyTk+m^X!f5;dgi0ne+T&QWWo_Sa%4Le)b06%Oe1%fI#9|2pN%R zm}<)Q_e at CK!1#%&gpt)dcb>D43FWyMDFPe+p5*T~@_~M6*K&db^9M)CEz<`>$u0AT zKnWp}cknzC_IKobN^CsyM^gsa2UrOsi}#p}h&h%SwqMvhX>9+*nN2LgvoSKW_$W3% zI~=BR>_V)-=-Fj#{LIidmid#HcmnfBxC?|AR%ke=stGk^PJXHk_oHZDE}amyfoKia zc<_ySDk=$88t6QEsnoK_4$fcTl3c)^cnQPYp2vqC#Mg!;)-W~j7H61sfP zI^}dwFfOIqmNN>|G3OrDKYNrhGM6vh`;bKV6OM~FdT|L}<*`dC_NWkdMk$y1!E at SO z45LujuH+6+)WJey+N+n!4JB;>J at L~oQ^8a&rLRgdb;*aI7+0^NPI!DtW(J8>ZdrW61WJASyHn9Gl at I+>lvAGqU*#@zdbt;9e*g#b^E{MWlb-4Ul^fQW$Plfj(m9 z5D1GQRe>Dn$!wCLG5ICUlAh5{`8|_yFI^L}aOm=>mm#0zfjE5o(6xGWUu^?eX5ru* ze&Ng-A`;3sj14rfq{X-mUx07x{#MnXoH2xnb3NfYxd)f(PsJ;7-ilE^rL1UD9lr6H zWTu=sHuBf4=_*~)z4--4ed??~b6o%DA8Xp5snOLpy#{&k2I-+scT|S4!CjT*>7F~R z!5qM?YM at 62=*#_U!roJ-^=RcoXQykxx{NUZ_N}as;VG!(VL|kG8e*sLA$hb?7fWkH z{P6;eVg0-miP#LY(6u{~A!Ady^wG?UO9KbB#uHKn;Uf%X2+01#PC at sC3(wm~Cl z&FEbZ4c at 5S#rV#}Ll4y#^H=%}deNRo+&&WGr=Q;NZpy?xO`F;Z3q0M{_J(ZHG2lZj*gFaG$ThE_0t0VmmyE!7j+rC$*V&(XigcB5Qj z@>MSISrr3pbon*;hSDoZW%+2ck4eU`a=##ITg_u2C>q7=UMM4w)#75Rl{8wli2>*n zVwtTAUB8@)*Sxi>4+H*JO6|UV^FbhjfItv~fH3~wQp(=Q*2~+>`G3SzohF>8>M({t z%j?a~^aLJQA+toS|f at DDwTF+)Hw;z5AhnaHE=xSdDVs@F;pMBTkCyU!|}UU4{oc&SUD7hZcM6 z7=bk-5|TdE at X(YbLC`d0X)dy-H>gITbVVv2u5eFjEk3s*%Zn{V(p{DOE&DRAorZr| zZMm`oyXoCVJdb!8R#lJHc~zbdwLocSk7 at ttSyW;??H!GSamFp%(U99w+`Ds2(u0D8 zwxr6EC+XJ%PY5yWoUN&>0O&Fk%c=o&rBkja^)YM0Rmf(5#SFKuFQE ziL1pvFX?Fg%$F|y%Y~{#eDn5SJ1cEw$?cSuuc at jIrz`Gz{91hVLe#A)pgb=M at u7ET zg-g!Y{Cw at g@LMH|M=n9ac;rh7mQB_FFJB(#$5VDV=`MOc#Jne4U*zBrIWvEnw$T|1 zDYuM+184W*G3%sqUX(1I@``zC+htQG3bhWQoJaa{fuFdY$~J_I#u7t=1GUbtMc%s| zo#aR?%ZB>*+Tplo&jETn+j={*KX<6AIN92l3Uvm9M2)p(V$0DVD=hq0sl#aJ&8p=+ zyh*aSD6MmATdp)A_wC4Re;37}6i5da at wIaejNwN%G$)_!k7U39h5*ZQW~^=heh##~ z!|PtumWP*zuY_-mgu7f^GFbB06+vuk0{^s`GY_H$^8}Xx5CD_V+R%-iWcO@$aVJDd<)S8IFVSP3NX78NUq8~@B_n^aKU~ac) zIlcK2G<_VoE1P5NwJZ}7&r at dG?1#Q|nkC7M;RJM1dTTz1E$X2-9(@Qiuy;hXmo%bD zSHa`tN|9^A at PWxjj3PhYeO-fkMggN2G54183jnVmddMFY1JBAS%FhBF&%$WT at 6WYv zog(E2PF{3Oewtri!NZI|UlGoNkw8zWz)WqdnnHbnb&u%0i6+zf$d=Uoqz?%Z8AmZ1 z;}>i9DVFJ^#}7{t=U%k;X`Fg7diW9A{l^-gdVXs=-Ys4y^UU{|C6n8^n1B91ky}x1 z&1}V~YfNTC>g|zTd at Em@phD|L$pmorpa}E#sVd5)^oJBVmcr4CBB)MASBuI$SihE! z0zofjv7>&>>^l#2JNS{!wQsK^5IK+3k~8rhYb#SC#k7j7U{do9PC80sbN4hd!iCt@<7w#EiHk~h>n3X zST^JwOrfYcXH*Ys$7Wlh4}eu;DijWL1K>Lb!#ZV_2!oM<5rW>d;s(>`%Jz|^Rwovd zFEYjdX%G&-dQR+nR{UL9JtxDv1~OXX2$NcQ=S8Ky562`GCQ~FCHaYfiy!1(eS1}}> zSvizpm<_8jC!Ay04Xd$mrB?cB#w8wBV^j;f`o|NaKCBq*jp2$IiwKKsO{OtnPbl~s z;*S4~c~Ai+pV%{f?-VdV^hQ5;>*olybs1837l_mjob_!C@%9)34VHlR7rjFZ)`0du z4aqBQLi7K9hdfv#uqM{4H+LIC_k2UriF-r&_MZg=G at yM&?acxlkb9->Fb6jQ0mPmW zdkug9QqPRNTfo1&LH;|yUV#$WOdeQ;6W=}aJ40)~L}jeM{H+F$NJY4r#gAbv9; z_Qma2xMLbL0WhNWirzUB`$7>=dV-c0KW)E(s}2_AXY%|O6!P)BEG|7T;jzH(F zG(UXnccaZS5pD<659^W{e2>;u{4P+pYBrjjIg5 at sCQyjriJt+lCL*H8D>@xTIv5Ar+93j91=G zMLLXls{Ca{>TVaF_h0MY_?IR`LHHXkq9D|12_TY2?uiV3MaA+-CR=Py$O}XI17gyf z5*Fz4B$7tfn~^7pDT&w9dYlkOBOv_B@=EZgX*(s65!BT*oJnGDTT>=hmeK*tbv)m~ z=^`P at 86`Dobr&XXyS)xBjxI{HO`e;#pp&?l#%`u85o at L7qdm$;Xbi+mT_dW2j}PhT z2tvyF;q`JUM2cn;-(h+JHb-=%Slx29QX26}t*MBWLav$8W08cUkF*t3GSe%7-?FM4 zYA+==^})Zk3?OYN9+reKSqN^0?dQ$?J&ZlS-32F{S3On?*F;oDY*daVlzT9Ah$vyc zW5CI{F?rMtT<=$833*BOGr$19;)0h8vor8C%lV`kO(|-Dfr)DpE=iuSCZT~a%~??s z(QYV;|FwB4VJ%li#|;gEewXmU&cX!cx6^~sZWB^lJrWl(DA3uZjAJN$A1ttj=V-Ej zQ#{R5d2d>j`32kg+62LXC$lUaMY53U!yocN4(q|aw=?{RGYUE at pe}Mld-l^(o}87T z8`Y#sj&n+L-$%gsGR?muNyxZ(2w|RUzR8COmk`oLV3K=^yhhLb0hXOE&*oxbzJnbW zzQ}o*+4%O&CbyIc!8DmpXf%bCq-ye*LQR)E-s}P~P&GbtX&Ki3U|gS9;(`Y&27JhWEnkl*`ir-t at bHJ;w-;yh z)ix;m4(N!aKL#f<++U}NOv7+Sn&se}HC}WeEYKT=1osNW*W_FXq5~-TaCW%c+^EXG zG2+u~pPRo?o~GT9+2Ps3BL2D+_fE>>8O at 0h1m@om`@fAAZ`k|WlOn+vaF+*hn?Ea{ zK}JtqVH>I_e%C84-D|mq@<%w$juyV46*bn0HsC$D2v{e|r_Ig3so|q*ustJ%dHzF| zi_yVDL}+9&8WT&9UsPnzE;2pDM1+Bh2yTz2EB8-aRmbG>oOsRVxVz?ZHHn#4<=tE} z_Zz5l*xz66nub-%U&-%|KVPQ&?fM(XNNjgqEN9=_vb!V=wSGkx zDm*;-mZ!8DLG0v`uK~RDZEwT;Nk+Ay)^Vi&a;IKB-f|Y=aUmy0BtQg{Y)QPkr<@i9 zTh3`+5Vw(IF&irvTNswiIB9=*pA9a>O>8H*7V^eB7fZ27j&(}^b<$q&OmIY-$Z^`{ z-VJlkQHn3=lcW#gcqp)yCW*z%d9(XXw4fr{K-Bm6FX7#5Bl3j5*=6$iL3`G;)JoE` zJl~As9|nrathUR{k;>P5t{uO^(2|$pQB+`zsblhE-Ynn^Mr>|`uJ)y<%;yvcauWcIVx at WdTg$WQ{&3IstKc*cr8_ at EPLx+#Ln5Zn^V3Z6ct&^V}kONfOOB3axp8x}98B zFIS(oe10NzzSh%LU6;_Bpu1D|)*9AfcTc^gUSl}y#CuRT at M;z#(~aMr<$ZA at +j$e< zeguu|O~*V7y`QgZ161iUo|fmh9wMcWz*B`z(-j-m%Io9H&e3|YlrL}m^m=+=3ER$3 zp}z8#8Ox`x%^>{UZ=HjA(5^7ntagz52(YHFZ{%OaIax#0(rua~u>n7j`@Z*IYuX6d zCVIr1qoF3>x3fMq-DfYN%$#+ifG|?S%rA$Ul|T*fa3cMD6O9xw%>()BJ1^PAmVCO! z{o)ve_%ec4jA+$;3<%NLu6%dc%hR9!r?w+y`IF;ik#{l>T<4I{7Un7Eyh*c zsCZeQoh|y4dWqr+XY5BDBjOX&S!Q(_;iX=m;%c3?QQJ0KUG`xo!3kG%Sdc;u)GF|6 zvFL}qq|ZuYbvk{$Jx6}45@*lADcEZ{#4As#HjGP{E~M-BLcPs?u2J}Lx(X^mbum8L%5(anPKkzZr9bEB;Q3ywE^hly4w-Y0KF9a*E^`L(iU<0WNg z<)VGP-nRQC)x<-`jsCE{OvNFm%*>=`$@YS`{mIKa=U=cB~ z_^PO_2y#m0T!Tu91SVn*nTsqmqgPGrU_|SsrkCvrXP4WN$yp~ibHx`Q^xp=<#R!j@ znHNgJf5X867n(vKVX!iP9*BA&_G8H~L%cTA9- zns_=8wXSqJeYNYQ3F*6q#|!~;c#%vJjA89p=x`P$NNM_t9eI0Nyu7$-P_QJf3_n3I zKHGdA)U>dm%SH}4fSj4N+~YDX=jOWCrzHsz74EV8m9JPp+5CmDGpvg41!XYaym-8A zXGg3JGb8(Crgfn~V4<()q&00(ZXpL*Mky)CATZihqvbQ4b@5)v+q?dm{<=~4>FxHix_c-#61n>Q&$TH2ZRzSoeHlJ~*@lJv zJ721nEQNl3{HkU=uTQDH>%ie%ii`F0QbZH#vj%dqL at p>@veHS93;RkFD?0oDl-w%aKf%3Mq=6HtKHK|V;o0JF4u8rCzL;xB zhKE3T$~=}w3h>i1BRAqNR^6FX)KOCpuvdA+R)Y_xx at d0RD67nw%*m<#+oNdC{ zPK%60X{@B6Lw6%(JWBv6LW`M3PhDeKtxeKtUX9!wHaTQyFJ@<^W(L$ZP+%t&M7 zsJSu`UUu9jEs;DYil(=mWm($YUQ{cET-#jSYcN(61q#e5QB~PhZBumn8(MvU7A2jd zU0rEcX;8^EZuU%%(_%9;o}e9Tu3wJ4c{Fij%Ei*gkz1Iv-HF!888^|tI$AKsT-KnY z9aFzjGVt+H9fpqIHraswdoQkoybl~4d3{X#MZ(}cd1d-D at N_9+sTT1 zCPvpxbK-Jp633bbV+EGw0O#oMBmy9$NEECpXhmJQr(0MFJsfawy`5KNne6$tffG3j zj%zJ4|6&UDLTu9n!a}cW{}+0H18W{NMoc)UQX+K{Ea at iEgC*M`s!rlpNRTM%sy%GI^g! zypewe9T*w0NyFo0?F_VI*JX;>yfB&nu!m(-uO5>ASwTjWXlf$IlOqG4H>@l|5W$P5 z;D4)R?uaO{F|iTG=p0SHzadH(MeeG17GayiPNz>~m_1<<8%%742tI2eTcw(bUYQ)a zH|3OT^CR*|orJ^Lo?Eh$EJlc+INyUs1kCe{_!qV(Gpbzq7glGh!w-!6T{aBi{}A;2hDc#xc1!FZvrxl}HrNdlZg9vI at V8r9(u<+Bny zskcCc<)D at FtyrUs2OciUlCAu at M^v-9Y%@l+ at Wbo~8F%0Z313Y9BC zKell9QTU(bF+gFDUp772V7SdX+ at 4g z$oyL#T&T9JbIkDhi)f|%-*iRAyg_K at 7Z>WuMc86y8kdKuR`gDCE6o$I1)gMNkwoMR z$|b~uE!osUl(+_7<_r^XQ$uD=L-0{<)*UhzbU#y$HSew zOTH}G>d6hLX0uinT-D~O`BGz+!B6Lr^_4=#m11De$fB=x%PVP(}8; zHAR|}Hq-~*Came&%X?%9GTV2%|9E%fj5TMD8R5vCAfB>kYo*pa9$mbJ!*;``9?s~N zyseaqOSnV*N;Rgzw0|DUFiy~jKQTq4V;+P>6P0spf~jX8jHBpW2fSwO6~g2*4W>|d zP5=~g_OQ|TEP_wv?pV=!4TFEl-O-|b%>V+}nDe3#IENO+Jx8ENWAAEF@>z!-#XZNN z1v!TpWAB<#{H;P?4JQNnE?dBQ2uXQ&}s ztCS;msA;Kx4=ZRTo?hRae51pDulmBH2C&49339X-nP_YA_GrfnrNc>j6}S zxe0=Vxgnp_F{%Y at 7D@(Ri>`wnl6Ml0NZo-4rsAII&s;-RSc;l9|Y;gzOgYf~cXnemLQw)CzAq^%# z6OegE?x6$|qJ4$#RRDVEv6AJ3+W?m^9LTz&j?9DN!7|VcZF`Z`(A6-QXaE>(7-4`N z;J>F1euQ2 at 7KJVbYy&Q#8HnCM2h9LE&*a=rr0{k1bZ=`M(U+# zmwsyIvS*ics*w_;7&gkWwSIRY$_9D>$bjZPNnE`Mf7SeRWkJb2LZw0Byo;hi&Af}! zzaVkW;vbPXdttv4an6#R(s}wyhq*KLCC245)C3;oB;Z>e4GIMvwEDp2!HAP zb!9=t{NtVAiF4{BmB&5mBNrnxgmD+TNjN3!!Fpxf5Xz|`_4@d}$0){)DvPUq+kSAtz3j+U;3Z+k+YL5;=){!^FZD~o??qxuI!6`yO5%@`Lo zqSv$$KTnbWxk at c1Y0mxxKkh%-44PqBDi at R2F2A~*x5jcLbzSWSW-^T(UYZz>#4&lO zL`%*sGk-d{$35Vk*X#}c8F7 at T3v%x64uC&=z4w15qkr}~rNlq`J~jn(oIR>kVoXas zrhzjpo$kPkiy&b=QEylB(>N6GwV81K)j3|VgR0nc6yujC<@Xa$FDS=gm49a6RZziwGFgY|B1hXdY3D%1^xq|MZ9vK+Xb0^cN%=l_ zIprTwNY6>o-h7b6Ws{{9#6CohkwJ0pwK4Qh5u__s8~*GK+~tj?>f184DNe{WxuJf2pE2kHy z7 at Z!0tb~^ZjDPALW|v(!&z%~4Gyg?01$$5#{f!g1Bu6;>UdyF^dHq8F)I7hQwEerl zMiR10Y=9h-D4ueRVs95-1hw934)yrlq!E8Ne6(Pr-Cuk&>f1zUC-AVPci{4R?)>4( z5f-&7IG7var>LGaLjCwu23bKI042M3og2PP-r~&Uf?=p5>xdrcl>?6z$O%P9y%UeV zqwVKyy;ZP)pd#5&UCKk2WMU>Th<$u%Hmb}M;UAx~dIi$JINX2Vb&fHl$Q+FR8O^#L zz`=a=Pi^?=*Dkwx$I#!H7Q=W9d9K7aFt^W^74Ys9SI5-p9eQOxeQOA>dQIF#vjaYB zm*1ymiiVnf;8&&1;N4O at nmdovpQRY+_;VN+MqLZHHq{ZNVgu at gaZ^VtvST*Z0Srw% z;cryK2`?B{R{ya7ruzi4Wzwg)w?7brK zMZTfx)$jWzhqVX;yV&6>w18doaHn(#r!#c9X*e at _T3j`3xtlGHGb at faV?*2$z;_zB z(=E0c<3X*dTT9Pe^!;*H+Yqn;U2R`#J%1$G5#fZ{NCGU<9e6Q}J8Y?SrZN*U8u#6) zMzY3R5|0n`{)%oc^-f8hBe7n+UQ&x~8TKP^YeZ~f+lTv3=8V2N$9jzsAdVTL&Kcvz zIL&vT?Ja|*;?g9+HaX#^duNn94F~q6vh{Xc?+i69XCiK&Eur|)06+X!FZ23Z%|pX! z#kP+XNByB28?Y}7eN{r=arRlnZ!Wqn3k&4O*M!~sE?Co5&Uv0j6=2V4U$ zX14*>TqOhi!xA(P!?Cg8MmIKXPS*D8oj zwQf=j)!hz8_oo82KXC2fxfA|zxKw-}Xy`bXmeD_+VK76%myb#x?LJDbd zdB}Vn7WLQE=AT9=V0XYT21)nSX~}b4Ptd2^)#H_SCK!Z@ddEY>j0w+UROC^ITB<`eFlF0ZIEy*V{}4M=I&&?VUUO~ zUQAKnl@(oV-_`iXfe9AO)rC#%h-FiQpV%<G!%$|}a)r$i+BzQwx?UG<)Z~hQv2BXNITlDVw1t_Sy zhWXH5b%(>tR~hApYsXpjMnk7t4yMihdV;YwU|#N>H^mTst|Kqy)og&~O-efRdoT9c zU#PX<1dSUT3#aJ54vBORr+1>94d2APSd-7VkT}Vv)%o{T<*N?AD-8+PvT$GK__CoL zKT{doBnac2IaP*c;EHlDviEgkoOA-dyCU}l;$~Ir`aUR)oO|cM(r-jAglfijUDW%n z2oD}|3mnmzzp}y=En53mtB$Q+ZIUJx3VA0=2eRo$PJ)N4jmqnqqph`l>ze%9E4xcM zqfWI at +u68h0r$a_E#@%}8&y9)^oGsqht99B2K%qCxY`wO&nnsoH4TyKpI>4r58~VY z9UoR&Ooo;EbiK-KYyg>pp!)KsZJwE1HrYWa`s+g6d)2L3{cL4_RzJ9wNSE{=llXyu z0-l?@2H7!s={Vmry0$9T&e^%*u7yjwjo1hBk4EkrbTN~`yYp8FepSm>ZYMW^NenT& zR(Zjq%}br*(dB}BDmJd!x{w*qU_CRyb?-Hfm|&^kkN-_qm;d$fS|g(6TJXyR>5BDhN*VrDIL;d`&0_rm z$jB0)qhmMgQzl)pMr zCP#oe0J7Iz)`XG$NcKPa6o}my{NZNnE@?*#j5$6 zo5?XNbL0 at 7Nyc=-+Sgi0074z>^yQB%+7KIV(X6?6u4M~ReA6*We6tqHqpfJ_ToiB% zhC2^$=<={9T13N2fWhtHFuCP}{dKOPB`Ll%2@@t+0p1QizomQsO9!o`Ve-_YvG}_i z#&iD9HkY`SM+y$=bIJUyporl5kjB1}-50?m*1>37YDY8oXXwcKt_3N76|tSVlzvms zxkmKq6=bJnOm5Ee2l^)~4E2jo*)oD6h4wVEPZjbl9`M*L47{TS{j*U*M`tGniK~@^{r`S`(1P()RZAD>psA9kflwWiZ^8nF zNdt+7vs_C?CSpd$8A8P at s-#H{mR74&)!YI}lLMrQ!4%pKp$&)Cq2egnc9-c?SZH5k zZ#tE4=G$-PJK6eRS5)-i=l$FI)IY{JD%$mZd_MY|`F~T?fz$k+eji!~|MzQ+D9cXE z78S at Ozb~FY08N(Bf9XdBL_ULaEKz9W^2wUSP0ETL!9{A5U$oz(BtMqhky%lmT-q9R za27JTlvE{#B&^(7)8l0I(@|4umAVk8EO0cYJUCWrbo!hm?WS5(iJBPNEJM3XOvMue zWa!lS4q8KMKIp2t_(;FD=9LCHn;eh*Ay)1k-}ewFE5cEqoA$08Rk%=MWb}6tz1VGV zM24-|Xt>Yy4Wo;-mCc-#grMfN-Vcj9vl${@Ul3vY&n1_9Te>x%*oO%b#Dz2a5PMb{ z{&Yv83gM~texCB;EiR+DF`rzpS)RZ_iwrH<|H~y5&)j{$P*-11 z!~F%qpap86_-C=ooQaVuC}~L zap}FYe8@=k&nDuxBI9LPx{98*mcDuGNj7(xw|MpW`Z5NZ+x9-v-(oo!Jh&f2-B$a9G> z>%<|j42{lO+0%3$e1;S9NR_u}Hg*_ITIE=4EV27bv7ik9$YGae1XosC2y7nhtQUXY}FyYQP;g0nNMaqG-6BEWZB9+ z)B>VMgT3#FZqzdby+DW%TAk5cQpqfzH#DEtbX>HTT{#fcvnqBBMBPVpHEc?jcqA%ZnI?;kz~Yzhe_dqZ zl_#$Xw|!O8+*PD>tjEGAXb_%KT{v at H-|U=hF+r5p7t>lJq at JEXG1Q{XLf={)da97- znnKRLrO*P00XZAY{k8tnIkBNJdZ6W+l9HX*x*%1P+qxlTlk3`%a^tknC*M6Q^~!s$ zM9F_rI-1uCl!G`jKO0J%oJ%X>3|W;EIXCBg$AZNUXNI at H8gwKD(!+PKY>hBQe{@^1 zA-FGI!+S8Hv&I@>P1ePk*zwt*Ri at -fpFwh_B?INmbeWQha*a?W*t6QGm)7Mlj$Bp9 zHF{EtqK#;PY~j}7=UZV8NuzSCRFiV7)T46jOS5tD&2 at c@3#Cs z^|l;h>oF|1FUAN3XbdR`L=6WKNhJQ;m|7HHluta>7;D5W5?U10-9_ zwL6`=uedk2#~5+;1O)F(F{}amY>n&~fdclHf;I}w?^YK#<>0yeV~&yD-RDdm`_LLb z;cX>bVJ1tHaySytbPBIdh!5Npg0o6_hK!7gNSu9R?E1xn>#jllqj!)%v+!HiufTn| z at D42hvAd4-Cz@}B-%rl-QXf$<@-P)K@{5AqXYhKaZ;AV-3_LOotY5Uifi5bkhOWxA ze(*gUyC=QCF}Hc{nSS96kmAImNFywuV>k*tC(G7frsRF|a2+grv(7jpbfD$0;IGjA zU2FlfHw2&s1HeCO{}#*t?;Qt_7yg#zD|7!A`zL6hKl~M2!0?SSJiz>o8aRvf6Sn^g ze!%oCa$f_Uko7BjzXN{2Id zK!jxr?;Z{xE(-}If+ at lg5B;nLdM;vcaxSBY zP$VE66n>TYh*fu%DbWZSXc&%*70!gt1aEf7ye0pBwm|!Ezm=0fZ5dPaYmUee#d&*7 zo}*N&pHFFx=0ahj!X2_8fTx5O%e_>-prcZ4DR*i2U=1;Pua)*!yr6f%A<1aPMVEZW zT_7Py7bwdY4vTh16h&5jsNZ)$q#vj$bt#H7=MnLk`xwF4{(v$(C6Uya*jP>?p@={1 zJNwaVA|sPRCRVM?#8}u&uRXAQCUPNxV zZlG>>FTy*>1IiKWSV1JqyuLZ5q=KYCDY7%|KXLG?z^PEW&?O=D-#0sF!&;LBPm at yG! z!@y1U|7da{mmEI)8$ueHxkpp^u}Cy{PZnOhx_uK>4rTw$5ojRIL`SlIi4ka^U3?xb0d;=9IdETYSaO7*?p?-AspKOLH9pMzK5(xyoa19{SM90=(&c+RO)6SP7O^A at jzMMKr8-xsRU60|xG>y)iWV<2tFMMK#| z9td4lcrseH*GEIq>)h+l{ndzux^@}nt&UPaN7|VEZ=275jfm*iWD17=4s)4!X{OLu z=CG7Vqpyncn}ED_GK;Y^PH7hEQCQDk7X7b)qt&UQz@)}))v`^=>ZB;IoZ`x&R?li; z0X_-}t%y??n4#C at Oi*Q~_>?c6&C-zSEmqKwT0IeaY!>#_utdLvPe`u1%8Mz|u~Mp< z$4=oXW}#-S2Vt}rl+; z{E;c+0LTrqbt8_$#(9%+mnsn?196UXD@^TbGGDUqh5jxp{xj~6nPGr|nf=T>4XLuSEdfosJZ z-bzNBRQs5es at J(+FfaF^R$Be1iSlXSr+ at zd0Y@MY_`)p0gj?x{|r+W~dgFnf;{XN8xPdc{h$w1$#xVs*I<=Xq}V zl-Kg6%Z4Mu20Cvs2ggy&#b+aDb8|;m#>YiLe|gK>U-*3b`M1ed?xaTLnF1E^epnfo zaoC0;NvSaEBWR}_a{ts5=8 at hQR4)l}!S5fCcQ{X7C|VWQFi+w&Uoc#SJsdhmR#dZz zRRcYyQseRlDryd6pvwnWfrTXD;+c>iSkg33ym~o0SrMNdN7aOO3K>R+0N}$F%PcFLZxL?ROq!@b2ZelAP zomJZJ-FLiLi>W~AgjGsO>l}B&gANDku|tO{q6d4$643lhyRrqT6;8?tbCitk)NS&; z)Uz-|i8q&rLhhF0Z|9`uJEfz%e%C{v-|>W?2^V+#Z0J4TWa6kC=52f_mmyPr#g7KN zN~C!{GxX+I9a^`^4Pe1`7n^xLAKe9hg31K!9!nK%tLBb{2MQ-RD`ciAx=GV;Nz<_R zy%JH$Dehf=llbChnn##`g10xuY+6cxwp(Ngc&SzM%ad=XG_z)&$>D}aV57IoW`HHy zSxt$+Vn)TLu0u^V2S-mqzi(a%i{Zw4Kk!PAK9&DZn at vOY@i;-F7JDtPRSo_eO~08l z3qGOVaVdOKONtWsrs(ooKkk}ZM!#1(c5dL^n&qUx47jK*THX;|#r_ zpRAjyY;2J~Duk6f9qaF=%JlO*;XmgYIDViITU~;mI-*0*&^{M!#PT_!NBN2=lAm1n z5y&*Nle?DVNj6s+X0A5csXW{a7 at 9>kghhUoirrwA!-1-nBW5<23O$!c7MH?*brx4i z-H5l-hvsd^0mPzLPMzoTdGEM-uO!c{6s^7qk3$UxW73RG(?Om5>2=$|cHRuH%dYhw1FLAvXPNRu{FGj{z(vQdcXicgL;3sN=m4n>L_xCoZ zicQzia6#F1sNfYtj&zveEtOl- at rs_qV?=3%q}(c6T-7ygB_65^CVDR|64K1 at jh20A zn|Qh^V!@A-*xI6MTDcC^qf8!l!H1XrThP4TDzU|uvXOmi%o;vId3cnF5n?Md*($tQ zTE^Naxj97u(st(*Cxdq=Ii z>7qLXm7dbm9kaU~wT?As&1A${`mCn at Fh}}~wRCsgGO3im$r at J6aqKBU`m8|?Sn_~9 zJgzug`x$=8*MLT~56R#nk%zpAfIaaeBEbJG9Vi2|B4|2b+BJ6Mhy~gqE9^l`o^Afj z at fUA{=NNsPkuF;kTd{^ZAIB-R6dEie zFJox4=~>S<*`-_*lW4)uuYXN%sL4eoIYEJd2BH2jZ5=Rc#I5*1rzWOWojI+6{NYOL}G5p5A^)(sM|Pa#r@$3nH_G$@rQBgdre zkP<`o9UBF%CHrsWn=(26 at iw@eK!((e*1U5W{&$cM=nrD4ImuKZYlV4}(+=-B-`S0` z+%ppYukR;%pxFYNd7KznXq=c)vC}`IysFDHLRO0nuub#S^PRZ09Ab>DlsUUvgSdgc z=MFZ*jnI_T%=AsO#2JzoC!s2<*D<{KhmZ7Rt92Y26K5r|&$obQ z-s6~aOidS8U7PqfDx{s%J^`b4#GLFmE-wUpFa4or-694H4j$OAzamAi?5zppHy^pr zIjy%#ky^J*)hGs zTm)YG^o|E{k|e(=uvm%^Wogn&!+ZlywVM_c(o7$o+%he2*MVA-_Y{?@w^&(qIxsH%Qx;Cu#*;!r)wjA1m4fVi*_q^8%0Dy7xs*sPBdKyDY&*pA8Qo-J9f=LJ zR>_jsdCca?U9-xnW0hM6;v#}+LGGy8iVkXmDuObBr3AGE1q2oQ*^z1<7;qIFfk45P zhqT=Vg&=yUV2~ zwVnPt_RDv`RyVwNm4*a0Vo9XY_z$lU;t4xU$v5KMox+ZgWn60{1Y#s_=uULk)Njjd za|`+XqQyOrk;m0I{*_y*b+^~jws{eEuv&$W>j)~Sy#Z=9izf%v*X^Fx!WbnJGn$Tw zm*S~UwB2Ki#G)x}e^RyWK^8_kL)e*TFs^2=hR+8onMLMIf}Dr4w?;^ph?{QcpHp0N zLD^=!Rjh~I(o9!8ZBh$cq%Cunwp-2h8pQd-WbF}j*GZr`c3g&%nUXh_MOJ>4Rg6`s2T0>}F1GiQU=%93YD=)tQA*3%*XY znYs$Th?2F5gy7o9Et_^bTieuR3j$2_2b7Yiyu?75nkKAp#BB{Blu8R_0J at uAK=6cW z7aeIYDjwl#4k?QF9vGNhMCm;oO|!|zc6eMX z;Tla?Ud-!*D02aQ0^MucWq@;qODcCvqDod3C%28>wHmDJlaFEsg2c|dZ+NU+3H=U%JkCfDlxa))C#g{ zXB<0cqquk7%{(Ut9nvFfbEAy`b|pKDH}lS;t-0PXc(yissOsp3tT97ob-XQit)+BF zLK$?LRFYPl+=7IhW~N>#Gi4I1IKQJaC<4dae2o*NV|QbDmygd$`9Oy!cf{+Atwr6j zRQPIP>BXz{@`Gw;GhMb;`b0T9kN9dKs1ohwe%)@v(Ghgayv|B!Xa$rq-CXTJUeVN9 z8TE{uF4KY4k!vtT^-cLu1}lGp^t#c?s`9+5gfdFI%9kff^eCmUs(JfxsN!(6RI)1E z79%MNcf)8)Z)RV`yMqW1x1yWXaGDb?wtpSg`1E=KHS9!@HLGsuJCcQ6y-A<9#wP+V zmcvq?vA{#rUY?G~;T;797crvJ^oXC^w7A;&TuV<(2snsHacY4T8Zy?_q_ at A>E!fD; z;v(EGQ?n`1?w7bG)t1*U%SMU3TGMlyKP$VTe~y-j8GLO<;xia^Dd!n1;UT~HU6pqR z&!y1Q*;8mfT115AG at p%D6D4y`ojL_W{_%N_;vy6YtTeQy$8&3+6zh__dHaUKnXMEP zL8*GFjY?@3VtNGm=1QqaF~rm}Qg++6hfb)R!P&7IO7YKOt?E zkq~jUay0}C)y|MwjZSNCrVvpHta4K6&S~OX8ea+|42sN1ma5~*ead=MP~OJFds8 at G z+Py$LbFnItdFYSR%$?9QVT-rr at dAq~lOy}96NEIC^FvIYPqaA$io<(zEBpM)t*FpG z9#eBM)$Gw{kd~G|I4p;PP)Wu0^@yuewET!wF;Y(7>{&jFtEy#;lX6{DR%7TitdbN@ zxF(S^+3C)3ViFs7?n`ojK5r6&)Y4|jnxDC5WGs0tb1-sUTGQ4sD^n+z*UVX*mwp at f zr0$BuaO8U4M$%oDEch&HC2h!nnOk7yKyc?V!5^cDN(kWUAImk&@2(p*r}t~tbrFKe zWgnu_IDC=BeD;yz;69PZbJWF8#7KyeS^IyyrArhuwZvMaXml2C$cE~yr6#AWa~O3Q z0$ZM;xtJ6pk5`)(8KcS_UuZSiXNV;*&yIH$dd zNxh_V)Jh|nR?%}{=cFqTIz#su6+{H&GVA$(RdaK=tgkV{YkwLUR=QSK^ zg8159(dzW(zIUg;bqBa>O~Pu8cD*&8yca6>eeWsTGiz*(6X5sD3HTxh2>3#ghT1TD z$L at Ur_)K4^2O9)#`(-eFMsKnRZHL@~*Moe3UjTc?ukZs&Kw0qlm>=K{ydkS%N9M-x zfY&4az!I=G@%Gz~>8N5%9 z)^_NUVQg0}E!w3$V%r|L_s)=e-az03*fV``gv1@`0qPidM(#dZ1OdXc@?Bmn3$53~K90Rk^Mb744g;ywPiWCL6_jb`-z8oPWY(*r$9*rPAc33?5 zbsv`_>+scbReJw at g+miJXHOHQ>4cw46FK^|-3jl1kH>6)?%2i)<3!=D zNkK&Qo=2pNFvj*Sfq{$Y7^pr4SRkqZI}*tuaRg*>P0TT8e7I~&A8X3k#eKeMRJM`G zSv-lW>aWjrMhe5jZk6u3+U^Op3bW|pm(V1SH0-k3uXll{dvA6ZAD#Sig!<;aR`#tu zh>_VyeI5R8Mf~CW)k-`vs3aNU)~}D_<>MiGFV&x87;ZkG!J&X8m4%aP?M8@`IyA6T z9<^w<=HqxidN`jlluHKSMKyh7kvQV5wv&^bj`KElwu##9ky&o#XhNvrXXmLqArL8* z{tjn!ZAXnRfe2BxtV70|&S7v1(SnQQ|S79r=$KE@<3pO6c2 z!MM}G8A|@ch395 zY!$d8Zp?t3d$CR0aC8=96yO77U64`Px52EFbMo-~aGrVlc1~RT<>;jRawiTQ03EKE z9D9>lay-I=JTjPTOOT`rb?{#bVbQ1rF zFwYlbElOCfiZFbUBf^>s{Gk?CP2FE%Qo at GjzQ4gDDI)na-SCU7F4nIwC at Tt@ED0w> zA3DY^)}$Nay(5R)zrvR112j~O_rN1 at kJ2j@LXKLjXz`8Yx?`Jn7G)Q>6IgmmJ7yQQ z3s)1vL|Cd?Knh#HucFFr6 at yW}j>5ZS3$OW at oCGB*kM$5ZOShqk5R^e)a2e8sq)7CE zoH;8ieIWFa<2J4g%!RD(39MA#34n1Twctd*!``PW-4VPyJ>#&99x at v(+<37%Q+YfL zt08vkJnN?(fPSzZ_U(;%6nul%S7xYx4Bn`R_-&0vzItfT;IcN4mXo60jZ(Fzn0KW4 z9q|7m&_c!$2mS#6t3Sn^3Ede12LgJ80Rm$AZ~du^y|JN|;waAl^qm_7L2b zr}Pt1Y%|z-d9EKBQF%~HHq^T&NwPYYamjzYFM1VSA;p?psFs$d{U1kNrDPxd6U==_ z2)!pMcQ^>#Fe83Y@(R8?lp2&=AV@%8KPLl)NxSs$U9T<6TDN9TvNhRvcU0+B=8{Xh zO0#RTb*VU)bk8E~3aDLuOdQ_sD~OANGnO^hWF}^%IqRv*nLQSfhnXW~>sYp~dN5j<;t>A1XKkUA37q=4W+sl({Rp{y5)U=Z(QK)5D z9Fd~atw8R>9qg^;vsL3 at e!*#}g3d9@#veRIxK(p3i|kTSOQd?KY*!!gr2<#QSvC|f zwJ^0u4Xlo(S4b^QXz z73^CE6 z;BiZgks%m!%vr{1#%X4rQpE*K0FQ8B!MH=_0U{t#Of-&hnrRtR2f(~8$RX7?D`=Fi zK~fWniI}KC&=HYALdi at xDF2*jQ>5<%f^~q_$R>P%?{1+Mh9dc_GtiX>VuXfUk#`hd zl9*jjRO$m(r*-pS-#pcB&|?3AwlU>VV2*14LaF9W at i9!K;tA=r&!h)K5-c{avPySg zW_>8#Z9ygGFbB1pTf8o$p!M+pF-7!h%5z3b`4I6Yt#`lW#q(GZeqtG7fx$v1y44TD z!r>k?s)i*az8H7+=jik6jTc9MlzB)xobHGcX_RR;X}vzWOtO4R1EbU~H%>#5=)j)Z zqiA7yp-Oh7yaZ?>i(?^jUS=}7cE3f;>cgs1G9r8Pbfws~c7HC0r8CG+i~V78D^gR8 zp&?SVGEK#EvQ{LH64~$)O3z-Vi2GVL$;<*b=Qu)QO0?NGW?EznME!ozo#kmm)Fqs? zh!-4HV<3-@{3(=`tGt)M`WLf=zjc)dX}k)^L_A`o-k?z&;^q=M+t8H9A#rn~&zEsI zR8DdB^19C>F-mw5AL8fHm_^CXYYQFW$P0dmZ|+T(D6Ap>(2HCj+J=0CZTf+~(J^jw z#(}?q399{{7Om8R%$jCbW*;zrb`{|)nM!EFP6B4Vs6dl-g%LWs1Hn{4XTFs82aED2 z`Yi+Ng02qeU at 4nf$jO9B_>K{Mrbb_q8BN4dK1n7+D?%w4AF2u_;lay!<21p}Ir!Q4 z`E%SQYWPo(qu(0T?z>2cqs}pqA(lHU<~Ix6qQnvg;U?2CM1!aiHmkT1^dGUp9IL;f zCgI2W%s$%S!%-V2eQ4BTo1)aI1b#+&?|00kdXH!ig at klj$F4hrd%XNE^gYC($2md0 zffCms+l9kWh at MWU^iMhQJ=}y4MlQrO%B4L`u z*3rtv4p-O(q_01yP5levUuAKt>C(Z)H)|)WyQyL!t>RD-Bhg~gIdCMbDEyqty(BD;!;fT$pwV+92j zU5HU0!~(qEeX#%V4?%8H2AgQ9!j}22_Z;V)=IuWUcsl3r*8y&T*^3VJE7w3cEP!(W zFw;fkO=L)%7#rqYZNr3XkES4O#f%M~72Ne)-lC2VBMwkLu>EBAavpH*3fMFd{#nl6 zG`Ok>Tss2*o at q3zf@y=$Su2|z*yL~E0Gi~#I^|yTB7_i z355r=sXJ%1b}p3J>`quN6q!?)mWB at GcBIl7opdfwJ+g2soet15dxuB%kuqcZ!P!qy zAj_&lKsrjc4>}*JwlkK_=OQO^HGRhkoZ3?;)Y#BlrmLs$64kGAdP)<#Gqh30E;CzC zTH%()*YUo7un*M2yUDCbmL#i01un46iK@%WQs}I!FqbSh$@05vddgb5jIUa2Z}EQh zzW6Hg8k1HKG1=#b#irCt23)2ZrPfSqN)m5lPQ;7lV*ukq2hv$d{>Vw;PMAEq$ON!h zWCHLcl^+Mb(MZvYA|z4)>3le(dehUeSjBWJ?q@{crmt|AX2XT=oCei(u~lqzj2O_xI}Dt0kNR(CP(Gtlz z-9wPf(wU71+xzuR6dO!qYvhaRg@$n%(Gv(J(@BnL(eF%XlNuz(4bh}bESND&LQJWX zzo#_lj`T38O?U{73^A`vY!V;RqsK_A)8?rPWQDpyV3F_=>J^2`LTI5*2c{Ur2X-tJ z&dF7b(o6RFKvB2jFrn0h6zicXgI3Db=0iH5G8Kmu$_!w6pjHR#^1(=<@Psgf;|yDa z;8uAfslc*0_0Y|z)}b^7*(Xt->+je+CJhYfhnisQ-wg=Pgd+)K&M@>$Jz@@A0qhuX zj5uZ35`}b_sMZw(-#j|SQ5s5jbPm7IPo~B- z+<|a`PqBt2EG_=9g6d#8#mXi7>)3>2+F+AV2yJsV^-NS z{P{?x2e#6Zuiz^gs9xzQ_7G#+7l!x31~uIQ_e8(=Zt`jwg$!{yf-&>Nv7^ETo-}QqSsZW- zf9lw({uBlkcr2B%UDf;{wQ#x`duXJ*@w-xzR9;PWGMS$MZ1Ry~ZAy>5R%ggkK(i()Ve99Rr;pP7XVykoVs_tgHeRQV+y*MkBb!%Co}1?T%EJgpkvY)_(HQ|)ww)uP3fq%qx(Z8=2u>R7?2g9n z8+LWly%!yuUf9Y+Zb1-xOJ5>L2$Y~i;xJ-(Zj at Ycs*u#D-ulG1+v?Fj4}@)LwAZF; zmS=lBA_oItN9FX4|KPW6%189av#QUTAU(9=pNK*P<5#eXXXN~X4k4i5jfFG^9-{--ZO`Ae2z zvS=8fBta at 5s6aSFA~Go|(Ex=)5?cH$)Sxmzh$%#n5h4jSj7_z#`%vrq5D3wg+N-k0 zWV%5rt#3fM!8OzTx}FU zx8Fyz9TGXB+-yx30({yoM(@;~z2y0A_7xI>3o#x#g5v|ZuFeE!7pqD;D`_WzQ4`qh zvu78UOHopHdX~S|rPYi8G7j;$u at Bzb(fLXG(=3U_Kct%7it zOMY1 at x0ApCvgQ^2S*$jo7UUEHYT=l4mb^ScR!inP1+sl@;gpxM^)_Z#dSh^ul@~oPEYB*H6RMFwWW-UoCN# zqiq6(Zf@(u`T-Dq+P}2%MVx%uE`#{;1$C$BvVEtgwOc?|5`CF}{r>d^tU+lQ6+#E8 zO=^>LA01*&dYw?OKF9~z10{6NC;=mlv58teUNJ0!>Zk%Iyl at Q02W0ql5A;A%Yeq6#Z{U1Ot!I)#rPNr*7?Lq2Va_mRFvS^&j00L=_B{cLn8DTd2&j&{j*0tw zM!&bM234E2#F_+}=$T?3 at M(kkX&naF4hX3nM0+COl at _>me+CY93J(evgp65XGsOHu z4%aT*mBz*_ at 8B3I7C$awU8eWv&speNV^x%0l2ao&wM at u=*Zn*fQ!U-Q< zX#OxL3KKbMcTE(AP`XZTt`E5%gm;NiC!A(Vb at sLmmU9%MEocZE2Z+%XvW1p(^Wt9W zXew%}T~?-O$(193R!b3Hx12J;MoI*61&!K}GHf zDfTGZD|APwkL1Qe(!_y}#Q(qn6Yl-P;Gg)F%{)pXQQC>w(XLD)dd0OjC1~5Z1xq at a z{xZ3Q`8K8PgjSHH_G2CV3CIy5mA)xEJl2bJ)o=U4zA^O|^u}Zo;lkz68U45)( zSm>5KdSc~?UVMD9>SpxB**CL!&yzy)PIX^grwt5Laz at cFFku!~{Bsa!bMVQ0tR)1Z zwg0Y=Xwe)=$NCtjp}gmfQf|mm_ZoVFi;Jm#Sn=80WYzPLozfI!;FpqbhTn)>=`!-Q zmQlV|d>-4{>tT)YxSt&G|0|}0C(gN_e*pm@{ex<*{{^Nk?aT%3?Cf0(|DQ3Qn&dm{ zB>|k#JngR1nle|{rB1u0Z at Wd413d#`TN=f z{8C?fUe0dd=mXszPVVp9Prkj7X?Og5{$TY02+reQ;5`q8s3E%C>-;WU3)tp+Xufm1 zkKY7H3D|G8ZFgdV?FDU^ZcL4o3gq|Q{dZekvE*L7=I3pT7Pygt^>HD4E&8NifWK#p zU=H+9x_#Whm85{N3WL;Xm?}zdtFJY9C6B`oyXJ{_e=Hmh zm?=zcjY*{dLm3zhmP|h94_p9I%;w>FIuxy0`B1%sCn_K;P4M}4wx3SpUIorOmiHt6`SN4tbgC^9Yye7&M7K-JR&G+a_~M+*P8uN|(ggq0qi0^XT8rjE<@Go?30G#>KS_JSZi5vbdgf40{vx z!9^ljBzr)Ozz=nc)lXz;D34G`KHK%abj^o$4j-6}05o3ikHCu1#r#vV>g81iy#=2{6rc*sf-*Fpo`xccqqq}3l`iDEUqp!`f zg=WsN3MsQlENY66Y+HEA`}BFl8wvZ4qmN{go0xJ8;Zm;YVx87^#|8 at mqVy_n5~l)Q zIqfw at ttyLT;TBh38tXxa at m3&A24whF5hjCVJC2a7VK|aDmP)KdRqVN@;prXY>}DP1 zXwYU%w}f=djc2F{r^`J at Eixkfr%7jV%8^~puGrd*S?*$7nrJ|qge`|SyZ8bn%8@=5 zBMbCB(^Pxc6|%zAd at h**S3FZ1Nkgc0wnv*avzS at iU3Q2$SXb#HXK^vtaX+Irvhl@TPzyX;dXgJQ$J>(#?@0*P@ zeqqDD}!D_G8F7q_RjmmaxdpLo7+kAoq$_VK&AsrLUBhgepP& z*#pXx(S at Qc+xIsUwD2Udu{hzc$Ezo)lHd8y5nDb1iNvsPTTUBEXu^PKl1iZ zB}=0E0Tca5LD?W`dk}_*BbK~0q0oc at L1#IoZEny#- at jUM+Rt8)@VzrV7p;Ns!BfD> z9*3o!vwQYeAv%>ypL2_sucXH>3Z99?Ax&A~AZA7?O at aw^mtYe<(kg$p73IS^5z}AIya!^a`pleB1};;W|8Y1O{oDZb({CVTs%jFw0vjSUAETQ znM|Af^`I$ITxO+lr&QdAJ%11WuQb at j9p(%9M_Eci{?{}Rvoy6a`4<}GDDO!RDq!%g z(Uw`8W at MIRWJd5e3O*+zN-V&~<3WXZWp$byvN;a at E!KmUD#%~U=cnpam&H#cgLQMe z>vf)WZ=HI5|MLN7fNlxLBM?8SlRP6Q%vL4aVzyVMs at dT3uA;2{C(_Kab%WB38uViUcB908BHaX%ft099qVFdvVnmj;#JG3fKoY6_iH$zJDaZct4duFu5K` zF9`n$NsZxbgo+4;O#~Fd3;`KYL`CHH6%lPUp&%m=8<1aV5p`@WF9LV|4jS-o$}8A5&E at m+z55g zYeBkXi4_}2J}nxEQqZbNYm;C=HMcyLHp-?VNw`g!Z6W=MV*Y~c$Z0g4O|v!~YZNDiA%A)wWWQQBb#`P4 at tJVA)hY?# zV4y!(y;2kg60Oo|nbxu!Ex(kO2AuH;-`e*c{xnKs!Y(m>88DGxutkSpYArCln^C;~ zNI9}hf5xb3v&X~Kh=$7v`7?oHf=7q`qFh!9=ff|YWcFCH6=ZFzYPZ~KsSP_o5RT%b zZxyj!&^%$y32m;=r^iUifwkLouF-AV83Ws)QH@@}-5q^EXk!<8!i5xXWs46rk?vR1 zAG=|2?^1Cz7e0Tosndq!gpAw~)nrn}X-rYE|%jV_& z%%r8y>};~Z-X(SZL%MlWu+y!lS!%28Dk}6U7fg0=PZyfV(C(Z8rKVUnedVU9UyjkD zIpqdJ^n9bI4oU6~qDaXuX4hRz-_a}IEbw%wU-ml-R+-FotX$Fd`VR(|8pl|S_PM)F zl-Xi?5xsi(%%^VfR(rQ5vB|RXx*ajkW+|T+#Q_!+>CgHJu6~UcLMVDO1oyG!`QhVR za|72b$hl^x?i6ZHUCFT??9LOf`5L)Pna8Wn2-R*`#6vO*%Cvfd!b5B15EZyeu}ZP3 ziHeCT43rD;ppcoPLO%K@=RJMT5 zKJPFnV4m!rPbDx(0hF&_8 at P-BRIW(cARX3xo{%A^2e^oX!~yNbn=up<%~{bW#0TZ* zEqa6}ioS>=?1_fY+%aav6^&hE+r%+y1f8bW$dNk|Qpeft#$ZOtNEM=mEV at f#Lw32;mn4OUmHHkIUO*Xm5WXprcM`(h6s%2b*=r1U9#_)U| zhIe$t8~&Svh at 206LWG4A$pdwy3AQ2&=K}?iWn|Rlp#aMX=O~tjZg3%GQ^XrQ{m<%g z8K{=`yD{1C1i)OMW4v3oxjvPI(~52dCG2{w at FtJNq1}Au!D{=|uQkiUOUJ$=#n%q? zZ<#WpvSf^shigbL7S2+S>U5^%{-F(VDA8~ENn3o+y7xAYZZpVx9Q>#2ZD^q)^TV#Y zf)`PXojyb at Wa(eAcv*2vzeko@=uhUxhsbUr>X~mXyl;tmyZ$Iz4Z=7)i}>pF at qh7F zu&4);$!Zm)?W+d~)dR!v{`vDu{bC9v7jATVChj*i){InjPei2n(7&xT5&*V`(f>yX zTYdupasKb9scdO(XXxVU^sk#DTT-l at m&8y2doeq2NQOZXAhs4AEU>NDA_t4qEToWW zncl_>vK_Uy8>&{)c#?7l`YD)&)AJdB1O8F~oJlq&16bqX--f!n%=3I-vyCVI{>)tc z0MQJ{5J3K(Mv-Q3J8oU>T)ehmU1OV`1q(EV(smPX!qWCy`qs9$SiG=|U0^KXu6M0r z%U*#UbD+(NC5bHQ?ALMp_8n>w?5bgQ2DraoWEC^J;#HPZ3IqZiA)nY3{}{RY|1~}@ zUAfXMEwVl5-MCZUwdq#y`B`mkE=5L zYrGAb`tqqN_bAy!8gJ=Vav_&bU559V3+l-x|K>F1Pu2U$a--; z at R8rAcScvE31X*77YQn{39oa|6vb(YtXfp=+_!?~@hxrLD5G zV#^!G*)Tc2)#efr4SY}}XiCh^`)Oys0{wJX!d9T>zRxC5*e}Fg{bn}5EbDexLw6Hk ztSMi~m~E&3!NNb?xgC$>3=KA++ZDhw4zTxeTZE)(Hx2{f>n`s+*>vyql&;MFUMURf7e0l-rqRbm^p%} zWAaWK)$|s7BA%M3L1*d+$8R3-Nf>4Sz&nLC#WiJ`N=>7#S=;b6sbtzQ>lA!KHbtAd zMdPk<+xR8+C#MWif?%#?k!FrI-!X{$sP5uqP;gPWnQH#dH)u3E6a8e84zCB)KXH2n zfm2NULjKp%p-cMCj|B-HL!kx+ROcXFwS8Kq91R! zx9B&zIlKEqz&R{@*3uK6Uzu_i-rwIoRs*v`+Si&D3=aJ7)51H!e9yG8KG4a-A^OM* z$4gj5Qw3mSWLZW6i{+ zIAbnErAT96n2b at 5(TI%Fj?-$x^HYdS%!EmB>3w>!;S=#3NNf&NHU{jCn&C~Bpllw{ z|N7NdKiEJ0{l~(Vf&5S5h_b1ZrJ;?Qsgtv%y`8G0h at gqde@w`@nA-k-K2~YQZb<;) zFB_bzF$^prrGk*L6lHAADvFmNSg{ga0 at WXcauNG1ldSg08-p$aywF~tG`)BUs=$!_ zNnt`WTXlg4NNMgS=FjhFvA+*bPwGI{>jnzbW?2PRZ0>OH*tgN`{0>}>=O4i{$BuCY zW`7 at Aw|G%{Jd_iiK0nVsGE#@z9zTAXb8&HT!sDlBa6Guh1Ic_$Zb1+FArmooBWs6< z=Ptl<(cco55DTWny@{f?`~5fkdROkE96E5J=`*ZO8?L$@lmUls^XM?qUMbzC$y|3| z9u!7x;v~CQ5fq7O4;pX2UZh=&@FP(H$sa_C1P>qKalcu(j~5tJ>;9tc%Kh%E{<2rYfLcnB at l$om9F;s!rwRo34=8SFb=`$Hn6(J(*fW%|o4tULk9-Mrfn zCxoO;aLTArbu||khm|{@{jt5ph^V&hWL60|IyV-p<22*2 zJIkD}(n6;!q8Fyma!Y3H!HY at fz1d8IkKS5M_Tw-Om#`H*s8wIuzu_51ZxyXA6W$${aDOO>PPPm&DB2dp%mLk-6`7n)zomQZYHE-7t}Z4luxzu{ zc3WC*&tS?#Qp;Q{cFF<|gB$hE61xxy at _%(1Oy4iWfkf(&jM(+4-`?6$$%XRz2!?lC z;Kj<@WD2G|*iB%{R$#M?#KdN?QI?0rY!#lRsHrtstZy6BC6;CH at gfpD5+-~$No+$# z76YK=icC6{_X-q{1tUpBz9;6Vs^}0SCa`3K?$F?R#~5q!isJDWRa7(66?jcM9AS>F zFhe?>W3S~L&T#2P>qZP4u<7BH?vxr6s93bW3*H3vZg3jPVtoujo?To+6F>*^V+TjaUBkZ;B}fPxU>) zlQ{hGlxQ~=^=3FSAt$5RVod}=2Glr*t2SKLJwzxx(v3hS58F4+}8I=$*Oe8G=?#H#@TQ2|d8%7h at c{*X195&;-yk z^32>L4Ndvs3}oYrKVb4Jy_Moy`s~KR z2-WHKQEzzkGK6bZI|Dpx41bk1*Sr5JYxw}I*5kZ{^mu-i9>#z9+Yu*uN^>o(}DU#jZaOu*^hq`4a)x7lUYZ8 z+|>=HZj$HObsh9J{X6Mjm{y-*mzyP?FI*5am{sr8a3Nc%G1}EGv!XZ39|D>QijO2C z^npUlMyTZ at oE01)+AWMnmwTf>+F*#49?C90%|xKTyj zAt0a4-%b|y-k7TyYmCT~T zrhpbyv4AzV+>EHM03tL|g8&K%6=8!*mZif<77{vM1g%88Qvw1v2_BRqS;JytI|bJJ zG$(W3k8{SJfA2R?eW*8#G~oSu-1myB7uzkTr}!*%2N%$7*lVQ0y1CRA7Y7e-8kY`x zG`$n`P3#$eoxUUvvxT|e(T7K#dw1RWU=q~aJZ*K8(eHSWh3NqRg5AH6IgVDP!$QWb zgc%9bJ1339Xm(ppfPq$4rs#B}8G`GPR40R3ku(Kpxs}08m1*6KzgkY}p}b&D{u~pW z2xtnvM38^aIT_+w)$!=2*O0-5vKHy?~q%KmjMZ=}C!JY>&Rr z=b{hy@`#G&nfPXi9MorakYKe8D4w+UH;g+b95IRO=7(epfO(p>_XD#8lA?go70}cN z1@%*{^I)wnHvn8s?I at g;F_p(uF}P~0qQKdt+5y_fEa#y4+nTUm2}^H%*EF|z zRqbo$p1j^Epd!hBH+y&DKQ2k`p^PJda6m$27SgORY$a zX^d}Unm_;EgxNfkd4fUHN-PT=g)uz#Fp5dvac}~cLSHt|WgcUm?@S&K^bYGB{>#7_ zqslD2g}rLN)eXT^**DXYI?h^V8~I&y=8q6a=iHqsx{OcUb-$F*0O8Vqpcg)sI7{~`S4Qh)t~Ys z--2tTyN>4CRP at If7(D&k^szVDMx|F(Ie{$zgO`7 at m+?$l1h_>{oI&09xzXr zyJWd#drSyuTTF0yW=V1e{AMLccCh}M zf8CCajm?(L&y6jO_pE^%TO_al{6C9I{{C6A=E{>vpRTCD%4VDw(og8Y1XueS;2=+C`_0dF>S^C$up*}d(UsyJkgQ=@_{FR?%esa zC+Y8mBTMF7dGP7Xq$fP(9iBg3-|(z?!;_QK!z07q^Qz45$H*$oc!c$$SxoiL+E<9K;Qh!4g$5eEey+IJ-nkc zGH01Bxw7$c&cg#s1y()@Ik~7^$>R38Njp@`Hf?wKFD$;~f|raydYwqpwO)rBmxO5J z&Bj&6pVOYb-tIr2v1G&ffKAcoCChT(U#Wlmd7?c3kHP{ir^*lMOG=M?IPh&!$$`l> zpTbz~oIhscbL_FoxgVRq?0J5=;77`omi2y$%M7!(oNVE9Fluw&AF9owN4MPD9N^|MVd1ae zu9DL}UzpkBwr6_y$J9xeSh;#Vt2JBl at 1?K!pRCLC?SEX?!a1JyOQ&?nxJ4GnAD`4W z+iF_rnimmQ3r{!kr6n?^a$gVJSit;QY}ExFokLp+qIYH+ at Z=;Mci`R4_G-uKE4IR~ zZy0HATN`rth}x_hi=JCayqgdbsus!p>as`4loR{i)`ys=6-1pbQu;`1w-WR`_^T_sS*@<9TsdFrAIdjUHzBB##=zm>td-UxY z&*XySk2*YEC%9VZChPIPO;xj>FwNDzAzE64worbSak=d>V8Xe@%)nqwYQlj|pauK- z-v%a|*)uE**$$-}wlpa=81jbgWc%uHL^0 at rQ)|fA6d7%a9Q{qx7yMh}mD?QEsmu;c zG-A&M9G5n<@aLDgeclw0#<7k zM87ufIk?!{ym0BNCt+(BK2y<^^Q*ouTlQc5#Yc at tg|BLS>r7%E&VAc{XSc<(&JV`Z zTlXsP9T8_+dhoWL^Ut5M5@!}xUy!)|`H%NO1M7-y21}+jJdrF4oWAgzT0PIX**~tH zfATf8-J at pz`|mF at T~$@B4)2hVaTM#0-FeROPMG1kMQf6Rj!x+l`XnU6=_;G7 at nS~9 zx at 0M3t2BeCL+mwEHY`fyJ1w#pz|l`!P84XL*)6kT~ceVxF1kHTYdF{d)xZXI6s_oexn9^d2c>&~y6=-0RCC;#XB zZ{*CPzUi;YyPwdzsIomU`j~yh`KXT^0p5&EA`FO#pZjUwi3z|6KL^A>Q8eJ|8sezy z>F1{J>*(j{<{BKL=j(=U!au&78VsBa3_21F47w<~58+KnjwxlC$*5Ba=tkfF at z;ix zkAZw?JJDT{6c`Zgm3 zI2uXprXzGS(O0V at z@>QN*RG?RioUoK0V-1|S!#(?gA_`_@(XBzBI6{DFWt2=Kq1%H#m4E|$bf^If?pBVuTHId$fMmHV38-f65TgmH`pxc1n0YHGQZDe)_(5*mk cDk8wU4ze1K0p6@^AnoEnI2o7=o_2wF0KKg8(f|Me diff --git a/extlibs/asm-util-3.1.jar b/extlibs/asm-util-3.1.jar deleted file mode 100644 Binary file extlibs/asm-util-3.1.jar has changed diff --git a/extlibs/asm-util-4.0.jar b/extlibs/asm-util-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0e1059583543a10cde82abfcfe3fbde37347c8a7 GIT binary patch literal 36993 zc$}2EV~j3N at GdyE?U^&SZQHhO+jz&eZQHi3GkWKY?K$JKzni=J;lIh|W4^1yPVt7h#Z5lw?v6QIwICP*Z1A zkhDnXg&SeU0Q?o+Ka?*Ki$N`3s at H^wB(?TPyg&u-PD^cldzFMn?FszX&b2JS+}iWY zBGVMSM^|onLTE*CLJ$>>&eXt$hF5fyyJoL8L;<#{x531R)J#A$(^}TN%Uny9VDy;9 z_?SsK%q+3|ab+|;-|L!rQGW2`=4 at 6z&a4Cq$-G1YXQ@;HbRo7ML$wc7`G3T){SQkl z;6LBX{}ZbJ#L3l)$;s5#!pz;v!j#Fx&4J0o-Nv3tL`}iQ(#FKp-h$E0-o(v~@5O0T z5DE%P0LoJm3LmksZmdQ8J8!Jd{TrB4GS}x`xzg6QMrw!PQYCF8W0^4EWE#?Li9-gi zXX at f;sY^i?1|r%Xq^fD_3QHDd8mQ6}D43;IkW+ at N4!eAXbDf)=k)4&6Iy0nB(rxSR zJfiX`nwp29kx&b!CV{(h#3YIjV|V;Xg28>2aKTm`Iv zK}N7MAog2dh{)+t_n%ALeF`2HZtqcDY%8^-{QN6i%=v5SY3b?tpJ;OO|NEFM01fv2 z$pYsN2G4_l2tfmp6q=hII;Cjn!k2eY at bEPWer`MNg|~1d8Xzyac~$)6Sr3l|&>XFR z4;+e}CZlgd!N++=c5S$Z3Z at FUWBdad2&IZf!B|EK$bRdb?y=6uxL8e at 3&o)3){|$? z5BAi26{*sPK4s25b|;Lb@;#_%^%BeK^@J%-?Su-A^ZVi5p5U(Swbzm@#Yy)|)o?pm zg%VM>??G9NxL2cXrzff>-6AznE at iIa&r;8IFvOMgI7a18VlBwa@*c4eRcN6-l5CizuBQKuS zn(3SW+A!!j&I&#yF!AAb9|vacL at RiN%N!_%SZI~CG&v>IlPtI=%m;s;+Rx4Tpe at +G z-?3BdafLn5APET3Df(?|R8r$BLl4nl9lKkQ+yv(_X6?DJdf3BBd_=~r+tkDw>{@8R z-aOLeifVHiD4tdIhv+<1USH&-0+lYXcSOllcduG?LWKZd{YNZfEqNA`E8G}(_*bxr z5oXIO?IzgsQ=F--XeWAT9SMMF=^DBlb*jY_gNsNd6A}fZ%z;{X^V=)_fg4=EGxmJ* zhDIkZYYZm{#)GZfb8CbHg2zjscoec`EEhnx$9oE1?4j*SJi4T6Nwv(B4wfb&CiGU( zH4YhZ-50wSyREe0;GB?nEb~L~w>*1QAd^ECvJ=bYJaM$RS+O=Zo=A=rZT&P3Og!@V z8pTw-l$4a%XR=R&d;Xk at hK`MP`vD1!huM{fGJj_DT!Q9zB z$PA_$A5aqDmqG+{OUzRDGa6wnY9bc4NsQnL$!QPEd8FtDH@?epD9zo0M0o0Czk6}8 zM0owk1*M`}a&to{62!c;yg*V2gWm(DfS>zft>$K>j2yK zsplf=i`)jC+pGH(Kd&ppXL~JD7M!%uAdFnIRF`i+ID9HutVvS_%qzV5LLjCh~dHQ{Ym-! zm!3xaz*K{>+TFN>(}dq|bd*eNq6sxR-p3=*r?IH}G57BaE}1#xM!QanZ`LWoH3h?a z?$?b%{XAdTPrSA(c-LXQc9ffiEbui`FOfdr&{)~_Z~187bEWX~vy*E~CBa6Ox+iPb2V*ZGNt8BL?SeKb)|)BX>J7QW5F9%XrZX at D8r?*vHX z&MomU!u%|E%8qh at B_bH8uX+q>zOY;{>j~3~Xci~?&cpH7X}P?8?KM7Y at wjE>xg_wg z!+yyzxSL67D5Te06~rCX>X})=@z=G%mvzac?|fVp1LnXdijga%W5iqKVEP6#VtE&n=FdY zf at M|=(~?OY%8xY#Kc!YA&H9A~x0Y7sZO_f$L|k8?hCx*+K0DqvLLhQ#m at X+$Tdi<+XXnd};Sp<=i<*%+?wK7|?dgfOf_!We zuV at IbYH1#5IdJs`Kg6%J67`Az*kyzj^SEmA4bEi;Tbm*HznHC_1?M>AWZ?n!GhPH; z+PS7|={2?_J)F2HJ%N9aDwkd-5!BSt at K{hp1613{WgKD>j<#(~q)dZ at 0u0oqa!I at qN)fTiTVdaNOf(kQmZX8X%3a1pF7bBLciSLI~sNvsZ6TlO298v z_Yu07HR;##BJ)hq^3Xt=98wH4li)Zt?~s!WlJdxsQ~MO1-zCnKwsr!zj2T-6mEH87 zxW$3L&wMT%U$cJMH0a at QtV&hYF=rJ%gc7HS1Wq6rfiZInJV9oJFd>Sehz(2k!<)s& zB$%o9NQnmc-RnQ8S`39Ui{=2B at 8P7J*+v3Bo=uy?kIdHCU$XhOmFDA}Pz$O{m;b8} zQZ5azBb;Iy{nCjk6vf2&=PFcu;&^59$r6m_OFYV*@;(-_4O?-j>LuREkxYDXygS0x zi}SeYP- at fVTL=kWPN`D}$=x(P;@gOC0hG at y8t{2{oKvd12%LlsyCzTK~Bg)-NXjOjQI_p%v8#+g^X%|dkFvm-HHT?rB z3VHV(y#HpB?}3$!2X1L7H;83F+Y2ct<(SbL}(>=kCH8vrQ| zAr2V_(0hY7;&?E!__Pq;eA2N4{U%A=m$2y1f&8pM8DSq9YnwP8+L`5MW;7n?lg`F#e~(Q z*N!%Bg`mT%lW*D%O^4@{YU&Q1N3RoYT7`Im(WKE%Hx?YOfviQXGi=Hay+NZV*KRZp zVB|gwwKBM;!S??RS?DtSpPC0Rco!^x^cW%B4c?BuHCWuM#uXYIS2HC;{zBpFj&G<6?`GbG z_kpv^UJOuER~`OTfWUnByC`_wKz^S+o9IQEoSi1>}7o7aw$c zlSG%WCOqA49nxvH4mjR47Wxxf6}dAYmmvbVYrDG&7jz{f`5Mj}Jp_wO57xrbQ!ww$ zvK9!&rKiyL;+&BCeo+sP)vd$T?+}*5Z#c4vZoPQa`rg4Gh$j^LzoJLuE*zo+!$z?t zTS{HzF-lq_>?14Wd;jt;7+st_V;rC@#J-=0V4OLV at Fxu6LWM!Grf~ihLK4F8-j}6? zsx4lWBa9fL3+4fF3CoV6EngHnwBaupJ2umuIRplFcKpQS5B}fPHV>iu_|Ctdm3XR& z${jX at 1||oaCufWsasr`=qOD+z7}5^GiMFL^3>^{+t1k+ihwwz(k{}T;$`mFJ`SHI! ztUP;?4YUMhIvD^nocM;|g>}cihZ{gUB`bwKXR@$dT{zmYhePz|rJ=mp80uW60)X3bYHP6-(${qP1kYn&|a&P?E3UIwf znez$7x433=3C#9?Cm7&2ywTB}Xoz}>76T6dO^H477Yc%jx#$nsCkDhE_4)6(EOh?5 zp(f^;aWXvNM;I4RPt()nq05`}IpOroE9|(T9{lF^a`X#DCO9dTdQYC=4(ipN2yk7F zI|DVFH5t(5EgU*IK5|ncocDT%)9Q{rK=$#d9W&9^`X)~#IvcNgu3>$Rc4JG_K#AvG(V;fFD6exj6ZwGwaeK1&biKnq4=JjK%#Wz6pZWgf$3o-yb$8sc0}R$ zTQtxLHn3rAQT1y#uF&nl4W+aZsZc at oz^&|#`C4`B40EHriHTa?O|Y>E6YjHQ#2 at Z6 zWkgYJD--jSat{5>X|HC=OuV6i{zPl?y;n`f!zIv)*6=V-cB&bT)>R1F0JD2>7rs8` zgRO*D^EmzN*NcdShR^=5DLS(WlPQJsX@|v;S!Ln7qSdDKkD`lbe*6hmB zQBfr=fL-x=SB)L>=dGVSTU`h|yBN*y(T8lgR3U5HEtq&;e}eJqsqp&Oz$5Y-4e##O zwd}ZzIlG}&#aw3ug`zg^HQN!R6u(b~_e&ZNdBpK-gc*z+vW`=Y%;wBxfLN`oO%*BE z!a;7%agc_zM8ky*f7LpxcC#*&TbaSc-*wiXSq}AMWzG}%*^1pq{j!|xG(Le`*BLhp z&J)XI1)Kb*{#2KR-($dwX?LBwOa|yun z?O1nh>@Vo9E$DYhn)7UEGgjLexkvZw%J+soN4au4ML)DcST z83nzv=>8HU)6X6Z1+{oU at e{6}fqwPH6%PLK7V)syQ~4p{x1w{szZkytDWD*CRDbE) z74^@}=1O0Q at Y67gjJeem{Nh8K$)_=s?I&Ou_Iw~xh3g33xm5 at wUae9oDnZxIwxI1U0Mz5XEZo}q6 zYTtG=QEyUui^Q{fhh$q5=1Lpj)x}=w#oMe|&Cyqudh>pamv^$jo9CeEVbHDCFcfVY z#21izAYhUEm&Q(|4{ID-)+}EwuAaebV>J^;^^8u|QAxBx at f481tLZQ&Li1K{ztM%c zamnF%0b|`9AKdHU%9A_e&*Ekq>N@$8LnopD}DImEjSpTQEhY*vgi%XbvPr&)n*!b!(TL1iQ+2*r=NbQISR}$Jg4!l zEZlq3TIH+KKq8f+dJDtPh1RyFdC!q1FXtp?)giQ~{{*U;3dqo}3aX&J7pPkOt|nrI z?59z)Nb5RCa~9Pt_>?CqC^!qCOq5=HikenSDL5O=sZ1-k at KJ77R}}q)DvPDIk^O#u zB0j0!z*oUSX8UDj&8xsF8Kty=Qx+XP&5OK;yaaQCDMgD2<`6C;#$ggsx9jv)Xb6N zRoC=73orIhma>^p9_^;V6aD8IIr~PQ at xL+RMcF^qvO_us7?oU!q;bPq>fW~&qN(E6~6l5LbKhr^Z6^~U;4l7prOa_&` zFGaCEG2 at MqD()xtPg0A~LJ>V_Izy|9X4s6OR-i9oko2~brMB_6yU?(b@;rWO6YP3l zh)~&SCyg!E?<$+9Cp$S^8U4!-Pti at 0wHM;@E1@^BoG8>PJr(kQCT$XB=CC1cdn16d1;=D+ilHW(qght;@3 z$0DO~Q1J&hVVa*bUZ^m*&$1C+jMuo41+^_I49)r`bhujet=5du=T$g4#{TvE$v#OJgX zywd86thc9Ai8sxa_?L+4f2uzD{;f$FglBNq+LDiaX2&_Z*@CRytvU2 at F|)+-S9iOo zNVj!`|7%K7{jc8YFE|K at HVg;| z+yD2JLd at F2%udA7(aGJ!-NwmL#N5Q${r{O+q-z|gp=)9MWI#AY#fmD&Xt;|klLs&V zB++JM6gr?_;>p3kZYsDcgytIL*snY;b^f4V$0iPRu%)|S$~zd%$QynBbN5}aJc2UG zV at E#la=Y~!@LTM*N*Vn3ed7h9br_BU#UB1Ax-Iew5AESO#(<{m`Z{BV=b+kNR&%ym zXSRj#BF)~eU!8%+(;}yx>xfRTg;A}d4X!#)jYcQpLR at MaPmwrXu0Sgxs#D_DZ=&FF z;VS*#lc3c4O0v+N`F+%`!hX~w->pRnTeX$nwdXV~4;vmMG*~I)d=4wUj;3U{rU$}r z<`#^qY)TC-CLNpOG8?>=s at 7Z;O~vH}{Kw={+WDoDbgq~dS)ZB5HrmEt{7z at -fZ{d@ zsWj<-Gue2i^$Zs4Gxb32$oNf84tIe(vn(rZV{KDuHhMO59BryAJYQFdbicl$8XiPc zCxuPNh&z>U_L&&6lA^pg0~hvZ=tVZGor;tU0J=jnVPpza=#amPrg_5el47PP#;x`` znUPcx>*+R%_e7{>7n-&-u2KDzL%>&w0!p zS^{nXwda~EKaV$d_a_2nct+2ADE7ff4P?)b>XqqHe2z+U)u5{NkY#&AN56U5KERFnChN9u>muwOIVT_LDQxp75;AXq|H!NS0tU=U#QP`%ZF zbwfNMv0#}H6A+B>`lwOx zCc*);G{7FC_Kj2)w~)1t&7Rp_@&Q(`vUO7$(*4&&rC%*-qTjhz-mSux)BzMq3866g zQG5)I)0E(1_b(>zNA1}Hm*F{ok57#eYwv||u#3*qs7DC}cOHBKw~2 z*^YDnCa~TN+Z*=8Qf)7C-_-}>&^-3)KRilaTY^VmGcX|bH4?s1*(SBwVt*giBlS-b zK0;p${ZAfgW^!uUL;?X3B?SRt{6FxB*#BaU|3M-7I`IB#CzwK&-P8RtOv+%Oj(Q|8 zvNC!x+^FDHoF%zg z at -J`L;NkAcTWr8u^g`ZBz;M)eHPEGB*vY{q at RTCs zkZ&!mvG`QRcWciXx2vk1#UR;{=z+7VvwDK{n>&b6_{w;}H)^u9_H)@;K1Xe5&rx=k zm)KjM^Iw;%-E5%qh`m*}w#Yadk|;Tpx;%ckQ*SCzHjh+P*j$)xfUlYfFpa+kP$b$X z;76a|dUHBjObk8k)vt)q*>|opf2vu08t~13SFEUKoaw!^Iq$Nn3h3046MfbypenU{P_FW%(z88-7K`HR{VrgeY)p^7DJsqKV|A$!YgRu{_f&2+(UML4 z9m}AQ{zt2wA1r;#ORHFI-Dpjn#t>7s$U-;H!h*M-e~TlHlQPF3;~De9{Phv;c?OTM z5X;J9`~E2nv;Pl3c0_|WIeoOm;+t5ZE5*l;j;C87TRyu7SBYX0&e2f9WI3gxJVYl9 zQ%6B{BbNBOhxNDDb2nx?6-S6NoZCNp;t z=dwQp_Y~opYiFpIuD8|7I^t3~{o&2(Xeg3!yTo%87IwW33}#ufGY|ERW7jFGOGr at F;SrrkQcDwJ;-%eJIIqJ6u;L!kmUSh zjUrGXKT0oh6Ne|0iY#oyzEjflce=~LT{v=<)>=-lC{C48pfk>}BVH+~_o9WFpujGL z;-7Br+eDu{BnswESGW?!$aO*2w$d$&b_}7lxpgljK#fGx-97b@(w3m4?(g_pRY%XM zb{-P?TD7pp=b5l_1Ys$U!|5g4RJEa~OZQ3x+klL4ny6_jLOQJ9437WO#Io+xpDkrKTD)j1#3FPHrQ3TN#V{?jE~Q|w<5X at c)(S3W z5tV7vSQrY%$X$!#%sg?S2}=^W>Tc0C>G|)%piGwEiSdq$X8v;br&hkpW$(LcaF0u3&HkbB zEqkMszq3#6;$vFbY&r7^d|Ni1rwN*REGi^QH?oxW6qKYeUvh z*khC>G21;#{iyb?S2oEQ)V(IktcWSH>*6SgE01EEkB_|6h*Ko-!rRslt!iD-Y$Zi) zMqE!QBClFwR5ArQDXn_I@!GVzbM#5MrtNXenXyYpK=;bULr@ zBLFyuV4sdrJjY5Dsj>Sk zwieQ=<1%4RC!bZ5>9Ec)#*rgXbyCSYBXqdwle%z3QA>tTu%9nvg(ulygrzW9WY7mYD%f;9#5v~MdQZbG^QPL;yPv?YOoSy93tV~ zrX6yy?oy1}S$O9oG-e(mvi7L}$XE%|4+U8Jv;e&p-h~K%r<~;he`lTb0mxI%jR?eP zhl02Oi?<|%zq9uyn4FXOuiS^vdWpwUh5ERt7fELxppMiI2XB~3DmwjT;_ue~P zI|6P$Jh{~dZ4w5DJPb*jXAG~%e1oc8Ga{qu9P|E&0GTz)Y!tCtccQYP1wjnX;GZW% z9EQ!TUo(Qc|LC%${svK}dYI}Q4OeLTQV4*;6a=T!;D(Q<%?s1SEC|P9`U2hQyI0Da zY$_-YGeI9!WctF-#ob_OW3xBk8f)5#jgrIB#c43!nrn(T;S)>5Hb6l0`~;p=eE_lF zOo_kH>~J+%`jQSM5ZdnPuAhe+v+uYN2FLCE at A>qnmS&n#4rKwgIG)UX;U<~Lfr&&= z at x=wjA;rmuv{0t+WUXJ(hmGfE%DAT=K&L9^Ym2Ug!*T>Bv#x?eC_n%LuUI4UPr`p^ zAtSs^DU{tAb>*1UBL9rGSuHO%1s|dje`Rt7AsG!h(~Rl at W&@aGT5)^)pZRP6i3Fz> zS<_8XCXk~R2zofL%=%ZOczGvelQRe&2(h at K2-wW@7TOcezeXhxW^r?HL_E0MNpfpN~nSRVr5`N zw7{KSfC(i!cJ>Bng*-*6gWw2zQ>`p{N zZIuty-T)IK9U at JRc8BYkb!lH55apw;MY2I*HpR3m);SP1_> zG=Lk?$6t=f$))}Qf?s^Qa1xm)^2{6S{`kQ#em8J81Aew1bkX+pf+wqb+C%H~;l&S7 zyx2a0e{U;GB;-nv(VPqJ4umcU{&)H?N|seAa2Y!1yCrw#ubcW^NVQUsvNkzWCa7yb zo9IMYi}vhgT-bKk)g;V}koZ$a0em2;N%BFjlt z2jKGeqxac|GLcdLuQh6kr?;9OkI5moF3Yy!Q=F+^vboA(ZH+96UIOH6BnFFi_8e}~ zuv)bQwiVJst|enl8$beiBOg;G6#B7{BI4Xf$xR3UBaRC5%R>cRbosF&~r;K~Ud26_F%OjIOat4iegO zM|3NTnblINQ24>UIi6{|5B{FCZ5L|^M;4Zv<(2x(c5Ab*%I0^ULoNT@#@Z7{GRJOc zmtadcS0Y at Nf8zOsFgis~vNE>?DI|@khwPhNmi8K~cM(``%bn1uYu4#%i0F}v{RhoX zX5)J1C3TMuYV!&-ePq9aRfgKVu`a0$ueX8baL;xyS3nGm?p88w82@*J%D;1oH#{k) z7!(>-VvW(mmIgnf1?kW9qE&Zc@*il(Nd%PaZ~ltaF9mj%?`f?3%)tcaC~2$y;A#%Y zu4SEKsko^rxs<%JOU<)kaU at 3lmXRk6p^$KYN#Zf1>`%mUq&H at fcW4jMqGAZ(zh3T2 zbE|Y#e&V)Vb*oK#azwp)AL+jiClytSqC1ubRpJJFW^aYe*pBEBhT(4hqMc-2(;q5L zIJh9Rl3PO;TH#hZhA0=#p}cE;vwfSldumU%Jk^_7cVAn`Ws2_OiMF9i9+-ltd|Bn& z!D3YX-TX;h=Tz05KVyNKd-C>7cf9I5TW)XF?>?)NWZ>>1gMYbK{*L+LYBL~dtKY>$ za+7*X*mxm@&c41LAKi6jCCB`F0jsP{Mf0}c4Y?r#4EmofGP?R(q97Ouh#tiMxkZ+= zv9LG)A1!ixs)N$1GREXTuUz*vFkT`|Tx`H^58(h#!7=mfEc#(Ba`OAzhW-T8&6FFY zZ`we31$MTSDLHhZw1?dW at KlD_02g21PriR{3xgMTLPCLHTNA7Ft{`F?jCXAITQ7TE zd+tXQ&ChGl+s+b|Cj+qN=XcQg!s9pCc)6WkiR0DIVyGN at 0_#X6maaekWA7$D;ieoh zrWEQZQs6p(h~)7y+ns;qMJj at 58sr=2wAm!(DpN}Ubfz$B_3+y<0aSqgz1sYJ zhPqVq;y540&Ub14)R|PtD88yBEL{LVpW&4vTQ^Zr0tZD1Cw!;gQOc!$CyDO?pV5emz^o07qw2Q*9X;%wZ;r3H5ZG_a!DnR`2}K<7hK)SXerZ@ zmSSQCT5Focg(LTDu0U5n at Wq8{k$5%~Rz4AtR?ES|F~ZkS_3q`NAu_U1C1jh7Zd3BB zzARjz$t40EG~`I<0%6YKPZ4B&zUDKVv91<(x6 at YHu}I;p^{i?`mOLUxUgOqRSwt*! z#0gQy;wSwN*#AVL`e0g>9ykaH1T+W;%l`q13Ks6xPX7-S$yxq480*!I)bKS31UeDz zwXsEt>Ot#wusFiQ8Mbs8+Tm#Gn_=6OhcO7xJpWSKZ(mRB^{*6U1z*Ht5gXyuyc3^ z3{aeZNmD-)K6F!e_cdFz#n}+*hMX_NOL3q!Uj4f%%Iwq(b~_{tSgre3J4!A+4*3uQ zI?BIu*3|7eg(`DKZPZCLP`EtN|lpPAWcosLoFQEfz1#3Pz0jS4e{Y{8q<0sH{yC5Ih3tWVC>@zAs%Dys@!)c z5IE9mFJ0Vyl0p7;*Va~d)|#Y0^_Z)U=kc!rvO$u+gAiYJ0rcP;ueut at iA`lHiwc!* z at yS7O02+$AQbh%9&-miR0fUN8*vrWA8_DuD|FCx#<;~ry#cLX)09 z&Vq?`yEGjSeY>M475p{wh^8&^sGYvzZd6~D^uJNjvooprCvg~z_$Q6wTThZNC^i30 zao#sY;PQ6&?TR+!$+4^SWlzahq79m|rCS%3jWNt6o5!yq3ef?#iP>4+^ z6&V2+O46(!`|&!y#q@ z!z?;qczAGus{Ky?4x3I3>O3^s!iknpt;PO0f+g^hSamY_x9`lpa&v&PkN+yw6R%CX zg3f}b@$y3tY9c58Qj4NoNK<6Rj7Ru*z#FwDy>xRI14xw#qTh9TBV+kuvLH7-tQw>$ zI6s>^$)1~*c0%y+L at q}VykKC?zK*3*_4hP9y&k)qU!=m1E5{^X=iaMB=)p-juIFM? zXyQtVD|2q4N|COp!FfAYr(dWvJBN78Sr$sd8?o{FVK+56h73{)^-smaV|I>~9qbl$ z8i6To{HhjI2Z$$6{HX69Bs%Ixl&xZY#D9ZJVppRo7F+eke at 8La)Y*{yx2nu-4Xc)JYd}ngtNa6-ryYg< zAns(47kglJ-2hMZd6i>oZNZHhJ=u|x%1uGro<2(0rtLO>W(Vcxi%_EOf)#D4&Ur at n zTQZ|M-9cmiPlywdKL+bsZv3KNS^RUeMu*Fk?+0?~`OK%Y^U2IX-xl6F$q*;3jCJH(-bS?mN z*EvA6#7p1NR#RP(z%4~^5a>S;BF7Zg5c~*F3vVu69M>=aVWJr02bb)W4>B0$DnuNV zoipD^pJawxWyuTb%0MlgX(lpHG37R!R*52TU>89v^CXV$fUZzfRU?XyetnD^VeOUl z76EAqHydS$bz*Ttn!JRr=={XXI(_cAFQz_NXn+2lggzUq>cMhJQ z`FRHg1%~HMb>L!I5BYHI$Br^gx8Pah$?v2r?bx8J`^M__ZjbpK%`XlI{lS6i=;4-A z<{OklmO)gGkL4?wpsvWd)2R*Z&OxTUG0XL+_hluO(q1etKP)5i40#HuUh7 zk-Nu7Bp5%Z>?Wo|GT~^&#O{VatA5fGk;`hXglgn%JFr?ASXbn1N!QU0yHSUs{iX3K z3+hasa+V459^6WvM(`A+9Ou-tJoNUM{<{H@*+fHGxV2Hs%Hj`AHeq4<2izb_-h4BS z9nMLx+0p*Rl^Go}n*5E=siD691c{byyNhr|fwjC3eF62XCT?4NMoA8jMQ4mzl${Yr zLop$PiRInR_3Y12j-%@hA{FW3o{CtS_O4a2!p&8abfo8>0UHEZ2B=hbLdjQ0v%khn zDX(KLJL6^7;U at ED6P0KW|1lBXK_n>S5_J!obKAPFkC3)!^8RAFOItXp%%yDQaUSP( z7E+k?wKm|*z&FtEssq8HyTNl(0Vu#o9HC(h at yO@cFq7qtOdD zn=0cM*KAGF*~3L;^@rH6MM233*kN?7(aK3eGKX0B!^C$FcPxMu{u#>Im4$24jOVk! zsH79r2njSSy^D<3j at OQbjtb?SgpG_`zRgY#omFwuSIkhCc*mxzpd_5Kg7lb=l z3cj38_qO`IrIE14>#>^Yk at E;=u9>DtXefl=zg`;#oJ(LkeO>dVLp2jhks at vjf=gBmt2`GBwl2}=swGzV!*f>7sZDcg3bd!hMDIE(m$|X#w zs^Kgn#!66>Y9DO~{s4h;f<2!s`R$Y+b}D}j+U05a{_C&SKm2_Iv7j9V zPjwq^ME@;i^Qp|$qhZTw+Ygv}5$K72qjSU~In`!oM!%Q9pl_**MO7L@?08XPDt670UoQ{!|W4 z2R2-&0;Yelh8CUy5t!tJm(2hBMe>N)y_;WFv;WrgbGy1l&p_FuFL#e z>YCY5p)zcSUuV_`ExDC8nUc>(S6S!O&sTSi_ElKH?sTQ~}#DU$p at 5 ziAir3Wix;5g`pHRyYxI=dY<-{WT`X5O$A9=(mc79-MyVsS-p(&YM1oEUNz!`G*z{r>ssEkES_-tPiGYddlIA z8WpiYr#AJ%ZL;9lC)|SulgleE=MN`ubqMVAnCsM*iRj}7wF8+i4fHB$0+hTji^=|$ zv&B_TG<;5`L2AO8E54?ozAgzGKMUnUCTHJyl*}*jI1iqT#?_On{Wqdg3z#QbQlIcR z#ISGhZ1^bxR8i5r6ipnQk&ODiK2cbNJ;%8xO!z+WiN6R)?$@!#dYRQk24e~;Exo{2 zHVCLabQ at c)*M~<^OUp;xTKF0Fdv?L~>BX10^l;s+5l%I=Zh)`ss_M*&JaX~x=bDh3 z5C!mFC?rI7#25}|Tji3FhGB9joiHRsUXHDj zVNJvi8|N^n9S-k!s9ts$yC%IbM#LTtX7=;tBCRk%L{hxnl3^mm61-=-VBRqfoF$+p zA{rh!hqMiI)vzJrt4)(p*bcjQJ(QQ7b0U<}3UD5;Pa>?-=H3%=zj(Npox6Ov3aW4e z=!W+tA6960FNYXdK1_%AB^h>LbMJ-tQ$HNUF{k at h0zPmY%)|$zL-HO5HS!pWMS9Bt zAGi&6;s)j-y=8z8+yvio1ACF)3cv^Mf{D3-kw|aJ;DOh{h1|eOq_=+XA7HQ$FHi~T ztrh&|Pw*fw(23U`kPUH)QbnpPR+KRW2WAJuj=ohis at P=^i4VIgZyYt$53w%|6!fk{ zaw=c$HEBk=3vmSt1k*y(t{C+z7LEKHq7;cdq`~Wtf_32xf(Off;hf~|6Fd}Y^C|)s z34?&XXM#rvfC8&^=N2s`WA}}+OdR1QOh{fp9u*}N1gq!u$7onOMAa at DErlQ=n*AJf{20&IlykT#b4lTOm zB8^ZU8l#Upfg6X!P2!P3BkjCjvCjW~MNGK-ngG7=sworEh1$7Sj3DH17fD!owx#gE zSSweznr1b!QSpYR8z*HemdZG{FHnlLFH{ueX2E|?R;<|3)NN$rZ(P~qE&E6hxmRs& zBfwnRQ_ijG;MT3{@O;Gh9LAWwO1>I`-I3h~f)SJ4i-1AH at GH;l&mp0`VT355duI%3 z!T84yb;9~b4kf~Vr423S(a#Ks0CN>L77NJk`%=fZu=DMM`&Xw^AXFisws&Cs_oiQ$ zuTc2pfou>1vOo#21B!bAs^0ki^r1*terX^|hzXdGOUq`{sXz6YN*a5FJFI0+0(LP!8w?5vT-2hWL>NDnb0n1DPOxWPwf) zKZ-zNh#wiC5yX!IP)N~}_%kK7Ke|75s5k$-!VAS4IfM*?h}8N2BIF)}GXn$XYYvJ6IJyhGa_G9#IG{H6`Ao#8)OAT zM#mw&M+GCMyoU*vf)$VinnDm!-#dd%z~+%Sr3|7&6i_(D4AKO%f>pxik>10CS;7iP z08=66QF)Yr)?f=LZv?>$=x-sZec^q5VS7^sB=?_a9 at y_F!SE0PYQqK#LUKT8%4>(5 z&Rl=^Gm-;*kRk}2Q-K7GZMY9!s=~_CC$K{1@;&jpHWePCS8}15YT3gT8C|48yc-WA zk!4UFr#9Sel-t1$HsxewBLIn4#$La_JZv28MgcHPy!}UtcTycp;aD($QcJMH4uyg) zT}1`}|M5K?+y%;vwhCdRNb3V+=m9r}Qld?De&Zw1$Opu%9D%2JB4LE)XZ)z?uzS_m zV9}^ZpnYJ|)xoa;P5FRpa<;dCkW8N&Dp{F!x7^BYhYsmyE%%Vu4%A~a>Ptevtil~R zS2F>&nab)fWi4Bz9PMY8Jt?EInNlTd=(hB&VVX|oARKbtN*`qnqy^iXiY;P>PE(39Jda=!xZlDBn0lB zgTS9QN_=4*Hx{>9brA+8pjJ(w5;F`3%ZAGKjLuS>&bREaV7Ttu%~i1- at Ym?E)-aIR z`xCvZR85y?C1MDbIkkpwwGpiy^S}i&9C1-RRE1adwTm^4zLLz=c_YQx&i_fsGSHE4 zm6+j7jOeTm#!GDXQrq%r9G4sqJXaxxaLm5prJ-%jf2zV-K#Pq`Di3DUh1zfgGcb&o zDxcN1;losdym+I-t%ZwI=l*JVH3=I5y~}D5X!?{HtG?wc=TYDikfPYpXZuve%8jwx zmkK@?bV_FGe`1-SiS~2wxUn{Wg<-%fZ9s*2BZw^CJg4K$K at UrEYj(rD6t1Y7+!(jD zZiR6twLjC{-c-id`}KEanlaDcUWlK_GUb!Xde$O#FX4L4q5ZtAWrZJe9!X5yeW~im z{f1y(#T~vzCtg at iefOgNkL_VG!-maRzRk$F`nnEMvj%YkrWYU^aBLx1nJ%3z%a3 at v zw%Bi&!n|x6ZI?`@sYAvIS4??jLEDEQ=9WtPkfRsfSPAt*wio|Y<$23imcsZ4EkgKe z9NikzJ1NX#um{YU1+O_aUzo)*DT9u~)8_Q5s{pThB4X+j=j%2LZy+HIoWI7IZd6~) zYNa-mRk(R^EEz@>lS}J;l?(Z0TWrr4otm4=Gp>0d*v=!Q$pJZ}K_V0&rdMph%;&=oEhsOllJJSXIA)W)C at XlaC-@6w%N{y2MP|sL^FH z(FxUEY(Z?8VM`k>{&ZE#uD_jTEK}eOPx~8O;m6tBlW9Yg_SGkBYbb7IxMy zyB72{)uGTb+JeS=R?GCNb&Yyi2-|2YyN4q at qo%!$C}z!)S)PUc`yDy{%{DfJX%jSA zI#r>{3%ixnD;V at QjIm*qmfpl at ig1F&9P?u)BCh# zE>}LEG`rfkwnJ+XRDX?f&&~~YsY|6t272zN#-a|@!%)a*0yx#fqx=yx9GWfGLyP>8 zac#l@;~ki9D0O;?sd6YX4-|X|_0}6}R=ndi&g^K%H&JNyTLl3)wa{wh4?$GF2*lzy z;ELVk9G6J~`q_RcFMgZ;^>6PpsB%E)1E#vfuhJ!G#OejQ>V=X==s|rUOeO({zcOPQ z23K>8r1;8C-ahBKB}C0W1+`^WIW8Oeo8jp_w*qjQW>H0dk1bl^W4%|=R!GKH)0O(* zkwRPjF7uDWA^yO_^I5~{kU~N(wH-YIG^8gn!^8a+V>G4rZ5m(&Mxc;I!G#V7a4 z#?-d?e3}p4@=-2y3gy>G8)UUPZc|f-zfaI?my4!QHzVNpTtP(tK;5|0ogSd?c}xrfpKyy=JsTUo^M|pK6nQ#y4Jd%()C>KS?ay=RtCQ{16x1E!l at QhGK7PcfsACDCcHpvB zdt1U3?x2bYYGbXOb=4C7Aatg^(h{j)X&O42KetN4MSHRv3Tan8|8s1vL0sqHN7jjj zJIAoWQ5ejIvDFNM>istox}!MNeI~GW@=SHk{OV5*x|dYbUpNM9 at AIg1TtYVXb>m%c z8aQw2ENts10}Zqy*FXquZ<8BoW+SR~d?!$7A;&qy7Z=?@_4DTHPHPLs4&UovLX{J@ zDv2Q at rA!^BU|!bs5u6BopipQ>j+5+!S=SDayYr#7g&9T|yPj9*kuavX2o<*WiKeMQ3=+W*F)QsY| z_0`k{*MipPbrgIDwGVIFPhaM{es?-RLU~TW%vNhMOKLmAk~b}B594jEu}x0gOQZkz z%9FoVszBG3wAAMdrKb&bo)3WaUy~$K&|D+cBA3*49gsQEmR7X=4M(h)ay at dqkaAJO z>7K3q8Zc9*zg#z8BDw9OqDekZA7tHIo(z;kDs5O~`E}%P_VMacK3gg{=qa!8V!o

)8-cTXOR>L| zIYkOlg*^+6_u0t42T?N8mEX98FGD$`POoZD+mV|?EX#)y$*A!ow91pEntYi5U}gIP z*96bBZTNT_)3-h8T%UBlnPA(*`~#VS)5M5?5ZiL at 3W=-|slkrmk!?gs_3j+&-=OE; zUCX|5OJFbTuyl~PDjvvfsF?QR-_o+;$9CMoeB8wh9oT#@W|d;5lff9txW_eZ=Xlip zP(dcVX4|T|x9hVhMS!y7`jM#7(ueHVbpRSFM8PD5{oWGWVuf5YCTQG{t8U&g1OTdf z-NFU8mJ!RDyE7cFq3(o`HS;VEu*hu_ZPDGq7-Tg;>L)F!5Cx587fMi>WM}G{=Ko&U zbeU6lEKI^vq;FPUqSM<_;RxxFUG*q_Q*O3_sAwxR2lvWZO{6V&5_(PmKYLg<<|6j! z_0nvDzz!f1SRYVg?Fa6r%1%KJ!hhH*(tj$^P=2U;w(8bx90QtNn|8Z};3npTt2dd0 zX6Ag9=zZITi#MeP6KGZ!2;piQ95$RqJ3N9TU`gzl>*x2_K(_VT~~ES17+eH z3?0{WFl(8 at eL1U5ABn6m^D!bk_>Z_>#6JUIqpxII$eyx@;C%X6BynxA;_u{D^qhm_mohCC0DN;?1Fg-_{eeBukzkA9q7cQ&Tu%klA0T4sB2+LX zFjr=YeOzlxPupH?M#~J3viSwYv_o_tYUA!;y`6BSrEjRXMK~M*@+!%eEVCexjkTDQ zx*C?pNb9X3 at 1Q#`sB~_wuGx;EjlQV2HF#3#GfYEP<7~jK>A!5P1}HLJ$;x0l&7h_& zQR=r#yv=iKiTq|mL|;5dXuOnV%_!4np8V at UOS~XwZYqVi_^btQAKsx>r30#vF6dFQ zN(6c%nfXGYkjxc3d%IaGdXz&&Sho&_ASGHe$=S2gl)Bn2UR`rGhcTiG?~I>-(f71L zGzYb|Z^)j2i$F&DREv{t@$gy*w|#R)EUVXO7;i^ zIYlYOs|=CyJ$RIXfVeMxMKYB(i8h7yBajt9B%eIWdiMj2onnTfFtskpOj<)`UAl$B zFv(A*MX}|_Bj(fw#X*vv+~aB}MM09^nQ>trWwt4K8bh_+Z#6-B%vv^|Z0;ck+vMkR z_`U1?ujE^Yb_1!zIR}%Mcdj1XfXnm;zsSbAR=a0a at _6;42=-_8+Q?7b#Q{;<%{w at 8 zrH9YE-q?{p at oy7`roy|TlbV|!@b+!uibXk29 at _*$Q*@+nD3RJpO_M9% z5i}og$btn%mS2b!8 at gnbZ-?CTc422aCkcWC(e1zsVzs3%6Kh9YFr5)9vcc67dEN{=AsFIHqH3? zRUCvPat&)-Zids~S6Zs167?884SCuJY-m&V(C|ndk#||dog}jwaim}|0cVJY7J3(u zoL3ljziFI8>MO|KH7e$jXyKJ-N&T%p!7AR)C7J%}jS9=42NsM=euc}x>ndcOD&X`) zX`JU>Ot!a at e`-WK8yx)_qfF=<|IrCQz+>a*u+C$3D9OVlj+5aE#qq;eP>d!U!h_gV zbilczd1hRu>hw`x{i>QwN&kdB%cr1r$GQ$!XcJZ|KinC+2u?L=0?WLpzkbl!CpYL2 at d!An%;A@=Vd&1Ii zriR?yW(sz#SfTrbw4s!5B2-+~&dn&o4MYc=zF$ z&{a>nr_5iKT*Aab;)la{*O)OCVgfWTcZEe5tC;}IyIeBOCo{P2X& z`TFeeWwYuzUq{W7Ztz#Nw&70|Xw*IYajc#RHkF3JRUaTR`I8^luX4;xxx==f3>s|j zZpYM98OL{C=lOcin_&=TH^|3v;d#TWkTJI=z(>Epwoe2ZYo-F=GYI4?Y~)0=!Ka-tk_^505XDS z`FEST+vASie`F9OU;_$GVXK}H)#%t*38tK$Jpp8?&TO)q%~}Q*)L>T80z+;M zLmw+!tBFERt~8IHYn6s;HHXzAfyPv4pH9}tv~OB(lGZvt8`0eFXG|mK2;i|MO+y?M z;=}7!?>#EI!|zaxb7VFeu+0ItUZ%3 at u5$eNE5H!%K0Lx=5xd|%9K7F2dG(WKFA?A$ z-!02dGu6j`%bz0_(!Wr)@?Mw|= zhRML*7{y1Oo;oXYgwdOiecpW8eBFHV&@^G42v2l=PXr8qqB;AOBhX%mzT$N67Fxy- zC&#<1R)J)GsZ?=mRx`j8w?G zrkVNIHH(~!Q`QM4q*lu7=O^jPC&myx#g at vc?u|91jN%4QDh7z4$S;#Y+{=Pbjf+U& zWv5+PG{@s3qUSWBB+6xFR29&fjP)KvW3<-NggeejACFw;kc#1T3|9Ra;~fe$qxG!y zqV>30dg^NWr^3!BGi#pi0 at cTc6}*CLIi@2V2%Z ze@}^W0#i!A(eg-W(A8isy}Eavn20W3K6+IPP)Wuii6Yml|I)T87Pi*{5HnkmOmLQ5 zn37I1Ec4*0y6xcK(rHA_T`2JaOe|%v4L`>WiXXZ6QT at E$@taF^Ycy^o_y!<1TOLIw zQsfl9+dXuGBJVzzCWaPLDMX-6i3oL^3MY_tCq(^ihUjV3ObMlIFb76oTyH~SYwF|5 zUAh3RwhoY$J*MfB9*SGfXx$$5Y&0B?G at 1bRH$z(8GP##wQP**M1)J~laFE>0pA4$d zhOLQgndvV6^9MiN^OxfWz;)Yh2iIynjda>aGERSL7|?J7G;g{hI?ggGyONb8=`-`` z=$9K~bWIDc89lvbT+>?{|tL~aQWv%K0Qj_z-wJnG4cOgNyilqY0Q~u at 6#R-=wMW^ z;p(hcfa~87(+gb)r^lW5_V~`tWnoPgZqJubZMB}QvS$j))UH~sT}d!ZkkIFP9g8$l z$6n#OjF3yeX#LWwAM>vK697!I!VOk~_)Eru5)6*|<_A%bFvyO|gAqJ}iUSvl7a@<+ zV!Sx)#DPF=yf|VsYDC;NQAAu2GxQ^b8a83 at 3&#(X3+*~47$TGvC&CF~86`RxYzZeW z1O*)3V}b-4c?_tnb7riH0Cz8rz_2OOR1IzrN{sT61eAghrh3C2TBGqp4!{i01nOWI zMBJhGVuou1&mjg#-YAC}OP#XoG7qUCgyV;6+x!ssHz72E?jhV_iNL?+Ae%5fRj6qm zD$H^3xQ>WOf$4FohO=L at z7>NJ1lTJbnoev|eEk6mG0vaCWACVB38Hu;Yd= zM-xEfarArI at d<%}R0D&Z8UE9YiDvkt8q0woe>7&V0K>-*3nTht?dz;Jj!~Szz2n9o zc at G@(k)88zWS#dkx`n|GzJD}Zv?+tzUU}$GmA4H at -i*= zcRD1W4+WE)zdjV*$lxb$s*w-#U#)gKIgBGMZ^w7Uxob)juRRaBddN4|un$`cW`tR= z6(NNb$9yw^>s~v`N(X2k7kInBuCzmh31mh~HH}?su6E?^hu##tXi*Pl*AEV_#>77$ zbPbPexl!-TuN)tq#mV~58GlKS8g?ROt8IA7Vv%O>3}Lmi$`qZ>^1R>Sm}8K|OpC at 2t?IS7UDrwueVo|9{BgN*kN zjHGWE%h?|HL*M122S2J)J~VE6kc`=tN#(ERrqNX^{K z?Z2n68UI at fJId?-4`GLbh*tk!{~GY0{&k^N9{dtoijGRk{}He!2Mxf^)LYnDn%P-e zS=pLco7jRt$l=Ms;latHVE at gSU^UrDi@*f|@e~CCq56Nm!M{`3w%U&MG|}i2q>@Nc zrNBuKQN<7$(UVx3w_y*HJQTF83_?_Gwv;?@SspwZsbb{>F6*vhCMjA?GmYabQ at XzI$A#Ffd>eFhXCQAUue!KprC|sNE}bWgz9R`{~G)D|N)%`l1FrJ4I0* zf<3f&``GTNc0G?qOXU+pd!>jHe^`pnzQdtnX)6{C1vH&s@#7_=P{X;q1c~-?(un7s zR(@l7IW1lu_4H;PR=601a(oN6}tWa{R-t%fqiql+8q(}n+XgurL3PT0T5ECa?#l`A8t8_orAM>rG$X~KCxiVCx;`JxQ zX*j%QhLGA>9|x1U-wYQm5DzDZE?aePz?GQ)9w=MpAE5DvUr`xdEGuy>*0_2|d<9iT z at s*JoLio~YB=)FkqOa7!jiDvX!HY*mq)uYOAx%G+XE&@Lnt2qOXXTk|3dpmUH<;30 zmslc1bDg}!@j_*8H#g3S8A=He%L(JmEQ6+Ov`DmHLnFjc7Mf*oQpnywo%sxxHI}Mz zWiYKgHFFWZC^`@nx*nw(JO`qixsQO>b?}^p!8)JGy+U(q at bS1Lg+ATB^%4T~&qr6| z)0^pVZeqg}XH%uIcB1m7*ZIHD<6D{RpEr|zI<}Zo?m#{OKU|%p*?j5kOYkEO(l%4FQ2&`hisLj?)MJD1_dZm`iKLuu zzn*<@FA_X?qzSPnzS)cmW_4{3nxU(4!OZpQM|vg5Uvk`d;LCGXCR2=FB(Ok5cX zMzKbi3q#kwS9$lnpL!2}X{_#}!;+pZ+R3JS(%>K?MX)IMQT3z`*Z#@?>|tNx5)F>; z8tC{!sV3F;7uWX{&mU|lCz at 1}lWy+d%Tn}yCIdx=eRn;eQloK*aWXp6 at Ss*uGQoOv z#U8|Yu%2sz`aD49=4StknB5 z-pV}nQ}j|70|6qnCUDNCd^h=X$lwzFtGzuU!>3!j>mxt^CU~1OAJHwdMt5yn^6 at I? zgOCva3jcoV_70(~y~sFb9hIkR?4YZn4>YryX+08~IRcwrbL3 at z5hXj4$i!=c&H;gg zW34nSq5DNd*V2|BPMIPW#L~29Ap18T{ssqUGUw4rgyK|$rjVV7TZv0=pMvhGW3{8r zB-+G%2mlABZFQ-Sb#ZxlkqJ at U&ZVflwYYEWpsg8lOwP~#iWc#CFDj+28ZJ{W{;L~7 zN=jEufAAnoQ$F7Ix!c#isLvJAoxPWb&5tkVvizk&L{4lb=WIK|W3+#FN*?rxBLR~p8>X%?9Z-6g|LO+7Yq(*trb6Z;aCXJveOGOgbn*2x(RPTTgE`_(Bx=VB#7g_mbc}ZQOjpDS;vQZLcu0~}l}e6}G#03i3=Pcz zyN4-Z_{qj;PtQLgE at 4*Dtte1PL>ejVT8P};Q3e4CjzymM_$Ri>MoMJ3$S+jZ$SO#9 zvPTALh_Wk_*w}dD|q~~Fm;EMl17W2e7 zzeJV}!7S^4CTp=&PhcX1E&78Q=gU4jv~GnwO*H*z6H1M87EMVSB+0GQtvH71s1QF= z6P5P6YPXVR{~5`mFSVw_i+YEEMB|Xd(azEn+1^po3ULc#UpbRA9q%+uoCxg+WL%V| zkH>Myh$WCrQy88qui3#r3zNTIt63X~*0t(1J5zq1M%X|EPl`~S^G=RaUdqsx~sD^ z7mGq=d)SEqmLYHgB3wdSJ85)P+ at 1>3De*9k+stG*!}G zO42-w1YG)*#828rmaO9Kwh9e7S%#Ci*(uzbHWBy~iA#ztuGFMU>%rEcwpLbxnBUod zDcCd$$<8lR)v6t3p^(MVm)fk-7dg-}D}(UxV5EF8D_uNDV$MSp^Cfab`$RiZD-N2f zeJpI;Z0+Q#0-!T+j2V?_wFCut%s9scDlnHb%X?`F6e2@)7Av$ISz5SoHuzhm(P{f- z-TB+iy{b%gdA54AqX7bQLpQK1r*p+8XIh24qQ)8<^G(a_{rM)Oa_5RaQPLX3Fd)fU zt{q|RQ0{+ER0|w6_^(cWhpc^oq8iVd&{WL&1Fc0`ma^MVD zKN%1TlpC&7W^fM70hNUeXbX0W<&+rI2>%ul^bRRN0{j7r47*8hq&7GLMud8w732u# zr8l_pFJc-REPxbf4myB#UlX(e*-Hy#4sjl;faB6_8iC-~Yf^&sh%=gi^T;!ThumS% z(rRKye9Hh;!nrR4J>UZJL-}n4eL at MC4;muA<$?xs1BszNR)PX??;XLvCW5|k?wf

|1k!DfdyPJ-Kr zjiNn7$E4|l!FmTT_+E!MMu^>eex7MW$B`w6H^E?GlsEEVVN|ck!9v(xIiMiVFyh at v zi; zD0P$r0x%)4bf?H%^&v^_+K6xmE^KwO!F2(fIqD2Zr}$jPh at TK#om*&mB)V|+4jy23 zF0FVxD|3orvfR2*YYy#sS|2P6bC*V4xoha%aA!T*>{~5Rc)QmeJX3Ss)u!Zcdv at q{ z9<4+zybzxf*Pgv`gS%ueQvD at S{*zw{z(ADy3kW}m8dwIZrm(>WhzvBIsj+~euTztO zlPA4vi5FyS-)JS*=1lMC*uG)Q&dtVOH>TL&ojaA2Ge8C{$Bz0+d> zBQyHf3jKp)`$v%|SrR}kuvi!d&*p=c0Wx5o2q-9Yuqc=!7!>G_q9_r{;6D(GZp|Im z*M*x0uphC5fqK`30X)Ivumlo7Ri+oFLWRLAlRMM{-)mC{0=;X0whw=UYti$MbdVBa z7wljeh+POO^ej;$I#83da)<=drj(#U5yoIXuxAK77!EX^>_Iv(P_SCqJkg?P5%zy- zp&nuzCQr5~Uj#Z>5&Iqfy)xEc{KbD1ncN8?xRkp2z?CcdGuRh~K+5Ql;ssO~RMmrU ze>>%e|8WSplgAyn2y5EVvlAlA7tSXm1k0$fR}$ zU^#?1%G?gjdN~w=Hwb&fX6S?`XzTga$Zi!nRjDLQeMRk{b5t%Ez5p^0s){=-heDt1 z3dZ8MLY??%ds`{|DN at QhXB`plk^(aESD^HR&JZ^C`V{{jb#G>2P|A+^AS!XF at 59Y- z$bd)HUzxA)$IhCz$fm)lEr)6x$T9w5++ zU%{7w$uQBMYj!}C^#{aIb+|wIsIMh?c>GgnAq1_Re(czHF!bhVMO9$RF|>NMK3r-K`fXcfpL?2^M(H6o{ZFP0 zG0ThX2UEy#I`!tMbZ*$flfVk~jh=~DOssI9_#4sD6&&CL%qOEs4&Y~5oqTkTv7qp9 zQx2v}X$KQcw6z^w-|%>Go8My`gXe^*qV{BBmmxe0t?EbL9-~iFG($a2KpWtnZ7Q7C zndrZ&FEmYDN4q_-f5qe)_egJ}XWr0Kf-wM)=_Hs?KhBg!HaAPd{`NVi8EE&*!B&3Y z7<=~y2!N at du5^a~Ei0L4C~QabxMhv^lgHCmR>;7(h1R=u%)~tMxd|S at 9BDEkIeHeS zeMvcDI}hL~p8fL{-=y5U)Y}c0fsu|y`mB)^Po7sU0p9|3LuW!xJkapwX?1Q##xch1 z7nbPq3m`YDh0^U7C3)Hp{)-j6)J2#;(*DCi1efv}5SDJ8sCMdM7|}#`%u;>xfp08n zuxB}Ft at E0F$y at +Luq7#jJSZhl&E}L)W8P!rl#N-?ws*7K5c1Cfhn>vPPDS>yCPkYX)C(&9a_xH9Pej?;MAx6TBzjFNm-j zF;I1N{mc19LmMJLCh;KF7tfP(fU|F~|2ERgDc=;mV7v6ATQ)!4EJu&&DGgzOw!emY zQ at 8Y^A2k3Eu)mh(DfQ=*ycd<0dF3KFEmO5OFztYA_?-NKQo)aQOsw={9n~OVl$-Nm z4nx>BEzmR!U)oOs-B9KsSS8>c<{c!u(e~(ymI(LMGrq}?^np{sk8x~);M6mrsWSO3 zg6f~|vRNhI6~-4Oy3yvSmX?U<)R54a`^e{zwbz?F6}I|~KyaY&I)d)x9X3D*E`vvw zaIMoQa&p!^zp;C at 8HKuSCRpzI1;$qFtC0Sy at R*wTyPj$Q`%hrSTVMpS?$_8as5#_2 z(r+cqZ>0y*nE at CHtsWgkzs at nfUEi8d zg^@OfPK1&E6z(CqCVgvvY(6ebtSNuE;La0L&$)K at Uf>i~Co*S4SEb250rwQ2ynYAs zq%RK=OO zuus|8vsWu>3!bxNt1hkco!B0Dmm>w!$JdTCJiP8UVwhHA+7`86h z`9^9ed>TY+=InYfw%Y`q+agU$zEihc6%9V;#OtS*zRAPYvi~M3S-ww&t!%id`*)Ku zEFIdIVFx2#kU4c57+Y%WZDbj~pz&yU{tWpz4yYo3e`!AONPM*46c8JqJcemKTNT$! z=XG7?v at EyQd<{l8fC-p$VvGR6EXzE>C at cFyXK;@fBdSbb7`X at 2Q5$B$`6mnV3ybYf z7~GBH8OP2cOcPXuUoAHfE`Dh{>arO!hURMujrJ@~Pg8F}_Z%ioQ*T1&*nX1x8G^=T zNl5zb_BFG8`#=IA_MU~dk4MjSd0+Ahx*QCsV{>~>lslhHKcGoEbi%(pjy>@Mn8)t0 z*Rrlo?;kH!8ekKDi4N2$r^awsUABom8>R~mUhCKS42Wnus?Ez{RquSI+&&7qUFkvTK+b&EW2I|20@%@5&)2-G at E18uCX%mc at 8+$({w z{Bn(rrY1g0N>_-sefUU{jozmPS=;bh^aUQ532hi_cyDzrD!Rk{DarN7AZjKy%*HY@ zBH;aHQub-3LiCPI2@|hbjYjR&j80o3H-J>c*h62~%O3|qz& z`LPdI6y~qKRn>?e%K%q<4`;@T>PW(iwXA=Fiw{qYLx*1^rt4Lca0#Ugf2WqsboIFb zvFt_s+xkKGC-{6D=C^YD9B-~v@!FQvka(*DHBr!XgymucnP0%ndIbNhX5D^Xi2PyM zd`;oLp7}k%avOK;eXU*;{`L`5L-zm&_xE^JjsZ?In~H^*L0^8dH at DeIuTN{CmJ}cP z&x?F at NB-uWdVbqs-fH?j$He1jeyUfcD6Ki~->t?!CpqAMDlk%)w>3Ir0sSf3z&XFjJUc4% zLb`9-?^Jl^#ih?)ze?XeN$wCbRWO_@;uV*B*i`drk?$ih{WmmN at j^YjrzJF?abwxX z-GXFiT{wLG*3_|df8qMnO;^kC4 at _VdI1%BTy3&vIe%7fx`#LClYWA#&r%1k;tVWJB;dCy4{WLEAZe%-PBe(Wo<4XPAOnDqsI zK0c~tk@{((#UUK}UhX+NM?8j=L?N8gN<3K591uT^|A{m;l=~J*CdkO#NTf??N-EGO zOUGL7V0#$8NR)Rm5M7Fy8%wbEQAZKIR0+X{bd5*lwJJxQ#>`cFfH#*1H+_k0Ubs=lR6Vr%Sx%lkH z65pImnRbLUwd~%z#-j4AkIuY|!;m|#;ZMtfnV(>;JuE@#R>e|aQqY3vY#z5c``UT( z^H00>a<9f?Q^U*Myt$t^gj|w1RPp#NTZ*BWIrdmS`5(9A-Wr*_zvB9-b32eSPR|La z&h!f`nLM?&fPw#ZHqjo?+6)5*0>TgZKWgD>F2<(j|EYy*Si4%gIsV_{Icbjna*W0c zdpy$OV~teIS`;vx^}m%--RQ!P6ZOYJ_Pm<_6#<0&zLJ{`k0*LytI*S+5}{+5wA}6kszeJgI$hT?OK!L7FJ_9H-We1!ilCNJA|9TJtwL8E z!J9E-K3g*H5^i2_iWfVy%uqUwudZjVZDifFD2bTaB+du_rF!MZXO4G at W?FXKmJ<>J zrm0~3y!aQQj3qt~6cY?1=D1=$%zoR at 2$7{*HbR}=#kK6O5m1M21PCJv*@72IrlRP8b=M7_)nTJ}H at bYc?T)1xE(XM7t+I=bvOAq%SC zCD~Ih9!BJx7e{ALVu{VGrSP8lgaq$Vpr0t&LkJQ-l94Gq#;y;20yRFM{%c`D1eW!8 zf`fpl!T*mo)_)Y%fAG=&rKWyreEv(I7fcLes8dQas#B4zeQ{ACMsjH7Sv_@^x zLb3lz%Fu-4VclZ%UHY{>zd9E;`+LHpB2caJwf{N=f{Sz{Zfe&1wa at dm>wK?+zxDg; z^_CfALnW334n`bs91GT3ZQ^Xv+NL|LF8ku+FjTMe^4E=-o*9X`8F;nI`mCdIrolDW z!Y?RvthV8rkkiYm=~BL}aT{!|p at ChWbIP}N at oHc{@sqC0Th>XTq1}Dg#<&lT_I1;Z zJ1=8Jec!bYe4flDOQ5&M6J$eE^5I^ibZyZ)1!CLQmT^Z zu({NYRKEMh{r2?jby#itAlJamq=RwCjF zRW1lgQ99T-_eOMCt9nr(K9qu-f$sI3u{1ks*`I1$$bt!A)eavXzWUYm9Skh{@!KBh zU?#bE9dlA;Ob!FZQ%sJqc>vRu)!$&dPmqL at b`rx|7TZH5%-1Rs at zj z6C8^u_BfWjj<0 at tf=fM*n*9gnkRROt%Q}k)K9P#Gl_B zvVX&5jFRpd<|I)_k&1B1^dq03-zLJ03!Mste8 at PEa4!URbs9|RRVO at Bv0uGSl?$b! z at SQbuxLO>W&CK>qSb=~J{|3d&&KGKT0p!Q3sepYN+NR8v zyv%v8DjaKXU at wTG`9~Mj6zlX$DN8Hj# z-VYK&-I39!W at +Nr2mYu&b}u`tm4A84#0BbbSHp-yO?cPb&-6VuV)^XJ$oBOtkI_0v_iUYnB>Iarary9Ykm8!s$B^Hw_}2OuObx^Cz?x3upqv1Z>x z))nFLOYA>i at T{U|jB at L`K%Dtsu1xyoiDRyA=i at V@@`EO7P7{o)t;05^hELd*&ZI#g?i%*gA|Rq45qeAW+? z3Vgk4=y+Z8Cw!|P_h`cYRn<4YnbZ37%3Yx2G+f~|)B)Pq_0yHI{K*_ga(m?m#>)<5 zLHu at aV`#>EL4j at I`#ujjV&`1EiiY~pPajp=SMP`WE zxvIkzAI*40srfz4GdU at vFPBO+qfM!z7h<64&dvj~-awEmZlFi|8x_me;mV*CNubU} zAY$-C=RKVr%{guvfHXMEHFbhgEr%j-*F#wN*Zfg8pqEy1g}NO82sHrOC+kD z;ewA|w((0XC>TLPF4_iJ2`LDtVh*iHI_L*$Wkq&X&FO)%e;k)$(|MXXt;QO2l}#7? zE1`M%K+`C)v|?9huLV)@N43?ukJkq~YcaQ?ylfjBb84bOw^x~!Nxg6!6XoF<4P4B1 zZMT-XU|k-7=ifqz9j)9i+J6E_6Vm@^V*N**{BINMzXlM^Ef;ht48c%J_`G(|P{d&q zWRk=a8Vb8+n9)s?*h!0KmRM3_3PcM##sq;DXOEV<_x^!X&T84Rnlie^>S?KR7smw- zjcZ)p^vspLjs^X*-#1JbcYy)l=!4*I&5)oXBf(aV-Fn&bX|1Xj^99_ku%_)D)ItG~njUf|~s#pUy{@iBW@~#&d6F6M5e?qcT=fdvb5NP7AWIlFFEp;*MJeKWM*KL&1|2o22xinvbFfH{0N`5lbJ64d8M597{6(D zxL*y29O at 2%*cc63vpy3*gZA8x??+yj)A?=7j{bal)iib|UvG4=SCjdKNSupJ2| zMZRa(Jak2U3a<{Mh4!-I1YjOF+_}^QcMB|i?G$fjWi7keduD#mfx&UKlf9NFAu2w` z-l2_odS%HdW4O+dg=eXQ2PkYpQ at Xc#Lvve^KL!i;QMI*1wunZS03 z!v!xe{NtV1Amx~F0xDR_nK%@MCpc+P#tzd9;R*t3u^Xu}*@R~&LX~Ia9zra~IPH*N z#5)2W0ULK5hYcYUXB?M_UC+34+9}>RiQb&O83yue<12VERagaD5O1M11?aNh4Re0Qc8#Yul)&Q?Pb)RW*EB2`uWd8cWPE8Tq?w&eQ z5`Pv29{?ql5gpG3e0F1{wI`2cw-Ru at cN94XHS z1JVbm=?gXGeO&$cZv1cC_+z9NQjqV!&lqV83J3mIXXhOa*S5!T!AyivW}<{dADs~8 z%_uhvQHG2j1WWW1;u1YEEH^q~BADFdD$!ezM2TKvqKia^=p{xFjB5x&c+H||3#Hc;`eaMqLRT8ma%|gRiA_0e+A~&i2l2 zv0L<4Dw=h&$WHpqj-S%5klbm;7IzlKb8%4eR;<)rT1BJwmAdTO7~fIv$|q7u4J0@@PAD-ab(g5k^LIJ%QBKdxptt*0UKAE`ls?K_ zTDx(0r=ZX+dHP^?my2dGlB~rB#w}LVU>as`F60e~qRKE?-RH*=UF-9_ufmP&Ox%c7 zPaoH97I}VgU8|(u8}u5jt4gcOahd#LE&5DF!9(}$?s)tg1NJVU&b)n1S at A}LO= zD$(dnu?x~yF&>diLS(6p=u6- at gjlqsoWh~pE<%KM0ICy?3_<;t)ImYXj?Nb7`vjJA z5pcC7bOsVz`o=@0PwL0TP*v*2eswMV67x#u at w0-SrdlhN^!oWjiY>vOu*`y+b3&pf zlo03iY`bbdP<^+FWxpLEujE##pJtr1bnl?~SwGhW+dl3A!_pf1fQQz@#nN8wV z>!`$tDRFte+7)i1j~r*3pI?aLi2Dd*A3M?8xmpeM)btk at s}d=cmZ4uVcxm~ak2DSZ zds#Hs&D- at jZ%3<)HOP~4SEJ(VRfMdjTKTiGv{T`v`kCjDgnizM_ZA$pAWOvi&t4Nl zl=awWB<7m&B3`87!(0#1iZPF}w#0?^Nz2_l$ZXRBR%=jTkTZmysA8Sjqc>WT;n5q| zy--rqYt~&(O3QIbuTjzn>c?*N$rY*aj3DH&UB0 at krN<~Eks z`D5H#Yj<;yMIjWDP&a9f=hN^ASx>f0(77t%$>eu7{OqB-|DTg1v;7>(0tQf|qNfqR=p9 z*bsan2X{&){*?p_9LEhqWHY&d!{N&sPZefL;%oXA=o~MLFK9WgLH%l5$xsE0d;Q~t z#Lw+ at +~EP0f#QhVVP?Ti8n{_}6?i%?)lAAqoj7I%s!d=!gBQ499Wh=kmYr15#wF$R zMT|x#I*p5c+(ei$KQU*rQ{RXE9}Hgj)-^+!*D at Cjv~g()B1IMhHHXXo*qb8rx=Cn(@L1ff2rMEk3Z51= zPTiH%oY?gt%BhtuGyVgrfaLxe~}jcAi+pLH7SXpv@`sPcO&F3{jaJ* zoSAc@`>#L)jjaetJx*HqcQy`qctY<%>DK9mJ-SYTBqn6K&%UIWVi;?g0g{h?lj}aI zbu8q~b}R=4CcB_$HsI&-n*>+g?RW_%TW z8Py6Gqi?*^Lh*wdtzX at Iu@P%byOY~;O3e_;Y(B at MZE|RNn&332w?gy~7`PruVEg2I6{c!}0eHrc?=2LCuYN5r%r2)v=SY3WOf^7mPRV zuB={mjL}ehw})kf7I&0~U7|6(MlV}-k1N!N)Vg)T)Vz;`JgGR zmD6`nW%z~vLkgdJEh`U9;O2)AN$elF&%qRtkA!F1VS*DqjQh~i-Inm%nmeq<2B&D* zX{f_QL;w70%F*yJcvOy_0)){vN6DZKb!0IpL$r>znfXPG4v;W<$f<=rdN=>5i2YEz z<9`o3C^O6to8N&@w22PZ=^PCWPMd~CqsqyjA)RN-uY*1!Q|0v8XcvJO1aQUb66U=W$A zm%+ykDFfNS;1pH0p~nqX0olNS236Bx#}01*;lO!2Ro5a http://hg.python.org/jython/rev/46f79d2ef0dd changeset: 6330:46f79d2ef0dd user: Jim Baker date: Mon Mar 12 15:47:41 2012 -0700 summary: Update guava files: extlibs/guava-11.0.2.jar | Bin extlibs/guava-r07.jar | Bin 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/extlibs/guava-11.0.2.jar b/extlibs/guava-11.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c8d5dd6f5bd5b0abf33f5b0203bdc8334e2cbf GIT binary patch literal 1648200 zc$}QO1#l!umaZ#iW>$%rp-Rlm%qpdrnN?zDW at ct)W at auivs7Yw)w?tA&GhZs`GNlBfc{-%M3e>SBxFSy4uVFF*vJ#>qO3L&yqIWVA4nA1*!=cG(DuQtr_8ps8Whbj+xYzXn3$F at hpnyKTyXN?|y$H$>Jc{vuh at jh-4jB zr6$QfV#&e-y7}wv?N^5KCNruoy)HeF{QuhqmOr%t>~}G+v10h2BVhj#VPa!rVrld* zfvkTDMEUo?-=|hK*8dXE{-=1Hzl=Aqv9vTYaQqt`)?e!Y2Bt=Tqr&`4l|I1X??hkz zXOWq;qmjKe!17T%mPL5`le^Vdv|12`Fu{LnBw>Pr>yMFoWN=*R{rhn5j1b-<4SX?0x8rMZOlH^h1)>)}m#$ln9Wy8# zDtGwA-s8QlJF^px1`F!a?GYn3I=51y1>*W at 4#JY8Z%nQ(nk(9Dm`$S?Cj+HW?WUi> zxE(*gYvsnQFMg!B;xd|U=R%};HwGpztcQ~R0R8vo|6&4);DG=FNILj7@@w0M8`b)$UvTyy ziN;GvlZQChS8hIbIzMkPc-2hL`z`TSzAqe|bRQF%z5YxGe1XNu3Tt&pc9?$6a+v0D zIjr{fdWPqR?0O^t(qY~6;tmKke;^;6xi)}dLZ7FW=KIld930k?BE8TfSO-C+jUuB- zYxwpJSc_Eyokj4p&eT{%`zD_Nl~)^m8gpPjJnu0MksT=U1k-cSI3C^?FT7GX4Q!nuMxkNyzt=2Q_pIOO=o5*Ozhi>*NR zEQ#G_m`Gld)j))!9O2 at kQA9)O at Nk6VkhG>ro){V>1^U7RMP)>#)z|qg{T-yD@ zj3qzkg4Y-?Q)X}ydY(X5F0KTfL;vJJb#E;~5;f*;4GQ9!<*A)ap*F*oSb|S-08HN(Ro;^867;i0}7GA z)jYjT6mW%g at iS*dpfZ$U at p9Kl|Nd6so%|%Dg4aEFasx&Pmqh5LUCJE&K+z2Kou*eq z{XCb3_LW at Eaj@0T={M>-CfW7*7k|v*RUr4QF z#_37>@zlAf4#d~Di0KQq_*i5OoXK(o^iOf-^eo1x)V!DlOwA6Z^E|ewQ3VTf6UVH| z3o>!qwaiewZp+7T+NMdof+P*WUJ{s^ATPXGqyg*Mj;dU2E!JN!zk|4mwy*+d8pLWU!Q!g=91s=l{0vbfIu?z{E`^pI1p{gCs{i z{%&xfV^7oEq4*OMZnkcdJghWJ5*x#%5i(p#(JoO_xV+6&8ylHImmJT?14dplK#Uj0 z`R3q(sH=l57sM$~zot8Ju>fR!Cgj3&=Lx{^vv*mSF;{C9vGx%z8~ulBa9?xoMEKj-7EEJuu(#r++sfN7wB#cO<3(|NvbN#{Dp#Ln z_y5AQ!3|!mUZCU!YqQQb?y2WW=8ymK^em1-lvNfVrIJI^T(zVuH^|K zSH}}eefMl*O7|q19{W4&t$&q>(D at C!9c|lC at yt)G4^UrRbi9Rg6f{61H>{d;HG(la7*+9hZ2Ka>(ixY+EAlt!}JfOVa=$+1DWsRtR>x zZ^4tzFg~*Mz~=NI=FUDHQQp(2qTJcWJ3!`?ceLKqnZtL=q#5eH(+5<-sU5tk1+dre zkpG^Fn!*~tqJRJa9fAS at 3H@y<`ezCvm9YN(jV-_)pl at lU3b1rC5^*&!vi)Oz at Q>`I zWMP9MfX1Wrv&9okt1N+fsf^oF?TwN*&lD9$A5}}@#m)y>wtgaJ)Ay;lES5a&3G_{2 zhzmBL=;>*j+~ewe)#0l3acUwu`+GNN$*vtp^SmAV~`)wJog^SrMve1M*c(UaSBeq=9eF%ok`cArHija77)%OHQLM6jM}M5k&%EG z#(``}vPp-a$X)$5#c(3cWgQePD at n4S2(MN<+1E{&V`m7^c5(SvR9I|;hCMMBB~h1% zEjF|Ax0AzBSXk7dy=IhTZ*9Z={78=?@g>%BXIT{5nh%Y{M{deK9{Vn(_>1fB4!oxv zo)y7fVtC?Oy|=W+TTT5n_tqs5=ixy(qx_0bQiTmW>?v{rq7FH0zJ_2&>5W>}}y?K~#cFKG{Hn z-a3kGYn%vDq`FB&+7s<~v7i=>R at yt3;|a_Q!A;jxFJQc#*+2T^aCm&Nmcqja))MF0 z%Y7s_o*(h#bH-ze`r8B8xcD>=Y9i1%C(4x)VyCw`pPe)_i3KTZbUq-Q-F*wC4I at mA zB37_&U`fXk8N{=Kb8!vTLJ%?xP_tu(O$<+HxFq=1={vrz=Q2*BYXP*gkiN){(A|DL zX>|D-2-)Jh|EI}c&BNN9FE9|$?QiV(|98j<*z21)+5_y}{&`2-#`5>cfAf~9I4;@G z|C_hL!97mMrl2)=x?-kM3hg!dEKNx2QVq~ zQU)`)C`_h!ST=%>);)mEQl`IzcKD9M>5ml0_B8lngVw{f)^#fJ)Q&sfHCSI=t}f<- z1_ at 5ya3!6+R-s at d;%|}2OMdfJSvC=rn%*=PCzM*=6Oe-qn&iWyT3UPa(+cybQn6_~ zS#}P!j1xH-%^8?!?wHdHQF~)yo>(fNh;q+NnxW_ at 3>jVg5nK+j%)HSZd$XDWzSb38B8nk1R0S!tORQXwKg7xz91{dD_3h+H7lW-VdL=O5QJx?EGo1(uX6N>$1 zh}bY7bP>0vT%1|lf|-~wws7$Wx*ils09Aw+o-VP|)BP6FQis46+pe0zv|KnvT!cu| z-U#wxiKKkd4&^9VQH(qAzYp(Wu-bCO?|xGT|oMn(ZcHi?U74MV^OAx=U4Ec^OU8zMo^H;P{6N16v0WeU{ytk z44?}&)?S=*I^#Y2UP$f?N!lT=%909gHClw0qAu*2#}eUMJzo&paT{P&l@<|FiCt8d zVyJapV^y>vX;*^Dwok6Z)x)a=HBl5|+Ug?;QH_8ByO6w+maK^6KWf|t64J3uB)jKR z+Atcb8iup%<8*D??A44eaus98m=qA{P^{P{R3G7+h)Nj%^=r#%VHBTicuq~p)(kT$ zaLQV2Lrv>iSSuatKS!K>7iCG840;jQaSghWQkV5DjaGsKJ?o;#pj0J26#9A!q99W| zd9kS863Z|+2TrsJsav!;;e<_-T>ZjnB}DN;!Io0 at uG!*i8NUY~-DEi4haRDhH3%p4 z+$|*o$=$3680n+c#Y(AXj0T5owoM-^YkmccWG9cb_{Co at tnvxvWQ zRYt9BvqeXgaH-QSHd#nCbkAy+MY?O02?7ECuKv{^nGpK%WHDWN#$TMMIv#re?uGZb zI<|;Cth~WJQnWgT2u{94`LUNeSX`xx&?%4 at r7ioE|e=+Bx~>rKp-MR!UGv1ja)CFlE7Iw zXmmJ}=E^F)oKU{~4)7lUVb|~hGb2(2Ou}H$3UFiis9%G|ARSGuR7pjkFNU`sWqA;6 zxxJ)&cXc4 at LEu7=GnVi9`C=KvcldGOSL2B5>DuYa?O{!DG7xS}06X6k*3hR)-ODCj?-9_`z zeXq#$B at tM5^F~B!WQ-VFf?hr9fPr}ccF at XR)xjme-k4)oa>g2}br6@`j$Cz&#wEeB6x5 at GOeNaPlyVf;+JKq-iqgtjQ99vg(Y_X_+3A z%2QY>WDJ!p+t=I*bE6F~l-H51m94R~>sO0G>|`b_SX?U{PKXQjGb)HfSe at me3dCHI z9CG>kPMNV6xa-pxBDG|{6lMEk{Hns%=Ih)PqHifb*=CHf>jhLPmLi`Dt-(CJp%SeY z^|Jxb&Yfh^&b}zW{94}SMlE;vsge`k@=@0Tr?O8fk?u1numjhehVwzv^$&C%47qKv z{?tz~smP`w8|YF4j_`2xTxLGW#A0KtoQ}o%mVj{$?x;PD1g1&@ws1D>Tm-I#4vmUE z>i$qjM3qz4Qa_EjxkTkUFE7_=gWQrmogmm~KYK&+C{oA8!w-11CT!-e^A3uq%JDp* z!d7LhS>#SUwJHod|GBs z<%H>tqSkC`u at +qX%y9t(#ZE8 at FD0WZ8$ zc3!pSeowRE0ar$V`IbDc+}`TUx*7L!;~USe_?%lM_d7DmO{bz8;mP0}tLIUJlG_Dn z#QdYsacy+2nMdJt47E2fNlw4A=-zT0fUu!g>^?tiz1Ehb-tV?-dJbOs}VYQp|Nef0c%FNmMw%&ujELW%`NfG`}53I}D61rKGypu~!o2m+Bv#=8Z4 zkCCe)#ch{)9GR;;GtjCxNoT*XRcs2hzG(BChfAxHSuco2YjW}|klETyvff;}oE;wX z`uxn4r8qGhm*K-FbbRdoeD|)ty1My%N6dO3g{%VVLBPA|HQ6B)e#(H#PVRyK9O z-2wGIt_Sve(l+>07#RIi8Dicw8{rT9E~37#WHCEhC}2D5#BU at XPZY=>8h(q{c~D!i zdhl=IP at mMk**xBAe)s1eHYi}*gAh+H$R9#}SG|v^IiCsJ-P_$FDKXpL+mO;Th-6R5 zZz((<)nI(SXRN_J^dt22&UR9iIl({kl79)sM&hi%W(T0Kv*$&~M7F at BuNDS&s!!5a zp4SEGEQKA5sq>_86{6cqT7QUJYfqZJfca(2II(?AP`GttW7y>kxK}AhFlJ#zvg7F+ z3dow0m7(D{P!{DWGBjS;X>H)tnW^Ixyc at Coah@f7ngu$#(_6bk3PO&Q7F6fnm2(W< zwIRdHACP3Y+avI*`RMfG|K(H?KwfN!)D*}mCayd!%+3|7;9>eLaq%Q+wB$rkPN5MP z3_!_M#k`YN6*VQDspw!J%>njZGJX5p6fYWHB%kDws$Nn~be6(Bh?WH6VTp{Aot?EN zxnMIUV-|KTA#KK_u|xEie_IwEC7chpU^6I1VMESQ&nif=wqC-3%oM5vS$^l(jQY3C zaap1P!Jr}*a5|-hhL}nC1!(azarR2XD5`ZLYT2WO21WT{vQ~_* zd#Cr}QU?WdAH}E`u*_DZ-GrKb8B6mwJe*JE?!+4}f)OoZtvQX&oE^sgjw_LugCo)) zONuL{64Ga1iAoWmg;!*Ne55%yNoPWhnG{io&ZGss{}ZdVvnKfm&MCJjFP*fx;c8k( z+SKXZeh87)D*O_PM?yVLBz`1w728-*Z3XWpT#&wOriz0b%-T=&F+CkZx3Ll<4W80N z6XrmYVq}DGDwRr-x)-6-$7ZS~r}RC=G9UpDMsCCb$y%tm;fTW0HW{IVXO%5%t_zUz z8B!KgB at UXLT(L?;6pgGFng~@;CdD)RD-OTzQ>DoXm+jrCr+7aY^J;2M_mSM3+JzDw zDD4;gpVip_g8 at Td6K&936kTOXNxLkE86RFbwC?6uB&k!dsc-#8`t;ik*u))GuYe;t z2&DX5GXxh$byCub9M(>t0Vd?r5wOaQ~K+<*e&HSg4t9g(IhgPJU!x@ zW_pvZpnA96Xacw5Puxh{?6(4DoUv(5J z55~moy_84$zon at -EaC zliJMcEJuZwni~^OpD9}zr$GGlu*%<1YN@$}W( zby`8S3lXx~!2 at QrYY1e2=BAy<1+Rr7eD-Ns=P?;#>!ezIo46hH>u_dk-{kO>-h|CI z(rTjm?xwpnQOuOw0Vlywx)oWI`8C>j(L0kPEKQVf&$~hA5!w0Bntb+2aW_b1%)@+D z10_uY4Py=qPswsMEBvjBgRf_&U{jej9gP=CGEgpi((V_x{O?(UE>lD8E*J{7`ejP#NRmM z8A?BlUVqa at vJ)SA|3<5?9fY_GjEp#z(!*uw%102l!^}NQuV&aXCaSgr(>HZM($v4h zrSq$ph=q59=)Bb5wG`1qN_e&8rn9QRR7jtdjr|)ZtF)|+zD;?K!KQ9yweA9v)57uA z)x?cMlCg88y}P1JHg=(PxPDPywR%}aW$DL*fZ$g;ojG2&+0 z*~(NXMeUHl3b&~f$Dx&*a(O9e9ob0)!3voo{ZmJXk_$L3HtESD*i*DmW?{Vfj!Jkg zFpIvEh+bDKCzK1MVXt;}JR}k_E#qIM=Pk~fG!L~6CR{(vDt4Q#Lb0|b6TWbk&nVdY z-!X-zGRhC%6hWk%R}_?+w9*PakJOofAGm1-c#4Q6 zESWo~U#`&AWnyTSn^0{~B)(Dd*|Z2%+#vX`{WGdj#F^t z*>pr?3Q2e#46qf-FvdcEC3z#;_E_mA>;-Off3`$HuulWq5O@?#;}Y(UjUQNm3-{#Tq|vJB1X#jy$U~}Kt+_V58V at d6I5IM;>)#z*+Tj%9d;SC&tx(x z*4s~ZRV*R8fTRnCC{c;#G(=to9MwBME?k?s=g8L!%m|hh&@O%2escLGgHvw)958RW z6~Ap16qY#m-6H;yr2dL7e##h4>ax^aqg$eGuBZaFVPG(%FIL1<9qfByg at g7IrvY+= z|CrTnuUSgY<7k~r{1R8>Pwd+(hq`;X)#I`Vlu~BNEG7-Z5dAT#DjXWhn%+EHq%xr< z9KBTF4P^jpQz9 at oe02qoD~>%z&$GD(2p7l;)H4dayrKp z-9lwTOL7WJi&o1iGC}5Ka!%o#A8-1)ru3AhV^Uq;WfO){(2ez!{rZnam65e`b1*d) zFfEz`#3Ukhv()JX^AY#P_=?vZwxWvoqS3kdnnU4$fXYfV=KSP_{LhrB~S*5 zB%kvyqSX=L)%k6pGy8eX)kgwW+9wOfCH{c8)56wve?))E49MP1cYj-KKZ=cB5mPC; zzDTso^en&0{7p4K*qX9*a|aKX1XbsN_RUSTfSYZy7AkSH2J%yA*F3>yt}l$Ibie>) zP7Hv>XdmMs(6$zlPc%OleUI}Gw6<%e&P3t=FN0{CA%@Ei`yw~o|51dyf52Celz&4ggS2Ux{!i>&CLtQWVcq(`bWWl(8; zNyYeP5}lhGk3sJ&{WbhmrB1xS!&~cGVFlZ=U9F{i8Z`=R{Vhuh>GW=H<_dl29priP z>K^tehXXG+)nolhxm5G#$jWy8cCVaIM0UXa6V-}eb`T>kq^IkoeT=lVCv53O?xq)N zN1`Zg&I{e$ODjuEG{NCv?d-bg{vnBRogPc;7ISNMdyeVt`pF|yM?WJfc%E6#v+DrE zFHs)H$cFnOVk=-d>Xjq-hfuHD3%rJSGku#L2V~AIi1HEX?iQ#W$j+ynkfZ8uB(pn@ zlhvzEJq=HmLey=O-tcUH@;B~=UCiF->Hf$kvXJfM9gH8o72X8;Pi$Cy)edNJ1)~th zJ}z-&a4#)J9vgK$)~f`~meCFyV0~xKPX=rIJlnze4bLoK at v1okblkh-1Vb<2nl at kV zC?|O!u9*9;Bd~+?3&P{r6qzSOdau^>w3|@wzG*Xp+DBbRL`o+XoH5RqwwEVhm9KCS|El>MJFs6(h^IR+WD!u;>rP*2 zprOzj8#VUBD*xC}yks!F zBRJ~c;nl|Oe{3F%u`E;bvk{!Vo%7578cb)ERn0uQpO+eiunw~Ipllp|p25KDXg)~c z5k`wR353=}9j&n at c^`cXSU7nL*_cGQ{ahZmwE{0d!K(-4O(N~}EIFd5U+POuIMOi* z*bB7pWKFK>~^@z}Mz55y=LH)7x zefjBL3$joOHa#ANa*mH|Pq=Tp94lDYFSzdcUA8 at _*Eej4?DAxv#yv`NHu&LRmuVY$ z9BMY%5V?+jUbSVPd88Fs7H^3`(-Kw$SzR+x&*DN8TEk*AgNLsRVKghIezI2A zdFAG%dhnQxc06Wa+q$uAr*R}DNazP}wpU3ac8y{vP9_!p at hK`Cty3AURDoS8Qxx|c zYTfB*i!)p~NP)X5F#IMqTEjnjU1b!%qp34$YZYqP(k9IOOGWUxD_ekByD|~3of6x5 zF&3`foT5K?luS;E`A0(Bj+tbTiI?oC?S)Ai-14bhPPrlAonHsSZUjCZF<1R>?55#|8EdZS|U3UWk0-}Hb0^YsQ2xh!sFGbfMcMX#sT)`xVovhic{&~+BLYf6C8*ccjm z7LhT}i;=2AKY1=qG2(+JxkQQYzxLQ1))gUHaaV)094=dnr`=vM;y<2W&%XLFXN at 4m zCK3^07E|&Ce}iGZ+ at _zl3Z)FC3~w3!auQ`+jxS`OZi-h%xR{rl)~UZat%|iP(`iyR zHB%IK5EEx!u2QOyDZePQS;}Ns2jFjI7qVRD{F3k-WNpq6^d4p0+_7{Lw5SrtbfHM8_&jl= zA;?*6eg2t04)_DZTSx%qZi8F?i-Bw}dPRt9$u=?pO-q;saT9jaG?#GD0;$s4qFEUn zE(=v3(xg4r@>EID&FvtetfKv+Ap>p`d8?8!^S#+m-ONEh2hmV3LX=9mj4amWln%kq z6eyICShDxgBFcFpLL!EvXyj4ME+Ti~VoLfrnK($@S=?&q6L=!va9uWf1+cHTGb{!! zQoTCF#~sqh at M~9E#i&-_P at bzpK7=E7AnAWVYrhEfo<3i?#$vW zLGO4Y_L>mhKih0Koqe at S{gFnDEJ7P&xU55aLiq1ciz at QPQ2mD53=9Z}=6?zGKQ?wE zm27P0`0>0Du;_H~L&l3H_~x0^df-!)zSo=wD#epYf9Fqns%yY>9-pPRB3f;p6Hc8S zK->;y{-|<<1&*tfx$=7a)q3Rhd3n|S-5ZGYnjI3<2sC_!^%_qLhZYpOQC(O>Lj|9W zO^vl5tXM at vkwqBDw}q-F9jQzf;2wiu1lFdDOonH7S7rCRA0Fa|AjIO8Jm zWebJill9oeZ3bHkL#xYR9F+^nJkuxjSUCXh3uF{`G-U7`f{^Tp>iEs;eb&_ at X?6VS zBTrhvzO19CuDW%Mocp=cJ|rBCs?qt<7ZiJGl8kSyO~-D|tWd`zjjaXmvc+yW3&h>{ z;C*Kb2vs3=F$M`(jnLN)j}dt0Q=@~4S+ft2zWsbK=ofR1M_lHRMkoG9;(Vk#1_YTe zRY7f`$)+hS{$!|b=jN`3F+7sb4GdQhf^FQ4H%QUa9YeTb4x9G$c%z#z{fCt(Bl0N- z!IEsai2Xx!zpyZN at 3716a1Fh*3h5R(zT)$%z}O&VRe3D&@*QQ3*H}#^**CRGh^8ml zI%$+p^}>Lwz_zKIz1&hFxhGff6dZ#`m|sAu-=mb;G)U%(8(@^>3vH0BE3=o<8K9R< zUhM(bCiKx)F7S1};Ga{>eJ_4Mq%0m835x7FKdKF^f=q+?1=m;!$jN1>I~pQP7}!ck}K`L$g(u_#f|V^Ov|JTGrTJ>M>llB-!1#NQ zs3 at Jfq{?8Qb~eAoxS%cDnM{WT5K`8T%CE#}u2}^gs1oFKPH$hNvRBU`J?0+uc6lxeqR0ld)F8-& zWpwn6hv?yzT#C4sX48ft>w()*(X>75OguH=njru`6 at WYmRNg|E6QbzDyaduPLr?5@ z;1sl&+7!HV at _A~ko|>CTi;RtLH;#0uMZ6_`M|XstEfy<2e<<2KUgIJA`An^QQj0zI z6_qcO}~1Df_Nq7 at NU zntux3bSiSbf4^ZZD| zpXuaw1V!*f4d7$-RFj~)w=HC40o2qg%on*tkk(Q4q*@&9aTm%zC=tHg$a8#|`awvF z0L66njV!=NQ|sY!YU;!I at akqcJDV5O)hAfP(3T>YcIl4NK&bl?XJvvUP%`SF48k1Z z6t2)9^zNBuF4skR9rQet0gA0pu!r3W#IVCDANCvl$|aeCOO5DZaLF$ke=dZf}*TDjaP( z8tHPH;mJETZ2F8}ci>RwxlxoJUwv_b!zXho5$zgx3B)kGX=n-J6&B=8tSSZ}dYyLt zCeH)U4s?ymxR%1u5gN<`k9t(Jf(^LFD z0BPE#Rr@*BsKHa*HhJ9dLLT^;%PeG!f~d9dpz*?`o|{vcuMtOpidpiEVfKIp-R7%Z z`9VW zh>B)g+~m9l3FTv&JJ^4xEVE0e3Gz2(QvU&Etp9YUb!${6Bp%r$%Q*VUKt)X`@U?_P z!FG{d;Dize^c-dm5`9eB^HA0R2G70 z at 3*%H{2n2^!K-40ll26pnjO#MDNM*H>rdVMQBEH_ina*LVzWf z{6aBeeIT-h*g3>#Py!KNjfajdoOYqYAm6JvPSrSJq$f`viiomk>8Km31{mxmi+eL& zR60MZi1UC^r$Kpp9_UbeKIDZi!#m-E^-kTh5QxOXubZVa`B|r@@*_n3<%KBHw>r{^ zS7j0_kJ->lX^U3b$!^VF~!+h#{$e^Sv?AeC~B%}u*4-idlM18!OFB at l+(c5kPX=N zCL7XQ(8pn{;~Q!MxmrXuQ!TMm7^F!}S3)F^@4IwF#nqQ$G<1&Od97xqzjx3}xE;-$r4hpl z6WfxW>F|(#rF}FJoxRod+ppf?6k80ECuy}ebowwPH7xhC!tpVUAg&@H$;^aDZ632r{na*FK?-Q+y+^_ at NsUP<9l0^2L$r<}XhGoz+f!NKT5unz2wIvn=yI3MaXf zOjUiyF at Q#G>?1a2W~_NA3fUr(*RXU2aUvI!xHQa~rU>c!bt}9%smf>k%SKlJs>>Al zGT#33K$Hw4EX%Gn7p(53(5^$%d~`lu zfgOiX`I;PP+zIR)Y7v&_J{+XGnigZM6qg^&sYvbLHN65!Z~}$T9PKd6{9-nP{FP0b zTD~;ZTXuFNuFOaB%tU@@Duaw1DmF4~JfW!219P63BSf0yH2=ly5oS?N at B0p8Ox%;7 z6yb-hqiwGOVE0&aLc^bB)_U8RcG)hxz#o2N2z at RrpinQHb+O6!O!nnZ53|&k5hEe} zMymQhK#KkUv?yx_k_4$-{`5Igy3Jd^62(SD^hDx77^+-u8+L2`{fgPD`74mnuyIhr z9xU$hJB6p*@!2;jEkLEj}+0SKm%JMOXcxVvQB`?|l%|8kW1Mk#x8!K^uV- zH2K at w;*&x at 4Jey=T`{w0I&-ersScgUY#3>AH^c;?w&pVcod at N)>uO~Ttx}ir;MU9G zEw9c&xdjWpPyxJ#E7e1_x^fC!1~pMC(d-k=!aZ_g{q%@jo%x=wmT;69tP9{^Lu$}+*wz^Awfb|Z*VbAj=>$y%R)y{?%G|S9(#A+mvYbc+ zEy<))bj8Q3%&QcBE>~fS8j%6~&9&ud^N!44Tzcj22cBEvj}lh$gDvKTWYJ)XEP*u2 zGD2sr^itQj#eVWm#v9(sK1b$+oKD6KB%zF3`HKpSr-bPiwH4}D zCVR_{BjkQ?$y>b8)O#6NN$2Z2YF_s7czXpfTRQB1E87x!5I;24Oi z!ngr^v`$6)H8zZiZ$;!{X-rUX$F#gvH|&&O5!^yft6c52 at GXYW((Xj?V at B=|=voSY z%DjV#DEYo~<|i-3kHm-mh;mn=s+CCj*Rk*f(_W+A7at{1m1M#wXpRWbXqVv z%QTDeoWyUq)s=n4m?Yu#r#^osamUU6V3O`lxrT5NNkb~tB_Lq1mSHuRm{%B6HU~k%YdTIYnlijw at Kp4o5x zj7U~uC8ft+2J2L|*Fue6SfD$*68HHt1t>DND at wEv*XX1VxseIIr}VBbQ;?R;BuL`H zzu*JbNKy}qqFjGWL^|Ht&D8UxGWzTjP?Jq~O~eb!8(NJS$3__-ufhsQIHe1l6sBuh zVPTlx$6op--av`k_3dlcmABwyt=ZdAn>KI$TqQ9y68unI)75IOh%FnxwkPM9x2G6* zP9jJV#}juse-6)(p$M!xOAOP`MEZ!V;qlzfC&=-=2h!LF*=NH1(i0SI0&H#2J6xoN zfURoMMqYO8bk9;T5hJN)39mL<%I+Doylk0$5}8re+C}}@?cB&pZFws;bx at U}GIc;} zIlK4kq_!wbL=D%6HgQqf0gKLNis58 at B21WO#Dj(?$syJ%MGT2nY5!xNGq((`R4HM3~!H6 z9YNAHRPzXp5-sSX(TSy0%aM`ypZw`Y>G3=NZ=PKL1D-hk&$$!^l0|1uqo%prR`mY_#!UFR_M8g=KsEu6v!yakfnlr%ALU-I5 z!RmX-JJN!o8W@}&Bkl6RN0$L4Foj{|(yhDk at Es?@SBVQZdg$RDIy23<*D;VksAUm2n~r_S zj(bIzu@{MaNZBNaeig?Qg-*q&=6WU=wk2?Z(^zE?E4~CBFUPp1E at 2@fJH?W1%5%2r z_7X3|=QN>61-c0dBvfj1=2B9GWC$2M1q`@ozeJD)YS&~CVHAp(JTb?P5{@eq7`GwY zTMOcvH`{V0NVNzl_A_7ZQk!Y??aF6!zA at WtzWr$@;C&1SxaK#AAHPAQ|KBc}GX8(- zrdx9J@@OBInv at BBNX5+FOiqH!LMA+Aif_XND8J9J%f9c{e6PDg(S8cR7F{!%qMoe)Kouy5`T zWR~EhnaHNSoSRF^^Obetct$Hd9mm?NrE&+s-#EOiMyR(ZixEq!DcJ=a(F!>LE_JM^ z(_YtD_S#X02HUqo#rC#tcKO5%jHN5r^dQdHBX!t^M z+QqCHatDbe9xCgd_3H at Zj}}v$+1WDep>}`6W3F%2#h;VApLYUeh;#2b^a8ozLOMCq zHRn>6r4supCzHFhBANM%par`t5h@$t_2e$Gbq_h}r}PW>x5c(uU7Q+}(~Je&!{BSU z2{IflAxtCb0+q7Y#v^0iZTIM)S^cWfEM+jL; z&Ym;4 at dvPTXof8y)|y07nC3wfArTyxLwQk=z^F36cIvp6Vm&2+NC7UU3lv1!Y3>@jAn?6L zH~l5c`IBW$1B-Yf3i&BhS3NiUX3v3WZ1r%W)=7MVb4J?4y*JH7djF0i0u;NY?WlWZ z{Sd(e_-2zeo%y|8Z_5OK;74r!&_=xB+Xu_}N4mO%$Skgkd!1$*EjGpADxtonN?k_y z<76BsNp|!k)D{AvTh7A&^_ ztw{K90`$_%n at 7DqIM}WmCoJbv%32v$0qR!mB-JK7N5sn$3noehf}P%nzbuz2-e764 zT7qFtao|Ti;i(TtKYvelzxmTl z#u6f!-7`2~^BpK^z*&Aw*L#ZM%dC;d{Ov at fw7AX{}u$xn;F$(su{ ziM$`Q at l~Dwd=&x74 at 4L}gf at GaM=ZbAT?6IgE0L+KdK`4E!cU7tKyaR)J&Z4)x!W^c=kH zy#odULikUR{O8+AO5 at h^{AfJ!Ep~Bjlm7BBbaXTFc#x;Ykdi7G=;BEr>B2 at AZAmPq zyRqjIm_N|P(I{bgeWC?7?B;HniTmP?ezrPX{+=1UKRm}SSm~two$8s-r##vhUGc8nbd;e z&YZL2mpP0XqxPwKEkFr^8H(fM8L=mCSs|IP2Wzu!JF{`&*$$~dOQ;#5`uD}3%y8lc z3Bc at kMHNMf9VIeHQUZ_wIaMe{7rN2ZbS9mYsf-n?nHm74!9h4N=RV~i?l4a_8OkG3 z`eQxTQ$mzFC+v50wY^xpvVdXa{`tVu(YsDKZTvAalz{2hOON|86S-u;J9i97!J+_f z8SSGwr$t1>XdEUwry9<+tb}K)BlTay5qaq zPd*uu7a6f~?-jAv%1kcvVO;p=iCLC0=uQIj9-Zsr_ zOj7fNNO{qnx{OxgF|U_3m&?$tQM}*YtOXr{@uHz_G69)nY^W-v_$y$H#N}z9_!POE zA>P=o-&+ks>od+I{aA+r-lT7lkh2E`2GWwi_6B{8NNv0tmUx4;qwrzi3;yvdM0a<1 zgfn+%#Uq+(#wu2mB(%Rh%KNP|7A_ObW}h#0OskAtPyCr}bbZixyjZ*X2l&6DXZ$71 zW8ok46oLE?(DNT%sTd{Q|80yEUa{-2De!@$q^3q|);1=~yjAFj`KKP9gTUP^m^Q#> zOp|`}-OP)Cyze61@~6K_N4qzJA^lE}bvv2fa-QLRIT*RI-}z;;=ZWWjJ1dM9SGs33 zHDJu+c(*vz9)%v{H?AseM!Y9XhKc?`@tN$7w&LjSw|~W?;$ED(MnB-B0B%9R%;9|; z4r%tG6!r3EL7CW>?$m8hTnq0>eC50E(qNpy><@ZrO_#_!w4f4CaVl=M7!wnba+=7= zoC#kdlB|0yt*u=rp;8l{lM!r4WfA9kl%Zmb`v#@V9}hUz%vG3PQktDMnB5>VIgv6X z2&G7_Q&&0%TjyrhjS&s2PS~g zaG85XDjcYH>?p*_ToG0Bv#&JK=m8 at d&@pkzjFULo8Lju}Kk`K-H=$nq4MID*;Nah~R15rvD&>Ivzf98q2OProcFwN0mUiZfuBNX4E*WyMclu9L z{)QZiBC2kgGFKNY9bw at vSxVI3Am&}R0$CKLzIawd;eihqj%1<*tn6H(SM~IA5rR*k zp8*kHg`VElnZK~9*tU;Hm%h)YHC-ziZ?^|q-ar!`*`bkdtcjGxqcmpu#)3n5Slw0q z3V=bzN1okZ=9o2j>EfkGkQ+?7V+s*OO}6a1%AkBl6!gavPhJ&5q7e;O>xKP{dZ$5@ z*NlTz+w at N-R?QRaL25xCu8n&NCe_E9rH#h#&7JN+jsW|Xh??`Zt9;XrDMSllhaJ at 1 znS9$;`j at KMH9O}@nibkQQ&!%(Gl!tf)RRO1+Fz&k;! zdB4o_+1!|fB6F}OCS>2TDwV5Di=_=4e0V4jCLHq@%y4N7p2mkYyuG7(HJ5p!dF#H^R2A3&LVBs z6!Qx(`E=p(a!h at -A#Bls=Is3b8dRSNjeq~s^@!GQoMeD`eKAls2!7q!YL`-*`#8z z;BT?tHF?CP44t9(iFVLpr;~{x_fU>UEK1`T(MmRj%ChBY0kaqR@{fnLBAj$a-BR16 zrR|;GE=fxy?=+P5Nah?BXZG!_0t3ZRFm3LXLg^BxFl7cOALJ%w_e>_E?$m|6D6MGMR9%*ni2a=Eg%c$%Yi3Ls z>l>I9++w+rqB at 1&Sww306#o_9C=Z|#?*Ak|K9K*uAnrd$>Xt4RD)!1Q|Ch5?c|xxL zpJFNu6QcDC>F!Iyo2*Iv6mc1fm9he~# zr at P#Bw)3^i``5!8*e>!2wTVsDYF}+2FW3h(JSMT|9%RoTp{X++c-uaoQ>ch8$EV$_ zwR4^2Ut1$3*A>>w)V&CUANlb=;*VJKY7HnU09caO8jyX1~R>gW|DrofC zw{q>;YE7MU#&a(aSAVnn`jXD_Ym=%PjLK~E at Wc@7)KzQQsKJmW#=aj6p4rrHv*p5V z{l=9h$Qr@!cY^iXP0(-Cn38|oZ0R^up`21inH=>!EdRY3V1BQS1dB*e)(I(R5iX$U zP;Lk!4y#@zHxi#6BSPTFhca-6j1IeY85jT!Q!C9EAc7D>BvVH(5_Mdln_S6EL;{=F z6V#Ei!MC-%47kfWAf{I*n^i)g9*@*zMYkG8xmW;yCIh{GChRCd5u3RZj z z3X!NvCH5{65i&9Zj(JvlgL}f&V~0Q?@&5nre>Yl&7cQ%6OK)S{S zpwu-o-pU}%$ePp}?L$dTgOx68RXp@^v;HkV>avhx_jjOPFIF0jK<$jFSj&nK^WIiH5`mqfU-GdpbH;C=ZiN-Ml_6m4lJmNq6AV4A3>Ndf0I1(S)rnU!p6y$Y|JCqp%5#o z{%@PC3Jc0snbUX*rTK==Am6NIW0lCnR_=P_8|i8#oT}IF at 0wy! zFH%P>dQukB#w?Obu>1U-%IWx?HxgcDKtN^)TeUVLz at V?cFa-BE?P|HU%XS^Cjb-oe zf%Bz97S!qa5~;kCiF&7yU|5)L$k4)~KnYmPZM~Dr18#cFWm!X~5hO#6^~#k9sHGpC z3_gUAF78CRL+T27TIg0-1eINu%aMmx+A*+X`YOPnx9AU|VoNnpTkQFHm02qYG96o$QY}q*-;#a=n$-6cQ?a#BaX9os!0x{t{0L zq&xF`A=~}Pk0t+5rr>$YOp_-qz&nUd^dctvsC0C~w;TDwNt?`&W$6dXBuH`THZ#85 zB?%9CRw4hq at +Q$tF(t_R*yq2{@o!){1NeUc81z2 at AlrY^aoK;9`S at mWI3{9erXuJ2 zpq at g=0lRwpOAC>yC{`$G!N+*HZ>BV+G~%qm7yeZ02sj92zbS at mjxdF^TOr&{PIt3E zm@$7`yu1(qH3Kw-v1U#b1}h_)u%$HE0fze_P+0|=Xi9_Ju%aEFlLnWSDASBPD2W7e zVj%d>TY>@!L%H{xyQ^>^d}V?p_>tkiV3)g-c{brTDfdwU-nrPE-AaFY at tnk^5}|;v zho=8b3d_bVH|x7&N?m*4W;6Z0+^+bTa|Kp^$0}XO2B!c(miB3ch*XB7_SPqh8(Vx< zz1Z+9bY=(LG=F?e!viYC`_t at rprBsK>( zIn!C at 0&pD7?TNcIDA&5Qu9l3NHrEp}gYkDzytrB#{mhkD)v#iuOX{tHpReRF{hI*{mur0x6_4`+MlltBCc=DDqM>Nx4Vizzuvj2?+BM(Qi(J5ZJYcG zU%`ewYlkfptkjAlO?isFNo3z4<4`_8X-wdFhFB(()JbHh3{}4Wg^S(o4y%4+0s&Dd z0Rd6{_i**^pz6|w@=;k@;y;;^(PQ?EN0fjJ7BHDGL54I818NW>AtH?E8!W*iXE1bN zMlm-8sM%U$bW{#CyP#-mx6fj0hZwB47pirvYF!!8xy{ixy8)V)wBDw>Zl-vXr zfcX86yVzfHyr+M%y{Fqwwm&>BW4yaTfMmy+8Fa$FE*mCbZhGS}+z-&GLsfBa10hJL z#Z+-=Ly0>ZFrk at _hd9VrXNn`eRW>L7+!*(~G?rDZE^MqWEKzss4q2;orrveOvUL?< zQe&n;`wNkNjwlf?)2O|2|6}=Pj_bM2 at KK@8YaRpx5Bz!kvbD3+ah%B zp7+J?{4wnN;sALB<}P^(cLq$X`xL65Dom_~iEMwghGskrnYPEdaE-F<9`;XeA1=?_ z82q3Fh0x?hj6e#c?#ijc(GpV?Eg-=g{%i^0XD68_Tg;d|-C-@&sR0`C() z$2Vvp&uGk3y-%XonmrtvNuYYyF@)GVvU)L+F^|w#c7wM6l95hO{wmCH*-xSJnSkMT zkRbF4h?Ms-^bh!nh?Ms2JzY}?RwZqAxx9XrB!y+lV z9N75E_UpPF;6hbCVshLAAj#ZZ#ki3H3dID1)-fWFtDz2r_$vq0 zd~pf at BJ2nXh|{YON#2SFy9kSD4joji at aNEXp=jwy9HG8S1=3`Vpxyf=SE5#S5$}qo zVmj2hjU*86Cyg>e^<{K8 at P6F@%o_&mtq9!$j{fXs1DAXNKlT;EMa&}yV$3WZ?s8DX zaB{H+i=YIT(Cx>%8^kjx_CSC{PqBTivy})X?AV{AY%1#cglhtsf}DMUp325XPdHcV zbI2!g;0TlGQ+kc1wt1m;*AqLXV$T>9siF>)Mbrb?Zk=H)ObK$#C-5R7)EJY64##L4 zMD)0tk;-XV+2bx<(*}y& z*fKoo=32=Va&0zabU(M(%R#hB%#K{vcYZ|(pN6hM{GYj>I*=tk|C93 zL>Z7IZ$K(TwbGR3*c=)I6lHmEw>o%D%PgYt$J{OUw at 5dk4A(4IE1FWK1|;M>?y>?l z4fyGg?z3uTz$rn`#V4H2^i1t?GJ~>cXJC*r?Y7%b0Wh;_7+etGdFyh)Uceh)acOnKPOP8x&z!LXF)CseTCjmCqh^I#R3Mg}~ z01X2_e2-U^MIHAD6nyuC2%*^HDo0442b7vH!(V at 8kY9j7IxJHlStO=a^J^ItDEF4fQQ^=)R{W at lZ3+$ zX65iQ0L at tB8tNLMp-CoZ#&EQeF2jYBh;FR#cT|8*RXQ+rge9_|1FrGOog;YAulJ2H zHFR^tZnuvUfo@*=USoy*^+w3=$HjAQlBQv1Jya=(AN at sMUg5kre-DC#NPy82twnc2uwC@ zYEdJtOt0okc}=Cd67?kE2aDhBN0)0BHd?h#pfrwXaNtG}@k}_}>YFv1pU(||RR7rM z>f6Z_5MecDiN^Bnj;TTQSqx}p_WQR5-5)ONeOWQsX&Y~<=h7NOXAXDg+>&~h?}-th zwY;X|$zOHJ3sVR~%1^{}4j>6%m*Y~T?)sEMsU5qt(UG*M489AY0cp!=x#Y_{>eBX} zjkDURihwV=&C9Ja+h#MQB(t_wvd}`EdaIat)5n0m!9T_{Zf?WqMMc{%!wqQ`r+cybNZ7@# z;g}=-bMW8J4{H at 7!D_h<7KDS712=e|Jmx}-u7Q?fMc4~3rvMJ#si}%OvRv)qVn_IB zE6VPOHSP;ZW%=3%QZG$J6mc}nlAd^;G${s at w>g>a%8et(Kl~eS9|4}mTu|g~uj0WCG8=Qi zv*);GVKe)AtUgFT)%*IZacQitxZh}o?PL9C`6)i at YMy0yjm+eJ3%l^2+#R37K^?0L zx~~Y($S9#tyHVgIypDv6(P}Lgw{)+~;No|ta2N;tY(8K=m3uw6JCIG}?b#59*gU{- zR<8s;ssk&#;BXA2e779m>OmB at u5h`7KY$4w>`y2?mAm9p|3K_d9mUn55^6iyJ4&$1 zLMthv&hkEKnYpxN;^2%maXV?|Y{;Rf;8KqiqhQBW&j{>2G|{3AR)RcBAs}pLQ(R#| zy%&O3MO7)*5|xbnzKcuoj8YjD@}n_3!(5lB^hqb#3I+0$HDjg=#SDtOM4q!$=2GQ* zQoZ5uGAoWCPieT0>>?Gw1S{ML^%C|n)xv{GQ#K&8fQoIL6Ptbn?a+5zW<1<8nU9q- zLuL5a`nw6`=7bw?rE-(5Z2U=fW{#I^rI at y65mjUI+9h+Cj&jBX;UaU3ejyd#y}XV3 zIi-n=yj7eVX;8;tLiX8BD?U4+j7xbi>rmaIb!#Y3F1@{iuAK at wTZ9E1jVi7J6N1I) zf&~rczNd=8;n7NR1;uS<2{~%o{{5AVqM{M?XwSlU%SFEr6ozH1W=0)#OlE^X#X>T9 ziJmID)i|*!6B$yf*pfFTlnqT!MB?OiiftbA!bRox76+P#v&^fD*0nWf z&Xl4qB1ic0h$hLvDNZvcuJZ+U$_x1s--&7^1tSNhnYNWxl$&Wc$nhelcrgy^ zr$!cT1!Lh2+79NT7VpTah^;GM#xrNG9#>-ONA`xf3B>4d;E)w`29wdWuo0fHWVW{7 z0{=mB%$8tx_l&Po4(DMm;Z#Qi?c6d~sD<@ZJMEQ`{<0ZA*|b92;xeu|#KV429cK{} zGLO}R1{@|XOyFGKmra#p49f)%7Mr=O=_L(CZq3Tjd(yBuznwmUb?szB-jXZ$N3QM~ zAN4qo`YE&f%}DkFuKSIAl4fp3{>NWHZ1<7xdRtECpEt|vZ#MuQ`7uV}BWgz!e(G!^ zcwats6fq;bvc1Yj_!(ZDz80&n)JnK_&~SRyUwEU;=NinL!<4_3#0J_wi~-};xm z4jch!Gw?C!Ezv9ER at 5$u1BoJF`fK<2#_Tn$uWP`M--8cIuN at 7S^p7yf?%DGJlR{Yd z;LuvCB830bpbdyju&e_7iKfV;f7Y&9yB}-K5zvELi{PB&Eio?m zlpk&+Qm7!e5eQ;4Q2De%OcQQmp*@LXUeJuPANjSOm0 at V6ad?%%elzPLL6{>nuBAKR z2d?62K*1|GoUP%Q6m#Y#sX(MRT~Z795)AEmE~_eh-`3==Dq{ai0cxdJ({9};YJA#IPQ7+AR^aKcPQKSiZfNqpCOGWHUzf2B?G z#-GS=o^%T>EB48UbgTgd)reE>T*Hk0N*32WB;K=3IT+ihm_L& z2*T8eD_PQwGH(X>=o(kyx>=ADdIU820u+@%kcuBt`BcpjaU4=HB*5aHQ6)2oe at KJ{ zf0g`_rNwG-gK?z&>Nl4(imOP$zK z`z+55uL at o5vLf$D5M~Jtwoq-k)FPbHlgXyiVK8Ed*)xAoSC{)6mSt1C)_v~@8lTU# zu4moA3D-);g){6p`CMDjl>ofu0y3by#HR_f6lQ5TUL1r+zyP0=kV0Z8Y%Gj`=;u!| zB>~Ag0pim^J!-c&)y0PcJ&z#gF=#e|ydVP4lq?_=RYR(@8?Rew55Q(+=KG-b-a(egwz+2q%ZIv z(&FZD)+^bg!?k9~Uvr5`U09rJS*hKBWIFSL^GptSN2axLQd&4uc!xas>F&SC`n86b z>rd7*)U{w$X`LOJK3VB7aBkp7-4P^(zi3%7esKQ~9r_7PvZt`7EZbGs?<#LFzOLgO zQI(+_6oekbR(;f at qqM@QsHMtN1qiXcRp&qrreSweHRz|$<6<0 z&Hsd+!rk_S>^O$RcjD}YaBzAN_5BDB&mw*v?26ZG+wWn9e#Je0$fI(B-^lfK%%|gY z+St|0yg#`~PN7StU?plyY}ZXlNx!W2=D>> zCgV90?pIDr;KWAg_h1$$5!CJ_+(wWcK3o%_gV7X2fztJQB1Z86n}}!)>eYueT?J9T zMYiajpw;V^;aX&t9x_~Y)Lak$;$CR^A+cU`Lmq99K4CkDq`fYca*yD&(Iba7KAdx$ zn2njiY`<$(dIV3rtBg0K6HS93VD3=fOje8R7E6fN`zLni?tkhF{cwHCr;^**MO($@ zrT}sC?1c8)rS%kT=wiH$4n$k=R#faJIa6eZh<{83*cP8AqMaX<`a<5#wqylT8+8K zAbS*nZd3X%ptPTjW!_+yK*uPBh!q41`Z1^6%nENmaiMc~tc*Bdbvi0%B3)QvPhxx5 z?fjOQG|Z!LO_ at ECrL=ry06-Oqp5>8h!3f1i1=Q9`z0k<~oD6ptZLe@{cYhI;Q{!Jt z%ILb0%OLLziT)&F0h81NHsqUkOwu|M4()*J=8Y1#p~|4!l9<)tF1LQY$u0Y93?a#& zIERn~qQ~y?a0g05^_d3m-qS)xM-t=p5xre=M&z%nQSG_}vI^7JF~ih6*rHV+Pb*oh z*&5LOomZC=)kqRHsM0m~X9*94xfz;A0G&SN4HruQM-)spotS6*HLYk=VtMZUrCG-y z4jq(!5;9xc_N)h%wd`wVat+iP_>wU5-ppRoA3zjJgeAd=l4Rx-yseu`OKt(44{1I8 zmnN7UAnp;*oU%R_^!IM3&adt10qZK>&g-Jv_PqX!fWNnydC&|tgJ8|KnQ^lBTS5^A zNJJXZ(x8FfB17%Jo4(WyRf5q}eKfgEwz?{%=%|~oIAE=o7tR>~W`2$Cu7 z1uC4R&q#9*Q);?XgONE|rf#JxLi33NHRMa7JlWT>+i|9Y0Zlp&F4m%` zm`DFA))=p^i#WAp>NhC_jCtd(_Gp00f5jKvaFpJpf at gU}PpiZwugHEKC%N`DB|mD5 zz0*;Asr8zySfyWUfi&uz1kSkPv$ju%4b`eyxHXO88ORRL)4mU}s+Diero#zD;jW=i zjArucr}D~==3bc0fHauLI=(c_lnu7pqc>Sb at Hg3;k)mbY*ftL8M68a#TWC!{VO`;j zeP@~Yx at Bq1&@va^DHrn5T;PQMnP|R9MOt0bU2=dG5+B!1`Lzq&W^sxF!jcn>$_u#;3EN;gkRoh^gk;>a z-~5z!F>)9uFH~`Xbw6TGXZ)MjxPW)-&v8%|KsNiWI%v^yiILQ%cDMPu$CFv7k3^@> zX*WoF9>J#`uVs9H3z0MybQlYQ4>i+><$!}UL8HX2dZGF%SLjOFFwi>_Y&IK~cVSw} z0f%mpJ{dxwC45uCTEciQ*Tk|Q5&!wtf5-cFQU4U;BaBR(7O0iKo$7T{I)AYXwQ_61 zAk~|5(ve-;s$Prpv8gpDtU(Gz4Wg!@8bz!I$fEN?Mivu(gv$fT4eF3Rsyy?IVS^u5 z{i>Y78>b_tcd3)v^8?+DdUe-<`t+J~7NgI at 9Ydv^p~XLk3O(@B5<*XgnPvz-x5*%z zDm55fwWXMg at T3jDn>D|0SlXkq4V3{UNOxeVq~sn_N4RmUNmz$v0pQZNcRw%W14CzX zMNu}84=eaSc1B&ru&u>|`(pSK<4>%iOM zh}DTw8|2;wv$y5qhhTYL at ZoLwih+|U(AZjs{?fGHt+&Y@=^fSD67 at mvxI=dhvd>3( z&E(jlwOPk>{qrvmO#~L}CD4Hb0o5V^0kQsnH&JYDU0wdIiy~|2Kq};F`G0QuFHzTY zKvhNM&8bO}q#zOi4#p#vA)f#O7iAU`G8q#R0EhU6!IeaAd3qMX!YkmQuH(4l_|@>b z3(+D_ECQINe$u9^`g|EFp`Flw>SRxvmYEL#m6*GEy6VVwzVUwPdb{44p$F24dGXZ< z4oB#46o*1LibL=Q%!F|}s#8%rws>q78TBA=d4+IjMe>OZO(Hgel$?$TP|4t;#tBo? z5^N0)4$zD0lwS|!M|%585S|IM;S$MJ{KKbL!`?Uw_sb)Rz$y*7p%x^l%g_1B36_JX zM*arcMg;RM+LGs>gOM3F?kwl1^eZT|My&sx=d#(5_^a*3OeK at mB_piaZ~Jag!wPqG zZncJHX?c_vSQu}aC07;bAqmlHr6V{$}--Zutn>@J5)gH!Uo-dyjuWz!D}VLGb}_gt^j)-oAm73oJFmzrbE7h+)c=Mv2vtWDk^qE)a2pdIe zoc*3qn*B{bx^zfBQ?1I#Js}@vOzJ{GZ;ihIG1NT at S7@MDOB&{}%6~Ruov*V>BLWTl zUBOi_mq|rqE=tWEA3kCN5MfZP=gW$_lvxniO}dbDBe#3^O{#9kIv}YZBb_qdRFnz} z#FlSVAS9dxAIZ>bd&z-xt;uVRAi-}~zMHH&{G at Kc%jCkYn?8UUQI04Ftf6)_GINV1 z%`Q9Osg-k-?(uEb88W4odk72!c}NTmVB_}{VdD=t!o?l50{@`SN{>_L&fb#d&d&yw zsqz%d635~^9A3Y0~zuyqE|RUaQh_Ls_5 zptLkfR(dE8NOqEWbl2?Rbynp&IuUTkd?%MsH1I-Byr8nm+8aBK#WH|NBx%WJnLrK7&AOm3mxz-t=nXbF6+p at -=5uBh0vZuZ4WTl}Tqu zG>Us3)=nAyi7Q4JUXSqcdMZZROkgZ@?3i(xY^A$L!DB28^V*k_mvVVQ(+lV#zC$12 zQ%n_(3ClI4 at N~CYfp{uELo^TQ5#Dr*G at b4Thf+IM@h?opWmhU&oy>-?G2lGcJQ1Jb-yzs<9XS{`Hu`t}ZnUqgm zsUe6tqzIh at hRgxpGmrR3xcg*a#+*}pmlgWG^Z46QgEq>*5b+of*wsSdP-ALo2op zE$fODa_=BeXJhb5g1^*s(@7fghM^vo z7TMvv0*}35<*$Je at 5rjH;n+SyF8ckRH!}=WIId~=qn9lO|WgLQ?*B0TBXhoEIrNpsWR~Niu61#&`SG1j6RdX z6 at gy^vm7+ajDb#OWrm<=&^RATa%Pmp>T4(#$r0Aco;bskTV>xLWHbaUB_{;wVFVF} z6gERMiSGXQX5W=4xL}njtNy<=U*y<9a#q9Li1BLdwD?IcHqRQ+v|8GwJyFcF0AvF) zqeIY?=+)DP%b2yqR6lIicj)pOokJOzmNVKJ*7%WFGZ-vU9JrW$HhLJxd8q~(+7jsd zJHTzX5ns5K)7j!r_;w|nlWUrjyeJYIzOmy-lM}||*3CI1pS*D900USPI78qbKzxsL z+_&VKKJD2K=v`a~6PIEjy~{+tA$_AQ?pswVyZ=?jqUwXTmUUQ_YnHTiSqEkRD%r>e zKnI;Z?(BM?f%q=Shv8iD{$FkmYPHmX`~U$0Vt at hy;{NZKA7xV~OG6t=FH;jSdneof z5SyuKD{HHwe!C%akmBacQbD6M)o2j at Ef%!`=u{pRS}Io-%Sv8cAvW*rj&V+oL6LNy z>)$H5;$AJDRZUaooUh)kVfY0je8W6#a0j4|4hWh}uUqRcYwff&EN_3_%`n6PWe-^a zE6PwfAk|@du*H(nQ!y2(nW3Z)_;BkDTu7O~=~#*bbCT6!Ye?h^XOKI}TG~_Il?I4{ zcm}LOI5ko`9J<*}t=BWh9;LFZq^_7yr6XEw)n{iOJ{MFz+D=eO^jLXc$6QwXx6;ls z9kea=It2xCtppAez){$)z?XuBLO7GvB~p3ottDVpqRkxba=^xqsZlreYPlV%TKgK6 z3ox>5N1~pNuhr_5tEQIt>Dt1OI_pL3(FN{y0#=E)dUp;v)Cs1lFQoj20hOvDZx%U< zboDu~AdeTyq-cN-u=c#wN$~j=;F%LWT8$>l^^6sltGL7Q&J%Ue=`fSIo{f0?A~b7V zLKpOO^(=k0d~^1rsVCd at t|<@M(uD<9J~U>z0}meiG+mnVHw7A9H^|RP_Qjjcnjt>f{AamoIqqv&~X)m-!{;0{%j?k zZVK!~eZS#SN4?p4NKb54vBUBn`3mK-B=*_^aLA!s$N07{`b5}cGfx$bphQ7hWHyJj z!MA_k!EdwO;Sa-VbP{Hw=0uoAXHXi-7#tcT%XUV?kgE~OcE&aIw*4#_&~nF2JTq_L zJdsDhS3>h*O;dezOU126=B$+7q;$f9&eNVF at _D!s>#$xmP1$X7T;5;Ru6d)7z0@^? zsMVYYelpHV*dsMpQQ&p_!P)LM#nMUWMA|4nt;ztuV9TY24W(*Q$aa4*kFtB1g;G|> zi at g(#ya#XyWvIB0mXTCQB^VRr_AhK+l;H2tjx&Xrm-9T|5 z4!9pFUS+Lpp=U1E!xIlpvn^DAe(4SpQn@(zK;8ZPi!P`Nfgcy=pWg+7|EJ#U|H>)< zoj zIiRIz-K4fbU0z-;N~fxo0$PvilfV3OLBUV(1MjCaGug$xMqy|4Xv~+F<9$7ual?7S zZ9Y9Y<^9w82c=i-b0}=)00w&c%@JS!aUg(!>a`&d=Fj3D&7amgRWSXBfv_k&pBx(B zfhha;J1%;v*VI6J=dPPcVUq3iun7<4zJtz_j)&d87Z2wUuYu zUs_feK~*fAg)ECtm{48pI0VZJAU^SZEB4XktSnjNZ-8fCTi%hsP;{sZ$VCMp10#@@ zD+U?eTdEs&1gkC91`aEB_XRB_sO5jn!3F6qCB>Rn^Tnza^YG%0eP{@%`brX at ur;+f zPE4rTXC!0q-Qw5xun-N0*kQQlRp*#Sk~xQ49Er=ZvK*ruV;`G1qg&Y4KH;#g8GW=n>)j!;M#SXBIh#wptY{epdWRnB&VS5Q9;nkwt7!<8ne5m3CC zbgt+|tmKst7WA$LROfV#tzpp$iE=lt0_D1q7^ZhbRHeoQxx_G!z!nZ=jAz2`Wsqv_ zsha4~D-XI3BrP9|K}j_oGl!d=G?ET9IE|y at x2+&W&9Rk}_E3g~b|8ujTwBPjSPamJ zmD1!g%SX<}#ZSzc^e;w>m=WyYN{?ev)Of!)KrMt{1c?n3G9y at 7($!{pwUZ=BWM*2D zqKNEBF};XLB;^!r+t3cLQQTNNg at V_7o!~A-*wn2aeCbr*?@PA_FY7iredsDHkb*3M z?Fp89DP%H~Mj8nL>}%|-%9aEdXAg5&au#wY^uETb(I>(?mqzX7m8ww(3JXyoL0i3I z5(>ar&Tvd-XX8*#jJ3=r-yQOC^8@$TlD<^1kc(iWwC_&Z)EdYLrWp-u$4ZqIKYNoy`DJJz at MfnaZ{hA?@8 zW7g&#?neFNcY%xBI%Wl>3p^-Zr>$!l(PgJo%w=ZxliX)jDR(My=Ej*7ag?n!`y;PV zWI9JjHx&EE?HMwMACjYXO~FmQzX7*sxyAu2%CAg1aoGU3u?P-2Q}_i34_<@S`Jx0UZ` zKDCC(ZPe~?I?MN4I83(s at 7kLD9_ywjNCampq2}iTg(J* zXiZpv{?6a$G*R`5uKGgqGg?(7GY|Oz-Tm{WImF_jHl)lk#n{8qXPJ~DZ5nD|8dO-1 zF at JV-eMNA3dUZ*iH-KiY1Ybv^O0dlAb!wnhro?Bosx2H7dp38sT|8#ZtEjtmCP|^> zEB&SoNnl-lNllfwq(yR4?aNk8MaknboiP^cqE(cTnw1^dG zEy|#ar8RTzr2Sfad~V~;BdWrdqK7h(ylt?=-WL;8+f+UP&M_N~PR&)dd$19(-7>2U zg87A43+K&5?j!Vnl1P)+dpK^{a|)8(6vb4 z8!&N+535NPs>Knz4;Hxd+3TR(!5=(bv2FkNC|C2OB!O^kdm74zi6q= z#Pk0)8BZ70gAo50f!FPK4brLq3%HMP(k;eHp81vL2UNs0Ny9fsO*@hXhds2FgCSg# zayi}ceG=HyNqjZGFWJ9;JfF()eDLzIjcT4ShsKM#5L;u~oi*g*-cA674pDp+LF#~A zp3Od*0Ba4274z|6YmLKRI@)WfZJ&W-G`GLKQb-i_UeMCDx764!b{(N5Dobz9SRke& zq^bIj+dGJzo=6u#aLW#Lh!&kwXf~@lH~W&0ok69psIjEWXkx7W}!)F!`Ck at B`Bx|)x%ya8M zz+>@tRu-)D?CS)k>RUrE2OIBjZ!i;sx<>2U at QL8F=yB?+CNgI^XaIP3|k3;U;QL zN#uSbixit4-1YzfWr1+r$!|EM{J*<3+Q_65nkbHtc_nx+>6g9k)yA|Nq&RV4Elq3& z?Y!r#fz{_6 at FOpfb*3jo>%;C1tfdUBNvkEBmI_UKOG|zWe7G&;K(_{Y9xh5bS&8C} z>HBMK^n-q(Uf(#jOEYB?I#;(o6l;8MDxty6rv;ll!*=nfynM5EEvN_h{4h$+jQQ&| zH?~n>df?fu9PQe&<_^s7(y?AsoU7R*tDaFW>r6*Efz_>Ea%^6LdOAj)4_a2DnAfNB z(k1yJiM}97flmu29p*#LV5lfaUlb`-1;gFmFaaPR14tW(w6q!AZ>g8j7yO#XZQelj zD5;Q?Tgy&q4H#5ZiC;7B3gK2nAKub$z%xV3&#P%deOM6Y)q&3%2~XT_XJ(NRsE+p+ ztjyW)kvCahU9ei88biD*tKFv>1B+6c=O4&?#CY_F&HLn4LuckTXvA-+^$uhO4)c;4 zO5kxUnS38%l`aYxl0ooydj5rEZqj1*l>h?)RYL#)iTw9Sri`Vt3#pQ+o2iqt>3^O4 z594}C@{Bx+BH~C-9i5FfdPP&=uzopOGnl0y>YNtRpoy_4$!On3gKsj~hOddc_MP8- zenk1*E`b1#$L(%kkY9x3wiaYf2j63znG_ktDb?WeRUUCORgPkttgJuR zCCX@~)>F)Cwt5Xb`Y&zPul-#kvln&RdR%q>my0lZC$%F_R!zq at wWbQLBYW4KwjTH| zn2}+iR_hsdVM#%z|2#)pUP#}gNfu2wYP;`?6Bd$ zn8hka1BXy4<-aDDw~_nVfU#NdrB9|vHSMN1-_n-dCx2WNRu}qzP=h;2iSo;pOB9qF zL8htdBpQLLt6E^H-2pXH*N%={V3rQiSw5RhQWr|0WZL=fB3^LWae^icPbNE z0`G at fI>jCH<(a2nIKjHEVUyqymrM9QB7q1+1k>UPWS&dlhkR3ImkQ#LUO)*!CgG39 z+69 at 8G$W1w5qjlq>*o+|z;L2;cSyBST at U6AdnjgL^`sY?rf(7j`3(Q-gE93-;FN^e zUORl}8L8+8smObdu^{N7B|_cn(atmTt<_d_Q)eE+0Q-MsThek$R=N$3EcywHGou8@}A5Ag952c z4DQdrn#)`=yYo=Mfq?dqfPjSle;$K>KLj-zn$D=IsNZ&}XOqQiz%s!RLMzw zkWdy9fwAPI4Z)%+Tr4 at W#br1h-h{ic7mY_jQYi?07Ac~dt?>$W2=Dnr2zPxDet}1v zyzX3$WbhFc<5%7{Z71A2n%8X=n;$1(`aqX`5J)znT!EO(hM8wPS;uRzGxYZcw+<0u zYmhP~ngjbKQv;^k-WlfbGdj7R&`wBycc~eUJz9sQek0&B)IHor2CAcVlF#zka;vjZ zuvoR`3anVHPm`P5cn>cou}-a{`^qTGdylF7&U*MurF>HK1-yqc99`ncDUPwKTeaOg zmhe4Lyt#|LA}L=CDg+X0>JbL!wa=z~lSvv*#4U_?AqFSSpE at CTHZ7S7^EZ0kaw>Zf zH)zGFv9H6T6*w#QLfvI#NqQG_G1>HNI=-TVdh at n(BBeTNOo{qN+ob}{)1nV3tUNtp)Z_-UN=*h;j*`~43ZJQ~$TFoD*Q_!; zZkj5=I~&f64uWJM;0r2znRM1F6AF4>9XqT9H!EkKtLez zFRF$Rs7qa}-T<_6v}`;LtSdq_N4Y|yR+6=eZ8kqyOMT;3m8M)l*@4+QrIq`IdJRfu zb64jsp34HOSoP7U&kbySu~idLs_ at io8ZMN%dCM(VZg20g-Gs~y*{ADM_sqS3grJlq zMduy5UuRDOt^7Gs~Rs1fSFdYh-sO8VDJ6bIs!mx+s at IZ`0MOy{cpf#YgQec0H3&3_1u{s2`0M!Zk z7xrnt{PsXjQgFx|xcHr%S?jDIsKYMIPgaTD)%@>KQpX)Zh%~g zEYEB*$VxWnSEMz#qA8^AapCVL8z_Q!oP*1kB%K={Ys&1aSXW%iugEh|Y+(@f3k&S# zJc0#>T2yRy-axtTt$qclompX8e~B!iac*gCo$Zln2B(<=1Zc0n^=Zq;q|xEGs6wsd z{ugKO7^K_QtcjLw+qP}nwr$(CZQHhO+qPC=RjsPt-|chyp1tph?yv8!H{UTMX3PF?S9moezX;3MSwpSqp*=_8 at Z&sUy>xN*-PGVm#%&f zP;vGd-iWv4$iC1R92fm*_0jv1d;Jkm*`baS6dx!Qc8WmSc9faGILUOAVDsE`Zb?6P z&6!)Krp*?8jJ2cbhw)!?DF)?lM6%NuVr_JP-cX5qS4T8b1~pQ4s3c1l+R=%7cc+cG z2CqbrmmXOznKx8HYHafqncm(I7fqzQi#IoErCbq_s+NU}i8;(+VWPs8r9jLUw|2$; z;0Xo7CbTq0`oC!3U#h4DiaOw zXc9 zgAI%M$8B5&5MAyhnCVKUr&ALAsUr;-R>tbeSqe!7yjpV;gma>JC{PX0g&eE!ywt4JDICN-Av3e8BUzDe{ z?e6ETgj`L at M9I9T(7fmG6O+a?hjuXtu?TNQHpc(r8Aui3{b>iFnpU17^KV(cTiL2B zhNr_2S)RQ4gb%mJggcWvFOuCEN5d`a!e-~tvfF0)l4U_eY?sI&F2i0)H8s)- at oI6C zS@{54^L$7BYF at APP@NS7$tj%VREylssA?30!0SX2yMU^j8SHOFRSxf=Q47UuOaU84{XwBJ8QQX5CDK2H~;|F{|m+VTQ5VcnzsA4 z2*P*CNZN74OA^aqAktRISbCdW0eXe(fNb(wtuvvdau!O34YYVA4X7sA5H^1>_&0D4 zu-!o+xZZ~%j+u#OfH?c{@l#moxcCiH`D;n4aJxPe-!uxydesFu}6py z3blr6!`PqS3_}{{i{vz2gR^Ap+KN15ZYe2w4$qYA@|~N9X6l2?p!w1fDK^uqwC!Yv zLWcUETGH#f!!qYM;@mVCtn9>w7RwbHS=#O{kjX at uH)~2}fgr=0!%RD%kid^4Z6SlA z-7-|>P+_I at Yt^E=n at dq-vpMt|q_aC~IKe-ECI#K+36Q3CyA0D@#e=fiX?8VPTD4@$ zLqCKj>&mFxbQyoKz*e`3=2~8nvgg*TUDFLSWMkq7Ld3dbaq(DScDrgdtf7IoIB5Zv7O#q3b&y8x7v%-j=TTl7sNq1 zQ1rU at 8kik-|BzC=ph2;`o3v+ka{FIw$uL!o}?3sLPcgILb~qT6L+ z+0T{|N2-6hzceT>h5)7% z=7isnzmp%i!YpMVrEalVn&q64epx+{mYg7-=rcYr|A9Y{wGyug=ZP2O3^lx>Z!%HF zvp+=omCkKe#v7fI5HfWkdSyB$`5hFvf(V8U!7KTVav<)hIwz3YjQ8rHyfuEdh&qFG zbQ;%sX+Vp2LoG@Z^fL$Tnpx zv4{tJ!GvegFNE|HAhT1{_`PkCVesEnb)F_jfQuk?#J9-2X<5)EWx$mm0Z-lUdGHPL zAJj`mmm1i!E7fSDhi*}`6+EMyp5Vw&cG>4ffQ1;DU5kgE8Un%Vc3>=ao_XE3%N}Rq zG(&2ucN(e)X>VIJVnES|LcaaOMkEar*7zW3_X`nFnf8x(e9<#9F z!Q~*2j|V7aPaLqF?N9uPLyoJ9PrY3{$a`` zQn*a2jNu(aDZRnq8(ukB_(!SS4CL~g=wDr0YybeX|GsC8RGCm$$Y=HQ{9MBWZVYGxO)qy}y0kYWgSM&jura#;}}K z=;whSEZ)K(X#VoSGgnPG{l$amdlH;}SiQxADsCT`KKkmuMKJgwq2li{u>GY$=zTQ! zeZ=(ps|ViqK8imA;rK)GEF0Tkc<+rBACX}EtA>1EGQs)Q574-1L&JFQr5!&~I)1ct z{fmR}@em8)qWSw#)5TakWy4S&8o~RQ4p3iu7$3nMUy8xUc<;$@fF2^j{Ly0;R;dh+ z=(uXy82+f~{gw~zuz2eSkYHPz$dM-*nWhFI%a+XDq?og(GdRJT#Aa-WvSfMIagQ== zqXov{o%1tiGY(X&iScn{vxg#d^8=}!A%gny_YO44PBhH`+c-PfnZtC>u^lz03_7{y#45$Cin){@t`(Dzp6o)r>jb|txtj9^|v_`N|OXY^K&yGp!%bHC9lME2ja2#-#%PN=b&U?%3;<-<1nX*%0YN zgt=qXDr2(b>baSdLcZ$N<-(Y&vNN8=Ba=5<5`}17Fm3~1+bF}8J})=IfU61g6N)KP zrI-HZuX>2o+JrY&L#76s5f3omx#v?HF`(xf=>h zg)e`Qawu8xz^LIpbkD at STsfn0g!I8UlE#aDeW&s;jX=yLv&Oyx!(wwC&H)VTO4G2h zfo!*MXJE_=9ma}@)(A4={JSGm(sd~=(uFUP$(_^*5 at Zu^R!o_!C}inUhL0)<@pzr| z6AwbHl8FLIWcJH;l0u6PW624*cn!Q?mG=-ii5}m``r1<7TF1qPhQ!I$P`+ad$bnEv zCi^qo0`$6WsfD4_AiOLm6a53<4NDvDV}A=74LMNfJUao24kpgmQN}_|nWnSZjH-Da zWzZ2%)vhKz;m%@i$;I_gK5J{uFHSVYnQ5}3Nu5*^1U+-Hw-A at U2?*69Wz-}bR at ZS&uy9RaEdZOsGCKAqPIl{!AE99DQ5v~(Sz_g9r3_WHEm zat}`Z&FHP~2GXvVf|-d?Q at D#S8f2(Zqcb{kAvPq;iLseHgnSC^=@iac7a?|)nWd&u1B7_n5|XILNEK z_>v`!Z26Mu39JWNYa;{dbVY#lVbrW^HVtTJYZ+z?@YbUST(hWH%dl%>Fu+R*>ly0- z>BHlr!>1SKx`hk}y$lu&nl^2K^e7s9!Lx?9U@!v(VBWB7=w&c#gJ+lytUAHi(^nVV zGrSaXZ9|)KIBlZlqbt3<$r8p=ix?&h{Tl$|6jxN?KoYUe~IXnjUzr6ndTMC9V z?-M>`CVpcv)|an8T8ow+3kuO(EIv9i^OCW-44)>8M0SxrhjA>X*;!BNdp}`TSNRO8 zFPKKEF?2|a6|dQrTGVNO<~dm5D4(3rS`|jaURSY7t;WD!tXP zO4^CK=0IBMms*`dn^-PB+{eLc`wm^OU|( zaiTtU{o9kh)urC&S_CJ0^quR{cfXRndr$Q0o#a!9G at PWxqb+h4I0_wwjzh*EW0A4M zS*A~+OQ*Y2r^g#>!S4n2S9MxCaUL!GW+xx7OOLr}D4cjC;=m^#2{`dc#)D5h6gcUm z=7*BVNGXn-hE7AKA=8oR$aUm8avV61w2XMPqZ|`S!LoyUwHo{O*R`545c9|H9g|LA zm6FUg14tzKC70xrUXn at v{HI7QDRRlF at g(6Gg~p+IU=o-ND)(Omtp<}WjVTmWreB8s zxYyu5Ub#%7KDFO!W$_HGoLg0V7xh|F5WE6uCr^rd4Vqs-0uw*fctc zM*cUU#S{`F87PhtFdU&0_FA~FEes^)-KGDIEAfA*F#l zp?3W2B|+GRZF=y8QSSy|mvb55?}9=fBsHS0PbVGNUk1w!X??)v0=ymM-!*r7cB8Y? zKOIzi at p-)k#O_eh+ at o}Ih|tR?Mk$>f|0${`BA0TcZJAI4dOH?xhAkhJYCKJK=!LpR zBa_SJa5x@~ME-vTWh73`MmfW7788r%X_EN60ThdK at H?RS*n?50Ym^K2V8jmGEex4J z#h668O}>a4ye8Y`Zbo-{;7>N~6_dh-**VE-Pt#wZ8$ty&0>OLOh13q at 9^{5=4*MiC zeTXl8ln=Wwv%ca95%m_Gx>ipZzrVd_lKBnPaLR4pZD!ITH^^!01*Shy(~r7=U+xGR zz3NO{JB?i9mWG1O&Qmnfn1R1(e_spcoTt81Tjj}5s7stsqduWd=(KDiaJ=#%{^)Iv z{cc7eVWG(kdL at 1mS#D9wu>?wHc$2%Jz{FPqEE^^=6JXB<^_?+4ZUMx+p*hm75{vM{qY zpwu?!W}{OES61|@Wb&icDVGUVp=&EZpSGiw9)WEuXdjqXQ1M<6odv|~NIy2YpbE|o zNuGN4Dj?&KPEa at 6HQcGvYA`?6ZE*z8A~W>lywhaUaR;sI26ejx%(6 at AtzJ2(HYx$Jh`C2t&|CDe3 zv}^HZo+C=zt#!gsZU5xaK2zUnoiBQ==>Wanlh%)7t0r*+onpRCpk3BM%{-$T^ub^2 z&1bOPPm)7q9;-ZESWownrV6*K4fqD|QGh)(B#q<_NH(4SoObXxM;?(4>Tvw at l#3*= z!2++Yf}J7Y!2ej_f at oh#UViny?hK%Yjzo9L6G+EB0mC zq1-x_3-+x$e5Ha}MRst)a0fh{Tt)rVrrJh at Y^AXY at vMz-|Fl5t<4GYK>m~C#xkDBG zt=qAhuFs2Ur>^@T58AQauf8J(&Zv6S`EFuy1XX4eg{j&tmg> z?7eXM?GsFEPTf0Nhj|I-3mK4ph3TeZ)dB_mkI*5G*>FFKgw#*E at UB?}O>4XTs{6c*U9wsbyE;Q3%QYoB* zzB~`SV9cjdb&>i{H|}g5#ZlWZjUe*%(Xip*z3 at ysIama38LB;rR)N~@JbjecN|Pue zoHz$_Zn92&t0I4_jGy&N;#=jyzsjs~r6CVfPHju?i`;pW!OeEVk#)H>X-r!Z9FA#=jSF5rFc1J8Ms+eN>r}3 z4l~%og6|XT4L5H+b)6L_=w!(b%t&Oy<9M;KxatfA#Q{ZOqq+P9RL2En7*mc;N>+Z% z2QcMeMMn%^G}Xe0y9tKkmJ{M%e?+o#L*06vn`a%o-WB;CBd~QO(Jey at Fi>)$wGTya23bMDJTP+2F%}e5O0S?AowtYlrP5_PuAE> zsD%6iCpnmq#lO=czLJLIDNo#8q)7Wd%7x@!?1f8qZpYVM`~zOId|t3cC6b^a&4(12 z<`ev|ihVk1Gh`$@B|dP-wh?h)mp8`}Bb~o;2M8O-hu+i^)d+uAu%Ql@e=P^D=o<0FzNsx3QJrq2Y=$gsX! z?{qpAMn)xu;2-ci6w>K*I2?|(KF-{>Ttb&XW_#apI?ui3I^ShJf83Yj0wiZB77%O( z!o^T^L@;6=LkUStW+)&GmI&#Wndl at rY6_)X&KQ(kOI+wq)>_ZEq|{}OuKfApqV8ZP zaiMuCs_Z1qmV~IKF`YokJSB5KCwUpy4k1aKbllS-{kg+o-|S6FG=EJ>Tc30yF-K+b z)oku8{~SyBOhNXivEAM>TVs%_GtX~#$$jWBl~QOfo4ol;wQVBZ|zi&xV{B&m{poOi;#@>o<*KHMJxk$5kJ?$P-u<;x&iL z+vs->txx8LXW2eo at tw=_9!{ZvSDrleswyktZqCd+W6ZX`_ob?tDpGBNwh8pM$FV-- zxMQrm7(+!3FPQ46GQwJ~7}@y%VmXS#;^B~T}gvCn%)NS)>~YZrB;=m-{!ga&5@ zLK at QwN@A7>=4ug7@#A at 69#f~;W{{R(*$Kaef7Itu-5MmQr2|#Vp+&s6oNz-z8$dTf zQfceLFVoI52_Q+ at 2};TN8!xcE1e6l$1iR#!`gYhps{Q)AKI9X_J>GQdZ5Sfdt5#w+5qYCh?6PMD7gtY1sdn24(3dPVNo zh2wchIa@;Ss9kM{h`-TJ#J2WXTZm;_h+SKThn{}UzBc8Zy_QyTp83?a#-Ygh3AQqh z(y=-mkaafX8865^0UZgESvdDvB#g{H3;qfBi_{HUM*5dk at q_%^EkXaqs{XqwZK;aw zzu2|>?B0~rrUC*ZD1suoU<;o#g at Rm}nQ at 7k(h&F)x^KCp?YxuQh!^vZ at E@wNV8xLA z0{EeLZ_6Uhd^Bv9yyt!IIL|rhdH*;jW{9{nXP2k=;uRLBUxiB$M-T!3(;) zXq6s3g->SKX)n at N4IDRE^U()sJ29lV at LRv6n7^W2O&%gzROYi)LaJ1K?(swMZUzT9 zZTxQMo^obF==l^1k;+57_Gx6P!Wb*O0>@Q!J)S at lf8ULYm6<8B85$^wgGGjKoK(Q2 z at 98Btuou%oxK>r?YLn6MKxszDaQiODTY2?wF3%!KsIJ-X3I;2Ua#Us?FEZAsT7l0R zCvWxoQ_=Z0Qkk;>J6^dlt7V)&h*h7tlF?cX3r7;KN6Kl+rSyT~=y;OO2~<3|Xc>dy zw7`JOp2GJ?nvp?7Bi|He>4m7Clfao&;tE^_YQPxT*NMKjYp|PZwcg2G#+5> zqJ?3x>_?1AKx}9TIX_!CZ*GE4JbgO9K(|Nu23h%*@h9%ZF~&#q3}+MG-=e9JX&LG5 zY{20{Z at AV(cZ}#3G|5Hkk?Sabi0W?W{U037W at SbpJb%S+9}xfcT;YFF!oOF9Rb`d` z(mvjLSx9`<5)_2518r$&H37v!wZa1!<3UiEiW(pj0=X;;30z&STIp$y4r4=kSMmevp5So!*Id{MRnWbKvY1R z4)3hu2EI3$Udj!wz`?o5?NHrql-}go-e-EH*-f at t$SChSHcyu-ZKg7S@*8ZdNdyRM z?XI5c at zt{_Pvsc~TLGj3-=3COY)>LYGZ;EfvXK=HxF|4Pt8qY87Gzoh> zQ=(ZRR1Gy|Z2iuEQQ2LQ?mC^~tqDBEvx;LTTF@*fBbVJhD$ziTz;MX|rn$3CvB_*W z%?w>xyL4rDv_F$oHaLBMrRnY>Ue7H8mc*~S!7774-x?oURR#Hd72=#3aD42w611s2 zRbNq8w%Kvj$K}Avbv2u(ByOV}2TG<)4sx`WnOs+iB72%I>>I!e9yRpqe_b8zgz zcVcXXcO-I)qW-JTt)Z&lski;N@}AN(HVHMsDr_c4B8+Lm4;j at -c_hCZW~p at N3*hdt?$nA6%`Wz5(8QUxsL$6Q;y;um2?0Vt>xn4I9Rl1GWxPb5LZp=^ zJYJeSL4GfXK(;XGAH5^1vpJnI@`1Oko$W#v}=k zacV|zrf`U-qxk$OP5Z^kaxw<2yo8}D)g02$iURQ(BLN-W17Rc6a*f_bX at 7+m$& zKM=rwyFuf>80CL7NvFo}!UYK+gzi&B5k;n?p|y1#!iXS486QHT?GTu3O1?ijpy3S& zV}je-=1k6Hr}up1)qesD#4Lp06BB@#-(~OMNLfQvx72;gnXi%9)J}FM?ba=^%WB-| z+I7007MYx10Zut!rF6 zBdenP*kW(6>@)O+$}BQjzOAg_>VagL|YgF67ygFis&oi?wF^vtF2LlmIeM|EHf zDCrGD(5L_s;H}`F`?=bE72sg_DWJ4i^q|TlO2o4XW5*=k`ZX(yOTJo z$H+|yk<&Nfij!8mZU`%)8(=NELSVoMK^BXk at v$;aK z-#hSG%U at vf(&Dro9K*#s+E-;)2GnG6rOpIt0q-WKIwm5(c+q&>>k?p}f5_3jlKdr0 zlFU*QN%H0~!aq^D`-96*LWfL2?5S!7Y@srMBkE68qKLx`?NQuXiP014ew&*7cD zY117P295j}E7(lwPsO3*4GF^v>5_o8Czv9ZUs8obPMW_Jy6fk|Zh_p^#t--OuU^!C zWzUXX1=-+h)TAuW%1K9?H&M}3sZzC@$6wVqb)TVi_~AL{VhK{Yf%jU4yO(E=-xURQ z>U9mJxX^6BI-puty)o&>CGA?VI#Pv%su at c|t3H>gBX6k~%c3n5JFDu^RPdhXg;@kBjqpMaZ}MnZH0xlV2~}TS^~-Vlg09TWn57hx{$GA;Q`Y zD5!JNy6Ag9$b?miuso%f1-l at jkE(&t1%F5Jen7B1k>LFEE_T^w at 2UXdk&P8`RmMh=tAJUvUnIHGTR^`-$rYH;#vIJGfWm zK3DkK*%DFxmoLlpxH8;YNbu_3Gy9g%+X3+es5;?qyW#bBX-tT4;EJGt0xajBpc zCBzamb_vKWO-yHh&zQJXlxI>5r(=hu$A}-otg$=d2ldR6NTmFC-TZgPo31{IzdlM_ zHy?+%h+7kFS4ldF<4}u9%3^*k#;p%(YtnN; zZf>%a6r&pRRtdG`(Q{#JdVy at G$~8bO#B-r8#U!(zX!^@;$?Z6$_$PW~{xLn=PuRKW z9G?bmu`*%IUz|BND$fWDyvBB&Qq?{sqh$wBGk}f9Jav1IvxP5x?Kta&hnHLzly2CZ z68$jz(R>=X1w9Sqd)<^0rp7ZMjk^bDcen^#!{?k(Yy83$a`nEgD9x4xwj+|YBNX;M za?LKigGA{tDWbTz7?ZJIz%=M*GQ%myFT&)xcS)G0mEhi3bMp}mh?GJJG|Hs71x{gH zLRAI2sj^24#JUR2uVi;-BS1{rR;kHXrXxO1zwxW?w5w=k_5^2JA#8b#BbJ$k4Oz8t zf74MaeB6Ri1VML2Vex9*3Typ6t085qH3jtALI?gkze^4X_MddjA|5eVn}1y(%b@>{ zJXHUAS}L2m{39px*UEoFgXk(_o1*ybnIyv+4yzMBX;v;|nIyJU*oG!ZDK{*p6e-w5 z<2RQ;+mUaYvPI+ODAK!(ZR=^!FK}&D*2cxGDMD{0E^7NntbYUj>gkq-n4BuX4eQZA z_nmXjbDqoo`k1fZ28cVHWyo@@0wmv2Y0 at ajZOchihkA~xd~EHe)UdZasc{`*No}=h?67+Lqq%C7 z(9~6zl^LW&RcXSMHH|%b(qu at 3zCt1!9VRDSDBzcziVkjF5aH%hf8Uyl`%{jG$;!&k znMP(&Skfyj at U6i!O<+|zc@))ZR!^UtmsOe-Wtss)-1yGdM|UB59MxvBJl*9E(POBl zy at qPNN&-)ghh-36WP!=%8y2Ur!(0nE${Fuzw)zZJ><}8-$(i+9ekNuuyTs^+?^G;ZfyeP#SWofCxo8=W-#bjRp{<<*V(JO{&w=bTltnc+|S zA;4|R@(q#Ci+FdWY(vNwvk(8mR6N{onnj*XYLE4x0_AJ2R!lq=ybP7pKq(0c&Y{; zR*gO;G*zBjjx|hl>XA;{LH~NFM=wyL3NXeKBDjr<;1+ibah)`2hz%=OvOD2-*g%}O zgY-W>ouLIi*OQ9BjYBqIMK;M%rQEylgiD^2Ri)h1iaBF4uxDkTBsCH`lN~*~-_S at p z-Jy-{=!jZ+U={C7o9UAGdRgFvNLpM$Hp(qb@(Xi!Mc6-c^y=vm%=Ncge&fD70Z!1> z0)*~{b1Ys^Ca3EL#i<6>;AEO)Ee4+|eP at pm#4>*}B=6GwuWA?zB at 33@I$)Kzrn9rlFcF5tAUr}7jc1>k*K$`E2GK)m!kLC$* zi7d~`;#SgKho>?iW^G91b>-b+62xUbQ_6Ly1f!spU2U*NZ3x8L2!OtJ4^%E;#9zK> z%7-)KSI-r?_{aT9wZu|~2?zjy78C$L?B92qDo%!W&Sv&bwx%Y3TmN5Ess9fLT-cAS z&bf)j&Jv0RXZS&hLVIEdQ500EL>dqTX$o{5j`wxf6W}Jc${th+5E42Mz*|JS;7k at s zsRESHuA-0)scR=~L^&Gd{O@;9T&hOA!T&sJM7x06iyaPX6m7H7YcC*d%q z{Wl`*7^I=97PkiBsX5B8&tVmkHewpf`Q5yHDCvh0G{+^vW4g at r&qoT!cVhjsB7A5W zF(KFe$Q%N>KNH?FqkcD57KXCIfT*xocGexiuCQbka at x&kIfr-tq{;x9Zsx_zD1REc z!`c>kN^9ne8QlK#-jK)$6(~`Ox#_L4R8tHeO((N8laTp at g*~1}Ah~vdcmuB zVQI8dxkr at Xu)>;O at a2$RV#YqNsB2l at 4{BB8Cwhwy^PFAQ3+-jsS0w37!%#0YLYORZ z(k$xGI**TanO>phjDs#oywOi2w=8RmpX6>KK2hJoE9`xPeXxNp`U|?~kU(SyT^LVD zrA<-|`bniba9-Cdj4_1})fLJt0nMTs7L=e=B5l6?BOiRG`CWVo3;^H?`EO53|8KPN zKQqGf|FeXuXKrhL{6zqng2g~u+IOr5IGYPBK^tyGHVWns_TGEi8{@v=buVAi7<<1ScoZ{N!_|uZTnn5 zT_#_!aMOlO^d%(x1znv7MB=&^Ff zNCFeL!%tiU*dfU<7zyfhEb?L~YO3EVHzntk7EDW*fk$bs1FNO&R(n=yy=a z7|KQ&QCoJBF7mV0z>yQy-5lp|14^v1fFN8Dlz2nbYA^GEtPEp7aGr`I1Tw5}50_%$ zu`EUulr=|LVL%YnUcj{CriMw<(;Gmj!UekON{+s+Lx#T6>oL>jB3EMjY&*#!I-w}ICq8D=^6`G1Cp5(+%FMLeGL`n0f+u$U5aXuO3C9?@4^}t;sEXbC|FaI7yr{Lr%XK zUS)uooNXG-`1NwXkkRvVf+Bu=Q$8qkX)X_ucw0dnAkbe(QkpMKaqZJ_{BGXuT9|_^WQ>&e_|zH;ipW@ zH;D(|DI7UMfHO!^C30jd3aR2CU`rjcm^#9sO2UvvlXR`B!mN%y>_e|IiA-Zdt}-Fz zxJ6fp!N2X*uay$lN{4`!6(1#fHGXWxd4!os^4f`4*cSG^tM=`qwU{=Z|2jHv7<;Jh ztb}xadX=l`^mq55lf=v>~c6BWwHG!5cr^4 zP_v{m3=H8w=>QRhimDJHK$pWlPwdjVS8G#-^h1>(Kmhjx;D>r#gM?6kLrt at pj}vFM z-`Dp4dHjVP;JpE at FuDrHqXX@L%kH!D(s+BECXmZgY7(Vm at W=H>B)3w6nmIB~j2s0$ z9B4MDN#v5y)YE9TdQTbfQRYBsJgY~c41S$*j$ zKg>OsYlO)z{6X=}k$eQs4HWN7U2x~Y|G2XvNy_F$n%i2o^mMD!y$>f(#zuZ0uNTpy z$ARhG=76y614nhYgmBTt`>fNxFfgE#bPS1b{~)b~VcBHmwADE1)jZ;LkbDBZ)UH)U z6+_CSDJblvVQlA2Ce~GqB2gMKhVJlb=b5h`SJ~b__8rB8KbTic`MXGb|92tJo+R7! z7|c1zB6{X#X6JMFPp`AP+0*)de?J%lJaY&GAM~NKNifD(Fv40Qv>|YI&4$q^8?z_H zp(1`z4S5W%+D+I4=&KORB_nlS!x1I*tEMBtp~6r)5D at 5cgX%CHbVnYyVxM9Xs`hd+ z=CsnBv(}~@B*dMCc$kqojp_i#JXvpdmKKq)zZNr#x1 at kPOB;EC`zFm&iZ$n~0y}kS zkJT-eXRcS6lbPV+8;Z2CZF%!L-Rq-~#F~MJH;1 zp=PDVxmC%kx-^O>8a!H_Cs9678nMbNl)Z#*EZ%qh6fm697N}tyqS{?SSsN;^2mF=a zlpUD5=nZGF_G at aiY=zjngyuTTuxT*qncX+9$*LLWvH~I2`EksZ#yOOiA@p zcE-yPlCrX~mf33Tgpki1v-z&Y-KU`*#k+k8^z&OlM~iNdER>sVj>EG)-ppA~hQ*&6 z`c6EA=>6H=;^4Zba_iob1OL(Q~=-QsryN_7Xm|Kk0YJ$4U8(@4Fx;L6< zQeq&+NPS6)I`peUpjOk|HjV~BC47957NpD(lzd=8kBCK`{GAaVEy;8J@ z_C)Y`mEDv+(04 at 0B&>TSZ8|L@~Z7`UY#R-9Ey70NAnq zl3C$VVna$@d{&8$LH+^djf8$tJM_l+**p#3sK^MSDYL#w>}nl0lUL3lJE|>fgmkC5 z>Qjf|Z;&5+{A7L1bPf41?Wg*RT%WH_IEqw<@E~2$XN(qn1QZ)}jgN_-CJq8I%Q6ws z!L+$)qc%>jMfegqG~#*<|3CnPB#te&T~2H`v64J6?!y|_6p z^N6r~)Rf)pHW_A1_3Y6{Ms^MzlbFF3zbIV=uUieVZat9tZXo-pBmP*>Yy?myX|G#_ z{5q;6mjGOM52(Or1*JUjGBL*Q#zVi1bYmPphH4GT5{H at s-RpR{F#lt;nd};vR%88M zk<5=df#5kgc^f1AI$C}4!|t{f{HxW#*Olhb;@;JPlbq$-qbSPSNAJ(*A3KGwj&rb5 zxmWKAOgzs5-=|#a373M0iQwC0^Ewjx=LzB4Jlqa$xxV2;t8&B?U at A=@$Gt8YoJM7Fcq&@Hb0Hk+PYY*WeIl%7u ze9DvJlo9%l_VdN&k5H`sfcyPk7jXZGmxVC!2KqG+3_3P~5A~iHfX at set!!1I9my== zL{m1BO;ji%B*`Fisc>XPQKVPk(r)os5s=S-gB%lX6e;^s=`y`&L4~=6p~#g|5|Ga% zV;wUtyuI8lITNpWbR+Vz_Y%shEb7OSkSim{Xyb+=+9*e8LoUHCRK zG^vuKHTyc-TAMw*Eu at O5P(xnzb8NPxvd(aZ7Z^}AJ$|Jrjt;bTs{_RnCQ-do z{-m-3k(5d#>Bj at aDa>dl)AncB3C>8Q;Ri+9;(J2$*uMfLJqJ`GJ~VOpW;Yj?={&e zc$w3_ib9hrQtwob)B8&{C`=yTLJx|ql2VT;#Mu+!=G^O-kS05uypkVRWCsho4DxRe zDw&P)H2FD$M*2D%#a0wY^K-_I6^-_$*gfqS=1^O*Y%k$RJt5YT3xeXql0?4TMTMXe zC}qZ9UnxsAU4^Q$2+Z|^)Tt`Os=pJ*x;cr|&2!k5nNBgNZcMIhc_h8&utvv|AI1}c z%fq}`X$^A_!v^P^I)mbL2n$JK;oLQ at xA)}EYk06?A!%%cf6FB%OXbAJo3lpWoM1}X zbX^0JUHn#r!O%4;GP|6vx|Xtfgv>~#w9iakRxzmcw>huV!T3 z6wsrtzbK*2yixV^ttCs#hAbr=d4`LvE1jJBs8k3U>vdZt%P+XJ4eP9?h^$sDRhF#~ zaUhkyff5xnrYR#8#>r|)xsqyA4Xv50YEvOGx}y&&IU%Sr<6%_6Z>7+~jkemoBI`wy zg+5Onqh&dfw6xA?P^a`wRLF2rR`d+r%_OzK=_)%&eA%UsV&(r1)(`jb#axHNi- z`nvsF$Gf0$pk%ZpE(t6F%_9$v78RbFmWqFL7Fw&x^LOGZQJUyZM*6%+qP|X**3du+wO8zm%5D8-#%;awbys=J!{{% zHzH$3yz{>|#xF-cW6UQrIRNtluPlWk(ixmW2nXMBX%ERo*wCTLQ|*B3q at S_R!QOQT ztUYoItXz0`m#}_Qv}p2JK<5uLV!<@>QxJ#5q8vy{M(k4n+e-dJYbO z at W~NOn>W)NAavw~UL(f>_D{ND_ at pBal>zIf+&ACq7i2)Y!G!*GScg*EM-Dd{PmhL8 zGs>bAy$Eu~;TvGxVWc6|4zUXJoE`GxkPziF(w~_Q+vM5e6QOVUBipF|`4NHhJ*|i# za$4PRY<3O8g(x1`H6@=KOP-(zBs-twI0o%1x=M+?!cGZAtx+EW<0hY1y|oUY-_qM- z=IbEGD`My}bZlwB0xO!b$rBW7D>p46h$SJp66>VzvT;YCJUC0Zk*SJ7StuQGS4FzC zZMzghMn%TH4X^7OdSzC)2BC}zzlPq_s7IL3PhVpgO`b}ScXsc+oTpEoXcJE at qvkZ# zov3aDN1jrd>KMv^zFnDla5vZ^{oFm`p)kP}9zD6b;XRBVXUY7t9M_%;33d4>rQT0c zBTo4&PI((GE at z6#+eJ2SYz&UN)TRXm*S*Xa-^yQMTmw}VmJBfKRym;_rX?{x2_tcj zMIMfK6`fEt$vR8Wb-}Ghyf9}rmOwL=cHk=3aFtrR$PMY-faH=z3dyP%&11E?c$*YV z at +!c7)rB-X_H#UK_=3Pm}l411~229Nug()Nj(o2E|BF7702)e zl%qS9Na2Pd2TW#yqV2%blWy at a_Q0X)FRbAkR^bJjvjhU8tI)Un^TyqU8x%j-!Gbiz zHN at D2LE9B?zv|Rd|D6jaYtGJ)Yh%wvXpJ6(r zgTLf-x)pXZx#F{)#i(;{mStZLcTT5~P4|@89lgUUhMT4rGz*Y$4VQOqAhuM>1^n-! z{If>hiraNzFsYH8TIYX1Sfp?sR_BN}g$gPbEvh7w!(W5JuW<_cuAB*Xgxr>*1QKO$ zBTb_f$V_}lv<^`_xCN9RI(RI-YB^Ua33g(Q^CjuqINSQR^|l*G(|>=R*yd*#xw41y zIe|;y~)NmoR6 at auA!SDjyuSwqAlr?t>ye&~3bwZR~<|P>{053F_ z|21Bt+E$b&OWIcUZSH;~ALom_f*CKwI9Dhv`F7 at b!GWy{C(!@%5%N34 at Yxfz_F%Yl z|0D-}Nig(v_ctLyh at yeCyuQ-;rJZ4myhQAz(&1z0$I+zqyS}??%^oU(a5Zwz(Xj6I zNhap12Tf1j`39fC4syy%&Mfil$x#!Zb@?u(i-(@RqeyHO;iQjex1c>G##@d={Si_z z!`D9Wku%Xat><=^W6UnC+Ujv~m`|-y_)vN^VaMyncK4v%EEp!n`v;QmOmK$sBC$B^Xjh{gN1M2_rU1JT`vC at W!?R z4T_$TcL8hKe1&J1RN^Z>R99t0#MQ>6fr0It6gcBf>&?%kfx>O1oDT;cn4VxN2D**9 z$vbrFCD3Q~0k7Qd8w&EMwgvfW7P3fW!7^nLqZnA(7^|=Sw`YpXx(k+1X&_&l6{0xq zJ$F?^;}PJmZ_jzcQsOL3in~RiPrd`sK$LSmMp!Ky4_kLJdB3rEDBDhbTC;ps=HLX% zmcH1e-AQ%@BTOKfn+TJ>n5T at 7rq{JP(&gkpX~~y2S^7L?-C!?4 at Gpf?Z8D)LP^8z1 zj!mueQcJbS`17acro0&%*$k?!dxw^MsHgYrazxChwj;40c>w8MY*$>64ei;b?pVghvCBsqs2B!vzeB*K=8w6e-bY0P-UQ*jPqx*&Yh9cp~Nf+ zlwnfwa)ZymmE at R%KcF4>}CwJ$lbbs51uPtSI3a)AnDU}yls6}zBx!3UE$6!tuHhyCdx1LiyUp1{Xt-y`oPpH z{{Za^_Ft=uxw?wKoNr1O6(6q+HCLj9l#h(dbD{l2RCCLJH0A zQkm#gL2ximBy!jju98MaQ>`dO0Vj*Ivx-tOmZ(tKvv3p!fxdpH8Y)gHnGB8IooYI{ zH$8ZYKhXg4)|4WR3njx?j0ovW8FE6=3KP|*0l>h`$4<+Htrgfog+)fG9du~_I;O;vYec%oH zFkbh+iC=#urwTIugaMO%9$2;oiCHrJlg6LXFz-u(C+O{+C-*A>Y8P!G^s$&O-|em7l0R6#8}M<3tl=0xI9PT+ zM3JDW=%mCds*{-&-_}spOTZLLE at qu(RAH5{- at 695#JF^iW)kHN93fsu-0bV0gC|x| zitfHfWcx={02^1z#GtU+xZtqj=ML+pGa>r?t;@SH6o)ncC&sK`KtNpo;~4*S*3G}h zxkOn{0reXif0K at OxgF zz*_{hYLS-)!xt9TP4VKb)8>9AR;m~B7t*d+6F<=<|+ zWkWV=x0=l3sc7>NGfb_FT~XP5C5=wG!fA)*157z=oAz}mI-Hj-^^cBV)0xCNbc z_iRYNihH78E+F*VNZ_2kJ6KpSHqT|vldL#W7s7BW(0it$i9c>9L4JKuHkBNP at ELQA zDD_hfPW;RWr{zO?sL{NFMxg9xOr-Ia?Je2?XvCk8Ke&xm at b*1f-0J-erU08WtZVRreS`b2 zm at KC);+TQ}0eOG}0e$;FV)9QPtuqUmIKbu)C1$4oS7&jFs?J}$e3t5Urqn7T;e1<) zLYL`h7^cOLk`0b*&_{tn?3GKG!e+?@xV4eJqxlCi_GSph2s~RB{-LH6ZD87P&*)^! zy!TfQtHsGv{x3lwRYkeMVg4>O$hr7Tw%YG0-*B3+r}lfJ8)0{c`3CnmG(!8R$b&R- zrW2~{Z*8yLjVsG2JOwYK9mWxg8ZhNn0bYpv99QGpk+%0$$`y zvZSAjTVo!*MI{1?LI(hJldWVeG3nSVQR#i$U1^!F5M|~ZV1tT!R=2H-RuK-doM at in z=M;NZx#0^N{ADKA7C?jd(H1J at sTYu-mu#&B+Tguf8&VJ3d>Yo54z78O#T=BrZ*JlI*bI5)kYaKq6`(f{uA$jgTV7-wqAB%6593 z8zCpN>7=)Vg!ZAQJI6beSqC-Ov5}agM!ikdy8^S(2n8{+xni~pHG6e-ZMpbuqe#>- z9MX$L7*E;AVJii`d4UHnk+($${P^2072U>6%l}^xX8BKqx8?sr*u2X{M-xy{f-EXl zt*Lzp@@bqn#Fl||p#ZW!&~?T_EfThF?k+P>bPDTn7z;gg8j84Af+-MpD at z?B2pSlj z>wKKUz3V=c*>r#LD?T5{TuElIpT8;PHE}={M?;Z72qzU-_OLg&5_Gm7Zg3AnLrhRn z`nds)O{AcqzpZ^WvgGa@@)1XbML%81aikwl@2lwd!L)3MsLyVfW#5Nex3rb zkBaxkdO4JCV(Q;%8rpM1kU4L+NAV&N_biU+(>BJrQ}c`CGLPdM0cmu*%t9%qOHvZJ znth@`^tbb*MX|oW`Ho1l)~@U!fq;V1fq(@6zhL~2Zneg`GnyIF*Yq_-vP~E%(pY~Y z5U~wMpd=g(83;323>h$S0A5t`bb at R~E_4?v5fw?)K`doD=65I(7*$6wMV|%8Nlf4S zVNCiepBn?Dw>NXQjLR7cYbxc6m)gAR-PMna>-GH49!J9ubniwnGFM{^*rkmL)HBfzH_4 zp#7C%{VJzc1z=&5i_EAjScM(at8%+&Tqjfklf6Z=I<>4dm?C?VOvXu+OUhZtVJ>9f z4x6u`W at n4V@scaU)38#fG(8QSix7r)w%uNbudL0A244#A4ve#@bLt5YN}d-x9ciiT zT-YJJQZ>eRDih~L)sBs*u1Pnc(b>!fZjy*yTzA@(ai4-t(00*_WCu9$)h5KGe?*X9 z3uD*OD=e$c<_HeG3K at X(FU(iTiJEn^4OSn at g7*1va-gVKmW at ZaB|Sy3=t#sF`2N&; z5nD*rtNN8t$!RjM6}ld>`|gCf?U;1MFSpWVt?v4mByh^y_|EI_q!U$%>o;6+e~IjbwueH zvoN-?<8&leCv_E1gC-GWddKzRP92~MUX7Ayx{FjgA3yDk0XYv?&S}d9_J~|nJNgMW at wooMq*R=RIZ2_BN-AamWI>&mJID~?Ga--iCztrUja0mm&cOI z`cyN;tD9>`o|ZllZ&A~FM71Y-EbRsjv(-(iu%cjHM(TW}ew(O$}UM-2ulyQggOCuV3pNp{Q5$ z#Ru51?e(sLtO+agrlL6 zhqwhoN$fQ7 at M^-2qU7Gl5{BoDkG3bigXNWrXp&nU+In5Q;_zApI#JfA6<}%-vK6(| zhtDe#ZD;P*SW_oQa6M0rU0PMQSR|g_8S5|9krg-;yl9s}mmArof3-ymgs&en^)N^- z7f-2-=CzaaJ8I$KSbMo0yGgV)F!SZ$|LH#?4L+oEuk!&-3g)PWN`Wu7rAlc=^Y z{I=R^u{+4`?3pQiMYS*2HDkrlEaTW2&>Al;7<)LdN)%F6+lN`(3-U$2ac4rnPnlq4 z$ji at uL=x5Tz*`aKHc`FmKzI%LJjF6;KJ^{ZRiqe$OW7H(f=NoNp5XgQu*Vq0awuIE zFgPdj8dk4t2E(8MdqlPMSnny(j=kP(dV+z`QyKM4Hm9=dK(< zO>8Xjt4aOe16t27#!$-@(&j`_=4Jw><$!pd-w<&(u{c{Bwk~E15(fTga_(Lx06keV zTq+ at nSSj=*SFJXrGkumP9BN|IQM!X|3xXF#%htCaLFVy=p?Pq=xL5V%F;b$oNG6=R z(oP$bODu>^ib>=)pyjxYgE7$6zcwrF*JR<Ha+AZb7NZskB)c`5lH= z7McWN+tV?W*mymE4fb4*zZX>ugh>Iy_e4X1Cz1B`p1J7{ehs!PJ%oyul1w#BEnU1= z+Xs=`C+`fRvu{}K0Pfc4+}g*j^E1SmeVSktXY=IZ(gA~&(qL2+SX~x2j#4)_CH6$u zh+ZDry5SJvb)#uJ(NNYeDN<@Y(yzaSM^MbQw`QYrm}f&LpW2z?%itJp;YE(;Bdz at w zKX-?uYIm3Q*v28lIe=vPT1m8|-eFJ<%@$5WPlUNEr7jDFz60o8$kMM^_^qkRunRV2 zIMPvdC0~+e?ONHaVK8aq6wPKNSq_kx>R_s}K=Kxv at FC6P-z71|VG at o1X2!>dxnR+N1*gI+)OKTJBnKp8!p_C=NET|`aubgt+kz&_^-#&cJn^e<$ zPBW3z at _BX6nsi79tsp{>w2^d3;D>=t6Kr`V0pO1i!wh|N7>f3Xv0C-A7~ZU{Iy z*@eBAs)brHh-82N+kN1 at qJv^LeALQHh&lRAV0xoqc)kd+yu98+fpjyHmHh4;q$FSnmL=&bXQ;G zY0Z4HQE7GwuBen6Tlyj_uR=O4iP{S(sI1G#X;L(&Ru%6~QGQvCceXz7Mq}gm$Pt1_ zz2W78H(aWk-n!LNRg_j at C61c-L>L`_H>u*TM+0u-t#TNtE+fhA3fo+7-L^%R?yS=o zgKfMKE$F8&+89H(SXoQ!o=o~rddo!z7mvy!4{Gxrg4v;@AMSRbUq$#^6Z%>zWXZ${ zd%WLT@>UVANG-m?%)hmut2Dxc#84#Bx21LSRAk=pk9lebr at iVso=U at IcN}y^FO&78 zd8+Xf{alYypx+hlP-?MJNxE9$bR8$%6dz1UEu6TDZS`s&AjCu-%?Xeox$~Gpx at VOe zA_~JQ?P{km2GbCoGL|3W!w}u-D-56{;kZ#11(5;<58E=snPPgWb2r!Ik~p+hNrd;+ za2*5W{qz;{>oQx at ftNGUly&LMzNBNG%4hs+t{5U{RcK-DmVK5JePUemkHcUzCon&q z{#&l5z{2Z3xV!bUKNWuc^7^co`*=%@>sGnLxM>gS1Ax}mrzr`jAD#l6rmgk3o= zIX?m3`+bZ#aS0Rb$2UW+MO0!oO*kVAcb5o;g+=CN^?i31fs#KWEw?Rx-z1rHNMUUa zoEvb;&&o-C*Hk`(ZVc at h4SQv62CA;t2k%3b>QF17cua3d&zHw=K1 z!DxZIgc1B=DWUgo+IY(M&VC6P2q*~@2#Dc-KA-;4l89B-v;M1vwP at EVrMt;y)#BG; zwQ&rpOWWImX4;?_ at tS~g}9Dx_sy5s90r^)&b4UV9uWve7Rn%_62=yfbfhut at rG0BTIv2p0E)!GdSF at 4#IVxme+^U z6*wE|*Z2`sG5goL*37$;AcbqXR$dXlqP!YKXSzUkoa>dP30O9(a#XL_Ld<42$)3$O zn3a#P&{=TG?}BDZ7Cl3*QJ|PAD=g~!8#R%*W})TP^$Qn%z;6Lo&bOr9J7qFvg at sca z;4O5Ah1u<5Zvx2AT5=C5Vj$0ZZ at c+sO6^phJ(w|(bg!1ofJ^!7L ze|T6mUo>#l&^`&EWwA=>Now30N`kPGN*iigS|h1I=83>ys8cG3jj#+i#${zGny(3- ze0R@#SHW9cfvsk5mkd65-+7nbD3TNU!0K~A?T>rju0O7OcDtV7{Xg#C2!S3Adod^- zl!sjBz>7sa3?rBlF&usb!1>Rv6hNc}8FkQGz;4h+qN?6PZr#;B>c$Qxc=IP zyibop?*t=>I^)s-l~V4KDkCr1OmPq0naX_v6;fB^u&i=(OLgAh(Or(Iy(>0K)rBRQ z$w*x*-D$F)j=AQ4Dk-s*@SiawySY+z>@~<(Kcdme<7vAi7`xK5vzr}R;hwz}##o)W zEC61Sip3~s?E%Lo#bLg!F)>fjQT;2#~aJ7wz8Ea+SpAUqzdqTYlLLH znEqXv?RX&f=xbla23&xiQ!7%*lM5FuTn at jJK%vAn>?W#Mo5vb;(zJX*8w*Fq^uT4r zZ1U*mWVYIGDHIi~$GQ>NbZ|T2#wlXjB5W1Um_Qh;P3gjnbjo|R^;;4x8Fjl^z-x$} zzDVk~4w~)}MTOL}h|El7C)@kc^j|t`C(~Al3rePrUaF_h%$IlR5u1TU8)});0 at KLU z;@v(b9c`g!!Xw^Aw29MZlM`TfV(8mv@&^f-lTOZ*SSW$LHAw>gHqv%9jVm0;bvA1TzQ3M7?K?D+Ss0EU5xO)>E z7<*G3IIk0L(0kM7!hn9av1 at M(0 at XfO2iTJh-P8p9BJ+vYf)?D9I6y74QK3n1$r at Rv z7-SO;;}MI at Aa3&?;0~*znbYg at gcdx+tbNzuiR#KCdk^CdTWKLSDL0T-t6ZCWDrMD{ zKJ;kZZ#P2DJb&Yfi-UiNcR`H%Jvx#^`mqF-5+fZ+f)Kkn99c_fQq|^9@@0k^jUXXo z_Mz%d$rk>S#8N{;iCUUEcBZEhR>>3L5>VM|$_Z-#)2+?{k<& zu)eS$a2oen;tDP02kiOg!VegwiItd at p!elG3W#cJa{ktrGUd=4!Ayv|+({2>8>@>@a6)}Z=gc-b z>nW=txDC6X2{yxWTtaE~3_84;y1b&+$hh`s0$V|Dkc(0{9gm$tHy~D3Oq(Z}E%->1 zvUH#hgwtb3bM5foBac07>`Ll1>}nD45mI=z;^ZNv1+aW-qDS}w>^3k5 at eu+{hsPKfDw?7~x*Q at H33Uh%#2=TA$Rhd>2{&a44DgKYq`;8s=z4thp2iTL;E94nVUf zO@|!wMU3TjzzXJQMlxeSTm?kK6Y4^tpC*4&Kg{np&Hs4 at 7SE1GA2ic=l0wTxZ;YMZ|n}8 zxO0mEQW|xaA214knAQ;p*yD$-D>J$WY1JKCnWtCaG|pa$xPrCxvLoP~MW2lvlWP=! zaVtEkW?Qs9;QF$F8i_FV^yiI&j71n$7RRIJwPayNAuoT4Q5NO at X0?3qvJH@#Yp`i| z1D^h|H*x=HWT5Js0w=eDTgG%XWyPki at I%M4CJsiFw&G##w5);o%RcAthFLEr0~?+{ z$_wvLHN*dZTv_Fe97F-;=4MW2b|z+I>P9xMX8-*C4R0T`9AuIY53 z3}VF%ru`ElG z=6UYcDE6Dm{@AcE`q+0|@e|ZrvUU`npBjVE6xRtPpqW5<@MjZpcLqfTc+J-AYfkhPbfuhSd}SFkTBDGn=`D}?1& zW6n{F(0cm(kvA7h{Mmw6a+=mwacmVL`6M=~`QIoZc)x7!v6#w*JgwNZ at vVw4ifQ%| zA1z!!vx-3%{Gb_-#C`;lvsC6cm|4nM;C8ZsQaRJspR)`8Ehr}Z5)RdWf?^2z?=CU< zm!SMZ?h|yM1 at 2?0)~dJZj{>iPyOU!O;X}FNcrC{>Wl~pz`G`9D z762R!_jLPAe3aDh;CK<%k4AF{3wJKvyQBuc8P@HF?` zzdVIw3#z8vgS*zZ^#v1P5Tfiv^PQ6gpTLFY72~i%9Xn;x;_ZilHNqZ(p9-AQD$fHx zA94~JtZ(eK=-E-3MQ0^JSL at rB9U|6d+kKyaFH3WTx3Jz;V8If zaYku1c@(LOlM7*Kvb2TZ->wM-{(U9M4h{q)01pJj@$bU!O!hCam$G%R`Ns|&4couY zKk~D?Zv=F%QKYN{3HJ$Y7MDa=mdMd63ekkpR0KBn*4wt79hh_4aB#gN7*ri%3XY}w z1z_vw;3|*7A-r4+I&oZ-CAJ9d!- at k&|NxZQGOD{SN zSqSr_6RjVMn;29E3x!HsUn1+KL{g&ry|f%v2pgdlSPnQ{EsLdg9mlZD?<~|+38QH( zMa)%^E&{31sxhQ;8&(GIA4v@=)yR)7D#t;P;}^frC6FyTDq1!b^M at T?x2JhJX?1h1 at -+P zTg9Xm2_WP-I8Ylv-K%V)m)V z#}y2Mh!5FhdGwck!@Isp6o!_Vu0ookGSkR(Q;m!=OnH;`IMc&I3G1TvSOTt*Zw_x1(jfXAG4G*aJm$eEGq`zKUM)@#kB1w%h&nsjKwkPvu>HPqTNR zCHGDqRKy{-*|ryeB&iFi(XFpaB}!Km<3tyKn(Gi2E%ci|-7#Neqp9smke$}K!->KZ zyVRebhJS;EjW?c6+zujpdGq}Q&fnEJDVvwx1%^xVO{j)^fM4WH?1WF;XbDSO>cau4 z=w}C0;qPY;QRXjT53!%m0t&O-lCvQa5K{DsP`^daLm at QjdIsY^P`N~=9rl1bg1>%)w_JZgs>Qq1$SnF^(rws|JIwK^m+4FgY zlsr+sh=AK7pEkmuM~6$^74N-#={d3|{i2 at zMe!r|9bq;-h!Y8}8o~->ZJY+3%&`GM zYO5gEU26O(0dtoZoXm3D&C4_XFr=ufqcZP=DKJ?yGy1%c+kLs>oJNDC?6y*4#cY8p zJujtKjE-q5s+L|exnf{5v&J at QxSs9jGsMxvj8OT^=s2oOkMKtSv;|ISbQnfC%NA+gt`3Q1fCY##QOA<2O_i;R}R`#MA*(N+so;4j|(dA znRi66Pliy)_-X_!NaGWR%#ZJ802C?`66u7ewvDU6MJ%dzmj7wXx%WPo(XsdKZL$tH zrym}jv80bFSr`U0*|di)O$*%_^820>Ox<2oy}sIQ*4k8+2R}GGCaQ-BALdYFMxQc> zMyO{jvH7iQJaLc1;&UIBPS`e$fnLve_70m!qj{^%;6+EyH~ora%ImBeco>Z=22MVw z_+|L2QO4|xi>;q-$$T5#w$AP|ES-8gW*!QJGkllhjBL4X9Y49~qtnN2cscm#qGu+e z#ZUY`RT8~Is5wrmp~+xNr_;Tz)UIo>sxUD5x#b2cacij`16f&5-^-hvZ|qw9jIh>X zpS-Mz^&#-S`Gs at w3Nxu0fycZ9-=5lxG{k zgro~pMSL{3c#ZyVXs2Ob%FW72wum?#v|?}Sa=M?h&yKqm*}!#!GE zstg^;d9n(B*t;CMTV5i{HVBHGvsd~-sC?eg?jzB7_z7WsluKig- at p{AVJQ1xFwW5k zF{*ISYf^loE5mE`)vz0bm|Ygt}C-;PsCOS%921dOqit(3IL4tC}!+tvBjQY}$PdGuxQy+X8qN7Uw z{Rn6xfASdAKMG$P=HFe>`yW|G#oo!q%=G_B^rilXD{u5m#jC(9H9G*kqg)cufrbVQ zs1f=mLSau at z{>wn9AVuqQOpUVFFwm;wK#r17HqO` z^Z$CeMeRdV7goFx%_swwjeg8zVjY+Yn+xJL%7bNPlqCtk1TF^g7~fN{3NtUmY87u~ zg*=yF*KcI!?*(Xc?CNR6qpZS-JHzcXcT8eyvu5 at 0rXaYtr>eQTM7fwwbyuFK%Aopk zp0+%-kccRRHdJ3-IY#4p_Ih~~vr<)s_184lVnpXq%$VIB8+HGYX}P20{A}=6F1aUH zTxOWzRskq*)0M*-0x7CNjkaM4fYVW2 at vvX(aC!?@OwC-$JAhE%te>2*8kW?Sb-Usi z$5V6zoj2iav&d;@4FCr`;KMYi!s$Vqn#xQuj$!iSfz%Pky8Y!$CIfJ!B*w_|u at Qli zK!C8!k!#99(;kU_CjC`xu=**cO~c6f?6Pw!eGdbJZS<$&uRD4c(N7h8h%?&afPD<# zA3+a4V%0t7#CI&7&mgH9b{cN$IWKvE-=se%nv>z@={#60Z>x)fU#Tq^c;?|#dI+}2 zYi|bHDb15tW%O0nyA<-;E`KMUhzPzcF7d;{iEW1uHh z`DS_gBmVWZqyK-S@{;HWTPtmC^e?z znlxH$`Xl7Mm%wSWuziD#WGtFt9rG=&Pweu-S#wuVGe4MIS2fDo4vmvy7#w#vR@$*3 z%pqkz#~3g9ryGpkQWWoe5ZU#dmS7(U!E10z`Vd&w*Wc{YV)h|xCx1%nia!&M;@?lU z|NOG_ALm~n`DSyu<#e)rK!wyPOKan`8Pfa~SA$j)6P7zGP`k#paMZJPOBAHJtrG$v z=DGoWW{v>07^+T&O+d5pba#84&Tiv9tP>RU2d)p6V6f7(?i=~wUTUxlgGAs#;K16F zVc- at 1d4>y#h;0=sC3GSjtGJZhwLNh91Dp8$H zin?&ibc}~rT!`+D^jna|`?Y4^5eo=skz6Pg&E7p zO8Y2*uT6?PMaYe%nCf*lP9gPF0mOUN6Km6}LSe=^s8)dha6%QP~2bOzxo9VCT<=P!+xn?)uw0Q9$C*CH-4JGGAEx=R7bkPwoSeu zTrb!dp+7;v(k0f#$+fq>&`zs-{q0or at SNGgQ4k;?Oh_Ogo_~+Zf4A3**||6Y%>E0X z-2cqVi<@?v;4rE;Fy*u<%34Bwu;^sEa0O$a=|iI>_>)Oj@=e<$KD2V8F%;)bgnzlD z0h3`u*)GSIncP2|Gg-U*KmER-4N;<%hL{;3Ng?1-oibE!=)wR~R2i|~5+}IwCig>w z(qZ(OEyGJ|Fx#i2OGmMjIzaE|*edhPaIFd4!$vi)Z($r)@WQ)fTD2<1M$dHhQ(_8{#IkY8(n3U%ZST7+Y%+dEU4th2HKv((-osr~ zxB>a~$6vFAq=^P5T})^p_-oK#IlAj)F+UuM?lim0wS`sCim+%wFio{0hX_b{KCnB- zPo7-5MI0t!IXx$iBBgbjgnceqiZq&5tYTQ2xJ=UUlxnz+Z+`!(y?lJ#dc5B1rfZ*+ zIY?-QP-#>=7o&V&U*~uji1{V_C at ry|cDFUdkz3f%;V#6T>~$CwRSol0bcR7!=HbiP zK(FL_ at 3WlrGj1X)P6n0d1D(=78m6D4y^RqDrx9yqE>s^L|8yxKq}B+C8oaJz()XPz zW3 at hj6OI%!@{%jns)J599+P8|MN)=~R>D(1E$9dy;1OihiE{OTB63Xe(|XV_R7hGjJ{&JVEI)dEB_3=h%H(YXsH#$@qpC4V7Lf0*AIupLc-)%qk=u1=DV ziu_x{UhVr2m|)tVSAf1y#{B`gz&J7tvmdLVJ$-&+&FEG7klC80R38ovtqv&h2h0rL$Y%xHQ5trqw9<@)Nta3fA1Kd-xA~S{wa>|;QvR((f`f#_^&>d z3hrNhDt)(PEF3z+)sS7o*kUyyY`>YsC~BYNQ3A$;>bx_Px!iw5iVEuS}Aj({q;~ zgTITh_|?pzYBJS=#$B|)tXCHXG752vdz?UQ?8{RmfQm4v-23f$PC at X^f?&h{I2i3EflS+ ztX)CNmeiFgeQmKTi3fOCkYv?pN7-tp^e~Q zLJ5=#F7w;Gm|xh}x;a>b1H%(z^{L%cC5)XL&zVwew!`Hp(iN-~q`jip<`6|nkE9R$ z at N*Rha)rNby+m1BFdXI6QJ%Ril8rCD{cO~3^u!rh?AR at 1YgVddRh`DHwRpD&)YqI)44oT zmZd^oaz-|GIHXgP$Nj>8 at LC$#aisJnC_QDX6=b&(K~DiCJ=X|HOCR7b{S@ z*v?Qc^IpPqQ{M at uw}SiJ-QyR?tX(EaIM~)sbNeM=)-7`d-4eO~H}g;w{fL+UpY{3< z90-W}|9wL8{O1A4e|hkPus&PM=5VUhf9pFYYifBhx)GzXgClG at Yzefgjaz(MaJ zFyQ!1B~we1{6dK}%JFYzw_tn#IU)d-@?{E4nl97Qw{oUnI^oyX zIHY}wC(8}h`Q at _W2cx5=lY(b)pDo!bN}+8DF137oAo5TG1t5F|E4Sh$l+bXuggz2Np)l9O%72#GLzw^3$DsdCwJ_k%tA8M^ zrlYc{j`SH~V-vF|l!XNaJ(t4K3zk#dhSt?QBqT#5)WJpGBOB^_5HXe{feGU&o&SdT z3i-M*lR{x at o;5o4AmQ3c3q9P(pRt4}adLUR{^9mRFW>+38Ljt3Z<4!>+GO%~q5^xBnzN{@4B-JqO`R=m2AfpaCR6k}7`Y|1?3f+x3asBg z(@a)bV~eeJrw{XNN)7jIYO{daY`OnM+B=75+Am$AF`qc;*tV^XZQHhO+vwP~ttWQJ zw%I`^osLfLJ$ui5-#asBzt=hc-hbZLT2;SVRjZ0wqR*x8A+zchevxGNTix>+-1d=9 z?`!l43~kP0S%Z|D03G#jCn!3js%Z5x&8k8N#u=H!8%Zt|7S}0t*Y0V=;vWI%g%uZ7 z{Io{I+w7-xP~VzDB_}H2plU9Rmn(1KTw=Z at Iogj@ATy1)e!CAtc`cMaN3iEiI{TfR zsJq~1l+HHN)B(n+5Gnt(Vww$KB~F9)(BOpUanjn$&OX^&S884Kv1IFVS7*!BRl6dl z)v5~DQFfs=mu1`HBO~rzF-MR)BrQ`U;fS}F1-h}_^s`O&?=4H;~gAW6X`aV z?nryBWfiSIReybhGAi6nw#bl7B#0Uz>jbT~bZx{^nAwwVb*~bIN5J-n_j1#G<3l60nD!QeKJ=7bmYWJ^dS^Y<|$kBBPIjOf|K7 z_LN2bDH9RSOlw6NzPAgLeoWNtaFHX1s;zs!t<^=_Z^LAL(MFU}oKE=}4^jXluBaHS zbjP0<_jcRPI0(QNF}GS`+4j{hh%`lm*;sw)j_+<`ks;{V1H4kYLuUE{atFA+Q^@wp zk1AiJhCDMakj-)@h3PX-l)C4mEVAmNT&I4uBrL8?NVWG!E$P$icf#sqqoO_5ArwRq zbh|_@#A_DzpTa*0B)RACEr^`t)f0&uRB at a3$aLpR zQY?BBG~S?U(DNT?DCNl2hl3>vIZP-S|n$J)$`5OLjh?{%Q#2D#NfNxq}Y1V=6;b6_OGi` z!t0LT$@swuXH+GJl6t9bldk-H_qvzgScdb9Jx-~O8MXN~<-A5i_zr&|6L$6;c8GPK z at Er=}+5U7gWJf#FBEpsnOxO$j;WU|&s_9DpjGECjhq7C!a-{GmMdXkA9F=5%JkdMJ zJLqvFB6>W=FqC=A)!b4H`uJV*D8F`$+F!63d(vAn88vSo z0D684aRdwc(g-{5335aN*^LLrLI7g4tqF3}9K;Pa#24}M0q)Rp|Nd_Eiy*W7sdIa9 zd;Rk`-rkc-Cex!Ie!TN#@inS at oaB!1zeg$CXgVv}Ke;y+;%~_+{~F0mQ~8&Nc+-8| zeNee|C&+lPjYuXAi2 at l_goybITjBYuEB54pd)Yd?)MpwQRx#2CNI>e{v~py6TpUuj z%L#A$t?tQb{jDHK%Y0Mf$OD*j1x91A8XBYQk{lb>mCMblyz#ksUNT_0tr|++pt6q< z4;5OPho1n>BEYt3Bysnt1oN6{=|ZIzS1toy+=iUQ0JVkfRh=FG8N5Mh)u)v7}94 at X| z{b%v>r}`cWJ;YaZ+LK1 at A_sqwiD#Kc(@5yWMA;tS!ifVfX<}!6Sf<>&=y_^L>lwY! zp-VDrQ^bLB@)~FifXuN zzv<9n=#w9_Zg8mCR{H|k`$=4q*47>=83#HB=qB3ICu|TO=8;NbyG=_;VR#UDVrFC- zemXF*{F2o;OhC?%iY%pVc7mbb2ELQoqF^Mmcz$&zFD!OLa&S$6 at yVI@7KYT5nrleR zi9yEe_;uRFgHxXvi?F_7 at NOGREa%|#^z959d!x>B;&82Y*al|S&uAtTt+=gCk-Rg>6Xb?jk=4M(Z!&U*@=t-K6`)M;{8LODO>L=*7ui4MX-L?vk zjE+)_8^v)DR=ayGN at z#i$u at G+|E$c?IsrTdC|hWLv_mKL;W;ZL z1SLMXPAZ*wyGy(jVkKHBZLevcc~Sd8gr8OwbNOc*1epYR?^C%-~(JI6P-Y;86i zDY9qgpF{WKK7yrBd21Xk8?8^QDbH|F<=xxt|P*|GXfe}GpAgc`5F2ykB+Hx~ndc$D!Y^?oU zS>SR`oPOvMb`U%dx1vZ^DXPg6-~V-;)-!SD9qPa1?$_!%Ok~=WHu!fFN)=GL1MK>mY0cWKfHGn;reQm$0=sFmD1;Tv7lU5?h at BVLAs0^5qv!iH(UyZT9tNkA=XlId>;93fCTaSnQ)GV?5c>r zKzdem+JundHXm_nyyg at -Q>DAReOr`J5U;c5&is{}b)exk;4fYH&ji66jXyv9{O^&S z?SK5`Fx7t^V&KotJ{&GBgK&nB#XKsci82_3@)0;X9GSsxoyh-}*vYkf{U`fy&J99L^B9)CJR%yqhT{G9D zl at HI@094|)%N#8tOrbbHN#O6ddX7=d$pYCsw@>oOpOaWI at H7R$v07H+Nqg|KU;BO> zj(n at LgJ)%W^4evzP3mB~eZD5H?UvvB-lb`acW+`30Gmp$5I(C<+d&(4{v8r%B=BXh zfvL`Z?X%pGnxSB4qq=pY)ecTITYYYSaDenm+V%rQ^CB~Wh{MBsbaR$?8SOV(epQng z<}6kgW-c0~Qom|MYOYNe_#ApYomMdoZx^wMrDJ!zRd?U<Pn#3}VA>#zh!hsh_(>F?IXooAiYzlfbPkCHs65F9QwIdcHB+{t! zg`^FTIAFa-%`Dpm7$xdQ5QsBH4XI5F31D6 at 7LtkZ8qZG|4A7KIvgDAY4M=5P3Mz0P zX>kF?`4+T?-FW($CyDtvC%P~$G#3oUr6jELB|4X!k1-c^6S<=>e9}en$(5XNX7UU2FTTHj zNuYl|lQI9#Hi4Rr%Hmga{>}6d(aVg#e$P}_BhhiC?zv&J}x&qE;j-{AQU9H*Vs5dL!I?YGm%4&3O0nJsm^=ECBG+zcAUBe at rtLir30pC2!$xOt; z2bvmdnI4bS^wujhWTLeaWpIdly^85<#MV_`+To#oSz?{=s=A^Q@=5h*@RHo7x&=48 zPqb#WNzgwl@)FG5P7)reZmY8s;Jf^o&ZLw!k|wp?Bm6L82+GLFi_n9Qdb%SNosxRS?>1G3$5UNEExjiH^phlW|T`U-TOgEL0I==8; zS4ZIYabK~ZoLNM4z;-owOcP*1j?;>9c9(16AE8UHg9XvXpGC z`Xz_ptZw79*sy#q&o-suR#CTDkxU6L9nSHxNP9~Dhu;~cYhVqY?<2^*=smpVpOPy- zS0LmOQJD||(J9P!R=C#@W3{5!9}F9;zoMcjGRkEI#gXfl9BI!&@+#z-v>~Bxl(RPk z0FC_iD}KJ5qthUM%P?dh?QjJKA)I??tgo=_mgD6n at fx^&MpBCE648E+s31#*MC>ot zp?A|DCT}|#CCYO#$v#Tm{JAM8^NQO?d3dX_xd>sC-lE>EveJWp1ap`~BzZB at zgC zPdrJq1ROeFyzq!EVbl1d5h6FX7o-uN5>rAs%NJ8R=Fnbnpxo?)ra4v}SJv^(rhM+L zoo1eiqlXT!sUjzR4DV&xN!ON{Ce@`ozfSXY)r&XAr%5#WRa#OO zJgV`B at Zz%(Z#r``t0^Pd$DcZhLf{v;FZl=l;Wv9JDpWS!iJQ)V(`imt!GM5IP(%2i zEO44t1A{7A&V^hgG}q`+IZ#rm61Ge zs!0}Qc3^c~e90>WJow%GP)t`x)>@lootWZDf_Vmor@*a-%&>VDUOfYcfIZAD1+>by z*wXu`E1SF$6!wap*ju+9cHZsllfKgCDK%>((+2|+)2LM&T1tvIFej>Oj!6zH;1jVv zl52r1o!h4*nMK)YVK at eoSSr72gLHX*f;grPfcBG}5?Ia0ADI|q^nL(iS6icsW9L=B zDbwQW0ZzBb>vT5JP)XhGwlI2DZ5YguEU`hn4z6%`tkE#a8S6(;9q9AOsDzj!vqibx z%(EH10xU00+ArL z4v1=Sy#3_6rV86Vb+j{BYRihu#}f~cwNqSCysGm^iyLwf{?@mqkxEr-TdZZuqAD(m%q<)wAWSAwl)K` zX$=2`S8SE)AhVpbUyMFegRPW%q!9VmGn7ArM(Jb#^AY3Qw(|F*7xi8eT=L4IWOD7L z>SXP7K-je%>8`Fy8H-iI{dZh#sJFa7?#2PEB`-F9M3PgKw_j?N32VE!L!`F5bboQCdBCvxR>^QQbazt0=>lqm?%AVJ79!wri`G_u6rBf zcZF<2n%<}e!rkCg0-hHj9pxtm$=j;kh#W880!IXl{s5%5)<|n+nH@(u<7q0J!W|~Q zKMg-=OnfUE4hQUddL$CTbj_siqWZT?AkB)}x6B!{Y*4?{E9j0Bf7K*lar|pQ1oEe0 z29nG!_p3R+G50`W%KLNoPzzVTblV}K`&8WqvJoL&S>8O_NAM2$MRs550Tg0cn~IiS zQxM1}soo(o;zK|ShTXV4Zb3RjW^ILTmoju)ou`EY;nW~ zXTwL)%Hv=3Ys!i;h^Rk>940&n$k+cb5%GUc<^F4^MQ!dM&&-eX^zd-1jp$%OWQ<1o zC1nUDZ4~+fNep}}dx8a2>l`+t1=R?_vCpp-co<0W7N78pJcolJ&`1PJ?NTuGazRBA zSABl3Pd>LkuRAA;x6gziC3jS at BI9r!#0N}eqS{+mqPS%*jxk8>okH@%0P`2;cqETs zjv50!fj)qtEUVPpsY?K*@!gxs%eR~=?W%Nb7Fijs(l~$!lSK^;K+j7}gFtl(azr;B z9>`@q%K>r_ at 6=gMZp zIaZxulFmvdX|z3Kv&vF#Q8qQeUW1GUAu|vC)`}Nx|I1!H&pUW0&{xY3W z^RvyEW7q0}b+TOfl at qn6nc=pSfS&`bWDA3C>#6i1sNYpQyto}A9_*UTOzsVNS5%vg z>8Wr5V{NwVT8yP%;1#Gznk*AWCem>(qeysL2@=>h*lk+fry2%H{pUe(e+kEy=}pc} zRDG>I9>%Uxg?Gop&gXg}{PwQ678t at 8=r>|GQDxqJV}He}^GVXpw2n0-y`jK;QJiDl z+mFlR!}#SOS&2PnGG~%7l}Vy^T0!zmIFI-1HE3~-Pf%7uy=o|Ni{cnZmv z*bo_kD&F}UZj?-xXoAV>M|-r<6;YI-Wb2yl8)L)FT4k)RZN$ab1kK%>h%=O*`m7ls zz{AgE*5-feBoIy}D9H8*Iig(ycwzmkiK#e{(Jx^}B_;6p67a2u zKX$;Lkk2a`b+5o?-kM18d at Rv~anFKzc8Gfx$B;J1oW?e$j36?Sir(|Odi5O~LZ9&Z zt&+vFoltSP-))o7df^zJT-u3>ILi0sT%od(eygcqDJ7_)A97GLIC-~*q5M2^sz#Z! z9;S`0F3GmcGOV-;{$!K- at rwbLpkBstAg#`1A&=EHxSZ;%9(RcSMG-68bJ);QF>6P7 z{9jgxhO6Fq>i?-EfBrowk^SFN;=kHdE!*~5rpFZeUx$l&so>$PmC2YP&_sk%IN0~? zy6~qC8aA)&quv#IGCg7cF;lNJ$~vVj#=$1XYti>I%e~8OQTC7Z$cTm*bFP*h`4WgD zN~Vf9Vew7j&|blW)|xAZR+>gk37vF3nD3l at mb@HDkU-;^r}&!qQ at 4_aalU)q>Je}w z1TMAktMEgfeF~tm6Ibt&sicFK9h`u^i*Dm8uQhD{piXjPRF;Ly`cYr;6LTgaQcfT! zV3c+h<0Jh at h$z_9sg1IptYU+o*#*@{yyGZ`Zy76@)p-VL;k8&d%iaz}{ z+K5wkZ=w-T(jb$IzFz;U#J+AaP~4<^!&04dLaCk?KO=%azXLw%1=_UKgr`jM#=T~> zR-}q at NQF>cHHIOFd5JMtgtF185|NzO;Mu#6UZ1B*T+hu_t8;#@O;5)==+NC=%yX}m zy#~iKbPVbqi`~$0W`HLTD|56byd01MTel1VeCAuX)UoBA(26yFBENn*ahjeGFJI6ol~M0JnOw-bXav}us6?=jd3N+3|Fw$ z2ZTEJ2n>*VfjURD^J8>9;b1z)>5ywOYvdn_;&@?Vw&`}X>-0Cqr6rTrxkFv=&U^50 zjN^G^(fl$+NXcg%agaO;V?wuv%-a7 at 6meuaBBYuqU=~Rd at ZRgym{OJl{$d6h?YP<0 z{)5olzlTtc|4r;(DkZiP?rcd-7G_XvSAA@;l%oaj6$*QQNU17?)hixyAzc7J`JzRCWMJ^!1 zsFn?1-=3AsJ(nSAj$Kx#hv12K$nGv)EKe86+_8L8M}1nzx=)x%0FKp?(MG?e7vq!n zqi6&>-V7GF`us9LYoF3VMhK`e!FjgbEp=*K;yRMhCH!4Rt~4 at WK-*6mX at wLnAR>S| zsEDQE!S}1&k(#Dp$6L*&)rJ?nf at 3Cc=Dkp6Ep7abv|%X;iTF#q&+qJ6;%mwuV*=wG zxdtYdc^>lDqVK}^%I;<706mc®v%t?zEw!f~6;2vc{m-R+ET;N{hZDnM|)rNqHl zC4D1*q16A!sJu!03%+C~^+{~tnY{yL zOMhe3+~YUSvBen0_fZcKy`ZcU1xukbn1J3-D#pQ*V{Z_PwB1A2ct>*qsZp78AUZ!D zeBnIdEY=bwv|~D?FIUC6OHO&TIKl8`)-9Sg3pdJ*7+RIz!;Uyhnmf2XJl-^J?&3Qi(|90$OO`sDCp4MejB?j`&CXeEoaqS zss5l-6$3WuONpr0p4}l`CGA+eZF$k>Qie37DgpAGFS_vxdyryvlG*LmIxDM%h5P%% zYWpn+#}DDK;0WvzrCE|F=`S=@a0F&B{xybjL3M_?!~w&#sJ*0jI~e?ndwqtQRyea? zZ+Yc+QF*?BkF9iXq5aNOv5;h!-F$4vR-altPeT+j9y?e1v0i2s^Zvbnc8lXyJM<_! zey|qNLyjA1Ff_o>8(=uUv)1P5L3iUd6!XP`E1eu*uzM&{-y(L9?90^>Z?)CxmoXaV z{E$fK!uf#`BlNzHzEZ at q63O%~Jb>lHE7I>{rr^ zj;W-VG1JOoWMw-0=bs+iA{z>UV*(Q#dio}odQj!=MNXxN)Vzz%;&sIO+0F at 7HD_6_ zg`?LS;m4k3+q-BVL5nI4h5N91*5gFgLcp?c3(va3KypYOfD20H(FH=)SPKEm(Z{ZC z$?DM`Xx1UhmY)|}y$oHClPWB}2jDI`>l!>pa`wjmlrA9@>7kqR?qYl+f&}_ at qAvG* zi#jmOy)nx|?1oF9nh0K?k6)}d3ZJ(zwIdNnN~~NF2vO at NahGn!GC$8IK};?mha`|~ za>Rc~T#dMpqr)yl6CYQb8?Zi&WX&N(0ZJuaI^;AH$=?OzjwY>u*)ROAbwZ5VqPUbV zFkya{b{9~6WtlEjw-HQy3to~cS&JdN;EIaw)-3xeiuFjK9(*St%|_7>4V_6!tB{H6 zS#o}>F2Y>;@s|$m7TY4D_aB4~{>LTZ|3s*ev5Tv-k%{ZSw=4fc1^cIs*X4g5bhrDH z{E^2#btdsWdbKT4;*emxt#ukGsc69D070Re^DrEv9-Hp;5_KL&_A*DjFT!Y1gP5bM z{#1uotzvn?U~K2JTU*l(<`(X^bG!NdAhLzFh9F+8=(1Q;WlTX*t$YjnB?U&(V=eKN z01 at 7;<}gO!HU_mYLr9`gN7IN$$6|Wj>0^xxAZyE&G at HZ%%eme<3E-v2&`sbKIZCr@ z-k|Pl5E?^}K!S4aDbB2R(<(O1q)`b?UycnSr@&Rx29_Us8r9`W#nGeyx{+&`=DqV% zPs`jhqaWh5#SWtiFfmdOb$Pv_nbgiF0c|cUecI zb_wWfP$J))#>VJ*))4}}qhoGg9`cE$QP1ikZ5Zh(>Oruo){>_sWpy8|_7XY2pHwAg z3jv2*dKwIgZ3aarg%O*1^tC(Ul;Ay>%0e7FKhaclbd^t2qhm|Mykfr(b`1ltq)#`? z;vvJ&A1q8WdmX<4z;6bZ at y_FZ{5mcXT9lg2^BqeRSP&gz4~zW{D7MfDWBwhC^(ZC< zK&+w$C9^U$JuePG1iHf4B|qUrttC^-Uj<=MJ||LreBEtda|%_D!z=6^VPBvxB at Mak z5V}7>nWC?V5wj?O*Qco5`8IMZc||($;~2~39eI&&kPRu*wWLCFME8=V8Q)wG=wSIe zkKIRL62LV)n`dazedV-Fv?bP5y&Zx-_3HVRB}#~|q?hUc`!7S at 7hZGv>`gf;!ZLP6(SPR>v2HI>@DLZH at +u7Z7?;Q~<3ucI}ur#O9(&NFhMv5{>} zz#h#kYgxQZEnF@1n>?*!9tcy~BG#gH+?ntSwR7P>dpA2KHg_Ij>V0tBOyf?R29S5J z`rO#4X{XQwOC*ylt%dW_H{sK(TAw at JhnA?j%w`|G2A~2oXY3J8){dID)Qk`BZ7q`! z{IG&UE;1Q(AX7@%Us%qY8dG*&l;V_q6U5Dkto6G zk|Rp}dGc1{=Tt(=EB`%BiA2-~$InQQnV@}L at QcCGeq=g%b(fq>ODw at +YUgiB*EI!G zvICQ+h?Vj9YVyA7pnci!@bo%ai(_Yx(0XzF at lEo_7|agQ at a*mR0wtzqxNTdWO``tm z%NGvV8Ox*wI34nw(bz~<)B{Zka;{rA+sy%xoBNtjxivZ?c#l4WTS=~n2ND4cC!rxR zflok&WdB at i;ty_ys1CY)xH{>M at JkYV$zNc(sBI?Ik=dyB`!Xo)S!wjnyB8_co1cRu;TenlMxI(H&Nyjin=yr2B7|x${6q`N z?z$85WeBu-d-%q22CI)UvLOa at g}zA+JNDxblbHFw(lZaCQeDoIHxjX at QG!B5LiPH7B+Gm$iXny#{F<*>ncU?M7$+$GOf+A% zEH3|w1 at o?nutS*H>w!SRCO$>Se3S1%d_U|bPh$A0OW*^+5p%%}fu-DEa3V?ffi;w% zABY?Q3toYSxFM9zy}3o?){-~i?Tk;a6XRur-_jOjuC^xWu+*)q_z~Zv_I(5 z6`yfdRXwkEdR}CI)^%O)s5ABB2RA!uV(1lZR~f;p at aUlQD5d`QYj at W!`%e;SP#oxv zO$nG8;%P%diO()>Nx*YMnEnNpKQP#pk2xX?pwMtekd=cUGoflA*1$BFuK3{T_<2sa zJQvwolpZNppr0w4Qef1|6s8v(?-v~OJ|y)BUna*R&ZfRd8O5+66{`FD%?`RN%AP;Y ziRYR|M;X2l?@bv=WRI+H9Qw!!RDZ){P$7Ey_?4F2ivZ5q9KGIP}P1!L^=`mdCF-_?)PU$gE=`mF4F-7U|m(pX7(&O3B~0a2UOUp$+Om2C#U})P*T+vVB;5 at I{&?w%;{f?9;X8(=OdI5*PMaRg#;HQUU(*Vp z!>DomPg+4j{97)*|3g~&cO%Hg1x*dhUq0DB%T&fn2Bu|R-BQM$yk#p}Q=7)}9I}C3 z8qzI=;e27nUX~+`1|}M_=MB^!)ZndvH5kGIPw+feaFDRL&%&cyZlM-N-h4KX|CIao zp{G6ND4{>^1I!R&7wUURJJ{JMh5#Mp9Y4j`Oj^loe*?kL at xol2%FHUF%2dpmFezS^C#i+vsSpKT-nkHvi(`vCzshqR4Rm2&` z$J~{}MDjLSx_Qc_(qeT?Fj`Wz_fid2dhJet>t at apc4{?tbat`w1wasFX at Qh@D;=vS zjt6TD>-mVScTTaitL}shR3YN@$xq{|f=fs>`R^?iHkCQ5Nh%o}Os)mTIp(RW*s}s? zIoS55_)H2sTRD1~&3@~8(76k0YO}b}btpw+ZlosFm at Ls{ScibIBDoL2%{0yQLC#Xf zDL&6=iaCuK?#>>nV^!_*oaKk)th7nEfObs3(P&}qgwC~Dodqs8vjOrLs~h8xiJuGM z>(lUS)l+-RXB-pnpRfnS)=ARjY4?8PWlH3=iCvl9LKh1<8pbk!9W}393CAf4Y}SXF z0d-h$GT)p+r-T@%4UXEhDkxy(=jhEScC@BnF;WQQUT9TZ|^}bt4{rWflR;OpeiJFO)Sh);i{f@e85 z6a*DW?a%W+EcB!R;F}^9zcVoOMaXLC`$w0Dr$o=3YTrqAa{`Q z5g?^x&Y?P at tkkaj%PzY>^;b`Gbu=o~)JrCNd{f}RPmk4A*fhf~Wt%^=Es)vhg;N$Y z-iM)1{r-KOg>3;8Epq>K7?aBXr6i4#IyZInO86%=`Gb(9HjV zrpb2)ljnJl(j%Bz7GZT2iiG?$NO>jk^=t&O5Glf{cb6v|Js#v_I(g7SH!#9qZMj$+ ze+d+tU6e{@MG2>p)K2O7485_4l$r1oWoQ2g?U%LX-5#%mdSU at G)ILhMEVt8TAZa-` zrQ-tG#Q=4d*V$tHBHP0X?4 at I<(^6)L^kN-3oe0O7bwk*8nVUZYo&p)6h$oof`2$%p zdyDs-UrGnp2(1!kbpt8GRV4i8fjEw0F(S=%!DxkA(RN;=e2Mt0(&>(T}gNl(L20^x*LoLcCkLsg_W#^XWss?ChZL({nd>jZgsm at -m?`Ri($mB8&%0|*e1 zdUy~J-v68({+$*6hn at 1jcf?B7^;|YZ(fM)5lCP=UF5BdTIGltxc-&EyByl3Q(X%*^ zuO34nL|)SIN0gN466jc6J@*}cK<~kp$UCF-ci> zw|dF4b9kxlWf~{3bDEGGi-c9uqr{p68UEsWm;RJi#(@u1)u7+}zN*pUU8mXDwp3-N zCZ|`rpRT4dr7faSzxlgM={p`jr;_oRLCcC;xaaqZbB$~rvu*vwNeVGkvFf64B^*thlBTE#^uxBd_=+APa^L@8WM2r!-wMGBW}CS!QtlMp>w7l!`Y^E3rr~=j)msL%y%5w9g|ge zW7XQfDkRQxbUQ6L?ov!6&RWhTi=&efT0JQ6Gk{y4{`=^x7E&ptcg~dL4_S#KW7ERA z^(>Qh0HyB_F=mmDeFBvi>VpH(Bm|&67i2Drw=J%Xb!(M(t#8b19P<7ngb}tW%_IlY zBY6Nt at W6dpU8@JCGp1Zgw^FY=zB^rpKb at S+vrOQUWx8IjZs5=$`!T}ihO?T2%Q863 zRJ?g+-Mx_kcXy$~L)eS`o$^=P{cqkQ8j-K6qgBf-v^@0XS at F(QR()Rwm9|tJQ3;vx z5DXO)M?-_ at C@_3u6-<4r_E>!x4&fnjRKx0w)Wo%fATQxuZK*N`y|C57*H16JA+xde z>*A?B!5`ol_V_}6$7DYWjA(Xp?jteyVaF)m1^rR5P>KG3Ku;a(0-uS6d}{C zJ}l=Uj6P1mpr7`t*bX5jkY`zFZ z3lzd8QvarqI7^U6^y88zjWOn ziKY6o#i9t8`&K9g;hs+;kzPa*Vnp z-ivi;XLE}%UqB>yO_;=+-4yqSF#+vw at _9Q<^tPA at pV3Fk3ca@=6L{sfl;K%K;FIiw zBJjcP7=k(!_AsJz(ZF_#cjZpmI1Q%Tkj*qFWbeu3+K?}SegNNyA4m8C3Mi#WBZMFC zI%oZoh(!Ftn%-byzcGLd4w6#+q_pqE at v4QzJ{a|Pz_Qxb?XYu0^DUsw(uU(Jfx?8)OJ)XMfFQLJy&L;IA7zez$kBOlU at sX{XdH-B- zR}`;}-9*m3cH%<032wX#@(&9MKP1>Y;v-!rfh-ra)cZnlNNe>1b1}bDYImbKQ at rzU zvHjj;r0o(c&V8n#J>SK8&OiFZN(ZKhMOOz9dcLZ?v%FXHGl-olcLYI-e*7hFITFxX zID&(KP{M+Mu>SqHC1d9GU*eUF%Az9rhrN!nB{&QTqk)>D4DB$qfR54trm_L}Vpw;J zJ`+x|eAb2Q^@`vgqvN5lg{v>!7SCaTB4^i9EA5!e0xB+*y6g9Bm$`@TQ(vjuhDU(Lo&wU-A*keeN<|n&}ayB}z+9u`1*&=-=sm1K(n67WD z_#w}3X2ZQE^W5DGIAyfdb3HYvSfI61jYW1 at O=m0{_m)h7@?WYoW!&@{#@JmlI0M72 zo}u?uWvUb9ZR=Wg{eyxGm!YOyZOU5ku7O8T=b!0epK(EBn<;oYKm(FA(kYA-Ne|1~ z#-EkHSHqUR;V^EbSL3RG+n{Tx_4ib1Pj9^p>t>6cUZW5C!Qb{&#|dYf%aE!k!Pr&( za39&4nk(45!@DcWxf~5Gch4Ei*Jh}ZQ$$AUR22eF(GePLq^tft%pRk6t;(2DyeRWf zPI?5xRf4&mB%+!IYMpQV0 at hMVSH&qepA%w~b3`$SG+Pk%XZ^$(1O?~kw&8{=RB#1x z>8`^;UEFsR!n4bQC4JkVZ$~&c?_zguwsI}eh4qd4G~bp5Ne=sng#s9IA2ra+2<6bh zbR^*lBh+!~`Uwl%8jJ)(VfZ5&bC2-J_=^BFN-F1f8pxF)j40kW$J^&-Wp9%bRFjm$ zX>)60U8*yL-Hp&c$PQ4BEuxY_`K(e)n4Tcto?kzpeLo3y1*JaNV@*uS<$pY^^uIqm{vmb#d!fVsGFOzU*=V2|A^Ypw z({?~v8EesCQ)8kvlAtwB%Y5^s=JNfq33fZ!YL?MVm;PBbd#CJo2K`vfGXq}{bR at N( zvyFXnKRwOMdi(MF{g5({tI7V6ghHQ{U_7#$IZ%s};82RueynE~@~FvhIznz_*XVojOyjikk7+}U}+MT1-Ne`nG zf$A!c%C at xq5?16uOffdrSA>WUd1+oyG}}nYj at cbJHwY?pA)cr9VY#Gh8AL64rH4~l@ z4WTWu2)5E|$&GQ(ECfVUCIC>JTYHKiqYD}g>0bj(^MzV~hgF4;GVRlRdTSX;I#Clp zsSBIu!t`8kr2!ixnx7UoU47-}GfczvS%Dq0(p%c6uJPF6YZ%*BWogo4#m#wF4G{P% z#u3Dx%;Nf$_iJqv at ZtKZ^vm<-Jm<7m_d{c1&8oDEwKDH8*OBs%t*%){kN2 at C1-!at z-Mc3bQASXa3#KWf!I$(fy^81*-JE`A%lX6PHv_6H}1zwMX*mKY&7#i5ib9tTykBK z)OforWOz2EhyETj-!&xENA*_;G_GLFT={(^J)S_TUy(71#|U%-m#BnSqxJ1lXiHsY zkMo>-K^SWvf6;^nI+!Zwz(7D`q5sw}-2V&t{_VN2Q}~lg{cm;{XmhiBY^9IHa=S2e zbL(Ny#6m-vh{C0cb|=*(8f~OjQC<}M2SmxNjo+>kSn_nbItO)!vT9DBdidt}PxE}9 zUgw_kLGCr9goA1HpUD6uf|0MDMEXeF1TK6 at 1I)BZFVtgrV|*dL1>dZI%lI>`_~A(h zdF}<32&+uXY6dd;C?2a7mDseQ?D>S at _Gca_lSF%LRcR+e zgmdQA?7|8E!Xp!Vb(Q_im6CVK&Q;PIZne2a?6ZDv7NzEy6lr7$efNH<8x77iEe%{I z8nNr%l=^zhWw at H&>b71t$sxD?ct(ZlsjEtK?>4VO^;Vx9iR*@?{0TNad&1 zSB(anZ1|g~or28Z%&MnfqA*4pr&P|xiPOw0aAqMA4 z;11w=NsnOihSapDjN`aQ9pjEXBh0~!cNB4d573f@$tm{{{XifNSFm6j+h8hn$yA0< z at s8)9W)hq~0Vh)_&ol}*h(r$v>{lyOU~*g{Neso!7mZc$BAZxb$|nXxlwhWe^BLfyLTi0 zU{r)a!0`YbOPUi at j6(@aHcG{WNan5C*6oXoOqcwzj#V%!`yKeN!q`)H{2CLZ*pAxX z)4Z`;kJ--hnUA;k7u>H1XLtB+;*^rqjCld1x0Xd&_BhZR%2=FDdx(Zx|?M+m_eOQq`C at mA3=5w-D5eS zO4-9z#459tzSp`+etQK%@pH(YOr&d at eYJ^ywtqsxfMkIhbGgyBY8FdoSmOWT>>Y!1?Y3>v%xK28?abJ=ZQHhOXU4Yq#^xK_wmp-~nD<-zo_*`=Rrl6i zb*e@^Kc3&MkJd-4-daz)aWd&`_bo2$G`s)Eq7Y%Lp191_Ycz%6H3AW-d|to6NOUS^ zxaFF5zz!e3`2jaO>qw*dM7dmdX8x#afwA3q;jUHOZN*DA!#FBpI>ba&jL7thFSQ|> z?S~gO^j3*c-&qYM3!c5+2)eGBW+xRKaES|-$S_3c{I`T)kWq!mDHh7Md;~G)v;yl_ z9s1HVm;1&1Sy`Xqf)`K&_06!xV~-`HqLC&UrkRtWuGq!R at vp3h&EYR_NGPMal(214l_KB> z$ZreboNK{UdBSLXLpH7ujv=nBB?R|B5BAsNy~hNQ%&ESFkL;|Upa!9pQo5i?&oIUH z8h?vtNUSJ4fm1+xPg&p!v~H8=kOrCh=1O;6x7aMx(&xM(H1yQ1$cHH`quV33J9>N( z;(bqhI+9Otj2(J$Xr6}1vhwos{wlSk%b=Y;_(h!KDB7I|-lM+-%;}P6isEe1Q1`}EW06HzKxXx!TiIY75iB!k2C{BbMR`^h3(u{2 z-c2LP)r4kLxoe;B%A5Ea2dqK;RY#Yj=842LCfTh0T)RmZNS_TRA$R&19-V(V|55?s z2yFb8&Iv|6JFPxd_M4sKYRW#XVuP$+n=0e0({hW>A_@&w!vMJY2|#{6=6#zzuj1=U+dZ3s!5EM6T7gndMc%75+kiEkfc0$!I%+Emx{*Z!M)* zT6eT5GWl=?BORF%m4Bh z*@GhvpH-QffGFbyrhGG<<0&NuuVXPKi=2Q08A4}?n0zyh`?~t&X8_5hPhd(!yrPyR ze8My733s8UP|&=kTYL4IL$tcZMHG@<@-`$`{6;Caym+6m{}akRW{JPqAwfXc5&t7Q z-v0-b{}+%oY&1|UkowQ&tr{!V zvU_&_X!v}uAU=xljTSYZK0M_3Um~8*TJkh?X`wVOljQu}G2gK`$;|Y?`1*KH-vx2q zdq>K0q>%)kBem|!BGG%O6CQ;0wjO=nXRG$W1AGz_|8vCN5N4C`WHR~Su^PKFFv z!qWL^lVFO|-`5!4mku+|9D>^DnbNa`lIz0kWAjb|T~KCax`~h&EgpO??V~UutPw7; zRVJ-eA{x!@&nr5K3gFC}wC#zCPyTA_7m#MMpP(*=Gv&^sH0N+MvYIh#Z^$P4_qx#w zb7-B-H+8O40vH-^HtkG6zkZlVqpl?`HErA;e3YcgR3>9{ucxpsSewgEpLcs8d`?Bg zB3Q{3XHm~}=x5hH$vJoTq6JtL8XoR>Gx;csY*#ki^txkqNmD{BvpSnnETrYA%~nT= zsmzi==DI9Y{^hT0R)l!+j`WG1$%rY{2FUk;4k-C?S7*g=9W*R2GFLa13Dg^qltxQ# z5 at E|(u(DZPQ<1A#k=j&wr-Alx8H<=MUAY>YI;R=WZM!QAV&xPtBb!l_Pvf3Kb6PUI zv0w*?@=R4aTm)Wn56|}<`cnap>__gw9TxyY9+wX{B$ za!ZYQC!w=D6gnXP0To;Ot+#U{9P#Mvhw1Tmju`Oygh_=fMtqe&mCeOww_roPWMa9b zIaSJb9~Kkg(9+Z!tiDxVfX(B%T)Ah~O>$Qi>`r#}y1RbqaBT=!MdJ`B>P>7f+LPIN zC{j6~g)lh8jdDOIb4rOY3i|XA50;*0DL~nUCR>S;dUWkVTljgTdq+PR1}`SnqGRAT z9 at Ib9Iaxnf)bmEVs at Fc3Cz)_z&ZOg5y at db%S5?oM2(VaP=*8Ex;#^O;+?~dmwm9~c zGLsvMQ<9W7zu*E4=jtBwE19X at SFENh7v?h&pGLI7l&ij07Pz;lmD3wq%%_=#e;Y{} zv5(+mtj$#C4TeR7=Bv%hdhVi21h{qbp&C>H;jN5_Mb at UjbH_{aIJoe%u7j7Mycm#T zJSiI5QPEPmWOh`LM_P5#5kKjdL<6jq%Bw5)*@dbZeYe;up07)`jW%8_5yVUcfS5f& z(KgN1{hzFml0TgVNSf6>$pKM7w>#!laf}sA4JjMeWZd3yxvD^05sYtCLG_h!zW`UG!K_Bt-yCxHhkc{J_J!a}zr9&0Kv^vg7Fap9wHl8Wr z7 at 4C@U)FwDSL?P$Uq;&O-7F|Lr?ExCxR2yW(iSWSs&3Y$+iCl&uef!R(5B$N!X$2* z|80nEqwV6=H73CoSmMLs##Zz$fxJznhJ1uJzZ`kP75&ZHI*C108gIlElad3>$Qgys zbQ9 at kg}lSEfJgmx2c7OYLA)bKd95Dku9fyNGfn(#zST260C;>({Ib?eS|Q!*CU7DU z;p~hJ&u+KC*3lqr)oXe!vOxOf18LNzdB*bxZIZfN8U1HUbc+-HMOcxss%|F?U!e(k zt*{ex!<7?9m%>uu+pbf at 2v)A+FnBu~^q-woW1IF?P**lWLsfJ-=TP@!1uHMLN~&yRoOqqDp7JTfp4kbJ2BD7fg~ z`RKnTajk!);D5D}?F?}$T1sipfc{tjx5lwY8C1Fn6|qK#9*RLtGjzP3a7uie3D`#` zt8$k7=kh2Lv9ka&eI$CwDssSf)nCC+8WknihbQ`$wH;p&`ZY~ z9$J5poILwh>pTCn0ehHQ=)t?VAf;$5`74`#^On1AuYCmR*$o?`DEgQ`ZP3E6_FlTB zS(!oYtgxK~uBiLUIFrCp_)S at jI=l5;4NLyC$X=$Utf{IEuiOkecT8<`1y@|>4DlSv zeDPM)s&@uS$2kwi3u6)EnWq|lzYYsNhK$EXei3jHZX?}G8|yVICp~w7v at 18-D7u(j zxVb)nhN{?N@~n&{rw8bn7I2P?+n=-ifIFuedu$&ijP)<0rD-) zsO{lr9A?VBvR`BkbCsyb$MdqVo;$a_${a;14>df7DHOa9Al*a?2nT~xcL+5K56|Hw z1C*DQxP}2it at dPZT6rO)BCE=%^MGFPlkoFlml=)0Kdc+*a)M#tu|YB}xtJJG6~keC8odCmN-%(1R2&(_4wBLQ+&YZZ zxRG=6s2o9XJr-_#4T7vAP^Y4+~a@{FYN3f$D1NUJG8HQthqiKkdc0^w at 2@Ux> zniZ*%8ptfE~^PaB1Yl-F2 z0O|cyErS}ervf1Y6HRht1P+2;A)5Pkk at BgXx*|E{zNY8>tub`+UYs`;`8(8|A{hi{OELA~HAk{?WnS4mnIwL^td`(&3T6)8tH~m{t|9yd at E12%c!VeG-bnySkXfI{w=aHTs&FUmL&fE7c)ld25kQ57 at V=ym~h5x2t|+PFsQ=qF at C$=y$(N!!>T zaQPBcnrkI_77-noxw}_Nk+|U*P_acSr7aiK0;l#GGP~E8$(7^oV{RNIA0LOW*KbCp zI~7-0_=v+|a+Z+K0elargmlv at svP%2y{tN889DGOVQ8N?-o4RgYy2p0qAhr6imr*G zBSILo53>@;b0ah&cT#f9wtRh{R!;1id~{S{u}kDG=4oHk!_0b6F*lIeIjryGHnBT& zBj;P3rq{{4F)6EkA*lg|S6SWQ`g0s&TmS|pp;i-H?Q|eo+-u<&>l8~!x+wFMUKW$f z_&xkun?!r{&-Nq2_9GCEO`8YwmYuefhB;h=L-;t128`bnHbHCD-63|R;}-%LuP*9u znEw+gWUp(>%m3QH`hSj;|0lge?_X|3K9RQV*1G#rsK`idz)~o>@k3!~C~G1TECZ`w zzCESc*p+M(q1=bm2&Nnv8UG8|htd$wc9tSpMXu>{9*@hP4v(3skM6fGuzvO`@*{wD zc!ZCDYYKvJ^XHUEE at A+p*9$UPn$eStr zC5wynKRx)NZ_+#XdnMM}hqxMzh8f*&}r8 z9SxaYYj;Qqk>k!ci_vqXJUyw(OTu z;Yn<*{=BxI=IrwIxwP#DJo$rS4d(=V$3h?vnuX~f3U`tmR)G>yggWbulmvrNgz_jw zklBy5Qy*f81md=~^o-eshd-2cmX5%-mW_ at l8bbZD#tpZ|r2BQq9^xQ=Wd=2k3)!aJ znKk>D7YN|^rB$}0=F%gt=xjyY(43P|#1Qh0%%E<|g(Q`Y_nlUSDS9HADPVTNJ-e1= zH5dO>6C#{X1&16vtYh)3d1$UQm8a{VaYAOqoUf$1X#n&OVB9t?te9qmz zPxBu9bxWN&XF^lAX090X+mm;Gr z{p4vJJ$=2>pK^F$vszHh7(tbA$eV+R?@d%La}(DB6*KZ6c5{Ry3_S5e5kn{=jwNgS ztmz*rFws_3s9H-Nt$3!O5`~dmBuFQz5jf!5-6CUX^^^Jt-F6tw-$BRPZ?beD-7)W3 zNhVi<+)-3P$jX>3b%j3PmI`FLzwK(Z)kM_65=s4*g`l7K4^@WBR#3Ms at dVL!Sj z^cLE4y(PGt_Twxfr4EbR at mb^)g90u8^OShB5Sdax)q^6JR{Mnd(Z?1~!%#gehzSOF z3FvS#L)H=h{x)HYr}`V=jmp6L=z?wvDu+3mKKc+8x58#s!KhBfP=*8HbIM9|FtviQ zcSTT8>BNGuRK*?SlxOf`Frimhs+3mJ0#Q9Grlhm*l=ggjr+Osv36CWvUtUHKA2YB5 zRk%RqDw5PjM58sWLo8}DtkRbCsNZvvO)E#30mCY1NuZ&%FVJY||7I|ES)nE{2L%Cf zg7^W20$fTWFv&o<1Lc1zx_YJ5?QPZM+F2UxK%O!ZJR^-THQikU zojN|Mmj`<6y87fphteh2b-#1&MN95)^d{3R`&pa6S>yzPB(1tAYOdfDbswfV1CE&0?Kji||q*W=+O^4<3mn zvvem=(@7d4!8?LwiXWirFX2O{LNoAh@=6E`?-`T^=={u@{UqyKP>tYDuvX_oWSqN; z32^V#eSKvp#y`f8>IY2D4fI9ie!9-g+S@#4Ci4vzMS8nFk33yIv)tbw z?_Xen)t<(ND7)C4;n`eU!dwwB_BNV~jNyOa=?)Mg(qHbt1a6$IQY{2ZlX7?(=AZNZmHoXmj0VUTw at L3&%{in`Fza-q-^YLNaeN z at sWzl+;M5p5-01bKgdVnK*jE4+$L?(TX`KOmB_PN`O+armDDvm9d5vz=6%e9&V}A? zW_pFKSVhfh)%9)CFriZIvw1*AVO$>V{&r|xgth`xQ^wh^=vU!*_?;98W}cBcx3T(OJRi-P4z(q0=p|1qgo+Z;ESb5qvcc4AGb_tPp?ziTe^|%XA!=Mf_Zq%(> zTI9NDT%vAY`XiKG7kaIIW}$QAC}QG)KIb|U%C4NPr{ZKWh#X9E3=|YJVmpK9rc{)f zJmy>zC16$R)@|XK8?uq~4|f-!)426&P{XOLa09X|&Gh!b7?gCy#20k2C at z29k??Q{l!OLi#?)qy zC|W8hU0_PMTo5ejxJokWGd&~Ip1^&WvxtDV*<8;&dL|YW6dEk)&ad8;QvvW*On2o^D|o=8(K5rUyjC_8VYr5)IsW%<1DV z)I3?uz*)_RW;LwP4UetdsaM^p$4bgzdU{3nY>cvpuZd4#_{t<@t{a(~h*E5~WxOV; z=M^!HPQCJBRT7_hV{+rC4lCwOAIeM+?z!-N924xs- at P7u;2!DkS<;cJXwG)a5=zQB zUp|b^J<8#&=I at 1m>Ezq?Qf3n-O+TBSj}qTJnA6e5{Qbjt$HDIvLmJUm`u5T|n*I{~ zH81fIvX!ZSbD7uHTe#km=k^Ew>7=4RC;41(?wNuzoMDzcpD&0V{80GWV451|~ZeoWc za@?4V>EMINB%i at Egsqg^PV1y^gWq=Y$!Pubv%>6DSV9!{XXuVgzRS$t92akfzVDA0 z=z`c)9A!pkMI(6;A)#R)9C3nbimE0}E4K1}CH_&H8ZSlHcy2Eg)`Q~DrTzgbm4%r2wyv*8}lf_3*ES4qYnRu5iJ(lWr`xC at iG@Gyrc6vy6w|m z<^_Jo87i~h$L at x;!(q}7oTkwjk})IM>S$6`%Rc9#`#Hg0I4OxN^PnfsMgB4m_pLcg z{4+LSPhFrHA3KL|58Wk_d+S&-ouFn*?bk5gI}lo-KYQlZ9=QVRZb4 z0}y}KE#*mqoHRcMIY%Ux>eHG+&LXc42loq-EqsBfxrL9K4avZLkX3?P;6E8(DUE}} z07%-{!)XO~N3gmZC*}OHqU2gW at F2tH*CT=Z8QNhaDN0q_)h_Y1mEmA at q(iX_vkqNj zzMHtFz0|L?6sS)16?~7bl79RF>%1W;5A>^%a0bdZOUg%?5)cV!asaplS=Ndq71N~} zCo|L+N*F(=s1Dqv-~UamM2b{{yZr~M_wfG_DgE!h<`#7u6;ul}e|^bDnZ~6eL0J6@ z2=ri_7Hv93y3ztDQSjI{`AzZ~Q at 1AE_!z*Y!NhrJ|6pQn&uv(DtU zMKr!3L|cgi%~t)lixO^)nooisrRw*pW${CHS=u$zl5V^K2LeT{tL;J~1w6g at X0zFX zF_!j1JbY!QZnDiPv7*6+A2$mjv3g$2OhZt7gQx^%N0n?fc2L$y+5qZ>6Pwn zsDk1KKD`7)aF&%txz)AXYUhG!79JB<)m%2X^`{EbQD5oUrw~i}tZ7Y6t=!ctAk99r zM at 5Prh`ZAEf`M5=3Rqz9L?%@Gm1Pe!+=)){*@`iIhLdisMMiv1BB at o13yCD#ZLGJW z7FIr8!)qVV=wq3%p#4DI7nuojZdKcMb#}i$;GkK{@mF`T?lBNtaOpXZ<-6{7`I4G6 zWvkk1A at y2ZS=1JuJy(qYTC2<1i2AizX}1FDsOdeJGomXYjOg+>;C|^!GiI=|rb=5@ zxD at yiUqTaVX&@Kf+~wq|CA%Xt|6w02R_D)NdULf;pt%X6w=FZIU!h)$rAPTi<%x(% zuB&YMVq4BnR~?bn3LUuJ&9Dy!k$zVgjK3yzVz!bInt&vHw<{ueToX!aytC~wdzeI57iM~Wl* zvE at m;&U$mdVAF2kEi_l%NwcQG&V%+!Knj-xsjvqMZJoY$jd6uP_nftR-Kkl9(VfC>4F6Uy&eOoWIg+ zjO!OcF9yj^q%uF=-rcadD&dK1D_GPW+f%I08&3tFrcG8?l(LC7sy4e}$Pk*WlP=A` zO&9&rkM88_55(Kj at jCs1*vbx$zvog>U(l2_{c*GBALO_ja367bBKE_$x)Ai&Pvp)p zWrRB6-}Qysz417&kQ+zYYoxn_Mz5_vABpSLwRe%(p_M%PCU^oM6O8b^lfxBOw%!|#!$`{B$^5!r3>vazrac&0~s zrbm3H$Im|ImOlb4E%k6^XDX+U3i%u`gTIQk>5IFk6Jh)T zbc>XJWj&eBf$HYOgZw(DfGXplMeI?lo@#X>TID6vXb-u%ccV9{obw-)E0RXMH?-5= zGL_bg&|&qi<9rIgdozIZ^6T#jkW(V9eWhM$KVWIn?3-|DK*THC;G1 z^{?a?xc{in`Jc0QacVX$sAg#XJEqBg*|yZp&83pm=`eQEm14s?RB74;51<>$Xb!d< zHeIaS at Z)8Q-TQiXm=Bn at r3N`pf!r5?+`w4w5Cj9)rMnnz{m}rTyr%3jDb!qdiuXLf z*=w&Ev-ej4LSMK7{6FG~2@<4h!J|c3Ku!Vqs*FgIP?e8+P8kJJM;wLwOO+4Ltm}NE z^L45j!30B;@Mz9aW;I^SVQ*P6Cioaai*;>_Z8+KyQc1(KPh0<~3dt%?N~D_x+sSKm zD0VglD5_8SEwl=(R$CWV79Ojzk;ifHZB+!G at VtyU6^uR$26T at NY1pwJn{v|$nRS8e zmYe2P0)^#^6joUg at D{Ch6Ha9)=D1N!@p2L*MmYAHk$JKlzkJ+bm(a{J6nGt$X zw&Ezoy^-EhgV)X at l}E;QVWtN1+TJmy-woZEVZ!Uo7ZhSMp;N=xu2mPp!-J}kgIY at h zmlFqa!v8v|>CQ1G#NgyfbcNeLShgpWV%`=-r?cV-c15SN=?>yOwyM&zJscGD->|u> z0BJqdhHY^4PfZ;dvrITE4&>k+_U+*RIF3xBImS&&XDc=4fgVGASQV7ZdPJt1nW(r_ zxclk2Us$o&WS^Mvr_WoBxu-+vdw&*B8bBdBWrQyts=kol z|7`Bw6E3(Dn9GsOL}Rsg!i7pUm(3oTsyK`{_xvhN-B#Cb2`2N>(be*msphLKmzai4 z(QN1`7G+E0k$9o{Yre at FpsJv-xJf;kOVFN3mWxgJmp_F~F64E+$$g7}kKlWEj~8Qt z{mnrQ at r$;Y&<+y3_4krQc>xPr7vvoQw2*DNMFzw1`0_w+61XVI& zEz_ at BH})I+d-!>;l4A;C*fX1spt-R;@=yqIF11UPC6LY(?yz5_{cb7r1$FWrVUJpF zWPuPB6X;X}!+S9E)1v72kg8s&Ss&nP_bRMovy4OzUPOci%{bf*2_+y^XTC`9<848L z0-{NS1&wH$7X>`~zt_dpdo3uv-k$WheDaC>x}`ZtwYOp!Ry3QzI*Rnlx`nuLP3ScW z=?iwMv+ at gc`x$moRv;1$eoK!~IfzWuEB@*mLGT)#obsJe%B=+#n{Ke5GSL&^-mPM> zI6f>=__fVg$3TsuhL7Knc3IIL^tcKzauPka(-Ka-&1w&g3*KmnDz)x}SsuL*)=+Y( ze4g0Ozrf at hQ8L!onj3bg2-!tB`J+hOCn5V4_<1jZ=)-Vs(ySND5~_VM0&LcUp|Rvc zDBLw!36@~oGrAdLx-96$8#g(*%yRB5?pVelJ6~fKX~>mNy@^8)Z;2rtazITm-?l_v zT)|UGs2JH2S*opbw9(_-ET8_7)9L)|UKhZ+^sIOp9o-NkKzeUMGs2)6YoJ6M0OWt= z={zRnB>NtMe#IO)+SNCTN0}1QJY{2(ovmF*VVmnRDAI;AiS*YkiqegW{pWO}43F(3 ztVqrK<U2$LX%es+qx>mnz{s&!D!i;tqoNq2aUAB+bR{e>txIn=0#W-)VY`4+2tX z1p-3$|4R%1HyiZmLi?&NFAJQSd$BMifTOgA;)6mbhmIL5q6{Dfi%SYZ8L1dCdr5`M znh#Eeie2`qSGTs*9&B_LVxV(C9Yoi*uC%r{x3s!9v{Y}~JS+6N{PFpF(!=4<8hHQC z^ry#XmhUuRhVOL8UbeeFBv`+DLJ4nA0uqgwzLZ7;_VZy4v3mzDzex5CULPHpzwia< z`UCa^%y_ZChXcOo4+C!dAYKGM1it?M4jrus4H{AmSBsURi&$&a#hx+uLYYi2%hni^%ciZNVFzoEt47Hs8}T at B>4igO6E`^P^Q(jlu}{L&R3~bY zXHWm(wWq1xLsv7^QKxUfk>@TCTy9K$nbmbBU{^5zyACSv*f at 2uCY+f&DDQ^4O at d8e z`uNc>ActPwv1Xh}Z&WT*qhu^Yz7o1;jUW!}TCGw7FD1uP14eK<@l*vXnQ$0$4 at 0I09KH^#vVw}CIk^uEnM z*KidwpTR&&7p*B26rSYUHJeDTK~9l3<^T_l0k}8SMlnHS`Xy1#No^rx)JWv$l~#^c zdK=v)+exiz?TxHe$tyZ=4&*%a`=4AZ>$HA_UmJOf6_f=l3w8linw#fw6)iYI9YWd) z_=|gpZ^bdl&NLPtL`UplovJ7eNmZMW?>x(nJQ_a=Jmj18ebSLhe|7^9kNLGtAJ;p9dKK z7Du~<^s&}(vnREG#78iT$!%wAuCH+TQ(+*hJ9$vF`d-{K-33{Zy3w){z#oOJvwjdO zrbO>5$>(a0k(kq-#n|Dy^P_&2a9fU at Oxsvr-^#k5m=id0ehNv~IG;qYa)2id~Xf zb&F1}u)u*))~Plwpo#9{C3Zp^7QbbiQ5Kfm#432WxS6k}3PGs~6LnrX$pK>p?Sk+& zyrazwMA#y^CM5PprWd5gr`dahbNLePEC+A*GJ#1!n at d$L2zfFL@;Z<`#JPd;{;k}NI|8?gjo$5lvl1l6TSRoAUnMP>QPK1HY>AP zHatkjq~s@(_SH?=o*#7+z!PH}TVklcRr$JXicg?M91_e`B|A7oWXhTpu-$q%6gr&8a75y!|8m)Ha|j`nGDT=Y?FN;T`Dv*e6A`u zk%ZU);!I=Tiwu+&S~8%I_GC~%mD!iOdZQlq?=WJXm!iudtmk~!73@;WztCG%Q-WE- zvvJ?G4+*I(N!pSh&$qH+4rYno%f17)Mrwq{_OTHBYG!gf*uqgEQ6HrG$lFD-pXi%< zlGBGQz9g at e*)GT_NZ+QnkiBU+N}=me*%$mW!mc^U?@|xx`SlTT@8=Eqsm&G)64*LSa5G` zhzpL}r8mNB#`YS>Vw~Y}mFNriJDf-s9)3 at BHYAR#=jThQNc)ZhWpctiW z1mw7`Qh zo4Lm2)y1_*GybI3G$+L9GS6{QM~dH|J+z&%=()N44P(oHZ2sO z&^MT0;fYIvCO`3- at 4lHfr_)cU>#h{cyH>+-W>&%V)|K!erNvE_y^i(Bq6t-()aP^KE^8Bk+WW-x)Tf zy)&*GKxFN|%Fi+Ve&qaq>2<32^c3GAoNys)UeqDVuaL+vqwX!M9y^dbqsOsY>8Kx$ z`qDuew~Bl%~@_FD(lggDhCTO at K>xrHQk<`|c3ZB7}U4Xud;fQip)V`;B(-=P4v zO9mU%{XzFf5q+1^Vu#37o;MJB4S?5bFQ45MeL~)_uD{7Q*1F2WKThB>HZ1$*TLjrE z;>3IlHQhhb-N*_yVij`uq%gFkW%{n3OZWoLL!3<>CGw1Bz1_5hMeCznx?Patm(d!M` zMHdH15O^txY}4Tjaj?m`^1UB4Y8v(CH*Ty{#5=IQ7cZLb^1TS`Rj}Z}nctfiW3U^u zY<|elSJCQ^T!aaF z*_|SZNw|=5x(Mcfz7);}(ugdP$ETj7ww>KVeou*UUaFv}zl-pwCi9u5=CejwBEAv} zNkc2tb1Y0MblV&cL;rl!et~w1h~Gn(W-YM`u#U4J51E>i$!&$VFb(2Uxemn|$jE&{L;lyFZo%1$jK-E9HPx1t~Qwj{VZ zQ^8mdMn$V_$Qx~C@&jgbmm zHKyGVI$oTUdirW1>t!5PiYs5QAN?x@)S&?uJttNL%@ck{bxo{B#2AzI3MDB5)saM4 z59fzeZ;jGg=@s*@L+2>HLICZ$8jSp?7utmra8zICJ_{SAOM3v~3Ma}>+i10MT6g;r z?FrkxXUJZ0E$*rbg zld??u5zThg4aG;$2+_J&BN8!^IEt at iPw%Q4W^>3Lhp(_7Opr~X zu^i1k5Whr%U9 at A?3WcWxP`+*?&7eYSiVdTF4lOQ5ksWrRw=>0>(jb at V>bl{PcAmR@ zhdbq}m;0h+%FPtND^zB4^g><|LXF>Nm9oatOd~^0{F=!W%7q=fS$p?zjs^Ap z{;Bkhz^1&366-u`X}1M1d#rk#wrQ==?k)BEtkRS&kP{rJ*Z^vEaA`>#PPk2PSOleH zr%)PrC><;vuOha at -ac0K_KrBt8VZ!cc0W?=a5EK_3RmXeW6WoNlKScd1YYDqIx9?zt_GX-{Zz^;Qdbdql)s&1FKI z%VC$AzM&%0WUe<>eYBS^F?~XPWNt zdFzr1B&Sy~;^Lb!&%~w~k-zk!p6o`jno!DSPpgyR2&A6I*?nata(R^N7KS?Xq$eud zf;XggOpRd2;08D4s-l<5bF6RtvrNj$Py-V%33 at ex*X)WFn z%ANuIv^;t1kD^wm9vGk@^dun1?53Gbx(%@$rYhHqjQX~(9jAWOsvb>n?HFQy-=Bw` zWsb}Ec#!dHCREF^|2lneHY~;=9XN3DhK3Bs_>uXz4*&SE1!-tr|0!r7cL+3daz3UI8hnAMV;bpI}S3YrZ zYzYWlqWq>2TBs46s1YdKAnTe{l1|;^F^)jFiNnfq2bVju)(^^ArXPJPL;dixKv-A5 zd1dDz#ba{sFC1UK`3x9rm(cADj>}qoj9Psu at DfMCFn2+pCXfes?=On(s;0a`Fd9xc zF>uSHA6RCi56wHbI!m`~FYZMY!%KjnoeT7yWe?HnKNQx=Q*79Ft4BZC<>DzU?>h^} zaf2VTmv*8av3M?bbu{}RcAFafVS60_Uq8C#G@>G=5yg&qZb|jR&^vRAfQ;_N7EmKS zAcu&;m3kWy6joxlCZ4M#ap at mJiBBrTdlpgbIFsnqO${SC%{`wkA&))}AFwZG#^rJa z^4XS`tf~*{e^jas2I?QxWzHwKPJJAqDAwmyv*(V04ts4FtldW*kXgH^yNG*;+`I3Q z3cvIyz4SxJeGE%ZAu_hK_1M5wHmsj~&bZy6%7%yIN);h>rF#~@VSa at e+lJ3qz#9-4 zm&_I1NjPIc4nKS=+*<5Od{GVSU?t1N3YQ)Cok?q3xA?Q at T~z*!PUGMuGdbxZ3+7*UN7uTDIg z68BW;oYOlIg~-(=Kg`*;(Nt3>BKm=mj#5^?`s$4Vl9j*csniez9|@>_P1B~zz#<6A zA=K=`9y(u?EcogxSHTVBXx>rL)G^KDclpLP{}fL>Aqdt+5XKd|)HTs%BO|Y84ScdxWT&rastwh!DoSy-_kL6PL{4aMg|{4TvSWlf}bqt z at rU*MPXT=sElml6P_{clCEyZOgP`@8WY6M_ikR_HC&;8koQDMeIm$>P!i6QIg*^Ds z+vk#i$V8~V!QY(Hu;g at Q)l<6{=lf1PMq~*QjX*{Z6YMY`uXC#x+e2T9ukDUdh6Cd8 zWSASKWo at WE(T!r8S|$J%)q`tL{o|L$8Vv?|FhMF7-}d=~FsYEjnTy+liKptGCLfKj zw`%un#PFlqN5n_K4`p>nXWF28n?r#ZXBn4jgaKj518Rkjiw0+DowPm*@?pV>EO5;P;M>qhlX`Ph}WL7I>c&&b$jY`5RWE3 at 8HRRi7h|xI7a{98iaU& z%ATEj6*7CevY at 5WBJ}Bn(c;f*?={;{dp_H&J!4Ya9ZCy68r^+AK3nlcz$m34Wa%wV z$EebRDNMKQjZ;czt9aPzS{gQH)3#qX5VmqH9pH-fNCz z^|+GpLy3FsSSWaeBElZrD4mPH4J(n^%~}DOfvBiJ^9HDF@*_hTD%-SMfR;0od|Mbi z51-W<9^2qa1v0xt9DpkeiTyARfb9 at E?MZ4Y9S6t+|Mj(?H>)B}mWO}H?PfgZKV*G0E%%Bumlf7l+) zx!ih5Q(hnbKtB00*tdp)PL_zV0x(jLWv8fy63tblE20`hc}~ER9xmPV>{#;Gb&DlG;jE6$nG;Iss4X)_D*4%220v**|w|8wr$(CyKHwCzp`!Hwr$(C&Hj7M{%5XP zGqd;F*BriYo at U(fWMpJK(p2Hc32wT9T!kkRAZK`b3LIg&ez2~5 at Lu5*Sp*79rxv)6 zB`96R7sT^r1h_7L^6O+yRb|dAAMyMev?~z%V5%3u+O at _)mY18$aS*K*i>aRUlf!1Wl`w*tm+mNs5%$+&F5e zTUM?Ua4S|ASt^2A4Vm9FF^b_Q!z^{dP;KlPr{h`^Ax2B$h()>;SKS|gF?Tawxfdd> z)s4#z)sSmV{55unU0TpynD-th)aGzSoW4iJ`CodgfC`ryE|%_fzKj~^WxSv!H&p?) z8aGF_Y}+tB{rchCrKZ6y{FSrK4VPw8XN>fVj4#Vkkro8PFLqooE26x$U8;1UR(#wl_S4Opm-LtyZ4H{Ga&JmOeW0ZG z8gGU~JOF{O>$Z-XFVbhTtLe5&?7eyKXlEKDxjlyLbOn>EEs4M*u_61uoA$&H_zMHPJ=}L9=&!m5o6gYv3v|9-um*-oy$R; zo3$2P*)R;T2Y34zNbHk(q8eI?_$OVZ_u6>TrqKx-NS%zSdPHCXTz~-h2U3z at ZBKwLbw_xK(ESgEGFbYdcM7p3!($e zXi$LEu%0Vxf!Y_7XAQ(Fw5Gx_kvX?fP52c0=|LJh)K<@=ID6KON#Q3b9ZphGy*z1o zV>F;VOHK>pO{P9$8+0PbHiWmmp~TS5K`%9nc~6_dP~ajFP#yM+GhY~3)n{O z>}16klya|d`ZXr!3kjDXh*i}LrnNojFA;58`H`>0&YY4pelqV6twr`YxtoJ_(A&93 zkMG&UGiM4cPUN=PCET6J#t)ws(7h+O5Ar~kQr$Id76vFl_9%WWP`xhz at Lh7yUQDQ7 z%sUxwAT@)P$O?pq8;`t16XkP{>auY6R1x69w1B at SX?Q0fZ<<}vdo4!H0?ud~TcU at KM z&n8W;d_XBz6JempQe6?kD`FL1DX=hlc9f1|i~~hjS;`%4W)zT($ zY{52D4exmU%sQ7h4vns_x!WwRARIV>p}7)Tt&mD*EJ9fxglM=Pgv9XO($j at gU@xKI z*u6e6feM~VSMcOZCxY3jGgG1^xBS*KDA5TvcR169^|Oeu&F0mRa5ObSA0|k zAEuEWTNO$fcaC*^)Q*p*OlayuLJCGMS-oh9`Oc+cAm&Y^FuW!Sy9r{jYV0PSIM~Mz z9Bl7gA$M66dY5ASkE)^`@eX$j0+xPFj6X4TJAL7ycS=+|;O=?7+El~xE39OkzJs^_ zimNurznF4~ntj5+De*pS4-vMFt!|lDE4r|4W40-}xKjO1pm&pdk>%1wvjdOs^2I!t zC8q%+)tXWLGV98ucT;rX>r(Us`KI(`{z<4Aj37X{)KCA_z8hDf7F|wKYR zXBT_hfB*jXck(*_7#VhGWHqO;nfx!To*G29a at ZtN=h at qAyBBj;4J%!*N{_X z at v2?B;VOMhEq&Qmrpl6DgX2?tfVDNj>~xFqXY%nIf<>!OrZ2rpXNj#<`3-h)dW&4b zMYfSn+mw at ATsNEuy*u0#t at 8-k+f+X~gj-ggfW1z2iI%<=i|=;S>41aNRts;zH0*Nn z9u9f}gI4mDRe#w;uG?|g?2#4R8z7EOl=-#&7^@{$2|1piW(Rm13seW{RzgMoo&CDQMu7|+)sSAF*?Zc zrdkLX{?K=&;eu?ZFt-UJP`Q@&`cQ7lmFtYb#cz3lwW1?qGtG?x&6W0+t(5@|5avdW zh|}TX^aq%tr7a%*oc4SkK*~DuI8;(rvUxASqoisn>E3#L$455MP_`Dm5o)xLq(&d! zX1~G2+pXRvVGKBDYxz{R%#y->0JNN;muD=rcQ+5 zj^<{K>ood^o=$C~$V_q9)Fefw$r`)(z zy05%RB{}?+P6W_eO#u(C{QU zW$a;oa9cAA3PUoD2CX%78y{mmJX^#kAR+|xCq>_s%kDuY0{P~r?@CD_A zGBV;~76=O-z}g}C3H%vm8RX+(Kdf(I+FC<3NceX|(It at xx#VKHYk~G;sfteAW_w1g zLG}s9TMplN&i!u6`UMn~e%q8u=a10|ZR(Ruq9(E`<-u#OiJ^iod?e`EeLr#u69GXno|DiP*i4ww2boRYP2cKK&kWvQ<@ z;fkU0*-8=6#&8VD?5{=(%f^zKfTPq)rDAa*gq!iKM)xBWDCwkmuok2b5veK-;r4*4 z874zg^VXp$&??yc7IySDuUvwy(_7&4{dndpxoKOd%K82})&ZI^p$Qk-3^fL>ksN(8 z1d8Z_+A9t!qO{vnn>#Ep?ZzKshRN58tEHy3&Tk_z((8u^Y%D5`w&FA9)KQ%J*>0SU zo>g+z^b_YS-uU4Wpi^;%)4~kLhpRoLh_|v2w-S9nQw)Qch);IKot{l^*_^ONYkqu| zV>El5Tzo2Kx0Y_TImN(Sy8-9RwNQ&cYQ!xiQo2U6fz at +zSZ2b(=$$)V*3`LhsV$MbSE7wg{+iK+Z at OEM`fRRQ74ly8aeQ0Yp>Blt`|ypnAx4c!^9Ab! zRk$OA<975Gyi>vAbe6`&WAP7xO7FOA^;sVMWFyrQc?-Ee9f$U!N(+UJi*14Ha4s0l z1M#2v8(BkYk_cwK04%`XQ?eh$Y%67L(*O}hHN?7&=WT3qga^~m?N7lYwwib{8|FyZ z8?LF$i$`*c^Koyy;&raWD0P?;#IzKLls#1%^#$I6v1D0R6p2KcwWEvg%xbKpA0EZ6 zF}B~a$yc`!8O3M#=NYbv)-&e_5BTwSyFeDYOx z)8tX{1<~b?xH4DWoj!MK{8y9Tl7%z6S3awPQ34)Df1R4fB%`_Nuu#(w%Zbp5T at ZSg zAbdiN3iRsOzgM=~UVHRSe<8Xemu$Gj($~@Z(3VHiH=u4?VjW=hQFcXn9we|rcnz6J z%mhVAg~B?(SXeU4+Y>4g=KrEhdq<(=`ao|dAbAAu&xvCSYFK>sM%Y>CCxm*C;FT+A z?SVRR*zS-Gxur!3`mqg`LqFN*L3W{E*1p2%`BrIxj4_0-IGzx4dnWTM`gSFhkyres z#Fcw%`*4N;e$5 at ua)uw9s#o<{t0Zg75wJX^C49dK61gA5x$mQH4}mhGuJrG-2JoCBGR8e~^ShiuA(b z70lk>2^#SY9jDf}I8R`ofy95L*lsb;J~_y56%wcuTC z*3#^cGq#=t{(L`i__;eGiK7t)*8yV4&;Uq%?~EWGKa5BsLtaH$hZw{DE`-s|*~qLS z$Lr1UCf8Er4gSEVEVpGhV4k!sGw0J`nM$8-V6Ds$Z_d}`)p5ds*E^WP8&H(0zz)A+ z(Eczj5!5;>9_<8CgtklCERNpY at toIz^xP*Hhgw%1O#;-#u)sg-~u0bi)K8LFKK zzrIEK6aZ9sM;lqY>a#|(%2b^COfkyp)LAtQ#a at AmTG5yicGpHgjN!7DbR7z~km4~8 zN>Ld(=pQWwnUi{K&7o%uC!evZX%kLb1I%lfH>KTz>Z at 3tFpsI#%%LzQskOpvtRQwA z&(XIxHK2e7UX#m|Ut!4nkGmNy1r{jN>jF&H%(L#Bu1?V!=M7^c0DT$YdUdq&)HJ at G z6~)!gOViml^%(MNdA*?3ZITL%a0y#}`t0(8TfbQ}-oB_*&3ybB&W_La)%!J=yN5ZL?e=xBcZA{;X8&=G!hcr%&0knZ;ELD6 zzpxkY;w0;EFFc=rC33x4Qsu?!xw?bKf&gg#2N<7qPns7wyVU!vDuJL4 at a;YQmFJE{AJd*K{Oeh`@vFG#BEse}{RnYVI ziVVb*(i4=#d=uvC8qagz>7mfW^>kv&q>P} zZ2X}-1LRFY82aYZ-RB_-5(V!bE8748 at V4Z(JOhDAVU)Ep(x`F}O%&9GVK|*JfX=lR z#oj0awHa~r1dUAY_MmQG4CzJ5%Njd=%PoON(BtNbcv@^FESFafY at aPB7m3WaF(p+J zk||GRFvzC{I42#k?)>@Xj{V7KK5SQo_QxmTKLagz#&6~PFVHOE{-q=Fe+AmVIVk-% ztW~L7Y2d11{h|+&g%;5oSI(8ut_286=)MY#v&r4nK zG}8xG9y)>o_MBp&rexm=U00|&y+&RY z&{b=98fV*Wyk=3;OB$}Wv?us5GU-^s4NJdrP at +vE_rt)n9~8@^DO_?Qolg^#fV8+* z3hhm84w552>pS%JpT|G zBzcrRuRZ+?VH&hPx}C0J`!|)RNHM?RF&M6n!$Y2cNL!sQE(E&`RNp?Z#K+uze9k at 4 zG&px3Lr6Al;=)nX3I#jLZKk70S!so+i;>;;CRg9SQi6BT)EJQ(x(YwV;*S z3FF%H4;lft8$go(wnd2}NhzcJM`TpD_#ASHLb$$HQ}ce>shHQ$^FlQ^Xk$rp#dQdy z>>p&W_T4Lneda3s!I%Ztprk&gpLMvPJ#KS>*!?CfQxqFnV8DuH>Zb94u z8Bqg4V~=Q-9*^&uxh_m(uL;c1nYpQE$0YPS^0|X50p|JM)Y`T zwIVy!A_&Rx7_;=wSyM2<22vtZ?t~swQ5L_XK+v~6{2v5vy9&nmVvG4 zsX4HdEpcxwQRY$H4Ym at K&B2r1ax1o-BJce+ac*=09FC#S(7<0vbzz4 at +?KYorGZe+ zL=C==b)Yjxel at ysmIB*D_)gl++k~773+P1B#dW*xV}rEYu(zLRiQa(QQK@!Uh^6Y8 zpGCX;AD2I!?veD^Y6lY0Ywe*fTTYF4j3W64NIwV`E<@VsQ_BLfiDqw5Q>ErnzjodI z3D;$Tc22f_Xs=Ir!GbfdV2wj=!4@(qWH<~V%x!7bjnt?x&20AnF^^{b#Lyg!Z`l@! zU&b1H++~R*dHyfuxdI2_b?v_(U55RawiN#XQZ+kUds8cODVx;-midu9MY8h-9@*~WnBE&0MA}OAQ zGad8y0`9G(;JPUI#e=%(pA0+KTE5o9PdrX>zDT_pO6j6$(Okv1KxR-o%Gnn7dI!Pm^`lbQbjdzdxg!D~c+r zjf$n>&`-5kq?3=;Y1$)iz=dHiX>#eclJ(O#*hc2?{fCZQbqB7(pNX%*kCsy!;NLwr zSf2u{SJmx&Nq8>4!1B{YfN|5c%vSfBzYpCi_-4ayK~CJ*SoE95-R3;(EOmi at TmUqg4*vWg- zFo&pH1C6SDZA3_!EfL)IqqUC`OZUn8S|>>Ud7XN*lkiphLa*aLZj^yQ+Nvu;E$TlL z(`R4w at yt&N+|wON#I_b?(q$wA!^TV$s20k3k_ at Xj*#IFl?IKp-1kE at dC62j+3yHFe zcyd$JMH($`qYON2Ve|euk9 at zBM~J}^g}0OpKZ6cI&R9x#BcX2I2i%zE>Y6w3WlP|7 z?faT_r)u%+bHV8wE9_JRS3y>IG`2V4&rYy$CPZ~M=Ak2X8fh4sq~~g-Ee^u#%{6Gi zedi3RUzXmur<7PtVb%K@@x>RmY&%N#B?{GKe-!V-RF{W}s5lZ}n%dl@$0;c)1y%2h zOwK{9lWE-Hk)a>7lE!}ZG_b6AI7PeEmW~pS4B1vNI>bb at RT<-0anH94fPvX%*4?;3 zwWLw`^K6lqXvDva=K at RLVy|w1F(C1PGV)nhDbC_^KUjq7poS&0?7yZtp5_?+ITQV8 zJL8lu$O0+-9^D&7N&=knA%dML at a8*vrIJFMxR3!BZx|5a7!QE7!+sS;%nC%mj2&=G zO&p@;HVLGyhe*m_iAZ;g?{X-EI|No6IR%l%{?IbR{z?@MUoIn`lB>bmhXH23#nW2F zkp4zETft}*1l2vo(j5({xH1H|uoCfCig2P-X+X25Ds&A<#-nzMN$$e;XM8|)3p2VV zDjK<$K at v&b#Urfre-#q_T!qyCC{DNGxM;5PqOp$?1>M7}KjE;;TqxNVPQK+Jrct^1 z5up)VvYlJf6e{#6C8Cdv+N9V6mCWBi0=5&PznND;!IsE!oubm>e-cG{qAuj;>YTC`1h<;5c1g>8K*SGk=*)A&b5t}ATGd!TvZY1>D7 zp7#2!&`TEQIhq`CR-)@H}Ha`^*k$hQVjLN|071!3~8?{whA_tk;f)z4qu zE)3$(0iP>!Mmu(Z{~nb1sx!t%bR86~8InJ$QK*Lmv39pA;&pRDe?TNM{*hpe{($?VrlUx6Hz=fuk3YrGmw-><3 z&;}TNuCz73H*z{Oj3$&=CIAG-Kg<%v7J#9XaaPv>Ii!lxaPvXXz;Gj_7Ku|4-&sWc zo3uu%{601$HFIHM!DR-dN^LLiW7~P=e(NUN*$%O1`+ZLW$o7>xK#h~oAAtm}0f#0I z-h?{Mza+_{IuKJoc=z`BD2CJfcfx9v;Ej zf5(+D+&!9QccbK;RTy<*3||;^66O9BRzH#&O9W?yFKjFuEG(8QcM1TgXs7F!Q=Xzu$U$^>iCw{ zc|Yq)Wrvul2v)%k)*cma(>T%=ld(-?XlZ$|uqz1VPhGgq=JW3*)vj=T)|POKETc=w zjkgQk&wUdB_X`2Tb~H5_Nn5duc?j43fiet1K_}T%h*%z~lB) zcUhv)F^Mz+vJovf84761)+pFhJnw5IrnsaL`lzuf(VfCDCMH*0g=)iXno6NFO_u-I zpXd2}d at G1h7|)m7TxFtjED at C8rRcODMY^oMP$j$3Av4w#j at dI}RL*F4(R{1JxJp`& zeYC)@S=g2EtZ~!ifLa%rXM%RhAh%DdI?qx at UMXolA#C8lVywN(ruK�flB9I9;4I zu(i&q8bqvIe$2sGQ&1|ykWZMm0?`UQ4vd-Sks-OYc9VKz9EvGkNkQ{Fq&@RkRx6nV zNsVfJ3B6ho1ba)vFO_93Oxl8XWmpjPL?rh?n{`_A37T4+oUTCDisH=qm=7v{tf6U8 zs|U5%1`G_DcHSa6RR5(m{~^tO_v0fKi#&P at RVp%yE4%Hpln1A`P74C%6VV0D>if&5 z_s{kg#bO?WE2?A)nNjYOAMFYY43h6b@!7QJDqIrb;?Ohhu})+1HKVo3ODaw|{atOt zR=tkun02teMxAu~_?;Lr)2mmo#s`DUy+f?3-ndlCbSy)ivq(jLUWbQ8$E;Gftiee{nqgE19+h~Kp?w5_!Yie2ywc at vwOxz-zyst z@`7YV8c#u=?DJIZ1!%!F$o2_WL)SA^ulxp0v~P6l=-3 zTWVEq^rluJdU6pC8AG%?L7sT*h(Ucz^+vbUyhTP+MR~wqsl7hTRcH`JVuC;qH=koGF?}CRTlh$gvdS}{qVzJVZ^ zh=bd~qiW5cMUtc)$c7Vf!%BVNhcSmD?hiCqa0&uT=b=i+_zDOKhaL*^s07_kx5Y3n zS(0`$X~o)6xjy4!Lui%S($Ih_(LRKHLkgwZ4qEUkXGJ8}-N^aS>Q)qo^DT#D=1d5H ziUF7fL*E%G=LeL$h8AbWiC at Ez{{v7|w9zD>V4g>_TO6cIK74u^D#pp8ui$_chLeh0 zhl8uCAbJ^kew at f7))Y~zZ5LALPbbtq=NYIFUI`vpe6ZoBxWnZ1xDymWH?jk{5GFl~ z#|{P+;ea_x9`zsq)wcSJpbLH&mS?F@#Y*Jil1j^5p at HrADQja4JD!U3;^9#K6OqC_ z+Vn2|$~LVdHQAYIYiOvkvNTm*nJFvZIKDJh*?n;vWqPjMmCq$cZcT#6JH|H#J@{qS zzWcf^_lgsK%FCiQY at 0@MJBXvMF8)uHCwA8E?_llUe}MlvcOn9A4o5(MfJ*-6Pm%vc z?i6yCGjjOnab`tH|K>(F^2Z&~B at qPNb3Qa*b`_#}z+ww%EGUR`7ra(!rEpkIx6NA%a53T;N8&)P!R0 zQ!Xa<+ at w@1$pQVfR4W4sgdBMeBnpAF2k9PDV112_jSM_WDo5 zDQ1_qj$+IiNsoTUc3X|i__y&zciQg5sC1>R{)xRU%N{1O|- zC;<9M at pOIbp0zdG1P6`RQiOpZs*rQB?K>=-PFS?$RdOONv*^8i7|SE3Y(~urHP7Z2 ziV8LaY;>NE*j7~mh>2*SA23`*R%zJG+_?BOq=yP0^gJ>*-Rykzb=3oC4pF9LH|d(& zml188jiksomK8Vq)af?sMDz8EZn(fNe;vDuR6QgzN6(?P6IV_%htt8W`K$Wox(12u z!z6pQ<}#sc!Z=Y{&xNu!2m>ZD<9B(D9E^t2pA*eST-jDBE3G{jiD;&AD!ImzLWJ+= za3<1yuCkP^{#Nnp^r=Cf;INvesr)LPw%$!YmmGcd*Gpl_4qJT;Z_BZu*5%gM at vnd& znz)1-&$L+vW3PT7h+JOk#$?ji42)%e#z3jUZZWn>%(GwvT=Kuv+YLjE0{FRLvNH68 zRMpTRbF-<%a;hn}2C(v43Ru0Ok@^>3O3V at Zlp8{zilULeC5st{ORtC}f_!v~>jdLz zs&}cM4o+xSejre*2>{h7GHj2PDM0y(1?~BwKDdIa*cpwN$WjZ0p-l?+s>Y-#0Sr#x zLC!=_-)up(Y>6s>J>##D_Dws2%LJcT>Y;L0-3RsY@;)q3-}FGamW8A76PCyvfk5_^ zbGg#r;o7t;O|%Q>S}lLDqDad9(7I7cEz^NyjF4f)A>9D_a)coI#rAZ;@Xv7qV_`Y! z4+;dN3-kZK$oT&fC;#5Va%Hz5jl_3RD0QBWvEJyTPpQ}|m6w-z6O at lciKg6*Lk!&0 z90n~Ot;dBB`bSbyvJ+ZBaKFFn#~sj1UUg~{enOC(&Z6eJR!&+L3ky%eVb7nQFCfO4 z at NoRr!hPoZfmubYK6F}gN3|iOaB8BJL1mN)*Sbxl31yU)cujN3CHM(ThZ)0E>YiN& z&+4l*_3A^-WTgk$k!cpVnsoRKZ`+hej6!j6F72{o%rhfNG}(UB7LXx zK}L0U+XK6fHuF~WZgXU2eYc;RO&x3zKYkB}Uj>>+JX$L4<;KMYf*i2{kR|5FQf|=Z|1_UR|i8O;?-< z(t{5A`YBNt)Zxt%GjQ$A&Y-Fpdg|kka4Fu=GEy(Cnh1{dQWJZg(4E*@0f{CJDpE64 z?exE=7|SfOA%-zpaNE4C8Ag+7UGzXE{%3 at Nd{MKMN7tVl|Rc0G` zZnbI=RYkd{fSW}AqBX)k%cRp at hHxgCP*6`i?)B3rF5=9-UhGKeQ7;{z-^guC z!Fxe>zbM{X^|CLkkl(1nmMKonoU`OT9;AXlXw4eLhc~OV#2V5>ac7e~V3fOIH at 7j* z2JV03gMV?#b-GP7{*vvr>Cn}D3%Sv2|*pzGP2yKsrV|c?zb?_#HQ+IdR~YRbS}&x^B{sk`hxo?#+XePck;C%Q88X&jj;I?9 z?NT`Wkdxdpr#MSUnW&BA1D%%V12M4&`9o9?E}=0xKFFA;nl+D#y%;J32EmZy8Tgz2 z$LdZ257L>N*x_#?`gY1fdK7v5ki1KaL4NT>Xkh9K{v-^nAk`0VBq5|$K2a>!->1)9 zaiKrv`>%RJSrU6pP95EzX;6AJRgDT7bE)+;l+R+NiY#y>yyB%pGX1YD6BpsGqW3tf zx}IKR;bfl$Qd63Cf;A<%2vc3XTdwN>*@+k5 at Bn2gkDIP^#2!&Ikgma3vq%vVd z7~GxVf1e(Barjvyw8hel5+j>ArhmIg)hmAR^$_m9$r@<5S~x<$Dq&c->z7n>Q?&WT zeFvoJwEJnEzVgz)-V;B+vlPT`$zA%tj-3Af1 at h1Ft@c_zG59yWtzrMAAM*bg-~YYw zqe at -R9#sO3&tycu!A2H_NO2ti1pEoi>3?grvd9T0EDJ*HxWuoz&KaoHzTM=ug8T_r zsGg+wG5dSAo0Lv6(c+it5>H3Q)cUq2fK}Pt{ASa8x{bx%{Bv)I;|6GQzb;bAhc3N7 zXoDHe#~H~{)pS!xt-liv+CA7)i1kHOC9alo4|pJTicW6nVzZuYK~pEw!qAkUDjjfD z3Q*B_LQv at aVLOzzS3sX0asHx9&TNR&}kedMzW_QQ1!2?ZuDWhQJTGpz~kQ`=YF3FS^ z3#!mqoX3qH;i8Mpp7ulEMx8zZ{}((x;uYRJmc3Jm5x0tWwOu*59$R{F($fi=;-pt` zbitWjt;2U*4_fg2iHr)^m;-5;Q4?Z{%Gm&^)0L{gE%eGjUrN{&T#+H&~mR{lY2155Lujzj`Cw39Iv` zp3wwbhw=k2hcc^PPr}f$uLLz6piN=%roQbk5H+zvFnt zl3l1|G at r1GM(zP3*c%p@>HW;0^negebIzWOvvec(b=w7}*J0_5XC>ONEll`r3{at# z{9R&ts!>=!3Am!KO>x!toc8=euUYWLCt;sHa4FQ6- zvk&tlp11mqv}sFtGXQUD&LGH{4>k=hc1E0pa8rPJ%bVY6h~YShvdz+vfpbn{EDUKg z>JNN0aVLCdaQ;Th=__c6RpBl_f5 at wpFChofAIN`Z#2;)RKXEW1AYl0aod)L$l?LchfnoH4PY&n3T(VCj13RsI^z!cx|s+!t^EH>NMrfk?{KU!Y5u<->> zT_8kD&Mp2>j(o6B)MwB#fv4?twY+To<%9iAM at G+|w<|=ThE;iEq?e&v{~*K!tloWW z(YnMz=5gbu_(AGrQlCUo0e%dGoKPb at I2mKjxLPWs2&3A*zo=+wU7D3OalRt})iIV# zk}WW*0CW|d%Mk>Aj36;s0?aY7>!sU_mz~rWD$jW(Cep2D3okm2PnO%d<`-?NikBa- zjn8P(cruN0E3ti=v^I{H0qs=@N4jg3NFCBRr)zA_Ydes#v0!B7AUI+rQHh!FL|~($M!~Rg+!o+i^eMWf=G^{M)!BMOVN at W; zDlNUaI6`ypgYGx^dBH$ZGgRDOys(OnZXa2EtC3E6X;gzWPh-#wmND$1;49132KdfF zxOR at iXD3>wO0&n*=Fvm at bnd4+bx6E2M$N^~U>?lype;D)CoK$HyRdaAuC&)`SSGaN z8AcRidf9g7#sK$*Ha`C zO;M3=T#rTVZW`L1YnL6EI&_2gZ1>I3ly1Q>*9I%KS6?~S^u`fpy1_B5VNh)QU0*;2 zA295RH8YwiDR1H(7r|JnxO_h*Gr<9}>p(#vN0fMjJ_lXKP36*=ZA44$ZDaq1F;Qtx z;vM^T923QCxAACBJ}mPl_t~1XBKCC1rqOt at jtrbnwLWwOSGxn~RIWZisp!hfO at C!V zPm&6 at TvVXEV97t4T6o+85mIQ1ES6FH3|2sr at PhIyW|ww)&L^9H2N_PN*b at uW(l<^W z(JFctZ$|z)@JqOYl721~ZFv+iRO}Zi81kOSo|>-PFQ~yX7jbA;+FJLa4cwA0=#V?= zs?tf_ZturIOL@~5{bjJto5mIrU}pW$lfaY?Dq5F)u9t at r{)PLnUJwqO62QQFFsU7+{)76 z%I!kUTnt5O97TgSr at w1s4s&crA-hdc^qHXzn2koBG1g9t+wr)k=IHSl at S^9E6(B=2 zw+89 at v0y#)?mCNkYuv{wigurOd8tMhq7`qc#KJhKc(|HESguB1x)l5lp<@*tz$IG` zpkwtSNc<#^6xixhJAY!}cGj`eg^Q=F$OX>bFb{UNqk+RH~gP7j8_M950M6 zSw)zs)z4Zia&9_GWoXk{=G0R#oa@*-Je?AMVIypZ}(@38>l za9UW^7 at R7K(}u6#sX;qt7!x_7(yMUXl$I`hkgf?uNK3HOyC!Rq7!oI?i*3@)vMelh znBcWtvQjQ5o2}M-erIeTp0`)2E&gOzGQ}Fr_{cPB&BgX<&|f=Pj&3hWFl{tU9)(Qe z&2!h_H2ht)ghlQi72a0kdxYn@$4q$v=&S0iUjCW6_`uis6KARVX>gKR^rdZjqFl~y z@(G=MK-8OdrhLkSefnC<&Vr;vWs)9sYUksY(2K|w5l!&(9jN|&+;3SIwG?1{WcmTs%w)j} zT^0q5np8-izslxVL3)dopx#4GLuRv$cQMf&1jr}eHA5$Vdt?}u%fWv*pc1PZEYz85 zB~6ET`2gJug835ZWJ+4CNp+(Ui+oZ;JbnG}4%O{ebHO;Gq8WF}zu;{?b zJbWQU&s=!mKXAMnhl5GVLJKFhm~?l1#5K*4k6NWz}%(4+IY*o?ZPiYta?)s#J%LkewEcFW?|10$M?myQ)4$^xiA;p}wO308kDp>&E=SCXGkOyni8C$sJs(Ay%sVJ}&gB_R zh;%miX981hGJ+hyiDEl9*l9VaH6KAP*3mf9cIG7hJK*sZYR-Ur_4~O_jIX&ghK{nD zD}Ij8fy+gEfRFRrk+T?=TMy5;MbMy(D5R>0?aGRbugYDjVz1AewBX{@tM+(V79-6! z8Wt`~>uW`Wt*zpxla32vWTm1 at gbQ&kA#(JslyvcYNGy;4?+0)S&ps(lr@#b<30QeY zG6d|nLdOjbwBB+Njrc3hvb0!d^wOh=YdHfEU{$wsFA<=Ri6DWY17SIWfkk3t;MN~L z5+g_N+ at ABSIEFP9isRnnU%My*`n0amQYnS*?VB(`lU=NFKF)akE;jetIVR=q?H`b) z_Ihz91t)Lx96sm6rP!|F-r%zPi>MS1 at OS-*S(@JlrefV<_`Hqq6L+%Svl!oH3mUoB zrTN7|L-hbS0_#@)PQb>f3WIs@{4JRG{2s!;xSF%6?0g3)^ zt9t(!a&7gW%HN4PDhq;WBY!s7;pu>lg>C^H`N;u=q2bb1%up^6sk z!hO=8uM4Gk$wE4)ugh9za&4VQYDM-QW*@L2q%(XnGM;ALCWne$07Te!tNw8sOj8ba zOI4oeA4O9u_)NHoZ_Ayy at 6Aw9&8O}CInEwPqdi0MM at y6CCu;ac^YzDVtX$Ex!VS9a z!X3jcAP4T8R?UVTZknc=Q*MCp at SiSGL`)}YU?K)%ZbJ`VwtBBL_p~C#hgzFj2fqTB z(8x_OuzGJBN!%l)!fk7}`lpxulcrZuLb zqgCk}M at M7l6zMBzo6KG9c7!&ZVQH*chK5s6j>A`o1{86hk%V9t=6HSws}vAqy0q%B z8C2TGgMvIHQ7 z`C>jT!Q~gMAR9y~X=C7MhE2xZ5u<$pzH1>3KcJ10QWo_=3~XFJ#PP-I_e^JKl%k){ zj72BS1)G_V-c)hALGpHnd+7o%$?T<)+cY~95bHN}XRRwDS5NtSXlL{ZzDFKA!1&du zIjf*KyFnXy+E6c(fz9Rg$+vj0+O@!0El|KKy4U^r>FY#6$65*5npET&#_=%HVeY~m(GfC|GNsdZ3)RjXS^8%U0{X5KcHWOG%qchs;*t=>K+bga6-DQ+(4pn*HXFEDd#xj1EZ z!x~`m<8CP{H-*>|) z&(*@U3^EoVD2^>*$5*&5m{@7PtG9I3 at UV5;$D0=a=a(Kk`d{>gw&7yhVHc`P;Uh99As~c_bs+d1uL{lD$o%Vy;oMQm at -UPdS+VB%=_g z`N(PD97>&OmjgSMj++F+EWf42CLL~MX%+639%nyxq}Oxpr$<+9{g!R4x6NnQ=^K1dpjeb|Gs0fcj at 8Dp>& zb_X`?9_^NXfiBYoCf1M6Wfl+EaxAC*Klza at EUo?-*q3|85I2Gecl08TXp8{okjd=G zmr^!k=FwQiA$)f1wn{9wrMc_d)(^>DS$ADKwlIyVl at AL7KM^FCuIKh~5?w1oMSFC> zqq@()^s}JG$A at z{g&wTe at g)&)v}yROQCvBnls&8qS*VHV1IZ&RfEF$Ngi+x_!m3H( z0c%S7n?SSs7Jaxow*(BsGBY1Lj4)32GstD%0*_*?(>@B76WoJl=i at B&TDEioFd8#Q z1B2fR)FSJ|9gj8hJFIR-L{bV0wZ}sdd*_EAH+~!x(9YEXX~8$t<~A{s5HZc>uRt)7 zCmvG!L)aI_Z-H=P8-z!zubN~X1-`)p4gx~;r#|!i7d7dR3jNO@ z>VHI0)&H$1e>6u21BB^FBbI3~)=7&nK$9~g@}yg>QKWL^`xWt||I}ohH=3LMOeVo2 z_=r>--$yB)90pLh^Psr&$(#+B=Ps9rvyYG4cPfAS9H|+AAEb)4=$QCSfE@%E3vrPi z1NK0iXoLyQPYm(A at N7QV3sZ6FLe?SksPQyoW6Ee80A;tiS9oQVH at va3m0f0gV#>w$ zUuM`NIEp%Syo$5CxZxJVz|p at vXBUiduJM<))U^5KN6hdu=s|oA`*|WOY+1s7p{5C9 z1zx%=k_k{_)wX)75ya`;9%@10PGciXJ1j_GHUq|9~*;fG$6iZKd&Q!Rr8mFM%rjFdrHJQy^boz=^ zr at rDPfXJ+q^?B)aXmXWY1(C;==A&&A>0afcypYJXR-=g#GzN1^>>7-PyHkvAGjSk zyd62d9S-EsQrq?k-7^+*Ml&5DDMVo%zXERP-V?5hmvd1Zdh#fOV_!$k3uxy+SlU8L z*@GEvS^yHj7zs*a=V-|=ZkD#vQQ}wGIN#h6LoY1zXAE23g*2J3&`g2^1*{Qi?11?> zZU<>J4)vFl(mP1?B7b?<kvzH)F*zXBJm470DcrA}j%&|! zIpHA&;xoLvhskdS!gOJPXgiiQXB~mfn8+^iAuC7lHxJWe)*n9ZVfn*q(wkoi3t86J zDzmGM^$D-`AzMPRgoaWcDsaOeqCCQ04zl#GJb()A#tgp$Z`+)S^_wP`^ByeJwV72+ zuq&_ob=TGE2a#~j$}c0GCihgxNdaTcc#T<>$m{|;aci(Xs5w&XQ|W5zM}0dwuDaoWH=((?^m}v?C-^l`F8I}2?V(`W zuVB~359URy at B=f at JZhC^tCj5Ncgn)8ICJ(O5mZeH0oPrN>3MTm!LAE+KxO#(K|!>o zd5K-4n07g}pGlrRHa?AJyohP1`Bj6FEUr_+nZLhu?aswE-xb6>%AFGwzY)o7Bfg{2 zzep8HO5W{&k{^?gCIG$B%^DH3WY$G#oA<{WN{kO$)r!Wp;y!S}Yi3>i{h2M972B%Z z_L&1t$!~wtbLC;#p{j|OhI5S={b=y(^OQ@{>eA1nzgN~xrLJN;P%r>@h(G6CTo`>u z&|#-E5(MSz1qom9NTcxyw($v!|L`GM at KP#$D^`AXpf1EaW4svrh8wcN8~mzH0-Z?d z3);Uh1J9c}i}LrW?>oBzbJHIbtN*DglK&eh{@1DRKjuCS`#&WH*{|A>ghHAInz}1b z+#Vb?^0HY|HUuX$kf_H`XL51Zu$7&kZa}W z(eQl#x{d_GQ#pd&<9qEH7aSE8MPhDYou*)lh?LmK!X%P<6(+LAMt at JXWhJfU9wi|5 z6TUsayXO3=E!Rr=X&qR?C_TdBFY?`L{TG8C;J0(ENu8=khF8BcF6Od~JufHBIH{3u zmBq8={L1|ThuP0|WjVsC6#FfX){;XAk={my?vX1JG|V&Cw^drP$}>A>z)pnC?Y(Bh z(1t>xrL(h9iG#LAKgS?1^U#1VPKxNzT-TbXQ16FBDmnd&51%u_MNLFov_-v at hT;pdc=e0&Dok4qt at j#7tl_l0rJ?LUyEFN%oS;!aD45Hd(KTvRY$xGm5d`6S?J03O%EasW*XqE2trK)wOq2 zJ}JPN-O2Vy(ueYPIyN|$0QQJ-5X58jJ$V!sg(tS#5r2nq#JQ96QgJU`$FXF!nh449 zad66oPQj6!9${%U@=q}-oyMAHH?hDSj8~Usrx8xzO`&Ibi6vGjbWLj15J#rqshlJX zv~dXyvo=C`7X?xe9i`_5g%Rx09!JcuL^;dHWt}zX2c=Cdvq<=ZwTRQzVJ#yfKl^}P zcq8e*q3iSex0CD+E7Z?=qxV!NqFc>Dj3XlR9Ui~z+6vJoEZOct4D2K8TkXTXaI;(P8#tjx2T$=>sYGZNJ_1H1-5H3 z6spWdkwGb+zn8TIm+|WJanD^;&;1ZYf{W%NOJJK7EWCq>YF0NFr(%1K@#qa3B!&m1D%;SF z{03rWMjd^g5?{=*!V2Irvn#?oDal7yo;ScM-JFm~>z8iVNt?#{go~aF0b{ehX5ibG zs9c-giN>7NUlQYWfzAP{&1|LlkU+CO-%;(?u at tkZrLU1dE=T&cq%-<8SzwYeMj#c&O_LMW-9!TB_BL!SF6yRdFN0h+A%N~n`Y8lD!zqp z-TXN)82sy#u<_TSy6aBm&##d+BMcfHegU&pv14o2 at k;Fc&H5$W-8}^`<3ns;FYwsz zB1SK_Kq4ACtg#$4B0dj-?nEdouDGjRywe`~`gDh|5)j+afP^(MTk4#Qiz zoelXBKq=2S6Ct_s50GKF at E%@k4+h2%td#AMD;|&R;@8wRoQ$B8FQXAyQJ7%%+htB6 zL(XL;j`2B6mq(O$2?U2AKmAFK4kpI{hL+~=>{Idez5sS=~_j9sE_ zGr5Z6xQBwhm!SAXhsYk03vSK=DR>{y at vl+U`VI)D2peCOm*SDNrDA)eN-G*qhD<(e zZ-VP1if#g;{1xd*x2a=XCI`r=h=(co$aXV#Y29#j7ToO6JeLQ~<8cqv;DAejG7gqi z%sVktMiCgZBS&LO$T6dQfpLT%k|*z!HQmB$T>yCSXf~7}AG4exoLx)PHZ+9|X|~kw z7c1#1;vRb_$6%Rk_u1($*IX*aa^HN!TZ*B%;$MT$fAm?C+cZHk&VES^!`C7Wo!%2| zF&rpX<_%LhJ7AO=2bDKNBEa5vAhPJR_5nOSk}f9}QNF!>`CCJ#fB6#(0tBQK=D)tQ z`Og^pPrlkauB)T_Ih+r;?KT>;A at WM%7#!WyFVdk?lcUR8ldvE2s)FGmI|X9!^SB>y zqwVGPP<34gkg(WvK#({3N at Q|Epn`#dg>MCLFFSV at jn4F;QaofOf)oP#|XG# zM4o@@^AIq&AQ)9_#dq48LQ#f$5}CoKy}0=pSHV72gho5%Vqc+ZaZV3jZm?}b9j|$V z*)18UuwKy1e&1Gc0ojBq0IdV|*I(3u6UDvzgPG}%T` znbzDUE3IRCm%CK2Bb}BQmRYzj7ggA(y!K=U@;~&kJRWcCqaw1_S0^si>nkE( zS;H9i!28e=%E0c^Jvyo|r#_s;CdQrE!aM9r6zWYFG z%zeG=6z at y-aribb*7vNypcbQE`eux*UOLn<*ccL#CU>Ud6m3%wsST4fLQ%cmioBe# zdxD_AWo4BsXiV~s>TPg~sa at frwKG>9alaUQLp0 at FPD0&eyWhwCo+3X_d zO`rPDn0jASxnE}X`$n-Jgomv|cx`&K6Pz1|y`753Ol!>F?M~F2u6sEP2%GL6%Ph^j z4R$;>u1Ts`I&_9QbEt3ogl3k at H|BC*kwVC0Y-g-F*BL(#uGOqA8Se>nuT~7QsAJ~X ztTG6N>}(@a`6os1(g#hL`Gp%0qGs{Jir9?&i at W<)EOcSGMYl|D0-k6HA!=-gI+>-y zdis4+zQ;_j4-eDNj69ki(-~_KyAreNuR*=)Alcc0aANkT8X=1ywkuxyD1Bh&Hw>`9 zJqwPE3&h=k6rG6?mP})-n#+;xv3;aFiQ`V2SBtzrlkBJ-(iY8yBM#wIi#*70ENYDC zQSpT-3;0HTuZ}xY`BF~Lk6 z1zCi8(AO+;Y~)uCATKvFfRE-QkGOT z_~3fLE{0Lvw$as|XCGeffG_)$S`Log4l;&amL*cWLP59MXzdvXMCS+OzbZ^WgJ-n! zpPqmo=D&U}=6_L`|42mswS*B^2MhpaNNEe60(6_ui}Ic%=(JHFY~Bm{qq;&e%4XS* z$!Q9O2935Ok$4MPkD`QnjQXDTBL$D5_BO~Dn$c at dT<11Ay)SvJE;}hg!F<#Wm+*pvg2K{Z<4cZ25`UrTT z$Qnhp7DK3SiVUm@#TBD3$y}?l{jSphcTz8sl9Q#O9!;^h^vuf)`$i2_-lTgqw*pQA7 z&mxWV8dcvYuaapIfx79yIm|F%bCU~<_4doEpAtMDpJ!m}5Ah at _cb#Q5(BR63jP`$| zcmomRkSkjsj~x{fc=9KC3%-1?+bpU=#mcqASV_nd-8Z!#RO<-Q`s7^0QT-v`f9%P$ zt4kJrMGdKPN4*ln1DG)4V84XT-ZC!s8zp(9O&eB#frC{fuHI(J2 zg5aXUp8CZ28QczUwXT#A?5%#rNmFLaZ~=aA8`v$^mm^hqJ*IrqjtdV@!*UE`nW`8M{kom$D>l4Tvl2MVXYY3wVWvw)ugiuDhfN&z#G`!Ozzdd1OOyg6 zVye*1Kng7sFNF$buVX!OBIwf~45RU&olmC$e(t+_oKfw4 at a(B0CNDqz+76#LffzI6M z`8Hw!#tBe%0Zjl8ROPh;n42^-oPmNyNa#gsR%y;+>gm;Cde300i;`A}GU<71c at s4^ zJ^F4nb#bw!cP2)Ej9m^-{Jiwu`h4Gd-F)2S>gK=QMNh`61 at vKvT0!m!bn>YGP?;We8z-|`u-G at Y-spPJ zEFdq|@)Q!?{mYA(EIpwLq`XqL{gG|O5l&*V7FT at ioM*_KmE_3ON87RX-Ud>)| z%#s2FUgl3}&m6ni1Wg9vV915$*Cr98Zs0wX1`z^OQ=DTes)jE>G`d(8yI6$-RXI?= zmRxpagW(hsx(X~Jvr(BH7;Gva%Urz{G%d8;cKDD(W8Of53_Gv{L+w)XthY`kY&Z9! zjtH6W7=?79N at g%tO)N9E#v!DmGJ^Te8DeTjEWD$a5mLS7w9M6vH=9vZMY5J$<_Xnr zmiCnrE~OD|@d7`ys2vjlpVTL_y;;H^J&Y3xUS7)YA0aKG^t+rZKaROtkv3*MQzQz*zDr_vB097_91 zL0GV5t3-^O=d)HRo+Of-P{D#eX9~Mc_Lj~YPm*g2(!jL2 zGUIMRX|9C1+D4z^GMuYQQD}h!0vb)(8V-e+9`EL6dmU!9fxI1~ZQ9g1Sjkuj&L#a6 zA4RkWNy|YqN at hk-olu9dZhmLl9(C%}8I}F^1QR3sR2G%H^BdKVWG}TPr`|DPvKe3s zX?aCgJ_mEzE;j4QT`6H|y9H#1%o1DY-`DErk7F4C0x81`#lDN}7-t#Xp24yD^`pmb zf5CAy&go9R=6f at gMCKZA!PSD%X3+t at V8klC1tj?H4%!`Z;y79m4%bEB>|UY3{7AZ{ zdeiAMGJnJPkyuAq6MyaT76kObH(3?3_!aqTj^D3><99d8Jrc|Ppr-Omg-fch+x!jh zGavG6P2#mthja<2xRvzK=T(7tD#sJ$G0w*G+^u5I!FLM6>?u1Os=OTwiRCt7rit4w z+B|-_x}wc&v-iU=*~gMDf1McfPydsxc9lqHl--#42JIrlsVx1G=qcA#?wEvF*EO)9 zplfWY!F|o#t!M^4tWqVOoHpOzE56D-0H1QVlTMyUgRa#!y(bH`mzSeHZs)J$>oFU; z;=ddEvX at G4?fSIjbNF5K91+W)R5SX&FeJ<%Ge`Ommc+_Wvq8Iqt;BczH|&?_O(V zfU?J7_CS5U?~O^0Dq8&IbAmV}E(PNIZ$0=g%|_v1m3_8h)CU(57}tv+qqxpVa^3gs zFpK&>Z1khQ&WPS<8f*g6?=E^IaUBb0K|0}%3{H5EdiMxKdL>q-MEK=c at i^xjf;W+~ zkq1TPQ4CsA%#(+3?L?^ZV&NGLXk0dy^a}?oLM0cRjz^cc{J-*U-|!R?0jb4PqyJ_y#T9S^=FBVQ9!$3~$kstIgEX^~V(va!l>u!_ldTrFeX z*hbN#m#)_~(J6{?uv~N>Q?fj118H5}6NueqvvJ3yeBP at +Yf0!!PCIQrRHut|pD)ej zXFr2Ho{Y-IQl9fBRLhZVSW4MXp07V_?D$6cJ$dG&xlvs%ayqh?Sh!wbC6g*>5{(tw zlo{!ZNHG1Ej45I}))h-i6~-?cGAK%xwMg+vVN~lIp`{qt*wIJ8l#=fCPoxh*;?S+H_$hnF``XXy=7|_H%m&NMR{;&r+NCnpU5p_=_ at i zc`3Sw8GzegmnBYo;w#E+#sDl!ESS>>xusp~GP&ghL37}(*IbDb7#nw0nS at h@zqp78 zOAIzCrEX40To>yEauLR|Ea)*5Uj`Pi_gOMwBbX~=g at Mw&E<_;k`1ndp=4ue+@@F$ud1 at U+WRy3D^s2_!Gxy zZf9y9ycFZ(=Qrij+`tSkB_>X;;LY4Os2S0&h=KF5TC=e{U;vg!2=Z%`u;%&Zfx1dy zt#C)8 at I}FDy9()M(6?)D&4@=Gssj95XDSS;!=G!scooiCvXRVM|(`)=!e<=Zgs#7p4m|jqPxiXYRi$6pH{pY|(6)VhS at s{H-pX%BN zZIG at F8O6aQWs~H*4&OO|OMu8;CTER}ze&%@?`GKlE7xme{~m#)fjfUtY5y8M)Z*a6 zYk0q?U>d>qSvskhy==-G%?49BLdOkeOsi1N@)~myIZF1}O$!d1)g)}1?E!Gjs{4}# z{~OjV=#(S|f}#5QgZ`FX7JBXqE4jXHaPu*4?aLwWyT_oGgw1hlKgh0Vj%^|MYGHv< z+ at sEv%}LLc6FCfr{HCA0u;F1JmlXfna*ha6uyccffL#1HQlG5<@Celml+Z-b1?C-e z))<>GE4PSM^B6{S7X~2u-~tA;XM%y3^A^-_>*N*n&5Iqx+*r3P*?#RE)V4a6ZMwn{q@?c3_cM6m9(`aApQ;nn`6fksLr`~V zYacS3Y=0!akRx#HN$X_sC>&gJvNDhn;?_}XY`P|jiAQM%$24oKol}aYzU+xW3ElMB zfCwmtxlw^EZ2swH2F;^{J9C{V^T^9NkXWnSUg5QdyGB7egq|h>XhT0BcY^F6S2I)lDa|w+%f)cR)$KOr^Imy`Gx%~m4#FziN z)u;Z=#KFbV at teJc`9C(JfA_D8)$RXa6WOoX(P|ydRs&sKxNHS;|Ie>L%z`Q%B_X8z z>bqWTaox833r^;T|MjIc7|ToVU*7f9g8~gCd*{A`rImY5x|Nl~kB^rRaAD9>=K&|J zABSknPE3estK{EC at U)q0t+xe(oO{kEpk_^_u^yj6f7(@_EUk}qmA-t1XZfMzm2Lr! z*{?o&Fy?*Pf}pal+C>-g6K$o-?us(#S(awUVePNb@>PMh8?NSt^GS29v^{r3usvG& zBHRsY3HZsvsjAG6pdABu_1eUVZx(8XoDH8Em=aPsXo4NSzAI|-K$f*=JioH at Y+<|{Va1@@;^?15?g{tZoAJ_ zS=jWWuqWz2DZ`)6o^JiY{S|QB at O6NGBjn3_FBYE+Rgp^zqZVMS6UBe6g;VcJ?78#8^l9t z$R+oC3q(b#w`*uu)MYZUMTlfyw%3!Z?@sELe-T9c-WnYReTGu%q7g++f2a(t z2AM`e+4|S=ak0Hl`ZT!o$L1P!gHq?=i=pdaz<#4u|D_qHB~wVJt*Wf-6iRY(p5_oi zc*!!cKp at sqV_!1(b2<2T+OMi6hG{z-Z}>Gfk`}c(_~iq}e%mIKpLaleE{5vFm3m0~ zltH{4Kc5i=gfH|eNA)!Fjv at I8gc$SsclRwy+-s8*96Y8!PqFY#L2?fF>Jm zpw9&@SppY0c1{d7zXmzu=sXMJL(E=OL{93F^W_R-6_onBtK0Glm+LsP!u!DzV}3Gk zMzfW!S20>oqXZ3Fr6qLt4pcqok8S3tb3DyVIn|)4rQCU5JZr{fF1TV0)?v;GAah5v zm~`yCt7)3IQ-(SHi}pD9bIyW!;7IT$<7jbD+*Rab`vPKrJID&jBSlR)QPCTgWq+8A z?FnGR9oJ_gX#@4LN!*aI(7_N5VccC|w$j;gcyq~#2#I~bNmC4e9G7qxwf{K}8<$ab z{iJk5A>@=PAy5kb3f7Pfjt8cx9?T0W-$pL=Yy&)!`b%%$Q{!L6U ztt7o{rU)BKj@}SbeVjR>Uf8N%$9>o8*`tk z2#Fhr11!pC#wpuPC>Rn0phrgwd(9O!Xa{gfc>JR4i{{LhCfBooxhB=xv^!_M3 zw!r-QL;VaOQ;XVk(Z01Zj~bQ~AZ)687obbzlaW$KpMJsFu7~=OOo<$X)Rp$s6U*w? zkOY{My~|f<+xlr`IpvYwz-HCm{RvVV77elMSwtv_3bU^!ogXLsrC}^n&V&#SR~{i2 z2Q^gxF!;P(3O5D2KyS=qW^1k4iHqWqe}^S174eCLORtM!l3;TJvOyEa^rP$GAcdXZ z1f)MybePEJa6TouF8&1cv2g zJ;RUed=q$b(XEpkj6Z_kK!rU=F^+ku8(r=+-a!k4L&L+tNcXF0!5c5C)PdOtUpz*H zh_bDakb{X7iF{vl=B4c_G7z1`a({ZAyw!kfOA9G1a|o?nbK}r&yqLZ~vP++wUhylf zelv6gin!0Y|PEQKMh9_CmRvZt5>LT?Yj_z4D12MFu!pjI}g|c1nWj z`cuBXEsqCR{=xbfc1c%qmP#}9Y1dzaMKQlU^UZJ*aW&m4cQDG_h}Q>{pB`m7;!34n zOJhwuKvriluPxP3U$bV7Zht&a^#fjT=T0iG_&ONHDASa?;28|5B$96zDJpOc+0s5+ zBL-$hi#F;o3bpb&rHwF<+>$4m-F!KV3b_d?g{c!&c)>>!j-X-Yf1sPWV#g$EiBk*D zg{-30_Wgnp4RM72fk3G^!zPJ_@*a-2e>z5$k=Y{g;EweT>coeF1TCL*6UfDpLXS`8 z8Ufv(N|)8m=uGL&ooGKrqXAJLtl-figc6&PNa5ffWlc5Eie|ZNKD*ao+4?m-lmU-JOuB4pr{$Z*eB_fg6LxKePZs zgMjG#-=W1nNTK;vY2Fy!Z<9rn7fv3z!&xPro3jZ1(%~Bl2 at 8Dqs(!&%n~Ido@>Da~ zP0by6g0(5R->nqR^mTjOQ?@CIqr;p2*AamL%vq3t3GEyX_ianjw zeJxDeCP_)L5d4@|;yr4BqnLu>Y=+60Y1k1~eLC$3lWwl6^0rn}?iAqKsoTbExootE zmkoA#Qzcz<)f#+cYrRe~9Z+XhBYmLUW~SiOb~PR;=lV%m>+`UoA z9Z9kg6VcEJKz1juz{wEvR4kYmpPmrZFo$N!%%rtvDZx3Z at Mm^xx^Y`%FCvNXlhu29ijHK^z1g^m(*r}jOQT_ zmfalG3`QZTV^VV&cc{p)27G>O!`l%!J&__UIIWSYorYl*o`n=!wB2jvI at RQS%;994 zhNc$BrnhhOeAZ6DLIa(o4wwC8X=TM!N-NC{Du7&HxH}m8%kw$u{V>m+4gX|sDg?h3 zHvCFRFkZ`GoDh^PE`QbU9_EkKAmmzkg#{f>Fhk}MD|{CCnon;8>^4-NZyJ0AX}x6B zPc&3ro0Q=F146a)E}LDZ3)BL4H-(x~)R=pna5J*!a+f2FFKTj$ZfQjv!TJh6Seu|y zvNpx2TVt!ItM at G0Bu7v-pjt%h2Q0waBTgG**lmV-p}5_sLBDN#+$|x@;=Ti}*3E5+ zHga{Df3&6b=cLAt7Q+mT3eK71Ij%S)+9&KIUks##G3_{-2eJRslLz_{-$07eZS=D6 z)`?J=!ph`Mtw$Zrhxlfo12^s&E%nc-&F|vbrCLx~kBS=^cX7UuzE$+UMkiQAnUZ?? zXBHuOp9uXcm%5}-t(U+-Knnl7rS*SxFe*O-6DJ`UL9(X6PxhTc8|1w=AduwvcMLz at +MI zx$KU=(jqdHU}g0?i|4n8`ID8{ki0oW;KIf!8{C??GRruF7o5jViZ~!x#^3Go~1Xb0) z%;TnU0Ja!zgUuS5JFaE6OAQ?JmB+RzZEo{}O%N$=OifQ5BC2ljuYTJu&PGk$afVvhI3MKKK6bI-Y&I9 z^hBeZKx6Im_$?{%3QTuiESrmLGxIQeg#D#SO=h77=qx6tgRx|um+9ZI4PAEzvC%}1 zet at W{#;SzyUX3bCYQ=uiUDIW at dNgm-aj0_O4t0izH)j_8hVoK!Wi at uwSx6I}IaO-g z7;#x2q5xLM at 7j_jCw7CU>tD$DY=a`-$07PbyJ4PPb;Z#e7us4CcOaHAI!R&_E5+K6 zLJHHrl*K&5-c&W=Txj1Zu=JlZjyINBO;h>&{_VS(nQ1U$&xD~2M%QS|Sy|pz8m at +E zLsYE8qB7)gmZ;LlIvf!N*CL&MyNO1{G7N$v_9V=n%FW1jcDs{O7f~NoBd*rF%-Yq9 z5mUix$voYF!UW!0?XDo^al^Sm%|91w^g__)bBZQ1a>C!DPH*RE|BOX0)T| zXMLh}iMJmRcbKE29pedX#&_8{MczSBjh~Pc7hn_k%=O|1*t!F^2DJ})p1!@1tlWM1 zf?Y~r?in at n-t}sq)9Gpvcn7BM1*78?;(UyhYLm5JU?@*=fI6`5>Rc3063f7=^tG*u zf;*iWSE1aSoPYqvVf$g#gN##KfW-PK0IpgyNuHhlwVue at gKcOcQtTnl!dIV zw;)p1iI(wh{Yp(LY6PW*!i5UzN}twxpJAu-dJEru_63E2gP@&|$A_Mn-pGB-Q)HOv zk5kn4;{F#YC2>WM(3r=fyxRbo?&W`#k~Wkri(h}rvekbhW&HmkC2aqk(EdG6si=oL z_l0_Sr@&vi4vPZ4Bd-dhR6U*)$@RoV*Aym^GMn6D-{=_rWIJf at uavP89xVfk^P2p$ zgZuQw&vvWF{ogf?TcAZ(lEGo-&?LXGSp1<(ptTPp at rPhl!InfDck=zEzzE?y`;c8@ z*!kK>w`uxaXaA@|r_JI*zkPol`{L%;qZm!K6Zp9plTuAZEjzs?98Oq_21+f3hVly5 zI*xhbKP7lDo+;|=Xo~;{!&``xk!Ue8=;emV!~*f{Fn^3$eFpyCzED%Msz7x~hEYvHC!=j{smI8W;3<*QLxx>StRM6d9Y%tb&<+*Nc0&RR*p{99>AMbX+OowBjUxOr<$zsw`Z3BAm^Ukr z4sBhE#Nw4jY5t&FU+taWd->lzG>%k8>rE at Zb(yH+PqMQv4-bj$JqIIB05nu?afNbv zA8_bh%xrV*3kx!vE!7{@e~<7dUBTPHppv2j;^VLInaJ&o)%q|wAv=<4qdWYy;0p<_ zP%WJ at fyK+1W?`<&K_(YOkSJFfBCQh~S$^I3beED2;h0?zqo zWE&-XX5LC at O;^NNB zAzu$D+nhkLEMXoq*a4nuy#5e?Fg@#=Q*4M&@n%0TO=mjlxe~TeJLNZof8`HR2UKG5 zpO!WS at 4p^K{?GaI&-B8n7QPkECqg at 013j83nka6d4K({IT#~Rtbihm_I~RBnN?^X^ zWUah$Vy7EZqq_ZEJ=C_#7Frv3 at D50lb7k^G z_6BAeDZz=3+m7j1{_fu&7dwuhzL&lroh=yR5Yv#?{D#WcrUHFWDG{kp at Aep5FrtGV zK~IET(@8|^J)v~8)nD>=LPhk4#^s+?;vNibdSb6>e{>Dy3YmQ5mOtqrXI}9p8kyYS zb-eHh`Sr#cm3y*&J$ap57OG7;loy3U#eCKi)r_t&}B zTTy1`$Y2XJ$^+HzWXYqnyGlkDnezSU1rz6PLn=w~*ZboGuFc-}&^q6PT$@RljLj+7 zSrVR|smeSk0=y`fb-o7&6Si!yfp0*RWwJyo-KDpf3vl%@Y76-&=FWS=K6?hn&P`o> zgT>p+gV(X$JznsqhzKc at ob6?(u6(D(lqn9E?eo3Z9b43;)Xt$VS2?^B4`^zvf(U#1 zvRmfqr`%T-mkP4w4$_B)`X+X46SRS)gi{!@pA=89T!JdT%A6H*91bIZ_uDb^XnK0c zrD9+bka${|z5jl;&3b*CUJwz_F~&$~KO2t2)J13UqRW=xtIK2?qK{E;nl+=wCNNww z6;J%geumVZNbxj0^^&EXJ{)Q zLjj-t62df4t&1gBa^uCH-0;;_OTmMOW=BdoMn`-hEdn*BE|s%2%gQ0&s*l&rsub9M z+QRy{wDPFD(S<|CM6&y(C}qq&W`C&*n#R`AB+TK at N80oNqc9=nb1WOmEydCK|&zf1I>5bPfJ?;dioe-yZ&jvt|;L z3b^mYx_4^cH0uUD+EAQ;MCFup^CBb7u9Q=;V8DZmrG`{ErLZv}((-Qtjex_|u5AdETG)-51K*gF0WBKTh%}?pKVn<1p%hFeGwja)ZV!3+;@EGpTQA`cF7R-xXX6rxC?hApCwN95BKqUPu4(2O;7jTzp0c?pfsro$`rh2yq zm9s5M{6#^v%1(9~M*ztRA!Bgf*&XCFA$$_I?zZsw%{l;YV`?qB`t7j6{vavEX-+Ov z`#RwyFxY{f at 2ea`Q>}h(@E*yd;tANe>qNe&ZF1!HOooCfc*elF`db!13T^k2PgE|d z2G at Wk7g;F+7LzIJ&DYqO;pf5m9TA%7X;$yrY`;krxpKupQw-3tcLCFlQQJ~Y7hnt)=evG&yF?Qz^Jw-5sIq3el z@90ZF at jJTlx#5-&mP7dh7NftZ!| zsIn?>tPal_3*$BEyd079`DNlJFJbD-S+4l`rq_dFh(e54_0|ag at nk27o)His* zv#`N)+yJ%4@&~Su%E_--D_; z%uR!suWuQ5v1(a#O>!wds&IFe7SWZ|7N;^J-8b#1?k0cMe#gnABx}^foHad^Ye;9B zOn$yWJb;TY1Nk`uw?fMV13#IBX2dL);nK=)RN47%T9d?NM2>5qW2bIqr>+oRdcHX6 zrrndB>~`-FdZ5sELm6r&=Pfm`S!&J2TXocC+Ww;aJ;fouoc|pu7Dx6c(Ru=GdKD_I z{Zk25I_74Bc%fW!`&rdu{ihpV{hm0VRIC<#M^q2Ste`92vfNd2tktIo|F~&|@XmsxS>2P8z z#ngU_KVQet(A+3M)1 at FayZL-^!ca2XPEVtluD;(=!FnNhGNb=ALxJXS->jgGvb_A1 z@#l$ZV1;ICabX#KEFskzf6f)AgvI+ONrVw4?t7q9&B?ijMwQ*2_F_=MSKbo)_Oxa` z&o%d}#`7XR|5btY$%|FPS%G8*0oGW9 zBQ55y9SkohK3cP=#eDP7(Xs9A6L`H~?uNI?KE|6FNz5b>!fFN98f_Bt>>0jFDx3{f z_N2V_MZK#=4Amu&sRvb7;t+)OWXQ(wa4QH6vkH8yjC+Q~gzx(upk5XJ2H%&ALhoPx_H;YsaTa`m zKV!thf5Sp&`Ffm0{9TLBKAs`G5r#M3W!D^95~es z`f6Q<=ApR%hlT$5mxaEB`VR|T>fbH&v2}80q8I%yR%4e0BmZWhvrj!!{1jm1dkB5t zAy{pVQLhn$KZg4^3!Tl?4TXmBU2iB)h?Zi*N6AF8L8FAiW!IhjFAMz^pbPFZ4dMSm-Xced^e$EpYQv#;t9wWY@ zQ9`-IV7HwNiROaIy25Uv=NZl0Kc=3Y*GBo3xo*(-(~1CoTy4J)cF5lGcnBGl9O3B5 zydR-&_PD4$8++d-z4RPI;6Cyv^W58&-&Wy{u0q<>fR294^KL2E7XfFlJmZi+2Rwlf zbYC2En92Bizyt2+(o%QeVi(ChPfXpBQpwTsApdGg^RYUiM}Dp;$|JQb8?^3xB6B>!`%T&1q3 zgr at S>K-<=AkY7-c2PQjcSSxo8 at aOlB!;Tc3VZXj^6i5kLZTE z7gJ+&=XZF$vUm5|6}L49n-^TAUbAj+lO^km%bWLPG`3Jaa at 5%B!UDq~hU5p3x#9;B z!l69Px5L9N_=^YehUBpmsBBm!viiq+VEczYOG+GGJHg at Uz$usNAi5f>CK0)dFDL8l zmpm6XoOCZe3XrJuO at V67vfY`mR#oYYPv#@#prSuNSR%gsswp}*)BYf9cj0oqVB%GH zTw3KYO>vM8>NZ1$56*SC_ at p7o)Kt|~$QAXdXp zJ;o^x3iBJlm{X`i8`01w`~IG0f%k{)BxbA9+d~Dm$vXSD!EX69iSj;TDhJL^nKP)j!JQu!mY3y2^f(*H*w{?98&?=H9!*nXIEe8i0b+Jz7Ez!g+!S?Q*# zfT1GxMeI3kF`GgS?>IU`fs3 at g5%$kSp(l>;we+K?Ztf42n9II8AA(>Aw*K>*&GzZr zvxau2%pV``@5sWagCL?KBP~p393V`Bh}&qD&ny8-!*wxs{$6+;kIF-qAfP@&WU)_s zE*~oi*V>YXLug-Us&Fzo$;~oJ8f{mW45w71PT=NgD=@{JCYjag3h5ThbuBzGCow0# z6_{sG7$_+Jw8LFEYSV2*)2Xs`TyWK+qf1`!??5P4jdoQlw!DEi!*P+aNE@*Qywqwk zmTD@}9HFOAWJpL%)1?e`^Yya4>P52~*yf)(sVh`9)0wmgNk=AXM8iwU#A7hgH~bPM zSc3sLw{Oht*HxLMon(C)79aN(ewsKO|MH?uRhqLRX-dMSpRva$`X7|NQ;=v;vaVaU zZQHhO+qP}nwr$(CZLX?XWvnvq+P!<6yi& z4tK4;G&N?FZnK5fbHhy=OAJ-OEq}iTMcAmtb7 at mGiOVPjDH}9BB*kjPijAzi3D!oI zWr^9=kPi0j=tpkXxVtSp5N?OAX#IUN%SoJAuq4JX==%D3*1a z3}X6ur_3*&@^k2u_LZj2>bl=t!Zr{BjCU=iYA&S}r?~VtkF4Ezn$4=wx9;qr=DQCP z9nu`Q_7D43oo88#>aRf;%I+VVAVac-X62rAAt9UCo+>xWnoePpXQwcW~m~cq8B) zqu^wma!O%C4)!jcErH_NqNpF!wuhm)4bzGIGw16--X<01jCloatW#{g)!{Pe?4Z7 zpzwG^dy(zR_pVGezFq-t#IHOZ*?NId04~WVl;q#T`TDmfhB55NjTe0oR5j>kvTJ%T+PT^ z#UIPiWH+`DF~&`6RIun! zzse&$vVRanjvNI4FIAbtyqgFVX-oEbCTBC#zK at gH+wbS?9$5fYTGK>9Nt!d9CdTj4 zSd6wA>*j?xHVRBxIF-I#YJux=V z at D;?%M!AOJFaLmE0#y{HI?7*7#9BkCFvO)!-3;N~vVUxi4fuP|zcs_IqrOffX9K$gzZV!GMgF_Q%*3N{d11SX=RmdnuJ(=-}YMT5y(sH3oO zubckMijcUO?pIxV at iAoHIfjs+I9xDS7-RV{=a_5H00-(*ziO+S-?p>sjB!#}X}a at z z!+^qdClxF`W*B`2I#}_?BMWuiD+Oy0(b`Jcv}MjG!3sXs3=3;a!B+0}sa(YveFJ}D z#!V5Km4i4WmL79Tm+2sbYbQ0?@2QC;)TD_sRdT?j6}6_vMeZ2H_g-;HZDFD&7))ky zgRv__q%rqL-&mY+3)y7i7FiuaU3IQOol(}Lb#5B=0=t-O3~~X`9wF{0T5})aBMiwf zdUJ;T+ at YD=;hE8lb```9*)~X-u at ZKpD`kYR at W3UQ5{s!H2wq&$ZO_S(rfBdCsWS(ZXsa*%|C{V73 at 5xVL;!#!MF0TG ze~;|{26|Q-+5pG2m5)4ocT=V;n at w^#WC5Jia&NYn);2j|DGg01IVCA6A!yB(NiyBe z?U+wWxKKp^1q2bH;S~g*M}#)YRw at xqq=q5_UZK;g*Q*o$R=88I9=%un?vuH>`DbSC zX3nM!BL2<&oAc*w?rrYp`-kV}6j>fnfV+=mh at q`n9NfFcAU>5yC#)KTM;rvc4$UDJ zLNBcjRnWw;90I8htr5CAx)5ugb_`EPJ?8At>v at CV;B8bPEPKP48M#AX1iDduAR1(c zNQm?qa$~*;3}lDuV3dev#1=?zs0j>ohi*uzC#4q#l7r^JlxXEBB7hsDM`wikP8X;z zyObN$2VVN?s!@7C5phca%@KzjWQTSLsz+&nm#Ai_ARw8jW-KAV5OM7Y#rdHZNKEAS zSVaIMqSwkyM}W7eM!Y)eFqzJ{(=#N;>{7L;M%YK@{5r~UtA~IHz1}z;IH*rPgs%s0 za+lx$w&+IGI`pgGvtKgA_8qY3<7+_#`!Vg+dN at dr>cBR_sT~}Mv6BeiWjwfXpyUrq z&6v#SqbL;%@~P9-PdSahAnC0hY88E at D-Jx5f;CWc$?gFtTCe!21AybpL%P(8#Bj`ma4otn(8Q z^0P8#9$mnN0yW at +s{0HgGj=fXlMtl7feAba`8%ZIZOqsb+WH$@mTSdEcemSJ z967O7y at 3uDUY-l<@ZQl4b=f*@%4o2nz<`kn{b}$BKhL__U8;@*{Vj at IFYBl!yR0XO z>dW^EE1O%E<$N+=qc}t(s)8HcZYHc#4_uLVw8Zxsha|uAeZw8*v`yDt;~eoB?S2!B zJxFnsXAP`zJj6_qo%@~Q3bC7~$o6wKO=E6W>OReVD%pV%9N?Mrk+G1R``_mZ^>4C> z%QzGw02lT;k+g9l<%vM7ZexmFO>E%A?=WSrD0E56o?&xVD>g~i5hw_^hJ9>EE0gob zYCO&&!;TXduY9a;4AbBw7c+*8swwQsibx|j4p(T}mCv6-ceK4M|8d(^E$MGwo@`h! zCg;i#G?5K9QuK7;V(H>Wf&;BPEzd^ZjB1;e at FI8Zot+!&!p>!(1kb{S>pXFsjx2ST zfty19##pT%l)39oPQJ&`U!ilPjY}b_aUz;$fBbV&8Nnl!7ely{hCjD_%t_LJk>nBa z at T*XOWx(vSP=VvrJl8m7mMvL~)VDwg`qj!7LxOJ3goU4I1Hb9gM!Jm)56*s4o~0&* z8$TO;WSMqT%tkeI=eMnM)s`1hY9++kv94#`_nV<#VIg0+TzuUG#%IcA+;XR4S=@va zpR#z0<(Q*ITGu7KGhPrvWNz+QhhEoGob1k#;AIau}PF8-yhLybG z_iCm*Gk%CeCv95>^|WnV>UKSPbDCjJFZaBUJRi`4Eck$??KGXD1)YvPr)wdBv`v;> zj1wvKlH{tn1|lJh-*a6JOz2H*hmvN_F)1l(RStk=z)2+hKyL95Z`g90s zVA~8eG2~+VyQsfL>Q&cHmJ4Us3_lPok8)QVq^7e9Ub{ltL%;xl!Mw#2KEsemDS@(O zxk))gLpM2-u>+e2Y$npr^X?r=@}KstXSTVX%R`}+UKCo&a57iLWa5}xk~EGMNE~q* z$=7j_O|8wHc~X9h+18?#-b45c9OAA|nQyeM6Cy;pUYKLTw9y$E$l_3Hm!zb at K-8u4aWJCoYd*XyWrjM)x7uGT!YP4-CCextyVnmjB|-* zG_IiQ_st&PMjV{G7Ep1mI#|Pn3!eOI<*j6EMxQG;umNmVeOY?7F3Eq`W at 5g#G9&1I zi#uqeXZ69wq#L-9(G!2@#%m7LbU**ScXRc|<&tZDZ-f?@S^`V(Wnww|iLrf3h at x@H zqD2|CyTv&;9B1B?hT$5R%PcG#Fm}Bh%T-HAF)J$gK>0Y?At$%vQR%t5?d`I4;!;N1 zvV1f!nQge1{GdJje)kDYEeCII7pj*9?=}iN$k-;ygT2>ALEmZPsbVpTO59jj*DJb_ z0L9R^Zi}-nhn)mkc`vUa>Uipj{;5sPL9IF>n)pE at 05@tQ*FN%op~LMhW({Sf{2U7* z%}l(|tpaD;skG*bJxxh0#Kn;<(oDCP-zzH)=GyD<&Sm;SBqBdu-$Av8UF1#qu?~(! zFY9z#@uWgdNjO!*p-Q(v`6B%LwB^KsfcB4 zD{JY~mUc&a+|OyK6H|pwBH=uQVZPnglNqkdFKp$Pmc<3m$>e(i?qGL70I55m9*RNu zgA|Z`v-tEwRLCL(;ol9y_4jMEsUzMMRGajcJk(mI{RM|M_0xi!e8HOwn8ghvpA~k^J&_`vTyhUK2oGj)x(vuQrT* zQM)F`Nu9Q-B<`okJ#_KY?aN?q7Nd~}BDj}fu>VX at zk@Iuuqp0Mp_q&R}d zNqm6hOn-5n+i(LhFvml`mW1pZP%*PQGxNV2=$R!>Kk}slpMSo=E;|wt|B=M~n(TKn z7?s;9DF}w-ryaCEbZ61qq)hy_r_HD`w>hdaNboQ5RIp1pje3 at a+!J80ZBb6|e+2y| zDGZozio4bZ;v+w7uM95cyGRMyA3U?w>Pb5EQ6CcJST~DQg`jrEOd;igPG at SlmDC6} z1?nR>jDGcnJR2koX|}Bp$*|5NBw*QS6s`1wm~}Hj_8&=Z%w~(Co-JLBb1{lluou_R z_2jylhxLz1u1wXmg(j+T+aO;1-3?EjqYsBKR3XVPjtv_=2DCL9$9T!IS`N_bM* zv$xd1304Q;CKLx-+0BjjE;&fftL&(xVBT7se(@C-GrUCL&P+8e+WM<&ILJu*GKS0h zC5`fZRMGFbar&lK!8{F9z6RS?pO^IGR8-kM)3hfz-wS at euoms*bqhz2nxwn5zz~bc z>_=lHv9;`alI$b>YGUk7?K(c|-Dg_cuZ&v2tM8sGBrjUQsEbT`IQ$I^d$!s$mu9*^ zZjwP)>Zm(viX}a1qEj at JTW{I+`B#B*>J1k9IgM=Ri_zTGdPS{d_gTu0A6etH+;ZWA zLK>b~8n|OgU-jPo8eRK(@0eb^)v7K1+z at rpwtVrn%Y%JsQ{bP z9w_1orrZnZ8J(B2KX|{S|IAfeo025?gE5gKnU@{<|U2i6cFL(v!j+7 zDl94$N)E6()fogsfE{st_$)r&`QO)G?{2|H)3G5hejSvk^VJ8anfG~9khj2Gd*G0_ zW*wxc at +x;xvK|yCAuoiuw`xP(uzWdDV=VP#3a*iU+mw#1E63KA#@08@`qY9Cw17qH zD)xafsL0E8<)33dgR7L&@;vN?sk5)<0OzeZ|(N!~4`=znErIwN9mSH&b&_ zy!b=?R#3eD`xBPA9-qw2g~}HAvytBIGlhO~2p@^Kl@@loC5JBv`mx{y9gig~G6Khj zAGb>SlPqJx0cf0b!CUKs7mm8}n%jW; zfakGmOgZ;guRrlNpMiQRHrWakZ;g3i at Wa{0+`W<1O?K-px4 at o%(;FF2t6N=-X2vi at 2lZ|W4#k(xvBmbVhivsg1 z1f#+YSA{8kqsTFadq~c4gY*O9XSFcr*>ms&l$JvhsHmd$!DI&R2fY#Xb2re~1q`FV5Br_9G+#4y*K2CH*Cq{?4AHRQvA!3O}3uqeAmd`zhC)knQ3^ zogC*ZyVw1KMTT2%{Tva6Iwm=OnT2|_?SBsZbSt~jAMztNEC+9Fo;x(>N#@3LeDEw2 zFptdC=sbkR?LRRw_fyjFXI#Z?jrz)lq4C&rV`MH8=IV1WDEEieupiKWsp{k;r73BY zg?T%oCNzy34=Pon=%~nRJnUm_G>nz zb92QPLi7Mtgbsr5mAR;ByZq2=Fc{PX8Xtu0WT|v-rSw}!NoPDdG%Rji1h$LSO3spb zJymKnGZ6Y6yA|^?Nz8PNYe9%lhht~PthN_)!3l(}==_2{D}ErYgkO3R41sHq)H)@ueH9ook5)_3sKKWr3(o>6) ze+`I;JWBP%3iDD{S8AqLV{4`O#7eQrg|ekgZJVhT zYo4Xy#gI!G-IDBXJ?jaVYwI5t8*UNSFA|&L7iqkZrQ-%$k!;6g_~0_D+b>kjAM3i# z)$_D<%IAmKTDkUgU+o+VyN;19sl;3?OV$qn%}Jd)3m=@eWYhF#YBydu;aN1XUO3Uc zePL^~8P24cIWiI5Uw}mV6=X6ryl(@w%yroPzg3{}T80AjYl(_{i zsHNSNADU8 at 0ek35UZkb1DK~{I66YkPsVQL;sT8ovR7zZ;^7N&*r7OagAxlg<5cp3h zgZzgapUveEy$vwY706b~Lsy}w9C3hB>sGhCT3h9%+N+QC|Dui}$@u^P0{}#V0{}4m zN9yQ5wb6gv14H>PYcHHeo6?OXNUt&#greH3pm0(w7{!1P(|4gvZfe*i?basxnFN;* zDIyy)_fNT(=~jVarLpBQKh^1T&ON{7-}eW~7*N8Q?VwKghEmzF7XwOm@*KF2IBo=r zBY)s2O^{1FrW|J(XAXPVP$sMEI;zWx6KHn|<(Atb3g%XtO>~51R8ab4y6il~dAFTZmQ+WL zA?6;-unbp+X7NPWI%S at ww=zS^DU5VYiZu3+<}$m?QOns?kX_wn9N|14GZC{Pz_5kE zdL?93XE&a${|g8s$6Ut9p>|g{5uYc_;p3e*)I<^RIE}E&-b0QrkPN&&$T<|f>LQuI zs(q3Du4|Q?r*C^1+h#<*t~Q_U`eqgUa9fl0rSkHlX+%AisPxMeTq&1hbgU&g*|RL{KHpa;X@#Lgj8mcui$TNBAEPngHw4!sxyXE zEHYSRP)bI3ghJc}<9dv=Mt)u`l~s?1vw!H4V)(S=^u zroOBzw#g+ID8mdlmL)$W=_koiOt|^i&j5}e43frQF+DzfH!<;#n3PRr!KF0}3>9et2pW^-VwjG9;PZ2{ncd z1OT7}>fiSQ{6{qX*WzabhwB=>JUd$?K7)! z0Pj+7*L&_I_jbpbg#Y_2o*$40-WEpu-U;YfL&5-v{naU%K3bBdkfd?uSPBWLJ;?(U zHBvoU!YEaJ%|k6!BfW!|;li(iJ5w6T9ki%=tB<%qMMk+(XSSRlq at XcV!neaMQ-4{haoQPLn%pV3BoqWi30_c6Lvt z9abw-quHvev2=@T|07y4E{n+Y#dNv#g`GwHK+9rErkpr5_l9h9-xhfn0#ScGoRjhT?#s=sq6F)-i|TI4AFf1O zM64>!`Te~<`3z9DNXy!Yur#d!*%C;9 at pc)$0b$ZogWQ^sQPP!hDNrmu^Eg&HI1`G8 z#O0gJZrS80!R;m7T&S}+t7_O-rY?)DwCbkP<*-+Zda&rXr!qr_Qpd{;t>LX=mN9th zcc%z~T$$}YU64rFYRmN&)LiOU357D}nYsfEISL75;X$%FN)Oy+sJ6SXk!&cZj6 at G< z0&F&RsGCDu(Axvu$QP8JczBRFc&U^i8sti!&9Sh7)t}XBB-X&_A5uyr?%^j86TQWy zV~P`16H<$^d)!?|*XC0?Y^~tu95>@+^NKMtZo1?{wc*$vb4eN3DjT1g>d0z5>7u&U zPe8stisBaqGm!l(+<>p5V_?`+nhZYBcGh< zRI?;MOCHF;a*MVg#CM>`otb)s&V9xQ=3P;Tq`G1gV9NuPS=2n at KuI3qW0m!(=7V`l z9&w47P6_TF^yx34du8~XO+fU^;OI98^WW at 2%`ItzocL{5!(*7w>>^%?*Kof)@SS>~ z-+*cr(cdJ03&!zX3GP9M(sZ2pjzq<0SP_oFF;Fc)e-r?-t%7Gm8PFT8$qy1^6|>OI zeuBR7Mlr_|R0E3U$iOp at IRuPAY?7^;|A=`#14OkaBE14Ky%QHDh9?edETya(MS0fc-v(@7T=qAD=+Xi5r<_U!`ocvvpnb9 zT};2P?{DA%I6W(g0SO^dJ1D3JDz>B$o2m^Z!>SE436Qh2{9U!i=>nYSy7>Zp&bT`` zo12fIv^S?=+f3PY+pQsz_7g4>8*LV#=A}m9>d|dKwKB9wyLqP?gM7nf41QX5;%nd+ z8HSk at TJfHnmW!e4hc4L(n at wAX?lE5JI$?!GRptOgW1Gw?y47?{v&*(0rnvcLQcp6E zZd>}OXHkB0KBiDZMyUO2JoM_; zBfimAcp<#SxzU6wb)Bj5j8aLep+xmL{Dej7z~Zvk0Bb at 95I8=xjlYr zVrp;6ye`~&La8(#@XEo0b`z at HFyV5;?!FTiY9bEzc^94`V_d8<*OEJtab+Im`y4|$ zA*pfNox)@8?>7U9c(=)h$9y)`9s`CkRKtuGpu_utr{4@%oz%=+P>xwrI|=GUizt96 z3_C1D`)iL1%P`i)D1oM3KUBNfk_|3ea!KD5M~~8mVGAstq$9tfN&bY+8@$y=_+DIh z3eJOE2YN+nKDeF}M{>?2&%zKwC%7k{%F87Ep{*q;*Ln@(7#>F)g6AEQ at t2mM=p{t*;1m=XL)_^^E&$TGbL7J)| z+-`<%*b`3nkl+^79h=-AOkt9Q`ic(%vLkQ#mwToeh-azuU;qFr2mkRYMFPr zGX7u at Cs-@Z?pmfrkYtTt%+#}1LaxAFk+roaWG~z-z6cRaItf-2V;xh`K6BT{aD_WJ zX)a^nPg~*NyekXh|5zhf4JPVFBkBwEHqaBGq#m(Q)=x};OtV< zoL!@O@`)P=TX{;VQNVof>$Rqm8zd{Io$gXGVc0sh^2D80%ata3m=HL8(UL{S(Uq8& zo@{g-lEqn+z4 at n#dI*IS52eE84_8cNI*9#NOrMDsA(0=wv?%cIg9vl<{^$WW=C(K6NI0rVz5mP8Xl z1>ZVKt}DGmJ=WVt+*u3dJ|*QupkbUgm*fPLY8DzL%8=nTr?r-`R2{gM{6wf+ysTt3 zGUW!_*%^i_s_BfYCm|hFso at Oy;KE7~wW0YKZK5aBlY?Y8 at pS=l&ZtHN%@-oj73M^D z8`k3)^rfDs5x!~z^Ojw%_Ux>J@|Gq?Q0qpyK{1;o50SxQ51AuJQ27A5rDQ0t#?bd2 zCG3 at VHo%6_aul9eYtS~@Hxoy9Gw68=542sVyx~7TpaR_^&`^3K(olM1)GOXYQUV2z zjTc21+C6O~da8F=dg=?|yHH|{a!0VB{f~qZK3V;%P zBcy<_2WZDthgKyPcXWs>0gDd4#gb-8ss*THEo}->yBjRCYYb(lB~@k!i5S8u;8THu z%@MHeH$9*pra}8Y8in9G`YwBy`)*NN_QTvBR&|=zk*;i^9j*!-$?Kkkaqom{X@?X^ z8L&Cx?%P(Pfa++WJJ#GmT?&@r8{+5w=zYQ*9gi3vO at op>5hdRWbsvE# z9@~@*z-F^|LtItF+Qu)8V)2bms-`$=kT&N3SOtxJA zll|hvN#j4})7q!^cRlBoP~E#o#(Fx(Em##~IY5I^=8avZy(!I=G9x2+?~rGy7n7(D zT8QhAj6$gAhP-9aJY-=>9BFQ(Z&*B9JC4ZCipWmz2+c>3o3vN}wSU$Y9wP1+G%%$8 zgmrxLR_r97n&Lg=M(Lpa4bv at s%?3r&BjisrS>_%(_PeBgD}H;|GiL}a5v};f4 at O<2 zI^uNNk#w at I@aMojcC--}zS9|IPd=9Y>t9 at czJLF@@&CK3Gx`r2+SCkfT>n3xlGJ2r zdn84a at gH;w;Ncbmf~ShV~J0o!W*|4d3`kpl;^N^ zPod)lwp(ou>ohl>PTEy%IdzL}Ic=mcO5Jg?Lro&n>{hO3wz#b0^`VT03^w_F3H^1j;Yz|#O;~9J%LOw_k6|Jwi+;PoRi|tuf$+JRqk_te3=b&>1KGN at bi@ooFnJ z#tdYan6kGzWCjX{VD!l__~sf_DbKiIOuorXN|||&$i!hf!{{USfe1Z32KjiQbaRTz z#c8x(`kPFf76W1){8;ncLk>&O|E^^pz!gt!JDuQTiFU?v1AC%(2C&5O&?U4<>~Q20 zAVhx;g~?-pQ62vF{}-)BL5I&T&UIeDo; zb at TlEoUeS|#hm}k>j!aw=cXz`K)vwDD5Nc&NMoQVXqsxMgNRrCO^FwE5XCK73Mw`#b>8JCn52}<3e!@8RU^vTT~x=wx9(8{_G z|ELIb&#R6`X{*<7fo=g%c8nqFw96|-nwCfj_E)x7yB+A-b)sraTWz7OdR7(0dYJl4 zYZZ^hHXS;ei%o-~G!v)ll70HCgq4*?WH7U7Obbq<3=fso-$XGz6%ZF|z&CeIf+m>L zO}aNw+C_0*ne?uD?ibmr%PH5S5e|zi9J?c8UcQy7MEhgyI|Ve#6&-N&U7K3Q5FZM~ zU8d@}MU7Oy5OAyIr*dXi3kubTC1EH#DhY$Np_;J77{#2o-#SLmFbNv%tTRM(hM~$> zW(w2?sf3%H3BnrvC6ye)3;SiKD*=DV4HaOZ(2~q5ENQ+O7JOk_{xF*$i@)KwXPdp5 zp7Z7~(#IJ#0n1ETCE;L&e~wI+LqF_!3&xUC3sbWK9sc6m&}IsX at Dlu`!gt((eg%2} z0%n10^Dq*C at QWtFJi`YtCPB1WAT5M`*)d at 4@E11-9D)glKm_3n;NkdWrmstHrE(RM z!dp$L(Hu?z_X5y+ub{{Xc^d48ZpO*MUJyB?%0{ff+=CLmCiq7rZzZeC;|KfYN|64GY z{_dw3|IG;d-)=nrY=DOAy>i=(($Nw{Kt%8YR8#3$(5eMNDk(r*0^gUrl+()7UD%Q zpwiwE$8bG&Qq#O2G}6X>LE%w(j3Q2Dw;!Qk3RSvh5cFL4Ai at HZETe7v^$>69>NQL- zsW?^bQai1uZqpdAdRehyrn0U(%Lrum8*C5jw0ag3@}Wzsl-aG~l$%2Yt#%tFHPR}) z#?tIP&2n$q&9oLd!%WPRhQE?UrqKbXZtYIpraOTEtDe?Khi#~Kfgwgm+-9<7dG||u zqIp4cB{A$WZbcVnV5jt4ZQ`@pT!|8?uJ3{EG8ZR?@}&FCA|Q@@B%Ep~k!9KU znQ4uqZ^21%k?5R%LCgs<#JE9Em at _5KtWfWh1r^z_$ygmr-#m2Pg=n|fjvwcpOPCo0 z4sZvz$BwnxYc}12Ai9d~au!4psY*Mf7pCp&aLyO+jH+=A*JxOJ(A9fY&(0|(`Ka%a z$EIAh;*Psl8||h*J5=(Xh+>uti|dS|>Zmpp8N(byQJ8c1BF;MPIfD=+*Ow^;9j(J1|3YWJ}c`ZUScnr2!zt?a7b zbb&VwBPaa9e~4U?h6Q`dZ6T5rV at i4hdX7v%00SatqUv|xbb!NQh(Jt=gp)>k{75V& znx@!%cZg-d(uDTw1+6#bE55}b3 at e_)q2f*!=1v#3J|+0#B7 at L1@+){nn9RI_58*c= z`oKM;jpX-_fdI}`3^S%6#0iyahLtR`0*S&3t)t3NG8R0Q>{_QBhutCZ5wdkm*g`3z zY&JBKfG+ts$VRs~S4?lo}y5<*KXSqV#Po8e%4U^#<{E4rKTM*boHqiA_H zzE|K+#WC*g03g=D at LXo+vpwhAPUn~PTYP>%oC8rbN}f3*Y|ma486L*_6_G?jUkY4I z70jejrQkshH-3n)(Jq$}O$+u=_sQ%i8uv at P=xVT+626yMv4uoF;nP-R4|Q}RgNaof zagXt+kG_KJFR$s=+P2HK)CLRdZn!|DB2JwpvlS?5*k5-(2V<--%n zlP1MVB;&H-FS(j1k~N9OR}3f7QCjp%-S0^4C~n)!o=ws!sdL`W&e=LN9>>XsFFF^B zR0|1xB~AOzaa%-)+X=^=0PrQ(2zT13Pn-L~MK0*nC9Vjg8=*E_ybwH8lMAoXJJ}RW zCB=IfeK>hN*;Bh6gKD{5^p=K5r5B zq|d+qobN*2EPv^ry5zqFs?}Y3V<6TpWetF_5$_BE9a3$=UK#97C+AVr)?mXvL8`0;zgV%xFdl4Wv9%On6fsBM5H%M>8kIF=Q~yVok+(jFcoxtLL&p zwrs6rLhU-uSfAadi?B5EX2VPt%rG_Qht#yg->^>=nJ&)IAQ~&OyPC!mrFDtvbxa{_ zwJ%u0JvG@|*=olE%`dCK!92sJ)n!F}$@tou$b#J8;!P37ydtCpK0O)ieQ0dVnYZ{DcOPKAhtySzOIh7%wqvh7AtK!0 zFKiiSo*GeS7SySQ_L^6Z^t2E581kr6`9z-l2{E1gnroIyK`!f~7<<@_4nEg}z~eApdpf$u&U zb^`PcI}rW#1ZUz0ndweApKwcO_C at AHBA;-2F7pgiD4!5izPX=36=ZP;J_KW)AY6Xt zW2{2{ipH at omeMbj(?5nn-}%Xmmo!gb!$}fJE_aM~gS^}kjc`{?ro%b1)uSD%t`BAD zK4%bcs)NBs z*J)b>gV%aG&8Au|DKCuxUJ=MIkt zkX>g$HggCDen6PfhnljAmOGLn at BZff%J0m_zx(?mpZ^=k0Xy7t<`5VY|1?pEIi84* z$^aWbdNod?b>uD*<0fiwe9P!14?~NIi|K~hBErhDmF1Iwff6OZY(gq$+}MlJ566>O0**df~R z?1K~#RMVtuY+tD-ak$Dl5 at sx|O at 11a@w at 8*>fyGFK4#ec!lE08*<*QYFHfNW0xlQ!INt8P zpkeT5;=Sb=M0f4B=4r}`v#G$`O3kl}??qvz>c}uDe{whUGIq;q`kdMsrkr!&OciAO zy71L0u(_omocrcxmQ+Y6Eu2(XcXNhExz8=XNreU5>1CK{UTy)d)J54k&Z4(D7h9&Q zm6vu5wC&(RVLx2bgmoZ|Lahgxf7*@iSWCopB?V z^RM0Hb z4apkf<3E3Pxrp(ZD)`aOcYy9GKEugnTi%|cQ~Iy9Fu*l-d-E_N^Qs=8r+M^m7FCfJh>+ zkepH*Q1ntU>JC})`{S??{gMON70Ofza-TV!{E41GC(Hd~e>EEkZ(=0R$x5C9ohNvO zjzOsnS9pb#j7&}$OH|7zNFFla?ck!M$m$zXa$r+MtY&*eXXIH`7NQ}?Vs`zwRw!20 z at QFQ>&xC6^LGcS4-5WfQmq;b5SV~o~Ag<94+38bcX3}o at noT}cNYpm)KL}kwqJ(u! z9crXLD63A%JJ=(Lp>x$J#c+?`NymIti|oksU=p4MGl+&Vu)eLJoU^E1B*?dvX_UYbt88<{eFCjBidH)3h1knG>J3ZqB5C zlQVCEh1MMV`r92ajo_yL*4!NJDM3&h0WzH47{A=a;pOtKkevFL%XDOVw^7D_t13C@ zzi%VL@;}F<|LlQEv1_MM=!`^1DU_g}3OXXSBxM9a5>`Z(!1u|v8)xF!wQbWj@(+&e z4?#z!|L-fJ9%h=>0kNdnyPSV!-EW+q*Kcq60cs8_A%UkcOA_%18K8(66j>bTh3|ZU zsljZ3t6?^Y>zr;yZd>WGmJS0AG%C3CrtQ4+lp(W6($2PA_YmFkmCYnnOQ?fk!%9C5 zyb8w>b{?@ze0r#K at 0+%(p#AgLQ3;V%=MSsKd at ElNGhpCM!U18{px05q%Z_s62uwJ~ zvX3cAa|ZUVs|4CSx|6lbA;LYoYrR_RIs at e|ZTh?>;yZR>OPbt0xzUeKhOmny+IL|w z%8W5#n9YT+T7SYg(aRM!_bG4Jr?5*bZYIm7gX`pX-ZXxEo8pYQiYRW_uGOD}rKm=b zZ`ECM>2esabV0z|iXZklTsAU!>o2*Dv at dYR-%WKFy;g>3*A?}|yJmF}aXeswtrN8%T)4^b2v zlhhIm!Y5Fs^#!2z6W&L;GK&z+BJdI1zJeWsS0O_3ynDCSsH9!W?Hz^R2fNM?Gu)nx;wfGkT>~8gCrT z<6``fli3;L$t5Q)c5gtai=J4_8bP`-N-BXIicuhz^&dhqQ#$<@%NxD(P#2 at WtkV7m ztg`-JSq;iUk%So>(O4;w{mUwyF(%VrR=Y*Mk?G0y7DisL;+gU^*RTwXC(YdFeE#G* z_hmAh`+t2u0}o*3WiT}42&0W6!W6RrA)5lfIDzc5Hy91DHB2!$PN)X%DfHZr=DBzf zV4zvWtv7Dxt*Z@@H6M4nMZbjXo~d9mWiO=;q75rKGW4#PNZ5OOqxkfY>E2UawS?>+ z(27oo%sO{iIq6?`!juL3ZW;pwKMlEt_SbsUlS63AO`Lj2L6SGP3!_fJ-9AHMmpEj& zcV9$|;j-UZ=FqOey%M$$3s8BdyF(-D(e{!?xpW&2Fyu}cWN=d7SA3|S>Ld-D9h!2xX^jzA8O443`Em`=mTE}(*0q+dj&X%P2za{jO&?dwt?nkY zk2p`dcf9etvCe{@>M-t-qMm&BxensFm-nBf;{1cuhCp$&GRNrw-8^a4 zWI}(xY?r*?=f9*z{&pGOlSGB+uiOqOqdFJLcgOabT3s?7Vt_$)bvM~2iU47dL6w$F z#p893&?uFgQ}WI*cO5n-7I~uIr+n18sXg1v+ zMopGS!1)94r#$R7vlt~CfAcdO{AE7V>G7n+*Q5LHIWi+Rm(rDh(S z;nHl!Y at +o|s7cvUO1=mGp^NC^v5q>`yMJ6a3tX8;AC7sFN@(xwPQi!Nb#)(cYHyaL zf*DSj9DQ739!!1In+cKSB8cnlUCt<&QoAJemVX=^D4pJ`kef75zLj59d{KA3$jFV? zpXcKpHADv=n!3Q2iUKrw{V`lXEXaX7h_rOzT80&m9l>Fk?%XlWnD9qfXTo!TBbyFF6JZVDoQbI*j#fk;3t(Sxdl55k+B|?w zbAqlSB&ne+vDkNHiqcby%KTu54HBGXB1`Qdq0GlwKD-mxtzb?g+n7yHjo2TIDA(0NXTU0|u z<9y2@;l at g?`pOk2ZtF-uK18F+SlLoS(dQ?uy+Tp41LE_f`G5(Q_^+m5GvkLnO|02{ z4;Y3qg*r+i5(7zK1Pyb8MoJzN?n9j7NQ8!uA}}Tk09F#*6;*kb>>y%%CdeRspl2-u zvjktiUHK#9nhYmMfI22mY{Mug+wJAHFhwz`li}j{y8BUx>@Y$bLU{EiCTPa1unc9` zbuk!KR at J&Gb<&p|aLqHR zrxHnTq z4t`O6;e;df!D9Fzs^k!EAzD3p)HY~mJKff#_5g%iFkHue$Ju>;rgf9(cAb-LIqwtS z`$sF1#xD9B8jo`!n4 at r{CaOXMqO=~+`HSX*o+N?0ztiiqWop7+*2901#{Fg+u+h;y at Zaj8w zBKBp`2u9IJYSD;#(TJ?lA&%1F=9ggfy)~-Y)i0zC=>m1I;O=0^Fo92`rp-=Y$RM_? zw+rMAux7u1`%4Fh)GP$=ubS)qhz$YuHkQOBoqjl(WIEbCAplsfQ#p~@utvL at ug2N4E)Nb{)DFfr-}N>NMuu)>~To)}=+^Es^dKn_{@*m9)_B6)40EXPfqyZe z>Oyq%19tkm{_WVfLCz;P)(Xek(dHp|mLS#}*&H;L zG)8ZpYRr|;C5a=zP9NLO;3!r(MbDx0}}z)MzSVkYLXIK6zSEO zR6?kAJG!yF!thHZhYcqmnf*jQh-IA7)mvC8oG&@Q-nyD%`8_o=^YQ-i$m36DOxzX) z#Z0Ubmp1`zCDYJ7Bsi)7R;o9lKpux! zIPw^o#|+{Dm#xPu%1kDyaek838>Tm5LNc^lE{=!03>Hz!XmPl>1sU+|5Qr4?Ax>yO zWf at RbX1<#=D;>G&(qI>1jcbujQ<}HX at 8C?t>5qT_n|p*tQmAgNvd5Ye$vyqj;6R<` zn%Ne)nyw~V&NtYA)9z0iUZv$g)0AcPVWR0ljHN?@6ly1iyX8 zvEr2cJtw3ezNtBhJ)7s=M9qSo at jl(wmbS~}pXHof4|PwoP2o+hM2D`j1F>>@9|i8T zik+UvlN^!bHo))vb$m0DxQZMS9UQgz+JR|ZcBT at GaN|g6 at i^wwYvuj?Rr) zhd1#qd4wTNf!_dBVFy&gCADI7=3>dW at nQ@XHDR0Oh-)~oIR=RaOAI~`9E_5woxR#Z zQ1d#@Fxr3%KXlyzCt$L#qdq3(dRCe(7uPR#T)W$zEDrxb2PQ$+KUw_z-IC_>!n5>? zuDwqOpBPgV){0JT8{9>awNEOy+{{y-U}Q3jTd{MrN&N+i^9~RB&s`%0{=9G5;`xkuw zs!$q_ at EK|3{a)!M0=zrX_7ELIA7+VtrvE5U6}gt$B3&hqF`KX>NaH-66vay3 z3$QEDCE~XLB7ewI_MnG0f+GzSmKzS&Sev*~U#M#t5>rfYD>>7t1=^HRToIPM?kHNA zJR^2ntb+haEq>xduKzCd;T8WCZ2H|To$N6r=efEYaF zT0>6b at 5ij#oLxWPcW}l?RV<{buu*GN=93Pjks#YCBf)_}%5V%a-jq60qRF}D+H{y~ zBHfL}r)HT!wker at cG;RvpiR8s+BVxoIM-iT8PWjH9Yb%cIAm7KEZHDUmK)lX8Jj(` zSIKCVhrE4sDka^edaT~{6FUJR3AXAiXqz=@yu#MYEn)7I>4zGRB4!W47*z8BVx at 7c zlzrqOo=4b&SB$JJQ)sj+yqP(5X4=mVMLH)lX_`#ZbB6T}Q(LPTqR-Y~qIp6{MpTAe zRYP_f(|JfI1s-4rsK3Rxx#DHZlW+3{$J`>J%gWP;EjhfI-qPe<7R*Oh{dId3vo_VQ ztsJe***YZ*L0uLqw9_`6Dk}vH at 9lyjp2BqM%8k_N(f9b8?)QD6SWGo6+`wnE5Plsx zE0-J(VOdt^>Em{|V~U9=+YNZ}Q&!}P#%E)(#erD%D)aLa9geCAZa24UJc!vi^|>G- zh;0Sbp4S(gV*iI6u&2 zIbzUZrYjuOnXbDp8D}i`JY<|xgHUzAA3(cFpcu@{c-X8H6z~Iv*=mD^*ow+;f at 6_? z7D8g%2iI^_qk`6_X?*vmyoSa5ApAIJliM&jSV6oa^(lWK(y+Wh3|Mjl?{x=~JOC1j z3KH7{yNKN%_Q`FL at N5#J1hd#SXkjTqZ;{~<@#K6&34MYQ2a!5JU!bWTVDk4)5x|#) z!#I4jpaV011U?knbkw74>nzA36ZCa!_NoqEBn<}WjwmVx}9nu-i>m5CHsm?``t5uAUwD}~km(a2; zg3 at _Lgze=pIk=sUS&|E{9~5Yb&wE!)s?Je`h(}aIJbg zzSa7HR2_tJs(24E1;ido?9XsUP*S}Z<0 at 7;Yz>#fPT(4qK|h+|!fYwm)$BO|)BYsR zk5^H at 1QNB|rq$e>bw1XdW82uo3RY{S+^EP at FV6G8vSSt;%juX)HJ5DDH(7U at TtH~G z*hJcvlyhtg?e->OiA_n|68}m8Oxmwv-k6Gi)3Rg~p?<2Fi7UfO`OMqgna`%P86}mh zFy&xt%;y5S- at uR%8yxJ;J#)CE<}-u(jDY1kFNl{vJ-<2Qm<2M}*r2vz4>zMpHXbYn zAD76OrdrB3n`z}=Vw?6?nt3mpYi4Y^ggLorFzi8+qQ&mkRVNVUe_tM)-+W?m%$e~_ zDKTw^{qB~NVBm1h1lA}j7+a3%z8H$)0$o5PoAq4sBC-e*i= zwDkr!cJwLfL!vcu8LoUqyW7+$r(B9&h&ubq*Gk-_k~NqVVX>sj+b0YWtKuDAi&+xL zsA^qMqc1(Yn%7<##mkwl3JLvYr{W!HgBJS>PuRowCxkpEy1eQSh+UQ~Za9*`>_(^w zd;UBY^S;Id5uD9s*={l~W(Vs9iWumzVzQX}OF<(X)|&Z}aw~+vfy|)NhB+9n{aNGY zZZmvl2~!7L_&jwgQHPyzDlg`V at ErlAU3*B at H@m7#KX23kiG42B7_`Wboy5d5JY z{0v}iSAvhAh?Sy0DGDSj7COg}m%BuuAFD(Za%{tm0bEC3>+GIrQOEawLR^?q&k at GI z?G5?00h2 at hker6Tcp*2C=UvEEa}|3|A5mdZJRck*El#f(VXNJScgF&ZzGKr6a|F+}W6|gY>kEkoR|6Gp$b(6bV#YTQn0oC_rZN&vO zy-Q{eno{{W5ET)1UF6hQ2-6UB9qJIO(~%`Yr?Uz#{_6+>WquFp at E;HGw`>vFEgAb# z9<#EYZhmLA?)+1Y+5T at e_Cy*f)cuDVCsL;WRpaD;s4?Qk>QwLyBEz-CpNtJ>cxAe^ zl5v;SIyzYB&Q4%rTH;+4ks7N^D#y!=*rIcEhMJke3T-3 at Y{?1dR(zdIn1`8grL?=8 z*<{B05rS}j(I#87<)&(4WzmXtWbkMKz7bcr?L%;Al6gRwiX+gZP2?B92ZZ}4MCk;e zKd^fc>rEOsyvu5ZwzIZEO|A(k)l!pgQf(0SWn-kk8ukr9lR8Vyl!?}Omd8~_pse$) zzljjq;<3ZyhvTp#4ykxTX$FxYpBMXMjF3Bx at ft^LG at r#Kqx0rd81lM3{Zp`jp1 zLKB_y_46D<49*cAkqzFr*@fI0+`!^e1SAPR at mUN8`=lHLSdpf%%pw{gaRJ+X_VIdz zNzS2Ru})Ec&=;_Aka3MS8qjnSaI6?a*gYqV`-)IpyWy7j5cY8J*HLcoLy8`+qfU8G zkne^bhO#Y_>(-4E=Ti*9y at D4dG&u!{@@K|Hakh)iQVE;Rf9)Hja*lVH#Vj{;GV-@< z*nMorr9jG>MD`yof(t+ivAMV4UzlzK_j>;dA&vQs#(!)*`ThR}A?AN`v_39)qT~c9 zte_K1K7?T4qU`frp~yf)qE5yg=i_Ng*XssXk&HDI_ at 2n2XA+!!%y zI!w#0|8yy?kP5;`1`=r5ZF_}6mmwE)W`7{U5?oC)OTL=`W0wx_&|;kO8h6sJ+_|2% zNp6&WFp1-MtSIN6hD>hWgYh#(jNeh%TvnL2H0^GXMz7g=HqeT?Op4k6u*erzr>U4` z!C4Z~QO3*RQTHvF8Y@}0HqR0ha?$0=nNPYagr~{KFj()<)H$4qX|CSGx`*{-D$0Y3 z2*k{xq1+1zE(kOsCG9fCyps^?=d at k)a)p7DsP%9Q#T=Qnj1N`^IGqNVY4G~30AArz zWhU45Vk$B{2K6x|-~VA~Ur`QtgDbZj_^=>RBx~_-9wL6kWSGF>3SC{N5e*LcsR)uF zEb^5W2Qpxz!GR(c+vGRimg)gkC3s}EsJ&~77?Sxxq-F8 at Qr{51Fjnn at bBLHljKNmJ z)xl%=xB6rY3h@${!Uq2$=$q&sUIBl>V0rCb at pmMBPLa9L*f`K!#5=zmA@@V#AuWCz z at P1iBxwm;1hLz1TN9qr_e7m at geRjFN@lku`1c~N-t>ST; zwjVg;(UPe$j8_HXH>7Z z7ql*H8)U>jh$IX^aee~LFQ&F*OEu=OHF6LAuAyijO5*PglK2vAgj)#MgvzA?y!OwHYq34o%0Qs6I3TF zu(c9~GE5fqF|~%}T2?uTyTg#oTq52}T$Ec`033xuAj49Covh|UrYJOLWo at gK2`wMx zB>06WjH(Dmse+ox)071oF!C=l16DR z)BMAcL+gog^QyZayvXAv)i{zIxdHIqmav_g6uFVzzmaWo$xq)_=~(Ep=W_2AS1nga zw0N;x=->_15-*RTjME~vjrNjfsIhDXSOc*ZNB}5*On;-M)>U&)GfCTyf3pWJhT0d7 z{WR4a)K80fa-)T5fK{zCqKWEElI|w9jyV093r`sdOu1T%i#`7Y9Hb`&%2vFZEY=8^ zuKCiab at 2Q`GTYZ)WEkXK6kr_}6cg913$f+aY;)3(9d~rRJcjO^;ixk0E>L_`ERl1* za1g9fazMTM%&}Hb$aXg#LCgHZ at kK4< zho&e5&lk*%3Gk|q5|+}cQG5dqVwdSBSByBY_z*=^!Gv?Ul(alq#N-xtMf)^y##w!J z&CPc7yCqhV&b-E=Zyg?Cg?#NfuS}C*hrD~8x;VV}pB^fJWnWK3K8#S8z*uD7cKBB@ zU(yCchcsX{<`@`=>4XzMm0QDh-<03 at LHW#zk)D-4XcfHwjzq~6bVHE at p z@>r24ApN!#?B2x8YlF1WVj$q$EvO=(7dD&0EX2Z>w)*W?fdwc2dpx0G-Gc79B&Z#EVuIkIIpNj z1hLo(zazHz!1$zhWI at u&nIXbD;&l5Hobj!exDhH17 at kqLDOTe{e4prSy2{KGz at lX-rVY`PF4Y0B58;Ohu8ujTD?BN>J#MH8=hsy z;7!-Xukhv$@?S{@d^gT{{;zuf{Hxy5{~780&l28vu-^}nRL at Yn+9l1I{Wnm z;Ao}{d>CRGd~g=u-8N6lQB=MJ+`~;SWEYfo)Z9djp&0gWD_j!eGe4xz&T?%n at Bx)H z8?B_4TPjOx;NI04+RY5ho3fbxTri`g*6?qD+0J-%OQKP;1uk#l-}TWnq4KPEN0aZ`agI%C7) zB>xuI^D^_oB%i&E4J!pmV at UcNJRW$kpmr*-W{ZkHs|- at 7kq>IT5p)J1sFF@|4B4mU zw&a*<IDsEunu=x+rWH;n41 zuNy(9+l6^Qfr+2*2nU1_7(_XzUt;#D{v_erF--^A{psup9S3Gb3Xve3&Vbmki-dOf z&G3PwAYLAC at 7Cuo-qamrra3c>_{%-huHaZY{uccl)RqEPgcnbx2 at 6p={fc3zr=T?P z<_tA^sUR_KMCQk8l@#n*!8ch*O}&|e7(2WnTvddI(YaXFp9NwR5}h*t<$EK{KMgeo zjAI`#{uMbQ5lBsof90AV{y+A;|GNHPt!|@?ql)TFPo(MC_+uh-xFw9W*yEd$d2tJj zipU&vzAEEJ#j@;Li8RN0oORhU*2huoncrT}%!8=&NcmwD!MkG2sV%!S`?eA!q43SN z)2vU9(+uC~)^zXJ$0voqg*Sl+0sqn2sJLMY%)U{T#2BOlf)&w=152>#R>EDl`%97$ z9u5)sFD!9{TLqY)Q4&Bs?-r4mQ5_ znhYx7UWXbjjcIoU^GnDM2_%;?edV&KPWkdsiOF+`^Q4hlxk#1ld33T$r1$)sOS8VE z7*}_^^t3hs(BDI^QnZAO60mO~%duS1kzRdSqNYTRd~e(@6itY=Pzh0(M2jt^sGi75 zhh>6IJ7w%7Ot*l5RPPE`(4 at 999hS`@FEQ_TqAw{_C`~A>l zOIUHl$DFz4&flOfQX7aMDxD4zkog2gjB+&iFQPkpVz)!Qycrt8)h( zL+&wZb01ri&V%i6L{$S`igTo3tEe=U+o}&b at o8)6Oj|Acj-x4Exo-R at QJH^+cc5=a zC#iCkOpQ=obBlFKyxIL(YtGw#GTBcCTqi+Ntn$R^S!du$_X1#aMcH0*477s{kRvDV zzZ1z6G at KWzbLItomY)d1?|5P(go<+HdH5R_x at Q_2J*X7TiyPVT{z9ew#Krp+UV8T- zMNBZW=oYJS;sNgQjn5keDFI&duDi`Y(w_}Q1uv{)#c*bWaU9!p=$t12Ceu4WCf_hr z;1m1`BUDKPTDPg}2pA}f<|1i`p6#DaisizN;J-3M`75Th5emN$XE{*Ztz_P&plvo<4Ay$Pm+1&4v;?zEqfza z@?5X8TVpf>O?tpW_zTv!Cz?rj*hF`b&6aqWK+AL_T!H+Q{xITrk8!8J%EjDi24-rX zdWQ at p1f{TPWv=(+Owa8h#0WrDbgh4Ej!J`Y^$B;YtD7+KZs6Pq?u{sM|V;+ z&12yfWO~c>Qy_t2ASPd6&WR_-Jw}(uc|Y8Yvw3zJg8U06>&yCAEW0b$yD+-|g#gA~ zPqxP&EhcfRop~*1$2-V#Hd6xqaqLuwj1jDcZTVh at 9cb`#sHs*?X`b16>)@3)b9Ol+ zfg8iF#>k3+w?F^3C5!tj at B#RjIk)~Y=a2u0Isb<+|NMh6Kj~pQ*G&SN@=@uunk0mO zEEsBAg)fZ>$BC;V!W|gFSamozPLkpz2 at Ln<^=@G0D`)>&oq56FIyB-nb89?;C=M`a zi*>sB=y96)xRJd-_3QokwnvT&0mG{>A2jR!&>kWEQUFGyaXg=Dt)2KQIRX>^-dJY@ z7=hq--y9{o^A;UJ?_HU2%wyY=nm at UgP)~=L%SN|KiM=UpGRX$_R^!iZw<+c at u^>%W zNII88M_13qZqzyafi{R1x8htm#c$DnM^|q%$b8>n1?|jmbLQpQah0K#!7c|)Nn^UR zvh5h(b*^P+>S9nZ!F;Td67M8CI#X36E3-i0z>C0H5itIvCPxb{=vNFvHc8D8XLFhp z?0MJW5gm!_V4#um>8~Oh$yCV8Nyal1zOx|26Cr6zTqFwSllQfD!N9y7Hlsk^-K;&2q+ z^R@91E*i67P29y zU#QlCGN=5=p*Mqh)!Y}f*!UBD^!<`}*{xhO?vJ9Jd^$Ey|1o7|QARNvjLziVe9Esp z=~oPkhQ|f+jX<0SS)`pXVXHy+=-ci&w`6Ny%vMAbCdeaASb2NLay_J1vZAE5vVp>d zcZhGx?$IGI-fKL at B>7NvUV?Hy;51?gNIKX)F|Gl*M3EF>G5Ad7xK-F81ub6IV4ppV z_59xcUcuE0*eGL5MQa!$dw=)=%2`E^4-*QL^-~a3Bb+J167rXAXk!&x$re>aiyD0- zlpWS_`@+;Df8JnJeFH=;+=f=p?~(`*My-mLMa zN{})y8p|K84{Q6_g!VC91O1>uy`)9I4UururZ-5 zF;5RP7bd;!#UhROQIeHNQ{Y_MCiGMjQiV(;UY3+ckb;g_hDxbALqJ|7_Cnj%a9>P7 zW5J0S497219oDre=5On8Lxy{+=;JY8OUUoAAMuuYZ(t|_XqILN`Y00a|834s#y`(t z4+a842lKxlJNmzH+<$%f_rJ7NYXAMM28vJ$Eu4rg=ni55`8Q1w1xBQ!3JGEf!!7|@ z18RC(*YYbMvfm(wUmu2E6*3wDZO#YfWDXg4e{+F^Qu_Jz->#~&w3K7l&-(*%4>kuX zUta}a#EflUh|hdrC?V0N84EIEBD0qgM@}X)Y0ODtpf->dya{N=$v~Q6YNA+ef|sS^ z>d2SV2KGC}*rq!G{eKI!4hkcmUX zvI*#z7pAhMZRsZngEGu!XiHrt$M7`?8g()mKe1iDPazNhzr&T?;YZk$=Vx}X%-r!h z;`;9}i8rDSH8oFQWh8Wr-zLM-bfwL!0Tx&(s4PH7-Y}mk&lbFi5IKwbi zr^G6nKjK~XDCrQlU{b~nzZ~9}%lu at C`-WolwPrIjl&O`-#reQ$q-c;A)OIY*O?7pC zYLdXI-+Hl8N*%Sb0aJTv__Flot!wD#+t0bC_rpnEDF%`j)ymTjRUlB!jEZR?hxjWl zG+E3vT5M00w>%80soO$DAt>g`^I(V|bTpLg2_|6|G)&DO3zXyf!C*8YzWvm}5wmgz}%Nd_;J?*Jol*Gz+pFX5ECD5CpT7dbTDqnMJ+ zL}33M)~j%6VNgYQ7(d3CQ|Q at Q6p3POLv`U}m1&YlV&miL*0#7^;LZht;!Ct=zJjC3 zE;SFwzJuLK;nxE7g<}fU0m%aptXOTEBHkL9b76c|l4=a*@>}dhh{%BqB;(w74yP69 ztHUW;St_aJKfBC2{MOQE_ at R9_%wKpCWaSPV0l^a58PH5XBSP8Y$|`L?^)JCVcocjN z27$QCWVYAaWq${-t}tH_*1?DG!(AxV$KE~Kk(>=`OMJTBt#;MMO*CQMn>mkd(mOoU ztE6j4q#_b^AT$w5$@8zK`&8~ksQL|GFl)lctw6D{O2#0hu+&Ll8wxY7w1T~&TW}r1mOCa>w9IK&<1aK1FdSFNNWm{i--nnM(`Y^#Be09i+CiJLL;00 z#50A!1rQoaM7&b`E3Tp5b|}IA;+hlse?M#W{~Oo;^N96Y?jMQQ%2KKHA?Qn%NZ<1H zE%J+DDO=R?z1I|?V2WVKKQ$&aR;}G6-J}Nya>p=b??^1YK?o+?%{J-jsOl{`&u6yN zoo>0 at OmC)gdj)*KBo5j!z``c(h{=tmmtP|-U&GW9l1QRG#eRz^&cjNH zqU}D)wT`72=u5X!oBi1`T)WB<*a{PZfzV!`k;9I9tvM+D?y3wGqC!sZejv-c1IvI@ z>aDYgDHQ+CbF3n%LZ>QiY{jH1EI-|As4tpde$B|$f+r!)5~#07cOIcy9ryI>2^^G? zQzEjstfQJt|5B+bH7Qt2h4wzjHt{vy at IE+5Qj&1Qmxm8H_;s)->-c1jWG&95dTkN` z(?kI2v0J7VkyVl&4A1i$AH$b_4ElvJuql{=-}o-cRrEHKILp`{`p;CTi}g#~F!`X^ zZ2*}yQUDik_*;by!$?Lr+ at PzIsXgbUI=pdE7H6OT)K zzBSk?@kkds;WM1qe5Amfx<#63jZokHTW+`ZdsLD7-zI_b?~%ZN0<{16wR`&?J;Ikx z!+1jGv2vfGVtffJqU6Sgm^5RGn58nm7M!T`$A&e%0nxgND at Rn<^LKl1h4hu$x4s}e zakC33?!%XpD7#Ovo;SU)Q}O`hF+h4B>GPJ;>}$4 at -)YwN`{QnHFBoU&G9h=|(b*9A zXr%}bxXk^G5>dk=3Ov} zV`Fik8Tz9OB%P7wfFy?VDjIzdGab8yMRo(PnUk(N;G5mB^Pm|PG7C^A>ePlu577ZR zvPD!npAf*%6M72#E-ryQ5NwgI8?moc#1$4VDn)B^3NAbvWf9)4#6*(?!KY0q`y6F+ z79zUMblg*+V!QwtFF6PygGzGKqq{$O!}siJ(MyniXMSqTD#Kp1zN$?K* zZMw72ogl0^gzdNyNqxB&R?sb&;}f5*>LVPB;Y>r&8?Qt5$Jmr~u+Mt at G@b<*XM;&L zij+c>860n+FU*j1R8niGcRwY>s{>=Zf&O~uGTM~gq|;Cqxg>RktFuX}<~-|)>50&0 zTA}60tBK)I;2HVJE$3x+4J2`v=e5|OKR65LDo>!cWqO%J2dEM7Xhb zMLvi1dh%L?9r~aVn9s#8>l2m=>T3>KOf5!d;)mVgS28#9!aFTWP^)1QM<a+mTaJ>C6fAL*E@(bZMUN=N~KP2afZBMJF&f6Pl<*A^#!{eSgdN!z$0&I0&NC-UMW z@(MQeaw>86*U|fhYroTMo#-9X`-RbdLDG14dhc5$FI8fsEMSRDsOt_wi=8(Jj}b;- zQ0XT5Qboth2}b$y4NKgU1VlcB at k*0QH9(G61d at +exaW}Q3}5hSeq-1dYQ|S~CMJRK z6W+w5cKWlQ;q8 at 2-cP~?v$Aw#a$hA;yQk!VH>%t;LE6a}YHJyekl-n?DyGCxjq!^d zIe?Ju5Z5zl<=+#H1MG~$$`L?7f~Y`1xc?71>z{T&3(6a173)htdgZ)m5HlzmBFzNF zdR$)y^RZ9A0%w-PhWxF&ObZPJ>5CJysx{V_>gmyo<3&-%G}()&~$q)3XiRPY5P|_ zULpN_7h~=AH{YM|fIh3CxBGv5d7}wlkcPf{9E$V5V+!og=H8!vf4w&IeaD at B`33i$ zkgCUYwb~_dKWqLHP4MkKC3TnS<=OlGJO4Y9-+}!2<1F?kas9^&&F6^mXU#qV|2xXp z{r>LDcZM&MU^BLF3nI|E5$+Ba1F~TSYZSafBoPCZFx#Qa1L9G^xnpoaD(Eb%iU)(9 zOo;+gSiF<5$?hW*6GPU(X at hr1S(TSM#VOKjQL-SgcXoM{-#%;9=!`{DC~!V&M5dO8 z@!#>>rBI|<>s9icy+|{dQBD+|%~{c~5MrS*@#@pk*O1{U5>1u*wk>k<#2vgEGTrz- z_RlB>rH>|Uxv{YTr7}v6tgdt9xUusj*lbYB at D^%xpq_R| z3ba|+vU9I*pfOEPE-ep_txdn?;~iF{f8*joQ%pmW;p0*6pi7gd(v*7RJqxZK`slGGVk{yr*2Z!&L>op4W|%De^}S0Uz2OVE|gpyFP3 zhdHZ?dl0lDMVD-bab7}4wox9H&=CmlCF3`4P$gk%G;?L{MZ)> z?zPF|ap4r2sG;%qYar)Y*5dSJ4$HxmM6u087Zvy1QV5ep{rt*BUT_^B`z_(BZlePw z>Q35j<4)=#*D_kF~u+ at 3V0$dgz>*J?fzXcUU=3Xe-vu7x at 2lH@k&$N^zm1T!`u z3}Zj#nL;**iVj7Ujyr7bf&cc(Mcv@)VILh;Voo;getmjX*1TkFEkA%8LqGzFFJu)f z25~`tx+I8Tm^!g28jl^og&;k#t-?EB(3c(xescV+6=+StP@~$O{XIaFo`I4BvvI8n zppY}WI5fpmr8QL0)sIMQu#iwqOZt`tg$)<6`U_>j1;&XK8=rNNuDn`7T}Gwx(cPI+ zw#ox`Q%-Bgg+|8MAN+U7n+UQyiK~bLs3vP!dJ1=4C$Xd)@J9}z6br+wko+JHEIO%A zfjgrm5QRC2s+;cwzHr}MNv)glIE;ec0vh$GLqCp+zT1*jY}eF}6pP5{27zK=kbHa> zKXO>v;3Qk7b>0K)nVD_ZP2>JA@);=8u$MrOpb5>7N;!9#hqlew87O#2eHP3sdv7myWNb798z3#8CcaTzbRg&`}tEMQ3*uPvuJZ8cn8? zC_C+T0F4y|tK>4cwgvE#Vk6h_F5TjInBB_%f|Ih2Ru9DVPt1krczsoTGc8{o_o0y( zwmChWdW!|>Eat_VDRqJpS)1J@$Q*iyCu!3u zO<`*z_9~E|Hz*YHaKl}dcUIPs1gOJs1D5=7OUI(5aywk^*R}O&6t$=L6hH?m$j&bw z`3I$N+58364P7zxjDj1jMwc?eA!j)+ZK%ShpFVBPja;oJ52pdm#}-|w&Y8a-N5oNr z$l;rkbjd6SbjFS0aYwo#J?G8#EPop9f#5U7{aE+`TL at V*YLrpNWDnrLZcBL at V%{nX zp9IwZT(T^fK@{BaAhKn?1KlbLk0ZJmh6UqbIdTP7vD(L)&ka!vvm#5 at YyGs{6Lqie zyW%yl31e$wSkaQGWxNyHst$JnYB1y&?FkozZz%HbS`@4!($P*{x1~<3451fbXSM{8 zYr)qGHdz=J60wK73R|OV1G=KAXtOs)Aa`Z}w?2A z5G^vN7mA6mP9U!`SB!W3j-R-roq at qtiT$yoizb`*%T|SVWX at 8Y*SXcVxJvm>IBG zt$?9Gau=p#oP?qz(({O+m<(Yai3Ta9mDQI+Nf$f;c)h)m+zYCKEN)Ln>7ay$!49~7fTJ= z**~=VPCzwe4)h~WX1*rvA`o$Wk*#QiG@|631qq?yi+TCx|2Ta^&Cl(zh*R42vMBzn z>Um!D?EB?|SG{Di{0u_fu3B+Rq*cCMek+_NKRXyU_Xo+dGd+jia|VzT1P#O&QLOtE zY`dX|gA=!)3&Oek1hc&r$oKjRLB8!pB6~5s!~`ON9c30n_SS=nhMDO{Q&#zgG^f_l z*4q+d%0 at ReC~TgObN1|Mwv8&#+G~v;?&IAyDnSkoG?;{${YcB*BVrYhl}C`>Rwb0p zFtN!{PdE~NctDY*V}-O+L{OAPuCAL)s(HBU|{gb9{b}s{)d9_>m6n+ zsMI?1-9=>F at k4wcb~!iH4rWqf!E>k=Sht_D2sfor!1G^k+0EDAZ z#0D(qijGT~-zeL6HfW~uXsA=Is7AP`B3x1rXV4?MhV2?R(zm8%r@~5ON$DWi_*jeZ zf#~F(>TB1mrO>n-BeWc9kicG|hqzS2-fcp=b~cC&p;HlxX1E|XE)XZT$IT+c;Sob5 zNqi$yA{<5jW&+bev!2rS<23SoT_Va9?x6~E5LeK)tSHqHyK1{%q0c7$Y^hN|Hd1B3 zNeL!0k3qCpH`?TlnQ8 at _SWEKB2x&`Y9{qr-koWHePeMAv}EIi>BcT{a2N31UQnYEH+_N>zuU*%Le-hbs4)B>WH z4h?rOumJbtqE6zwVYM#9qY)K`0lRLv`g~0QcR4}n7J2b5d6!m7ud|HCOKrT`T2Yf> z)oO*-JGW;iN^Pr)$A+t%vcU{Ywy0|Cps0E+XJJyAzR(-BqY??11)b0vch%~uw8;i# z!97o$kawA5Xn)Akf(neOQpZvImeA8xS{KI)c=?%U~+RahgqCR2| zKahYcHe|bM8WSBRP8l5|{xIdC>IGFx;;XpIug^xiC}ww!bl5n-P*cEk6)Iv>K_|G< zqgHHhsZr0sG1hQh@};~*#}$8acCOKNOX`v_sA>tcbtj_z4RUIAQ=!^!2-XK><@|cB z$WAP at 2cq-Q=4{zbzqbda#5bhjfO{%YjaH0JZ6CjZc=I5v;Q(nf!q&2v;uraXJH1P< z6-$-*e4FaLdt*WWQE)_^ zc#k?-{W>b at ZJzf&ZiO0Tv$j7q*rj%8 z`AE#W at RZAmF&ldMQK|vo$C%=F8&0cXhcoM+XsQ+~qI~1 at 38c)3qJ!`)jwbSSkZ~f* z)T?$-0NI1bX7%LSzYk-|3zZ~Q&M_ at Vp2e1S=qm1f(spJPqR@|JOgAuB?sds~F;G$4 z(XV3>ue5me7khw?VGihVhL`k)u6Lj-xA}_CTwVl29m;crn}~bOE#BNY(qy?c$%cndFk`snR5fAGx!z`0}LHK8qopnps2sCGP(l}{8PmS zP5Dsgj=jeoS81TmI1J)DqmgC{lMC8+sJrfdx#Fen at l=d7+Oz0b=Ly7cy`hxN2}r^} z5eL4NI<$XcSuf>^lzwXRs(;}koaKrueSwNSG8~wGNV}JRqUsja< z4Nk8`Pf|g}Ok#H-b()B|pIJ7eosR#;)~rmQs*82}1rm+)eI6$Jx`_CRKEknwdOClt zOT6U)7F$yQ7`ut)NwBZog|F6StJw8Kqg#qr`w_7^7_l05 at CY+}iIf~3i+ttDYbvgg zizk?TGzpJkp;Vk at URbuS|9^4zj!~Lz+m>k9wrx8i!?x`V+h&Hpux%^Dwv}Pqw(Ymi zJ*TSP-S<_Uy6 at j=ZMF4l^`SZX>|JaUa8dSJO=?BsTu{P7YDG}`*B7TjMaa(??XW9< zulD|t+M=xG`_?pr9@{iL`sbw zqYB_*Vu2{ct^W7rLXWS$K+X7 z+{O*o8{m$-7s<(j{qJIJfQr+Z-{_;%#|oL%)gnNb&bX5jglA zeV?>oZ5B--M5OEOT+K--fmN0sCqL-QO;_|fzqizm6z;3M5HQR+lUDlSJ3W5=?aU)l3DmV`Fu4zrjJ<(b-b4MrecQ<5ZaZ&rp4 z0dt5 at 1sDjN5vkU_EmPAL?mlcojlcW%(sO$aiB~drcKcJiUkKMbCTQ& zh5*!lt=~|%z$NlVWJ6byv9P0AhMu7EU=aK=BKl8w`?ObQeC2+Z4;t>^@>Jb2!HidH(QLkq2o_d(6z?x zKOT#Yts2M^&xH>>pH43MkdE4LVhFbf1 zUEv<*^k1n*sLx$nd~`FuZ47SlDPB^DWpQXeP~PbTImYfIvpQM7hcDUVA84)^`hpBOaf6Ed!H*uXA`K^-OA@Oo%;C#dilvYj>xjmeSvuTnrJ0m6DuhY*tMN0V~t7`H63DqbKM6A0!DF@ zIrvS&DP{oU6b3JfYS7PCZI;CX>Tkj?HWicT%oOV_$3UbX+z*9`%-F}W=YkwzAS=ZEdiBC-$de`nR7QqN1m;@K?SAwK=cOBPt-F*&f9y zB)#n$w3YlLJ_(_;pWu6AYe7+L!rjn35B{Bj_yy#bblVuBEe(yBnC?8C{o{En=j-+T zoD=zSrdg(fp{lKM%7QyCW!CI at K0FPoIvC+4wGj1mee0eiX-)AqzmZS;(h$qSa9)!| z`-%6ifk{=4EtICiOoe4t)te1~; z)~EB%aY`GarL}2vAO9gNS1dCvx7^sq#`k`|u4X9&tk at 0A_@dtSrU^>L7zfu}Vv5}a zsrJ!{MIReqz{%mf--(p%G!sYpmNwfLFe~mh zU7lN4NEXIBB>x5V5tb5A5i8i4M>sFtEs$TTrDc$7_;c`Vr&AEu zW!m!lZ<6(1&ZIcae}U!;^xs)NsMtHXn40_-=tQfm%lH2yPviv_?13|SNXg1FfpPHD zBoD?}L at h(@`j%&wv|lFFi}g%G3iQUZ$m^8(huq9uOl6&BvChw5=T0*MafSH8yRlPQ z)Jhm^9Ypj>-CiX>VxdnkpBld>VV}!5%4K at cq?vi$=E5B2_(izRT zkXdB~UlE(bC!xh*uccQ(|AOkAK8fzmh%Z4?LU-x{jTVSNm?S3kwgcUF1D-o`*nDv- zLky*AhR(e+-QG!>)~6%ufmhC8gac=4r>HH+WBJDFx0ic>PrO`cibYba$wbZU<|YX#XJA^kD*?8~1g!f4hAB-fT2- zYDz=LnJXztD%nA+;rJy)sw(RU{G20*7|i;($^w7d2GLUwwnjx*Wu>Tfi#>zo`@F%` zH6uXUOg&QjrBxIG`LUh=4FWA`l+|y6 zz^2)&axXIn1Z4*39ddMluJ=IfGmX+PV2^Ods_FAWvnTrLu^#N>VAscyLtVK7`~v=; zK at h8e0R!__o1_5t at 6_(3Y;9d#42^6||L00m*wxa;#MJ3;>jD)$`*|ibKK%wjNK7*D zCRP+Y){Gkpa!rwH6i5MGP-wDbCsAAZq9>VrGFP4y(H9CYe83>$js&sY+*P5CNS;{4 z_494p^3(Ls?O#Bxp=zkhbWC(wR7R`)t{Y5sMtc|{KalGV0x0)H#n05M-Xv_64$s6V8sf`R1vId?E+cd)0*O49vzFvL z|fFSS>GY&IKnf${2{|=y(v1fu{@&K!coZfG^CO~S?E-B z+Of(H=M0H=YOx)$#hPPddm{u*E^9t+i|Q_2R$x{zwUcF33HRt{AIzZsIP(z}pQtxb zoQSNOZqcqxPQFz$#JoLfb7p^m^#sb6yZCJZKAu*DncNi#p2j8O6j2GS`9O+`?l~2I zR3M1sdA8lBe{E!h8Nz6S$s}^l^bR_;M>^)ImlJv4DtR}TR+`W=@MA(n4)762qBZdX zvwzQT#Qf~b9c+dt#42u)>O2gq`eUJb$BF^dk@$GHY$P)+ks22fLE72X`BF znr4-~tHk2hyX`ojQDSPM*D*$}Q7wBsUTv$Y+hPPA1ZX~wtEE#?AC9r7ov@~ zaeW3KaM*GgthP at Lrn^ZHOR4MBp%Biph$p}{K8rqOmc49K4*$$5Bs&%(Ct$ zhk0biBfdOJ_rn$4YqfOk>Ir&}@3er|sn*U at YOB>?(k*+*QR{#yrd8$5lAvbaS2Ueq z at bKa z;Xe{&H_*l}QA%?dXY-OhNL%syX}x5{(Bdj-B{!_}Ws!0VHmK|pWirH7uSniMNFLLW zfGM6peSc=s?d4y}r12>|ORSn}(+QP$Ezq(x at V7?{De4b+CiLYJ$Dr@!{k_OK3H=mQ z`fCKWMF#@<@&7Ns{tM-rS`KI<*k9V-QEWWIL}VmL5VByE>L}L1_<|h?L10e72v7-P zf-hKA5S9k+;_2Ds>U)td-Pr>YS1*zdK10=DK^HW*J*~RsD~B4T9|k=?l8;rlgukxR z at h`2+!!;lBu5zxvU%nc=A6ve=-}(LVJ#>aCWMyVdRSnxAa2=(^anhmS(vT~M=?J^0 z1*)KM;-Y)SV-QP8ErtpyOlPuBR<(7HrSgyE8ZbDN_=D5RG at d7 z at F2?ND=s+Hls8bqbYh1YI#$LbFyD@)w6v7Xnk%*WF^YS9h9!xG_11DeOWxX1+e|j7 z#6??X^_EvHFyBlymqV4u+!F3m#y~0to?>_ym2XhnU0d$Bk)M^dLi at L^Hk>s;{&(r3 z$JEmNZHO<4-nDn!g#&p=Vtf8NA6$UNIhRQ7bQTGht4Mo(^Z`p^278HoiDl`pKeFYg zj*D}zEgjg6<_~m13+EpGLfA}jlV>s&tCixAoVvrm17s=8otZuFwRNeX?PTNY+g3aK zucW~+Ug()J8?Y$~Vie|nGvf7HqUC%42bu9n&9qQIR|W>!It?SSkWV at C_b0W z!?o!0SA#a2IVz#Q7f9P1T2R%BOS+8F(FtchPDQdS*G1kF^I0=itL1BO!jotp4`fcf z*R7_~p5_o7TdL-KTKW2Hj5MK+Yp_=MnkadvBcabt%VlZ;Q1aV<3L9510M4S^fiDLxBVldOMVJ#fhcP(H53csG^i{&eekF-3hlDoPf?vcAD zUKcage7MYK(m4#WmKwNcuh`+{)jbF6zgjxm1(B{7ZIX4!KG+%BL7z1}|BNGN$9Y6C z4HjyUg=6YyKa?bcpLn!LqqY3%PPYHiQ7tP0JZ9olThX{P;``+F at fOHybyS(ORC7<+ zmw_U-{v$GwN}HT_G_I_-5Z1n}U5p2&ddLh~f!YH{ApS-LoadGmTwsJ1Cg*U#*+ajN z at kR!^NBPG3L%h%a_38S?8=8^I1DTO}B~l-paUT)ot89l(KmLaDEP$UcXbZWRKHG3R zIgQOqyO~1_T*pX9<+Tu^2k(&ISFI1jMy-~xhQ45olNEqI^h&bp3U0q62ktkl1II%f z26=e6$7^8G0V1SYUA&NJr5;IG-;q)O at w|Kl|{Wv~4`P~D} zYNN9 at aF4}DS;Foe*F%b1(0%s%)Mvw2b}oTfoxtLhr%>CSkU^DyR{a}N&i9m|>%n~C zBFrt6{ucw%MBc7XnaYAQ&LNJRyeXiJ0Q< zYQW{Y_RCavac$-5&if(jtg*#BKeU$p)BIaP~Av)PRs*MT+_Y?cf}S1A5YvK#E=%s!2qr-u)lK2!P?A` z+I*>|n(rh=_%tN0T4xPciS{~W6|cx-mS@|DV*?Kww<)N%7oAkrk32HK$Jm^3B#x>JgJ=LdCv*mp^9nC&p2U|R-3=l7|Y7p*helC zcmHVjDN<8luFsQUC!-;?`@jaX))4reTfevxfFd;PhS4WqLeyt9J8;(Na4pJiM at b1* zn|*Utx>hdCN_-S>jJ^7EhSswc|4l0P%fGg5yJ at wK?NDtNjg2{1FzaZt$ez?JtO25; zyoaKn-Gw74ap(Int1p)L`)|j^av7 at 2EPu799e>S1qW{f0EpBOQ^N;D+#nj1J(*A#y z>|&LF`6x6#^hY#O<$07VAC}n2iWtq6#2d`YMc_2=24J!@Cc6G{Xs0!Wf8LG2-av`)h#MIINs%twRYC^mWiVJBOXgL-*ECLB z-Sl#A-EZPyMErDXS>GBr&Nj4?fLVMFVJ0zh;H?sCtn$E%OfzhlhlR950tBEilm{s$ zDoQ^@okvPKkt?*u=T}FYS~8*eVq4fHNHRUtBow}4#&Kei0SKwgE_m{yatGcX1Q$Ikdg+;}cf^Uv|ihcZnZ$O@|E1{6<&`Kq6O#1p?Sq_ba>N9VB& z)BM8!-HksVIX+XNHzDW)JDJ06s&O|!b{39rIX!?xN#Pl_$`)>G_i zF*k}V_ly|zqUHa77Ie$@8ft=?0(Bs+ORnlLT2eE- E`n4GuBg^e)qC#*XN#teIj zah4rEdx|%Q%Oe6Fl3aFP*4UE-FR5zltp|C|yLnJ=$aSZikDCHdI0^i*DjuJ=gHoIPYz;YnnWf2CGdjspprZNw`XQd at u@UN zoUKs=-v}7SJd3+S>H(VAM&b1 at S$bWWa??Lrg}-4{$D37Np#L)_KLx8rO+bNwVxWM4 zME;wY{0~aM$Uk3O+S~n)8#~47|MYX?=qjS`Q)duU1V(Qx5~QY~IV2&WYW9~t4YJQ4 zM3F@;k;8taeuMOxfy at F%BgD(~x%r2k+q{#dp~+hMRZbS)yRW%IH{azy$o(K;r27&` zh%Yxx{zwFl)>(+*6tV^hh$vk%VATr73ms!XVkaU>)H6!Z*$&|FMpw98Xll=KnNV*#|&7L$#X=vib- z>dp95SSPcphyP4uLddy!*bwJ3YK>)7Go-l4kj8YYScqO{&%jM)7)eUt2>*7!34jao zUeYaf0$0h%XGp%Ywj!Q%^az=(EHF zG9z9`wF=%@PZ)(7I=hu&7p5Pjy^d;^MVqXVl+H*>7z`A}WKfKbwQ)&Gq+e!`yi+*K z at I*KS?N+-VW)9CU&Q3?9zyzyXQ%Kbn?;)O&FBMKXU8Q{$I70Qy$3b9 zL_I;Jip)NTpM|B9nZ+enPSX42_s=;Ra|Z?m66K0v?P)DcI|51 zmMzI;1aYH_s?MAxs0NE6XJolu+*}GnNxVj-m7^k$^6)kx6Ct08|7`EPNi$&D&72eq zLNRQR>FjYJZwm`dwkUX9`M2;VG=NslOf0`0^0oS*ei877-mv&I+V(XI2)g(Mu0I~4 zWq)Jo`N8Y?CC3EIy*jr~v%!AwHn}*Z%bUD_|CEj)=%21d z!7kM&cm+yzb98&Wr#}_Ur1%w}ZZ^u?|L>KEDW;2u&>;?7%_6w4K2M(ZQj`w*+co)>~aW&~C_a|c2lH2)u%Xxa-dCGUH z>vMl~x(7sa0F%Z{X=(?E!9=l73_Z2BdXG<4WkoT55IuSDI&wD%ty*4as08awxV|_6 zpITpLms_NLzJa&Fc*C4a%l=2U(YoUr2IHLhNS$Rp-PT=1lYHqhb_d4x-J%R!x^06k zuKx5PoO$6&3T|exc!Mf2VT0aP24L~PZrSA`dkq4#V~k19^`hE*MSs55ix>ENB#th# z`BV){{+Kjh&z5DdVhTUdE6;B2L%XJ7d=oHZm{!3<-*13~qW#|A`dqw9emUNJ%wL9p zhbjtDWwyRir7hkvF10I+hSzr7sRUkM*hjdr4eH=25EClx!=PLYBBE5+c0(R)}!yzV$%-BFU7IG=R`ew6_e5Uk^E2@@3} zm4H(n`lp-()```L=I~p1*PFaQV-pu}4o#E!VGYpy^~m8^X8mjYut0ps=0~%68i%79 zv4DdGwp)jX?=!&=J at h9SVUiIs9f6n>x3UJ4+eFT8vSLy@!;LBR at ywZ@$`-G{RV6k_ zg=po=_mb?Uo0nbWPiFA-24h)X@(cFP2wWWfeq9(&cAv0IG#nha8QEP at cv>!b{MK0h z(JE#^uvg6isjNB0!BaFlW;{5dnq3b5*_(1K{()n-VqejccMfGf^5`;3SY)GwXgtae z;Dh3BmUN0)EhpDZRNO~Q4pjs3c2tNsecbq~s=7?}sH=is^Q4e6e2Yh06s0AZ+t%^3 z)zb6bJ|TZxYJxs-&pjk at L)ke}PKL6JpJnpn%Ve)tgxWGF_vnda&QlM);&bfcE|7c) zOKS8o&@ri5Z$OA4e1kNS7o!V?{qP$?Q)i_1LUezS6??zqU^3<2I_B!plmu>Gm>~far^uLGaG7Sk94$q7{46O9j9hKE9I!RKGDJ_#u#| zW67}WQexl79_VGIIz!t_Y7d7EqX+(;`w8#GLV7CQ^LJBM at vF1if7s8tga12D|9?#- z|5*|=J4r_YM+j}?8}tuIHMqL9R}<$Nh<3Ab6J`{nI4a2uBt4>BqM2 at Ks~MwNI{PEf zW4 at df&il+m8{zNMbnq(4c`(T|=Od~!1gJl)%l!BW4^y~*$-H0LTi?5JL=Ni*_EZBq#`ypTfloA`99nQhQV zfIn!rlrxFzuCAd0HUm$hv at Y&qwT0EJSn%6>@|lp$YtPZp$%LR->cdb4wUV9_2u`tx z(<}Q(v=L>O_jWQqNpQDDr}W^bVwvei<*AJWT`{j-&;Eig++DWrybJ^Wy7Fi;Jht`p z-y at H>(~r*=h)Rv-$vVY4)-H?~* zPyU?#F;JEupvB2KZw=SswlkI=fCZfPz*{SK<63=D?Ma?_g#XAWa at 6is#HQDRufh6V z*kL5OdVF0hJ&84GOK(LfSH{fS2B!kLNUVWROxgl>PZ}K2@$fbO;Du9G7GOv{)>r2YkXNj=$ttCHdlTj9|q*VEvxPa9%SScatI%+p77 zZAaW9EB`f~)I;JH0X9%7Gx3a>mQHMTlqD4;B1B_WG0o;R0S(BN%n>$z at d>xpGr$$G zDV**ugb^*4erWP;B^-sMijy^fL8RuKS>-xa)6FkaKJiV^6eLgo`r9$6XQyq}$6wH` zg#34Y#Q!_!{x4^Se`wj-t*)qZ2%4xU`G}cjGC@%FAEAX(4CIR&i0`G^EqF>TCp6FR z*x!Nv!;T2pHHv%@HM_Iv^{RF|`!Fm({O?5~cpU2dE*HSY^9Hf70xxmX#i6J2H3NILls zjKvJ^2pK1&#Aoe`&A4wW3|`sXvx$~{s3TMagUtROV8vVndrEj3j?rfHFBY-~*hE07 z`)Q&XFobwPS3!bp;x}o#HnHkn#U+m85Hr0<$OA(mQ6J@>*ZILPUvx7(jt_xP8DROm zv&rbL)1!-P)WvR+OAV)Y*6vQb`ZQC|Q5z?COv$uRv~=aYR|6B_T>E}me~(0 zQy_fZFucJ0WjbOU`OchR+c~~pnkJ-9l0sI1@`gLk3nrV$2 zef|#gc7ljMssKofOw_;yWu=1?yGw_JP^=6 z>%ZIH|CfmRXDChTKzpbzqVv16u-cp534;U+VlWd4vxs1EaH13v=K+GjpdpGgMeZn~ zWX*=PK>B_Uty$^lwAe}Ov`besq9-E>g1cMWT60?Kbd*&sF|1i}>d^8Xck{TXboP3q z?nAyhZTq^vPXGAkd+v0$e+X|u*gyn|Tv0~+0Qn^~)S&ti5%E*y7MJE%MXxh~;*KY{ z{*6EGFNx@$=Ux_%t>_v?<=X at hzZ*en-s^x=%ii%D3GgpfIF;S$hdWFf{aZowPHi~9 zkRGMm43HYyn`fgkfS=;CK=}(M`gh45eBfs+$oFHfjYp#Xmqh>eT`w{Omp?ONLth0< z1EvU{v*NBOuktsiqrJnm&D==VCOcOMj}joGs=CItvj>eOu9wmLtj4TI998F*Hp7Gv zPofsMV at 9?X<$$cy98NS at LV#q#djaU6 z07SC|Qd at NeXVp2-GqSgJBVuZ0BPrS}w+bk3(+f9FAJNQ0w=5+aUf9EX2Zw$jQZyfg z?c`GM7`ow%9w&~iOQc$2iHoRrd at ImgD1JZQ`jOZID-51DL|rL~`;;ObUky}KaXsYt zFW96LaSZ7R43$AyFwf at 6$Z!-o2s#}e{!I5yTMh*{Mwu{7Iu!6b7JfH`uEGmhxFDHu zAv(bD(9Vm8&u;6!qfsk=NbB(4SWCe9EpxTa0xC8{sn)yV1Tr>~Q82}saZ*ZraZLj! z4(=JuUCsQ8WP(kF%>F8Gn$+opImw&JvVRu$NR$(tJhj6jMw-9oc zna5O#B3Y7+8Pm4Q)Q0+Y5Vew%3eSljmg+o7Favf zy)MLYG$CzvRLWqJCf7_wF{0pkEP>ei&4h>`c$vN(*g)P`UfU?;yrgbG9VD7XLm_7+ zIFl9n;w%aJqqP)-d0Y|5ZIYr1QljUi6Q0eS2$P{|jhtAmoOL7|0EHND9wl5f5f~+r z2?07_0_fX`9-HVotav8L^T_EMUJ^`TG%vR#QQO9u1j2pAt0Bif(JHo19=BE9%!naI z*MvPHZs|>4NBQat)WTU%qb*Qn>6xZ zBZ|E#0Y5xP0ejI7nMWyaHdb^VJ&AA%L}l{sxtYuF#RwX)`!dT#%wEf at rxR?DWv|T; zN(PA?^*Z^$`LYKbuxJ{)-ql?TRqCRiXb{O%O-ia$Hr?$*`yCG~`# z4`L=;ZDuf;v3aWypco^8&`482gC9(X60=lTHV-YZVB9PUX%62xJB=yX>stFk+`e6o z_1LB-I3J~Qe-V4yrjt-L8-Ue)TE+nH?ELW9P0}8tvI2+BQ7cXJyR59F01$y%mNsf2 z1w4X=UJb~^dZCk5+oioxLuW9i{Oy2{RnbplF>-AKScN4CSEU=SDd;eIa232)x4T?4 zdQ)?&g5hk?!WxWTQZ;SZML at SJEx<)6zaZm~Fr=)oVHh*H*TlcGuq54CzF(oO?C-iM zf^m;uFkC6@=f_eq6u?u=2UTaaXzaJy+T>%II8)OEJ+8Q6;w at vUfze4@->+wo`Vdq1H_g&(4#N+ zjbJAoUdKF;9JcY=>C*N`f7#Xb!}MzUE!DO%6`EykF=-)V_qbA+xdx+*()~CpaDOTq zHYNzK%<8#|WArv>47xA6=KZQRy=U_|Y3-P!9gIkg;i07%n|rk1?$Rc>({;w?A(uBk z;&1cAb1IJ2)PxUjK&62HajLqMZZ&qI&TFxoU#7AivAasJ8 at q8Im((<~5t2w&HX=+C zm*>axCu{NaQ{!5c}fSFJ;;XZi~RIVrGU_=X3eK33x|K!{{diZ5KTm!pON+%zN z=cTy87o*h>dnFGCrw^J_5d;iwY5;B$!uBPm4QZ*Spi!vVeV6Cg*WtUi&-K*VPe?Tf z;D?=eudiRk3x!GWHw=|MxH?v~pela at h|b(J#`fO(Lz7vb1B{fmA8K}SSQ9k0 at v;%`j4MyZZm<1z0NH; zSnB&mB^{y6m0|Q}L at zV+X(KNavFa!82RU_8j6gbeRxg at Wt7%#^;TH4UmM5quKS_^3 zt=zMB#91#@#wKQzE3>LumB37varm?I)QHs{?W~zGv4tZiVPy=DaR;r5k#@i1KZA3J^Xkh>&opxAZxU6^i|27EwS);+(72>uCGaJ6nleZy<*t!VL(3K z&h0r_I<_^o>T2sU&@-fBq{>8&hYYF87)}mZ2WdJxW3be-QPWbHS}Ln6j?EQS<|P$N zX$euwB-RH~$(WnLE;aYZ-2`dJ#BBXSN{W06pcMca9ICYCI%o0dNo$J!0!8pq_ap>* zre|99#@fK|HoVz at LD7<$or at 3qZukb@SSsocLeny$B at j|iMyY8v- z<|M&M??wrmKn*#}#j-sr))1GVAULX)$(;_HPpdgPMX1T{CAgNJ)v5!pcvNY5pGq$X zxAs!J6}B1I*ME)Ol-1la_S_E%JYM)+b_Z|<>6Ujz#MGLyiH{bq$Q*A z`_6c+C&+%+c(n(#MNT_&+Hn1N7nXv()eJ=4fO2^!QaA`UcGsLUX4ky2uU=qa)yXob zSYuyC^PPods;IGWwPOHezwHa&Wt+4s;?#G`JI at 4*;(98vem+XW at Y8xurFw`mWK3Il z5QzPdN%qpl1C4 at nVjJ<0pBTZ+IaWD}5YrJ-)6L~HvynPU+qQx&du(;-um z-bLLygu!c@;o_aUJ9(z$6+%Oa(LR(XxIoY7$ENVCWeY)@N*mH|({j1a^mSdNIyzI3|N1`fgYQB$- zkQ)1tlzdJ?y^jERox}hiEECb43wDYbW{P8n~<*oW>_K-;3QbdSi(R z3xMhtOLA|>_JZuvCXpY($Iy}hlelBIQ7vj1T~rHkHJYzT*rXA|lINhgmeDd`c9i*E zG>YGhC?18ZFdQL^ho7~w0;%x4(9YEoq90PZDCdHy7FFE z1&RQ at LRC#%_cOY-f!imxPxV?T%@_HIgwl2ewqZub7u(Rw#}gj!;;|B6j~;MOeVUiTx%|(TH_#{^Yc55Kp;aArdAl3TA>?vDb~8%f{S9aOXS=#lO!JBDyD3H?PkeA-JLEL)zF7eb=!`)?OJte>4hVL^a^O#kl})&DQz_WzEv`!5D% zD>FMaJh)eJaT17BoYk##K^amoPDa0oFquA$ZI)WQX;;hzdl(_`E#{3X7z$yp1o5!E zG>#;4SxP6Xx7pEzse8}&%N=~L??yx2mH#dvh>inqW3VKe9=8SiE*^?p!xmYbWrp!A z7JEenu&SL$I?!b4j2>wTCjhV!v$FgRmo8j4X|NbrZIEUyNuM+HOCp$lODTAQ6C~E+ zNBsORDD5Lf at q=5fbr4q1gb;7du8MFX`5zw*ZR#q?;(6 z=g$=~7db(Yu^v^zh0^>8RbcM!ggP5g&XCB=_?}Pc)1$@ zV9!vx at X0s0^L at r)n+RX7A+yguGx*h%`3Mavr at X2?FPdcs@~UX1*cK+le?8NeCbyx&J=c{vB^uM*&p{=?fu=p%NU1$_W#_DQVn`vo0Bm-O6 at 0Z3)Mh>4&Yt zSigS8W&=*n2d9Y&JqwBg?vhQGT4l|s&&3N)g0=b=s5zuZdamEt8 zo*fgfrY=Kvfw1&{d at lST6h-J=sicSW2D7aoK{>Ex+;F8GH$BrRQP#+W?4xoHG8yD}+-lv-PnJvm%_z z+>6>;$sk2&h&4C}W>Mv0J;JFOLe*I0gu=$RFsL^vc{0DCF0CJe+rV#$6#__}pVXO(#J&1( zQha2=vEd(sy)77#7J2VDqOt53h7ai+(S+r at k0@QMntH>^L^V5fQs3UlLo|+xe<$x+ zLb4RqLjIL!asHjB at c${-{tN9|S}wSY*k8l-Y)=*_lrf2GWbjCEf9?v%z;HUzN5J>I zWa=u|xR8eL7ScsC9E+83RN80ek{M>QuZm$eVZkr3yu9X085Ay!y*;S-d{0!o-!|qC zzprJh$yYUOB96QO#F1NM-pc(#ZvK+}eQpBI zTFhJ%pEdu_Lfn(1X5X7Ggx8(Q=mSOPR)%%FnVPx%dI5-kr z;5s7X!TW0}LmQphxlKn6jdR?)rj<5pV>}-O3>RWTkvT1CO)6}Yo(z2TT0Hxu!%l4l(@d<*0$LMq@>AMpZ~+i(7qqD at oi1`m zdOCx6S@?u$a)@xKZYJd?)*ejEj(zPW#q}v2X&E^^fe;ezW`(u~X;UM=UxQn9Bq8wJ-UDv6>rOD)Df7ZBo} zX#&`FYqSY3C>GmAHtCAx$;n)61;qOZM$OoHAJ%RO?k{- at ZAVDqZ+WFAw{n&!|gLOgRoyD)VBRcW?0*VwU4MmeP{)cKw}sx3ejo|3+#2&%?Nd_x zipV{EX$v>M%?dZ{TpeV*>5RdY?F>W5uW3Vv~IP9^%N=n zJ|a_YJmzfAYd|sDqFE_d@#NWWgO&H-NKe0aJK9S+RzQCp_KhsqYFEW<6{*>VWZ%%% zdE8RaxD;C_JhrcC4p!Dhy(}F-WXiCTRM%*{gV{O=PW5URCX+6gW_Yhku6RiI*`kqM zP4&I4lC$Dy-z%0Q54ETS=f->f%|^PVcP>l%+Sw#K6{{5jT`K6$NtxvPD?4cP1*jP& z at nU7uR9!X#)Lvp01e?D5(QHNQ at Sssup1}g}J1dnP-^23EL7l=F6DB(pQDw-)nw#?6 z`6ro9JExKfSD;8M^hX0O&a)1VeSV9Us0GA at bhWTdcNBoNBCIoP_}GFzP{(pZN at 0i7 zV$gmzaGO}j-mEu>;bEqs#ilqm2d4#z4GKCINr1GG{HLJtGrFkvi9389lssi_vhoX~ zLNDP=ga8aQCm3%&SPp)l5^*7X%WS2Pq+aP+qUs3Q;-#o7&XF**zxutx310<&o?v|5NL9KQ5Xd_}A*B;nx`?w9IMaFuaI ztOiu~S>90l&lB?zrcp811w?_ji)S5MGegzed7gv6t}c+Tx+C~hM)l(fx=1*y3!>R5 zM!w4jZ-qQRf~3!Klfb at F&M2h>DT|3p#e!iNsI#WRnaSjE`q4 at TiVQ_S-c&$rB{K$9 z?GsO(2`9}&N9&2TU?7Z}RaUR~240=f-?@_2Zy|o~M1Xy9hI|W=XAr{Hvgn)fSiGLHGkTREq=r8iKoc11iz+|9a?lr$wt+9%9qzUV7cbV*4ccR?0C zKypf!>d0a(Bt9JUX4(jRy6N`0;wsCmYs|GzL at b#CSU{zgs*#0r5i<{<_|hpdbo;)d zvER>8RxH46*!;=4+5D`T~mpugz z;x))O>&O75!N=cxA__P}La0%IfO2_&fY|=qoxr~qZracux{I#-5_1!o*wMFvrg0j? z>qN0+&7zm#;bQAz{7J5yiXQpEZ5PU!Ha24WR_4;5zsR;92C^i at WZ%f z%)|l07<0i4tI~5EmX?_eQaWqFfUo23(h6)(GBYxspS$dC(FV&IYQsG&)Z-pzQdmy z6UDlNL&duNIm%D<#F)8#U&`%ipib26Tv&POycE5dx0+F+bELfTN5kV5AYgYxz}f?- zAw?6hxrql(;Z$u4J5I#ebgU}DF28k4MzcnCPJuH-uE!d%N%Bd0QyoqH&F?CKrjN!C zokIH5Af};bK)jYmh&S4_8Q7i5;ekThgw>DtJt3ws+hBb<6$$h$Z`6Rb$0CDItOOX3 z-heo7P_Ws at PH>our5I!movL(Gusb()%qWaKxpB at pRAl=cc;vr^@YdxD6HXDfF at u2xHg-FW5V1@^4`q zI0z#2^QbF at xfe~QO{gU=^fl$#N^V4`0kTd)11n4B8&-19HXKTLe?!YU?5zXA={Eg5w(R9??p)rwXv`fNWW>S70kB%hp at h~+% z+inONxh8kmlK>Q(_q at k^4u at _utFu~le+$0ij9yaf`{P$D&;q|YlTX3uOy;g2>iJvA z;hx+Vvj4bj@$~4Q(4srpo#K&j7Yv`!^r%GAV at IpOMz?P8P~(e59nE}g=ehSG_edg- z9QL~Ndo8qbplgpX*ZW+6B~RdwZLcSZUum at nEzacq1yqXFa(3%(22PKQ4c&Z}1$W@` zDR;>7sDqgP9U~M$AG`x&EpWCw`q5%?8G=gFPQ;58 zBIbZN8^Of(6D;ZzR5`=828=X`}rL}E3=excG*Zp0AfI8KDLb`!$#lnfW)#4;=#dG=|X)J<>=*R|SfP*F!!pz52Fscrs@ zHf9799UjEe=Sq}B+L(Ib#Dx>h(A%z-Xwr*G7o0jUtnDR@@;G(rwN+(L-#kFD3;vJ* zn;7v}=A-Z0Tk^Ruzxi}$lyv}tBi$}fC#5+7&@mvJ7N^^U)Rl~TP92wlI at E1qo06vN z54fTBqgrq*2x~i548(4^^1&-cY9_&-VfT0SAD}xEhdn_gEmQun**CO&=&`x0RCv}z zDt0 at Qn3Y&($6xgmRV(>S;yHg})|BB??q?f(D2zL|_<6XvQ78BQ)rK1H66w;vyOHncegU$T~qee__Q$W2MIZ z5$H+G at isdqDgw6=;y_{t9lTTN^Ab(LooXYG8cY^V@!{1qR2P%&w3i;C)7G-sb4075 zJ4Fp&E~o88pc9dI|BhYk^357C#c4Kii-T6|dRYiyZq&jnw!8NnUYFNs&i`RJiv?hb72Pw>J_qkZYLuE-`{I%T4(fvYg|3H zqm3riDf$@A5rSNPhXC?<)Vl-(8DYMl6YkfI4X04ZP=R_ZyB!1l0!ksnd`f^*5C@}9 zc8<{A*DA3ysy3JGY-7?ivknuob;h15cbf8c`Vz&VIBbVg7|NZs!)spOE%DDEy88Dh zvN%={t4GcPvQkYMTY4e=_UH|zTGUPW#Zr*0q!Ob0yl)K~KT?Xo7R&Rc##KaO-`!%g zpCH|duCdVha0{0)qCXePP1_$%$f0bB{2xp+rBw?P>ddhOWe1nJrN_isO;l1n3zBu} z$l?^kMb_!e_x`kAK)$M`4z}E0LT;lR{C=emyhfZCibU>CxsIRn2IH*d6BG+{3eHBF z2XK!o>+}Yjre`h7nrf=-nBtse{H#A8ZQk_r^J3Q!m749bB)3{J8I&CAB`vLKx`gqh zSZeznXuLa{u6clGP45}!(|<{Tm(s-1!l=V0osX{=fIlaHm}b*TOf=5Cwc at rg!cbZf z at 8hu4=Flug+hF58ejz#7QE;`(ywU``SVL$$5D$ZAa&jKO`a|>Q0ZCy zzjggi->jnEhNjFfMqiYI?_bh5J(Ey0c01+Lr}vf*zL}+5=Eq55sjvgbgmUOm1UHYO zpWl!O+>M{P+GXX zHa0>?M5lc|PZORCN8*}as3nw2v%^_sgV~b>{kf|j)RoncGzF&8`3MrDnpt)kMcN7b zYspnT_9m at G&O=cIba))ixxZDZ<><@lI6zx zqN=1)6sW35ikp-LktA6nZ$&ey!_CnMV!u?sw*t1!wH~j}0nFa1HoYgJkMERg(VkS< zuDg0IB9tnzdeJa$t!OdDhMHeA?!n>FCTziqfMTV@| z^3Kqd>)VcgxCeEp+v^o(hZua|mg-6|eU#g|m8R at TZgWcN2cZf%kiJ11m(-Wi%9vP| zvzFpVyd{cwYDYx-OMPKmz|va$qGGVOqGl*7bH36Tmhoc at z(%UY2dACzE5>#!A``^p z9Ac9f^<<(}Ebzt-tCtu*K{a^*DJkNzo&o at 5wH%B4PC4uKxb75|<6QX-cKEdLZ<9TB z#5$|Vw(jB`Vpzr<0P)Pk0p~8Q3lJ&o07zBM4b4mF1)Hg*e;Y2F at pDtyNu_gi*zPyJ ze;pPpvmIyIu z3{9DO;2+P#*bXl`;|JrItKHkWg;LX33e;Z!FrKkuJL5)jW5MHWM#rf|UGJc$ zvDk$HYYXnx0^a=_WE-^C^(S3nAZ&kOfwYi%4N2uP@{%R=Ia|;pZodbDK^I(JB%wRNc%_RLYvSy~!Ni0Zluid&`J9p^*JHB-Lq?SxAJC%!G&W$DB9TUK>TQum z at tN-F!*K7SI5PU&Qdk^rOX8JUo6-#hpuo4;RWz;e0yM$qeJVidF)GNhT1ZV1+}ntXs4n~DSP)GlQC z5oP&)5o=BgP}QdRvNK?BLlDZ1ZF9!p4ZS8$tTl;n-{tQPqP`Lgj}O*qC$xKQHeXpj zt!&e;yqtayqFe_L=%V?MfVNCNnH*4`DJKH&WFNVqaV7dUW{*@vP~X)=i8uU%DY0;$ zM8d$!dUibGfw{-lB@=*7PmQy;?zxBH(2mlT1vl;&zvYXN&hi)ZGQ+IF$!ghNnYxCH zM5)J_L^@&l(EObNvxVGTsY z;M`v1Jk3Ll<=Y>Z)1ei^<-w8 at IXebARbgp8)nziLg{D_z at dFK$6ODHGveG-+DXR*1 zl>j6bjGA~k8|Xoezi z2ItscVBKusijOE8psdm?=G;unX~0FA%{(41Tcs!FeEMQ$b5SpRa0{1PKrJ)3ycyRu zM^_ctBePy%xp-8m;;B;qw)^Z0y~BGlrSCeWpNb?8vn|2$LQHqi0btq|TE6LO2TvE+ zUtIbHX{ALNY}5ptP%2+SiGH&wTmrr#dX&H z4;scLs2>y81?%D_lK)8qt(Ob&pFs%pcRF=^VV;r>B#%=sS z+!c#q!AD at h$FYE4j at 6XHU|>UoIaWt}CAw at ZtkxvF{3EOyw@~qix^p$i??@0&=7Hxi z?%r`^;q`hjt9nF6cb6{2+LYUCnul<_T`lcG at X**b`A4es-<%QnLS8%(nhrcdw*31j zxi$04^^8cZ9(pS0Qx9u9Xd^j-gXa&yM*MRQ$PoNDgz%*UJ?_iWpZGF=gzj6i^B~ky z{-Ra$2&l>M3Pi}xF8&1EO8wHf9Ey+($8sO%QOd~;=~dd^!I%~iO}qUyHF{tTVw=X) zt8LoJFNNzh6!Bs5#k>!bE`LRH9}yHC=)?E%H8bH|Qd-x?usNIPupJR&Ce;BsU$|)F zP_&re`C8POl$40WK}XGX;vb3qR#}FSJ;2)5M>E-PM^}2-eL*|rdy1n;7>`-`ild1_ zJz!9H2mra~?vmK<6SdEk+r=0Cz|Z{yev(td^Z}-FE2TWZPypKyy;~ zft&ULIrMVA5JJDhzHz;0I|u$j>7CpoGxE~$z|$jA<9F at +Mc6g=C;$59`IPPpv}?c? z$nY}qVEGlMxfOVFkE(u9Q$YMu2BQyCGVNzCMh zC&&AM8E`qX6Y`*PeM;<(Bygwma#ErfASfw=a8eYHS+M7gmUhV`+?P?B?CT$YFh?~w zcau_H;XZ>v6LMeEdphfj^iWeSqZK6o{c?teONc-pKuaMRxG7Q(CuQiP2vnvtjNv$NU?1t}7Tup{9-e1S=O$RIwMrwDa z&!IL!<#QfY({yVRhQXNDt@$PoXjx|gSJFN4z_ux*n5~bh2aaRM)#%x6UE)l+<76*F zVoo7n*IhL`n$HKXJ+EM&r}fbGo*w>KqA@!61%tf;-(HESxD7_)RbEg`6LFi-_>X2! z$Xl=|p|hzJrQz*7U*%_CMI2lF><<>7PcOVrxX%jhwM24oucDhmd^#1XDxo5snD-F7 zp45mF?wTCJyyx4EnFs)arT`JgjdWu`%GbY?o}8AcWG8-rfGDDafbjm;N>Bf>rQ^S> zLaA-L;;JBL!}&u<%4n^X0<1OhlK9cmMXL}}lM8#y#eK=el@&AoRyqMqQfQ^3-5;)R z#vC73J)$W`_{?+G&AjjRZaEt|G;%#TC_s=L85*8_wkKV$C;KP9v%g_LfU}{!5-;h} zVUxINV#eJh_oP z%dmiCH?ZP0TvbYit*Ts{Dszby14<;0T9jI?f(;>HYy!cktPI;hrZQ$-8~{m{74-Yj zd)}%hH?7~WU0!;Iq_t;@6`Lpem}AJAsVLNf&AF#D3>wg4mLEg at Ay-5&KMgTXTuVnS zBRvwM5J#7fP&2Bc!kW(g=4el|k$sxw1W`)1DYH1slnmuEEhD6=DAl_5 at SJ4KU!N;y zABPip`;kT-oYELmFo{rZE%8mdBQwG>Lk$alyJIwi6EAD$4M1g;!;;z|M at sAaHIlWO zVw4rV<=IC(sD5lNk9)BhV}Da?k~o>+lcGqAaNv>Qe1TBkQ&XcY$hJPB--$;LsiZ at D zUg}?E6OU~tfj{TuL at W6_%Dr+sEylmY;X!ub>Wf6WZmaVDpk8 at oUF&hI8X^|zYCaYx*IRX1Re+Njm zJLY!maqcvaJSA3O+DqP?o$K38$6Bk>=B3TP*4eSF!&Sj`hZMYI;5in4coS%|stqI% zo)F;vi4M_&t%37gl*Yl!v5T>Bb9*#=X at O>*F3l$-+QIf6Jx+8N zJyLiVAAQUV<*$@Haf9 at c0eW@c=dTUQ2I%KnT0{+nMmjl=WtcN=|LOSG#7R~K%CSr{ zyP^>vl3q-gP{Kh}5Krw$M^|ieB+!toMsVD5IZ1`bxiQ-rO+XO=l zsXHtz;V70_Xd=+`{p5yOmu~DwJQ at 9Fm`1Q>Zd$EjNNrTU1B1T4Mtdm+#Sw!H10%9~ zIla$Lj%@}%HVi)e4S23eBWZO0-lm}qt0+ZjWPb^`qWk83G4MRd2 at NZKvwB^f{0U*9 z)g5$Zg0&e=8GRWKWP-cTj?_ at M!?x{}>0q@oAPwzACEQWU11tx%tyO2E zReSYL?FER|>%+kpnrKj&SJH>Xb#I7L_bR|1}I%n`Ux3b6juQsFxJ`u8LZZClE5XIwPJ}4c9-uoPqq#k zRYNtw*YH16S-)A1A9GlaCpR9kw%;x$gd3xgJWpayq;&6Q5g52mV?^$M;(nI7b?XZF zit1rH`c}{Bg&ym9oYFj~Fny?DJg~i;!@l9Yc|d&9eP)?|=@$5w=C(b=;Cc^8NuA~h z-w39fRx20_7eLYWoPkcr0!K1e3Pplc(=Fe>?dD29bDAOGnURV81E}R;qj1W*) zs_I6h=q at l4FbJ30<|kZl at aHN}yV{T^?}Z&p%#R|5Oa2LuSj>QRmbjDJG~@Ze+t##; zaNM%Qw0>c7K2u61N??0-o-i$Aym+MW6i9oWFn)~r0=^_vK%F|JHGV`oZ=7;F2bzqS z;jsDdgpxnZs2uZYOn@%$5qtkxXRBYyd$!HGVl8SbyY=hS0KH98v0(jyQa|`G14QA?z~|n zoHKrKOn?j(7l*9WHVF{ZVa5UiJfzY1{o<`?lUmJKhS$lH)(3|bx;25uEFeZK_|_O| zrm at 1*pb8S^Vfm_q+3MJ1zl8agPW>WF%jbr5gZIlf|xyHsDYor4uL{+=7Nj9;`Cqx zeFJD8`+TtSf+vfhAkB<1C6;M2>Bj92Ib(Bv+E6=MNH)jM5E(x}icI<_eeXya2w(ve zqJgQpN(1EeBC~KA3^lbPt0Orwv0 zn2tPN)!bB0ynGYq?se<|&6+Nf3YUTIFx`wPdfWfhp z47IVUCeD+)R!^N3JM1&T$M80gk}`7hkrcy|)8>hQcWHc%EC2CAE?l-?Y4>A at m1h}m z);J9<5IxDD)?urodpLVTO>O;FBc8m+ at ZNMUfiXz6Oi9uCViO#tDr*~Z1H6u(34~LH z??4G)Xj6pDp5z#x(v&idf_R4Xg5hJjxZ%`PMICm`u027r>;eh)jGDik zpP=DNQm>Cd9b3Evc*fQAz+anA{JtD2L2f8E;(vVMcLG@&Hg)rSled>AMsoC8b%R{kEiq04+u6or%ceHrF`eKpuQsjV{L=nCmniI3a`dTTrql1 z`NtoKIr0%4+nx`^Ru)n|COUd`k|pTF)O6cVn0lIL at Io7Jkf=wrO^{-z4!`UN*#mkDQx&zMv-A?n?Jc>-)~%UL?8z(3kH!(~SBquVuBAqh^-dh{ ze4`t64Q$JKw&W?j2kq874(!x>K!iDX1Lfka0=l>70=YcW%j$xvMjGo|c|$B!0VY;F zoj+bY9gu4#(&>HgPNWK5!K!vMDe!)#ED+$y$SKAaPQ!$Sn&<+X^ zBuVJfnC@%IO|z|2{b?4`4dm>k?Rk8Z`=C#ZFPF*};!F}%Y=tWvieW{$Ur3Ced_)4i zk-FS=BlB?wEWtdA at 6phY4(E-?+*e^6VaIPfHP9I)=P$Zl3;1 at U7U{$!8LVQ$UQ3 zkI}gCVMh(=f!1lFRY!(;jViR~4z2cff5p{7vpT*2-#r8bGwFL57qEv6?U^BJ`nPvX4c zXSSz)CgwIk4^NcuJ#!VEJYl?pt{1dW>#yGY3t8du`#IPJvcuCQ=&b_^vi*5CJEI{Q z07Nf7f>5fKF6}VDHD1}LihEbZND3 zqhkjONZ9ulyCEeda5AXr6xDB0`tF-h|Cx14!w+cJR@^2zc8vuOSMeM9bgO7EKOrWF zzbijs^ccM$pI*5JyDo6A5VTNHuVStppFc at mFdtnySr(x9Qu|9WTRNq1S?g5p!pf#K z!*h7#j{}PF^Rh^?cNd&2Z$~uZucBR8RqhEwff}VJrH9}OSXrYGbyg8P)p%|GzX?`; z0FHw;F0&!tolNEIjW!9qy-J6bkajakwS`y{@a!ChO)vB> zMlje&KQOY~Ug#D5P+fH1l#8KRAmdpINE-#e1`G)WNhNtuVo+^7vLb4~q at cJ2Gz|Z&ToX5X^`#) zziWXtKW_$N{H7o(Xf2GOD%gHi2!o1%S`~qna$>6{67(*GhmHDYn+G2CHiiDPq*~LW z;KYU6cw9xr0Z9vS2?Uxl5(>7;!hgGH!CwyHjA|tI%fxnun<`|~J1P^ZCf3rh+iRm( zGLTxxs5vlN0FC4s=3A5;Yy!spC?xELc%WQ1b?UY*OAV&pW03^u6{$MpO1rZqfrL8>13K${Y%P ziGhoJe3nx(n at 1=w^?-8V0F_2?G;z2rnN8+`)KqBJbMKq#LO{rgSfOop?(_WnjW$dV zfxxYy1wXrQ5MdLIpLj85%LsbQ2u2H0f-VM+kM`{gjLJtg|GUqd-z6QeS}DB;MU=r^ z0Ou0J=0MWnmVm2Bq97*-l-!f3 at Mn=w6aEmU_;G|vOqt4`B4J->UTt8XM5qsu=#LqZ zFF7Ry`JQtO&9(IhT=#0lOA!ZFo%GxZLryP=X!?jm`iPT~!>9S%96z=eX?n%>P!*D< zGkXzl1#hXL1UJ|~Ou?b{?BQke=xyJ>$pmlkivk0~VYuw^2^odK zn22!J2w9~iL~+r7(m9?})7Og_Jw&rb236fvyM2`j1a(7bcUP=O4S2sM8b6r33R=dZ z-%Moo6}FdGXal=7f?LJ)v9`accbs>y!MZXi(ZO`35Ou|xIDj4n74TxE1P0ZV^+ma)523FkL^(R8tb~(}_^<_&p zX at wqqva@I4*jixOS_mwb%Jt+`zevC6=NVS#oO`T`u(mW#Z963^>euD65#5QrfO3R{ zqjk#_PPg+vPg3qL9 at lWa6b+{yXwZWNK*H!4Ux*xB3n!to;og9J ze*2Vr9Ogd{^0lw-z=I!hyr((n`66w46G61~j9dHU!#Dn|>(?~X_ZzEhX!xG%%5>W|c(ToLYPL;5jz)CSTCSeRE{0;_pKjA at _hiD($J9Pg6rP4cE z>47IFKO(bO&MsK at h~)t{r-@E2=_ at 2%Q*$+q=o`CdNNB<2taQSY6x(Y8~ju_YWED$Kb2n!In$S z{gt-W1~qFL8U-^IQ0&Z1&Bxo< z3#^w*S(=k^cQ%OG|78XEgTDNkjNL?;*-Sh~SJW%F>QLO8OPF{QLns6=bNHivQFs09 zu?m+EY-A?8;P2GCA*n9;HDk)Ewqwg7rz8tqA`6K;qC>Y5Cd6sMPl^GkRMN-t4bbZs zR0Q<3_;`N%;zgj~JQRDgg*RBzU;Tn;$+KStINEqhl)TZ0u#0O%hAHm^iI_%FI|QIg zoJv=+wRLEP at QE@Zk_Z$fCu_f)atjAZW@&aOh~@QW?vx6c|9G~{b!!uv`-)V)Zad`L z4Ai}Au;?7_j at kqXucqZ5rOgaU%q-a-OAq{=yxevAd$*k>eR7%6t@?zm(3)1j7KJ*> z5KbAJp=6Crj68rg(!-oa9P3AJ2(ADxEuJ^^x(sj%U{GW}r_xyA|5JE?Y}>CIbRP;Q zA9=&RgxE!}f?x&nG>bdB0`>AQeAZjI1Eenh=u`I}eX{%)$V&dvsW8CQ)WpHW#>nK~ zdj}~_$bvDUcZnGPP$1;%ZM751r+3;LA0#0UpF?IO=T~o~F~X7Jrb|23|6s%N at gp+n zgcn8*5!YsIIX-yEem at yGUjGfE-RlqP33-7hPaJEc=$ZK{L#3Nh-}jczzkATgluKp- znGV-b#WR&ncrr^GYvm}WNZ=OPtI$}!QKpquts>z3C3c1Bn$6^HD!F8=(pDY+qh9GK z`T2cvf1W8fw4ELUG{a7M%{;YQVyv?~w|mA5EN0>puh~IHj7p3Vh^WH|-DhQ;Zb`SjI`JEP2nrv at oMUJdZ~HM~&nE9Q6NhRyIcyr~lOi@!$P3wo7(^5&dt>`cVod zY-251urY}t#2_j}8EPnrv=ybg4fP0SSm0m<(+vm@`d)ERkx2iKgN8{)@|yo_l_4^4KR(68$NjWK^oG&DyeWNBCAqlr85?5$K{b z at JpAmb+72K+#pqKJ at O@vJGoP%_$ZCIo2{)%ijG6!`R2&R&U{ zRPIXCWI}YMf&O$iRQ_)nDj-ssG|$q6HB50K^CMV}#rm8>vwHbf&{Cl!oFghXsyIUl zNA at eE9UdOsX#{7E!9aM6gu_p2D-bCb5_-8E_|8O`i1Re2b5Z3SjspmdZi^A(c!B)S zb89`^#UKC%0zwY)Ut+xbXKw#D+jI&nl#|&czZOr$e`ctvaO%BTf26EOkh# zc-yTH&)FCS^9=SuZ#$|RiIXxMDzkl3v4PpmBLXY2WcMx#h zuLPzBsW_qsQwgD1-^ySfU;E=!zDN;m-XP zP2UzEO;)VoMOrkk>`1{R0kr6OVg32JT!xGeK>%jLjf=8E)k at 6Bp&a5xTPABH+WR;S ziE}?iX*He`6JDKe{`%bb!HzXCVn$P*-+$v-<|?gCZ}WEOLOWh5$0AqCSx8OfF@&$X!u13E0Ftp`3UqE-ImpIOpmPe&Mz{ zbi=!y#@`b00>_;w+6XG|u&Jm3!T7iTWM#2(~Iby1m zrbAkL;_(}CFfXAo-j#S zN(oH>`HNDco?HWA5F1`I6q|Jw1nyTpNu)1E*@ zE-jCG_NSQcLbeX7z%SO0CSVuu=Djy?lV#i2=M`2TRxUr(ND>~%^sAMmF~fdxCmGw+ zWFt&ySjT`K)>?L$7v~;cAw{d*0M8}RUj^IP#vx*zP^iAW$o4$FY#rfpbr`e8UBp3; z3Ag#GNqZVumoA~mSBvAHH1$fE=jtqbpSdt#HrXsyb6v6;#TIC8`V(ikf^B3THyX&; zCR%>DLN1-a*cfio#N$11AVmjcN!QL5Jqpbev%+%F5y=)N>zO7_%H*~tR$#O0-l%79 z?V#Qp%+5-;sXnhJ`9g|}&z%B+EHYf*piA>;7#quX7NYzuf+sJLSU36!@+ALAw`td0Vzw=!gC2(v^; zSxzHzytjA0JcvX&?rQ%7!VZ|bvACxsUw^zjoTvWT3ZdYcS|P3ON-nQK2Z+5NN>KQ;ouZ19CJQ>^*XEx(K~Hl7H<0xYgo-Z%ddNM90>;q-#@xsY zdV?DLokcImW2+#fc>KcH-2&C+f4v`=FG#2xQ)kH^xws^q^Dar>>V))TfB8woY9J}n z29QvajpV1AGUX_z>nlF!3QhlH at eJL{Y4b9ZMMjvfQ8WOn@?+AAHtJ_c36_A5OD5OC z?<3o1uNKSi`Iqdbd-757>z|N#`2z$*;lJrK{}vyW{=JQyfeiuGXmE>{n~8W(DK&uu5ej{cHmT zSNwm!#LMCi_}cQqN5#jW*0x~=l%c%GTz{U*1Utw@=JS^@nYlHKTU+)3t&{@q=}=%c zP2Ci=pxb?V^{vZDcB`F42Db|haz@@ML-OWT0{IDl)Gt%o^zZLr+8 z|5g~>r^6wKk;Cr%C>kkK4M*~7t=fw>KVqb;;n zHTj_%?#{Te9~LhrY~7`LO$aIG&k$&S&~r(o$i`;d!p(5JfB7npi84MTfh%vZ^Pr52 z^wP|D at 9F47n8A!C<+jr=IyNkX#kPQ>o0F#qU-5lc6>(YgdMzlULjyKAsJcm0U$s_fvnZ)Wm#EFMic?F^`J;%KcIWv(w8Hbd{uf3Xj@ z;0*l4Eojr2{xOviW)(?OzqM at VZDqSdx(e%VSt#)Lj`nUz;SKIT8(Sb%QGmfeIf5X< zf3J<~e>Ap#WlmC)4CzjflLf@?`dLRIDzMKX|>1XVQokx?wjbJ at f{PnJ=uYh4;5 zI`B~R-VDzhfg#yK&P z;|;v8m-pkJAnmo-0_a%hbKzD$5?aaml=kk^BWVzzcgtV2(bAX6j30v|IsSUl1hnLZ z&pClRq at obfS5{A?M&;r-8p23(mpugs^7rM)gx0;bP+L7RtW}LXN|eC{RhMvm0uVSzJ-FmxHDoPUtbIq!HB+ zI++Y$&(<(?Zu%n}7%eSQKZus_ZOWnn3i*b&2#oYN?vA1zSM{>*o})Dfs0O3f9**CT zPnH7 at E8)Ka*^_<>5o5|JF_}L>EIJ6MnS1pu>K6Gq6z`U%3vgLPnb?%JEF at OrHk921 zIiTC*QpGp+GfUI_p;^r^;VmFUv(u=;jR>BGy%kZE1P94}AH|xKMFd!WXtE8~_F;J? z5U3y+)={6GsWUITXGaj9H6jLM&J^#MdzAAO6tj$!;iv0x8GEjKBgUIf-mE8vS|%hI zuW$WX?brhHOIHr_CfsCN%(xR2)2b_5W4(4(ADOQSQYig3X)LWKH+_mxc2t$xj1XNF zY!j(B?Hj*Uka;k3(!nA?F-FJttJddu8Xcu!v=jCZvw>jPOO14wl&|u^*g$`$jihnI zX%_q^L*5KZLZQL#1>lg&<>lt0p)uP~srNELvMw=dFqSS1iQm=e}OXMnM9ZuISAEMw!qjwaY z at y2g4mev=OT;E#ordMwjPMurkaHpi32W(T)3k3dHI|and52%I2h#by=uN+N3&07&= z7r1x)_9aBYReCb_ie&|opNos4R_KQv#FTmpH-P+u6>;R7R?zkC3k?}={!R)rxJ-ka zA?$meQk5D~$xBbksrbbx7?Ib{@Ke}hc6(3 at Rm3+sW0vA48hww&ZtUGHgSb&QyCg&u z1kRA&6~s^}G_ltULGW``izr2sgRYi>g;+R0y#}wtoMVmU?p%Ye3TR&O1ouOTgiK%H z744G at 7lG2Fu7FqGUl-nu^`0wZe7yosB+(5q+J-O= zMaX4 at od<+IXqyyWq)mlX#dT2LCk#>rX1?<>=5kbipzv>?+D{Y3OmzXHHRhw_ at ig+; zluV?mt3T2EN=!_EC+~2;zO4S(>zUuh!^{jNpQNu5v%mNv;TV1<$gL3yN;H24S*KB0 z6`ZQYCRo#EWI|^`$4eO1G)j3yUcx`uiAAPkpXhrEWmWZc2sG0q>bxD#94N)Z7;ujwL)7O`8~xbhICeWF z9$`9zq>OXMB5)*l)cL7PqT|<2FR-R783Nsr#Y(s)A$ZRiPZ8-&2nhdw z6S)6xNkNvXjuM^|*{R1s8%AM at QDC zj9BLt(#?{VZRa9R#Sq}P?r)_Y0yBI9h7Y1MNA^7M;XY!P%xB)?PNJE2`>iQ8U!Pl$ zUh?V at ls-5ZX|fc4LKa-pj=2b|#k+WJcP at XHU!^9p172YEw55khoYVQG$&U7!ViE%o z2oYd9^YPAr_w3%j#d(DN`V6-9 z8$9~1!rxR?ib{(zt at EY2@!3Y3`4+ww7uy~-hFF1C5w6CMmAh58QsZg7R0r$c<*9on zCA+Ez0cDCDv#OmiMTPq?v;a4i5fSZq`6YXt2`|iV*3tqbDCdWLCIXt){9QJJn*H)< z6=|44Zn}tQ4#uK=8CuKM;(fZ#s)640;P7Z_Xvep2SE2@@T=uMsC6NZpekzqxqwgpM z8Kl4Ul`G&{Mew?^T)(7dqQUt{W2V8OE;i^J9@|qd2-??mb at blL{F-gtBJOnlFghiv zUh1RONceVhO`2zB1mJ3e{d}6owb-f?^3Knc#u#~83o$6rRM~ChP*?byxhm8YFy`rK zblT2u(9uPVlsIt-Sv{qRDD=TE%o&G7EFHZ$_PSAloA|&8dBb^)7>8sK`>mhzQzFJL zl!bQCjTD$8WXz6&x+1KuPnp#jGfE%~9P_;W9s1X-g`SPw)R?h8jNTt9Rz zL*HSK<)Xvk_u$Fb=*G}j43P+Du2-mDYKGn%gU^8deB=vnsA(uOO!Ypfqz7PVHcG+J zBN-cAH>=UzAzd4K27)tZglV47!Tw7YJGyKe@|X(a`(Jojw?BRY!T$MFKSlfR5mf$9 zQ2Cc%i#0rfqUgMeRueA5wcv%ZkmGv+MtGBJ6fh)xKkN+gB+bEo{0gVV_qQr)hA;fR z`JC14 zhkhrYh}Ug8CaU$IAp2m1^}yvN&P3GUh&f{lCiPZm2!q|Bi2(QR@)y6EscP^2C3Nnn zbQmZuZQ*V5CwxIiSdtKJSFE`GGR&_ zHCUx{tRn1tr}d_#6hkM+J9ui25M#fvFc7?9Z}PgV%+kvK`eU_&O#lU2g;2aWS`(b3YCsi|1) z^hDL{|XkipCwF9siHkKfvM9ui?!lVrNP#j^2n$kZBd#u;K%PSV4S9- zFBb~Z`xw5#zCJNDp-RCJ|4NT9c{FS1 at KY3&oZ6L7O;2W4#<)ef4dSb)Z^CuX&9O at I z?Vz7HG*qA(g- at 4qz&1428mOp$oL3iQU{TqqUyTkf`T8^0m3%Vj76ndg{ahA)CA3?X z1ba=g8^RVfpk8$*Aw*SQnoMJd_P&STL}rQyFvJU??na-iAVIX0;WiOkl;#fBjia=6 zUnhJF;<~WmUgTdu&BJkNc5D&S^mOQ#5V3R-Iak)n_Tbgj$+m&24aUthRZ|Z1Oy_kB z4M~9zihEDNQjlpaX{!z5$~}V!muR7X0F#Yc_=wts%cbkoj?OJhmctWktyBGj9c^9$ zDf)(c3;EAm&=>h?Ghmqmbl{M;xNrDGi>x2 at R@V7 at KB<%D74QW{__6uaoY% zg`~NPJTRe+;2>%deVxI%$ql~0 at DGN(i1&_=^7WN~@uA&vbtB(W*w{mJc%Fp5z_ti` zMcE4D_o9&oGmT9)fZ0U6U~Y%GL6)qD2d5209)YklMm;s%+`+tLSO1{{$SubV?Vsqn zsEiS&NU{Llg`Y-6M3~L}T^L^X*n;Q5LU2DzisDiKXegh+rmNsEy%C1rMUv`Goro4s zc5AK^xKC-HhCQ008Ww-NI-Xj^A`GW+ z&YxHbv(h_haQsQ{C|>yyFRZ<_nEUQ?pw+Eh9*1$+LUn`R&tAY2BZ>T7bY74 zL>4UJwIN**zT}i{2ak-s0U$r9p}nA*feq$w22i96qUWN9`hU3neg)^rDowCNj`B8& zS%nco1E= zySYh=`grA*6FS}CSu#UiOoG1Aw71YZ_D)Y8J*}oaE5%GR(=^DwC}RaIPV(L(ui-0R z_gnDkN_4Hl*D66(EmS^}XOmt-pbBIN*G3Nl7tXcfgOBNxrDn;bpukprFA7%u48T}P)mg?Znk)p5Qly*QdqPl#@|hZ$A2 zvZJSj4j5xp at R@%f&-LxH3od9(?YjPW(~d)^cK^XuTbwYUQ<>Izf34 at bW7N33G{5!3 z-yu5>YnN8|3*Ybq9q}HEv0rZx+qX<{+=mo-0GFH*3~NbAK+HaJPee0gzcERJ3D7ai zijmL=8x`Aw!zIZJ^qqW)S^c8wcyTIviA>ly$30vUzxv2`Akq at NLUS2TSSYw|NVtbaez96d4E_i8KK?-wRSf=9apoHOD!$8N at TxE%HeU&F0;?u8qMhCr1 at q)xL;5+TLInS_5Ck3Eq;(c{I3WgAgOf!J%WP& zvo6u33FoDyg7cljJ|<&x)$XFz;f%EOKRA2mAYYs%UTl5Vwr$(CZQC}_+O}_d?Zdxof&*s1m!_+dJyCRPJY1wf)el_mz!z1tes}58bN1; znfKn?pP!lc8IN9GZq`dTlVYicS!2V-C{-lRcyj1&C z--lLEvtw^e{=|n`yrVw;7hyQFk1MmL-M=xm-?;Rh4>8`zem+t|47!veckk+VC*JV% z)12V^XODjf_v1fD^G!do0uq^E>K&`=C*Ekj$q#8ib7gwS_X(KM_uRe@^FJ@)IKD#z zWZvRo;mzLGVZ}(^A;Q{(O1t>*6et&U3F1jM5$YNZ0!8FWOtJm+F-%WKl{>6qIRaSH zV29eqg$?V?rEb&OAL)gpo!NyuO{4 at 7DR9b7Euw!T_K)HWMK5K;Jgfk8xGUD+^$33*^u(`gwAOY6r$Z;ZhnfJihbN=hhl0>9Ys-mnlW<;ROo1x zonsdR2l_Us_A3ezMLOtHWx+(A@%q~n)`^sr%vL0=^}QdnT|OKn04jfGSb!JzS&^Bh zL%a2HBCLSf3ZI!=PxcI0H!r5gC5bUtI)m>C;W#9S=R>j}#YvpZ*{e5vQE)-5Y`Lp at L_2c zh^>~7(XSEt5M~{*CF(6+&iJmV*Hd^I!_c#Wsv#oLWJZjv+&R;TwM=ADk#)tAw#qOx zk&&~|PDXcgH_TN`ug26Ssr{4 at H*O~>B-bm-Y^{WWU_F9Q$M{08`ac9`cREeQG6UO2 zM|GpeFF&ATo3YTvWLz?(0c^QVEKq3vig{gILW>7Qwz#7Eq`5BkXRo1 at 2)aYSEvBfB zc5m6nh7|ktZy%5+0?5cC`Bv<)ty+xrhWzZ+`c0Mnxk2Y8h2b7R0Sgy9ExD_7MbnG{ zM^@f>*eZkA>o`s|GsxmEtJUTfeiqEA%593>aS$NmnzGSgo at q&*xuhTGWAGBM%1kFE9rp8!hpsdv z*SJGiaL-u6GZC!}%cv_MzeT!8E5i_ZEd?2Mx@!5JM{*@3^!RwoCH zL(^EGK at UVo+C~kOHCn;;f}}|rrPf3(JiIlL1J0qd`>V**L-tK?~ZT|pmly1L+eB&BkPnjEUp`edaWUY(`hPD znA@{tw|tvQ#%g(N+s6(igM!Xu>cMir-9?nQTW%A~L3oM?F~mvRrVh-QT2QtB zdVRq1D-SZ-nw`^x%va4i$Wdphp%?WynzXbJ6m}Cs;>l(3%R|ZBX@`}8sSc<#oUNV1 z#+Ss!6ibK$yv)?mP3O|pni!bZF2DPrDDc!DP}f?6OM}5vqlgMAXBQI!yiWmqE$55b zIvG)qbTbWOA7bMb8r;c2PShpH%^}-DcKMub;}1diZMgLmAk^X7dUrliF_o3mbjwIF zx;4*s1xds`$namfW|{_!XO=Et0p9-eEc!jUhxVM))@)d1G5li{pT!%MDw_)Y8^j0u zR~*p-nOU`!0{E&iojr*U`fMpnZ!*Qy&}`9v@#wAulTx}U?rMJ^HLee^b3JlJCQ4Wx znvVo&G2zLBd|Eh9<%QU(W_}olcVk;3EStR8A0`^v>jfN~FaghLu~L)FtRrinm1>9K zo^fRMs<6Bo`K8i_Rn-k#Myo7q2gOK&8c0c{K|; zB(yYB!1C at +{tg43c8_}lS_RQaesu at oSbVc(!sTF>iXtYiaVlM at -sX#tKcnslYe at Rg zg|WSOMINz*E^%{fhL*O!}$FTwzf|>L}q|< zrzI_>3yhfV&bV>Quz#pOqODb_TGdfz@~@oNAF5l9<1f*6{~YXf^-?3$f|cB#%5x63ud=e;rKjXF`G8+_WFI_kA5$V} zy1c5 at cnB#x-Wt*rhL at Eoaf7`ZTGzC*@L-FT_!cd>ye_uY?&>^Gr-&uZ`D#J?fA at xt zGool5$?Hfzt3!5q+(Z{|+5Z;}I_!93v|JUr5$(vioR`RL!=ND>)%4MWRfNyZntNYB z`lIwa5WmTR{fXS;K>8#XCLlUkN za4`qjq1tm9YxV|{zQrtg5d>YLt9mN* zFYn`o_|jbUk}RF~f- at IVhZD}5D2F>hnpwSNiUM)UM>EPAzAmQZ3X@S zgaAwBE^>zA^Ew+w*qH6t2|JYT?sg!7^jH*@aUSs7Z#%+k}YgpRky<#Q4P~+h-y1~ z at r6#UzFvMYnrrbaEnaX!WVw8sJ$E%+EX!t!xUh4f!PBU=An^X1*in~lAIch%DIssD zuCPsLK8rVybI3_I?L(Ct(uXp1AoZ|MMLV>}Iy+kcJgclIAo0zsfZr{+c`7zBzyS5L zl4OdP8=pSU?vgMo5^P~J$ANN$& zepx}1zjlmejWg5PpNfJLY{Ly{_;?qH)Dr`>%nct_YR$0JfxE>Xs^3cv^FeClX=)be2#kuXl z;g7HN4%;cy(e}29eAoNn<`>x^ZZ=|+C$V4Y11EJ13e~OfVSA-(2P at mny2Hz(^z&ck z*X+Xm4p1*1a)UM%0LQg>Vev}3YcdF{QDA&A+F>)?B*ESnQ()GQ54O@&$p`suRj at 50 z4gw}TIRF$2R11l?SFbsKA+65D0@G2x(ilfqGVfU=`#o96ww7)WpL`%ChNlozw2Dw{$aLj5 z+(6*?QZ_YA|6)(wEwfE%qyyK9ikA1Q#dbTY%<)Ngcmg-*LA7E2eyt at Y5V at cR$jN1Mg843<&5D>Ay}_ z|EmO4^fN2zDIxFnrA{m=mnL%=e!YuM at j~fcH-gAQ?sz z%t38fj|Tce#9>PIc8g>T4=<;9jQoeNSz}6Lny|lXar3))`o1&K44(JDG5+x|rQf26 z)Y)y~(PRK}(MF98^}gjL*sW#d4|M{Ah;-I!A^@DU2}kWUs;-8XB(1W#{Tg%27v at 1% z-5T~k(}+{qXi3=gmSLUi6{)H=GF0bBSTq at CV!P_Ju|FO;LOu%BERt>5S^7#=c at J4e z73%sL7jCK8b*PjPs>`g^omoZJ)2w4>o!YG`HZ9tNC(L4tjmy$XEf#p0u<@%RJ`ZmR z8TX|bZpx18xE;yF_&*8Cm5f_XALmg at a@%y*$=>EW4zx*C)ojZRUhq7sk&?Dy*-p&g zh~fRUqaFr_H6$}NR%oN(oy{*@(~+kKU7)kPvQo3>+#-d1w>GWT_eS3)8HklkQ;=Kh zB`oQ9^Qbv1{YA9R4!vd0k8^OCIU3V&Glw^j@=M&Bj)llSvk7spsuUtonnP*PA zD2?2L4}4Y#zWMyhk4*}E)->O

+-w=k0=O-nk`k96VY*jP}zjJ9tIH;Jm7tn8oV z8WkFMxn_l1ox7&d%Z)Uv+|Ox$b-M>ekZ7{ts%z at 3KLI%xyu8slq$bc&AxSaJXH)VK zJEB;J8436F_IJiwBgA!UlaZOB#3F9lL->GzPGG1YGg90o^XQ3#o*!?c5B0;^FW z*n`FaR0)Q2W(PJ{XJ~Pcs{ySpu2PlNl|E_O?6FZJqjSNO>90!<#d3=~ws#sf^6dm* z3g#iAS1Z}xRo6pDv@%}Ga~Iu{?R|2fY^RFz=}Nx(zV`-a6tm4rDb8B8s}_q^owN9^ z at 5H#D{Y8<}&#f`AFn+aoeqQkl9&CcUYQFVJd}2Q!8AFiE<#*)E<>O5f?1Jv3_o%dq zzF~b1m>=N%`C}X*Skwwh;D1qsUNFMecRizhlWUncW19qDflUt_VWbquGsz$i(mPPk4tSWRC1^yM{RZ_kPKX!g?V8h-JiN zWC%9WFa^TUI|W+1&WMRt24f~fdKS?zeL){2$$S<_byE_Hb4M#Qx!@y6v;Yyr9ziMNaF8>Xx5_ztWC>dYH at JT9Xn<}xFtS}@1!p3 zrJTDVQ6aq6SbbTgt<`i~5R4_5{BHkfg2)cE^ z?g5f-^eIQNw2<5S(%3Po0}LMXw#DLRlkU at d&dsBvfVIXFR+x497I*{J)rt1NKO_+L z9d(`|lv=1NS(ZL$W}i-^<^orgU7HObfV3fZV|OVRodD?EEc)gK6u7~b1+|eY;oFNI zO}%cdx$e)}@uI0{sudbb4nvBgZCPkuOQk>0HN(nFXhrfVJp at LD zdzKt9tzb at I%w at vg{@{=gC%I1%VuZAp>UT07&2SwQrPSa+3_c1kVEXXz0$5p7d&?ZL z(x7`%DM=L4Wx{%AgvMB at voPNWpL(Rn7P7)5zR_Zga_%A_|A+=)^U)_yBOxcHj+;l1 z8V7^pEzUfiseb{iN2g~C0($`UnRUb at S-JrMfi7y4;6jF07n1<0$~RNV*dZg at c-iQ zp8q+9)|}ZP?NDVMu03h*%#YF%cLy8$^zvB?vl2vVoMMbS68UV{nReIsSIq&x7kHV21BC=h2?u z!27at5vU;|=QarXtqz4?w>bW`Ywy>c$i^!Pl>Ze7Pd9zPg6^HlTPBP@{2#|aP=Bia zdfhvlH at Msv9Vq|PAgMbaj8EWiNuTedAb~*x%S$*8+HelNJB_z&uz+&Dp8|%Tl7nwC zf}b+KpF%$esXGG<)xpaMVW3RJAd{g3a&=>uer9E1gX<@v`EXF7h~!q?r~NVnEn*a0 z(;}FQG1ADCg}QNiOF|V(8)`q<;&|o{%5=$4(K4Bmq`o0~vN8za3p44TPD@%@!51-N z=^8rJh|yF|U at JLgxMvzB5EO154!f5&ciY`PgUuTX#T@`m1I1i|Y(-&MtEDF+A`EE} zAhkj;of{E~G>Iv+Pk2#kTHApV5liy_`y zQ5m}dD^C250#!LE62gEpM|N&mZ(dXQ{8ky6(o|0f#<{@>9NYqgW!kNBcWLH?JLS&M zSYU!=PP3~(aiX==QeeYIIUHMwJ9(d0pJ5AswyZ at nXck&Q7yEK(PpPF_gHRYF_lFb%z?v?L^@0a*&tfkT?q zP|Og7ufj0-9JNkPhVC1+e4&+gBPKZx-3-Z(R=l7)g;G0SQ^-3e+g%3Ic2)yWRbqHQdeJIqDH4*5k&rZUIksFoVpV9r31 z6Rj;RF3m+|k!eUCpj$=At`{o~&0*5ffooEmfsH6WUX9OOgPr|{F>}gOEY;_qvm$b5 z&(Nh$cI2AahAY>yOUv*uh7nMeI(mDc-XMrN9`k2VrG)~>T4 zHM(|@xzsE6q=NPA;?sSB{2Z2R`^vhr!gKDm9?Ye)lIg4%E=tO zU(9KrQRpP8vjsd*IC)-k;bt=8d at _#B8 at MMGKj7t#-;??da_SnmkmFvedDi%n>+rSo z?}}1RC3#YRql>O)yvgn>aUt0$=;75;eqWSNhsZeWn=VN*ro>eH+==E$jH6Nt`?3!w z`%Q^vKk%rBKDgdShz$lrV${RAvZ>PKmZGt z=H+h#ARTjM1ry;5)V3@^zGju52W=Va5q2P`)Nj@pFmVu!sR>dZw4r zX03>t85?J%-Xm!mCwr3QVhY(W1fsI2vxFTD{<1ibNS{xU z_|9BO26NU8ihMsdBy&+Q^UKsSIGj|OVKCN|D6mtwTa+BGM2S3l%s53RZOoLaw`h1r z>hBC$Lvu!wH2Gx3j9r6t7|*_bByIXQbbB=RlNwfB9}`wySv(3OZStdJGHf{jyxek^ z#Sykx^x~{|bI<+pj3|zGMJxMoqGn1!K$)a4x`sBQK?ux>yt*O>9g80hK}B4GYPUG$ z0tGB9N+19WXEXKts%rXm%LvL677~*-b$eWpGLOvnP-5rJLPo)9ZYHNZDpUzA`DX z7`_ at 6litGZsH<>7_CpLWWSl`ZyH?f&m8<3LT6(6EpL`-h;hsG<7|4pIq|Rf&$@N(# zhC at Ki=~wKk1EDn`&^6&{`k>WVIY0u at r}EG_33i!`qF&kVgs at wO|7utK!jLOi(~sw4 zaSHji at WG{xpZ|op?JLiHetBf$cbo$o(6AMg<<`FE)Z`N}`?mg#5ro1mp;E#K5d|fbShv=vp$o*$&TR#T z%a>>52p at b&+P=8dJe+<>DHjy$s02Z_afp%9iP=XE-vBDz0InDpB$EfxF?w-+0r2Vy zGa6u&Wj)ZHb)0BHYslQ6Q|D-f6p at X8AI>niT1OB2qL1?D6Mwh`{cXzsjKT22T&I8`rEyM9Tk=jlR zlE5S+-FgyypDXANSI85dLRM!JU}mzkNb_Y}YEbhOo$3!*h^JvAqYu1PjQm{&c3(tF z@$#4Yx?JWuoiO7n^~34f;7LM z<%d=_^ptVL7lLHsQTEvmyFziBLiH7D*-zMwKqI&Hqd{#zTPTLcJ!JQ5yM41G!~PJmqmUa+UQW`W5+_n{gY zAq;M1!?_dzC#wd=PB9wZOa^xBf;}>az316x3`KMxGU32xq at VV64}d*Nhk2omZp|=l zLvpx9kJ^BALQ6|V!!J!Q#nFG}lD#sGyAU+e*67o0&l7pPH z!945#6!IXh$U<{9fS>yUdC~^+W9W_#zBwr{%cCfSP4_VXfOcPHKHX2RPSi zN_l8z2UJT+uQK|n==O*bbllyALd1!hlxk^myXk ztspqfG*+=lH`!;d1us7t6=RvJzU3LGa$#+9?(#|4y0J$TCnF$Q0YSDj2T=}aKF=u& z5pgqp+9J+5QDGN$a0HtoS>pzg;F>~Dk&%+ZuXlr-VFGcxbWIA8M@|cRH9aGR%01KU z1S)@sGkh)&e1>)=sy z??U1(0P}!1poDQYBrDBHfRqE3HGLYZcP4{&nG|K1trcHYTlkr^&!e2gJ at 3Yu<$@vzyr&)zudX}vefP%?qniEJQ zGxWvR-#eLziDv+5n0 at 5_`~vA7B60rpW6FRR7>0kLlt*OA3l$wRg1s^vv!KLOtU5?( zH>`QjoSp+OB+{^^dFU`s0anA8$6?aZ<$gYl-KRW(%0?t&wQeX_djPPop7ZUNCFn$xF_D-ss76 zE+Dj=lSjIYEef>C%x>W7S at AzQzfllWwa-iNhoTx<6DsvT$4)N!I~}Be0s-~I|JQZ? z|I4WsH*)iIH*>Z!HB+&)viqNL?_CvSCDhSba8$DCg+^H_nt+1JkfO|l(2C=sF;w$3 z1sGkY+%L9C;g1y=gy*%V09HOW6}g^Q3AWs>uFkFpk+leF!ENYwrcurKM zM_iW37E!Y_O4gaU2g{0i85I8D!;`-SDMo7AdX zvhAHX-VI7BiB0~{ta6Nf!P-J;pE$l-!jMc=Y7rM^Q=VEeQ5yTNuxiDAIwTd8?TTaE z_z5?$dn&0wkO`Xm={5U36>6{Pq8t5yxsoC3mVS=BU#%hr1p|ihQm$JFUR32-DNk3y{yWn zC at p8{QTbL|lFQ#hn9d1+Ov1Pq{Z$(8ZAPDK!xfeCRh1r%KT5&y;jrP3C?rK5EzbSP zx`-|>-)+<%yX=2qGM-n?{}jIxuv=4qG+Ba?#LFA2aY at Bg5vs3eiqm9_$d@4E85yU zK2hZ-Un|4rj{p0tJ-&GCygR;lZPJTimdE>jY8|}2JU-fScZz<0E&3K{1Y?g#Hze at S zze{|?C{Ya>Fc8r9|7%-}e+jyjtC{ovF82SDZ at 0v4=|M)+(VtA0?TghdL9qTyFQ(wO zR at krtScsr&7*n>C7}`Yo+}o2-ggueSay^dR+pEGaH=Q)!* zlrB%COhTyvRU^vsbh+h zgIPgMHO%n)Ywns*srN%$dK8S9i#me5#u3>`IXHnvue33rQmYexQx=MRjw!c9aS`6* zk;>4Vj8tvvhxk~4Jg3=ok`ZU==ze8OWm--hj7|F+#M at vsO}d8|IUDZM{gAbs$;0*y z?DlRnvGd^s{HwQdm8}487%?zbYM>5eW!$BzwZu0AcD473+DGA zOdSDE&+mauc~A#N7f8Q_3h_#MhAfQ?3(?W%rmu=O!`Pd_A(L5Th3=L|1Te*BJ>#C` z$)qvcp0~Y`Wp=Hz6ccfqK(|vOw#}5TpOKSa906lWZQrkP3@`M!&-)OZPQjC#t!Zxu zZONhvNSEcQ87)aLWF9&liXqBmfwebtTW;-`cC55_0Bal3BaIikds^RGQ1#2zX*I{T z>Cl2`?VHPGgWFVsv(Q_f->6$5DS((r7$!lyQ at - z&Z9fM96ymf6CO@?Z&5Vl%y^J>U8XcoYr8=@JsKhpKH8;L5`%+i&J?WBRAGg@>_<%5 z5{;uT&zxOMWq%-c6o;0wbxP-s2oPVzf-kM=p7M5D)N=~#^5eKta}jUn!L*-XMD9dn zjhuIklO9G?2_Kd at 0i|A{Upqs;plx1C zdf?VLcimJe$}^)5tkFV0MVj?FRMebt0nuWA4sxKy`7{!9Wx2(MT}2g_!~aDs({k$P zV}0XW?B6N1Ka;&8vP^9$4tPQKqRf&CWxy_e5!LmWAJLd&p_)C zy(!2v%Qx|8M+Et)f{f3cv+2-g%-NA1qS!i^)SnQwfq)s;%3dmi at 4lwG)pJ}$xMk0t zR%K%zJAJ)&6O)QgvXgForaM=CqGD8Ar3Ir8({FVn<|vL?{72gRThROfK;#COde_%F@|mcLjHey=L{?l#b_9%w+C>o3r^zab>X zxWsR7#vcw()DteQw)`TWK0^yUqEM?-#0J+@&2aCgPSWc(H$+ryHs^+Rl#Mryzqw7q_F|YeTg9;Lf6X7O at n$RTsHJO2 z+K{$L+!^*bq~WI{eCpot($CK8?WWj^d+F-7$Ns>@xqJHW^p)}WN06|-B)dYkIkt;@ z${g at 3C;X>XEG<@N*YppB2ciH0iT?k9 at c+>l?B9UAM?=a5M-26QBZ*cAp8?R6WhkpI z)>zC*N;)(`3P{}(jRfX_2zR4(OJO?1Vq%#X$m@$dz__DHqV5Y(6|%2{{`C*6JAy(- z{e$bOO5HbDvFbe76a^v-^*+6?&#(Fnov*X2yFi%z5=@kybYat;dZ-Sfh0v42zXryl zh%rD%!I{$H4~%(Yt(3Z{#9ftWBL^Y|VhVqO&wJ5?iD?#@MGqi3aw(w}w-3!_AG)XE za7~ZpQ(eTFyM!11QD!$W zkNj;dm6peJrMo2A+={#ErSCSDWVwSkIAT3j9g1vUWtEa7_&3|2{BNY at m7=c#VkZf3 zS-R)2rMggy>S!}2J4#=Xx0DUm3!bP9D14t#=5{LcHXrtja<6 zhb8HJWrT#ENHP7VC#u1ukEvQzhdzSIrFdh_Gv at U-j zBgiR6sbqpUpT%~A(fNb*8b{4k`9nGlLsW$J2^4(PQMW(5z0450991^@1{l|rvwLMs z)X7inyhq)qATRFq7j76wzmP_+W;2^mcGO!}@x0zc zYX`+eXva)Qe%|iYBEs)Ue at 9kA0+X(tzAbz$Ycp`7{cp?dVE3Xl at m z1G>SD0+a+8Mcx}OUgnV=>`oZ-ZCz2a5f*K-tZ!hP=mT#mN0Qm>*AdQJCh{Ie^P$GY zk9g!0PvN&xBBE2g9N4ClX4$sl^4f0!_C1OaNE|$;*ufPwf>r_0kZY^P*!qxdz4$K; z!7B^jE2*l|kG6T1KQV5*D}+CIgytacmQ7=@z=`MTcL{6*P)gf$Pm=K4!VVG09rfa< z=!x(U+m+vOw<964s`Jvx&2(smH!rWf8Ey**&rM53)nhI{P^Cd{GMks31UtyRq0fop zu-s(9pf|SpLJaagu-=J at u%a>z(BmsujiF at KLbJ-oWWBuSepGLvy#5yB>^+UVIM@@5 zZ9%-{*-59arM!HjL)Aea17A!GIwVK_CU!+TwUFK=^k+z`LbFN>HAq`!E&Xy)Lw;U=`g+1}PjxmOUX}48W+f2jqfOxB4SA zjs9ryiaoK7>ixucfG^IVNlZJt(V8LKVjaK4o3qw{|M+A^EaCeZf&c{M_m9^^_1`Il z|AGA4UcRUrct5?F+gIi+P(-A_!pg#s30Dvx&A6cn$ijW035v+b!L9AKVT{)|ww=G| zta}>Ns#pG6*4p)CRapY414mZ0Z at qOKYPDOm1@xbLqyM~`ySuxytk1N5y-B#6 at BYo* z-M#(Vx$T(_R at ibO`0Zw^0c3N}N6>pahye0N!Cx!TV4sP=A5W0Ye^A1IQo>&&aQ6`5^U#UlTQku6GjjGT^UoLA at 9DQ{ zv1bncdk_8>gzp!H?|V(~@6dopz|UR%&#^%OMjr~Nf-UT4 at ViqOWX92GGXV=f`LDTt zUf>fmGyjuErhwn6O+fDh)Dw~NPz}=RXuqdU-ZkBTaK?4m^9$V#$kSGot+{j5lM`Ku zvEmd)FjE at ps>gRUNmG?o_|*sZZWkBFQADgaM$s9;K8&q(mlqFw=tRtB6IHpfBFn(h zG9^*8#$na=J$aMka3d>ETnB~t at -SE9tbJ`M6J at Ipxh}N-n%aBb&-Ctq`tgbE2X2S^ z{6c_-CBWxxXu1XRGqb#oCqKwVi5wD at y)Iex6fT#bEfZhN4IX!5t2{^1!I}tfhT=<_ zAytE at x0*tC)A+ at FPh#zy z!85A3m>(f-Op;jQxPtps5^qHnhDP69CaGaJf>h6ENB`E=+C at YhkYpXzizcxlejBgj zzI58?Q zG7GuUSG$O64z(bu#9W7noCK$~w$SvS61!FwBaTXARdwWX(f%B=5OUWK7!?57FU*&j zKpeTW0tOgy8ULW0cv2Fl)Rzff*)&MM)iuX6+_53!EgyZ}c=99>UL*DlMAHTB8kaFY zrUbFhX&S?_iF|=1w)Z{V$U{NB3GLd&r($d8 at -%51?&~Mow*y?I8dIGmwA4xZTA zDG}i^a;0FNLac at 5Bw2abG2$%aB~=n?QCm9}@LM9yrzOnEOIqZXYDy?&*e(6jFZQXx zQZ~~HU$&RhE~&!ab)p(2%o5JKQFc{Le>uZs^u$Qc_|cDkK1(KuW<=V#vxNpD{d^60 z5;#!&Vxkl`A2oAe$Rjm??vMm*Boy0^QihdIM+q_!QZ9Nk-<>u z#=ZP#gF`&r4>_?RybCvT1`2lmUJ%ZT&zAhPRLz{2!Q}?%5 at ViJv&Ve?i$-MkYjT!K at T>L#Lz`b+9UQPB79QO0R4Z8v#+5j2q(#Hl9?GZDZW! z^(*tN`lCdW`W3n6*-9E;4R8%HT3v(-wrrE!Tq(D<&Ja0VU9Og!bQeHDhboLp^H|@9 zpK?FNJDpo>nUJz?o%&GOcvKr4Q at e?QeI%2SRb6|X>%Cy-<1%o2%E0b%CM>+X0DErm z#an6%wd;i|9p;N_pPQ?MnYkUA*2;<&SGEeQQqeej_!eZrsyR;Ig at 8wZ@r8GT!#H=v z)7)|s3A^jGG=3OrYK}Cqp3wB}Y9{rlISbrXBRO~dUC%0?-mPj~MA1+xCeX4ax}d`N zq{_Zk?l|EQkdyOR)W3 at sn~7l at SSU)4rRHJ9+p4z0w}Ne->=JG+pnKDsC5)6`;=r4U zdeyHVHmzXqQ?>lA%%mE`!mnQ5;N6-q6QWR;AZrqh*(t+Td&gcpeZ8McqdV2G6FcyE zsX4PQC|7_Zzu7`>p;Oc#zH(%OLFxIM&P;P(90D)1FEbmhHHM9{6El`iPGP8l2VcV?4Fh4}HL-)>=M191c>D#)=gWvR at E>zLyvxm#vk+_Z zc;$L8+9YhndM4VVQz$*(N;{VrWkccV9h&*?OH>{IN>-!RfddPuVx!mc8YYW^$oiE^ za0-|fRRdpUIV#G<{>n4tiB2&uO>^8v%Ta3=erztIAz;cjc>-0ElRdWcDHb6sI at dsP z=)=bK?qn&tx_j at G3)tw*jtSHstr&y)*Qk@}#nx~U_T3eUb1OIDV;v$}A ziTRSfaVm5x1!rOt(Z-(ZxhwH|F8Fyos?Ij^fVjhSNn^Yh3 z`(i*&XRP^)W2eYzBT~APkuGDaP%IuBAxtD^D at 1%AhWAwFLjWls!y z0_$g#C&la9RQe)i-WhifsbaAZ)g1R@!`;VYsm6ngEM^3B3T_hYnZ=XzeVc-|pfjLJ zjqmD{BfF70*e_-ASkbkoCxfrW4TGZ?O|I>EQVauA6!xWT>_ z`xCZ*;G#dgiy^anU+_MqdS7 at 9(&T4x|Hvu8m!Jz{D8qCwID?g_H_Om8NNGpnEl^*j zYyfnip*84tD>kDe`3h-p^q`RX`msF&(04iXzO59TV z<(S1I_dfOHxPCgB;$gQ$0P8Y<^>A;i-y!hEnau=v3#Dt+czy0xkXfAfT4OQhIZ|X>sVj-KGckYeBhZv;t zA|rA|@Gdh-(T^p=UMx=78NI;=9?>qJ^pr8X_gn|BGsO2k7Kv}$+O+-;>^fk-)GZF% zIwe1+JbPf&s$&`LvxP-+Uspcg=#K9<#qVusV|Jsd{22=0dSIhmlR|oP4m|LNZ at r^- zX)OJEkpGrw?EiKJ9ll*g{j;k0X9l5}RRkY9*zh_(KlJVA!7pvuZ8VR_%wClccJ)%wn z_nm|AorCX&`mhu4_a1YRp6Ty|Kr=n0fLi&xpNub<`ea4>zj5|XQKD^2wrH-jZD+2u zZQHhO+qP}nwr$(yO52%lSG77-b at qGj)~Vat{Fwiv_YpCAMD&QmC1UH1vR+WNPk&@C zDy}^YdW6@(_uiz?O_fh()q_?{bPV(}{Y5<83Bi at 4x0*2xXF|XnsBQ&oI5BiWca`Ltv35Jez_u%E3;NYa{VpH*4YXqLh2QT$0R?p)Ka?_O zphr)ev^`b22XVJlfoR^OATY!DJsTB=E1Lais_)%M(BDuCf`|CLJa6)(?~zzVhN(nK zUC~KZ(OEU%oN at UfR{mU_VZGZs-a~p)cVnaayv<$ejW;|h^}%CYvRpEf(b8ykTFz%# z+F5U&b at SF*z=2-zkTxCw;+&)D*0JQiAkuC at aRz8aJ7I)ZapXW12c$-%sux^^Po`=R zsAXLYS>Bkn9uylHJg_?>#~fbCqeOJ6Jp+4RjtOc`cR19(|rDkp~)8-s|zCt}T zeW7G&2%~)cT#_L-(>}7<4kvvQVonPM)3q`gITkuBcSNj4##*3mBM{l8w1&%Mq|ws) z*9RF%e8=+JYF2&ALVYX4^p14wz|%h0{LZJbv^JZ6RBf(hSjy0u|Az9SMWkuPMQ1!Z zN<;WKvFO+bvN8YIyD0duH{Z*1E?{{ z7pSr%yry(b!vPiX``#GaBWFftldR}=TMhRoIUUx+(bg))7l(c at r769`H6|8sWHg7a zwCQn2qnXy=v>P>p9?4niN7pdIWqy=*gN at 79g~rLl(iA<$j&pYi?$$-cd{emBpAg#- z*n)@o##Gc4q1kLBDQ=99ss;xRF9Gz{dAIMsjS`fAEm-#e0s!QI006N4i~8<=_CNf$ zB>~xr+W$5(!@aoeVr~vqppqX3US|EK_9n*&H9cX6kCLu=i^#wB7Y)i~V%V)AalE>j|rmaK&Lvk0p}n;Z1ISlxL&C>t&O?oJHW9{EHD)FJzRA1V5+?Rau4l`BY)yoO{< z;G*a?W>_v`i()(>Qys?|27&oX?9`3Q){JE^wy{F6)*3XsklC;=uEe!flZ at fx_&o2j z0TpYlVs`b%Z258dC6u3nAzqWt?Yni+_FqP1fXg3st2f at RNc(aJO%+VtZj+k|Z zz*@V{?dR>DDhz1>?X%OY&b?S8jq;SW$LHscWBuG70~j8#n8?tRI{3lZ+;PaD at uZY5 zkVc`#kz+COuHgp1k|ry5v#L$ss|>apwWeE z8a0*|0luA;(q)rXFXjeGuJ-(XYAzK|foj1v9~*@T4+-xHJBm~{dEXea!*Vs_7SH!$ z=dbsmfg~m<&%<2D92t*^OD!2shM*OEuHm at -8zXDe;WZ2p`7Hygb;OcAn~B(0oSd16x=d8!IvafMu5oWKWsk}GM|6yd1Ia|ea4 z-#hD-AnhMP-aI^I=M}biz;ZD=qnpdAOLoRi(vQ=d+FgJOw?skEN_V3>DmbKKF6l`Q z3XYr$xBj@~Q9>#e=PG)?{hgf5!0Fdl~3{ z4fYYOI9s8w4W;9zb_0KOSm$)J- z9%YkQ!jZrKdUH6&QhNha&^^oo^j?;zbKD}?lw-M1>&L+~1>VkrLX=wNTXT;J;s|NksEzS=H0Kocx zgV=v;fY6jhl866>wd%ZTNDgTA5G`9nH7du~(U2cXVG5unCgPzvR$H-hoxU!I;K9K2 zdWwC`gBZ~~fV&mNI8Cx%OsUvjv~qQsnR=PdN at wr&@%@3okBw$KNL$R)=Yhpx9jOBl z94-g}zsIyO5VuHC-cqp7B%pYv=It&!fE`pzj;t=Brpko^?LJ`J(rlI9J>?PfX*^+x z>bO|3wuxJ_!|_;Wsf8%KIx6jihXmGX!j`OJpfVNkG<8K!a(0bnjIz~$_1&<#bg&>< zrWaoPz0#ha6|q at 7P+`;v{35mQkp#xxL#LZAqNvs)5Ag_s@`6rCEb0aZjRj;KAqZch z2`<`{pmtZiihN~8qM1*ok*S>iU>Ca5Vq2Q8yj`MtXe^oY5gxN05S5IXf3#$^+M4x_ ziuQ4x69X8*F+x}KJN$z~<&JMy5GU0>m=Js$_`GXKUGYwAlmqu7jX#5fmnkL!anLL6 z6C)~)iedsfUH?M3cps-CJm)}FGh6hj&_D9ZK66!i9<#$IQ7AS*pZHO3F-<%ry|=TO zGya5)hHLRIw^Ju at U))4a6fSR<+1n;5Q$|{?MiHG2?C0nvXqxWJmr`n8yK=sHGC_Pj zn27w5h at L-nj!4`%Y7TDB!7;brL6`16yhp at 7;kz)-br~y*P(77_AbUjJqtt`x6o1uS z3!f;wU4+wtHh~lPV-4)31&YQ2ng+2?yT}wcRZKJxvCl^FY=MMWACCSV267NiC`W#2 zzE;cHUO$4~>nzZB7bKSrG#7j?*-sC3Rr3bAfx0>d zTP7~4Fv+_isbN4?wlC>3>n85%hm*=luVsgs_#d zwXu!Ue@;wRCtt}f${~;Bay~C4LjdXf734{sht%Y~P6!Bq5|JqKK!?9qTd_7C)o5?b zr2a at CB?%!(N8v@?*)rsGqN=gdO{EpLm%g;0zHE8QY<_)yokRH%bBPi9XHp;|C&=ZK z)|C-P1V}7OLTpLwu?TK?ns=-Z17FiYtF*ne5pyjb;|l(XH?}V&f?hqQ8B}PuV14Yc zUIketw^~Dm5xA`=#Up87haG_Ik1R3vsDz%>*j;bO2{9Y5u at BjAFuxNEX$XV+FRgo2(oYME-c1#x-61#h{B1VD8k5d~ImCWiHCTW7sd}4xV_4!E z1gO!t+=ED>(8(fJBv1>DbRq*DT2UiZdYm`bT$87Y;=;aQiq5-0P7Az+-I0NHj at X;Q zX#n2yQVudV|27rXYGcN7usmI*yHLeq*oIxX$9w`57RR|9f1RAjo+g-JOIjcC1^pxz zCs)I!a=i&BcC{sAi~gvEWk<c(FkUdH5W2fDU~D*_u#*mv5TZ3t$ot|32p$lx{(1oa_!ugj{Aktw-RL zUdE7wiILw>X(e7Pp_IPwkDTI;%ZpKNf~6c_614)i>43f$QnBQVZah+ at Q#_n%>( z9C7s_^j8$vL;wI_{@=s?ADwn at irA|N-?*KZRFh%{@OsdQJbXKYW`e^mi2TUd z49avjPZz6S&b_rC-3Og`JU at ti;5!lf6vzg3dX#E5{Q%e2!r(Ch2G9sP7=DwJ#He_t z!AOuQ26FZZq@~E8+#%F#7{fW}*MnbO`)skea&{S{KW4(IFQ@(J-{GNZ&vul!{e_>W z^eNmk4W!6i<$L5HvQSMkf3BUzouUh_Ax1}lQySLC`vJ#n;Zlm}fh-QJG zm9DZTHiDgYS{_PrO7#0%&I~g=R-|k7ag#K;@h*$2%Q!#BdJcLN&q_LV?v zQgmb-&zPHt+lKu7hR0x}8r-IyL#TzMpeKdTsdHq|8C)=x2o~OEucFQ%I!|k8JQDt` z%k&bg?>e4W70m?D$)=X#8i12|u~;#_RFb*!}pj zHtJbzCtb=t5~tj5P4CP~VUYL0q>pSjut`yZ^@&$;S#ho!*2JfHaF~y+IAdf&Atp5p zOB{UwT75B^{{`k8o}`1&DmLM+2!AeP1gQN>-iaB=_HwrUWP^5e;BRDahPdP=RPaSc z;zgr|#PG8O6|H*;TIAD1G_U&+J!8x9IQi*j9ChyEfIbwIrZTqRYD>xFE-wQs2i0n? zm!ELw+^ej)tStTGNm$7o<=+tZ$i;$#BnJ+q3^H%>qb64giOVk-TDO^j6+7d9D10J) z$zNL|e)iP=n4ny$(g)#C1sl}fhbER}s z9=66Fv2 at e!XGi%N#G=><$~TC24&lS$>E>4h|wWc(EH7+tqeZ1smY?&PXU00|hSvmSahGEYfC~cKMGLr2zezCj%3JBCj(6cWY z)vCSON77N~z4o}0_Y&0a-OZUp4#aW6k)&oWuWjj at KEM#nwgFxx`MX9fo4&jvY0c%V>znlU?R~F4ORLqpOvpy`Vp}cQ at _dHe?jw*!^575AZAg^ z8s))g-3wjSfOLWBCps&3E)z~kn|1D01e1EcHN3}qT$UiAJksnPGhY_|+s}w#OURdX z5$%9%zyMcs2+&8g!NwNOCzf|CRTj%dJhu?V(y(8HtM5TH!tc-M3y+LLg$ffXugL3H zpK(y|0qnWN6S9|TAqt|)Uiuf(__LU!mCFuXMdEY`kDw#ci~vNgD4SFM#JGVvS2jOa zb{htg4_8j7%x-p{j at 0`Z+PP#q|05#dL$1JE#e|E_M$g0|gq5iGCf7zNZ({UQm2hBH z{R%bz3Io%ItWWnX?(-MPyRLvFLvzGg at b~KHD^0=>6o(4!8LR|vka(y%pVZnJ>ZCC~ z(yuWg00wzbg(qUmaxq{q^F(dfyx6Q(nc|+}CEWlH*`kf6TL=vZA&W0J!zv1yJoTz1 zH{W^ zAxC3549Ka95yOKgfK)mfN~zpgAG=oLl6fS5SKdRfk{ zjwjtXgVrZKID-cLTYocUK$-c5STSmbymM~Q78L3-++t^Z(8A+sy05rfz6!u3T{)2p zW(f*)@p~UhH$}G25$}lPx`AyDbs95aL*m1NFku(m*Hk6v16;~US5NJ$;8DqE$70SK zRrqcSTUFQmycF#gl`6K1#7gvXWt7U7`CDk`&0GIMnR#92NO%X;HjS6?j;=XBqUfmo zi82dyJlhW_9!CMJJcF at lDY4)UBIF66;1SWN0zFr-r?wfzL7WqV?*qTC(n~0HR?Qo( zyD8BP{-`C1OwVEQ at pVt0a^MLOGz at x}FdtYUElam5t~Jnn?e83& z`FZu$W!{*bC!&$})5Rz5flk;8bU6Z74;!Nc$MH=J3-R8P79)@q*BQM!-z7w1yWF?g zlmzQJ64dVHQ>pKM2V~zG10kHo=*?i?*pJ^szmC^UWPsBWtcTmdN|n)J1iwOYKQBb|nk`vOT?nRhhc2iGH~kE3^n%rYgDh!CjS` z+~=@4vO~fID}qKB%k5vr~Yu%yoM6 z(!3$JYwoYKz1kfL7+K7QK0LO0R2enkO`S_Jp_225VSxy#_=er5w4vQIb|*`wIj|=k z8OHzI*YxA|o9s~H5=6E2Vi{8(DG6|$y7iE=WB2#SJ$V97z7+il at QiCNkdq_p5_f5} z=xL|Ngz$7jdv)HfWu<1#xcBEP6)hG;RYJ$^bHLmaCw1{lAa{7|T$~#Mtz?&Hi3TE;T0=d#T!f_H0TPwCSHvt)OC7a6Lhj~T{41dD#;e2uY){JT$ZOUx)@5p% z@>oN7uO%RwL4U((VSyJWD>p~OkBfJK5r_5tI(y1l4-za#pp5I9p3kHG^$+=N6^F#C zC`!)$=tf>n_!9b#*mnMdvcEx;1^#NP#B55oKbEhBHM>V{rIU6pw~__Z)Z-hvrwDxO z=9T55+Mwm$J47Y3j5DKAa&PO~RYxJt)SUp$twk#&h+;GVv1DQj at GfK8e)I=qvt=FO zq>%eQf{^u73#Q*?ZR$q+U{;nd5!w?o>{-8c8ud)%}*j+%SK at S5#xbxCJT zMr!|3^l%_kH$1t4ObS`cS|Af^JqTHtZ%9;oB*u_lMMG+gSJ7$2D{WX)1=^i2jFXYW z+0|9Qp=xE{4T9gfvcTZr03SthJ&r0-$O%Z})++X(b9L>NxHkNN zfyg?RE8pVixd4g32eVYL1=A$iX|>1U#zK+WOxr&uTantTqYp)s-fFu0#nW_$a3cMv z?m9R^`gvO(t*Mp=Ii=*+j0)sya_E?a#FjiRk{AE=3HVf%j+QpNm#ZQD=2VFwuDl2J z`lI_}nkl3N%tR*h-ASYUm>8q&_{g#jixR9==Gv(xma?^4KKg?Z_xu}4ca9Fr-V{Fr)2p^aF?N4>}@ zcw$0TP(piKn{|ZvQ`83=0objpw{1bi%@^+PC_BJv_KGe7ts at Psc*}6LS}z8RRemUR z4{0BM*x1B!o|6FFBa#%@h{@Z()1TDW9Vkj?@`BSZ(S4*?g*r3(s63#5e&Gf*J9<8$ zh;wU;DEVk_Z&D!EGH#pQ!^Sg%_5=9O93SeP5KsJzV-404l~G19?C^@VH at 82YH@7*@YkPg)VEV9m=R!WE at 7^oO%%zx{csuR+glCB(2~uQ+tn0xt2B~M#uFeOx^UuY>WtKn7 zAOln3vxL`(#Yn{?);^(|G%p*^8V at X2)iYk$XhXz;EaXL8LKWwuL5 at CAg&NF$({}b| zWg6=8+>Vs at MT-cTGG}t at tnPiB0ug%i4_ at QNhn`9!U-P^V^ zNnu>m{mG*>_-W2-C;RR;phqPce-1VqRg_7GuKhI>@E*H}B(Dl~1@$X0WJP_oPPUG32;cu6&eQ(Bcw{8MiKkx8Y|0sFsd* zV-$hVKssuna&A}+O%$)hYh=mhiu9Q8!fD*0jJ-89K1 z!_sfS0m?SyN!2?oE|BP%DNQ$(*~Dkei1zru%fNY;H)j at r004rZ001oiBG3Oz`u(rM z$bT&IZL`13U_lmZe?g5% zZn=I!Zv|-QL;%-eT<;2^zc9Nm+7Opf39Gv9%1!?aWQ(8~2NIFLPjg}Y26Q2|Jqqdv zzyi4Y7)sZMv1jB_8tG|lEUp!cdJlZ(S4^Ow2_rv4;M%=Vb-Pq at 6IGo7El zvsA+X<&l8YKwV@{h8-L@^%=cE*|&k_ak96^yKsMXJ|^&yPR at 0_Q72ZW@yoZ zli~HHi?HN-{u(CZYLU(Z-K7Y1&qbw-EX;5MbCX*rD82!abq+;)bjGpRN4!;S^G ztnMM1$&{AmHzsbH#B}J^t9)sluACfw^B`<`*_RZVQckFp$#UE|kkk at e$VH>+_?AfI zZa;MjUr3{cL2a*5#L`aOlb!R4vF1k<;7 zhH_(sxq9uU%y&tI{K_Tby8T5d#3A2>`B9!2hkvU?*O&1p{+lPo z;9r?2)BhU1|G=)c;-&~PcO>*c10s<17O0pM5C{^;=|Tn|xk`Z(NJ?8IYDSBf=}#%NGT^|v>|5FME+pK zy^0iF8y+Yb0sT3jHOMwoP#WTtLI)?o$_1G?r0^IS?GUaVr(8#Q{MKVRTD4^4BhB82 zxImW5;rnhkW)=@RNoU^MDG^)8X7AQxX18HP$ac(eJ#pZ3^x?D^@h!PKwb7(CuK-OB zp5dw(VXu-y2p46q%0ox0cs1J6+H at 39@EC5C-Sf3kf0@|_Pn=1%rTP$BB`#yN4s5b= zVtU;W%^x at +Z$ji7A}-#I)tKkajs;UaHA<~#?}*x=$2a=yn#4bgPR^r0%TF25oWVrn zM0Tsvxmd|5zfp3inucDKP$r at _D+liI&|(s#r03C`fe%tkc*((_@#ZRo7 at 08xp=$fT z3xWgS%&`$gj4 at a7h2U}dU{}p?ZyKcl$iZO}j!D)*<4Tv6fPcgWETL-Y>>z{lC-djc z$sENfgK=@GM+%$W&7|*B+B}gZ=f}Xeh82rIZ||p$(FEtTKGJ|uD$S?jdZBW|_s;j{ z%zynnV7&ITb=kvyVnZVKTx5oMJ;-OHnhD1$ohY8yF2YCNRcqIYJgyichAv_5W7!&3 zK$oJMxCK7OE?HgK8hvvO+LwkJa*fc_uy4GujgNM!Md-!pJF zq^;)+)s9fUmyvE-QEgTMs~GjP-Wjv)_Kz~f&QnPK`6gq=<{^9k`rB&o=UTEZyuVo9 z1NuMNx&Akn|I$Hbs6QM&}0_S4K}_+%uC< z!>lcORBESxkj=W~MgU41wewyWby~FzOkhuSKJ$?C;>C4Z`1SO$=?ajjHkW6p6&x=F zyvjsGKYr$ch?I742qVIp*cNOq(yBaFmWC2`N;P`_04U+%B#6&((~|;dnnER7qcoYh zpvlT=z2HREF1)xy#~nGF&+wox54; z2BtBeNu{D?x^N%o-e`S0MQSdkg!Gm|HI03S8n3LP#~8~o6J?h%l4rKUeW00#(cF5v z+C#Wq at 6Mu$`GmJ0!l|i1T37~u+e#0|HGb6|7tLvF&>QC~ZP6a0n*&!*XIK!&oF~d* zFQ9MD+$BC`f2gDU=?6|wQaRzb-az>6erkLqhwy}T+fyABsU4 at jFx zQIu($519*jL5oNmm^;XfB8cr1Ey2i-b3Hfg(tzRvDE_z}hzt-9Uh$dXBW!`5#LmwR z_-$wJ`uEZqsZcVvaV`HjgHk}HT(a}ogrXBU)|pC8+o$hmww{cm7kT9q}L(5W at L?D1>CZDC$CJ3rKS zXnA9Of^cw`3y{x6`9={&lp!-Y3A_U2M;07JgsxfrYtj9(Cj3&8TUQ-SQKcRH{3O_E zDNYtf>Zr<~#R<7Ps?j;|hCsQ53_F?)0W(0=gYdtVNR4nvO7VaJ05Bo`byt#q{QbKH zjFYW{xV4?tKNO!`MM{I`gD2*o}(SdS#I8*uNn5t zuZLP)A0RvEo1(eMM4YpJHd>@Esgn87a%6EuOqt at meIm;eX5`m*DNOP#<8x*mlh;=d z&K)s*)YCOPn&?HgT78{CVHhaDtKtYO4r3HZ=&21K^4{x at i<*fhvp$x^zFD zLwAZamud&~WDrQ{s!@$G9yu5^eLdt3Z3sXCL{oZASpJ^3pEOzgV~rr^jas*%+B5>; zv(OYQN)D^Z&N7K_WdnsO at TO??9HbbiD9q}l0u0}FV*jJ2UJ-;&Qykf8Wr<1(wI&tq z1tSyhO^4K~zJ13ksSx4N*Q at g2>fj7=>o&mO)BxmgOb^ASH=azpPth7P;iEAczn{BR z&?BOLQb+W4nhTV36j#ga7RKb;6Lg;D437$sYmTc=XKQux$+kvCV!X=B__g#M3h)&T zgX2XW?nIOs*P3fIZYlk%XV|8URkP~~FY^ccDmik7bZ}(%&2hl!^A3f(h~m7_?Pqk$ z)`kNrCAc70t(p-ydP)zCv*zl^^qMAOW2kce;?HfzM*qFJS;wXcP6ZC^1^dU8jEfh4bO)L22H)$;sNc0fo zfr7N0%2mM?SI%Rb7 zDa$!?###9(YzrSq$l3BPR74DmQ5%Zbj;Jp=#APX?v+&m^)mNF{lOyj}nSRB+UYDY< zx$MF$U(5`NIICG|lWQg%{?wqRSej at HzAsVokiG`vCH}6cf{!1pJCOFhAU1(Fi^Cw) z7?3h~z$hY+B>Zc(%IF`Jj|&xOjsVXrr=^W1hBC>f#%Z1ho`hD2P46-5OT;!1YWLVY zFWu19k&ydB3LrAm9Nb9#>8@{JendnS~NjQMM z_|3sh;}MT6PX5W%M6Gk?G>OIz(Xb>qodp**{&;`p-sfcwM(2)5&r)&=WPL&e?;W8h zGueoH`_$i#Vb>mD>P`*U5Cm)EVob0{IX6Mkrk5-iqHP?Q#+VlAY61ao?zSoo*>*S1+VZqOiil0Eg z02itJKo>rSm6#iyG{-hOq)mrni|F?Ko0|rF3hxxxU$0SdkbhlSX81>lm$d!s3Hr at K zOKL74=qI<+Bpv=>mYrl+AVEf@+I4C_bUSaU at BH%iUTev zAi~nzb%b%(tC4Z%ZdO;f7szbS7!xzXGEAQ|8jZ}HtTdiaSWsConqVGL;S~&8zT0a8 z-jY*rrfvr%0Z(?+`?`nugGK#b+f;9(w1jf$V+;LZHfR(eL`qcRy2X0&flXav+nTC zRFK$fi_juB|JD_Xh9r{ZGNi;(88(c587YP7tGwdf`_)4EHoC9kBw+_9{j@|sbAdtT z{kH&%Dm5g=o1AK{`*11OQsWMDx$G8!YjBeWD at TrnaL1|C_Ag&*B|KZ|+L0U%5bZ%h z_Bx!{wAeP^6KLj3lQvdTq+6#9QBM9`>q3Iye2Uh2YkLoa;pzoFi8P0&#tU0E^A`BL&lR3Z zFijnAbc-V851`6PK+VtHqZ(!$plA=LPN271?2)0AZ4rXcB&v+ at B7FMW?s0Af;N*;7 z007T_rJS7qM-cu)@cjR6ipy5qlmL`R))o~NC6#P!@>CahgQyNYgc)qEv|hE=?2 at Rt;xM9$#4706y$>$MIw&%PSUfEdY3n#oGl5#pGjwSksgo!B?q7B-xGPzAahksq>)}Es zgC{wff%p9C>Gx!-K6l{?#7lQLn3}DpP<@Zi;RBurR;nr+i(lx4)flD_G;YGh7yx-| zObSsoQo|DfV($Qg)CNnD7~da*ny(}TeFr_lk*8wRDF1|3@!&s;FQ8-6C~N|28$_=T z?^_)s87~24NQ{%kR2(8=e<>%lj9)-n8-(ll;OQ8n?GQ_~;V@$o9HXU;Oz)d9AdG{Q zH~w{aM5#8=hWG*e&qsc%5qe1V*S%8%@;`O7|G$s?pB at _7N&hZ{h5SfguF=y#1fx#m z2eTw$OGxo=#g!>2D;2rwZyuq)mbzGYjJ%!3HYkkk&hlX}?EX2ugXYIRmS~7E$U-p)glcQASD-t%3gijxFJJ*yEU;kKD5; z^9cjQ4C=jvKN!hdV_rh$MzW=@uB;Y0?D>a9v!)3nrwCx^bRpKWwPT;|{k>V at y-5sJ?eTS_&V zG`Ms_LI^52Q}bqq zYevZx=p|C`ZqL=B&xdYH_V4jp<8|?DpIgt>hpf{s(bKV?&zob}Ut9jZWNj$BDz`XX z<$A!oR|AT#xUo4W&5c}NK4?CEcn%N0F?g>70&>aRKxgmI*m>T&qH-zD^wSW!`ewhP zGSS-I!!vUoAE0);)%z*kn8gcM-QFcJPLZMaops(&YCknbY>};oEEEojHp{3OhjCX%h)FuC=*Lg*gAgmk7sy at w`$qS&I=~ylpAh{Q!6^dFbYB$ zA|^13%r9(N2&dN7*t>eMaJFQ|5IONLo!d*SA+fV7*GZ-qSffdE3l1h&%bR9+^iN+_ zX4LGTU5CAt#g3QV*$*;oZ6k7sv`&eKNpC!GV411CJ2fY*QZ{Pr6eahNcjl!#Y7FnW z*P%P2K_hlJgY1NN9jY`1XdaSI_=}V=9%F9dRQ8p-6Q7{Vp5;8TLp1CgNgBUIvGPjL zP_Cs^VxX?C@&5UkSgJBG@%={EkGVr&Z$ndAbK)DA4y{PBOnPJ=q#qjr(h#ORuhB`b zquN~78Z@~ixEWu>kft&zsVo^Uc-?{KsBL!%PKvdG*jA%aD`gaLu3E{dvhOB* zh;?+<&GRlor$KfhnIz0;0gY!3lI(Q5&Uywc6fwo8g5`0p3&@_qYJiEj3J=CS`*CHT#8XfjUsuU)3~enz&cB{9tVnHN1i_BL+Nr at km5Utx6%zj9pk3L zEjD#`6bw;hvl|`-?*Iq`ulyC=SN={F{+J0?VomGiSbwrSWzuDM`Sc}~Jz;F_@;pH2 z#6Mz?t?U3vYtKY}SeUB3ZD`uqMylm1B7*R{gfO@%;!rKl&h=y1xCr;`GN!i?3%q2C z&b1np1e_Tq_ka;2x6)3nI+B9;;@SReTbI0~OhSA61<|JcoglQ4W_eMoTuR;O!3 at j( z4@%y3h-)HGkOlE9SVt>&-b!;>t$XqWNO$StyLmx`y3XorM8thH@{m+!hQaZ1;DGRbZsZ__`7MX}~{{y0k%PRL{UA+GkU(Mmt?E(eoK zyNh)Vksc9PQ6OQnG&=G4=`i(4`I$i_M_ZezkZDTCJVW9hByW{{Pum`$E_}lL`929@}NA4 zzU70AWi at f{Y-7Foo2hQ6Hk%L&eM)aI3U*qb5D^h)^n*afA#w%NcU&N}5f>!oX8H5Q zS=nztf4*@PHc#`7=%rrC2X_5Kxib}-c%q!g=DPwv(*{)OkKGMRZ%1b0Sl1N4- at Ki6 zc#l1OGPrj4*FRzYU=XBBjH1>*$E$5a^Pa%+jr7MICI(Po4l2242F zp}7B9Zy7>)#BLAUnI&wcKb5z=p9TLT#5Y|im_`uQfdHW|RL~!$j)_CE{jH4y>-6H* zQL9OF6cdv40{)&;5_f at 6Q!E?dcQ9Wm=4pkpu%uT!!a#~$HvbTXU%G&mGKYpjhesF> z5>6#%6j3YkGd|$!koa?QE5>K3K;@7`66WFtu`22ggHS&i?zwb$Jdc3s++-gpYW~RV z#a*XIGlp at 8+%0)g at VPuUJPhKSb?}u5Lx6>*)%B9L_l_Ffw4(JTU&A4n)G7dgZI#zj9&+PXdYB)ZC7QR(4W z*{sFY~pb zWvs6-Ji$PCeWC;;GFFH1e}I2A6l}LXxa>?Na=$%)O{xN{g?9W(`PB)^MZZT5w0P&~ zjca!W2F+5noyh1jb0r34j#nHH8t5SE7I8tw2fEpt&wNo at J@PAl+LaL8S at L{uz>gbL z^^iKyLX#Xih6qj&8skzPH=&h#_l0Pq>FO;4m3)5wxl+smp`d0smHgrx`thVJfx-Md z{#_xrY}DKs8WjwT6r*1#oLi|QFr(k2W;_PZ%!!Tw9G%B{ zdc}NOYK5Ok^TZGe{iW&mx6jhAPdF?dY3sq>#>$HJxO82-%<9wL79YAqEcft%hy&Vu zO8WA#%UAimz4|yN7nKKPUaTel+=War^ZCIR4z&EdPTHh<=G6gJCIbs3B6pEGIC;l~ zaC+D+y46=n75>6)Y z8G#@J#%fY`i2Ig?Ztl>!c!QL683$NFwgVaws}Qz*)yTUfT at ae&J%Vmn*CnsG`yafc z<$v~Vz;K5wVQ?2L7OoMhW6xEi>ATsN42zY%|7L3^6ph^)_ZQHxLH;LOI{{l~8zUum zyZ^8Pk5;n$_wtL*O0_mQ7OOnEPFy5bYj}j72sm9SfqGiK7@!YD at l?XI_xQ at ptKuh! z4~p238I#wuD8{TNDz at 0c#!(gz_bJyYS81wlZ|@f{UFa|ovebFnNK^zaN+SpKQL#JO zZ^s3$g}LHH-ztLY1BgHccjXN|blS~JmK`;x zEoB^TrwJoP=PKRZRXwA$7T%!jLAe>h-X- at 4|!OpGxQdXh-nho72 at KDr@ zNp5Gf&BE(BV1Qv31bJV-*xIhnX6LcFP at IXLnbaDN4{!9v>9Yq9U5i~c! z1U8-liA&#BHO8jN+du|I>Zh8yCi9Jdo(7z0myK5jCa}H5LA^cellj-N at pDspJjEvR z#jwR63*eU0=e+Ol=VJSN@(!WvXM at mf;-rP at p^xGAOc;G}apt#Yc*qiU5qJX$p*Uzz zwg at e=O7-Cd<+D=wT6o{7ht7bP#>@8=iDGJ!c5TR2A?7dJkdC*4Lp;&VWg5hEPKrW! z2;Ki5(%vyjv$e|>4BNJCn;Euk+j_$h8AgU}+jeBw$gpkO=ySU2>s$BK=yCh2{FxzZ7|N;h>aQv%lGogUr=lZ zq-3jjBWx`Pjxq?jQj0Ui>PkbHH1?HL%!3vEDC}1e1(dp1+zcXJ4*`UCx)ZF`x*8c4 zv+k1_Q{5 at FSVy5{XzsMH>~m4vHCn88_I7WhaE-oaxG`qX1FZO&uBal29g>Axfvd9B z6)WaxUB`FgBB}~aSPunuupR?@Qze!xRmpIrIhEYPXWsprhu#=cCDJi{)i54%?av`b zr!-dYnv`Qyxf2NsK>GSeduX49;>*F~*l94Gt at kWa6TriVMEjdA;x3xp<4~0IjMYCp z at punXwD{Fl^PBh-5dn>K1YVb)t!Unz-4Ug%_kfI7pu|=$4QbW6u9WIhi z88y%jtg~#5o9jV#iCA8<^tVGqhyIol?pY}|;W{Og%aevDDTiYC(7H=b;LEN_%%%GU zcvm|z=mw`RIJ`W2X at BaYY~a$rt{Q)(oWrcIyH_0bSUF<9SBHgKj)ugLN3=y}#h_Q6 zwGp>^DE)C#Ao;9SlWxb2hG~{#qJs;$pJj3e*-uTQIz(5`&Y>pOS7gQ%wKD4)$5XCMeN%M}_kkNq8k#3Rnt z2?$1h`=P+>1@|a12fIu2O9cw_0 at 3oqV{kRMZ9Iom%sE>T8rEUYE at Qrw3_EWsi(FvL zN75zy=rw;*M&w2R#mC<$=5zBX({5eh`hF}qI&jWhfP3O$njx+VHC7C#JpO~~B2jd$ zoroR~&Ag42(Z6l>>?P6#bSNQ2-59LdTXG#QbEkX*Zg-lR zZ;UCVpfvtU%-X2Ro2UC87H;&4nB_R$-Z&qMbU`dPwxRsf-4nvrV>iuPwDxkPa2UpD z{)BIxHjp~+;jFi7XQLM(Vbd`pwc4C!2wYo)44cB-8U4;bRyw4j!X_a at 0|8B900I5@ z|4AnQNgf(H9;nOcU(=Eeww|`wb-*JWhQ>lEz}T30ApI+cD0sGEh9d}4k~}F8-a<=Q zR)geCa+w@*YY$sTAad96!NXE{zo3H`lS*Byn<^_SFGV`n!k+SdPek4kJ35{xPb}%i z=$cM~ES|C&XSTLm9VEU^dawO~3}I^)4MC at ak@~b!a*js0{d`zNV- at NjtWt8I_gIM+ zc5La-ZdZ|VhK{XoJ^3&PF#+$MUx2`3#)b#-B`@Y+#(mn47aGAHjKO6Q%|M5nEzZ^c zR?Tm*uMZCYp24|^4?qZE?cJJZ3Parkeu_TqZs!Yu%r at d4r0|EL;h3m+X7*yD_oS+{ zf at Wwsh9cy=6 at MdTv00;+I?+W1oVJ&E<79Neb+Dhh;pwc?WfF#r)oJ;PNaD!pgM46y zk_k<(QV!+EX>H zdGVG)9YYgv`B7E14M|+}+}|?s(g-P`y*_|z2Gi_)kS~7ogqM)8=q7=L%=86TlQmQ6 zV-zM-ZEM{LtdC2EH*UDB3vh1>i~DyKF8DM>f~8vWZdk at wzlan$(<+*q at r>GxCT8>zu4MN{jC#w(T6%xeR1I423gk zrLN^F?8Q2e?P55j*@qcqNT;saA~F;slSXzaKU3Iqmh8 at hT=fOh=aqx2sg=FD?wOUD z?9%CEZC0%)c^6Z-t<9nzRO at vtk~bDnsz6SXJ&WhuZFNj#IEsiR`tHChUXlCg_1sAv z`XnZ)5lWj>WAbyC8thNN>R~BLpj&eepjoCrk at GR<%|Sq&F&+}bIP|g{=_C`9wG^OA at BlZC+PA+Vgevwt6~e^ea%!*XH0D?2VKc z?s7T!;)%i!=|xw4&Pk36V=jeAifzz7Xi5*Pc6fi z!xO;C4FPXYQmAf(UD8~Q=%eG-ONnu|l)YfJRA3FIMe2WT1a*UC>+hV3G9><)U#d%I zi@}EOtbfjyI%%XUdqMWY8&pv3iir}|RlbE_P}xp0sWBGpoZe}Ogw%SY-cof!5)qy( z#~Kcg6v0xyWkP`6P!o1X(`%A_qequm8CnNOh=E9 zYEE8ue%|wM>YF_LQL?sHo;a%)!Okv`pL4v{WM{6Xl#fos*sjtP>D3{9xaSUlxUz(@ zEnx&__EL74xF%RD6-eD)Kj~cV+ at Ag271n(lKbW zBKEHIvdZxWg>4(bP1Q1Z;@dLV_PNq6fG-uvqTPyZ7u&tpYGRM4Jqtk-Hh zeiBWPh at FEO#TPRWu|CvbS at E)~;so6XU&o=~Xw)0(GeO{!Q<2tjOC4=Fe{RA9)D6Zy z->>Xkghwj>4)bSS&X-1Do8?HEepjHn6E^;yoNE+!Mw7#C004JjuL3{rFxZsw^tw?+ zByD5%LceaA^f`;^B2{-f9^rZjkHHNg;)Wd8mH at C1vI7r80b`iz(qhF*Wp5Y(Ahg?~ z;D|C<*-;&7f>bsd0=@%6Kmvkb5#sH_G^ErhdZp1vYvnrvAwL4C;ie1>dhk)aW8H0Z zNVtRP|FBZSSg*%uH~;H+_&iM~_?O-jQIDS|d0bIS at 4S3;Q_rRU?C34P#1eN=o+Whjgwe9e=ZT^J?6zhs2 zagCR~lvD%ih7ZJsj~U(uxUXX6lF^SLv8P&?$O~j`+>u}#_Z9jE9ta;)+L+lD9j)k> z?cf(d0!%k at hBJ&dK+;mosB5o?L+ at s3LsA*L$0~MjpgFj&-EsY7`KdRB_6(_Hq|6!& zv{saL!y0gJ1H$9D7f%DQoix~alDsR8lC3g_Cxxx7x;R|yYO+$SJ6{YXlsK!}j8cM+ z^C*Bf<1sg>bx`Hu1FVT<7ZEMQU{zW8h0^MmUu?U%zk>VA`02ItvD)vE%h`lj`AXF6 z<_1vjPrNb;f15j=H41IUBrsZO?jUDE>!iyvHTT)k^#}~|n8k4h(PV)Kn$CKWQ;FP$ z5%KQi4~cR!S8EvrgI+iT!IF!y4WZ?!rp+dLO%0SDKWu>|PScl|MAv=-(#iYq^*f{0 zbIv+x>Kw{((4>9P90o)gCZnRr4nDed2k}r=rQxYFWloU;a{w}@Rp$K_xcB-&4)yC) zf~)fMnT77iWmXqp0=xq?JE=O~pgE~7<=iqiuiMc`y7ouh1z&W4b6Ns>WZWH83iW={ z9dwlv!Q*cmk6rLtYs!Ay5O?g5Xt*aA*YV?@V-iNyKlK*0jY_Akn(Lb|_Kd#)N(7~C ze1Ub&NdbIPYWHa13XOqPPH^K~&7G%E^JxOst?Jy8TIp%A8$7X$%E$Qf*|pk5)7aIe z!p9Po93Z{AHawm6tU(nG16>qBZk!s&qm){}VzxSKNc}L&baB^ckyh)m zqv}V3nhLghcY>M&GHovHq2st;Zpq25S=H=Ju*Dy#YjiR<;D0V)K}9`h!vFySq5%K5 zs`dXR;QC(@HmXy9r^3FLoH7YfGE!QECKRkdi>%6b1Gva&DoBWlf9S+hNp5hA(b%q5 zk$V54Vg%v?LhJ`7cG>|3Pz_c|&Et3xB?YnXJM^T#nlEi#3-41}yXaN{R;+s8ZIKv$kr% zews)m<3M<^xuULl-_k!0pduw>QTCKGsyMfUXuWy{8;}*TuE&MvA+fxTAu+Al^=P-g z7g~EpK3Rjta-IPdz>6e6HyRaO(gt%I8cImugR&wbg3m``IYBy1XF at +^kK5de4 at zd3)9< zse<|^C7;aboo@%!NVKl7*`Y1Ir=**HWYvLB0HS+SlA0I#F#~_B;yXb>DHPKJ>$+{a zyy7%G(+|ych|~(R{l>eUJ~MHIZO+rwk at pwNz^6ZtN9fvtCuOUm68 at jT?O#hV|DXOy6ZP>=wx7UgQdab7+Wrpxq0&kdHg=z*qe^TEH z3RzPSc-(zlh6TrOv!)v4B!BcV!FkX8y|2ypc*EuTDA(WLA8v<4;7kI`#R#v at C#@<3 zN&oov7cf};=u)OF{VgeGKa02h&4gUb*4_xcpWg0>HIxJF0}rkjyO*#biAK}-Sb|wH zTsm2!Z8{rPC>_t(>W{_x<^q>)b1pBf$|6fWZB92zQpbaqYBd^XdY#xsdKDo(HaRN` z_-gHBwZQlKPs8IY>s)Io5muQo+>lPRJx}Wxdom5W^>`cFge>o{=oU%Yp?i?Ns%8ps zgkx6~hUIZ^t6FRDAU+8fbtTrjjOzQ&V>su0FbIA+gYe(Y-^7Pf1R#M52mBOvV>)>b zaySh|+=GG}Eih;W>0(-LbUH-ydU9YfoRogG4cQ+b0&(+|GUbatG^~pZY8j|pn+(Zp zwfSQq3}qP!rv`syN{$w6=XwbWN2jYGMaKBqy(-O>vnJ2gvS~b28k-wji}-CaQVN~0 z9%r#N#w?_!JSb9aLi>s-Hbux!U*3*BJ_V7ZJWc`{FD+VNaY~|TiU#cB6Xoi){6qJq z-O{8LyoC7AJM at bE2-gs7uNHGOvp`PsX6sAKWm3^!ZG1zxG<1%7cKSa$3x`};7_H=PUAXtH-wVY&*$4e$z= z0*WIGxk`+oJkeWkV}93j0B9(fi}yenD%yfP)VhLYXc+dDp{|wSJKH8yyJi$?cOoMZ zZ-`;J^GSZ$(3m at l5p7OAlHEM^`HJJnY(09I<}Co^J#y+oajA_b+;r4AF_w=f(8I1i zgrb)zpK1a!vPV;1y!)yezZL~Ws`SWzBHzrw at bn-B1#L(?1Qo`9Ss^0-mTKq`Li_{{ zL)}LtM%hPAEd3dq_aR*aB>#u?2Wb-HpF*FIaA(5Ou~Z@TxyC#0JLqZ3`iS2KP+xm8 zS7yC;)wF8WBLL+>IRXroQkjI<>6oyt9pW(Pb_>{U5Z?M;o8JhnhGCg?24sZU;)vd> z12IVMWii{!;e&#@xi%z&?D!DeiCwfG;T?bLwxDD z_s1nxH4L<37 at OibRSrnbomLgqRT1>|<)!Cdk{uj+dZcb_2FqwHH4H5^9sGoLkvR8- zC7)$hkrg(+$v&*!47)q}(l3-!z8m?$>3Y&>Ry0Px8_jPsc+IWAPkIzjp4wuJa0b|N zLhk;N*vv2tq-XkztLkBafE52nTqSGe;`(3T|C!db)4&x&^P|9BF>M474yGwiNoksr zkpr>;Pb`2ch6mFomqRx=qtF`IGv}o2?0ZTDd?5PGy3m9Z^7%bUcy=|ec9p{PB_^ix zdYI?DZ}2{EeV$)$e*@KpUw@?akD&b2OlA7 at 3y8olk&#fk=~hxSbVdg_eC0?a1(DZh z<#52n?-V*!;5PB0JedEW?W#PyE8GIE at F~zd1XIjs7zv=RQlZwIv`CjJJdG8qt+R|i zp-dloX#1y%Y@$SKX^|`feLhcWd9ff{msZnVj(UyPZF7l6ntcN}i3HbbYW6}cRMk{7 z&N8R3(>_Ht^tQ^ptn*P?xcV^Zr+mg(m6qy5m-76}nwnR;37iT(6}C<_b&HnCD8d*i zAJ8wntSgF}hBdNy-mq*}d*0-UQgu{(4wRtF;;=5nl~}e$c?A;Df_Jzc zYZ+u)kdsIyc>xBz1YB1eGL+(X(+Nd`m2?QR4w)iG_G^yj6lrMO$cI9%D*|e-O{qj+ zaj=m=%U}vWbwz3Ny{B$t{xa3eRJ1~0z6(t)`QP2E&*y%7Yp#J;N?Fui~LUK at M*WNm=YkNl0UO zS+<0K41-{p(cSLqZ6qrl;L_^S2&3OtN3$T9T5_4LynRPTOFw-WUdDyK=bUXhZj?PS z^amN)rOnxaa!K*Xvrmk%ou?>w)`C$p4tKCG{CTVi*N-s$D(=tKkF$hyhD}b)J+tJp zW0==NaGgbJHYexkQH6!`m==ykGPV$uYc4{IsxS*l#Yn+UIEEIE@@!EN6HxfJI(B?nWMd&v6vK$%8_;;By<&xntk*@y{8tXr40WIi*e~y;axv z;uUD0(i_%~g`n(<-zjf(#p-}E?{-^nCh}1I9*>#e)tyW-eD|UIOIhVBAYe9fH)#iDaY at Ej0)L at fqq$e0j^q=Gu472FxP8 zC^_X1q2-Y$_OHL#ad^dd`Gu>S$4cL5kMnJA`b#p02a;kv$$V4=Ds~5zB at L~`QEg?| zjW{a2?p!g;2B?)vTrW~U+dm*Fvk$)E55}q`qE=tBz at Wr*S14z;q}S;Y0YjpBWD$49 zd{d8tOI(rK&Og~Hg4PlU@~h4M|5) z>=rZcCD6FGAo3^SixItmW|WJ!mzTQI=pAJ7oOkVY=XH)tsz>Ls_xIOuE6_$DqdRG! z58~5~E}}-PsL^u)kOYA)_L4VppN{D82#GYwy(!hiuqQUdsH2iQ z>TW$1!F3O_wr+DQBd^D4OJk?~!V{@uPdt8PhIj+AY54&DYuZe4y z&&u9XMC?2{rG at i$d>`Z1psQIQ8FdsXHx}c`X|pC{&dfLy$V4Li$MJy2(YFWZL83~= zxNC?VUXOdCWl1)c>(*SN-G)c2@}Sh*+}qv;%lhGR&TFx^P^XTs8(?hhWMzG1m>7g+ zgJtV%sLe(#*aIH`f!U#Oyo@(bi#fI?tK3Mx^Gi69XZ2ZVH9x00iSZD-;(e+>s}7)L zjz97!t7M`V{X)i2GNqU%pw(g*K~Mc$tCgde2|M3K%Dt3vl1<-leZw=QYroXO4oAuA zM)N33IEUm`1zUO_JJ*%+XExr$c}c9MG2y8t3^3U2l1%#NLTjlgc^^1qZS(2(1K_vC zH3b_8IC0^;g}Mj}>r%}gFLf!+qI5w^uXU|{T;JOn0rlov_P=3P%T%u)sy#7PS^dMwLaji%RTco&eoNdaff5dk!1Iv~_;MK;0#m~C1xdgXWmJvr~VDTG($?whJt-`w2fc z1TF9!(ZfHNP4`Ik!54{_VryiQ_7a41^QYN7+& z>Y3>~V2vYBT{>Zq%;f3bfNPvfn# zPTGu8iPM#IH_+#LxDR>J2DS5}Z*GOsALudy>o}-%n2pV(`b@|ae=*+dpG at _E2*2<< zMf`J!vRUy8NYUI+x$v-~b^8SRwuCq{Z6wZYW+8Y{+HFp>4iXTqwKPly)~ zXRH0f^&d$G7h~fU1^WaZRqzxA2lUR4+jKrb8qZP%?y;S at 0)X*`s&ez&nKoPi>}DCg zJj4DWTmznnW<2-ZgdIhsu5g5fRD!`DNGahN?DY;~iIC~Qjw8_CsS3?A% zRyWV4&yZVDg2t(DsP-!U!o`SXW@?#nP_m z2f7Fxpnh}%ZEl~Vra2g&$ez)-b1aq{x%7qMr2gRn{yB?y6Q)PIj59pE^BZy#$A2#%!p*Pgs!7xqj8$?{+w9kK) z at h#qFWpmOrO;-FYvb1No(dgH4o3dM$GJF zt9#k^KQujff4K7Ug8%{DfCB+Z{(GKP*~s41!A{u3#LUIzzj at heRXqn3VKn{$hGIp! zCYa{xT=Zm+%d;p(B$Pom=9+3NXmMYh6lnR)Z1Q)bi`o;1+rG4yoxiouuR#iCts`IR zy#L-_;g_{B*?Miz0|E%oCSyZWo^|33e1}FurDCQ7b0{_d{8nV9UuO2IS#JyxuGyzy zX`!$BZRz^)dtd#AuL<<@#xEJbUT&(WkT+R(H at E-UbHWkkcuEucpi&&X+|+&zo4eb@ zCF6CU)_WW}r8dKLf`@8~1`TS3Tk>$~b88#Ix~bN>4(Bz02@@JkoxFmW9do1IWujub z=t^(j+D=(`PgN$t!d!*#yy%u4Y6iVcc=+qh2*4sE;XnGL!TNeoYM~z+7z?AbAA_Gj zk#p6G`y_>S9HWgu#8n;%{>%qUma5}Di$xGd?x$<$d7fuE#bYp?3Ib7_v+n?Hf zi))N at RfP|VKO+DW+S9)8TZMkDs(L^XS-z>5QK|)VV?PEecv*2A9spJ-w}!`d+qbiy zS5LU+Uc}m*#p5h8gW}Di%+IOk&sk7XA0UboB}u7h1mOFAW9G~7bqXCUj!^kZ?deT5 zE}LphgDZ}jcZwq5#fNjMv*k#L+!7KeJQd?i9px?VU7T$#8jegXNvL-g`{!RH7R2q+Qi z-x|328=^91p8rL8CR<(RZ|%pgVOpE&MJ{!e)c|8CXc)-`6D at gT0%chglc2f_EK at wD z*g9>*IiAYRg)5qn@}H=XTsI$(+=mIEszYLf#6uCFf{_Il8W<_X1$D)9@(Rxn&yTLp zlV`QP{{A3&K(wJ`HP%=oKj4mUyzrJC`D1XYqy~)fPyr$WDXMfbQ<+YKHz}bkTPbsq zk&$e*(#OqQ@;fD=Ze66s9%`y;wq<}=Bh{6jPMxQa%J-OwxT=ej=Leq&&gzezmQke2 z3^$!;of<NiTdRP14OG?#al zWO*bZWAlI>9K}wiGAItBcGq=!Jm<#(bCCishF(=i%ut6&Q*??Eul13okA<4mxpwCC zYONFFY0b-~z=%e;h|RZCf>4hCG|BQlX8 z97kkS3o5~dkQTB=r|CUMeE#K@;zhgFf6WnR_D~9%;#?{r={kagjZ%8=^zU=76%rkE z+)$&0y8556Z=$}sX<)^4+l?=HHC*EKx2Zh38RS$?rq~W4_pdBer>yi+nPZp4I&x4| zg240mXN(-dlkbO zCFCslZ@#XI{%BzxLw+lE3Z!F9aLu$8Vau74y9_+^8&G6;hPpsb;vj*ugJZoQexs#V zx5f#UYg`bG9%JOTj1X-*JK6%#&laq#id>N9d zSwOZrN~$zwFD^}oOVVE!no)pZn2h* z5jD-_cNg>@nfC*^P_jgChv`l4X_uV)jl_ at p>uZ0Iv_W^ckz0E_{3Kz2XFZd5{J(wNMb at Gu<~`-vA(qCHiZi8KDdt77`c zo{Z|Y&~$PUd7>6`H2THrB)34@&#TEd)v#6OPAVM{}2WwnBnk#7O#e*JoL2 zMyIsN%EFAbmEehV{4y;i8MxM~JJ&tTlK|?Ef}X~bP7vv>hKIYKyTgj*kszYi807SAeb7 zdDgKM+=~rVNiD|J=ZL68KaLV>^v22%dYEL~9=U+lM|=kL`4XWpa}7G0gi+YRW*`F8 zEf@|HZZg6ri!+*HlH&Ao`KcD&#kwrdd9)LS)~7L~5b^hFev6fBq4UPBu at Ta@RP;sD z#Z`TC5D`u)#=;^8tQg at R?KLTj3G#zeIw_YGK1-`Jhm}=0SdFyk^QLA_W*ll3jWoW} zVNf0J;Y(#JF^tQkX#73q8siy$i-yp-whO0RgzAnkjMOJ1V&IgsGMJ^8-iaA#K%FnD z!xk{&H|;_Ww1zNOI}Jarbd!VwVQ0~bnCbQzaNWQS@~BKy`pCN&1{C84%6_&wrIT%Q z&|vF;9LEe6{VsO*TK4NSJat>#6bZbqz7ns*MRt#_EvHH^3 at di7$SC2Jx3-R4dl1#R zbK&*w(FE;p1 at OBDE+@}p@ zwe-G}Dp at COgH0tMj&aifk$6P(}C-PlL4UcscymNVcf_`=smx>-ni4>y-cWE%WyE(TM&Two^* zr=rm at pkjS_RJ`@Khj+-w4Qst1QjZw58(YU$$*^11m|NAfTc|B5R&l(ZAhAr^k(E^n zbL<5%O20vz#_*T;_XjWbzCVgg%j<%MS9vjRKTRFBlcXDI#nUB$U)P39)aO z{;4-vaTpgV{}1uEK9SV&VQ8+LVXR?jF({Q$<9=Gl$S-2K_!-cxQs0ZkZdd~31zMkn z>sKEM*3J_j;KRIeCjol?P`Xde0lB7#%(80(NB`T?9ud|Nc_vct6Ox`MN4nr3pUSFl z-NJ0qI1La7MT7#1Fws2xEpOJi8=a;C`y&ap&$6+}QIjk#sP3pMNV#AQ;16w3B5WW@ z<6+V#qOl at G!xRA)R*qvcS-FK{=Ii?v^x#dg0_L at O9FoqA@QXVWNk8X%z(^+M2}F>6 zspvBRy>x6YDAtJw at 9{vW_Mf3VIdB$>|6g&E)?X(6e~;?^qt5tW2`^hsPi0;aiNBRP zI3=7)Q56hXY5fja38@)<2*ghjjhnYn3Y9`G+vr1ur;y}~>uoQn=VdQSaM;Nq zL3|COI9uL at v(tNKb<^Aa{qp%;0f?dwMHp9E$(3lTI+Mh_plQom0;~1aL|rtr)@6f# zrW*XKZG!MwbOZA?Ab)XdL3$t+OS}=hk;)Uq2zNDYQ#ps$d3DK^+d{jgqeXOjkVb^dq^2BBqA??1fDZG%qPgI} z?GA4y16<5NjqX>k_cT*&hOjd;#$tAs_58W-fMRuYO_DT?SS_dG%8eh{mVS9w=^U09 z2(5XzT55Bn9<^Ny at Y2J$v9%dHJFEVH0J`XS;`1vjLy0+#6 at oBfsHFTl6I!RO68`d@ zT;NS(coNMiT=(rDFlrh?3|_$`)h{!hdbIT>EP2&F(+{XacswNOSY${@Ypvxf6nq~K zawUyu_*W&rC at fE|oIFtoCl$3Nyb!XzN6$ySwlJjnDNjB6iqI)BEFea%9gDptFyo?b zngKG&_2eWKQJTE)fz-tw`*gA1I^yZCUJy~8KdxaN&CY5$9EHjXx!(nmN0SX|ikNJE z=w8{tt*<2L6To~jJ#1pgVc_h#xT$HrseddmPE_r`=} zNcT#{R1R-J!`s(D5a;5Yr3SFV2o-2k)ml;ehhOrCqKP1Wfv`u^wk9J*_Hf&fjw|>x zr_Jw~gipHF)Gf5vnlF!82 at uH7^8jImFO%6swIB?>bDSF9bNDP*2BUCOA4p2e%RD!n z{C}t{rK+Kzv;qSG5rF-lM9u!&$^MtE_nf;00Z=ja?6fqPR zZq2mTdP9>4;%Y`S)fMBFvi9-XrX*|6f*%#NASgMMx_YY);yed60(RcoZyzPnZF<;} z-6M+B2q1LqSXH2I#8~3iEJzl1z100Y4qgY?)zqop at C4E(&six_almlXPDtT5zxS2M zMjN?>Hu^b=`M%-RG*=2 zv%?XRyHG*V(I;00Y_D{iMKtiFRL)jXy=q`_EG_ttP9aQCJy4G-6#r$RWM2Hiur6$LvhbzJcIG8 z*sIy-Z?!a3;DjH*UsSj92|rZhOpTuXCbL|w+j(7Fyxrh;XqP5N_kF<$1YTZF_E|;# z5KJ`nOx+ZtrgPz8u_}^~adKotE0Z+r>I*hQ$6g4RR7Jm9MLF^+%XCg4ahL9r}u;zs5wgo!yFd0J0u*gWwFI{H*B{TK24Hs2bTtHs3g{J#Pg* zbLYRw&5hQaWs3oL%vJ0hIYJ6>RX$XZ8S8XT;H4m!uKvv(-Agr@?y;4V5nlq}4Arsj z3Olr66fz|BjM*C at 5*hL@*rkMbA`;_8%7_TT{2USjDWFw(1bG3*K!la9(&p*yvFxEo z5AcHRuf+WDhqlq$1x`HBM&`vZ>!bl}8NtW6SA*5Ee?SHPY~Gw?)M-yaQ!q-@#-iYN zvv|Ivb;=gEdqOXLgl%w(d8(f16!G6w0L1-ve8wTl5~?>RCj0pB0m8B|F0twx+WDTq zPtU-c8(@07$a+Sy&(13+Ak6}I`bJik2K(?@hz_?1Ght#bg92WBD4i$CSO0MN+Kq=1 zv><=oY{36*M6muZHQqHLv at CF3+%qaRHfp(Rc)7qLE-A(eut>B&qCY}<0sx%Tk+x=Fii-&}YPfE6b%0<)!zz;l2eCE6LcytOnDC{|VI^?ltHx6&ZBidKQc zF1plKS}|d^L6c@^c|qEw at W)`C9^Ga at 4h!8ThVOR#fFiptl^GvIfbqmm#w z`#eHu{)9rXv%BxK0D0ii*NR6s5sF{$(4m&2wc$uVgTA(8U!7rrai4gO`XP&pt>Lx! zV3$4UJ6yYstq~RDR=Uv;d^>6TPnc$odsbA%+#S)KM8UCwHPH6&0Hu9r`&Nuu`6=^< zJ!m`I>?f`X^JH%{@>7=h68gma6EJ9=Kv~aYUd>lZ6oV1=){~q9981VLsuoq*aCB3v zF8)NVARgy75!uN5 at U1cruUFiaR9e^C(vt^n9{v)YQrbZH at l7#-5?{jkjL0X*1da4< zIp$24$s at RX-v%=j{=vfAm$WJpl(%>O0UEK)!D=Jt4H4+fa<+2sK*)^Of5_=Zt1dKA z{RKU?e;;~m{|UV$JBK+%w2^O2ZSA at V$F_)jE1oPq*|TVGaN_hfa?zV9sB0OIfg0+| zIepm|^^BLemwv>ZFqRxxbR#;5wWjBXhpcVx&u#Db^XJ%HpqLvPc=&hh6Drdiuo*Z! zEGm|wgW_-)Mr?$2d!{BxVWyilxg(|GvYSu~{cGivuZU*Ba|24a}Z6c!AF=60e?Z9C(jkPHv-R=wZE{(|2OvBtt*5fm^A6PkB#PC3c?dhJH$8p zZLB>lkOh0*bd2$p)#4|OJ_a2X={_mF+3wOci8%6|U1n~fKi zG!Skl%!-ZSPv~#dsqZzQRoo+}oi$JmA2`OD z%7QGMJ+%07+R;sxV;x}rweUCgzVZeR%^Z#LjCYY3>52?BnUtChNfm6Iv#~jZD%%>w z*CArCoH;G~74^HB210S2CGOJQU%?+U=lPId$P^mNIE1bY`rFtuS3c3TOO0Vajbq)L z<#Dsj8m0Lf5?s?I=l#aw+(N;!g-Uc^Vbs5329KpC={riPAhhu at R#O_NO+dA992fyD zc`P9Zagq>$c;%)Eiu%y%f@CA4B`t59dH3&-j9JOLnrgbV6dMfNqA3NysREa>BrL>o4wz! z`wBq&RLwi=U4&wUM+Ipkkjy^eAy at +aB(y2UZQ+MhQ|bk6v9VfD&=UfSbvQx&I5GnJ zs~w?`T`zp0To{EfAh@TjAE$d+2{_bpe+x*|k;7T#Aq0orwT1KG_F#($__=$2Nw^~iOWJRm=_=WU|WXm#3FMH`cSLHON1ll?;uYEp=RFbRh&M04vK2j8JlK+7g`^ zPHn;6Yol8FKXa{gLv-DFvPKk^c0b#vyW4laL787{kmPz>hTkLN9{xD5(GY9$ze}!= z5n5l0q8(n&A+!ieYy1?up1t7?WLR9rqZ}^1zyY_24L{}KsIFdZZ|oOeD+b~3I7`~7 zVs^MAcFi^SN@}HrBQ0k7Ne!O~qjkWB1*0=+v!c#aUpO1PjBZa-$TViIfKG=&sm1rJ z69n at NNQr8vrXOfaxo)+rl3)rZ2%r;GSQljh=3k*Elt-AuGV+hx0Cwd!D2#YBIR zGj#?MU at L|xT&uM5_>`KR)qd!44b2_jwfkzfB#YYn4Tf_3Uc@%4m#IaS#OIEt`<95Ow*)C%+s4$rTUKNB1<|dXDG6G$IR3`MU(QB* zPWvFMzKS at szroEGJNpe)lW>He at hQ|nfm5nX3W-#{{U-^BTl54GKXb;f`7S5LH$h-)fFFQbLI-6dI>? zQL-lJyG#RARuCeMVm#0U#9x at cSUhHS9Iyshn(luA=213Xa0- at RQr$fz9wu_JOos3} z#DFj(*mqtZnNxWpFtj3H+8Tn7^sN^6=q~V%b^Xbh1hgI63xR at eoKu*6^e2E!t|tKQ zQ at 0Pr$i_cU*Nj{h_gCCZUQtxr zL&Xn-ENE_|U^>iEyM)bhJYi- at W-WwyF^?Dp7tZ6-anIC{JtTfa`THIPw;TA5!&b at B zYez9Z18_1=2+0OGGJ%0s7a&6lAfyr>Z-bly=jw62m*`H%I1Q>%TZrcmCyZ3fi=y;` z>lx8tL9*l1^QO~(jDa2?cxC)8On(Li1SInBF`BT8+`pcGlbe;9%YV>XvHGU-yg1qy zM at p5ZQaC7CQtliZmg5DR{9K8UT|x%~FluIRu<1#*Ee5H03QNKy-1TqN8#vwHaA;Jl zaLat4th$av;IiwGCl6IcT=6DE5H<&T+5GRm+c_ at o#TwtAk08I{mQb(;t0MJYl=>8C zj9<6|$>ia7$mGjkz&(@kU|{57?>~T0G!<`YBVqhhZg at pDI<4BuvB52{4hnP at m$91~ z%$!P1&uS+0LRY0X?T>I;HkmwQI^@<1hS at wfC(vzbj!)cb*I4)q%WF%0!ufVF;3jU4 zu#e`t6>>Gr;-sJ4rkPZk>HP8+tDG#vYST?u_3F<%+ADZN0SLbmG$E*;k8|t!Mv%ra zy-MWm!1K(a#mBCy9FTG at fjjCNk_@z_W)xm`RPfR2OTu3ry$YOVdaIAMbBvCDVo{|0 z3N7}g4|_4^838}RkfGk;u&pF2J25`tYG6u0=#tyCK44g~k9YCgLxeDoGPTDoSaSl*_sB)1coNwcWx_dcY^&*0 z?8Dv=rnHYJeu>stW at N58ZVJmTnspv7ycQ5g8Wyq6s~9(g5?}nO!;FHvH&72abl-y@ zodIzZ9ni{BQCxB)kb$AWsc6gF#fo9QI7LB%$8?e!Fw<44t1<%Dz?S!4999&If=_r`#4FN>@N;Aga?Zv_#8>Vi z-&hbq*_+Dv6=Tl>Ya2P?H{Dz~Rw8TcZvxlf-K!v!4nc_`ZOk3-H~g!^PGrIS5?uWf z-Z3lez at K2slyB?wCu0eM+MH(euc5ew49RBgbDTFQnR=H<` zzRe{1970T!L3>wI$G+TvZ5$$UnV(Y8-Vx7JXpa4}(`#s9BZD3*3Aetu7cvHRvbbMQDl%YdqZQ$oiJ2wrG_ zcOLI8I{NeIX_g2AlPQc at Wk!Xj`VbQJnmRq}B3tr!GT!pi_?7#V<0DP``Ke?c`{u%? zTj*lQ?&4o3?F-%}mxNP)R<2&9G9|dXG#Rcy7Okqm9F1Kk^_b!hf1S0xm)rZ7g=zK;74NWO}HE zhhw?8SK&k)!4gvOa(QxvGwW75Zlq_?|3%t625Itl+k$0Rb=kIUb=kIU*Hc!PpE9~^ z+qP{RUAFD6`M-1K&b{Zo6LHRsiTsrL=@*fiYp=ayueE~vn9nh8YKSjRcqbyHviEbQ z%KqHjR)}_02ZCYjIgBR|70WBL+3edT72~9YS*Z=kbak;WCu%Ulk46|uCz6<^DX01w z7q`Y-4htuK-W!>sTV?=Fy_xno{2EoAyZq at GC&Ebz`s6gIF}*UtGPJq&5*ZTs!VNUaYo zz-sMtMU$f{_T}_xhUMlXh3-KFj*{;Wk_w2bY<;5(fA2`mrK82OH;1%Z%eyP7G_kH< z$eU(1$ryyoL7Xe${IcGIA|L&(LS$PC#<4M05ltjQeXx9m1=X at Qie>$bFfuNWMILky zTB$3#MH5TG!@^6nJw!h!4HvXY&n3pD78FDOX%ZQvO|jd~x(MRffl897c`9ZK+vtg< zIUZpardC1mWFUL)mtbSI2VOAmYXcl4jqFYw{~Lt<2iZ7tL^sF& z?%qCg at Zb}mHmAX)9e}%fUQ?kl(uHd-R`PLbLNE7}YZc{V&ZgmOl)CG29Qt7+cbllp z-VcFV4jH}wJN^{9*UIG6GIs3(LX2+##c8bY==M$-qvx{g5iXT at 5 zQQ`KQ#end~ZUi#iof!<=h*tzOGfGfoVwW7IDI6|S>8oc4w(x0}m2cK at HcC(gj={`r zf)Q{y3MGI*1S3;n-!42$V0f|}!~&d~Noma-k(Lb%kZW8P;h>G3#D;BxhX`wy7OhW&RVPjvzrsFqR4jDO?5G*B zpJwNkkl5rqqf#nLh*~#Zo?({{c?QX$Y(p^C$m2>}|9wWiFZET*=YHB+%1*aHKgW#B zRce}8!c$(!vZ0U(C4ir-wc2J*mDDDXwq$R=0lT=9kCU-YGpC&yXQI(@E&*BO;39J5 z#34!`qYzgafnu&lB{Lj=qxq;zk$<;NArq~cNAaT+rPMuyC(GK&-J;)0mvDum`=3q!8BX z1*cP1ghh?D_GaYi_OyKzQ&DOC6U>85fnqJyat)@2X=7aSks_fZFfpnw^yCougN_Pv z{E#Jj-4sP(i+Z at 3dGSB#n2oDlbhv`~#%$@~mEE{I5gh9=J3|w!xO3Enu#)C>5 at I77 zOK_JnFRT&^qcoX5lmV9J{9z~NT>)4$OzrVdw+YdycahOwYZ!f%tnasV(Z8Z6JP~Ur zJ;5C(JmDQDvHRyi{`_VMN5ToyK8FFCcSXUo*Iy%D4NMXTysZ5dckj|1A-u$}npq`3 z;<8MJ&^T#32djRQ)ArbPzF4BK6(?P4GEV`hTqzKt{;u*`$?>s(&~pB1*tmj0eR#fd zIzd+OM{VDExq);uvwZle)AOY0V at 4n`g}{meXAd at M6s^Lfa@*Rprovs at zL%9{zW4&{ z!Y1{OuLavc7Cv+}OViVje`uo7RF8dq3THDrb-bf02+q#Hz-P}uiLF{b&M8pAFFfXP zTwOHRUr_I`9yIXdOf7)Hb<;Y?^W^;=K*-$0l<$vbB4%5%O)lW~NFTLg7#993ILK)?Ssi4NR|0$3A9r``!A zxnu|LJ4aFAJD(Oocj&-D$iPo`f(3J_Crtrj63k at Ae5H4CM6qW0g7}#qymu`Yx9*-@ z-b`5bO}3KI)d>5<%38cq#J*1tFnV`- at 6r$prPkL$22;Y95~UXk7Cd32*AR+~Tm!OZ z(gl_=wq2*3LBWU~O4KzgKTzb^Ij6{)u+7r?0J{y3kQ2pB$|U;2#gECs#2F2TBxTMh zV`V~EgrsrFNkt9?Z}@6>*#j$WWhyEHIZJ~3B at 6SioXO)c&qsI z<>66!^wl`%&nXSQ0alNs&S={gI!Mlp4nmk?Gmm;1S97SFBuu?u2EY7Es4R=8$8Qjm z(2ZCI%VA`~aPb`Ssz63x^nu-cnrUla9)NdW*aKmn`CQ6Gou74mJg(#%$5TGR5+MXZM7gsUi=g- zNBe`X;U5iR2yf_qd|mWpwI+%=qNEWA)JKOtBiaSv15mx!{$UeuelBHG?vEFd6HKp# z#I3^|>xfUAa10A!VYbRte#hc#q*!i*d$Y<3v at aWz)ZL-9grpb8&a?Z(mAehny{cZ{ zLdlO*oU;DKUa|Cd_|jgCH~X{1s}BLX=>AEO%Gm_tp-rT(-K4M1^p!BbX76*hQdYke zCki7p|34P{ z{Kp={|5}^WZ~m1j>Sw8|Q5DYZhE|G5k+cN*Ew$e?M?U0$d+-n3>qLs?g)%i17ST2& z|2~{?eGPtvV at r}dMObv4x|L+Ply0zDXC1QOU)jF8?tW=%ZGHd0b%#!9J5=#~H6iGN z2aU7hTd7u`Ca5fzcakwbpT+qP4^p>Y!e at K-<9K%f#QV0e(){~9j$*!(#JWK1N=cvd zs16&psg)d>*<_Q^l}D59yZH8 at _%d56`{C;}+Cg6}xi_QQCiy_;k8%t173>sS`9gJm zmS{A6hJ_~cChIx3W@{`u#7WNNlJ1>(`|9GXdq4B)>h(>8mxe++{P+gNku4I at DjWRY zD`xVxl|Oi^fi{HHh}rbz8S`q7qQgtC8*C$OHb7~tLK76Y;^SYP)fwvlRKMh`OtRC7 zN07VJM&20AFnqaMym+KYZ|4n+7B(=NpFzQc3(q$3pYGUHaaZ-4`cl(YsXRe037PBl zocD)RRSw*PdYoK`#asgdSn-s~lnNNC^@xdkG9V at AKGY7z;gwzc>K8-x7CM|5KL_Qw zGⅅhQnek#bi)KI3?>5NRtEcs0GzAUX}st{RD#s8g+=49<FR at X^VAF&Daps;XE8Nr(y1o1=pM7vzOj#EiJv2+nd z+GDCkRC_Si7W#wdtSegHm%eZ+HI+rw!@+FmI#u{uf1(ZieA$*P&#Saaz`^H+^Vuvn zhQ!}lNU!vVA>7g}O1>j)amaBadla#N!1Qe7G3pnMhnY{Ng=F}`kNAhsRHL_ndmPf< zIo?Ry$EcT at frxxN7&y+i)>vL60J{U6#B-%xw_&cI)np at eqUAi8iy zwec|%ocOx~D&$#OjNP{`pLo>1A@>s)zg23G@`F9M|IGTfK7xWntaVOyTubkwZ zM1>Ek>=DT}`M+{~t%n~gUpAY0IQsH&ACe+R9GqCY27+Puh-AG- at rE9)uZJ#cfU&pe zNhkPg`K1J+=4;97k77+y-M62KcN$i#oIrBZ3&Vu^J-fJ<(UazI#`tDt|+O!IBrE;mB4l2MPsAi3nq^r3i!3BSRTh zX#{I&T}5tVSY9Gixua$d-7RBNxi1!R$cyN2ZNP|R?w8cNtXpreTW at ejTn#yFmsl^n zN?oRXe)}{!TDohB3^?@S-gJ36{`t6hIKy-FKbr)pL%(?%h|wB~^ZHE7m5np`MYq=q zY0w6Xb!<$N;&q3rH{^Kar4)eSr4^z6S+-IK)SP&&Pg7jEuaWiY2-#sgXy(mXdB}`g z#q~TtX&vFW8-QctG=;Bam=3mItJrJcFB>}gv^o&I`qb*j)41RCVZXdJp>nrwiyU=8 z+?hPE`Sr-WmW*p~9ZGq*>=c8g<5UgQ^vuVoUAm=3{OFnkYTCBVz|-BH^WW}y_oFv% z&B8#jZ{_VtFu5L3BG%pw*x(<=WpZrohZ<~E>^0*$928&S8k~eyI?*ZCoD6bVc at _e> zyz+Bju5JgQ2*C~3$hi<7O7ehY25SSmh)j0F!iXNMH-+?f`kyd&rma99b_82)U_2Lg z3`O+s98Z5EeBqlYv1lzvZsa&TXNcDJtX|H9aDq!&?0O+m+(P^NIo^Zayx&5%L2WEY~&?+KQf(=3*#(cI_qjCW==JZCY$K?!D*ND1UDQ#t9q z_w7Kxz~cxp>MgkvsYPT=HK}q|0?=d>y zFN79~{MmIZ7)5O7N at AIY1~DI|f7)}1X<`Ckh(;(U%0|OY>tvmVodqCiY75jF!)0HB z9v$WfPCa+_=0Yn_%##C0){z}m5rQ;=gmPQ|>wRX_VEd^VkYKM#jVj|xhQ3^EUH=QF ze;JQ}Me900oQ0W%({6|p8aUXb(jk0zl%_69+%*`uo1!#M&?AN+~tJY@^8?WTAfz6^HWkq21`V?+hSP#S^1Q4 zq**gYW)9|`C7!5H%}nL2bt#lx>OP=(aq1fd6>|Q)61MRRpQx>e7gX-y-^i%36Zv&y zxgr{p(8KNic*b^ea0+R~ZRCR^wX>_-z+&Bru;=uR_Isa15TAl%4CdlA?s~DMVt=`m z%8n|Hgs*@oTA2G83O62ysds}b#@rKl8PoqEx{96oND=$g9jBC*(h_YdhtSg?Vozs z_Bmpv?yiKUH)6#2SfQ=~x@~317z5D at NwZWUQ#C at qsZ|>;sPn=mRID;?q6vZ|qU{sv zdP3}>%?u0-FqI{P3CgXO8osgM3^d`gIQz|wLELm$0DP?sk(G`naq_zL_#I20KMf0T zl^FTv8g=h>eL4&(S|ci+ucSq{{uvnf&^mAR^x`jo628ytd4a^KjG^t3HlIHv4l82} z`WL*cy$I&o7c(NC2>6U=WB0DqGAyaOH*@)BaqQUH;gB(OB3o0KrK;OQrDfBsKJ`6g zg6lEs8FeG{u0^;Fo)5_%Xx;Pm&KWE+1O`E=Zm&MCu}I%AJIluS&*!(Io(f^i(Py_L zo*IMUNd6GH%ghxA+zTh2y9NY3V7+t9C8qd-m8M`+)Fx)CiAer1x$}F3g7-YHrUWnZ z;5{)PZm(=@hNIy8-C=)r;XReYB)#6LuUBv5fnjdGM1QId7+!x7APsh-n>LC`62$F> z#1iE}`+^GA4lW{G;dp9zyU`N5>lg1w?^hD7h1s?|>A$kCj| z9q9885!VdD-yYCUplLe})92~da;LW`D*fP!Iw%kJxL^kTC<9~;TTgKJS>EJFn!RU) zzTckFViF+r^{?+anCFtDzVq9)0beUs9Pm^(A#h%G+i1L0$g0I@*pBsd6A^Wn8ichP1GfIyvG(i|gX$19b$gvLw zw#|33SU?p1{vDr=b|2gsy_=J>b~=>SFJ4>e!1vN6p6-SkB(c03;2hu~K4ioMvAk at o za4!-45k$iTworoyPDWOq^9AN%xekJE{>Kpcz1%z-&d- at vORpc~rQsLdUwFe7&u}Z} zJ7r$=$&po;LJ5&a2A)R~19D8uP5FJ=mOnvSe_c&%VV65%>Xv9l@(~fh%NjtXe$paM z*AphJ!g08rJ?WuWyTobHRnr-0ih&O1(L)`!UPTqgcZuDOLuC)lH zUKnhtjBV&}4Q_BXw`FYEQ#}e0TKB6rN&vA~hev9!*p+C5#jitj7ed;aIASFh1F>R| zaiJ|b`_iZ}U-Aw*Rue6I`<0<;p!p!m{?jgfNA5w_&S`S@%PHiT2>C%bA4N~Ca7W^% zbx|fs0y^fwH!+VRD-b_qG5*5V6O2D at z5z{8ZkCi6Oe`d7?gZ_fROA&!hvv8BUZE3o zfM+88w)Ka*nqL%cgCLa4?m=X at BO2kz9MkQ4mSRAZ)E#M7Ab-fOZ=5-lSYi0?L$a*k zpuiC}rSMx~tD1vd0PFB3Av9L?jPRQ9Xk4y8rT8x#&r>h9HfdIa1POuh!r;StLP6 at a zTa9?*gS^tH|^Yp;B4wZ#xk7qEN+%*<4_lobd|? z9J<5K!LIb^2Tq`7DxO at I$A$*>KV*@)TDeqW*0rt%&Dtn#7KR=$YZY|C)_=s-R+O{Y zpHmkwJqwaq+oytM&DuN8{=#pOV^=i>dL~5F7%r$7AvjCw4J$Yc;fTgQkV~zXTll-$ z8|PrcWG0IKSgvTww7OlNDmK^u&p?@Lx2h6&;x5&y9-M!%T?>%fOKi=Kq?^j#J-xsS zXMEd+5zyPTZoXdrt at _#}{Y60e#8Fao%tv0V*uN#wD{bGQ(G?Uxl at Ib)14SAcU6`W; z`7K7;Wp3t;5}qcrhDADYCryu%btgYONzrCYUeS99fe51qC{0ahbT5^%jA?fH;Y?UF5f3zElmf^mCsG{CN47?TUTLEwe)EZ7>LCAObbrM;7zX}4%PDj zcg^|>Y&F at dXnvA?cM>15K(DeXP~9j7VKdmng$GHo(YT1l+<5&in4??OhNRrzs$CHF zx2#qFkhRiD3h!a-S{0+(hIUTXz$1va**)@dW^=#piT90?#-7n#rlJmJu~8SRD`plC z*pIfEh=?|hYURTs_teJiE2>#;D2l&}b!CH#S~4v8Ss{CZNb>hqVPUIgcDr0~NCZ0d zo%L#HP<|mTIo}Z!^BA2HYb{aRG}6tgOW-!%@MWD@;JuVN1{9*c1QmOTWx+c_XrGuG z1DSKMj{V4=NbaNqpsq0E`id$Jq(pyZ6Jo-8j^Vwm$$t-%wmG2+R2_P2jXyC{42(*< zQy8TIssr$LVQDS&LOeR->vW~sGL57VO3{H#s8FykWkDYSL44)ACHSXJb5af}WGZ-; zavyw>QtKccS(Rh)v{Px5I>-S11*?&*38Yn0!}1FRHRV(ZQ4T=7K*Ra#+YOUUR8LtT zxJw?COFsBR((h#<7GKzzg;+3F5lm!0#Z*)!Eb;SROr9RmaN;AA`@>Z6!&8;$hrhkb zu%Gzd0 at B868*8+<+Mhnf`DvH at W1$-~TD~e;I$=@p5l9~8nQtVM8?I8goyD5xxpD5()y%LMiLju{DP4Y&uU78AcHIX at eB>r=l=M7$b#hFKW4=)Y7UI znmS}Ady5DtW3bm66nq^4turM1o{Uy(b_)Mu{?I}`Si=s&*uyUCYsLf{E4xS8?jaX= z!&WjNwsuprF_@`Ie${i1o?90$Cxl{@xONYpo(C~CyU02_Yb6`#o%4RU$IR-$T+0 zA53x8FBj7)uQGLz=%`T}s8T!gzIHv^==bkrq4`VeJS6n~IY1dXBeKXznm`XumH$>` zm^QN2I7g~^L1|3G^vnA#j?K&A!cQhXTrui z3BRTHt;1sQWKkSuLtG9CUkQ7L?D0xqyhPVQ_%PWd`kgrrp>_!jL!;MW+$n>Edg at Sb zn9;*Eq}fjP1zt`G+$I;S{$_4~f(-<&%9uFWE`A9uwH1j`pmcyPy0bGLD7+llVQUEK zuGf2a9t^Wo1^uA6dmWYWG7GgJ{Pw0VzW{V4hvSQP!*;DKb z`>(5qre{+1bkrw^d$yS2w8fxlFJWp!#``+- zs4b1#MK$y2viV)W0>TgKW-pM!Po~$<2taiN>kGY|3HoXgPpWMpq^kqesUF_xcS*DE zQg)JhRxoXy9i=mp1=@){`OIc1`pFvmzMTGyfLyO3Em#9o3PVaCD>>NYikVS6XZ8!9 z1&Y?|{-x%5#;HT&l=jxHPsoiwb&KP{{xQBCTDBn1t-FIlO{0NvIGy~9`mXy+;IRQT zSgM*<-RKFO2I`#+dT`w(jBhJxtpFamHJUcT ztLrJhY;iaq9F;L;ip7hiSc_0k(G0z9K1(oX1*GPdUJepY(T%T?K|s4l^%d#8Jd|YE zPJx0J;WhIOw7`~1dt+{j`_b>x;mys<0f-a+Rd_IkPHV*un6AxXhS3OXtNFwxVg*>! z(P(4tIqLx}d)|}~=keGp)q!}uvq-w^wv9=>d|O&8GA!`v7(%oSiTzm$H6}PFOLyx@ z5n4&%2@+ll-UJxl|hr5x2g at i~`yTMI$3$pRdlDA0M!)Ic&{=` zHl(ar=T2v4vD8PusZlT%%zb<>)RP5nxn9vFZ at WM|5+UT41?(bcv=}mW_eHC at wv3T% z_Lg~WnFBankNGt*)9?{YT#v;ynFB&xx_b0KC*z?8@!$I9v0uk+!brXUW>GO$^HxU> z0RnOj4+6se-x?|Y%PHkQj}?oP^<6f_(1ANosddUCxK{6w*3|jVSt~L!H2LoG`l&6} zSw-wMvV+XgChpNX+N=%u8$^8!-$8tgyOimBL3p!A$fZ}^wc||Cy{8cq+qul4UnouvWSFWsxK0;%8joUUX`^zW-Yy^#V9eiUTZ`;`LeazBmk&w!LLi$t4ufEByO}RQ35mIn&!@XDk%emo^Q};YxJh}si~ikHnVA%`sJu*UH1WKG&~7 at h9H(Gx%A|=S^PMjx zs=R_dV=;RDt+v(06Imv?CWF=mN5(W at I}`0C%-ZR`YJKYi^o*Dh7vSkcD{Bi>R6|!%Qy#D! z at RPn|jM(PDATs(*;@?o3=xuUe#j2M>pB(}Devknr at czgXhm%#{mGT$H)Dw>ub$@l? z9YOoqDt10=q8dN&OQMo{W+Cma%8NXI55M}@mnqU6^j70$Um%kAXPpPjnr>eAi@<&{ zgqTgx4beg*t0aEEKjoWsf81BZYi(c%IuBT@$g69BB3aZCs4s6{RJUG$Za+o_#(U|A zx(>54^Y|awMl_U5=+OrC+1k; zaN-AW11#`byr(JOsh+DiCxL zU*7QsdzT0nPg=tww=W)?ep^oLU*$a^A0wX`zeSlcdlays^AHj6JbaTa7E+S^M0D#X z`4f#KumR~2#Mp-CT1?9zc*wc^HA_)sxFT9MAAT at _n;P03_VMQv1dnw<^xt!2v?gm$ z6aGOTTtpBMw*MCTsG9#f_-M##ZfYR^W&B0$E-o@&NPZR^pXxOnpR_Q-7;_P_WJC-* zWPM78F;iVBmQqH(Xtw%u&VNC?Gti~u^sM8=byeJ7UeS`Agj^Rw3Tw-U!{geQZHIp< z_xtZNUx2l5<|qi^Z9|1o%u84oyQkOCb!#{mG27Cy4D&GN*d}yBTizS|6 at U8#{)dOp#~J zL7T^kXE~v!Zy01_Zc4-1`~WAN_6b*7AeD)SPoTn8yaz6eVXo!J+*oj|wC_0Z`c&*e zV0vX^A=!PHok7!dmZtNhyOk+Yhnk+z10nc9gc9AlqlJ+GQW28X<1~0n*|vn{sv at 5! zmKF9t8PPA&oc*;%lVM|KPIPUjBKv_scDoL9l#y)3$>CnHE-a20k3 zKK-JkABXz&Z8x*(v!@V8Y~-v+tuE*&8xm;p>)J~kY7|MzRIdGIIH_;T)~t4NqNz{u zXgIUm9T&EtT@)cb2lgS7YaE=W*T(I#Bx}{H29W}x*7g$nNq;Vj!)4NOR!dWXa`)P; zOttGHShsm2^KlrV+!J1u7OqS=ZYWZ57+p}6B{(Beo4(=|+lAI4zhEEf`0W|47tcId zS>sJ<*j$eUI+i`2<}2((WA{E^N?iycM-H2!o>)4Au!LwDRLORJhX-Mw{HpZyr0qwk zGrqM&*o>uggMtsy)q4FMLAc>rQUR9GpF{=XVCk&VMI1wT#{+^szV4`(v2&-(YY|T_ z5f3bZAz5qY;Jp`hUX=cj!PhwOPyB=D!3cI2EJN|82c zy+Zx`Z&anC;9Ugh`W at gcacs;LaW;s+jc{d;0*C;9B6Hr42f=ZRfijH(Wph-youACK zMC4fDZ+U!}w6h at dMFPWKczC&M!knP at 5zsuBwxRKFAPI^@dz66)qfLw{>4Xk!^>sf!1*Nw2PNJdPpcX5kn{twEJZ1UYF?|GJ^rlR{ym_j~xt)0)%Dntk zSFkL!AG}o%ku>yhx4NGWRbfaatM&Yhu?0`RRr&>7<$U~!n9-Iq{q=7IYX>bb^;54mOs8PfP;6 z+-^fAHH|rgrSP|N$|riS1 z*UdjfD{a&Ux6qS1OcJ*z{-FS$aMD;BshOR%Y|>a8i4NdduqTVC$ia?1(lNl&wvMi_ zT320*NyJpjaM*FCcu z)lMneWz&m{KxG4 at Nb$+$*sHqdNTfgD=oF{VYCF}%Ik;|>NZpgDHurdJv2T^nUu-bd zWlt}$YWFs;zToXT;GEtRTV~$C^zcEdH=HDN?nHO3I)b^5>`B~n<>abk7)xE7k at S(F z{nFBHL*PjUj#szzG(0C5Mfre^^q|!qZeMK(F;3*{iKLYHNizvtX%`h*;pzu7?!kI^ zO12G at Yo%NPyhtkoTnGnBX21)3w%FvoY*oZ0T`v)pS>%E3gBHDmKhMM65?ezwN5z_v zL79!Ti^XrPLx4E2+8|9-L!A0L{l#{KR at fPkc+)2 zn at Wjr%(KicbK>52dxP&SpP+oAk~BnQ%gB9-#l?J`BpE0z z_r?aP;U4C>_8$TgXTWV2o&9_g!wf&-*6)vXNv~Fm(2E)lrN;!kH#xr+NsruiLT07_`P+ z%yGkno!UdFru?M#mGZpRIC08Rq7v;X at AC-sT_ijh<}Om`f01k=y$hGT_b+@^P4GWd z9QuW*BBesCgp;QT`AFj%WEU=oF(+%tm^WD{)F|O4p`JU6t6XsPW2(&KcjD!7t3i%~yaCt&@86_5 zg%Y%MhdqCEJ-KjSLAtxeZhDf%irapVIST0!y!>&um&$hRX34e=GhD~mdO4;gqz;)4 z{CDFV|GN#u7)THh0P24wWtMORco+lBtQ{=>4OKMteHLBOzrR)&9P~%{AcbA!3|f#h zO1RzV2HQbn-MZ}6LITb7FTt!;5?q;;gp=TzK0$tg5IJ_u;rZVFOVxaTmqk9kQMA5r zG9Q)w>EbUG#k&5Yke8l*W zi3wXdo3`nF__!(Mgxi;N+$;1sIn{{nPN}p7{o!SG&V40OnPOQ3UX;=x3IiG(&Gtu~Q zWQFGOMMky8(ME_+3x-|y3JCrMOnDtQSG`t78u`#QhPWzigFN;qbQq_w^?iY*aP?_} zK9{sLd5TJ6zkLG-(<+4f?|nZn`I%LF^~qVjzCvNb3l8TJeXZp=c%+PA%@y=@^iw*# z4u;AOH-pw`w?MSungYs;@zk0LIVV}$JjFhQl2c7=Q*SYP>-bM&LWrw)ZcYKmnQ znjKAZ)f(Cs6NR%5PY z3gq{|lr1|m6Ve#0!!oR9_R5P$p6cmEZKCm8|%(@q@;;G$Mw(Mml^B{ecruUWnCV z)ebIF6xT1pTx^%Nk*}&5l*~J0tp|H7n>?;UkX*4%m2&S(8#LA6+uHQ1Rh6J>xivtW z#_KF6TDPz)g>Z-TCDS{xX^ARw at t_ebtdMdZO@ZdeMT3N3DZ;2C?Q(@(bw}&OA0Xhu z-CH>g at 5h6zy=P*5O_&6bcjF`-vd|$V8J^Zq^kdLt8ir4Fa(*+f at jatcR9EAqoRgDl zr7XGkbu5Rog2Vd&Ak7^viu$Kt8J3Efnq;(gkeg;tzl&-QA at PNU(ijX9_T;ucgvOWD z80v&V&#YZG%@m+MfcT4{eoNk$agQ^F9GxX)!~^x3bxwdDHtX`xySN+Y=eBFRUG@!o z57yeEg(dtY0%qn&o;b5tNKY)1&|E6QY0}~0{AT7Or?{fqxl9S)S}`MYC(I;LeY(p?yq_>5VZv zP at g+9@A?8b(b1fdtH8i9R??)Q&@=`q_zJ%k at 4@wsb>Wth2uYt>ffn?Uo<&g3Lj6a{ zQcV2pp4(G;4`yCG74V)VZNqcb1VDEh1>w~LHB(DicbVOpILZS{7qyBlM_1dvr}Ody z=~^=1z+$nu>k)@u+~tJrl0r<4UeRLAX?HUl{`26syJPYv4#IVU{vM9rg_C1D%P-6< z{*J=J^DaIV*7ryMvImC!c}bCvw;i;c?-Q1jUhHOu7og>%IW(Jhn5V~Ab?>1%Enn6L z&Sv&f_dri>yu#lgGt$$KAM)ap?{Aa)Q9|<#S4;suzcMVk;yc#&>CA$GzwF at 3_|TPF z;d@s~cNcgQ_OCz1-3XNFe3Q9o1#zQO)8xX0Xp zjVghHfcymeueSaEC%7w`*!=V0|H&g)mRB4QLeC1lH?9tX`IXZJs*ER)ZX|~QYqMZQ z3j9#vbd&D1odENfWlHnBg?=rJuAPGr=P9It3qpCgWd2X5!Y{X5okp1r4sSsyo7a!b`v(F#((utH)@(bMPr?A$z#I(>`Txd zxFSrg7xY_WX+Y_9hMJB2+n-I;>q+V&{I3|&cp`<^pS(tEKsnoa`!U}dULe9s+40FC zq+P{~NPwG2T@^XnG<`&JMph~1 at G(Lzp)@JZ}oS&qi^1KquF{c!oPcc8l<09g74$M zvjkFaK5nRXzP_HgK^Kybuq_c`*=aizmXaG(U`6B0H2Q68dGZvc4IWFD9CsUc& z;F`Unl!#(>hU64e?rAGpq_d{1CDULXcZmrFTAPX;J!SUh%wQm(t-T!VFokdETpGdk zh1BS&C at V!ZAr^UZfM9U6*qSC~HQBW)nv=VtNKJay@@`Eg&J?qtU{YIpwV}*@eV(Kx z)-pq%3l7Ft!ApmepD$!do2O8I((jBNTHe?Lk`KuRSw?5)kn)FU#+G^<@)ewi>jpWP z at HnDb$s>;_%V&*(O$8$jEfj#JGd*QV&CYC}+km|Wg56X>dv{F|+ZupsJpYZOJuE87 zPIMFE%*>bxbWu_zX7xqx(;YDj?QBs#9>V-#JLN|zG>cjVdaPJt4ogOPs$;vCTJkFaR{f at 9GL8zByXson&c)#cXx%!<-#}d|drofQ)O&Py?B}Jf$$B5p zTYZRL6(Fd->>5Eow5^e95+4a|vN`WGq(3P%A{XARqA at X+7G)<#YKuq%4eGyb##NvhIj(KkA?7;!h=^C^oT zOEE>;D9aiC8-R;NyBH2^-_QqeDUZe3sOK0j-t%b$#62RkiMJF;3?t2MT8R|u2xcZh zW1RcTJIFhb>7V317%mu}ME|KZFS(5hq8;G1!Y~GRjhutb6l;UN#xRDr!^p?;7V|{* z7C$9p5i*JAbWd0lH{seQ01A-rgJqRGSVC~q4RpG`2}sSKxqx*s4M02P2VeiD+Dh{IBGnyPq6Q5E~dD6pwNKjRe*@QK*y)>r3G z-<%38Yiz)qkjs}qsa>6}CO#oyQRlKjyQ(%O*giac+AXUqeXzalox|;0iTGa12rO0U zujTwaAN)NyPxJ=YX3Kpi%r_BG--fYLh&~OD3`D{wGpADq$tf)uOpa;OfMm%s{@RP) zg~suv1`t#@1jPk2+2adP;FCa0jvX4UWjZ5HW|TV&9`m%>3|?2lWEL{^KN5`A!;Rt& zME`;CPX>3L1F>h0V^PZ3hJHEtRbaPtzd8bA`DFV1lLEsJ+24H%*-@ zLKv;)AqmFu&0JyKU4F)zzM_puLpu!&3QvJ1KJgFSakmskxZz)}JE5KPd at e48CsN=K zk!7zMpHbX?)EKmX(HW|h&$PMW;_e|d^=TvA at rZWA)NmDu{>WDmL^h&W*=@@QbQS|T z$^14Lel%|`lrFi_E0;z1eh`93luWKj2JGCapuT9CR5TG2j at 5p zy1w{+(GPwLX!?mar;uUymA;Dnf@;>XnZD%_>^0nN^qE$2YlgKc-xv|O7|muJ+%H(L zm$P=can{SE+LB~wC1{|~PTaO`2*i z8bHRGC0`Hgdn`Y^U*){~+XSeSDzsY*a?{9nl9~XeabjiU#z-+MinaTY1F$2Y5dc%?bqoHo40G7_7e_~JSk++H#kmmQLSO)Bs+0vZ!tU!5?uGG(nZYGR& zPLVQ=We_m1zg|FD_Mf9fW~f3s%(FS(_g|H>^D$ZT_mxlZOppQtXL)3cJx z*YnO-ISZADgdf2-4H^=4x3Kh> zS!ZLrn>F0=2TAMq#ijYDXOCAb4B#_KS15#$r}w~^qHZhQ6%6jOS_8HY#ZMi#;1pq$ zmasjhBI at qg>F{-Q4tvN&A|z+ia<#VGhWlYBb?F!O$J1#N$X4J2?hxG+iA7NzjJ9dUpnB-QgSBnp^6`q{=fK&fTt+uZ=i0{~SQ;*?I%ZA;nH; zCAN}4g}&yJ=%JiH_=RP%WY_% zdC!(FWctn-4(f(npTDD;x~WmIOTG(U*7IBUwLY5Ap45Mjcwt~MR~cyxi$_zZPi zAr3bJD6F%3kZ9(JLVK`jqzY7;RIOX(Qhr~J`-6YTD4=#XP5g4g^lPfsRnaW7#x1tf#GW0 at ZC6r(An#8fUY~rdgwMnNGgo at liY^$%Fwyrtk;lpP=G>f#kVE=(on&#iM*f_rg-MckgXfQLrm>@NOkzLD0s6vdyC z`TB65Pwt}3-}}tFvNLT~n<~+!`PRFRG=!F?L0mOvEekp)~2(H>)H3U;gl8 zt!ySA&Ya|5$*Jv|d^S(-)!o^$mnK7_2$N3|Cn34_#2l;$l$({VM^es-BWhMx1^!S? zx;cpWdh>|I7Ej%4g&NRYT-IJ*+CiE%@qbl|_dnAi~W4+5+cUyC0EM`&iJc zs&?rU;rR~idX-1-47G-RczX)BTfADaX|pYHoMS6HVMUtJ!W at 2Rr_U|Y?H0LmX5ima z<+}E2$^QR*E*i#mZvVq^DO>eF@}N1L_eVlF8I-6)Mfx$M%WT?+i_|cRRf;0}0>#=L z6V$F|c+I<{@wwryJ-JL%ZA?Yv0`Z*1G@*v9RB&$;KGy~j81KHnJY`SJX$ znzL5TTD8`y>EPfudV=;9Q_3tP=9 at ewR&FqS2$C9!0_c&LW at 3ymW5b} zJjx``im_PMKzAK>xDUBKBh)N*|D|P52`cB?%3r#C2mg1S2min6^1s^;{$Ky1qNji+ zgw8i_-({y&oKGB4c!Ikwt?9**`U|81rr}jEs|V?#IBqq^%H4wLoko(8oc|f at U1^A? z1fe;x)QRxXf1=}f!^h+JDKD=VI&Ru0OA|P)nVnWE#rk zWxz}8X^rsgLf$Xn81d0|5DI=g#rlp$U|-1E6kGSIekIZGFJY1vUhiMh6CFdd8aymq zMa3co!nUXxT3m5G#6%F6d1s&EQcPDkrBV_SIMpqf6IfpZmDe0eS_(H`JuGkW1RW{i z>wHFtuKIv*SPVE at A6LhJ3DceHBB^Z;{8VMRMze;`YRbr=>%>RYLszF?4;&f)Ijaic zjYVaxm`$Wp33x$Ne+!%-6VpmQ$)SMPM1ec-St_dzCu=;6oM1k03VItf?dL5;jrZ(qkwR?lq192fD`^ksbg?X`6dCnbZqXt!ZnEIzHQ(g`mak5jeW zE7&}azH+uZoPmem=|Rm}JZf5wwVhYTfATAp8qz#{%a_3@&z5{|5;CGyZR;7N_Yl_o zQ2C>|E+T^qh+(43-)<-SVL(u0K8q~afJm`kDcP^NE zu!I-RDkc3x+5r2|2*@4gHB$-USE8RE+4{9DhD%2C8Z=VqDC!<+toXxJNPPEkD>WRH z*-gsamT`_WvKn??)D^;V>;cNiT*dcr){uM^wP1!)w%q5HrVa9&t!Nl zkKpV2D~~)@I|VK^ck;E3bzKnxH%8e*6iaUVYCMMIK z1IcxPWG^mgfG`OUNzYyUd<=A36w~@dLTCWct}syMq&i^XC_C^Yj1 at jQ7|m00K&l}I zc1^@na{zqGk~5qNA-cr&y&xS?GF3cGDHj-YSxXzsIFzWy-Ju1#$-}JGsChv zEZb`Y&f}>vzJgieEZOu;9#;dpK>IRvuiK at HSNsnSz+AG(x-coS&>Xdy1B1(oCvx)y zL#}9*g@@3=9oxjlP~Jy_WlQv0-+tG&Gs at d0HuvfVYN!@FXm4H2#gygN6H#2;rCFfj z?Zv5+ at Vm@A$QFW{D%{Hxlmg3g22x at posqP+QoZ})dB)U`E+sB414v4DS zJ(M!Pm^SFsU1W`Lf4uaw>=!JmjU+YgZhp)xIZj4IObkWv^f~WMx;45>x120Hvo$Rv z;bHDhE=GDNn=7d!3ApzX#H5!ksw%G^=CD@}VqVI1E)T&EyOpQMKl!Ir5NGt$?IZC< zXwr6-)0Z?(1E*zZD0$fq1)q{|4;Zt{I=?-{ck}GO1yqu~Tgn_eL~#e$2d~xf`W~emT_!SQ zj+XGfzI~kzK6j90Zs(!t+t+!uL0J54q=+UgLP|`jD12Q at iVMLbt5x>J&5EAVISt-# z|LkT8?LPpnsE>2V`st*hY2?U{VtCQonE?E(P0MP-akk<`v+_|#e}QfE_-w*>-Qrgl z<-Mf$lF(ZN$D|LcUXt8oayQsWniE7g?~2j3UZ+jmKWEwLZV}C0m^VcL)njO&)aJ0Tljo z)oYIfa-_NfiEk}k7r5@%W@$kt)bSp7(}mt9FGT^=XGVO3kkH*i7u$pG-Jt-_to>8& z2k&rxUGr)GH2Q$)mJ|Llf*-x*QYqPQjN|e|mCh?|&YDa1VM(LE(@ZZOleW9O)_S?F zw!b?9D4rRf)!qevLj_(}+TuZEs4*mx>t;ORGb{ZkWmMxLo+roj2|xkxP6FV~tt z-sU(`;+fDEF80|LI&!^YDPo#I2(1raY8v_Q%;ZRN?d at wt)0IhGOQGz<$CRk1x_7aT zH#F5&&#=M1RzGe0NA`sL5jxGC8wJ@#5Bw z{jy?u1?O at 5n6IW4rzTI^z|&LD{iJZ~@sk&dEBo%9k#F!rzURsLYCm`X&#`jW=f5aK zj;=^8GB6Mj1gL+PrKDo!Y-MC?K`Fq$;_Z{hzkfs_XJ-O6YoJbokm( zLgHemM_E7y+S5f*Ur5=FDEllqBS|nu=Acw%UF>U|oqOBgH24*{gqL3);?g zkwdISx6&}w&`!z(EM>+X}j&AK(kywV&Fyoz@9Dx*#d?Mu?v6tjwaHm4(;P7h03}6=EKOCJtP#oIb2DI6o zT_o`bKsy4;(MMt?$91SD+m21`P&kW!7P!&S zEcb`h{Z-9iOfsq}^Q%V1DSc)1BsLUNQ$$4SHVz?LBtk#;GU4NPXCU!Spik?hYP8BS zp^C7Ht;I#TpUrM)`n&kLq9oa$kY{zzQH-Bp#2P{^DByl- at EVW=a?tw8z at OA68_|%Q zNX|B~#K>)>v|YT$Hd(YLc8RD1)5iGo=YEqkZ-}gylrh%A*A_m!`01tp5bCDhj>XKq zitrIxN4TX`R*7nxa%yi_}`a!Job{cHRq% zwyTh=3}pv*&(6N0{qx$3C)x$8{QGzN_hb0~vG)G+ft=VFA=rLKWU(*H7Hv38g&kpJ zj<8%Iblr&P+#f^8Ds$j#r~O48*B}Ja*?VI-EEDf9*T;aZc#5CjtztOEg(agLYf`qf z%3zv=m({s_(rOU=^~SPDW!v;SW;7iTI{_gsF)&6Y!ep}0Lsoqj7`)Lg+AVwG4I?l= zihZu!08Wiot|BAcjgE78PP{4aqMDyD6Gt&;yE=aM_0f!mv5W_NM^c<3IpgC062qvu z_;bJw0|F9``|l1I|1|9X7&JiR%?Dir$Dg8WRmz=$6dcr6^2c1UEqh4voUx2B^}$>% zOkZL;CTxieb4VbdxT^_$FSHT}s&=L)!=T+RZ*j-{|8Q}|>?*b_wI z_e|YGPGF#MgFr}qBS&;iH~ZF#HTfJj^IrQaU at ROhbNlswH|yJxG%- at 1jh6(a`PI5CD2cWA at FF-HKk{5}pXn_eST-JkW8Ma;k?*D&*hRr#OH)q3YW%85-KnDx6XGGk zsmy~-2qz&v03*`99&GPYClp;1Y;t2cEXvD|GRw0PJ7i)@jN&(Oj=fZY!c^K{iW2We zT`qgFdz0%)ZBDI;iM at fvk9^6vhp*#)Rpd&^p1~Y07bVK0BLbe5><1xZfug!|!NXaq z01G9B!9Y{)Noth-dURbJwAdP*Y$eLgIhSE#DKqBUZVEc~keoK8< zh=D>1I at w)b_XsAbQ!PuH(pHC5uvq zs_Z1*SBrlx?%DUg^OUO8s$Lv4&J zmD5#8!8qR;qI49U;(m+}N49+E=0p*nP-*||s1>_O zeMRh;!=KE29kvlX4UvL7oTSgVja4&oQ%UQ at fkC|RyDj>t#2@eZYCQ9j_t{9WAeiwYOyP#$JuoulZfkk-#1D0F`n_s(OwBE zD9EUauCwi&Cy;>QDkeUMwnxO2vaw?QDk`u?$9;zY$xa+tiHGyM4e>m!2Aq=G1e6YV z6+M!s?^_+W9F$B}$6LFe)J&yMc(>xYWIfuRbI77uQ3jUJWco at sm0>=jKI#Kp-K9pj z$7;GW*EHR=dxc>fj#2|z?bU`tf!-y%%k9;>9G)@*4q|nL!MIzP0FUe1C>mH$7rr*O zclnbKf;!6;m_1*l0L2>#gn<4$uUPs)9|R at d>RpECs$ZX3QN1>vgkOsFkKCw~sCNqf zjuU at RG&1Jk?6)>lMB;C#k?pM4sX-|&_mj98<0$&tN3gzf-a_p(B0Ar%Go2;b(K+6< zc(PHRqwOtn$M at E0NT>IIK6h7+X}du at 0MGnii=?f)z#5rVM|d{s+pi{&nz^Hv>$~^V z%n%ee>U)2+cQp>;8_2i36omjdvcJzEY1g;S`^omu%HoaoMEYpfK at Re5QhX~*GQb+a zN)=M{UFhuc5%ZqAr4Os!i38P!I7jbqD7 at dwm+`)mF-QeRf1`8^9Ud0TyhR8f>`!T= zi$Az^RIastT+=ittcBU-)1;&T##IKv99XL!J0>oa-RS2maumcr=^S?RDVC#RGTeAT zMafTf_}A{f?qRYPLF|`PQzZ?%$hrj&ZvWW4C?O?-I1?BlA7GUE3T+lwls&>dp5_N!;m^+w*Nsw${60+{dlAs6GjF7k&~VXbOn zJ64fxZ9EawSe}nYJA?{1;0eP>YsqE!gN2f$NCFCOpJ8VQhGd1=pdgVfmUj2qqrOEN z&xkt()`Z(dS9LY)l4e4iZ+W-*rb2z#2fVOW>a|}nr8%FT_L}c3%9OmFc;Z!FgJ2p$ zrQQH=kfh5uv+MeOg9wdbF&RVX&Qs<;V10uW#eUFb2x^}TiaL-Zqtu%1Z^gvcIIn6) zL2^v&h+j+bv_EkYA3%+y;`XJ!z_K^9Y2H^f{9#$JpSLjUlFQR3|9zD^1R5<^*rk|w zxv==;qEa89v8C_}rIBAccM#f4xparUQ(we>BT}i~p*YSk0owOxWTycnzhRT43300# zD3)&{Yn#j(+zS-!wG~wG=4c4kp^6 at T9wN#-I@(JGEq}=@=Swq9yaEe$qsr$mQIuAt zY^tHMMzemTJa at B_#YQIj z`88!$(j20Tz7UMWz2gW$4^7oPU=UjdD(Uv^>C8vdLV=7XGeYlz2mAt!<`pJy(yLpc z1lZa5`uky{OsxD$4FT{5^N%Ef>55^{uIqjQIj8yjztP-qA2ZxucmCeUHOuf; z5pNB~UaKHkDhhI9XKo_0*0`Byjyf>jh#{37S{r#mx8P&mVg>lHX#JU-=~_;}aI)4S zXq^i-d)kWG1ZzZo#GG6uS>PIZHOyI;sG#s&g35?B%VIEmX;mBJVg*cGM%h(O?Ur&B ze_1c=khqImAC`J&xo_{DbZuB_Fqc(?x0hbl8R01L5de>Em$a&A zj`$f+;9L!MzL-{dfm8(PiO41*D3k)dm5f!6 ztA at LqhmRYW{8(=sNOtKFlctCoVr%$NIFzV^#DXQqyl#u>1buAIU{X}0nLiv7 at Zt(` zoFYIBqJZ at 2AzoZ>6Di3>wH^uyebRd#uvk-SV at Sr855@x}1#hPb7%q1|HW$zm&{2F? z3u;mdvM01-YI#WG{`fU~NEI>_0+ila-Rd9yUin7}(+(k at n^V`R_Mz52h<+8u)`z(i zDr^l##_L0f?l_2Pl;OLEM9~Fz+Xtzq>ha6I=i6Hd6}e=c7rC>i at Fz({Hid#N^vbUC zmbu+-&Yib20lSh zSQ#MLp4LcZlWISQ8Ib19bn_2LaLQVsOk at p{HZ#25^dBduj+ft{ezIGWS+39#$MfO8 zaaY3QaS$Wl(22C{@^&iJl5PHO6L+En-6mkCfY(--kDGTAZi%J2EpUcV-4r;&4uFR*X1xM(3RR z4ZoheY*;s1=Ly|kgPFLrtG3yE+q#xnjS)u2X6X%sj|x$b~24BIVj2M`zV1keSxd*3ZvKLatS!*o%Z_E@$qpy%mAW=jvjJN zD@el#Hq~&mQE*5P znkPwZ*XIbi5KtZyaB!a2GRM9|Zc1MxX?C$x_Dg8g+V7mVMpj{@f+t$%V#S4LkqYPt z6ryvsXN67OvW?2M$}!%WOc}8z_TL!~Le_#*M~@bh24bZXW!GuzZ+75ORo|)eT@|I8 z6)KLoS1GZv%g!1tHci0Mhc)D2dQ5aG9Sob#7kku?bzGdpS-Dht*NT9DtPwT6tWvE! zC^VB4ml}g6Q9}YTu$3Ev)WRxwR8&!hGvP|`c8VydA(0;rJIjg5b$uM#VuuQ>SF^pD zB=;Td*0%(RSs!RT?)19Q^4)N6*Q?jor8=iS?v6d at h^qX!1%47%bzkD)hre#DpPQqQO&`qX^mAqsxEo9m;YJ^MC!+8K;vmJR8KCV$?}^7E(yP zH>6X(^pAeKV)E0Hve+i+*0po>R+VRo>~AncA+KQ1N)fBYp!9+z4-?%t6InSKAD{bY zWIz3Q9~;6RaCsMOOgGyc2L{04*!g(x>w(v#xZNpY+^BMpX*@;>m3#}$d%m<-s`HIFdCK8EMhDWcX+ta-7b><1)bxr>9vx;fXf+P;Ub zgFIoA2QdcMnofL?@e_u*@?Fa1P88#^k1>6O>0YT(waqX at DFUT}vjWq3Ypm3ZvlYx8 z3rQkMvXd(Vt>HN!T at j!QJ5VbkB!XykVX?g$uruPp1yUD7<5T-)$2V%nH-sfcevpjd zd^KY3`JTDa+4N6Y00HhI^e}+UER*dQi#^x%7=(t4PT8z=9{HDC{%nU-8IS1-K)v3g zv0*`%j$NvXj_^qzKoF*LZ&`UCp{dz6-;BA72Q9fxTC7M6XX*E?>-{Jo=x#Q5&Z6D^ zi*JJiPLoJe|2L9j#4-Jnl6X$)!jFp`OeR%KUX|)!x+DfUt`X~`S-sV$>Qdb8BJe+> zeMkvsk5y_dlr%qJ{+SL~98(@aFd!iMgdiX^|5G~r2N at 1E-(1j^F+P`;z{bynVbUqV zDF+R8Qma>_L}IVXPe_o;s7Non5JFi47YgWB zyxeZ#GDZz%rtS$(dS~Pbw*g)H89NP2XqiUZK1Y`Tk7=%_>?_}=4Z!QQfdc?4AK^;O z5xxVO{8wFQWYCG+(r;m=Ah~*AJ!#l531?uEvAy(&p9p*}&Th0rWQW7 at 9*<`;q|SAE zx({!R3Q9H5is?g?E_YBx`1B8SPxKYcNM(-16I*jwB|&YQDo?Rb)t0YUaXQ5jLKeu*Y)0i z-U%Sit03a6w=Ni;b}?yA$~etb8$$Ueaf)1?II%v|A>H0nx~hPJ|d z>YWit?>9CPKMEl}VI+cVbA(3Ts=3JV6g>xo{how5%0!n$B}e(ZgE?IhZ at AGcK_25< zae|p|)AMw63+HMTLRN&7!9~JyNP^`c;_^=Fogg*GlmwOBSl6^jWGEACplEL%O}~xFE2WbJGR^CYVTBT5=v9; zyt=Qb&B at EIV{S`00YofpGBIWL340H;)qJ)~9R-X5U<1O4<_7nqhy^90AbQNdg-v&I at fDSjAQOizBK(g*WhIr=BF0YKX5Ei~vGi_>S zY?T|HiLjf}sPSh&6f0ub4HQPeAO?m8Q<*V=Lxm^aRk7!LJevNy7mM-AU7jiH2sY=&YO|d^rx~8m|iF`T at c>^pIHNY0b*T5WSNvn1pt_KZLv(7Z+3n6&VpIXUj8%s6|;(9#`TKB z>eqd-Yj4|c9?`2--p9TXYR&3+j}?M^(8R$Gb!ZrExwnjL)e%&Q18zeP+`B8U6~>|f zWzht%Eji=#J%1POOowHVt#K}G)i12Dwza?$39%!IZXV3AA{r zu1OV!y)?l?Iqt;!GWcT{G2N4y6FA6rZZD-Pgb*A#@k5_5g6v31CzPTk=NnUmK_K<+ zjwbvmr at X=QQ}`_e&($*27>F&&oMFVGBvB0FMwmSJ2SjIAG=PEW+8*Z_fcnMHaQzRn zF2fEwfq|}k*%pzh38{n^%7gmf7Lvafny(_Phy{Wfs3 at Z0KKlz~H;*3rBUIzwWjY2PwC-bML^<8_7sL31MMT7zuzJ76p`I)iV}h|1-`JPt zg3?P=iE;CtQk>0pu0-(HmBP{r%D9(yq2YdWN~HpS#O(=vA6RDm2Ih63_!9xHY~}LT zJ&cMwJQ(U8`S(I`-5}lzGV3*&h32$!E2$OhRhxuJZOM3(n$4!AOD&tb>IcuI$Mz*{ z)57d~UPlpcb*P5xHo-rvT1Sene*D0=MZ9=~EnYB#&0;*9f8>;4a^IU^D3A5s~xLxp{qqZ1dig3;C5ZPSJ#yhN{e5$Ys# zoTQ41<|W_;4!brl^cbkv2}utXima{(w&tNir_xzQprsG=9J7hzT%!nqCNO!F*zq^F0ff|u%JHy4{*Z*OpT)Y!%BBr-QqpjSH z=Zso<^l))4AGs~;%WI&g{X_oK;$0T|M0K>h6Ta6y#{^i%TqMt%R8~Mad@JNUjSlX-O!x zM&)FZcZ71>RncM7^lnu8K}!+|ifp2S5hHe26wh`tLtB?F*w!!o@;H#QVU#})?a5<} z)|}1~Vljy!u+ztKzcbao{-sEU;5}*;@K at RY`JY4|yZ87^*Pz1Jrd9a+4G|1v;sZ`Ih$)-}J=i`@;w1 zZX9A0?qb|-2w<60s^lUGf&Ki?Q!Cq?CUB at ws}k22~8M0`B?I at WXb3g zH~srVNk&dAy|B}9RVlh?4fqoCv+O=T_Q!o~;+B)iQjr9NXT{l3Z)4@!DKBz5eFE-1 zumO4J(K at f{c7kEP`Mi>(ICSfUDdr at A;q{w&YDpo9osi%ypR%XDjAUtzikWl8FhyZ{ zdO|oK(%UygWQg)Uq-*e4kZ?<8+b;?qht at 4-DId0C!J8n-Jg&KMx z3iJ`>`m6}!xM|A=cL(zfDrVee8^xZJ=PZtfx63?UE2#E!YeC at +g0#0QJTd|J7rik< z7q|bJ156`Luq*%Q$_V>Eh;sac1OJ(JtG=y*r-uHS`W{qYDu_c%*BmMi4TD?}1)D5Q z)e8$wN<}wFsMpV~rRknA8P>WVGyMrS#o6o^oJdehZ4F8l*_>NmjR zitE^a`{l9&>+}6BZ5ssMh$d>hefuY-Y^0GkJPU#)&=%dr6S>b99c3fl*^4Mj%yh7R zL2$cK^Gy?;#(0FCI6S<+0k^LRnn0qS{2S^4*MMS;lpa;uVq?hf)>mQS@&44tvSK$N zWoa6F>p~D8bpcTo1_H2FlX}4UP8a6%R7I!1CN!uci9XX at Nn@VXLpC_6mW9r*&emc= z&P}!0l(V%?6<%juNu#B)wV(^CgMdA?bTBRR@ zd;ELFozgHR6&bEYg>!$)3rV at FhD~d==2)C{m3oTjZlU#bbd!zT{USF&v2dEJX-HUV zo+FL6pgLrAFaT}bS~w0a$DzI&rffugRXQw^IKO6K#huCKRy`*iySIdmm=8fb6n~?%d~A7s*Y*g*hzn942P505S!~rJ5?Ajf8>q|PTsByj7Hoax$D)2 zL3WkD;*l9LA#NuU9s-XUb|tyMSaOKRQ)9?Sa$K at NAgGKvigI*@k+k4U*NBug2Qwtr z+g>|63kr1)@^QFnnzc(&Th)C(CbrAUiG%L41PDM(R!qy|iBHADHd3(;E9Bvvh|HT@ zRUEVSUR8!GZK&{qLZwSy=yy+jjV_~Tpr;(0(jIEwjNVk)cdCA&2gfQcb at 64hb|Zu7 z#QMnyXwhG9LZ&5dX69hY+HYvPcECd3nK0kU%XIf&+@JFNqgPL!DeDCS7$Lmc_jK|9p6IA>6YgkS$_GtM>>5QGs z74qbF7`He6r~0Pn- at DXZ-w2ksDlz(ofOzF|RazV5NP9Hi5WTx;&?Sf{1n*l^fvb*7 zKz;n&O)=a+Kg7Nd0~9Tv(ARB0dAc}Anr4 at 3`xNMSe1E&k%bwH$&#bQ=Ns4qt4JLqJ z6cq!fT_5W)Q!LqN(=L)|&^8hF^KLS=f_(mv at 4^bsLVEZbtv- at CTnOLPw=x&-e&a8c zAsf-R_{DfGCfu7=&4<=tkNHWSStfe@^w|OV;rrL>xYxl4w^u&DtlX!Yz~MuNQ>w>_ zGX0_(rEB?HvICLs8 at 5g!L_zZ)d&zjKa478cHC7DlfB$3rT}$$&AT z`&PIuFU7Zd-yapI3I%JlsaEEzj!~<7E1Z!Oo1%@HSADV}eS!oeKf7ztL{T0w-|3rs zvM|&sOoKQ=>ku^yub3*{Av)2zhQY7p>@JY&YSXYe7e=yyYws`IB`pj;Vis+}F~=se z_FKfs3LTTvr}8Xk+)(#5NH2=+r#KP|#n(E-JoMApC_}CfWTZz!(PPRGSZKpBi^88; zcKf_*WcEpb5)W at apExLZ#2*04HAr{0u}2vwSWpkXiL<+?@Tz2jHjm7t%@v>%AUU%g z1~70j-ZdVjxxWeMe%WT;-uVPrC-G#C^;{SX(A%?E`cLD6FqR8`QmaAAD3(}p<^A~i zi_w%+^IQHj?m}c*UKJ_bDsDAa`!|ICpXhQw|0U*LdyXYE@^`|&fq{U~|34>O!pz>x z*~s>P2blh^Ea{V9|0_#uvN)YKjq^j3l~XX$z9VX8S9n|EQmZDZBJA~Bnbe^cP0~9X z=Nl}z=u`-+0io`TDyJY9oQ0xHr at J}29K>0gdcWSgA?u^zTDtxd|+DOHWj>Q;URASsP+o#HA5_!|$!EVmK75#F?bPtm_ z;N2H^%^kJ5iw0guH40VYUJE(*{G<|qqGh at Scf=g;?3R%-VJ!#Ad3T!5Y!N)28l?jt zx+B$k=$$Jj*WR79$_;sVef>TKqJ4)HowV*Tan>zr)DN5*!6HmJrxQRKtU6!YANNYZ z$0le9ggOz}>Q at YhMUjvqqWHrclmD=`$zczh at Gf}6Yb11_c4GXn at dWa_!uCa8Vpsu_ z4u4qe8^czH_hI(xGXA#Z#`5Z8j0 z4#F)afl^r1=z#46ntrKfj_*&1MxC!;v0{ywsgz(lJ20zQ_ddmL2ym4F|DsYE=u90G z;6XqVe*C*d_}@A4e|nDDxT-E?ps=0t3)84Q!h{}=9P_ at ChoEGThO*4w6-}r)&9`yQt#^Qe7$hF z+L$0sVyr(H&UU%vdOQEP at O!k`df#SY0MQKT#n^#rHwc3=^<*RjJ{MHKnyt_ch|r%? z{T^7+0pTE^66AWs*pYZ{fD;%!o+ at JIB_Hs|L2SQP$p|1H*k|Tt`iAB-6HB4TNs1Lf zKVW3E#4vz at bD6eVe$7t~olCvrSPcS(oxIy#kAn)YFn%2aH;rl7^E*BMc*9fw2@*6I1Rne?sH$Uq68Qg;v-6$C~a*)wUv&e zPd#}Cw1o9(&4(H8txmt*tRXQDl2v+cN_lN(i<{QZVzjPcKe-0{g6A=0_7C?_V_ zlGW+j1DlXdQz;itB)HUYRw#;$^%(*HoVzZvbI}!Ote2pOkj7Vh6(dHBu3?gp5m9%3 z(SocXJ2uR?)?e&q$>tPOHB1ORL%(@&1?3Z*aIHH<)SC}H;GxE9S!Qwvu%hVAO1Ls2&G17XLr at Dm z#lspXe1N~gdo)FI{oZ&~FNcAmWSU~7V}=3OM6q&~;%;xSYhX{gyxm4_n) zYesQpKhmL|8 at D}-y1BQH7E?MvyCW|y6ilnDiydc>Z{6)RHKI5yFW$uspw_UpP?yUt zI7{qMcq+4o`3(lp1>t%FA^J`P;e6e at s4mh;J9>qa=AS3Y&%FK2s`PGHikSfai z{bEir at s{!sdx)M&7k|{zG`c&`Vc|x4KSDL|+>1g6q%y~`x|D1%j0m-7_M8}2+j!K| z;-sk{hxLa2Q*K7rb23<4 zl(&4~jG+2A9zl0x3cYdjGP`$&1yzO8C_dCqhw}xz=q*ZOKvN!`0ywA{tEP~c% zH<3^QLk7Ih=pJLo1{tPR0-GIaQ`57-dhI-B#VB$8VZ0o78nknacj!4L+Wz>Pi&KOg z$#Y+NE6cSumga9v>HenC7&h`tKPXh^j`}IB=JqCsxhS((2t?kOF)r{A)S76 zY)|ekk(_1rVbt3;sSs1ChtPlO}907KV z4jH%elnZ9Av#h07R^2gc_Au`u4C*6A9Ciy&T3xf0RZ}#NO&rz_tE*jj=8)oc)x7?8 z5*1TOfK~3z36^^EIWz@#*D|=z;R6l4DF$RCESi?sTJKW#Y}h>h zZbzJpmG(%Nwj%s2Ivwh+K6!gWSQkqMaWAfc at Ha3!r?^Wrhv`pw$5t`G_4^v6m`@ie zoQyol)8 at qYG#5Vz4}KB;@7Z;aNWy0l-^#kd>TTo(wp+m*2}1o4(hyCCsn90}w&{Zl zmp*AX>_kS=x?VxK>K<3)i*^_xR%QkpWMOom8LSz@%{620VD3PxcP}9zky%aXEEt|n z>*IbOE2=5+#4m7T=u7A$uojhD413Q_1xsn>z2$ zQU5#_5HkNfnidsq03iXO^VKSOwZ0HhgO=D}0~E=~nD2KTqC0Q_|3}^jo_dv`W0DI3T+MWJP-4wE%jPQV3h6 z0fFTYF*mVh2mvnB(8?K^UG~k~FqXm`@A_)KZhV&$$t6(E6Sb{8yd!EUf*Hb&OrUKg zlvjhQ3ZGderon2w1I0;dT*nIV8%h&jU~3^nV#)ssRD}C z9 at 2B(bFAKbjH)(9Le_w;pkJI at vro_H@LC|WKcUt`M;p{J-MeOb#i|+gcgy$Hxm#1x z^}=A1m8}dk9Z8Pt&>RoaEUo(24N^^&MwESXsB=`53V4 at NQ;9(_ ztqYJe at 4rAdiyk$YjD?kBPjv+R2>)!c!g))|SQlkt z%Jk=y6?nz>+9v8~1gH{UvNugUhl^lKmGH-C)6K{y9&jvTmsTAQu^~)(+_7&mmt|}i zKdht4?(CJ14jqtLG7dBiCrtaLe8GFy*- zs0b;gdnZuqb)|ocIde3 at CXcshQEy&Jbd24pj%wvR6xP+N>s)iTqqbKhGYeB63nC>mqkq{h zmL8iN^lPG~YEx;dt4M4_i*GVCOGXE_&F-yB_CRt_Q4LM*Cf>T`-WqghvGMQFGA&m1 zLVF0b{-M}WZ|M2$IOMNOH8oOK=+~~B9VT$^E6zC3z)R?%pJHL3R*^SfmT6LVdLEDk)!;b) z4gF;6e=+t>;hlcV)@YKBZQD-Awr$(_#dgvi+qP|69ox2T`}AICecwL&e{t4+p7)}z zYt}nz)R#Gl|d0m2Y_PM`>mJ}{$^KO^fT9h?{o!EPpfunUWZE)&@4t#Fe9i!ul5)3;%g_Od8?22u*xK8- z_)byqLshRM{Qe6Vy at -@>fhDP7AUs32d&3snD^+qZDGz1)q_u8%R3zTMG(x))Tjs#` zZM%JCN^3t!8lj;s^x#)Rd6n2cB`zhTf^kI{DayKelA%l;38B8?EQ~U%{TKfxbwe9uC=HNc-GO&1OLK4K67ipiSK=N4fLA$enRh2aJl z at p8(xPAL<&>>(fSUCs{IzOu7`%XV~JrSQo}!MehowP`-XV z2t}4L_e$=oW?9}F+gs&ldnKKe=}{k*%-iv|kNHykmKm7vx)r=GeMwal8$+khTlxdN z25Y;@JyPqL-8NrDFz)A3{(wY at dB(C%J|0=}4R;X%$8J%nX^tVy(i{%T;;>r%^+fvv zp7}wckNTBbqn~TFxl9OTa+pXqnYVsWxzSA z9o<0kaUBjS4dn)Dqme5N&eGOU7S@~Y&OZdL$g`A-T at WCk7V!VY^@@U_v&Fx~Lls^5 zc>`2msgB7>xfMjzn*h6xTSdj&06OVd5mL<|ViSxFmqQmC*ULGVQ2yTSy(ocI(}n=pP*r^w!Vn{ z{h0Vrh`I$-2GynOa7||GtO;d>Y}OI*^Cs;Te0FVQ at 3DuV1J9A^MQt`Aid(*6w6n$i zdN>q5Fo~=!+53{F at hCNG$yO{HgBDn-2{u~EmzLFr+H}CmgCv(4+=@-nigZn~$^{%- z^mZD-+K9CUut4rW5^3Q;fCzsuSPZy`q_rq&rza0?;M4pnD>G3iSYL$5cx`sbWA~Nk zYL6 at Zvu#%S1tcV}snWf3++pj~FgpSjCZ5UFo6wcRJU5%+qjn7I^~~Qg z;xFI&byPe(#&x8MQd-2Xk2|VxO{nKsK1uc-FtCKu`5{y`I>=7t7)U02VhBae6F&f4 zBo9%0Tq2QiPuU;DS;nh&i1pIum~T+Gs7kJ{sBzN=h>UVfaA5}^qoUN_F>`1egyW4l zkr^gIC9eXlN5ZL)qOz{}@mZyD at H12!`OJJGe}>cl*lZ9%h__3!Wh0OJ`aP5d(4Jwb z^Rm~GOyE6C5PU^7W5l at e zM6xNwvDxLHnFNTb-&hb_N{0-bW zp49d8l!R)nP at tvRK56RbUwQ$IsYNMYFx|8(*y%A*J(em!|UtnDYFpivvq+9%Q==(sPv z7|=o8T11g`-ZXZtH;OlR98^QRMMTC}8bvaG0R2jIXeK*@i8FCC>t0Q>V`6^4Uw)OeJ>c#@QmHxl!z5O2=81eHR;GY#AA zs;t-n_IM{+p7S5X>sM<~)*FLgv zA|W%(Hu#vLI at T1OMma{CNdu@{oB}RrJeI22TPryl~&drvsr#$yKtuS;w!^8#_&CPH+pJb z#(`6t(57)M>^cT7)dWs{0*Kc3|dp*1 at 7W3aQzdZ zR)5+cY3C2DufHe{LTxx0i-j=V9QqZqu*=Xrk~FFM$TH#OKK^JHzZ%#$DcuGIc<+#K zy!>f<;yLEQvhP1aK`s^K2 at wJaNEi(Wi2Q#M3jgLZ>g!H8>R8`Zbb!mpVz{AJ2YNc$ z#icj~Vn7(qYAXjZRB`M0jrw zOM+k>K7qphfFGz>z>cB!I#YMtv9q2Hz?1FtI_381v+a9)a{2wW8w1q5r;c4Mt|uxe zj3NW4Kir6E#$xSXw96sam>;Ss*r4t312<|tp5rqZQwPlyZkdn)lSi;D)KCugo?6cG zq_>Q1Bf_qESNo+o{C&W?Cm7-ekI`Elc3b&2H#|heTmNtAP|$4CzM8K{pJ56XMl{~s zX$UsCsSQsVYMSL=wzHOLnqi!@N;RLwQXF2`c%0d($Yao&yaF+h%5JPUe5A9LCM(Z9 z?#Hn=H0uAw$D;U)(WYwgLvm z&Y~dkBvqzjdaZ+hS~h3YIJ)=4v$F3*}gf!lTh>y%hm+B|DD zeizzBxNNs?7hK{6yWoapz+|>9Rhh{KY=1LP4lY=^fDk_=6y`xlHCE7Qf~$Z6+7a$I z5z047NYV&KR{iJ!;LAuytSro+p-*xH4Fq~>0j8^)N)t05 at oWc0k_9@n3R$GDdgn+& zi;BeI(KOp4(vq}F at s;?vq{t$9Jb at WJp}qkAOYsK4cquemXD#1nv9C~|9ZHPJKx0*l06fkJRDIrP4p177WR!Xn$mb^()P1{r0xcISkT^aZ;>ZkqTdUY#DOGVE1OA`{@xdZ&ZTGh9`# z%2Sc5R~TRAu~a{3k*P9+mJeWzuSUEbY%q?x3h=Zf*)NslKx4PNY95GMJlgL56squt zd#7nOpG+@!%2aJG^&Du%o4%nPCg<=WLXRX1e#rKa_dM6+vovfmr2CeeX9jn%9+K_! z!{K09!B=z88b-JYjV1^;gi)gQE!(0c5wMn8rdM at a57r)TSwh!AImyJEIbWYrjk$1jwXt%a90|};wjn# z;7#vns!3>oyYPe at t9It@i*^?7BkCJ50^yW2ga0(DUDV^i}77) zhs$@%R at B$#M^c$j@$CGH|Dit96~MlfIJ!=!kf1ZlYnnLuz_&cX?b-)zsWd&E`if#4 z&8~(-x09^3&nL&y=|8ZAmScI&cAav}jqRBZSq0GObI3mJRIwJ#)zK2jUig%x0&bc?k=7V} zrC_jtRlq}zbuzT88ezRbmrC!&6m(#<6bq#Rmm>sC{ON+ z at MR+Dm~u3+%@A5LCH%^ZA={c}EQH(>s?Bl6_rq3{{TO{#aD*%nfn*3Rx67|sxGekL zf^S^cDJnQ~Vdm5+529-h49-V~@pyb{ZjpI+!Mu<`dp6vrm9Ex}-Mp`=1Re2QQ@|TI zOqveAvaWRB)mzPSu`a7ZD`L+&*ON`5$sL033bF~aWKbh?u&ly>QF+-&Bl1bLmO}$$ zu@>{X3mQG-rmc5RpOb>a+(MRjg(5h6dFIZ_;!luzZukmw9beAUI2<6;D9v5H(u$Kf zt5RmiFuFvOJEnGoz;uv@{uA%1O67Ah*0Cg#f`r#DzG6CINv18Tp3gYZHtrEC#i2;z z)&&-nOGHN&_*eT_4tWp3Ii&F+9QHtaNJH&P^Y0}Ucdneu*NL?ouv6=ArtqJaG~1$w z9p_XC;~Ow3W!?xqp8Bt+x%ACF;8n-CYj65VKoUOw^at$V=Qsde{&B;}Rd)Nyy!+NC zc~$;3GXI{uDfLxuU+MFnin8KMKY1fo>V}4c%_q|>pRldXCMIY8t0tm61|74LHig4m z`$G(R<<~8mp+^*u#>Smq5vVy2ixLko4V&$ks&8WSuh&wdiyAars=> z9=W*C4m|aSU7+Wy^m^O7x{Nnmsk}9xmgksh;~%?p>zq~yTU$?2GNLvjyY6}-x_rhv zx5TD at _srk%x4uzu-O#h`=yw8tPe$JmJWV~nWcA2z at bw~jhZej at h`Do zs at wm*2S3^&>>jh|ScO0s-AXWG;G9rx5HXT;%%%1yr1o%A{cCUvND|c5IJl@(NAKdt zaaY5JW`v=UK7Um8LI5o_fBa+DjLFlx_cSaJkPk5s5ZQmussGk-G@#sdRMEcd%$S(d zI?0J_(%EbP@!%5Vk_olRY+`ebK|=9H4T)+9*_1 at r+R!ChwcH>+z2Dw&U#k?S at T{oyqlUpc&$5 z=snO27$Yq5kCp3T6GXiWm>o7-I|L&zc>8NFLHC{V9K+jIsArm{|f;_(=K3^CS at To;OeUS&`Z<+aC`S8CsV)X6b?TPUF3WD5Wdk&`e zWgcnxeJ3yN{9ov at 4dCU$Z&7`R`?v3J5I#K8kF$5%%s<_uO?|RUzDJlkdvh>6Ug8ND zARJKjZujK{aRd18$0~e3g2-NJDqh*MJ)*pR9dGeN*MWW?RDIv=yYPQq4*vr6M>6g} z*R~ut$rnqU1Vo{SN z+N_y;{sz{GH$*t9yHO_IbTu&Y8~t1rf|x~l4G<_vnIuwB$9u{e^4Kb{2ph>>K1&p( zl9|)~>)0ZGc(=hu&fj^A_Ds{cZKgKgDR|MnHM~dq~J)-Phcf9y&RwH0b|JwJ??Roz}VREp}}G|j_bv;Ebig##3FFz_UMxNpS~d(r5GP@#%NT`wo*_h4%)vISB&H&5+{N;#iMw5$_jF? zQ*j4sHA(Rp%6(pj3`slY>}b_x!wJKTzly!r6b=iU6(!9?WnELh226(?jp=}1X-0nD zm?;2ao!XC`r@&6*QQ;IWG$hdXTa6MQvT}5{5EqvTaj{t%qPBew9<1FdiAKGKZebs_ zHJ_y>F34-Yz%p@?cB>zJo_!u*_2AA?oVJE-97t_7-Qy9l)G*@mZprH&+I5} z=z61^E0JAmVeD at v-uO7n$XlHN*CJjJT*d at x(jJAiQl<)J}6U&f6TwsK1^kY>ChwV2qt zG#?0fNM+>Z5+PzDGuLcrG~MT}f at fl!j6mSnU2Ll7$`c1?h2L0gI53790W_FC%~X2u zE+lIT*l9$~yDXYd>1f`m3baruxi}#U*wv`UHa=Bn+Jf6)IR$UT-*%F=5YtFn;uv-H zGa7S)#nXE5N;gxG+=w++6GEA^z7gfcO1GmN3t0hLf0C-9>0+Sttyf1J8 at Jth-eK+Kvn7U>)&V-s&~#|APr6v8B~)v1)Ng~uL}@W(y{9L`Eq1qX_9Vdi zA?FjQH)o*yS7~`YbOCDgKWzCac*b?T;OZAwg=n}-Vx+91Dn5qRPW>!BFVdm&Ow&#z z{d<3lg(;#RsWS6%R+>{SmXErLhDp|hJtZE?3*h}6Vi}##bK#e_b08Vjj9r)IXZdQG>A+#f_MrTcaRgqQu0vo3b2 zk)*m<{TTGhUZ at daZngdZWO~pOq=w{dCJznqeH7&(G!Ce9fOkD^jz8FfYhK11PU$n< zL4dyCaPX7x0=o>M9eX)KZ^J84XT~#0&jLH}FQ0x=kOjG11Ac$E;Irqvp9{4JV|0!4 z0m`S^zyv-hH%5`vNtdO=oEAfE9KlL2?-oUKTwpk}B)?v{my*-HXzlPll}q1n%U$3X zx$^59&q_F{(ND&?oabQY69a8UcS(iAZ{J4)bp*>@apAB zHlWB0M~d32{9$bwsV<+OM^Ocd@;g`600W4_V2IH!{P^L?7EBI!g&;u-X9>G8t(=DD zMTcFYGdS-2hxPmyA!l37cFUNysXI>d*W8kzW@!Pxu}B7;Sjkfo5VA_ekI@| z1*)IX&}S-=`B#Xy)ayas(_6fDyq8%@cAU_s at 1!5@&|vQA7Y|s8yPC8^PLR7E`5s}Q zzpxlPg=UXcp at ea$)Pq$+4FXX$BMXp%1V5T*4}ZSkhZ7}X4z41{XTj at mhe>Y)pIfvG zM1-8)NO15pkGVI^11Gpea~jx|Y{92D(9 at gg>ol@Cd5xC!r*!e`u# z5ihA%ij-*tVb4+ at LThf|wh1-s6eR-qh)KNQPHz>@JPIq7AAI0_a)f)P^7O?Yl0OIv z7Gul at 73=IP-9EC!(i}EE=y%+=XgQW-`s=u8q8a}%%5kKBi{tY9$kz{N9GQWa?jLC0K}Aw$Ea z9)g6;`LdfY8 zz8^9EpyO?;@;g;?PTen7ZZ1~ko9)9p-iR~kkZ{&l>d*H!nO5Y?L^ow%*YX^z zB!%G=TD)eE-dpoxuP>D9NPai1p`3G*j|vCbW-fo~oyIc}o(yF?q=W5C>&VqN%zf(W zYH6t_V^j6eObgY1qNEVnTo)9Ko$I`B|FVLkgfQXG-?{EcgL`C5F)37i-FwvK6(&@0 zs|`}$gu0JSFYUT26crKhI>!pS$DmE;VV(%KwP4mQF!diZf{7*P at 9EOp-sNw5RBv|^ zQ4&iY+l6P=47T;N)=kE)gd%A at bO>H#lc>kbx^bKWcF3~O*u5=n)>MF!yJN at YB4$R!L=* zAh_lmI?T79J+hzoGaFvtx3|B6ZlJLlNgY(hK$i1c>34mwh`b4daTL8NcS*1mHxhG4 zDD!CXZAVIf!^FfCl#11nqWEJE(m8bX5l&8GU^w2tYPM$`r8}^f0AO!9b&t*TlxZWh zVNZotOHC_+6&Kx;ZLNakFl6^lxijom3ap|NV4)&1%Jb1n6a1Yl~*_|X; zojm2|v$}(B5%ljQmRCFhf)zZiQx6)u$@P^ctfDn$_hMDmseh6a2g5B@)h~i2qdPiMWliN0iYm3h zY&Bt|!>4L#y7+chT!KgHLxT;y*rzV5%K6J`sJ0gae5c~duUo(@FS7&5u9?pPC+CELi$jK%?8 at Jot&B^gfn=bb_JIjnk>JU1n+crQa zjH27#bXeG`(Jo3UQct(ZNs|e2B^%mciHD#`m2#?pm6b{uAu|ovaVe2hJeKYzF(z7I znEZ;Rnn{GbiialSU_BVk at wCTA)*{I(ZlNklv$oLXyFUZMeo7|K>TKR~n3R}TGQgQ$ zzW|LvnU1Mf*w6 at -RB#QX+&Z0JY{(SZ4iBQ)Xga3FgsnxUid>u6eHSlL_PcDBD2?xK z8UrDJX8)%`%$^)Bx!8WKz_ClYegX5vWm+l6l>eQth4JczLncEr+T!Li*YR?=>^*n; zg}*aBRpVor&Gm?9EU)YIgIEenQcv+&#MN_%4)U!B0!6#%iutOce>Wt`gCg5+q*(=L zcK at suQ33$T)P=2eUYu5d+0*QV)x*FESE^wJru)T8p+({;Gz(%MlU{yDt5wh^Jh?qk zfypj$V5Zxha$q%Ce?{oWX#p&k-4z(33Bqo!u~XoJ#Y0>Y)fUt$UCQD{=>DGFJwJ3TlGbUPC3kd;H+T>f3pqu?c7`0oJ+3V zK&}Vy*KXJw*2givoQ*yTx0|ei!jzmAfY^dKw)~jN1}#34$)DYm4fw)RBw4^e!^e~Ul(Ig zrU>Tf-$eSo3L(Gq(1EXK at NCAje?NB;h72(yAi;e`-Uz%Ce=;JP#~x)W`x8!bqI##p zJn+Xv=&i=gsjdY60 at eo5yvq9>qPgCpaK^t>AA5}@V2($A2MwTDdn|z4QxN_px$80 ztP76hpY2R0F1V;ze~}&!{(pn?f<|_(rvHufYF2jZDu0o_x;n##%y}~_sA at evv8uyf zw?i=9bq0y6S+6;IJ at X*e)A3@&wfPp|1#T5_EP|QSII0BJ8)j5859c6SW1_|3dii z{3Z|NEdpUntwq&$VqqSA4MT~^^Exxt^}cz^>wW z59H- at I^ji|;I3Dp!)8bEv<1{IMoqSKxlhv90wHdSyoA^CHV59lL2vVvFwIJ=K zx%7PIi*Y-6jn>iFPLfVTOq>DEC96mCs_4Ua;u8ehDN1;-(@@!;WEDmmhewgKOXsi@ zBUyb|j)9=hi8Y-Ymak*09pzn1qA32bRi%k;z$AfYsugCA8PnLZqKhT at u!YFTuVt>M zF*fsADw~4ll(yT*!EH7$@(2 at w5(}T-oDz!G+5-%03KWBznH`MyRZhg}6?s}`W!<9d zDvv`l+KXo!naFV14dq>n>ojvea4PF{{~~31Aq+S14*_!cgq%mK4JMYj z?AdH2k0Q?ug-{c>?qBMZ!&h18!k#E_nq`X?>CriyvdDuYl4$MHg{SF9oA7t}vusu$ z at zlX3B90}X%HWz8Q#(MVQ9$j4vCij zf$f}MiV^{A{GudLO|UAsh8(C^zhR|P4LQ2IC`C8qY4S|kqSku0C5bPuv1XQ7EYQwO zXNM`+10pdYUN4&|ikiwcoIGJmPS;H+eDDWq^-WT at o{V9=PMi#D8aiU8jEP4YokCsp ziuEIxRN`z1pGM+5{IZ#y_N9o94L}(7ASGKN9gbyu!(S}f1gW>*DXESR zB!L8<5Tm)6_8)kH_wnbrNr^O!Zy_EcArQM=5QjFDw}Ua|2<4B#2y`z{PbWola*w4s zPQA|7)3hdw*$IO#y_>_bdZ`F at D=}y!-P`^0YQGSGeMXma3Nu^3Hc4Uje9%EZKV}6- z+LZYGWpb*_c`K$kv1mXqctX at Ih96&4J-d(YH*;C>>)A)1oPJkX)f_ZP`dBLwte?C0 zM at +F?4(K$a){X9-d?1e)#$NIiXWjz{POISOL|onR($06wKhOXl&0uR_IuH4^wPCt_ zlplORk}p$l-q#CD8PQpI(QaL1vT~Ki!~KYT1i=1<^05~r62XwEnCAF>s?%Y+VS7G> z`})Ljkk2DI!0CoLW|*cEPcxxeoH<9xpFNk(TSO&GX(S0R&=-c3zkY$0bMNlOB#sPt z$Upm=?!HIaAVDCpELoEjZ1wSx&haIMS>KB`b9< zO+y_EG}u`C4Nr8o#T;tKVzm!VjhQmU&N3#Ro)XH*)3Jl?@Sl?!tc%kI!VPEPZx;L;yN_M0R!WK3y{}bLfsH8F#DDd{Pvn)Io3o zbCIK at A}Gbl^Zi$JWQkkA4Q)V2o0eoYMqV^AMUYl^G3ApA#$uo`VCcd?bUtFk5$31K zaoNpTc%_oIE`1f3x=qb9#N83kE&^NlNIFyLybA?;%|J}*y7pxQx;ow!&VehTs*+ at r zH2yRTnKFrrJQzl}d^+rUML$z^kKCJAkj%-EgP at Sr6z0^E>2#*%_SM&9k!H~3dSNpVn;GT3uu56 at zl4}orzzBAt0};@?17ikn!UE;d zGKax}yWo(}Is>QKSSr#FP^?7n%O{yrX!U+Z<&)Er9sPNaT%lOnse0a*)B_; zcE2U-kP9;94l<-USk;?^<&Q1wo^VabqPbY0 at CbG$O-9MX&i}G<|Cqbc5S|x_mHTfBYF6oX|T^4-dmYDLlQkzpdMDm>xjMzVJNVad(zio>v zdhJweZGf$DJS`2 at K{OniK{E1gIl83MV7#Ku@>snICZ8>1ecj?vuQ$ZG+AW9Yzb8D` z3bky0Su3qKaGZu5h_ at 3Idpz*v>qdk=dY|&@PPh8 at cC`%a^JjIt$%xn at -Dx}{g!1+# zcdXnYj>$YDH*a}`CZ~}#`Vy=xK;0sLB~-pd>^-rI9umOr)ma&*D=@oSn|6?+M^QE{((Y~+Ds9QC9*WVh?*7Zh2*ECykf1Lv?r0vu at _w1PDJ9j z7mCw*7>t|m!0}t_iSo#cboq~qTHhc@>k4+O1`tMtpYa~t4ut*4^-5_-b5*d-N_Ba4 zRQ2gvX$TTQE<}H5jf3~9pYt+_Gp(T)o!_UE7-S2Kq@*Zbzdwg8AJ?H%T^@-Oj>CLbUeH5S(I}wpJCLNQ z%OoVwW{;iFgqiBRaEaE7oeOXU!W?2xT*=jh<_ at G=sIhb?^~Y zY|8V5SGpTv%^A8@)D=3d#}LPfq>gP8JWI$M%X at p&snIDv{>!;(qBrT3ltEg~Rp>Jl z@}_7h0xa9Z5xr=jSnaUNn|ah!?lo;!4y>5wMcUJ;&nMKBis+`%<~g6)Rue=EY2P|Itn0CV)(w_6YK1?Vc-w at + z4|?TNKpTdHrVt0 at 7FtOxH*g2yNZ=l*Ejt>VP?#5l63SLz!*1KF!$`AC_R6ngCY0I7 z4vLffM^px8V>sTB)cKYC=9~j?q0hwB76(QvmBSt>!g4J)qng?!rL~;>6%}KIU9Lrs zHKd!{wV(Xb4Ybqp3Z$c&M3Hdo>)aMksuL}Pw94m;66&~QTkT-jRL?^yny}!P&o%$t zuAs`zoY&0%1=?uc71?|Iw`GxUEkLod?DqTVIoqTx%lK_}ib2iH1IQ%*{I?lyt|BrM zdLO(iD#YopmVyZ3(3NT74%XPq{c{sVd2|xZjiJlDIt(BB^1b}#;a`3+zd!j2PrN|% z at 8$8Gf&3F at p;ufHn(;nWYcKIDW0MR~Sh91ESsM(ui_I(dLU~km(^2_?={^cBie}6$re1RHW$1G9XfN6Ma{k<2MO6ZxHXUzs< z&Cs6^$ZcROw}-n$sJ_A(|rO z=;))BY)pmr_F_0Xv5f^$d;kW1k+{NG6Q?${LFX|Vmws-=+QBY1Smw|Kmun*Q%0)Y0 z1gDoTgt*03E`viGZt?g*ajVH6x__!T+%rp~{lGv#MiRjoJQ z%GmTMNLwZ7>DC2W=~pHg*8uzxu8=&*E2_Z9*Q`G>-0Uasw`K9B8Mk&Ena-b(DX3#K zCZo;7mX)K5OPZBdKK(fPOf#^TgU7_4W+rQ*)&IG$H^msR&dP~LU#t}2%ZeAa7aD^q znyi%I;4%RNcvYQ2y2f0ZQ}&%g8GPh8%`i-oeJWD$sG*d(jqD>xFCQ7`ZiI at mRlQm} zSIIA7HZ at a z=WxUKV5n>=$FjC`yJ)pj_^pSxUGlDY at Gflh<_knRVqX~G*YyEZ%fR0+G%JH{-^`iv zPZd6X=kR>JKD;F^`7lmzNbsi{!_eq6`J0WS+^xdUk8M-(wDG#d8WG;19VTvHx!B1g zT&?2Jzat<_*iW9RmK$iTKfwQI6r{-=8dLwJ7YTpq1<8Mkg8y?_^S8P*MfGKqY><>8 zLKmbA0zsEhmI}|Oq*`PFqYXs&LMivpaJFf&b?v_ at 2J76}-2TlEG at Rz!i^YJK#mMY&eVlomd7tgH_4&TN{RLzXzdaP&3!x}di)q|IicJ at 6>P;ye zlLsmsOocwqbTv2wM-v=SYs$gsoR2JwiH1ePq-MI2aw`BrIxq|;+~nA9v|dg}luVaO zbC#K}t|BL$U9Sg$TQAcv6yol;8({eQ(FcBRi8CxxRGLaU1Ng2Ekef9e}0TF)* zb`mSjp0cee_KOoLFSAVm%IiKoPfkS&Y%v|l3%UKyEbb3#_`!xYET=Sf)72!#q>|?> z3x*5pq~R#b%4xfn^ITha0+OXouCGG1!-iA#N#1&g>g0_=I)ktS*W!SrIU`en|LJ3V?*j+4_8tHW$TC)#ei;fJUKU53Sp3lmS z)cbp*c%TZZP`6CFZHRBZ-(`3LT6fo)EXu+QJb!QOn5$r*^|P=H1qYsYfV3po^}}3A zLX|zWNl9EQu|hR;G>dsHlV~~HR8OVCzNs+g5^L)4s6E{0X{@Ka4IN z(#k{DZ00p!EXwP&Jq2%Pvi~LVrvM#4b!wi3XvW*$K^NTd88T5gte-rB44;wNB|R+IR-q$RA_ z#waqFzfDtObxtb1psJJ&rg_w#ff~e|Jj1m+z_b2jm`$I9N5<%CJ(8 zkQCfUWN%C+Se!{m2rmb89)V)v3J64b2`7#{K?kG!S{j^Jz?WW4%mMA(g=sPjtRK&7 z)=hrTEAsL2ZGFdA__BU)#n+crroMH$`Ok~&j)O-M_s#8J0r%GXnU|D~xKKqUt at OFz zO7cFY{W?FW&ZNM-$$nt=AHw~YF}Q`MKcyOt*_NG2aS;R+0=|Ug?H at gZ4M7ACVpW!d zh`I9%4==?Nzo5XJ?h)h9kB=H*y?e#1Tr0sfuXh zhaLu_Cwva!Fm7`f){$cRUEuu%ZG$m%czK3wwbREpM&{Ju(> zech{#JUzFzcRmLFSum$;qYih^@HOx at Xc^<+0*-#66(NhQ^YxMx>Iqi&Mo-HbezF~L zk^JY%*?sCEtLA9)?DlPU7vq!c{1!>Z9yHO;v^~I&LGFbTDTg$RLE8s6=PfgiD?sxb zKb%@jyTh`@V=0aeYekRvl3TM89(v_7TV1lJTR&Iap={?lr}LaN;cTKk*=OrgV0#Tw zVSe|Id}rNBU{)g4h7cY`Xs3je2#p)}vWw^YocxOCuwDs~R(zssTj%;;*`I<>AuDbT z{E=7R{}`>N8j?4B{7X1Q{^Mx12*AnM(bU;g#LmVLVEf;rvM7S6yz{o}Mfrq;`7glX zqv#+w`ha;*ZI*O!6zTMrA?LJ2q7LRs*XE_1LzFP`x2qVYEr5DaQrq|WzDzo{O zulM)uE6wj?cQq0Cbub<(V&n695Le7Qw6el7CX+6uh`zE at r@q>SSgA}>MeTu-PCVp> zxfx&tZJy+2dC6g&5&V8zl9{;e*>)7 at 9D_o%q at SpMx99a31Aju>qgz!>gC89VVm9^7 zzBcHS=C#_S)S{7p^xN;S(tG5*6RG3%6c^CPR2jFiWSMDLj79H}hXGWVNg9x|Ks)MA zq_bwCH=I_Pb->t`V4tz9x{1830J=~eaVm89)nN~GgX7da(e=uiLQwi`}bV6p23rDVN6WOHLChgq?~wEMR4p&G;4QXiMRLsAm57+ z%o7F&l=oBo4-A33hoT3H1}oU$a*?o~D4R0=5&H at vLTUSggzaimJCpA>SjiME*Vg at c zZtM6SLXD&r$qRUjrYcSy>IONGCUrkiH60N|+v%f0TLmFoIfphtaNp2tWhQL)m^AWy zUGnw&v$j9E@;X)sO;T!O6SzW1XN1ht30 zY4cx+Iq#Wm2VAFt==k;1WbYSEOMLH{%->(n%iBQoyCI-_{aPTywfMt|-r2oBtOssH z{lWE_?qk!$CB1`cR(~Pm*fJ>_6;DJ?OzeYFuNd(LrBO`qLnP5l< ztCeDki6+4;EW&1Ct0qaS8OoI<%dEy9x7sNRc#D>u#G7W+{}wt4N~mZUq|(}CFFOfm zB_qs%M at ZL1LCj(u3v_o^oINDdUQe7<1t=G#kwl0|DlL;L8ydSYS=vyk0;j=aHU!&J zp{>_e(A0}gM6(Zh)Ljl@!{H3fyK{E3m_yBDtj8BIfg%0O((@+1lmJtmqXEsektQcm zx)77uV7e-;CqG9=Sz^ol4e1Bd8edHAY%RYp12h^{twHT6*;FwGZ>qV1`1Ai^?VX}? zYn*i7=#6b>#kOtRPF8H2E6GaU*tTsuE4FRhcCz- at XLt7*{lDlvcAs-Q at 8%d!J at u=q zS+l0gf at 61A)Rwjn({+)4H2?LbAj$+DTet?@`6gHKLyxb6lDPyZ>y?qSS>d=9Uhp;7 zCT*vYQ`5{i%va9=>~t~W9Otj$6KWD!Q8Bg>rf5Rc;5!U8cnQKJ2)3yF(Rr$TCOg!( zZRUYW_tT}k^xZRAqrBa%saRSUgTBLcPb{6kBJ#8Pl~{Mkawr>iSTyKV=V-xVRIIHr zt|t>lY`>hewtYp2c~(w>O4cxWacO~8V`ioB-Z`=Lnt9}?A14U`&F(*-e*2`S)5 at pj z|ZeWQ|)9yT3*4l!`M%jU-ygg2rz4++Wg%inZYLuzxf3 z_qK$2+(m~Scv3>Dieb14653H33?es>)G(WvPy#JTat=bm9PYBil=U#3veRLX9e=0m zrbX=eps=QyEnuZ-28Oi%*fk!dl at qGTOoHRWy6mw{F+0H at c@51K6=Cb{3r4(lGLx8 at _jqG|f5eJ2CKtbg!F}2# zQ^z^=h!K424%Pm!O;is3c(^oW at i-iLog&K>KEv|SJ- zc9(LnK#&yID_qQ-ETd45%w{m=hs-l909z7FGkji*U at S_J*}kgZ-HknC3?=moZ&)h-*#3&13S9(Q@;k)zXr8UR2$v% zrY4tmF8j{0=0Fr{#JQ6DX!mf8ZON8DL$#Eei2kUsSdVR4H?JM~#_w>Y{M6eEz6L;R z*Y5dT=t_cJTD)sWV3FY{;O>;Nl}bA8E^AA4kB=OeGwg?f!R`$X2zn`8Uc)l;m8qH>s|-_G{K*M{=vzqSk>$ zr7nU9k@#&$Ifh(%c|CevlJ`fZ59+m#Xg3yh#&%xhgWAc+;=0 at AB**1?`|IIl#Q{X| zc2*pvb%N^W))3 at 1*Q%@IOrIa9$Il=k1Qk0H&_Aq9`GPFw=v2ApmL$KtuUiKkv&Q}N zbV{)dpp!bi(Z^izX#=a@>~A=pwSICd*QW?84#Ak*tk*&e2KK5Ki)z3`Y8CdWNYjjR~_CekyCJ) zCtFu_xq)$*Hy44BrV|*+i=GOWxOa?;7DC at o`acmwA;H?&VR}J^WF5 zE1r4y;fy&yEI5`eHM3F`C+RYFVmb=1nI}EPy4gHtEAD45u62T>*2Efy-#M^6%iu!e z;#dz9_k2uc`O}Xz**@wQvg~usvCrWz!j`cU{~^N|E2~Gl8CY7?J!L(kRNTrlHf*Lh zb-bNjpkHXGOo8%({ww;zZ8OhduBB}wOXUF1SupNz!jV>02whL2k=%Jw2{!lUn0R%IZ(97brt)N%dPXYnUf&{6cn{TRv^edHiw&3B=>nv8E>6h%c z>GZ1`LBUuMIb-GDz;FoEv_+;6C}z2lJ0(%{SYyvBVqiLU&LGpotOjz;VaX>|ODe&N z at vKV={btn|zoI9+&K$G6@?)_HEB0G~2 at d%Pb$b7g1!r4QUx!1w%KZm=RZ|-n7x?fX zy0y*PwjiU9`pdWG;&wogWqNAMBNlc_!p%LeZz>)|tL*UjGUCt_yOy$bHgSeqOL^9F zSJTi%L^Js&JI2s#x<|yO-U%7>+n)L2FGlImNwcsVFR!yVH5XP7{hpaw^-^Qt_5$C> zkx5PXL?V9W!~I|JauI5?eesd!_NKEg{;`L;a`|)M%vQo}vX+}dNqdlkCO=S at IM}s6 zAWOgI6_9IO6;Lw-XA2C31A}or6ID)9FIG$KIgv4}if9;%EYk8|QLl~Be2{HCdBI|s zHB(Qbq42P|&sx-?<-%yCN+~{9eo2>zqQ&Luw;p;fCU<_Wc`Wj_*@&4Ls2DkCdiVu8 z{J<}Gp=EYYm5A-e*p(bn8h*`Icnlp$^ElKJQ<=6f7tw-!?6x^bKmV>Jv|rj)2gSZu zrtiSd?D<|pn^g+Wnwry||M2EYubMh-f$dNQ3h(zc%$usZz`8semz!>h%V3onM4ctW z at rlp};itpCgz2l|m)D%#1H-vy_ECxTAv_#8`S$TdRJ_)S3-Ge1pe*0q zApPzjIy6LA9FaszXPc4z()^Xzl~rQmsFp;#e#l`I6Opv!BRU7Xrn1Vd1(ZjWgvx!D zx%e&5-tv&?yv;XhW!Qn*YFzR9u}qo0|7bt$Fn*9 z`{h|P3pZOM=l_hd|HrtQ|HG^G9Tu3-`L8MIL1m0W>Ji4NX5D9-M8lveq%CPwiV(@3 ziOD>B<>im5os{+q?)t(1K$9VdLHUCS!a8NQgyjdK6Yl$5X1UBX`+a?l{A1VNrzvqG z);It?+QJwhP7Rh*VOSUgR-P>2^AIdA3?a3A0C=^t|m1^4Pn4^RV2V>5v5p9f!+F>bzoRZpC~rfls)7SpU{%tH`9~0E<2#137*V(kY at OV_^;Y~ zQC6+3hXDaO#sUFh`@h!SzbjAk;urc7j=y8yzdffMeVkDSK8uQwK)ptk)}=38f at _!Uz!M;-i z>_*;mXJaqQt8$1G3Gn^8~hYS1l4Si|Y=@(cr4>Mukje zNEU02RXezIjgpT+)H?pWa&sp|`+0#QU%`r9jz&)@##IXL zv|$*4JgLU^@)V!P0%0ZiAbE6)0X9}&>JpmA)Lwa)-EkDD`5YO0&;|DZ2Q2S{*Tk~j z0_tg5~*0Dnu at 5-v%Tzm52OX}U%6>(;Y*qb`HtGho0HD3_zYqOWJ66e}@ zi~E#2`BTDIhFBj8houSOMx^y)w0IC>rd)zt!G_f8$SSd}v;WCIhtsvnJ&WFl;|{Y^g`cW`x)3qCL3Com((#5<^7=0E-tC%v-aD$1W} zcT`%NMrXxS8uwnR)NQJ}jdL`Xvs6Z>6xJmoxN5{VSmkKFFmRNi^%qvdj$YYi%toTw zr&u>sgLeKr9vP$8xF)k_q=bqXfaS54aFf85++Kjq?j48iszBoANOG} zaxGt3z1j4J*b#WN(JcU%iup=EYz3lRlsFKE&S(N at xf6L*u zIcdF~c3E|yyz6+p2({9rKdm!hQwfEIG{h+^Ir)^8q=<^Ad}*Uz?i3VBh`}zI$gUUF zm`lHe#}z-Raq)tpGcXtf+`OK{**p|HgxFYX+xZ_%^^*Daa#2eQ-l!$Nt)v=*`gwFV zTlRVC4RMN#+i%-o9Gg>}R`~+dO7AvKa0*P{4~yc7FoL(>h;7SW%wIbmx(6n6!VlRY1l%1H zrZbQynzPzt1c{9;_ue^b3}?23I|=dXP#krPC7pEof9y5|i-N1z+H9{vy7E4le4-pW z>}Wt04I32!Te7G325&5h<)IF&QU4L+3vDt=#Q at srX92addkgzMlp zCr`E&)T%!IeSj(kKf`AC>D}%-Uz?C9`*I3Pl at NkP@6Lxg(FO7IxE547HP$Q*{2Ni5 z7mBqbZXYh%#)O>fV%q8LnSGyzNUB_zb#?e59WM9-=u0xp<~iJEgx#xoNN;sc_|>PT zco;zpzq!|pfuNC at vDh>5Mgsp-$nMlbne)_M|MMn797s0<2Nb@)M*veT#RTN+D>sN;_WQt#H-zdq7mK@&0Qwm z#q-Fs<0OVPqwYtWZtC4Z6J_H at Ap_J^SzQ8>85O_eNOXfq(L*=O!&T3lyUdC at v7*n= z8Q-XYKpZ-TUPRLih% zVaiM+iX;@{ize=CCcP=IsU*`ssh0BsE3VN4B^SJxpt-l)%OY)|!JKbuzY7^|JdO)} zZQhqt*^_d~j_5Q;ty7NS1kA?f$jA8wj&g9v`JbpC_8j(GPTNaAKF6bvt&wFaG5_jpEV4V*5)FY#RG zBb9I;3kr{1=={its|r@?t9VXx>0RnDcg*2p)VQ@|Ly8M8ecF;{lTN~^bPN?JwneG9 z5C4SPbKg%j;{iRN!ZKLud5h1b=n>N83A>H^*Ana}j(;S)wMBh)f5vx}( z#Y<{>gjg4~B5eKb%_Da5dBWx$wq7FyA}|CCIH{M=X>FusYvoeY;qbdKH1n7OJ;vSz zSU-}eeI|VPq;KECf}g3s58_;Zvsd_}`1ogQ at 8WkK@<}*>n%G+0VbXO?C1c$|GThzh zOAZZ8>b)ql-jyM1+8I%-O8xbTZz0T=4DsxD;v4Tx$$W39eKrHOzv}XG^8s&Em$($T ziLbX8_fZ(u55C9kDNoJ5kxw+=im!K?7`^Iq;h&eqzQ;%P=U_OK%!@_-qPE9jYak7k7 zs@*Zzy~NL^g-si~`Qh0wa=dfk^5eOTMhmd~;$G(KF?aIt+pYEV70*c1Xe89DxTMEw z+xP6n-`v7*JOCRR;x^x39~z(3WGwmUgcxXF`#A^>ftIJLMp9kI-zU!kue|?_VL0%37X#`M0gGPAor1|E;DeubN`7lOG z?{MB;t0HEG=3-_>?f|~ZL#g|xg9lE0(H8sIgQ>i2kF-vFktbrl>@l at _7f!z5JLq at x z7&CCst!A&h1%LHXcF^vE!)_v91H*_SUgN`vB45M9u*5#q24}=R^#&QmK2-*5)joBE zD?Pd`sZP^7iWo1fWLvQo&{7O&%+OsY(;{20ll7-xIA(IW1k-Vf=W`PFGCJ68+Q=8` z8BG;wln9k)+4ok-6Bv&>O;?aFm`8a{U5#x^KbmtT0X3OLX$)`F1*S6F7%tM{RdX~9cT zX0nYHUc&>3BdBikk5pSH at h`x#anaz0AS?FmF4Mn=r&YEsVHuUNcw8d3O6{n?u zVH;D*Z9Gb}i=t?A(k``{I){F6MDVEd)OKv1vcjcWiuUp6mz)*-&Sy2N)p|DPGxz9Q ziB10W06=jrs3GTerLac$YnQ)92YnUr8}pD}G?!0G_Vn*vn#`g!xAFpZ9QNvP0 zV*Dw-iFUtmJ&UwK&oZMfdPjgoXI(SZ=&P}Lk-n+;FL#kurZ_qsxVf7;!lbvSO6kO>{H=tvshSFDom| z7>=Vk-l4u8uq$rwuNBeLj<|B`x+MBt$HNVSA*Am at D?2Ss&m zXwwy0ZjlK5DjB##QW_N$SiMvZd?Bvf7e}}WsoD3y^^a``iuca`&cZjd=N_p#Wo+Q^ zs=#g#{Yu`>`-lAu`sERR4d$X>+HcY$FdkrF(BkS<&2Q-F`O%QljJ3}!|&a+Dm~A#e{uQ-Fv1xu8$Ux*7T-C-ZT*Uqo?w zt*UgDLsxPi at Z2<`AwU6d#qx6d2_8#|(r=j^yS)p?fWE_7R^s|Tty3#SC!ygFwzBt(JUME6D^2I`Yv`5W8-U{JH9*{KFA?09qxXcA;7L6zS z&LWzRbvCN5Nto^pm$mwcY%`dL74BAPG0;fzZn_uIb(c1+mR2d)O5%eTA7d|PHvC5` zgY)qRd&j3sU5W`>rapDWN;oGE{RanMIrjN%yo;NKA(rsS)212Z&dve9c*nJYBsV+jSKOaa8Be_Dd~k;mUamI< z1^I#yG@%hYs)us*OYd+ZdQU8~$z1GSCmDLBdppo{V7!q4_ywi!sYmE6BeG=2mDD+= z4!Rt|mI!U(P75#%`=GR<&Y`(B at 3(ttsH#oa48qFgi^w;amJtYHL6j(Q&Mwz at fen?M{GS`NnA$kxobp zutxn-0iiqSI#b=d)9+T3SjOc~>1MUu*y7w1cP at +{DuX;9K4dnILr at T={nh5a> zg0L0p-$)Gpg}Fn&-Txd@`go6XTE zR7T<mBNWjlD at 7>2;Nb6e zCbXr+**^8Ix1kbrLA??2YG>s;V&BzV%{vr6T<5udlw7#zTV#Z2xe(^a;xrb&ISw#I zV|BdxSqTJg4e{d;Qn8f5ly;8glkekqK0VD`J7UKYBeH-4VIokE9~mcj19#)dpdPo! z9DAN`VFA2N`W9Z%;Q^gKosOv_FV{I&*95g1%G?Wo9<@HXE;t?hmBo-8vMrs! z3p5MjV=wX7q9uAfPDUT*jC?Mp2Q(ri2v at mTYEMyMoLqI&CouZ7o1-efA9R{83{Gx_ z#eF~jWya&Is^LQn4gymDPtxZ5Zxgn#v5Tv-k%_Ckk)w!_i<#+vByTe2|Lhv7>#HsZ zq4Vpm1A&Vg!b(ag)axlS)W%;_1p(smm}=PDqFOd-Y=OQ^x0~UvdgVE%oAFLq zFQ)e$JAtSaWPEYAal&gV(Q5izRGBs1qTyg%AV6dB#`CufvnBYPQll-Fa#r}7_P28Nk!JO&;#;ewJsb5I zN4L<<@}S=IS^2GOQ!S}hNGGyCldz(m!#W4>;Su)tfZCq%D>JvH9~12n#pS~h)))J{ zOh9n~cn at 8YJ&XA*_|C?9q%GXzu-+t_O?tepY5CNA+H5N_n=*6yKW!ZfActtW^EM^t z-W>E8(iSNbrZ%N*I1^~fc4w3L+}#atB_s0D3ZA>z0{+OLVoefkg{!XuV?x9uM~yQ( z((C|vSfFg6zPsACrN!qf!id`B=GP z5~t7gYCVKvxrZqsxqW#^;KkX%ldEYs!uQCYjFz#~-IqC#q!xD#NY(! ze9r*y1VQcf)2lu}hZp0#B_Z)n!YJY|kcne~A4y-qEgn54jLpi<5X*Ct)%&q%ZNU?Z zhE@%aqI$<_=nzx^7H6`PV{0$aSHzRI&y17rL}~ZLa@@UL6bZdQ)>N=zrEVaLA`vd3 z2ROw9MKVq|hJLKA`ZWELp!-0%C*%<^ZprwFdCt0dI1Z3xWCrDk50)3?gBoy*4-Iv) z{n)HY*kLkmi@|Fmsm7|4OCXPiuYa3r#lA&=iVBT?_{hY*tJV+pO_9(Rv-~3?B{8Jf zaz`ahG(y&}=RUa`lJ>8ydbxvS*1LZ~PaOsXgy(-4djB4H8g~D7O4^^nYpu>!1{S@! z1(n%^6EqXJ+=4Bp3V{HjgI7dvojrA|(BRrQakQ~Z1 zdnP#mRTqZ!lHcc=d&cY9t3C72-?syt0I(jMVeI3h18|H3s+gZ(aQAolL9s>eCIE5_ z7(Lma(nFM5gu?i=umbAwgBCP3d2~~n>J9p;O3HOLKYtSwZ)SEKT{{6+8%Vo8;C0rV z+FDKVdS?89s>uWb!CW zQ!ZwWH#X7V$Xl<%_DP7NuW;N;%+p at zN{RXDaoqPoOtl?nkZUAcoaUN7CjmfN#z2N8 z-#wg?A2ciQxhpFhEp@&OMSp{iw2b48LYA$pHud<@A=gvj)<{)9lbzM)4{S$?wPK?w)`%Ik!NJZimhJpK6U$$=NdP}=JT-t zoY>}1m$E{gP0x6wb1d!y8Z`I=sx6V1z&5OB(z(1z1!S=}*9}M9w~J2&)_#n|p%K5B|DB;-V&sB_p(3ohm$tw0CVLr;WPvtmp=COZil=IiXLCM7;y-_=& zK4Hb$;c<5b6GWBG at PL0uGBG@R6;^j-uD2C>jTOOPf zd*?XQ*ZKYrd7>PrjynqEd`8?So-v0ww%~>GBz*J$jSSrRq0?UxeAwF*R?)UaGnV$p z#9H>x#6ag*l(%R#6uAXf1z at j!m#89roMe1oXHyPu(HwEDUdAA at XNX37>9POFtg0A} zKX;H7VXvAG(-H#(0%&|v8kllI04u>H_JGSEZ9 at A!C8~!rYb^7p4d;0H?oau5G2Nt` z>>ul+Z5k+vH#-ArH>n-PS(nG35=6)HD zI=Mf1#5vaSUL4c=0_!3$GQ=VVXwe-e+xITO0JTmlcFLYmA{}FblIZkSS at ysgdC})n z at bJ#~UyY;{A?n@{0tBSvA0tuzpBc%&K9F`bb2f5yaQ at GwcU4_=bp6m^Jt=!wfJ~-< zt=b?NRiI8arkGU`JGl at XJ*Mx|@i8(3!pr`YeCZc~e*^2+CDcV!HZz~j$VgeC>X&@X z1sN!+$VC`M;=`&%Zuhc)&yCCdVXfp2IQFm(Z_Hly4-!w#Feg1|;*b}Sv|jOMM``w( zP)B^LCB0>)a8E0|nnieCDFmAmCNB%H-Gv+9-<~wk+4VI6uaZmIUf(O45)@0mRg24-nL_Su2ASbzU+RmE}69Bf|pni#m%Jl(Xc(7J*f?Fbq ziWOBbDW43Rqn<>l3|5$8=VbzRVhqKMoQri^nuWjSYD%Z8kgCx*-)(LRm*i at Ozd$vK zS5thuM*^)NE%W1KP2jQLM{(1>xM&}D z>0!owK`}nx6B{FBGAIG_pc|Q^!GI)>z%V7Qz>*Uh5LktX#!W!!s3J*ZFz!Gkm5VKS{qh1r? z_&eZyIYzM?;oNO$HYIhtOPQ*Ca(cpA`4$t-k&ilk({C!qbd1MqD7nPsgbssq8&lXt zJEQfOZy*uYw!WQ=M&0Dl`M~`;q5p1V9 at g?>6Brtb=sTn at k;JG45rm{p%cCyu=o>L( z0;ieB^2_3zL^lO)F%$;T)xCn|U~Q&gd5lvl39sHjkXS4rT}Q6HM0< zgNpPv?n0nz{2AG2m$vBubnega4+|c8C&2{YqCi%Jgq2k|^?LTEi_0Y)vOD^wkJF!6 zt0I}bShJso{Wm^!;23380#(1m*o4L0e|QqjA^`5VUn-lEg4#mA#V`u>cO at Yvpv%21 z;W{!xSDeb=>Fb5meG%6xWf82iXL;Ffn3bi1s1LzzVR1m#%lNPETPD;qsT2m zYna?qn9;qjYbV)I3W|2c)C^>vt`FEg4*CTX7Wx>0^9wH4Hdh^t@}H`YcmueQGr7D; z_eejsem=3v^(xx_I+p$tLH)x*>`xlK^G10BGye*{@Y=X9P^2 zySKdK%bizf*K!MT&&Pp~SHx_ygA%}+NsOWShszByG{e~ZfBN8zk=7h%atEp_voxtA z&r|2?*e7YTC}E^gjL7pQL^n`w at M$H=>@NRttX?L?SdZc1Xn``;ZsHIMsx?;xoc6=woH>0x8hwh{X=a`?}d*18jdJA~4+}yvBR&?5p3^j^ojFl5wd! z1Ut%Sa>j2TiEETx=i-H-P{7Ecv65+~=5Ay8ExahL)P^QQd5c%$44(UC!b5+?S4FKW zJ=MTjMnm7S-DSjF%P)z?G|nv1Y~w at VOxCXdgtrB8uqIO@;`I4T4$_`CCW;FpH5Fjb zH)Bgr7L;gy>lOXchU8IehWx`MXp8{ggHFEkrcz z^GG!6 at R!7;WQMV4;tIs0XGbXfOUkwhs>7aL&6;Wo{v)~x?^EDP`?-brH;hCMF~jW_ z&Lk8i(-f%O19sxp*bnw&Ld`E*h8=JMj8}wkQS2`E93#2iP!q(&9%K%c0{v1%WFH@|>StBQ|GD6vl#kAr3jl_x_A6=#j+O z>pRI=LsX>J#xiYLU>|J^gauSxXmiPs1+-6vkuL|j{mveKP%9nFUR|^^!vsl zf2FlXY?|crKi=T}t1*m2Bn5B&!#&*yARw~;e;LDnUg%NT&_LIR!V8XuhG0Sbfe`%(m1xn&9Fm<&egqchyH>GhkuTLSONaOefY z1ki;j$4VN}9XO>uV-9!*DZbs}wDKPfoFKe{p%Q7l#_jo6f|-IEvOqY`LyD?;>#rvz z092I|S?7nDL at f=*tP`}EOo75L*P|lVT-kFjV^uX4>fF*3Sv7M-70$zQ3a5Z6d_wZ5 zcXjRL#sun4m}9duZ1`kig29N`}=b_VfN%MfG%f& zWd!#)6GkOuZ(`^*IdC_)$67qk^4^xXl>`rNK0+oXr70(Vk$g<)wb2CL`Kw7&OrhLa zVOcIBPB?3sZ7ofy*w=s}mscG+N at HJT_R5}I7f+o1jE1Tz@$})S9jCGa)e}>3q=Qx_ zZ_9=jQ at GoB9B6tDT(MZMPmC3+fDbvTpPCUCO3CLC7tn=w5g;VJRw_ujU; zVm(43nsol*+O?p21O1IjsX at _Ft59a#25|pnWKK zSPtIu0Cu&Qcx1BHaO%gmVzh2bU-N=_$Z#4+4ObMHO`Nmv)nY|O at fF{8F1f7&&JWZ` zIvfoK0a1~bBfMbCVpLLLr-Rxk7gErk6a`p*i%<$h2x7I&0caIq&LnK7U>st;0VgE( zcYQ(zgV at 7>G!ocV^gFNx63F&`1u|?E%7Wi}=gf`cv*#`V99(^kid2jHlp}+g+OBR} z*CzyE>5{9 at AM^7SSx;r8E`GkH$fU8+H(%GhT!C4_uUMp_`;I4nF?m)!0sJ;>h^Mjb zG(*SGmz08c{~7`HYMiNST?FjLbK)LbtSU##tZsHnB>uDbNhw{cwW1SG>hRA9v)imrK&oy5H-D^tT>X zw!+9iJy49TvW!`|2F#t(FRvhkLBjTFepa`|;STEgY!!DSHmnuw2TQe%$FoQnpLrK> zeB)UgrdnRK#ZPIg60)8=x%pD*s9mr|=CnLS%|RA;iHU=AG^)-Or_gB5X8KwJ+s2WLP9j+ERhiai`gTcdO~ z__{4w+$Le=cA?ZE!ML?d?AjWe*Ljs+Xn$FBM;U4#W)WBFj8y6`L27taV1<|37UgP8 zGzDKfD-*c at k7Q+SwEF#W^IJv$DR9tFT>X<>{f_h0cxNB>1F`$kXY;3El9eY2IJ+S(@*-gGqm4 at oVMAy zyEW{kP9et%4Xw(7T^3(*ow0!($X}3+-{1do!Aw+Y+2RZi1jLL01cd8+p$Kd~OxsjpQx(r;H+w0Vo|NzFz at w)Cl~_Z2i_ zDZR+9$gOj0SvAA17=naf=Tl_hl02k0ZTf0mp_;)2Z;Xe54K8>Er at O@5LZzekb90N_ zqLtlaxVopqVB%c<+|Bp0QEodyn%{nK-TfTtnZsHB)b=&m*T8H$Ph?pqC6)TwY)CG`!46;;BbYrSUDRg{8brKr_!Z+z9uX zMMO60{rco9`ec#vN_uWK2OJc-d!eg z<4vGoT)myn;|BX at rzON^(Vrq-%;lKT*!kxJYYR-V(V)*}qY-iLWStxgKeMRqMSDtr z7l2c_c3G)xxL ze2dYrUF~`if&GC{7+BG#+DA2u|u5+ zrm+$`O}!oBg-lxtvv at AI8g3JsIyq+ZR-{gfm4d!3Gkl0li9FI@?(;#njz1 z>(c1s@}*r_M_no^IQr*K*o8OFpR*TT7ZCiLl^gWt{bM<2&7vI(@nrDB4Ybwd>3WIP zi%ldNM_8iH(2rw-SJ(-jZR|k0kzrMy3nzEZN*XB-#+2a%wmsO(1`W%WVgKV1A)P)4 z0LA!k7X+Ic*_P?!c!6BtqfQoNY3b6+3S1KbTwCGtS$~FBL#2P5i>OJVs;gvgyNP+I z>2lmqRlY&WCQA7l^Js~(PN$QYEf52Xywma_h1 at O@t~?b%(o$i<*$W$!pD`5b0G07C z$wgL7_k0|I)BYTK4y_{GB#yU%t_O{OY&Oky=u4#*P*t5yqA_A& zu5cHL<~wX8y^dQ*s=)x`CWO)yw4DWuY8~SQ+{Z{ zQ{v}6vRCo`&1)#Ey!Crk#K~<}FAnMKfhB9v;#DqY7`h8VuQ^{e%&r#}2Rng(z z)4pbf2~&RF9Cwdn296JK&B!cJ at -i`s$-p?-%A#aSgly`D052zN#6@TW4Uc at uoA>-XQl|Rv>B1vU=Uqm-57%%NIYOx628!t4EmjT;dQ9tEg8NU#rl)^d1J+Oji2v-)fRNI at z= zhk`(rVO0rA%?dq8t!Rd~6%2v)jOwv9-HRLgr)Gh~l_9PP)nY)yXrT3G;I3WIs)~hE z2&s%444<-%vqlj}>J^W{%rpJwV5eFE8%Lx&LI#?X#)el5=|q&uPSiXYtBfD3%)=zI z^DGrpA<>>MD at PXsYX`y6%+u;KipPqw*ao%N at Q4H2of-grTCXR3hV^QonIo at LTN5wt2LF!O_Re(wQ zj8o>#3`b6?&)xu6er7(4fS{WFq%jV|Pn>BOjNdl+n|#Zyw+vrw;$T9#Sz7z=hoDq} zeoE#4-bj{xtG|Ap{1!?dOVji+{odEn1|xZ;OmnLDzrir=?ti8^ab zV^=pHG$3m1CN#gd!a9=~{o;eV0eR!_v4B$btj&eFKeQJNVRT|bO!dT;O=2V;S11az z?$G90$AuZs at BIelvay$FE1_;e!bt8biIe1Rgupvi173oMwg1onKA(C~F_ at zVs{TT* zMH}J_+eaByta%G6jDa?$7W~!`$5{t7szmimFyo#?GD}6&3nb8vU9c1o-!=Mv(h&(x zj5wr+?x?VNzgC+UJIx>tmn36ka<_F)jL-+ik=onH19XpV3pDvHo4}EjGZ)10FYbT3 ztb`k=$Ah?uRPV?4-Gy_mtmSXFwy-+aYbFB at E`L=9YttZ3dw4OjG zw{B*oc_k+L$&8^Rw42QAHGEXkiD5!J&n-#Y#%KIm@#~7(17^~)L+bH at F4`SGlJ at 0Z1iD>utci5}~ri$2`(W2Xk>5s=kf!gm#)yDH*Ucz6DGv$AY_HPC*7eH%4 zJF3Z at u@SZ~qQAI~w)wVK;44A>g9Xb^G2TQElT9YHCTi~a3{nMKlTF>~fmwkk*3{vl zFZ(9jdkby2j{V|1jtxB_-<{1=v4KqO>kmm0Hd<_ecE2oyt)u0^IxK-!dX%rSO}%I} z!$O-o=~&53&LgUN?Zyw~hCiowWwQIUg-SS_w&=d&FqwHL8Hxw2(_cJ9gBNd|MrZ;P zm_N{X#XwG&_X5y74aMdWY#Z=o2k2fRTr{^{z5b;K6C4ySc at G8xvJ3b>{_4!Z&HmqO zh3KR$#RVno;oR%OEg1r$2qJWGAtyYMH>NpLAu-g^1OPm#>|umGFAlkWr9RZ~-$CA+ zu00Vnm|?iW)^FwEmn;r_0@=rc($X8R>4)#_m#nLm8;2cGIumtqSO5k~gm%Uht!I at n zXe2B=Ko)hrv}DT+wWtBYYs#7Km#7GfVVSg)UAw#vPK_4g##PJ3Brnqihxjm!{XmmV ziN)OwQ`&uObxiP?%zzyp{fgb%WS-TA+o{<`)gGR%{mPvz*;H!#uZAJt_(&BCtDZA9 z&djNw=^|$ojedz`e9LF+MUxp*6jttoHHbv4h`g16&wOF^;Ml2YClJO)PW=Unnmga4 zK|Xeb4Og9EgRfvunGjJH=L^cN0 at _Ga^Jkb9>&A?w`m({)5{s7fnJ)PeC%=VOy-;7b z`iE*G31O2~n~g3?)A+lsiW_YO+5Tu>;uNy51d-|v{o1}3`fX8lSIhW`QEoXycLnf( zKlcpqr!KMiCYM=ny7nLJeom+eG!k!2MZ~|Wg3EtpB?OrvG-|~&&F|pQhzHZHl(BSx zwLCGjffn+ct=(xydUahLfts0w*A&3R!1BW=h>i8-{Vbp=1Bo5Sd# zML~1 at emc>|z`Y7!}SX2id%~p_+w!u%sQJ zTR-|@plKx2 at M+`^=)FA??Im$?5;L&!F$|SqzfN!WX^yO`wCL}bL=0g(3Lx!+5t2SK zu<-j-jXg0R&Itme!e?b;N1vq=(M=27{gjT#o%Kjxp0tjf`ors-$t!&C{}*ZR6f8`$ zWs5F+%eHOXwr$(CZQHhOe#^FP+s65KoYQ?{ciekBqEAFURAp5}J>(o?B4>{Lg*_SW z3+jmSDn7`19T0qe&lB$%efxqd9t+j- at lX5+UqYG8Q9t$^DmRL3KbMO?fdtD$$S^%G z1xcqOFb(zc6Zufevmp`9gs?$!7JFw86Dy#F`}!|k(*2mm2+*Ja0GhA>04)E%pi#20 z{b$tK&h|gI%Kc}FGDTHO4M`38CsdkI0v$Y%5Jj at 0{HRd0CM~tJIXvG2p(a8(UpMp! zJSYhxJHvmi>u)}t&s-U=^D^(-T&;@2ri$9<2Hx_rk7=lZxF{;`(Nu=h%lpgD?)%Hk z*XJ%C9U%5-5b;Z4_K=D+*<8%*n>`H#1e3&+q3pn^g!U*51e;bu9}O>gO}bdfrt*6q z at s{jAfRiZBe=vxEb9?Jc{8J`TE-?opE^Wk8x(UQdmX?e{Qb+M2__OeZShaQwC7!$l zqSJ6miUdy)wJ!Op9}VEGO*s6MBjTgoC-7FLR2-dlXpY>DOBpjx&0 zr5?dLu03(>#I`_RKg_~-oPy54!cdzf$}cuJx?ZdFfvnUUh&FdaSnY?RI%c2 zv##s3V|Fe)JZB at aT%$%WO3I+cfQG&;rQMS8Pi{f6C(PL-gR1tNsi0!V6 at k{ng#4Sa z%G;dak!7i)Dy>DrtI{f|u{Kg}L21Q(Hl>}ey>K3XY`<83Am|cu(~3DW7 zPY%b16<7RjJHist(B&f1gbhK#ik5Ap*QP>q3rT!J`02U3MrrIZ at maUzqE*viv8)(@ zAgNcuP-vpO3ZvDa5~Qb5=k%bfdyn?0-$N!Px?Nolk)k%;JGa0-kpmBh zt0CeuTw(H$Teo2(YLl^}y<;4uFmHL`b3-f`Bac6$UQZ zqLa?(c^4YZ+f8BgXOvi-(RvBQnVFQ%;2(m$Nl0zeZjHuhy}2pMArsUk8F>2SF>?4J zO-A&(xYDzGaw(U}trR-TDlt3wIjuesYl{?9&M3Hd^1MW5H-z z<(eWaKejl_>V5fzUDR*Es{&l}jz^8F966^=mwRuZ%!BLu;~upJW-fZZDJ0is-3-35 z z9fAR7#}Y8)ox>0$lGj7!Gl7uTH)Gj1PHIn1>qB23Ud$mQ(4oZ@;#^ie?kBX{{+$wh z4|XA2#OowKLKdOrb%dU0=q}Eam3av}9h_B*#@OvFAW6QL=hoT9I+K_|Wo6O`#%BRL}q=s%4StR_g$jS=pWSwkYH93nZP-SN{Vo}bRC!n%d~ ze*f-X^g>TB2LFl2*bx6a_wxUE6+1^~6XSmq+EA5pTNFk9G3HXW9wGu%lmt3XK;D#) z2SO&75E637kWL(dm;A_YG>}moq<=bNgv}lf(6My8HJBls+~u5xsBw&&NFon>B0DR>e8>9eNv8!e0o$h;GdllrBp~Kr${( zZjZ->A!GvU$2X at +5ugPF`u0m<@rJE7S(H3wm*rf<`s54iyaJIDG>{?FXvCb6ne57@ zb<2{zsVr|@e!CfR%8f$9%CAkV=yj?}5`FIOe2d9Vzg^L8F)Np;#hk!pxbmg-j`m5; zC?LK9;*J`MQbVj#f1e6xTNRJ|F%_-lBMiULBW!CX7LJSaYg)|CnsQE at y`ALCN(xVn zT&ilsZ(+{}Lt84-j51fd$8LWjD3xthDrs8&se at siD| zGDluT;0r6$);_izu^==i>}49Rthc3_D?!*+#gx{q$=-9-Sz{uDi1_if=UKb!kaF;s zgJ^h|RkCR6S!5^_7p^MsUPh2ENb%?t$rQ63wic*FC3IXJ87^xIp3OLQl~>VR23pxt zY$~dxT-tEUJT&wmkWv8R4TD3z0Tg~?$^wkV$`Ok+Q&Z7*$$mS6lES^ z7GBF(Gp;u2*Xa#pbU9bC*DGcg+>z|sq&b3{i+yFsyA at cXt{Nwxj(<{@@7U2u48Zjy z*u&k3vHKMe^rYe$NcX9C(&)oH5O&4g1MNt>!^)oCTF at H%CRAh?vM$SlA*3A(%@BJ> zl at R#A*|7{iYp43Tizez6)}+#4nh5p9?D;1yIGN1KztpD=xcMa0`$Ztq97G0Kv`kYtYY+1Q6-hu5{(8NoTX7cOnxnQl5B* zQB=Fx?9^xcl|(X*k&!yVhcFq+72)hOAp)1*14!f|sOmLN7Vu8tVL at NY3=)dS>;Sq-*^Gw<^xtW!*PvzYUalz?gY_tWxV#(hHpzk at e7Fad_B2$oF at x2yq){hVO8lvU6M zP7JrU;1Vso;WS*t4 at y3o1KFpx>F+ph_J9}jZ)o)>5tj^KLKUwNPCyz;oWqQf^b$sp zbQxwkBCk?m1jT&jxwd<0({EfvW!C5uw2rLy at lSv>%)J`?Cz!9u0ZM1yVV at Q8O?;sF zFF%X~oj+Ye4d}THdQxmCg(2r|ymVuo#0VHO6?@O)QWSG}5?k=AP~&1dKa=*F%D_JF zf|d0tAt7A at Q98F8W}=v-B<{Enn!ANfLhL-ID=0#pTYPMqdGv)#RJ_Qi)f!50t`$;a z)yzF}*c8e50(uWv&GG9Wjt88vS&lKbjj>x8!QGw2FAdBhvh^qn{+}CtRX;?@-oCtH z)yDI}D+s|I8zL`)Es^oI#a=dXW#|%|F9N%mH8f%BFo7)=nKX}ip>CPW_iH4kuaRC9 z=>33DD9R5rf(6Fcz{odtdjXNWBg`9jVvgIfLk!6zpBj#>$JkG7hqyx+$8JE6aiQE7 z*y1S4`OTVu?O`36viak|X?awZ!RuW_>>B&UHzn_r<~$>q?xXo#7iInYPriTm3c~zC z)Qf-s01$rw03`l9iAN(BM at JJ|XK at 23^Z)FX5VbI|HvT95a5iyt61TH9Hu;b4P^C%R ze{K6nDs at QAY;Bi^JXXNxp9BhmuM$p?zbH at 1ZXGCqVx1qt=una|jps4#*HfY9r+x$A zg>_r zWDZm!Z2c`>oJjSat7YMAC0Q~(7j9hGF|E{(Z#IASMN(nqoLyEi=bC0V`mL>z0kOGL z+SwAjv|!6LWn+uOpxk9D4Vx-hG3?8W5#ih?7Ku*B%%CQgUAg!XUA;q_8#ZQLaq z6XgU!dsX(_1&vYdX6RztfRVu+BO-^|vieK?a1{LakT$h`>h7r!wp`QN(dP53Cg_t^ z(|xZHHm%?jk9DwKJN*%5HNuacv%om?lu4Uqu*h%9P+dCso8)=g)cvN=yY-rau(4uE z!po{uEgHs>AgnXWpoX1w;2&z&Pxz5^ARE#q9U(IgevIP_%tW7TEi38B? zr!>G>^(Ad1?|j=rQSR=LEBEdDve0##2A}(_)tby? z+&S#ZR>3dGZx~EQxCjmr at 9RrpgsY3BnFKL2z1gemb%y6Pdoknt`}7}MX>yO}rz>4L zG)07ve(mpz4%L8hl91e4ps(9!4eGUv^iF}&W%8Mc*WG4$l_}ca99Y}?0TPP)YvlEg z5!#_5wGxw=%+e2|xl$q|0B-v(s==u`=+be>$Jmq85_)Gtcct5mv#DpOPV2n8(_hj) z3{N#_$-n6O=2_G`y)EOUC2y*)qFK7esH635OKKF!1uTAIG`erAk)AtB!L-Yg at kL!R z-U8>*;>KL=)ol^7>SgWSD$i};V>npLQMzkik$YK9XRC^unmkBbH|ev%pbpLkzF2`F z*XCyNB6!aMT(sdXWzj=0#ALz6>qbRK(|fwPK#<*#N)sSwviPXQ_A~~dq~T)-J1CF! z*Rh<(n%hs=@;04!xC!OFmwvnQdPy^xl+AdsTxxjYOPis at KgC_~`Sr5XvaWV&hh+`z9!$)a+DOGa8GLkTSNjj|zu764? zEIfse at Dol+;n+eG*hMFfq5n#!rqU(H5xK7UB(y>_#VWWwAYXB0<*?K(g2yJ{YYPai zFA(icFqXm>gCxg?SeCaQ+q)^s)e+ecp?edm3LYhXJSLoBq-Y3{6XjrUL7Y$6j4%GM zFX6N=2(sjmM%m1yv3js``Em*X#b$Ads+vR02p-Z@=pUxZVzymk*Xmc`X4#%Fvw5sO zonJfqVru3)P|`qkeulAB`iTBMB2PUK$a}PZ$H6xpIMF;X002J3{}2a^|Iu at 5^RJVG zd}(bOjolVgTa`l~kqJvFNNoUjKLo9?h!b1QEk)wfvaU_KrcB$KyjBzP3jO-(mJy15 z?bGkGet~(<{A2m}dEAf|MpQT0Nt3p`W^*62Pq!WuzrIf4_<+!Zas=sSF3$$DIA;!M zfb9-(fNu>2dD5BbLo9M!(U_+y2fZ*)V9?1e+slb!UYGY1V-b1fEz?+%S*YpHSbBAz zjQ7Ih3;uei`OQEjIBy9`MEXndrR$5UU~e8WLjDmFq}Vm0m&zpz^$R&=T!ua64W`^-w-^KBturzkmJlHD#MsD+hoJjH8{(DRHJyhX*`S=E>}hA zXRPZaKBxIabyIWSD|ZrFs~BVS-`C!}VLTji%SU58^q*gae!Hs at eb_{#e!b{c4To-%GfeI+a%#4 zwI!OR at 4o$$u~(j1k9<-I5x_+%d+2g8^D>!3(Dr*pAKiKxKtQ7$uLTc0TXmGDR7+Il zsdJi2GCAKU)zOB^qBqr3IKaLn*o6q!>Kx_2lw+FQ!zE-q zx8kmj2ZVgdl6g6xrPIkYOOkRj-V+renuVrSrd1jKwINt*&sO+xTQ7o>YbucVk_G}3 ztK?<0*mvb<*&<#kv6{|?*2uNlu{3fw0P#_9S)?}${8S2C7{Lvnr+a>`03-GZ`vHBR z;^`Re+GZ%T=Wct%tA68!J$Bp+>=hm>?{N0 z8$pZc%mmFVJUg=L_q}B71dZA79+K=Q!siu9 at Dh#r$rjzT%P{;Cj**MMO#sOeWnh>p z#^#6~5tO?=;^|N9Qp3dXn*sX!@!T`dBrgv;k@#{&0Igd0$;{}A+>A4F-iCN;KiGi*{!&^@Ri-M{F2KlI}r z1;L$VEQCrSXxJ=pFzsf)&$yWWwe$V~(*HBenvSk8XabCbt}>{OsD|P=-RH7pE{4qp zvxd$Fo+Uq6Lrj{~KArz5tHL-06#%`8K4l1hM=z(JqJ~kep{9J*2yc?N$y^ieAAIYi zw&BF0=cz)=^jvfZZ4;%-VQ)-x1pN{KC(BJ4Ew^x9t1>zpyhSk$_M at rrFqc3`?Cv_O z;c}JvXcVuR_vtO9{aln!P8>v-wEjt2yK+0GZw7~z0IYus>_^F^aw-I zD at 1bh*hmynz?HShb;;yqD=l2zQrU`or?%u8B#d4#C`wq)_DPBG5UE~LZm6MBQfms{ ziHGl~BA=@Og#xsSrozZRdfZ4( z;xIad{2}dp*d9TP&Ex>YfrO?{;*dt*CGRGUJ(58DKzdW4Z-|*1fw83~{Y~mQFNQ|x z$)<=?WE^L}UI`NlTl=+Jc=qiz2A!c=LQ*zy9TML~Nba$K1gIl8sB?1jD57EK%k!!H z9HDU1xc3N|QPL$~?V+Hwcw=q#iR>iuG*`4CaO(h_Il-`fDXVG0o+(=u2uNJv8BB8K z2Sg at uh&+uOFB@$<(b*1b3R5f8#EbvZD(li&TdNy^$1dcgG at US@kxjJT1k53)s7698 zD8enmWl3k-6ZB$=wmoa(e2?1c9%RcD2yL*03$p=|C`o3MkoBQ9w3>hq6+r_9YT<8_ zpYy$8O0sQ8(la;#V4!h?sev$5;tY!X%trjYI%kBJP)wpUM}}Pp^^I#IM=c6#ZBmuw z2tX5>Tzc4zD)u*Z?PQ2Q3JEw%wzzCb#}a*aV#^D?i|O?cKSOG_NbpKz^+(PbdC at eH z*07$I&Y(PY1HF{FvYch1Cs0|?=jrnA?!UtihSX%B>Yp5E9vT3E?|%Y65nE?RkN;d| z$x+i%+Ej)AiSI-sc+L(mAdKIu at 4YCKG4d_T#mi>ul}O-{0?VIDn at 5fpEi~uuL(7r+tRJ z6T&xeyhqa6GAsk at 0|-1H#F4T$X<>puaNg5tR=u4FeJH(fcgh2*(0reKl at T-alLwKe zY}yP{3AIIL>MYQIrWEzsd4)MrWl|C5vq6z#t^A@@RpFXsBWE6ZTGzCl%&nKFVR~;i z^OJHgrQ5VTYxyD95+#`@NA=^;RAIgiMe5MWZhm&0F?a=flXFMW29&}Ky)tDvMN))h zTyd0oM6ThCIVgrTE>8Bk))_jBqMC+AZq*=cA~)DTK-T&2GMA>tnA~-lP!O)m-<}*H z);y~!wFH|9dMsl5tKdOf;xbY}l5d@>c)OTjk|tHF3KSWQaz*iCmj<~!$_z4U`oJVZ z3aM7I+>l%>1vqJIQO?XMxvI6a>``-AV4=b+oK*@aHVH#@Hi9vYy`15#)~Ma8QKqy@ z07BDp-MiNDx7GeoDfFI||9xEf)p)#>WdWmW?WY3O0i5#lv#L|}on*D&SVv@@@q_W>S1pLvQle#5 z)@pcJsWfJpP?%G<23*B*(28b4lXetl))`Zq()Jn*)#1bQyyzAmHRhqaKmi;`j))R5 zh}lb+Dd0n#@flN)@foyN&-`ML#WJY)PXXGh1@%3H4;;)s=`#@wRa>85GWnlj0X2yM zlYpZ-cwb&Hw3;9&=6(?FcCIII^b(c{o4CtPFf7^LfZsoWp^s}qE^GUwSM_1j47Z-j zZdRvcQ%ewmf=FlKz?^559{JwP0d5k!3;10sN#n#$a0&TgkSS(&8D{jUUoZz+!4DLe zPu(K!WG<%dX`bM2 at Q5RGWYMb#;U0ekjg1kNVE!250;;9fBBU40Q=f3t{Q&dfK&y*? zhm1){m;DGE8$J9%93*wQrQdpmd($)YcYme at 4FysH_T7c3eY>A{tsJpWuI7&?fP at ei zL}VZcF)%=MAc%o50CgJZ9`wwxmho4c_lT?!J_Ok!l4a2Bha?m zs1=Rzju#)o9>VA4Plcbc{?mgG at iu3%ItI9vh9(-Ymt~jAnWcFh*qh(7sPyZ zNpx#p?lEoQ(^`0Kk6aE8)Y>WHYLB0JclxILWbSsxv4)Q&9V`&iR2?jk(p(+ZiD{LF zhiPclD7rQFX{2 at im@)X8MdTPOrsvCX?Vzn9f^+5DgDTo7io=4^r7!M>Le<&JM;nOX zFJnlxT5wA}XjU!2nm2Zg$+fY9sOPSzf7t|v^Z*6e@@$h(3K=zq~>jpizY1eM|ye6k7clxc7e z%M}kT)R`Nki32NLh?EvmVLe1=6Vf*Jj|Let^wbkiv_v+B7Ms+uF6Ahtk)CI at aG)s+ zlFgJb6;JeG)!75xug@?{4qmCKL&Gq2VZ|9CfhB56F7wc0 at 1{US%zXa@@{HSyF=?`v zIs)7(CrNw(sTDp0jdxT92j2!8f*3dgpKf|6P8KswG?u1!CG{kdC&91^A8ipDz)tCE z+}BY^ICgm{v7N?ep}4HJQWFCUefWs2MxZpMiXqt%R=$*Q9u0<4UfZ`0I0i8#_zKQ^ zkRCl_8>wUfV*VyaI|vqlHgh2LAR`Q at U^O$WAg99-pnUd~427-0C_{xl7#cqio*sza zDfhL{GLW#l^2fb}9))F`ZmqEm4@=y(-<9vXf#SVtDjbZeoFY!dgF at dypW8o_1SyX9 z=62u#`Y7j*#`4QU6%U1rAzha>AmCXy557;fwmK>#?5P8j^Q`B=W=8W;O59g%WJAS# zj at b?O(kRkN56w_u^#~e+)@g*NoJyyb at JkYOe-P)afH=$cN6A<*twt~VXBrFhrz8T3 zcPZtP9N-VZf0~_WBTh1 at Vvn-D0`L~ zse6Z+Ydj1;TZcRk0edKjA>T39O?uR?R4nK$q at zZw$QJ|Sq(j at EVsvz}>9&CG6OJ?Wv%DcmGheBQ%RZg at u@VQ57Dd4?~RFEmH zy5;u$CI1$#BEwczFIG{yIi?M4Q^M|DDtiXzD!c!c6gzu7cnFvLe###(NFl;jp%5=a ziKU3nuN-6PFZbqgtH2H$agN?mJ(ul-5`(@lMQ2jC<@$RuaXQEsCHfIP0FjckMRmso zkp7-O;o~j7kEPt3z*qV(`c7J!VU(L+j$qS|gK8$*PO!5~ML5 at LJ~1|?yNSif>yO-$ z73RWG2!(V^xjWSsK1sIc<4QA;)Zkd7jXHGPFyolwD`*Ezq-q+?ys_G>!9m8ciZiyyh*b4uRk>9LyIEPMMb*4xSdC^D1L}s at U+z zMCp^YBagoC at Hf2d_Rb8&m;c!J{*LHIa@~GvsOTZ+D}EqMg?GSyKM%6bOUiwl%UQF; z?fjJTTTy!lDNTUk-pUip#Pmi3LX5vPdT5E=wx!9(A}g72XUo=U>H#5O8&!(6Unj7Y z#7WF7?_+j7-*KMuv5w2wc?TfVO<>K0ZB7!Z$B<&Wdf=dhP}%;6}QJg>Q^*y^0kB_X*Q=`r&rk@)Ffu?AsQE2& zildWBsw32oY6DYK_ryv~q#OZ0A*D*P|8x$x62-u=MmK at jZ+c3Fov@TE)VU^upxSw; zXT3nP`%R?jx&?~9MI7oXR-r&druSc^WCI=^PiA&(N7ooeEAhwT0Cbb{wdicxX;D~u za)%zWY7pUzS%|=^mUECnJD8jtgc`fI&m}P=bRw9NY*Fk7#PL>jX3EaL@#f0=i0dei zSF15`Uzeov)v at N3AU$)!W6{6dsokkE#l0iFCyz?YmOLOe=S8nZ;?@E^O28r4FSc}6 zhd`2xqBgzox1}Sue~ipIR%|>j$@IcXpy<8?wCq%%Qa_2viUC z-+jVHFW`#{5Ld{%@a5FF-Y4A+EYKB~<)?Ym;ZZGg>S<&)K?vYE0v zOEIVM-o3FWin(XF_ISftAxDXRl$6{eu{dR89Y*omK}Wu#U(ex&?Vj|AIwpyi30ZY) zY+wwW^p!$K78SLageG1sYv;*abbaE at SkSd3c-IB&xujT^6ao^_v=54OH~?Wm7EV4Z zTLe-GSj4AT0!sEf{t9CykPTI`@vF(}7D?~%N9CB8XGTvB(O`=^Tfy`BzD(POH=n`5 zz&xqr6s8yK6_)W2m2!!37U2(7m3d^oD~9US3f;h~TowK|1CQIRE at bmI@`*<|237z3 zDy+K0zvSjRmETQVDL;cj;CA3F8At^#aijB$nqme}5j7`2uqc(ESE3v54{mZ`GM1Kg z;Fip*e>K>_j#S>jg at Lgmp${fs$o&N`1;U5K78Jw{6A5_*r!2HMt^J$@rFUt{@Nc36 zV6-0bDAfHdyai(fpA>Is#%KjR%wEV7vAw5cq#DQ(WW%GcdlRtT at HTLwVg!j}1jR#r zK1pdlb*7k7s~Eq;oknh(sJL5VWQOblacOI2lJbCadg)$TN?fRm&|Fx^lbYF*? zDct;#0RT)CZV!n^(OEFd$QGkICqnL)&eqmm++4kYciMIvn*vB;p6 z52&HP8u!aeJ+VKeOARx zNJF+oN7vFfIf|N`Q%-RdcJnvuYe#_7UmW(=N}8}K0aSd>s7osUZDjfk+ek at Ukbe0nyv7nN7 at EBXbm#TMDe=P;!bPO75lU4qS07eH>|Bk~(1(4ND<4DU;hQ zCAEsL5S5(Lxr(dvfE${pydqKY9aixjbhNcR0#TE)bBPC1_DYbax{iUVunQ%0W$a5G zB!d>V;}=+Cga-|x+;mR;n!2a+0Zy;b*+?3dz-FSsl`=}!MT**fK;}Eaw>=?FM>v(j zWm-afVH~~!m-Bb5i+1HXKR8@|Vyknv2~|6z5szZ>@4)8X{_NjKTUSD!2)S>JU1yio z;*U0<&8zrK+(gr8z;Cnv at VUAd!Z!=yG)yIrGjnSp8bxM zJ^0l47j#s;-r=?N@#%Eg}l0Amt{Yr6w9*w_A(Ar=B$GZiMpT zZomsX#eye0T5QKF&P5{A>>~ z&P=<)uMafNc)OCXk2a`BHLB!#vC4-2b%j$BA&!4ReE+%lCUT$TZ`uSq_=uAA`T{KS zec{^4-Tk_&+hNORsdWxJA?DxtQ(7b|%SY&(c(-X2-Dlxyt<}y_Nbe#D{_&Qwfw{-mg!s4^PeML`v|O zj=xRqzdSdAsIS2B>eachH&t4dvjc@?=F_p1xW%D3G_#AATHged{6DlE?_SBHyI?z>>fHdBz%)AZxTk)BA?vNT;}~9Ppo&)= zUTr)FmCcPh1urvlWlqn>#C}wq6ek3B3vOe}Q=#nF?8;Gx+md$bFjJ&vhC0t=y|SpzAHV^lA15BDJVZ$9{3}T=$aYv%w|3_ z^rp2D(*TRohsmuIwA=D_Es&WVLVF~Y%dIIf;umvr#s<362Umoe at nQDw1*%HkQsDA#m%R%0tj(IMrL8T57XX^WmN2wB zHdbghH8rjcE48lQyqmw>Y#ych`$)d9Xk+#U0BHM$7_|2Xj2xaF(0R!{RA24LYM}NgwW*h@ zZw at rINtdf&?G8cEY>+pk{WdB4N{rS?U7Ju2OuRI6G=jHGx>w-(u)I`YykzNGA*VKt zU)}(1hp>1z(0jC7G}$*0dr;`{k9x_#uaHS}5Kks_y$8cSkRUClQ_{;6+44Ksv0_zR zhxaq#3NrMVaSoBf(e{-e&ON8jJ)7dp!-}GWrDE;17M7LfYW8eHT+kuo)237Esj;;z zh&CS^;0#JxhXyz2-@pHa`oXeN|cGHs&$D9c{Rm5<7?m=QYCJPY}+X9i3y5&|p~$YRgE z)Yqy`Oe~Z*6(^;+1S)BA(V#6hQdS!qRu|;+17FVQu8X^tt|L#%oB|z|k55fPBQI?$ z7R9M#))W#p4jzx5J!*BaXALtK$5yLJ;xbCGpjOYt3O(dFP-Ro@)uo14Bp`BixDr|c zNk&a;8`caf7|g0`cL!BNEpdGmOUGpz>tmls2SxozS*e)Lt#qc=*5PF&%sdpEMWdU6 z^IQmtIF8yaxshVi_AWgv97`8S5I#xfCL^5Dyfc?m!ihtXIY==BRDK0wJ7|l+NTIom zsTf#I$jg=?gM&g2%p2liY}n>z>+D3X(Htldot?v(H?+8_=?CI0$dHguu$VN&0|3hE z%(SntQebETA=4gRO|IItj(^Iz{^-E+OBVPD=CDTFFZX{ba>a#JHI at O#_!tz4%}LPR zq^$;LfzkXK6jxTKeF+VNoD8~csy|AgM8ewPuu7-HJvVQgOef1&K$3QE2?jJ9;zYjT zh?jxwzyHOnGt1fIo-n;$m{VujblQ8UF*MR^M%0%Ux_+p=8m(2j1r*ht=aE-%MC at l^MT=mukZ~=WBC%d=R?i#BYgN) z4o$mjMB`h$bLuYKM|0O0ta>X!`>U8PZx(f~yLiXxTeHvhRuj6r4+BHG;&tx at V|RcO za!vzkK{Bmt)S465NnC~IH+P5nQ@$@(xc)DZdcTw`zr{P&pW1!A!X>_Yx{whF3m;@z z?&AE3&8i~2fg&ef=op{oNb~^;mnk<_p>?%37PbCL^xH$)YgHzk1R6>j4_3P(h!bkf zfMA4JGEPnC9Fa=jZtOK8*_#M5CBa$(!?OnFO*^%Yy)yZX`BvTzZau6R3#QTx2{PwU z1yVUy!5eYzEgC|S=oAPh6Lvz60arIS?Oq*#zZrz0)lADK4SQ?>QI-rA6IqU$Zo0Y~ z3G5XbIA_fd*-zbDde$yV!`3yJY{fFIBdsGQV4ikiIfNk{V0^>*^r5Ot*Js!bJg7%$WaCm;9Zzi3cDA1F`_aekeLhIV at t5IZV3?mS^q~1H$ZH%2- z at Nt@ox`YvJjor~OdPYmjzzW3}EX#v6_qZqYHfOB8L?6fcx4JYvn$ zt`prFY;+)~>c4cZjFP5Rty6IN8mWkJjc`hrADeW8yQ1ygsI)-d%f#O=wz`{RIx{qp z<&5*1463!*NR&jCy^BW=Y)qGE_oN(GbGK4fhTr7Dd;W6k<#hSkS!mB|@8Z9sf-|Lr z{;|pOx5v27SmvO*H-}`8{rgD3NBh%oJxrX21Z8`qgPFzQ`Eq#1Hn8=}izizTj zV7lO&k2yeQ5cUC=f8yLxfr$MBZ-EA-useMaTv&IizHX->Te2&GxxKW4 zgu_t4ZE~E0e)$lP6HrgFo^1VDO4ZT(4&W!BUeg_50PwPFdQ)32}9O!;cfyUcTH zi(S|ima2JcqApgXJ!xqXj+h~d=^=IUzOM29u2FOCfOp))#n2dr69k`WrB zdK}H!$Z`0d?T|g*!P+#lM>N+g(fDmWvaUepE~U>z%rvDxO(pu~lCrg0NxRzgkVqvE zS{0H*L}kB8CG6!gqIN~R7u%kxWw*?>;2Y~! z;f>(m&b%kab{U?a&E=?ep`Ku_<*Ih69$6h?l3QU27wTaP^{GFexr&g=!WnIfZKmc+ z2MCt!=ppP%)1!=}WoTwql<$!xDJvE0>_O~&h?ba|<}CoS3KSbfIZv1rhmzHTfZi7@ z)hD%CiqH;5jj$;|f at Vl%)MwaT$nczLE3H!frjmw}9U}=&F+`{DvDuu*%_Uk==hhhm z$>XWTg9*e};*BE-#XAYYvyzUqJeP%X8hYX9Q>eMLv0u_HP;fPu1=#s~g1J29n(BLc zXIX8O$nK11sglmoG0z~taxnFw$d0h6H%Xq%QVV^9;kjfa#_+={o at lWquuLPsCA_~c zICtx9Jf8&`7D)on6Z-mQ;$Cq!Hh9N0{n(<^MR+JH+Twm99AX$T3S>K4^f8CBwYd2` zuJ=o}J6l2cNOq_+p3t}^^M27L9}XL*5TZj$#gEK39O8UDLQ*_ZmU2aDmo(aXQ!PWw z9MR#LiWjA7z=k+wXL at W$7J?dbNQrCq8u3F>S$E6p| zEU;moVL`da__?@+oBMMpd2uh6*AyiU0yC{0Wb-vQ-MQ0vq)$ z*?i^Nk#mQl42b7HxZcH8uQwPBg at JkrKLlixuplTNYrO5*ecg8I9bf(Vos3cgh~0Mt zrO3wQM=V46$`HUdL(W!`SGCvWX9v0*#Vhx#AQ580D%nW3nJz~PrG_e|?5yBY36Oce z)kMAkiXgb`MONpj&3ee>;vu-sEJIRfv$d#HP_xlVVV_aU7TI^w?-BcGe0DPO(d|c6n0eVFW8tV)huyMxuxJ-v3M)c54Bv z^rD^hTl at rSi!lBq)L^l}45c2uicngQ)ILExic5O7wi2#{$CPt{Rb}w887Tm|$VaeQ zq|98^$#tml++2r6dtG(KZ)0;THK|10Z7`*l`V~#24#C+|Y&I#5o9<65-8Bh}N&K7T zUyI!)VkMHPvoXgMQ`_?|Fz-pB6+MOx at 0s(OvlJ_<68B#Fw9}#JO0FvwzczkS&ue#c zViuvws{yI^pN|2qqlMCJ2oBGh_dwdqmdq$q)9Sx{CsM-zzqQ&NZFkI-eqyRR!G at YmUz}CPxZr8Xd5 at sG_FsX_IUX+uF5iV1v#9iv`9+LVVC9Vqf8$d6FVsneDs_ixF0yjZPZ>j zdT&Gl0S9C_+`Ywa^l*VqVX5B5VPAeDPIjW%Gr8JU%T*`OR1OEu9Pb5+h1%*kZ~92q zc`(L$Ayw*YTkt04o>`K(v8+C7h?t6;*dDl%a2g98HQN{w7Pw~6Q at pMzcfL#G7~J$Gp-)Mjn}df4aIS~E^qOy-vEKH(^;`8e_sc` zQObG9xVrEv#A{^IhKn(dikKYzj0)k|-5ishl_TzIEKL476Dl#OI2);!aByq<2HUY3 zFQOQcpHy;<^_B|ND3>q)J at 9&v?j-Q4N$PeRt}P?Rvg={hp-R7Xm8deKxGFZmwW^kY za<4|$S|oX~b4lNGo8Dv_!ONLJXkBTyP=!dr`%suu!K(GBoW=Xa)nh?Wz5}vV(JxZ& zuTpPmkhL&-?1ak3ot_^#1)8>a$bS1c8=N6EE2#a=Lk8K&3CFs<=MzTwayUF~o=<-S z`ZZT4cLI~t69A-hY>~dBxZ63xtW#lQ1*-duwQdMc0+7G6&hcr%=Za3IeL0O)a=qoFd9s at fIRj}7Tkzt_ znU7lS?T8yWp%l`)VhD>{RkmQGB-WZLi5y8xPKqm`;RX4y_gW3(?X zu_oG at UpKT&oHuk3H7ShC4Log0o{)kh1Te#;oyb|N{+xihOP+}pCrx0Ai-LZA0BFR&CL7o*bG6WYRY=#Z>C&gMJ-BnnV#c`p$(NKk3{RXipP15c+jDJfEzpiX zYem!u2=fXyaEL>7r)8!sdBva{uFqwGIzRWt{xnF+YURuV=~UR9aqI-4&0|fN!^X6G zEGedR-mkG4nSFapoRBtSQOvdBNScYar!A=P_B(D$wDOFG2Pvosoa|b#_2eitK2pBR zCXTVOrDZc at d|ya>f?YfiS364gb5t&Y$+J}b1;!SlF{vdQpU#NG$?KdJT-p$%F-jpX zQT&xSMg2}c?$DB&%^YOdt-ZsaI{7=i&>7k;lplSZBt1eg69|7GuB`Ea^gx#*8~tsa zskdl~<#qV!wU&x1)Va>4B$Fid)Zt!VI0bukIi&`aUhDDAhV+IG??-YMW`ULWsNG73 z`t+LiuOAS=(t8m5m-ONzH4S^%Nh&9VCkLJj5#S1O-5liqhgEQ1eng;v&k_ljBDuD(xT5bFeVJNjGE+ndB+5#)M zFOQ>kTm(#!l$PT(^0^zgC|!E4D7e4}5<4Sov_(BrGj4kYW-_vksGM_kA_2X?nYM(7 z!Xg?#?vNRpvy^&f`_{|oN*M#J7Lnb{jXw18MgWPsmOS*L6md_e at db(<3cX at E9gzU? z2HFPVhSCOXHbzJwb6A3a4|dPdi?F6ln9J))QO^qRD(?CBIva;#jpd at _;U$oUVxELb zoQoeHqH0{Y>lokO9FGmd+jp at lmr}C}VGjp=AM=F;c7cYT&hOZxyyE<9T-Q<%i at U9W zh7hc*BThvZ=CJ#odb`uHU>_9q+$pG7)teKL^(t6kP6!}b`Gy{ zMbW&(OLsSze-c;?@n;DVSW}3ke>TiZvSPW!{`UiLfb|E%jt4v at GW}Q~0JNCOkH4(GQD}i zuI|nYRyG0SL3l8^m{0Q~>u&os9q+T}0-mI9fz25vc*T}G)zg`@K#$tE;QJc~et&}> zq->#h22kyTl;`M-EMW;|yDvWgz54dpVuM(?`#dAh4XHK#+rrCRJzs#Q`Zxp7%uor` zeN5_5<4C?XiWaycX#Jytee`G^{Wv!55#^@v$nwhe$oTf7vrszRH#(UHuv|F3mL-~5 ztZPvW6ZT*Qss`8O);D&S1|*x-h)6$sj!|4(+WQd|c-61ELZTY>2`wg^FNovM$ha@{ zQOod}rH9Mqqu{}rU76pIpdZd@$_H5jsA{Dq7(%%M+*VoMq0pC*#ANp)PaT|AWu10u zhNRQ90mEQXm3!*U=5%6suB*|MAC3pjEqgrL_#5n;+06m3c&0_QWu?FUVLY{Hx+lv| zsl?U^TzT589hOj+^$gZ!xskb*@n8c+67xgMtx$lqGDhl5oMHy)RypaZPkRF_s}B{- zrUqI;i{M%;N6i4a*!6xh?LInNQbsp?>jSPnZ_LNVjgpq?{mj8=- at nbJau$2>wg>z2 z<>=2R+5cGc{=5hn>DxK|>z?@k-cn|RTBpCMF~)6eEhK`C@=Zlk7s_BAjRZ;D+6--* zK0``v<=lj=J?S)(`DOBjiR%NZdkG5?H?5W+>&Ewq9d~+@<||3ZNNn0cw&#`OH0Lzu zQTE1P6ZH|l(Dy0NhOJX^*@+2=ia@!dOP8niX;Nu0RDP?_6BVI0(S%M+nA1YLb(j#d zmy5Qo2;J*aR+g{H-SP7$64I36fMAd4E5mBK|K^$EH_4DWxuQCGn5=nFOs;|C1t8iF zHf}+Mo4?7l0V*1=(`68e7z{RIbACtt?*-XT3BO|6jj z+R>S+8EjS1K%4r}r!~xF*E|1?N(f;=#OS{aS1>#tSxG8C!d6X-+@!lHr^bb#wN&pL zP3=%c1xx1~7#?!ZFZYZlrg2SQRuy0Wj=E?bY(}a#$Y6(i33qgFEwb)~^%4UIE%d0f z6;r;xag~Fea}%_BC&TnS{Mkq at yZSN~0Cr>t>V0 ze?Xa_d8q7Tp2Sid@<7knaJ*3wN3Y$^hN+7Cs)WV3X4-&>TZoi;(Cgx)m~bZeSO}SL z)>aDfClZB;)%{LS^Pr#y6&L{qXPe-^a9hYEQXA=wxuA87=c1iD2G_c|90Lf)H4+IU zGMHR@)fGKW-nnK+nYRabh z25|rIKST24&el&3B%b!o*GF1rv7*!VV7wQ7)x0e~~V_Pi|c z&iDF$Qs_ouxr$x^X7AN6 at Ytfbwp1_bBMJx0TG;#7b+Ub?#hN)G at h9~?TtbNfVEII5 zP9i3R?nUQ2yNB6%(a`|b-K-Ksoj~jxu7v+D2N4O95cXalLdL-Hy9$&q=TgEez!t$< zH9XP%+mCVK-Y+`e8Wr;+q>ed8H-9I_V8h4PtHzoyIj5M0YCcYuVgD+QS+p|dEeX&V%p>)nkQgM1VTv!YR zlYRE15cw|jF3bDUQ*jy7TrElu*LJ3>p$HuJtVz%>3cBMYrr9oO2)2Q)A~%PlBifZg zw0f3l5;*hvw=HQ$cN(Q=;9tG~kiL9T{U2yAJDBTRnS1=B0w?ca>*oGnL2eQVtE4G{ z_JIN7Cq>~cuJJ7yqwKepMmTy#=+GBZBz%w{jhvKm6uOO#h)2Jk>lj?Til#-bd4io7 z2cGs;_gDyQrU^BZk!)U1{OxSVhmB3&5ASD~9&ID^2EAe|7!&kD#u6mfYQ3)!{x5>P zD9MAT;i-Hu2DG8{Sajy9F3XP2%*=;r=@pt}{gW(=1z6)_03J!BC8mP2^8Nz%IDpV? zT{ff2ay at 7NPR7B0KXrX=Z_?rlhq;bZOJ&6nRWqK3M`F639y45}#JH2zq7zW1e;RazTG&Vb{PSV7LG?fZ?@Kzn|@Z9=o zHg=I0Hi at N0woJ>0S>5;ey|541)eBu?D3VHeNo!3F_UDci?W2eAHXEcPhqXBhPpZS% zUwq6vHYW%|Kqg)3ai-yyJSsT4wWW`*{d1H!R1_F_vK3Rwp%;{FW$79&PXe_RLl%=b zi`&_y?fGS}MlB at 7aGi?>QDd5GoW-kCkFL%c6PtXI;^xXz?Q(A8J0_q4?!u_ z&E7j=FT=VYRaAS(+<^R8id$tZ2rOF(6j!LhuxU4W at F@Uk}ig>Yxsaz~F{7gBDD zchLS6*Jr;papO1GfFllrGBc{S+BR9YqH{;^$Vf5k`73 at o5ratS`LVSX54xdJg-#TF zIZ3H$*fAC#L%w_C8-=Vo0=1B*8#coz1tEnqhcT^n1B_nQ)s!2;U)SGxT_m$d?2{y^u!`4A$p)Q`- z0+BQVp6CLv1Tvi?!SjM at 2+43W1dIe%{P6|RTm at GkwDDX37}M>{-~uvkFC9dEcHK=0 z(+my|h9h>Qx?yEOg4)a*6u-2#e*U6$9s4~Il at Hba!q(LE`7TQu?RGSJ5l|(A?!Eo219!^K1jtyH9 z at C1iQts=TQS=aXZ=l3KOTb^aw2o*GDY6b5yC*fRv at 5uSVrG@qm?gW}x&*p at 3gfdA# z{)`T0W+jF>i;R?E6l7$iXJ^(zjAR1^xt_6}6rCJB16$)4y<}SIDS3A9mf}M{1NDHq zwmN-m(7nTTgD^^PQh>vLm_hE3-$4$Cx+tZbRcN#8ohP*bDGW}sDAs~avM8r4uLued zt}hG at RU~1JTz9ZVo<;GtHHfLavjQ8MJ$@y)dEf5q^sn~ps at 9Lhu<}x?nf-Ouh46Ut zNgR2Y??21}voW^gxPUk#m&*eocVhjBlfHVz1hJdxLih=gE2!^FIH9A+_K_ at Z z^TbVWvajSN`hhm)3zC!2O;junT`Z~*Ml7)aMrN*(D>*}PfDI)vUk&~kMVAHVlsB5_}AJcoBnG! z;!)|$v~Mfkx}QNGh!>odcMFalZ>_${a^37$f*|^kQ|+!>-jADCo{yE!kKNs$U+wU_ z1MLB*`qFzgNJ at mbeVyO7pbPLHRmR)(HSj5Jvgaj2(ASuvu0aV>8BYsHP%od$)puGK-Q)2i<5_P`n{8W zu4{DpijKF>ArMj9wJb0c8N)hg at g+8~IAaOR<~FWSn2t>p_l%3whj29Hj(5CJv_dr` z#*H5oo-oCCSz*(qw*AKB$S!7#tNkghO7 at giKQYkoYh<8KO7R^zAxK0z zlQ at szl>@y`dCOGe7+ZG`n3Zq7vZow1z!ur!)5Hz5WfHB*FwPkJ&>5sL#G4d9^_!UQ7pMolxKr@|6DufoDu_50#uCZ`%DW zJ!Z=4T!kB|BGS@!W5=HToF3!|qOo0BVM#2fQfuA7T>d3#`Xx}M#+lQq6yC+ at os*-2 zq2Rc8|JykQF5IklLKMoNgcA(h#b_qARX7eHYEK4j0qBbskctUdr|mhdpb950GZ7mGQ8Xd}&1~gP)*0%LzHV2$c>s!TuTL z&Cm4EL1t&nCFXlKc|Y4!1$q-oc^HFG3 at pUtAZO)6_VsbHdl`8OW=Z~$Kx-_!)#_(# z&*OqVUwImal27TxR`uDO{aY~9l@>8 at 1f6~(c}{T#bKXJ6!6n@~tscN{%~8d&Nc}*L zJxm>yIY3)j;HXkvhy-lne55wt==ZTyY)8+Di&Jh?X*@}tS9#nVYXZW0NyTh#Ws!ah z%>k#g%4z8do8;aF_;TX?0_}#NJ&g|RsnEGVi{4=|`046?&jGT)%h7*T|K?C?S*E$a zDTQ>C-7S9$(&(Fi>56R`muvMKm+q!Si#|Yih;u0#o%?2Z2mH!agj%Ox#J`jtTvy09 zRx#>o at ys)eBo8}h&3KGj{6!d_p(`BAJ^JPK<{_FC%!gV5$}KO!cqR_T3Cz3YSEHC+ zmafQgsV$`-=GX1q1H3EHtvuB`!J7wCFx^}q)(v>XDvn at zXu5%Be}B!d&?-ORIJUN}#VfJioFwuvSb8=T-9j2l6-2SB1} zOJ$<|p>u)`<-KN%$AGDG1XI*{1BEK*ko?3nzt{m^ny@;ydb(P=x`vvD`a|uxDJK%p zDaFoCC48V7f6)MY>Q$LuMNPcoFxbQJdB&Xo%+HPcwubAF*O(G9F&KYGOQo1+2eD;| zU<t+cF^qxX8Y!3&)I0e(8z3*i+& zaATeO_tB*2jobv2AYZ;bLVfwd_kRrjf1S2U8z{tROYVUd0|VSH`j zp)nRje5<$5fOCeF(zIt4sf?jveh-q4vkO at NeJ1JPx%D z;mUeF6`Y>9l{n>wN(PY1pXNksl=7^2KecH_f|ffz&^jW%#P%kD_CuisXAZUMfUQz2 z%s;lcnLV8e;GtDZZKjO^ZUYPoHigsBNi`EqebaL!Qbw#)G#si~Fp-4Y6s$EIaY at Geibv^DPEbW6X}!2X zG7NbX^}CLDFYQ9cuwBmx+M|=8g9Qt~;7$b&Yf5Suoi#p(!rc!f4x!@^18bItq&C82Y)bLJDmffGExHi3i|Q4hfrw1ggK zf_(^^gp}}4;aUCoT3aaZR8EoQFy8_2o(4n)b;okh0fta+J~KF1``JbCjshxulaJz@;bBPVE{sjjXu1Lf#Q<1NHVyoL&b8D-7nylBIqeSzrZ zA=xbG<(jkFVS8l7Gg722B6ajABK)IY;|b%L2bcwapPW%7zrE%A{_XaDK&evf;~!8` zp#LLK{(It>+`K%R&n3Vz&GA at XSVUL=w;DXL**TihpAar8n&!r^SzEH!GVe at W{7oS> zRqvmmICA6SXfD{WnNOdz9`QVK9%XN>U-9$%f-{7e>Wil)GHeC_5*a{J;S=0-`iP-p zummOgnKsabe0l1t at yx@^)Z5~n@%rZ$CvR|t>?Y|Pg0~{|Z&H#Jv$?r7wn(IC3^7 at l zOE`nw_?aO#c?%}K1dkLO+nY`e;R5aR z^?fFhqEW>#0hi#-CUNm0l-#vxAuBVT=r}4mbor}uoYC* zpVgmb2#~zKISs&Ahc%9!UJPnlizZx^=zd19r6~w3fuq;JW8w33l|?6?Z>atj+*JU< zR!yyCr77g>beyVyJzQ3Vup at Qf!Kx&kt(v zJWE>;5`E5KehZ~ai<%Jd2Pe>zuUh%0P251pE!`A^M!g-s$NP}CX-YbS=9l at 45j}|(Q z=1v2K+>+Cf0B%DTp{_peC+JOb%sPohV^p4fg+VuQGkZB4@@xZT<%*O`FmplycG`LV zMYNYvgk^CZ#L;7N_W+|G2XKqRM6K6aL*XeoZ+}}=lDCm0@%*17#r%Ij>QF>S>nQab zpl{}QB$A;0f(b?&R$EMPFQ#t*tRPHR=1szfA$z at dWhLLGUcys$n)j%6n)C5)>*MME z5a$QhPcTA#tv(}6B6d=lT*$iNNZDrih!CPh)a@=!hLd>v|Yqiexxi*m| zfVT?OY-Xntr-W`Q%=(S3r8)?8B1-BKEUd|;!Pm6etMgM*2!=p5>4f!)U{xynx&cMb zic&P13O&1^g?!_92Dog;MA{2Isr93W;1j#`1vn1^GMEh-j`n^>DxsBM+?iXBJOx8H6~mSwSlB{tzC;>gRc~-ajBR~@%v9(OIe-0vo;I9IWG|F zdH)fiGG+Zg0o_0nE=#M%P`n}Kj|f3~IgVEL$0+ZPSR$3LG+Kywp$bOax1FS_YO{Quj8^o;bO_#?) zz7do8A;oWnUq at TMrZk6%7cd5LWQR$hpd<^48wBc?Ext$U=QYYhJPT&omR$h$F77gp zu3wlW-KMVVRt5HJT}_qknPfa*430U=4R4Dl2Af#rg+ijSihMFPP8nWIV}?|1Y{k&a z;NRa-^O;qaZX1f*gwFEaX!IPgzrHXd0Uvq&wnv z`iuM%;@_bPl0pc|0{!wO{m&QUT=|%poD?AKO?1i zfYw+_9s&gUi2dm=iPS*_s`1KL=8J9%y<(@ahJ at ycJMu%q`S$pmoxPKVCYE|vpyzZe zL7Qt)H~-rW<`1|oAad^u5%~e^s0$7jFVdeF zs6nEO4dca@&_cA9 at rFySEA2*MM3WlPhqTO*uJ$DSN at NX>bNSM6SgMnZoyAhpyNN5I zt#7djhg9?tW=7``3d}z!A>u*9bTd8Ajda&faUfMau?1 at J=zc68e`Q zy@=Ops0GI*ZqPjCu4x;3?P6M2_ofZgiPgC#9jdeOfWa-3JpG#7b!lZS$hR4*HJ!_n zVv#|-j`j62o440r$a1?H^pn#^fMcbHJV<&~>yqu%KSbaTrMs>ZB zJ89t%?Iw$6kFy)_We3^%?2G1Jkz$pCS*HrGd6Y`;%7~XthT>heOS328% z?%Y;{W((Io84hN0eruQkQH1 at GSBu?q}hWa2(#bmflei4KT^#gNn9 z at n)Mtp}v=bUUN=1eutlLIlNMen|Is%#DkfaiJsWX;t6{D#lOR(*ylRr=ChY8z& z`jcSh1@`x`*E<6O({1UYd0eEpHS^E*wAJrL#-bC+BilU<(KLhu=aw|6Y5un2{NIlF z5Y%`B6eZw-HDy=HfE!c at D4a5(5E0Af*6he(Be zusrq)D{?SWsa+UN;rPngGzJmTfDzT2({WZWX@@ASFg at 6P9GJ_v4!JYV_>)q9_js&$ z-Iq&Br}@Twc|K4q#Dl*L6X%>$TrdBlr6PZPoZ$aw?Ef)gPgLK~$=1RBzrEaFJHgOC zwb_;!VJKkye-MPW-KZ3Qi=$Ht(8GYhZlbxlVXD&3YbVt%Ip5?L&k<+2S$(2U1IS(d zssq<)b5Ho?b(g6-4V-?zKUzopVs1so5Ly^K2nJE}Q(vT?N{Gf#YJHkXn(UVRjhG#m zj<#UOv#DW1t9$@y(>KJ1`c1 at WMmNm>w#NfB^vtk?5V8a&h!qZNt zvrsBog$!5D8Oei3%FMvt+Y)i_EBY+aA(Dwz!yWm(3g|?5R(Ua_>V4~P@|(e!26^k% znCbAGzzBom;;bQ9G^Thg7`l=fBIS;FNWroR$u}>1)5Z zs3e}J%XE4S^Xi}&{zP*XUpSs#}J+4BX1~vv%D_>Rz&`E0+lPHweK)ap2N?FcA7xuPz(j+6JSt zA;_FyHZK;hBX=iNEO`$W3MY5))u0atX0>hOf=SnqLt&owxv0lU5T}CvoXJrZ9z+Qe)ceE zKCuD|V!uDkL7vAmR7 at CK1VcVbjDUJqNV-o(iS({YVRGR;e_JJXYY9S9MA}=qjOriIE5Vj0l*^W!gDexpR zMoN3#tWAGT`6Pk<1O79hYb0{&>HNvn%W3GwN&^In-W-cH&1E_})A513dGr0_>=yV% zsU;^6L26hTg|;P+j6FeIPh*%CuNe!)T#QQ~IM3ARnbdcZHf7wu5#uSEW at U92H{hYi zlMWzD!>#yJRT8I9_Xvm1zAd?v$JKGeb)jQw!9QQgB6x&M1|e zPA at t}9I4#gP8$({8nu^WP&bN?Dnwt(M$z-NKiu0X(KKYXE?$=nGeEHeI*sd+>DV$~ z9))R!vES~k%#F~C at RkTo?}-h?v9XQSQw|Q_wu8i+8)tsbhvLD^@$|r~6(VZaC4i5y zp$kPNsTy=jp)0&Y%Scb1sAvUdkNot at UiQ1Q!sbR<)anqfcs2d%87FrEE at 8ZWEoGqR zL}N84_-H`5+>TFiiU|S)g)0>Oyq>)X?EH$Bib!&LMHO!xz(XU>PYH#y||2v1f0i?M}pRiE^;t=khr)}!(KZ{3w@%aS-tXcJ0|$Gx at _%rxYEL{OUdq-+L_i` zwW2(0rL!9d6jOrxR5vDD?g-DpjEG(n at IX}PEC!J{n)jb**GY at 6L`O#JJR*ZDblxy* zAz&`|yBh85TPohK7^?!_mG!S!L`8;G02mn~ID?&-O>z6B_fMU+E^}nrm8EL6S8~|# zZsB4O+9d{PLMS!0dC3eY8Gpv$zCX(_wDo0O#Q3}6G;7AVR1>MGPQ*^h%nizgcxarM z=4RQLOXODxRoE*UzFXm(6VK9eh<-wsR%juU%@*fNRDfpXMI{^)(iVLpSl`7DU^ejJ z5FF1p&At$787~LpthJ~oL|CPA1Z>Szh4Ez;sh~R}yc6Q1f^x{M&>``v9c2<)hra%c)ti6~Qxuu0sk_GbI5rVvCPgb+RFiTf-^Fz!W#EPz$b zmIk?VBmbfjpyzdjXk(DTfXmFkaq9baBJr{%RhQ6mJM#l?kHzP2cW~^Ex+K*9XQ*ZV z7qxN=f2f5xZThK#oEQ;~DI9dDcul7b?D(;2Hw(2oFq{`HRm4rYN!NDM>-LQE0qGql zjG7bWJ1mB}pH_#4q|+v~z}D{g>n at XdyLEEnQ8%X>1kj(w;-tnkG-uXF%G#PK3IlY~ zTC|TMOmZ&5`32y5G0nbFv2oYJsC;IyGoGD7L<2Omf1vi-nGGcwR4Hnp^@8Z$h0e3> zb8k>z_o&=rE5W90Fo6OlIueOm&Tbskk;vKipGYf?Uq$59gp<7_0*;``8%&T0B`*)zpYLIr}@ZEG0 at Pt#P)yjMUF zG3izd$dfe at XJPR8sS=43H=jS$sw2}q%Si)9PFqIp$n}-`dr}5RRhFSujF+iiMr^Da zMW+V9?=o6~po6W5|4{4p{)bwd9G$X?WR&(AURy33=8f$OvbY-DAuH#5fNbGF%}n>> z5qqy$gi8}Y%$~}e&E|S%xSl$+5Er8)CO_V(d2x;(Mq5!)SR0geRst4J?@|vR%4XpE zU5%9E at 4v8R;l)2aSz4NTBh)aS9~vJSI&^Mb2 at aEW z5^<4n+6PpYm+o^Q?=sE?Bm`cd&6ZeZ%I32jOfMXG&PXYm5-)gji0yxcKSS()HY>y^ zih()zL{a&+#vCBjZ#gs6I3eHs0R7t5C^G at MXmQS}v4Yc3*Q{C7JiM}Qczyx+mMMdr zL|C3ilu`U-r8oV(Vl*fE(9`gFOU-9KLSPSGWPw4{Y$3k`FWez1KP4L))EYnv3lTlz z#$p_MN8x=%w5p)hZQ2uUhu!_RBZ^-!$YXu}fGhr=gUj;I6FZZ(sA6cJGIeh3m%o#m z2pPekpsn{vX!5?Ut#J4al>PLQj~h{pNiaU8`Dt2kpFUKgg9Ir%^MT5n3>)`-FY at K; zE;P`MnJptwSlm*~dbw^pgWYzkBW8OY>+}6%5$B5%MX~;Fd6=cSlfDLgRf+yy at Jp-t zo+m0lL*ei2yL=F#?c?8|AEDfQDd?uOFudxcNke0BLtb{e44GOFg=&>RcHx#OcCYw5 zI!L<5ah|({7E+dcnd+f05bY#IP)FW670~f$$(y;S%Ko`~upuiJ-@=}{?1)W+Y%8xr zh-gN|1LI#=@F~YAtY{qAVfuzfoT7W<_kgr40>q9o%H at KhWWV9aFT-?&DGI3 at K>F8b z1KS&a9zGoGTn>TGO(mgdtX)ak{H#AjGpjto?w at 2cG&uI5z%JK;^e^zR{=G&9N{viC z=#tnW56N at 69uqONBxW_yg!$dao3dGF3SIfz027VN!7jcduceO2?^67D$E)8`%#f(c ze8Q?`s9HBe!rVeCR%Ogi7o!73p3YeADhdx4_=~6H_`l0 at otul`i16M03NiR99BVJG z)sBBIdF!GBN$264uq!`aOD;anpgceAD>MX-Rd~{is)|w;%Pq)V&bIp(XMgPa22b2+ z$Rldk9+$C;e-cVnmkQ54D<@VFEF7NaSIU5J4BbK zQ3F7S5ZXTH+RxYA%B`i@?+tL+UKn#P)<$+{F3MXR0Sg~195Jv5>mqyfO(gGt at O%2k zyJ^GJ2GNG)lpFZjeTa0#{^oSW+qpuA2RTI*S);mr)C6t at lgRUdA2%q&=_IUr=WSb3 zZFEBihe^vDmS{$Qf&lyW82%MzVUz5JGKZTogk*%fFiF?9q&(dMcrh&sYH{>iq{yW{X zmT~@ze{5y`e{L&T|GP~4SBo$?Sx2)1Z2{&t5s`&E?|0GJ!PGeh zQ~~~9`NzE-5Ze79LKMc5N<~;Gqvy!J;!LrPup48J!%mOz`tnH=FrWYfEXtsIn;S`ySduK-72{5`brGrKfn;lmfjVJ< zll3>F3<6kk;v_qgW;6a)!X%~j18`&R#!=${LYhHtxl;Wwf$=Z{b at 8Izul-5d_7u2; zuzgB;PjPqd8vPlw at c}8XVujX5ULF=92GY)^vVN+kGXPbt$S^`X8Vj4wDR8lSsvF5L zKjYA(J>_Tm1T$WX2K(WZtAg{%#_xHN#;@>K_Q)5 znWr6;3$EqKhZreZ!j3MBl%X>7wD&vUCDZLoEaGfNy>-+qx=le;tB{OlYD?Fl*c+xA z7eb3}+r%<_!RS0L+I;%r&dl}zRc`i at ljSb$%ThzHkQp6a_zF0By7V)?b(2{;dVfw` zQMh*&=ky;sK#`;ugP-7$#0d8fM++jdzqheJeZMOiwM{$yq|HsSQFgtbkrPV2Y=^R! zf+G6P!o$nlH`T-EiLLO0*xQN5zk_nam_nWbc;O+i*CMB0{@^{iZ;Q7*c4xi?_gkIK z+rjeB5yvpQxt+bet*KhyBlp9}zT$vjJkXEWCky74wvW_HypBTV--;!%t0?2&njz at 5 zo=d-u-R>os9T!-@?AJyd;l0}RCJBS+6xO=&uMQa2NabTLX8ca5L+U|`Ms{I7F~=wD zbmN|y+fM!VH)w*9DpCXfNTT_FE{Saa%w;F#aQ;XlJk3_4WvL-K81^@U83;HdKeEEX zAwohV^{;DSMwG+7SQBJt>J2*NPl=WvVGlD(2};x|A{Is26(8KZs^u>xcI++!NlT*U zz`rE%s`I%s=K1MjI>+ZLL(DxG%|x17C~-gr^xaN!JPn!NUQ^h#wAU2UIQJYh3|v40 z&h!(kO}m!r`9+Vb5h*Z}iV;w;rPO=98%#W?+Sx|^hSzl#Ptv)Y)T+7HRWKxzhkVY> z3c)}Up$Ox%Gu<}5#8sl};LA_N=x<>Ayv{U`S+7#7#yU9cp{ zrkrKnxd&@o6PrlQ6|W3Yw0{^k95r(N=>@oD2xN5iOWW%7NkSiqsvVHlfj&$^nzT0j z74F%Fjx)GuYVxGdnqcd+G>zyFgdC`raEP*=lEUX9&zT;c6QWE89AcQ-P{#_|3uUH5 z8a+=2(>6IJ2)E>)+WY6*U})+ZImw at 9^*{x=AN9PSP|0|;lGKiOsSUYZIxmB9xhdO_ z1GGIeDAe4%ebGH#5NJX2ye2ddh~9`fw at G+vt1METlp$*r&Rd zr!o4O4P-38V{V{leL#l^`kiIWkLC+O-q6dakkZcYCeD#xk|WP2YHo-P`e{=k7c9;- z2Uc+kSJpAk(~vyL2C at Z`?H}%BOH)tOa6mgaL zh=rqa-;$Ul`Dy71g9Iq^3#hhu at 2O1AqX}0!$LH7gD_ at Y*UPTxTy7ZPrVFaM!alZ;_ zYqEcsI_k2_+ej=$+Z?sNwRKu6_SrPHtsj*+sJF-Uoew z-qqQc6P`;Wge-nJ>t>}8EZ`W%okzejYyu0Hj5ggk0~R&Gs!$1yl}^C~$AgwZgfxe& z;kR3TlUmW(fxhNo=erMWjycB2>nunqeP<%;x8$0~IN^eYD)gx|t9-wP`Umfb0fwD at e*1&rf4}<#D_%v=y})dU~gs@ zNb)u+qRXJxNHw$7Mt480Y+qxtztk5BwvkcZXp?I6=mFJ1HFA~uFXy_}NA66gv%-V2 zRslb)^apRJw+j=?&-eNJkF&DJuHUMSZ#|W5EK=>s2o)-gSu0WW%RtC^xX=12>B{G* z9%QL1E`i_&#?D+6iO2bTC!TKE<)v__=C@&U5(Osv1bsde)%Queo3yjQ@@mcZ%uQ-( zL;U6iqUL$PurM}kOTYa2VZ34L*;Xdq#?Q zaj>D&tjG@^i%^LB32~g%?^bJBw+s5cPe-f>A2Q$LjPK2#B{DiAJwb5KpT%mhSzS7tOEK|No;qBEHOU?n{<(KrPhdhLZq0ZM;ve9!LqZ+p8c(x zLTwxS^RFgq(SMFN$3IQ&zwmCd?2%YU;?`0ULM7Li(13}Ofr4ji6z?OAE8>$)4y&)p zj#{$B=D%;`FN&#DW<^m}$=8rp2&Ej at r$uz4I}i*qgjp*-EZ^oHaD0R_9IkvDnzAWjFhS5`z68= z$ZQx=aq?9$nHU6CM=(l`nqTsfG#NsbJGiHr*;!7&L at POxPS`x0==anQ3 zGe&I&P$8Qxt|Lf#wntaHX?vWm_^GZ9WV?x3!szOYzKpS6h~{Mo$Zk6!CE4m{pV`{5CMk}?2!nk>Es z0%sj|WGY+lU6UhD&}Z*4oLd#&y$5zeS)>%009a(?8{oKCeD5ajHYAy!X1tr6mbP96Q8{FYsW0HBETqjd``!Co{qAn at q#zRVKFRSu z9Y^ApMWWtN_(;sGp at Sm9SJuBV#ca6_9u0ktM1lvhb0R=Sz1t9rR&~l1{vC zT&dn7I5%UAJ6jZ?AaSf7J)^Wm#sbIwC&<6UpTK$G z_CMr#IsfmTm-_$Wd3XQmd9nHFjLi|NJP$ld{&-$T7DmF^f$5u+Ss zZ4%t|j?DGb9UJHGPq&9SKfuit0vXEmxcvDhL}!CI!OQ*KgXJYt+OkZnGk(MPk z2~M3}DtbEodLLaHBqN2I;&m$ahAx9G7=KmwRU8CCKT~!K9T1?HC5;=r_%Lby(rA;i zb_&=gY*+&JQuRlS|7x3VQlHs~&|6AD79x2+GKoCT27v$4Zj57H*whL zkMyGrGl)WMQ`{IjOMo=vycjya>u(TN+9N(|OCxn+3tKa8-2T{j#OM1SZ#E+(9E0fv z&$HBbm&O?619O8tdzQywE~g*-K$s6Z-4C{@z5BPWYc=T4!SP!o(9tXe>b&q1eKs1C zx%XWCMS8dLdwv!LR1y_)&I!)&oDI+TPT?r`<6Crv*;0*)u?c672jkxMohgswQHS<^ zuipf~gD_~uQk$_vp`97;4D>WRL%aK2k at eG>yAg&tXP|Cizaf`JJsJN4dn5kBUhQ-m zMvT#oZ{1hdrNsSS9j&BqvYq>}q%9}^g}p1Xd5AWDVQ=4G*t`4}_KuFv*Qz&AXR12} z$y&|-6`Aqhydy3vuW`50P5+8atEj4>KlUgde_^kO8QZ9VQE%Dm$lAR8*Teyf%s+uZFS5AMar$V%^}s|90;rT9{#Xzs*M<{)L at WI z9BlQV!4_PNL^YHbi)@p2Cm^rS;_O2@(v5Q}UBK>E&aEzfyzF=Mh{6%Hp>*pJKskn| z_!aa*_F|&v8jLE#VANfr(!n5hy at qOR4!2E9&FIeee}ix9ppPCZ%Gb!4ek)*Ca;3M| zi}t|=59|EC^|W-Sw4cVi?F)Rp*RMZLL%lCO%d|2tRd7xUbftsmTUX?4uGg=FOB6_|rV at VA=k~JvIUaD4HxLp{ z+c*{N_>A++&lj&_bkXn)U;G$1R6wJ~af!1H{u%m=H$u at TWrONN3}zV z9p+G_Yx$u|*x|m*qi4et^*gyNe5S9QEEne*yHz?&;l6^qC1D65%-{}~WR&^JNt_95 z8L03rn7?uoMs}2d4)BpD`-vDHv)C-=3za1KfXVTM(K#2}$mdG+M}Al}K%$_i(EP#C ztXo3!NCKur0E|R#$e5&LGzcoBq)DXU$q~M;M^Bd1>TazOeQ*FZ_4ABIN_X-- zJ`~^=OeKo+{YfdL+Eb}`;@!_nhpMq}>J4dP#5&H_um%!|`6%7xgVwBqiKj4;`VG{b z`qzP9I!_|uk>|+i7-C0zZiSR$LJ8QzYY;y$!C*OPL4FZ5CP^A))=+vYuOKTnr3;f% z9hwpe$hqwFpaCJo&B4Xci)`f7Vb<<6MZ75IBfR`kGA^^4vp3iZQ}lbGF`H56+(8bu z<1{x1y3yE4rJ7Yw+t`3qslY?57o|;ftt$f~A|h(fBI(;W6pEVNq58;kZYpF6?5!@L zjU>9h8+B~({a*y!%-i4`Fw(XZiW^Ifm2Bc(9?Il8Secl>;nPJY+(b2EH(sE%z7Jdl z9oj}%fPXV}PkO#>>_wZo%)_)I?fMr1haEp*|JC3s+I?R{{a*y!JogU*CjBDdyQJOu zjp%J`V>6 at WDu~Er_jxF$YUv}-hG-YTamm43YZrUkP=|59co7^?#=yMfv=sE|-*+UYR_*yM(G4xa5^(t^*t$OmI{vG{g`mF+bSzn*`~x5U z7{?N)fCBZC`uUtVW8{HLuY7sWjU%3 zW!@;^grE5(^P>L;GH3cf5twl+AHgWtn&Gc$T}B0|GaZZSZXzh!-#XVEn&9TcUTj)b zmTz;5AMt#RNLKl3C(iwoIZFE3_2vU+js#y4Z_xek1l*sd|3$!IPB at HTS&r5#xfWs! zltn!{&XM~h)M1yB%p7ALf`W4l3Ij`wOfCP+Y}cZrR&oCo=dAjf7lBwVT{%-3DhF0 zn?c1*hH5A6TPjoH_KKNQWBNA}Y_RE2y=y zp7)mTPI!Jm%f{=hWc%l>m^_Iw#htPO@*~Ctp3C4-EP0)$ zD`m=YDRM6Yu0LUR6?U$m4%Z^^0J?nn`*|Oa-_9;xu%CMN7~q}`3#q)n^|Eyx6W(1P z*07 at qqnu8<$t9sOld;%5+Sd_B^-*NTiJ_h}HG`}7;g2to576KdZa}L{XP at H?vQ!Zy zIYYVekDrPs1uuT`zTy&Oe*J&)N)9p7`O=sk4E};(^h0^vL$6Wx at Hi1@OI+^XjOjUF zqDMPqDI}TL1=((scnNAG4Z5ECR9gMyVcK)mB>qInis3QKzGslJkW2$%rTW7k{U!Pd zIoZjx?Vp7<{mvL0ao zELt}TV^k3vK0S`Ipx&8tKHCD#hTKH0(JEtETrh)Oj)_!|yb^Qo^ofI&?^uOyTu7ug zIE6T+Iyq4;L~4p1#XkR*@)^J8QfI&THx3&JNZ@}Y|9@&};khfd2hFtcAhdlxKA>e7k%c>htBOIyE-pCpFaZpCL}#T z4_o5*l_I6}_hyosT>_*%fzd at lzieuyjbsZ7(FdtC+)40H9MKD at 3ikdeNG1{^fnkE; zN3B0K5jbf%^q*NG04WRhzCDbG zSf4MHZ{8a&@Fpr^?37)67U~r*A_R#G=KkfW at a;E1?AFzkz$YDei?%d5xmUadS4?`g zk-+SniMozt!5oUPwLJ;rK^Pg*bn^+ZBTWus->wzO`KfZ`BjwNepK2Mn8G+l+7o^2Dph-XqTD`VDW(BzW^EVCk>n9uX01HDrh$5m z)`%P;q<)- at Yzm7%kYv z;=;e4vW#NXVjGu*XRl+dn!w&-te)>JiDAClLgdK6EyD|yc=c5+ at 6yYz|eKt(*X-K;b)Pf`NzouMV(>G){wvOM1Ecn6E3n7i=FVu=S- z<1)K}y#!~OJ*uR5ktCKX at +~CLV at z;f-bNU3u$ec;yoX{_Egk1Cw#DT*Rk37dPMKmP zHQB)dxDAc=OJPS7xiL+s33Oz5RuP*{VOlp9cQn5v+r|_}zZ_BEu2(!a z)g9SM_=yB at -giM(xvl&S8`c3yr|k46`6&ag;TSr&e8!Nq2yaOAW`j4zcEv&OYqArJ zL$~kad`)zfW%}+=NZ))$Ew1(b$DTQgT2D3f`%G(=b?G`Vi(Ki#uF={Pn8}ZANjMz= zd#EpvPE}3XdgioMbtbIIo!>6!%mcRhUi{RdFAI0P9lC~Z`JAcLs>-?o!CZC+gvce@ zBQf*?gRRjSqgDJ6H*V2xp-=E|(g?Xz6}Bw~paBWXEnGHe-2UE*P(kYG=bCkzxbvE*Pfu2pVZ6U_bUpLmJIeOF>`@w= zAWBR?8x^;cW~{BjpVaVD$s8|%lZHB*>P+`yWEX&AN0ZHUrn^0{%gR|!W1zaE ztsFaef at 4QzAiJbZy;s8)+zN8iyWwhtcj~;P;7@z`=r9LV2)zh~7=aNrkq6 z_ipkUa at K~Y1$*kUUhph*Pl zt)#Jo1*~h9!vdshn<+8SYKvh2{WNT#y?9EjNYRzQ{o`pt3pDEyr at -eW6%s||86d=m zP0ygYgOVU+OC_B%>^8E~uw9*zQ`X}S(AL)q)3{xo<)c>+CbhW at VbEfWr;s>*nx2s? zRL?GrZA8I8AiON^HV5(k&O6f#uRC-|?eK?K;=f{$z3#$+DKB_J;49r7tWLUuMVlt_ z0`+zaZT`g|`NY+;ILopr`2;{hyqr}Q>O+F(7Ewvju-&0TUQE`o&zBr2}W64Q~%+&d-YAQYRc9&R!ESr;w at qaz?beW||7)_E~{Lv_E2hud=hn zQwg^&V~g^*{GKimj{;@=vp74U=TT2-aUC+bR2#`LnbTIqy2?vB8?P)#?_g&FE@&fD z&hf{|faRwW1_4KWukdq#tv+|77S-1IXkhZ8sbuKIupmT_o4~%PnFp|CGPk-q3iQjF z{FCuB4aLKTX}V)kdZ;FTP03n0vfUz4Ka$?%%l=%Gu;9BBj$dDZ z^)1CL9i~Ha{&2}o)658Pp0m33u8Hp~SjE0?6o at 9tuf-H4B)I4WsTp2o3^Tgv>ps%b zm-EM;t?R!I{XT8BDtcND=fGJuC--#uoo??awBHm669q>^*3p7m>z1w!Xr>E6<}N`-G8=~-DzmNQ0* zp5Huvt3m%jZWe8-ehIRl#TAjyHb9m6c`?IFQrgwDc;t(RKjqqoT3$KLMLUOGtY5V6 zwM+i5_0*&KhF<{!1oR071jPD(T~GgPtaYeP{$mS-8O&-B0YPO5zkte|F6c;ZCV`0X zpJ*Daeg_6U08_k?d#juFkRFfc^-g!4-%kkM6pyR#SN2Q;?6&JP(sj!#fx_k+?TeRb zkK^9wZ!fpI-G3;H=tuyocR! zZ^Bh|gKuJ9-blGegVS at rzt_(k8ei+2;>W_T3LIYbVm`vQ&`n!_BeX(B53tC zckBb3D1EjiFQ&W-Yh|D`ddw*jN9Kin`{075M?D(7B at m#|D4OYfs!DeGdaqz==y?cb z5nnLy5UJK9$uTX018i4g*S_=2G-Sot?bip+W~#2Ju&;YL_ufm)z`KJ?=NdlgSpD)a z+O+7;gdjo~UA`-vcW2 at rY5%Mk`Ds|{op_fUB2}N-Ah1i$U9I`K7$mK$EKwZ9_1sZM zd3AZADkF12!!)Y)nYoXCK9H(i2GL1d(YR6QH%|Rxj^n&qbnv~UL{UcE;ROjVsrJ6` zB?2{{BhqsAVZB67ewFgmQ$>w!xnm&%{*YpOo;il2`5ZixlFjCRUXBETo&sZ??{vmx z4g7vA@#^~;FYb51R20vzm>VrajPtQTL(;INxvPmXD?U`5u%YP)S#?_7O)g#+*m|Wz zL1yL569oUJQD%>G6Y^Ft_$Q_W1R^m-k zg0LK)m>;{zA((ozQpz8i{n-tS?cXsA^DM@)%SW4$>h$_qvB-zk=gZ+|AOvCSfX`QY>OW zN9KTISi`)xd4fGtU#k&_1jO@$(z81z;@oNUA at h=Mg8nw2bQMnTy!_>-u;BlRpZ;$v z{RfHub2Gd0s@$poO1i8t4qZ at wK5d5*9atNCS(R*{ma0l1N- at F6tC4L)w`QI$d2ZK2 zurCmPkXJeZyWUzbiLd75*u@#A^Vw&v<(It zGfqHIVZ4wJT+4zG^N+ at iOT9VQcZwU~?HOzK*!sYnE2Bq$eY`7}oKz+>shj94vxVvj z25+RN*g;;=3vcBW)|CpcHswvi)lxQWqbDPI_3~Lm3%SD>wPX)Xl$V_5P|8D>-pcU# zD#@SYTyx}5%+`!ZW=cnRi{`M8HbuhYJQxk5|s0Il7takD&c1ql7iez1>?z?A at f|#5Ay83GBMRpg6uE?J46KBE0**?FDxlVrSoj_o9QE zTxMBH6pIedjk#0#A6{!BlYjsqvF0Tb_#`wvrb1w2NSVDqLeU{N2bDsp1Is*srdq?b zM)*nIAfq7Opfh0?iUwNDJu-LD1NE_9N^`oH?pTHO+3zA0Gg`4aZFlYs)Yal+SvTJn(0utbw>W{glxBAGQ#-! zct~K;9H|u$L25M#$Pz{YsZ=6L)xBA^H9-Hkoq65xAHNwzLopm&T)x*loXK at vBe%E% zSAfewXS(;KbLOqn<;KVDCBEOcCzPnXXvN=#Fsfj;&=-RUz3jQ32!cFfVXQUA;@!ev zZLl#;4UKh*w22tG^Np2Bu&Z9(2=v(CO`)wTR at Z2~_fqRNW>|&GQ=R~T>}^#^=Z&HgN?J5y?9Cn2IG%qVTlyoo)URlJ z)Aa`wB;-$G at B=h1CLv=^uWh|AF)2-7Nj;fZHlbhos$()EIz#4l$bnL`SV<)P3iWZ? z#~J=P9q!z5CTAo?RK5p5ziel-+%%)u!x|)T%k+xU2aA(X&)W3)zqq`IM zM=JIXPvn!XCxuEKNWG2%$f`<}AWR{b=<5t)~I6Za^ zL2MG+!J&vdxvsaJ`dtv}Fs+QQ&FQEAcv#<~QDa_J%h+59BrgI7(nqv%BumPNjR*tmq8I=DL at zb> z5$cXRn|8BQR0{@1B#{aSEeHsS64A~b7Eb^LT5-Wi-m>ROKm7yJ8GGP{z)O%BEO`lB z7^`INyJY*}c^4o$&+!g)FJaSh56&b9;f69j*KutfFe|}%8jod#o^e<#;^$vm>-E6e z(*>`ne$}}Z`8}QYP~w4*&VwPzg6ttsBU&IIf^bh*gJ^m1sZY3hcW6jkQ1Apegd0fG zefk?hUYLY(+Zq^pEUK06l`58QPeRNcQt- at Z^chuu at H1jQ{x?W+2m*#5fQD?dtn)d6 z at kz=Gd)D~8_4N;kAIvh+Sp-`@Xu$`N^TbWyI>nqiPxQ}Xww+%gz0%< zi8T?v=;^fP`EiQ?F>K?hQP_gVc?&P=;3?{dX=?BzA71c|`xB*si4IKAB-xevKtNzX3%H~m2V=ne%L0?iP5 zpn+#uG81~>{WJyXj;9C{OZDeRqeq0Kp>B)+GX$WR6{^rG)QX{(#^9{WfoxaVVV%ZV z?e?!BKLH(JGF_kY==PA at REih@86N?-Nf=PjkE&=VdgvB4(=`!N%!`OBQX$D^Ypa^D z#EO6s*9 at 1Xy>XZBoBpz5qTlu?<+edWZbWx3{-7?NN`fuf at v7C3DrB6s2*M)OE1fkTi}5vp^e{B{Kv{(J#hUGqUbA3(o^2A-4*Ex==iXL$-cJ z^i30ZVb+75{~1G!wm*6z4DS+TKAP;NybH#HnTlLmjUvvoxE=sHys9+psmNwMY{uX6 z_5uCShwu9VL$nw$v>amm^t8n at FtGhIqW#x`JBU-a5T12;O^mEP2;I()d|SJEPIst7 ztYx}9cQ7*EnylfZNU1~C*h at s5E%m)JMY2^Am{6!N&_ShYK`JqNA!kAXb6aW zLWQ6vDYwJ9pDDW-O?vS$|GpkOAlO#)zSJ$v96W7KdpOwEQ}%wG_TEYn&xjcmp5)Bi$MW$=(MeGqw)r<37E<8Ex%dh&3)se>e+<`o4nEoZ<3B<;ZU zr(3grnjjc6Y0E15^>1kYVS>Z~{e at BAJ=dp(G{U^#o`X zP!g2&-kK>zDisKg_gBb)u){XrwX?nyd%%M7g+fB7(?LLT0CC)cxXME?9*iJjk0~a# zHZ$KeH+SRtxP4r-2hz4sG2B%{ZK^pj81Lp1_Ee{`e87;pA0YhIQPuX-u#q&uBQX#c zv12d8pXiqM{CX=|oJsdka201b85p*qP>E>ey9W+Ts7(V8Zfoa)FM*DeaK#X4z*YF_ z!8;p2qM|Y;A|>9GmydU_q12-nk&#AuQ{*%D1-Q=h#q9(mBX`6itW1$=`f at JSi%>cP z%^dcwJ0*RJMkn$zZ5k}9WJ$|(yzOzkR5U`d5P*RA|C8gk z?Cs3|yZviOJ7bF?e5kc~X`n at xbNC_)A(7YOh_{1~FbxdU{I-#1Ya~L#3vOT_{HsYZlr%??nw2ob_}pe(QO?lsU?Ja^gn>)uUvDbY zRZS~Wbyr&_snp~ICJUA3P0H*Tn5ZkF#a0r>ZGnX{MIz2ML0;IF%*PD0f at rN01tosB z7cv?PCdkI6fS9RMzsNO~o~kC8O0G?_VyPtXn7}wy5bzs_>D49Y3{#EMv-QM`7E}V6 zg}9ZZr;%oN>S|Un+jE9;=ToyE{hYO3^Mh at T0OD(n!4y?4*90zbv9`TgH+8L*x!0b$ zRQywdj6oyjW^i;tZ_$#HQ^3E5a9V z;p4W!;fIF)2ef5u+h|)}i1G($Xo=TAzKPje)C!V=!X3B4jPE5AlF?Y=^q7d|3B zhbD?T!G#kE?L=!WZV;O20ej1`o7R(3Md))}6X8(sR5wnujnOIRA at 0i0#_u$wA}-iE-y7M!WyswE7B}GSm9RX+m}9!yZCD%o zCUS3;ME8;-k{@KiF>jaSgNGz?4bgEgbtn0lBeDx*;973b at y!S1KKYylo)U#2(w#d( zI5bm$_n?@wo(-y|L{g#zNOp&JhIYwvyEwWReCv&URb_%&#PV8bujivF6CMs zZjkgO!zIeoHqrQU8v=p%VtZlcU at dRu7VMLJn8X7ZtcVdtj$^#oM^rah-v`*gnjf}i z&O-m!Fc=u-%K-mV^Yd`9bTTxu`PV`4s?w?&imuQN7%`+AjuZ?_5?Ob$e{3Ooi0)59 zG7Os$gT>inY4K#_JP|%4l9YfVUx}_9=JWa#x0k8!N8%03;z&IMa%3VkgIwB&wGUda zM#r0SARcWoe4B|af1(ppBiKY!Qg)z&G9B_rh zsg-K;QKc`^W=SohHkD~EenseX^oGr5_01PxBE}u&f&_9jAF& zAPIa->Wq6&ICKL-(P8bHsgX`Jzw0r(Zp?J9`w8yd?pr9PS}Q~@RD5%CE--RvoVC1U zZoA;_)T&8sU7oTPUW14Wm1j|Qwhe0%N)?39(u1udYDmg6 zyxXG_W?VbBUkYb-;PPBpMH2g|beneY*z>Uap=1x6+;-+?l#~|z6g(ndYUX-Iw#pFL zI1DU~4)zYprW(&!x?}t!SE%0tM4PJdTA?3fhKejEu^O#Ik(8#(-G&4u7c?l-^f09q zfr8h&wExo228DVvfrLf}I&H$q%Jw_P_anztka-xB^3W~89~5>NJ*u?;2RKYDaf?aU z7g>&{5IgeCPC`NCc(|T)qEmBiP0mka?| z1t$p#tbur*O6s&^wF5?BYfgN~terw}7w{&Bw07uI<~2gLo>u8IlQrU3vWSn5Wd}dD zCBLNP(EtFa5E)!;lVnf3dq)&lD>Rts3K4w2lOMr@^biXjS%Nqo^ZX_PL)#)V^JzD& z5X_d_ak~TRebg^`Z#}Vw&XvbHQSykfz>qU$4$4634eYp6Tc8WYN zNlg9kiC8kU_dmT0Yj##4H;nC&P*CedEi0s8-ectCxu~mN~ z=6>sHBJMA%=!5znScRLVvCIEq6{m8 at iU=R at ZMHe_VH&4k at nPsvh$mq5Q&N52#)86W zWH-Hg3X$g{4>ZdcY&U3pp<)pO_Gx}kfcQ7+R5;quO|Y?T>c?L*mn&}wP$qz5<5L-zAg z9)#l-Pje@#Q|YxET>5LN3MJyS>PVnwQB27 at CLR}_E32Jn5F7W%D(D-6M;TyI!bA5W zt(9xZ1Adx at O)~c at nI-&;v~QhZv?3zM7F#DEvR2Z9cZZcmI#_0cY0*L8A_lieN*}C=~>jJ6p~*)UbP($m!7(#+slKW;_m(Pt#GG zp>NzodXk~jNH~y!eG#?}o(bQBqhwoKX{-+O-Kl9;Juv&d3eaMYX#LKj=U^kPrp1uv z{!}c^v7W2oTCZDEb>lu&@TRI)#Z-+`QksW>bk6Yj2%mlM`7N1Py((s;I+Fyk{G=ke z^o4mGK=pin7rWX{c4VThAL0Hm53o*!CKbf0fHcqZX}%yo{24h}=T8`^VpqQb>_Cgz z?&#cYRIe+XZuL~_{IGLhdGPUz(GTp|_i>eH2f`se2;sN+Jp;dYw^~g1JX4l6QcEBh#RF3gq4keb#}Fh+x5zO1 z-AbENk6@|vcTx3ugxg at G^zW!dFV?W9Z5##m+bqk-SE(P`k-Wx zK;e}0+@@pDc~4R&7tn%vN2r}BP~2m#1fxl*k{+3U z*Bo=VAWE~UlkuibAeU_9G};bcCn`Y*R=!mU6n;=NoiBqt2B33qdpBqV^8&_3otoL# zSFm$=`8Rni)!SyKKJ#l9i6eq8Snl{On?>@j(Xqk?r!;Kx932!FkMvVw*(tavBE at W5 z0|OlR33Yljx$wzS#6JJ_dgbvf${XG~i4l)o)*c74EafyEnZ3`pTH*#Y?824DLa!nGYK zH1_jYH&8s3_r|?In~0Y}wrGK4^X8L*3|0RigL6A1et%$ZSpVv_YxWPL%)jS)C259kGmI*@dUejhC!r#& z&XfX9=4e-JObM!WENQi=%+VoT%)WGMtC-$vuPZ|Q^VHdom8#jK4YChbnWKtx*>XHv zALN{x!wCZ-1(hTurXFE+ at Gyakl&lIKW>PETsl()MnKu2?toq)|HdvF?epeZ+F89QA ze&(spKAwlsya{KNr8FSkzbfm>D62g(C@(qGeVNdF4i(6#zG%hU1s)aa#sNCnirlx^ zPsI0?M6)3sCkBwuDY$L`1;yZLME7)9bCxjxH?L$JuGWYqPOTe5la!Fo}!=h zqi_$cJXu0%IC6EJS;;8jl3OfnVHL)UF$SmJ#2yZE8tHDx zjFxMoHs(4C&hjQsIKLp;j4bsOhu3kC8-wN{#+%semWDH?CprSyncGwPErG4cJ at 6r$ zAG&%;3D_mlk0MrO^a2Eq;WWp(-t9Q`m-NsW7SY)%SdYLR0~~|&UYL$VgAmX>dAj*g zq+ktyiU}w8q1^ZG-IBZ)+VY4-nd2QY+;Rjj at 8SZ61tIu+az{JlvnnKM-=eFM?5ADm&h_ydV#K+ac`!04~)M9&Lqr= zhlqk{-UBCyFu%re+|C=7KoIAXLNbr}A=sRInFarr_4po_FMgLWZkS1ptV<4z+0-HQ zIR>h(o~iSct8fA=vHW9_zNP*C)-l23~Qf9i)6n$u$ny$LV*B z9GEY!J4UH4&!K?rhD=|d9sKPs$uXgww^m4i?Zy~ldGZrklb)g~`dqdBptn=FLz+CH zP{%Fy3eckPTeW?C_dDZ_~5fKzF z2;IYgAo^*+szv<(Nu-PI1+M6zsN?YyL)bm2z&GWmIY%#jx>VC8+VPkzt(@2aGIGCRl3)p`1B(lFI|_ zF#KZgl6Mq}fJFOJw$7>4R#sYqU*R~u$;rK#Ltf*}yug|4{;GnHeMuCfS`6a`@3t>J zCrVoUZ?=5yUIxGNWy>^(|H*Wwvb~whzjT+z)v;AkKH*Xb31tZh3Jm!3 at r5Aci&b9{ z!wG_r_&~t0w7Y`u5DRh5cE$p~X at 7!#!s#Ay8a42WFRGzet~ERE4n%OXXYO8irZ^6f z5Sl^KYHGHmb# z at U6k@`eIxLURMG+O0zYALTYMR*(@SWwT!T(bk~EVP16|53(%BVjwP#^&YBeZj~NMW z%AvY;6xX8AHn~QSshWaOH;^PH?um~LS)nnrXciof`Zm}5N3s?a534O3fS756q-p3& zR2|M at f}F3#%ro6K_IgCwcxKUZxPCsnIJEluL${tIhZbsJ0*e`4=d=?Ssc2Fc!ZxPd zv|q++rW8=SC9&hp at E+S(U*iue7Z%+^phQ-RiW;}vJb*JV?87C{@P>H_s@>M+T$wLY zXlaKI&lcKi*-5TJ4s~-&%@jnnFaRH7!=NL0^*wMDq(VX--QKQIzYn^e6!%d%IhPPJ zUJP{zvA|HU%4O}!2wO|u4qfl*>d;yz){ftVmP8+*E=MdWk+i0~> zE;AQ8nX2v!?#!#3EP#Bsvp34u^C;*Gsi;hQGjo#;H6$*dEy(9)WRmALJC96GZVDT% z%>um%oqfh(MID@#n<80XGWtxmM$9FecdP?!spQ^2Qm7nRuDaLOLaTB at wPya;r|F)F1J1aQ(Ra1WnN!c0X}(@6On*!#@hRbvVzDXKOV0q z+Bk?Z)cL_YNw2W{HodN^BTJ5Et=xz3*3~AZw6hmG<+4%crCBfbC{>RQ+D2^~bxQy6 zh@%Lp_tt|y{JYT;LX#0k&I02sLfl>F-YB(y!Xc-&%llCUa`I)JW#O>g1IHk*oi#rUVO z1X#i_IC!@o-HbhVAi|+%?q;-OCRHu3_$k|+Q7rkiH(s`ng3-j(@4EVzaI at bB0eeeF z#*oAIQ;ksyH*0)-d;ZPekEK^&w{aqT))e1>&yf-WpI~`+qK?r0dOTOW=YhLnnt_(e z!kR^rZstwfCD3nC$uVlx({n=zwa6{q!)Jad1>TYyjNw%o zq_edYQhMzGDcxAt`)yy_ABtU at r`eA=Iy}Qa)1(JGD~H<9Pe(a*13E;}E|5J#uighk ze&`3iNrO4%gLCc>!FYhF>-OOg06q`3EGbq+2Dvk}0MQQI7Ef-iXWm at M+eV*3FA^WOSLTe{to=EXxo{9 zVrV?5TsmTWUeuA!d)QWfx47x|2DL?~mwyer56h&H==U<%H6vk6`b$+Muz}3(RFX$N zH?uEGD9gNe> zZ?k3*nPuZ~G`I=wK`vmERW$Bt*~JS7mE3&ibLjyagl`Xd(Nu}GcN zwxA?WvLz4>P&5ytk0Hj2ogeKtLq7q8t~fR9(es-z9>4N8^Cv8&VDYDYgk+L#B}Q*C z63`u$^#<$9ci19$A95HXqIgT0pFrI$^bObhd3T7*<*zXfp{x^=2V#h|3l{WKzN?pR zkF*%<(;WYX7`fO5ZXkAiN(%J6)FY^p%&cXSMFOgQq29|9{(zdMZ(F-JIc_bs_Es7ld3Pk59`NoTw>nDhZ4Lu}9xV%T7 zG{pC=ZsODQL()gzkkJ1tjSrYxR|4VxKUELhJnv7(kh=&MJv%1*je<4dy&vk#{?$_q at A#~ zz&Y)IwUfNtOIV{XJJEywkL~2&@vy4(UvCxQm5xgkj|qmP==7jai1(+TQ$xX=9uWpD zWPa&RDWD;ZwX;ff+57&iY3}0kw)Oo=oO44~D!b7Q+?YGA!`uCG+4-U)?d|RU9l~Fe z$4VT>eT6Z&&34LBp7(-0T8<#@&o_V^lb&W;4>N#vs`0J&}*MQyE7qAXG^LBYAxVm+xNp1$WO^;<``FnI>iZKkkB z<@Ma|MC6iZ`Oq<{ou>#*3njFuR=V4x49F2BXRgtT-m^yT4yJPI1gDS>;8D7acVmlbL#B*HlxFqgx$!J1Jxq5 zp`-PB_b4mfipyQ(*pfj7Pw%39CLNnhXuwh at hXTo|lMu9C6I at RWYpezr^T zp{L2jpqF_)rFnzmdFb?zf|cH>0W)u|DhEjs6|a)*xz5zm>DsoaU<@lRpUUR8b*3q0 zOJ8dn!CJ$L^@oKK(}}1r8sd%yRO_fKC^}iLeyj~kcq-GKBK+d%CWy~I;9{W{9pJTD zasYF&QZ#n+{<1L1dX;gT8)+6C6x97 zzW%}oez%B0 at L55S`EdxeiPhuDC8LS%Fn!1qBHb**F at iXvWQq&jEBJ%51tWO7bY zd9Mv{s=BnuLdAAHhf;7rL4H0`b}6_hi{Hk-gnB at 9QD*uB_Xy?&t#T1lw1*mSf<5Z!Z_!VHYLcxXtl{%->?098)ri4NBRJ^ z#XH>JPGx<^X|nzzDMol8Ao>5{py1!Ox1{aA*y at Aq;VHo~uHG_r!4}#_Vet3vjZKLx z7CTAB|Hs)q1!=adZKLikblJ9T+qP}nW|#4nZQHhO+qUiMJ?C8C-uwSntdoC5JTZ>O zQAXTPWL}vg2NIc#(F!uF`Ti#RLbTZ=cct-9aq3mS)!LtR2Eb6nAW2~Wc)9&{1KkpwYJ3l(ZS_WF9tU(Y}2jTuW0 at Sv|JI@U}Z| z)`s;5DHz$Z at e--NVs;W0Gl$s~C9-~{Wo>%?hN)8i=HOCd{82ZXH)b=x<{Yw>t{;LE zKCy}h6&Xx(!ei=YQ`(fGOoLl9F8r6WYc01NTG at ESJF7qX7zL(Q3zgO+d24O-(PMli zs)^9vjZ48!5$4ndSJcCDo_vB&^SQ6R?Om#SVw at JyEk047QGRAvsKWrF*QZ(Si;7rXV}U44o;16V6tf zT?Nl4&l3}B*Se>Vwp-RaL0S1uk6BHCU&S9L6`=XR!?5nRsQM%4D(NQOiOt_FsbgDOh_R4m3 at KAxKus5XmyMu?oF@ zrIPT-&g-Pzs!n at QB|IfD4bJPGcm;oB1BrdwQ0$FyC at OQDn^C&!f zBYaU-MmIpI-1P(bn*F~%`TSiL?m5 at 0iB#Y|U?sq0y+bHBVc(&EzK)dmALd(gv78|6 zu0f{SK8hr~3aFywxuR-53K at 2?L`$=V*@O=^N at iQ<0*9kmF`;xUf;KEZXUU?Z-7xoD zF`Xrc0)dC=ub6$W5{3=kFymY?dyt~|epQFmRMQx&#kJT&cN)EyjvdpZf-5*p z>;aKN*umNnKK|Q*_eu+W_y1mq)JzPl{(}(7#HR%@dy5nnHiZ at aZy`!=_JupMN at biJ z9Q*%;Xz1M``nrO4v+Zvn!g8~Hbl;g|Ka5BvsCB=Y at _G5*zHz(B;Nsx^I?1^C(HZHD zZdQvqjA`qJAL;T}+cIF19>~IXGyrjUfqr+O3;Pi0#2MrQ0@`r2(DIATD;j>5`Kfbp zNx+nvZ03}1fejvJ%p8T$P_9i`7w`AzsJkPB>fDuEPfX+X4-k1UwGpDJ9pac8GbdoA zSI$2aS^m|%qG5`1$4uAsfsQwTGS;;vZH^T!fUedPmKdE{0^L)r+bA>K&X?{eZk#KA zQl3gG0g6*Ceu{d(#dVUA{ndqtVV>#FJa=dt7^PG$t8IDmofOla at A;AoBxlay$Z at tN z0K at f1TQsKD<64v&`4gVHs!o3c(Fi(y3re}yhz{uuyV`!c7_2S11RCFdKL|7{8f|aS z04#e^J2d!d&9R64XUxTb0sb0CE_%8x38m3XH{H3;V3CV zFlALwaKi}5{Hxz4%80C#s-Mtken_mbkT#g897*iA)bvi0WN&uAsuw&0?ii$W=-#HT z&`<^hR||zC+`O&hTqU2l{9p53+N3We at M~}ZGm1)eJXJt43*k1;F~O_^l#*LYTg4pCZ}zMEFf~q^G4{7mG~wOeeaj^6Nz;>4a+Sr31vlCPjtrB{xmuZ zZtg at CoHSXSRVl=sc_~rc8EUUE=;rX8V`akjus5K0z94wJrXVwh_yMxcBC}EEAb5s~ zy{8CAT$*Lt)aM~%xRt1BTO!BL50#^6*nrz+d#T<5`omieuWn-_9W!^`F zbhJ62=sDg}`V)$M4ox4)25~2928M4C!F{S%*gZLIc42%3C~U#c0M at Toej`3N(E35k5b0N=3T%wm zqR||2Tg1e>;^O+5$J0M9`F}zyfzH68FI0EidU&dWF#S~+*F)kpVmpQqYtjO>)i$E2yci1Ws9ZdmOF6*j;Z{R}EX_bhT+ z_7HL{q at p=@wvEFyOIPKM7>HXby+Cp5GCVYS(8SmJ6(L(umWcIQDSE9h

J>Ve?A{I7-RpQiaA zg~&O61A}^9%Q^3upA!-gKUmpsBY-|xlg^vY`vBl}96M_YZKd5Vza`#5jg=ZSw1#-5*J! zs3+)bLm~By{pO^>24YGHYpF0U&kTv!QS5`u#WnV;(_~kD`JE=TOOgh3yLy;^hzRmz zQj_f;B3iOsu&$t4u*Q%kX|Qp$gbrlEaZ$Utv>cf%w-43OW;%V-rPEdr^whI+m~x<5 zw`M|AFY8vSWCK)ya6a at O2`UBWoHok}j%Q{>AD at zvO+PHDt%tjoTN;pE^=DLzs7JRS zSuPWBX(JsXlBMqgE z-c$W8L at e*0{|Hh38~si$cy-3#LZot1dE5+_s`6qXqdZk?%FHZh4IEnbW#^m+wGpwfS7uO=Rb^S2PqkO|+5H^h)rQ2irBOBF|z527=!#?v}&PHyD? zuMjbD|8F6J;j4RLma<~fTuazv`ohq4f)N at eSzbehlGKh|>{^dGx>x?v==e>Xy at C1> zy^ybYvvy1Tj}Q?GIuF at wUK9NzM3T&r*{d?~a4+vM(Gp(zZs$`JLZO8z{|J$*>ib0z zL+<}6L_5w^q#KLD)n`AYQb68_U6GX;ig!`BRdV&I!*xJesHs{*Dg!KxDK7Gt+k?dZ z%+VoADqsuREkvNJ$ZY5LUMKf_bt_c+b`k7-|9?W{r+bPajxG|Z`+dkB7U3O&ARWsR zfR$S4nt0qP^oIhA?aaaRHHg?no*3LIq|%A_6l at X&74>f+0>t$b8`i{;fBt%7iT6$5 zETLfN6nmjy(9z}B^!0OS3(9Z=ZMY}2U0AJ$3)bkoQOFtqYZdx{yr8{Cz%%d(ivgEX ze;8zr#$E%p{7QPWHzCk&gRjgabp?-f&=^=BUm}C+ELmb&xV80}` zhnn-qB&KFx4*d1l)AJs8Q^*^;_iE0wPm^{s&W-jn4q@|fM0}JA_c(Dx1=a`O%Rixg z_6Yt9>3&t5UlnqU^mn&#^JmTIyX{-zJMTcjk7q7R9?oD;z>&#(hOp-aO`(Xn_dJ@> zoBidlsJ9Ov+2sR&M#U79#cFaRliJ8d6O0eyf^SreAp%AK52K;~6R2v}vs9!K)wpqD zcWuoC1?6x_V&DS2-X=-mzu$_u at iX|`;J+rKfBMOPBqE)E5z#_oOnz7xdA^`RE;&Mv zye5J(e}x~obe001_P8d{*{_Ade!Tm?g~NLduMxB~04#{Nf$wq?5iyuQQq z5}R)19hhPTPtZ43rHPE` z%;Zg>68f90;F&Eyq+tME={*%%B at 4@{PS#5Z9v3$1T&Fh^PZLFKboReMqVbz>bm<`JRQ-Afi5jJL{H&mV(un;`Zx>WD5)ZC2xzC+D$}T*xx87xi%;*snKd z-)};w_dbV^GlreyU0Wr!NYie_j6T9>{CFmfV{bQ?th-EN4QjxhJ=bmg=l4F!2bS_s z#?E|5-eigLJUd>Y#7Z%F=g*=NChQxX$k25-bv5G4OF`ncclW5k6LA&k at p&z(6W`Z# zJTZh$yt729AL%e`5E6fC8Z7i0cuMe5rHd+R1kQs9a|RtAiRlvtbqW*y zCZetXA)?~%I%McIau)qo?^0(@O9{8>nIV+-$#Z at 2++f}TW!QR&d(GK!B4aM|YjWk2 z19X^<47xBSzw-!m+1QupVaoXw+#Y6o$q(q{?|@{vFi_DCekX><_rHmVKjRxx#}k6= zDTQ6)?m~d~OAfeuC5EXn?f#ej^2uhX6T2MyI2JJ{X2_@{l4y19h|<@6mE3pE8FEC-*Fk!u*$;HFuhrpcY77j4SSi^4Yj9*FzM5XMG66ZX(V zhoU;@D>)21iQ#QMV`<)HHYs at DHozo$ci0W?o!o9?xrf zetZ4eW$DBlrZFart;KeKjQI#+2ulL5S3g?E#It=c$bxeVSOq6U6V~Bud+SP(h>TAZ)SSHtz at sFEhGNCH3F{e at J(`qeFjKx={C?^v)Ray}% zC!tgwmTPMyxuwRV~r*37UHw+#l1!oRr zI3Y>63N8 at C4POXkbo%*Tjv%kDtGJ+B3|jHVuYk(6^6 at jo^Eku` z7jWJLH_cEwR*5O2LF=5mk>t1TfkyMHwx-Du(hnQlmUrkm`4)o)7=6y=KSdLdXa!}i z1&ISs&(lnnuFRp?Y`GzaD_U`4Ew+}BJNm3#=>yX)_8Yz5m*Y*(6Y8h>7f()mHv1&| zx#u`zXUz)6Qjla!+XiRQV0eQ%5TMW!>`@R9p$y1_JPpx` z#J4;qgP+3uFMDVsVz99j_OD@?%-od(I;XJi$vtJaPyt4HkG%nm`EO$9pYh?Zi;rhW z-zDf_G5s$f{;zcKIryi5SgQW&u*(G?yy!w7a|ehTm$2fUz=^IU{4sM^^72vL*Y*Zn_21iMyE zpaS*r^KT&nP;NrLQvrQFLH#2{7k>*8`c&J;RQ$887-pU-=FYRYQ8iPPJXO?9*zgNo zu0t18)CCRmG1okJ%lzt1oM<~!ls#2cPWbQwaOrSVG&5lpbM}+CQ65v2I91e6_%NQ2 z+JM>uYTe;z20PF;gU_OI13H4x;$}U2j6;9MkQeyZza5vFv&*Zr`fGAB|6eb5{^R{b zs!~b|^2p!wjTHJe2nY(e`MJ$U3J7|$njYjtiY~~-u-AfJi~Qn}>EpL}+HKEdt+5zM z7+H5=udt*mCz(vH+HkmO=^71ZnlcI{sI0>!RzyIV>&n-sTcbjg>MtkN5AJ(=GvLU@ zD^lc{10>?CgOn=nkvNLSHCat-lTw|Ibp27(I}abP?9J0i&9QFpWE at D%9t67%c0 zf}c!GsmCWMCDs)^MO7E-^KQFn9 at Aq`_Uo>GCalcYYwAaf{#=0JRH_PWy|uX&2Yp;N z6XZ`&NKD;apwtC%PVDGO`atTZS+PwntnR7KfWRV|r{=H8*&<90`J$l8-YBMKx(cPo zh;FU=%Ai$AoIRc>m1aHdQeB=^ZWTa60W}t>s*{o0eD$iK91-1l%?@Tfp{=cNd}s2s zwNfSf&i+$n&}s!|ySDM20 at x{W+^G?6qI&ylkksf=XtWel4cYHwzhzlXhKP@^?k!8u z6bhbR`w=es_ at pM~lygd~M&nVq at 3NKlH-FDInt9VedG?LgY6QRZPh+ZywNm|TG-UKM z#fH}Zq2w#A1m&>72AtYQzTz#;ua at NpO1ufOar-nL6H;d%#kbym6WJqK4v!g%#VFHK zDsq7BGyN)%72#Wz>6{+;`14Qz9C2z8y=ue!37OEqpWoTs9!${rm4$nw5zQfW7=J33 zS1_J;&+ifAiZ}xGjy<5jujzb{VSYw!WKP8M4X}YcrxSAHaN7m at 9TW(M(0yuzmz6z8 zu`xig?$Aj04w;=2ZH0&?sYjgxB;t3a=$2ME0vT9wMYi^1det(;{G at KN+rJgd0qU<; z_L90a%DDjeWSV%>gwkpq6VslV4PgV$iK>C<^-~zml#XiKeI3l=tUf|qv6KUEwriJE zgg6-jp?kSQ6(jZC5$6u_U9gnGrTKUR#8?86qSs>crVB*frL|uLL6UMPNw^!){7o#H zNf?kNjEOlg#>brr?+n_t#}PrmNulBp7$x&o`GlBc{aj^*BMzFD at Bg-u6^2MqZ~R}! z`R|Ra{~YHH#lPaLBVi6y)cn_416e_S!?7%k&AduG5#c9J at ELS>uxDu>vw!UPEgbLL zCD|)Jldh at rFx+k6BG`yS4s*zM>GJKY)0$b9kA_#ymiO1w8I+&HCWK($6KmtHXlzIZ zWbtd}zK~`g4JgLXpQfwJ*#R3s{V{958dBqo+}fo1&HLz6SxPFnxU9waO)1P!<2 at E8 zFQ_FZ0xV_=FR0DPQkJSro;Vs%p))i>$`^b~6?G)}Hvq|O${pqmKOedii`3ARD%O-k z62~p3W~~9nT+NMT-SP?TmWK(b8{(d7xF{NNMdPw~)pqe&i9PQ78b4{Aj+G!u>kBb1 z1?p<2D^*-{$RtkU)0CbnEiJrnAhj;dFz;5|3~g66ROlGx3jEecv&xnPv_YCZ3W46S zm&b^jXx;>zI;c%a$y$>E++iqF(y5In_p5sR*3)IfGcS zp$x#8AWh4HU#~ImrUMneA%ibeN&{t^Kxs(;~jKMf(Lf`h&|nb zJ3Sj+037ZHzvEdwrcM6GSsOCxN41m>N_;8OFEuXldID|drRq6Z=S5#XXLyHLD3o_v z1z|B4H;6+KtX`7AQ%k)ejYX~qFKIG!mPmw^Opy{qw<9La<&ZH`{X?R|a(m>pIu3b3 zPu2n40fSJrxjJ7zfM=;M914N*Sd2n^6oCZM3(-M6g`{1%bxVo@#j-p_yDLa})m{3e zJo{3fGjm)TmF_v2{Zd*D0<1DFB8hRlWK9ylJRbZeFFtz^wC#!Qf9II|tz8-MuN)6U z{`a3m{l_G${FCG at G8+jkDtuI7e&L at s5%BWLL7F0oae1fs(sfPt**MBug7Nec7DUpA at YbTM%t2*OS;9QUjv-w z3RU8k(T8Asdts{6B0~V7_gor^CRLO?ba?lG at Q1-{#Uc`FCbhnrT=cjv7a({00!r50N2^2Vcng{~YJiquG`=+u;J_tzI&r7EK=&PQwS#O>G{NintMjZr=`W%0-L zhw;T8yyxfxczS1U>}mu`14vYUK}p4nCkgF3lWs`ttCLzmVTCRrO)*D{j5D3T{IJ0) z2yNZcarOnF=Z1lpi%(adyBNu6_va5}`IuctGp8Hl+OWAN)q_eAX~Aej;d@>N1k4?t zDfGv2^`rHV^ZHOKZL2sps1N(D5Lo(00c|8(Udx>S& zlqp8~iX=a%QT>6v5Skg<5BpKI)%`&k%(Uo(S*80zIUqJn+V>4{_0j4s+we`Nhcg{z zc_cvEB^PMVp{ER`KRQErYOJzXTq0rJel=4c(ZAn^dqdkx{Yio=XoHRaT_jGQbVN(i zBk(|bS#1NnB=N(ssK_9-1hxP)-Wz6sTc)x>q{blG at 3_)-p2kbJm|)VVR?H%JnxMg9 z63NGbzIs+!@AKbs2azL{0#Eki$B at a7A6)ftLwY#2 z1LIES^vtpQkTz1=bSzWb8+8r)M$nE0#|jk?DdeDsciCYwWj6 at SIr|Lq!w?XZkZ_pQ zi59!4c5lnlr*j at fe}0HY#nD8tcld2lG~JW8g}yGD$B-du#~@X*qXz9KGt3H{WSETl(9!*0`MNM?i+O zG(4Hp1EuMksqHtYoHLZ3?Gs=_MjFBG7P>-Xm8;DaZKgJ)$)4>+Zz9F3^$(}gCe`)9 z+Vx2 at Sn6@0w$@CFXgBv at O6Xg?zZkQF4Ur!1-b8`)L5lXq;H9;xV9edsfwxBhomOjA znw1;$DL(9G*l&p~^CI&;_V)u%DfQ%#!-aa;Y9X z#4=53S#>_`lmA0`_$WidG#oV~v~4Mz%EIB^c!)SLdNm$)X^jSYIkq-!1V*2SfMpeQ zvKXO%5%ce2TMV at 77;2PSs{TEFV{4b(YFc$NdxZ`%oH<^N4^qZl5wkrev|q`S(9?S2 z$Yvq5ga}Tw;IvC$C2SyArBxjR1}^yAzwL?H?dt^Ax8`&O64U)hFyw5X0NWz`lYJCpx^9gW-WsvlfXiO3 at dA)?ygJEIKdDCn_x)^ zywm_32ftGx8Z!{0=CEYjaar*zK1gHIja;6GRUWGpdMRP=kVH{i6RUvpd^T*5!yn;F zIU4tzoPr2jn_7YBN=e_`V8~DC4keq at A}9rS{FVs9O|@(OYPSCws-N;MPI3`BrTI62 zh*UZf<;Y77Ww?BL>0j7qXT5|vld)prJ_o3rj<~qHoyE=TS7QYC4Yml|Yp at 9-% z7kDHeV>?P~TkLsg2 at lW4o&`g6+4gwfwCmk*BEccFfDgAn`44^ION zJ=te}&?S9b`rg-ML2^7=!L1J1R!@pRaX#C_b9)Pk3Psv)53|ay3dQk}Wu=!#Yd3>G zJC#(%Lp|!>5}P54GZ6WH{_$rNK;#bs at x(rT3o}eIaE${oEsmnduXU-v0A|m)S>0<>e z0mu1N%yFu;!N^Hqgt1z17I)g%Yc0wLRmLeMZp7V*E;|s5-xtN(pJl({(YBKG%_feYQ>LI0}R93(RpFAYzHTxS=bFq76Whh#2`<68% zG|IP9wg!!Rz$#y*+ds_%JdRG5#s+};2#2kWsteMb9Vh(llbB?JnKCONFL4#cSaOyX z^0G0Z$Vll?GM zRcP=|6c;ao0*T at j8(ghvi^{<}AoCU6W1Xgt;QKY8hqTNtU&W{T>!8357~7pD)JNn4 zR3INSH$r at 0+BsUtOdwuyVoCcH!3H`@H>pysUdBxVPt#~Pz z7*)IHJ+}7B+rAt^(A!_dt0o8(S_EA%J;m_Dv%NqPPTN9znh93Hl5&AMNDuKH*lRKvx9cwxQnziM{RTH~n8dLZrD z7?rfFtBYR4ncrS8)g-(Np`pGjj=E4kSUEUpc9-frK)G38CERWpvK#tf%|^jn-50v! z(()$uwTp-u!t2_XYkqBbjfmRW^U?C|=ll&*v%as?u8*g;y}!`|m;n*Rj(%G;#NW1i z!49V#Kn)DH>zuIe8nO0)ZT}+rK19)5HSD3c_MV*5Q)H_9OrrS~wb{42i&FEpintlv zvAKi0>w-y^{Y)@;0)BZA=WeEo5@}6Wm47Tb(>a at r+Bj;u1O7HSK-phEa>CF} zvFM;qvFTvcPGj{IhKjK7jFMBQM%#%tMEOciaSmdib2Vv$-bk8~6MG;@$84I0gCD!sH8;*cd_KkBzB< z_Ip_LV?BB^Ic%qW^|-}$Qt`ya1?*(DxY`>R?@mn-%@;xwrMv=KxZE7909$0F|MkV9 zj%`?%CAAqM_?`vVridyPWMku%-^3@%TZfN!uer;vcwY=@s$K|>rnaODf&H2F>Cd)Q zP3GJA5AN%#fz$qH*^T3_ftAq8ygxZR_wH}OC^j3Q%gDH=nHxX9{!ka#B$Jg?UzOvz zQcm6M9AQi}WuHWOobQxX z7PpJFVC9(6Oy|e%vG0}Z>>YFRw#m#<9eLM~@J;Kq&jq-8w>bbGqVhl8D5t*1Qn)gT zMlOYtf5hB!<+oaco4f&s zWiY?!cIn8^GgqKg#P)r_ZEiac>Ex2}fZa#3c&iMDTNA|PEfYrQbqH;k2#Y2!6DUoi zX>uGChY}%9r1 at Mn%ML(1|Crf=$jUj`I|jj?E?6Eo;Om*V7I&TKU z5MW-g1G>R9r(1OglmIE45pd#0ZeZ+vGCrEa6}z26cE2kv51JZ^79{m24%C&&ct6zD zH+s!#9kS=qxm at N89gNKG);~-mGg!;KsnxbzyrHwyQqO~8dVC2wrOVN^7$TH$%DFhy zby!T#)XBContJ=(RLQj^;PaF3?Uz8ZX?j={2Shn((2toZan)T;!>Q~^eqgP2N(J|- zIG^-GMjjtxeeN`scgiLgc!(8!R24d~jXhg$m!CiD&3 at 51ytK^oT=6}9;W*1_8F56j z#w{XR=?N8yd|emstaEM(;VgeShZ>db>28X_-GGrpxeW->SVd$PW?b1%c_3cX+#;jc z31}*`(1_DfQksXfV07p2o1$05)!~r3)MM@;Xz4pyi8 at -5wwP`~Bmk`6=tFT`&4u4p zoi_ty at 9V5*ik>^wz07QH2sgeKw^^36d(zmQ4}P}85*qAsA>r;28^28plI^VBeoPD4 z>HQe_D5oD{!-Mic+ojZlxqcS8#gC$JBp&qSCRQ`8(&VbRi&AEjWdElhO-~%;!*k$()F4wC2%jN(yB*G@!8F5jnl= z0O|6cn4NLcz?S-Ak@~u86+RCMGLv~v{^^qJn1JwCG$Eyo_cn)k at r7?x*1drDODVX1>} zFx`Dt2xr`Ie!W(w%;TI)mK9-zok$=OSoP$mL+N4%|LM0)CyV*s5wyXjFuNEfC$C_SzIroik}feZ2wLbtENc|cKHm?W^k zN`VQWN|XXHe21|P;s~GE&&nu at r$+Q2IwhA9E3F0*cwL@%tO`8pi1{4;I^{3gdC5hd zX6UV!Y=wcKf&HjKz>B5`IfdZ67+z2Oo|QV3%IttXv6Zj?$qTgbLVo6q)c(p^(EH+! zy=H4O>Z)X{bZV4yYy_25xo`LqF1%qoyvvc`nkRP0gihEeP3r#Wm_j}}tsClmUl2ue z)8x2>#k&tsoob0{U5}3L#u(ulsAkbptlM8A?D&MyO_5^! zVJF at ZrBSiKSN_3v_HC#52br5*D(D*Zv_%o9DvlZfn z3E~AR2u2Qd9``itO45l(SIe~RxmKB|lmoz=$LmSp=`XMJkAuL>j}~`50ey at r z*bEOlF at Z!bV-ysw=!!;+fzsu0?&mw&%;d|4=Y;8QV!KZ^NJqU9(AMpBvnN$vE1~`d z(l6?A;7u^+uUL0S>{A#38SDKtpxv~_3eoG$X4NVAQS6?ZW|YNGH>8(;0B6K7+_bI` zCW0h=D4rNqsrT9~{lsScOb*{YYc|AAvM$6Nf)V-8p+uIZhKGW~46wvPmNzvt7A_I6 zhA8Q$C~OF37X9Yvkb6NxB0$EJ-0>E{m(CQUR8{&^fcT7`-d!{5VZxTWs z%m7C}oPiyKCInZ%2!xX<0L98fWo(E?Gdl*UzRpCdB9qY+y(`Y>QOvCX9ypRPk`=%( zgpS`YD0BD+x)Ca;7iPv+**IAfJ2R-21divLNU(#lN~ z-C&FPV~hDm`<|3{(ht97_BooLKYk}b`&4m{I1S2kKHQvo%p0YC;(J<;BytRq_|7Dx zY9<$Fzb-TzXllt>XGTFEU^}x+lN4~sIda6CUP at wou)WG2w~3_h5N7>BJNxVrH%+wF zFv8&GEO0)4?Z_^Wn5h$*>T5HhF8B=H1Uhtge#fKgv#Ut_&Pa5^yLbg#PfS*@;k2u~ z9@b03w^I*^E5^3yh;LVNa}**BhJ(>f7V|dEw-BBS ztY6_QyM~9;L at pXieO>(`Z^1sLBoxKsYv&!q_p%efj*;x!y~>kWj8GZ2+ua=Cg)>-< zG_V64p8$vBF7Sm1)*j9XF}d19p%2zYye6+~I=_V at 3=gr=E;)HG!f$}yR;NiIWZl%Ra at OtJg0tlg8IvxGjIMbXTJt71eGjQlj> z;7G3+HC4mkX-&_3bSXT!P_X{Q4vfOGk90s9Mz63(d`dIiEPgTjn$1#fPfAS6%VeG4 zlliNN9Mc7jsiB-juV;x0JPWs5pw4 at 16p~1nD+ZDX*OAzat`p<8#E~+bp|1<$*O^oY z at If;vSd$vZPxVh_*eBuSM;QXvW;(AfvnvTut~)WON at b4)P3>54ab+%*Q&k z+>vkiSi)*4Z0EnMU~13L6k;_y$H$Gu&fcZ6gExQcBkrBad} zvlKPb4k6J+2aGuo3rxasy>iT&{ei|^PmX%`@*#`!rJ(0v`jyzk}1B?D`xFZXRMQ;nPaVw8V!!tBeFC{moRyW7$uDPo@ zv@~1;O6N(IceaQ0f~301%d7QfZDP#L*2PzNJd~^I#|eOYj at 7hCdL1(Zf9iqKq at se{ zIAnDFPH9L_(B?Zzj^GvYA6G(gcUX=fHAtr0_ at G@P0$(=LtiGWdkC)o#Of#=PpiZ+< z+!zh^(H~JsDJXEn3|f^9Fm1j}N3U{2GpDtW5S{GHYY#mLC`72->x6S>_r}v~YO-l0 z8#tUQ6GK|rr>jbYz_rSGgp4^Y-D+~biBnqR7wvJsC^f#aoun2VIY3_A{hmdqN&zhQ z`H4knwE=54DV|?vZMsdQygfCOw^$vwWIcPWItf&lkt+r%JDb5~O&2UjKsLuGAV-W7 zb{wX*A6HxKNimp#-izqe_gKdF53hIL{#L^wkFm=r9O|^Ghkg^Bo9E+=u%TU$^t0!p!N6oFrUb`#~=uCg{7Bth9UEP>A z!<$CePQm6EtSLCNeuQ~9)STLQ6a7l_b?97EiDY;X3D&?jP2C#AZs-6{zwXct7cQ_Se`6?~mDLlK8e>|9%mYR>Jb+9y zvt6%O9JtwtqV6GExlP~+#d1j5(K0>8EJD>_(Kw<-ezV!)B4Q(2X$Moa{l(KVHf>`j z+EI5zlRjYh0lNUgJZr}*j%D7n6{*Q}XKEsQM at 9(V(Y#W8;BvA%JJP^?jQ7`GF#XKDfcEOu0$ zDTin}SzbSO48<`>rfGJhM4{hGwnZl`10#2nUJ+(>YujF0SxnN6D+CG_nIU?#z(b4 at C zbYA6sgSn)2XvnIW2ye>=#nj(w$nsj8MB)T|GOr?RZ at -3-vr3cVa>NAKrH0dR6P52j zFyKP=k>-Rn)h2&oM;8o+511)GU at Uoyvg9aW?%9j6=DGtM%gHz_<}+_Ua6``}^VeN3 z2s{D0l=3L0{3 at turJl(}DE6 at UMhfkGG`OeOF|K=9Ju~4Vztl3-A34Fw)SRgqjj7ki zWSkpJw- zco$8kX?#@%L?auvQX>SKbQsB7&E-I!3%XBozE1u!PLJ4SLpvaMqWG1DW{~Q^fH7;r zzS4PL^P9YG;DaK>uS$V&I-2!Ebtx2*#H&+}eU(EKb$2 z5CLJ^d6s-Zpg!_|GB%h)o?4te=+;oZr&3i=ZVWnKc!TNb-$6AYVL-KIf{(%Z?6w3X6 zV2w#q)*@0H240Buj#m#n3(XKC24l{7!$^>bx_z2qwOuwN)P(80;_k`lCnH;S-q;~^ zMx}aY*Q!G9sYs15HB)UOBi^_ at OyO{rf1sLfO4@$YzwC-V zi0m=yA^u9zSey>ilT8H>Y|n?aK$uaH?8Ef0L5900*f*;XZi}&RkRjZVNPprZ-1y_^ zNe&|Iivvfx!=id%-u+J at p4j4`8?wjD?G&8dEIqoJ|24unINd at lyfhWpA${k5yiEZJ%^gjzV7rlXnujdsfVK z{dI$m)gY!mz^7`6CcJ^$jx$azxrt$c%iJ-oCoexg%N z^6iQ~$R(otNR at s^BNoV+AKX&dV1EOyj?LVsKe6f3^mbL8_}-rF?pUARVvj#7-dMVG zKYHfAUX+{V$Hcn>Rc{IRBjogH`h_c5bLPRp#+phM#B~Gf&d*#QRl at MXy-?aiXS)Kg zslChR)3hxe?6;9_$TQ&vb)z1f|Eb4Tr3eh>nt?IgDF~zWJiLDfG14}avS1?*WvLMn z&gVTs at ML!6DVh5s=rk_uP;o}UguSL{)SlHTq=A8AKx2V*KtfW8xZEb(vH at jjG4_CV zDRy#dH8m56!F9uwKf4urbfC3(%4Ohv)jw(2*4EVfospQrXKWsR#u4AQW!FsrZqG^M zTgbhw at Jo|yjsRkx4}S2E47{B{Gw7iPP!~0tBsH956?0_$yhHTS0MJBlaB>t?CA7Ac z$-XHSl$$0;>&AJwSCy{&=y}jcrM7St_hmEZ0ZIkbcJt?J?>S(mY({PI1TR_4z4E%> z>Ipe{Ny<659;%6H at TQQBwzI>Erc{CLsyw?fYayjsa>502t!yu=f)q&p6DAyeI-i^%<`EjruXlLGq z8zio~L^FO>1&E(z7!i+kU!fB^jbxhzU}h+2-~n0ITXI3DTs3OR;Ouk{nShb4$RY=M zS0qs*b1UIy?hx19leilqn)MWJ;<^@rWZ30n1^D14INb_9YO5axRp48dhL0`3_SvoA zht&fa;?5gNZK_?c%PaHPbH+8T(9f$59LijPRMkyd=P>=bDv==E3c%e8?s8RRSFwV{ z%DRUzE9447b89$Vul)DUk>Z)=B$nzO0^d;+-7>4_yk42tF))(MAlXJ$BAy(V%gLYj zFm2j0l}?@1?SNbM2v3$=eXU&HNByJ6JOOXiuDgMa!3Jzcmv;+>UZ2qAPWaJ at 9{aNT zFB}Hb36Ir7=@O8cA|aeuZ_5^^Mp at DR%h=FO$A+ygzs9Q?>>-=7OtT`Gs{DLUR$_Kf zvGWlJ-cuj3Er0}@zchVOQslbl!l8WV1u at kw)EuU<6?nuFvWd!1c5eU}$ z``(;;E3OrksvmboES3N<_>^1DcgRqI=di%xRK1-G$(xIs&q~3wa}^ zePa{&K;=+SE=f>k1pQ1qI#iWZ?PxnPn$|?^q-Hc#RmJER+pg+`B;&x5y3osu(*MKS zJB4Z5E$f`*{EuW26oDkYf%h~G+qT`J6&2Y+Rn9) zm|(-0fD0)r>AhM^PrZjUZz;>EmYgYB(S|8d#iId~;dnN${piqMc_(O$C_&L2ddyO- zk{G8#8!|;DJ!d2~%vDPOf=UM zA|x)SZP~OgqQ&!XYZ6YOPb|JlUGJ$iITbjSx=X3EBcP}bw%rVdTc)}@VK at He3LR5# zM{4eZJzaN2Am5Y0^O}7yblpEw#oE at _k-5`|W?k)l^Q##ydRf?_0k7o3 at MnwWvmy8< zzwmSC>6dB7xvn+uR%uIY*(LpAOYYgW(x<+P`KYdl+$|VPQe2}#$oWiRZU*1L zQvSH-FJbBmOIAxQZj|aac&8!8MW-qNwRky<)i#zi+*hH#R+14ud*&@SuO+ at ZUTZ9I z+S8KUc+yt*OeHUtRTQIp`4fM;SyyHU-?K4gkZ9LQc%7;!(KbIz3d`$++ at U)nD z|DXNfdRm4t5T|N#O72Yn(K#iKwe5%uwN%ZSWtRD+Nb at 5MR+V}Epx2L74SJ;IoYJUW zP#y6{RhA<=Yxd>2&z~;aB8O&F_$r|aOJ@$fMN2qTx5hgfS=DT^;)t~|*vyW#PI~Qa zvYfSgZF1bT)oY%%OY|PCXR($oWcejpxR8ToS92=v78Q!J$-0^U=Z{SmamWD`HX)v@ z<)0aDoNde>d=VC?kk~G$b3WCG)g)Vvn2<3O7OpzCaF)Is&WYP2dDLh9qvaIS zu_F%yuhrfcO!#^T`FcqCzVJrG z)u+VOErD)*n*8kks0y(Uk2vfZ2XiRi-ZCYBc=^l7pl4xCp=IvzO=a>Zw37KPDC2y~ z&h#$pXnox#EcI{C5DlP>Hf)Zz@}3x$=EurP+hJ2Q%0 at NOMzt{S^~_)u9%2?gWW;`* z(bKb$JXp5M&O~;#IY#`Q9dG=; z&v$S!dn7y!$5j@!jPDeqtRHzVPCt>rXVUcEYy2FY$y7a+WC{N95dGZ at Nh;10J&|CE zf*8FQRPf`=oNO^EaVe=QYyzp&m4zv+1Q#Zkm&DGhaB2~d<5iXOCT42-nI&)Ijmqgi z&ZKqit?XmBj=9;l9sC$)y0KFERDZK3Y`9t+Tw-`)lPeHLCG1WW+aNx8yIc!v|H)!c zZn)CKq7;eGIbop}a)wqTb_PMG?!xn|SZ^{{<0whCn2!p8XDBJQ*L>T3GG=l52p{OeI{z;=G;IvPMJj|fp^F~Szn z>a&ZYAUIY6q#)4ZVb~ON;><1O!Y=%ST9$-N at 8#!*;xO}s(z=pt#-ow at bk-@~ahLhD z%-j9SGd>WNM;ss~^OJ$0vWoMOirkSpd>tl8$p=ae&X$_N9XEau7cdEZtLGu4Wh4r= zh4 at oHQOQF(=JdVaTtlOE!>j$MgH=3ftg15sYy?qFVT%EtZ8ElBJ2Bv<=yaB6JEoGU zsP!U)B?v%{p=R87)S9c->Rtg2g3EU^n19LkQGx+R{HOJk2eMmQNci{V_%ZBUUUMif znB9BU9_D>ZQxGU%Bt)ZV4=$+X;7UP^dc>%`Y2vmxdNm2 zhC=SZCqyNx8JvTQ0~QIIw{&(j1A6$EenOHD13h{Y-?h zYDk#%US$*~`EGUfY5G-nvwR^@V7;^L96ZMoG+W%Oapa)GSu0}o_aPgPbk!PF&@Ek9 zJN!|;BySH9?Z~68<~l-OPv;0 at Fk+12#=eBnFXEsdTv_#RT;cC96W_uF13p=@CS}72 z{c#j!o4J?a0hAqEupKYR4+^5E89OGAhH+cz%bskNR`M-!GZaouPBB$0P0QlOH7w3B zYHxrZrBe*Z$N8S%jruqdpD!fKFDOjAU7lAC#1rnQec)(h+Z at R<=yM`EL~T*cqI9hV zY5n+ at jX|vOvF(!v(=jT>=ko(*2w!(B!;mEa*r0R8M-m5gMcjh)fubT)kzp1X zE!mWeGuiZS*eW)3mn+c-KTStwt5G*u51pY^Or|h;9oVC;9#Bw88(8}oaOr*m0^HKq zqkYTsL1Lr>ob#KKQ}EGJ)gu;A$|A|wdHT>_QeHw+zE_*;NF!NwdMvr{Se5F1C2vU^ z?auq1%kAg~#-Qin$nRUvqD{uF-%9lATsrkMs%jL0puW&a)GvPQGzyz+)Ut(CVh1jN zan(*GqUmzjoqj{4&Ld059Ao)RCqXm0_8vHvr at 3uc*=oowG at YZ;sbyyXsM{(CW9(pg z+e&u1>@3>ClOnWXiW%NmvW79a=7cWw0O5sd$@v(8324=rAXuYKYuAtqR2Rq!?eaKH zN+(g$%k6RAGw|*1TpJU?TVmr>E7mZ^;!r_`UZ6uKq(cdktNIOGCuf2Q(~Eo!IRtye zx~m)7bv9qTMD{+Ves8e}$W1dGVoyMv3D_}-pxa#GD2AnL!(c)6g#9S1J{{5p=(GhY zS3kKhs9rDV{?H};P4U(gui3v?2 at 5Ut^R2dhj&{2}e>g*#pBg1;;7@~M`FX;E=?Mp< zsxZq~fE*{nODu(`y+sB~T;AGTL33>rb~sDi-3kb0A$3XYCuk)4eWj78X|Y)9++7p5 zT@*r^j3OT_2tHvXQ;6zA8J|QCOB8&+L;kx^;zrm`>p+2kxDbGV1pmJY<-cU2e*Vw9 z&EK{SmKhG(QWTch|ZVMX&<`krC= zH_?li48h>LjN8XK{~^q8klT&TL$l09c-K>z=N#{=?%(&^&pcl5$NbO!KkCr6FfK75 z_u3hJII#M?cz%Ns;_TI}Yk?FF9;p83&V~jxdxFz_ at fim``LK`;iv80l{9?Kxm zgE*=M`Y5W>Nm%d}%T=1H(pMCAXzIoFGIi9Xh)YQo7pRfIm_`oUSPe6nNm)e}CQVpz7G_#$s!Oq4Yr?S;5VGV?okVETRwBiC0ZXIDz at w0X10b3xt4}jH zN&2?e*(H0TFwi0VY}FQ)d|ch6Xwj3(kt~Tc3(Jzok{gDPW0ctFtqwFNPP)`sScUmD zRV$0|bV%DxN5Yj|+N(p_#h=8wfjYC`Fcw^JkpSM^Lq*p(hUIQe%v*IJ+%c3hN1ccJVfnRayf;{N$jSs%W0))HYZbhN=L~ml5^%t`^u>hvv-0_9`h_T zbHKP(InGfDi7>c at +XD4PR4A=x(P302 zf<{R^jZrGH)k)(VUQEt at Lm?0Q?O=Y0m$5K3?lbPDvBB1-`=QwA$ zESE06J~9KyV$C`#u~uCGE_IHsOlN~XVRlq{@TAL)>cAY+oB-Gp6Awg3Kq>13T`moD&DJI)qX7Rg7f at FS=W zlTgb*waQd|b_#8FK(EzC+?Hj8Ej6buYrWp4TKq36?{||Zf;)O7GX7EZsnBAQ*dVYqO?yd*L!j^r&E8q_XfkVu}P!)!TVxUe%oNU-mPld|MG)`t-Z z&}2x(Y6q?3kFAZ7^q>AK1MbdHl+IWdZ-T6o0&ZCjIhcs~KlYqv z+=}a{$emt;bb2HYT>@*AD^UyN+IV at 7HatDS&F-^qg>=7ucL4vHN9aWx`K9X}WIM1J z3&>i>YME5Tay;<*69~;V3xr)~2wCGV+UEL=ZdY1X1uQ5m<>BBC;8L z6Q#<|dK2di>UWG3gP_dEC+#{2%`3n?j9_b3@>|b1$;s{GMZS_bCb7qZq8j4c- z`;-3!0t$r$0uuf2mxF)J;P`)&gX+{jO>e?yo)(Rr`B}$ecA;a?m?(w|S=W$bTyCYhAmU*f4RxH_Q$HZ*Ewf@=t?0vs= z(W!601&lFZgP`uf8iuB0EsC%b;vy`=?mOd;o(nYmGtIza;WdW0wXry3yyNfE#KONf z*CFv-ldp9Bh%Trr?|dU`4rO8wZNP-f`T&`8VAPUF&}eJca*idZ8CiOKIpHoU6S`wc zR(H+i_2TfR9 z(Y_Mk_q!L`q7JUeM6BNHv=t{qB52hj#u%3R_cj zf}(`#sYVHD1EV+Y?ueU9Ook|#&aD-0!vh2#aVMM84*yJjiD#E>1Pp!5Xi2N+PeCH= z`YNLrwa7MoYAWS`ip{Jw>eelUqMA2hC0VaZA*v#3ZX)npCJgjeo|GfhC`0j`o^4 at p zb;nssP)-4`WVLonxyj|(gkgK%&e?tvX`|~9MVcmGZ3INexj+<;Y76Sztd|-yjp_`o zqxZre2m>iGsGm$74l-gO3rt#bbcM*5ix+s_B)>2LtKWjjgr|obm}ESP`R}?1^!b!t zbn$EtIGZEV<;^4MDsQ`43#lq(1F-D^_ at 7#V566}zf|RA)rXh-g+-KcZZ2p@<{6u`GAps>!m*o}`jQNQAW zU)mvRU%v{q9HGDtuxLeTTsuGiDhG)}pt z{(=YS at 661q%P17W51acZ-A*g12 at 1_u$+mbuPiA{hcRQQA`G37V;r4>yRfHLk04SJr zPejy2VcH>vjX;ixF=7n at 2`{QJr%+ZCVR#$YVF#9R2axD>uAIPZ^&sqK(*6Z8vC^v6 z%=)cW9b at +4ZS&PGD2U{%8Ja&4%^XVw6f80#$Se9 zX?KexsANsN(+sFI;DE0}A$P1$qn}bZiAcx5<7TW;$ z75tl4KUNqgKL|mSKQ<&ch0Jverg7W9;R3zP2NPX(s*9=|yN4Op)G%P?pedzlX;LIc zS;;DcYV1f(Y%WR9QHAj4lgIpkCk}cD9_F0S3cndR3BO>>N3Y1modz@;b~KOUNiO>1 z>woy$#4(7n0d11b*+o*Me at 4Iooah?iTi_3Qi7tL7ZRE^gCC=^5AcoU>ObUbF`y7$b zEeuiA>*?IGe%xZ+bc6ZQmz#ynBGi!OBve>eKcqs$uPwe1eT+oRR6^o zDTMzK at Bh16{x`_z{skEfKe+}=zCX6Y5SE!}6be#*N#>4lz9d8m8YBV5f;KS1ZlHyx zs59GSKw$(EcZ54MH(YjD+JxHQ?N at 2L4=PIl<^Psmo?R|Hnc$^ zeZ7c0>}w~>bp9IfTRjAJj3Vv~ugv`SjFt*j*21bOY&F+J!D(!OT6SewbB3C68fDVd z<3)yLjcOB3_<4z-aB)F$wTf}Ik<|7EUyF#nOQm5M5Rg0rh){7Qskh*?p>uA_I6TM52y&aE1{Zt9VOuSpv?1IeD zQf~78e}Rmx#TqZ5vCvqLS)8c}9Bn`}RzlXD+;*07Jg1_?ZmYEH0*`h>^}2F3!m7#? zUF`}f at A47Br?g1Ca>>1b1vC-GL z%FDDQ;_Osvtgu>jntz;PjHbzWw9 at 3Ry{9 at mcX)v~CNKsHQt8c!u<;1|fpc0CwRw_w z%csP|CqNYjZ at SSh&J;s15qH0r6&0HgR!_9g#)4T%aAmE)>&#DP9JPSki;KCh!xfAO zu#_)@>HbDE1URo>VpeY^uwT7onCUuBjA^!ZnkFrhQhkvvy|hFzUKGu%WHw? zwXQJt$9l at 6=To~B-H1b{x{(_938nS9W_%?1vl6@^EZ!0wP~jv7=4YH5XQV#t5;y+v zr`Sqw^{F`@xUhHEaR>Z$@LlnLz!`#nvfynLV7ACA1``(*68`%CIw>J!W!P#)4rYiG~Kt?SKJW z#{l`Wpz?+(w34Yofeu za}nvxE^d;T*qS9RyK==T?t$a|PPH#QME)TecA^v!bVeDXJQx8ru<%_xqc(K!WWvlt zNN{ZtI$=sK!GA!;_#cpA3En4prF49^!6#V{MVSG8CwcB$%|&@nH1eO9J4Ei!<+{9G z`18Jo?^HzWNwVAI?72__5 at YIm}<3e|HixArQX+xCL38T^E!>5Fy`UVru9g$tL`a`0B=7?M84G?M2M;zC74 zb44D;?6kw$F?@#lxFXFWE%D(I|6deCM>vOCpkFJUtpk;cZvW50uuUfR|8=iQ$st~zuz5H44tk2S1~A7(f-FceU)rBJTz<+Z3wng6o=5E zx3{PziXkTyKoWp4_F3Yd^}DsK+C}%gOZ(ief)K`o_%iRdzF;pl+JY(y&u2_czaC9a zy7xFcnN9cjbAd7hdH)DTP|pY7>1)CloNTjD8_J4U|4|n9J{SB7Bvzkiq&SoiVG2+P zKwlZksSBBe1oTbv`471!PITEt at _vTzfFDmlf_($xQ#UBro7_Juy2oUusZKm6#xsS; zHR?z(7f?9G_4kKZ{Rl2pPa(9O5|73#Sdt|af0Yyw!jca$V3)@dGS&~}6;-1bRk0dN z+}7!gLU|{e%ig(|RN=6={Ve{Rr*BWTTH2_d;-l$<3DAymhu;tmw~GO4$OFV8JxwaF%O14yrbPlp#k3rQIA z1b5by9DKV_3$Kex#WuXVM9|HISa;KyHiI8yQ!xp1B)l>UHILl|s&Nw|`_nVCtaQZK z8UMo5|$*5m#p!C4t~OE5==BFy9UfOKjFD>6=G+QDa3w=;*m8`F9=nL z*?A8vk-4A_Bv)vSo%`T)gZN%MupIBq3r_BHKgoijZlvzf+eQSoM}7JlX at zzbeh3uy zj>u~XQoF?LXx1HUK29UKkSdm?lP%NI^KHsyaah z@!49n5mkx9h*fEA=Z7bw#*`&QzX~TL7_lt8O|iX-mvZ9NFf*a)c52Ej0D?H`Dmn;)rY4F%81sxWcDa}t z9^!KFKpO39!ppmgq^e2aHGOUg)gXt{=6T|&D(|50c4kJkM>%q zb8c(e&)oa_`9c|B_t5leW!>h(*rVk^Z+7ua3~=JZ9;crfo&m$#-zw4fiap#R9GT|A zBcZ29(DWLKyy`@Geo}#@AwS1&2%-YuizQx8w&EgMeKn at BR{9?ZAtRqJf+$f3sOTsu z*bc&$=!k>n>x9H|aTN1{Q6S9RPr4mX8ALfuGhBu_D*`<#8Wr+FV1zRs9eLA}Btbhf z2g3UdNaDi=P2)!Uf(4a%=mym4MDeZWz>6 at MXe_b3vX&2HvV5VS){GH_Ta`*w6u7x5 z-?=lMTwSiXCFWVcn{2}ZFQ-1=>hNSV>p38qvZnIvNWqME4YGNg$08Hj3^mO&-YCWp z=#Ik-(+i>Kj%iH&V*oNMCu;*}s17stA*^;F9Cp_{>Jjf>QMU zG49k{s2*p?zDXIPQ;fnbC1BpgrzGbEMJmf~u|lrKNgo{DGK^CVWNyAPW?;OUe&Mf at dWz|^^$XUrb(v6y%u61jM7 zPsR}quf0G_gZO2C^tl*`M?q`u6*9+l9iDu=RISXhB_3vJjtwa` z>f$@Ko-i%TA=M#&CE<2bP`IH}P%Upf)4-iY)IgmL7^C)|P%Jm&SU|Uh0%OH4)7D%a z+&QbwPCgziR*P{dfS99V7X$wA#@Zv*eS5$RHu+E0o-Zu^jxemC&C(4b-|}o&96D5xs;j4~--Vz1P>>g=|B-OipRQSVlpTys&~ z-jkh_>1ZiZRklfaG9eNzL9Hth>O at ymh0YKgOi6JYN@aEi``WZVm~9;HKkOU*lxaNB zz`QB6cC=P*Hb0ksUYI~jk~yH;W$5SD6AeYTXy5bJLQ2 at a235y)nG7;AJ!!xmp*~ab=^qQu{6E#X!08Zc5R)PmRU#*XPd~rI!*f{f5RKn58RA1M zDtw|yp|m*GlJ_Yrt225#dXbad7|orRh-r#(ZdJTF*7h~jge;iQS at lBou6)J*CRAnX z)B!s08d8jAx|c^CpgpR9-vA at W?1UXKwusDwKectb8~t<{t8qX)3gredh2cAB%Jr0W^O8ks|9j#?aw=7H|@B*x2}L# z=tdu%6Dp{Jsawa5u at NS;cW^YGzPlQ6joT>Usu)93b at q5_e?QU=_fbK2MUtLArCVCl zZFkI!i3XNb&Wr^>Gji=f^#diyVU^i=(lSCAznhB5n8xk;}6p&TM-4*M2B;tvn#YI+$)GEh{hTiV2;h*RczQ; zokKb5EQrqt;7`_y##Ga*RETubA1ch_pTlxN8jF|~w6Kc(Miy+PK*$j5bD&3rT6f7@ zFsSRh^K_qPDWb^!A0|fswytMy$bztNh+HwH^RBR;L zWxS-9^eeVyPgwL);UPfI_s&q;ecqtMumxMZCz)Uv5SHv zlEL{WmiDRm7kBhRti@S*6=@ zU^T7oR+nF4}|1ySWn=@5&%+rg&QApzkAs=LF5P$VdmZ7f at q)`CL7eEZiVccxih_M& z$@y*}s0>{aXuO=EZIPUVX2=;PNx(S;!nlBbqUkhKGV)|j at 0(w^hfhFSI+5A%Aanug_E2?v zS2Srt<$=5*EN90&iM>|d_X<`H!SjE#{{?)v13P~L0lEH<+W+cKmM*3$7EboA<`(~t zG5E!*vi2J)D7^IdyOWEI3zGBjP{qOdlj2CBYy$a&rV`o^>5yS!L4#MOZ!G)E#^ABK zCvb#cBCkJf8i2w<`hc5zfmP3-5UAODuLU-&xd9|#u7mx4&wAVL+wI3X>(AdGZ`eRH zM%}-NJ?bHF>FZtN?WM6&VhKW}MY{sYv}+rhl?F}!nkUr(YvA!XmQE-Wg{uz<;co_jS_^C|c;1y%45S z;F4(Q-H>Q2yHOM9q$`qmQ7AA9=n3QUrDmpJtjx3j>1lir04ew3R6h8Tm|bd(HA3N* zRTXPFHP5ALe<85=dr-sI4LtpA1Fj)A)Kz}Ady;dQ7bVKx5M$eL{soVm(hrccpvMz2 z5- at 87W1K%!YVP2rzl;r? zyM?}6SkNG^Se2l~=3RFYggDM8%ZN4Ic0u0clo}cBJ-XTFvrp$_E5`SZdI#J&d$q%X zFZtzhVZACJKV at Uy0)O*C%(72 at GCad!{*iDqSu2G47}q)!d at IT#l#EGgjb%DTrWxfP zLl at ndLoR&dE#eNgS- at gfH7MY&XyDW2)8zXrMgLn+`V at h-_yt3d|H7FO7k~as!G(&l z&C3{lh;2s0?a6-LQ^4Q at 0J-m;6wUu-S~MLBD<@D0 at MxPCKjVpSO;s(ak|;V(*!9Ar z4?YLwK||sdqn|d-B6{HLiqh)2`Hu!y!S_}s*vXO;)4DA>d)8L{W&{O=O0-D0Jr3zBfI2QiJwh+oB3W(I5^C0-lf|DH;i2K zse4w+bt}(q-1;pk<_z*wFXx`Q_(!w?DkcPJyZAm4Ep7We>=Oo_sZh<-GGLwHv4`KV&H} zuUH{&bxbNBKXwW~1UTIiTx7GCV=aSbZ`_`*0nr4)xjbW)X~UB8R|0R_9` zMGFbMSHzk9!&Tu7e0xeVRFg0xgG+^6K80YjgS_H*YJ<#g at ZkAb zU#!!1jVtB?d@=`qF^76e9h+aBV(uU-m%ja57#6rgSc!ik{rknhceL9!Td_5WIw6CY z=Ic(iM8T|YK@=C-EP*^5;0?cl|Kp5#JWzl2-yr;_S;X}}vDV6_|24}sJ9*}x?&`?z z0kjrfw6y{Ps4pSECQ%Imk@})=K}c9pI2Kl~%$mfGwoTG?TF5V9JsyjKIE%fxApdA^ zdc83F at rI-paI1`L&-!X53H`4*sBy zCNz{vO at +tksZ~EOq zPvz& z1XC(U$mUKpEaw?JKQ)eUG~VB0t0>B==n4<9X}uQc4NKx`-bI;OdYEzTxKQeyU0itC z;W~qYokFu at 5$ZKLvCriKbAmA#6)^%+sryWUpHlbRk~G{Am)%i%#CBt at J^~U~*`vT1 ziy3C(`<_nWlxr)^u!b6^*lQUUm|4c%N}>}QI&Pb`7YS06wL!(}q`*KTt~mhj?T41x z6Sc+>25+uqF at dBp{*b{9J79FVShk89BmZ>`bf)ZJpUVzGl8ODaYh&TJuxIisuv^q< zDcV^sS;dyv($6ytUS14xd{@%Z7tARpGO980lg~dwU+W?lwd;1f9640?b1m6^QxUMspkV^<#VItsu)OD5@$Dw3A4Z>lJYUoCS?UR1%~tu z^zS0 at o<$Dy_$z{a(Eo`D{)GU}|0RN?ZF?j^gpuFSNkR8iD74EhTGr)v15QoLZ$N~M z7Rp4;@T4SfEm`OrUK^|5fn^RDki8riije5qHrBJP)>i622uh`p;|Eex4`ElQ86AecAFkk_M2#w$(t|# zkkCx9 at c8E9U*E@;XgBjNG`EYo#kZsc({?cpsCkWdr-KQX?RBwZ8nGH?+IL)*oGyDV z6r_txF}5x3)Wo&$V2EY?nhg>_aR6{3|X6Vp>-+4xmrh;|N@!-!Hlmw#3l+(_I~ zw6$0l<&AY^EII(E##&T2UFVw(A7J?Ee{A+AEkf!Pj%$9uP(WR&cztZoQ4?jp|6v|e z0R2~!F38D`MVl*djVG7 at dlOK^YfmNuwouM_)^cRZ0MCT6_;l`sSkMj91e2>dzxI+( zp&Q#L?mw79`Xgoc=w)l96-UbGr?3X$M`b&H!}O9;xnU%^Mn at AEp0~i9PT at G1N79>_ zGBB~o>NOHRzf^NQcGOv^!rPT8_D5CV(=WJRCCYgRv8r z)pYH#MNxPYn;Tm?rvNRGlE?(XP0iU{Zg24{^^lb1!W$fr2*!&&)l=g(ovX0tu0=QU zJDB0Ae7{tbejo*=65YbTFo!Wetu<#Ruc<6gPj)*WZ#W-q>AvQE`@R3{CF+S19&rLL zY%4Tk{Q(M!YJH3_Bo0|+z&pKL!@@6T at bkH-mLgP^(}yUO7L^qB85HnYTYaP>N1$EP z3BC$AXR~3RI1D&GuO~%=Nz!@mXKAsCa)cDHijXuDfDX9RChkd42 z7NFOTX=yV;Z!O9`M?8S^{0W}gGd5(FO)fb at Vj5)RaBi3l?bUeLE zG3gpmX6(bTduzyk`nJjdoqXw2oT0CMG7zJ=!RE7KoMBS&G0MTzK)c=0Slm04_R_QD z0Q38h(X`1|ZO6^RA%A8Cc}{i$|9(k#gq% z^g7bdGcCpU2cDJLOH`dO4%Ve9?DnrxKL>X){Hgot;**E*=N(Fmuxm at V%%gvv>hkg~jBgA*dt_6 at _JYNMye?^PQXz z*~$|*lKGXyP7rixllIk8^;K*q57!bsAE#LZaMjj$If*xHo!n!mjf7q(Z?thHyw;qu z$XM;6SY4Mf)#VgOQ6W6F{8|Zw;fzsGf^@KDl`MR0%j1*PTzr?f9(5*BOmHyeM8S(BdX?1eutk-Kk75m)MdVEdzs8n zLM|?injCPJ6u+V{0tR1)#pU8&;H(bBMUu#QwHm|XmyuL_F&%wDiQlM(A9%>#qlk8m+z>^NoplTA9TkVRw?7(vE}ulRUx&Q{%ZwuQXSIoP2XI<2-6Rw(T74k{5j-ipzbg}@&7$% zU%h5kwf1IF z9kDFF)PXIjwXRiJ?fcyNwc%gDzm((r+y{)^a5Dyfc)z>BY(C96mu^B5p7Mx4*QXZ&|(nY0!$4XR!hs8>yxX=>w?gb+9TR^kbRup&BN$gQ!(t+?* zonnX6bP|pmaUjD*j>1DWkK~gi?~P_6%q8@}VlfQr;u-wX;k?LJ9uTD_G|(a{O<@9( zy)5W!rND10;*(-5Lc=RE18XUGS>%_oL?^W+pye$;B143&Hj7{}O6aWADLyXF2z>^;ofsbj^S- zR=~x414Yo1bah&`l(y4Fgr#N`y5qvParyxc(fMZUw9~lNdb0}w`XAQl&b#x=O;1KM zSNBs)yd)9qde9bjGWJZj at zwk^W>ja6SuYK&J)$3o74qu#PSxY{!<_LZNZJN$5H{mp zr-faoF;m2~voV~&+G@(Ab*!m7Hl5z)fx{>(`YL_rF4J>8;VuWD9Vy;>jSVk~<_ial<~L*JSH1y9^&dQ@`U>W+e1Q%U{apj`IN2Vt=<%~ z%rfHMSJr|V*~SeY=aPA~_1{eEcTwU)5%dgLA3EHpTr^pG+LT) zUT+6mpg-t&%7l?KAno&OPk}GQICB|-Q|}3h)w#@1KK)+5fOzqBo at 7d656&g3UBJd3 z-xj6F6#>7&&0iJ9dGG;3=ZG&5*WiPCCOFR4FZ5H_GuXRpNK-O%hV at oZ+VM2p?< zt(xEKb-jVqt>FtKy&=4tLLIZ8AmA)x`{mzDD40w@!5B&W%}m|{+dv{$uKpMREJoAoPBid;IL7G#)6w0pQfhAfc}#USv+%q9Jiw=gCC zkfm||VG0asBe9o}CoR(6Yj6)t1(GBDlMowp6NT!hEG_h(!7kM(RcV{ANPkvHE%ZcH z at h3rVB-1rzi>2w^Ur#J=P38=FywtQ$30G=1{TOy7xY{SLXd6_ at yE7!?v9(05>v~An= znzn7*wr$(CZQHhO+c<0Q-hJYp9p^@L- at XwURrOLY`Q`uTh^ic8Z1+b#OOr4dx{*LQ zfa&{lI^qkv^hn>=MulHWOU8c=NzNRFj)13 at xlSU|N^J4nwYt~7F(S^tH{lTHHGuxf5s~#A#m9>KmY)i(Ep#h z`2D}dDJm8Um`Z5gFho>T8uRlAG*#3D%eLTVl*&Z#5^bxzzWij19T`(*?N`RE*T8uP zG4tqEjNZ4Pj+t^Mol~zPJ5YufU*qRo6I!gs5Woc zDBruI8~3S#vLfGF+(HM>fVxs!IX3R|8qF<~O4x7+K4;sEvyH*8?~7QDHaBz}IcgkH zwV^6d8xriRhX9d at Rc(~SfC{j%))%6#DvfE&V$rhBDCc|F^LiLdDNRwp&Q^WxUkJls zW!|1mD=Knq2ZR|2(UdmEDf?sI at 8A?Lot|!jNXtsE0xw3-UOxnv-f*AEpFAhkeU9v~ zxvl5`Qsrnu6%}6~A8v|66}%bJF5scY-8h5G?_wEd1`h2?;Z~d?a3e;(JL8GH26_JlnrIxeAbj{W$ zY$CU{6roLD!GrIVOj41QY3hOAJpeuK>s4w>zb3g|#(clI3%vB?Wtj^R`r4;>lk~jM z_1I4?Wko~E+7iz=_CCgmb*q?Go0lFmsD2H<_gc;douDEqANRhSy`h2Si(F*?N%KcqW(D3qK=c* z;W$qZ;-;r^KrH9>h=NC)w*2scmI7-~I28a#-9Bb}7bvi(I)sPtL>n`3CoaB9q5>QN zeXTkS!@L- at IywhM2Q_(&wW7 at 2vfcHrWbXD}ISTxi zxJ1v0?@GoNQ5yIG!QC4I!QEdN7=!FdK$5f12%bYJ8>c`QP7jPxOniuL-F5oZZ+l|Y zHfh_?=55q!_kOI$)}v#7)+D~i0HvI8?lV`Zew}}m_Lffgd&C8>EA8Ra?;QQw*(#uE zSTJb9djURADkAS^mEVL7b#=A$3|A=ePQ2*bM8>j2I6Xk`^sNM~kRXc5sI`5EW5y%n z4ZB6Ry?Od<3zJ7l-Y$w;*64k+kgfm`BFe;c*`FrRv=D=|Ev3-MRO?buWMuf at E6

q!G^egLY{6%*s6ju3hPNDcAlv6zlwqkC~E}r!F6yV_RMLtPIIFet1 zXb8wt7KLtGFP|V^+eDB?JvR$vY~uzpa}44!%jGp%{rZO{fdoCdg!dIUHjSR``!$g* zwh5oel}I}_?7B}ZU;K>>LKru?9K9Pwa<`X+rLnz`HIdOgLK`lzgOy$3ILO?>-h_`k z_#)rDE{8IY!r%95P{~$`s*m_#NP1&~Z(5UZ!bvhZ&^avYY5g9Lok42r$dQ9&(?KFV zL61(r-BMJ--_LvF!To at nuYO6bHF7XlSjS&>fG1{H1TQms*jo=*t-L?JR=0|20-1pvVK-?hYl`JX1Zr{dBQ&&xCsEu$Obnkc{MFF%4n zAh1F-WCG$q06#c7aJn`o~LgPpxq7p;A at JFe=NOoD6|g&?%!%NvIv zT()FDCQ_Z<8Q8Yv7`A7F=&wK?o}-xv8h7!|L0}$-IfMNZtPfz+&v~h*eU&xG=2zws zZRdh*O6$AwSLl>)mW*t;o`d-vhqIsC6Xx$vK6szQTPKVjx*of} zowohR!U59hQKOW(>ds$ZvZ~V_a{Vn$qh*C8&W4@;?k3HhDjL&!ujfP z4qJ^H$`tn58Nr91Ld&g3zuIC)lq*JI+t2vvD at PNy9N|Np!a0TFN+8B_50zh`+i?dJ8_;n2|uq3x82n*cguf_{Dz;239oZ}OIkgN8Ef-7zx)mtSwX z)}{tXoB)FvJ0N5kz=U!SiW2-bhN_Au3ILi281MF?G*z zA4EGAZ_v~KE;sF7njO`l9xXb-95bFZ;VhWfG594tse?Hsle_cl-Mu?bleBbmcd(SJ zQGHUJN)4A%?9}MD at jMkh!!(>C5;8 at Em$4cqUeoi-@{*S7p;M`sSB3sjpfzayu7+Lg9to8ZFh_SKiff6x?@x(St|{Xg>omU zD(utZQadjT5djB_k7g-oYRru0CT6EbX4a-Zy6;$U^~hFa8_RX=Rb^gJ at 5#uS&~A?C zYq^8yZK<`x$;H9TQJBrlS!;`}bp~D=&B#*J&>FKcgzs<`45P2Vp+_&lon0*OO*JRl zx&d{hdT8~l=F)z zbLcb3Z!mZF#%WRLMWZa66clq9-n3ucIE5zZ5Osk@{X5vVLhk~)WzR^pbD)LnC2WcJ3PA=d*nz=j6$>ky6wrpGccW?g)-me9hVe?GIgGuFl%!h*AdwjtN!D}1=2RMyOG|#!uTPSgmK!tvGAJ<4k?jBn zY?=)1aX^JNUN_}m$y4E7ij1ndlB(sGSh%F$j`fpW2?Q&Q{giXm6LRn{5ZDMmURK(e zUR`a3hg_*7vMZC`VsS_ at u6$u{Mj7RuD}2SuM(-N(JwroU8^?^2AUQZ>VXgc_o6#tXmdMId6S}?ywOjE5`U&5P+CVwd`%UbCcQ-w( zn=(vw3);B+y?v!#8i2}4)j-`R?RX$yBASubALCytMt9X at jjlOMlEX7QB!3)v`4}L= zd?p4ETx at ys@^VTfk3L8A$~!dx%!uLT)h+E~NY)(A1oH8lvth1K3BUa`6@=P5R={h{ zFFPLRm2Jt$g`m at O^t4Zo-GoxucvZxfcqVd4l9)ed8ZlIo_(-=NaRZ%JqM*Dsm zT1|ijye%y~SE0ycCzZ7tedy}w)gFFuNh00QbUU$89iIeCXvd at _UC}3Ip~mb1nym?C zMsM%f^(?gYAUdXwwV=(ixVU|4+Tv_PQQd!0t`0oF5J{@GKie>DYh at jjs_W)!f?o_Gfwq#rJM^;0rfB^3fxu?`rhcL#01C=G3T!~GVgGuO#%nx z8d$U`n)%4+5W2iP2lv2UUi4#-qqBK>t85(~0Q)Kxr9~(nlrqcnt;6eiM;$jd?P(temuNntvK12s!>1FMti84Rx_9W||`)rnHH1{it)PkGz&t+&B zMr^5m80ZA*`;fv|r at k!d|MOVfspSq59nWJsP{ba$s=t(@5VW zCPhrSx?oh!r|d`y*2JJTwJBT_IgK*~>cT{OEjz)clG5>d%UOr#-pS2gjd!i71(U1y zMs_rJ;4~KO!H4kl!X>Zb^1yDXktmQrp&+iP>}3+;*6IDWx}vFZG8du$;bvz}ZPl1R z=JeHvaq;GFm%MKc`y9g2l;q7Kl%R0B;%QwvI#te at kS%wJqGVlUq8NwYuH=@CCVLp7 z^ak(NEKZBBVV!VN`bhcSMB#WMn8LsbnD1D}KHuH$8luhYU_Nd}6ki=E5QnYgFBm|=5mJL;=U(6;ZyYxYqKZLtl zB(G at hH=X zY!b?%q!?zd1mhd7N^q{!rU64?FN*vilt5t|A+B@@fYf~7np-ll?Var9QsreF#0 zc;7mS$wosfdlaOfPT|bB)G+8SgOb?i^3h8x=E_8_-5xh=twUR_o3ug$3|6Z z?dcs&!Gq63UWyllTRabY3M{0ZKQ3`(edGAo(nZ4Gfv5i;iO;8a< z0UJ6~aW8xf+n+I*OHrN3N_mfx6dksK>{dZxlK_hB)ua8oSR>lzq%XM19h`dJ96 z`;~2{)}EjK$`CGM+mh>MHYazOqUff&T`=x(lmfg|2&$ilC*C1Pt$dx>tUMd}!dhSZ zURGI=yL6Vvwhh at pe2_X&S^$_s(X}ilvoL?nbB&Do8QeI;v+Qi=ZgpjIFwcT?H**S< zl})m8ptD)TV{sSrkX%ycO|E at YR5Kt3`!!Dz_emlv>+nt_?B>Zz!$#^axaq)s*)h!5 zZ<wJl0ed)LTcqr_J?^DCGk2~AXJoOGK at 6FO-HSj(q zWwo(fv$#35 ziDybP^Em-=<6u%#b_3~$n{nn8 at 0$L!GSREhH9#G%2z8}1Fy>X*?c}U9vjN0o@)hG5 zG{+iA&7Usy+OL6mxk_WfNTEML1l86twFajoW*YWl%YgfwG)#Fbm4x!_sf6I>Pc=g2 zzWTRx1y_Ytr2;c|+S2Cw_T23Hs^h1?{lOel$V%p`GEGBQftA+^cDB6+QB|k;9N!?|n^ue8lvQ6!TC+G$ELkylLd{u>954Npx_1+Qr z(wm*b_`uBbA~PvbtS3TdIK`kNUwaDbX9l8!7*(Yt7f=hz(sHO?b7YD-qX at hK9g3FA z+Z3f#lS9dJ8)W~$aLme`B1d*&6EiV_%qF{{raDi<*u6%^&TE7HMw5WIJ&kbF0xFAe z60(viUy?z)Cv_Jq2OKXRs`ZI%~%zNL>99}`ba$^Jh4dd*8cdbfVF2lAKwD<sDg3hD6PZ2Ae^f4qv#V4-l&%*Mz&TF at rjoMkuoma?q)BMez2bD4n zkQ6+_Fz8-xkRXA8VLTiJLpFfP)+l$yiK%p&xMXDxNdkA at kfKw_b zmU{?!N%=eeICe3o^a-p2U`Rr6S#9|_J`+YB!6zj*e?mxEU_>#L0(pqhfa0{$IBss4 zOZ)|x)E~iXky8DM0Vc0hW}(;Oywh+;>0Qmo=#LDP|0 zntRUUYd3H~(kHrE53_YC<@S{09l>XX6o+`3NTEcq5c at 8FPeB+xr z_?b>=L1{tgpkmaMf)A4dBinSLHHQ7A*PJEN^!Z*+YSA1jd5~q}Be3(4{3?3ORe1SW z2Uv#zu?+kU>n|OHc?LXOf{fTs;(7YYw9Ay_r9 at 905a*rlJ>LTpRGv3Q=AJnOq+VI~ zcw)q&P|0Xu$=oxD9EOg$iCpM>AtFlFzEg{L*KnXGv5K8O at w3P`gV`V?Kn#tR$z at Lhz- zvmN^6*oYUg)~NE92rzTxnfsi99YV>rfL6Fh5ftf!o4ptO7YRZv`Vgj*z*8n<5|(*o z?q&T9B%J*dJTm-LB8U7WHF-M_I2AzWsE%Ha03Qzoxb&p4+AxYUy!<$r^N^|4d7{{ z#9DP7`-cpOG>ze{>EALZ+P?v&x(txUi&)0n#1b8-$B)R#O>jf*8|mey5fp})RJn>Z zi&Nm(adX{X>`Lg(?|sdvDQETDQ{y)Ez4;+WOeRrqc_Y&H3lCA4!>FTEsg3i7Eal9i zSxu$q`pFgS9Y7ws9s0T*lJU;DeQ^CJ`MBcBNEtv%4&6a#<{a#2c3f0RhYw3~f6FV& zHP@%#CmE+#R_2+FtC!2GTS}^v9iL7h-f6M2KTW^nI*_iEQefr*FBv at uo9=ntMJltL zGnGfW%K-~pR;QLMC=GdP`LQb#qU2J`2mrHBz6&XT1sQ)~$VJEppyLLX`Gw*;GoZ<% zqLhRx0Nybf8vl7r=BHW?AkN2WM1S&bG-i5R5-C%joiDcs;c*G%MjN;`793wIB-^lj zeW3n)+jrDOcDE$gM*yMFzzxIp=?==dSW$nnklX3~$xD0%bV)O%+tb!(Xd{C_^|#{F zP6Tr!#rv>|ji4G8(r*KA6J7LsgJLHIw~qr(`^Srz)T5Nb0h~HaY5Z;2Noi;qaQ_?-fsBL3Dg^OvzF3NtR7EKU&9~CzO9f4Gh-i)J;>?gy7G!mpG at c9| zIze1l!ch=yc+~AWei?|%ur8SdqHN%~w}mr+g$l?{aIpv at tKLFPvMc4A7Y0zwFO~KF zQqr9+1T at 0VZ47@Zc62JBS)r+BsHKaASHE{OZz#K5&_lyU(x3~6Mr)pqsG5#A;MmE9 zg#8l}Jei5VE}3mPJlkr7MN~QjdeHF2lkSYNok;Y)G9gj`Prn)pmFjtsFhD#vXvffspD+O0jZNvS^%I z5yr;3+Wya!%5^Qiw(j2%E=o@%ui}xhNmFZV=Ep7}T$NgHGekD+UyD}o3f35~1{0W? zF%NH!mUk3JU|(b9&4~gf6CdhYIn8xPkni%Q*D#^2&;+U4f(dL^(2hSoYNr%vfa`bh z2L+iOQ{s}vPTD{Gur|ChR#D3-F`bCm{G4!hQAAG?ry+_*Ll=lW{Q+4O!Xr at C_WV7Q(ycP|Z91`DOZ_#V`UgPM zVa>q&lKbf@o&-J+2tAKjC}Sz*5C&ylad?G at Y{!C)T`%F$TE^lz|aQy zC&w{{Lwy&MRwkwMP*llqrhY*s=$BF0_M$?^cIrCxn8F7^@iVdH)yy}x0w$W5`3j~& z2fmxRPf*zxbMdp0QNg}uKQ<(C-OLI3PRn`RD2{GD1B-;iW zzZ%QaU5aID5(i^O3w2HCch?H~Z87AfVPD#3=2HXDs(rAgk>C=Kr)&xG0SEM8 z7xv&6atZ;q0f(ZavsSZuVCQCVmfw_7cDY5p8DT`KlWQcZ1(IVn2ubt^Tx7m zdiOmMm5(xz4=2pd5Su? zXy>?c?{ZI0ICg4Aq9Nse4wGpe}KYCqgsq?J%4?@doJx%Tj&F_1i zui$dvasuyi#6Jd!Wk0Ci0krUFjvm<3g**n0Lfh*2bt*FaB_}_u+Q)P=m at KF6Yp>NI zX4^DaaS*t6$Z13%2j;1TBz|iZ1XZIrK at sKD$7%vXfNT+XiM4C6GBC*TS0kyU-M_N~ z=v^pjdj)!CoZO3~s5vO;aIetwZy-9I8KDiSj9$4V*>m;OS$&LG-6d*_ARZlSv!iO8 z?>EMUqffa~_&=F0AP`x^uze3H&!GEF_OzUQ9cqI{dJW?vz# zyW>Dtk^p;z7B at T1fh0e^&LxpD at 77*A?7PhVR1pho%Y8hJnYRrT zGEgBOyz;wN``+CFfGsAx>n%A4s2t@~?eEw}!Dbq<7McX~Fw2x=cX}PRHBnpOoWoBiO2#-r>x-~EG6(>P7jhpvJ3nL{%fClxR=C0ml$m^(Qe8gU)E at uZoE=2 zk@#$n&%(rsx2KcHi%@Az{_FKDy6DIVv at Ey1)48qzNCAHHrq}(!y&tCUPZWt8Whu}e z(+!lxFA_e~)!haKb|Kc+RX9FR+NBxYEyYsI&(k#JN7+m-o`NIfvwh4&I(vL>m@?R?d0+h@&@ea3sOW6B!HI&YR zUf!HyEvOoE`yd;U0k<9bNDXEqIH$MO-0>>SB3)Wu%*5iNw_c{EIEBN-#NMV=fy69(ovfsWV zr91pqEKo-yPDlp-lcRrWpYNS({ReOlS8kg+0@$eil;4Y@{*-_aX=dE_QiJ8~-wQgN zLSt0|0s;Wg{{jGD`!D^eCXzR at vT@e4lr(d2G_p4OSH@$OY at c*LFPv9^C}0_$CMPDW zyIlb&Z1WyJKR;PI*qN8rvawx<#d`mU-RY_Va{!_0650!J1tWo(t5~fj=N^iZR`Le+Ht)U1hVT)~xWPNlF$r1Dv z8e2HBcIE;%zM at GpzqnL?gCSSq zDuILErmmzZ&FVe}rL(OsqNqmG6i|3#?I$*IuQ$Du{-4u&@EDey{dY>?K>n+FAOAV6 z(l(A}#%2cpJP!4*sr^^6G-Hn}+J?HYXdL6&n4;I>2^)E$_}_Ge<(yE0APP|L?Y5m9 zEfW;{8%8V0-fPEvc)xqKjVx85d_?)?Wx&k zZi#f(_MEI&H>=QLTbxg2&jLr)D3K(C4c9hEnzN86kS+2Wh(D#ejT8zy_LaoIr0r+9 zVMvZ3Bht^p^p-izxLV3J#{}n+T%0xUdVF3x&)+O)T#co zw8^hCNj#KuwwW`VS#8vs)1>6d%r?9QWF{wKYr|@pvG+IriU{T2=XME1`u4wYXVB*r zhY_UiVQ?ihtqf|e;vl41OOL&CNFPI0cjaqK;Z!ZxP$F+G>+#$pA82SxT07v#ARRpZ zk+WU1<1bUCX`A1%iDzip3-VUlY*}1##JW#c+~sJet17_G;;`OV25CXRZgh5mdRwqJ zpqnnm95^lewwWXT!NpWyGFlv+osD5)U}CPHtA^eZhq_06yy|zW-#Y9f$snpg9U12F zLnh_s^*}Xxnst{pve=1T?k>>!@PkC6#5p`5pb>Hq6TziXz&?6PC=tpoPwEAD6Oa>1 z;#nQ-nIG*De_J647HE}jX5{067CEqH!|`CH%jdjUNshyPvTJV{PU<{xe%5vR-zBqukQum at mXc?z#D z3Wtbrix(Ww(qt*_be7({n{&TEHWk&u;s|Z(37hpt-pphZP=Jg z;($>OX!f*;At#1A{%^E-s~uE6g?l=r!Aut{=6bCnO>#?r!Xt%PdA7K%BN?r4GXMD~ zv at -A%DQ*~{GIaw{?uT0DyG&6iv`G7-=+bNq(CF5C$BxOEN5Krz6zZKg3Ze%sc<3d( zC^l!ba)}p~x(Quc@&bvO5|VJJr=H{XQL1uguCIU}N_6pv&uY7Hw60EV`gOa?Swdp4 zEcoS4C)dWA?OyE?WRfiKa$mhZg3RUASql6v2GxwS81i!)`h%ks2Ii8;sYHpy#<2dPAgl0EwSVjJ0}P`@@;^bx at So`ZV+tW8-uKyPs zl%b?$#wf$!dG$#!DpZ^NiJwdxbsKA=N8XM5fO^NKNhr$_FI^!=HEA{Jfyds?y@!}& zaRC<1$EJ%DH)+A%C^TActf@!#ZALt(AKr22L1`VAqB&WRlx-y^gggXkW5;LN1a6Q{ zC%ggkQT-UHADOZR)SU at VV{tWNIADMr#SZ+E0^$z5O0{*$XI!@V!(sgqyF9RAH)Veu z1`(W4c3!=`4Wb9sb2vl$qrQ25uk4RS^~7Yp{K5jyXHR at y>*NiFN$Bjv1#%wt5C)fg zq-;{{aaF;=?`M!_jtaW7NIBq0Dyn|)DDW!8dCIVcLEc(aRtE1W|I`Rn9=f{yY3LH~Rlj zU6EyOyQ7rGZAqsq!`&|EtK6`fKR7)}KS{^Kv6J at 6)#b^`2dFQ?^Fb(qf&RiEi$LYM zyS3|BEOjH!Yv4w_$L|ir_iENsrU)&Ng6emF{3UxXJ4T$RK%Wth_*6*=c1`EDn{!WL zjJ?@^qI1u_z4!;Z;!XR-Q5-Vn*nSc=c^qK!AjEa6 at 5SSo{+XTdxO7{!lLOwv3FP2c zMpz8Q6>y;(e08#I#3ea{9r%_1Kxg(B-QGXZQTOMalj`cG z)e)2VigOD*?>+JOJ)<|~C;x%YN;e3HT=>-gFS>(-f1<1UC%XKQS};;3l16dS8lq*B zcZKkGjX~G9qRAO at LPjH`GPC62;l-fqPT at Zye^oa{&=_=?6oefvs_}2C(?X!O`k$a< z`oE+5t2zYAbLjsrI)?wh(H(almBw+&n&bUdUEzPIZsW6T3O6XH2bqw0uYP*OZ&XJS zZGVQ-R8o@^$t&12&s9cIB+5%fv!h+>Uc^0rDq$k{L=-vptr;w&Jjd5hEBJoCOX`w- zRbu>f{-G=kOW>)djfNq at UP$KW_D4MUlc1*}i-4cDMkTP>581sCEswE3y(Kytb`^8= zqOre_Q5ZQiSr=Z~RMIplR$Huc=8^bc=o(KFE6S`TqZt#d_17`0iAWX{VN$TKJ2-OU zh1qO>gU}ISWRrfTAM)XavYT<3o4zESOXwkDQN;Ks_Jd!c_*mY7?w!~S%0{(S-pS$J zmly at VBEp^<{FPnIKV%2Lq)hlP$4tighhtv>B>T z?x>}0nlVCNO~&Wt<}W+Wo(dfNf3XAp2Rnnm?4F-pRw-8}3jc#$_TSBJHg%Q&zbjrf z`y7_++y?&OE#%%)7(I=mKvb%pNtuMk at q~Dtoqrv*93_w0ke1p~R&f3O->PjatPNZ$ z{{{dU0|fwJ{_n&4S7feqWxpVd#8q!uQ%N?+2FMRaZMUgQigd8si_~EzFN74}zd%+< z_9-8E9zHHVg6sFPD-_P9;Bsyjvg1`MeIrhh0EM2en!V=W@{;Xvvqk&!HG}H|NVXRg z3ABjBtiiyy>zyU4M^Oz*AgzZ zW7F;&H<^3`-&(zOiqcZ0(_EEv<$T at BA2jIFgzcrU)C^R(*j{aMj?;oZRC#4jX}t); zgfV($b3Vf)(0d+1-%m7leTOyi*3b6Ydfrp$U*b5 at kn^k_;_NZQ;b;~J-2a3NZ0h!v zGg?y>?R?18{yd?3>gy+rpX;8!s1{DH)M|Y>g}t2!1jcM# z38Bh?nISFMv?mN)HWEMEsa at fIeWXdsw|47s75p{32g&}Hvtvb5wF at H-(Y?E3D%J<< zI;{&qmdzOHkBkMR?g&0THYN9Y(Mk_ur_|T4I at keGZva05figl+O+IS3AC&Mxj^~mr zfR8t4>lNc{L!!gxOmrSnGaBd2_VGjUYdISCY6vzQt*n~601u*Y8`?gv93 z&_Ev}>}V&>GX{usP#UhANCSM!7IR29TN=M9X!nP|5Vtp3kAd1K-sSSPLGJGl4`pa_#=iR^N<$>cpXsRiwB5po==c zDS)1#lR(%~U!d**6AgrGL;`9#@<%Jt#&rB*!ptyRmcf7jK%tq+^(P4!0DuJUzgiK5 zNZQHLQozRAz{%d;$lCFLpQx`=F>_cDM)O{-C&U#8+Y83=D~7xD^_xes70uf-9bLmZ zKKIMFj0~kJipPqdeuTVAN%lTn`3~_mHECU+egu6KaeA*Vv^-RWk}giGbAH)+aeeM` zewgX;`G(%5TE0K+*Ti`!J)RBQU{BwIZ|I=7KAQ9U0LJP)ar5+}eGvQ>_ry8OGvEu# z)0YEQsT-WVvRhfKqHy6_s5=prm zVMc)BnSP3n*1BNwS@;bY(c)1bP$LO+#Q5y7gQ6ouzYUi()nn{QMUzpcfz-rNsAHL; z02l|dMTZO#pZZx4SZTyYk-`ICAre)bOG!|sG=11mXOogZ+-~?iM5OLb^aRv=t9j3b zQ>tlP6ZsWg_~;*+wZzy9+dYToq2t?DlO^kuD-EcH&ElKh4ou61WP#QD1ktvh)Z(~0 zJ_;I`Jr^ht%kuZ(i&mZb`fQCao at Fh?q;DW!3qyipa$usg%!ibva-l~Y;|@GkSkudC zo2^FgsYq4KM=dx4>({O|pV5ZZV5bL9#H-?A2{8*ussFlY==dp+D?Y0|K<6 zZ3_1byUU+!_kdo=Mz7 z_cottse|uXYzUBJ%GikvVUqNE$c7DUltsUi-nAeT`Nn6lwYIic*jwL%yB4(ftX?os zKquLoEo+jTulEOo$(Wv+#%WG*Xk|Jw{d-J>RlCgSwbX-1DB|biYul%FIox=WfWN=cYZFD(1Aq zhrNbUbcg043$q2tle6)^u+nzS1o&{hJYtK_fab at En2aDilFT|~9>4PFq6>IjH?Ic7 zki?wG=?3$={C3w|AWFhC(7qCt`DuziDX1O6tcx%f(&NyuH%VTH$rrm;DP7ecfK;>S}n-@%H0PsIDE z-up;?;y+V1N_;W;e*~U}kEYL49$LeO%G5F4{(4I->5o(w7Osm`IX_jt1hB9nBd>cF zt>l7VmPcIiJ#43H1L}uc0h_B9)0}{(Vdhm>#bBWY;Y|Wi1n0E^%oPVH2g+>*Xx$bb zul&L#CzRX at o#qgrB(4MKj>2wOS`;QP)K-AVA~&P at +)ljKijXwV(2L1pl$<0*y1gOW z-5KFEMF=F}Go|icF05fbv#1(cVI3REtMSQKQqN~6=B8H(H1)<~;z39+sbdfmX2i&a zZ_r?hND*VGo&!)B<)NA|q_WlHi at QcVU?U*_4W~fZKU0})CK;Up9HhfJ1Jf at Ht4~8& znBO%?1l7+h8b|hJe8m0YgmE^!gNeG)o|s2wh(R2UPjXYVg-f8LUyA$qw^UO3n2jhx zAOL^~@c(Mxp?{gZm93MbnYGFP&GnV7Trh-?yn};yPmBEmNx0;ws_KY416ky&f{NE0 z%@%;v5yc~KCK!k}s5&x@%8q+VbsFFM3W{;0%DG0~*Km*SrfGEbP5CHK=w7C?OpLQX zhHpo5dcHw+vC8=bZP`Ov?~-vZIVm9~!Z<}!~yc5y*rL4`uwU3n*7^D73sGzS(1;+s|n68KGr66|=d71j4^_Q#J zG+IuTQa3{_6>~w6s*I+Vr5Q_|pvzwr$CZ&uWuNidLk(D{Psv^;5243 at -M%@Rv8PZa zIXpBvkkz24bIsTiZX4v7pL3{ON%EN?B~n`-z1ydeGrFQqQoy5Y%|U5fE>Uh$kRxYN z8Bi9B&&iUJFxg;sJr^$o3vmC?QF1YVg;F1i>LKa?Iu(vG#$)+PNRX*bqTWKmI1*FH*SyT?YybWNe7 zk5E{_?8IOU)xE4X8zPgTulvLavQZxXc;(gn&Wnt>t%DN6;`+Ej=%d>v1ojshf=$|+ zcVGq(cDzC)ew-vRh&*Pq&TtRyK4>sL&8vKuM8v8X4NgFPhsGPQu?R z34$Rae}V1nc$M_*Wzj+uAo4~N4Ta=FgIZlC3^ucHX;E?8Dui*?XC0M0?1}kYDSL<+ z at p#Vj%{L3xhKpzB~FtjaAxK3ShnIK8 z=jk7HCrH{JntPN^xd1wCO6d+1d4~Wz1C*a%NloasVlg584yhY1{wzs|n z_wzz4+6=^Em(H`pPR-}xj_oee^%3d&#?dZ}0glzFN+FjS4`rfGl3sg2Jryw0XfFZG0opC+*TZ#_FD$(l2j{sx;a zbN~Qk|0NIlm(i$!dt#Y5`PekhM=l#+QwrUo*HE*^t285NIA5-Y?@y`MuV_m|6HUbZ zroUJc)wX~&a#Mlm)XJpEzbr0V^kSu?97{Sp_fkGdBCc at gBh_!Oip0(W$XJ!mx`s54(oN`MwXi0K6 zu2#5T{kyXqOJ0?9Z|O*|+1G{UutsQ;${0j~NRwipxwAfUL>oNiK^K_y$=b3vX>wm3 z9CK?mu!87OY<03y<>8sxS~Z56p!t56BU_ttzui7`&xxR!KIW-9qxskE3JB|_?@C1L z95i;T*dXR+Ei&ufxH0_37F;h3yp6p8sWV-76+))%z|1UdpBT8b*ll5Z=b$i>{o-r(I zi|xXM6fW!6=H-#GZ-y7aHpPB!=m$Ii9}EeCI0YPJ$$~hBo}3E_3MA2i0XlO!8aNSR zoFqjN(c;z~eW1D590TdT)nL9#7->wPfuAi&Rp={BAcjHlpEBW)g1A}?DH1q}s5M!p zDheVby}ssYnxAdiA3t4}TAou_Y_Qjt*WZ2Ld_YhHlcZ{9%$c&F{dJM@{Bx>7wR94Q zr)MyiS65e;Fi<#PPB4zat^pJMjStIQecC=gwIv_CEj=A2F)QG9Z`;@1(kN>>{eY71 z3G056>QckZiI%D3rUd1}=<}*<2ud-8ibD0Rgd+mu at WjD%v^d--Q6~FdbAOOAq9{f_ z6xDI%VCUddzc-P>i4Lj=#|}j$&5CAR8ThoQiUk*y5nBInmKXYiD~S>J(_^q2lDEVH zM$_GzDXWl=4Cj*%@kn;O6y=xCV at nf_S+pYNP1hgC2qrqNt5%A~u2j?6>>SUc at k}6K#~fpd%)n3 zBsDw2Wl&5Zu|p)5&5e?U%+>Q-el$S~YAsL0T=9~bsWbcTLJ)<7@)?n(%eFJ#1&EjP zc+v?oX3H`lL_-HE$l+in&^*a9T}7@~Ga($2INY(%>4y!@CH z>>U`W71_`V7Z+4TEE?F^kmLy;h|}2-rANn0`Vhn^HWf$@n>*SBHM5Wc1ke6<89rtq;%+g9)&5N7haTvti~A2u(xEeqa0DX^NgOpT5gK at 3V=f$Q_qBEA z*pWkec9c*$*^)yLa2RZCn4gZJy_xduL+aH%`pl`{`Fv^`)X>t<06E%^xdXyknl4q3e=j z?zP>*9IR64tNo+o6RaBUBie*59!SCAx+Y83yykkeRGX7bzX%Ca`Sa<>PO(LtaI*>6 z%CpQ_A at I7aU;}0Q2UDQsmWz3b4|I$vlJ%7 at 9!QPP5PV2uy zRGHNl53w>c9KE_lvGBnWCIP_kk^p3!rEPD1ub|ihW7FY#{@4V8kjUx_E>kvMFrM*Y zi#v{Ve?!9Ke9D3DDx_|t8N at GxsIMAm^-~W;JADyS2DwN51*P99rByA*iuF$!p>55EPSZ zR75Crdz4}Y9ytcLo|)vES*PX8>R?PtP!bUwzE{NZkF+AD%c=j91Ymzfkf3h&-`=W( zifYihe~5E at M^c)+#r9MWJ8AR6il0BrNoq`wAaK2io at 2U6W5xc4BEYl?L*UCoRk1;?4CY@($@os zD{_A||Hb<$1Idv(`_(L?nEhn${i`0OO-M0mIF!aJ!sdM`5}(L~BNwWQi~p~7b8|;B zJFZOW%I)zG2D_x-CXyo!h1t7yd?TI6jnHM*7{yU^=^cccE%vtWB}oeTI|YTak}uoP z4!mfsse^Oa>l;z3i;J79vmN;ZznpJ9zU{?jg?9T9?-(@Yq!F9d<)$RU at xtdxw-XK; zsM6ukMBQI2b8(8-#m|dFP7}U&mm=*|)NAOb-8j)+!B$Y_V at 9D#NJlk=U{l}bMDR4K zI!L~I|j#8eMP)0f`{$;%CrL3&9u<^0f(EF`qtMJ at jj<9JHZ~NvOy{kq)Hz1#h zAYk9FWH at 5!r4%CLMgO>4dD<2cJw+=9t?^=QF%TOgG~>@*mO7}o0cJric~ao(;=4}z zgHFp&g2~tJI-ng3>|Htf<@C>=f4;2smsHU&vqx1Yt1mxs1+n^-fVtChwiWM+xX7Du z_8!85=O#N at cBtlRHi^F+%>j}{#8d^0f#^L_f_Y2`Ae`h|ZNANlJP3t5QhBSde8N}k zM9LpTZBSO+#8pHg>>)EaR^J;Y9=PhA|l9t0Bx5c6&ry5xDx z8EID0rS!7LxUyJ#sKpGd?OD&zORY$#9;uNQxfdj3!Q_0aoMIrErTP0Ts&T=aCph6W zyWE9T^TnQ$UV)TG(0t&rw@#Yy0aa2}i|v^xI+lpIchoAlxo;6xEAgoKeSA0pLEi!y zVG8rNbbN9$Rpz`;vWG?~zNm`)z`4|A#5ptTKzYqT&sh6z$ayPM0I;qVF#iXKD~s%mbj2$1lX z{U05mWCGK(SOUIdfepbCdW(t}8H&2 at RJp?{bs_z2t^o_FtZ0g}{R>W1t$T|K$FtD8 zy@|cwv5ud-wm}Aca6x#dwocC4IuhepADNETgXbf^x42l>e?5i!FeC^&Vov8#5baNtWG&gr#Gj<}XMldJ@!U^2!Vn)eL;Zo2;MIaq zWK1s%i4Z!Y*c~2RoOPLDa)OYj=r3Fa8<#=Nv9A^DBFR3~D^4>Nl_VA}zJ{5fMqViTcoV8GdQL&VUf zZZqGbtI)mQ$YJn3gaXq{@uM*=Qk~6r9k^xtrqjvqm zuT$fq-SB|RcHy$cyJK%LF>p?tV-sq5fTCd&zD{?|wqC27x*}IP?dH#`byUvHfWe=( z(kaz`n_bq`9tD>U{wM7#MvE5O0mQx97+Y>x80LYekiv5~T{mERtYR3aMhn>Ht0cz* zZhj;h2EkFHZfScS*awC__3uXoovI);O!wbZA%+EWcJ*8D*(CSjOW*9DW0I(LBQ~Xc zlbhE;Ul`&?+%exHap$8;-M|4hA?_jG9E-~P-VdaTUcey1J;zdO?ih!#bLD;>az0{d z&*|jojO^WYXx|9_i7MU?Q at dH@nKiS&)})*B2C}^CjKbii at OJOz`k()(R|^26PZKb3 zhC)MKFVaxiSyKk!s4)0hWBzk&cm;rUP3O*mukmw1Z}V{j^XKxTI!=N;$_wuHT;9z+ zKPlWK-M=jNf;CU)c7L)1gR0ccraLShI~>(!d%ei)*+0X{_xTenTNiD{%tP2cA`q}E z^zoMBx97pZ3}{iI=Z3uvlp6iMh4U;Icfb&UwHr9e7kT9a3q3K^ALJ^RT z4_APm9c&x`ZzIzUsf9_~yBIL@)bm94C-TMKLFxfb at _fu}gLqK8O6Lt@4VvFT!jjB0e1d>^I1_$VGtF at y}0jufbLLPY{{hWw8wjLXoLrrd0DVq~*88X;?r|C{iE2Cn?=)z`v#@F#HSHkU at cfDF4T4 z;u8P6GuO)GU$UhC+OYdq?Lz+ltl-t_u+zHMY%h-}qlXep&Z=IElFUp_R3u}jpx87k zkKSA_**5kiBorh at E}FmH3}?w*XP6UKDX?G6$Z>g_;oi;2`1(5eU<5+EBLRYL6yh5& z!RBW<4u&!of{XU25>jS>j;3TWX31rFRmr$iXK8Gh$Ty`a$>5l1nR!B?SIIs`SD{aP zVi`2nZiJcdGCPvvm#zhmUNp_ at Fqc>j2`{Lw9Cmx^*2k#@k76D>*c^YXT&5db$XZeI z{ix7F&KMd<_z6r^^(AE#{lR>;hl%Q&w)pg|o!HhhH<5jbff<2tS|l?Gh;qix~!(hG~rr%H97EU(f$0=e|M;r{5@?hd3*@fS7MabdO5v zlC-)1n{GG5O}5ZdHJ>e at U4s^_KEC3C<{AxKEz!?PW=e*AtaBhM1T~8eXEKD3=F054 z!YMieGkCdNZkMUnm?IWyQ!)%b3m6-=XA))5qaW108V2YB>cus*{l?KuE_d50%}*bY z!9;lZB8B?#=lIFIMRxNzz~-U_7M>TaW6bZs5c_%tT;Ogjw3&5_=1)#3#sxwyYQFIJ z;+nb<7lt^S at I_D%a(TjmaZ)Ozks}qoe!aU7*Dncm)a)Vh at D5} zMvpPZ#hpe&wOmY-D}ioTfTp;B3Mv-BksJ=%WDdGj9EsZ%Owjq at ev!yS0rv=kMOnN; z7O!?Uyg+ at 6fEDL8-4o2^_-n%J98sT!WC}y3Ftj at +sfMSQGF{CHmd1RunpN~9fr%v7 zi<-KVK{(<%Sq}nX4>JQEe!%~gYW-HTX|`ZMK=trIK#c!?sPSul)xW0m-8$48N}# zk_F=(_jWRJypA(6J{o>LKTZrpo5Xj?spV6sGmE#Wr4`ww;!i8Nu7=AoO1-mlsgf(a zJM at v`Cgto!=(4b6cwF$VsghgTjqn=-g}fOn+STUiMC`QHRZeJ1!pw~4+-lm-8Emc^ zNbMO#yPRRw4iPmp*kD|4nkp!w-iWYp!KfXnZNcP;#RG-S|;GpA=C9QAF%XZ-VTg~2Fw>V?7E+Iw;pBX7%sN{ zG~0<=`(W7ngS)2r^^mp{{MpsI(irrg5Uz#EYBBd}8Q~1=YGDw2mQv at TYH}PQ{|fAc zQ>3-nJ^H&Rm%A5MI>~B*=O8K_#W24~%_DK5vXuYD<(E_FaB7v^qjs7!&lxTpEkX#X z2|qt!XoGmwgXFIulU&*CU9Y{-2haYQfCeJuRMTTV-gE}wlg5YHbgE3H#y>J!+uYWl zHtr>N{JK0JsR4+wGi-(sYKxk%#ja!hJqxPs&xqWO5y8A8Uzd((Oh;#yE{*)VEA=!Jw8Z0FAz(L2uwo1JFn{TE0>g=!WyhUJg&Q at 5Y?d0Qv1KTrg?2k}=uhssEq)Y%z zlWRxm-^HucT!^mKS{3dI4{U#gF!1-n$y@)W0;q6E)hMzrCe^dGa`#}4FQ-XJDU)aN z5tgc!yafbu;wiz5z=Nf)Nlm|aYW9rRe=DInFTVRNg8%`ELI43V{I`Zn%FfQs)yUY^ z?7yruOi{H{SQ13a-QhjKcOZ!h_aw4<)l5bX^anqo;_X{Xc%TqIqWXe?t*nF5tBZSv%tX~%S z8Uvt at d~Nf`PXUqb)L at g`XQ&SP0t>fVZ{s+g{dA*=C+2ppG`*!cD&do$UgRv}^a*0A zHNsB$SDkK4_q{0SRXfBoc^Y^&lYP`7pXe`mm9sDlt)Q%2Tn z!aZV$q)>#e-r?gJJu`x4At8(q(~bu4mjn&sgH#bY+B&8u^1Db8?k7xa7j6I*wsZBk z%MC6W0?tK&UG#=#&0K-6+M|V_L$MoGEvKnLSfV0y2+9hR+NNlSr7m at Z$N_b=WGKzq zzNRy8o`Ih$$FOW9{in#_uzH{0!ZBk+nyOMty{?IhKI4T6nYh;?{1=Cxb>y|KY>T1x zr4TzQzWSPe6iTbg8r}r~)~vuS`Rd)AN?^(!*zc;g0d%ZDNc7VnXYdNekt|=|LpzL+ z+>`h0Yg^ByH1 at QY%_Y<@h<7gs)Scaj=rB%FIeOm$@4*nBo;MPKE)>%OgF5jKkX%ww z^v6odPy03){<&!XyvL6_T42vLnKl=sY6UD*m`ApFK^u7j;Sz2)sC7oHi2*ab4h%Yxr6)G$88~sN_|3Cr(G5xm$`Hxi^|G4&lp@@vfrYh36J)KTup at 3sn2*;9~j3oYM zEDqD$N=-ks6|__0La{(or;Ws at QUZCAgk{SoNXrqT>msCeDy{Vi1SPwjx6u z_Pcjqlq_L?VtpMJ9F`Vr7PUc^E*ue>-YwHVD_5X70M)^|NBrK+g&e;fmhmLJH9LEb zb`vOGXX%{+0828CU1z16ZKugOPPyJDiBYEa=Hfa1s*C65=5aUtq)QwvT;pJQoKNjy z%8x|u`M0`RuU5HIkF3N?%cDtHr({7!rM~re0|#quPRB7K}j at R zl56R>+%ISL(8*XmnYTN>$nr%AK&b745shpXC9?Y1>F(=n>jEOl4&T{UzM at J__*J5Y8|QEjHwBOL zR5PC~R at -QrDM)An8$Ney-X5!{vj};Fb|0*3Ncu?%(2vYq(s at h4a*G?UI3qW4NMvv7 zeId7tW6y(WFax`-l(kJm=w$v)kBxUb5xRw`)0V1;$t45Pff6^g1*WC1<&Y;_CV;g^ z&(q44eLP)%coZwwq at x+oW6#lhckY$vd%wMcN01I~{HC`86^lF84B2D;KECds`pSKV z9 at Y9lSel(tNH~`wxSF>xuY6vbYoqvxUh-r=bixB35kPMMH(aU2xEU97NDMJ&Ztbuh ze-vfILO+Ab4|HXA*B189#n}q*-6x~Ls$y$O!mDM*H at CiazJVdeBlA3>N=f*L=n9;b zTVjl9$1UC^rLuDRUk?gL{Q%BS6#&V6?H(s=9s3P;24Ea$rD^N)Jv;5>87fV$65^Vy6TU z9DjU%TjAu>2tGTJ_%y_;fY6@#Wq&)FRy}cIP;<6OwwJY_!QVjuFdKrblK~jxDE!iO zgL#GN8Q%XU_X*>xw5OqgfR6BhfSCV#qu}gpi~`r|_b~m^ebfEJ+w;-`xGN>_LK8&IUAT(_ zV(U^F>kR4A8J!1`HZ=#|VNGJaf#37<3;=ood^`IBAtoPS#lc<#^9W$|+47MwBBmXH zg-tROQcgO-#6xjcABYUx0)PmHB|@^H_n3Xz0^cEm8>9js`62n2iH?BT12U+!ILG z?k`nxB^^~wCY0~$R%Mbp)SEGGI^}F$E#fOkOYbP20XPE|30`mdl!<$vK)cjgC^8V> z4Pj!qN%D3B4c^r|+Pq3O!>r6n5X&V=8LCUxONuyhTG<70?+}Fa^QLs-m?1jK)GlS) z^1S#NSazI{Wkqf5>yxoA8&@IC%&0f@%6b&dHtFkDFXXb6N&9QM-9}~~_AYa9qf?>= zo+`8UQ98?4tgC$NK$V>wRp;mW%d$jrPYGkH{TeNlMUQP#y{L_lTUgLs2UCjTrGb7? zP|kB6D++bY(Vi90DZ}0MVdO~(vkwV32?f8AYuV(Df6kHMVZ1Q5*}!|{2g_>n3G0*JBPpRKSeQ36lw$7dF8JNbsij!wq z| z at o3F>#?e+QzR2SD%I{LR8nk;j&3IF at ByliSJEzu;=jAytoRc!*caY(tM~oxL?unOV>t at auZDd3ucSRUT;YcT4Y9Qm|RY%O5Ua6^sVuA*^UrT^HkM*D&!A>uhM8EA!oY$kG-?o_bSS@&gJ8&%p5?kusCj!3FO17ASx3JI#WMq?U|A1=~$fKJ| zh@}}RXYk$Mtio&uGhVkH~)BF;{^aomc_q6})EQP6m{7 zKNiA2)ZpSZ_V?~S18DEyO~!@4m5m{0%lT{Y?_V%WzW`GB0UWoOpK7DKaG!bX-9mL;&<-4qjS)N% zI`DXj_^r_Gdc|ABhw{JQl)GXu6UvVUBP2BKNwXTn^hB;KOPWWfTr)Keo5y7fIm7=p z_{)|jop)OXHJTyZs%lVHb?e`@tjh;vd1SbLSgHAuy at 2`nPF0YH8v9H&q3>ijc;)gRr<~t)GLgS%YorhL(zlMLmB$exU!=u3xSxy>yNPhi z*x@{hT at +g%t}~#*j at TXYO%OcOb8CR=T|>jX$znIN?9O-_MU3SPJFBwMKqP`z%w!i4 zx5K1^TJEnN!KgQos2+H=g*c?$+d<^cx^yac*Y5jJ=T*K{jhI;;S4=*DG^@`vV|?o; zi_=;&quR`k3^(gm9I1Ry$ct<;$6${xjb0w*3L5gSPzxb9+jO^9Vh>vz2)e7S!WEsS z at 8fK@;^RtI>M}H;QY?*uUrt;qvT%B{Y+B}DW>d2S4^jz~*b<;)tC7H`L1)!v%wnEQ z+X5ERx5o)9IWqu^yCgLpIrovpK1>P$NU5rjnD-OTyygE$H zI~N9z_s*~mvn0z9Rn7ncSnl87bH|(|}t;>U= zydzCxfBBI8#Mc20d$mfnhTHOFm6lm>8%@+R}nYE5Vue(f=Ojkn7jZ?90M&t}>)dC5E@ zdn5!<%`(Kj*bzF(lty2R8#p~JqK_g16FR~FbJmg)I`yALb#iYaI}eA(DX8H6TK!aZ zTtB=Rm#oCg3i^z?=g*ofRRJ2|%?ckWXNgs?NNKmjBL|eKj9-0+e(k$3UV6OB*z84_hd-(&0T#>Vgt- z5LpP8K>rXS&7?U8-*KXfQ0^v(fbAUyYaUrgQt#@IF%$76RV!7eOqGFNZJTK(&c3BC z3kq-2WNNcn;wD^0x=n at onEAC~)S^$UMn+%XL{XWNh(Bp%Z)~LlVg-CW@&p3GT9kll>Fw;a7Njr4T9volaW<#i(XcE)*NUi=x8?ZimmsS3P2ZSQ4y(jnPyDNhRvb zk%Pvs>=Iao)TR9Og6Z7a)nfvTOyt at zlx8NN$Ei_GZFfBqX^l0g$%o8_X3)@?b at go= z$hbN`y2#PHJ?rDT>sp1fz4AuMi~Om_;Oyl|d+at^=7YM)Rt5{ar6HoTsGqZ at WBxaa zat9k-6-yC75L3YfaX=&ca0ERiUAJ`QAQI%tIXuAOuKst7?c1b?2oR4sC*Eetx81Ko zP#w}j`G#NY&;~t7RMT*g9ZsyP#t3vhz_gJ-p#VpO0*IHG^?MB61HP_9h!_O?Dx?f) z`Q?RBumm0=a@!nAc9j_8Z4?x8L$OD^6VJ9i{Mjj$cZimL2mu5*3fNWRmlMMzM#>^K~hEgOtf>jJ1MGqufTw{(eCYqq7 zR5{59bMZ_`@k7vZ)Fqx2xYuNIzUd|D9Rk*~%<`~RV7jG$xE`SY=H!~X#VG^OId{U* zf&j4l{>vUz_J4SH=wOie7X%2%68wMS-G3x%WUcIN%uJ+%aKi;tS`ni&X=AnXeDR2&;A1YCEk1Hf+-{}^nBS!gnrH!@1XS6tv2+EQxk^k)6 z%s_fA3F1r50jn&k8-}cOw(eZyo%G{K`+2dwONt>M+bx;JP_8G(Q?m8IgjwSWD*6PJ-NoyVzLL!soVL~lU#yx1td$*w{s3A|fX!@rPzksXY}CZE{Z at P$s}%hw!D#Sbf|?-0&2qBJ}M5 z^BGHdfp}O`mlzOCU^$f_wxl%Z><}`81R6m#;O-Sl(;m{&?%-6v-NWS!G7S^~aqYD| z)+H1rx_2k|A~wPPo&x`7r5zr at XL|1*VITj9I8ye%mRb{d`AKBy-?y)Aye`Q=aK_o0 zqfY$w)G5Fyke-spm}P~M?0-#~?kO#gaGMsYN1 at 31sa4G=9Z8WHf~6Wbe;fQO at Cg7L z^ltwE-x>UWTBs-dkC$;U{m*$(%4RPA_#CqTdP~*I(d<7Q(1*i$CzT0^%vKo+g&7RPLkv2!(>0-#q~nj~5Gq7@ zhk7}CMJ$HMV{@m;m3G**R?Xt;Yrm;tMVyKIWXsM)27g$hc^iK7RfpZC>Y2l++t_-G zm8W(2N$iS4W_Qok-x>Q1lk|xWbmuS&Ra7cw}bHAX#6o|ug%7z|Fv;2N*c3N&N;4PrdoK7~D6v!$_CltT228YhVu!F*`c*s~2W at 6w>OnlYpZ zh5es~F8p7C{r}*&S^dI!Qxxrc#eH8UWr+Dt3w82B at vwSkl;asWvlJe$9Gv)7F$L>a zKT|^&*XD$>L at KNognr;?AVLNU)8K7Z__?F|-;VlOB_(wyx^i+><(7XNwk at aqSn zE~GZGEkPWDlhv?|T%z^Jh8q-~)@lL$=wcF1y*_oQBRe^9&2Y^BfPENopalfb{`57P zEmYaT at G=>PTN||3**1G_`D7YuChAd*m1#W;aU?;MziniIq3>mg^b# z)5EA;gYN3b!>rFK<>Fs at 0Z};ZAtu3wr|+!Cs8|Q)T<|>SZTw}b$^X~L9eZx*F3tsN?Ucq1lr)Yl<`~Yz?bFWZ8nAQ;$hd3W{uz2$6cYLSlz_! z11`+q8EtnR?ag#pTm0WtO*bjFANYU>+5G2`c@;@*Wb?$gX^l=?QM z2+zen5)Nah?daM&GnLQPC>yL#HFMz$&IDH_0H(&eY;4|~tGmbuMhpIiIBO_1%uW at 1 zMFCeEo|Q|68V?TZ>CW10u}b3tu}spPgR`f4g+|Tg;^W?Zd~2gvUZz92+B6lB_P|R^ zwv*2nT$ur!Y0s361B`Z_-%UN}3 z*lQqBV6KTG`?sTuMUH2hhq6$5YN^kr8UF at 7JX`6=88Hm>!BJ at OO^O7>&}DR~whK=g&k z0?GBD6Tbk*3}K)6MPKZMo1|ItSxpt??Fl1L(kB#Kf+ofdVp%{#00YTiN0G1FTn0i~DmbHCQmn^Dtk_2{qDM>2uh9JO0?Y z at w$2WI6nI6enkni|I`?U6jrGDcnPSs3V+< zc^~wLR at gjL7u{KIOpKTj#!Gz6jd&O1{vY&1zt#M?fv#8k=!qhvvRvnGs|>L9d_491 zxn0{EoBs-ij6;AYP|X)bufmfobxzG~7Fn%WEG!c*?%^*?@hpGk*Bug z{iC2|z7SDjK9$X#!St?D-t>S7|(t?RAWJT7mO}Bab-Z#Um at b+w$@;$W$AP>kFgE!9=K!>&~W at xq{HTnI^hy zhY2_??Qe7RT95Ue0Z7nU;@%3(92}gw at l>$%%%t<{V)Qe$v=N%T*1mwZQwwb&Ow`NKds`6?@*wiY7bu!#A?6#77up6 at rtLqyBQbu3--33YivZ8R#%FgG+<-L2W zeoFRlD3kI9onajmbmis`>F{8dyq1W-sAq3c_?h?PxRJ%=P{OWYh at 6{ypSANFYg;wp zAE=wh$_mG0&-54X)!ff1O^!*YywFW$E&JQr9%_+hm+e>`KHAsZ%NptH| z1HDOz=5=Te%r#~k(%ClB(CLJksQld_cj$A%6G4+HrQ4Q0f;dZ4$$fD;F||+kX}v+K z$iS5~uTp8Dg;L34RY;Pm?HWyGE(u6vuO6j)?=OuF6~FB4V^ER*P2o_xNu!KrtM&fO zyw~kxIb%1%M=zgHnLMC5yUmByF at aMZW^{>sZ%zzZrp-)hD-eD(ilZMK5tV28O6^~= ze}bbw!l?SGJcu1r{+bd7%T*0<>XI9-W&eceRlDPb at 5Q|RwHHtGT at 09gjgIQIe$A5o z)?54e9bo;Mmj8qMGtU%i1wWcF_eWS;1Om}&tbgIpXnGhnc21uZe5vWppr`0yk*DmS zR=*FP!>XhF^FJgH5#*;n#P^gQq#8K|m<`MKPrH0Echt^>qPwCc850$pICs5YNuQ`V zAF^Zo7`wftL*QZ#$e(kQHvF<- zdO9faG0?}(;xHclXjFM4V(A9 z%_;Q$Z1ir;o9Q at 2T8ZsbUn`nAb=i7Ur_sqWb1#R)GhnBoWPnt6ZB^DhTi9|;BMfjO zN6{hL?UX<+9?H4}A}wX*N at _VofSgRBE6Qm(FePKq1R}_?a|NJ!!oI*dZ?QLLU{s%@ywY02dFY8P`d$za z`z1%jGxu5Wt*~QO*^CI`IakxdKN)>nbGw-O3w5U;y|6~bv0%QTDdCpMHom@^zh`z- z^;qC{_i}a}!PrB4IBhAb+ViU}xNLb4IBRm;RoMcR*2792apRqp*e>%i(6$A|2=hVY zK3A`NEde`HLlIhV(-0b77W6aCgDry^b8sd-#E2ZvlLa>=4|NyIf^9Y!wchsnO&$C@ zuxQCJeM9vqH{f{S5mQ+q(R at N=Qugdy&0ZKbp9MLe8nAN}u=GV_5Ow1nHeY2za^>fpqA=n%HWSvMchuR~t9SOaEWA-qJI9W7ujN-(dV zC)Eb-P=^>TIMjC(j%PC8xCa&Bb~k+8*uPBcH~3m57dsA8Y_(4?k)2OysSlxlMs~ao zV!xyU4&^xGrsBo&bm25~MlpRig*Dt9c|Du8)-Y-eUDQHH at p*|jvpn|oo*%ZK0b7!} zFSl3S;kN=^d51s$DuN8A9ihy at fPmZ){- at S{F*`?Bum9}bQ*m&1H8cG`qR7SUKO-bN z4O9sdUFb6TI{uYW`omJ=1 at 5?_RDYBVVfU+F*3&x5v>vUxX4}XY4h}m_A2eLT^8q^1C%b? zORD~PvjzQT%i0C`0OC)ovnu_)fTyiVNp}agN}?ByE+mI|ThzK0Mgi@$hx5 zO&g;p)U=p2ANtyT=`h%YpO&+0v)okuL^pTe6rlqSkG2iwrHZlL$5*-#b2PwnROq at 0xLuSJq z6T^I#=<`4h?#pW@=KRyxmmH-#zmJHIq_wtdZQ=ZIYh8}^0zZgh%#6yzMjR_?m8DT& zVhWN=Mn|0+Q(?o{Lj8)9?R{!5Y7kS!h(c|~seVz7LW&BGGlDM at _Zx(tbyXs~k)Cdn z*z8ZoSes+7xV(K-$H10q2r+u2 at 9xtIr!3;;SRdPo+3cZWL4 at 4~hslA8*CdG#VoCNO!a;D0d}cXo at yrJY9Q-cDphspw<9x51EK)?`0= z$Lbu;ynUj-fc7liM&VrrA}<4_R2Fbbh#6HaSC~TZH3D2Fi-IsyoCY^eR%$PDRfn?x z(e4g0EjJM_wDRS13cIxD9;x5SqLPMz-kp!KbFA#lZ6sP*OYO>lDa$bvRSnYI2RT-l z?kKO=WATnY+0mh{I9%joQk?QK6#ibq!EF0EQl(YW-&ttDHo*eo0dm})(LAmduZbHJ ztvXcKu175}4t&lY+ym!Xp3y_Rk9e5IHNf??;Ptgq5zy9 at nqulJ5do&|0d^->D56{Fu-(DTeQcBPzO5Pd|wNYQKItt%+lT0|CvW0|EW||JHW= zucnJk*v-n;^gsTeXx7m2KvhHgmbYY)!UDD`SFYHifsZ6d0}EY(8Bzy1n^sqh-gjk5 z{w-A^PYJa%7f at _tHF@8E)EF;Nar2J)IDE8|amL1MVVz!rxPCGvaN at h$lRY^z`}28A z8mQ!(G6KIPTSRzMa!0VEQI|ddyk$HMNhe_Hlr=0t$A%%pC#FyYLMqqIOP8v(WoFdS zHo7kWD@sVw3MSd$lj~9446Z!?ClR%S9Y96IBiyM+1`* zR%v-8bEA330SF|kb5jy0n0J(WX#R8RbSAT2Ed%yUP>X4TdBFM#`$gDs`sWp`&sOJg zMWFLvdu{aKOI4ZXOaL0ao!fH$Z{dvWF~-g32D8I*oo1UQ&D4UK40EaDI z%5alqIP7U68xV3$rh$E;VVQQfwrv?Clu^%7?VA-XMezuS*(lXV9H z&6|%U3J}yxL`v~TzQOk6m$wp~dpEid+%|oj_L=r=>oC}D>xK3%DjXZ&oCh+W^o|Uu zz%eTZF%9;?e7o!W6df1yjU?j|mw+?5F{lqM5HI?BrL-Wi?$_d(IGE(Z9vGCq`I!cd zN3;?>TB=t~LmF=w&VtOT^r+ll)cV}c5Puz4i^O%KICwdn>hT@;q#-yFjJ$VhcsrP_ zoPV=mIU6f5mx4$P)99jyD{9;d4pVwcwq{llDBa=ZYB0w%L?P>{IE4)}Nz*Xw(L_t3 z$KRF*&8qswF{auOywr$(CZQHhOblJAqUFPkjeeU|lxqF{D>wd@?k&zJ at neqOfF~=Np z0EldGm4;okUnH*T1|xF{)KER7OC&U_fIM#~gXRS6ce^}}WnNox4c4p1*xa?|h_P9D zul!?IsIT9KYuV+;S6;lWxddn;F~Ta9LMSIggl%%!3|-iat_QP|*q*ESS*LPMyhlgb z8XpjmT#JQ$@|WP_q8>|S?dzGmSA4G_20#8Iyg~dMUHoVvtEi10>obTUE`zPxXK?N< z;&xQ5$VQC%(g(ziG|?0O31g0chf_;MPPa_7$h at yX%B*bda3wjv z=*SOl!HyB_4EZyDQFNq at S!DJ|maUl!lS`)>Q6bvhVOZm1M{i=JtNgCl? zp78;QQ1=tBp56C0|FbOn-?LoIr%)M5w=v-njUE<6htOb*0gbL=M;|hdZeK at x7;@uI zzKo(prvZ)r`3c~oX5ErBW+Fd*!`MHU$lOhnSO$z5pkYOqvrd`dTFleOg#4U#O$77u z5k<{tbCG9j4QBoHN9bhg?^)N{!KLgUc;D6Xb<^6-4p$P*<2+PM+*aM3r`bc zQ9DPQe-?(S+BjjUp!nYC=mT3PF_*R!M9?v){-7g{sj$gcCyqfnIwdN z+16vTJDZ5sL_IXiG(F~I!mrSF(?yB+tieF5Ih|C4M6&fTQnSFMQ&g#aVht^b&T188 zNPeeYxM8^*!c3_yofvasQ)PQ=0axf3Zb2TSBi>@?hHgu?2_%`-#m~}ww<1}O zQe^n-Me~j(nLR49k8kmFteje( z$i9HoV5akV^`@cRZFtUjx2}kpJgguU?wsp-eQZIkzV*gSG}|^DC{|xDW;8L!4q>~tV8kKfG at a4j-9@amrMJ^Bq#-m+m4lnKjYiu zzN6weEGh{CWl*14q79`Iov`rsd{FVt-NPA&?xFyhv&W{eX!WIs!d}Ej#;|w?%CMZN zE6eGH@x#qXc^@gp;LbC)SCc75O zhINHPp|_))mwqIXCl{}*sOGu6wm%PR<@ zM?{b}2-7E^^)%+^&&hDIJBG;#VF<=;8b7+A2K9b(%anF^p`I=|MxChKOb|?$9B_8`4prG ziJOtQsP*A9&h!bq$gi5hmkb!FWa8_ELq)U64Ju%Mk~gGETq%$mbV$3NNU0MHd1p^k zmeq at qcqvP$)9fn;AK=mKsq)-JwG6=d^+)Bid-KxNZxn$AX(9+{qPlv4wEzgthd%A} z-aOS_V|T5tbsk8Dr`nHSTWDNA!&L#Y9Kllyk)Juhzb?tM=MzjztX2Fhe=P4U z5Wn^p(`pS2rXnPNdd%{CZ>zh#yl{C~^Flmv>-gA7CFt`TFKUsWzkHsbI-J)oKnq*N zhGRhG`QjJH*2aGd-V&e at zTjj^lN6A3g+xXuC1tJYSgn1|!I*op49IWYASSfJ`&soW z$fFtFL26^k(@BHr?hmrT9=9MsbGGou9o&^477QNIXb-uZy1x}xSKp0awpUku2dAJU zb?)%l2(5SHhkj`Eg~-~tl9KV=Wv|adq0vf!l at 2yH^En8Zj`gre+b!|Trj$XmJgFw( z%{62kHfjjP=l~uK?IpN;6)fd&!$X2QMs z>~^IAR@PdO%&(}Pw^>f-ZW*#Dp;};Hr4fXI8Qbl1+S+A8c4>s^y zXcKLSZ4a~vw1f(Y{L0F>M%e-SJYs{rTOyCRNEV>1s2`cklg zR9-?ssf`>WFx}kg#S99ppr|NVbS`gZbKVp*?kY75JD1-H#-|8+;-^9+OCvTBxhW at s4HkBfGQIbqve@M}ccR7OIotA|hTsVwXfS*G?>aNl@ z&FC;S7^p-FRO5zH=4n}j=AM>FOAeAgLXBOO7804mEV2 at 7=*n)RTL;V}NfLWMOr`jt z6FnfDm^yya*LpK{nlb3SCAR}*Vl7;iUY1f8S;n-(GP2R)PKit%oxvvIrNA*9o|Y(Y zp8kFV-{yLZLR at SeNokO0WomR!=X7od9zd84l%X&XJI-8z=@i3J8K&=22CTSRP+qh= zsldnOr=VAT9qJWuEl562#?uGSX_N9BJ{r__|6#emZ%yMZhD+r2@!srT8?yZ#6Ii+z z at ubfV!L(Q?R5>&>BV!`-;|CbUcUvV7xsSn_WlZ(|5-m-{*3YtcZ zp^&@bG@)rVYi%15U`+4rI$s)(CgRNppCmY>`HWHAtC=RID5PxcW3>fKTWbfmw_cLg zEGy|M8QjIRQN9rDty$NlK#f`2rj at YZ=ooIt7(QHkGaMV2qO?pPbJ%>z#0KtD$d>NU z{mo0b&I+}z*;Dum>vt^a?q$^?T+NjmXbx{$v=4$dhsUHgwZ~w{R>L%`ho5lEFy@(c zq{X0+9Vh;1iut&z6!kc&;_j(|i}sztEKs>IOvKeH`Oufd*%f=#*)#?{fw1O9{c_B+ z#Ma97kXfi0p;U;ZBH)!g2=egtO0ht0`#6wVDA`dpP}Va1&-SIY1)S*u)?hv^1 z`#IG^>Zv*0ov|~s0lQ9eaB+uu_2SW_dlp9xTJMYG8*kk#hN|=XE!>p at itfk<6RVZT z2RkyRM!)=L-0O^Te~{q>9Zn-(BC5tZh?c?l=eBDlbk6I5FXgW^Qsj4h969kypsv#X zbeRY9GZ#wNDVddwk4CP=X)%KnSvW3pM zLJz~~%ZYTYC1l+=?p86FAoF^TtxaBUs8Wrgwq$Lo4p`K?3g-4VX-B1{oGVkR0F2a4 ze(wIPFvZss4`fNB at ME*?n6;~P*~`Lw%W#CKK~QU+;Ml>U9z`K5XUP!(jd9$ESXAPR zeE!S)Q?LsBYcKbFa~VP7Rq=ZGT`x}aIa0TjgEMRf&!;RT1G{C1s~CzveUXPv z3ti>OMNAP-j*+^u^HUN%FtX?u*{x2pZU|)1J!Obw6tPNvzD`KGYUkb7p~ZVFGIyDy z9t{g{l*bn^MV~o^eM%2*kzcYGcJ?YRwZPezL&Gd_J1xV at nf_LN$`%rWFQhqlKtkFG zwWz^Xp!=G#=_%UEjb}?miLwOeDF0j%nWHg^Yy8m7LlM`+Goi|N6f*oeiT%b1&rwjG z(xk}vH7skIQ-{Yw>Z^7&GsH$wZEBlUPny^`3Kp=8EJI{};nffJ&_lv4cK5}ZzJ7L| zZ^FnMbPA>4Ae3?ipTpU5Qe77-=IUYv>Kw^ZnZUALfkn`x4Tvy{Rd+^pp4E%_N}BN!TIoAzgF8~lE7 at r3o4)g|{KX+rF4JygL)5Wj-Vw~* zIAIOM!zy4o8|Rz{kiTEG2~ZF(QVS8=BS+K zsFDI@!@+%W_;OVz1o7(jzrgPmPDzWoI7lh5On1Ph6Wf-9MsaXpgpb%>U8LLArv!Phn zak1{K)1#R5304M>vMG>UFh#yynzc{Q67cUYB-?eLErBtefVale63xG5=XYt}ZqYyO zkfJ69w%5d+w?|`gW}+*khcI}Y6fCLxO|gnO{%%>KCQGqb%VCb-E9&`h#Ahc;S{xC<5V^ya4r}@JXm^m6=D$CdMgPz|v at dd2;zM zgnG1&<TvXVw-riZ?f>hYT}Z&<+-b6v#nOJ0WCN&k~w*k4NDZW}e=~XY*6C z$YDnbhRn05BF&r47CL0mf%>+(=*+Xe=yw5|I`^}rA z1|>?up!&P{Zu0c({r4Sct!JuiydtWSOcrHktajfyjHH>O&{Gs~m)iJ>}#zw~&j&)3n(Wb$An*nN~E=$<4YHL-hYSO|#T@(>{uA!NK!GYu=h_eV4-ayXuE6w)EaJ{dHQ#@;wi zSW52UKH1Q!$O}cc8pyjj67b=nuQXU~kR35bvQr~&a?9OEdkh0fxZNPM_O>=&Z*x#G zUI;8CKZc!eE&kY-eG(517TuC^YA(#V$+&XYPEM8gyM;3y#bd$DdEw020k~{sSlCJk< zug}0xuuydOvncwsHKZjuCT7O;ny2S+?`mA?t~C>0)lk#j5a?fZv>QV)P?DqF;k zQ3tFv%g1}jsLhXgIy!K+4Bh at xNJxX8U%r9^A~o%v!{xm6D45FpF&{0DRPQdEiW;*D zB0}5XLF1HKvi~EmQDo0zjpiICaP3MlK~i~TE$JX|xD2`kNn9-*SUNZ0aqeprk`&8i zO3dhrQS^tBMi<+womJv4yU-!KkxGwy)9;&TS1dDn*}X>#upW<(CHlA+Cmw-48Q9t$ z%c8n_J1Ba$0Xpl}>|IusfMfH+a%Pi3k8_%qtC)tWydLt(899#5N zG%K9ZQs0`O_;@OGc`#bgdk*FLn)AyzI!J4x_!Smx_$Jdfb1*mo1C5bsjuLceF%DHC zl~`T72fDFn8vObzhio7L`f1)ZJ_!A at T&~Rr5sSbt)cVX}Gy|;^ zjsQngV7^uUE>A)TbvCAe*+UTd+w)F409XFB!DjY8FW2L-srY-F>;T_((Gjo?AhejT zQ|@p1*tO~zRbaC4+D-Oo^ir|=YbhkwlbU;+51h#jxd^SUwb-<^S!k=Aramg|sxY;- zO<=fBnQ;4PqQm+$r-EV~2q#w`pR`|_Xno-teyCq+V19WThX-c!0HVA?5*?Ej!_`m* zDLRX|X{BAMrO)ZG%JagoGKfv3k)&v_hDU5mDVJ0gOqW9HcB`1K=QxedzN6Mks5zMh zOtvda#YrNF(LkXGzs46)vxtP)7ixXh3O<1?`^+r9BQ$CwpW;HFOqxn%uc@&H#+CV? z6o#$c@|O?CgrRW at w#Asc#?~6X&0t2YyyN=VcMjPvoO{O{jvRZ(kl|?imboC|qn`+z z4Y7x>K;1#m3m*Sk163Qahy?@ykO=|+!2jRs`yaCYTiu}(v6P92yrYSeiLJAsiMfHR zg`MNS1}o<%>DVpOqwwf<`dWvi4veY=0OD?@|3C=l2n$O)+|@+n7~=w(|y#mlqO`~Ld<8{HqPHBH}uC#;KO%WQnb=ll|E zXd~5YSgsw{e!Y#0^TA}-!VaI&IJ1%rL$a1`B+Pvcbsz8+3`N5sWh_Vt at 9l&S*7Tu2 z4x?Y*T8d)Ow7*DPzWB!T?^7qi2T9$^i8Fp6CB#6c?mDgfXv(}N!Wyv*kucb%$6F~ z^F}39I7TK_!h}Z^eDHB8_$fAAl`v{-&gF5G%-{DVRZefUeVyeWGf&?b&qgwFEx9cm z3y$4N)gH#DKV8;rTcpISn_$u_LwiXo_%Xh)Q)ran(^>SprgR%>C-v3pVqv^swr9SBiU^ z0~y845zQh!M$njUZnsx?FNJ;(_2g^czjJ52HywQOhr0*R|BySzf6cJhQCj3j;gL!r zZAL|a^es>Yq)1leuNJ4GUttub+)Lh{02gdZ)z74th&*`F^1cf}*YkF~8^F*1mgvE@ zDihB!Feme}ySd5rx>@gf{rY{$2EgQwB7|b(P)tu78o|Dht{krrZxW71JqCq_38r++ zbJ#z=5vnw$3N-6z>EYuYB|zCpYIa7W1*d1VR}w8O|P)y)>9Sa0!9DUGj5$rAlnd%dloyfi=>`pO;mqnJzsN+or~D6+glU-n8On|(^iB0qMRrzvP!dv zVvX5TPbpNrG5CXo(}+n}_qUM3Qw6bdtIQsZ&vz-&nVRhoLsqxRrq2*X$ky8KsX-+& z65h>sibFY3n4oD>vL1@`crGzzBkID>^P5N&r|A5B#0AfSX8X*0Lo>iENb at ro+)DJS zcG$W}HEMz8y6dabVZ4jvM5Pv;JghSgcvl at JK+q#@Y z{*;+KH@=+1^ZY=dA;q#N`_Yq}i74zvCq=FcxLr>%O%X-GUhxzZ?5jc&tPQqG*SQM3hmK-`cgSxNQv}bw&JaC}1&lRH)=*0G zoRJqP6qP^!Qt_m-)=InhM at LKlsg9WbrK4RrWC4V)*6T+}tpY;u$QR^zL5kzBTz+U) zLedx&X~{bg*wwBU99_GtOH`73x%&xpUGMvey&ymTi0?#BuO+Zz(qPgqCN{3$KiQg^ zKJPC#-2j}_BZUTXKuF_d^^ue)87UiK<^!)cz9@(EJG-r}FgeETtvVua*KKL^GPexF zt0AM99#U-5_^g(zwlCaBbq4tqZPu>(spT-tB}Tb#{`2vp(pc~p zu|h^oyaoQV@>QnQ3r$=+E7avw8D^cUojwtbd)6?|8O+pa9ysbVCfY2voSOSaxnaV-KpUI=Xh+V} z)YyVoqm8o?i)>dat&A&nR)B3%7 zcFEGfOm2iKM4u2ELe1{HR1bqqwFb+rr?`Y5>VWuplvnzRM5CeAFw_^KVWFU1^gGL at 4p946f9p(td{Ika)i#M0%iIWq%wy>u zx;gZm7zrUF!3K*d&NH4ULiy at 1d1QoZ$(Ln+-d+89(fl6^=AYh8OpE~3AU%SJUo%z> zs22!&B$v?a52(O{Lb7m+a2g9BnFo7XZvQZ(vUZ1a7$!g7>28l6d^rG6M!1;-#^RDb z7s*?zD$HLCZVGB+oWu1NM>>qtZn7HqmS(b?x;`TeM(R|%P=`GYnsaNOVum%U3Lglm zpuiZ7K~9~UnwWub4 at IX?R5^&JQbJ at fRekoaf%?GSM&gi;kfOzqqf2GV6xa1T$4P(r z#|zu7mePMr1n7TiBAEZ>;%z%F$Rm8oN=(TSl`N~)l&e&H7BH`zhbUoG6VA|&wh~F( zu>=zphh}Hy#diD49meRMMWgfj!ymVk35PRfHkmzd+Rfg4{oTpqF{hY5 at I`{c z6Q at BR^Tff1aUz*&_+T8GEcG?j#>li`x2d`5N?oK~X_duHjx=`&1>JUhQJAxFY%^fC zX{0_MWWG`wYB};VR{n at RX7CrN;ed0aYTft9rY6}&(W#*k-aNso(Akf#x3PWG)M at 9n zJ5N3J>QL);J8+ES`f}P~przhFd5VJhZ47PQchdYq1{5_8)@x#gI?uzVJ%n!SP#%1E zf+>I=_IJx*B%Tq3KOqp;HV3R$GdT6+B6K9T0N#<*GN4#%(sC~`3msaLeI zAy=LWUw>~X-o#wk6AFGpVI9^5@U+SI zN>bFcT8h+2UW1od#gLXFSPN$&G}v?&*O?mB)w^`Gt?OV(c;8Lv9Y*n*9|ZCBGFk7S#~DhJHTc8oD2D)g=m*LlR!zj2!3mUK+{r`dympjS zV)YeMSPdA8zs1PT+#0E-{Yk4RU#Qxax?bFrG8#OhUOh|X75}hGQpSklG~l4!ra5 at m z2}gj7PW4_yEp>QHF3z8KKlcf}V6tlQOGpY)2EN5iZDfvKS$Hv(_UAbEO-o6JFvzCF zQGL=d&;rc+A66r|hkpNqRdQEM-ROU?n$K$RRqt83x|^G=`Y@@G6PfKxaQ#HR#3W<~qOdW5VIen;M~JyOW3mQcU)L+P^;{q_B1U|c_3(&s5+AssdqLBc(l{1p61iYcKSMX0Y2kQi3&Zoa5 z$2IzYv19`S09--<0Py|?u>LD4?%Qrd72%t^cb!3YNPMN#qLT*FhCo9~JgEjMIkdRG zfpMH(=G0~32qCVM at d=FdqWBa2T}(B8lzFLw?=~*eb+(nWF`oiT)HBbmw`+F0$Lltu z at 9XPO4gk}eiXeK7i5Z0?`7XnM6KE1C^&S*I7ot48okHLtx)((rwSiFJ=_u1*2(b#u zF!v+HzcZW#5<0gU!aQ7DT>asw3 at 8?(Fr at Nr+n}c$r3yCm1^KgVD0XL=#!SzzAP37e zOn_D^b%%q##a8W>@k%w*m2124I<=zAVxyG?XmKe^Ro0CQcXYIjvGLYH+OQ3#o)GFC>`>5DXmUfqDJ=!={Zt|`c~RDjIaVkQ zCe(hvhLAd}JIWDQ`MQ_~|{kL}ykd;u at r1Vi!br z*nxJ4Z>S$zwOy&&Z4yt|FKcbP0{uSNIb!agZo)f+)3`upI5!LAUZ(9~%~fSFQbv=X ziD2j85SQ3fLJ)P|V>hg!TVxjGv{Vj-S%P%el;U$2!;dThBK|aE$EK6hAg`w~1YD?nyt0*dGhoOx8dyids z)CzCi7aEclkhA4Ze2R*EMf{+kpDyJ3yCcBf;_XtP!S@`z`F at D-5QxYXD4tKknkw){ zytFUvXZw8ru6vj9?t(Hv000)?|EUn+FS-{n{ND!56lLs|=n;Huhe$VRowX)`Hi6Oz zH7OBW(Rme91Su4S$-_i?ypX9Jj$25^wC4R3BKihGkdgi#Gh={@QU(lDp;`a^!9B}l zG#i(<+Y5}bw*z!C5ADD-Y!kXtyR>l4 at W9%H>^o^R;(`gElhP@@P-7Ij*N+ltK#`=0 zBQr{5z;~BGXiCDwp*FT9*_W3XP-XlRAXK)pr5-$TwdDutgdv;kfbjMNHel)p0r6Mh_AyU&^R03{t2F)kTD31?{jHRAYv1iLh#8b#P8%bo!Hg zYGzkNiS%1n*eqT0gRiq-L1NGDLP$Zzns#>r at 99m*OI&wgCC^d^BMZ+U*FL3^GlG83 z{(6ZOghSZ=1j#YX)VDps4P*DqZrRV5xuD_io6n4FOuT9L^Dm=m1;1AYF{XZ0%Mi2z z+`-&9JlndaI((+{tBT=9hm4I^SqSH;~PBOa^N~Alv!ftJoA8Pyr3l6re&Xs4Qtx0($ z@|@m9KUQ at Gmhmp6GZOLkqwGU4o8`v{hc>xZ5%xHSo^X$0n!X(Xb?L9RpDd7hA4ISG zo{xoRVCqP_oxfo%m-Kv>%vT)pGz$dGlj={0S{_B7u&>mP5$863!0+J@)YL$QnIrv@ zc>sW)n7V8`JF=^$`S=ifEmCx?tuZPQV=_Hk?GU zB|z3M=uZ+l8vDl#FgmX+F!|09jkw at FW~Xq*B|R#Iz6D at Hgk~sP-g_`#L3<6pN2Yfy z8EfY_QhoYLujmj+fzdZ3)r9cKcT)4TcL;2*N^;)hDU`cEOL8tV5oJZhEu3!kqJ5XB z$+v`YDwP(Cu_M*e2ccc48 at PL2VgYd*x;sg63|;wY`;WnRvH5HS!}nmm at A_~iFby?9 z(rxeZ$GlC&Vg2O1QKVvq=pnp%y?c#9eL}tx`zHcG|Al}v{PW)s7*}PZUG3HRDEid3 z;5rOf(~L8nEB(Db=@nZzt9Ay6r&`9FWs#{Ps2lMaKS$V!pQ%n7<@)j$C-8z;u!Q2z z^S1*B0O0w*XW(BGv#jJ6^-+9xbk0^#F%Jo)yYqiwmpkpjvLYITQaVXd6Gq{SW4f$3 z+bp;U`vvKJT-n_P at e_&`?l5?@>~O|TjwsYwo at V*Uz^)WUYi!|?vneaDP~$PgxTO*LrNpSPV1;ts%TkW6uw1T@ zx#Kgr?GUuKXwxY5bVGOtJ0KL?8;Bogl}py3 z&*o&cbbf(f{gv~Y!)^)aR15X-sgjIgBw at R2+$79G-WlNQ`(7tH_%!|xMG4`ccZ6pI zE`MbS=g=ny19%ix^w!TrZYNWhcMy;M9J9P4v5EzGzYz}zeEjG=26v8Kmh>I zkN^Ov{!cad&r$(39VKKn3}3hjQz3O2paPMaNRbc#Q7sXYWVCxK!2zfdU-KzajzP&r zDL1ws7dBjrQnp%UY(4dh4xEeF&^hN}Z8_%;a?YjSgHJqWYy|QC;yD97?D)66__H2) z&)GchV~cryp!Pt|MCSeCAh(9hfehL)KO&!nooE6bq|4p)9+F(zW8sB=8{qN|ju|== z1)^<5=VRuTzbKC+L*)R%XihSB at FXwdhH+6Yz;uPZ9_VlEmwLs{p8XCrsT!wePJF5S zIdu$E;5)>;1sKXNc1kQ{KR)RgdKPZ*YhIA|=QSix4w1xRc*?v}Qm0LL2OUf&Q|OSr zGqKSz@?t7W&LJe$2~AR`cC6XfaJxwtHYW~2ake% zjJDtzagT>ATN$#Ds;_LDNdD2vN1IyhEeG`~DfN0r;qmbqiO`T|JWMp&t|BfKiJh%a z;(Kc!K&XzVXH8qvrfxDoPw41K2Vn}$CEEHfivs}%KN{c#rsY_Sg_0XIYlZKwUqM~n z+X46r@VaF zHT)+}F$cqy6QA at o->{p8?C3%pq^G0%CCd*XJ04mVuH>t}FSUl32nwftvk at O!Z8~R> zn3NZciwZ&2f|~7jlX%Q06(0ddUQq{!M{XVsbalE zkwx7C#Y?NDwDj)2gAlHVs;Yg0=S_03pJa{eG!EkleAeC~v zw(yu`rj|uu7d}nvKzzvx(t;!A1!+(HZio(52WIY~LdUIyG{%hvBdb3VD4cen8%N#b zP+zJXvWH7R)lMc^y3Ma==lI5Scq;Z)nk&aG_u5MgHHTneV8Q3;GIdegSf&ZZxcpKQ ztU5DVeg$Q~xZ%Khq*GGEI=x5-!FH;3VnL;^*86i|p*g5AKV!hzQM at OoKZXddj@BT$ z1 at 1qvQkb$gZ8sK5+u5 at x7>+VFh05ipX6$FID@>u14A>VJIZ8RJas|WNL|aeKIBwFH zVJdr^E|l!f$Uya&3;4oYS05`WTyAupZ#77NxA}l>1k1%x4VB5l0Dx~NP4Ot(oXsn zT8UJdc=O at e3m=e6bqJ&m?(B0_!)o$UC8^i2BgyJ#TH5H_%6GnX8{4RH6;$C%`k*d= z51~f;;B$tRb3WlW>Mz(FSr;mJhJMoLh;PQ&*_r`p{L(QL>tp44o)34sx0*o=#|*AD zrB_f`kmj%`X#ByTh$c{m)WJT|BG^?zT#NS6*Mk&jBLG(Y7 at IMWE8$tykQOV^8Y_Wx z>QuePUd9`CbAjOYn05+PhS5l$tTBUxkR+6;#DLPVI|M+MN9F2dQocFOi)J?Q)~J*} zVP+%*)vU}al&1%^)Fw9ND_my|1M|g_$%jNx@&ITjR?`xGxvijHgdNucG@$j{9-zP) zFe~A6=}C2wMXJrLeu4k{cEMU_3xWK{UHgd&0KoX)ZWsUP_WNHw;r^?@tVRt|Yik9S z#}E_Nh=Wu%(8vgTgPBEY+T9|F6`>8|(B04)E9g3%Rbpfs*x0K0UOXs`_Pn=F;+a at y zaogsa77y$B@^7tBR-H%+5c3B>f$-JjJfCx&c72|Ao?mADcE8yChhEZR<&N_AlL&cJ zhRW_Eqj{5t%tD<2&Kbvf+LQTC6H_72?BgpIXM+rKk*OG;>?6s20T at zLm-u z$qD%uo~8c&UCU)x#T{m{I*|n%^3k;V5jb><+PmngF7#fAV7?|+qAOOBNcpHKTSvKS zy?DCjWVK9q$~01W01g}W_NF8rS!+{On3q?dO;zbU`G7XFWWD<R3Z1hjpU1z-ThlO}bC at _~l{zWf3{;rwEf>){M8W;}he3Xq-*Fjj^Zq3kC)JGb-!V z$qZ!Mcn*CB{sXOJLzA&b?=i}!gH}q)A=9{~z>qMq9ou;4)lEb%i28t<3IYDk9aJNw z>#u!ge#>Mc8(1N1ky}m7JnWQXjBAN~EX?RsS7#+a1(}1*YzwD=*=Y6HWBkRrja9#Z zj0-w-7+vh=1iQ^z6&k&eEi6w$$EldDjOy2vOupkL`pKcfy!*h0(4I>R%kdaJx=Km; z1Ww>M}e9MuB0$sT1+=| zk?G9ZK@~JWopDu;vr?HXH(^Zm0zIguS#K=$mr{690mQ?B{9%evU|dT^x_+?Jtj5i4 z7G6S73+enC7tvrkBE>R5$>q<;_sQxFNqZcih^J2POT=+6cAGxO3TPrvi&;eV=4wZ zTP8dk_|}SS73I_SITAji1m-U9s~UkC_r>PZks8g#%Eblfg`!zIsS=8cPNb{84C at c@ z%w!pwvZwTgn?XZ`4J<}Jm&y9xl{>fM>)XvaP4^;jc~UqCxQ?2_Jl>x}f%|K+ at UdAV zR9E5A7`L3LZAi(7Xle;Z`vQ~DouluyTe{DC0B>`FzP&B_0CIO7F}v`;?8b%gw$Jnl z at K25qWgmZ0@U45z(Js$BashBiX6z#`dFuf at eDz;Uj9-vz2Cc(2Y$%CcUh`KNutt}W z$H+tC_k+K}1mwc`hZ5z3@{R<|1due-6!;j%2ThL%3|PV5;rTN+Dvcj-#L9uU>lDC> z-bJ_1>>9lwbntc?+A`;I&2+^3MEhM?d80o?m}8Fi^PFk>w8qAAF*wokXBt27CaT8- zBpnI%FTXf)^P4qA$D7Te)kwv6rNvhnX+ga)yY78NvV@#5CYD=3=FX&_qCg2F=AswA z9E06Dq6SH=?dU at gJrnYHL@@Yq3?xQrI7VNbqf&Q-n*{pVd^noAfaQ=36AK}6-a(}V zmxjS{^MB#af>7;X*S^pK(~sW=!Pa&D__jsCX5AhBo#d|z$1wJ zMd5S}?BcvF3knyrxtgr$1v6$P0JT-?%y$cKHp)W)`FxfmGk9N_2-N1)6m?ue25LKN zx__c*wA!=2c2Ag^%H-9S%cN?F at oeL|-Az`?(fR%Dwq$!?&Vk!ub~!G~>3F-6;2{$m zZ?+!2`7+&@cU5($bG`;#ARC<%gDuHwNzPblzm&N*MVe`Bnc3}iX~CEj`?0o?P*+OS z_vZ^f!iY&)@OPDA7YMtzU&=veNA`%Xif34Qb at B#aw~Al>l2kgoDk&fU1OT87`aecR zoDFP^4IGV?|CTsT{P$JpA0JuR+5T5X(%;*P(>kMc9w4}IGPzK4`btB+>6=1E5YQ4B zWQqqx*rhG#n^{OujDE`XrcYD9?cwiz8+y-~9d?vN`ZFx2{l3ioo#WK&wJEpD=M5r1 z#skU-g^ARLQtZGLq=T}mAgB=@8O?*~hM_nB?WI`Gkjz=iwh)@j=1d(kop74yh%*J# zY}>yL_zVtq%atlC0=wA~L^`C);HpwF_M_$hA?+QUD{I$v?{thA%-FVVbZpzU?Q}R} zvt!$K$LQEe$4)x7)8}1h at 3rf!x4!!JS^JEtG5&)4_l)a$ZgmF@*UvTRpWV1Ew!L4+ zkZj+`UEa4lA_&3Dn6Upu+FS-KKI%cYTy&;wyF8njC=Uc|;K0jDHIE;e?C;;q99^{M zBkor?G`kg*aaGAaBM#1HEsC{L#Y^n(WRPgn3s`Eg5k$WgtRyR&gAF!4%Z(Vc5hmq& z>7x}+E4_rvfaF#PJNYwSheiShy=Hm#>e`Q-Jj(@6iIiivvcpP)F07E>lKYM=>N|Vp zA4+?z308N-neHp1d@#k0Rlrmh3^ zcx>rum#%ju7f8r2THQ}Cu;|1JjR;??!+Yo1{afhM(fAW6NJy*-!V at X30=prtOZ2?M z#a__I+YTt4L1s}dfitVb6`zkui8RFo?x1@@TYzJl(T{iN zEd8LV&)^ceC?jM|BUQkib*fW*9pp6wk{i;{fCuDe(XV3c8a*DUH#P{qrWja7EzNQ& zgqo^$3D`Tr3afW=^&o}XeTi~MQbk_HG`T;MO)B8&qSg0*tA at G3+u7m$D>hmG+occx zAF-+WPYIZ+ru&b|f=`PAdONIWt11qI%EChx?LICNav8h%P#aP_IX^ynyp7KDBy*NW zp%)XCg_97Wz8_}n(`za;t;p-?9XV{jQVYmg0E$rJA;y~o}jv(CeA zHg_^)4mSfdkWal0dcU1qbS}m9n$uoNtvxa=eyr8zg15;vty#D&eecCr91s;L)bf$k zYS7b#OkB}arU<;|6tr%Dsg``F&9hNigiDn*LuD1PJcx9{WJZild#Uy%7K9(f*c$T^ z;NHo$cq3;=AXxDd%m4+|53rfq3Vg%VdaOkwI8q6!lv`|o*O!FOZ01zQ=CvuWvN~Dq zLnPp8kS^DMU>)`iG}JP!kZc9v*EaO_qHCu=Ck^l% z5!!a7F%Sv!h}`07z~=o4`S6G4^hM%)Lrz0BN9y{9#3`=jRyEEOu}wweobPIc=`d69 zmYtPQlS((5AC0rhyT&q_yi8Clo#>ABgl()$#^ET`uf3D{=7n+^KGrndRC256#Zj at N z5t{n<_8Jbr?4c$E7#Jhme>brHU!zgf+|KU5g0V#1{vS1)0j&%@Dsfmq6pX`R at CyuU zI%+GRVU$$KSMXwqANmuegdJOnXBfjoyPkg_h}e~Z at -YDqk~o&}A>b5VMwwYTn>pS` zYdPO9uY|S(z@&_6Vk|Zs$epQTFy*A$@g%^|jO9ofb_3AJu_O`{d3$%jDeAB*!fm{g5q+SJrkLgkc=Tg$Mq`(_%G|6Zd@ zvxGI9I_RXh6E#&?Hib5}KBQ;0 z$@2SA8mwwvHjzzmnxON@)-vY`f)f9%ulfm6ipyWa3c^j7ftNyD|B zRg6-x07v*#JmIQVcECBUiurbVJYniJT&*K6Sj7|TOg>iL?u&yp%UFbAFVaP0oM!w^ zpOYX!t^RVYCLsh(&Tk&!Rls11q>VEZnt??c4uun~Wh9l|z=V at zAYk)7(tDbEuwGIZ zwDk=?r?Y+N!u;-mf7|3_)p5J%f;d at vWUXc-mtJ)X^&mjSk1UaxS#8l0k|3PkLhE(I=v9SWBmV>~Av4ZE63!E`t0MpJg-9l29XsU{qE>_VEaA#n z7Z=*YNY#(+G{^gtE3VN%uCVsu$n}#yu0^?H at O3!7KGGwZK(fdX zPtKuAp^7kY2|v9Da9y=AAI0pSlqw5DEDe)0&P9dN+(Y95J()$-4w9vy{M`1WH$twM z{x*N`EQUrG5)6z60St`y-z4>47Y610b9$;{R{9rGlkys3S_%@_-Qjr|>L?%(aTPu` zRcD<-dvMPp-GNghK;{GDV; zGe5q_72pozY{bmgql<&Lk!p=xVEfdg4iao&MERjtX`xm5vfS_EvG~#L_O5Ej2bqcv zc$zSZ-GFT)JctI>)8v0kxRx4-M<6^Ee+wW>-=sFfIwum% zV0AIgK85^BsY(THal(kJQ&Y$_&ATtKPnnU>Qlk-0g(Gn%UX(=ISV5yx}JvFFr8M3G|^+tB8VZ8=9*SROI4IRtdF)~&6jnPGtbX5*IZ zvLc;u-NenN&04H73fz#&s5enC-{fO+vV*HQCk)C;!opxrjk=L*SST5|2SyM`BtN(u zZ7n0cSWt`sjJ$Sw#&T`h%(r2- at 1$AeSYmSel6Q at L8wr^HNP7b(#a3c7wbdLd9((K} z1xQSs{NjLdve=kaRj94pQPj at VUZe$+4T!1xXxXXtgEwlhSWanVA<_yxPI0?#;lVC| zJ^paYdwm9ywn_1eNb|(-84x8ZNC4|vlqs=*>o2%-{w=Ec{!B0< zFQHN;y9WRq3+)Awybe*8Bj1w+wzsb}f2IhY3j$`Po?01^=e!D}zp)TvA%`uKB%N#~ zP)g4uNegC5&YQknmuwH at Df|Fkae%|Xvf>jD)g#k6Dmx69pmO-w_I{V7a89@#9`K7ppmbPJ>&M7W>jHL3d+g8oeK_R!pq>xg_=S=;+1`yZ$89gVP_wfi zYjdan9`C+~UnS?1vfT(zZ#E2Kv$sya9Xw~6>3zY}vERUb2+xIHkH0}D-*@tSi9?Sn zR3au}B7fW50myaE6Yk1xNDj{Zq545j{yD*D8pFQu497-pX at 7qGx4jp<)YGlAU%ZH`wqdf1V`gRxl<~mLf;qcFDUkK7bl7Ed z`!)tu;(bTwcppTGx{s8X`joo%88AETRCd5b*ZL)ZpFhz#jjFm?p1LqMB6U+SB#s~l zOeCQ!d3%Ru#Uco+NY;vRu~!@eWFn?jyZp;?uLyReA}ZLFWlyf72wJCjKcnMp6w7VcJ;^d~})Bj=ZZtZE|rLgV%4dG`l<63f+q}R?22tWlcv+~AE#j&2L`;4vO>O<>s0Mvg zopNa*mR={5e<1!fKzOWt at t6PdLO-Cvz=Z$J0Qu_`cW`s@{!4|Dv-~q$N>X$c(Ueg} z|CFU)3`618!jl@%-UnAl6l#41lCWs7r?JnqEnG-z>v=eLLA at vlT9F$0T|+#}$@$$B zVIQB at O38A-%llaHvb|+Ze7{U5$`gdh7z%;hn>}zAh=im}ZV#fV*py4UNaHUxZ6_Ec z01aVsEeyEi-)?$KIpGu(iV2&cz>$h>lw51fhk z9>H$5R)TC-F*ge<>)<|?qAqIL<&q1U2+6hK9Xg6CWHPn0w}ih^rzW96NzHqWqn0=# z`d=b6 zsHp+{)s=M7sq>j8zdivu+GI?&RgD$59Yy!o?Kpi2HttjnEK$@t$h|$@UuRj*slzdr z4{r-^qvkIN at qHB5mo6e#42EU}xYd$DP~L17cw=)_YMO2z!vVeD18gXAbhPE=lQ;8J zqdV=?<=}TsT+=d_1XXEpbfbD?d4tD-LMYFM59WVCL&;XL#{Q%X=YCLRoTfaAiTbW- zq5h_Jmc;$j|MZ&8$AIl;rGcJOwR;iqF7SxlZLc{LMM3(czdUpzLi$8frOy=Pgr>pU zlV(fGIih_;5#v-zk4aANQb7da=BWcRhb2%XJZY_*ri5bS8uVEe=HkCA!h86P^#0|CzILmECpgj(JV3I5u`M~(2qc>{sHIV6i!IUq>~o`+zQo^0{zZWk~pv_eklVN*sr z#G);#Qk6@&Lj*vht|AQyG!vCnhghb35Z at _=uGM8SlOY;QRCX8O1iTQW;e-$4ZHKs_ ztL;mB;q7!QU=v!tX`YTwjXLW!wJ7UJVo5ve;7EW at yuk<1d!t3_1O+!nF!J&Ojvw#- zmeZY-PX2WMi^&VvfA7NiZ%qEvpZ$}_b%%7mV0cm);4k=+y&ep4Mjd;g^}^6|b2D9S zbC+3H`LpUfMDKHcWR%QaG^Iq$C;5K%g^Cuvl=VO^kLyb>kE=!6=KI|XLLj#bX>dDA z{-`(*l`+z4_r!oRENv{)g2(lKTorE+{`U at A79NY8cs0{@=7W2f8!E7Fj6pg%U zOhuAj1vLgJ(M_0XG|kPwqIgJ({tTC)BuRzYR9kg9s!@4zJeq<+Yz_`wt}@d`fjI_| z3ms>g&8zgja9}n`gTvgRrMnzEEvG=B2J1k at fK#ovEtN2rS2Ur}l6^sIf|hbHRYFRX zPlV=yk!s at CPt1jTVd3PCFfj+(#0e@&2{_-y$ScMPI)MG)?mgN|1->rFk_tUpT>?dd zdOG`>9!JFas)O&m1i6r+xW6#t<*rjyx;2;FQ*Kbek{V!b5s|k9Ldg7VysRl#r;h=; z&K(wX!%HYlWjW?j!{U00;12f(i)x1x0-KO?Spvo*PM6@=M{tD58Ds^Ks5WyE7kz~$ z1ydE;s^_T}p0T7E8_ZgzGj$P2bZDM98;1lZZ?&%?GeD4y;-o1eqyQ%+J7%ObfPV>> zk&ZGz%<)O`CWwBF{)EFwfcmu$d~o)QEitidi9=vyL6Jfpb11T(?sEIAIv2ywFmrWX z(pf;>ASDdrVBc1Ru7Ip#mP1LmNv-*P;p>=>Y_W~&p{5PPF8#)q@{t9uD{g zWypRGT(jbhL*@}DBP=@ceCz@{KMb;o$>VsWF&*wCw)!6|ur|^OoVLF0baUzveRMb_ zxv^7uR8BPCs&(<4!+6clU7>8$p+p1(r|-JQN*y?y)4iW(i7%@oHjTeq73e9VtvZL- zlv&`_-GNNjneUxd7}^@}9ruHYD#v()c4- zH71yqCtI{gFqve6-Sk4Ct9t0UZg-`O~xCYkBwYBd4Dwc>=aO z(kG at 0ODCOXc(z~PG at j3{w*NrZW99kG1z8jEvg{AiWFH;ld}cok#&h*>hqpaHw#Hjs zUCTchr4dO7Ouppr at _##e@$Q$rr8#2ssvk>XU)Q-M-WR1ydvTr%$wn4F5SSI9hUHeY zV1lDA`W}-eTfF3FFoEzK$(=OkT9us1sFXZmz*|}a&mPB6PG at 7NGd1}{kf%SJ^qL>& z$;y$Z{2-!0W~xdR*=VjI&sfTOXJ)3Sk6F&P2=7C?DG8Ybi>?YPMGaA12pJrz&|Ut4cFWaP} zAmcjSB+VgEbENXl8OaDuH>+B+z(@<#Z_m)$(%Eh7n6D!$s%FGy+XI@)L`mch1}U{y zPxq^2*33^GSa#&whDT+UxJ%2MyS)-<>nv+ZveCtGiX!d;8nC{x(sg*RB`_4guknjE zMo+p=yOOzUCRHqs1<3?MrU8HoGAd93sim8AHl4)BWc^3Q%HPJu!gdQO%NWcx*}ccH z<_{ERO|zyl at TWsFS0ov!TFeDfr|NgjbW~kS#<`A4T2fkBSU${S{^Z16a7KnSc?*Jto1#yoiT<<_Y5$%ydX*#L*!y?@sX9lN#MO%9@{I2SRKM4OwEGBx7 z&bHX135Gx94h7VR6N+uLuV{?L1D`8XDs!mQf(R;wUqU;fZ4;j8WS91>6q7fkxaze+1T~-b*38-GCE2#!Lr!0Ui7HE=V(j4#Xqh z15bq%TdmE2 at f%^j1bi=Ep}0X=w~UtqqTy#i8v?P)XtB#d-y_0}Hj2$2i=b*_w!Lh~ zGHgnDryEjuQPx1fyyqCWORz$kHRJ7X*BzGk5`!ZjQ|GJX?Exa$-vPS>{%u(SBvK~r*j=%k at A;-jK|L17YnN?Ix z5hJF5gr&p4ekWr3o#sSA{24Xl0E5f?9Fpi#r8f-H&p0>L;SQ{er7Pwfylw{^&W{G> zWPN61NKT_gAV6raoD9~a26DhWxZWlNrJfj)9yZn-1spR}0xeiMQByki6Z5-LKtXlm z6gQ9OwA0lLcFn5s(h=qZ!Ddl|WVxqF?Aefb)W~I#F`5k>PjI`4Qr!Smt#MVm0!62B z2tk|CsQjuQpUKoz>0%(oLnZ}>4U|)g)o8VzU}-WgL=J0u0~MqZ17<1#yKwPHZi}-_ zxhN%D1ZCzQPH)_D&%!jNZxS+j3x40e{CG~nJ*R^lT7ivnoMr4y1)dk3Y%KngNXoK8 z8G&s>yST?44Q<}G9$v8?X#=Jftl3+~{gmR1h7Ox>*}z55Q3%JEjIxR09g-#CKyVWC zlyM12p4}$B-!4$_Q#|=rZ(kmJ<5o1ik$ywE6*zoGN%+B&8r^rIoSw4RVTThfC at gw_ z+?-pAfs+rl*oe7F-^21<2sI`Tc4Q`{d)p2r7&FuYUO)|!#7fx6U{zSeryp zwhb+X6ErWS6kJBO_vIIytS%3xjiwHvfisc)UIC(PS6E32;ID6(w*Y2Zve{a at yopS% zqfyodlLPLZ>niR3NuS4_SVfNshe4y&yC40JmOo(s`fEY}dEpH~fq|hR{d+P~)X~n} z-hupYGE-Am6HOESbDG>tiWQtTnApBWLVkdv+=~nd30VTJ6RG9cl57kJNyf>PQ?j$S zx4mj>d9@&V8;C}}(7`OwubSw6q`HT>w_LnrV}pZ}#+pk_b)C+>yXg7h&zJoEaOL<7 zj634$!)nkC>_RH49X${x{o|xhH$bm{i8#0&bI5%IcF%s}V33d03`y#SjpA$h8kpJ! z{H%e_kRFO|!Hscl-sVvVAu$?G9P6`DlorYjW5`VAf=fXNX=5`X%Y)yDQNjqK=v3T^ z3uD<4wht9L8=7pEg^s3a^JE6Jd}l4KhTX5ESZyA at tQ6HwTo?2qX>}1ccH6*Rr)Tjn zGB&^#&{f0SDti{-PMarPp^Z0CZ$F at B<}WdA^S-uu??QzATN073i at in%KxHs%RZc9k zsQXi%o&kL_yH?$r)SD$2Ka$FF4?-aBGZ*#aA+yB7e4;q8EtCxH?zRwrLN}8T&+`dx zKW}*+WOvwP);gVL&aHxxO}&2X2-lh at O+}5x?j)km!udb_*VF`yC|+l3{38 zF9$%@vFs8VdPbNNrQ^WfWW=zBS&OPKu6bDfAr^VhWVWO&pU7Zx?UVXka*&PNrPP*Bv?vu&XYH=#V7>WtJg>tZPYSV zSxkx(+Olyd_VUGxb}E?cqILkwtk at UoJD9_;^p{NG>sTcpm$ZZR8QOZ0WLKB at DzkRN zH{cs~SsK>x8HABaTr at N^=xL{?$nY{a at 3h4U7S0Xm>0SvL>5Q=qlI!t403l3k!TZCH zR=?VZIj#~DLMTX?jDg|g8~yq~S=7Q4bZ5l at Uv9=-{|(Dkm7~~DWM5L z;EO}rVxW{V4#6Qpb4;V%QG;_T9pL(mX)Z9c4aYa(P}G=YU)!p9sN&tBlZu?=#NV2Z;Jo%7C!hpNfXRJ!XAFG)z%WARr5Keguo> zi9Cnp@~_Gk#WSNIk%-ww)&ctj@$-4~TG4i2Uj&3R+ozkzXJ(4GcRNu1!5`7L^0=%n z=;mnEty1-B^zSidMSWTBJ7YAhMrH5nsruc8gg4Qimx)=c3v!JcZ4m=NlB=@OV1sOs zWt{~1%^(KwoM%GT*7x at -{rKo?9VJOnoG6L{G3|YkVZ?q4vyp2|QVVtKLfyD%r~`#T z_?+da-RdF34*CtB$ooJmWB)J_MR$k`sT*KapU47s at Waki!0DwXe^)YM%iK#Ko@>aq zo!sC8eX}-{BdjGsm5UXfma)_`o=3YD+Qw4YJ}dn(;Fwv}B|B-D4HB6kE5_Ve z)XXE)0n5Fuy$XxI7K;CuIXq39)vr=5ljjth?={xq`@R5s?XoePPM6ZDyVOB&Pk&O- zWwz1S*wMFjvWx#^O|*8 z1!dA`bkBXv?mcqY2CW&qqS*sKG5YV`qm534&gwwlfePbo^cnbSSN9xmI-C`|WIy5u z7qbC6WRk*9UKSIFAX6-PV_wdllFEje*corh1G+Tvh7`s at zhvlM6WMru7I(m$+hwse zfeg7>@)xs;{jmj!KVLRVU!22dc|~B8FJu(6152nBQDnYJKI3%^U>Dnla*~?uGa9R# zWZpeR5MtNf#e9t;|7}8=GF0V8wPJE=8mcfia{Yj6`2ucP9mJ-w??)WnNBuG~-652e z>I)5V=>gh~K(QEAikowevMLvz>dNO_&F9oAOC#Opp66&`y$Kyd;?T@`4qBzz+l3yk ztjhqH*hZns8zn7=pDjyFuMp1bBn+bys0XrUJYE1SJ|N`wfDWj*Bpc#3krD4Z7ITum zNujSFo$uR!gD(~vA~4}E_(EX+yFtbOSMdGUsxnVpar6KS2)n?@0`G<8^wp>|lnH3t zGlUFW>4lM5F@(a?Xx at ZGyRP#idQruNPt8cGYv?~AR4?^5_o39S z%4?R#G2s-Z>mOdRUaPO928;tQTJ6~MaE!G1$-5{$=7Y=|e0osQu&PQ#S~Ro(y#SUL z`?dvdG}~rIZ-uf$R{9h?g9#fSgM~y)2HjlQu?K`4WwAIL`sad&Y`>WN#u)%QEc`0pF3?Z%x)9>ls%%ST!u|b?&qXL!Z20UMvBLzW1j#vL zp%tHLpCe8?g{Rhda|n9W@;Q5-mzJ^;f8kjKnT^s0-*AsEPF at R;3<2)CF~Z5d{Eo#2+b~#qoxVBZV!`iI;kAv(am!{<#~UL<2B&!zc;`6 z>)An at I%wt8o>lyc27+euCBKTyi#Ju~bV1|{_&S9ex65AhyO_;NFgfQNAk80~ENc^D zeQ=DBR9_6IGlGR5^rC9y3mOS+WzLMiTla$Ktor^K$i7whVkebUz*Fd(W9QaQbSgcn zTR?4rRRq}H7jY!8d?tvz^}~|x+3VpS>GbL+o?WfO-kzKm68=4h{Ou$01BVLs-AbrT zH9}dzvmX(LDi-q=6dim67CkaZJc<+Llaz4h#W!YusMHG6>H5Z-;~C$fXY>8G?bVNA zu9`*pr_mmV5AnY3#*14(pjySHWD@>9?DY(eyen z%=&_SEbW`QLM7(ya9GUO`iM8yv_eRslm`0!#25 at vuIQ!=HlS!2;zMaAGuPT0YP7L^ z_j_E9X at u9C1z7{N=!u#2vK{n8iM?x^(P=ESOVdv at h8hl*{S z{D5M4D*tBfiG#T&lP>?9Oqvx`)VcQpXOB84$1I&E*jMU;B@{s+j17P(pY_9L`RB&N zJ`N}Cf4CpM-4TcB}CmkcTb56gVqqU3|&X_s6khP3a!&n7Qvhl4NUc*8+h zY1_Tez^H2l*TH};BUun3AX(Te;K|*=lc`O{qr^&iQ-7&- z0%kEbUe at t=IHPVATSl`#a6IJ!dc{M}fCX`L|3zq-TA*GI;>eWo7tcEB;$%ITx+cMjRkq%sYdLP40QPsSujhD}Tez9co5yU~D7VogJ4T>FNKQl(=n_<`m$W^T at pQ=^zkBGe+j~&tynx22 z#?nvYm}Y5?-QX<}?G{>eRDZeca>~P78(J_Q7p*uUv&@%D6ZM(mhKa3$fnd+X&mwoe zIEbg@{VO0wALzF)kYHfs05CAV|0y8aWiW{ z^WS0F{lrtaARGBp7s0wC9El at zwsZroDR+JO1$IkZ_LI)a)l&*x&Sf)Od+q7pHXBf5 zD2o{uR*#T_9YfN{$koiDWs at AK1;z?&i(w*+RXTBSq6^s-W3N$m*6*9T09T at jyUfn6 z;$HwPMJXIlq3(&5y7kvN9!F?vPwG)-1C8Z3dsq7|!FoAFj_pt6aPgX&h| z0+jB;Lem!Snpj%1yJ#x{X5t8VEcYO!Ht6mb0V_NOv;~eBgHXNi_d>qFCm9;60KOZ9tU0QbPJ0GM$$w{RhPre%+(9>IG1&0 at nV!m`k z%Bpmi7(pkyfMQjs^qLxmkb)@%alW875vSh`Iy07{<8HJ6-Y=PsxMagu(%NiYWrbb5 zbv!RO(01~tH%E_F^LPaDYo+yID|JTlA6p at fLQ{jSI6jyh at _c~PWkuJJ32RmxgLVTA zQPc{yJ}W|6;k1>4Px_%s6j917h!Kt at 8?8Xb3-1h-Ge2 at Qg*mV|l;H%`1v}A*n8Fyl zRBY2!cVOXtj1Sdkj%pw&VKe~}52`l at wSjC`f1}jKyV at i&o;7gdSE>`t6^ou1J+{nD z-wAWE0*GqQA9NJh^_N(tM19C&aBs_~YU;3;$=wor`LKwiUdK&!}h#5(I*ZG3~MUAhKFpELMC|^aU|gv zp0Q~Ra>7y!PAA#d2wf4~Uu#U|9zA9VOyE9J_u2R57>6;6M|pig*&C&Z;J}FBAT$yB zfRmcVZ6Q{?s1DZ~O?*PxlEfH{58n}@3973Kth<9kHW>@iCn4=!88#-$|3xq)u;>TJ z;zzVQYaFL2%iT%K-RT!+T+AP*&N~CKdF~8&B~KjO$>Z6vukC=DwzQ6!{rn=|q{#Mr zVT at 3|I+*hH7})D)AcA#wYJ%a$k{8$6E6HW(Ows~?!9hRFAJ9w)t&8`jId<-!DD(|g z7B?kj7i>q4G&c4kat9dZ=TJTX(g!!kr>_Zd1 at V9Ux!T@@ao`}4tKR;K(kq_sgzP`y ziS*_ at a8~$!92aKIA8YB9IE at m1zCwqzw>0TrGz0Ww9b{ZvO=DM;XUifxfZAlC7LCEKd|E8&wY4s^YX!!x^nf} zT5vVOc&ZuktD=s><*f!Eu{k6~$ez$mF#u3A0d~`$dkfR}nY+?P_}FZzYwK zNLXqEe at Tw`|C!{_Ft&3ycl|#l2bwUtKvN2%E at p+&Uy{QnEWij$Nz6{XLBxb!g#I){ zQK2ol(X4CTu1)MSnTfKnA7;PlN8r#OlkTRPP>~OtDVy;G)YqL<(Z?i!N*~mOgfP;-K zoXLTIqV4Loi}s49-_oI8b4 at dSu?6r&67qCDCD5~k-a3dg1F+~NyX}^L4j?SE#h~jY zuTxxV-+sdbjOXI?)&J6^xEZd-w}yEz{=o8&FUFDnHFM_vmT(T*_cfzJwanbwd+-Xh zOs=C5Z&n%Uv|yI=9CYofYwRjH#~p4dRCjORzAr!cUdviGuHsOgW8zw7W0(F^kp-r? z#W==d7{P+h6s%9FdW2|v?p0{=eFLlGFU2tthrU^A86{7*`VYl%pu-D=7iZmtI8osM z_id);#4D78Koon41y)}Y5bw_4-x*cLdz+zt6Jy*QT_0zgQNXsnPhuRAn+F#A>PV*4 z(4X)kBn>*uwJBEJiOlpRUbfFNX1&S6lUUzKPk6G+r+qh~5T#E%Z#`{r05s3K5#;G2 z(IB}4GL0{Z=tcql>+GG)KU zEtp8n6M|APYN`xk!*oFqOJtQ<8E=C1SREt*_+JLyag5fir~+AOeiW7kzsRt^%XM-a z;^;=hAxqnb%PDzJm7w8tVU;0jcwEzouT!D2>B6IRy;6tv17kN{X=WlPJ8?nbkbRP5 zF3q;3xaCm9{yVu!ki4njSEhX=3~*Z3P+2c2G9}oqP~ZUc>}!}a^2*>Z#eao^c4z`@ z{4Y4t|DWLauZ0fl3TVpc`j$Gpaya=S!V&r97(V@&|0f)dWf#&otU1=Ds-!>mke~OW zBdxCcpU)i=o^eL}OUVk99COSpuGZ39{xaUT7o*2aV3-XR1w_^_8m}-km;)xKI0%WvR3lG{2Hjc!q at zLfs5FC{1uXSn~A`tz28_7Ta{smCg zqmHWk^Jk*RS0c`U{wLVXw0!^WIc8*O2d!FB7t(;zQ--Yw??<~mjIaogF|8F?(5b`Y z#^uDh15KAiK#kQR{begYt#>Kily!YE-kqqN!xHQIq5toZCb~MTgAAr;>?o|*fAArn zxaKUjRPLmC at TnC}&!^X{s~~QNyLIa^$;RMnjb*2WvEYEKVK3Y6>!Cg>T78N=R37)` zgtySEc%NlioqsNIv^uH`P^2H>t~U(0cp>D16Fqo`v|9Xz7ZimEy8olhO8=xrb^$Kg zzEQs{pKQ$fnS~}Xfgds9x@?G6n?8;bOV!EX(~JjBpzZmoT)1DM4d#`YeS_C*?Q0#K<+8jZh at QI9Lac0YkLEpUkiDJd`ucQU#I zOi?wZ6x_8+NgUyRK|)doJxS4$Qza4Q7smn3xFzy}xs*a2fq-tl(d$i9Y{%ngfJ#>! z-a+2)Yx%raha at J6&S2d{cayw_^H0qLIVNs_sC>v zsO}x8s~=zgfHCo(Brdb@>NEP!QW4#c8}4Mi=6sjVY(}%!p0MCJp5%Eucf7jF zzN6 at PSP3VBSPg3gn;UR*ph(1^8Iw<4ePe at 1L-@Kax9fA+TW^}OepGIS{G{2k~ z8qOr%xCpcP2N>Yy^9b%m5ze}U5N~jI^0Pdr*zqsqcHfTp*ZWA1%;4 z33R{Gs#iJax&e}-lSw7z;T*@Miv$zohD^Iic8T>EZ(>@gQS}rl%v5_gk+ky;aF)&r z1Kwuj{Lx($=fi?`)pg^S}xgVbwWgEBflT`um{=r7sNh;WX3HS48oQ}s`+8uO)}>k=&F>5>!m zBgg10=USwQgOxmt)h^qOFW@<)_BT*iJ;Ds|Rs6p)Y|!NOX$lM6HkbLZpNh<=M4wcm zDSqTfnchdp)M`+d_Q(4*mH%8>(2SnR^U1OUk at EI6hU42Z%_dzbWgy z=-DdqNjq2Rno1r=A8`I4MyNDB}_y*sd1PjtI6qPK)LBkH>(pK#E#9!yzJ zaKd`T3Q7Q$$u(+lP#B9~W#n7~wS*)Gw7Lb;$TjIH5cHxa`N9aBCyXj+Sm;MPM);6t zC6b`iaZJY!#pp{}OROWoCW?bP=;VmQ0JzG}gyD~r3<#&3eXw#S=#y0)|F1#xn8d^6;;}??Qgdn}Eix2D_Y`+$u3?p)q zc?On+<>AZ1p?)u35#atxPrkx7>T7K_CPzguD!3tAu>#m{zzOCK#g8tNPcM;zW)BVRvBmR1lriYbWJ`G42=EXKDYlfo1ppf zzbihr%y5zb5slKDUzH)KomWI6NX5lbYLu#%mywJ^rCJpz%k>#Nwr#O&pMDLumI*Z< zx2O0hD1Nh-X8z>@eXgq*87xCXlhU`u^5fL z$1m at dIApqUvQga5VpiO9ZIq2M{geARY#^C@`b{Zp)ZYtS@%0)#_vi=*2g|R#uZfk? z>!mQ}*z2=V>KFdK)$tq0-ec=mZ_SNa?`3J+C*+YP_TwfO=ZI7$L5X4}9h1itHu=hzk1>z2)wigbM?eofB#NbGC3xO7Bc|6vV!{cvMU|VB at B=M8-b@ znf?*z%yiRl at ZMd$&+K9frDYEz>V5ZOw_)p*+#+C%>rr%e_KENGGOj3|diReQgDZ z(;Xb^jV;ic3>8sp_<%K?Mwo3Sc%d|W(JZ6_tN9&%j_6CQ<@Divc2AB5Eh!w^ug)|X zNjP8eFFEOy7uE at K< z+dgb4fxCF6h}0k=zy>o!uBPi9vahdI#ou#bMH$udXV56K0XU$RZw(1L&_nQ!<<>s= zRXviwlsOt#Sxm6>Jis5&ig2EuBg4RV9?nMv`2j5A9wtr-sTE+SOt}4qmg{z zj$TmAW=KW#lxKqj`yQbLY~Tfl;Gl>K6h}tk6?V~Z@@Ss{d34X<|BJPE3bK4%{=B=a zRYsR>+qP}nwr$(CZC978x at _CFtKWUjocAAd_SNi(xm)qOTM?Px#FP0+H40x3!@6B5 zUCJp9!!kI?SD1y<*x`9_r7`q3XtlL~Iuq}rT})4Qbd+*CjIN()DDUNKjDCHdjCEF% zpU>m3vig&sRf762z)5URE(f;{Li6&k__HBA*n3vA!+15g;Y9El z)oI8W;EesI{{vYfr#)SZNj1TDpx9^3 at IGF1Vs+;89BnfJWIB;4Q2~z` zjd7g~amKJQo5OlgETC65m)=)n!6n?(G8 at bG*Hcl<6{$@)7pZAZiG at +BK^+DVuFLwV zk|u%H1+P}sVcO>Q8&h(uyT)9ICe7$pk?5v63BrU^N2B; zyhDy(kIqG(fvSKhX^B4i^i28X7oM at AfK%`|fb?3~v&sc{XsA>MN>%0_FEs-4qmI9h z2h3+QVAia%E`=ERuRze7#lw at DX_Jh9%}p0{$2Lk(Bc%&>@b8RBa6-2SE-Z#Uriq!DIGNgF#=nV5L=*9mUvdjs}9oD46s%J;mm7hCw`(QVIn4F+N)ZQ zC at I3wiUTpxLX2VYy}1G472VquSmO>r-&O at 2_74tB^{zD2`-Rvg5)$lz;13YbsSwNP zLc}7V#2AI&Q(2Z;S&g+W8f!wVtqdAX*U(9^REJm+ZCa@;J=fJt7kVQXbj2+6GU%?5 zlb at r&7J5xmo9$W_eAi2vBE#461VEl at Q0hI28$yYpW0n)GQJ*f#_2hbXs`ova74-rr zv0c4RZGDl6rW5}@*$9x-Rh{^&bnpHv#IgOeq5J=OB}m!%*Qm;9pBs+z7AFLGz7SXf z-bHA%#AgSGUwnC#5>l)Fe$tk?X at Ql*ioh-2{V;?K!Y~A$$L${m-t_X5RNHF^(xtF% zuj{uvj7W<5XOZ(#hO4VThuH05FN(Vq#4+!uCKBUuh=`31QJ8l~93`li1X+l)6Ja;Pl)td_BDoGzW0+-EwZeOv~3w zE?EZcR%qfPTQN2kUNsfui*2x>Yr=60dZpCb3RPO28cuT!y!Opf0|*u}KU-1^u8V=V zEUHm5b4 zLqEpVE_DGdYL0WU81Vql9_BD~I49zC&?4 at Dcm1)49C+iIzr&TEz-vAfG;#)|ALz_n zuR9I~k9&0M1Hd+n-?M at L7K7kj4~uKH>J68G?~;sgCnJuP!QsCY`F2b&8kNOOlu~LJ ze&(~UfX%ZV)bqS`KZiWf-Kr1 at 24)XL_YTURO_D+2Y#iQL+xJ=9*JT~JSOS=C`M{ZJ zSN-_L;*??h1Em88UVoV=*a!6A?m@@;+UEaP)y at F>58)sG&i?-U9Zg3ISq;HgPIfHR zxW-%osG`I_5nk{Xq?uG0tk0jATv)NCWh zcWv2h(t_d}kc8o+1U3gN-498;35H&R-2KB0pGpw?Q2U9zX^d0f*bGb9QyHO=B9WHS zy^ljxadM0y%c4X%dTr4!NLXYi8w(bylog{)y@!<_SxOpHm7qyj1VkldR(_)lx|bVO z-BJd*O{*(mz?HG+Of64mp(XahoMun)oPe=_tsoPhWIu zW>8TqRZ5mEoolZ<1R>muf|$7w>~#sZc_Q{^+?n;F*g~cUCM*Qtw)Y zpGAA$a)n-zBnkbVOkycmGR at yLPwDyXRhJ*;Z5*RM%C;3xac$VttH#a*R zDmh*hBZ+S~5P#EM%T?RgqzdDXD;GJc5qkQkzL>qHWC^GVPch%+!BYlIHCnTze0#C_ z*@`g>VRM{4LIC3n9id7CYG*=yG(DOLJ*l362v}x>bf2+RK2bh3f0DkQ=739n4bQUE z7egf-$&zsdF{y!QapbNic$CrgPIyG*6W<6t&G<7MeJ}*x!ZLJRb_&xtl&cpsv;oeg zLM;+ig+Ya_)58rr8arA+tx%C0(Q+lI at CyX2q`l+3 at uz+v2|JGJO-vT#ecKRJUux at H&$FZ8_BP=noyV(9^69u{`7D z1tLs;RbO{uzFFhfVAr+*3;3~wQ at dN?!b_6Zy5|c;QVp+sx zArN!2!6fo^3$od7L^FFHKsR(Z1aOx^k8SwxI70|u+>lAsf#t|{Aa7uux&tqlJcmj+ z1Wa>XaQi!lMN!)?g>`eod3P9y4^HASp--cLjHSZ*<~W}dvarGJzv{A*oEV5 zVR78f&cC^ch{HlO*(#psxqV(t>k+p(pn<&6b$NmD_+a_?f`E8K5pjQk!V?V>wNDhO z?;f-d9;ojnsZ#zVZ-)Xb(81L~E=WjLlb+?F#VEZqxxk%J!~hYWBGJZ+CEO$Q*i2Ha zC=%OQ$t+M5X}FB{GLB$l-p{GAC;nkWE7j6i9aJdXN9E=94`2BRPv?(MO-9QL94ece zp)*X^6O1Mc_a`=e1I%-WnE1lJyjDvIMhDg<#k)z29XM&13KPHUnJ3N0E%G7}7Tamb zcBGc+OoD2xzX!r~Z6^|ERV)Oy!O?X5DK7DGcyv|9W+h{bNYWY_x7jz&W!J!$MPnFT zX#d5OexgBr*EKYG&nt@=lHkNK-jQvrEsI2x%?wR+;+W{fA<=A~=*SgH{+EEdjxsAb zMiVey%QLd;mJwqS(Z<5ic6QI?_I^aMIpXC{gXxuwj42syiY4>)qxgkSekP=pg|kXd z5#1j$Plh^#Fd{Nhotb7kYYG^Qs7r%K{I-ZB2hEAkQE=>I03b- z>%t{?#8YWs{>n4FyH%c8`B6zYeOAir6_rg?p#u-!}dl`3^w^gP1uCg2Pl>Fg6~Ld?-EoR&_qGo zG+0I#IhFM8?p)B_;`hXN%3oE7-GF^!lT-T}ey8@X;>lx|tYqe5q z$YgaMh>PvsUu?;Grs7P0U6<}jPeV$ZK)Z4%G+rfAAPcA3MA0rJgRv#JxKx#^MOk at n zCtEYysfTvq+cT^;Eh)#&%4~>?pJJwJSEM{Np7%fjOfCa$j~^=syrou0E1&?SHchIn zwqvZ2iant at +{V&pajv3OYR`nUPv@?_SE`jE`_65U28^|f+8u;$+V60MN>jY)ohp*m z$8BSH6i<_;cw(I_5!*A^Yut at -vWP|dUOf3Ac2|x}kpxio|0%9jhWYCpSzDEdgPI zExRoRA0Gvmq-145U!A{2o33oH8W7eP1Z7GE$1=V}_TtzE^MF+ at h;@>GyVEs)`*2zp?$HkaXqe59q at FvCg zfr%Qam&goK(5>5UrA`u<^gP;XyXD^b^1dGxYZQt&WwPTsNK!w8_L7}i*8OGd&iYNS2TsjK$XDuA%Nx$1KmpUUmV19CB} zU5db#KzR>D(|3lS@!m&1kIeQGnLs4>Sg8tCF1 at aU9F z;1=XO`TYDt9V7L4A8^8S`?sCwY#;Vn at 4w2kf`14t{qK2$l%yRyq<_JjCKYP2%kXQK z7V$)QX!t1A&h2WtnQJNxear`g>|m^SGmoaR#ftufGBC{f4M50POZ(9Ceu!b1!Iy(s zQm0)`UtUh1n3|gTeSLp}@IxK3?~heg==b+40z+*oD=CaR0y9*X57XeZxoplkq!F}? zmZj66u zU(H^-dfsaF3w{fI9<^@TB;_Mk^Cd_@;z~h{%FgcN2*& z1VEGZB{9%xaM+r4MM~AN&7!aT3Mp82v at NG}GN at LrFKgo1wX!m|*WAmC5LBK9`oMQI z*(ODM^3dAaOQ(;PHM?F at NC7S7C#uU$jA_j`l58wHn_`!d1Lahdn+d{6AD=olQdTtow2Pw zPLZAQ9$y7g2}NN1SiSo%$oPU6Yk5CX1c?&m6re<9N6!ZZOs4dbt)^lgAyCY55h?jB`{zQ%e6$0`^ z({EzwV;D*u#)@n6 at llmH*T>jIy9>HJVkX$??vM+0D=EC+V){DGf?Rjvc zJX5!AXy7 at a&p-}W2N8yG&wuQ3*aSPmt<7Z!!6Vt`#>)R8TKc#KC z_`Y*uY9chM2`Z{GnFF{PYPJ%=0k;+{xw?wI0{=5^=9jey{?0jv){)HUT5~jGgjTFf zmI($=-R85imyjD9=Xt<-l%SW|pp`sbcj|na&$%oHzRuvjb)gGt1Ws615 zt#wTc$SiuE!6lwil2Gm5Cvm^ZG>BY_l&pdr at 8(n8d_U7PNR+|JNyO>}G5wA54Q8s%|Cl zFpu#3?W-XXI~$Hx{u|%aMo6O%nB at jWJI_JtncR`Ma|E5N5cCJLw4jlNgn-ThnuKT+dVuHqlDgUN*@Uk&M6yGidb~F9Nj?_3pe}(IP;Kw zu_0)YJB)d+d6Hs_lyR7ODd{GN$>!*I+8Cyela at Q6UXo2BYX4H;h)Ci!1^x_5iyMU;`1A3%+f}^789d~LHwWF4iNtZ at LVF!HV4$;EX2nY^7<=-njjfM5(N9hd;j3Q)ta4l!Dh2%qNpJ}(Z#;8Y8F} zY8ZysWuk7Tx+5%@b!&NbmRf*rON~w?hJRlR{=KyRY}#P7fulq>Z@bZ%I4qh9flU(pFI5lWl}C`!DK(+>yL08Je^2uQ`Sv?wTG$+&dPj?w}4s6wl_ zGOf6TQ^uEBn?E!gPB2Xy&Oazfb=f#mkDsv%b8a0mDv5%mgnIP}1^HL??w{QGG#hH~ zzyzc+tW!W+Y$lfgQK|Nv3vx^>RZ87U>-iNGYhJ|yH&*Gm!=mnqTk8nJ9Pz*HEsOiL zWyiuf-b;P*g2}f#JxVq>Cn(|P<61EzI=7tG-&F=T3NadmnLmBn%}oUYrekw11B#Ul`KrA+#Pq)y)8 z|LP5SWa%KzF8qTICio6TH=iEG0Mr}2U_2AdZ3YH4*CS{T{K|P0W%kKX=;p+QzZg;X zT=2~uJOQ8Yi1(z at NtjN6=aNU)C8|1949aM+EnxkVaj?h-&n0-fydRMd!S@@m^6L1*Td+4awh?$s; zm+0-$~eeW^~&1O`9t122J> zC}s3SM|*OTM<$I?-*G)@(8{1`3eaQXGnr`<|A53vc|iZSKB&Feg(&@{4}bm&l!E`4 z`tY}vHWeME1$hLXG>-sV99tHdY54M?|#kI`zz0KX4+-^9`Uan<&zuz9g`iWHoPX|rF2(+OLA=QG~ zLoayR1B~Gn+bL8Rc-X_W_HSCFEkcm4$>r&Z2;ER6(^DA84sxSE09#d?yCze60Fbqx z>z%3P9GwYc?3>Hjld_DUPM&Lv*_kpFVjIQ9_mktyM=l&QPnPbAqM at HA7fT>lBte-B zGPX15nk^Gm0OYkq6^Ue;D(hR&4%A6vBlPY=V#iq1TFYlkT`Ej&Z3u*Vimk;Q=0RoS zzN{j!&}j^-l;9T=mn6DnN)g*G3P4z+sss~sW=)hC-71Bp{%H;ij+apxf9NA`#$fN4 z@=$)B^}!LGfoa`X;pAI}ac{iz=mqheDbibqs?K2 at 4mbspkLYmvBfe2C!EPxdK%}q> zuAV^Id978K<`#Aijcs7|x1(XjYoPONrSReYkM(P`iO;)avSwa1);jfzO;nK+hI){F zGj$8tR;(7E2N*EP>B=<{-mkCWmOC^SI1JqIa0z)7T40vT~Lx~X~)VO+TqB6p` zQA)T1yw}!TM-|k@)w#3`0m3wrESMD|8`m zKW4y}jc2!07a4k?SC0Dm=PIt!S#+ePg$&zdZ6NO-2PFAAI)2OLSJ7CdaR?tK2?D>y ztc4o3Oomgb9Tzv^Oux`M at e6cOt)b|aam%JUf2GG-*Z|?eAZi)-H;_lPoBlm{aRAO6 z&^ykcgC>W7Zo)F>SZ+j2A4HUouo!hKR4bGPa*h at xy>&s<9?zj$GKoR(H)?~>x~Tkn zXwqXf5*h)*2S#I2uXs8&GSTJTR066MbiOyRw*fHCUEo~%ab#~qrP`k0 zBI7U$USYipqQjR2w at mBc-pje#-M`(2zF`m?^Zd(Y0Z{)exBXu(`yVG&zK}&0K>04E z*|OER4y^epTp_PntgXDLiqb(YPYWbi$j7|VSOIfIyGBbMw~u at aBEw85EV1ZE${QkQ z$lbJ+s{13#w8 at Es>Exr=>G=2O=hqRHKM-|z`5+D5xx+ at 3!RFqS&h{p9Ma1&2pmhHa zV9{=byMC!Iyn9pSej=a)z_rNNQg!zLzKlhtVRXrnwdy!@x_)`qthABW#J{O-;BhQ^ ziqiLtdX;PZd_r>E6=sAKI&vi`kg!ahqB@*4#8YF56joJ at 4V~0v^ODKghLxq6M1Y=w z${tTubZw*e%3rexYAhzUOiA(ptC#|gTC$_ZNb7QMTPz)IOd-D(lmKmDaXl at H&1X?u zMok)3YY&D_ZZsX;h}cI|eXFES(}~K|9EDa4&7eCL52 at H<6B^VExoSkw<`aw{r<^)g zHQIT_$g=JS_R(yM1?7bV?2Pu}Qs%WyW^vco8(ao08a^B({Tv&mdUxaucgqPIZpFz- zdB%6Nge5Xq5!Mv%2*`Bf@&;4D0qS-MCGavYoJU|MVpP?|p}QpVvAayl8e_^Dz4-dM zIiVG%<9u_a_g->QG3;7DgKinL(Jk#+mZ)Nea!n$2MHufj$sV>QN%LNVKN(W#EP(+g z5EK)nWVn&4AS7a^EeQ%>(2Q!ApZ6)-GS&!5gbWzqV+MjmKSS^S%*-(KEpj*aG4Cj? zApZpMhBd20;ymX~g2!Y#u|GCzQ*vv6%G4kThKF4c0!2uVkcvvBx zPzKr&W?dl2Om}Jixrc|a3a80Fh`YHrgMj at CC&#g5puqku$o?H^|7o(lQv;)QauaCf?nJza8_{_;$PqZ#Z^tSD5gQV0k(LC<+*nVYX~7tPz5F>T!-`+a%N}X8^Qw|Ghs<9doNd z^p`JlLH_t5^^g0*|BAr>^Xu>2*BVt1IZOeRKd>tkovO-_Jkd}2DT9GxcI7oC<`v~N z@=2^;W+61S8m?1~>F+u3VKUtFtY;9XVV3Wv9E5=}#Qfwqe^t4x6;DE5{S6mKP6lw`eA_RFhb#tY1HYPEj4D; zBPp~($9HG0#~~cMEh{v;2W05ot94qCv=Qom at 5-#PUflBrCC|AGOItXW6e@#u8=_lE zE_9mU9-~ANmHER5x{#)R0=cSn&>QL7;d zohiu0cU`w~&l*T!jD#N4S6xbpvGfpQu%VXJSSBA^Z?&%U)-mgJw?*%-Uymved}v@1ziT z&o%N&y~`mMS(ddHt84Aw7%ENq)#cA~ZN_XPSLK59o&rpimAaa0)jCDw1Tm;kyr9I| zgZaS<)zI!l21rUsr3{k at o!s}*9ojAIojAF{fNe>2A=UoQU|4I%b~o%}+!kdy${2!W z9YT!bF4y1j=K}S>+f32U?4qH(Ef_laB@@#+`pO53tAkgKBU_>!>X*H3nQ8~vLa&v_ z#>`G4DuHz^n1jycJ;=1pC=l2AO9Qcv46}xjP at b6Jrz#Gw-rdeXnH8}S2ZcN2wzFTZ zN#!i;yTu;#NIXDMzjON$If5Rz8nW9(io#I#Fb8c4No0{%(MK$L7k*{@=wqy4IPa%o zcFI8K2t9z%2JF!4$L0;9Y|syrlCnU8jWbl)BZEmV({BOR^lrVQ=M!;+*hTdoQMQ at F z#bne7+3aNmon_Xpfm!@Jxe^!|f)F at 576`Mt}-EtG2YaP?*?QA>xcwLWCyvNyl zv~JpPIj!KdpZC8YHl45^Ti51&Lq{X9h&&?nJPi^*AiHddmiq*X at 70ce{H}@&7;P`M*G1vW~{$=*)zL{3ub%PKbiZl_dU}!X at C{@rH1$Cn5{I)Vx6N*DHoRtd z$Mybv-(&f+_dXTi9PnO_aPS4P-;9E3Tla%1LhIfa!KDrDn}DTZ?G830=-nkfQyIQh z;??cB at M+8j>z4vq6l2oE=x}c%1aj~l8 at x8)19~Z%8GSGLRm&}*rNKBtIjy$Iorh7i zO>SXN7>BDlO6Rn3SY&wkvge?|diw3jGp0?9oH{nOMdRj}vzRQ#j31j(v+9|hR3~Rj zn=_)fk5(lo->N8Iv@(5iaIQ ze;T8=a6(Pi^hiKqj$3h$5q?) zkKLw6_lK+~vb5$aE$VZOj16=1yl2+3lR-tXrcGVCRg=#@2G9vJ?0%*HRY#|jVP+Nk zg(|3pfuMR33My)(S8S)DMC5(SYeJ9EFkZoih(#!KnrUVlDCV|?T^eCbWk=;?Y2?e3 z{7Qq0n>wrRCBN^M4dFj$9lNr%7r&mGqMl8%S3%Yb!H$5`ck$rK>XM!Hem)c?6 at m~% zB at 4X*U~(uCKA`IWsA(qpRl)=$W{{PAQWt5}xb#%8;-`bIeS_t}3F at NgCB&Z^?TvBt zw!|}1;_Rq>z9Y05@|NW=?t7{n=ZU5(Rzu8`wS{y=$f&_YP*)s;24qknW at T=+mE4~? z_W=mcKUE(0IKbM_TRZ9%?$B(j+_A)zyMx?RHV16LZYtdMF0s+#;BN~8<50Y-_mRCT z_n91a(PPP9wTFMUSM5rL&K at wtnKp???b2|3O17U3tpEn)0?38zYE)IL2)~D7Cv*DJ z2(+yvNKm{7?JJITbIUtUMogM^^olsQWM#wRAKO$}sJc8 at Rc+|C*ZNTp9YNY%)B<`M zD$yu9ojOUd)SWQ2Twpe|ZG&22&Q+a&k96Bo)xTULqXL}CTBH*Q5!I_?YoDw{XoS96 z1f#NhB%DHd zzZue{cb>bX?!KLECqeqcphoI}hxht%BiDR1-1JyYByy{I8D#DzU2e$ti&?bNweVMj zd7ZH=I_p5mUh9|-ePbt}H&7<|Nvu38QW%f_ZSHRGXJ$7J5N@)s=4BEIA5h{8zUVTM zN at F?E1&KzsDlT>*hRXp`2XPFrUOti#&tMPB7_z3h?iQ at mT6 z0=joDZzB>q2-RIPb&cGU!k!w_D25JKcnO26!2mRs{x}vw~UHCs=INHN2#Eye)4YUj= z5my>PJ~(6_pCs)6q#ss-JEHGN79%;z0d17_STEqdlFzNor$(~K!%i;Yy^7D%724Ly z%qjUP8*Su_#x6eQx?tB0w{B6U5&rCbxTl{J$2kwyJ;npv^+`2m_Vwp)00f89Rp-BA zhB(~+4Uy}=V#fde^w9I~&8xp62ICa*nZ6K33Z-Pqj}HF%AA#|K%jAks1+66l$&<_& z8x%}0J~H4BMgY8XU1%@MwM71*?Vzq#@Sb*=ysFtWYJFS zGh{#8pN8p`r5_X|u%U_oG|_Hv=GaVI=^@i>$Hv-;2K1oW8aQl+ZNY8stJ%44+26uM?+DC%T!nt?e98P8t1sYc6W(s^@%$OXCvFy6Av z7RQ7={xkZ?ff7J*n$ilunBwZmIvoKS$ z7NiCFS z%K41cqvy1fl{HXknBnj3nOsoEBhtshGg?G%dx98r?~1>ypYCK- zqg9%ZOBvyxI~&eQb?0SeHG!XI8j-9@%EWn0b_2S(?9M&_Wo>hlYzN)fdR*Q~@hYM6 zMJcj^7Zo=_kI|pcD~sstO-yt?+{QkHhY@?38(Ot9AE`dxfHGsL;V^uyKi)smL2%-_k6K z?sRCafMM1L)rJFX;7xZD5c*tY@@!#-1iidbf}fqN|M>DYN`SOeW=`BY at QLdDa$@EJ z;+qP{6~6!ZiZs4)+r$;`TS~&0TW01DAjlbT#ia6%#uaWz+V09!HQa=PcI}}YVnJ>+_Lh{5GDH4^NPoXbQAxI8KH-NrzZYM7@` z=>F?(>sY}&E;CG^KYsKB{@J|x|H%3O at ZFp+RZx6s?IvkAf}16xS(aC4Q~9w3D^(zb zi6mHHWh at 2Og==WDaEfWWGEByq`G)m&fAXzjY&c&=>*d_xJxPr^rA>u`B?>+S^t|MH zO+REi%}n0zT=e|`iWiaj#omi_rj(2 at S{cl;d7M}Gc7g?Tfdsm_7Y19af at H5I2*}#B zjqRJY|&D%>`cAgMdDHBaID at e$BNu)We%M(KzvB~ z=#XSkt2l;^!aX$Pb07LHnUkbupaw+!j=6^|GWdyJOBU9uS zKz$Os=RK~B+Eb|x>+2dqaE&=QHHVj=o&8LNdx=wkHvJeFj9vX;JVPcGm*PWGL?z18 zq~axg+z}F6Zo~E%UG-7r+Fx{`WFp>&(SPTED#2Bn8Ct^}y$lYKjcME^Ww)p3yfKs;8bYd;vzVno1ert2NhaH##i;{3q&pzR9+@iJH^4Q7g7V7iXpDcwGz_2^>rH+BKvVpu(UOVqOzn}Bh1<*EY!;^ zSOU+mZ3_##!jk1->^Ry3>!wX^7sO;prOU~a0XXrVGl>1h8am?>_4idyVJ2m#|2ox!Ac9bsolri!gHEx*Ul+V zB-Y}eh%uQwLWyJlbDI^L;R2Eh5d27ncjY&6TC$dhy zlh?tj;INb`u~0kbqNY_%M;noj1JQduDO)@&Djqo~VRSkYa6X(JrA<<$5AlX at dB%U( z5gQ8sRv48&dJ;T4Du9;r^Bq`^^8$K$p;P+hK-mzPIAZP^xCXc;$+;~Ynh_B(j{{r5 z at qrh*;Ph_^=KeOq^}nu3lmDefbpJqy{?i1EQIfG+;79Pu;&ixTXNC<>%=a#3md&>< z5EqZ}tcXNmp$Svwu-_o28XeY9i$$K(3y6>36|?^V6+8jta4be(nlsC40oP)3bLoD3 z<;8Ts=jZngTpxP^ZmK|Upw9t|9JgpC5|$&1WYXeMeGn0=f&(}B>Hh&nP;}dl84)ig zFcx2ja}VV9o^ZnTrzZd>eCbTdMYkocBC80N%S;OQd6+Q1Ml-x?N~64UP(U~k z=J_j(hZ3k7xl2^yl;9=T30!gEj?94oY^vx*RAY8VV^ zjrLeD7`FQI1B}6?riJHM1p~2`u+@>O5Ljx>_81cIk9iZrFu!h|DhTFhqV%u{BJW1-I2** zm&MKu<)@J6Rl+2bPg5i=7VS|MsZ354s>E)$NlZDI&`_Hu4eSewkM{==$5)06XX1lq zxF~Lxa4M(qavNou>1E=&&+Fs!19Fc%L7OKx(KjH80^pvlR6>zO5m$QNtqvh0Tajvq zh7iC at 3Ra$8^d0I0ouiP;C4{RqX3UdM7ynty`KDn+s_0T^8 at 69*=l*A0= zZ%)~e*LHPZjKC;?oi}my_`~0=0B|xnVKFf2CQr>t`0Xz>s~{Xmrspf99Rq5G+&L?dDaIb5Wmt-D+DULbGq%w2a>5ni+2`yEW(k&y zblHZp3>HgcmDN$b)d44p)mDFeh$*zntn2FGV7`_YR}m|Ym9 at e6fHf5(TPiJrfG-C* zq9+|?@SG&0Xc;4XVXSA{p}*d-mqq*|m8mPu5m^^tAy-~HVvv)$QkXjCfArAFzqkO- z!=X)Z!9B&AkdHN{T)8tq$rt}BSp|CkD4PHu?WUgJQFAgxv5V=Pq!953dG%E52x}GU z7 at b!RaeIb%_ANe*ba5p3SGYd?r|3N>MJS!pUsfm{!fQLUw!x(=^y}GB46YNP4kwozM8?#6V@)-=k2(U+j{R2V+dsrulsI6TO zuEFP?&E(EZY+9BjwQ8OVYvu&2^doIr!dllq>R$|QKAK+y{_J$OHQBlCkYZUU?M!!P zyd86W?=U=UAN+Z{6^k%WSv at M_eFtIlJ3N;2JufSxx_dOU{oXI at o8Mu6=X&{5PKfu_ z6!|Ukr?&9VtOj!+JsBt)>SjCh9yr!sMIpy85ZzysF(XdAzLmz5d~7NzfI|eqp((VC|3vZR4_&{ssz zlCtjKZR*B^;V%id;qTOr*>A=dwFFuoLIU8c z+_6aO3mna?i4n)6%K!ocpG&v311%v;JXUV7H9BE_0x;mC$Qi5U3 at B2g_)bEE3BQHa zNvUnG<4DCeL=(po+UG(?=Zt}Klq+p6STb}f#0hbjkTB}!p2Z65&ou?2a9Cl*=0!KA z?;0B1e~SlrUO6-G5fWKbS}7p23sjZL+nbRluKtv`N|I;QP&aaG-{b*glen7LdYMq3 z>@S%_sW||_T}+Drae?q;{&aper-wQ|nW1-&&U&dw9ltWUuo>}%ij%2oUcZvj7+3B! zX8M{|Xe>NkQ#BKck zp~{{bZn7+}a~#N>$J(SB3fke7_yLHGRR4vJj)%jlsK_PY^pT`cju^m*u9bBCI{=-q zutb~4Ku(7@&uX->dpR3KardWHuE2mNcu3H|ok&uIH1Wu=O$Z4qu0(XR4IVEf%?jE~ z^Ce5s&+!pRw3;f&B+y!g*rs~%#RLTq2tnN?oA`~mW|2kXjed7-+XB6u z7JRSnMb6a$O|_xSdn$qFL!hKeYUD#GLI$qH1oAPb)k_^BZCzRlcrr3`&4~?Yd-+A9 zv#BB at 4Dg1GCATu86%5DODDQz8D{UU!2oO9uMyGyp4m{>H`^k|?Dh_Y?+50o{!2o{$ zuLCXw2|W6T(KLzc-^KR(z(b~8F2~g2Jag at c5)!D08Y(}myei2|gc(%35I( zXv-Tgbfm`99b#ezVbqerOfq~O0=U|uyf`VBDOgtz-w#Sf{fXMU%n`N^Nq0b)TUC8l=u}=ID-eETFrnUOGAv)RS#G3I6DeDsmh% zu+^DM88$q)EaOGC_NYG2`u0P%*x!v4E)wP3YVPdOnY~p8qyLlWcKxR1P at I#cvgvH! z#920sxm-AbS*KV zNLibqxZ7+_Aeu~2lq}I>u&mo%t=mElXUQ2BXHQt{#iQ=>iED!hvQ`Jg&BtjvDea2G z_(tKv#~E&nUR>rx#bM_u2*}*b6l>BFgtMo(wSdFeS{Pe_&`9s3LrYRB+$?h7F$W5W zj<>$nlT6HMURyZNJh!REV2gChGipv zeTc5OL(~*snRh|&laJLCj+)bxqZ at gUx*h6)@sZhO?f at Bp7(+Jq@$V*MI4Vpl%#pHf z&YH6gNYJXtqz!`%ymQ3r$<`&{6I&L42=Qi&=^=J^d$Fm{h(~)ptCU1dF z|4eS3dc^dsSuD!19Z~`#KbgPK50E<73BySGF2}xGmr?iP5pANZzk|Jpsb1TbZc~r+ z>sRb%Do at TO?#q{`L~5>aNpuz%H7CF|g-R?1Ey2Kj8T$V?JLm39yX?=WV%)K9+eyW? zZQB*wcWm3Xor>*LQn9UyD#ldz^fSNJ&mS}0v(~k)H?TkZyK(k8`=&{takT+ySBMSV zyz8bJD)XYmtuvAV)KAMh)2N`riQdtVbd$#QN|nP+dNQPOwD`M}SMg$F^yPd=N0el3!2A<~61hRb{w9MTW;AibH^ov-0$t%vH9sin3^ zQK+6mZ&%gd4RW$lv%t= zWxTs@;lH7nzWp={CREipp~7dXe|Zf?3pT z@`!h8i+&fx`Eb7Eex}=ywPLHJ953i{6LwuL^}A2?3Uwv@{qi)2!*gW!p~~|9 at MNIL zCUvENQs2!33-=!V%$|pspKJ~#mHWg~Nrw9XsRJWzEzQ&K+1tgXybf%ce{x)(&{2E*qrfT;=W4>~}o7jTQO02o4DzteOPZuy+ zz6Q%Ad!@fK^K8yNkV-TOMeX+jO>$OL4n_zT8#l-D!c|kO(ATRV^}3w?Ers6bu&%yx zf3k+972wuzywOSpR~6a2L8DKxB&C><`gQpM_G87QQ!%7IB1-iZK)>#snd-oL=LF&1 zq%|ivc6$^Xe>k0L{|Nd>24RYm@!;-_;XzPhNIMG!L4TcYl|tG?R0STVE;Ks3Wi#2H zq8j?Z+IQ}B@}Z^qz-_v5e5(8cYFEs-H}OEOi|{=f?A50Im7m&42P!4FnP7|`Aj2r8 z%fu3Grfie}z7<`9DDg3B=C-`p6!>1Fe!==c5vM>yK#3k#)M$G%qfn6(S4rmq_^u#g z(Uh!bXC}l~TX-iDXn0NyyGumnD)7=uuXdi&`FrB`ZyL38yNXI3o7Kq2c9c(H86SGG zuz1Q*$+WN48<)9Moq$ge=4Z6nA;LY;=LWfiy(k<3GxQ32(bO_STy!W{D=L#l*;GsV#L?{T z>D?K~3Y>TPnm_RCgX6QVo}*?2K8L5DS=+Xo&~y#HnhmNnfyR|Y_CZa;Edx#RqYI2D zr#x|7m4o^g=CzArL3Z;2JIG-a_MxX>hcn{V3d5H%Or8MU8>m~=xA{`hV9*W(L5kaC zOGTo)HOv$ggMr2JqN=XO+N;!BeK`6~yk^JgQS#o_;wn^?_OBJqPb_P7V?oo}wqMW& zLip*-475RdY>KO2gU4TO(s4xssaqZOmIr<-Pngv^<|Ktu3Dx4tXnXud!zfJ-H5gUN z?A_hDfY-8cFtvCTjDVMy#tTFFMSprRg*HQ=A?<^z5SD`CM#W)PutHa`0!q)pZFOT| zd6Sl?sLKk0CXtM>Ee!F&;XArO0{PL10r9O&7>La^nX>L&y zDcs9-&8rUiUn0~@eC}1MQeRIj)af7RXFF1ZUm2yH>YfZ7Kgr)G_O|SN`L4gYqEX^` zW@&n$JJb#Hc*i}nzl%S7FWJ`O at sIQ4xxs8&ZO(YH1gXNE|JAqQb+2KJCoT})i~BBr zpL61locHc~PZ!NIhiKG|``&aYV?=l<^d0kE?F!Zl;pMo{AO!U;xh+xKaC@}-ZFjQy z`_GF{xPPzJ)zFwNZN7kjB!hy0(EML(^?#k5nAzI???OFPQBG!15Gkj|YGI^OP3Joe z^n%DYryFarxd25pdaLpNbq)rr33JRlrQda)*HBMILsHt!Ye8_67v9~R4(0;<+go3D z&=BBP*mnX1*>@_cavh#%1A%7Sv8y3U{icGy!c4Bp at RRQc1smC-xC0x_5Ooi%EuE9c zNVK?|*MvHQnny)BRJ6MUi07Iyveps7V>e|>jfQ%dV8VhPHK#~&Z=aNxFhhP?E9YY3P@ z0UY!#waL70;4&z&%)h^rqH?{I<;e#K!rZDXUmpvK=!&a?;x{md(S}z!uZVWTvJcsW z$8^ts1xdtJln~Au=P;@&U!Uu%EUJufC9H$#uz-5FKg0ZYlZB=?AN2e&ml_lZ2>Jip zWdG{zsp+UJ3Zn7%FD!gRRz-pkEs$;yMstufv0&1N6f=`9L+qt at DhpX9V^1UbU?Y6{ z@{*Z0!|M~nJ6;7bUEm8u&#`daEnm7=)WNSF?+~9(WsLB$?Re$W)XT;uz)C|6!aBJ!%(4!?GuBUSm7}pVzl%T zJyS`>@rX7GXDbG}dmAyuaZI`tc1gOzI#rOdG+jJaZ}ry4X!{ng=gQNy-_;iXe&9AF zph#a0J|VjmG80>@n2JOK8D?UF`qFvSW at 5s3b!@3ve58=7IrJlez0X!j`4SnI`FA6k zeM=`iPt$hoLhGbv`iTfP2y3W4ZFs)#CM_#uN?Mvh_&oP;qjaK}9^q4lH0w`Hl#vBX z67x4g9 at g4w>QRhfX8-0qIq~}{nwK>84s-rEvTfr^ zIj1T&jza~DwgguKS+*>S{Jhyg2GB9YJdstmpvt;OyvaI8Cepd5B)bgPx@J{cE;hInTdTTJibQ zL0n=&_`K!QMI1}+V+k|S5VYO5+}zxCXZhLnyzjjqAobA}PE_rAePDEz>FN#1eN?HT zn)6JlMEjN3nv3yh?X|?@*9Ac8z&KT2^YC68Oc^<0(w)HJd=0&yw{3V^m)d&3l+07t zZ+5dbJnFFoJh?JET&dUxku~-^&aCB-sk30Sd1=(QfEzE9SG#l#YW6cTpk|3?O^OWQ z>`lJmq0^SBy0=62YK6evD`?g0t8)eTMCxPg3tq))t=cbF?bPqnItV>VW=A95KFaxuV7nkpl|^d&Qz+bJZShn z^%bw}Ms0co_dXM7QgFfQOgT*LE+nlN4_`y0oVSTsU}gocZgb8CLjx^-$t+jZOBX()QLa2brIixG81hh$P1493Ee|SLSu2EI|di~T>!IGg;%U9 z$t(^9NQF7`%`wdpk=H*Z+9P>_c&?=LyyxO6Jf{vwT}f&$9TYS7tq+jazU(PWQ7L05 zM-rq=#H#{Ll(Ch*Ct;i}LUN|?L&lgl#}OA{pPLMEfvkVB2BQ^{<(WV;T3WkSexTS4 zF{6B&Afk2pf@&OzRzehZGo7*h?>skOn#lb86M_}NKtNdjJD&gAAfc>egDQmd!O<~E ze$#BhW*3cK#V4mc+!UmM-q1`9z6g#(Et$uWM&8lbk@ADprz$cjbI#4Q;N+!bd!i2Vu}rfiU17~(Y>Q~1?8%9P zXT!Qm0-w*o`Nt<5bArguf!(*`zMy)7Ki(v33h1xHc;97SVzzzbp&T4^2GnbYbzO&| zGFZ3)N2iyS9=myq+nUyYwO|vxE7X+TQ%QAX8-V46dCzTa`C?bk<71pMXel;L)+6u2 zU5^`(ktLKtTlzuryla1iZ$P~s3iLa@{MzBo8w3?{N7yEn;MHgV#bmEuwAY)^B>@g( zAJeCfF{spv^Y at uG#^fmxpf_^s5<~V0rCi9p&?eu}!A7d;48JtJ{B7{PPN3p^r zn{CUj$L2EDJ7EVRBtE`fty{6*1ftwCU&(<6rTeZ3$zoY&Gy-m*frZuLXzJ1TI6GtY z`-k5XRDf7_S|3~NXagqWXu<%k at qMMGzRZqmH}WVT6~&Z+(z1mplQVQX($P~Uof7Q? zMs}|~s13cEhDtgByyb#xN~Z;W+oCrpF+?*5H(Tk~<7*mC>H4 at s`xS8dmhGY)!L at Z- zHuq;1|05tNjr$I8<)vNkt`&4qU!^-BdsyhSI<^jMN~mLJT)@zd`dI@%y2BUOR}=#| zEsI7sx<_kjemuKyq}C>8qk=wZw4`4)-VK~@&IoXp8|1g~NUa}~%4nlE7)W3?MLE2X zFSps0aEvn9L6dxk4J040Ti>t70neG45n#B`bmNESn8{YZ6rSG!f|uAmz009Jd%{p( z>Djbb4O)InYmh;aN5_#VDyRJ@$C^67%0JhPu=UCksX+3Mn{hUh0Hb}l`3 ztQwq{F`I0I7IVi-JG1FPID9=ZDUY!WdmE?K9TLL0)KzaFoGsTJgR_r zL;tmx90 at C5RbE)S2aQnW at rAL{1J;>lIn)Lrj2sVuGPj?aQ`h-Bca>qadJs>))4H)X zKPCS4b1A8wN&n#_KE??hgB%a{@o4U}d>Mx at hx&BbS at p%ZMjG>*u^gj at w2NMgQhVuc z(_81L>`yB#BQq59tc)~aUT$xF-3qfBzu`Ue*XDV2Ds4is^CHUvs>^LrF at Cy5E!UpZ zLo7E(_3>B;nnRKMR at p^V^a4UP4lJeB6RUCX{jvfCLd at b>Rbs z!nX0)J))MRA7El at 1*B5%#Jj7HqfH*MUUs8XcL8)!O)NW;Br%?iq+fKnO`}kgWMvl| zz$(G%zYr#MD*!F`NZD at qr$PL*vxk||>x4b{+ at a>_hwOzD{DFAB0TJ|6#{eT}>+r0n_u^0}p#<9|G>@_$u{ztrJ>-UU+9lfh#~ZD7c(t}c7j1CP~@@jgV`;qkV;qj0? zfW8}%Ii&52xrj$e4%~IDk%xq}l{>aIZPh5iZ}A>tP*cZxo_Zm7EY?E-nPruOS!0wp z>97aXmnWVZ3=8K~JF2?EBNt9Mb-h8VXeeDYB7EbAC5v>#iukL#=|(2qXMM{w62M~% z*G-so3I@({u4gs8KQY4Y2mz&D?ziqlEL+GT-fw-1DN z8REfO>PAhUR5Otx#9_N+)0gnn*p%@Sd4v%BbiaUSNFXv3UAtvy3e8!%Ju;%Ubg}UI zvKF0u4O^zssa9TJ{f&PN6CFP(6UXji-=tcR9Q$JW*@2j;l{uDn7YGmK=wLW$@(zLU zSKLSN?mnuC(^#W!lsXOLx`*?K#%IY>J}OEkEouQ2?cSxj9p5g&%cF>oNmAdQh1c|N z)mGi#9 at x$CUVt-c%_7FHwZkv?|8CyLk8{!9KjxJM`_Ik$*K~)np2817G`>apOJxmF z(KieDi#}taVZ4hH>kI!^Amh(mw#ge^V*Qij}yf^ zCJ%LDkhw&I7W2ljc!T)IyUj=7<2znV6wG at Zvv1Qf>1SO{Hup*1HrzO zS>B#jD1Vu6ZfX>MpYQbF27N$`EJ)}6U{Lp8V8Hq>FIWE8tXaF$ekO`=zK_Uy@|sYk zP+x at _BYFx==r_wXu(p^cE*(2Ja&NuBp+Lf+FJwqTU;+Vzp;%qSVa5f^sTSs=tPWc< zQ+3+{exM#f`l!zB#|43}a2^4N!qx4XuJdNs3higow958!6LY78cc=u1>XnubXPc&$ zwo>$$9D~Y==tu<2Ts-DvSPYLP7_ZN!R104SX>OZeDUQy<%Nn^9a$@l(qrZq6D%d1k zQRSKi at t(i0$QJ%n3#KCGi<40ra+W4L6(W*&j#hg;Y_QLSo-&DCJx{=Qsl|p}QF?F) zR4Bwa5lss_rd4S8F++mCJm-FvEf?gbC-|s*`_OTZYHX#RBFm)QSE~1jb z_b4ziW2s0=8;G4A8_tXi(|p`D-jYBKjGB|c)$nz3j4`^@pUbu^+I+|XWjx$o!C4l6ALJm#xP6z$4WKshvn at 02^Q*0=XJc4Ul$?$|pDhMmF)d0WnT zh{+);h73ugstDhcdFIj(CtRxs_oj{1VHR_L zpuIn~{0JPnbg+CW(QFpOLJu+ at D5DXQPLX9SSfp)UuyI+)!b!YJFJ34GtKP?sJDT1J?G0E~m4k)r(Q5&JQe#%f5J`|I}%o=efv#T#+HPZeL(d!)P*#k6HG^i*62M z>f^86_gN~)9s1j%`KYO0Ir%@H1_$|{dm8&+o~EaQCV|Gs2LJ#_FF+Y0OR at MvR)yTZ zh{YhuiXthSCec7s`{DxK+@~(sGA>K5%T5TdhoNdR&>bCjTWms8$mzOI2mRhc-} z=P^%N&t~zrFx=|%g&eFKWsV~g**;@+7^Ph{L&DG?i{qo-(*nk}00~I1JBSthKCFvkz1aaxBdLi4m*5I7 at -Fc zD!DS`tJzdikB%z8RjTY`kGjdiOf6I79Y&)y5(xq23A8!xgal4mRbq+HAWLVzlHBrr zbI*!Xz0>OLt6IN(P6#r}WOz7t{4TE6fX*ui`Aal$z6m)?KL*o3f*ZXBoeHu-c(Ts% z^D!~L#0!fhn%iQu at KiNJY9sTW3|@4`bAikjEa^VCiS5JAvfvZE)935sywsqWwln3S ztoSr+j_V7&ZU;SG2+x_*bza#8RE-2*#&G(>9;wSlexxr=|-^vv;YS~ zksiLxa<)}Mt48ccg%c>tcTBr5CM<&4o*|}FO_CnL89V4pz=5z~-N&cP;csTcv@>zs zkeb!@3V6!=4)HxSwkW0OIf+ at 7X_i&AH;3k`1>lDJiATiDcSHUyiDLm+x$WSRR`C02 zX4SYt5!~Q{m?E9YA_HfId#>aGb}Bqdd^y*(b8%R674>s4z&rYVYAzhqiE^Zf%c3j` zsINC{RX{aI#1}i*;I(@gI-cPL6*f%NaX)-c6uU2C0E#xDS%|ZrAK3rymiaf%m5G1c z^7g-QOOAhKMyh(wi{fZ}U5!Pe>L^KE?FI6a63Td85e0%{n5D$v%;FnPNbvH$iPOnSMS(Nkvl@%ksRY6kU-vhx1(WqXbrrY8`&C at Vq0gQcj2S zUWdeEmvKj%(8_alyC%WG%=7pLyG3X>_xmu)@W$@iSF<~%J|Z)T2(u{|O5fFaJ~Ek9 zLPdrqti8_TQysuN?R0w$&(c8661;F}bo(v`o;E>~6@6b3jl8{M^8JG zdLgJbQqA=~e^*KV1*uA1y%K$O_IS9Y_tAhGa@&=*dEV9MZCCI=#AM^wRXbYYhGH4QUs4c3HZ>r{Zie9V(V>*<$JF@@V#7qMXz$Nw3rXH!?a~0z zIpR6S_)!8B(g?G(m`EA>n$qicKIaO1mF|`w(!FZj{kPaX2QTNEE*I92nV!xrEr<$TK#1RT9Td)wSXdHZEv(!Reh~Iqx?Z5ym}BQwCQ8tk zFHYD;dHs(?%Y^&^bvs?Gd&hH1Z+$EhjCCP)=|sv#*r9hj zbYXz~iMT&M&pEt>L`ND!>n(??V2d$X=iE{?>Y-O!Bd-3k at F(A1lD@&oi48q&Zf^rpNtX6{6r*CP|t%^gQKCK zpidm7hqE%J(>!U8AGSkvr`s6jgIhddb=n>P5NM{05e|-JAjA|nx?KT8EG(t>tgI3X z9=`8!?+WHkdMVy4 at 2@}09Kz_()*hd5bzbAdX-5*x!J%YEbApx4=ffSv0KX5<*$}El zUL~V6Hgm|9N zhRiK$$q8W6F9`FIc~$iy;BJ)C6(uZi$+Bzgyz$s&T_H#W5YBDiu473bU=Q;(rwhllD=J5qnf1+HxM8OnM>51x=S%B>)rlNea`p-IEv+o-LSoukjHEGnX&|?gJO-)lO zyxaVC+{zhoI$?sUc%$ZqS;UU at nD;)u76w)>DN_xvhB~rA(Lojbwi;C)B!&un@=c7m z5FG^(suKU{RqV^^Rb!={C=j5>yniVH*FHzTXn(I1mLYl{j`XIf7ys` z_pt3RO`k?)Sb4v4nOSk1AIvyB+l}wrOQ!ZJcdY)vhZB>)k1XcU>-ECs zC`zDB?vx&XNIe7QmcMq6%&pcOxj?!)>Ujl5`mFj41)eS(GMmzY9i5gH!W5)V>CNWmwBaJ;FWYF9PyWzv=di z`J|xb;>Bf>7ix3L?3mwrJn9yBZ;yl_f9pnS45^ZoF(+xtP at z)dk6J>$U_bq>*MNTW zVHx-bUGx7!kGcQqMb0Yx^I^lTdKWEA2vsztW}?d=v^SUpM`FWFRo>+IopG~_W|3A_ z^DgqCPtiF2ZjU)pGU-Bnwlkqm()}zm6`YemIk&AW&h6JNABU}9{(0X)(g%HTdK`bV zm<{$fKiK~+L}cagWW|W&pp!ixtJXiF+h}zh9nb?Z7_gfS^+^MKyY!g|!aKuh_8=@A z at AXA_?@7>E04eU>dUY$&qKb6n^I?F^DB(!U2qP|ovk)p5zG=gSno;1y`A-bUQ|0|v)2=|c#Be8%eu z7s5JbzLDU|?it2drvU1#w$3h;hq$kKKrmQ ztx7U|T`R_y4}r67ge?%y?6;SAQ&l6&K+TG=U#AkC%QerWpl)(Os-Csm4#%N|Xu95pVI>pc&o4`?VWh{462{?W`u7}tajvLBt zS(UV14 z1eG4nZlj?-yf74{Rn~>By1=>s*a-op1IV(dLKivylKu=iz^(|s3qci#mfn}QdHPr%vb%t z at S*BQBL=O_`G`hxw1XyVZ&~4QIwzV+|0U!$XvPR`|BFC*5lW{Cz*a z7=}~At2))eAU^u?Uf;wQI8EFUa02~JHQ$l)u2l$*bj^0VP9r2Q5Jc?AQkuH}xbK#M zgUccP>pv?DHDgOq9FChRm`wPmrJ7LALyl4HO`kuC?k^hXu=@1;G{ESBv^9|vudY{22FD0SJ?|-efiItUmy!K?rRfm;d6ZxH<-35UAHnwgma*FjBAt+gDj2dgqXylJj!7v{_|FijlXRy7)A#GEMIogpVN0C=J*8B;Dc$wlZ$ zxcZ~Q45MiM8^Cz_^SFG{Or$(HRAKzHhn z{BqWQ&>GNv?D9Cq at ik7q@2d?Zl}o09;#)Q;*gy|MtF#XWPH3%G zpBlDI at zS~(dzp9{y_!S*hW-xL`;;FMB8uw!D1kj&-GV|6$&taA_B`Xx;QjC#H*4^v z+Jrrr&EC|=XxwrVLt4v`POII at C^Yaf84YkjE at Hk7FYRL7c#P|P)q4(Jd%@GS$+vq7 z547oO#GWU~)`o(=uE^@7~-BxC}fRf<3G-cIE%Z7qJ zCZC~4P^|Yt0M#qs3&Vbus>ql$$_kgGlA|=g at jgY zbOc~GMrY*?W5l$2c1EoE8yb}`sT{9oG31MXfDcMP0M?nR&-N$iOdQr#5}P~gl7eJU z=oG%vY%witoM>-0h zQ0%Y#zB~d_#@Mkam=6>qf2%Yn@&pa17_w1Ux;@PYO3x`H4mSKgtbH?IrhVX>&)7Z?rt zf+kI}4e286RIkyukg$vtnu|Bz72|SS8Tw0v!AAc;ImfY`i_8R~o!lSB0#Q&Tr+0xQ z(>}9+j;{w1Q-=`?4JH{Z0sZIJ^oe?Za+UazU+{8x;v=HcAwwhLs7lfRyOkDC!KC7v z7`cf_{5uze?lyp#fQLwWClbc{4x8MtD_SoOUJ|XA2BK+k$23YL|31_^|Ec~P<%$h{ zRst_g;s>fnR=3+&ott5!DV6?2cXCHl^YUH&kDyornj~rbOBfywQcMNj>b(jm%qD`$ zYdvs+HO=dKAjRO>p|rW?ckNC9ZJJ;yY^?0UvpZ%dCc;Z3{5p-f$ohPCq(o04_EmGwz+dik7ox#Sa&mWMUW`Uj0<{sh$^3HMOj zo$g`wy`F5!I_{0Jd8W8fR&ckMsROj9(ex|E0uKsZYbC?(pUvrXNR zZP#hnn={)WKHFiqDo|Qk>?HX#_y1cpD5l;ob at B(AivI>0_Wv18`A2(hkwI^bq4@`> zUy-t-PH~FpKcR_7^U2 at sZ?np<4U at H)x}tk2@|hDgx$h_3iDTKKmMbzNT$!HP=o68nQ9_7fo2{9wh}s!04cdY_SoWZJ^5tp0kSq=5!vid1o|d#dj6 zf=1XB3}DPS;Z1vlWA$&F-FgFCdPyHc<+*$D;}$U|5I+kQO2bIdFSE=xDm}lf%~FOjKzy- at H3eG)!mWqXAG(?BNMS zwalv4t at Wzw%~&`T8b4gw)#};#*muRkuq(}*s|(g3WSE*$C8ZvxW8ve*hRoOn=!Ysb zO%3k=>^3vzvY6aPD*&T5O^q1avxkAmu at zOcd}Cl_v$^F1w1`T#Dry8bB)>I-GE_ at a zCUGfj2ZYgdC0u9x&rEE!JQaGms~)1Zv=&~GmJ12iM$``W9H9&*fKkkuH9zBtqalmQ zk+Rm})ESAG{S4dK$yfFxk>jq%4Z#@khhV$vOHc%Y-;K>>+B(!DxuuEj at v1o}k5bJ>(=0JTm^VqWKrEAf-|sIZ3VA*5i~N8-Qk8DgCwO!UQbH6s8vhdbb`^@~gC z6PRPfrk7=dbMq3lFfx{?7jtP&z}HY2)xRHvi^y+A*Q}8_lJOf9Mni78LNABU&nkl9 zp!&iZRq#IlzOPE2ua!mUzmf74*b4b}n>8=&M=O>(o|;f2;|C`5aG8IB3A(;xK!qWg ztnSJA1m at Tqq5XkGNrmBLGbfJUccXg|>uZtop|vvlizIFfq6Xz1K})=q{2BeQPEiKv zF99(q1O7~T-DmMV1~y}iko!7P=b+#HB1%$`!XQV&aglW8RQN|bk`R#omWDD(w3TD(4++g=gH)37v}6)Mf8bP^x1jnDT?o&hwlx#U=%-s=OM at S#X^q%9o+N2mha_} zisUu6v!^3 at P>lz=Lr(-|8Gmrb^Pr^ z68niqPlx<8yCv-zRCt)SGk_+Y at cUx#0ey#eI9k9*v3dOC+)BYv#@qNJnTR;8!Fe* ztKmuqn|C?OQiX@*PQq_KZ^8`6r0ygvaQ0WbSd-xs zHNn&CyYMBVNhM{pCTBF3c|s~U^9H5V={Wx~4Cw~3ZvZ#9MSO}jKDTTv> z&D-a{r7%--6iJVN0#YFi2nhH8AL;*xa}^v7EI!P3hJj^FoFvQYQsgWMQDfswQRo^G z6!PITRqIM$y&Xu-&`<`MvXA7CAU`>aOq{F?d4WfrPsR0PhI%owSfP;~hgs(<&lx`N z$2xz%Pq03eTnMJXIH1!PLRwAuzNqLRs4tGZ$w_fRnuA_QLZ*lN4M7T^V at 9Oma<=26 zZUKe4V_RjgZb4Y1CeLFuW3*4vf&SZQa{WxX-nF0kl$otcQoIQ&QovpOBHJ^!#lqjR zzr1KPs?|^rwQF>dVb0WTDA-dXsn#Owh8?))W8bJfQLC;=?iF9Muu&^70$zYVNbD(0@uL;)ygt?dG z_0I;`(Y^27SS)%z`w{n=Fa5T-yg!?CDKAlzkL=crRo*NYwJZ~A at mpbMBM>gnIjz)$ zS%+q3vrv3X!En!@y!P$T4X>4D9NI9P)>>5k4%r-E04qzvgRS?4n^Cwc73?*I9;T9y z(d`VH$vZS#gSC;=y2M?GhB?=#u} zpazxg!Dh<8?r&(Gq=$b#iTAhBxS*+`nR&oW(u7P!Wb5bvb-+}Ik@&t(xj1Ituj$$4 zp9`1DTdi^$1QskZLTn=7(?04uP6TdQcI0SYvQFg$qw0nJ)?Za`@q0>W^AZsE?iCo4 zVobrJXkHvi)kQD5sn>2pJcUFzw>n=1+gv`SuUdp`m);(NdFl3IqR0UUPR>{+jvVN_ z^U8fj12{!4>H1V(E)eD?{O+OYI2Ymp6FI6LP-ahlxpVl^AZWXL9 znr%14$hl>~J;7a~lzt>MyW*S9Me0SH9CC?4kq_}^-=09eKt+6f{7p^D zbqxKku|PniR6sze|1&lD*R%54o`SkdO9B>KeYn6tBvUC+sd%~pK!_kp42*aaazy-4 zfMR0#|Dx=jgEV>CZPD(YcE4 at gw)M8BZClf}ZBE;^ZF}0bHEr9*`F;27eQxaUMx4EG zL`79pRzyYqu~t4$WoVbb^ZjbmU~7NN>H0O>X@>hb%WIqTyYtu=#C#Cd_GI9% z$84nU)57^M|Ao4uvO_O?dmAMohJpX5&LH&jkrC4G)j#>(fc-jL#^EryLYm=Ch2YLL z`K-?ir(NGCV6U&3j{9uLwc0J8ZCZ3{Tlh?|Eim}nW&iz#h2!v$MsGLt)t%hRSAg`z zKSI6z*0PI&uyzQsA?1AYh4_Q%{WUCt&_#s)%5Z9hb&yc`cHg#aM851rl9O$xbo0dm zIN4!mFM=?T69me+6_#r#kn7TSyjC_-{^G%z6~oEg&sgT(2={07W^1osTla;WlWm`z z0od>l#%-OVyU-d1Ae(gA*_7NJf?L5%V zRk7#5>AaH`;nuke6!VV7?O1c#49R8y$`5({t%JK(zV+qQ@$Xdi?uGAMyB9*IL^5r% zitiINuVXI}{iwGG?_0ouwTOQd@?)zIMZRmbSl1I{V#E7MwYl0;-FV!;JRQBU;%fUh zrmm@)5xB^Ng at 6dz4C#pv`}+hLVChpIdM_-p`_(JhyN$bua$hSpdJYW;{it{UDY6=O zcyrVe`SJb%FXU%lXJ~aT`m at CoUY1+?_fn6Gh?VsDx{D1iJhb!!@vR2Ys)3-Q(L&a* zr_CclDkSZoyv0RVVy>0n?=WvsErJpoD1>KAB-sEGVF&HD8N!P at aW3Pzlc-CWI2_Dk zWVSwjsV>;2{M}UvNA?U$%f=OZFQ;P~T*Zc*iuT4t+PthF%iP6S1u>`fidJTFaNK4% z4sr)v05rX;bh9Upr2|Al+mtjrOO{5>n#B!#Q5^MQ-04|oD~0xMNq#i?0{HP(9=v!H zzn{#xcpF`^R0->|^Afw47Z42&V4)je?%%NzD!iK}fC2rxz&bziB%#+LjunSX;#}9( zPNy20+s7~i1N5|e(>A<2>KSiisg!{uq>>RY;`IkWyqZ3DtfKO7K%S+Ljf7EGBqb`* zV(~8v0qtf at -i;6B?>MnS8Ow?tBSf|r6Qh9?cc#&%DH7M8xUkm?%a9gOW%8uZcG|VI zSh9U8n3`cc%8kRwW z7cN6GtYf;r%9iWs3m&1;@NX^dLQ%gHYDx+EU31FAGR{Lxu17icjCt6h2?kur+jSfq?@C at 8DX*{XB;?N<=xCdqO9C#+6@|Qq!{_u!A)tu z)FmvXOUdXfx^D&R^dlumS)6MZI at L^x?K*#@h1b8971)jtA1&Ck zJakow&?<|ImbSMAxD9YgtZ8PZ@&mFBr9PhD3olu~)mMKj5_s1D1(z4st8Od at W46Z|~+ivTZ>*m~odHTQU(B8h#|bG-*Ai zpv`=RfiqXdOEN>~w9aec5G#?!UYnpC`@WwwGenwGm52H+^fO+={}LQJ)0*5eTa24G z!R9Q1J<)U{I6#ukDD6q6+D}`l28_DU*VeVAJBzo3xJ-Bw3Bi=!cDYMwB9j*hdRT+M z+pNPy`RP~ZK5;hfgc$!r%#!E=Fz{rW>2yl(${J%mlLa%oL_^d&hCINWWQ6Sg{(u zLiGS$=xb1A!%TV_WtAd1cJmMI?QswI;x|iuAj&TJJFi=Zu=U+9WIrk%q!<8k zRwDXlin|0}?wZ|2PJo0vm4$u{s8Fo^U6OJM&yMY!Q(^gVqBngd>e$rM6g|h;gm5vv zg^J|>v#wk|z_MN?`B&v9F<`DUbU?A*uyU?DVArsvwTQ-Ro(yFZF7oZk+{ddmScKRn zuENE&<+RGe1XHZ?($EA;Nx`U9JhUK=R|weRVxY at Ka29I|oGpcq9MVl^e=qiE+Pnv@|Vr>}4?uC%4-T- at n%@+*KC582ES z_c9i$K~Bu^ zSONriGgk52Jb+`di~ejY1?)z9){z){NX$`ddHjcdX zZ*WMc9l!ZQ`C3f;^Qva<4-;awz_HGGT at G#4`0VwIyZpt)Q~nUifKS1vmE#sxSrMC8 zV~-#$ajyRBTQ}?65QW9Q$9ks$?=_}c(D%_^q{Ww3RL*kF#A%VmS?zykHhaIsT^pC z4R!=*AcBa&L>B=+A8Tss?Hp}-=2|m#I%lB&em}36i?%3VN1K8`bWbe^%zjzUW2*K^{4JPF;UWokB zGi5JOh&o`T1n#hUO1GMbU&!BsT2CgUHX%@7px+NWPA|s*@vQNiPjZpH1+3e9nx37$ zKYNh`?mxCvZpjgQqH5i5R6lSVi~pE$tw?dKSP^7J-XmccD{RFXk&QQ3;Iy253u>rp zv!lh%qgbg5(c at G{T;BdZ5wDz|NT|3G?1y#Nuc9e{fBiws5{E-mWl8-N1~clnN)|pp z6?Dio5d^m at M^iDRQ*Vz>`@7<;tu?(ocfe1HWRy0#La>QO6V$XQVj-PIPh2Al#$kV6 z1_pPn>HBU6_r z at 0&$uaTsu#G5W at uCqmU=tE<9Q${$;>-XuW8&vFx%7>@N`6p7K>!d1`hq44}t_!jT4 zG{A6}P5dP<8BOm}Gu(svOWnlve&GgXza{+z%U^%(Tt84%)}>?kY-V?tXeswzDI3et zHkep^K|qUV2r`ndLnk9cJv^EHoYL<$@k6G}7xuEa7&8~KxRBFI-PcaVk`o^N^oe-}G`yZBez3BXLskl=U`*ckqG5zu;8pSC^K*<9Vd6KY?!~-Q zggkDPdnDbIVoRN(?wzQzEZGqiTWcJ0v10$M0&qC*EUDdRcNf`Ju$yAz2j;@hDuzS; zObMw~#XW?QsI~Gdhiqkb zpQ1brXORtw)7~1o_T*;9Kl1?Q^1to4=MC@&%gW*l at rtSBTe7N>u0o^_!i1_62x&tV zD1y*8-wc7=Rf6%~h-!AF?YFtCSRVME{hAfOD4 at 1TcxNa)1y$Ox`OpTm&5^KQ1dx0vl+ zy(o!}ncBJ#g{SKsMlXpMX)?uk at 6m!1efNW12=liPS;Os=0=ZQ{z)wBO%MX$GTzak# zy|=}kn0j!7f9XUq8d0{NnAfsSUKDsdrJ0)2r_S9wGF0<_quUo_efrjnAoi*X4;xxK zF#)9-pKa}l at j^*F$3#wgz-~vwF==C at u1v`Adnv=el;aR{Dbf)a61GR at l1>|;xznk2 z;8$ihO~Y%G!}ukrYJw2wCILeu5C-4w#~g%YhqY)OiZj`PlwP88ZZ1 z7Q+3rcP?+?vTLUYV^xpr*z_<*F|cEufP33fx87Y;##ujtbAD^eA>#m7FO zOnxawQvj#Fq%=RFG(Sl at d88wK?bio;}2T zM}JU`Fi$VZ`#)F=eM4ruq|)@I171_29=sz(XIc~1PSXerDB)nOPzH6_|Yvq-4``l*qRy0q^#$&P>JvSRzyLv&hU%>G`W z3pz!bDg2~6<3?cJ at D}A2&*$1LqI97&X1qsFjS{wK*dGl)_7*)xy`)OQXRSp`L006Z zKd?@4K%g6hEgO;If;+~>b8ocYLE%F0fz;>ZzA;VwK}h=G)|<`anI)RFTA@=cVj&G3 zzb`#Ht4FC9F#%H_+l%tk^IUCtQq?XL5<8bHTarb{J4ATyz8<`~v&J36s+v|ygv2d& z;39{I1c=~75ZAzo?AfcOFb5}kQpm0c=2QooVNYE(Al4R_gTqh==E^;ItKyDWlVsJM z<+|HRwbOv!BV{gD41b6VY?{i~eaIJr;e`WpO8oe1t#{#% zcfscF*fSW1_^cRJ9GDQtFQ}-tBAj3;ti(rF-Xp5QQ)4&a=FX at DESaK$-6l2O{w*HN zT8AGc+caAVMUgwJY*D;INwNT3-=-$|Y at csPEXXB#o_Bnnb9_$3Ma0 at +3?@`~0sV4? zaZ^S=>Mu+Y94zytDyJx7@%xG82M|DB=cQ>{k+~rVjTls7h<`svM`&2WOsKKkH1gPX zN?vAiX69l7YsU(~#tPEJ`t895R=Ojk5px}?>OM*&-KY~`TED_$fc}v*xnyX+Zko8j z&#{I_ at H-c#*bX^dlUV(YYtn2?BYBC0U+S!TD~<-ef5u{)r9`UgFg4*2HK_q8*O_jl zgyMRKrJ{ZL$*+v^M0V+WM0O$h5}ozh8vI55lAZQS^h%ppnNfI*t2OOYmnVMf`oQIb zZ&Y_uEz0YOwxvz*WTkk&y4etymt at Xe+}w&BHcBd zIFQ~eHxg)vRN&)wdFplFiu^-t at Q2($KA!z!y6%o2W}33MzSZn>>Li#SW`WY+Oa*lw z=6e+MTN0!v)x80!XA`U~=d%oBk+1#nY1D<#J3a1?@TfldfnVX}(KSoa{0GXXW4Ld- z;LKJ|A!o=$d{J)P18Rb=@Vq=yH^W at +*lJGTALwun7$c+G%Ou4zX3)c at Bf+5V!-4yo zz_Bfj3H{>k?$M=3C0M(1ldZjG_edki1Fi^}t-G#bV?%mIX at Xj$SoK}IKyluwpZ=PN)%zpuP$goHCW)X;$D%D(Iit8eOI%{T2hiR at gM#)?6YDkVz8_AT`I>Rd2cD z1EWDNA0GL(BF6XY2KN#XVE1D5(oRoU(|n2#^r>GOTUShOp29Fl6a3=q?0Pf7Bozk3 z5{klOMMPp(-0)JgkagssYd~7}rGg-(cDBKU!biIq*&p!}e8!^Q1 at QX(hDzp08 at hmu z4t97!6qWsUEOir!7k7iEUghQ2T5Hd7#?J!h!=8aQJPlIqn$}v8?Kk1w7Oo_AH4Bw! zqYg^rA637`9`W^wvo{e!VhR<`UT7xWyy4|s at q$8Pcn at fj=V`pt%toxGrK?tc1+^ro z6egU-6|tz&gstsjlz%nK(Ox<9`!MeI#M*Dmw-FL;q6WX`yFs`9Ko8hx+LA4-o9x(% zO<#UTY2Q-2AOELkQ5R+Ah8K>(9=ePXg)Gyy(w|gxr3VQF6QlcQReh%xqb at +But}2y zzx17%t*ax;v0`f)%%?OGr}RM;3Z~PC!i2AepT;Ex5het$u#}kXP#tB%^N-H$8r!f4 zUEMK181qINm^B>09Y=OlXx~<#KLr50`N9RYNGDGDNk$x35$GsRA-z?~x+$yZ$0}0F21PaMuqsp-P8tI^o$s`(i zlfk0nk_v at M{_ at nxkxZE!lVFO<%hCa7A%Y%Baa-i5K#Djy0h&`p$+x0#G?YnfjU)!h zoN1#S8fkz^#aKRuzqY1%Q~(z%@{f8fd6p5utZ?#%S{0I=WXh#5ortF1BZ~vp&|c#Y(IY_93%*X>u>_NIm!NRu0YU+aI)tbn6Do zLNyHprc}6jGHcNHNf>2H(-c#7DeDY{XeKSQu9=IjxT+&7_5dKmm7d0E8Oy5!1nW!f2vdQ^$NO@`ICM{=9_*E{20d?-G~(%Ug0k z3tSpb_e0~?Du$y&(J;_4-qeVu957#mIVW{RjtP)@y@&BY&zU@=j=RHze$~vp`WQoJ zh~rQr!qZLtvp(I8IU3likJd#VKJ;`FX`_5c10{=lMeaDzoYF;(A~l9a&iJk)w7N9} zCUJV;6hTUtSf2z?n|Y_FKFx4{Igh?-%YV3PiX+gxxr55i5xY4A5U!khd;dQ z`pe*kFNlAneZBv!B(h89!{mind^-9+6u~%*8jr|)MX=)UF-4x%aGoK~%kvH(8Jez$H{n{7I(?Xd_#nc<0 at 2iNh)3o zK!V&;f~MI433 at 5oa8h?2K at Bp)eu)Z?wh&x at l9_gj%9w!`M}|N$h_>}BwKigCw(ggc zjj;e_?b{<18ky8|J&YQd%E~soOMcZne=)DJAZUBhbfb?LW)=fo8Ngzln9;bc@;BQT zzAkKv!;F{Qd0LxEsD at QPelmvFtOwh&m$zciAQ3bu(m8K&Wlb!*cMb_;o8f at Z z1pOYPjSg%~QRIHaxr(Hbk_V#BNEs^NM`@O-F7Qe$@J2(1SUF^`<&~Lq8 at C0xTMwq7 z0jG_C9aX^oK_f1>!oNR()5B_gq%`AWj at RJMjdf2%&aL&VJGR3Yy36Dr)by`27TA8E zA=8va`bt+JnYVb;RhuY=k3Ae~oWuc5PDI)lcJH25=TA`gHiWhi6aUr~D6c|5J&zm-7+^`>8r6X3LybZ}dCZx{A*V+7mhfY> zTcA3Sckmu~+a(BeJD>S?1(WyboFf1z2uM5Vf9GNKpS3{$W$V>MVMA&_5Q%T0D7?B= z>-`9k46);-qFA9wDnC!-)(1DG&ZSX%UiPf at bqDH2ac>b$_?~GpYapF9HFl=e4J4H- zdM?rdrBEJPU8)-iQj$k|Tnm=ehT#fRI{DQ~*sR8h)<=~_m{&5FVlqUn+f!JjqJL=; zO7cwx3z1S?_P1irHQ at Mdo)nLyJ#vX|I&uF_R( z`IE~W;S)}~aOhwR@!nblVPDMkC=xOH!Ki0fd#JzFcd2V5eQx}N$j4#HBfbA78|)>D zOlAxQ0s;^5-xcU7+c`R$7|R;k{~u|vXcZgz1qC$UE3ESl^z>eep1iOh&jrrP-jbnY zp$5OO%o|JyKU`OIrR%LyYe=sIZifa_ccAvo{6fON2i$GTMT!iIG_Tude5O67xm(Qy zeEmKl^CC)V&^Bd>!-a7YsY>z-igxrOcHUvt&`)4#0O>z$kGI2jt>m5Qg5CoS%Wd0q z|2pd~VDO~tuFP$8F+L!d4##P<;!SKDXfQ;TVrm0!Wm`r1O3zbBU7`NA++=jwpt2~t z!P~aBnT`2C4}bDi&VWE(7VksbEgXIJ5Rpku+1qGi^=#Sm={vi+*XGtLMI?5uH2!X~ z1g% zQswYgR9iV8A4fk at _qXRTjkkZ>i5Ip4hhQf^6m1 at dt;)hZcm$`Rt$YV&z&bb&*xg^} zSpQzc`1mbcUbs(VGOAAoME_WB at Y%JAB(`z=?k+>N^47N+k`M?D56topruIfLNTWq7 ztZ_V3NmR&}l${4DGf0oJrki>M|74Rv_6)CLA3On7D!!wvo5vjFpJfQO at T3g;@$r-5 zCe9T$l^Kd#Y0>T17<4t0aLEI5m3J^qDCs{V7obUQ?*n%4Ag0|A&thtyCR-oZLgIi& zlQR&A!7_7*iDddtx2Pn2c%AkUHE3wuFhX)B at pFitZr%e3 at Whqw^Mvxy+SeF{H66m|3}^pq7o27YMXkB9p0LAq6zs7G4N}_{=MV0 zqlDg><-MlR?N#B#NG^!D*@8Re&rqF8x=gJr7RrWgY~XQ53h9&hXU)xemldj#c?V=G z?`GoxKRD`F0J||r(9^g>aI4Mzt^yKDv1wZiJwV^CJ%`cL%bSU=RyjhFA8U1_>5A(g zsOl7ZjK;R{-~9`!+`YI-a4I4i@=C0UUMip%|O9npU z#WzDFKAAO-6amy6ZZe;;&vCZsJN1YSnyE8bTB&{EpQ|5s1T2>_6ZjsXtIY at aPRA~~ z at iD;{T%nf;^dp=9^l?MEuEY>OmfbjRDbG-302R2TFo+K^gJntret7B* zT3(Q7JFd_pNpkKQH{$(O z>dcDmogO#{$X_ at R5a9n5sbUt^|AZ|Q`$X!J&)&=VpAo0Mc(P((B#LItq7^mkC!1)CUfYh3VT8uCa+)T=! z#8Pi2CpDvQgi|BNtGmtQI6Yl;SAKk+Jqv*93?yQqw6O*wSJAZL7H)eDKpV+M@#74S zXb=ulj)rUaV&S$iQV at i#$U@|XyFehXp~TM&8EN;W0_Lg|*|X3?51oDWzvWhNVhk-I zCR|^xLiPTc>n;bV)mKG~vEvYEs8*M)w6|E?>lPOA0$IDKnCdJq9Yfu>%I at BygGgFi z9||Pne{Rv79<|uw?)^nX;PMj7-kr=aenDhZ@@}%Uk`%?flGeZPad`Ty`}LX=8M8 zqB%ytVETClvjA|Dd&tPPGa}8Qb}KeU^%Q|9R9eaom3 at lTl@{#({*y(OobP$wB)+h~ zhhWpX5~;&AZ%( z4`)B4Yz>+*lYQU5KZtK5Y-s+gPT8PTmS~F at 2@$$Wq~1zt#|+SRs)KZN-zW=Uww{~} zC!1nNhTG*1^%FL}N>3{d!x8>U_0yC32^^f zWVRf&N6z-qb^OkR%}XJ(6fPLtZRuKoKk#BqbPJIC3W&$wwOf7^-;(bZ{4kFJtjN!6 z6HC*D;~q>p&1Gc9IY}$MQ$(MP-!=OY*^$^4DrF`(@oY+eI!y<3inFkckddNFh^-R(_-|ZY|5kx5!0UI0_m1E!tJp5_ zn=CC5ai;bTKnHyNn~Z+T9oV`ABnXHW#((Gh@&Arn|52c%VdI3Vissv5w?VgYGq0qg z2Ts={3zx4-lb~@*yV#OHk5U%aA$4a*b1Y^|RZ!egHj!wP1-J_KQo0ki zMw4+FDo>qywx^s->$+67hI&65!;%5&1({RJG=hZ^p`e;d7~TsKGZN$F7BtdCwrXdc zxki9*ht*kNLqTw3OUbbbDL*7;QWOrs3=WJoYqUgbZ3YOlMY=`LOtlGFMj|&Z*po^y z^6b^$=d-)@Ew|UT*lAg at qdlK^q4|qyV?Iy+ at aduV_BOT(25n1WVi7Q~My+v$iz-pU zZBfct9*vG)Mg5eR3~~CTxBP#`d~?Ty^f8aqmxUKrE at P<8Fk^GZaavN;_O--FIpMKG zEodjDLfctp=>KRctsjIAr5S2xWFR|4o32fqZLTL+!f@%kG*yKV!ga;`5-}+>3(^f+ zR&Ue=9kE;@zLpaM2G~FE=DNuOXovlq%E%K{T%y25uTNRTQ*w=K|1PP-DX!23u$@@W zW6YXcl#^$o)7AF5+%=jpTm at ICldmh+JvD!0FCN&8sAMJ+*!3RuuL z2=Zx+8V<@Z(x&{%++t!(D?ycNv$NGok-EIm&9leaXEQA at O8!tRIGh<}Z(q^oGd1U~ zo`*Q1Cf#U{rZpVO28=XxOjodMXeH=-B%aZP4_kKXnx2#_YADiZ6BSj(PwJLCC+exF z>!OqBuhC^^k2h2bTA96C?=hTKm?s|}8~hw}k%G$U0t=cy2igmfDB45-uYpYP1a9?rd=Cu=*<* zCykb+rdo>Z_i`1fzT1OgX4g)u)@zR*N((vGis+DvKB}_rH at o)TmiZ_3L$0yO?vl!) zfH2R0u~gH}^T0QtoKrR~h_}Sn5`x{xh(R5j=>}P<_z=0&bu_YJ} zO;VWQlG^Baz<9DTnZCHO^#Cc!Rzf{o?8J$v#;`IM-JT8h^^Pv`^_V*$;jFrn>eV?a zi0PdOwi&Zpwb~#5fOlSe?BkmRe>K7p797GccL>U#-gNt at -ZcBHn?wR?KSbfZ9RP~) zHTBPEx9z_(anTmHtL-AL_V2*D?B=7;d>C=$C`Dtgv}#GU7s6hyeCeZ5OX|xGuSmJ; zizpa|Wir_*C%rACTvFv=R at Gl)!s{3x3!ndP#NFjcDK!On4&{-wt3YI1jvJzPD-tDs z(+;)NIHETVp~9bt(60A>K`4wUAup~iXs3xuk+X%`3cUmnoZVo3a@>xItRkeC>VWXp zB~~hb6$H?ZNOr_X{`RyjyrSS+!Zgp_U%!k2cQr!%ZP%{{6gtPxY4*8V_tiQ-u+ztBW|SioC+07)Yc}7lY#)jOd5af~pObFHu!R(A zftG%X-1Ap4>JX%MVRW)(&Ng#;Gk|N`32tg3e`^C8P2^j$?+%midn(_J*Ar`oJ0E_; zArL9>r)^-)8CQ1K;(g6x5iL3?_3u5&$=S95HNCv=QkFFG3?~x{si-4J{S0A{=)mB- zx^}?Sg6bSlHeNyMK8kRvkzuORnd{<(mwRfqHtvrwlQSYqcdK_0y&KWYZ}U at vz(GHw zoc6)R;DJH!JfeOc-R0~oE5l%y4xP1iU^O>DpU#A;o;M~1YrtwS&Ze2~fs_Nea%v%K zL4I}qT*Mp;)Uc^H`jRU)mD}7aMgfHWBJ`mxUb6d4YN}JogOdhL67GXKUOK8jIBjf~ zalXuv*19`hxD#F5;t)iMYZa{*ZEKJ%nxu7BhSvMz-_|F at -C~88KtVtP|H-9A|F7{# z%+Arx(9zh!)=bvL+S$U%#F^|rjig1bO>9hTos~_T|0AJR{*RM|ww;$+`FVl<{-eL7 zn5%&|DuL9&6l6nC8#nw-i9Dum!xz)PKGZYJWxQ{oUShrd?cJ)CsEGeEAwC-&Z8^00}|^e`S=nwe5#3u5G#?vL!k$p^sP2iY=9)rA%$p7OypT+1847tPc9TYP1y*tIn zxELy3%d5KpSd;pY(JwBas^b?zubLxlI^k__IXvNO=P?ahwuJsjR~6loiQ znWOyqS<4<<8m`y7hh!1{prXVf@Ll0nCI>_7J8p z{U^?lWJgg_LsLitBelZvGMx!E#0mqRoPZO80LT}}@eL`}b+?lXdq%u9^>4%ur1~iMLO}A(|WEM8!=e zHHeN-Yl)?FkdKtanqYfydJR+8qW)N5U{Il7slvJ{3d|QXRA*cU&pDBpU%cBqU<;4L z1WZt!F~GEWS$jhv^TYB;N%tbRazHsmxrcc%H6KZ0Fm zl=@$1v4!t>5_70${8+e at Bd`MktvtWj~NhP(FP zw7Vdl_L8gVE{rpHm?BI|2F;b&eYwlN zc$Iu$Fnq4+IMZipGSdjK7o&=lxz|#!ckXz82mgugU}1{Cu_QY!5;wJ$%GUu;C!UE_ zG2NEHXVS(qCo9>WlAmfZ=@Unq?Xr at 8tC#y~)#z+pGxjjmR)TPCv1#M(E8j{V8SI>1 z2piK9n`1gUhI0pi`@m{sYjmo$^BitKyCA$T=Q)QV`*Al#jeM4D@>?3)vPZSgej%hh z3i^XL!zk<#Qp;?Jeq({Ful#A{bg|{qjv-Ckpbf%uJ?MeB&L57nPE+52VT>tN`H{)8 z>%K>jXVy7C1(}U{v&;0Qiiwh;>8GcH9uIf(1zo#|)CAf9JHYq4OB2P{>W6dC9~}8n zvQxRKY`~0st17-X?#`cE#Hz#~DNKt&mgG?8 zD60qm7ynQ%ru<#KtVMePEB-)i_{KEFTV;5&8~@N)L%jhoZSCHIh+K;oZanlqvo|<; zD|G=buFg7r8l9;M1B~@Gd+Ip8(c9+kKkjLKD|g*qx*=58=m(D6=-XcoNkSUDBhS9P%=p526hHLWd_3ScQFY2a8Apo1xI6$RYb_# zn$5NC-DQZlaa!IB6_~dQ~~s^{Cez1dLN zDNzOjnwj}u4e|2T?m2d-V&*tEn4Iv!#5DB^(oxw~LJ*Z=m6DLYp{JbZIMcU&s+;1* zGmH~N6D{Bwk8V&1YFvwe*S_o|5a2yhzs}iGe8D838S=Kh?ArV!C4Ozx`4Y0rO{#@? zt>O%)PDo9rV+%OA?2xbEkmVb17jC{6y0~I`3c@$A`c+awPVSn2h`n0~F0w8rlV7wE z*0|%OLUK?R9CvEr5OHLxJ*GC$Fyl((6?0Su3A1(_a{rs#eT7y&#mPc!;r at deR|wnt4|z-Vz at b+6#vVytGN$p at zxn7s1PVBq-4v6elIOD8exZ z3eQg`Fp_2sH{6)mWq6l$ulN6snfcwFAZ|DMyBo|&GD`>HjWt4?TGRu>J?AK`SFu6R z61N-nh&u6sx-CHH?17d`JeLoaW9wa>F9=@I7pz9npFdm(7_xE0R@{5eA6OV at 5V)*n zFNaiBi=S#mSjsN2M8z+JJT$(9^n4-Osz&It3mGd5vHgR4_Wuox%{jyc&8@};Fru}R4ISU zNCQUva$>iGE9lw~o@&Nl)CrO$)Mw07G3A++h&)Z6U(uZv#s?ZMt9o`1>N)E#a> zXvgoBrIaQ>HN9(5;YfuXf<2Bq2n_=QLfUwaOA%|WUm|Ycj}HtR1NR{L?>3pdTLrLa zX^vY#FdJhdWzQ&Z0$uGkJ_Wnv99IHeu)SX(dno9AHAsW_pf<_fHbQI>3=?F`*NBBd zLTgak!HRX at gRV2u=;hIWic0&*b;p`i=W)>;6>S(kr}M-qc#^mLGI9n}MHsDVcKSw^ z!d-!VL)G8ggYj2-4?2CSU)>b#0+QPU218|V*M;8zw}mYsn$S`szJK4ATyp9#YlQ#- zaYY0HVf`Ow8UK6T+Yl z2VgRF4ZWBqp%5TaZC5|cIaYby6S*r8B~bE^R{awFlAzIlo{VX{U`VA=hVb$1koWVM zc4O%F`+k2X1bMqv1cSPf1DkT^3=e7}4ek8ZMj84%Xs-`I3?9dazov}$j~~Qq_+_FO zRBk9VP at teC)!#3|>`erzZ4R7`Ti7wTM_)wLiaFF(L%Kf8QO!f>ye|p-i<)92hvDR8 z>N}j)*gns;YYOkRJgU9NtD(|OUYSS48t>wiF1n)IGzBQ-UdgYsVLdky`};vkDqzPQ zxnR4+dR!`NCn)5^y}o~lvX_1-1V0 at G(4p9h at mS!%gpY-W>gb>(z at Zf@Ini{b at U$3c zYCgfzW0tQ at InyHV0{Dkf3qP*~DdaD#~C1bEeRwU at 2M%=uOs?6P1WpQ6sX+T7( zx(_+%%pk>)?fgs*WYeQEuF1$D20{y(`h;m4bC}I{uvC%G`!9`poQ9Qo3t!OG3z!^j zqR+PskofBdzLR`KK~)0hRZZGMQ;FZ4J4GzAIDP+#p69n2OYc6?Tf&B;6vyvI)Gwo{=_9`U2twxG3B$)8s(wbwV*oF=p)6i z?4KUtl38hel!23=!iU zmc7Grg{qCWG$gwUs)}aVAA+y^at~oO1(<>PviZvw#CslM1 at Bc&E zd$osyTF=v>70%ZJe?d^g{O89-XA<*xQSX(eh;9|wM<}@6(-N3HGj9msd1L%(eW1H1 zuFQ8 at ZpE>rXFk2$hGzf;zAiN!6*FT#eT&`v7WQESrF&`xu6xcw&6Cu$zc#JwHbl*< zYzfoyQE{Sm4{v39rN~*Fy!hEt!PE7J)J%#Z4r(`r#HD;#wNlGnf9TkQzWK!~DojUi z)GkbdMPD$%$ii$`FnF%fFSBA|>Th>*30ejS>!x3V4T>W?JmEq)eug?$23dbN$)ek$ zR;WT0zrn>^N^BqA$VMl#Ws1FWjE-k!7bz9?OU)+&qIH|S|{!p-Z1)?Uiqu%7PDJ(nKQ1uTG+{NjMBnIZ% zCna{nGL)B#RLsaE(7vy(ZTxk`Ev8z17iI({U*=gv*ctiAN)P3f}~ z=`-v1nC^b|DsL-XYv;VhaNqNZycvxu;bxF=(jdPH_r%`7l)D_vFjNH%BXhXRUJQ;=&X)U z5bu`gGw7TZ_uU4|_W`z2965^iIBp34YaCD?T4qK60Rr;+-7jWMz3wQ_A0^Ldtk zf%3i;LRH)gx?S at -ARlCHYz|~&elR?mOux>$&%U2}+ITu<1Ys~(7KTK{cHRpNk<^hX zRL5t~Y|>H7p|#MF-uJ{&w%BBf^P~%8VwvUq)0e|MV$^U%r^eBSJ7;1lx=0p at 1Iihv zkxeSkvIFa5UX2fIFJa~*Mg+ef2SSH15++^YFkRuEWIUQ+F=HpEuk28>`9boOgrLnu z1?bq?Epvq2nb5GGtB0#Rcg1<_QbmmPWF;AfP7 zCb8tZm$OYCN;fTYxoqXq9&UuEp)`!=CK?A{5JjaV$-zHHDC(;+vm0! z_M~@tY2UcRQZpuE;!G$ieY;OOfB at AQT3=H8SH65Pv(wio+PY}cv=+lc+UQIUQ~L=q zL{FQjovi2$suG8h-a%h+*^Xv2yB&Mpqs|-N^7HxxnE@|s6^+sCV*k#bs)!PWmd@$F zlyJU92h2?KM^mj!#p)wd9$nKWDiQ2bhf?IlCu84ivC0pRW(NKJpk(HrY%*^*2=mAP zBzx0rGt2FWBlgh0Pd964exQNQ?@(QijCzXlAD%LL2P$Iy4c5fk5Z6xBYRIcji)uiFM=f>B57jEW!l;NSF%gLSa0TMv=eJ2^8TmLhu+bVp*ozD)M2{ehG`A zFCsM6A1HV@!o^ciZ5TT{=v2d&4uD6+Ce4?IAMC5%f>P|ILVwYAuG3_ at vW>bMT=s}M z|Jx^-y+Y)v?f|xI_g{(Tw2cz+FMk~`$p0D9RNUj{Xw1Qo!s6 zaqX2_D)uUUXb-u52(tPd#EridO#(7BfsB75TTvQJ>GA$m&M;PErJOQN~1j_^e0Ow=Z^AQ7UdEg zLn#3A5WQniy9fzz^x}^&aWY^$BUZT{SJ%GtvQ|!M`-yAFUGkNEy-IOCaoNj{A|HC5va8Vg(lPEzE&d9B;FBMucyTZMKDhxExPLvtr2PxY8Qazd{U; z{K!kc9vK1*%P>C~K5{>zTNW$p{{k$5Xw#ksa>>?i6Rw0X&tn;crv%J04_xqknT<0S z+P6QI%gS&#X>_a9T(rf%6 at f7e5QfA7-F5N8dbCpFj{XRyfmK}?trHYJyiZ8%yC9)s z{N@)T67#@7uqko#$53zTOKLwbTKP*NMgHy}Eq8{Szph>T{j6p at 5-$I;VxZ)AA zL?aY)GZ9>qQe0x&;|^$1dqwRmV(WB|Quoqn$)+iTAr%=~Ci>&K2B>+|4;imGOv%9GDFcTR?GW=Wi z%N3O)SUcGk2N7~#SV%a$QtNOVoP>>#J8@$HqZvNgyttYf+i&tMwwOBXEQ7{01I(Se z$j~|atU}T)Jh^?q(AShr%@lpguMX0PAZ*s$A(#yM{v#%Nfv88+fAe8yFru&fhoQkR zARxm36NWk(+B%uqIokYdYGmTzVq)uTVQBrYZ~s|lSe!EBq^ycI@`n>f^6kx1+TULV zf>;oxE+6*GUt?}vn5aoY_%%Os;~;_m=&~p$qzfpC%$E(}#{aWK&e`7|(409Zf#bUGDZFek&a-(qpFAJKx+~J>i z%uQQQ%olEo-f?#F^PP=v0y8;St%5Ac( z#13735qIIC&;V(LrCn^aN*#-gT3uMO?{1;ZE2ZR1UQgJK+AO-mo;}5bkXgFZuG?(M zVRI!e3oZ at b*rvGdv#A3<)g{$c*9I&lNw9H6ROYtpAiS+AYpx8+Md81sgi^p5i~nd6 zjp`6!jE!1$v$one?86d#I(-N6y(86a#*N4FQ2xM{+Ytd(MYhCYbwmi4nK|SQWTpq& zUDWGdb^6QtscYkmIz2C`$+oUDI>Om!W*i;Bt;wJWxS!NTdUx0#+V&V90?lQ2Ozd{c zP;K$x}?gS%e%%(XV>Bk=rx79i3gY4oE z-nw2?4mov%w&8nEqAjJ^v|f(`m5W>Yq(FSp36Hv07745q3%$Gmj9)CuF1qpuOw7Pg z0~1Iy6^3sV^lSErRo5rG10#w|%AL*g1yAIAhe`NhFYZ}TMX_7N1mnlmJH+ at T`^q4H zgKQ-GGGpFM2yG1&Q at YQ|m>o8i|@$aPXBG)<#H zvz|jHL1c`IgFGjL7{ipKK~xgvdO!|%Jb{@Z zv?tJVX5r!MO*tvoG$5(1;s9-UyPsJRvyCav at XV}?(Zt*4t8U(QUKiEs%4HVj3$Y!a z-qWe_gabz0xnJG>@(pG9&-Tyuyxy78PLS;7>R_}alY2&9gYC0Yd=-{*PcB|7$QVVL zQQNqsi~&x!MGrU5onX`_%&SsQd{O!exhmNY9u5B=z{q-uK4B_;WvhoW9yjjijiQ43H+=3S!$84eV4h6_O8%lXD8CY7jc5 zdIqm=S|$8K#@{Q&$XGN31j&VP#6n|SO}LrF2ifxF+^4kek8lhW_(5rfm`{7{1fv%;|o`G8}tk#YyOS&J8kr_M;wA9!XYeafhS*e0 zgA0t*R&f{XI&%x%RJrvjWKhUeLc@(dgt%clrqXM%St+d9*eo^D;}uzW>{5s!`^Hy> zkKmQ}8l^}mcMl!ZGTw3Bc%^o-x+Vt8Fxb&c4?fEeXENP`$q{}ql|2q2`UV_%y0vDy zcE!#xkwrP=wL7K<_nBh7Q#(>eNmq3ZdxXDAAXYl6^7gA*q!lD=~ z2f9`CpVESnTPY5ny1VLq-iL(nMIiRa(nr?PYMUca)GD%SynC#){3_)X^%8Y0WKqzT zGhph9JSt|$-On{P9cc8BroLSFZwWz{7(#NxEpgQp%r325mBz?y%-1^OQnru8W_zZ78MW2wUN^?pvw;-)i z`z$X|$#cBIMwnQ`@_d#;!M)<(UkLXL!X_ieC8SOK9$Xh$qC at t|uv)P&tFo1w!PDyq z!%SR89!uMVrEAUcf-ijtdn%cOf;dIL=Y5$L`3m8Jja)K`aZA;3EyKpE-9DbfvEshf zgwN<%e7?0)Vb_peC_W$C| zbHSu|Eks)y!d;rcU1SU%=;0vlD&ipTIvUDFTuZ{5!j at wswVi;&Tx`ld#c5iBr|DKH znxqw)Pg-%AExd9JD~NaX^zdjGW|i3Q6th$_RhUjU20;xQ^dVPkbx4&y-9n|l{-O!j zw`#xK)@Hk66J=s;H{4X0ok#jnWWcP^;&bdU@(M)Ns2es=!43C*YPZJWuINIh(oS^$B(t{omcX$2x_U1)w`3Jt4 at A-8Oa5yAK$=QtQ=1dwj9U_2DH}>9Pi?TCFrkM4q- at 8VnS! zulX(-{bNEMy at J4acR-ee*cZAZzL$iA9+jVA4HArmk6SHOEpF)h0I22ogo`*HVWyCw zC^5*g1(6Ky5>4?#UNu6_+_j$Sh3Vgjg`13i-Dsn zct}J9?aJP9CY3i5(e2dH~J=B*|T*< zz#^mb8#PK)Ph1!d381(Rmw|t(pgY7B$-yl+OaRu6G3}SqPLu1dXbdePhEWI7bsE;_hsruUa1@ zpL^hE;Yf3KttA2tpY>kz+nmg=E$(LjTRS^IoPFB>q}})R$Hp6D at q+C&HFMm+)tz&p z at 00_IWwIETtky2?avE;hjZQhx%e_)w z=V5xsnx$tAvdp=bW}wx&Rw_;wCRtS5{GxT(;Xr5LVxg(RW|*-G4r+)cclq08Biv!j zz*0+-xsp$IK at oL>8~q{u^!SvU^i|t8uUa_imGUaSQ)+TA15-9B4I|^OY-8ocr700{ zzZUQOaXI1}0-j5KgrZeXGzTcFqID9k!XRXJDWezFGkiRhX#V3fK-E4w)TMW+OvC2eh8T?~zEO#gFABsb-MHZX?mSxTd? zrK&+h00n8aqLkKZAzDaCESj_qflmE#;Z7ml+A(pLe%H);7wowQe=m-?qX{Jdl<``e z%glAod*XchnxEGPsM5d=3=Ag=Q)DnaOpF}&Fe-`wO$H|gjt0wvGCA^Pr&58Tft0x( zDZFxLBkJC|8ErbLEW;iJO1t@@vhiSwQXy&Bb_ufULNcKl{!wz== zb6(tSJC6QHZvvpb4$`_9brj3WI>+kD!Nx1W5n+wqwO6jA6Zu(4yw}zB(=2HtY0Y$U z_dO0>Wac3_>Mgh}l!*#W%wc(mq6#hVC^Rq~&C0{nU}MO-Mx!IR+vY2v6}bX7B`aH1jBvUz&mL!8UtMEFXb(7F9d9L*u!mqqEVjwU_(AkqWoXZ0+h3R6iz)1 zo>F%m^A4?2(R&0^%+34>pF_S-?eF=eXiBUxih1%hv at ym&5+#z`WqE036qaz}mGidu zBKap$`h;WbB|2sIW|Z{ z)-anRzjkp8*yeLk<12>dTbp$_-&nXdmMg8$b< zo3=W#I?DIyF%t<4V50W`v=R(3R)SZh2#TULilFGjnpQXii7+{HRwl(}bnp7Kw7Fbo|X$s};A}y4P0uKZt*DZQn98V+cX0QP9j^bDHPd?e}(v@%?{(QwJdW;0l7% zi7!S{>vUn2o at 7P17eO5CP}Cjq_H82+-Y3hTAky69vPOxTbfz3tVWp>u^ytUSPTY&u zi{pXyn>?P7>Dxt8L^Obe&~_JKY68wGOHbL7R#JZ_c|j4zXQwx*6uawZ#$*F|@BUD9vxvN}>2am7?-SdC at 4 z%E`yfFOn`ER;P4AMqDow=uSuA?xV=i+S668nI(v~8YQL2syY;Mn89{*O$H9v-HwhN z)t{MDcg6J;zK7^LT5MNm0jzj9%rRXqNkGm)<5nswZB43&Ve!j#zO1|VfPB`d at 8k*41mIuKhG^G9^HKcc= z{1Af}Nr{8Rz%J|uvB8=3=`TXw*$0WRCZ_Up(RNs}$dgr5;%{Wd3PC08QlQ3^?4m`* z at 9&mglUu1En?LZ-EcDDLTv|RpcvUZfTH_i}&K;0jut`Jc_D?1b$8jUaTF%5Z)naRN z4;)}t?LJSJx=e-@(`@!zShnJ=cLhIS0AXfxCinPDWuz1RJRo#Utv~Nn^JV*39pp;bqU!a`3W9J(WE29@(cfgSKasi zCGiWdsxClL{7W{;0>q=E9I-&ZAkZ7{j!w`kF3f7(5!@}i`h1wppdWa;6qtl at en7hg zZzMy!h_L*&rN63899LzM_eBAeFS#dMyk}b~&YE;2uefou85tE&y3afbyV8`I5VX&2LtbI86u3Bmc67XmW==Yx5I7n&pQrg$buR at j7j zMgOd#f37%o)(E>hK#vVPQ+J4>I|ijYX!;tfZs`lwZ71 at W#523dERR4hw31aUQixZC zC~9DSnTHH_ZPWp9+#!d^b{Iu2K`-DHe!={R#MNVSx}n-NisbE at C0F&qbxQt?9j{)D zazudY8zFd5WnZB^y-wUBp51o#fxSrQTI>?Ac;P4Mh{gDjo_bk26+l}cq7vnY=u#66 zmnPiL3$BqghGECt3^=y77!G=}0^Km;^BKlmXcALGHsKxPNTFf+2?aeIfigfs#K%!BNanuzzs=W1P0W#p z)NmvO5k|T{Ik5*8^3oS3Y&i>0wSnx0N2k%cr?8;WbB~|kyhayqGG^wg^wI8=AZQ`s zGFxslcRM z6UF9hiilI2Es9tTuTGl<^F50`jfokQXy&xULQRTIAI-ExcP6HSo?66^7GP$uMx@@( z6{t0 at T}CMvh^*HX#&UtlMx>9ToAa{So6W0c9yZUsEgYHLGHu1OrG^rNtH`LE3{c}C zn(Uby4tENSZKL(J=(yVq(a03E#GIaZXd~ublB8P{X%n5Z#3!?h)kYn@ z`aYH9h0j!y<)j5(S%oU^vH7rcwWS9v;1#l*chcWhcmPp>0y% z;`M-K#hPI+*m+S$uz7JuG^QEk?DGc5^8O at J(#QMQZZ#dJ=>3_qLNO7yuj&N*#X862 zzm?$(uZ65?$bPrMrnecBs#Jh_+6;J;b5Y=m5yU at N)*qa7`-OIB9S3rI;12_sWiNpG zWPxZ;G}swe#m=<|+L0!5f|&$$&w&5HV0>|fFewTGVkgvldK7jJ{-B1dH!~hx2%fFm zL%TlJdg9^Bj?e=k+Y80o&;WFIqk4Zk%2u~0uASVlwPSP- zCd6KV3uV$x`bV at z(E&7f>DEp8qASMWZOBKU)9X#XQN#$DCF at QA`HqNgcbM#f?{gG< zUDP}OeVsJ at RL+(p#V87JM3O3&Fa171-lKr?z%Tz^9PeO|>VTJZh)>& z?t69Motf!7C#GK at z9S^}kcp|~Et=kUOw#5V)BX(;{xb$VoB0&?;KDF}OTMxZYc#d@ zYifr^>*X=P6J4oyH7DN5*$UB7T~RmM0#ZTgAT>$L!H`W|*VoU{uhGV>@Mv9Hdf$&- zZfWx_*=KZ%s1yzq&ULk&Z)200dR*6zaUOOSdgJq02 at V%xsRwMZd6}$l5UtNW;))M* z)w+{Ld#ad}Vh~XNBAB(58q%woGQ-TCIG+eZ!@!+b+?Q?R_FGg0RVPWB0Q^^T9URg4=i!q`+bTV-rj6hAw**)&sag3=by(pC{!A;N;%+Mop~L8IYl5X(Z2>b7hpSP5FE9hIAa!VMvA at I$(KOr& zO+E$}=Rk5{+GzNh%YqcR)Q|g~eI^NkycQix*p0FK=zRkdlP+%2s_L{`O#^3ie-%!) zm12fu_>~>70LyE|p~^tcm~U};uBkd(15IMK3q^HHr4gfBcV{nYv$EMfmPprGu3Lwh zKX5sbX=VX{K;3K;Fw3>yaYMfU*+sO_Rw#xk#Yl}BII+>qu;o}CS~_JL4NnsB_)4SY zYU`3R7T>7i5>t4hph+b~&sS`R at mIuKz^2^5>Bp{3=k2ubWL?U38LHj2xn)^*-q69# zD2|d7#S5Vj4Se!u90?_6hLZ49tW_j=pyo^0Dn$K`Y0oAZqdZ)hvYTZ-$r+7Y8M29e zg!Ed}9BJzaA z#2z<^zT-5zoz;3$=MuC5tb7Zac6I)ak$?V2BV;fUY0!X%IN1;2&pK<}0^iUcU$?(sIbw$6vXCKhw}4=};} zAu56(5(51Ts!1&R at _tYw57;Hh2G+21kUetdsj^XL^i+dfLklzDnsebxz-tPv|miSBYj zHx{EffA|?I^@~Ps6!1LkDSnVPPjKiQBK2- z2-k`TCpz>hx=oDNVn=Efz>B*e#8W)$BDlvw&u*<{Q+WQ12ajx$$*r!v&~J8WxAGF& zUX|QXT6(XQwM}Yl$&|>JLO+vG&qn33160!vSk*-ESs)f*QeqWEm+KMh_WzJl%{Ppw zDy`}qqAC$B*7gYWE7=m at SPY6Mt^XBrTfST71$#A`}Q=Qxy7WK`SAUYCxqZfuih^Z8wrk z9No2{qVg#&-~ZIU-%8`Vh!w74j+_6$n6F^suYkV at nlCuJ*|%-kP^}a)_rBe7zUAzF zbe-)^y0iCvf(d~0MH+I>jWz(qj~fg{4b_oPQ6!INIOT;ua9lbBhDXnM1gXnEULw`! z9UfTXEz8IxZa+9v$uZB-o at mg6Sp{X`@e}1{&mhmRi_10{4lhR12Q(Iss zD762gNN_QZ*IV-vmk!R_sE0#~T-r81UOf!3y8KNW;rfcXLp1!^!Z_Q)@{55~ozD7n zx5!Epi*d{QQH+w?24h&1R(d)~v8+;K<*^Oey7jYUa$uA>kS?b>z&0zoD5_h!y4MBs z+G at DL?Cwpxg>wfj<{}B8u}F(iw?n71AXb at Xsk1F7q~X?2s->>^IT}Z%@u9)+qRlRa zG-O36kVp1RXH~S7Cx at 4XLnx0UO|-R0ZE4Cz$pKh08L)*iw>Y!C{t}yZ%S#e_fi{=O zRfBak$;{f!z0+o$idYE?DX#3H<`S{Fw|JB&JS`>kNmQ0q(lrZJOs3W(#t|`5zLh2d zVTY0E_V${X&KADhnKP{(pD8v8LVAU5gv!M7cyTjJ?iWy{JFbg^&@c`5YOQan^DF51 zT=JZRVqQA?R9jVZa`Y0b%d*%cfim at 0SF|W3?RVGul^Wvc$WHDVRm~*XU{*{WjJilu zo03`6ZUrmXx!R@>oJzx*mQ at 1vDw^x%<-!7uoD$BV%i*<-=`WsKDuGtm2H(5*(z zK`R&Whp-^_2Q=55%svW@$dn*kj*@-bp5lF7Jhy#2Q169W17zwBbZ^w00ZC9!9F>LP zeE1^uK|>rx2b4chyTf0KJ_Y;2J|+7sc#8K7 at WJmH;8drtoFb*EM1XByRUxj<3B^p+ zxD=4Jf~>(+rKa%NSh$EDsh+ibi^mf;&e~Nep%%ZY_>)T)=!F=NYSSVi1OlaeFwQ5`?n!KqH5JoQ)& zq1%$C7~T!+NK2RRWr6fgi)jtQL2Zh`x$iufAU?SRzXc2YKLxOP7sTLM&;V>v3Xs^r zl8hIaW(mmyQHEp=xk_G?E8q>e0vY8ZexsA#+2a at Sd(sirb2TaxfGw{_(iL?+?1t{J z{F;tqeB(I6BhR*35=>mh$Yu%6Kw&rqi~K&4wx>zh%{ZfCUGGA62$B1`NE98SE%8KVq`EetSk+)C>Q5Bj+JnCD;zJKDbIKcacaB|Yr%H>;dUXHX1X@`*MT zVmG(Vl at -j5wpS$AttKK77s-xko^w^UNCTEi{}@7i8$uMvFCD>;>rj}7jF8fMzj#H{ zD6eWj18G#7337!2X6|y>mgawo^VWSQ)LP^g0 at zgf)KRJwN#g!Rg2ojouSD;NHHCr} z$`Coa47!gOpt at qN_9ex1qM7svCqU%@pu{|NfU2$3Aah4qc4<8=9x+)*fzpn zN^Maz6~dA`$d(UDn+HitbnkfCrClXsQJEXG+`QTNZ06RIjEilTjvKG^RoRDMUs(G2 z+csy8wUaA zx{fmwA)HSLw8DLk4Uxb_29c)a)eHo(&K|?V&avD~{`k6UL`NTP(GPK)BeERa<@lgG z-&FiT%|Lv?#ldu8t(WVV~%3-POHz z+k-D!M`|8 at ktmoC;$Nt{fy2J~3I}zj)qNYvRc8>%2Kt>SIO6MqHiPC9T$It#}D`QJ%3&1`(Tz+J=-`^6t}YOIM4{Ny)ne2#7DwkG7bA0(XB1^@)bIxJA}le;xf2_;0vKyW(Bw)>qCOxC z#E>zHYJ~=FKbzM{bYc!s&LkNHNoB+vV|qr7b~uA_iukL7Iy3D4g8|9%rKunQ{q_7S z3M2nF1pU8?hsxUaNPi#4wl-`}S16>i(iQ}*3g!C{2xinsW<3wCednP;=IWYB$kkQ; zNhKo_!~YE!+dt{y2H4618<}l0=We&xdA;$ZzvmCYAwV6^a(j|6b2FkO@<8f-WW zq3={r??c?`b;M(AK#!r;t(6&2T`=FPP{Qbq!4$4ESuot7dDVM_ at 9~%De_cx=w_N## zsi?z)4tvQ{Jy7AmhxiYH<7q$8F+DHSj9s2)y$w at CkRG zuAmd0$wA3Uv!a-{kcAVv(}+ib7s?-VtDDbW+4P=TRgBB)s$(F7_Pl(U5LK9%Uks?1 z%vC;(b3N-m=!iL=9;N)L!2CoLpL%IYw0c$oDfh}4&5I59Fc}WAHO3#M$zrQJ0vo;^41^ZLzXh4U7CzP=3IkJFGE}(F#FAI;s7i9m<}P%qdbj9 zh<1})M0`rlY*zgM8u`dhg8YusexLq*#{ayA?-i{@m;9rKc|v^YNy#25s3 z59Y&zwsL!*)aXx{t$Z5)OmaV>jCnCVe$l;%@C*x=a(1Oqbx_Da?v*ea7t7sY{Wql0 zOKG&&=nj~MUzc2&dEVnGG1<~p7&Q(`@ae5tUNNoC>QbHUYDu;(o$pvBqh-Qcn;ly& zvdWLHyg)HcE_4W~195sIj+4z(6QtdaCt2M2f_lkQMzlPr*s3@)KnCb$N#DKkxh(wENF#u{wnwsvTchk(flY z*Q4fbw+omD3uSRst2(Z2%*^)8&CQPB{dfC-9iZA# zuSL`Z;n0sJ+=WIW`r(yK#?oHF^)jycV(?2-s#uXD1C at epThpSLvenyId z$jma&z`U7|y6iGjrJb(gkQMe*=4j_kpHh;iG1ClBORuL|p-Iq7M$B!Ra_#7{(6lL3 zr)4x(q{=)#quS~+r?ZUj_XC at +XtU`gWl?tK6<^?`civf4SI;CCpwUEgHkX}t#UzzQ zb?MHk*mN5;!Pr)}iH@;k-a__pV-*RZXD#4P-!K|68iDxe_%|w|tI0 zv}>I$4_lV$_imAv7gBL;5$UXHCO2I1ZYnGv&t+Z}J at cQ%pc~qi_b*InYqNERu=WmS zv2*N}dB7#(@8Av?On;85Vfo@?ljhIx3w^v00e=jc`N at tngYl0xAKPg+ zC`-1QlriiZ$SLyij0XC!UHAysuOh_ndm#V#3O6Iex)2GFg9<{^rrdQ||c9 zg`^byX`uM+T z?Ega_%VNi at tgW^CuLgth4G`e}rjMY66crR6TP4yuvh1Xip#Ev(gTed*_ at r`3sM;un z;U>F%xjmlTnZDlso}dk}VSzNKE;Q#FD~%%w_L8Ko2IF^T={38W8F~3RX-q>)V~_Q?Z(1OAVf3n+3z; zyXn)f6{_0l;fuqo4 at c-rsyvtADkg3nxt2=X%Ts~4Vu0>Nfot1saj(nrJasxx zGkwJTvp>DxL}_WCia%$b6XlKvZ@}U>(;e7iM9rw==n2Al<4nW15x7R{n1l3xs`q-C zSiTd7p_o_}S-e>_5HhWxP>`FlQ2sqO2;&9nnCePD&nm$Po70JXH*R{=p-AoSvAq;Q#4(>}!QPo(Bp5S|cCGdcOl^o_asv2&xC5Uu6KEe(9*bn7`zzsK3jzU3X;7rC04ipQsq?sIO zPmP4xC{zn$rk)8p4H1jAM&yjtLn!4KgfnBR-n5Pl5_P#A=qmyx->%ZSiJBy`@;PHF z-txI3Y4Zh?3(}RG8d&?2+&u8f* zFOmZHvDiUN-$)GxrWMS$@ZrgjHdc~|a?Q-TUq+DzL>RFQ6s^x!pT=4weY9B6#Njr$ z7%N)ku$_?wXiQ|(pYCG6!jm56G-S4D!`4KfYYL6 at 8IWXX%n3ZRz%e+wi-Ng=AM*@E z?qtK-FB|=YVya$5fVC_HqCqcoVYraDf-PD!c>^svd?~PSp)PLLVa18pLxj8t7Uh%< zrx)fBeal6!UF4nTMK|GUc{3rxHfJG8Xl|h4L|a6d!hWNFs<~sB5YjTO^x0jBPB?8i zeYN&|uTG~C1HXllXc5+Y5pxGU5FB2|h!jD_!bEADZ5XUBf!vti$he3O55I>|L%QpT zrwR{BOBzGAV;V0UZX`uh<@1qxNx&EDQ*_v*5ef=muK^8?*n!Q&v%z96CWh;(mf^d> zXZNiKeHu%|m}ixGUQ0 at kw_37lS#e}8%tq27H!mOAi>;Sp$-aQni&8*Ct$PgIOS`kI z)sG`%bWs$p8UvonpEE8|)hm{7B4$sS!+dFl!tr{h%=eq=B$og at Y4$N7#-ak{NakGB zuG~ukwP`c=!Pjy-7&A2T-V9qk8{+Mwrr~*ifD=N^$PuU!G>h_~b>qpi)7BJ| zVOnl9%+g6`S^OnjAtU`STNRIXDb(>70T!kRx5;`rz*s5dO5=3FbaL$w*~hJ_(U;d- z6B2=_jXTGq! zM at h);eWo#7@>r&SpPytXMi}=^LZV z7)D-UT&keNz+84OfOkL>33HvQg)vj1HdO+RKKD;9DS at 8csu9nxooOazy`j at 3EL~r- zNZ^)4tc|*AwA%uuy_(}+poMH#lUw_lsKlW!gzP~T4q5RTSF}1nwP?KLKx&fX7pK(f zJ{+s@%_XuN6E#kcJ3_J3PBRD;eiHp3S_%>@SSuonNCnMPyFX&t_nhsA5 z3VQTushr^Rlzhd6K|?z1I^`d%SUn|5qRZxQ`mPM%V0U~VkQjrgdURx~PyGPWTN zmdx~)3H4r=%5<%?LDjAuI;zn&Ggp+!m!uf z{%W;VD^!KX7?4ajAmd55HDD+PFbq at w6oR5lZ^mr#DIi+_Y3U(oSjFj)akcNws}&@q5JjDnb)^xmbku~#2}gG$dTJvSmHSC>cy6fflUlQ z9%QIu6pm;A_B5|$>iDT6uKq?BtB=lWeJ)`=WiJSQ7%G9kKMkcnL94}3FfB=4JDTxDa at O*X?#YhYk{IM_Vy6 z&fWK7bToQzwACfRWvZ3|tf at tEhr?kzx8GrWLsHnQh#PCGa&&|}M=D-6)e~E~10(R)>AA&$n-m^C#+70!(T;-Q zt>j1E-Iig`J4o?l2Sue0M$OeI!r1SI4cgKQSyh9g4C3%D6uSn1-wk0uij`P6Dk6qm zJ3;n0>r9`@%F`4L;0;FsPY;?i;Jyxke5%0!yYTn}Z7EZP3GauQ60$#1aY4q*6cXX* z#$Bd=u-2zI!3+?z(c>=O{kP08g02#0-3CvwY%aKcbf+;m*xPuxz(n~D&+$SJTlH{K z*u5fKM>N#||9ILk^UaH=p%18ls6{W(?FVq+Lkx-P?3;982vImur3hdUL6A;ya)7Kd zw2f_(a+n3go&?brCLxu#IppT(w0CW83An`tC}RaDRVrw8t5?@52zj?MI^eS0R5&OC zwj8iU(_RroHUvNuN#7v2?NGunMbIv?Vt{$Vto&ifqzSq+EoQI;SxF;Sm@|N(S_)${ zAzftPrftGfnAKeuV-|BWwyyBDtm^_fVFEm{A|Y&R=1gJC*bYvj#v~|EyOuR{z$mlB z;d~IYZVRs)K6{zC0;>qYUS$5_pcsB_MjXPcbAf$>Zhj9vrDH#%8{`B&M|Bh6hfs$q z&>b>cuJI$xUNu6&opOS}LV(kVVS%kXgkvPpwI#n0E-NV&N}B34ZZLyjAo{sNJEijJ zKzQo)fj6l$@U^;vCx_kr7Xz%f1nt&@a~>p&cOIhTVRT`Q1&bEuFd>dQIrVDJ&?NMb7z?2osf zBtvutTa_(S=C>*zo4sc&95d4q5K1XlXs#@EMX_2|fc5UNjidtQi at Oha;|s(bz*1#t zpU=T&1N1 at S6Ky;l2-JROiTr6nz#l~*d#)?q7kk)Mte8%k-%jf}Vmj&GXI?k%5tqOz zQ-rDVC0pf7wpyPN_~I;ck~EMa?nbpk)})|;QI4N1^y5##4^{5)HH%Tum^=QXxuL3?K8%}V%exKfZn_?IddqgkXT5pp3~}&u4+>})AFwdS9Q-x+T*u5fySoy^=>s>u zGVm2^DU&>bb&X14R6k_$ngyzjU1e at y9qjG#Ek{nD)%|N*hB)FJV4Hl~wQD_tqBByd z^a*1I7gT<2*F{D9)r`{zvCpK5+rsSltFsq=Al+G$9eT~fpv|m#H+k at r+F`=vj{w?L z{ZQ~w9OU3;u-VfsxcW5XJzkh+I1F{s$tGK2#jCLRpmgqsrsvuN&P3di!mS5h6%PFX z%y={!44&bn#hApVAN;}MD}$K>@FXpf<&66$gDFizNem{DsmhFlef}HB#1h0r1}~c4 zIX34*(U*bQX95GGM7nUS3uud^de%iTn7O#;Cq<|jv+oQ#1n&7pBaQy at HX`yBal{LS zk1WTrA5P&;OHpc%BRvWyd>bEFv|T9Cg~1i0MhhCNMhrW`cMrDJy(^@@u2A{u(jOwN zAtGJjYqfh|58C*v8 z*WyZ($8>{J`Y} z<7siZ9-aK!3BTvT+WjQEV6qE0i}c%o(Is7-#AZb)WV4)c1V2WZK+SD*7bAMsRBfoe zls%=FAchLxx%{I zdr(IzAC4NEW&h6)uepa^C$rks2HmJX#_n1N=BXoU+R9sMh~L4mqp^^nkgNq9$ce8%Fc%e( z?IlqNE0h5vq3DvEkVXFCv`CudY0o8n`Ezd|K9eFmOWZlGrAfWd5-y!yq at by`zvP#w zjGu9 at H~9A2yq>F{#`5|;!3|LLC5VpnP+#uFF!jafVsCI8qtJSXVU(-YI#FYXc<{R_MpH~ZeN;Z(ePao8XT5L79LQ at MZ z2be7xVd-v*gChU{1?g~;-?qvw(yin~3;r^mlxbPn#AC6I zS*_EBMVYgeR>{p~?taKxi=7ob%EJ1P*#Ik;lEG55vt_v;)*L6b z+u2v3CX}IK7Z1=Dw8YkyfsTPLHfwJ055u+CQ1X*FWX_diI4erKZ4qQ1o z29aU+mtoOmW5&3o$CA3pOhaSDW at Voo%!QU8yL*D~e at Mp(s8F{-U~B(!xKq zF%?w_BqULN+~_Fs6hk`U3$WSgi8}K6$*S>M+K+avxJJP?3;F0Pz;(Bl*yOo-=>aX$ z6iY@>DZvMR_6#VpciWB=&QF1 at l^8CE&BdEmLL`A4a!ZaXVV)QTFHm=7R4eMG=+dDF zBYVFzG{fAAVMk(5=T{O(q`5hiX8bA(aE7n at f3MW2sIjVkb%f#0Xp!;M?W~SmfF9zQ zQ5 at cYr8B+kAkq-yR1O?4P8$81MKRCZiZAL4m%fJt$>3=V^yM^6M!h*gkp)9)$&FT#aMAgLyg1h%%}S=5`+u>^?MBWdQ$(>=`uXP*sd$Qm~Je zs|+62gN_;1bV>uJc}$tsf=nNoi2W$Y7ADtHUXp4{W+*xn&&OD`?`0^->6h=Pk`DAQQG7%#Xb{%JcMD z>+Xv{VR<#im6=zz0UsmB>Po67Bu(lkzGOWvK=cH1VFDY^3#I8EJYJULO+T+3cNrAb zPRb7g&uENh?ci54cb1fog%%$MSlsRQV!bC34w_)j)PHZMGlAL+x!-lG@$RM!Wu#p# zl3b{kA|%in at u@=EvkI=(fiEiVibmjt=eUTl&CD2j0e&s^SJweS;8!a!q;%V&DK4T> zq-j1jz at i)Ik@#b3an!rgPOz!!J;X78bQg&EP^OhNWq2-I9&H~#nx5}4!uDj@{KmS; zi_M#rpFwMuB&jSmOwD`Ld)9u-b>kKLk-IjrRKi2{({-q*>vY9Pbe^t=P4f3&CPrbq54 at d4vZpq*Q^n+eE*X_m|Mo6A3A4)dhj)S^9#GP zUY;S+%a_X)>G;Qhlg*d!_Ll}Knge2+b<45#h!~_``j8H~>;>L6SRNTmY~hP~ww70j zJO_ks&W>p|eGx_a8-&Eq1?`kbJp{Suhi>79yH~6ckZi&%ws(E~vC)4#8dKN!rIG^! z0ipi*Plp*L+?@YUUWlbB;9nAh5Jfo|5GF()OI!6z^(sBl;$HKGHXuhofTV8-ZjHbgFKP|hPmBI0N|Mm>OkLv}@4ea{k3c49zhd<7;91hC4 zR^NwJoqfsVYeR)Dx&NE9O|R^!n1zqY*|O$w(%PIQ;7Dm8L3~5Bl0fiTH at i$HK#v|Y zwvx;EVcH;$Dkg-PtL^qnq{mHsOhz7ZG_Fm_oduDzT0UZ#muPM}$;#WH91)YwT;+)% zG)PH*f8T3)o}N0C4{wA%CBi9!XaX?lGMSihyrbLUJc?xQxU#G7c@Eov_6d9ie>Ylfb;r~ zRHd-0g{pht|K8I6f9D{oIGURN-v?2Cnwpt9{+D0oU;68xQ-CE!)NC9c1)a^}l4Lha z7*4Q*L2#%-NmVk^Vj$#(MuRg>jHAg0k}>-FV~ThUAfus5n0P at ++E*ZcXeM7o$t5wG zjThWGyt(O)=ej)s-yiKEG;HPVDj|U@%&U_c7?d}fdbD8JIl9(!%)C=>(PLk_mJ%u-AS<_YUBy z(_wH$a9bNgYs%84+D9%fIqECDdJEoMCmc6sPYuf(lco90RMxMeY+U9kZgtRg0noCcd{l?1j8098{7G)+bKyMHNEtVYJ#9M3}i>^3hH+x)N-KG0zO( zW_QPFcDKjv|}QWvsl;k^>$GYxLzY zU%^3Xs8r~U%aXi$@E9GHPS}CYgroYS>RQbvufmS%TES?mC9lBA6qwS%5iFjg*z3g) z5%OW5g(L4;GnoUYic?ug3CY0ia9*lxnFT5 at v>QI=lS%ws;L8HC(AQ?|16T-|!Gp(^ z71JBK%qezFPw86IO_@@PWv?Ynb!x1B15~^)uciMA524)%|FKw9%+sm_nRlOs8oDgc z%&_K*92v<|Xn*t=uv(UoKv7uv6Gnk{HdbLVtsqKg%_?#35pJR$6 at 7az8NQ{7D#sdM z9|I86DsTg;7y+i_BCGi*d9rq1|A&-?d&O^iWI* z$Z at 2`qTO_#{RWdW7#{>8fptEL3S=priP2vZ#LZ!@-v<@T(YBuX4hVrQ8Ftz*H&RXI z0(|yRr~J>XjX7mA4n(AP^9q)yn3McM#s>Ym8V(dji8Onxx*RmmpCpozhdaPn5_Dy& z(R<7=!FG^@@ox&)6Uo@?WbmD4+MACH8L-OcIFdbjL(CV>6|W^gm1o+ugi`y at zTthS_X}QexpyN)`T0-mta_ADT>$#A<8ex zK$DSyYH^$O>FYp++B|G-&tuJ8UDzDVSDIwAToZ;$h)HquNA{nL{VO z>IebrQ?^HRL2II!+DxpcHVnl-?R<0};5&pi90oX;oVOkLp9^#U)g8)%#xRY6pc7kx-h#oY_yw{n8=;pa%=2o zk)ftxFUn+4O>o9?u(5;PPFvQjY*H;z{0wVRzeb$*i36F}a>}S5VzoFkw%o#peFPx1t(#wKS z`)HLVs_&-bc}LU%XsQtytF$9w%zQ$KK2~mZ>g#1{;0rfry07ZefGL)@QnH^sn<)YZ z{*izoCfhbkt`@qRwVlf74{B-3Dt8!V>fQb<>QV>Y5l}s42QW=EuI+sJ2yC0slJEt3 zEeYQ0OcnFGLtsk#$FuSDNWN{wdop~eU-}cTS|c3p)rZ>N6zdGICVM+ntYWjJp_`2y z9L&)H)>&S)UcY3jTm&(*|VmaB7 zYNyAKM7vj`TC}v{3j^MQ= z%Y{Ion&mjssHHvDUGf+=3w83G));m_*it%NV at a>b^wC(NFX;!&-I6k4Ed%BD at zM#5 z{KS?!CoC*2^Da^+M1AyMkMl$1HHWebzC-f_;Vhrq19IUgt{14Ki$N96j1~9cVf~*8 zv=Kgfap`kzcVLhpUn;7qyPU>LUnQDGQKgD^dD2%DE- zujO<-5pnnU*Q|@UVs}M`7>^OC!+*56SJV<$T at r60#{L<)Ndy&ztM<2Jh(rFb#zR?4 zS5q;7v!loVeRtY!NfMPWiGgB3a4Y1Y0TtRr<}j7qR#Q at n>N?dKDwtSkWXMWihXs^m zO}sT|KZc;bFNgvkJ>th9 at cne0aJIv?jWm*DbA+S$>H98=`D_l>+0dnMZ-3*^n3Ig>6Ue z(;6-dqzR#YgRRHbO6-{nuBNHmmeU3&JW5qoZ?apbyafa^ZN*in;6d+>!%Y1pij{Br zcFByHaRyMP^Kq-QltuN|u(z2S-qN+oEr8DuouCYhJiev778;2zK<9NGUYaeyaquEN zPrFf|+=EH=8;EPd>MvSo|S!5T>+Zn-vZ zya at e{A`<;|7XRl}?+!!3jiNmfk?yCLE8_7|eH4nBE{>~%4B?m9z zlj`znbKkpsPt|Etr4olQ&s3dSc0lg?#TkoI*;ad?fXCq=Gh~ZrD+?uy;GpM>I~*RX zZ!bE=8B66Pk6nC`M*O-^E6<{`fMQA5`m46qiWGOoz zOER^jB_Tw6nBE?#To}+~1XcEClgK1Ggq00em}`_2=@}`JStBetqICA56lodf6mjJ@ zq%v)vLb3}#j%}Clr%i#lEZc}IQ{@(HI4O7QND1Z1fMH%;JVb4vmozrA0)>4=o5^dF zruLZ*x-RC=b_3#M0cE$yJ;UUE=bVWw6lEqR+9f6ioep9fxW>v$L*cU+cS||J!Nwbxzd%irZbS{F+gjh69!a^&* zF~e5y1t;$%0^&Ll8wwKr+ahDQ#|+*-__T!~M|=O!-q04BSLcBO0d>IqCl}klRjRz5 z$-g*UkJ{dUd1$`@$Qq5bbcD=C3(_)6h{aH-^>nBORLKU=kf<%HQ;FN5bXmG)ZcD(< zqxS`0B;My$48IFv(MBQ0B*p|L at 3Utb^BGweupaGi;<5?$UamXbUg8A&-q899 at hdDw z>DV_oGq!9>RkH`8BYDzQ6NYfJ;tt1;=s#v?H1=u)VV_ewbEm3HkW!gt%5SEtvU*A-Ksm)%-vAZ9CjE~IjK#w z7bbE$E+sVeDboV0dFPhOZPFJZzsDN)V@@8xy0YmvTqlw(GgED&z?X{uEYid#yU~=I zw=Z6vL>s$sz0 at GbS0fzT?A9N9mvqzTp!w_+=R9}o5~^`K6uH!6J+i|Naw)1~1)P^| zA4HFhLk*WuO=)%+C1f%w^A{EjFiGREx_;vg%&r1Q7I;p^)yc-mF at j@PY&R-3I at cX4 zX3mh>u8`TWsed8SK827SS|p!T9$*g}DY-p0J{7Z=YPObnEpwAzap at OcH{%0J&uB^~ znlpqO>C`rK;tUWKMtM&~${p zfx7v+{oXsRUGbRr<4(91Vi&QgZNx&CT*(zSc<8IIGID3<_c?M;j8IP8cI*ivuj-?! zNcb`e&Cz?dV>ISCXK~r69iYJGA2El% zv3B<-g3B`&9l*fu9TtJJo(Frs?5{AyLqJ1iMHQ0t)T0R&9Fs~0O>E(Z41l2E9bXd& z)Y5sydck+oUenFcb2b at hjTE;>Xhvl>F?5=wQk`7v!%BML;#R_m8FKmqoVOk{!lsu^ zf7m!cJo>Q2 at -*4y&Q0-LVrEHigK6e4aNs3v at Z7w0Kv-S}-f+%VpWMaLbR{xj=m+#*hU4o>Q5+k%jF0EZ>M5Cv-E z^4#%;98X^n at aH1F+;0Tuk>~mOFI?#>ui?TE3t1Ndy!Eg`w~_T;VOq2zmnH1FtW`at z_eA0%_b?j at bEGW`WS(=xu6EMi!SGk?+eN>j6==@5mruJOrKkNLM28zCJfhjulnSD{CWD&U#zVofpPIKA~4i!f==W;VmG*%l3$|P zzM`Mz<$VPilG0k1VO0~49~K at +i7Hr?ui$)#+Ibpf2z*G0mqeNB-W6D#r$e%!^O_H= znzeew0=4)GzujOO!p5ikP~D}e`5$3a&?3SnM?_8z0~{j|#d%ez at XJ+HNtZT7_d-R0 zUBCzK;bgxc_5xry9{%#CLe*oq_DL}+cT5t)ddQ$61}jMLgyYRQ&2jb5T55B&wIG0!1IfJjNctWfFV2`;r2}QJmg=ws6H@*>Rb&sEa07$`bFkGG z6%i;|aDFf%YM_0R5yBMJ07y9apkKI at Uv?qM_!yIL7;6~4R*YI-!awH{3_}=m{~tg= z`QZO6Cd2Zt7YEh3|32H1tgEFS5?Q{lAb5pf80F3gEJbZKjLItPnMa>wI_|o9HH*#Z z{xrvUe<%m9x9rZC`&ATem#RfWX;~Dus)n&_$<;5uYWSSo1^{Fj0u-`F;KXiDmAV zftuY^Ixy^PCro>B2kQJjkXmY=X=1Io%Nyh2t5fjW0pT?dufwHRKB+V*&2Mp~v_9tBmnLNo& z?Xrg*a2GVSN#Rd7FKkN$U^CfVauv31?=2S%9_FBb^2{V{A2bV_Z6ZRW$ugdkCA!I) z!>y!4GOe+wH{npIyw*dhdNkbh?9JLH8COIc>oS-BOce#;%~iko zl6u!pB>MfHyNdf1PZ!N~r<@7Jxj3D{0{4kPNX7_mQ2EZB-#SQ*(S~;%=h5h=6e)=# z$33n_ohWQxeg%@dT$*odV3G~Zl`-drn=`?=QLj{nF+^W$ z206D3=1 at m$rO>RhGf~VK6)}Udo)e+ zrrBv#zkN(-$Excgpi8G#=Pfb-LDHQ2*Qn5lPMHyWQu+^)3Mkn>VpjHj1XLzlGkRmP zox6ewtF&Kdic`*LkWD{F5jB4fVnzQm|3aeZI4kNemV5tqSZ4hnEbl2SDWZPguv1p4 z`j#sLD*-#$2!|D>`;(%u2|-{JdG*n7loWTdUDpIa{2>WnfMDdu%=?SuGuI?pUs~;_ zf}XOnvyWM>y&k@=x63UzASZXDLIg1stZfdZ{^$Tr6mT0K8mx4dyZ(NW&|NYGPpb@~ zoV;3Q6SY9PfqDJ=VvV>!W)kKRsNOeiO%udQFMwVMqs?Qh|)5U`TSqkwAH_osP+S z at jd(0FiWwn)FzrIaPRIf10oCygZAaQD!${&aIE8Ky8x6rwUUW`D++lCP9)(X65UTv z0XQ}zGghEJ5e&sg5D64JYz3`BbRduDvO4v5ka2Xh`{W`GQPQ+JqpC1P*lD*rh|u zenMT5V-{pl{llKXgS~%;_4sjBWz%0+3qt;{V9oZgZM*7!Usi9T(=D%36kI-}AbbvL zL>-AsjwehA)|iJRI&h#oYBcGxb}a+P{{s02@&oG?ER0xy(En5#x`rVW^WF)m{@N))(zB93+M|l!`RmJok&0s{92j;r at HWbR_DG4;qFAv8%w-Ge z#~2FxfaiYFJ+D&Ivoz(f(NGeA^mtq)gh&?#EX_ztLY{p_uT~dqr0!F|ksm$l7ZzAd zy*LZyh_kHcVT;K*q^^0=RsVwLZ8ul-n+@*H#V>TfDciV@*e at fWD9#kD$d#5WZvM0w zMaI-f)e97`Ieo%a>aP+?kvi;N=S!oN7 at f)|8T^ONc;f8eUxJPo;QY2%Lf2ikkE{7T z%Xhpjtfcqf&0731$C_IV;3v&k1df=|w(lchTg9oW921HHSpsv`%#d!Se>$!z?=DQg zrlz~Byv)C!aMbagvH2dY^$J1BR3ScZljiO)C$sP6vL1d}UB+xw<=Hjhi z^0`wyn`vQ-t}7ND4j|uj;wAj({kr*|%AggN&wgxXya($s-lrdk+;F-ae9lcditP|y zqc=xGb%t>lY!&Y_BsQp)_#EjU$cx at dygeS(V3eum>Sgv57~ELlb? zd!T~p*qg#E2VP>;!ZlRU$@pg0*EMt<+G`wdQVD2rE~?lPzTqn%#xs`07qZc?y^q*u z4^m^11E|CGtQ|QYW-1Vz=7|+b&c8lOlK7BIgW%Ei%l9kAfZe%5y}9BgJWt$HBo(H53|!*y%4MP3K}ziy at hX-Egb18? zCElIUvdC(*on^cPFx5K~Y*tj;VwX)jMs$IwY7Kzk~vuixN+%`hnD;;8gcZ~IN} z*3S2%0f$zCveDRF{9H*1UIsSJTO<5{9R%~{?FPvAP1n&&Z1s;rXqb=`cjeMUgQLuD zSEudoYjk~#Moro8kNv_Yu_07>Ye}P at wZE8bEY^qd;HbKBhjifx3}lAbv6n?a*3%4L zSXu82LgVJ=@1XTe+dZehC1!qW?qbq^5XbUk_}+$b3u*112MU0NqIgz~c=f!MoDiFu zEZ7Bl at Fj375E(ouUn1MekDM#6S@(|b`c>3PW!;{Oy2zyG{GwNqk7zm at TmN%B7sFIj zf?h3Igm<%@x|hUqG2PA}ohW<*Q^Xgo(IHtEm$b|-A3&DW$a_wPA|$B>BQ-Y<$Z;jg zT(P;a4sHyC^b_l1EVYale$KviNL|g;5gFl{p7%BsWrm at QF9F{uEEl(+Y4}4N3^~*C zi9(rT^9v{ejf}0vJAzZH at MCGxnDpTa%IKqFjB}<}?9&&ZWf&$Ysi}AK2%#7!O7R?4 zOGhZw>MI)j1sd}eP4x^j+n~=htqFb10Sw%W58$c~M{%%G%TnPZZWIv4)n3agheup)=3kAsvm%+bTfb zf9HSwsXUC3e;sG)WuSrASzUPEQN1YRoFU8a1|l_I(|fUDxd;`3ICBa=FuHf%FYatX zBF#>&J50Hufz^QYn-bCsSbs$O#vAU;GMDHL6zL at qxzO#_ML2ihlAiqgAInwvYbS}G zzyG7);QuMj^4}VXkcr8^_mC8o8F>^X)Ng<`&sWON5=z)os}W`~EkrTe#CY%|axppD z7{j8a3>mEK+4Kt))03=rhlA0W2++eph&v+LPt9|g at H2Uuka{fgB&Rv9m+Z%!zKl9Q z0Y6~Is1wRs5&{ueWhG*1SO-+2^iepXSc*C0UGL{8@>t5j0$My3_J${3=fJ{EEY(=gQvn>GhK+zlgXW$H*yWQ8kt zHvO5;;aMzb!4KxKdsn^BF`XwYyNX^dy<9GQR-=1$v;|#hKK-1+U2z-b7gl5dlYhZM zpS~|l7G2aVxLz7)2AWB%(EY6(&HeffH+G+0I5;dpPws}AekC%1qTb)+2Nf)ZJ-SF> z7l|QLKo=!NykMeXVWC#)wVA5!Tx5soR%J`l3Avrq)HUQ38Pp5rsk{I~C|I8SpNs(W zU&Yk7ZEVZ1N`4C}HEIo39o=NxMby&~bJZ=U1F zH5v=1`-nk$K7%av4yQs9Pb5ZQJi#}U?%v=pm0l>B~B^LS1wet}Dph52>C0_q3VLm~g*O?meZB`2n~Gn~uc zl4u6|PXXfp5UtqSxtjiaRphA1*dhO|3VK;DDpBzDIoO5ZVoZYZ z!5!!J!E?qnSdkjP(Ha~MIh)P)JBU|(S#R2HtU0{%DS)_Uwio`($LuAuzOUaqY<_f? zl>PCjq>c=6z#C~TN!_$CGI%5|2d6ZwrS@}AK2ctH?KUcG^(Z5 at bG9BJfv68KRlAYe zcnzJjT>ErxuWJZlHiS{Q>jqLr5eRLlhBpVbiiu7fWEDalq?SS_&C_t>erVX&Mf4fk za*$|lrMsEB)$A>?AyQUKZH!5vqMb%}7DD0;-gD|PSl6jmM?u+(+z`C&fNy2|?!MYq z_rg*qUaVugU00nVe at D)HUs_2n$9HTEhV3ZaSu;N*lmsrq^1ff#s$N@;G}elqLP^sw zY#=JZLYg<(YZnC(n>ld2V1H54VtFBHtRn&4xj2a{!woo0jb$R`N_E*Dg&xBTJ^7;r zY0FFu(B~30lka>`!ZCM8_rUto8nr#Kg`=jB9_MW+Q+EOy`{emce*@{c%FDNF4=sq} zQKw*RWm<0SVbg2}nj7}Mwq=Adu`WcxieHOLqqt5mkRO>zwn7XzBU+2dx4aLU&x at pDO3 zniN$4BsfzVn?!(;3TM=8a9uMShujYr9i;fsX;dP*`I+(kfN-Teut8tqTp8ktY8si3 zM>r3A9)(e^0{jV`NvUIBoT&?@^$X+oTKp!a4p;tZJ7e*2JLYqKvrN0}`jE5tx*V*! zum at V%MRo}fE)1vG0vD_=RHGc-^FOxoB=e}fl7G=0_8$*A{2Q8;O`S#TTmb)=6#pka z!)(Kp%7#v?#Of{V(n$FzNT9#Z zqimKzYGjn0x$N*@&{OG(6O^=8 zL}!HY;9#g|Gx7~y{y1UYCrC^(F?(&QMrtz;J+2$Swo#!f^xg0n>v^HutG|OFL0>Gr z(|2`k`+PBC%8Pq<(lMZV^6Al9`6l*q=M$Bg0hu&eaUV;?$AyYTxrWk8xdzToxtbDW z{w;AyRQ|zb0U-tN5CF!r;gwiDS|ZnZb79zcy}rhhf1tQ6xnHhi1ZWi}glHyoW%GX`efnNT8hJ{HXIX!d%)7_r&kk7UlOtHJ1XB64ZeQe7%s z|LdG$GXWASuXhu9+n=!+;fup5lwKveBW#2CVJzk at 7VY>GIGi$PWS&W)8ShCXcr3ll z?9SI5|Ae~60M0ZjhSof$)$|97;Os3`rP$1A{EO^I`TL4IRF zK1v(>IyfZ)B63b9EwJ$q;Y00<+M>;t;!9NhPq1$geecH+3}lRGgujG8`F^_=BsnBenIzt8UzRB3qst2M+W z>|;X|cFZDtkj_hHwxRQo>su4REAC_KG*^Ve7$?`1o2S$+%Ey^9Y8BJbWzKdp;JTx< z3GH{!1>3bc`wP}n=%r)dO?nPI#obXl92z}g2^7Wm&DqyLewn!Jcgrxta2 z?z>HI>tC1yUU&sMX-e51AQccPA`_cA?#&%96K!C{pOkwVpm5YYmJH58ns^oq_X6c0K?(~kL(0cK`CMjN zUl7<9A$oBna2l*RMAs#QX}YkWL}NKnB<_mg8TP8I7C(}r48Erywag)H4)o9=i{V9N znk%A~`DY-gbNcY81sV|0sMLSbApbwn{;w^nHk3E6DVm>MIT0Ck1Aw+G6Tzs6bA60 z9&P=-uwPo4Eg4?qQysDbg?L3qSxjN6*24^a at s;Wc+8(pY1DT?ok_>ivOtvfff25)h z>B at F$4>aA`Uz|y01A0sM*Y3sf9h9MVWrv-;q5|6vIZ(Ud`X*+snSEtO?Jx#nK0o2XZifSi zIr|{#4?nszMt8Qihh}=Vx5sAi0nd(3C>$?Nk3bwB?HhA5gd7NtkBA&1+umVWdI0>? zdn7Po_r&Np>iV2I2-NWV-(8R_nZyTzjQG*PJ_Yi0yQosZM>Pq8_ST9~#O1s88d2;a z-VN#KBA6W6MzUe67#js8_{prGKPGsv2#SPiA{2QsmuQ1 at Y!m#+kB%Tm=mzk#oH+4! z(YbsO8+HZ at XA0jK?W?rr>t}j}UBDaOtO)>Y zT8ue+wy|m_RN7u&W-4g!%`dO)HeeMn^I)I$?4HF*6m~^u<{2M~fcWajMuGbj0O+ub z$Q%RR at P6RSd<$2RqrZe4?er=N(|~>vEIR(mUqQNB>OR05(5R;~8uuIQlT!dkf*w02(wDW#y^11g2x;!OX4sO(x7L6tK}CNjwRE`7FWa zDY!~oXJ5|g;Kr7418J-sXjntHuvR4263fR+o+f1IZ;&9J8-$F{Ne2b zUm+r`nHjEeM?35JnXN-4+ZZIJp<{?tm+)<-sSa{xF4wEk?UAN`c?Ky&YpxB+sb>=n zI&@s3hO8;0)hf8&zmpaoC09Hn-mBcg+{6dmT|PJcrFJqC{wV}RdWQ!UyPtbCAy^fX z{)p&Qk500>VZO?(6Yu04E*jJ$G?_&8>l9hT%7*pA0Y1m$IE at 0_QHjxy>2fj$0dIit ziUh1z(EsShe(mw$GBJEFFFev+*c#;`V%l+p$4v#5h*gZKNU%Zwm!91SdhVEFKOr@= zHBXZ6fE;47;&;o8BneVwBRQ|hSPYd_<0uJN{23Bv)8ljKRuM4WB=G}uXCeAxJMLp9 zPl0pd#+n|rc{J{DF7567RA6fp$Cw9un!S1QE zb}|_XsGYkmqcpF at 8{w-&MNc*Rg!~2;ti^8oi;6>EdMoc5Sy z%XT%AUWQoKpofZ=a};_BtbM|gm6*Z~b$P9Ra#EOT<2V_Y)BzK%g)H;VG)6TC!$fyn zBrXe8tKw47*()jj6q_VY;I*zh2amB`&oCD$KMfJV|XY&k2-_7i8|ZU`^L=tLN4seYoH`-LlqI} z^Z}%yni-hg2hNZzjooSYQk7;)rkcCTJt>>4$}l`1&9G6LWDTMUR(HSOMkoGAxTm<% z9hxz5xNOrBVO&%ELa!Zq5=+tjc+w4qLB;Ro$7CDB2>aQcT$73ssnqUbMZC}gE{11O z=G%-CH-9xBJfEu%piBN;CfhKBu~ka&qqF52N}rNl_RB)q8sCy;(FoPjf zbz)F?Poq20CSGOG{6hLlcZjwc5Jq0F!uXkciw~z>anQyN+_ChP?o~f)py&2)O}yns z*6!iZ_Kr_qUeSd^TuMTJ|Jo|w_%d>o>!tn<5FaqUYmfF*xmS2K59SUVZS-a!4LaHa zh4A&SpT4&#@$<8B=A at r;QwY6>AA}Ce4uu=*>$hh9RvmFW&_(lwFxluk*h8AkLFcCK z9V6Kbb!&u|77^k>V!V6FL8vf(M^O2U$2%l=RY3bA#t+3YC`auZ{73Cx;8kA_1fl$u zX-8V{QdwB5A`vvM+ at 8u?Eo7>_1DBsc2CVY9 at FY-GgH9%dI#mjwnW$PJNu5e2mLmOn z;;bi*a_#t9eYwPMUy(>1lTgx7$tsUsCyi3fjD|3_K|MRrK}|pGh(^<1aXdOC2e(?; z9^QXsRITg)MX&0BMX&Ba#!*!skaiB%-EVj45aXmx?;zi~%yrRN+`xR;=yZnreZOOg z$=WwPwK!ZIzJ!7m+(>F<*G0xWGYk25B6#(b at 1Z4il1L>=4IMWzxsS<1FvKvCt4k!Y z7~?WBsXT at tnPjMxkkqp2tFxWx1rbg`z%Wf+*ONEr^u$n6n_ij|F)uJE%LxQ{`LcXcf}CnXj at T($z*zbb!+&_a z#x5=_q{X?gk;-C0|YK7RB#=`PhUFT0U6duSYK^ryE4N3W7gI78QCPPUW%g%n9v>-_`V zIf%^HAf=WFCn0rjh-*u`Z3gG=kHRSoG$QL=dsx2Xn--j+Oo5Eh5e-U)mrx5k;Xl+D z)O&+t$eKQUH4hKmHQne at kFj#ISZCuNvWg0)(~lKbRQ!3uNu6{vmtB;Cc5=E|JLWaXgQ$qech#OdDcu8aQRg1B@==ZuzdF@#Gk!5k-{4}vbZSUhb?3xOGQ#P|_;+z(j zvzhbhZ2q~7X^||a%Mq5!?2jg#Z{rjTOX9p>r?;S;o_MKFrn|hW5G{z-Xcz*(@?Bd- zs>;RRzlY+8n{s=!QgY1?X7u$RFvTOBX~XzpXqjsT78z!%f0hEK$Cfi7ZZx5DNntc# z0q5Yspt^O(K}^5&fq;;8BwzmapVKcg#vE(M$8RTRKh04-)nBJy80X(n_F%tzNpI?c ztIoBAZ|h3?tc~pHs{M`l6^qi=ma0hd1wUt7Odz+jAcS at i#9kh- at V!&CICOzyS={#s z!F^-E at A?6q4_g;03WM#-`&%yZDd2fOVDgj?F8j~0j8O9==YO9zQ?$*irn%5~2h}n! zR&A9J1@>7I!q2N78U`tDA6DRknkG?@Sw+v65$M$8p at u^zB)NFDbpR_0(ve<;73vag%lxR`yiWpF?)o^lL%3pFCl5ym zN>{tsK(Hz?N0cTY#1dgNd-TQp0BXNs5tAbf20BCTddyG8HK*>7mmabV)wpT!sKJ(J z0Xn}0FtK&(3wreXI|A!&_?o8V`Y_7p8&ayW6Veka>&g<+7ktQog>SqoqKIZ3Y;12y zG$;Be6=E}1(6d(16H()>`&vO92!X6Ki4Isv=E`>I1DO0xCR6u`FqvWV=lqk|LG}us z4c&ux8DGMgKv<}6A=daY{eZ}u=W){(Y>DK?hK15u4I))RsouCel%=0wMVz6cN!ak^ zn!aE~n!j)S?+R~Y$-Nz=Uz24I+>ole5QJa<_G-g5gm8wr)1SF_6*aU?Rs^zL at Mfwv zMI||+tVLFcX2|uezl8b&0t3|U^Dr+0usLBX^R;x|e3_<^U%Xe881lhjkF5ZX&G*4Z zL^A-i8C$rSpL8=zMwxNknFy;EbV_uj5P$G5lmx#VU-^|JMJbeSp{y=NZ>0)$emae& z4Jw~TH^p7>!l(1*vR`aqTP}zlE?M$b8xm2Sl$wvJH-Nwn9yn+4K{{=&~>POpRB)|_6o1utC>iayJ;ZCX3+wTQH5vWG5&`;A!%6b8KqTOxxw`r{~P zzt@|AfEn3%^fZ9PZo@<=7RJE~zo7236kI>4KBEN*B#M0H*=bPGCGRmAJ$P*&+*gn9 zvnP%`lE#1!3+fW}A$ibbLUY`;-GTL3b|f`1dx=8}2LB`63eSm+Td_$(kx at Rok#8=G~!$h at W?NjTp=r(-j( zESYJ1u>IC!F5nkY+)!8d%ncq41cp%w-5vF>3RzRAti}(-#vwclK5tBZ%7zV#!ur2Bd*>iepD#PhG8lw*#ihlv&~1BzA*=dF%q2|9uu z@=}TlOog?fP zN8BL~$JfX~U`V6pVW!IX z7sB5fD5kridgM1O&@=D+N`8L3RJ2UyJjokwi$k~08{*c~oQ#B`?iCQJ;W7*zJ%0QX=EVJZWh9~1g6`KQ{c_%ZY+`-j;e z>RW=qt*&?t9l9$>wML5uaahy^J# zHH4$e{rXXt732ix3h*4SshQdJRtR at APC=J4ygvT9fj(8beth#rpx zrR1>1lXnbhnAKV_21aMi)HSa^ETE at uI4iX5vyH?IdbQ3;D8LF z5(DX4%y7EjW~;9`@g3xIKFI&Nrx1KGDRoA{Xay98AQiD+G_=S<%SD;Vv0*EKty#iuns zjcv}{flapmV}1G&vLT<|EM{aj&kY6-hWo5flK~CwX9;fd{on8!`T~Ung}m at Hps%>f-|prxbuJq1L~LmP7r^4Q~}2=%!{N|y8{0kbj~oYJGn zi~B&P6i at _`V#&9bCrQgx1A)>-id4{osnhrOUbpD@~km+tT1Zxe#PeGq!+J zPLUi2pqg~sYm}*nHMrd-fs%JKNjJ&np_i&`c}xDfw at 8S)i3=Hj$i>v-rR&DXZRSR2 zm`1Jt8E%1et|_(uiBzBsG0?|0^jjZ;nfwr*G|uA}NYbGJAg9U&$*t-P+%i?nTRuIq z`m2!UrXPVY=Y}DoXk3J8>*P&B7Ki7)Hg*Kh(w=8=?#Ui?hazIRz z6P#blqwJN(BqY-AX)Viw5T=XZw`-FPorl at pVXfGAi7Y?OgO4&+eZ}MQTt4?rVpAA2 zum6V6J!;iEZpzGSru5>9Ib1DNoF{#Yu1=`@L5gxNnM|Q0@)(1g`S9f07QI2<^se62 z-lY>qN3U*aOQ6X&D?mL`MZR`Nfj4SP2hs|4H>))zuCg`9>t>fOb<{F(rhmuufY4Us z5C4Bf&w03Nn=&vEkjsCou=)Q%&wmt17bi>FEeN2Dd at qnWAn9NM>(19EBN0eSH_SRp zs+3D9t5DiYE_GbMmM0h$-hnQHAfeNFW5sKbz!)2}x-^3X{e>o(&^Uo&2od}f)+VF07H^kJe|r4HyfYnSTaV3)F4?6a=0 zTp|l=oOhMNmKk97=Hqk1qoZ!z^2lZ4?rbZILi>3vj=g4e6MuKw3~75GMY at GzP+&IC zXHY93|A}6#E- at Ny&c}e}lbIMV`g6*Ml@*3 zK7^D4@}P=bU^NNO;hgOO=B^Le8cz_%-Lo4!&RD{Y5bkkcSbt)1hFmuDIr)CILAh-8 zBPF0X<*6-dF}$N*K44rAfa%x+qhIc&o at ER`$5cu@)t;p5`% zlCGys4tqIXlMwE8sqEFYMn0!I10ZthOK%Yw6PLqrMV_?=kV%Ap-Zw;e1>F9_9LEHc z;==1MNC7DST{Z6i8L0muCRM*sM;1r*`l-m at T-vhzW|cLk9?4kC;O=?v zaJ%keetr0@?*}m(h40I-4I0i_KI9!jve6;6cwZ(* zb+PTvxnDtP5)m;vK65s^WQtTHJXBJ)m at dJZD(`PRR>!Bs#J)ks0W zCErNP-%KNm^w(GTulfjQrr}3Q&eZ&j;c&DxIa3vmuXyp`}tDj9$ z)VHgcwkEBPqKemxoGYDau+iSE-zCQ{wat#Ln)IL17wosDs+oDjKmT^prX)u at QrjZc zm0l+tRc?_W)f^GUasS~pZYU^jWDakiQ*cC}lC%T538|otrqiujZP zW(udi!w`>;B5n1^T6n)*pw0D>FF(0hWs=2`LZY>du96b8F0ODz1!jGLITh-VE&7t9 z8Uc&v62nAwpW9QEyLLafySfliSLYd`gLJ=_d)|4Wc0lSasH>zq5;HJchYo}@rJ83{ z(=#;C%4a~Z83X0MFckit5mer8bGSSh=s27h6up5`zga8oo|8A>zBH8no)y$izHom_ zEAbwk-IIY;bX)Y+fe>m++fh*o-d$kTFX?v%Uxpo$^{Xa_f5t;Zt131=zb zAHQB%l8}L)QYR}W;i2cA49nBA4GWaHqO6j&U4f+TJka#hXQLyW`-ADHOW|Aky%`i< zts?pLv7#iLdY`u8ioJC62v&giT0n>Aq;dD0Q|5MPJf!8Z?Rm_XylIz*sLHGi+)Hki_ zj`!=B&$8k4&ti~0Z{vo1xQ=jA)5tQ=NTR~FR$RmKwZ at V-aRp8D6Y`_U+9S}uuyyN+ zc{S_F`*{6`5TC>qAq1xkhtBXjb|-W2HFYpwHpmri;1ikvjPW1<+jEpm7x at FMDWq1I zvzAq~mer$Her|ICqZWXE7Ufk#+Zxy|ae_ti!)>>;PwWSR;x{pmkXn|@F>x?QrW27( z^Dq|6LJo7f+uyFO)m51j(TF+A;dsA3SrjB7_8WpGmYc at +SFX6OelGnJ2hDKD@~i+t zHLEpJZRD_n)|$-Dvtz4GsW%Xrq;j&MJ2WkatOLL7W+lxSmi9=U~wPQ=Tn4vnh1LKFW1T;ReCg zwc0 at XS#1UjuTl&!OP?+RuklMx at zw}-CgZ}FM_y3LBzD-MW*tX%HhYB7?CR3NHMh|% zcA;#Y%xxUx3&n9%tUTw}O}}A%V2LUVdVQyoAS0)&(_?mh0y<<^gI!6qU4-+O;1>a| z_RN+z%#pAefKP{5oaW?ExWS1i=J31A<8}5j8$^HOB;7T1y#YQT+j4ola;;ftqefj} zYMKS7P>9n=pL)%*Ij~u1Rrg4xA(ZgT)-}M(Th|^18EwYNeeP1fe}b*w1kGf!4 zxtvSsf^?(GuUhT-AF3ksw6aj at zpP#FFZZJUzlJj*r+)~CQWRw6ff-S z4{47KR$hKIPPIB=UVNis>pvCD*E zIND|5D;nUHd6f_~M2g^44F(rK=+d#E1&`nC8 at H32f$(AAkz26c;(;}$TufxQmC}vP|9q?jjhk4!f88zmB;|RG3cn-|+ at O0s%4ncVjMT`|lR03IJ#G z|1|4T-H_W5K;+E|291V6(emsO(mnx})AA&SEEg3eDE@(pQXV&~8B#nPWv$%j#9!1S zpr3D9Tru-mR?*NL0W1_l3`Us?aGlOxYbe~}_w)MzR_N;t6`VAeFk*vHUaJqqp*nwH z2{YrIJi5&$>>$wjNyAhW;~hlUK$4XWXe86o+u7OL-!5r7QZVi$vzf5a$W{0r>659Y z^#*4+t*n{oA|1K+kxNjTO6 at R}9#0*Rb#yD19(HKOO}G0rSkisS+|+IfygHLg0fgg& zZvF{z#)OX5u#*E$wvY4NcZWf969@ z?Q_a&%jKeA`m$K8mlw)ea!I7nQ3pMsXEX9ZhOIt&}^bS0 at Jxz0MHnr)&Vdi&Qr}=;kwzY zj|2;$CGJSW8l4QC4R02}4}^zTG=Y#3_q`6SNl{ERx82C6O|S^+C&?HGLY=Q{c|L*9 zuq%|fnZ)A-5_B=PGJ?g?Et43W zZ7a1H5^y1-Ag*W-$|=vW3fZ?Sk{%h=)1jUhw_2GmTRyPY9Y|8hli4f{@HU5`NSs2f z37!Dp6&|Si1^x4oU}$i*arEzY^9B4bLjOO~yBMWD+XVqcp9>BLLs%DWb79I~#bhp2 z!C>l$5EYAl#=0fru6;EWMu9Irz+2>+@ zA+m^YgUz~w;y*|@eC6O$3DRUbGZiYqtxoZs+=XA1A^(+?5vZDYbL5i){TZ2-1W}T> z$mKz#ns9Ugq9~_wZm`j(i@*)Z!?Nqy8kQQS8w`u>hyE}t76pjoibb0ek2)^=+xVA) z#9<9?Jw50iyAMSPp~1gf1pJ(ZRAKi_Ffp6IJzN-H*D=$WiI<=^M(+Gz%tKu_&)_j# z>0H(nxuzWHPN<7<)%BlqdobR#A3e_>Gt+lim|1`BQQwa0laeSFKtlHT=lD7C_q~~S zkDIN!e)C?YIcX4U#I%zFr-K2G~<=MlkR;Yh at cM74j zK{AqU^m)wrX}0Jm;NyD(JCFzi!zj+deZ$@JxDVTmLAt9^Y46;! zhrBu;ry5&TR`XI8>jvT60aH@@t|%;MpHJ*8WbU8rS4G2HR7R)S^|+Ob8rcn1QE79#=DPEaxsv{fXHY4!x zmbcoig^tZo=xq88U&vKj3JpG*G95L0A>FA{ovhe^WW&>g5o|dFdM$G69n+Y&%-l9} zuvGSA4qF2%lG)qcMa_rKHXRlt!@9+?m14>wRSV1VpBlxc6r7txHf}T%w1}tRtP@#^ zve`8(JTs2KaOl?&Zykb at t~2-8F75F(8QsBEdkM0f!YHzwkv-lm(>o5MW;fNtON6I- zwaMll-Dg!BE6~A(3v^~`RH-*7VWFWcB&ka#8Ush)?>sh{%=}eiM0FqOI(R39EvSlc z8FNy+LNUg9=AK5<4U}kuIxfuse0RRy{Io3rJu_p}01?m|VpsrmSj%HXX>mplPBucV0>NH?% zT)r_oMGl%Hc6V(0Us}ta)NMvR$2UMO;=GmnT&mm^MSA6$DQVKS1TWR`R8&9mi^NEis&aCt0+%Mh9K*x2Ed at kDi?bvWv zIK`CkRlcliHhFI}RNQ4xBkE)Eg}%5fPs9zPw42nndFhrU=$rU#lF!a~6~1;`rA_iZ zTR?IW(vOo4naGK%GGCw;}i{A9B^%Bu+``I zd_c~ULINsBVKG+nBQlGW8e|#y1Ov#+_bIOj%aF*9C{4WC`2>Xrjh*+CUQl9i2wX}X zWn0BsLubS!VQ}AA{DM_1k;1-uS%;d;VPW-zmnk~qHakvRgSY#466CsqR2=PHoG@|O z^O;xQ`C5 at W)~W~dOc(P2p~LBU!sDvMD$oBY8JH93+g*Jk at xLbEJV_dTtVcSec&rmh>>?u!_$v4bpjT+(1l5U8s3u+V>U zzCQ}>adoMOo%eVT!F}UwjMu){i(U`&HeDxDak!Tw8}jM`$+*p(xpPg%;|%D at F#k9? z12R?V8P}O~xkD*&)G-s3Y)6DE+ at Yi{OE&q=u}v?GkN)=W<~GM?3fwH?M&@w z85Gr*Dt_B7$@>TYL)CriB%)2tJL_jvp4-yZ40}+kar-hRZ0u<^QZ;q&wbAV1{*+&b zIWfu47&2QyX+;lS7`G#Q;nBQP?i@%5j0RB3dSU1KbeH4yMbF5n>mJU-s)uI8_uuR&SnJIJP4)hxXi7;$a;E ztuH!7rPFSLbIo>&GKoe-BF1(} zIw%{h%g6__a3%DIa;1NgePZIO*W!6RE2yW>FIKo&S%J=mC0n7=V>*azb78{=) z`2C|4HW_skgXb at Ui~q~u`2U+19L!v-0gjS3HZINpLu(URfIW$fg{_r|@&9g1sPu11 zB%;rek$N{u-;Dd8d((4Md1f7 zJ5#+KmWQ{e58z$U4Z3Ar6&-5^)9vph at 3TZM$_ZRdPlUIZw9FcWYC`T_uM9-s zJHL=>zLMSykSba7JawGYZbBtllGUXaM!BU+xN at I5R*gA6AM6;C(S6!h4a?~6hV36K z-7utfRB-$WMagBc2bmh#?J4yNC_- at VgW*kJg3ma$`_ExlC_q$9w at i$4cvMvsogHuf z>%??;_s)s_os?hTKtLk@^2Es5*{Ya0+E~~EtpB&!saCm?`!@%W1^IVE0xE(Ru)s!9 zozHS at Y{{Uy0z+WgZ~2KL_{-_UD_h~6KDS#`mbvto0f^gzXgAl3l9XYAiMR}}lj|I( z8D3`Y9^da5s9nzHdWl^{aEGeWJC2ws7HC)~(rKPh9o-6KhsH{tmYMk9l%$&#Lmj$v zCJYxgBWzr;3w6PQHCGf&sif<<4g_4?LtB|P?|62a`?&nN`29?nOkwqfttTCU1zem; zZFOdBnWiC#$|mJS>Hu at p^O4RGxTwn5yKWa5hU4_n!^;iQFG zqv35}JT&)TY?pHl?Tiy76P41I?+!|7?jd{%S$3G5=MhG`h3qTM;q3>O0`S at Hk|Dac z*k|1~wFu~i|F#;g<4Ej5IogT1Pb>VuISRv3Ked8(gMf82FK$RG{vGZUTUH!sz at MLt zfDE3DCQj6D4(Sya9=z?t19>T21s}gWs#nM;KS#nAFK1Fd4PKr0&kPVCRBT1`7pAUY zKtO{3GED!E7~S}{lrYC-KD~&t3#hnQN1Bk1eSnxFCb)t?R5of+%y*}iy5Y*R#qqN2 z^+)^*l<$w+c=uh97mC3un<|Y6MAFgw>6goljE0d^zmJb6Tp&Gv)gUD6%vzIv5M(^0 zGM2VO#VCP+^W0g&Ca{$5&t|{=&e05!W?kSTU6)Bn8rL>s2!~lSK-?1;5w-4-;@*7x z#R)8p_|1!duTWgbk2IA=6O>rUMQ){fd-d5q|Gg)<73F{{>LVCaBP at ytLC9eb0f?&ND8A_jO}+$JL#=-kUsV5HG02enT$e~chB_ at hk*L5}Z#i0 at lb zs)`WTkaXwA46Zw69q0QX!W3W|9+e(%S4!S&QEFTuNI6A_0=|!|n}|`v at Vo~8VC!co zJ9tH@{u)MoY}H at wfUcNTFhYA zCM<0YYD~{++jB>_DQLHQ(U(J1vD~&JJZNYRx2lzY{=>Ge9=_(_<1YZc|0bL~|1tpo z9eB$B>l!adRZTB!H7s~T&_b%3N(`ghqgQxgLr(2ca>o#%X+$W?V;C~90Ypu12mM1S z at RsZ22huD%EW?nSB8>Cp$Lz7IL{f}lYV907eW_|Qr3ICtyk*&~TvH4v^-+REfWk41 zHt0 at cRhD5>@(#*!JC3QjE}d~(!d@!fySU_#ZxK2sFieTfRSi^@V24#^e`7|?veZk)n%T7IhBz4R_S7q0PDWSHrx3puKtOQ4@!BA%}LU08{36@ zmBSyx)$!>l=;L*TJk`b*V*SM;Jm+JS+=kQxF^R-?8HUc;Y%PvTYk0r0&dgP=N5l^? zw2o<_ZrVF at 9^6y)GP$(b4id7y!br%iLZ|bKcr$RN$zH)$ph>Bz(Of)yxA1 at w#-OQ& zS!D={3!p6E{>-Xu8k;|q)c~-Vu}m3D_s~pLCaqdy^g`>-I|~d0Cbg=8VDBOgBoT9` zA`KanWyn-%5`Ug{^P*{syN;=QJF!!BB9rePs>0a0zob`f+e>*e5pz07A`U#+4^C9^ zjg*7vwe(wg`j_B)^t|2xfRW{;HuJUFZv9UB88n+9PYZ86tk6p zf@|eGH=}sL<9S9~hd@!NfD_{rSRdwoNt~Q=D*Xb!Q;@pH`cZi|V;-lhp0d at 8r*Z^_ zveRw1L%JHF<>?m`c_Xq9A^1_mzeyivo;+ at KIs&HS*xMnIIx!t8rh8x5D%8gG%7;Zg z({nzJ(DvYkGkGrtZa);FyqvATS<75mYw7P?Ab*%o5TD zCmVt_qwFInZ(pbq1s`UjiGNS3+HtQRp|&$8m at puKsa0YpcfseTjnl{Tcp@(@4=9=t zd5~h?Py+Plpa#&7=rDr4#9lHI8E~kKM0?SG*dTRvHq3o#59K&?nTGs34q2Cl{Co=@ zyOEm*AxY(`=$f>@e|q4SJVhdGAWDl7sawx6pklOEerd>*C0$Y;$zP0BkzIX`#vyFSlB4u9k37SpsaxazMQpxF zQl|v%^rienn?YEPtIbpaNUKs? z946r?)3LqsFb_B>4TE$0?HEVI0xYsPV@A)GVs2i=+7oSqgj8 zVh){dxF0u0=o#_1-{V3UsRTY at sOuhkB<#!Q=DY36)lEH4Bx{uyrf z!n&5*F0#cacr0y7;GME at xAE5iInVQQ;{up20S`66S*14jbyX7=Zgze`w(gOiK7w-kBW^WQE&rwmPA8N~{3XS(juji^9;=pdpD9VHeR zHZs4>?+XWa`a at f*U44tdyQ3ifUVM}6E?_}n2~W4SEHhWPjA7!W7-g1a7U^cA6F%%Ui>y3ko5yN at ma;LYGOp2l+7JG8nb}_hun2C>m)>az*h~f$@ zxWEV~FN_ThCB>Dm{RL1RQLa+VD3WF$kgAYnq$wpd#&DhCrNLaHW_n}09jJLHFLeahv5FLy8 at ngfX@XfckzDq#7 z;CCroNtN;vIe9OGt&Y-bdU2&xp>|YEOt}l(=S%o{A?k(Q9}}9 zD5o?8%__?)F{zGvC)lV4_e;WOQDn%x1^JN2y5U=Y6qIQGbiCQj;5^x6X5Qle_RRs& z=tYJiswdhXl}sNPz&IuiCgcw46gdjPKr?cmM4W$R4AQB|XxCw%YA+d0J}(gzTu9EO z?NK?GjnO96wOjA3pzQc)?IpObbP3v!l?G_QH+Q6Sm!Ysh5o at WyEo~cXOoATHsA2SP z91|wQC94X1Y%f+uy6nm at N2g3-tx#<$<<#lJZrm(^E2_0Ft58TL!wT0mvu>Mn45SzU z&*Q=VVOW!Ob=)MPfeqGptk#4%4ZkVBkQV-w`6!TS9z;~P8QO2Q;3PAn at AEb}JuY~g zzWQ}|Lx@`$z~00az9KVlTp at TYXFM+cL7c{FyLi-f{?mrmcxM){x>-Tp>}2Tk04v#a z7pUDVbzLz|-a@#}EE%{tB&)r22wyxCnG)lhJ|(@_^11N at U18BUDE)4_P(dlLdO}i4 zfBT*=klf3ViWJX)GT;bItx+1qGFo1WjL!!`Y4ZPwI1h7D)2z?d6?dVpc+j9AV z$vJ4nT0AFl^6-ig2`l^v%TE!;9cq)qa2kOBxZyuj927fkMNFW7 at tK;voK&54j)u7m zp%$q5W`%l&pAJ}TLqkDkL5dei-e(Y_z%Qbac8y7- at 0B0Mm9OkGONqa(?2}~KGAb+oC-)|` z((@W+PH*V|mn_02Nn~>vcc;kqvsbss=T>$HiEuNDYl%?f6q&|dqfq;Bh!@{#VkGiV z?&rlBz9084k&pdPeXUWqT|T^4#vrIjW|g>wmUrmvnbv3R;yW#sw|_WtWsP9+;lls{ zIpP8VG5 at Oz=s#qMnic{$N0`3gu5JdJNQtcx*aUs?BK0Ji`A}4d$;1&P!Gr#*@oKoP zuXI$-Z=Ai at pS6 z>kkGQa?!+kmjgvr$Izeb5uy^?@Wpxzi!4Xf~64bfO&a^uq&9vR|bmz{@v2VKn*g;vai`cS@ z8gUyu=%CV5x#I<^v87F%M~3FHDJdV(Cek7zEUCGA>yzUxC$MYCh}ItHr{l$Am7yg{ zLqTyFoTQWny9!?CiDX8b|Z&&Xc z?AobCslo48Fz}P1wL at AAhGdfLlQF;g#F{AzM&M}Yt4EM^x;m>TiB4W~<=QV^ z4fo3N(kx)*n=$659JLM4SXzD6z_zmP{@UxSrlF65d+B1)us>!;(_jf>iur6Ofd$JbUAY- zP>f;FTHDDQT?V!~WQufC(1Jlb^lZ`%?^&CueC+(I=uxCJLA1#@s5VyV6p?`ry3$hl z2y8*V($U8=kH>WSG1&iwMStd+$^wUY at Bb%qzZAnwrIZw5;4a_s0M zSj{W4D|OrxT1FuzZ(06ZnyZXZ->4nRrt{(FTVnmYeY#pYQRkAp+s2u7MPy2(K at A#M zOc=BCQ30_kBt#rhr%+KkJzNuA)nloRJc3iOn1pYKt_iEzp(!${#)WC8$7+!LYB7Vy zrvmr++0P835Jsj-%#$K5E`;0Gk31){`*$hcqRvUbaf0H6hy}Tmh;Fdoet>;NX4FoW zr5_U1t8P?L%IVWOy@|r- at CtXRsm;U^6-rROqb^RT*mkNMlN#m7EdTnIt<3mpTCJ+s zec(xiT0s9&a>Z5}Eg=#2FdOKg1r-r;)`n??N!8J0pde48rlzV&89u$ZW=zd$mT~L| zUP;DMhK98`sR`0{8TG56LD{r zvmshX4ycAmq^&yzGE)u9yT-)A+Cb4MDPvKr*1us#tqC_+%#wIW(P&-QJm#q zM^o<60!`cTv}dFPkj%s^y|g44+;JmlfknYN83BCEJZizTPh_loIy~|tsK2`){Ce?K zKgNRi59skeQ2mte+z`G3{5)?3HwkGvMMph)6duvuPO^jRu%_r at RX(Do6G??9s0NzH zht|m^R7}UE(HlCuo!@=7%S9vQRLSJbh$^fc5)-O*TXf!5Nwsv at k9gf<9&M?5W1}bow$QbI;n`?NYTQtk|Z~-{tcV&}Hmxn3Fs;N-0Bp#9HO$ zN!&6$8w7n+)(EaPM_jXI4c}Ry>pA_ at Xmb@>pTD77|_ z7=9R{vJ^Ap<$r6{cNp#~?G!xOdNrNS=$(I%u0yd|9e#D?v>OrH9K~r%I?$!D{yhMO;3oGL zN7!;dNY>MHh=C)Xpv(krR=A^2Wk%;$PV9_gXl}g1;nt7Dm+Vl|2ZD7lXSqIBxcT|$m at Hj=LtZM|NHv%g zlWaM*vT*;LFrA1hHvz4jN?Jfq+b6+2%E~ix9P*%x#E!n=k19PT?9T`U2)a!{S66K6ZdLxF}^mCP_xm5zDH^moo{U3g713Vy-+PRx?Kf5r(iY;eaZi+E8Vc3Gb#_!wd4+3wg< z=P;gyo)gx)DHH at Yw30qKt`iPul%swoQ+7#qYsLjBWJMyle@^0+)06^ z0%3W+%Nm__hQhE^-r+O6Udzz$x#P4X?v$0FB=;kkgOsFW7vjS4`?)0Vj+bo;I&wD+ z^H!s)2(e?q--VBmslWelS)OO}mC9J9+#6=c?q%UlO8%Bb>WL-<;t>fJ8@>LSyssGg zZKN at Br)@7&LE7JzED`CvZ#=5Tkfbkh_mEz at O*`QC1LWKk^Gk)ohaTJJ1a|Gt at NTwP z-lkD at ycciMvUKG9g{IDs+R6yE(2z(cDndz;`-k=+f9yOj4b6mS?5|+WBFBE=t^3o3 z#rq7&1U+jQN5?Nc%_SjBFQ2onRA*o>eDP|{6b-%_kqm`>9;!N?EF}7bqlr?5{bkJL z)|53Dornz%L;gI`2-E|qWEfI4r3louWcM7JZzpI{+q6GC9Y`$=95K{)KVn}z0Q%LV zf&0#Fekhg0we6?virG6~kW^G5=y8Tqs41fC_7*5#P$tH7>Qd>JsePq1c|{6s)e3|s zZu`QRlC7IcWn~fD_N!<+#$KsO`_!c+Yxk1VN7=_Z(<~jdliCYw)x65C)tXJ(Zl;&_ z>GC)AYhd%2kXMky)P+N~Cg2?%VBAQ4DEJdXRj_%v>C+}#&%CYb-TbldFLe7E at 0@?x z`q*dEzT(spmuar!Q>H2+zjBQkHHmMB&P)}t at 0QNYWDg2oH~W28`i)jv)~+}HRL#ft zKW at U2-*7vVL4km9{&H at n|0~}XwzIJZI0BsQ9RFRqW?^gg9}4PJZS_qRl#y=$T>v7N z#1EKiuyv(lwRx$gahY~9s3sL^y8Q&jy?&d4^Nio$Q zK8Z5vW1!j^GII4Zd|uyAN7;vYe%~K3y>Kj~uzTIX2#RQReEvVIVTnRzp|oEl`ax7) zbX5nNgK at nl>GN(UN{L)Wy~zYBvfd#k4Pz~!FzES><1*$QS#&AE?gRY;B9|G`7wT1h zoDio(E?EL1Si)?U=F__iwVF+_HmuyhAfLftQ)C8Q)AueJx{Aqmzo8`1ScRQZL1l^x zbIe>p2c?hkJmgYXg}2PFR#Ym-Ex9Dc#!Yjw8672Ox*4unShah-GlZ0}O4epoLu{XA zgTQswFXX~LWv$};W5fc)cT6sC^KI<+R8rS7S}}0r*{2GTx)zgyIQ3P{#Dv$Xcu59A z^dwDV9LL;ed6iidkr9a(R4Q5E9%q)0GEEsSYJV|RZlf at 4M5ruZCUr{u&4bVJR`Mf5 zSK1PUWF6U^NAw*K~9u z|7;jKkCbLZ1AjPbiKLFgVT2xDfI at CkCtI@9mML|`jw%C~u3U+UsYouMLbW=yn~pn@ zr{Oiiif^d9v1k+jqMct;hq7B^kO|{#oV$GL{*VI%D6E;EwdZAjku_v(vqctrpuXWY z?AxO!&p4L^Z6(boUKzU7v6mEo at 7-(zZ);7dP+ceF``i>tpf;E+EqP)6KDy{)oOy6T ziNk-)yjz9opkBB7i7}F}F at BCb(sXH_tGssYAAVOTKFsM&w-1Ag^9`VlNHnDa!lba#{a`2lJXbf0d6Pt0sMASUG#H#BmInN7HzU*OT2Tm&RLU! zQFDd0rsWpP6AM4Uv8#L;-zFX2E^@Zps>N!tk7+pr9euJv-94n?Fc>+f-R}IbwvBe$ zs!TqWHVW6XRN=b#L?nMQ4%l}Pax}Xa<4-Im{K5fOmu%Q6stdRe#&L|m^KZqIM*wIN zN0g!`o>Sfk;k-LMvNOM=n=ID5InMMKJYkksY&UxNXXFcW;*foAjajePEz^FhP^y_j zK<;oCt2+q#R+`bqiOR~RGXp!)?c^-(pR$`ze`}`;$0zhbr&s>?@I8v#Y!Y39E6?nw zN8mW7xykkirkZ)(yo+}YE3Vm0n8ss?i9(4anxHCqzzd2J-3(_gF{WwjavuR0ERy4B z#{-guGqc1Gkd;h?##l_0MBUOGqPRT>tk-sw6ak%Q&bJ47VH0;`C>n)wJ6E7$;Cz%R z`uH`_wsuML9D#D6aH}p<^DbPVEh0=C5ByVcd~>q2Pt1rH#cMm*kKnmY7}zSOcAih) zAZHZr=_L{q7-J$qF%cBVHi<5`EP`v$R zyxK$Gn7K9)bvaM;z^v`Bswfr=I=wL$Ixnv7iE_HJMymw)HuI?ah4`T*^?Hnl2Q4Bm zZ=F6~EC at -n6kq&H!>fOk4u(^9`w?yn2eTT>VEQnRbKBya zrWx?_>~4T!>r4v6;b2@~vS6jjl_Z_U6|9 at zV2fjY5n-2dRrWn`5JVhjAbzS^^5Wi> z%^+tSMH!C4nvB=3z&KxqX at w=+o?%&uB8n0*e4)yRDTUaCI%2`(B9^b&xL{HVpHFUK z6hGzQkq5NKXVf$p;KsfLGh6S(rXJ zuemA+WdNRc(3x8^I`AD(-`InGHrWRQf9f_vH%dZ21|+`*N7r_KLq8?9&_+soI6$CA zPJ07Q)Iw2fj8S90W(U{n4LoeVEjs0#SudA#u;zF;=k^>~3*}1=F4K>JtJS5>s63n+ z`T%r6y8j`b&^uhV^!^)i5 at CUWSpTIX9wCeWJmkqyvr@)Z#qec=(nLxP6c`Gmu(1e< zk9V}Nf%>H*B}!)#P@;5Uf*cDtGaayIGx*%szqR at V`J6}KGAdlc9GUq7`Hp_e-l_#1 zb!MCXAC$dglqTJlEu5}orES|*rOis)wrxD=CvDp{D~(FquC(pU`<~OMzwUm=H}2^h zKVs~N5kKO`nhSfcHRn{;*<082UCv#O^JA^Q-y3)@R~1)BJ(dWs-AH{1Z^JVe(9~xR zfL`_6NN#A8qiHXP?s9}V2tm`PVkHvwNie7p;WhYFwhc{Xy at qFUU;ua_}yS`2El($D3UP5aRnV(O1XYb&$tBA}fYs*gya4%fo zf2Z}hGdWgxitQ(~K-1s!+qU8e=Q*FGP+hk5y`H!yP83QURHsTj5ZYOQ&AFVbwa}8g zqZGX*14snrenj*RyLP6*L-G9HDW{k?bF1B?+Mc%^F-XAKQxx*>2vOfSSmxm^@ZoD@ zxhSqL*ABhk+#oP#U4=4kl#{%}B2>$^v^bi at vnIDiqdt(gUtJ9W3< zG at A#jv%%o}pwu;&c;PrdJ#f82&=sX?J>?EsKH{BTjIgCN6ynm{tYS(ow5fsq;ko+( zi*FJ(y*CYfj}^0V+-8Hn9VyP##Or at zvF!`r)MI>`!2h)!Ms?=bHTejV_#+6zuUC8z zlPY3175XFcdd&hoo%!SO8_!gEKvLTYTtl(nz&i_kZEx(%5 zPvXrjGH0q=bVT7EXPB3c at n#uL1*=bN&>>wq>>17tl5mfo?$%+`{7P4ALTMek5UWTo zgqh639rD)3ZimKpx25a&d0gTTRiVZpHyJmEc;uaO^za?CI3WSc1*y01A9g}+`Jz at 1 z)XU$pUbMki8ZwvP{Y_EEPz_z%A*52M0qo-DmYmT-h=($lWl|~h?dZhn$Mvdft)~yw zuNDUp8AfBI`l##@aF+84&)E5dzSKY69r}xx`GRqLPY1(`Za21euo&Z^?0DrnyJthz zGwD2K9K|~}YufSStSXP+L9-L`A~{z)q1bQn;;*BWUFKa~z|D`L_&TPzE2bALfQ#z0 zu3EnOL=W*9pV&S-OO1aeqBDo2kB0=j6Gf_H+l1i)SD4T7vshO4x#KqRE25P2us}@9iRof2?+U z+aD~g*B1HBF+NI0N9S-aGTd?^T#|@-rve(38X2X=(J?!!DIhw4PK2mjO@)7G2SMT% zzQ at K@)9`qz9Q`2YCj- at kSbJW4F{e8HZ!Nu=%J)r<*ZU)@V4+d0ik7Mc?4lQGv2t_v z_E|*>V;1$Ql>K6><|1lGt&~c1rHm4^hi9L5n`1nR!mVWM0S?ii{OxSZ>Xu~N662;n zd)b3VKjKML>?dci2|}G|Z!7SY|438&{i+krk5H2_VQlJVOk&?E!C-^>s;I(N2}nJ5 zNTwIL&c3;XVlZf*EU}(ipMjB_DFSPsiH{M}XDXsuJ7~*Idt{7$*!z at e( zk$$>Eh>au%IAp-{B?JK#xk%!fodu9*x}F5 at 0e(b4_-^imjWya;je9`S8}$A~6}Ryq zqsPo|Aa`b?RR##GeT^nwdK8QJbK*}r`xPnxhIPd?M&KorXjb$wD_2+BbiGG37GUWU zte22*5b)zZk-$L{N{V$$+e5Z3743=~KYCc4b5}F6hBuC+9mJmcix<^x)Tznv<&+AT z-YbMxnmi)ge8GO~k?qhWpRkNn&Ceyq!DF5|tUSl3tMP(nP140y`8YK859R5$ z`RN}_Sbh5fl!o$W$M88ZT at _&tbZf>#MeGZyJMDR=B3x*@(q`bjE3bsKgA1x{Th`{d zU{VE&`*7niWEKMyl6!{*@i#n^j$@A71b#X&gmI|H3wT?EfE__N2-}zlL6L5DiUiyG z*Zt-_>F0&;OQb zR43{FLkI(~4f^|N$*8- at wg`rXx&(6zfoX5Sv~^XN=|e&9I0lFD z9rTlGKi%}FL4;;Rro-X+MAtO8^Aw$cpWoZ}yhsVlB1K7KOtFJa8PbS^+e=zyHF1T! z1i at rtKPtHs0%lRT&QkdLj74O48CT0l%nv=8m0FMSy!6G6#lvCh)?%+GO5;oI6Q-iv z$EnRI%3E#$^BJI=@(Oz}FEFq9!)yKYM0flYN0_qJJe>^-VA1*NSi9_wK9+d+rT85y z0pBp3!JS&Vz77|PWuZ8u!P=?SKCup2%R at t8AG`*4qrAkQah6 zG&pw3`4(|q#JrIz8>&@TDkgrfdwF0P9$Wi*D#C%zSkSXZc_$#v at T~SFx&esTHmh!{ zgZ=ZhhV8yYF}#RL_btc=5EF5*7Dqy_OuQAbn`6}mD;tjc^~>y}WU+O9FI@%G!xlwJ z4Hm)D1jQrI5b+F$z({03)wE${IZoLO?hW4CS;qz-tbsn@*48k0=`0G9Gb_*WulGSK_Z_;2_GOL&YqOu1`J}Z+N7#8DW{yD16N=n%; zJ~fSv{qxtld;LWWuf|Oc!(GiSOTw?enQBDyzy`x#rdsiDbzA;ss>-HLmWDQ#UZy7E z_D;6{+4Q3MPaUG~>mW*6>srlL+O%p|bjnuI zB;w(%1Er{%=wx{0MA~Zpd_5U?Q^~Phpw97cqLBvSeDOomCYlKVhXL00nm83+y|V4V zA59 at gyzn(6xu)UY4?TzCjjqKzS{#Sr#}B06RI*?uk(Ly_7kN#|qNw=wIicou&mFQZ zhI2JT3=0y|g<>oP=CciuUVs<8zMfUzjCC@|Dj~zcV9RJcBv;ZGML{+h@&Ne#iC=s) zu%{s-%)Rr9!t6^^z+drBI#D4e+#r8mePFvlY7J5y(9|!cr#|l%Y=%g8MFcW&IGzv3 zLY7Bq&`h`w+oXxwQhK%7N9spct${+6g=*76`dl(bIk~$$Ya$srMuBI^QL1f`2iIP| zcW|Ddmqj=tc{sT`u}`aR?=b9~@yoJAX@;&Oy96W}s?~mxJiIVALp9u=CulJ%jk7%A zSLrKt9@{vi^lmEJqsriM#_v5b7&4pC8OCgyDDLvW#q8ra{rcNxV6EcU!wobDh$6|q z8)5zbE6FCctQGOivHdWv<_xCWylzG%q at 4{WNzGH-E33dLAJBybcq{cJ$e{PmOg>89FB} zLN$AS+_e97<+*kAv2`_k-T9^G3*Jl6g)NSz53^T^+_YShw!^;r#VdUxH%H%!1kHOl`Rp(Rp)R$VVW^%x-%a z%k~)*Q{c}YI)fkDU at YkhAlKoHn?VnLPYI%0_R9(>72O7l`L-m7g^-y7(d5n&vOZ9D zc=W0GUbv5nD*V3GdC8`hyXXiF!aK^$YHpNvWln&NkH^o;z~cDXLgC8b>tri1KgSUA zrq6^UJ8jCWR9QS|!i7U5R^_*(Rz#pnhs6mhwMbq$Y(MFti+F3Kr$}Gj6>x1w(^p)f z=zhXwZ*)-8DzB#MgyOm4JSiyq0zbJ8?RZ>1f%75QY?w<&Rsrkf=V#Rp at x{yst>rM^ zX$P&rf;eJ%p>hBEuA4vy4N9XYQ|5xQF%JUMB9Cyz)Wt3%ZQRK?ysstQ6>FyUsk&T^ z6Sw$*31nX#dJQ#MN^M+~_sUw*%X{K2wGd zpa$&(Mu3s&XOWw(qSyAEx)An)Nmqwd$~P-KqAxr~_*oijBv0yfh)q1Ww4kz^aWQ5Q zd4uz7CLEmJAuW=NQn3Z5B`A1PktF)8h9xgHiuAv|FwwFpCyEL7pl2_?tzWjg)8E)L zxC@>YDP&KzGURTMI~>ts#i*t)CrLJEq%&9B!PcUFf4?|HL4u$-X*F;V2ES)4zY%2a3T0-DO{Aq+8BrGQbYkiUB$ zMax!0%jGxJxT%GdG`tis>yT}E`{ro!tB9q32M9~e(1m*gM%|<%1Opk!_DlnO*a;X; zsc)M(XuT5Q%Y7QWeeYTpSjl~&?DG}UhPo at d{9giDn zscy=qOUS91SF%`P?dU6Mt$X&rl<2BUk@?fvU_+N`Y8aGC$(5&Au8Y2s%jVMk=xe1@ zLPjN9Bn$m}|IiAFybNwn=FH%^Qrrrf4d?teW%Wq?wt8#BK=wVS^|j#yuY1**N6q1~ zR90CI(>Cxqc0Ylx$BJunyN4SOe z(@?gbw?F&vmnB7|xnqY^`*t5XdDj!`=AW2DpAO%(y%m~ueNGQM8Pp zwPzZ#Is`*KjIk{l_SRX9)#?T%ui%vZ5PrQZCT~2>+Sw at 9a(t#eE?! z#kk>%l7yx$V$(BS6IGbAO%qi(iInxqhHi>~+{7<= zpc13{$i&ow%H?r~Ylk~vK?Fwfu*@Up3`(+zX!B%4Y*Nf}e=SJ?)xjotEz(@W=W-KXB#V)W{`6#PmoE}srWNT_K#P44d85| zONMxk4Mv%Q--M%}WA%jwyCwf*>kTZNQ6Xe*S_AoZ{d8~iNxYCV_kIbw)HxH>n=8(9 zWBMbw!ZHN0SP$s?O#l%KhR;XdMWFcnOue0GGMl~tgAVItU?KtQOD5aeXMHQ)T?p9eDlD40BS#yb;bzBlgX>O z6q*Qa0hZIwg at tK35O}_ at O{*1SckHi3o=UGAS09FEBM}Dajh5BLj3v|MkGpnM|W?x$yhZAm#M< z at j#YDeL+j7yd=ceQu%rBAjTsT*D+XOaOA*;>*SA;vH3fsjRVT5ZId9Ro^ak;%&&H` zdK}XUoEu_wBX%zZAf+0rQ)gz`Y$;Mlh!^SBt~8lxC8Ow$l+S|DdFiK73Z2n9S9P#^ z2l1OU(Eu$`_E>X$Si^@gZOWpjjeDur#&m{jV}pP1^=d73*`#ZQatnbOuhPPLP(w zu61Szm#A8jnw}vEW6d at hBlP4lA3rUdnzb=>4|3 at 3!>{ix>SpL0d(hH1LiU?J?E>ci zex3T8nU{K}vu7Stcppx at eBJqez1W-o_&6Jg1~IykK9$kKXlZZutV54+Moce4>?Fcn>&;xExE9Q^*ygZLAIi9c22IM=6 zU2VyCrm2Rr|F+fARcj-8ggbzW%B(1eah_K~@TKdCdb~0$yJB at 2S99^!nPut1xs1(s zB`aLF${2azUQ{Y&+p0VRRIfCpTNnpRk>Y1^L|ev;SY&YAr!|xzt^3Xa&zgS7Ts5UW zR~|ut4p=E!Epsc}sB~7e-nob?+hk~q56dQWl}IeAdh?1X7mdo{@5A@~ARQViSItH= zom1YBr3z743l>k1FP*_Y+0=z!W2M2yCET7nN8we?%lDGVd{m zvDLUle_1S|QVc07L%jTM1GHB at Flet6B}E5lXZ7$%F;b)>JNg)wm$u)bn8&G93h-M` z^IoCCH%p1MqN@&Cd6FSIc${Ks&eN-;5pSrG6dT-n4rb at Xd81W!dq`TVNYX>`wgkg zWliZQvR8jUFYl6$Krm&K8&i|y!feo!GuBAY#qwPxD?nHsB^N_^jkGMR&7-90>iJEm z0u5=W%W?f(U^0|>iqFJ}oc%n3IXYSs9&m;OY$)*-s#B`oZ*(IS82G0)SBM>opnf#RG~btibCfUVhqoRxgff$ z4rOGsjK%Mj09zD-R7d(u3Y*g*8kCL3X at AglyJ_K>ke;EXTiEkJ5yQI zorN>u_3QI!nGQ$hm4Q8Oa8yI!rLUAyS-t4pWaTtipV(OBCPN#%hg}4!l9Kae+n-g=i#iM~^`m&m>FsSe+R&!WRbWZ-U zcbT3b{Q!x-RI>m7*; zvM13{mAw-okZY8f*AbpSpFJnZu(84?C#$a=%J;;)1v{<0mclL}yi3#KE5W$;mW^tl z&#~zp&)Z}x1fDw`Nr-9nq5xW>p8YDQXf$o&V;7EnN#s{#Wa|BEnD$)k+aBc)#dHed z*dU|@{i#uJh~Y80sLr`1M<2bv^9Ztb}v-xg{XHjcu;NdA83PsFE`QdgXGef1 at a6%a(-j}{`K(@z1r zBQ|SOO4p;2GJ_h(0|8FV2G#HRE=S;xnjncT+BkM_1Uvw>;+Y>(-+~7A+ zZ^~f`Em`@MxYKe!njnsNc3!9@!(~u%I_Pj3neCl=EP zh(4fvTrlmia^w(en5WqBwLfBIlD^Buv^DG1+G)bK`#b(JTFLOoVpjNafPY6OzRsEZ zgW6PyI>#>9bdTLn$wDGIhqEtF9ERSYybsZ at +TR>!j{gp8>X0cp;G&Q8!X=`v5qbH& z8;oN#b!ao-kv(59jV`rE811^@J(G8gR2b56*JCgj-yG_FV@(vevLsypkh#Ji8N+_1 z92rub$I1vDn#XF>!kVe9G>cnKMPS4m2TMqUBKfDDwO^u5ERC2pl4Q;Z3{f2Z=5I{Z zV8K~}o8TZIh%g`^6#w2R|26p+qiU;;s*dD$X*QP7X0Q+!l%u4w&=pR6ubOv59-4qL zn1K|fdX`Xia#4Ak`j{3b8 zEltjV%B>T0=?EhfrkZAp2P)O8c#C;0f2JW&q)Q^fGHj~Z+&1~`KLSqUYgXBGN~z-{ zOT5xBzy&}>r5o&U?K-8Xj-a6EQ`J*$(YUo-ZI@8tjefNIE!)^WUq;~ zn~T(K&Pr)I!!3E6D7S2 at +~?hxcf>Jw8Pt at mlgum1ui7V_IOd9l<6$sT8%P1dUYCf zrvT~e+y))Kzqxf&m%pSYNW|hIKCJ}8gJFibFkumq;FYYFJd3)-)g~? zm;3Q>n7@*JwHVkoaJr2XAo6TjsMcw!38vf~4*7+|zL|MPtl#jo=5eKXfX{u!eeE>+ zspu5UKp2m^YKVGwf8-GP$t+xtr2rzxLvReUG;^HV`|Z9=KEV|nR%H(LWa5YD>*7ktS*V`8GRrt32xvZr|s3TGJ_LK*p8Xu7>6riMNbG2$E72`S!=I zd^IxpHEtL%5X=Ia#WS8te5>ku8M#Eoa)!UpersC<=Ryb3yES4+j3tN;uuJEIJ;8>W>Jn4ws|{z?_jknFwM7)z%|*Cg zl_tJmCkn0veJB+Ij73j>gao}||02#An-C$m<+7wg9Q%NVIdD_}jM)LCCT4B()N8cy zy&Ftk7AF&v2Za6CKLI at -IK~q@=)>H+-;YdZzBpImK(8x1CX9NNh8HnYYyB1+ELN?p+%}q&kYm!Wd~iF zl0S|jV)8?BfNSGTJcqVSGmBj9Wx}&^1ogCX(@Qg~0wroX6bdZ)No+T6)uxMrG3CJ& zTiWDh{2Z-{>mVkVRP)dNcwZ`7x?OpeKPU*j)qyy80Cnu7EZrRzDZ`u47^fU{wfin9 z&KvIanMu`dlA?2c8apX2c!L=;`Y3g$l1r`)OTAFTObSjN?BCdFajMX%>MqMQO!pLk zvxM}At1*fOy2zAEI~A(6_!9BeHC- at G*2yjDQ#z$Uk>X#0ucMBt znc$Z~i50LS2z>JnVzy%b}X+?reBN%;@gy6NY*sgcvGxRvN;;0HE+z zk_Kt{wTm`P at E`i0 at FQQglEKt;IB2DhLS}BZQUl-L&5u}UE}7vew9-qvtF6|NL-PIY zYu7ZCPxILg69yHf*|dR6Zy&Wr1RAEDL`z*amFunGaw22NkykyX at w6vXVE(5qpJkR= z`4SB=dh-SnVOazLR0wer`%2>Be!9mcM at 3<6*3g2)Yl(QP5HdhJk~q9|QKqpTp%>Xm z5HEg8uK+MchX4<`+dn=?5=8ps8R88I2G|8k%jxf6Eup^fgAhHW_vN6+rud4bh%OtA z+(PcYTqow7LMm$^iTe3|63 at oqQK}*I?4sd|65$uo zNL5kSZn4l((Q$q*oiv`T;yTUK`}d2L8`!T$$u3~#5j0$3cU-a?hLHuH8ipBV&XUx~ z6DkLPYq{)?L~wlmE0+X9{jX5T`Y%+fto{dU20T2>0F4YN?5G*E40Kzb5E3c0YMV+R z-!n%#TYkAzEIX^gN$xS?v#_QTB-oEA)7O&5s^=j zXeCu{O7k83#7owg0@&GxS*o+Msowt0Dt+-rafB4m!9P!M+m>r)p|#HZG_g>_c)q~% z#0rmKrOfkLQRIy z%(F0ZNfyG~Qo70hA`ai4Q%xcDRhCRxB6u9*FeQGVX%$Iefh};(#B9G;Eyo0Dl560E z^q*$>S>1x(Jm z7p%^#wtTKGKH?166=nC}!CC^E+uz6u zy{wrd|H2L-)W4&b{wH?CEp1#(olH&s8=sTzKbZsO={xJ_3X=D}MTVoVD`^P%%y3`{ zGg;0NA@>K{&$FbE&+Bd=7JiLk=92w*27muK%-gvxYze*?Hnq|2e93QqnVtRld3T2y zz~05i3?N6HR#Xug6I>M>>V*x~bJn5UFj=AEkbgF}lgKB%@I_X`rLQ$^<*%g=l`|W0 zzMw!1={|}gEgcg1NsrHB(%Mbh$F%97Q;+MK(J!zgCzYc!VD0ER>MK#LY|g>w1_l^w z1;Rrf5EDREUUu|vr|>~T*s1}LTKTBOXjM9b`a^eUg0b5PmBSKd{hQ&iaIW?Ug)p2Xmu-Pl_YYd2_xoBO~-(@(h7#8VueInb6 zNRH-J5;|?)bnimG|D^XN3cy^i at CAQU>3xdF<-vD6hWNf{68qLgdOV?Ba~8_y!k4Nv zJru8Rv*ogkADF$fCmN_Jzl_ z=g#Bb>{KD_#D1EsJf?`{0T0;1s9c{QqjBe!esH&JLNNf<^eQ at rnu{u)o$lpgNh2CB zbUmkLRQC(;jRmEMp#aS@&9la#uO((}M}Ortb!{J9D-yT5z`f at rBDXonC7ute<9}5Qa=ijJZ zN?Gv6G9f at fR^k3#qvZdz>whW_{g-vCZ7budqJ7$>m`G_9%>JOYLR)A(%bwem#VWTL*vj)tJQ at AAV0zG_CdV5|3a?XD9)_NM3voGrqT5VkLqp1che9{ zZyq5PRep3h4^1v{y%KQ9l_h)FIipTLu%oI@?rq)yPBIc_k=7ZQVc2A?0)OMh3Id=l z{Wiw5L@>7R#hQ`Hcwy|<7^h7!YQnjl5q6 at S{aYVFcHh)@dSL?~w}sY`GW(66wxG-+ z+JAWlo~F+N#KPh*$E(#z(C~l-akTf=_y{CQ&V{Y2*cf6v<-WNn`~-Qr^%S|*m|6uh))@}jHGl2!->TW&0%76#Z=>c z`-SUtJ}*D>o4F6SLJl5D at qF%sQMDbDY-_im$8uoaje5rX$ul%}I1SdIn0Oi) zumQS53v at PGgB(M)H~2Znl!B2xQZew9at^uQ!G-OxT?|kT!K>RdPm~2=;mmy8P at P*~ zyepu*SiP at OKcyu0F?+uRi%8PPj^bLuBUjr+?q%{ypOwjg&dJ)a$?&MjgI%dq#NA>_ z*7*sB`5}wK7R^W)r?zvmyhPVh61nPt8 at 1f;%t$8(b8a#h!y>7}{1WeL_}Rt%th?a~ zUkp-FrL(mBCxnlAxdMTHpI9F#PM{xJir1o#?(hVA$x~M9+7;QyWo`x4Yo2qPu=V~0 zx+-L-A*uy!0IbXK-m>E(l4s=EcFF=!s`cXBuMgfLc@*vYX2Krh54Q9xPgcG~vt}f%V&TehL+M+SBN^JZi;K!6wj1e)nP^N02sKOPU}n# zNjyl<1}p+p6Kp*0o7B5xbX`Qa4XR8WNxKO>;;mw(?(!uKxzkkbXgpjho+NsjiW2D5 z3uOC&{-1=3I6F(*Ytovk3b&5Z(xbCWdoS@{Uw7lmAec9%P?}x#yG%a}E}Wn|eJtW1 z<0E3}i&nEnl0q#f($Y*{A|e#%SK9g$Vc+!FneB~)h>E+}7txVa16`VG2I{3yb75A{ zDZ^FD at M~*GGSv7LAkmj$M9^V%%Gf{L+7I67)sv-c-w0rqRVT}2KX+FuJ4>NGwY+&U z(9`J1*8YNqpxQe-xkFhAfAfN6ZAIR0Rfh?7&5PVf_W?x4QTxf zX<2u~IyqJSN(rKbQPFUu_+z!Z^R82NK89Ag(PVnTb=G+&iweleMboq at 7`NiPtf!0`LaW;5vI1BCNpbXL z+dtQUnEmICVJ6^8+0FI$VF>x|=(<14yps=}>dncRlkS;Tq;oyy#>g at hDW3BP1y=5w z96i0Tt_BG;X=hHXQWzYk8uhcia=7LWDVKr;k0@!9;^i=>A4)-3V8J|FvD6`N}>G`B$Vp`;YnEH17i8! z2KRBLKI7~?Y*Br}3#D*8`_ zi!Ymo3B#Sg?Me5h*n8Ihg=}Bw|5YOMKaeftVfinDuVl4NrFAu=Par*=iF{Nrs+H`g z2A+&#Y2>=eY>iCAg(g@|bbZ8?}M zpnhb(vGeHsvb8f8c>eX{{ed%}_F6i4aFa|)LvoJ*V^zoK;)k`WUdrk_hZGJytw-;n z2s(R8ESu~;v$ZR_0>py&Ix{YSHm;I0OTPVpi+-Fcam~>NCB>Aj%c*+)#PhYpv#7B?Rv^2DY~F?nfR at bPv_1YEavD|bXQ~i zS}n_N(hkR-O1CBj5sZG*E?J$kwG2X<(+KJahNo2Yo`?-^eO_+;AgvJjh46WIrjwpv zaIlnxB6^vB)9J(W><^kdM=O=Bw);A$?ihRNvMm-Z1)}6WbrM&MD26%t)NXp at 5ej1+ zg(Da$%9#hXBWxlHwycznnA8wp&^;~juLJ|kd4Pr55tow-wYW1lL9pT%BKkHQTG;5B zLN-+!-wJ*yGkexWYo)-;lR at r`)s8ifn`zz~!4@^Yj|7_YKo at xp{IPWRi%TxQ9|4!b z)ht at K7rIsiH+0chbpAELZvt_*c&e<`&{tm1A;EX_TAG89rZB0;=X@`U91}Y% zJJ#xPr0`2^K(1RqfX1V*HM;>FP*wph9 at 2 zKohD#5;NxGd*mLrfE+gJd{dd4A>!I2LBg*Ga{psW#NTofa>XZ at _K{OhhI7QSGrjCu zCoLfeRde4*tTzN55sg3a7Z3w1ki!9)ZLZLwa6%CJ0hy02ChsO2<;uNqf zmU5TOulC+7P$!yh;VW+Olsp5YZ&~(a=Z>s}4{;iPB53-|tBY_{?8*<$@QB at L0vv|C zeF#uYA)UH5x36NqVU6P%(xH+JD&8!6X5CoF&gzGhav^+vV~$}&euMs>P5>QT0Iu<` z3f%+|1cdqj%?bRAB35178CMMBb8UV}sYY5e`)ukK*TVXo!N2tD%DEhFx#-Zv(A`k8pqGq+oVn1XP^tRl=z0*gT!nj5DLms!=AInWjh-n^YD0`^ zw`^yA8RoyDXJ+-wpPK{R6y5m?O->(+c4t|P*8$!$b28+GWJD52as>CDdJpE#^319Z zSwW^n7FsSgICSHqp5?Oj8jtsupwQmSW~jzmr;s8yI at j~ncCn+a2U2hbB;C^mmjuqR(`e-m zCkxMvqQpvR^QBd<$uEB=o^~^XtYzu0+=O3aRew-kNcW@)D#8$@p at 9FwW; zr1aLEiec2SSaPV&)W#U$v;TzR>4*2$bQJ82uX#1uco*HYX|jy1eREMSeP!MFx$efd z31=|qgLOyUEiD_9N*}d3 at Hl;3oSwHHa{q4AE-J}0`l}M-lm7%fn0At|+>juf!Lugk z4r>p=mmuBcx7`$%O~ZJ<&APnVVq7mPP0nK6urto(P$A8fF(2WaPKR5gcw0( z>vlchh`lR7z$$z{JW{~&ne~&T?w~|B8qe2PKm-=HgZ&iacNP-6Y<9btZ?|(zBI8k) z-n64v=_J_MMFQ+iCvbY z(hyc+Wm6 at 6R+W@GuA;HJ+2|JxaNb5yCrk3Avn&v zl6LI%t=b+r2byJ637=*~$m`oIJXNkBO)g214el(lcUlF zpAgsP0_2+ubtk-@;qP;TI+W#>TXJoW^Pl)+q;b4j$=(4LfziRL*iX+GH)A3$EY}Z) z1wXBeI6c#*<{u=CjrVMu^zx((Ji;S>KlLDM^(un4`on~(!d%h`_4=@PVfI9~P{V4y zWsZw}Dw48v37fQ$un2k)&X%31#`(!Rt at KCyc?<6Wh#v^w!WI~Zc<+Pph(j?LqBg%Q zdy2Fxiyx$L*2QoZI)P@^3gU+=<+yMdfVMuDPD?p{u1VZ>O!C%$kE>QR#qDQ_G+Pb) z-VW34#M<&(J1&VCFF}_}_>OsXAGbenMf?)4kjN35vVu4(Z$=*J-puI+9Bl&1MNyD| ztcNHBUlitfbtmAAY8Jx%Jd$&Iwrplaj$%Ylj29d44uRl0=CUJBQg1Nj45Nt!sy&9T z4L at T8IN7i*u`2V1^Fc^zQ`OuV*?^1qLWPM8sWVck6MbRGATyO9 at ou1?>U{J9+vPWf zpRPbVpqp&b6?mv2GcEh71OD=CC3p_Z?f^Cgi%`3x&hcBMde2H3$8M;L;ZgvZ1#YB# zAgd#*xrAtcCNh114yXM5Ow)*;gFDvD at h7aMF2=MzAS1XN$&I&~Auadk57qAbWntVF z;|3 at fmY9+H<@fRH at 6f=GUkRQFyg zfy(lbqC?7;VpPvHVPOtNa~?RPA%n5q#>z|gT61>HuiDWO+aGx_5QP!{q-d^o|KkC} zozcXa?Rl8Ky1M#t_jF_ra#x1U!SJDnt=)dz&)~eJI ze_8JHCP+xhtwmZ6x(=;k(Fj!@TpeZN!0OWUEzf`s@?(AmFUymkKf0G;0b{Ee7 zTo;!^pJbZ%PATfy5UN4c#_v%^nxrA2MO3CxFU}w?w_mCrdU~_C+(TZ^H_cB z8xzXpYbVnwt|Svtm$CBDm_!gv0EE-|-kUiB86xhAx&>+K;gf%N8Wcz97D;;_zvX~P zobUEZ=5lWU!je?a&K5D z%0-8sp|tkKKZL)ujZAs5Rsw6DpW;5YYbO20n!_`So13lEr2n}7k+O1m z+v;VqRF3%kV*Wpzy;G2GLAEtoyKH=A+qQSvwr$(CZQHhO+tx1I+_(GO^P~Gd^objh z4=XbAVLgnT9685kV>GmBcu8KfM)bdP;yi;)^?3gIiWuyFMC$%O82|5LwUUk1l01s9 zEpig8X)RjYIoGL{i;sg0^_zuBzLOxqlEheloQ3BE)1q*qR*s*@7t)6S1oRJ(U$VRH zhhPpH6p$BU4y0!K74*I>NYAd$Cb4pW;%1GaF$y1{zo ziRs2OF}Mpmo_#1OdH7q at Lj7ElP#eBt>D6#9HeQDW!7aIj3fe4CsHtw2W!NNjb}MH3 zO#MUI#V5Pc$+jnLMcJF9?n$POo9uR5Eh|94JchiWOq&M|R7K+o%=b7_LGYolk_&FFC?u`s$9Y!~skA=QsM;eg80;CK;N3rh2eQ(FE_grI_L-nXP`z3psn-!Mz`A zRZw{rr;Yha5LDbtKHFceQco7LmeiV(6t5VIKBm#p5%=v<1o^VMq!dZVRuoES+CymC zM}SD3{5Vq at _6)s#%ri5}Z?k;Bw-spM$1gQXT|$BZ`B7GasMMxys*%!RleyZZipf`g zx#F*1I}*9~xRaNnC$JY~P8ay6%P|?90njJw*`16EdSzAqStVx2jf at t91<}V=F_UWA zT(=B*eQZwijUT7D%^KfEaat at q9=iiOG+M*F7f8!lf(}Vkn#8kjWzlha{|dxqvr;Eu z5Fj9p|0s<0uRs*EaQ?p^rT$+M4CXpXa2W{|K_L-|fOd>9Givl|7i~~95p-GKpWvv-ZXu{B+6SJr!FiG2{kOIq6Q`M=#o{A25 z5G4$($73fL*r5y|W`#y4Sno|uBD@;X85HK+28t^UKL3IuV-;l|*%nqm9VbUO5hoID z!|MlKx5MGy@!+rHo2<~5Vp at p7uN{>_ zYY$fu`MtrusN%73J?;oLZCRp#QWDL1ssl-YnnO&%KXN{8nKZNNMm3EJ2bx;7;mj(H z(%?%8X at 5!d*ivrZu)kIkg1H8F@%aM*^S at gDswy(-D4+&sF$Gomxp}OrvgY8e1=iDc z8uAnwr+^T?XoCcnfACXEZrwI}A(Tccd~6J#BcK#CMxH;=qixOyAwD$ z at CUxj=t;` zoLO7E+&3WA^Ion+mBZg<%V%)i+p_yi9|hh5JqGEWvGcF_i&;GKgd|Z;CKqo|$CNr{ z-P$$$hSD at 8%Am5NzNPF)Ejs7yOBpwNnU50O(%6qvh+dW+QeX*kWX*L>aUNNp)~T{Z zp5S at JYSl1`bta0pSg*Eix_ZR`3k&FCadP=1I%VG++F84S72>1QkQ^%cg$6g|j3UO2 z8DU}Dk)#wjv~4N1rjZM2DDTr&a>hnqCs^F*qZZ5 at ZcX`;x+RJEB zyPS7k98GI}B@#nWY)o^+c~K<9Op?ED$1mnXW&vp~IQzn`xJ(my?Yqx3@%J$zi`&+m zyAP9e)NDL2UqlDpo@!$iYN{5Ml at Y&q_`W^bp{WAPWwxM<*eh$9TD(_k4}XXFxq+Y0 z4f!bvV-#vN5b+M^T2OpGx07L=PuS~1B$4=O`VfhWTWT at P7_-oY%m;`tXG4f0XG6># z!BCULK;H}@XwUx3=_$7#h`<+Ep*yJjjZ$=Ej)B%UmZa~9L!1!Ko^t5jnEU2WV3%;e zO)d!*nkTbpRP!Q+KEXFFxEsh?(3SjGU{|6J*qlo1Q7|Xs8DFp%Z+jsGI<%XS&qgTf z#Q-#zdfb5ny#{Icm+c!~aSY3moB#NlPQ6~s0Q_q|yjQ*LvE2MdQv3dZpRiT>>cn(h z`0j}L9|+;P#58$V{DvL2ABV$V_vGS-bMYg340Jz}Ik}}?mXhl!3yZ|ZHgfJh<{pW@;YJu+18^dUKxQ_0#jj-;lSseZLtleATTZF<_a at k0~ zmW8ByngqjGzP?->(c8FzPp{x*ALoZlZJ2&`KLplbiQeB_Y0M9D!g zh_Pe}Q6iC9$QxD){`aXk;i6nqwEu`_-NF9TRGj}ZaT2z!CXUV)hSnycF1AL_7IwD( zC$jx7!9w1w;f|I0a at vE%QhCS$2?8>~yF^9Gns8;xkTBsCcjs-Di%AW!R;3C*FaUZ4 z#BcvN!D)^HBB&bWt%sYd*=#3Mx6%L7)Xa}Cg~y8KSuB5$KPt!_c!b3QKEGRrnxqF? zg!-{&cCm+_9FUc{xP(cWdg?|l58!-)%?X6BRP#z zlceF2f_xj<-DtR9Ee=c(VmAUs{hCX%H!m7|@m32(NWzVG%Q232 at 8H>*c|;80-+!5P znUa<4;E?-b_?5;5ZV&{;YQ^J94 at xEaI?dH4y{0JiIJ6&aUvu%0>W^`E at N*>o@@g^t zoL$g37$L`L0=HTDvgN%bOCo0_ z$e6!R>~WO8(tlv4%ZE47apf$m*p(KA!=zF1sfND{yjMgO0?ISMyXFVA at C7$wu37Ss zEyf};pfy6Jku$eYz8`Dm(uo^;dXAl6divdAG^5HVpxjUBVF}oTvXDkL$TZn{XN32m zZtk6p&gXUF)&B~V&0 at P#k*-TRM)Kc_l82tqVr2P+9%l`id zgZ~SG3zq++xg}XQZm8STY*wmhv8Ki#&@_F1I$@duiMHehU|EqZg-q+dzqb{*4gm^IoEFq!@X*6+Z6`dpd;w;INq!0 at 2-fR z@&;7y{RY^-B)v-NyX41sa%aV=a3vn4kADzE7<-c_*{q%BC;81|8ioB)F6kh1WnfmQ zMJBFyG>?{iHOerF^vXpjG{%xnGzL`p->@*UI8+z%U{vy0rEm%c#6(r*{r*vaM=!gK z{WvhEze;GWjVkZ2<>N>wV+t?H0KFY0mqyq!5%0&oh)8&+DRCVlm&vjQwiQT5@;+!w zySRI1^3Xx!_t}cPc+pFN+06=io}9-yX_!`KFf*PpV3Hzs$-jQ$)mmegY6C`x%e@(- zZRP^5-=Ia81LcB2hOE}P5!3(VgM;dRO5-5&V#fR8p4kW(q8{~&daapEb2^wTS}QYY zD(C%%zAu4ff3MN1Z;ha?529e3uU)Lw;jayvRv&{SVvkUN7CvlYZ&P+4k!r!2|!mR0^P*)p5sO5n79KOT-D>Te)UC=K6k>$8R z{f{^k%8mxMPNsH_HvbnttVCJIX-gP|ms-oUx?BQ#5eP2%FnAT;L5ICLV7=I7F|+fX zf`yD<7h?mhma7rPn3MS=WG}%C&;8(+skw#wKEz!S#!U*!M(he at z`gtH%}$lmY;Mn@ zp5Nbla(}=JYPJ|>h=sEIn=!zuy=b4V5~qebeF$9am7}vRKUB`+oxkAF3unc{J$+ae zumy~4v$M>dSp_3)$GZaGVz|dTeOP;w3Z~d4I<~moE7a9g)RiLI(mhHlb5ybG2)89^ zD5hU(i+d4k#Uj(Q+Sc9euh~Ykv%%1!D|ZV;W7l$J+hDYXt3qEhz#ryKUaIf21mAXLOVRO!rB+V^_d at O zjM^LX+UxjZY1i<4yyFP>-;PCq at yOTc+jH#(=~h{L+AT-cAtGdYa7US$3lx0Tj?c*r zpI-(|??zh93&nk+;-J$;DPlD{rM2Vok$Ey4o@>8J*g8xuGLIS-2`y7DE;tT7g>7xl z2v$tzT$)oaHO})yHd;PqrRp%fl_+0sxz?)E$08$P(iI$#?8xuMM^v<>4w+H&jv69q z9I0FvvhSI2TU={;UEui!zTd62N~&!DfhSswXZRASrFahCCA}l0Gene+EC?2 z{RKefz43QGPKynJWtM4eNBk$;BI6-2%CN5B4{37BKJa at hxyW-A2qg?LX6Z8}Q*u#S zfM{v?!Zd57Tms_TJIc!iVk=W<4d{BHUKP-zm?2 at 4{J34yZV9^h4TJXq1~MR)VQga% zruc!r0EZCsFVy|IziVVq;w^vTt)b%X+Z0GY)pxJUzGA4~v8 zUnPp_PO;8_ozK2g(kft&vC7!NBhfor!eTnwM{Xut54SSoo&_?_qrUAQS81^IGrmx( zKtT?8*Etq)g?KvdAKvX&6eo zfm3fM#y=MKhmP61?X%>UFd3tVd!cHmN(oo1FX8*QI~HgP15rd ze3$PnA_Gf33=!{S2Nqw%kezQ4qipU5nRHG?fo69wF1Zuer|Ms)9>+A`NHih$?G+e8 zuvJ-lSUvKQSjbNd0`z~MC^23Jfw#3`>zEHx4c(I{iJ(P$=EEK6Uye4Q$-3)7lfDua z?fYS7o&=4x-p#TCw>owT_Bl!Gf#*yb>F<_2pnVsluHT_`^Y=q^&-$Yz9mqS7H|>)G z(Y*}dd?%vP_Dg8?r>^#=-cBD3zaj(mo)6dVphI0s0 at XYYV7oIhu{~mI56Y(A&C&wb zsN8b`_2@%&M%1hJ*}Las_Kq8NpmpOI9Ce5=q+W)R6>7X{QU&F;j2LMfXaLe=EhK^- zR at POi;vwuJ%_krY@>Do+geY~fc1r-R_eOo964If8ba&h)9vle^s6^BGLj_tcRt)?kI}gY;EK#GPW&RWK+p z0n50sz=T= z8;E4JnBgUZ3NgS0*~jm8u_K2S1Y$r1wQlif(}*n9>#3S(aW4=e$MGzz6$y+9cbwHD zGVh>Bsp&hrl7xdsL-);<=gjRifVcz%DrX0f3j1P#Sz07itI(=3u5;o at 2EMXGs35^` z^OPQ8g=J(}5(};!3HUUl#^>T3wgG`4n`t6$UbJamA5KzuH^Cl8n=GVT#3RBz&~xW%H&AzMeP@$A#@UHj=AOWa_T; zRL*JwHP23_=JglrJ3-A)oZ*xLiCK;dl#J6jS7TN+Lqtc1fQ$GkGVO6#d!y at s}sy1eYt z_NGh&rtCEX+BL at 1_WAxLw0b332h~=k*mq?vjaUS3Ze%r1Ruj9i{5r0Qy<-mz+f_vD zkp&L!yQ{faFQMyEDNZVix|=gTYOcW=tWnVb?Ix2Ebn4>vXy>_i;(Q_qQsx0urt9Ot zh}o(vZ_LK8{aB_03T)g#hgCdL{lG33yg2iLbf6YCzcYAJ0XOH5e at j@(**cH_s2p)#C!=x;84z_rbN(VOe^BmUPy-nB-BeR0=7*_OHg+G#| z=(FJr_~uYI$`G7cff6+atU2aG1^SUq=jvv+sau`j+Z_yb{bUeR5e`xYza1PS{N8@< zT*JIP&zA9E6f!9af^@2!#YG&&SSm{Z2lEqTkx0CU at p1Jm)QJxt^j;k(ujAApk~#18 zS+?lmPOu5q&|}TELOdBvh*RU#=X0>rn4wqAda+Y{KIg=OzLQVA%k0?|wDOj*sCx!T znY|^LH#C^ut)$i$b&eNuMdGOX^(m+2)2&rGxu>g!6{*mUlz5VQmNl}&T at ZrFk7elv zEn!KNVdW>FX)HJ1Ov&8^TDB9}baFHfX1&TyUFyc|B}{|WnVG<`!O~oA98_7wU%90v z at 1_>wEiZ`8kCN#7=1R`dbxIg|RhKTWTON%KT7nM=Ugd zUvOCS2w$ws;z5cgcGjQIwuGJ#nSkVc4)!#(i*Ni!78v6vY2>1Nxk$YxtkFwtVtpa9 z(_qM8LXHlHnMm%#CEx-{r=sWQe!iSrai+ at mk&{xt5qJjn?4pc<41Y*gNtE2HRr;mY zKWeU#u)%%{FQD2;+0CibG|dei0pB9k1X)w$KUVGdOLt at W3NhWIDWc#npL}l1?Roel zK$E3c#VS_#iGs&9oMIZMk`rFYXL-ya{E2P%yqx-?v$FtXN_yI`$La_qB3={~d`-=I znTG7o=fxR+ at Jo{|D!4v%V4r_70RjWnZa6yf0cC at H;OkO zGLHOx0aS>4fzc<#kjy1QnE at fHA0T|wOfltl%$tKet??C3It}G^gqybV)GveYi*WTU4! zLOy1>z(y`2ZVNkB z>IV7Shj_hpKn{ONLmuM}nVOdVyc_H^xRgrSAH4(+vtM3RFzfJy_x=$kY8N`LDxPH| z-t&`G8&|wuTc07j~WfG6P`_dCRxZ9kWvE zw#0QZEPF#!C15M1E4d~`g&j*YG-&%`m)*}f6hb72Ne9U)h`N>1hi-qX2Z!7`s|nDg z8Z8+2L%h at Vv>$N&z$N6$GJvozpo84U;Yiz at +J~{nYX^JG*eCS#Zxq_Ucz^&O at ImDH ztQfKZG>Sr2EJGbc+4u4*fTQ<^u=pmJSeG%nGRF8w^ml;Lm9!@B_DTPx+X6}xf--oE zjQu61a7h>#^8--;S-^Wo5Y69?mnLVXD? za6RwgI+X6|vk#P9v-f%aDXnYQV2*YGbOsK_f&s_NfcBwJ6l{Ry(FRXck61Vl$;g3u zX#Bb{`0#$*X#x6Pb;oLOD%uWQTdW%3VvnjV!$up7X%F{4BGUbPUBub;APx4k1^m>#SCoJb zg8to$<(EN_Hy8Q)n|R`8{1yNctp{FFEGcO0ysh?hSNX4mid2IJy>M}&!Wxdrb! zN&>M&saMGJ=nFO}{)hFE(RH_I|Lz>b+Ys*Jn-G$$go@~POTcQ6yTioRG*bft3(%1j-v~>vb}RjhxQh-+;0A_Wd_B;>z8%n&9;l#KNDjfid!-^D at F724WO}khB5F#P0ZZ56|fb7rxpR0{L;U+z!yze;DHIU(FpTRU%kfdW+>DC#b)IZq)LBIp~$u8oiNg^Mx z(S`{hux~F2gUPNw at T#j4YAVZ6axS132>r^At6gMfDhZbT5&8P8%KC88V-pN8KK4Aa zsQO>U=4cB%kO)X(aGZY-JK}Kb#b*!P(uEF5hL4hyYC%;pgiaf|Iiw5$@MEQdCr9+iQL+Rgwi9lH2*&xoyB`h^NKuQXT-dvNfCVmHsNP_me_I?G2VaL+U0Il$i_bfaKWY>Q_j2ch5V;RTSubxYd3 zEI_eiu#qtdy73|D-+wboL~_*Ez!IA6h}we)zL{14{}RVEUuIzgyDFS4>I=q1l< z0bL1j$Mm&>qPp=Ifvn`4|E#*pMDZc5FcnYwJ{dz8gt`Pdi4qpN(UTUDGD_>Cvq#Ld zj+%CXrl?iLIJXRHs7)dJBpXwibcafy*7Lhak%(w^_a2d|$GF<=57T`Sw z^U``Egn7#;lPqrt< zW;vbh-rTKcq76*ADd{U#zg4*+*cv|68wA7Vvl+(i2eoq74>+?n{s8b=U$jj@=1Xti z;2z{6EEUsV*;$ja)&a4_cD7#6v{93 at zXtPvm-7AQ^8cn8-2H_L;!6-qB`+R`;e@@4 z2XBoJsCs$qvel0=*r(E>b7l8G%!R4+!i#pI_s6^u2{ouRSm#JGhyi`t12!+3VOU|X z&YoZ>{kxpc4qH_0Sdr@`e~jLHnAYUUch7hVyeXrKZC1F$KDbDb;- zG=Pd7VPHa}C4!DF at F#L_fk5bgpJno%$Gkbu4b88d{Mi*)uXjac!wY2Yq_E4j&`QaL z$sczj#JSwC&`g0Fr1Um?G2&EJS0#<>F^i62oyIfct~DSnz>gaf=etULR`2PGD1CA& zwXD`u%}2h>1Eo(f$}>wgvupGyz4fSJ_M~KA`1sJ2SZOd z%c#bw41%MBmIwDpZRU5SjP0^-Ys&DGD|l3OJ)1x|H}KhWcbMw!Gn#L~J^zB|6!b+C z%z5hp8+|*cJUc{0k=f{-^I~QN(izmaL*K!LuCk}@fE5IE6(|1N$HNypw7AQ z38FH(XUU$ujDbKj3+LcQi%Vi|$w+<>Um-lZc}TNLUgP9WeGL!W4VpKLIw(viov%nN z5Ry}mVx}z+GCE@)1r|M9PWbW6CVk!$ZS;74-ysJV-q}^4CpHo62~Qr$wfqY at 7li0K z07icE{WN2#m5w6PuYwX%S%|TW_KY1{U5FJmG%RGmq!ApUB`twfr>6};P*6Sso=w{( zhRdnclUG`ZEQa;2ZGXgb&$5T})9!CaO|;w)(AharqGkTat0KlT@&MM-2-FO&#o^*M zzcp_YbvakYCUCR3Ecnor`MODWGUKZZBXzu0!|w0D6)UGZoZBOSfq=BY{!^br(8*cG z#o6GWZ7)R=Cl~AgO)acZwvqcMweW`Rj4cXQSy&jXqMJfqp&xx0yokSq8Y+tfR8O&! zOHz{loNJlh_qps%LmHAX6o23Dt_@>u$37krsZhcz?=d_3GGm~G4*>|4FlQKU zTRQ(&8^G8Fa+C6)l|aW(A+bHk7HK|-ph|6C*5Fy9o!Y>^KyRYQMaYZT%7&V4PcbqZ zomVVfYn%LzXAC|iLowY6242Wm#!Q{3ifjtz279elFzs_nw&E&e(n0O#o6QCjzm0dz zZAc>2+-?tAh-OHnQgrAUx2e132Gql9hghy at z-CIT0a)!$$ZXhSY~I#dlRNc7!&iaT zqt at DPx+7L?KF}Y+2zCO89-@``6j~sPq8bN}+EPB8vf$4a9({)|<7F^*H-UltpbsX( zoxCWrB2y?Mkr7H9#^z79+^7-K3n(!l7y3CpTC at OfEI3+1ngLe6YT0t_pKGYLf;>_w z6r-QuviBAgbB-z{8z6K+ at ptiq3<~om$4CiE3HE#m%EP6`FM%Z5ohAO&zSaW_QP*L_4I!G=NAS8~$SQITcOhWm1A0fSyHN5flDs1frcXuK zq)=tWY?)Bty%x|~2(uH+>&!0-S#}4jA&6Y%E`TwBT1hSe>7CE~ibQJ+rr z at c$38|64^uZN~{&1?4ZTL?)XKbhAG#J~2LFsf48Pua at Oaxy?m at q?SB?h)rWNOqTVA zwSOT&cp*hTLF8c-F*C<3e*!QQkz8!iU;nz_T)$s-?zg+PWRk!Wo1>4UyS#38oMvyc zoo>H#vi5%7?|=Ebyluwx;6bjR4ls$Ekia#HCG#5Mjj!L1B4WdO$wP2k661+0-twyv>ZLbS7YY+Ql@?LiTFKDOWMgBcecRXOb at +O~6F$Bu z+2&)9Q0<IHWf zk=ieC%+)GW)#wq1Xc4jCi^a|JdRbAa+CQ4IqL1QsTHyFK_oo_`Q3>e~qY|jc1uj$_ zH0g(nu)_Uc&569MDM9O|Zbu|DwlkTi^QrXt=PP%nUIu0gDlf=aw?7(oslFxov~3!Z zSed^w#hOG4Ln0=7GAo6}qR24fW=rrgN>pv(KavX!RP|Er{w#7OK^GPA;D(in?E=nm zKtZAB)cUsvDkPvFQI&vy9RxOzbxGu|ru<^CcueBEWu&$(kQoyZV^T7twF$38v*P-? z+P`%N)*(VyasOyZ#!F$R?iQ1Qv7luxxC|S4)QK44q$BUZVDV9q2<48&sL}Ke7X9Nw zsxB-e-0hFPVU!k*s!ll=#Y$w^FdCyov^!$4sUY$Y77i3hv^h^xn8Uj(lorlajVhm0 zEB|;5SE{qdsx$n_L2Ssp^aX_9>7Y6+cII+qgmh}JI}G*|`4)Wc9T{b-4Y$>j< zr?(%8p%?KEsdBb$O7pK&6K3tc1Z9~?r2}&>>%vG*bZl2kE7Bw?RllSX4Ldm-2sf>- zDh1MueaUJ1Zr4aU1PQc^CVA0KZ zjYnpEX|}@~FT*-$~4tS@?TadB2eED)434DHRY>oE~ilhaZw zHnOuab1E*%u?5H#8hyZ+{5}jXr;`e`Mmrn4(y}g~3PEL)=OACYX~;zXdvG6|`Q?{; z-~E(v#HSL`Zse%AaFQ;g`8|wPLBdDebx-r%s3XePs#9)^BUz-vk{Pt}B-)Rb=eSK$w4gO_{>xG{kHkwpl;ME$EQ~i?O=`cm%^iQRmY+e{4Z_KGem&rn zMvvg!!xLPZ7Z106_z=);EIL3Edfxv5`@PcIJGc6}@jbQj#)jIZjg`>UN^6e+~FkcbUEp|r5C)F8l6Kf z at 8BemY%Fw at 0VbRUw_qxe3=rPn;Mt&fKuKP-peTtGvG7BY^k9o*GeW7ShMC}$AGS_5 z7N7ubov+>35_?Oc*BV0?qwp0%>)5=9tY`3j+a%d!o({>4>MJjM`-M+Azl5vNZr5p76j4V}S1d^iSWEkrM854^Q7HpM1z zYSmvDFWSh`^KNbTduxkqD{Jnd6_?u at pWBAXBPI1O>s2G0qW`5LdU+s2Y>8TpOHW7# zyT`(k)})o!x(q~OkKP#e>Kgm`H_M}7(^SUGm!dPGteMht- at p1)zAfK0{C`A?=%D}U z5z0S&s+|2lDgOU(s{eZ!ZjI88EkFVB2VNe{zD4V6NV8?Lg at 2`%Re_$Rl;46>hk$Z@ z_-T-43aORzim*#+gG85ZMHB{ZnM5Ap6TCyCf0$msYoEz) z!WRXf`#Euv%-aNY{2`Ko2%&N$>DU8^&fHPX%^s*@hA at vskL@9!MMi1G{bP`j#z^;EXJB-3-7-EYZAn66kq+r;`cq%vf5jT9&?Q_33=j}7 z*?;1|{|nasJ9bmIaK|3O^j%vukjO$N&rkPY|LrA+NRBaER_$Bx~$$ zU{4 at zN_3Rhq)_A3jCD+&m)C>_rLYk)$AzHy1r3D=T>?RiIJ+37+dQ|_XS0`)vgTN* zsR$7K=E=>;`L2DvjabO)+WxDtxcCe~F*}%sunbW8p)b zaV5udH4HibiU8UY%T$J-YmC>A_KqtK#urHR~@_2Cz=(bDHTz2kxHzHC7cN_ zeiG)sZeE~9yl|QIm*FwrYUd< z<~6b8`9UnlFbq+Jj2a;!jJlFs)jGlr!zXhAQvwbp$!VlC&S-po^&$)94H_Yg)goLD zEXk8NJGOi^Bm7)pHK%`=E!9|RDUy8l-6B?)6DI2s91$-mMI-NQY3%|F=Cqq9oH-EK zipucGiqaJpN>4y%ARn7)sWl%myok%A+nA7A-UvlWmFt?12&R~W4c=e|=fcuq{M|Hl zJDz;}uYwBSAnI`h{CvXdT8cPBQ7OjeuP8wo49`BixMAsliK4ol3}a^`O*Jz7N8>ck z+XaxyxAFlt8(JCZ#_jWO5N|#8>WKv$?_+V}WDVjt!@~9!8Oorj3Z2tXcRzs%Mf(lP z(oWPYky_(UHx?M{(CK9MxOq?%4WCFl`!HS=BwIc at -rQwar_Ee0rlptrY3n}(wrhu! z4OKh4^7Fy(jjK}%>5LwUcqQ8Nx4IeP*a|foX>0WkuNCh^U>>cr*|}PW*pAuVPPn{d zvIi5LCfG_3<0*j5XR1F%vk~}}Z%Cmz>lKEeUD at u+BS!Aq5%^W^z){LqXfsLfk|P=F z<%i7XE{7JVd;`o>xg&VwFO}}_b5&7M#A2PR$o zCzW8(mGG(8F(fUWvO-a0hd!R8QCPV1g_lDS$?XZ0=~_9L7fDB(o{GCI{Y$^t7gZhZ zY3pV!ig?xr^a7T;{g(Q>aTbol>qzxDs86osz;@Hq^^(X+>#^|I6m8P%jxzvTtr3(w#XGHu`oRA zXUT+|oCGHzooR$w1sRY<|8~eopxic0Er|En!|LHPVH(?ps^zm38v}l{6Rq{B6$_}l zBN9SmQj-KD2HU5uj>UB$8 at Ao58iP7qErKtsha^Y9s|Sn0(Ny5DPQWoKI?D^u_!c_c zCXCYr%jRh3OP&}ZbtyH$6`Of3)qh0N)EZfn&W^--Blyv#KuUw4zzOoE^4|2}F5sD# zg+i-$86V)}h^euJ-gnL>T=7Wpm!awlSBwRT at +PL>9P2}OHR+H9YA7g5V{>Yf20Dht~ zD}z7fPt}Lw$`%Wgx%u6 zy87+cZ$*yKLTnF)s|&Fwo}KkK*Pwh0q@|hFB09h02|Co&4Ak}`ZyJ(nUR3=$npnC& z=ZwFN#DbHU3zb|l@#>2y#_>8>S>OYdFt8mjsvXbLO`OP+B!sk)oPs5Sd#G_i0=x7N zK*}kk1hbJPtK1 at SgA^*;H0cmRu{{wua1a9*(!Oex0)?g-hHKE8jM*%dk<=XBJ0+32 zYmIOmii?xS1*Y;X{e`3yVyau#4wLlVH+o+W?xDwJ%WwCNYb+c#k?W&yZZ2_r&H!4q z2*-*6riX+%(xbbL&R_Im72wNPghN1qduotF;)ZHuGYqTf(>lGO^5xk&+(spIjFRXB zKTF!_Xvm9jy7Wk+==zJ)`e}iG4(^FBj#^^=DxZ&!*y6OAHTJQ7^WmRs at S%S60kMJS zNfS>nHH>UZh at 3Ya8JW~|_kD(h&Lg#vYV5DbB98&vO+GC_c-vf}qPcKGO| z5<>MYaMnf~THzM2a@~0D^2HHz8jv?@0^~fb`^Ko8&HnwClitHkd{Z-%xEF$ah3M#n zDc|u%1R>WvF<`M6ESA0=F}dSg7qoGRH6USBfpiM}3pO#q_?IN(DSQ0BO!=VcqBD}z z{HewVohh_Wz>{wR^`WAqPH0SfwqBj_E!B2pRRh at CKAmT+v9$?_=`Ci}Yv#%k=maYC269Ewc&>OCK=hk%=~-LS z%Uq{8CkApi&BBa4)-7WkPCBHGk=dvYx{jd%JKebKP^0wKlWh0g9g8uxBf^;-eB*Jv z7$=I^cm%WY5LUw>w3?AZA8%!3YuwcU3F%iOduV`+niTsncb$(1EG z>9+Y;DAjv7QP1dFm(oxMJ#fXqz{R+JHbouxs9}@5pG*3ZJHjPc-3{roDEisK*YA+R zaHqdGnKk-+KUp0;cAz>%U4wTxq1fBYMjs`CuV3zwNr`f56r)wcG07`-J(s){J=_LA z_CR7RDvd__$*@3U9M~Y28%8*ga z+!$D3$}c&*!dcKOTW*JV;VbBqB)>yo9Fd at Mwgl>5s%!l=td`AD7rS&$yu_ zCd^fi`(yRd&%f1ZH^guwm_UGlSYZAK`Q-nu(Yjch{CAYEswIc~k9<;AOVe|}5UhJ& zhpuNp at lKK&ngm0r1~h(n?7A^^nhX$4HfrXV>@a)N*n`w*CCwu9 zI-UJ(`X`HX>HPiu^3n~6lO{Ai%HM!3km3(fdki<>Hr&!|58}<^vjF6y_e_|){#o6{ z)+Dt^Eu%CVX%CgMb5G$UaD<9Zk%)@P1Y+vNC^L4t8KfNrstgMjYleWmnaaBMj9uyj zj4`h~nuKKprFL7p*k(Jts||Yf at _H`4ZPZth0CBb8(-R%&H2Rs>(rf35z^O(~@Z7AyqXth3 zW2q_#n8;EL7+AZ%4%pTU2Uy&aIfO?Q#D9J$uHF9boGbh+L|%cKij#Wfm^*EsY#VAx zGKepvZk}#C)3fI!+0G^n+`n-OB}mmA(QQr1eD+^vTtgAxj_AFOxNR*_?95}cO6V%Q zbz@$bw_DiuGj#6G!o|f25W#q%aZNdFvQ3sy`-iH;v4gW zG1}4{H`GB}wrnV}+KABUOlu^Ps+DS2uq>k-5N>#nQryx?%ij=5vL*5*W=EKxjyo30 za+X}5`}vq(gyVzZ^TP=2M53FYi}TD^vv8+Zw}fep=!G}KmTsO&+>{?V_0(f4FuhM- zQWb;t4v06ZIe#CXaxV`6Wir<)t;eaEIS8o<+9+ETyDMkb^XnGWC-g^2sWgLg*q8G# z%0OtCx8qARqK7;Mh%-f`QHuMtK~{}XmfiY&nAIRuiE(ncR94$e61!8+SZ8?8-tGZB z at 7``Gl--ei;`VlbTJ`{;1q-lxxS&Y9~{&_DR|Ufd6!E36;Yb#4&f)Yf8)*?esas*qPu%X z=XgPa_lGf4ZMAd!n1!|Ww at 1)aruDYr18b(+YUji;59`hESO2L{YhJ?#hD^Ct at 9|?M z)LbfaC*h&lDFy`x*o}5Bt}1?xJpIo&8;%;=Hlub8)au)B6lc5|%^C${4XbtgC at 3XZ z&6KNiS{YXqV at L3gr1Zus2_@q)jfUzdUHrJV&!o(zQ=jzig-u at Y>ILaM{SktVtA=3m z2*XqZmvF_UMIB2n*Cs{8E@;D$h&(oE#VsBrYVZwak-n+RmF)5$l?4`@J!J2RIGrL6 zY$pH-yo%J%0!LvoL-6oU28%P>Cc&%tulP(SvL_23qw{5BQ|EnRf+slY%+l{s at g1P} z;*Q@`am^fN=%aU>ZMi6~4eJqr11!}(Tm}&db=p_uG0N2y{=J4*OJvA)A$kop<+Nry z at QMRML{|qClxXtTLR4ou{1%^XHrZ4wyt6RI6kwTrHTD{s7Dvt*g$|4D!A|t&8ktDODhcR!&6dOG?fWo_2nf23 z!9gLFEoZDUZdt8ed_sxTvL9+}RRRmdX0D-Wp`G-FI?0Lag&o8|9pWH^qf!m^B;z|8 z!xkB9GL|sSLsi6zELri2YdkbOf}e$RX2#)8^y~r-73iBmo*uQ=Vf+0|@skt8-7~un zofO`dp6O(77|JERz5b zDw#eYlKZ;VdV8U0D|2nE&HV}@KdrF)iYw=WS2^}^K99&JP-8W%%y)XhUWQV@)K#8q z7Dms%OlWO#VD>W$QbG=wMC#(;&guO1b0dZ%B`-C+cmTQd!v>#ivphbX at hRL;mo(Ou zwkxu~a7M0cE<7U`We6(!g9(oobcGcyp*E!LT<+VQ3u*!q5Rn$CHv!dJ*`1YwU^ZvWa0<{OvbK9)m1HN`iN$f3 at oVF^v)Xgr=@ z42v$stku}J0U~P^7^HZz?yVcN`E#6y at JXHhW!DGfu*F$>)0}4)_s0F)^_X8Jwv*0t zLMJ4p<1bkmJ45I|t1l~A^m*82ZO(!v8U~Y4`DH3!phWo;|M1n0Tt3Y~Or-Bbe5r5F z0EORtOiLmh_v42x8OKz at Zkb%1bnZyIvM0P|cAwMQmU$n>6fQzNF=z at g&3P|(O3{oX zq>tvQjIF^b4sn!4CO=oFQ04b3zqYIBh`mJe&+cfR+%5(PH9&4h#vNE%u at 1fn9$qodSu- at 6|`4 zywS)xDnaN){s74s?8Hw>;7PSSPw22ibI^pT98H7g*o)Q}&o&*s at ZaDVvY!29jB zrmK--Xz7vcwbVM)+o45zZM0~z!X9--EPcdQewU at 4X?smdi?lnuTdv5ojF9K2((0WC z!3Af`jdCr=Xh(>4TVIVjdpyUJkz=;ZGReLk&TBY}7?pN10K0OFlRNO`+fS6JI)%~U zNhZV_IKHkA9I7+lqgsj4iV^9xxf;KvBO|S=RiDGo!`|>7^d`?#R0Z2Gn`U%pbIKmQ zGN-&yJx2%kAm>GJd9g6~!A`C0aw z3Dj6h&}-aUn^W%l=KChs!%R<453oJl4(VKoBl4fR#c<+oNdrt&&?S_01qpo-Otr+v zKTQGemNeMvOt=073Y2OUA&w3y28IR;Nss7KOwreM z!0L#MJQKGZQMQ~H;P%Dl6WOhoWSNGUiK=0)M@*;apK8$CDAcU525YH&!1};UlZG6j zWIYGe%Uq}7(d4`;pZ*|$7(x;Meh0j`SZKBt z=rPEI+4}FX^(r;S%YwynkH%6k&Qs z>DFw_SB0xAFiC*SXRm-YmFjQA97cp2=B|w5J8?4~kGo7LW|U*D?`_BMt#6gE;aeZK zie*8aDHmC-Z at _*s&m{o9KSbGqVqJ|~?IHX+j>ed%?j_`DXXL)dR%NZ?D+9=Mh)n50Ln=FkW zuE~L|5MMk;OEsj5cC#Pu^~6G8ND!ry#e5-+j>IUyb}UMSt#{!(6P3fl*AFImN0YInV@$jSIE3Lj7|b|4Hoh%O20ohUDPUJY1y%Dta)0e~BZ zlh}!&*F&2d6WY!dczui&xmf9;zBiI)VF(wt3Q!Z;I-bhgDKFS zVa8=eCCs+W zNrgzzv4~zksgFDy6w5?GX&2oixw~f1lfMNc%*I%+FnUiz{K$-JhuN%Qitxx46jDK9X0~;0^3SJNlI3_7&>*)%TFu zTfpW%{wFZwwiz?RzyO3fH*r_A;l(eKjQX7xctyK_nqKLNu5Z-rsohAVKfD2Jw{vNW zib_gf{Ek0}<&EDBiX2Jv at e8FSXa z2}2+gZ5y0w9(+!+vR*$=M(BX#ZdZc?Iyk8HM|ydF{<-TF#xem#1yupnVJU zfVV+xTKZ)hjy&bpsp6)bw|$v+Y at emX*eAd~&|hi#!Bx-WS-w1fm$f`6fjD^gbJo^F z7sYZ=frRU~`=Yf&dthwo0VO;wBoCgc#k6!n8s22WOm-hO9=U^P(#4Tv0yPdtquw9c zu*hG!iy3m?cUEy=`MjCg?%F1?m2)b{fHj5qos-ZSTbl#JPp`L>5EbsmxS%ol&+lzG z?uI%@Ej>LWch~arxqBV!@L|SUGJvy&-0k?JGiHNNe$llP_e^=nAS(}H(6cKN1&VV| z5#1bVss0{kO1+>fZ!^rJ&>s=U>_$9^D~8Gw{iQ8CaUTMzXgE$aaS;5tfM3!GA`KA| ztTo8AhBO9LGDFRz3|5L`aGZAgXlogN!s;-`KIDpaRC)-XaMPWP`Q%2?_irtvElJ9W z=I4{lsJi3jtq)wOZ+11M4akjdjMMF?bMkTfX;Lr`EE&q>z+S8E8H*5iFret~YDH+LoIo-xIE zJR^Ta-#z>94(bWhGbr@*KSswsrrT!6*;75=pHB$>n3tyX!Ar~#^(lRz-sydutnR8N zcX30ck+tgFhV?^+nR1u6mkg0)65iPYeBEQS&n*(85{qCE=+VvH`RWx_@%SIr`5cCMO96_F1n zj8a$Q)mz}d1yl_+ekmxzEz!alJ0X?5$^@iYZT1vkjazEfQmCrbSTr)V8ZMjID3#P% zT-gj?>LeFrYnEqv)>~xA$WY8Hv%z68%am^nndsPUSo`33JrghXZ6j??V%o>pvg0}Y zR2y00C~d|YO_5Qys~GR*x1;TmsVZwW9Ba0K+8jO7J9x~`&xCs_|9R5j2JoKFd7V{g ztVb)}gbHeiugC<@R6;PY?{5hvMw>cRKS$XgbIb>yO{Rarck%Ba at rx{gi3UkixAv8l z?Clz#e`UPJHWCGkiqUv0k#LDuREzk`@aCo4s8UPu?n)iG74%OZ5jGdf95leN zpp-{nDOWOU)2f_sE*;@mJ=91DzShuK2|M>IYT88qkXbth*p!PZ>8H(mcyDeMGtGC4 zxHQyUS~%)JX}vNS$2Q{{f`~LIYr={S6`!dJv}IBvD7%{uSZleMNF0$dBKtxvTn6U! zd2ZCH=xDI!RMI3bq7Km8q$>%xbmQ$Q^0Ja|Z?&LH`^2g`C)94=um9vaFODG(qZhHW zT8zg+rY)c)h-6F16M>JEAVZh)ec)`f6OG~uRL^Z-N6L3Y{ zL~337OzfFoW9LX|VFz^b=X((cRBj#hdQ>cm(K4rTJ_u^MbsA|DGTP?O6y#w%8$ zNFSleMXov8 at b$#^x^74e(X-!vSo`xcp{1NJjS;DW-FH%9z;8&C;Or9ieSwbYI{2pCwsOH^%6gs>E0jwJZ5c-XOq?f>O z=OL|v*WMjoiUrQE%=gAOZ)~cUz at ac9+E1a9VXmmj@BfZ=qO7bLRiHpXx-dXMod2_^ z$bY!h{i|8$L at Z)$Vq;?K{9jBNZPXUTQG5a2!GK+CYVwXsauG#g=#KM>YLzOHIp}s1 z2R9!$lR@|S!Nj7RgEhbXTKmtu{ePGZTh44t%s+NDW`R1{nO*zjn3-N at dw<_tumMfD z6C5DYj$;fJBYglSptSo`7>oyJsxWH83CI8!hOGof;A|nOsrFL+6~P;@cU89MwlM?+ zCCwNG9#)}DIJD=adbO&}ZC&Ly*vw8<=E?tQKF5_7)n4lyDnN_T*)P*Fr~_d##oU(7 z#yqmu=vuDcOnIg=vCiV2u^C~KzyPc3xKvTn34ujCC-Fexmt!@|;HnFu%nR_HD at Up6H1-~$b1pEtWLVlE*tGdr<$)qiHRGF>r6n|CvQ`-|zWtCFz)a_F%MZ!}qf z1|=MvwihK4^1~Id;!4(auo+QGJI|}j%uzb;ZmlW7#x{|OlCd!D3UHt2!1 z>;b_rZ4cdUtT>Kw2Pu1b7>ZWhLmRM;)q*+ at fwSf&uTpAKT3Bq`c014Vy at gL>ofRT_ z02pN}cRWQBwpVo*-wU)b$FYhu>SrrIzt!otKXXCNl-+T=^^`WHF}q{A9__rV7?*SwYH9=XI|X&Fa#@97lnDt$;z1 z{Q!jCP(hr~B$w=9&i&EnyZV`%7o3gP*Nb-qAlyq8efvXw{b$O2(zjJ_KEK_m5 zkqOX%0PV^X{7}8`(m-frdaC!O&lD}B-@%8sp0$w at s<4gVQnwFM&kKc8-+gUK={DVr-&!K~IEH3vL zKoGJuB$YX5Yotqi)~oE2VC3G?cX0pg#6gB*?}<9L^AFBTS7aDICj4RzI at ZT(JK8H4 zt;c1VH{d!;6|%@8!X;Gp#~-%w&QTyf{#)zsAj at xn{!-^D8%wE1h&01wO|oPgWrf18 zY1An!=X}s#38r}SQ8`RnxqZB}yVEE3$1GXtd#q(>_O+h;tM6;7boF`)+JmyG{aBbU zz<4E}MBK7XXgPU;^P~(kiwdmcMW0I2Saw)Pf79~*+UK6m`>T?phW!5_q8R at rd#9ze zz>o5UHctu%EUD62 at B?)tP`MYoSv4+l0rRjJ_J%-5DvQ}6p&I at Re*`jH!K at SZKU{xf z%%q at YF7&fW6Ssbw&G_!LnfQHv-TmwZS^g;>zm!isXpR6!m4bDs zw}Z6M+%^%fe(2q|U2?UW!HTH^rNxM9xN!8FVhHkwge|6-s64UCQFC(78Eik9KV;uT zevLSR(Y3*ao8PhrC!}7lp^=2GO#jMj=zty1P&3w;ZWc!#ZrQ+t7gmHW0-x(uM-5 at s(*9+cGY zA+UpFT4VH>+pHQ*OZDu9o~L(ViQGw&` zZ3qAZz(wum2Y`^mqTGp#jP)8(SE at 7E<0>t_e7ZzMr~ul&!=;9P0u1 at 8D3>u9yOu)? z2JhP_UL**H35#o(-=iu-__pa&MUM`KF at 3IIYh`*o9qlHw*Mk&JU`pFDn~G)kM&RMa zI*rn<3Ho5yauUbspX`LC=VdDAiYF2z)+C839;5Y>Y%_=@GBNVdXPtiQ^*Qb^+@`Ar z{RQQ+ti4)A=FAxlF-+`Y5AMQFc=v7ok-@|aY8GPGLymgAye_?6RzZ<2eM5q+Qjc)E zjAu3aguyxp1}sqTa6#FlHyd$Hw8k`n+!CB`F8##Tp`+zQ#z%+ at 0HHxlUT1r6>jQBY zhay3E5 at U%2QKy`~sS;H&0JT7;Vs{XMNZ~yWkD3F*%0AS+6VgJ&^WQA4``{?PmJsYx}0lYp2NX z`(Xng$aP;7C^PQM0{hWl32{%fMWjLaj_0#OPxJ4%}p=dSOc25Tsc(Kvcc&1lyMGhcDfY zwC>>V2i3(sR06F8wn_5yi3F?(#%p*N5%F;2d-V$WqX9ue> zr%@gw>}<2D)5_!UO>sdPt78Ysp8XFZrxjGLYo~zf70rUb#yqH zvXjr>9E;!hP--$2k~y>vJbkf7B{fSaIONbNQ!aZFRTqnd87r&lL`k at 5Ee371L_)KE zwNpAag0PO at SQ_h-l3{+1S*I*s{OKzr)oM}JHPmtq*?AJ1p~{hRd&@#avS5 zT*KU1hwkk!Btgj(+n^veu3k(7mhwk0?unC>?e?%;ADQ+HO6yDp at fc`p3%sh&g?~ts zW3o`j62F+jp=sxGr6q=4tr8T#A%wYu#on9eqUVOUM$CwK2hfQ$8d2%IP_-p*xIqJn zwUZhGy^C=7O&P$3yT=&uMl&DbiPOqx_Hyd_oW<%bD=P)|lTX7O3s&v=mZGdIbN{h;YMx;C60sWew9oNIe6^7lCcG26?obP&=^ zRAgB14^wHyg88k|PTp>>+BxZt}jI+Miw z?8K&7R(eS)g%JH#Udk+Nb5e`wTM__+pl~r4jr7JcLQ%n`kM63}LpIZZZXYBSjJwN# zrO=dzG>}WyiFLlg=_fFyzM`kTvex!v1$h(1w$K$R$EZc#>GwqmZd*DqgUIQ~Ua9g< za3W`96GY5d0UGvfC7qYt_NK0vZR8ZWG|{+eq5|M{ts@!3BV9r11otIo{{B;VNK4uT z0CXU1l9D8KByZ7F4o0!L%uQL%ikh=ws&rO}q{5Ln9#-zt8%O->7xu;~5Q`ZohzK?! zeIdqbXCi2E-9EG z at obg7jH&v7)gsz81=gI8K60yc|FR;!G02A2)}(<-HB%@IXXqB7XNn-qAyEhs(gmK| zP?y%nIn3HNTP at R~-u*7K at HlgF)`Za;U>zzYwJ0xGAVorqRV!X_#~r at ut(Okg;2{GB z9i&@BTr0EsW9^i)2JBf9wN9IqR4RLU*f6_B)k8Bjso$1zxLXyDH97diVNvxHBl@(1 zz-+ at KR?*~!6T*Rdr7TIxa0{v;{I|JpT3_?4ivsBx8~IDK4{y!IboAt&uNAS2~G z20t-Ky-BZnf_|+uvV>TDGMH6=6*Rp)EPG~I)6Htaw0yBHqxElB7+&ZRZ%BxXpwAL& zLK~z~2AZ^5BpwkzQKy#vwnDmqzVn?y+AuQ9gj5*3AADZr7o at q^-QnUJBd=KN_n+W~)Z1>NWsgjo5PXUy# zk`^1Op?MJ9+rU{%tzeotvW+;5DhTp8^}suaHQ9B7jdWADl!=~xvQFYR^Zi)HoGmm& zV$BnS?sTRT?}uy-GvAMo57b`9lm+p;I6y!_z=(yg0?q(R4hA_UId&QSp{~QsaRZI9 z*@9c+ZL8^MmBiSV%E&$UHKw}0I2+FPfnrPGfv}Evz8XeB at jb1OwMrAmz*I?`_r%SW zgWJfu(`bSf<%XjxjT+c{K0`@IzmdB6dWD&5(mDHPk%^oH$jDwZtJe5Zrw{2!C4;nc zD<0*lt6O^wCv)8>qMi5^9#d7)SHJ79(vNJbqvLKD{qz_TuH)xzUJpdSEQB!1!UuY3 zJ=vR9zmx(FMk$|C1ucRKWhv*PVxQE4m5XR}Kg*9;6v!fzjB?u)8>bm6Z)>Cszp|kaxtamotipK#sFroQSO!?qV2OM^rlu&){=^O2d3Ay#=%Oh&yTWu*txd!)=4g zSp5no4_L1ex4Vqf2|Cdu+Hz&~fpu8rt#T?qf4DlO4%D-Fu`bR(iACqZ<7BU9*|72fk zuWCQlP`&^ppaz at r!uyR|?;Zl(&hZWn-OlL_9v#8)t|sbF>({%scdr<4(p@~*D{LlK znj`}h)tg-9fu*oo^qhEXjVYrIvSs0VS-$2P^AsD(ObY^z`2}(D5oXG=GSBcl<`i?x z(^c}XtJJ!p5oX2|OLYd7nFdRCKjdZHDXf$fW1r#HlsSOQvJFN_v1TJX5y3n at TVlMz z0?v{~ux?@rlEMiJp_{C_4 at 7k7Y36dm=edI|f4}I$Y$*tY5md?#b5Vbi-|d!jUc-|m z2UQw at bUCKXg!w$`4Qr$b9S%w>8k-T1SZjwmmZsLRuJSVRLlt;T0^}2KEJ3*Aq at fy~ z{3Nu<=kHVO9)cu(vn@=kyLiNATt5%4AYIXKcU7%(hoM6e5OPW3ZL&#{Y_`B3j?Y0E zkm|SKRhQ=!BnowFvtfEq{3usY1mCO at p$|g$>sdr|O6{oVMA2EtH z(3;;AN_gA2jx(8}pCGYRlco>N*HG$^(UZYYGC7i0UR3DBvk;M at ZX$JOC-;%Yb~ltb zGq1>;lg?)hS?4G(#IP|hd zHf2q@;g z4^cB8%V3bLPI((i+4WA(sH{J4onB-f;w0Y`Dd}*@ZYU^%oV6Z0lqpIum2k?sZGk{f z^Q^{;fYH`uSQ8Wz*<_|xVPa(HNUVKkJ6Ad-3-iz7G)5XU_ at u>_E$FX z&fk^tF5b2B7J?>=)bfwAL-h{5;W$QsZZ^ye^qED)37|a?1Lrdk7C_;fcoFFX|DZfz z14n<|MWj`zrK40qhnim9#*>59Eqv{?5Hc2d;&c-y>w*rsi zA=7Ja42;g%rGC6rgfsg!>P!S&4)3DZDVREpx520Z)Z`Z=Y8^M^@lxu{4GQ~6v*O?_ zm(_2KBaYPxE3%K+()INWLLDD}xGFLD#ct25ck?J!ldOhiELHdQAK$D&7(S4SDQk-~ z{jR`0z;a0YA;;#WMD15sMYFL;@r~Oq1``vmA}|A?Cc;a^Ofpc_C2dx?2s1k6Lcv7x z7P#AdK)JaI3I7>OF!zaD*2|$g`G|_5Cu1)B!@zTcw%hHO;0$L*Pq;4)=4O=V;=Qh5 zV#~ZT9i;_GSr_b?usH;3&#V}UYy4w)cy?=aks%e77JsExQFu=C(+2pXEu?2s4(g*e zT879Gb;a92zJ+q=2`n}EO&CvEpDr~4>85;87nqHCsTrKHb6%o!Q~UAt=#0xz%eD-k zWm?Rggfi3>|0$z4SwB;pnZnN;(JR!K?<|om*d+NE

dk!v!&T?yzWfYBEi4{fC!8M-b7IwI-mV^|)Jb{uHC+`f53e6f&v|LO!b(gWH8qVN{9OR`zj zR8=+I3x3_o+(v51T>H}w2 zPTcfjjlwwcTWD6eQXtRNM2JQrt**cXVE2lIj=60 at g5s7 z%-Ic?P|MG;E0 at jex0sjhx2;ax+5ErxY~oB3B?(2c7L*y&L9TH{tFeZ8`Dmv1zH1 zV{ColwR;kmx)Gb2qPN{$Aztn=cY{RN6w-jZxf!>HJL5pNvHu8e>p`T`ro!LHE!cnL z-=bQt^F~i?pSrT$oy>j0bNWdgd&TTW9bR5i*_loFS%h8}>*loYh5DUPXj-||qTnIU zICrBlJ^lv7eg3Tp!b~5)rUMED#Q9g&W&IyBu7IJFv!j8L^M7PqVkr}k|6(zjtfFJL zV2a|qOa zrnbTe8`y((pHnhA${!uCmJ)gWo!N(WI&R$kYA`XLCJ8!g{0p$ zLl8d%2-(G-Nt at sEP&TCvhTAh at nk)f#fGyXlx&x_zaskfYRufH4rZzF{!_8-hSMqPB zr>`K1?~AGJik8uUOxL*FxjJEAjcaCOa`|elZPnr{4;wMnQCkn%@B?wGDs3C^d^^oO z7A=lw8kFg(tM$FC-st|i;UEwyR`7&}ZHNcy6&tl0*JjOmJti%9l97uX6Hb|hmL(^( zH0AIg{JZ;cz=viSe$D7kCtqBf26N-kG8 at c6Dz7k7>EtLYm|567(r6J54KZiUR4tl+ zeh6ME=Z`km1G+cwn at x-dKa{NX$t2zUWde23(yn{3KEWEj-9=(8&r&&kF2npgAD;n>^8fg-sbwyx!CNnfdPb)Smz*Q5YqVpMrq7-1i=vc_^gx%y*n0>={#4_ z2(7~$zIQcE@~hgu&);vtaW(R!K9p-^&cC%GW#nh9^|xC-VlZSl)E>B0L8BmWxkjCR z5U8AOHBw`Oy-KOHr*S=&EWeFZtqx*#-_38fz#@C|G#nhtC14A%CMq0uZ>OWpH@ z#FpPdwV9lgXF6MWq8B(Dpc563h;tW_3#i|2jmZq>z9f|*-C1}8xX;$`#yHACPPknI z&?T0#bv=XQOU0o-e1RT at c%{1#ly(LV-I>Hg+GH!P9g8uTNp2xU-SY1gydoF^Aia2< z&p~R{6MFuDWt2o^&Q0y9Nuo$9)*=p1+&r`xKns4?udykb3&QB`P)lSP6uih0~ipHG7Jz9^Z)w7{&Rst#p*xo zX)fGw(m5>*H7z43N}dV_T?Y!8N#janu=iQxFhWyGsbLCL;~5(iNA>p5>7_&65}PL< zLA?*e7&eoao2?_Gc!W$FI@lsk*c+C`jnyrE*??#O;&|WCV55E*&}4 zS3E@*dm34I^90(f~?^sjJ zI6uOFak at B3(HDQvKntPcmyY8E-TKj2dVUgLzNL zVhlqIT(;_HpnD5qMV5#T%H5nED` zAEkFU81*P&hoEd3sd0?DOf`2#Ri&8La|omCGT&1QYAj at h;DKmw-K5e6I)gQ`4oj_3 z+=w at a$P~OO_n3@{I|HkNXB>3<(O(n;qXL6T^-zop%q5t6XcabOmz&n0&6G$wgJF3r z8zx}UhhaemBy#)n%h_E=V~?=visdIF3S2qYq)f)IlA%mb^<9+akwHN+aQ_Sq7)4mz znqEAvp>b>+gN1N%dVh#cOOK>Pqlq|H at _BMMY{Q0?a~H)pg$GcK+8bGyw*TI=V?V?m zot4{w{Zwo)PC%#3-v4piUW_I)w}RyZ-r6Yd9n8P?qfhUYD(u7}Iu7oZM|O^q@`6x!mGLg>vX?UuN3boj?3?&w1;lvEAM-!Rvd at 3F5_p~q#5~3kk?$Aq zUtdf=JJ-ff!)<_MOMYqJ8Pu44_o?s#D!B(m7NqU36p~t9+SPy;VC8->EPnCt%jUZW zpS*$Zm0Zb1T=yVDznUcuhFvld1)=B^e$BGexG0YQCYe=Lt`LtDuEe3F#db?>cf1^TrF at aY z;kO(*=tbBavES_lMl at V@$Q>gHPujXWNw+iYNq_p|r`H2aZbSivy5Pv53|q(y3un?c zDSnyLXqq^>-yH$zUbY(_I0BtRA9d-_LBhJZQgC(+1(0?Ly>S>gmK|_c*+DX;ABod$ z!GcH7#N!xbwG1{#NofJuyX$?zXt*j<)n6Ny3{FrZTy6gF)&O1;Vo5jG0YmBBXYbc) zXuE;QH7K!cmnqz9htt9^X4MI0-6+`{7TiMMwuOjXrreprR}??@n5Ykg9+1rczO`LC zX92t0%phT;mKp&KSnrS=PB;VV7piVt5z^mJ zGE=Kt zp;A6mwpn0|81&vtYrfEuHBtfFxK06ha4*^8p|fNOi3-7k!?8I?3E{P{MCmIJ1P at ZW zm+ZCyz^Uis9&71^-Yyl&hNpkiC%uuBI`HCs)eHG_#QKE`+%)B)FwYfIS}+7gQ5qgaBhQ8Ylr$(EWF@&hih3>@B0?8CWf6Q2^ijioEt zJ%CiRID7f;ej4IKMeIRWLpg%^?ow83nwQ$ctytjmg>3qFN-;wr-7#L>XKQYb^r8=9 zZs+cOcmyh4?JCEzThx_}y4Kgbb{l3o#~C~Tg(H}S`8_FHYvpnU&vlB5^biQY9j<>s zgJN3a3pJAP5_wQhn3t{F5#NO>e|ixb)esrcj$_0+o|6OKiAw~TBRepNsD#v0x^L0V z)sViv{^rImjw<>+_!nc&hyLF&=6^;1KU1)(mD5iZ3}0E>%pw>Wm_04mGzyq)61mgul^YeO%pcB2JNqLeEZ4W)n~~mmMfTyG}Tu29d<~6oZ~j+ z*Pm37CD!;Xy1bL~S1;4Nl4~qnU77?(coyCG+b-BEFwe8Uwqq?7~c)?zI(V1Q9ZZfsPBbMcDmqeaZMCBJcf*2=JB1WJY*km6Ta+j at __M0uD zC#*dlJ?k8a4u2CE<3D?or_3ZBKkMG+RqCwWHMCbP-)DN*MAYF1Bm^mA}squ<$yA(Lgb- zMeOEB;Z&U7IG(Lks96B_U>UGdwej1`)q1T>QUtM$63r&h)iLem90SNe+Q<$QX(Jk# zPVPckC{TJ6<_9 at Z@1qlGLll?@x6#2im^=IJ!8gX*!>Ac~5|HG2KOwqP??BOp994#6 zTS*Ua4>2ne3mCM+(|&m75|X76=prt8z`61V%};RQHmywTlqvEgLv1%oY)|Gcfs!Ha ztTxa$Glth2Jaoj7fq*gY`68L)^bZFcP&L%=1z|ovhaJlPv9`Tb^g;Qi8H1y^9yJW$ zRbzU5iky?>5ifLKZ_6G#60V%*5Mn#m-p?xB at M#}1&!tPwB~;}U>{Nb(tKW%d7rv)Z zlnX;2 at zDGovk5c*jg5Xv{1fDCPo at D%8&;lnE(Z}#lCyst%K?l|Vzqn(bTmoGn*$`3 z8zS{_cawgb1WP6!vO`WZSP5M_wb)FYiCYMe{|ecFAbCV2&4UNCi&}hyKeC at yd7+U- z@@0bZO ztzm3$PVhcWD>6~|r#}F|QHr_s^#Zj#Jm>j-;HVhcU%y$b$0yETKfOm+NxeCZm1%D#n6qi6Sl&~l}H37 za_+(mY0oo92L#(ol*1LVxM0t3)O!;O8;46W(kzf!=;iq(VhUQAtwWwtnUpN>Gz4HJ z!RyDmEO&Ty|9-!!DeC!tJ)i?RsOy*ujXgZl#rY(6J-{m2PaBqo{d3^%zsA0XH_Q$SRW?F;9aFJk-^vIKS3^$+t5foF%j|6QL$SeD2GXF>%{aqS=ZX8?=c+{2raaT zj=4xOfjpfxrlZyh`*|eOJq05(Lk~0IO?BmkirL-?Hy|TNuKrgdyJ|3HgKoFEC?Stq zt)tPDRx;N$Xg>CYU+D}TCg2xwKXV9YG*Jhz4aiStLH?p|woWEsG+O}|vRkVgl>Dvm za~i8Qy+|U(COT8)8spwi3p2irev?D&hc6mvb{>}&WbcUpPI6d%JAKGBPk(FHSa&|y z7OGH7>x%QJ75%D}Wwo+)C7Ky=5mhH8Tjn8mlErJr<~&SglMHle8c%sa&Z at 1AI0U9q zvxXfg;0#vL*nI5GP>&Sx=KDpxF&n>CiH$nDfDg~R(~u2Uh8oKkj;jni`9!`PoqDQK zr%lHl+f`@iWVE6+;(`+5HYP$qS;aem40>6Gdq_>0l|W8H!*#roMu(kZK$7JpC9qb- zJIGGOJ5&N(TLdm6f-^YKjMBO7DMC&-2&vERorsV!)6+MV=4_>9j9*bQFp2W7#bxhfTE?u!RvMZLsI@ zaw%hMwhIDo`C7^doYZzj;JRlvfe&)iu#STJ<&Sl3HtvCxje~W-Y>pbY-#G;11+adS zl{6nt;e}nVjmJ+zW$&Fs(gAyZ{l5I>G#sPRoD^O|o0p^-SRP2 at CZ^Lnr5u+>)1dWK z*{jj^eU3$eq0&BKXCx#NfzO}ICb;|B3&9s9H!%v2>*Y7cz}#Sn_&5S`Vq8Qba;?6e z{s3esjys at g=C7jgS-ZGPST=D=f?)dUuC@=Vy3J9lV8Hh<+Me}&zn=|{TwT&B1;^xsp8wq40u*tM>V4-g9t8j1>L=1^J zX#5KN3h8|OG5f2TVC8&HV-4HIkcVSr$eyE`DtS6~wqrkULR)Ttl5XuWD752a8zK}Y zWA$Oxj*JBQVih~fb~7TtQj|Y}kB|oI31j{6hAFhw6#D2WEvhNYDAkqfrV)RpoN$x0 zO`wp~D{8g#y;-P{>YFiq}b`6b*njl&MG6k0gc9{m6;d^#VqsZL-&-GiK2 zdTmZ(d4 z+qR7^ciBdlZQHhO+qT(d+s3b|%YJ*m at 0@t=?6`5yy%8(cjQQt`H6vG!%rQpVig4j} z8zdT6TV8HeJB`Hy3YcgX4S)8YOvUQjxonLSv!{LcFg%oi6l9NIoO~G znY$3vyh41mSibxA$NiTww;i1u3}5&!DrJN=lxWlFx0`i`ENh|d#&%ZhQQO$OBkI^> z_F&rDAjeaWsg0OQcCG%NAvo>!J>J05lUsOoe0~ja|q=vq` z6ZQPcm&L-%BX+4zRf*g&WcdvTBPac4QL?DJINz`&(K$JyfbUIcf&GS1j at Kx|s1ejv z=)Q>DX=8(%YoOg6T-i(d at XLze`N+_;t=OWFy4#bfaA2BsD4y5aK6!nKSapJT)n&gk zqXXNq!Tt;+*=vEs+kZm%=v1 zxmcD(um>@x zJamU>@^%&Y_Y{7*C1UBuXfbmc5&4N-IEuvnDd-&5kk{~Y!CaNnCvL>_#{(^#pcO9< zjgygjyrD^SQ&sPfGY~Ql9;F24r>Cq-j>)DOVl7u!E#S5flv8xczH>A{qyeMhi zr*{e`RzU?q;1X820i(U~8+)uTjkT6*;I>fWGV{RA0bN&Elywv7s4&(cn3&R_wR&_2 z)9Bt6iiV})j<|t!l);_RYuZnNp;IsH%L*?#u-H&Zzo03BPmJBy1?87qoxt0|;Aha- zvE#mQ7`Y at lm;p-U`0sy=FCT`jE>i#p0xCxQzXKuvjsX8Qa=BDqQbYURHrWLO)}&Hu zUMsu-)$FIipu!Leh+Igx)*@^PC9iEDE?D>9cz(ZQeDLaf6*8ld;$1vH{Zh=yO)?%b zh3=FI$?%%xKi%2&$msb}uj^^IZ>U3}qP12b!@FFrRv2~T#E0!Va%pY4Enc2u# z7Ao3)kMP)=$785V4w^tu9^ zC%OXLlHg79VD-PQUMGIgGx}mSMN=;(uTMLlcq(8moCCSuE{9+JZ~>DVT7?DQc%y(Z z;vGq{NHxu-y-O_6Zmd*3h7rl{@XTIdgYoJdt*|ItQ4wiFrIFI93NZBRZ3Rbl?ez>2 z(j0GxE=#oj6m4SW*uIYHl-I7LseEJ!g$IVxvFJX z4Ca#-NMi~@rYQ%?LFw&JL+KqX6wS-3^T1B9$FZA_-nadi|lQ5 at TLUKXA%*q*NekW;~Ux?}*O?LeX0L3rj4vQQ> z87 at F!ff_rPd6Y#G5_~qS$Riyr#OMHrz0o8f7yHEYjNN0vuS{m389Y}M$2U&JD&_{S zV+^S?9O8tBO-2xdxcb43$uT2tN1|qD&1iU_5AW#>>A59_$!Dmuw0mZQdR=5~Z3}yc z@~*3t_K> z*A{c(wA3!n>;ht!h)g{>E16Bgx;DqaD^gTj5Nn<69tc^8yUUAa)0<)_(poRCzc1gc zH+_;@c&(_b5SoBS+Ug6*eS9Im0I-Ngwq2o|@@RCZ%cThS#7(m8Z*A&|czV0qv83vP za~pLjJ;N|z%i0|N^6XZMIag$KR_r#)N_d=b%)P2Mdt*~%)vLwS)rDs1A$^9c2y?lx zT`iY(zd+$KGqc=G2tFP6_zl6mpcz+vb1;r~;^tzE0Pu{}A+jXaP*?9^xF$dA#Hzkb z at zfptUS8%9Njg;eVdJv2DqNYc(YTNCivZ8uSI>1n@}@l8u`FUNz+EnFRopOwqM^P5 zWXG*b$B|o3CUZ*z&0%Cmu%EbohiQ3T7BBkG_c~`h#e`RL5xv~EFKMX*s*3%Hx z{sM%wus}fU{}(Y@($>|)(aGfhlkDM&q4|cAS$EQr`xG&%gwt=35p6DES`P_PCua%^ zLCdN(cS=HZx-?}q at xnf0mgg-Yej&bt$NJvBbO=_C at n*@6hoXr%$(DXLoh>mE|RI0C=DM&bo=|~>|zn+X{%~H&FlNqXd zQftQZRCIs>>ebKGeYTd%WUa_Smq&^8g*D3It)1?o*X$-cTdm+YNXCiYg0S&!lmngQGvFc9cxMr(+PbD_L;_lTx zW`zrKDz%C92o*Mc%xJJW>t&+J$29;f4=l$G0sP& zq!oV*;~%P#M4wNJFS8l5sWo{Qz!)-Dd5?=p{o15l=4|UwTBE}}iFhzn(HWE4Ez2!} zZ0lrA|I&U8l$}S>q+fx9G#Dp}0$at}M at gpo(H_`56eSX)T^TL!Z<#O5ZE;j>c!& z_|>-C{`Mv};*C at saLQ?tlr~KtT7hb9ww9^g;l##pOwjuJX6x>;^X<*x_z8Qd~$ zUz_4K^62WwT8tQk!e^b#I~8lU%0sl?8#HTw{HQ86UwLOU)HZxLlNn=j6hdn%ee(F* zA at 0}Zd{;cTXV$vf-2)v%C~LucOsu0SKf?xc=1lgP70aC<%Y;#JtCWtK*%C!Zd?~<* z<)vS5z#>{7h&mH~4{kNLs4JL!Sue?V_8h#kLNFXCC(-acRUFZ-i0f>gU z-?gBgKYE^Tdw8FQBGAqwk30nn at nXjSBdN`VeGInNtHD=3Mi&rINi zlfNeANZFL|CX5iFE+eOYhjw^kWqXn)GHdQApf|%>bdST6MAq7~=R#u^`R3AmxY5`m zi{!Hn!O0EAQ7SfIl8E`knE1}MOn<1Jc!w*#2Eb=gvcaZKyz>KFNH8&pu(M;E*14_$n?d8Gx3ctdbyQF{gS1Cl at ZAc{p|`<(kS)Uv zo}s7)m3qWh$Cmkk*)d%dvljb77_&4q(Xf}5OAqsc*EO`HG=}(w4qj7Y9 at M>Hz(leG zzIW9WyeqJ0HSk+^7$34(xy!`fKPvfygC#)be+6ex!vDrL{f~41B9J-l^P(Z6=+ zJd!40B}K9ln~MWNIWjU_7f=e=i04Y_L!Du%p|KV2Sv+LJ~S|0Z_aQIzM&vM#fvY}RLuaQ$_G<8Qtm$dtm8c?x}e$}D!QQRU3TOt`j3E> zJSpsq-s0S898GXbKg+m;2^<&@TxCP$0V`%p32O9Ge?`#j^0C3VYFIHr&p2< zWUx?cB2=oFQ=}IrW%3y}t=Kl*+DhVr}!d#y3%~uW+6*fTp)f$Gy6gE=62W(0l*+ zo{e^1ncfZMV8fTg at +eBfYt6j}vPmGx&yKy#;Y)sfa}(Y$mMlwqD|dRfP~)(EFgTn7 z90F4-a*k94^lG at ZHlt)IspeWTN)8t8=E>o9Ii>S^E zPsm9GFe{zq$W`OH&h7!p4XY5^Q~E~UjYEbNG)6Kd&vSz;ZJ;i!lfs~Co zs`cL=gT=~(>fZ)@*B<)Lv6qRG2U?zX9?Nzbz}^Ac!xU7xqS_7wXJx2!)6Svz=8?d3 z4l$1gjdE+f&a&jI^Bt}2Y5Jdlh-8 zt~vK`bxBvxo3(CJm8~0s09bFUBr1wBdFUm>9s;*LWopBBV*YV#qOLcJlZxy|9Znm| zn(I^5!JU=G0M0AVbEqb@)+#j)KO3Moki!pZHFbyB_4~0GYFAe6G3lqQng%?YI%jIV zXl5-IW^zQ;^&BA{3i?)QFjZe@bbzR-G5RqPi0pXJs7hw-h z?U)t2PM8&Yc34aI8wWfOgW?@4yxtz+Dl64uS4)k4O;eQ{L75}9vt7G9Gr#p zm0N9{sslG1-#9 at g|2C`kP!rrWNnmx+GBy4T=7)&Snnko3s^4`s{81okKIi*P`GS^f zA;FQq|jE#i*mQ(;W|>yVF2Avo;r;>JQ$_@@ukP zb!Ktqud#!qsw0ARiNO!MqF-)^mH9M$u9+2sF>)ySB${x`N~b?b=11Fq9`j$aBy~_b z;?bboi&asrcPD*3SaHX?PgOPQXz8RZR@`XlX?92%@^0iHJC6U3=kH>4LriE9n at F)W z8)T4?a%wEnx1h=+-*!7+uNf6E+?S4!N3SqTDP3x)>Pg at Z{_F_W`9-Tn0)xoY0HfL- zUtki^L;Klk z(tsajZitjNcYyTxGzg1e%U*z8USNMj1%kLR7lpr+OOiShf at p9zBpH5fzcR0E-ek zFjoki3Xm$L&@wbt$;sprwMappAK`?w|%oN+#oJhIn58(=wq{|TZ zX_ESpIE?9fs;FzMmQJ>h#o>T`IF?Pyf;WVrQ~pp(98dhATe?7)*aC_~Krrd^_%Y7Z z&$u7BF~P~$OBkA$GGOIB>CL!5U^$GqxkV_s2Vd93``Z?Gg~A>oN**DO6A)7I&-0si z^7$495=p^Fk=vG|=U0bL42u!0g_yg7WSlGd=gbu);Z&d4vFNp;CR$*Nr{opll!#jB z?6T$v8Zw8qTT<6%a>#8QR5w+%j!7oJPE~I)4ejCjA zAK~|>1adxWL at s6nSD-0hr>aO=%ur`acaYq65HWo*Lh&p>L4mn8|dKxGN0kwzXy%Y4>aD?Tw& zx at XpQy3rNu>K?XBb~PO at 6e%zHOgf6TPK$?PFLH8&wrTRXBj)KwXT5C*O8g_+TR-Pp%r<#l_GGE_iNm(9RiKkLB1E%F zmtutx=`I?Feiym3ymZg4VwpL$&~cYq9UijutYyItSpPo^D?J5o8~$$>vc{E~>X5g;uOtasHSrx8v`* zb!PwWSi$bRRO+m;cy~&ANfI#)W7_a at 0Hc#43LS3{dx=|j;Lv;>M~gX%{Gm2OtSYdG z%joFVFOPnDw at n`!Vb6Mt2C0#jZh((vGp4yxQOTWjhb-Pja!J>{=_k-DmBIWjS-Xqm zhm1?p at HfWAd{jTe5Hqg@#~H+^6Po<<8JO%9u6oi*g!HCynqfK${kz91%z>=fa{Xn)UXn~(zHx66_ zhT4UMuy+W+&duiZ6ss%Jq&reQn>vbgQ$-pK3eBjICbm?$Mf|gQXp!(JBfJ%D^XOs{ z1Y$q)p->|cFwvy=KPJ1AgdGw at 9lSny8b|P3MbHu6s7Oj6 at oSFqFF6$y-R45JBa at 6U z^RwK`rWv%fNImhcc%s&}N3P88yKZg0?l*)ZM1_`p+t`?nn;9=f4#!E z)0UlTJnHBr+eFCvv`q8S3?r4JQ(jcC*Huu=Q(9 at Duh0!uP+kl+w7CqIT_?O*x)BMH zci)e#E{Y!BHQ)#-`Tdv49NGCV)=+SKenEWIouzPvwbGRVIv#9_061^0dj{5(m0$mW zDz9+w3mm{eK*1nDKn(xelwHZr?SF)fDu3I*{ZGywqBJEn^aG7w*~;j$N^2k_5Es*> zAgGaKLetvJda;PE?yH?6yuzYmCOBsPp5 zagzWCZh6?W?GJNutU;T{5`IL*UWIaI7>C230I)org2-rl3li+7DBT*py|xLhf_`3R z2079IIn!8N6+(Jkg>_^%HbR+w>-^eU6_C=q1zkR(vBsxSWijVZeY4RkT z2_0(X5fs5bx{9DfjLy9+x>ZwWEPN&V1xLk7fZIQ8ZHpx9gTR4+;8FhD)ad`Twf+Bn zhLV4CpAt`2j(r;(6SQG%VBm>}=CC3P^gW^1gpm~-k_Z;)v$h+%&cU5WXTLzd{qx?0 zoFNp<@IEi%9KC1PWq)#HHKxow at OJ@nPq_h~M|pmJ->CiEeDX$!1mw4}f+Pxy<@uST zAnrJEiqeM6A-Z!5WU0aKB*6@#x=lDQDK9#ua>SWeN;(OvYtZru^Eh z)0s0(4;q~CTFyD at Iai`S>za(qm+%rbXCJXhhj6?$wicBFv-H}mFaMpW{5EP4YUF=TESfhp zm&W(fYxoZn3q%`7 at k6JE7NsvDGnZA1QhQW2NrJ|@*h#l(8pm1G%U(LUSoW+Ux9pbS zJN93!hwPhq@>Z>5t~zS8EOU6bXs|-h%Mo7XNAZ*CtTbCney8Gg-h|K=th2-}yg at p1 z`E4k;1YX11|F9-XQ~d*2qlmC5C9zaX#d>msu=VM{?oP5R8aH9d;JYKkRP~ylmM)xh z at sR`LV&!Xu?p4KTRtK|@tHQ2atak^A{mIh6L`6Qdr>3ZGla(|k7;O5xXZnwj!w&`- zaA&JOhl8i>S*D>n3Iu~|+(iti^2hjl1$aoKG&PyY6%%&E at d4g?F-gz`_g9`)VLMxk zZJ|Zy>$fvgZ`GNhMV5u at av@e;7e&{y3iHy=e#*>NwF}*ry%QcIb8QE;iqhV)9i+nI z+R?Ds6~#s~+^MEZSWgIT@)+v0ky45A8K;9I6=yW&#z^jlRp|s1*KO^cOj9<>zxI8l zwUuqvmA7Re&mnl6 at mpPN-Mqd;^^e~rNv+JN9Xl#-wn0*u1UeVbzgsy)JZG#mRDDHI zjqHi`2yjuEaJF~68L??^f&o}pW*{;?tVh>Z)2e0WD{1G`_+w?Aj36|PmP3v0^Cw&F zfk9lu_DA%razYSA&}?YcdxjuYFe~-B{j7I-`TYXlaszr-%J%T!;L5_u4$?vdnCLPv z4npA$M`+3Mq<*c=%dBu=(`ZBb=^nD2O6?V5GZ}H9lC+i6O>OjY4!U#QY}CtQdOk`V z_zsr~*gaE?P2huABJ9yk4_y|BpUDyWKZdh%5%dLjit;!>mEHvql8TcPPnawkn_0Bp zS?c=r#_0*;qot1}@rWzhaqU$W=1t-b30|5ZV?{Z=#}hb=i$nMVggjBltsXGYch_bG zj?zU5T>3nJ-m!_Uv|E>*Q3o1$?qCovhZnn&FX!(zr|&l32bAWFV$U`MEYQOUai%|l zd)G$KcEdly at r(S3S)ATDMX@=GyA&rp{51lk(Q at PB`%SFJ&?CQ97f!WeuL>BA(9Xm4 zZ91I89m#cgPBjm2cmN%#`t)T2aL54ReB~vjTxBBymM0u$zhTOadS*l~$(s%-o{OJx zML+BYLzd309=5$=UT_PWKNJe7WTYBDZ$?w=s5973=6z-4UlmGIyfUAl&&`vaorXX0 zn)tZ|$aRrdKgrk8x4ZyKiKsP$okt^e at BU#nLRNzP at R@aZw!uW+OF{Nj;kTwxgO-Sc zvw=|3`_iT2345;(PPNlIk(DOHfZx|A`2;) zgCQ-sW4jcu+^TGsM=#)#f at 5vlc)YMGhfcaq-{eZZw+%NP at _Q9O?0N9oqj`b%zU=q- zZXoz- at 3{F8P3UsT`a7PO&tGK5z}~AM^nZ7*1^D9$43&n%gGF% zVrW-NJw^%1q6mit5w_GEVj0}Kf}5U+Tzmgq%2j)6zQXe>pJ{MXDwsJpck%pMVRU(G zk#mvz7J2Mp9jb=~r8B?E at alW!-F<%kYe5kFxL?Nvy0G7fLvP=X>seC|K3)Ti;kPUI z1NXK^A-cU27f||xd4l7?<>P&NE4(o6Q3i?tm;Z#w7edrWdcGY%ia!9z%%q*5Ai!e% zIfM%R)QB$f-HLh#+hW`U4h;;huA~lKNCiHxN0ZEo#IaCRGEFWh7dc-fW3?HFdu1ju zLds&3J~|=9tUHeCwr=NBt}&Ltm9lq3v+bm zA>NqLaNiVUgOFy%m2+|7p)wQc97t%qT293fII7d5kPghllIc zcfoX10+9bYZKKM>lc)4D9%9KXs1}p|X_;nB<$X6EK|Yx`i`>)QUgkr#DK!;aJ=EV8saBUz$_C%m9KjQ^#gl;p at QiUnX81(X1kcz2 z7pK|LY at Mg2dj(T|4__)93M>&uW8ssqk_&tgdlHzT`~g$3=QcUiT}uI7Y-5(zAf{li zp|q$1C%}>s$82>~=pZroc;HA{&zQd0nv+#GGP#D^6{K=p8r7;kSXh_kB5kmij4Pj> zJ~)i-x~9}IVgRyxEZ!G?QJ3J=X(s;YH1#7_X`-IV2$ntLkA?(2)3s at nsrWKnLWVg7 zxJuT15iQ|y56NgY=_%q6Nqe7kUW)UFC at nd#*M^I&!tdR`rn9h5tcoqc34^?qt(z`jptOj8YK zr-_UV+E8Uh$*nfBE{doufh8N9MS2}JhH^?w*_aRVW3)tEaw4fsX!cx--iV5G%#`%Q zRD_7bc63=y>4k%*s+Xz?le%98_Jw%Uj}=G+BXJOLYIp=ZX^T29Rl*l}HO(>KauFq5k zFU=!tpLT1O)TIaMigxee=Gw9&_g;?HeDRbrWy=-0BsqrBSaImrmCA~tO%-lxD>CAA z>~&^gKw!npqwSB?)A6O`YsX(&DbW$^9Dsb=;VS?lKi3`T at cSUoyH$1B4V8}%eOVl1 ze;CUSmrz8RDnV^&SY~mTo`k&Ws3$*IUSB3KAy#ZfPc9J;IbO>c zwcIOPT8KahqmD9fphpqaq{uVb_NihdZ0b$?^!^3IP|TX)NE4i5;2*m3T%tUaSuUR( zX}=`t-MxifnTOVxHVqCA9*!^355BUyTk;qALI%D_AW*T2ETZ|4NPKflx02DP1Gv-> zYsai53f{OxneR#k(L?geM#cu9Uy3QdvKDWlhEMd%BW}sXfcZc|`dxL at S}Jme44w zxG>9EBZKD*zwh6-1GR5?k~fUa%Dyi5%`hRUx&oDt=;otxQ at Qb0F5!HeDF!XFecOo` zjx{GL4yzYxfgAOkEgNPN)+YvpBP5}3$Ak+!hVvVK(lz`L)p$Z9>$45+jAi%(D1S~s zQge at KJz>s~#p|uNs$kIOUT{_S04m#l at n(LCs-HOxpqcpcA1bWZXZCyzZf;FReKsy- z+PYqICezy*BKItVX(A&R!e0PFXxwovLE{I5iGL^_T}xTJ0Z>3d5cvNM^Zl>DMvo?} zI_?z7EJ82x zup!bo2IdGhSmT#i<|SpbRF0_lP1#a-#1fJ`n+205E*IKK;_gbL22dB3Scc$1EmR36 z%|?&2??MLzGjmnQ`SXfSz1_N<^tCcm3L}f<#KXqQpsQ%r3>Xv*YRh1vI>!!ljT&kj zMAZ?oISFVaoLH36LA4>8i;KyMbvANMZcmyQ$BsR|TH$iqiR-<^*}*PM$;st$VoI3q z*U_msJBByY=PAnhy>gs4 at Rld5I4ev}!>BbNL at tTa!Bodg)FvgdHPf8VSsf=yh;&r> zC``om4J at 3yI9cjqrV=t~w at 2-ZB-QlfY3F?#g%(=ydhRVMS?mtj?H?31+gN_~Pr-TR zq)YJFq at r*-hHe?@e>Q)1o*Pevin44e9=hV&4-2~mCzBMTH!LNp@~m82XOJwu(9Fj) zPhNR`@eK7%f?LU=7*WN2FS|=jX0|$0(ewhyH zu>>5RJSDX5d$R8gPjyqngm)H`NUIoat at CL*|C-Lw+D~0jNLC;18Irbo_+wN*J<>|r&nXanvNNiS9aifQcC%M|>$#0frtp?BP73b+|6ZeBROQ(>SweW$&3p}jl zKOM#1Y}1UA+R||~n_L_X=8D^OGnvL|_FHNOJs`WR^Fxgc^E~*t;rP5YW6d(D;@(bR zI>>h-AK?bO8#~bpxm1m{6(wp>?m%@+!Px{eBySFCqF~n~1cR&~dgu=5tK+Pckm2Ek zhm<6~lUaFp6oEbO>zo1 at 9!hh|v1NULv;dV0|wCNo9l8JsG^kLpX^3m;Xu=fTeD=VUZpBc#>vKTe2C-LYqE%WmTT1$&cy$^xHi^ zA-M?=qtZt#kmVg?OA}CT<&ow0Es!OPMStq(M{<_kmWM<0O(N;wC&IO3E~7QmtSUAMD66MkwIvDnml2GLVdd^102aak2B z&?a4JIKR4+`bV=9UWu9@@zl8p<(^fD9a4#A#J+f?N~5B|W%L&m>YcQJ%F8 zvkP+ykerW?>U%ucvCY3ivuHb`&;Y}}mTnn_?f8(<G_ zW*O(MfF85&L5nR4;Wx}h*vt&!*0F|0ckHK;FQ$Fmaj!-2iqx2{8nK>qg$^gC+!rs9 zl;~@iUtWkUEzX0d5`y;0ySat?T;J#mEL`xWF-8>UVvF+eB?cO~U^X1knh&WoP$VeJ zOGMIloUxb(;W9dJO|1PKmj8Tnq+-ef^Zi`PdO$aYpms=a(EJ_f7d+}*yK&gIs6pc? zC}+eIdfgy%7(wzXi6f6bQD(uXOZJV$A<{4{D9rl1xG&?Z?|fMaaV?ev(c6UJMFtUy zSp?U_c6xEiYei_whA31P8#Y03+twyxb`3A>ZkTh-rdmCou=yBq<4>6Nt6U=I=hAp3 z9YI^Qr@!YakJ>eRwPmwCjM`niStxjjThLP%a at I0l4Tp$t&$Ag02pX1LB!?7exk&PeRQEs1L at u8BD^Cu2LNwMgsz#n?@u<*JAs zKpeCSQd^TzOXD|(Ev;%AH;F&*j%C(*q{q;2bS0Sz)>bsmd;AAfcSAmdVpd(UYj at Vg zkuiAf;o1<@-&>bdJ6L@&YCo(shv}=NfN<>tv93z8J``(nfL7ILw^YR1+m>LS6~x+eS_X3lyXe}1X>EG;$4Ok(M_Ex9t;WhQ0j-CNqE8#+ zs3{3{J#xl0a;Ap8kO20#=l##6dp~1e|2M=yOr~5X+rbAUPt*@*(1Ba$8m at fbCVbEUl^B}@K3C-MfS>Z(VfQ7W1_1s*iPWjoZ z*l^_ofpZI(3uLU-shoWs91c3911*D)9!`uGIIA9x+Sn4~hQv$sh&v zmEu5=>4nN3S|N`x4@((ZNxaJEL_IW9GocH0B*zlKIkL$m*D!dRZtz{>;=dpsMPWnL zwT?&iQFmCSAFZdmu6Wy2nt~ubC3C at s{QY(KuXD zSy&g?p^~fB?`TGD6 at T5(v z+z5}cDvYD-iW^n=&0}okFfj3FL;>Kv)pW=Zxh3eqT?RV#E(Luu+6EykBlvmffS`4dw8ER_EYt?@tqhOL0zCp?zf+ zVc%x<>yYv~!uQB*mJoM@m#(m0mv?Jl~_xxxDh zjg51P^3-pOv)m*-fLpMmv~-38-{e`YU)o*4b3idVj6^I$omzg9q3v^;gYepTC&|i^ z3(JyQ(g8oAkJjFVY-5k+a+5u^^wbv_T$P0l%Uy at mgf-lU4X(tW_>&4e at sJ|Fz1)st z4!7n>v|725M!LroZpyn)jq{#q{HcJzTJ&(nBK@*Ij2Ren=&`xI8{J#hyWf+rf{&iJ z8n55aFGq~7NMh#5UYm%*@1uxOb!k~rF*HtrGChP5|ID;~d2NVCYTzK&dbRsX5PZe_ zf*0qAsDA`}jOE^<@4)a|B6Rz#6hV3{32e>z1sz7 at pKP`tzIVlJ0D$}cK at NVR?d^mB z`3uy5{WrDff3{I%EdHK`ZS8Df^KT+rjf#HllfQ77aO^gg5g5aSm z%q^v4saE>iEU+)*w=+!LTE+cR&LE>HzJUCa?`|4_QRh at R*L$31x14T_O#MDS-thZD zm+QDI z6l;afnNa1rUYz-5O^?gYfojz#@()wa(mIcd6j2ZmmOOh;s z^&{BO8Z=Gcj75JftPp2OL~ANY=GdA;s~CAdO`ebk?LGy_h(L<`374GMJ~WCaOte;G zIR{bG-4Yua5mV7cQ!sXa5e&j&?~XHHkMCphK(rd{2?I5F3mQxgxNb6*Zt!$CRM_oi zd%ZvOdH at x2`K?)RKcK at qe+;PSrn*Xd^t$G#Kf({rf{9z!9zrfaYc1SVu^q at 0DbL3u zRDx6(`ZS0sI<-lG?W9_7ijLyghIJ=iH5)OZUzz{vUrWyEe|*wZ+;&J- zZz=)M@~GkByUkv7+ODc$Ec34x)Z1X#@TYvu7 at b#Lhg%VsQo+g~m~8;?O|^MBwN0wj zb}Un>jAdO_iI}u>tgj~97A_z+T63oe_&Z8(cv#N7WSCvH{DKV*=FFtata_{gER6ez zDH|J--7YX{{LncIidniE)4p|PR>!I{<)vB#T+LSOMX;-o2D@}))}20eMI0_%4R`wu zbRlMcsP=>ixYHq0|J2uKkHOVqYanX~0Q_I~VxP&Fp5scnCKn at 5@zIAUxx8GF at qm9V zHy7=M9M5^y1m#eQNHa~ic^jKM;6W;X?Cvnl%1#jhgKB=k?w7aIF1Gvgahe8uf?y^T z)9ELVW3_M&qa>T2y^!;qs!_E?fXv5ZOK&!gEgtpl26gYqy{0_x*+o82Z`H7F07 zBI(8nCF;h20Ml)}vs?ZE6ooMHC46{{On~@~ zI%4*xx7-0N%CE$iNHEAAxdSVd-T0T(VK=f~%za4U;i5)E+>>S?CE?W!>{a6_!&IOu zI at 8KVj$s*T_6OF8ArL4^F!N~KPLruleljbBDoB8Yf4m{fx+#dW_(oD>LX-&{X;A}~ zt5axfOeyn7EPh(e74f>EQIMmSkuC_>;V4$ER)&g;>*Pd9#)JfzMye8Pr!_CdQ_f8Q z=!AoZaI8gRZbXh;9I2Z6mIUWf(PhP8;mtrm?ST90o`O0eP8)yXPnF~8%;Ez5Ib%3{ z8a{b4j+C)=YwP~>;c*yf;FX!m1DVBYU(3YB*{BxMw7SidcWmGEYI$N4cjiK}Tg9$PQJPs9uw1Y}LQGwFXwu){Ts z#CH{)8KCJ#dkWmtFmrIGrl-)r*RY2a*s7{u696MfNL at 4;_HzKn&n*cDukFlKw@?pW z*Nx28AGtvA$~_gIv!&O6qHmVDlKg2EVs_S6b9r#LD&~ti&U{j=)G_))mQ^}bVvQFk zS?uP>lQ+k+ch;I|BvM&Y2>sbeeVRV~TThqMdVSOhFG8DZQbmS=%BT!a_8!J}q&ma_ zfwte1kawc;xC!-jVwvlGqz-&51JxFHoN3GPo%Vitw&!Uw)i9V@;i{0->ddhJXWTu0 z9xH_gvFL}2F1`gLuR3+VH`8#9xPOdT(}8Uuvl5pk%`mT6E&5?Wq|yOJbX*u3W32Ya zfrhEn_7VcyZgG4hj2=9L_)dctyR3gJ%#3_>BhU=yo~T$t6%)LRGOy&-;BOk7Bw4bE z+rZYCWSfH&^8U{8kCa*rbq-?(?RGalhJh+Z^NO at v5tSO!j&A&adIkI-$ZvK=x$}L^h=8V?Y+Zh`=T373ZSlkXi-;Pab z$6u-!@yM0nn*n9MF&yw at 1}X%NmvmVCWXwuYqiyIG3E*1lmTG zX;b3lQ^~MBrlS+g+oj7z&2IxC=S=nOwVGy0dg)=Ryk5gz>m}|PoCVMmjn4W!ZtC`a zjO)+Z5jjVRSc_l}V(f8QpE5BcG!B7w1Q)3k*3hpC!R-X=?;(UwyX6KcA5B<>m6(hMD at heLQZ4JDuL$RhF(o3V{r3;fltktJH1t#;e+~L|Idef=D zNn)TCVe{BcUz26yjxxBYWLWcqPxw z7uSWovWGYvCN}Y>BGaI3L6bi)CGok?vw)Yd8?BUuo{s;Cu?ZWsUuH at PTN-9Qc6Bs_JZ~_q z{7R)ZIiI?vT&gzq(3d3dCE(;jiL;Jj at 8qY6ZR}r5=3l!{MBCbn5^b>e;aymeUuwI| zpjOiB&-SjEZ97K0>c!mS`!lbDHC5;cb{vH5k1d1y_~)RjDzrKqn6 at G{_U?9G_G0L5 z^MrNX2kCwz#D6^ej^0yav+v-AoN9>sA>;E3=-X&Hn!SKU?$D2j%kBbU3^)DXtvBJe z0CrYkyk-8|d*A_{IBl_>+*jZyckE~{w*$wh>5w1zntV(z&i4Uc^($P5q;rrr1q)3z zN?ewg?rStsX6b6xPi!W%P8WBCG4m+?#?)bgIksSG$P`%1`cCf+U z|M&wIhP<7@{FSYB|2 at +5{}821I-58e{FSQxD^p9{{R;yijrB>_ at pH)u4U?=8<`>$i z${9TjaL7WHLM-T$z$4x^+i;F0cIi59V|?a$&tb+0ygou(|=I&dbK=gCHo_ok#1CLcX3gxl9sp at L`Ofg4|iuY=t>R+(9D8Je><(|Qj|Q5BVJ z4Hx`P3GbhBU(7ud at fH#*Pw5aNL2A7LK8L}kg;&nKKU|89$b`4aUlcpOO!*pEmJKEU z_=P$>xlme0Rz@#tVW%0hGL*mzIwvO-tSRcQr;=T#Ds9-4wiG^lau{Iw=I-_IvTpM5 zk;l5Or~(bwFsSb(4stQga01Iv3fXdb1Dkj at YHY z2A~a{CJ at LoJlKzVa(xmwQ{IIO1XwV8V;czMMXu*PV~jX{AFbh=mSNAZJ5b at eiyidj zhW5RrI&0!5WwaL^*2sHyo{~wQQ7Ww-= zsn|){IyoEI8kzj9^ZE~#M~(WWD~dYWmt4Dye*-b5k&#`6;ZY)3OoIiGVnnH=h#_0J ztSA2XPYMLk5MtHcV)?ngYb}mU*P7Zd8^SWgIoCW^RAYZFGKQ7Rrde(;KQ92_YTfMR z9`MT-)E-;@6KklEFi(FZOtJcnIaVH2LxjWM#Tv{WGV8-ZeXs|}do3~k at X$xl;`Gzq zfA#}PUwaUN^K&bXs5kz$B)AUi!=xnB;{PG-Eravunk+$~MUR-7nVFfHC5xGvS+?jA zGcz+YgT>6uXfZQbT6b^v&h#6z{msrsR8>^npEo1V&8*Bk$MUU4JMo4+$W#&QP<=qj zMz%wxw$cqKyJlRB$EZ$2t{0v7y#|Zzq(htSpz_FhKn=E|qee}XLnz at _YjHAQ$aYZ; zcwv)K+VDOefU<&Kh=$2rWZW*tl8uJ=%|V8hjdf}lR`L#TRXonXjXiD+?3km%T-1&^ zV2(1S6&IhOWsjb at 6mM-WRhC%sfsuZhR at aE`D90LVff&g?QLGptu+IkYm|2`waL56- z9C6tbeuqW7 at VUQR zKX4fxj_7)YS7vrh*I9L1r)3aO4si-aZxj`h6Q~VTAxq|LEPJk>Qjw)d`w77 at M>X5l zWLV2H(*~M(?|A0(h?;UO6mQcL)Vkg$MEnW;tY3;+IQ#LK%QI6h*~#hZepR4SDq?U_ zJ==+vANdmtLp5FO_^R at pF)=EP=Ml|QDj4~Sm9k&z*~Vv5w9N+W)E at i2l_pwSS#R01 zGu;>RiHbCK><V$VMzN=Z&A#{=JpEv85Iouz at D1^ed7v3J8B4S-n;*Eg(iw?W;?0_O-sot{ zvZBMxg)1+x>9y?lys#kV}qtv1;o0|AhX_2pJ@>YUZtSCcp3VjX9mQ%b2 zvKO%h7LP%<%CRZ(N`I&fw0NzS#J}Ip zardJ04$e-9bp;OMBR{kilLZ3fJZCkS7 at v)&x?LBx+!E|}OD-8?_na4ZYoYC3ND!GP zb4-f1&h2HbAbDkIElbV4M&pXf>Gx8w91iSoX5wp|-rilmeSE3L4Z|cXGaWzf{rnA$ z at c9o3k+5fSx`w}Bc%UF4{Qt+0_n%B`(fkPgOn{KwS6VbO?_h*UF+dnNQ5+A^w>BZ1 zs(BiDBx<~v0B}dD;DBsUou~W6>Y3Q%O9Vrpaxj&MT$snFGe;K#J?eZ_4P*2)J!3V3 z(KRb3&LzO%!AkqIk|IiT`a7YFrfnPdn`khxk&$mT>^0nk%88z-vrpM5Qipm;+miuODO(R at bd5WCzlET+>E$48cDRj z_`d)E0pa~W-HiVvtknB=&S)FnlifCjFUR%jODfW^A-2;c6aCe&ez8$ zmJm$tgp{Fte at 7Hn1qw%7cYmflHe-H9$!R4^jgf5s2#cxOYoH?8BAITgV-P4{JjKdd zVM)n{zj}nI`q{0pnj28wVs44Qw1m~roU%mkPFHDSDSqZopBQCiN#EMGbor#$Y-PEk z-Z>dpbB?d-_KrZm5!P0v(pk8z9tpH|kI0FW$*oL{6jv_ zTs1TA;Z``B$UzKhG`(1rVtr8-Gp#3v7oM{2f}KJs5$&O#Nl8_eV8k)mVnfKJK~cyv zI;oOYu7ahE;CA<*107Rts(Vmmv(letH6Ci5GUnhE|%~n`nDvKN@ zKt%A&vUc at sOaYGMIE}`*vON=t0f#Q?Jh(l$j`+|jz)&1VGc_le3<~#{vuoJCwOX$d zOVW?kzk at rcAWm>snHTkycUH`;yhvj+V?UQ+jGX5Wr at E5xCgkILT~l^R%4`#iTp8 at j zhwse~asdz}cAQL*IO&gb&YIjB at 2hZd!0&b>rD}BiN{j8zJ_ynYNx%3kG#oLsfD??a z#4d4mz(~{ps#&h>V0~$)KrTn8-iXVPuW>b+Md7l@$ zB4k#I0{R#)ntreAXE%Mnw99Hg!Ti81; z3>C%44%o`@G$1x(psCUsFM{}S!jIwPzwMDJKgs-jrfH+=R~`%_RL~7G7z)k#13l8c zAG3$Wcyo&Oi1P4t_zzaPxWV at zwZEua4EC?mnEyA7 at l(-L>}NvjhBO5$ctI!hB_)n8 zV-rZP3lWoIBYQ#C@@155Omd}P<9TR(-9@~S#Ad{$`F=1kec63^%3ZqlK5~u=qT81b z?t^f_>nN0m;moQQZbY*Sp-ovxoykg*4tpxpK<2bToA^GK1T{>qgdM5GoH#sc^^9t%1FR3<}LM!lkLv1 z?+!e!nZ#&V&?0f&eNNaZq!!10-pir){ZJ?Q1Ep|M}NxjUB#eXRDXn?+bi zD3tNE#C+!W$y?tKs?mPCwD0r9NKT>Vw>pNbe%F*cG2dCZmCB6kRxrqTIZP1!fqX`D zjCj0c%*4yrx3rK$2I#d8uQ^P&-CU>V?+p*OEQD*I;G4Wx${-2uZ=7oe7+(k)ZgXqP zw>hYI-RK`oQO7uXd}@mjHPta%qt?u7Y$-2^6r8mcpAeWM`elcstn~e(T&@U*WAF+M z0wPZU0z&uS?v9$Xnc06W!&QHe{DHQF{z(y=U6(Eth$JTzB|~gW1Zo$Mkc0z%l98H# z1>3SZW-j&3-6CacO-Mwix>>ujta!E6uXTO7r65j8Im&OPXXo1E-Qi)y{hjNXcZdIZ)8+c8`K#L#rcdKTbBMD4g-ie)7+Bi>!X{9-->CbV6)_Ww%Jo#_CoWcw`6~fsVByvZkV(E0WWnLc*~~`eSkOJn6}rV zW#8Es)HAe%+3p%YBul6NyG2&lJ7fqiQnUSXL-!3K^19)LAo9A=Gh+zx`$ybR?DwwW z{Si9<{{2!K|B}3`GUg={$^>s2kBg+h;U3brqV0I6Nl(d|Zq;82#4elj*>dAbbrKbe z&0cM-E|}#EnTrS5q+#05ePLKixg07b1cb~gRtqgx5my>{n+luWwzQWgDXjgTOE;g? z- at 6%2xXt^+v=hzO at uG3JQp|WeM1vM!dESiO3rsd!Mh+yP&{12K@{iGY?D?<6s<9d! zJ?YkJF at n)`MP=wyjH0kj=u4K2$yl7W@}1YGi;NcuBZ>jmN=Q~)RLm%i2Tr8FT>+(l zLP1nYpm)M-rS}ChPGi+fQ&fPQ at uC#`xvA!_y_)T8UcH$?Hygfl?B8rE6(%cz^d588 zo}c(u$+Z<-Zpf-S+ZH31TdvytB**fV%)L%D>6cuh_wbX}jt|hn^JWu`?CcU&3SnwYK^uEk-7>E>em!?1e%cz`GM+5O3oa> z3pDaB;sIid>iB0 at ubwWRTHfob?>Yq&g2ca-Z@|K1$Q#%ZVKB?I6`$_~5~m6b#Kzpc z5Wx?XN4*EL2~1W96w_n&%*h~EyeCZ8^%HO=xyGVc591_J``h!IsNPGnbybBuXTsCs z(JbO4a%nBiFWndH8J8){-lEL7tLP7rn(wHqa!L(`7}3~{Heer6e>lOGL~3%Jd33u5+u7pgdEIvK;|(urejHmd)E#m3lDRFUY zg2W{U$Y at pK9Wzbjrf#6J#F#yB$y*i!u882tkEvIgzFfiIDvY?P6ZO;%RuA14a7s^2 z>EY~JlV{>!`1$wr at o027C8!1GWAft9kNLlbS`^`)mg?K`O9w4u-zo*~>K97kp5pEoAD*(khy`}$tX5`nwhZ8jPW={mt zm92HCvO|pQAF#d4j!;)>x47`VL)TPlrqqdUmI1iVeqhpy&Lh`aAHoCjo`t|mI)Y)S z$fPk&9E821z)CV7u>oEux%s6TzOS-9#TO9VHXTvG4|7_N%9luB at 4f@gXU!hrrXR%D z;tiwuox_J at P&8TL8IFpS4Oaj)`~n at q-cO*%-WJYwkPrK2Xd=$`u-*00ADrz_D7G#_ zL~GA5VZvcj90Id$RXTzLqu54IFv59997L+N@~E3ph2#WF*IC6SSZ%P>inbgD#MNni zUXy4 at wHih{dnR`CHe7x5S}K13_U1_RxcDALfOSQalINQ_V^oO?s#~1V zK}g>*y0l!4Oqop^E+;w%`qAgjRoyq=LS&O+qio-HK~HZPRVrdTD*mth3k7FC9ZH3R zO_E1Cs(8JtNqZVE{dtC4iUvkUuwx6Gogm`z_I(1C+@?h1#^bPU6@ zUFE6z!Opv2G$#%i$ur at aPXr0XZ(ttYH$FqFI^Ff5R<@9SxL&r0U=_cWwtoBbMU8_D z^S4F2Z6O<@Ad#o~v(-9e?z9f%u3z at M*IIO9E`hme#dw%vzYIAN-;s-5v+L+-;GxX?z zlEg`#Vh&(MTO5)tc}8b$m^-TLn0})*uS at 8Seu$psFi4JUmALtu;#Wkz2P4iMfX$Lb zH3!4(S&Qv7$4cT#0*N$_9pd^^QD#=aWRVWx6x`Avdm+tu?ut at hNlKPMwbP~*%4s1i zTD{tXN8S`5e!XZw6q6A3CvRN6nB%`Jk zt4tJ<7yMW_$Np0)gSGbIjpHSkL%d$gC(6eldDZ4@>TNG;>?GUHd(`B5U`LM_({lprx)eHmhw?Q(HCD(&T7la%W`;XeYnzXFGTK)( zry{?80gtbGHfRXvFoBfmL>v3=@;}rC$mT+xq+0mJIB$M&#YbP=l=qI&#|~1fX{;wy zWx}wT{?VIcJ}Z!pd%c3_G796B7}!T2_gYt1ut*86t0)%I>*t6O)r1?8_JhD_UtG*P zEliKmdugg~-6mjk3$t@)r^IBeY>kw^f}1JF;w`}&52vMY&{AQE>V2|Zslx4aU*Kc0 zifXmhY1?EEkw-Kw4^r_*n9U{Z+$h-2!#BfVBV#Vx5Nu1I{dLqR};Sk1_ES~ zJ0C5U!ckK9a*o){`%XAKT1XK`d5Sw&IvTaf`9M#XBcgm$Ts$6VU`EpyqF&^I>+x}o zGdy;FPn%mfk8DjMB9B6&??rX1HKOY239|b{^)^%1ny|LrJ-TdXM zpV6!|B-vq{ysVaIe2T{0eA##26Qv6hWm-gnO}+VSCUp(!6~TCdmm70~itNwQuZSWL z$HDs%_06=#Zd*#*#-gMnoio?|Gj~p$hjsMLCgvN9;dhA7e>7x)#$m_nLx6xV!2YY; zSi#NK)BYiKfdm8e_CC*781(#(@|Q|JXe4|e%3wO5g9>7eiK3LIqJp_M z0>d?~f>uqgr#6ul>2G*u*Wt858Po%l(0R(;i?t zo9NK<(8j{zfqR;oqwVX&6rp+Rl5v at mDG#}ti zXOU%ZV#E^`Jy8?cT(*JYi(&ygl6TqdZF4gzG~#*7Zz*1J!*~&EUJ{*}yYO0Q!duFZ zD7wywe039s=h)JQBn?iqyG#pYUDG+0vw(Lm{hp3I+7# zz at Zl8g^(kvVZLz*rv9RJl at fd!8J>ndhYDr=r|-PmQkyB&u`1%gPXoN_fUT}|f;MyL zOpYtRJw^s2dv|N8T4d-?#e;)ie6cv*dRMp=kGtQR`Pp2&`BkTZUmLz?^gbs0#_wy7x!(80Lx>+J zWV+%Ieu2Kzp;U4Z)PMu_uIb0R&K?Oxr9$QDon6~hlVB5;ca%BXD~mz at Lz;;5rc|Oq zeDSE9txfC$>(TpR_)S;Bt0F?XkI6ML#}rtW_91NEz%-I8ml!ZVveX{|o=xfRsJBwA zinuoBKSbzK1%rK%zfy*Ld$SiNaZn1Ui$4m at K6ryExYR7N5D=^>5v%}!d= zfhQI9Ld(ou2jg!Q2Yj_q0jW|dQk1d*mcAmE{BtDL1?2BOJvJ?KN>@^B(tL~pmP1hT ze_)SJWgom(Q{NbK^R6K@*S+-ZVB%mQrCvb`1QuM#q at u19$&mF)lu
R0-}rn0>bp)|H*T(b98XCH~p_zRjjF{iKdD4nW2TBK~9AeEOu*{28pG_hAg4m z2N at Ixy`RvWZWYSGzqPthXw1==!FRMK7}s?Zmz9_|?BYCWlXIUSn0VN^B at fO@FWWD) z)8S_GT4AsLcr&uo`}xffWQSrFNDHGo)QoT0?#QfHz~ixZ(&uLg76Qjwb3R=%mxfUdL9 zSlDx{dp$XM11*S>F;P)W{Z?h2%)ZdZCqNP%pyoC#IMm9 zt)vPph$#X<*jA7d at DC)ItmZRcysXHZm`!e zZg%+L|IZm-9n&TwoFwBC!d-Sze(Z12cO&vyTo z=sr_sIEDI$9{8p90y$y8)!w#A&Gmxhzla3g+7|o zd61G<-Og}yhXYN_{Auc%j~7H=7`VZ*K1Y0jaK+NBlQp7ON}HiDTE&o?Faj^yEU^Y^ z)=X!D{A}tQ7HjGorD*CK at y_f^ap2-hd?4#PGzhg+9c6S#R at CZ0z%sqp6$PVv=vv+* zMW`E at yVq5kn{>-g5H`X|cb^m`Eho)Y_xh)XsJ26=v}x6TOGl1aXRM3Z$l8X#JsQ)N z&4GbVVeTP(SF00WRVLq2X63cu^GAuscnF0k8}*)?QsozvO+2 at -%qUqas)p{pImS*F z?Un)mgtm1%o%?jW^kdECW^;<#sFjZi4c1`{E{KV*?VnCP2`$s2N!YsoS5nZNJ} zrL)KhhVQW}VSm${&?TA2yB>T|oO_QfJ4q0MHAV%=cyzegJZ zL9z}0$~VjzlVI>&SLA8oQ8gq-_fA-WtZx*%O!$x0yc2I0LH^D$TrDx)HH4n!mL9r- z;)m;`VyqKkk94FxQTU)jDi8_gK%eEq;w`B8>6uD}!As9-8pcZjGGe#MRPCt=B(JPs zf;Pc&^dp|MPwad%G76vEJpF!A*Z4ScKG6ZCHu|hnufSoX7zu4sL}a^Yx<5BF2KnTK zkNP7LDUWkAe?XY=_wD0mNEIMR`K~4KMx at 25no%jKP$?**6S5q?MltKcW&|Ug5*wC*ak-9*yUI4-%Sgnxf;lL`pM({aK7cD_l>s0(0oxp zTCsy443-nky1%G$FbMlxG;7@@_r#Y?s at -Q#?*CUX++$S>Xq5=vz$k zv*Ce4lhLLWdqkA{=Hhv*TFP+eU1_*XDL*b-Z=t7=Q+4QQFW3?wi89d{5}m3`fyD)r zQFTYTQ|@?@^Qk$Ko3i#&iD^dO%;fgLi$Gz0EUoF&Ws)V at X4VcRv&^2{yZU4;u!}l7 z?EtQowz*T9O0W)m2W>t*_%MYUsN4Giceh{GOEu at 6Jy|Z)E8k!j at 8-K=sg<#Dge|yQ zWq_+-LMyNG#tVsRUlxhjkz&*I$UneLHRB^@eO|NOZlu*x*$%Yh{!{g1+{)j=zSJgT z`|WT(S*9(opkIH+`IDlrbzX>=lI*;&WnKU?nU8 z8FQ>2q#Hx8a^1+0DCCawtCVoi#5J1l%+Udve_tY*|6wYS5{#CZ0X|?deF^NUwhKD%lysN09nwLd%F>*IIsufvTek#z#chYhj0k^3MH$SSCBRND9(8V_?>*>

%-L_rHmHp8C&b)Xg~TS4`0p>w zzi;bxd4-QC3B1%>#(3X0Kn`xh?@@2DlznM*a`#+lOzzaC$Fd;pgg>LZzx`M6xG5ft znFRv at F@**Jk^KJz9 at 6$kCazZQX8&0KkC-vZPH{o$FQl~k1Tu?3A)u*=4cb#dJ|>fj zv9Pc<uUW%&?U6-GjOj#h&Rt&tRsS#Ts_M=05)7{aV<5 zn%Obv1+Ch3!jRr1lmJ6y`93aWBGoA|!pZ+lqi~9*wY_yXPR(Wr|E-+s{oBCz?2X|R zhf8dG(H&Omgj!ztt<5<-h9_aB(`K(wqXzSH`B*}1^bww-h!_*ib)HsiXZ8(_&4_Xj zo^R+HXYwQS+A#|(@X;wLCJV7vIP!|Pv(u7H6M*y*fby57^&cU at d3M!S9Z(@G+FSy9 z{VrZN>5O5U4ylj at EdX_D>$)1#^L#76JvMLG0QG$!EZqR>rrU-)-_}8le2}8-IIlcn z(0YnP257~S;P8DnIEz|L#0vqZj|AUHG`HF(Sqkw6z-g~5$WCm371Z;`DlbI1MB!$p zqf)C(JNr0-!+lD%PfwfGdu22wrCn9InoKS$)2+nPqBebvu?uTXpdGAwGmfe{dPQ_} zS_ORm`c`!LdNFPh#;Np-J#WtjTZQgsV|c(gxzm!%=&lh0brJUR*SoM8m3~_MFVb&J zbd}8dNVI0R{n}B)eJtHjiAdQDk<3=?a$nd0WwELp;e0{EqCx+_gmUKfK*WLeBR*W&VtVx7`8nS^N} zHLdt7l*)*@F#};Jq^WT5<{7X#q#oEkNpX`p)=c0_`oF0JS6YkeZwG(Y=X9^_7D&uoi%;hw;Fjh~tzQagpQ){HNUiHiWr~W-UuB(Nijvt0 z6iq>GU*()%nvmHM7tup(UuB)c5 at X7Q$_5wkoN%&}1wPabJ>h6u=~;z?A=+T8!)e)Katm23v5RMt*Kjr}6{}UV47NPWglJpEo*lwZIC5h3J9jADi@!@*V3lE|^laD at oK0N2~_h9V++9^ZHLASArce~Sc+AW}!4&{v=IWsAVZ?C~* z)HkEEnYgf84*wFai?WpUSTCWq*GvZmV7EVmEv(`7CgwK+wyK4!00|XV9S3q2tm(KW zdoA^&(VqIO-B3am>z64d4%i>&v93#5$H%hA7wn>IJeN%af_l5H!RH5gM6`u!M&%!W=*Lc2>eC{#*M;#JB~#FL0hRY1S0KOHIgd34!lUiT*ngY zTox3EadF_#P8o|(q^8tl<HB-r{0sN7|2L@)EBpVDxC at D$lL2Q&5_ec%w_CBM zefez at e;M at 6pc-0R0~t2(9I=SFs(ekXrSWm+-$z%SG(sY1v7lY99VtBSo<8qjcOiU` zfyfeI;C~DsOwQzt_+aoT?u)f)Pm^YjE{(0&BgZmveIRu1;!o+f6F|Mv19J+dkje|H#-zf}>hdb!oDl;i~j zs5l&u|lRKhIr)Xj3>7)|KWlru%-EW=TX9`1?HhGMRX8jZ8uwcj}cGTz#!{Z733ccO5Wyd$?AV?$NkrKZ2$5Y`Cr>BS$RwWOc=>8gbrC5 z868y7+c`WchnehKs$m!u=GD|{00--qX$jN^y&?s{2Z-SKcYdU9$9lvi_1em_?z6YI z&ld|DF!!oWJ-;4+X*W;ba>+Ip;QAmWg!4g~>*eh9c|9 z7u8$T1Q_tJ3LpKO7P`oxI|gPX96beHzx&PkA`64~IFjr)!UkM2QUoGJxUW|=p1hxO zVhJtT#Wv-7g_8TD*ib|yV-rWCnudFWQ2LAPjeW`Tb>>un7&FUK(3qojH z3(FF+XpE5P=txRFpd{N$+7alO4499wl>#ql<5f8Fi8XNrpW(UrjBPi+5N`@~bEJW@ zvr0w#6O)IN+&;OD7So3-*Mx$gleaD#!sB0G2 z)XA;APMban`t5~>(@W0-MsC8ivrqiU&3LFxr(?sJ%KOQ2&W?KUeA8^yoaXvbUXRtS zvZnjHkD_u&m4kIVusxE9MBrvdM&C#>9V%PB0G}Zn#0{Z zQdn!S)%1YhC_wEzB=((u=quxQNH3YySG&Fec8^Vzj4}ObUAw-?b at g0WwCSqIq*qY8 zM+UJ=DNV|d?93$_lZQ!)i7>{BV8Xm-Nrw`t`GenqF at KHBxE@U*eX@=)5F+Q(cZI-> zc-^R;m0;P}J-Q2n^zNz(U=zJ7nF4HRoJUzVFHfn9E$-uRSPl`1_4jE8 z1taIKVNN7P(1Z>CJgAqX&-v0l<6q#??{mqU%(I$10wtC_`n0kNx$zqSAmPDrL3Eg- z7z5(k at hrilyE_Tw5-tYzaP=P?`^>&uqAW-8fH(UDu_}fG*vnE;AMjt>jzV04${Fa& z!|K{hPGkvxmI$82DBmXoF8u3xF9eQX^c6ZlO);|M17jnZVqKhZNA~fHp84jLcNmG( z$;-d%jllQIhIV}etKI9P71j5b(Q24OPtu|rGm#IcYl%0-=bmiNwyQX>Rn2#%R7@@J zr}i at 29)(TT^>>CF*WbNu*-y&jf?R0eg49;ZqM;|ij*r?aAuAs(l>L3D!$mN)m#fXP zD^b@(Mke-FNxr#~D2B5u;!M z>hV0fOV#g?^oJ9yMu(d=)snYlM2x0@{tbs;?M+Zxsfr zujFVhXC&hU5Nsf|Si0mI!oK!%{sg*U8#J#YJiikRB_rZ;3RS|5Jktp$bBWJgzff?# z_n66EN5qr at OcY0rB7c2%$J=AK-9DGT9#XzO>pOx28U*IsP z?k!xTDI7d}FI`Q*#B?d9?>FVjrDV?tcDHyx#shZCYo&}v?AxB3V zhRd^~2`eZ20X&6pX)c;?qmFFs9S|5>=^VZY#Fu9(YIJ<}Zm;)l zE{PcRYms5tvDUXrpck{16V*p0oWH+6foUiQzNk8QzVaJa>B=cL6W}P<~>g^L)AcEIS{*;rzh at d+jOX+8;E;DaRxRHew(Aku*hOz=GlHv`4#@I%Y;yP1ZOqdo{ z=6Qzy0n$;=qoQ;+1*fYCz^vH_w>{F z%P-iEZu;{+;9`%M5{RIMcT|+3x^#i!s||$Ag5#Z?XP(~xJw2LbBw#H|ckrD>^1BxO{w&%EK?4Ty3rPBLw#(9*+qlJ;a;%+>hGn8S1rMiARu5U|NDGu{}WkB zwZ at hvt~yfg6a!3f$h?e+jgAiNx)5xAarJ6Z6Our%3Qa(Xc3nd-JKferNhZA1(wnkR z45GlxA@?UJfr0NVCg000;V$8kletGDnUBZR{w=Y~b$0ga)N%G^@8{=%B1jt;ijaUu}bC_CqnwYhid)NiaYw##RyoHzm`JEP?KHh};E5u_C!EYyNQ_x=k+k`gP;~q<&eXE8xR!dVSz^#ZSqJ^4 z)M-X}nU$%T at lBv}7#LodO9lllw|a$!ncRGmCfCOJ1;`%TI>ou2xOxhp3O8bT97o)C zpdvv-W at l$r;!&=!*heLVq-E%O+(%7D0(2r)f{QD2aH!DE%P^FogG%EAhJtL7K(Glo zzD>5a4e;?Q!ZKW6T68uo%$5KEq95Gj|SU8Gkx7bp2jjvsteetCVj=Q=^vnnvH z;XQ51v=fYYqA1IRN}#_+pNi#J=$Y^%wm0fH>Xyytq;{n|de~V?QSek7EiNNYeZ;59 z5;o(PC4OtlH7OXl%Ency;xr>Jc;NP0TVx2_AC-g9dCPlsyW>_vy-%sqbc&VP?) zJZCSYnxR at 0=+5yH6v=UPq%c^JE2f*V;+0Vs{tPZTEfItHg$8)RNCA-ILxq>+po~6g zlJ-T8;N7)F{IEy*o6YfM8DtYCiJLEbU;&~Auf|Ta7yKF5-qRD`YSEZtk56R|<0sr~ z==l(Zg5XagCHS~|iaQcV7?1A=o5&wg;Dm(hp`)NTcpqo=%=3n%)2m?{9C#N-htX{{ zGn^)HczADwl2$*JPk!3u-*8*wjU21%N_QqYszS|T7-bPO3Zb^7fy;E#I->U)*uE`a z`{TMLy25*`1SO!ECAywNOLqkDUHJXDz>4Jeg1GRA3)LK_?!(!?A+sVsy8~^yzlntM zTNddxoM=x+A+|A#a8GKK3KE~AhuPK{nNKJs!$%&T6`4p_y~$?yxD&FD!r3Bk^ir^+UA1At#i`V>e!M^BMBz9Q0rpPTh+fVac7TxB_>Qg{tbfSZ4 zb6-;i5DK;S1rzJkiMHh7N~He1P`_PLxpkR6DD~_l=eit8>b-g;wGMPg8r=T)<#b7^ z_$Nj at O}a7qJn<(EL;s(?{5t6Cc2Of3kJsIbr#kheuh0qxsOj#5i%nLYZ7>co-j$YL z=$rh|89tP&YfT=(YidH<19|Pwu#ta0pjWR+5p%&mFLx$dz9Qo;V{74l{7`K8^!I`I zAt<(O;_+F<9U at -@^bfSJ?0AoRK{oE6A-d7u>9r|y>aTVJa}d6#l4(<}>P$~}F0iB| zeZQ%|e18XGt*2wH+YRPW`zlFIzC$2)Q=cN<3;ddJpfm%ISndcn8SH5#JkajnF*}c% zVfQ5}F2Mi#M_(R7P~f+vzX9C)-z9|OtzfJ(&3_TL8AlpJiWOsvdY z{%Bc-iBv3jzsl7Tsc>uSPg*UHgkBbnlE7k0Pg#1Io|LOPPZ znkys{So;AC%mWDI`HAjJ-l!rS>$jdZ$V8XVCLL}k9#9 at 1aUXB~1^3rKh#;J^SR)Vu zi+Km6 at R4oh`zhZb2^Dua1h7X?#&J^WNs82?^E}ix)$2=)vyIN`kEYgycVd_EC=X-M zoq!<~_^$Gl(0H+#WbWX(95V;*rZvwBac01JvlWj*b)fM+;SnxChTJl-(01w3t9r-o zw$8qpZ(dFveB%yB<0Rr*QilAjjsF|d$wtr2K!nAkcNUwh#d}p)*K#$1L#8Hb4M$F!`D z=5yJNeJbZ>j;!#dcK*^4GUAG_U|7{Cysvdm|yWJluO zd+Ij+m`ty$K!P!_BorHmq=Y1#*@_F#rSvguG8+2r^%O@&1S4 z1V8?J+4&0|q8lC2jN^M3C5-5mc!woY;{A~0xo-_N#UI1iR$w%HLhisTZqZ-c>8|j5xqYDgTY<$j+a98`CD)N^KKHcJ8S}i?=ey+Q`Nj^SIUzii+A at LK~WM_A$cf0iF zw!2vTU!=WblrCGdCR(*>)hgRwW!tv-mTlX{D%-Yg+qP}ncJF=8`Odv}_Z|I>?jB=~ z9GNroNB)R85bA7$33e~ev>A?x{ zB(Z@?lj(GkM3WZ7BeIi;RXA=@DcYu at kDHxgb%1WR9>x_t#BCezSyl`@dQGueUQ>nM zY3rCJzspdg-{{`xn($=C47Pvg`_Lawg9KteKlh?(%8&9>+%uBd<0c zM&|O8=#?S>(}Vpn52O~ks|ZB&QV6$bFRZ!nva|J5755!G%xRTDL;$JL>f#`V}x$arA7DSyvg7FE)fp~o4Z=*8Wd_)fO6(IwWbb8eA)<~ap{ z`xHPOQ}bR-bp9i4{BZ#0^|$qv#V{GD*~A%=$ZAfG2$N{~qShw+f0bbXB&^1 at XR9pk z$)(X1TEom3P^e6>jTgk7{SE4d5Lo25bvY_>@e=Cv05NK_`8p_JEqt#uyI)Y#&2MpL znLO7VOg2f%?yBj at F`A$CyJ4cHinJzeH7aH4CYAd{+sS-zKIMRprl;|CnI}4(>xXOH8COi zFgtsCZ`oyF;VO*zp^^<@PnKS@?=9}?=+sY7HI2QB{eeW!L?tsAEfO~+w_vt-6`|p0 zsvf?y$}VghuXWJE)|3R5RvgM(JIeaV8^hyMzV8=MuIdMzSZ%QBOQKf6Eo37u;CIMSO;36;FVm%OebEe;=9>O( z@;(-kXRc3F{Y7lPr88rbr$c7?5tye{D5Ts9gmd20vN9ktFcl6AH}}<(?FLH#Zf1_K zK5NXK9~N)~&x(lggnD2Tq3A({3mb4~dxO8`{zJ*~GQ6Q_?k8XDnpuNj@$*n2_4D;B>w4Ks`Cm z;HckEJzkbN-f$+4hn)SiUjt{gO_d7+Hpr+iq5Ox12CQXLUtJ9>i&Yvsc=w{=QRp%^P$MYkGw6A}ZG~}T7 zI^%%?0b#=aUwJ~te?jL>1uP}x at 6DP~5^4k5Bn`1(feKDx3ZCYiKT?-L&pJioqam< zkEXqeWJPq7PK+N;B107s%SIFQ4O>eSQF(fY(q2N0%#_8`YelgddSXQm&is?>EYhV! zsFr_w!DCIQf)iymI69_#KK6FQ*8bOy{9|Snlano8k- at kRLH{757C~qg3pORvr}P}s z{@;;n;fjiaYc&t2^7!SPQ0hxW(hh4=X2v28&|h7Z2^&WFBS625=Kk`J3kzYwnM|MW z$JmGH5vIakb}ofM+81on;|cXyaeDPb9L1$8cGSmfGL=g9K0~{B70Y{7+v}%{u1!kc!*(BZqW(OI4h=>ywQ<=W}pUP{{0&cV6!cmoFq9Bo;%6Nsak-h3yy{S96^ z^=|&#rSk5Up1DU_Jyu}mpc$yij$YQQbZ92n-b?gS3nfZFpMo`Pt?%Z3Cazs3b8-;c zN6Fl{1$sR!xDPM;-5`1`GS7=jK>dh}{DA&(B0dc71-~@wgSE%>4lRC+0G}2lbj_hk z&>F?JC%UjnssuD_3LT4o1DaI`K(GhN>WA9d=5v&bWen8Ij?+qTe3sWR4Urt(8UU%0 z7PGK3g9=tSeBQz21}O~&2eoAxIcz!T91;CJ>?b1i^}_f-;vQex^1w}i6=I#!#oO2E zu`kcn*9d8bw+_f8sGn&YzM4j2lz at KC)+?_#|{S}&0-M3F~%|3QwJF_`dDwE zP{t8r<0?1Z7)0Ozg*)_7Tr6)M#Za=TcO>&Dz3s&@es0YeJ1Ee=<3j^<1N+if%? z5d4(}&Mmq;=&L5!gDYcgTyZ2seEn%l(R`REb>oQqV%0-pY>7;dR;636w_Cn8x at 6xw zKkFlN?G;YoR<_Ro3hfqcvm at FL#0M$vdq?ntvL#J0k4&?}{%C=E`*IbDX z8D3t%c2VTQA&AJG5rVT zPx`Cjq|m;Z2_30hu8ETei0p`=niTy#^3Y!5f+4jlZL9|S!OKtjhpH9Lm0b|WDS_;h8L+HN(V-Ev49w7vIRxoJ+ zR7q}tT34!twc4z!fRT@~%uzQs!F3_%{K#`&c8>C1&vf+L3~UX;oGqM6GURgkq7 at fA zw??NHsdWT6&RmO2V-2G=39Bi4EP7`CD{0O<`mV+_9>u6c at Y3*DsofYkeXGN)^{~(C z3y^Bcwygw at oVKDzk;{!m4$?J#j=3lRdHF}6vCF7pxkHU^a*`gGq;utf!k#K4vw2kj zd{Ch(X66a+bE^F={Hmwq&qBg9fZ;?i{?888+g)Ys<-}*jxA~LcwI7p&dcI%ku5i$9c~jYaVdc$OWDP3=-)8 zqDEk at -D+JO>|_MYcAP_K5wiy+99tY#v8O!}erNVx25zIKNxZM1s!fHKC-A|~R3;iQ zVFF$`^M{#5{8#!Y4I)xZrg$P7&JULmgR^RE-1Pi+hGEIQ5pCan8oLe7xOXKlSt-1b$M}90^~mzt)#_KKE2M29f2+F<7Qv=^Xie80Pf&z1 zC9VrasD$M4-5;MQuI6>c6h8mZ-<`)-cz6D5DS=`AJI=a-ne|_ at jyBf+zirJ`UVV_3 z5x%ReN1<3CYZZRb!$a0ZAp8;(qx(B%K8SAKE|U?Hkl3*THCIJY$tLJtV6|5Ce3^9` zJLBI}0BR6NLfo1D)O~vW>3DQ$t|o5bap=iI_rB%2<#{~$`mpuAqOS?}g)it(WO?>0z>94XK zv8Q1rwzn?TH6L`XUj?(>|D6BAkIZXWizj@$|8t4{j-zAjfRz3tp_?~+_xQsr5~XwM zfFfRp?v*%RhyIm0-a^V7Y0xJBCG%%%-YFxf(*&E3Vka3syS)f|u_0s_Pds}TXa3RT zC*t1zT0~XKVjTrO8@)(|^SR;@nPPYw8+yhFV)x{pEJa{hOeT at Gq1-&PgIHgGsqvvV z8+SaSfSN%XQ&Y5Q8;3ge(ZXFo9A$}RO{@xJyoB0*=OlD$y}EGURcr at fVgmhFYC^8j z?98bGS)d(|v|-*E+{(^9_{)#C49^)op=u{P#$ zlqxX^u;(Tu=9!lr3bt9Ngq31cTzT6)35eLGq|Tb>>Y`nqVOlT2?sjV96IC>&{dVGl zC^v6cA5PO7zP>kURVlx?bx~v*Dp7XpP-SR!D_UvLO_g5j_sU5$T^U7cUQ- at VWi&42 z$wW1qmmrB?Hu5V^5kR?&qo`t$Ium{`AbWaO$ZkYOHk at l{US#xdk|a30S1RNyp?6TG zuMEQ6D-4hxX9nlMWwJLRdU&%SK6OmPPrhto?p>*nPi+iRpI{oAWS9hpuu!pAAOLKi*ygkEKrnP>Y0^`?)F$S zH1GIHK5^8F}IU`fb4Z zW_V#(7d{HJkw8CvfEo{c5vtEWWYvK&sKM|R(rm;PTAb$^%<7|mhk&6l(Mq_lB{hOR z91w72G$$}*HZj8HcMteb8`8O1Ci^1UziuJd3(x+UFf)q|iDC31D4=2>z^%RrId85u z#CuCiat+vk(>z-2Hgh@*i-0`2f#@1#idQpb5TU0c96kV#&qt57gCta(qvrJ_D)=}G zG5sB%#WO;V!t9V&ArFbZ&yg=v1B*#pX^#DVwdG_8&YU>5VLBJ5&veiz% zwkBw>&v1+1u52cgj9BY#T_~&99o<^_wZ=QR&i2W(#i?v_3qle!UNYT#_P%-7Ltv(7 zMlc*a2%ZD9 at F)nGEpiPt$Tap)P<@`%&yt-$n%>I9>-gw58k}`YmqD5-Pf_~D)L5g~ z)SA3rC_46 at BtA)ec-dRi!sS%M^eF)9_n;7`j!ATpqXmSqcI|liZq_~CxE=ZUP{<;B z-r3+D*@gdREw=5KaHYk!L*jROxrZh39BT6d1N;C#D-#fEoli(Ua?-2LV8D%07u{ke ziGVvq_($~;t)~OCK#8vcc7`G(m*dqx%5y08+U39{zQgDvIN(%m{h{75%cyOxvl$_m z-x~|SZ-B^r|Du(TBwz`Kk&O`KtUin_*nWeKOS+TW){W!%<-Bsch18IDWr}5+ at lfCT zTwoJ3Z5`8X{k!AOz>l>m&K(5&I!U1Mq!t)1#bI_bDZ>~zr0BM482Mb<^o7Y3L9m0`(>KD5RSEh8UnE3~oyTsMNO9xX~8?>s3 zpeh37j-@{iLOYfXGHg}njtp({Qzz{!nJiDDr{85jwIpVM{0BeVEAv3cDVM?+XC{K^ z7C%&%nEk38HCH<{ZAJT-BCc3JZ81_*{qw=;3f-eKmNY6U~jw19o(^v0{w8H!`Ieg0_7Y_r^<`+ at YQ3OkkR zhqBvx>V*~wE_YSdA)*EJ__*nm8OfD?6g at bV6zY~e=-Vld!#f?11M|+)WdvBQb1$?} z_Kb^8|AX4gW;?h}er?d|C5Z>l18tH_#H$>O1g~XMV;q!K?50}0_kjhZcN&&P*$Lj- zW{q at 8e%5%s9?-G$@Q^)3<$VVB2T;sPX1{%f44mBCQaT+|PhdP#=;LvkV;fWZ zuV17Y51hk6^L}YG&cdyZBFju0IOMlU(>U#tIO&OQHWasksgzlx9&;^NsgEoECyP6npF3nH z6%Cas+k{Z2x6w-WsI_SQvX!_Lh}UaCK}e^1=z_3kgjo zk-6qHYbJ8EZm*m!B-&pQ`FPCqtZM|lXXd8h;1qyuh(S6Yg;zEZ znGmLb6_-XPP7vi*vZ>54lif))>VziE&X8}!2J0pgq?l!A%cEg5oaCB84H%*0t!5?m84kiI-!VD!%^99kS90iC zsO(;cgzP=j3Kv6HrB(ZqD zZ!4*Zu8ugp94!u{0TS$GWH+p84+^qiL%<>AR+(=8lTn1HyDyW-!J=f$m7+c9GKGC~ z#bD+q&QLJpf_K#IG|kOZh|b{Sx3M=5^L?bG$yRonn-xPneb(z>!UTzRQn5yh));4t zhWhnvm)JPIP5npi(?5#JfhJ?8Hh%#D#UTDWZJPhtX8sHLDqpG~D`9&Zqd6xTAq(}O zl}M4J$th1ZBs8D^(AP;7X5Q;z-M at KLMHE z&r at _%^&nuDyb~Lp&pgxDm#y8L-yiSq3P2jS4nHjD5_{OCRB}*{ky`#d8)`=EfBqc1 z1^)iV*J&LP#Z%fd&`h!`M1-Unwo9z`jLR7={HcrM at l%n8}<_3HNuH%}6e*O^G`lO|u;{zIyfoh8>qGSEsC_CY at mm z>b*b^n`r-Vn;%TtT^6wTPq0nM*IQ!*e}WOWW} zy4n(KNX+E^T#ZFK_4R!S2}sN at Y$sA&pO{nh3Q=n^#uR0ICl=E}Oma#Ix-1D|EI0#I zhP@`mU#h}Ls}~huTIC|jt?0)lEiP|k_J2gZGng2&KPFmmOlQwiqTa1wRXdV0XX&)O z{DB0G0a0fhUJ>>^JW^-;T%OeLHMhb(WF`8L?SE z9nK=Y8vq9Dr!z<4TYTx3UzJ05tG-jBBDaB96O at 7G5h4pIV`^X-JXahFDK%rZU1o8E zNB)Dn>Jeq$V9`m1T$~2lg78d!XZSXEw2?3^$1S2Wm3oq|@%*Dyk6XrCswQ1NR0}}n zaxiZW*PA8iReejUS?s(mfH_MZDypcMLsLXP!xXb_oypQWLVy*4%Q3ez5X&68_$WM& zxV9ctsabejfqd*NZ!?QPzsNQn(?NHV89rO_QoOl+2*+WjmdQXsz^d*gr>&mLGQ4yj zWP;_99ChO$`$!%C8!)E&^fM1rPTkzKFa0B z(bs?VtKzWK>=hw0+EBcKai&lWMlvQ at XH(e$lwpJA8H* zZ at ELDdPKTz<5VW|Fm=}zjgOrdIMvOX?k%kpCB=IlmFUNSe*^+m|FVU|G6eDxSWRFT z!*Yz~SWVh;xJbF17rFoRJewbyY0`thexqtM4AVBzkq&`kz<8K(ni+|(jRe=22ChIG zWmCfpBMAxTjD+mq<{#-kXmM;ST-SK8D52}0F<{{_2zcUYPz2+CBmMYdUxV6yRJE&U z<_=iew=tY2I1s|HkcOS at XX_EVoZ2W$VjmCD4h?QgD8h?yhM!Zvp_fYql(>!q6 zxp+OJJVJi4M+Mv3URY0mf#>y&k1Z8<3s^@=_*Z5SP>?10v%)7zFb6?Kpn)o#f+>YM z%Y!mYZbN6U?w=deMs5kMIXuRgRJGy1fgAP9%JIk}d4RvlZeIqd@(N#N)6}V4u9pw- z#38`B@^Wj;Qz+dMQjM$lJ zDzXtMM;q0C6LBE1z`hY$@qUpG# z3o{7kDXh30`tVD6uSkbE(0IESVpk;dS_EecWiG|8f3t9|>W}J>M7ypyZ9B?Zti2B4i=uAv!HDWtv+d8Ln2+5-2k9w)ccI5kWpoE%O7D+)w=3r~Dj zjghJ5ijZ3XY?ox~c)WZ?;V!Up0Am|U^lJotGTmSb20EJbO_iyGL=)aTB_)kL5fAnek%US++ zjaZ_hJ4Yz}llkxw$_k z-mv|8B=k_?^lgK{nE(`F`#7pDh(XS?quLeTKVZ=~9N$K^_zPk-OAdH8>J{$~{{bcK zL0KAEv-zjNd#2TElWk>lzQJ4w at GEpl7Z+kLl{`C zTa_m@)h$vci27b%AIf2}V>|M_erK?gOcQ==1h%yi4MNmSzM&f3BF)B*EWc;hLtC at z z(Sdp^G(RWz3}QGrmvjSIMby3`S8s>C38sRNwFX2I#7Lh8>yPhwOYcleUkQD}luCf! zeq0>gLXtCoIy^~SRYXAE`FTTl?44&hC8+{uO(L|qkCU-A*R^$7+D`m?OB;;}cebo) zNom_rANfj0hviD)A?-|)`Gdj8oTyW=Ml4%688yS*Bdu7V+yu#uHWh at Rs$^cg{kUgFS1^ zZOOQSC-=@~bi>|8 at 6OCgl;RN1N(awoC? znv;Ka5vEhOE2sL)8Y%v_t&!nh)~IEJ$dAko0;OR)PoVtKw5EU9U)OLu%7QLvDj at La zTXYR2b;8t7wVKI%SA7aeTv4P|L_4bC-L-SN8rpFjg zja*-IGcnW at dCVdKeF~BrU`&%|`}rUg4g8)5 zgxZTj;1?a6RiW!lf;PInfHQ}e&jGBL4_T|^>4*w)!GYJM^C#auzs7w}Ou%5LS5N{g z?s#YIXv3o#bPcT!j#kEeT_Be2ZJ3>(hN(Up? zqK%=ePKy`v?L#ibZ28z3z(`~IPQ94yO}20oa<1T`n}4WsajS_^R4$-DX;tO31f zL6wHj%1hEeMC`D(Vnn9pBo}m-2osCLn18UQQly4n!m_SW5a^gbFJf<3+wPX4cW!SX z)J`FiFNU?6I=L*_75&uMbv-$50VrP2$~#Xj>h>l2H1&B%%AF__V?`?+GpUJAAc`q8 z;rP|P`-?l%40w<^g;VCeh+=*tH-&Cd=^P62nErM93eV0(Po4gpWtGEv-fb7Ip8rbD znN_(v*+UTW+2l!Ei%hXBJBCZ=%m%Q_U!gmRj<*NE#xwBG3nX<7QyRMqP_r9`w9bq0 zqOp3>X4P+aGtKJXEd-k;WGPEV z>LRi*I$xFEH(pj`9vBR%m7X%cQ*TZgm3&b7cn0W(e*PeyVwFW}d$q^6K2`{dP_^0+nAOmf z{HLE at WiH7_&Q0NPH?^l%{^n=AaZ*MFwd(aAv91rB!wD#iBV>l0z>h~x^ROGeQ7>xl(%MdD!`B1&AMkQEIV(7^K?)Z-%+ zVrQ!r{O|2waM-l_mRqx+bDW~#d}h5wPjXU5trIB(QKhgIl%0qi#fnWRZn-bm{*Vs9 z%p~@y(9G~;&(g*cy~xXaTe|y1TocEhuLB^?KSDAzlazqnFlD(?<9Q=VcigR(8py1R zso^?_5xyT1c=GQ;G&0b((%U!klU2eHiY)oHxymNMgUt+ at uF})+QO<%}iEnYCT3~g9X zm#lkJA#-+*UqBW1lWk!z3lkFx`zNL-Lp3uA2R*dw_qqf3pb=6YJ)mVA1JgC zd|yv^>@#_L)G$87ysDTao#7 at 11nJ|(wJB*- at xx)(bM+$k#2AFJO>a`kF6#O{Vw&^u zO&<261%AS at amfaD!Wmd*58Ybh@4O^(B%-VO3_-Rt3|_X`_= zQx)EAnb)mPRf)mDR<2U%KihT9^FC2Jf at fhDPMBL%XVt64IYO z)vGsX!FKgdraDUSuS1YgvpwcEG%k(I{pqo2)FGrAUn|Q%d at 2wt&8OQ}WnrM2 z=dQfK4R=QUSjw=wpju_hG4Y5vw|vFJ;5y-#^qvTNQC?&)A&sszHJwzXFo7E0Q1{7& z18|bg2XZ8X!pKq^!*v=Fb82I7K7I3!$yMc4G?10lGPWgdW=zHWwvfPJ_b&5#-o**Y zhuG6$rVuLr8R!s0=mD%K0>|eTM2o@}KTW~jicSsh<%is(#+GgnX{t>&I2krXKhheW zpI@>9A0Mp(k3Q6~g8$P!Z3td*2FC~GjEtiFIX9|YslVjVd=Xu->Qb<94kz+j^f7(` zDW)m;H&u3`Bh5hS>4QFOCF{)BX+szM^}(2%X}^5KJ-Mf4 at vsA3B;_$c5`;NpdJ&Qb zl_NdEuAY=0L7%}4GCREy`Xj)d%?W)`Glik=*=*C!T^kGSdLB+sq#1c7(wv@~ z5fg8);?`7M3`Lh(@qxiCS&wFEei}w<aLYV=>Sg z!afm^!GjbpvMbI-NNqf z41T^!$@LHY*4{zAsEDrq at GiljiWYhuemE9)p^Yo!t|YheaU?t5Bk6-ZXLkpX%MI0@ zLG|fq_2_Ut%~2^-``V at Z{H6W8n6|O;K9bYe at xidm2<5{MKydgmIE{1r2h`xOZJi&2 z$!{2sv=f)laMP9#Aeq%@h0)O>gy4Fp4Q at ROwn$JTbt+n&^#y6aES^0`RSB0IFJu!c zn4uv$o!+^zwlR7tIl2g_!F2%{CFToZCd}&cxYO-O%vd|71<-w%d{w5PL6j9al|>xO z?O<~g&vzs1QfgH2C|5F3k{nM)NpxE%!tTW4LzaoYOEwIbn}`b{M(5a8m)evK>5nV? zc9;12XNGu>kbUi}r0E!i=XhDT7)iK0(lx=2N4l#4!WOvbyL0-89XqaI(vVe!kJ&dS z*j)_lp?X)G>3x`sVFc`*=`KL(CXQkHkjAbAQA&K^Lt!*2-S2Pcx)#5sOa+V_sY1@? z_|@}apz*E813&WeWoGPV+bTcr$9u^e)_zaYRuxTnQSM(jPO=ZN1ixVJ#&3xZ-SpkE z3bX*#Jt2s6c*O6gm2 zIZP$K$oD3e^pX(7AVf?Tuyd?AY`9f=t_PiK!U$qJeNFDKEj}E1DKU4LXLz*EVtm8= ze*tD+=X+rCUuPSMUqC<#|4V==Z)D-B#M&pBB; z3R^qcyZsj*S8?<2w#naC)t8C(-~+tWP*A=`7v) z at E74g5VJ&Wrm9Q{iSPby%q1(u_ zU9iiM!8FgXu0)TW1`}m2abfGH4*1Z4`(ha*bh!unojt|FS~s6xc~$c}EZ}cep$R++ z>r<7lnd`*q4}-oD#DiVC2+x6tv&QfNVR?Oj)UzZ^KDTz!L`*nuxnM*+uqrf zDRdfRTjkj|`+vMTCryzhnqdU9q}PVEtZUU at KCX?AL$Fktb+4Ot%*2;T>e$gr5vX*; zxeMJdJ2d9`QbYIG>gMU{!6yacZ!px3)hsR}q?FJpezjI6u%@kte^UpEwE&YTpSF+A ziyG<*DFDAIo+R|eV;bcrbkcW?$%4BL$#TR>cbw;Ee}_(`MN2$VFd(j+Fz0ln zNWZ8xygl&mBq~0R;6!*3PkMG#ANY at y-mo08 zj`v^dKm`2X={5bEbwK|wMHvknL;(C3?BO0wxv(YRyi&blgR0P6KY)qkXFSPo at m`Xl zVo;gp^^3uaEUSz7?w;>FxTOKG{d(Rpwstvrbw6q={0v44YKD$77pwY`)h6Q`g3uzXS!47L%CL0Jd+5bg zI%(Mw9RFrZ(Hrf4#(*n(00}M1=G-7hzq7GBD^eCVkNmP0V9J_4pxil{abn3Sy!&wi z)@7|L3tz3dy{xv7qwU)VDCm<4qbJ8w71gCI=&UUxW^7@%NHW3Y1WAd;8~2TK4W?Lj<&)wQW3&{5F8cAqhhz zWuc#xw6($xa9%%)Jsxo?Mm2{;DN at atB=#aIJO}-0IPmE!GY1y%gD7j<2W%Y0`}YGi zU7LhOLc|}Es at XIGL56;+IKJPTJ=l8pgl!9QE|fhdFQ(6-Td}lwp$Bku_mAjWD(_)zl;>pf}K{$wO z;(s~r0#6cBfqGy at gE(Ty+GZ9I=>Z;idEAkp{z<<@Uq`fE2L=LS1^K_UZH9kok^M*N z+UvZ<4iTD}x*-=CP?Ao;|PJp&Bu+L=Lo}+b`4G#xv+~lq-?8=JFP7h4#2c!d4HKw~rtT zOLg!^nqxlo7-|)QpwrYnZaA_^$#TKPF2~^Iwi2i$GBp(vi0(egVEY4$=@R`&`R6}` zI80wLC;k2g2cZA1WK+t_+QP{2?_Bl2RCkDEYz&S575=pNk2XW~)LykK^0j1S1bGdI zwZFSci6r#(OH8TE^0tdE3t%lx(l2TJLT_o!2x3h4{%$;aeUbD_UB55+oz3BD)8Sg` z{rGx%8%X(vC{PbMPAs=%(i0nsTnI2 at Oz%s4No|$1--0$wA!w+AO=mdH=^3rTq9T1R zZ6&(U$sA-T%!2alsRD215g(JwZT-%#Tu47uSY zZ~XoCWqJElam7!)OrxztU_ at k+S%ze#av?rkJPl`I zg`!qpXwFa|3+pacL6rEggmHA|pASb6NHN)pFp)}vqd#u57|=dx(KIveaJErpuX5G_ zCDIuk=Xfxch0`EA75^&Ne8qJ?rNR_bG6s8!WYapX(T8;9P>3DvF$Y*MV~}gKxy3cL zdTpv~Kb_?+-fQhOHF)hS1r|s^FPuA?@9ix+);&Mw4pJPv-E4CuZ+yA!ZC9ORCLyui z4hTg+!ia#c)fs`(S%cY4bNv$xeUS=_o0>A1$%e~Vq51NL!SHE*>UH#}ZqTubTGm_R zI)wvwRYGZ18NIEw^Zf#a28c8|!6S#yN0}|^u?=MaF{?{ecqLnnDL!zb8=2-^|4sU=&LHGGa80B(GZAQvd=XV at q> z0?(6cifYjHM=w at u#iiUdh(x4JaDrky5QXMwlkN>IMB`IF{{SK+OMeSIc{hMY@#$d` zpu*x6 at Y@3)6czJ6AB_UNp!HQ`thkWK&J{XCV3dM?C*5 zja?`b3J3_F at ZWK&{@45Ae_HpTI+W|*ElF+SCW+F45fOibgO8QzA%O!^CkUD1hEow? zi4mYz?isp>kz5gGZo&waFDYAH#w%M6LqRTi`V{HeNr!7jl~z zJJ(fLqyy>HZ*R3SI$Zfo`CPRgXSM5OdA)}217QjYV_5fJ%5>o2?QDUK+k!pWITQ!9 z6K!Y(>2LH;cFKsgL>uu??Rt~)_2fAvp};BkJx{`{b1EOIFgLGHM;T&Ot0p+W%ktSVCHKdUi1*mb(K1WD!Wu?S|XEMt9%SjRMk`gt(tbxRDkWJY0Qq8w|cz_!Bqgk zxz&{lFQZpsSx>NrkoC2 at F|Iw7$AWQ8+z#oJykkJ7asyYK2HLO0?@ z)d}Xd1{_WqI~uHo%m%ySIt{&{xRUQt-l%ll7M6mv$PbzBNm*TM=dFVR$1^6nimNB0 zANhu2D#49n8Eu)x&X8EEWyrx1(8L+?+0953eDJC%iMsRl=T4HClSOOf=DIOjr at xCS zi#%k&YIN8hd9EXeg-?BY?E^v}&uNj17&Nve(3 z&D at 55F@+sDk=75eW-t}EJ9vD4rz@>W8=1?&0Ic5^Htl}#l(PrKRCsuG5%~>-i zv4)M7ucstK6|oWJenKmFq+>po at BTr(l5H{wip at nzRnk?GAw~-pjQ!IzK4L1qy25+N z-+JU+2hB`N*ZX_X^q59En&j!ziajz_n`Ya)j2_8BK|)xn?JqUHPOpcl_J*?=8vhuNLf1Kf3*gG3taJb9rAj)!afZ5uxp7Woe3i-C%DBzNS7MbL`SyZf@^!eAm+&rb z-8T=XDIT8?avh-;hLUj|!-%+OlCGvpc5>;k5zv*6T;}Ai9#KTIqd#TN4;(MZ3UQie z;$HX(@qL=I4gCYuL)m`*w_LJAt#LvsvGi9?Bj|is-ehlbXIx4bNXBMt%asbNx#lPJ zWG1z8jXuP79D;~YU$c=X*mmMAR~PB-JA*fn))3sSUjQD&!oj$F&VGV1Ee7up6oa>4 zNQ8C=*?#d$YR}r~Sci0Vjs4L8rJB;&A&Xi~a=vH$%@(30-6JQR*63 zdnVMJ$$~U{Kz$V at p=Y;XI7|bDV34m0UJ((-3*HsDelR>CIg0A204WZ+^98o|JLIJ!k}VTqi&bpHje*v$os8 zb*{=$_(CX1nA!d_O+nH_Fy%a`RB`5>l>M}(HxBhNAjs9)Wl`!Ip0SWo!AZik;N#Cs z+<1^;0d|6;lj>rA!aHS!w#8gDTHt3Hpwq4X*D96I*@V3D3YD#L5kRmFbxxH^{hGOa zknB557*ycT{V!05Nn;u?2O_ii;GsMRD}ZRznR!BAlQ5245Ob5Gb5pRTgmcKtI$s4t43;=gh*EW zvRqm5TSHA=v}1YL6&}260m)}^2^I6KV)S?Q-mF>u0h`+H*;eJ?2MEqsO!%*MDeUCX z{W at DsYNSPnULz)RGh8Da>W~nbU^Zg1ow0;#g*fe8+&;rE}j?lH8`TYQ0? z4a-xi^)vE&H=5Jc)=`gH5?QoE{r##=2e9o4IrecWqBH9F!vZsx{&v)A=jmVQpy at 5a-Q#Y0@%RWJ-Jkm_I)*4$UEcoJY3994>0I0eoO3X8e at hmqc8u zb5eNtY%T#5v~*E^u)F!*_|)rpufn1LB3m%bmScD}-#w?OHiH=VW6r3&fH)Q{iO^~E zjLxonGRmH)&uT6gX#47RYi!0Ly8GY0Xnlg0nrtOje(@7=qg1Rca-7d+9_g3_=f4* z0rlMIDSepd)}=tLuuE7U#3%8==D=H!wvd(k3RWnNyWd zC^f*przUbF8fKun&ro3&lR_uP%d*7Fs>DN=E!yr!(e1OKc?n})^^sjQ0InL?9Q#VY z!26=Zi<4|2l9mYi@;1krMfZ&( zDrZ9MZI)T}iL?<@&B=d1unZ=z8Ofd#QD5Z`v(VC$U=m7^`idH$fD4qEN%B$RUmtcN zL*;xiS%T!3qD!AYU9;Gx;_HnnOkMtMlTN(_Um#*4W*AlkgvH<#o}* zon*z)1xw4)inO+&Es)^@ z{#j+{)RRIo0kZ-1O2tu);m(M65e$#HC0U+W7HzU9Tqu$!08f{PY>-o|;)&Ymh=<`B zd7+40Uz)@s;%wL*17L@^!6f~`D!RaScYZL*CVg4AM0fcfP1fcWJEb`7Et`}q-OLi9 zk#IsCu{4K3Jw~RAL*3?%N{*E+Lr&bet}Zi^0s_jzzKzYQ3<7L~?#w%~ntQ0&ofc$ z{&=DrageE=USY)@{&Xgx#p+AsURt;Fj&WhHoq85$5QMQe5oW$qDv562rJm;E7zVU& zmHJ5q3a;vig;U}a^I)FPn!eLvzy2RL`BMSm}Cdlhsmd zZ1XtuBD<+pGs&Zt*2E2E-xPl>6y!2)Fqp%=q$VOTNhIshomq)eqq{(2+u<2`A85Fe zZ~l>208^gimpH|^HhKHHqzL(t*b9AlpdSuOvx8D zUD_S2Mxbvgur-yM|7BSrLs7o(YOpTDnN;NKEL0zqstRXbQ*N7#g!X zsXOJ+3g=(YS2VyyOVG6-bJ6(`oi3FnBVf<2ChO>`zpdxkRF0Wxb*Lx4*L2uK at 1omi zi9F6x at N1t9`K0W6eH`EHJ216VqG_5lH3ap$JMqY>Em|1<9AK`XNM+${fUMj!GQ^Xu z^+{}1g9K+#N)q*(BFxCz at hZb=hxKHLh-Y#Tk$mU!FHw&J81km6CD-bPB5KS#xscJ+ zZ>BF0B72cfX_LkZi}uGGb^O05`~PSRQD>(z2T{YunHAMjn}7wgP at tsbje7=_vanPk z*0m$O)8!oLvjH0I;cr<0=`0OTGKTwhKPn}<(LEnxoI}pYA(xkQlW5`9ditT zz`|taFl`*xJP)&qlQa4mZGG7Gt9w~u#}X95WFK+$UwmB|dke7Eg%00UvAC3cEJa6c zP})N)tcqL}xb+7a+*DP6GGutk8vPbiWWwD0rc>gVYL$kCw$#tltfvI`w(xbiZF2k@ zg_meWA5m8O9d?n!88ZxCSeU at sLi9GFwbon?*=Q&+Zdm0~;Fy~QWeeYE&K++Mk+y`i zOyZ=ti>9S563HEI&CH5`&cn99^crS}<)1tpV=#ehX2d8oY|xWYR!Cbjy#&7Rzgq`-AF<)Of&$K; zvwFspr9KaJn-bb%7Cu7;2=-gprVDc{5m6_Tj*&&VNPx4HU$8MtkMa1ezhN>OEa*I{1?bNXeOS>x{!{3qJCEeSFSGtFP`MH~oZyasj{430T=K~_~ zm3xC;kb6OAm5PFvW!WI9%^f;57u$KVZko!$7M}HwKz^8(R%so#I^AVKFe+Mm5B$$p zl;T*|8~9-d&c~=$FloIaSGk>#)(~Zs>TQ&o9h7FT3L;%|WMyo!YMH!h znH_4G2VZ69!^-dvv++y9Hl8X#x|Kif7ka(3uS)P+y_|bFs7+^UzxpbHQ!RqYAQJgi z{qfywB*eXBJZ}HQC4AQieVP&Z!*K3&k&l&DElKzH4;L%IZ0HL(X_w1$`FBHyUUgdO zKlC;}XVotB$D_O|@5ursUlj`_Z8hqS-L&p*2w|YL?s(`{+(Ab5Gu)EQ)9d82D|Ej3 z^}n6&FxtOsKy9k-OdYk}?v(7+s0n-@#SfhBMC&{P^+7Bx@~w2-ZTFPHzX^89IzqVZ ztYrojq7?%IfVxYa;b_}&Sy3N*^4lga$d7YxuzH{WsP3#tL>{6-f`LK*{Uq^!>-5F` zzF66txXPM&{loWbjJtmmNA9XlU{BzS#GrHvl8%l*I7Xq12q`5D;X+iV;|9mUnP_CU zE{c$36<{qKIIQ2kMx)beG!mYwkLV8~hZhJ^1h0 at Jm5j|E>=oHu)L(3|SJ%8hp6&^F z#TP=UhE&*&;X=5DjW!_;6sL>XmDiKrrq at e}G;8yam!VZ at XDDvj^MvCp(wCMgYK>4Y zr>`t4(^7Sc+DWGk`9Zl=_ku}@2Kgw#}WE0OFXttX*%@ldOF$1lk#x(4Br^KG% z*md*MGQ+qDyirSAb{)E?+{f<0jGKge(Svg6nI=NNkVUTq8R2Z9iZbJ0Se8hXYdxqk zOIX)0SuKY)PMuMlN2l54WU*ghJLB6*kV^xTmSKkKT;uEu_hG|)nn8~2dK9s}d4?2- z9h;jM9o;x^T|al*3cJeaFKU$8nW#=CDAeV6<|}cMbSK}cU+_i98xvfCj#Qvn%XN=X z2YuCRL*oR;kE2%5RX^}f(J;>0x&HMQX z)*{PK1)5Rhz;a4n5|h(KY1xgAzD>+(4nXa%hDLdw*|HaGw3E5Ko?ZnFh-J5(IUlvW zFAJb<+Rqc>^A2C>cD at _}27^^(IC7b8c}cd){%YDRv$huG^PfLLv# z8d7F-MSfR!ZzR>~d#k?uLF=H4pbtBLA?@#F^Sc>3f#r^%QfbhX%FVm9fV8kIisjb& zS?Xl%m?JZKLFyHvu at GI9k)I-62{U| z;Hajh9Ny(znJF3xkdH}H%+Lo5 at 8VQpfB1=#bq{(y;4{=+Lc>e|P|{COqyiZ}Rkm9t zVlgt#Y%jo9-iMtXUOeadqrenp(yZd1=f*ulkqMr|p at eCK(`$Fx1N`w7U&~dG8P`ZA zlhlTyJOkOp3DG|P(JJB5n5sto3I at iG^dEQ~4I^7OGYJRh|AW`j_CQxh{b$t7xw%6`*W}&H`hEd0}o$nYNNa5bgSaBQdfO*`J?Rx<%dQ#tvEkonh{3q zRaFOoKRjiR%A0&+IMIaegjQ1Uf)NB3dwT<}k-cqH7Y&5=@(fR-)P8lOmbrpKD)m%) zT0y4W&SW^k5T=&j*jxPQ!1c;mI4C+Y_x=tOcCVKyO9UzWgw@>U0kg0Mgg_ z3eC=+3eWQtOo^#h6c@?K8U{ES(HI6FFVeg6vL?9swNjm}KDD4fG+b+~<@ufdNL?85 zt~I9KqbYyH0cNPEWLhDQv%3$JkVeu*56rbsIgShj>LLat?_DmlSpAW;wg at j~Dy$r$>OaX>HL`buc z8EO-RB^m65d?U5~bO8R|mum5}pV9X#RG=T!Mj}I2TBwOEDpKR=17*ZG$G1q5*pgj-^1FAGYZ2wiVISUE(IpFnqOwPs^A?^k;!e)3pUWqY=}mlgMWOQA zm&6pK{;Z&gcQBQbu0W}%X|*C_E2Uf*kX(4us?BJEQV4wxo~2qJN!;u+ZH(eDNWO)y zh|`HNpUJAG(aoy^D*cj4&lR{s&iwrnAc-a^gsNHf7qa|vC)#G&f z`t8`q1OrlIo>PL|1LKMiqw~G!P^ev=?UqPr?@;_~Xv58o{gE;=ZJsfNX*AQ)yifMC z7w9;TC-&s$*+1!W1UXovkO}jpksd=VUargl@@_}Qu10n{3qL+B}CCSNe(Sz&p<8m at MLz)+TQwH+K#D?bu}rIQ+v&h>6F3fXtA`@7RsXe z at ITYVLoXMy&wIQv$A7!)FJDhac(t$4Y7y6{==lDKe`11`u^~v-fR>>UUzc7|jxX;- zpI7{#oF593JD^kL2B|e1HEQ)0*_A{TXP}Z@<1oKxr~3=b)nbe`fp_4SyyBJk->B86 z at 1${?zk8X#Gl2MO+88`-bI_Y{=s2F#V}+ at w^Y(E!q7;U=$6a&Xm}A8rC=Qj!Wffv% zwa}&@t&FxA3g;5m%UNYHH2|BEa;~GzA_j+SA3J(3h0x$wo#z1^cZi+?I{@XKl`Ge zRmr>Eyy|1=J|pfF%Mk7X-H+(wpjy(a(H_`fV`aq0g7CmOR{gtP;Vn>pcN$L(97~-D zNxfGbLn~zLY~o^&_!VdHyqOZoOdN^*aB-jz8pZPi>VIdQ0!-%udI&Hu44D7FMFjr` z*7+}`Qt`j8UMeGhDCp|wXyg-7VPfRV=rTYtdQy{U3DMGj{8-rTId at h;wDoZEkR2Fi zqM)GY4iscV5tjc;?_*r0^u@^}R+e))CwkouQ>z&#KYIiNAkupi3GLG3<8;BPTJeSO zJk}hsk_0y3d!wMiZ}(Xf}3v4Sw%uz&xoDlq%@Of zj+;@~FwW3irgr#|JZtSOS2@%?QT`b^rXsvaQf+bQxoKoODcou5L^dkWu>>bE;ZP+m z4P}zWGw~4D!m<>yTa9kN^;f~6E5kSkyZUrRYJ3l^L>yffI6!8MsWoLmef`iB$Dtzi z3KGBQh^lXD30&Gm%LH}YB&sF(BvwpSEmPql8AQLxOb=8d!=V4!bqvFwTjQi+9>uiu z^zExe#D`e|r&_5cirVL>wkqxF09)}3y#Z6pb5#xNorHBz(t&ZP6->`)k5rJIL= z9(~579gc$!+aEF%oD4JbvVo3WqMRp at 3$P{7U1W at e^&vzaCWJL=KUg8@{Q6cn>-;>W zTK)3|L#N$lE^YFHhx3Bfk1Jax;!$77bNa~rdbagbu26ZKpns?F93zn*=Q=w==~%zF zDtzpbLEQ8+Ni{RstBq(#kNF1t;nfLy+^MboG(m{yk=Y%V2dGOS`sG(JigdH+CpWD` zxCVN+D_WG?sx=u!C+|}YNqHY%`r)NXossE&8zW at Yz69O>V?&^-OaLd(U-;cZ{|E5< z_iUiL&%Z7*e{M2s9P{)(i(QARJ_-%_ZkvRY1St%$1sdKF&ZlHK72C+KXKYilNT9{w zilGVqARP0w*BmyCDba2Bx$t_MYAZeRcszT2{0S!G$rnymqGm}|o<49uRPFEdGxVKyOEyAEfLv0)_T`K^Caj#*9vp+npDZ=Sv{j+)gh9%bbWqSXlfHM(5c zf1j#bLYete$s#@lBkS1+D7I~y*}xU`-7+`=fJ_g6X*5pdsCU^XQt1Ce*wmZHCw>fM zVTdvX3)ZNoyO_voKXaaw6CcZNlQSb+%`!Y&{7p7nM?tQ!f#E>az?fCZ1b~U-ZMWb} zCe5nsUif}Cm`XWeOg^L9yB%q%)xPXZbt+aiKXIz!mC6SVSif;Knk7cESobfnXOE0K zV=T{ezTht2+}CX|;+GiPyDE9loX(&CSvJ#7`o0SFH~Yevj{rk5shJj-lF|-hLW5-r z2k_4trWW<5XAvAieFBh5YgXuox1&TJ-YunE%-H0IgUr&KX{&}<9y$KFL3yxG?BoK` zfouR11CSpbmDa))*dsdMf+HR!_Ju at dJI&NwagI)0bq74IgTy6Pa8 at Ww?brWqL;*EWI`(M);YpPX2xWNSV&6X34&n*fioFz3KolgThVl8gOlIbv|INvr_s#XoE z$zffIqXUepqBy>i;}((W54u*zM2|#Jl>f{%ik=bo_)#Q2a13Ae+^<>p#$o)^ayg9c zoni#KzJ*Jwfx at heE2OZAV7(A0gHO at UuePvysMIjp4QZ3GQb zpW7h#@+7&I3*MbPX*YW<>_ z^rJt%fPw8ofq at DC-(vCKiXIIsGmrnli^u at sc({J^3d=N7sf+Zv9GMD%>X>bliT| zc5IORI`JXXOIs!x$K1mFT_=t`7+%tt!#kCDBnPV~#tNvt at pDvY7d46z&MB5zdFB{`!{bBU-r+%NtwQ^SB?c!kv#qS3tnU)RL4oko{ zX0n^mW%LFtMV9A&VK}|vN?pcf&Irj4Roa3JZe`lMBhLS`NKvb166cM~ixb=mvffk_Z8yURF6=t~euzuTwbK!c)EK zdaRE4d$_r*Y6>Z72dz~V=wB<+SsdZHtp^1vh78>;g4T*SF#t&x0-;7qct#RPHcRg( zDT<&{9{X$k)fs-b0j_sc*V98{suF56r1&D583)l~4 at exHE~zyVbTX-usA9i5V=qFP zYf at Cgk>p;g80j^b1KuGi&Z1a024dM8=dc5~{Ugy7yWk_~G4`%j=mRu0pojhh;c&V) zlB%GwN}*DGqE$=AA-Kzr9oj^nnJtfm00Po1e$z(zZsFRXEYm_vYsvQl)>C0%K*o#} zXYzL`>Yh(p=U;yPb{i1~`uip}xKMgT^s*albdi$z&iH)NnVRwM at c+Acuj?gp4S)IX zR3rZXWZo=f%>Og=(^Z{U`WyN=5R>bPG3a1G1vM8p71IPA7*~rY6d*DADS|RkrO-;G zl|Pb at cvOeRg9UpD4_YbhEPk+vSeYj_uKw|VJ^y3>F#Y>`4>+BnE-;#M7X^VdIz3u= zz-)q;*o0t|Nk!^0NnfI06?Ph@$YfFt=@}LzbuGlZq*7w8u0l8tt>@7QAolp}sK%oI zmpdA)v^!Hd*@t%!LEg$OmF1CknsT`$_13zs=@ic;kwCYR$4KCw{j&UWnYCmECD#T$ z&RbHZG8W`Vq!G>qF37$~vP$8h9#xdc;nE36EV4~_y2w&{Zf%wnWoxI;DyuVzd`WL6 zWI7&y789Aa^5pfFROlW}(3kXuPjAP*Z(rTM4Ny3{VwRHR5gl3Fc8 at yD0$E_^`B1G9uD+-^eWKfEuq>MxuKU)60q|%yrQr-e>Q#8m?J(?KTQ0qvTJ3fNVYE_*I*!+HB+$U^h zpVl9f_Xua+X4trLi{7=0b;x14 at wY< zV3Ufdeve`?k+Pgd6ZRqLN-=SptK1&7gef(3wgT+%#@q{(-2oO{khHrDYHnCsvP%y7`L zGFqs_so@~~*Uoyk!G_jG%hQ^1ePEmOV9ilwvp&05?n1j=0+YPK^}j0ld%R|#`z72G zi-mi?Nlm>AJDj&*4$@09ABY>{L6QTg_gF)a)&Ha9J+Ok z&5b#H(P#)0tv at M7`Dsc`U+idC6$CdNypLh|>1UkfJ(iy(pu2!qMes08r at QuE02gX8Sxz!p`wTf`eR zLkqGPFc&fCKmY{_4>(q2A^C6kvmP0LsP_vo^-*k! zn5pJkFNwV#7h2H4&jX at pL}*n^;@NoJ-J}GqOut;P1ah55{8MaRJ;8jr~7f7WR;iaR zB);DBvcEcYvbc!lc;LJj&05j2nIoJbTy%X9B9YNSftmO-v2iZ_GSw?LDfIkX(7~{aY0LC;19o at n@ z#B%})jJDX?x@^m0LHIyh;l{C(M6(n?F2yg~3^G8ljeUDwR+w*39&Zh_vPPV7T0P`+ zw*9GnEHRb?1f{a+6{GHJc7B at ibBByq+&b at Ru5ju{P;t40 at -H{$8k~1ye}G|n55I$L zra7`*h at e1wo+Shq`H%P5j|@ZKYq8vXS&z2r_EhX^(CE6x;L=kjL#p at ji+2emS_-J594ECftC;?RKlZB4V{b@^{Dh zyDpoLg##Zpm`^?_+2apTIwBymL%_d-+TS1WsN1LJ>Gonqc|lSF_;!US*1+Ji0GZ^R zi~3k-t_A~Zjk+nReG~R!S73bww*^HhK{#Ik-)njw^@HN{g5wr;E_VdTX}0B`x{@WQ zh|ia(R;b(Ij$ke*C>4kUs$E7%=CFiUu%S}D<_67S}V4TA~-tumF7HW9r?u|)3C3Zwc9h2rgDtR~|5wHl8qcNzb2 at 31A> zP4qAQkf8qux}*OUQvWqTtEugRzKrqFZjqjA#V&=Z3uc5umz7}3mMAZ0XgVk&Wg3JW zHGrHDvs6aPe&;&Q&rif{U_7kd#ak&Vr;$a+7hfS3UPj|J9;}-37P?Q)xT@!W9X0-x zeZgD33K=b3zTm<8_&Vi$$?dV_{fQI+ITJ=pvt~qooTOO~(F_OeBL751puSxZ-lwu% z9$q+-bcCU&G&^8?tF>LtcAFk)&bJjpc|{hGyE~nx&KG0xbc>Pdtud&1&Hmw=1KXXy zoki2Ut4os$x_$Es6lA3Flt2Qpi^uOg}T(?zig zIpig5S-9L5bdE|knB;%>gn1`B6WHM?yk62TPQ8M+q3zbMU8h}bSpu?pTm*{4lFI7~ z%$zJ?ND34c8C-k$?K$g;@@oY^Hrk=jM;A zs`UTHnwUFyj)jz(`6j0uvso at 6I5~RT^>&gpvwrLjTWE%emrdhYlY2WBbnJ7&k*yP% z#B+hZnaynMtg)^)z6!F%<#DV9=Cp?S{8qo>NBBLA#8xDf`p1T=+O%J;R2^}ikVo6& zuHL%VY6YpmdRfL-aV>OrBYV$#=x&z#keCr+`Y4+Fg6b(B81YwNDtyWdfH{C-)P?a14iCn5IgkPafCi_xd*d74Y< z>`Ab5wYkGnj}sXd?Q;E~#PvJb7`iWF^(|mt87r0TdIVozRfgv-#)@8GULN6oXrhMu zv$j!{z{`0&g&vHHDW7||DH=mDymlu?RsE}7xvNNx-+aQyUx+G9(k?(LqY|Xq&)@Pu z)B}(`;7a;gXx#j1z7`hy{a`Wvqb}<`(;v-GmVwC6gYqoY?jB1hI#=1>jG#5Cu%Fnf zd at 0L6x@o>gtcRy46?5wC&ZiiP1?x*@SDXYXTVlC-M|%KL+ZirNPq8v&$MH8(oRI*D z#24Jh`~tK`)s7D15@~$n;6Z30 at ar7m88!BIMQ8h(3}Z0{Qg5 at 2QrhMqwlfxXlIsa1SB6bKRy zGHIs{3Rn8}U1ENp-7=tpNN3#w3Iw374f}J*=4Qb5%IChL!#}lr#X5l7o>}>v!4+9 zn5B at L!U<8kzDij22i6$61#}35Hgig&!QeNgR`x7n1Qd9w(sU+gWaLwJi!+mEGZDDQ zVo-M$RMlkEUGHo0( z$mQ8n*+Sbgb4x0Nw)D?)@6LZT|FBLW7HT9R9pc)Ny+2cP6g9~gHGU#d=O4YCG}PEo zlAnN#loUgjqha3273KT|P4#l_cziMXg#8Q2h*m+B{9TSN5RYgEAKj9lVQ7-=12v}Q zD+uWy1JRd2dplnUFtBJ?Fffk)TYhH!A6a3lo#MI%`tT>Gf(a!vsR_Nf*(T2j5iFaP z=gLx_rRJEZ1dOeaM5#iibWITN at YLIn6_2$j_0!-5ne|t{vhpJy3Is$c&!~N$*y*-M zj}L+F?lHm7?q_%*9K}TJAx>j0Y2sjLYTuAB<0p;?NiB>m6XvQ2BYnU(;}vvK at gWat zz)oN^J&rogI$#uSawJnDiI>G4djYo%BW*p?X4O at fS>C=DH*?Q1%&2^=Zml at g>=(d* zq{S}76cEh0p`y+ia4=bM(Yl_yb81(ebZ$YpWkMW1gMOYhHW&J1 zi#u4N7z0XPU at 03{&<&?Z?}Jjs{DpJb<@uELT#ObcbCu>CkDnA~QsLr+Ue$#^YfOLq z;PDJy7R_k+kh1+?mXtatHw(Qia&^B{ptGOJH5E_*o7GZ{c2Qa$mIx}pi`g(VOEB|i zWke=_Wx`N?Le7cj7hW{SUuA%aifKlI at iwK+&*hRKA7wSVhlQagKW$} zb$FY$b}o-A))h|#f at Q4{x-=3 at 6~=gvYNpq1k<@?2xs;TLgCc{%Ck($2(p^+gMdp*0 ze1vlYPadt2DCV>b7JGmbPw08f;~b+zl$%>gW_RZf;eUeyW*Wj96tpEU;%@c zr^jH-FJr9HM>Nl}TWDPco|B&=m{u+lOH$+G30SiXrF+w)l`~sa9-FIF*c_tcDiC3^Ou$eF?U_TRU z;eO6|T;Z%nxFkr2??ilb4;T=CNQQf^NUD7emx<#FwMwK4{|3&yNp9d1 zIPjDBcwWHL8!QtskGtJ?M77E>Lyw#8F^zUCr%kTLIdH>VtnCivI~^xZs*kUD+u(S3 zIn!(_NkVMek5;eTbpM`Gl{>z8p7`S5HB$5 at 43=lprdI5UK|Hr`*4Sqv34DaSYdP44 zp`3A0LGsz-@(<2Y$!8p|@HgFmQuqKeG!D#n`|JWwybGE0-PSU-nJh~3C+eyqi at Sl3 z7#FV(HgpLwCV=tQofa~M&t&UXg*Il_08pTx*fsx#_dkv#9&Fo;75q(MSHAuSeK^*C z*FyjMkor8dO`5)Nfm)yBAdOw0fRM5+IdcqIOlW!&$If0uPV($I!$oje&nQx+rIPd; z_y^Tqj$L06Qo~wFPRHYx%hbeq*Sy2;9$zS>J{>q}bhR=qr3BC}mwjPbUJ*$|Lr^3f zlq_5-#)c90tw%^2Ju7-v$vopdUa7 at 3YKGr%$zVh4Nm^#Ve_x0E&hxjxgQ)I$U2;?T zmHzK0W%~ufxA;J@%@b!JEZps6UeDxabG==HMa4-vaFJP$_-EKu$Oah%b`#LfrNtg6 zcX(7awkTV_#7>bA%d^Xe3N at yZstq;QQ*^|W;dfrOHoE=O2D|UDS^6aV&E(Ngt}>jj zQA#GMun0xy=0PnsHh2=pVi01X-P}u39`3nqp&@FSq{#A`V#T?FTeW8p`64R+`V~Z) zLdNrLpf#%O$t~%%4NR>{Z*jKqpIF*Nx at 6NNBhUT!vj#(5c|ET*G1+d;z;!Gl>(Dm2bgLS$1hk zq!BY5CBlBL5mZA$i8EzDne|E$n at 5FF=EiLUtr_mK`$FHltatjpQ#qT5Hzr6$>>Rk! zg^wV1`$5Q>d`TpVRW9Q}la-x}AgPfpz%w-`&nCRYV|@2 at p}$|Uu3y0T5|l0dLQse| z!08lgE5A0t77E{_KzLh3-ebE(Y!R%1GY?PLD?t2#0}E`SwEP)6bJ{a=D%r%EUW_2K z1{UFXdjdh$LU#X0V2A at T&lUso(dlqA;RlT(x`Sw(AiOvW#EO!bPMT9_ncG;W%&Zm_ zAN~?CKRUrcO_D=wu5qjIE(C2<){Zy)Z4<@uC3W1b>14bNT(D+h=Q5Qf4&TQ=I7~`d z1j7BV%|}E12R6_4UyD4{?Eckz_P=OPLxhtPxp8QR z$hS#*hz+S78W4MD&NP&J+y2*XhG{$61kSyYhFq6v?r9f;3#)*Smk)?ulH7xYK<*H_ zF|XsYvSB^MMLYuLW9SWfFMr*Ars?=Cl9)cv11}OS4=?Pt?u*xWZ9{d&24BA0tFWIbvzwrkHot79!nk{m zlaG6DwzRG92Nq66Fw=YB(_jMNgAXdpjd?}vBSnGIje5WLpf{Y`mg~2g9$>^i-kRsH zTmL{OQ<HFk;C02tGhB6bFL=m1Q(JGA<(lE7T58{ z!fw_fnc}%ka>$%LQdUK!7Ea9D_W}ll73+MF23FO z at dbX+1UkYpt!I0oS91~;_RRx;Ga>0J6by19$n0b)vAm6eaRO7;on5v5JhI$Es(K9* zp`<*G?~C^DW3!>^W%=nc>t6$W5LkfmD@>@R#9#)*F_vGX$l3+fFawtP-O9BWr&G<% zHi-wGvkX>;v4_}i>zopvnqRP>Cx{XX5#*X6E|(DVgXa#@DbB4ffd1RCAxY)y$r+1J zDEiHOM>V~sEN-UDXH8W*d7(F{%Jpou7fSoAT^97VwFfO8H&J?SlC^8E-lTBqHX#KD z9(R7A8dV&i4ZZr|6;x#vAzKM1qy$n;YpxC;*Or13^lA*AIbpCWPP~}= zmNBk!S&jHqaZP*>eDP$Ng)@H_5;srE7pTNHRsCf~%1`tYclg)`*J6ZMehpUyW*%F1 zdLv9~dP|b(9eL++1bxVcEX4`?+#rTfOYu%p{dP?lcdDeXRb-1oaJ{J6QIro=-=6>Aa zt+Rkts7>d`WB^cI<9`+T7+iJZ}+yZ=|_Q zOugh?`_70<@1IgY|8&20S2%i-K^e|3)cLq*OLCyWg>z{%i?mFay#bKCdKP+;Wkf9P zK_K*B6g;tf0gv_IIGBYdUvnFo#bj7S^Vkj8LB6Ja6X^4N1CvEKllBeQl;&NZ$@IB0nC{Jag4FJo)^q1vUlqcZZhd zHr3^3`Q2y at JAGD8_F?2#23C?FQ?Ou_db*2b`AIi!r<*{&(nG30_5RR49Rb;ppiC4k zlx0uZ)E(Cnk^Bs at 8qbYczICH?DNU9|tTh|@xcSBN5*% zPI%}XH+0i{#+`X#ccp1(?*%l6tD0xtN9Z^|_FY8QOy=4lfCR&si!9D+w$YlzeRTf= z3`q=<)KX!B6c3CXhRZe7?pKA{YaOUV=F$(S)i~LNyJAsStP_#L2-#${?l5!*jLtjD zAmBXNqH17I{dB|v%nSEolfexzi*d)5#AzzbI$)goYtOq~w3k2gA>?|`TwfEqeIGsO zpWi>x0W^a9X^P$1^hH~q0<3KVOCHSdr875KVw^ZwNMzE=nBLX1i+4EX7HCB7z?|Jr z;k6#X@)f(MV7g3-g0Fb9Np(=zh+}q1s!jZ|Lwd37W(KQfXiTjiSXVSddWie4cCi1v z5 at _8MYTd&;uuxD5fv-ypAPG2yAE*AvX?=7QN}CvYV%cFhxAT7dkCta;f_1H z at KzS}@oQ*qKZ*U|E?GuDe?tP#?myUe$5h?9{4Yqr|C8ppu#3Er)E>H=;$B6PrnIYT3a5Tln~hEcn#td7-g8 z^aIRhE_dE#+Us9&WY_!s6yq z2%V=~ex1Z96TLDG!A8aj_;U`k0tk z2P%zjp#wnZj7z$cnT|A_=5TGQ9aEDu9)RbIZ=%knfbn3mxvd3H#+Q!^Sdh?6n|l{- zzivtwu59u2sfI1cQftG8djM0Rn6}b1N<}Uui=IV3SL_!bXh9a=8q_>u^O9XGQk?m{ z;Qj`x4a=tH=&JpwwBtL`7JM(6o-fFr+wHn9-Yw(!x32-QB&172Kh6m1HDJ%+ullWZXn`kpR{+QO7o;* zZm%i4bwsvwd;%-5$;xJfU>4uKq0A#4ntze04R;IAC{6S42qhx(FL%&VY#sl)=GWKO;6O9eb>FIW$$h-d_IrJQru~73X%Zj5H?9x+ z-nxv0^Z0xtG$0DAJmI*LAok5%oDVYrOW6>6Lp5e0wz+5Dy7^RxL$si?`l4J0w1{vZ zmSqv%&b}#qAU44|B5onRsn4XZyNrjLCa2mc3q0l0n at FS8&@b1~Se!vOK1-DzU}}o2 zOm=gTT&FpU?U-ZI>#DgZS*vgT8DxLT!0nZC0bZ($n1KLv99^5Evf-(%<~YsD?5eTH zEyAJE#aLWXvdbCoW|?p?2Lo-ann)i|RhlCE2RsglBlXVXX;qa^RXj|YAyxbe#KYx`pQGA^xNw&cTs7w;>Ot}3(sZ#g{8Wlz01179#kS^(GEhl zG|B2-0O+?&^uI{>=XNhB>sIReWMUEjB69kIe)rU at x>_6&`v0-^PC=S>UAAae+LdOd zZM$3d1(ir^hmGC5DuSa_H zvR@%oW23f{cA6y}3n0G)J{+OSI0w>WKm>BO-G$=)?94nw+}oBN zlQ>EOXBHQ~c^P3r^Gn9>(G#{A0{85;jeN#C!}!* z61jtIMJay}H42*%1zxv`c22taw*^iJih!gu+^7T%k3wh at k6Xz#e8Yeb;Gq~%WqY7g8;ba-er*-PV~zg|UH$Q;{UQpX zIrx+70)i`O12-#p&uqUnfMAc5%Nzc9j5P1HEto7dba*u8`Sl+IBo;`a{7`>)aQu+} zgKqc#mr4IRlu)v=LE=O3Mk7~=9*}>#vZ%uFQ`Yt at Q?6~ESFUTs3ygi(PqIE++plip zjC^E$JN9+T3|IMTBzn(WpQw)Y{5qSs7) z3d(qDLv`aE^TL}gN~IU}kZ>7bLsj81Sl&3O9raLLHkr{RwOs3x8jZ2Q;_}{8Y6pS9 zmkgj>JIXUP7`s>07!EM%wOas|&Ls7nR-DP|E|i<>7Td7)Lze1J-Nj*8X>6CwG>|B; z1m*bt4*E^hyLJAA%EXnFssqSSGN_p&V8J9ZP*t(Hm`)~L9fHDdx&7yGXORF_VJY3C}Y{_Hcr5o+_N^EJ$WRYlpf!LKL<9M>)QmB z81H?kpaai4`{3-zVF$QB)$G&=xq${8Z2F#foIbUY?A+tBD|(r{L{Z*qYfTjw>8gNl z!t9H!@kq_0i1DWE&7X)o%LHC_5)MQnhw;~Xzu|})l?SmHg&Fwn4SzC{ya<6bva_0@ zwX2?ic;+Cm^#ctc`or4D*!o=WMQ80rJGIj7Aqi2mK5xGGg&Bxy_~+p0*Lp_IDw{tc z+;v2QsHML8;O~8(a$wq6S#XBMelb=fJQ~JWmltG^ZYjlkhKdlp)nsW#A at qpyz8HM| zv}iY)dm>SW;&4Bzju%B7*dY$Es`+YeQJZYLmkNhA8xETG`5BLlD86Hn~V#E}iKbL0rIGy(f_Ts3>o> zkeMKl#2zVKx7btRSCmH;wGlDp9IQwD*=n at _Le{#$*7o)l z&&>8!*2l_D&*zWaNE^kI)+#;N9LTc#+;YDD_F(2s#F&nP(p><7m8s!Po2w<|s{9Su z0Lcd2=YkifAqFd+23hhPRGUF;et+)OeX>Om&W^He4nYTnCFa9>wZ%JjG%BcbZ|%~x z%4OPe)xPF|BKKcO^X3^}K|QV)=D`i(Px}g3D&qwUY?>Jh_GUi)4F|JO zP1uAEnG2!>2)(ZTz)mY1m>EhJx7KOd=@JJTCX7P3>ru2*hn4Nq#-CQ-y&R6B05f-~ z2{Tn5^m{=HsCZaiRVlEf4k0d+ccN_Ep3rpKly0L at F2sriIyy#b?vqx*4eJ|Ug?f)=7bys)P-6V9BkU9MqpYu z$~Sh2u0{J&IGXj&Qu`{S*%zHOhuH=$6}h!wLW at jEXla4FTqymo&PI2&aD*->Uc^U0 zF3#C{v!j&~1KR~nxVH%M;eWL&L3bOcV$JWvPM9H_BsU161sqr4ZUNFf^YVPJV5ttd z6Ryh1MV{ra{I8H{2hH471L(=QRxR;DN)XLBa?Ll>m`C(5&L^m>;Ko%8Sw}ItJcUn0 zv;-l at wCl|)CiLK_+YnQ@{Omv5iFav zDw*Jv();|G(D|l^`H)7b<+Q_*+Lv3JSG6*(NIkNM&#nTet>g14Arrm*J_dM$RXqMI zf=Y|B+5-F{9F&k-J6DB-%lQ-8vQVMPVx`FigNI*1#meZu!zEyM;$EL)lV|LgK~ozA zU$tX;(G7ZNUp#@U<%cI+V=8Crvt>*NEvO138d$)?sEB& z(iVkjk*F>sg>BA<`VMKqFt2~22uJ%-*xR`t%&A05;$W5B{osiljV_-_t`sjAk(^?uX6pYIOi?zhTK{%8}j~r{LKh_k< z#NGz+c^Z1b+|F5*DZ;^ZXU|s^DL+i#OqCk>7<`U1CIbzZ_IMlGT75vj$aH_3QkyL& z1RZoRh#;MGeL%mdH8ca>dKq+Zh at c#~2}xpb|lQ ztjmQiZM89cjj@&Xz?8IgHC)*F;A5vd{Ij#&b%CB8h++TDaBQoXXJkf3+bdg*w||C4 zYg9#6!k}ycgBvB at Jc+U9uS8wv3*h7*|#p87H6`jJKtzeey!~n1E-?xKd)ab9q{E zrc$bGu{e+&W-D6}DMzsXVsg?vii|ZwtE!jc^m)+T0 at FD!SJ%T+fid~?8YDkx$iP&+ zOMmw)Iw-M}y%b1X72V41Yntt;=mNMkPoI(dG_|lj(#km8;Q1dEspaC8-m8UVtD$7{ke_Tt$ z4SZwxSc-Yg9WFJR?scuA874ic2cUAK-bNz=jz>HZC`yg4*vytBX`(+C>8SI2?Hg388zDI6IhAIN=GM_upx;uOR3Qz6NDA=D zFELn;ZJgD?ybwR=NjK~Z=GC*9mRmM?q!^L*f@=S+*efOV{QOk>#z?A}SJ*HUX;kat zyd?{-WNOzutM3*oY%phee!ZsqR2A*_gAY4hnMs{ed at w%4xN6-N)0X<;CRIa`SZSp% zO<_fzX#};ZOnQ|BJjhorLt|ib83wY!BFK?#j`reqUF`~4?RwR6M%hv6~Y`mMf zQ{V0U$}T~!$M|UER$sJMp)nA0sFRc0%KDU3Q2WzgL7k_X2AUSaT)o%?;(2%hMY|y+ z&tz&bT1V{M8WFkZA1g#$NV1uxbGCn>kf@&B!Fcg*eI4zyBdE{x(j3fFK^C$R_1$ph?67HJYGr3clS~xb! zW9p{tz9{Kd90hZJN0LM*jaoATA{4r2-K$o9P$bSxj70}=mFEA5+(@H0D2?&VV3VoQ zw~hg0DW2}qFS at mTXSxWnB=ngZJ1O~@cF`uDaT3bHVM=wzl}KNwJHN|qY1H||r{k^Z z_kwZdv-K_g1o%*5QQYk}spNgqlfdzbJiqpwP#@aO{Afc=AS=t5LyOac zMb;V31t=Qu?kGB~7eB3A?Li*{p(VuVklB_Y;J~w>sYxw0Lp;UjMp?jBVVZT6;|Q?@ zEX-=?rd}AP*|(Kvm%ag8a{p)dxhnp9gkNNXB_+cRQYd;stY(A#jx$g6io0A2m0>-L z6|dvTROa#7DScv3b5VvGMW1v4${gdX$gJ)?YfQ9b^yP&DCU5=XROXNOCF9A at 2ay2W z!WwKxR4ubvmUZjdkT#b6W|t>@alMG zG3=Q1+^Lnc(kyN7tXZM!oEbBom>vCz%olP__zLE0S;+Q%DJFQDZTN8;OVCa7#Ebpv2S~+557W%2H^h?+KJ3;$rXh1LXVR+Z at Z3rlHp?ePQ7ymCNkg3^gLtAOe- zvB#;Yh;c&xbBuN+Sx;ckZ8RPy=hqsb8yi at z(- at L!#Ql{FL$Mbrc!`sTtgf*{B at s}$El*P?fbO^S>#GDaSHQGMo~{h$pq4tuP8vK}syy~F+{nM76&wcW=_3Abaa87wVEa{W2E<|Jo?yeH=u0m|7&=L;!%a2AE4rP4pSUUwSUNGcv at 0** zkv5LI9bx4s295xCyp(;J*{YY|I&bVRYncTyGg`1y_;%!ooc?)5&sUvOMCclB(P7+I zi>s2k~CD%X!&%af;x?e zG)_d}zY66dN00d(ZQ%3i=2C9EI8BalgWj|oM@#DZOIh`UpA~;xo{SPu?#OWP7(6BH zyuIMcHrYaxAwN=o0W$_{q2b%eZuOgU> zv!YlaCR2x?=>sfVce1uchD6GY8T2 z;_>dFo@`{)7V|Du)R=VYbO7t;X7cT z_W38nlse}tfbqakBkJ6IB4>yM$Y=&Tl7C`m7USzr4fNTtSd{7(f=}g8d8v__2jUh! z5A(7<+*i3?-w*RY+W;mpEH^x$a^(T%uWt-_6RU-1HX668!XmVIv83U zzG&%wau1-CfiJueE;=8`C0go|y&F zT!3On{TF=}HNx9SK0s?0%TpSW$@ZbDk_pvUUn2&Upd3jrophX7MWGItpV%w0o5rnF z>0 at dA>*&Vh(p~aWUwTadxc?~};dkSzWVTVrQ~fA at P>d`NZ8c^LcVRU?=H?*Aybu_s zekN6T3f~>~Ybsbz+3F8ZOsKZF0pw|KLHz1NP0>9q^mf_4B7}N1bhbsAH8u^)Oe19k z*b|V#_q(|-qL2yCMkDCUg;0cKB-&a5FV(kmy>Ro_PV at dlEWM()T8T%rx7w6`u#dq! zCz#oKl}R at KM^7nM@{&|Tb}-;Oo^(uZ!G9>+YawZL#g(mRw1!Jm9`}0sFxqLxOIevr#u(Ef{UlFVPY8I6yGKk*3 z74!2~3d%hEkKIDH%WM8vPTea-ut}Q%2vJ{WqK)%DzDJr}rhiT>mR_svu*}v^6|1uN z5Uujs#Vf3`-bny-{&Hxg+E9u$pyd!1zY`%?{4L%^nt3aI%{K_WvF%&@H!JXUeK{NIt5Aj%}TB0W)suDfi62^y4`fq z)~u_NC1%E&T at vP%-$TGJ#=(!7VKoD8jo6wtpVaJ9F~6#qVO>bEOiL1OU7bToLu8`y z=iKYMd%J2!B8#b3;;iIb=yDYoxIQ__rR;Xyz*97m=KXi@*|dm3?ASN(SVpvk9nmKe z^i##b#J^Ocv(Q$v#`Z&e*AEOOb}t?py1;{ip<8^L}B8`8#=joMYox9?>H8l$~@pfwc=}{*87krwPq7 zOD)Pxh9}qsueP~RqIZTXNucH?7LK5^M_{roc&($=xwrbSsXP6kh#LN*AFj*R>7_XK zw at POBhayq$&7RkP|6$dl-XVPZsB>~DXkNM2d^547q-%uPApb*oS_`|+%MJIwzS1{k zq<3Qf&mmNLA@}KCk at zhm?nCqOjeL>oZW9#>-FMVBjOZN9()?bj5qpIZSi^k$On6Pw zM|Tp+L(`n#j?#$Ygp)w&q5IJIwO;q{Tyb(&UNa+b~3&YyiJ$c=Bb=?Gq#$~BR{ zawBXhoNm0 at i}8`?vFm&Y?!EzLiQS>YXC`xD?hWAv28g>~(HaSAX~ogEOm8C749(7; z3YT}H!8-~|lSmzRR&PQ?{iRR at Oq|_z zMKfc(4i7+85x|!u5GNono;UPfqOs)w^DGVnZ;eJiV_FDP?q|chdhb6cGI#wo-Pw+x z@{A7{Q?snITwMv%%Th@$)4p-+0k?b=h-rPb!Wl{189_gnoRqKaf16w7biwFDc8AxA zfZpM%2~iNk=A$$df53He( zWI~x2>VQMBDyYiH25kpO(uy&=hf6Qhm6T=|v%7<*SwqX)$eoHL3Qt(@m9V2UDy)>f ze3N@=izO%Jkd*tSaQiJ;f}8vsn^emxG{{I0e&a`aRwX8}-q&0-lQC~(ADCzy_q?Uk zvfiP$#_i;TInuf2pL1zD+Jw!qv at 3VC((Z;V(Asz^FOthqQXw9?mC1zle-yJC-+vl- zD at E2Z)YL^h0F{q|G|pi+B{6`ZocTtjd!RBxO(8+83W^V at GE9>)N}Rgk1>NaiP<)%E at AV+Q5o8zxx1Kcr#0Trlv#Qc4G^+8>ne{D^S9IH@ zz+}(nMw&5X7!pAKiZjbsUvvdJCj#N=OQ^Ro>{S>FW4U>Kvf!oAtlY&n+rClO(kVxg zHK*WxlCIxQp34}vndsGy&@7(q*JoR1i>bp)7#h=W|Hvj3kY?w%#}NiBhlPgb=Ybm2 z3H-3d?4L8%q3 at Hjv7;=( zrEU~M*U0nzj}A}N%gw5x?dU)(ZR05IWNG=IR{u4V z at b3fO94E_5e%OStii1$tHXx{oEW^5efovhhYz7~TNgU8x7VXi2KKn8VqJgGNo=+l} zGc<74wW%Z)2_81r?8odgZl|xG$M1ANFsqRLF=|i_qG6%osO4OH?==T}0AVL!qEU^1cckDK4P9w^W3wp6Fk_rv?!SXd0PQgw7 z=1cNQ6XjUy;nB%;eqq!gM~!QPGWc>5 z;}q7|t-lgw`FaIh1NW=E>9?Mn+pjU6{?uDt&Q)?p z6xL#2idyD#QHFT{-dlV)!E}%LHlW at 6aU9K{a!jxlwI4TfKy&$vl*tSJ_7hg;i!Vq^ z4vkwiK#&{7flt%vXME0{>qT8=F7i)HB&eU>$Etl=PCHVavn%B at fA71IJ?E`1!sGqlg!h4X+g638#`ulcb0P1g54et^?m+f z`rgA;GLiO|J0O3#L;v65&c6 at uC~C+o$|8JCZ;xN0IjhlzvvyWmw%~)&k<;db6EIZ1 z^|oJ!T!~R6CpT)rev2dbk)5JF*~`fWqmTJ(oSz&nIfX*c+*+Mhl6qFxbmv80;ngCqpP4-!K- zJ;O5udu!G?(!{d^%Z(WWoOu0V6aS&@G8p!;_|ytB`B*KQUUchD6DgW#QWiKRS`#W$ zqgIPk)6lh&Wd2!F$p&DU+!?J)&TOT^b!}Y*(=)V!Q?HnwJ(k7tZ1swR4cHBqGV;?a zUm at pnO18f`hZIreB8~>Aeb*46w4?Wq1xX1Qgcctl;?^Pg+*gcXESca|D~A=VDW))wj0LVc#M$@l$%N|LAqyVo5KUJi|> z$km%49?@E;4||O9u)QHP^_jwf!c|y^>^_wHh?SV<`M??~9qIkrv+p&YTExu$!Y&b5 z;oraLeqeCI${P3@&U?GMgfvX6hd`nFT_;H|z$%tqovGMHy#Wzh2p>-(aE(v-5C9j) z5`!{NEb(@Lo66G^lK6#t+JY3Wr|xh7`AauYnR#9UV`wcjbX{6IemEDWEoEuPuZ#W1 z*8?^icEF4X5BjJu2uea~qFDF=MqJ^8mm%qI{EXm2Vwx0xVrh}VpwU|x)F);_JZ{k8 z19|KbBf=hg6jk-=cxQ|k^;amh@>_zBac{iwv5TKb^)rJ^D-4KZSdF9VA<^FRl!jD$ z at Qaz9XNL>V|40%2niEsZe_`GW`d>Bo{sHs*`a#0i6OCjOw*Er{lM1p#B1V at g(4PZ;x*N_n at muDN-TBB{8SN^W>((OqR#- zMh%_LkIFr at AMDiX^tZJ at FsKp5A}Y0kw?cOY(YbR(K#q5TEH`_3H7fr$ zbjThjb+d`;gK7fWYKY^%9>T)yH9o+BY)8?Q?*N+4LOdA5LSl<|ZpW_y4{NL4D#{Y1g`!@)Ffv?ljz*K1# zYTpRYS at EIW_^*a1LxM_| z+9#?KYrR}#`aptj!nqhrXDl^Z!6H1eZ!m--G(1zznRgl=&^^hNM2s-Oi=2k)xOWbV zF9C%Ss3sb$zeZ{UrAMqril^!Yhf;!r49GD>?2E15Bw*dDh`e;m9n%ODZOi=$w3)2x zlsC2!tix^hS4>C}`*OX z-kDQmVY1}f=I<>NI&Dwp94|D>GPUx5wlN0k94SYM#?ug!>GDUp$l=`4NB%mcvBrLz zh at z2CaJ`IdRKaaFKP^vB6 zBdDhYx0N132v&;3FWJK)CBKpWI_dV;Q8Aak2++)ZV-9D$JHOM4D&ODS%DUm3` zmw9z*wF9RqRY-5yPeWSjbQzqwdGjGFk{Ee1w-0u_)CuNOmvkO!IRMNh%9z=RblL}z zZEBTk+;1f}PHTA!D{9$WV8;0+XEI3C{7%wN;|>e7_{HXM;W? z&N;^iEcB6N%Nu7!8vKZ)2pPbTPp!OWwX2|AiWT;kMlahAQ03(!{2o475V3qb{)f2_ zE-d>H_+R}^|GUKf-+}*s#72fv|2}JxrM#tpt%UNuWyyn24MvD`N>;^?!^>|$!$c9@ zs7gFbiBYu_Lef^eL5pqNP&N>-A6fGSxQsNt?Yo`A{3ai9U^$Q98pLvId){=I=I+_y zKHltjKi28_0 at sDo8DR)}-hTnIVDMxMhpHU0O*!`9vW(>G6S3PIIl>@(Nlnq{tgLUu zAxp`^z#Y7i)h#4|TU)fGpqKM1=UxfN(O?bVSl3h2byTrQPv5E=O at Gj!^3XW!Qg=)0 z+3+Qjr2rsf2;yBP%&AQ$;ao+|*W at lVg0mOJtr`<&yo2ADYuWVIg!7!kG^O~7MKIrc z0QX3n9DFOPF-RM^tgnAYR79V7CKh|Iqci^DNK)0t=i55a)|o|l`&@nZQf06;3&_lX zb%nvwVemA~b8t@$8YbV6ktfzbbvU;tDg70vUpNIZD5HRLLO3f!!5+=zoor}c at t%Wc z-X3DNVqIu{_{fX+kVorKoC9#nv at 3-6#8?Up$D?m`fxU4XY1tR~ySfG%o_hTDQn2+o zs6>t0XISO$4YM^)oU51zUvM1Njf>im0)Df{cFPupB6%@g0CubLz;Ac2XS>baZju=D zt*;qamk#ri#N;>f&mI at HT11BjsLVo{GJnu#^ish_Xub5tMc!?WFuc~3&PNhKv+hVL z;+ePyqABPp^t&G31DG0wH=J>X{#Q4V$X`Tn^L}mO2Ecl}hKOkFlA&DF5x~`P-qqN^ zHv2feaqWq!`iumHUfP&57VG!o at hT~VL&w9;P}Ok|?}B%~2|oG at kc^5{ZT~D)2f*Y! znPHS;v&e9?%UZ8qlS_vlRiLma(|q`?ae-v&3i<|~P(|{T;}R*mBC>fwA=U-T+2N=R zNovO=IV*0>by>H*FDHV5I&o at eP;;lkl-Bou{(?1AWDIPpRa~ zC%`7t3?uio))|8${PmCg>f&=~bq at jrGzRlu%~SvX3k<*6e at IM~vX;Y!APV<+%xdz| zqM3k#y6L at K=mi^d5%0!oU@^QO0-03CpEMrI>AljVqDX28My{K2keCmI)E|sR0Lh)y zT at i*&DySj6G<9Y!)#tOTHHVq)u8un$pYJaSUyT=eK6pHn*gi&&oI=|i9p!pg-*WzK zb2KQ=^nMe|-!ghyd}!EQ^82Ht9vKvtP=&DPq8wHf^a>WMRq_kX8O79b8}&4d#T3}q zr+#&1c*$UloWcw9ThRh9AM~C^E!x{#^5+>p)%Is(GcPT1+`G2)52vmALIvhW zXALC6`p~B+Z(2$bcb)Y5vW`SKv%p!Eltvdb;1u^qJiM=t;Ior?%0{h5vrYpJH$gS!g z<#?w%i4XLu>u0H?=vm5u61XaiJhb3~_OtY_ac3<14uLE?mHYY>$u09_+$(MpS2y~2 zJXol~oG}CIXFzbgNc&n|a+rd&_ws4llIIV%Ynu2!3kFxWa#f^_yy7Fwlk?FJSk1qc zp_12No?x8X$dn)N<;KiRrOdRu!F949UrZQdn`N%tpNSgQ|RTl_M at h5n0v%N;A1R^`ddo at +?CG(M!ZXM zd3c($bp!QSCw>a0W?2spRnpw&KxuKTH2gbyZa^KXMcw zp$ilDn0-d>kuiQIdeWyjR3sbu%0K&dU^XDxE>rs^F at Pbi7>?+p>4!fi0w0>8Ik2~^ zkk=NT5ZCcj^5*_i9tlXBO-zIFDiq at j3qi<(I)t|hd%X!|Z>hXTk}`ooFJ*Tq z1qBH7J|bM1PUSZ+ at i0Tj7!d_G*zy;}`)pE$wdQmA>8jfGWO&M|r= z;-5H{L?oJ%5j7p+3ctvu>Pncd6(Xf|bM|4#$DF*(5O^OHHl1 z3P|I0n4ZKu{x>&VPG9Z|ir8CGz8^70mL;{}Sxm$zMu|p>7$^%)AH4u-GF@^fNtZ%6 zO&48r41g<2W2N-*!M$pwniWc~NsnE5*02=K z;6B+g*l>cIbY61A-qnTc%%R5Q!7AL+S#zP*X`o^7IzpEbL!D<}*blIqJ)@B_tn~9& zhzHHajh8ero7?))al2kj zSx%Pz at n9-Ox)mG9WvvhY=f< zr-v+3HTfVVb^a4vjztZZw9kwIRV`#t_lj+t7VAm0Rfe9&7_P*Gvr^;+)1Bk*(cI>f zvGB1mO2-)D*y0e5UaU2zaM&@@QR9i6zVReF(GTATsIi|Y39)(49BQ>IqV=q!wJm`V z2l-f*e<%^$5l5QZ8a5xOxet4!acOq_x$!OeL)5=Q4V&&zsgR5(!+G_uV~wu`mOT?W zjg;(QTA*ZHT}CAWKN>1Gna;16&T)-|vNlUPM<@3AO!4%o42!7XNG$nZ;r=s1eYYJU zd;XTxHLyTHg8$Q!`k&9*sAwo`2%~&0ucEEyYYOCU%F_?7q6o}C7^ehcn3_r=LEA~J zH=@>?3mT3!9WZq^_2kKTO$)rmI*-Dp#7;AvN}8;n#+*G=QU_YWx&lWwigcLt++VI; zS62Fbd)z|!Qh2TeN*BIZG59*P4pnXNZT86{2j7|jO{hY}IGdP z7$bzH(h~l0467ktG8^yoFj|^%t!YKP)aIQX2G1h4SY&*coG2D z1mR(AboOn^qvgc@@Wx^}8ISQ;5*iv*#jguT_g8()UfWAaNqz;pZY at +qmU{@f>0s`@ zI&8pIa#PSqwB@>@(@q(G#V`fMmX53>^n`7J`_1FwX6&I7DpblZX0e%J>l&+A9nT9k zF9^fuFu%EUh;h;lu#`kei>tWGgDgzApNUf4BO?0r581u31j?*60hn9625vg+#wU&A zmdS8i`BJP4op+eiON34_ at _O`2VW{<)VoSAVaO)x5+sfmmN&y9o_h}D!O0gh(z zf*lCe9I0o~ZV!Uzl_c8We9Xu8ZWasL03~HM&5q)V8&`L%pW#V`8)7{oKy+Hf+U^mK z35R at mTVlai_qrBTDeSy7X4!98r&vQmcaRBA37%M`R$+oJy at dOmH-b;IH<9gF^ujK` zUpUVg2n{1Pg<$yXsq at 9Q#l}qdz$!2rbMAiFfrc z@~r|iayP(xj{7}}nA&iZ552U)u3ZzpGpGbzxWt->9p1y=<&9GWH2KLWw5^Pdj&IL~_^o4-eg{P>5r#rC_LxBA}{J_+`JK_D6b zqc>Xsf$;JD z?iKtFzukmavo#fcnay^X={k0s{`-CYe~yAJ_l2-1xDa}xU=2|gWOHfqK(&O`hKnOZ zVDIWq%SAj#V{7ozM~ZjTv#mO9 at a(BP$6}#7q;svu=rN#~cVPPcPF*_}LN{km)4aeB ztB!B^rkDeKAz(Y4Cay7?uQzB}M=xJ-F;_^~3iO^v5cG1T{g5M-MjZOJf{R)37KPZ0 z&;;s_T-XGfr7d=Zx>)djrCO!HymlM4(>VMIy(LdYxx?(eaj({2#F2027^A=V)=T@@ zL0F4gF;P{(o$}m@&S+_>uqbnW4czoQAE__^EoxqB(`XR)6ff25JCD1U2RiX8C>Xg7-$|$%9V|1vE|yn}OiSvne`>ROU`3bFeY_ zl)Ei?7u&vk at Zk&f<-Okdg(XUfBKxPkS%Wq7@~Kk%sX7f|+(Z~Wh+)~*gFVT~gkF&G z{lVpeDq+UbM2YU(5e3p4nJ69waUSnC${^Th^uz&GKUpkQtN7Eppds8IuFeP?FiJ1W zAxycyH?Xrmahl*O0F5~DcVr(xAL`u?^$9?#$}NG32zgCfrN^-Jy1DLpg*LSn&Ai2D ze^9k=ZF#-Rvqqd$x`*WE7EV#Bn}(pk0Q^sX`Rx2${5EhPpj%`hApZYD?EdQ-qpF%M ziV_MpT|(hlp at AaWWB57`OI&y}A(i+3Y3kK0#AMjUCxQF7%cE<0W>?AP1xR~`v9UvD2U zKvOTH5pJ%75o~X$7)GTdv|t@>k~b!~zi^3B3p>dN3MRz>WcxyB?8Q&ytLH)_Pi_o> zBja-ZBWYbZVDR*hg6!~nvh3M|3LkFjeGP}DLk=Hq+Y;c<4T~_6U8R3Wz(T+}>l7Ii zq%4FPscKuPlCdC16v|xreY*isGg;AF?_X{eDu-H!|hRou?3^(jyCL zf_{%}7AF#(A8m%RglY|oK3}AXhDK>Ad2!)sfyaP%qeuOoHW{N>`mNRR>;fTJkGtVp-h}jN1?b+eG^tOJCs9#4W7xC1$Ai zt^?O3#uqt-fjSL^MOjUrnbE3Bj4_FX45^6n>q`G{CN?x+ZDH*O+R!;DM^D9GsG4S} zkS!ini`z{hpAuToU`aZf=E9F at K{_WRchB*~FL(r7z$IK=d8%EMvO1<>>fp#E!s=`Z zZ{$gx)puWnch1;=jZ$%=Nf7kzkH6RAB$|%j!aTLaoQOgDBelrSDSz6f-aaEb4C4rX zy{t%!v%m>!ouV|I-I};nYT7>m9bM`QRs+o>iED-mQyY6WX at soEfCopJtV`juEKgZH z-|#sFtUFm#2C2*7vrOTtHH7V|AjG*Wv-HKt@|EmgKpDN;8jj3XrcZPwf6F3Wb~0=X zc3tXlc@}gdruyX_5o?5^ok&?@EkM zrF>2D+G4v$o!{Pzeu8Q?)<}x~U^ED-|27T}qVeS=$}z-olj8Y70ge6^=|w=Z4jhD(#lT zr+Tr*P73o3vKGUTn1lRosYd(GsnWt&O`@4#YF+-0#gw2-w6nT?d z=Ek~B0+iH6%c5nqlM7aYb6ti7+`Q`4+&R3-fc5oUFqNW_YqvygVK4!jnE>;{Gi?7i z8op2X$2|{Z<0d0f{|cg(2rFA63yTBwf}4FdF>Az_`d;{>m~f at hjji4bW;`{@doaOn^~zH27sI14ngg(k8Hjz zB`Q2emezZ^VzCY=^^BOZM}CCAuCU#($eIv$>xiY)%USGIk~mM8ilJL?a$LkPXg`IE zi6?BBZ0 at BN%!PCIg%~SGa6tZ9lu1L1iJK+8BGHFZS&+*@z&H!GAbmLnwm|p~F&Yws zMy#Thgq>DxviSdE?VaK?i?+4TR4TS at +h)a1Dz^E?HY&Dlzd^;eZQHi3>e{Ez>F&M1 z at 9WdOyKmNSU95|BG5^na#+-AE0f+%XbOL86xSCmu{qvP?3)ZMA*Igj_ArAhBS8IUq z2th3_7Gk2WGb~{MUWI<$J~y0`#0|aIwI26obj$z!-qjQ!(9QPLRvg8X$*3QYDa5nulbq#-mqr|@%82_Vv#(#_tcly5!D^freLK^<#<-_HP z*TmOA5)q&VfOXudSMp!`5r7fp&o<;HvzkP@%$10C^A#!a*P59>*Cg5UVc$4?~p?PZTXyl`sCh1ZR~``BrBT z7F`C;Gf*2akIC?ipK4g)+=IJO`VKU;2GgpGczXw?>ixV;AXas at o_1>mM0N%=k0Oq5 zl*7jU#BHMAC>Z2dV1O--P-ZQUQEm(pn$Iv!tf5o9g}>t|dC_a*R2-VjY&vCR?U;U$ zJ8!JFPAArJegYHe5Jk{_T&uEod#Mu3h)+=7RZDLN>OhXwRDgZQiug23(kuGwu>|_=j5%445qPq2Y*ndhUS{G+q99-fpk+AUf at T?w2k(Y zRT?qoYm0Kb*SualDYXTp{>=F5NXzj9{P at jG#l|?SG-}Y!$VqXh?CWl^SR`^~g}<=Z zRI59jHm;ukYk;k6Y8CzP6#IUXK$p|k3B- ze(dY^yut7A_4dA+3&N0>ILKCI64$Rvp`G{wms?VsEe6A at nZTB&W9*nc3QwWW^qMd# zN6`-OP8OHx6CJLJs=C5PIl_H at fb?v=PFHKa(ny(ok{zy+9J$EQ)qZ|sz^;UjE;j#M7Rt?#Kj>`^hDT)+NJ+*+_Tkceg%w^gzU6q$#Mm at 1t zh&|1*=UI^_sWN at BdocLEebq-Z7uyZtTX1mt2+tXI99I~nbxjt zyi|KC8{055rCabeN$4)@mxArMkx3%NMu3<))-;=GqR7XlOKyv0KJ48kwXm5FKhRKn zwC~|SPJPdamF;guXb5v8d_|RPH^ucLQ{9=9Nu}!e)HRgE z8iB&ulc-E$pP7^9j at QnTs1v*CL{?`97k;!LWicj0wgRQ7kL2 at 0VIDR}Ht7u#E#ps8 ziMeI*iO09ZhMZo_J$=e6N-fleBWVTVmn z4|f71#JYtK>`g033O7VjEm}Q|sM_m at rGG_0%@zgPSsPO+j%JNq`2+5Oe!)*Pj4 at 3@ zJ$N|bm*TXbe9-3WxF`rJXRp*BCR+Cg9Jjm)C^&vZF6|8;Xk*<}noaQ~amh{sbKW(S zqGNOFBHB3dAsRv$(n*67Eo5UPyl1Uk zL-!%ufIT{npW$_-D9^QAk)w(g$*EID%2~lYXRRMFbuDy5Jj at X;w=Ej;>J|us$PE_@ zl95u=u?uzKGY;^%Z&vsv09~S2s~4OSw6ECtfy|w5&adNt=?r%pE7SCk`%OCkZI8tN zwfOvNZ at 6Ub|ClBFXIQz}vrm)b!H2*3CjuINpIygo2W;_jUhmv2Yn7u-A292|8Mbfn+NF z`n|60T0xifdlfZbpNh41i)o}+j(1iy&Q#TweO3s$Gm9I3CeJuZNOkpnCu_hpV3Vy( zoyBHe-=Ng=odn!8aor>=DZ9-;QjPk>#>q{lg}uu(o>JEZ&eq0pIcb{ST-0nDBxKOn ztZ-7vtS}oC(yN5TC*Pcm$0#yZKt$yY0gGi-NBb>kCI*s@!X(#8C0QdYl3Nu;SFsuUiKi!ek(Pg2?F;|ISF zf<{uU{UruotwOik2#2rkfSKq_ at J53ha_Xmv7-B@|*sy!NEW|~tAk*e$g&o3kSHjLQ zRRhEqyRGmRoeC{j z(hmIDp$3It*o>PfmM^h12e0S_Zju5f7>x~RI)lHgjDfIO5O3Isr!_RaVo+54&5W3J zBRuY9pEz%gmZcOyn_q)h~U+c9m`u|MC54$fX6A$0se!_W? zX*O=|4-v1hnyY)cKCf at qd(m~j9apDEBI<4)y(WJ8DbGR{fZ zjv)SDq3`%JkBM9e(!)22EqW5FAA-&hj2Dt3tPQ}kpP=UR*tb&5bnq)YZSdmG67{OX zb!CqH@*F4W}>eH5!MfGtN8krxD)&(_VBP~d7% z3RG}zj1gwr3<(;WKi$+L`E2>nr7ioHG8vV?Y!Ne=O`kx6B5k zsE8=)>aoGRmC&mkYy)GY|v z#FIraXyxe-S}83(4MG$cmlnbW8i0MarXAGU37)s(A>*-d#Y)h3=_84 zu62IU_%MprbwOma(vRqoPU|b~f@;M*9f`FcI&HfoavmH4N?Bdl2P4uP2H!&GUUUZS?eoo at wd;-OBjBfEX5=}b-`2Uzi)8c+EBuO zl3K*Pk3zc+jR&b7G_Jt+x}SPCuLB~%?V0Izod~C7$S}z6z*EG+qn^BcnTX;8)~)wM zVW=R&E0EN2(!%BtpKn&ebe*SEaB32GculVU+`v-G92*> z#4qV~qQQDaDG?Nr*Xd~DIr};*z5f3Ax_TQ#t;UQfG{B!k+EHVsw#ZmBbTBU&e>$87 z&Nbh4q}!f025)%{IbPT5h5q;HyPUd)Nt1Uh#WH&Ii0AOS>NafQFJ3(p%=5p|p_>tF z$TEhqX at 4mP%JnrzCg(O|d&f2#GDgQOd-bFT8k-`4$mmZcCb$IIxPh%_4pcb_Q zsa|sDpIgMpmwS|;FJmb_&Sts0U&AYrSt+Hw`64BM{2 at EYNsueNatLonh&4kr2R|%t z2LLw1RkYQS!f=E)H+l0NBEfqU(2qKiXIXZKm5ue#3-2!sTUBI9cqbl=8!NZ_dBhxe zs{yEhY*Q(Y{Qa^RRn+O5jRDw>h1-aH?{u?b&V7_dmMCDv!fl4qwK7$I=KQ3_CDaUi z&UJ9cyI|S^HGbiIWM*a4c%0xp&XbM8eUTSW#jRe7b!lH-Xc7n!byd4O!AVP86j1!>!gA!L znb2n#`DPgIsUItT)BvPkXP6kU&o=C at mYiKlT0He?oIqGRsGUnp zW5e6ILbI_|-%ZMkW#xBG+d|gRoFN;~7*lN-2s|}9DTk6#X;p~x z$Bl~iii!6O??wyMz0?t?-CNKVp-XdIeA7xb zlkJinWVgdj*^l3-yWz}=h$z8QbNJRtqw-LC(w`I%5Mk9)xr1#88lcD=eGFr!g2qg% zYggJ5Y`A8XjY-mf(oGg=2vnA%N#0MS%!=o&eRfu4dT1~SsGEcranIq1pJrY7>Tiv+ z!4#6o2B=?hO-W%N|CZeWT4{5;Pa8qql|l-aCDD=o(kiE}6FuDy_2mIFDB3|22bIYk zi9hu?7J5M)b`gEV%NoMX at QcSlU6RQ8s6L$*I$#Gb=mBbVg85!c at 1Ur9X&1(7ov%=Z z^^px<{HY#S1&rQ*3S=R>I1?)HkdNq*$J+YH^7-vkG5ads zWKiiaD$sv7i{I^)GoMf at J|V(w1en95Qzug$OQl8Ab;tg`9fU2(L&BgUbSV!&s;zN(GZMveL$8;UI_EOZ!fu zcE{r{&#B~4uj}Yj1P&3*aRS_0x1HI(!pbgQ>guje2z5e-bmybHosFQ1RPD{H at l2$i zMt4kmJVW?WDo7x<49K at k(!@N=s-(>P=J(hU`?eE9_f|)U$7odQA%|Kzq9+4fqIc5# zS-yH0OyY{EKB*B`~G+nfe6x(^5=YA~og8@?B z^zg8MZj&oB)f9m;p$of)XsklkyZJQF?`V$BT;wayI&n8-(91=LV!OZm6fLx#)@3lx z(nxBKoTiUAfMP+kt*xV=G^A%L;gK5EnUj`l>_SO5MRTz($r|PjxM&_Qx`5|zWhA$m zZ#sc8VJ~G?n|bH3EaL#qIkVze!oZL;UQiXQgH3q+Q^s{GMDMVltVX5?(dk~muJGVl zPY;y8(DE6)l7xCO#!{fGe5tXHi?p_B^%~)ogmDdt1wJRuo_`wS0N$B6+nQ30Q;&$7Zss#d9Q3!aUVQV+cS7Y-0{94KX~rJdLM!*cYH}z<9-MYi#T6t z2Z3%AW4sVZd`G;2I1Q~d=88n_NutA{V1 at +6a?#9ostCdREmT*x!J|N at 0^6kQQD?xR zdpZnt#ak7W&T=zTbWHy}(|4iRPzA#}!&#+^(vY2%m$+s89 zoWq|G3Gu^%1zyYC8p!o&#w6ZSSk>t?wIxQmteG%$DkE?VeMU{PmFH_oO9kOJiU1U4 zB}FV at RX~2+``kG2Txl(2V%VooJvTfyTiIHVIainTgjBa#PPM7RY9$!wllX`ay-KBM zOB2EDZ*MW1*YqFA`auzY4_mYz`C%3LqsqA4lxX=j2XzEK;SMcquyJN$(5sc8ai{Gx zyr5S#uN$g;LEB7nKJB*kj8re>lcW0WGv!q9EZF;F>@@dL!LKj!;{$0<@OXN0|M2a% za#fD at f{5+=hR}pIfqt_SB*n(ZZm-zsEB%`NDiC4#GV`iAK$~SZz%_2X#dwNv2W^s4 z$}iw;ZItQ#+CPjFxfu0m`d_SxUi|9oa zy{6%Z(9if37&d01h_oM;-a2C%n9c2zt}+MPFQ^aTD1>l`IH&|4QbW9(rT{}&+M?5m z%WSV}?&paK+t at GPKi>>+xUpGsB6c;wrU&^bLoiti(lAA|;L at S$kUOFb;)TX6Ld?vu zIrd)*H06_J>x=Hu(oN^{q?SEqhg7USvb zS^2cp*dKD09fOr}E;5t~3R`sLo^Oy4sc1ubE3>N9erJKE z20E4 at G*hLUS!^HiFqU!bLN5IhV(=Wq9s;%Mo7vuY(K~E;T~@cHsBg{KqARKoVnMG- z3`t7Qdr60u&akg9z||W4d6^-G?+sO+8|n!y=}_KBE?Q1e>vSHc(tI^MY#r0u!*9Meh)%G{yLkD6Lmas%NFiNJx~nW z`$jPLW-z}N*ZdT=gx6wNC(hUMDBi+B*is0)o8+l5Y>zNP^?DN4MifF at p@aF9fjE{6 zp=*jL=BgOP9wM4pRkxgT(R3_I&aXS%o;skLkKVhh+kbQ=!Xvj+GdLvQ21X+30fx4$ zO!b%!SM|ApMOmQZK`6B*Mtw z?AFfS|BGtu&%gADel!f*2L44c4EEnYUi+Id{|_W8qpD;1$_u-WwmrfY!&p`pgn+>< zH8q&Q1Ci07_uypl7*p*jblX==IdFkr8DGIq5N4jUw`=2i4fELM9XEblU6fv2SA8VZ zaQ(0D-8siT(_T|Ylc9otK-y*O&T&`z~D)M zcviJ}=~(w0Ub>h!o}jjmsiRkSt4Tz-o890WR#XbiBonv25LLa&QZ6rkmKsGi+q9 at _cq<^Ef{gg?PI#Rui4$+ClG*yz-!6kS)F zYF#}|KPkQBQON~Ze030%?hD3`WQztLU{OIH940K=syY zs}fD2%_!3G+y(ZK(tsMESyOZofrIOp_al_axuOVHm&7-g?y0a{1d-dg1o90AGz69C z0o%C}&Ld8%)2*+UNi at wzNw=pz8$l22mKATEd4rgExAswF at wTuj6!J!^1IuZ}K&h;d zaP61g0W>qYjiF{ED%gH2VMU|}E1n#d3H*C at qna3H+z{OF=wib#szirv%zW<~fzAzf znuaq;D5{j`RdW){VBx1u*(HAxxq{*3=f@;czCb!PGSEkcT&STTr==}+^wl0u?y(-yo z8zgEV8ZSeZsT5u at fI37jS6KTQNrvYR#ryHgOHb5Bp(Y!titR> zUHfAIPL)dpgQ4zCJbPtxp54J%ij<2lwsDf%H^Y>-us%`SWOgTpa|Xri>`00xQMz zV4#B}Bos!aV$7Wl6x-wWrXGtRayL9m-=u<7Qgd at 58?S%fJ>Ob&9(}wVi%)L6+;q+a ztK*_5GUf7Slf;b!H>6O#Q40v`uKfFuzW!<@!dcmd-7GS zU#!!}QobLklk>c2`0Wv-qu{szoq>Z`&mDLP0En>Co>pd?nxuGb!kekn*6;)pwA8$@~T&sImDc~3|BcJlQD}#--)-ECs%i6ugx}E z`zq@XFY~^)HU+x{$p8mNN2A at wGz;Dq`}c&?A|UUBeFv~Tv|7Y(Z(x@ zy#Xrv)j=8p9)e4G862sQ^J~n at rbL^<-|2hM;;uo#XHV0%wVx>`f%j=U8p$}kEANBb zNSiK<^sMEI>6a*`+v2PIm<^V92MH|7 z;LP)YqqZo}{(a?EHf*&oa}VqY-Rlma?ULp_U44d1Or?%xF#BX*w1J+JR8S`2ZN(_! z0H=mJq+&!OO66w6-miR9wC$NvB#`(&L}FV;Svl37Oj*NVJ5>yOD6MF}ubHGy$`BTu zf3 at M|RUui1EFt$X*XH^nDF7%q;3$yWV>r3v{zV(=?K@(%E9O&rb*PO zH?B&5qZF0AoO+bD=2hL36&mjk*T^e?qRJ5b at PvN_pJKs--!H at sN&Pv2Xk0EbC+)Di zQO-44gnZ>^cb@$nj?m at fn%SrR4sBA8iF zJ$pw7o>Lv{MZgU|E$Bl&UB8>7kdFhs at i~?$g`s!7G5p5&jc;EocqgVe~IZXbd&0K;{rE)XWAl3{W!tg=pe| zAD2O(5ynha*?LyBgLQ)ulAxJnHglw%^AFNW&t3Dt)NBF{ARuc?YM#R;i=(spLH3&C zD*Iv5B3|uxvIcbUwXvD`QRg2&yR8eI-|qy1pWGn0*d{Nx#5vw+lx{Z%q%%|nti>El6 zPrj30O}>L(oDIfZUV?_*c0Lb{zGpJ;-25`Z@?lhF_6ntkm(Dc z=CaYU+J+bwX5X3|*O=P2kJyuJdDG@?Ob+&&}@nENg ziBpnj{UV?&NOUP*m%%5C8Q;B~l7wzli& zlicc^jP(jD at 5o{FFz7 at i{O_`ZM>5;?w@`vvDaFbHGlo+$;!Igbf7%{+(OKC*HL!iDy}`xc0KiN8%dm#5aAdfm*t#txrv4TovH$R`F at +Xr%PC4sg+ru4|3s z5qr8-FRN9z%%nfO){;tylynw*=#P?jh)z+bU}Xt=YXY*X2Y0uxnHH$iUgr>Z<{pAc z&nF{O9B`S_?TXP^idWsp^064~iR!6h0J~g at 8T?`t*5S{{YMK1`fm$aweLizRoY(Xt zKZGN1*8@>xkq%k267(@mky(<0wXx1*%LBNOqi=B&`f(};(OE+VU0jctTSR85QJmsa z`S6PxX2t8;Cr?7yJt%&LtiwQATe38f(rl6$Yp7B8QEufdru>fM2+**jazn!#Gi(oTBWIU}<4PV5~)q14OXq9z174`VwR7jXVM at A^RV!tC2uvv at iPkU5HG7=ED^aZ@}S zk_t5bh%)qI#yVR69&_&$A`{umjPK1g!HDIG25!tR=1?O+_My~UePacYYy1=E_s&>1 zwJ1P2zSCk0;54_*LN~5qi`^E{%P#a)H6oO-)vcow)us`{^`{WUw|WQhr7%d4`i1q2 zWVagTE2Nv&9qyRyL!?*mmXYUI(I)}Sd1&M9_~MJu_x){@ufm<~7sAeCj&(%v*!`>k zO8c1J^97ByQjOygl2H4h&`g^cWNU!~ojr}!FJ<||AND2>{Z~dgKTSFv7yn2a>&|YJAK1V zk=9MWDqS-hwu<%WqctHE3{xSBHk%LjY5h-Rc%0EZX^8t=UL`1F!>aI4qX!o>^^S4{ zFP~bDDpjS^`jpI<$seXdqv_eQCp#;jw9nTrv>;CNa1bpeQ1|+;eb+S43w|Cq;-j78 zKY`I37_Got)*Fuo_Pl*a#0JMp;%iuCJGdX#MbX@;%h1cxcC2#BqN8dV#SxOxoC<0D zioPKQ`BIN%>3Rf>W}*S7Dj6g=>`E-<6GAjSDQOT^dAo(XiT;JugK$yQ0h7Axn6Nh{ zR{(Cm9bUel#F}VJ2?4goDrJl$5;El5ata-HOniOcm>m>)-YV zfZ3>@KHJ2*$RTVa)up(%9$0HFAa+Ave}_M|vmR-Fc(5Mn!{PlNeoe#2n`zg&^SkM8 z(_q(2o}lY^?S?=0B?pl`vs(P7vgU5nXqPuGl+mQ0Q{Ed#FK$wu_C-zW^{VDZ?qHYK zq8}5;l8p=371pbM%p2U+X~UO3Ow+5AYo;g9%_L#`!1gk2Gl#KYh|*?IHeUCuSxngm z01JfLKl{L7gMyu^*SaCnv`=Xur0EGriw1Y-%j;Ki&8^1hh+Y!#qbr;?wpV+Z_*bHPJ&U=|MfPbaO&y`5r5!~M6OeCt6USL`^ksx)@rEI~ezu2*1 zlx-}&bVpuw=*-@>0>9>o+_tv)=DTgM{~QUh?gnFIf2k at saR5y7Wjw!PA?q2C<8dH+ zT7Y_{gFKob-!{nNhG#Ba_798iQr7cgU=3+)Qft`oau4KA+LuG9I!yI52E3Ybc& z9_ at B6uXqfOyHAt^r;_U`GWY}U-5Y~57c?U6rYn^Gbe>ISdo=IXR8Ktu0~McN%jTH}dbtjZ zmM(#{8$D`{9dZ+yJ~yXYzMT7%{$$sJ(ww>IZy3zPMWMQc_jA%$HDhUe+`H!D0|}+O zb}50=Lv2f%(JO#4{-!uP-yOQZZ8?z>@g-AqCQQd7Rw=qWZgY_RmVBpapmHsi{7k?- zf|u7AY~yh at 8}`ah3ub at oRKPt0&bd?;J{mXy6P=ceIzV;Oa;g_W=iaQeTD8_QdAGN9dcwQK#KiPIn>ZW2DZuEoRX5lqI#2--- zuJb?UE~D87ruXc{(BWOb)WbtezW!y87h95W9v2h at Bo!P4g!BK_Jt~=+yI31KO4-=B zI2#&So2vZd at n5ISjVdyB^FNTjI2`u4*e#*Re|RKGKzaPwEZq|pAy-i>Q-VPe<0i4$ z7<6fT5|4>KLEO`0AmSpL`k)%9K#h>5lZ at xOn7U|Yy`P*|yT5!tW&~-|pf3zthaK6E z32!$=n_+U87M&N3%wM?|5!^Bv;ne;PVJveA8#35M7-25Ogf=T9kQAiyK6dEXL#m%! zl7~$AVhq8w!fQxXKtDQcEHvV|t?Iu|eJHgXhf^9Cl++iUjoBwd7V8>76s};j*p3Sa zE`T#injI9Eu&a2Fs7Rr=W?#4{cwpB;>T$w79UAH^QyaA$4}*nsA8b&XU3G2oP(P&Z zBz7`+#DrKUHL;X)9n2?BLK1mI`pB-d- z at w?{Pk9P9P#Y2HSp0>&7vu-?Hf3MuNNN@*mBF+9JVy8X;X}K-BE)Ja%jc}Fe-t#k; z(hv98!9U;YXxl&k&I=rl*6)-$&`F#mB!P18TPk#!%;bdmv;n^=)sh7e4FHwKW_Q<6 zD(6g-cobLk`b+qobj3 at _Q6sN2E#SNc&`b%z6$kSn0-&=40Sqh!3 zx~Yt!i1ud_T+?4{29I at oj^vOQ`Es0SA`J(d+C1sDxWr|1snN8$o-V^r+E0kFi!Cvk zpRJR9o^a9mO4uR-e8PTuH*5Q~<#_+ at etFpr#L*o`6p3|jBm}9?8jHozFo>D5#RL0U zxTu|R-#;pp1p^D>S%voM<`bp*vOMO at G1RcAuJEdCHN;A571blhP~#W7ExY9tz&p=i z4XAB0Lcyc$nnJ;e^+DcM%qmI?tn9X4;BYA^x78xUF1P<{g;a*oy0wM7+ijMxd-9TO zwB4jrw5rd^(yJ{xQrNjT>G)-=qt`|0WR^EBGHluC7O9sl;hQgM1tgZ^*%`5STZ*(X z`YrbeeKTA^)2(*wm0`JM{k0hfucDxiz+||WNeBtA1889VJURsEqEP0F4lxl`M zC$kiSdY!evu0u0l}MMiB`C9FPbb;=f7snbJsVs<9=g;g z-oT?fN_2str?7Ks=X z{r;`sdqAJWHkDBkKAG(|CFKNZLjPhGi8!U)-S;0P&?3$dP*7Mcq9uE`ig5cZ1MOn? zDHP&8%td2Hiyp%Y at _io!Fj3n`>r=i5&! zR}#`r)fCl6#L>tTr2Rs(@~H;#b4g(RXhlJ#Vu5iKXA%%@ zRMZYa;cesspAXfpnChUt+y9IYErY-}wZHg?Lx6zD{u}rx+Z#GMnf}i;yi#TRA7h-q zQuNhtWNS&(J`{h4K~h1U1wvTQsfCM{D?(k5*UnkR at H%d!KWz$@b}bA*8b>L7DGs#; zl8{(VKkV9?n;*Tqnz_1m`TTi-{sE4N61HmwYG^`!fD*RX1STe|C+ttGHZQliY5+z1 ziXdXLeg++K2(*pByvn1!;JC&q(gbMXaPn*{b$*IsJGed~f5$oq0l;{z?-a%pP1Xa= z;1{|~AK~*8xN2mz;6yB9-n1Tc1J|Q_dt87zt4nd~q|7B1D%b_yTxNo_%I3 zDqnp9rYpPs7hp=0oX;=XRc$f0rA3rWBe?50Oi6((%te0m1HCsbScu;p7uU2GT}#@8 zvTjqhI9vDEMDJ-VT$OWL>C9i8##T)1>#Msiu8ORxtXs$?;Bg)Z#EG)oT6=ixg5cLqB6l_ZlTRARJ?#mCSF!jlPz%RD2dzpj@%?aYut-DMc=ZSEbtYUxfRFNQ`Zq zkLKR!bq=4SGNUDd>fq2ncb?&3H9`Uk|7}CCSKr6p^MdJ{ml6!-NKOv1{4R;q z at 2}m|giPljW+k`0{mn#<1NBZBS8-|Rj=nbRr5H#Jhleu zMR4GFkH|7)n|(0E%ZdZK6<_~yjs<1v$4CVY0+L4n0wVqY)B63d3+h(RxDx1JOP&>E z)mFnRfPw3Y?zvHeT`?oD7nq3;bO!r|0~XL0h<=-6ZY)J66x?{???WVV-i z?)x^X!nczlE8>k zn#j4;V)$J>8KIi at VjPDuBwcvIq+NZ^T{uNYRu!+FP}@D6*r3#WeL34OyX)>rQh&eb z2MP at F#MXLjn@&Ebl_ko)30V2|v` zB9^oT3oOSh1o+EN_GLAH>`PKmmr$7Kn)*1+uvX)lS93{AFPRxZQXG%Kd|NEN1kI4X z33ZBKIA-DLgq>-q1?Mhn*+4uh2a#&5tn2D~u5`tWWz?{ZL7X{fNCm!0W-`-i0gDXf zlpoxsr_7Qoe#PHiVx73Ore0E*Y`+*dK&rn(c+z0wIb&toW1YK==harkOg{3njY4?5 z+_u!)Nrk at myIw^n)P#>ao^v!SnKcLD`sJ3FwfcUe)Pa08J9m-AD!Zm|m7P53H{Dj` zPA*B at m7^&`<9+<7z2|HBplW30Pa$`#r@;@R;2H2#tCh_dwmIQrf;OedO>lWna;3y` z1xghBapGbwZo-0FbCC-F+7SvpbcdU6XU_!$TqkA3ikrPswp26uf-uR2 zyK-jI=Epn>H+P9yTK=W?n~`i2gmK}k%GksjW~B!jr%1~xbr9mctSuGAih#QrR^oD- zcHn$;egCFP&S$eIO?8*A9xA|N-I{TKC})O*_6U2|w{;(yUZPsFL#b!e2Rd|JX5*5+ zWbMwlnk~OpR!@OOgy#1weGKXoQ)WZA84{e8L^M;)K@#&Sou$*Bt#{alRRIqBTMyQw zA88Zg%&D!yw1m~uvv0!i`{A|`0tCfj1q$w%mAIpmWZ39L-|hE#59o5E(uxA z?i(FX|3Go at R2b2|kCb at H7)(KP(1mQKE(_PH+~~^(g_a67Rl6vWu^m~$1 at y5*cLgYiY#khz0L zxw at k7Xa{cxipW&|sl0bkdfK61;J6DfDdP`hN~w*E7|;fgNs}5b>{(urPZGKA;ONL4 zjX+h2Ao6#%fOejcmQ0{vL=9!p8FX3BenTWDTvb1nKh}Nhp@?71%DaAHNHg?JH zl?@XNU(At4*h{6OAPR(L;i_&#RH7loM1IryD z^?G&P(YZT9p7&x~2>td%>1GnD^7*kSl0X1%``KjRWrW1y&m^Lf4p9bZBu%@nT~5B@ zpa?r=zhs~@80`U3MK}!6i3i_k4VsY#_3o%+p%c8bE&zS(6$Et^Tb7!glXaeH6*x^X z8cnv%)|-Z_ZS!@H4C71fqbaq~ER%T!fT3`41&-?C`d^WVVhYBzms?HsP?$4HJ+3Gb z#Hf22eiTLB_DxMVtd)(;_DxZx^j*A0o$ZSei_{6FF_{7vg#_ASztZ)^tvuqs8p$NT z0~^n6NF^$Wvh$hSn9 at eRQ`E&0r}lq!f-R|kJFo98XX9uV08C<%ToML7PrFFs3LpaL z$d)8CDX9-7wd%hE{*(tautkgEOIb05e!8I-0oYRVSxtKcBo$JS*CV`jS=Jumnw%9W zHWfv}g&!Dt&$%_lH~paAyVZ_NUhSjXI1+g%YDaz(Pg1M_1v2!D>L(vY-Q6%d=gZX9 zMNsR>DjK@;5h<-re+FgbTSh7^z6KvcU8uK zmF!|;4KgmXQ at z9wHQd+fggX>r>+e*9DT5VAL1aPFVRnsp7L9+OVRofNU5g}Ly<}TZ zk^2a^GfY29o@^5?zqLd)-GO*7$bq2fEFfP^;s*2jKdbaq?$ky1QLDJpbhdjJ+EYuk zJVp1Ba at w3N`TePY~YvEEg2hRN>Q2A#d% ze*5|$5-=f%^g8t*qzu7_B~)EzQoSJBt1O~_*_w^Z>Op~lB7li5ktH%QRmcmYfm#rO$r@=C z^fB at Er;W;H1yAahMX1UAZoJZJm?>{ulMd6OUW}+*Q*EzyZLaKIYI3c9%6cc at Og!+n zQ~Gj$-t^k;G#A|FzCLuzLfePzPQeKJHRINoIym>5F! zK9EAh at IW3g_hIvnF;}>?9|`OiqY@%SRAB8j=W|a9_wGWP_OKraW!$0i`yiRldEN#0 z4iCkAy6H)E*2xuLoCNq+7c8n3>;fhXu1E%1pnufDzEVeFo) zzrMNAMeI86eFl$E9>xFtpldTaG@#~F@tc1Im!BllHok&0<^2nmow!t7xDTgBtVjIL1`0Izq?iUsuJ%G`Xsc>?jO?(OfWbT+~b)&H6&u zr)%(8tOal_<0>UEl3Be!XobxDZ=AhTurO_tEV|xh+qP}nwr$(CZQHhOzst65^L!IC zbM`)e%-IvOBl at B)yQA~T%IdDFv^pz0y^eK0FU8oju2`%zv!r^A05B7Bq~ho+rbwO3 zYTDL%QpWN_CAX0jCAxnRryR9%TAVMrJ&;4iB at dS&x;-LaOrKXukY*Iw#kSxvTEwgN z_eV7_; zUZsrXs{_Oc5Zqv9Djr{BRU7%3Rp&&Ka&BdEl+PD?cF#W4={3y`Zh#K3 at Q!^XYN8QU zVD-$%6~B}uW|B!0QH#g8 zx=44DQvxS!s;wMEg(+eMvBBfT)gI9v#rnWP%DRGX3s0UuoR>`DM^MR8y>V6A3FWq6 zYZ`1#zuiPVKex`Fr^%EyCTsxyb0Hn2-vYiH1E{3g7$IG)WfxasG;C`_jB>tG(Wag# zPRx`bO+9f$I^M+qF=xm+{vLKA zfpzRH_*@(;s-g`0CFxZLvt~sft{4o%VY at e^EQO9M-K>9V9kA^}gG!?tG@{$3LX~cZ zfTv#XQ!`;rSy>nEK*qH5Fi3qOF=1k=Z)Dh&5Co)XcQUtBL>+0WM8T6_^oit5`Q5f4 zz%-;rtYp(^y=}?!mJo_}NQV2RJoNW26pU~64(dyBsP4`Rrf5iJ99tVqZ`Cb=Q3?=-2#>uGaW_XZa47>W)-} zRPk6+M!v3wAX*bf?JhyfzKRsmzA1F1+l}lt#6x|0NN|6yKFe-vKqxs3SG&>xj~2z8 z9i#^L*eh4L++zGyPh4NsH=n;R+0{cnuIKoz#N(yk at Q&{g+RI){h1T at vec|^Qzjg-+s-Ou at L(x>uH`BqzcUpnRt*2gcSSvLA2 z7-tE6>UcU|HmZITN#aV7l at jOv;YvD0-pIU-XS0<=CDW#i`vlL>DE44Y2J&IP2vI*I zYGN`en at pmGtZDmo16nmB4P+uRKf&fP)7WdSx?xwYB+~7R5}H1cMtj$^t{TOo?ZCmFs4!x^5cT1Z&^G02(nVb>r5Kv-Vb88^OhsdjM zLfS%e(e|m>A@$ZYj@@tt6;xdCnuW+~D-&)Jij at S`j@>dQ^=6nBe#j*UZTmhgqKT#4 z-5DcELsaAn)^5*5&K06>M$$oaH_-R#u6FO{MHMpGluw{SqP|4v1`fHw%Zi$(pRq at 6 z?caE6u(E#!S9qh9z%t$}0BgW at yS^k$wmg&LC7CAbQ_#sO=@o$Kb(E7Ftmeo~3q*kD z2~3G-Pxc at Y26Y+Gz=plCQK9al)yZ+{v!>?(aV{tR;5zRCTIXvJ9H at uH7+ce!e9&Ll zmCUV4mG=1eq9zz2w!>$Qr#m?WIb(oLHmya|_-BipN5?nSFjK`d<(R at o4-K`a4=zw_ zyZ>>Ze{-Y!*$nR+pel9O84MuiaHfED7%9+l5GRKCoi1$U8VRICp|?0bi5*S}CR~D5Ax3;?I|j>S zR(X~zKqI;ooyE00L+j#{HJPi!Tm(BS9Bk5TnB){5cQ$hV{n6o}SDngeHHx8>`UrYO z4;S=s{3H)&!D#|IZva*{eih7e3>q}?*$}~+i362wQrciaMUJx%of5`Q7B`^hv;`-- z2uFJkM)tm+;xACK1yG?V`6BT^WVGB9 at P{{3WB_ztGQ)@Wy*$Ue8Fq2l6Lby!` zm%)5EJk-IdY`8z!g5mJXWs=Iv9F^CW3(`8QSXZ<%cOKb2!oKQ)zSP>BGnfhR`y!>W zXhaoK07ut>K{U!nF{EMCM2Q(q^Z=-lJezG#EA2y-jX(O5;unU26#);mvzU?}g84Z; z!ZHpfGQoDjxzRy+#3}+9pTG>e1BAmt$*{36A@=}qV*{%Eo^;FlK~Kmob;YXmsd*rq zZbo6Xirs5Q`uy~CX8#l+auJM%14YYWGS`36(<}R|E^?fq>{~c6!6jfK!k{waxr+6~ zz-)#A`6CBd`v6~(gMoZ-EEwHqH2A}ZFK~ti{Bpzum at BPnK`J at L9V!_LHJx^joS6;L zoqcaiI4}!`)YR&vV$1m_zQyZ>Vy%YN!0pjtjRqIGEBn0q&yd~tux?*ce3~cppbn6W zNn>0+==Q25HT^3lmUR{y*j?ko at oXG>IayS-)+LegQIjy~j-dN#{srf5WWK)Y^S zdV}>~T at 3`3mmR$NyJel=9=9Ult)PYjU1|7N1uiE(z=J=Pac~FNnsumf0%c4(2mTK# z{L5n!!9}a$dNCw;^@>-BfR((M%(iOGwn at Dg3hC2q zw~D=;S*B4m3?7|>M;Or)i(&c?M9774h@^a?>0fX4^c}r=(Fs!ITQ>zPQ4Pb;7-%fF zOkiVE<=O5IFcD~J1ODSQt;A{!+Kx~TxA2Z(3LM&wT at HC6&MHGBZeb)H{q_?gG~+m; z&-N3~d%j89Ng6?0D#_w3D^Jnl4pjb*hXDd0<2B^BO{LtIzs1#_cVPDp?>li}XV*pR zLr*`zJXHfU at lii)u<&+#DWAI9M=z6kTi`9q7~TAzy4 at rkC_n$Qx%s2Mq1zV%03Zer z0D$FxUK0I#`7@*b>4&U_ at +;fe)zpQ74-8HX0whyBVLOOeUqi|eLJLR4FaVFL1nJy} zkr=YAu>}TySG2ssTiycqF(~GvqM+5%OadWNg$kn8(wp}i&iD3SzRSgwab*PFCG~w~ z#^;rHn)}#un(cMd@%YlG>j%V7_H!e~g!@tiQs!gLLm2rt;y{7n-a~==WbDv=FpkV& zG_LHf8Qp6%&g?!L&+HxqL+{Cmp!aAj?Y=wxGcy0f5~nw`Zgn5aT>yDE*5#-*Zq83{6z)qsCe0-KwMb&A?yUi}%%q$0kOe}j)zVY+Qi{|`!-cs3 zCQ2}Hq3lwVGf|!igNDf9{HDmVGg&g$B4XHBcsNN9T~;b!05jm{4d)72V_7kzu7 z&unwx+6$C$$R`L0afP!UQ-w*>-AgvkaTWOsWkU@*s_r&d%?xw{=ocD_7$yJ z at v1}g2UjVnqoyCXP)l1%5xc;o%jHzbH3Ksl0e$jf(|s{&jM+iE$%1ju4%XHz{?vFH38szldej zHaAwt3( znpUHVPR7$v!!zD4qW0&*&zJ7SapOECr%9f_3V6j at mnoMQ}zvqinQiP)~;V at ZKVIis?;n#`y|-xJ^RQR1V#wa?ln0hwNQQd%tSY z&qD*Y@&_-?jD+%J;X5b4s1D78eqFQeN1~7HbTlaOePp^vSQ`m;`7K3}G6;sGBfd=Q z>A9e4fS+fzxfx1JOtkSUmJ{j=rqQ0wEo at ZzL01oH09WXChz<&ywpaAYr+Kcp8GAp$$SsLo=|N>^U}F=BoYN zDAQssHV+Sc8Ws?4JPD%hD5KML_Bf6Ql7c*J5!XZ-j+Mc`VtkCWFHppwY}v8?jGWR z_`#3hF_0h1LHzZltP7FsHV~@grd^7>R{0ZaiRuO5o_R%Gqh$Ux{2`51lZP zedQPJZc?(ipQxCAE!HQAo9+BN+KAWfF`+6{@m}89p7MNeqhZfa3Z=9LIl#nafv(nw1XD+QzB(jpF^6{n?fnNM*i7M8|3_8Wo_$9NrDbDGA?; z#e7WC;d=d>eg~NiU(3{wh_&Ix{>P^p%`w=GbZT=Q%S2~r120=thTi#4%P9=REgQL& zhHJmb4zJ at kfL9DDOXnO6It`M9+`tytb%!gK3f*sa3{6KC$Lteit=gXFdg>X&XeW$B zB!`{E1qC|7mrSizy}I at x>Z;Na5j``AUQidGGs;xZ0EK%yn+NC)#+&E|T|Z7H(i*=j zJ`!8T+qfwUQc#BttH$8A@|`LrvtO1BDzuYrQO}GG at bFQf&mZ%u7MVJK29RGV5v_0g z9n~HZt!GU})I*`OrdD=yjA^l0mjVj%5o)jp*1e|dqoVSh6;SCD-Y5^g-$rAOF+=ZQ zXz8mS)R)W+Lj)m at aw|#s)wOahnC3PtOjeH$i}VdcFR{n94ym;csH+|*syhY1a+bAT z at kaUYYxX~;R|MSXH9go#(JNzXl??c^^KolWZtG8<)*oHhL+!irZ-fHYm0Q#! zwXo`wk?|?&C0Dp43RdgKtX-a#p4L7Jteg5cmrN2a2*zsq>5lrFTHKyB> z>Gmf|sq-M-0U!ChVcv3teMp%%ep;O%Gx?KH^GO+T^Y{72CtMPU=7wRs$}%l*3)Xog zn|eo2`ejpk03x{~a?Z}3$sHoOgT5YU)OyA$o82SlvLSo(2udJA*wW z*J5P2J~GELc|r$Oqb9bP&3It?C!x{&;%fcyYW-}ter41Arqlek)AVhp`VFS?Nnn&> z-DQ3jkI+uafIsExn`17#6Z#4S z?P4Yk!e-!lPquFeU+Q{qaNb9<7=n_}@dkZTW6X$-gIv%WT#qx``l8f6hE|>c+Z3P3 z#O%n~p*#aM7jk^UU%G(CgssXm?M$W54S%4n#Jr&j;^M{5aUnGyXbQ!rsWM;u>+I}7 zB-Xt0$Flx zfjIa)B*I1*{*H_zN;Ec?BewESM4F_IFkU6^Yfz!Vs`TcQDv0UhK52+fz**;FD&Qf^Vk#ckHqZGDx)&-z5=@zidRM5`gByTok53aF zz#p5%){-t;jPG9J;*I>|r`SVh>WZW_7i&&xsa9^ErcE68t6gVpxz at HA-CEJ}iZT)S z%kj|b4l%%}(???_yt=T!5E)AOMs=igSQZW@^#fcT@{@8m)j99<)5%#?AG5YzN$C61 z^#&Nbev4ix89Q_DqQpfV at GqL7o3p$Z*mAb#DsU~zyee*gD$W)84!qjK4(7cSETw}7 zL>aTa)+4VZF9s(Uc@)z8%?5)u>N2~H9GmlNE*q4;EYyb~p}>il%-u_OkaaB5hXIjn zfJy`b8eBy39or%Z;(D~I_(-ZX{O_zwfD^nE*_jh;?e at N%Fin0ka^EEpNAEb7;&xIC zJu^p822GMW=75#W<3-IJ4&lz3SYlRq1!6*xa}0^81#@uX$Wpubk$m~y1#}>XPq6{3 zw$K*4LiH%5 at qca!pHr&S3&f(QGiZE6$aC-oW$t&$!bR<`#J>Kr?l^>ltl=yI6y46i1QjV^AzTMR zf-V-;#wL#c`Flo74NC?22ev~RTqr=XT%SgyVI~BzeohM>Mx8QI5CvMXiXB1-opYi% z34+G*vc^)YDo)oo0Iv5;b5dm0 at p*lB&rabrBSRL6u^L4Y&v7=x=jHvS?UmOoFRAb6 z{aX$|=#4boRvXd~vH!A&Hb^~zl4z28Y(_WT_Dx3`hg>a&8oYDlpiJD2;8(;TVR1iXc2=m$!eh!nF=Ek zGt2(SA#{|3Br7dCk(LSDK?ReCgAWIfNaeRYQ7xJwv^JhglYL|_XD$_ at lBDA3I75+^ z=JHWdlVoC`I5lA at xtQu}6V)?DrDPmGIt|%HgEaR*nV0SosZyDGlG%Y%LUy<@Ggajn z9mYvBms2H$Nz|G$jS2(XRCW=@<2_ONtjXYDYZuZAD?|)+>_QN`1b(_~n*6Dq%T6pJ ztY3*716s|7M`hB?sOg-A5xy=p_|j$0NoHqHphnR6u13l-Li-t>Xs5J12U-Jn$*gYL zXE&s~An91@*kG at +wAR@?`JQ z3fj(qz%vdtCyZ>L^U|!9fPBv!8$PFitRGHppwkb7z}7%O7#Rh)gLeOi7ujBF*v6Z9 z&j=xJPYEG!A6BSKN>tc8mW!}=PX_s$uyg10w%-RqZ~xEhffWKobQF8o zBerw8L3?h}5Pf}L_+kXy{bx~~r-mlwWW!Wv_WZ+CWP!OyC)UVxWp)Q^5e5^9Zc=R5 zRa5=uGya`q)!k-G_X?@A&W1RpNUcLR>kjME=oO?;_o&W|?$)M`yF7ETNhK?et*?%O zd9A-8c)Iq9vE~{oC7W=edq`&mlKhpRlwAnqb0eU4y{05 at o#Y6{d#QnGl)L-m$yh`$~ReNu9{ zcW3%!bDAX;@5>H4+;Vky8qryanI#)f9K~QazWgt=56d1oro~o}5%Uen1m!c#Qk!UN zKjFL$Gk5SQo4X%D2H0OkFMrQ^6n70&8f%ol3Dt|5LA==j(+MU-$_!|(C$XF_M9hVR zhFX0BYr(Op<8^l;pKbfQ!S(R(>kPO@`qloXuG`Gs(~54;ZF|I^;E8dD%$D>N+$)e= znnAHE at D>`zy7Uv!o5r;p1>nMkTHwk}?I3(zIw!vU1_=G&vTE&k_STObOtGJ47Q!rl zTi=lOy(;h`Zt at chzyv&>o^SIb_Q9SO_>JAePcp_QaIp3BTSE+xYM}UjKHV^QsDxhU zhHeg#z4R5M;qBozqz!Syg_&a&k~YGHynyKpr%PvqOwaQeg4hn&`&)D!vE4I7l{;*} z9F0T5Sf(Gv_-_ncZg{;^;rkxLxPhU$fcV} z!w0FDhbV~4PdR(XNjdR`K0D%RQU*RM^?gvO2Xcl$uxKsp0R4zNBZh9=RU^M;vA@%u z56lTZaf~}1x8w6Fao(SD$Llu6p*MZevtX(N{Tanl=B|g60KwXe*eWZf=L#LVIK$pAO`{ffa`xs+W+5G zmpQ6ZPMgZeKepClt=^l#tPU3btjUR-lS9R&G%+%Q;#r0V#c*XO4N6y03Sz0+8l_6U zAe%pctU7ZUiLlP00WeTMf at mQatkmiNIH=U&KyA5B9eY?J3 z`hV~$(MPl>qW20TMUamarRN`7BT1;K)Fp%lx)ggT-O`k`M>7MdDA^?`dx)}LQL34S zGd-gWdbOLfIznyOq!Wt%5gy{{rR5zRicRYd&o)ZR)?+BoFg+^z;wsUhC0#gT^x1f4 z4h~j5^(r*f2;=ti_0Vn+1_WH`zvq-f-pjQ~j|q(i5i_z*TI^a2;rrt2wdbZPZqOdE z$quhdMKkf;)*Z9kk at gtw6OF-5mKWEp`B_jvBKDqWVU6Qg&u(okmrn2c at j4)#?CLs$ zX^p&L(Jw694ls~2 at NVVv>*sM5ur`NI`#6%yFheM at Hyf}+>sL=s+S|>UuG??JQuWB) z1$T(LWG=MbY+K7X0 ze7GQ@@D_!xQcG2x>-XmKV1m%jE at cGk_S}s4GD!u)-N1Y3Vi|`Z*b4On_mr{@ z-Jy%vS?!g3m}8geiuO7C=D}RCSmRF0^&<{Q9v~{QaQO_?xZxit0z$@!LYG#pi^Z0r zdgJj-(5J9RK?at7&(Ed7pcbz1Y|xR$B?Nwo{}d7XQ;qYf-5gDFN|~2DHu#W8eyboc z0 at Fkf%1iaa3 at j2S1Ln~$x=5An+w(K5q~}@;lDpWUbi^X!xFw75qi0os>!2HWMcb?s z1c{X|;L=&|m_l%8$U{-hxTFv-$PO<|idSgZWICg5qrkd4uf$eqVST_R8#C597{A&~X`hGaGiJ-M9G=F028!bRgoF zk{k#TyV8HDz at 6RdxeAiOpif? zb8!yw?#0Nj1xArG=VIT2dM$>cod-(;4~zy`<_&wy?eE>^ySorNwt z+a at e2`1u#+IE#fV$Nr~q`33&(nsfdS%%NoBXklP&;b~$lYUgP4pPl|Xc8CJVJWc!o z*R3m>6(e<(Dgmt9Pb0zv-E*u13z^7AKK>B4OHUt(RJX42JSBlPNb|zbS%@VRg7yA3&wrg zAc*EB-d=`5U(pOn%1nqmRcvnIMIw*F4JnQ!<<>G{Bcm>ASu+t^Rf-wfv2at&h6;!U z(;yAk at 5t*Q4oE=08_`$rxg!YOh+o`QQaCfIUicvQ7@>ed%j!rXta#&!1RlhqE;KRq zQMwSb)f`*e*PK3)g8x{4Uyg9HPcY|b!-CxAM2Wwr6ni$bHcWLcuSjx?BQHgZro?H+Nc3k?WhW-v#>O0JodZ}Y#N zd3~#qZ~NvdW>yATEbS0hLt`+Un2;+d{gP>%F}7M%E17cY&(EB1H2+=bRTNKptQSzXMULreN0Te&G2P7M zoRXWpib(uy=Is}HfVm~m5M@>R0KCLP%p(XMqCZqV@{VASWTAL(|zCKsz9XI(8gBMgO{Zv9gI at b-~iK&TtK~pS^|+ zT5opmdj`72O*dhB*lNX+xT5cz?`xkn)M^1KOtqmGcG;#eQLoa3^;QI zIKpfURCCX?n(c(C~@cES_VG zT`LhL6x=zGpYx-IUZqSAZ`OOpQiS5F7&67XS!R<37)br{MfZ;@3g}-(MzZ{+>hB_m z6swvh+OhwKEBjiH5^6!Rv$le4FLDJj;?_EA?VaE7+kLM`8#F(eJt%PTl>*+BS?ia^P3BYD-lqS^4_C=D%YH5jgc)Z?HG zjntQc?D`j^|1=0B$rLnyQ>hm`;Uv)Y&Lj3183&JZ z)+S{W2r&*ZD*Dsa=%>^_Mbk1ZZ$B|`vTKseYi&poO5TH^qVwtzPUzw*loCVQ9>Sh4 zGIdTXr;%*yBoei!d5aihB~`~lB&=8#ykX7Tsdr1eF_5`PmMLz%k~wEKKe{B+au%!) z1NqJD7sT1_BiP0#6HbR<2=Fx4|e5oVy4pwyuwNH?e<$^+-Qh=0_4 z`{nIief~E3?7D`C)SgN))>3s&dXn+0ud7fIcOj=#pdXG7gzzB; zrBC-#jMN`HHXt8d2b59M)Gjlkl_O>6=@mzesVeP==7obB78`-5OW9S*aeQ;AQMSds zN3!kE-dNe3MNpW#ah_@*Q48`ED>R8(S+nktcjJ(G<3gRc zy79+YLOgQ#T!%lFlv!>EYdADP+vFO$T9HSn`T^&jZYU3760)cxO+!@ zJVAHzjpX1n>@6A@&>4G<$g;Pe2AEV2I~RuEvx_}A2a;JV*`^baV* zzyJU^{->b)-z~CoR5ooF`Qdq7YgunV&Qhc-3iuOSA$kGanJH~4_3GNRd#o`< zHXULvVt2%){#C&eDHrf at Ioll*=L?B z=1(@e!SzMY8X3~D1?A+DNk65p0 at S(b2qv|M=5;m`>Jg)U!5nuhH&tE+stD)|yO}{@ zEYaX=)>5mOqLOjqP+*^gcuX!-X+^XHtucw7dTb29fIT%Wh4&<$r+I}aHbQZdAI z1(1tyIFuK(iVQALDjlOAxQJW}uWdV~rCpXE8I?A!;Kp;sE@^fLtgCbiHJi0$N7hWc zH%!7 zPBl{{rA$;tAc;qW;KldNQ}8R~xBY?i2+aRNj?5lXd60RlV+fV#-+Vt)D!VD=avQ=q zv1%^DU6}O9OGp_PMcO66Bf2XY!aVVP?-(n6w*%f>qWIgahSMUUyby%`wGoughgO(( zN%JscD0|dN#jMEwFvuX-GjZcAQRG~#V2|Y%%*-3HkYI}I2I8(-Oatbnutc>1wq)uc;!}L=~JE=$C*iFUE>X6!`nR>T zO%j==T{SJEOQUMbl at gkr$iM@^{?-(th9F9>QUBZ)f$jP>#3%S!o#Nde-#f6kqG7Hq z8~jo{?aq3y)7%cHzZqOkudjJ|eE`_{a$dBHhR1AK%gq`nckA zIT9U at Ad^CKpC;OC(S=RN9uLA_b>@=kbd!q^Fvq%Ir!|{IYB8&m}4zYJdab^djUtkrI__m%GZm2W8Sei5^XUlUI~J zT&H{+!`sjbC=SFQrArG-fIa0#2l%l$EO)b_0$-LnfiBB2$PGKfI|D#nF>-a=g`IJJ zQzSmQ<;Ys3Wm1gkpvbm&BnB&O?Y{kF2QmSdFl4Ni4pEiC_={#1XDze~bLaAlB2mzf z>PUYud-Bt#jM>bW$g1Fb?t!WsK4CV{9vs^RcUcI~y2Fey){jTk%y$z$xs7xb+h2GMm`WKaHdn9}WmKh|b_cJA zZH<`rOF&Ed)ImP}#an6jcml-Y9{`&E-)Lgy{}2?(T6TyE at MFJWwi;-ys1^k~l`V$H zq){ywK*bCeme!KjK)^^ontS4HHzn&j(cb@|iH#1}7-u!eDO?uo;a{MCGn)D`IMVd| z`hEfK;N?(;6Xf_s2_PUuFphyK;Ea`x&7mEB$L}0fLM4kX)irk=K1f%`o3XP%7msxG zHk+yg>fEGvoVD{_VV{yPXR5JU_wAUvXT`EOrJRTEzBCJF at UPi0++gngs3i+ALFvoAT4%O#lwP at IC0P_BJ7_BDUIIE5(>XLkubf4Pk`}8A z2dDsf`>Z~1;`c|YzdR4s{pzfMcIjCZ1nB#AHtJe7T5LWT$$P6dceKV@%B#KA-D~I- zWwvju!g7oP!4$3Lzkf at hHWr?v|hnzT?~1Wxgcoc2kH}k`C{g#7YqzP17llc zx%#~jGR2C at iRPU_ZPWPJh7)UptFzp}u9tMWtT=NGUg6sPj-HH_RXD at 4C}{;068ecy zwA`r=A%+yeRYzE~%MQ_P`WUT6>9Pv2Lk98t4u|H46?rEo$p1PENzZzB|NZun)w1Ql z>%4(dvKhkMHe=LrrA|TQA+?J2g&-bb;a|ZT1|-p-_5r0z?IV1l0N2bn%MOJ9jF~bv zqlh1 at 4`+r~mr^ICVLG0Y^;QFlNsSWy<0*2B7^(dc$`KlOitjhee*_^s3bRG*XF8dd z^QJoC7IlSgTb7GpZKJ(RKtZTUk?Je>5%~Vt-o!$Ilr8A7i*cxofc6F~i)pmtz=rPB zj#iG<9!F(dA`xZulpsGSsr~*hvV*jtk1gOI=q7^xceY^v1$6&Q)>Qd-^BvR8#_LAy z!0{0(Lc=Z*Rrou_qX9%j>E&U{2nf1GSH(1Iw{czZCpC-0MDqiz;qm8gyV~{}#DKSDfkMbYT zN+m$P!`I}_+FfhUXy}Y4WjFWq4Xxs1`sC1}B0P_OM+5y%^Sp#?HyPJ=X|Db^9`>n;?Rwe=D<;&H*3il$y|^WlQJ z4k8*K1?4=4VIf<%LXG5B!uHii?gt)A<>0?58^iPpi7JEx5s>RPW{lpKz|cj^U+iv}e@})MKA=l>}wseOy=ZdNC;$i;c=mD~HR? z7$p~+S5UfM6oBWr2v5eWtD9D!J%}8(GIPl1a-18Y-5V{3JRGJ?-)hK`rIJA?l=3)n=&fKSYdFchLGA47h##1T1qQLRGt4=Pn9oV2 z0kT#5r6vc6qV$q4>WjE#V9lq16A}wA5|n?-Q}{re9`y2kL=T8O5ZlYYhzq`jB|k$D zuGvb**_I>wnU6)4x}vFq?NgkSjHjGxruI2|PVIxPPz?)5_OTM}s^!G7iBuH(h44Dd zLpKV(11i3G0@&w8nHhpTsI&R4J!}(74H_amu$qWZ&n4&2V>1FewH at 0fS|ko>*Dbcl zBwqeyo6#(L$37n_0KkR>0086v5a0jNxTy`{t-QRJ=5s-udoR(cecW~U8bXt0lkkZBCx~zq=MN-j5rvU{;K?vThM$2Y9t#e7|lg6fR zrA}p2?t8Z5c6KIfLMj{L?lP=z>-EMp^_S;$%jqU7 at 2{`VuMmKIXr5<(2vj@!yv&G% zwz9iD0quf)0~nP9#4F9QA%u;4YW)TfXYF2LXjBTfehOG$P!&t{OelhS**?XV zdR~mxoifa-=^-b#Oi)>)0dnr_2nH at U(kjz at 6Z4aoKKJ~PsP&{MP*#WeL at 4)Gz5)MG z6AwKGo2fy3UX6BeBmMMWRygTF8ETbbpqcgrlyFA`qsbXt?67NFZb&Zm^chUs{S(w$ z>*qaI?y#z7ZeOmpoT(8HTy8u!^EVwh>VBy9TS432 at gTIrSLUzY&@^{_hM#_*D0>RG z->lFyPkjvC{$bk1yD(h!*fgs*BDm`Q81A-=C at S?>s*d)^Dz1(<1|wINzHi|nEAINx ziOxGsT33&Hq^|T6xem{q&{eNJ=>x%(JcoNHTHCz?QCi!B15+3~0dz$xVZa}K{jB+B zVr&bMxhg>dqDJzwIMJB$&^E&8@>j6U81o1IwDszJ+u($h0(E1n8U!iaWRzR}In-9L zKp9bBg0j-Wo8)Dbegwj$W5-#|dMH(4^ z^1&t*vlMN6qJ*-Dk5iYaf2*p<7}VkAiUN at e=5S5%WcC^~LN)&$B_j^j5Dm_iuL(Yj5=+*UDbtAJ zr-5)p4HlSB<3&d3q(MC31rlvV(-*OmU^QyCIw`bAw5r&;;2SSBx3QupaN-8e$@hBO z>P6MGS!l(Rs^SIRTEaGy zfx-+_j8u3=H7D3xQ!DARWN<&bCNrq}tl=BSJ8Q2fVUT#AY$V1ES2u~*y4foQ7XLeW7Kt4ZV}8m4H8V zK9R9Th(*$jxjx46BKpAMXgahttnlXq*o`&Qx-^fg_x#&AWwRPwjEu(nlc}WL?v}YL z8WqN+H63*JH8bjKUi~;#v`A)W$=I5C9A0dF9=YN!c=@_OJ%70zP8bMyjS{hbIbSHB z5E*jpOPUyyt&66_cUfI?5f^$go2!fgJMtZzm&hJ-7WI30pS7s1qmaO4VQOhi$;nZjD6$DT^s?khg*j z(FO at H^Yjc)U)?rzXWySW#Hji#n27_WWl09%4+mi!)9ogoUp;T3Km&M}xP%=MJ)`uL zdccnAB{sAP{{a4`f^m>v(^1U8 zq!8q9~NkY6M$)eK2rUC!Na6b%_PO}CJWU^^7BH2ECZGqy#W)T8e;1A3V>)S zXVcEJU``Ejcbc!@Q-M3QNKv0OucuNz6#a`h$eS0F-$S6^?0kNb&W>#KhY5bE=mCnO zX>yOw{lG}wE1tShB1~;x1V?v|5cHa}d4Lqguj26f&MY!{F+g~Thf_P!$i*GZx9$+f zolNa^!M-lm?T|NkJxD at 79CN4Wu*W?wcH2G!7EZ7&^wZ at kKJ?FqpG9ybdRCFf9z;$~}U&av0YgL$J|;V$d`Sv$ysb z*`5fDU&+wtT>xy}UJ at s7h@4XKu2r~-aPbIUb$D}gTjH<$J79+7ZT<%Ou7YNNhR{o6 zdk+n|dGRxKVG^MxGB`>?o<)(vJRwfrfLX^IiwK~|k33QfcUa$kM&I(i$5z>p>Dpkt z&B8rMcKKlxyT%xSJG0G_ at 8oAj6(#{R1L^*$41_aYz_ z?pc#_-DN#cZ`Baro)gUO+`Zcy>0tHGL=CIvcrlTW(Yv#nHK~)IR2bBL;UA0*X%@e{ z!o$rwnNDpphE+HCNKctYQti#1_5wz8V)dX{+v)lH*KWyMM+T6x3wG#77jL-T)dm2k zg<~GAF@|nCzTi0KFa9yOdm$;_B}r;kQPL at 2Nv+bKl!93eNHKE3)9(zQBp-Q`h>Y zKz)SL7hHV7S_?jWpvuUbVG-wR0=+mP)Q|nKCjqK2_ at bt*k`CR>w`U3~^h*o4vtG?z#)^S(^h#_ZkiL>&f0C z1Rf+ht0N@%Ny|qxv?SRmELN*^nmQU<8cJdWo+>gv#}}QGBbQZ{mggmwCNMoTwcIEM z2LO9hT_}TWRK9xYPa#6vfa`jAmI3A at zx9!>#+Gfq-chN#H$#?XxDk-3CviQ)mj-VQ zX&JyZQc73JHo4DJkmZ*gzx#(qURh&T+$Zex9ie{ESu~VWm8rCcnz46$_xQ;# zI`^Ep3>+m!ky~m)_(!Kq3wRb={`O{kcvBxYBS+8gXgWmZ^Dm%_4R4Avl_8q;%-(gFN;yhn}JKz{!BK7QbWlN-*SEMlc0O7#A97i+u zkb8_?0v0!6GP?K=JHQ57TEUoaea8(sF#>1d_p%?HGyOn&>d15eoSj+m;ZJ!5&nKQssE$Fvq;gi1fl&qBA1Z*T&;R%UxyS~x~FWtLJYkk3lyE6klKFmobB(+dABM1WDM$O=(x6EFD at HflQKFaaom z)CS4yu~h@#R?R|AwpIGyuVULTSE`nd;Z0l1#o*o^XD*a&T9G!T`D?}h6%uxmg0?|G z`x+SfADZ`uZTRfQ3J9nMY~n^<0wd3m5`cur3G6G$zab;@{%1&x{PiMbIfZD~rj(`C zzc^K;bbq1P&52S+JMu3fp)RSh*V#2}yHW>PSpMIef=r!}IbCkm{$=eDGiq#?iG*G0(_W^6TioR~ z9fvJBY_C24qjm|$=~rC;eeh)xxdt>>QmSk+{coIsS5o64u6U?h&Eat})z?KOqTOt2 z&{rH~pB_VQ{&;S5HEccjet at fq^jjZf(W^kjTO#_xQL^C7OKN*w5DyaK)tY<`HzC=+kMdVdlbWtU37UQ}1ocQxiDae at Oqe}sF7XVSNJp}Ud3HFtY+b14p zBI$=?F0M_sL}XY6!aPinSzL6r zM0@?E_)D<2aOd~*{_kMs at 8srRpyUC(0_-0^lsh$b(7gYLvu_I1EK0IX+qP}1(zb2e zc2?T9ZQHiZ`qQ>um3gagPtX0PA7;L}kNce0SP^UOh`nNP@=k%Lzb^>m4M%$)m&d3- zNM->zy%@D_NVWq*&ylZdl>-+9b)Q(6Be)`#{In-hv5E*Get|n*2<>5C$unl=Hyu^j z_&#)_xKE1IRie#4k;^wauhcxNA^9kn0(9m0 at Up42{BfwP{ydF-zj{xeN{>Hj+X{i1 zrq5ASmTN%u8NY(d;n>N(je(Wz=>pVFMJJ at uZ|$JF3iO?GK1EkfGQ3AFFhB;Ph+_#* z(L|0gTpqHlOR2U!OGbLgpBq`M=N_C^y;$!|@l23jVUXS`Fz;Y*FZ~Jb{)DSzOESbI z)dPB04*Z|cwyeb=Zl18HRgi|p5ZnpekVZ>e!AxG){uxP}t+-LEJ at y%Cr|9ta)|?4l z%Y=OsLTzq#^?jt+ig=(raiQEtB|2xl=#*5w_zg;QbPgp6!bB?;$)PDbg&}e;Fy{fB zJru3ERIcC?H+*18BzH~;1gNgg6G9+%%th|d;+*%eZ8a9C==uE(*TgAJLj*1G5VgN>qEE$k(^0V z+oBY1EXK2JqE6y04?grqET0L}DMzwG0%dIq6YOSCP3@>$ zS4>kA#})_rjGgP5pN4Dx8GHep?@9oj4RBJe$RT?!^$dRQiS3YMeUd{G+ef1~G&5ep zYEQ=JZAb=QAg?!|qr*Q(0f1t(Hhkp-E{a5jHcf at DJ5TsHE;S`k$b<&5k02rCk9! zkPPHiRh32C9Rt3G1eOJ{qjk*s=ZCDDaB2HpM46-}B?*4ZxWt4 at ss1I=EcSlBWhA6fDcj{^Nd=^kn#_-GGrKiSQry at 7}EU!v95olDehH|M&W&0 zn*Or8VYDJGm_!ThyUA5ZBkt0%&qAKeSLTFcs at A)?5b|%W) zh>1UCdBoM(k=4aanF76u0^<{9pEMSSTw;~SZkl#;{5!hZrmTc;n3cY4+#Hr#DBGYmUy*3L0{@6BRQ`& z8KH0eSJ-&*!8a$@v9Yyig{Km z<~$RAl0tPEp{-_-0OXoQ-KVT}a0oGbK&5?2T6*NkxaVRBxJGq^%N_WRsiCW_4%)+Y z2l4lu0MKG_-Dv(fD`R3W)QNs*vI16R)54yK42M+KF4`-1)a<^}@cD`&`k4Ec!c7Bn z0Lg(5Q#`_paX=WNq5W|3Os!z%FZv~b^aS9cX00`wr626_G48O|+{7t9d6W-$7+)c2 zl&=;E*SfI-h1@)Hs7_QXr#yZ%m1;FTGxu-mlKZX7&5m7rO4rR_ zK3_L4wecMK#0eIk#w?kTVrcqswx>CbA$C!pEwApTt;}}dIqO`VQLZ|h42;#g50+#3 z;gA!OTv}BI<`jRkw+kXU+BR9sW at Nh`>)U#+Jv|jmp3S$-%hvpo6 at Gy|*>_{dvg2VG zbI3QXpItzf^>Y-AEvns0ig-T+jI76$l>977QWGVW^&LwuAMPO?I#QZt!WkE_wt(uG zRjTPV;v%d$>DG8kg}W#M(8;wOmJ`r$#2}gv-x)TT^vj5L+c341-Y14kgFe_9bC;cC zYnk;mQHH)Z+Ie9F3s6eceND}Y&vR_VC8DfPdP_A?E_VwtoY!Jiub!_?d-s}k=IZwo=b3W@ZT?$GI5$4vO|qu>2h$FPc^KtP2EKtO{3%j;-yBR5ZXGiNJPGZjm#|LC^N zs{fKlRYKb?r-!Shii#rHC~~$!uFw_JmO>gqsv>LQxcJq=mooTQfwmMW_(l-!RV$EX zRm}6hBm0LajQO3!ov8SWqk|JmztbCT7lvC&}J%e^vB2Z{PDy+Ri?(Ts95#v`WNt8EH z<;+%J^$rqClA;FQE*xkcdzMC*4!4%8>K1%L5WQ8V$wQ~2H??@wM>Y-xr>fGw__g5B zGJvaKH?DlXLGu8cnWQ?QqzB~w_;VNOY+D(vsvdL1II$@5*s-M0sTc#<8G at stY`G=^ z9OSDcMMJc>q&P76?M3=PkS=;LsN$&jM<(b|RH*`&j-7MY at X4ON6f;?7S!q#7txZ%B zP7!gXbfTE8Ld)oZ2!UI?Ak7uV5x!yNTQ`Ox*@`*8{+lfy!K`C|W#rgS2D>feDE^ya z5}~wrVrlHS0^X`U<30L=e1)|ri#I`4#yibk`YM&zeapuqES8MPv^SKP(Z)nCmAz+}(xi6*9wZR@*NjT3<`SFAK%BVSV`X at _Ru!|LVd?uk1jyktIGJG1 zfG}&lEr?1i?+Gq2p?^nX{!dJCU@&i_+I at M)+bmv)2jD==-{zn{dJuqheY`+(guooz zE{^bS{Lg};CFjq?@2V62c=HFIzB7CF6Hy?HLFuwwrr$pd0O>Z;XvpOWb(r7t4p*Hr z5|lTQt84<@1`=bPs3_ett<9^i2Bm64+04C@*1dDqyh~_4uV(Zc&E+5Q)xE=Qi;kcJ zgpb(SH~*|=c?L8r5f1s6&nczPG0U9#)VQxNWU{%{J>+${varQP(B=xRm|3 at T%dgLI z2cgFyIdlC9(eo!s%fHpUuH2_I`Pe+>llwHXL_zj&#Z5HyZt==~obU=p-$8od at l)vZ zRnX}RFlJXAex+^h8u!_{$S%Yd1$dz)?#>M5t at hEq)fk$oLs at V?cB-Vt&-3Jla=YY* zgI9M&_z36&kDMBTGyMGK{C{ZW_={GS6{&C`2p}L0WFR2w{}!#1MlP1ZR{z;E>eaB) z_{SdAF!DgA4kasa)s-q at C1aaQ2xVlUMJh`sD7|pgkibdVELqK(ZIABTX@@h&KO}8= z%Y+MrtIMZzaFb+kYzr<~E+ at G^Ty{Tu=Kb1#ykFi5e1YA;`NJDifI(*=HOplLGl*jo z#}LgR1sT`jZzAbS$j3YgYZ9X|5e|W1h-ePsGkc5BbpdTX&gcWg0uU7>O|yGBYFO7W(UBB{Y0y zS-IgUK!t}_A9s=3mtld2HWG=Ym)9_uS5}mvZsGGw52H|U3bykc67*3HA;=Cc zJ!R~v(SL5mB%#MK7|ia;TfNK-(l}{P_co;H-H+5cpY2ddN$9OfaCS at sAapy*He;M?UePAd#|TN0M(R+(vy>bo&# zT{C0Q=pUmoDVyq8R<P{@R4_5IyzrJ#RdgZG-(1LH{yuM_*^`tcP+qC?MYTktC7TEl}dfDCI>a||a z@(Y^WU+UUF=Z!6bhhO;hy%l=qz+JD6sj8Q2KDXo|r^RY>>Y%3DYsf48CO6q;9#Gy| z2->X_%;#G*sDE|X8+rTs$dfR>yb&jU@B at L< zVmOp2xM3}P2Y68dB+?ML?Pvi!;DYX;E&o{0mw|BHh3&<66A*a-kecH at QMfmrebmZO zD3~kTK=FzpYTw=4Nn3m?kR&n%MKFP6 at Nr)aBFGA{YkE20Nz*wOIVy+SwX8%f40#VS zxA`c9w^uR7p}fSSwQ|8|om-xEI0g(6Y--KLZrSW~w1AUyBrT8njaiPPJ3^kmOwYL~ zyciBA`Gnk-Lb7kViS|f53MS`MgiNyp%M8tsE=GEk)HNhys@&5As6#ox5!VIr&?|RM z7*OBZb>~v3(uX1_;wS6`W#0;MDDkrw?PN!UG1W{W=_-IL$y4&sg#v#$A@!6lX$#^v!ji%B%_^W^UmG zj`Y58Uq$%aAy@?Te<%F%|8$tpy;OZggH-`6j{?-Zw(~}w{%ycfpU0<<<1cHpfC2*I z_;2fwn4P1m*MCyS|GUlC6X5Bsd5O0uuo~2(GGFX-Pl2LWBcL z_F+d&im(Z}nG62R`7UHkB90pHQ((%|!X3C2T-tUicfI#C=QHE|`SVi&2sLA#D7F%= z%!x7h(=$N`g_Zhfg=wBxb(Mi;RI8s;ys?r_T!qJ{nE<4E{<)sMv0ay z$8mVlVaSqp>-*zE8p)n>SRwshU&9sp4djqZx{M3l6}E`YpbMx~r}Jo&NS^3#6U!-R z4M`IF8H9Q!GMF743$AV=-99XyYJh<<7#u#VeyAZmNV!{2X2PxLKthdYAuTpfGc4{} zn%P!bw|$@HHc=t#FnJhSd*^Vfm_#eE$T#f+27&={Akjv8ngh44v%qavUJF^M5Z?CI zW3SbMBeMXaxDi at siq+6#!LoLx>3exwAW2ed0 zE03jO at +zDH_(mHA2sI#zPW+t$zm}vRN@~?5$l-Etmno<64UnW;d|qUmL(=|D-<&(~ zq(l{JCmt$)O5+Z=c=t}ZQo>idkllp+1Cx(=LEyUH7uTLbnLGAJ&$+z_;k&$X+&Y5W z@?pTYiyk(wS*p5XHTEnhIzFmWY1;_Y&QgKcVGr6{nF=do_-7#PnGu%2HL7s|Hg;Hc z`Gg|Olcw1vJ|Si6^cMj8T|P>)XzYd#gJzB-n6F zRHJb|VfO`91tM#W9e8K>y~sY{Yp+dT&a@Qx*yR=FCqv~OmcQq40i#HE zrk2bR5*<4$zyD3Y)hq(}*MR>;Aj*~nJG+4Qe+v$yys5=Yf9 z|I$OG{A|jQQOyymqSY!$R1h#<)euQBIF7_3lmU>|Ym~KyuFch12tq%r-Rt%*)IUez zYk9$KeC6Zwe~P_%Twc3k_bJE-=BdMHZB-$z)M5B7c$HBsBag#GJC*Q*sr=wKS!C+_^Vfbq~o}LzeH2KpR%5Hu zwP=d~hg;g1PmAw=EyG?D_^l(H?q1o%2Vl0f~iKT zBlY!rBR}&bdDM3bYYi^naU= z-ySY{j#+Yr(Ntz}5(2mVr58Nx9{&ueFRllge?umCxV8~-CurF6M^G1H+z`Qv6A0Cz z{7*d at gx_#N--m%mw|kF+CIpFso8Z7H;lvSIBpD)uZ~iTK&L+f at iITWK zg=S>8kgWMvR3 at gz8^i8!Yr*pZzcCp-B7PtelaiY;9l=Lbl)7C=5JYw~yAi|~9J zC>x-Spnp>%1T48d?-djHstzP`#AW5%SaC&%qL%vaTvbR=(@=GO73Y0}eRQ(z?$h&7 zTI!EddU+tt%2_5W@(xpXwR(7>{V+tCJN&S6Krzh}o(=6BFk*4eaEG4RsyMzt;3XN%^sNP*XUFjj2jhS2hvU_7*oz7=eo2MQtLD6uho14N=W-;}4Z?OJ z at hTrd-B9w8o{^G=4y$M;aaSDq=q_q4j8-f3N4_ZbkqIdiwQTsNzWUut;aN$;bp~;p zQ!=d#W`L62(ku|EhdnS)(W5k7&~BaX?mc at xQuN^4i+ZB;cs~M5a^JNP$jo?8$x+uI_s_OH_mekC4IN(Z~h$Z)M7JO$88IECXqC<;deiJW+) znR&T$=AZJ;C);f7Y*e>%uIu`|_Uycz99?h!vi5O#czJ2r+Tqu7CNN7x%m^AMn3C%+*ld?RSik}C;{R8VCkRMCoA4%GJ)1?Y^$MMdc^D{;h at PXku zz4QE^zMnrnS>8`~cfWufVPz!{(_CFmI#Hc!BFxn2Ye6l^JybyGuqB)X(GtRA7EC%%LmYPr?NP9YtmjivQ2z2w7Qz- z_?sVQ*hlqo)NTiAs4^yQew4~CIz?g3Culp{qNI(!_RcgN@|)WawnXFB^qBhGBwK;| z#TqJ1N&Hkf70#NhRXBZEZVtg>bd1K#l)zH at mJMt){{_%%&@3H_G!1a3`%J)Zl3iu3 zg%gUwYm~am5X<&bOJ_iAf31o}qjh%3Mg2M^)rj64omtxvA(1*=Ji_8eC4HD?t)2o^ z(a)eMv|`)zZs!9SITm(r8EOczfe6>lmRullL&JFbunq?t3I2tv61+r=>)l~3h zh*td?GGbtreW5B{;wAW?(~Jlj20tRc^)$&mDQ%wT6C>Ca2UQy;n|gcZL8aWTf1BXq z&YP}X-B}Zu%1g_7*{-9Kr{2aZ@@9?_|z^x5Ykb%cS3!x>2*cV zRmyTLdJLy4ULVNmv^t=J#mq#LMmEOgYh(z54SH*&JnRR~XLn|`!F~s1fKqtEJF6jA zJ)j3_ux}&%h+pVyvZn)3OW>b3rIpO(i&PyuA))G67|wme zb{V2;bk6(*F8xhC3`od1rwG_I`aUImHT9 at kKP%n=ZCVHrrc_mu+lu6`7;J{5sJ4h=+9}?Kpi3Fs70d?QPq+W93Xflpq;ywA zJ?5(i*GnEoFp{w0kZkuvX4{JHbBwpaIU(Ll*GQOfg*1t>aafOZZ3#U8vF8_<4Th-= zbLh&y;K+fMS2`@ZO%@v_4gp94M)e=SF`myJvRe<83E4;Sq=dulp&=gLF3P7sd19cB z%8=E%7t3txh)@k)!=utjZ}F5_IzZ7M{T$&tApMdpAt9q2{}%pDO)>T@>KnX(YSn+x zFB}l%zvWT(hvwZ!&JTk9f!7(YH=9X_wLVa(hVNk3k3!>I*Vm@(F7W$p^6oy_Egmxx zx`!XG7i>QMsN0^iTy&I;8+`Ixir-K)VGgDY_b@;tnm1UybYV$ZA^Gc&c|ZCqmt}U4 z^n#p|Ool7T7;TtMB&bOK^GAu>n`wM6gh>770bBmg9On1^bgOpNO;jR%NAQCpn z5gxOfadm;*Gg*JwX14Z2L{BPQTbgGjtEx^c>pU?{0gPRi^=Up*ChBt<9sxn at XH;d5pMm`Ui0h`HO#9mYHS at JE$UK#T$=^;m+1kinu)I zyK-m8;5EC^_(EzkOjTpuR at a8l&`-%AU^wYDwoX2Wic%EHNmo>6F_jecT`f+ZALtsh zL~*d9RxMr;`UKs`8l)p9 at SU3>G)ZYx<%R&%SS zH2L0Vw8v<>3$wIYYJ!L{;ELNr^)J5I1v(7#(brX(Cr)f9_<8 z*{FQ)rFAX=v%>RW)E%o;+hV>2F)&!&0kV-6m2}Kzf{apKRi<4mrngd<>i57|V0acw z3-Iw_x*Cc0OM@;u3il}fB7)guNUR)r;o zQ(X+&0n7MXM=ES`tk^ih(a4v at jDqnh%iE}I8&XK2ui70A=_ at m6xnr@Td4hTi!+1 at t zShjt;C>uR3p$Tp{ol>s3P_Dk at 5Pi?8rp>Dvo^P^n+N~0lgl!SnKqB0d?I)ERz7)ul zM{#(WCZkjI-Jn7XAG0%18W!JA#(VfLMzV+E_%$TzpsgF2+NkOFLz+5dd at fS#5UiM$ zF at ie~B_|5Xz9EkgpyAU1rpI!oV;tGeD5+UlA()wXQ9se}c;;ZZex#{bJR#$PRUqmUOR00k$g#T-Png~!=dT?LsjzRN+RH}sqrGz4n6 z;)|1iZxDMYI3FZ1B3B at CdYti0Y8+{#|G at _|YtZ2>1~(o|D0G1KLjQk-nf-i*diGz2 z5CI1S#P$CLvwt}|*{S^H3I1t<99n6 at R)u42(zM1g zH?Ym!g-iMS`FGKTu47BsxlX at NVg#n{0o~IO!ULm-fL@>1ozvqS7lpUa{J$)L30g-) zfWX`d`O&z-@(m5vxS~pPC1EVdQww95l-ak;2)vqRjqOYmlhz<&UnUkoK)tc>fEJwk z*WbEQzoz at EqT7Dk7(&i&y)fLYQQJ_}wi`Jk8$*Z9BO0cuy5}ZCXxIeihMZSjJDXPB zV}@_JLAKmpHRtDQrUo6VZuz_cQj)S#0)taHq#5{O~ac|HYcD&Gu7=XFSG_V7nXI4E|u_&{f>DbM{Oe^#MPO1i;{7!e at 7QL;E*m9#nM1 z;GYtIh1lX45yV%*O#J~VLW_Co*7rqta6R_+eJ~h^2MKuwhZ`h!r<9^Pmgr5{t22Sl zz_{B?_2A!n*2C3%Coo1X*|jeD$)ZJ^b{I?!V@`kpxQlPcW{BO%d6JHx(IsgAokez6zIE(5vO38AiW1%Guf at OyB28Sn;ekR5^EI%VaJmy z)kU&z3TP{H^nI>lU&9A>&go_oEWgV7 at pnf0=x-namEbN$V-quCOA9FkWoCVB9;c>N z(~&pA)9_2`+hH0eh#ehK>k8cts6jCo%rsk3&6sJ|jn=)ZVf|X2efM`>OqW~TPZ(?U zH>}nW7y-l?$}1J<_}sqbhbRn}9YO1=89X~f4RLZSR49}zr6#cLu1r`wdB(~T_{lVF zZjQ1l#XJE9*m~vTUBxhc8>)Q_bPMqdu>+vh|6W5NO35fWUOf(~9gf_XKhRbHkpG$RfEdARyUEv|Nh! z*f3$ZC5v~FJ~5O4%FDU(seebsfx3R7*+@=5Lr+$R`;hDun$QM`4F1B3oY_q5%n`)< zA-J9|$r$$y&i+igat~S|2O|gL7e7!IzcD at f;*1u=8+dtENQ6e>L+r*-L{KcC=82Wg zbM_ at RXHH_FS3mSP%UPn;!}lEk#B!qT^l%u*hN@&F-hdJVL_x?3o~5YsEHkW3*v&D(Wuuu)bX z7*Uno*B_5aqA=^gdEnr2piR4YWuKFXVS=em+L1Vs5%EMF(OVm#kVNz{t9U2Cufz^{ zW)u5cv8d`iW at eX^>Hc>J3x#m8WTy+Rr{FQ9H3YS9ME$)IPc%tis)F9f at V_OzWH;e@ zT at WB3TJZnrN=((+%uLwG#mw}do8rWcOk5rQQx>V(DJ(0Z`QPkZSVM{!M%f2Nb-@=7 zNVL%n;*gjdx;94=-j2=Eoo|(1%id|csjw+YvE4(y6~~;qn{8?qHzD%9_B?sbx!BM9 z|M~ht9YAnbqw-7Jl?h0IF&JkZ=Pu|ekhiWOp zA1<@&SW_t2s1$ErpBY;@%tv_TQEnP}eAr*Y({87c+PV1LJu(KB{9TC&y{Fk1;`pZr z^j?h64_CZ>Y>rnyp~!8D$Tgq3U(KQN<9(M2jdqLhPi>SVDmT%|NH%;y6_cB?%(?Ik z8!vS+>g7tUvyR%;_eI54(&v+TP*`cxsgc6aJ|mD%{?rWof&H$D?VZcZ2JZ5ev at iiR zxIWEJtQ2b*@S|tf3F5u%cyP8dp3nWRD;2RxY1QpRw<8}!lp^$%^d4t!qk-fWU0i$} z^zU(DVzxGlPPs-#VM6BVY&FJmg9yVfYPTW$fN9}#_pic~6WsDJhFZG%y5IeBhOrnb zLLlo2r55^8C94aTLMRja94AZ){`^mvmdV7cOJ14s_)XAF*3Wn~UH9mb^GD=L1*f{2 zpD@%t6h|2LNg7ychZr{@v=!pEqm{Z=In%K}I%Ozv97jHL8nCslA(I at c4HCE{E|xR6 zQBP(PlyFzYVn!<^sasI~==m6Fb)$a43t?IE+gBrfcXD>Uf?eg zl9qbP4~DN1`~&)5--m|ItiQ*Kx$v!2XJ3(AUv6DB_XE zZ?C-QXzghtB?oM6xZ!p)gml$K>ZO-hO-b);NSEj}Yi~+Tmja|acME})sn*l^Lo&A_ zaVZ9(ra2G2LQ$lrI#Hw&HrTM*Lx0ulWZOaJ~LSATB`s)rGU zS?e-V&^B|CBI0n7H&|W<-`15E$l|j&%3%(Sd;i^3`NQlN5)^~%qWo at T)A>>Km~mgq zJVuO3nH6_ea{Ek at U_YA^aqVaJ`KEJWK{7#ZOp1nvpTqSft@7xjnI!I+;M$<0ycX4BdXSXSB?lMZt6z9=I3|J zBlcmaY_-Q~2{`43^JvaWlZ1ju>4&kOWF6VsTE7~cl!){%9}X_!etl|l{OEHuo|(QW zj0z{ZPRb{f!*jWjGpkL-e<`Biqf>csDrh at Ban)hOi8ESfGYA=|Ng8Ri4b({)W^}*d zO12qi9WY8RUt2u7PbPMFdsJyoYe=il=gwzOqX{}|KBNl2PV+S}cH+kT$dajIa`kpU zmzN~#1(2GBclDb8&^%(+F9~v5EQ_w58$CS1*_B=tY z;Cgz>F{Y49F)pdFoeLADDfn0qxriW0!+2j&qaiu1jf{?$G?=J}l&A zU7&Amag2zsnlKa|B`)!LW=9Y1kO>_d4$e@&b3 at -9fQ4bGe50UH!y7IMa;SXcV5s)Q zVgdkW2Iobny2Xrdt)_fg{=6oDb7(I4?p z^~GeQe#?u(GgtK`Os5{8m^73)ecP}?kJeOVo*zcU`oiuh85+<+SJ-a}B7`Z?t{Ezz z+Zvgr>JSgWbjP>l%`0^+J+%$icA>sSwzjYzoyZk1XH4g2e*%%oJ6N7nM`c_P336V{ zsUkVqF$a?jVf35TMhIYp0`&d}U)g^3mC|SNYL9>=-Qi1ZZ|p9-{9(g!w$QYHC$mDO zZ8P&qe}WGE5yAuYfh8Q#H(%j_Jh1(Ak2!#p#MYi at n{h&5f39ab at 2s%6l^XlMA%C8VUM4}z}64tI*1@{`(uIQR2 zWg#9JMn712uq}TGtS&K^Ui6-Z{D8;kjXKm##CVm;>1c4=dt`WuR^CFfj?0TUvcE{+ zAaJ9J08;V#yl|lHaD?iWcoVziOkY|U0=u$^;*OC&CdB76Q%0n!c#GR z?TQI&eLJOvQx2uAN8BCDF}*D^ZgX*E0)s at TM^~e3orz|yp!OC z0hq6O9m?r#yL&+Xv_j;%K57LgJuPN;1pTkH+9rK#3H9tpyFsWe5_H#vZcy|-GFJt) z!4#~UVB5D9y8#BNO(F3N#LSUZAQZl`(2=I$a0JDx#?z9 at x`PywUxJcf9k5BA*+iMu zBEpP9h?6|CHQNey+kDC1 at Qasc++OHD{$sd05zwlFBc=-9kzJ4TEBOI~1ixEhWcwj0 zWalZ#5eaG&W8a&U2xq9Z`4(9+bZ`cL$I5=?4*U)t`28ps4BWrX$26ZvcvB%&C3edJ z;kh-WA1L#11FkQWBhwn{2fVdazk0QeGcdo{9;nZ+HV7d9d@(q>-5pu at t|Td*gkZ_4 zAugu0;ypB}UI3_FQA)V6N%XH-#nB5K>-1fv?lGD51cZ5-ZyaN9CKb{HFa}~|SnZST z_uaRo^eU}aft`Vn#WhnwE_~4Bz<3o at 8DLe(9tDRdljpU+L zA0WP~_czBei-IUQS)ezM`6 at 8aqt>TgX0V^QK-$2+Yt!;KpZE|I)N!AR`OjRAGo>09 zeC7I-(j at MOiH7NEnBK^$xNLu?bMx#U&=pWwpx!1hgPpND;5(GR6ZHi>4*a_rW~@S! z?mvuwJpXcErvD9>_>Y^kSXCVb93iwXh(tH1T20y)dq!(a#dVqb!HgDB6qOo86jW4$ zFtZ?=bgiZ3y;KBvg{F+3 z+>uUb6iT8}!_sMcYVbBVbnusOnR_ee3`=F2&An}_4?StLbX#qFQqh+%KN>FjkQ_WU z*e-kaqgcf3ek?(|W2w(B4#P;moky*s!7Z~(M0pr>6aStVbL>6Y1n?d770)qesE;!L z9Nb7&enU_9=nhIqP1M5VtN{43c-6ZIF?r{)r&{EA at Yu&2P1fYzBLZMR$6H^#%5~3v z+=36C2Ap2=ekOA5px1V#$X_7H{k>CU3Qrjl>O)Ugc!1{ zmk|V~Wv&d7R|PkDD|PaemoR1OGF7fg%s!q~m;$JlLQ&0ozrT}uYj@}`(|nnYhxE1| zrrk21XgA0DsE2<#qJukNdo at 2I@9QVvmhfK}&(mFbFeFLV*5e44OHH!EJ<)388?g#y zG{KyesKLF2vUUYBUQJIPX{R~ zLPLY0uq>rOlKp-3(v>oNiLZYf at f+r?JY2#;-h$Fla`1P-YWTKW{#ir$K%Y^ zpRdP5paH5A(gVTCUbz=(yiH>5N$< z^Y#=3B0XFrY6qY(H-Y{uOHD403CnB9VyaH3O)P9B>N26hPMWm&3YvMkx~OF)x-CIp zYr65bRakrF*!D%Kwm|I at OmLQqjH-*yj`N7IA~g(S42hMqoPE9HeA1^#G0n6gP;lQK z*U&U_y_!(kVA!KfoSbx?JoxSwS69J3*D#B`Y!cy{v6AmYrA(!3?@pDxCk{0 at Zkw5N zex1=RR+h?n!(uU}F1Jd}2Lb0FQj+E)X8LfGNqAnBo(9voTnm(BYNX=FIIC{8Y3hEA zuPmLVJJoTrCZ2wY-O9Z;H~3 zrq22&42ZRu`iiUwXW{Y_YtQN7yp~$>&nODvB>f1}(QHLjJPK%3INKL#nwO3iZ{~JE zgC}P>Mcw03FGWI7P!~37P-gOO2=9};j1KsYk_U)l3rehVBBT%e zB_;MnnW39j6zz<(LWi5ITV9mB*lP(Z70Zl5#1Iqa>6eO*(8b<9|E+uCTw$8?4g~}x zO8^AK at V|h}KLOLK1+4*CL;nIZ2NO0ti1m!LvAuwcX4SV2$BNVAWoFawFYiT<0)j)tLZ{;59TL}nszVe-wZwHt#sRw+1fOv<(7pKG97I$^1>oR9LrL)_LSx962;umHXmgz*z{@c z at T_f2yVQl|3mFY;oY!Y498j5EZSbQ%UXg7?q&?tf at z!!vjC3fyZ&Qfy(-bk=Yg4MV zZW_$Xo at u}YP)ML9)^&&M;@h6cuS{)++9+lD#D`1l7KhoMLvT%e5G<+vd?j&N-IAK= z?Bkc~j{U+)U(1tCx(;h4J2u!GJnHLLK3q$v3-c3wY$QoS?pg&yU;a!vd zhz#e!-b6+Hp~|D5yg>JJ56Y=djJ6_a=$LDqHw|ZwJ_kJUnhY+$dwLsC%pZReGi0EC z+Au$jCY9+5AWB4g=t=36L zvjF^1j7#y8jd&h!N`%;Jnt#iZCS;%MVp6%_!qSCOnj%B=f2i^3y66STZERFHIhzg8L{BS_rPc($iE`CA+aixE29fQPK`I~Es-vKRxy0{~>dVzs8 at Pkpv zzM&qG8d$_8{3 at Ifb@Cf&)z}!Jx9Wi&U|&2^6z}v?F7qdWEyp-gejAe5DJtWW_fp%d zx%Sgddb6eaA`6#%InB)UIWf=Wa;#j1&yPGKe45bJVooHTt&cJKkhR$XkJ^}O;n?3= z+=F#DRC72=j$&3M8`AtG181+L?8&kp)fl9A&5eq*Qjt1=AGU4rU4C#TTT zQl?K)lFA+wPfpO)BQrMO%X&gh^_bEb2EEiatMj>6+ybQSbWWPTbI~o@!{7JFEk~k- zX})=V&?86`vR9Y_dQ_05z?{-iyR1G`maW=m55FRbIl46KLGLq)fRdtM> zNr`Iyk#SXWB$Lr4?o=Jq#Ist*cg7ROE_5Gle)DAU4v at 31l=`j`)$y(jD~ox2BEhW; zp0s++;gq8e*dOzrAhE|T(b?@diCNZqhz>2Fqze8^kVdQ%1F{7JLrD^%@OcisSGU-IV^x09uX4?!(7cmKQ#XK(0dKEb+O%x6Q68Ss_y-zP zamB4qzokYQ9CFei7)y at YQ#g$NI+LV3VsI!2n1Ag`Z|K+Loa{- at fBKIv_^1McIj7!w zqu9cvg<$${u+9-_ZbHjQ0-ey4nN($&xo63sWk%WJ at d*AP2PEBFpkv-+bg`n-$0*~_ zoinn0RUJ6Ib;kr$yitCs!A!`DzqLmp14<8ob2RRW7%DuWUaLJbBpk+zX?7w#Dm^)O ziVu1{^P|Qydk6_NSJ)4FO2t(@r@Ic_3Ulo3{0W5boSat&5q(K8rET-Uf6JC6%?|=Zf^CcJLDuc42D*9 z4T1J)OtcT!yvAr>rXN3q^wz-8e=7HZL;1 at X+1Do`6LNQtxv|l at O}Qtb#F=_~=am=4 zdoQK!hH8s;r==+r62G_Vd%XOi*|%?mAP-Q>Ye;(OaGLt$nX!B(B_F5zY*M7^Ul7fI z|4}ifZV0YH>D|5Ub2-2R2<&~@Iq&r_LbYx{{IvS5owXTdwnGSgaY_`cF9QB2TkQC8 zCm+5mQv3`$2WA1m)8}wdKlw#{!A0$ooetN^WQeNP4p_J}ToJME4?|UjB2C6%?o->? zu7sO+Jf)vnfs4Z0R-t1pY0Ifw9z<^-gnNNdG36^w)fuPo(&v^XQTs8C6EeJNtGddf zwqg--xKl_Te8Qqcu`IdgwPnW|A&pZE)pNFBq{IZ9xWPJ4_=OTnpE<&mPh}IA2(+DvMUU+?PF^r}y1i!6_U;qYe#kEJnwNNSz3=2Bgz_7yJ at lYrkMS zfwu`k=x?O}{AqH!w-Ll^)I5Z$dGxb|WcJ|)-z!wM_8%iR2o2TR27-DFSIO87YF-U$ zS`EW&620U<`LIV+Gev^aWjK$G4d$ToQM%*?sjmN)aulBE^&OI>?=OhPyqM_7$-{wndydXwM~ZUBpPxWgfPPn7p^S+R>Hj-4H) zg6-Tn>=Lx96zK-lc6OnaOo0`8R;7~@-%fQKYmbNc$ea)9ia2k^!b79lQmU!^P@>W7dX-y>;?WdS`anUCn5_?d z8*9pv8tgFajP-Q<@{qcD96{oD_E*6O_{58+;Jj7~c|VTOxXScwCzj$0<28T*ZO(sW z^9MmXeles%zjh!os59XCWx?*XrGrZtJwZ5O?33RH}aMj-!UQjfp}rP$H(Yyk)(lzVxsPv|5E8)A}^5nY8k= zWK|tM441_zW6)^fMa&mLuX;;-{Q=mQN at KoP77AJf^d9o{5a9B<^E$(Aaeo^S at CTGA z-W-hC7pKgKJBag63(N=*bKn9%5s`vxC+!IChPjEH#WZr(MAkQm+V5*f9c`#Glp6#E zH((9{*cGGBGwae`{vXobF-)_z*%C}u@=4paZQHggZJU*R(zb2enU%I}XQfqX&U?Dg z>6!0Lcb}_ge(h`j-TRIevEq(c%bj+!`Kolhso8cNL%wv}jZ at c&y{dpa2L3%Q@~XXC zdHI}zaqgY64 at Nwv9HHjTqk+{7FpqvB_uXfh(cpPC5W|`@(PGz288Q)-+g=pPV zq)So*>Y8uI#8b at GyHfbSjsp!Y=C=d0C}X ziD21H&+Ba(ab-!RdNk*?*siiq*;f1#@!yY}Z)R(|hzGtR+YeWXwaCpZ>H-%F#;Jo_n!BrlapJBeA5xcv$y?D zL{wh}3=w1ec;Lor4EH at m@1s;I4PCJ_H#j7(v+oz$D9`HMq1@Ho=5;L9tr)!|maC3t(P(&^g!OUA-FHP$OKTe^YV zBU*bfSnO6a*o25zyQwkg2)|j_T7AB$_w6+8zS>zj?&#%O#l0qB>XCSP=vJ2NZzj7~ zL7LbdB_N#eMzig{$<}UJ%ZbvXc#9~%}*aoMiQ#?c<46)Ch#|26-xgMIE2dP}@alvEXW+kgqb-1MLoOt48w zHP#XCVJRT_g!P#wsF?a}C1DGs at xkW|(EL}>;UQY6y!|(~H8>Cu(f^O2^PePPOEh#n zP}R}C6c)@g&(MtfgYxMu^E>9r)aNo)mZ-F#e`F#JZR$`aS at Ck^jAzQB?dVTp8v4#t z9!uxB(c3S#e1LvYrM+iolv*VTp%8jAykCA^-T1mZDSW>^&-Q^H-IYXQF-TZxDc_+m zRD>V&NXs4iG5Zn$3nLNl5`rd;UC3n+2;u6~nf1_HZH%d?+iUlLL0JG~he_KJ7eEyG z_WF!H&rGSAsa40-8k=@%fzNv5=oOF0#l;M#+2~`mcjzizk$~}eOQ1g7N!xPgL}&3Fz3G93g2dVXTF%fC at abu z;c+luWB&BVe{OC1mz(A3 at q~AQ3Y}VIXi6x!wi=kFW13Iwq$6Jf-S(m3U)xF68rudx z5&!wd4l9?sW0b&k0sF~6RI{+$ini(Yi(Te?Ke;+DY at B>peTv-Uv=T=>Nu+xLuxH1- zG`f(_DRLB at q&%qZ3xv;j*! zn~6t>KUqkyhYw4|C4RJF{r(wyyA<{-(My}4;GLWK2zv+TM^G|Zmf8XiQSWLLx=bul zrjEN#t-T(H_8T7aCCR6Mp7BS_XZnsDg#cC2);HqWrwnav; zrHmRA1i6r=73EB+N*t0mumL}s^}`?JsS9DPf?=%!T&HP`2ZYZ4ZuBfyudy*%Q2)@^=VZ2;=mVWYZ*WDe9(R(S84Hgz>RFn0?HH zXQg|dh!xi41#&l^1Ge>LIvzW|i~aFC9XhaC_Cgc^QStpsg% zIqh#K*Ac-oh}9eXv=vn!foWF1IT--=q+%Yf!9`6>gBnj;eZPZX5=A3|MnV}7s}-N9 zN-`N>s;Hi|O}IMBl~Q(UZG#$3YUCEM$0_Pbg`ONkA}~ zsFj)j;0P-i^!$bo1IA1$d0I%jzftyM$2!4`w|x4SY^>yj-5##Ie7Q|Q&4!4ik0R|7 zex?4_=YP8Tpe=m*wfhgOrojDIV-)}Mukas8YNxs>f#i>13#UgJk0}M#3=c0I4L=6# zC3nw8T2u;7YUX&9d%v=+tyR&!mvUC=ZTVz5UJ0u~9OHxy-Cmv-)S-|G91`sQ=0F2Px>^BEWt%iNo+36)O1&-~2Fq!sI{EDjR2!rj%R>gek{{4o| zEr*t!IO#`YrIqaP*RFK^OsM8byA?;UrdXs*tFwd7gSHj&i?-(?&Y>x!Ka*PP*=koq%xp^U$f4gwT=$s;+&_Rm&6}MR)mz3f#42na)JCXg(@3*CHJ$Z( znSiuO^WZVZLNOOZY$yM at a)T<-F!}xAi|)H3bGGfJXUzG at zWd5{16E=HX4ekHVCP0RPW6Y at NYChS_~Z4gUrA9=_|!iI$@SW;bm( zLvCVnBTs{-5jrCe*YlGO$D~1no~5Qsr?X`*Pp2JA=uLw$a~43!(e0nV?Y|}cNq(=s zPWUvmz~?L&-~5TD?=1fhg}#=yE#^Z*1g`a~-eP z`9$@rDak2t0rrVC9pQ7H4epU_8>3O(k06XVUj6IlwrjGdBlk#*&y`o!~){{V3as&muT;8{tsEWMz5UH)+f`VE{UhO zC?Tji{%uWOuQEPSlu{6;(4%M^OjkUub?y=U6*cDno8;u2uoHli8#DW}LXxz{Ys{v& zi1m!L4cYB5o%G0(`;)M?^h at G$6OA|Eew#47SAwkP7ukv3hN?Tif{%}1obvr`MAmsp zZp-n{EARLxMd?oDq19>Q%lP5;NfHIRkpZm_IUj%S)Zr-*j3&^imT@=ZJM3xlC^x~$ z`K3J18_P&med^e!60UP at qIPOu0IS5!BdBU zycnnHo=-Ey-4<;-G*gxI6eNA$+Xc~5jw2he|o3`fiNJ>Wm|kNO|TVEo at g#{YC{ zHb&jXWl;i+-)59io5Csp0IEaf^>Y+KA)gV2(~e1+i5Vd#hWdeeGm2EHIGQf3RIohn z9&{sPVN|Xx at 4bkpht>{HGZmH3`oYUt607=xstI~NCcTtLQQsS!$MKC|#Nn&l1alJ=2!dd`|{-_6Di z$k|2LRTe8Iz>e!Z`t;dGW`kKVdme8^I2| zYg{Hnz+o=%u)=e4e?WkT{B^=42QkPZX4}&vifhcVTP7NRXv^ag1mS0)sP@=OjYeGd zDB@;C%{4NiyN_r{aJN!#!8kQZFfBj+wzw1l0TiD`3q;|8Z<=no-;ThS^fQdcxqa!@I z3sw%Y8pGO#;rp-u+d{9l7H;lHfhYKcbaU}^%L>Ph)=2NqteFR5TlQSlw_z{5s`GHz z+nd|!W>TFw`EBh2h*DNJU`CRR$N;RDs32YVXkj}cs8d}TR87CooycN5pmn!2QLz?c zdqQ(Nx8R%VZ;4t>?e at _{XO^mATnBMB7K5FKyyWgNxr^b==~0_?W at -`llIv;WEY#dW zEawrY0S^PJvS|ku z)A&2S$_?2vt4zL_cjd4_uvEmlUekr|Xh&itO-$Ket*Z`D3ci0sP~e`BpI=`j(0Y1y z)@uQyD4denJ4cL~cDlT`8|F_-97~&YJTa#~0Txj9rlqkz-g;vfFdYEIGQ7)xly&j! zVeZD9GB0SJfAi#u}~ zRgrOpp$DdzECS6-=&rCsvnRk}t7MaG5(P!;8ZP_thXRRWM**T>s5Tj_!5$1wPfJ!$ zi>~QkDqo at RfB4OmYMv=`pJ^VH)W|KfKtk`|1x`MK=dPVA7kJs#cuVR9c1C?t7l(My zE0>*9msrmkld3`w=|4UY)UHY=jU9ajACX4|i2KfYIx>p%KYnCT{Kzx at K`hb}FiUn` zDkeW|2D1dNp$Mk%7@!K#eNbD*_j5?PyQoQ_<19bqBVs9ulj|>>ah*PSoY9Z`v>f#< zr%@7VD(A6!iSNglFe0z1OfR%{jaVC|L=WJIV+cc?_AaV!y}i}(00z` zlH4g4WF{RmV1Edgs{Ry0PFXo`M#IAIK#u~Wv7*c=HBV$2Zw|mzyY(NwaHcoZf7=UY zSgouEBt z_M6BkF`d#WK`bXke1Kw}s6oh>`A6CwO9buF9yy8xtN~C{s$1rO=8O)7!>?E3zzxMA zzMZ1q4Q3~Kj~;Z$XnO7v85E@>P#QGR#9SObzp5Jhyg|ZFrY29L)OD$vK5H>jpkj&r z&3vMmze*eIXmZiKMu~m8vKHgE#T at 5l&dqIu0gvM%N~Wg}d%4kkT@=hTD3)QCGY4Jg ziN)93*AhbCO-)U|hK3_F4VP+`8cwFb$i_QR*iFGwU9|xNv36Inh>%r|#y1K(=i7AI# zA*!KG)wk9e=h0|1t#TXYxJaflJU+pB+d=7CvlU-~W3>MD>%)36P)pP11gw?UNV$`j zGz&*PK%vdb9=>`6jT-Ms&#yaLjudksR9!>(tcPCeUmhErVC_K zfgPY*Rgsigvfsc}u#}P+sf__Y*oSzck5 zT7!koCn#>*nO-D^%sQDbGZF-c at q3NH2~YE`dZ65z7P at uh&*uIcP-r>_QdtXP4Ywtr zI6}#1X$S9YM)I=O9E5<gqvQV0| zPU0~7hXI{rkAfYv5G2Ac2ZqE(OyDRY at R5{WUU at g%F)^~h&U(Ohscd-=XZla>9 at 37e zF2tH2Y9^j`^XSwDpTBaGSvwTRq$A;FGBIK>%N8Qy*ew$u$siJ7@|G$B*)v*98OW@| z1#!rN7g&VSO)rX_o48Mwow$$BMc&`V(hYSpc?;@GH7H3Y08}(>2hE$f#r9Cj-r0Daohd8}{ipD=QGP2FR+veK*%&^_>5)Ho8K=wXs+@#2%}z!UT`M%2iZxAQoR zof|oo-Z{=Xx}LHBX7f-F-lzJq5Gz|hb$zx+yotdnqxRt15xGro+`@CdZq1!*4ODTa z{rVmU+sS=Nvq2?`@Of$Z(HHrGcDtVY{UaprmK^kxN?ei~psPGl3u+tebJxM2zYZEN zhZ3cnB&v at K*uzD^*&X}Ddy}1u{Xl6p^QaLb0j;8qJ;6ADABoaZKlQ6)wx1xxYTy3>!g60&Fq#k8*iEh@*2 zx^kfb6z#a at Ih~9ubLT+sPi;4ti23zb0gdtye?Hd);EiyY)XNe)p}wq~OllyQzLTBb zs{BRTE;NVyyE}jr<|FI4x=KXeH^@50I(NU!d1z#@hc)^eAj%gj7!mF6nzzj zh0hD^1haB06eYmo9x}GpzeQ;ThAPcPVEDUi62WynRN9qNGp7^$7RPnqF)O!Vxdne` z!@%J(7g(kppQHd{v4 at QjFyKvj+|-r2Z!b`U+uJHlP=BN>F#z*y8^Dr?309NyNaYd> zx6e0Lb3Q<_ew2W;_$*nLsK?13JddqKjkB_y94Bjdw_Umq0p|MiC`&w~fATP7_( zO%PwO%{iq}#9$A$Vz1eiSi)&Jf;LYp$c=C0MgYJZLhPKBI7$ViNz(@c;_fWuj!WC6 zDV)Js!#QG-hQ)cCCT4ogv}OlC(FbP|M-}|brM8q{z%;vEu!+VXbBTV97LOw)V?Y-k zI9eS-Hv(|IhJNXggd>){BYoXu!hFUIb_`?Q3DMT#do1&wAb7Onr~jDtn(=DrgT5vF z*97$}FAhco1_ILcPugHg&-z{LuaA#6cp>;WdDGjuA at C!3K9+=$)CZxxplZ?$LNUG+sc3 zxg#BxhHfsJL)d36be!jEnN%%0*VfJLoa#-|Pnv5lWN at r%KWg!{2QM_3$jjF3e1|UK zy|)31HbN;>) zSGye5Z_?XZACY7?b+3E1Xsi|UIlx&Hv${P;g3;lPOAKV+Y^%WZ64e#5|LdF!d0ZH= za3pIB_0-3`J8aY4>)6m}rH(aVCOi52Aq6oL)Q$BhHySrey;Q-J0CI2+xsKoMeEOGv z4kb;7{Rr*Zi|~wd?DS;k^z9zPsYDQ?9DpfG`=uKr2htRS5N at cw46Tu364>- zf)#*nS^$jFk)lfZ2&^t-ok(Gn>K0tRq}eWp-{YR|o6#-%PUJMT#?Kkv+bV(hwkK?>lP9^(wG9K&W84+Ftgqfcd7lw(1If zH&uPm1=C=UrBMIF at Co*>2QLzefHdTvL-!8&ul$Vvmk00PTSS`weG%3kEX!0nu+Z4A zY7K~jLbjx$n2UnJ*&0oFrPk!60hBzSbB?ariz1E4OM*NP3u} zb*O*U_=O_K4*gRrX73%^fN5(jlh&T$dTO at j3N2)f>MD7~BbUyeH5&8r+`m+%Mnf*Q z;LLxS#3)nGgSBd--*?$rPnVUBa};Tli6- at A#dhZQveEtZK=w*$GCfm$d at 3vR@JO|( zqqFDnUbb<38s#g0&`y-Kt^Eq?AFk^a7+Axkm-I99*xt%K=6T at TNXa$Jh9SW#{t`=K zdU=8(ZANz4ETY7PM4G|pq^b*oNr{cFS7VdWrHjlJJNFOVItN{sOEM$6X at IOWV&e%; z>6l8b?uO`ar9#94m45Mos>WpISCf&tl(^W^X at pVx{K;~EhJL4V%j3X8VlUyK118xC zERjR9D7k|ckXM%5Qu+jAyR6HC3-H`EW#gKb)lFhU^G-oVS(l7(u=GI) z&v-nthnAL-nc8I`y|y1{nX=I|R|&h_d^KAQeAgS>>GfSIhj%wQr_6R0Dd)p?8MFf#1uy->>Xi{tYZaUWj?@lao9H~!)|p9F|_OFS)Dn8W-qh8P;C8q%tW zydxky3*-GAzl*?Wr6vV-D6loU;5o!;P#nkLgo8Rly-TNO!4acq8SNv}9=b_}3eQ_a z#(&EDAj^I&+DDWfKPO%C9pW4`rVLUu5gZn7EHQxS6FJ08E*e2BADiy#>d%3k9RoT3 znrxml_QFt=9LY4^>q^7#6n$z_f8vQzGKj25 at 3S8=BPAq_ at W)$VF*DrUU08zMGRMlSkygbYxRJlZFyf`jewwvCa{V zkxiu3Vn#BTlzPUy0-=r_idjW7tVh7H&`9#PI1Jh0pxJE1n+H;7{AqO_+CP*qnd+or z?{F)X$MsLyY1t0W3*3aVs>5-3Wm;9;t=5DYT>@UB{3kxTe)5+hvf%tT=)XdnTc-db z=|7}z2LS|x?tcqyipJLeJcON{jlBNdojoR1S9MbYZFE*=EVA&wbVDjKfyn$^;;iC zd(9b^)l#$T&pofjEWvBtudg+d!arx9?&tZOn`aE$hjDEi6_Z&#(-sGhIqu$R*BEE|GTEi(ik$ZD8mFfTAhBqMST1nhK$nV%3Ax3 zF*ybjR%>}855H~tbS=YSURR?!GkNyPd~UKvHlQoI+^G6=BL&>edQsB(UHm!$g=Qd81U z1MkW_6huzBFM|7X()-TPy6_Ao-f4f_+xf%?<@Iw(xE;B{5Mj+e@(DW6H?amnzI-I+i+bJ|!Tltpc6YO`Wny^#1C!~%#b z?G4ekgnn-10cAzPWfvVH_&IE35!}j%;86%q`Ey$$awrv+V!kcRQ*i?!X4 at RpAiO7X z!YA(oz^b2`8E;6UBs=ulW=C-fhM3wLZFI7x5FEpX5bpJ$6kZm=l(u^7!3^xmOO>aFET{<~@zD=H;OHPl zWTd5HHJ1iAd)Dh&Qv~#Y%5t8$_3ft`CHP#aKq}5s1~3DBuvoT@;xR za^afsQE4DSWcfly=nk?hDRlPk71O}PU-!aQLU4p1Ac6y!gb%`>5RifI;m zEIJjRU7x2``||og#`e at f@CKd7%TEV#h-UU`^{%BadzT0xkopHfB$z4_pQyr_qiNHX zm at 4*|MMqQ3mmoyB+6wHftVCI5&xRl2l^sX0z$U%Nm$EbEA$L;LMZCxPbkKlQR^ z`7h%F4QrxLxslfDD5_ z%H&5^j;Ev9j+1KM&r+qk`-A9Dk>i1zuozZKdMU)n4)`%As>c-|wH3aK8wsorEk##pn616QN`0qF&9aA zTR&tGt_G4mAa0<7y4%I7@&JJj?Q*mpkM?@~?1`(0#GFLCAUMmAcL3>*G768q_29Vu zZRD97`D|;rGVkBgNs7`kGvtZRjM>#m?o5{hik;t|plvc7zY%FhXDPlM;eNIE8#1b9 zGj(dlY`GmIax{2jg$AOv2G8I_6jPA;hjfPJL)Cq!RT_L6Lho^+A1JE6Xvw~4k#^T5 z{3ZhGdEruH#t_B0*q3z|$K~feah>;Z)9r-{-u|av{^+#sA>}_&Mu-9eBKZF&(*C2l zzv+UzjQx!--AZDG&l{WcA|X<5V>;eI#2h-5W^4v1LUd~RKKrvF+HBcPU{aKY2Y;@R#TqjCis-i}6~$_CzSK}0&5 zXboxa&@&rl2tKpAMcmwXzmwnilgBB4 at WkqS1|Z(Q37f~~?bhFi6?$?-x`64P04CE{ z^+ogj?~{AWEh1~J%*+98hD01DGn<{duHhSM()e6Fn}T9=`->xuLPe6zu08 at T@8hZx zsU?Gwl&88E4C$dW7ZBc*O|N?90(p6D(EvLauPls7l9Q=ot2~Yq`$af7Rq;u7mpANG zJSMwEd=#$4t?W}BCiPsmSy(ZNdzS^PMUK*_jwGOqnxGZ-rK~`eZd0ep{d!+?Jti2A zbR5olcTtyDSnOe|9T#b;0Tq_m)h^o9jI;jH^^8o{q=ihYBu9yRK;cZsS&hnWCYgv5 z0yoww9`y#9-Bjj}B-@<=Uhf%4c#E~xzqQwyURhfTh50*S^vorHq?_wQfu;Q2hf;(tFaC6I5I-(MjzCE(G9dcGH7qmrU5h zEvXi+ at JKN9NwMSp<;WfE&sU|J>y4G9p2b%=JTIkRW}{rKnJq=Ba29f4OF;aS)6~go zvGLc;4mWQcGpE{V?Wm#I=IZjyj1;FLdSl6p%eWp`Tfip4bzxPJ zcX96C>OCNPkFmi80*8YP(m7J~U;iFkOIF7OrsrxQ33-I7U^3styM6Q{Pl^eQqnNVaHdUe z=P&EpjV5zbvQA}D`=7tLwwV&KDq at OvMdVw~+ltR~2$G!HfWp{YpXkltksQTf-=t at 1 zYE)>Q3ZLQb23VE7`hyjrfvNw5wKVxf at +!xjnuOOH at oQv@_`zF$UrWF!~UaI=!z} z3-r>oEDz+-chh_DpofBxEy>Qh0$bKO=vHM8`~L7Lu{`G@#3C$GQ>V(X!Dcw=FqNSj zX$0wQzX|q}KJ~j at iI3c*Lsv=gmAEt1=EfWZ1#~Yp%z>ZpUYGer?Ey6v&G*HhjOzBj zArJx*`~t-7d8sK{VL at B_k^+I|a>f&3m&f^{pk}pJDZ!hxE<~O$@7$gnqZ`L2HP7`N zY4xQH1^XziHTlfY*M=}7yU^DbYV&z%{Z}fET_4btbFGl}X+e{El4x7l8}q7Sh7vE7 zg!{r0?Lk*yNmhM)PsL_law)%`#(r~*qr8ro>=G+&j~M2o8yV6|5#tkeawM)!oTFnmFbH(Sx$_R&Fx!!lh^i0 z8Ij8Vx=ww1)|^A2+HgXzL~SlA+id$1Qr~ZZz%Wo%qWBiZexo$IH&pZd-VxjPLM>JE zR5x?4qiH%%wbYM_wyvg!UN<8f6YD`*qaC;)qFr7ap=XZFEC0PM*_B7*x%--ANy1l- zQU;uhDIrd_kEqV)4 at qlCtF1+$Dkz&@M=4l88|GknnK+J{*pgD7Awq$MfzK>2O5Bne zc$A8Se2BEeLXY91%Vc73FYk9l=U3j at BT<@|huKvo;L0t+nO at cAUXcl&Ov=_sgi0pk zy}2XQRGjgHFG8Eid#!1G8&O)-6omNIo5(3qx%lmHjy97tHsOY_I=>htsHr%DVL7gBLNZf9mX88+QXQ1tTng9Co z)Q5st)T^sJ>&G_p&=yoMi4!DKaaW?|AFAhhjgg{YmzC>wl_1&5(-!)#VKe9<)UM?8 zWBHMT2%Ajq^;cBX$S_y}BMFgMqxRs= zASxg_nb<9jIa)WSD431$Ivf7*_1id7j}9~s>s89n^ebSxGb2y-b$r at i@^MSq_srS_ zp-GL3D6?yO$IhdkBQ)10h2xx9!_{VUvW6(1hXbtQL44r=13@*$d&#j2VLBZ2VG1T1 z8bz(}ufukEWRJ1Ue5?kF#B6R**_qsY%2)6}2Z$d`!X{V;8|Ce?y(GRU8AE=Jh&u7q z;hW;y4-uNms<y*LLy>9iC7WD{p2vkNI|z%2ld!V3ES vpbaKhUEzbbU1KY;0`K3TiN6 zuHJfBRwh)a}V>SB*^epInuBxbNBWZ7P0T~ z(Bp+4 at z?EP+)EM}{qMXxOoFeGRH{RNwUK52%Noc at A8@MX!+{7N#eqM2|jGs;P|rl_stAw_k at p)a1cZJ z`2vkUh2#*mz1#HUTu<*bKJ$Nn*hw$4ka*8s zvZ9Ra)bChkD$6zjP>7WlF(M@@eG2Du>kZ@=rIxB!fH0L^wz;X6-KvUOz;#v0jX_|C z;*C8=O*^r?U6;g^B8Jk*Z^F6 at gEnpG zF{j2YN8b(pfmA7Z?huG^y>JLqxQo0cC1smRJn{`uIqGD(=ud08;2pg)PMny&Im!i- z+;GmK+wCNkn1*bqO at bXIei%{~z=*cW9%ZSiPWL>A+W1*+pVY2bN$$OwWHg``m5`ZT zYRT!OP!{)=YHC_XaI-W964>)t)6%+WG<{jI)A?+jsJwdIu)-u=!{7+^M-w7AiNniW zmrYE`CInjhJiQ7b6jL1C&ik3HI~8>%_FzUB3d_yISc~`QgwXIQy-qImv)Rqz5w8mylpjeI)s@=Z zV3wcMzA>d6uXMX;lnwIs!l4zmZ!ek?5&62hgEVk3Gv{cg!7ufdO{&_xM%u&4GN;M5 zjbOzm+$gT|1?zMFIQA-Q%%-srA>rVqZHLVI0IFq-BpI>aaF{5{& z7s2GCsH6w`jkb9Zz^Uj|G{t$jd=6*zZwETIsI4$iQPdmmX%t?zZ5~fuq(d*dq6$=04BvoRXSu(0W%s7z}PbwFSz1(d1zO?|-f(Z){ojJ+T;+}?7 zhg}B;d9lc6EFqK>A13q6AKK(p&2v$S{(_ at D14i4Oev%>!%_&w$x)YgN?x@{gUIh;I zk*iM$}ze!zYE>n>uTA8-5wyTGr)Bnky}Ky>{#YNbivJp|}i{4gzBDKH^QfSpZj7hO(gC$_kj_n5pvIGieV42i!4(s=hB-t+wnD8tG~rroPeVw?XoQA}8#vu1kRK8Cj_S`D$)0C#j&y^m#_M~vld%m*dtnBAE~kg4$T(9t=zop@$i^MaQ?)9Kutd zLMNwbElNuJLv7qkBQqQX*n&tT!KgG&pi&*`piwaHBf+Th#6hGrj-Z(s_M(Awl==B- zD#xhU6H#$G=+9wZL6TZg2qsy9nwiYTGyfBGQhh6$v#LGj7=Kh39a%}7JdjMIzKm8~ znYxQ1qhc{{XHYc|pPuAb&xtcQkyL`gij zT}xc>W^h}Kkt19}T`wrE@&y`^a1aJP?>D8oFYI%bXF%BOo-jIM0vcbCBzE^A4S`9g zFad!@E2XC=ilTD1JWXtvUI7{2)_JMVp8+#MB(Lpllop*r=_cOLqpkT!V<%E$Es4C` za)eBbl8nNqk;x}l+ihvg!y0-Y9uNBx_bOwtuOsJrrlxsQIyjccPb+4LV^Vt5GQT5Q z{m at H|NlCb!D)NW(Sgzs3bvrKjjb^1ff{j(I8)=F1-z?AeCk%KJ1^P|i)E#1gB;Eb# ztTczx9fyw($-+hF at AO&}98*~XsVFPrU>9s&VQ!yIt&EkT$=PJPZLpzUbf0Ck1^ae= zv%kqprJM!TRt6^&Ap- at veKMplysGc{eCy~xyeLy+(6On1ArR%0FEZWAqgE;&vg@%* z@`^75E6*`LL7*b33D1^Sd&K2rqg-k1)t<~c?k^RkbP15T9&5-+QrFEafoLn#7pY1NnkNCCCz++atMCy6uf~G=T`5x);|H z at Qp~tnd!k^mZH26t#i5tZF9F1TLXIg z68sqz_h9LS1)la~-pc38SiJB1x`j=zaD<+M at 8h(6 at P812w(i9rox8W=jB%a(WnJxl z1t0TLQi1>bC{pIsDj!-kW;>Q~6+qu4IdSP`%0a5 at e9|=a8^l at L)ID-cfLf&`;^&^V z_qD7p%;F*jeu1Gi)G1ul3f??tQm+`U}1OC7-DwNHyJE}v-&jIY=9_)Hm&)d z&eZTeS_^sjekNN>H%b~!#hv5Qw&;kXsw(9&GEZey-Ge<9H)VX1AM7GniS2J9SPyiQ zw-1w&(P-6lCtncOML?$H4)|(Prv}S4G{ymy-9CKzFte3bM$H6sw1uX0xYx)}ixMo| zG~?>y-~MS$DJ=_Y6N~vaV^(Nz*#p&TlO+WYUafyaYXE9bCNncex)#CTMBdp#R>LG) zk;_Zo)uUI`1xgni+O!@@QWwC!;cW*aPPs(qn`hpqRvsVjoGTciCTHW z7Mn$U_0}M8m44v^iyxZtsJ06GL?_px25q)y-sVQz?6-;`CHi=}$lR at dQID)@PL5!I{3i*bUjYrW0 zKeqyK7v-qkv-5FF zBfHeX^ec5ECOG!!QKCNRFyZ>?tAZs+Lrlj at lItyt*?CpmxjmK`{*+$bUo}g}*N3e& zCK%Uchpe^D-{5<81 at HVhjX{-y%ZYZO<>q^D;8OB}mA#y%!?ZMX!ubOOJLjB9hwkd3 z)mq|wY^4Tmot^fVj>v*?hELG95d*~(3Hb;bwKCio7+xTw7YrwkH$9N}1S#c$es#}# zt8kF1cym(-y_e(Q#98^{X2eIOaG>;8-BvlqXx($54Wcerq5GCNz~k_)gl)cXi8t2fDQ$dC<-y&0x at os9C4vUT06?)1c5uGY>UBJ zD2gYV){f2pK!7|-t_E-F1$8o3J}r!C_BLsi8YQa~fvB`#$|Z-%mL&8}B>Y?Lxt%(t zXfxGmE#;0l17sSF$WP3VQh*O-!Y2ynRptmSnuFxP at BR+k(B(T^t%>^B_g$~Zw|!Qg z-Cgg^wuLO?T08bA$EwV$rtNgT>{Z~I?N_#W1-Y10${hcUa-w(YN{n1`7KL-F6y7#; z&s_VQ?vCl4=WpHnx27~-+>)dOq=zE+N~Eo5MIT#T!Sn7Pu|0NerfVFX4*$G=s at auh zb%nJ at b%WdaI>qfNBRavWwp^2?B+MT$(%EO8 z_xo)8#WUn#cfu{td76kOSLN|k)4$TVXj(G3`}?;s69ah~^YkjJ>yF$vBTVDgjXLYv zR(nmZZ}OJY_4Qtvrhn)^--JD~z<&#agMef}f`G98A2}=h52=V8HC+c>akQ at ygUtr* z%wqBadC`KB;@-XLoYYpfi2g{NdNlM37%wVCREs0Ib=h@&%oM0x&jXmd5k?^qFJY1Z z&pq^rU;Tujz1R+mXj!uJ)_=0OT~2s+J1)Q8-W3JGEsJ!8u_w*s`dMWs>8 at Zk99x2H zJO?dTW!sepvcN*su3u&Lrl546k44X3S at 1k>uC_HlUDfwKwvE!yg&qgOc;;O%fkw#_ zYLZ4Ib35mfft=xmfpvV9!f4+25y5S|olV%oyfo5oTttPaV at IN(^Qh at O@#Fmx&9kS& z?D*%+q;us8d-GYQRaYpsu0GzfVdpbUYpQoMR9TC<%7$-UEGy=D*f|eENiCd#Zi4rI zh29>^KTjvyF(E{C)9lPDnM!=o%bAXkU&{gs`8@&tSL;fv?)G)=09Qd+)e3p`Kb42t zE7vf|?<`xZ?<_4|@|KBnbU$eh17&{PFXPDi$WY#x4{s-rkJ;w8J`yFLF;Ohpa>gDP zC1pcw8DLd<4yH*Lj-7tCY_^SnyMGZcCOM{!g7GPIHsZq{_HHbdI$BVwS*$~#TYgRY z_WX6~ME-%;e#m~%8DVVb`xy~9{#O;L)B|*0wdKYbqfJlkHaki+-JLo33`HZRTWcUQ z%FR`;J5+qcuT&%Tw)OY)w=QbzQgH(3BL82_s^7zXh$e5-iqVFyC{)-kTmKhl?-- at o zx?~GyW~FW0wr$(CZC6&M-n4Dowr$(C&AR(^-`m}1e|_)yM*mr3jkW&9jCf`|F=tfp zu|SJG%_+WL9?$Oi-rqEi$!5I76asE=i(rQI+6k$7RcU6#io#;S zHbCpZHZao1b#8ym76Z26n>k`Ue1Y?hU0gNHKzWFOvr}+O5`OV?6RUF=|Ht)6ej%IH zOZ6QZ?Buo~^YuMuCmM at kEu9u+$b at b^vb~>D!^z**pwI2tDUhqt4&2R~F7`r(cWU7Q zS%2EICAz`-ZW*lJr at zB(G6N;;?pis$0Yr*BWW+Rlxz#=}iXMY`*F`}K-L_Q5lP&PV z)Ul1J@*1jg6H}djz}a!_x|&gs#KxV~{8Z(n+6keiz$%$co2D_ at 38jWh<=5Y4JWslV z1p7dMfZW0V^)}3ZL!^jbHPKv6>cZdOg!Q`bQ%*SrmHwTnaV z%nhKViZ!Gr4d8uk-ol^ozsfde0R0u-)2kr|6ooKs at hj13y4beV3g@HtWHK#{WoOdY z<@qItKmd5sNGveAGujB%H8nME1VTA|$&%`v(nx-&Q~o at J8o$i5lJHE^FPBhdtp&a+ z-=yuySc^41*+LDkxm0lD*lh(`IED&yl`6rUarNL^RZ6JLI6}ORUUbVy4EZm at IOUXz zhq_bmeX6Oi)e2k_Lj2gGMR-H+lmamU%|7YJ;33c0B14ua7F92!);hsHAfDvKGhb|2 zNNhW?*2GIcLuaO3Tmu9h3AbXVpN755GC%o}Hn)h2mdHsxcHFe*YnyHKgyXCZz$G6s z$E=le7ag2T*Mq(hUsYT%3CY}#vqUy(3vE1mFlsLUNEFfuO_qMH40O(uz at t$UxTWRE zy(Xw#7w_ezLEJ{pqhFBwsS}hvwcKVq;yIE|hF{lmydHhqrt at ncfKN%~Zm<_58(Z?A z-XDpV#c;PxmmXVlFy0?SQ~hqfmu6FyalH%=++I?r%)r=3|4f&WX^8-OZs4Hf!Ms`` zVy6vG>3|^rjC-J9JKAkOaeIKR;llAW*^VVg-yv+cdDX139d^^lyPIvUwzYzAhh#(T zdIKM3)%s8-_xR8I{DG_0sT0gS0XS)>Pku)BdC_U2bjcBGEU(}WWOb}rV&TtvDLHZj zPXG9vH-ISrFW4j09~6>)QJ*80OJfL{1wZky&IqztTEi~{NzI_>{KMEcOl at W2=&2;a z-NSqYJ08c;A?e=mF!+Vk_z&U-`G*bnP|s5^ePiRn^mBep5BF+OYbA5dnP)`Wm9>Jk zEL0 at +W~uM#RDm}7?qLAr^S)qO+~MUT_E at 34Tfi(t{j_1|*8&%LD;5jF3_)BL at MAb$#@kq;Yv&ST z%wZTZwI*t5HCv-N9W{8mW;*HarfMQCKz4p5=Vnb?P!2ClPix!^oszPKmRg%D=A;U9 za*>8}FhlYWS~IN^@RoO4X^D3kSerAJqRbpA^8}(~4Krn4#n@=g3bmG?j=mP#a9DKJ zu#Jq(B<~%_;ZKfvlT!w0=#Be8${Na+ at mO6q+`VJFYp;N90iLMB(nZ_r(gV4U1_eQFl*e at BFUn-6OX>st$SIkomNJ_8OOo;{4 at _ zDm&>ZEYCq8fWn^#RvtWAc0(L5juJWb3@^ajbOqxf#sdt at ud>OCb9j#@ucPE|Gy?I$ z`g95uAS`4tH5VCUv2zoAuCletX;Vy{8l_rl^{nJgr|gMA60iy at s~ zOH@{XZdja=i_L1K8U7k6Ns@%tAR#+^ia0?Bvk2 at mUEU<*oG+L^2r at BA+y30;{NbZbN)xV|hG6 zYk2~~W{EsXz$iSixO>Vae$pS|q3(TXG5ZiJ%wb4GPa~bHGXPR#bKbCaX*W8xSZVCC zo45TgdDmPa^rD=JvH;>QyX(J*^&tFQ(}wX9TIU~hMk&B5c*0!sXsW*CwPyiyiEq^i zV at WYW-*YtDCoU?hh@?!qKM$N0_%--^BZt3FqR-;AWoRTDsocI_ZE;+l+DXQvtXJxA zlVLTIbl3rPQY%_x-{15oJYy{j(Xc>3-sJ!4g6F?O$G^j&OAEsHACnaVI`y`1xIEL0 zSksP~h7<0YLzc$ExFf%Nu?C~Za$_TWn-NH}+IWVb8o{9HT$Qygr8MapgPN^iSUCZT z(0HylT`${#*X&>29wiN=GWDqQ#}@xsmG#p7_4DR~KId~LLE(ocmAcxlQzTd&_DJAq zuP4}4HsrokCgeVqFJWlOoshl{z+#4ZGsN at N5r_b4zrZs(kAHYzn6sRDB4O6uUCB{1mH^<$l&-yBjA;~dw5_a at D;pUOXw1D$zgBf z^BwQ_x@TZuec8&SDwQ7$#PHQit35YZ&{>o%^skK%* z*)GS at Yb<$fD~0jkdI+ouWqH#AtNGv=Qj|4P$4{QXN|e&mrI7vdEJi55HPu_ZpL!R| z3whWw%(FFV$@YUDK^#z_5n$!*k*#JGP8|kOwc!Mm0U;6OWVaD5y7kNCv0zt><()q1mKkkaGCvVsW*KTt68WQ7HiNQqBV#|IYfZ@?61^VYdYNAbjp z5u0ymz}uVyF=0eUiGs1SKj{`-Yitw*HFQmcMwOCJwA*{Q;4h|GSJy^em!dE1v(qrp z at Po`B#98*wza$V3+50Q+OB%|d at Ig}~FDeMeAXq{)!$VI>qZwXwSDcQvA2X(Ht4|S4 znWv;TG9Wf0fAHd6ju!n;rjap5=c{Bl zdu&>Y0Jq>GuRa=$h{8j|xn`a% z>XfVZguc;2ny<8yR^b{Ey_PBG7IjE#XFT{VwAC1T#v=KPE5CPVk at jm_LMw;xC%PWQ zJ!hNk+wW;FPGOiMqu_At%-+!v*`AY3bW*o_HHxy4JY$|1D+kNMUD z8q26AoZS_Bj1X)NuUYD^-=80!=1i0%cGkx>E;2k@)_|2BIk^IkZfR#z7~o1myqTo( zsI4Qd%{_b#2WQQ+B_ksXyDU?n>Sds65 zy9*w+f>8v6YuV+}M|enT8wnR(71x=La^L)9?5AGG>vHUYAj z<*?Y!gx9L0MAfF{SQhFtFiamdE3u<*JnpTvxu?`Y{8F#{AKED^X8p05^}ZnnMHD(uGn{V}+^C zbKpyoq79Y9Xf&Z2juI>DO=~w%Pea3owJVaTNLL_P6U$s{m7SSTP>phSDb=bKi8f5a zV$8|T5s1A8XrFMuG#uITq3QbtP%~rTfIn6GdTwukz6*9qi at b?YH_4?@ZHL&!5}|Vf zQg(}=kyjPI6Xgzn-_o?oCnE79DT;D!d1xwS5^%&jm8En at s!|eDQlsUCmj6yI4z*S) z2tCV}MrvXm0KTMfAB1i1xZf&I-24H?Q6o=S5JHs}lX63?5jPpjw% zbNO4dG*rx(N#^x8G4>!bxk!U}dRS4bFw(?e8c0gDblqpLp)jH{;q8HzN*!V%Bl zis#Vrbe6`m$MfYWd54PGVlqRF`58kBYOEraBsiS(vbd_sfiJ;P)a at c`k7c;%WElt3 zyv1k-yU&|Xdv$rR%5O;9^mY%1pjZR9%BBKL8C0cVR`XXi at -Eks@_kXPJ$=RAzt_CO%15m^e+qC#)$XETIynsQ=sm5tfU{p@{13R{& z#JrTF-Kja1oRmrgOs!qn+DzH4m6Cns;m6vr%4D_ at R-BzJwCtBNy#<@;lP`CV7OgsU zoS)RRHsYVSa$&B$u_;{I6q*{J?TW>(wtrtQ>r0zzM(B18)wcPQt<|$7uFbBPRx2@) zE4ihMK%E2vV(Q7?bVTso(tfyF42G0K#}d%0jR|#+N at f$nOPibnf73Ikb%2ObMmY_a zIu7^`RMH}|(MENe**Fm?Nm6<|*!8iv#jyu3g*H1Zul(Mstn(D}vodOo#-r7bdUR3qHSTcT1U=xy^~?BD!=&(FM&`dNEY%?ln6h1-}Hy>W~3l1KJ at 67^-AprRHI z)lohz#Sw`fXE%r;a5L(}{DNv+$L=DnErdO+uovACtP3EPWEA0jezGb{9W%SYW$nAT z<(b?zO%jCs!ZkC2oV9twq{hF)q)8}EE at 4zXVNwm5s8zXMF~V@~fSoEX`O&l$xPD-D z=8SC+NpqUD7K$his77dtB=Ur8Nb|FVO`@9-#1dJmlGvr;O7EM*9*Yzy-Zm-5*Dz+d zVu1+{s(8`N^o+fV7 zjfx^yJ3#T$N}MFSV)UlO*#w--t$jnA;PMo5?N8J#)IoI4Ns4;Zh3U6j|`h2*S_oV^zG?Qk2?- z&V&r(jGh9bpWbZY=>woxhO|O0rHuQNWhM;-(|i$nK|~rCFJ=0nEJ~9`svSm?zWcni zv`Y4P*k#SW$u#K*%g&-=!J~qxp&+cARotMY%@Z5ZOB>RADGQQRRKzw0Hxs#R|FTm-SsK(d?O25y8?A zTq!Qgn^gI6(>1L!aAD<+v%Nd-o$dH>T8306mQu&lj61N;#2RS=rB!-|_(>NNX;Rk7 zGF)p5YZ1R->#lxoS!4w})mUHDbOjY8?TBElvoSokPd-PI>JC!X at p{F%PA;nT8z_n+ z?v=v?e9e+x%Ywhmkn7C#2UUO=ERxBD6TE$iBz at jek!L~12b+Rzl&DVv%`@mHK7wBi zM9)@W&w$EM7Ap^dgS(m&QQtTvBp=}Dkpu87yS0;TJTWfSTqzsz+9G-A(Kb4j7o!8{k^(wFjFl;4zMEvY7 zpqnv%BFdCWGkh{X&QrUea~!Snr1?7Bplx=qkX3#>-X_RPKG0-A;)|9;NRYcJUgJX@ zd5O2X88F^daN7vX#$+k&?}!;Rq=54Q307f-pw_vHd-+n~l%-C8Q8Alv(k}u}UmKNgsiF|%We-2T^1KFA7cT;<-I0Y_UAfdbL z(Ge`cI0)tWjX6CZIM$?b4RI%5v#hv at CY5?x>X{-l;%-xi9U_kd*Whd7 zspM`g|E6}JRB>0j)Vk>TY_Cm|)KH-RR at AB}1 at C^C?0R*U(3l`_FYgTQJa(j at E0+7t81Y*Am z8Wk-irh09u at Ibt6vKsHe1EYHXsRmRdb({^fKBcAwq(c%7PsWjOoKdN5$5F8vn(dq; z-WDo-U^5x02XykbSy~d?2CT0VwxdMVTC3&7ntl|WNXwLq+)~02iC6Y9Li#4PHa8&WV zdCU-Q&gXNme#E>2J>@Pv9Y at +^%z+o!!*13EvB69y*$OD_WE{X|k5!5_)9lETg)8tZ z+vCTl9JTTc#-fJED+cZB^n&}sG(PRo#Q?mzF*846Ceytx&HvfTT(dbd*R&FV-QJpZ zby*brU;A?_yvxZ9c@#rx1Tq4*PyWgKXRGFbca^oN`G>f`ih7MXFRZ8K(9Y zo|Hu8vLAP42)zTF+56q2c1iq!(zsQ$9!U)G5_MTfy-TW0fQ!9K69{xx8>p8+wgL7< zUW+hE{&Z!#8!VCXG9ko-Ga%ElQ$c=|>X-E7Ha*2w)AB>vLGmVu0#(S%&SiKE6z?;6 zRFm(G{zg}MYNVY_E)1<~$|XJK<%tnO5K at 4d#~h9M`=yPJ9EK*#4V(GqzPqvE)*!rj`0dx!D>_S z1?xBXpKtZ$FTvDKt@(95B#M5)s$ zDR~0u8``=~S=^7vLzE~&RX--i{dW}Aq!_4#8>o;jrBgaZe-n at n%q2twWE}+E0jQ+vVW>>k;w8tC5rq`Zy>5O566X= zHHQ}diX|PG^$Tyxr^FrZU%26dix8VvqTrI8>cIKj+6Jkyl!n7Esowdm4BFQ21?oP{L)z$(Gj6lO3vQdkFl*QHkH<-$QbtvA zMTFD_qjZ(B%s0rcN7p#SqB}0_H^F5Ycj7NNU2Yek83oUmJ(-!bf$pEL0tp)tOz+~m z1vf13{1o9BoG~ewB}rB^pi?D4E~Zk3B;waXl|Rrt6bIm~gA|hot-=-XOks41KnEU+ zdU{{R;`TW(4ALGu!D`P;@Mt2(p?%_(OVzGweN6dG3s9GHxI}vcDI)y=LJ0iayhJEu z#F6P^Xie^15>dwB4X9kpdl5X{6Y|Fitoa*84;obbA`-I7teF$VfhzA0thIO-+x0S z3<{T(_+N-j{|k}a{}V+1M<1?AUCLoW5%F6;p4{pj9ecjEu at OvIYM#uDCKw2#%Ijjp};Z0=3 at 82MteIbH?{*EZd75q>Nc_kcL;5bSb zPkv0#8(o)MQyp4k8NTExA7b1Myyc!_lB{T-o+>BTL8thmOX)|05tJ8RFEk(WvOc&+ zy&k=qEzY)MC;e-|cCNh7*Jy;=v}I#GQK?Pe0`oqUP0Jy%dZiiCC(kj1NN8i}(3oSM z=f^3t|E%W&si|`(keAN at Q-j=1 zAot=c=;V4;eg2jO{Wp;t4cG^N+hw(`xi@}0Ogfc4nsQCR79L6t(ke1QQO;1RpIIIA z{Rc`M<8M9KHpYeI*kOFAlse))NM|VBxZ3avWN1q0OcB_UZ!;vU=wRAZKn}*lGTBzT z?cF?F!a_+=b$IncDcKRc#&tE$v$qWGsA$X23wHFEZD${t7yxznFd+?eOXcR}CGEhm zLo?IiNXds;xUfcPo$v zq9u6Baf23*enRC58&!915Dx1nawf=x%0%XiPM z7&ejpN;YKXlM=uu#a}534S$8PwSDdKad~}}{k5`#K=7kAbVf{ezdn?^+O(D*0A*`> z3$L>?MI0uFq;ZFzfPMMkhfcC;JkMs{I$ek$3bHero7UI-d#>5s5^rb;RF>^Iu?DT} zeg&AR$wHomol2Tak5l7Eo^9m_7K(r^LT=fut{7ZKZ=l;A4Bh1mn at ek&&! zTt|7m+L<>u-SWL~st!oHHFaVtwwe~zc^5KuXB(>7G)9chOT~NBwuxz_c9I{_wb`0& z$G)i9+%o}*Kh*EFjY}puTad3gs?#7|4T+)n2)1+k>ns-e+>^>uosWa>rfk(>b(%ll zBga{F!+vEZQqGE}$pQ<^63C(XawE|qi@=JV>7t1tmVatb47cQrxNqC|(K{_kK9F*; zWXxR%bC-3R(Vybh)ZXo_X~2^Y!9n{GZQSD4;PQH9rOl_a#O}&Yj`E|y(Vs~&wJ!wg zQnEEn2jm_JgOn(w^Y at z(xu7sG1zBgPF*t!#Yg7yw?LmO(jf+x0MJw4JStsqDiZA&d zTj#WI4o2c&}*m3eQPONY3RdXg=%WH5-6_V%G#eQvOZ906*hA?+5 zSl#^(B4(m^x#GvJ2VvQ_sdg${pX1})Od<$}(f9mhkq$}12?;1c_#}XD^m}y-Z3i>tcFhq35_ at MdbsiNF z;)V) zOC*={yr=*D;{ZbDbBnR-vd!n=ti6Jd&BL`{;e)R8s>)_D^%DE+B=-A#M)<#4+5aQk zh&5t+;(-AHg~R_Vcewvcw)rn!rW!hbB^uOkQwpbpP~FQxayjWAg<&ogD7lI34aj>$$GjbtPJO%aN4e#o<2 at qm)&)OolLC-OcvFwAiWAxTui0Du at akGF1>ivo&Dx) zu57It)y0KgQbT at 8%}1&?ST@$oCsaiTg!^7R4fl+uyuDt(A{o_1h1#kyffBpE&`zp& zynAa3-bbQIa)Tv55i1+0F83llZH06~S#r-;2ek6;H=Z-~QAk&ZLC7 at Tj42-pO&=y# zfJ7K4j0Q2wk}lF&@f5eUDs at Vkw63k(Jk44~kzRc_r<;mkU}vtJ&zJXG%z>hx(uSQOd{_~44QAv6IKDbGk@ z5Y~LH7Ewek2wr56t8)~*-v>*E`1uY=M-Taq`kq+5j=Vo;=(ZR%lV>@KlyJemuxypN zGDQTJMk+bJ%bfagHc^eEFu${4)aL at wrEd}?faHD^gcjst-{gmtWi>%J-a|SOZWc8& zGXt|~>on2$hTKHG$2|-(unNDur+>iDEuDMwacCG{jr*bmhd+S%)r^@>z<~7Fzzz09 z`v<$&p4xu*!-a>=#niqmzP6DSikRS*i ztDnLF!s$Sa=_>`V9FIvf6mK94kO3F!YPi1y*ew<%mz-5d+7&oA{sT(X0bGe1imeZXT#1OgBf? zJxKmLW4i=!ck(`@^PccCE-4F{@`e8L>jeqNuIEaA{*PzG&S#0E#0&Dbn2hoWhysEN zCX|`6f7TEIK_i6z51wNffS`~GQ;beV-NV)hdix~jDPJk>Zl7M`MyS^s at RbC7$9WgN zF)G&f>_|GJpq#YcfkV$8B6V=AXdAz4R`vG~Q*=Y^ zT2?(>CE#Z#BB@)$tp at ziD+x?L#dfG9esX&`A!I&%} z?oiEqjK()4JonCq^!~0D^Jefl>k_Vz6oHNJ#zcMB2wk@!z1zWliGvmXxiVeVH`VpM zI;oV!!yBRMXsbV>w$jg*KH|lFx`O(p;ER6u_nye7Pp4 at IFc6UEU*|lD|4G(WHnKN$ zuoE&dF>`VG&kS6oqW5pz!j>U>opL&~+aChZzy$&Jp0`3RR>IWc2~p(2o;mgu6RZnZ z4LoFf7H_8ef&Z8hYTXFd#uf?Zz1(Esu$a!|@wmAW5cmbWIwX!J#(RG|IG}<+CtOw) z>5SLEak3|v3Hj?V at mVCPoiOrpHl`}7=@ARQYA?4bGIOVi+$~IT7>pqr5=L($CCIxp z@{cRJDp`}R$Q1MOw{b-;V^(loyy3LnE1mW_-tcOA9aj%>Y99!AB!ZR8r_OI zZ8K{^w%se(T#)jmD7ntjHlIm{E)QES2y*7QBD>bRZE(Q>!_2RUBK!AWY|K$YP z|D!5Pxtje~GZIyue`un=+35;XfQp2B)eCjQyMTaigolh;CmB_qfWdP_I#dFz_DRd4 z6~4)`knn!qLcA8>&J^1f&T|{xn$2W4>}20;xX9l>th^8aE#I;FbB;R=*3u>?k*epB z)dAeq4qz9SSiY*Nn|KEn%K;a7o||)g8*8Sa1lVvgFWT^Z z=HR{556HmBXwY-2L>nVF{xDESM-2%IX=FwF08n1Qv-vv4odB2mA;Kv+? zYGEBBj5-)4-8hf;nM7Pisuu=^%K<|Mjp-DdT=NRD;e{3MavU*kBZz(!m{0O>DMr+i z{TCQsScyL-_NSxEI_N2O8x(~%hk)Ns>#S=cUmV(%-D^_XH|oxFv73Q4&LSx-iWPBr zr5b)9bXXI6cTF>{&6%F7i}-jsi`)7+rwuoa4Otd3{6)~o^3Et at kxoM=pvs;d^$}U- z_)g{SJL_AVxVoQWxGy)RdA7=M)C+DfoGe>1v3EE`XOuCp8>l5wBM;&NK;xmsnaB_7 z0w`8v>>#xxl>YNEt~A`fne#@hmhu&Phr`!IZ{_7zbHDn^g3Dx>oGwm3!EqE85n7 zQDWZb;YZ?rE$%Egi`{(pCUX4&u?}3Z)$415C(fkCXNtz)_N}fS_ z6U~Dpx0EA+uEou_g?D0)QEL7z6 at Ie5lDkj7d$ZnXOaVz|>aDm2#D<)!9ArJwE=Ie! zA6;rE3^}QI#!?vLkD7-|d$T}eCm6!NfHL-;E$NeC%qo)Ah^`e at DQ!h^#0F zW=ZMDdc1W$+0--rJofm5CU6=_cocYG at rQE6Dxp8giM!!r`?_Q1p;N$p;n(-i zCyd_}uk2A+l_gFPPo&rKM%Xw~w&8F3=>Ud#%iRfB<5%iHDc0a7GJqY^CI&r1yl3j* z3M^GtMrVO{rcqhh+LrZ5GY@%9{8|%Tx@>}tzFUQbH(;Vm4N!(xU{a<(lSfhnDPi4# zQ(@yuU$vHe!BuYL1slAATN&c#YRwgIa^)--Uy7BySH)zDRv?NZCssCuShK+m#=FHz z+r4$s+}2RhET=ujZYRg4Q*IJ^W5{%khe<#1K?J$-kqIk3P~WP;p|)~#h$zU+c)ZaP57vdNhV zfE{3e>g6)Kv-qhJAQi%!w3m8o{-HClX1mC4A5~q`Rh*j9{2=S*I&dDzi^tr(>>0_Jr|T34})qi93d-KK}y8A8kFsg$nXM>R>cI#5LVjKWQL6*q2uQDI z(i4O7DDec=)pKu?Y+G*hnl*sB=9NkQ0bBJc>=Jq0a3s(-o|KaMic at zInvzn)^@ba^ zW5ok#U^PdA(1dYn4zX&EVYx&)w)zS{@OLp4((VQ|g1U#Ih4rEX=r`nPM0fgz5g@}n zDHA$o at dnM9z99_$f+->$B=#XbL)#(BHNezHQsuuC)27)~2HJ>EBhGX_0*mj#@B5P9 zpMJwP(u6`)%Kr+^>l$*b!8LCaM&C;KT_LyH&qE_zIveX5wn$V=?wF{7w>t&s)Y27l z3+2GM5ARBfeJPK;)9&3Mv5mXW%&o*F=JV&HGWteLTLtpc{>_YsH4Jf{1_O2&&>Q at O z#1DUdCNmbS>?}g{8dP}^S4df)3@;geCr*`akCvEjvG- zq&@!KrYOU|7(XIcCZ^dk8V*-F9#VcUQm$@st(>uP>eD)9u)9 at Y_suAsA=5hZ&B4jN zccD9Q;@lnez)bP at i|{Mt3t0K at 2RG2P&($h$ARtW)ARwCmzbWV6(@T@)g$9ZS;vYRw z^nU12UeO|BF*smQZBhOF)ckqj#^0}&HXXD&nsV+|^@N%>J2x*A$^4BDAN-95iQe)G zA5A;&3Xe0EJRS+Q>|^5Wbw{}F&(m3HJDY7U)04+BJ-^=21bO@(bMcYB8F^R3+l*fs z8Fn)vz%&tSPyK&CfZ#vnVq$>ulJDk25aVOq20;{M@}CKDWh39Ra@Cf?YP=(wXw zM+k3~j{FQ!Bq71jAhfRvdr^;?8QV`yFp~N<94Q^K$whmSw``@C15aJ`h&|6nOzvs}LNh-> zXsLvN*|{yQpW2<7QrS=he_bK&vu7 z%XpCSI%++eWzo>aIDaLpBx-sb7Jm((^b at 6Qu=&yvC-eO9r&eav%@nyrrYC6n)=&i* zxgWpCszX2=+;5k|{qE#(Dv8frycABZON5nt76<*cdR9L(W{PV`$0th7`8N6;a1AP+ z?bkWdPELUoOwD%J5n`y{<*>{+S+7nO7`lVxS`;UcMZzg#Wo`Ghc*zaUq0wdHRP>hG zv5a&(X6*16RC5d8Cspl$zS1-UW5ev7>+s68Y<-)W+@&K z`cgMIdr|IV>v(C?mW6=HUC%D`6nNn`I-AgC-wEObL!g9^yvpN4F~bqp166^NUGc;I3MGhtuig1FT573HZ=zq&qdE%X41UwPL6}|qdxBWvx!E-N z5Pu#EneAv(kdu~9oIy8XC3$}e?6%XQW+j>N<~FN2Jv!d{No{Fc{A64)Zn{XCg+vTw zJiy3rDkncZFD-DqHSVx~VV4}XQP_v8fI-Efoetu`Qi88J;7{1-!5ThnhvlMlA`;!L z-avZJDOrrBVBXkc-jpgM*ytdhXoM35w`4et1G~lV&z!g(*~B$hh}wV3Oon$P at r zWAO{LS;TQvOjzSl3l=;XO(NwFh(a)>ShE|A8~@7OmI*i9>`|;WhAbkvW?*ixGNpMb z8>MsO4&_q at eaXDIJ?}FHQ&1t)qgu6KsI_9soH63=eXiAkvdeSzrm}HCk~h%!Fkn)Y*cf|idoQ5tdhj(RJ za?OF~6VF|V%7k45{Xy%*=jr=}Ruhu)3MPsZ_8!W9we!mG&s9$|o?|fUFFJ||@vl^V z|GeYsZwyq$P60&-(XW}0QWrr;zdQh%l7Y?vf-*nR5E6BvP>Cc6!H-F%BbjW4$9W6n zn?m3e1J3Us95k|F1>Le{5c!Llg@@;3a+0N?$M4T8lpz#@Y^o;X92`$HCwi0Sys=gU zg*NY!F&V&usdD%>GtWh at UD=LNG@79XJ$^H2D-KWYmMxoB+Sp7Klp3Bjj6+o0^x8#8P z^gL>A`GxrmF5r?HQUbM&ICjsJ+G9|mRZnTYE<@SlW;}mFZK$Mo&gREOsggb=BP>~k z5xhslb4DOZIe8USgwlAtW0E-~s$dLMkfeP4{M?<0zTZUz%9+|Y at X<{fwnk=Ir4FKn zKZVRsT!SFkd)NpmjI>9gLDT0Lp~br`M8`fs_FCsd7jm$E-^=uLMMKp#tG>-W+luK6ieFzDX2 zutY|C_yD>{$bd at avNC>WLX^kK${ zfEl?cI(@52ST^(JdPcsXXiKGL`1>Ix3@>KC(& zCwT*&$?99i7AcEwx742-jY?y)0m}2{e#7fpvq1LyJ$-W#)>%}Opx(*LE#Zs^pMN{% zWh{+0u>Sx85{LX(0sn8#{{OzzSH#TL_TNOU{~>Et-%wsqMAZvPF0RVU4cJFpgtimX z4);K;LTl0%qTdfLL7ZM>{71(n{N_7m`ZqWKE3jW6_dy`SchJFho+J`@y1V!D^fb54 zmCN&*RL}R at Cs;2dy0N85a)>T26zs at sm@g~|C&37qZsY+n{lgXwukO(*<;d`AN3o%9 zADn-wNe{J_%ze{uN~p^Py9V{9^SD)+DOv0bzd;}S*0Iij03guCcr&RIOY3SHJ%3%T zmWs7-I}O=1vKDI{Q(2XB{pMZH_3_MR%W+es^yA9M_<;gZPIFBF2fZUdnyWJv9|I!& zx{Pvem#wCAy}DjvGy)2zVzb*+<_d0L%|#z$2}3Lb<&lNACC%P=1l)YCt;i&Lg`~r< zpW9!>)wOv3$n2^pnT at R?K1*A-I1M(9jXL>w33uL7uIR*^vUt8R-vIX)c}N6mw6do@ zi;deMF9}RU^@(NsNIQszht&Mcj2yc>CJCD{d9l-e_{=(+L`n;szWv8>I)KwATvoH) zsso_rMc8%n93P&Ms_29mqJ}FN5^le#?gT*w_M*Beq1E>TEg at C;R&j{cT(yzKRsf+P zb^pzU8sGms14f$)ECy^EOuMpIkrB-w(XKV1#P{1bz_mPa+a~1etuZ4Hm04p|EG9XsYu*Qv)N#GK75tD2mata_tZU-F^Rj>td72v-zUhUR^fV0s+(eEG#=W zMGzBjQ}EEu5h3nuxBG#PEiVR$Z4b%Yn1JktPWTZFI?bOgbn=d^(UhM!ajY`F0lF^y zmRehY=pHz{4R9LGpL*oDOe6VwvSH$GQ(B!eE zXl;G#cU4jHmxE3?gBV2)Opo2A2^x$6vu}@|Pk%OU{#8Wa8b!t1GdE};M2Uzuv6AtW!wY0S+KbI&hUtCgZs5u-DTnu+rsJlFWGMByW zz_rzIR;PO6tJnk_7y)zq%AbRscBTQ>UXk-z7aKPOA?R-KWvZZh&BK#Fe?_XvsH1t+ zVwG;NpgEimpt^wL43OP$f14OZEC8 zNC$Z8DT>+786QERlbI_V3Jwp?gv^5-60T?!G$R+>B-_Bd7Xi4AH0!F!`qnG*F!ap* z)VX25*wX)*Q at BiOXX?iYH{wcnp!Q32Ehq+ks+0h72RAg?wJ*eu2a&Gtr;4W^Ni&$0 z at P#MJuil)E`jj-Sf$@1vqM1$q1F&YBuHF4!obyIA4>wwomAZhC#cxlU^crb>xe+$o z+3qL_^VN@<>C#n`)i4#AArio+*ZWwlt%R9n0(w4J7UTw#{Dex1O7QLO;(iu8H!zW% ze;ihr(F1{BotOZ6(lu at CiZ8s^C?$aJMuJzYb{=X?oV5arZT6a`%l6lHD{%(Q)sd;$JJ7?d)nR zj)9EqCDmf*9B1-|EFX#GwqgmED8z5lR4-sM7BrI|8pUXdvwwWS%+CK54%2PIkMN9! zSYmrvMH8wHBaA8qa8j(eVUALr)h4-q{jGTP{9+=)0R;m3hWb~oi~rw{{oetrZs3BV zhWclVbjrR(2gkAu9gP at VlHG0ryb#F*(#+e!8V&##-c&)1n31faZ`{ZSroW3SwV)K#P-nzgJy13kX&P^!AVs at _m4dkRv^Gd9L74`f4>zYtRI8wdAT{ zXgf!wxN-EJXrA#33)@C at 8n1}yRQnt#Lt&k%CZJ<7RvKJIDhZRA zt79B%7#c9NlJUgs(a8b`1nbDpAlqUZ+_n%8Qh`;D&NwFbz*_7ybE2>~j{+|VToVMK zbaTJ)w(X2hPc;{@_{S!P(H8|Sn%Z5?>S3&*oE9Cl=U}%2WMNg1JcGmeB-gU zS*??=+3}E)6wO9olJu~5B`MPBB~E2x;SOYk;VD$S?n{hys_iusb4A9Ip;TI|(`1h9 zgvW}j<9vr)j1;SQhDAf8f6_Rpz1aco=m$HG?y)iMqGGih?BAG;Iy&j3*G)2r at M!tv z7Lpr~*|B;Z$qWO*E&yINNFpsKgC^NTn4D!yx~J5u(rtU(-a|$BufNz-*sqFJ_9_6U zJ$2DVT1Fy651v9pM6%H3l2zZdS=p%?PRLSu at 7+Q1K?s=0LcXeZMAhZ306HjwvRBL% zEcnMoogoV0a~0dNStWHPq~>zr|HaumhF98c+oDxb1v3 at fwr$(CZ9Az{G-KPg?WE$Q zV%xT at Ti;%5pR?C@?!9}j^JD&af6nJ=z4z8e>tnRg at +SZb@Yu{D`K7^5w^Se?aq!fe z@vtH(8nqZzTUciLUmg5#*f`xJX@{?5rj0!Hjc|Sud0Sg+0gpJ90NO>`+6d* zB(0foQWGUoDqfEQw7LqmmTFNW+YsN4Ig6~!GbFk0uOaN6Y-C4;zYQ52hC(m}#kD!o zSd|*I3UxwMMWlSgW151m*cxDV>3Q* zG&3SUeh#b1tPV`!=IQZ)zdE6vnZuoxz at _KtL6U`tHLtlnb5{zAE?f{az#LyF4R^Z| zjPeZMAO$N;dH3rL55iZ at -w_SF+4H=^-=y((M{gfr=Fp!R?h(x0quM37Pd0j(5iv#Q z%820Zx}Q2*o1)bQm4>*-ZG8p4vb%p%+ at liib?d{igNyIh?-nrZ7Bcb0pZMq}e1$Q2 zXh!R?xRDTnvXGAVb$F3t3ecF*DPR#&7Ir at yA}ir|IqdHcCzI$ZY~4a>UJ2uXpnS{2 za|)I1B{b9YgsbqK-lYj8W6g7qtVtE?jAG-iUh#;0 at qm40;R>kVNE<-VjE-&IMeZ5x zkB#lSKBAYM#${Lz58(a$+w&`I=G`t0e_D+;%$F|=|KnC;XYFER`@iysl~z^ZKccLO zRuNL{r37b}3V|;mDa6EuEHZ*n7V9Ze^dv!dh|A=n_)^Mo63-$&$3mP+kh8LMa_7>% z%Eey9B25Cb4vdXMoL;VvXFm?P+QmLzv$K6c?QvWIeJyxHkV!3fKlykO6vBx7CwHEZ z;daT5H2Nj687dsdF&DYRjBpakS%tkP64SjuQeM4#inZQqX?8+G=rCyK0F}#AQZG?A zIG|Jv!YJ#k(Uf81Q_V-{$=*TAGcE(#bH<~J)IhEMv}y7=*!(IAa6~MiY(NnOOM8ue z+RZdjdp^P0EP+s{B5%QE*)|Qjud~W<%&r2B4K*AqeSmBBu=jqcy(}@yAmxY>RgaY7L7~l!4B)ZlC8_o|f50g{tK&hxZm2 zw5(p3!r?qatOE{SnmK1XsZ8O~66hhN#UClOL1Fa>6M4qT>t*r|Ji z6jDv4Xk|$@zgg0U?=4J1)FO&BlyFPlrjRP*GY?=$h-2ffzIVmiLnV`F_oyJqVc2#F zNZqg-AsQ=-%n^@maVGxeI3PLWkG%r8KwTQi_E&)=wm(#3O)BlGO0u0Ll*J2|)mKO? z^>u;4!a{KZpyJtMu4trzZ&vt4La+rgU?eyIawX0zz~#C#n?#6HtEv(;6%Uut;)rH) zvd{zHnq;Kt?164z$b at qqmmI`2MeV#L;A9A9jWdjEHoX at CZp7jEDv_Naqc37VQ zR+Ua&Z^Wr(WfTRKX0}e<3FG7a%Y~ z9q~PUb7T7M>BL_bUtT?`PXiu#5Wa7joo}B8S+6dT at a6BBSntPr&+z>U-VpUIMmNArz9~NP zS!-QQEaf9`>=gp_iPei;g5IanGFU9`b_@&G&fx6%LS}pe7C^%Z;Vy3wHerG(B>1(y zHv*LLkn~o7)&sv)nONc%eCAg&^1Ux^7TPyI+dpo*KE?Jf<6MKC-QFeJc68VCzJ$}tmaza4Do0lOTs)YVW3^3M&=hpPx-DX%m8Mea3huGXlHq9egDR` zuoLBNG5<()GRXh#y50ZL0!3_{9XjEgn+2j3Th?@enk*K z{yo6|HFpW`h6*+nkyIvySmafe6ZGh*@7q-__M?`Lej%asZS)wTm`VuJMx_49Df=r_w&}YoR$p&HP|^F920~UB%$B+5y6EXs zbLV+xGTk+QVL`|TTBoIDG9V94V*{5fEE5$)Mkz5h!~W>?IC_ALi;`4RrSe0ff9?QN zk^*gNd6AWxV;WX=2H6_;`rNt*(4$lWz!7T(X;L8+nafn3zT(=dJY`Lnmdj;T8WyW& zo!R|52yX{8sNxWdRh? zCNn^@+CNK3^6)skAj;t}K>k|9&Bnnp8{&+0D0`GNYbp4sGog>7N~mCx@}Uf!Wjm%|ppH#IbD< zL{wOUZPTDYHf_#ib8y}->06a4+qo&rxjHtdA%rmU8V5 at FV3SE?uMyEOX|A`nXe(Uj zvHlEi2pnE5iMV~BY~{~r0FRqB8Ze5J3U^kGzo1$$r#w8H_$M(ARbAlGW;nUdu}^^w z;ZOXLiM=Hbb;m1gzdbjw?pTVD*E{P%ez2rzxwc^!e~+KR#NSS+1Ge-+3Hl*pKriF= zy3B6?XMkL$hBtnyPB2=0 at 6NB?j=L%u$D=+yk~In?>g5GbyQWgFv7MoHtxve_$d_n2-hR2uIN8W6=%k}lYuJVDD7_z{^J_3$fs`Jh9L*oR* zHHPA%z5&vf9Ei%x at _Xs)5#0Oyy7$Acaz?-dG#-6$ZQW&&uR{z9r(q#n`5<3#n at 6z0 zcww`K+IxQ>04D at SkKNZeM-+)7Sr**}IQ!}isezuQ<1s6co*4wI_C6n;>_=Df&x~WN z{#Cn;nNx|MMD!%d17Cpi>~X4zGqPuVhWakR=XmIEUPF|%EmUz_%ZGyBuH`6F406@! zSX?usqj-?3%QmioQZ$ z)H>9FKXdJiD8 ziCW__Mt(TxW=5^%W`_V#FF`4)3zLK38XIjSi%iV1kD3_Jx?lq`AR2SbsieJvJKy*c z90OQ%q*f+Ex<}yBAkk(1N~PXyT`U8Huv%+euK$%uo$Te={rPkQ`wJU)FLuZV7L&B! zR#8MHe||1zAOUExHcbzzB%(7wEz|?mp}W}pX7iEcrvYevO2oo2PBZ5cXzoG+7U;t*;*e|giWZXXb`Fh;lh z7Ikj3l1ueLrmt!|Aa6P1jQ8x&(%fSNv3}!&+r-Tk#=eZEM52FJE)SLe&hY5!JES8+ zvUFC###t$9R$t5LB0v%3AZ}3B_+a%KsdG6{rPhp?!Tt>EHq^YUJFGIs1Q2(l zJXHR13;8g&!9uK2#D9G(wH~(Smf&5anGdSNDX6y^wln2w`1|aWaz%6s2Ipf5C6fHJ z(p8lGggmbxKLQ*F{3ziRgVSz|fq%$l4PMesh5AIjmj~q$19c*2h~Ck%k}?ScC|9cX z5CU}ISl`3N!{!(k#gscKI%nq&i+I-XY|bk7RoL#=4S3gt+bmM|fIaPeQs zEoxmL~7xSm`7N3Xhfg(BHy`adbtGiAiARnMtH1Lfl9qk?a!y zp|D8E2pn{aEIQa^(iHD at eN2tqApex?b6#6E!7FRBC z?|(8ZFICJSIE>O3Uwv?+9R2nN_P0A6{(>Q at e^g)$%)fI+`X6xq-x=$w|HxRsh%=5q zZ-SC9F>IVKf=86hsWyin_=1Tgsb!w<(iUj7mS)Y^o(??=_hR=l0OvC3PsDW6Jn`3_ z=(1(mp=#Fll)Bq#<7MmBwat3i7E>6$4zHS6g)u(qr* z>7Ap|7=4X;fn{_DwNJZs#d^{T+1cv;wvRR at xpyt z?y^lh6S7dxnB5wkH8KoVVsEcAUw_JbrEQ at Z`rx0UiuPEaItK at iNV6x8KnoQtt&xt8 z)Y)Efoe!e2WwHQs9qY^HsnSZrYuPXm^2jyy==;W?;zb3;0;bw4g`Rpx&7$Qo_E9Y67+c at s0Jp!##~IvWvW<{FZYp;Pf19phS+BvK ziT%+9SE}E&d%=NzE&)A2XKzSq$BZ{S5%J08Lyu}#O}?S1FyMl+niE4BwS|YS+CFcY z#=5C%<)Bo5UsT(nv`;gw-~gi*SU?4sB at 2%#tFk*V at fIT4I2=}p3|dv;^u|ztKBhlt zNY-rpO+)2l1iYAOH?SKt8vCOQS5Z|jj(J60ib*;}+6>ehJkzlAU$Z98>h*sBenB6NcUcMgS!pj_c*;LGTJg zxW5LIF^Y at dCP5T>PV{iaK`4hX!gCvnY(UEbp9l!Ho^yE|&O;X(gxYu1w^`G}y6qcN zh?ZPKx&cEl{6Y$LUmfG*74jL{e=-L%d`1EMp2J>N^k8p^XW5L8Br)O$rsHhDEs)0+ z$*n*lu>g2KkL6@!+?H?x*C}kZYPm4+8Xt8PtcgpT<#Qopm2Z!^iLFgjdSf7UO#)kMpQ9&PD?Et**d2Rs+w_R1#^n}5cx<+m?ic>nD_^?wpagTH1kk6lDkA_!<8K0ae+4XlCm*H{_k zZ%1QO_%NY(?H48q&NLQWpnSic+?WLj(w;!y6b4`07`{PbXw7!D-%hk2cD-J-cYnS; zf#V0U5s-_M9}P-F^0=4iqdGyyr6k8H;&0dbgHu!XYsOs*4>AVqonzQClk8Fm`7W at Q zqgY9CE!A)zng at FUEGOz(;#pW0_i6hab(^V1{tD{KBCa>oVoo7l?A%M+H5UV~G`~3_ z5wlSIjh?h!$!KhN&N(vRhT*T#-jDHe102{?r4qS#at8W!R9YQW9iZ>{;sCn-G9V4byEg+H zsF8e&A!sm4pcyacB<`{Y=TRCin%qt8eRVcq>y(7+lQ&8&)!5%_-{BRJdirqjqG-#? zKh~8M?ve87yLZHOW1e(nWcw}vmV36OB6gS#95&qSRvr%(3AFx)ue!0bk)@*;+rxxH z*-QCSTeicYJFKpBji`ZfN_m0*o8Bp)FK4C#qjwt^A%jwVrOBRF;BVJ#j*hx2N!X|8 z6~|b@{q55U1fV0 at _iSI$DnB87jPB3y={o=N73Eb~>RuWqzw+uRg+=F(wlU4av1?ru zMtrC`cb_t`j7*)-3wg*nTp1`Fe)2<*w5muESlW1pX|{2?EIUNISvoqbverRte at A z_{b?H$=gq1BA02eI|zHe4%!PlA3G1heoqR4wA^s$@zpp?=(z4mQ}EK-%CtdH>E~T$ zL*A7D_Ln!vK%Q{jG$r|08GUfKLip#D0V1%Eza8{iar@}!{3)Gjh%aBb|F28uKMy(n z3u$HKztVwHT?(5TM-yg~7zQaaO(P#g17-5dStmOwXR#Az%Z~$X<8nk@4!f+Uc}+u at r;l8GD3yl!4BI<@5gU at 3|Dlv}Gj+fsM;k7nI*381VwW5B=f^ z=%gVP8CSFn6JSk#uR|bQ)v7mEVLAtU|KXY*=us_^QtYD&dO=u6x0tRR0ngBr5j%eYr2g6y^DD4uX%q at Z$9QgJa-zZ1nIh9D#!>JGCR z(h{*K+z~|uf~yGoX+u_r-$!Vy45ln1tsf^l3cey at Er4(h$%3$&f|?VyWKh(3>)NBZ zIF?YPMUg0h-8NZIYKZ270BcU at d=`p6&`b!3sYFI*P?<|+`YP;PJtPaBu`b5ZaBZ!9cQbki_MrE<2#n45o^n&(yL9t$!FMwx6fAf`(g0_^j zZ`tB7oyl?>qO+adxL`c#Jb^}N-ZJPLuaE2yagpUh+v>6+P}et3nHr)4QTWoZewCLB z9OQhhFVjX0jl#1QZi&wv2c1ZN&>XfT^#DaeyiIyPzDxI=A4HSD;g{?gQBE797HMc7rjlE0dVH zQ~m=flZ};z-FcZ9e-?3Dkv28yfY~ap;j$e5UKD~?=+h2G3KFrX+>`_EFhbm0EiCbV zix)Crn{%TOSz_lCqG)9p-I0KU-!|@oN4ouuE*{tuRX-Le__i#CVKVVnpX4*t>FmI^ zt`XNV^z{1lYkeOk457$@z|DW+^;}B_(+k|M7U$$R>RjLiH)5tm9bc}TH3vT}96}CaOHT8E21~jQ687I~7=;7JegR5GeiCtLCZxVR9 z-7NtH$Hmt;m_sFMgZbCpe=|93wt$g1pkKZK{@WLu{Y_TetaqJ zJ|ipo&*bmGd;d5*W&5%_95fxK at F6aOZ%7^C8W9{jC=3?wj^2Ze>tK_%itBV9`V- at 8 zJz&~rAf!A=fikVGwbDmlpHZm3J)i5k;b$>GAKqkk?hIVW0ejpaWvoP%L8Yd`Ketev zMw1k(Z%Ubs#cuWYc2OK#!xPY@#=PypK-Fn?mkErsJiU!;h at OT81fR?ikPB|5m0!lx zR$7 at 9<}v;th{4I2REEwmu<+b&2e at WMFT%{ZrM#$u;927Ww*_;UOBWDuN^TSa(o)1O zt2`toKdT%z9Bf2f)Dn2AJ2fcd;||Da;u}INCJS zr`K?-wED3RM1-d)@?aN*owtKRz^S3t5wD at E!G{Sq^fmZ_LscQ_18E`6+^#rS%4S4T zqcIiTT)?||4)eSQOAuCz3tq`+;@49}M;9WID~HLxV!G>29bV^z70>TsOVu5VkPc^M z9L0A=4f!X8#BuIC4h>|;D)ZPU))BuJPq|(jf%&J-z);MbUzwjZZPWHH^%sm;@v}k z{Vj<)N&kb}><{N|1OM`c{r{@y{!^%4{zIr@(NJZklZSkFv7EOdH-R(&Vq029 at l6WmT>z?_C!+{s+8-3k1loCK*%WScE?(vx6h!)>Nk&WD)$@iA)00fhE8(ZI2i_q zm^W7+*lJj*yy>*T;i}h?)p>rVWeIdF7O&pCwfYf^M_=H!R&^QjL;N7fH-;5+{$A9{ zCw`bIA9?b+{b6(gS4GtQwxUfd7BaI*KB_~>jYt8B+gTXiHp7ApHZn5 at uj$!I&6Vu6 z7(6^qd^l0*q1t z7PkE0TtKINFN_AnU&yDrYCCvaMB|k9l;&|l$?f0~tjvU2zQe^5IOPc=AMxeR$_4H_ zI<}Ha&Sdt0bLwh@=@R9}l-~4`)!e)hAmXVgMrC1=5L|Nd_ETM$S zq!u3>m`jhK6kxbm0}UO{AF<%oeavqL##usjqwmA_g)d5 z1d4a5PWTS?TLfRfG{y!Lo#44miQeORto7QkZ1@#UF<;EE`O9PQ6@(%7bF@|Ui0Vp} ztIphG{VRAO7KXXJ{(v_g{NLDM|1aSE&tRtiA{DLw>2F+sgX^(M4CfV%Fe9KM@;&7y zU{xGz&bShOkn))m>N8(|ODPHM?%6cpZdP4RFki0AYCp`l<$lcY^5pyB`}ma~r at 3x; zrw#;s){uoLzaVBFrGTMa|GOHpa?WVU?-B;U>qgVI?bRV*On*2~?u?(vyUoU9{iNv7 zhO^`Lue((OSS(J&#*l4f4$%_F~Y?U#t55A}-^QX_K-B#hW z$loO^LxfR0B1*`&%EGXfEngJ8s^&3rcDQLF)2tX#m8o~yBCr6B`Ed*pc$$R~=>Vf( zWlWdgB0GlVlJ5X1<|fTJX3IPa4Q|K=&&Z8}V5rUT8@}EM+h(+|k|vyx>of`U-!XXR zpe(#nY at qnLx!VaIek zipDHuXv$(?nw-H7f)i8sUaawjo_UjS{|e`C4Fn{Le^j99zq9D}2hRV+->~{41kr!U z+NQ75!X^u%lvlC_#eDHg(nRhjM2mzi1jj7YO}3BFieDeQCgtzu`$X)*8TZ>OZTNnL5cq7qwxzh1$(f`v{vj at mp?JD zd`(!KKb(VKbN1jF_~

k8&SZ8C?(bs(VmzqSqZTf zDZIdnc5$U=zke at 7Ip!iJWmzISBNJlEHTDYn8jqKS$-%;A58}KdZoVwV-LnqK*d&Gc`}^IE>O&Zq*9&Y6 z?)mxZ>Kr=mI*kHp9Cat5xUv}1!Z^Q!qlVGXCxRj%72fKPi at TYXj%+L?3E|*wt%7)% zXkqX0a&zJ_bHU~8jZwt80Yrg6Xw at Cf;D#p8scKL}IMP-X39FcagKq6eOLOV4M2;nE zE?E*?Yf-2|7Bnw=&VYiwQ(x7{zRyRfR0rP^(28oJgpzZ`!Y*epBJj72R+OoQvIbgI z=LCf2;7wGzh6Z`-I;DjTeCMbqXjnw;ZmiJSZR at EjxE8?>W at MwMcV=y+B5y4>&_Rf` z!E0bZmkq8U!`Y1y|CQJo3{8B4!=oP5>{GEA-L{&ujr%CGq{mbssxr|-X02hJgV3ZK zgsgpl!*KhGrZeQY`{xU2rcn;yuUhG}Lt4Q~lfV|naBxVm05dA8WP})^6;O!cytjXJ z!RRujYO!w at 6d@wpLpp%0_m*tCrx9at=QaS6jUpma8je;{#>TKmsStAMV!NlGL|OV| zoF#IEUP3c*rc^Ysp-p{{Ia%-DmuV9vY(fXpSRBJJ>Xk!E)(p6 at qKiKd`{y82jp>mg zF=w>`O$fcq^9p^5Y8r8dpIe!+OR}dx)0{PxV-i)!R+%=Y<2DF%hJ(ObOrlowvX#oq zbr|}jFs9W#-qs2SCGvg6e(vwF4a=`yi#XGwWsx#@BHL7i83qZVK!#Zen(fZBk_&%5 z%u*m&1&$|3kC=~=gNlqHgL?(ig)h*L_1LEI<8Blt1Zp*V_>(f2S^`4bY$^3*#p)ul zgwz-2Ij`+1QlVxl?*(1dN)()s8iBJLj;!hujY`~GR5)_UZjsL;=UAHZ>SjR9e9`W= z at JyNyBZpN;Den}Ko{EuqCyJTI3bt&vK)Z+|&N5)DEF*N$(M|BMt}5;b zkrT-iBR+ at 3LseNPGf!2v&6%!C>U2M}4H=(v6EZM3uj`-1EQ!!&d{yJSd9ybf=`qj~ z%()ss+fYRZZLds#xnu434T<5iuJk4CV}ci}kRr+}RF-V9AyoYmuG}`gRKd)-kG54< zW*yLm&_?SsGQG0+Ru7YTk1CuKfhfyN?_6}09cuCU23w;I)DsdJd@ zf_a&6jt>Cf-G+QI%?^Bnx6n-fz}qF>t8L3j+_7PzV4NO=!%#|0F^mq;c*~8tZVPeI z at P#n$)-Xl)%VD-LW+>{p+|5Vm${50XIQFWUz9H}s4Vmwo!rP at aVAoE#bMqVwaGP8W z=wbFs at eJ_jq&C2RnsNZkk7E>SJ0RvJAF#l30PMvd5PR1Lfw at P9#SL{Ks+qvDWn<(- z$Y6o8Ir9|CHPxDSCmAqCyG`6lzM%+x4qAas{jgzzA1GpmIcSU`k~Fv-*kR at d>?IzM zwnr+UsgsWnHeEn1^p0~x8Z+GpLRHNkj-Py?3^l)c+}UBi9sy$F1tTY`UTLws6uEib zumXwusx~5(8Lsx8q zr)=AWNMs2N$caeaAGZLoK7(CMlR&CE&j#Cjk(Hp*v~IGWL+;@(HI at qAg48cfIw=Es z^$0GfBUY1-R*^ms5JSx|xbSpDnoo3gtfkM8C=naKS>Alfti+tXw)ee9+aYge%|zo@ zSOtSyht9ZfnYpsoj(TQY0FSC=fB3~9T8s0P=ETmCE?J?3!U at 4PxN$@bWNU3vw9@$U zS4iE#S6WP3R+6VYmY;%p&n!G*vpRmZ{wq{xX zbv6aqb?(J-+7&3x>~mXU&pz`x%-4c#RJtoX4L+g+{~F%)8rf6x^zAzJ%J#u$^3Dfi z9l_^<)f_uNtK|Uno1zc;`a``xFtwi(mI&SdyNAF!4h(o!T>g4b^>qB-! za!|TD*}r2ru*rmDBwMdlq;r%>U&N^CdiBqhJmaJCuEwO6U&YD+$3M zaj;RL}>?FT9``W-g?d7J5ywS-hw zUmo&eXmFsh^^CRTjJ6(>mlK9E)WU48oFrB)x7311JeEK=RQmx5f=vUbsp5 zy8I~pFZZ?0$SG)?2^@mWqi;}y9$AiC?&|FZ+Moj=*O z%|S(vf0-+ at iQfp6pfF0; zFRW6UIy%!@X$AH at 2bmj6f0rp1|E;S zswI1h^O#sFgmXzGzJDYie>^(tF5lfAHW%av%V4H_b8Z;KcLez>Y~6GG at Yq_p*H$mlZZX!(RYJyWR; zAJN{sWZ%1B-#wnI_PR1suhTo|Pj?8IWYNn4{r}tN7dxl8|Y+GAXFu%^sJ9(cf z_xJU;Vd!3>q~H~<`+(YV!0=x^Pem{*XW@(Iv?CQ-CWKgZCa8s0I0>JL68s=*v5w&o z#X|K}Z+W)={U^$rzA&?o5j!Kl8WLSt72e+i&z!u9Fj zO#{BM=rBXfVS&1aG)ap*VrmfaL=WG%Bk3%@hat}OyoWOP#d)H7zsWvit{G6)q#d-$ zT)c`V52Ti z;dvu=KCZm`i{|VCQFe1)d=X>)rgviDI at JYi%qZzhdC5qS)41<|y6>>r?T640=ADs- zexUZu*jKpm!0tvWIevZItg7$7EGaB~Fm3-3Z3oQX*i`?~3&_0 at dsyA&flrYOr0IdL zEEy}W at x)P+#%JOFHeH7QsTfxm0q7+m3Q;!>Wz-)2+z_m$3!{&M$urHK>oq!w=AW8c z(`WU${!=)_SutXO903xmFt$tvoDFX zZ;X(f%e16Rx;(H3GSs3{{hQ4*K)61&<{VXE3I2Ow%kY|?V5AQHq5BibJu6VL=dsS} z0q54YyQVK&mAgA1JYX60qm0+I8CU#UY2(N&6B;O at nbo! z4V>oI=F<2;^(f~$z#b~p;~DGAC3YhQTqFej2dvjL-a6KuMO078-yXE`t!2wfZOP&_PlMc=$)M! zj9S#JmAAxDc!8qpsmTQ%0T#uD9vR|BEQIuf2Llp6QI3}x7<(d5Ez1P$s&L_B?K z+6)b%)J-mPQCEQ>iAxZ}SR2YSwT5WK!BaNVs7GlQ+AE0{6{c1bbZ33hc4F?wD6Web z7xYm)z6PR8We~+B<1A zXynOrgn@%5P{Kxf>rYdub)TvrCfZ{uRI}<5%1dJbcPv5t#PT}gX*KRuV_Swo8FBks zax`+XB1HUVpC>@fU9?&IRV>o9Fgy;$YdbFfA9k#|Gy zbV6O?Tc`B~lpT)b>pG3LXvejwi7oseR3iJ#C<^90i+Vig8PY-?*cDc{R8tn;JH at q(C3 zr;UvvK)P(5VUgL&b5Hc@@E+gKp2tkLJ_FYJO?&M5uBjejb#N}L<7MiEsKs2i$WUN5_gd?*8m*IF zoq0;a&Q80sDms?Mm-Z6N2P&8BUmnuop?aL2-Vnu?m>;+x6mJXhza~8t(RrIk45o0N5>7Q_|LXx}@)2SXES*+T~xg zps1`e%&4y?l4!@-H{;E at iRRc6f-)QRKp;4=lq<1oUH8!@muO z)pH15=#gf9 at b4q&d$?vh;e+A%mkBzt!fOw;^_@|z1I{x0l!!Czg_+*`5~mLXF#>W{bMEGKx3`ZxcFLDkADV+OW33jU9^!ael;p41|S=Fw%^z1{g+04q;bQ zxS~@ZITpR7D$7Ju3Kjlz6q<*`duruZ)K`Lv+$+oxO;?mc3d;P>()aWEW6n>neQ4j$ z`!_s*mjiWxXEga8O0<>DK(GawC^IRRGRvtbGp!7nipGirfif(1Yj9R*Dn#4Hr^(D~huU(5;Q(D at mBD z^sA-X at q=-qm^>ub6nUwfNlr9~4bmxnSYTCFDvyWi?(8{oC^`9Um4}B67>Y>gYq(im zcoUO)tLZtkcAArmSN6c_?K+9cX)*kzwC;pvso-oqS-Xx{u*fC at tys;l!r81 zp1^lT_jM+waepqW6Is(ky)Abw9YMxr3 at MU|pH2J~vyQI&eo(Y0LRp3VC_xucwdaH( zU9&zH5fvbz723^ybiyAq%B|W5%m#`KGZ*SP*i8B_#jP2ou=YJ`;8t6ck~^{5yG;t2 zqGqB=Dq$EfiA`z%7s9R(%?!OF-ViKsg1 at Xc)B!79NDzRH4asotems|84e1qYpXC!rR0M%1cW3)D#= z&KYf*4&D}iDX&^AN^%*A9QFBkg%6V#xq9U%DNJ2rFm8Vw9HmI~2S8?K2;kXK(!-b< zTHV#U6`r^28BZtSaTKd;-|H&{GT+%tWQ2V{^Dq9WY?%0QnIS^Nzzm`d>H zKN%w5#3NveD-ZmPnmvQgNub~&KFB#Rc5{fuRK(&|i}vvbU6-6?T=2efx+1=+0(Jf5 zIZPnB6NKy?V167Jv7pcW>uEforCh&?3h|61{yE91tavp&MeQ8gGB}n?D5s(!WzKa{ zAQm+*PWs_GM|USS1b7~U0oh0NFg&Iv8=$Igup&wwC(3^6IVq*3Nps%8l!&JxvM-DEvv)V0?w`Zm{BTnpbY=7Ywpf7rU=lHZK@;s3%aMhII*Z$*4jY!-bJ3mj#YA zZ`n_%p9I!Tz#3tUT%$)aYa9v7Cu)CPU%VLR`x3ah$JcVwS^y^xh1oY`n{y4{Z~?cx zt~*@#8j9vyvQK1bZPEu^Wx5y6%J;5Y4D)k at GC;FNH}4n=u3P-qi^MS^HBIs~()kQT zWz%*55y!MIlYi_ilmN|eG~1v{ITmc4ZDK)svE)P`&@7v#9TDD^p&ls~{=JQB`UmA# z1#z#8Gn_GTuD%3L3O}x9Ux%uANGn8^mfdyMI45vR!cn1YA92-fY?E#5q(Lx%e97~^ zSy9j}n=A{(CU&ncs*><8pI^#n;w`_3;W&hrCD-;fc(M}xl?R-rhHge zdH)K(i-mWa?B@$2?l#+ZD1qm#I2O at je zk_M3Iml!gXt-yNOw)175h)*CCzX<&=P+tUIagn%k{clCQ+i5wnteHVc4qppb*PH3b z?ays6;X$K1QV4paQ5zQ?d z%h;2RSruQ=z~Sni3h8>cSdEWBd%H6^-7N+OGv`@5i_ypvgpXNrbm0Crl}>yv1-tvGvoHDEGo1=d*X&6mwdGBk}h##&45cY*`iK`E*R^pK{n8m zm12dTi@}nj9lWdySSDf;<7I+rRz2B!&p2e zgtUX8ihHmsi*HP&ntEZG3SAA^oGulTkwroG8qT9B^4nP7xH^a_=juM<7_pLa`0L(C zU`!t#9;5xyp~pg#l{k4=x2_(YKdYQ>tzA%7V%08xu!+`P+dVE>XXd-wKow?pfxZum zSYhx^;~Cv1RZ%uPR(E>CKxnsJXuh-$4^}@!`r)@4x8ZE1ti&j=Uy&oloP+DpHDBrW z5yfooAe2&yXsO`W-S(XM8}K?a;A)<+Aau&7YK8IDIhF-cS7B9w;QKAhtO at _1kAQq5HfVqfV+gT+q3aH>5bq)~CTiU< z8h4-p=Jx0em?N?;*&ZtoDM#HGK}XoeEb-nXh~kuUnU(n;Uv*Wi0ZFmC$;ap)!GUwh z>^<4wkpsU%AN67ShOm-gq`1JPvxAvyc&Hxl7rn0s^*8-&f^lF02-fK>>$awge9hWt zl@}5;mXzrWGT9=O*~e63LGIBLyFKqBnX>x>Z#j@?1qyebR{;K2wpj%<^uSeOH9DRZ z*nGa&P}?-P#^S2FUKLRs|Hy9+ at Sb;a3ENJFHYH2Df{c0~gV8DsA7%Cvn@ zVoXHH*g-Wtk_ at G~lT2-4xzxh3*_^cW`8ZOI;=k#k3rOb zMj&I#1v!r;^#fO_ir(OD4&tx~!Kf0Pam59JZ=_?RH{m%To>DJ_c<+=pmAvTrHXP4Y zAG}TD^z4jHkIZpgrI7(uR~5DNBOB8xmYHwp-Gs(Cict at ykZ{yvpuHbsOA{o6_E0C# zbYa3p=c at W4hXp_6v?;jH?L(p8F9zt*hmrwb(Ew9EWZMUHN)h-L&K)#tZoHRicg*GH zlIhjO at c~^z{E`dJQMz%ARx&mxu&aLXfJ_7AG?|~^k(pvHajEu{5zU;0I71fK5u zOUgagq`eOeexLg5{ohDG7k|tJ3xNOtrosNxOri2W4lXvP&h~cyO8)=!VNf%)`4{Rk zCwWV5Spg;VcQ!yynv;scT}TiYtRN6d1X0#w9;OSr&uP`qA3&TtPz%caQ7_=-( z3_71bys6I44$BY>QfO9fi~QbiUCY+b`{yOQzX#2w!XIT}_(-l&#YM&-Z7x`I)pRO5 z>ND8(t@;|OCSvJy;sJsAk$-2ThFkX2LGrl8ju`n}_;pgW`1$ zgU(8Vwv+4mn*i7wtvRAHv-hoPGiboN*(<6?51!PdjyqQPa4H!EBNd&shcz2Ckb4J@ zq8m=Lp~vwu$%>;66q~H!Y1#w6r|rli5yNP&$xLO)@aR~))Gcc~2|gZDr;rQ!Fj{w8 zZD3WOsi?2c=k&2PMqiV;QzKenuoGC6{0a>Q2XJGm8?5#)QDAk30wc+R!*e?20UPzz z5!Hnp_|{kdn{`iY#;ow9F$7a`%Qc1gO(}by at A9>>&)5E|M)dUjy#Ogc=t}AvCea)* z%%@0AV4vhyWwoO8g7P$90m>O~@e}HpMvQ!Oe$jnc$NGqU1V{{7S7Qiszy#8#1Yzr< zb1nNy at 7Tsij3V>uE=re{MRpUjmxS-^$(MPw{0*YA5=X32WlrI%rQ+;B=yr+&)5v?R z(jY7-D at P{c3gR#`q*YQKJM+JrnqK543!gMuJ#?BO?Pq!8K9T-n;t2- zYh2Vf4)5nAbl~a}e~V3Oq||zwaUY&Ngx5xuiVf*hFELr5)iQ%YB3_?AolG+7vMMoG8R zV5>LU)SBJn_);vLmUs}xpf|0DkUp>e(B8iC5~2UJ`E+D zuxfVD73oVj=^E&#oxob|${eLxc9#&UvQfb{)e7d-+cvT3FvcgEG3&}EyY}9YjV at BJ3h{KD^g;!N}v1~4f5LG2Z`MX+KZV6UakYm zho)?|2H)4x)EMz~>eZKSk019mcu%Z)n*>g*){fTzh|7FD23a4MiN$gkxn-pfqmzo_ z#fEVnJ!0Ho at cfcwO+S}ZgbWh__};JPC%eZ zFU3fS4vK_}>~vBYO~cDsNN7JBuaLe*X3iR>4-O_0}g%>Gcg% zCM8(k^U*#gh5`*OH82?yMMT8PfB6NB(nXGPfj|A_T-=C=r)x2V1z+=`Qz(1487f~+ ziG)#SLH}TCa8S8owSlvbL4yLSr)5If)m!r@^4(o>OuL+JXQdJsw(sTq>{i9vLzgnY z)oKl071HPB=JF`#6`Vx0HqH?tqdB;WUMio-lGjjz1|tIHr}0g{=_Mn(GL=UqWE4?7 z?HVjki`91=%eg=@&*gdQoKR9}sEthGz_*so&9o{qYCj2#4SGw7-Fa(_?PdYJTDiC0 zp1)_aE566Z?Hie4*!gLb(Xc^ipAYv#bytru2aFK72Tpyme)-ckvl9r9*To#F at 3zUK0-#-FZ5Ovj>voTUzBrA$1jYCLwz7QO;aELX}pO2gkiSmx`CmsuBjtz z9NZz~VN|>(UmMR6uRox=>tJT}#N{Q^+S-yL&bw%lFHG-*avldcSeKSKIP?fRA$# zPi!gYH#g=LW<_L0NNwLTz)s2LF(HuH;lD~14C6u|slU8{MrfZ{kR%4(IPKed;5<>l zorb?XVd3O=j2P#ZLtBTttF5eB zAkHa$RPoF at I@668{??~8dbVo3K}-zS9P%f0MVud=j_0gSx4x4~XOaz8U5 zVrTac6?z8ppDMAc(?3eFioLS)Kixb3&Baq$`=3aQpVHS<(dIxRchHp7t-v*K2*?T} zsm#QAp+bA%u2jM;%qH%U;l1M^3!n(H9{|7P`)SwsO*Sm^Ca2k4&bC<}u5gH|pNdwL>m~9p{$0u1w));Y^496C=z3NmwrfM~;%Inr-tM^=KD{V=n z-don at E_A4k%BoB_i5n2vxpCIeDMHKbz1KhmiVk((f&NxZF=?sLOzEDv at 7T0pT^P&A z&scE0A)Nxp;kb at VrwvCpxLAs*&HNG#Gl^uCBmiSn!XB$KpM6jl-~A*~eMQ*GnF^qf z*3n=-6hg>7ud0|S0f|r(0a_4|LZ#NL_pygP}yCWbLSOG<=!7WHxo>ocse@$ff7yc|clh zilHYvajS)w$p?+#!1*jCsu@<<=yWYCC5%1?2mPKkQf3y~PLG`Wve@ZebWGb(e$q2lvoiuAxB#YSBs-cUvo$-Y3IYxRjnSvKM1CI_fiiCan|eB!x3 zo65(aMkawTUAp`_QH5C7Tz?G`T!Wf1c$L#z|D;J~HVvB(^FNPd#T;_(IAOy56b-*;OE6-84aGvy#m3GvyVKK#_HoHwbvM3N9!6D?~XfZ)`Ae>2>W^KvD1KXfrN|tGWRZ+uHF!{LPD=#)U_b;O}_m(!*6b z@;pn^db=CTSYk>1JDzv-QOHXwO%*Bi4_g}T=zZnrM&-LpfC&Z*D3f>HTY-OhW1=jk z7?38bh4E;L9B`n0p|HwS-nqD|@q6Azij_>?uH}dCRBGw$R-ZbPTVN at 8x1vh%PqseH zDerUKt?T+H%NdW{<0?Ij4LxNo&*#JFBT

JlK?q)`+G1g>QZyU!s4<-F6 at aVJ-Hx6#=($x5C zuY|{1?9n7a;!mOr%Vn(wBUkxHvsWcP+-^y96 at FCWVK3$VHrtpn)O2f!2``VUTnazC zg1Fo!MEIyeBOYm%Jq57`_pOMD3 zcW{UJB)bl|!kq at F4#dkH7_3{c7==TQ}} z61^)FDO>vx+lI1kEam+w9*@N+(Sw0w*_gM9ak%8#V!_wV=R4JHXRj#E(?0 at zL7-iQQH_2p@h(46P?*`EI zz2`Ae#m%2~@c+8IVha_FNAsD?Z8Vwp-Dcm~_96S*PI%H-7isXKt4AZBkl4?Tx>e9yX`NA_}loUidP{ZWCc*QTEEs8e)X$E7pD z+%9^J3RDv`t33eg9)-HWdgTm|>#RjzKMYamL3gbf-j%Aq>4hlm-lV!dJ82IH;vh at K z=CZ at W5T6x*`h;8;jHJheE33HPe^S~P-$=6*%4C##d)RxFQKlP zb}=MxI5G%jJ}#AZHf*{+f?rJS?R*;B{QDA1TDY~QmyoQl;GwWcv-}H_w9<^?H8gE7 zux&6fp`nu%dBhuvTo|uxA}VKL-uf(Gs+NJVZGA&|T!BQP5JVc1gZ&TD+!5Nk3bqYZ zAny`U9NI*ZO_De@{ViRb at I$g>ZrLxz+=fJMg~M?trH8BQLpP{~J at Bsgs1-!cNPRQe zYzV|@0RR8qou|jmBu)PimNZ}h04)D^-1I-YI!+}2YVZh~+SvTJu2i{}`zI=G>l!>H z#7OW<01>f8mk;er4FXcr7)XT$^fm0a)I}-nYBqC669s>e{Em<%A^mL#{H`F{&DGkr z0J4?e?1tCtWt;i+=IOr>{ndvH3=bM~MBvi2)K;3b`*wh at Q0;Yu_+YngZwaA}*Z#On zQ^tj+Jr+23r8-Lr+fLen6CB4_Pv4zFnE~jZL>{7hZIBbVO!RWO+{rQGJkA-XcMOie z_g0q`V7A&r<+$MzOoX_ivjyKpAD6Wbe?vpZQkKAez$>`08eQ)~agwcS_q!VQ_7C{1 z-F0xOED|xrQYq|%G~ZWa#urm>$CL!wUU^_gQxSNYdH+Ao-Z4nCF54DPyDDwlwr$(C zZTm^vc4cOzZQHhOqmuVM_jKRr^Trp^=j(|5XYIXz&auWEYmT`lnrJp&&0=PteN#~W zkz*ibzoZ$}im}cgh3ns9 z)dsAOgh4qj*Dy*+>}=QxaGJ`cS09af{!Ut}*TI~=wJ{Cc%evJahUMwl8s1}Rr+zm0 zULN#-0W$yNiiqf9qKQcBT^>9P457Jzf>cHnSdU+Zp0(wc8d#$&Pu+Q{?UJahCu22fmd@=uu!VKP{H zgqhJ}6ByCs3bLd}M*T>2MntvB^6Bo`7~Lg0#87jS=IQ7Vtx9i{b1KJV^K9Og6P!{d ziH;;kWZ=KG!ujX-;@nw=2KiS|G+ufyn-9J( z*$W?k-ml057&~DI0u-TNKrBW)n0YYZclq!f+=DuhH!}~Hi$lUcE)zn^flQ*`5D&Pf zhm84={CM_`m7$s8x?Ane<$?sELYd)==Cu|uw3OP*X;avpGP^2{;UdA5)$~}IDyp1! zeniSC(ld at Ov?Ur>dXkr8LbN at Umaj<))26U+sVaF|3sY*S_06I%vC||a8(MgZmoHL2 z<#pm4pYp^sb$N!cyVfb)Ev2klF*RpKkp8NW_tsbYL9~b{RaL27Vf4#PP;#k1~A1MM0zTCNZ?;O6j-O)@U)dXIk2jpHVHvb zoePwMmJIuPP)WIiYd|_S;TeI&d`M5ZLu!DlYN9a>sqLLr-N??UxBGqPSRWsag4U)% zWDn>=_M;&V`W0dtwg+2eBEAHL}$_(>S&n_^P~}80+|88S`UlAF398UVB at 4hV^2w!l&I*P1eSohU}MO-}m85 z&XRFmT(=(Zti`D{`FvbzXeV8LsU-9K_9)+~Iun=<=~*S1bE}wAHCaA3Z?S!D8$o*Y!pJ(uMP&rY zN6S^}5z=6V2XK=S{djYbdi)@QL^LWg;UJ`Oy)K#Qm`mx|b;Sq7H(d9xR|B7Cam<-Z zG`QK2tAT9Jhbhh-PIJ1GnVq~IAeLH{fCz5lQA4??4y|O^U-?$MdcdBW>#^_WNL%UiXg>J8{JPd63OllDY8PTTE?r5LLwFv2(5=rjS}_U54b7lt zf60!ErNvom-f4Uujl`H1fGeMI_00oy>&^y;ES`1pv8xH6|G`6=7C!0-rL3!9s2s|h zR^$CPD!y;dT!UQv(nh9R;3MCx|6rhgg<+wA5ol@%9EFBwbq5s%fv4>eR0fgDn4Bom z!VpR%YoaurAd>>A*Dk4Mzf?9#BLCJ* zEaa5SOV2m(Yvn8?P;YSOejva-6- at F&7BYJsntQQ4JY&%XX7PHS<#gYYRVq`K`H9%1 za;L95F|i+GEE_ at -?Vwn at 4w%dVxZQcqHz~!pfljXogxpd_x&O~7vAhqf&SXZTdLJmt*WV5|pkvCW at xXw9{Qi2y z`yWK_f6>UlScJ5lH&hV5V(ssbSY)@_?_Q*qaFZ&#>Ta28P*}SOmv6XjEuwna ztfJYLmRrjXML8q|LwWYoW2DZ}FzHC{_nB?X~TmH3!4>z5x#J@|gaf5}R- zM%WRlZY$sXiY(W1Juen1=@adLPr)pj4nn at _Os|PN8E2PU>i6xzK at 6>6hzo%!j3bu z+YAsE+03AZz zl*ct3Dh61_B{Ww$BYvT&u*$ri-<&+c&?5{l@?c$BN at +?xk}Ql*SwyDrts8i=XIRV% zs=muPO}ZY^MQw52rvwhL*U~o1>=vI1 zflC at bxH3S7 zs)v=Rjq=E_$!4HHN=k-I$E=;4m%|M;A)lE^4n-g^Kh#Hn!!h|1IE4iJgv=O$vNeGx zWE_P at _>x>byaW~b>D6YANLDL3&MRuijA7h>VJ^Av2;E>4OXoR$z`Qj*yGNW$XBc}= zetM%?4Csp=d=Uqj7BLc^* zBbCSc!iTbqupPb|Y*{7wU00QLy2>nmKN1f6a@@Wwj6g%sh_h-CyolkI*-;jlVH1p>JsP%wP*Unv5 at qk!| zn8LxhVX)FsGC!^9aH7Sx6-UfH|G!;$eV0mAAM#hy+K=|{$^!qN8_)l9*E?V at VSX(q z(r9W?%Yi^73ed3`NXsP`?@TU8PaQ5cP&;8YGYH7vV={3|74q0 z_{A-}j>M2*xEpu|M}GxM-+4Qq)_n^En#1S9_4&Q^G-s-=8^yHIc(%W5wrFj!2qi4J^%O>l%xu(nrlWK;wM&U zgrh2TGh2hz3Jt|qiqi7qifLf^w-|JNm9DO2-L_X}=pWO`-q8>E0cdt)3v=7Ty0L_y zYARCb0^qOn;;xiJ!UB5(7dg&S6PKa%F`V?=qK7rXaMd~%-Uj`Q6BPGm{YtvpC>}_t zlwwH at b^+mmGac3q(?Fw>sqw(|DmemgY)_kE2USoI8=g~(*0zKZ$SjL~kGddBjYu;E z9r|a-z&PcfNh?yvjvJ6!!_;9Vs7sVpzY}WUsYpwHX<1pO8K$T9r--*&+s1P_w_BuCW4kf zH{DA(Zfn&xM5w?`sY|?ery^*nkc;#gjqfLd620L5$sw^vXYU0ZsVI}xV$FjkkVQ9U zMQsGb{`vywvXVAg;2GPeaiCpj(C0Nei at I>G8J)Dt>z!Q5W-GZVy^}a>C-ojIf&ENt z;#TDb@`fIo1{rU2zEHT2<@K?Z;OH4snpSO5=G9Vk=?A1Q{~pij&(2M9P|VM}qzaYlXKT4`;tjIt-j at Yt9%UpOh-kznj=}%{3GmeUu zc2GqjH|-4Fk<`EkqBTaK#N;1TWwIMsVls1#iRRRyHs&8Tkuee)=1988_`qNv<%q^M z-3-Yp^3WdUe(iz-Pa9Y8v_&`m05Co?hQ$`bftE&JO>&Q8pdRB6I39lr^qcNHaQ24L z&9iP?-`OGw(B at AWBY9yBh|PqnInB6d<>*36Q#G9sXL;EAH+F`r1z z$*G>y!3`&s)M2SsWp7s_#bECWv4Gr0?ag_vOS6KLgc3#?HFnP-gf at h#iGdP+o{ffC zL~SkGj!!>Kc=3`J<5=~M5O=+a+d3NJTZ4F}xcf!gw#tt9GhE&5lJH)ICu9iXQ54%Z zxIx}SY8ZG!na4QKbx|T&Hv;mkrXyHmW$n(9!c|cH)%Ay>l#7Q+9!zv1F{2_eBNen} zlC0^No at QCrDA#P}?~APQ^XGA{1(9VH>-y6#0*)OZGU43E*H>@IS;-9HufXE>3EG1& zI9)=|%g at Fkq|%F7*Ztr{hklx6Mw+!UW?fzw} z-^g|TB9}d(&)j&eDQc*5%w=1zWLK|#0V&cNOM7QJ{-n`8OCg+;kJ3m&zAZ8^x*k;o znUjc_)01F-~4smRhHJg6B}ARP&6d=)~-amrwqakYi3nXHumrD^)b(7i1yW* z)>ltP-(5d0HzLI8S-%T8Mzm4BE$S#v_fBeV+Vp&Ttb}(w_i<5mFC4Krt>5O$lK>&; z3wZ<|JYEZrc&m9_F%My>wPJ;2ZElPztR_Dqz`Mo3b_gQvDSdketUi#j at 8}Z%l at Z#7 zAt&)K5iX~~ZFIQVx~Z#23r|%2Egic2gBo=U8Y`!3{wp4Y$9F<99;vxAe1Ma at VelV* zB|FOqEm57U&Pkvp2lK?m|{rztJ-O309Js54#dzKSF~(xw|U`8q!A6sbEnHe4@! zU;iMNimw0^w9i|-P3yRqJtHjkgp$u>esn^+9vMhL8sYZxG at aH#-s;~c7??Cl9IXGP zhL``McFzAbt^fBZ!2h9#b5w2r(!&UT&B=Hxc+DV%z{xFQ=DFr(_HNH7H}*TgCbvQ& zVDA0#4CsLX7W`vTk%YZ at A+S#kxC6RWuua&cGhbkMFdme6Qz*{&Ox!&5cw;~c&06h? zOl9eH>S1IxlLU5HftIIkv+a_Z1`U-NtuE_SMRlpvE(^=i=hRDU?CzvI z{gENk81W2%5hS%bvOQ at 0dk-qZ9O)HDWdXr{W*+p~K7E=+2h8Ca zPTeq>6_v#(kC^Y^bUBxbGBiA{om{XRd?QuY=BXBX)%GCah}a|I1j+5i3)X?A^9^ex z*|+>N;+y*4E0mKF4@$?> z6e9}7%}3#Y`p4}R&>o0MeEe(Cv-Y+% zUnnhrZWPFDCTm)e-7HpEU&n|fMA&aezz%N|(B#%OFM6`OEBW;uoOTQ8F$Swd2 at MaG zOLfN%q$&gw5+C3C%V at f~t9x*_n8#!KH9Nz;JA;|KV~6kKo*Kw`R+uBiTo_}-d4MDQ zWZ-uWyfGYle=DH)FG{C}BL*}g(8Js%*0!SzPmDs9srN_URm`H9bdnh>4r7N1_-_3Y zogN)U5_?dcs at Q6*MD?YuL6yzPr_oB)n at ZQJDqVpxZy@bRq}XssE2U7+_8xm;opg%kFI0Tk+r5d% zfpHdPnaR~4C%(gDTXHdfMqFdK+coXeT;a2&=*t~5kNFtJ`ag_4+HlJVeAgCaOnUQV zZq3?RLn}9oM^p~|2$LSJMkMKIC1l!mm4K?YZgOoAQ(|cz#U|aTunrq?=tc at hAazMS z6U@#T#ANCwA4smKuoUdBP`}*3;Y(&7PgS#5(Zs(Q#?U-MTgKx*}jx+|9 at z6`wde~QBS@!+BtN|>9 zhAmC*lVn|r(O9wa&M_I4Ma})pc0+t)HEF5D at JjlgPN%#}!gV7bHabG%Urn%pKl&0D zv6O{bvHra>fr)3 at r8heXv2y58iL~`VHi$OyEH3?qD`t|TY^_3bQlo-~%Clo0_C&Y{ z-yy#)XR8A$w{cS}%hA+=k^T6%&6Uc)`U{b9h<=U{0S`1LHZnYYXU6Xfw at -1~H?ip= zo?-Cf!0N*}9;+v+09S%X;im5e{3Gu!A*4(LZx{6u_v4Y5>=cq`${QxQmYR$c!J*Uo z1gvJ$1Hb}m${7uXqHwSQW#icjye9~c(+Ry&7(w1>&MeAfj*+qydYp at e}!4aBX;${8n1K zy3bbz2Aj^PZ0+YyiPezHcN9KLX)9%(aS}m(!P2~fS$e=iO?tsjtxyklW7(=)ACgM8 z8&$)(s##MJQ=wJ$QndLI8S4e<6C-g%u}TX4^Ddbjm*&$E7nR}A%9xW-Biv^o!Dj^G z8|=a(d*S1(F-Je57MyBa!TP{#Q|8 at oIgVH8RN;>?j+@`+ZO*;qd|xO!M)Y?-IAV=E z(GTJKJO~D-KDed{UjJ4{k`&SA{IB`v{1E>sZ!`Uaw^eNA7ZgzZt}&ABhJLUF061Ls z^^)reU+X1>03>9>NSe=M^zKJYQtfV*+zI|A(A|UZ!!utL2W=$?YRxq9rCntw+3!3v zZ7;d+FFQ3mKvEt>LV|RGj)$rwiW2#NGMHS_(XQVD>a~UWgAB*`nR=<0s$ni$N6qfL zt+sXgC$iEE7B at E9t=ecWJbR44m*L8)T5!rtp>rmijTa0w`){8N!qQ at lQ~*U*>!m$? zwYeRAA3ni^-A9*6nJQC_L+^GSl$#1WDpQQDOS{#S-@@iP%Y#5+O&1TQ6U83w=+DK@ zKYc-aO`$o)xp6N-2$L#t at 8orE-bzbuZskbv|CnPq<``>QE%I+%lrOhXJ&Bdq3lh4{ z*sN{dv=`TAV<)HGpi at 8sN$-(FZP5C*c#0flm+8AP4)WEEirye2s^|DFSB&u%*t^>f zu;X at cNt_WBC|McJoVACovK_gR%q;t89xr5eHT{^llj&$8{t!0TA8`I{DY2UxhO*4s z*((iR!_o->Ec+O5(Hh0cwad;yzsNB+kBJ9Yt}B>Q;9|>mE-`?*iH at IbtTe@tap4@~ zRBt{EFGLkKWXLU;ga%|b5dS5 at 8lgRLmslVVD>D#K7Z0B%d;U~z&AD5cOIaexJ at L2g;3+Ut=stUGKm1 at f1gG*NZV}Glu|t-P?0Sd;@Z1eX)cllgp)&oc3eCQugu7ZS*8GrgruZntfiVsEHc75Q&~M6nQpK=K1k&FA zzqNvt;^Bsb{T14x|8ZzD|1-2VCx0=5YnDP?gYp;5dfBSQ*_RAEG^ z6m#F|8KoJVE=SWUK2)jaqTUpq+VE9fmoY>@6u}~K;>^uvIR9c%|L at PYANkSjR46D) z7~+beSY9xsG?X5xL@)Iq!hMlJOamGY7JoeJS1{^-#BqNGUbqhW1-IDr<###b>@C?` zzxSJKRA$+YSajHJph0Bdt`wx%!ZI at yqWX2?7YX60PSgd-hQ;*%SVqr+8_VpFw_KNmd_8XZl{v81fcd>FZQIoKLrnh=PXDI83L& zZ;;=S7>;IRb#F_m?k1~U)WdKjVd**C%$s*UVyj{OC%jOcNHrS75o!(0 zZ!w^#JEAOZTjLg25!9R#eHTWOzhb*v9}zJvN4>Ff$k)&&JQh=D&wdo`* zm$I3*jreS#nSR3Od`)|#QFq5_otucm<%N}Jq&*D9&T`a1cmTFj(!V%-US~NIdl~%jbQ`M-xhlxC!HNGY6}x~un8uTQY+WqK zPe6*^7j(g&;Er`Xqwt$?Tu^Alww~1zxgS?%!Mk*X8P?N!76T!1 at B_oxiu4og5{#HX z;bT6$9i>1n?|A6fe0v-uO5Rz-RPG3#l1=O-*l~mQV0u*LY7C}o*CS-n4&$)RxH*6sd47WsQ3-JMs%ko&k&fV@}aab>U}%~BHGvA(nk_|@K+>gARrT* z|3B5oe+lk?RBkli{ZZ6Wzo+dI*S6q7$WZ15phtjqL zupQhJmo#w|sQ61tJNwkOO;lQog{kt=1PTT4sJ2yVRqH*&aVL|L(|l%Z4F$*H-Z$Ca z*DpLbobLRd7dILa=-eMOm>_36uS zLrW?yQmSQ%Qpu^5tg^~X<%3VZ`sSrSj3de$f1j}I at 079loiff2d2E;J(RbD39^sw;6`>s7XnyUZa>7}% z;EnA`PD~?o`fM&Te3atOUPPEN84jfx)Vl0%_hw6$=jB~aVgka5_=s?jDGC}N8KbKq)5*g_{I7k!~LpioI z%^E-Qdg_KyzR at TErDN-Q5@f-x%0D~($nE)W~!2KEi z$7jQWu8Le~T!bi#;J)_v7^SFsW1x%Hl4)~rtvUu)cI-GCV>^ACj21341Fd=46a?<< z5~HqkaTyrR6%Ac5SxWlMON^asYIHiRZQ(}D>VeRuJLUKin17bnzAdzWA2)~=uK}qK27G&cN^w|--lHVOKx>G&qe4F+9>lFDqQ5DVuMbXM z{4IMY at g8G5S`t8-17zOLw{KZ|eocq0$g17R#9wSKx)&}tmKsxe7&>e=9`&v|q~`!1 z$!XVou3x`n3#2#qwJgNXN2E8E+mAuo10*liAvGM>M`h3(=_}NKCqa!Dsrf(>4}#PO zQGOe7)C`&%(}X-Y`#_cd;+ZwJ&(rPA{Z<$88*#SFz{cwK$Wzj{D>LYN+{|RQwscne zT%x}{UCBo)0)MCM+z0n;S^avrBrc)EPBqI4kUd6n=G$0NpQsWbVHcd+;@bb##Wbs_ zw$`=t6svX{a1u3mG&CKT=$aCTIyv#IVBGkGR@<}CRYfatm+02IF75rh6n`g6P!!8m zqrWL=SsUoJHl at 3qVs&T3qPWA%pI?Mn7vr5q4=&9iW>rVqw%T^kw1Pv5g({GxJ}CSQB`>MJCZDX{@Mj@@noZ34Yv-*` z0$O5KXoxt2;jT1?0JSpgSYf&rl#V&AB=O*0QQLMrOL)Kx;b{<|MaGyJY()zg>h6W@ zt1#+bu-t1D>Mp!W$agyI2aOPz{!NH~9mvOC%I}mi7AHjeEE`Ii*ZM4-!OEr*?Mny9BgDF@a&S3IUhtjzE+y-07I!(1P~K!iYTy-a1B9I=O^N>Er^p3~dxk^fcvJ=ulc(Yiw1Ue`F_DT~*qmHBrKbDtYA~aYd2v299;MXCuig$B|7kVV at skJkMtm zd4+&LImTI3{pY%1dRZ&keS+3dkY+e7I&IQnY#Y$^V#AUgNbnf4K#ou<4%U{wdy&x!{dggjatzUXK6^bHK}8JAvrnhjqj8)A8fqyvDg11d-F= zKtMx?|86kvKhi8!J6n4bOEb&=TK!9&m7}KZj;xCEMJCBCi(%2GiV_ckIt?DqiOr*MYkXZk`2>d1|$WV7(!b4|BKEv2>kQ691NT#gqwp2A|mU9ivxXul* zT?iBMGrgDV at ipw%Q=$ddK6$E8R71aLDSl|5o(v+>Mk7u^&gs+^mKCGe3KXkxx3WH- z;R)>GF_ctzlfb)yl7RC0Iny`kfUfS-*q~-iQ`pa9o4N)@irYm=KfyVo)`Sx=EV6mD zA_N0MHqh}$&M)k>&&zyMH?ELz4FzH5HapR!xBQ%kbEcK-B4zU^G|R-~_x28H+wh-@ za(xqb4$91*@v2Uw2J&I0vzF{X=?_3f#aouBsLNBO4D}LZ+s19oT`_*0#|r)EMAenpV-AZYq_W0CUGur7+k&sOXj>gLbFHMv2o|fT zB$NTra-(<~)FZ`X6~j!la;~TJ_4ceN1s#&B zp=G3p3{?BZ&@T at 9y?al)C$1CaOK=NjM-wW$c95Lj+J>y%@wY^JiMP;vDGbv;e8~2I z at uWOZk%{=yZo#{g6%M(aF;W!zLqaY*l>5~^266EV*i8=N5bipyDbARRfQm;tv#RmS zkD1;g$54dnEB&%kl1WQ9GZ}5Rb-;0~KH*rDtjtkMGg za13g at I$z*jhVU!Os-c)^3Xh11YxC~xp?%v}S01L4TV&PS(PEi39j;u6a4g5#WhP<% z5;wqA_~Jy|g4Jq-f}4jt2l9RA4aIo#44r+$e8Y-1WS{b`P4nZw_}UKV%X~Qis)C=l zia5rY`dk}9s3)!jd1uwBK5 zes+VrKC)s%i8w1buuJ0kbbKYed3$4?xrXEwi)iuQ?*$gy)rWpH0{%S_<+t8J) zGDDSUIMKv4(IuPejZM=dP>;+ZS!B+6eD(o-_h$U~g#l59Y zST|~gvdAv8BR4d&kfa^I*FlO at h9f3R#mB8E0E&}a*fB{wQq`0_wniTKB#~_GP7^L@ zFV4Ump7*n1$@Lu#jIYmms`l-`F5ZX(zd{ARUGn`C9=m>(>aMnofUaJQNDF at IJ_K5! zUbDOIE{1a>SG2s%nqi&G_L}P4_3dr%+jjb1cws-ftOqPaf~jv6vyTX!p%txdqxU`E zXw`n|U^jcK?};*Co4xChY`hb%etkl$^2ygLNjKZu_C4bRuK4*7H+Go5p$Rb89 zH>jG!o!=}$IlGqlC9D3}_AFGj9PiW-+dPY at S9w;UZ1;6sf8a5(*cUCyS#ZeY;}GW@ zj4l4HTdXMs<0cXm2Rcim;G1mMDLI`d`;UOq0N=vJC8#W&) zgeVF_Wq|JkYg%PEA0nxQ`GxvMa2k9N1^>1i)%|LYGeZW9o#}Ko3b!`JY2I_=({W<* z{y9 at N10+^QQ2=VZ at 5mnJjWnE)f*@XvOWR6s2m(*SGg$1AgVfM at yNw=Kj!|mtF*s}L zsI1yZ#QxW2u0JiuTw4Zr*IA(5T(}`BT6quE$scARx1{PFw5L_Cz(kc%Z&hXH7CncwvI+FVGXq2k)f(jOhYqlS+)AE-U!+G{Inj! z>$ACw9dn!Zgy) zQA4IWYeCfsT=30gQvPbK-!GGY>u6Jzo?_hDkZg;D$F8gehCS7 zNW18gkQYHRGff*M6MCv#V&F}91ZmdUDGa0P#O#$vbD|ifr_}|RGleUhSA&^oZNGIU)|- zy=lFox5sEj8A)BR1K|^JLL7jp*d1X*@M4+IkRS2qX9Z&F?XUhuSxLA*A*4J?D{1S< zsil~#h2s1d&`}+Wws73>&z0}GMRa;)bl1x6UDk<@CZ_Tr*rESMqACDL0Z`CH zx8!lybF7$Z**UK^HzB?-Hu*bi)JMU;(J1~)7-FQ-1{)Z zqr+*ZJahVwba5cfbMFU>x%QW-6hJtdB+H7i4X5bBeN}jK<*v)&$0bq;9!Ntmr at i(e0w zIF6sLiw*a4pqM13Et}bk7%SQEE$}H9F7Of;bSdpXtDs9Y(Eio-%Q(f*^mk>HHNenuYTvP!K^~rJt8-7-pC381Z08&1Vr|~h^Bw|UNyFqu~kvNX at P}O zfl3HOE1qFD5Tq6Yw6v9IiWLy07z+evo9V`onzt at Xvvetz-ab{I`owX+f%JVWmM|+O zInImX_}=%U{lgF1*riA5D6t2B4s^NS^e=Q1GG81%e~K$3GJj z_d~A54FR3Uqn2x0g#=v?*$J4+PQ%NJ5WDc-6JHZkF$Qx_K9P?4MvqodU!Z|bu$^Xjzd zz~p{4p5|qLt&PcQy!TX1h^Yvorjt0sj!Zo=SC5Jk4De5w#^2J|I at Y0_gLcS+ zIgIfh{t59gyAViAF5mWy-=W)nF1r<)qe|oD$=95YtsjQM&1umxw(ULo&|5}%_4{FE(9du;byz2Q`^vgzpn z|8DS#Lflt^6WTq!URSL|Y1ECa3AatzLt8KHSHP`Yh`cH-j&tbOhB*4$ z6`&G6)R}gDe8p%v{@!y9!GS~tdPWy{J3?0FDwSMs(w9IEMb>AOr9n4&-m*>MG&Yw< zl3anNYCW_#eUX-!Hja`e4=d_v2O2^+1)y6UZ9Op*G^ALj!qv`Zoho$LABnl*?CC{i zCfO4H0kDw at 7VHdaBWS;C3_#X1wQ4CcGS_mq`1ZEqtN{`13~i8kvE|=}-q-Cs8F?4< z34jlNg~EsBcy{P5rnJNy8(kIHdKD39sLK_j7=W5SBidGAo#hD zuvC&up$LrNFe at EwMFMFMEd%8_;pC3&x zr*rBMj2bYb|aH&MS(UG)nnKVZ-O1U}g(H`_VyS8mvz?J|0F0edu0ps^W*=TTyv0y-xQ zHqJ+i(!}}9AH-N-JOcSIz=Lb9EJ`}d2%9EWW^yoCAVINadt~O96z4`@j at KUK)5ggh zkT^HPQa5zTsSl#{MmY3qYLgpkfD4QL&M7+hQ2Oy#5g7;gHH*Zu(SU=kq4|z-q#e at z zEILt-#aIUeTw0oZZygs_^>GlaRU`$r2PevWXfHV{4fJGG+hX=iNVWN&BbWokn5uM2r2 ztG~Ygvo@}4k1dMAYs{@Vvex*gUtnHIStxVWF7;klX3B`()esrmf-q9lz%TW*26en&Q9-oEmC) zcaOJ2r>^^j`V|P@>veU29FNbGLYxRq*A8sJ<(+WnL~v4-eRbWFLa1S!VSXZ-!ysKo zl*n at vQIe|Zt=csyaLXutb(V@%C*x-vGh@)l2*bB*Y4l}8>UvuFX2ejt(z=6iAEof@ zPgnX=tF0JO0W65t71871p^4BPza%5-w>W zF8nUC6c%f^wA8Q-%x4;R3 at L1`!qEoX@6rYuHsZqR=JtB1`{_ at SB9?7 zU>JAgszYPMrzFN#+7gj^#0M7C5KZ2a355|x!{EN#&^?{SyCI!EIsG1Po;_Yek$ZN+ z6J2RY(0%YMO`L~riw5b5vZ+R!$7adm^IVa~t`H3WWC`Nf_4asaO4nRtYG&^Y!p2=* z@;!@ln=t3^Fq2K);gaL#C5L{H-knY|l!rTS9T?~D0j)NGUDsCk|mPmVwG z-hUZvhTEq_d5jEX#$7zWLJTZ@^MbcOlOGX}#d2-B*@yUS_MkJ1UoS5^CczDnQqS}| zfOGSp_T`9#Xo)i6m*QVX-oDG)UP57_$+z{DO*>!bv6e+)ML_aIO>Ol>(0#E>Diqy_ zWo#caqA*&Lmb!b-SIE5MkU2nrXOngaY+J66KywR!uc6cwh{RIql?||uMq1FX*S^Uc zJPprK at QBxKfBewAbKk3FQPvUp+EJ- z84kM*13QYHYdrPwkKegp+X+drU%{A=oow at -Y&!d$9Qb`a+|;}Pe#KRjTOgN1ugfUQ z+%rQ&adC;MCxXa`)cN=3gJzLd*L3a3<_vJ2P^J618 znfYzCOZ{}IH{A&(#xhII;IS(XEM~dcQd^`l3QbXe&<0zMF)>O!$y7yb^*z6V55Z;@ zpsJ#Ga|aC|q0px2+NL7b0OHkYVU4e?NRt!92iW4Vukb at Ys|8e0EgwSkSX5hV2KEAX z+dV4!hSprWZQ8vgvlel2^JmJNwdQrE at R(#LR6U!N1sSpwD<>yC))+XX2u@{OS0*-| zxe8%k#hMfl8aYt|u8=Yj30Z}ZbJF^If0NN*Fu at 6qanVw&9D&=yK5rawZ!3~3=Vr%< zJcO051I6#N3_YZtRdA6DYXmK;^6}F2HP2sKXyb}o&PdC+i%F|*ah^f$IO4Xc>%zuz zrykK=Jhb71fTtw0t!a&A3La;6MTh`62T~pY!E8xi^|v=#!p&9Fj)?8_kgo1jsJ%bc zP%HAE1tbrh=)w(81g=M=?hGPJwsOZyr5u{D82=Az?-VRtwg+qP}nwr$(CZQHi3 zZ`-zQ+k1a~Dyq6~*B{Z*5vT9tiuJM{*2v5`=ExjfWbXi72%p=K-A|v#WEL5`{Uz}e zf`S+K)s7^~PCR!(F at XyO0{Evq6(B8}Y*I2BrrhEWwYt6e>4m1>x_PYTJ-&T5 z-fy7$U4K?`WBl228m at CrJGwNl)hnXg7&BEZ*kucB1n*Hcg}pTii}&TYE9Re`gM at xq z3g#7mc}DZ;7aN3#S*qqGPjij*(k3juBnuh2hD>qfzUME-*dVr$f?mOJ z%m>2n@*Ko0$?JY*&i_LEYF7rg8C(yiZVO0Sfr>I#B(?*H3SS0XNkQnvOjwa6J;NNLvp$el zKQv!&SbfhKhNbD at s`0SYa7xq%f9c_Bgqs8g8R8ZVscMKb43PnwYQS;W^hyt6B{$qE zF{h;W6~AZZmF|v!Le{|2ioLr}ER5qse;VlNBf7kt>Qrqo)CZglxb1hIF(?`t{e zAr(G75|-cxemUm$z^F}~1WKq0;%HZMTnPoggDlDq{9G4CIrnJg5KcQBe{?c_AG**{ z#|@5jl1d+`m*H~VG;IF at RLv3o0BzG-S1ooHQRS|L?B~27I}PsTLC&3c3BudW*IU_; zsjbVKbL*Xu>O(T(_ID1Ad- z=(IJNAgxPd&hTEw%qe8`XWcAK~h= z&mSJi8Qhmu~kui?Y=R#I%0LT zls658B%}3j5b#KsEiF>eD92$dEQtqhM>{!?W6ceCg0)t^(bO~pLX;vw37U*YfJo3p zX`%P^3HrRp9Dl}%pki3wwmIK;`kr!`-^%^_e&G6f(wxT+RePtkJ!qq0^yVBriNo0) zRq5?DJ+=l}1BK*4<6PKP=AC`+b}wZCAM*MmQTMJw7opipuq#nM;|07H9&#Kc4eAy* z6Z0jxp>Wsq)D4+`T}sy)_x83GZyGdr5G3l}wWSQYPCTq=FYT)K>$Y7gIaeOHrl~V? z_k2y6w%xp1^!)c*+ky9-`P8*zXcP2bcu;FPn%0zAG%Q+w>UJJ};;L=zy8FZrx~8q* zzh+}Wt)NWWQmVO_SpKDZ5F}iS6?WG4$)XS`Vu}3jCjc+6#zdMu-qf5U1LflnITXy- za^uK{C=8;kP8hO>DE~N+KMIvsv*qLo`{0iYxT#hIna({4V>Zp0-1j{6+D`>8>P73Q zqYp2SNVx`OFLvAlm}~iBNv1Q-slWj~BZ5zo-)uFtSm zC~#Vq$vC-5Gew2$J4+a1PVv;!Q053^Ibng~p>}#>Oxgy_)aoU~6Y`ny1uE}2wSfHw zg8p-;d243Ooiplu`Z(2KKgV3R+ZfxDchG0j)3O2$T+LLg$FgDmfMn`6xt)t11DHJr z40}T6N~Uu|Smq~iSPhucvhdf;;P{Ku7=xJ at E0;-*MI3i5vO4Y?lvQ%lsrQvsX<}!S zUBb`fYituw>4moh`>WeJ_GfBu>9T|p%Evq=<|)0P{##tfpBy*d at +G9)AA`qn-~^D? zv`2_(7@^4tKXbl$N4!OtUeLM`;4O$IS%>zNugs|q+?m3GC-BDB`n`1C=s)0DV z!zj!n5LSw;6bjQn*X$&abVbR5007)W0{{s9n^pUdjXP;uO4#BEVczqGf;8fQqXh|Zo1voDY at k1+Q+C8s#I{D5=slYc;u>*s&+Vk znW<|@H5?mc3oi=0%fGTO@(}%d-(T2?v`ThBUKYDBZYfmGi|{rj4A!s9Aa+oP&LBU7 z+J>+5F#1r06=AlZZYW&x75_}(3bVg;9AUM+ysUx|yTvQY547pXxA*Yw)I4IW_+yMb zg_(L-$24Ug8vkhPR(pk2rrL}hfs@|Weo85~!?k{W#d~gO=k6Gz(5{2$DC#dXyvwyV z&E at L)?uD2&SfnTFf&>57Q5Wwf9x!3i at itG2$Jt`;5xNlr6T40|btp5quAMk&Q>WcT zxmj$5ldUn-uA_xm61A`57?QDUQx(qw+dT^J2%jFz^D;)MR^j~hFy2V+Px8v)!AhA4AKr?K3*H(2@>U~f&u+GvyD{t9XVRV8uidE5%MhdySFO%u=?@v!i at Y zm4dG#vd?``K-Wq0+{m$hgD)fMt~h+3&ISK5un=W+;%qNH^M5k#z1x; z`wTyPrjIpBd)+zbDm`Y83?h;xsL3cayU!c;5vfDcQx05X=`k~TbiW`oQ4jwn@{;E& zSY&`mf;|`Mn7wwsd=DlX1C-La{F{tXb*DU*VY3jC;#Z`3KF{|uPF50tKl3ZHU?1gg z=3llBIf6N}64!oa)wyS=?!YAZPSQw(X>yx-rPu$-Pnvj&I&h8|w15_b<8r>kH2 at z$ z+!tI(DY>6rpB~-bJQ_&o}$8 z9TYYcOKu`}U(YbU5m7+uAuZrTx??)^H8 at -`4m8*~`%H6fXULpcPj}9WMwN z0DwBe|1J0D|AHEL;#jd z2k2liO|21CTrjOaN!Vc1l6z at N*!**~e!lM*(2Q&Tx$tJ${zoAVagsvaP2-x4DDJ%Ak_%<&Jp{eCe5D}MMv at OZZAE{dn}VeD`=>TZf> z^CWgAyEP$C0Fn?Wm3<2V9 at s+!VUe_|rb=2#6`l2E?Kcl__i%%?oU*I1N-U{jr6l0` zUyQDDQ&l!Ij8}4K>%*>$TFj;-+VQT$Wj> zeP-^H%sx*(cHz8m9+KFHUD3{(D6v{8K_$Hz+Tz#2yIw_Q*iItai7uIlwc#p_M3_ph z>Z&Y4tQ6ZM$7P-FMAY1YYav<1_dJSM0jDO_{DZUsuqt_)REZ*!K3)X at HEA7@PTP>f~0KsfN z|1Q^oIH_&d9-Y?Brk(jBwQ96dXr at 2XpF41H51>F|1`rtls1o|k;DBF_0rI#=4jAGf zIm6sQvj$@Qn$u7jM>9OLPp3rzJoz0VQ$TeFgb`T*t~_u?!u_x`P#uxlFy!tYsf;-v z@=%};ArJ1;wI*L8ZDl1(F*uC%X~4Of%51|%ii?IbuZ)MJz_8ua+Zv8 zckhBqgW`Y18A2#thMs?K2Ju8H at CPVnMlLKt{k(v at lrCVrAzyRyd_9sk5j2BwMH6s` zFn;jbuM_(9o^*GG&CT#XPUKxe#y<&o#XqQ)s4g^QlT;^T^2EYEcj=y#4JKI%g2j<> zO!G!%+$+=1KXLoa;iTB{&B$ynpk)@9h&rF3I2T=)M!Z z0{bn at pm+FWR{TZITl}l=p8me(Ob3@>t6OEDV7UQ+Nsu<+STe=}x`7$njFw6cE|3Hk zbC?~HIBXaH>mg*WSJoKq60)g0t6A|+v*HonGJ*I`i=gc+VH38{^fm1)-|WyV;u%iZ zdQUXtEyF18D2LpE3$pRH;juGkxMSA!g;WD3zOuX*ffMbDb|1vc?R}Y ze at -z^Td?7`)wg+s!Wcq3ri;$j!$gt$mbFx4 zeEMPYtdt^gUbsqByqN1tNZ*Wg5$l$yJ6fwE z6qyus42d=N`jRV5=~9T#iK2X at tvkgF>Y{h7pKEM&N>OboN~@9BoRfSVw{6XC9$=n= zc8?}H_dqmv!1V5|zuDYchNjnax0yd*9?;)g{o7yqI#moqVs32 zmqAvt2I?dzT)*A8DyLoFBz5xw|3dvx`Y}BO^Y`PM=JWz9K{JLqOqiOPo1bNxo0r>Z-|Azl2Lf9U8#v2ydf(03JC1_ojDe4b{_tcLo!OKYW z=j>bhn&mWvGZ|`}=Uv`2uxa_B1^d>4lWjr?Cz8NL6n53NMr=iqM-tr0A!Lo?V==1? zlCv^pg(#&2 at ncz>=qqA_)HR*AIvT;0QnVfppZG))4{h&>$i>f1TyKl$%>>I8i&8Wj zYvyi|cRN*d${GW0>dw70OOX?MY at Y<^r{N6yj5 z{MuEe9Eq>DE(|}dR+ydLnD(r?QZdRA7_(~OO%^P&TH-{#Ev|T*JwH>smqkI at d25(k z>_B)PEd^Z3BM z#;z2VF{J~=I-sX$uI~`O8rg=B(DuHUEaqlFy#?E`G+?;VXU18Cex)>`!?o8%=2-0ulwQGIg2cmV;tQo64qA%Q{+#0;s*sQt8gD8F~^d zdVbCVIsP{^PX6*kA=Ruv<8C;|Q3U*1;22pA? zFuB+lxFo4W_fxtgLcruc_6akXrOaCDcLW(alvLn>!OHGKP2$uv=4eitiA4sp%O#8K zL{?^Gky#b!$Tdn at jq*EZEhuUIX z)3$l**=m=K at nut9?tFHa7f;hRAAq4iR)%eEt}ENKxV%!0nF%u7<&E)J3XIO8N}a<7 z)^y_twcY*4&PUp?yRhaQR9#qvG*@tJ$b?cIekt6s=&s7s6wB6vMbx+nPtNiTDL;ud zSYr4tAuz(Fl-n+Pq(x| zMR8-93I&M_IewPc1kEskB(BEOIcm-$AWD#nX~e6F0Nn)`?aNG at D=yi~FgELIaMu$f zPl{`(P==kRPud8zsmXMlI?ayY$5-mJ=q5Fd5!D<|J-TV_lXJ<(sWGZJ+{SBVjR}pC z9+lL`+Zf%A{`?z=E*MBgx=6*1cI?_xY at ZOJHBQfUaS$3p at uGhknkH^7jc&^s=rW5le|I-xfJ0 z-63mZid&ZoH$r!o+1VrM-|-3sAZ4I&P7o$SI+tBpe8J{W!AIs!u4w}aH^j9tdQp>N z0QSLoC77z9tU6DkNgkB&<#j{fmWN}Pk$f&p-?Qg+wQ{cMUVNmW03R(vQizU+BAi{I z|FC*z_uRt~UF!xK>@ePX5XJer_ at 4$vZZX8Dm-_aqk0bs4DU}tF(L%7Dg7BDE*1CRr zO*zzy4jw~(Mn><=KB98e88T}-j*`e8S_tzS7!U{MP(Vy%BPY_ao{t1A_~u4ml?TYx2^LR>hjMu6oO at m{;%bVyx04{XKM zFFk&Ao(gK5vlh0~7aNc6NN4a}9`(&(me at cg-oa2ct%-V)2HB7uURMudCRJiPa3I5( z1xcL*97yk{h~=R>3=z($AmEcB{zOP)^tw&SkC;Z z?S;QHI5!PMuN-mFeo$Nee>_y8TH03T{_5}vYYzV1=LY6(f}DnMr4` zpJ#A8Q{Wu9vPD%zOOe{P)k?b%elsjBz{0va3ty-DuX6Y2jrZO5wxn4ScSBaI6W-T# z^P790^X%>!+27y0Gku`-0D9_$NPN(TtmS(8vEmM$iNjb_g at -Z}dr3#pD17M$WXj#T zVbvbuTK7^9`KWxUhdz|GlJ`s$esu3Y39H~tN5U7sN?rJpZ^jpXL_7MDS8IabVq9y~ zjbQ8|kJ=Z%aw`7%k^K8*DE=^q@`B%*f+Lp3R?FiQ9u{+yzDn^X%#9u)L4Kf9;>Jgk zyvefIP?wM5;BdFM_$5*+C3tgKrw&wj>_wRxRFwq-#hm2jcG3fZfx*UUr3H!8CB|Wx z!?d7*H`g+h^I}Po#Jo6bvP%r8Hk394#5>jUE*j3D1*V!d;4aC)AJQcO#ECwU(^?>< z>r~|WA&ZUVSyCdS%9Rfth=$CGQcX?E#NN#hGSe*-*N=s#PL@~~8F={2i)6ff{Esa_ zrs+YcLzN|&3(1*`g{DG;=vIjxJ at _BeBx%J;FNI$q{3C|SGo;G}aW%ObNk zui%W=c0EB2^lCiFRA5FE8fFRu$b|eZo8+W*kXqQ+AzHymb$jF(L)&3d-Q5IC03&xVp?Sh)V6#!6Hskvzjshql36`wpBW+32{TRaH3dEtc;*Ni zIHwSrZ5SxWQA{<-zZv{_R~x3chGoO-;^xxh^WYk at i0 zguiNKv5_5ktfM$UU_VW2Ho)z41EWRRT8V5(m6Ca#CvHQV;}LgH$;`+Rqp-ZTJAk{5 zmkMh^BwGynY0}`ag+cPsszjm((e(MU_ z`ez<<3ox*_emc(-7m5{!Sh(5h_3I6^D;y#y2xm^NZIQgOg`WBwoPxx09U6}ud0tVt4-DoDJ2e75YS_H+7o8QLQ{EEYCRa zh^@gF%h|T;Y+bW=dM}5dcQQwTizGuI&MOh5eStkt2)ZB*cM%c5p at R;990hcUNIy<& zS_Q6~2cP$bPcl8v>~3rAvTv!_9aRYPzFbYmyUpf$&lHyO=BJ_d+ at Sb?)w;WR#pRl{D71sxs@;gTMpm#Di|!m6mhXtJ+-?+g zHs;>0E51GYMAMe(gYUEw`P9+`*4K)x%J+du?OV%Pmsh(kuW*UcV%w%L^&zJTbXS42 z2#b87EWpu6zJiSU7Vrip(`{yizNQ4f8XZ7CB-}wiz!b*a3tdw=5z1*NI*aeF%em9s z+Ia at i@-?OrG)hV2yow+C5pfG3<^S*}a0qT>lG3}lLTdAgwa_EnM8i82F5QOGA)Q&7 zXqW%kTup^IhirMZ3>#Q487qx~HwnjI9OtC<Fb1ff* z7#B$K2Aa8UCwpn3mE at tN!}d+#ve9uz^5+0MV7uxYy0*iX=s6bY48dHQRG7PY(V>Rb zkh(quE}a-zCG4olBP-)nFN3UBQMyzj21zK)WNH{*^k9oxZ^gA+~XL>;oNMUZb6*HQuNmpV7eHi`vb|I~SuK*(m#bWnU=Y zOBDFgC at 2Q|so^)A={FVitl<|FPk4!1Gsfm=RKpRmsz(w_J6y|0r;EePBn at eR;7 zQoxtod?CS z`5+$$#WTIF=sV(%l;k!n9)qK}F2}qo)e5q)R$=v*o`BcNMICWgFJa+{VW2TA>weX3 z6ZptDe}rejB?NG0zdjXyj~LN44CwZ0il+^Xzo{Eaxl7`L;9t`(bV=A7J{hnB!9sY3K$6&3hrdlmpg%mN4Xm+pP?!L(E+V zKav3W5Wj%VL>F&O#DN at Gt|;GAvLafJwqhJ4&CMJmsvcpVk-ixQxm<16T?FZ3qM%OZ zJ^OMb^-|?d*3cHX#p(jE^)8bK{W$h5Gc6NVkWD;-E zFHZk4Fojl2K?Y5tT!*z}PnZkzkXK$R#lm#I7RzzC(Nf1!S>iSqwk#4{T*9>{b&?^X zkZE at a|F%yW=KzUUNKvrDcf7{Rp`X^up^JP-^kSb_1h<5hJ=>13)nNL*WMds{C zWUEPO2`J at f!#2sw|3aQteO6AF&ocaUrkU z;?!pgQs0&w71AvwR$;D7+VttQW5w?&R;y%9=W!WcL3 at a$@Gt0tiy at Qs1L8P@^W>J& z{JH$$GkTqr-`Cu1#rV03De>vu5!Scu9)VcT3QPDGyh5C|JNOg|SN!=X18u_C2)3*V zJOaP(ew_D5#Fy82qhAfaqS?A*Pqa1Nx%|(~Lx8g&UH7)(9&9ZbXg!OjYR*j(WEp)v z>L2aHCRg6{ZM~?7Pf%{R7-HO5l!s30Z~NQvK}rKec3aP>+d9FlmxcIH!w7vOcSqod zf94OT$KXq2fC2!h!2tk>{M)lr|HQ5TbX)Drj0ttMC;+j9R<0{yB?%O?8f8Ziw4^;Q zND;L9(L0dubZsz9lm*H2as7hweX#Gxv>gU>%>*<5Li1g46wg+`U&e58#hu;KZOwp_ zq8U2P&2;_?!?^RiKOXbt`9K-MRuH%v2+~9`*R&Smt_ZdA_(AZ~gvJdtuhoW=P|Mke zZ$Sx-XsL}RqD&=6WijcQS{#OG>`Xf*987-Oyu at YGWM$=%h)3qL7M#MY(xP=nr(go5 zh0+8wSz+{YR#%iF(=o)VUKaD}p)W at RN>lXmq-o8Sk)P-0^$ta4SDJe?7NJHbuVH|@ zC+FF88KlarGBj1`p8#_B!wj^TS)79iadY*lkCQuv2+N;HY at a}bBkG=5m34X*R%L1H z?MiGQx~z_q*3|5mEUhS}_Vej#oDa&)?nj*bQqj{_RC77R&!DYC#7R}2cMLygw6Q$b zk~f%E?NFh^UeWa5wg(tK7#Q$M19 at o_NVHZvXPv7g*K#cvS*3*gY#wC;yJn at sZmrbY z*xYtHodjC!z%Y|$1YazsSu#1)OC5pa=~7{njx=ja5|!6hin7kg=;biQ22^CJ$fPvt zOS>~wbj_R^Yp#f(LQE*QmR$E~g^ZxKM5P1$4bXcK4TM`IO8eL?V|XN^rAl zMf2#l50txR5q9<->$J2J?awc<+BYMCn0EzMhB8Y9v;?cbv3ia&AlQ at 4Id%hbuD`mDMOAZT)*ZCN0kyh>0gQ=qTCo61g?!qwj(0xAwb z_7oW)%rWNJO|}J5goTV&1T}MzAE|=YAGm at Zag^@^(NS?k$$`!pBssY^aE>Q%3Cx>R zz~sVOr5+3pnH}@Vw+);UEHqF?KDe-HEh)~(RJTzrpO?2szTQN!IMNt&GMtU3I&##7$S;8hVl++`p^bJUU?%GEmpvY<4 z12LJt!(^gzOL0h!S?tla&{TF%r#cM47>8I?oAgSM&;n8+b0J8WMUYRo4&MrX;`G^~ zODWu!+S6i0(H`|js5%a(zKR+T7jHV#{1INJ*NO0j_&XE&)z}R&>^{y6F*=rjoO&}N zV*1XUluW5cq|}R2tcN~ec+m5VYjWZJEXA)OVWa-F6YzWl2?hKVQn&{j%)xyZb|ASK z+kL+4GA~-S&?-?8v|>pazF at 3KUxN?1Di0ye?`y87rNAr7VKu)G`w~w$jb0-cFS?pozO{gci z{w_Kb#0MF@`Q9CRw|E!w7ak|=cUba*9!ApN8_K?InaKR@&W)* z$?EEZI(|bScO$?yZ93L?laXB>J>nS5_ at Udv+GbA9e;(F7;j at bCM{w;CRL6;C?_MUb zn`3+3>O$iLFk~T^cXe}lQ|^7d-aX%6d-(o9{X9L8Lij#YVXXi)?!xpoAdVE< zfPiel3L$4Uts`ORHXajh`VEHBu-SkVpa$6j{<)V;B`KA9>8vj+n^1sFas}k|m9D}{ zu}vi`74S9uK)*RPlcPw1=8Zz4)uq*0YN{4k>8!FNl8P2166q{E1>K}pHf$)ub&}p2 zgWQ(-Qq)OWviy6V;anRVOn~-!TcseMP)$$w;(>P zVS?})TId!84BJ^(2fLPiBie#_Tf5_S>CMs at 7mDN!xNbY7omEm|!r}^7xVhao!$05T z`fMu8#ipHf#*^AfbSo8tFQ%$1FcbYz!@xKvZQzy at Xl2o`qJ}txZ7w!#Lqi(p(}M%S z3Z-Cy8yV6}Wfg|wlbPUV54^m?h`I(Z%PWJ}_~XRTX#X~2b-AVZAh zf}3$w at cx)kr#JP`Zij%$1)LEKg?R!gtLK8Q<=g73)3Rdx88qH)8PpO#Da9_CKQt(# zWdg66r_8R!z0{Kqc6{B`cfyWFr=6s0D#d1HZkKav?#8CEgzXhlH(k}d;|iW;tRaFK zphg@$pazPBBZ@!>mCx9zfq;|%E1(&)ewPb at ArbX}$d9}y(uip(XLXl=;hgm11)2@?Ao{=?ukS!1h%rV;6+8$0GY^gUjmNq&zvKJc1i6nWSD at WCh%9;|sRPeU zUB_x_EnB<_jOPQ!H`2K^gfGTe7vLIz4Ko2XnbBSM?tT9aJD3PNGIuP*A5NIXg%&e` z1_^Bm7F7%rJ at xpFJgb)`^v!o z0%ZtUp>x9^1T_$$;V>Yz(NGkJL8gkRRz;RL<}MfX^xSzOuih9(MiC^LC(sU1NtSr@ zt_t%Z>qAIGga)DL`}Ht$oCleKL$U#J9-AFAd~Rg-v9iWHpglhD`Eq)?m)>sJr6+sF1(INIsxN7kCh5A2 at 7fb{v`^tuS%)E{WQVLSZqe_Tks0Jvmq0|5Yh zga6x86N1jNh7O{3E>4#Jkv#D~vnOg*ZIzb<5d7-w3rW|39*s~%Yc!yc1W;0;mX%Tp z55tYdF!@8D$wDNN$s`fKRk?usd>y{8(7(W at X#&GaN8Dm2boIFTFK_O#Ec?=}nlbDSv+;|SA` zse*d#G`A+QE3TbW3<-OxZ>pt-m}QSrJJKq>uC>x=}58knCS?h1p|;$0cEgL_h}frr1XIGrpL&lVFIgkj$szN z4ew^9Ju|tqu3IG1`n#(t%@tf>9`)G3M&&S_v&2=mjt!Yd4tF7ENDyV9g6fgkI_kVZ zI8t&goP7=h^Rz3~9LKHmo7BCn3mJnpv?xPui`pY2q+StHXL^dP)F4dTAWoMudc?M6 zRva+u@~5&Zi>Yf{-7K=FGk=baXWVwH+R`rK-bRdyz5$X{qD>$d z{Sky+?%c5z``PAt8(m4k4Cbm9{C0v@{poDF0M4B1Pn*xnIRm z_niRPD8WtBx4OIDFQ46B at 3+sdxwm`(GldAEFiJ)f@MSow=yOgrvZR4q4|gw z%uU0pToeDd2nvSplz_Vmhh%lvbO7ZG$G=ChX)#r$-LBy|CXF8XhAV5FYemFFGtRTM z^)07u^AQUTwcDSg-$8H1Et=oKQ}cUZ-Y|l2O!f$GxyJduD6B&{{70Z_uXwdAuGLw- zot?69C8vKm(n+^G>$y>fs=($nYE0I0ne>@N7+qTN9#b@=K)WqcWxK^ps<(HVsHyS{ zG)7Qesud8`7lJ`S6l>Sq=9PB_mA!1pI_C4AGB|;79aK$lwTZ z5=KF?U!Wc;O%O}7rm;>OnyfiQ7l3cs2#>WfHn9SAT?l zmQKLac~NpmNf6IEn(%N2O3G*VSM60F at ERyi(J0;(mAEv;~cwAR?Z z9yAk{&TX94FkklH$G=zR-;W`#VCEv;`&NuQyA5+C#*Q(-xaIY}_4K at TzUA%q|NeNY z2N-Qc7Q$fPV4yER0E!Rz2~`;0L6GvG5AoJ8i+}5G2>L+S9Rs&{ zSLhc9B7y5=-B2KDCBbGDUAvu?b>6pg;$SYdW>sFCPAXY7<;UWO3(P5^G|Lm_QCv at G zE0x(%S)NX^F}o30U8Ks?uEuuSn2t;1crSZq%@mdwTsR)_a#dxETC9 at F>I>2<>p?Ot zKMPwlucKy#J4R#UqC{?ait at _YzHI zCQ);ZB~vYZ#&l2csE*Kt%e8KzQYTpo+UOyN`?cCh!Ds9cZyO_A> zXgSoVu8=&tdH2#2{$)Z_`+nN*(Ico*9xF^F6jvgq&I7kWWKj6V_A>oi;U}-UFV!fq z>_F#XbK%4%s5WksEZ0<*nKU%jl;9xon~xPDS9q;(qom3SL&n2ywT-Sh`mj?bZkL1< zlb7+Xz$S47c3j(4k~9NQxbAYxB`LVgfRHG2p!pc at jkXwh_F!wf2OOT1-cHUbS>Bah zSlVlcVyYR+n#9n3oqAeT1m#R5<^am|kFs0lI|q0}fHe`_VN!(QI1nG2;s6&m3LrKS zUm#Thl~6F9f$}gK3?ge83+S?_jIs7GOdBZAvBOVF0*4MS<^fQJ^qY6W?1A3lvOQ$| z>)@t#MN1+FuM7t2HP-6 at r-m+)=!ozP{$Pj)R-ER(Rv z;fCPyY|n>kgmW)njv1LjqZSNVvBiE$e{#GzdS9^tl=YeK7 zfl81nse%@?f+iOw4s?3O at N}GAp1gF0Y=kz5AVCBxT7qN8UQ&9`o|Ahf$;B-=dU@=E zFr|sR{Wo6g(bbc|Ray6FPZ*_bL2&I5IKp>Zt{!;EJ-DuqF^pq=S3?{p1~}Y8%ke_X z%RMU6HpwM(kR!;2=MVq7t_ at UfkD(oe*N7Uz$-*Yqz8KAO{}Nl)sCi z#HafaxRmPClZMffFaj^_zW2r)?} zB_tAC=V31rAV7>fAWQ%uA%vn}(i}B0bYr`o1`DEBQ8~6t1?TkutQCS)(vj zjWEW85f)sE;E({G3La9;qDKnN7$)2!^-$0}bfB6A{)h+X^Z)`LxrTSLdhES%EcyW? z at A#mSAP)4QC7 at r>)JT94WcrSmAbx701yQ}2Iv2^>rr= zajW$vc?@eh93$Z(xi{@Xii)mUSW2o~gPXk`oxlc>p`N_*BCG~e7-kdxD_m{?b?tCe z3lJ8u{!Y%idU8|3W$PYraCd`)q<<}WyWU~+Fl#Yi4u-l?&{Km{Qq-PF%+WMT&RhGO zS?tIq>H`>A%Z4R&`A|Id=U7`n+ at 2;gB90`PxC*J%l&EsSq>SQ{&2HQy>8VX$F%@w` zp~tm3z=|Fvy^NG8n#w&W{aV6WjHeK0~}Q#E7EOPF5O=30WfFY&Egs8lw2eQuSm>VfazPSj}iKlL=kOUqTeb~cliPlCwFK1 at tKEzqsJe8M*_55EnPYILlLb9Q=cRVmRALqc zwQA~kAtnhIL`jN>bC$OpnR_PK4o%^Rv*OH6izV9X(+`Rwe6dN&1UYHh zrMQXDs at 2bwlxMfqRkrOx0d8Znv!$S%g)>5zCqbs%XmXT;-Lvy+g3V7v z2s$s-0o}x?X)HV>RbwQp6=}6ld$9LBu^}*=wBpE68DWf+C;W`mW)uyw_dHo)s!Piz zsR4G26vn7LM7L%qmKVuxzz7d7=^jW9aV&{wmJ5^c$RP{<28 z>iz&DJz+Kad`Ba|Yg2h4=cl$s|8SAM^el}~=u6CbFT^QJdtRz<)1q{qW)a86%B~aQ zfQD97#FB>0IHI0_pfAd8lfG^GJo;SjsTGIhw3eW~hlnW26}(pXJH at hfvr+3P;6em_ zMilf^`^Ro6;9MF?tSQgrx~}1Z2&zsX$E5&7gRakPFo6aeTP$3Bkg!(ZEg{A$NbI#H zIb>jsEjQR+{Z3pKeg98LK)`9`62-N3o>iw$noLlI0BWXc;b>0nK5B|nL^%SAe6frV zF7ybyj(}Bj!1AU5$gMbbzu}{t9s(QSb0$C*J)uTGS|#%jt#WPp%ssS%q*!VNn>n=) zB{BM5$-RA{lFt^5Eh*=93Xx2wwrHW*{~+xxgCh-+^;|JCjF_2m#LUdh%*@Pcu{2_4 zmPR9HW at ct)W|r<8pY^@F8@{%W9noJ$)c30^^3A8Jv$8S;Lhz7q?7#{b?U9b520TF= z4SyivnE(Cn9WNlc;b}ET8y7)qq|_2WvVKAc z8`y<9_zboBPKnOngL2D^JxKEhrqNWjY*IM+T|%t6FvdQGR5Gh*)FF6?3Cb0fgxJ z!U4Aaxyp)petCm7*M*fO4fi&3#-?AQGL}TC5N#Ajl{+HyG-;ASAT+7dn?J|#(vZXuE*^cVxAQigq z9#q*3Hb<>fS-KuR;16ZtdDC%9`ap*IGphAorDl&Fq=jaWazjs?ja&xH)CU!d;0qqq zs%Cz6NvP&yoym8}NHEZcU7mlUL+Y4O>h at Bq_8APg?V3OHca8(n^`RMBH(u*EUN4Qq z-6D-w?5AMtN0WGsm2^m7ks^>G2<8DQGt2{0*m(fXE~R?+RBxLAoDM{Ii7|6R)Jdd_(7bNzGMy`F^(qS%1I z0gzK*czbE(8OPoJmLr+*RnRFv>$)c}?OMEtkA)7%&qlTW9;v0<_x9TnH<)3gjp7DZ zu2$jby&Lpx&*E&j6izg^&}yPXDUqyYiNPla-89AGLTDL9bWJ5j1iy+P()rW&5tHX_ z=?&LE>CM5(w>|tO&NO~$XXY-w$|H&iTd-(wy}^V)w^_x7=0a3M&&Scix6e?SVx8nU zT81g|8G3bMdgWxkSZAZ|Ud}=}%hdWLEB2h6epz7|*@+Ui9+6Iy;Lflz*TXL~%2|^3 z=aNw*a|e7|sHI&!&8hxCn&ZsFlmp#8F_#f8$2cbA|Oj=5%LdR zc34r|Em*|)Q;AZpSM(aqA}yr|u^$bZ&L*SjL01Ww*OwP|yL^G) zi0vPpBW0Kw-(rb$S znE>wIgVbqBCBMiw@cbAOw1xl at v3({2&-|p zgaJZPxH)!%UqpD>nOwmHlGFv!3B4&Mzqo|OaYFXkT}rG=*H71e51W87^$nHv)WXW( zBPDtcB!Q0((712dM{@i)na0*4x at r!pp?j;kp_;_kOU#uRf7K*bi=*TpXP-daBzA at 1 zk0-dDWF^9~@qU%e-Bml`5v*^VM>lP96Tcl9D7sf%TRH(}<|MwyER^cn-H>^q%IK++ ziBF?@IX=R(+7PFED-#v+EaE5G9CH<2w9{HB9cU2{)om{*8^5MHb23)+&JEAZ&H-;< zd<#T?)xwZ>Zpc^Kl}?871}(;J&MC4aMA65U=WafxtAoFKaUw*vr# z3b4S#zlc(Y2Lj^zKSPv|rR at KAZmO${ql)R5Vj~eiHv`k4&_FlHwoRpAO%@JbgQqQ+wG4npgUHQTL~AlPig=u$a(rTMoNwyUqgXgDQXa+K5 at nDazcW zZk0wse`|4;s>CrJjlG2>0&L3Y6k|hHcFtnzBIH9X+dXm(P85QZy(G<9MLb!XU3w<$ zGO5He8E$6%L_$@Dn;H^g-+ST=UvXv|FWs(L5f$n)Ex_t%p1tXMKF6|+G$WaCT9Z2i zD#^}@=CH3xZ9}0MUQ3QvlT%4mGR=9Ka{c)sA!Psj-Rw$lmiaMkEjE};P?J%%io?9D zI6*9R)PJ?p>CplYZ69rG7LKlZZG%aJa(yi)PuZOh8gvo&nV{o<)B9kvG>y6%L2Kmq zb*6m=;r8nz>Y at 5CiIowp)rQBQltpQ->9&d=i$P}AgIMzoHj8GuOmC&xvQKjr_A=E; z at WNnWCez{>_%V97M|$YM7VaVxR>9*|qU;LR-c*e at x|M13YU4>~ixR;-3z`KnV}v)2 zP1912m=0n}1(S7`ku7kAQ@@K*UyXQGMZKmTjYwG<&0YEzF)VxNLKsMi4(z`$KAW at - zjOBJ4E_G2R(=3KWS%`?1xWKN%rJ at R72}*uYoO_z%tdztNk5DgmChVP8OLodMYJ)&)q zYM(FN73176sN)~KV|%R1;6(R?N^+EYVnoUThIIJyyT{?fxXXXz{+gmYV3;+K^gSow z{_)qHcDT}>vEUQ7t&t(e6WSdC6#k3IdZ=#KK9Y(KL7YLu7%^qbx^6+t<0+B9G;Xak z^%Kcjb4pGV2vr(fDjcBL?n)50pn?gM=;FgfHM zn~)R2<{g6AL3{YvD~w+`mtQ%xA8LalGk*7V1P$LG0G=PsG1s z5SIe_B2-nP$%iQ<$4GgwQLO5;Ad>}MZAokNnqIDzJlOU3{1yzHp3pc1_RsC!K<3=r z9k at ug6H1C43FebH9AZ5;-;WF^SX51fAm=wU{HPV--YD#HCA1N6UzvHuYmQ9qZ* zRYm*O#WXW;xA1IeKqpus)^$szFGi&K-5?NEOuG*0g6 at Mb?wZcUJ%2I5wu2E9LB3>B zAbSS+vt0inih!|p(5j%s$6}Abl;`>CVx;d+sA+$e_cU+ZHs^DexB1uCaWg*4=)6(V93!d_b}IOBB%qS0px$s|*9!`pIq0(juncBS1cp})8yL!n)`9mWyS0-M5BQck$3CR5a+F2a9S zdji-}F=YD3Zi1vg&Xtd`R>-9KLX6vU487-UQ9t-0ep;@Tu#e5)l*5h0^)p}S?A`6b z-?7Z)8Y+-ykTJ)mk8zk{p_hRts)fUa_FtuNGmho2y at 5IQ7;}KEKYT zh36P at B)i^4WbGf&=HwY})kcg2pkxkuH=imcO-gUhRdeDnoFnzc^YvtX2o476~8s%cBwV+vP`p-SSxX;M+e0p<1<9BHtk~x zJOpZy_?4oH{4ppzbum%w%|;4X-#MzBh at pv0Mw_~z}>dQ!yWIW!+$8podGvDkQ$ z_-d7$GR!UmX<#oTl#J64X|vl`^0=wAMXcgtmvOn=N3;c-l$=g zIP7l4H8u84%EI5G&nfT2sVY5iS6j;0EY%pflT>a{6MZK at jpT~WQy&J3J>>xBDtuC9 zDGda}h+nKle8-wvTF)zhkZG-NOmP{gDGEHt6jTcERu^Z_F~h7{Hh=ZtS1=YGrksM2 z=foSw#IWR;bSTkthbui_mj+Bx!wajnusAo&i?NOCHa{N_s_wT+JWj0+rYo%;7Nd4H z2Gt(^L4g!}6lQ92W+mO!xl(+XITxnbjE#9wP{H3!&}FsmQD!ZzfI6B+I at aV7zsKkF z$EQ}Tu$l7-6w9(8QKZ9;st*37m3^9J5$RLl1623~6|!DaMGys*b)@{H9_C0#Cpkk- zkeg|dwva6E6*%(%GJ~QBZ(<$M{w(rQlAH|^aEdEyc_^IKpJC*`r^MD4-`7`|1C7hC zB|yeUg6%G#>Z)b?J;07Y<(~im^rOXupOh7m-QYa{zz>xz#%vp?a(Bb;Jds3j4lhN= zenC-ShoBB(!32Q|CKc(y6hV;bgE7e{Ed=tNF+kP-!b&Jpjteh~o5lOYTl0AU&LAiV zrKi=>7C+%rsl{E_$c(TZkUrT@;+gr*DVILrEpxXvhD&8U;~QFH9^!pQ{xQxy at B(l6k;3RFj(LqdbnPB^i+el7C?_9y zOYJD48v;GEwIbZ`bEmW?oq8depy*a9G&DE{)|hyuB_Y#cRCYa$qsjN4YP$nFhF9Qy z?Z-HQP2F#Z6jhxSBh5!piw9v3a165SJ|azWSq=gFH%Qgntz0qw0d^tmL?i-GOP$~s zFbQM){D04g=13W_F9ZPs!hi$<68pbEqMD(N>pvfe|Dz5E11?=D9XOR at Z*ycZp*om; zIl71>lqi4F!t}VSa;%R1=q7rvelawmmC?sV9P?BPww4!WgL`XsXL{>#dUpEe`|J6+ zJ5aqwG*N68cF7)Q&jZkvu~;y&Fvu$hCr@~ytsMM4Hold|K;E?zxAAM=VV4UQKziLL z6$gI1E at m;sEiiw2yRJhFG|f=kNGlt z824cNwIa#nqR~qjce=+dB{3CZ%$}RN;Q;3PhOT(I*w1W!p3Z`4%7?Ft8qt{d5cY&@ zxIZ?(Z5DB_*mayTU|pyiPE+KCYKoLs%4pF}OOiN at rp+-gUtSjCd4{H#vJDjGKWo=F z%CYR(n at 45N8oLh+MBA=gwHve6MEj#tP5XZiMi$R;ujDjgJrcS0SPwT8i~l3o9ef9NI+&R at YH z`8j=>k2F;glW=AS53uOmjpA+81cBjjti>#2+h7enHa)uc98+a$iEG1}vgFtZ;ra?t zU at oVI{8hx9KrS_n1h9P9%U{J7f=ZM*C_(6Tnh%3I7-V$yqmo-2MW|fYo7xZr-UD&Sj{QS3yG at Rno)~SEpfEM!q_+r36xxv3WK}wU3 zWhD3j at eVApk!5myfnQByyh==3q*&fioV4b6!a08HI?GOV0-{tw#DCVJS<>pGim{zr zU-k4nT21e4CE)M&gH#v at Mg!EE;CsS`q8YW=_BJ_$8BSp29LVW%k(gSRPa##e zaR(78CrbT>tg_v;y|WEtMg7?@UYGf2-6cfUXk4`+BPnX~4l)=A%+5%5RZ5YH{m+Ow^xsM46H2JtXAQh1yT{;U|7m-Ox!X zbc(56Mao at A`1a6r9je7Tld?RGrfku?HJ<90)sV5qV at A~Uqq)}0g=>c?UL3z&9}ZZs zs_4barl|*{Ok(Q`>N;g#_j`7d&k^NQOYZnPue#IA;n{Dn_tIIPtvWD_SHVi+hc;P{ z9Afk$dg(WX;(;OT2m5#dV+Iy*aS#|ozKB_VnF?^#ck3H@^CV{p*aw4O4p>f~ zC?#9u7Ll2PJfN_WTH+S$A!whn{bH6)xg at 8&d!)dlKD$4-A-IV-0dTy+(=QYnw$xN9V7x4{RO64g-26#d71r{h_fMolUu-QA~3Cc?9KhYbIT6m)m)MK-JRG?U}V4 zIpi#P7X0dACO7B`9B&c)FwU0OihshC{`$8{e`UbYU=@Ey*MA at S|9#>AgYz-bf-rrI zNTS~sjaslvI4wwyrYBe;y`e2PU`+6q(isBU;Jg{Ih&%ZMRCYRC{S&!}{#)mt9v~9P zVNk*%Atwh6jdSgNR(%&P&eYYNG*?{Osdv=S^Hs`A?4c}>n at 4=GOhmtvszYwKH0WM_ zcNo{IRjPdu|DXa6 at wm?V!>+~_V+SP(`9qD1B=$JLA8P#DV>HW>*QatC-VGSyH!z at M zmuTkFajWyEmFT)^ImPyGg<*TS!Pq8mv&J z&B~fT3semN5bXD at G8C;ZiZ|96cCHig9vsU9z+bVbMYIwC`HZARIwe!ZM z3jdJq*O!;zxNA-pZttVI_C#pUoQYM>Y45JAc$LebS9r1{jMGc z{ex77+woLYn?ZFnAJx#HYAO#UQIZ^`8&`DM7eJ6b^-D^mnU8j_yGp~&gC%$rwU(o3 zuRA(VVFBK@@{KPzzrt)pB}|U$jWGJAhg@$$J1Be z=8ZFWx5AAy`sYh>kUq^zOi(Ij4-#j>=t*mBQp)tXCwRB12D>LwB1hu5S;F&aJ>(tg zTB{|U>Op$9vBv(G%L)Q{Xq9f0teG>ouiA?GxLX~iM|%D|nHQz<2-zc#aJ9C%5`zqy za;Qnh`Ko~}C)@0;iQbr&b#R%{)Hyf+f7M56e8OxV5(Sz!_qYI#Zi*u(Irl)S60Zgh zug;VIc8KwAZeBmst8c{PO${sXt=3S?B1G)@vF&9pR`ih zl8dG+-P#CA%UZXRcC*Lq_N9|HT7G*FXU0yO);m-2%JI*y!jTcX>BMqQ%|~J!*f+435|I1AZ2p9_>LK-Tbf at udpwURy{Qm%st+qXVM!}ONTv{LO**-!b#_1 z<&hf1rbu+gs#2JUKR%5YW^XMP at 3c07dZ|*Q+IXah!orq(b79UUZ9~%uY+{`SJTl*d*vimaruJs znm7}H&)?2(LF(pN-3qlErI*^+p8IyKeADgV2PrPYQQ;+Aa~0o)SV=5`ye#Zjn0Txg z>$XcCd2({FsxnAakxlj6s at 3eFYA-X%dZe0vF_#XcPn(ph*WMayQ>oXDm2`ltr|02M zW!J!bNL!~?(tfk;97q2gC0G1zw#!R0{FX74t&9$DysUDVy$5}IKqXIqlj+;FUTn9@ zYUv+EeHFOczLH-G+^`MIyz%q*UROMHMq at N0XUyIy8jB$!!>d2MQPJCmt_<}ruu@#z zqC}FlpJDsY1r>GX#8oxo!Av4Fl^OAi at a)i&&KG7JrX0q7=DUHtl2k7sPmY zUW`K$!5IS&WQ$Yr4CP`yf&F5R)dhei(GuJbP^a=G$YH?xMCsifmHBH53fuy{BS>uV z?9jlmL)v6I&9ubjIYHyURI?^R;&>gltosfm!`#$VGjFsdFwt0l#^g^LQ%pHzUviKH zvG2+O%-;RjR}$F`Mf_~Z-tMrxhov3;Ov4t{$Me=b?@au`@r7ICf$Om0n>XZTHpg~%pxqs261`mba|n?7kjGGWm3^ae|uhF`Lb-$ZHOYX);8Y9W&QS>X2w>@oY`e7gTY6M67Q?l0qfW_MJ%x at fL1Y*~=+Ifrid4!q%DHxM(aflzV_pNr zj^R%*-3GHt`9#oZEaFIb*l-d39>7YyMx(?tPRx6Zi$8C7cW+B~;8lN=Vp|>ai5KOA zGftqLxU>b(xlr&5(pto1zAh#dyyTAXQV9D22tftkZn at 8~RnTJ8uX#5zUWwb*b7s at DkHt#04Ds6utbH42{r_ at _Z*dNXk9 zEz$EtyCjf}8&Jr)El}$1ZsgxDWZ0d;t2~1K;mJI6$&BL%h5KimxVazBNYD4p_?=G$ zv2suZqRt*5bi4Z~a)^9^kl=E0uwlo(bA6s8f%9_#^0Vv19>&`yv4FQSOwgL{x at QUC zbIXz3AHe6gSoptO at JnV7@=^a37jnDc=g*$zqgE6fILdmG|dV{xxF{) zq5w}o#uQ-$GruBt+lcmc_3@#j$-R4xm9cmB2m5L7MPo9zEdMv)lY`o7D|TNHS2a+i zRg0TeO}ZWAv~Dq;?(|~CcC!Yoq0UsY)a2|Bjc%ZKGGKG6*{0oejAydR){$9u_2j at E zu6cJP_Cj#87`OyJkV>5kV7FAfkKN>|vW1NFKA}-Z*IcNb-Dc-ziuNT>*kq|8W-d*b zHM#^&Ox8{XPEG?LtK595bwPMEPRvP<+$5}$bLx7Zk~qc*eiWniTtgl)p^ke*<+VRk zqq$ygjEBF07LixM0#OH55A7|L8O-6h8>nfQiMPP6_<&$q&0`fze_d4!!cF;+qLxT% z+h6gFqCXCXkz#RP>NgTX@^~bCx^@J;Z3YPhIULuD72VCZL%(`S(N@^7tHg)efpVd` z2#|vXaV~rjDm at 2jMJ^(#lsJt6xNH^+1#aN{emc~qsa<9KG?QG4PAPV8LrCVt&U9iC zxTDiY?4MfhnEKh(S=M3Zo(apL4++zeU*ZWrK^WpmM$8cE*%5U9&?%+uS?y3%_s}6H zpHshstLqm#!oqL>AImh|8ia$}s0Xz5a1t`N49Rcgl6Jo_hE?#4VP?cnNbe`&M0B at k zAO5{zF6{^r6?Mm~7R~NOnX9NN-6A?g8RZY#j77Jg7CVw~Vr~gx;u%NlJ~Y+$=eGWW zWN*;Aa^g;<*o)d9du~5ixX!xg@=0gYjO;h63PWY`P^bnywZnVt&woF)rV zU>Ia(9ry%^>70-2xR9iqkSBVxJtXF#Mp at L%?>%&gL)ZxucLo!z8azmOKd|0o7}8(L zH at WZhFu9wtcI+5#?MCgl&RV34Kh2y+Dm)?2IYJdu1WU^~>NZ8NReX`S55UF2)VVW{ z&$3Qjsv?u5{Lcq}1=!XwZ?08u)VF=&0FZQ$th=Kc1}~ez9- at rjEv|Am at rMmmjhG-? zhZ37+VMepVBsb0nhJdL#)Azq6m+GXU&0hb-f!tplaQ&BXAY*T5{x2-}M_a)CxEGRh zR#_qFlAt2V^2-n#xMFxx_!c)9Io;A2RCZC222J@%we!t7YjI?T8n` z?ky6r<^ujc?}Uak=UE?QVayc=DLB>HRHK#1U3%dTovKT;ia~gQ$zW3kS$i?o zk6@)H+AB2KN!QkKhpK{gx<<=&*~ChdCYva(`2#O)I;=leH*C*&S07Z9)cq~vc)~2_ z8;?E&niJ9k{|pwEIMN<_?D0vR#s}t=ml!^p9p}HKqLXKX*s6E zx%-t}NWdo1l1D#Mq^lN>JK$A at bj>&^g}aDkq6)%xV%KiC$gsmy!(G!KT-5PGUUPVzVIgpiUv at 6NmKOKEkdU!yH3P zpi=>KN!jJr^Qq(12=CB^E;FjZWtVw|SdmE!Ev@!_1+AvABkgnfr?y<^el_blnV4&R zt3RuF;>XQ!ifYQfbtzyHy}U)}Hc?0LGBh5L*VJW(;=S}|Fq`Y9;M5l5#+{1j2Q_(w zQR6U2j+}sZICXsrGPra@!-lZD7$xFsw5P6e4C;2AK6>@`CP~8&>Y_}EWaLB)({rMJ z6El`Pn|fh;;PD60jG}hFP^39xPnY|7k0?Gs^C-eD at laWDbb>j6hx#%4&Eg82c={kg z(@MOk9w5Cyy#+EM$wjVo9^5SwqG#Z>3pU#~fhHE~Clvh|Js_j>4u7lP<|BC)$ZO_ at eTDX$7I%<9_j?O?sPJ!y$U=G-XQ_Lxdz!Gn)}R0)W3@& zyQAs*T$!R-2 at k_#Q0S>Nhq(kR{M-o;BB{ZKQUib<-^3$!$#SBp{u-nE2wfodrNHDy zAiW(UTjWha!&`CX%q<9RjYUE>zpa(`3C0v at B_q9so&u+7-=RB8Am>pk$RLpT`So44 z_X1YQwn zISj1$``=be76b^~+u at gw37*UcCB_QN`6$fJG z*6gNXgls at IJu#L3dc at 6g{QKkOS>F$|1|+=~JxSxYIb&=LZBCyV1gFkqf=8-oI!4n< z+mKpl)j4ei)k58YXWZaBtzA*gq!-I8dQjNDTY~- zZWGUH%2eCtES$6em3E4YRLN1>96F_nOM79HZM&^h@PcRg+b~11|bvS9Y_Usaurp6M<92RtK3XPbaQ(hPH zj&+DjM#E8Gc>^kcp6*t|hD2`}z{$4jL5`t2H1#HPT8W&VE7Zm>;)YSuVlEL<`l^&3 zDsihSoVmtHUZKp9FjkpKtIEbBJge`syzpzf)$I0+er;{ut#MJK_wi3jk!4R;)0yz@ zV#M(=t2TOF_oq2#!)oODZ+9b at HY|jn%Is??N3M8hJy#Kmu*1zBbQh6^m9F2vu=II$ z^_$yc>Dl4=&`^;hrL&Uy{sd)mRPPA?nCB?nA=6Q~LC#UXVWOvg2^n<$c%#y0vDq{_ zXR!$J!X*PA*HFxJS|Fw`nL%s$*!C_JfW*uCkVMX at iDVTqaA7=-v~9FR at QJ_~9Gikz zchMB))~l>r&{AQ$bj!>sJoO3SUgMLdk7t6;N7g}WD|7)lmg^7>O!6PJ%7x|0-o|!9 zE|1uMSS>;#wP0q&d1IEjr}W`PJ;QLwG14RD257!94tWF|j3$bc(MeDo6A(LYBc_vZ z?r|eB$}2&G)a>-b=BTIXRb1VisF at U@WBXXmXJ{VFsj)s|@o7SbR(Rlo%twD36 zbqx1NI*Jp=PJy}^iWIqOWPHX}-P3A)4HX}uo2w3+r7RC7DRS~v;_QfJ|9HgRBBc at Q zp{5V(u at C(mf9c`Pie={JnCp=tU_}i;S=du3tM!LW9-@|I3GiBqBWRHN04I|zrpKik zn{L%-^1COR;t}uxG4~%j04<_mJj7Xj_YGI<=G33p{DLsQrR%JECEXt4?xI(+{DLJs z at msisEBOZdS3;=y7hn*900Cuy0|7DoR|xTs-9?hN{X8Su at b?v+b_x^b{!+|3<;+#e z52C;k6-#UI3Kd`@i)*_YX8DL16!(t1_#Nm0P=Wx&P!35NF4JU-(cn0S)ce5gty?d7r=QS2CFrbU)SdN*MqeOfa!XqhSl;3Oc z+z2B!{-X&q#aYBupW1Q_ZqRE#Eq`H_0IXk1pZeAd6JF#a2T>?P^U^vuY?vqI)PqNp znS$AHlt z^Sw(VL91Sp;`yk|O>Q((qEV^**jZ9`%1Q26vVvvWw<}E{E+>b%ljl at jh=`88%!1Wv zl)3J(%HBY~T)79`ie~kIT&>(y4520RXI)ea;QS!D4`&rd(ocLBR?{uEYG16xEiqhs zKHMnBgPXiUqvwsaAc=x6E&?9Sk^6kJSGSJs at hZMEcMw*Ic8*({e3QB=xmIL}s6G1Z zpRy}i{;KV`aIgB$-_ge3hx&i4HbY|zQw9e^V{1cmQ#wmKGyDG(nyf4 at BCsHm@AS(d52`qfiNcgYRt2W73q0NTCYk?+L5XFDin0Wwjf0)~a1PCQkP zWk1LzYB>qn#=P6{8zfhvfVr+lwer at P&M;tjiA!FOI};Y}$bMRM?wV3PNpUQv-Y4s} zPg5I{rB%*TJoJ_%@Q+iuOqMj-=d+fvH#D)dGZ+4k!9UJ^lrQBL1kiXv&wr?? zDBQv#%SH=DvwkH{lD7cY8^%QJeC6T|DP>KuUZUON`4IcR0P!W=x-c~wR{kQ-_CCtl zaz5TToz~y>2l5D|0LF*VfWM*a$>^~u>g=h1+^yw_&yQz=*^Y~Aywk>+*9OVXRxVa1 z;Le2fpk?eP5LbI6o(FM0hxFFQfh3vxq48L#Dz4?b6b543XKM`R<(eJ1oQ{hlOLmyR z=tR%VWs=4*K8Ps=2qvZS8TF!2{(;Yie$tiaa6M<*W>P zWO#jvi-96lWXCc%=|dW7+k&C|?ha&aouTVGA*rl`iT1tPc?kzigU9|?&zV0Sibi`6 zcHnW${s!k_1ts(%!`u&~v|W~{AK#sBQO%IHdjVyG8 at NYUlX?9Us%9ea3_Dt&_gpOO zQ%o4OD!Z8j%?|B-;|qLIS36fGonh}f+|l?By1;&*|EdYD()~z>zuZNI00JWUpJ?Kr z#h|jTger)1Ndz5;j>ZrW5RMT77Lu%kJ{=C z)qGOKSfqYWxzJ-T%BV=8DpYnp3nlW61DSm{%8&RkBr`OQy>gFrl~L{M}5i3UB641wM=_2 ziU$&n*Mlj<3*y2Ee`nJM2hlo at wIztF9LadI5TlMTEGF!}>X7cHOw*2^6+QTXpCYQ* zy= z_!+K&_~;$OHMtKS2n)&YXgp-hFboyCtQ+P#DGu5%x<9Jzng?OcpxCk|CL~sT?}3Ru|r5!pL9o6Mf--&HX%QK2nLFmS_e{-RVMVy zqqG2*%BQ2EYY?G&-2aJ}5jZL%OI~c}Qi${8&qkhhoJ~)hGo=cz*Fy1dm4A at 8`k7Sc zvnjdk+^mqd*LLT1r}y>s*Oo8CS9kRyV!jf^!1!7%v508>;H?H!lbo(FpM=}KXtx_EA^A0AasdyxQx)>gQ-D-ZZs zNRY;8g^Ex6y4&EMOrrwhxiWMPwk}=Tc+Mf$mr2;MSKrj^*l$(lQ8xA8Lj7J3WaG6R zhA=rfzxaba!Oz0mCA{06QjBvdQ+`a`{nn_lB#(E7?VF0K8*Jh)_Y$ovFd$TSkX|KQ z)~%bQEhk$Z{UMTXVJ5CI<Rj9yfvJ9I zzqO at eXxmw@XCM%)!8C3(dQfgTkKFVe8zeF6Q~~Bh{7Fa&N$@)<{2YCf8M(&B*`||{ zdJx-LWst*BIvFNY&8^s3eK2xltxt1Ij!x$%>{e|r=h}``w&!NUAA at i3iZBE^dsSLu zFRdie(T9mU=;8c?bYPfHaj!pSqQ1=Df2`Jhn9+ouH?XR0IHh6SN+59(7R)TgeTJ%1 zV2>=LpJA^w@``$5!vXikROAZXhyMT)lcrCqxoNzac*3-`y;EPS`FdG9q)8-vk zdwBHNXM)AyFAQhL3*toiqtK!#;>in|_~_v6F+EW29dCSHytPi32;pe+@(gEt4AUU~ z^vpRd_WWFd(CZt&Q#iGQvyp2eq&9PFv-zQ8K6_Vwnl}+ at O))0Dm at ukaUUIzB?o4u9 zbQ6izK&n=rcyf2kYoRgK>SMJQSyOqmfDX<*hZ+MpGA?5K?Vne!D$0>?I!@HdPJb<1 z1wAC=o!;K!++^B^>5f~^V-zJdSR_GWD2wY<7xN04VeG`flLUH8@&f}sOUnLgGa^h@ z&YqorQveOxj%E&JL(}QvahT8l;(0iUpL&CX^chqNQ3dO`bHbOhd__E0K-pfTe52vhG(NzRE9 at oix!4)tU6fZZOALt# zImu+AsKNc6iDX4klnL(v7a*jpov(`+%J$Gb!(~0Qz-V!;oP^jE;6|9_4#3zPcn{0( zcn18yuypOh($di{b8c9ComV&xb~U4an|N5PWuHfdFFZzw$z`9JKZcA&QB9oC|V`5`z8Jw7$*ldK|n!;x2<3x at v>&Nlr5XD4!HN{p&+qGJ!IfB=S z07-&5hyaO#F^T{Qh8%oX5q&%G{>R6V=lIw?g6;|PGS)9FR{8^XmSmmNS<)0vDRGj% zk+Set#t>ss2 at Ar~(yVJc_|P?c7_%0C(y?QRo8#T|M at c$Cfm}<(#|&b)JaZ7}gZLy% zAEt!5B!3^JMBFdF0S<|{gd8K%BI}}S1KOhV4UfC~J-2m;5-?NHuRO>%`Mw8?qno&a z=2S+^2i1_#RdRyufEv$^01W6`#krqHmua*CU#GXLG;a)J4rX|p5tneE_$bgr`E_-P zg7tM#$n^;(Ex&pCG$dQYHt9-B%itTpOP9s4uf4#BKhK?mh7wUg*I|5_G6qq+{<+fR ze=G*)93GQMe;0!@SRf##|H)#YWNK^gW at sa4?_z0YX>90XY5$KvQnH$^GMYFVZ@=F} zU95gto<%s*0Bw7ZLC`Fe5z;K7K1_=u3TkG)u9%zoQo3eA^((k%^ebrBi$Mi(hDLH) zsmh^vv6KC at i9>3wNM+Vlm+y6J={4`>IRE$87i56)%{@nSsGEynJioN(hJfa2&w$Jc5cSlD*q0q1t{(Ef?0Zo`HKAHd3S=ouk{4cFk z#Gft`8>l#azhO#^rm8m*)ffx%eP{o05LhwVz7!F z(^Us}2x*rZc%E8`&9YulD{3B~IDl#Ufs7`SxD?NX_j^?(Bd~dQx;4;uxk+X5q#=7! z1M&QOKidx at PtgiX)jJw!Qix;wl~bP8{Vn50L>6Ms+RF0}ad1RUVyMuzoOk-S-b*4* z6Z(kioN&H<`kJV~{O|r?u*AFpnSA-vIMftjqS}b!q{spg33z)o}cli0Vt%K^bEi@`|dn+Jbj7Mt>Vjpq)%YzeVkc?r0UX zKivXqvSB1?r`$KY1&IR&=(HPk6*zPinwPc9+lE`$A=vs#=EJs-r8MoUX!EY-UEO3P zcNXDq!Prt*0!fpxRS6FSFVusYN7k1kQLJ!eQ1BIq*u3?g_md^Z=^m~rN+osg}Ij~$b)S<>bqQlVKs zp{~wdsQMsOX?OvejJ{clB0(8``GrofnE2;!qDehmf_)Fb{rV=%Pg at Bl+H-^XG@%1f zHgK2u1-GGF%T5Z#@)(OzMS?lXihc>#e%G#id-#+nzl02RmY*o>rVh(9$>{U-am3)J zQGG>T%%|C^VNFxIiJc(TvSiWCoFX$>oiLmk;@cl_Fa4WL($zG% zgmX0 at ITw9p57*alBA;XD_0l|}%`k36lP=A%HHrF*yMOtI^v=;7m`7!jbRH#8J!)V;yA!R{~E9Ke=GFlpY&fLZWSNgIN-NA?PC}Q zgQh4*&KHuU((-)MQ(YdlxxxbXo40WpC5 z|E5m|AS6<~`{5GzgS=l&xcWC_M~a2s7Zx4~YN$Y44I1UM6+ zijOtQF%3$SLpmFXYlt=4MU`o|6UL_x{ia0eJh~09W}ZEJ#GQo zI8()r^=w7OGB2XI0@=2xRD!$J%8v{X#j?H8a7|{Kc7G~*X-iob zHYn2A4VPiiPaJ at b!MI}SW43kws~xf=EevJ<+QIn0Vh84b*g^5X+d&IiRADw)+(;k> zU8chT3c5F>$P1~zcU_51Vg8ETwm0`~Z*(A-U`HIwoCeZ}$0cFY_uftK=<;Iud6**L zM{FdcVq>kjac;f?>ImT_^8)r3i at p>4fzwg!9LKNvsTxkRnl~$I%rQN}!B66h at RxXb zA)|_%J5P=y$Gm%V%i?=NLm**G%Hr^MB6$=+nf`m#gQ=v9&^|Ius?)cPT-awp5v$RD zK7G=Htt&<}eGg_02tVo)IJ3f6kp&4lBmE7CHgQv3$9&zy&cFxZfLLafA^Ji z3ZVC(B_~G*@bC#uYje;$_s$Nm zv-dd%a9j91in#*oy2F#lmKd{+-PjK>`6>e?+?Np3oE40QB5)<~MS4ty0I8ohk^5_` z33nVU1lDj56{@|!h6G87d21#d{#R-NWW+9cVAMcIiXDMS at h9GcYc~>{B>bRhcsXeJ z!vce0d9%jM5S$XXlTfV^4`nqB(6Fw&{oHZ8_$q2)Qn{Q!ub?v@ z|Ka;)XE7wUtRm-gJm{BrME}H4b{vbCNhtlXvFW| zn$U`Z*LYbk)8s0j_|LSGh9z{_vBt~ACJdl`1Wop>dd3^8lb6hY at +`6N$O!5GX;9ey zMNlq-{xB`+OQInErUENTnYOfgD4*eQN;D*IUqa*b3cQfZNeSosv1PZErn;}|gjrxq zoHRMUseyd(&w#$PFVN;mIcuP-$53eVqA@%R%J>33AZ11e!G*ZBE(OwRReH3ESiF*LqB3-w8?R)%rkqpVNLZ}ve) zJUyN-d3Y7?sMPvOCZ6V|woGO;nf(fx>71;yzwmhdCsf+OUts^oQDOf_R3v-eqmtH7 zF=t`@>!`~xMzv49OQ`@|GEnG7uOXz#x-~z>2s5_+H6ByW at 1wxaXjD@}Bp|Pm-XE+C zv}e3Ly*@xr_6x#7&C;EyFBntlLa~VdgO!$>34X)J(}oXLxPWgV+9 at +nkhb5F|3*JiVUTfO-BwGRTWPN7p#|`zin?zktQ4XbLMwk>#Ifv)tb7G1n zyZMFhe+ce+Xt(8kOr20_b3yd?mJAjg>BT{45I^v%-aFln6TU;dOH@&>$1M5a>MP^H z)x$9dd$`a$r|2VD)X6$JFEBiSQBb4&Nq(r-TA3BI^%}YY$9 at UZo#W1Xg7B|V;Y$7j zP=Npg`@4!YOwe0%tf at e?jnQamR; z$3)D}@8buD4+N6QU8Hlx9|*#e6NrMce?Xa$?2!%XzY&7ViHu5N!9Qbww~>4zlMZz2NhSlHTYdQubFV;ZN+UEaNo*sQ=$4skWy?SZ+)S-{>Ei^Q at +E}x!SbXr=Me^! zqS6zKWn<%D;X>^xwu1Hn&u{s&G}o>=UWJoi&h)gF)j)_+6WbO=L$=HGh=HEO9HERJ zj8=$wsoP6(OOe8DEv5u><{~h&G>ly3`wjDZF&gD*HWkIsG6NL}aQ3%#sirBn5Os%4 zi{fc6V?kqk-ZKSs9C-7WpSjX;Ys)n`i5lOAbLd!Gl^kV$tdbQNWy*-#jwU+nsCT}Q zV7d2$;~D*OIyGsrY1Ay|OzSZ+G>+4vu2Dg?t*SE#geYP$O%Ud1$U^)Xq!NwV&Waqe z)rgCGY0)Y{6MNQ>miY2h{}(SSr&px8Lvm%K&bs+RsmD$|9?etZv3utsPo@<6AcDrw zZ$kNY+h-Gres*- at -(8i8vi|DJgL?aEs8;TX=n`efc4OUtHQv+L$k8!? zQID&;iWns#DuT4(H|(LUIJ3|en9 at 07$7xc=jnG*Wl)*Mn;a z5cs^tiHLr(3PJO?w0L;&GiP*#z}^Q#E}P~R2bj>EWS8JAxTNNACj+Lc00dMtd!(|M zhc at 4jvrov8Ruqf=vwh-(wK05s_jaw}Q~doACn?HEiwynG$xOATGkodCTb_h*qIZ6i zJ<6CfTbTI~MjuIAyIhz`aZ3>Uok&-^+*XmfljqvRJvl31&;yZ{3Y6k6(O+}*2$c4o z7YeVg6!`eZ2sZ)Ihu^$l_9CrmYEZ#`c&vCPpI z12nnz<}S-fMJ-9iS4>nh9HigAFU98b#HePxlbW^Xx3`xqgq^R~_fOD2Kh4olZ8zww zDQ|9CL*b2?(;0O2#0DE9(L=v!_tIOl+$sS{ltfwE&qYnJ?jjEdSje2rKvL_MTj zYykqzAJ>hkOd%2)Ir!QQ!64pB8>H_HVhUM|)qNr=%BH2KBkLQChxlnKYUKcwrxFaZ z=nnhIIrXNpSV)b at Pxn2t66^)GTaz~mMKjRmJoPRTbAAo9)p{>*vKR1YK*aQ%2I((Ey>u14 z^OngytPA}+aC at PK<%RA3Ke6{X^dt1OL&rmfoDNw6# zQ9k=%zy1JvU~II{U)3>!Npz?4o=owf!N8dQN9y=f8_HU8XoBdkh4ggs392v~2$zb+ zZS-_1$K=SmFcbk{u*j%rUJDF{JVrc*cS1X+DdHii4-mf<`dOC~lnG9p<1)A$@6yjl zoA&>B2OtX!$CVitBKqd4IRustw>pd}n;Qz39l{BM7Frd1RB68IVqztn6oZMbL3TxH zK9qEmCo@(T4^mrn+}WZ!lly at rqIqXW-rB8n9~6J|kk0GQM~**n+q$y2&j)O*n2pyS z_#A*fMbT5qP9|+Kd4wXYFNNu7R5Ia;L!ulxG)uE&DudyGP)mx!%K+3gzN&|wPQRyxxg)9PB$+$H-S)$mvlxsr_fKy at ggw(X-gT zx3#3M138A$SSZWvt2;w#Cmv*Il>ou(XgItU2aP1?FFYzABZu%hW~ip-StP0s(u+Eb z=Eu8Ep12(Dpsv26_8iwo#SzO704hvKl9K znq*S*AdsjZyWrB!Bg9{&x>cmrzwvHl at sR(|W2gVERR27JsibB3hfpab;y{sixsgd> z6-&YSVN$xQ$dkG9wZ--NIni-W;)N&U at hOXXKJnRdetrT!3CS~8do`tUXq(|3&(^uF z?e_*Is at B18E*5%FIdGfLbNnix8*yC+<1 z!be!@uN`TgF$AOE=_Ija+?<0;GvqZmi0{)=?-=Cnsdj`4FHoz*o$9HWY8(3j_W}~e zX^}{ji`^TTKEte at 0J^4(yKk-piJ4kv`da3H%bmCPuf5uGfz%{E^b+1ZfF)KIh*9AS zzNr6VHc?mY_sakh$x^-OVT|>L*ExJglvyy1$p&)?e?>=cmGm)t&IlS^#8tA{`53C8L2-C1tm*^TMZq-|TR+U0eIA3$DFM)UO-i)%|mkI;k=t$j&X1S}m-*rMnu& z at UUE7k*`kOksy6uPE(>PLuUM%DC at 9Wa$Q-v`8A0*LoU`WGoqE%oV#Txu{NPwTq|Ut zFE&B$3ZZT497CVeQKsNQHVt{(%sTOKsc!ekfSd?V4)@q;=)Un+gDw_<*0CpM0Y$o1 z2*VH9t;7z1Xps-^!>$D9Z){c)WOsFpTUf1wkL~#KND5!Flp-=Jk(dB{a1lBi|3n)4 z*P2M>_oN^U1qLSY|LcwaG38_IKql&BWB5luMA`Pg{QBomosyO<>N|QtQcZ!@;SInF z%MW|ohpVlb>WoS2B2A-112^B6*s-C&mJB zRp4-}3ziz022ZKX>zipK6eMEwb8H&O?>)tsc1(XI;fVE#)~OeE#?#`3FUxE;$GbW{ z#D42AP%o!Cbk}y5v3Vwm+U#LctIgj{z^-jcQQA!d)P!;8#3Ys_qO<>)L6!AyvI;9# zPLOC%Uohtb^tUUG7^~w7vMC3q73G#bgxX=<2vY|t)wCSL(a_4K`~)0D)>NJ-(=EBV zJNW9lu!-y*RU3Anjm}ciogEvYf%T|Xy7#X;_UzSK<28*39AaE!3InDbr{G1>6G^m# z9`RCmH(5cFVvG!*IEs3QlNQ}M at 3YqxMLXV*GzcMHLKqd)It{}hXysYi=UQ;t4%E9c zgS_zNzUvQ;%1aD|lC;sj7#9NH)maPiwx{cOqx9$um7}XR$6w zDa6mq#2&R5P&KE7Az~NQWSM!28$DS1EM(GK{2UZ8am4!HJ&;jtP?vs=Z0WDtY<^nQ zTlrF-rv6_qV*Nv~O49|YD(`|7{~rie$;r;n%G}uDzZdMEi<)vec;$dx*Anr*Myl{6 zOlx6j3uz*RSoCLp9g5{|r?PdJXum%m`TGFTB9lID*9i=}IyYGpl~e1-tvc?lbh555 zUhkhzd<7%e3PnV)__;H?T2u0)D!OgvAWgwsZW^ZSXS)?b zj?3R$#=+&P{jqT({Q$0bNi^EeNRPNS+$#-ZY8k@%Pz}QxXu@~mcw#pN&56?%$jHJ? zYu?UtO-`9|qpH6 at 4mF{8Ko&G9A82e9L^O|PQPrc6V;g6#a2R at C*Laq at 9-z#rJz=3GUxYToxLK+~ipQzU(VxQS19nw z^)MlO$<9CuWfw42`}Yp`>O92 at E!t=D at NDexGrpQy5{-f`)nt>Qqt1 zd8gErFwB1Rf*ldsJU5Ekck2;0B|8;ck2Tv7vQA77~0*h{t)_&@Sy28Nvr#$$PcRv(?jr3}J zI|W&)=U^#}_k7=)`~24cyqVV=F}?=?{f|8NZw5fZ=6$VTZuF0z{^?&YP#BTy`GU at e zW|_;pq-mXFHDzl at -u%Zz<0VDdClTcIZ!Pzk zT>GQ=XUEIe at VlTV(FjtoURR7%A;4VT>W2{mrKFI)HRk}%G^Znilbz{Faqp=Kp!RQ~nVva9}U z3?EzdNp_FjQx!j!bLV;|jZ=kl at EOXSy{jO22dTt?~Rd9)Xu at ct;RmV2SWxVATI! zJpO)VwvNlP2y#bl#-K9-H9bP_ZeEUg4VtFHu$tlLjnsU0dt5U`;pf6ZEj7VJPa|r1 zg6Hs!K!*dai}C0!J2eM9jZZZj8;<4JW8-Tn9jt9-0&h>JE at 1N)GAKpW8X_oKz?FV{ zj0zHm1?5X)l~&0EY3>G*6Epg4<3lkqiHUd;}wPsI;CchaV+KLdfUfFVjY9K$5!*S zwIDyMf+dCTmfSiydO6lhTbb+Ylu at 0wQx1ivSgpUNbd)-yBe>2(hh`ZX5Q?g9 at rq1g zBQ4fz*oC2|NOCOTK2b7fB1YL&=7SfXThHHdHz0i2rPD;$uB=D85!R^#wH2M75W at 77 zsT9e;g&Fz<(R8ZHFR*(wo;@-c?$h>GpeAcKlR$dMgQcTea9ggk(jPT$wpCX1RahhP z>5r(`JhBkv8T~+$BhP|$+ruwgo}$k(H%>|L9B#)+useJs*Ygrte0=UaP4VgqVhyGU z#%(-x6}+$Z)BI5DeUiQUx at NgpkMuC!(woKuxK{3A>Xj#VK^QR*5IMATvr^Fx;>2ST;NWu0dYl4+3zm7b80GH-0sXCl*jt`2K+BP58JR8-PGG)O(9xQY|6LO=# znHdV~FnV6BYm6;MuDN at HKv=Z=*J9DbgS-yYv)2^6M%g6#$>7^Dg{Fi(qO+_64?hHV zi}BzD;bYpq7!nU0 at 8aWJwldYeYL@V0isYyL50vJ!)q|$gpr4km84l*%iqH;WCo)DC z6xLi(?SV}t#&+MHSk`i6ppRxqo?EJ0 at 8DT}kUT5Vsq?@%6N7M|;+BBrklRq&xrwl- zoOd+Q9SqSOYck at 6el)w(nyQaqaku!wXqzR8QdXNlL-KoHiS94B_FhBCO(BQqgZQ_1 zu8a=6q8Mc&5(W(CIX}tmKoq*-6Dr2pf5s*ke}>v4tcA2lPw*Fqg?oS at l#BnO$)5wr z5kSbcl@{J72N5H_SbcEEZ@{|YJ~BK=(-tna-l+THO at Q3`r9#jx+%Yx!0!nu;oX#!u zMq#wE`uw(-ZBl#%5>luO=(bWWYob>&jU0Ew+GsS?IU*--^9$ zP*Q*yTaCms_sr*O-Tm$BQ~WQO`@}fJve?6+=oBfdw5Hf_rwaRlIkCG02 at SEew{&>8 z{ApGJ-#Lu=T}>R{*gP>DPT$S=7ah+EO$_;!wH$-y*u1koUXMx}>n9V8vB;DGmfYjv z197{W?^8ds&;~M2V>&_?$%NKQ)LGb`l#Wpuv?W_~ujoyiUDwQtR2}l0hD*)qo;7hx zDfF)vpMXK-NWohEbwBs}67o3oe!i5{QBJie%Zl(Uy!KI-S`3 zr!oH;iMZC{N*G8mux*(C=M}mCT_nt{?W~Od?|5XyOF1qpqYu2zJJXG*#`b?}{LW!6 zteKv#%!aO*s%R&j%FT&%gpA6B1nk@{CY8e082|ZEuS-oIiuF4H6omBiVyz4D)6Wm; zKmG7~xMIKKi%S%L+Q(ZRIA6K`A@;O05zP;62U}%o{{aY9r$HvKY>!9IF;Sah=;%Mj zo0is|KWZY_<#*w at sG;ud+rEwb`ou(-g zU)c6Ju_CR~u#r!WyVK^uW`^a~V1uS|CK*LOO|=Zen#ZI~v}1`w1{-PD&Fl<8$>urn zSj4}h^BC7T&_uPOFyE!cFh%G3&@$2RaULo*@RI$T@=(Q0>1){TV1cuvl6zTyp$zF` zm?h3#>ZZnT0))cf^kqOtm9iG=ky6`-O^tlY>;!xl#m?&A(agC_MA&S-A zlQdBG%a$}|6pdIDvfyInkG_DB`wv9q{-<5pKNqHGhE!J at O^0z+CqF)4V79nG1=*lv ziO}=#sE*{$QE?+S;D@^;v5A^~WXIL$bg!a10wW=jgE#U9j39 zM_|mOU~+d2#nBavy#7(T$wFZ29J$DDGM}tt_{RsRDp>87dELTu4ys9x^q|gmH?7oJ zMWwelio>sZv&X<9e#V#TrjnHB?WkuDzfN-;ISx)$c=)a!8PJ(HwteEO3nkIPM51UW zMp2e=CJ^a&$zWF0Z at V3_4_P^0pgbe7!&7TA>JNLAcSICtL^U^a&`Rsy-#C8aAti}oMN!y)`|=?g59Wjm>jD4q90^=EfB-xRCfP^> zHhB$bli_J%B+$gDehDG*N(z0Ugvmo#cbz|2;LGPkr1dCwH_`hVxbTCZ+ncWQ!d$bb zw5(S-Gp!ZE+P}&SvxCm+U^+)hCsr2|c(hUJm?3F;HqVxSJ5Au}gwAA~}BAtzxUT%W%}dd@>9l`3_o z&yVkU%8Vj#VFz8=;)Wtr$>`Y9 at EGJVeYJy7ro3pGq@P@%T z@&Vm}bT6lRLWoqEu75IuoI@*0um?_S&45rxL^c4Whas8yL^RXdo1z<4Kip0P9kSQ7 zURzhq6mPL+#-z(mS<08q2CFn-&Ujf>!Xd#~5-OK8HHV8DydgBR+*f=_TOR5pa~8m^ zG&oi^SI%2CBkMV>Y{W;ag`?$>hGMEw2ZfiVJgV(5#FhkNmzYU6C&SRtP>svGZZsSU zi!&+H2d^lg!hK8vT*j+G#Z5OJ4J_qgq6379^*;=EV9c6+eV$>7SXf!C>MIs7~8lZ$Bj^qW!hC-Ov>fNVk9gFfEj)hgW<}Mv+b8*(m zft at RJ1OtzPoqQj*TJ-qSBx<#Gx2%>qiBi()v~hUk zfCZ?+dJxt~#8ZFk9zx*UR6-^4jr6{UH1Rf+`nEI4Z5l-qfNx)Ct$Oq!id=|mYqxJC ztO-)6EY6x_xC1%U?R6GmKeQAQVpJ-=z!ADc*`@?uS^)G0*m7DO!cef7yC=@BJ!;H5S^K at sH8@+ME+G^xRNr}vxLHcDi;0}= z$0X8Pcq`ODNiGDxD6;^Y_5f|)C(=GCuw|G=5 at Ug*Sfb9=5N|aG at HEqIWd=;xf9=M6 zQ0!Gh?d*quT_+;dhglDMknO&I5bWm4CkK&UE2`}3!E-8|4c=LL4=1cAU66Vkobkmo z^`R419Fe0|n|g#m;Vm%te}FFYJ45sslv8nQ*qQE9a}lMH8cyH~Y892^LvfU7OmaIt zr=>oO6&_A?b!*Cbnr=_}W>LK3ywMkubgp=>op>72dUnz1=I>tIg-IVeNieB=#XZ?0 z4eo3-R!zCEjK5 at T+l+7OIpy=|W0~cX{!_Hd{rKc_QSxKtArQO>ZJFTb+vV at MxK;BO zy|NR1m?hRWs}##MskYB3?vrtmc!h)^^hBBm`=)3l<(}qFzN&d_aBOq8{NFBcWi0H! zcPezcp#~q&wtP6~)yIjBKLJgN%Rq}A68O&?ezc~Kyq%DDe1WydvK7YL3CXC82p%*U zuuIRHC;djy&8bN8Ygg*_Nzse!m)teX=}9-(n1!9+oqRKcMGcjz&BagN!s9l1SgWEAnJia*f-eswx at kh;-p)^e{hNGh$Wi97*z- zPa-69n;)5}{~Vw{F(MgZO2fi0R5u(Ey%Aw67@q~})Orzgk+abux9V-kzb;MsI^*! zDh&r?8&i=UFL2+i%)=%UGHW^)69E*bPq1^myRf#D&Db{8o ziy at YT_EbiPzHbt6?9y&6C5wG_bmNn1du{2N*SuvoDh&Qs4ndaWHcKq1I~T8`#Kudz z!q`=Vdk-9+u%bvRQRnrxZ9KK=`qLUub!?*dt(Q1HGgXKHtrKuygAQe>SV4}00s5~v zC)7`0kWmKQN{}t0<+SI+L_)04q6i3e_V1FR9oRDPjLc at HA40=P;#CIummAr?cIFdFURCASD-{k9*-`y{yDd5h- z=_kvP;aXzL9WPzz(*jk*P{41M at vnUI19wM^#k+a3OWHw}KpMhYB#(v1B9ZBuZbcfA z?d$yUSE>>uDkow;9fck`qvj%|fvgH%D1Pfu9 at et!3ER zrPQ`%*Q#$0mgM~eHEU$+xNX^g$qU7O}m|eQ!?J-Z^f*qrC zz;*;Uq#twHaIu6qEQbpRV~h-)4>rqj%r~)gRpZ{FH$&pyZfW7NYpOJw4$)^i6kF-) zS%fNfI^>A>>F1*i1Na$2n4~kl at l~vS66tl$6c1S1rvH3Hr(j??OVWVbdHrNJQ-r&L zyR02;Ly>z8=^bRDR$)UiG>P*WB;^?9mV3$C$nU`tDuTc4Nh+fd`iKNNv`?%omi(N& zhh1UDO=}wleX3s4BE0FIEm86F7ma`>-|-N$YLR070%245Bl=f%>3h85 at AznIMjADW zg*w>~+psRR&fH)E1cT~E$(M>oJll9arv8+X;B@*LL{&_qZoXcJcl2`e{^zgP`61Ob z+xlS9OruOolPP`3=0CFpxfFvtnn-&@db|#-Wvr=_gqrNPQHl|-IwBXzF-ujDKk&cLI(-AaUU2{ ze(KMe9PoW$pIMJ~+;XO{Mvb*p2qNvUB0OO|l;M<{_!L6>8-Gb02_^%12?fN=Jt?DW z at FI3~9RqNZoTdcfWgn{Sz^96d-4UOXxPpCkTcJM9GoFa_33y!tW-$;ePYNFhR^c)S zlpW-W3$+CuGt3~{WM`=(efKsy?9%IdGwBl$scTyC?7qS4woAFjdW5q*q}}N-eDp3J zR-<91(HDWS?)@bSD>xeFuABWvq9TgYi;4a;i6cfC*($DUpXues zL1s7t_h}^};h(nAdhLRFSpJs`vi_aH|7e%KGuWsa0+a_=$eB}Q82JTHAEK?CZ-K73 zy*-V%+-Iz|Ods^N=`R=bS(ll)OMDCIg7U%ePXx8l(m)d_tfrmU87Xy+cLP);Wa z5 at 6oNEd9TmLqfq)nWznEzzEME?J)0+q(?$n>&XBkb|%=|c|$VRT1qlw)4xyXGi7flA&eO|Iy*!DAbZ=v9l at 8QPHWph?3owSjQr+;?OW z3wTu#ZelC?PKqOdMmtj!C;qE?Y)%P%H~H;L5<#Rg5ZIanSf7L|th=eyn+(MW=RvK2 zYOUOD(cBa(E8^p#usA`dM=W0o)J_#(lfEaQio-{FXRvm_q;Qx zYPdEMqhEf;ebZRzPW#SaR`D;4_Ss8y?VG61IzH^Brn0S0Dm#1pTUE$H(QMTTB^4Wy zw=?_JMBHWqAnMZ_%ueIdYu#6cqx`U#92O=#?qAhOaml!WLWB at o^U`l%cN z=#&@)^VNKX7(d&1J<=!Qbqbh8M-o3pdLSB&%j{QnQ1B;$FgDrI>i2QpMu(!!Cq8v2 zggJ{^Hv9_ih(xMeyh5GbT2F9pZz7#-7>|1o!_y z5cn~YTjDweJ!?u4#u&El at 6#tH34(z`^ef-}b`1kv9R~?o`&|l{g z>46IP^AhmP-(K~?wkJ7dsR1z(+Z3{C{k_O73_-MgtDHxJ(;I{M&HE^>A8pK8gt1td zI`&XplVv9)qbO~7iBwV->&jj_uZtX2pZ0%c`9M%@@?gN0%S~42WfJ6I*tC$3IyZd<#1y1+Wrpcumi0g+g_pVj?XNxx?cL{U%*fftztk*3X z^)f|DWTm^Ho5v6nme=jV#kzpIZ?HqmZQ3U~@^Z`x^aEF_*p*Q=o$TvmjV^i$qi8|D z?4_&LNo6kE7sPKL_$f!M*U*Uv7YfV(YljX4ae}b2reyC(fBq at zf+Mg z46;>`{P7z~v*61*?<1P{;AkUK6~w4j-V&SC7-%e`+!}Gn3mpu#Y}syqHHBD<7i?Pl z;art)W?p&K*?RmUeEOtfbYWw&J3zh4isW{Q7qvi}aa`z>gsTmRnG8k!Yg?bAyMf$y5K-fY5YN z6LjAz!BvzKO3Bh`tRA8#(t}X%$p=Ce-Po1HsoYo%$u~x*i;-|)GlHUKPn8N1dZ^T+ z0@?)IrGG}s)=s9;7q7RTCw>4VJO#3tG(Wy+Vx47H*}r)dM)O>W%@o>d7gcQoyc`M| zG%n%5W9uMNFjz7$$bm4}Xs(2W@;o|uzhq*!6r+)!@h_9Ud;6O;9J5jM5jev7^bElM z*6H=^-(f=y6!`8L8bH)53PU)p4X-!2N$Qgo7SnI}`c*L9#v#9&$>qaipUESVz;#e;d&S+v;5OWQzzbi_Mn&1uLCc at c-Evpw2He2r2K)z!BQ7mlCUEp0BG zEL;LgicE at 3;C at x@Bm1JnBm2KM>iLmX%Wa&QyXHw4)_ zxc$9`toZx$K#6M#i1O&@;9rp&pmvJ0DRhOIU?hZr!V+i#3SULUO95`#-w_Z(AN4EGOmm4%hPO1SPl z&vAXGf`{TrXjQC;*y7m$WoQRLp2t=NOdu%GS??h|)KLVt`*8T~S67T(f>H?Dnn!V5 z#}~k^f^CeR`cW{8 at K%PIXrMq(2He-(TN()3?=*ciVH%gLD-<4WOP+5{b(UW8W9R3b z&&H;FxzaTLGXhBr5jnAHG1}}xxtFv*u1~C9cO9*cUsi(0&B++;P`EcSn~`-w$4}Yw zuPky;e(}*fSrS~O%9D697-u(MeUM-@*DP|kx{jJ!vwrZNCHE6g@)JD>v!0lbZgf0w zKo?1*KYS9*(7l(+DecM$L{~*9XQmsVPK1NdF#plCS*ZhgolHD`k84`}9Fa3L-KG<= zzUvC`ST@{%6 at G0$#47s5MVXr8_;zPRW%N2DoeQzQEx)WT82gHr%l_pDIsj*x!aRB~ zlgONbZoC?;x at yT#{8^;#1$R1MD at OLU2kRG>VY8%y!f#5UNV|%2EY~_Vo&;XOE%;M3 z9jqc8!;0Pcu4<-l5|NghIF**Vp9<}SuWOhhv9~y+o=zK$KYZqSZCZMrxnU3GNxj88 zi^Y at 3Z760-9prnt0qKNwTq?6eQfZk1v(`*zX6cJ*kihmy#qUpv~!*U<>d zU$y{^=#dkTn^kP6S?gl)TB*0H?MLjliL3w_b=ZKeESkb7TEG)Y)ogQ!lQheT?gop$rT};Ufsx~j={X_bw{D1enWzB7?fVw6DU9K z!)nbV))9&1InUL5<3ywKl at 0s6MU+RPB0 zYZ7{EwJ8y&L?LUq(915(8qw5o$*OLBG-*G>JytZ~!W~e7GSA#2|9deeg~DUIkyqXE zN1_oG!ds4i7 at qS;MGm=#ZfWNOgpAx;@HC`}djta|_s)!j0E7-GZV=T8aS4Y~z&)VC zuY;l$g6B{G!fn+RDb7r3I==zlBR-PgCMI##Ckp>2wwDLA!U(vrEIaTlXt!E;D7KO= zA0p?F#``H~JTD at E7^5bE-;WYF&>X67Byz{&RCkJsS)69)WK~C3l(#j+wasCqmk{Q21mDRB#YqS3-5R6^ zqbQ7NaPF0elcG at _dY03Po0-gGmk58-;6CbOq)G&8Rdz8er&M0y)m()`LQYbqIfMtZ z=qJEQp1n^$(INAb_jjWKyT>4KtxYy>u)nfdI>^uW2b&fDOEy{m&gQb*j6BvGez9c= zh61`s--t*cGd0ZGfe1Rgh6tOGi6`A{Ge(=zwA0br%b#fWs-bQB%US$3j9BN2VCn5e zw6$)$zCCt%%s6*`dR;zl0_(RUN5D^vs$pAVVj!fL7T=7Bs^cDK&cDjM$fXX->{=w> zk1>3VqSCllI0%i^!J=U?W9{-9uXdb6^Q=_W*xB@}J3uqNx7y(Lo`U6jT+y>oSS(|C zhZCl&2YbClmCL^0bT!)`!7qEqF?>*xh;H6~WJS@$gpA8hMnwOmbz4+Woe-<(9Zo{p z!YFva6ECAma|lS91+=#LcQ~)R$QW=aP6}7oG_|*Ej4)%1Z9x`D)`G!z3OZ0--z}k7 zgr9|VlfJD7yu;~SY7DJPqdpiJy*wEcDvg!Dq9c6{==?Emug7~l_dt?e5{^o z1se4r-xO(hhjVN_d8Per>mAODS>cn&IeK)V^3Fg%vn8`VSs4-CK+KL(F~J|F0kVN& zyzO)%$Xqd)Fh}_i7G-jDlqQ;v?CVJyu{93QsAe+J&Du|ZEG{!V{wP0GUIh)gCvTexW))+^;f at O=JgncEz z!xXn;GnzPHu{R$J2<#F7Nyqfaa$%)9?vq=D2~1w at coIoy7m6K@hy=GU9hzqQ^OH`C zWCS%14*zIuhvPXqDJPSUTH%dalQ) z{~@nCXYHxXL7}>9fJ@YhZ=CqekvPFKeo= zlTH6Ts>Wqtp^aIDa~VB>yflL(t?;2-e?rJ|kT7(YwZ at Yo@#}gY)1^ZgcOZ%;dqPtN zjT&|9VJb&8Zk|!sPXf*RLO?7*!TqziGx~lNPBn(?_CF0n_OI4mTD-Hl at xNq~?H_C^ z&8oh$8Io2lid;@~j4!XR0Sog>vT+cYzKAk~Vv at lhyKAD-s`*C-mljK_h2T~se#|j at tbN7y3^A= zQv#!wubjjN)VR-BjKVT6wxEK#E*p}@o1%7kat*9|b0}$?&2vYyD1O(_YNeNxp^||DRpqV<4Ay}xA!_e?Ig_J{eJK#4B z(;J%rV-3ql5OI<4J|lMbFQkv@!MtV|9A&3;cG0pk7~lhg){1^ZA+^}Gpz68uW%dI{ z0#-krZdW9&M4l?*-1^I&h8iBo<0+s)3g at 5=0#>VBg(+T}ARsAEnI||cToHM4JDNUEsi#WQ%g*ff`FgeYm z=`bB;yt{^HFLkbrM4UI{Q$i#-;60_j5l|k8p$g<2r*-$~TVt-;CM0>`X2nOg6lxpv z^l|}c+bA43<#frNz%elh(30#@s&$B;B*PsM)zBVe5`U9N#LgxQc_GZ3^A_YhGOfsy zR**hXb#)Rez>*|o(XFfma#ZcY_befCPT{fiEb-rf$3i`0 at SS{4H~C>0 at -p>FlmV7B zDIi8TlgNeIBDUB@(otY>5uTKhp60PE^tTy_Ke;SB8))QqPey{dA{+HDr``@d*0Ox&*w88&m3_XPhq`2o!_qlV`0jL(bw#eh7 at kb1QPDC9pLO?3u#Dc zuF(jSBna%-HrqIAOv7hd4#mc#F|a_+XLxlnB{$_SRI1zsw2jF1oI`?gu>^Ni{Wu^08S$NN>Sbd)J2jXA$t-1^p>HkZ*XUp7$7AxI9>33DyTAX z+`9Fd!zH-7PT>D=_KxwLwM*V_cWm3XZQFJ_wrzEie{7>;+qP|69ox?7d!E^I_P)>a znX_kJuJv}+?_2e&byZzhY8Z89x-pygTt?3+#|z!8m;m!O?OeSDktkzi8v|X395>%$ z-xMXkk)qJlO5cA3igtp%WK|%rZ%tq%R=lOG?bAAw?UN^w# zp)oH!s{;%r-UAN772a=d1q1;fc8_dZWB|j48rI8!_ysW>mT)0PlcABAo{h6v#cD73aVrUHG4E z^wvZf0S&sBY(bTi6;zI%vO at -5zuFxTnu_VUV3JYzEsG#MnVUsBDUGf3#u%KHH_&op zt7d>;x+e-8W*K*#MZIjEqV0{$h@(8KmCYUzxKP9!;D6?Bz#9X4+w&@s{JwFMcJ=0i z0k0D%g}?ok;dHjDT#qO=-sncM(f$jH(s@{h5bsKaMMRCEhe&)~Q zNv_Sa_RScEF}>3mGyzC$CuH|tDu-NVY%MFj{wx+=$#6urf>})2OtTnMcUYL at da;xQ zAY#3Qonh0?5^ag3tSf9Zc|DavpE7^Z-vH?N!woc|GP1I+m3}p{Gf0fQIj8H;XBWfc zL7!q4=%I1Ga=rMMcwnR(B^}Du at YZaH;t6DZGAm>=`0Z27dWa@`B8W9aDSFFjNqv#W za|>DR(!+T3KXHSNlMhGnVsu-|)1SZRU(o!qd9F|#00*0Pe|h^%9_mvNIZGK(nH}Xm zxA0?S+$qLPxdU?UTjW%tQj4f}7{2_6l7NqpU8l}D!2(&(XEP*Kg7CuD+f`m1O%|!& z4*T%NL+uRkly>Kkb?1~&=bGq`hCe$~_386OIKWw0#TRm>uFQXSg5(qXam8gz9TX$I zperVZxv421>Campuc113GO0*Yqw{^%I$f2m{kf9QDA_Aecq*1NM;?Q=1LC=mpc2<%~?32PCY0cK()5D6PdnD!k1 zkBlpqX?=lz{5;!gQW7PJZK+%kKkirIWoC at 1%&CL(qh57-oOpRTe4qUMxEf#nMx`;{ zHzW$30#F@a*>U;3upR4a$wN_rtfXb7zg=B0fv zH#F!z2u=UlhAk?h3bOgA!Oay9lHPTBzT}D9G-HAe=38T%&-i9lt2ES~D)n+l!_ykZ?!{$v-&KU+ zvvf;q!|!vA+g&>FuRhNbFp5x~um8_u&f|s6rpS+?k{8LlqkmJN01h@?yaMf&ddT{}mE zdGZ+YA+#}>C&N(^d!XkEhG6f=lRiD!N(AI1kyOz9%mR<1Fjtomn*WK#nJ}2c$-zVwf7^?fw0uth>w^JVmG827SYm}aRf4xrl?4e;(YcKGfEX&X1V>sBiP)Z1 at Tyq2wme?;s;=w5TO zYA_<{<8 zd;O%Su|Gr%|L(L$PjEk~|87Pw3EeAMMSwXzZpV(C at nV7uzN;l|mLc3A;-dtEig at k> z!(+Ug$zF^@@j&x=&0xm&M{h-y*BNf=7$D zhU97zSl{>mTFs|-xt(j9Wo0i{p8d87NQkFwMyBK4TXt z*wOv{*A_cs;%}F&2 at 9Ow;j$JVKj0!t4r+oga4wB93_K13{d;j7;Bfi-tCJ2M%X4qZXh^VlVs-m92KqXe?Gf>Ut^-T{yJ4VtEKeK<=CEj!)O=}U%uNu=(D3n%|Jl2w* z$G?V}nqNnWLRYd7szw-(2+|e2_<`kyI(?u0uj;(tXV)_tYy^&E3Si z?M%^><_+uH3D-WDz)|@1a;jWR>N`vgkX#fgMxDO#P^=8^jogkc&EmT z77}Sii^(c3w^fW;WWkA#rot*;ON>ouq+7^Zj8=~4xOf7-(Ax%KO zgUPqOA);$a%PQ~AhJ--43?jkH`g&@uZ at AxzDjhikaPtABF(&9{5BCLZ86;sOI5E?V zFpbf4=F(aWrD$Bx34t+ z-p{CJAWa`D+JA*4rnD6Yodn)!4aYE5iM)e;PYuUzq1+vY>7 at lzVhq!cu4dSyl5?`- z at 0CU6ADmX1Fj5?xzJW&V9*Cgw4c04nhmBsMygPY|tF;s}2ZJ!ErKK$v5mtGN8w|W(S0*;<%Z(cZY{k_Y+frweCL7 zp-#@!2EUOAd%YA3c at WrjtFR?07dEU9B~T`eon$RFaX&G&A%B?B!*mY5MYwYU*t~uv z!eRJH&jjj=kXIlv!ds?!+$inXaagWve-zZ3cjL>&u_#kLG-mCs&&w(CB`l>xs<1Iz zCvVJnX>aPf139y#v3zT)ci>8&V-Z3L*%q~pKx8<1HJhkRJjQc%V!1I^fg)nF=N4sE zp6h5PS==)dj|$Wn!9i#Q?IBHv+k&0!1$(~v*7>s;_IytpR-j=!cNm9jXQoCthMQ$? zMo_L6S(rnRd`j|jWGHX}kIphX?@>b0D{-x%6KJvhrAw9xG>IcHM8fE&)?4T;KPmXM zs=HmUTN?inVxb-AmCw>+ at V>(B>^OSd9)XtBh!NMbiGHFepvA_ z%rRGlQ}ivLI8;xrb~!4ceNGTjS^Y#R?H6G6p%J;}y`0BH-q44kcR6u6q~;2p1rj01 zlGXxbO5RdFHD4HX5U*+ll!DPWkm)X4+Ur}h9=K4tm(}^H49u8 zPISQ1`lX_1(m0$BF^ETle~h^yN$Zl7;F+P|8PUU<#5SNgVpZQA{G*#W&`t5qq0emJ zdoC^ha4Pz2Wyl_Py_3KdoUjXENmpq=P_>T*qz*N5M#1Y&mg`xhaFiw%NDd&IjvN^f zThbXR(A+WmnSq{00}YQ?d}Ww>WoY2N-HCbnWF6g>oZls$;~OQQJ6!nWxZo1xd2~^N zPr6Va#3fhaBE;*4uBaZE{PmXU!YxPW9sGNmP4DxOD;A1_q$B%ugf0wzM(Q5oGVmFJ zGvUU73U)VhvHwS;pLTzhhJLdf>VwC*X8)GPPGgs92VD$+m1PL%?Y-RH2T#_ at JR0<} zTtieEuhPmq0(7lV)%jqy74T8p^W6irmj|vYmm2N3imX%Ebv4Rki7S;^ zO?iX4oj$u4Chd9kv4Nj>>Ibk9UOJLIESkAO_JcE8_%88tNe;d+{w%0H4J8Q1WCXwRN8W^5~O(W-2kMt^CLsiD~1R z6;lN=d2LMI>s`*kH9S|ve57OVL_2NDg$&4Prh+~CQt-IPJ`UM^5aG7RlCGUSh<-UL z_qsGabwGV=#q$2O7C5&o)-czNPh1vE39ZsG7qveOA1HcJSuHkNts5FG+whDRZDl`~ z#QqUKv_-4hrxBDnD<28`sLCWhjQrGYFr~kT3hOP?n~*AX`+Mlcuc at 1F7%~FBW29IliN~y>)sWXc zw(o`25~leR$!OZhp~b3{-5ffe+x2)w4t`5KS5Rk@&9*&)EgDqD36Sc zOy at X?J^dMr4{(!l(iY&VyhNsRemU`Sn0aN^mG<#+bWQCKbm>MMWdRHd%nW9V$pkGF zt{+GEE1QDRnZ`pqGq;(7M6deN*6}N>@dRm3 at 7{WxRJ4-NT|}O{MG>bx8xJ8IYxZjOM7kt zBXrDc$K6C=+$}2MiXNVDl_fJP@)#<<0_@?+SL*_GWKj~@cd8~nOuXkN_bWyX+b{x zh7*^4-fa)u0H2NYWe?K##;T>F&!is&O;%^`1R!8{lX<67qhschejAj2sK}cqg)5!A zsy-Rj5bAnPaa)O6vLkg3y46Cc8vBB)>r4zO!sJXaMv}HHfG)9WnBcD|GR)$eM{M4- zK#PK7Z~=Dq57 at Tj+y!&fnUMl|<&gvQ8hI88LTNh_vD3;QndS5X>{9}|ue`^wqi#Zu z;Xc;-UEF;#q7!_XHpWHU>aARh$N z{K>I|L0JrFpx5)O_{r at w%^v z8F(6#N*EEQ1v}j6M)X-|t*?i!Uy5s3;Z%b19XN%W6s2Ffezv|dj`hAHmzstvn#W>w zgAZA4y1vy50k?UcN)|APY)0XM at JjMxiWjBUy?zd#ZZlU#;o}TYKg2O&1%tWZ#7fX4 z`W_g`gOu{!BL$@+Dd3B>Uh|~M)HHC;M;%6sAI at Yaa-c_Xs+9V%@E!<{BdY*>B&;YDRxP>|;j{je)*9e4JqB!N+J2_R zi}fajGWn;W&5%UZ6YDLWNStz6oU;+e7fKYuT2 at xpUl%5<@b%s2Fv!FKT$3-e=;+bt zR5m4T>5 at q$XZ2Sgh8<3lh5D?kymE4$WtLj5v at U+(iuI{#p)D;yO}IEo#HLxU16+w7IfeTM$mXj9wk*P;RW z_DvH0zu))$PthjlVr~6Tf!3%#?erhx1g^B}E^}mzw&}@wg#HPD7SaaLb3nn6%`Xh{ zQr%|43qeF}anWS1c-&+Aot^+-aJbB8{9~8~=EQ)2lQjPD-O372nwOOGG%n_~&8J77 zx6Z3d*CfBMw>$iA==SvC2vUsJM&f;mK^cq#3TQD>AU7DCc43&Rkj)6?t;s$Y4gV8duaVqij1cx=>`idSw*&+GxOmUIJeHT3dXeLZO|9j zFo6vUn-p7PDVTF_`9pvh<4Q`k&R8uRPL4$8t{oWi at UkiC$=C1f)VBd*Xrp4AUDNig zs@??nqZYDDRws`ADi2zw4ht?tHeRZ1s^70F5a)h#p?A at Fk5QGMS{g+Wt{T1c87Adn zhftZ|(w4L8+Oo(BK@|lVl?`F5_I{FePs>(O>-6FE7pxE2GybNAb;D3x$0w&-j~jgK z1+HRY+Dv8@%C74;$D}J9BA_Zr<+&xOj81Zx)9n<8*Hf{-B875ri!AW at 32i~LMoRkW z5-4IB!fjVS9kmO0*Uh-$(Di^2WH+*u+c^n+514U}K;8tQT}SO at 5d4G{-Az_iJgZDG zN~lO)$C9#X`a$M3U at q2&Sd`Ozc){k8paWT6yt=(~FJV$$vcC7W7ON}uw&rGZdTzHJ z1xk0DMe5-u<6D3wJD&f$VsRPO<9OwyiqL<(XlQ8 zUw&JFkpV|s|D$09or9BHr68t69bu5gbR;8ZmZxzK-3#cE8)zEwJxMIm^t-_>wC(IW zi5%x0J(0dRPPU-=2|SKhbSwl!3y^6kzMX8p#l)(wQdSn^8#SGTpMQh%hVB4c at i*m#HiXCFRy{~67%QO zb%k0du_O4LhgCd8b_9)IM15~Bo6w%7e+zvfP?3o1IrO9e;=OHZ0{PEB=}{ze2`Y zf8&e6`P}BU;MH)zJyie62aD+m(Mkh6%XixHF7MI4he5vw(4i25mQ$i5TZPbDqS at xHz z^pxqZ53)#*izj*~o^rq08;k(&WXO+>Mu+$O>j9nq6FEAAMJ=A~T8XEi-R|k)>cY+~ zVR^cHy93-`F%@2bc;jA}=^JdD%!|Pgd_9P_gCbHR$ai^;c)}go(X&K>vpR~|Bqc)W zB$n*S{6Zs5v}bRCx`>YrR_7X^1nF4HR8 at 8t^n%Vu1eFTXS#2&67pNChGEa(Xx}0jz zr`AM}PQq+&Gp$JS|DOkOrHnGfO8rP at GNU(D7V)b{}W^Rtal}&+;TdpN2DdX;Xb+9dNp?F zbZ>Y;M_eq7tFAiejOKl%3$?A15dRH@$+g0A2c!LfL(x;}uA|MMLmT?JY}Yf)P>2v@ z>!A7BJS)XZ)BikJLGMA>FjeqZW0LLy>80f`wF-)g&EhIJ{0aOt>Y>3qJX{NvK(*wP5XZHlM4l zCC_4*9t&tgT_h?w13`s$d`b!&CLeRFbg9l&TdCGvg?xJdc~0fwz}RvHX|YIHm9K^@ z1tnlA%wylRL^@XlB?-uspDHekFKx z+6cS?+j-#oguo@$6=R%BC3&+oDGs9e|Jv|;iTo}n}kZ-*VmTKE`9?3nV2`MV?s&niawY4+uL z=24x8E4p&NL7fNuF9T1*2_E0J14OgKo3okuea6PKScU^wbHUXJS9%%Y`jkMqL_+)! za=CsB{HMQ(SbtPs1o*GDv>^YsIs3;QaS7wL^8zS69%N{Z0FCQ!Ja92l at CiZCWJ!4&Qw0`M;jGul6agv at i>!qb}yge zPL8o?BF(!%+TN*xKh$B|!yYKj!LRxX{%QJS_;QEhw3lw01*BXIkb z;V at p`C{;JH#gu8m&ors384t3NzJXRy^^ILr9RMW%CiPg==o@~{TGS+&NbYC3$r zRg3K~c8i5-GtGCUc{^iXs*k^|;kUPO#`pdcMxTFbQI>yuvenMk?4Of>`nn^sI0A3E zt}YGqHe<9b5)f1Jfq#pzbv^+$_Xtv5Z7 at twN+ZSrsD*kX`moAvY>KzoCjq>qs!l26g6^-E5BYEEH$34Kcw&kJO9+6PN&c8;vk*Vm zehN{3E{H$l!OF;nCW)p2_IKg!Ycb5TWA zCnEiI@)E8#zR8e|Cx)_KfDSTiDX6G5oW9A>kG`=EIgMS6)m2@$<|j at 72hTBeSe>S8 zxj4EGPS4V!p^P;wzhn&gfp475t3&gaL&k&W^t$w(aC94$7AcvT3 at Sj(G*yhdm@@H} zm!(r?gcm72JF$I;Tdb-UMW|H{5${-(F)>fu4XO~WUi<(-mV9H&%=1~53dR%*gDc>U zm#~dry0$DFDEdVfZ1~r}V^1G$P*@uHBeak@>2fCeh1o$y(!0`; zDz)3J376_u`D=cAdZGFXK&d{X#L6KJAGu$X2X9z?>RI2vBB>G~fY1W}?+x z!%Z12)?mTPvad!|g3Vua)%mIzz|ujqZ0H%GFf8Gf`j`8JoK6>Yic#=)q;ze^x8)Wp z#qHvJbcO!>fhI8k7bkKH at j(WupLjTcK5CT7q|P7Zm8s~)Ctgm_#}5dVmw1hHMv8JO zZAMV)CbWlPY;=dAba}++T_`jP^363t%${>YBNS-+COOAQGss9bx!>T7SU(3O2&^Ql z{tScuP1{oF00|tuh7?X-B=f+Dh3#p&{Z0JW2QrARvw+?JP*i_jr=&pNC)r7hKdx}H z=>|pWE9%@d-5P?rR0La{hErf5&E at QMeZ~<@{H2pl9=)4aHjB6X0enz)m*_z?+w`&) zk2n{PIL@?6yaYF1#DOAD at 4n6Ye#4~lfC=MI>ic}<Ch${J%pqQ at yUVo(?f7QNwtepCD8BvYJ~x~fJO`Rz2*XO+IOARAX2WI= z70*>!on7TeRd!3+Pothg>}R*&C0X=7!#8!)9G5TA`wxE}Y1G;qSZX^9aUW;rmL%Np z&!X4O0L)Vw~#NPw5t>#^8Nw9Q%E=*y5Upfr@(YIpVgKh{%KyCuW`zql8(q#1HiTm1a>= zQ;!ROs$1zluekmvG!ry3GI4VHC#DsuZ7XA|qI}Y|j{<6P=afXgYg=gx)l}SruK|X@ z3Rq)_&?Y##IK~}ewb|Xc-vTM+KY?F&0_j~}_adU1qg}+rhC at ETf8;MXxuq0BDrBU} zJZAAeZCv?ow;owPu5SDBf-*$3f0XQe at Z7c}y_{x0&&T+x+-daWHSoozkis^zZp>a2 z3U4*gT)ttuMljcyI6{0fl!(azdcEGEFC7eSND5LC<%SM;jx-G2wWQ}AWSIY@ z16ZwcncKf1m~;`!1Ap5*EzV{ydyr2q0sg{{MT0nPhJd}A!B at s}?o+UrHU+*F4imta zi(d>;#wc>|HD#7KM}eqYsDp3{mA32)Xd&M%pi at ngzxLK5Z_0M#JM5E-l#$^Zkd?)DIAn-r)jR9pm8;da~$sY!a0+(Ub4 z8Xh>w1YMH{8F33H2IK}-Ws0_mv>63F_}E>1_bV^cX+DG#$y|c$qUlKsRFH#zmh7yV zLt36u9SvzY?+L+MzjRzwf at 83^x&v*%N90hboJG1^Wx{=o$ZN5Y#Q1)wB>seKkyEib z-IiT+gyakE?~3I%=dLaIR9tlup;}LfLIK^;JShC-!&#hjmG!LA(pMGcvF_H4Vs5gI zcA077o^_3)Q at M}{_~Dk>M(UgnJG^8iW+QxzT5PJ}G}kc`uBab`T5pT(yTc^3dkryP z9ud4~nJZC{>lJX3;IX>J!s|4NM7r+k-OrAjaV|#v6eYW#Ys*58*;@rlSL^*Dr{8jB z=%dCYWs9XIz_u1%!rsEMYnKXg?6VUtI}h2xfm>=Z&-Rh`(~&M{iMGG$?5biDowZxx zk^tRE74$T-UhbS2bskMx&`7qW94v`~1MjjNtBUe!Uy{|()p^hjw;k^`JjV2t;AXv9 z(Q6O6mNf7JX+R$v(A--_F`uZKtDloJzZ7WmgZY<;-ysPy3+lunhjZ)*S**-)YYRo0 zq9hG=)ht4ny|$&1xtk3QXfo+wY=|1VBD9E2+(=X{BTKc3(j;xr at KK1{$42b{O47y5 z?@fUb&-Ae6+=~Pw zqralhN3gr9Te-xv?)660CEa~V`MM55Zlt%^Xc_#;8Zr{T7KyAhIqLn=?wWysEfzFZ z6?;)({Ade~U?cA;*BKcoGPq*3-h*6|+oYO=-%xSSEZy3#JNcHSw_7~gSA+hyp#5Ud zv)5SLqMFzKaXqqWFeC7H{&YCSi^0B`J1fH33GcA(7zY=nN8AORz2`_yp-V>!FQ8(# z`~4~1qUxU at NHMV!ejy9Q1^I+`thh)Rhc4eF1wOw2;lzEZyuH!~aQ|rx#;z70P#-l1 zG7 at gDW~Pyf#jjz|y0|6LI_Vvx3uYYRuh}9$y2oyb!!V70jJQ%lL at r7U`0DCCrfMa@ zFgizNrZ3odJ+`!>gMwG-5t#@aL(>#3Q!(Kd$YaJ0rl)a*(szqP191FN6LI}xlSX0x?Y7xJ7Z!g< zMy0yVU)6}?$>9WOhI0U9>P;_U0K$peabPtNISgn6f3t~ z&AaNHlAc*=U6R{;u}HABVj{4}@Vw at iNwmb8@~Ny4af)W8V8Z-T)!0cl!%9{e`(!d+ zEj`SlVYCJ#-2xguv_uoorh~iSqKcKG0HKM|$O39*vPZ*5rfQ{iF7zxJ70^IOmvHMe zifU9+dX$Z+HI;~_Kz3(U9tIVDyWDIpgGLjKZaF82wezK9meljkAc at AYQ`0m%pHMX0 zmgW4*GnzdcG$)L-_NyG=j!4v8bo{@*%15Xr at ix+o^%X at yyRgazH zCwPZKERNusN at Wh`*4 at +ALhZw7GztaUs}2qA&R2iOJ}RIPDOIn zW=RH;CO at RcwKzyDOn|2Qm5Tpq^3$(ye at +u_f#-6WXEFEiMSpVNcSae+^VN^y7d(&! z$vev-S3xb34DoI;qdZHUoeoze_{n#^hBu(sQhxc*AFqBD^f;uMq#eR`4)L#Vp at 07q z0EYbP-0}x$dkFvbUr2Qm1FL^&{!2Syiz0ju%}Lb}ao+$BlaUA at amSx)1R;PEX%9RL z8e?}8AN3MjnGjVIUs1i;uMP%7i=wi_>Fo3bW8>sNAw!kzOvU6Kuj;aCjVh at TaZTJm z$~<}Nxyi?TejYvXf7j`C#c`+ at ss%jAIU5SYWEi&K7Uv=is^KVZgzed)Jms}aBW%S* z;esWTEB*#26Mo|I8*r&Yd&#ss4S@;kD0B2FqQM4Z$Ec!1ZS0hhoR>1mB6N^fW)^L2 z>1USKQly)PxXIfVPtJ7`rYx_AD5T~0R?lE zu51j!dl&*Fj;jv%&fn5M=J$o-i9IeT_L!JvQm%uxi-4-ScbErZi;>|>fGAspCSmp5xO?zZm$~R;&|I8xx_qjOmArZRxWV=ES%uqG zRr8!ZI+!`m`p)%Wjp4q~K6bCZ?9NBDJ`zhIP^`aDV{lRVj09Y}&Crn?7_$Fq^(c5- zt?kff$YE`skD?1Te^v^9b%AZjzqQgT>bui=4d)}qgT_zNCNQb%0k$3 at 91%*U=JSx4 zDyglPA5D7Q^knFE3wn)xjBPry*oZ!(Zd#XLolZBflXDT?KPcC6x9Ty_hshX%V)C9j z0^}J|1o-91V+GWKHjgEDzSA-5c!FIuS!yJO7iGNfN(G;}W~Xse+=e3rQKuPHBrQot zl|y;}sA-YmO_iS}$j|QP-VN%w at 9yODwk%6k>Qo3wy=01 at +@n5)2Yc;-2>-CX=u4+q zWI%FR+7bNKUiqN!4X@#dutNsTOyV`bRMLFTC||yJt~+-hBKLlkIA~sYmso;--VmaC zhJ%1jiaAt5FIPHUw3;PE&;rlQ;(~S?5B$Z4fcY;D9rDd}_u&Wcki%%QEPNJ$i^ShGb~Xdr zXLnNfV3MmnJnj)ZWWaYTHa$jVkTIoLc&$B)cO?1`9oQ|NkJ?pP83Fm977>csa5xXs zKLj2+&{KzxXm3*?C-%qD6?p4Y%dITB2~^hSx@>a`ClfAxHXJv%oFql&@)sVm8(&*y zq_zd(yDIY#Z_GtD*iBZN+4d at 7Jy~u^X!U1lS1qx2 at vY3g(L=%d<5M;*-IQ!py6gz4 zmPhB}_;RdB4^chE4Z7pWYXAvx7(enn{14^Q^+eDA)-yT;r;>a6;{$&~{r9&N{f&eF zmyXf at sp;rO52IvHpyyO*7Mi4xVw2Fy*etBW8^DyLpv8vir|LEUHtg*#da1Xg_iK=$%ra9%2qAV%Ca5?yEpQRg%Ng^vCA$# zSaa1acm>_ADOpr1mMIj>if5f5-KVz}a=*6qmKRyHmX&Lhg42g=0~kfGFQt zhySK};#u6HH}~^-jvmy at iV=n-Mr20^d=c=D{V&wm~O>XVwA0_ zSbu7S5%Ar&3`>K%;#ctRrfZiy#FYsJ67t#EAk^iy+1{E|H%?u!CWSI(K73%6RYn{s zV8Z*u`%Ense?P9VuP5j1>X#-tv=R(4sNmKGtSEQUGT`pXrn0G;C8U>&<(bm~;#`l{ zryqAx-UK{yaI2g}DPe+DBh|pRI)4T*ZoZai2T3ekIj-bI)XxliXtlRwJ@@!E~ z;q6C|BrI7agC}RgnAhkM2uycbYrJ{S+orGjVv*q+Pdrb at T;YK^}68 zX)sm4%rwpkXlM3Ln+aPf)l<2i_hQKszjn^(+m-);{#@qE>^0v9i)jx-D28o>jDSue z2+R(RBrr#affo4aA?#~32Zwx2>m`_^l7c1WA%!G&>@jd8I(aeOkI=86fISAo_SkTK z;@Sw~ngZ7m5rgj%FxNMBI__F{hyS9$`IYhqx76^p0Wb;}w)i)XPMfF$s{w zAim)9<28AZ(%Qq#Sb$(C`*soK^RB5qEljh}Cy+}XhurGww78gl!ViIX-y5UoXANXU zIHVT2U?cE6^1S2vRN}L5G!Z>ye#hV5*28+hELsKI;I9oZ9;LN>I0hxlOvsP7A at A{r z{m}{`1+K18^E#ax&@-P9CD~&N;!X>0%wkxi#OEbk=G7|4yBJqjj3YK8bNbdXr~9N z4us at KkxbPo9iT?wX##~mmR;_xhbVm9CCx=L)Up0S#GWiE6x$f>k zb8AWtl|N{Z=T>Z{ox?m9H|B7CHg{0x8+0ZYX%kjtmo6=|*MwCg5}kjpUR(D$E}mtX z+FeJL|BP!W#KfyrRP(48&0xMPlKTb>Z{1a>orPQ^Om|XrnT(mviLb at VQeV3EUWLWj z@!KH=-R)var+XONwsuXp=+*^r(9tMJj$e90ruV3Iw((=0LJqLsrKel(a)U#a at cpWn zTc`cX32uBz_1B&p5w%`~KE at C?_;_r~bTeo^uOf23?Br^}P+2?$R)hhEocCL=)va!$ zQ076E8pnEE0RxH}q!y<8(JknZ^I5JrBC%ozvw_!A;Gxc}b>*P0?Qom3wOtCG7l6=F zNF|939>9n(BSI%nT*kp@!qj}+9Dc?R8#l~k(q{Qe*8CG|>h~@01Reh*mIr-X8m8x-Lty at nhf{E0n|i at 2d(tU?SJ;8_;h0R%gCT`OnzS!U%s2fLu1hQ-G1 z^mhi47D*aqh{PNLRr{OsJ9z%c*l7FRLyH$Y)R0+ino z7u^#7G$=^*e)=T$5gcVkT0Zb?(eOd+tBvW`r9dMmWoP at CfU=*%ODs6!JFlHmiF3v| z=0J_QYM$2x`$K+z9)i4ERY_%9k>THrtSYqsRYz0xT4; z0G?-e`!unOc=vnaC%RbfGAvvhc5#_t41W(wv<4HB6OJzc8YXcCDMkdxLliUd-LFz} zNL6Aa`h9qMiO4N7&?&&j2z}{vM?L-99~fr2#2{1tDbtMM004OZr}5;!8h6?hL+}f- zeFx<0u2ZX%%^K|qm`kb*%Gmb7x{>l!MuT!>;oFC0oy?w-3V=P&BbXTFwUzJ3z^ zBf$Rx-n^X{)F;HTR*rG=^5UjG+t}%j_4_=F{|6{-D3Sxukk+4Mg_!^AlE+bkf~?M8 zmd^IxFcUuZUEyF*4n at A;jVq!Q2uZ4a3dUHwnh|gSijw7JWolgt5S?vZx`erUDuq>< zABEtUHTqmyb(jI;S{`-cIYXy>m0Fc7QKQn at Nt5!Hxm|&tdYP1N$08~o6=7G2I>Shd ztD9-lD`@?C`O1xwTRt9)jdq&k%=21+b!nSw(o$<%MW(q1u_Jzf`dGk|nmQ+8Coh>c z+bI1(SbF|-ZHGu4g;SvdEkC|RqgX5x`J`v!ymx-xU#m5$&}XQ3RW*@wJmOL0`mXu! zQG9+Unz^bh>nW(p0vlL+g$1gnIlXD at M945r3U7U9&u2vPv`tTRQcMa+Q0j&E(@7+# zs1J)w8I^wLM4d20^I*~{94B_W_Hp{70ff_W`Bw}wGQ(0<+uu2B zx3T%`34r`f^(bGfQJ!#~NgyvQNt_-|q6BO7i*UM*9TY0|BQ?Sd(7F>)*CHbX47P#>8`2SU!i2{?#h0Wb=?bGU_SbF}cBzg+iB}M6p7)EWP^8(I$1u z2hGB$Q`S+lLCO;sucqomzSWrB at QI=*0S@;?TfBsKHXQ7U1 at U*v4)bmBidhb4YBv|& zIapypw-|cFaSIJM at AKB=8t+!bqHEi~3w6d>&B&+Z{k%u~Gc`N>zHd^19q*4h^&>vM z3dhLWuF~|4;8x2$OFXfVF?133Bs{{YLDp{?1EMaX_c{ZuV^VEFNkM>oK0~lz?JPk_ zf4yz>P=H3X^XUy5On07&Ipw_aYgEgWVx8pmlAMA^Ctc9H_z8Y-=EqwL_t|_86Z7&A z>iZgje-w=7{HaM?^T4}V+!JK+zx7$?a>wgDh~wU|~oH2c$0HfoG`9 z7)a(0$~q%$ZQ+!R;g?^uGo22=xf?n+1|XI|BgKj)5Dcj!404X`E|FzHjDk)fW~0h4 zJoer>i8ZIRL^y8ce?llT5)C!@iCj5!;ozj1H4=fYEP7 z0>xSew+Bz{+KAqrmyAxZif=jCA!B5(#6 at uGj9=C?MCrka%*q-D!p{oOzxf(WuK%L) z)XnGm8idY*u1HSOoS!hWWD+dE(j4s zr{#uh5k>1T{Idh*n$6)07ClVHg67MT0;ElTW1rpb+%l8eUyb}as88}HP1`!-WH5vL zlU3W4_6Xk3DgP!|i+pzQJI4hNZ0Yi0dDSFwSZRQj?T0lRHu4B>mmNo4ZLpjJeOA(* z`-Fa$dSJ>Z#=-88cymTF?K$-CL+$SP{h|i{rz0`G!fngI4TKb_%qKAGC0>;3(D12q7V$0pb}1o4Xsy({xyk-V1(jf3206pphlsmC8c z5xxT5-2+=i`H^|UD0s{miCz!Tp?M%0v{0LGRrb`KMfZr9velKQY-ku)*3^xMZXCGc z505tsqp9?iWs?Rom&nB at Y;1_r8!s+}ken#XutJ)T_HdKlNmd5coGgXuiFb;nN%jaY zopj5swRIe>BDUv>H-?zHxD at H6thDl}Z|WY2M)j-~$U(c*kz-T2zu^ErDUo7ou5x;J zm7_~)iyULngASYsRB^qFE(^~u^_qq;9DGR&&42lwnta{Tb;q zn~;!CtG7sFVcaY at AX8dK%smxfFYh`&O%H{2+X8It$ zWTck5s!D4=Jw&~rNjpPP(jko{_G+?B;)%PiUA|nZQ((YjD0}}oHDGe=cZ0HlFgVF5#AfWG4a`6m^4{1yTRkMNB4usXSMHO9qxWQ%UNYUi!$YE)6zPNfwa zwU8onl;Ayt;p#eUcQf9d)r~|oTy=gs5Uc)Xo0|_>FwVZQCYUxv6%eN;40gjx%_{?g|`y at -*BO|5D|+&MG7GE z`w5D~c2ka9swg`J1>=5G^9KYZm+i5&1bUG zH;-R)@p}QH_RLU_YDD)&Js?&Ko8%(I$%1SklwkyG(nri77Gdr?yZT^jD8Ewf7>7<+ zqp_Vy+jUM%L*}yz?295h^l0u`(y=>I)J#mXOPxE2Qcr?7+pviT5j52zGi=mgX5u(G zgxpLC8xv+_kQ0(rS(ix)f<v0tG=0ZV8^gQOO>zhs zN^23X3prH}Ba@?5?W)EqNgtXtPahicBiu(Z8CF#j%5632(>&W%_UVWQJ&0kf;FXs9 zM+?Y8dOld0gJ3s}p}bh37+h{ny57(5Z_`iOR9(&T=vu3gk4uvctNk9Y47_lRR75U` zMD2DCtsJwD?#L4!i{L%8`thVmGBb|L&1O{3QC3})X>I5pN>h?xaKks`AYTlpVdIfp zG~R?Fek>ka>=2^dJ94hw2{SN$#b%aZE;Ge4ywhgzvQ(455Sz0Wk6BfzwV3b!x~NSy zMwIgr!Wzq){s-O7@@4OT=n`4V-alRqm|Xk$!S6Qxi*Cgj>%Ztm&|RVm at 3$@|{EKcI z$-;;O3NvF6BJ at 7kw68KcZ-{0TM3Gv^4c9P36i!>*$czWSOrf_<<_EigPF~}uc|m)g zKIGFPx)P8s=Z7`w#k^M#Un$?vIjj&=Lu~wW01iH~8n5c)op^wCqHx4KU(_U`4#Yx_M>>hwL!^~)g) zFX*79mS_|G-TX1BRp8Ug0dk`|F5h-14-xTs2w>@kCOCE4M#ya=_>C^AP8}HCS>HMe z__#aVDefBSq&N2Lckb-~Vb&2~2uk!y3Fa2U& zDZxK@>mmQ!Wyb&h!2MtHRh9mSFUrr2%&v+6P1&1}fNdlb5fM-^Bw+#q7L1V9fgP7l z2%#xhsj|fH-#-JrdqPO~;n3_CLg;o|ZH|W{!N2_;C;LU&Y#I{MAr9?u2xUku+R%r;Da;DeOvBQBA~SVbF+QNUA9`q#O?8v;Qry~%rWuD; zSyfZ3E5c!d9ScnX({A!xC%QFfN*o%=L*Xdj$}=ukOl_9+}WDYCJ8 z-+&6Qw5SVsIdHA3-kn)?A(V`L&c&k3e8> zA#~Jrbt+L{Je3z!ORaMiR;`jjhZkP1;hzOoXf9C9*_$KnG&a<1lkq+L({4J!+mqK% zY75thQtaWf&p^Um3$3VpB&oS?6MK!fN+b)Q+er$-NFC8m3)0NfZthGC&S2GM7#yz_ zHaC%dXwK};2(f;C1u>qy=4)5^IM+G8jUgmBTA(E#(6~0Q1Mhhlq3MgzEv>GZkh5VonQ6u~t65n}cR~1n|ah at 9E~E;$hA81wGD{ zH$aIW*7K!0An{Zy2#t{2>P{)y!k}3;>OA4qAi5z8{Hh00G8jPN6ZeT~JV-w at Xf$?P zTk5txLMYr&iSbU*rbW1OV2%9T8A7*I_4NP?+fMTJMq#m(VKu+~)HY@(=FXhVDcM3Y z1#O4&*!VY=PSlvy5 at +}~hp_DDq3j93Oy6Cn)Z)Ho^qh at ETrvKB>8_4Vsb}oF<;ADh z)^@Ayjuo8B?!_3B&x^ao9T3VKvh3>+d2=EWk66Np8~uAf2bKXot`Q&rfJ6uY0O9{` z;I%Zja4|LczXjiJ)oZy$0~Eg<-=<9*Ve&j6BA^R4J}4kRTOk-kVGR~2%zJZ6`eF?& z8r%@--878+lMp4Q3SlNS||DNW)u%vKV3gA?}q0qLIUptvt+<%VO(3DF_#SHJ| zuA!1*>ZV!Px?M}y>P=E{qi3;8UXLL(jEU5c9A(G}iOCMZ2DekxNW(MRNO at WqW!RJ1 z28Y6D%Nb|(IWB(>Gig_>_B^nzv9Ixj#mTg>(GH&i6V7gj9kjBLEe$)$#vuqrH>gDr zNYf`^W20^YkGY8P5xh?KH-dHditXcyZ!Hr2;?NBy%=chsfO1y+XeWSHlE#s!@8SW#WxKmwqAdoNyDJjLm7-LyQ9-w%oNtnaF!TvLo>}=!E z!T*0u{%MR?pLr%6v1voyyK;HaEM;-p=jq`37JJ{Dc%?L=?wJq-p{g zx2&HkYnw*!9i(-hG&Y!QqSRZ&yled}WHISg&WOGNS{@B6WHD+KQ zw)NFtrRuP?qNBI=|Ba-oefWxRon>!n-#?BFX)H{SF;;66yNEHi4zaUwtUkl=GF2=y z9+iBYTt^CQIJ0pInJF-RG+)k!y{S3JMr|k}tt;wGSzC>YXf;*z`o3(S>uJA8>Q2xr ze;{BPEHqPkcmK;HeAG;lU|8n(50e`Edyx)T+I)e3nAkx7!-RLoKX990*JDF3IJi0a zON+8s0HqL?nr5kMfCN*Evd0Z|5+vdqLVPT_(d+oyV2}HM7@?hnmF(%&1NL7v*kcvZ^RsLX zAZlE~ARMJsSEz?VN*f5ah~gUK&qmJ5y5+Y30RV78002b)herPI zX-;|G3Rw_^H*wn}!KK-DqeQiEB_o9eR6Q32nTV7i2n-atWj67;ZQYGon=KRVcN|?1 z(dQ2Mi{gHU1WYOr^|Q`-c8k|}w%y(Q&(FsXa38cvWZiuo0CX%z3ug|)5uGUpj563t zzAUqf;f4{#YDejTP+Po$|EHY;)pyhU`YXnjn-39YN at sq8J$a$O%!d(zV#!jpFQO+A zKz0HG~ZLV2wj|YeObfNkx_Z`}i*00ew*yOMtkEG8#S=5wxPOf*! zGLFL)#~9J*ebW9jE&1@>13xUY4NY6FR~0wA`jB(S58F2!40Q*(5T+N$0}6DI7z%BK z^mCxS!SjT=3E$$1Q2a{g2WlY#+8#Q zS0h^tU{j&YwE|Ubj-s+z^Gp4>cNX;7bCOzYMRTdN at RS;pm8o#c{Z9`Aqu?s*oSSRL zo46#|d%TCv=QI>Hhf2|K|tP0P)oY=1{p=M|INNs=Xv-)_KgBGW4HG6st!eMHSW>%g*{uNno>e>p=cNz at X`;Z=-dh=D2y%-5p#xA5u_;7 at Sn^*%;suvEvS8v4uuA-StSK zC50u&fdf-m{dzdr^_{}pzOT!=OK<8p(^2OFRR3LRa>%bg^{evw$%{CD+ at uMVAGK+A z9k%a}#JXCk17(l%y#$N58i2%kUz0Ia=>Q>Uvi6FGMbRw3M7sh*XBp%Jn)2en0 at e<- zl%5)Me3DcGrZLNJy!95R<@WfMC{@Nz&{lO8V}Z46IPIJch at U`FMW!pvJN?EscH$LB z?J?i5T!Bv&7#JcN!FGnz{2gVmJ>YM#)B3yoxz`vR(03uSWF at QjwSi$-SZ%Q0;QpzS zpUt)TqHuPpMJ6Vxn-2a`Li=~&kJS|#ZuY&t_4mQ~nULocO#r?BwxIkOJ*^PC^6bvg z=eEs-Osk!h5Kvdvf`#YN-fLaRw0qMtK`JsbQAp?Au4Y(BQCzlWExHD;HZu{ude`6K z_*S2_-gxFgkXnADyfSkKq3g*YxTRmUZ#5-g*ansiqrkOXR9sK9AQ~onEuM^Y?%Y_@ z*ln9m6~_AOWb}13S?38x1!7g4Du&Ok!>n|uB#GSoO}Xt14%$Qi*flQ3 zkTzQh2u{Iy7=DySo{*R$u><7uoU`u^hK~6R=>Gb~BcjQ0+JSK5gKj?MtP7K-oKDAd zvSffBc!H1NC6fz?(hkRn^r5PAu%qBz;1`B;d~}-iu-W^-?h&ws+{J38aPPKzH}i4`;uFI1#Fzd!Ct(Je_`ziMlu2>1 z>L{t-U*HEU?Zrx{nRiP<%xB~Y!fLD`z$sXPL(C`V#9KQl&c at 97WTey-dk<+Ef>~=2 z(P^ng_SS2HqPfzSzd61B+(W79$NiO zSs{Wn*nHw3SU?m(SWzwzBLRU7Rubr{AXpou2w2eJ9c+VsDVnl+1QCU*z49z~ub0lo z-0N2!)GP8|Z|26v&hY|55BIFADfZo|E_QppY)|~xFZx(MIDk-(2b{J39M*L>aF~}W z*x82cr$?OcFMq!r_q$Wj56^kS&NY15mjvLNs}FLkcjjfik_~FI&q!d~wZ^AAD%M`H z=2h935a8?MxK^2$7GS~mJNCryZGWE^xbH4$+S~cRujMcP(arFRIb+zm4L05Jc9ie0&DR{kwt-IV;;4j3yKO+46 zop+F*?8|=nx!oKC09BY#elUx791KHu86mSQUvN04X(fi~A=iBpgZXrH-ws3D5NTpy z1*Rqo@@NB08ysRS^C=}Z=GdHK-WOg7bTebcqXfJs^YY*ynt4{47ieE z)4G-yb}E-KWmvp2hX&v=qwZqzg{h_}b64H6g>x(sIBA19%~3rXSl?%*y{0%q$N6wc z*uV}_hYT4Od6qCvc at rD~4m=C25z+lIj6)bwxFLvfg=MP_714Pc5<;FRhHM#PQTZ+P zPs}lXBa0xUPm41wWCZom;Vg=j-P{>|6KCc~-!ft)j4}D^C21onRHcfK|6H7nXO0k; zE)u4>#FlBs9ixXMPcN5;PQEZJ`SfB^k*sVBhnPPgn4yNWU^w7J_dUfN{SLQfAX0Wo z$ubXgp)Y!*FJY^=TE>PpKWpTLSeT3TQC^(Om0=9|O;bE-3S!2&ELWVnXpyqWJE$0R zb`SHxndqlBH>>&dVpA~Ww5W03XLg8V#h2=*hJ5y at uom@reh>7~9 at n8KVvD|bNc!YV z`K=>np>Kz!o;H#U!vj5u&UmJ%rPy7!+jVi_sk-l{p{s#=t*)rY$iG$F)KSo7g`x`1 zTvsY~B06b(X=DiItHoe4))XFCDvQqp6Z%0_aaqs|qX7xr+S1X|WhKVJWY5>)k`_Qu z1U*PPPa2;wmQ`^VW`VN1Dppa*3geZWqtsL6quJ}U9oAQX>RPYCp|xqRqw874q{HdN zDX5{Ory3e|U%u}NeQ&zE at s60)r=_9GDK*eyeL6b8`dC>>Rqt-g8DQj4me#AUYgsWKsyW!u5 zG}IEXB}@KWU7vvIL8IdzJ-M96CV3P=thmy2EkJ29I&kbLMq$(clO$q2_&C6bb50X2 zYIO+hGD%G}z{+|NzDgj!5~exGxY(A_MqeJ>Z}>UnHI$XHq2Vc7EyCl867U2cE<)Tq zh>@i*hcr%;K8MB7UCMkHQ&BVIYLX&Wu;0)T>^x9!sYKT>{Iob}jOe8ntw*U;a?q4Q z>5o^zPDh=nhMNB(dW;&cg_8ABZjeGB5xBv=pD~+NWHvyXpL(VV;3E#g9Sa at kFP7fI4yYU~$_ zTVuI?tV^P)3#ys4!6JR_BT6MP9Ck62r74V43A{OpR!N-ndQ!NWpa}1W|B$SbOov;S z%V)GX0yzWH>M;ef$k4}d+&;(RSqY?*0!$S&EpI)u3X6B_~uVX9McsLH@=A8aHh3Oh|RSc4i8Hf!Nh} z_HQDuC2ITa?{3@`09!lkMi%1y1m%9jg+_6hD~8S^KKYw{0#mh2T#p*nRn{*~zP1>r zsh$;rh^a2>w9KhAOwE_Ci?t+HYSHt=P(@9JN|3hG--(u>tmGAmCd|mhuzcTVi(rU0#>3h5$l2a4d1ja$@8`*(VXL+t2>W=mFirg at jJXA6Kq`SSP^CUeh0-IAgAXI z)e_%zJr;QzKc`c{3&Q#r*C8=Ky&%C;-)?-RvX~nu(7)&BGq--Wbvi1Y5fu)eRh$b2 zoUjY+2clXAaxxTIl!i{@aQ4wt5V7xN!24#5!YLv}DsACNxaw at vd4>F7;!R-fNQ|#{ z!2NP^^J4ds59yX at ZrF`BiX>!WA{NkHpat#(SsPnyIJz>%6BX9P&cvufH5fR*oguTz z1JISJa|BTgL+vuNDXyjp at A%<-nfuDyTGlH{z4 at 3Tc(VEK^Y+m)J9tHtec$J~Mb0O! zYh*XItMfj=7?A2qR(z8}BQIk2k*x-yAG z)h& zHcTHcES4V<+KEq=!ZwQq{2y4&CyPJl8X06I9hSno5s|&RCXqL3S`LLW- zUuV!mvbXl$G^#2lq0uYDwJEt8csshx{2esVRg)tJvr}kkc$1%{?)bg<8cY+5$(4NQ zM3XSiO&=hv6a=Muxo=Kq-?NR|nyjsnW2qCi9u{^fnUs&HEC}1p7AeWwGc9;YG>5v3 zjhCUtr^O8oroQO6vA)#1qgTrGQ$G2*UVd-e$iYoSQEtOdKyHUJ#Z}c+_d`OclVx$1 zuu_PAE!X_70AvO3l~p}W^6NmVBXWbvIr82lr}|Kdq^^sek+hr at qLdp+VZ`vt>Ytd@(38!Iy6K*Y>K2z?#@_Wi#a)bX2=-Nwhu(e z;qd!Haoh%+adv`QIecJp9pB)3PVbPvY_L`x4z&)sz}|aP_J;Ru->BJFFjgJkxR+NJ z;uN$<#LlfONg|FCkTEW!E;+lPZygW8u(X!~cyr>Da*s*yID9~E8P7HYFvUp7UE3w) zaef4ypLTbr&`5e6iOo;3*&RJV^^Qioh{pBzRPDBGwydyP9oMY4W}>;HV6)oAc-e1Q zZVpDaM|ii^EVit%UL6np3IWGy7vHTqXsRm9ubIfVNVRZjBSKE|iF-(Fu;3jI1rG`B zcx+fQM$GJZjBNI=NZgp%@mO1&JOBk7O>H>YTQFnOM-I2v?0EXu(``V_N9zyU?@0_f zBce}iurr6EOA(~m{^E{k0$zpzN<-5Jw%<41!#o%Su#OBFEuRHH|6V6P581E;oxRWm zb`8l~SZE9yF+8=B^Rh*BN-?E at sRz{sVsksTUoonUYxdmZfbo1*OSRpDA9~t#{pGgl zvbbW3=65UB6&_2P-Q_`&k`%aUb^UghizuRa;U zwqXn;*0N at bOP&M4w#Tw}WDCQciEfR?W(<;va}a^e&Ks4q!JznCg~HsuzEd%h zX=WYQ2Kcqf^l`q at HhdqUgHmEhRo2HJN`>nsnnf_C6nB`pkJ-Yc!SWR?DGa1MV29MD zC-|k#D}RkhC at 0dns=lqsDn5>%?3i)eQ;k`R9A5D4`^6a|@B_`W=-%b**R+L7_l at 23 z6%B8Ny^~?P{ZHjjElzJ!3>8^%Y7A*FDJd|;v^df)Wl{!WtE}u}w3X)25(|syIAiKa zaq%UexdKpd9`~;pIv5|L{)h85OQ|zOGjGN$XK5GNmOayUix at TW#mp|^4z^_}1Fqw& z95be_ON5J-%FM;whLp;y?`FzWLdEBve!Z1tN1<87 at OVWG;*0X#pVY&lm3!rowqzZ> z5@(Br9cTi_?`FiOT;n9fx>(*!GOoQW+&|607uRVV9^&1+g1hgru?jKqxaEp?)m=!~ zq|7StR1$n|ax;pysZrH;W}pp}tEAyS2f*k|@l8`t=(K)8R57y~s71c^2cP#uzWl)7 zvy73KL}M;WFpIv-g8%^lj14Fr1+B9;FixJ9?%;+SKWs=3k#$vMA%vy0e zC9q9=$3TFY#%6MK=|Ye1mjwv}>9RC!McFbwuS*JY&YuA;<}ZuK_k<5a^N8=yI%*So zP&@VKh20rSfMJy`YQufo+6a{d8OM=m!RHrc6zOeD0Fv!ylHrnI?B}^BS|yf$DqFPJ zSWPKGE5nC|8S at r(BKi-~bD$UR1)$Y7HnN68enT!FxXr+bx*Mz~&_hTA$0%}P+&kza z7G^`jhC*dwM^i+C>Pqf2|3IUEkkmCOwIG$kO6{~$x+>1Q-qjW_QLJ%#uOwlnKfj#9^g&U*Tzq9Dq!Yl>#3_^t0!v?R7)|+tAT{egU4uOGnqM^hbb0) z(6Rs(lNL&qTvNjW*3X77MZv49#^~@#Js9ZZcS?Lqa^bTwBUK9!9eyGze#iiG8Yxy~ zxOp&9*(NQSEF7ZYZ57<1b at VmX0Ru1*M9wt(_v7D<|2;M2$c_T~UJoV>LQxhcX6vE_W&mMLEahgLc{gAeCgeP+)d2c?LT$j=l%ZT9eS`kyZ>9ahz at Y&aQ7Eq+YZJS3~d8yq-uI^9b`vgpX at HU z!w%>V#n~o^8AZ}Agc|W${(zXnijVOW?tEd-#u_&1__=y9WT`Qy>5RtHK_ at ip`ytG2tQ?+=k|;@EjK)mo~YO zzbg|=Bb7l0D|$th@*WN~6uU;`zBG^Vx at Nj z_La>__ul|sucJq=z at FjV+dXednY5t7^44zD2Xogo7+h?Y13w_MWhj%Qq!zJ}5PT42 zL=L*R22>8nBk`|qNIx}!8lYMX{=a3*pZwbK3FSqYZBS{1LYfrs9cN-HxpmK at yNoA`NwT)j6qB8IEYqR73{gg=Eg36D`#jcy z{y?$y-@(H$IZ0a$JQvk`F$u-<7kclIFRP;%wFxRPs${T$gbIRko_g64JHviDobv-C zd8 at +Kkcgx1Z>R~-xwJYn)rA($Qk~O?W^)G=CV;I`x zH=HKkfD at 8@K1hS4K at UF()uAvGG(kp=`O70HAsuI*reLSc@@}E0JbStNc(UK+)MA4} zcse$MCOHOo4v{{~B_)K#TUQu~nMP$@H_hO~%^HJ{;YPw{7oxZs zxN|)mgK=pi&IBYA5@`rA^_NRA2ktZ?VWahszFArFT15{=K0?Xv6K4yd&Q6fC4R-nI zx~$~(FWm|lgy!?yYzH!2>rDXS$~MEg7mk?*_P)ub9>;J8{Keh7%cUU)`ebCatOF(8 zJ(e}|mIW`6`{4n86JD_G3fo%DZMf}8Kw!q6M?W0j5 at CX<36R2vrIr|VEV9TTLtBtyA?wvp#BlkmL=F!pBK39tRtJ?uUENgtmxX#M|bFPn)Uuz zH3RN<0Os&do_lE>dA|VhR8ce7w-P!rV%W9$GVp4&W88C`>Xz7`ePebB4$jjIRZC7m z`4G!OP1*i{!LzD>R_UKCPXA8AKoV70A}o>>3KyI^-3J z;!3^hl at krU`D$1LR_9 zb?lz)rLo881~h(N!|&7wPEYesEanROR6~zR%`>`N+%xQCt6O7WwY}!pM+~l+?`((` ze;v{#Iot5YWXWcq*=AJs-)E?*TqAFdX4`tMO|wdy8M;>77O+V#ZfS^PER=B8I*BkN zGMP}>D)tp7g0UEs04qUywJ{+IBRG_Ni at 3t80YsWuR3q%rd5g7=yfH8doP&e#fczn3 zYbl<3vSDYQND9K&y3e4!&%W6kL(wXHsOsq(lkauHHu=uviMX|6%d4-j?4cvrA&~)g z)-PVH9{qlFpz6E~EUT6fFN&1&AzuJ)ne`ndAMqA<(|Ckd*FC%7!}wPDHN7{8tTsA3 zH+iAPNM1QILV}#z9 at GhQ+hESMMxxFJ#DTNqsp*{1WU;hfOrlNYD%t!xIzjvT^q~$j z;Em*=!e(5`b=Y#Hz_q13rP_HPOd%=%Z9JP#0t at 3)LH17Kpewn#*&CR|D?5j*ZQPSJ zUW1x#<*QDWI8vkCZU>wrs^+N5B`LS!HF7d5$Ic!lPCiF>@tJsXlnbe91$8K`QSp!G zu`8AeR{|xEI0)OZ;?C3;(8(6j;38}}%9r?Rl6~E{yDglIxtqwy>r(VUVU`2iW><^K zYGLhugMZ$5VnwvBYlv48s9X}e)zx}J+P26WP-Nk;JQ}eyVET>2FeAe-hQi6Oza$ax zhAX=CWM`XDs*OhpY=Z;fgdLz2ya-REXsLpESA!0Y!1;L&!o=$<*8iVeVf=y?9 at P17WZ_kS5kKiqFUD!%;$S!o|V`sRR_dQyeCqYj& zD{}x}6Cwv6`+bjEk9|-Frr;l7FN04%+XNX81E4A4s1revq=bY(3FhQ*E*2VABuc)BXf>MW>;+L^6NGjX+9$i)!88NPz`7;! z$(kNW-5EaIz_V9+a&{Eh9+^?VpgjykMM at 4f= zo$tU+To?pl`-shqLdgoWHBw*@Vl2(#WT(@Mk2mv=8D4t58SYU^RKOt884(!9 at fe2( zei$>C$UF9b_J?w*mTO|;y`$^(iL=Obix$U4p%kuRz+i{{R{qX;2 at r}|nUjU`xv^@z z7(uKtnj~|LHKq!{dt*M;rwZ$T!U$&HL)6kAFyy!*!Yt at 3m-d>){bUG!P$!0>pjI6O z^H|JEWrUghkq!TkvyG(UcopJgA`R%707O*kiuWQc%1i_8aNgz$ZBr8&ZN)nXqJG9f z+!x~HQtgFibMk@*8cyQz`V$dueVU>R=*^J_H5R6GJAmYt>Pu)fXGKKk;aq~^o&~lV z^_AOft^PACYIEr$P)^{1GiDr>YqU at u6M!@)9rX4TNN^^a-#f|Wg=67OmeTWr*_vu7 zO~(d9n5`aab7=8#Swof-aA%=?ZX`kYDUeFF0h^+p{616 at +jrFz$1k-*eIQrM25YDO zyFCC6*U*HkJs6-zNN2YCP{7yJ3f4N1h1ZpN13hqPYu0%)df<~+-uo_}d>W>^AgODY zhS9#zTQ<8;t;V0(YkvGOn at 0A3ORv2==6jI!nr{Po*WCxjUwH2*U*3T}uSOokX~MhZ zL}RT0KUhqR#~(Q*>R`P%>jd6R*-QpMsd8>WY9Z~X;Jf!h_oLGp5L%$^rv}K!o!A%y zUMAE2*^HEcU!bVzX+Q4Q^ao~F?%b_L3iQpyc+D-5sa>%!7WgN6ua=VdWk zqhts4^uv~!3E4c`e9e`&wjii2*)RJkiyIt1fe#>tMXBcQWwjM2aHohJoA3b_{ZMqg zv7zpa+afm^DAwpGsADf4P)OZMnf^+gAunS9_&698b&ID7G9+W|^ z|9R#Fo1C5K!2EiC+udo+#5q}`CzkFF(CCJ;ye2`+6(= zGwahl>vNYj>yyI;n-scgfU^tINw*0tYk*FB&&cHhFU0L^Qpcz-3WUN@<}z>cnqzKc zKkgO;M8dOdOA&i7W`p;ff~6?l1*~SA+$;T_*#Yr2H!RH454#@jQ-B5?5t_&d7oq-Z z7qOlN#~q1V)9?c*<%lavc%~z%>e%$%f|g!-pwk-1-lk25RVTgyfotBfr6i|l2p0x0 zD<^IrMWAL8n~OVmZu1=YJG+Nr?Ht at V`$w`B;P8oS^xQQDd9*X6440(F5{VkGRGo*; zbolsOjYs at 48d`uW%cWq~4q9g%pqZdNM$Sr79kb5uR$TJ3a`)3~u^TJulLd#1lQ=Jy znd|(cNTQk$n5#0*-F>2y_ai%94_&2Bij?D&3h#ozR^wCQRIE)4lhJ9k1cj1#MDb9e zYh5l$Qf!J6bdeJHMka*D9I9!UX*NA2$QE4o9xk9`++7j3sVf+fRI(!$kxl)9$wN-WiVQ at +a1+pe;LnOl?$9{nUeFi4!n; zB+)QL8SXKgvu+HMJbcEeyKmUaf89YTA(d#nPJ>pphuApD%=o0iQ_3XeZ;# z8dTP?tyHcUg>}JZ7N|pbIr-k7RpUbk at yXY=jRBMDgm?V z7*oO{7g#dIoQqYR8Lb19Z)=|x*ut;gD}l}*a1 at mBMZI0MHbXT-1mXK>2jedz3*79| zog|`7CuB6?66C?=WdZb3xQHxLhB-~B!YosUVNTUi4q!#*aRE0JlLpW#DG_dER at jmY z3-gK?w-PIFZq+$bM{+Xr$;C$6rN-;|#`k5L1u*Ff(ZyYGur9|_#h-k5FqGQe(i`ni z$>~-QQ>NF_Va9S{2il zVX0f89eFxp4GjC42Dx at XdiY?^n1|69MVfU0akHrv)AfU~|FAwe*9?p5lqP%H-$4&w z_g_z-P3HYNM*^W4vjUwTkU=MO%Lv{b97#Kh*XN=VRpOkl z63g;3)x(#vg*VF?mr^U)pd7~aFMpSE^cNN)caT1~qGoJE8fwmBCCHO=$LBb;_#g9t z0iHUdgk4i0$ma?0KyGK3CeqD$U$8zcS)Y|Bi^?BkXtY6TxjOxb$v1<&&n$`KnX_n4 zr`rS{)Tyfw^(mBZx&!Gp*%`nFOR-5Ec2;ayCI{;-5p|A2H}X z!od#(=n?fl1pd at GRdk-wZK4QIg9*|+XvI)ih3PxkqhDUdoTRS!6i^J-2_!`-E}>gf zp)FD-J;Hf0-wL%n;<-5Nh-W?mHjJktIQ{r9ePRsnBV%0qK#?11uf5|C&7ju-T;3C} z*`(!T6ayzwig5zLA-a&f at Tx9;s!W at dvLT{yE-Vp0K8*$CRoM(^RjzR^ z`7H5K-e8hYY0*|xn(`~A9i|9gBr_Cfc5kYnUw zj>tJ<#ub at y-+HY&$3?kuo~i^R?@0{o(48?zr_m(Eg-b+)wR~gwhh6A#(B3Ye7b(iW z)zHF&EHGv2>w{Jl7W?pz at jRl_s~GPMu-j`;Ac=2Fdnwct4NTooa3FPj|$V^!H9-=nd5EfX1<$ciZd zN1E$+_Nn=^fI!aD9yuUJC3BOJiZF0QdUKQ#bxm at 3!|G0dvqx}JmegV_8R3l9C6%(; z$bQgcwzrx<-G2>i&_-$2(NoZ~iObVLe0Gc>Qn(2T(f+k3)g~C at ju<#`W6U;P8Y zT)#*k7QHp#*usmp(mAxp at k-UcijNTAPP#|!LDsz&7pA$*e8=g52iS`XkKaaln}#0} z-0r9!%LNkbG at o{)WbVVYh~rIfaVo1vxKUeK${qdNHP$$^b$$f}-~`)^bw)Hz-a1^T zdj-?j&l|_+q--F+nYfZ`%gH^QH9qY^zaqKv!G7t%n8HPp;6vOe at e~U|0&d5-!8}L> zcG=_KCv?hy5QG+XA&#!m(3H!a?|_X=z9n6U7MZ8RnkkJ~a>S)*YB*rqGDc?-`hDI( zhVz&0lfxIsFMC#{oj$KE%nq|jG^L at G4=hr at b(BHT^mKJ?VZHgk&>5gQv|GGCMHjlM zrjgAik0&5*G5HeqLI1 zQ=?YN^`qh0!=#QZh`m~ip{`Ww0ucG at p`wB4+)C~2T8o%9q7cVF4zEM?Np)XHwAus8 z9f;?_-_8vTm{ZnwT z0y748C0e0~h>pq=Xhb2On$ah`7QEAbBwsGgQ?x}s*k-$Ll#*d{*Ad(1RS#RdayJgFS2Jv2eNv$f6xnB-96b+JiAv=aok5!~njmYqh`Qro}PT z2fx~BbrAlBryYBfqmy%x;?=@)um}8mZwH34qpgr^8~C;ZcMrCWpx5QrY;R|}y(`MR z>$O4e)o*3N4he5J!r}l1E}T(x7Pen|lF!8xk*BJav7knZYbM~f-y+?V9yK?rqH>p| zJxgDB3%+dV_(}$Ee-LhsY|);+JfLe$T?9sE&)U6(NlCI__X@|jAR#yf?M(}b9nKt% zw;I1oK}y)i0=l9I%d~Es@}=nHJ*5Wugq8u(k{U9QmQOymtm2-HJ&y_;hPRVBi7U}5 zIpb;}L&>i(L&R-i#yGPI@=yTcoyL; zk%3_%r$a6AY3dklGDgj~v%7*74Br?; z^|S;%VVdjNM}CgT*E;L)*Dw3DJY&*?C&of;9O7w}UMimk;Uc_12%8X$M%_Xnk8@%+ z*=(hL9OZU`KtSid8=-h|GkjQk`~cRg(^E-aK=}vRUlqkdA%6I(ZOeTXvS%C*%B|~f zU;@|t at R}RgyWd@~c}}~*r(3Ve1>az|?fzkk+v&z_A23&LKZATXRaQ|uqN+~cSa6DzxN$TSFJ78RFcU8@ z7U(T()8XL$T at w-)8O`0k&(SF1NaaQ_%4W)vHe-fn~OKkzgjd#E{) zaB{*`ERa&Q^QgaZ|K5|(_Qy^A86x}jYMbc{W?5JE${%vqp;D^UE>*fk!GbQ8Mjic| zM(~U#b28$USZ!RcKn`4~RLhw{2=#U at b}AtjA&2wk>plfJ1Xns*zppJKa at g*D)LzOR zr7gPY*-{HK3F9qI=C@}W6>oi9k-p4C3D#lY2eizDB^7yoaS9+%*tcLc#V#JbO&2hQk3*gf%e zN6fjOzZF#10l$0DMd*cLdZS6#4 at wtp+35bZ1w2)&N8xV}<&2ab5s(%Echp-IBGx|c ziwP6CH}1O`BE~iDTL&FkuS}ws8j}!Dqf0^h6tqo)Z43k`NbqwtG`zV8lEw1!5htSG!$Q2K(oh#=Fv9HppTk-tyIIP@~tZ&W2W zCd-W+LGALTPYRb at 93R3-3a`o=Ne27n!e=5qkgB;~a$(7_0nAlA#ceHH;d<)$2X~Y$b*)Ow$%Wy>8o`pFG-_2Nk zD!R`h0C#f|-aquIFx9DtNTiQ0oFhn5_S)`NRBauNY&S45v61`4K|Sz?PJJ^R zWMQxN&3CG?1S4X;TtZ=}3n!OOiK}jJBj^#x3BK znYK#FXh;|t6ZSCx$$bMm8=w>sG=K^A!j3sf-m?_17UVF`?YC21#t+} z20oO>Q}6eD>k)RM)$VqJpH&8Y1fST?AE3bQ*<*@$~dypbF`qk@)uOvO`H zbe0oWQ>v7jAU)C41bs)v at lOvQuQZ~iIL9%l%K`!?c8*at_j$2maJ zOVD~xYYf>3V{p3K&-&OjI;muedlL=#;K3^rNh&t3f)R`h(sX-E#Gm^drs5$xcq6!r zh7tQaz)6FI4M%t>^gACT-A_mFueH;8*=*;5g``P(O+#^k=z*C{&L<8fj361{pG!?u zG*!gehp#Y3zo^#WHfa^Sjh6aM=K?!R at l>mAkf<|)OrXqX{YLx(M%>x79IB%nx%I4S z)nk at f>ucxqX>WQE5XMKT(>L5fnCiu#D?Ta~?m2R49bzZVca at l>>+g873^+yC=3&r7 zz#`n=#TCzd>LKgHm-B;c#~ZunC63<(?|I{AN^l4%)FKSGlYE587$6Klt*_og9N_zA zqC3bo;@;?MdM9;6hS at v@&|X~I)rSd&b^6e51wHe=yZibt;a3nbhBhgaPQ;8z&nql9 z?$JFnViFlAGn}5U$i}ga1nz5_Bp>t~t!xc&?0rsXKZ%NnbMF+y=V;4}OkXFzZ78Zg zzlH at C#7D-5!{QE)t;Dl;5K+{jlXkp(a-U7+hl_lJ!0j=TxP6zi$|2?Tf at 70lrA6xa zB)SW+mkJOOkYKIQ+B~>0S0;|XB{!ahpJo3c4njU`%Jk;w%aZr|BzJT5jZ#eE*!&%9 zIGvT{4lPjSofj}h>PSDX?xP9{p{*Z!bgBOxuqOJs z51lO(K^}8ZUXO4JQ(dNj27D44-NzTw|A4W7lu1)NsR at uI8Q{TRvc|@jE`z#u_ zCvI2WaC$_FxdeEZRLr--Cu3&6UkH84!IgD$3z+A83HR~I3o=__*as|{sYXg9Dy)o% zcTuBd^K{q$8D>N5SZ)GC9Jf`phF7f>aCnShj6KG6F?|R}+!Wt2#;+DlnG2c{>p-wa zD*3(VIxY<37x{8ei#A(V2>$~S+_0_G-xn(S=HbZoL(p*!sir9?O#XvychpBb>L1t{ zfSCpfaKw1&;xg(te*>Tk)D1mY&{<=ibp at gpbnTJCZkHr4r>% z0EQ_8@{{>>PgJ*NYA7IGwPxx+pAOI^5iIYF6}Z9N9a9qLF{+|k5p0@(WKs66>rJ5E z076ab82nAd-zU`&gew`aS1~?Fn?X#V&eyA8mZa*qkA1{p=gNsfRk zfB=8gzbE9w#gG7-8c39bG9J7k1j)rYkIVq=8e|KayB{WmsYOT?unE$$e_Ckc3xbEMzN z!wc#Tz1qGF7ol9>LaF~NZ25803Yqs)(a$5ZMw?A6{_?|E;v?dK<1J*nr&*eZhZES3}!A at KOaltIhFC zYtma6RVDSpB+Gd~^8ve3`S(z9_ERVe04qkSux#r=kt{t+mhz(I^aG7U<3Z?y1{0xi z;X#1K1ylr at a0xJBoq&Z2kujmALBs_$fe!5t_Dh*{LpzEakyJy+gk3iD5?tasUIho< z*F)#G?LDGu-Sj7AL=O%(E%Rpw>+%aTrNe_3NHC>?Lk^M4)N#+3H)|to6*p^ZYSp!@ zGt8)TvB_R9(zU>Hb{nF|=GNHH94IxhtM!H1*p&aiB%@Ou+9)=DN3WJcPLfI62%%dZ z=cqz!TpE at Oz_IdY+es-1)v)ta{W7PnqG-`Wre@(4Ph5uBsxJjhYTASmVMi zvCCQnO8G(E4MX23ub$tm7kNua32Ilfj)K#wW)nv`p^W>YzXDAY{XtQChe#!^yDa>>r%F0QE7CbZZUgSE=+{0Mjb};Q`tkS z2Zim2rxRnxmzODpw+;$H6K*8dq~ao_re^+~j-n!)*wg5ybFDG#k^QY@#Uq6%XQ1#M}(o7^W1wE&W|!Shuu$g$n)Ct6E36DvMLx>;JG%lV=ZeE%HYalf0&X^%uB6PtdjZq?Zji zcjQq1z6o;$(Gi3}RJI4U88}0 at dmwER2F6^N`+#+8Js$iM^cVM}&NH`6UBVk)iEe~I z1zP^^;o^O^{L-VOim^U at vCOA?p*W{6UJqK}oCm)o1)@)?K at 7tJ>L?jw9xCNhO6kg>jnVo1oH4homLtyaWUdW7)^pd zN0a_24O(n`eYbh at NbjiglGWwUe>=5JXlZA}1_cB}fei#C at IO1wDd%8pX8r$v+P_9q z+YwI_ou6NKZjpX7YAn)p3c1xZ9>d3EA`V|Vt$1AJmlt0ny*P=5U2LAj^|UK3KYyAz z3J7#YeR6$Ry at N%futGO@<%6iY3b>%sCy=0;@(855l8`dmr;wAOhoWs-8avLZ>0i6o zJeOPF*X`F6%%6|*OQ4s19W>1QUaHoE3M!pDSG3zPR%9GMp<&2ksC{bz&ouwMXk%P~ zVL`$ZmGt&SNzYp^WWwWMS-o#ly}d(a07!n!f$AIEt*^u|tlpm2w-+k%N+6m`)_-gMMRff`LqSjdB>_%vBtf9^yp zsnbhe)*@w^PPX(ZCJFawJ2w at p2ZY4bMniSFNI0O!R`Lv2aDi7~VN+46A(JHBsrve% zpC-#D?ypX%RYGGXo at r@?-0 at m{i4+p#YW1Jf1WA}u0nWONOl{yzex=eB5ZSm?Gb!Rf zWj2-TjQ#mm*+ at uOf668<+^E$}&rSTIun%*@gqn{3hM1HCuH+!5wNpt56wfD{E6uAo zOUv at Oyf2cBvuU6)Ph at __v&HDNN+VL>jH3_~d_$n=8z3Ml!^SyjOwXyO_y7>l*!ur&Kvjd6Z!(vsyno`@@~a>_e{}JHs2fqDL#dAtvjSQxF#I zAgKCBj(v{ePmoLlUkR2>Ugk8`JlnRKocgL2XPcG~W>OSyrW~dVHvwQUX*{nG7Mo)X z6KqS>e(kNga8B1bM{dvErxph5KI(vG%*34J!B2GkBEk3!!edh)0tBJ at i>u|4jJv~~ zw&Nfw%s!)#ivf<-CQcraw>4LbIKYjm>`%}{bJU>IMU5z}dJ4rPh?@oRHAR*sgF;GU z49^1IvByMTclc8j;Tr*);l^tIonxkos>4D`x}c8RKooqI%|q6ZM!P z`)#TSPi-Nl1&dTl|FraWEMLiO*>9o2sqy8y`=Qvg)NNSfMiVL4Sa4*+!YvQ+>W|Ye;7dZ@#BvqH^D&_{Ji3kD{?_j^Wdicr4uhy2I z8LA?;;x-4<8ykV!riwluu1#%{w}6LoOO61$k$D at 3Z2QcsePJrPh%T;jj5ydF)hE at I zg;fpdOA&9CA$7#Gh4>%uWun8Y%U6Nq at OFaR#IGRn?J88ynqi z$4#Tohn0$VzHE(&Qx&Ke1ZeDOj<4#~uJalb>-*_;r at xkWSYOz`ySVrh2=H-n z at Z<^cQ5_90S`R)M>mI50R8yQH)zRLP3vJzoq&12KDJ2pc^Q+6|IhU^WxMiVx9l&|U zbmPAyXj_ZGT|EZk!@Youz7c=~u7(SSUVm^`5WN~$xC25g&bn;mjhcU$_bt2eA%*Iv8w3kdZ< zI?dlVSTKK;@kpiJ;L>>jUj0_{NNK;k=d8eA>BpD1`t$;Q#$iSpP04Sl`ebvTR4Sfz_m0$;4y1pI$Z^Qd+z_Nu zF%$el6FzMx_ja|+YS<`~E|~E=tR&Aus>OJNQ2%Vim7Ym*)``|}KcSGnOeoxJnVlwG z=FNQSPM+)%)BNn1pNx}pl7}-2m4$Ea(ZaSKas8^hF6G_~Q%({LU7FnyI3MQRxrZPl z2zyRWr}jES(!{H=2nzg!WI2gXI2JT6{yc4LAJY#$VD};Lc;z!_IJK;N1;8D;>xB%7 z$xvcrZ#>??|H^1~>ChJPp3AnnCZoN*fNpj`NN8cy&LrrLxjX5n|D|_vwdMkPpVxoV zj|;e9VZO7L{Iu8P6FJOow~VC9p4dQcY|U;>ZfhOuvbrSt0XKfHvr7As7&*GNO8g15 zf6qTl{Ru^W-<6v9X()1xSu6}?>$nBx;kqn;#d=n0-`pqw@)(U(hCtPb at pM3OXrtqj z53kP8=&D9Rb)JuFx3biavBx~bXBg$xk0A{)9(&bq{%hYo#w`)gbId&|`WJ>{x4%cT z5 at FGQ>O!Qtlwo+Q^Ui=u;ResmMm{6_38R%xorL54qViQ$BM#;$!tRaj`JDYSC$Z97 zf?H{ZWJP^0t-&(EtsWBZifF7hEH-rj!qzAly}pU9jO4VxQ!_*Hj?6m&t6P!CwY|IH!g+}8TlV2 zWS+NFCOL$#<-L7wxcTRN^IYb7`uu+0pov0HmE}xmqM!)IkVa6A<)e)$p5EssP$hU` zxWmdP1Unq;hK`M=SvjJJOn9ys2rY18rj1=o^jEflPa!^eH%Rr$1ldqe*enPq$$rsAJ`9m>@E*!PjZ!w#)$Zbhpi1clYX( zC}yWORcwZ3d?-lITL6hx_O?K%3^zC7JUITKwJOvr1DB$`Pkf)o@&{SPP-;w^t8tgS zRhBJ0Tg3QTl~uc4$7ux!O&U4gZ~&YU&~T^*S~7mv2nGVkh7k4ai>6FxbU{1T#^ zE7GRYjx)wsZSS(Z4rwSL3Kj;pYp*CkokJTgps@;-8LOFPKp>rB^0mYMbK&LyKP073 zcFuy9Ixo|y{abLFWZTp>v*tBBb1Pf?wqPFP^@k9}*Y#fF+`#^KI*mklZ)P<_^Zc3) zw}Ulu3puZx17#=GqWlWR2+rANBA$SR=mRfK@`S0B2^79pdz+OScrQ;#c~(&6>^{dk znn(fP)`0%s7d0<$;@W(Htw&Am0(LREi-1pZq0~@C{92*p*+OYx9l at IqtEpZCcQw!w zFQwc(q7zYQTcBXJyue1FC*ZI%2jHy2%!tsWT_WEa;JoTRES at puqoG_i9)(`8B!Mg5 zzTU?2I#&rUitY zqy|7F+%+LfGYxijV?Lj9R=jlLf9nS^ z^$O104FUw at 1^IvDE|&i)(7O9CcYWVbZR%WL6>tp at Mxc&yPzeqjl9E9%6C*^3+zph~ zcG-_CCf%gN`-|P{p}Lkk~US*Oc*_6Z&59bx7=ZuTksQ?4f^nfx(~$|u^JEhBiM7tsE*zBf960rYPM(7Be3 zE4G_4X_?|nxXEtK5}D4a)~WR18JO4A=_pYt2dp;xzpViKpr|V_P%H}FYpC63uR9 zWnoPiYo0Riaqlp#2-jm+!v2R5#fTonT<>#11qG=d5yJJaBPn|>Sqza&K9&%Du2v4D z8hDh_aqC5Wl%8KG<}mpS1NCatx53w?H}a1vu)laKe-k%>$>~sm*bN6nD>~o z{rP-b*9VLhh$GHPG33b|1vD!*AFA0(9HjY9N;smO6TPTI978QYEx{D~2)G6DpAKQ3 zYCA1Ta7vVY{B)v at SsiSr6VfxDECTWhqi0S&CwJFrn|1?MF<8yyuAn|

|FEIU!9Ow49$x}us2bIYz1`3}NF zRi!$tvm=&Dot%XPeI)&PPu6tM#S;}SQt3KNH5|-_bt|bcufL$E{KV^bC)UngDJ8IFV zf53cw*WK-v|5VEPegzN2^;qEJ=MU| z1+SwWauM{R9sVMK4R)spCLAt+uY?yNXos&$RF+&+NNgs?VZvNrm_*5`%Uq3%R9TK* zOf1B85OtiTZ*M84TA{3C>`YjJp3&7umMejZMwBu|5N&(N9AL9L5wg9e4C7?>@laBE z3N*AhY%7yq7sK=}eyr4(O_pvdeuQo{SsE`V)GQ@==Pu%!@tvhg>pd;xoVcl-yG1=k z+rKhRxa=-ofAwZw!5uNVy1}V2CU>0)^yy6U5kl`6zTU2)iBjt at V9FFfiAzx;DWVdk zc>KIeuX^_8EC(tf`_!gKa|OBW&l^k>MHY2yvkI+A at eru8+&5aFm)2 at vSpw*L!G<%# z7*R82wd$mGN2>LYU62GPS5sHN4?adBU8_l1$Kw7UgW$XZCFo zaos$U*W^(07?B{CAdAM0Tqg3ld{~O2MswNe3l16ec4BSoP8PgbUUoT7ok*Et(Neb| zM`4%VckH+EOUDuwBCy=oaC4jp8+n#3A~Ywjb1w-ECf(B2SIQ|6>&m7=WFZc}knPAF zjwr at pUy76!gAPuii1xe`#ZO+)XHTlfhL&=YNa#hkwzXdt}Iht^SbUc11R() zyy{Gr6cN*VDHFsxKf8KQ%I}3Q)M_tO{>^mTh+GIuWieK*L8-SgEPrj6k<$bO0v5?; z?Ko;N-i`qkp at PS=GRPiHc at kSXm^kcE)PgJu{tx&VN1##dBv-p$bIN8%8jD+wBY?{xaMNz83*V5HFOdz$mJ{=8 zM!~0#Nw1@~q at Fn#b>)eo40$m8rrV;b1O0oCb zM}5X1&;Jw{ZYylPh_(TWsEA5 at R1%93cWKOK!d*J=)z~`{$Fm>GybaNwNcIm`Dz+Tf zUHwKvFtuxr#CYIrdYCaFCv%~isTWNJnGqoVmbx3~YM_>9+6B|Xscz#h8UkA|q3- at p zKbp`q at 6fcI{Iu())0Q~mKwWt at sA2AWThEPoF~$5iVm=IM%DG$0UYk2AhWDBh#YhAn z!@D=$torAA{y!Ff9b!F;+g_7{cw at wQb!^uPrrM5L*~V>9wl@(Nj1G+qLs|~723WcK zo~0}0{9(lQIEz?u=-oZ^QNT`B;iu`=z?@KmYg*xLe-V7X{|L4BL at PX~?4tk$ukIr$ z=n@k;FB!;1oj zPR@=7M$Z5LI5@J(H at 64Tfb7y@s-&-p) zBQpQVm1mvUxzC9cJKB5mKS6w(>4{vc-*!rS9SZa=nk^ zdi~#V`&=~`N#bMoa7|RE%Em?zMshGve6R*-j`!0?%^hiWYd*H34*1ZHPVO;MPqM9OAQT5ASln4^*Z6+t7LXrwSflYVT*}%M5p7j z6E6UYw~=b922AE0M=Je}P^8Smmh1J(06UcFrAxJCXV<|=&bJm*^y6Yi+PU9QE$XlE z4(HYJOc&B;k3L+|BGm?7*le~V%FfybBpKcX{ENz at +jK>0t-0xdG(1~&NQgu>Hmh7! zqEg!>oz^J5rZ*EN?ymtAVh5vXsZgi2#rXs6bRm%$#flf0ql75#S9V61Is z&1!dtfADf^f^)AOh?wObnOZ at ruVgjjz{&}&Ym`l3XbrNzs13Tm=!Mo8LIVJ{=~QkkC<;qASNSU6N^F-_)k=;! zvs-%AV at 7rXV0V&ZRypKJ7jeA2S!tRIni9$8rsNE;%PLKi%lo9febm zhYv3DOlK?kY_n$9T{8Z>do at d7TNAHuWoWTUrds&hBwMm(0(;v`o|TX#ShU`ypgx{Q zwqLw{2aaBnwDg`zyIp3IYhwioWUC&WrRwS?Zr2}hlbW?D5g%5=b?UNRBwS at ea0l(F zJgK>Z+L6aKb<|*2J4NtMfr8H5oNNx}(cojMf9gy-p)7ERHsoIHKIa5*!YG_T3xCnvaa=6FnHcvL;VQq at AvdAIcsm47n$el=`eW4!h(7KWfW7M5b7M*{i;NglKxCPc(Lp13TdP8 z2&fwEZUM+Y_zA})Wel`3FjU|W;P=c)IB>C5%D#ZKFyQ at PPiiC7IbMk*WP9UM3D05H z8xPxqH`DKzfA8)fJW3Tq?Wc<%75XKw6U5StFvx{Ml`sZcFHsX?9d!8JF`2u5=lA(D z-N?^>3u~cj4a9iV-n;Qb)ey`onvoOL?k?qDy`}8jyRO`$L$Zi&IAKG+5ZktYraP{* z#WX~2L9Kz7|egs>Wni- ztM>2R=HHX@{}Zi at 44qBs9Sn`F4b4qyE$z(g{~e at cWo6;}1rU6- at rNS{8<{89Bf^si zNUj#mHfT0=En5floo_%sDC$WOoztJ0u8nhR-$D97{~#EKrwW+cPx2fWFVM_!EBh2A zhfR>UxfDS|KDZY)+uB0nnyxR6d zrfkT9f!9x)SlL!+dS$*!h=5Ig&;Ho1P`6?#-x3jz)kQ{txXA%(o~nN%pxTFLGu#m=@#BQ0} zB@}|<0qAN!UA62bC^iTy6voz&UXf at O@t=il)c!N+Z1z#Re+V`<#pJNKWyh1*T|9_7 z3`Bg^pA_+aqT9}%#aVcnH=Tl2+bpEQH#Raq^UZe8=Co_^y+4z;0&T^?cUuIX1CB*; zRp`-fZ21nB;B{!S%B_JB|GJ_ukoiNG^XG&ZqtfFPu zz- at oj46V^cKC?^AN$>n9-a at 04JMdiG6YsiGCCA@H2r=R`yAbKMTmzqMvQJYAOw?k_L~N;|NFw}=x3^zN;ooJsq*$%Q(+s!y2kd7BhQcP>2Etl> zJg|EUUZ^A at 7=&S2jb@}PZVM4pCqk6RvA9uePV`twM*u zaL)iVQW at DiZ0^r_k^9ro8(UgC$Xb(eL6oJQz8i(8w0&A9yaHMp2;GIVaDU*^nwhN@ zRirlYl(pq;rI&i%O-xvAXQJXTc2o-s^4mp$+u;7N0Y{i^8yuR!LU;0N6}CRwN)0P@ z33j at OWC}NLpDH)R^^m;kWBc+e;RAi at EMWUHd3AWH_3@QR;%5AKG`h836E3VZ2>5wJ zz>7T>*PVL5I-YsW8oDELfOTG?zT2kz!x9iYBECCR2

S0Q71D^d4~t6n3H=y#PdqxcF<>B at u{2At3!D zh_WTpi<>Hk1~y0sMI|9fJ%LK#hmY_fa-Sd$k-Xf-K1Cwh2sq5L(v)nZXNATr@cr7_GSYa7Ds8basXRB53rJn2Fqqxq&j=f$lOgr?bmfu(`p(%_+)iYpok7Zo&% zSLg#hT0T$62JPwbnii5W${NLs*b!tK7;vH7B+G4tyf`yQ)glu=$3CcDm%|>y3VN2^ z{Ilh_o;F)t9FK4Z at 5kPoRGy`}$96M at 2X}n{FA%vm0&W$)t_}TDy{{=GN#wsBRiId> zHOq6|&V^Uv*9Gt6S{?fIi`|oI&*T!%i$$Fezc2Vc{g-^-OI*_=pE(zJWjkh*uFTo1 z-(lo5Z^^1XIwh)098Rft_GSu9aw^-xq+9ZD>&@q;W(t#d)y39A?KMMmJ+_E0k(OLZ z5PYGvLeOakfEDrftzcZiiBz((_9nsZMjXs{rF{tN3JLPYdS&`ynYtt%I|J0*5DDEN zx!0&o6=6{du_(k?4MbfN{4dZm5wS^&y!3kT&O=5$EWPg5&YqulGWi>WyyLjRalLZ{ z&9AGiPp=^_&nJwZ_0;E7pW)8a>X}y-QC*I1O)Cyns at P9``p2IR5p$qAbj-oi_`jo{ z?oW?9!NLPIew9wBUAheY=*D(W<^L9+`u4!9FUQD9PZ-{a^EM80JAi2h9NncyG6dFO4ogy$Ij3ctUU_lP*U1=k+d zwvjDkm#`YD!)`1}md3dt!Nm>NjP#=UTn$VkG>$bo`_+<5#{HAa5%`|PS*V`wO4G5K z+7INs?EaonnPuX~_kSZJy{ykJxWGU_&;R3m=)aK>F;_d|e-M#>&WFa$N(~AijPzF9 zE~r(i-W&?v5d0BDuWf-K5(z0V3jS%IRTq*xZ70K4-IMtfzb_1lJmx#AduodP_te+% zpU)%IK1es62VEQHCXvhvbHHG~3E6QFbw05l@|1~%_ at HV;K64B)txbX?;HmFfO!znX z>u${)o7|yq_Gn;YD-m);6BGC9hK8YWp);WSXn>rqN7PT3g47~FjpME!A=0MPl?EQ> zpx(V>4#F;r={`e^)$dj)aGaOes-06XA6h zk+WB44LYevMYZ&@b^|0q`sZ)1zYle%y% z!E?((#R=GHf;p38lvRB0m0&zS4>GCcxIJWicmnjwFVd)uw6?#rJBqPeFLt|vMV;X4#<^T zApXDFRAY0qsu!#6T|PtKC8x-fkY;e=?#<*M1EHvr#+7A;|bLV{n2KFDY&m`eClf5`Soej zdFHB?Ka3w(X4e%I-9cKETa5U0Km&zqfog;?f48M+JE8#9{m4PS-xrk%Z)`7Lszn?M zk2>81BCE%t{kjb%XI-_Y|FOYd>rF^i8ZUvg(Zad+5(+SdNtaQzS9K;jN~tA8?l at il z$nzZ1({_~=J6%0>cXx>L2~+Ji{;+=l#ROw8hi0SQ#*FsNv&RUt0um`N5gl!r^@TF% zPyqaW2qkPWLW%JFRAm{Z<4H at uWt!V6fjr3t-m2DSJ>jZ~nTUf4I1m2mQedJ@|4u~C z_m(^$(vV0PwJGY$*h>YYPqtnT&Iq$KNcw!0)Wui5+6K#>Y6VCYNhAT(-~TAN&%JgU zss3AO-ZP(R?b(6`BVB#>xPCdwQyN$V#mJ<~InQL)6gbK@>zHoywiy}kq zQDX?+n7q5VO=L`Gl|I-7K*umRt#l at Vr7ynz0nXBu2pkNH0x&G<4^|dE-&Yj1a{c^v zVj(vPYqpKot{&OBm4(VAa40#KU0HAxnnd6?e{Zc}!09xQQV3d#PGsOa#Nk(OsrvOQ z|G1t}U7FmcekNP+7Q3+thlaRV2+LzAEvzUJQwJS&ZQedRFAp!m-OVT)K5jKH8v|A; zjf>l`76?<}L9bbpm|WPr^iaCMZBWk3QmnLTuxY_35N?Q1D{iqJc*h#vC02;_;x7!k z*(R4LCV>)%eOkyVvH;{MaXD*}&{G&vhC?t_7ts at mW5^MdDSJ)S5y2q4v69x?tK4a^ zSrBk+P^jni8NjQjcF~R3PhY_B`LDtm{}>ln+l#Z)e{seQ1PF-y|7BeKhi1mS+$IAG zZ%MvogNqApu&s at 8^bgB~RMkywM0$%PD%XR+iUquF1F*s+v4}}`Si+E at BHunfs|{BQ zB%=f_>4 at 6exLMv+zTWSxj~{cQn}bAp?`8WjQLgx?U9Rx4ku+#;S?FjKal^|>MuE0R=1P~=*o#<@|a4rC3>q`a(_(%3nS zRUv=0C6$R6wI!3uquoi6ho at Nzove$0b??=+%8zY(^Ww(Ji`saR>h9!!67xP;~n^UXPN at D8^ntB{Pt7y(il=!Lz;J(DW7IgyrFaZ-ml;;2O=9E z9)j)~(Ste29Lx-ChDK}n-pDU7jfGodkeVmIOtM{cO|g(^_yzi3JpwC7tnLOB2q+Hb zf0`!ySC9Dn8*(8h@?9cy=)CVeswcoY^h8m?vW2rHM?bB9c2v$jDXQ46ZWpOYV7VP7y zJPZI}*oiu3&D!7XRa0EuyxO8>{Uu*5(>iA689^@tv9~n|^)TFdnj0I2n*ND6YExad zFQ#cYLY0*!XSeCrSSwi0yo>erQ?rx`HB_g$t~RsmHvZFf6ErZdr36f-8zubJzv$;B z;&qhgI4=$%K2L)z8;6}7quMJ+Qb~U}HHerX;POfvm+CX{f}J-^@|e9tJ$P=KT~(QS z;1$Lk3awC at -Nh!gY5-D2M`vs>@g`|fd?Hut#16BPrTl68--~?{Z`}k-BoZx!B1tUz zlg^mB2^tiLJflW<3SI4q)@61ah$uz=IOu>CPJ>!KrRExMimg{jR1;8*fz9X?s2(QK zg6)IiO>()}wd|&MF#$F`j%29w%A1y~%1xsenoWz|&-3_E9E)|RG|8N^E-)SspNN%U z5bzTAd*tKyH6{a|lu=629JhuWOcgmXcA#ogjo+7*o at A+o$@HooTYf#Qahnd_!C5j? z^wk}pd&DA&uTgZhOmYuH%IVQ>_Gp?|mzXPg(_q&qn(#TB+ic##et{?OQ?~t{#0X>@ zbl(3QN}-B}8_lC^8!kV9OU>Id(zOSEOa3EQrd@ zr8h#&MRyPxbnqCVN0p@(+s;$ex#TXGJ>w=67D|L~(_xszr3Z56RsdEDCBD~sWid&H zoq>S9GDc{J!r%Kt#vU{0k0W2yTm_$il)i zWcg2wK1Uw8S^4l2;5V}1id{-Ae%VTzXN*4#5M&%s_jD5fF

wL&P9wurIIdzRO zQT0Di7MLP1BT(ghBV*$(c6(}rpxOIENp(nv7#nhi+d{UJH%`wyEZ}o4nol#=-UD5} z>!mPw5yZqxH;Tj;gLYwkpatJETb>OeoPW+9d#*)ej*7K}CdN0ajEHq{sz2emj6PlPgm&GqTz{ z at dx(XesDAVFI{QhC;ZofTyAE}LPnRhd9s4$~-I6GL5Pqo6yzI8FX}DQ~H%xt(D*?tEyQ?zFMRP-) zyXQK=^BojRC~yz-9}EWcF2c at t5hT<)`Zk2sEG+^^d|Jnaj`JEYdMeV*#_ at mK_M{oWu1Em ztKCbi*u5)okdIn!^>!FAt8V8dm8(O!SEogWh zL|Cup`CqQ;>`o>H-Q#YXU|vs=*XLWm6b5s+UIV8VwVAi9rk%4kyU275TS=-^+La%} z;>5}Xz*ni-TkO;}PR3f5z$vwFf^qjW{>BH1I*TC(GE>vjj54MjE#vDc`BfHT4v;io zv&T}YRUOq4ogFrxJ%IbF2USN at VXB$~X+W0wZjfO(6uT5jz?w%DB)ky%Y(36>(^XM> zS}v&HaC{9n(VskTvaFRes=|fE6~c8UGR#ItpXz;VhrehQ*pZAVt~pG*Wv0;7XO zlkQfzCA%3^vgESBq=ST`HBaVQL;*GIEE~Eoe-6_5|SbT=l)L z`ljv+zxD7^*3E$TOTV;qD at w%QO0>ZOnF)!gJnYBe58t;Vy*ti=_uzWuhmZLY1bZV1 z01R?E3`XiWx6tg%gTXcBK7VV!GM>+nJLImD>(5$GNqGWc at 5C|*`vvI?zR){zq(sV% zA(pwJq7WIVhV+8ZGX_b^grF&pj43ZhC&B0(0!`O9b&|8jY$ztXSmq at ZaoB@07m<5f z$D*SchMBA;EdovA>YoD}k8LY^0%*b8tvr^$N0j=Qu}k=EcPS7c>Kt&HKGv1lOOl^)%4~lWXvG+ELhnSu3 z^$!X(H;~r`mMJ-b_Cv?_oQ=Ch;{9n!YVIFj@}B>@;J+t+1mV+6l>Xvd74-j_`1ucf z`)Bo at nyvGu2!fx<)T>NV9(gY;Chi)W zUX1%9Yp6;p-C38*pT(}Q8);Z_wVW*{(3`bTm88lL_(YKiw_1L7iw;LJba0E#~xqYZ_4TF)>@1meNPRv>3n-WO6 at 2vY_abzqf0 z)p}XEQzb`=3?D<1Uz|>>oZf2|*Q_+vusycmN;}2#b+>KTd)DJs7nxtp#M=r8ea~t( zS`MJWMve5Let7C3=o;n+OVOVd{0;7*KxSuEH5tD9il!eBhIH}S5~|Kz-(&Rf?tAGt z^GrgC%VdvEe!wBeN|Pt3#?)cKw!y-z-q+8=FJf%gGYn%30)*9F&P0ZsD%YE2&csgK zm{)3$CFA`!9908Zbx!T$dTJyfYpWs|b|{4=*{gquR#%>iAwOG~Y at _!Lvo)L5Gb z*~4vm=AqUt=yRXwvEF#>cWNyj!m)1gE=0lM0C43Vd(TT>p8QfjDG0fwBR9zaB+XL| zLpVCN6_i(DliM7B2VwpBe@@4x<--6u?z=P`?m+CW+~JX&t;|KKfB zr01qxjenML#mTuc_^q_TV>+Nmy*^9SVM|6dPOm`f%vklb95;S9WhL>V0z1O~ zjXUB2$EagaS|}(PBcN(O{hpn&eTw}YlT&10)FG#>@7smoGqYvl7>Sndpn7hf&z|$# z_KGzz?iil&j$CPiY28?}e^aWkI*i&Q?7$`OkZP3ejkRDFffw_aeb_1Ty+5&c_yax% z>Pv*fUD4<`=nk$!0ZF%9jq}tES?IbzAKQ_Rr%osuM$swpy;EP<>21OQkKMzoLSoio zY$s at IP<=pXfYXst!o{;=XXh7z2EFSlKKMmk$33z5w3oS>n2nNZ=u!G4XYSx`8u(Z>p3ue`qE@>(d;fB+gqYq z;=8Vqv at t=NeyC0bBcf9|tW!H;pIkGl5Z$s(QcMZ1IVy2}6fIjQmivt?#xdO}lfQW| zLtYVuge`KQp-{rPO zm8kGLUN at O|F1Hm#;R=)}A!PJ*kb at 1Tjo68@zU=UP0q~@9sE9TvO!x4=XZfc_Pd2#& zu(OLfWEn|uFk?faYxoticf9XN07NNC_&I!PYqvmBvosuTG)4s zRrw>L>?{QA$M3DW$DZZ6jy~}TOZsTHdbX{{DWVZs9O_bs#sOew=B6${1^z}3fq>RE; z9H})GpwpSr#1WouG;?GR-@=icoSZ%gQgvN*o4bky&qWEWZ&Y&YAdcH^$eLc;o|i37WB?N{ zUr-kB_KF`KLNN*=vHKD1*T;#cs2c?(~vvFKaX zj%N+G$|!jfWL`4)mX2hqQt|;dSldH*%az3=b}k+_w`iO4h%$!xQrV z#fO>xgLY{DBcA$#14bHH6KE at MCKZ560+p~Rw+$ph0k$Mm5f(guWZ+DsOv-RHQ`#$i zfqtv7)|7Uo^}X*$|NY6h;!Ebz$7Jb(sYd4gbj0oLe{$*j@>!eb2h0%a^s|EjS)AR> z7$epguGLt=-3ae`d^D(u#%&)iwdkS8MI+XT6tK*J;)5`#h2mb=Had5u>cXyTfT6Qm zW##v~;R!Z at yxuC~mG>(0LsyzTlv%pQxue|s9wy2P`8V0|6r1oxqAD6pgzEx|^)m0C z%`I;*%ebrb!3dkX%d203O^PN{fS at Kbq|x|p4YdUG!&~u!I^}h$FctlXt#Uuvt$IeawRNuD;VRFb!)$@dpe`kG7I*H{(^60SvxEiS`aaK%$*FzF z92sI+$WEQB=@!2SM}xi-;<^^ey at 14$j+uEO{oSm48Yo4lEyRE?h09RI#yw-XqVRU1Zpb22Lhz`FPnXFuj%?Lw;_^&~qtgCDy$&1e zpcACKum@^o)vs__Fv$ms)8Q~hpQ2wO)f9LXYa_8iarKqEgnSYE%3yhW&S3hx(r3a3 z#-;6i4BMHu+OgylSuKZYZj at _ufT%48PCEs*Wh=uW3SUO at 85G$XyJ zc0wkMjTISbgtThAtSc;=B_u$)_R-+{k zjD=d}yI37IG~83|6M{K9jKqn}tb8CR at uh=IMpiCi+ueE{b^F- zQHyO%`IcAy+4-3pS}}=mCKPf%VST!HkhP(>a9(k7Xt&&7pW{*d`do6kTqQoE#zPl= zwSevy;%8i1jN8Q=@t{Nr#Zv^jIzyN`L>)6rm`3V!qr!AED!V!uG!3*$8gchG4!3ns zDw;SDwVTOoF>KT&`5{=ub1L2oBvjO7y}F8$506jSct at y`o5Axx`U*dc+nYh zx9memnOvJbD#OV(kt>WGZhql)*`8Y%bU)Z90=ntw1*6s3OJO1jvOpdv(2-OBoU at T% z5eReIpj?YU4;}DW{hfYOuv-t6rz5mFBxkk_F8N>WQXAGNp1ogh?Ei{8vm;EZL=Zqg zxtRZJCj6hcBWvjJ at 4bKSl&r4pj=YNc6-(<~#{znQVJs{xaX`{wf&j;2X*(KYD`P|F z7KwvQL5MjS%u6r}VJY&5O?LAkky`fJa^WEr6vqi<15`+}ve@@h_*=l9Ki~IS%l4U% z87r=6ewZ5GGlSE4hVT7-X6HBG#@oHW|Fbuc?+Zb+?O0enuDQ0wLoq{YUDfX7$88Ek z?vVQWE~TGO48Fel4XhtOZa at 2NH3ZQM8-GvXZU%(btqsQP-YbM&U(|v(W+;OPPycY&axY;~)D~xj8Fli(G}8l(f8srm$ab84uT#q-NIurcNS>BVFa|uQawD_6}{m z{OJP<$vEI17YQ7N^9?vLhcOS?X|=Nc`ew`ia* zp%}2D(ep~RHzt%NV=kAOHF=BI-?ICxQ(PJ6_2uUHN%zL;sC2%yUL{!<5OE(}ac8nx z>dR&^ID>xyWEUG))px!kwRn+iH_q)c8D_z4F5uc=npA^_!tJaNO^Vzqpn=P>FP{jk z=`A0{6$v!eKUc2jA?+W9(Wq)PB#pP8PF0MIVIjr!~;)6SwNThK^WkX|DlS}O-mmidp zk at 4(}f5fqdwW=IAy0YL^A|6cRV~hcliog&pe3T58c?Qp at VKn0#(kg!<^vkBHSGnW# z%}dFdDqSR%)z2r_mHxI!%(CeFiAj{Wv`s?f&7uv?a19q4jDb_1oOxNF+NnC%R^zZfiPDU3Du^p86#ta`nbJ za7D?E>PnEpM8-9)#eT301<0Cpj74^u&TpwLd_L{>)~k+6PV1&u|!q~=eTRO6+ at th+*9EQw-I zy;k_sCCV)|R+gdpmh5bZhZT;K)1Xw at bMw27jKpaT1#7{vnO>IjiGq|TH5=a*L~G5_ z4|DpI1?Tpw9$giOPHR=?UEU_jQy%7G!uu)r+RqX!0sIz2?f~#6N7%)(80(ZBY>U|Q ztg8a=(+kHptD@(UwZAXh$1h-9c}EmtpMN0Ctd;nw*v=`^x(XRGbYOuf|4Y~6H2?L_ zjM-2fNIWq(veS?QEXz&=s3zl at q*r4%R at Adz7?A_&1>K^1;gH3#uTlSr`r}8%ny5IE zlMB6D(r;dtt6!~+Pnh<9_%b{5MhG+4qh}|OedHQWOA#A6^kxc*lZP{)XuugXMucbw z+z{}8wG;a6h<^O&&afmwa|a$Q4wyum<5U;|iI%|F3y%1E8Q`ISXOrQ>IHtVAFq+)S z3YQt#=dKab9foYQzvamsf<~e~UIPbsfEJo;gND|eF>dsZqDLXA*XJ4+rH-5)WiDX!526+`5-loF#SEH8C&CfmV(hWZ zZ%JjJ??EJVi0-0xNd?3HV4vs0jPnf`!CkFS7;n)Xt%l_oaGtId*0X!2MemZC9FD6S z&vNs53Of{1FY8d(d+yYI{XP6*RrlryJ?|fk^huVVBVO7TpjRLCKCI0_Kxd at Y6{C3z zhc?{lq16 at UyzkpZN4MA2Mg-Co7TYahm^DI-5-FEG2ou9`O074i-u0_?7eaCfl1qAG z{k5$1UeVp05YdJoFFw4`G=k%JVuLQtRlL0FTcY$+8BDWw#U{QATBuxpO23Ng_~44y zy-Q~bx7g at QdK%kIb;>Fs1eYu>B|pz$KF{@FS at 2XvR9vmj?+%(VyJ)b1}*cl=gx7HpFCOkMYkG<*Ne!0^13jiQD-qr{dd98*CsmE_x9Ksib#)U$)f%c0T*NRm^tZO5y5FIfvval^u1zt;N$` zi&tAU6S3cxT1LW;D<8aMaoIACtD!C?+P_{e{e96AVX1 at YvlC zJ3`ExH#qyJL|f#y3eM0A3qQa9ThSL!LK-FB-$4BVG z2Sq`v4+ey8z?}!fZo<;<`=XTWv25FrBL9g4_k9{sAHEBhHP==^ci;zeM)J$!xxx^WF0W9+2~5jq>=S5>1zp#TgEG8J3Ix~MQphk}tLnMnD)1@~jjV4=-$5X05*V*W0SK(cx!r-jj z4Rv0X9i$8Sz4X){&AP~Is;R75m}O^PrSlx3$I at Xd-^9XXAd3a12D at -ScR3ZJh_OuG z0M6aOO2>cstg8gCcOq} zr31~9wScym=6pISNVh%Z&t)UvM3tzF((V2va zo+_dw5oMt!|HkjhRhD;7jx@$Q(!~ixnah9#dJN2N6Pbk_v8nQGy-eD!s56*H(luEu4gKlNQ(VU9 za3e??nk>3?l4o=wG+Ib^X&y;~uRg^j$>TqlXREt%Zj!8F8`K=!C1g+ at LVl`)l9}Y= zRvl5Qi*!&ONm++AT(?;jUus(@U%}^poI))e)BqWS!K>w?9ttWjS;=X9k4aguXR|^N zBc+rVB-A at 4nHLb~=hn_+&7TW#1GP~HgP>LMmfBx)0)<=*I( zrE?~=MhYQ5v^2rWR&x7pc at i!S?BwlFw(;P^s*y%?Nt~z`jG~rSt!f|Qbl;+GrIndt zuJik49b%U$4ak#NDHCRt1jz)?j)UpQiqh?3feNf_BC&>URkmq!3!uH)%yXEawk0YC zrxxZZ8podhG4pT6PG at 5}k;huPJ{)~Jn1XzjbMl!kOFAj0G^Z(=2D0d7IOJiqGG^+bj(CL$*_Ujk;Be_Sw6%PG z+KOB|Yd?YufdZp)F;^MlQEIVwaqMTNg4j9I9$)!;k|cYCCKgiNTAM7&}{ zXpFr>BSFnxFy0a8sEkqprFkmv`PM%2yQ!S)W+zFx7SuCnNi zb_Jo)^S>qElr{sNjUtRHZ_=9}UyJi+F# zc0pXt0qjvh%{6*qd~DD>UUdp}pv(L>3*@Xa#(>PZ_>QTa?=iNMGwYg(e#Xwq3^l?9)qG{+JCM7%D!$KCc!xHw~ zyIj1bHvsigA_TQ at j<3 at +Ld`$_mp&Dfj^o^+p7#aQHBo)gv={GpkOCX_{nY?xLV|Xs zST}HOIOA=#i*#AEV+9pp)>Ss8k(?sFIobw)kZj2qyDhTzm`cq30zs6#!{X4-YeV#2 z_JKgnJb# z(h&mQ<#~H(L<^Y`v|l?Si>ws2TpaH4=mr>w*?m;mC?2*?SY25h0$YsSq6GXT35!VW z>tcSeQb3m!{kcR&#&m0DKU*-b^SQ0y%G93b02pqGE4LFGOv|3g^B3W_sTaE1xhNXX z8)|TBFx{uf_l%eQdUs8;w`0!m+|HjYEqPbOEDMpq^=|>Yz6fDOX at d{mB0HtSn2Xeb zJWPX)iTPqM_5?Kq0mduCiq0HXaN;o at IMusloH(9#bwP#GSLp_fBF0ljiVYI?8M$Oc znL*U2(xhiC8JydWAeHC4Q!Yh`E+S9qv#00ZUkO?p1H1}nUWl;ig~nYWF&n9qmMA-z6qeyP0L|Vx_g#d&MWEka(w0^LUBa2 zf+J*++bneu2?4@)t#J#%BQD*6hzMz)l)f8|hv1EUen%3klt6ZO;z7*BnL3tiFkp*& zO&T0MIf_4|xOXHEQ%gW%L)P`kj)(Hh_2U$>JxpM_eNbhAr!|`PSmoK+AyK{eN^x7F z;%tf-><}}CX7R#xoLbz1?WdHK`0&TTR0OQGOw~*qt{yM69!JA)U&83y%uGaj4pkm? zb}xVY!IFz?p5n?$MD!;TDCOJj4Lxmw>B^Q9X61lYwz_HaK^IA)BywprMWf_d4#ldNr^QFXU-HYbsfbz0;GqA`Np*^VPFR9YsH%9D5XmRnAnnE at EDtvb ze_keHizZJh_uOhc-2n6Yvu^QD^81B|Erwiqf`_Zi;ivEe%Sj>R*Hkh&C(Rp$K{bTPIjv1k5JvIz zaixN!j5ZH&xwWY9Hdb0`b8KnzgWU0b_-$!Lk#C}f^IeO}hT#s^&bVREY*a_A!fI!Q zY!rt!_f+W-WovjN?P at c8i-YvLVS5w^%fJN|X187WpT at _=+0d=i8`~jqk7P`-je)FSmH4Hg5S}xY!2Y>lFU2 zk=Bd?n zdf9_aBE*9-kdUeLnYg>91$q$Eg#M6(NkD)xG2RFBPMcxknA*Lh5&Qj#_yO#@M_3LO zWm-W~b*FR`toC|Z$Uk)VFvU?fskF`kU)m|3ci}#B_WCF9+8>Ak;DiKaM=~GWPGYyu z3wHl!sGW2?C}{J}j4=XZC+#pcsF;MS$mVD2rh|G-DBD)j#ZRa!YLC7-LcUro?JX2F zNd}nNv`g4-n at v;Y)28h at +U_xGp2tL42ks;<4%3z8LbvZsPr>;Tx z^hRZ}!fKacMCiGgBF7{XPDX)lfdNOT$VmXE^D4}QaQn&4wCo;3nR6;>wq}w#RS;bR zEhrNXh4P5+BVW(f$L#DH^jZeYIr9b-lpt%w*dhJWs#OBFk8s;SIki?3jSfJ$+@&#d zRN1oj9MVeEF44ul0&)hP=a3^KVq at 49{8Myc(ZuPX`p|8uQN>pKAceJeVqV277Ne&7 zkPDz{H#Ko`jOsIH;$QtS+hRr9&ItcKR;VaBLef6vP|qq0C?7wHARA|c96rEk={bx^ zy;Wtf8Yk^MPabj=X48HqyeC!)1ZTDQKa{;yR9)NBu8r%&-Q8{C?(PuW-Q6Kru!+07 zyK8WFCy?MFxI=Jh?(cZV7UNx#$?=ie~)f2efzBb5GokeqS z>4zHn{RxyLbdTC2G}?s$z5xOBN`+b at Q#^`uYNrN8J8Xt(S9I-Bo2yv&v;_;H#FG*R0`OH_22+LX!D_Q9*c=s4QdA600-s?vT)95+L+ zr^b`FiZ`p;a)nO(78bcOv at PzO at VmWPX z&l)kg?g78V1KPTz{?rBeRVZ_jcd9kYn|)BZgx5kCe#h33vd{ewue6o{lh z-}l6P9~jz`K-KD8p~+^Oi;THP+G)(4j#p_*oH`TlkTl#y>|k8LUu#=PPd1rnRTY2X zN?G|DA?a1bZ=!!#q2I5(_hPm77L4(jD)+#@{{lODRgP0H^;0S7_OvB>ex at KiZ`hVx z!X3g1HI8w3Aw7^iC6FN{9Z&8R6T6HnjzPl0mRm+ttZ-6*gXL^b2{Iy(2trj5q6oj; z_!=IrrVdIoJg;!~JHeg|=i6yxG$bF3_41O?Tu3ns^0V43(9A{1xhmj` zN}IR{60`w6@`R>Hh&^I<6LFLTdv$|Sx@@KsE`s=}#+k5N#u at 8ApK|J>ob}1utr3L6 z$&MwE>m`5F@>=ivZ<6)Ob?37EAz8zpDpcs7k?j9IyQ at 3>ZQdYY4} zz_M*O#)@{9eH?mh&LcLdu at Fs0*{24qsZRlwrjn9*g$A!GocV6 at D^vr(PHoq=n5Nwn zCX;#3sm54NL$uLN|9U)7TenVIhn5E&rCV^qs+fso+zvXi*VLey4720);YLHd0T*$d zLsXKqW>`1wY>m3Z+y=U2vuT~qPMQNh at q@xx9T4zhB8)Ha3141gYG+S6 at ek6nHs}$) zils>-df~44gW`Om?%L0>IyA6cLWRZH?bgb;$D9TIlbTS(XEE_iZ)W)#=Uc7UOe;HE zsW*Z{DdgSdpg0)MMMyTO+*?28Y|u%^9su) zKmdvFdA@!Z0CM+>)c{p4ek$KJ)7QAt9>d5i?`m`Q+jdQ^I56|SfKv~O_G5WvE$8NYE0Kl4pNHz<88o!Q6^5}TI%G$B-{v4Wk7u~; zS(pzdzWpXmLl+)iw*cO$pa+zhX!NRj$Xb+<)o|RZz5a>mw&#pLv7yfL-0t zt3aVFVSQen?-W-@=lUFVS?B<3d&WJSVqigXjA{aXDw=cmP4?}`9P-E{qkt+X5qknCW3X4 at l4hEuz z8DU8#O2ioh>P`dht`ps%^BYMd54Qs$*|bnUt3{H#mpoNWa%5mb#UaP1x<$Fs9Hv zx#d|xphm?1_|(Nc>3jWZ94c3APd6v2*om?7Zbd~vt at t~Zjz$|g;|c&g?A?o6p^!>t z6#DO%HC)QBH~NF#6+|#F+JE%2|Gw>hQ;R?n^Fy)8JXx`!RJUYgt;|#w&S5xyEeZ1} zL4*TBtRxsEj|^aPYKg;5pz;CZ|G at G)64syYFvZPp$?Y}V at APWcQiqEy$9_ikV0X6X z;i1dxVtOw>o#h=07*@{-C at LWfqgrLGrnOV~of$R9Ijo|36$awbRIjm}Zz$W5$2z6w z!tGC>&n|1g0sOR&q8_>%xzu|m;|@JmujSM`JK?;5gSo4mK|v0kL1j28yO;(_u&*k@ zSPZO{-Z5ZpVlvc@#x+#?jgd~YMrrJhQh)W}eF%+euE&_vF16&m_L!<7AXgp&SsZwI ztL^#UX3+uxUY(Cuzor$rLj4*@$|`xbDi7+?U&D2nNyab8K{xz1*it zFk?D<1IOKrGK_5SKr!+9<({=8U=9}f+z&QxpBv`VBGD^{DZzOo&vmEj+AK3qi&oik zz6*j%r!D9hTBox at Swdy$RiiI`U;xLxLU`2A$C%ZnVzcYjmrmM!n at mHGvghoGZcIYRt1M?te<1qOJ!>axC2Nh zPM$JSl_Z0D?UJ6~Hs_Y6n)#EmUy&duT`pKEk^{|1KMN#g`^Akn#sd}Z`vqDNRT?80 zXcNmVaITcr!^3H%op#%zdByC$qPghg*u_5U+88k?>U!A_4)Eg^2LQ$7FDLCJ+oH%( z at M7oGLBO~eoMC2Ja<=K5u~*)r!(k&glLy*p54q$EbYjQTmr%9w&QK at Mn%HMM8xo&E zs&ck`Y@(O`9aL%?9CGGbhv1aD7ByNu-nIImt*-mibTGUbn&NHnYa(-w{1|=Txv^~W z?uV~PqQf_H>N&RB+LBObyngX1o|$;>Yd6ov$ySaLzpCd8P$qMw<$ z=Lj4btE>H7a~?2N-a9_ at 0jq&0*NfIIGX6mUTAS8I>JD^S!(<;VD2bF(Z=4&CDE|$q z)oLwVD{wF{FNptf7FosK#NE=#)#3l*IKe<3LKG9UHR18rFQ at pz7EytSWP8VVHHrZ7 z@@1Hye$+!(`Ul>M!Ha>18tMYdk+h_hCS+qlSf<J91 zn<4Bvb~x$g2y3=2Wj?zhuY6^VpU~W7d=v*U5Ps!86VN3&d)AW&Q`eqiIs83;SS at 6J zhB at W*RE7RhSAs%Np)g4t-4oeP+luGW%Mo;)zYTc#XsB2m(gPX=V~2ekDy?vys4(2%bWXvNK_jR-s!LC+kVm~9Sn=|P$-WGgnkyysD_LVxEi=6$43K*DVd-ZZB z^TcXITSlL3?8M_2Wyan at mI;LXZ>{9udTZSN==2 at xe{5I&TdRMyE7k0jF;r0nzcShD zq=gGe5KmT*V25F08BtL-MFpvIw2`R_Wvri<8Z`N)pF!@%vwaLwn(+Sk1}r zKkSnasknq+x@;aam8GBN{rX;H=i1djui9jr1Y1ahD>Wz0Gq at u zO4-(=D=W8_ZA9b4+D`Qup;k5`Y?%;bXd;+ZSNZA(nkYKv`#j at e*EWCr-KErUyLaAb zU0}siF#H;j?Qu~Xy1qWBcc*`-P9~8&<%9>=e3uqRorOtvTy>Su|He1;tBxkZof{A; zO3314{3C3vA at 9X#O|3!fosAUzJ8#*HJ~L^L`5MyxQWC-EGVNA!+0HoMym)n*yRA^R z0>>YFdHZ at LYie|xUtrT1WIHUzjtLErZaAS~%&#tX4K2ps~0EL@~vk+?owFJVWv3 zTV at TovMdzmmxJ_sSMb$%hSZ|GzVM~e*a1DRL~x(8^*$LS2mLlr at u2pqeA-2R`)o@| zCq>SCd_m3-97HsnAjG$Bc8L3Yyz~wM{36=9*dA3V^;`WF zT1A+`C1OvxL9crOjQ~6#OAf z7sUUV^NCxVxGI{sn_2(=TjFC?6_wXTQ2jCZSy?qP&VyIjOq@!1t|6oof^JM-(|=4XF7eVEe&YrNinqchFSq{ZNf0(3lS}BpI9}C0w#t6eIjW0+P^{8Gl`Iuag zi=rU~Ht>=_$%bT_Xpuxw?^{Uxl=wrH(Vt72?+TVYIRJ=hW3;!eQg)sz7|c#jShkW| z;44*-Kt-A|vTxz1sC{zFJdCqFMjrVZAA*Q?;0vRL at 04BkK7qEO{7jFu?`y$VGbix) zMdDU^Ag zOiKIfckt}GaBtwFr#f7Na$f#Mr>u;r%c4IzcmH#p+5WDx%Z at G;8B%E}NrIFHdI^3z z*_zxqL}ii0_!arO=sEAsmh*9BRd^J;aMejoBx$g?j*VyU&+OdHp68br zlrM_ijj97tNRTXy-Al6!i1kc0==7Jxl#{~fF^-oB#-C5L(Xn4?6Z2_yMas4$P~FTI zvv)y=#LmPpf>v&~Z5gT_lvkt9EpUOUq+ z&i+6iz{f#Wo32~tCs!HYL7Uv!qkI>&_IOL=!E$6w3VNZ!od9kvw10a*+Fa@(9C)vy zwxNBX*fjCK81TZMZa$|nscE9cBOLduh$GUj;L{clneVPGk0hVAIQa#?7CI|VP2Tc> zLZMzfo$gaNv;Xwu_;U}fF^DZNMFQg^%Y}MT|i-~@Jx1KGZ zR+Xn()o5aQ4tIn8ul#LZyJp-Q*65i(O4q#qO=*kFYoGEzN)P>WrP=?Vh<2$(AG9iD zVv^JVtAx1=El5q!E0KdimgIF_&q!@f+?8w-y_GI_Pc-BS`Ye+3q#B`vAqo}lS-Sf4 z`Nq at o{^0%+>kFr!v+7U|B4RyJH|wk(><#iyG}~-?jS;Qj at 4B`aXCfqWgVq(FI(#=S z$L)>W(c?J8i6Tpw*eqT}=b1a{X}ca6c)u;}Q|YRK=66aBZ`31#I3e*wJj zpUchhZ at H)B&O}fJIVTiyaNU`kxY!dFKFbsxrAK`H z8clV@*;$K6uih;PVQwkxG(1$-(&+1c4}@q4)**n7SpxzsP4xLOu&J38&=5{VF-x+c zio2b~fPx;>@SCZmNiR6DRWb1roO?1(l27CUXf6eBn)3>$qGDhJtFh#GzJ)UA6Nyhz z_4tm8mAbSBTm}}4%K7C%C z^g$#^bvKl%!*9yV9L!#=HQCQ;6f5B;rDYk3N%C(}V; z$gqn?WVil57A3aJ**t&4vWIqTDM(~I;Yl3-8Hk%VeX1vG{e-eF2 zPHg=iEu>--t+lX4-#maDOV9l754r-ov8&8(`!o{&Niq)L`mS5}G$3fz$ZRkz9e-T`gu-##rp4GK` zoGa{|aESp&Nt94!?oCz0N>QTtcD{~--{^8?cKZF*!x#1!R^B>op~XC3A%zZk^Ep1$>{assyAseBx?lErw0wvBJsq~wS1Tvd(1K@)SP%1 zMhq5o8+zXBL6oHxB6`l4lBomjkqeQMZ+BAUt2jEqq=_Gn`Npws;dGW`>q6uz{X1w; zJGUIqQr4cY7*`tYi4ox!hXav-rruF3=Fgp#eXdY1(R}g{Ph?9(npVUc3x6WppHPAx zX?MGKTIysaD6A<&aS1L~_>MyrDpP at wu~>2CIX at EaJa7mO(d4As?I(^E978jOkie8$ zQ8 at WW>K}-Ioye|h_yh6Q;+5Plb*r at f2VE(!ERFqN-B65spx#6^mdf^)YY_RCJ4Lr` z<6Z at 6ggapsCf2Ho!K*H==(85tobZZOQ!l1SfYiW4d4t)MDuI+L=RMX#q?)})8f^=Q z12g8Pl^lkH at oT657F&MwnTZJ+49o-YkHzNt_i;mtUKkp<0gh}Fl*jWaXS1h#uQlM}uL^ znEsc!#~c78Cc*NDpBpc|b1&WbH*XfO0g!pxQJj4E{%-r;0EOD&3*JmTFz&qPr=UX9s=Ty_UT z8}76YUs0pBqq4wRR`=7Qi>w_l=Spvn<`FQMTKn}4CY{gKBgdBRv(ES@0neG({T2K!$pxrXWnH#pzQ3|rj0 zsPAx|V!6H|1(?@NC)h&w;exs*SogY2Q=nyv_K)kNLB}~Q?FKg|0KvT&Ekm1C)h)?(v(VViq(?_=u3dHrdvyf-;|PbNFNpW zO6&I$DZ8Bp7Cd?@Vo#{qOmK;Fani7$#M;O)!X(AD?lNEXPsL$Oy2m!1IfmH|@mi8O z*^1FS0xNhsPy2Qozs>!J9f?qh?#2l;CW{t5=~m0E>wA$27R55~Z(1C*m7*bh<9t2J zt4zT7)w`>=dArMZ{EvU-b;#=QxNqLsg+G3V;dzF zB#wpu5j=iikHe?DT_e^rTKknC`c^}|+022#Q8kguX)UG2FEQu|m4#8m;LpsrVy}0L z!l{_Cx1xMlHsw!o!;c6n>FyCG5kE at 0yWH2aahd}1MPfHW=}u*=H!jg+ElG5)$+)70>b8F z&2GutOZ}_mI8XZPiI7XgAKj1oaWn4=m7vg6X*3HNJwmxC>I2KwUl+j3K*qLkTxh|9 z_=Xn6zu!A#y=hpnzlwn+bCp=Yjr0)%|S~-6Jqs~DJ{%Gf)PS+KO|_1Bk4(cEwT>Sz<2!}Ph+I?Rjwxie`Y8jt2pG|Mi3duL zs+OApEm7$^hRm3FNqDxkz{wW#HOp4m5BwE)JSuQ5B7p2ZgL!evz2~$HRZe1a;e~kt z0YSWNoVzs)dy`XIZ&B%y3|@YFcrTWHJlFXfGsQlp($onr#lF$dX;N0kyYd7W at Cm7) z{q1ib+Z>a(kj0_Ez-AEtF?6~A1>MxGzj^{=eaS}Ip{33hl8h}suvsZnzF?_{>f&1~ zA_b+%VF}(dX0xt(He+~k3*H%Bk^CNky&Gr~@_s%e*}s~#)K3pf>E|_}X?_T}c=*}j zcJm+{_zrE1wsnv=a4tZ!!LZCik7r+eXm?+3%K0nOmc5JDXNy!(J6NM}DvgS1VjwVC2YLzR;@>kzj;F0UtUUjnusHVJ^RpGYTEaPOVLQZDw25Gsxzh!o1!{(U at L?$;{ z|6VSpCB|**yAKy?%D;Pc7R?XTN^rEvJ at tzur@78CADC^_dE(e89OLC_{ zIv$wD2)1WOcET6p98)mqr_CCBTTi>RSt-2!9_qbzUg6otD#NvimagGb`YmA2ce`d5 zvv=3E>CD|3C?jKtkw=P9_meC(&{$9ZI(Jd?RBQE{U8&9{uY zmo&4r!Q#cug8+FBcYx?}L-no at vGvO06*KY4Bl-(I@$n;q5xc&iAOR69sqA6=eVWPh z^>_N-!eT;m1>kgkt?OGyS5uzS&^6PxcT=L?hMz7 at K#$#ele7};nd}{*@KYOs&{_Tla&e z&*XQWpU4nOzlcWKD{*y?snFxmKSHiuvzbU|uql8{p*HOive4O|8ph0%iw$48EqI#n2PROMCRsr4eBUSk+7FfNP~26B at -R{W zFCjWac9TTg)}{fSIOo$~hmc}=49Tfi%Ehi)+#TP6awyhrD?9v;BS?ltiNuBx)V4BX z9eCeZ1%WZm&=e%u)r4CzN7`@QS+bQ|g(GyH=9HyklhWF%z4AeVadT{F at N;6)p!kqv zlSdAKaQPrj)YUIX%JwYVVuD-#)-nO%VuOh}EcyCG{~-O>XKV^`*TM)w-a6PfPxgks zuvk)l-ukg%TlEJpV?~oYSJr|3Q&b%wic5 zc-nPyXcF~&N|=GRSP&OtsY4dTpJcz|f|irVvw^6Ep-}KF2oe^#>zmw0``sWoYKt`r z!|bc7^%jpf5Jo~J<#A@(H~;DLPv2y(%a1pde%Xy_ks&-Rog9rT#M#P>Zy|3WRM6 z_buJi$SqdA*pQHUE)Cn?NhVl3kQ$VBxl(%-{iOb5m(+sswTGE8Iw at v zIMpU43Mmp1ruZHh1}BR9U at 6wUV{T}dK7oFvCQcJ^NpN2%#XSx514340;iWd%aAQdD6~-Fzw=kV?xZ)kUY3> zGvC&Ll0d at IcBnb|!l$SLN3tg??S0b}k zTcJc_yx58uiQbVJjkAJjAYhafS#^t)h)NKdifWT4RVDGN`IDy9p at 6@>ps(x!&wCOXh?ko4_=Na zVL8Od;$vhU{N(A}isBF28Ji%htasaHTC>ZK|Bl(gW-ny(KgIbm)IW|{-hUP7De`~K ztc`tSm&oRHI#|olm2}HlW5AyDdRKl~lKK+$%^6H1czslds*bSBbpt^Nfkxfs2%M4_ zB8rD}){k~L#;#PA2UX{1ZZ6S>=e;n+$NSAL%@?YT9|eUeqA(W30Al*HuC&7K&j^TT ztZLc{CbA;y=}L_hkkw42RS*+hZFaB^(CDSMKG|he%jysqoa-8QJxbzFbLK;2bLKP6 zCCyC!*~^LSXf5Y;U{JS;%NhaS6F2L~=k#Z;`7EbybmQ12&b;eZ6AUag*S~G;?4}xZ zH&Z7dxNR%*1mUElP@$$fs{L}Yfg9KL$si3vV<8nU;L-P z)k9sEuElMnmr-n{J(V;T*BHmL;P`fo%e^<#B>0 at 1Kc#)PZmwAsI)Q*y6D4j>+x2kx z+FBaiw!G9BgGE$4?-667F@`yN#1rkt=V&Z7rdR{Fr-W=;)B>@8+8(M`G6cLs%XkaK z-CVo)(IaA(}$1!?BH=b%9fp&R_$QJlO$wbdFm-wV6{L6AkfjZbIo) zM=U^^#|&!0?ZP!Gw?vTLz#utshe`wT&;se#4&>Qi9^YRvIt6>TyyqweavzRKihwjaW%h z0&Bs4BrkbdT4aK)Wi1?MiW`XK#z9jdaKl5C7WuAjV*a1^xBunUXsq?ZfInUZg9Za* z_=jB|;J+3ab$R6_70h?Xa`8h|6BsD8-(doL(8pjxrYh(T91DP^{s!k|y5&sMa-wzQ zM5AJUZe|WNS$*6{M3O6Ryt#9Z`546Tkqx)Y<9KM4cy0N}AaR$Z^Tr?-TL%-8t$HnAn2NVwkkScS9G>!2 zzlu3#C^D>|rr#J_c65#w41a=>`Y}Dp{>?g>eQ&{^1_4VQFN$+3aKVN~tIqaKrJU4` zyw-k6QcD at J>~tNxeB6^}hacdkTZ)1ZY*FjEzG;Q~-L~sTo<)1wGLY-EYa{N5MAoGyF*KHBV}-Vc3lTT2 zl+qD&yoI!YiVGe$p5==z>d@`SE^eBVmWC>kQ{WBn(C1D*^3TzIXU=nFb$40^G1P0> zg+9l~s6?Z_yt^%xM-|`HCKeVG<)~Ddzu2p4n;)0&0FbUp&mG0ZKxYX;K44|aL?Yi% z5}!y5aEm;^OpoGKqD&M*i(;BlSxhj^;AhOD(#GQyPe=v~i)m|aVWM8KT at MUU*1u*r z)I`gy3||n!V{*rsv2Ab4cuye)KVX=fP&Ls&z=j3f6Y<_dQr)vl8VHp!n<3ytByE#3 zQ!PbbWoq9(2wn%2C#7~0miltYX`%0JN~jweJw~08!F;~qmx~-Hi5 at q@*E;rvVRw0D zJQ$x`D)Wh%cg*mUBg`xg{7Og-yu$f!8}GXXV)p*A at gvkfw=wJgwXqt8DC#@)s(EsQ z926wn4rK6NkUcpXiAWVNOhX--*VrXt(Ht*%WQN(1E2YEtmc;vJa3orTJ`HxV*=jN* zt*`&1;GR)0VKAgYuX%BC at y6p}S at 7lV;m{vUl5x0 at JY59v1XbqD9weWkStze4Dycfc z1bRgN`b{dNiwQI at 6-LJAv{t5N8DY*vzv=-~x?_(3`dMWYEq!jO*dFgQL#}A_owdDn z)yL54&!vTLfOC?Ysq4$4>1W zGnMT3s9D-fxqEm>c54-DTX}C3h5AxcP+|EA&)nL2(0b;y&9APw>8DDUWyM8v_-yJn z1f9mK&IHp532QsoHUzdtF3uEZJ#j*KB*6>~7wI8`jYVgY&>w+kqGB#X7AO at 0os_}+Z-QWuVsHm=Mt{hI+%XZ~K_J4OOol6ODp1rMWg%IX*qsVbI5-Mp1?oK9W$0_Z#Av+)KnFn& zL|nu-K_eB|iVI?W{aYAN-p5fE{0Rf>{{_w2{v8HWj*BX&g3FDkl$?|;988K|K0P~c zd at Er>Df~nkAwn-F3b6#uKzK;+;&L|bN&kq{3sxEJsQpEvau}lVz^Ou;R3xP%QbR!} zf!WpSVk48?ig@cFatU at JYeSXc`DiTf?SJI?8< ztBo`#wvZXlDr<%)D<5aY(JVJyvA%A>l+i|ptky(@5I>Dme-sO}E&Ll|tVQg?E~8%q zbleLw415X{28Hct at Z5&|8V%?5X<3Vb? zqZpS2K8)*;XR`kc+W(q3kxcF&p6W$PV at M+UvL-ooM^4UB7>h2NXaabGTc&mm&ii6k z?H2ZsfC&9`Jf#8taq??QDaTf6X|z|=WGm597&sYVnnUECtaxjToV>5vuOn9^VMFz8 zZrd-#Gp~e{9M9>!j9Io(N=C5dj7h8yRkBVhRtC>4zu?T|m-YEe7PW zQm^x at sUP8!YBwqNk>sl8 at 1z3iHDeCCFo~fMr^WMmW=F5A^R%PD>ycr^XJfy6X}q}_ zNdoJ|3rp_9>s%+xS+9fT%S&Ofl;89Hlx)<1nk*R;2ZYn{tZ}mXV&hL2ZE^g3T)1WN z9r-rlMHd|c=l}*Rt+pIc3X&0zd7JsKC2wh-m+}k;&=Lj9?;;vN_3Fa!4RG-$##0F) zy(oyW}+0QemIu?Gz`4ucxwI578w7Ni6 zivh8TK?D1fl_qDrW%rF{XA%_L16X at y(YgdKv%4rvl2{5dWQ+EXKsm#h;ul;~RU>pA zPEx*D6Rk5MdXvcxGDRceR%&rep5au{&1eCJdn{-A5JZ8OfCT%4Iee_eZGgU z-p0#eeZ%t at OSzV15(7;XxyGs6l5N?!o7S$r0NvGf9KdlD#fWFMD%QKap@)rS!_Ml) z=5BBC=t4=E(h%6BrJCG!y1`F-gsjZtoxscvA2}JPP>Qu;i>VGRz;s!?!mzc;riYgy zdyEAG>}!M`b9!q+6T{Dz(3X*;wWakKDL^sKG43rA=}Fsi(m>fOi+{2$lVmLH zaNg`eXIB}Nuz>p(E8we}R~76a^5D(r&op(}4_z~v^Uq9M*mFc0M$NIh>ZYBUNH$%D zi;1mFXiGi*ka!AsGP_Yh0Tv33cQ7&=`EfXnr<-!?9zuy2g^JLc7#Edyx$J^{6nyzY~IMFwyPH|)fSUORM^)Fb9q zt}jAs6)__B~lbl at 3Ss@VK^CJ#iVHGtbDw{lW?JQXfeeS8oeJ-6bCOZ}QKb=X19 zu#lQr;?BJYn^{y9QKG_1ovD-!(WsDJqW|Zc(vB;^f&fj{p~OjFgmsu1X`yyLAJERh zLpjG}+QYUhvyYA8Rpc78a at Gx#Wt=gZuy!mFQz5Vm!_3yL`e0{zr>LaR(}5 at YI|oOJTLJ%*}^6VKlt3v5D3j zdeFrwxmgS&-B;Ob-Deqnh5*~JmJ8U1tDLyZXYIrj3%l+ME>UTT)NTWfi_JymCCzSw zxu|(UR_#M(DU=+hYh~P{^LSg42^p4fmbnn6PIH-Ui7YJB_!r`=c8TQ_hev~1*mZPs z8dme!?2&e)W;nPlF6&$yHB at p`AvsqtxFbhoE+;?pe0^NlKjxL%E5h1zF00tg_QNbasJc`Qa5U_E?CGyNf=4GW(8z%~3hQaSe4QjJlMktX|0g?u$&Az8dEl9~)_j=ep{-eOO- z&RdfCmw7?>m2h9mK>fB(hnEB(NA`E61^W?<-1T`!SaLc=U38aj&yrI>^dO{O?tL)BJ|L_Bxc)jy;=5e542*UN5IZ zc5Cw-q;h>}sBhW0{!2P*{Np=E5(%D3sb`K&dGoV2TFF=q=37?3wpzwa~ zkm4x3~ z<1*&hHFh%x;d3al0p+OmO*%!^Rj3P`9CI>KSfMnZ{EZ6hio$lU at LMv~p=(JzX|DnJ zfpPw?Ve!P9#5h3w+~RNCNQ%dmpErUPUYZ^Ss}`Lh_7}dZ+zQNS?v|<5fr5_1_yp4BQr_ zFa^8XidWFckd(fZ(9!XX8cEow6>yL_I3tGgAv;);o+lSsqeJVQCYsBXohz&#=l{a_ zJt&@O10RG3I((1q{moF|Wg$sRlA8s4eDSl#_p;-Vcr~yu;2xr1`jISz*)IzeB`^30 zP!r4;wRp->{oNt(A~s+Tv)P^`ie)sJQIDxVGaqJm{n#1IYvTko2P{}4jJf;87uL5G zZY{Q^Ij!o>T))zRZi`wEjsm7Q at tDu}^Xe8X926rs*O#nUQRCW*e9JTqmN$Jixqm2n z*@BYX74_ow=YWI^XZ0%jrZSo%^rgbO&4kTAZEG?vnEXeml>-%VJ9|pH(l)|pOZptq zG<$!sRk+2Ob!zB62qgPi at q?x4Im0jf`Z=vPvw4<&PjS{DyBhutt__M(rvke#o)C&- zSr*%Na+1~D4DP^h at w-3ST!yG}swvcdm+BFvNn>*r-8L*~JkPQ(k;E z%l0tvm#>m8`%oH4idt_kHpNQ at m=Q&)|0Gmb4Qk8gwU&oD2C+m308V^gH#5v-F!v}w zKSbpet|O#MZAle+w?n+3e3qp=?bPDtej{ZEm*X3t?#ed51S*XR*H<+-xatkUFD1Uj zYdUt8k>zN}!z9sboJ_Rq;RN(ptOK5gpj@<%Lwh?Xoym!b6J^nh at TzW;;eelIkj>*4 zq9~#uZZ=AQFIE-$=G`;%O8uZ{7EB!$=c&N&~1>Ld<_5%jU>dF<+< zRM?ZDnbI3Af~%;R*hTF)u1Uh<6CyFm*BG}#em5sB!%_rO^~0l1!=sn1)Su8WhR`sc z;EaedZp){hEsvA40j&DS8VSs)MmtAb&p(rXQiV@)n+_>USAKhhIy}zV6+;a~yM#5{ z33>#<_wzRG;y(Ya#0N#l4KVykJEQ&=l at I5?OZ)-HzfQ#4EpbW0H`PU8Ds4$=@yJ0f zCq=IK5=x#xU+N5o75P_pfjN$7RS9}a%_SI8CPj`A)k+9~^;8PARICK{a`tSt+yBOL zSvb)D1=*Ou3vs@&5>!im-4I1vR5YZiq#><1<{-AM^0+V2;$K;;l;IGzoxT05RF at RD zOO&*@jAciAG*oH|=|zbf(ADd{auy!6h~4O(C5Uz&Ieb1*App}LK29ab!pse~Pv@%f z3d!<2Njg;P2M7EimHH};dA3Qo9Ybrkh!Da3Ivc(Q|1yHX_GR?A+PgJtH3I3E2F at 9i z^@n!2p8U at _X{}kQ%TTUQc1 at ijGOh>48RN(%i&Y9VlQFn}SFcd$Y7bK6u-)i_QvoLu z8SYip-)rk2(?H936+bj&3N4{Kb-DvwTLb83IAw at s6f>5ii-{5(PXLcLt1}uEB(y%z zxX9$UhA#Q^N0=7RprX0?FPIBdt}=8`!}|x1*qa}dg{fK513z6>d^l$Sp-%u~mQB at X@VpLh!-;FF9rOqPxZ0QbgzXMSNMvh>g at df-j=oiG6{rd5M95C;E2z_28d~n)R{4}3 at XCelQ z3f&X8s5cvk-634~bIc*X=~!Js at uFu)cA9a;B%Wv3NY0JDH^7g at M?Kndw*AI|@SsA@ z3gIcn;9y`Le-<8&f95#_Cnq}(XLS=(`+rT#rY8O$^MO7L)*DZ= z%9x-eAfe?%Y>-_(OVqY&Lr5arf}Mc3+vjNP?06 at h7eqkraC$>9>(d7%pzi#XBfS!f z&>53ZWq~5`^g8%>SkJs#y{z8?KiiH_u$w6C8(2F2=edE!n7jYC5Q{phzo(IT+bK)F zNQ$jPEqit=#(5tuhh%oV=u(5;$HI0DOOYsq?!%L0V+P)!Tx!ln)ikCYREx~87+HfU^tj2uzkeBzh(ouzZCJ z)EQuV%qY#8DB%Eq5Sp1F-tDZl4hH6)Ky%L76mZ*+>a~A*%=ueE%qU1KBY^=1rb+)l z&Qbq|Oa66|qBf$R`uEI_{0^@JOKR>3N?^hm0Lq67gEUlHg?IoJbu^Tcl8iNKkP^?> zm<@vl1IkE3vTI#4+VN{`yRDz7zlxb!vN7iT#oAh}Lu=<Sd0v zD?5B-OyAZZ%c0-lhFkBA|Hn~n{ z-&*`^SKLbe+oUHoqrXJh%#d5yq9MZ+T!5)MoR)6=6CD2^WA7Z at S+H#jCmp+E{*sPu z+qP}nwr$(CZQHh;j-AfybKiOIjC;QE-FL>QU8Ac0tJ-tVnpJD9y)*_B+zegmAS74P zZu}xu7Qa!Vi!G?8{i#llIv1H!_Wd%Y7uJks29NugScDA~0crguY-%Kv3u-MOjcV|w zXDex={_R#+cv7c}?a+45RCqIc(_o)*=~$V=#TnD4Cw3BHOsQm_%7*UnRK{;zclRZJ zzL}%sFy>YH2~dcl_}qXvFoyUKUWcDfcC5cKVYEYr$Q;VXTvhYtTEj zOKTJm6lxrJNoH2fAj%_q2GPkJa)z)gW>r)E(<6G-BP;B7>GW+ute1&v;0wRuIuJh3 zt&kq>#wE>fQ!On1xTIvzZnzDWH~Q>!4W=epRt at -PgO^5QRXXXhhIU98F2jza#*f{^ zv~c(;lJ(_%4D9nYQ61UZA~Z3oRTRKVn70MvTS`xNEI8;MzgNRydpTcPR7y^+SW|Dx zX(&#{$=6Tzj_P9Ehq|Jyj1=_W#-PHI8^_yuPT|EYe+UAGHWbyB+nohS#I2Ci=f|i9 zt0GRsEcau?j6})g#EdM7wAPMn5l~XDA4OT;4W~Il7-(?t*a|Ab&^O*SXEUQt<=r0JNDBfD!?5_$W6SOl{F_T zC at w83C@`*iCOmYjZKc7yS1iS=BAhj`y(}+T>~JWtF_i-Rd(;C!e{Xd)d=51!O%hNC z>1znn;gnsOSwjmQ2OBF1Wqjp(_%e-+IxK8Vurky!6a-!;$74MGx$UXAh9!2lPaQ at m zhtt|dgk*(KAtH;ArlZ9oL8B*XmPCV1N2VtQ&M=>{zJN}cK#K_i(ZZp|sL3C0Vy3O7 zl4nvFuPLC{ZDU`W$K4v7X8CCoj%O1qR9WbsqSwePG6?66T+fV7T+!8S9dr$LdOAU8 z{P=ZciQQ9pe7fE3 at CSqLYnmRZAShBEdkgV-l%rtCZ1b%-GfuHUwTA%%enes{=;8iy z9K(>a{mJ6sk9(Tjcns}nD%Ki)TzX>aufrlSrZz&1=g_d`T+wt%QY8`}!+@>ocnm}% zdqj(b^Aj_3O;IYoQ>h5-w*kpQgjZ(j1bO2tzBNhM*${LP{9TnT8V? z<5t9Z#UZ69Qdi}vqtx)huLfvEywGms4jm3dy&69}z4vL2ML(?a`P at XK3_?5yjCp!y zD70etict7*$=ofc<74ci6jk`;`=Y@$2t9wK3K3SrKJ*ZsL?yCYT?Y_knngA};A^Mk zmgZp at 0IcAaAT|SoG|ky?!ru(}B^Y5D!3w*BeH;_up_zWyK*gm72}5h(7e%}U>I+sJ zndMO**`_ee2gx;*xISb{N_JCps$+t-htKreZX2HGxD98KKXd(8UF=K*G;A*Zp=2P#cp z>8dCJoM^YWd389ORds5cQV=9aIdlfT(ZMR3`eSr+tHv1QDxFd5wbDj#m-Lw0{ofcS zq;;KU_`DVJq#&IFrkZQXSe+84n(Hl~t>|~xn@(OZ5YAi?qf95O>d3L>P}aIdjc6l` z?{Da&WA^muW}M7!MEwBCSNI5bM$r)kM)KI3q7XrP1C!VF2wRI;gz0J{Hkn%VVIJ(_b&L@=@k_8~D7$ z8By77r*F^fY+5Hc=WY9n2XVme;5J9jkUU`9O=?s}?pG#9KMi0tq5qJhr(}P+rnPhT z8prGCb}xP~Fcufr>+^PRelSq>Z|mY#Z+5 at G6afL3la0;J?smN+p4<8M at ufqC*Xj0gFuN3w+wDZ1;o_40LkK5cYd=J2m1e=- zu)uP>;Dxj!#j2fgzS)S1)&A4w1Ut)i_hY6NayS3OhskMo(Fr>#eg-y+&GBF at 9eFm3 zoj&gnt>>AqU at FpiE8}d#xbSLW3>dckRPslXUC4C^!-k0N at yh!`#PlVbw#Pc%G>j3& zeMyuqOjt+8svZ|!%6(M!>Ex*_>mP!OQ+93zO3H$9_d|5TdPq|>tmyZbyX&{lXk)WQ zM3 at lhVF;bFR#CS*lj%+Yx*W(93mu$L%>V|xVx|X)3Z{<2K{A)6uE{qWZK=h>h6X~E z1L1GBbdN4jZqE2qj5}J{GwQfGPye>{&udhE9f;|fP6GjcFf}jCZ+(2*D;!fsZ-RNj zKN#H{Xviv+ky3k23iK;#%6yMcP{RWQXm_uR`Iq at yML6~EEo3U3PcX8 at gvU# zroKm}I@(un^$>dxEL$ze_P}L+mmU{{(o_$7a?jr$Q?8#FvkNl$n=ZVvYc!9ZON3}b z at 3V1Em*q>ku=f*>pnS6uCvZE!hb?40Sx5P?5wbN`aPZn$kdP@ zZ$Y#uL$EXuAV`DVNA-*Yy$(fXNLru4jezF~mbq5BHl>5C;3?i>Jl2;@#5`!hW`{1X zRZ)41 at XGR(85iI?T-+ws65m1nOMrY zg2*cu&7=5A;{sAObdkX;iK=tFHNGM&s*44iBp+eHL85cKz{T$Xd}*-~W& zWp3MZ=NRAnEw_qYj*%pDr*`~f|o&5}0Zxr09#nrjA$+U^(3|BFa1!O}x4_cW_r9{UHJ4yH(`b6E%B at -8a zNM(yjiWly&d$cxTP=Y7;{t7PpK8NSA_1#LsQ7QaeeSFepuPB^J(xNHRH1oG9r7;-` z-augdJ}X7P^%9`jj2}tj!3%8y59d51%VPB-=1C?DQjC}jff5W|=`pJAa!gDb#Yt{k z2oA|ygB06vm8an#(3}p>Ad_S42RSI{Ovca($>nyG=}x1HbduxrAf*6y0cv5;ZGG|+ zF>)rUQK)>T)YGD*)1TEOb#-%br9;=}qXFQq^%n}<2n3^=dkUhUjqOXM at MT2nANC2- zgfntzaYn&n@@NJT3PI}=1V at P7eCiZMngXV5=ESKnmc4UHHu*_0inB21Oh+*6?o(d< zL)Tp?e0A-`#A+jI0SY1k)xt3i at VEu06xc{DL3o)zwg_l#Y6gB!#U1cNpWmUIa_Z?H zoXE6~?r5P>Nic73k#w|UNs)TAG^}^ACr1SBXJ%SP(5pu1MIA0%fAvTK_b%A97iK8lE>cmK#5Ft zL7 at bYDL?CVH=tuDTLza9hjf+rXcqaXFzt~l6{yEa&3}~s2$hoH;+n2BS}b-8KdE|6 ze{A(dCBHZ&L8>fD+$e`n7cxVMhMJsMJ=j{b!L>~tjWzjT at WEgI0};+&5^Vu*SM16I zJhdGl$kpq~6S|gR>|A~`O{2W6V&%BrP&L{~5Oast94 at XYOB)r=4+Ql!ZT zE!dvQ*NxEOzze()JPxg%eE-uSIdt3`x8LEIj)vqN=~zC07(Broew~ID9p1FLT(Z0|MC=xazzD1gw;4vpwx3Hl z7a;;TGE-gy{cPn zC9XKWTxV^s0m)BXhi5l35|+nwHvz_aWI%@s54Z*?5wh(N#Ze}XIY+4D{>N}OUZQ1h znAb5WnSxJ*@q{Gk&g?j}u1NL0IgO#J$g!Fe%+p$^njtdPShh0?19!I+cb6i!KV9;uNZ{Rk!GsRYNeH()J>Hz3)u( zPFiFHTwiRFDMj+X z#r@(G)IUQ&3E?TAa|+3NR-{t;6Sh2IswVgdemrY3Mp7 at uhBd`xP-c$bMsbG?9E$#M z7gARfpYu>=z*`H15zlT{=s zC7zm=Fq4`Oy#Y+pfJTG%m6DUK_6I98zH%lbJ_>toqi^C4lqoo*q*` z8!S^Jz{r_7%K{UvEHzI|J66FNWI`DaYe}+Rm|C<^!#__WxN_NI=SehUT~*v6>Ml9aL;vB?U)kzYN-jqYQM$#Ap zTtIF3WCod9SyXrW8MY24u}*WjEf(K4KcYX^16ogMeyMCUuNhzSJ}#3%r)W*Gq){gT zr`O#9z+TQSlMgggaz*sOZ<>42wipt!3Jzb(VjJ3!`maJ{;BplgcAUV89X35A0vi*! z_ETmY$&6?gNeexZHi|rO*^+du@%KJ&e^&9(#h0Ucwh%cmTL>zeY~MxeE5KWJ0AjFK zYZ5 at jc|Iv)T9x1G>p`>N2>2qq9Ny5Wy8J69E<;PLN1Qxt7S4#VQBHlZp8HO<&bq?N z?xQ3r#fF!nA7WC;8c=e0W{YXaTRgOrva_D8T`@l0+J-`=PKG ztRv{t>xDlT>Q&5ASgO=@JZ$#qx|z9Kjnj6LbFkwd1u&)Ya4o)+JD!@htiFug?ibnOXC`VjoI6@{7s|zC0VSpJVX_h);0vZysi*IZ8AQuj z_`=hWMpm(%832$qaXB#0I!mC=aOkIB=0{Hy7eEmhisanXrBYfUzoK2{y)b}<=J>yy z+cI>tJ at 2F`_Im|ac7uN}czyzVF!IWzcZODvN?tj4jqe!0nIvQ7txo(luTFMw$CX*+ zfjPckf0cWcBBbf_4R=zFF at Ckx&rC)c{uce5Dx26fn2`&f`G~!xkHVAS$^WCcAKa%s z)<;$0K$t}R8k?%R7-7C7y8p8l=nrGE^7D9u>%}kz3)dn)fPj?2fPl#VhqS+TR_0Dl|1c2z-{iJQoB#WgR(gvKN+vU9 zA*E!lL>gZlL55ATybVeiS^`l)&Q|}h3W?BE+p6@!@E466v`rkenAR;27mC3O6dHw4 zO%QRdsSEEnVFkNZFx2IJuQcz9D5Gti;6j%mJFsCD~;eLs5YLb*cr23ud2Q zQxS^J;(iaUS4efsG5mDT}zATj2%818?56 zd#h-}q4hj{;^zstb0I1s#!5B>uRebU9n{)PIe0T$L*0?waW*r_zt-4dKgp^794{(~ zFkFk7rKlpbS1}|TIVtVq7 at TP0!Zh)=AK=Dq(;?l{;R{dFOhy}w;&s7X7a78tz#a5D z>ap|YtkWKkyKW<#MUu5vmb`KO^hQl-*^|?N&u{Q03h>`#tPAx9F~R5AYfeB at 2%ynQQs>qDE0B4MAQRgF1Q3uu05ykVAqR&s(LudKzt*{ zW!T>(aTcF##klFgfhNmmkW_$@pn$D{utp8kVa_7kOy;mz%4=37mlC70tb0g_ujS?X z$@D^`%vQSKQ;NI7H$HyN#y>@QMdye(pE9aByZ)v`${myaC2JT#wg)&d--6s_s`IPl zGowDhvY*fxaA at lYxJ2G2J*sT>dcwKF5%(|)rcHZut-?`yyjAohg at AH7#1BO zlb|%KrLFLK6%>wCV%maKPH4ltzf=m$n9d8MG^$>ZAR$^TV(f8Jsw*`9_XxJ-X=Sv3 zxav89{f~dH`xhAh2}Pyb|u48O at 1m# z;JmWoZpth`dUSw%Cnbge&6R6Y8Q8gvaxj16bd5njU*7;XB%BK}FG)G=B#_i-*y7o=2t(jOH%gYP}G=zMyR==z6vY9MfhR7jJxuukV?Z}x z at FuSH`4sdG%n=e(>P`85c7A3xL})|L_wn*=~_*k((puz96%~ys5oKGX$~6E%g|XIRXlXLes{42jzzKG}V# zTKe#?I!^9K)NpMkI)%V{a2-d#KT1>*WZeM*B^7QgvS#8X_HLKkZ>hYb5wsKvs~6|k zF*99NvSiUULYG2|wJfwwH-RM^r^fs^RHASgK9EwPfyPSMNPZu$;=DXT*A=b<@*7nA zc$b1xLO}7+fk0D!>W6RZ^b>*X at CrszmHYv$w!88v<>s=qO^*r-bHn3NbU{Hic?rd1 zi9FIceH3S71Q9vH>IY_syr|EQG^4Z52vR}QXj}3U15A^C1*ym|A;)?g5XE!k547~M z5vPN4=AYWcHRZ}Oe;%}GHBl{uC&v?X49;xID at CN6l>|+1(W9&z$8^gG*86k=76Z`T zwH6|=_ at C|>S}8=tM{sb*&-hZKe&J50jUwYIFf6FW#q;+f$QpAE5;T8dJ>BoK3obyd z{R|U~VdBq0Y9C^`z=+G2w(fTxW$*L|!!g~*^H`dD^aU*{hr1%vC|c&FuR7feFjk<7 zK&6s z%?mA3Es|`SybBksdp%lWZF?4X-3PDM5de1HDsmp`Atwyd=}WQ6kF^u%i1y(y#^}>q z{Ed08v$1*zp$B1y$FG4g7I(lNlB!?FL>er(KswcV%7s6>Cn_|oK8C!*7BU-rQXO{+ zX^pqHEjU^edi})%v+BCt^li7SiF4 at UlS|&|ZEzRt<|7OXp*Dc8lh76LTkY>YFLTAk zFk}gf3~3073mP{_CvMY`S<)%!!n~rXUSpVK71c$12ro{PFsh+WlR!i96N63GvCt>q ztJGy}2fXf>%`fbFE!rO27yZR7wJc5EDS-%@VsnheLjUk|lnPhu&%asmC|UZi82^4R ztp6chGyJ=9Sg^WaV?u#GUSolZ6D&{sp~^2tMxju|M;kz3AIx$?VSnrvd98FSmfYqC zQwEBJ&?ks*0uU at jGlFmEO3zOJa&hsM?eY0|1mlBwL5mk21{$S~*#uu`GmI;pkUuPQ zWWsXjX4d9#Zaj*9c%^`EGc{@8dR9Q zJ8C>PBKtZuIFpE0Y_WqFaDC)*F&U^wrt|B+^2mAQtbzO?p5rj9f^1o|G?t8(j(n^x zh$vR+yT_qV_BFwxoai{VuoKzEr2K3D=0c^| zFkse2nUBr# z7sTA-fo@#$*Cmg_Bale<9dMOT)RJdLv0cmv)iIE$TETpj6^O8w-;I(2J&992ouQA& zyKr~Cd(>2?VpuDp0r!qa$lMA=jnExe%>kCe at MussuAwWL=BcBA&(MJR(L7GVw~)hD zSUe6ZbHah;{DiaBoGmzUQoWQ)_?1-?NhoTD_5=o^Lj5%E;2R>9|6qSj0?1Xm6fpFxsFv!%TUZ5Wcy!N}AV zA-gvc9bO#{gV(1 at N8^Qf*bXZrl`Msfp7oLK*yHJQ!#=p0o7)Riws!}sR3&N82?pn? zKvqB`tR4Y}nn}@uX(HREjA7Tih)yF|^OlioXLy#GvLBIyfeGPXIT82xQKGsgUq1*0 z-mSkmP_4Q35Hwo1a>WKxc*@2ti2(``W8KtF8nsey{N7^+)5#z*-6Z`DHCW~b?1NH_ zrDSQ}X}a{WWgX5csP8J|Y=K@(2wr^S1U4wJ*fjjGpGUog-enz6yy(QS#c at zW{uC}B zugzE`nyOhQ7g&$jEyL4bCtgKIC2Q%Yzk at uwb=-5<;&t<`BvvnPK}XcZXB_kt*J$gC zi6;0ocPF*$WEG+`iP-_TTT1Gl`kLvbUR*%F+5|+Fx%}pP^)9Vk+}K*Cj|2lSik*uY zst$7lUheotov+T_!niY at z;*|-rhZfA)rTkLm60|sgA5)(YaS0v(lGZ*P$$MfIslZeRP}DcNv5!h?2K$&f zh$UePh-XFL??j2Hql)C;7!+{c=)cic&Xn>B{oDl_yu1gL{Gm1i@{9gmQncc*b9nrP zDg^j{Mv;vF2dLjN{|Gc};qJV47n7&RBm1GeslZ0 at ifmv2NkRlBWg+(I=xMb zJXi{QSlpv>Obu>5yqN+U=)9SXy)C2oPAj~KKYiR`3S}z!+M+QkL2b49SI$N;uO|PA zAPnG3FzK*y2Q(hLQ;TL0xp1voMet=rYmchTN5CX0t&oT(_u0qlm$jO9RyV6n at 1-R8 zrFa~(4OpjBTJN(SUDh~Jw=2m=?JIF5EByS;AVm^lvX_rujUn=J%r62!)UXC~&&Yq; zK~uN>BU?^d*SnOkk*ivZ6}WTT(L*hES*{0)6JqmM%vtqpV+`^6qOLfo# z3_yp&aO=C9>x1JW&_On*UP+oX1Oba$z$DpVJd&;0u(}b8gl|j|(-sq+SivT^5~|A1 zvyRihlIhQzOd`-q__d;jK3`oA}dS{tixKtDi$tL?!JF zPnD}`EwHMZ at dq4S%rm at 5xabV{abn7|ZURxk);xLOS2v>(h!;Q4y<9^KKCIw2;Sw`_ zz%S0|p5O`2x(oaTY`pyLiYX=2SiAi_45`=wuVSShVZY=YMcA?;dacL+6g$A7QFfrk zNv7CoZoCZve5(Xl84{Z?o6yN#?E20{I!>VD!ebvh3E?eM3Bjy6%6a8J%gr9NxFXTR z7-?i>5n%q2O#W$dz9VJ+|Kmc8*~O;(7rtcwA=5Jbi)pq05jn-}+F9qMK9L%rK=Dgh z@=dKG3?Yv;nuK{dZRs{bFukdAlIq3=s&^D!*Nwg(!}}KEwJ^%HrH&q29f|dPhMm#$ zhP%ge*@~7eogLz|r#(I-k<6TgT942V1~0;A at 0@fqaO?fw5p#>5UJFa1gjB|z z6sxZ|Bje!u_=~w{E0C=<_u^zi_hLZ=@B=DT18LDpSd(xAd`qQ6ZFxuHTECx{J{+SH zZ9GcgArHyD0YW-gU=ez)0Xl0bv)tZo at i2my8xX#UrWMzXO3peHZP++$YN3~UkTHRX zR%}}E!Vm~_*8BN^(p(3Z-6O8`b;4!FP#=DdtZC+pUVf4%Xbi|mAzex}443B at 2IE~1 zzE^j{*Po&SH8LM+ug1C+GF!xI_HkAOQrbPi*rx)Sm1p;9lVj2DHoB46nIj{Q-3$|V zwxD1)Tk;~bX_;Ic%gMBP7Z)3<7`f@#7>6&voFX|fOu2Heoap?;fAO>0B|2kC>u0F8 z_t}4N-Qd=md6%nkgJk2sJdaZmK461G;^|NO1ej-)gj)f^pzF*ZV~vWL)S(#39LzG` zs0ah?$)#I{3t0?MWWO7D(uFcFYD?x}x5NvM=~C<5scy~gcek}+88h~iy$Wy+*uF*u zP%BHmu>U(YZw2hJDgI&;`ae{k{|u-qPW+epJZNJ|Qq1SuBnl>?cK*=~BOo9jPZ0b} zK!&6`X5TWSGJ|DRN?{9zE(b+~>lZ38#Sx++JceWB?&@OlygAtW at U&S<3$)>;B!tTh zf|H5!0&8Ty`%5;vuz&t&&44b(y7mO>SOgh-#c+%_MM6Xt!{JHCP)vIj4<@9zN6EmK z1rWX$%zZ!Bxb*_q#NO~`W*rf9=l6Xw5GOUDsjUto#U;Kwj8fdG8( z^15+)pq00k;>;qP2h9pI-HqaKl2A2Cq3EZP`2#I0=;3S_Lc!+EKz(@zoFHFveQ` zHF65H_>XmTramIi#*UUBDDAH3KTV?4WK(hoo005#{)r3nvlj>TLuW*eoy=2B> z)!M?Sas=;l#bP+25)Nxb6uhW&+GF4 at 9Lw?|j2kG7P7m3^vel(ljB0z|yS`6^J(0_AsE zZzk3!?gD6!Tlp-&4*U`J3V$|^h{=m5K~TAyx;#%^rBD9(eENd$GhMUJ_jhizVly*X z>=)!}sW&dPJcI(_MYm^7#Dhr>O3=4-FpLLZ9tRd=#H+08oULPreHw~w ziZM7(SlF+fQ) zHZBuH%negY_cm^V6$Y2n5EUm_Ba3Chj(^ zQ_5Nu$GD8Dvo+>fDP?J4&lxzjvx_!_qK1#b4Gjfc>dwfqO>wEK4g@~9a zg>bvtq?#)EGt_jJe8oTtrq3^3FKz+8N6DrwNLbF4natI!mN)>4q<%!G(K<5GJ~74| z-7*`J8>`|i-Pw|Kwl7G`zbP+tCG;{?kio0?N}UYBBe2`R7$aNjCCHFZz{DL#x?v(5 z{5M$Da%+cPnNR~&>2H$KnAMV9&|f6n at esr`9*gkyNzCEhndN+X|4sb`zC@&*{KZTE z-y!<{05j71cK at gSPk&dHZAENll<#dXYsg4F&!B#mPKmZqN+{Yn~? zItiOblP0MquIbPHuHG*1dbv&`=@x%04Y~6?!kFh+h1qVXpTC&d4kvdUXGec$dG;ib z`hLA)^!-dBI2&1q3YyUT5?1>#eQRv!^=wPc#KgnJ#(^pmz|K4JGrMg()otQP zg+AGtGDI22#7uHC<|XUwntI};zzi>mW*e$fTk?(hzx63MOv)K)J2<6%2n z<-PWhbOOx=b7gaOQ^-a>T+Yj*L(mCr%^x4=Lx2F?3KQNkDGVy7*z-_RkZoxx-{wZ<+0ej^A0SJg(s%9GhG01Kw2-%SNTaTe1I1J2C4Fm_76hL2#bhCkzpkE?B(#0Z(_eDZvxH z96+YEClfxAcZksz;tp^}VS)s($}PzU^v~5d;&Rv+_-mC&<~0B8by;f1WzAv}#yYjP zFfaUB%j}eWy!0s@@9LaJW?AR7miH$*+5<%=r;|ViL|(W<-%~}OZyA$3M*P>+x+7d>W?k&UhF zr1c!*TEFj-z)F!FryQl5!8vrRT-6ofy%{{bn4#HP6SK*%oQ;N+>NG*CP&;~pfA)#i zEI66c{iR?oHfv5i#n%RB_rPjS1?Da8IKG zlwt372pWC at PolY%<{>Oh-_u%z4{0p{GQ2fQPOSbd>s#NRDGEzZ)f2^1Gf-!bZMldh zm0}H}Y~w3- at m~QrAE-1RaJdc6TgJVIFwYPw>$z%%vP$u?1VR+lO-8!kgmu*sp+>0dsT6ZY%EpV;A&SiumKZ9^DNE*E!g at Yg@))*< z*;o^h+1wSOUMLzrMa!6VRoV9c{mcP8^OSP*w^#djv!(eDNK?_tLEp*P)cv1~8P_iX zLjPCZl{>fARKJ7ka4kjlKSZPk$dNt9k%|reR9p~hRPR at P*aLZ$J5Zv2T8RYF|D*5I z!#g#4y2lu@>d6_G$>m~P~t0&1ezay;pJ_Y*G``F2AqTLW%)15jbQp%(0bIVUa%6UJ% zqInoa$9)@0sh>V at qfFD7dgvaNW!moqa1Dy|espLy(S%HeXhY at 0(9>ih!qF#tsFwm! zy1%ex9#Hcj#AXM`RGz^6_x192#>VCUhbVyr0%HA7*6Y6-<~F9{e|!2)w*LzGl)_O) z`Ez6ZoC-sAEP8R1f|q|KqnYx zd;o-?*+ at 7Y?!ce|Cwa4ed9;|dl11#;Y at z;p)bat!f&zBxh7d-ny@*9 at aD4xv!(liO zNii38pAyg_Eb!_C4H{f(zV&^>b3+P+g$aJL&fHbi9|d*Rhj;OFBkbY?8%8JDlWK(u zJ at w#%9D-(}^zy8eGo2yz>1oJxN!NhD3v+Sl+DYCKCtC~r zMPS)m6rOpz8N*YNimiGOzBZU=<&Ai);1MF(u zRJQ+O`=rNCai81 at Sz3l>OZjd5_FU94&g#njjS1qQs{lr^)_#?8%fq|5V1rt#xe&FhKgI!Y7P=dfx<3mJN}FFP=#8+F9ymG}JU-1_geU06JYwJCk5oF!xo~)Y(_1T` zStzbpbWoijG(MSMu{{3luyWtmLqvA4-ms(JF97<-n?y(g9(?R7?^wn#Z0g)qK&fY5 zZ|?ro&UMz-?woZAAj!P*CEmq_)5NToo++)`HJ1i!zQ6`;3oI7${^8WzwTffTJfx<( zGOx7c$UG)WLNcgXhP~BWh$?=Z$kn%ufU`4$Bnp?U7Obq-oUY__lv!1g;|$I!-*hE3 z%!+=2paFtg902(y3U at IsnDa;;=M5Qmm6VV~vjtHQ{kYmEFW8{!jVD#D4yGFG1(Xnx z)T8`b3|mD|hN~@n2Hx)Q=r#@l^nnZg0gwL-g0&vYHs&Kh`hgj`PRl0614v$ato88o zum=@A*DDvl&B~MWRL!efH5bOPSM)~6>J6?f!cjSPh1;KJ(-ncC7Pu at crdMUx*XH;3 z5>h_2{Mi&SvLlkkg>sInEeaULx=8)mF|jr=(prDUX|}r+L+;qhc^jP^Z98_OD`3sk z0{cBNQrQGcF^REdUm}&*WtmZ8ks--oC!;`OKeRG0CkP*Zd4Yw++wXs=i8F%)qt{C? z<|7FB090Qg2(9Oy>HF?ud|;D5BgoYG+UIN!2*a;s?L({DC4bz4BOFN6)D2zQMYHN< zi{8 at P4w!bK>OQcxnlkP*uVw?zeV7!+2iNUxYNhw85mR!4vBrg`-%I^<#ad#_s2_!ADw5U z5>M4^ADQb#94z*L9y2%Lt}OtKt3NSU{+5X6a`4pc?t!5vFAt#mxW5S96GTh-3Y~Mm zU&+ujaw$9MCen}Vm5tupf3W+wua3E^P=~ksyw3 at 3{-V8d@_}s=TmJY63JyGRWZaE(}cm~Tzz`Nh`5Y?aj9`WDP{7U9g{bHFH*CqgtS%+ zQp#*HCQ3%rn9{On at pFYSXRL^DT#6)pf$%Y7CM_O}x>U44Qo}`{5lPa+MNPnx#9FQJ z-1rijAIVZCfJqj#oq)d#OU}Q!G!M3)xde8AFe)vmq%g!>ZItK{>@t*%jj|tmn(6{c zV+2kycd8Wq at e0!#UzpMQFg++GW4Qs`H&VQ|*(h%1!@@q!<<6RnK{xi>pvp#Ygvb at 5 z5aM#KFLyDO*}h6aX+TXmdW-4lS1Ve4a8l4<{~gQ*F?GVil+h6TPDkEGON2NZMc;i& ze1y?cQ4do3idx at RiHCrMfT%Jbls2RLBEy2mRF}~aEXOJ0;*?s3v5^$Vr5KoiwWFZX zRRb!cxlekJc*@~@Ldt}r6uog8`5+5%w%7=j1qz#O)mh|WM|xArtC-=F+Da1A2LkBj z`VKx-X0_fb at FpQ8jV2lFsob*5r;^+GFEYRmdx at FvRh&qSo4c5$eRUh9n29i_0KIm!AmNNmYf{W<#uiG z0142FvpJvjx)hm9Rjb$$R@}rH?CJTEaUVqh)1J6_te0xR(mW7nnks?G8ZeX5AErbzhBU at l_yh^hdrb zBYO7*VCJ84ZN#&z&rw70;xBr zH<#R9jH`;4?FiyvhSxm}OhpbC3FqZImAyBEW6r!Xug4VtV&A_*a)1qrdyO;CWtI9O zS!fU*S4Nr#d=$j%a+Ubb+!?Xhd<6&W-#NlX-b;pXFP^jn6*IfwcPAgW{W{H+u9!i9 zwfZ2tuN|HbKnwi7M%EId-4uTDNa;pDUcpum;$3J5BW-j;%a+-q?#OkzqQYgqW}6kz zOKW7_5(=_V9g=YQ!5dlk2*NAG*DBuLVQa4H_11UeeneA0A}x@~Kv{#IkAHY)V?$c; zd6$oE8_nuAyDOO at jMyP?tMiZ?6&3;4Hixp*9bP#z&1#EI;-s&1#AIjc#T4e`P0Mxw zZQkj8kYU_50c9cieF#{Zd15uZxVv#%vs&+&Ky+pIyD9_u!gJmQzKEoYD;Z1q|NTSL#EQ|6dAXFf^K-)M3AdbN`T(}=$O z&ELVyPP`v8$MI!2vhYE$CAeicwp#pe9AdvqhYk~4;81~n4_Do;wcW1m%$UNsTv2vd zerug_z*{+^KS at s~><(j at v5AKYhcwwvgz0r3K_M4ILi%V)ldEhL~4jQnKcDWNA`SQz3v_omc zx5jMk7k4&eTL|ZhooPFDBeAL6IGP0~=t@*wabv3;2(-tG&0SKVD^m1Af~4)s*Kwyt z&CACfa6hw1Ybvn at sHz>!QfExyF(^C1SSO at L1Ss|EuN%@agmomWuQF-0Jy%67&hnV2 z-`=SB2onIuW{C{PLYjq48PThH`QHVYJJRJgAl;U3qU=Y9G-AGp3%0vE3bIm>FGbg= z7JHz>_VI-vtMj7p at hgZlr0x^KNMs41WX__MiB0ch)w(FHS7CL9;oLiFKIZ6JuhL>r zpCl67N9Y6e=l%QZ1$^XeQ~!8#-G&#Ip~*2GX$#qZTax}_cg}9C(s{e ziQlzzMxm1x)}wrC1<)%n1*Jc2S4=1*04Sz)wKAPYkvirYRaH*QA*vcrQ-=RTU7-nrr z8i8P%8XesP}GyrAKtK8f8$&Ds6jA^%HNQU&v_CTIJ|o_w*S{1jQeT5isq zizTzgp`LkCWAcK&;)IGZWdYj5il;fh^jhHi&l8Fl-Sp~=Is1M)i2`_R$~fJY%WDKT zxAEueUi`MF^nSa$8Wy_^ z`(}SfxV47Re93BV){Ob&Mck6dd;8z*T7>Y8xw#E^m#}(mS5BIMpZjHP$(b#pZJ5QH zr+Z+q`NEZHvX_eBy at jak4*nl1bAhUD^eA0XVR+ckH-wXR1H^7TtfhTJ*jsAQIs at Wh zwW*nzTV4~=Ihj9LSy+X^Yz-y&e~5!=y5;F%v%d%I^YG#-B;cH at VGJz0_s_Y`vCJXo z-&bF{rnkkdE~cc at 9|>0{C9XHTJx$ro(4zx%fN8}OyIz^nzqz>*w-&!XfwwN+xVbVf z;YcqLWS8-BYIwO6ZP!wlr!c at y43S7`m#{h#sN?35?p`Jtfu z=oGn72DPTs(B at aCe6c2f;{AGws_8<*3U!fULhU)3&uS;}t+;;eeWk at oGfI-<}|<(Y3NKWr&%k}czP7Uuk`L`?9PfYI!# z*)cpvjH1hxQ1_$3?MdY9+9mNklK=)JFw+X8n%=5?jKy$w7PcZa at 0pue4FlzH3(oc3YTz;WQrDq$M zC$nC!4?4d`k@>=<1SE=noU?Cn2!3qD^SM-DF?eq=z1M)HaN25xHMfdh)b111|0I(# zONQ&`Q1EK$uapo~=v{Rt2OXZQHhO+qP|gd8*E>SNFD8_j|2cTR-MlYqs?xW*A zBJG%KO_uAdsVla at munpdHaF8yGz1w5$%I-`VTDy#hfLI3;C&Q`o^lEUua)Jd|JFx$ z6KA3qB#QGQ4`XUvcq>fYfaB at v{B+U0&HkR5`2BVK%nKON9~0Zxp4Uoa2**mafebH< zF5W>(=%>jb;l>-}0CUgq^TyZACfr0`1Qb_7E$${ZAR4_V2U$9Py*}uSZA1U0QZ2ly zGQBZPcyVd4-Zr8o zox?XOfvH at lL|tWa2NYw8x?WBhTPLO3#(vV71U>JgKFESDV>+Q};oYKFZZeIRd)0cB zhLKL$YK>VKN%;@=V-}S!zs6mi3>fh at E^@fGavP>4mAADSBUZ+5on`vHEvS*P!U)Qd zrmPg5S+V3}PgH=|kuiv=FaiV_0^%e{Hxs7U1MV8bkIJ-tib1gK*%|upYEY)Q`qBPI zS%i7q6%5MPRzr4uPvu$J;$8ldIWFB`dL2f6Oe<}JP1mY&jYZ;_p01`goNPtq3$^s) zPZgS>!N85-cX at bg>P^Qn^+&|4A^Vf>$PX)9CkKdzjc^fO{9YUjvf;E at We7Y$qxt4N z1Rte3!}a>RLmkFWie>0J+;LBi~E0gse4?4s?zL znN86GorkU|U9E-IS(juAQCUQ+gkq+q+EbgG6C at 4U=109@$o9C6$xy&iFYLOEPc%$^ zxwR=g4(?ax>5kj9dnTek)U*hGfKhJ091pIIoodB*sSP#rsb7bijjZZa2OLpFzE)9s z at gR(SKp6B}Vu5cN(AbGDvMw6iBZB^r6y-RL8R z^n};nPU_QlBy)o%&+|lI7VmQnux$}2O<*aX($0Y=KQB7|#!iE;j~b7Y8V~Z|7UMDB zI*Fc^t at aTV-e;rOeKt6m`vuQWw?S{*E%T1jqm9nXPZuek?ol0zL1pZD at clp=i~LaW zRGUmSSddp>s(5ICjTfu6J$wN06{!LA28H1e(wpJKIpMiH1!{qT6Nq@&$xHV?vzMO9wiz2B z0KhBYzdesrGB>pRKZP}ca?+B(^a$SO%Qo7}D(B631a5Nh+MYjzZWWLdG(aS;Pg$Bu z+aZZGdvOnY#fXVVubty%mvgtrd}0D$oS&-8yAUg262nIFyP$fgt5(=x5F z(1ZfLL at yk|Ti%a at s;Ua;8sUS;@!T%*YHH*vWA<0#E5FKPXfG552uDN|{jC}^LjFW!3+dm;=ZNRsOE)q>o5=w2*Tw;{NB!PXg87k!1BJ=JtU z&&O5|TV_cT`+O?Nx20i4yo{zGEakU;EGy_P<{?oj%N3dD^CGjg!&nH&I^fw2u#)_~ z$`;4qSP=l5*Em`ti(#s9Sl&;Y%O5Edq|k=uZ at b4^wP6{}6N;61!D-{>r|w>*eyL#j zF-cNrn%x0x#fkzwjS58Bh8dQ0R6U&?oBQeparW5H^vpo+3Q9M}@CjY0MyzO>7aljs zSLnC*#rBbRy~G{R2~*$ZZlmwdH3$rm=o;BugloeeKf_X3^8rdf|3<I}2SN^e5Fk zfB^uY`=6h(oW8k(tGT1Gu)VXni at ueyjp09<-l=H1A}J$($&egy6cPg!qW-X?7WWX3 z&6{gbCX)-p$D>x3OE70(0Unh~m6GU%KI{IiitDz^zuZUAmIST)3C{Bh?DeR=aXgVa zS{Rz-;yjh*`1JMEY-{@V&dd7^wF7ZAn6u-L#xsyeS0(aeSk(Taf7o8DpY-FFT(za@ zH}+?cqy}0!J+j;Zyf*v&rtU5sPk3&+zmp-gAEGYoSIdu~Ni_VV*L=jF(U_TW4`J5K z`DTluAeE&_zbU#5O0~p^G~>#|N0?BQ at reoxW$yW$MB at +|bjzZn1uF*e>mDN$FL!oM z(I9T+O_qkcFdJ3a at s19+FyBnWleFfEvi#JkFqNv)_MI=fpqU7Lj47=C-2<7FLKQT> zdzDx-=VKVf>1B%Yw$6&mBy-Z(dZ+^pLZAm4R)3k%5{3w8f$kFYC+qw&*5U4M^s}ip zaMuG+I};q-2|Rc?YK<@7e!8 at Y%^8*kDRstWhVUpGN0L<+&(d-wcEPSpy_I#D zQvSmNQqCl8)oON;RpsJKD}Sic=SKdAz6(pkt4wT5RDaKv+ux!{6dI zF#4-U9be9g(B-TTeu7!RLv(@z;VEyqL^o*a6bC{2HH^$~xO29P4GhjRT?a01GO-v^ zgva=jR`f$#7$o;(=~3?)@2X--UGbf$r==Qw&{$&DGR!;gZ}SBnCon)Ov>ZJ6ur z)>E4)&L56El*?hMkbOK$(fm+`+QKwzN+Z5;E5mpm%1inn^NS3Co0YBhqQcro%2R}+ zY}PYfWzn+B*?i+Eru?9m*EJ5}ne(+4tWk7#B!gZC+5*IiUY1lTrgpj0(k?;eZhvm6 z&C{Z*;VV}DlZ3jW{7Aw?{KNdytTn;i|Hh>>C8l2 zcRiKKu^%~4kJ=eET|lOtjNfSwJ%w$ymMsU0Y-;MNN*A_|{U*IFYB1G&INWhw8Yc2? zJKc{4hR6wag&GB3Fav~%`(S{Zd#Bv{L?CE at +hvXm7N?lS$Y~_~1fk-7Ljs!4`3Tv8 zZz$ez_P7GGT@{4bQ+~76hah}t+HUOCCmK9nxlgs=kbF1w=gF4u%e{)(`X;gZ64%A? z4%3EtrLUC&AI>Hiu)`(v<|l_O!u7WeKDGRTJpPjaKI=P|%fT5}FM7fIx7`iC-xwjU zpHILEyC0qX8A+7jzy%xqC;?$!sssDWER~_3OiB!iI8 at A``y1^AY~T5iITkTFnL(vy zk at qI6*O4X;p(HDkZJba)0pqQji2=ip%*4@~IJ+5GPY$*g(Rv9kc<)~7fvRa9 zudic0?lF*Edl9HtG`t7MzNb9Q915&qCi8(2O%)-5u8$B>dO`w~5{CK|LK$*-M`4XF z!Wz;~w$`r%-Fa8>ym29sJLXEP&R-9#1J{PvCyWErj!T9Q&7hC5b7SsFbxh!i9awk? zKTg#Px83(p5l|jdp7xOk<*%7k&l{=-Uo&%gCD8hTx-DN(L}g{HeHYy9_ssbVDQn-? zIg(@8G!VX&Ri!1N~7V!C()1;CKH;o8)&@M?P&}4~-0QcFwQmA}^{vS?f{=@0{ufDZX zf4p`A$iL7 z%R$2`MBXE_bW0&gUzS_cqa(tsd>TDh`HaE0e=#4hj^?*zi?TasdFJBpPAno17SSE+ zqK0t at o}+KuKmyyXq;C#1gt9e_>lm&%f?VEn5pBsL&U}sp26LIHQAmzDb{xL8^Ca3! z at roGxYfkVpx+ z4kY~>;-- at YQUER3Qze2f9AaDqj-NT>iHu~rM|J1=Pn(bgV{jc*HUZC&8$`1B-#=|c zBWOn`_#5xg4ekR(@pqR%=!hfsWyDJ4N!abg2jo(hlSq#JtJSoL$jldiE z;D7C6h2qKqYp=izQl^ok&Ry;JnBn3HvPd`ED~*_Z1O78Iv#3>Z1pgq@`VTT0{vVMk zZe(oZWbX90P%1I*KPohWw#}P2UD`wNa`HkH0)Ey&CkF+YQ4FOO5h17P?F}|$Cg87U zwzOOOb&o>x($J;70Ds62)#EM|Src3hX4IQbxgTY?9vxTP@&a7wPxE15g0aYt2nfm# zH}Sg&4o5|i!lYVs+TV5Pu)}Ob*?FDnGNdRE|F9W6$|B_oQmCx-P*E+dqNZ~29IMsX zKw8>u at 4~XvWV7C_{3hQvZ8?Qhb!aEolBGCqc=Pk^G)XBX8 at _MdXKmd?B^Saq6iY57 z`~(g%%3U#stk|wTZ|rIr0)Z z`e1i#Vx*rcQbsZJwc|DSysQ&7PuEU}1{%Q+Y+rEmEe~F^`7sfrzDu)*$JMh4E~n(h zy*Y%woV`>J8AErZ)dFG)ZFh@(3SG~k1`=s%U1||d)8I<=Php2tKqHf zUp`+zHU5trM>Tu>!;HAfT+cOUyMe*UK#g0W3^MJsK#^JW6sIB#(#mJMiF}VYT=DV} zhO(HKPoQI%>BB&YRowDG_ukeEc;TWH>~Z-au_oI=3>-lBWYQhFtL9gw?TWTmn5ad5sh9R{3^lI)9UeIBN3ZbDXabirb1rR?>(09pZqh=*&uc0jW3J%9*t3rSu9z-4wzYAt^ zqCJ?&CeE7~_XD6;$y`N(M+^=J9Z~AXuRHqp>S$Sj=#xP)11CuB^H*mDwx+>$5P at HA zoa;B3nBz38v`OQ4p>|yq4#Vvf5c+myXq(*SWa_UJMhxT?WmUgS94w5LDMjWhT}ciVCbE~(b!So)mRmaGlcyHgA;GE0Ayq{e+}mQUMBQGl z*C6nip?9M{38mow#)69O zj!wqb|J{6rN}94r@(5pW2{xtUgAU2zmY~+*F5#}Ay#Zndb$Sg!&zDbf at T*t!p7OWD zFK3qC2#^#ahD^7j=%&quKcO)8`mZKZ?23Ef{w7YG0{+$oByAY+~4E7}X6Gy>2X6&zGLa69~`~Fs&NU zI#AjLb~}F;4rad!a0H0sK552(g~4PvP>MamB``Xy6pxm-lTk#Sg3}n|*c>;+XcEcQ zkpVC7Q4(;~lp0!21y50U%#`cN45DZmqkT)#LsgZwL}9|Pm+>=NYj*7zPbR0Ct8d&l zc>G91VVJ!LVQ~H^3e#+vj42d3IOiT+_Kbt~j6;o@*3L_@#c2-X%wcHwg^ks}`F+MH z_??XmFPXk^hkljGW)%PIv(UvdJ`?+CgjQkKJ$3Tiy`r;z5|S(<0e4cclXpH)z*paZ z*JTG1<6TW6`8L-;|}$icntDm{}!!ZYT%A2MsAj$dynrssymTp;@#YH>O9l?pK~w zHsotyj4pkktx{ifh;&p8+?ce;+3B*EVov3fC|Evjyy+|CdA}WNc{bY-eR`^iMnC?~|4y*i0sv1`rJ> zWDmZcha}`{AOdR%dPD`WH3R+uaR)K*V#hr#jj-qUPxu$gGWgPQn#0*fuY35Hz01XM z|2C)A4O55QR;Sj5;0gBCW6tfbr!CW`RNC*i2Sys4lYG(-v< z_+6~HOtxqxgn4|e9$}PIgeD0$Fh&O!%z+FnTJa=Ofs|q6*7vY5Qo)tLa{P;AOLVTn zJq-le;2F|L^pm?-<=FU;4k(;HfU0t`5;Zw}vX!I^oNTFrDILyu8QEf#fOysiVs4W& z75pT7>wbz1JUK13sB+D#3>yzE{$cTch7CoiH9~(!C?NY-QcKmj8n-dc2?tM+=`^jl z&UONcxQO7>YG_Gu9kF0g5h5%!GPMfo+en`65iO at kc{t&-WLndux z6{>PhE*4|8HuH@*D|4UB^^LLHaGd9tT`-B#jRJLJ|A$&eh8BFjZPeVhD%Bs#)a{t^ z%p!pTC#y9cMzKEhS=LFE!W+!Y2|Y65w5t2)5ev5E&l>HD2i)SA>}zz(V%IVphiFBS+lL8lzDr0rXr z%`_afs*dxmHuO2_TlZ71AT)pAXtGGnKc^o`9rdDAyb&A(ltEDkySj+nY% zmGZ$hfAe!|=>~4A(6IaVx5U(Q*;_h%rIwFw at 9FnC-HCTceD3K5?AYZm{Y;As5^d?E ztfb4pEp>McuW&!Y*dv{dGSA3QP2UHb^Hwa^jDAByL#VfM?h!{=Mw2iBU#`J8rngHy z*Kp>pfl`#xL=296X#=Cs#)x7B!QfR<%_5ocOf4S0ZGm z_3pC^jy{Z0!{C~mR at ff3Bb6O~v%kb#Hs1v>{i{maR#D8wu?u)~ON~?oXG_9WQOg6j z=e at KSFz!@LZK0b-o$;E&@?8Zc2X z*`RCq-^IeC=a~lEen9mJ|S6S at TQ#w+>S}J9eu-g+3|dfd+T)_o{@1udEU`kYX)Ao$Gv(+ z2ctm5xiRJulWoJGROlihXQ(T5w#wA?{|VuDR^G at tDqu%1kt%i9?Bc~6*c z$yTEwxgkFX_YvarA;kWbiu^5b_G{4oBM9;%s{FX7$SEO;!8QvPwDA=jvoKx`L8 z265lsgGZprC4)fd_tKkLfvvB^Bgtn3(B?T>3cQzy!&)$-rC#}Cpc3-7t}VLeEvf1L zKy{3B-|+B{LVBrs|A$+yFucrc$ClY2AO8{$$u^0N0sM)FzJULi at sNiqDOiE&t`SgZ~&@**P@p?IN15=y@ zFdOldZuO=wCQ=z4pYHaLlWhTT_Iv={H%9hN0Gn%$_L{;y0NFR}Yp)FY2TAUuU_TR9iTJFA$VGrzWJEqYZ7hajTy??^uB%xH_Y8Jnk>ijCL8(kBS~t5w zD4m=S1msaxPBnH%ovrQ>K(!3a5ZG at i6|*j$s%K^?)zT?lXNuX`SBH>jz&!q%9Ix?! za+lz=uyUG4v$k4q3a1Vd{ch}sS)Bh#3nrSN=jNb4hUDC>PI*jdy1>v9y!P;t^5j;} z?uziaBF237ahj5RY(H<#`Ep`-X`>G z7;Keb>;SbGKuL~J(iKq^!Z`dnR{XTAF>rds3#NRCO||01GVN~{JEOC at NW zg8UllPz%F6l`Fh at ibG4fSgr6{<4k)PaaAMC27yAB8Fs_ at t{dQA0CuXC1PcxTFa-|) z!1BKU*neWGQB_kFa~b6ej0kqbFkRCsrWXdSSYQBAIu!d3=DF*klQ-we)r1J05HCE@#k`XJ z{i1VvYkSKy+dJy(E4$kpW at p^3`iFK(Gyw>HDJY6NO1OMVOU0f!N>W%M8HRqj9fo{Q zB3O$&@~&_$n54v=qq0nLz8e^&C&Ey@!Xr5B%P!8zORN?xhMm at 6bbiP#I|{G-Z3j`c zxFWCetzTHS at GNld-XK}j$nCK_R$$276YarqGE~ES5v7C98vRk=_-TSQwCe^#n6SK3 z&3D5Hd!ZlkQ90CVVjgJ{#r$V{k+s at UeP5*=K~ns*BtcS_l at _xC@pOYioax%D(poYs zxmkL~SVUnljZ{V_Qx?v+39a!^5h-#5h$WSOoBH%2;@K6p>qVaF%2tGaBHEoK)RX;{ zhw`?v>6d^il^P5=Gj)fsX%<+Ysze?UGFF!^xw8rtgz5_WZ9sxzExqNDbw6dRl8>9{ z;V$ePqhs=^jhT|b<4oo#JjWnby zcEc$|1{YFOHO3&zG51t-=42?DTC=zKEm)aiD#-&_OR8j~!My=ScKI8rVG at u*#hV_m zLC5f_da6kIpLahe^I)itsS59+;+uuS4&n at pk0SEK5|JnxEgc+peB3Alp at f)CA^Uym zdLCL6g`qf_BypvkZAdX?Uc?*JBru;`NPO&c9Q&CGve__U9 at e*8MYiAeJhzO-G?RZ~ik& zj^bpz$oMqMy7EMZM%Cf*P+0%GNv+GYs05Sd(fl_yW9gnVY^WRh9R%m3!bje2AankC|MzZ#dP9UTYyQm{DLsG3ms8&7 at jE z;W{KnB-2+I%Sc;y?Yc=-mtCcfpSOdX&R&T}3`2wP8 zy4ySD>?E3urD$NU49EMyPS{<2?3m1_B&+5l-)Ymlz3l05rx5NJ#~)D+PqtHqol<)& zXJ?`|xjK-)0%okdDf?Dex3cY$~{j#m1e?W!2HMZyw$UI;0NW9VAH_Y|!<^wZkEOjJx1oNV>6o4Fv;3I`xefJrix`*cN=|TkaQ|Mi*P at cr|&Ikm`jX51a?`VB&qJeocUW{U1} z^1~Zbmd at PS4Z$>)IE(JvFS9 at Xpd`XEC_(B3FDnmO`NKEzegO{3A<406+5v0)fnfhy zyuqpF%b at PdprTtPK+QMUril0oP~H9O3%iHkDG7Lmbdww#h9$`5Fb4h&AhNMuq09gJ z?Twq~!&47v$~_7&<(ip!2eC`HDpW=n7{b2Y) z|MR;X0WN=brLHJE(&jkYl6`=Zt_w>?RDJ=@#8z)Ij_d~ihxbCY3TxgVZ}9wpYm}*b zP~uwxZun8QwX-4!;BiN^&(!ykn%B-!pqiZa3F#Ce7C75j)-8f)=6F(aFVk(AyahO#4=ao# zm+l?k-#j-_!JAiK>A8e*+}!L~F7Ax8rybvRNNvbVVKII>2|}-$zN;qZQaN+7(}KQj zn8drYi$=&Mq+eu35vN7IxY at 7j18q_&cj0CfHK$;w131N}Y;e|4q~-?EALeeGYY86l zop>~qr#c>qpu745q7%B+=JoWzs7jZ?+GTNUjbZ==~vsC zI$6S_FFDTd(fRnL^AP~dOe>_qur9?dY7V6b4x=c8=pH9SeE$4nBv1y<&zJ+KkFUNQ zN%7G)FviSn%fpxz6%&p!@@%%`nI_x^+qJ|>1T2-H zR`Lv8N2YO{kMw}CnP&4*Fw1f$dH)$46o=KMnIHfFFwp<@ZI+0$jiHmd?Vk|r|DvAR zRz(s;{$fct64c`7uMJc>6lGooptLAt4uQhp`#~0J-rK|>{!^`Ob=H|!yHtsKAv|w~$h!@ZEkP5}Yfy?;tAm^$7HmpJGPU>!Wj| z5)UukR~Vd_!^g$V#L}}`9jS~5fmCAqFr>>6*RL)hvuDv at CYBv;{nBA}O)*{pg`(S_ z=mA7-C5Zw^f0zp(m0ou$CYl&r&pIMoMPi5SMK2b!YX2#Kx>sb*UKPjV<-n|b1b3l01Om>yk1iL2jpaCvG zHZ`=Ndy0Ar>KMyBiinai86U~M#eMQJbFInV#InmYVnS0Dsj_hf%KErnjKlV(%a#aF z`8S`~PtDBN at Hd0SIyZcBA)|O1MN1O)DRWUR()}c9Pr<%aw>^OSHHy}h_|x=Y*#zr4 z7Uu%QBKOL`>eCbS+cLWD`x9YCnMN(TIg;zPt|E;HdsU92;=ztiMa6uX0Fz}8-Iy>Q z>z0VQ$R^)OpZzJeLhCep4+^l`LceMyu0cjf)HNkJVO|5JhNrZWmfztNXj!ErhDySK z%ft~_#ezy3Js_PPn3j1tC3`=`CLJRSGpo{6X35Icz)^Iu9WPLBeY7;9 at 0ris$#eHu zuH;OaD3ed{+QRy&-Dr{{{R~m1tBEZ1=gGV}Pg*)KiM1?TB-1v>5!SbwbmT12z^^>* z6t%|gsTGzp$jxm(#KSEmL}TD7MH`3(K^L){6ovxC>;Fip&Y z7aw^;`pf at B(rmOjga))1e>@@YAHrk) ze at Zn~jrA at 6E8YCNut0HLW}Od#J03(zK%xZ|<7zoT2rVo?4(Sjyv`a{s4`Ld#J^*wW zZb-zhTR;HsF&B3xx-3PS%mS0I<*q*?H8YdlvE%-J`56~rsTO&dv;gU(Psne!z?U3& z9?S${Q}~dqTj(W?JUf(9f32 at Hy}gmq{57!dkY%Fne979J!Kx)n9VvNkLq4izF|uUU zK{rcGmLq8c+6WJNl>)!%5=T;?tODzm+H9dfbv8Aix6Tr>or0_IvsiC}S2;Q0(e;5N zZttU2*LP;W5nDI;3QzW=Z6*UEyMLM=?KAzt`JQ!mvPLRAQ6hH$CEp727FgLe0M|{+ zg0esN8!5Hi=QN}BK{RBLUU%n55%#<^R*SFcD0ZP}wwLvQ^5#;H72;=#WM7XLBD5M& z3VtI&!FI~;80g-tnx85feG9x$E*;^K$xjE9oNun^Nz{RkD+j7Eqbi2=A-4>7Pq!X- zP&InoA$U_dNb+C5yArj&;2wU9ec{Y%MhV5v+%BCm9Glz#sz21R&Ug6|iOvXki`i>O zzR~w2f}=;*S)0Ogo5DISLF|j2H$?InR2UEA{;PUJuwXL$&#D&S-}VLjznwPx=i|4I z{HtyTS?G9qt%S09i|@yWTc`~v=(G3>EVVgMW800{f0WH24P at 4%Z5iO)d+=rfJf%>Q z1)}S(Ht at ec(TJKG#n2&=oKL3KunnH;720$ns64tBMt;LqUT}EN2UJFKx1(jE%B&3c zi0B4^Ewe$gh|{PY`it;d zYGDA)@C8uk%|F5vW3E#nZj$|)G1YNvmGS<3I+_x|(@kCo9Uh8IuafU9cgPtD69eb8 zrc`inzz~T=aPo=9e+Ad|wbgrwwk31Gx4|3bO&mFtt|{6-)D0JmUht@)Kjzo|`0pEP z!6p at 6eY!LYGPI;kJmgLz283C9TrmxG`^4!($Y`L+<#6;{U;WKRnW%%^kyCQo+u=*T z5q-)qrH8cKlTxBPVa^#)Nu7!*TJ}skRn%B{%7?--pQW(qcr`j7W+x5j>et-RORV34b1u>}L1EIjF-?D*>&&|(hJ$lZ4azfIh#ftRC zWQ9LJdsA=BWfIdl=&dHo9!fHu7GyZiHb9d at ZMv1qv)jHmrGParupi!Z%2%(kJz&yV zuUM6tU<7DPRmEH_oH-}+8vt|9U5?Cj$`t~)lw!BgC=(xZ8U=8gYlPfWPmt;gem}X^ zlxGiCk9f`MK4HS-fBzV2M?Zo$T at E&>HA&`j~-Du)3Dv90dRF$KhM zY8}!;dx<3TTUQNxsA5d)OJhBkkoU at G%vH72lww z8S<Vp;p({byN=Sj%zf)YN5^;-z2l+8ejV6K8M}hBwkXa*eohghcB at Gc7xM)N zZUS>bCrE*Dcw)bicdTVdcr&x9C#=O7v>S=0peOy|M$z&_ at pas0lJSOu;Lbc{9*fr~ zF3}+&wo8QibBO||Tvo>+sPOrN#YF9(wgOT}1sMt-42IRLYQGGK7d#^+e(`O%3pxJU zg{G1>`(gu1xZ($iQhTRQ=#b;~QiP3dV at _ro@g*xEjW=R8t-fEm&ec=Ry0rF(w zNTm}L0o~K?G|-Zpxm3l$No1F%4lk at k9-9l24T>sRSem(}U21r8XjY zBg<{!|X`1d*ra`Rck{eT~XL1 zZ!wIwOg<)i=nv^Dk=i6KOG!T1(`jyS!O|aC)9G&fS8)101J-Et@;xmQlt^;r-+-v=EnL zZcLj^TCY9B_tcJ{!JJ;{m&y)#ibg++FZWL6X|XDk#xa_VgHg*J#gBza7Ox^G1IpZy zRt+u4-kOy6hIAWa+1W(iMTen+!G}b^p)s7^Ce|2+noNSb`c~*g at A~^+**XT(QfswM zHe)+Kerx%dXWwNooK2JQnR|Xto_EV=YsZ*Jd9V^NwG0 z$M9)H5niVq2$fOF=C)m_ETeoZ-8ngaf at Ry}WoGLZc%bHJ3(aRI9!qP%>iF89a7k<* zWUAlyH`j;;1xAEI7^Ye;@#rMq0T4_Ye1sY4Ub-VnhkG4*-BHB^u=@T zPCANhc at iFEc!0%qUJHB+!Yt=SxByogNm=4PiT1kEmv*cZ^j7oBcK8e315rwA{oax^ z9Ou%Y?K#N|_nkL_a64f0Uu;3ezQK&M3XR7KiDz37wK$KufsW`};$z1(s;ifJLTK9C1=DZKHzK#{quyZqv8R{u#HWL zi`;yB8iY6jp`4b-+lOH=dsn4c(jC?)PaMXQ%yN$HcmFml{KmWddmUY}zZPc~hp0-) zz{XTJ<+#=WhZ5DWV^yvez1c66A4>&g8>4;$oAu1SVcKxfpkSM3wctZyMsm+p1ZV_FxJTJU2Nr)C_~hRE+7d(-KMti}1Y7T?>E&@uZ@^9tFTDaWm> zgZCDfJpz^D>h$5X$a}SPo#Ax%3fV7EOp>%^V$_;ix>&VrwVua7P%Dj%z-#+=9y~yg zeL>-CkwqrKS}8%aK{Rz@@+EAmSQ3wIzv~QDM_+855Y8~CrpZ`qIYB7dw?C2!#=9!$}?S&I&ku*Zw;|D)=`ur zzsHT(OBKHVC2T5kW^4ZaCm*bb$h!!t!}5LI{JK{C$9 at JiDkc(_%3-h$W(irGUK+M0QH~q z+|6S~*xnry>=So&3??^sI;~1xLpTtdBKip_$@!aT5{ouxsB`PGXq8B#$rKN%LnY1M zQ(5APvKEFLTcj1H8{bilYm9`r1QmiaaHQ#-q9`Fr*O&QYB=fF;Cx+DC at e|LAO;%u) z1c!|R at +PnhmH|>^8Z3 at bOqD@C%94txgQ;2gQ>Eh{D~hAD_4 at uKm#y2N9pTOn8#FpV z7S(Y7K~T2|eBppUdY9vbZoCRsDs1$CV1kpWw>VYG=)g5nY946}{!A_HA`mIQ2+B;X z%(@Vv6ujC?RF1>ncsd%wG6rj1wLm-)%C?4T&yTHWJWdZSvZ28!X+mNvL^bZ>G(6Cc z=)@G;2)&zOeS9Z^R;Q<_|0yHDX2JG`kQ_b%eFu}CbQ%F5*jcXzHmSn^!b~hRE|vt1 zp3hd9-<6XTkhyqY?=fps1+qC+7Yf;4E|oGXDZ-{OmPS%k=6Vs(X at krR0*Vbytn$Fj zov~c0#de7-P0708=?bAD{h%5*0IM{5a{x|gwWoIROPuDZ%C87`VCZJE;PGVR5Mm?~& z$2_pOm$BVVWtaVii<-~6Q#ah}N$-PwtMt^}*ve)&1@(tlc8+5X-IX7FO;rW1wIL|)jxy4&*?2GI3wVXB0 zgH^oi4V2`Tr|0ZXOr_`jCnA0+!97Q;EZrTicSO-yRVR?=m=_J1jo>{%FHqWkXk0|# zgnZ*w2?)+{pfs}q&n|)L9GvFF>IP<+ zXdF&@)S0F}WnH*eyqK73@^v7lRJ24Lr$=?0u6d^ly+A}HQVrjY1JT~cu16lIuONvj zZ8RejD%NAYwr!h_>GWHzMMy1g{0vPk5aop-`FKturE`qS+jD8FGKIy+xn_eCY&vz1 z%b6^B+u93ZS}?k at I`qF1f4mE1NRnw+i$=a|IR0MdC)V$v_V!)%%5Adsp at Us_S{t%) z)NS%gk~)HxBE6|q^7i=hG!&}v;z6Dy*2Ai(*UHEFP+TG{#E>jLv*})rQtjo$`T?rwN91SR5~bNo9Rq1z zl1hNk|ADS#6Ox9NS0 at B(MngA55?tV7j$%^eCdLySf=h^R7hwdW8#FKkBu0#v55I$- z`pOuqwNpwEuEn0RIjEp_y-Q*(p{=jh4_n~#FMfFEE`YrE503l);F#_I1;^6H*0$yz z<~FAP`05`hUY9|VN7gPz)mU>t2?c^8GvK6#!PB7#7|;`=14YtIKUr_!E(I at UoSaAy z%KCu&)uSp!B!b&?8pzpwK98dhIyXRnhpA at p^kdZwfFzLW|Us+udjkC|0^%1Vj+j zcyv=GpCB_%o_;;$g5n+HV#?W+aj#RZs%Iq1YUPYi{V`qxsMLBqZmP(>YzF>#}z3s6PNlu*8z1IA z>KU-jnm?=DVvDUiSF)QquPy3j^30nv%Qh6dAOdyjB79qV4ib_NO92~Ak4fdJH$8RM z)7Q^s_F&`34XnQ4Cx--PW7{m-4$m%aoh}WQ> zN(la^crGPh9+vj(7JkA^o%;F!bZ!8`l_wujkQ{FZ7KLss0@(FpvFKN$Ttz!yIHYzD z#xnZ)xx=Rb2kpG?!7vu$SP%@9;39g!f^eu-twDM~CP&AT~Hs}kaHX&9+=eNP% zrS(>u_5QT+=l3OE#aC==5H`AAG1u7C7SmAMz;5xR_lSu8xHN7-C1 at Oi>?u6F6L{Ss z-fUhS*TIOhLIF}lz*!>92WzUslIvjC$Bf)>x3~fI#Z#i~X1u*Wmt^K3I+$mlRfUq9Vw{~C=4}X{L5Z8nL%)FjH7%OxU_dT` zzkS1l`1Xzezex)bcYBM!4O08Rq(`B$l at qcFiZ5%k%p7cGBM>4(rK)&9JQ^wsMPp&% z8kV5N91JJtKC1_8M8 at WnZrL^0>tKMlNXK5G;>WK at -#al5-Ye3mKpWWnv{eqX>FjZ* zY$wOh=euLQZ_;_$!cf&DH}0EgUhT(WwvK|`kN@*OxmFme}K-yZr-OEw|L8J&p;R1HbSK=RfPeDf6 at b^!i2{xM}+`| zXzyaQX`n|-?Vs&&J58 at 9pPweHrM%>we4-2#!Hi!Qp-z~+JvJ_U-}M4WfS2!bMb~r) zPMSxkkWw6;K at mB*Cb)x-1Ab8YddaY}_)NlZ)?g15AY*Q~4~4od671ZAt_B!1(uOzL zZ2YRzQu1#y*XT=Qa#==o&N>U3!{wvbkeI3+XRvx3s34dxrT`7W7xne=LI3#u)lGk|bs3eqW#!3Skj36ls~kwf zY%5-;PO8!9Q%r~kBe9u_CsJJ49$-Y(by%AwV%2XCD>|W>d;ywIv at _}>dG5!Ba+Z|} zx?T#oOg#AmcDT00P at -Rp+-c0`mlei9Yk(LS;B#RZwLjLQI8vMo*`niK6;nv$X8&F?CcMS?HI5}vbZ8;^1=@ce0zcH zq6zu-V2A^miK8o_(VR7blka`&p$GGEv-pUcqSnl{9 at v%#a74SfCEIgs(!%;Qn9YOF z8N$vHD!hXd8$%eC9-3*$(>tv at E2izKg{}eSg8r`Yav-e)Y9;46S1<5So*W`kZ_5G| z1?p_F?IT}5pC{muj+w$H<>={?5yK`k$d9*aMg7J{VluQ+e?`6rk+`uY%MCZ3ib_f6 zj53)+TgKa%G$G0j&&_UM-LwY!=Sili`W5c?@UXt2(C$M)SLw6Fs$J_6a4~1 at +W(w} zIHN^+&K&UT4W(OsR!i+!W{u>)~5Zwp|9mAD81l0jXQcsR})3h48i=st7%@xQyjMDtHi_z5 z%y#`jhXoe}qYMPf==UrMFp}4c-+A14ssNV?U&=6f$1sD at IFxvU-%*X*b;gth5ydYb zgb^h5I&J=}57iiG8C?S5o*NM&cnSDIxwJ`6p3zHRz%sshbKo_~K;NRo8?mu$Lw9})# z4<9|qH|{!jFR7tiT39FF9K5GG{V;ntTbBqH0)&t^uck88MI1>y852R?(!sq+h!Ane z55>5NlqBAYZq5S7=L at _ryt0=B)K_yuF;p|pM8uNa%8q_TpKpGwJ`7n~>Z(bAkMf?j z<2rrb&I?Cu-t6lW=t^G5bGYo)($eJybRtnxtGka}-y=QF2EXai_b=fP+#V4%8fWIq z>3e0vSb$|JuD<~$ z(8KFmM7J5Edg%H-Wz5agbIoZ=hbV1R$&BPymWr2H=UBK@>cTRZHSfPUjCVAyujDnL zIeg0ky=|->@s at poCVd&cPL2a$=;8QktG%+w%GB7py3*afOTmB93$Wmkzr03Tb%1YOijV22 at L!ajW9l}A9 z3n2qPW5`AsvKZ4KnUDp#B?SFcMvG8>n5ou-!g at cF*C z1ZqhPIPmym+)_~Q0st9UP*~wul0f4+CZ*Z;NjlEQmFf4^C z7St at c??!_WILtOGgd+f at aiX4^1NWiQwbO9kfLXQHAV8ww39mreEp!0eNzVE#GY_;K z`k58VXP>=wRFeLv=q?k#Z at ZedvBaE`&e%GE+KBtqXbyZIQP>>HUG4`t0WJ(WMpliV zB=^Y6R2^p`pFwDNgi at X}@o9MPHX=#JT02xx#}ro?E77B$!6jCX<0|MCg({G|jM(1t z^WZP)x3#Wtw*DsovBCfIWgY*fe*f at 3{iD9HlAG5@@!hJ-Ungh$E-Peu4>k>iK#x2iG!cG+%z!V9j`nO-i|k7s=8i%#V8qwp at i? zr(*&!D%)CNRn~Zf0jk9W3uduNuS``=l at zXNkUEJvp_pf$E}|nd(`1Yl)}g3?Y?hsL zy^SLQ#?X;9+Nqs{d8FGcGE-ZA0vFSb5Y{wIU_8l2DdZ;0v;bS2s8&hyqk2B-MA5Fx z#2s(+g1lW)P%Y9>u!&}poHXAC^n5f8RAgI~I%>EC6bYuVz;V5hAW=_}i8&*Ec3ZgL z(>bH#!VT*XKejP1cO_axdJBT>83n3)m>%EaM^Ze;@z%su3227k8*~2e6_|aRO$i+% zU9ZFXjlRlErCQWmJ~QA-4CiB|}iUllHt)-k_Vzq7bP{xu)5+ z_z|G-`F}z9AC;;Gf}9Beh3 at mNez@;g9w|pGAb!I51z(quo$!br6O!y=XLW$b9thQZ zcmD^wvL#0qexF4PqtP=rF21ZK5BIJZf~>020uv7&8!ST)=Bc^F(i zgQnFOH_`h5{zTZ;xnxS)5U(?BqqJf;p2+U(w)1<_zFY3@{`$Uy^=JaKZ-j}xl4!3c z3ZsQ|DKRpBGTan|iwXQJ+~{OgJ*%__>^X{j1qOc3`0BDc9Aj3XK`0DYj%`TJY7yofqQejTQ|uXL*JEkA<$sw zm%@QmZsfrwv*hA at C+LT^mq0e&VnjUT{@5h?a{Zv8Ynpsj5X0e!8apYJ=b*CAG$|m* z at mxwPW?{I at u*6hkb<1yng-z?Xp%xsC3sahTS`Zp9I(b6bCrW{{-IMg*AfSE%R#!m> zuhg=UWULjvT+++ixN_frNoSMiUae3w!}ZYqFr)FFTa9g`cY%BTsHhy}fzpp3n#s_l zgOhl at K;=|{px+pRvHyuqB`amBLzidOa&^(RfQu13Lt zQwW|br)!kKWZh(9W3mE)tuF zp0u!{IPXP~vJBCFBeiQaq?u)yaj8D3dtUyG!3N)qHYLh5E))mXJvow~-`_ll^U){P zBd-zJAF#cze~h3{XE31TWnT$ z^plNV!UjmGMOc?;g+J4?NBxNH{$eU at 7}C%yt<`8CCywXH2vz}Fn=DAAjdc5(VR~_o zK5E=o(I~YyW5B8KVqGiB&f=Bz+$<#*=IGirRv at fK#1%R1_~Z*w at yIMP^Ov6-$vxQ= zj*#V%!o0HOEVI9dVes@?gLYxlP$9xHmvS4{vXEe?5|?{`f9J%(I|EX2uitfVv3GCa z_m&fySns1Jw9;?2Xnnn`eQsgbJRNd)0roTqDeV3oV*5<)>6ac6$soKviWz7IqpZK2 zp5FfL5K_Qj%zwqV^A$;4Typ2jSiy0ummag(H6lrKqDfe6uk;0Zpd03eiB0v}|d zEy0UDuItA-ca`U`=eU;Bb6-H6Q3&fNlaPk8v%eAex)d=&o*9z!R+;#jXoA&BqZHn- z4!-`PV571>mjB=EeoA(x&i`ij(~-kcK;QvB0m at T+uh2uSq$xRljbkpt(3QRqHm4qW zGwIyS+{rCq z8hpTZj at fSd{Z=Cw=&ag5pW``z^eIk9HXwe-3A*_j)os9s at Pi+BZdas0X*EowAyiO> z6?^s{E^Knd at yr>~eh|Bw81xgQj(&lOp}$DAt@{m@{lhH@&*!lavHP?Mtd63fHa5V2 z5QWz$OdqfiPX93m5|o7S8`8?4 at W%v?Ld~&`HE%On_10|nc#SnhWa~v0WkkYQdhrRwa1VEAc!|Q;*eFKH~kG&7V zCZ+~1*8gX8w6c}cyeJ9}_K&>)0(K`lY|aWJAeLEsfw5?2 at r96>8G=KJqfVzo(Q zibKh1yLyfHz(rZ7 at cPd((pOcHG^^RJMfqu+X4O+$!>d%CU(d(e-;#IEo^i&JTOz!$ zruMq{El at FWjntQ}X;hsx at lNh9a{(%~I)mwe3Vw|P<_hSB=njAw5Ko^GEH;phzEXcO zzZSXq3Ys~#ob&IU((o%~@9Ef)%40P*=t81?<=xQkJyj}uZL19YV$6m-r3d#J%N3aM zo8~n8bH{2+6P+z5hq_Jj zn>wj%CD87^O`a|Lfv$ZVSWDT2UBTSF<;t=vHJx=L^(UV4iHxSCdU%g<*z`m(4qH$d zw}~#+S7=u^sZ{!^`VyZ# zG^vXBc_wrkQQc=cljx5$<59+$e-|A;HD_8N3aZ3)T z+#ym8ScKnG9D*xoyS^EQ^}~|i$I`ic3~@!0yOR=;GX}`wAnNwhV44sb_Z1itC?HW_ zY7Dz<5Ijy|SapqS{;s1o47SnwTJJRFmkbNVL$M^0pHg7gQS(xKLmEJVif2{QWQP=(NDovd}uE&G_12vr(8w`!`C!`yKUQV&ZO zY0NER(2N%$QjMvwJaXk>Sr3OYLG*4qU#c|q)Lb`FeS3)&qd)r>zgOGjR-v}f5vWDXb)>c(uA z#mT#aOwAif`t8ACwRUyFt1he(yPJO{!L+JYBg8We!1CPg=6=Q*l(9IryZ at qOQQY>A zNK+G8>AELg_$`eACWI?ww`VTM!8?JZD>!@6z}v`f66MJ;E25EblM#TlT&O)wByl?s zpixbJ1{ivq+djzLok9Y8;lPTI71ZqE?BDRSNVf-B at 8@z>74vspn0+`6G4rRNrk|l?`eydp zeJ^RQF!{`FH0w|=;Pj?%bbSUs7q~yE9R0JUTHJr`OZKowDfYvCa!$fkaeIE>b-9Ph<`WbizlGru*EH{kmBWsz zF1k+L!~8O_?y#_eXaCrGj9k(p;lL*7VwMP7$+bF|gxo-kCv>e66AEaj=#47*(Hlsn zYKUW&wlnm!cCGQ88weWKaV zZCecV*KU01N;AQTzuO7^tK9j=Xv4qej>VtcLE))pqQ9W0PL at FfMXd!j;Ad at w^+%wW z!Ln2&!Qzt%sfA1HBD_cp`r3&>6dy2W_I?z at yz;`$pcOVWi*Md=x at tY%Y<_?JxFGv! zQeY_0P`yuq#yr51%IR4{l72{@Eizk<+(neB%2HvWZWe0#cn7}z#?=l3oJJf1ZfoD9 zcIdkEn%O&If0^jUU9RXr2}7l^PM0RKP3IXc(H}oO8KB}Y(T$jtrW%bB$m-OR-Jb)7@)*k1BIu-ERprrb4?k?(1TC(}vy4gCOk>^Tnys7>;T=Hqri5AKX*lj>16nmw|3HDEI^QBepuh79v zALgYD$_8?{!A}Q9Zsx>+QDi$Rz-8ve>!ul at vmJf9F3ecLa@pFEUz!nZU*E8>grxI@ zH?t{fY$ZJc4mKnbcLI4T3KNJyUy7dN`~49#&Wb$8LUdT!6N*~wGrtA)24*W{#}ZtmMV{w~%f^hIhs at 4T@W z0V;I5%NcPW?>6NQKV#&=Osqg8o&mrfFq{g at fp&l+zo$txx(dwUWw`_a#T&=H6ujs6n$WJwo4?p) zSUGp>8UNG+4}XA=_rHnnf4qs>Im#H=%i8 at N75^UQDjH7MA_$+V at r`vIya>@UI7(=} zVJ<(;`G4wT2g1WdTMr6HhvHV%a>uc0T!iy{O8|eyF5Tmy^MFv<0UoC|U5Gv~d0lkf0zp;znvJKA8D;UauHCr!G zAHBe-(XX{}HEU#UR!mGKEXI!G2Bx82wg7B4HFZ>fX{*h28*5b!Q&;y%=R6TSlZQ at Y zChtyCiJPnunLuv8&k*+gHBxu%`qXa8ZYl4rZHk-A8*bX+A;fd(g z;yNnVrM&1IWn=@{EY`Ku8#68+8nf4{HlBMEhL6N z3TMi4D|eoqbSsl>b4+bHQs`eAuM>#80`3{DyWmpkG7MeAgh*?no?wyQQ9^BIvCid} zSx`j65~VLQzy^hNvrh`8xc#_a0Cl6387RO`RJZl8=$9M^;8})L?J{{+?LmVs%Vw~` z+U=DAFlTr~*VAKRcTX6I+hwv6>RuAzl%~>InjDw$8UMSKU++fE=Gm3dy zA4%y}hA%SBVs#wgWhTVUk$$KEk at pqUa?hLf23q at WcM_)Gc at 6JxLA#I09fai-q|RJ8 z^eJpel}^VeWVb7U-NyNOG|D8B$Z$tgljs)M3{R?N*<$E)KH}E}AG%s9jVJK5iFcdtN_wAESs9gS)R*;-M z3mOq_|2onsVT??H{i8+~Q=Oe}f7FNz at jvdd{vS2^$6dXCTJx$XzI331R^Umc z>@zZP7XB6 at 4o*#sYe1U4W7eu6Zw9~B*MJ^4&?uyJsV>V0**0QVq88?r}ak<;#*pfEj4_AN8O>|;Z257CETk$B_x zW1v8`GYrVb)u0RElm&fY3 at Iep69^>Ok9-5T_tGzj>Z+y7G>*oSH=eoZC}CsMq?`sHeXTb*^y&Cvi#A0 at r2 z%sH8mdBM0j3G5 at 5)WYslc7Ki}M}nbMR-g=Mm=s_3M_6suIHu(W86agy0Wi)U>) z{!Ty~NK{I5QNBVo5Cpn6bYdyjv7o?tu%sya0N3Jcza^oeR5Q7#cqASU*|=aR7nzr&AJlG5Z+X2m=azPIB*UVW8fTU% z!zX~^3D*9bL}-gnD~n%CC#L}t!ghW2R$X56z~NGVpMCA}rpRyvL=?=!7i!z2NJv5u z-&=X4Z z)D{BiI*p`V%T$*)7{d5Csd10E$l#qu4M`_i>QA18i+YAu-X`xaSeSD)_hP|;bemzU z;Ar2g zeMAJ~1`L76eZt at y@#~ z^2KE{M+MhIV(PiJ!*~UKN39Cf5ml_2L^jODC)yLU<_r}P^bX2^GsHz?!1jsQ#dUNH z>L=2nFB~5ww^b1Cv57GW6U}&y{?#SrF8dL$s}f=!**SPJ)wjn$!uK>C at D|WHwtHkY z-XeC_%;SXL?vyi=S?PwKvM|mZX*(DW@?N0(Di- at BRK*FKKAE8ULMXq~ zUP_vd)5Wuj-U2&i(4uRq?}>I8s(x})qclodkfc%f1(SL%u|A9C)3up7cVBDq?vI@%Arggkb z0u4Eec)Q6es8snV+OUg>-psnqR->3S|RUAAg50(rh};D z;%qOO*?T_D^rlYAQT}|~#DQ<-Tl?|*M)>Akkejx+ z(b%}&@f%5$h+3$+-$sW?a>Lbmyn~l(vZspCSx%#9-?He65U?|hKzCAfDa!~`PIItk z6q$^Xr=%Jjk#It)XT7l8(wSF at iAPp0?Z6T)d)I^EV%64fZ$DHwdI-B&Df0%NOFWrQ z+FT4X>A)^9HJwuFS!JoA5_oK`-aN69essMd-A~=_jAGU at 35n}g!*RA5^+kl9-IpWJ zjqu*mrp8!;$eF2an_8uN{9|*LVkh3z%H`7WtIhVy{fy&=2rd)k}o+O37br6E_LBKW#-y9Hm7!P-Jwym9&Y%<2R)0{ylY_tz zI1KWa9ycgm#3YJ6tVvsO<*>3mfAFq+xu+Udo5C(@V8>;vGOB$=1mNIu6z;+olUBi2 z3{`qh1%Uh}U!d(0KR!;e_;ii8o?@-rG!c%c+ at e@@bDJeHj_M-gRi1f9B?6%~FJmUV za6aR!Icu{HyhkPUGgWOB#*7oi^;i*K+0I4%mtoX=|VrlC57NSBV&$eWM=%^qiLaznPPfrE-~|a%vF*z z at VS_txinm1JR#3ebIvz}+8lF%J`2k?gu+KD%d1 at QjFVwCcA;cKKPF}44mCdl0%Fks zQIJ*A1@%x)q`YXvF)}YSjjO!|{5zURF~K3A2g6X$zULoxvxm^+zKHTT z)9+yeq;qM*;?xkn8n1TwRtd(Wj?57k1QO2qTA`9pg>N*Re$bfP0=-WKBdQ~sy%HUQ z6 at wl_LZACBCpYL7;1-i&heC-vbjnE at B^KXPN>GDRC^E(S^?$n+sQwUWY{5dsiQtmY zo(cCV!RMw7?48a6i{sz|IF%E)(3BXc(jHZUOQ#qaL_6+vRN~h)r7(SZiJy-r^BUf+LC_m z71;$Rnnb8{i{(5LS9cK}(PojyDy-C_d{GyEi!*s)ZFzM^O{ zv#hQ5{38V1pP*Rk;}+bBrw at TlDJ#wH;?j(cS4CLjX&*}E?KU~_ZuFcy3}>gkeToK9 z-+Bx8m8u2jma+7(7F`kon!hgWauk1n2W=5PPM??`BfwvBvX{^57CJYoTf41hvP)=l zZ^;GY>z!Tn%pO>D-^uDH at _f0 zOhkL)4qDA9jc at 8uXu}1&d+rXK;$po^>Y^SE5Qv#D at GODrjIKNrspNj*+hO%lc-jEq zy7}vFqdma0b;vJe8#HalmBgJ!Lp1l=(=KmLAwUe}5j~S|+!_UFdcVRm)yz;_F+pE3_3C=;hptlCGURPI0k(1eQ0RA7 zbG7g;RRr&!dD)a5*< zOA>@MZ5ZH!Navy-)j>Bbenoi%z~==+o_A^o zDj4Ivzi@|}oEa{yMix!IH!=i2(&Yv(mN)W>7afgHjCiOtkBH=j!K0n#2Uoz{rikS* z=Byn8l)Uid(!sw?{bJq{&SCu5Qj)RlQ(g8C3mHQFmn?7 zF2Ue*1MPQLXtr7_vaw4S%wJBou`tm^UmNqEV#ch%%0P3&hQri8v81nWV$~riSJq(% zW0UGD#cp!3yCDT`pR~8$YC5BB-aul*&O`5wA!IdD2WaWDr<~#`Hx0}%*{PA|`R5sg z6^d3;XR_$BO2pHyaej9SD8Axf*;kF??7x{A7VMwX36B)eX`tSn$mq~TFK~Pye+G_t z70y6jyOO6m+rI!lIH%jW`Z=KOM(eF2Ax^iw#fq;K%{WN&8EQq^%-VQ(n>@35YMo#{ z)g;qvGBJ^4-AKVCJWA1D3L}$6W3*Qf#uiqYkkzxq)5YNtvvx=Wu%Z(bkVT^RZ8m5X zl}U_j6R at tb4_OYP%G4OI)45Dz%)Aj?nRO>$NX9CnI3+{Bp{!Q>&5nKGABP9Tq*iPX9+R(MGD~}=MgEp%l;)0M?LTI+Vp|iUYKUlS zO$c5fTn^?pUs)?#o*hE}UK^&;zI$TW8>^BHlix!bAnacKp?*uYt-& zPh-?7F1Bhwi#g>Q7A9GaY^6N2nQ*p9q0&1r>wVg!!Vqw#_E0v%r&Fh+ap&CESQsnd zK?1*i2+LW>c%Fs*T5=HNpfElELPRY&QYh^;-|(cse|Jy#0e7)b7Q at h1BTEn5G8ZoRvOid>_N zEfcy%Hu&?U({;?qcm_aXp at Xmh60nOhPU)%Ih>5A!3|81O$qi z81)POUo|Q|mcG*a59-YQXAAECYLt-O|MVR=|MhT5O9 at 2`<~r35i{&lo_U_E7-B%AomN~JE+GlVX5RyxJoi_;TXP&N1IuyAst$w z^=t}L@$^&HRp#Xr{-+nPKAM%s{jMn;^9G|mR}6=8;h`4royUQFJ^1$MOEk{q<4$%a zI?M)Jjk$i9!1kdm2?i9^x_8PS4!~a0w9#7V=KyTEwC~>1-;N4+)rlwj|BYK%gYZ|f z-{x<9z#e0B?RuR8W7~HDkwwHWMk6XV%W%h-vWZ;Zi&!!0ptndx___?+4OuLgg1&;5 zaYRPSkrBw)*T{yfTTH+Q_P*ItIGz(C8qlZcs69i&!2=24si~dm&Re?c_9LRvWMo?{ zx)W3cBKHb=!Hn6qpx&)ceZQ=nhFAO1c|>7aB at LZ+x)KwIy(Uv at 0L}{f;s4e_A-KEk zqC@h^YDl=gVI`MhrB?Cyu_M&#(e6!F!eUahRl5*-CL6iGm3Sm}Zj(_JHTMyR zhY}r7pJN|}85>yD7Pc#xVtTfv%W-DDYs;uj?Zzr#rblu+(fH!l3RL-tQ3zfKk9oh( z9tEl);F$$=FKR*`N(8VEcD(6BTfpUJH504bOLikR4Ln3vD1%`vSZ zsUvwE`vRWU zt at w_U)+-9XdqzQE{YyD~1>NixW4>8xd*xUkft zOdA+K^+n&nS4!Wo5z at 6xIv%-)Sj?OHE2dF>NX5QQLE<_mEbv{`Girm5&H%;paTZ%_ z8a;Z}6W_G`IR!p9kyBn0GCVod7j}8kJMcd4u=qU0&K~Y1=3f(9%?G#_`VVwuK>n8r z{eSV)tJwT)gs3m6zqPtrC`CY2LtbGlI!jU05-UYz5Ro|uGsgC76Xbl2bG_8lVE)HK z_v}|sh-Y+gQ}%wX-dnz>r&*l_AtYJj0e!vK at sv-t$7N@|-`Cx-)HhJ?V!_^kaAfjw z^??+qWYH1F4-7y}#STEdl>!hRphc;ixUY_SmyWTt-$HZ51yu&cin3u6+Wt8eZDAj> zYh7s2d at HkVo6ap4L$f}%?2>X^?k^Q*P+-YSvw4R*Mb9^WW5G*KML%o~NlU%HYKpy&guO`rAPo(?kKd;@AQPVC<3f2D2OkP47X=<TE{>$*pO zG at k``xyS~;j7ZNUAJSBeV5Ckqt~4gwR#(ZlbXR1{a%c5mvvnPwri*MtUxB-gZ1|v& z`5QgB24iaThGyFQCVdynxyxm9R%>H_ieni-wlEA(s&*l+LiwsyUy`)KtcN7wl%C)Zf z9VtM`>TK+S$ZpjxZU+^>3+mF!{U>#Q+IJ)ijA02__#5$FHJD&F**t(0x%o4MS_w|O zQ{xWyQBg}r!<9{OJyYebl{YcK?zCvs{24>7bhq7wJ^k&R%Ag}hQu#g5i98~Tke%3B}N~HBD-tjDL48wA37_JD!h+bXFZFP%MrIJMw0P{ zJFABA3fn(Df>t=vLq4f5g<-hNFqG_&Y>j-u!yfWMj*ui z`pVe}X~*)0)9*(xbZr%i9eDDU0e-!JASVKM49qR_Jle={N+D0XLo^A6ig$Z!CAx@> z^K6!W$}fKS8E^|d`$U-N78(dfn zK`MAau>}VSxnNxvAD|mxh|Y3Gfd$$qLhq66uBwQ+dNH?`4PuwWhQ~jJS2r;lx?mwN z at CHJ?RHV!AQxjt(VFN$BJ}Z`Bbl(vo+`Jb9_e=WWmvo~7(l0DZF!DzJId#@%_{R#W zEkW|M8t0(!ToNi#ZXbY0_%#+WS|$mW at tu=5;jvX}oJ5#>XY~%x*b5mmG2%bZqWhb^ zG;DiV=l}V)^X)&*H2hzE`NvGdNExU;dW7I@^G3~xM+gyZY)`P-9YJmP01P2(38t9_ zys2RDYk9-)oh6Tn=|Hya^AC3*^4OtJBa)zl37>Lj4GkIf!6`c{kCdRrEsF6j z$D@*VY&|1t2&=&;`iUV+#3?{li+J_mm4^}nzc~EVsjFGx(;9N!cZv#U(M;M#Rb0X^ zv9a48%w4U00uXcqB-bE|)Vmppk(r&kRq%iP(Dqs~8bqLP-$MWM4UR&8enjmYZ48|M z at ug7-c2@K9C__2xt}^Q)*vH+R#kRDr7nu>Lo7f^4I%9xS{52OMFT&>2!bx$bA2!9? zBg>Sbp}&EjhwMnQGc17vq{XxE-f20Gvoklmzg`|-_(79!pjzTY;Knr^*-)#@TMBoY z;<+SMlPWA)%6IYllUF^?Wi|}5x*2ph7{L|cymNnxgPF#}1Z(^#9km}Ig9+OQ223z5 zKLOd at W)f;p;xiPK)zM+xMx%!gIWHjZ5?;MD)E$VYyoqt&qkQQ~hq}Q~O+oS&yq?wDqDp_2tnMa(`QqpRMpqghWGg zj;$;>;A_E*e{G2j13#=ZAxVu2Su#6a($$Ef((l}lk^p(T=b4vh=7<6f at ZJ`I>lfL(u~yTlMceK`AJ>1!#N1Fq)^b} zFXk at j0N%cmZ=N3vHwZ$jfPGq$#+odSFQ(CBQub}^ZQu21D!aYERcepY0%+M>jQ~}J z{&Y&g(*QfP+1R_6w{k>31#LJlY`>71Z`!aAnUM; zB)VLRa^8Sn3+K}&4(J+q%o^L+5eMh9R-YWVoIIuudD{Knp2%{5R-*Wp`@=Noj_B$3 zY9JOPc-SZV=e_f8Vi9w_6yWpmylQuTj4|mN$KCY_XNNH9QX5JPXprXI8A4|tE;>!T za@*vSSb(n}_gWSI#n4d7L zNIVP{0>Ygtj-7VN(Vse>Xsc-o)9Ix-MX||%6^*ePY5fRwjT$@zz{AIp83KrbgEFH? z)cWrSLas$cMJl^??Nz1gXfoF^g+z7m5}Qp!L2S(a?#Se!%{cY=A?3s5 zw=0fdiQgrDA>)n`^cQdG)M;JXbbKjr at 0VUyKQqX{RmHD8+e(7Pky5WELv#X!F-~H+ z@}=q<+^O=lNENaGNxRIgc@)_!5tfHcN8!n%35PO*se3S3E_9kt8IvC(FGU(lgZ>yx zjrC-awZWjlXS0^fU!U3qTWSs zq1J!X`7X&Gt|$3S>ic7t;a=()3=VQd)xnv(+JYERmLchCPfBjSmqK>gmwn_yQ$w=)9% z$2%gv#4{Wzh;?O2?f*yGI|f(UXj`M{j_qW{wr$(CZQFJ_wr$&H$9BiI)8W_eKB%+b zQ+MBe?^kQBAM5$|RE;_29FxGRBSd)&wS3iBQJ!KM++3^umY+ivsU(|yP=y`iO|c}K zf&rG4Kf at p)-)_k-NlCE#3XxRnNq6yUJv~nL2S*+`O0PUu(!gAy?TcB2N}bt2E2SLW zUz-w+KI>{bT&sC~Q?-U#Bx;IPCwA7OK at y@Ub&mJ%1pVbfBY}WL{J((#%7BU{d?IaA z#8>#2Or|RA*57(6GSnM>29lPdwqQpsb?IEXg^%*nR?nl_(nq03Rcmzy*Q>8zws|=b zLR9b;QV&y%U!Dhwa!VYhcNLVPLVfFZ1FIHaJic4t!19%%$F1FpG9D;WLJqeri%{-R zbgF9+jI~HIY~ejLiE&A}5PaEAv3xdh%izYNkNO;OkGx&Pt%}cyWCi!b1Wf!ut_kkmWW?zOJ zvPg=wb`Siqz~KUdsWF^b78Df_GH_XGA6C$cAF7$%y3?+(d_d+V0M{|z4(4bL%`vRW zC7vP|t3{iVRYlc#IuuuIlvWkHqa`vMgV=CPTAMQ9Co*WWSgN}FL9N&f7xpWFs-Y_| zRQ{Xd%3IOC5*19HbL`w3V|Vosf at vr`_5Op}WJ{#?<5tFFKUYfBL!=!?kS%`7)xbEH>j!LE2?qDQ9coHqZ&iwm>L!j*|8vvovM zG+U?jZaMDpv1g#b$=%!i%d0w+3!7)Wp-ky`9?#uZ};Xp^M<-Tu43^=(_ z7=0v07C#u71KRe8Q(E7KGQ;)U at dc6e+_NdBA6bl_KH67ss2}1n`s^(Uj6h%Dj;N}+ znCxmu7rnp8E+jQ1MHX_-K;r;R4!Waze?{S^Ay3j-xN2b&Qk6=AJiGY4Rj^UC;X5cT zVur)OI|(gPi9-b`xS!l5ReTAKS#jeZ-y5oRDeXYQ7Q(@lPY+s*6fH^>a9r+8tIws| z;NOg*k__F2TnYi#4EVI(0OKQ0o at 7zcseRx!#X6X1PSjmS$ZL)I#e?QQU)RjdOuH?r z6-i}?dinWAVN~RRb!d$W at 2x7@0ZaG;y&Om{zrYWb2PI3lOLpuRzHn+~oLq9e+}c?8 zdzb;yOx)-sDhbhNPYacONXnWk7OH+(jeiV_HJ!d#_<2|!QijWt(gl=VLXe$;Qio*r zu4eLSnMvFhykc{7q69oCr0CoOS(bw*?N%t$p`lYVimWhH})Y4t7`={Vg2dXov(llyt0>uhcM*_t&lq-qS z9u%&`uVDMaP3u<87tUGXEqw8X;|kxL1!v&ME!F(?uno5AXGdr6 zoWHkAXo`hdIQ|JTfk1(PnEu78OG77TM*|~g31<^W17|x&VkKt-=l?qPp==}fC*1U< zJzuU#a$^NS+%B=kM?vu3Af~2IAc2;mPN4RscWa(bsA16=y-tV^pEG~Ch-J+2vVb9H zsFImpSaABQ8sKH;_xbt?+()TflD`ulLqc7drdnTMgi<+BWdT^Acu_a5vKoWfoQ*?$ z5gttHE2Yd~Al6g)$ptG&wHH6Auk5o8*~;_llpP1G(G=XK5fy}HhT*gx=fyP94ZCsk zLYSbn(DERd8)_iy03BoA>+z%2LBXW7N6kR|GNrQlCtOel7x{{=8g*zgn-97yjzcXK zbM+zgM`QBk4$coYMJFG#+6`OIU0yrS2hn7c^J|Qj`(`2EA(_}WnuSQg6+2XDA2!Td zP}XNS_mjw12jt;n8?m8J3x20$?d>0|7!7IFtHAn=OE6ZUsT(Q(n)E^x;T=pW~yZ z0HmW3*}yOBEhpja=7#hng^&Mm(I$@rNq>To5^#EDsl?VW5`OF34h4y7KmZB z=0DJzvn24qX#7xyCt8MFz0GBrEvFM7<~)@g;)GIf^44x}fGixAl8I#BjEH`3H0Y0v(FDfk9?3TD9nNO=bn5VD znDY-J-$|nJMhRy5LJ!6*sSs?pX4O{;A(x^fPDHPAnzFBtjIfrJSC>ZN3hpV=w*l#; z)j=BgR-fRu{ldVC*iQ4`=7oc^?|xi(&$EUnvtMGRio$=ss*xvn6fJ8e at UM3Ok|!^qs_Baq$9i#Mw_M*Sqdlj1ajeD&K&87`{G_ zc7Kw#E(ER%V`A>ML=s01j0DRHV&{A0N9)z%} zespN^PheIukfw!xFK+ at d%uBcEwof?(v<%QTV$VN`y?}RJyBp9l8}W at yuX_0TKPo_VV``}+M{+xx9bUvC(rYUCEKCz2?F<@TW&u&iQ at k2lKUT{!Qk zRJ>(nxQgTpy6dPz9R(#xc~n=CS7j(LxdCNM{-P=%@}1Zmb<{w&-U<%PI&Y^WSUe~* zYmOT*CA#G3H4<=+>zpnS%d^6udE}1~vh43wGE9}_LF&e{#n(n4;JOM-OQ6whhMOU} z;tUtrrAl<0?T317 at I|6})r9Xc-z^~y>39auQTcl}N5)JS-JUr6 zb}*W$ROhSS*ik8Po&mg22<2V}5_;2X)j4XxTp{*xQ%F%|jBUltfz3>YXd-SyXTM0k zc^8f+%4UOb(ur(vJR%55(Mu?7gGbc??lM3IgMvLq3bk1$jM4j$Wt at QwZsf4uipvW-T&7N5+(14&`Z z2BuoJeZq5c_YfTI99k1HmCT~;5+?Mc=iFhr=2^t}fd10s=bj>qY)Oiz9c$~NbEyxV zD!I?sIZlCX`BEm|MKW|T*W!M$XSFm=y-u0(1PSCTR-G%4X}jzO9A$|nj_C)=&iHBP z-l66K*0YVRi|b?$|C|{4D})F-`D-RhNKYxWkVALNWtvW}g9Xkl$rIM9~6z(H6>4iTM^I<0ae_ zrk7lk8RF;|s3-0NdDlo7S0LUm1lu?CgaO6CJ5c?KEqt5gi`)B4`No^Un;1`la8Jxg z;}|jjmh$isy2=3cocZWC?^4dA{8GKn_2;ZC=9)i&`2{3ZpRcy zdLSZX1Q8M}3CfN;q=?&udpMFpHj(r!LTMT0Kh5^hs6dD6kJa%6Toc>snji4~nI-fz=LS_kfPhe;{^iv( z5nC4$si0q9N)wnkD5ry!)1p(suPAyI6u2CE;7G9=35uXu7v zj2 at q#qTRZ1%=;SBo2C2kKUP1PbMm}c`7F!fW#TIFK&IrFyx?YXy7tLwZ+v^^qx%A( z|4|KM*p}Fbe??js?S@mU{A z_Wc|ScH8nrcJLX-!S?OZW5S#nAdA`(jYDLH;mSfLww0Vu0GdL676*Ly$U;1*Ii)ny9 at p-mVnb}y at YLoo_$Uvoq|#LC>!b) z7DYO<_T>@DjV(GsBwo3n0y$Q|npw3!T#ZTM!{1oLr{iG5B-WVzWTItC2XexqUpfC` z(Me^rT$5WY)@5`$IT~z+MiCNoA7|s9aGSNI`;skM?HA;!O!BlV3D#tI^jq|$ja95c zm&;VgafT~Pt_39I_dr8p!!D98YmF{Tbtl`UTBi-IO`3a~WZ~@?c_PUb&`J9ebexC+ zqCLL1P!Scbtq$Ynrr`-)-uqyJi=>uyg(c#_RiW*tNlv;9*u=AD(>Bp;ug&a6n^C4< z+5sLqx2vOQQ~K6DtrT*4fgwxLLbNt~?s$z7|6`EXU<<}>$M#t%b2^XwtqDwD{ef_` z&JVYTIoXK?s7qO1Km7Ws9?>1wYmO3ibZpsWDQ=nwNGrWR9fNFPzCJwfNbvhA zF{)XK4edr2*UBQ3gxmqvu&n~!?BfOW1EPoX7w<+XYF_kSQIkqPp-4(xA5OV`k|E?e zPe|6mLZ+s3#c0!fffTil1tf~MBtr*^q=3j_Zq7S&y%``yP?tz_>)YN;o`|mq at w-+d zrb2|edAVT6c-9Du_wq=V>SXRhuV^Zy-WVN|j+iCr$9MHOTU8`d&Inv_LY-t{{GUxC z4M_1dWrE(q1w)%-R9Wuc5Iin-Kp)>;`6(r4z}cI(`y18<80Uu>k?M$#Pj+l6Q&d!1 z+*2ZxIs3e_<5sjNQS4O7WqB=Y<+TH%kh7I`L=Gd(UGESsJme1M^hJ<4B*z9Fc_TN{ z$b!Gv3o4`y4*fyz5>8TYARj3_BMo5D$BJ9a#2BCc7RqpqT`}eT`M3DzNBsXrQvVs? z`us=XL$ueNMHBi7h>-TL%18M>Dj&>n%_K5;7Cc$d at H_cK0CxWW!fGES4Xu-&;iZ2KPbEDXee~Cu9fqF%dhuY zk^T7{onzL!mk8t$#KE&0)|1b)7mYasmiVMP3`QY(0ZxGw1Hop&6we%LlWc~0&QIU| z`3;j=AaoD at MDvHh|MK?2Ki=>^3p+|Wb_?_=2(D61ncl!n|uUXod|@0GXAki@<~d{7SAwwfzHXybi+YG-(!+1o$wpO5W;V7r{@ z!={jO*vED)AZH}qbqAoq=#!q4kQ}%UBnXj0hrhuq)%(p#B-<6K!VH%v&o=??v>v|+ zIO6eV*VMA-9H zFiUb5V9BKVbT0Ai5nY99gW8hLRDQ)C5=MoifiRfbhZbAGz${f#_TuT0SIY)ve)Oy~ zMDt*f+s>!)H>~-w1vH+G)-AI%@4r+hWFmX;AWNaTAG>7d$QtQ67pWW@<5{j4Vl4L- z{Tvg&D36yWF88ZVV%?mdE7#kWPtg0mDMwaPU1)Sio_Mxs+wX at E>Se;-Hdx1W&bC~l zIeN4RU^P9YSEilm<>N-`$+u0{D0VQio3yUe9IS*t!9_X2TqP5u%N}**^Ptt}fJ)oo z1%8XS*)DER1J&EbojPOyiYklK=|f6^G)d$VwtUXg8}r#RH5Bu-(8=kzt at 8e_gD5#t-WT9^g-|YN0bpXn%*p9= zr|WhOx1-P3k9{(KG~MXDXjA`kpoQQwER!TJDRbIpxnVOz3xn6W_=%*`(YFa4L6gxZ z;{0E#qPQ^gHIp$SYD`RXEfKRg at f3bNgj83;had=+ZzE&YVo}_wlU=rCtUq3tpPHiq zCCkD(@e?QXi9E>=WcS1HTT1C|R)!8lq%aYUOdlb$FB{t?hF$Lw{L5VJsDxeb?DVq5 z4TX-w%Wxv3il at dcHqkBv6jrNC*7 at AALo66LFilV0_7U+!Tw_STWq(hf`9;@wAToK8 z&aob6deUu0TrSD?WA82jW5V7<&%W9bc(wI|xXXrLdro+5`cXZ>^M1_;4-D``+Ef<~ z6(02>)k1~3Q&vQ?0=#&&HL?q@^Xx=K`@SgOPnZ!HYdj{+)8cbWM*)Y_wc7`Ywd$09 z-T7IRNmCOi$@7JrBka7>>^l+tAVG{dDESi1P)@&QiFBEwyRfwg3QN=0U>PR3Mh5;i zD)BmNCD{501ycXNQNZ+HD43B$VF38xab3WipM4*wn5aNxzacVEk0 at mT2}+Br5+Azg z*K%vokmRIEKgE2H>TG8cjZ2su^V&?&#?cc|wG!Jb< z-}{#Ts*Q2T3OQAL75{>7NHa;#Yv0Z|XzbQ52GMfKkA$gXa`21%eBwR(#LBd!lNGgt z%<*sq-FOF1MF1$j$0~ZVwV51he6rEjveDiAQhp-Mz*J at vJtX?si9^2JzCqo4fiI!F zlNgN+X`qdrcNq_|vGS)J0 at Bw{i0mZp~)vcN}4mhmwtqEH;E<7 zvPL;)XfGl9Syc0_u}u~anMzu0ZcF`y z=Tbn}CP$j7eE*grchDMR5xi at ZSX6wf5tX4cUUe$sk^6}81M=UR&(3QW+y1Z6!2Dlm zkdZ?XK&cvqZxK0|wx^iT7Qza3YzoU;e`_+S{c0F z=1e4?l4U~U2-cZ;CCr*r5w(JAs2$<`MGDI;<$p+ls+X4pxV82#*C6x9HI)428h$k? zWe)pTz5R!4sQKd>GADBWat-gY&-^7<(P?_J5QBR+ at _q!-U%A&s^cpY1_~(h*tAyMi z^z^bO4TVs{bFLz^jHkw*(}43}rDgkya>d^qXlBM;JhSV$AvBg=u5qPz-FIYG at 6fOF zQE6-R|L_ed&TlPhV*VBb=UUjzLooR+Mg(T;qrvWi;#8e)O)2d2JkLit z#~d^5$J%dOe14y>dEupuAlA}z^6|H at tRmErt0@kUT;A^Zds>hd7>YZ}sJGd{9vG5! zzT|?5b@)UWRd^9)5 at Ta&u*)upu_E3x^g44ns?s0rx5jRn1Pa at J7HpoeTu%WDb)Kw2 ziY_{xjcW}ZI-L`BB`jU8`KKOJDLQ!;8&1$~sw=eE0v&75?8=0YK^Mx**#+S$A09Sp z3xFccEr?P>*V=+h+jE%n8B!=DKa=KH?ftFIpT;otGS~i!vgR>XE3cP6okr?!G_PV0 z<>!3#++!AW)oQBwChb#!zs}ihm2}d{)g|vSRjp>u*ttak%bm(DG<$x)F^D*M6a8L4?Jm>Ej(J|^rT6`eXKiR-Fj1O)Bia8| zZ!Umo`5R^@!Jy1UWe6FJzHFa4cXu|r$oY33~Bsr?SV5%v&rg02arFS6U8Q6wL?dc&*o&YU$U|`|rXAS@{ zbztD_6z~ckOesVhm3`|=U>~K$pPE-Ug;pm!oTJ~ZRd~Ae(I)7WOov<@DAht*9w(%T zH}zyC=B()>72?8L_4}I)+&wj+O8jHFd*DDo%>S0<%G&+iZ2wB#|FyHxiYwj-guxXF z-y$=PbO%0sK#jt|5>rqJm=pww5tzIB5XUQs8dTyciPz-?{RaGX0C=(~zYj)8 at 2!xt zn~G{6VlZuWe`{&W>$?5;V(E4J>z5CZJ>0XRxDjm#(hMuIzpTJc}vxh&gn`t4Mx;aVtv`02W(7aUm;JJ*U0@^ z- at RJ8jTU=!nk$b$S2Hg{FQshA at S`!?x>7AJ|5Ug%E3sBVyH^{vVgbDE^@bcqm}AP! zcXV6z%^EDXip+rrso!BmZM6p{>xSVjT34L)lqSo4X*Q#BG73P&9gDV;KUWwu=MoFkgEBX_NJ35yvEjxzPcOBnFJdpw2j zF44Owp^-5g>IP{ipv6Q%RWS==r|eM}ux; zv=^9zYueAh-CBjmdV?W5C>O%#bUczqniR8aGYLAJ3;`qLqV~}_vEVagd9+0g-XiC< z7E5^?qD~z*U{&((SoN{tUm-(Q4a2vvKg7(znBw#s0mjGlvMuqhFa&;Bn>Ji&N}W$7 zh26VlIZ90hrVw*e2s~OZ$Ps&555qU#HTU3&_vi}0zfyo)7=qigexD|c9iZK at 2B~_A zM7+V!Q~;hY^G_WU)QDH?+c=5k*@$xE=v&y(CHS>SJK=0!j)j=M9Yh2q8ui8R6_dXw zX5Omu$@ES1&IG&^1_^~5{6}(LqX)LxA&_0*lgsNgQjQ at LCIe2f-KeG2u~r zqOXH~Ly-c90GbcK%Mw2F{j-t7%lZ&nf&c+kL;kx)E?{f?cOzHbR{Lwf`L8*F7JrIj znqsj${d-{bI+1$$B*mzHev16Lg5qpqBlYQqs7@@o4KloUva>?Eo`-xMF at XncIiE+m zn_7iy>lSDUd3-Nd-_3TXYq#EZH&(yTkMnCF(z;^7VI0&gb at ReGvdb|;1=d{3v1X!B zlJ*vC8S3b0a`pH`FDO+NbMNyCnkvqsu zM%Pr!%*+do=S*_rILYDQ^l`=%<)MQ)73rvNFtQ;b>QtbDnZaM;$ z`=g=za5${|0*{MaULE%%y9X3DQ!m^MldND~m5UyL3$|%&Bam)e zWV5gyOiv$)Rb(h(6c|M>$jTF6Z)L7*m)l}Um6{kxdukjP9ytz;i7nAv0X5mIznY?5 z?VBwC&a;CDfeX_8 at cT#}XaZr0HRD&EbJ at j(?cinq`WN=2rVPHU9{$KK{UD z%mMAM^yoZG8p07O(LVkb&QM;vYx6L1lpl(lrB;`}i&$gj4l_OLmt_Wv5pCWUdJYu{ zV^qqe2b%~mVBdDfZLJ8^K!Y=Zw;*Fll3&KZNe+w*l^Hvbwn!U+(EJn*!`eg;E~JME3Ju`uDJ*oS0wHe?8(v{CeC@!R8VV>vs>Y}P#Mr_yroI0-3cI+SO|Ayym`y=Y=GnOY^3`@E_gct<)M#fy?Dj|zRp45ZY=S1tiUhkx*rDGFZ|nn;Gqeva`>bfn(AcL{B^JHY?HiBv zw|)cfPUp+x6>~dcStL2tA99=jB=p=N3P4+bM}XS!AHm)IzHd;5$#WgghaqbRu%!D{ z3*B78f@&$jj5k{;KerbO{{xCG+%0HQay6(|z^g8dDI!M4`7^La^TlqCI6lu5-As>l zR-RXQP#+mKh-FkK59OWyMg_t=yqL*LzZUbtWRSl2K*pZI`=B%%dukU=gZ%~(Ixq^1 zj3ai#_lx1zZA3KxXFg`h6Y1kgQCG6 zYjxJ&lq9tz|3O_H^5upSb19lICH^6zTFpe3pWrysQYG_0^8n-{o^)+OFDcDPeg#Kn%HSVo2glttoxv|B*mKetYbwll%$xFF7 z3$=lqaKiAsL;a*!vC1(x^B8y-&Td9Y# zP1tj0CQx8!U6qptK`IPp-$^qnQm5BzPD}|W2bSB<0a8CG;SHmf0k_qQO?4`y% zTK5yCdwdbs?`$3e6pub#a)AcJ8KN(dw=f0f_y6yoB0$lr#h at M5_Hv8xF0gHy8y-nhL{wwO8!tfyFbB9Q3gd?GK{18q=2^ zoJdoYHwN%2y0d5x00zg8?6oT~jxy}YEmE?ILXno4A-t>dstj-#nUpY1#VpF(sj^ssMEDAdm{myv)@%fle6oV!^@1VkXnvR_=BSf z=#qoaW2EKeQ(zUKzQXE3Gi^EAcQ3vu4~5B#uOBOb2Q3@=p)<(A?DAFL0Td+ zYLw~A&cR~$TRbc{g&qNazEfL>7#k{Z2`3OfBAzWhuo9k5%7yb5YoH7+x+=h{ieNR) z_FHEWY3S)-5wTxy-&*R^tktDJt;mLn&odW9!(8y@=g5ZPb~DC(BF^D71YXkymJopd>z-Gm_pRRKV%!gb)-ir9PM)d7+o{t9TS+3h^u$dz9Bdz z(9X_ at 0BiGvP^*y%wWpg8w+z#Sbju-jhRs*n+YscQbMQl#l%}np at mbK+p`lN+jw^b% z+bfO>8vO?Tk-nYJD`0nov6wmEmu6SwsBa zr1o}e8C2;~eJU?i;PFE at BoZyv$6UEBp!fMi9n$MX&D^cUfqJev=Gs+!5h)(I#0J0Mt=JAy3V%X0zA|-vdG4#l;L$kE z)g3;EtpimVy$b8_ic~Z4r09&{?oc8?0Tq?;scVRleIqsYN?rBaum+fG*zRJqO*?LD z7b6>10dRlVo*Y)nE-Jut;SwmFQOJ5kx9~&oL+^)qNO+ at sEt<&)PA^0~r14 z*qzsy%l2B_Ig0GQ2xs}Dz$r4Q_L1c*6d;T+9z>z(R1u=)l)7VV%Me3gM4eWIN^W1 z8V)j>7?A&ABB?)d6iaB1^AS*W2}|uBZQ=s`BjV4|G4Fv|En_R~NXXFpQP0o-OTHyI zb#?)`DNfS+>U}Yat2ucSX6+F+=K!s7CK$YAV3$XuNet1LIdDJw zav!tUhvMCmN`fku(5TZV0?XV=f9IZIziV2bdAz}go(o|RofFdZ1fTpg`F1R>+{xR^LuQ#Zu%qfgNX*vo>KKw~nCy3z1 at GV!|7mjr7c89VO~ zr%x^hjJzM%oLI0ko&(a;3uji^5cX=oo5D|Y!cJV_-B1RoV;hebK-z at CQutfnQz3Q_ z)_Ao;Rhd(WNj9l1A|u;^Hw46}*6nyRmLDKzMd36=KluFX4+ozi zj%uQK_lSnI1#bX~p_5&{yoTf1Rp=}OI-f2B&Xp6d_#5KXfVg8ITAaPLhj}5o^eOfa zWeKYRxgS?T{7>K7$D6`_3FvHza3`UWvc zg=8|^qYhn+TE>bN5IMh&Zc4k$O0DC1dKF6fRpgg<3BF#=gjO}p{@Tn}v2bjg0wlpn zKP7!N(f*uu{O9BJeC?Oh4MZRO8=J8$UI^ESBid-7k4!_-_9$+MhURmz&jvX6Fm6~K zEYY*45WbW#Z8;MII2WtUN?#RU#pU3&qi=59q at 9#Ttb at gBGhTq6Ixf4}ss`q~2Z{Zc zC$A#rVX}9gw-%?E?Hc!*W_(~17L~wHI9GttjP8k8<;D%!hT&|{3B97D%aRAN zz2WnZ(-0FC*sv(Qcp^EmMOR|`E88vDOH>v!a8?G>B04qYvUjYS^AJYjQJBL=@%wy| zOhK!PEB1AYj4|qQ{c-`L75;j`=_PoVQxHTQ#-c?n^`qw5Ojw_d>QikLx8L(|a9C|* z&LcIgWM at Fqa3ajaxVm$LaeX1crx25^i4CH`#U+tvbG~k|8<;xz_0zlK$$$ z;MruOH`{~umT=PyXLW!XmErF5kC*^3_x<#E_ETZ7YG&y-a at o*O=Jjeux-dsLwemLF z)9RX{q{(QjK>w{82>SYTA7rvb0s8$IULI26w88)N>&dH?Yls4|!UksNrC{EJEg(U+NEsU=(ipTMN3MlMo&Y^3@ zWH0Qbvq1~&5i4zcsF!j?Q}HeXw=$AP9AxarQd;6kKjr2gk;eJrJ*73!Jvnf9Vd?{l zUSPNO+zJ9ziEy$+{2m~VjV7VBGqbP~a!SzA+dZLy8IHmjOj{m6%I`?$vF1o%Qu4Wl{DDAH}q|M118M5c>%Tf?n!fI~n6y6R5E_K{g`J7}P+Cv0E3s#iq>aUO>@^P6S!_(y?+O zhNaLZw=(y7HT&6kR+DV>lsM2xR_J!eo-c}zoW27M&T$VYe-CpvOZtla?j3!PNCSDN z)z5Ko17~)?^!G`UW8~gtmOp|B_m3dr`}dMLPEHnPwtwAN5_Pn*`QNl6hpmF*d(|^_ z<*JEBt-qmcE=6_GB7Ixj!><5UY+LMKEb>PkT`_8anVH#}qEUPe@#X2g_LHJUla`Ra z_GhG}l`-7*0&=;yboAXIhh&~|xXh+`W;kXzj;9y=df&eFK}c#8F(iwS)tEB;u)_Q` zF0V967;rB6Q4 at -VY1%lpV~Ob`IbE50UF at L5Lro6e%DlN;SGMaDV7!)sh4np~iONw1 zv&ETmq=?4HPZ_^aUj-Xuky~lU{Qj-}on6MU=Tu`}mzihVF?(Z};+uoc&P~zzOMr8r zh{ehzaX~J><)mYke%2?L7El-(C{p4T(j2EL^=MYLid2c4REo7_hv_Dx1M%DoHU)Bj z!y)v8>`PB%QisJ%^|aSff=bFa*oT7sG~JV5MY|``Yt@*jE7hwd{WeQ3(FqSSg$_e_ ztAprHmuol!K}%)^4=o1;V+yClhi4TZc|I*}ztG>G+2NaGVQV1;=Y}W zKa&k4o`+hK|5(egsSG|P#A$;LFylZ?UY~`F>qtSXfBX|JAXFULHIe%Hb4CY)j4X?R zOyiDe at Az7^yyak9jlRE_>sYmq2(E4~izd0d_E&qDIISzXT(6GcsXiIg6ttXFEsbvt zm(P)A*!cSFuOAD{<@+YjxU?N)WZ<>v0 at mveudifr$Zi8Qugu#j_l3NN at -pt`98k76 zc}L=6?%VQqajEWlNBz6kwJ)exCUhBjbP0w_Zopi;1K&7_X>T?0KP%gcj1Yvn*fOX{ zW_$JIFPdFd5ZRslpCFFIU|H%~ZPr{;s>+l-J=UoGIM2Z`2R%pTKh zaDoTjAZK58kji98##R5ItZoB zDAh>?pH6`?v+4U<@DqL0+QwH{_QL~Q72ixJBy0$knMM#-r zEKc_exbM9s15*K)_ofGyl!g?^bk+jgmUs6~K|sYGM`R*=TL$(N(T34vND82IM%+nu zyEZ?Cn$mZ^B4Z_Bf?-D0D=@MI&}x+kQ$PRKAmoxGg7(*4>zRK$MI&MRze-42O4uSO zpPuNhDJI`1LgV=5B?R|$#Yu&`OyU_ekQxyoz#2$z*E=_8g9c%yCpCx2zJlRD!?@EZ zLFrUfy&v_|i+kL?6ehqY?wqgbFB&p|yiTt;d|tiv{CuV#p1*uPX#6D>kxu%lAhAc9 zK_c5~c9(D)CLar+?=jJsH)n4$vU({pNnj at +PukE%Y1UGW?>(_wP5i_Lbztqx-4h9p zoLWh}L-X5JJ_*>)dMq$NM;nBP*>JdKW*d!{t*=&e`sp|4EI7G at d?n=CNLwWb9>-iO z*(dsHn6N3?TaKMJ=o~6(I}p7gJl30J{6YguxP;6kVRS%CCEGrnN@&o|tW0)k?;Au? z7PFKH=w;&`umPR#s0&6XH0x0{Wf`bfi3)V5jrW$Oe2lclPM0YW zy6~ns$WP{5ud|cxx{z~=S-zld&N-4$!F*rHpE#7DXN zSMSb?qD&}Lwq&Og#Rx_Cj10!!P|hF9I$a{Tpp3}1r3-#qhj5;{zPsixTf#GPzQ+~? z31SztktBsvS!M977Nd_we8nw2R(N~|FflZIX4+vwi#!b*=H0;j(}0lwE7&tKCg9 at u zWZEZ09pw4A at UAqFcotgb(I*_-Ig~#Y?G3d1Lha;&?V)}3f~fs^_MQUF34V@=&O&b14>{s($V00E z1>Ue-^pVReuaq|No%om~$V_vcr8^Ivr-U!vtX?7IVAR<_$zGAF zVrEFw_uHz1`A#8X(#s1y&>A-H?_%>@VxI7xG?NpoP5NJ(CF;N->sSa1XSq>p}%CpcbYqE!ZSp=` z_1VpzCSPM|HAykm%7LS zI=7tME&iw_QiS8zsVJ1xmiV3%>cqUYNTe5~>cUC9*{g%zbkE69kSur7!W(6e at +~Ux zhB1IjExV)sh}|lM-dxkox^RHUfV#cFRJENh5=Lj at C}Zj)lnOxG#3QenP9wWO at x(Kj z-l{Rfc2Qx+$+~uWX)Q^`H0*uAybrl at uv}r!v)r$`%BmtlNK?S(QV2AOwLOp=7()&t=6 zIP0}!KYd;bJ61re&SrO7WAh$FL&pYs4vTLL at s_cT?`8SO3TP$vL at 5E+p=Um)gZ?;7 zu86oH$j(+%3kG=Y4(ux)3$1k}nkyMr;W4T`EJ=-)!)DD;JPzxpbqbh8DiR-a+aaj7 zQ*KN4PcWg=vgc(NkK_7I*bTOG!=(r5J%@D88fCy&7IF(4}AnLL)PI4xlh zX|P=g$9R=;O4~|i`r=#1sp=BJnT6=GlKrf6^kLrVR4$?E!i4N#b)<(9n)@|w9i&CA z0gPGki|BAGW)E=koO!1^CK$tzeFtnMW++2}!FO#aA(4>XpL1u at gC+pXnt&^&MQx}? z*o6v6H6chmtFi*ot+-;n7+(J=V?_oWVdTLzA!0^y8Op%h)(ushPE%3PT9p-%$GL+2 z2}Uz^Klx+a#d@=K!F<+|nSi>}67bZ3qL=ll_L0(5Fo&aERd?I8C9_Or{Pbk^h z3`VqCx%o4mtb)f=eICi$Qo{3)19l7FdV-;BKR#ZW1Rr56KS4QByZBQBF98~ouL`f4soQ=T)RCfA}@$%R- zLlzXjX_gf#d%KhZB&QseXom1E>kXO*-qnHnVY4$xdYg- at b{}+t7m3UL`MD&{$S!!Y zIe0RJfGKZ7H&)P*GdGEC={`iKu2cq2DL{yaIpS1_0U0$XaxL%Xz#5M2ZdVlgs8p z$5gNR;-s4{Jz}5i>IEN9tk+7wq+ at oq_tu{+B&&I3v!Wrs#5w0wvh3<{J&pJy(H_&) zr${>u*@DFu^Z(gE;85Q7UDG#qnH%3VUK6Q*hc{UHR-I%tbtcK|Ck7~paj;F_grj&R zHm%yC3YTy*N*VGzAqbr#vCxKQY|?1gfd at gu9Xq0|bRCs at 1*#7{=%DoC{{D*xKD6hwdb;n^PyP})IuqFO`FvD=rqE at g8#&!(Gg)mmUhB`)wd*$ev8xl0osZgn zaoH_>9G1_}BH6 at YIiQiUg3<=bv(K?w%*K*4FbRjcTsqVR2d=uxv%Ft4#{1row&bl1 z0 at j4u79Q8LcwpW#wT-$Qr}pQSU`}zg6fnA`elI$>`Uddkr~Nw*NnY26(=+UWQyY9R zkDJ2?Pl9D8*&6|oqN1w*eNa|<=}=?PP}6{1szjqEcD~dzJ at z#71^|N#26qJj|N4z$_ zV|bT;9rJlZGP%bqy=t*%AK6 at wse4v&|jX+TI*}GG_R93!b$w`EjT-`t?LJpJN1sE{F&g zITksEAe0A7$Rb35kgp}=1;R!i8xo?_;lvvOYfWIO(5M*UHOh!^6W#&;Hj7;^Nj*kV zI?offW)x&+te$149v;7?;Q~iKcx3^wwSg`X74#=)4H}&+!gs`yiY#2Wpfx=hAwsI2 zEC29%X~zD at Os~?R05O3NhK=?Od8J}$KK0^UGEZB@)F!E0kNwVov6O<~oiq+n_1XAMME(NjloZXQBgZ`0_vt6}XW#_^eS z_@@!eF~eMEunFWL#}@H6D*rAgu;e at L+n9laGCVN8D~r^R7G^8c9;9eNq3$sF7-8w; zn(*#_YlT|!y9+G-CprZBk79rS<@Ee-vW5mtI5prtU}CF)Tp={w at E{7w#e$Y%Xx8Py z_B$W~>Fk4n5|*i1pDEwE*F)%EBE&>w#({4K4mAaSW>SX!_7&yPHTIRR33^-P&HB zxDx0;F?A`c($}1^F74CD#j$8Q&{i at C9765~OF{{9SDc)Ir8ZV{4#c+|8*23V$30eD z6Mkt6f?S!!@tkaQ$CRPYX^mTo`Ps*SfVbZqRmaVj>-#78esdy=vue2yC0n%N5xVf)(p9nF=NMKf|68vc^8_ z*DW%#!B83)FSRlHO~qi^eG0cPy1`+9!KvRa)Ls at b!C)(xuTGx_m~R>|T))0r3d^>Y z)T&vIkyC3aPGaH3ccRf4cC!EpMM{Y27 at XYp##=}!4WN*#^U^!VA*!&Wwpi7Ql$hT9w0=UI=#qU0(6B;;z6b0(-W^d~tSFDH&nalI+eQ*m zYfU9h|G!q4r#G9P-jbaYS-W^ zJ%iCgQd66be``uazb4>ZU==cbbqcNn^(K)QhP`0sBB{wf=qWG$W5^o7h3iw?B#*O7 z>CKxZ&jJ;aXrrbaRZv#bb^rH^g^BOE>Wh&TQ~q!~;!9QkdNZns?4+OK_s at A{@)GIb z347Qd{Ycr`I)U48XoA+tY8=*XIeo^aO5P5h!DBaDj+7(o9pwqaG{~!6h0aZc>3L`E zYtV2bJum7>7(hMB%su at 6F1!hUkag^rDqp3kYvdu0p1h at R!iVOUSKOBW_R71V4rFY#z(2%hIz1AK5801aMmndQl?CvX^O#^L6*bZz#_bgfCgpw(=YvI zpEW2dxlXIwdO)kWGET}$|2MAeK7M5GZZ at MX5&D%O)`3fY_4LTH-3)9 at 2WfL^eUS`1 zX^%2`icwXG+KS>rf<0Xhxdl=}FO|*9iJ9d+-Wi;Z%*|Z1)K1pqPY}kG at Ng?!#iXP$ zpOza&E>yJk5gg4V at y8~iYsN^(M1dQEcxx!#K__<+f&X>K61?~-9CU+bR~~d^ru7O1 z3?gJLEtjDw8r$*g?SLpjVLeu0!B3(iEU~@p1e_v!8dbU6G3I?eLXS8Pv$Hh+yb&() zSk|y(w+mI4DRR_Qo|cSs0}Eao-W9f7Rl-yH0L}dz9{P_J9~Zq;+vAUVEv%Twj5#bf z16ABaWi4J(XLCdnoQ-9`vC?2vbX6)dcElN`XZ+&%O}thEN9x8v2HR#ybIROG>RJ<~ z)vqxtuWa at +-qzL)wZ&q_b+{NpWza})A?cFocm1P`xms5T z-4s(GC?%r8E6*#_xa^ANbbj2;3VVSwq8r at 7QJ~uFN%1~t_Ez6d=k38!#L`~8S*5S0 zNILa&;qtnKL$CLqNCJH`zx>B^1P%fOMh at Zd%@B`kW?;b)UQrEnXLKTd?S!~ggFN|m1j}w79`HPfg@*nl?Pos74!6?iPEuGlo(8wR^#E9Y5{;q| zZ<9M99*imug(G0U&{HxVWVZ>@RI)!;o75f#ul+8Ek#mm%dXevR_%%EfGw;F)fqP*O zUf+U$3qahX{Y4wfyHES|H?o)M&ojthf+2xBg~*VG%DLPn`~X*CI){F7X(fJ)gwN7y zdK?}kd;(71HisX2fZTE2KgboW1AY|UgjQZkm4}|<-3+F;akBqK)C4qy<_Q5W_BL*q z((}+SSluNi?=r98yejTIJ|md|B8(dpm7+*=1v4 z;>18V$s`pwNdfn`@%l?mZQ0k#`Z4=jnkvI}J<$Mf$mcj3Jl23=PTpnFwxwC!YDhc; z=>)S%a{`v28KWpjgYRNp-T~R0*;_q~KL3E0jrvdUUz at 2Jci!N?!CWAs^J25wt|k=J zawo?pP`|Q8j=fZKn2u!|1 at Jp%`v|T|E%2YW1$%db*F-31pM)!31lO5RrKey^MnI1N z8Hz971yBT(vzgFjvHUm(l$}s9NvrZijIyyc$DAn$*+yX|HuDN?eLX?Bz^H&poZ{DS ztcH9aC9{R8tRPOjOi}#K-}$)w$G`K!Kt0`od2g{>_7M-%zyiv_zIYit2f=@`iQi5) z?l>|x2wV2zkbJ at U(zNe1ctbuMZJ9Hf?vOP9{;k$r4KMw}l| zNd?Z2yWhQT**e5_*kx|Xy1O_8Zo7%!JZ2Vrq!@0eU!U|7syk2ne3->+_RdQ!1=_?uvGvI<_!62N*AFv?2H$q01_hDDEH>a+mV^ zUMnHoVDxO@^e(Wzg at T4KvmVg0``|5oI#8eLU2_BcqS#pqcH3y$01+dQ-Uax-$tG?~ zT3X?)`XQK@)d>7AC_YyuFBhKJ(7s&yMqUn!t_z)!6y3)bikfnN_2QrOr4o`>zm{*j zyx at _$FzRRmy9Pq1to6oP*T-5hNus{yOu5dwWN at -)*I3rL at A{B4 at nqXJ`RCu7w!Uy@}@3 zk*^#Ou5p2I!6~VCIZhuBp)t<_@>fn23b(H}0cyS_B7g;XV6m^a0BRoPXje7F5&kU< zgGd+lFO at jdYG6Pfa$ya^k1t6G9S`V#H!UiIuOPR81OmcF{EreBDz45}_7*Pxk2bLi z?kT!IhMs!(FqSct<^Xbp$t1C8y-L!`kbK~tC<5?mVOzR>gJhJZ&W4&g4Q}TutKt=D zcPHl6kkoa{-??JB4`9h{_MDxC at mG1C>!!tX)6zWdoWFq`vz^+cj50YD7HfX5U8j7f zUb(N?Cf$#Dd0%*a`dui1pa>-S5adBqEW0;LEW*K2GhgE9U%4oVYP_XGB&fpb0E`h< z=K(u$0R0u5qjEMMx;W~Cu^QCiZ>l0n{#^UtWCy8+QEFO8+;r*|qA#*ojhr+Dr>4Hj z!gog7bJrp$zW02GC||+m>Pd5~)wmmy?TjT_CKsx?si{URMJJzE at Ig_W6c$O=%jtMT7(#-3 z3t)vzD(R%I)rf8M@^`PHY5nPg3cpYaLD0}GLv6JMR(4?d-crn1Zy$VY6! zXb+_cGMA^GgA2$z&f{7Ts*}o6UG|BVq#aZ#Rs7agiyze?607E at ZHpU=X47Mqep&0? zDT-uG4(>slss$DKGwKbs(q!mf^EbyO(TfDDt&2tCHe^cD2$n4y8pp}>3Ow1Or4t>Q z5%n!O>W|*+dM&gpWgFEz+ZSb?^K#&l5d% zzC{Mr9oSqls%k=&)lIfh9^%6EL^x2rv16d)iD>te>89Qn2BkTQ^-s1D8;$A+;CU#;b2y)_E5lqM{1f2c6CXrC;FTWOF_cR*_NF1)M;o2DXUVE#%>&A zO1*0fOb#25Ko3_yi1f(v2$oq>-t<&O_Xm9rH$m(k+W)@U2MldOH81If3EY3s5fNyj76L=N zKKc>oCLBjn7 at hco7n~g8Rm-ff92wLB>Y?Nw`&V zhi|#>Bk+aL4WnFt;Z`eNO)&6 at -I=2(@EbHlTVc}&pdZ*q1&nw$%e;qIFpK&DvY1OT z1Pk_pS77j~8nbfF<1gVH;YdG>t5vcFItm)z8S)R?RjjUiU1LfA4+|w~&ln8OBF!2~ zyDFW$(6ON_KXVONL?$`dxtXn<75Q;3defbl|76=?%}SpFC}a?{ zK at -WD&OnQ0-4=B#g!b{3TGQeZ@=;k=(2DxHz$T4B at B2-q(%YOrs2wVPzuA at +stu6N zdzUP>zOjHlQAyf5#HuIDF4_8R!pSRB$Ypg1;oXVB@$3uXgTN`_zE=;!0lfF$HRK1U zu^GPFiB}v1t_Qww7tfF?Zt=!@p(mA|U`pm&|C6PAN{Dw%(F_#Cd2*GlLC-0>WP^Df z-N|AS`&Jb^heAE!)<<2TQK8*}nKLz81=pU4Yqzu7E`6cz?6{QsIMK4ap$Z=p53}a* zz3f}_0g2vnM47X$X8RrDY6Hbc17n^=iF+IOH3z60JNCm{#z+smjtCgq1$i!43a1d7 z2#b&V5D^aPjX~Y_yW-6m68YX(_3`g0Ceh^3&4f+{rFswZ?{%2To9Eps*MQ!Ud82N- z7>k&%N|od845Wa3q<~_i0OAUPq!|NGg#fbY-ulZQ1k~GFWa9$rAz`&}kk}64?13f2`xES~@#;{Hw|9-%j=FIxd^4 zNPmwwl?tg_x#c#JWfoIM>Sg4VYwMwl3rdK{rIJ|FKtfTqoRTM$Iw zr;^i(WmSq zZ at bCSUD2!PPe$4!a0V9Wy8U=*C+K6Eib$hs*ikSW^{!Bpno5rF4r87wLLBsyo-#rp ztL^KXx{tANT(NsGn+Upm>DK_ zr-In8EAScv6SX=HFavElZJl(7&-8ijG z{zh^m%8Xq at 9aWSJ5G{b^ikoFu~5|_8p{tJ1A8zE5QT&Dnb z11!o#4aW=}t;Oh=NV})ZA_w1K3*~N$SCJ)C-BtXks=XI$;@H|?$uT6Bc9(orNRo@$ zB#ZP%;XaNj-z1*;0^c at vEA6I<(Ay!%p*lbjHVOJ`KABYKE3^lZ!3cEKGamUrUih^=+3}tBG<_L0dR>d z8udFLaL(Pvp;Nv#9x4GO4M~|;Ayl;-w?PD2U%tF&ug)vW53*oHd5dcVp3!SH zJds{FIWgdlNH(MhQ84g_YAXir*z0o6Kw#+am at M((Bu)wwz0g470Ia?FnToZ(7-=-6 zJEu{jRByvno@}XtsOudwhBF z%TqdIPSkPhPw<%0U=RC;qzX3g>w}#D>w&iAMjDg3r06rxkNC5qTd2P_BGIpOmN at 5B zB2}U`F4m9>8l*#aP~WXk$G-?l0+u=YOgwelR4y0FKt1T=-J(}^mI%BTD(r^%0TZjG zw at AIS^O<1UkTrs- at y?t!gfPMszP;21^t at zHPFCr~>G>y%Cq5+0-H*jGkv-wa?x81(K_>;J)N=Aq*u1z; zE1a2Nf=*SXBx zkE>e&6_3lA7ng^Rpd$v6Fvaoq(1R{PlAz#Ds!dy7sSOMZ-%Q3)?b2O|}P;jn=mFB)`>F z%hG-UWBesO+zM33*s*6OblAz7y7Kq!?gq6qniYdk!(^{SXu-2(IigQipC=P3-N9m9 z!*^l8Uh$Eh++2614CY~af~IPEu?uY#)je0p3FatVoX-$ zy7V%ikQj;f9jD61nGPdP);*Vm(0=Qx8mqLx#`|Km;#o5S5^2m8-nJe+)OjQybfU%% z-sEWPOVUHHQ~j#RksT_c{1ufQtOrqf+%golFFNjVmqY!(!Ltl|mo=KV}+oMn)!@vM*(*%`vQq_)}9oLaz`qa_YLBcp7 z-4NtTP(%4k-V8~EF|9F3eII$GG!gLMs4kyuAZgV<(ZfF<)Bmr<`M1;4zdfzqFl!3= zf?zp_v3P?i+mJAGf7OV{NugR+!p5BpfO=9oi8@~Mo}Bh)-M)7S097+8E5bk%aRFp< z9#^=@qgz*SEgW3%*W zGHRfHMZ52~bi0#_$A&x&uFSj%6E-A10vLaAGvvY723j|W!!Pq`I)ihk0$qu*KiZmp zApXzH_b81G{Got=DpCKVX8Zp)^Z&gYH9rmTmeGF@>a at r~iI5V1Guawj8wTnz&HLM0 zQlltN2@``67uO(k4mON4ikMqS853&P*j-OLSO zF6d?d-dW!^!gS|28Vt+ux#fE0?K#c%xw-oM>3oCuP5&h$gd6+mDBLf_OL~aP at 2e~X z&QEr at 2xH1iOAx2}c#jQERR2{Df*v>iRvo0xOHY}XbngXzc?ZtqC2advh~+2MpLUOq zZGfIcQFYJ8dpx*`?hCq$M%+V&m6v*NhrNqDXn~eJ&eF*OhzRzH z7}|kp+I2P<7c$K-&PjJT3d4Qh7M=IzSf}Zyb at o+(SO>)>fEt$vyWSh`Bo0Da4q95V z*$qgQJcEYrNjNWVT;;ZxE@!URlx-zr4U4mM(WX2fiiy{Z%BojfE4facTN7YhLM2E) zYp2skLCmo6reoQ+EM+OhmeLz&sc5Ufz7K1X5+PhE zbJgJ>>9C37NOClZCDqA;!Cz=DBFGS~k~m;eaY)fbIPUoZMV at D$I?0+DHM27dS?yt+r!% zK&FEiTWZAy)kRsbmP>t|AUr}o4m*&KYqcSU+&>lrk at j!w^kNrpQa(0nkA=kQ&`Zi} z2Axz0rDtR>UWAO&B;kyf(#=Qpcow7N#88C>I?zufDJ_N`Txd-&7mcjPQ(hd0GNFfQ zY0S at v5G-g}SS!e$6t`SmvuufG9d5Sb9oEO!tKBYP$znqy&;=u&FNZ578LK)D&9~M` z_D|G8O=N?P{@}Ps$^u`uISPsnX2haSv at C1OIvu+wh6#FA(RgdA!9l%U9aR at ee9DVH zX;Ii`EFH*rhK<%Pll1cW94Q9jF}Y6T<)r*+Z^p8&bz6Q>?q)|nHkEB$kJoaAaI at Hm z^bXV3mnyc}YHm*-a@|9pwKCpNUQ+C*wY7^p*Y~62FmbWbp%Q61K?` zJ%EJK=+QYuv8OC2^#OY8AQ2~DO-81%l6d;tHuj;-AS_g`HLR6wBE^*6 at 2VSo-UcD2 z8~hCpqdDS*UT2&O=_h}K1t3_ACg4fUCPK=kK(W8%VUihqD*xej1yhs#HN2$n))N6A zrbhdlemlkoD_HrMs*O!pv#<^-6_)x&6j9-2!B6N{@`;GKw at YeOAx88r79nE@qF#bUf z8zguFkr2Emp~iH(N#TnApb|=FweXiLsi_e*pzR?yG|9wAPhc2(gtiJsHaszwp3oP> z+9MG^Ei(Am$90FLXf1>fK;MGj(;#zA?K~rc8nrzXeRk&jS9g8zNa_iWDV~X1cW5j7 zR?gYPvyVsK7&V>0V4m53sBDyVqveEIE51?*anS$@BJ!0-r9t at -|QKzgw at EipshsrFM zsGb?=y~5F_Qr&_VHm>J|Vc+iDJmX!+PM1?{e*nr0?FnqW-Od5I`^yK)d&i>fmpiEt zAr}r(1vYt-cRHXJFJ{c%7BHQ~EcCP5OUO?Rc(4pAD_K(+t&(0 at eZ9fcU8DGpQEhMs zWz|pXe-PN{w|>X1=S+{r)1X^QuI_0(R6uKwTpSZLQ z%1tr*##1Yv7O61vgB}0;pHRjk|FgH{AB3$0_8$@U|3)zXDugIn8ri!#*eRQtn>m}= zoBVs=O+`-uM+l7%w2B6;Ut6XZt-b{w>Rf#jk|qQb)tAU$$cu1=DtbL<*sN9Rvo4d> z?jTqoU!d|FU$JmFo<1Xt>vbl_XO at rU^)+vj258eWsn4ZL(ioviO4x?nnS4d=2>YZ; zc|3o_QPDE{kzvcZ?Lu23$HfRT1#sQ2zWUe^`vH35D010B<6UUO zuoR`R5>*R!wBM~PqbZJZ#NgaDRBs6hb}DY}bPoG#NlRUh_*@bw0P#oZvTamtul+C) z9RMC+3da2j76536m5VZ>@TP%V at AU0`ao`Nd4zz7vu3VzD%612cs<@*g3gu&|#jNY%7pSiy3FzdKWlEbu57#m9c)PV{+6d44~+j8XB{NYIw>yAnCCJ zww~0nq>(oaJu%hHjqlP>5J=E~q`WMX4v zVMb?VZ|?BF)?QAI4-xnuc6E8FsAT<2+Z-7#jfC>u7CqU(LF3^wV4(5_?4PVjY8>gs z at W_91-?a at 4Hy@59R!+mpQ9EXwi#-W*jXEqL-DY8W`vJ+FBy6D<&OzlMXYZamN<5Rq zA at 3a8|8?DN`GNl&$t=C at k{ZXN&zUf=G43|uLtRZsEk>=0F; zg%%AVCXw~_lB;@`33ndjmR>hkmFm4vQ+LZ0gzBE)S7cFl>l9=Z-WWX*gt{;3b?Yvw zdDjVVrqROfl+A55+-#)ksh at w(&A|^=`%wD@wl&^q8It&)HQ!{s at 066sWLtN2;ivliX=L7+-0x zp64E~QTwSDc$IIKCfwWoS$E7H#Bl${8ZobmrApyP=#{BeQ8{;yrj`e7P at pWZ}Z;znNY|=l)X?w4W)aX at 0Io`xx^h;D(p6$Vk!Rt5V>nLd^`YGWLUw$U^9e zK`NQ7dcqH3Qurub?lV@$7`dfxqR2}py?RY|O|0KNRUXA69706fNRhD_rcwJS=n6CG ze+%&s`C{h7r}@De1+k#j82O^`Vn4DfTu>;`YQ7qz{)WS5TR%Q^tn?StDD?KbQG5?oTVF%C&g5YSlEX{APtr-ri51qM-J5 zVQ^Lml?KP&OP&&qygr03UbN~5Z1kQmSf7jPhfV3_1zXG6u4A6|bw^|Lr=l&xz(DWd zfVw{CFP#=s{I4)!9-Zqab*!cI3kX*EB#Jq`Xf85;G`(ZCxA8qeR0H zJ1{}LreB)CjX;J6{IYel4Ad8^Q$OqKWF>@9_(*VhNKr^HQkhg%&fl{B}o{2 zNrayIgX*TTt*aa=WaF(zs26wOrU{!4x z7d3*CP+2n)oxc~!y#+nskUSjIIo^a4I-M-g%;JY0W*>q^KU3z zSE6*ruecd-CE^*6T!DjJWKi`>H?N&M(-K=3`I4(a8^-nD!XJk~f$aX3yiF3zu3)KB zIvcy1>oOb}E=HR*{0H-sx%o7U1lh(Lkwzx3k+JlHWF7b~hq!kyp`EO7+p{Z1U&0lF zj@)S}!J6|*xEN+Bn14VNiEwpMLi$y&gS9?{SX!*T!jHuwnHdAtsU8!SQQ$AwiCkUo z at xr7+DI7V`w%hfnPG{tcfEVP{1hM~Z$h5B>YqulH#vBj zuH8xcuwLq(0ctDm2}9}nQb*(0mf at ay2q(B88phdxPI5=ZmB%#+tq3!wxNpZ05exm9 zeCwRCiMOTPPi>su!b}!CjjV0D8Z06cqPXuFC#~?uE0I`ZQX2N8z5>#TCgXrU3~fuR zXG>77wPlPF_?oW`p+9(I#Py9OCD>NWi&n{JuFY2m`#fH_{7DhD1&x*fbLe{@yCSYX z6P^^Fx%c#UAcu>6o!EH at JA-d65T*86|n;fZ7pN{sM8KvDQWK=l9DJ6!62*5b at uMIG#ntnB5D?EXEcqY3SayNvud zk5;Flp$8vwRK6OFqW*Xd03m4hMq z+qr{|bI1v*7|)LC>GuvMA0=NPyJD>{?%C9$b}Bk__N`41L+5RG4##a?z{zy<*Hb4V zKCok@=IL)xlK1j{e at KEMU`TPNxmYI1lRYE>f`d^b9)gyAWXRaPEZR>>0RopjC*J+O z);qgg|1b%Kje9*vx!i_BEB}DFUf(=IfxTG)*F9|BtT at 8`(ZxH|uVe`UllHvFLrnIs z#JIN<_}-Iuhthp6-toBIhbNDBu)Ejj2gK?-FM{s`2?oX?f%~Uf+6PRGzcd1WN8)-P z55;)&jh7i7j|knr76C;Fv?EXg`un3*U&jXQUFM^g)wl2?FQuRk`@8P8E_-%egK-+~ zn*ne420XF%8Mn;vw+Tid?nF?(|I9UvAuDQkc>DR`-{{YNtPlilxCeOtX&1n|LA0J` z#e)mWY^`FdS!c-?=TRLL$QMhaaDRU9*zE4^?y`|@(d&^^=_2Tgok!yj+ z9q^Wn)Nplwc5~3(ym@|lXK!itYJF;Uv%9iIM$!)iQQ$;lS&FZhf*)zlem%<*}>!bMkdBEd-*4b6?yCn+$;H4(d(If)wR_pdALvvE6Ak5Vy zrSGZZ at Oj07_>p%XsGr7~0 at HN_vejl@Uwpt8 at NMmwgtP2rPp=&VoFnOI#zO#~K7^<_u|z+Y~+V8X3+h7dXcus%bxLc^q at kiQ~Q zQx_*!Y*T^10M>rIM!=@d_=lWC<9h$m8WH?fPc+X82Ru2L+9}3hmom_hFLv`V%X`^v z^w8ed|N6d)c8-?74%?=4QZxPKPBSUDXkzCr2~R!*R>QfJZm`Nlg~W60_MCB}BeET_ z6~C;KHe>8jK)^%a0%bk_JF}%$lw1zeoR`byDfzrU=BWJ4G^fP7ngj1V_JSv327{$1 zGUhP#0XqgKB`_P43G(Is4%4#wF;|lovN=aPK0E%Ba4r})meek6K4(mEXpH>D@!`U> z>tiTk8jbW+ekcR&0p;i0dJg|O4lyxuMbDpZAT21i7AN`nS4+msbJcuPR1W4m8*}6v zH-(DhT8yKyY~n_!Q;J-ANUhE1`_bD_GZTbrDGhBJxrK*{tl`bkr3 at UBkmy>mk1mL2J+($Ee4#Pq8q2ByZ1Sh+Pjfq3rbT?R*k8447K&oVg%7U&$R%vIPN^Bm5ljTTlj9{-aq^nf4XWoF^ zDVV$}_e at W9V5-D3z9;I-ob%1jq=5VgF7ysYuOf=iji$t)3&Tpl79I)%!fS0Blr>Bh z$(d5x2BAUohR0vG$4#IYRVAl$m at PPVAWG~!a+ITWl8vb{M11lBky_0T=2(* z*JMgEtesuHRWXYCfYqrZsJl(Lp8#&Y`E9R?){v_;LeCRGjKPv3gI2Ff+Zur$sY#_y zwI+L zQkzm;7*p|@ckG*t%_y}EgrJE($j%<%;P%OsRM9wH+vKmjtVpRZi%xWS? zzN#pI_+WB>&BUUow&c}~&9P!0xF~lm%!xKPO{yqZ`pJOx3eue5rW3d7E)S5E)G9v# z{jjA5Wg>uKH9KZT?@W71A9v_Si(;rhK$LLzxZX?5ky?&G^RtnC at nA3HDCks5&}D8}yMq;MHHgNNu)D^1r+-|QH^K0j9XDx80?iY_x;00Bq!+R2xZ z&AO`5;l0My(LU#hCKmaP0*sm0G>7-wkwWP;Wh+`tD z+YqV(6HSUAsdcp7|Esf$`tzm+54-7rTvT0Hl&as{{sbHm_Nc{k)hmKCjI>VzJf4Ikb5GETj&e_)++z*Zql=}#{lwQG~q-2YKzJq$T zbuk-<&`ZB>s9 at ZK?7M6xgcQ>9iTObir)|d#$rvmZa8Rmr6y3kEqnODP*+qoLcElPz zU=ANWurpJHg4daI;?bX}lIh?F7Tf58<7<+BV$BIO%oYTKLX9Uf4~*7HAbL+J9r+JR zp_JPeG#FJ>*Us$_=PV@@90py0$;p*V7oV*%EYU9y!O6~OLw>vmuO61u3}ZkJ7716H zbtdZ(M&UU0O{|q%3xP!fJF?6=S{uMGuzE*cuq^Q?gLW31nYgIj{9_Kr;#tyRjYbhu z*x&-jf{R!%Av}7dju at Bk?Q34ulFPBh3D9~NJjQTZ^@-C0EIRH&^SB9$wS^rV at Ut3X z#bEVkti`2ZiNPWi#`Lrv{u#O^7G=}?%~&v9z^NSt^&W3`&T3bm^cA}B^B$hK&9#tf zo(b!H+A+fT`Ij_=xBV?ywT2YTaLh15M%z7;8FQW|Z&N=hlSPV71`}U=dcAnzo$>^4 zXv=kYwv3XV8J(w%iGoV~5ve<4pRHDeGegC^T%{;MLxGLQQU9;^$f zlSNyhQK$=y*g}5=P#?v9mNc&fPpfdTN`NAJ(1;ULyLnDH5#}k1QV5Dt zG&2*dS|P+^2rBFlZ#5?DA0gU-_5)U1)Tol_88Ch;mZP(zw(L2L0`$B>HrSZfeVE1E zh;lC^=}ed52`Qx{D1M1(+XBtN>j2_okq)f6a=uM<||&>)q?GTCegQG{oEMBC6*`3g_NZ+~JjB`M|k7^%5S zxj7c-%kvV8VxwmHpz}Q%x?G`lPj<0OS(U2L0I at 7>p0Qs&e^bl>b<9TO4`25YD!ggR zGSo at U#fjE&3fym{rUP5T%(QAgSW&b5;bia;*<6t&x}s^!uHG>RQ*dQn>CV!256RlT zO6t|Vm5w6V4POne^1JD-$1P^l4^M|XVA~|H#7tviCXH at wIbWp3)p8xo*kGy5N7 at rc zjk00e$_XJhWj_X`g*3&OEg9!OC&hnjz_Ola-BN0QVW_uo;Eiubos(!T8|ty at i!2_9 zcrPl8oN}sIX4qh0^1MG|Y*AaSWyzXMPFt%9yI0feCH>mui)^-%)j6?%>-1}zmbGH? zcKMsVxYvQ&zOoM(Rb&Zy07xh;_G at EGPv`EVb+JgX(ME;mEr#a}Q#R2GWtdS}(@rKq zw at 1fzt(r>{z3a>Gor^o|3!$C?H}$XA;L6_ z3JnDGiu at nzrw%Tz|FS-CaCZIQjUO61o at f@>{uDgpwg6~aSm+}`P5EmA5E~hAI7wNM ztSDs+Z#CXVvBwyp7U148$g3*euN}r5d!$oY}*}l8dgdkL@(|PXgk`&KSppGXv9o4hVrg!}6=RJjM*ag8gvwKbI;GmZwG42#=>Ml(rGSxpXzIv8eV6nxlA(zrZH zMZ!*PQ|1LNpmNawu#k)sh-Bbn79fcVZu@=(;S|!(nj5t zA#|md;t&m7%OH7yb_aWooU7chTz3p*7^k)91xy4jUo@X1wlZ(m zb>pd%oXFZ^9fg-?CF(96%1lb*14u=>E08xi(bzfu55B(osSU8}vUqTZ;8q~GdvFPq zQXGQ275C!q5>hBdiN_XJam zd{`W+fnB~EwjGvradk81QftBVB#V>Qm-(cfpQqVNpPN3w*$h}DX_vw>^s^k(0X0>8 zxlX5_BbyI+BSNad4&x>q#YS}LB$KebO_f5SOc8F-X?3|mjqGBR_ZdX{l)eImWu=;& zh26PA_OoqlaBuwRA=RCak7 at 0>lQ-qLE1mC2#Ooc=(!zq)UO6 at 8$ic at es?eAH*Xj)7 zi)_uTu<`ugFfW&waR2hDKHak)<{_IW51N_vrGpr-brwqmW zhIg~^23G*|j&z?Qm9=660#4cX?T5p(u#Q)&HU{r->yIL1i?}6WA1T}hiEssY4*Diu zn(KIx2I4`rY=j-7NI6eUg}X6RgsV(3=s>pXe|hUAYC-QPKT?<@Hl!9s)996UQ6yiGYWw#uxBaezN29$ z;Z>@US?6ETs4<+6$f?`3;4|i?yr2QO71ji&%pZU7*{yvKlg5SSPAU;4hq&(ZQ9r)< zM0K7mVIMb}_OejWTOJ^zgrmshK5)$p!5aS6U#@>?{4~oE0?`l#Hgw6({ramu9#@=x zJHlXQssvqQg$yg!j`aYYN_b7n+g>p+EuhLH(;T`aCC-8zDD~crNm!@Hys$BJ33NR& za7fhY4AUeJEwfQMl1t5{J4h%y7fen4e8dYj=RP^R!r_GSixH@)&FCZfJT at sb_3N(6 zn4P&l_WW8Pi<9?|c!YH~BejyxzJD*?uJ4pVEw&n1n(CBKhB+sEGxuLj+7< zWrYEK<3WDKB0?#TLhL&`-U~^PU%zdZE$_X)1}P>Hl_ z&-rA`vIym2DQp2fp6@@r$q$I*S0r^9tDUoYMQnl$_6nrz;jo at SDoT2ayBm9mw3Kfo9 zqO7WvV6KEO85#3^iN6Ii&%{+Iv*jlZi*G^Jp8~$hyXROAynyd_c_{;dfWWpqCQgmd z{$`SwtlR at v@D`S$?o)URb6|rlKb&SY7`<9j%{1uqhLgZgx6h6;5REm7#hQO2n<#3$ z>)P4lXSI&A^I4I9x;3Q^v)4o`l*;ibQ7xN*-E<5luA3YWx(I8FIrA^dtZl+E*8fN( zQw*861a{%4Cehw4-d!&18S7X)Cw`i-Sd2dctleEM&rDl85x8l`i>jZlaVgnf z0{zxdnVA~SJ716yq{&asy+nuwFFY~A=YyroFtdzT=(oSDgai}a|0U6^ z-f(A|H^Ot3&q(zGXN`hW<-CaUf1qZg{`W1?|H`W at t%m#GV7z$o8vFkxE%iTp+75n- z_VzvwzP=8=FAW at g9PB+c{ue9%L4WD#)FpW|ABk_$rt=>PCx;6J?>7u^`de>vNG$2;nmrz at PHm$F3@ zPvfx1!sCzUpTJmxDOeb^+%y|ckGx-{KNGy(ro#}aYxt7JoM3_h at qS$_RZmYnip#Lh z4NNzgwSz}LrMY at cG)ZZ?C1n4Ka}=@lHs?&HzDwoAYoxPLQS+uCXhLscnEBm4 at w6j@ zH8>*Ef4&h=FoNe`PLTh)$GLC+B($Yrq*U|lt-_~JHq@&1Kw9WUp>)&ES8cI0ONfC&jN1S#jJsh+ z%_D)G*K`B?dbOWeYFG9p%zHFIqTuG&q) zjMb-j!-|em-ts1_4cYC7R`uh2n at F6UeY4!q7xMI7-nm&+A$AO5_sFZc+L|=sr5DBL z_*RQCiIY#hx!1!sj*rJDDBol^Pb>oQ{?XpG#S~>gaRRTzPqejyb|BhS2D!*9br*y@ zw+Ie|ks~V?^)+F=j;7>oLSMH-$mP3*>v76B5E&Bn)InGxMdAirTx;L!$KEh}s%r+q ze*4Dow at vER)t;1RE{_y*eRwu=pG(W_pb!$+(ULcm+P84{eI55@?Q|&0XvDa=-0Tf& zQOj|cXmhn8b)nW at 7{-*Wmn_V>%BXtE>Qh+}J!&t`Aofy;-9-cBa{EdKGfvGcGC2%& zP1U!9=3&I7%=KICdyetB!or!-=#I#8(Imf9 at -fiVa?ne$Eo}|U9bfUB9M5zlCpgMt zu1d`Qy!Xp at yV%J_FRj|1MK7AUE!um$Wm at EaqHXe1BV(M#A2iWx7LHlSo$eDu`U9qX zRm6tVHBGo-QCZb<-0{)+&yr3B?I#=@kjM9RImCq&GhDKh6;7h?L0vrquAW$2qW|xuM{m(G4+3!Px>!>VvX^<`T>0LqFmtr zb?@l^!sma3(gZiuV7E!$>8wyp!UmY5U=%+mh=EH&K&vjOm@$>XjLV$Tok3vpGB-(t zJiFPHdbzb0ir<)=Sb_iTXB>#Osrl`wxJ?nUmW{O1v!AtJf4Nllv) zw<{BYH at n+$#7uO|rN91u&7VHG$QTde7cVF{-$ZBJwh at 3`*TDv*g4#2m`1!M at Fp0Hy zSc!lAS{!EQ=fC!%`55vgk~8Q9$HvyMFeu=HVoAzSZUzi4bQ-#(xva{VcukGt!1pr7 zerGMO0&oE23$%_ivw`e7%hAEM`Sg38(xDXwYzygYA+7#x80$excFS)QA>>WP|?&< z{Go1r_kqAvRpq&dQaYe-m0nd(@IaI6- zFiflMHfYHe{%Bqs5F#CB7j96Nvtab`Zu!H;UlfbHcJ7Kq#b#-qR at TVNWCVOU0%V&8)C_gDz{FYa at Biu~@@XhEn{W+h)m;rpR+bwhC8cf4(pu97k~8m$T{;X}f)Y!ff*Q_e+tp89#ZI(VCJWge1=YxAqaRvDVQR(O&op}Jjoc&cDs z{i|B++t5%;e9Y)~dqLb$XBJS53k$y*{Ifn2uYkr5;m%v-ny&XePWIap?%-q at fiL`~ z#5m_$3CLlKGnb^)fCLK<;RYhBYz(q`%lP6}Wu!|Pe$=U;0ZkEAFlhW=BbEL>f|x_& z=tPbc2+}yL5xz?jTgyXxNa8?w`8p(8Z7_HPaK(qST+B;!b{}dJA9Q at Fj>oZs=Cb0t z*TVjFKgxn~e?#=N369y3(} zQ;I)kYZi>CTL_!=BJ#_-Zau_uH_E`;$HF?CeRVCP%xx)Hqfz#BN1HAb%j$5anxHf9 zR{CB9J0e>yvS+6pR&~Or&j;P7nbCK`w5 at uP2uyla(NnbTS`hlJXW`?Tk>&89VCiJ-!=V{V{&~dU3*m&C7~^ zteepxU;Ho8Vu&xP38fXEup^Srh3`D%?ElDyE^dU}Cx)Jh+>M4Zl_Ei#(;H=fDOql5 zW4cDHFjl3oBMQ$lri5a;de-T=#uO_BSi9CYwnK-8iGhEa}I2*R_ at 6!azw*eg=syb(H3 zUAhDoi5 at rvV||{?P;OAOpd4)Jt#u`$2(=N1P}EEd3nbMFPY)q>cJ<(WhDYNR{4MX%zL=Tph!7COo9J|y6xbP|k*bY7YZ7l1t3fLLF?=A7vCN#% zK6JvC?+XCNOTScO)Q)U%?54BP_RD=2Z#B(>{e)L}zfxMhZliuK75=+8 at UR6t;-i(| z0b#KI(8H%5flK#9 at l8b-&ySdx#SaIkM}U)8YQfgnhay@`%(}S;R}x$*OiqVu40Pud~Mf&j1YW~415)}@gS!hhfm$`1Bk~lgpJB$VwoAG{xs!%46*b?S>SF89x3j=o6O5^Jp% zyH(^orjQi}Sk7UpWrk4Qn=<%RLiCx~K9t6&-K`?^=H zLXUQHP0If7H4Sq%@0 at qpCsF0)_L|?)l8Sv~1wpn14j`|&u?`ChwxeVEBPT6ff%z1U zchU{K_LqmvOPQ(ueH?*m`nG-VFEu_p7y`zV)&AmAJv8U6rtk2k%3o6%mgG$*voj6E z_u4oXI`r{-&9R1|j}TW;3HQ8=5on~ox7qNk;rrI at KBeB06Ao@YHqYYOl+04sGu+Ae zb;NO8 at S_bGUL1rNT;(>DN+!_Min8R<_a6Y!?1N at F9#{2lpw}PU>D(oXZv4Dad!uIW z3^cvBYD at -S#9VzCab$nE!4nDj^bI^bxF4ktlCiL9us0GEZDTEM*9_$S&To*HcdC9{ zKCQcR?BVe3{W{FcnrhZ7ovSWkPcP3eNUg$lS+y<6g;-7e0TWS#q>aF{!!$*uuv0>0 z7#fBK>$ka6zfKC9hWx=?V$^|rM=X?Z$ZLgMh#?74G!HdkHcf0hhVbZuMeRl@$qlf| zns)4;m7Z0 zG`OMrbao8qoV7LaZzdNxy)C#3H8qFbON`S~l05oP+(mOeD)E*f`;*}(k_w{-qj;w; zT%h at C3)B9RU8%_j!L5q$A2ghvO2^p-6RZwQ%p;G!eEc_Jai7YP at bbN>#5qd0iwL4} zws~gX%e%T{$2mx8l~mF2ru3*Ojl1BKt%^p at In_P5Z=hab_qiB+`9mf?KmDy30uAGE zZpHnx+I>uf--nf5eu>rR#OJ|8$5Q`q_&u}}Yn)9r7B_a#x&{0+*r;k+Xkhj{){#C%H at PfP75ST0zJrkFnbs#5NBA${n9{Pb z#<{N8Q~J^2ZN_1K#%j?)=tE at Q;l%8#h>|9hu_@$VvDQ#!%X9)Jo3Y9Sj!ih;6m>C< z^rAPBpH0hq7o=@$n)D%a7-`KU*DEWf3GBU9u_5|k%qv^{IYq0gYS>7g62^F29LN6l zcS`H|ny9{=d_yYk`~~e at _hgK726l)DQ;|PCGh+MlRh~WEOe1Kc#5DSO!Fil7rg91U9MOVUQ z`ujmoV;t2mjs at vP+RAm4fE>IOdX_Ho_JV1M{z7TEeDD!N(_RY`hbLTl^!2~-+R?uj z2C-}L at D+sEt~J<{^qK5 at A%o at F1wxJ z*e(xh9xw}3u(hW$DuhIToSC8jyg$|1Pd(|ns^VGl#8+Fs?kmzU!H0r$>S#Q2rObXMe`DW17ZUfX=J#WEcp}f={0b(I2l=1!Q!v{sZ%F+_ zyuyVE{w4pPzSvMK^a10^h8W}g!)lZmFco5n#jAfOa|2lYUEImi-}HF0Y>T z%d$wGQ(vp=HLJx^DEzx2tU~`|h(%k9pM`(zL1nUO2;76o)Qf;m^362TpA#fm4O3DL z2n|I$R18nVYlsg;5Rj;}=M}VLV>eQjwk3`PF=*{x3znuCOi<65{w`nqwW_jc8=JX> zBBaFWsJr&G9akeiv~6XQCH(Y`k0IfO- at 9Ba)Qi279Ii^7DRMQi3b9%0V!H2EKF`Lu zqX0J=*6s9NaqSP-*P9th at 1h6N5gCn4h4BJTO%Dd2A-N0oRibCNGT}4KPN6ub5?tcn z2-LNHmGp!Y;OvRa20h#0T z2*MbS_564l$fIC(z09oC_|rXhcl%)Cyi#PU*5$I5 at s=RC>xYR$9 at USJ?zP#l&WhF| zszy-lMYYM3A62*$G42E^vIqm?J4;M$S$!x5<~z0=Z*r~8e6FDug-D5+U!gL5`(b#e z%p`g7-I52b#*^ECbrpxYbUH)z0(9a#%;>7S4$ecal&sqiqnxI8X7<$$Nt~C*J!oO0 zHqx5X2`nOAmO+u1qn+w#U6v79$)iMiB~}74wU;ZJu#9Rq_u)5Lb+G^l at ncd;+4yYE?fc{=C z+lfgC{HkhIh`jR`;Q))T^14QfT{P@$?lUj#lP+{>X5M4v^{ivySjIxaa1H*EP;|W> z`^#;SDC>GZmWmMArW$<==^^F|X>K7HI*Wn*7p3`$OJ-le>qe z-{mSe=zdVC=F$6??86dkYh1dWO`H;XdJg~(d!Mnm>OD6R>rVrc{)v>yCcvVG63y%f z;=@SKrs6T<$>%w#4N20fzpp3lr;Sn=msagtg1$^tS2NwHJJ~ES3+^;csd6 z#9%L)RbATML$dR*bK^hR;(y)g ziaF at YR*a~Kd!{IE?_CI$eh8>#lek$xf28|SSMHFVtuxW0N z_4d(YWy^_;$pA`@j73x1>Lyn)qOP(bIcBaZi{Nlb)9F{Ul^f}ehu{1^FbeE>za2YL zN|6Y?(OF4kc6!8+yhfv3dM5CFQ6Zv@!syt&$avqQUiVbr;k1vnpNq~W>|?-$Y=V;6ZKO(ol6TMkVjBci at i?; zduBtN_G3fppyBDyUhkIIvF#p!3V?aljfb?#?+l6B<;TrKyvh>@4|}DNng^c()-pxj zm$717cgO6-@$p4%5L@%VF&FvjFxO|o$0 at 4Gci+S-pZ*FfpXycf^OIhI73@^Uh(Uvx z%f3d#%UCANn!?NxAA0UyeaWriqsnmPYBN$A#%qX}@+N=BnCBnXXes5o9&Zy{wGfSL zI_gkbArSXqQFg8LHpN+7)W~c+^^0$2!!I15 at w1$eT#-|NE6h4~YJoMIK>O_pUreic zu7inY7Ij>j$gV8&DKssKKNDts&1qgM%#F~N&mKq&`Uz`vtqbN0YC4V_yEgc~rhtZW za+c8l5P(1D+%j!)u;BW5K!19bi#g^*$tE7l)HR0 at kh_r5no8Cl^|02sHdn0Rc01l9 zs&5%;5MHJEX^SC-g3kb3*xYnY*QdH>+rpmJj<@A3G(&u(K`APgcqjvgf%xlqi_XwA zH1If_;;7H${)|K)T9u#+u1LaHXd*KyrapRVG(@g0gvW`BE1<$b9pOj7&+qb`(ScW5 ziAUjyM=Z3}vIO3;O6(vArz at xP*Lh-WS*3=?OzZLOM)i>B at fqv`^ivnps<0H(CMRpu z`sX*NLCaMg>K|R?i#wKK2hyj8tr{VG`d{z7C#?5;D?fy#s#ZAu at Swlxs1Ppt;K$fO z_+j$Phw%!l85xpphq}>q(EjH8f1G{%x|uJb0?|48a-T|#KZb;bu%?WTc4YFm1q(S! z+X)Y4D*jrq;inuq$g^XcMQM%9{AMk>5zpFM(3uKUIQMjJzVXP;8!x$y#GN|l&3};1 zZQ6g#9+@{)JB%AaJRH0aU%mkO3#HYmtbM|o$sg`{R)}caKsIdrOoogMgU`pL&r3tP z$))~rK6GylS8ODG4xQ-U<}dHB_(}!%fE{xbRMx7Mi)cGC5x{8G(Q}bi2nZA2J@$I% zJbLYtD?03wH2xVpeR{+d~*L*F_T;P0dz0kE2@~n)Pb?LO$K`{d9ig#Mm z`)F5hFAuJUYl}2gg9){!Cq9c@#~D;E=$2V(YoZ2dTrHz#F44K%-lF5z>dzK9btnYC zSSz2?il~f$&Z3}-zDWQ1<W|Mk> zuhyy_P55y>ws{5OX0*2b=e6hr1_oB1eLt^cX}^6Q4h?h+2nY-a2)GFhI$FQKC8QN~ z)(bd?=Z*>ozWzScU9`3lnDqWgwO989A;1xsYM7+Mc(tc1F;9 zq`v(pjw^y(r(rN;FGyG*BM6Svw72BA!pk)tZdcp$7xv5u%0!yk|K_+N$_*TDhwOz3 zGiBUoAR+d099Oux+QXr0jx4zo!=Z|Mn!;A_`#hwCeJA at BL+<(TUxhu0usr-e7b##L z&VEIgyFUC^aZg(~0)C&5l(&CozhdfTj_m=s1C&YPSqYS(=r)q*05%de)>I{6njp3f zZ?9x5L3AWDt2#h9I=YzE86X`UWz7l&h)2h4u)YJxDN)&I#8!}Gt3k1COk#IQvLR43 z8`ankBt~k^5Fktt&4#u2W$Z9OpTtNpC%KNh_bs5BttP6Dqt_JR%2pFo$KM+aIA(K; ztYhgFjZGu@%;uI_huixZkk8_lUWe724KQPIORFR7Z3e8cxWNQ5Y;a;3NCT7>X>6!t zEl2~D7a44bV`WKilosi1m}2Rb7)v5`R6s0#%vq$;q}%`zQb!g8(pHkU0RLEz*d+jA zEQb<)2~G*M4N$-?itGav~4Q_y3eTl8oNyTPpn;iJ7F8 z%-^FWDZLH*=SYkp<`~{u{Y at kbYUViJ7X8;G3y{?p-pc(hiF7P)Age%c at _sE+3FTFK zZ~T5f(iWvvT5r03chVN+RYq^@Euusj*0b23B3t~4ZLDYUKV`NU6GK?f;(khO$t6nl zgKg336QN2c3cPFqtVSeGtm8^GtN|?ZB*%$si4CN5iCX+ueq|D3RWQMYS3esGOa+X0;oNUW0#gMOUA*fjC(%{`<6hYJ>yv1! zf(bAD`b9`4RKWNbZvDO_6RKe1i_m_25&@NVz=dtUCW(M*JHdrdKMzT*N;}@g+kRJ) zTGe)J(O+zZEkGZIhLcEXE*ei at Q;m3I6KkN*2ae3Em;cIpec{zp-E at wGZ$9|t=&$6UW^gd;WEoQ|)`&J8uRfC at u9TPFC^XHXp3mwY-zYUrrEbRR9 at i)~Ev~-8>YmUj zJ55l|kP)D=jO*f5Zjlk7x=iR2ST37!qq2q6+0VcpmwD4m3d4h zFU~;qNa-uf9K03o$R?JNr_NW-SZ-M^rS1#gW4UHIO=)DBepbg}W=QlSneI_fU}i}6 z15R(MLzo$o{3xcU)CZXvQvB$rFVs1i3lsgwriaxlnG2KsXr~X=otO)g{HUgv)c2VS zQ~VgG at 71Z9EfW1mrw7zOGFv43(M<2E8#7xZ`B6^KsV^{Fr1&vRU#m+nuO<4CPmig$ zFs~*1(M_MK2QsfE`B6`=sb9gVnAc+b1g68(Z`oucQOwiI>cnia(J0WgojQz7HVXA} zT3=n8O*RI_JMF7J!PXIpVx87h7hvm%MsZKOs at Jl0M4>pQ&D1^FI$}`#(;@2TY+;co zmT8DO6I)m`ifh_Q9Um?Sc|bqZEU(SzRC~ZaG%G*P=!86=9YV^BGQ!m!unvvO*E7N) z4;Y8qnydnG?V^{$L!+z$3GLuZydfUe+Sqns zADPQ{JGevSa84F&wNKIQc$Wq{hHztLONJoA9WnTVk|kXb!;U|ELD`Zi2xEs3UdiGa z3uXwi+tJF9Q2k91C-I;+;D9DlD^X at djCluwV@4-7)Z~=u*l6%&j6u5w5C&j(+ z&M3TAp_A;Md#4&+tJq0(FTHaN_f+U4z314;hkGh^Qr?U2tiaC|I?3<(ciQ0lZ2vKU zb8orxm~jpXe{rw4laRrr7LIwZyEB-<1PMpK*Vw7dC{hc at zBk#~&nSX~qus0Se9W*? z3&*-Q+*!!5f`nt-YwfgTtgD6N+*|D2W~@V=U)(G2z%u03o-yzBcP28ZStHW_VqJb5 zvSNuy`%8G)GPKST0sD(_2^*4U`Iq_^|FU+di{)SXU!2RLp$L|LX at 7|?yN3Ri5Gc{4 zPR9#lI)Fw5v)Faw%OZu*9bS%rvZg?GI*8I#<>6ugh&4HuwG0H}PL3}v1A;h`<7~?$ zLHx-HTV?jT*(xS at 4lY>^I at ziwL=Hh&lsZN#Cb$j`SpiuWAaWg!($`A4slr$elv!1v z>e8C{AJQYVAlK5GxF6yp(xBtgnuH&6BiJCi($~sM00-$21Sr4QE%^t{$R5b7*e&S? z<;Xl}rPwXy2gAq>NJJ+_ zhj~O1gi}Tz?E at OI0VR~tNBO)Q(FH-u=wp0%N4!CUWd)HwtRosA&a#4NAMOzsP-R&` zln=*<3CO9eAjXG(BnY%$W*+IoGNKBiE;Enz;TmxOeJnGN@?jq_1R0l^$N2D#_=6V8 zRwI4bMzlZ at WvkIXJR|O)ma^3-AI=dAP+%DnViM^?JkkNWEm?(Kz8HxC5to2dF99QE zAXo`F{StE|6Qo at NPP-%+X#h=>fMJ*DBPk$(lJ?X~ypd{9ZAp9jCH6=@$g`w9?UHDu z4Rl`84!cAfNdPgGgr;8Nj#Pq*N_bW7>38w71av!(#-7jUj zgT?8p3<-IPlsc*gxQ1$mI)(;>h7d6wEd%^HHGdro1L8TzSSf!}E5*_Dm(gPWlvetq z%P%~|-xFKOjz+$me%aRLEPkU>7%NTVk9WlVMPJug)q>F9e^yLqLB#^!-+k6!XF=71 z*gtHRP)97;yNpCy_Ve#`k5%b(+jcb5At^;^QG z^yM^Zx~8aQ759>x;+xWO#ljS6;wEB$tJx==TZrt7YlYbu9bz?E%xj(5J{@9+Ec&(j zY?%&BO&0qaI=ig{gUF&?tITHVXsgL$T^r2K=x9S^F|J?FHt0;K$>Lm_&tBnUhB<{>IgtO(63+3R_oNNbzonc&K~R3LORf{)n at Z`Jk>g|u8n3_bUYy) z7}sxR+jP#=3Sq4;t{G=TbkCJLn6A-gaderK!hqMLvk+Y-t zthTPavPI&9)DiU;tJ3he2eBiGFYBe at 2@kSI#9!n~pJN|Hjs(7Rl|IKm$Q&_!i70)J zdyqJi|MIW&IYAuYE@(=(Oww55+&7u6K$nia3}}Qqmrbgbr76;-h!gR}a1%}aMI&UL2BOWP~{<;<7|%T_fbbLVQTn95c(qjHyO+?_H~Fe7zmZ~QQ|JcTIJ zQpisf$8{H8rf4*r{9O7ixtVtP$l0~{TT(OC^0M=B at wb#_#^ncRx?=Z4aYA>t#zSYi zGWY0au4PB({4)2bX7*(xXR|W*m}b7^0OysmF at +U0cSvL5WPsWVmb-D|+GGG^1;bst zv19T^Z3TxfAsfO|OgZ(+nZeni at l7M%^6N$uXTwJRMp{#bZ*=bBrWoIn=9P{Wk5%(y z#HrmGO_`QEogYh1VF53eqnvR{7*YcO%O%bUB at F2Sn9FcyNC`t)0Ksy-^I!=BEC78u z$(ggHFf{;gxyre+q%b`IdpXzHsiZJ1fN1%b^L|MoEC6je&Y8NzA~gVaxx)EliA8z< z*765u;}VOs0K(-a=Y>8zaVB at PWm)Ij z(zS#D`DF}e;!@ez8^L8ZXIQCh{Eg%?xwCeuY}}3LvWW9Uscgaxcp2YWptK|QMtGUW zxwf<;{ziJ4&e^lHBko3gS;qOiv?Jk0ZW+g!sWdG1MrfJSxu`TOzM16Iw^3lSQ{@rw z)V0xbvQzbu=rp8}X);{p5%<)o(P}bW^^x#2uu*>US>+M`)Uz>S@>%tfIE>`M8YPZm zIZ&QTC=rN~qh~;o9YCF>+L4^ugE`3e;2Vel!+}##3T`3~LG!Q+$4OYl?wW zvVKgmDV;AL^bR!31Y$aQAAAl*%W5M#Ssz{<@RYTb!5~GEa-?Bo5B4aogX&^!RV&Ic zG1T1Df`S!!7$2%>YC+M8I!qRIJtd*AP7+4 at pms1bC84&C8K#dKo0Nd8qlamtzD>5M ztz(Cop-v}TAVpD~7!TrkqP at -}V8YZg`EDpp_(!mlBZYbz$iIX*wn4^I at 8k&6vh;> zl05K<1f at JhtSnFe1VFJ(!Ib1_pMWU4DVVZ6;}a%|d`eqMp5}=Hr9Y*uEYI*nfD)OS zP?D#6qDT2oO(@GVJ)xuUrv#L`fKOy7%_#xpF8U`t6wg$xQWxzLEy{JOR=JDu2^&Q> z<*C#~^F)O*oAOldVt67#$xNLqb^(Hds1HYA3+$)!~TI)aYWKH<-@|kdT~U`GsDB}fqe15#Aot{iG!}< zf632u59bFF#s89?sUOx4{uTdAd1gW|r}hBdfy#pMwgi1pbUR6GAe*3?ZE7ztO$ghL z7a^HS5Fg26s}2;7k1nxw21>_A+1NsX;_)$?w(o#)YE*U_sTG3R2q?ClN$Rd(_8=6^ zPBry|pb^4(5C{`OvtvcPOdSU53mWz0B-e8z-U6%bYNF~n5T-y^yPBAKenc?v*v>7o zo&_PAnkM+!&Mmbb7x5XGZ{wC;kA=tvn%TIe)e|C`fh#s{Fd+;(oKyy(fZjzKJL*&m zp at 6pmXNd%H&8^#(Z)ciRq!p)Kh-032}qdA zp at v_EQ$}q^gfLGH0)_z}ZBG*FE=99#NWZ$ShLFu|5S-dhqu3WV6w$9an)gn)y# z^aAx#y00TOO&H6C<=D zm|#sbKp+1LbIsp!;i_ znE{kw7?OAIeU7FLf7&mCy&pNFHvF((=zGaIJT~7`m(ryeebM(+kQzCeLY3CvqopW) z4Uuz##)IYZYe+Qd zJ?ZAP3$Qg3bg~`qt+5TTnHN0HS<7hdjF33?8+6J7-%WdzUr+wreFkoP(Gg6BQ$)K_xIMI-d&sB6D zSW^$(t`ml$XD71T3`6mq@^8_^vbpid$xUNn$ z7Igsw%Y?3hHL`U#{mb~So;6{0KG2{VbR*L0*tsY}#8LlO>#_d4IKzRX-mf-u^{w at e zc4BpTP`(<*8p|3fsBitA&9%*GN)yxkGZe>~A<>^?z6Y9M&5-O5oZo~(tQnI0Ddwl3 zgVqcw{`B(~P)_T at M1QjRVQ8gwVX{B%{2|oIx-iL~YJLg2Z(W$;&p3Y%rM9+6^e3Gk zfPS>LNcN|h--Q}mTO|2Y&d)&?tSwUf8RoB{64q;p{^avx&=%{pWPiH(Q)r;|T9QBY z{2KJCp2~VH#$RAQ40>xP8+pw@b)AR@>|?W<^SaK#2ee~IO;KGq;sNW}xMsaBeDDF|Si7dH?iulbb8J=f zuMWqC7~#>!7%fW?0=ywx?5po#jFKe_p}28A5n8mXAGC3*!*U}v>&>pGbfYxuo3AHy zBVXxlu4izgUg^83Z&=i{6^QE)y%Amy(^4QkKb_fT^+`K!%T_msPw9!U< zitfO>F*q at -H}11!2q8QXt6%7~qzhp<@vmR#vt$avI3cXBwDF9UWeBl5(W;Xe_)QSv zd%{=O(*GMT#P!6zu4UjiQAo%M&7zF;d143o&G=%Q^?7m!-Obrzi1m3=2ldVG#YgM? zx~oO36V?FSHjK8^wIqw4Pf4=)ZOLnK7Jc9C0_`Rc9 at Y}|W{a|m9gDto`?eE(XMMk^ zL*!4M>WRDMNFJF_V(N)|_=8>Ep|j%zEt} zIm$=TlbQO7ZaMNt-jjyYfbNF%5>JKWdy*))gVbu^&xN_UnoU!_gj9Pd?UJA;Pg94Nn&8tOmm| z9<@$d>ednAIFA-5w{`1-&o3U8PhfTOh-b`4{ga70YTJnPC#;)~i&i!fX-|YVEsN_m z5wItW8`z?}&A-$q{F~avE}MVpPdGP4ixD>e(w>NKx)%R!67fgvcqVfYQsT-vrmmp&+2(LXzBzW9xNqZmI~D6J4JD_KY(n+FV&HJW%iQGw`pu_v7XLxhR8&6WTfb0#<8=6Y;%4iXC zC#pA;mH3tM`h$mv+_af)m#s#xV6R~By$$3*Zo*7LgTQ#W=VmwBYcoUp at 1sE@rgl&S;uQ10m zCABxfX;%c}4U!X^VAvJ|iHE`F&T?=<@+;wo*#a$0~ zecTOjH^iNWyAkem+>LQJ!QB*hGu+K_x4_*JcPrejaks(U7I!<`?Qv(|?tr@^?oPNn zxFy^U+%j$_ZUuKH?kwCYZWnG1w~pJ5 zI~%uw+r(|*_Tcv7&cU6FI}f)HcVFE7aQDYO0QW%LgK!VVJp}hq+{17W$2|h~NZg}v zkH$R)_gLKHaF5450ry1QlWoR0QW-N zi*PT-y#)7C+{6^LU&4JE_Z8e%abLrI9rq2~H*w#>eH-^3+;?%`!+jt31KbaBKf?VO_Y>St zaX-Udi2FJ27r0;Ieueur?l-vK;(mwwJ?;;2yZZ68{QDSp?JgamcSd12i^$0k$9u)@@6w;ta5cpKnth&K&yBfRN&8{=() zw<+Fcc$?#Gfwv{zR(MFNc at ME8rFJN_ZW3WxP(j3f at e-S$I{vF1#9E9j_a2HeLg-iPysG!Ry7FgEtp% z9$p{bzIglL?T>c=-hp at r;T?>32;QN1hv6NLcLd&%ct_zKjdu**v3SSf9glYc-idf8 z;hl_k3f`%Br{SHBcLv^>cxU0Ajdu>-xp?Q{osV|`-i3G<;a!Y(3Eri6m*HKGcLm;+ zcvs%S;oXdP3*N1Gx8dE6cL&~`cz5C5jW-`}0p2}$_u}1$ zcR$_(cn{(|g!eGsBY2PEJ%;x<-V=CF;ys1;G~P3K&*D9Y_dMPUcrW6;g!eMuD|oNs zy at vNX-Wzyt;=P6UHr_jU at 8Z3O_debScpu_@g!eJtCwQOYeTKIX?{mB_ at V>#QO>FXS`qVe#QF@?{~aE at czX63-52dfAIdr`wxE*{$Ttz{2};5 z at rU6rfj=A{{1Nyg at kim0#vg+}7JnRm24BDz at g;m2U%^-LHGCc4z&G(Nd>h}vckw-Z zA3uw~B>qzPOXDwtzbyW8_{-z3fWIRCO86_|x8sk;pMXCRe-i#={3-aW;7`S06 at NAS z)$!NBUlV^V{I&7d!Cx1DJ^c0YH^AQze;WQq_|x$>#@_^gQ~b^FH^<)se at pzW@VCa_ z27g=p?eMq9pMk#v{*L%N;qQ#U3;wS7yW#JSzX$%F_S;_%-}GemDMX{04p#zlGm}--|y7e=hz!{674B@%O{uAO8US1Mv^S zKN$ZI{6p~%!#^DV2>c`QkHSA1{}}vZ at sGnl9{&XV6Y)>NKN`1j%8kN*JvgZK~OKaBqf z{-gMh;XjW51pbrwPvJj}{|x at K_|M@#kN*Pxi})|$zl{G1{;T+};lGam2L7A)Z{fd< z{|^4U`0wGrkN*Mwhxi}ie~kYL{-^k#;V;Dh9RCaaFY&*^{~G at r{BQBU!~Y)t2mBxL zf5QJ6{}=pU at qfer9siHeF@NI!h5tAHKluOR|3`KZ*}-Jn$POVpl}axM$c`mDj%U4iV1WLF})GTC;rl^7G$?1yA|23$!KIKd98JW9>aFrdZX#v4<5wy zU8Zfh<3`gr8a!x;wJWtsYu&+vhAh9rPJ;&xomMZF!oe!F($+m)`BGztT)rA`#4YQE zTy>{hqY}0g=FnDWr5O%hsCP{$*X!kKX+i+I>a_{AQftBv)#A3fR;$#gHG{!fyHHKW z8aboh(JC~#&$UKpuFYIGcu-re5G*#(9v^{Hu_p%QdT$JZ3CEzTQjI|7f4eY{ z)f?qV)|M-VT|#TcuoWz0SfM^Xq_Lq=svLr5p)&%*a)p=?4O&Xa3LTj%HR{2-bA>{s zSgN(!E4AKIvsEcaOBx?b^?qr0qtqMFMWV4G$p^}XgfS*0g=$ZJphB at x??Dg#|GD%aEMtT)o}^0{iYUatjvlgjgr z`m9nar;y7faAYCZDA&`~7IHzfE$Sr}N{v<}nBu^pghFSot2+#+&PsRchk(~;_1hN< zmEKA<*SpvhM-1@#xM0a0rABFhivmuwr`pQ(uQKH3YWm0Uj);-&JD+$2Ni;FU(83mTKii8$2d%Em~Qy3xQ8^mD+&)7+ad% zQ|TVS7*m=XIHXqY50lc|ATpb2P>t&-6-$l9wy&dFDR=e z%v8&z^B9*jE6x5%S4+9(0E^XnIS^I~{U at m_SI+e<@@%FnaAK=e8!$$|YRoFNx~sW< z*2u0>v6AlHxUNbe*!}^o8QT?PbmtnmLTAr_IEq+{JHYG?&Q!41 zrAGVzJzOKZE7f|dzcFwpyMyG>Qy8E-u2Bl&aA5DzjZ$~MUQFYQpnK|)0G4u%C<(@W z>p@@+OgE#NxsFmR?K-wusD#=6X{V_i}Yz;VtK{MFKR64S!HXt|5sW)Z?ssqDqWXMZr z*p}-^(|kvI?R2D9LPvT at bfgziN7$pBD)wJADxqFS$M^_DJu7L4 zN@}7KDppf at H65^;&aRqXLe;cuHSJmryLN?tYH9yks#HsrYN^Fqs2Hq#SgANZqUGM0 z*2^&s=O5DUd`v5?h_>Zs2b)rwwCXD3bB*rc?jK#Lwdab(M$)9xy=nqSR2r3L%I;}Y z7QtEq+j7lxVa at PTZB`;?E4g}G$uwHY^g#B`+w%Ejun0urd}=f+!iODK4nHrN-W3pOI zR*%UV5oybJrY`PGUEG=avorN)XX>)futz1?yENNHAnI9(&v8D at dLbARY-HGLX0Tu3 zRX09FBlEdNaBKBMjp5~bPj7_U@?ELTuGD5%I(An&t*+F1m=p8$v`0PdQBQlsARmM9 zI7A at oT2GDD(I%&eoH4BydAKzY*S1e7}xP*1#4=}OjGNxKKfG6pm2jRf>GV^9q$ z%LsJk63aosm4HerN|mDxY9v=}0#Z&Zv0N|K6VOQ3-rb#oMk4BN7E+KnVRkbfi?Gs2 zw1Pq^2F+?>pxKC*I6Nvz&Q{`>-emg2ds9yjpHrEY80t#~ zY0Ed$ZEmJZZl=p=rn{WprXgs{x6&T1RNhMEt<**ho!D#6is`(BmSg^qLRcxZ6~d1Lg<>+R5VRG-gkK1gULnk5g)~bQ zlC)Jw6Ivn3aD_CnMT{U$BN|*Jg|xnl80A6`hfQ&At-U=LGurd> za&h-CABA8CVj(RDBM|AOC1W8i z86yzxdI&~*diZspo_JS;$At5pI(7Eksl`~f at ZOUbE;w(ItWuwtTdk7F?zm;)?H4bS z)r%8z)!6v3TxU%4Ghg=n9fYvGZT9= z6Fb#JUh7I|!k?YYuUSZFGM{G3Px>_z{Z=yXxhYNNJ1^1eOZc6$V%k+t`pt=GTcI9C zNuw1^FTJ%2>8%yXIx3BX6>V8PEpZCz1y)F}t3rB##UQm5?Q1W(wvd zpf6D#TkkG4a=|07m2?`F>+WuL*IRLGXm}BZzHB5R-$>4CBRQhcg;t4aIpK$gyAhYy zA#E%4r0(xY-QSaXuP1eEPr3~~$(0s at wnA_CXKpGB>+eFC^1_d`ZN;#LDb5Q2q=if| zEnA9d*-}hPn__x~L(o>NCv`+Ijg4X&8^yGcDW;)OOyi)K#z8UN{s=UK2SqX6{t&bk z(2GR7w)t1t4xFLvRw3L3kjX+1G7K2$q;ShoF zo{vCyEk_`nL at E6STuQ$ICm^5n3f35cA%RXfZYfnyzutymc%xF86|<_9d<>%DO6e?1 z(YTcu*4Bnz6k?u%-}%UtqiP zK}8%l^+IQ*(bFhbO0{NtG5%JmvUOGM4;L##vtkug06bP ziHxO{P6*n{Vf|35`#+t3-Xg1Ab6c|~btNMnbnGYd=P#0#yJpXsnu}$h+;vSV8y(6DmD#}s z9Eld*aAYbPn{=Bvbz&tE21VI|0ps;`Ow9GpO=NK~*Dp(oxmdQ~u!VP at HejB!CWbGc zew#s|*Dp&7y?&dCY-}oqSn^g6Ca6?CR0jFnuryBLk$tlC>cij!95TOCr_L>F%||1 zJtz?)X1-pH)kYM;A6gRAg-UB)ghmE;N05ti0~)j9M&O%jY?zLEqbGsoz_-m9cGg?r zS^_w#QY+_L!3`G=G_zjLHTz=8ta@!;Z>bs&OEotum-LQ*p@{~nmFC3E5slKUYAzlr zs5a-u;&`_r)Kje_s4tO at Xx00gLCqWCo>s0ewclGQmf}&{D#bWUMl^74M9VRaqACL6 zUPqFk%#0Xef{#F0eTAT{l3pYsXsdK3<^nn*%-t#Ot`<@pTTLs(N?JU|qTrIQBndpE zZIxPLu$D$+IC(?9|5WRB?7Xx!LJ-!>gf^)b^F6wy&huK*XpNV at 9N& z-V_mt{2pHaZ(RBIac|uG#+7d#5w)WScvm@}o040lW74X*RO!uQ1}F&wl^U^5TP6J_ zQ%NhhN?N8>(r+ at Aw3LfL_(}^wTP6J_Q%O&82u6n$Q}}~_J!%dMGGR!^=7OrI85DYr zAhcsaHKHSOwL-m?@@f$!S8uj*i(n~{){`EMQeR(cz7f$(u34y8EA8Du?Np0J<6_nT z&ahl}M1$PZswA9NL`UU%qaQs}y?9N-^SMT%myc(o#|vl=1l3Zjl?(sjpcbpBu_%=+ z66g_J)MbDV)JT*{1_<=U2Ux7nVj~Rflgw at L;ReoavC#(3?SHLmz}yyJRN{-+XCw20 z%X(6m<>TEPoiEj*e;7&GwN$qeq{oyQhs20{C9sehtt5)|YQ3C>L%!b6?8_x1k+1ia zYKehdwV8y>m|V40Z_gEj&`ZKFXb)&MdrHMtCHz;1*m7TDImiKpG$QlOI2iIl`CP0t z)2)vqY*ZoqfxAB-3UQxIAs7CKMNqsi@=qZiV at x5})m_g=_gu`+M^q~08u at zQ+DbV% z5|vy$sGM@!7iXuf_Ea9*NZE^VhZPbh2G?2mFBJ*1lrqDKrp$N`M at P)QTqB)g?3NM1 zTc?yBkuc at NcX+ygg=AX_^=2vPoG_aSvr+2mKhK3m%B;8Qwd5GjikTF8YNga-yoo~i zuLte*(9g|QBk^#^Tbwm|@n-nDZ#2VFEgd%rkdYmwMsV9F%#L_`0%p3Bj;=&6cr4ZW zV)>|!YCZlxnph=v!-$T0xtw~hBOY*EaQO#0r%(#q5KG2JoB at n+F>a6eu}aKY#2D65 zh*uR zN2+naQ7six&sIx|SjkMQg=G9nZ at rPGmc&oPtMy{yv1*bEsy&55YCpbxMg?!;@E?H^ zZdYQjD;H#>-jo>!N2V({nz`^?^@qr~h&7OtNgC~uB-zrKwTLsUD|Xw6uJE6|QeM1Z zF)Zfl?O`sc6w at 3gM9jr`Vt=zelE#Yt%tgFmy~!p8)n>Ebzg?wd3c*&TnKHtOIEmu$ zzkB+-q-yo_5N9IT9^}7V${H8326AGh(m<9Hv%-_Qn5rJzE44?G#q5SZmP9kE<$@Sl zZjS}AQp_5_8P=VwwYw4odA}pO;}{>_T}i{SJGlk|POIKO$0XwiZ=)at`m;=Tk}11` z7t11(eaX5Txip7#C$(22SMEv2X(Y>T1l3c2>P?m}HcCOh3rT{Yp!^|-}}$Iq0gz) zmBV>Xg{dyA&L|puvWUD|#A%#4nJLvFp7(||XG>h9)_*>at-d_P*6>=14&geHEhY-5%%f|E3G0fbC^{w8Jl*+J*T#ttODDrA{-3u zIeSZrXko+R1fyYgDh`FtjaOWk*fLgUJoGYR0^M?J`<~ z)36R>b$wOTM&G*TYh${~T(D>!J6oulJ7FBv_I+jQc4gL&UH6=sk-Ew{fML_>Kie+c z>1xbbWk>9QWp06d9u?ij{eRG?g;nT&8ES~v72^|-4 at 8$ZHkQD4vJ=U zP`86Jb~`9w%)$@2);QOD?Bl7Kf*RU46uAP8tb1tPY(Z$63=QSx(KI)5IdSX26SodL zar+Dtx6d$f3&In(y#Pi|+#0TCa3*Tv_MRthRd?c6e!-ZvpNU%@1|uhK^vF(q at kVe7!mkN3%K)*JiUiZw3CM zypB>Yae8TC=ZPz8^s!uaS>=o zot-kuXQsd_v&0oZP8P1N-7%7hTaDL at u5`C74 at OSh&f~=GGfvzVFc=U at T@vG%Ti?v8%0Md1lb7&mbpm+a+9j7%yQ z3Q9Y{YH2ceQO{k}bLVO9!p?2`g27Ur7U;C*TFqpdIfUP9Xig at sS0%19C9cD125Y8? z>x-JvwX2Ubv7$~~Uj(BQL|07h`P0;Or_}YG)b$kYg*5}{iaCQ1R;E3pC_#);YU(gdGckiZ7_&?dPNohtQg_%qbr7K$C~Yu0FAhag2Og;d z7%(y&i35toU|lCmT_;OjM@(IBOI>G8P1hV~#(*R^nYvDtx`XUsjMh%wfu+=)WKZ2m zb}$YjQk at y6!BeNxQ>W#@$kai5>JUA37 at s<5PaUFzX<-8r0ioMdtR<(ecY~2Bx^C)D zf28iLN9wjpQg`SBjBX~ot)eNbckKZ`kD39ucrx6N(!~)c2(Y at _nxC zn}tPGd7{(syOl6PT%6U!%X}?gcqy}xjmzG?hVaVAUU)*>x4+x+60UmsCs$tk6ct-C z`BF&pqb~do#YqpdbQmT)L29zGuFrZo*Qs!ElKS^He(B3Jto*E9jxa$PP$?4d5*nuZFXZGd|t0O%z|oUeyi35VKdE(FfS{=FLZOPY5Sw)^jb6w zvC!ewf_bq|yrIQS0nh02i0?0Ucm_I0XZMR=xH8bH*Y}G_Cr68Y1CzH=QZ6XR#9V53$dr7 z%JU@^eHvF0<4+Q%c@}vQZlLPCjpbU)Gw4&V%-n~4)a}JZ&ue?qKPisOWsPU0yUWroE!_z{(7-S3 z{RVCK*!FIqa=n*(qw+L%l~u at EXb}0h&c6D7t>#JJPvkHQlBlJ?(TS89`Zi z(1}=eqNtz*>_RdnO_hd^Pm|&*pAXEm(h#sbYJQZAg<92yRm+aPSL}M zUhfNfIev1#T_i=&T}A(g+}_vZ_9uGf%nwJsV;3(~c`=Ww${)F`(PwGo zx4|r{ibcfT#q+nJ#hxcPS6(`CmY3noGr;?C*~8D^7ha at 168*ff1qMCjB{M60 z#d$cwfFHo>ZsLVZYXVPnD?2l&MP5T~MZ?7udd~|Pmr=H4Z*4@$vQ~@|?)c(&(ecRdw1=bPqqrL{o797lXT_euJ_rjB-Qa4j zTBu8|#f3MzAmGW8XX&;FF&mXlc?R*2?a;^%6GH|2Hut(dHrJ%W_~a|AEh{LOyeu`r z)&NdFYn#}uk3HL<&Bls{FvQL(jd>!$Q%Wy$EZyP%jj?ukfLk8+%{4In>xHp5bhT(Q znE4Yeh<0P1(PqAhF(@L2-!jjhA={$+CY~c!w6UkbM-k7}n!a(`D2jOs%Plb*`8FQ=Th{dK=2`8eiRtta>zl=} zUvh`*&itM{ig*2BhTSZa_n8yV)tk%x(=xmTl{CFQN6!Kz{1XB(O4 zb929ua)uS;1AS43zaqmZwA?e=I$1B(S<3URD)!e4y1D!s+Q1GO~2t%Ap%IX)$OeUtj9%oneXxyLR=huTbM+i_8Uh#QQ{9-7Wk9LZR7S8w;w*8_%NtzLsAf&*El|xG at QfCGcT)Ji+~6O at N6%WDigBs0+Jt?o9|-miW$D<^lhy z+F6Ean#{cE>S}Cr!)ZffhgW8HdzvZP zyV7&&6SYZJb}sW`3zc zY`N&QOV94y!f}_%pWdyf{<_&lio1f!CAZ(7w%MIUWnTG(!>`MdrL63;h&FIC%xmrS zH22mH+E{?`%ouj2`OLSTSc2cJaVJ>vRq-6m&w9=iiyc1{u4iJ~+t1o8LdVILB}@H? zCCM_{Y^1ojY{^|lzWz7NzG>bWhMD8uw0P)OVw)MiO|tzHk~5qHM at L~D-}=q15dO5x z%<}f{Wt^t3R=o9KzumIjh#S+wzO~5gbqI4)V`DOC_fPD{x5cYjvBUF-jNgRQsbB9| zI9oQV+F3aFCuJEdsimEqEb)FCv zJ3ck5CBS%=7RG3(xY$563fquWchQqM;8* z#*OR5ybS}^1l~&JMt+=aQEzu{%Cn1szw9{0O=XO>o}D`lmsaK5I5^ov8L%@gr?}>@ z^uuKSrXPnXJTq-;s+V^Coez6x#)CkvuLSGAOucPBUmEh@^Kw2ib53u%G9BeSwvT&x z9kI^QZQ-G+zK+f_XQpvg>4n9S7m)RIR4s4g9iHlqr{&3nmU)H+yLY`-MyK`%5!}mY zr6mb2-K%AHo#t#U;fES-iR~w?ND{W5Z at tz4Y25cZQrqtK*OgS{{?6#0ZH$-`uJ%=BrDIOyS6`KUwGA-jBvy&#|}5x?SYAG9*|u z at lE6P!iTF3Y?b(%eI;&2WV6WYfbC^_oY*-J`#duIrMxYc?k*c3*x-yKZ$NR#Os^AQ z(QHYIRllN(1HpAsw6s^uygfuM8bp3bR;d*idB?+u^)jrE`vsbZSr(4G?F(WBjvs|A zYxsbjJOZ%0lr0MmD}0xwbENTXqVhTe$aiheHP%CQl538r_WpvTx9G| zuS-~Jy%6_&W`0+Mcqj5rVun|*dDqIRry@%nVelY;hi>1m4%TU1e?GO%l6`2}US85X zT|4u^t=73W%Y7=fjkQNl>#{SBiltTWjj|f&-dZpx&njY+C;kwxrdTjt-Z5g2v#J{U z%4DO&Z4Ca1i?x8F;m?-P=`k+*_O4WM}2i0XC~q6#4^jeQ915z%_}Ysc#lIZvu1h z{hDl(MYGTYGEVy^uNJJ&s?e+T+1%g!-hYr`4#e>ajVcM_C9SwIk0(pV2Hgj2$)J3$L()udqjne&b< z$6Zidq?Nj(zNtIvo4V7xsXOzVx}(0SyR;CDEjy0(X7$1FEVKpJBJBg*sZR1 zv~TIGG&DVKXfHH0&aAsbwapq2!XYMdDm=;b6>#bDGmPLuk&_4|6LyoVoMInfn<_{V4`8GD|pQmtW&(Z-!&JgAu0;Wgo-W-e0+)sA22}!1aF3v&#@*&ARwoS?tlG3VEey at 9x6GuA`!Nl*Im*iwN(Xt-1S}ihwwRk>{gUEc)nv44GB9t-XG^^vPKsz0rY67by{mku-gdBpPXD+G zylM_Jn$UY!CBwa|tZQ5EQVffJXPTo&o9h=d6AVWRQ*5P#wk+LZVf)S|PfW5bUzFHz z(-C!xy%SlsccKw#KGOnl(%G4rEUZUEwk=$Y zYlEn&9V^(lH}$;=cJG8~QA7fFXIz*#HU~x2FX9O%941npyH4tO*p)?tyfnkFJ>p_C zPF+Od!q(@0MMb)}8>PWWy at 3}Y+loPVB;ViFf at wM3-RXeob0?tlq+gh)#aN12?w`)nA z;nNYW7IUt1z>4-eiTY)lPja^UZGvSIR+Uw_8|8EyC6lnOSZG*G+9T_?!j6p{h?q}e zF$j~s(p5DJxqIxB-bUxA8hi3id6~%)rg&bpVgA!ym~K7C6%F&IhF8M at QZ!lFyQ*>M zdeY8LV(V!w9QNz(cZwa~2U#_ka_KJBIcMNJvoT!{7xvV+blV$uXJp%}%_ZQ;L^vB- zeUenRA@{CGs=X^r?sdSb!=`S}g$j8-*&iFty}^EcHL*g)27?p>mcx5C{vG zwN>a_%j>6t4a;y){{w6}6T; z%nr`Pu*0L-$%0z8ccK=asWatXXq`IFx-L$`QpvKfe5-Eh?Fh4WcnS+%;& z;rEHOcIr05&g4Sd>fJEyT2-?G%VB24kKyP{|+sLQry=lsms2zpu0rdZS}9>48qV9L0bV9JOZnA$|%v2H$^#I}ZvfNRA{ zj1^&|EbA=JbNP+yakAd^(R8gl=Fw!EdR;qQTib%OWYHN|9n$WOqk=6a+fP=yj zECkltXsgSmUXqyR=$teoDy1Pc1hK;+f%iD{Jh+HM8k)kM|RZ(Js8Cnn3-t` z2v=E;(lxkPV>YiEH5tWACN_>dyB at N}V~VZui4BI1S)*-K*{Q%9xEkqjcbl_n!Q&Ts zrf%WdyW-3I*9cBUQ6P-bx<}6$n(_qEd>nN&5)@fIqz7S>#nl08_K8h=Fk>rdlGl#7 zoLJZ%ME$YxbZ}sexz#~jkEb>8OBet_g8}Tf8e4t1IvC?#7aQ+5vQ at V}NWx}T(PmfG z4BpK_5=|zN*CH%vT13xYYzq#YZ8Au#(%3MQm=10yF`4D&a&^p(qO1oG&rDn`9m3&Y z8+(ykCAP+FGt_WJm{s^IgW9-f@!r*b4;%0lu(Olb9`i-x at x)@u<09;g9JUXz6mH78 zD5A3N^f)gN*$80%Mt%hSsP45uSJ9 z$VD?tY}2hVUuUE}jFWy;PONjoI-S|8m4cNeo#9b8^N#D at HXKK3-M!gS^xaU=uDUP4 zW1Z^iaGbkR at r%6^&Y^qVaLmqnuCq2wa(#wIcZ{K1H^C`qn;GU at W|*DFR?Q5H(4TA# zi#V-w!-4Y5f->7->}_NVv at zlNl;?+F^ z+#$O|*XIv&3~9=SjVIIHXq2W_294fx*=I%Wa#1)v%SCA#nqQQ4j}0eTp3L%zjd*MC zipiJX1d5s`$*2 zws-M+VW`t0PwO6e+mSJUQyz at BdU+3BACbi(Ju_PJ)Va(~O%IQ(LG59AFmi^qCp>d0 z#-&#)qqwqze|U2aRk1>@kp at dvp3`L82c>1pVwbIh#^#NDPWYcV$FoYk!zOSY<(G* zo_F!sB+Oxx(iUfBSnISkhM}aiix|514U-ZRKD)Nb!BS^ofM2pOAn<0H6I>xMiLm>v zy$omhypLZp#Qn?~F>Jz5r;ZKnip1(9*}K~EIt!DeJFDTkJz-_v7#f?}i7j8Jaaq3) zBfH$TZX9-QbJ(hX^qirC`HB0%aBbPw5~q(CM)H2yY$t3oteo%#r<#bZ2ur~>bsidZ zESm*S1Gy7~b2~BGE-(#b$=(%CbedW6gOEj?qvwQXupi=>>~idc%i4hN2Ao-w6TGgX zvR3ABx at KP2j-_6!B~7nIh8v5H<2+86Nnh86E`93~w!oSgY7I&W(OJpGRek z-{=`^9vy;F#QAEjTR at xj#iECYEms*$I zP3x|4f32Z-ogI5uO?<>naidGonYal{nzLzarw{9CzIRpavim}CcgD5%xZi9Zumc}A z!gQ_f6=~k=Os%lPT2ag<{W_JhS?xQNy1lwp=IVJ?ifxo+ZUeAUSG!EMw7XV*n<-Xw zS-J6i!qiKO{RdxinhEA)^}^3a7N*#@afq at SM&ly3#yP($^Ro7bm5QOA$sNu at eC}h6 z3v^QJpR&EH_O9A5)#h{NNjp`q>$F$MZB=@n+Zk at 1YUU@Ir=T_O)Ev8b7`tlU%%VO% zGZnkG#s=OI^n=p%AT8-)<)xTen>@pTSR0$(?{mr at 8*7o(;cK&u4STz~v(64S!mLX- z1xwi7Dcm}=4r@;X=zH<&DNzm zu4MJ}c`akbxukJ2>|G?``NKM3Rh!})87sA_F~*Ip0LcPov*|U5I3b(Od{Sf5+TMxA zVGLNk%QJIJWQ;y_Zn11pA2MibSAEJrr>R9SINYIxyqMIQDsQ%eIMv2sws`e6Pm^j< zt91CS9mcO#?#}NDZo06+;I;DWACvuo)p{E|N=H$@S@?!qZ{NC{9Ln8x?HWEPQqOd> zW65UJlE!A-%yG3)r>bFQYwyH9$!TT-*vUG(J-dB`J2Y at +*ky9QG)6b~PAm(wnO%!I z6KiH4$`=mfIioHx{Ia97>xOW?um?(Y((Kc7>K3$u&eY=VcD~S=E)yI?G8KRWAp2xz z=&+u&GaK9TP4!BqGo;q7)9wJnrPussP2nIL&bY3^V;2mXIEMPy33kNQyS2W5iL6N zb6k?miozOx1?8e at Yex}VMAgo+M&}h)A+ at 53%e-)racaeqqABWPA1ZPSK&v<@9lC-o zhC_?4g+8I`xmYl!G0T;9yx_} z*Ry$!xUlHS+Vh0tO}y-?O|wH-)wV$}xS9 at Lz`Cj%HeXEY2IE{hhfy4GcIM7bVZRM< z!gK91Io0kur`&t2al#q6%CaT{{RqaOiKh&`UF5Y=f4#=qEBvYk$PnO)rnebMXXbWpIK1sQtIV>2?sb64c+x5DQV_q*-6q&Nu9s=-6zqC5 zPMa$&=nRh6p>h9)%i-P?&arKM$5m(H_GP(x+}W8j#d!@cOKdgQdqf*$#?#=YU#zeN z=`5s@&0pU_Dl at i_in=UW?)eOH9hS)%hjI>+GmbH0o5$9Y-NtE;hPjvaOqkac<}g^N zbO2FS`NV?2CJrI93Ya%NwQ5FLwG?sgt&VKuJZ1(U7L&;W_i9;h`Zs7+nVoRFX at 7RrI-WhIbCr=)DPqU0Rq76^ylziA zFQL2TQFHyZQ+?}nP4nV!PV8*`VRg}rTOvi}j at T#Ot~u%1+uNEM4|aCkFbyBu-M~;D|F$!YaKIMRPycA>}i7!8)kRf3g`yA z6q{XqSy)t%wNvHTtw&;e4IX8PvG3;i>1RB1_?h=sU7_yj(+=6^qc2%aeab;SKOS3I zuW93M6I+m~?>zR`*Tv3(Z=B{G;5n_`bZbT0w1j-)i at RUVVjZ5Zwoce}#MjPIddx*2 zJ#f?_sl=AKwe@>&lHDiCh0RkRtxvoukGdt~q+F~zl-pxH;v;Pyw|ViDkxz11eXO-( zRqZ32Z8N$STl{q_^cQ>ibX*E+uc`F8Gymdd$5YZ;9`D*8znXgDQtzX=QbSzxcJ$2( zcKxZO+U<9jOR7HppZli%z_l0anmPLm=D)wvxHk5X zXwP1)w7 at m@q~r3|n`(wy&KsGj*f8?oh~$`VTG)FX!Gho)I(fP=Iu%C~L(+$G5<*5j z#r{%pbF2)}@9jEaRF>W;Sfa?ASCQv*&Qt73!ja?gLcf|c27+|P-iFEFa;bZz_cMS$ zE5XC##L7x at 9Q7ojh(hJ`d0YyT5iUv z!~H>Z`wwd^GwT(X`g%B zL8-Qx@&cLM{qjBThn3AVbT5o)ycbG}l4;j_6IcFlTJg;%-+70A8V0XDZU46Bz3el; z8e_|G-sp$ZHW!Z^d;6NEmmINb{h_Z*Zr|>ZUwYvE`cO5e3ng-lgMaTjwk7l3LfJ?DKl*zubyXtDh^g(a5RUHC at N}UFWmPUEyWn z7OCZ*Pl|iF-x^<>dNL~9 at _51Hz3Y?@TJOHK!b8G0FYbx$KPrk^-+67%)m49T+VSO{ z_PS=jO9!(&?zdY;%6w)`UD>uT at Aod@G(*qfHy%Gmwv<>HOlqe2)UGdn9sH)(w*wZbkdfOekGthA0A0}1aBJ$4m#+bd6t-|U;?Y`|mNAo$x;=VRgM>xhqw z?lxOEl-LaH at 6|Ul5l{6<9#K@>oLZtF^YyQEq1?_shuqV*s^9E0S`d*WHR7-$ecNM0 zVXxs=yk8C;+VGBbY~NDt^;*Tg{)&;s3Qggb{atwpeu;;Ze{X19C*-oD{a=T?(fE^I zpVvo>nv{oktjk&#nygw9_3!GRt78>>n0b#M_L#J6IVd3UZ>6o?fLPv#nm5-RvsQgk z$~x)wGo2B;OKWPg$%gehd(7^s`iW)Kn%rC7uYWS4`GifJcCX3pr_WuLkF9uX*(ksJ zgMm$$VrIHo+?P=25Y6pB7il$|7f>~Ayxi-Q6F+bx?^@lecGbuYDfTCXEKBk(n+Rx` z+jJgTZWSKNpR4@%_k)TU71Q|oeAm`p{RRfsVec&*vbgIvF!FAuI#=0MkDg!LRp+_v z*Um1jsVvV=z8^O9Mid^nt at rluvBi6jTXQkzKX)=8VXu7Vo{=ffU(ukoGDXKpmv?%5 zuGQy(o$v3a)rYTgbv?#Pw+LH$sySlxeX(a-^Rcj{R>2Q#3k3GhX+2XsTH79{op^bR z_;}Cv8#>;(&hpl)a%YsH!{4OGdn8YX_7<)v)IGd at _qzCfg_XxPI3F{zKV0Hc_i(y< znb*g}ZG0JFCm#ND^?QOwr%%>G#i)kDuc6bYBb)b&dwtt?)8(mNh2x|M!yoJy zrP&H-%W0j6jbKFlcfd7I&hW$1FZZm%TFOoLGGC1KNSI3cg&@A{+`2~K_b-|Tw3MBRh}%cB`@I#ufv`xO=6 z*t)E+{`?^Ksdeg8t%l|^X;PA34GZ6G{}$)bV1Ic1D6=aT@#}{s2ylwx^y8}+? z6&kK3qsiu4i8`^aQk6e`*4prB(0 at mwRihqMcs_g-pLihopOX)i)21&aI-GhqWb)Lh z+onJBOxy=)WpUpX at 0%qoXAC;`YOj@(Qu%vAFzZ{_r_cL6}s}j z_;}=XqSJ1%szrQ<`u|;dyIpwey_at`yJqsu$-0$%TW3Zt({Ov{(FOev)Ne-guGCD) zNLqQa-8Hd>?dj>MDK9YnrTA6dp7x)6i`t{t*!VhgizxlGw?Qp?alf)#+=q6DtXTr% z&DpPf$IbZS%-7oG7bF8HL6_q zL at 2H;Y!~d&tydSR&3F6Q`$jSPx$BdfpidJAehDf|bnMS?9zHc!rg^PXp!MS)J%6RO z2{>wxr8Ccd>1giXRLOWsdu%ZDiTt+rLEk#{qZaPPpD&s@ zsw8T7zxU{EklNxg{Y}xs@(hoAGlY3*ZlIzRD5Cl>;~)1yOm7}+lNjskDtB7 zYD#|Yi@%SDeK{^2_j_w__-fOnR}YGcPrpC3-fQpC%(J3D8wF2CC?@5GuT~w-HIuTk z`TFzr-g-Ba*2Mmx`&y813eyA4E@~Ia#1Bg4}0e~efjv}Y}%0nulighL!Q2m?z?kH z>%(71-rH6 at 4;S!RnQ`d#Wbumvs}pVol}r28DvwKSA9aj7UGDV1`@73!-7IhK&bzp3 zT`lv=_kZJE3SP^;6tDRmFUkmeB4pc9bxPvxnWZUayX&9iiRH4S*QD6iK5IDn(O%@) z at VhLf^!WJLCwcpV^@BBrJ%cm8*GbLnKN7+=-BrIa?^VpZ)RXP`IlBKjWOc67_G;2! zeOxYVso&tgLGPy&Kc9AR2$sm`osd1`_*wf=o=(rIfAsl#nwXW&D#m>|+8I5$iJ?D^ zS9*LF+5Btt=YMgXrvDX&`&3<)5A!rqob)-6>REX7O^saFho5h10(+Z2?Kyki$w{;- z+~aJqSO)w3$!0!t+xMPEdt2NeIiwz1e7S0v$(W7H3eW%`c{e?!EtY?9z{U z*Hlv1G;P at voHz2{39rM8#|}Pv)tt0z&wSOUguQVeuJz|cJ_w9 at U>&5~{Fn6)u};(R zyi(nfxXlYSiJ)tLZVat$URX%R^w-j} zXKR=29kabuIMU!HJzaIE^+?XZ!9KkpuG?$ABpwYmGMzTC>HD?JF+1bOWp=|IpF;+F ztPYpI^p?4zX`s2p-8oQi!~P{Th8Hg`5qZ=wzmq?EOM9mL*9EsylU}{{y~Oj^)`(Mv zdakopY<=CCFA=Z)=+o8hQ6*EupIq0*-zeE~?C_(e!$wwuO_rAFs~R^dsy)`ZVr;LI zX0Z6;lKQ((CBKxfUU={6+bY2?YhQmmd7wO9@#!fm at 0LTPiQLE;OQ(ri|0t}nd-0ZQiN+jL?Hybt z6PAzb9=3MqnpVF37 at H9H;jP~E!YgZ at 4BGB?$iG>&a!&1=@dtbK#vj=z3HjW3>Yx`f zpdMY-^;z(ZY~E at 0;%u*}*8|%h z{g0HJUA!LTbqQZt+r+aTV-muHs{oR zz2tpjpW at RiRhzzP?yNgy at ObpzI>}UD%9XRNm9>$dtcxlKz>= zK54K|zU_J+%cbEsE1-Rq?f>>C zW*)t*pYo(#>zM}AYHV~>LFfa;!aBPJDLalH(Rx(qhGl6QYrPknz}Z1?rpis8G5rLCC{ucbMz9lLt`OiGtxLS4R0 z`=uw*W(ybgEGmjklxUyls9aGw{p#CdCR26Ppjz?K$>^{9GUTGf(%)95Jn<>263dF6 z?rj+IFiZ3P$>m|WK0YtUB0=f1{&OugPqUjD1H*!hvS-D{W+_)Q at BTO&chdgTvuCG{ zb~o{^?^d0=+HsHa567Vem4XebwSrY^&g-a|8z&Ar9dtV2lM?au#6vT+=R?U_ z=Z=lUeD&TLU;X}@MrON)grUS<-7L-Lr(7Ra8oADNXBD2bwy=!Pcz9Y|i}AoLK(GUJM+g`Icz>Vk98c81Cs z`B_XSzi&6)`%5*(yX{`+84gUg4!t`v-ENxE^Wv^U)J2tLS;rfi9=Yi9G*P>FI5~JYd2h1W`Q-3tM@@HV=_tqF z-evaXxYBGr=XsiL2XCGIsQ6qe(uLKp`QU`9YP(5}<;ge;{ldYCkDXo;Evs}Yd!+5x z=hJ57GQYM5>wkB+n+oUm9gB-JV3 at Z%wS<+e(jQ!?R=qGIKUCb}=ZM|yhcVTkDmMQt zWuECaD|ogu<5#TJ*!wWXNQc)vi;+W-76yL(Lw0*lsvYlteyIO>^C#ubPf_A_xu$B& z2Qk&}lrt>7+Z^qd_Sorr*!Mrk>l{hsNM+b$S-5W35f!9G&m^%=GtPN%mUsM)j|> z-|w4w&h|UJ^U$_T%sUdF8}C%Dp|_W3w#NSi)cND3yudSX|_$T-`6XI|vkKh~{=?#*5;)4W>mM$KG?j&yH%aI~!xv6gKoV<+(8u~8Q=^Wt5rP-hGGYq!UZL4~$r^^?5uD8x@`g3Y))r)N$ z^;jjzHPgj)1ML1#iH5>@FP6*!eWSRd&<$=?+)Q$p2Uqf$n0f7g2Lg#2%BqUv*Ex=U at xhky2-G9z+qd^mrkucFr6jx!Zi zZ|^aDG5dBt`(0GM|4`ScHeD*7l^mbA at 0G^9Es-d*#mH#otB|502h9eR3=eIM6F~_Q ziP{@_0{<;fAP3F9qYj(D1YYgY&gYmEr!JB=5|27)%ZWUpiPAGW&qv`w6 at mERW zTgzusicSpI#xPmG&zk#vdz8M<^K97}aig*goby#2CF+w4F0OY`HGH??+qvh3Q|~eg-+0FT&{@9qhe}K5NEc;rnyqeC at diD%NmGj`s7oczZPJ>e4V^8NcxRX1)C7k29&lE`q?w~Jn* z+BIxrK| zbf2_ at w1ArQnD>&jMAk27^F;6Zw+m&SEskY2HtM)t7|R=r)@~Yp5zlZsJ8`N(C35V^ z&Z&g#mWcu at -}1{!wFlkV!M^hBen+=sul0KN-;!dndl~f;RZly6>`pB>(_>{nbF7kwr50{EGrL=fgIM0}S2-5$Za&}Dv|FuS;od8jwHq17NxfIp=sX~F+;FYk*Aq8>Rc;Uw>MVZGv!rUB z^6|(HIXBk#>ctn_8QScvVdsuEJYUi}=k~4teLf_-w%BA%pK?pF)4_y#lMSajv_|~i zN2xp8rOTiC(b2f^fRezujqkcnUH5YNpqQI_ee~^`(%_$3&QZaKL^=#b6V5DCdv$kI z$gh6IXyC(ECCZcmxGbiw at jYqcqt_-GpEXwc7h+nqjtd19U2y)XFk<6vj2+}6hv!3}a= zE&sh6jjmgr;gMIk at QjZ=pOyIIN46SPAHK%6mtP)@w-~-Auu7 at nUEKbtgZCK9_lr_4 z6yARIzjym{4-du^$9DGpkMoJUvu$0$ivO(Q*UC9;I2ZY7r~1h`G9IrBYeWRYZFw5D zDCFt&^+oRgH=(5>^T2tD{r7l^ZcA0Y@`&6&A$8FCeoAg_$kZOU=uQP`ztoEsqaCHD z%iNDvp3ECRSkW6kU)?1u^kaT>hS-ka*{rYCY0kGQ7lmaS#jS3=CHA4sSmV^AJn5qN zH_d_vJMS)iOaJTG>H6mP?mo|i_7f^jx|^&kelB;Fb9$4@|5U#rJN&)Okm4SVUuIv~ z4ch0U7X|QtI?8Q%&|sMaNwqqS|EBJKC-!?B{R>QOOeFDep1NSXn z!bmi1NauaN^QiT;x;e?B=Wg!T|8%CaQym5^?NHS-E$Vy{Y<*HUiWZPNX8N^ zTfc32F)yA)|LSG#%et`W`~sDdEsb-f9B#diGkp56IWbZD;dGyqg5T^ow2S+ii}dzXHVEqlINC^>)lZ-J9^(WC0eqcKYc zdQWtQReXIuN1U%NLPh%d8MRf#5qJD--%Mzxg*r*qi+q>3;xWDJ)9P3Ca%Z3LyJ}q; zO?1%t at P1YE-^#srtY0tg4G^}-346TfXuD}st at V+bpNGm0?>HE{!zuQ)dbSrc(d*i& zpOK9nqjM~(hg|+TS0>h9=alY$dR_dp>h3_ zPA7T4tiJnnzX_T=<3PyfTr>8~rY zyLybW8E>xl?m5}dUFytBhdQgwM)`Z#||bZZT6gy{vv7Fp(>L`(3r?iDeA!z}m^&rMHW# zAGK}wbLGo!?`dz#VhIK|4n+kvj*NV26K3hFYXs_zjJ$7K)v6{MHi`R5m!Wy!g=MWKEkp>)f6}Z$CqQ?^z6)1^U;Rk%Eb at tBrUq zzV##pr3{X&Ew-GTY-n?0owFG{)a0Yj-IffTg(IM-yF4X4Q7ffuzvBaVkF6S_Q;k`>If#Y zBza?oG=%5*MFd at EM&0Rf6n#GtJIBM%p;(wP(zbz-QXI&P;mu>M35*%c6tsI+z1n*z z!?CzxQb)wDxH_TjCQDyB|1vYI?WAA-oQ!Wh+XCwcM;;VAPfk8C7RI$dnN$xenPSS}IB6zrTFY7KUHs;^2VU?pnUlW z-m6}7islZdx6PJi$k=cX_qPSf4)7cD47aqIULEJPI-k$TS=J>UC=$dvctWV0FEBE| zW`T{saB*9btjs*aIVX>tkSgC*JSuC&ryX!^L(YP(xVBDN8Gb|VlP-fMS0m>X at eDs{ zvy`ppWzNYpoDeJ*D(1f`5mX&`PJcqOTq)3g&g9`ipR4xs3b}?Kwkck<;IrqM+&-u* zOOJRbj}JP_G6lvq`sqxFmiGjy1)WgGx+?uh9!!vHu`BytS)!s^`AT3SS)j%WjR zT)&Ymo3pe_xmZQkUZ_xbIHXv6BYWk9Vz~^T|D0i^VrCG_X;56&UcfxCN%EXPS9F`& zrb21f;&Sakx1e(x6T;<8-d5hpk+!q4{tM2 at bR8a?ebtSZ!82LWma&PwdP3r=8y{oV zr1 at aBY^xAkxa(|jYtT8y1m9H|9?sn1k~Zc>w(f-E)gpd2ZMTn-^7W!Fl$Cl zRHcTa=sxc|=jw*JQ$-5G=h?Sj&$Dz7c)j{x*(Y;Wo1_J;7Imo+3l*xdG(H|Et?-2R z%%#^_-{*yv+(}iKRkL1{=Y at I4|7x^CYd2~e-xhvh(ji!*BI+3E8kHmT{eWmTuaI$* z at D1Z8>EHho_2M!Je=W7iLdjjJM#H#i>F at 2Lj^|r0zP8=ywyh)mPPV+ec1>ecj^1}E z-6{H2G{t=Cw?YktjEXeTo>xCO-Hg$yFiBuR;s4=?cz3zLGi9YY| zwF-&zruK+h%=VQGO$jnge7)k1h3t at EjnZ{*#qUwZ`U1b-DkKU`EfTHf_FWyiZ4+~A zNA4X9r6K*AZN~aCzn3c5aZPO(Rpap$3l%?a82>tK6LYg1Pr;49#ee52oVimi|AEif zFmUWGY#)D+h8_$~-t at IB1r^_}IRYmdgf=6Pl$$K4lYyh&bk>Gy!Yg>@Cy@=9IH z5!6)N5fEW=r2~4dM&6w at 06Ivfs7|0W_ zC;vLn)jj!_dG747F`u<(jh)%7{cG$t&pNusZriLAYwV0>d9Sgvm=&<5W#g<%Yy2+r z$nMR*#-qMBKa^+V-uzgefA;1F^X%Wt(&TS@>aEPrl{v9gbfd#irUF-Ghl at f$Wk-)O z*X`0q6Rw0(J!7uKQauwcW@(-=*PYVpD6YT4yrQ`N4jaG9wKZ(~I+tyoNp7>}$iON)R1iwP-FuG2$#3IRVm#*Mi?mkva6rH3(Ox%Z3PFXuii zPJu_o{f%cesIo8dytHMl<-e0Ru~0O?YbZq_V4%ZUforhCL3E?Hy8!>j{0UwD{rMAf z_yh7M6#4JuPiTk+_zd+Z1dMd38FPIvH4)u-W=KUe;LK2rLcnN8hB4Q#(rgp1zEUq^ zuKrRl6Rv?$sxVkOZo)NGDq_qvTqL10!4&yB6XNhyRiB72bZKp-#Di3?xCc0QbFZ_?_(=BvkK`4gLWEQ7; zIYs3DMO#+5TSmx6iJrM&8?R|&Ta31w6lptz?v8Av?NI8FXo at 6x+D@SluF#+g-Ldou z!&+Ffuy|q_!y=3&0*g78DlBX0Lwv-sSYgq|;)Mm@%f|wX8WuM!GFa at fFlhOLFJOdE z{DP#FR8T*JI!U8W&vmLZf`^lMI14W=Cy{@NgdL_bU_pxvzKD!5mcOy!fec0=gD)nt z6^l6*%t6Kk3uY%{hGjDrOj*VV3-XxAVlhvg#vM9`LrIsf?vMK}_F zDi`6bxZ$(y at m-2=O#E-6E&c?XfbIW0#ZOp-5AqMfQ$>6i70jv;t-R250Ap(XlaFXl z06sk!%b!4;e3m?3DZ?ukc!h~qGBDYA{C%t7K`#~wEb&;X|2WK~2wy at 8E*pFHc((}U zT2ZbQXR8%o at lSu$4|q-DA*V|8^?jAhce^%5E%qA5a^FU4(7u_b+$5~ z_D+HW_X9Y?3}bFixBvB7>4CD60yCbT_=w!Z>dV>=$NDAFA_ZOc)I)2opbPTL9Q z^dVKU^vsdUq&8l~^5+U4*ce5N9`^LGr-wZ~>}BG!ZT~FzxMo~6_povxtHHq?=)hdp>GfH#97{A zSmt6`iDe0v4OlR~GYVK1VbR1Qh-D2HNi6zUW?_-TB8p`l7L4``26bi`7F~S!1?p%J zge3|~7#2*|0AI at 1l*%XK8zdTGv7p5cKcby6mcOxVr{ypDE_L|L3~- at D7YitR8OFRE z7nt%b$_vNH at QEvE0;}=DQhNLjyEpK0TPbTEMeM?FbD4H3F|ONm(TA)~{Pdg1c;bz1 zc(x5!6}YOvl`^iBag~azZVb8(%X%!&v7E*-ibV)Z3Y-Mqh{shtuB>rofuAcIMVR<$ z8JI!~3i?G*p8_1r0?e%db1T5yX8sIb8;b}Qocl8}Snvx^@zNI?4Z~;7#)9uTx(Um2 zoP-tlG4Pdb=?^Ev5K~RZ=gMHIM~%oo3r5+Cet*8g9K0%zbR3Q;9F8d*j;R$0UWLU8 z%Tl;NO81S%f^RT`BQb at _Q#dOxLh;}l9^jZv?ZRt+{sbfO;Lp=oJjJP*62jAXG{{C5 zH_WOPO^YxlKfE$y2sj&XF_u4pA$TPcugKsP243;UAuGgWUGW#4jbAzgPu+0khHuTl z-;Y23u-W($3Ha|os~q-Bu!phv;?Vly(E7$;`O}(-9syXcVp)$y66hh1B^zZ1P^J|h z=a2tpaB#5M__i||(Bgm at fUW=HvAGIuiX5YN{C5hF4BJP~TR+k3oV#N5lG<~kWptk{ z{Exsyt0=A%XisH}N}GQwmfl75wl&{FUY48GJ+Z-}=YP?r^UZxPIiHsid~_O*U9d>t zWi3FL9hCJone^#f1b1(wSHh@|TY at PPHK9{1$>;_lCl)WdZpNdmKbJO)R6ge`NuMFDTT%8PbD+NuEbaI zz`axwkSgv+{yew9^I7oXG{V*wmr%L%PoqDNxN#|MjLS`bF1O=y`Jc-_U-!VDOY=vZ zjQeLVe`(uyN8RT5h;!?*lq{FV|Np0N?9^yc>|2GXU%o?%)!o-Q4%}B*+5!i=iuTTx z=TyF0GU+B(T<)K_aw|K&RDHO0O~f^h13!^%AoGZPBoYm>hDbL^BoSUB${_qi-Vxai zvYJR8ku;#1llBNHdXNND(1&76e^dh>U@#5t#v at ly6)__=xDBOED2)A|9Aa z2 at y$3`8Jn`5eT|`AQAzBxpaacg@=d|2)eu_Vh)12)DpRk6hR`6An5XiNEHa?G6I5> zSwzH%GC{UDgjGzd~~UPOrapi2o6X(A(-OBoS;q~N?*fS^k)kwg&8r3VBlI4^1-=u$z% z4g_Ex|9(y1i at UYiJU_U&Wk+=y3`XX1i at Se zK#+p-!T>>+Y9fBc at BBxUceCSL9}l;(B5rcNiKMZ#{SS5*O$sP;DqHtVy0MAq3GQY$ z9(Xd`Djaf?yCt-1NW1*> zqWL9yQI1|*NG~Sv5V=o82}Fm;Dv(ejtBF{GQ0Km9L{dNuh%6;ig%m|18X#1>FO7&J zh#nCg5TvLQ at c==Wd?Gy{3?jTlRFSfrhyW2=bh$@FoJigVA}c_UvWmzy5OjG;BnCvE z$YLVtNLfKd83bMaBVq-jOJqF=QdEdIgP_X`BK07cix3f4q{tJIAkvI3$wah4Fc%dN zq$m at y20@oBBH19AixiQ5q$m;513{N`B3>Yvivb8y)QFq~L6<@z;~<#JY$DQ>GA2ue zkB9-f+$ADHpF3*W%fM6~XL|Tx7^P&xcE{}+~ zfnY9rAV|S^@d81Y0wMz-mD?+;y zw5#}%UR+KuhSG~>SBQubi6Rm&NTiEMGRO)d4?)6-EF)42B245r5eE=?BC$j&ks?MU z6GVu}FCyPSl!)YlAVr$U2nf2ch=>u%mL(EQLx{ML=1i at Sqi1Z;voJbxBy7Utn1HoJhK#(FsWEuor*hGYhcwsI< zM5HLCe?E~AB6{f3P9y>Zb4dcBl>Q||%0SR%h=@4|<`P9D0V#`!q=2By4$5=jKXTv9-gg7Z=hf-WOO z>_9M=7$OBo!FkC5L6=@4Eg+anHV9I1UIswWWtxZ~2<8$=#1|%9l2}V`MurkuL*x(gU;^=Y at 0 zc9~rC;stt9=@q at WmWT-vi_1jT5s3nsMdSvN6p-~qoIsGGOQaTro5&R+jvyLD_7bT^ ziWZSfkl93T6X^lbCgKBv6hk5-MC{Qekcc>uB6T8Lh^QfDEs-z~bh%C>21Jv{5fG&4 z5UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZnK%|#QE4o}Hq78z%m=SS9iUyH* z5Oj$qk`02nxPTxNBti3}h`n at AoAx+D@A2fnCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD z1?MFj1YHt{41i!RXF-sH^D<7vA6#SsK4I4{*8 z=n_W69t3l-B2t7DoR>WoFG}w43lSafFoD#&(Yq* zp7x(R%n;msm2+TEAWNiVL6`rML|IPI@^a38{$a)j+N0aevgMrlbgMwOv2;sM|Djt= zx=oPflmyVfb9p9Zwkni!xHhpvu2JNb?G(9)K$0j$hLiYC;td6ONEneOBHuvNh)jYYg`0=~kv-`0iijAI$191H5?O;3ej?jI z(B&hMXpl8TxB+ zq6LDvR1!Ik6agaEAn5X$NEQg@(g%VRJ|cP`=u$<*69jW2QgB}ELC~e1NFfO3G5~@UoEHWNx>OVKTmFtSsJw$6(t2r_!7{(WX&1T267d)9 z_MZq_$th|5ds2o?WP{)icG-c at VTQ2L4UW6_Jyzt!m7Js%?>OJ-wKH^kekJFS!aL3_ zx^K)NIFth5K#s}m;Z=Zf#?!h4}ugGBF-S_@`6Y`2<9S0 z#1$#>L?nnbp-VCmZ4k^w1q3O|M65y3C5uQl2<9S1q#r3tMD#$=C7p;D2&WiMp>hfoWC~#`k6(*S%SG?tDN}8}!+D(QTORuvmq7^t%^ja6)^3v@! z1&*cMTh0x-T}-z(>6V^;qFW)#4BvR2mBM7>T5%C1UToQ=%Aw`@>9tgVh6Bz at + zTna#tB12>v1YOufgo&KOT!M&5QOb|`L_&z at qDwoG2oTIA34~I9EFn?`f-XZu%t0`h zC?W|+SwtiS1YLd*sRF at VGC`1n^U?!?E|Wx5K`@svBDP4ud5IzN0$sX^q=R5CsUS$f zd8r3Mmr)|FAec)$k!Gaeykvu*OCOPb5X>bH1SvQ#;~?lVLqwX$Z_FixhyhY?ULuK{ zL6=SaQ>?Kl-6fGi|AVEZK6X^lbCgKBv6hk5-MC{Ndkcc>ue03sQ zh^QfDEs-z~bh%C>21Jv{5fG&45UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZn zK%|#Q3%Xn+q78z%m=SS9iUyH*5Oj$qk`02nxPTxNBti3}h`n at AoA zx+D at A2f_IRWD+Utst0-7YI^tUIy^j zg)SjP7$BI71rdLw;Jh$F&?SaQ5eVku27(lvmsSvTi6r6=g1OkQ9A zhLiYC;td6 at QzY^P#OxZU+aJ4>w@#IIhp=lwFV3PD7t)Kdm*~aUL=-_*5qV2wyE&10 zL at Yrr6Zu3W8AOH14-llxA))~iO5{Be2M}cU%iZBrmkT4=mM81Kj5t#%*3O5k} zB74#06%jEaPgfEtC9(!7{6w~apvy-h(I9Jxbb}y;mxwY5y1XN at 8)P++IwEOE5hCIY zf-YZ)dMnRA=n}`IFFX-}yh!zOuQc2`EQUr)tgP_Z2B3U4qOCJbQ_=xC%pi31I zPY}$dnaD4sh!8mof-WsY#y~Ka84yb8<|4vJL z2oTJr69g$dM3g|#^fgcO_?FA#KTCejarxlDr~1?NSC zh!47y5RoP_jJcE%(MJl-ivo=Q58iQp(rahv_WWv&^Zj?6IJ$M9+hDq-r(fyTlWu3zzw-Zd`%7J0%~7UEqk9y& zjv{vuh%lu{O%h3#B!X6RdT$Xa1JNSF*+IJ at w3~z7B-%BkU4DAe+?ZaJqZb#_iwPHq z+$W+0qC;dAhzXI^L at Yt5bMG@EDIf+!mJ+E#iXssW5GvlAM#K?BkBANkQdEg}fS^l0 zksc5R5ndvyNLfxqfQT)++#@1RwQULcr at 0SHpmh@1sMmqH at rAehT+BGQyHDoccqhyl9XB_cxP4CW#a zLMfvwi5P*P%M&7zAehTSB8f;*Afg0Y9Q#6O2i%n zbI}Gt3eJlg2)g7EX$8StM2Pqy1?NSE$PBuq5Mh8|E@~i1!FjOYIMIe}q3=uX` za9$W7!HS&T49!V<|D?B^DLpfGJ>w`5lPJ!pS{y6GzqZSNCPb0bsIEELdhx+qj+Ueu zJGqzW0_BO}C5b_9orZ)6aA(M490mqc|>q(|%2t zzeFfSmQ&=`yA-*aB0oTwlMp0v=p&IZA`L{?MzkwQyPepLq}>VHRlGwlE~ghm=|!{c zL_~>15sAM-q>D&0$OB@#?T1t|-Ngb}eumkuJ)APPhtfFK3)s{lclVIsRhKQNUA_^?0>NA!fgnYKNFxZk zj1ln!!CVrE^dUu at NFE5f^b;8a!CVSJkRn558U$U~M1+ZWVlF{Mq$s6tK9LY2dg#(l zBmx9;Ndlpiz9mG;K+t7~h&c%65=A5dDT|1tfS}6{B2^%mOC|_Xa9(;q&}EW{DhTEh zM#L5=I4?0o^3bK5NID4Sk_v(poR at kKbQvY$3WB-B6KO^Y&Pz53y7Uq02f<>b+=G~F7}ZKx{eY;pz1j&7~!mO{_cQ$xx$oMp=%U+`nNXmbq5 zSAm|%*HUCKMgB{XMoA=eNvx$eBTa~`A##WaM}~IYvAd0S^=Y at 0c9{Y6;stt9=^nkf zmWT-v3sWNNh(v(|61hPn1!O%DClI9Q5~&3_Pvi;_M-UAndx=ydMTn zCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD1?MFj1YHt{41i!R zXF-sH^D<7vA6#SsK4I4{*8=n_W69t3l-B2t7D zoROXZbn%~x=ak#BLn)l}^`2AzN4Z-@ z#}RBv!eVA at vBk_R3oK@4W at w9;%oPY(kuaI>>HyGiK3#7u~H9U%%pX{TVmX=CQGt>Fs^K$}H4 at WHXX`kT%R2dz()E*o!B5MJ2v|O{w8-~-)&^J^`f0%6r{~24;2c|8 z=0`m90<28^6kzZ(@}dGXj!!J|GoC#GR+fGSF!-5yaRI5vCzkmY&(HuXYd>Ka{4B%p z{s$dL%l!6dae$S*pE3-7wjpR-C%BgRW6zWTD`!7x82lVV(6~<0ELg&hH}S08{j_25 za}7b`I!Uw4KYPXoSb6)2!{Fx`M)bdZLYH~Jd58JWd_Gqkyi zatNZt-ZY{GHFZGEXXdv4#!pb=s&^M=;uCk%DC9Gcp!%<&Lr}^GqFw!+e?PLuKRQ+Z zqthj*Q`J8@#r&faFV?1xXn&0W)+QeazG7{9fj|gr6GpV(mIrH70tEb6n^Yj+!`id} zfgsi<4hTRz4G at 5MTp$4P+&}>0p@{Zhf_Mrb0P&bW0OHw!0K_8(0f=V+0uWCS1R$Ot z2tYh=(S9NjPZ$Is9w`VwJYx`mc<3Mi at svRT;<17N#B&4zhzBp)p9A7ag8;;%1p$Z$ z1ObSL2LcdJ8w4O;F9wQ+#SL?CkUAinJ9+1M1(|)4We}zI<7q7v?_=l0%KMTPV3)@X zOMuM2xf|-=8%D6n({{Gg`ubFt6^3{GsU!;tg#ZQy1_#C|rSUDul5foe8VrmX5e$qL zbl240mf6zY-qOaL8FXoDZ^vwB?!qi(@9d)LU~USu0Gc~7nc5gTJEv&qs$yCK{BRN( zv~e54Y1Ws2Xp#P?XvxiQhQ=;IPJk%1YSvGTGb3I5wS`~&R^`@|b0%N5?I3Ka zV>B*@%H4e$_x;r;Oa2h8Qh{p6FYM{2>-yE_`fBI%?S(0_hO$E`{*SVzqFL8hzCQ&%24*ony-AEX z!AJU9Qc=7!O^j#rjOVno$4DdCctH97g3sF}dvgh!ks>de6U4A+xlou)S;3N3v at kzA zgq0NF)GG8~6V^~`1D~1az}{gOa~d0h2!7g`QvE`hI(Utd|5yw)PS?IYWjR}}rk*KB6(JT3l} zf3{!`2^%Zp*n#ALtbI>uMgZ2VS at Fx%!OrBHheTd%Q2O#Mgn?SZQbJILDa=p0J3fSZ zmsNlgYuN!;dQJ-(+p7ahYwm8uUYuy2gg)4*6xBl&^H2_WKb2P)u7)F2z z4kFsb>Oc%@uGVxqE-U$QcvDXEq&FF67QMpJl*=Tef?^h8H!G35qoSk`j7wKAIl`mu z2n#W5R-!7a^t;y4ixfHRZ9pvQZ9-(6YxXc6k^QbbbSIbUa2;!w^f_i7po)Q6I0L>c zw}FS%G8wGxZ_aOaD)8)>fV|rq4Uq*7VVXq#RtI7n82Si@#~damBJRQWlQNZbW{^} zjFQpqyv7Z%e{4wpXfQ39IAcGPW_*c|nUgx4S|h- at 9M z at K`OP+aF7rd)i%)I?MK(#3+qF;Xdci3fVQu+A3YIzjpW}b#8U)lg+Iz|IEEZurD9w z*1G`egW at -DDcm7jCQBfWoYFqNxt-GY#2foU%vJ{oya!|allYRwXp%#1v9}vO8uY|~ zFIQzua_vkm3z~=$bA#RZ>xBKv6zP?MU6VVk-^JGEV{hcB4lrxY at ekyNb4w2KGwDe$ zDBnD2gV(Vy2(B#bbZXruw06tt31xrgO?MJrqp$g1`O4VjJ!_dZZA*-4-q4khGenCq zG7dp5Qu|m_5IW`zRpd(*`J^H!>S>Bbjjf9t(u)KpzjM9J`787qIy}i<`Kyx#B-47& zLnubtLH9IymDEP39fT)}CwsQL6I%e-j+7O6={OXK$=}03u-_dsc*k at XX z?*9q96JU at CKS_5NgMLa4@m{}ZxL(}Vq`*r^vl6f5#2<$ku=(YNXJIKDR6GE`6 zL9I2=kNW>;-#~k22V+xfV at q>Jpq+*NznQnZyeta1Fq-crw^l=w3s`0|Hafkq)Wt-x zTxKp)#u<98#U2<6C4NM?cz2pto)^EpJD4a3nHc(SgsB)T?MZf1?E>Gzzf$l|(HpX# z-z-&5s}WD+$90pka*i6D_s0kv+Xsw39`!ihW4*-jN-lUOM(~)2+6UIhT*tlXs!3>F zOr>4P61A2CN=Z$`K0np1x^`h`I05 zJzF)NbS_ykoRDXYc$K4nQoK)L8yUI`@2UsCMmA&Z%`d2V2m7cF9~IBVXI7X}B%LPNkU^Lf{ zA-JkVW%GH>2ggoTCY-j>@K)JuB?OJB at rob(q^XGC1@&{OdPSR79X{_>D#-Igo;N)y zzx~eA;7?FK^Y7CfAj6L{(Ih{W~+!PjOK@piu#)GBnS$r?F~`T^#j?D(jI)-e2#xiLLG&3->QJ^B9k`SR-zjO9eB z{SJ6cZOr at 8GfMmX_#tG5^l;NT3doIbbKl1LFb0*{=!4`Ej0-M2>7`RSIce8e|oB-fssf?^;{_!9~~1x-{Oa_s2xhhiZPMV?daxN} zVXrCi+q at o{o!bX(N4Quu>oRI0_%~B;a89-EH~UJSHsO_eTlSXsyBrXVJ9dAo98QIE z at 9qdNM5<&Ytr)Rt`o-apeaPyOS zH#~0Ho+K^2U{=y4)Whw*y|!SCND at l8RIPa1f7252v&eD32Tts-q+d#_Fb&N`{>}SA zDd{e|VdYNWoQ9=rL8YL3d9>@jF7}NoP=~184wTh0dmr3 zk6r5n5eCJI`^V2Flmz5HR*5R?F{=6WAGu7Gl-fX4*`@`{h&Sr`I>4I)f}v1=qRZ_G zIWZEhRnD+n+C&snTGOLT_^LNj8X^g+3*5n%K!Vx4lGuCrL@;T-v?lN5eL?8&68%)8 z7U>F1`zpb*?gOR77?%_J>uzao{QluXz-dr+^R&xPux8k=_u!A6acV=n!a}@-F~w4N zg8R=Bw}Zj*dH at +5FVufu;%xsean%jGg>PsASy`B-R#u46G6l(Cv5-799z~TnOkFfuAwwQ^w^#6GIfb3%;=2H4) zOTcNfu{uDMHA#f%&e+7TX+78R{(-nxgFFGE!p at Emozx z12MV}Z~5~2yXt6sDXM~_D3CGI_c5fYS8S_|uq~7-R<%z%ai-V%>=yt`C{L^mVqNg=Pw=Em9%#PgO z5AvTyRJY0{3j+%VR)-1(#`@nA(Z2^q%~xlFCF~E4L`LAxh8Rfrh at 8a&s?j at 9M;V$S zQZ!0OYlnTDPT&#$%H8_5*t&X&`u=Qa%Qp{bD_VIOk-?(bQua$!>9SNSe#iwk7zFl^ zJra|boULYt2{z0Fyd3YV?i0Tg-|Ls3b#}gR`6T`-b72`Y5wx4M*znn at KnW=>Bw2Al zi=2~)AHIaaFMJ+0+E7Ocam;L%=}N198^DR!n>4AA>Regu)8!x8eE1?l_mN9P89!Ib^ z5J|Srahz%UB-sm^{H7w at 5HZDgQez#bQaXnZ|Q=hjWvUAIx~dJ_ob8X zzv9_V*-pEwSd(Pdb7^#9GdM%5*)94h<_#tqiMCj6qpaRtXCK4^hK#Q#^K(ep5n_Sz zvO{iJsb?1j;td70g9!L0q6ciX1$9L!{Psn?ttn?=_OcE~Z#C~7c!Pyf ze5SaEt7 at fM>Bd%(?b2J0N#gkCdHady#nG_XXe70B!Iqw^-^s6Mg>XDjG zJS?&du8T~^3!$2UwtvuH4t?H-tC>QI_f8 at 4C2k;*y>G%pN%@(~)CN&}BnRJDD|Y+s z*F^&#bdfu6>qGVPpS!Dse`|sXd*}~B{=K3 at y*64?J1M1$4t)L!eTld+<{aC=owqW> zn9v?Pf$tZ`Eyh=}R~~!_A06r_KB(SRVWdwfN}fWer<6HYa|V^LsykMgk&&ze+_J=F zPa=x;4b#l*YqceZ5^2|m7jPN-3Xlj*{f1%nzfzy$)!Xt#O63I_0^D`#L>n+A|RR(w|GeZ z4?}*EJaD*=b=YIfgK5)H(n0(H*YL~Kz0VLIi#6X{+h`0OYuN()E3#@TmwGu?no zdBGoHe@){$_z9MYJjosOqEPrFyR)fzWpAJeFp+Qlzc>tHZ=4KF>=&(~0(CUOU|B|Q zy+5v=cxm(V;wX;6^qA&7tfy^3~iu)5B0Y9L at z;NfdZ)MIHNzpZd3j!yUe{ z8A#ApUeXCBza1b(KAFj6oQJJl{V_~Q_ihbu$GSNANewQZ4-g)Wl?T6qRB4V zqmrXUM`fF=e&IwT0z6{^Ijobcbe8%AU->Vw36gqZ2Be!H55vx8?f|tlF?*`6CZ{E* zXzKT+kHWD|nr1_FeIr)6lCm0d3 zn~ag+MSiZ5aVu+EW at GlW*5sQSHa@|Q*aKM2fSmZf_^2&il1_K@&Xb}nJI)Y?zy~OH z&q9o3M-BWNz9*(zf)6(5cbJ^sNT#lc%dTSgef+P7jK^=bFrWIlUBSTdoPtfyasB+w ziDd5>r!-pk7$*{?E1d1B#ZiULFxJ!_5!$#UvB?#9J`ymYIkw0t`CBDC-Lsl?jR65} z>%?cv)IrzB--eZ5r4=f1@;n#I2P()ykDM1rnWK^iTm4t4vVYxd**~z+-)azebiiXV z{!&l;P!+t9?lsWa&+=X9+~7`|)wX^^#`njZ`rBDWew9;kYIW-h$F0B(!Q>vS=Mb at 7 zgy=dRHDz5NUe2($t>b^J^;}X}8Mi3i*N`&XvQ+q-}2VdGTBpO+oxgg5%v!Q!@^zN}sASSAm&aoe40il!<4T^!G9w6H{bTuga~f~WZ9 z$2-YC2i15$Z}t$VMGMN#X#TUHDsA_VNb2g~VDta4l-epxAPlgeWiNgArT>lVQHdL* ziEWP%xLfcZpd%8#SiGqA#)azlgM_ja8;S&RVj6}0r?kvWx?=R=@54gT@>iAeSucdZVdLs-Wo%+&?)-1l z5TdFJD!c#!kR=;TQAP=L`{v4XD&JQ+H^soCNS87CjrKQMkS;SXYk{r#%pa)!;4 at Z% zr$IfhMbVb2^IQc(X&KKw*OM9d`o}XndA(qpzYvKm7DVy}3KohV3A$De+dFVW!CnjFnB zTd^+-=xjkUQ#*eqw-B&1js0xu*Dx}d>Wy}3b7^0cA)_L{EJ-WX{Y7 at 4D5m>qaxL|f z=7`l=WB0eeSC#QtA6qWLsIj;ajoS5kc0=>Nw>ARQbZ$B8NdAP>IMEq`l|AkXVpRw( zMA6oYj5s($D6@^^DQ ztP474-n2}9>9GvTT`g5ER}5Cqm)66R>ysVWzn_OK1{0shaQ&_xd2^()9o zHb9>d)qnO0shB(4yE>VgJO9VxMU2XSRCYwB^G(Q%D=IQShC(t6d%hIPl+&q{B+DQ_ zY&mLPX-wB1$?pC97D#s62YaI&u1y_mL>I|e=Wa1Gnaj(!-BIPdjfL`aGQ{xkVm29?N%( zOV&Pr{eB1|15N4< z{HijKJuYwaDaeJM|70>i(Rq at 2pe;ND@%1U0T2#BsbG{%!fnJ5RDgiH-Fpyx0(?#X{hD8#6pucQw+v6}sU;*IF6_2ZG0R*q(C4^RAM(nT;Jr|7Lf zX(y|KoBGenX_b;i#d9Jbqat5>l7jjPVTwtXHvWR5I5E?)5wGX9`E6rA#;O)wL z^4sZt+H&7H%=7pEMC_xypgH|j9k|h!BqA&fagWg9sM&9+rKB`en7)mv4nZ6~3{bCcs-F9cL{cAsq(Jl2) zjisl^+`(pT at C&qZ8)jYu)26~^#e3ANd2L7k5VhN zkM!~xQIex+Bg~39yf at j@x>g{LYfV)}I$E56*!kHeos%^ZB_AATmfEvs+d~IqyzX|d zR$T4GoCJUT at bhz24qcsOHn8Wiyfc3xP%^JDZ}VGZzZDpy;L!{|rIGem;@$D-8+b0Z z)1+-+8s5ja=(=92E38&NkJUG}y0=09&|)25XM1`?L>p|EV|VA$;a8(h&Rd{s-2ZiW za3qnBr|P^Fp%L%8arakMkxq#bIAFwsu0MeqwHwWS8}SE+CZ*8jD3#Qyp-dxkBp5K5 z0ljkZP z>gzn}6+$pFw*9URLTIG0O=*1z8KkP*bQM5c{1<>>Zk4XKaNOb1As4GhZSRMdqBt=( zjp(Byr@&$9SlC0yrEUpp=)oLf*}w?bpi)ubpuCe;R++$SeorK|$M~#aRnC1gz7)6( zmy^7+=T+?>EvAeFz*2o at _hmWza_X6?+X9zuit|g0%pVEsoB8{F=2{a6%JAA`;1TxA zPMlU3Lt9j&be}hN91|M!0$)K!9H5oAxW8CwF z5XW0!(A%o>6Bc74IMGK#6kV;4bKbWXyaLvqO#WS0<%*D0r3N0|UWwU-55B?I40R+| zT&{yW00yD}O)5InA>a{mG>T*93xP-vf!8YOm#6qhGA7RSWppx>1^+}12{>T#02*g3 z!}+SHC6htg$xpr zZoFQ1l at o)IV3tmAh#Tc26LQv8V6J{odxMD-I;dIOY{YF++rudPZjJX=s)=L=^XIRF?mWvPDnTI7UvVx zkm!ATBB%WngA(E<+(j#;;fg00mh1ft*FfVY&X3Qm&`*eyx-TW%8W`C-^AUN^j>b-E zOYZ#qmxw*!W{H6eir5wZxAb2QXlJhEWDoLOXZ!z1|KlfQ2ESp2epc9;s4_P%rF?Zv zup!*kLC3;E2#`ri=>!5oX~*QGsY+&!2VidshLW(lme#U2p7QS5uSx3c!D?9_Ssxq+ zShP~OlGL%S$?>KKJZP5#PX=gm+f)cRBMbn6Bl1+53c9M#0M>^T7iaCIc2geYB9g*2 z6Iym|Qi{28IL)-C7F-FSO!o~}_nP_jM-psA&4irbS at uKG@YeluIb$7u_MVRcK^Y=1 zr?vi>IMa1ZgF+J(9 at D`jj-Gav(-3F5PYh24Gh+ne+XSXF5GnYU!s`rQJsi3Xgc*E zz`*GLvnf?@wXyl%7bs(tCS)Lm(W<9aF*yYf5TW{wCi{N{QH!$#)}xV?dyD}ws2$DR zCAfaxcJjj$zkvzKTx3A`5bLF1W&W=Hz3u7k?+NYjBL<^Ui_xSe+*M>x3uvwgxAwA) zOzLi7M_DkhqSLa_MxSIo7n81SlaU*4Csw%WD{_31gOA~+D}V_LX$q5o1Q?cp9f!K) zh-6ZEjbEqFl0qjzzl)1#RM0}*;`n_B5C6-n49|;d0eDAOx^n`MmZ#Cr;5Zv|K02;> zYufC^B^O at pl519PK>8zvj9uqe+1xNdSLE59BeaZ}hb*kBMP`j*xFss z$D|O9GG#J7Ltn(!0QY?O(OB*oHQe at h%4B;59?^!2xPFvo!eh*v!PItho~9Gf!Gn4GlDb6+^aRaDU-_Bb_9!m;_ZM z4qIS8Fao|t7gp*Eno(&C8pI+X0snUpwSRz@~Y}O=aD7%?oXzZ zg0pdWb{y*W^)2?9uZ%SkzYBniE(>X1gY&jig at OCMjxoZOHY)_k;N at 3MPXMwF*U<8I zNjmHJ<$0vg#qN_zH?#9n;V-w{8n1tU$YB%X;N~cMh?^PH4aWD at sBg^2_|B<3thRW( zladb}F_9{0!;53h#Mdp35K;dgJr7cDZWLd-f;QzaD9g+$2$ zW4;VAI(;UNXQ87tVqOSi-J%Opfz|4dP#69nvx~43iaU>&h;%}E2(`&D#w&Br>3APQLw;H8FmVH^E|4GgaA-iu`-tI-qB1TjlT#oR z?SkvL$Qlkk-hC=c=PHa(zD!j7dX?RnlPcjSB-(+PCX3Y-jiljoFz%&iaZ7tU4Dkh% zNooOl%;j6<)=9HWgZ1J7If=yZ;Anp67}{`hRDbLohrcv`mFH)1Rq7 zmYuYBa1VR6!%MdTN?On|nzd`8(n2^zKETK{4DK at S^<{K#&j|~jxJiub8vyddJBFBO zaL9{wa}*Z^W4=+HI*@K67tTwyC#N?)xR^=#x5WOxBJJ|pq;U;ISBu!pC{=nVhUr0?f_-eYOO11zL3yCn9!0S7DA+^(?mp+ zs*!~vUX at O0!LGk#EPVe@)zA*SLel!=J)>U zR%Giq(wb{UvEMX{QuI%s+TT|#C?%C?mTmwxg8p2i(<&*-${Gpz;A_vRGAVz`o3`FT zQQ)#POVN{gl5y=mG;%93l&fJIhb`22N`J-${Tbpfg23D+3QRYX6f at +fMAXoR{S;0> zlJ=G7z7o3}l_!OT+PMDrb#tj}X^e40IrG!^Z!>gwrs*ClDmq+4u{JVvHc??%RPDGj z(3#eFG?h*q5QLpwL at rf~JKQ-e; zN at lw*jL>CK?f`6q7E)QxVTKA z)wP*vy(p_NWs>90Zu3tMfdz5rZq>AyB at fj$-GUp4X6hsb-tC?nK at CV-y8z=3Rr*Jd z(j`1HZ{*rD8a(|g{>FxxLEGC3%4F(}^v!70l+Fi_`{=azEM?Np2fUNh4f8gMPd{hy z2Vfa6SCS+KTBrM4q~Et%j#r`!tP18PsXdq&x2A at 0gMo(y8y1Bj`AvwzHLzb=!2~i6 zDNvd;Ib^o+8HT6Np%=WIiZDO0&FW>Smib0QxZ2UQIS)4gr2?XUqKeM*w7%kQS5V9F zUP7%E+T+m6UE2X at EeygTyBZm17)6Fs(7j7A;Jp+!|1HZsbun&lT*7W at c0vs7g z)5K8!50Ch_)bW2=N3*q`SHkjRQbK4(u=_jhqM&x_vbAW>L}8jCjY&nqLSd072YT6+hx5Rq{i@!Xiy(X8SM!8nbe5_W9Z?y^$v>T>)$x z{eqS>90L72C|>%+JwH1IJ#jJvOkat^QV+zKFD#y z>E&gaJwh0J1+4Kzcz#7`-- at CmsKaw&iesE38A6&^(zzcMY$>a+VQErKT;&OvEukH1 z4Y6+Nklc(ItGV=X at eq21K(AoIyR)6acH at Tw_Dw$r_bPH-ahyK+#)W0!DypQ(Z}fk0 z`AeWUuaw=sk|{?C;U0Vdn?Sv(PfP;yO1JFlHHgbs`)$P$d&LE-m}Z|+^tsRv!&!fX zXwzJ)JzE3c@?-jQ{PkcSDQbbXdKs_efhDcktc~_>SVn-qCdaV%AChFulC$qML9Xiu z{Fh0gE)6v85K@@>5lm7s9PeWA1vsOX_o4aSiLo5 at kV-tJ?)VyHsdRi69mN{7xZeDpLKpQR=UP1HKt0VM#xBPHwkPzzo~}sQP{nk|8tLst(}IrzP=;eDoriq+-XvbLU*fc| zN~3iX*s?@fZS1=COJ3>BrSwvkS@ zeI7PujND&Ml4G&~u-KW?TCwValC6_D1w8}^x5n7Zk>nDa2e$hL8s8iCo|${VDGVYq#+RO^Tcs$}!@VPs?eC_{OA4 zjysXG^rNO*@?#Bd)Ed{cLyWSCduTcz`?U0UOiANjgGh?1Rq4saYN0LjZ3cYlK&A6R zks{);$eI(8gbF)CCe#f%N88i2>U!xQTuIpSfKmwN%;5__ZElk+AWUzC3t5oU?8T1W z=FZmT53*bZd2vi^+|oYA@>`%TownaX%V^8F!WbQ&h3o70yCmmYEYXQ#k;Y|Ct=o!0 z=g^a{$Ujk753`p_y3VoQOD3u=>-CE;9HTSB&4=_K*b9JWuDB;Pv$`YcyE}VNjlA=rAtXL!EpIrb;7t+2%EWEPnmei}47s zT*f>vKWWbm_NqJ((3 at oqHYOr3j4_cL5ualsEjwV_UP&0iCemcBHHA39_rOwozgC at L z(!|8i^EAR)-Q9K_tU=yWOh4&lSM^2yZa||g)5BU-**TM)dA~`0*YbK*v0fs>*W>H1 z7LaYl%`C1E-OI>kxScHh!Q-s+sGKE&Stp%;zst7Rj~g!E`)$zWlWl*(>J3wVrX6R{ zZ+xmttiX+|wxeFZ#PLTsUE^ZsJwAJH}>vTj+{shK|_ZU2=B z_bt{VrLO3b^TYV`H_iGYI)yrp{_pe|l3ks|H3T811W`Y}-6*%s>p&~&a?aUtTxP;= zB_y^0>2l^^BXflcECor%m=Bp$#RC*7JmUEr0nDCYUE=n)-*I;l zIwLGS_x^-+SzxT(O*cNDjPjG at R;B)+{Q#Nk}bp6C5q3o(y(ZdG~6yE#7u?q8{zWQD$cDeo20e zQL;;Pib_6%8z1#*F6I(xmmL>SiH1X{yL?HGjZum$o=h+iS7NHwoB(yzQ^Aq)#1h^M zD-$eH-Aj`i$5hEpYy{m%s}VF08>mZ2o{@UaPG%;fd2?AVyHNYfn0SXxYnXH=4;8X= z{F2NRvO`Y0lXyo&yCbPYwOmxpE%F?YOd|b!CPd4scYg$XdVj6(Yi1ULP3jHtpIz0w zY;g1+*{CTp7}&S}wyXXh4y~n*X%ebq4fn2W6`Yj>j0Kk$b%g=aK at v#RE2l#a)GGNffP9hHI2PCbm{EIg at dGH-GWeJs|1_G>}e1Ht^Nu($q{-UhGR z$biG!rqy!xVal=FD|uoe&9`diesZF{1b&C at 1baPl`@QPg+hupS(X_?%l^SbcELJ*X z^oRGfN;z>ek+qGZ-};?G#saW*F{Xpv!fXD)CgTK`{3AO@*@`Zbc_bN<20%N~&=t^> zF{b4rz{Phk{WRHeWwZW!&tcmYVeZJy%q<1Wv?;+%Mlz!zkJ6w7%Z-9tO8Jdj|IQ|l zVE^$gFl%g;@9)e0 at Z#TDcJ}2!`%VPEv+YkOt>6dl0T zB)Lbh8fO0>a93sNK-cav`*CBej1O-?$6#N?YbkHkuqj2_G2Xv(qcO^o9}}Xd*F-dG^EjybK2Ce-CKyu51bakWHc+xfldx>WEmu at 6l(6 z)n{={(=SexD`{V#*JU#&ol*mr>uquZPE*ADL zYPt^14A|z{gXMGdHI*eUPt{g1#_Pyhs`Vv>%Fn~gxzSYZ3k|xP0~2W2Fgn0|EQ-M~!_DT8U#*OWx&b*ZDHtQ82Ee zm>U)9Apju}SkBIdQM;i_J|SZgow%(OarJMHuV(&YkFaL`Qja6xt6}#Ss8+G>(gbyqQPJ+zIJ+)CY%pYV#e&T3VP%2k4*KVL-dQEv?xi?IE~lB3>I`3)u9 z>k&u=I+DnN0)jJ?(}h$<0zGB|J;nk(CIUSc0zF&x#FCD3D+eB9g5}7gAF&rCV;{K} zB%>d+U|&~YeY{gngF1d(1hCwb++U%$M at 96OTlKc@M at dN_5;dohapPUP z<-EAb>jL92*iaGygi6QCF>>hUBpSvy7>>|uX0z#!j6w1uxCfXQHLxs1NYN{KiVl)kAjYien9`yAQ zeHP}o)8%WhawgeaCNo;jX4sLA6(EjQ0Q;1dN$d}5a#=#C_?%a at zd57$yRk=RYdE(! zf4LtIs5ZEcgV7;NBNn2W6QHTa`n%iVRs0bRnS zKeC%k{pKP&ZHqN=^u{MzjbpFJqRb|v;1kTGq-78}k7cYSIw#>0D-9Nf~axB at 2Hz1SASJfE-iL7gDe)<+P`}5_bCUN at Upr= zj*ypU2s^7jd3tlfZAhb6pK0_BPKYJshdRr!y4I7sSZelZSoyp-O-NEfCq1Mma&#hS z at iFp!V`fqKv at 0In5M4&1cmbC&euLE7!z^}xpd^*IhBf};JHp$jZj7nOJT2N43a%Fp zSdLJ3C`GvL9}WwBLMI>D;EE#qTSB5#l1Hjq5E7dnoYMa*ULZskfK()H99|9Z1d@^E zsPje4<)ZVwhO;xYR6`ApTDn{`W2-_?zXy`NOXNLJs}aF at vL{rEq at zcxsHaNp$rR_$ zG3`rX35slgEkTM1r;2SrbH!eB=nXwDc!F^{MKv!^GfvF;{Fj}J#!vovO_1s>|EsEJ z{}0u#*)4p-5;$N`&=W0ESuRzQ0izD+AmE>^#GtLgqJm0kki+UrM^?C_#6^V z_#(xB1OA4N@#Ts~L#;(E)$&R&&--}um!ZGk2ZRxHT-4}6Ee!S($7UF5TBSr!W at JYs zEFCf1VH{)K{59)jYizaY1X4Q at teuO=)h$aC;m4$_2f!B1Vd2k~Rg`gmdU*8}yIHGv z9J^erUY=0gt3Gj8O9!#1h0Z`rmoL4;5wEL7ktnwrSkU%^FR_ic2Ege~O{e8FD;6zw zM4s(+fLq^~OMz at V7Q*h&;5a_*0&GCNbkKup@^=^fDT_ahqNM~REHpVV8T&uvmMJC< z1V!ie=IDus4aA-Z)ZsHYD~pEsC)_7-x5(`#x}t1XZfj^zq|TCh!9UafIu*-6W#tUx zpaX5uVYzl(&8JJ)r5U7EDwkvJy~$jBE#oA^3d>BS!y?Ry#I5*B>kCcPNAQdVt&3D*tYSs*$I`^Ts9EFnFkz;dW{;?<9|eCiI at eLc zGPa(4o2%a7AF-%d0yFbbSzmd3?GpV$gu7JI#K8NfKA#u{goWKfj{3?WTG>O zbXD0_COqgHV}z>4uf|$s5-YsJKG~*Pry<{OjdUwAR%F1{*|{xpVjp^ zu*xC5pjj^)+HSlU%+H--;4aC7ln4x|vlr%c>+a5P^Rkrrd<`HEY zOF$uwZm4cuLQ=CoI4;emp5*oYy#HM7iVQ!sS%pZMQ(ioG`6#`{SQC+P%1T?OseOe< zu_-YkpGaGA5$Zc1%pu0GDbXOn{PcQPc7!ZdAxj5aC1I%{8as3 at HUdjbyvVJ6C&vH2z=W%p?Pvg7^#OZ(p0+8c;`x5Z;Z& z;5en`A#ys4sZs=?WW`bUq{X|!lvE^d{JsRirU5U>c#_4D5~^i0Xli%y50z9%;3>zp z2Uha)qww)(!+w4=f`}VE6{kmR%>^;W*oe?XRX2gzj*@2-A2RXAxu+Ns$+xRLF zeH+NyGm{`zzANDqkMRHHpM2-O)yHU7FZ<`hd6xI(Q}259=7t}Tr(X^b>^fu2c&qP=Gr7T# zCIQot48P=rtsdGDfy+{3S>~jQhGUoypVJ*T%6=#w|g>7YK(xX zUa~)j3Hc>#i_aZ(9?EtPG&WNBe)+dVx~)a?B8OuqGwh`$v at K>Bojm!uZ zs^IQB6H>tH{<*|63{T at NhBlhalxDpFv&|ICT%<24Su1nBt>RwZx#%p7&M?&A`%wpp z`Xb_w^;SnbX6lR)AI~K7;D)KT($$9&!o%>T+IyUfvfd)5kEhA%Mog3!$_G1j$1Rsu4M|C4SlT96(pqrN}Wf7-k{t3X|XNCdzk>eP^g3_wzY1&{_(5g>rU zpmF|CpGneGyP00mfgxd`kDjHlxkWm2IQq1t=n4lWp^4PjaMZ+cIexTQ<_x+nl65;j z%3!ZbChtsnduc_W>Zy;9j%KZA{CwV6gXw*pq343n5qNdKGWF~WgX%pLAp2YG&ic&V zo$!5v_GHHN4(VfhY=Oh~91pJE#n|{D+he?1Lw=OP`+df2ex$MK$jiz~M*a}<|4`3=j)k?|`a3GoLYTPQ*LqEl2!&T3qAZY*9bz<0qXu~GVI<+h*EupLNwGsop0`j6 z1PVL;42C}=BSPeDVMqnrCPpk7YiStF!o)z|wH8Y_7vaJCj?8rRHfR>=ET9XEev`4> z&#t)VCv9RLkSF;<(HV at F-!2HMuUh=xr+%J&3rgjY0;Y1Ls_7a zg~wZzn^)4Yv0?+q=>h}}?cH3wV9?v4ByjWe`M7rIx7X0{;=&P!7#Z!9gAcU4;=-fC zi_w%ZCAW*4QlEl_=jRjgnCdnb;XC1&sHZcp24FhvH+azGGErHN7`9>Q$D){a7Bpf> z))DCfs$yjl6pkiSU0GJVBqfq$79?SvDtSpOS+?IvMT>NEnUFQ9nU5YN%{?>7z{eIu zGCM3H1p?xsO0#jw6~+W?UP}4o at e#Dl%1-R4YzWd~6=eNy=TluKiaeYQ1|tW;;}SO% z#-h-Rx=^?)%C_`#i4nld#k at 4Co?OV5C%nA^CCa4QOp9(>F!!Id&^%`^2i96BdT(@34K9Q^hQLGLej=|UQ8GxrowQ~^be||H>Oh(&mrz9KJI|D}e z!MW3f+9_e!)Q>(Lvf&)9a$ixwQaaaOz>I-e*BiVYboc&J$u3YE>s7z+CdQ0lD3)3X zL%~flb$av3vN3~`po|LVHfsw;R?IT%JnC(u?ZZME&TUAq&S2CUB*KCe4ZHCE zh|2_Cxaule{CG&+Th{=o-CKdvnEd{#jNV>s>^-w;tmy at aDkapPrf=G>&p72Ug2Ra- z7iWS&=I$p)-jn#MxV89tbVMb~1q5GjeA at +q`^Gu9_j=cxXyWCu8Nqzaxe>~2=ZrVu z}2i=Fu4Om zVn>FaX3Lnj&NyLlbzmXO+9(x}nsXtYVq6DdF{g-3lF#6UTG&HeOEb%0q7`r$|NJ^@ z*Q3}7IdeAObr1`oVxCqr4UU#|B6C=6_sO0Jzj&Km2~;`$gDxElo6bFOFO`{ee_OAX zi$Jk8>8_+S{$V8 zvz?^!kPu1Z0DU#$7h&a*(Hy;%NR9qdL`!IS8iI}{xm5;J-MZL^qZrF=kTji1am0$FMWWX>p z%+pZepx->Dn at OMu<*8VJDy1d`mql(qm{-__@%X91=AME9B=^<5Ll=(~+#-8i*8Q!l zk_=h~PZieGMk$|$??d%Bk1ILyN^RPjyBSc2qR{i}FkSzc2iz=la_?e>O5U|>0t34$ zJfyRR-c(oThF$l8fc7kH4v?6^Z%$ob)`)L~&FURyGq|C`AVco(n^Jmh(17OfO~9&EI_ao-Vx*|7#^a%*hs009dY95Hht at 23Nt`oT zMrz5%bz=EvP?h=X%$29hNp?Wt1PL1gk{ztH at hts!Y%f)@I6x#(Es(@6J`~8f#3%u( z7|YLZ;(}K_XA+dy(4xU}+;;`7Ld$K`t{d z(Dnk2 at yv_FRXXBD<`vjBoA)+a7n!D}vs1&P_WFUB)M>crVKix**1dMgV8>SzM^AJE zG9}-P0(atclfbKXo}T3l4lP8oP zGXRu8()DI6`N*gM9;jmIzd5fD>0x;(j?#v+sk?P5PR6WY-EWba%~8hi{F;{b!8Tzu z$58>Ejqt_kvwmqqkiyr6Nnd#e*6uzaJLsl6_plyyfrC55AJjmV%I|TS9Gnrkp^sit z&wT`zOw#xBqN~OUsoDjsmmgl%C(6#)9mq7z_lBL?kKzWWp8mvB-|PRj3Pc{`Dz~rb zfDzt}y1lH0)(c*3DY1J4 at j1{~Dz4IO;Cq9KJ2b+ClqyWIa-novL12~WlLZ2kJR}Mx zdPH_Zpf*5qLJ)+ZbPJjz)!ejf(iUFxYqU0C1%n{BOun5$aD?a1OjHo(fOf8R=COiy zjZP-UXb48i;xKdOz1~3TingJQ^KT=@B&A#-ueV700M4XvvS*5XI(k1~cyv6aiyT}2 zeRQ21LUiDh^kS87bYqfa&t}qKpJ+o{Li9WN%&l at hZW=}T`&zxIr20vRJj#Txf88;c zD}X7xSV;cv^P?WI%<~#A*9$*qk41jF2xV2ODoxQ>aj5*XWHU`_0kxK!u`(I6Eu~_Q z?mMCNMLEJ)r!84?2o;)dudhtmTB+ix{fav8B$CA;Cbw|qH&%tzR!fP*PI8G(F~x;X z(x?;KY%!5;^*{|!)sjVoz7XTDkB%PzLO<*`jwm4>iM2RN#=0_xH;w9{?B`^~QRUEN zhvn9?*NS+|y;9y`B)eJ(cj^Q=9omKH6YvW(qJ^YQ|40P+q%UWbGaf^J?mCG(%^7~} zVws$uVx+U=90t7O+`}R=cJNs*H_tyoE$9vH^SY-ic%myDP*zsDA=gnFN{XjF^hGeCR zWxm&&AHmJmRTDdA-R5_Qo14uA>>Ug3)UQAy-8;3;GaomUQc~zyI%+ch+|LqKA7-SW zcpu^Xd?LQ=5Dop2spls{=O?^OE=ts)834Cr8g~WgEfkU~S}##=9PV=(Zb{uwL88*l z|Dq~+W&QlEE6u)kH0KRU>RVk_;vAWNTf8Jp?e~z3JzCqI zLYmi{&kta at zP@tnHR zY#eumvavpRyEkZzeUFS)i*8=RS=c(H)HbBnb`Z&yJF-PC*_vCSW-A=)imZD1*&t~p zMy&=Mcf;;-_vY-CzH~8LH6+}I`+A{D35Q#kO?kmlr+B*-M_k at 9JL|+T8 at wVpt`SP3 z<+EusDdgUeI;Y~su3Is0KCW{l!wj|4T9+zBg&k{H({<5VzCiKR6J@<+>assfVc%*= zH)eakT1Yn}8VjoX1PXS5zp(X*<tjbFq}GH)d0QpL at j}%y6f? zs4l)O?W%nF9n96&FXLa`G758W#L}IxephZ-yKu=CgesOn7IQK-^PzJ^utnW%@e at Vr#}nfT%;Xo8xf0Z%)G%v2 at Vb<3o2#exRob;~6#u=IVhv{WlxU{5I-! zp-eaH@~LQY#^3+&3uLOr3{Cn13R?xSc26MmvI-ax7usVr)~M zfmpwZq*~Gx3c90JH>fp=x+7sX(&nqXkDFUdF6n1Ba7F8K6b~;cKYN_!=*o)P=Vxf& zEF{NiQ&%51I)=I4T(H`B#Fw*2&25$+*X=U!y8>N(S<~hi0-p4TLZjNhyNF{azBaO& ztX^4y-Y)Ox9Q?_;k7kp$a|!om8}6DR at arK@;%~(y+Z7SFT at 2xt+my zW22y+gkExD-d~rnL*6+ at -BU7jQL95!G%mHK8&yI|YFRZ7e#5oY0-Wm#vi!Dk2&!6P ze86&g7yL6t8~fABQLwrntQUpr)nP*|?_4^2e?9pcNV^!8enQgfdQLVe;UeWS3DT-k z{AqV|L%p_vPE*w$Y|ETElN8an4Ao{$4W;`>;mAt5L$l7gxd%>NC3$>ZTm@$4)IX=j zU;1J;aqwhKP8-K<=25`55!@=z*hKxO8qXpzAp&K|=?E13DQyj#cXVb`sC&z=@>bzB z7Sbj!ij(Q0#SqD#2f9hebH4u*NxrArtZrA{2ByxbE5Sdj{4fQ at 1pLrH|H_1ZPkCK= zU&A~O`^vG3w^j3C_P^bsI9=d|kN*9l0sOy(!&=(Y|F1rb{}y>5T{$3tP`zUD$(xtY z?tsh=XQ#SJ2?5_IL5DEN5IrOl&b+^_;{gCq+6omYkDXadS6TVt#G3;sb9+&Aa1b`9 zvJg6hHiHD#e`=qFgOotpfwX5vt;|i_oI0w4rk3S%Q#6?>QN`0xn;fjg5NW&u^5F4) zrt1?E6-}+&v4HvUG5aThI#OoR$!8Tgv|=67Gs^kKLm7XwCgb-C&Ok~W*`VJMIB zPoea at XvtD>JnT`J$FF3y8z82KjZB1^}LWoT7F_F6!);Nc%Du7m-&lCPawJmckS zLx$%tDXaM6&)!xd;K9syr*rh>`|}P(fN;^m0HlU!sD?<_eK58N)}@FTo9+->BWCRz zgS52)JV$)+Az>WEI9AmkWY*ffNAQ0|W;n!|$n-BV=6{i)`+q{_pF<#R6Q<>W7*Rs( z5i!0|LXZ9)?ZNQK1*t2%B0eJBoWF)`5P7Tz|TXL-9N zd;R%(0e121XxkfiHv+MNGUDQ?#RzO)w2gT-l4?ssF0o5YV00;g#X_FDtyp^%SAVw{ zJQroaEVte=6cGkwufGh-;YsXWgp1=gSYCi8Qq?>)tFdHK7g-vZIUyIt>L8Y{2XXqA z$q9tqM5~O2?5vbd>(bA5*XYlNeg{sb5^Fce$!DqAlMuO&na#XYs>HZ at drs>~Y}rzZSfv;?t{r^C^g;x~Y^Ls#O^ z;re-nR7v~@TjYFDsKkQAM$%6O2tcXj^_g(O0uO}wWyn@)njX|;NLY(*oN9DE%JZwy z5EKr!%E80~hIPv3Y>ibRjR)W^%-jD{9&?@l-{B{;Dj0%sZ{SY0(8 zqC7mp1Mx|el=o=X1{zpS%ej>^%h<)8w~UC9W0&uS)G#d)E5`M3+E`W$`PLHa;iE7! zQS!ci#lg|!Y?;M%cJDd78DzfSN*2>cqK(&i}0moQsq8fRQNRkSr+jJ|nUC_Rc;p^*?H96$x8CCH?SsH{g*slht=m5xyKp}&c z40s2j%ERV0Z+rXSnS!V?jSLJnErr1bo4J=t!oXFgt%RrB#tAMFpE_0<-3At|rHy~eU`l|Ip+hS} zc8-dAB(@)Vh>EwF5!K6h5}tVgrP)xy7(ncs(Z&PzEvX}wgucxQ5^A)Z5 z1>bAxgKiL}BTT-Gu}H48;`PguTz?oyQ|-Fo!7q4}ZjGphwQQ&y=j99JUy0BfUL61W zmjv11|0b~LzliX^XrOBAjwOoX7urUeB`ZZ>t5vi at B^j_L)S^X8(qdq(n8`vY8+~W1 z3ASdkKE1AM^%J at Ch^+sFBdM+Lb&k$EieIw5PD(<$nHmH7eC6S-n;ZSNovN_25@=??L0O zdAjaJdhPbH=|jNvsmNWarB>}ZprJ%;coiO(Nz|t50~Fn^D=7M1Mxgp_Ww0%1-T^e| z$sLv=|Bz_EJE!T8BV_@O9kSFdxV4BiLx73* z6Z!cr+De7w~;;Xem6`&Eh3C2;pxcS#U;oH%83 at cI4d zF=tA}j)h)(+v&h5V^~fXxM?Rkwd&x7BC2}KF~N9Sm>fWBiPu8sGCB zVzbQs1ZFludJQu2_#Ib4XGB6Za0R&!h++o3V;Gov&xfQ-5`1WzzBTIdl2_~hY#D0K z at i2&x!mXe%!V;i21Qq$nt~x?hQ at J+4)s6E4u7XxU#aW4t?C?>%T}UsI*=DR*_#@W~ zrWr>Lnr$N`E`>)b*e$-9x at K-u| z{$1ADKcqv*)y(War6WXn)*f3F<$HwNntPJWHHV{EHc)#4-h6R|7M3o)xI_}$ph}uLwtV(iX4{2t_c3~9xrPS6NfD2&W9CMi6d7G{K6|kOx)6Z^ZiUQ zL)HK$;8{lxu|vMo>h}PhSL+Ui9<+AtPWnZ=-n6AG^kd7_QYyWLo) zmf=1b at f0|#*qXXwzI4tqYMJYn-recAT43eXRQApFi}+FTID+Nu1wu3$YLnzhoeTK1)Mx at MYH&GsWQ5Fjm$Fk^2H^duyspoK;w(6 zIlB;`kr4W-8Ld+=KkksG&D9L|PR$6Y)R1Aw6{GrA=@~B?Attc7Kh0m6CqrZI(B91% z+ZT$ESgV0 at Rp&JA+dE!EEja2H$eb|HUElazS!;3C5rQxo6b1uBqa5Z&aMcX+_Vt&3 zaJ3AMD5Emjqo4tw)FLQjmvg#$9T$Js83u<$wLYHO1S at uRHKOmw#@#<<_zQ*zogkr5 z-T@*cZ&)$)n646eBUHRhF67BR*pBz^D#V?UpG_=9M_xR4R!1 at p}*(wKHY-mgAXnbnj^WruwB zs{0&gN04)MVZ>nV!iaFCcOf*JnRU9e42nkX`>JrCTm*vi+$l>!z^Cu ztLSGJg#%BN>KpW5hb-%ue%e1~`yudu6IvnbYU5)0e>n3>l6K^=#Sun(z4?r7 at DU)` zAV~;IOYY#Y$SGlM-x9!pD2DIIVIQt{#xZZYNdb3;x zx_{v|%=%@vg`{z_%cM+^(rwkS?}<7}rBvf(H~$O_M6Cj64UUN4nR{(x{*i>twU%fq0 zQNU8LwQ32rHh@%?R#^9h3oWrrGzYeT>_L6-v*;}^|0mY41BW;hoxb2F+(eQxL_h8n z#dxe)inmxz77(r|>K;tq{>~>+a_8iXq`wr!0)QDSFt^XbiBBkeRHsCp&Oe$C$)XMs z*&`sqr~VA>74~jbVvJQXzew#ppRXy|nInvQZ2!8Vxr2QHij&K51N6FBy|?QTKU at qh z at DDb4&26_0utQv%w#nN~9 at N$jp-XHG64j#!hE`Pe(7947c$txfAq=7Tn~X3MVKSP~ z(^Rwte_#A!Kh+anbT&wj5RXC3y|R#>ShH*EE~54W=b*o%l^&DffZvK$U=qp3?OU=? zxbH at x)Aa at cR2m(A(M at aag5*M(MDp3DpcKD!ljIw!WzX>vuh|s&ly&2?sVFn1h`p>m zo at i{m!iKDqrBtUV?ZAz4q^iB~Q53vpuQ3^>EmivNtA)>xx5z=56Sr6N_nVB*4`^YA zuqIpJ14Y3M5}N$OO!h|^oij>}l_e0!8nRaRtW+E+ at sPg^40 zUB5uBVptcc;h$ame-#kLsi5_LWbm*26%nF;7oYxLhH~XAx&PQQ*4eJ2QV~!PP^sCX zyOI)qC&Xg_NhVPdvdVsP>V}$*xs|TNKQ^!^O0wMj<18tsWw}wym7ST}`DWdDHhc5! z{b~^%Aj?BT7_`ksquthUOAOK7CX$6_v&CU{z&G?96CQh%2?d5ZN7-+Lx1!s3gWt5= zMw&DUHq!25-xF*zcpnkzdcP=5MQF$* zC2sCf;vn*>=VbhIjmq5)3Ax9FkW^rFY&ffWT%7^n&=SfevMUaaKGo3WUd|DP*}MqD zubnWXbo?|s{7;ueLr*WpP*GAn`S8!-mK6K+pZb(8YBp_No>I7$a>Yu6r{4{sS{)KW zF!`sZTDAoO^ah>S_|yOkap6JToOJk9c6GSD8PV)EaN7>`XdX zH-~h{a%%~vl)vEql{2;N>y~Ih001x`|G%7J`cKaM*KZoIl7MJQlcj-4=$2^VB?MF< zRcllzN#O+(PO}bZuGMBX?n`b#B|c##Xj26CfnOkBb$bD^KzQdUmR1&)^(-{Z$?&+ncWSTMhNZr{I9#m|m$qEJ26L)2 zkivA}FgAZ_Lsu-phG8|`)Z$%(Cv3=!fgsaDOX8mb_rc?J^@!?FgWDdv<4jaAQ)EE6 zj?M^-5sgdf*?h+BI7QjG<`z_N1sZVToV964ApbEGLoQOae^;DDW|+yalvTql<2TwV zIh0f2)xYAM78U_vQoV;bxV-4JlaRZ0hVQ_x7_Pe~NiIpezs#$DYcEu!W{L40D1NbM zX+uG at MG&LYlLJ{}Zm+3`E>TN+_AW?M+%}o?Wstwu5P-S{=Ay%7u-h1bS7Fq($6KnX~{3dr2R}2Ha*vU90`E8edtY2StQhGuJl@$4ARu!h2 zxyuwI3(C2uLIl{HB**gNsYL>2Dtn(xm?m1ea?hBq$}cv&jQITSH=M;+?u<*Gho!ZGm=B&j{f2h!;@3VQeOAZ7TJHWYKWfe_5lR|;F1df zfZ*S<>VLPT>gX&l^PfyJ*qeDk248ZEAsK{{Mo7~TDiRPP1&H*KkhF3zz%!Yp_iM_` zX;sN?c51Y+wlCqfG{k5Hgkzv zI?ZyvY(m5PyMO2c)C(x#q(^~s^oKZ`@FBi^WGoYCy$aOg1?)LV) zHX=_wK(b5ax^v(W8i69Kb1_1ta~7hbJ6W|N)99a0*j!?mk>bW9HKq+(VwB}&uS%bW zx~@6ip5L_I)gzv at PQ1h5u65kk(iugVW~y}`FysgmXLGpG;Qmg}jXR;w%2p`yy>nh1m;IHMkK6g`2_%iWueTP9m`XP> z9kFR+#@XhuI6W;1_lhQO_MXS|MalFXokyYx-Lw{2Hu37roohC_m at _xxWH+quU|)sY zwufoc$9(0Hiaa~w+|HSn^4B(uWny zsM;^Uu at 5P-;_<1t3>2RiV?g}^>XT3cks3I_3b9g|uP!=P`2 at Q3Zed=9Wp&^DZb?$c zwsw41cNgsQSqra4jO}X}jM-w_KeG^PP(N6gs?^4eLGc7CUFGY?+J(`NsKCx%j#q~z zR8CXQyX{z|-1?FJvF1SmqB$y% zo{ELu-{B*jwSjt66%xig(^2l at F)qQfqWV%hDA)cyts~Wb$HMT=(=Dbi-iI6!DsiB?16;^s7b(~{EDh<)B-u%YB}sHmcy_ly4nOJr_>zH6U;LNo zM+Ib4PiIiZ4=%11fb?%aUcsR^A&v0!Bg5I=Yc5Ykw?)l928-}e9MuW^*pItdN|Mee zhAC6I>{gISsihBLqBv?3?IK<(jcQek$7!wZpne8pzUT3nkZNw?OOXm=i?WpKIF{H{ z1j%u1Z*RN-u}ZdVCx@*D>TP3KmLAQL zcH8b7!u at i=U61>Mksy at wBR3LTy271Go?MK(a#o0JPP$xF#o2k~S|et90>O8n*i^{9 znabK)wWG)zbu2V0o(eEW{Ts!C$&=+MvQK~pk+ECY1!OVvmd8*flR5L+c}thY>ww+Olk8uGxX z?k5z)IcYOsAuP9SoPJMJF|akww3DW7zrwtadtF0l9d$#^!HTOBwGE7 zi6^Oss#sP}q$bcBKW}a&CEE at Q!O<1oQO=~mBQ1&89}AUPiqDN$09}GfST7K(WUI8z z8c?jvgi6}b=Gc+!sa+r(7!ILc$2VFmEiNR^LilFV55p=gr;?4tQ~Oh>vg(qylHiaF zr&_dPrBIP1r^75>EL`v6^&4RmvTQiLZs~4awz}1AM33fxHCfc6U2ap6f;He5R^`3- zfZ;Rv!x`PoS@;4z+JWkZbS at k-k#K at yx~gBM0YuD>d}Io7l;N38Nu%HUSYfCyc|v(= zd>OCXk6DHt$60(Z|S~c~{w2(RG(Vr7UPy+-Q_UG+85|3DC83Zj$uZddQpdQ=7a_x~}uR5k#A zrsnw7Y0{VD-Q5NXFXBXO&W!kP2 at aGl}^m at pQW1BuigqCa(_Ao#JR;Q?hz(I ztY5+X+DzZ1h(5m4fbZ+ji%7>(Y at h>_1X4DC-;rnhjw|Yg){4p!UK5Vt-tCG-*9zuaFwb^f~pkJsF-#pagihQ at n0 ze%vwX`HXn^!t$X}|F6|Db5GGFw?n8W#onFflyg_}1*kQj1PZyM4#_K8xi=xi{S(|_ z)JeZhzqT?1W3HE*pOog9nKs<64{fM+6+Gf8O~mtXH>=UfKt!0qC;2G`P)kg)rHOqB zW!Z~mS-RZK4>lF1KkMVG#;00=?Pkq)&_^eR>3iDHgzw2JWJE{JNR~o^3r5yXm)A_S zbi`vDk3Ix7QP_OOaEQA1N?bfRNU$Vs9TUVIug@=IRANLon8;Y(?T zKltw?o8R$#;#Z?u={nB7K2Hm{rM7C^ZVR5x(y*exW!0G5hd8+I?$FjmI?Z!tZ_xdT z=rl4;HN3V2zE!i;micA)i}KBiXTiyMLo$x0PB#yaE+`_OpI|guk&6A!RO{?k+-7Ma zGqvP7l*rFPmnY8*Ne at tNh%Yh&I-cw9K>`7(xIVF-G1!{QiJINB5R$9Y&!FkCD}zpT z1W-_#W&26kO-aIKsj17;rRcFqqdtVinU_5 at xZL=47-O_+z5?VAq)u-YL5%LLQ;&)S zFwUrk=j*$SG$$+HH_YVJwa3~I!Q>o2it_5=DJY`R6K05bxuVJKp7tBDTRR!NnVt(KlvCe%ejb4&v;b$xJ~w=fNpaGB-Ki!MX!* zMiimg at _oq#%+!L4#j$U)9+JcojbZcddAUZd84nZt#l>)Lt-TTu8N1z%@G$Z%50BXr zs&-ztdUW}0r4Hax2cgK43}+)o*UaA at jot}31*BV#jIZF3OLqZhBQ)t- at A-*+SMzE`h}#() zj^M!wzA4_3IW9nmWBg)RnKIVh;Q1 at PGetNwM%Nmv046oK!8T?Lb{OlFb1IF3o&7|{ zu8-0nTP49Bm^!t at GiBt9YdWcbV~msS>%WYmgx`V$I)ubE1sj=8Xmo4urfbi>82V|} z*pMz^f;Kc6Tbg#I+9TI2cGZzzSsiNNdV+Iht_W@;t^w0cQtyp`i;2O`=4dMf^~7(w z9lGH<(l5uB8Yg9~vgo!UElj;oeGkX=%u>!Y~m-at=qop$BACDGoE_ zaFM;N0VT$Miwo at lvY(yKCV9T)@nGxtGPnZCblx(>*K`|@uAAS+9}M7)nOwm1P37=7 ztl&OtT_h5c*U^&&m}#b>B-u218_Hy;K9*{^ce*2miK6f=2kXgdsf-ruNld~y&_{=T z7=T>{@OU6Z?h;Z2gjtRh9Y)5 at cai5q=@JAzIzcJ&;MufP^AQ&A}j4G6ULZV$)X1 z41E)MR9g91um6EhH$w_}_S2QjmLbZ+tnBb at 6~y-Wbj-H7S|;zN at QLnpo|mVL;XuxT zRa+-!TFw0cpxw1cbkJtBQGU-QJ%rg1Z-%LUCaz&d-fHZ_Rk(F7>5FOchz{%5J|Kl; zy$K>m!y3Xs24maUQbEUPEjgymgbF-~V?20B5KpmnPht;aY0jFmL|P`T78ny9+iffI z`Cwoh at 5rCp2R14XQzf_+5}a5PIM$-$-NV0PHmHTwbWWBnN$Co3oRv{cid-9Y1ToD4 zU&cWA!hx?PL;Y-FGhAGNiv0^zbX=`EXU#QT?Gh+wOJQLeMG>LbsFR{W5|aA4-QXv< z);1^OYao~*9O1(P>oSjpc0>8LdFD_Ft7*Pz^Qb44Q&Ghx4CVq(?iTft%{75_)p5 at a zgMWMip42 at t1rIY7*DHL^&S5S#U8Tw52Z#rBWOtSTdiEEj2bs)ZQ$EOS=$l8aq3*;U zrtX51hg$U{2*s}x3-rWtu`FQv at UJn7hn-!~ZYl4yXUdT^HVAO`6C5Uhu;;(bzADK#>s^5^xX5~RwcRI$ zIQBj(Fa02HBQOm?sBRG}Z38;gGXJtb(Lly}&~L(MCxYgI$y<4)RYB~zs&}Op2xS12 z#f|FI0H8F5r!l;ARtQ$c2=&Bx5r^dXTDLaNpsPSf4vE4oON!r-NtelW!)v*vH_2fL zR=W60tH1F9E~ZVQRIMvCZH at e0sGc*ed0^apKu~-_s~>R=cOMu~^?wE3i3$txilC3m z1$O7gEBv5N9>Je=@SGoeIp9O)^sqe&(1s}ykFPEPi?@Z@%Kay?@k0 at c$}#C1g1mMd+7 at g%UGX#FA|^?n10m47FC00|2fcQOTZb zOR!QRKFzvK&0U(xx1P?|v<$SOys!oQj)m*tQ!6;9wBDN07+9J!ziJZlMcZ8z%lwU!uiw8)HfO)<&vhy^H>2maO6zb5 at VOR!#z+F>ohWh}S->zLe2dez$JN|W~nV at T)76B`E`x(hNcPr z>8cabfvcUe$-zyNBsVjD(c>YBE|79zm_heEfaeTpER7Dd&7}jugVJ}lDA}?EDy?li zGW`_w_vvO+gsn9cN at 28{k_i_nC||q@#4v|+OSsfAw##YdRk5O)EnkN1K|E3HCg1Iq zHZr(mj=1wfxOA>$l64>1Jf+I-Tp2%LnMAu_%Z1owT{na5bIu|1{ z%l-U9Hw|Rp2!(#e4Yg?ZMWTm-JLiRiSG at Won~e-zE`V>o)8YhyD*_NoZ at 1+R_kKu- zr{PY5;CfuSd^wB?stMXAxt3#_^Pn-e`loB(9KFK*l1dBo>~IIpWE4x at DtC07RFBB~ z(}0Ljcx at 7mKhVmNPKBNM+K(xP6>8nRFFa^x#f5wv9owd7L3w6rdVon`_wSU+t5GdR z1w9-m=DrS8s+_~Ee6OCqH{0@&&T`2698Pi-HzC#8i&3nK&TPx*@aE}Hhie2|^0nUp z93|ogjgJ^psky;SXOtRbys*^8=DQYWnh?^n{cLBT9Qt06bV+&vdS|NbnqIKa683!u z3t6{;k8E93-N5#eHv^*!-nSKxhBj9dyBs*utN|%%zRYIxXJN{xCmgXO0Az!c=|KmU zs%C at E9Dw8tRL?@Va)oth30oYGES2Mom6VsV9Ih6ulJHj}Myc(Fj;3jk{qz%M(&`FJ zIor~bzQ3P18lyOedV^uks1=IqUYHV(?7pxL2kc0D>aUv#J5vvc^2eysd9h7|MkFhnc{8j6c_-27yRG2`TyhY_n%w6N>p@}ku#W7PQ52F`4=Wm%vy-fXNPw9JqAeb}yi* zB!1z(*dM3_W{W at msi#*Ln3AF4(`^w9?B3r$HV*CVA;E_EoSlTy$rT&N6?SW|!k>zV z{tlxAB;gjTpzqxE{gHB7-kwErMId^8sRH3Cy!NvHn-Y`@vGA04J zLIq?*7HF-mLgvM0Z>^{Gykc07>?OsJR~ zrIQ$rXYgB(gagF2;e_~;Ly`HrE^u)g11lo#t;3ujW z3ERyxNl4$<++G9P%sxd6#+t+`P#KeWKF6nRy>k+vwqRNNOls;%umq44!sJ9^W{OBw z&2;^(VnavN2Sp1%?LF}pcC}Dvi3;GS9X1j_U-B+BF5ycFY^%Y;Gu2ue>= zFH)|(KHn~XeokL`0lff-B3$WEzgGW5=0WEQ(?@UWZ^>UqJs2gYM<3AK2-AnoF5f^K zJ4{SbI`Reu)1eib4J)8ePBa%x1tQ>v)KTQAJFKE2JZ_;yE%@^tCYfj6H1WAQ?5EqC z6-kq2H%6kmE>nva#--z_A8xCgib6F}rL|~PptKmD$JblWFZS#m!CFrLPQO at pwYcd~ zM?=>c;|zYvIlNM5n6~b(SAGC()a!Ug1pz9dM(Awn;+s6NN|53{|+brb%%qw)FH`tqc6*-3m`n$PC%$tMZ%6CBUc zC->#YPX^z*qc%y at NhI_KWQ~ySRGl3k(nlMUqXNmi at yJZ_Yh|c~5{Qn3%v7P8LNoRyR7bWD#3he+spe;pJEz~F&{<6lFCEKtp{EsZl zH`tmlJ1xq!Gi~(Ogv;egp9lS)$~zSv`D`E4NDu at z>2*&a?qY|A&PLn}?xXWZW5H73Hg zXv(ny;706e?FR-`RrY<=8@=P#t_jm?au`FNkklcBBM$k{{92LCrT|8d>RXWM)}}NO zDQeu3v=^=X2y at fAk8%jToVpw26(oHs1!e_Ow!0?QK*$)bW5C?K zJw at Ut4g*}f>n*Lfh|j*>S5a*v2k)zxhX4)(U8?lmR3VaX2_wa*zJB)ziW!aC&&tsHchY|H$1k(1rot#De z2{~+MW!)r+rfXp|z0L8wxqan)-Em~;{d)Y41$a5|232GuKTHbvU1FRCcMt`HH$&kD zNXzi30L!v(42o+uH8mziE=OM(r>RO8+7#f9e)XIc at Hkc{ui_6WDI&uUvN+W>u;p$7 z#bAXYi~)@V^c`Zp28@(pSa{k5N^PTdUzAR{f$XBQ+Td-ih~yQxQbj|+Ws&xwM$cJz zO4ghX%Ub3GqePOzK4#&AbuS&u at b0(oi=m1!a#)<=75B>4K^@zm^kd3 z$6x3tqFt0f7V8-gP at E`!g!Q{=;yFZluJwzB;nHTb#4jhF1jy5gUF$D4Sw-LW23;%L zgtlNJ$ey*VkR2982zOEFdnaS%7l3LKUukuNH+>Fk#U!knjyihe2(pLL=o`NOG+_p- z6j(SHU at TcO=%^wNVoi0G8*t{x-J{WzyJ0yIM;n6<9umQkYQDxq7@{ZM*F?P9sgIz( zbX634-+$Kp+2l1GLO6I779aF0-VMoGvF#H3Y{j+)M#lXuoyS4To| zwY0dYu?YlxlSMDS+fdQ#eSt>*iH%rSQBEp~<1 z7^m>E;T1R=QNgtSJ#2u53;q^H;U9PARj-Ke(l1G*;R)Y!4)%uu=oP06AeViten}yz zFQKe%<97rB41_dbiFl1tq90x$4KtvqG{E(mu$b(^n&|8{wsS0BHgRrjPXCK`rltx) z)sQzB!!r7yHSI8a8^8agh`rO at 8UD37xbelw#Sl-wbC`*mQrS1>k`OH|fBTE^FlkhW z0tCAf!A4I^1WMT!=#_Xqy)=vqWWJB>6JyW~f3}Xu_4gTtF!1aidO25&hSVIm&xG(Q z at mT;wp(*S(VCW6XdlyW#H^${hI{VqPO-v1b*F;l{=+r{`SyQa}%z}mniP~3D9(Z?9 z6~dt+(*sxE>gk;}VQy}YrpkL7hF;0$ulr^tJKMc^mUTjXS~-?qzZZpT at +*Um%+}7# z%up}~o_1x4XsgTfIoBnxY_ykBf@^lgU12*@m7VP`Pg(k^r>yCaqQ>I+hG?Buy^qg! z`sZunDk_UkG0)p%Fm2?5cZjcB%Mxr71K{0oO(myfaJyx2wPkSa$zoaJMUx70OX73s zH0;tu00pcIHqMJRdon%x at S_9Zk2r($<88 at m%~Z%G%XIk%S5Z}8kyXD_Du<$(1e%pZ z9 at xY#Rp;DVfzBgE@#k4(@t-4Vka|MLm^yzZ*Xn{wY$*V4I{*fi0TS5=0XT&c025Ze z67+N|8=iMfai(%lgg{*_vTa4aa(B_a9XT zzE1)wwSiCdc{Q?dQC_XPK0qF135e_?@^U z!ofe2hcNPMcNE=&+|mB?@^6%?w_Io-AX0&bD+ASoDgu48t;1xJXQtQ1Ud$@UK|}oj_$IlTCR#`lIj5#)x5qlp za&LX#KVG{2&FRPwX~{yh)lz3e6wAq?Zh>~A(Pp~OBX}GZ%B)eYr)GusKy(wV1*$_9 zUIdlHnAB2~FwQb4@!ixpZ~U9dIXB_ghC=wZ(;D(T&uuV9){FbvaXiy&czqm<(G&n! zX>n3m20^SLe~QNDsvzwg2Sl*wXue9$l8$2^5e4ZRU5zzTwgY}b3T83nphY*miIBb_ zk1gnJWLQCptQN+4_fGyDGQ%e4tv9_ykxG3q2lH;c|A9CrV*U0a~Jad z19d(vW=dWyjlRd<%b0@;;?FBPw)^NSGZf=?^5L$AHNJg0(^$EGe^QMp&-Da at ZL4WVQtlM=^ZI(8<34j{?gj(s>f@|LiIDe?o}izs_6!8==f)D?9^@ z>J?08am&_fcm&D(5U60YelhtkroSMf&RnnSEdQYbwUp=ox{5`*wK9mVHwUJeW^k*ZA1g*q?;5?NpxsVy_ zPQ_T(^j4{4`?#{o>!xDMUnzROm$b=qUOA)@yN;w|xfY#wPj-0VwVt`{N(x%A82tLz zk`+LhV?*;HMspOdm%@PhIrYs06=pdIBN`3Weye_ at XA@%|>Oky7fX=(_tQTOl_rNe$ z(NF!1cxrL1=sfbRNknN4Iuplw02;5p{i5^d%QP*jFGezd>+VC7)h6*{cPdbBjw#xV zZ#fOEamooVyKZHw!dmO&1_q-+Zwm_mM1I9M8M!gkgM)@)ECpEF0H@%Yt#j%bN!l+1 zJ6!oD8Mr&~B%5HQ%4sDTOhU2!9DNg9`PiMwx>_KftO#bEC{@0j>KVnnc3nE;i z&Tl}JnCHsR4T?bRC4BDqK)hmHfZ2^F;IxOi{)X7iBtsl zx{AUrPfyx^JP%u4M|=oz&|w=5XAyDWzD?Xj^sR()N(9^aunfbsGiNf;6vjPWzqK0w zD2Z8>w<(5dvGgzLuX;9t%3gEwX5BDYqlpFe;ZZTpB~U~L&&ro`_5NYFX>z-puy8+0 zuYultc&YA7-t{&mwdf=OMsL#IJ>{Qn9EeLSWy*-yD#rlbx(F(!u%Bh;x|laiqgC}- zn)yu at ZwtgK!6fg>v(|;xJ^+te#WXvew7QI5yT8!IXa`~o$0zP#6+zWVU*5r;D zPc2?de$aP9t3 at 8bV^_hPF7|N!)iXigga!`9!o(${92i20SyPb5KT1?_^^RrU z=D+DQA&o3u^BEGe z&U4<-HM#sS#-XzYs8+h8d at gVrzu>G+<7ZNV?(CDHgQM8QA-$qlge2Rq#tz1)5*yDT z6Za!jgJNQqmB-gNNENMN at XHQXc+4k%K|U#Hy at WSJi_%B*r1~D?in0NQm!99{0%T&8 zfQ#Nw_3CiDNVQ;VA$L-9QIutzsIXz=mlWI}%)$iR;2c}-&~Co~!|t#_LrV}+O(F^E z1V2xr at BiR%!=yBh?k^5y|6OkJKXUlrk=~ZJNPkJ8A}+L(Wqx(_?MeicQm67eu{5%v z1#vzLqTs=(aXOV?3Qhy(=G*#PAd@^6^ZnoJ&C%o}%$-;{IUP@@+D~~-PHSy>0k{O1 zp at CZ+$MiP)vV~FXSwlf?j>o)q`NsLy`GWP&hh8G|nXo+qzzGI58f|meQcOQhBI^aycXP)>G`fHH87iJ?wGmbS1A^nP=92s&0X= zyGaWB_Gg3Pn0br6RRhVzLwgR#<=$=(Rk_!h at A`%WuQJB;=Yt?4^(|{|3&#`h|P z#FKrh?q#L4MmPpvdJ{zhOb)xww$k}9RLJ64V*VJt5 at svXl&^V{L%cir+ zgr;%`fqpE+o4)(c)Rk4N7mmOH0ML{Co8KM(K;3^Z*ZsHf;$_qyTN6^+bQn&^pkV}v zv}F1!OdturH9j#qJwmg}#BoXVw5g~@KegnQ?v<5|jSlGM6{mQ#%7!!wHO)(nRvMS) z&x&TxWtykn*KYUp^e+GK_p8xVciS7z*R01sr(2FQnX#pRKJN+vE`)Qibgt|TX?d#m zZCJ72szN-s?ezHuPq*go-U+<`b(idP5x3S#_a$w-Fg_#gczX)=0a;HD`B`xX{0XB5 z`Q2T`pm0;*aa{~4z>c?7nYjpiujcQ{uomrve6W*caTo8HS!D)t2)SZvf9+$r3HW#^ z4kp at 6^()$NMVl7wHQI26+K$JbGI#BXBrClXgrshj4NqeBRPS>Ffl8aQ=JwVbPhtYj z6VjO|v!O(O3f#-+(&cmd0YMzGf(iJ)K>>;yE0_8?Dz}OLLSMy%IJXY}vEl9*U&T3^ z7+R^@{dM&u4E)g9eimg5I|O3V`Z4&u(_`00TjuG$i3jHntbbck-E%hLru6zengS^W zan8xYXJLHFvJ02XdItUMPL2ujOkLTax`Grzd@!D^bh<&nFV-7k zj_`X6{S5m3ApAEdOP3&4^au+LRwm4DYIWX6&V-g1(@SXE4H+UmcMZfovuc>Te;l8% zO+$vcpq_?HClJZG{1&RXNCW*Z5eq7bC}&j7;j!v=x&-GxXK5Bqiy27N>2BKdd|b@; z9*u9CIbpFBK^ULz6$6kXMm8}Eln(Kd`SV_MD50E=1IgNhzX4e{E||wuf7)FpJpCCJ z;EOAeKY}5-k5*HUhmtCky65eB`88zmlqE zAh$|rg8Ta`{XD0IeYla}>xwMiYWTY9EA#txd;^CkD)iV&Dw|OY3H$7X>-XSAT_BrI zRN@^DT&Tq#Ly-wis`tLr)CO)>4eNJ=>bM6Cc-e>T-6y1=968D}Ii$ci-`acYiK6Kx z({Xf(NLW=(MfzCU)p!C1a?i`Q at NglI;`7EV>T4Eev|QZ#56;eHo}f_Rmx0oArNei0 z3hze-?RDb at g}JPlMEoT*iIiQk-sY(k$^bWJ7$uoCbV< zVBHp!3qWq?Q1uMfF(zk}+b zrTY}>rB_;l=IdKTf;yj9=GUbv87+#zJ8E$CPx{iQNq{asie>s*3(Vb97U_ at Sg!hTa zy>3DYH+L z)%xqCVV7R1dw^Q(>siUAd8P|IwlX6bI104{HH0W;^#rT_d5-Iq%t at 3_`uHFeV(`Z!`^FHFbzTn-h6Kj+ zVa*2lbQTmy6yYe(!2s(VTY99 at K`--k172olQrSy6`G|3+2#lH;W8fK=6$Nms$|B-W zt5U1NE~T1e+U^($jFbf{>pJA;G^jLbA6TsDf#gV4vs|F7wc;mf at 7DML57UYY_FOcTU|hvZLZD{ zCG~1Cs9iZVM>BGmsu`G_`%0dql+nx~8mlK48G&P|9yk)WYC8Th7uN;Rj!8F2hIkof z at E11BD|0%H#;QD=iw&Q+8`k|BhwIBp+W}IYn`W+@*I&`T_>`?;#g?6pW%6KC3xE%e&=bU z-;Z+TH6gi=X25Mx8LonZ;J=;OCG0_sYX`8krcYJr5o_dsRFT=Q52>7f|M{g)6c2Gz zIY^pSZ8b#@Aah~UawkzvBY`nHv)?$aWi2cT9m~`fI-c4Q zJ2y-ov at 4^!0okq%YK{SP@#*5s{9CKfc~23tarPMyGVdqa8WT-uhHwFnZ#mse)E@*OlB5 zsjG`7C&_h4*KWuQu5hPK$?Bn2e7W4MRDO4jh{ClK6|FtZwCstZ_)kv=5M?`5%Vp{_U(vC~WHwP&Xu#r~I!^yB_5 zlr<5PKMr0imk=m;78DKHp3O%zG%FA5y4_p>*5g)nzLR^vMZZW1O?o$KMW&M#)*CYp? z>jUiZ`8yNJ?g6QDwz&iCLqp|=rhdx;A$c+5&OVqa0xPjT$b&$Q5Wni6Q1JN1~822g_nWX8N*%g?&Q%cCI2p6+j7P3n=^|%CV*akCqS{^8fn0*iw zS at DF-Et{pv94$h+ST2q-mtN6scV)^G52bIR-)KYFtYOv at Sdd6#fRj?>vu~}MkX*f~ z*UcT7R+!l=)5{i>QMY#Y8hYBIs;K$dT~itvl1oji$3%1H_7H>9 at VC;4BjgB2)RgUj zx;OcAi*6sKZ64$*9h7m~*C$@PlC-jIAB?#k9jO!Bv!iB&Rh)45l?yboA}kOVSypj} zo`BQhf!orlp7wN`J4ymF`Ry1XYhVmJb?@?FW?N(JYV|iSuH|jbi%9P4RD}@ zDEXV{nXc0)XC%&h$TUj}r26B%n}fVR1Dy;aP}`2!nTu$oIXOcHQz=7h={#$`cJVP+ zS&Pto&z*3xZR}DwiZ@|v$msG*l7j2G;9GG#y#ZpL!Ur!9ir+=o>P(@pR0%3ipUBAi zP%kX-vuQoM+WZI}>5Y6sBt+ZKgsaa2RjmZOAr6 at 4V?}f{g~lw>NU9o;s*%a+UB#Lj z3T)_rDQ;_yh6tCQlCH2TQBC0}n?k%=Nqn0n{FW)220h1^jUsAaO at uWKXX=9k(})B$ z;^kR}kI9W25mxsH&5adnv|^9^UJ)z0(eRj+OVN(nL+NN0AD_)Z-#ND8TT75w#$%S^JKOn6^HyBDNnn$L}F7 zZcJ*zn_`@xMM)1q52X?}4=zUK94Xz|A~L=M%aXZPjhkTZ at tN)swAs at JBe1M67 zLs425SssPER?56QP|Xgd3JP^eVd*2BFiZo4`hZMCSVa)y(u{MlNzw3NAo)*UGS(kI z8YvWHX{Xy*g;{SL4JPe1(%0_4Rmf(2()0Ryf5Yv8)R4`^j-TD$tp*a$M6i>YQ20Nl zp)nGj1f;3c|1xYt89fG(Iyy{4UQI?nF;tTaL;DW-^}9?Mw9sHRhumqlEeC6g0>&gI zXJhs{>+%#zrx}q7oO!fHDt6cOEUWkC_Y-w{j$@;|x}(MGRWk$kx1`TJ&2Fn at O_pFO zBA5Lo)OvA&?s&3Suab+ymWr2b-KmiOWpazdZy_z&{)^vy1Ue1@?Im|LQ*C0W!yP;* zX?)Y=tP=?+ at Zs;jgiA5odPG6%r!0Ep;?SE#B9^&w-(v9=Q*ahAo=t6%B~9e%lHC|U z#al)9CT)gE%#zMz64O}2jeF%OIiPEf*w+Y>4HNtYE^4-vvI1VWsynMDjAtK#IhUAM z@)=w>@l#!aJU51Du2}T-OTz)_KkIlyDoGdE at K55xA+h8A3`uMJ#o?MNTq~79Th72X zxdiUwJqk6RE&Us5=BC!HcG>*H583kL-gk4zVXPPGG5r-kFKzM!iBLU^4^mi_&oX!n zRtMWDH+9HI5f%A23Elad?C} zvsd+s3($|j?Lj=t4z94cct9Z-oyCQ*zryRX)O$uX7W`Z z6xpL=WSe6iCLzpsQn_l!og=G{=r*vW`n zPomHBRFVu1$g||`l9G$GUv3Dbr^Mo4ZARN+CkUi(@DWnNUeO^%Qe8M-?FG8DCsKD1 zgX>A9rsWE!O-o9HOEGtLTvL1W_G_Kreg|Cho-wj{+OlMO=O_Ae3I+5hZ6dumhWT%b z?ZG*!pKNU#+T+Dt5q$PG7a{+$={_}k0O~Gzd`fI+*fc=|X zEkP?=M`L}1|1NJ2ROBbcjttI*`#V6 zcVX$AF#&#NeS`i2^(vWJx&Z$^i{hjm_4G^q7ZT4zM1<}76(m{U$S-G at XYu?mfdnuka zWQDOZJ=0^AHEbC)(|s`jLZ)v#2i5V?)N5#3KoL_O1SY4`eg#@TbJb+na78DSD+{eT zWX&E^^l(Uz;KY60K~G$TzOKM~DRQ`?m)%g#=v!Ve_bz;i9;Il`d!FcPbL at SYO6H|J zh?;3P?Ez{u1Q at GzJ$mzTV?q)g8wGmzmnn%9|C1oYWk*;_X^8P%8x76T-x$BL9^G?G z7A_ at ytiPLB|0j~qUW>aT>#F3Eta|!3_cS}-^$hK$|@~wILp6Q zT5AwHldeRTw1nPpuO-~}uDb6cY&?Qf-VH at f6vv@X2{fyRSxq{CIcCAV#UgdDrN~FfZ_rL&@7HpjsIw*Rin$ z#srWt6tab3nRdR3BGiP_JA4>2E~%VUmOoO>gJli}f>jPfDH>oR$D3+^v;s})AK{Cl zFEUb)7a-Kq4fdmrDqc!l)M%crL&*oic62T`o^bveh9wYA;HJasL_bW2GFe at YWud^D=%`$;gZenIu=HT$6;D8C zNMi}p&AvTnQhD5ELS6QbWd7l3!cR?IkwWtt!+@{y3^kap)lWqhS)xv5E{-%=LeTHn zfk1LyP+wIkqJe6mNe9-ejtUc)?Wn)zJi7oo3^AOduwFG4eT?BHNq*kmAh1a#PBN`0 zN3%m~b}7IbEdgN+X46?B)mT*SgdMisvdwzdK8;Y5Ya?;THzlH?g{s`RYA!3z93d_t z${OKfsV3~AzlrEx+UzVzStg)aa-vg-DL`u(=^%nm|{owUd# z at DTULvB;i2NIC}mEy+;CBYNU+mW^k05CPZT%b%9L0o|1Cx%YgAZfh)kgPf`IyUy2h z8U`5F*k$IJ)!E+js!L-&K{Z^Obl4?h8oE+r|E7xEq>?1#+psz-XR_8DlpbTZ#vsh? zU3wQbqrO0mL}loJ$)O)e-ce)8)U;%}uz!B6fto5U!Hry7>7t3`;F%>FXXmAA%(B^=9hAqdsc+8Hjdm4lhB}u at o=+XG0%b?W=>BS~S zm$gW4>9um4`a at hROoaqa{n+I^xB6NH7aQ=aMz=!PPif6RXx#i8xrNE&>#h{(4h5jd zN`kGdGtO5729jBMSY&JYA>tMJF&$E^2c^zyz628Qk7Q at EQNosM+Jdu&c%Rq9ywhUe zFVegIU)k_;96cv5_V3*8lZS|1&OofqO`0NoUjc1aR#@zkVlk#0FlNqg at zM-YQsWG*=jfw4lXsWdIBpe_=Le;%S78?gAV^($; z8>GO&PN%tLTIkgbRPV_iuvZc~aRIz`a*Zf&PAjJ$0VZMrgtPz22&(!3W3hUkcfpYu z`D at a4`;Y$&@tpdv70N-)fMw{;%tHu at 9W%2nL2L_Q_EU+N|c_mBh;= zS0yuEq%+c)v88sUMwq3bFoNFHKe?b9w>stHB at P&PZ1>E3c|o^Haz9s46 at ZrfkPrV5 zW5o2gG2^ynT>ka3M+f<@HfMhyv-DpVIR|4y+rL&8Cv#gH$NvsuR>V|A at j*jWfwC|+ zScqGSo)22(v#`wgP?$#uBrxNXcK$F{x7Azpws-j@{YRA7dBb;Zrb)LB*)+rFCidd# zY7!t2ItAl~+jFLU)^Wy>W|H?$&mZVMqAs|@NV=XVd_NLT_o+ilPv3zGcFzjL>wW z<7zjG6I6N2lgktW%jsi>2&BNw5BlL!iiVL2>*oF_?)v;VGM#x6d3FTYb)T0kenD5m z)IK)5+cV9V(hV7F#kihJ9{$zB2o=g+0 at lfl;fyIYnfFdeUp2jr^Y#i$_=)CZ9Z&1krL}IOGHwddU at Lin}nuC3g803#Gj3$k2Aji73_xpAmv4 zLd%Bc5q&E2TzC!Y^`p2Nv5pMe3lBwocLrr`M at ld8$(sHSDpFL;@=I$$gIOcZ$#h8! z`0F1wVhii(1Z9;K8DmA#_sEPA&4R=Mf>XiYFGvrXrYj{iIdjO_#53(VSH{8w{z(P% zR+UnX61T)I2T*o~b}U%d>g*;WDC$QAYa`HbfCT26s2zsn{MMN%b9w_Aa$yG~6)p!c zI6Kh?s1_~Cr*!M7Z4 at X2Ymo+c#5>Hr;tp+#l!azvDw4)2RL{xka_2KprUm3zs+Gml z3f($YI3~d&n at BLWOEOKi8}bSwam at X8qZ60g?xcTi_s#;IFE-4(j1z=g`MKEjH|VDa zPYp_G+PS#Raa$9Q<@I+Kw10&sb!CZRtbRklTkT!T_Yo-CSXeK&_Z<5-Y?p|naQmuP zhnO{d`6PgHFv!PW=e=9g^}CtL{;Icm(2ifBQKd{Nic at aCP(V z+h-qHzyUctY$E1>7#=io>dQ4e5Ij(wfWzm%BpxyAmV|H=Gr(;YMl9D>B|s;AQzZ at syFGZQa8wcRJ(PrYFIU=S?m`T zG$Tj3E}j13;mZ_FE1KGS z8Wn-)k^rhj{P;ixqICjY>6ZD$=xgv`D-}N_IEIsMNMz&_fiCeR+p{d%vqqwOHQ|K^ z&-Flo<_D42TL~h&;y?Mh^_aMlPe}P$!ZjO<|B-zCbJdd zAEokdvJqrg&!hkZ0PyoK^ZWlU8&bA5rhk);|1u~BD_F`d%Axzr*ldf$hesgG at sXyM zDaqXd(GwIdnxBt>p$~#nYd0o4aTi_A#gbmw-Zy5T8^ZAR;Te1F0%4INCBC$0^`tJo zX6g3&Vgsd(N}v_CW$^RX7>h;M!E6>tWhZ$kJfhj7;3NJ_^-*R<98c)*4&1~f*vq7ZUTiHJlXfzd5>N-xn%1t zZakYA&&9PITWk7H{kH2Qjqww;p7v{~mmt2(OW?rWNYN;fyE0Dt*(#%Ip%J6uJZCy#Iy>UV z(3e8X*catbdP_>bu$BmtyOcqM8z!_9YJwB8O1(&xAu#iSbXSP9)+o=$5W&tqw|&%u zztWT9tX+7Wg!1E%pwcg;TOn%aVYtvN8 zf9x3jH!MvN8mRG+008ju|JBjOKVkWwJ0f*RH?3u7p3`X_j|9<$skH==L&Pz)2f}qQ zD!znfwFGXFOpk(ag75 zb7h;VotwJM9C~5loC0xrw#~_mu2FuNY|u}be)!)HGV;1R+m!}KR(WM)H at rE~7p=`S zzQN>Ax8#!}N|(QJj7~TXKe?BXU+?}RUHBmn&mq6}?orE=qLQ;Y1?`%fiF}jF&o%~* zY7}l%^Qx}9V at Kmzl_@qje+;TZkxovo4AwFzMXIS^(5-$7;nSjADMRL5%51shjC4+s zKp()Q%mm#4TTJG_rtCI97J+76=O1SPG-^lR`!x*(_~^yCe4iDB^Af~RMj7JjWZWXC z==SO(ovxx=NzS_4q)k!6+byF|-gRtV{#zTvR^0gGA^KMAIQtZiBgi0g9&?*EX$Kxh z(=s2uruU$RtW}WR`xTEU)_ at w=dIjZh zmf66J|C+!24y%(@lH_!FgGhnhXMGtrUya7gSUpGX>+{w_;;Oi71;u>Gn~H+~#mvbBQvO|lbY at 3zg5^3B zDce!8>emlOejA?0?RgshV^6!UZ4a2l{Gni~_A|a1%D#Tyqe-_BzK?sPzk~`4zoqZ$ zz%-hTK9xiTFE*S=Djc{$ye`Eml_JK%^VO^$mbXK>PUXS71rKhc}agdC1 z{kFGOI-y&Ly~Onl^Sp==bai(SF`(fGrqHTX)S>V%?C9`0JObw--VB^Dz(hpStI~Fu zu)~Gw7s9qYM^>u`jRy4i!=1C!0N?ibT}V{?5Y^HJ)x4Fwn3JpSQUg>K_4M?tKy*Lu zwIclMVdvji14pPnKl<)EW?&8df9tIeB{g{uRTNnI)BIvc2N%Q=90(dnK;3Ptqej6E z0}~C<*VC)BfqNR|2bDvu~MT$d-DFs<)a#)}dYHKwB&u6v1#QYd(z#(VWEB(qXrU(O41 zFFC1ZC3*AAJ$dsSF{%^9?Auvt6_p`6&vjv|9dMzyoxj z;+qQ_0zP?_pj~KqA$q>-E|Z&y0W*9&vDN`hx2PdIr~Yo3;ydC~$s=7y{#^7aNJ6%t z9{{xklr>gl00Jg?)q#(xQprOy$|rND-mcdTqwX$mf?ucf0inC_!NWuT7ywH!`_mFR zFFkKby(YD&-)NL*rDPCNJkBS24MGKOh^A1YB1W$5mIhN4TXw+xYE%f at gfRxSY)UhA zQ~TDJ8NEq9+UIvnu}Ts9JGJ%bNoGr)5?{MX$2drGmc(0_*ic^F$P9|b?qZsoY724^ zldW%+=pVrKdhg;!jA9A#pWANiN4lhPj;zLA51NDo_ z-%A0sKay#_x0EJ4k1}~Q4-u=O;mF at F`X&;w6V?#m>`A^>QDK8Z6ycbnf(ATHp2-xP zEQ_oS=^`=_)z=&3m8h*RLH_(a;XLovNCjDGJDEv!hDu0!^hW4UmmdV7EznmWJCjc5 zg`OiSoXN{?#!JM83m_h^92Ur+w8MU+e&%oq?<$&GW_d2K8ljNKlN1RRu$lKHS`m^R zUYELA0#OK~r0Hz#aE=*ZlNI(~HiOqTU3Uxnb|1uTo%233hgF=b%iBwC3-SVEqC7w8 zJ~?_%_vU>x@#!QRKFB1rf6}R+;1F1 at cb`Fr6QaeU&U$f~p35fxFp=O+HAyFI%L9`b z-o+K7S-o^bd)ks!PIAehrLMQV%+XI=jHkOKVZ)Qf&-UAr zpuF`p1AQ_rDp-_0mPe|{)Bb1*0(OLjoEdDuT&stV2mK&<#N?0xe?**tu9**|0eyge zObzgCyX1c-=nToQd?*Ki61x>*I|t4HWn6h1z22m=in9+yY>|YHtE=hgOPz++sYc{G za7jLus`zdo#nN%^6VWNViQWFjCUYcEyTc__)n`u=e}T}6N#Gooz%b6+22d$T5~g>U zM?YQ^QR at uvFo&+{#>U-*Q*oJZc4{^g;vz{F-(-mups5_8Mpss9ddM<<5 z-v(fxRJ-=yhsVh~=R12!y6ujp!adx}&xVSX?WX40CxM)&_Px;pf7Oni`-T(v;CNWr z75{A$C65qLYoLiZ)R at r!X6YgAI at rFZQe{VF+F_btqP17VMa#Cn=dAGm2z$rqOrLe# zHyzta$2L25(y?vxjcwbuZ98vlyJOo{$2$MH&OGO=dB$FQk5SKu`dW33QT4m-yRPSl z$yld&k&nVhVOl3DsBqDjGoM5iU;Ywet_|7~Oxzvp)%0cY08Cub6Uf?SF8zI#x6=fQ zRvyIFDtPIV*O%sdjaz0<*oSIa=ejnl;vs at 8I(Ztqr|_emUHORdrWPOnqe@~l#e~>9 z+RFvF>?n4vkR4jIUTnEG0xINQfb?#hP59uX;A9HXKD%embw0-#$S22^__r`pp?>^H z5J&A0Y+VrZUYhaW(Cay4tk16Ka?Hrtm$!TCCuVg9cWzcnm1PcR_U9@)1OAqt6-kAUg!IIKc at gQnK+k{h7FayZ za4y5w_q^K{1*U)8?V2d}ZkscEfeVAxs*1HGMtI5eO0hY@=(f%M*keZ$@yIHOd6EcW z!m}#7;K6<5!0*xKZ`u%c>|i+WFu;tE5 at NbwcNntU*Zxw&>&ot#w!MJ=Oz=xKNaZ0q z$@vXpwP)b)v0b*nAY|AEMRWU-T^6gm2R}B`#tX;@?2qyoQQ`KyL_aHsk_XGha9^e* zuxThJM2JEeUBMFV90W+~(C at QdH*Tdq;W%qkRJ4%{=IjMIn}G*mWL(QMEEn2KoUz;*}eRjaRVIXrR=?9s>6;4%8VQh=5z2 ziKEx#S%Avei2_WXxK(>3iB1q!MF~@F*>qPj(1BEUTGpAKu`Fv<{=F^a$%z(!ATA%O zEogg}!IQ8zfd9}o`Lui9>;jou5vOEl?xx^sG~@xwohArz54j78UfDgI|Ia at BI$?=; z2nERuw6zT3g!`1}UtjR)z{xXuk;jMIr}r_k^$GT&m%K;!>Up%F+#*#?9y~ocO31u?|c2C_A8#exeOmBt-Aa@;70xQ~; zP4ZsVFRzQuW1KohjRTCq)}?6q?pSPw1+ttLa)2n`4DOvQXU+F-O>dS$0HNHez&y#e zJjRDlg-9qf<0bo at A*?0KuFCT zCH)1IpNS-Zp_tm7qOm^!hC#PBeH zA8+N;DA`5N-Vq(!(HVRrjHY1Kn>QtI=B2#*%h!Q94Z0XBmW=uyt})bYC at pnmMsAis zYlJ_*`c7Koj>Kq}{N)Sq@``bOte(K-o1?}onv^Q)G6}2b%TLL-5p#d0?9pRmEwRiH zsOJFIU9rOOi-l3NUajvG+nz8yK4nTm3xAr=+q-g(ro4FDfI*OBfNcH))4)eSPl!n3z?)P)CBMT z&aS~H=E`;_=kMMk#4j+HJE*o=fnvq4 at cj=a-C at 7d?hk6E+Y at I(Kf$m7BPGRC;^E%{ zN-}?qhh-?y;kv6e76vY+O;R38^^P{dGn;Y7M#PdqwcKCtL^BhWGZ at Qf1!PpIG+Bu5 zC&|s0Dmd%mAd|686z}JKaWLw!ar1EiaM~_$wewcN?~ec{OW0tlv0i0Lva;pBH!3T} zzukPy;+XWqCAGBT?KUGhXBe at nX*gvNeiwo&3JYR$L!f)%ci_(HhF*^ZHu6}c3X1sk z|Co3<>WmKR6msEDn`?7jk=T+eDsLLCn4%Ilpn{Z9N*W85a2mu4q>d+Ma;B7xk?&4c zD{bC~B`HB2QBzD+l0BM0)v8|n;~|BgQ at 5y`HUFD7MeJNXb*^N>F_PMM9nz<4UTTHb z#<^%-&W(!p%(m;hYMvZM8&oOKli02pmpaRad0IC{TJ8c2z at 77__yo(ssfL#oR&!V% z)@3#)XpV%asmsf?gk~~{K>)xxt*H5yQWV}xeO{F;9BEg|C2q0yNhup!EX(ddVHV+) zR7OsL%dq at a7Gu~z`s^+i*T21O>^y(}M39uE*8EK5nz`Y%3tWC8$S!$$B7o}PCi=4i z5iqla%ueYdyqdEJm#|k1N324r3!iXS+=8qrcOI60Tr3D3mb5Hr!ehZF5}U+e;pd-? z14)S>jcyoWq*53zh3*hxR1|8|6lzozy3dR-jDZt*g%erDiq6A^-pPjU#frXSNmaX` z;4LnE$Cq!qx{Ha>Z-W!a!wUY+1`fpv?q&gfy^Q>k z6uPU2&`*re-)jzi9W>@LZwOtML;#*kGiot<#TS}QYQrZsmo8#F!?nI_Jf2~F(O|lg z-1xgq`l at +1YOwNTaUzv;XY&C#h!H+sNd&E*Szs8C+L&QQh6O1Y~hcrHN zpU=%C*T at 4!%?a}%N2ioC9_OA*{p_KM;7#& z>(aIK0$~KsorMix4ANXml1y+)WldL2l*~I*3u|;cft}~MMT at E{sz{!TK~=fy2T%g9 zFO zC=U-KB~ZOZ!i7zag3S!GuG&9M zWhweu1$mVqjdpOB at HZJ34S90&j)gjLT_u#dS?rogp_ie8oY|S(mS&ZwwB#gov at EG2 zp}ppHWO_OVk}0L_??-ZAJUe^Bd?;%|NNJv}8|e-90&|WNEY5)s3+y5>k9 at P2QYoOg zs-#*mcfLu~b6v?*j&bG`puAeE>~cIE`48fAbuQ}HUkS~fp46LYf0A!y+z+f$w&pDZnGMXnwb<(#FeM4a*=M*wne*?g{R6YyRObPoSfue-1|-vh%7YtCJYQwfP)y zazndAt*_Y;P((&+T{|tau1aeM-8g#~S<4)V-KjN$T~rE!S$lD&7%&*7P23gs!0*ix zyupb&z&sOX4;n9D3r!e$n}Fp*C;+_|=3c(r_nn6SL%K1tL-mw!R*%hbhNYIi z2W($tnoMbd^m1j!c>)M~$W}Bxzr)RxJ6GDAk-$aIS6R|h(dxc=&)lEPSHT#$Tbyj) zc8chRQ#ryIxh?AIXqMfW;WPrB9%k3Cm%N at d;Qr`$F>#JjSli?jaZqU~4A$p at YP@NVn`BPm5xwxWT3A;Se zHX|L30ezBP{c?PwpYFKdrJMD=Y<=??^r4<$_Qo%I1fkPeC at s22S_fKBcJ&K<8H9WH zA%8&SqmEI>3bhbrk6`zFaz;7X28u`D-TE}P9*M`z;b at BzfzIM|p}Z`6<&nf++PvOT z-d0#C;2P(VtfH|dTHQW^Kbp)cgRitcdq?Eq$CEJ{ib=?oksbb;U?{@n%=;I zjb`x<)Suy4%Ny at N;9;WS_=}vrS{lIgLx*UGrbntb&BXk0I4;V4ko?E9TI#aOhUZG=zvMK?BR9kiTWE?P4&B2Z8b9{EU*cTTX%E`=!^nd`nU05lq zd{AXIfqyPt&f}SU(K2_>;lVx|0FmgCQ>)z%gz<25!AzNDjkYu3?k~j~nJLL)CzaZkv6dK2Is?XS0ON#94%g+rd4V^B1fCam z1384=2t%xLHcBF5)YS#_mZHD9ly`;PwIN4qp4KYgtk at uaW}>%oNuw+Ak2lvJ%YC%efUxj}(jRovF1vLhr!O3SoI< zkGhc8H$Qw!r2FlIUIDdwvFI^b})l=1j zA7v6GU*pcf*x$hBALEbs_5qK?vk&539lirj-!M_%)Y4zraqD%|Q*5wT9K}biI(OpL z`%aQGE0R!?6kKVCf{sWt{Y&-E^TBm53lG%hvYaCvC}pEtiB|9NtH7b6EMgMxs7 zga2>aEB^13^FOPG+VW_M$X{}H8>yl+G-|&gwA)1h5D<*WXiC8Kw&r4btid3L4cShU z&M at oN)1rtsZErO+M9A!G}7K3!l?$ zP(v(O*D|4FMZ&LOn_`(_AEQsvwo(7mweE5Rt!lC$K!2VVZdzpvl51di*PFas&uRp~ z4Y|^Sp0Q23 at KU;yA?Ic7phzSS5Q at W(HdTFI=U#D4^QDm#g*MB$jsC at d@(W~oZ|N)U z7dNjxYiX&p{#zrr*07a&{XVacF~)AP(|XxB2tkV5D4&w$oC8r?7=Eo;dwJJ#nNO+> zYfG)6P_PG#L^)K+97~MkX`}t+`zA<}%4HL>M==wytJR1Vht8)N^}>xsoE?*;8U zP^9qbM?_hHY=W$q8gW*nb!Ii{8vL5GNt1~aWnk?M;GqwI_ucpJ`za*NXquTy5Txn_RRpFK&evI$1--f7SG z-8b*utq(`L-%s7p28dtReK~E?GHyKe1kapvfnGV_H%$lc5N$g!*aG%M{)F5OKae>0 zM#U&08^$A`?ns$zFc*aHj|ltT(98&d2Pl+sD1jd at 4PE;2y#6{_N7zG{uS at V`D`s=r zcjcVlXi#p#M$hSed<>;Fa=ZaoLMus#Qa+U+JlXCzJP<1k?O&THD884N3oM}D%CE4| zyUzx8KbB#p2k#N|iyMUgG&yeBzGp7RG#9O{d=)=bJhV=HP3OTs5oUIaBjOM~e;Z%Z zM;(?Rh2FG(pQ4Q()+&>@;d>I#(^WwsUhmuR}Ek5l`>nn9pEv$Yx_jU20wG&o3|G z5G@@eIp>J`1Xff4`4 at 5iF1=X?P`0$4FQ{9=*oey1EV+D|BY_U%Sm8-J6t%I*aEL#f-3~+7z6DnP0k=>kH zl;^phstP!`ld{(u5QZGi)2WmfG7Md at JDp2nVZ>?RHd(Y#H1t$q!wyfv8z+t?CCwf;n09H?^7oU-KH7-98 zx&xyt at PfRJ9%^X7v$=G6F|perg at WTre373xge(8dr=nO~+MTsq9IMn5egO>{DmY#p zqboFT?am1T>b4{BX4jL)w_umZ*J88|{R0OKb{lyi%g7VXPT3$<2neHGZow)$s8Www zh5jLy{aF*Zvxg7SJ4y`U*QW*HH>b&$SWK-A;qehl}zj=LtB<^4myJP5mlJd=*_7h}~&k=c4;>8WNR+;q9Qb`d#g zH~n4 at Y`+5WRK*xQ>s+_SgtDAYXf?zj8PR>FPfWDxfsSIEK|_TYeC~AfTBAfAjwTz4 zEle*F3R?nn)=DJK8Tv6s3{K9Ix3B!vFAaHMcx8mrzUZlUR_&A1c%9`bdP<3gqmO6& ziFv_=NQ&H`dX$}l6_U2wQlUeqq at ju|yD4sDx!?BO@*0+PiA!#2k4K(>2VHwmeN8CwNk-zmBm at r)7{zei84Zc5#EkSyq!P05E?ScW-ge%WE&||u2>rjlq;HP z+-?v2&H%H~{L9fPsvXO{uFagr>*mQmYv85+5@{w8)QsdM)JlT0{_BiTblg6I5zMKenlDnjYT8SC)qik z-#zNbH_^cj%h{3-l~{C_M{)G!so79XeN>JdKH3Z3by2P}=RtHxxLAqX(=Q6fN>{^) z(CPY((?(uU01|Kd56DnOJ)h^NOF$&up3hXGmBNn&<^kh9nkHCU7FfX4So#5x8A;Ll zSb42nm8+qai?fm%VM^yHjsEwc!^Dc>?bYpmEZ)(Q=D$W$<3y4KAh}m`$+dQp{%Bg| zdRp-szsQ>uZ~JjD{fjlJzo}35gJBA}Z^{Em4gcuucDH%Wm+lgANxxq)P;pP70#EE$ z`Qf~5#MlCcG?y9H?g!q~5K_{O@$*;5Pvh`8zi7Z$n at duAs&=ZGT_dkk5?6KIQnVXE zdzmr98}3oZZbUWf5{p at CK2D)OLt?89%a)i`III7{@ubI{K_7!tFK-C}DWAs{{ zqRoEwf#1OU1tI+8gRKxL<534ty-AeaF_idmHVb?R=sd!fY8ol+6ktiSWx5B^=H%Iw zAUX at ES&fnTOsQ3CoDKZnU2`+!UZ at iXoe`8>1VPP{dX__73H%NaNS1SOqYNJ0 zE4&GRqNR3 at 81YK7(&POP=C3-(y-n*HXstboVR;}EU=vs+X&>jw)u%tPn{=(x6}0eD znH3_;`ppL%d&b^I(!?fY;uA1^CG59(LC?~xkGti1qT?TZc%jUz{N5jDd`17 at nEVo0 zQ}KW(JAmZYCYzqKp2wReo3?Q0Nn)iyI~3a-BH|n(WkXx~O;L$)W}iK?Y8_nVZp*DX zbAc(i=C~i7P at L_rZUW}Zl9QL(oy)$~rl;WP`}*rxPg5_ at M%&PBFAzTobA2MJ7pu)P zpwk;Jl4k2djlPRq9*6r0aKtc0+gg{?WXalT8Yv+?TrW*dl_;f1BO4&ijX_WWZ)VRY zO*8B2Z*l3}s|=-noW!`P{|;Y$FRDKtlidLHM5+%F^+uxMd;J^|rZD3Vr3R!y;$Q8MsnV-nt+eqy+hCqB5h+=vbGnm>%&9w4BnEq>p z->K-d680u(kPIFy0knkrtwvT=)rlKs+$*4 zk!1RPwCXL^_IShses)eHQYV+EAJ!s!l;{pQgM3Kx2VsvO-shOF;3doVzJ7v)3O~sm zT_bhlc&_SLsVBRv+S$LTXV!H5SWe`*K>($;Q6TnP|BHJ5e>`3(xa|v#1OhUJ_dkW~|1U)P?}$E47(X_J{?n z&H{$om>jAW$tXz at k$Q*3_1dHki%eUK1#-zWPS=G}+td*U+3$yK^B-h^z4v$5d~Q6? z+23@}@ZMM5jC$Y-HMTAX3s`B#EVdu~xsSVC*-w2jvr-RG^B)CpUOAix{STZMp at ex4 zyALmcP#a9dPA8ki6o3N{iyo?J2ui(M0~ozz-JgJCa-^PMMxHwiq}08*&1?^kAA0>& zLZ1x^b&?ONYj128Um_a43}Ig?q540?{3sSVHoHD&0WY!^UqZ)UN}0X)3K6|eyLPwq zYxk`LANW02Lpxpy5q|N?nP!K_IpW<8a4QH8 at k4 zm0%$XkS}4RNbXK!mMVPcE zNQobS;bPp^CKtJUtNFQw!v%B>gbkz!@BKA6T0Zp`$YqC&CX+v%Q&BfslyH4=i=#ll zpFG}fGtCQJP7KF_$76#K2ua{`G9Yxojs at 8qX$1L2$pWyg(pL##w}rQAn2+7Zez^!IE`FR#kPp@@uz+Cg^%Xcnoc9B4FaXx_t`T_p;#WBm9 zclM=Yo77vsxgR%6t=g^B4li%EO!QT3DU>!E>0(ChWw;2E=&*s?m!s~N08XW$FI2>) zebt;>%7POEH+n2gBh<8un_nAaPJV>Z{>zugnrR6VOW;8SnY=g>E(*86O}i|ym#M84 ztE{MvgA=t}{U8NAaqZlLXAzjr9^?((0|#Z&UMCAd%JgA;G7%6|I-4ycJo+!nCIt3G zhu{TU=VcpHYA${oh7(gys1tp-L$}p=Y$NTKqi-~uG>Tg|O~?Z2zO;7jM#ag|d8ZV} z_s5fh at V+A`77E8c{A$e#eLvf3hiB2*XLoBwO)j z6+K3LK{mP4dYVBfg&-QWa>_#oi~k+u1kD^Pj&{2!I53SrZPK_Chq{99XBNHiMGj2jsaRBp? z8=K_Ft$oC)S{tj^5-v5f*SA at Xd0`17B-f&%u9s3)g?k7DkT~|x{81%N?4U^uF^UXt z)2gjPZ4nw3)V!5yLgnLr+C#(-GjS&+A1+tms8A}?A`i1&Ub6hlshUx{Otq8p+k`nx zqA68ewY`>Rk-NP?NnN#4OP$TJEw!~=+hovFcd5b?n_>R$7eB+a1Ah*bT5^q4jpkf4 zi7l$Pj;X=i)rD30`XB9u z9c^80b+cgHKnv$B+LxB0^8K=S@$zISaNH(P|}E4z(_rM0=`IoVI)FB|+XS3hZ|QI(2B zKClQ3Rjsk!x|nO}q_w0!qz`~q0^BNaEG)x*GU13d~^C at ya-4P^pIQ{8=?;=UY6))2|g>Gl*LRq!W zPnrTtc|&mxcqfbUm=gCDcQ#P?oevzOBkHJArM)-Zs7DvM#zHVx>!PUkW|BVsAxCG^ zuB*6avr-Ai*0X>>2$iPidLx^73-Z_wn0c=(jjx16$+hSWx>Dbutn+jxQ}Ki%$|Ia;0Fu5US at giu+Gno`;Q`gR&* z4PSZ76Rwi0W*9j=el~@-Eq8F(E_>4LChk$~dXofU+??B=B z(8;G`&lzF?cT9-X`#56 at k6{mVr2<&x&pTmzOJ~okr+#j)9v1zq-;za>X*bLn9{0L2>x!M+=WVRMXOC-`co~2mSYMY6y9w`r z3P$~+E?V>7b)U_mdH$1Dgitrx%t}S1`boK#V~;c5;ynw^ht)An)c}?nm!BvQHhV*L zs5emdU{?*Ogd;S(5)lLgo*f!!^nU{5{-hF?T=9!p6PD)i&j>xX+GFMQeKt>m>3AW> z?Ll~>*6q68;p7gr-dT7f9lW6M7qRkMX}My-x%ULKBi+pejg=e;FZM>+TK#cF%)QN6 zcD>a>d7JiW-cD|j)Lhn!X#Mq at tC8yB8HMe$2tvO^jQCBQN3Wy|0$ZX%re5 zGy#VF4)Ly(Quan8<1RKk+HI3FB5TIJl9hAA5~{9#J-LP5wCB&FI>Yf8R_({s-|#(k zenfdLT}#la>Q_f4d<^~teFp7rnx178!CgE>V)g8 at PX^@KpIDkdBPP=#t|yx(tT-d< z7BF{yDLyNX7Ku2mibSl-jm{)tvr3!y2W3wh749R&%cOdd2Fba>Q2X2c zcX^#AV{ z*G%!<1qWL1tJsU2)9$!EvHgJukRttnf*Biz! z8uneA4%5Umqbj%*0icJ-l+EcxaNXa{+ZjBtDK2%e`3Y}9`;l8|#XO0z%k{qTV=k|Jf5QPK%JhT#)@W>79LtsG7S7MO4wYQ-wlkgi zn+p9?7xzbkQk69IxWyxPr>>dYO?r7l$#xyj1#tH3r$v@`?uX{Ckhw|5*$4N5$J{&V zxMPdl19^kJsf2q;>wE6gc(c-lEkioWkzxBvjIq6&3xFkt_qpj}CEIGgx4GKUYAwy5 zic0&i$`SucQK6+hf|ehIY6vgkmP3POaw?xHrM z7ZY)IcbjgiAa>)#w4$7Ge>_!4>li(xyfus zOz>C-pR;7f1+|(}VXg&BkLbA1CS|7g_orn*di&9Eg7zOuH+WuN_=bz|O%k#Cie$C~ zxqSku--?Pi7pUj-7f0lwDE1#nQ1Jicz>recxOFZK z*72_T6t!NnI&gL}uTvx1A_HP#nup~DH0A$lthlAq!kX8Ebd=ufC at c7BZ&x+M&IG at n z83`wE2=EYeI84XJBJaO9su?Zx=`Uhu^F8A^VzDTXy at qy)Cr%UrN}+_Zo-abYsQ;nq|8DpA{D<9xK}i%SqgSXT*#9#e20Mqr6 at LxH_$9x@ z3Yb`%=8XR~C-O<}`~McVPtZ4ip(H(dwDUb at FF4)I>hHvX&>7K3Ip|CqAfsU`t*pw? zq#HTq7-kmq*#{Yh8m1b`^>+nogDQu-S#dOLV_f9d+u>`405O2DY-^9WwL8^gp`^$g z^l-&1*0YaWw++9&ZGFXw6r=eOv1 at PAx1Ms*tTnv|YT$9_fnE5t_G@``BiS6F2asuh zcqi>FORL?k)W%)9LJ7c`H894O0UY%?iIcdCjf86DX%O2&0Oy at 2lQ1vGfmCa%wi*M$ zkWe0)(0FAFJZYNi{oKCOHB}Wlr&ZX07q$tQs*NNK=2LBIr~wO3tcf;fR=gNj#YF>! zAcc at VlvJK-We3jSj-Q1~-9Dp;5ENf|;s#{vXf>aFcZ&r_E?gI at n;-vjd2m+yfEMSX z-Fo_U-N<8k_~m2%*+-&g;$a!9<^2EU@@Un}?OEF?$tW`70v;lMAD?w7dV1g$ie&Z@ z)}8ZoWMmcNy2aY&j~#hDRmYEbz at zCCHAQn$?+$W=7ZI*8hWi{-eqlt2Jd&c$l4Ox& zU22C|SK2L at r1VV3%RbwrT3 at UD1$kHAqj^7gkzdq;{ON!#dB_xly{}0(Cn_<|r!flI z5G%VF(RvHZ?f?dLiX7%15jJmrF=vg_ZY$)G- zQ{kS>6iSOlE at u#ZOVO=a$uq`~_J#1Dq6E{s>>C$b~jn(c|B`Vsq z;mIU8+REAuLNsa{-OjD9Yb}zr`PKFZ#H^+XM$*6Td zpQ%{N?DU|d`;9cIwd};{G<;6_pZwHivz&M6xvoZ_v#WO)P(A0tP_q-`<4TpEnbx^Y z2N!ZL_VWRDW6uwbTo-+C_n)#*h at 8JjFnXvka+_r2ckX*2+!dX6>zm!S9iRXHZ3a_> zD!qJ3b-p3DxDEVxX+&GuD~8zLR>qvN(=_Whjw5K+_&!OiXT|eFz%;k3Z8do8D5Kj~ zf4**L+tG82?a1Ra4|x2+PDtoqLUtH1{Qc)$hYp0N$7YoF68iM&t}Q`_5UxZ?OscQ7 z{dGBjzTc)s7pxx`a4qlps3TC{($wi=Y<2ojDf5;CzBROwgmiWG`Fib+Fgf&p`fmvS}A?PC6m&bxp!Lt z1NHmXd;nV&gp_U3Qe##Y&pIT-=dSGqG-PLT64?CJ(+t56Gwp}BTmyA4CvlDvt#uAt z>#J*QbBh~z+nJfOxy95WTT*Pi^R*o0Kb0F+Z?9T;;r1*KJcSNLEG*pSWL`plqr|vT z_Y|r*lA|XYxTv2LNK&zS^!oI-wi`%U2`X_BO2p4QP&3?vJ6C0F5ZL}|$6*t5&DoKm z1rMSU;G@|qG}EU_kW~Ow*66>Lxxvr*LHlDm7p@#;;v8g7s0{IE#Y{yve~|>Fp4xly z+Q8$EPcITkP=XeOH_)O<;Wl&!unLxed?xsFhZZY~g#D_l$W9sx_d-#$HIVUbQERQj zwxYtDiN2pC%F8(%QJ}&px{zXQttxRPuh`*2jYM!+Fiq4;ncz}xphv}zoA^{$*bD2| zz=;V<8YxF9WAC?L6AG$e2ul5ltl;X2%CRs6X(=t)9Y_?V`#1G%jp9g3n}!=NZAJ^4 zOJK61IALO_e4ZIERawa+{5n)T`c{r~9xoxOH6G(w#Le_q4t&T$NX9gJTdL#{*GW)>`mcx zZ14Qt$_p;OUzDt?xBTeN-i?cOKc$N|Vcprwj{%dmNLxB|!dffSN=Ye}n*Z`$_&4i} zkqz-%4U%FJtrMS~qRIE8TVws=E5%WO2ZgaYFXB93lA{+d#G1;*EZDMf(Ku)3Z7%Yw zSV`;Hp&fm at +kN~5d=`fY_;ymHc6+Y)0s~i|>KKQe3zGLWSpm1NUS z6yxkyHlw(1kDS#;rIw3MGL5R_VGyqpJn}D5-RdklyB$0JqmiPcNY18)k!Juq>)Q-* z89 at ehuXD?(pxNG-soj)PLTz2FRB))55&U)(poyiv#>KhlAZg at 6-9IDJwSa{P;LBCN z<%lX$>n;ctt+u3q4k}1ibi)Ses9 at U4h?wie7=E7>Yb-E5PWCs$%r8E`ETyy6SZb)z z#`?Krb!Bsvd}eJu70$Au!;y6xO`TMVQ2FM)Y9`K|kV9g-#PXB<5LMHRgwvKR<1?f4 zveFYg%w&vF(H6Cecr at nt(4HbI!K(7z?7YVYv&+*%(CSzhvc3SX##|VN-BAUU(pIer z^vXMJQl{^##0kG?%7$UyVH&XGPV(wHrtF%Lja$Mj;IKHX2*>I{E!6%@cDWAD8nsd- ziipPn1x1naWUEY|5k>&?RD;w$`%zx^bE8e_{9RtJvD$m*4Cr2#Z^Hw3(Q;x?^+|IA zpTVD^uE4ozz#ntGkm^Nckrz0qIxc5nGLMljT}e4AYg_g`(^4ztSFHD-#tZY${;l(6 z0)6g5kN at U`eOYdwqzqvWjmz=kv|l{_^+mHS*>TG!1p7dms}d|;d!n+d&ek8nKwbNx zk{`zh*Q+=D%5F5AlhK*lyHYvEhvQ at X=xw z)lg6g%Gu(LGgUV3Z9C4l9jR<;51rtrgz$-0{|e*(On3Zll}9Ht_1gp at 2W%u_%vQ_+ zX{|o(>*gf)x^yxO*|1 at 3_eaRcMD@Yz=QiM4eUu?Y45q{lRWRZYJbZRzWd<4UULa~u zRkIjj>(_(@U18aScT1V!vqi$VS8#gzSI)?Fx%1wqH^a-E`#?0?@0d{@`wZ`yTwR_D)TpzAudCMez zdN)KV3ZL3Oi)70lzVj>`dX=3fCs*K^BrMx&ZVEeSsqgCv8|j5v{Re5%SD at C7MA8b+ z{O-aNo1BcFK<^!9+baJcmJdYLE#3JY+h%y3F<9=&h#nD7Zv at p0%Ddg2?Jer{=%hPx z9dho?F1Q_e8Rt$>cKz+UES6dW2{OD0dm>u0UDo&}{*awnZu|FWD_P$Oy3-_?)0S+S zJ!Y{~Knv=qe7bzotMxda?|1k!>UJg?SE1wSPLEpd$z^6Fn(4`IL!8OOg~)lB$q}x| zDgDfMu*nN{#T}gO>B`}~-M#g8KQFej_Yv^E>q{qhB`hLs$P$x1?s%;$6z(whYWuyk zes}B$`~F!Jdp@@efCrP5`Ym_ySIfMrwB8=~mHio%*XLUF#9^sQPv5#`MV)D2 at pvwF zP>ZR;!zWB9OR;eohO5eR~lIRX0AJ+1~k#&8UGb(I6Y2Gnn2wLL%4n#fsX z;Y^CP(ez1c&gpitgr)8Z&9#c$1GQ*MRfp z&N?;81-EFAjtC&`Cj#2S_Z5A*Zt1V{P~E=l0;?0z79jk&+bzPO#=4;zq@Wh8~auHFS^3P?Fks)bEWwI8T z4mn*Mgc=@+hb^b&79&13PwB at APIZmGxGRsEoVpuZWgbUXurB;{z#Dk!R7R3IgQ~L( zIVAOW%h^7$6_q|3Q at C{Yvm9r3Z4<%!oRNM1l_F6xpQDiXTk{7#oI2ZHdWyP^?r at H_ zc8-jn+eXV at Ch${%>7`}mj0HzX9k5p6FREU&%$ws%&WqhDqs1$sAu z`nq?l%d-HA>2^0Xsf-{J z;W3k}s=sI21Hdd#6z<7_!K{AvJQDof8j!jJ at qP(dX$$m0e17cbPn-T^0=hmUSmR#{ z7;B%`BK7!tXj)_?*A_cxm?!Uh_M-3j)uDg4q4p|9e7B?aN=DQbzj&`~W;^h!(E at ZA z0d6VE^DW|1sVQ9yqLY~3!sF~znm7(zTe8+CZ7YpSTY33F9QBMvv1y-7>*{Nl`HXp- zvuO7)n#o(;iUo``8r`g7v9$Y<7BNd_U0Sw|+5{Zk$+a05-D%fcE9{NeN|*N3`T6q` zjHr82*f=Bl*d{&wKBOTpUOS`;b8oR>JANcf>=}#%Oy0 zrOh2LjIi17bu1;niF44s|GWB~3K#&%|ohW6$b#)j6yb~g5gj)u;5j{oj( zP}O#t|Be2Y3Jz*f-h#=fdN*IWnG9U_{E-kTs%V{4poX8T6z$ALmV?aw1 at awS$A2nK z*fnJ?J}Q^@iT#EAXq{OB5E;cb7`tA3$a(NNxio!!I(VS)msBB*XR0xR{E0DyuA{~j zPP?C=oG_}2k*1&!uLR>tA5F}JDLPdhcmXQ~zc=A+aee@*P2~g`My at X zxgY`F7C=wG+7X57=N!7`(k%Rf3r~_YKlXML0d}k>m3F|Co7QA#Q#oT+bD=vcoII9g z#JRGM>}+Po($um}nD(?zquu^qrL44c#~?(WJdL*JByx`cbj3AqYn!&g>W;8HdArEm zHEdarh-H_>neAwSjFJ#%a_A^srPSi&qhq7c8D7yAlP;tf-3j{F$>;v~Fa7>D{; zcypU7TXkvYfW0Zl)xf=S(cbZw4oU^sEMXrzhr~p4-uVBj$cukt_0B#`C_vwKAVvUrM=Gzos>E z)Ou%I(Y;0S(z4cfFWx*meqUNnUvt70O^H at Pv?k at CxWkbgghX1j2XKKc`B(V><`^Th zuw(bz1GTWJ+iMJP-G&a6+o}y9KQO_&s?0C}CAqCd1{>%W_>!bvE-se>L(DQaI|4Vy zGf&*B+lh`k#5d;$gc8n_63T^2NLhF?$pBt7inClS&>jg$RD_6g{{qE%wa!kVaD4&z z_!mMA3JX+%C%!dt&{o18vM5_p1WEqZ->-_e&v%QE?nodXgk|iATYX5#`2?qhP(;5b~l#gXs~Y!qoP~uV>}$f<528!y9E|{zXSJeQ8LeBbve2kLDY) zXk at 9rrlLZW#x=+u!2+$wN0FG5L7(d7W|Ag8rpgt{GzA_gizmuvWtGmHeb2mkEfH4+ z(1|cVen7hPn1RIFfw)l?a)wolBMpO2gANz3A}72SQb2Nkg54MG0|QW+5yB_*#uIl) zG(UizZO!ylp~1VtC>14r?aJ(Ta2WL0gy-Ny{Pew|ivFMW#Xsr2mUx{!fB*v8MF0Zg z{%_LzZ-bztqk)H at lZ=Iv^Z$f4M_tPvM;+^X#|B;8wy>ep}#SREjLn+AJv_GaLh;N&Tw;c zc>KlW4MboJLU3?Ah>bsQuQ at 0VIw00zO$$vqDhB9(if*JJy#GbCn2QwNWxCEB88+Q$ z#r5p-))np^_cs%1lw5a{#~PK!6th3?xA9yfon5#}No>qB9=d{fHkPvfRk}$Q1a*l; zlXo4HPH|Q%Q`zrGI3 at Yn{*v=)4SEecI_^-8sj<*)rb#jh&z;ukdx?2_og_}z7_ at 99 z+Z6}XDAU+jveB98w3 at _Y4Vcobq{aS&oG)13Iv`8B2Bws==<0N5`2&MeW z)XI1+l8sg8t8-Ul!T at FP?7mFC?|sNT1uZ)(X0yW4Es?SG%z}ikZR8c{Bt8*FD>|FV z#xZ6-kf?)N%HE%OQ$?Z5vMm{N%Vhzi(0Qd6u)PCz8;cgvsyK~O!PskvcL7P^(l6Pb zvhe^Ff;68Sw*G3dK8=Coq_6JFqu}E#M_e0wU-ylt39rHOXt zi?yP;g>82Scfyr3%P823Nn$qL-^yca+9gM)*Gh}B(tx`q2S=T~ar5TxB)ucCy+X9O z`D13yU#nwh_aC@>|4w4uk>SN1Fv01q+ at X1^>hJvkbny-`mmDC?K-qOEMqxj!xba6( zx_KqXCv1-wS6#NEK3KDt9pL2wnEg83wxe30?5wk^Y{4U!3SjKgak#jws-5ay>^AMD z*ZS+l7EDH9SQ_f-EHDVyPgyKyMT{@-vxQ)`lGjhqOXf|bv3RG#bM3~dQtq2Lkd#o^ z3nACvzSM{4nZZT9!{=Xey{lx+AhB-wO0>|{cI+9Ms=i&xJZJ3-;s6x+b4U-eQyX!< zToSnk2_av~LUIIMffJhwa%J%n$|H{?OX88wZf`a+Ws)ii!Jg%$)e&1V4{^&UR1dyy zcMyyDrzvFMw7Qu<7WpL7ZBi-OP-yW$Pinav8!#<<5*2RcxcM%Y85{B!+YUQ1gw{oz zmb4jYC1- at nE7)yg0IN(Q^wqpGd9ueH^H3YvCcLJR45EC#C~t(;nMcrUIIe991E8Fh zvbb~emy76uqJ^EjUTETswh(1bHz?b-3)Ft+30yu$4=0Rjwy+9s2+oj4HHN%2jfGyX zX-SW1i4J$^7)lp{co4fFFR1@!>G+I|JQX$6L7eF_8}QUY;WfcT#ZoCl|OURDP%ts$6p4Q~ja12PM5nu_f}HEMPN zzYOeX8Mu+09~{^(7X$A&eeXQ|Pk;T-c>T{;xWRl6{J-wO?H#C2(}~=g0%mCqBjOzM zPO`O|f3!b?9lw;F!}Eyfe0LP~J2LOIDom at jSac~7( zNIPO&KcK=0(s=qT9Rm^0ty?u$MLN5CEzS%uLsVl>I5;q4l#-0PNz-p?cFqyybS7$+ zzEbF#DQbgm70x-IUEspWCg2&gE>pd`^sBAJSjd?Cqdt30Urj{eD=hb!%KXWLjoVk& ze+S_lnbx4%Ewuhk!h9gVM)4iZn=?AB$4K-|or6ml&UZv at rdP7dEWFg(mbfElX|&7c zn2#Pvk`76IpkOoPJ~XJkxhyEw8&<{Ojh}OegW_~4m+0AJV|m*ww5BInT|M3>h*W1- z^UAY)Ty=*2Q@&g*rrfQWwE2(L8Ph(lk2(h-?!O1fXCtrG|5A*#*3RpSer}NYTtnur zB)ZZY0H;?|&8alpO19W+50)b!OClRfW4VKnu!YJxcWKP1ggwXuebhsp at iQuOhZ}6Z zA#qmy>$4=L`WFRwuVtw}jLKS@?dI=1kbQu*+21V8OZ|h8v2W at zYs!Y`>2@O&s3X5n^?B#ruoe;N4A80W`F1T-^ zS#&^?zpwWT$+OrKeDE-W=-q-jet_w zMrrAV&}mYO1qCUaq-2|or4Uv+(&A!8fH4cHGJBJOTPtfmFO8-OBH9sI9Hm;bp&%6S zMoYMSa at fH~z`>n6Z4NBQWe`)fM^Hh=%1jc>4hSKc%K_#hsyx0J^P`0tKfa02?r!^PKV1dKcHG6J{# zCf=>9QNH%oun(23o6*x-AOeB2L1EfQgVOYaoY{|CFtoT=q<#z!&Vj)+clT!0>DR`{ zx>v=pB9m8YeC0bfHNUC2(K}E(Kb>I?QrauIQfHo2xr?L*nYfGwGSGumlj5#KPjVw; z6<(@>%27^pa-|{*AHyk`v+>%c*WlchD;3Q^vkU#7XMQLp?SaDDe5bPZP&Fa9vzWn|cj0q(C#azrK?T^5Otcg_^r)|4NeJzIhki4sdl;i6W_;qY^| z#e-XO@!7_LDlK9#A>4GBCZ#jIyTeCAl#>38$yyX9!&wEN0qn--d$|#*1QU`~?&; zUJL!A_30hStWWLM=fV8UhMGk}t3#w92J!F(3 at PmYXzcQdIIqd2UsPgPG0&H)2xoMX z+t at aMrbSYHmVF+dq-2w5Z)mV6r1C)x7B0hLt`F$AHg0hd)f8<`7IhJwX^l;p)~THO zXMU%pg)7=qA$Q=$=Yngw5rZ;AIrplfvN^IOu>p4F71MnbKjJ>3f<{gvMYu9}Y?9jU z$O4bhE9 at P46%k_Pqdx;w!;D-^T8MC>qHVKDq>%zT>k6-{;B0p6$CG_aDNm ztDR*GhBf73m%mrm8jr~%N2FEl#pQ5y{CFqzxlEd_WpI`~B&AvQ0Ym8t?Ts8JFQ!RL zupDCY3}=gO*paGV#6(o7_|vgCsncz9y1lfg>mACcy|nbT*UHG1cFaaNhf9khH*W6@ zYM_$cV`|wc$+K6ZbeovRxms8;v!j4(l)2Ee9b&%T at Dvc(m5$ryd1|?&UaBeGQIA$I)RlumGJ z$;cMtb6jW5DY9>xKSTZx;RQ#ePz8p_lsM8ccTipnfW3b6gl{^0B#=kTQp1;r2P|7JkTIs9-c4uP(Y0BFhP|+Zq=%A8+$P13W9w6`reY{R zN)c0dNMg94BhX_nt!$#3cRUcf#T8s7PU3^(@Tm*lmOcJ%Qf~a+Rsg848g4~FZ;9^_ zh|u95>}rXyh`xOx9-ojT8z3Oxk_=GB0M(GAe1NVUvtB#Gg`ZAGC3*0Ogui3JCX_LX z$oC3|zdsOl&cn at 5gfkBaLJMeP7Pm!$0W^~LIZL*nguZAyK8*P#ayT4oBpvY`8QE^)^Js!@fW zNKv=Q6L-u{rRwGIx+7eV(FXQa682z%xh at VtFtyo0dendMO54`Dz>u{e$8Mm;2qa!F zK#$@;k6eD;m$`v9j)FO2f#VS>v3V?w>WJD3l;{PQ>owclFR6Gqer)6 at RdQW#Q at L4Y zB~z2N^^@4$hISLpqR!MR3GKAXTBcBQh*qjhq(SFCyWrm=uUg5D-jA&+sRZ=RukKRK z{QOQo(fmyEefoh>?3V2Ku%j;jQIPDBg#4kY?g(}4OQbc$;YEFFDu22pgQ7leS at irg zPFwUeG$vWBFc)dcS2h=*KI3(Es77+uofi%}%X82PeTkqc&27B+Dy$H#*x}zxeK}q` z1;11~IP|xv>X?mDx6g3=RUp`53ZCM_@&|v0pxPdO;5s0+Dr11ShP>MjTva50+QXP> zGC8$SidsAib!s&3CS-kU2V95nXt_STB2RCJzE%)J9ZXz2DXUx`N`Vcmph7_w4Heq0 zLxn|N77SKhHsk^lOxixge#jtt0dKF|Bl)@G$Z!MJQbhRyd~md!6#~ae8pKF`zdA=Y z#_ at tx?OHMW8r^cCv>~z+=O$w1S!|JYCKp6i{ySs|Hm(`nw*oAx*h!JDM!d!upVb0{ zeQt~1CVO=}d%|pusk8VQW{qi|;{8tg&5taRv at 4mOF3L0%58W3enL=SQv!sKZ{E3jP zUIuYgRiX=bHi`WDw^sA1f*Zm_b5eQM$hpzR;vbTNGNx4|{_86=RpeYD7bgjeVj-fk zY>_Y4nT|in6M0!08N9PHFqO#z$W$>>RKokMNC}PQX|*G7tZouXZ{Tf_8{5`Fn}M*_ z^QbuS!@zgMm7~kVP{bEq2CE97b;A%kgQf)7f-!+*GlWv}RXD|E z%EAV at TVg~VcqI#X5BS)E-V#R1{>yFd8dWXj#owskt+F`S%GDA* zga>eBHuJxrbv0?4)oRq-DVe!_pvh8Q7J?;}#dg0?df)RIrpn9zo{imJ&fbQVn+byh z{@|Gv=UiTQ`0jFbt$TlcTcG@p>Hqs7KrF%A6 zuwvP!TDg+wv|V*t6kDv<*E}W;;%psHim~YIyG;HW6L5+-*&|3Y#XRcosJIU at 3@P}t zofW-rvTY3&+SW3JUy=;{9N1sqH$`XExtz|Ct>Lpn8gpqd&1>pjo|1Pq>AA5~=m at 5+$zad#-r{3K9*R*0c-F9m%<%?jPB+H8^#?^O?E=Lp>woU5T2jkMHj{l z#%2(2h2KaiTXj9Jz2t#ME~+d?}!ekCi)ylEIQAnzg67j+a{wwg(Oy&-+(ixUAP;NC*Aj^d z&+OdB5meBojMvP=w%8i(Qt+;cP^5e#MiTSXzrQ6X7=!h#BRTV4xON|;+dJ(7xcs>Efp_aWAMypw)?_$>NDfTHA&$2(+Rt$iU}ui(2Q#K>vq4I;8Z0W zfiR>WXh(D-EM- at AcQIv`uA-MvbR at 1iG79+eua^?6Bopnh1c;`C1F2kiv3t1f0cuL~28tEoA)m#d{QZPjl{N^==a z)Ae~7GZhx<0b%Yk)TI|d>GdPctw^UBntPI(Amv)Ziflqfvf}{$ydyZ9tVNWZIGa}5 zjcUni#yo%_b4IJ=&wOKKXt;xB(!ny)LULk;699aeJW68&*OeHMC^S zrG40#K1Rjc2^rY}E-8stG7Y#*jLCGxZSZWpA2_E)Qy at 0= z`Ix|ZlhBnc6dLlvXDqFMJm}){j)OC?YSV-rlS^Y%_p>?l`rdI7fr0>oD#O!Z4IOgR z)68^&q$t#81XUSvhKOXYx-^$kyT7b-;!e)!A%R6%#R^rxhNt|F+HtYkSn3X3;SSAU zOhm)J!2o702kvSBeAXxi1vmU8cl9tyRu-Cv_^>hJ%^?VydSLoMn3B2RQM@`3m{)6f z-lGDfkiKT5AtK9MQ2MZ{>Afh8yx at UoL0Imh#ikW1St?dy4?A~!ud~>Ua)#Lh+uvpr zbPWpI2(vOY)~1uiA9fbMF!qH>3lpR+^QdkU^he7=?Coc)`lysd#&uMkga}znt{(n- zhqew96i3KTEn`{=WhPj#oCMi9992gTDf+tAlapYLc(9C(HRhH?flkRJK7<>$YP6KV z)Unc at GkKFxad2kI(3eLTJuWRXmYFCoj-%zN?;|~&QP)iZt}qT(Vlr>L7(@wVv)#RV5I1T3!YY zI;7+)w~vKk7yC1 at odsXNMz?-X=-8r=$giR3^y@58>pq~HiUe4&7KZC|!#)d^`KB`E5iKT876yHA7$N8yB$DOfcZcf6cBLN} zsq&BhP~;KhO`dYUc~5=W#m`bK`AP9}jGeCd-E-+4KXC7q- at ipDK1?7uJ43}7ZBM=^ z>^6VR+pRI}^jzk73@~`hx0SsxxyE>WytpOpUgw?}vAW#2xw!F?zM9P%u?lD&uZ`3G z(qlf=Bl52sf6}_wCT#1f&bvALpuf2EO0!DtMKG+JT>jz!wqw4rH%n}>P9v$FL9u-r zo*z|ggzr%O8~qcQDsHQ_Y-xlsFC`z6jFo|~gqq4pPI z-Pm*{_eQ&yi^Zw;((e^i9~;JjG at jX>DbyJ^Ek1%Is=*$c!+!m*2yO#n9;-ffIy2++ z95W3s(iD>j^EzATSs|@`=yUe%t7S>^%rcABHkquM+(v4bDHYQ9YVv$Or8hVusTyxw zmFVidk6b1PmsYBbxYXz|c?20C!-PzV7*T7BBhRbXo>#ZM55-;}<#2N#HMVg=RFDhZ zq{5ntCjPv at 8AiKgY-3{&;(X~5c3u at Nu7D?L+D20=6`+}G#ILb?RDo%P|{qiB`eY6ylV%9MsP zuENIOMk58vbD~Vv3MzUK0>%T&xOv7TE_mpnp~$X>-uc*Bq^#rdghEUb27%Cir5TCwXuv3A ze10v(ui*U1vQ9$paYKYSNRYxIK; zt88ARCeBmPyDAby&;R8TZ at eId2Q_WvrGLZb9eRRZ^BF0ZiJ}VPyiYr at vmDi%`JmMZ zKUmT=w}iDW%F2PiE&9N at DLUD;B|fBkS at 870Ah_vTfD@_BhEo~ zX at CUVNSRoz(S#|Se9Qi5}F#5 zZ{X0>Y#{fCYe}qBAT1CSCNUST2#=I*46e!Ac6AHNU!hs{wCb_C>z_~Sz0GG_EX1?Q z!_#y2E{{cs^$S6Wed5XbLqA=P(3rt@%Cq~{d*l7W_x3znM-Q?V759ZXGU)5hNPK|A zOPw$K*NE8FFc~2(DxPVi&B=Q#Y7IO at _>dSn{Wkwo8>QeN-Cvm4hHrmx+IxjlM==i9#Q`Uc_2Va)>k+m2ntM?qQz_SUzekAkp6pG~4*L3e$HrAwxxXIyx4F!T#)Weil57dMs2Y#d$n298^R*LqP2#Kimz^h8^kNU-%g&= zL at M+NtEzZ3vN9zqMR5pO4j!RY3?&SKB2+vn!rIa~zl|dcoAiV=XpS{`3|GcKT zWt>Q=9&886b!u$uWK7DH7_HQdC7)s8S%zuZOaXO9@|W~)j{4|0l}rhX>@c+j`#!5l zc4=k;Y0#(&3`+AYhALmt8JJgKW!PR(Xhzwgolfn}-!&#OGq{LY2CVzFZt)NxV?wM1L*SRZu$#yIx zU^^+!peE#;+zx)=%<+MbjPZJ z*d61- at yxP2y%%bwxPv2>lKpcpKN*Ad7X%?Dusy%Aj`nr3H<~HRu(-+gMFwzSeuMO_FpEu+jUg7oHa>vPE=`7QL|_oE0I)VucDN2EWYLG-!?NP^a#>E zcGGbM97~HAhtKiAoR`DzVt^MN4C!113 at fV#{JhM-(AKfWiXk9aD&|#w`kf2&w*KVM zwr_}8MomN{RwrN=P~(R$xVd))wIpkgt6Ty85T_~AR*lZtEY7i>KF4$5GcHS>6M>P< z+KY?MxWtxBi^QH9i!VdgCCMu1%1xmA43E$apH$cjPjzHX1Y7Xc$(T^xBww?4(p-Ta zjZo_X(mv? zlkIj%Jzj;YpKU50>RWOAUF?RuL38I6o`w$n+FQPe-2shVl@)&bK>Y znVK2gWk$GD8FP~A_22l?6>6pze;wGVzbW}L{PWo72LI+E(NuoiE(&_0?LbAF8 at n2E zZrVUk3yvedK)i;TCgjq;r^1T}JvAUe0yZlQ3C5{0r{3>rMw*D5C}%6O?PQ<_rXV*v z?e2YA7sGY#z=y*>_?#MVrbp8g1v%0~bi+0G+xhadWw+hrt>fZ5Lj+{K2bf=MVNK22 zWOHr;+uq-1RB$C+*qQ?0xQlVh^$-a?V5$()Y6vkTy!0 zWLJLriGC`f+hZlfZjJ9X*5%ME^>1ABcLtvGfdjaU^SmDr)C3vSB5DAsAaLg?fe?bA zOS0AMA)yj#3JBwzbbQIDFNt?1AwzHR7TqCbWQv4Sd7Lpb!~~*> z at T0nez|rU)S~Cy;nH at oIC{@(D zC(s7wR=Lq;ualMb_MUohb2~5p8QB%l;E+R4o1sO=nf{i=!U0X|7RL3^Z73t06h_~F zd7ly{k^Yz&a|p={e_%e+1!2BBYlqHQ2j#1*Go;u9va`ht<;&_I?uOxC`=&;TGi@{o z5D+uu|Mlpp;NoZ^W#DS?e{@b&X}e7^#Ba4?k%$6q at rHYQ+~Z?%Pd3Nw5epjCmJ;q3 zTuu1=q2ENPbaZw{aFh%Alq5YbD|&NQ2v@^l;+b5`4Js-pd;;J08s5Hm+N`6&Ia4S!oiN9dZ_2AW{5P}T zFb9{C{>(w_T at A+ky0%Q-i}*Z$tXCT$nAfMRZ9mN|x3>>qZ!!kejyyB{5v(%dX zN8V9FeOJ7t49GSeJ4;e;pvtsnVsidWIFGvx-UlC{Br4%mjh0-25>;x6at_onXXEv^ zC2Z!K`)MiYpwJzdzJX5U8jDCP at n&}ra3eL0p30W5F7=?Ql zcF9T=Qs5@>==f#rpE#^NO_y~arpeci)sW1dggQamEI4NEBuI_IE5CiGFE+BAsg7tr zTaLN!!E`;^_AJz at M&#@`Lg4`v47m{07R>N7D$unrE{BVm<_k&V~C{~(p31J-JVT{0(5#Bv_D54VxG?2Z-f z))^n}73i%}t$9K;{gnykn z1XM2;>lA5xKVsPyhvc|k82K*M39|SxX>jYNF~F01SO9~UVaJv9p+HzlgUxi9dwTF29C1`W5O}NB%|HPO?FCj+vWhF#^~B=5cGS&)TLai(c%_g+ z^Lh%?!fg#JH`%PdIlUxy2|og#->_5WfLXm-3bOC|z98W*kV)9_nplRFSKylfI9}s) z at 8VzIDvzdE^!$}8k(1K$6InP~!&inrP9Ksj?Sd{zDQ3xkUE3|!TjtU#*=89PH7l1t z>YMvuE`k>tygZ<|b(83Zg^33k`A}8X=;#pbs|izJF)+oNI`BgOtXnOlMntLz#VV&IR)(_6_<}?8cEB?f1fBQm2HTZqUtIaSfCfTu^mgNvnt6{|03rCuc6y at WhYQ zf2IpXE)kIqCPNDT5;JM+Xeu5V^g&ve=lRf%Dm7oXek?H{8dM=D at 4fL7FsFOim_&ij zYx_~oz at O3_vpVJH3|dHNxDy)WYFw%I!0RJQH8DPd;<-M9g-vVYp-!&-qYA+suhLSU zjB&5v8EHHXcbE18^epE#+jzP<&c029&Of9IgVk-PKRiIaLR(!Vq#4R&DgoCp^fxqw z+Ll=x`*K)G+%?PZ>XW}aMAlm46 at F9D!uMTYfkke^?G zxv4CUaqyb!M8F4429^~o=x*tuYO5r-BZ1Ec?*yw_y$yQoYO$vp^DtKS7%LkE$6fOfe3 znpx-!R6ucQZHfWYBWC{TlgO~h?dNaEL=DD8ok4fFD|x~IX39zjgA#uIC?lqLAX~hl zY;i{T`4r+vz9j*Pv>nt$cGOrIk}!Uo`E?TI;26^RGt>D*!w}EVEI)cXVgpF+Pw4AQ z9b;~wN4Oij0oiWJDAA5rg@=6iP_f$V`_hkS$`3hzo|wj|ecAyg(Y2z?yj|wXW1mUl zd5HyUOFEG$IX#`}H`u=-&I^kbDg*`uH1>}v#{W-<|2x8JT29KUsNb$m2xSVIv?Ux; zRBW;^!2LLM38bxwnd~i4bS3({lI#Ggaju-CBzVZe!`plY=!rAf!&`sO=naQCh_kab z2)*pPw6nbW+8z`M3uTd!scat&FCQx(FP)ij0>7W`Uweqo4A$=3F$Nf7-R>Y1-Qk8y z0rz&xQRLlJB1}xt9Zc6kTQFcKhVIg^Nrn>c^&pZ6a)uKj78r6&m$7#+nj>Qw=L6ZP ziVsLd_4%2VCg~K>-l>gode_V5;+reIjsy}eZ6UPEJ!p*Bpir-vm%nOTx-ITVscQ-rI^l@$>_ zqULQUtoIyn0o(fYJJ=neH4~7N7!%Re6qUL(- z^^#ko0^tW!r*LPpPuIgWlf#O9hB9K1Zwf6_&Uz8zw6U;&0y(`6ECMSYivjRpvKR~N z^?x^9d;^v;6y_wVGfO=a3T)YFS(jmond~6_XECzWF_wSpE;|JTn^=0<#>-fvGP_51 zBYPnwVnf$DOVUu7tcD)izlAru9&<=j2}ji(bQoK_{eBX0mscPZWjwpS$|{GO4h<^q zG*d<>0*ypRzlXI+BHLbo=B;F~6pdlVUT_&yqKi2X-dBjJu2c>AtAfR1m at cW?Jkj<- z9-Wx6Pm)QSF^cT>J6?4z)RkJH$k+wzv{NP$PGF-&e#x5c&)p;M>>v6mO3oM!j2TMK zs5Ufbqq;vOsNEn^oS3e*$Oil5HH1OcnC*d1V^rxuCj;GqywI at UWeggj^JVJSZ>y%; znq+t^kGLt(*8ZYlow#OSv&SiOGfv at fkE|?dEm-y8vtx zJS~D#!S(0fMMI_H2!}yzhT{r;Pan2sjz~~m>ODCZgMbSS#jN?5ZRMKpFShq9$#>gH z$|y|NSIgGp)?0hxjL4x;a-pOGWADTQk0yNXkDud4vp{ae=EaR?n`$y=@lllVId|i9 zq9+2~)Y;$q@%*B)k7USK4KO_O#Af;MHMa{AU*d`IiJ<1C^nrsvK$qeb3z9|3&@VlgxixHgN*xMOAY`20Z zeKB0MjB>uz*G#Q*ChI9u_s>4hJeM2Qi4B|awTybQss$KoK34v;NpGLb;MwoAgNbh| zm7R{L+pneKH?6_mx#R|9>9Xi%3xf1$V<%`D^}HoK at xRin1O=n7^wdn+x6LQ%_<8AQ zn$ueq=0{ydT`^|hH4<38)NPH(`E{*<^K94- z&NDf;#BS?+RoP6lbpn3>09>Gf`isvRAtb;3jDYqV}yq8fe9tYsbBQ zAsx7jq9=aT@OJc*g2d`@$qggyL0t0NC%GR0 z>%RXL4TKh1KK;V_5O(D{)Z7+>GcO^HG at Hr3$-dz+8%gT>erpEP$8Nzio~leA1OtNt zOH+Y8Y;;FeL3I!v7EMMqRtcOIXCfYH4A)SwR}~B)($rb8W1v+>$BJE<3hUly)iJ6W z#tBt**suz=`Gx44y;ls4D~do5s;jYsYVeV>VA5+j=ZJ+hSCs)KK$I zR`|gARJ-h|aXcpLvplw)I<{$xA;|G-xSE>{+qG}OiW_a3W%oD5C0sB%rhAYF3-~=N z0cerWn%VEjiyn*Y-L=vg#mV-RaCsUkDU}y4d^#o0wd(*)d=Qc#hsf3`FXPbjW?6$Y z4lU!Mjjh at Y*F`I)>~(1`tEb-eTj&pUk at LC1iXH4wO zX`7~Ej^v(07#B1G9?U{YwaTz*kSb?J*(35g!(c8dSmCX_93B%3!=|K)CJ+;TpV1>O z{s|@Kpr{w*!+(ywn8SEJ=7?l`^qcULGZySsBlt7CASj+C3(`&)9k?LZ|B!XnRi87U z_@<11 at gdyLP3jRWS?2jwTx7?WLc5=;AV&py3bbZE7fec5F%dF`WxZx=g*-Wtm4f03 zg&|>z{AeBbiybKkhGJkANivuNfBf>P&kyEuJ4R=Ol*yk at ESaw#_!(9585ZS|OD-wL zh{2nT%utdza*;EL5zQHzDsw!LOM$}F!q|J5Wo&^~7=F5C|u1^M)$bo3J*9jTIl~(@S~cWbL`s{3P@%Y z*1JbE4L>Z9fzb6hil7>_0msDO3!$KA3HcG|>Kszz2Ah4&ZaVGr`EgP2bHAXl1Hv4s z!91WGnu`jd%#qQhe`p*FF2SVLjv$IOV?*^|7}g)$H_5P=y;F+q4=F1cuvANb?hdVD zy8KJcu0jAjmGH=DT^Ii0fQ+FK&j0JRlH%)(xQ`ng{O3?wAzET+?OlYF; zKixj%5)(UBegWBwLP at dBq>cgr%}8Vd9rkl!U5axsomYQ%<^Oj3*8jS>en)ED#x~?a zf~izmZpxTdRi9lRLyV!&4=dG&WIsEq&csiiKT|km`LhL8W{5T!Z;&?hK(!20(T~9< z5=r%)sGWS7CmpKJ(&Va6f%ix0(({yL-*lgF^;2cGq1y~rB}-20qx3h(rjAOg4|&%b zqUvNg1<8ov0 at wmHnYYOLEQw7PYf#^2obGkk8!@mpe0(RgT%CIj(J-bO1FvO|M!k_8 z0L5i$D8}4eLnZ?5dW==`cBzaGPlODE+4b7Wu~Bd{@>5;9>y+*Y&_W;=V1v5$QYayT zfX at D&W8;U$w`!{`++v($6a`OkxDjC_? zOOKx3dcf(;-HCcjj;49MLHAZ3TD^9L+MT_U_m=1%{nPC;V=6uTWlOpC=8wyAX?Nic zw!44am0T at Dkk?yw2*q2mUmB}^=YyBTS#XHNTbbYF(R)q8Y8pmeui<&LmtV2ax8CG2 z$kuc^K`t8wMl&|{Jdmj2?mA&NlOH#*#lst=)=t*3x|#H5DvRgzhR8~vQG&el0{=@Y zFx0u=XHW3o+&+(8!zbVL8y6^>kvmiB;ljWG)1(TG<2LCIr&t=FWd6J2*m!lv9oMBp zE&ys2=}{Q5<^A51(N3y0vx`ckP%K9UxgjmXq`I=aqvHct9=5(3F`aqsQxLr>yZFz3Z-e0+2^B zyyB+ciPwTHIi*>!Iph*bbNI3)!T^qI!M6lsp5Io{P!n0^ioP*nfR05o5%jPlX>Mvb zYNhS{-#Q8IDjS>1FN8{fF31wkYa!XE9ntpM4wT1IbzczGH at d=!n|j$dK37V=cr~S7 z?`bKoX{jz}ng1>KA^lVCdol_J=;^fUG+`J--iuf0y>$HgdIa`&1H)!+W|0kMm-;Rd zR9YgfxBwY<3J!5_AycvnuNL--1PaC!F|>8YqjO^)daOHo+Ql~9PgaklL)uWz0L z8)7d15&F!*;oNuL({g1I9w^ zbsfFLDZJFw0{w+H{?PVe&HW at Cyu6v*{t73fxNu-bx&}+v!+`|94UebDv$UgySsr+$ za4N>)JOgSr?xLfr`!Sn!ex>q`- at 2OQ1*!#DljgrH1${BdS_{H6Wau2?e~j>zdInlB zM5GW!E(7qAEO1i5OAv at d?)$=yA5}dnpK!Wd5iM+r`doU6y;>oq55MIT(l3!mi}Oyg z<;ODJ9%_5yqA^DJN9JQ=Bl8TdXO8cDwO0j at ssc@`k~HfR21Htx6v8lY7y{S!se_(!rd7vSF5U;Q)PH5*LI~X zoEDcjj(n82aAziA3%C8mye=vVen$z+C$-NTYQPiPHphZsAMp155TCbd4jYSF;kij_pjf92q zU6EDB5fm=3u*i>x$@@>CPs-R>`JY0c!|Nn?O at n5y5v$1ym|f_L@`=U;i97k6XYxOV zJ{3bazG=315O$?SOeoe$!BKA at g5(d}=--a`pFFvA3+ljM&-~$Q|M85_U=WmXSXdyS zUzq<5qwjx4h5u#rd3bB9qJ8V0OlMNrw6;o;GyUF>BZmSALAL at Di$lPZnpw$gkPCb= zy2%&iOb at 1{H}@7QMFmA`R5VN~%te1Cqf1ee1(s7PDGceXqoVeM&F{|kRqu8 at FlUr1 zrwU#7-0V2bzRmcaR{Y at MK-2@-c`za9y&R}vo$Rw?*}fEDyN%iZg<$C2 at 6WOIUJSF_ z&qvrD(UB|n>yqb|uk`cU>*wZri-ky=@NPpWY99^q@@Yp13!eYN$9>)lrzN=E7sN$t z4CBRgIy4}daF7WVH|C at tEYi&mbKvN`5GKQ)96o%_#gTsvzxv?+1QJNTqS$^-2*tt! zxeH!Sm%t>68DEiDSlF|R7 at iVwT9P22F2)g9QP{G)jtoBhf-*8EL}o9XzUwC!-HZ;mn0eSxY%)|WN5XB*U2X(V*34$R(QSJ*vV6f&*JJ(=8e=87+252h zw`UnXM7-h%7pt#Y2HwN9V`iDYgB_7^H5k-mY8W(+b1dg;m2JoqBO=m!CA*CsPRcfA z0XGV9 at qT#sU9K^Dtk0{)ksJ;yRy_vKqEYrJO~1T{#h3^}1?*X06ltHs16mrob?c9{ zWBbg8Q`n2&T`cw35qyhm>c~0KV<9<+T{?imdR^ZLbi*Bl7nx>yTbHIZaF=c(VhDNy z{d`-U^*<;(=ip46t=(rb$;7tpJh5%tw(W^06Wh)c+qP}nwlOiz`|h((ec#^aRDJvW z(^dUfSM}ZN?rYVrueETaMDmn`$n4y92zN#59!NPD_A6nu(!1mG zGPR*1_sY0`EP*_Q?7dGk?#YrQucr1%>Xv(^vm{m#L~F(g){`}n#7E9xMAd3+FjYwC zEL4r}AsEN!TUs`sW3VUGdZ-Ofx&O6GovcU%Jfb%82`4)jhk8mE60loP zc?F0pRQ|v%@CK0tT68Op at kp`|6tj9plR%OsiLu0nf|K(?M=e{~O<^&8ebS}s31$}J zCY1IfNZwnK0)AxXyayoAX$>8t|3^UOdL*8h?n3CFWmgR-CJm{CtS(7IN#;zz%PQnX zXMdbUc3P}RhUZ2i7qP12!-OOUw}mu*6Y*@@C`#NG(rJw31Cz#gb3*HrQw=(fiWb|u z_#G;j*%B=DV}L5#ZO}XpwwW0Psj9tq%BuN2&B>^OjqNp?QrtkV0SbKa!Q;q`h_AY- z>1M1Y@#tkCXeS%@j?I8-sb6!1t|7xEtE;*j8L3y)ja&Nm5I;SPsv9962`*d0=-A8s zF*E$nQp4Y{Fs2$Tk~IR5-gvjWA}bw~#IHw1Qi~pa$=ID<*sSK{al^Q{(NaP2b>%O& zsOT-XDEwJsodgsnCqqB at m&P5w(V6J#aoea4G^>%8__Y=o!J}9XsZg}uMiNZ#72CZ} z#2nu^^JfjyoBWYx_dOi0zQq~JD#JrlBj`ZtpU$vuX z_x))Gm%8{-fd4bHyXCfx!0T51F`p{>aUZVZbZGninfsHd?yGcnI zYj&ciTFC^IAwgZ8^pdd5Uo-M(vN8 zfXzMz5-V=8_+(BAoRU--v3I(d&log$TglAvwG1A>B_0m;dIlB^&DJ>g z*+eguXu{rH8tGW6l6Gn(Lp|;dONOMkq~UCuXWFf%1ia`f2Lp8H(M~LDeA)g>FRiLh zr!UuwRP_-vFh&v8n6I0KRz*MJ*@y3JemmkNlVmWCo8UkW&wL4wLl~jgr<+)_Z?=%l zx;8PNU)1jh?f%7}Q$-E^@=A)clvweGPLd;Y$n=haFzT)ISap}3=1$q& z2YYWNLEzQM(@9L<`XMEO at jj-ook9G)=Gjo;jOGr_OfKof0amMm5VLtEKa8598oX(x z-1yl+mjd`0%r8Y9wsE;BiI1|4qQu`zqglt$>#P**ZugMAM~?1H=UO<_gV(HvQn=C2MLk!) zO_Wj1onvrE01KP at OJlAU8v`ixf69n=dRbLxeXznk=PNqcXtEzn zGZraO!P1!w&NVReq8FxBO=zCYrc}VIDT;AoLvTuG{($*J#JllLaBEw6TZW-($64Fd6u at W1Z#0Zh0yAc_{|=yG$Vk-hj;V zj`VN}QAEuOhG5AJC(04+l@ z8FQC($XugffM2EVhCF^9lDSE7l9yUc(?be_4 zv!%=5ia2$Xv-p5Ph`j$)$X0n4PC>)MWH;0xW*?rMjM$`nXk zQMuT0v?}xFS7-dgr$*h_#AhXwE`ocNdmF=CwY0W$hSsQ6xBX?hYBJA!Dz-Ss?4?Hq z^8nKx8}o;hX}hgX+rf05CfmW1e^l};(6A2qrtS2#UsA?1eLpK at jQoHkD`w7DX(y?< zj>mW?l@%kUT4 at D)6VY^=R4Ce7Bej$T^w|9sqp>$(35}v0>gCh1IuVzlW+ at Z;I86sh z3yQ=8@~&=4N4p0Uk2>sR*NsDw9Zw|DL`gor-hng#oHwv|w~}Acw4 at 8_Nn1R*OBX63 zbd8Hp1qk8F5Wk^#htuNcg$jQIj46o(E#}6`lB_c+m)MMQo2c;a?i^An;mZxEipQ)p z3V+M{GOo6?+30{H&k%{jRmupwch{JerB2Q?0!HQ|VHv?!Oe3gjjKzmtB1=|UgKu9I zwI_5pQqmVOv4sWxfT{bg=87w9sq*smv)&-`&8R6~mhgv%M|qZUqAmtT at 7b_HtSVRT zMy2O-m?JOfcobVQax`*yuOSv$qDwUxlFz~iHe_l{vVj-?XJ!A4!8L(4x zTV5dFugLx^r!Z$O^Z}jxm+-YgnMN97ambid^x>x~V88c4(iP|fts;gIyW*802dL5w6 z9eBEiv=k0;as{DSghw{asMF(-=0>|oMEy*hc7jNAgXOIzYJ*l)#Lu!c(h4gI<v6 at XGV7J3>wTGp9xXplMzOP)H7U{S z-8H&42Yi~m*`YbbZ=H&ULlEwu9d|AvzZ9C=;o{!nS+RfOLFlql|B28=4p07cK0WZ! zp!eC;df$zM8iO;B^$X?8?&?UoOszD%U!$Ddm>|NN^-L}K-+OVY4uiLx6xV z{!b}|pq+`6y`{-N8y@~MwNO!1Mo~xoWE(XTZexKQvO>YGC?N`^L7&$Gi~7dG`U4Cq z{L&@a1S(?G&irTp48_|{cF8u9AOCwhL4|#gUg}2BAGd;j+Tv5!;P_*2OWe9 z(E9jmkIowr5yWUM5rS_*<%FWno at yDrZ#!e>sB_AM at t%juC1DVOP66=%^@M}iDzuZ;s|xv$7_fF{7S4VLOW zYnomS?fN|Le3K3o*027iqHY+gLAd-!_bE5(OS6RbdhrJxt~Sfn+4G|&u+o9#^x(xC zHV#I~-=-`Y-Vv2j<;YIrNwk$+#TJ`3srXp6k+$h2on2ShE`5N^>~OB&b-VCq)_JB* z%b|J_RWmOf^4+K;Yd2}@6}Nm#3m5Hyr%dA}nc2v4w2C(4j6a<*gDDqH%FIVHy=OhW zhY at +);Puo;v5Jl`Sm4d7i30~TjJU%&{@m1KEi}6>f1RofGoO)TlamTB!xB at i-U%11 z*qP>#pT4&9B_7n&sp_?UUg8)t%}*E#H6=!n($rVRn%=$|gPJO;2MpAP55EX0mO9nK zaoX~id5|t!wadKQHBzZ~5q)=itA1U~2!gjR3VC?2jljL{_WM+vR^X<!Np7Ced11}GJ+8d(+$ob&fY(EB2-?Mn~`qI`Zw at fRsSc-_Mru|EmE zK^iV0_(Y}PEZal{_6;|b8nDXJNWuLm{4`T3@`*nuY>SWo6^!f=CDEcE_e=c3kYiDB zdagf|RtDl$W&37)GZF#b8TpBg4 at n#oQzhPBJ*qn|oBye!}w+DG at hcv<;d0rfuUbVi6 at gm3cWzr7!|kK{(T z_znVc`U3<+=zse22wNCB{RjAR+-_YAm6t>*Pei$DU&HcU>D~dQ(`vQqk|ilm!!%Q^ z at eCx%I%g(48OstjoP~011j1#R?iCWzWL>oGmRQbjKti$q+*gc`bQCY$0U%&HS1499-3m~T(w&?yZ{1Wwl^UK`-i(k4(^wHTj zjf6I~>at!IEgQA`^^vcZqE~OAud72Ba^IXgS;6>r(~40vY%~O^xXlI1|K^t!<%I$Y zfAh=ifAGszE$247{*HdpVpaa-3O{R1lxiiR{uB*Whmc&3P-r-mXQ_VimVzB?I5h8k z!yndrx3%3BhG557!CunlnCHcrk9mfiY*hHtg>Q`yV_(*$8eHu^Kc#g~einG4p?R|S zT89b~&i*EpER_25=fG28Tq6_~nMlPa!Iu=eC4D%e at fic=9l>b~Z z-J?h70((lO>4NeiaaWrS$^Uy4q&qN{fYAlt=?HPxc!Zd60fj--`4TMHlGKO4F)a(@ zgIhU|KF6d^nI4JrImQ7zCCE*Qib35ns)<(NE;U}nLT3d3Fd9BLvA~p*NdD`$2^$gp z(aF!y6DJNN-#`iCj<5WQtPUSQ&H7t$q@)qZ8 at S>l%~b7ntV#DiwU?i@$?=M?zGRq2 zeCQr_6^RVEu2{HPodNtpm?k!s{w-)73k(up0Pb!<9FyfI=}ZTDBL1{V4AS`QHTc3u z7hH=AC{JOiF}g=KaWrQ-RJcbs8SyQgJ|e>l#Q}j>NI}X>775*#Xz~N>?V58poXA(=GhJ#xei84B^0E>R}uK1cc*1i{rn?|BGHG zscS3XEdPUEiW=FD>)6zQ4Pgev1_s$0Q7|H+3`Qpz$;il at wb*G6U at yhFg}I4Fdf9J~ zcW%?$t+nlk91S8|$wZ|UC0Ocn&kwt;H8A^}JlxF{>zTdAKYYcY6A84yF$0|+fnVNV zPx?RqjQ{j~MfW3V!4pKSM;eGjn74|CNC+wSW+3PVt$^%nDcTjyfT^+s11CsbU@;sn)U1%4G1ve>L9 zvr8$2jjw)Mf?F-6F{52zH`_Sp=>S=!r?Kk6*DSGr-htU5^68&{?D~fxXK;8udcujRw z_-(p5&O+LV2in)0?vD&39UtRSmIH9tPmRdY4&V2N_9jXJ;O7s zA5>i7v3 at f~<}bO}%AuqFM!6d_kuoOMnvT zDB1vBqU|(wI;YpD6CfVH-gcOor_9*tP9PJSX$hQ3zWc&7bB~y}79a0}W2|2m?`^hl zAEeC{_h1(@n8jOb*!-p}dih2ZeA1P6{+82QuOGwZuY6$c))c?XzxwPMyQ^v!hpQ{h zo{Hmjt6XasEOe{>xyiqCeIPCDm-sNiJHzTu_e-~pfICd zt-3h=f$m{H=UA9DM{T!7R42{0yW|>UmMQd`P8Ep6){3Lvv6Wad at 2PSp98Cd*!i0`- zI8NO)%bQ{CLs;7=&m+U9<=k-LX%?3{+HAU|Szs1du^-Ik6Cf*!(doL6cp^ZdqNNNs zd(JdwN_rgNv=xGno0noiUkUzdL6F!gxh6Sl6=?^Z-ao2B_-E-mC4aJ!B{qq7&O0{T zm_38Qv=_BMhs-v1ER9-;L`y!O&TkWybnSQq!uZlRNYeeMTypL!l9uQWhzBQiUl`RF zyuPvZmC|?o$uWY0WRpW*RcUEe=?E5?5wr~S9NjaNt|KBY!%~Sm3dp%`uAj|i^aB)Q z1Y})$ad)?9JpTK9Lg{9FD8DD!zf_!+RqT}v-`FX_VD7CV$kY+Ff*yI0AQ{3|CT6Iy zuWav5^+(UT7oQs{t!#1dNybx$_c>1U^&f>7QeMIPnjQRVmHEZpMc2yeI?F9kn{!L; z1vZ5~uUW%i%feq7B9TfhQ01S)lO+}Xj#NZvb6>;7_NqyctKBs!Xvzm32xbz02e`_bsK4Qb`(G at ygHTPaNVF+1GW6ud>U{(J%R8hqGGci&B?J zS7ubEFUdbYf1q|#S<$^%K|Ck#qQgc+H*5%pjL)kj?`Kv$#Nt2d at PsZtb)!MM#Nq)k zztcK3^at803A~u4zeEo071)~7ehOQZuee^ziqKa&?=kWTFM8YO8xPQdi6+LIvghSN z0rCoi72C!rqs+aBV&C%7?#z(k?Ya81gFg(f)f5MJ zIU at qgEs8st_uV!RMc0TQ{0&4Y5665!5Loyp at MN$+LINiwbeHH%1=l;tw=;5wN0X*x z5C0E<LvuJ{_xzD)dd?C__o9 zfM@{3Ev!E=`TGe{z+&P;$?xhylj>;!h54?XpP;V=H&`3DG{$$bEc!;n!RYuoraWk! z9sWzKA at H;5%Brg7OO#E;>5ml#_Ccfs($T-uKi>7v{ar)}-^lSE$$KGa^hA zh2Fr>Ca5mZj8%iccFLiY&iTnV`?{^^XG%k(#x5~e_nOS1T!E7>Hin1Jo(DP{9c1d;K4x9?CFpJdw=VLW%rc#H>xbgz~49= z!pHF48Qgr%#o+JLqgd!R9>!&AnWbufYN-`F^6G3scxtbmj)17qPvtoo`o at kQf7q|b z<4*vyns0~evdc&>cH4qs>Mj&aVah?;uZ$1;&4}T;7w at V&91YzZ^$OPCsQj(aDl-Z zDS^pxC+tDCr08tT)vG+dDc+lP7WV4I#2rF3JhNR?XtU!m6a6vyxY8uS zB=oakz{qjDhS*WDoi0K;63V~LnVv|(lwbO4j=RfYLuTkm8!cr3MceXXGVFQB(a1|% z6vCX~Dc(rj=q3_{EGS16>EHoSK&EA?SiOtNoQx}%YC9B*6s|!+r92m(R~<5RTEprJ zhqdeQ-;w0ze at BwY82vv$@w6jt|A{0up_nWRB;_{>Y6{Zi!ryJc;IT7>-hxSHYtmvX z(q$IXxrl8YUCtu8Sq;Vs{-%;)D7`air!kVS%qAbov8;cZSQ8dZ2W|UPz at qab#3o}~ zY7{kxaHQ-lQj;=cReWwQ%~p=oXEJhE(z^f!R*CJyg-;_h?%~U3rfZ44!gK48nk%`^2AH|2yrzta2c#Q?=zuZ{A4+U+%-f+Kfg<#x5 zXnxEF at xR=dcMO22m=^Sf57Wd4h_O&tP^WXW+|=p#4u(`3P@~m4Va`gl5N8Hc<$~|O zxk-&xA)p8Ax-W*-!^>?LHHWT;CqMpT2lCR zm#oNH`t)*xzU8)yM^M$6@{d1`4|X(sbkz*8jWMn3-0e%v zE=`P~>HNL*)@M1kDhLrS;bB%~m>6a>+ZE_MlV()%p}1 at XS&l47Sg5APJu45X0m4fX zWi!VRb%`E-WY&7ry;!pkmGr`E{q!r)?oBR|jOd*?4H2~07t23fwqj+Gap;7>H7pk1h;>fOcY5 at -4}#W}U8XhQ1N z=IW-7yA&qr=mYJSFGnW%P4!#Nmu(%m9u?mM{WN3s0lW_R81pya2S{e$Xl??j>um+` zX@{XRJ~TT37k}dCZcLbA&HNS|qnQFKrVhiq2BaF+b-F~;b*7Sf7g>!bqX#|X^qL^* zt-~LJ2d9Y5Pct3P-rP>swv6pL$w|6UgIZw8T5x@XeXv+xF)gm<7=b^vxq`H=Dpw=qu7<`+2m3g;=@}UxU=RT zOg!X=6kDqjI_sA2tzL|_A;P$O+sz~)_Yqhv=U5Co@){VAOm^3Xn41yApDURWACP;3 zMcd!bYO*N_41s(-Gwv#9>LVS;^anHFv)0vw|B7vW9ByvgG{JmNCVFF~#lyO|1*u^@W1Dv&=c+sm17{9pp|8 z0__VI+9|*o!0D>F0Ta#%t|4r}$?krH_y?NH9ijtaOZTDcYcrGk|@5xrbvxdMzU zDi?;A`rmlcA2fVwbjr0YZ(No2l{gE!Dym|7Zu5w7NlVoShT#R4d+`l%FZ#JM4wrQ8 z4j8hr86BT?C2g;@U751c;48$NM9Fd@(mGwwt)BX8zQy>?-V!-uw3XmH+p!*Zzg2+o zRQpi7My|3eqvT*-mE9&4O1tJvEoBKk_FzR=>`iz=qZY7e(Nv;J6imBL`e+(n`)>7b zJSpzllybDYf~I~6OnlNZ7TbDTi7}#n^A2?`G&SZAjJQj%$eWnl_RZMd-{gFX+ZdoGx at ltEMkvTnl&?sjpK`deD%LMP at Dvvv@- z2(#3t+&`bvR9 at q3d$Ks-t0#f-{1E~nZ=*T{f{izL+GR2XluN7MicwEo zow1runX5ucY(FA-_E#&@BCg7=v`szomwK61mqsJM?Cd$hK1*+|>A;BVbDfYItG!MD z-eZ(GmE?myx;J)G^GtDwq6cCz0VLm4pm+%8L2UiJ;kk~Ic7gJ~=h_*=5rN1KXyH>v zBk at FT;A8?ssT+aL+J}l8zw}5zr2luyd3 at qwaR>6_!nJ(MAev_dEOmFRszG%XLiOG9 z7CBz)<5lRC+VXIu0>{YXn3?S!&cc;tcPElAJDMh7qEG^XN%qgEyl}e8i=(%vKuVuz zcrMTwHx?4+`&&3PKB}p0;OWu4ZHH?WnVR6a*+Gh_2ianw7muYw0$#9Pm!(qW%%r+p z*-87$k|7ky)3watM2n~-) zn&B&|6y}=fbs{Ss$;&gDROGPw-Ek(Qe^yS;*#nsE} z$2`2B;s%`XP-?iNj at nHAPFXmc4obf(8dZU+PA?odW6}l_-~{nr7Ku66K&clHjPAqs zW#GidJ?Ow<&bKRCe1Kg}(_x{ZS=?du4`PsRw_cRd7%4Sa!60)OF2||q1dKN&m!#!( zb6Pw!y}D(skN37vcOPX-aak{i{baQc7sLW)Pw)cAm}M}q6YD%CYs&ohWmuLQoPh z56gIR>jh&VG%0&)M}ts=L)tp$Je>y(>@h;#B!G`8LhnpIY6R1hN$IaF0&1L6cg$rL z+U at 4qZ$42MP>iEAFVjEG69RZq18b*HY=H zC)e~1$ns#Q)h`K4*^+Pgqb<0%bGM>;Y38>utZm~TgOjRe6t0}S!Gn(i>vqugYniZ at 04U^p)4fk4V%vpaAzUxenrs<*bSy at jR$!#lMDXgnaZk^A8Y^d)WV=^WuLG)qlE~)YhF*R58D7 z6U-7=4w2XA%E3xf$qTBMeM`!J@;_* z2XHBS=ip(Tm+!ZyU~PNPQGCD*Tmv^Ph0 at Vkm^quTAK&cEr(?dn+aV1g>^yFMY(4B* z0v&YnQ0TcF<|3L27w6y+PLBt{=4?hNx*eSX^NNt zIB|-L3Uy_`u+pMgX`x~#sozBg6*S~IZfku+Gg>mv>=x=ck&b1Av%mZm(zSGy>yuGE zc1LKa_py(4YgQb z{BsI5b+I%xjjoL)p-DuxCYDsV7`kIJ(L;{qxE!JsQy~H4B)^+fWwDI18TS(1AKMB! zu2lI7F1l?tsLlmbwpNlEOPCe->W0CV(W(?}r2SI0?4 at Xb8anh1(VDtC+&xoM{hCNb z7gg?@WXQzPs0T{QtcpyiRaQZ{%2D%Gj6yFGWWy$Gyi+H>L z(DpeQVne!quEFCL={WBf)w$bcs)F?MgQHOaOXxi7r>&~pZ9@=`HR<=_+vt%c$Qq_2 zfF~x}^C95t2?1qGX3^|y(VxGM=j2F8hJhsm2Na=)oB286DJ=8^nv68SL!gofWYv&3 zE5V->2*6tugT`Z1uI-YhQ<(!42pCcGZJsp*mQk9S&{UzebHk`OWmOq&2KF+`bqvp? z!;R79?i at IhInu(1#38_Kv=+m`tDHFzBIFNh=!#ic^H&a)va=HBi}O93Qd2b5IRb`P zc~AC-p(bTeojJd0kH7WaH8xwn#JTbpYA|9zci^m-HwvAGuc%c*sPEcCs$Jr>?I)1T z4uAxi-HcxEB{2(7FDFiD*q-jPhc;IE^1 at a+6c?oSC^S|T$5=u5$Z0OK7&AA`Y)H0a zx6}lSow0IxB+C)AC_Cq}vBac%0m&rtBM9uoF{1b)z7Yjly4B(xI^FwUD~W~ z&$>Z0;`!9G_HBmzV%i~F$e`j8K>mX%_+4x^8gpap*lWzyn+AI`m?zC44u^cB%WwS9YsBYqi(WKPhoqh<zdW3%WI2GCZo66L=@{A+37ZhRNrBypZXlwlz6w%(O z#y;Pp#)!Mr)dpPMC+YUM1}=#4wKP}LOvk#sBI^P|>0JXCfkqaYKflSVQoruTMPnZA z8ty at 9zb9w*Q%)O(&ajAluV at 6#-Vl5G&Vq0J0u)d9_1!eGaC%!t7{_#RTL at -slSiu? zA<<(7>=F1CHk1u at OaJiWD~ah52LgG=BYZD5vzQXzIp(YcMz2_>j%U`qbFNwKNPAr; z$iAC at Z#~rK&rIgo>_>#i7hS)aJ&h3!Ooqgf5^hF-Cs2}L zkWu at SV{-ptd*JC|FXxS;rujwxU+Q5l)JdMD*)Q||hgJlKB1QX4 zD`F`IO(^|CEABEA87mC|f|Dn7K0gn1Jkxh2rri4?qEF9g#yd*1EsGoS+S~rpidI8S zaO}3Hhjof(siSC_ at n&4nmRQ&T>FCPJmW~15E~~^w2)DG1rrK0zn|hvy#605=&(;+T?TO?kF!?*MxO8k{PXfQ zv(u*1L*A5iGvYPM_rJ7ap2y}PXj3>~)pHcF?R$$#5b0l9(TGDOM2(zFert=Vm^$cA zMDU54P83=!P>Akzgt%3LNP9$#88&iWyxs&$8ecdk*3`nOwN)lVA#9zqpRLn0*!k_R z6?xdg_4aZ^L|}QaDhu@%p(Zg|&FU;vnH`?6WY?3F>KH|3Rl`(y>@0sBj0&-dk|uU2 zJ4Ot_Vgy~4g>e#Zs62$?ESD2UQDM3KD#GrS66H5j0S@>@u2WwT<{Lq3G6HW0skvq* zXVkQjgR?waXRy!!!$q*3#Iv4-(I5Qg!M7jg=iT68o_PA>w2J+Is_4>5CE$b?h|?l1 z0*fS)wQP(MvkKW}(1Z>4LM4z-PB27^QmU|saQh7B{@O6q$-QE4uyp|gh~B4$e29r= z)Hc?->*3k54-U|-hDIDE8yH#c*g)Z&pp*{zk#q?@qM7HYk$> zpSyI%3Jw&>eMc;#CnsexOO(Upy_8+N9i8BuXdSeFq=xm48MbIF`yY6{q93=<0Sy)W zNh|Hy+d(gTulN at Hy`c27{^}WnDCp`_89T13RzKMJLq(VkLBj)?!iR{qu z5$&8{NFcOp1!O4j6Vdt<>fVs_y~rC7Ji;pzneTvuYmvlm`bY2j^XrSG*bB-dgI at wq z-u|u5kbVI8i|1d{0F?iaIz#^m+yCQ&xAs;UMEjC|-171GE-j(PV7O|~GkH{-ldRF3 zYGUkSEDo`1pz8%r}u|BT^1f<>=AaCzXe%GrQAbQa| z_@!4d7 at +5kg5Yrr;F-t}-*|3<*}fI(&F^@jv+o)PN4TGT;^H at R*1Y?sE}p+$t9KEt5KKpylQ(IG ziAU-_h5JsLw2{U21(FVGmHU{M7mcdwX7g>7q%3J)ys9;FOC-yFw#5q(5v<7NJe at Y_AZtrzt9rGN_7(vLPG?-erq!XNH^9p<1oF7z`}X?bV*eBNvqbKIn13h3Rz<} zK4IU3loXAMa~#@cOooA%EUDrIn})lnV3%6YBW1Qctjt!uiD3|%)DhHR6(z#;U@}qD zP!O8eyggyMrWieG(F!g6rwC|xY6&ol?RO>q)oz%YY;~F#1nWwMEC7HO;bM_4 zv`yy|zF6`}hU^|>*EsHL at W)d4QU}u47S6VqCV;Ufw85;5aA5%8=TGT zw>vgIlXU(m)JuO$v-Peeh>mW*rFH|qr5Zb62j1Q51v?&rekYnUJ`uZYhZSR;k4rtM zBORml7NBXEjq?fU2jxwgi?^btbay1#KKKc}He0mg^RCy6|1Q`|`N%}OZj;`dm at aA6 zYsic;u?mk+G_ueB18pNv4V>M1kah^OEwIfR1<2ETSg z37Axpi4n+N6Vm7b?(KQ)l;z;$|)rsbXR*Zh0@$Oy~g6zfsqwt_ehC zp3>Fq>5_~zSeua#g`28A=cuai_s`^9T~t(t(v=1aG at 3G`RJ-Nls$r8V_^veUzm6Wa zC_U=VVK#oJAYfEKQB6u{k?aXY>lVo&+EE};s~nW9OEV*qmQwO%+OX*p{iLX zgLd0yps&Zk0-%q)&O9QsTZgS6GO-uBn15!)3NzNW(=?D^qkNHx7DwB4(eY+O{+lU+}CJQW~22vELnSe~49+jD#U!P7y!zGhnha185#)e(GU z|NeCA!DffT_HKkR*wicD$wJ*9aMCZfzQ$}aF8PttUoXBBA1&xK(Szb9GUAZ2&_>Ji z##7cm{%js`kdjQ`i!Il^z_x2JJoV+wIf=eo?U%7ONjZ$JVg$mv63%5K{QbwNBbVQ~ zW3eAv5#W4;=qDm(n81%3s1FAR#DYm5eaYHW6h)6%n~!aU81EkoNd9H>X6;aC`2LB+ zC6 at ke89C9u-%7M?O1``7 at GPibV2buL-`Lrv`XEn*)5rmTGp#V3WU{>RP48`I)K(wD&c);E+DFM-Oua&Tf}? zbGcIoq(%tQ)0`)Dz0Af0Lk#}T95TkLGs(p4- at j`1#w=+$)dBnv@{QG3l%U at 6^RC#^ zG*!exYS}+N0DDRlipra`WOjEh97|)WOwD&ZO+n=c^BQWr0X6m(5^r0c+!rpvW6$<8s(Qa72AfiDc}2#5>9U;c`x=B5g%-+jsRlR0a% zJZ45aPK?wIP?T#Dl1O^d2`9ZddeCUkjWJM(m^2F3A5qLf6Z_qXVay+cBj6eFz`j4^3=^5k&_p0&RqDmnnHvQ;)GWun%7w=xf3OGAliyoN*fDd_igw{vZtl*^@ zWZXcmM~bh4;2Ud)ajoA_x7Q0~tF^^F#+{qA$*nWUkznXz#~AT@~Q>vd_07mq01QL%&B# zmb(z`$dGHpC^*8RbXXjv2^2ivwCId}{`L;)?$@A1;BKLRryu~0RHB&mclB$nD;qUS zS{aWT!1Y9?*A?&aRvO;dpXoOr5a$+ at fJkt(h?X+K+ at 19BZ{8GtyBlarpV7&{v62jy z^D$A4H3w*ET5 at yx5Es?05t7wuXkd+1 at 1g8DWS3VqcHsKUI4WiPS$T#{XI$3VHp5LD z*3B{uOV=EDf5B&i-iMIKs(AyL)D$a518#Ii-t6VYpYQ=`;-cpKMZ2Ps~Wk;%nL}d8F zUFL{%CD+cXVppl-^vmc&Mg}I#VvBKa5wj9Gx0S<5I3^>2ow{uMsV##JmzB9p?xf77^1IPy at Q;g?W|{R1Ad#a1o#E8z2Er452%>ND at Wp#yVC at bwBJE%x-jT=w z{ei2(&meV>kgnh|b2{9CyR`9L*=^F(ieJ%*Coq(07YE!TdSCJ_{{Oosn}=3 at CUoMv zm?SaFl=+kMo0o#rTploXx=V;DBi7vMVO`jT5eR8d5)XOJleBvM^$Dm!_!*6vFaYuh zs`!X3Y=a~D$UIfA?+|x^`?jdAM4U{T*AglXsVt~0F)M>U at tccLnq;3QOFY?(sLwo> z1jy1NlTHtjehpSQ%)I)2;I9>e+UD!O9mD??M|GSayjC7ylx7xWJZ=^t?K*=2CFc|P zw0sVHfM3%dIOHFV-y+oWf_Z$k&{u{2;T6rHC at E-vd>h5D*IN^lgA?*u5%hKoEW81cE-(%ahZQHhO+qP}nwl(j)>7JVInyP+NNu}~XwX?sStgH+X z7r{zT60X$6G)Xp58EknTwus-pu1IUTe$92g^=FqeEIKh>TjqYwoi{CRGQ)YB>3%GI za{SiN`em_B+5PzbI{rBJIBH+d{(c{_0cQ18lN+c-6kxrBU#Fy_OV!XDl0+z{$qU)B zM4`FS2+0Qx51H&>CZZLR_d^UCvlyRLhu$k7SGSEA1&%+Hdd026F}&L$4` zaYxAp-8-POAp<`vi0{hbqdGk8wRwyy=gslzsZBx}#KF!ecVfEaDI;j|Xq{b^UQ3&|yWs%4DT6EYZ?pl#soY1mQGKZ+R?I zBYS?j!mGHcI43uoQNLk7#B?o at 4h1mhm}Hbd0@=2QKH%fdZjD?=+0>yxSKmOjrs`B- zj4ZLN!IDX_;p*O0&XR{G72<$PG}Iw8^gjZ4$6(DKKgj4L$jv3{Fo^4qF|yJ7sOYIN zh3aS?z>G#I6w(MNX|~c*oJ(q at QDvhMSj?$P>}qpb9_ut!Qw$5BNN&D5Y1CG6x}N~L zL1G+MsteU}aYPyS8 at vEbXa}9c9E8CFDKt}as%$3c9jB$9#7-zv)Oje_PMK2fqU$sv zxCEnjC^kZK%=y$`eQ}NFa2#IPb{LNvbJ4~&*K>_(3XVdX^yrW0SRFSTOUXehQr=d7 zt{_!n%yRIb)$*L7Nne2stbASKG8RppFwtKpr#Raf_SrIwS4z_Nbmk991k!r?-W*U5 z_bp5cw-l6;v72y!Awj*!!qauwO2~1=!w%xym+WY^LK}T_AGH5+T%4I1KVhnMbfo{_ z=+v6PQY3Aa2&(joBS9IWOQu<+#^kWvc9KHGZKd8^*0xZGyt at b8E?5O_IMs0=yE?$+ zsmFk!$TE5mhv8u_*eAzbn42_0j}5w~fXN-9!qge=M84WRP6?T+KG;6Y$5&WcW9p%8EsycG1* z%<{e>PE6*)=3X6%wApD(_UY#E>gUGwu7+bdXdg`om})!R)h%L3xQs6WLkcPyfJrJ+ zYveD;4xRk6^!G_4${udKS+xet9 at _h<;i|OzZ^8_Jab`&(^!3PjNghjr1lWS at PUwRm zg-e!M62?UBe9;$Z;M3MV1Yu<8 at h2PMKke7Vb+!GClr%OKUI`S=J;93*U-L>jZVA*D zw*WoDsd|GezF-lKU(Hm0{8Wx(7bGS+b(*r`#Zzrp!G zR8w!2u7lGGyGWibbCPOx`zg3DEXU?1xDnReA7`D}gr7-SntdHp>ga1`+$@mtX at YV| z002P|bg{Pt7PoO2zMfxV{yISc_{Z zKRbhY4p0X!F6CVPe>Jo7e=72Qq70-kJ=kVGLRiP-{8pMw&(sVB3&U68rQHxvSqyb# zeq-t$;II{b!V4#Q>Ho5>yTO(71o0?Y>HI7xqn}eojqYMVUtjBm;SUf72@*yX7KH0v zz4z+RwY}(f{Ud`#tc!@_R9-V_u3hGLu65I_(s*fK2?`C((Y_FoXk1WoYqI1#JI-{9 zOU+-qSZp}@1m}vz$e_=`NRaPN(dX2=1yr$&BJGO0L4Drz_^%yfl9q%EUz~Ju{Sj2c z&NDa{l5)zI9=e1#t_WjvTM$j^_cW>tP@*41oNrok^KWBXhWsYkKFvLTJYRx?SGtuu zFkoX47mw7A(_<3quq8lmLt-y(soZXzR|VXxp at lUu%e{Y9xCp7}`pMNTcU3t5T+@}j zp|~o()_=$kMf5_RJ|Jj{&~b_|JVWqKx*}dM08k_her(D`7-gVpSQyn8aDxV7e5dp- zjyfQ8rz$&?`OHE1u>d|PFYOL+tKihvO3*Lobq?~6b+`wyEo5?G at 0r*kE?d?_6}15$ z_)+mP70(HRA6z5D&2PXKsda18NYKYTNKUwVL;%mQOZ^i6%SYw~-1 z`8v;<9YbSP(2Y3PFYRPkUU6XnVxZb_+(*jE6E~HD{+krTBm2rauUwfBsALFlO5Q-k zPAI}aJYtu!LSf$$!6q)P)X#N!XkGH-9a1pD@<_dNc{rVT8r2$EA2Z~O*ewT`4l&ef zN8i|}PD;_NxI}+y_cyB+lNh8Y9Y6X<9|QF#tXqf<6alL=r~3+v`?i!kBf`{3cEl33 z%ls{pvwGg5qtI=J?u|TplcD^XdFRy9JBqokF<;3GDSQO8`yI2w0{R_OxmQ1D^z--w zkotqo`3{X!vj`95Ntq|;?7thY1;?JmG(!Ub zKZrX|oYdURJWWdAPmuxI9});T1t5OJeDMl9CPysV?5SubHsGyp)5Zgl2;j7`(Xr=(*tgiKH^3clfvwdx~!CeVJ~@?~kX>7=OO9 z_(pKFL*QQ^rilok$Gk`b8q*;57ZD!3mDGGlgB%IGR8krdykKJ?)=vfBG?8?}@(_H< z26rd#;26Caq~dfL?~lPV?vhE~D0 at r}E(fl$5V&J(Cti>cyr6!~4#Z(npG~@ItX48^ zCZ0JsWCfep66+gz%&Afv9Z7%01*LO&j)}MHt61#U#5K-wUA+b-G;%VR;m>d}w;1yH zFPH0 at MyHRssSdAO7ZO`!wxMB;J3DQ-+ggA7V!XjVU2(Cw=W1;a{X_Ih6YaaIF`wKX zePBdlGaFc_FC7_Qa>noFxwy=tOWGCZPZf at Qs4mA`eHZUwxj0}{pGmgwUl>+#BsZ_M zVmi}b!mF5W+-BstR%NCgGFgIPHQNW>UqrfE)BggAg5-sej1RgzpmHr6h98K0fpRR_ z;I~y}XG%HRn$J9tmS12;rz>?l+Tib0x|yT$6(%J(G36W^fm5O5?XS~wXslmZz!(!1 zF)g@=tiXo)k${rrn;MT=>0cTtyeR!nJGzSFB?QwA?4w|^N=j_c6p76a#(%9NRPgJ% zcROM~*^?37J)C~Du?W`yr#5jr$A1Qh;>9zR#etg)U_HV*`VJhglH_diT(4`pXDv0m z7ikJ^_l!rKMs0Sd7s|}!lXWm+tTu9wqBL(xx(#NKnf3mt1Sq{c9?|k3Nw>SuHjY?! zEl=+V817~{kJ7<&EmUu at Omt_h#iI{63USPrWcmsyuy*9MoTUtdVsIL at h0I%m;>Y=Cu9V_22A)9n=1WoeJ4M<@WFoE0U?tgDN+29IvP6Dceg(Pc-Zj(U$L z<|NwW@*$i9&8UeGru$=c0;`{j-KzBOxA(kT9-_?^FS;mTx2vxcCs13NsmW)=DHYx% zWk0+t#~@Rz at OcC&5zk||4eSR{=jNnMKBXj7aYeE-OkOi!iuSdphG=DUapVH{tXD>$ zahKXm)&!lEC3gkW-Z`7m@;g(|6VP#WuTGql4QC+wFK8WL-XASd at LZp6{2->g1b1*M zCuv{vD2%&wtn(zEGp|?a5TkWk&l09Hto3&1+B77HbERr_+iY{5OebNkOyajQFEhy2 z>3|ag-59Z&-#QKP=~FaV{}CPB7>4>QYyS~?bwA#;q+*VufxJ7yLfV5g>}oHKyqmaB zdKGIR7t%XG`jYS?UOV62&LEk&o{3poLNS3Bk`#U`dJpt9Hxyg&#^8fEEPKzS&SQLV zD*yH8cS=fLxpv-hdt|FESq7?dLQX-_k&!o7LbRk;l4+tXjLM zjiw0B{l-uCsN#Sm)40rawoh+02X|yJWjNO at 6_)S(Zw^-~T|rvKyK=DyFj7uw at f3o? z7h1JP<%5rN`Davp9S`rm^y#L!aF-C1d at Q3z%Q1)Z#Y9m-{R2 zTnMJq9;Qm(X}K-d`}e!>ZmlqlXo}K})rkz3DJnHEqNzS_nHVPr=<*4t)js+(k{(sf zA@&HX(|fAs_oQ)iDe6{N&zT8E2gF~S7rjp3$6$XeWv=MQ158<&l z>H$HIL1 at ou=#-%o4BZl1Xglm76t{T9x&Tun0YI)JHWbXd#DWR(i;sXZK=g=;l6=Vd z&KtqHg9b${+RjTJEn2>1yU(sLlsH{WRNvHS0|usPOUa0E>l>V9lm_j*jBpHYUb!iw;iX|sH$ zxL*OJJ`p89$pdR*Kgql!jLOFk=&6M~ClX?t2{fUm8JycG*RfM zRLvx22a&urG{UJa7#~f>YopK68xF1(zQT+1+eduO-D3~OCi5o|ia=@vd%4Lz9 zklEp=Rmx7Fo(fv?AZsTzDozR{q47uMdmZu4npO)#_N5iJ_N2Mjr61E(C&m-DbogN5 zEy^eDb8$MFKJV79u&@}-$H$Cd7L$UEV3xPoS*ofeF)bBkI8_gtoBBQ}cBA{HT%kls zPEZRy#FMjaF+)}EzgoGP7;@e+3Xc!|1cOQ8-?aIz#8ELqc|-_TY5db(c|t?a8zNf8 z+M2|@K!;;VDYJNtJzkr17SBo!6*e3*y#-xf7iv;80*a#-#`aeH?sF|@6>xM1#bXu3 z)uJ&}($(BG6H68eRNcrSg>B2T39E_KM&mCXo~P7unYT~QJty at 8{MtYGtfmR-CXWk3 z+E;VX2E<}hTtYk$O$1A3gKK%w$PK{`kj}Kpeg&c%4^&GGcOXlQ=#p2DO)LN{DBr^{Sj0$ zzM#>9G>!R#ru7!CmXSLypsKj^57xyUEcT$P_0?lJ7L>BBIsF&zQqm6_i#id0DZ)aN z`sFTE)AYg08_XHan|ItZna!zaU2Z6e7k(0d3iQN%lLfk^)5Q(f)dvM$FrOVbV^%-> zkrYjUqC)MO#a1E?4r#oUz*AQ5N3NGxd=H_Lh=+eWhEC_5*t}oSGiLOr&xcCY;pSEu zJ4sw<8$^?f)*zN at s#!JElFbrF=e$6}eUwvu+Es$ig)Ml&6+OWxn?%)&XXK_E%T`U) zjB$q_Ic(==P&_1w2JLHFwMNT41206U-H3LImaGOcm7$j!?;|cacND}(^L?pKy9`_v z%3JR-5>>6ZD1u7}`F9!AHP5JRc*Jrz4lS1!y1YUP8Lv_M1lyndB zS9Frj2zZMg_OS;(zp5bizkPNg_I)7m9r)}iZqT|Je++KEe*F&a|K{g;#pS}m91=_R zrZq&#SP>nDeM~p%YhM5Uw-4t3Q1%KN00961f&l;s|4)^VfUT{SvA)g!te;cfR6tTk z)+XB)C$k1a2qyw0Bsa4$1OV$I77-94L%b)DSSFU0wi>Me5OC&9!lUP7sC}e=92hK9 zmf&DPp7j~=8av~)jw}jWQ4&|!KE1ls at XVF${k`4h^>be`jH at p*fLKK#M&43l2+}-I zR+1mEMq!gviBlfGmO&mg&_ZQE0ilAdfS%v*IJ7tJ?wFugVbi&5S+sw?rrBAUt}wK| zthwQ!4OD5g9<0vrXti|0pnPsIMB$8CWQhJFO*2Ys)wy+myUWlKj55jqvwbt;#bOxG zpT1tUlv~A$uA)H}N83=C$&seh+TAvG4yg9XPx|?yZ9Wcrw9VX(X zh5eayWe-R5)q~bJVPPPz$=gU?wPV?eg^5Mt6mvW0oPiz at z0_>cO~jyV*$BL|t5H~B z>cC~Yj%x>XFuAZUmNgg4y4FpLNFh{b>UkA at Eyy^>#jxBOv{+3vOXWI8`Qv6J1xSV` zHZz#+L!nZg)T?>_X{*IPHqvC2ue6hrkU1)1FnP`ntrGHvVe4In7Biu(cK=Ta@>f-U z2pFbG9jQ)ZkH#SV3?uaOtDnA;97q$n^*Br~Mr4Et&FF z;kz6fmO#NYf7L>BhT4-|hxn(3d(2HX!Cbt6nY+{y7&Mu%}eu(3nf7PjYhgjiT zd2Qbgz7xPXUBX$&1JC$~$T(m4eV;D^0pG!r`q(;85FCD_pPX(V at N~1RO`6a|t77T7 z_fD at Q$p?@GE89J4eCjT^Dm_gblH|T)xKon_U?Ly6c+g1jmXD7woP at eY0@B0Lt=KW* zLo+vzXBcfT(*7>Ic#x}a at _H`b4@!@$D;$Di5CCfkx#R&fmS}|Z9%AN at al)h3gsB2) z5^_OX6cxB4|DxEU6zUit7sDj}C6mtI7!!hrSwdN#1-oGOUvxViD2Z58N3gKtb9W$T zS3RH-UJhJ=A$t at Mynk6Vh5gH-$vGFE{)g>IS42kKHosd$>nD`>9OWQ-RgVsCRk>KN z4)_3=1f*NLkHz;3f~W^If{QZ2o*wIW8W-s> zGG8>IB7q1hDuyyQm!+R^a7cK0BC+1}{8%de!LaW2G-XCi856&B^t#RdwC=Udo-h6N z`6UAAymx`NH)F6Gv`Uh3^h!UCoPj7cWCtP&A(vp3>d|DN-b3g~;+Q^(L=psvWW+tT zm~q%hh;n4G8e$`QQvu#R8NC&{Qv;5DJVf$xXACK|%fWKbpxaHp=fT)by$1 at 3)1a-C zg!VtD at TkLSzM`+g7L;R(gtphDx~yO*PqyA>ls&m2Isk&U6s1mdlQvagq0|81!4q_o zV{aXBXQl2adz1+fbu+FAYC$Y{knZeXVjU$7=wxtYkgTIaBz)sL|h^Y6+>R7u=8{!r3~Bf|K1H%}rp)If&`7J+90V$f~-U zJH_I^f?ZREp&`yBZeghCF~k at _m}?Y+Kj}hpE7HS~UMZ4ya3-<>W#H6emF!>xZZ!HJ zGY{cCqm(V7j&z0z43 at cuOK7cs9Uoz_RsgERh}jbK3T&yaK|;8VK>pi zG1|ZEdAZ|Y`iQbkZebiU4RZuU8{W3Uq2lcwcW=aJ8`PsYpfN4jxCAnDb1-R>)1jpp zbKU^}eQI4=g_^YqRuJ>vW`SD0V3(h_-r`!TxehTO_rbA4U&OR=NxbRThkMnYpsd(k5EXRySaqe8G+%716RC~yf=@a0D|8=@3wAfzMD~em at Hc-5xFmpUNFlSJ@s(Pgj&Ga#uv|L|fjT zY1`Oc at o#G>3ie=J0Fqm@{-X86bbqgmHrI8Mdvs{2Y55K_i0vLCk8#JgCCB3RuC5Aw zc&JfV`5xqsf*pJ)@)b~UcelHYEy2=h>_wCMpW(cGilxOfSDohOD>wDRb%mwwC~NX5 z%U~w3ZPu3$njz1q*&5-U4ll+gveFDV0FqnWZqnVK_5f*;5=b-;m+JzB*tw%D2O5=I z*GEs`zgUe~^%45?Ppp}S(;bD%W6_!|ck*vTrJiYBh>z{nsIv%@^kQQ$!b*pM8`18P z4dYG;Y z+AF!Omr4z(4OqPcvK;VBAv>RUR}QZysuo;ukbMtBgHVuvW3eXxdK%{Xwku4n6l?$Q zbXw-(D1PH;eKL07uxr6(idL(g{R`sphjCNAYMepsin7}ZTh6n? zjO^n#~*&P^z1RM68y99aalpVKVxJ*L}?Yuk21LTVCFTlMbi$>$s6T#wC=*z8w%%I?fkTl;J6Q%`HLpDLGPeGXKX#6URF1i z*OnxB>mvNocz?; zAp!tU{k!z=pBEt7PD-jMKQ=en?TPx}#QKN{QiMwYiQ)o&O at 9;NIfE1m2=oF06I2|T z+OxIN+L26e

8svki7_8DSqZU z)gcvREC-KtoXKjO-P!#|`_%IJ$;F!mT#H%_FcZ*$9t|WP4Fuf67=n-jn?o5Ad~*ZH zox2~$#~mRu_?-vfB?;og88Wp~xbkB4n>}}<4wK-f4N){;rwN%&HKgguJB;LCI+$Y2 z8s at -}1(uJc1GzWmrfBIcIHUkk?qp0)GGDv5T1ksJ1+B^|#9y-AG-;tTK5{UT8C6AD zf=MH*5+Y4!DIu*6iocjFDvhezH)??V;z_aQ=!RS}o2>g&O~<59sm7qUexk?AV`Bn` zc}Q`i1Y_jpxHhJ7(Arwgk*FfmAL1`Wx*b1dlt9rKIO#NUlQyAYK3N}=*$xY5RHMnS zw=gE%LE3aCCfWOE*PbZ(RMuF?KPRs5Z4wP9zBHoW_pmElBM%fW0q@` z(&$%s9j_6I_24*E36W&jb5zU|B(@CcjeWJwBT`IqeW$ThK=?pNK*mBq66S0c zJsG$6a-nd{H6EV?MMRmAj9DASdTFT*v6rRzGLLXZm(eZi9+!k5EzQn>Nu26XWdX>^ zk#)UfbiO^2eH5}AZ&Om72Bg%S81a-=jr(GWG<5=!!y0u6jlo$K+8Q-*fMB{8tNu-W z(CVbE(w#`Y2LE8U`)2)uNw4?TggUg;Rtr-MftO)IYw8*3NY~#{9yrbf6Va_J*nBuH zfiu*>&-toDOM1YSsP)DBY51IBM*{9xsH4{r zp4yb5YWSB!zZf)uH`E at QD=$$% zUAiGA580E_n2|<7nP&8Ohk2WLI@(fDZ<~@R+Xyj3OB`d;O+4eQm#nSp5i>p|t)3%C zE6LNoTMS8sKNpTa2|3NAn|jgx$@sx1i<$1N7;{;zMU|Gt!bLO&@G`2>cDGH#R;o*c zsa}M)Lyf&5-be=Xgp0v^3 at s#j_~OmNM|gJKHYJ-rUK8NhFC>Gu#;eHl*>cL2v5z+>w-qKNd|93|Mbe25ot+)B{pnH$#N{( z{8mMzoaOM&(}up^uME+#-j_le7o69DR2|mB&Rl`r4c7>G2S+kiot~v;Ua$2r96{no zpw1kJ27M(b|^zxMx)7XqONeZ zehlzxJea4-SWHZH`l_5(FU?8s!K>`k_j1SL4?J79$!c5|_b7vlfq5nA25#Denc`vA zC(BfDSDK2o at FTg{lgSdOYU6g;Jh`2@$cenk;abWWIyR~unRSfKKLk`b$STWm`ajIskhMXmnM&{RW6w9b1i8cr!HYr{UheN|-r3M~cM2jdwG#7B2n6W7;Q>FRfO{+vm6gk9 z!Xpdk=>DDWEGF*=Gj at x&=^5HZ!?;R?LVk}Rx1dzBp_E%v$}1Z$JVSPAbRfno&Uppm z#*+86sfePdGL%fM&7WaoTOnFJxel at 1;B97GDPA^r)bzek at m<4v(eB&eq`BH%C|*6c z&@{}R**i19yyQ7Qt=?_crgdwG=LM*JTxIdN2kmYX8SoisytE>t zUS~xPM6ME;FrN1o z at Mwo~Z>J39Vqk&QnCM3-Ca@{M)N9KA(+B at uKPJV(dz4=O at +V&(1OnclJ(vLdX-ey; zN371x3YE$T at Uv1y#|I}_RO3|TB2iVoxwcyQx+~y9Fhg^Ezhw=j%77%2M}5?`Rh!=p zcgf at Z=PP;YD;oD3XYw8n^@J}S;kHidS9oPd|NXnO%u02V8?El}jXs3rsx1oX*Hoxo z(5Nv=BQ|cA5rT{G5Y();KtxUDgi57+sBFjq&vq*|){SkafJEMw%h0yqg?qd+W`j!2 zo8txZ0vWn#<~mGk5!5(Yh&Hc>r>eO at 4n66ztT!MeutDi(i8iYI(S}kppK7yC;9MYj zL0X!}Ovy#Bdtl+HOE4U5!W||z7VEeR32!*f3Xq1LUS`dCDK$=fZtO3_slw zr4~(071*m{SqjaGx71j3mThO{Pw#()wR$_(%q}nhfT at 4Sja$Io$=H$jpX2{ax~ht` zit-b~ynxRz!ia{YInd7vN-&Pfx at 2#a2WU0wKu at Z72qiv<4~j0DL6CvKded#cS at i08 zSyHXY$4uvAw_3qac|KvG`w7+YvGWtv;+cy<4Cs(ihkBaDVVc|B>;3*>_Vbg==L@|D zj4O;F$QuDmEo5eVS2s3 at h(|4|f8c_Q&{bT}=g0sF#R^B|^}-5QOpe_~IZ? zMiV;pKb at n}lWF8=r_l?_-aUW0rVm|mkS~jJa=xX9wOMfzaJ3zy5kOfFqB3C#793KH zlSUvr4$+C}>2q2m*GV>YDACn5{;673_?K!GQzoUBOM5dZ3q=k>iIz;CwNHIKknv&KdPxP(TX$i?`l zCEj(mA%h-7(ZXWKeMUrmK6&_bi%e|**^D at Ld#l7~PTyHHq5Zn;0zf%BK%SX8A at -Wv zstyW@(b*{Yp@#F=oo=Rje5+*Dc$M1dyH6NZ(uLvFy{4n3H$o~?GUX;kvZ$nUX1M=4 zBvf2^&8 at Qv4LjX3n>xh$oIzh>CEK`GV}N9k0?lo&eKfDdkWVJ=({6ZSAHgccX{jss_D&IoZ*W%mOJI=hp2|NlH at g9|Mo(@K85jJ@ zQ^p13v6iJPcK7a1b3(BsQMGr`4rNt|d+83)r&b^OlsRie@{i|bsl_C}wMp5_MX`tr zlm&@4*LTJ$4iT3+W0@#*nh)p8QEK#;<|&WD2QVaqc^hCgBU<`C&Gh^}|llwHR2jpcRu8 z?KteF3d~8GHu)S09V|kiW;NQ~iBYyrp&Ymaw>XQwx3O?fIO2GHHcZ~c-H?ib4IgjH z);c$@IIoIh(@C31yx%07 at s3VDY(fQ6G3Rs;5x-T$yd|e!pc^1$b-4CZMHEB-(H6-m z5PO7;hyTkQryuckAS9PG7luak+%&*+yb@>H&l|=NUhx_OW}z2;#vH!OAv at 3QGjRN{ z_`6JuSfD_~xB(d;sZu1nN9# zby3$R3RU$#`a->*R=p+vMltMxCT<>5N<_&|5d1e4R4moYfEVFLvCnkk!!uOYKx9t{ z^t2Z$xJ_?*SvyAA7V*R<8yN)Dp+#)z3c`+`M>YU3hLBf{FA$7u%WzX-7q1f1;!8y9 zHM?LALrf$3Q}gTx#fA7UOgtF-P{*RLu#xshMO`nJ88mlLg%`Ln*xL=JAPT<}BT0Q(HRE+P6E_^5nYn81v7xI>(T6NRZ2$qPH@?Dalcxb5W_ zns%F$OM at T>o(NWkkR*0h#r^e&`>I?=o$OJNj%|@5ZxA%&;8VMB7xX#r|1DkJ|EF|y z7zyw1cHa#d9)U|^MEK|scK!Q!OP`jI*wGw0Edi;HaAliTAh{xcQhz0H0rZG*oq!TO zP=aG>@dyNGw?g at x@0|BfId7uOHz2_=0}1U5z$t}!{UoAQNJva5I0zn?EQPhiD3OzG zfVJYu2UF9`n|NYMJd+p0<`~X&e7| zPjFM(FvvY8?Sh9uSGah-Bpw*}zWmd~5!KT%qfix(xW{JrXpU)6FQPw2*9qE?Qt at CL z at u0%?1U?Yn!2uMHfag{48>43;eg)es%nlsY!bd9!Ocz2zF&jWTq?pIxaijbA@# zDBm at i#Yh5pEP|Px2N<0vMP%t=ri8@%3Xoc?5X&YJs`D6yM4p3Qbe+H!RP;N?eQWQ#RGheIejntSvZU-5NUoiwjuMN>42Lo` zCYEBcdgT#0c&XJU^~_O}!Z%op?A&5)v~Vo=my9Pj4ZFD43k+ zt5Wg+BTh#+3YzS)%0ZD?@;IxmLuK#XXOT8J at +7L>q=?3JFxsC0{5Yh`c-F(>BO`uX z%|+!yV-sFR_-~C~om^8xiuDn==GMaug;cv6*Fj at ylrxdKOO=*GN!(<*`6%Vup#nov z4KBG^C7oD#@&F3c;ku=|!>~h0wsekmyAVZ0Sr8fZmdMA*2F=0cD80O)cpNXUxFpP@ z$_gv?i4gzqZ`JB0>1O4+ib+YUh;r6~liRSEt_ds;vFL@^G7N=L(V|KD5)(W7m_Y|2 zp5OrkH7-%-A3*_pW?gc$#S?K!0Jw1jUdkxSFkXcg94gzAE9Xih1_s3zZ98bd at MLeQcCiSRrREm_u>y;=^c3p|jyJ_4FGHglK2H zl1w1a^+kJ{D7w9M`kpZ92T#daD)xMo5oQx7FN!F-Ln_FS+npXB&l53p-C;-09JoW` z9#X<@PRZXFrOZXBCWEA at qxORFmMJwIpTTowCU5te zy{TkJtEA8a*OmKhvhL at IZqndKERxZwMhoNI&hFGQLk{IrauU$9{_V%4>ooPov6Ey& znI<<)Ze=WgvVQm%aeBpJD-PR at s<)jtgXpa;MPkQ8XHMm|s_{<@!70>ak^yrxS2Eo~ z#j*r4(pszP6%X$*!b9tBXq at uIfR1u2wfssD*NVqT0oizu95LO%bX`Z*tsk41)pMI( zvr`Zs3b^}6@*kFdG7TU|120Jj<+cwbzTgj1HeRO(jJVLivje6p$UVWclMO#l``ps4 zTZ&K4mRGZwWwVbv{U@>MLG}alp0P!M)tsU9pNS&Q3gM<18tjW$Gor$uFuo7YuZ@?I z5-s0f9OqRRtU>^pe3ViM0%6Hg^vS9x7IDvNa0y+X3D-lPq4tmR^+;f)9p}7QF6lSp zEBo{qT``odrXA%&Mv;027G1;7 zt(m)nf!GlF2Khl6y^{^=Gy6Hzx$9}1poN-vS7u=|c10#N&3Ndj&TfGSiIqc~gnY1n zBx-&{LVxi`e~nOg_P0B`JY!KlXw~0bn z7)uYNo;~r8PTO*lAvi`qeu*uoKwJV61WGvi^NVir9S+gVI{IuCH*=ok$7=1!$t|W+ zOE4Z8y=#si!2;ftnrCMjR1mD=rd(Gr&c`qQ7C at tNV+Ob_U2fuAE?#fqtDEpFd>nwO z_Zs4U at 2V((_%$2xHDwo2YC$Mjrr?7q(&yV~sjysy&r0=7jWL9oH!_LH^< zMHyz=LyUNn>w|S(r5WYMdWpTqrQq)yB6P1k?#ByRlB^a9lzm!VABUXzxPT&@dy at B;+ex{=50< z4B)m at BRoBKMFN=fm!6~#i^Y+0umIyir8rH#x+q~@oDrR^F(OBSIyzfBf0fqE7_i at M zg<9mHBz<)myk2-QEQz|hY<;6%BZjzwTK}HBJR-TJuph_k-_reF%LYbh@(!J92FXwj zMtJa*;T>h`i9?shDjM7rdpvh3O^I@$YuB%5i(^i}WXidXcu_0-x9j5+&6s40tT;44 z+a?CvMTT97*mOf4OP4e$hqB7Z@%N6->#6*VX0#LyK)df0d^DR5%8)=QCv at BBH zPVP{2BSGC{49(%OSR+=tl?cwi|6W2jNd#0AUT}A#H9;{aR at X5~sFVD)SYdVu8fOMi z%%UkzB|G|w#6U8GdvB)ttrN4an4r4 zA@)WoG&^Ym`iZ(Xh+^Zb>@Q*Zh95om1$Ua;jVM7#V&#*bb8pz+lGer4NdOi{B%p-9 zhVJ&eLsEs9Z;gbqC6v-#m+wO^374>f6_3R51%vAn`pz#ucXV=#gO!!#fOb6Iuc1W% zNg+4@{5Dr at n~XCIVS~V6cTF`k+R|(jy}@{8wa1-eK9f~?Cad^pRQ^_9aDDI!J=h-2 zf_eg71sOWM%NnHG!@vpZkUFec=T4_-V!E`lOsQbf9O|r5k0S59CTX0*=$P5R?2BCv zU at wWiwAhR!kwD>I&M-e at Gz zKBiOn&5?Vj!F3+0cP)ffkW~#sa{JoQZt_5 at j+vz-Q1_%rm{I-vfI{$|@#XV~NPPM0 zXVeWS&bHHwZpdE%sJ|iW8{D+I`}>CnOPLlIk}vd1^cI7bp=CDKCl%+;aL)MK2fF>L z4v&b|b3K-dmg{0vIn{eQmLb)9JJvFaXYe_9AHs1#9qY$^0<($D$}+^vt9EfO#LUQ) ze9{vOFu$8+0xYePCYl*TQ)vzhhyneDjaIMb>7^E)UDXf>c)$R5FEs0PCofsc)0 z6Ln$%t;mi#XumZa(n<7I9Hm=7=(+ZzL+Tg+LuS|p_u9C>YV{_4HsspeyGJkp_v#Jw zGn#~}Hy9{&k&iC3uixSk1QW}cH;Vp!XyryojNfC}NoJgta-S4cN}|YZ}lmT?|qaa=)5z|LA{DkPxVqNlu+V4OVBAu$z zHAJ_{*Q$r*jkc1C71SAiH}J&f>Fe) zQF-X-R-H^eC(dbx)Nog7glRzw<#!#hBOYQdl_A#$0;CyZPtRmzq|K*G&R!~EZZ2p? zx?n9#V$kj`+T4a3)I5PB+*bkAU71SAaI_8_LIcHdX+w=1ArV7t`Pef>6 at hPPF0jwC z;T23RL7~X{RD=RhLs$3vLq~9+^jK4kqNSlyVZ6$&(G$r{gQ*BQ8B|uS$~;JY!RpP1 zX^t-DoDe?GNHCox*D*3OnR0@#AtQHaKs9e7KVPA6F$Mm_RMP=qopOYwN-C3D%6Zx` zZzr7wO<)>p(bBVO0MQl~7LSHVAxz3_T9ERo|2AW?C8mpHOEZyX^G8ID5w^-I``gv~1h9tDdrL+qUhhy?5ERZQHiJ%eHOY_v`L+ z?>T4m82$DAvDV65KVxQOL}WzHh>qa5=7ebP)M;#vxITBUwbHIR#!+2F;ch#2QnSIU z7+iKvPsR`u)up9upjV3RyY$t`n3!_9HsN?%bM__ee at 2@qIHZ18y_?4q6LG0zZ}%T6 z)U5orpOqqvWd_t*03&ac5W&ezpDpoCjBE`IYR*)wgZp*%YfEKnSb;9)0fkeUPnB!q zSp+*o$07srU6<@SDv>AOy at nuS+c%m2mT47p63~J!ZIENnQgH^-!>}9b_Ip<)&%G6b z_BE+u_p06U at X{V|fm<+_?cza at Z%*kLu(&lZrn6=hsk!0PbdVKmER=*@j5|%rTbnn~ z+$L0QClt7~vKur6oZJNj;Ez$Y5pYngMiF2$(s)Auk**=v< za?vhFFJKT3W^G?11N^Ym=E9o-7}%>syfJj>0aWx~%7y-$u3IP=vyzQpEzw8+qZUys at h$SFRxAukTm=B$Gk1RUD5w&>bX zA6J}X^gC6nPpc|jOGX%~YXkX*RK?E-vyl#Ealt3&yF(vs-+Bm^lts$(iP>un5ifM3 z=jONULMDS)Twulvq+le^p(_37EREI052t2OG-4j#DqN431>yP}%P?Ile}uUbff)FbL2AuXj0-uOWrT(aa? z8IBF?iQcBe_QiE4n{{4e8!k90bgEA-mDDjo9=I0_mFHuTc1ei~MfZN at HeFBHocjwC{2vb%JroIIz!z z)OhL7CfPK3*nOT3w0YglA=*s*XUyT)2*SY(>w#0vKZb~WPmSnY at F&ZX2yrTM^EmL6 zj5s$3(u)TI{9Zg>%m~8!+*bvG_e83ot}lKykfcd1AK!T0ft9-VSP6kGDU_<;X2N8k z+`S}A at N;PJ%NCvQ0feOTAl&!ooC7z^DFJ+&40C5d!4Y`!E at pJt{SSc%ZLl?_hZ7cQ zzzNY=!@zmj18+m&460sc- at -slvjZElpR8go(tPPsDE|YJ8*A8l9d4^r0pA#O0Z)(! z?S<%K8?R1jgj at 5rH}Yho9%e?{w>%$?aeKGwS5zc{aep$huALlq zz40-O&Dkwt#FqeHon5r6<=_6^84ShErFIia(uwrDH&eK)PcY4Lpw{mD_QEJ`MDfxr}q+9=@`=F7sEl zt!T1AQg=up6Eq_Ov|>yzN)eL)Q}K&eu at C2&U+m1!8WFQkO>RPg4;12jXtwrewV`hx$za at cByfR<4+>AU(Gn|HA;T>hq zc|kdXt at 4UzW2`?W+we at s_X?I%s6VT;eZ;}-o+;|-&*0E<(H_D^wgBgpXt}<|tmDR8 zR_Sl68BLUq3!&D7jls5-W?Ob5$KNb0UT!NH63!?eLN^HnlK8cw4xF@3Ny%6<|l z56CY8_dI$`(gn5&E7QdnlPUZrh1*hL*FHs_yF!eeIB;en&kQ###mQZ#&$R8~i~TLn zKum3OxBJ_wOuNh1-D4eu#YLVJbRg+*SGfLwFJb8 at Kx7M~!q_`R^!RU!qP(c{Uf*BLcb#iYdIA{-5$q)`+0-+Tg at xiw zXqm5|EO}Fxg=)OXF{y@)t^uaA*rVM4|ad;9*cR at Wt)(%Ml2IjiC6$?M6*EH zBJ2PNJ+C&Pv}$o&81)W1RKOE^ipB19QIdz?ES6HSj+t9k&Eb$Wg=k*`Hb|2Svsr;Q zn+u)?y0}xZFt%_#uFG5`Nf;;P9(_}!r_KP6CUJjkAWDi!@bBa!-AG^^Fxv*}^4Xm% z`@3?h+#Ke`Bs6{)%3L9J6<-P0K}wq*IEjxXy3J98;B#eza8C_k+-=mmo}h;|A|ti{ z6o!3JWJ2jzC>?U&sSNrmt3hw*R7Wjg${NX2<7vuQRbh^n`mI?qT{D|OETd^QXus3c zIxrb>IukiS3I=uj6VKb&%pHg}!HOu_ZgPH4zeqPeC=b}u;ac0MDkt3=7kn13c%zG at tu zZLWO-D_Y$qL+oWk_e>2{{b;Cdyp&Rem at 1&k(g`4xLLpO<48k*yYWV?IUvP-1)xELQ zm|{c-uPS)q0+FE)C8iIBZ8uiKKj)De$=?FT3qyIXMWm>{)TmkaZeCey_9plRqFP5) zx(J+M7aDl{8?6mgA}@cx_-40D>;a}pnFkl)qH-qOUDb$QeZkiMnO9w_%67q2_~ddbH>$Y!U2$8l#$siQi&l#YhlCye$ue@=f88iGjMI0N^BD95(T6T9GnJ1a&z z_JPv#g$svLiH!-m{O*y={Aj!zqYPCpNzw~=nk+9HR&x at 3OgG-p5T)@2!ro*CT~$Rx z at 9LvKRQ)$}L3IX+lGfs5{N9JuhaUKT0NFJ&!?hEGJ$(LZ4p!N-d_l_+9wf{z$;uuy zg2C)w<|%7uI^`Twc)OUlDfB*g&7C6%yZ3@~wBYl0U%5A at nq8&aox`4O at s1HL;M}#f z9%OqxYtp7ZUOdWU5w43FcN==2j~VpFe81Wg$YCJl1?_`y_fMC?Vq3(!#c3;VG{QNz z3nr9{kegTlg^~s7IbArn22lkAWd(yra1D0)$r at 8GZbwhS2vJB`k;eE*ue(pwp at Gt?vw`kX(qU(2f|h$zWZsT zL26!at61nfkDQ0Fg0Ybm|7P=Yc8*jGqEqTpQd<$f!%&sLb^Mt>{jG%D3?bX<_*ebK z-sfFrwSc=y^`v-*G+!mPTy<}s8}w7P$KJV_DD9a?G-few46hyive~Xj1=cU5t6a^f zUOHs{g7`Ln*^`p289A&W0u*jhllbzEzY9iKAGYU9c62ms7dv8Z*5@#f_$<}(@e`^Q zIMUGH)Dib%FhpHD<53Vah&@b>9Jk>Sz z1Lqm`S{`GmkLn$3(m1sRYs50gM&9(Ag!M3EcsOF^vB=Wc{qaBlErO*n`6M$31p+$z z$5;ygpA6-{)%u`VO~z$W9qqe at T&E>&5y_YUSeJnM6Lpq$lR!i$V7h_q=ssY>Q#Ffs|Pu at Ap)kRye*<4AV9kALMkfKNoi;aZBtRvLXtg2 z=f!67i9Ez4x at M^4>@m1Pn?b;trTv<(39E;x z&4&J^voht^j;@=f7_`sy&q at r?W^fU{cp9r;HX14mEE+)9{V3B7s3y!_9 zR6l*l1QiXd>|RRwSjN6v{vu$o&^P?-;=gbis33-#Rz5DBDl z5_JbZ<5;~ZG!$t_w(19VZ*FKL2lVF<$*C$YZE)$rj83LOA-jIe5&rETF8}r4v=}&x zw_q6(2x#Kpspl>NftU~E_`E*Tz+e#saGrHR* z)iL6<-zJw45- at rZ&Ubbl)d{#5*;CHTKk}zfRU|5wd?ZH{B8d at G0!Qp3`qL&=whyd7 z0gD-q$$$bf^JejE?4zPB!~Y}j!}Y_p(>^n!@beJ(7YJ@|gL#MG z7eenkhg4JRW(nrAtXUxr>w8Q~nS4^;9NIi=1`~mm0%Nda*=Q zJ4kkuEVq}kZJf6^0)m>uytCGNJ?043Y8sDKdywSpT8kDABUX(~Lf at _FHnlk>o<+W) zxs{IV<)!jCjdo76ZHHFR^|PI#v*;i3JZCQG$>y4bZbj!f-DSELPp5I6_}N%gJ*II} z8x{^uuQg5f2Jk`sIBqGi)rOO4T9}Ocm at DiQIm7itH{;S1hD@&;sLF6frs9&6Xv6Gn}Axb~{+ZBu*F8VEtQMnep_%)^7sbUAq={gRl&&HF6EgBH`8 zeW$fXm^C8Hc^UH3w1 at 5$UdmN5iz at Jq+X-^z`JLVUG4aB}A{t|UHFlVqsYW3T(wN7T zTRNQU0t4#!gtHV_-(xO-{&)i>mR5J*H+3hcMhnb?xs=dfif86rG3DtTm1?ktEWAT$ zLQTv;={ejZDP68U)3Apm8>&0a>euoZwM|-X{>^1up zHG4>9{7k2b;x4a&{o}ClhV9t`7!- at i77O(0tZv(O45`?)mIG`8H|k*zgTQYlYml`> z1)l?Xr|_KBm>9Hci+g7L?$v4&#OvkxQB$m&x!bImlRGE;+&)TlTfLj47=^t>9R9+C z#@DQvS-=}ePuYQtr_f-kn=iP5n&Zxfg9g3|);x1`E%mBX>LttZ1$R#jX1Z_SebU*{ z7Khu^E;9Vif)gm?8P=!>H^N?BK+H(F_GsBG+_HY*(wLNxNs&XNflG*u`D~JG2I7Ny zT+G#*7~tp7sh2nq0>)+W_Ezhd|M1#gPM-Dj!1B*Zp2j%U@^#J+p)3uC$o>tF#5ohl&QkJ!pS77rvxWaKyg7ws z at S1=9ZY9H=!buj6I}ob~$C8n`r(ep(+u;SW#^3Jdcf?)$NXQHw%^V-S(4?)gz<_S^ zl{wBP&mby?P_kx{_GLIS74k4UWX++!&6+vRzKocke=xM&-|3Zr%4o& zhW~?~QpS(a=w0K)LH$ZBt?*O*{I6fRU~fR6C(&G7ezF%y)7|mSxqZaBob}u8G4{Yf z8#ijXn&?ViHYE at -M10zGP5#+RNZNN!*SCnCEKlXO`@Yb9loMXRWZoBvSY$E8f`IrV zw|nFDV=R(ha!;Cg z5Yx95)3+GY_g9M19224;uT1b*FJEJHf_GKRY?V=D?Df>OTf6<9GzE{65I_d1NVKeG zpi%8$jp(F{CkEBEI6LE+jE!F7b#QDR8niys zWW3HNv*l~!XBZSxXIWsJ?*M`CuSnYMp9rR*6>3`OCM>K}DJ2)J2w=6){5yRCM(IXZc3?!{k1 at x_d%8Q!A#bGRrpkdRRKa!#9jfEg8<}Eh~STQV!E6)Y686LJ2$BZ z=T3Gvc&vgRm#%0G&jY~SI3hZF2DVNYStUl$fKLeMlT8cxsf&XBwUSe;5f~P$^j9AW zjvw!kDn;7VRD;4A?zL&knzudI~kLVG&#S51p>;z{5OjI{!`PW zWKADmv}N>f3ZBl!HM%-7TOu+ob+S5H6wq)87~%x5x#&G?95^f3#OX9RTld8+_ylEI zRomg7rs5tM+Li)z?KzCX{fJrhkD8}t?GOL6+UBpPpM{(4bX#Ff(Q(F?oc5PZm!5~V zlg-s`sqG z&G3)yX;Us0uth-Cr@~svAw#2*;-yN^+H^WOYOhuEMA2ofWGEJ}N#oC0_6JKM>$+h; zY;7|$DT8avW{6JUTcz?u^zZ2Bgp;FU4 at xUWQZ5X3SM%ByDLe{(=)|#A5NGg!jpMex(DWPy_hzFf&3D zbQveebR<~JBjMA;885BW6nm^Vs{c(Ep-T zyPAq;6%T&-NddAoQpldxb$)4(PqD<2f<&>tB} zOtit37(*bKb!kE-hvuk4$c;5C3 at g$l5lg4oO~%5s(vdfATss}*iTT#{+Qe{K-ruW4 zdmoSH!W^5R0;W&pN~-*6jfSwz>nE)wltqbA&Q^^sS+Ra4kq zJc>C916O!#hd-v0+RPJMb*|{0lZR)2fm?{-O%Gzz>T~pvHhE}&L6ZXLSUUH4ZRPl` zra>eq&Vv5gsOWk;H>1LV7*qN0hMi$yq#pnYl^pFGmoA6NkFrd*em4lt at x#MYXecus z%cLSE96SOcCC~{&)%px^f4dyEgP*q?VYZ?q8O-m?G|{CtY=+#m<&{*K1Q0d!vG_?b z0E=f{kr?#GDAy^2#>`=+TU$&sb(&1C+=+wbY3(B at Bk!ic9imWbiavWbE9`d(Ueo=1 zZSl+>qWx;0o)F78IZq~_>tAika8H*1_)3Jc2jBw!zX`29=VMcENlRj?Q1 at h6u;meP z?p_-l)wnl@{u7$9AE8l=^m;ev{D?K z{aOt(fMV)Z75&Qf$|=IEGk8AG at DziqeZRxee>s5v)E4>*uKenfvYU?G*_DIueKH~3 zHumD=@%R5k=>2;ODexU806qLmo#|yj8jZD^knE(l-P*$S;=FM#Y+%&iy=GOP)NaL2 zGQH~6FGVHps~#B8;-bgWXwNx=)6D98&Bx!ybXpy>-pHj;YpsC?qJI9d{~ig!=7n(0Nz?Z}->sdbrx*F!tZ?bD8# zY5I%xH1z4410|R5Lv02h-)ju0MboFu_*&I_5*LnK5txIdIWvKTSHZ&HhWx;?Bf>6@ zQ~+a*m3_&a4w_sBJzq?XJ7_qxJUH$OEnw?I4f>P-xv0m+tH`$Q=QEFv#A8ecRb-(Zf9SNw=oF*}gBT zI_Jqo{yiiWd@$lRX!R~sNdh;R93RLso0fKJk~$4rN`aO%>e5jW43!7DHeS0yzAEDh z_3Z*dM6CL_H#LTxaI at Ce%VlMYRvnG at 6@iykdaFOqYv%lKk9ZsMR6q=f(rr zmmdozIiki$0ou$N!pT2xG3ravGoT&FOgvr=PNjHSJlQgE;2ZdcsPnDd)3QY1brsPykBE5#BRiaYB8oP8H zd!Gaup9Sp_JcuoA~SYATADF+jl`Z7ij7Na z)j(@rJo_+PgvxxNz-qR!Z$+h3q9TF zA88x@{wXRm3 at F@9SG};|vPcwGigy~T{MVm|WtMyTCZ$`e&x&MU8b%?}`}Q at c3bNd> z+3M8+y+0S$-(eIix!b45YasW3T?`}{L=pK1(2?8p8qh%Sfp4fCT4~WVJ5EY;I6Nxz z`$(kPME-=4 at m?Y&%nAR|O1KRH0hR)5J87n-AF|p6+~-i&K>zDl8(!%i>z>aDx810F{xLurrw(FPh`Ow7D!(1;$+J#uljOGIQ0PUM0L#ao;(brB@|wk;=ngGiH~x zii>VCGn+y`aB1?^ zQn8#j>}^6sbHFRuneOk?fNzo>xebm`oz-P(wllH)kOfp{)IC3KVqU_NOSEs+R#Inq zzz>kcMqQ at VFN9nVI2|$hew8YK=Qhc;0(yH)C6~e}mw0&3;i3jSrQ_$vA5vC8Stz6~;8MDL93kn2ZcuSR`JOT84~_Bh59= zL?cG!4)_zSmbXuaP?M}oP}T1k at QSn>Q!h;lB1{v0+3s=eJk#CyI at ua~0Ysq~DL9f8 zVU?wVq~a(v48#zjAumRds+uJsBqUAVI%xzKQBP$o4O2r!1qiBid3syW^$IaEnD(5= zbf270P4!gam~{8i@^Jm at j@49QhAqFg#DiZrs942z<=$epLBBYbu-a06*)X`Vc|Su&6PVKRUh$kL)%v6Ws9NW$5e#n7Igt}#@XC;JiMZnqU+!E#?|Gn;bThztSL zsvy-rJKFP^rztGuoYH!)ELE$wTyt+)A0=!^5Y()(Hs|r^0=<_t6t}_~eZa at l%(_H& zf`@GRL8&FeqFpgKoy!)@=%ie`<4=&02MJkuj}=sj7A};LRVK|abL%ad85S|g&zIb# zEeRG5Ah~+lgeOU6>aY!3x68m$whnA-`x>)uZQcM#+;-1A9pHQ9G$|}8k26aQBHD+o zM$TIvHm+>?OPAc*)4$kq9aLe!YFDmm7FlbY=WV8E-L=6iv5-e;O7a7+!8Nd9HcSeP z(EhUG4H$v{Wm9z$8N at OlzG&m9HbUyeg7C)eV_Jw6sFqx8qBrJCkbJheTKQ-DQ$hRB0(yrASVz?vPcaG**A$%|A^)rP`ti&k?mz+o-68 at 3 z@&3Eo`#-<`8)8QtM_di;?-}dj=0mwcPWOFL=Zq40IvHv7R*Ikz<~H{P8crwUR%j_I zPkM(-xnezyPU!N&?=0}-mYIANZtp!6i-mQZ1;LD(d0f;L_>ECNGq!{68;kQ29a z_dgbY6O5_x`vCkWms~$@-#5KA&u=R}t`hr|s!vD$;@BznTLZv at 932w4YrYP}Rr|3=A6HX<@aT3*8 zuhvVgJjdV+M_`NJQX*m3*-qk;l`W0OZx at 1`*8%KcstB5G9~6sO%~A-NN+OyT+0W6S zR*5{l5!lrnR-D0CqBzmL35=~puFH;4DES;V%)Qzy+iIjpI>lk-sW}cf0b&4&$pn*= z;|cZg`zk<5<^%BNHALPP2#(U^2|3qaZV7FXa(x!f#?9_xE(d-7+&rfdvS$2p-YbCT^3R4R^jVr? z5J+)_?5Rwy}U+Bikzw#aey6V$}{qlZF<{sP8tS?mJ)G>mL;cJEJk zbCIw`Jj$a=jRD at mW}`Aqlc%@MbJ?~aYlU$U6=&4&;l8BHeTf$7I{qTQbjW_$*-gJ( z^iy^i#;brrVLUZG?xDuQwz-O8&6eA>=0_XbT8gtVZZrPZ>|?0wBAuLsVW$|}B8FSK zBRn;O74sQPO+8Eh5Qcrvy{xH3x-iu$D^hM|%XvGjdR4r3l|Y+Ta-N^68_<+kyo|J^ zY8g`k$e)T93$rL%b;mLBC1S`I(;d-!?3%$8MevwxbyuZ9L%GfYs*z-&nZ7y`qdJ>% z3tAYzP+Zjei(Ero3)=lYj9#`cB|7}qDf1O#C8D$_rRi61MR9jUu^vvz7&raLIwHPyFg0Mn<|3*U9E<`&eK1hXj<4hWFP#6$X&^YKrl z`N+1wdcZ7k2a%oH+BSI;O=@1bf`}bauV!gkX+;^N4-*x7H?ji^+H_(8(loZg{K|2} zGg+=6-IV1x|$ejYc&zcyemI$-mi1m^JQ0aWE<=Gt#CEdp_}nA0mUGLqLDikwitl|l~3r*;auwVUqa%a z=pVy7aivdbuRJkfza&XN!uQo#k_&4WMyH9AueO3Vq|7ce#UWJn9N{DaqOfXPuwqR$ ztuwj%rd}MMgKP5u{yxSj(^AUSt#Sxi8etzY;mKTY3RL at MRTw`7UB1{``#Z~7OJ$La zCxat?TK at y|UmXYB zhYgADf2LOGKtMGArsMD*WduH&c+2QN at PN+7PFYz`I_SE{GHAL%6cFttK_)PiMrlbn zYUDb$!E2~Qy2dshT%qb(<&D+SSoRSO+Iew1?Ls>zzv}uG{!1B~tIie!8=Kza*yq^w z+U76W*=_(GZi8h|tk2D+4?*uk+lj8e_enY3Z;a3WNF at HV;nG#4fzq{GY{G$8I$Zvf zLFdi$!tRY#M;_d3N5UV-*Vqqli#?%Q#N1I#-qnHQFaFJNP}{c2&`zgV$d`$>*-*xP znafvyMDw)Uz^HxTmWMn at gA}K+(8W6>Tmth!Qrp)E%xO-#gG&CYfxi)VR54?oQT?8q zp|uCNwjY at +=HN+>WDBHD-L&aTB^}D$;u9!&qOvLq?xW4B(hB3A!h&YC{8plm`Ta=YB(~m90=sd#1Fgy^rNWe z526cL9CRkNIo2)FlFhKUQC8*5I)P~CRz$Kj-Egpb7sx~sT#oO~!QQXsdGk9^ci81} za3zBrqCE3KR#qWW>s$GI1U-~i6~VuNHd5f>CXxU6lg#{wixO^0Rj3`y{S5(WEi zJ1J!yDjVgd4S<)vw?`Nh3Dc+1w`#?Ia7>4`)!xD=qWCw!MOnPlZ)3>8{g z at z2-`NA;x^*(=3PRY-4oEbk)?_lg@!7qE zBZuK!k}fjRj0LeIGv^W|aSB7qhsWVBlS;OrLs-zxx2ms}GY&Gi);Ar3O#e36a&zeD9WYk)2sf=}EVFe+ at Lf;1-sc7i%$qVGv(n zU7wk9R*9zKZ&%DgyWX`CG)D!k&G_v{90nRQB zI at NoRSt7(2J=j*P*nR%Lc at ULX!Tvi+m9}%imptZWL&gN=g`&vb&x)@n0BrZNzCKP at lOj2Rn^^6aZ zOej&f+mU9%N1J{ABjS+}>|veVKyb{|26TGpv3GMV^#(<_9YgOVmS4#KS%<6kJ{CF=qf)smBL_cdCM;TXs=bz!H<2eSrXMCh{N2i$y2o zc9nugAchk3M5S1LZg2xTVuT2Owz_JBJ~z?9?S1`bebq+nHcV|#y_}yeE+u`5q}V56 zi6!`=RXG}IZE&o)z{hbJm3{E)~{t%W;*_}l&AHu&L2%&1>GI*rc&KWj% z)3(jo@?t&b9#hwY2$0i_^6H{X3&q%U8*7@{1Eq9tI=pl>uw`o_wzBJNfpM$Ywo}To zOM;FXGA4CqKfrB>`JUQjeZS!Gau^EUmU(xp(H!S~8L?dVTeYS3?MS>BL0Ie)sqzZ8 z?hCQ(6ZQLsCAfwp>>=AHN&i+az#%-WOErP#h~;8W05A$4i+M&tU_{5;7)7z%AQ%48 zjk0$(R=r3q!h%(~{SH>*_CI~CPb^3xPs}AHjWq_Zwz(B%khWh>k5smk_poD-Zf>Vq z=2lvlU`&z0=l#p6WUbiv!sS61sH|qYM&|~h1|u!ijbl5WXA6iO*|{K`2Cm!>>53xv z1SfyYDj%xk3_SMk8tGq7SYSzVag_B71g!}Ix;fl^o?pED0--j58zY1s%awe^1v{Jt zJA?$9qNw>hDB(P&QJ6OJ zYvHdB+R3l^E1$@O*PXJ#Uq}NRNnJnWRX>GLJ#sPLp*k*XX2RfFQ?`!rlh$Rgy5cCN z(wC8K!Tb#u#sp^!4e|5imZGSoiBxAISuWEv&-I~gfi`pfY9j at O5k?*LU}35s zgRskBM9 at M>P;6e-6HMo2)Gm0$M${v1q|g0*_7c;B@;&b5*kE32E~zVcUO1(Q?B=P| zCJK4(GHpt>>BHDOO z%to{|hnfjP at c~DUU4j{!cI|?G1eFMRntTyzjb%Iq{Ndif-O+1qe=H99{bfJ^W!CpH z(XL8k)Dp-UVuSAfYTpY(N#S1R`p{aE#^rJ1!F8zve&_)MWamMZP7Ko*K{hVnH7V~m zGJyy`l_E&SEqiFrB9>nQ3`RPw$!b+_d}O-1uV!E z>HOYiA@$~d%m4Z88}P4-WJV)j?f=Y<|9M#dw@$E|tCj6PV|x=fXJ<2eS4Kx86B{E7 zGkPm~bBF)w4$H|i+k-G8;fd^mpeONy$XZuKD$<}8h!*TLrX(WnaNn;%^@ztq-j-2? zNGi3gVoy(5Kfn9Ef!qcu{VC`x9C#fpHGCcBR!{R!;8L7+q4nvtJe7oLd?A}}>1xcb z#!DsPS8meh4n8_g;j(&1eZmE|=5jur=&RKy<9hMcf5=IQqzw+ftFGy;#lMi<@J%Ri zOOKQyt`q(Gfes$87UoINcBl-I!vlfg`;npU`Gqgi_ja)2y;^5^0bVIoY at w zV9O;}q|(iVF`Z&*%?1yv^^A`dU5D!yVvg_ZbH-F33Z|&aH)0?_8~oDUx*9$i=Yjh> zz#bK3)5-TUo5*?F^Y7*Z${%aFl_*lVzZfFIv3)#I4PiHc&u>9kZ&UUL11n6RZdlA# zyHaTeXF!z|f3XNn&x>XlIc)#k-odt>5az+zM}U-EkKhi;kq&o=^6TaCNIH{R~(9mP@!H_pIuls!_S3BpnvA(_s$MT=il9< z35(z`J*i5~%4-Wx`PM+Uu0G at BsEXfu(ZBvH>QIB#MK%AR&hQWF%>Q?&|G${q{0npT z)WZzGvz*ROB}Q*W>tm&Uu4;w|KB;m}%j$O_E@ z&+0#LAE%!jKYzqB?f}^y_=jNF7qzA5|KXutQQkDOd`VXF?~8k6r+}Nz_oKwd5T6*^ z>d2Djz)+DJyB|9iRtQod{sw3N`cr{L5bdmUKd>$=BX4g7U)#NKnAznnk24!8d at -kb z#pIgx*bJCJgH!M>6mg!k|IccXK~SIf3B*W{yp8k~1%ANRy7 zxhWrjLJ=Hm{C++2iV%v0`5`S(AO|(p`K5zfE6t^pO!6A-SdgUOaWbOG*wqk%;Y#b= zePRr8zvcbRyp~g~$6!#A=j7i~Hkw}=$*#P93y$$=m z#OQ8zn5pXX%0cebneEIzxKxOdy5!9T&8dM5qI!DPFxR+4#DXWlX6*Db2W=O{EAP^5 ziZpzhaV$jlgcj#RG|sn(h)eAD7EK5eR+FsL6+(-`hdib`0=>a1t`X;t&0SZ_hABW8 zSLu6G;lHW;smO;a2oR7N7!VN0zXiUWgR_~Kr&COwvw2*Or!FsJb9Z_`HT$>dSkfZJ_%Jw}$Bg-7GcAXV`$ZRr3c__L>;Z=!?HY(d zy|noKOgn4GotrVjXKOL)@`oS7!R|H&oJwV1(}it5a7Uc4c-9|jHCJnvSYc$LpB2cEI(t;X9f_)!Rck#0^4p>=pG at Xf!oiF~oj48%c?Xo)7=IAOcT zVx}0?IPGI}53qa*YH3H{DF+Ml8vbUT=A36We?Oo&l`WK1!W{DsL!*#N&4?teGq(#0 zKaOG+u6RQq5km2gH_aIM(@GWJgwh$rVvgjnYoL!vBwjs$yhkrfTVIW at P#w|5VJJ-K|W_{v%s0 zqk^V^_RX*;0uY%rL4!j=19S2`{f*-LTYOjo0wRGa?EfL<9fLHBvTf018Bbkc*kcl{kz2F71L1A() znP-CjX|9u{Es2N`Q)92Iw at wlnBs zL8h=39!A*p0jbeH|b`vCS(aUf{ZnSSpj2%&0LsgEQU8mvbN!De$lvd6jyn-LBjzl3kP~5<+3!2%CjMXGhLsS7oOZmGk`U9T5Too!jn{Y9|pFeJBk&QJ+rYK%|K>7vRZ%O z`c+^9D8c?h+ro{+pd3407Bme1CG~rNiAcqBuBx)ve at huOzc>S)f)IwJ$TOlq!Yep$ zq+{YmHm!O at Ev~Vx*BKR;E9P1rb8Tt~EDdoXi_T>JXCar52z%G*-KOi{i0jN%V;Z|H zgW3Rc-r21&1`nA-qzA=~?(U5hK6DW6R(%@aWN9g~js&lr3LP`*{4|=pLO9;iZqem at mvm6JyimD~ZSo;b&pfjTMQ|C2OxA`85MbGZh{50zuRU5W$t* zv7zr~V}AG#R*M%$c8CJP=mN+$eq36oSB0)WWL925*l3B62Wl!Qy3Of4_k zW at J})9dlQB?=(vI+lY5Ye(oMOZ_P}88R_cOBj5&{3T!#=DQH=NG-cFiM;>EEG^njR zcOXY0Lhs~Gjq3$&#JvJdhA3Kh^v6QT0jb+FrBI at bGsfkXKogMLI(9ya;*$+uu}3iG zd71JI<{3!HRO#Ux_xESucaLyXEH?dZGGh0F=-Hh8SlMQlK)_Yd#ZLTtaQu70(8<%> zJBqMqI61bp2Mf~0JDUYV05*1joUIa2ktjBjfpC!Il(@#ESYYY~NH~nQ%AOJ~2kAgu z?;JM&a9`evnLxYElacMM2^L6xvh8_UI|0Pd4;CfYFo2E)f0&XtB_Zr9&uj3%W__UrPmr3zu*udIf7 zYIbdEI7x692z!n7Pj?|smN#|@?GijL#yleQI+Z^u#TZT}i1zUvA?9FI9`a;KQlorL z4`3S at e;@3VytNS^1&S-+-#?;-ag@$*W)5-k_jAH7xI$9RbIfpqVSLD(IY(f3SD?b1J=|Jm~l5R(oB#Ox$AYFX=-EvpgoLlfxn~0C5O<8cdW^euz=eRk7~ zq>y#vtkRo?UXyVR;=T>il2C*UT{3wSi+H=_R#B6Bn^BT>GnhrK;+rIW1!9;ek>DCr zMpm@`;qSOQ?-}74U(@V!h&2Hdb68ucc!T-ZprP2%eF5<|t<47q0uukf2pa#Gi!iaZ zur(7lF|zyLH=vcZ{#H4tU&YGF&D0{ox6l-58$`;eXtep8(m$K9BY0k#w`9k6U6U`s z{@!E+eRnD*y#n!L-^)b|Q?|ysqB#nqX+uI9^Rf4F#&u?zUQf?A5QBdkg|l&fYd93# z3Q_2uCoEp7@&Fv`rt$zSt9033GoTV+0jNf9abLUP7!bGJT4iDCCa;XNkXmrVrR$p9 zXJhx7afRMoLnWJGa+Zam?8E{n-`NwEsQ_*|b at EAWGh=zK)xtM57{k#uJe`^?)GGkQ zi|wYcURM1oUj2`)sP&z_G8>GL3BUB>q^8a-)S7#cj}3^Mb$}w~QWUpJHA#K{ z&gMWJwVr##9eBXrgLq+ry|8E?;l1Mc0#|8J at aA%}O3vTAn=}eZ9gT<73`+0QKKOIr zd3ogXx87XWP7xb&u~lSmPRC^WE(IOKE@%PGrOq2HP80RZRD~TePZkR0%O(GWqv352 zoRxF-7I{Hg6Fe!Z%fQF1#ei%`32jj0kZn%rU_24xN1Q}u+rm7mlq+o z>hnX{J at 3$E^)7C&1C_?s%fqb7u5BBUVUiyKL1c-rf z_qGkR=e&`KkD`-|n(?m6W(;Q06k%BuG>1 at 7wV^VqB=m+YXcZJ7j09smILymGap=d( z6nH at RSF(LJ{_f%UOSX6 at ARvYRn+(m!+{D<$+Qj&OVqH`6|6<+9x6(S at Vw18kszO_+ zD{a^Nd655!uQkGQB$){pR{!`|MjRtaXm#Q at VL z7yt&vraI~vGXSeYV0F9F;Fh%}^LQGN%wASPZ*`uYwty at 2@x&cyJ66g7yF}U`I&_q5 zfR at r`%Z(kzT-rh#!HuOn7xYmrVt=)vDdtc4e9l|xVp>rF8 zh5wF}k**@mcS9rPp4Ps=1BWA;#$PC1wEtdcG33N6W~_>|ZK>*?*Mk*8D10rmVWRIw z!HRFe40{b?cA~)^o=k=aEB9>#bUFw;7fu^aRFGzB*05Cd9#5MfZ^i`sp{3KI)dY>R z<7MGVoPuo7C4OA}nbhv}DpTE27VHyHRedGz=_3cfGVU;^!|3Y1=f62Dm)^4)O{#_F zwLLp|WcdTo(rUD-Tsreb-lC}h()61E%T at w#!HuNR!Yg)64dCJXTAODU)D=NpL8B>c z_0ND^u)$NMQpQzwKphcgF5kx`Q?0c3g2!ismAWivMLD%vPFvG!>#kHG!`!DG z?_7K3+ZLa+Ld)*Fj#X3j4(2pV}f;FCk|ejD8N1p&p`<-kg{Z z$dU+$GjixozOifIG3#ofVARyNNoTmRQm(;b?a77Tm zxM;92McYzAV-bN3>pK9}0)fy_WSg+hBvP|OMw7K08sMg8 at oQMXmMqvca@hx3U%x$6 z2!0=AAIz!w1@{aZJzmh%s=3Br2-&&Gsrcx*Eh)Rq at PB{alK=Mopg3Ti6i-cZ0AzKx!E}BySr1Vmo($ zD4*3qlF=3v6yOhW1RyA=JOsFL*fH_BYhN6T57ZPLX9!H6uMrqJo{{t{38S&U` zRNiRBOr#vxT~4hoUf`LURg^5|EiZoAFCSVO93+e3X2CjI2B06qiqTsDOk)@pL4~AX z{TZ2mHAFR}_Z?>~LbsqVp=H4gm})PjC`+Lj*)i$YSc0zeupk$=WNJnsNAxu}7;aJ8+T_9Iy6lW`8Wz!Lt6}`}E zuGp78+yjg6D~)tf0+_f+XDzg>ZHrihnphVQbBm3bYc1-{yihUQ;rB*=7CA}rE79&m zXG9bJERKYut%_r>#s*k)@Qf07k at DnU!3c}CRmI0;`;cFNX~ePPr`!%_4 at WpjaUu)5 z^zuUiLhVvfEQuJWU0fo_^DCmW7zi*|q at A)1$|vbi(>a`v9^$u3`MN8jcV3v?$9ga{ z=S9+j3`j7`iGEy=79*=ZB1=#!90B;rU3CJ^dCJyNPjEtP_MCpHt*UTZa;av at S=#1L zO(Y(J5rh2-!URVUn`k#xj7qp#E-g5PvZZ8jkn8sWL!XDX=746a?}9*PL$lsf0=wP| z51K*sjt)WYmcJpzXJl!6&#MrfZ;)==HY>lrH2baIi#F$7v}?tad=nL5$5{F^00tW1 z5VlR<<2td-;(w1fFxwCUCX`bnpr3j>)$J{V at zG<3`Dj(&SVVw1tSgYHNcT8KPVb4X zy6m1QY2cH-aX>|G0@&MiWTlrci!FBhW1WPRXf7W&!7Ql4rd~JfAlp}JZ|aSXGcqvbLd1v5bE|( zV$ow#?ZNNZWrR*@0bS75cdHGAmq<9YtpC+Wn7sd18V8U5N*;ayVbZ|8FX^hvBQR^g z$i>*qz>i-PfcW5bb9L!P2<~l1NEuuX7f;$Q_c-e!`Eho7COiZKYk)0sk~99pa)4XE zN8uQ9JNK!SoAb95Vo^Vu0Ks&}nKGfcBn7`P&^{9yw3$6gb6|Qe8}OdZqV2&6TcOQj zu$uxusyTx5|CM*>3w*1!kUNT98>nDw=&!}t z#>kdi__3~YBs at n8g(!B&D~3{z3J#=))iHAIwk!p$GA4eNUy$?%j$?fOy)6l zc%4*{bs)oEq_XXLLoe81U7?)JqGEYo_~BG#Y&+<~chtP#p7rHr zKEYLX8T=AHD}+Sa&G at iOGpGi2Tk%ftuOi%=d}kB|0R$9`{69VC^6w(7@;4!JHgR-x zv3Iuke_QWWs#;E3YG_~0&LkRl5{l%>iX$$YWYN@|vZ(A~S)=vqFUZJhs_E-4ghjn| z-j)-|(+)=k+O6m(VC#B71HCZ%rt2X=5D7p+Sh>u>V)(fXw9GgCuz2Ir+?_YGHM`4#<6xe z@!)EQ>q=8EEZNC1GeI{R-m>dhQ>njH`Am;Wu=@FUPjyZ~6TB)wv*WU-$S^TgW%w`39Ds)Ot zqeL^E+)rdoIG)^Y%woM;5M?Cq*^=n%d7tRM2e4xFsE1iiN9)X_N7`ux0(W;l(Ayh} zF at UB!S@~ifhW7?%F=EauwJfma-6QL(b*xJoJq-4oWqS= z;%H}S&^INe_-3|L$Tgbi0*-qW>8ewvyvVC!BP%I}P};;RUv}sGohe|?#BPRlG%7T9 zD$Lusm~1 at mYvc{By`BEl99$iP*Bj8g at XcIlLrk?=f`jV2k%cFX)Bps7k+1BjNU>{u<|@>|$2o1_ zcN#kki|&rjQlz`eV%;|e4*`?D z)q9~2PC6rSrx*8J-M{I_M^b=a>Z5CRIq~#{R)AmHqmPfqVcZo)q+S5ga-+Wyd>&|^ zHXG{RfDzbe)>d7Zwc>j#VBG_4G_`ecSY1Qh?6vA7mR!2v6<;S2SC6jByjw(#qN*eH zlkgDUX at kk_*f+Xv8&BM=y>(W{a3-QPa+zo~M`QRJQ_7&Dw$tIdw5E)0iVnTou1bGg at d zc`Oe3C^k%+z5T_o at gC{}5p4WoN7;@YW^if7cChzEZ%@ZcWWyYrieCpD=>1N|{0Kqk z!Wkd~^mhJ~I$Ye5d8rbv_XO|SxU24UvF4GgU3I5uWN8&GpkKuv_+DA{by+@? znz8$UkiW9_KB5}&N=GzAX6aAH~4G>syeqw0BfbvxVLK+mb+Xd0^G<9;Z5!K zoe8;A*%GX)2E=8bSlxvSar#98SX3{*M|8%DuRtk`&wC`ftVY~bYRv3s{0iXnx5(VH zyZ$we;H0bA at f&C*9j)o7+f&>H$c=+vq!+<%`GaOL^$xs~Y-tM}t^o@@?S^jo*ms`x=z6e49rWBeXp=&dXxidmC88mN`;4d zbY!cRh)0ed=Onu}^keq`KWwu%bq5O%#am95Kg0pm4`gf!+juNi;)~%mwC+xUFWZ(B z-LirS`{#uhz0V;_Csjy0ZZD5I=*M1-UwoIkCU<%TM+lG~A&nXaW}l%Qx7_rQvp)XgiwuWR}QBW&v;Z>oO`m at h88j=e}FZB%e0{U&cP& zsWipbXdRZ04pu_NU-Lhe-pBG%x-&S)PJ2?0#p|h#e4&9`Wuo28Z<#OpW;nm4*1IJ{ zdx{=wMvqp6KXI}}?Cg&-F!#JkwMHt|)(0vR8=7*ssn;Ys98>I)tc$j+SsAaBRC$H2 zv%zU=-;J#Ncbpy(yuC6ack+e^ur6uuUQlRv$nMaPS>WxRs4Z|;1rDyYeNybM6NVug zU&zZkM;`s=?tJ>c1?EojQfj3Js0~_K4mXH7#9r{TqvB)5kiseI8B^rfEK^lYEQur8 z!x_~|{R*xTM-1%BpK}vS$wL~gJjVEkRL{vI z$9g2P#1+%A3-A=@AEZ7wX4p&FDa8 at K`STr#sQdKV=yo{7G;H-|h9nfvBe~0A_PC-_-tFqFZ;Hf(z`G}RNsig$j%xF#yLuCl?^Gx$>^L|lWNRl3)6KYjF zL$)>JL-uQ{QQa~@y%F&^zVmre>0Gw?&cGFUS3-n1}_{O-nq z`m#Do+wUmDa}c8alZ4=c>}jZn9e0@~pYaC-Uq;NMJGu}XKh(Vt0zI8=xz3;<(kiHE zXO%Zw#Jo0(VUbYDgkf2M#KW1)BcV2SJ}?SwlZfTp=y%X-#J8M!n;?+jXO0vix(Q;a zzq8RCKGby-rZjPo?Ab##S-cxR84cW%9R!?0;f!_m#S7QyQ<)(Hp> zmiDok!Ty6oV9pcE52w;zTx9g*hRG3HfC=msGgA%q8uMYd?#~k_1BY~0V$6zhzWz&z zr}+;-K%3qMF{l_3<`fuZY!xn`RkvCz(HH8+AHdqn*2w9RY7S-dh~IUBcMqkUz7m;#nBhG>UM3bVUH22I9ycq_9wZ9+K76YbLy!3PA z2V(d^J7k3!B(d_B2TXrBHmtE)m^vF+#U_0^q^FKFA zm1XP}1Q2~P3LO&C$r at +xbfEJN1DCzGkVOPlsHqe^%@^N?b>gcsU5sm}?@~DYK?Usv zGG7%!HAX~cl_lo`FOQGc*zI_ at -_M_)34pTu#th)kJ&bSle;_E--;DMHf=AHDVV@|U zC9jE&EKjKckICoHS=HBWynBcj at 8hR8@*Eu!;#q_nv65$GLS;OR?T&-7Yfmv?LV2V~ z?l_O!MCSL=Vv~v!Zf$OZAQsywOa)#{#y}byN|K-(_y|J3CjWqq5z+GYk4FUvP{??= zpoZ2y1Xxes_Vwa0b<(xSzEHaHRJTw6Iu>qi*G&_wAQhrbWMoxjjaP&tvWbkLWUBno zo3gi8RcP-L%W(>+uV_UwG*1p|j|>rg&)p`eV?O{dmiIz~Px4w$2iFi^ybJL~Z8cQG zZgIUsXpsg#TaR|+c1`J~fjv}t9;W*Qvy&tVqa zB+ACp$P|L9(xeYB^u^~>$AB at H1nJIuO)6XI^_J_!y`he1=XGd6srC{XZ0KvM^&(G3 z(jQ=pUOi#O?#>mb% zZu`eNn+0azR;@7=b;On~m8{d^75FZ(%qgGdqEjSPq^R%Y z&Q9ZX8fI?T@$>rx*GHlU#0^RR;N+nuijn+bq6|}5aU?%uz!t&@ew_M#6e#W?YB|KP z_24{WW3}}ZEM+K0-7+M!S4~a_2e_zLp08v`qz37#@PbWK>7vIJ%}@-hDqTSCqqBQ0 z#ImxCdH3Rped1Oyoy>#95?EwQMD8n}8IX at Pt(L1D70)p~68ZHrF|U;jT3B6|C|#&? z<53PvS1n!aBejE1&Bm?6g at k9JRQE>(r4Vr<>5@=WtfC9CQJ9`!;Z8m=iWd2o%z5KG zd(*>}=s@*GBmDJf^FDftL6IQfTwar`6b(4zG{cY}x-0<0xvidne^Hz3>sxVj$%&lz+32`AjYi`72XleHtX!Ih|U^klakE~|R=2VPQE z^lHi`2{_FxXDpTYhGZ)g_kuF-T|H#DYlKF57es~MFRtLJwVBb(p*qohB~<@U;keK6x?;~SsN^Iv z`wWH%%znIh#a5~Hu+)^ME$)^r@~yzsoq>7k4Jiq9`UIN#rZ+LztjDR`kQCmS^dVzh z)`Xw323*?&2T+$-?M69Q9+ZeX}!$M&`#3{_)c` z_6>0Z(#uroD_*aewi%D7%;W9O at 0$@lpy~q;esFs+c>Y6%&{rPm&7^?Zf^M6Se)(N2+N0Ob*D_P^yS= z-U0o_z+jZNZv9qyrw`Mjy?3}6CGUpQh;aa(Z65HL7_l_Qzlc6)3_VUT#>p4 zt;Fly)&4zvLd}`*8BAyyuM#REd{77Ka$DZWV0)23|2X<&b1^~ zet6vO6G?eug&~!;IOo=%xHAZ4&l5cBPwXy>a6J9({s)*$_Q2$Ds5h&ny-H18GStJD1Zhr)L?_d z1Hd%YZU!DQNvd3V at IwoI^-GQi6Yl+m9-n2z-+Wq^RHvGgtI2sS($$~PgldjCvstl7 zOM8U1Jpkeqm?tq^VU>{b78y>W(&3CXipwXcnwN_Yxz|9S7~jL;7%qz zf+?n*CXxe}x4B<(Ov5ZviNK_b<6ff{?hPO0ktGKm98YwVzp}frl6(cgt&~Qs78n|} z at UX$(%4*qFKw$6$!Mp?Qpp43uAlsN^l1Y-2z5}4jv>q0lO&KcwTr-py+8%g$m#H(1 z)A9TGf&8lqyrnxV!v9r)GYB9c$^S?Ngv<>r{$X|hm*@SDq3Zwo^4~?^kc!6NA`tcK z3KgrgV2COr09w6}Hpv1>jf$!W&2Uaw19=;;SB%Fr8LNS~k8n2?1RDF2d;NvD^U#Nh z!pfMBaxy`3^4tPW&hzi}(|3nDQYguD^*P{{&4SDGr^3xPU&= zQyW9NClZIrcD!|Hwzf2lapM`?yJpv`djRV#qMf%U*}B8nF=^CeL(yl3A*|VX$D#G8 zOl07(wP-4}(~z}S{yYheJvrGSB#%^W8Fr#p^8FDrQDI_Vc6w1er2}?A1+*fyy^fy~ zt*^m(AC9Rrk|1QD!1*WRn0!KmS=q4oTKroO{v(aTLa}ihQCZivFjuD&z zHJb2L9q=~W$Uc47uUdH!I!jFygu6q8iE+f_m`OEl5wZS5k8^6i&B8Liyksy z5+$VKIHmRKdIgTZ#YgNIOb9jC+H{5bqHM at Rirprq9``_ZEn8(a8XnASw)AHJIGD^y ztbq>ZJjgbx?0f8*im5-0MysV)3h-Ig!n0>^}&8YKYl|G0P zi*hmc at -||SC}tvNJ( zv^Ag at eU{!N$2STS at f^gs?gEiFf7Mgw^+Ng+BHg5JB3d7zeEtFL%@>wC|}c8M3u3Vf?$$Um(c#4IW7H!tr;|Kl3~!enMJq zjG2ljTbnMdX^1y2qgPeMG^_rK5V0hHRJIIGhsYId8eW#vYD(7B(rRq_TJU?*>yg{Y zb~3A9izT%->~Za}yFSQtn&G|n`jh0B<&G}^_LUqp^pYO~(BadL;8xi at 3dGPeyxF4a zz6d1@**QuFx2CirM4;B@~D)ze3VKRO)fJ}Nd~OYpR7FwD0Uzx*u;GiSfrrP8es!T3!g0)PJkENA(CDgw-HP&h$_yQoM`xGx$Abba&CR4iU} zIy9A~(A at N0vw0(}Vd6qPvt{zgrG3z{DTS>Dz#^q4 at -a29=_*bVY)xj5O{wJ|IWO0- z^SDBieOVdZ&bm}vH1ortf!ekvio3H~Hc-um!xX1 at 8<{avY0&r-G+G5M0hPudJ!(UO zNIEv9V5(BKt7NzlZX(=mjdg=}vNmt4b|F!W9SkK0?O&p~q1A=jaFud+S~vq)!(`CK z7(FVIDOmGUh{u`iwN2&~0Tz_Z34=d3 zGX*S at Z6U2qP)ux{0x#|uEzl2o^@EYe)#!1g7 at XQ#+SSwLD9HVOO$D zl~zfGP>iNjwog2Q)^_sYht+1BlEt8vKwm>Ka0ds`w+XPuHiwTMK-n$a<}V&vwMWT+ zcx%$4M`;ln1tLX=SmoYR<Zp432&u9gcrUiVB>yGct$qO%#oP-mLrEgy!tL}>AXBCBL{bK6i{8}RvUhIY)-8S%{W0p_P7&(?ictZx~q~xUMP6WF^=6c$EuA3BSv63XC&%TU^3gb zT>E}#k>^Uhs6f#4ny19T&(Q8&c)`OoP`9M85PMD7^@jB(o8=WfF=9=A0#oE`;v=+> zeg=43l3A=roPrO;No~Wp7A_r1W1$gOLTD>U=8c1i16x?=L{w4{ zF{GKobVv5U^ftiQf_*2pp{#YyAgW;?p(!e70b4Z$6<`{T1lIETjUDo*F}u6H)P$pn z&(Z;Qxb&Ws0MqjvQMs>P;H{bLHUypxYdP9pd|lhl#$^_~P77Cji92!$NNHy547JEc za&p*ETWabQ*;wEvQ1)E%_p-`Ei5XX&o@~@mc;Tm{^qwklot})>8M%3u2)Cu4d1c;K z!cD)>eZD?FPhY}~?d=nB0Y+M*sz=sR#D)GXkax-6buc z)J?dkG%^l at l=ZO6z9gntpU2^H)R?eZxq~6DZ2mD9V+)WN&83 zg;@96Lu^t*w$7+Z*kei>pgj``l_d|D#rVA>*f5gs_NUOAiw*TsT^`%NP+|4go3K2# z1LhA>uZI2vSOZJXFn}`*s1rI^L-KLnE4;`N*-7!!akB=5%QPxaDM7>~l)&FYp(j2O z`>iTkF{TN3Wze`FI1Y6g7rn>Q;}7EABL0ckqCoeuk8;PX806EY#}`Uijma21Fvox} z2p0+s8)((RjZ4;sKpRT+r(Ko2<%M9E%J8J*!suW?NfAFUw+<10*$mErtQcLIY7HjA zsc#)H;=Hw&t(MNjt#?OPIEov}(8=%%f03t`B!*bX3Nj%;1G|4`w4$#j$uRzduzUAI zn~*r77pzm>eUEpa(@_`xfk+Bgznnvs(;oPKPy#yZxUhZ!Zy1U+JhvdY+GLKkOgfIb zcvp2b>Wbo$quq%j|8uAz+K4T9%zpofNwHHP?3rljQc7YhIiZyTqKe at VjPp*Cd=1yZ z5qWG_c>{SVAMTRH3p08*dSosbH}-PKs^A`1b1EBYdGFwZ&N#H89e2t=N!eLng247JuaL5HBlqMXZTwyX{n(hXRk#7pU^Gaf4<+ujE<6hY?l+yw( z&xq*r?b6fKv!us5tF&gr2>X^{$7#1b%-LqcIRmW7Gt37braUu|-?5^@_ml3~STpy8 zxC!?^eXMW2;R!}xg}h13$fIRvEke~O-Dmpgr{!t70F>F*lQ%C669swloxl1%$i^X? zL-nN~n*}?AMQ_>IBAiYTuk#}89s0KO*RM-Hf5^eZhsD^df8dNjZp+=6 zL46VRK~QSzJ-OQhc56^RX!>>tUpQkhu05Gd&3&w1qn)QzXn( z?875)_X(*wNQk5{Ln&9ewl4{hTS~%~_8CG;FlH8~O{!O>k# z at 2hV9NoJiI;#@J=b86k{s-CA+b;c{1SzvOS>9K8}sO5IhiScgXu`Tw)cN=|$DNPZX z6l!Y0aJeC*J8j@#dU^i0!J&h`VV-ATAfP$$|Fqx4_Fu_u*MF}rXsymyYnP*nprQro z{+`#A2L-FLF;rwlI`mnKHgVvVYVLsi?)BSe4l8}xZMf}wKcau3jx=i?LKOxhu%1tI z%DB$Fo?P?z{2Y=3!b06Z{G~`&#=sI8#28)&IghCp2UUQkQKl^)r^J|Ns5m5omV()D z)z0d^5pw$&utNy30M-#Wr>dJ=i6%M$&)(Jze0+v!Au1b8Tzskd7nzGM2VE<8=58 zUdzNFZgbCL!wFWGrAWdm7Bhiiu{nT&ro%LRoc4-t!vswUo6bm6h?|SWIbTW$)rZQI zMY~T0tpWRweU!n=??@JHG2H<;R7_95nMkU&fe1pEP#lAk%?+>i7 at b$)F7hyt0w&=H zN6zp24EKke;y1Yg!Dm`>x_7r(uYOcIH{6&vsU^e=^Wct-Dje9fm# zL-U5APBYBTzt=zF2bNSQsH~^^Z0Rh)d;4b)W+M7izS(&lg6gdJh~H)8;2oS4ol(}V zRFvQq36zWbhytW>fn|XkC)W>EY|JaNka8Yvojbmaw)Suo9eB)4p6#>OR#S at -ah!Tk zJUJFM9RESEn~;2N<@c-T9I`vzE9eDh0O>kNnN1_;P3ktfo)@$W4xz=#hQqt2S3>hC z21?On)fZn7o8JtfG`@yha{2E&aKaT5)$ZKL0ZghwENq?pmzOeH=8!PiKQ zqY6DQcv?uLamvi%bfd*|-%LV_RO?R;srexKtb5LBRt|U;^%Xhz_`==JoeV-QC{QFZ zU~+Nj1bX0Cm`|X8Ws#7k$8OYL7Ww_hMg#jlZBu0_In-Z>U!EGSs|KjCA#%b<_5}UE z^GiGQW5o^Y!=V7e9FOo*OvcS-3kyPrdV64Vfwvc1FLsfv19z(o^`5C^XJ>Ea-PP4+ z1U)^zAPj*RWYUot3=9VQe2(CETNJtG`#;Fwq|-+G*%)l}hkJzp(rZc8y80)hM=O}~ zQeVaTCuOaQop9$WdE58pV#(BKJA2#MYPOBG*bAN;aG1UNUCD~2r2kk_o-iJ|J$IdY zw#u%RsCu7=Z#s{o%aW%gZ0f>2lMmCkt{$8n!-2DlFFHhue_?~~}?K1&&Ga+7tCAOJ`6{;FpwZbJZc`!6 at s}(r8DA!8h$)93a0ayl! zn{qp#w<&HB>PMI at 49323;Gyvum>qXA=IyKCLsB(3H=a*8dbLAY7bs;^_?F_8bUOQDdwj($5q1G>{^uUq$B at +{;_(?;21C+spQjd_rZ zjOZK+MT%bVJxtx at 9YBa!vo~I>#0Eo0qYSlen;4vtD5rEJ`oI&?Ewd=HJCwkUQoQoi z*YX`ktH>WIicgamEGj!rWlnQrY!g*eBpM{<2MZc*ur5$2DIaF}QLq;H=Ww`3;7~3EqdSRiAmS&cv+lDMlvrSzG;C(?sGq at R=5 zT?8+_pqME6wQOvZeLZCKOPpI#g68Rfr|BKJaw8qH_oh>Ee4Ff4w|mn2?Udb%bsBC$ zVM8-lr7ao2OTZ;Qq#kCikEq#y^H| z*@A8f+8ENhTz=3Ixf_SzR#=JIY}Sjoh<0U&7*L|(IE#6)i?#eVm-svrdx?^bS#@{% z8)u}B;VBag!?)RZk at fk2lXGB~ph_+gv5;?bjH#gNkje69Cx5PpdOmkyKLE`Cl4&cG z(-Wgs`~=y9cwK7{r#i$4aU7L(Gj+TtOw0J(dCTqq+QX(l{Ui=G zW;~0p=ifBa`+k-L>90oq`Tv8Xe@>ZXCHyZO0luRWQZW-!<->m`3o*vFvdB^g#g+n< zSr&=!{S-J_cThc5ou<3XqlyVmgd7Az=oKO~&6;iO6)}<8&f at iH_@2C&(cAF at S{*cn zQ>i at tlWnUFLw2QAdf*=xLZ(T!4%<}l(=izL&Io+jsPx={BtCIMAJG9Y at +lwn8K+nf z`fePZ^w6LzY&^jbVMM3Y<5%xTFV&FBZ&X?gLFCXuwv0v7#iwOZ>!o<-P7WO(L=G!A z?Vp1uvk4~3y^5|_ID=(eftjx+tnQVQ*I57{DV)QI at 0lJ3!S_oIE?-kKK)i&gn>~0n z)_ at 530V@ZywXj80H(@rG!~dCwVdToP5XvlJBPCV8T|oo?nmsG+<(un-i3?Wfqy~tS z48rZ&KlR66cMpQYNwHrOg-ec#sI_6Kvn&9~VbYW)4J`P4Rro3PmC;9tpcH;$c&0;k zFPwU!sDOU^t8JEapmzD}c(W(w0{@;tN+r{54Z1&;Jgj4h)Qmmkt*uok zX0?#39caM8`Q*nL<(r4xYp$AJeoq*6qg7aC3(Mbsa#$tT*O^2qxjl>uct$&-XR+I* zYEoH`8fQx$Yi^P;tJ&jvWS^eg465EotIVE_@}9aS1I85Jf zxGN8#`I2`eNU>o+GVbAMu%4MFAPN+w2bqTo7$t;)Bj>7jt#wJzU2R8oxDi6CSS_jA zH2I>}u9w>^tS at 6zO9)h`S2bJqBwAj&oyR=M<&=EtN$s?`xk-!yTaEI09ZybrP4hZU zr at 5KtbiVcs(Em{PM*wNX^a56o>LN|#!|9!BCH<{+%emAg!^>B*_XK3R3%}H+wAYin z7xCkymHW5X4JqrLNs(L4e21J%k7BsyX3a4E>`g8p1UNM!L`tFTH^xC6){7<3du)s==eaZ{N4s`0K2Gumi0M6nU)%w(}H+XbB7tf+C#wXEDw z)=`&6;IAP{vm7VOsdFkm$Wj1oh{G$9?l4eK+o6|R>=RPAkZL$@kL*CLxUH z*swvnaUnh8HFZcJiB4NA>BM2sVrG#;qoKz zNm)r{WXe9+gpvJ+DbsmQ at B9Ldfc}*+y&HlluT5q$&YJm-ihb-%Wh3->tYl|zTOM$2 z|9(ppRQS<0MXe<^J`?zSeZe2ZdmJS~-JGpTxCOl$0gG|x>iQ{Lm2cqVp!K^N%7Z}7 zINOYlYR>LC&?U=z>LzU0!N?)l5y{na0MVaZWNfsKOd?xyeGISFRDwesy{{%hqE?M^x#mmnq%G;+P3F(OI?6}h5B0b3~V z>rTp0>#3Ca4s|J-=04}p`{2Z--5 at aPFG;e6z-X*2%!F~MSQ(J9LAoT at XbcS%U^JBN zB~h1wjV6C#nsn;YXp~P*q5A6ohqQMJ79~ouK#zUyv2EM7ZQHhO+qP}nwr%qs>%QA> zW?n>h^hET;`>S11Uzw}2R_>j()_Co_%SGib&UVvf4p;|QN~LCpcL%>*@3#(sR8FsM zRA_3|7}T>mg}siF+mNzdCbYYkl-;BRW&$gJ{A=$Q#rjS*Gr zg?bd0vo}zhIr<7ir~_=6GxjJnC+*M)C+5O1kK+A9$#qY;5p1T5_3+B^=LJY(CxHcLKqvUs_$23daWH*ijm!gJ60WJ^*vZn zSF|#HX8nwQ-A0;zo)-x^3%HD9F;2s at a{LRp5h+_(sNVS-iEqil8qgFQ2 at MmbGok>a z-aOB1kk5oL_j(!wm%a#Cpem&~8TMLl=-#=tSC8wBv4UcrujJvgaH(aMB309^jhc-fBwf!A`Gq=gk3FnFAu*b!u zDhlQbdtSJ%RO7|etbrKQQLDzm at rN!p{+;iL{+q$!)2=QOg5&S z3>=#U0~NmRI%!;!R at Lm|*eo6WUihxLpMWyS9T8{2t8S}9MT zQ)e(AE0#qHr$HBs$!}3J4e9;T_kwQrwd|CR_i_levp$3rIUExVIP?lxCvgtTE*Y1B zkzjm3%Q~?Av$Qb2ak%8jd4EQiV2RCDXK!jwmpQ(WcYiQ zgB338r5yU8q|DxvqhkB3zJi%H)}_#4j}<0t3aL*k>I!z)D%`No@&=di zKEcDIi`cjHE&d^A{zL!O`{)#2 at r2i}xTd*tB`vN)3O-a#pouruF+{k!uXg%cL_D3X zoD)&u)L3d7iuNYvFhEYr4eaDjW<|T7$wj2)wz!IcWnmGoadS9%II%fWwxElzhbsU8 z-2mi}eb#!!uGb=nl5N=~f7AM at j_+{ovgOcSqFE5(VY@}r+I7S0(4XTLr3*4n8gCQ- zD49GVi~1uD z7QQ2QeKgD~am_T0OYEwx8#eUl*-c2~9<^RH>??lF7x9hO at Q2`q=mMf|n}pdS5^;lU z(zq|3?1+%uMu85=Fa;YqZ4zq)GXvRX*p|3eO4G2ZTfmxZmUx!Hmd$|;$qmcl74enc z;gkIj@>$-|7y6mr at fX5u-^{xk$DdqmN4AF^;s7w}v9b=CZ*hInRwt|v2Qk}g`cwOB zrsP=DF=5D-)+0{If$eou+wq(2FJFVx(cDS#5z8u5NdLq_ at B>LO&yJE3cW{KqUOF*Q z++L<2Hu#wWP4+8?DhaG^yQaEXFcFH#5|>5G^u0`?avxSPSHO`)N4ktZs%|@-VKZ;b z3>LyYF8+Ilm(|869(GM{Cv*^T{=<}oBx7ylsJ3+;IBH(R&LkbJviU*RP15>&nB>dQ z at o8LFzXJM3;qoJa{2X3j at IKvw`~v=*Ob>1K|0En3;lbc}xdi*_4Nq4alvKIW at F?7X z@%Esw7_q83qfx!vsy^~SOnr*)yfy{m4Pm|m&?dnd)_8|A|Io9Ji>a at C)+^kOtvo8I zJ|l5J^+msIcRT1vMk-heQIxQk(DQ*=?1)+RVzW{S=eTMyIwVaW<$LLx{XRWtYftVY zL6U-VAyNRo#qm#TZbW?+qIRlmGiD^i7*rWkQmqF2{*x0=%R!>!XxTYwiVr%*Wp6Qd z)>#;Wwh}84-JZd{;65LOpTm*QeEoEpv`E{=+l0avykqNyLCY zo}yJLtr4hZ*BVv^R6*vL7*cf^Nr<{BN5M8)vkBd0-nXpg(a)fZCca7bu#(|YcuaSE zCa$xr_udSSY`%ZYyw*q55F?HgJAhYF-pcZexFRYXD<7*=SGAA9+hN?Wx?!kJmM$%3 z#V$2>$l6XJc<$V{_hLaTwP7phr?0nV4&DQ&F(HQ at M4bp7)f8-nnqSWCW_9mSC|00I zDpTk-2cM*&TW;{W0PQtSpqcJ>YQK4IJbKecch0y0Pw*yp#aA&7yJmwy=1^({-htL| zx=}TP3|Vh5z;;=-r+(dn8T|yDFiiIqd#D$7IQ7r4bt617n9~LC-^SXwXGgXWDXDx+UmA=Q}(t>MxZaAYjs%WwK;iDzl=<|yvW6k!ec4bN8n59iQb}(7MA`;v8_mUE|ejmHv}| zL;RZ4&+=YN(pKxD)=99ztUVYCr8DGX%}5QKQ5FhG%)%YN-ob0B!fi|*<5q=^8?(+} z68j`MUKNiq|8AA0WI2?$vw)|`L~@XObO+ixQ=iGxH at 5u_A0!yFDF)L4JqI at R1VeW2 zVVa(*M8+kdhhY8$Ttg$`8rcnJTx4waXtg)+c*O_LA at D?HIEEap$Os_`a6*K9g1$6q zHZ5<>Aw5Wq>K~gnYC at QhTO74NiLtzbYuON%s3 at qg20!GoeJ)uUpF*hgP8VMD9gH{t zd6?(vdDs~ESW`rVL+Hh+*d9T`nRcxiMzLZ7mr-0euQgB;+Y{r_=*UmGN*{LoFW3$z zyLz=j0s#0e0suhwf5G;D!FWf@%^P_w=g;@LhA1X11PEeczi1)_<+z|S)`Vj)KfXMm zgt$1eM+;^|$VzScP6_)6MXZ$}xSRB0>hQ4a5Q(5VTEB$#Sa#jNPR;(|+;>67hMMomC)M5SZZz%JLq`*Ud`uaMdSGEV2BK*pv0*C6 zl6XyWvkG?M`T zw5HsUYeizi29Wo5{$WH&s0SznG>LZfH1T?Xw8k<;)@tctN65$q!C at 0b)x#7Fb&^9z zQY{zM+Wr*6+C+PnT7$F}>roX#T^a$BS|dJ7;p!B9j!5fk7Q)pC_nPp#Bz>0EsCM1J zmUa9Cu$6nq?Z_F8^}w3zMbbmo)oz_(S4d3sZ?J3l2Bl#fL~B6? z;I8$aEFD)%#t zC-J%n{t_Hs*EQM$z~DCO+;})0{c^qB1Fk$6CecB7CH}ZffPW$D8&5$zqF{WcPl0_i zU7tbT7+O9 at wF0F3$G2p&m9Cr8*=cX=>`UpYjL+8P)|J)=X4WPbCju&qSJ04((7=AY zUPa;9fxf at 3Z{H!TT1y3Rq~wz&JR_I45MZ3BwG)(*W!9_LFOSNv+X<5_q=!p@(1{`#Mi%T~ z*4>AzqU|j>-5xjgs%|vRF72-NiabM8>I+xFfd=ZsG$IiPy=ULVQ^w4zEo0ukqcNR)hTvP5I~ioW z)`8#qkFhyKgc09WY^UqEdHtlbYD{f7Un>TNwEr;UP%~kd at MGgZ62Xwtzl$UhU4lSc zQ*K?GM^vFNUZgWBMaZ^Q;uK91nwVjV?s1S5b at f=6h_!#uwRv-x5a{U>BZ`irFGH4e zWivaFd?uM*N at 8YAUgC`v6gJg}Qt=nVPKH;yPo#mt7qm_cgxk#O=F}Rd=~g`%R>d4C z=*!fnc4wLm5`baJcs?$+7mUuznjImGU=<)T>d?)|I|D&LC)x9_$9vjzkSjdP7-!M} zVVv at 0CfFbRf#d4|d5P(CFjapB5eyP=K|dHCd6fOk{+M6zcdL|W@?4D0hQ5J3GjCmN z at VJ>f=BbcmN9p2w^)tGXO3Ek&Co<^u|M}suEs#QQmxUZ5xH&J<^SvV;r0BAJF-Wo7 z$BH?uprbG|%w`oE{atp)@I_l-G;{A&%eRT4h4PZj$t2YynrqHEXd>|;MS2;R+D}Gm zlvn&jdNPirxP+fmw-zZAAoOdcaB0BMS`4>Rvo4s&y5!~U`?E!=#)o{s*8 at s;2?{=`LL;wr$`r_!!LB%KFp at I`DY!$n8NQW^ zd974KMfAj%^<7|i#K6VjAQvUly+ at Lq8Jz)$aEgh3o*!`W?g5woUZ?U<6br*dc}Vt< zsT*udc^1wF8NN32iFlG%Q+qpg-1{OIy at U#C=%BC%Up!E~F(pno1BE4GG#2MMD=0G2 zfgi4tY?lh6G(W{koIp%3&zL2aVo1+NWR2`ffQ=GD6g`)0a59ioM9YUpuJJw5V}L|2h{WW2h84#1&BNgIc9=pg8wTyH~E4OL)Nd2nl=yo8!aJbl at 5vCACFc&SWb<)b#uPY$c={0b$w}7^R zPMMwZ%Ip1#>34Z<+!FAzHz2xyLc?Aw=+R~GYlZ6(Yw^}saPS+Q4)UVidxNcRZkRJIq# z&HHv?yE=59Z$}jmk%H$5QcdKgCTl8R*s2&ZU#{A+P?i@>f)opDLnX;xLq}+{ z_4cx9Tmsc(F`s~fSo*F+NsZPq7mw>I`3PVdUCK;w z70z-YuBQC7q^qZL;zl`xs*rNa`!%1|- z;vg`Q?1V=G$|f)bG}b5;Q%W%aj35E0V)yYdYy&e%nSFr|eAI^s7;%TsjMza)$}TeB zHN(Zh>J!24d|lrBqi}~|#_q_tW@$)CgiV%;MQTjGZ1~lZK9bi(ln8v(M`HIy(W7JQ zOEHYuVQ6F|{g|gdb419RmM*I2=m+G7VJBHxk;W#h8ps#sp(6YkKvl!rEq+WlJyw0Z5ks1HbtzKD1653=_Y_jUJ3lzWQR zX(nIDxJd_I_dc4#M%I@?1R^KE8V^Im?a&4ek|+d%trma_mSras32_mn4%=aFN)7Se zxeCGT=c26MO2b~p-DtXL2e9r+qo4P_2zc=i?7ZYdTKBEtWX502zM{in#@^_72 at eXP zZzf2j>=?TNdkT>*>f|QgFnm%QeD8vR^mMG^S|w{@-amk?V%4^=s0xfqK}3|F#)ad` z*~qYqdeakuL790IZyaCTUEHzq+Q-ny34F2h)FtHD)Q5Vw}iq*^yR*lbSB}Wi*Eu8aY(OVbb8If1u+07&fnVlxjxMgF^83l z#$;Tvh??<-BA{!mAvORD(UIf3 at eN-Ca=OzsViUU3?o$;45*8b^5pAMij at f2Cm7cMS z-50puI|GJhWwBeObIq;wN(kTNzyx*6+ylO$~IUg z-3C2bVZsambuQB8X}%~)q3l>p!Q4JB`O7^JfS+^bu&oB+t-EHz`5QpY^Ca2SS|De6 z<3K!t&|6`bJ}1WoTyaC7lnwYqZfcWqZgJ#r+fZYJp!oBJ;7flaNbM06-PIF3Asl)l z*OFyMUjek#FFc}4+trfefi`pzjyjO;0JKP!W9XYZR_nNzXb-wYkebSIUQ_pp zRL2SG3I{b>DGJKf&}9JIFruHjwXDm0nh5T4QJV_(vaTKdxMlgcE$aPzr;E7&w%0Cu z!^d-gkv#{>#(%&F9YK*^b4cG|`o+O>{NyzGz&ve3Q>X0;=BOiY0gPkjk7YK<(_!5|RLL5z|Wgl-jdO_WEv#}oy(q2ivLyEJPm z)*u&FXgd{tXinDu;0)&Ojoa+CefHKBr$HM`RYWk^J$-*BKBR3ByL%>BzLr3+mKMls z5q^?zM{W~-l4W>uWn at v5A($DkuOGCV3J~}AwR?8UzJonb9;f->5hQRN8Alfq7%r_0 z%}&r`#w#+tIQ4Dy!GqRgrkg(L&p_aq01~bNG%k}sFr8u+N?Z^rce?s!IUR<(cLvB8 zl(&kUwJ%TA+{r<;l*YP}tl at 0i1RD+B_7W6-rmA_MIqd`2$oou8Q1~;C$L~M!N}O z+XKipD(Swe(a{TeG&|hfm2K}Bs)~qQ zfC+*94lG8k7ozYg+kTcqg3I{%XX*hfoqa0ZCAA&Fmjomx)-drt#l|yY zyUt#y^_ms^+_R37{|Q#&@l|3y8BKp<#F5m!4NpJw#Ut#+Bh6xuv=Lpu-X+zT8zd=e zYz%kxX+H`|QT at 39d`J?0yCW*JUKj~aZDcHix~4CfB!X;9G+ at mh3Q96sYL1l#E0kKI zuF6q;wq*3BlW-q;svt%3!>48WvWu3Wwm>?hEdf?!2!}l7bO<8>T4gY|I?Z$tiy-eZ zBxq=_iSfGHeqH!3CgUyD{hD@}C{Z}pf!)3x&8oi79>d2^?8gtT{~7>n=V{&M_94($ zP$&>>>FUMu>X<_LasfF!c0D;fJ32JgTt5_`Y>ktZJ2C{QZRj{>+r@;;IWmN)yEe#- zBW2LkTMw at 4?!YkcspzzVF&keqtO^MI-l-EuTnfuMSF)uwyX4AKJscgSvj>>vhbhD&?A?ZhLsE@{S0$67a14k|7}f={$bk3_iEw)2 z>$slDP;OIz-g^qOOwgRjrWd80RZ|@HN?=m=;UXBopV0He%}g)ni{O~SW#HiIU at tIahhGKur65KcFMdoMBXf)X%(}fG6iskFXWD!3bBXZ_CqT2 z-9~!O1 at x`_0q7BOzl;;%o?6d{!XV^)| z at eS|=#K^AO*u}_pT;A;?nY`=2W4;qog<#-%LfW{YnVMD9wQ#9Ha11dq!wYhmatuL% zdEl7mg~Ay#Fg2;=_jhy64)$K{3~DoNP_=YCs=xx}e!qo2Nhz9lvCQ#L|NtzKRG1_ zopA2;M at NeQR@_n{t7uvSpaIqj401G6n8|ikIS6*puEV+rZjTr8OZ4EbS$<5-f_dY2 z)xIEG8QTux1n!5`S&A^;1%U$cO9CGo5d^N zzi52ucr&uD{au*?{-{?ZNB+-o_Z?UVDB?cSQhU78xvzO;QTll;`>SO!e-jk3$9vbQ>g=T|i?0$R$-ZX2~ zLD|}|wN7OXqtR#`+2VqJw}ormG%|#I%%v^LP0!j$5Otd>h4!`d+2SfE*Pzc|iS~ZC zLg?Q_%Ovoc6t;_S6*A^UNu8*jW7!8U>R$iy$G=mD2a3YqKwSX+r~0}7X3suFQAX}> zqGE1c1Y;eB-f5?xnX#r7SJk3jU zJeFQhTki1c>;Qf>7!lYN=ogH~pU4IBMU6=rphuQC7M;OhZ#gAf?Kyh|W- z^)VT~;}i)op>ilPRkzBOUU2F;C8cgMHx9Jeb!m3x;h1)iBOfV9uSc2G7onzlBKl$T3xc&~jIy zYm=tSOgl{p#AqW>Uul?vGYoILLd=Yz8Kn()&>}WN#6(DGq~!(cdU1ZOZQnX?UrgNF zy1DmdId_L$-6$s792(hP_nRP|7V1 at Rzz}9JUfWQRY4eEvvNZ_nb__xK!`lSs+4Sqc zQ_i^ur5qfqdA+<3?dw3s{QH+w`?lg9S`88eN^)FfFtBn-m4q5fZ>+F9XxN}%0a#|1 zXRuL)%R)9l-akk9>|U|r{qHL3ZACHwN)cmx!Ui4Ulr=B~CjY&!@Y z2SKeO?fG at j_a>ISmM|rnoJdsS@$Y8lx1UwZjp*Z8EjHA`g1)zD>%aWj7UtLYe}NSR z5{h28YyJiK$-t at s*OvrYy0bmVIu|^Fv;QwDUjATojPZX1X$cAd!2f@!zZSM;|JKZ? zMR`gVhyl4rMIS`(Z8fA;JD*f`n-K|72w#$(6o`v$XgzvFR!UOp4U}(0&;9`XO<{Ca zA0S5o-kCu{&hC!mb$j>XYU?*NK=wc`pca at lR(%luih at j@I7p0k%ZW3Nl7yg48j~7i zKn8QvuM*iL!>jU3$Gs=^SMpVG at 4Tk*1Ii2W>A)isl9YbbK<60uX-EJdleOPID3|ne z-L|duR5gR>CSAI1P)ZZ8ObE)3M3roj4H_^y-xwJ_*vM{JQ)o6z$tSyi)_>0xcIq at W zbI7Qt@$EZFA{>j-wTx4&R0cE6 at NNHcch)Rjc5>hfcZFFOxo7v43=MvnARbZ*Ki_;*IgMXS^?M(iG7)RM*KGZnO07)OTPH ze#olK!%?E>IGW18ncxnLbH+u0Q{KyWqV4g`+ at A0S6R-{pBdX006lDvyyJ;N`DLde;0N&4JTw3 z9t_SX$N&f+qH-7{{lG5xA_GKYL-f>OapmRNX&Li#=P_OXcB|0qmIYxDoiYJ}fo-?k`j)}TIUr$W_z;A?MIOS*cIEi5zxTnb3 zQ-X5 at F~7U}`hy0Bys=`~k~p7L`?L~`jK>@&hfusea9 z&)nT}!_eH_6$YlDbP>)Si)*Y#lbdmN80FMNL59=$y*3ze)R=ZCX6}tK590hCFP&R7 zD|iLhC at 1`rsqpw*4ZWQc%cT*3YzR!8gCQYFVbrFIj*b8cNaB0P+ktkD&RU{0C+4R+ z79TQxH=g1aZXtbSS9Ijcpd}_LNhhRPIS!D(f_fTJC!JYeC9)cccP3#h%k1C~rVi#( z1SoG*BKe)Q+fG)p at e$of^o|qOU}97!Y&63~P`qZ}&NDZduYxQ`T1a+To5vDGc<#B+ zWYW!OtY#BPHD|X?C!Sq`)y!m?Z7n)W4Kc-9S+Tr^k9qEmvKKFvnrcKrS3QE+!8pcu zGYGfq)b_Azd#x_na5%^|ndB(bDZeO_^B!|fk=^GgEyiaqIiEQ|tykMxjs{nCT<>#S zBq~80d1;0a+E|u~(2mE{g7quhQ*vb8ekN?Fo6o30#5M)F`3 at ffMMbn!oC$esiSN94|EkBYZsb*x>kzt4cYS9y8E$s;|rQ-J2e_EdX)uHCMZ zJycAkd!*g&2nWUOkTzh4Wd?r$@K7mP#XFP=iWjZ at EHo4FVMiVl!a6R)R&io|H<0RzVX8?P z-N0`@SKy}E&1S3uEQUa*Jldgxu* zSc1k-k4oZ7+ at SoILx{@H75kMYpoI+`biu{Iz9ZR9*vyA;G2O-unt9jGw&7OGX)E`= zpHLK_XRg~kRfRtEV|xnjdd^q4A=-yM*KPPqmxW&V&Fg$G`qt}`ubp*Y9B(DgCfwU6 z at RP##f at VovWv=XP$qM~U;Hk3%#-W!cu>)QVM&29N?JLF?v^zi$GvB%}#vwQ^+`$37 zZRRP+3|6F+xV8xAv(4caL^JT$YyX|`6`uJ}9`9S}z9+qDNp}9nQ)t0*S^@iZ(G;=)x&rYr; zm=nx*icg&;3Bmx at 1mU>xVdEDO#?Sk3y!FuOUini6y(46cEeWy|dS#l)zl17d7$NDW*=P9k7Ogix z-H922`duT8*Asg_RxvRgv;_Yxd|Zn#hzi&$uc?n0$3fXOt56jV>8md!_ASixXOB@{ zx-_-^c~{x)l9CnW)2}%G`a5BBp_OF&aeYnTTuCp%xU$ryr(w1s$(|rrRFyl(RY9n& z+^8u&Ikkx#0_SrWRIjQFm?L2XxS+{nq?POo#Vv!F0QDX at m(&WY06qMRVIDcs>`UI6 zbV$A$j2HvgD*fRM^Vd75%p9lgpup4jznGW}2g~o${bh!6F#jpl{^u{>e}D8;bexur zk$o3;ShwOesc#+^Qh^>DYywKg!xj|>6q{R6i%Xy&GEIkA<7F&)^K%@Wmmg-S?&SUa zIkm^5seiFU#j5=P{)svIO?qM5*~LF4vRmi0d&Yg%eU|<8dvAyj0LDOLz*IY#p)4N~ zO)FvKlaW_`9@~bNqCJ{Q at TCB~Hu4}7ofmOvOi)g#oQ+Pklbwp3-d;yk!5Y;#ozZr@ zonk04K3AjF1 at bc32J1Gx#3T3MVHsL3PVPdMLeDw7(B!y-n!}a%UM9*)3r>5j{`>2~ zW6q6bhY#y5!0H;+eh5+1Y`U-}0tu3cE|igxi;Y{doYiPzzT$3Osq{<=T@!fQ{Sk^m zQ&f8ENsOe}@!QGSZki%q{WIADYe~Rj*WRqfBZ>@1DYjO_Dbp&_$29D71Wc4yw!!X?dgCea~b_SdVJqf}GWyVGwr7#$G77YbJ( zAn~Lp>iojs-ZOj&`O!3IBL$GYa{2NwE5{if)WzDwR&ImO&?~U0pW$cd0Glk=gj at Ml(^?2qmOIjfW8NblYqGWWHD~>P8YH6?#rAf%q)(g|g8GAW=A;2Uner4||BcOgjrz zcvFKQ^Op8dH1+PB$iUPiV%i%*xQBA5QnSPvkC_!oup#@+RvbO(JZV9<@b=_2%CPr~ z{zk(ON(~iU^}$r)o(<5o4xCF!qne+|R9)uf#Qd1)oN_n)<{xud6!@N809_s6$!MhZ zPKQ-wVb+ at 3q@cn0$eeYOgL7yXT$G*jgm^u(JcWfY97a?XZy>c10B#0s6$k9P3U?hC zvf+KBv`7U85cU#7Y%`N>MF%XYrxF2a73m}FE)^B#+s z)f^~S%#jf#n$Id?0(Qs>+U_t&ghGN%@0he=%xz|yO}P&5QnIe|kWE-O+QCKnkQeON z at rkc%;rhEzG2VaI3J8HR)e at -a(LZG^#nMrV4epAHX!|AaPUtppW-M~kTxX}Ii zEwet$!xU;2Vm7T7TW4QJ^cNC5_W+CiM9ey#{>wha9oDCfC%ngA$Yu3eM&OIsa!!A% zLwAVH8=9AUp(y-%lux!(mFx$Hl=O^%Aw-axhgN{sMdKrbVsN%M~)!vdmiH{#&! zJ_d at Bdc$TMa6vaLctTmTWhD)(OSoQWA_4YjRl}W_Adr|5kXbtt8)G0phGdNm*@0r| zY>D)sEObK{rE09g>|xZArjg0e4kp!4X0>=>A{J3)OZb$PFn7QK`UC43>1+>z;g*}Z z?9PcM?NP}sS3LNnxt!XJbrHcn6Y2aJ$Tv{dJxS6HRqx|k!G$%5sz1TA)xsoMBaCP{OJ_cRhbq5lL>Ah#AK$PUE*yeWx#|IOq z1DgS#Rzsc%M~{qE&2px`JmIH;cvHi-xK*R#(w%-}6ZPWZPCTxb8+N3fp=U?@uHCtN zw2X-}sl+c{fi)asFubCxx!g at P-|-LMVYHu|PcmyXzl6a($ioh(2khA+9!;CERgedA z`;K&XN>Xn?rUP!N<#Gg;g_4@}$A1}ZG?6WtTLuCExB&f6_5J>tEuZO8`EBP#?C*?BthsyL@;*H zWAG!Z1huWiupuEOFpSXS^nsEP6&VN7VTov-lHu2e+6kUyFxu#84qAh`U<}GEH8wjZ zFg&5MHd|8}S*p at CE4`S4_vbovU2MV(*2R={hNLfAOVn_}v}`H$z~S3%M(bhNrs#3( zQg7%UB2+@(NWxrH8d|3AM1iI!H)u&h^+3-`)UpbdI2N>$gXo~}Eelb>iW;EKJ)8~Cff>|k)K1dU0OZUX*BuNB z8h4*=@Z+aVF7)L8vh*xd+XW+3W((!A>D)I=ulQ#?!nEjuvrbub at q&4VA(y?mq*RA` z at uV24xC7lsFNvvlMn?1d`0i-mfOM at 0v{yt at VlzcqH0nQ0h-;$_=I;DHxq%d=ES- zGnpm<1xMNE)g9NF^WB}__Y<_g!?vXW*Qks00SOM>QT7LST`07J_Ob(H-7rG| zK~)iGQjI$b2TPV>)7tWVXXq4Xse{NEj46vY%6YGbi;mMu0u!D at 6{h=7pv5Q9X!ez) z-zEbUiUvYByRO8(@K5V|K}H2wYf?dxaaW0SuIh(I0BYZ_;gg(C)ZOyQO63QUuH#IB zl{6qK at S`M;DJnC`Ts24I(51$+)xy*>O_jYg+xQBEW*#;>wZMWQb2BGyGFqWHYN&86 zpqZprD{u};abjqo1&caypc{{^l;10ll}~BNk^E}AP10rhAFUs?Ttx$!G8{*8Q?bm1 zrU@{##FmmcNfny~**j&ufCImqBF((Xva06|;JY|^P_Lf+0HB$nS z0e70IH7a0YVqzd+h!e$BICw2Mo`Wx=bXVGrt8q&2Ais;C2KeD}8SD|un7a-1f7xNW zqxOJ(F!aN6DT3W)rU!GRfU$Fpb;T|)fE}~!8v#IT#3e`>%Ie|a- zDFpLEIQ1(>uwJPipAMvxXf&rX6=tqxv8b8z8sK&!v$ycWT6H(U;+YUdvzrXaqMUbv zP)}r&X`*5};Tjk_P&smYiY=SHmBkLg`WRFT{gh%%XPbK5PaWwugLag<>w6}_L%ZF{ zh$F>h!&_MLR^58f2SUh}$C=VdyHtXBa at ZBNOS06MHF|2u;mAE*Q~3b3F}ozlRMZOp z3OA1wvS!+5MF$e$Fy+VU{>2D+3bqN?P z^LRM|@&~ei?__>8JvI at q9wg?*8)nM*gI29qO!n at Go3~%2`jO5krfvN+@>yPlQdzCM zO1=s0-mtvdA0$!uwx3!JmcB($r=@e$4n1OCHYD at 0pxDb?*3Pc9P+Bh&>TqpwizrUz z3t6D$ip|)<4*-tV`4_I? z at BUN<#Hrw?(RrDwrK+FaIH7;l-o}VPsAvQR06_SAi|7B;82y_Qxt7#FPM9L-qj at rP z+5(nVibWDF1(}&a#Upepn*7Wq5;Bv`tpypeOq@;}uH!9ZIJj;tKT5LSB%D9_eP?lw z-mV?+`NR6yVHhtvJ7%vwe4o8t_V;UdegJO}&oH_}Wf;cy84+0+-mzMjRmGx{q?Dw+ z@}?`pX{4*t+o<9y+IumTKx{RgNX=0-_~sss;!QYjBkYbmo4rV31y4nWJ2#?>ZEidr z2x1Q8Q|~x{MX1ar{qLPuQ=blAYN4;k&*Wu z`OxJcYu71~-8*daOj(0FoR7n*>1>BIv^{nnBDOz~zo?wDexKQ{nSfaJ;t6-QyOT>9 z8P>;vjBGJBPHAKhU1?MsDeOP;skKDJP~RS2QL{FrjF5B_$)|Tuf~JyHJD|)m>fI{w zYLMPSdcXFas^`Da{idSlDn$jYm33wSnQdOqay~GR8`UMhDednto-y!y+qjIW1YhTw zCVy>Q=F)tpBQw?x_>egjIfiQvo2dNg`(;c{1Uu^p}prS68oJl3TQW< zc~wClq`|L+_CV^Ejg{$D#rMj3c4{GKFhH;T{QP;h*cmPIq447;`*jBOneM6a2X>UV z6q at Q&{96OhvRth}j_d|TdS~{?8u7ua+5c0STOVXE{+U1}4*iZ*1(tfhft12tC9;V_ z+km*K*-3k0qH3_?9*#OhPLj~WAVzPkWj za8z$2?ww7p1 at 8!{=1>k}tFRVpK=Ko6E#_(O zpNj!6$;&Y1Uy9xi_O}rHX9tpYj&25y#{W)yTgk%4{_o;{ec*qN*{rOP1dw@>tea#y zTN_#*Y&2t7BnCtfM38`46cGfG6 at h%=Gps{rmS?Ott|@=0K=s}PzOLgC?`}<@EvQ$Q z8|hyeoaQ*Txw!cJd_I5eqp~{9D at +@}UUAl%CJeM-(~#h-xmeRrzlIQ5-$I9S(M;iF zwq9+<(of)YPQrL!#Mf2#{|o-)!mAGF=Oom-+{aeFMO`W$yZ at CMu^mmNWGbcjIReOM0gbhY) zo%`E+7C|2%Fq?BStg^gG`}bWBJ$;;Yd$y6gN1uC*Tso1Z?D(#hV43K$Oo3 at ewyq{QI{b7y!+*Pxpj!QasxLG^HPKv)Ah zUv~D&2v^;~QwcqRObM>2F%}wAKVbhdL1NM6i2N6-fPbMX`2Q2C|ITvSD<#^r2n5o<2^96GE_e9XprW+iLL3AwNY_~W{joD(ggt^k;*oGZeE#GtE ziJ!b1S0F~dLqZj6K!urgDhaj)_hv>U3e{Gk#ArchZ1Id6unYqxq;V at oq&qawJGV)i zuHS^@!F_5^HRS`VIj0ji0eWM zdJ&wQxzQ~Wd3+Cm2%aNC^j5B#Bj6|+7F7F)EF-f1N*XWDM8tzx^b^bqJ;VQT2WiaCbny4CScst}j!_B at rki3ZIkb5RFD(o|B%{eLaCBdT`&^L(mnz zFEhP+VD at dix_`AtO}A{o8r?+FTGY;(TyQ(grC1X{AOSa1aJ9!pL(h!TW(o}>vvaR4 zwkTVRLe}KDb*X1P*O>^^1@*LQL|#faKbyaWteMWw+UxI?j~}4;I7O at vU3zj+1WIiX zyvhI`r_|Rl-4D(tvWB!mUbr56v=gT at Vr1G0uQmUhWCMeMNpBNNNGSfO0b)?}L>|1_h&#Bf|Q z_%EtpjOM-2|G=CeC;))m{}FTlOHuqM04izOAqpV>fVJ)juAy2DNY(U+Q|TXy;?WQ= zun at -tvo7Yt_5LNJ8J*M2Q?;XhB at u0J`ra>M7<0Ekkn{T_J{e4BSx&uo(;Q6yRSF3x zHPYLYMo?R2u8r%%cc^LHWRPX98K_-C$h2`GLT5%X{DyAm<8yD!Pl9{tl=at!@SjEi zg-S_uMu@@;+;pvIHD}eVr|PMhe~El$B|<$1c*EPv zy^WO^(-z^`w01TS|3qXB%)w=jOcjWaq6W>$wXw}B0Jh9x&T zpQT{`6}A8wQ6tYTqYpDFIhfa at m;V7n#MeO8&_01tH}O#``62j<5{(dCTrd3_Mk`NF zi($+^0 at pKy6jGxeeyCHFM8HuUGnX#zp;iS#&amt=*g at Pa{}yTFt^Uvm&=Xl)Mf#00 zC0CF*Ao$Vjl4@?dAW3R{Ml-#{_fw`76|IgqFw^5`y^U`HX4kgun#CROf-Zl*md*^z$?J1iMrl&KD(- z!+ecH`p)%3`hORgxUu_ at I*(4-v)SG5{gl=Dw0WNU*XBjdAsKKcTB`7UDO{M;5G|zR za>kipPkLjuksr~~(X at kOHA>|_c+GhXSW8VbkFrj@;LR29QirqUR4SJ|Vu%viXb1Jo zp(ql?AS at T?m6ZMa>z=J^o%*u*F8YebzV$D&HI{LOKEnqlzKs(`9|hWJ%$sh|XY$I~ z4Y$naSf?NAbewQ*IxSp;n3N4Q#*Z#RoS*scnm$ElxPru_wvA8zkYPNCFxgXlt8&e; zRYlxjn at Cl^n!F!ggL at CJ(cH#`9B$-W|90>{y`ZjyB55=vxy8hgGIu z%eahR5EVL;l}?M8&mOZoRw#B=iCM~mJv at B-C2~}QZ_!qyT$yX#=agH^NxUjU zg`5~bC_7tDPI=A4rLgP>g1`gv_PJlxHV16c3foGJa8anqLp;Az86pE at G;*0jRj<+v zF}ru!0WXzz3b{`TaoH{1Tv1(%Swx}jHN`drj$0_ubbq3PwA|prR1*0ws>p!Fyb~%I zDb}nWh|}L_)zQm6iwbpDhry0PHbV#{jFRfr6uac17I^$9Siq!Gk`f6#sIYtVo<&AL zU#Y}I+6UzXP%$}#xC1NfiKG1El6-W8NZY>AbDvatUGftA(-J_ruoW6$@6e>n0X_3h z;Kc_p(kRZiyi+~$Q_c8HmR`SfF{YpfTiK^#au`cL-Vx0hahkk;o=Ac55=iPuWg+t( z+)>0A!V&~Y^k_4hww at B1p4yt8epyxzm#&9L_BXqn0sfC zb1Om0FMJDkMOt}>n0=EytU!JHTbV0J=p^))$Kxp2zuW&)F?DhIyF|!VvHc at f5&hU} z<#=u7Y^s*iuy+z+aw3V-5uvOEhSg;`%XZjL67Aa0Q>OK+zs3<>sq%Iat|cNG(~1t) zVb~x!SXx=`cxR at ZdcWSE!FQ>wJU8hA_w5G_)b)69Z^BPDIr+0Gpu at Ik zgYpaBOKT@#n{aK|Z9E^odzs?az$0ce)=lB;E6LJ7&_z1bpD?AfXHNn~o12PNz_A)B zBmgt$Se1!j?@o-MzU_5~_mY^QOY6VH76q715Ihl~dB)3Gn~}k$bxF*vD+!2A4;4L} zNF$EXBWS&opsH} zVay(-_GhY$Jlr2Ya*Wk3KF2IBGY=~ww;1PpRufa3vUE?3CkL+&{cHRC#dMt%jFs%p$`GGUxiyb( z*tj`I- at C)iJJY$+Cb^P>YxbMo77s~rk>@*>%?x;g*_j@)6T~FEc!6ArMQdcJ%HG(h z_Nz^#A-CT;+Qm4b{919y_SvS^kBhJjS>WQn8(K>mvi}tFfo&}vN=h&rDyQ0mxE$(v z#rRj42~kn+!u<)(B=A5$T>su_ii^FirLm~J>mR5IIXM}6{`0I>%LZo!jgKUj6P2xj zN;}Gy&JCR`Su`^yWysN{eGYj;^{6Q>p)zyI$*fG4ZuxCayOZhel!5e+ zQFJC*ZlbqZNz^gpi09u6!IyH8du%>6xq;0t&t2nN#4KQ)Ca>8jCY_k1AL~Qgu+NQn z_L(IzD?#qO?NhSr8B!p(_~JR!9U=thwOKjK2*$8(*Pm-_p(P&A%|{Pl4Re-ZWo6AW z+eEUmw4h$rib^jJFM72^qgwTg>9R;QolBpfmS9 at ZSG6oqusf^i9?~nc(CcC(^O9r5 zbG%c at hfC2O^XsQxbM;KVz4=thT9tuylP66H={j04|6O3q$I_zC=fIUXgF+duE5e(e z02me)nZ~|zn`^Z&Il5!zri3@@;W$deZOzN4TQcC8EI2}EW}|X0;R&lI6KAb7oTPgz zL at P~il~J|Ur{(JLb$QGp?xs^yaqW_ob7|UVQ1!uHTYlG1am6=&+DgV8Ns{66?muy* z#d#)ONj~`v)%_c(;Zpm1P3Jj|N9<)umo$|*fy1GZ>!y>QTO`*OZf#o+i at o{Qo%~vY z+{%NGO#QsWmo0rkb3r^-v#)h+1f-+X;I6+CrBNdDTo@$4XJW{dmmyIhb2Va%9DmSU z)(1V8<%W}=0hB1G50+fqad-$=Hvz|6T;v2Vc5(>gS`4elWS=n>^SL1c!*P5_2ILj< zG2H{pfazKd#Q^1I1^gbzLu_!ivyA646%GI4;7^?SnQX=Lb6DHgz9OnoVsLP!&Ue_a z$|7Y_g7 at pYhT~nOs%F-L^>-_I#Simrp at f+F|Dn at Q!~gAbGnaM?2QA*W+zB><|t zhpRIm85 at 3JVe(qoB=h=WHco4~kPb^-J;qlQnn1lR8y@ z-zT({jJ$09RRysdo?LD9ouirBjaMtvC`|Fe*!vjs`!EBu&q!CX8z4 zK|SZh!*>|Jhx$d`NgIMtODxmpH%|r^>1~_=({^+j<2)KQu{#(^T}QgP^DdCp8o?OE zJ}BU5puCg}Oz6!VxB?3ujF5J64z}o%GEYl2L|YU)C?|jKivR zTPUxDZ*F={)lR|2S+)Tip6 at gZYHT8y*Cq(AyDowDpGiPx{Eo!J{Gam}82VV~CTAAajf_z4LKfp`SWn zpF|NK;mLloYYLLPrA1$NUp&724Zt4+b%kT?(*V_arJ1YWR&9|M%r~!aO*yhQXY(^Z z=}0^|vpMyKOEShjn}+68Xx^yT&Ad8l3dpiK2e+u#4HPKmv&dSaZjYeewipHw-5ZDl z44A_Wm<)PH#NR{p-do!UdW{u(%?n>af8WP-5&93jQB at k0LrNNe#0O?U2QoVVB-9l7 zY{*B;803C&W at -e%oOxQwDEbDexk!E+4BAq25r2HDqo9C<#Oyn!ZlMhIZ*RFo{ghtl z&4>0kf9Q^Jdk?y8mAcC%Di&3&6fS3&awd at 9rBb#MZuKI=W|S+J9|xQe^o at VtOv!^T zma?Py>I_}VoYnJ=1BnIY+ax+U-f&vP%t04RGRxD8D%7zSC+H2*mKm#eMjLe*W0H$4 zMIC)pcZ|N}30lAvD0BF^DlYghRLDw z_(_N%yKx^0kaBfQ6Iyq9uQxZWUAM{od}QMAnQ?S)^ESceonh>n zq0?XB6UJB?<}cIJbQ-K(mW$gf)aGA|yVtxdvC}Gu_W2Sf?mG1Dp#dXRu=g=a|0QIe zZe_onDg|teVs!bI_*Vx z!&hVDri^t`8n+fE$yl>@*V|?0$`#!kMD-ys{24Eo7uNR5*J|`eFDOmcaU9*NmzO3m zK^%K!zAa*$)y_~l-O|tutEFb&(|GI)fjqUF>Diicdaf`Rq|hH^mNG)x(kIbET++q~iMcI^5%H0+A-pl1w#=z+Ws>B2t>X(*@+k2O2?V zD7hp(urwh(5S$2|a0#j%$yNNPi9((Wd8k}MrYILFMAoo;*4`)AJ=|#P={FOj(#Rj{ zSPO0yfrsbc#}666l_vfFHsoKvN!Xq9r_2#V00I*FU-IMsN{eCjEvE%_#BJkAH=|1O zS=QuFM8a84`93nmA4U{ZV43k9`TgX@@yaG|i%4V2;;D((P`=4O?+d!A4)pJVUlp at 2 z at yBCrr0S_mx$$e&CEo6Qy&tRYS9bj0p at B34DE3Hwl7gXErTeKo1Pg={^o zJw*3;kmICyiRwl6y^$4Au0=p{$OH`$8Ol1Wsu{!0j$5!Kt;K^_IF;00dn{Y6Hmj)F z;56h at VmbZi*x(AwZ*VKJ zyR~=^T{oDgU^t$ZxMx@}tsP=G&|pc-n4OPKCVKYop1kEKAtSBS+Sim_hn3;7`(@2Y zRy!+No<$Bba=oVr4fnDQbpWdnPIZpi{r89x5aauX*;h&hZXi~G5jEc(kA8bg?Ec5L zTC5)AA7N?NRqG)6PAl&xyX~6OK>1+q`o~sK;#mYhy+eylr3ry4+)Fj++kwS;_YO_alob*K(QwLjH=je5J=$b0DE z6ffGkAow5)I=}fiAWQnr9VB6I`gT3>?O at uikiaUafA6b-EKpk6R>RG<(h&F5sAq32 zZOP5u$N`LF`I1k;bxH03XjG3puamiFI52DtRA&XcaCH+5;|@k){g-S!-1ItFjI@{p zW|9y&XXb`mwb)>Jtv0afco;yg^yrqg%<(iBzFi*^0z;x)AgFYZgKhCmvuX=$C9sk` z_&8?eiQ0rpk7;&p#sTwt+xSL{+1&5>lPEgM4yWI%>klM?VF?p#8PJ at 59zfKgw#%MU z#Vez0vl`cEPAPkO>B)Pb&x)aOyT(}b17ygs%(?-%5n@>UK{(7l@SO5}uW9u8iI9P)P#zdD!Immb!~%CA zm;;eUw18h>T>!LI;^6>P38s(k;j#vof~tWA5Jq&7nkR(R#F3i9Jg^J!3iv~npvT!TCS7$$3olwuTwD2)f{Q_or&cs{ za`5FkI5DR~cA*YFp*8}LQoSTh$_0cI`{%f%U_uqX;ktno?y5S?i~+@>qM$wOd!Qrs zmrLQVI5f3;EJJ7u$36o&c70;bqtmQ5gMp70!P?f1Zr?nmVx+WI0*{>jpdh=*5wi5*|2M-095Lj!?|;Mr#h)Tv_J1|b at ZZ2TgQ>m$nHd$!}H18`IK_>vkB%Xzcboi=HjaO) z-t)=&0OSb88GL{UCOph^2#v%dbythbe`b9=@(4KpJbxlE=mnpofq8Ws_!cp$TJg!KO8&})cR=MC$`*-Z1= zVIm(41z`4l<5!k`o}@%(v`wmQ`C(HP-_gpspHNB|9>T)R zL9H{eOc9U>N-Mbpeyj5aXygJT=(Ct~g3HIKq__^dW&sF3M{nsgqfpH{&cu31CX@;8 zhH|-$JlZPs?I!q4n+OZ at nl;FW_8ftPu z)B7^Ny{04EPdLde?kChSG*55`IQVjPD&Vn;to^bAkBu$t*tbw%`vQxa$a_;B+F-uR4 at Q5ye zk?$em8_C`Ks><>1wGKXbBsI at j5_64wLJxuV0?_4?SdIC at l%j&ir?zx6nnYR#8$DYd2T* z!8|8v3X=*J7I_IJ&~&HUQJA{$SU*DEAaz~O4~@=(8Ql*+Ugt-fw-k$)NhiQ^tg)E? z^m)t9hNn!#a*dBrK-X7Ghl03$1+m4#|M&lnr7osbQk$h(|H__Eqn5 zw+s at JQSOm&6`r`b!TZ|zGkuwNF^guxv0Jd>l?2Joiw$L=POd1PJz=hZpd@l at QYPIjirUHR6(Y`D!h at Ynw~SeA zZJHOk0+OFC=9XOdB|U}xwu-$0-Z zvzU`%1YlgG7uoEnTf!v8UyBG4Y<~+S~YuZoN1Y%!mKp; z&cp_O_s(x;;C at e`7*Ou9d&6rydZSB2$y>PT-s#(zw!_qP<8(S?^_WFrpNZv5!(7DM z$+s{&8#rJnkWYeqQ&$<`(0H<)}ln0D4jx5?A07KPj!#ondGQ$sc=;& zVS;y&&d4|M%E)8#f5b7R!lJ>jsHKjo8A=}BLb?d=<>y^i$d|gZ@)`jRKDOWH9 at 37xBR at -nw8UH2W@r8lxB*NHi=5Kb=J0tV at n5gF64*=6-f!xMp82vK}UhhUy1(oHI{bHRX_6`UKs2nc7P63GcH^ zqv_@|iBaZ-VPUVt$8%2YTTK~%i)AHSt})EHJO!Z3AESIQs=1UUo?WQ^AVhkk~*(etT zBPSVA+mE;p(mm)w8?JachGgdGb_o*|7=|S!*(NCE;H^3HtjoWCaGIftmm7KTH-+hXcjY5 zz|-5rhW^lZY48}ap#DfjVH3Nh*#SZ|ZkAa!VWNRcer>0QETaI|H* zTz7ny98YZB7jmlk3=D9qGZ~dviT at tu#mcahE(w`-Tk|4ypsb#*NfoRB`gHDHvmH zmS7c=2Z(1#5Ee at WZ?_s9BF=Of|1vf1XpQeM72)O)h4W=$MaN^*Vnm0N#V>rbQF`U~ zNTV-|9m+jOs6z%mYaHib8l`DKP0KvfCJ(3F0luX_`3JC&uQYmZ{7UWN6Qt*7sMNcB z?G``!buceNU97sdCq0DZN&JNb>IHL+5vsX?EfBw*c}FDiG?o`<0POvdl$pgH z&ql^4_`h=dt=`ty`wzFV>QMPCG5sAboP4$E(9Ca{9(90-m=Ni5M`{@eFS;# z8D1_HXGum^1e1^5x6M8bh**{;@Tk}w7L#v*z<~GUBaz}wO>bBY_I-iKAvcRz<1*UoW7`e)lj*+B7 zMdY_tC5IwT6#BFf4*L|nAHQfRH=JZrPb_+vGL{pVa1~5iPoTgPZiS^-D}BEK57rDM zx-Lz$r&b*wWAHsBu}eCcDTU?TAZ5-kU`lNw3%3;%Q~0^%qn)_(a&n>Uo42 z*NP``8h(p3)@Gq#GTucUwVd_|(TZi^oV;QC={S{d at h!&~m at M|LtW^^PqM5 at HP++<6LLaCcW zydl-E{>Z488N8Z?+UIsIq18qcLCA9$HO at B!(_hc+bBH?(x6ZTynI7vH^DMhmI9T;)~`^SaWe z36_pe4B}oe?2y+uZ at 8_7>n>g_zdgIE#Igr&nb<8ynFhVfhY6j2 at MR7L-50-*8M1#Z zEm!hdrcpciy>q=nM8IsFD~@PnjlwRV`#xFvDY$Jt=4Fodr*$*v^jJtK^-e7Esx?-q z3yNWF3ob=P0J2P(T&K~S`;?gDK=1WW3)Fj1stQG(P`t!#^1t-EWE!uKu!;0%(tSUA zgC4eqQhz5*@fX;Vf^LrZ74Qy_Z&PHyIyxY3!NDoip;2LLyxM)QCRUTsF2q^YmdF&B z`)QG-fyV{><|?$2o&VO>b=Mr&?Dx`-V18ms|GKkMw-~RuXJm zCnMk#i)c{HKDPpQ3)dLsYYOsfjB&m^`j>dptAb$f#iz at KSje(HCDc>9bsb?I_eizl~gV&}!+B{2{l{e;uCTpjXgC;X at IRJD|O|g1=ybFz(M;F`(ZTm7Z z^p_oeX2y%xo5LscRlf1Qq6!kM#XEjh&IvybukQP?86yXi zfNu-oRxmEuxDUZpv=ZHkcexDcu&z9;%lqYDySl3C99q z#w78irA3FiZ%WXZVQQzshCNvkq8MKGERw=m&@w*ZLI|s>JlWE&0Jpv{Sf^`=Aoldg zGm!FVyQ8~1sc}W|-6eE`d7u zc)x$Xxw$xH8oKTOD0KucmMqK)SGFjEruqYr^X1PjzHaAUS&LSL*SF6sccyfJH^(^fYJ`0WCappLrFCp;u zeBG(qF^OYYY8-hKpsz6Ehbp<(`XYnr7#IMY;6zlJ;RxxY5}SP#n?q?v9n&VpIoFWo!PGa!%KK`EQYodNVG-&J zqtzgQUbG2wm>WIu+;qNC40;Qy6`c0YDUHU5y04Cdb*_Wqwq_|N=mtFWMm>UX(4 z(LwFJPa}_Hjw^Nn5eX9x5?BD5LL}aka%rY2WBn=|E-+j>a`l5TBJmki_TJ!`Bl^S+ z)F%V1ivAbhNz;?(PiOlXzO7Pw0)7xmBmM{g#4sais3DUs#$b4KP#e)+2|#L92}>$^ zye-rby48ddQ^pV^iE48M4_bwJ9y7^7V}LI-8E3V{Qsczs3QMHrUe#c(xsQWx+QEjz zLC@}O-DDS%p1?>lb-JQD>U+L*Y5U+Al$`xZo%w(#KUZ~Rgo5+aww$R^VA{bb**2do0md>SI76Rw~t z9Ehhb-Fm^dN7gAXDuo&SZBvuxy6m3b+0koalUF?JcZBs8c|nurHoB9BRk)L{^AUIn zBbJZvk^)cm^Iu+)hYcug5V@>k{ia{Ry_9vTttc&qT=>limX{1%XwYQf6!B^fsH3PZ zyYYbsr>YLfrKm1KrejwvU}Y79RSX)a(4}ZoyMCG#{Ll!fyhByN4S`&|FfywOe3SrS z5l4jUX?))2Cn_xQ!BiaAl$PlkkY6)b-R}(N(1LQ+39(%yFY3eeq^_3^XXS9%9kvcp z-1dI?<^g9^A_lsIu}n%Ei(v>VsQpNh<-6lE;ZC(W+~9)Tbkw;<5jFH#HHo;4am-Y%}r8--$gK8-F_;CFX~u**r$-j59)WTvA6v{2bIdE&j0oP*NEm{ z`w;(n{)5^YIvOYvxL*(gLCiUyYs6NT6s4yysK?W}iw#Zql5VVz3nf%NI9L*FDB$xz8QjV;m}lZ_HiMsx=i8 at SCaqlk`-+hR*fRTmWXCig>=CdycNPtJJVnfj(2tkqS(>rLJW2kV=x z(3L$GrhaFI!-6k(geVy-yU~ids-KEyab%mUGB((yezANz9xH{joZcm|Bbuys z6j;fm)IjxBu4k=>XBQcG0MHq4K7vPF0E?}B9GsKClIp94ma$jr#u3dcQmCQWR^G)D zc{%DIi7||mayGR{zlYbc6WP?#*h)HBrceDIZQf5{hV!r`eAk$0hzsY)b{f(Qsf*y*~XyJqjP1nOuJ#4!PAA+ zJFF7kcBVVj07A|>)+*ISFUjB4Rhp=#LXp+DBXt6j4Jqft`lUxjapF|4H5xz5T(Zkf zB^hbd5bJ99do(8e1ZS{2+0;b(peNSJ5F*B)Hz%>7{s_qBbI-6lGyNXPnGX#mO6Uc8RLRlxrbU8|J`U{(gJCT8tMHUUe7f1_ z#8~~guxzr4&H7z)-K#fNT0-hv)B-?7M=uV*hob-;x!Zw7xCa@!H?8tfY at yo5)(Ea9 zzjeAKF9R3$1AQy__ac!j7#e^-7UqNNm z-iX<@J&p2usK#Lys*_o(r2GRui~LMHbVuL#dMw;lF5qS8)wa_8*{$?oY^n>WeAG+Y&jEK*TS*jG&LXKLzaSFwq;t`a* zI5hYo(Y^rK#!t$+UjX at H!Aag0(WE at +L}YRF1()TcZ@$=1iQ?Z#R!8XbGh&PwIwL{P zvG;8N1hbyVME$4~*F?KQ!W-BK$geA2vs4X~qLGTu#Vq;q1l5?+aN`C at TI7$C^h6Um z$>3LrMK+1 at HO4%hd(cU~iGr(GuV4#}_j7V6t1k#tw88R72iM4FmWf}tLt~RePy%~| z{Wj1%^HLy1CU5o at d9{vM_9699Yo*q&SoN#{t`{;E^!B#B$loOlc*)j~<>&q9|AucDoda7X%2%{!c2=`p>43f4=?mE~<{g zUu`dWosQxfWg30pDCK%p!y74*5iluPLOC|{aC at _k?BxCnn+BeZQ-+(R$;JqBX9mkj=M>l4%j3r#1`x+?3~`+0Tf1s-(4^Q at -q~(skQSr{GzlJ7 z_z9Rc$suwzAb)-p-FJ^n96X1>N+5!`Jf^kA%P9yp73zg2GN>~+V||@y*g12m6WNW_ zuqwaFhP=BadRdHTSGFDLm3S33q2W!4*}O&d{97zAjg-xR{^U+#HfcOkzuuCzI88vf zF%}BUAjyFEAcD6(2cR>+grr-)3?W_HZj>Ck2djXa4(lO>q4Le8Vlcc`8?}ewpv}wK zG2yz+jg;DX^KGhen6F+(y~xzET04v4*R`a3o|~ zm8(UtQvNZpn!hu6y~gfVk~nQU<$ih;h`3%`8Bg2sKKHTKTdh2FHOVPLesTqbuzNS; zh3zjKNZ8=!uTrtG<#T%_KFKxo`g?rwL at gexS&=ly&jmA!A5w^jX4Wwu5MeAIY+`L6 zSFtZ!V|T{DCW9&CHW5mr&{9d%OIz!0%lA}&@>iNZa=-iyvRg); zRXKkk8wv#kr1&3&>^~c{|3K=Ro24xsh#Hd8T!n3W6YyV* z6oMJKr#R14ZX6k34c6n7$!0BM0}*=-^-GN^M8i>b2cri*Xtwt$C0+-^Z<6tMY+1TI zDRcz5&bn2?tOlhWVpC-2__obbsu7*Va>!E=8i%GU-NG6pA5YVUyqxVCf4+9}X33nx zRwxNTJ+p=t#FVE>hUS`=D5YNYDaBmdDsIk9&SRs6>=tr at lEu1r@KtY*ah7h#=^>=u z_7iDIs;i5nO0a$VYA==wXT*!pR8y;c6~~xNF at Pey;Ifq*#Vk%RUIx_`8SEh5#j|0h zL<;j#jQ>39S1;+JLLI|P&KJUo^zwNq>!2%<&ojYBv!b at ikF`)mYafCH)g8prL2Rf(-IRt*BQ?8?p6MkzsbADA!X$^@ zitL at hBO>`zPS}=H$T_)gPlLS9mYZVYqkIDgNs|&DE`T~;#&KV-3)Bud%(Kt9?3Ukc z3P6Ux6yNr~{mgLkAodqPAL(CsAh=MdAvub;Z0GmCPlSRU)l#v=b?i|YEREwy77rb5 zw3)s+nvfGI5bexUs2YwxV(M}cg4n;u2em2HQQ`~}N(IFnV3Y`kqW3ifCMZ-J{-jWpOSf-09>kiYZOEDBbd-`_ zWKc8MQ*6NjZH3b-%Qoi7HMRrEck;kYG}R%>RG^paC+aAe3ta at MHI;Z|J at 24#;K#yw zZUpD<-|obaV{LEeg8>1>1ODB`-2W37{xPMi?)^vKqkh4Gv1?&?t`&qwMxt7fbxG^w zQ-YPPqFNMc3U1J6T55Kz#dJ0b?(7ui=KEU^%&E-$f;Y$AZ>S$pC{)n-t&u5cFz99_hE;wd<326Kb=x6Y>N zY^qIWCzZ?-?mF6K>8-qj2-~Vdsurz=7r9 zIE8a;Qlm#=s^=&@G*+zbbIqh}Le|!8a3v1$;FjLPF4!!u?RrVNp#?6cu5oyA7Oi1( ziCiYb+Y8<0_DU;lflCpdNb9o8O7dGgCdx+1D5Ed(bbi=cBy at F+eeJ4`l!FFFi7`tV z>>C8b7~62jV|AF8SsoQ3xD)!N&b1m~ZOEvcpq178In`Z7EGc;{6zN?FJ=%tak7g`=sWXFGVV z>Bo at MVoy7x!bzoP(k-fkVwp)h*IQuuRbghkfh1(B*!-}>C|S!$deSyq%Bm}o8(P^` zvIp^6F0P=2UkHe21P51OZA<@l8cF_`Wv{JuX?0DA`i$+yRBnjyh8ndk2iKUMuwjq2 zY7BQ}q}=b0y*>Db&7UmM>L at XowOJx~)A8_nZ1t>P at RheG@jf)GUhiUR9fp%E6*T%& zE!4X-Tt{s*_e;PFRm6O_*s0J&GN%p%%PzNu at wB~7w~-IuMNE2GKl93zlJ9hU)vZ0J z`YcP8jEg={A|97#o(Z(Thk%$g6didy{UvZX?SYqTz6t|o^C$BrZrNqqk{svMQaO}A z6`%gNfY-jhU>pXP4)dK)cdS@J_*F#UY^nBbBxtImETRf1;PaotPA?j8kkUj6VCkX|K7iFl zy;XZ2;(d6NzX*3T$Z at SK@>7tqVkza#;j-M;V67+JKd}?8DyRf>6u#QaKBL%bB9ai at l4{nC|mAzc}6193MfjbpY(X# zB3Ro9R0v8{>w(OHyOrUnltof>!BpuZONyi1CSDX+B{qvOI2?Am?Y9_h35nrz7MgE` z(I@)kFcZS*+(IE1l;n5H#bj%*)b4(e#pr<9D-uc at k$ z=1`xi;hREZ9zG`)aiL0 at gq4u9F}eM%m1KB(gY`q)owk)6Re?;!yj%mli-OfpXM4{r zUwy0TqoDcMJdPTD*KIOU=9Ik_PwJj_mr;7a)wMLYYp8m*XRS>;PU=-Sydh4Aj+)NU zr=?KiH0LI?8J3rVV!Vv4qU-fk{#vGN=|FYf at q%}Sr*h^|^Vw8+ at l0ZB z`md$;hVDbCIWJ5C3>p?d)sn}q>ILqOV+$TO&0xDkO6;hV?tZY}axR$hHhfi6?A`t# z{&M|yF*GfRgJfz~(z+s&kh$6WJOv5ebU#CgU at TNKC|^MJC`Smr at Y)0C^m4W=-dbJC zG+ig|?0flF>L8=>5*6zmOcke1+ zh3afDY#UT4k`YPpe#BBgfBqg&LfjB0eL~E{D(r;9u2Z@|48%)IJM6@%IV-*(5;)u_ zOila}!k>IDg;jb%&O`iFL403`Bt8o9gtYZh`F at n(gk~(vQ!}3RdzMlDQE?pdhbZq% zuP~KsMS`z|w?!gpiR3(O#5Sc=6lt}R)H{*^?4)bt#FU?8AOkbl<}{a++Qw&J8Ts1Rb+xb?J1jQy}R z{P?gC7y}X$On{&uBV_-E30^96CjMH+^r+`G=sRV-Ib7sE5%;W%#)68TUakEM1CYEU zrXjHZ12RoCVPjUf at PrJM!+e?UK zp~E=tX((9IU=v&0gJA^yC6RZJQh8YOCy66N$68fkxQ+mXk at o;+zU*W5~AOnO5L^lk3%7TIx}rJ&e+vQwsZCGYXwt at Bh||F(gzQ`fH7A z4CMd17xRy}rs`y9=WO|ZJc5eVcK#GIh at UM@?nk_N#AV+>s4cvqRwfY8tbkt<1hIW7 z6Q4c!*dOY;Nmlp5nOx?`fPTtJS%`bc2eZG(cA%0`C zPPrs8vgrzIM at C0#p*dq8*XIfKi+CO`XiP~P#;TYC at Xcdu+}iz`KBG?T zm?zTYl%A7p1vx-r_}KQF4Fog!#$)5L$uz9~?uO4o!WQ?nggQ$@6Svn~sfa|}q7!$` zUTmZ(M57#k=y)o&VJ7#>Sj|GvbH3I3(N zWKWvZ#6BKfOtb|iMkla}tAV)5YGjc|G#a~OJ07jyG!Z5nxTheu2>%SbX178#X-2M; zR5%6ExG5IXc!5n+fW)l}^8 at Ip_y#=zrHpMzAf*5HD}OQHdrs^Y$Ft}EA?=-`d+D}q z(X80EZQHhO+csBLl3#4wwv!dE*tTukdEdsl at 9ceFdu^Y4TeWIc^;cD^>T}c>qxab- z%0p~iA0c5jGR_dB6{sdf;u_orER#561XBba1)uymop5KiX7Z%If<=(AS(Ef>R^EHt zsoju>ce7BQae;iEaRXGKET>lO3is})}=1nK+V6hiA9gZ%Y>yZZ4T+XDRCnE5AdnH((#4a@`^ zV(@{32WGMRL$|F3Hb+qOPe|JhXfwd6sAa~THwy+~Cx0M}$Ag^I3jyCCr}iC0FkA^h zDgc1c%&esCgM^sT0?3 zm6I>3H?hb;UL?HbPf7zr7FN69s;du=#4GyxQ&#E~KMliVic)@yW2pRSy{T?t9dMgT zUKdh$5+qNB_0ydV__wx*E}LEn;_P=67M8SZ zYk~~{jDn^CB-fl91IgLgVbeg3E$g#n<;g=QvZO4g5CyHOQ}vU)PX}9Cnx$oCv}p-R zEf?Mj#?|z;e(NqmEIYTmwyPWX-Yp)se!DQI%L- at i^nWaOJ@@oDTnFR^Y`tE`27u=w znGmrW2}&>rgJEh$Rbws~h1MYsn=+HiSu?2<(~(GIM1{eRuZa-JH!@G2I+`V<9_|)=67cco1qB~?LxoI8zT=@*wVh#7-w9UsGQMOgxr&s$Na;Y at UV zrXzVb#Hs5=`lT*&O#OK(k}DQ=sic^Egw>W$JvPg{Txl2jQG>TsXGu|dWe;Z-|0WXL z!!bYINX>0K9C1AFr{1!DA>&jWp*gug#9}kPVF23}#D2*-Nzh!kl&ge43xQ<@;2UX} z!7a}X8inUM){gOO{l;6V{0xtK-JbZF3(+3X?lUf zZFk(+U!Qpl?hI`?XsQbxgFSYSUfMI$6ityn05l3z8UG zO=Dclm)wwGE}d at 47hebXl%=(_0ECLI-yH4L$=Z-KGShH1F&Z7Y at S4?UpHJ|_T#~A} zGp+uj2gz20Sp?-Y>(x0d&##f?&#YUsm8v~UC|V_kmbKP)yKGv#!fkb7SFm$B$)xgU z!Qz&b95>ZAs$d1QTWkHsGmD#ZtDE>esRTbe_x;>OHmkGW*Y at c)t7X3$ zvczuK21ABSOhYTk^fuoSa23zIkN@5(Mim|6yCMgv8%siKo0vW+bbs5G z=bnOnvZtrRCv!-cqc^5MPWBMy;j{V9#pdc3wdkE9uDigo<*GAeLERGF&xX2Wl6AppnUZ z&?*&=%OjLlwWYTJpTF$b>?K~2_+qL{#UJUkNLyE(d6fGHqG~NRPBk!;@{S9vt53-* zCe{kGN(|?VQPkym;F at V5?Km1asNxJ4RL(?F{5dhB?T%1PQkJ2o>aeqQ2%KX71yoSh zOU|#yQJB-cDPP;NE6|qO0q{WP2e=a=#tGNHy%!BLQ*Abp>wo_8!+KvjK?5B!tb at 5- zQKCIOJ#>D<47IM^x^v zIVE-sQ_d~o=_(sE8Y39=PFwHv)Gv(P4^C9%Oeln4kU@*e+=Z25-;+A=JtJXe~>LpW? zaSSXN9{^dB27t^d_dPdK{>6%~-ZiX`PdC;~)=d>Hls!36u`0*Q9vN=^fJ#5PJ(4=W$VLY^JVs3KJ==n++9mtl zewM;im7L8KJX~jw+v+W3>6wXCaSPmaAT|vr?pTg7jV*A+vgaC(fA;X_pq>0p_4;*V zf(DLva?=7U at fflHo)(h9 at slj&XX@!AO{aFP at -yxIGn;je*?~TTBZ126R^?0yv?T(@ zO!s-AoVQW3DxT#n|+2r4o=U=-*@`vX6=1z z?#WUf(T4t_*-(8iP;BIkKXcK6w$wlwwSYz}iXap_5=SY3YT0!A0Xe5kc!S(fus=3R zYW6|Tyerw+qezHpj+qV`nIfQ9?Qhf(&}&TWgv$M;%U63Ijuo$>E5w~_m_lZ)P?eS9 zTSrM8)Q1kBd;>A*Z-_kedsp!FEq77}o at t~zMcDnLn_uAO_ghV`JgRzojt}2JY(L^P z?)1pVb1jegIs*mf$9yn{4WMZg2y%I_ at RU;Buu#r~1ms#&4%?laNc`5f^B8#rX> zmklE6HHsaa(s at bzc&1;#oR?JzJ>}HV_LQVrcziG5FwDHH*$1KIB&!_?^4DLa61v0d zGNGrc3V3?AsU8v3>jRXZ{G`7k8?G_9+A0+VU-+N#cy~am?+e8`b%qd4Mk?%6+mQJ8 z)fY#Yf;6;szVuAHrdsuf-f5Mg9^ReN-+7W!&1f}sMpfg4HX?YaniDwry`RUv|C^45 z?XR at O*ns?(?O!EN at Lwg5-v4k${lB|6d;3s(OE;cKASGip{`8%LsmksoO?2 z5MiU(i3~`?)eDgn?d`krSV6QlPP(H%8d&XV_%iap7e;xs7Pp|o+U=NKZLmD&xExPS ze!P8tLi}W_8bbW at h-puV^kQW at 67Y&Q&g`Ik|(VFz2~-fuJs&8F)1 zvAbqh%Uav*``|hC8tMyu^{RR|$1g1Y7{b=aGd+Wcp^;1ov%}d2xbw_O5=z zHMO!BILUEJdGP2jRpa&AuCK{eKxE}h zzN=yqu5&3n2ywK_^5X4Q#iTcmAv#;bLy=fQk>EAZ&b_P*Rx)W$;D-MK}(Wht~M2B88cp1^8ba zz23B}(`k(HF@}Q!b{j@@Z at zdaCSl;?WB?5d)~1J1*og_oEZ8Bo*>S}^IHRr`(D)>? zO0yC?Qil%jbq`#?q3QKL0Taa#vR at 6-o7d?v)SD2y_!i<26L1i=Z_E=)u<9s$e71A| zm`ts2|BM1`0N^&h&PaBSTL^unsEYShfk{liGd<`&?MI)Uib=~k?G`_d!?{5btanDr z8~AS2h2-D-C+$XO5q;66(iDDV-j(YVgZy at Qc_&+&6Z*-3JE{C2%B z6_;?B?R)~R0k|VAYs1QzG6dTh?SjhU%nJM~%-hJu;@kg%Im}-fy1 at Sp%>T(5Zv0|03=EY1jW{S$P>iC$G~uO@&T8O`CC>XM~}+FM?Oh2Nvn! zo2!k%DR)ogP=!+jKzofpwHW|^AM%8v6hgZ=-L>SFxq8XUob`F~8}waXoS|k0Qv at Me ziqaGCqoIirDyU8Reg=WR#*_1m8-|kU7jItxqlj-^B)Q18Fa6 zd9 at TOmpiec@A2{voA&gQsc!YSIl|Y5)zX$)&`_yr%zedGRu>ZJb{kx@~tb at IUoRQ=Is@#+QKFbvFJvmx$vzC;g z7;}giktmow0WQFPNC^=@CrywXtlL^Ux&pRnpjOH0Zi2R&|;!% zx1d4@)sl32bneF;TaP!lxeV~}_{LjHcDqd7tXXE?vGB+LDU6CAm>grA*=?{9hevkB9Asn*Hd at 5oZQ?2IyF)oy z8H{^VL`d#Bi1xPhAbSRhRo~8pZ4-@!CxC3kk{oZ;tx{mA$+8Y(8{xc-xWkx3S-v9 z3=z{U^kLeiBFfU4<1xn{nDD&>KCK<`#U-Ja7?@)uCkHISZ4^C!ue=g<)QMc^Fm>QH zE?QqgG+>NG_eYXAJ~HSI+HFYnF1FpmUd^$Epdr(AZVv~Iyd#>?iouX3lYsk!{3|*q zQMt58V1R%oaR1{)+W$K`|AEae4J%i*MYJ#ZEyw!=oL at hFAte*4B%~s$3bW=L{>%$R zTrgx^I6dl;xf{XR!x3z%*1puWs1RS%Zcc`u`6UgcBy%okV?$BhqF33k?dI10*3oYr zAlc(`HR)xd9<*p)z2UQk^|ZD9*Y>`#yybHx26Vjdfo3^aN^^tdyVQFOe6xEG-mUl} zHtS(G^3JK%cZ1~kip|jgjM}Lu%d6L8>@!gXVeFCb?w0KJo~V6)SDN?Ntu${$SMm#U zH!*<$+l?mK*$vyP=SD9I8Yhmz*rq{hXb%yA!su|fv at eQJvDkJ(A3v^ti>{Qv`bT3CCd z5YccOl9AlC@|?=WiYfyiKLe2Kmv%*sIjvR1Xj8&4%E$Ly3>S{Z*ZJ6~Tnhf>>3@>$>%SkB2bpY-w`L4%j^Qml5ZgwI+=(b|jh{X-1 zc#^|Qz*11_s3qn8D0fOL1e$ptZ*v$=*U8Zwv!YhoZ;UJ|`Lq^U&JrVWGi5XXi4>7{ zQXNZ#^OZVXjOW}Z*uSdrd{MTNa9g2IgVNl+IcRGMPR1$DyAx&QH56kZO^6fNf1-ab zWw4c)Px(pYR?)QxDjUd`Sn)XFtuqapm0shR#vW_NxqsY9gI&xJfhmmr?nx~r@%lTv zbrmIcebh~fCb=Pf$mK4UR=MLOtYL&WaFr{P&x%K?hpc@`_iSR}!YYei0UVXXBs|-7 z3f4kUcm2Zj7r-0);5S8bcsWzo;ri*zE$or1(H~u9P7bxvD%Xb2@$$}OQmM6w0hLVB zR%vDj92!Gv=g8`+6Qc*>@~ah1 at 7A|TF#}3#9Vu|`>=OkFl3SzSPIH)KBk9Q%Sgkpi zdLmS48YEV+V%3O;Q*>g*(aKMBaGd*Ha z8opfIcV5(o^f56oeVY(&u#*bzZ)Oa(CL2XG#qXP;uPHh$WbE1Bn at R2;-3r at jx5x2P z9iAD-8ZW#iDxT2=!y~&9wTXP8-cTDy2J2jZM?_=Rs-M$TE`aOQZU_*+n6We<-b{^m zvz99Fq#hJ<=oe3az(`&Zkb}ZdIJZ1yttBpCqLI=LeK!k#X5;iyPsWfe$*ZWdmhq?B zQ?=M~Z!YECQ&&!}k1nRMmAj>#_Z*OZT;)&+=BUwsbt7BtXgR&Lh*>Azrt~m4vbr4zSShgU9F+7p+0*YT(1Av{s_Cf#et?2 ziKf*=Y!m$ajhLJCS{YD#0HKgxCFiR at k&e_o{*trm3R*zriE2i%!v%XyH03q(=NPs- zkg(HIoK1UX)S!6^tEx`|h|SrxW=cn=aG8GLjX_8dT}HQTvmM3(%y#IW&pJ at 4EtdQ~=j$Murkyq2u4dT$_Zl(gal4e#e;3o|@`^=Ya z<>6Yfw_SA08*_|z-K<(?qytq~&8e1W5K0+m;Mn9Og%Rk}AIqGdUV at oQ`2#f;a2M+2 z3p^0b`)74fU8wd2(3!Ktn_4DkO)!TwbZcqjT)%~JT-c(MJEBVr2SFcciby)n*PTxS9yS*zn z%kG!ntfQeOutR&6IP0z#DzRsz0id?cYPOMV7rQb}AS^rLwEgaP7HL4lu>J5EJmNhY zpg24sGK)}gq`0~61#k3>@V;EkTD7L71Osf=W8Mub?!eP z!p{)-9$5JvVEGN$>Y3e*>lDD*ka+{n=_p_dYm;ZL^7_Z>D>+a_qhg>`nv%@rj#0k(2oSYnH)G)-A;o?-;0X=)m(2m)q{lR}c z8s13ZI0ZV at WxieB3XQXilNQTC^-dR35I%QoLO(7XR!P2Yl7<`ifY!sWH`+^aRl}QE#JC166U^EzgO{7 z3WO8k(Dy6H{3}rJH5PU`*J_MM^H)!uM32m3z+&E!aSn7eYlEDK)%;~eeVJaf6{Vfn zDy~sBD)iXBz2K4z358-U at f?mTNds>gaf22;I}hi(w!WAhjFPmsdU*&sR5b1c;E1*a z`-UScsAs+*fYI)IG;^rO)99sDd_hun&K$vmPL*>^vLl(=Fv0j-FDWrBOHXG5{K^nT zwzn+ufM_g9NDIGh;7`L2<`l|_jZ^(XbK8Y+#iWLmxn9Hd0?&QpVuQH1 at C`BvuO?-u zCi%zOT1b?dESV at 96p39@yyn%K=FkJSnJcbx`qUDb!H-X${9 at k$_Q at E^t=1B1(Py)9i3^doKH77P) z?-_TNiaR)0XgNZyp(iq-9)U;O=xiLHtyMS{T_`$oEy01Tvk__7D;GQT308pdu?#q% zgtElA>sUbR&T(j0zXEM9S9CXtSv?dpPqhjE7@?zM(xh~HWhJ|slXBDQ9yqc!=5)IJ zNyJ at Bm7Kd%d}&JsyOLog75tIov3gUpo)6BSq at E*JMZO1ULsIJ#j>ha$MiOp>WcfpE ziNaGSE$S2!mTyqx%22TfwtXsSr at 7-!rd_ehoaZwusKkIhqX_}+jpRtfe^ekK8jkGe z(>1_UN~I~IJASZo!;HiC?$Whadw(C)*NBkp_T}B~q at F@9zuAW8?*u_Jk*!I4HOGkV zqShDpSf_`xT@&qaZ00D4wOM26>0;PqgL&!2$p7Ot+cOhp-ws3ELkZC@=aXCY at j~*0 z&V)S%>+WrbwKU!S#T4rK>e*C?i)mj@=B9+~YS8u;$mceQw%n&qk~b>Z7+24jVJUo= zRTDd($lWGvlQs*aqRrqy+!eo=2Wj%x<&t5?eec%P=hO+jKlk`^cIOOt);H?52sMz| z2e}Vuihy8fWzRRzzh>Q$-$EGWf0Lp>{HJ{G|Jy0~S7A!h-*w!>-ykp{m(Y-5#Gbna zEoz$Ma>bH at kWf-V;cBwJIxUIJZP{!cjW5N%GZ+pCLly!_w-YVGm-Hn!&hAqOS=%4S zS&jGS&(8!v5thdC> zGrHwa>?ALcg2&tIlI zC?UHa;PSK_k7Rs)?1Xhh$g|V$FAKpbt51_R(#$Fcxdfd$Scz(q5Sg=G%CV8Rj;|sD8ji zF^LeRAHL;CJX(d at qec;J*O$c@{$nLC$A^ z`H%3gYGr38Yh`EU`d>2`q7~&7fSC~e)J%T}2y%Hp{)E`{L=!F$MS%+!Uy5^VV4c*S zvzxTXxUKcNfp{s5Y7`u3qhz<@zCW7m^z!@m^aFAH^*b~pR1c64KiyiN-O2cXvx!9D zV&H=E#?c>-TJs8bYMDbid5)F9UF>HRExE6WeGEaJ at GRbbWaJMn(q1auuZJxI$V1CI z;<^+^JQ&apZq}edj?AZSTk<=^XW1x;3C14B;SoI$q0 at lJr+rjzPlJ3tNMZ{QMX427zNIrQ-JZt4Lg*Qh z2sE)TB&ZgQVCOPGezm)1iN at SjnfXj6TgB$)V4cC7oF_)W!rF{XX$KnNfsJuAz>1CW zB~enV86mUS;NidH|exQTRz`#w8Gs^r at gMW?N)qwdLK-x1um-);fjP$loi!5TQ!D?Krr-gWvECy*L zCA-2%4R-n9c_ys_kOT}uVTpXQ8e8}3hH-dxTRtz7JV$$2x}9m$@<$tty_7~pD8+2W z<}EYXP3uv*kph)mklVq{-OYE5jj`w64o#iA>Ik?r&RIk=@XFkD0k)>OtU z9tB*DKSfoLB!4{S;|Uy-!~!d0ANfjT{=wTgBx1&bxO2GRK2B9%47pJuj2>iz^Nf!7+VE7BSdfH^1E? zw>b5v@?l`6G_O{PU!+Ium+jAzJc$-0fiS+(I-g&Z5BuDC>Ku-VA3n6USb1u_&M>X% z>4_)uisancjsoOJb)}I|C?R-Fv<`)j7zqNzSMV8L`*fHE%(SeQCw+VkLe-w7fdIa3 z$Ak0eg#%PS{*6WnmO={{lEQUKy#DV9YerG7TD0$KLYlql3Tw#bJ?jDNBvTSHEwxn5 zvLeSidSDXF;`k6h*bu9bT*;Uyd!jB1NtL=tS5F7*0n2zyxMvY2?4i6+WA|8c#Kb&t zDu6D7mAOGgdrKakX$4_80-Rkkbh`JG7GSaDS9SD$eg?tkzlFy>MvnB*zd|D>_K+=Bex at I1oDt-gkYt1oF$Le-~{}*swa561(+Ic^34yUGL-AS+6iGH&5 z85_XW$UT&(5#Jvf_BBCuPfm9gBYyZ9qyaWrI2VG4H{pnf$^0R(iitM$qi!#yzYZ5N z)sRfpzRFBc^VJCzs(2I5pOjY%iA*bATT~2yPuATT*_WsS*c3jEBXHr^skrFg6hQ5! z&uOfJ=v1e%U!b{Y$WSusYQArS131VET z-3zn9q6TjnoJrM`vjB|3FJOu at j7e-FL(S({Y|2GzjCP90Y}sk4>kcD at cvo)SFHtQ) zqptCH6&kmAlbW%tDf^#sxfuo4aGCC7v*!$xvpWzK>_NY>zR+u zRq)0$u+Bo1^IJ+Q%*|~+BVV+BzAIbmPvqmo1Qp}v7^NGXt_k4x3pOIc!eo!@QZo6f z7v!_{za(4F*%>|M4p235;kgPFpL!dg6m(F_IbbI);lDYbPM&PCJ>y;A1fqIdUA7ES znOaRQg3L%j2ERK6705a-rW9no*0$Ve9Ysy**2Aetl?ZvkY6d_DVHPar8AU192yrk; zW3 at uYl6UjkbL?HucrWiUHEi~Cnqi?!K*3miK`6scs-jORIbo~f${NnS;mHu1#S_KV zpYY?8sya(8fZ`)(5ZfkY$(QjK9M_AnP?GXl1or$Zwn4T`u$%w-^_zqIr|$A<_9p)z z2mc0e2RBzSPZKl8|EB&``Ug!oUz=P4Nqkr+4TcPdx<7PG%}@qaaw{ag9ctEqw~Z{J&q_V0QT2Gc9+>`q4#Fch!Dg0`UNk zw~sZ+ic^m_vy~3#f(~c|4wBe7Q$*v87Ad+V#^v at c+qp20EhqygcqPM&+rc6vpbwhPjGvBfANGBT{PhE^L zPuJ}ALEK&Z0;Ui at aujv*)WGBxC`W1P!;- z($Ia!&tHaFT&8R5SKEA3XuBc?Z-Qi03R9ZOQlkmmANY;lQ#J-yP# z_v5R!2u3z~@eCx_?o6s$r8BTvMO0f&LN!nH=_G2pk(O at HusNkZ+m-G8*xa)#ZQkXH z8I7bI;_*?xicPwkmoS$qmV$NN2epEb0lUi`UEj+Uio;r>EntXhVv2$}4Ekx-i!hpDaex7E zS3u+{;X3al%r11)3LYRq7ygyyj|jE7&bmRJFuYZH5NPd$cTMSo;99~p`c z>-e+Bw}H^8!xf3LnawYB(I&B#S;L7SIYo6|_|uY|l-dJXsqc0xc)26&h;cjd1{c4z zJa^`uHO(vz4h#Kfz`w$IwpAHV0}cqtgBS=%@_(dK{{LTIW>C||QFRgTOTMAQ!^5Rf ziZEPv;8z%Of}k(*CaA4vauH$@C?fP(f^JI4r2Ps6LhhqdZnGE-`t2w2Ah4KCU|57U z*q{a)O}FAgg^C6Dd_YzVOLoaN*Yi}5CyWg=#Ky4!5x7QOGki{;J zK!sxmLC*l5f7GAagNtP^&1jy_Hkh7S$5sODCCj#91Oor_VeJhXgWBoO7 zwYt+9daPQpN<8IpeTplw(U7v58%$!kXc-wBU4m?Sy(BHKSMh3s{2+>)xv^K#U=>la zskf01DcOu7yPcG!R~a>SL`bE1i3wAAwYjQ5lje!@dy*@4c3fGFDrLKB9w$!GPoMb5 zw+|B_hZ0gEX&-HKHJ?^D>=>j*_Mo#1&!T2?-sYDK;$2Nid!)24fkp+p_JN#SGzJs9 zp*}KmnKR9vpA<&q^Rr10`Tc~a9+Q*4F+A!zO4|5FPIfLgjt{q52;%W34awEkDRAB= zU*Y+d51zPgmIQUcBr%StRJin6NMojL;&>QuT z3PgpaVNXwK$|W!9~3o ze#EokKBOqpqASS3HMeFm1;(!~N-IQ_s-)X{kA`!`xTOK~;b&%e+O;m|8VD3+v^KQz z=9#dhyNU!L#0(F^Ikj^Se0+y3Rr4-JwwYLLLu8Sv)}6GPX?#dfZJ0(+XNnH2qlYQo z&Y at m&hS8l>VyAz2lQyYtB*78_<1XLY3T~xwZg~-8z3}bL$VtI6pN21kOFdYOPm_O*r&X zFg+FB^oWtP$&`w3&Vfy0=;vk1`LMTUZppXiZrQhHZ!qw#_xRY+C0KvP+&e`Ay12K7 z4cvTx`eE}g+#;!u5D?r?d`kCo^Z((;%iZI{d%sQZ9hG3LjG1=&iPfEZ8PU75wT|j_ z$KWd4?;0os(Yi>MXfB*jihLU!!*HA28w=ma<*KRhm>iE@((>u)x#5JI)EiiK_15)cG=FlM%0BTqM9+p^W9k^)sThQrAmj zEYD*r$Y2TlNEtLApZhJ!xhWnpK$%(kC90&(5W3riTkzgdk!b!RIZu6OX9B~3<4_qw zfwRTYiPUjd=fZ%KTui*^>f;`(h8&(wBURZ(YZHWWqD5Usw=lNVQ$#y{eB{@=h at Uz+ zIMdMW?Dzz`q*vexV^d|5HOuO?7d0d$2aJ(|Cnq;vGMx-fm)ruK3A&6Pnh<@q(6q^W zx=M|rxee%nFw3d&aw6{TbK<5$b7-pJt!V(a@=ze;`kDxk_ z)G_qMzY{8O#wAo9Pejym#o`*v-*Ah6Zy*CeBM3c-x59C^WJLRhAT at IwL#uPlt`1rfc8KOdwV z*k;0InGFUmXdm%G2ObzBx#!ww4TG!PNR6Ep9wzfWKZNS=EWr{@`x$U+D!1W>#eejA zG{1SYIs!6CisSXub?>To$M%N;!@>n~j)26Z at W6P8MzCf0D{PceLC%w<8DvrcK=Ib9w3tqoYH7D zAY&}Akvw|p+L1 at Q{u#P?4 at 1nZ_l0cgaZ6N&t9T^)qcJ+wfXYN9UtKLgaKsxi1qbRX z`H6h=QUocsT06Hyd;=vJT5*yb)kLd(`rsIiF2H6*9X7QSx2I|D<4k|9(9UCOuBjy% zHq`{|8ILp}SLi_Tyz1bMTGvQvv^}FR_gp}=tWF>rfK{(zPDZ20#3DD1H~o4FE8yJR zUn at IRRfX(|V{g8kSE?*tF3WHT2n}y3JpYuYu||l9b{YVesh7_ps)HwU9ztaf9VHuy zIyfpkw_AQ0%R5hU!?Y_b`*gqPz(bAQ9S!qaPRUCl>O0sC^Tb2S-5p1qHT~U&%&|ir zrMiE~x`+sPpvN}D=yy-O*FyiZ;{x}*Ey7YeXb6n(#}BsXJzW&vkj^uX{vA=|(8zn7 zMARqB^E~{6^V5niKDQSSSHlG4sxMJ=O)^-n>DJtOb)<5O+;_PBB@#=faYTyMC2~FJQf^qe0T1*vN zt?Q5BQUAJZTSf+VW?z at Ej$Ej7=MM1ko8}ccrxiBDxH61sIOK9eSb~ zS49ksHQVD(b*|%Sx?@*9g;!+yRMm at L%Z_HAWoT at RSNJ*D3(mvdb_RzUEj^!#T#bIo zgX1^zI&>13Cu%6ch%)-j9S%B|N|5QwZz zhIs=WF;mreaz8Fkes|~ya=7a3h;cQ7-IJbgE!3w(K1Cf6GXRF^7~PZR98*J6I7$UtjTcufbV&R%C6rXG`yD^Sn2=; ze?l}6aRmwI8XOV52b=$cN6TU;9GnS{WRVj^WPvj at y#^Q|62!HvtB*mVhCy-Px?U<8 zVj%Ub3vI<`B}TaY!oB3i0_%uJ5pW!K2OMNiQF$;98>;8Jx9NJj?8v8Y5x)||a|<5y zA_w@^fqkvT+S=Yh^NsAPdLY=*^NoGhJbZ#i*uwDlrGvhS#td>8qz^@ip4 z?JwQ<#dQ_^dNeeh2K~FLNWiev1pbGxehliA9Q%~1cfGAn(;c+FBXuK))-(3xk2zXG zwhpbW2Gj$()w1X-fo5+vyDqiMp38shPbu6G?q`GiRk%U_&qeIQwhksXe;t+F%-sH$ z*^rLQygK5SJnb-Hgxcc=_m;){dYKo zr`53E3BpP2S)C6pPfIak|4m%ud1J?RYlnqK;`i70u>nx(ZDtJZlIuxZW=NoqZ`FPM zABm7yIe!1$eSh#p*cRp&HN#HZ4);3hxG{_zNXv75J!stW)f!(!c8{VSyDLstm(C-t zlKX)NyDvOF>pw2<$%5tPUX#ZC_t-JC32P4<#+WPcr!{DA-L64Ete%9*+UhoFG1Fd z^C&RI?qCN;AwSw}XK6!F1z&N0N(M=%L!BhIrr0`F)H0Xd-p at T!o?6mTEALo;2_6?^ zO%vdj%*iyj)rp4p9ZZ6&l!V4N&#+9{zGm* zXLeHRH%>pR)dK$e`7(HfAAj`Ap-%~ zQ2nP}NI3_4D_4hqvMt40UcS1EZeLqIjh5om4V_UFmi32vk#?(wu~7$lDfP5k;5wT6 zKN<0(518hn_*fd~2!jV#Xo(Pe5ib{3;v|d1Twb(jPIR60c%Ht1sr*IOUBH- zTg!%go-AoG6>Qz?T}|bnmY~He(F1BYH9DWZ_kOmnQ%w&!Ql!`i^2Axs-{Sfu*6b2m z3V{7nbp9n39nOT9%UJ5o1 at sZj4(@c==jH)rEBAZ5aJRw!(=Aig{x at B}lx9(6J~q8@ zQ4Noz#-|6;y+TA=*#VPNQRkG5Du1xW6x*xlQWL(}l9w+{>Xu5L-`w~LMg6Cm#PWxt_HV)G at mJM_h zQmnE?kGogZyQZ=^m*N`U9#M_zxgBI#t7`Qk=FW|5(j2m?4N?)N*ITS|XY)G_yqMuv z&CwZJ^+c@!Ya{)|syYTz8s1VK#8|~0;`V^_G4aMB*;vUN|DXL^M?T*-h zi5y#y1doxgLpSVOh50C5@*&0)FO!{w5_hnVsd{*@b{eQl&^F7H!35AYQz4&jRw{yr z5-dHiX=<*yQxqC?(_BQ9gzDFrbzZ7(*&B!543c%tZduB(Zjnufbo5g#&KO0Lz3w+= zr0G#J|5~+Hb@!fg4-GHeMxlFbns2g9kfv}p_QGU(wa8BumsOBbKDU<~;4!v#vp?Hl zKIqC1E*pF?F(4o!ht~`zW<)Mt)Xi;|y|`_v8eiJiNCt at 3f?CdwJj}OxP=Za?-S4W? z;OOJZ1AGb=xQOXeqU0m1yEZrb35j)knpSpYL&7T1+(jD=8etHc^nqxC-q1{7{t zP{!-~213f_6`gAGL^TS-0}}R*S55~r$+!B}^*{Os1orVzdIpN`%o8!bjrTNOG*DXe zmHHPHwgY89aQ+|G-YU3qZA;U2rkR@>5}cHUi8 z=iI7ux*v9Tbc8|*g&q_k&HtZcNMnAZ{b_3aYHa)Kns6W$AcJ~6< zmSUJGWVhlNeeQZA5r>wfxYb)D5yM{pu-_s3+Z=ej_CyLwIyHfOXxeg-vef8QqSkOonjHsKXPkD8bF;mRGSVA=*tH{|KC zvT>fOoIU;}>b8g!*X~5r^I|bx%6ydSFKgyJQnMH9i6L{Z=r!|P8E4WTv~AXwfPBCZ-=p?JQB$()*>bQ;nNGPtIkZpkG%AZ38W0%3G!%eI>0eUM)my6t*{S zjXalT9HkzvTtmRxVwO=wFOk}cLu|)?(LzzZykeNU5=dc3ztJq--1G_48hw}EF98bc z$jm^D%r at sFi^*XUU04ch*Par=2UP{-3QPeuq&jS8NaymFO=2ZZ<~Ps^ooC48aR&B19AEA5G8s04a^2^01Q+(-);E48 zuo^N99&_}zrG))3d2-26eFD2T7&^KtL&ie$!#&Lvo`)elDty#XOV1ra(-=c{#2 at vt z<*p+{z1X at xN-Zn!xz(b{t<|MWY*&?nm4!Owa-h6#WoTOg0?t%F**3yW%CAP+K0`L7n`dzaeuc!!XxjktKmr4YDTTP;n<$OcT zrKKVBQso3fFuh}SZp+5%+Kuf+hV8{W%LjD2C-Q`#up`{+8ac}+6$(%Oc;P?Z_?*YEwegW za>*`STsDS#n%&fo<@c;?h`z?4QQl6ly&!8>|L+X+#$nb_- zNL}ygiVxpW}-8*HYe(vX%I%=CXvs?yP(9D=RT= z%Jgw#ltwxF2{YYFo#jF at XoN)0O;Kq%jPzRT#&+GQS!l7^?38QuBkyvX-WmtW+^v2N z19erg>hgt``WMmOw^tQtPT`%coYNs^&_RNx}!y|Fbyh$ejDjD(&?i1 zM<12(7tb&M*~nzvH-ZhRk#XvgaqN-thnQqc#ah2`*fa7SRs9j^tFD;T8=#g?Y{R|D z$T%WWk*v*4fx>U{!y`Am1^);t!+L|}%w(!9gMM6Ok_K&dPoGl~-Nj7WwC_mNg$k9Pk~^MCHJZBSDGly~ zVQoK)RxbIHz8w8>%!_sS6Zj)-vqAFHZo<<`=77Kt#otKe8xp2p9vLN{1j{MWRO!|M zs&Hx*HMKJhjWbeuO;<~5!B$c5AvJo9Ok=+!*$e zV$784$yB&eTj*bCdiIj}^h99D1H**S&WD?;!B`(zrdG=4JI^)CXA9gG8bPyO<(|V>YCIhjv$Fbn at LcDYZ_UiP< zWkWC*_Qcp;zvFacEk2QFRID1u`4gXA<%fW*J5zz7yeyp6&NR7Yp0z3LqJ!O^typOgQ}J&8-VrOX6D8e~ z`_~@n*x64)9IeiEO7C3MDHVVC7`ux31P}Vgf{t03x_Ok_Z8LXdmu$i3`L!N3+_=xM3u2IPn); zNyaQh9U1P9Ug(S3Kv($fHF@{%5jcfGwHf?pjNZg(*|0#%ikVlENe8{)$5165)X9r_#yQs8Xq5e|Z3&%M&FlpOz76YE|Y?t7qeH z+w@{9t#mR!qEqsUQ`^JIrcuFk7vB%t!|2A*0N&GAu;&v3L4Kc)D(=x6-pyC+^~2pU zZUHZj57ws9pSdo+QDrDZm7A~bKbyoKNifH!#xg9N~)OzFZCINSt4<6dew|QdLZ8ioJwn64!>ho7mH>D`=gy8RCfn>7 zeq3UdKeR(VI?=TK5^*`Q#&t~PkAgh~Z^xbW!$xmp*AR at n6XM+OAOMu@cIKu`T!q at D z&OYQtSs->ae<}3t#%J-QBRfNGEit?4_t{ZbAxzT-gq{F*Y>ow zB2rBRu-JucrN#K#M^nVRgJ+n=jH(tPJ;X|BT7uOtQ4Qdjz~H>rj#EiQE5)c6fnAAH zyJMT3ne$u84horcK5$#mRG^}4 at s%(RvbU%0tPQ`FOb@!eyDp!Yv(yY=I_2K0<%<{+ z_7+3AvYOXvrt_Wuq?-(2ZZ^X0r)Je0G&mFB}!zV2FIm*M4#KN>u^xFYim zznn;p30^p48m88ThTRB%sg4XD&wyXd5DA|Zn=7AsWmElSNZ*=kcYp1a0p+qce at qC8 z07eQLTxBAG5t^lhbb>nYUAUY$R4gBVfWCbhVOW_L?XU3djH{KY^M1)(QOyqrwu6O6 z=TvYu8|4RFIF(kZx?%!`^~>mxX-*q2zb at a4=a z#*y<8-iIXBOj({U_9GBQ;JDPAvFfLqS|T)Ll}EmKLv}Ho>F=^GyuH=snDme3rpPtNv7%F^+R3o9r6w^J z7R0q%lhW*p%^xff>28) zEOZ!-v5nO;de>bqLTI-a1u^?qff`Y#4QqYYk=XI5topp>-8ANW?o-_t35gboiJWIR zMA;9>2R*`HgY{9=m04bH9J3mY?7vi53Ts_O=&tsBu#_5?#?cqTpvB?DM%1Pz_%n=# zu(=FO=YENdwP(?hW3yRRvmmgG1 at f9it(_kxcd-( zo{p#<2YEkX<0mF?Cp-srtfP;0r$?2cail^}@$}@PGUlOcyurXcOkSJNw)KV?c%1WX zl>3nGGzJ%Kx at 3jvEl@4tZMfoxZhCl&?rOG`A#N+{9}U(&jK(xc0a&_aM at HfqV?=ts z!Y#WcN6>uLrXy|ShfI3jp$t7?3_Ym~J-Hk^Lcec@=nfem{%mU+ZiR at An7CdgyV?k@ z;Jg?m-!XCEzAWaB)^B?vrDKmeh24Sh#MGI at I|bYOK|#hy{1qi`oASjCrg%7gD8&g1 zy at 4Hb#_r#wYpm6BS}n>x*-__Hrs7XLdFi%ZJqzN<@>&1EC5b3{)*ybLgO0Jt>GKr# zi(OEghKc#*NHs-DZ_pCY#Qw}YOCO$WAx7;y*rD~YbGik><=sHupak!3=FW3|$2O1C#Zr8^F zXwG#sm9TY at +`YqBicDv6+~C+bK%Ws3k2GKcH=y$uO^C8{)zGR&D_#TI3hjW;2sJ+- zsL{sRC)FqIF*{dUv59KeGX=%0;f#xH at uZir+~@wRVG%imF7>!B!8l+VMHFk&)F1)p zj^&608NnO}y{)6kp0C0diZvrGupM_Pl+uNdX=+a8(7y&4byoho5rykr>S-wj?#&t$ zoHL$qo#5<)?rS0h=Bqu*ROY{%OPSDM$PnhdQWwYvU9t+28nugJWiDYcaGJ~_ zs~0ABeBhQ(=ukCy)DUfhefPg1mTQ$vmOO-seVOc8BV#R3Wj!Dh-Bfs>ES$#;q>zKl zgi4K-CUfGpW}GWa%q83MBELiYS9uW3u2>BJC65#c5D@;q$Bh0 at I@kZG!~gGI>$$3S z|G_BsPg9S}gIrQ>D5SDZ?FG>g6-BGkj80PhR18)U#2?*Y(7hSkPJL}+`^KDg<`IzM zg(&_lQPh%Tek0q5(27o#?pLz1=s?UTMARner+7~)*{np z_-`JRjK$j at gWZ5|xcAm$Qyo5A?@Kt+7I>RY7W_%O41qsqj=XFJ6-^Rwe#(pYxZein z!bzhXRyZW%(Yyysp&ExIT$r#XYbQUWOu)ZUW_M&=wM+p{+41ZbnvXlodC?H2^}4Qp zZ^2J at TH0~@iZy%6HH(gY{%Ri5L#lE1YunC-zmYnkaxcz8#*YZ5eAM#7RI%*K^oHhQPiL#GCABiBlc zku>?>Ur7|AuydgHqx79prL7D)-{pVd9~4w0Bl{kLR8Kr z<*S}|=ajS!n?bxi+h7=rzv}a`7 at jCib|MR0QhA+5Dopmq5%CjSm!bwaE7c00GLr$# zqaOyf>x^3VnnZm~4TOQk|8{c;SOa6X$yHO zIn-PD;!=b48_?S(nBbYd at Z$KDE-aO(upuBJ{Wf2WFLZ_*+FtPrIOmf~-0G7vOWwBV z6${95Z)Dq1&)ey5PvSmW*1`dAOdCT1K49bDVg9Q=aE_?N2|z(WQXxS=c>izp at eg&V z`TU1E{?Pm3rHCMdePa()r5`OKB7%uPB=~+n3KSj+;EQXa)AtyEnmE*XRbp#EVZQ@? z1;#Xauz#mV+BEfeE at l1Mk@+^gQ at 6Vt@EvQ!8UKR0uuZ8a_WY`LX9ShWX}0eZ3{G~* z1Vsh9F~HDpqfZ1h9t)+bHT%(yancV^dTi&jD&N&QRcc^w>oS^eYKcH68dnu8sB>#; zKsDZ%hQ&becG`jlHi!Kk&3C^PpFB7C)aks8)wBp6sz&ZN)Va$n?XOqk!Q-wWVK#^DKgsXMi2)5}62}W#C5;S}d%E)DjYPC0ZHLbI)>=nk;Bz1no+6G8c?HR@!i3E|{gKjcw~kbkuBukbM;9sVWp38Me%+KLAJ*F3 zS(k+vjbtHbO%0(jy{Djh4dr8K{CUrh9+^tlwZ!qZoUmx^)W9zjl$BAXo49smexA at an-9e*|-GwlD zgQsBtTl%WY0tjHSrFK~f|ITXuU42C7{~k-qx! z#8JI_KIiSy(02?ux_#_vaWzf2Sjx-3IhCCbvBEgisgGcKPQ7cThc7L&R=ySu8XxpJ zA^LRRo7A#rM68t=3JWI4(>MdO;L=Ad^QzA8mVsXm!c at wG4ZJ@dw54`2k|K7MiN|-` zNRmpwvToa0_T45Dq;grmpQal32-DAr8Gt8Wr$G$i;Ia#TOA?*`fg%GcB??cLm?6N# z-n=mhoe-K`oaG601h*<+52*!J=@M46YlpPCIp!%qL=V1~d^qW74 z=b+qxx=_qKQW=^^zBiQuMov;Ywq}_lY}@!Q*orMM`O<-Z^*#rnfNM2N!* z4!qN7ONcTzOHw2L)*|%a-=-x;){=~jzfL`{|L)rH|3!BH5S=EpFWNHx7lqGMBQ^pm zisnE=e?+z%Q((DWFmi;ZhzJ;JPIV zlH_ZXD?2aS8(q)6H`YI2+}A?3 at xcA3y8Uhf{Qn$&hFchT-eUzW!vt$aw}B}|Uxs+n z?vx$?w6;2!BeETvxVprKH$$NI-a&SVcW%()Jt9YIg7;gA)DNFQu92E=)EfjNXtv1x zyEy~9)V5HEemm9`@F_ww?ifTO?g^m3M8ALv`63}!dP)ut(jY(}kAw$X4uyw!f`t!V zBt%Jsyh0JEFjH|5YTSiJH4q_~=u!!gpz&)(7QI>`DePygWh*-IMU>q!-yI&(2mlX~ zVZM(Lkfu4&>GVg{Ry`v3kRN75re&l?nb~eia?@w)1``YtFq?>HfB(b7YQ}Q~gG0({ zVzpJ)bq6(ora;Cny(WD`iZ(}8_0N<+1;+Tr;vH|1H zgW}Dz-P+O3Dg0>W+FsM33eoTA>NDpUN at yl;kxi}LEEA92;}d?qYDF#$9Vr5?KGMNt zav5h;f<~2%uG-lp+!SoKm{DrjyJTtsz)yy60^T}l_w!Crgb5Q4fJ5d| z8k-DpUPWRLem6*Bmsb-Yqb}xmaTYm~A~qvB!4b6DIO--P^KNWna+0 at bR-#L~bjB+;vkDGZh7ujfLBwXw1|^q4h!iitbx at nUqw8p$oMut99IQ9hgil znr%Kyq{6ikt4fBP9{-4`6lb+|OVqbDQbJ?%^9C08srE56H(ecP<~(vVrp9!0|`K32RWm0+| zi1QVV$<|Hf{QOHr5^M*3(FJ{;Gi3qs%&N$&$}WN2zB9EBje7DH(U^5!VHVyb at IKwsk`aR)trc00Jbzce1iho$=<&z`yhj9 z0x`QKQRO#N)OkflzvzRwdxT|mrj!cxdxX)2`h4(#p8u3x_K?kLl}e+#k&*f7Dg7I^ z6z&$alaNvxMx5EQS!-sm>9hx*KdLBB87_uK$^cpuiZjj_PFH{HQ;$^;qu(NSeywCC z8+DT!4_+E^;q~kaBpx*LN^uRRVaYGUaa1KNxObv%=jvBOR5#+?X|ELYM z6_f7mOZ8>2;u0rD!Vmw$wA4LRaI^!1zFEvhFLNrb!ewGd6qayD;sNUW0zLSiHB5Sh zI{U8GwgbQX8>Bn02x3=d$bOlx0c+H%=BuduBA#P8+?O~@ zdApJ$e937_P;{QaYQed}oY(iP$SZvj=pWn`BHkT*qAO*xxUdv$#Wp?8y(3}BQ~c%^ zYM$&`jflB#hSDss;GultP1k4Mjpu*virIR*KK)QH(}J9SWNKRyL-)zCU_c{uxo^eD zK*}zplyro#5+|)FtbYf0dRJa~ClI#bui%LX>pjxI^v>lgCxJv#_=U6UPlxa}NPL4# zcYmN*g>&!H(f-|!*iD!q#w2o0y+e@#W+t9wi%=P{$Uhh%cNEG_6o2J*JHABMfMNIG z1te{J_aGO%E!PWFSFYDaF>=)qyq5gNn9YP%x`BS#~N)u;5qHn2?OLMXjSGjeJ^j-!^N;Eis0TwwuK8-bF2;$XJkDrP*8cn}41l?Inv| ziDF^hE3m1?B^XJ7K6cza0h~e6n7k8~k>|S~J+F$Gyi=Mr?XFfqZ8oMMbe`m)`U}pj z#HHp-xbyf~dQKHgRxe?lhsxyaJ$gl|0u^GkmgBVvvxV30)QeB?_QCh0fPY8DT(IkN zUH_G34nl!|2>d-%jHR=gk*TNNR0jjCtyMu9;=LHnRgYiQna~KqG+UGsT@=Wk?lwW30Gaa?e_3v za5MUfgDx{zm|}4u>IxuF;g1gQOcJ!+U8O#z}ZG z?xQY94!<@do#8vh)NLelD$Qjycny}EHDu2LH+&;$=lzM}UW=~0E5WTR)ui5X==hu& zsqP_}DT at V@4HnlXc=YG|9SIv$W=y+zhy z_|f)>S9|HBQx5$5U~1zrM-=;N4R`Q@{oLp0pMJ{kn-wsOoR!{UQ3^bW6&m-vEc$T8 zs=TrA*Srw at -aTi`A_1I8+hK%a)2 at TKGWL5~#vAI$joXd5N>r62Db09oQt7O;ADueO z4Py^~= zD~=MQka&a#wQ=!W0)UF50VCi9aeZykh*J1;Ly!+10uEeyoVEktA>Kg-&@b`=KR8@; zJb+Y36}@l&6>;@oV8R#IWbC!P1sa}B*LjvrrAQ;UKZ{Jun)3 at q6aUYv zzyMKYm1{M+Tik7i4O=|gh4)auw!a-BhcQN$pw9bdJBmn at BdpF)^|1_$R~81MeQx3h zDl(crFrc68PEHWzyctI at kWJ38+zLuW&IQXFXIOEOZQ-X4qMwUr@{7A0t(R=z$Znp0g5$*ga*4%EiwP6 zaE*CEeIK(PxI4EQqQ&CF;pDDqb%jW#VPZPG!9+mZ@(9%(TV^S=DVpy*zj0=Bh^2LB zNxmcA8GC3-&XK508_B^kC}>}z9w>D0QhW=}@`^(G3gfV6<1P0J!FfxMafh#d$1nSV zR2op5Y at E{DD6UuxTI`q&!!NC5;>jNKg`-bdqtqPDrJxR2nVGj4hJ}98E)?kb^Zj3) zgbCrx0udYp3gxgI6B!oIcA0841~syRxqHSeeqbe*NfeEp`zsyL_9ZXv+p z5_hidycp!rl}ZfW&`4dGS7j)%xT-Yk5_-OH`U<-H?92P=+9I+8FDmwWRL|*3&st3f zVG>V&M^w-M(s-VRzrR?9i|fyFUrYND9j8?lnH6k{`Z!g{ICbAAZbN-ElVr6``Rq39 zv$LwiTtnV at GD#TKk8OUdr ziQBXFN;{v*>YaWVkzv3s-*7`JsG*ZcExcZuSkX0K`suKUs zme{;`C>{o(Y~gA=1vTs9)PQvUy`JS+9742SUAClVQUSlzw5oaH?)`(c+v^ znedb0d*RuhypRI^7TuBLr*Pa7%aNpB$OspjJ)NlvTbInuIhdir2{j4!u}8UWp{=nk z8^@i&(L393AyOX*nmDB`yiP|v-iTrSoZ at negl~kDkr8xpbLD$fZ!1M|GI at P@)$f!j zE{S6(ZX at KjU76#~NBQZ4uEfI6D4opWKj%lte_g*XK+p-^0nQ7_a7J;ziI0c(Jj(t- zf!i5_DP{PnTLvb}zJEUH$wPh}I>a04f$M2NM9~xVc at aOiM5##HldCk|lix90VeJR2 z_qqM9z{uBHcYn5m%P=K%+Fk2-Q6l=?qn?oBYDM_lF@^oGnZ20wDfRdje~!H)uFbC& z)?_{5m))~{>zeIr5!)jB&hP6TaO>1={RtM1?x17(m7hFgvrzXB at I+e1a9#)@@MAeS z$v;?S)*8N}Co}%EU65)1R`ftWr}=@19{uFb{(!smJ at bs6rGW(7PLUipK)$4OAKF-E zjT>uPKw_2kSC$Olusux}3ziRn-^Fj<*5KFJyucInbFE^z%o{Dt2RryD#O58n)fF$y z2Y}Sz#CRhqdTHru8~L(7lCK$VbCpJ3b0p2r&9W8JP>^O6g`tZf5A8&1kG(M; z-w?(+J?7Gpf5nqaj(%YNA^caP9V!Jh!2cDpok4s$x2L^ zk7AAGiY^9I6P7MLb}7V8a?}@x!X$%(ofE at Ochnj{hqi(yg at fD%Z$gukY9E=a$RtnK zdG}4U;9qrlwbVCo?-(qI(ZTQ-iSn)(l7Zu%u1{YIw!@6lE!j`9tH`s#u(HL at J9L~> zqr69~3Qj2uh{&TrAuToQ95SR(UmXK=f$L}HoyE>#Up!FRS>W?92TuU1HNp3AmGPEl zXv7E+LxN(JUXGLTNOr}jQu;P_r#9DCB$24~-O*W_2!n`YYd4F1Ce~uORTY at yjbaqO zT-V3y9G!a}<P4g@!0up*g|S$Rrx8s1{HTWjT2UM*tbIHoMMCt={ZVE5JBUsk!CS!`ppf z2K;FAM)i54ok!9X3 at 6_zLjX^sJyy49K)7lYQ1ev5<>tc-DOK}DU{ZA*T;8~K6ry<> zrL4-dEcwJc4_JX>Xrq6n)tY26wpGbm`Kf95E4L61Mk#MaC*`LEZ9Wou8g+f$VaHpyhh|($cLCL`xmq=Xb>Y5%hn%B4|QXe&A?`W$S#t1 zf at XMkMJn?IPL}#Oyd_B^;L3I41MorWx_FnidWGH0)GRHPHO+zuRhJG?dR7qqoch3LxrR zRup}|SuIB_DQa7`^!(BvyfDY~;Eb}fYhhgZ0<(ArvVMZ9!CL2 at Ke_~{mYv#j1pPoU zhBR-#Ipv=9yY8 at X_&_^McPkQBu~Mw6jDPjVTrI>ba at Ca8V~ zZH_iY^Q!tRm`uwsc}{CLciZvH9~fA*2GIk5#YC2;=%^;f+1NNX%*1G;g0V_A=7x at O z4}%8|3uDjJ{QIGHZ-i^rZ?tC`X;$};)2nhXTV2}2wr8(%;8{hbN}~k36V53WlkQJS zKc??~o)(&SP$`yo)n+G>M=;sZ7WYiF{;F&?D_^!M>o{4NMXOX2bj zz86!KwSgzB_o~Ic-ek_FrHTTcE3ULX4(w4lqe#3L at WI*(z#;h0Js9ncEOr-;bbNr{ z(+YxuT$#jJf!SKKTtKLiLLr0eE}O_=xe1cJ#7Oh7D6t^r7PWxIyrjj*d8~tdM;(lfVg at v86$z08=?*UE4e&jog15zG}QS~&rkG{+%~5{sxXeh`GnlzE8Pp_egrg| zP=zTP6Wclnp>O0j#M5b(;18Imwa|JyOsSWhx81LOeIOyJYfFY3k`-eIeK0{nQhV3t zsGe^rsJJUNxAqdK%KMOmi=(TwoC_e2?T0%DwMH8qQAC?-j#vKD%thw8!Bx>tDm$aK zZajEtbnM-cp#XopC8SY*cYtu>M1vIp1xW;mgopZ#rc zJ~ppBsvlH at 8xEH3(LOl6gD*JG`|#j`maoV!=pRFl{-_?KOpo_U8wvB;;VI at QP4}%s ztD7 at U3dIz9LMH%fljvUUECI&HOVl_)rFuF5Xyg-TwRLBd@=9?TI5DH+MyZ`Cc$k%o zv3sjSTJJm|=o^3KlkwDGck-Kmil=ax-xAM4DcQ)I~_HEtB< z?)Qp=Cw->1zr*JCw$61g7?+fH*z>56p1iZlf4?xl*&{(AS;=cw3vDf(D=Rv^p#<4VX{Pdr8YhfU)j=0b(}#|R!JIHd{*R1Rz|F5#Nm1L5v4kH7*o zFadSu7kjU3$My5OJ~JNIH`=T*P^J{$sFNeu<|)3gMlkW|H8>?pz2K~00f5$@KziaN zJ}kD)^m?-}9Yko5Eg~{d{ESig_GZ8M+t0wuyuxsnRbWDutyCsSl_p}U7NS}`0fnn{ zG4Z7e8^cw0asbi2Po|^{Q#%&daulp^*(i;8aR|vTsMy>-DH`%$4nQocV6#ui^m!q8 z_KoJ48pOne-n>I}K)7WxY}))=#05QLy&Yg_^9zrcL{rI(6OHC3;r*pP1m!`0VibC- z?8j^7%wD?MMDgTAv6V#`XqHt>TI&2jV&Llv^MVl_S$E+eOXtc3({==cjtN)D9TG!} z`ii7n`wKZ9c0gd0T8tLx2-?J{qW~KL0zy8RSCD;FpN7=^DvwWEg9~<@V1MoC+7nz? zJ`v5aSrx+&T-Y at FhT9z*Ydg{sDi_XH3)HqEu7k+eJ^a_#zjfqMu+FSc{SE>G|F_xT z|BHYBvk{=uf3`)(u&i5xiO^n(B2u at Fb}qadR)<2dsf0(dvi9uOUu|^UCin0W{R40i zc*DGfE{dGj2uN|d)*e!((>^5kaA{(F at Y|i9xoW#16a>}m3l6e at Sa5>d^TumxNA5N| zh#UywoL}voOut--J7EwhBqR6Gz?*z%A7#1 at jU?|VO;K5Q?NGDO zoK0z~)|-56ag^1O+Vs$4Xju=Qu$XMM&Vnz&K`3)wrYOj)$h+h2Yd&zd(ozMqc;eQ)z?5hDgF at l)6+G8GfY(qo=G!!ikG5HN-itr{~pHylQaIWgggS*Y|{0{9Izq(Q@ z(eN8J%9wVYwQu!_G&fg2?UfXOA$-5e|+!UOci(m>tWT^#k{b*1U#Y+o6QB zJ$hzt$1IJXa|xwWBuao(?F?1AN2w8x*@s)di%V at Xot@|Zp&xUWq)Ir)&Ma#4!}=N& zpzrE5b4BVb$s<4BM=GjFb~Y-i0uz}`AHm^t%Mk=C>PJPqOuSFRkQl2>hW^fm_ee0t zJPz at O{JwGan~7^d9(?EXJ{4KFUzN(1XR7lZ)fr&R*Nt6+yR`NCZ?z1{M2%cG-#|cq z|CKFp{H?M6Utl~d2YWGR=YOuePF2=(SY$%uzt$+YSd(aD<`Ce(B6TJFM&@~*0cKWE z7zN4kehp5`Ds6kjwfTjikm|Vyd0T|EDm7Ga`D19I=lPC%lymj#>+q5jB>t`-65_hO z{$d~t)`NfRp?-!b8HUu04~-&K+wbhBv7rNYske4X8ZGaU6U7CUAYi0cb>W&>^)p-q zpsf&q2Db=WG1NuJjdGGeI2<|!?<(1vGi9Y0%9(Ve(vg^eYqi at M2Ctfa`Z* z&vP at A6flmlqF6?GroYI-rwjB=RYzx2DiT^ob&gF4WGT|UiRtS-O0kNH#d~BHX;4FA zisqh>-(nc{8LH)Sw{Qua=;+KW;w^@D4j&Fy<7r>#!?+L8Y1Z(3QY!i8nLAyBTzP1& zAoWPcsY7r1bE`iU|BkUFP{O{_R64guP#UE&2tu^qm z`~Hw&5e0Vr>Z0Ium_Rfk+9^fTkvk128R%sD95!%$8CBDqdB|HJ-YkV$LGzap&-8WP zL+*|4bI#|}@81d_$!n^}!-H6=L&ucJA}EJ)8H%@(VlYFeYPP>Izb7K^V~9;JKseV zy5j^I29d^jd`x$;+Q4?pQ`|ec?0#*KosaRB8r@*klFzCc4e{1bh-ULP at L}h)GW=&h zO9q#ux+A%=6b2so`4g*+G(2Q5d!B*nb_PuS_gtn}>ASwk+>DPR3vT0SBp(is$)a!6 zV%z!^!%Sq1l=Xgl&L)g5Y6p0eSf9lil!re7l;Fp6daE%&tC{AiWtdU&Xl+ND+Hno~ z%s0isc9ocgzxbNfp&T at 2ZTM7)XrkfVJ$_ z3&7v at xAV5b;#SK^d+ii8wRiMj`-A!M#kRPpe6#}~{&XF_G$$bK+f`L at qse&P9b8u5 zM0>m)UrhpH6T^+gl~Fc}v|+TS6_Em+8LsNJ=FDg*%W>bs>y$sK_VrjglO#8ABA^4IhO)Riv1iOZf;^Jc4V` zR(Kfd3^by9&wC6!%%{ZnU=}4fvd{P;X4 at wauM`;dg`eAkeu8V81^S6=@)-7pl-K2v zO#JR$RAPZDMzp+okwGam%`1%epH8u*!1)dOuQJ1 at EE&)E%c%+fPq5AZdzt-1Un>6v z?QJuVNmr9D at r?*h6=){wyz4jv1q+b^g(iuNU%WEqoxY~a%q4%VdxS2G6bvL3Ywuz! z9HF3?B6GRncR8KPP3B$Y+zt5d84?$blZId2t~s0)jgrTs>2VvQxcO629Vhrj$j0iK zB(apm%vZw7Y!`WAdxsj>m>xrBWK_`1H+2AHqcp~1Uce&@ijWUe^5O%hb+67iydsh` z7L-k5N)qUDD*T+PjPS!Z9g(#ARNz6<;%fbk8N}B_GY=^oPhzzo&@cD1SbfAR41oix zswoM&uCu3KGzV4?h38RWL_A8#Lfu>blX+a0Xt%0+D>hTCdxo2TX&=R%@HS&6cLITf zzxxNTg|F0^U|`~0d%(@SBMIn=W%S%{2Xv_DmyXfQRvL5qEyWE3p-V)yGN!7wtxw3D zHmSp#&5pOqEuS~4J5yqzjMFg-8QZ_I)B=a$)=`@pkWJ5_Dv$KQQB6Y~2~dU7 at HRyT zs?&gi$2XW`8P#5A$)8HEvhAvKtxTh>T3ZHTgMx<0v-8!<4&VOuwbL2*GSz~EfbheE zfUx}^keNjt+>CAii9k}5aYa?b`YN?!v0 at 1;4pW8|rnOvDg(iy7tbP`1Xi>D1LH1>q zD>a%hEu~0q-7`5?-uBjQe*`BHutuaI*gl`hW!Ua`KAQpcf0;4O0-%MN%#7#q{`vfQ z6R`E?&uJO%YAxtm^lFi1zbYCf^L7N6eB^eM(zSf_DytG-`04O{u%c4$RM7Vpw)|ziq5{J|YdO6IWiqu^C9H9|)aWpPt5Ubs@$5|3pT05N?)GbJ)xV?= zm#Ye#7N*uab!ZZ7pBbnS;>~h=c}}^wCyA)?J$~sx at f{_oWHrR>2;jgIa at Z|ismvwd zUF4mZ%#AO6jW92A#HHV}iW^Cn)drt1Qw~<2O~LQ_8HM=F(9x{9l%=6t4pd7vrSpYp z)hfV1Ubp~gUxby>en;5Ry<5Y#Hi$-ApJOu0Mm33BzieuCU?L+ei9(({1uJ2MCy9t` zTVPc*usN7gLHS^o5H(nyokFf!{|^0Jr<;E5rHy#!?G$Qo6uuVL8gzCGezZ+1C|b~2 z&2)t=%~h$VUcb^SD%tF4rZhW4USuS}K7rcDaBx-|Fpi$lj?)LSRTHJ9Ry>$B3(zDJYqx_wZ7d`7)oHRDz`d9o^#+Cta>ZPB>THCjKve&isHG1GbC9e!MC zUg-C=?=zL9ocdCy253*wz)YGpWKkh0=VGEZ{6epPt}}vJtX7X{M;Q%npG~+k)=RZc z6dfm_fRfTy-0b;@PYi#>i#Y(H zXpi$Q15E1w$J#qadG at 4PqgiQH+O}=mw(VcqMx||MR at yczZQHhuN@u>+Gu`jpf8XhQ zd)Ar{=d2ayTSV;ViM``Q?B~v_$eTN(ZQCENIx8s(L37$%`HY&PtQvK}C;YWS>5;D* z`(T#=%N_+QyHBpG=`ITBqVMDGd@%@OMwCl1^8tXLaxEY+Q#~h2`hamdM4Eg=`Jw_f z%gxuzXBp8TaR#$cle;U`gP3xsjQT9`;~Hv at OK^DbiIq$UOTuL-?2HE0xt)c$jH{3a zO$4<+kf|KuJKsRsxnwtY?)CjVnw$$Qu?p at Ej-sn*b>BCu6?0j8%ZuAKvUIpzOQH5x zOiu39yz21P0^PzjrQn9}A8d#m6<||Wrf|FqPO2kO|Lh zdkL>pi1wKBqWhwIF7bGdwvDbgxhj_Ie`Cq|$tKuIywl3+m$Y4Lh-x_irwDd?+5-ed({2X at rQ#rA)nQU`B*xndZ=NY1;MBc_I*pF zdaz at i74FrMd^?E~P=`<6wt_9BBod;|bc&lu+5X*79fBb2%dGYj>jI9Z5xb}o8#6-r&UlEcvU`H)vp_%pDgPfB?kfIGpxypi_J#jv)f)awsr^&E2Bm-0 zYgjCX3=pO8MHwtab1;4wr2?nQ$QXj~?}8sM#NGT`!G at mgyRz{AC`xj>bs2(1^SUGF zc%8+4{F9TJo8Q;>4Q>Y$PgSwk2Tm6590$+c{lrk%fKah6WmjM at y!oj1Nlm~TA?;i% zkpr+H5K=}(`~^x?(>QCZox9 at 6gFxYOS%;K%ZB at WmJR2VYf1oIlHQ4oCLM?$~^4 at GT z+L`F47=L91UyBDtnI)@8a$tHj$CfVUL4@!*cIX~uUN>w0o=^_i_EGRNYpmXty zM!pDNiuvJ5w{o(!-?c-6G#tn5?duzY#dPk+5+}ys at 2D&@twVugD9S~1B2YCgb)||o zwrG$?x%<3KKh7~_H3W^fB&-tRMdlK&*}{6`D3=68XI*UOYH7J|pVf{D at 75n6zdt8j zY at CIdn>B^MJK>~o&^T$Jx_{{Ni{&zQ#=lFTM{0~G#VDrLS7<(QI_Q}|k0Yy8 z_bk#bG(?{=Iac9CumII`zL-SqnbxI>oS7I+LR|<=j1RW9N23ZgT%6HF7LAv4n>ai{ zM^=)Su8(k7wI()PDRn`-1OF9I3W`LPfq$?R009If^*^%4|G#kh&qEo1H^%?33wBj1 zy2|TfD7 at Gdebp9G0E!oj3X(!rj$Q-_3Fy2Zb(CfPXvlLj0jM=M?uH&n%PP?zqdwL+`XU<@nI{@sCD|BFM;t&QjKxyAI zeda)AuAA7>0L9>%b${21ND~-L at z(6sV+}3^eCdfY at 2y`Nu zAkJ{Mr9eUqSQ=IQ5>2N_M;}e%syuflf;Y!`r?F1~+`%vpZ7}b0pa^{~PYx_IT4C+6 z9QKJv98P|MVYCw6{q|>%;}s8Zj5U-qx~eX;PNloQj at 9LoNh@I4TdE%QaOE=v*E543 z$@QEHZ0tC$Q&&NK1-kW!1*zW&1a+*vr)bQ{Yntxabq7s~9%psosuAt>7nhjI8y1Gk zX}M)^42>7o(d3srU$JoQk#>d<#p_PQW!GP>RRaOw=IJZpp10k;gz*>PiU zyFD&jNZ6l1{UV3Fi;SMg6&lR7wtEoo6b$On!l+tr-}{;_I8uH!LhDegsV!Ixs_9-r zsBOflB at r}VWNCyf#azBrDa2r|FenZdhm&J1qGe+}j}9V4f{S-O&NtKm?VnU!WVTMhHvk17kPZUK5$)|0bNfg%fhek49AhslWX8_B)Hyw~hd z6)j81#xEy4SbVyL&GOstnyw!?Rr5A}yL%3(SS_A^PGEebIrfq#f<)dt$**L5h2BGL zhnuY`6ZTHB=I!2_svG0 at p~`ur1Tj+CH8kAaJMnvyZ-D%T9aneH=N9P0CiI<<>1FxE z?>=F*dJoO&?+7ac%7Iz|5g at CVU$8_ zgLkfB5QS7gW0X0Eb(|gP`0KZ#8pkAZYq+5qhT&q%4Qj=<*f!$eS*%up>3LjWL=c z_qiZomlQ&N=CQ?q`NdC_=v=9xEEM zR(->rhC38_lVVO<7tZKdBT`1a8Lm^TbK(I!HTj*)$BPk391x++I#ru9H99N? zMxw&wW#Cok$<{|!*nWqtH7+>M3q8lP&6OObgEPZ;=O at u0wC_F{f`yv~R${bn;WoZ! z|1ylaqfBZbAEb_Vw5#v*xKLBUl{O at C=kR9 zO2{@~&bqzYrn2s_Vr{K7Q{)%b7G-`FVxbk7GPIr?n{d4;Ge|>&D8d6f)LK9Qe-A!s zcDhKUmSx2Ms0t4Xh>)#o-L!w z1j8iu69(J9NOZoxQlN~8Nla1{bfTHbc;Sqe1TydWq1gR^^Hz9}k<=Aj)6Pfr3WVR`MMa;1W}pm(d$5%Jf$rM$Kr>3UuYtE(`Hj~h<7**^xQ$@?zU&u(C->B&Z?JUE5##zE1kY3lE}uO(srlP-o%yZKZ_G1tNsRYuDrX|S z!sh+Q`3hSNVA*csM47`foDL+j(pNlN2*_F3oqd at fK(rxi4t0z~0@!ZWH?}{%SFHT> z{r*XH-`+xx)L*-&^OZjYS%jG_r=6Nd^*OWDXXb4wsI{kL;b!DZFcDPSFD_E{CFgSK z7F`TR>T*BO`K}L0Z)n?HGf1XWPmWo|(Wo+G_rKbJ<^495;Fet(`e4KBTk!!_=@OJK zFV`So9L&<=wV)Hy2;<17bzFBi{G0m8aa=t%kGApg zP*^|te(`6GLGli4ELVf_k at 7fT#`Vd=LUM+FP at NMh=1 zjt8EM-Nc=;#=~TCc5AHPy~b~7_{3#MSDL*22az{gYxg0t4Z+8siX at qqS2rFDBBCdc_R0x5Xi9|_n3lQC}o9-3sl3) z?+iGVcCEo|Ll}Pk>{%s0YZiQ=agr>ceGuEh3eUmQS-S%{wU<+i5S-n&Ut?CAVtmdG zs0NIK?(Uyd#1MCquHX1brZ;>dzfX+nb6{?9^Gf5L8cM*({cbi?G*KpRf2Dv8HhsYs z9fndCM|CRsNf{$^3zCXg6WG!(J#}D$AXtg*F*gT0pVXD}Gc64PgXd1=k(JkYP0_&; zv*je+ad59(8b at DxAC}VI{~flnL&xPe?RNeKEk}%WwWB5!3HE at k3W`!B6GO2JPb|7~ zM;PehGeDZhLlg+MxniFv6b?1MdgDtje$~VFt2|~q?^lxQATVIRG1f6 zG#irKZg~uQI)7k`^Te$~b}ZW+6%H=lNyy85ds)E`Nz|P48-eueYIkoZbNLJv(gN~o zVgIg(m)$f3iH~t9Gz~n?kC{DxOlD}XQxh<{*oEo%*I6XqY3FEPPUPXU;j-kuHbG7f zrUoH0O6SE|P_DMOO7Gs74EZ9bbgu2n%hG1NdXMZy at YBR`Gh;d73_EP8pKgn7ANM#h_ zc0w-fHAp=fW>RE~366 at U5=O*~2_AY#S3&7OdUYDfd%T+$bc+Qka(QPMDMok!M}SsJ z3xh2=;s2h}gikOOu86+?I~8#x=}NQL%{ouacx*?M(X5b5kT195X9W6 zE0Q{+3-h6h>P!@HwX2DEct|CwQ5^jd(7ZiMtPpwQf*OEE*nxG{At=FOPeg7N=XoCA z1^BVhKVQx$l+z>63c1ZDl4f(%zv_wKWfjJ-OoKnYKj&3Bafa%asu2md_|CHn!f z&m;(;gq=^l??vkkzv5!w^zDiRtqx at sJ_M=H8}gQbrYyoHfuT2jG61Z=F zu=pWU4I5 at LlOCL|M(;Y}6YiRR$u`hv^=z)YO;=9ooqlD<$3Jc2zlrnKiv6KvW1#=8 zxBWkonWTxe>HkY|W&NY>p4D>o`V3lce!jN~Ep4re00}8sh=7n1E8>AqJMKE^db*h# z^lPLyS+Aw{jN2bEKh<2!xRh#J&wRYK!FfD2(RqKr+;R<6z9LN=EsD*SGB;wdIs_fT zmM4yem-!MNjig4KM5{tm$yn&T9vh(wa}H}@A5(;~E7(&YAp+~=BJZ-1qEsc&3d$|j z&U*101LN7Z}?>Q95qafSMp!-zh zzIo0f;y#A`&EwAH at OCFEw5u+3s&Exv*hXoT<56TKktHRHXCAiU(aE=W^T&9K*Babn z(QH1)o5-V(JkE<)8$*a)e`Uc2d=Yx-NNSb3P>bq(FZdBI#|YO5=7G_?&|gg)w7Jl5KQcg{K6ND9A`*5L`6_mx<5 at HDJ@8ylbhQ8Z3)zxEL)InVqx36jg)Cmy zmC|{J8=1C{gebA^7oD&e)n)e=MhQuV$_dC@*!*U^CPj3okus3WO z%m6S6ss9CtGW`=osil`m8wZJ075U0j)HKIRRw4)? zp+?KY5w=>^>vZe00IueOe(}>J8qx5tSFuc604prwF6YE7-lwA}PPe12U;KVPZ*aK* zStv?r?1n~!!ICr?8bZA!4>LW)A3oOkVWuFYAf_Pl7(=S#vCya>@|ZmaxKO?QA3f1T zc#Ibu+1Bf_l$qaJpqh(njSnG$g3&_>(Z{wb#HpNlT^1mp8R4gWV$rEojjCVz)PKP? z?Tyfkm%xtttnR=n$Iw4#w(1`5hHJx*B)SwHgO}KzSb6QpoZU01h$qujDxQTipf#d3 z at hHP`9#8PPUG|{Lz7?X5!BmMl9Mwe$$KteZKd!- at e`E!mT7cJZ|l2E-<#M=3o8M)F{l&$n2vA~-vRf~QO2R7>$A z>)SP?b8wAk^^PksZw%4Pl(V4veKuXu{PV9o$Io{C!>*f1jVG5#0y2$efrY&Iq zt~b&upx5X31vfAt59P5fpJ7Pt=Rs51=%EEe zMFr3tIbge)IH?NCio!)gpFyW!FnyNsR#q}tv(hroya_$vRwr^JRO3B23wK$8We at A> zZ=b{YOgFxZP4C)VWv!z5354mcH+_V{axbPutw9M}>OXJ@=K+4bQ(!o^Ei?XtYm#9N zHsvBOHXrv~NK2^4?8#--N%eY*;ly#YT#X^mGnx at e%C>kbK4vDVP*M_G8iWCFq6MDb z3vI?}XCd=`Y4b2kcm`Q^9GG!^lW+B-@`S#!Z2b|51x-P%u~Z8z+)uS6VIh-+Dm=G@ zYHhJHkP`C7 at EO=F#f{IL(woM^6k)Uy#+nge1OBm{w>>z^_sXKdRln+LUb6_m;U$|y zCK=&`CKXHRK2Y0%iOpk`jLC_uVKsGqUpgf)Lh at rj>dmW6_TYL`=R16q;H&DFaVZ>R z-0a$d)=|$cjuWJQczEW}$y*yh9>Ce;#M0%j)JXD>(@W?Aj&Nq6k8g*PRbx^8uI$%s%TurGOxx6i`k?^QHYZWhY0nPdU5+lr`R2?Qcj$&Sm^`=1=RaN z*{*~tQRPP;&4+>B2Qo7 at lT$)jjHxY>p&cx9xRv4bc^YYEJ`8%R&^GXkM^v`6iBo*m zFz-q1*f!8#VJWJ9^gHbjEJglp%d-CtmP~&&WwOE7;gr{=zEcP;`4n2Vc}wsm#2Jz|f|T7A2JTDAk4cVCaS zqM%S(h!>OWZw-OMl}vKx87kbHKq+3}sv3!k0nMhkQ|Ye^F~>T>c!h6E{3A&rzu&`- zmK$M4eWwg=IkVqJ=j(SKbbOi&IcLK$MEZ3t#SCj5>JA9bCO0uq3wE>6CPF7n!h8+T zU7wa^oNzJh(76YR)$SGBM5HAEt22=1)-ZX_xJKNcb3kv#M5?gOvW%-o;a4N;6<+QyjzFDvxe#n_fLH at dW0>wAO=&jRL#0Pu$O>`}ZCgG3`i?#_ zyp~-H95O4hVB3wBJp0JfVaP!5 at e13(D>@Q~MB5FUx%ptJJ+DeP5iG}+t^PgNX&i~~ z`yxv8;x9e(d<6i%5Ub_;jzH;B#z at YW_g22k$syavd_$W8KWb|U(b=B&umUtLM6R%k zN<4|KE*`6J-g$y?RP_XltQB~jjMyWW05vP0ZUv)fD5H?R9U{B at 8%Nct(J5plhi{O^ zEynG2{GLs|Pa&jtA8x+bKnY{SFNM at zjH@PtGv^noom*rQS1EFdE1ZIwXOIi>Mlz*U zU!uln);xBHLkuxw^=a>u_)GJo8`3*w_lU*2g4Q>8f$Y5zQ8xJ7uqDtB;5!TgI_Y|v z?ERrRNK!oBuYZC(TIcb~-|mMuK>xcgWd9B1{{eU#<#jOxUpVV=NJPB^GQv}7rHzF& zBw;;l8GyUA^nM%~xk5s5G>!g*;>$t2T+(UiXTGn6xfU}m^T)Rj#jLAQDuneygK2j= zyQViDuZqq2?XUM2^dA80^wuy@ClG2frRTmLVPpUeKv8Bt-c^4w za~R-Vwp{b-0A;0>)aaf+SdJ#&q_I4LP1ZG3>~9X9jr|-#sJly7vlhWDgMwR=Qsb$& zc<7;Il|2zE)mkV`{@_EW+BNWjyL$sHY^f%ZcZA{DuzwC4E?Ogm5hzOdVyQvx^cAk_ zI?ANvMNl->O^xnPSW) zMUTnSRxBSat4Uo`=uKDwdtA?$Y&CA#1&E&Y8MF_@`{MUi1dWi^eS*k?_K}@cM^Xix ze-Au?Hu=2(kx8saE#qi5lj4jp?GC%X1dw+llidr_2#G zw0ez|s}#Tu2Olu8uz=FvpV;vzSG9Z_{BVI(sCg%}y$c^?dlQLkRC6v7GM?0l#M(vV zCPGk}f3M`}%(mGJn-1r(8VdIUR(%l=3|vgp5$Fa8Y3C9*%lL-1%MFuy>$=Rq&N3t& z0#l``2^p-t+XaSgN;Q*wj7H`lZifs0yH7|j#{dh|UVHs|&lu+E!BxzTdIwxjvowIp z>sQ4FMhIM at r_R<9oXg;I_*?Yuh2e8AZhsuV=`hoT^QM(^jqkS2&8Z!$k at V^#S1M}A zsI^y4ON;M&0u1fvq*3=QzwA7wZm-JGGF{t<1Y963S;#lunS3?30uMQzqMB_A44;(~ z>;kW}t~`*!d4)LdSl1jPK`e%!>%#K3_??-BB);Nz>P)|Ppd}O445DyqcBvjjM83J_ zSWA$^h4=6gWQMehrNHaA#7*oKq}j)~Voh&|TQalPLF}i36srVvAlCh~^JLW|vO!ut z<(wBrH0CA3$7O7eeK^8SwESbSr)LCn4jaRo)WhR|!kBTi7LWCAZl;BZ zDu41LSXP-95&xSX5lGn|GH#Ow}zvZn!-Ae&}4< zAi0A#UyS^jFW@^KH`32S+r@)U7P7T-z9ZvqFfH;Ezwqqn#EDIO(yA9})>Oa$$B%C2 zKWPMW1fHtqPiy_pL;2sP5eq{n3wnD)V=F^*Q(AznncaUT4Ov-U_-}#;KIi8Oisg$m zO=lu10dXhCbo&>p>&d@(cWWr$f%v6pkQfI$Qa$kR-M6lQhAhA!fmy)Tw6%{Ir<2Y6 zufq3;NqH2^>_RECBy(FRqm?nQRq}`?^B9-nm6uR}3kKJn;vcxjSPzrx_B$Y*^t6nn zs!EnIugex}iDqJL$dIj&C+FrT#NkwM4!+F&r+%qhGKK4iQVv&tgH*Z6f-cX|72Y)N zr`GfRr(XNPeFxqAlRWpK{?+lW|LC=lwVj=f7{J=u)KU3Q>U1_W2benjgS`%_$~vv9 zpzzYC5c@%5L9>yN$O^43OoevOap1$*X2dC=xA+eg%7ijfR9jXUOJiz+_rYR^i28x_ z$AD$pwo5|6_ySS0z2oliL=&$`CN7wQ)9{~mRoq|kUh`}|`M%w!>VGqFAP=B$M4Z at _ zLb)FiulphDp&em>84S6n5#Qo=SXH`L9--?0i8{};nJ>Vj=$q at 8SCZMTDsT5I2CxWI zbP)5S-gcWAbShbPymb+9i6tkxZ8PW8Wxf1x6mykUzwJV0+iwjcAV95|vRldi=(?Uu zu3WuZ<-FN^E=w%iV5)r at vSnMioYB0w#*$gR%TRTN2N67i)TC=s`e_^rhhaCy#A(I&InRyxQ&iFfja6XUu#*fgz=*SbuO+DJnH5riUfs8dZhf?Q^Ie_;|hS_k$a5+(X+&6ez+O-!i zx2*Q9fu;J_(aGhGspR1U#HWAQpU*?}1O$s*8p^U%`On;sHYX^6q*qiH_btYSJn4MUjPhCvlk zeu#obDGuRwsz+mW-xU+bMTUM6ho-+#XeD$}%1;7b%^22It?Mf^n%D=K%&E{m at p^lR z<(s#Y#k*`N>DOV+8Ku=I>*emp6f$XC#uZyURN{u=I&@w*D>@xK+5I-k0bDtVzPLNO%cX0SZ=zHHTqU$?58{mY(?}R$?VE37}@|*~}PJcT6 zZuxR at _4|5hgWuuHCY=q$mfR4j3D9n>A_(V(MnOS3QC1M~OGx^L8OX!}RTpuZiA02b zkF;mJarEhg1mn4lC95nKENQ{qI*Eq;h~%U`sT7^mxSKS&mT~G>2RE3ef0!LKK=MSc zv%Ha#d)7R;QI>J)5%n2`VOmnH8DqSdCT6%<*HnJ0+BBN6zhLe at X?_)Pox#_ at aqkJw zSrA0$kOP!JmseKHNZ%pKdo&-hj`}-AEky%r{hY)y#wV$!lH+^JM3|h?avS+~ z+YIgEC@(6P8sQ-jRAF}tV~s)Ls8S0-HP~3v#z?(GtBK}!%WSU~+#@btrtDJp2u0LM z1=A==jL#Y-(!wD4DzmkeW|cJ))AG_s4JMrR{57?QM*vj1KuxBvs at EyY1$0YQ at J{tX z8DMh;-JH}U`rfHDYk3L_cFuWSKQ|puDA>-y|D5jRRTO7d_l$8<^jcGI^dYVJqP|`j z+xu$8*@yO!in=@9zDg`>RYj+`*7hfzhsq83XOaKNyp!6=sWQkQs=|VZK8%(mpuhr- zQN%(H)v4^(F6 at HvwZa3vuBK4b0^XwKnO|@yvz>ZaPeK{+4%S at DpDGXMf%VD6QB5Je5&8tPOeC84q_Jb0sz4WTgWq<10pl z4t3k3in8tUX}n~zJJ)(2_+B^f1*bYhB~Xi`zCKjtn@{Td4P)irI3h3Jg$|eC6kdFT z_<^ks%&2e at aZ(|{b;(dgiDJdKv)l=ju!tQ`hND?L6q4DTUkl{}`hSfDNc+X6(m%1F z{zqyv{SRZ|AI|wU^79HPzE at jo$z$sXxVd{wF4z*79D?j|=!BX~Bo4Kp9|B{Q1%>pI z%ZMN9z~LCtA=94}`)xMCh^ZFKha2nJPTBVx$Jt(fpRcbV0*KT|dkP6AW~823$P7dV zdI3 at 78%dx%sEj0n4}oZ)G|=vJxf2A{r&s0srTCZ!<)(nC_PpkGtxQ7;t0&fvNTMY_xtOqvGaUXxm}YsI!?yl&V|j$_=@nDIMeN<8cVPXdaF$wDDHa9jJI2ZXM0O&X(2s&%R>YzjaSz5Av zK3(b;G2dGWPF>uY>oCCbfS_#1GhoVIjOl7GI|_v#mzar4!zc|-SXK;c91j{d*xqOq zqmM!O%f%G5!ypa1PAf#Iv|YV~dyB<7@&R-7 at K>|>+m3`)d!b?3ueuKI+>LW*of3JE zbia8IPD!^InMp5 at _+*ylZx}fH>jJ6jIFcI!6drc7+96_}iE at Z9Q72$VIX&y2Y^y=X z(u&?##)95Zh}Ty7(6 at c)ByCf)q_ z67t#wFhYZb`(Yn?I%dd#F>vcM55-v zH(>Pe7+>HHb{v?zq0S*)D{cc%`6VY6IfRamWy#aLvJoYaL&sdv!&@96M6%Fgv+`%~ z3W)Lh)nOHT|1I2;{2lmz&-{bR<5D1uD7*kG<|IizCBbP*=ZJl_l${+?K*`8^oX2|EtMg%e%;(0)Qicn4eUOv;E@#g} z9cGldW8mX{(nb0mCOBDVRGUvFz$kR*L7W%if_4cJ$Cun4k6^@o z{1s~K0MZeXhk61dBAdS8VNAWFYHAj%RG%7;))4untvE`G&mH)$(?C!kJumTR3SuCE zfSCWyX)tvJ7+Qml;9TR8L>y;{riAZ7FlC~g19!x+fT16507l)obwL% zuLsT_lr)9$y{jxCHy;EtKd}eke$J2IYf)R+Xj!2*sx7REg79OcNzT93v*|G^Fx?dR zR{)2TVoLdU{c-}vY+3A}3OrOAuL^BG1_#ckiR)N))IEg6sa)tRUcBiDDWEBroo-4w zwM!-n4d^jgv~6Xwevu-0Grd05s!}kKpn~+lEFTgEsZ1`ft^%E4+I-g(2lppR*w2w> z-*?w*FyYR-Ysj)VngktdDPpd9|Dj@=N}mYJX`4w}qtL$F;jCo|beTgi4p?vM&+ns$Px?w_hcTb!P2Ty?ZbIff}j8 z{-f~~?b;`==^POn)-LGw<_RuIxik5ar`$WLHs;#>CtY)v3w5YBX{v2mj}sokcD7EJ zqds3;3h`!$i_>jadFX`Z&+4qN1-v!IebSknd3jpea~D+5)zMK&|Lwg=S=bWU zHN|HQYbo?d&cef3LvrVp;=h+FYMdL<7IbxA0&*C&8+ch>}Sy%mVSK) z0-L3yJG2EaBE(@2Dy%PS9C at 6*78+q!ZbpGo#KY07Sr9DA81kpCysc2Xwxc+u?a06= zWDcBFad-bj=b$@^CVt8$QucOeMy}tWKC!di0YPdIYHey{Luwvn}|;`5ls5 z`b7TfB99qOUxr2O8(xt(ZXxR)@xvMq!J~#a!{Nq8{n?9~nHNSmdmo^3j#Y at C(1BR? zCzv5<*}Xa#K2ZZy&59%*Meap|RLx(TqA5}D+oBW`t`}Gl;os4yBP^DAg6HFT0zZ<7 zO&)Q-$S39UA2yG;pXH?*i`#{_&93rsYrWlyN`X at 4%-)=z_4Cn|+ zmHZ!MT9#IP4yy#3Z$-YJPc@%wZ8!B8p+}WyfVnm5N~(va3)q$_#*BDWXt1HElo^-# zPTdOu0pANlHg9_37DT`2hEml8Dwjyx$dcE-PLHL?VC`TF%hgIV?4=t__>3jr#hmD} zy#W2Svvth7OUDpEK(VMmKotL0XaBRSlj^5#*y^ZX(XO(^G5c!{#^&iqX(}nm(yntX zRndXVYQ1&1cBGVqQ3rKAw-#biV&TZS){?rpg{C(CNJ~m7DaCS|VMjP{_|F5J-a8!Pg?n1zAmh{f$D-BNws4Z@;t<6osAx2tGGr(S1g&QD1E5-0;(8FnIHdFGm?oo;jo&3G)ophKN!oA7Lv>K$8N|K8mn2S#C zp$AisuJWh#<{Y1H4ZvXA44=dh)$2tWvs`Y_`)|hlMpa|pZQi8EEKW(iR#>b>nL!&x zhUlqMlhUd&PFGCs at -yn+xTX~gW%K`I zJpxZUVJYydV{Lv(ym zW9zf-vFSxYiq2e at iIJ+Ri};cx8fs8UYeFH=cBEDNT11$;B${I*<0)np^OkDrN+>T! z66RIb=*cQllZRY;x2-?!A90SmJTJ<8RNd9~Ob75no<)4Z!kM(`jj??=M5Wo~6;Bk& zoR9d;d=6diuf7Itl;9oU=}oee at s=Lyk0`8Spg2_Uxpl`sC^tJr%YYLa{nsGO?-LsG z(;1Iv^L0&A5hG`!(p!|M3>Dzm)plH%L)Kb!O%ZXGY>MRjm~)RLaZ*ndm#GOuT7&ve z%&-}&cL8EpF$P#J=Dr`SW= zNk4xl3wW*y+TMLa+UosfVqJGJez-?xe#faTSMIn})ecPbu0}ySvg(LSCdP?$9fP0Z z)xMvF#0MkVSK^@8(_3|Exb+$s^kgsHM{`8N6O4?sHJlN&&OyHmQhYMcA!t|c>DchV zW$L(0*}f<#C|aSW7KeW(DgI4&or91ym at N4xR%ZP|5`f0S7S)%esjxT&qRN at Cpgz;r z?Lg*+w)#~eWwE#Z7||x`7UeP2C6$#(ilcI6E5r*;U69YC22r)j`30s;dQ?YlT)9X`PL zjL_Vl!&Y|=iHkeo16j5%ud)W>##e>;YphNgMlpIzt>iNlFkGx2K-}9)Z|A1P`M>Z9 zU&R)S`AZ*YG!L*;UrOst=ApqvduJ>7MU=dhl-xF6iSEizJ@= zgsB+hE&+EP1w8~+%nk3bEo)0Gp$Ry^=$7{V&>(5frzIRKn9%veo`{6iVI7I1&Fbsw z>ALv&hKo9M2Id)6)o3%%dZ=fP!Tye;0_jM^S6C-I30MHxSr7v!_x+OW}8v8;^)z)v{MV zp_z}}ull05G;Q}dmj@*G3~iys*E4T5zS*>td%vg!)Ay62_Ekfh#@&F&p;I_I)BYkT zu#LI8Yic>Iu(BvQx%6rK;d5=j$F!nP)#JL$+%Z%;3kIi#S&Z=ORrgld1cbZ$yUp)2 zWUvc;z5Z|aVoev_>La!kqqYJGJgth&p>m_Z(YTA9F&=J&IYpk2?oEE5it)ROSCIQe8Vto*qS3Y5}vcX z>x3&KzqAH8X=gT~0+YyFX1j*IQtkGE=EX}XlH4db;z=T-Z#g-LMw*N{N0)=g6?mC~c at Nc2H?|{)srciVSya{uvtIKdO%KUk{Hmz}D(N2PZmVT&_<5CFD!6 at JFe8_YP}& zPjoajdL^iklCV)Dx9<1JLR=c=H91LdR&>4}@TNa8C09yq&_6QfYrZ(0=B8_&;DOXR zTRH}PUlliC?k^Q at 4(e`hcv*2?LPedOqWE`X)l=8jV;|86p~ zHQP+pM5_J9ZdIPXS2Rjw!D}LP3w1w`RH9>dD+XCsx~FvFcmAHL!G*p-r>s)a@(GZe z`I&QM%VOqVj)0J4P%V~j at Xb`f2{9QHcbv*H#f3(bt=76NKy{pKiDtRZuq~W++~#7U zwSqgT*8KX-0-)x646=j$*Lmrs1`dpH?IXBIU9O at t?PezPw8KPrWY)_E08c$sZ^|PaLa~@60vt z&ie4Aj+uz$YVG(EFnN2-r;$4^Yg*{Cd$up&O_juhyZ5SwmK~1%?eeU&lyDK?uRD at y9f<1UMp61 zdn%s&E6y%qt8^z_dISIcHWjm*fW=y72)JT{}@_i z`8eg7FMjH!+r04Do4RlePZXWE*ddWJc^MtClJF7(GMWvg83!wCZ=<{43t7LOG`8q& zY;Zl0*`S?We9=W(%qX~3OZGsg at SbRmFduQtIq1G~XD3!-TE~nq=V(``+Irdc0$?k~ z=^WnXRi{%!qO^D3j8u2sLq=L&=xNR&e0!)xxYroCYdf<*!1~c|sGa;JkIv#RQ(1s?!@36U5|=q7kaZBO7Q?jYHTnQ?;sU~mp8MW)IcpQ#h-*C;r{Mw)aP zGnk{7v=BL5p{&LbW1u4UN~Frkc|g>HpO(#FmCtZ~b;s)MMgrCSfq>A!PgGw-DlbKE zNJE+`E?>MblZ3XIf3_?UBi0mNb~EB;5gGD0&9%m#!xKQcjrF=u&vKZ_?^nV{@8cCg zB*p=hYI%(y>k6<}#rmLQf+VRIE%yy%;|p=P>jh^o)0y*lpCI%rZ>39!UmfIih*_+9q&u`1fKz0R&hB(W^28K2`>^oGK#eaA}c z*3H9fOCkho9}Y*=h|7ETiV#D7eE7DU4(E7I!qF;6mma#{c{${6L5Ojp(CAaJGkZC7 zkZ81FpuM`i$9<;%2u*1Osn4hqHyoFKkDE^P`vr5+$?&l6Ieh-;?YV`kMgkd|GBrNX zXB-NWmJ;?ha)b4XDNZ&!kEmmIoT0p1WXE9V0ij5rD!S#Sn5F>ftW$=)rg z0>K2q3fArCUK+s>P2W+&!wyT-GW4cpX{OVxa#XAloA0}E=LXEG>@|~*P1QGKl~&6b zOHI~nvqDj^pAi1WwlxTX3~#fbz_>rJxaKFA4an}hsPyDDu| zle|!H<*)#Q^wn)R2xFaU at anhL%lgLkI|l4!PO!>buKy at hE`W0FGzLW)ebv7Y5`Aj% zd{OSWEP2c_e|6utFB$`JMOhn1d{gkkQObfPJ9xLhk7$7(3PGlvHaF$4|GOk at PwYrf zVWpayUx-NyHOoa!mP(Vgs++U8SIB!tL5&@jlgB<-eZX`}&e`21zn|)nZ at _O5VrKWO zDTK_SOpghrc~qhU zMuDy*2 at lWBz! ztC+ejK=t7yIs at pmA)okFLkall`)FL<_4G=Ipm!Xn22(7Qrhp{$O72EV1!bbVM%@6O z-XLp!Mjur=O1K|5H6?NuW&|a&Fd?_G67eySL&et at lMnNR1B@M`dWxEFIfxuxk-}NT zyqkF~tZ7m*N`TK9gG81fDX;o1Sy6Jz3JK&n>0iTvyz0K0O#OU6`>a#vo_iR_8WG40o3=x zSQfym6hK*OtsOogZRQ7*e_;(tQAr8^?-I5~&Phr6uOD5)-I!Iu@!vTNrZ=)WosPHc zu0F0_&md~_zRg5!gDOOa0&7Hs4%%zLimTwbT*}CMiSzK}@67^vyUPsL0Rcb%%!!Px z;K1u?eD8;18`+L}MnNg<7xCzvEJu&kB7SX~T7lp?Ff|oZ5)^W^SMX)!-RhO}5Fjp?)hq8Sy{)NhHOoK6M zg$cj;xV;RpWNu7mW&#p4Mcni8o3MwnQv0C{Z)-f_*s_bZN)E!$u<Gaw~j3Ry at nYLovhX|1c*Huq#bo?~Qcy!8s_EtF97_-+0N%+S7*~eAe z at Jv=u&bHjY8j~FKgo($0&17A6WLjk(mW#c0M=E|tl_QIx2%N37xy%+06IZQ9p5NdZ zk;0k5(q^0diipU0a1BqEYZ-ApYu2<#ES(ZzDW}LD#gDpTH>uf%+4NaM*le}r2{$dZ z&9z*|n*2ejuW)|Za@{LCY^6h97)}`Ly-{+=%tnd99!iu_rON}gy}W!=d!d)(6%-T} zKWcZR44t(lXl3{HAVPP at X}j7GRL#l)S-1;BEwT`v-V$R#nrha{1M`gK6QUR>&4oLMMPldRwBeo)$MjFgjm!E(o>=408J5v&Xb`9SI2UZ+a6Jmmtpr&q zqv6y8XCeH8%^-yN?-WEb!Y37KJ8~@5PpzSBkLcAWTFRVV@?H6u)ShRx2<(j-JoeR0 zN8-KUQT?^8H?)oYmhmv5XqyBT-j6>Q#RYs!t#!oMG}Y$e*KIX~@p(6m5}Ch|-Qmrq zQ(`E$T5?(N+G8+OJ(KmeF0clXG}o)mpXOL5#xjr22b*F$1nZQ;pH1Rcr1Ow{-Gjg? z3*3spfxT8OHd7ea#f-|7>z7D)T}%!;QwVY6ud&SSs&f%{{M_vwn#H)bE zU!N#Dsm_>syz5SF6S~h>hF}SyOm;^qu8uOcGx>borSETTH~@Yp2EoUE!hsJx at 8e0; zW(+V)VVa;0WsL0;!PI05)*g1J0Yd8E75*VoG2s1mvBk4o9IgcEYTXEkA1>`N^|QlN z^!s?wZuHQc9wWLkl#593hZMw3O;_MT0+E9ENZ`S^n1vL^#tCM5oIT*f)WWEq$?gu# z$}aD^!t$`+*L4#R%rZ(AfmS)u_B5R9miH3UBCnsx* ze5t!y0w zEzvNkk?jEmRh77+XW4i^rey(7{V at i@BCwoM10h%0cR#M*?8_Pt_zEvfdv(pEFXjrj zE^Bec23J)4?5zv!)AZnVr=X00 at xqLXhACL*U_msrF at Wv@fB_>e^=&uUX=zMeU28 zMTe7R471-XCt77;Ds=f`uEG*0^3n}-iWeuJ=Sy30l_kOM;q`s%3{jy(+B!(7rQN3c z at iF)E6hqt@!PX)tbH^op4Rw1btY4{|KX`mYZxp*@#;@5T=FmqQ(k>vx70WiFIbM3V z*6C|EgmX6GkzdEqqp`pePHGPjeFlG?F3;|D^FuL}=qIkCG9G;Wi{gK829mAvB_n04OOe-asr^XE5Jpl3okDh;uly at n=U**hE z&{L)87LDno;xM zURoWVQRMmOjYeb$Deg(0fXo9L=;t3=0&)uRIdXS27Sy3*5nnlsb)h7;}HqXgE+OKbz~Mz^r83FB{5DHz%EOLQtWrD|&S zkb~nw1u;2FCFaa2MJaYEOX8fttQNma at -(1bQsV3JC)7&6Q%07wy&im73N}=*Fr at 9O zG+Uz-z&Y7DD4;niE9h0;_J*GQxHGyxHNudvee8|)nvJvI{p^2V`6f6jmX^O#PmHE&{q=teEpORjtD at +R8Jpv{2jR9`Y8got6uRb+k+GkX z+98LBVQit~p{bX{Q~qp-8CPitF99STAa`ThnSaskYm-*=6R{K96I-(`=!S>s)x; z#Ibw3yP2&#(_TPgppGT(I!!(MPDG4Y?bxDc*KOHM5XIZBQEI`^-ugS09xVfJxsHBk z-2+*_DY1b(d*^AV^Eu;9sq-`3Ws8ovMW4h2Y2Mn{F)1}htXKgF^X|CVHG*bR%)oB2 zZ2*>2CfH24ap^ZJTHi z=~q_t``tYhu$-=UHJAnt?!9e4UAN(`zm)2CU%a|4CBlLRs*@ph7(RIP)+EL8nU4Ah z?LBY1y-s6XeFaN1zSWzNFudrW4y^em=tB|Aj!c34#*X?^yugQZOBK`(4>b4a0?zn- zL4Cd_jMCJIYY}SW10Fdz4)@+$N*$KSAQ|M8<^&b4VA9FCd723AYY4>?zECj_O*2w= zD4G)kU%>Q$;8l4)3rzAm7MH|16nwr$i7t6p)L+sPlG^3vqz$q_Kv>@_pqD?j zBvsb-I at k^BE5#i024}HDfCD;2X%K at B@tTNMT0 at jGgzFc05p?TdMLGoIK>H1f;26Za z3;HuXq6Po3^l>Da^fg!fE+Fj9|WaYD%3UEW1PY;xHG at c1U=8e!+#icJjq1E at 5IIQ37_qi<~fZI9boy6MYZ~Jk8RP at Y`R?Jc}n}_*{+ZmJj3p} zjhzuDHi;6nLH0lUBKO7=Ax=PZ&U23}nkAdfc6N<=SoMfx1SfF6a=@% z(&BCLxnZp5oRd$@erCRV%6YP(hY;XWk;?M#X^=66S&Mp77V!{@nXlz6F0X_K8n}|Ay2qC)8R*|w2um3k867zn zEcK&QxzkmMLR2XkhcrjDi@~S?&m3P#qK&H5vEFN=QoF_SP`K5 zN^}ZV0$Act3*13gt^Gn at Hb!jcI}VMsD~e*d+8h$y($N-J^xbrkI+QCC9YEEkPxH2b zQ(ITZ`Wmv5-Ec{CKIsT!XxOHf!AsD72Jb4mZ+!#ZLoUmaV{Z9l8caMoPDigyS{Ous z7bxWno!bB1M%Lm6CVe0P0NhXk0F?e`8~KmBnaVCsriQkbcIJOOK>pj=|7=TT?V_WK z`h7cXqStAOH_yU`oJCeEXD(H)VpA%s#4Nli7il>Y0 at q@YnYleJ!|ZII0j_{Tp`@a6 zKOkJHK}zuexJZ=SCQuE;N5Kc6EB*7T@$LAgb*M%6Wxn&Vot z&)Ati0W8BeqmXa-sEOwn*9o5K9WgP);}g<3$NUBa-?tti?iey*%=3vvk7N31N~Ui) ze3Wq-N}l19de%F-oh)OP;gdVTp5c=`(XQjM8EP->KsJSpEG0O&cmN!!jYP;=9Xbdu zEu|r2pSZsQYP7M13aO+LM4n1no&3JOk*?ZY3J3}3?=pk;F4E$dWrsIgH7UWFuL5Np zX%c6)8P=*o)K0EA{@*F3^IK(!gsHzH;s8gh& zBH>`dQF>bDXXgroabYGFCMy4R~eM16jf3*WRD4k zX2lpHmg*DKt+s?@Gf at KaqS85B)Y7%qN8eqRmguaN{Hw)QUt`c}Q%H>F*F>GH48ja$ zRY)vrj1G#(1LQCSMt z@^~ecXOtx^30yZGHze;j7ZJH)M`;7zqlOrDiidtpoG*$kWm&Z`w1;*{oGs*tV3eqeq($F78-7k!&%&QZMlHP_27$d35>^4HJPo#5GN}`wo9#XJHqTyF zU_YcsWWU68k`EX%&T-&hOw6>LsOb) zr!JP74G8te3ezf)?ahih?_*+&Ic^7=nR&Dd8S}_PSBziyEHU{3Y&WG5d9C3PThj{PKC1E8%LK*% z9l9Uk!O!N=IUOAkJ9WENuMU% zs43WNh&vzwY})|f7BO&p zuY=ABnOWofO`#Kq$#Gq70RO6`!=4*-q{*VP&m;KmL%t8^k{4hucjmMRRsx|+=*)aR zLh?DDi0x at 8+#YAQ*)ZD>$mzCt>fmru+!%b7Vz}}Z7X39~0J;l>bu`fLe4oIJI_{Wd zeR#lfTu>fF`jGkLkA5|3C-UQb3RCBQVlq`R;#!52a50Wo#Y!1Vy}>wM1`K%C+SuUG)DPy%Pf?fr-&%F;?qUI}j|qpq%0cPo_H zAu{kMjxX*R at + za>4@(*SR-l9^=z0Sbjr4*=RGGi!sI>I=ST6;=DKPM1u-5cv13DDfo&?vq*-h;1DE~ zbSaf+mh8US^(Z(9L+deCzwT;3J;Hr7h))^VJw_dB|FcvDpid_2y)?)t6JVbb at GF;; z5m;He2<$%UYJWY_JtvS~E!e%ABB|C}t`X3cIdy>geQP_2Uv9u2!9Ke+fIq?q=)J7O zJQlDyjKSTe!9GhV97tJDRmpeML#7-@?Wtgego7Dw+!ezRjbo?Uh(ne|^l-H?_t$1+9I^1U((~CRHH?Qd}en?~! zTzR&{ge*LNV|-ph*knXu(~82;=2BPP at gK`+$ugczYuJ{BQS$Q z;+I#dhLMbN;cN5k at 6mYu<4J9l1Al}c`I_Or3bvmvDPw`PbtVb)FEimIGvcWnoj^5R z9s2O9*X5l at bks@`|UI&=>90+YjY&SMw_v${Hb^S=I#=%!TOyBd6Q z5(hEIXw=!R%dt+ieVdV5uvxoe(aug$O_r|0s at Y?<#O;t0cQST6W~d5m at XieA=dD_~ z1^vEML&FmYK9iH1tarzb&CPp5LVxgGYCEd-wDN`t!XNa%W1TzlFi+&aurSA8c!%qM ziFN)R)1+uCFDW35{glIkNTFzJU3A(iQ25MBzG?O#<_j9?XMnfh;X=sXqX} zR?%De-UGiD;=JUD7>Frhj9$3Ro#yQ9+5NdbUAx2Q2b4Lm1d`2=APAfw!{{I$PC;-F z%|J5}i`W1;b&wzNMSY?|Q=wsMsXdHNYe>^$oB+AKvm)`M`i6TpGUxO+`Kc%nUVf-+X zNYUFL83L(l&Ml6bU&sqJc+bQn&~Ue2XSm>&`SF;s3LUB at Odb|zfgl`wKh<%l3jVt` zI$#4$xOiR1_b$2%Yw<;m{t$gj+Z2QB$mN~r)bV9MAgEN5+9_O!>+@#M?qbcFxI;XE z#NU0GHvg`C1lQySeiUL{dCfS?Yoo z`#bD4G$o at Bab^K3Mu1SQZ!QZh!ys(SqLjWe#f( zILao1-Bbi6Ofp)zZtf-8u;dceY*H?MAyt0Ca9^?FFb^d1^8nAz&tT=VJi2#E0}wNr z at 8|+ePX(f+o at xvK-(4+)FGHUX3;^Kaf0SqaTk6Tk#PQ!UQvd$`|4>qDk`5 at QDBs@` zGF-eD`w)cJCPoo5WRnRI2&Rn8gyX}8vg?TFB)KKBW!%rxAjA|_GM#Bq9V(D?;P7dx zY0`-SDJP=xXe5ax30H-go{#AA3J-dGvLE{6=;6ofCLxucqJwG=qymP*&@1Ixk z^|W{&mBIsvpkp9FU$H<%x=6AjJF!TKRG2I at b|s)v>=|j9dn5=krB^RbmaX0}f!R!D zrZ)5 at T`=X!cUUDRcB8ke;4hbPl%Db!(=XYaf!Xb-IW_~GM;6A)Pinkt_8dT3n at up~ zt_pJ}FjXZ?J8oyvJ+Ec$J+)QaSUWr|RdcA~gIb+LXe6c^$-!d^8B1{M~g`(nKtT6q8fLxHiH7+P8g zDh0<9f{w9rj9ZQu7Z_rYv+zV9g2G#JL at Gn!p;^53O(@<+^xGs#x}7}6?dIN%bBE=b zN|>+zI;g8D0BydV?h;hfMDrEnGoA`b9X44$>(C1RwUSN|H58Y-_9QlXKGXFkCr!JO zDaA6^NGfGfz79_r`1;!(%W1kMlRZ3E$0$CP`Gcld{MUdJ%*jp5NuI2v at BnfgA4vm+ z8-*&rG~sM6;qJlnc({tmVs36`Te0mHdwKE}C>8UX^@GhgT^0MVT?_wK?4-g#^r8^j z8I2U-j^i`pTf)0AjLB0~|rRLPv at RQsW~E=f-!!R3Ht} z?seA2v<^g63n9`~#nl*!TcIFsRncIV8 at QKEteS(781~!a%EQ(n7Y!}VU4}phr6SjX z*T86sc#*i+VjjF&D7_#ySM$`5e%N7b#W>mHy8$LSKu`UgG)v3J-jnC@%$Jac2)vaA zAqdvPF16<*-7NfSXfG>zb^HNFe%f{T>Z-}Eb91(*Rvgv9jQ at l zMsZpU`PvGwv@`oy at Ym#W2IOpp`20NL4Zy`u=uloQeQ|I(qUG2H6i+kea$x2;*=Yt# zO*Eu1GGhI#fViV85z&`RE=fb*DpM>Iuex~1MoEa~*&Fi{$hKuI2xv%E9PZo)RR=*1 zYzH+5i$S6tGUoMAZ6c;K`#+~Du%c`5Fm=&WlA!dFo=CIkBj1yp^qc0>LwqHN(<^#Q zrqfeAlah-1XHrSFZ9J0-G<}-1P*X6Y*+fwG$;wRE&ozrWWX4IQXmvBh2 zvrb7j_F2#;(q!J!V}A9L6x+3SWx~CzEE~^*S1R;`AWPJV$xj)jz%Qj0=FyX|H$Q?G at a}&Z)MS?douA z>ao7C%Jp`vwl-$Y2SF1H$dCHqY(`f;qIfR&L;m*@>c~g{dJPZ&Kpyy?O6>d(C)9s5 zIQ>_4^xLd?Cd+jzOT*r_rzJK^WW0 at vh@wa&i1Kgjs2i%!BlufE0Sd||;5Ws?wHa#d zap4m~y8Z0itUDdQpWhdp0sNYeieqIMsm>pV5phs$yf)rz4-2N{d^56%=~{Jf_B*}< zH!>Ju1_h}Mz3E!iw1HM39EJwKAxi3);|C24>Q*mC51D(uAt!n2Y^T&X&zwlol;}b) zeX2}8g1FTJ-m>Cyc#xq>1*!)cX|h3{v*e6~Q3dhgsmR=2((^KA$p`oFM7hDr)g_G( z7ugmla}rh_qMrOp3R2CNac3gs$C{Q+l3!)RTYHtZt((#7r)0<1 at h)aW3+bIff;O3gW5(eR51ZJa`gkelGKpSuuW%9T|4?^dBq?mxYO6P_PD(E6M)2YEL0Ul){ON zN}qIj&QzKhUoSSORQlrKusl9jWL`lu$gD%{;MOc+5TeVBTmJeD>3sgo9d3{tOYgvk z>So}<_7hgy7yu4s|vfQK$MYxe-Q&9&?QI;2M1a0M#O at I$YO zVYyA=d#5n{N&gx)IW=p}5$?c`chK>GF0SCju}J`1nGVyi-RAd?kwXNTGXM#K7? zrY%+|7fSh7vDsy0j7B0e8n^)QCOc|6Z2iV{Fugv}i$WD);XT~yD|=pG)%4-!I6`c7 zf6)h*JhMp?C`U#ruLC25C|%Z^!Z+^O~je&V#(1llU>@05U-?tnUpP$ zUqut^A)YbR#Io>ev-qUIH&cQpyqjvwh~$zbSE7<-SxBmcJDAZx3B#O&J7ZJcpdl_;O{#xzR`Pt1P%b8i4Fk3 z^MB75h3#z}?42!LO#cRD|Dz33nzlOj8tT{&aV*{FQbtFrEhxkKK9RJ+#xQ9cK?#9O zY_NUA{(4<91S1$G5FSuLHQZG%nkU|%lRO{j`JF>i3BFz%S&sfhry%&}n z%*$*t(O1>br!RFJ3kTDBnB6KhGU?T(9{aW`rb<`@f*EZ!%~?{_aNn% z-Mnl09NXo74^>7M&m3LS1clv})p<2)-54t}(xPp)gehoJL4V3xM05co_p!V3_RlAR zj&Zx>_QW?#J-a-~8Gf9~YB6yTqov(g>7Hs??5ZCbXazc(^;t^)hGHmEa|_}!)|Os8 z(FveK{hs9vP)6;l2+M++k5^tQW4Si!lk}E789!Jy35bjSl(n)*W^K5M(rhU?YX#t~ z=WL#$N3UKa#V?SK?CTcRtWcjqN?WST)E?m;u_?8nH5IKk=o>jK)8n}ua(4RqCSe at 7Am|l4kpg`}TCJg9-Edf=n>X~JoD=+#d z>{;j2z3c4IKgomcJ3QsD!Lujbw|Ujo;@0c(pF!@D1BGJl0qn*~Y3%{M>a^*~CN6Aj zz3?#;Qcv{!Mk!RkmbBUI-=^M-VfvV_tbEM#(R{$+4(t7hK6d*UO<-~dEg6cybNgLj zj~Ofsp?8=Z;pVV9{i49l6c`?GPhfS2SsB=1dO{2R=&!JQPBn-sVMb>fz=s(ZmKV1)G4byd_) zkUhmT$`|~^E`Iyp8Xg+*=eqib{Q^SxlcGt9aj at rvI-TX#eLr)3i~i5gFGA`9ACb$& z{Yq9fjF&fKbU0_u+=G3>7>6uE5zbcfha`pW&QyDbvhU?OWRkzb(0ZFCjIxgMO}Coy z^cPQ}lj_wULN^v`UtR3>cjSp1ru z>7HJlmbNp~Gcy48W>dby*9NGTX~tTrmg-;y^+-#SZ1JpIJ1foo*rs%AQp3XzCYwDHXp?$QS_-LDM zYl7OKZL4*l%^ioYzIZ?!ys%&@b>;c)o9CKKVaM|*!7}JZVLiHV0d6 zd^xzCr7jTt_k`_1sFGRum*dlr>*{n7KjCwG`tWsVJ7nJ-dHI%Z+pO zq3)P{k}^-*Xo;00>X^-0?ChW3UUn2hm3^r<)_2IAk~+h=)b{XNYvk{k^(DrX|*<%{v9Q$Hm>EF2%){ zr<5Z-i$pV*ib2=2DS`?HVve+iU zm#Ktwpd=_Lh$s$`B2*kVLr58i*_v=U2p#v+9S)$7Du6`%0DeOF0jGbVAxV&^(s=TI zxc!;Q-q7^_c{7DFfS1GLOp(D at XHuXuz~%;{@-$IoR$!ke$dD)dCU67hCsM(41q(cb z2{zzJgUi<2=O#vs&FSK4Q5y3dlp+yUkMU-T!SGn`6)x}&IU!pb9*p-k;z`sjfj7Je zyXtzN6{_{>Mrg$ovUy(*TlJUVs;`BX{urb8i1q z%z+Zzf$1?9JRW<(PkF-gKr;X_vq5Cqp`YDaXTn@~F_kWU8=~ZT3TJi<^y{+?a+E at l z1Km3hMyMBCW-!pEvkF9;*?HTSN)G~>y2EBbB(H%pdAlDK`mAw)RJWvP%ew?_*XpAe zCfgWMlu2p89dZrrAiJ*?J6y at 5j{nnJyR6Eq(kG^j7)J&DDzEcqamltfn6noeYb~I9 zZWRowp+jT}(hCT)`?OU#riN+JNao1C*AJqKolo#1;WhVE at hyng^$!as=TLJiv3-sy zbYy8!0$k0JjuZGBjq`Os>KYv10c=KOfOQ z1-l%>iy!`Om@!cOR5B#BViQ z`7t1&0Gi-_al{-s13*GTu?&pX*9HUwNQRNHr5!0Qj+;q!ibz|foZXy!6)y_uck`F_uX0#LV7rg~7v zsUCJjAQSC|8T;`-+rJpI?kY|!aDR0GyQ>}2ZPOOJPi%LIp5XD{jz}WjJsk0E(-*%) zO at 4@U>kosA_$UlhB9 at Et5VYYZEd(n&fN3I{o8IOqjb@?4LFKOkmy6&xYr;{P@# zO6K#C!r-Tk$$vO%e$6 at OqdI&d>LoagCh8?QoFeKaI;McCV z#-cKM at MBJ0WvF-dKQ<_#G!@OYP4B4bXCdd{}JbZ!RYMU at p>TmXb^#+9YEV{gTg z%%;uknDzyn%cn>rnP< zDNYP&i+G}=yDQoBBG5x>Xj+j&U0ey+Oeq+#jfQz6E22b+ER~C^_>X~dpY03zG#MPY zZM9`UmF!UrHX+J+6&hv zX_uw0e6oXwQL$22eY}rh98%dygB$$%L`zLuSHwz^!qsWs0-X(IHIYVZ2XdO+)+Ks! ztY`+w>()6<1F at kvimEuG+o4`~nAB$L2Bs?v8rW78L(Ick*#P~A!4 at R5QRGQoB<)D^ zYM_MDvUW5<)Z^M^O#^psjI>0ZgS;P+(QkH0wRTVA(Uu~!r(q86Z6tbHvZ@*ZqWCsS(wRbPfrSO|w!aVPPIkvznc#O~&^PKMpIniJ8QLP7$nA zk7RDa&F!we7^R2J#3^^O>>jl-ZmY~lBDK3{?MfFB(K;_49(b>Op+$!c5EU#dvGM|9 z;UUY4mh$lYD`?;vZMoXthfeO at dr>9Kl3KUAYt3$-Rjc5YS}0nI3rI zs%faW6T+Z3q^QV-SInMOzm8S`jnZ)R2#rd^Sd;rO>BI{9O{Xh8^zU+_+;7J#JxXAOd)vcWTy8IbSpsd`Q zB`G!&*Rk94k>8mzo#5)V-REAfIqKr-EkF7ITRo6M6o=&jw|4pL?}vZrh{MNxW%M)J zFMrJpJUfH}Zr`tn%g25N%|m#Q#_eOexBe8<^RqUf_A}pq at mTD~zZVDIy6*_Qx+e$r zzBdQ{xJL)RIcJy;@4I}>4(vO^2m6lnpOEPb^grU~`nKMu^yIT`u(ALfG*Hyhkx4S8 z?C@}AYnYInwDD%LB)`a2E3z&HgR?XRTMc5=-o>=nGQ(C1xoB?A$8UY>If7? zdNmO4Zv%R0DNMCSMan04m1SqiSF<$Wr$GdV88(RWM|^npdhjgw=+h-~s_kfyT>He@ z%!>?@7G7EZ9RJf|u)5S>^;jOIZr#10z{H0kKL(#wNwy-=$Vp|tv9UA at W+^CW+a|ZH ztDzvCRSKD^B4iq#T|QxEdoDVn&vV9F|ig?20ID)27 at YmHN#g^bNPG*ip z1C36#ByYbQElOCu{LOCuRxjVG34NFg{H?d|=YXpH>s#uQLpzCR at B=Wm?A{jMZR=Sq zH=#m~=9!@hBKbzLFjPzyaorX}8vQ=b&+<|-4m?#*d$+tc*}*$kN$%}1>lKnsUe#!j z<$AY1?pinnSqF8$%YG1D*qzF2>CNCe>)*&<_|DvgsL8U_5clwZtkUMpi&0jTYytQ* zwO?rxyQj~1;xrN~TJ!9=D>VntN(-ASAXxJP at v0tkgYN)U%nta2Da%tYo=_ApO{q<> zsWdIE76Pj|l#c)mfX at oWgr*;fR>n&=Bybn9#IT5;37$JOWngnB4dsuR`epRQWP#UW z`g7BUa>LG!tU{-XPC~abPCRIC%?|AXQ=&gR)(VzJc8(9>7K^4~qZQTJ?e&jBoipkn zE>BGrS%U^4r`RTMGNN!hLVinH2*LG7G;pvmT^=Uo6xbeAq%_x<(ESG7oMjWH{x;2}72vT- zVbp`*7;{P%`600_e+USFi2JM&p*f;^2tsR`9W*qYZp!G5;+R^G(7XtS~)SMAH(j75#yF8L?;O35<=Jhb;wEZl-hu ze@%VyQ`O~o1?IpSV{pwY!~wujblPv8baxIw3Ie!PeU&wD3?> zdzuA#zMs*yY)@?DeyogMJEKcGbz8t>pzEbcTE&auE&#jL{7I|ME=en>xm-l2*=`ff zsrdjfHpj|u2DDopKeT8(MZ%moDjJN`usFw44zqm`I{s+`qE=76ldBw at E1YyyG4`bT zkRud$?Z`uXr!O^1drjkW9<+2JPff0%E4ZRPN%^};PYy3)W}cQTEZoCJ+JQvGt=s`< zr#-##&TJJB`_p)Tg>4F*Qnir`C-W=$4)98^2~L_G4TevsJ3KGXdacj{jgIPh4-5V4 zqFVQbDj`#I1^RIE=zUI>9IRkh{JH5b;)W`mnkv}s{PYfu8#|w81!8t`mOm!-_=pI+ z=m at yG4Acq?Oco0FpVS(Y#l_Y2R zc=WKqKz+f!$(a|ts=8IFwlO1~KDgA%!iSvWvJgiw7(7-1th0<={u^?PJAqXUpyRWC6u_abwg*+D=YsT2+E3aPK|;}!L} zwJ$(}Fuy1kQL%Bj!d@)B^f<^N+_4H;dg-ag&2xsggK>+~R{uhhzAF|5-*78kRs$CbY zk|2VJAZpz%u at s`hKn4OovE)z~GI8vJYeRSOHfyIA|7QYRMkIpdUwgh~(pgYre9T|u zcAe#UpWbGEJv?2p1DMuao{!1Ef!$uUptztIPTER}HDlpfWGp3ymKy4X$2En4!osuC zFa->(|M5kvTk}MTj4(V8jUc*>fSp5B{LB%rgTQ?E+<_FLcf;oHCd2 at v2LGgOzub1O zvBL4{ZJtc1^JHXfunn75o_jeohZzd(OB~@HtOKu)G%q-OGb-Pxh;&F_yNu#&@brxj z&)X)SaJlvx?pA0F4m$w}R7OV&jqPvOQL^|d^{l?wYD9l6sVY|>5%d%vwxtMr6kXJ+ zlvtPLx(RnPA~Gf^n-AQ8tdiZ*<;I>r_15l|^g8o-xU~sU4m~t|)J7P*S}DNXG at 42d z&+B+raaIZlM5MvQ7)}U;l(EuayN5Uet212hH)bhTi6TMAjS at 1>cR{Yq{!wm zTt9caT|)1WaH?gPcApw)@Q|F)qKy)^8+(2Pv7i62rq at 2#a at E`jz2^J_kDXvWAyeBy zC at yK334zIK~OhfI5VQTMV`P9UmBz^=eT!7K1% z`5wE^rTeHDrB at iv&|l#RW0n?|z$8t6{uboIcZFB at l6=@vcxh^ysD{j$5 at CqOj+$OI zhG7RtmGpJ4rqK6L5?%U7p#BZB2Y-%|naYw9s~A+m!sTMOq$5iLhe1ApvnGeAOP@>Z zwu?$aIWlctmyn=AB9pX8k54_Fu&14|^d5ME1><(#ZqXoAuIT-T=b at m`A)*dAWwe^?| zC#RJlLhV<^M26y=0iT~eGv_f96w?w5BTUepvM*UfOUJY``J>Bw!?F1-wbJC0EI6}x zO_QZnTBMF~*jc0-muk~xa>@8kv!!MuUVS}m^_ at B&3L*){*^)WiqczJ+0<{)zx4Se= zC7uT>{!P5yXVJG(S(jsYVZHL0c57pyO;$Tjbob6Sq{Pu)ePhX}+$`1DeTAV$iP_1g zBtA=Lby{|cfzvPipsl5O*4Bqm(Uf9{dCMa_M+(xEC>!PG4pYUG!7i0{s)jpB653hl zxutAQqcg4}%4)B1mqawvW}J at c1G>0ruTeL{u*?wA7Gk{?!Qc`~oZgtvDevWLtxo at I z!k_8EH)4%_2>Lh;q_8ZiYz_G?Y3a(PfEYBgeTh}$}J!)V at smEjq zM_Uw~UuK62t&t=cZtVFtMaB78RMZwm;)BizRTGSFA7b03?+_v?VGOiA>dm={MYTPE zfpC63- zZ*v3WYT8@}@qR)}l%G8P>gWs-#ahlo2w|bQD20vc+bu{vA|za#9zmzUU)bG0}qckkuhWp8H|Kx at _Y!1pXWv#nF2pYLNj^Xax9FWpUz1{d(asI6Krow+?TpL zZi1QO(^``~lA2{{1xCAOL1zxrsE)6n zn6)lHvvkK5;svi#JZelfm?+nn7xP=sxFc;z*0xw}b74~ZGER^?iC|~jR3hB@ z<1!G7U8NbL{a`{O+z^Pfx&Uj-O7rYm4kErXjm7RGJkLq$qD)WM1j7o+m$pgv{4!6D z^W({DL8ZEtiLrBNdw<83s!0KU=DPBv`%h(ACMfNOl&>B;KMClY-3ApSh&EzExSbkp zSYw;YGQH{)+6)6i9LtnTo8HOkY_D3yw|@Q=!-9tcT!OY4g;kXS$CDac>v2EM7?R1 z-6DT&%#_-41Gt(}S-KNym*`zctaKO^20u at KVL^g7EDxNRFsgMmBw_X5TA52LP5N{D z25%u)C%DbgoG6n9&n1e8Q1P_~aNUrYrZdt0$zK;=$;;|2D~|qp9eOhrK+AUw{P?-_ z1JYvhrJ(%5_5qcGTAO)kz6Zv&$}Lm7pEA_JhS;5bZ1SH(ksO~+_FK7f4v85ej2 zh!$+10v4)foFRMVl`;hu at IjobVtS~sA+hNlUMr9k`wVOHq>W>`OT}3{((}fC%a4S* znphpceTqae)`R(uuvBc+dNe%NmkR-c2oQf?XlP=7DCdAOi&F;oPJ8;AQWo1U+2s^6 z*#vm!MM>G{p()7~%7dfTRsRENK_;*)bXP0~qLGlm5q1g&{9V>NyzF0ocF$OeC=URi znKAFk><_4wS<~5z4U8FKhF?zh%&BPi!k~c=ygnwKUAS)`e?M8Zxb&7|f1=ZFkpFhv z%|A}oKc?WtZ_BO!C2aaDk4Tp-*Z4~d+?g7ZO_0sfO)#_>TdAl#0exVydSgN=N=e)a z_xl#KE3+kr=TF{+#)LVj69p7XzNgz~?qNQ@?yrvzupQp!3XPt05D0oam0COF{-NS1 zvH%=RT2<#vN>U at Or;#(eiFuVmHa$if7rICb>q+`gODYH at Nv9EotyNyr+O|=3!L}|H zqu8hrp`05-nQSe7D0i>1rio?c5>qiI)0K;m(Upk!@8Ln>^A7nPNb=%aF7XQ`Kl at h) zCbKqQF%{(qNd{$$DVNpaK6j*#V=>t~l|i}@&vR~_t_F2P_1p$r2)j&$g8HTdR0F=x z=W!&z+HRh at JURW$yX90Cix!p78dp)`U6UdW#z~_nmpsp|{1Dr53Eb_9fUwu?5Thn& z##}nah&Oyas?7;DCuV{Dam-xR&ReIS`&lE1?isLC$a~^r0#Lu1YG6RKuYqj!=E`YX z&p(>#W|DGu=(&ki!`BpZ-JL|JrA|-02^|_6SnWZMx at rO%*C0C24IVBW+ie3ggrF9B;x2+SlOZY~0ptXg2tCX~$my17k{~Zeg zCWc`5f8pTIE9(Ebi1N2&b&{<*jwtHz7s?#XYPEn=8LNhrupf`YoQkdOJOtEt^vDIa zpXdv1t2Co?CgfLkjXtRSem^Sc=kR&Ox8L)4wpKT3C}WYQZx1FWvf7_NuO_m%6S}`% zf6D`L+G8oVQ1A0xjkd%<2)&66K|>2^MH#_~5+wz0mN4NP=?;POp|sTpPLtYm9OY8FtvDzL}M%E>_Vtt$m+tWm;Z1 zinhWsx}xrv>#xN^AIJV-dY-wQ;gLLm&fWmGXlJ5c-fUc!ejiKLmSi5gj#tv-uBLNopla0)t9YlgkH>C9+{zYc9JPksPr;d-uHzD at ZwcA$ZAD6NFjxoMFlEoJ z$*16}&>*{5X|9e_t~%R&eNtR}EPqU?mBZUVDEK{itcN0div^(8W3%bNKhGiJwQAAS zYKvocgwBKP*DTvUZ|5{VYb~n0&$?!Q8&v!YFCgQ9^wke at FCc)K=aWB0hjHR~0JgJ* zt_`=p>MPqdhw(jm4q65rL(zb#Mb8VRwU0ZwI0ZItbCmtuTa!kwx4orwN7{>Yx6EJn zg7O7>TjE8nm)WaCKvdPgI5!vvdQL+v*H~XjS5P=I*dK&PeMTf=_l%)LoYgh832l9e zHjh>d{nvnz3=(O90eA}9cZL#!ZxOKf!n%gRVZu)ZXMWX+K{_7RP)f96(q9StdK-PG zVCxupZoA~x)wP2;rTodQn)I0PyxfLdy>JNhiNM_sTs|L&*ZeSb-i&QGF7u~#(q%3l zcww?!etP_P-mfi!s!fl2hbXSjo)r%?ZVfu$XLmb~551Tc)lah7wz-E;su5|YRkYu5 z%FgP<&f79K-1ZWBa-ZdFDh<4w1$p zrCWD2-%yDr_n^IF!sedbpBaSs3Dfnw;Dmx=@{zquEq;dYQ61@`>c#>c($c19dqy$q zibUt5gXhLev{L3(EdQcHNP2}+!YB||O#4UXMc$pqzt=h#9gIUS^%f}2irA=X>WD-`Oxiz>|IND`Ha06)U8LrB^{eI{Y>54ZkAM+QvG?tDKlgyH((>@Ee zq#92!wXU-%$};9GIxpwcQjsEU`ab&rn9>M6h9l8e*-xdz^ytVkX>UZeS6yL4Kx_m`QArQ)RKnT^!(jg_0=#c_nPUTf6=D at k@buJ%}2gxmy916%wtc&sN-iqs&@IS4FXzyia8za?!Awc2Xn(PZAlj#x!-0b&(QRr42I#{p_J)mRej z?i7`J%F=^2;w?>93`6 at o=OnQZ4VP}nEySC$!cVyGg7!0s}U&8rs;UkTG4QOu)`Af1|(K&qar^auA zqWCYT%4uXL%xQcjAxz$a`eP4h-n8?Wy0Mml at l0^@6-;nSLPONAEC|1u at Cx>kbw6S} znENz9EM=!~4&BC2ZSRP83-%5d0K*F{$Lx+`2AfSt3>AqBfMNq|x0XohjYt_|#Zl@? zxAJ~J7P2C z1%VIKIrMW+8Kny-ccbojx8mPWtUSd-1c6sbk=#Kl2w-_l5ZsDOy;w1w3*=oVYbO+# zyaHldoG+4!njZH^iYM`}@|5R9FVv8~7(1dVK!Qv at ibl|kN_4j at J<)R5yXc{o0B`-FpE+5vu+SMpKuCnDrC!v^4vGgkx$Ohw7~hRb z4~~wT+Nu2aoU(3a&v8+AB6Gu+>@RX(jPNQJl=!FI{g at -IR|c||-W<3QbPfUPoYbV5*N%I9u1H6E6(2?3ymwAPwJlw3htl4RO|nT zV-W?||8O!j`S*OAyoy81ePQApa;@40-|T4cutsbeSsi%)KJ`{0(sf6M=@x zpeTmVZ<|JA*cONtyjQF;XTx})e%3 at r+ulZsSq@h=V2J%n%(v?!F=8(a!DDl$vGzsI z at PmuVFm<*4;!LE`wK{So+Stb>G2PB8T9yVdu(Oned}}w7AcEMw3h8{%)MOXZSHLzm zc79X1Z~Gn==57GrbS7D3MKCkuQw~hhr1f@^3KvY|u!`n~RMl2r+ffXqnU#0J4`Va2 zb_zcTA7qsQFKkyN7CBZYw=ZxZjbruNz_~Q_3g)ILGCD|eq%&b$8weJha1A-cU_E_b z__Vb;{d$TOVC;kjoJG}t^B$34kVPl{?P+vY9I1Ckd=nkl_5vs(3+vXcK}xx zP*)jUz at L$F1ymf${0RAXJoKgQqJseg0r7$Ux8sukCp`Qk(VDO=ha!kN)V)flYY~x1 zrAjH~M@)-h7s)vELQW~tD5)$%DEna7hPM`UDZ|`eu~YE^v~`9ihVs`KvFuef(Wux5 zBe$uE>}&SzG~WBm_v0F%D+7`M7IeHsrrO%XUbqeC+Kb!^gTY>^{<-=6JZMq3^Y6$m zRj;FVxN!Rx^mG0Qn2vCiL0j+u%op&=ny~ctr`2`4BdAN;irA~nsRQN>a_W`%_EQYy_ z2ra2-*eLd`up*3CDL#|bxV=evdg{fsFNp%wG5snwI=OU=Vc}iT{Pox)nvY)xNvxPm zo>WWOE4NXvj}aT2daE-Em-F_|+L7{|5i3Ry zQ;`ZCjI)wqQAAP?v)t9nZLm@%Wh9*tS6rtaCxt39*4rE- at V&qoRt#yk+U$ z7 at Qh*;u^&$;yx_^fldHe78vxI2X(LEU3f7AO4K1b#(T=`!mIns>m6!`&d$@`!39cG z$H}2H5DvlJ9)n$X!^l3E7>}tIUienAF#m$l;Zbfsme2Do$wcE)Op1>m8_vX$5S)>5 zu^L{)iz0qxg1j&Rt{~B{wV=MlgmWpGTWZvV9^I14(xDyaB#yueZ)lF3V{VN7 at pl<< z)#T{930El7+~GOg*m1b?GY2!DT<5K0N*8x(I7ADJl!nm;vo9tH`nMeJxWYiEjLF?-yFk|{aTTWPMB2-OpEVkR)7bd+_CA?L z280l0)-7S&_XGc7)c(X3=ej}rV_!LGcez!&Y4NW^q0V=DcY0}Jv}U+zd1?qb*&QWi z29*gkM5>u{!?aYUJnw at OqGEU8C7rME4fFIv``{t8GwfV&h>XIGd`^3Z4xEZoV00|? zGqTM7*D&+(DL=0u-^?^L+QnM3!`r)oz-aMi<5QS$^ChjT7$yGg5C4sjfG*>%q&ZK2 zFc at lZbXpyf7t1^e>uL#WwSzgD9R5-BNpuvxR1^%eJyxCUP&bNSn)h8K+cjL|6dzjl z0FGmZ&Qjd!6$dr6|9+^}f51!T$G;NSf5MldtTc`y zDlh$g+NnxOQ`4-^_XxW9pLp%m8sQY7P>QkPghdf4CKAQpnPahF_6SC#PQEMzdzC2m z5KdyKI1RN)=XPLOA)l7H zXwIidy@)o62W5HW?gU&Q>;V{{z5Mq%?o@%kx{2L+E4GQ(?NZ|vD%iDvlVx0|luZkl zadKQiVbdD(6Z6MKPE*C%9r%XK6ZC2^$_=E0o-^q0Dx3{>lVCuKgUWk`I)R~7Fm5=3 zdG&1L=&c&TvzCZ=%2)zn-)L4AC{fl5TE%=zUSaYze}~Pns*-Xz)7_fnJkahn-~KFD zO-I6^Oa3M{rds<|u;CP7EpXr5jbTRi3w~u_a;O!m3Y)t1f$8{>_kD?PF`b=4wi_?! z3>xqh)CX=HQ#abuw_>DYY{Oj5{KPb8re^Xd;BHADcV$Va(l_x`(y>lhu^RH3f6egD zR?G-`qvX{nesW?R{$eCgW;P8${}LbmylSr2Ud`Q6_!w1Lu%j46L`I23AVD at q_v(qo#Glx-X^Wpb z(}H~Yc_R?H+kK;nBCCQNb<*IQ2)OFp%aO4OueJhJr&Oy4E0XE*hyI-6K8(U4X|~rat~8h)>(x`xTu!$T&~rNR&J!+Daw^)p;PYZj&7I$eU%5odigA2vpnMyUURy37+Us}v#UKws*bz6!*aF8t?#b8f* zO%zavTJ5Gapg?^ z*!?2tTRg4@=n1~`Fyyg zxmZ=#h0?|?u$x?BlKfo&(?AIDjD`^b1 at iU~VXz6fhCsMoPbvOSRdRlk$2bM({`jQg zV;GYeL3|`J$SgIR%zQ{D=yE3^$;_ at 6d<0Y2YQqcOe{{??PLD_#r~_H z(Uhg+wUq{Re#!o3DZE)bbib#TuHKDHTExj8u}M2laZLHKNQ0#BIHMKa^Bk~Fj&cXlUn$vGCQXu;< zn-q9ju>(D}TM{%<&eDIQL%>*WN0j&mx#sHAZ*>>B(%mmX8<@01ZfQCG77l#{U9-8cU6y0qf6cGDed7T&t76q;jE zCzv7vi$WWb!tp{SwsGNmIA3X3dfZw~IWrgp+D7XiNI)-eIaqxBy!seXLz$K^Xt!mJ zjyK$n>xL^44i>`6f<6#a8obc`685M_x{ji?U$S#<2hKSCNgd+NRJksD{R10Kd#@f2e60AiP9ar z3I9cep&>EU?(Ri24QW#(mpP$=@sW?k_vFB=+`;UadB{2bq_898kl)j0Ss?<&{IR*; zF>$HchkI0K&<|k(iKcSd6iTW_dq3)A4fX>5cN^(R?z=1ev5^b#f2HyIpKT;$>TLLr z;-BL9U#8(TCa9}gdutAT5ontyq|+T_Srn3yLI!gnvcwgVil?+yI<0BF0r{Y~g%95Z z<+7jd?B_k6$V#iZj*$max1e58uC3YmnRgZLg?yuj>J+?2JN+>p$A6EtCYNod*q4)U z$r9O`Tugl5AW^6sjH2wgup%$K`1PX{ei}ekffGD75#v;UL6ZkBf(zzEIU_sif)yPO zmdy|4F4obo*M)Q+h}-#^ic(glnS5!fx81DQdF=N120#RB-h3J?G3m0#v9X~=;(K&nM=!LQlpqoK46DjMN%rkp zw9W{h&r~1OlIh8mCDL6RjUkgOEmpBlzo2aG5;9H-Sc%cJMF;5-1EQ^;6oaaOI^8-} z5L>)Av!~wBMJHvKr at QB#oG4{L_c$kmQC?y;BZgCu^xD>dNhMq6diIKG0rq|MF%zS| z0k5rmnVoj6b1dboSg^S91%fi`x37=>gd?nl=0OU6u_dNc)?DCNij;B|4J&$Zyp}a> z*BdbGqiMjC{Q$_QecbweeFYhau%B4mC%76hy+UziDD)sOi_OeN at go@{X*8A9iqdJj zmaVaPkS^L8)rDcs3kWuvKXwnn-}4XN+eS$Be^$tUti<|1T1d^(=`YKO{cuzj7ns|l{-N?lvt&H;& z4a|Nut;u3y88*rkV&f at j(hbdeq&W~Hmj-D%`75U>PQj01Um?Ud7g$A!gfQFqiUnjb zy*smArzohv9v2W7Fbf|un7sA8d6FHtzr$3Bx#Bti3*idov3{Kr71adjM3%r7{1879~ua0{qJuI47vj=2;K5F@|lc<9D- zsUnT@?^yA932DywMY&ITi~CzaC3YSQU^p0UP^wdc>bfuDn%&$egaV-|7*59-p54RO zo>RZiueXzCu at dV`1QsOTIya)*+$BASbo?V)~F#BLV zw;>JL0%I`Ul?5OPU`__AJiLI at PNf>AVPh(PvQh9Hfi^a{MT=*Lj2UMO+e<8}dZq@{ zP_s?;@|&5U!AGH#SIck)H5%z9%wu1QkVQsT%8nP0b&Y5EaMx(zPRW==3h|g at a>|CG zXfiysII7QHHX09#J8#ySYL7;bd#EW-NS9};P6*aBiZ6r~Cp}9}w^oO_zgFWeoA6?E z$7icEJsDJnUq$9wI-}<}vuM+fh$=PLP-Hj?)r`u=_pt&kC!o$B; zWZt_Yz=T+tvFo&rgfiL0Bb!W%F3xb`){v$;&Z!Nl%tK3pLD_DNI9k*I8BsZ9n_po$ zyqeDQ4CNU&lO+_N3=EKRE|iG`vMko4WxXP;VktUqGTV|qhQSRPdqy}B7K}DC+HNJrsnRq)}JT0OtR*P!BB3#-MGM%Y`71zU87PTz3COnW04xAg4$ zg at ypW@4;Xa)9vEHlRu at Z7avMvH#P0GmYUxc=T%5cH7h0dk80g(&PN6 at 3Quzsj|xpZ zS^8vqoW at P%S$YaCt0@!7Iuy{vk8Kb~&1_~k=rrG*!%32`2rt?wySTb7p6y5xS;Z*G z)op?w&B!=%e*s6WHJjzxcvDmF&Mhb(RVwJsUW?rrtb|KH0#SO6+t$dKN zs{i_Zt<{{b^-MZK<|kMDP9^J(*D$!0OoqKN)XhldcFez!ROy0S5BFnSv<(INH%Ixm zLY&b!UxGF&TB0%EYIZp~q1f9(BLZ8=3uOvBbF%a7>PtYkRkoeH zmeu|FcVpg`!GXK{46JKeZ%C5!KbLk+K?x2skSK^=$brKYSRQa26uUtAkfMW^Kja-; z(elz%1I^V4Mb4xVS1pB22nzbFNm<0wLnALriULQV)4xK4y-QGpzdm z{_5vV at b6!vUBkZFFX9_2(R28+caGJzT+fWB+2$NCpt2Pf8K+m8g3gXua1|DA{9I(4 z8t$fu4i%>1wfcfEtK5-^=f3Qh*W|hwqsv?v2>mcAMqQ2rn(BOLD>(&`go4|Zsp)MQ z4xwW^oPaN;kFK0wXj at g`eb$bw^?f*Qt?~c4U*Rua|3-AhzW8V5`R#w?_5VcYf83g~ zv*RC*H+TO>T3uey3Rn=al5Hr;Bh-!GfQJJBQwb?Z%!%o^f)ROcf_a)1x2YMRKTd=& zQt-WVj|lWOw#yk!)J5H!fWI3^W>$Vic7|l5o4ecH$Y<84zqk at IreIO+y23S$Mp4yEb2P&Yui3=z%$gEVh zMNs>tsurEgKOUv+{oCJn3fgRcG7}UCNEHeQi1xqVDbc?k{;^&E{xzyPia4rIa)*sX zaySxbTzY7;5OSz(9+lhP`f9_il!eb`3$C+haj)&Zr zV)w(tlnESBpq2d8)JB^7Q5Vni)TI8`#~b%g`C1$iAbn5EVp>C;gs9Qo)5n~A6ZeKhp@`_FG+?zfBq$=}YQP$BJ2*a`Q8-BbZIM4- zr-DJd3)b9^Bp|0ROW&>L6ehhK8Qc3=%roU8CMY#Hp?Fc1M}8|dLHC2!=kImvc6GVSVv92v(iR9USVuA+;|hSIIhy)NxMvi$Yp85l}52Tiu> z at 4%(wH5w=C*N6CW<0N6!WK-jy?&9{*vh zRFCpHUh!WtN-N8t#g>&SR1`JC?;4BU2DS-(upCR_#^+{wLgHTn zSwm-Zx-h5)08y zoU_O0nz(zv&>sA*bSn5m)vU?O%Ze>IXK5nRP5Uw9>&kYB at LBUKnifLU?7@)06m^nr zv;2ow;%Bx_YJkx+_dYkV^0m0Yi)_~OXWFpK+Lf20a1q|DnotYa_SH0|qA1GRtcLTU zSq@%$P(4a=9I=~8MYdHzkUex4HH*tc(HCV^37x49>PiD&z9xtdA9 at nwK36}gjjulKNMAJ8I6)=SSF{$1 zjbz`+(6AU7PCuzx*Q8xpLfIM?8HQ5uFIjX9^FQahZHY0Y8&Qx>42B^WFmlSom!)@c z$^|q043~hu4-sjI>EhD?DM~9W3B0+ajpmQW1obBu1)Zw8TTcH{xnvHH-q z1hW7zrYQE^qIv|ysvt&xIxji&A8|p7UNR-KW(Q^CxlMxBTGl6I{=&|ST2^3#pGE)7^>@03UZdv7;ShN_888&zH_Z2s z at FjeJC8FyTJfU!SP{KSXED12e9|B{fpYJwe9Uy{+ePCbl0~0EmiNX at vED|t>N)iKq zE{)j~hreGL%7=7MExjZ|-jj$;Mk0cXPb8vsm|N)ssYHqwS3-15FrlB!dQil0m}eq^ z1oqe-S`>9~aHMFoXCFn~mTwAt0b?WSP$+-a;YR)eRy}1ZMm>`o6##+GVJ99mjUk?>yqZ&yb(FB}jNnJU*o&*9WnkHE)V|Ak1Rq zfxGEgCa at ZjJ7^=~b|_1y=E zAKC%W#fVCxLIU;u?Pbd;rsjvw=i3uV4_h;K>8>9Pge=54-IzsNAdmCSNN;cex-czw zyyZDo{}JI_0^t&uoQS}YNQFQqWKxhj_J#JoY4(+ZfIL;&B~#-%jHt61Y*H6KOmLE) z%APJCR1oKZq0q>gfH)791IeWaxLW0Ra0bAS#J|)-SkMA(Xya>}WQoV?Mlh?JxdV)S z`T}?oBpFb#E?I(^)Og0>NY5s(pXp?8(kmQ at C#L8WtFl7Kbq0F{0W`!Jf?sf-0c;0l zkioCc=@Nz>U-bRZ4k29ZaR5@=$K+|4+XY9Z*=N%E+L4A37gauC$<~nm&eo{sJCHt&3lRRpJo8yR{nT|qeSR9zx`NL*zl1gO) z?ge5OhV5U+dBODazd&PVOzZV>Md){2bG*KtXXibnsgdgB)rs*51fyYh_POrvW82Kn zGLDWj at szAyEp``t?7}9=JKYk{4=kJCvP0)&eB$43q*Fp!H1jQ9sjD1I(uJ2!Nl-DT zueT^qxH;4aT+g>?g%*7w4&LMZ9WuHT#%Q;HAma=AzlRLdze1){dED-=zNdr~l>IqG zt*saV6#&pSJph56>KP9bCC#BC?FkLh%Fp;WtBJ~`j#Tfu~5=s{t_PH73tZTjKqjapByU5 zGoT@{vJ<73nzoV9$5=l&+?)#ueF-bQ^~E|(Hro+RgxC=9t{(qeXbMAob(NHwx&%a2 zCunQ at Ht&Yne|y>wB0=PaP=D<6i^0 at p^}SBc>sBNkPn)Z1i=|**?3$84T)C|8m^fp= zFUS-A%z~q~u6Ks|YPMIja%PvN at fNniR|hrt(l?E=U+WvT at akpsOtG}-Y?Se2aT=wm z>6=X^^KfdtZQ==Oq1zXX#x-Wq^a8bE*c$dC5P^NR7WuR-O at U~gQL((Lm|;ZztNK^; zU52p=AMFkQ)a^O*r>}DjtRB$72m|#2 zU}&WxAQ(g#R}^!5a8BlUf>)#g-yZ*vwiAel0)^`qm3*RzmAg*2>g!ggsg2j)clQ`S zX)BWz2h4FuCstnkH8YZ((2rokjX9EiSnJcASs#EmiZ9q0pBOzSTz|EF?)7C z6r at BTh+>Qd(-wW$D(z4thwT%Kol=#CCEcogCb>6YTA at 3ZYYn1y$I0Cu(g{jKsTaD%tX(S9Vk6uhMuQIkBv7S=e?t9Qir zawm at cEBw{`;JU5n*N>jT?wv6=V0q^N>lg~>fFD}{mdB%&R?q}Y{82HQPbjNWL$Qjs zPapr}a6EIxzCb|#b;$nz76UB*z<{c*GL9;ykDNrkqy}_ijOBvQ3b3pMVPkWtUp{IX z7)Yr~c{A1c5sQtkD{}^1bLW#fU|(ZcP&_MdzY(3DOV525;nrLur$I7SfGc72VA69d z=J+=cx$oEeFf$NFExtI$9TaZA3h;bOd=Ko_*}!_L>OncN6ZY2W0FN0;=x#dkHQ9-? zZohx9s9$NfrD`x4XfRB1dlGf4-Domry>@j%!us4TdwJ4Ehf%c}wX$<+Gwyf}l0?zk zokR^(;PFO2>It1jv`)31t;BV3ouRU0$4+{1rx_rbYdOd;DIN&)0c<#KE7MkmDn9=H z5)`*>;Cp|wH7eLtF|=EhEr~gf93 at 7NOp$eb`H$6B)zf)4qfJJc;7eX3Y25z%;MAik zH7;$gg)lI`SWz;gwV?nA8->-I)Np~6Q?6oiZ!7?$1uIx08mfDAoS|xKHB+C8i){p|J%0O3vMB-l_b&X_VLbfJ|*_)cp8Qf(>tmb9meDi$vTm3qM7 at YG7CJxBcdw5 zAGav%QklB;DU3mnS936J3S-Tx3l^pkf1y(gYYC5E6que_^dDeju6jo at 8bvA-6w`%- z8K_}+m~qBL94v^`ERbUpOxEtp=UzACo)}D8 at Sk$%?K6df?Cf%Vn96{6*X&0LJd>S< z8DO;p`q6)a{GCgb9|7OA|M-(=;QwkU-2crb|MH-2>1^@03wzdIMK1+J-udFFsMG#8 zAHUp)=5Rqob}0<>BB9wJC5N=e6gJXUKb|*zy6~Mogqwna*0RloAW?9$sSR$YqlwNO z{c8fCsoEceA&j_lVR;N0A3!XNvgD98*`XUtiZ+tE9gA?-p(fXU%mulh>H050zxgX%wJ2?ncaijw zuipkL;XK&XScg=P`NB5=PQ(JGr0y?<`k!Pv-N}m}wX^X={i*3bQ5~{G#P3-;(rz)o z8_I9AS?M^axtAxi7#b{#;J1a5qB>t7O?@#3W2E}B2sIaH at 7sUl!@apadKqUfrC^Pu zl0pOoI=Bd;uE!mZVprG)_{;2 at _+MDBX_@Go630SBd7(<=i+q#v@?o$wt^lS~ zGNurvS#*#FC9|0pGBKzXSgB7MoP zT&!Po#Uery;kIpXLVXjF6#5P&NGyqnoM)izJ=*oXB4g79fv~yxseY at fsR_*X(((ch z8Y+%z1*EFers?UfyxHn{yg^M_RW-Q?Lt#Aaz?9Tq5#ZVtNx9ybZnDfSv8M>qh+WOviIQ z5B*AD@*)oB8{eD5`Y{-#^`Q#xn=rk-`2z7-wyTf*c_{|+xj)3!QMlV} zS2;X>=PpX2mvs7d$k1zj=dP=} zXno*d%zbJ%R#b+4h;*0Xme#xC>Rb7v0Oo>h4Qv7{`KlicU0s#v$c(9*Yz0 z5!R7PuAEffL;SAu=u3>Bvjr7b9vP-OVhl9%?C2hkbjH^GmQATpY{yLOgQcAit&x*M z;_X022t!C}>0z%>3)WO$wtj7l?Hi-NS8hNI*NevJ`Fl3CG6t!>^<0S$LMoKG at XZ)Z z{x zu2DNxY{e`Pqs+2+{EnV at LPFcduqaYPLTatyvkf!oCEdHVBS?c(q3ajC7qEwq+xI{E~UT%8DpUF zR;#Qu-epRZj~WGv^1d~}cwRg=t1J}TIzDq!hUuHWp4p9~Wa?zt<(aLV<`DRp!@^tq z@?K-8yH z|I#S!o&ytx4WwwgIB$KfiNCZIc_Fm8%&Z=RpIR-gH+2a;yTw)W(8TyRB_ at aGwp*u? zU!tEc(o)2$Pd>I=#;(I)bs4>nNI3Mv)P6>>SGEcvzD^G!OCR2NvSaMd4 z?e}J85gwuL at O;9_N5n|hhFhbj^~s2IWr1Ldy`qXwRRrc;IzX;XBINsQ1dZS3wzSMd z#M!;DuG)k`!m?q*)Xz?YW5k%9sS4A$&}JuKIn_^DBEnsC!pC1qqq;Y6_CJ4m$kR;- zB+E5eM$0)_;uAcWa%BlRv2ZDq(@!oN=1LcUanTlvV$&{JLeVakij*i(&6nzwKyQ>O zlhV$YN|hX{RLw(cNv7I4ah^6xCEpDNl|@hQ-g9M;^H>>xc`bdL>R^;q?H}G$VCxRsg zFn4T9729iVjy_n(r0X%5C;GW`1+-b#%9SBp9Hj_+of?=(v3O?>_nJ9F_VwkJHtr at 9 z)x42i6C=G3S3A+$B1<(Fkq|;aeB4P*bl}$m>WE9_6V5S~N=*atjC4K0(A5q>Pi_teH?Qs5qlYDmG7!UvlC)s)x}z+7 at h(>i?XyKV09E~GybHie#o_)6qn({hOrF=^|j>MGWmsBLYku`&b<5&Lg3 zuSX$Go}CdsRv9Ut|ptsmGLYt*cO#iV6nAaJTh`H2E{#{#}!AcsNO09qhM+H!gd#C5O_+i!P*X->!mFXgcna|d-cYX>>x1(6izw3_ zb4xgtzx)=sC6Nt&$$_nU$Vex`$_Kq_ at Ny*_0%=%yEItj&mR7nDgRRLh zJfDh&dt{9uP>;_aOcS%WkH&@oVXh$6Z+K1wqgVvP2uPh`_F5{u7+p_6q6W8DsZTGkRauB5cn(`!v(6aQl*s^y%BtQ}gROu{*QU-`4QdK-{nA5*urMwq~J={<^(NH?Jf18|BBfHO$C&~o? zUIj=NzU1_RoZcq^_{DiEVs*w%YKBY#*sBjDEJRVZ0-hZ=XpUpsp|8!Ij+wd$dLT5} zGO~b=(P3~AstwcBnVkuaR+)8JrG=KU zu?St^QY at a^jh(Reqf24MSCG=p5HI+pH9XV9{!*O2wR)n3n7&r*)(`J6G_SNpU$7!T zlJGq%+k*?s9vt5+d5gxxp3u7Ax3QtcgFctUf*o&eCoI_8sFpAgFO&{wsi;@$6*zS! zmLi({f|j&zsnHP&<-$KDzIk^pfWs=obMK=cjTqro_YL1dEy)o+J7&bX%1W(OLCfWR zeV^wpw5g9ClG8&HpW1tw#OZ4tuDyc9c1=`=EpUL8-Is at u6-Gj%knVu$O4Mth=`0)$ zidZ{tRx$GkEDQQX-YOBeZ191c^xWkjM2YTSVFltaftS$4HYSscBMs1`|7Wf zByB`1MOw8N~E;*WS>1TL*k;%d6oecwK zu*$CP-}~)(YJSDKnBB*&DZXl*(cMPQ|G}v-i|0;Tb^YkRORP5;>E>m@#y=b at txZRd@AHei zm8ms;XG_Gp+RTQO#kXD0%xYc}*u%}$B7+mZ{p_>zaQ%8h|IK+Bsmoo>KJ at +Y{^O5k zg?icD60;;$N^O$o>l~P5*s at JUf#2C-Q@?@Tt3G(;52Di5Z-Dtv$c zUO+w1o4s?q#oFn1WmbuYwe=K^y0R2oySMe38}HaJk|Y1jWL#x}p5mrEC+w%MT^;_^ z&$_2x`CaoVXEjsrR}Go9>48$q{O7tghr?E%H<+=(eY2a2%aSf#qpf2Toq`V4)EA_< z&KqRRJN0Gw!iN at j2L*XI$QVyQ!ZBBtk=85RxMzaq$T=1jwi_e2jz3px%v9_Cdg42k zq?iSE{K*y1HukBP6RufS)0W7tpjJOg5M?R+8`2gP#hq!#<%GoXc;Huph3N0pI9?uZ z7sjg3t+{XiYT~U-o$>aw_#a>IonB%and at k>Lq87o;5mt&TB<}&*%&X{>BK6;kwhK>kjN+o-(M<Ehota<#ILPTsKCLAC zhX%MYlQvV<&bMT-$FtGbYiIL3pTGI>RQsGlYmPkAZE>{JNLe%Gj991P^A?}Kdh6Tm zyJmrI{A)GwTWjWhQEF%&xlaE>_BZQ${h#|QZ&$kaNO}3`KA*2eR6Gl+ntmqP;ML9J zwOLQC at _tI&&AZXXY}2i1t08B+;{!R~R_Vo0LX5w+MnqWjSp49_&X_F;yYtQsbmIrS zUF))&n;7_Z;CrhL{E-!hbvbZx4CvJ zM{NuqQGTth_g=$`U7U0?hTlGTJ?5+0S>>hkqvmcMbiM0=<)+pPydPGNi4K#VEZx|A zt24u=cYnR=Tk>k&7K#^lDBL~LV^WT8uJV(JA*)zE$hUBMf=C?i`z2R=IDOAn0`h{b~4+I_Gks{8dmMRaqPy{ zGg?~b7x%1pT5j36BPssTGf%7MwVH3A-}xrDz&bxPqa;99;p&-#>7~>3+?4mOY&`yI zb+6z=E$j0eZ7o0hy%~S|jf9(1lJBYdaa>$Buqaq!(bmqX?0!-st`*tpMVu*sSI z*->>VQ>skN;wtk~j`QY at a=$Bgi+OiXwMVLD8hfbW?!&C1pLC`_P#u%mQ1n{QEQ{?t zTXW=AW38o$J$pHy;*P0Vx at F*r>2tOnc{NGd?M`5{pIgw2Eia7@$L1e9R6JnE<(psC z-5TW1joYa$*U4Wi#qu{xzTOz4+jri#FnOhm18%>tcRB69pinb+Koh_J(rq{T zxXoB|dZcagn%G>+gEwyvOuE at RusD3&icy1YW^8Owt&BHSU1^$~-^#9j&Imp=?CM0$ z_^}_Q`#v7F>F{i~tRVGKDkVPiPBzKx7_G0fbD)~x(zBQQ*_BD`nzO0YJ#C{*k%aI~ z9?j-KAFDwtUXWrihKLvhV?nn>&-`?$7ty zV|)5XAC0M6uM)!f^6p^c;}M+MFJ_&5{K(jDcIk%$n_T=%^Ho=UPU~kiG4si-7tSd! zdtFG8*cq at QcCuN^lAQH at GjrBIG20$9Wlzarr(>S2?(bgfx?Y{IHth773+g{pTPDr- zDmL3%eg9w&)_{Go%IxY*ttZ}&cZ_BUV4{I=Vc!(YaT`ymMEs z7H%DMdY7^65a}ChS3l)kKbCd$@PkP)C&sNE!P;Nu=(zCb={;_}wuZ&usXM6V9&NxG zx4f`oLv~@h-;^}#S|#=Eo$Ci(mx;Kbb}&hQtlTS!Y01@}p7C^x$M`#s at Lbm#nY(h| zs_ee3Nj<{9S{K-t4_VgsVc8tx*sliy8g+D!WJB+j-94&VDnTn6UcFdF|A~l*lK6Uwd-vb6Az{E(D?1qr+?V z=t1kaAkSbJ)3A`=0pEc>niF;BSt#5)7^SpCI{MbMUi-g{we*VgmpY_AW2fUF=^5|x zt~^U0#JPU|$JEy*?@ya6R+&{b28Mq%|7thAF7|Npo-Q6AdpB*dp8fE7;=@(3o^5TP zK8;~qeY|jqORf5 at oN43jy1DIe-Z9{+hv|Pi8)mEYAC$@+SX}Mc_%Un9KE3^?w>KPL zGNZQ31-*G*GbTC&+N4;sCg`5rlGOOMC~>MDbLz+?Pk94dMwLp144dLLe#m*%h|)S9 z_gy!q_};TVHSWqA-NARFtE(xA%q#q*%u`Mxf`yvk?sUVbry z>kRqs56$!zhJTpww7X0HsDaMawS6y|drrSQ>+U_)!>m)UD%?-MowDml^sM6vtNLo% z)a<&O!mT><`e*Te&B~o#M>Y;U{wXSBXUoRk+EndrKc_FI!otF^p)F*iyQOwy<_H??=*gK zaM--5-z?&)%${?m${xSc-|3XZlV^>RA&X_g9GtqWiwihsJ^lQnnd{!2%n4Bpj|)xD z-T!_xyR(sf(aLWl=9Mg2IZAOvicv-uGjq!hz71pWp1akR=dzN%AH1#@wzOiu{>Xa$ zbd{#JZuDlbE|pwm*sC44!7Q&lG~>w<NL z*|}}N++BvQNl{(;tiLE7XgPUMy~eeGm$NjRl=YpClyy3;tI)PS^jq&~v&ZfWX}PMi zYFlgOTG{l$t2gIu+ at 2=?7WWki* z+ at -;zN64JrMz$M2tAtNWus-gT%xb-u)!6?3r4|`EJY)NA`^Jylqv3D0*u!;Q<7j8? zV2AVp2f#l?S&b==Pq%!Rt#d4 at yKJy5x%9=)QiIXGMjHRu{O2|dgE0~e2aJFIPYwLz z;oxgC*u~S)B$^32z6tUFSRea82IGfu`%q#W9>DaT+cJ46)6S>tdZRb!UIkZX z at J%z#6fNiSL#9v8HaWWbL&T;>)y~*>xg$8fSHhH at Y&AdIgSpQDmfH4(AePph$ zEtk2F=#XWweB*{~PDh`{uAZ#^`HRscmxkN+75O1sde~lV9zPn(g(RE|I&7cM|O>Nf0v8+?|@hi-1(wNT-6`8Y`=hD>Ab-$~)Ga!1{ zrpBCdoq7L#8!PjAncDZy(epf$XK(cD$*3q+F62L-OONN>$X<-yHB< zeUGj0f#s$0bJN$DSnXdnHuq+awdR^x;r2OQ?A9`?yRP5g$?t@>QG;=E-O at FTyy{I1 z^?G+h+hr$*Ejzs0W__saw>v at 7N5%}Tm~XEnS>tkO$xqz``+M=X^c)t4X-^S(IoM_JqK3hmNr-?%yC<`OT>=*ThhrT1QMtG8OmpYU|orI*G^1uJBg z?Ho^7tytA;(%n at qKT!W$`rMy0=eC^8s(o`&>+OB_{*n28p9aPFR~>tDV5t`0W0z}I zQjZ~vD-Bd1_xn5}(1r79sd>a}iSLSAU)x4(I5fNRSn04nt0!M{$V_$}f8N at x>po_! zvj4oX#?d#YmmT_8zA!TIx$W1u*Uyt0jRxt(9)J3_Q~L9W`XNT4uGbTT*waSxIxG7% zrb)cf_xd<<_I-`b=3RHaYHDqnIX>C=sG8=>P70^KAM)K)+})|kc=X9Mx$BIi$z}28 zVcag6FTTHiy!?jLyJpRloa?eHem3!gw2cd#f*+`kR!iFN5U_>g(zr^_=KynC%hv;O z+h(W*4&7?B9#+1X-+%jO+24J*}7cbe_{{!#iqRvYF`9LBI z8`f6pyTshD8q{m#x5%xgAvxy^-VIuICht`5;+<`BHzQ81y#Gl#>Cux%ms%#g-8qBN zbxZZkjR)5=d0i_TH!=qn at N$4bfRr?V%GT;t9GVrD?76{@y^IC=kJG) z(3xmE$e9(h{lG2j=Qai=%a)}*`Cv6l`B6d-zVXt}&z(lAj#^hTVV3&Mz>4Oui_0|U zIt84MPte#fUG8m<)<*gG&d)ogk8HZ7sVjfS at XT__+nc{DT`cKy at A=@LXA5WZM#MC4 z8!$U!bi$9}4~IqbU!IAGInw3C+Ns})g8ZxZ_SUiQY7{vASlHbOz1HxSE|QPXcaexI z?eebtqi zWh!4i7;)ss%C55GjL)3iba&D{Kl`+YJC at q+OrNo}YyE$Is`*Rehku;)Qg>q20ty at Y`s(Mr=y8diu2_M!5$T<73FGfZ#)0k-1 at +z zz^h9@A7sg3HgHuqx@)a5lDxE1x$d_szQUthLsWBbH29Up&e{BmeY>iuWrE zy4&}BD81ez^8U~Z;l_-O<3IFEv+A}mhMoJg#$s~aiWVD}!a&WaWd4zl)i3hdI6W8STk8sLu>BJZ=n& z$7i!*ed5Pma~teB$i-v4bDr-zk3nwN9($|Gy|4Ao)JjX!QXaHlS$V&^idMiPJFPTj zU%e(Q9ev0?mMj=z7cy})n(yLk^5b|Lsj>mP}o3;X^1 z*F0=IT^t>Je2qOE{{@>PVCjFrFKkMFEey#1hLX_Vc*YP~O8om5ha!JbL+CH6N#LzP z{{8zF$luo!`uk&W|9%KJDvA}tC)Lpv(wT{`!wiXFk*ahSQrVBIGL0EaE}}0a(m*W2 z=I~iO4l_zfZ5X1aBc!G;iKoV4kynnkkcKa=2AfOz8NxNQ6jvge$&VoYj_yJtg}5Ry zJa#mj&yHusk{Yb=_k6;YisQ4RNWZ7IkjNk at LXnU^+sib}Ckj_jkbH%#rh5p9Y{wP( z_fk9A2Xz(FdVs6-XNTb5F$q at p{)GWi$G}ey!9Rok5#6>>N1Cjg#xO%7nc=L#Y)%-r zeWL+YZZTz~S<5mQS!(SYTYr_cWyq8r5 at Mp*A#DCQUZ@}|F~0iolw+0}z#yK1;@SzR zZ&M;u|E+59D~kh#kJ9eW at UV#oq{%Yv583~vy;l>D_Itk&B|Vl;^MEfA2Z2lz` zYlug}=hT at lRDA)yeWOWx@{_-udpcA&_^MLZBWe;sJ at o^IHd;tkt{<7I3mBAP%f}k{ zaiY1Q>@YU`>GyB(S&rUg()$Az``0a-zpUE+)K~;f&}Uf9{3c*p+8ANaLDYoJ2)=mD zsL1Z%i at 6x#CC1c*&GCgd7X==d1Hx_?;nzc`2 at k~=4$T|lqX>k at V}wVUQxhJBFMKGk zx4JqIF2D${8b(dn0$+GEv)>F at 6=4|R7nan7E%Aj5I?p-^g)=e2!$(jP9*!^E?DHvj zED%n>2rnB&P1p)w_(!>(#6ck3Cf&YK{a3it7>XTa2vHxY?s4jd3()>1jm}dlwp6w8 zmFHf3fBpmLeX1DcZT1wE3BEa^__2BmQ0{_Je&9$^nV at 5re_EPQ1(bJ4p~_udC at K^5 z>@g466OuqZZ(BWIxlN#;! zpWyugUvB#=RQRm4Dz{aZpkx;@t?_Cc#X2JxwAv&GPgMoVi!jPj-V~JyMy=-hQolB^ z>gng*9-IGHxx|-}GQMom&Y+CJV8%S4*1q!oE33dEm5q*$<3n8!W{iPt9GlpGImr%? z{{|Y>1T2q73Xd^-$^;)U at iU`f41yz<7mW|vr#7ZrSMXz1Pqgl96R3jlm1_s-p3eoX znhzW!dm&|;MU<4?*|B^BZ{T_JVp+n!Bp5IF*+pA5L9;yS#9-J85uKNGjEK*BTF at GD z7W6(7Db&e4lSZ9KrIkK#BIDCQ at 7Sc;p26!csd^=K5~;<7NjJ9jhW2dHe$Mb0aU_#6 z0$)02K*^2SppKk at F}n*%>+hf>ZP)$_K~DVW7=9wozrZJ_%J`+d1~#}=4kgR%rb`y2 z;HOO1IHR)55Rk`6qqgXuN0&^+Lc(@UOCAO4_=`L`VASW+<&oOS)4=9MpacwQ3Dgwh z4$=h?^yA8$A$J~te%wQ=J)_`X1n&?{1U|q%Ax-ZdXqa6}=(M@*Bqe|ki;vg?_zgbG zZznsz3>d;-;1D_k@(f#3we~ zchfls13aZr^E+NbnMlRXyF4 at PmI0bBO%5u#kEC8PZ9ma%3Aj_fD^VTFnw4#ENsZ-~IfEvf4Wj$m!jC;RRjE|@PCX at k*Q z25QG2-?ZWYzk8y zlw-UG+HsaQQPsv*o;4&mY6N^xN3#6^mA}f5TgjAxZ)(qmkF&8jAuI#IF6G~!@lhex zPBHlaHB}0AgAzVdM&V0Ke0<|P4A}5!mG*G$ztY^VBBWytg!EmaW1{dGmtU*Os)Noy zOc5ObKK~TSKq`osqCej-O%pzDq=-7cLBK5#LGj`8_^eQh<#FI9-+d06WACp#?SDyE z~!g-8#$MNC3VK^*tRN&)ckj(bl`yHGV!+L%jRBsBSBkqQ$gE8TSXiWJ|$&v z>8$ynH1B2FqtgFUc6FjnNhF-R7AwBJ=nV?C0miqs_7?5<#%dl0HFemLeSY9=Q>^m5Qn zot4ln#0C>FIDf`leA*JB+Y>Q-Ed at Ml;evq$a^RLHe|5 zOM`xGU<+$1Sc%jmI3lPWT4gc|Xr9M-mitDE)cpNi+izD7T8>}_C7clM=PyeA3Q*c= zsArixx&t_Z9(a;@s0_f=RMFX|#$Fs4KIQg;2f4wZMGBPAb>A0Pk(A%+?K2O#na1=O z7#;&UMLz{}PvFov${;sZA|as0v^uOi0KCF@;yfREC4nvTdom>+A^ES>TeW zp`*XqRB>7Oq!-PNTMU4GY?VhR{o*j%B!c~Gsesa(zs|9RCm5^gA`!rc=5ga$p})H> z$&_jE`h%=XB`P?hM9uHiKaxBz}dGKc5$(MZuIY;@hORm>Nmne%QcvF at TxpI6u9L^P8wb?V=as~ zSfYr|vrz?fNT3PGL5puJxbqT#B9u{=$oeQPkYG9&iQ5rldw&YR-NyL3OHNV4{kyjO z{ad`g0cmCt1Iz2dY~iYn&P=0=#HZo2)Rr_ofx8U5Wzhh;Sr_TEY~XT%xZ?}b`-exA zEd+yAfFjy*Ib|IJ;^X{2=UpiQxJV_`UrM at 4A1As8{OrP5;0P>5LIo|}t_u1*k%p=C zCMCoS;1&V**+~fJc1sK#wcZeON7d5<*i0cNvZ&!6H7J2?ge5Irl?UJF!kon?)QV{v zB%5E5$lY5ZITRGbOBpqfAxqzMlu1yP z0Zk_)frac*KrO_oxno3p-i5&lD`voWFHA_y#*bq1 at IjKNw(QjhKbCYuR|>2zv_bfY zveAY^hXV_Fiy0{HN=Z^e;JEC95y)kF3w&PDK^8T=$+FahaW=X{nEQ(EvQFuM`3S=_ zQ|K_0pqyGEd39R=^BrLN3o-jDcbJL&SH%6!pyYkvE$|_`K);(T^dZ)2|1Tec{~1M2 z8WFca=hy*$HBsm at mTUY!dC}k_A?{@7&jYv?G(_vGt%?85$(8CoH-fk#vQU3MIh- at dttC1)XSveEy7i%;FmzgUq1N_!g2#AZU&k%OsG!2+G6W0vdkdi?0bV5}aGhK_0v zp`=gn*&3d67@(sqmqTy$Otz)-+4$;~Jnb|K&=fl{%f#IdG}PgL5U@T2uA1iou03~0j$_p9gR|GcBih6uif_I!&`V>It^nt%D&XJ$(LbTK{DU8 zKm+&2G;qxXI{E~w$|s}WH-oRgDck-`^CPW z`upFOGywe*vgo#q@>FX20>4WH#jsRjK_zH{^Waw|LKOQD8Weo-zCleXA at IhO3_5&I z3#TTIb36-$gBlm}r~L{P6c$#UPE8o+G!6>q*c4~>1H!sM*hNVAR1`JgKgU47X99tV zdV$}tLzsM=a2JR@*Khf-M{o-cvya%js9nI$Hvz5ftzdqeE?Zl at dTLI0Vgi0*yNn)^S% z;zJ7;-mHYq-%Lzd&o1l`lzh0JRC)gh9FgW at u#$`a7g&OpU0~$s{aWXAKR at tsbvYk)~cYJ z%R|?81WPdMjIOkVC)9%#Q1 at FmTTGh3M-o-Ja$g at BNlCRoKPBvbzuWx3;NnyLzo+e- z2FdSI!tOFS6C?uVa`!>L~#MEH)i>M<%Dd{rOg zw$3{x7>xax%Z4f^$y7zJfgaUNl70=8r(l+n-%gP!i`uSk9o4KPL}4~#PmGt9zx%QL9AlpV?45b at 4y=-XQa_B4C^cOFpg|i6l^`vRbq*(BTf?{TJ=YDGv#qSk4gv9Tj&ENcgg*XE8FajPbc-I2 z-1$f>jNbJ9*A+?Ry2f2`I0TylUBArS3#P!w=4fYrTSJS2FCY0SR!RvJf`u`^XN{EP z{~0c*_2;O>fN^U8(HZn-4YJ~wWCY_GqC}k#6Sl1Wf%rjvo&qz%a)P0nYTN2l(SR|Neuh>xB@%sDEw}6V#Zk3Oe!|4H6HJ&w2N3 zrp6~=R*v%M(&UjTJr0#p)qU?*B?(%rQ4 at 7UEG+2JNPGEM#+b2RK*g;ej7~JGM$y9H z%g0%E|KJO+pmajp=8h{R`9Iz%c`+FK^M0-dHeQ5 at 3STsiCWlJnEVggyECa?yNegt( zmG4athp%5fZ$`r!xErd9n%ZS1J$*-JTtYl3Q7FqNf=y7GWtV#8Yr~ZTW=K235&{v98P6O!wKIaG&Wa<1JOqSYoR9U)zn4NXZ at NHNQu3j=6p{E zb}-i%J#cE_Q6l2Y?vlG14Hi|5Ei$N&c{Yh!LH-y5$!s&pe0R1#pmdQ%N0_R`)F{8* zl~|&nd59U}F)|Nv#22m8|3S}9@!g#^ma^ybkzom()hw9 zXUknOfp7+5Cj9kjHaEPAPN>vn38zpYDDkVAWHGS~cieL~oe z58O$Yflp{HFe(HtE~7{moj~mNP$ZE0Dxux`?(PZZT|EVK*gd?Dn*Q%U{Z1=@f8SRS z9FaBV>L}16E|^2G!3U|a2sYfUy`|S?gE^@clc3`8VKU)A*AJ-n=XX<(^Jnr_%w9e)f&sdfye7K8)8(PKbbQiC zTmDEG1_tly2p`+TKBYzSW^zKg(KaC=tk_tQ)Hgq?=fIS|neyo9r1OFnmHY(xJzwcZ z7HGt-O6ctE^I8lH!S0E~CbRjVERz+{{j1T<=B00~j+{4_L9fZ3x5CN4(zBP|p` zeFc3PmtPF at bus!qKhe at BnEj?4dAb~CRH`Xw zpolItU&)FKBrhWG`^7J|aPwRp^?PHK=o9f7|8-8x1E0@$r-Y8AvKq7)?Y)zPlr6^_ zC!+=YUn|rV3e%xO!dI_2 at Z})PE%8NnY{- zgCq=46mDnV(bV+EO`8sWfv;ZE<-yYixT~#=w)6Wj)YL_JY)$XEU*V1a*Rq&pxDz!3 z;rtYm_Hy;DUpbhCJKI=Sid7GL8Xve4;78Ihtw#lY at JU>E`XsVr%Uq4&-|qgpr7k?? zZ}Fs0B415?8RIf{2XOn8bkL@`=|!1EaQb>?`D8;dov2_grk$HaCjEQsSnz62k( z(xAR!qHHieu{i{dx~6Ynod=MH_nCwjnpP2H(zdaDA9g5EIX2dEP;!>ZNl6V at U0&)wL60&LKG}3!dc^puatJSygoAt z*hElIbf;!P3`J>t;U3>p?)?Y8xe-&pZnH!Pdvb}J&9v-@;$1k8E28x~ZVm-mf)nCd zI+^{zx55{Pkj&)^MTpvjhx1tBgwfLnUU#-B1IiMZM2!!U$dsK}9N_sy396W=Doh54 z#$INwegh=YEC!?g0H?Ug-+2|Gep#fEi;PA31NA0qu3z?+qGZAm#e%2 z>am#j5oTsmXhKKe%5aIcg415Ed;RFw%>-fdIIvcPwilBhfiF64bU}(f_+Yr*CH%qF z>nVtme(;B=mlrMqZJ5dX} zxy|j3MrLf?AyN}xQYN@;`!+C8c2h?!_|QQzNxL|{fh{YFJJTkLU;{cduA5dDpxj** zRo-}9l(Nk4*AWR|vyN5bcvP)U0a{5-~K z1vE~p;;UF3^cUniSZ%MKEIj~<$&p7xKns3$2rv3Tw_JKnaxEzNe=6uLnldSw{|y=+ zZ0CGCyitk4V0A|$IaCzH0pnAWla at QdH~Q*j(Ba-)n~Y+|jU!r!o!1NPqzs1pDVWzw z7V45o`hazH6pPR0kf+v%h~Op9UtWMYSu{{YeGf7O668cS#@Uax8w3;0DoCT3m|6|U zE9UpJn9j`Dh(E1PHP$|3)`=m9VR$v>%IuJSVqgi3`iF^pA9!U}Ujd~IA0P&WV2wM8 z_g1$*p!AeSDZ$2KPzVkqRQj at t_kl*LR7S5RJv0 at ALcVike%b#~ATYWGrs&M~%z{1) zpHb#8AZ9-JvA8Qb;;eHaXGF)u at dZ1RLNI2G!JmKS!wQFk4nBBi)~@Fv&}RUn&Lko5 zeBTa%1sg(t9t`znkw!@e{5&}jenp at X`iRe at NgetMR;UPa at R*$L$)MjI*Fa+m3)aW at lAnWLc?$8ngmjb-ey|B;#t?2OK5v<_M+=Ooy1+-DAUxcKciiay z*%$QUaT5sExXoK zd6COxT%Odj4)F+DPC}<&`aJkN8-`by+94jnVSZ&~MiNYUm4j)&>{T7&5#+yEqP}na zB2YdyrhGS6cZi3Rsb1iJ7{yr6$K at T)>JSeni#_BGHTd?(G7ssbJy0oPTd2lxm=pk}xfX7kat!`SB7WG#PCtLoN$uzbe+8Y_C*+wtb_)5p1dX|EFp%?6LAseV&uWzBLTHU z0i`~!6q6dy4iRndLKSY-3je=U2A9;iyKCE6{U=2s{RVJ+eRfc_oY|8SSSj%vg1ROGQ1ZQq=+)N zJ`syap{bVq=yoC!RH-Q#UB(G9SuZ+PP73gR_S6LY_OyOO7e0~2j3hzXomCj|8n-=p z at 5Mqkqez=d zw#|6|!)BkYVCE0OL|or7r3(_64V%juAIFL#41lRxSaPro<{!cWhjt7|;CQ58vS>UA zlgX%~cW4;HI|RhXIrN`DzaOxdrN9Yr5W=aAri~MHNRd@~VUe%O6;P#t at +fkHO-GRg zm726y`vq97FkIEqR=i~2K_ot~Xq?{n2k^08jMIP1l`haOipAu_f#1jYGGin0d5MLO zU1I<%LmgeEX?W7*!TnG2Bh`bAU4j{)bTCLx*g3BErAu>TiMV7THEPlA?_mAZfXM)6 zJ&`U$5`k3$#iiOd2Bw*H-g8F3y&a~n{s|W+}IaX=YC8UiQ|E^ ztyA=^mHQctVz}mo_9DDhK60uUtw(s?HM>GHDFJXEV^U*{4H2v12!h7;``0|X4_d5A z9^Fn>4->2U2urkeM~i_ypuEsV4_WM|(z`(No?-SyTW9-mGYDJTnR&#lwhGe9GgN z@b+dm at q{B%>e5WVW2!`B+<)^jE!_icFed~!ueB1HLx!} z_U at n!AvoJ!Z#{A?7)twMPB^`HQ$oPayuYWMgniO`Rm}=`$MA{*>MM=e zPlJOwRwV?w8y(-|2MRTF2pXPz;Sd!dzN*f=?L#}kSDrAlLQpZ8svvTm9U at d3^5Nw? z`^LH`cnw_z4VS!pkp_t%9I)!^TzGU$o*i>9fhzimd4FKXH8Smg zqQpqld#=i#at+wf({5;rualLe>O3AZQS?>Fvnn at r;3KQ93TQMC?#~X>hY8|6Cd%W<^1R~pzEE`Ljz=oHj*L!gg6m4O7OK9 z`7qGk;#JX(ZS|f^*&#ZHpNItU5eHL2(wG@{9Xo?&snkZ7IbT{S^*vz-aVj|oTl!e? zkP;|Xi~?#0(ci^^i3;?FOx3Xb(__?tV`PO+jkOFp`b>PtkXoJixxm=!RM7=hjJg;Q zQJLig{r14ZDm~DrvZc}0u$LAYvYiCS1;Mj0UOZMTn7C|N5zKft7kBF)(n9O6Ccgx< z78#UQrqcl$j$;OCfp?D^R{>fzhNiC90UC~n25G(Tu6eZ^{PdcE-e|DtPL)PbZ8skr zpY9F{B7-T2d5;bh1jh?(?_L*gjRQ1U4DEq_2WU9%Afz2$&^Bxnd?6kaC6>}hd>TG0 zuB>qTZs6YzlR`(Sq<%D5V9ugo>)%pSPw#S&<%VKq%DqVR<+3OMqb;QOy>qiGdvEy;x2 z{S at -(VyJ)Pj;jq!6dWLf)=})lEl3B at MVQU`F6<6N z at sa1hz1&m^41cXGTBXX-w2{QA&>(8+53ToKKnFHZMo&=($B2o-2lZ9$>{|@Vv)PRyJjLR^t9D~}FATEl)T}X+mNeGr{PmUy9edlJ2iNXiX7 at j_01t`z9 zPU!X0goSiL_ylFwpb6!m)(U0Oh1tYqw1x>XD=@M6d}0BpFH=kc`}kD4#USHkn}1h# z17`hE0UgUdGsNJKch^mGhgZx2HMbq(H?*#$4kNee!UfK&P5=gQLXq|_T~C*RPpG#p zuY&=B(-qKOb7Lc|_9s8nf~bj~xQl&$Z2}_6NVkfIB5$B3Q`@px at XCS$T6sA;=<@Ih zgI2s7-v{RIl}GQuady+SH^KS)?>~w1BR&j#<8}?$U5YB^?Yg}G37BBon6c|FAEpLX zMQ38;Lmk4BS!l9#+zoTksn02+Bb3|;F`)R6hKK5J;Ud6D8r at l6b%r{GptVd~ns-6* zK^SqJBI at D$@n#N2_f0mRqbyFadekzFhy<=aeAY-fg4LyhO#1Iq0$+FW z`lC<&1De3)MQ(F{uN0|EU?kTct$>4ZFU(;4y_!t&_x|}GcMwzyUiKr%IQk~U?GC68 zFDZ1*d-V=227#FrjM at 9@F3`S;IVAaTkB&aUGI!OH{aN7apG%@!0bL%FZjSy^C7h!^ zwY{=00>bW6sPN}HYQhAT&0vQ2fh)}djPTD#)PxB(VA9^2+=7WOUSaaN>pr0-OtAHr zdbP;I69_BGqQXhfsRG37V}tR%Uf!~ zIQPGx at a#LuA9z5x6Q+(YH&YYFx#%T0QEG0BSO|o}FkhV9LQNRwMi&&GqwBg at 7YNHs zqvuGTpD1<^oU2<<*_$&_?-Nz^gg8v02WrFVKFyXw*3!uCgqr6&@qB24MvwL?S z!564XVuCJ8q^T);u~?C8PB{J}6Am1gSvxuL#dGnhMJkHY+?4^Bx!W3t!f0BE|Q{Ia1{MJ zu`Ws0B8aTBwVtm77HuWEs4J&rO%I8$e=GKM_zBR|@oMNM`3whY`Xmoh2-eaUZ<}j_ zPW%Pq?YLPvN6XWHsP9?V~7 z3&N#ynnI8E?|T}=JcTQ~jNdILJUGe+iRO7Rd3-kUIa&Ty-ACI%H;uwPR(lKv%gItqCq}<9;h#ySdr=b1cT?6W4+}-WldB?%M=tQCJG<4w%eud zlRKx^d_Db0AGH8V$WAAfr+uD(3Y2-N6*AWqC7 at t`KkjWV at RW^b(`jkMiEqx z{ikP%sxUrB3Kg|a5-mzF!PooqbKu$WILzxf>ykx_{`=xX`$IegzR!}U9}Cv~T1p7l zy~8qkbuSWC$opXK4|?2CBXs}AGDRc`U-JC}`FoQ<|0-5PN4{I@$s~W-$v9pp3-)D# zlcoLhv-*On(ZVFup0$Nc+-W9XFov^nFBuAAh4xkMYnEs?7~v`Q3yYHot+HJzG*NBDdMj?-~ zwmUnXC at xvBfu9qezZHxCrg|Uq%M&c4opwCg zm at 3)+z at o5r^fAiX1Pkf1C;Re_0PV5zsJ8t{%Gv}=Y4z7lTi=3a9j%0pGj?YvYybX3 zdyFvAIHUR|)(P%2%VM%rrk$mXvIz|(r|A0gRbW{4QOuinTZ?J*;b?9=iyYLaLaWFb zfRSdHsc3e)Vz|CVuQKRzLmy||mGZ>{V z=s4R}PL+zU%!_ZE1b2p-rBO>bSWl)b{MeAF(eULmzf(S-*5WYs_O?L`3cSFW? zI`~X2bX;8bls<)E;99q5$v{wFL72mWu-9aaKVkbsP3)VxGyvWR1uF*RjN|?r5yCDU z!7L5mARuahizO9D;rkSAn8%oIy`!N{Q1KcOW3#8im`yEoRDAWGx;no08tpROQNJE# z5RP0}_m$j#5zZqHPgUDvEJ20Mvgq4xL%!36d2%_vEVx8v5~Xi~M5b+S zWN$!>$J{%<(?*v_0e4vSz~k=#HwTm1e3FC$O&s}&IEynrbs#*mlSd<44oK4_kwvzw zPAe#5ff7~9pd~Vur^_J^IZ>}PPXwcH9Q!BP?!g`VQz3*!WOm+q4I@@CdGK8=;`4yvw at y|+qfe|TT-WQu? zM1vu?NJUbV<;O168Usuo#v?KuNCQLV0#kw4&yUTZlY8|>2mb?usiW|<->H3j$p>R` zpgOvEePuzW?E{|{2mj&7<3CAz-AGI081{~G!{N?t)_rJ z%VRTEq%y(ilh?32)*EOZmP0kC*^AU9n74~lRAzhzHLy|^)%@%vQj=iywPseNX$sKn zDT{g zR=z5O%GWYQ%6oBVvUsFd4`wY23myeWNg1@?p9`fSk1t*wzAIJ|K17Xi@?65Hi`%mK z|5z*e>FK`Qg?8(K)qYn*BhmIxr%c3`UgkLB%3zp=QwE(+(zzm~T{!V99-j at yV8=L4 z2+@<0f-`vU#6zWEIuDRWLk+cfVqowg5u7-kmoV)QW|Q88FB0ri zOc}X1PbB{&Y@?kaXidH}nl{Ak7$sK>K8 at ugcti#Mw`kw*ZsOEZn4#B98J+AaPtXD4 zt2K;sZ?IMFt2p7)L;n=fcLs%T4unU5o z(bh2P`ZjoGB8L*SFLaPdRARY9;y>n^Di1 at q%=|0CNffDLsW^kEnGArUm;Lc(0f1f1!>bsH5WITt)==_E|mA z&aL~EvN*o<7v*m^;p^qem>r at rq^#u3aq at HNNw zMj(8D12TLp;$I#I4V|EaHo_J|>I{7CoW);Xz*idzrO~b5ZG)&a0{Kd}>`b?9tATd3 z3hIG=HKt at hc2L!q>%xiU!}rBS?x!yMWH{(B_^F!&y3zT at TwEZ*z?A-VfRh#|TNUPN z_}8Igq6k1G-xm3T^1!rb!i^MeMFyg(e`ic at v%BD at NfKzXKc$hR1rekYC2EOrN_xRx z;QOvU&{b3aQDmxr&Zr4HU6N)^c4Q}JVcE$? zlsc2gj^%RfBA9H#?VoqKB`YgH3xvv}*IPX&(vf%JfPs%4&q98W4;>$JqXIr{+aEJw zESf?CN^lM{H(5y<*#9{RG-SUxkX)Pt-3&HS+}iD4me+%TW~3wb6b^qX-g(*!|?~@np~iB{fika-B{MK{B(dE=rQU1-}2ABARZjYYdsV zZESl0kYMJvWk$h~+lw2;4q+3YM0e}W`f&hw2wOE!mOEc;7Qx2BHr?~_Jz+){4(3heuWZ)(W?(SvgI8VzexD3 z(t;_U*Mq`LS3{%NG7H5h5cwkPu4BqG4KU`&DWYj?mle~5*@GY0oDjaqoIfKbT;Hz& zy23Cul-X8FlPTB`1aq!PW{wUoXE3lwZFzKj^R=sVz0g#Du z=$62;`yE8$1B*H>P;P;F5aiJ+J^7$RKmy0_L|U93C|hqWv}-Fp>HrQO*0h8ZJqH+M z8YV<--wT>BbE5itS|3 at S178-BMU8&;Yq|`Ag995|sdzw0lR*jGCYl6-dm6p9(`7!w z`<|FMACXr;@*Cp-%ElA$N5D*_1sj1xqQ> zgAt^RdFogyH(i^-kQ$A8<4fh}5%Bd_e17+&2BxHuMa{vcJDEPHnZMf>vA}`g!%Zup z-{J$$j at o@?0{}{4V)^Fk(*P13^aNbFHVmkr!|X+e_MxFpI1hXY9`N80(0`8k`bI-K z`uOTSl&vnp(}rwCbmRGj5e at Y}egdAp=%kKQ38EegNBjpLTs6lm zkoAMaV~U=B;CNc!NiAe0X z6lD$H90=6csG$)qhqlrrkOowkdrFx;0)xh81 at yo#ESDySe7bqDQf*H+P-Q=*QDfM) zS4q(ADw#w^BrI= z5zanDlR)NRX at tJ(3|r`tH0nqmKPnc6O8eA3y)46qyLXuOu{=Q&O0YN7_t05Om?w2L z<{6dur)UzW6zKZ!Q;){zFc|k;&}Ht;LV7rYMY_>bC75`5yDGY1V^-1A7xk>01)!N# zyDYVVdBHlN$t%_FkkLehT?dVrU1R|Y5stYMx9$O%tnfi5`58=pC1YMb^fa*nl#j@# z0l`w%lgW?cF{8-iaPn4vToVbpOCctTsMm8c#y{y32_N(nY|zaeVx|V_sRVNez4jHI zsZ7*yALqvU3GklfGG#Oz+OA0)4n8F_&bA-`Cepy#Sf^GVR~VN`>RDf4`+detUO>{>{91(0@@v zcLl07#AAvWfBj at 1*&hTysYsw*#jvv&KmsEenA18RW}IG&InWrWOP_+zh>7 at CzvS0L zX~OXmLEXq0B1c9zaWtg5ZSeyWN1G;UXQsW##D(7q#@GJj;UK9GddL}R)Mvffk4)Qx zP6#jrrO5T at lMEo=lu^gaZGc!Hd`#Tw(Q5GO&O=o+l(w%48D`wH>EOQviDhwII;b3# z9I#mlm{DiU0Z-;IGG*j-!f1i-!?$OJa0xSNL)@in{*U2Bt)3d_&h?Ms9l+tkM&~da zz5**aj`189j-?4BD9+WFdj~84O+Uo|o!zh5(IepNe>7A1X#-kkgDiT7WV08UJ|-ds zZ*YWw=S9h5&%=}#n8d{)`98Za^bDBy6EG{}u-RgOMCY=G&=G5IjlBr0u@=+8 zmdq8ibi{F1f~i|-(n1}WdI at v>n7=>_An}?2!lXBRzq=pwvq_!N1baOfQ-t9QPg-qR zvKih;#@y`HPNVLCkk{14TV+Qqa5J;Yt|DUyrfi|7Z1H0>AY=2wd=;i-`x`yN!(IAn zx(s~6+4-iux`Os at Q$VLVyS4NP`1+O+XXB0n{QyjE*#jG>>JvQN2<5x2_2THkJkyw` zWDjkjB~N~97^3E`xW6 z(=j*GkM5?0A#`nfMTK at rBup`CvCMOyNr z>Z*?WBR5;J{k?DDP9Iq&76>2Xp0oM^%-D7ulfx+B3PlWYY=~gSni-h})3^4LMcc#j zIxPUc{B7s6OLl{w8X4$nS*MbsJkf`rI(UvHuw7g%pBw%AX9N4V=xCf>Xu-mp zEwNx77{sS4qJyh$n>Z|d%3gKb*O{P1U1ia!LPk=B66N=wh!eF5R*lYUxr0Dye#oJR zK<}g}aqwlsjXt(q2cQ1{leH#9o=g^dDUayR9HcZgGM!+^*f`9Az)~gp6nsXl=5Rll zf5#qk#AvBW#t?J~`a2*Yb>B_*gP$ZMP`7Qg4ow_Er4>)S%Xkb5b4~|c5?FVpN5I!t zcyVi2E9i$ql+b{im>y*M?yLlM2sfO^jEP`}h}weQHp?wFM7llfOSlkc`jA0v6MuIH za{Y*m&`6jX^oOeQ}Oti^0u5zP4Z zGix_iqAyqA5rB4qi5Xdh+qX|Y9vk%J*G_|Q1Y-Xo9V6oN^fc{9js at e24d!)?Xmjd3 zg2820K-5}LjtyGqnDxbi)Pgy2(F6zAP&R%{hRlCJc3x*Rh3>7HU#5fM8YvO zn4;(y=8cKlj%1quq`(v&3IF*Q_*aV{_1Tm7K9Ybs36nzSoQqgg0;B4FNN49WP_jdv z&{1B`T^tU<8lcHLZZ~jfd#a&M`UD>`iU%94_7c2!Y%Y(@PZYEgal8}+**RBg=fmWI zQs^Rc!eqK24{kgQCfLI#9h80UdrJZQsDoBqfInT5GmFTe�Y|X$1z|rxQALEoITA z2>z3N$82E1^+|B*g1I<^WAkdG>EZ|su0P+>;;K4>kvs at p-_&wwA_yk0xwC3BL9h9$ zhE~~^`DB2W!n}}1 z5koeSA^c)tQW0+ZbBW}$|A}o|n~s7pCR!d%+SI&-4B-{U^!(G5oV43A{EgC zs&QwNcf-0pKyl3cB2* zNgB|B+!IA%Pc03$GD&kHY)4uh{YXrZeK&pOen1bY!D-Vb&M)e<0! zR?DTQq|@K8gk*5*!QkH?+M|pJ4v=CO%V&U=Zc#_irehk#f{6-XFqMjShHrS@#yn^> ztw}5(VZTo|IGy4NTKk<6<{IY*@krzj(unm3tfgV3wK_TzlztM6N4!|##wSgNSwYue zu3{LriG`vT$gnRmW8E!aEEyQTIg6nx4wl?+Zk6sATnN0UkzG+-xvcm&!rk{xymS6x^jqL6LTD3_H zHKf~y9fsl~kCbO8-2-Efng%+mE*U6ZS0QT1);5VuJD30fGpe34>wp0f@>KJr7d{2N zi7J@*152 at ZBzuETvlj%M0Ic!KC~Na5 at f!}GH9V_~yF;=)uva+L{-BNcEb?<*E2kTg z>u_JOIAPyWCO&bGM4EIS_^FA3ZV(@IqD&+x%?2-*kxxLserJFlBkyvis!gz;d$MT? zT)KBwKxgvm at np*O?AQ<Ml;!*_QSbw7O(wBd{n at Ct;!~V^29us at Ys(I%ALyz zC*xezIbr~xewc|#J~&_s9gZzKoIIcp}c0<*!a<)c1c&ibu^pf6?+V7Y=I!L zYXS(0iXfl{6VU at 6;N-YFuYeePPmIPAjWO!a7>(F_i3NL)5_>_#-eQS8YSef3?j+up z=h+8+|A_M7C*SYx?C$LB?Cgy7C}zLI)g8u_UZc&zScP4l~oc(aAVV<%lBF_ z4wbcyaKfDo6Guwu5Tx-0L*Sb$_C(!VzonBU9GN%0E0DD($im0)ktLY*dW~8zaFA8r zdMm*n1ct6gJKK>x`j(HZtJVl~7PHi*-Ak(5NhDu?tzK~}2)N6a!M!Qw at A$Z*wJ>z* zw31&*5RSZmzACD~IMoBcBzGFmMM#I8aq%mUQ0RwS8QlNZWD*;;#3PTs0xesOB_}eA zW%7pnrLM4SF1zC9_SVVVEb45%Mv&&Z5!f%F35tjD#e>oUr*U#IMqtSAJDgwy4!YvE z7{AUEvl>#7PPEF&AZRm8nJfh}B|0`AJuq5L6xn?Ci#!6xgW{d~(Je!$1Ow;EBVc5| zShqZK-47_?fg5gFC>F>fpu?xnG#8+Y$=*cnpUaE6;4P6Zwm0d_5^%;>k?o)l%iVF3 zGt1~n5>$&o3#Kkvp%U^zu>gY{l>vq*`mutk*HR1j6FH||LMTInOND^gUs zHMT|ewizh)fk7HqZYm!2t6r}SO`{Uk_T(Z;(50Jrh=PtTpI;M*RuEp;OFn!=mPyS+ z6}r7mi{0pvn=5{9>sgLdc5xOxd^P9R8&s8LMK$(0CE~i zBprCxS2hPjQ1u!P&tHZtWWv00G0WwkGbnC`^hVdg0lxTXyME2ZfKuOx*YfdSk~#f8 zC=?Y at D=l;w7lmZCpn^*yT^^vyj6~_)+!0(1mZc}o(RNpxbuNH^k9e!Sc at +PgP0Tdt z%o&*?yYs}P50_MeY1M>yMO}3)7mo#7ye}s|eOzNCnBm5L__ffOaXcJ!)PGZ!Ohs?< zD?8&?c?s)z$C;V??d1u*GpZ{yj<_fMd?Wu5GrZ at DiQgBWM9G<4akrDQfM4d!wreY% ztBEQS>MP>WN%gjK!N;hyW|ij6b3u!HInJQ#$CyE7pT*xY!%RKoiN{^M+An86;^lMx zE at wa_O1n#B$~aoc$p=4L`zU(sHqLPy)(7PHup)j$>U*SAM0A=Ezq^TJU^b)^7wsWM z{50aXy@;pGqc5)`_y0sk{Qk|an9XAWv^`s532M4q*IgSxA8u0O$oh+%$czo?%=IHJ zQKp at I!t-Ie%!!QL65=;b>30q^Kx_S5Cwxyzzs5-ts}(F}D2rm at GGRgkkkDfXTtY!N zIVl)U(@cj=YlfFsC>FNHJsopz at gdW39q#u(bPm4M(Bj&5xVqPDTu~upX1;C|1#&jP zV0N*C{9fV9gnTP$(pyv9cD+LXM>_qy*4_i0VTP7*!|j5$O1bomiPXF0IaEJ+j1zu# zn&HgDK<}9dVUH)FhJ&b7iVuDb+r*8VkRB*AGe($(ULeQ16YfB7HuM`Gow%$}tjx{k zGkYw9uObD0Klra74L?O?lnRwWuwicBzK8^!?Npv{!Iopf#uMcvR#);4!!_~G^c%pesMLirlz527KT*6DB7t#3^Q<*6E4-p zHJF&OmTO#n zF%$Al*a02VTs~$N%1a;SghMt6WkPn)skQVy9znY9d9>(L=y;wR4tcMM6eMMHN05cP zL%P<2wK^*Rp8y#xr66Nedh1Vg=vEVdtXCZb at JNZb_E>}zG-abjki#E$TagQ$zf~O% zmishH0+JrJl=z{#_5fRgcY80fu9>gdhp=VQBN=G zUMU0CT5cI!nVn2#>s{O1S5{LyxE3rn0^o5+e8LUyEeXn)ABA_-v!R_E%ivONp2~!b z$W$3(R3_MVsVf=bPM>z*-W+7D6SyA;T)2#wMB%3gdGi5x2Z8I6!G+6+NSyH7{3=Ke zTL|3enOwMxc*I>l+)JBB#l6&r3zrd%*m3vsMvXx6nmuvcLJb!#<-Q-`Y9|+aqxTI5 zJ#gH%1}>EA?Da<57uItxGgHnsIBiMCSo44o>urAJcTT|C_z%o`_z@}y>aQY*n zt+h5vgNCx&`geHWD)j- at oset6W)4_7=yyZC4>VV)9_DDxYHjaS z-MyCs+wud-G{n5~K_o*W=1zzJ0(Ax4ApYv0BniX7EFbM3028C5FMf at C={WoBZAmd; z41ALsr at f$Io|yvXYkr>vUuP7!N2XJeBmrYa_Z(6?2%YlA!LI`CFh4#kg-J*3onD;T z45r01!e4Ov0uwP&otnkgl5-Q!^g*WZ_A>a{Hsg{6B;!PQ*kjQs7^*9t_}Mn*3i~*u zQX6vBMnUuhhuogOJ{!8ClP$@BJ^BZ?c+Q1JbhuS%7`Jn?8g;LZiY{go#pE~M=0lH8 zgHyBG#JIm|8U4kw9U$xiC9XO<-{Zok!^Ra{cRCMW8VCH@?icsj9!j;=a^;2+mAr`r zu|^2k{zWi|y~da`_-q#x at R~+Ayr(}X1!qE@(IjMx5$1-DRm}r3y$9aOUmll&5S0Nk z>owNbG%U{8we9ySpp&nZcqbRWC=I9DAXpvbOv0OAP4xmR_K**LCGYV{J|UfB|K;&N zoPn7VKsd-WPG!X`L!-bdr(FN)vbr;2&3Jm?>*gC5Cgd9zxk at 9s>h~0k*svU${27rM zEyt6M|DRY;1e`>;)2xWO2gkzK3I)EY=Xvu`NWh>H%rIlBT204G?h>7? zw^bUkzvJ#ujon6 at kK0)C$Sy*ct=AdV>{n+O9*n4ms#5JBDi8S8DX~ zUPmlzgFGGYqEvUpll6KZa-1M`~ zp4UO#g+u^F&lZwO`9G^!T-+W at GQ!8&R<}LLPpvsf-k3|`Bu!de(4z~D$Hbe=yw5pE z-ux7$Gr-}iv(6?q`sMeXLz_3hKoua%;`7HPQksj7sp>o97ad at Zb;DItR0p2+TiV at S zZORmFx$45&Cg{1k8xc(85i3JVqKej1ym`Z`FVN$f6nDHg at d+F}B^OHK)d40=2wpM( zdUJ$O7Eii!uviLtskA0>lI{bQ+dNR>DL0&C&zBq|(i#botS-*e{0d(e6!_L(w>Jj~ zBhk#p6?GexMFA(oQNmZnw&LIqQ~*H5%&R@><+9~_LF6laaED1|DhDhbv`4$qYJ<&f zZ-06>XR%F+H_2gbz6Q(NZAQe(_Bv%ZB6n&VB_6WbOv_Ke5Xqv9?D<6iyv+r_t4`8$ zgVUjV^*FqvE6hKCBGP8Ci3yEz$s4Ufrm^YbQ?KRTyNzeV*D(d|fe6f#z-I{KhqbQB zS3uHNmAG~2++Q4#j`yv;`()(kicsRFNBsdzyb={+479pSN`Ap=_TJoTo^+bvL8YN# zq+5OdXIA(+py^1^G#OGF8b-R+?td*kww_AUc35d>D9%$vQ)K$Ok^mH1!daLwq7*cA zl8ZNm29ts0k_&zl;x&ecq_a+n!Kd at UT76)VEg^#c9*pH-2-BuXFtqpGa|yYO<`c;Z zmQLUjltF^vub|Ib9W!Fn zC5Wz<+j0Vh6jgV_--d3P$u%ZMqdG&2Z0jh4E?a`kJS(ySIzbf@!_#FBU#}zxnl{d# z(h~?~xZ{ZqUFY)kP^;5NpM6&$b(P_G4bGC+p}_~2We%O(+52s+^~5L3E! z_^~%~IC|pET)u;eh+f^~isVtA|NP9>cA&ba6G?2k?qhl at cN!YF2)-UDaA($o{c>0s19;)1lwN~CMJz0bn_IUJ$bhGVXUu-FWi3dkiz6isAz&DRD7v&K!UMMX))uf{{toCI-xR%YjEQ^2+KcUi=89U*to&&C;w%%gEM{5zL zs1w%ZVe at 1K4DYW*eE9yqSdG at 0jhT!+4MEay at 8 zK>Vr<9wFxU4+9mwN|PS_W64jpA)lw4I}W`183Q;>uNSmwmisRB0GQF at p1pG`xzXIQxO>$AS9L#DmPVyx8vd#_W)FNdbifUS zl?@n}wh17r=wtrTxy7O!tz~ex<<^EGO|_rVbm(0pjkN at TMupz(Ez%wz^FWK41>a16 zlvf#W_YkgJk6;G2CC4U8h$^})(AmPE^*Fr~8XiMDW;28^z|kHMZ!ynVr=hiD=1%wr z0B5-1JL=b=lAv_RTUR#+=>f8U*reAs6M+mjr>CzJVR8m zSqjSjG5j<#vrZ5m;f0?wfRV~)dIy%SKdr6+6Ts6E$2%V`ipTKD?hI=2_rvlE#qAaf zMNK=r&`2>nI@ zaP8JMbHX0=Xch-5V=7E4JNs0)?JdU_gx}cAE2g4pfHoJ%8cp zUw4CH@=0xcq9q!oQR$e2ZjSDavZRGN<9a)Jh=gvHoClvxt-2}^)r at e)RhIV%7Pdxb z6hwSwwc6B*@`9my=8oS#%p1))eZ{u~bdC-_9o7hyjwK(XyNsieWUEY>9G;-y>g%Wf z1>y*H!$tjq4I2Z0NIXbK*dz2SLgQ^wiT1l#$Rs8OluS#iJ_zAGEm^aB-H6Cb~Q zKS+YoxANylKHT^Sro#*34QIpoOvtu6Gt7vtCN(QYcfefVVF}QCM at M|X(w9o0vigr; zO>>++^n}mVgeOd~f&-QjOP4?PR1avYuOn`Qb=k-S{jZvdSbG4fAQKX?LY)4SZcx z;AUdMIU1tgfObrEj$q`-B(bGagsvxa|GqOG_Ph1G1bCE2r!pA>I|=>Nsk#h;L4{XYlL1!%Dke!n;95+9-EFN=X4#;BEtcrHX$UGpn^cJL>j8QtRI zVMLlKe?F58@(OUlOU=)DECHLK&d>^J=yV`UXo&Tfq|uXZ!NTf6sMz#p{H%2BxDCqu z?Y8n9sdm^iUP)kg)f##F)Ly5tm32_13;+F^wSuzFTnPLf8nY2rk;<+?#SZ2FKO01E zPSQM6!|zaO6jxk672V!zbK=Yfp at S+%CDowIS+PmzF{K)&V4Pip0=?d6gXrw7JOf6B zgQc?99ru2 at l$FCyM?VnUbY%ur9sO8A0zDy9XOO3k5TWn={Lx22kmm_?)T=Tdq2(`8 zb%c0ED9i2h1RJ+ZC0reSTZ at Z_4%>B)BBlY#U*v-O<d)PBGRzYwj_l#37jDLED)LvEGvhOsDL2{+c7 zf5yW?M|C`;oY59!$eD-<1;_+0C*$)oZxZv;Ocoyd17%bV+h}>F7ti{EwnN9A#*=&m7q_O#;0%Bc!Rf zsLw_a;CkYr)1wR?I`~6!N{{^h+W0jv1O69)oAgRO2L~OrO#Lm9DIg~Y7d&V6%K;Lg z;X0j0P-$h$>cruHsv+x8>5JdWZXd!+Y5PG^W;=hXRW1z-s at s0}u|n|;Cl?)fg+BM^ zP0)!y2raf`k`%CIV=nO^i#7k&tcxA?1B;6famhEGhlP$BS+h}(Vw5`513$(U&XGWk zEBTS`;|RXj!=)26IH)YHsh-W3v8Wl5=f98iM(gPd*rAxkvp*wkBhV5Fy4#OKiB?K~`uuqK~> z^{B-BGiSWaZSf%qRI8UkwzLMeJba}Xr1iHC9+f!r2q&ZUZ%K(&d05nLGkmK3 at pL~Y z&hRnOkE^RyyI=mUuqGF?4_UdwP6<@U+z;`F$r at 704XJqARSlz8jHGpsKgu_4glmpL5q@xdr`yM6znMA;+ z`^bT3 z513e7)>PwBRr(gf*FXo{AJ^#%S!^XH4HvCPN9E98VEv?f7P#0+fZKtUF%aZc4Ts at o_BQHnpGZL^(&+6E|#g z`f{zU|B5r07MD-AiF<@1_`Fl3(ZA&O-U7{J4lAec;2VhpQS{{qUG^`STZ7W(oa zt|@EMWvf%)a&*vX21f)LLD|lB!41oQr at j*}GtKUc71^m at 1LJx(oblB3cVuM9c0_3kx*ej_>}wcjAjM z8$mVwH+$m+qxEN`5#P84>1`T+e!ij=%xE37E6J`+%@)7cHof_Y-i&i8d5dR3Ge)`M zF&Td?eV@&sv)2hYfBqNHoD)28!}{rpcVVZq{q|j+;Q{pZC{al4$y&ax&ZaZyNp28@ z=hSJl+JN2ua~b?t*m8pm3Ocx|X4jp_s6{S8`(?9xqbzCJ`jKc*X<1365MNQ#U2RaR zMOO!W+kRe98a~GA{HkW}pcI&X8~t$qc$uxGprKz6ru3>aOarnT0kZ39NAmk#d3&^- z-Aq;k6St~SQ`XnsKk;{Hiia!yq;2+rcW4ToZ1lq)4 at 3jm5F+>6+C%)NmotT6Zt75^CX2>-^ht^br5y0kOvZUGwrxkY0OtTpI|_-CCH4 zi#y}K4_$d43ahq$YgW_ka70!4%12SvVO*xT;O?;RE0&UqPNZ)xw zKY$1#@NdJz0b7a6oRRt87Sdj&P19HtI at 6a0Vy#wp-o9zjvl_$(HX!VsSm|^PQwoBY z!gOivg-6R6BY5cE_Jq+HuBa|{K|^()NQZBX=IoGlNB(cj*n2V}jO$Ws at o*p;M%*#) z=*ZP2+qPN4XG>Kr<|wf|=`K`yqHOK^9P#V)(pj4|Kf3uJ5N}I at wL<)RU}Zdt z{cKm*c77)P6_YFbPYN!x;_BL2 at vg{jlq92P)Z>FH29x zkft)Z_HpETS?7dX5o41}O-84R?0)UZG at xor7%a6^rKMu at s>0^$r_ct!${jaY{L at NF zMUVIk*y~fDUK;wVOd3(9$|&_37r_qp_HsN2?Y~T<0F75OVZr9rWm~h-*orEt>5)i? zVb`St->k9~0kxOV&}^9u;c64(BEnLPSATp>J_>nq#$$TN>E#j8@!PF1>_H`lz9Rw_ zM;dwXMG8TL<6ZGXu&0?1UNERtnkZ`NR7CLa%8<46g0%DcaS<>Ectzuj zC$7Ub^u0eG6+9`A2bYdI{N9;esB%v~2fX^ymZ414D6>{8Fe*ytwB54><)az|GXB60 z at cb|)V1impIp`y}ZH?L#MZuJALF6{c8Nq~W4}V1H(irE&xzC4ZhoW>TgxY#NMidf` zpD2GR$^oi{|I*O!#Onrpa>Va`Gg$If%HhwB$A2e9MMrE_YxIc5AYN4Y$X-9WP8CHI zZ|F+z`k||pRu7c at HOa6anXoZtL$=w_xL4zlw+RC6f6X%PM}Ltx`zUmzJrVdk?Pr;c z40pizZTknnBF};K5^qPaX(p4P#NBF1*nmp5z1=hFzp^@bukNV4a?rVEM9Sp+-%7_% z=NZvvTCX-RmG2YgQ at Mqbg8U?;8FlPzzi0LBa?0l(Ct>hniRz(imdoX&Gc0hqr2ZWk z4m;v{>HJF3dCqEbyVC_1{a|({Rm6|&r&dc2M}#duvS24H#;G|nyh-#2$O3c32fpp5 z(lOC_3RAzHuojd{R2BSevblgg2!hcFrb=6NhF~<=4?X at bEJ=1dk@*WUk$i~&zM{RQ z;AKd$?%|woP>$lsPWY+(!an&dbdE244op|V6#kdU6MN_niOuh==U}Ye(DGz*p7%5l zVCY7?1pe?(Nrsa0H%$2DRfE*~Q5kV1zP}7SDg{qR{5(zN^bn!B8T_8!9uk@ zo3~5@>70n$f4W!!1&g+E#0`&+FO|9-^z+iTAD&n8L3asC+(;jPMbd1tJZ@#%P?nr# zlj{YdiKixZ?>pBx at X>9UIKk-i+HEMipVkpynyxoF2rO?Y#ToXE`eNrn=)yiC&CIsH zq!}32s at wO-+spwg*kG3rBj<3;y|gLawdiQfmVdPt)Xas;g@#f&UhYX`Ci{gf9G`ie~ z5=Wk;^~?kkBVzIZA6?VhUl%>DBHs2qZEB`Lr&aeC(!^I0qN!8%o_-M8H_G55+Eq=I zrY(ALiazN3QMvmKAEOdtJCt~Kjj=VvMTFjwh%Hge>+hoc$~$Z~r1rV0mVCgEj$vc|8q^d|M at 2QKSSd_wzl)*46`an zC5l$Z4y|q-X*3+uRT1B=+vlAPb$S%S-jeK(Yve3$Og;R%U$*9L=;qMe>E3~BQOstR n0=IHTHk1RcH|X?&!K4;oY at D1Cf}4|@)8l^}6s;S http://hg.python.org/jython/rev/83d195d9e5e4 changeset: 6337:83d195d9e5e4 parent: 6333:963905961b66 parent: 6336:f37aee7135b4 user: Frank Wierzbicki date: Mon Mar 12 16:54:15 2012 -0700 summary: Merge. files: .classpath | 3 + build.xml | 16 +- extlibs/asm-3.1.jar | Bin extlibs/asm-4.0.jar | Bin extlibs/asm-commons-3.1.jar | Bin extlibs/asm-commons-4.0.jar | Bin extlibs/asm-util-3.1.jar | Bin extlibs/asm-util-4.0.jar | Bin src/org/python/compiler/Code.java | 13 +- src/org/python/core/AnnotationReader.java | 11 +- src/org/python/expose/generate/ExposedFieldFinder.java | 4 +- src/org/python/expose/generate/ExposedMethodFinder.java | 9 +- src/org/python/expose/generate/ExposedTypeProcessor.java | 8 +- src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 11 +- src/org/python/modules/jffi/AsmClassBuilder.java | 1 - src/org/python/modules/jffi/EmptyVisitor.java | 93 ++++++++++ src/org/python/modules/jffi/SkinnyMethodAdapter.java | 15 +- tests/java/org/python/expose/generate/ExposeMethodFinderTest.java | 6 +- 18 files changed, 155 insertions(+), 35 deletions(-) diff --git a/.classpath b/.classpath --- a/.classpath +++ b/.classpath @@ -12,6 +12,9 @@ + + + diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -186,9 +186,9 @@ - - - + + + @@ -219,8 +219,8 @@ - - + + @@ -618,9 +618,9 @@ - - - + + + diff --git a/extlibs/asm-3.1.jar b/extlibs/asm-3.1.jar deleted file mode 100644 Binary file extlibs/asm-3.1.jar has changed diff --git a/extlibs/asm-4.0.jar b/extlibs/asm-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d63075eb7331f7120ef25603a2ade856d12f715 GIT binary patch literal 46018 zc$|d#1B@?B at GXjtZQHhO+twc2w*4F1w(Z$t+qP}((fw}TJIVW>oOf^1-RY`yCzVvM ztm at QKk_81r0|J7A0^$|c7o;PQ>IMJ-0ge7Q|MLRLi>nFKODjk)$_pzA_h~4fH<8S;dq%g6bNlW;spTk#c&SNGwn2 z6N2a9rAck~FZB2MoC^tqGdYG(h#5eFJ02H9Tw76wq25*cAHi=By}@Jx0|6z00s&F~ z7rcYB1*3zpwV8>lhnX>>k&7Lpu)V#5tC6dfgT028iOqORwkb#l;=} z8Mni~*PkyCLwxjLbB#FYF6~q$=4wcPrS|XSr%fwQRo=$j(bC={FaPtw@>tDI-Q}Z%cZgY^->rW0w_XVRarzh;{E^)SgHs2calGkGWzUd7cxrM zGqPe$6IIW{qAZ}H!G!@o)4~zgGQ|*t;kkzO5Rr~Q8^I-$s6t3E+dFa)s~}}!WFlvx zQ(uy=D*u$K_@?N(l*xL;VK-3LHRJnFi5}%tYXs#rI3jw1&7&0b=d;IYUqL@<93Z=_ zUXse#CCpIl!NFFW(&o*J_n$(3Mw9L0cnP;E8ptfbS%={XX zrrez~1bt));FcfSIq&g{Y5g<);1I-2mcsyOi;9Gvq=EVZ{m=YvrJ0byKmY-mApikU z{lDZ_)7i?^?0=o at TCvVWc5-cGD3QS-dfo7Y_4 z8~2RuyzMDTjC=Ud9jmwH#9&A1$XIwaH<7k~6O_nlx5{C{?k1-M&l;4_!)6T~CwZc?<=tcc+b2dWYX9>>`4#Fx52K+RU4~C0}>?@jzYO;r6)y}^=12N!|NraVY5wtUoffT zFuUOfDr^4!BRe{032yKWz8$bPZFJUAlxJC(f(a2f9y-xH_j*qf7f4n5l;;pjZL#Gu z!zRQR9B?>CxO+H}D5NMR=tC&ejwr}-p{X+)j>2=eBqi0sAu)ngOc)e88a8yf4(sv0 z at GP?&=hoRp9JCfXzlCMGO!iaV%R|pse#8KZV-w}Hv=lcmrKMAN-No; zMg#n;9g{K-0g&ubs&pC zBC}3mR`IGD4WG1M`Iup_O#4#*buj77>Ne;HpQgmj;*AKk7^^uPe)o?fmoTq}Edu4} zb%l~rwPAB`Ihw6HtJuOs4#jtfarJ5%Z zGa4%wmIiYQQ;k`Ld4*Ah`oRbeL{@c#ekmbAcC>`8N+W!Hky8S7im;h?N&Pp?3(K2c7A-+j#zi{d!C+Mq at 7p3TlOu4w`i-ki at q%THORla z`uUGDZuGdlb2`l1!{04d0PXFhww}w{oblvMin-H{KEvGMC}LN5Akiwe%?Om~zYr|v zx0(GaHZDN*EwjjwT<@t at S(G at i#cAw%Wa`bQb<@K6AmR0D?R~!8w1TNW$Y& z{tX-c&hp(D!r_u^OHd5P?0{HPYG_NFYLShsQT)&H9H8p)q7S8)u^gL;{gbUHTd_;F zEitNS4lQG{lQR;xM%1vdMER5YZcWQ4{G6q%q-RcKSf6VPv=o`;xgkPmoP0)j} zuj`+))tN{rwRDF6yWysW1Wm8DYk~};ewg|t#-v%Q9wtWRH#5ECH@}1ezpM7ivRT!Q zK~l0~rkVl{4dq3X3UmfdcUsjoWh#ScDS&}CwV-mbK at 2<~S*E>kQ9eCYCZck&;$TXg zW-oElO7w(HUxVhRY?1>$pHU?$agti}1nobMUD>2Nd_KKOVKB>DZOUeOma| z3kCh#ApVf|lNrCvugg-v4p+xDY{KFt>Q4BCL<+m;Pn zjg=Aps6X5ktH)*Sp#?UmXNFkKP^)s1sOJw;*nE#ua-QvaFH$l@ zq6MOM4G{e%nurz2Is2(U$qe+am^F7%Tu^XsLp^E5G<`J+|y z#zv{d9VhjIujvj^O#dXRo}!pyP-{M411cCu*1R{&Oc~G27+qe60}3Mkn%MUT{BL|x zKs9m%0t5v8AEyxipZUbq)!E9}&DHGxLnN^(%Bm>JXg>_FK0zF!0Bcp2DHM#9Nfz)H zu-1$PD+<-o40Ao#2qtg~Z4=MCzV}1X86b|0_jA$u at 6^0zm!KvzW%u{l-Z$Sj-aYQ_ zy#T)*NTyJ-kYhwP$Hq7ZEbp(NXWN14aM(p#UtQLv>Jb7ei$Bvi2)6He8BU^$ zruTeOX3#Mo at 1DX`@&;VKvfuA4|LV2Gz(eG5%D~oJNMLtuaTPJP>z^$vZq1!O`ySCV zQDy6<&1a+SEaF*ZPbZsD(x2|3%js;&FBTc5a!$k-li53O at 1LLEJ8d7IpLCQKfN}sU zfNRc^?>B)knu2Q{APa2~ID-3iRP1x$!Q4W102ILA90$UH20_BXW4a0s{su-cfH7Z> z0zvHD9|dJMiGqx7r{JUAYxPG4Qrd^!N6LUjB1)a3{X-IDQHnQ>n+NZ{hw;vQ$%!TC zue~|U#Hb;8?VL4Jk}e*&C>W>Oyyl(Reo5x8Ol&^F`HnwXFE_8tui|tba!i0UG(-#{ zuMJ*jI7F^<-s7}DUoZq$^ieYqR(tdtD4G0)ns3Ph5pJ5He!Uge-5gO9(=c0%(qP`z zy4GYaoQwq!T;{SfzAC3sd6#BzVDbo!Nsfx3i=DP12DsmSm3C)8TUC+7#91M0;~Z4^ z1{N03Bp=}zl=QeF!F}|&*B6J2fuj<5d1*IDF_AbB{@g#3N|#c10%e{8k+Cm40He?d zE=F=mE4MH_+j!RTNVkS(rqBRRI+pn|6rfee2HO$eaO>gvfd3~#NFB9FLDJypyvaS5J4Q-%_F!FB>7Pa>@Lf!NlXlskIs|po);$G^zoW{3JQ*zYq*n-!35G$ zUIoeI2%GLAPQ;arh02rZ5IJM=WL>H4HaF1;2=eZ$((gm7>V_0uES?ro4_Eg?Lc>xU z*-mnsPz|okzH~Fg7T&)b&@e1;L2`u&8yR!;c1i-0haV$yM%%{om(n&e2*!3+COeaL zNkcLm?S}L$SOG`I32V2yd=^SOmN~@#0o}H9I6db-}M^ zQ19t at rU-aqc^6v?*l22B;b2OMg|SUp>ZNzEC11od%kX2In1vgXne@&9DX|)y$hv_7 zBn%R9K~5)-kZlrmPH#1WSuAmp5xaHEefR1$h{cq#QZ)zBwuCVbaf2MYX`|#S`^6yJ zwg=!GO8!~w^rx~RYR%jeo>`7~)upNf;b*v;gdKwV$`CP^iNduMndHDqYJz}>)sN$k zz;mRlqMbR}mhY%0M(R?YpR=;fn at FPlf+o$D8Q`ox!-B;g9gh at P==%lKI2T>`^;?#| zffayJU3dOEK)#c|&?5N(yux|X>oq=Gx)4q2O$#)M zdB5E73+xBYSCT*GCI1E`EZrUmp+?{hni&1X^S#zI)N6geK2LRGRfc~xzl&~~ECnB4 zpCgesf^AcX#oAJZ|28rQXx%>nwwdWX{}6rsZ(yWakwxeu1Ok$g00JWYKY~&8|3;vS znUU%L`uWuI!F#H$q at MltVtq1yOp^0wxR-)Jfg+ZpfClsJC;K7;Cc}Xu2L`jwCB`O3 zNy?B at vjw!o)z*G1e{Dc?M^;{4YuHtWK}Q$4>#nz12Q1s`R=>`z+Iwu>xOcbNko(N` z-p$Ajf at yhtc%JS0+;X4g`P_D%<$azGw9oQ;;Q(2usw2>00fz<32)P7;>;tVp#_5iZ zjpasy(v9g??}9u;1QlBg(}o;Yf!nQ#+ea?HNc?kOa~p>6`RC5blo5aaGqB_K-CYN8 zAF+?QtpdQ^RNGu$UB!zV^MCv4`hFGHV=w>TQo|;>2rvfHpflYv`X<^< z0H5j$(iNQPPNv_F at a5#WB_;_@(?N}u#Tr9O?U4%8aL-#Wi-j@^fOz#q%%^+Fzxl2= zF3rxU39g+OXKN{+*+8`I!CkK^-GcpkHVq#WKLhTnK5NsgBEWlvtgoRaqm=T5nYMxw z(8*xN(~=uJoG<@rf at hhqC=GxS|1lUq>U|}a$O&08f9Or+1hR~qNiB-u=(ur{)}+ca0Vm$ zXC(eaUMx@;hK->dx)Xb!NI>egz`DyG^)R at O0yuF8h zv4ewsT^LleP$n;Sh-~5Z&e+7z%y8=3%!pFRAY^1`B^Ob)xoo)&Z#fjJySa&#VoPuf zc)13&z3v1mL$)gNLgI88JKvR!8=C$>gUk>z*D}>@j?7?fWb6h~980auuCucGBWgf) zX|u}VFhD+w48Ik at htJ>rNz!;A+~VXU`Fn4u=_>EKc7NN-Ia1^&N)_D!?yZkl8?uTF zaJ|_CPtU%}TPDoT=sLa+(&OrKwz;=)w6 at -Ab)RO zq53sZUCA$Juml%1l6Hub=pSFIVPi!u8a#?YK$3oT|ATy0{SKE>tX~G)3_`j&yWK>= zaS%r&yTiK?p%(98^!jrx0ys?84x4d1JtR%!sq$Vs<1a(HBi_V6jgR9a7m>;FOh`BJ zZvy2vK||Igx+=Eh?bOszRBFLFdE;~=XW$dFkI}Y@{JKqi$lAC6lIgdZy(ilxEim&T z;irUPFK-Kmif~Fs40o}?PuOZA&}Cx5tiFnczmDG at Zj$=qJ at CUldjB(?;cqOQ{c-F4 zMpgspN7y9D zMntt3JIz=5AnyQ%q;s63wb7H%+D1n|z-~bGJ2=CetW9tDp1qoEP{YvS%+J5E znAm7a;(aPMNtS at M%T at 8-h*xy2#$apM;RmR`6$|J&QP1gfuhI(dqG=>{cKnpPan0bL zjrD}f3J>%}(@3ow{kJGrGL%-O%b`CSsg at YRp0Y!w$*BxBh%M47ajhtyph9B^vnuM* zg;%Q(?wY|POWVOCC2aPT{#1D=jY=(8-dtQI<*LlM!WhG*^>(SZXD!v7!hib|+q}Ms zzrJXxlq}PRzrmX#SZ(OSSY72Y8T0fGIMOj^LPJVW!EW?rGj<+K*>jzS*LNH^ar&;n zkL@@P!b@|;bRLx8<~a@}+k0-pm+#!i;O4mvx!AvF;r=YZ|M3{&+;$v=x7fK?w0|$d z{aZT3F;1x at RFELV46INP+OG%V29}1pE>)1*Zw`XbqX)irbq~B=EsCjEF3P!5N8S+8 z&jfer2)c3zW>1Gw_o!5)OzHi;AS+`QZ8yyivCbSR{e29?DM)@1Y10hFJ(6$;7wB+x%?BJ_pG> z+mHaacicfg1aCJkIAZ*`K^A-hvU~6jxrm60R}ZmArr5-S%{|n2$c(xn%u06{V=$%a z@&b(rhoMhb&%DU|2sbc}i+hmi`2%sN^Lu=)f+3H}5B`dUgHOZrdz9(r1G7uNFdly( zah@;Ml*@b3 at s$I~lFfJ{j35bogD`Zk)$@DQ at udTHt*W7`28{?#%V0tBdseO5p}9hl zh(8I90njHrJ<_oEw3dqpYb^v0%1 at m0MMHf;sR(^xv~KU36>A536(78os|Rll!Vv+K zU4s35_&*_H-^e(w?}{kDloiVdeTJn74nwy1KX7(DU*M_Ki|yNX0I`#c~%(AT8*=!n%upU~UaMy2CX2>k;~ zi2kV=>qbF(DpPWQL{Ci$J-K6Y`p1SbWA;dz*M=>|V-t&YTB8votwpQ>M?@`2L$(lO zkRnRQ(9|i)j-ESwkfN71IIPbG->Wu=2TDhFzaQAoD4@)S$Pth}Qyz5MjOepqO$${+ zHm|Vn2gZSVPSg>X!h?hH^z&zZ@|Wvsq3I zy8+`obS1oe}G5s==K zgZ!azoSwSW77PLgSwqDNc4ia72J-9=L=-{8(v$DwGPdfEVA+Ie6U`a*_-q_WR4se}U5UF~GP!2_)961syiX^s#gOFL zU>d~y3J`jM=D at h`Oo|?BeYN=3rCSw+*sCpZ1$O>VYUb8uX-N1T;ICm4c^fWt_k{(g=cR zCU8`o=sTKS(aOd$RfckdP(;P;cn%eEZXK*k^n?hlQ=L=o_QUb$>Qg{CB3tz at 05a3b9u+mNK2gBwf?+1jz0cOS|`u#0_I%aeg7PS z`Rk58IpWOGuw1S|%Q~g2u1`E;aiMU8a1{c*86J!bVwcINWTqOvgop1)ga4*cXocMK2eetXmat^Yf%ml`Q*PKuo0awVhF<0z&;CnTyUz>r%9Idp zNucs{4mP>&^Kd7^j@L zczB{?%apZFQJX|b;0`EEDa5zTLf3`{YRtr@%YSkvUw^Y29)??3jyO z at kj!7w(v;m?S)U}8px|=?18 zUr8Er%n3Jbvu#MuHC*PPUt3jef86UnG{VQ$1HznR at ERRUXxFa8rv5{LUzmCD zLPCwOyJM+hL|BJEntNH$I|W3KXJC%$+30#c`3%E9a|lFuhKh9E<(H0GF at 0>Vk<-J0 zhb`+rwe<`W{>i4lI`5ib(ytDb8`akC(gu at z^wJi}N#Q4$AQr at TXh&NBteD31d}y)_ zT16{dJX%oUfcq9g$|uoB$`dLzBOkQrZ$&F&i+Lk1{Ga4&k8l at Jreiv6U{02wen)~Q z7xo?$>Ua at S=AI`eTKK z?tEd?lOdcQXrR1qA2IIG_Mp#M*5&ejXWA at 9NjyKN(9iV;wrVYL-%9Jn;RG2=c zs7D{jlP(z_PVuKqe%ltuh3N3l{DetRPWVpoC~t)>y%(B@`!y?I`_!uY9%Z;;{`qP4 z=uYvKM at l7WjCHizlaON?Xt6}zeme5E2wsP`KrX{=6o9w7Fko|H~ki)EAy4i#c@ zi#aDu059gZc#%%!;8g7!UkrlaX0aYv6E#kY5x|0tfufK+k!1=DbsI^zs*wo{>c5%P3QA>L)a$*D1kq;qci4B1oHOJB5w2q?tE^rvD#3j#+Lnn zUz;Rl>NfLh-HA~>6r#`a{A^%8!u$~zbZp_j6$o=gFSe-RcSf%tC^#_Bzpfp=2g3)} zQBroJz6TsyFxk?sb(Wj>w^8`^7x-Gqv`K0(haXu==fboI?~d(B9)cbQdiTb91sOzF zW(Z61-DLQ3*MWf;50UV%(dayYZ$j%e%I5UGz(H{Au}| z7Cfb6&N3I01P79NfcM0RuW^&lL`gdR2AvM2%z;k9Rw#cJ?B9PP%`w^*`x>d+|NPe{ z0hHa-FjHoe6K0d~1w3g}Sj{Q|syVON41Q&Jkp9|mzfd33HP8Yk(8nPUSo?FjhGpfL>l~@t$Zs9dSj}?zbFc_Q zh}1ch`#$2+R)xKh6N>$;7b|b2Vh4+qP4wS|&orpK3=ac?F4$1hcAw2&V{t8{NZ55_ z|47o(gEEtWnjVSO-aM6V%{5;$58Rw3Y at Jzj@#mA`nIdFGWsI)#`quSNlgEe} zHrd8{wXoA%*D~M9-2&MUZuhQI)U+r>;kgK`ZV!4 at Q?bv_fa{&98?g#K<&IV79F%L@ zL76zD;&4O z^JxJ+6nCuh+~y at a;luxM$>*MRBe<%LrZU=^$TlP+r`zS*v&)U;Dh&Ajnp&e#YFy30 z%BF<3xipL<4e|>+$d7-3Lrj37MPFPPvoI{aZ;w&rcCSH_i8w|C1N&&3byFBdwQsgw zn3lw?;fISnClx50EFZeLYlFyKmrb`^njVJfw`q9rOcxB*IAydVG|w6_xMl$G%zKCQ zu9?!grl+*VO$$q_I_2;pGrgM}%*_D=w42+3+EBQO(yC0gI-S!Ak526kh&tUCoys%m zYx&?Y#8V at BZG;wkN{D%ed;3#2a74bqRi1w}uPYhRneT>eYbgfG(3#uAwiRePn=V26 z`YITThBVH=cv0sxM=Jg>8jG(2sr$bL4c#Z8>1I#TT`h_-$o1Qa*UT5yV>~y)F7V3f zbfDNh?CNtGKp>j(ldsXG~eqINnP-Vjte~_`DYC-r402_>954|`5?uX*`{Jy z3}ViNlfJWz$MClAW;Eom+VUXjzG|D$+y?i|R`wK*Cw<>R{`sn z3ax(uwY8P2uzU at Z2Q18!cmV^E2LTbkBsk}>JgAdYK~7m;>Xc_)4O{SeNOJ>e}@I%LB% z3gdJw1_68|*~55Az1c0qm$j$`Q9?5dz~EZ#;{2g&N-`E+k)Lt`lL6&2(wUDj5>N0{ zWyjPGHI8XuAGMEZQhB;LJ-j(ZaRI+n6w#C;wgrc7=4Qwi`^(15&7fBt{fS2^-g|-y z>ol}xD5aQ_oiA{NdmiIZz`FY|JB{lVh;PP=IiSvycmdvYU z=yIQanK$HO&!OXp%v;`?rUnj*IIC2`l||lGM-ZN@;5n_pe>LRJv at zgnMN6i87|+s| zpt}TiW0;Fl+aISSFZ7cQI|sGqbV0vh23CDj`1f^h0XiTVM!rqO{vK*{qK)!TdxAw%~eK6h~CPCf)C9cuMGQQil( z<{DbH8CG}Q(Y=w1=_6t=MBRmsqUrKxcc`K4*9^Vlwr>@8|F`b*0Klj}eoCG+?r}O; zL8 at 0ueU>KAIdEZ_4|N`^^Eq%RDc#vlxL zgpsJP>@SH}Gu-hVT&k-IlYKYpD at N#-T=!aGw`*QO<#Wa!aJ=7vQP~_TI^+TqG zSt#s7A>rkeY|DLd5Q-*O1xpT$#){)SaaE+RYcT&qi%Na- at jU&LcJ;Sp%@QO?y|!I- z%T?x0CBdp=kU-pAJj38`r24MgLu1q9o^gfeR53VAbpDWke07TBcFek}?Wns`B5H32 ze8(-0iC`0T9g1&eZ^Xb8mk%CeR(x~)rrL{$!Uq|*M|>lv9ZY@!6NNI~e+S#BQuY?4 z232jR6;-efB#O at Box&y0*Hri^Q&TxUOoC-*ke=?2d!SG9T1=eJjGXx_Jm!O3rC%Wr zP?K{4^&9|h-RnV$a5tD at +i+19^^+>g9!F1xUHmJc0Ubhn>7B{`5H68(JUK04PVovl zNwZuok at 3{KLcQ?m8BdxTv>?UtfZtB$yiCNQC_w1+g;Y<^!LG9yd=nL$e ze`E at FOJE8+r(bN&T_T;-v)mH5$IOaNoVymReG=2198VOc?n{cE)TccYLwTn4c6t3d z7Ocf%ohwua|IfaXABpKkTq;smY4V1;fkp9n6yCn?>&1k zo_;H(@y&Nf^4^f at _f;@=#W1 at nM*QmcGBDK@!JO($m5=;2%SvIld*~~rzw08wcn z<~C4&+Bs*`Sw=U_i)Ja=HfBst+A9x1Y1Jc8CQV#PMpiV;ReZU zjWu5arkYEvfjHO*EU-dtV1BhHMd!Iopddb~YodY0EK^0O;HBY z$m%+;8Pa07!AaBQJ7{!`D77IRbFxfJhnWr!DRL7o?K96i%R<%kW#p(C<|UcFf3p!F znCUhb8xFEc2Hyr6O6Y~GToXPgO7+{>!DYm<0(6-z+v(J&e9b<~D+#@(jeW2|Ft%h& zi++cS4X(ldIbW9a36v~4-Lfp3m|6zd6$`0`rbQ&YyHnoanx)lXDkou1)u*N`p3yu5 zdX|1F#c2y2b_tkrNHnquu6(H8V_I1)wPo%vM$d+}N!#KhWO^PytvhIMjkjGaWkK3d zAIpmkl|H6LmHPSrZa^YrX2}TpvKi9m>nJ>!WQHpsG+LH4M z_^uv`){k6VMfm&L51gT5%&5)fmao^`v=l2($e4kW?qT`hZ#9eS;+hDKNkrKi zn*O)p#<-tC^$1g!CB}(I&J?B7VmW5Z0q%1{ch)9M3fm56{RU1Ads)2ta|PO%aE1nJ zKgNH@!Sn}T)m&?D{u}Xs_WxrTB@^^OfPkLCfq=;V|M&m at hq66aRbLTR8HvArr)}PV zN=e9CkSe-~p8l%cI5vtngH70r=s-BX?WT+&O at E2uy`3qM{9!wXxY45||58V at oo6#>iM3Y2FK7JoikRVD zIk#aqb=?1H+>-m{F>mL}vhD3*!_wOOSIfr^XXmwWgA>176O$|NxkdR>67Ox)QD9wj zR=51AuGziIyN at ub0~+^|3n!zKAH&7<_6gbrH$c{(vkJVPZpz(ttfkfnSLTwcNK`$G zGVUM>(8ol-B1RBph1NLgNE-#Bk$jwrWzSl}x^2`k z)i6-Nl7dYGmpzGN6!i0m%#%izP~HI3L=B~aL7Y=q4_9;y8YQEkC-e#O!%R$o6rt#ITVZDaKWMs6k0YKFh-o6=Q1D5RV&QNx6 at g*29FsZE_1#yHsQ%K zUC at cm2k&!Vsz)+0IwJZ9&i{W?ryLCw{W18 at 3}pU)RHyv^>hfE4VSUv`Rs@^tySqDs zW|GhuaPvq)v%zSrm!T{{#6ZcYgpn%PWwk`eHex3rMs(Do<5yQTYF8?#Xs|{wiMoZ0 z1M3ZMwydjb?d)v)+WxkxS6_V0<@$kf5I_3q`@adYTFmCSoK9!5x;XgreV&l|L|R7I zuK&faKGr? zZDhbOn7*;BR?AAIB(H~g%n4IhcbxT1iAbW#^hyB8YF8di4m{z*nSBh9LDA9j$$4cA zVMp+H1aRX273RxkkKpABX%f;&T^XJnbzGVpiM5Mey<{V-YqPaU6xVm-YU9Z&tPgy7 zIpUP_*E`r24z<+CQ;VDpEBG1=;h=lfD_{bobHPM6FCb6@`Tyrc8Ms7HBo|9z74?Z~fvSZsBD*AUfEt{F>df&}tLj?*H&NS~{{I5(MZ_ zH8oLhQzDz2rm+8lHiG7Ih2*$;k)gzf8OJV2 at leibTJlU~#N>eJT;H)G|;u+d)5ri+-9{W}(l-MAn!z&xKH(G--vWUe4jCJ z>{@ZEdf~0DYAR~#=}F2DvzX51b=VC8J$=MY+ULanBhH3n185D`snPv|oBYvgGF}6| zQl8&wIm?|2J5_zQ46~RVdimJgft{etS;@dgTIAlZ3h*9l)YVZKFI{w=VZCN zc9ga05I}>iHyy+i7CjTY%r3ISyGo-e%bT3D`f{wfP*0TVP>+Tmf?DT{&;JPi+OUU1 zg^)|35de?HVVZ%)@vB(Ja)|^Rt9+j4e6)A)s2bNH=qjSldBytNR_X;bKSLY1D%zQdlA+l+oS at Iv$F{YvMp#5>ws1~&5 at E!( zFcUI%iPs%>0R47J*}8G9YRw&aX>Q(M+Um{%?C9GE~3OaR(Oik z))u0!Y)lRHs(R=U}~7< zGwHwAEzWab855kpHy=+8%T)0rCu+og^$`*iVSz>YtW7(dW z2YGVAW95?7w$0m1-CJFo at A~lu>-jeR4F7wqvpH%oZLd2hk20x_x{;PZS+bjf!dyL% z3!T#>NLJrvXRfB<1iTRUkLUYuq{Gb61`=8PfQEa(i;%dh?& zUNz6l(P9(Lj~2`S+@;opZyTpAY*kyxKc2FT2ySEq~Tw6_%~hW!0KJ>#+oGe^}?x zbwR at EHzohpc@dAZQ at D_eW4B;gE#YCcT)D7=vs1jl5qrCGE)aXWb`Bg%ux!~a!OP|? zQcTJ2EmK_1ez{=TCoyOFj2fG_a$b(}Emuy?2FHZMgslXVfmi{t41{sviXrZ%BT>r} zR-s?cRJ&w_u3x1J%6_pdb>+r`*#OayrsKLPBnmVHObP^HNM?v;$Yw}qh-b*RPt`9b zgj|4i&))A8$kOlHFDC?U$g$7X&({yqe-X$E)EWpO1m at VNuvgZ}V^>lcXyV!x6SsQd zoZ-Yx*MS$!P#zWt0W^05Gr4vllLf(r;0RFw+~2!bSfH?1ikDkgBq4+v==Z|E==M*5 z&y_tRK&X at FJAuZnD|~k8Lg!vzb|#P`w~jPlL9mD~x2_!3?H}`pTNkh+X#r?n4>TQT z$Oi at +XQ4Z-b-QwuLblQIjgl)bk9$!YYHNhjmbj=}ba7fihJt>@&1eik88r{T2&?O5 z88i>S#0k$$DXQyc#O~O at n@g8i`5&bqg}xG2w}0r?eH5zYXG)*&_|;2K`#!+QKlJ#8 zOLz0W$oDAVuK)PU?jhw~%=)jiqB-Y3DI|Kt;Rz0q-3SiQ(Fqbs&4EvShLMzku)wk4 zu|Tn4u^_P!xlovZ9nlOigyQs}xL_OL8t{-na$qe%av&|ihkF at YF>^Mtar#>WuYd#}BMT342 at X(C0 zWb>nO82u=+dY?PFmSlgCEkG}U;R7Xvz>r=RF^wzJ|DtL7RBHO}Ol6vOXhIRt+7|85 zUK at iO#%glSABaWB(t*?f`>xTlB_d{kR)Fcl3n?z8lt1k(11U<&{DCT#1+N7jikzxDQbk^-Ru^H~vYr$khq z4lMFHffXPbf~dT%i`y(nsutiH52=c`zt&);cGrKs0-A|D4;a?8npgNa9>Y=G5si_;f5c7G*fqG zNjSl+`jt2P)s?x^u9|_2r|YYe5ePBWW|S3-BhcoUOmc)_#z^j87}cWmI~m^NzYtlv zyF~frz;|j~xyIm@?H=B8a!SvnJZDbC#LP7p at S4^ya+yQ7sfz=2XHq&?rQ4b6Z70{+ z%WB at qYu>Sj#J%8`aPv$U#RF!{=Q9_2>>~bwUZGT}aG;O7ouo3sb`6({n~V4wV~mX8 zV^|P;N5!e-q&L3UGpuC}bgUa=43B)5X(u(nM*$$GlR7$99G{iytZ?E&=>-`G*x=9n z7q4^q(1)lu+HmU#vg|uvw`EExFr6BQj;(GzmvJ$9Z%TE9M6VE7I at TxPhtTKC9>&3O z*%vlGtrtty&dJPFptBK<#?W69?6bsG9z;j at j}^OGxrha#0s0e#0p-an^CHgsb8~7$ z5sgkx1ZkQi7E062I2f2w#}$H0c%vVEB4<^MANed4pD}TxVmj6$t<2}d^QeqgbXIQi*(;rbLhNT1>4;= z;$-69Vc}Itoy~F{li{=lCTbZZNg0FFr<%R)S9<_H?Mn9Tj&v`-&9Yxc^$uXiw_5s~ zI|3oJoGbT9aqE_-!g=%eT^Hot!zQ1@^I5aI?boGRQQ1>D;mr}jxcDTIOu1T|JC3&~ zf*X`yX0x-qYuBX=rwnZWxt~0K2#yE zjYT(?#GoolX4qM1kBOHtl#rhCzunR9eT3a>B;9hqywc8j at fiY%)w*ACFMo?2&MLs$ zX_G%uM|N_pd^{Fk-_#s5%^fsFdMJDZm3q5beLN_A_B4AD-{#MOwx1kDdXzOU2Zsqb z!gkDMBRQ|iioGzOsW{tasnxZI&z2yG#GZP*% zOXQ{Y6W#&+c3Ta*hXMUGZKND#X9&yJrFns4GNh7Hm$QKuFgzUIToFC?mf$p1W~RsK zSUQ6oB>3oeSXt;d7xP&5Tmx*>taQ7^9O=eK>r^K4EI2A{L=rh}t8#=hC6mrf;(2fj=pjI z=ZK3R6 at YZn9((cfYahX#cHWJ##>{jWNu<5Q)f;?QwRWtgl&7b1vpoAkMs_xh4RQev zzUfECq2vbeHrcGyL at 0*fy$5RPOC{>+mzhFs#coH1q at a@H!oH z&z3!RtK0p@|Ha2UHt7O1>zYs7wzb-}?bWtz+xBYP zwr$(CZQGiCX7)_Pd*bZ*P(Pp|v#!d#@2VWDs-eroxi-La=3x(0ak^ob$_6T(ZA|BE zQ%S1}zutPOcrk8L5r+@`;4()=cvi_A?i|AReR*h%%^gKKn7rN&OmT&YmdjWB`j!3H zi%vSEhkRhCbI|Igf`5v^mwW(nk at mQ!UZ8Uj{)r0H`$3r!a^-+~m)zz4$`P@)-{R25 zw6$pBr1A))8s**p`K+_ at IFGy)Xn$v;6PjpOIjq(f>blM|O!=<9c-Szud$PCy-9ibb zl-E~UuJn^lL)B8OVy*UaE4#jH7C}51O#R8&znTlxQ)@bqb47OabU&aFaZLO$w%8tG zvVA&ayM>i=A8miX@`CM`rDN!?UKCqAGvF z;vjX0Ia5^sby7>i=pMT-mT0wIFKt`{grYe}s;d;-7!V0ffB+0k`$Y^JeA>;O&a za-VOPWa+)U2iqH#+x>M#Em*bjV7%gRwVybQWnUT--v${=lnAneF at CYN+!-Ahep zd-Vrp##fo^b6yc|2jNVoh44y0-8(dzH5&JYXVcA2!9hT7EoKOLHRchiW$pt_gYn=B#hw{$Q&E?{PDQwARw)?fwJnJf zey~2bB%KedUbt%0{da}q4Ij=5cih}F*pz~Ga2bz(Gzt64$GTiz8qPX$(LX~FDMvb#@vMrGN>r2v`=l28gUNTpf8VrW)066=Cs1{%7K^D( zz88a54F*?Nt1Q;H^)y}mnwz>(W#u1YuYr_c<%N&atHKX+7a0C>`>3|)T{_?`BxFz`fZ>ZwW&Tte$HQG`=G3oj?Pvg z(nBg2^Js+Z-{bocd6G)VvTLN;{Wfq_LU$V*N!%y}2;DJj z-})Nes(uygpiTcIG~Hvgj+=!xPc)gFy)}c8>-cjz)O^21r-&TZ4l6s_7}eBz=0ozCB3}iiqs)uL*G&FRDc8u{RL+P` zmh9{!dZ+#4wLQ3do}JiY)%#0$M|7K044g0(`kj~!Cw2vR&)iGG)L*@XCu(COE0J3W z!mkDPVfJJ+YqOv&mUyzoRL60)q7>`Uh^s;eSoHhw(wM;uLtmXE2G0ZwIolH4p>NQY zu_ChyZZADrS-XLdzf0)4J_xDo72RG^c!S$o6vU!46!tZ)OVhZ+mzpOO_Ekf?FQ!zf zW_3>32`&i9m~<`vvG3 at 7LpmH{+o6%MZZ?|QJV6Wg%h)$eYG${OIN9CV-JeHl>9S5s zXzxey1iK5&X#um0*HTLX zsHtCwjx>$^*&!ZJ4}~`#Kdq;mW~gaiH+z-pf=IESg|*(ttdVRRZ-#d*?{RI52?D=h z|0z#S2|Vl-0RVur|5~{JM|o1z*zCW*dD}$sLJtTaiuE%3VHb{wH8m>3yaFPk)gghn zKevscpcsMRJn5+W2SD5 at 92#6q-5=qmjCy)sA^Nb1`ZZ~0LESQwHM&XGKB?wGxsXc~ zTx3Lx9r0EXs)M_9hKMAeLm8|%MHSBj?fzg54+S%%x=})FlpGiv4-|cuL+lFk3qTx^ z^dUOIasWl%>lc>OX(#e>@Pr#=cRGxif at Cej6qe54LHy_LP@PIz%zyv at SK$B28W6KE zu{Qn>Yak?EN^U?NF=VzmNk^D0;5YWjx;G;vz*olsh!6MnBS=0-EBDPRqee~)Ac zks&@^1tT{T{guq|?a zM!_R^LYdOZ6`}(8z?Z>LxzGp|;3-PzPB`4b_+cfa1WH$tMW?e0jW3k0GDnrpkR(P@ z^g|fHVNP(Ky(hnGfU4Rb$ zw?L72t|mHw0s!>T|C37oe+TM6r`KrN;iw?~#9Xggt;*`8qGm}gdKuZFv}#Lbg|e_S z1fwUc5K*Gm9!7W9cjH{S2(^izRlEUp9mkjU+yNA?B$N*rCBA{aa3`j2HsJTT5YN4t z%}i&eyq#jYJYG&~dx0hi5A!xIWlQQWHUj7u9Sm1q~sdkXiZOhp$TC2P2M z`g=AgXKi%YrH7Ybd8<`eJCmJAvVmnL5~|ZJ7fhG35k^tDho_Q~EM3|Q(k)5TKipz} z7Z-35RVH!OY?{4Bx4T!iwRvlXg3gtxh7WT;<>E(U=eYCFGdL*;ODv}6sM8r8D+J6( z<|<1HGA)Xg3w`uex2wvmBFaxFVzAqmo-4A+KtnrpoBHk;Svago*w zX-a~lTXmEtFDLbgmNt+!Z(FJmUbrvfdH;~o)>4~R7c}$~W`Zp*t(b#DSJTk0c#s`o zTmsiT(<(kRK{v5z;sEpMZ1?!t{gm{D9F~f0yQZi2>9U_KJ< z54sT8zTH(I)V|+&A|knC{RvGJ%o>qLq-WF?KnThu8bUPX7`}rR_Cv(b==>KzNLTNg zz7IX95{d*1j$}j|YL4gtp1zNriziC>k9`m3K<4c$Z2*Md)@VK!t84ZSXfT1mscqCg zmuR|f>JDlUdXQ?c6gHQU=gA140D?jp41%yK-9B)o{!L>yTqLHAOc-pA}if_hPWR9rD! zd<)`Dbw~WhEi3NO z%x8RJX)QYtz1zb`u8Cg%U(lTasM054sx4v1d&&|u_`Bom`8U1?CQ|b~YWC{m(lkwj zOf%=EQ$VuA>>mC{0Y1~Yi}9g?9Nq_t2uNnJhjr9DV~+I zY2*6hCJQPzo$v$kA2)PK(!{W%~Rto?Q2akEl!tVXRX$)Yix)u)^N(qST`f)p5z<4 zg~!`GBD(-7cqH4@%7E&rp*}g<7^2L=w*ZcXU!sH0f1?&$JSv{fkzuNs&OWVDsX`T| zk#If4uSL8tw??hza{6zgDCVIWUD-1A#Yp1f%$nHG_}GT)0<_GO2o4IJM;h&{eryv@ zPp)f+A{^CG-DSyq?JhVkUYi=WE+=mZey?a+tmMB6jb}@LfEC(Zq-02VEf!CXILJ3- z2OW^77sc)VO>NHLe8K!Du at KMLF(hCC00$fZ0Pp`yEJp*I|Gqh^)qU)hm(lp`b~kgm;jnE65W?ZTd$OL1B&*LRBCyidykc2+e>3>S&<>9qJ at GrFsi{2fgM3 zew4d%r6i%={Zz3=n?9hn>BsT9;fGeMK(a~Uuhzr`?TR6zvqMVD-3{x|qv#2^xq7s> z3Guo{viUCdwS-MY&upZFyh${CRjS+bc#)%u&B$#PqQd2JA_d6W=GMr5)6Z)P zu;Ymmz!sdysvh?~R$7&sIIGFQiSr5W#3~D`yPKI3B?a*b*Y(P3lHvuWt^8=mXcyFy zPbG%oZJ;!}$ka1R>&g2s=Ij@^nGRJ4-jBibv{R%}UaLU5zC3ohWG6 z5_n}-XVB!Aife)(P%)6W!C>* zT>cn!my00db;KDWm({!f=^zOvI+5mu$|Xgf%1Nk#E}hG_|M(aYEETE#zE`dy-)Ji& zp{h{g=;mlseXPCF-puw7&gf6D7=@Q z(7b`V?bBD&hDFxq9<=OBdhD(2qWfY!b*WEqe0^?x4OcWT4^{z&ORl zcBwm79}KHDZ{@FLb&t-$pbekgge~cFK7sU>pz{!T^}SGWeTaTp z_CNbjfo4#?LU&4mxkz7Gd!&J at kh*Td1U$lbO#QxrAhr_yk)ZS*dj=e50k&%=0r+b- z0UTWdcQAqMknkRaf*YV$q;HJukxWKKs9-)0UOlYJjwPENn$J8csiy__=gt7hO0}DiHcoZ}^L5#(;(We6$ z{s9LHH{hS~DMU6x8)W9Oakr at 6y>a|h8?l>5ix!#H*%>v7%+iw#ZlP$#Y2+vjNiBVt zQPlB_Y3kEy8jRq*_)~c-WuVR>in~#A?P~E0sXg_este*aoctrZSbbVTKM{K(pK&{N z&t?UswRx9DjX^UkRfZu$8Ed$PuXV(RZj8}uHd8WF#$ZF}3@j^yn zH at I0DYmdWPy(qi5)wzJ_q#y=*?)aoJvMh;Ytdhkf!Er`9&Xfsoiy7JdPDV%_R4R&p zw+yHckUfy#5{ER%KTR(?;dysyl!d02;B=@47xv`~hTTE41=v9+NX#H8ckNE8$XH=8 zZ*gM#J{&mF1EEA&ld^P+(qQk#Z7J5OIKu;)A&2<92>6SVmlqVzZynfZmzFGUI(W_1 z)V9(H%oD52W%Mk`&%}&VpBz!4Uot_{1KwCLpt5}oDm`p)Cg4u6b?w6TAkYXn(pc)w zz&knxc`Eh9)>&d=@KjvaScQXkgmC55$!{B3(%6t4aXQS1$}Y*%IKVn?`9F{oSs=+a zPaAe3A$*{#4#SZ18a2^z8*|yhdrxL>QTWK8*!mBxkw at a94-hgs`4_m1CWa(TALy1K z5P1vwOia0~7rLd!UOn;|x0ynG)PIZ`Y9bm3Rf%YYG(EvA z5t~-T5Fj&}Jk}zllAe)VC#sb?ZX=S0CEfy*Zp1GHHt38KpMV#39pBxugP8v*b4PEM zLs_scc>bx1ee at _oi0=WlpBA+gy%5}p4$jQKjQ;JN-7Sr7`+0-)cEkUHTF8z2iFvXk z+BI8NcY)51Q~H)PBaq9c_V%n|L#h?#)ATVpxVLRMW8%j-bp*C`FD*)? zj<)IY?nlqPmwNLz>9y7L)2NGJ@4%rzjMpQnqOMsJheBn?T$apj zw>jsGi!p4UQw~iJ2gg&m;?+JU9O%$6n^O*$T~F=085Z(WP8R0{&okGW=ea^7Mt}AG z<&)(ibCjbF7k at a{i-}q5Mcf6=GCTr^^F}+`G@{Def;F%rqiAK?O&}@ z+t?`c8ySjl!6T0EX}`#T9ig>=rErCqrHG~t6TjQnkTLti2v*{D9}YoURWQ4ljOr9l zn2am0U6&~nf!!5zdOwcb15ZlZ``xguhBlZj3$?7U;UR~&dYcEVEL!L2-Vx*iIit%&`y$sdhw4GGCHjNcy|;vTK_dt4 zxj%+;ve7Ni6y553`pZ9LWn(Vliy4ErwT=tE(#kJKF4$P4)#Zu25-W(Id>F4AmZuAB zJVxHJyMG#a7z{3uuSn6(mvy5ES@<`38W6I|>Iq2O!zRvC&PJ20bp*Bx+bd#6CDG<| zO5>(cnQlacYqCHI|fB-&Ooc`3_eMMoozBO#=Ns2z~ zvkK0%NE^b=DbV-F6QFwL^O^- at CP zkmPs6(`>1oK-`t6C;ji*UBE7w9vLtIKn4l`;Qt?65D5cYW9$EKNaL>Ef;{RE9c_}q z^1z6(@RmN;<^TnSEbd6yG=$_*y16t9pL!k$x+)pNYwKB}+{Zu=*#NRkRL_Sv)@*l( zs17Sz`|kUFwo{K&g75GBIgCFK8z%51S5Og-N+{=cTc=fTQ+3QWTXk5F?xu|@=zAJb zxm~s~JA$igmTpMnvR at sJ=kw9t at 3{Sb+mDoQXUpXh1ll2`u z3l2O;VUUsUDN|;|^|#Ncjl6uJTB*42n1_SD+Xw95MXW8?50}|ayW9CT29M3Kn#Dpc zM}l>kiRLTcNu|Xfp8eLO(rJdNgWvM5l at jrqCM;6-BYiC0v!Nn#P{2_O!qLq+ at 60Y++18B^g zLOWB@`sr3As8e7b!3Pj`vHQ3xp1cYTQPy)`|Gw;nW`!T}t6x#LZlo|up0en5vKAT* ztz`KNY5z1JG at NLG9vi&iFx4U at g|63*Z5_fKpLGkyMVB}!$;I1FTvD39FfVnz z)-UNs>D>7kS6PG37;W7l4$1#B!w%eOA5(w;fW809GJ^k~4Et|M&PPE;3RnS^m)`8; zozX`_NybD&0iuo8oB??Q`n&9ECv2V!r|mS0 z`?beuhap$*mH at yO2etj|$r~Wg`AkXWv~Z<+fXiR_SZ>8LO~E z{kGg6G{tWVJR;k!YI_51?)6+iPY4fs at E+lI-L6ur>L`~H?N}`m>GZp?268yQP)H at 8 zt%O$2aU!ID#eS at g_a`#|3wRL(`OnCo5z+%P7TENE#6yUTNJb0>3~|_ at EQ|x!6az at o zhN1nYX+~*g5)3pV`UY$fP|~91Dh$zo_CdetgCf5A<*H^)b18-I|7`%1Bf%@oZxiMv zVw0l}bu5l-L~6o3R(~GSRX^m%EQZkK;GLqCTi?K)11J|FYt^?&Ws&VHHN<#VMLFm+ z<2Y^Mq*|LGwlu{KpjK0I+=r at 6)HiqyuUwV_Pmh3UTI^pQxo`;A2Miz*&1|adB()v_ zX*t8h{?dS{D;je4H6T+1sU}I>FRu;OlTMmFE4+dKZ<081uMQyy0005;KMDSl&L%eh zFEXV5*U-uzIvXsC!X#q)&4)U|#eIb#cG_b~O(7PALm_tA{1oCQq=+kL6GIk8nyB!R z5N;G!GBVY0nC(xJFUkW>H(Tx`apMf99U61XbpU*>be?e_m-kqHtbbGA$qNP^Q ztr2JA6>yJC1B{?9QY;=Z#e;wGSy~PFn)4>qso^^mRi;kqYX&sZ at W`CK8Q~{NQs?gj zVq9p=E2;(KLY}0isTn5bOs;jc<8$gqE&c|$B{5e_`nc+0$SR|a?bbwsV5JW*7C?fF z&>6eE?3n_Wg6aQ^;)^6sB+)^!F&-|b74l5yHMNwtjU`h+y=9pfnQ8^PjWYJN(F9*gsH9&IlWuwh9)FC?Ir53B z^0kCxLv``^+MHPiYYRhEs4Ll6E;!&@V*oK{kOi9JkfY8`jTZvRF|vFv{d$qUuniFn z*oH0<%NnYu>N@%^^DrQTx+3-?Feo6pPx~yDkC?=*l77pY$QK}A%@o!u5^$15WPe(y zuawt{4`d6%o$;We!90PvSP`LxV&Cx=_4NJtmMGkqE6yO?*KNQfFdYmpl&4hwo)Blz zjHZ3-AyE^LVA2!MaA*!u7!~{jJyb_BiaHdHVwOc^RG8S-uGxiat=hFzb?O0-Kf)v~ zK-}l6IaNOJ&o^p zwlbWfUi#EWo~Sgbi990m9U7Pmcf|nhh-PN8A-#>wyGc|?z8Q!~u!OKeyChIQz+HK9 zlc2#r`3*+tv^wJuYHW=zow(v2|1 at cI2Kk+z2) zsP}PPuFxjZq^&LQe{xCAWl%@bv2ATfGx5dypFb?nCv at +l5_wF9NUgI#F(lrtl zDHnT_pO+PBBMv+qJ!k7--qHQ$|Id^4JDGA#1_l6ZL;X*RptOOZiS>WGOv+M9N at ke8 z at SLfCM5NvYG#8;Qks?`9i)mFSM5h99g&2etu)%~FBLl%S`z8B zm#_k5U7Smqzkzg|=R+0==Je!0dUiRrsrs3ma$bGEbsskQd-=fTqAQVk>R*zAL)Aa$ zx*Vn at j-rLw7!5I;Lab|pO%=6DjOS3 zCWITwg|s&gRu4ZoiQ~_5njffNq@;o#-cs3uE@?fJC!c|UA=$al#X`de0HyiYm{5~ zE2o8}6ewbq82X2USG0P4J;6d8qgruhMkC}bOCbWChMUVKBgA~3M&sSel&r&e1Nowr zUR6jb86TWUBT;&vs)Sk8$bfwFgLYZkJ`%jymWD1PBnmWFfd*TOdF22ZtK>X0KlTZE zmRU+K#k-+|mnM|RBc>-SSf9=a{VJ>5d4*z{^Ki0#ph|Sb11f&nLGisSo%MmF#UK+z zZ#FHm3ns$PMIXwma(B|tTRi1&OS^z*&0KTWO*n?Qo at Qg@BA_ zI97UN#MDO0Vkt%kh8L@|`PtH3alY2zCN{j4yZB%{;DU(x3OWxAJ1Dh(RDN_0QGgmX zQ~>a)fFls>f^-E#IH8Ry1B9!8Lzn?#Zghh<05r6RKsd7k%H0dY>R$*ex%6faOz>%s zOuz`snDx33a`K_R8s-E$2%F2`J#mLM2o^f~%@OL$?`b~~s|zv1RD{`ccgO*bCHAF! zMm$)SYZ<3UAj|AM#?WUUnsHkwA^<5c(W1%vKL!hFVrh2le`G!kfI120u z at d;e`3M32GmO?Y%5B8FPMoRuibssjyhiHqugF3-WTr8fJc|e_}ShL$-Gs?lH`uih1 z#YeJy{OP}GITqa}jRZX(|NPHZrzd*EUB;@!3CsxL-o$L03cAn)H at ww$UcHF3uO?qs zb}Pdn>w at i%)sjVRXzUPeN}(dtyws6#mw*jV8Q;B{eq5UA@?s|kg}J;8|9!66%HlCn zhWOZMC$1U^pV-f#V at II#;~jNG%02`RGx&A`eR)~#*=kCPY>v={NC-T6?bCKL@$lW7C z83xxj22WOxOMcY$r6EYTqaxXTDB1Z=-fN~7hQwU=l}pq@>9O-dr-7~GR1D%4l{K6; z&fM`d`*Yi)*cQpUu+mhQKRW&3>=iWKcft;!a`0cglxv99Bh->*JIr zKK5(MSJ{{mcE{$3FcMuJoysgIu}4SGZ_g}S^78HD=+{{N*328bzbB+0YF*+`)U)?y z>gNiB7tqoPD&@e9hnx*nY0w at X;LTkx;_7%##&lcwHK ztaEGhd8+2U)6t}r8TQSY(WFC{>r at 3xqDJblbwm|V)roae)fA9*vyM1FvboetxCGgK z!4mn2kXI-uS-*hc0^z8an)l2>i4%D>J+3u8s%^g61AG~_&o at CKSop-~pSjh3cc at Md zW9#Z7wy0{_Fz)I96R at TT0$_;$)$26F005-_N5IOMIGfx3r=6djtfRCkh8n6D0M}2G z1|XBq1W>Y!usQT5C}xq7#<9r4Nk(3_-D~W5&+oe=InXfwd-)aG&;TYm9v-&vzB8o*IgzX at U|Ik zDvj|oW46aE&gAG)S%MQhYzM}>R%;Y-7<%(kqcv??ZGuZp%`a^C1^Aa6S+_SP`Ci(z z=P(bI#=WKVM=jD;axm0kpr4oq5}gDSb6+gStsA}%I6oEjy(jHot}7-6v}x9Dr*F|u z*L7hapI8=ZHd=sgU50mbUu|Q;I#jB$+S#-^(BoRnZch^h^Mo}f$Yb`8{=nW2NDY>~L!GYkeyWYNUYS z=9O-AIAlxjs^eu2+kF)aqY9bwcvcyX;Kn at ZJ-$CxRU8nc3stAJMw1wcA+SBO`;cyl z>@?A^k|d4w-h6%?Cj5As5u&G^q-ryNaMKUxCBMs_!E(~6B=avC9Rt7?nOfv7OoCE) z=)|ugbg9qbl;~H>s?zw)3370+v(jZvdYijwzh8}#|6)@VsvSYD8`aq1m|aGP`qGgs z>K=v9M7l^2xqoY)Sq|j at uXx!9W*I74gnR)a*piK&=@Jy1V)M`M}Xwhua#A at W!c at I9&PQptuHVJq} z`T~D4jH4^i578;$K-lnpNS2;i1bX@`!IvCtP=DQ#zr_X^5d2eW%iS=)KczAmbf&)!+kOPLg7NX~M2Ad&A( zkg*eb-g|DNTtLlCgwadEwF%=xanAqt*ClT;p{8uh`LzR8M}=a0Zbr+RBB92??4g|) zqjTd^x;pa4n;Zjqr-LRrjSr8{XPLkIuv(nA at nAri#z&0{wSTpsME>K%nSE82#b?Od zGk#`-uz4{d$9#c#f6YJAhm~a8h5H57v#`0x_JphW6kF3PMO_ZW1ga zWMu3CQ`!QV-0MZlW-ECj(5p6TmP{H!R1o#goJl3+BD(FX#unFQRmR`P&R1XNL2A?^ns3<1p;9H0YcSi z#9erUylt<#+dDfq#V>Z{O%adqI4gwa`r->qw&T>3IXbx%8sDzgpIuZ~BS)dJ`_DEy zhRs%W-Gm(#zAuhk%*a(~xV;QzWNds2dMa8>ZI>e|J~p^cqK=NTQrhS=cvW4Q)CRx; z3rNIidEl*#kB*E~(wiPWE)&m2Ff|x08}baYj^h|DYuJlyA4K{_Ux6 zx7R0NX*gJe0?p^a*f(Y{=V4Pj1S7vh5heM=@4_~Wsedw&6?CP0Y4_P%pEu;ZL*tZ3 z8-;YBm7kXq$JlN4J2B;NCo);@X2IY~?VZx-yfl&IU zkGNVC|M)Y8r2S6sn!4!ojF^&>HD$D^ms3_=B^xu{%<*|+GxIBG=Q#X}uyQpQ-;Q~y zG2udenW*?vr%j__fXc(#?%q&%(uUsf}s?$9ylYgKLkN7RbT(FPl7Gfbt%8WdkaXHjVTp~DV`cnR`zWAq^%;O z;^RJWNJJ0}3rZ zMXUdx6sOL}xuYx(E at SdyDu)b85`T3C8K=>4!)1bt6Y{D`W7mK-gf%x#drOJ0WJ8bT zygI`w-CyNdnI)C{`V at vT@&uz)vMdKCvV+Gp2Vrjd0+i_k3!mX+jd2l^hc;XbQrYo- z2gzf at r`sni+c!=7t+TkwVy}G6mC{4AYfo}bT%Php4`5W=Gh)}c{O9Io;Yt*j$i%@k zj-W+pSvC8PghiSa_mzo^j|!9Vhzyl2gjpq1u{F1uGnsDUfOtne-Zk85HukW8`@9zI zV34|n0qZJ}R>;rPmuo6tjh85qDY9}j7)!IXmh{j?cyXE2`$GnUjrPa@?$>nkW_XQ5 zZSRjh667vel*v?bD|b#XWEYq4=19xbT9W~ntTrvD`2>+|kt)$D_LXsIUl)@C?8CO4 zMMJ^;;qi}fmq;}_sg)%oFa`?=bj#tPj0p`%e9P&p3LHUL1_e)GW14;CVYaf0^4!ca z-SLOVN>%;lQZ*pvtv=l>jU=??vT#$?QdNR|jslMkfoH4(Q9 z6~-yM-TKD&m`^)aY`%J1TtV6Re+0$XBZDMa#z(m-?XxPs%em zNZK`JLkhBpDLIL&^8yn72wS+y{jKJ7u_7nOWH0Yfso$ueQgu3LrbfiF zdr}I>t$A9s=AV9ET=v!6E4}~(M*m(aK#$av0K`D=!QYx!5#3`hpBJt at E{Fb!B4m_Cr3|2sStP#Uy7tpKY4EgRgbtGy|A6P6CK_GvFs(^9flru=H)E=uO~LfSD-ZbEG+LQE+ynl zoZ=g@`x|q_wy2+I1F!{NRu2|TduBsT_5}3r0}3sKLUdC2iLe4e at N5teJJ%a>M(K}- z3Nhp6j-)kotG2GE0o6xIf2 zfYImcYX(618wSpqBpRe`F5 z)nV(?_C*8qAk-o5;QYb;?SQ{<`dR@!aQ57Ncz|7?Hf9MwjDA8NniPn0lzK9WU&MUE zZzUSgHadyiz>o4a+&tjD7D6Ag5^xXIPoOA38$e$%j@$#ZPZXdBP=~%-CY<#^Bt+0h z?PKxJ1X=;v0=Bn`JN0Ji;{==nM*(pl?0NfF0(!vhmEw4bF^w_e@<8)o_XY^%yb<$w z#uhO_F`*dX_YD291P$uxc)l}T9Vkh1A2a;J{uHXD2l$F*g_OmRE#-zbZ zjgzh-lb^g952VR2%4|QKmPh^f3GZ0j*QSx%<@ahXKh at JumR)-1Z=3B~?v9_Dn%M=H z9YbT^|kt7FqZa(DVI{~V3(Ah*P}!Q0Y0)iiC+%$l at u zlGgn+D~8?w>tuAw7wx*$HsGBLICT`^Us_nj_Z4u8&% zIk+gEtx)eQr69F6Odl7s$j!EytAD`g+CQl^@$QBAd2t;n*=Hi(izNyDnY z#gF9{ZaQU%Q at 951kDQ~Q=`hSG;NY8eVqDyPw(T;mdJpsTi*9;KOSszv*Pga3a?DWr z-Qc)(~-2Ub9Q77H`$I-hI_1S?W4%7b+eJ%0jKRJ41uNyjE8HcB7k z_}*T9G|IyRQAe*R5NlgPXtvohVJ(NEafMjgiT4YUUBX>+5W`rxTJ|&YazS75$(FI$$z5DJoUmi?nWVvCKB47Hiu!+KAlc@#Fvq^ZWZL3~U>Qc!hj ziVdm^bZuk|pJ_iiy^zCWo7tEW-Nk>wOK;`o6*)7+OU26S1jJD zb1H*Ro+_FnFs!aoa((PyDppHA4eGyjaB0vsIV#l+V*KC&+tb;_^o~clHY at nCC$Du6 zN?GKBtx{BXK}!3-8{#T)i9U}t!&=LB6Vky*Kdr!81f}S*NU|6X88E}{<1*_af- at xz zwI6SU{S}&&n)a~s1V35j_>y>T)=F7|T?y`*F(u+kM=*Z);$IRt{Rv`q+9Vu3x~d#W zEd#e}&_FY>b)vbBpHz?SZ1o;fIgX3_5?}V|#ZisKr4G^-SsonZXdK|VK@&858uic! zjYlzL<2|!2-t4LyDeZJKC3lr?i6JzHD5{>YzMSBppVoRL*_pz1jw7XcxMC2Tx^D&% zg=M%c>qcv>bAAgUo@>#b54|L at qLwe+$9$L<`%FsFP661bh`ckv8}ZlRht^IYAyRp< z;n#o92NQ$((=3C1WB3Xn+lQx~D-!tZ at 3pLK24QBVo$;-SwGGHg= z4`?l3VGS!w*%Y#MeVG-T(ijog6hxr{W5QN!2uqE7s3ujlcY+vt$??+7yS+G$MZwdt z421h?22nym@$CiLVq<&w_XdnS*HzK0N=-k&Q7sjjl>{J^)!Q}Ci{c^B933q%p6REt z5l$NXeH%hP?iCi=mdm8$u^4TawI*;3dbiq{9HowKioMvWJS<_B78Ew+=^IkVC)$GA zjr^iWrm+65;(t#5SEYh?CXc94#$BA`|nPG;$KCUf4ddLNv%-^9j9Pqqz{ zn$msxjChoBWrAIty2;i}%1 at Z8mHFn~abe&(E00X~RFMsUxe{{C5Btib2 zJnBKea+)>Wff#+YrP!wCsgtl#FU1(ImL`HQH}=z at rkU8;(38leSh0G(OkNRAS^-%I z$R{FB&EH9a5c9n4xRTx0qTt8w at qoGCw)bh=B7GK%IH?j*##;iX5DMBc;Flb&VYg^o zF{S+^$e~ZM7)_kd*yOpQgWPXs8Q0XcptVEEouN+FwfuxVzEX$Gt$&+68E5V>a(?hh zE9~YZiXE>}G?RRvk?L94+IRXmJ8EXzlav}vB~QhM&4w{UQ^s;CyVUvAKkz`sr1vtLfA=bX5wFAb`HzP-&}&#iO zP{PDz6I$DM4`Ji(Nl>jHzE5t6sE$Ek|AdHhaWGrkU)$lRx%>EmTHSn6lIW>wDuH}$ zWJ^*)UOaLA(R1#(`2xAYg@|b7Ow%3S;(j?qJkwov6(}yvTTsg51h;iRpm-S=H4eFD z6E{jPg|-1leFiHQb$*Il0}8*6TZ7+_l%zQ)MXG$+LiVU=d>gR}DLwEu2`M$6vAHmI zT;okIy5+8I^J0xY4LIy!4t;lhmUqBV-hx7N3sfy&5gF|yUjO{Dvh8EMIT)1WpXnvS z8+76|t7cxyYkeGIZ*)t+(O!!PjD^vXXK26c^L at bhiJtwYNY(nVwcS_MJ#q8K%5{Yu z_4cP*qvW|lQ}yVB(wBeb0+PP)$*SLPX^r?yr=O#0DeS1;l5pXl4OC)Q+^*EP(|uWT ztn%n;s52UG#g&CPR+`*rlVb=SbEr_uDSb)Nidhz=9Hn~YR*ih4T>UOk`C7V{;vB0} zVpZ%pOpSm~j;MG5Eq0Dv+kzS)KX4yuoUS%r2jcT(wDj_rgL0imC0`@H3F3W75|YJ_ zgm~Ctlhf50gJ)eJ-1D7aK04w=XBjinNjv;`(68`vtMCd?UcG(mG}lA84sCD+VxkBI*$Zw058Cy3p5hSnE(+TIeDjvH9#k5jRIbQd0wP)Ve&urs!nt~I;;I7rsMRc&O z6W-y3BZ|QzX#3Z7m&3`(eKuSuPqSJnwZD7h1(PF+=&y-)Q!}_&i$;2OB!wbRf z0 at E3r4F%~*%pbLX^kF)IqM+5gHB?l&4Xvi+Tap!J2ee>?T(f!?jQ$d~sy<-_>tbr0 z32Ul660|n5`Oa7AU~TrJr>G3~^tp)NqCnk}^Sss=5AS~5(x9e4xx08mndCI6P!(A- zgq(`UwxFJreD=9yb36|WBEGc`7iuqUfU}D$@jf{qyb5kZ!sGnDq1D9Ew5fU{<-(ti z#6vE1=N`^>U&J%ScwGK=c;jL(h5|RO{A$cYs;F?f?yFs1 zgP)l`4N=S9?nN3ao_nE-8`&nu-L at otH-s_`?F{khc{Id!HPXkZJqYfW@)D0#Omn)U zxMO`ot&)l34NSV@(b9Q+`!`Z|sQUhkOU~wB;!}u`W{i3FlO%P*|pALd-)XK(EhZftz>k&JnF1#Qp!P93J6?#*!VnXWXO zz0QfwK6eu4cr1nV_XyJwj;5}}`gZPd6v_Xqv$KF|<7?MFZK1dnX>fOUcPs8*+}$NW zfKseLf#SuByO!b_0+beahajbRfC9l!&-(7Y{r;TK?s<~zWM-}Tt<1{Wd)}Ryd7k?j z0+SwRH@}HpuB+T7i5s!z6`sbO&ztSl8!jr)_L>$EV~^akc{?DQ*lFrAp_rPlIC1E) zWbC}gPeTBC--RTDmZJD;^3-5wjoT1>h2{6F{PGDqVSyRJ*#1so z-i&E){CK}|LHleY6TYa&Hw*JsOxe;%A z-p!#X$847ZQ6UuZc8i8PLAj*?n#uPaWs14 at CvK#rsM*YdL9BDst6$%B4eo0Dqf%eL zpOUGsD*cgWa1qAMYOh#WVlPv5Ipz8CWWV0Zw9IXsaS1R69vupe%aHTXMi-WtJxjc& zwdFtDI_f)=IgkY9;aYx+ZY_(k>j^KXDR-_1(N z*^kFPL?OGe*(IKBN}GYDf{C{pT`^N^tTocnS)={Rx*oWI(z1;RW8+UT8qP_~SeqNx zx}=c)g^G`Z{pE}ooVk7Sa7hwOK*d-k_tcLrCXnIX3cZOYtAt9%o zzI%@Vkwt}v at nY#?y}jn-d#-NS<>AI$;8yhE9O&#L02Sbv1|)pZW}_$?|ATDL0V)X% zVPPK^?x8CeG2TNa+KcD)NmmY%kXcDBA>S>CZFsg}d-uBzcYYRiN*pL}6V-*`+VGX)B zr^?0XYuGlMXps7d>ryn)J at hGLmCj5Z3;!NfuzGrofGo57z-U8X3ANE*NGwy|c#nd| zDyUfXR!Y;%r<}sJthS`Q)@K4k at lHXL?dq;ISxUc{e9I|EzW6p^=1WFopJT1u;6b{k zSP?T0e@$;+`}ynlf?G)Bqo7_ z-IL;7e$Gy`d)eh_G6RWea0DqiPorQlD(y=WU# zcEa-OKHwe}LJhYHMZx!)`1_G6Q%M~T!=*`!1;|SciS%Bx6|Q6eg3WIe+5V&pNldOI z_#tlx7>nFJgcx at kXb|-7RcNN+iUy}s+sTX>koo;v=cnu<;Td5B+E`I*tDM%I| zSfRXf9ac3f(qJT!8j(`%XKi$>)Eq2Pd0z8-<>wC#=QS$(G*%d} zBasay-Rr&7Qj$nY9Q`5uS-rF;{ahe+31T+QooSqnRmrL;r at Ih^e_wF at B=j2X+LC8M zvdfyJaQngm7JYm-Oia2mN8G4O5u*A)yz|+Am#*BQdslIjAfS!DDUBH0$tRc{d?hUeBi<1V) z81U}3gE0rw7gdpQXmkqFp?Pn>;_yfql7Qc5K at g{)+cV6l`Dyxhsb*(S#X*aFcQ(PC zgkHodt5v~E=GR)kY7RG at hS!s{YF!)?f3yYEVb6k3PY$PD9J2ICeXe-OV^h&?3|UGE zfuk&O at Fe$lg{*6Xt~V44ST`oo$}P{Bj;I};h$$25KRddk*H&}k6hg_KG!M|yVT^j2 zB*R0LkoR1TeV2Em{q44YF*9~5Fh|r)(Jl%eR6d95udL~LswC{n-y+7(E;5*t{5QSN)<(Mm_ANR!!VSJJ82mPAprb#8t2f?`*U z!z)02yWu`pEkqC1PfRnZA31M>C4R8d+W*Lpm1JijO>OCh&$Q|1;`<@*np7LQW^kymeQiii|I^BFwYb|t2n)vOjRw*1VdbwxI zPZ;r|GJnjkvH2C&FrF>-sFkuk5+qA>;L`q5M;(v-E=1KwRVH7gW4U at vhxi7 z>n#Ua2iK5Whd&CyJ0rWq0_IzrOEoaxi#3KLg21zHv!8TmUc3eCr&A9jQt at f#-#W|K zSlR>e$>-&iv|2c%A25Jj3?ld9w!b#XSKPRe`lt8;1pQq$YQKe-3Q=|KnDbsTJ1tyU z0gEuN4tPV}?5(klDf at Ke^bNihm^M8aT)X(${Kn#XWj+LI72_n0mF>IF zI?8>_s(wvg$+F)Rl)ok9M369KhGGbJ{-jg% z at W{7g?zMIH8Y%(;0r5Y(K|tNz%FWuw>u;A%*kt&D at Mnl4?dDY*Lc?u)4eG5zC4avA zX6;8W!kuC0YbSs>PA6H!kTNdEgvP9O5NCOeNfHxtSaBH;cy_UI*m+sdb)1ni(o7Q~ zx)V5>>-7UvI=pqcd6$4iF~RE+9!z<`b>ENU6t4D*%2GDFjJhJ4m|AKYHz+z-mP}Lq z7sGR$XVFp+^9{lc14|SS(g{fnI(eKph=L{lgzS6z0UWDn4+zlmDOci0SrsZ#Y8e%p z2HAL6w5TTK;=5g05w5V0io?|GbnG-S5a)uhk21q_KVIZOwjm(PC-ol;WLfFcaFnCj z3$hI4SsCO z?MIVAFd=G|fcmU?nPr7#*=3bw>1Cy5`DL|bsb$4wxn

sC%7lv9v^`bz*JzIpmc{? zhg64Rhg^qhhfIfZ2lCGj;-GheiImTAWuloRDOPho@{2~kbQV9zep}NYwZMv-yu)rd z|D|q++N3g<^m!x{D6cfgWp+Lx~ z)M$9JmWd~sFFDf9G8>UaMPRMM=?ezi5+A8arJZwoSH_q3MTW$X{&z?U5=!(=08ZI* z2m1XhTdlaVOxx3u_#9Tnc+CQsa~w8 at ZAbIHpXmm`s`>u350P{wyz&&f#=@RrS58 z%0s2OU)^dq&Ul}Y-OItF5|hHqQD&T!9prV at Y%7vHmapx at eal94ua~8gHB_$iKI0&F zF1k~d&oHKmn*OCa5!0^yYWioSHmgoSS<(yG$oK>}$hATRbVClIRf){L%#GSE>ge#>y%vB~^zVm6#S| zKotaAmJzK6+s0K|?0QUqN&!G+wlX2VM;Rp>3!!4Fu{?{ynAUE8H6=@Bb}E6bO?efr z-o#gH6 at Ar;k1Byg1O~l{buohI71VZ(nWV3fvK3-?UpMW-dMGi*Ts!*D#7Lpu^_Q2y zO5m4alP#P`ZWT;5BX8>1)47uQIrJVpRm)$uD)x?E`|}fJ|Jb6wgRQHWiW1_+fAYdR zD6#D?vQ(PT^2Ya2-0-cF^L2<_H_jmzSuPJ>Y3K1h9-ZILLG7F9gnnFgXVt61Z#wl} zbR^kqvQg7UT9aS}=?aDlg|>F^Fp3Jae4cry`{r9gXjmT?xMjM zNWrSEcAZI;VJcaTqWf28pRd=83Ip!RC3YS;b+v3DlNsc|WJkX^y)O}Yi>oU=780({qzO zTzKWj95&CH%Sk~(d0_4b0uUY~Y>MDJ;}ie3Kn{cI7E`WaGHteQJ5MMHyZ$}SmJ-EV zV9iJm at DB9MZS_R^tx^EV7EY|J(MEOl8u1~Z=PN>1S87lv7?XuQXa at sQ#ocdJro;}Gxf^jXc8 z%kc{IuFenaza4O;a}wU+^{p~q{K=LT>$dof_->K-u8sKaTKJIZFk1LfCdf4B!c8(y zwh=Ejnh!!BWLn*&y{39V1#1yYTit#}`hk+N+v9nZkru z?merPy2%zdm^!~BerOC(aT*su55ez}gQLQ#!Rp~=Y`3&~kTzJ at MAdn*o?f?oES z;oT$LVnVUOc?9=3w at 6UzzC6G^%B-8qcEHd5h`F9xoZL5VIHu at k`mMp&y5O5$0kqmM zGo}u5)7PzL0c+pxCXvx<-(trMH-}hvohM$+%KZ?bh~4b6U9<+9zOTk1{Koe3}mE)kCXCPW=B3BQcMej8GLYPu%|PI!9*PKZpv z3&!Z6yft`#$pMvFm%tAuy(NQU{tN+ab#Ci*H8)D={%+jBf%R4t-W-vK9U>2RhXW!K z-h{{jX$H)gK(wG}m?o?koHhOc0Ke)Bp#fpsHiHMjAxt3BTYd0gUkDrMX>PL;ToxDx zQ-tY30iPZyBGe;8C~u`3o5Rfzk8y&z7DHG;Xtz6H%ti{14x&|h(ddhZ7rAdA6k4J$ z>`y9SC_e9hkvyVY}|?KoOAAwx3}h6Np}v4fGOJ15<`tMVLLO zpzc7C(1Sa}xxgap at h~A+Id})m at j@JX|1uDo1Cv1MCcPJdo>!#SZ&&^Yj1?;wg9HU%5#8K?-xvR)YO7A}C=jVo>p*M+?R3-scF1^Qf|uh+ka zyG7K#4CVtx!kpGez|FlJ1YKnNHzCkDa0v6QFgy at k`|4pE?APNIzJ_r8vJ20Y4Fu>= zhP%T1!IwQ8_`x){)KGz52J~*C;857>b at cExG&9EA-*syZYzdl25R80#20jiC(S at 53 zx)s3Mp*i47FbALuTigsD48H6!W!En+6GW3O`9a{==+SgxxBG$P<{8Jl>{;mxRS?=qs&=C*} z3IExhhC2T4|L5l990PPvmM(#Wz*;&;@!AD6lIdcSDU=$=J7h#yj284>{NkrVR(;xN z%|>RE14$Y^o$B)}PN|rfcZ at NDlKhc1Z%AyziV3XWav++)pAzK3*D(X%Ve5Pox@=eM zZW>zOsqMazNC-S?-N_9+>NLBCWMPvdy+Lb|&6H*iMUXeA{(xfrlqWPolBy1O9_0X0 z4n6LnEi|}gmU2~OEyK!8-|hh|>$q0~6aA#v`|f-^ zm%)-3DSiST0xSL zZ?#iH at h5|yE)cw*bZEr#j3qX@!svvlKDj#EMd#q at z7mP0cZzp1%TN#bwhTav?$}0E z`ZYR2nwjUqs~(PAAZTWzEy|y%QgoekB75&5czO7W0Hd3FZGP6>lW{dKq at h9^i&1b) zsFc_@=2y)L{vL}UquV^-Rw5Wpe*0owQ%LSX3tK`dB3AdrdMq=#$7l%<2caGcc%Ej| z`;mm-#qp=~)POl>T}ggiD053SnF-0MaO-*H1DJ73TIf at l$*P_a at v-ItS%X z6)0-sEw=<0YbudSb3m(<{;M`%98okS*xkkZyl4{C8;$~R&eg(>fJ z&c;8i&`L_Hzjz?vFwk>B)urZgAvK`S_pp##A3h31R2~ib_MPZ^(RlwmIbzJg=gBe# z-zEg}cpso(QU);1ga(D at 4^6SH0_$vCdTuw>fzP4em$;Z&rVaAHqXAw+W%Pd5OXm at Q z_26{`u61C$Dwq(GFB9wqQjONSBa(PU4XXdvm(eSCP)(>WHH1HoR8 zYTa9Nx?X?gY-|!;ds=&XgID9yIF$A at KPg*K-ZDGWyQ1shW-G#i-(oU*_XVPW5O*qI zQt&ruughr=ODo5fml1TzI8jUqB72IZ5!1 at tQL~G|{J71%M9i}JIuRC(+EiF}csiBt zOy~3#8E8zziBG%H(!-(%-sa(mD#Enin&FDd!FX4xI>u${t?d{y(fZmo+bOzx zluv5$_z|p%f1SjK6xS_MDl-ZYSrctP4|A4pU7>uf(bYrA!dNTtRWIc=W&`H-m*)%d zo}E(c(*DU(dYWD1lw&eP=xMcEAgL at Q7yL$<@i(8?-Zr7O#cLxI2$dSlXS))3a+H>C zIs>Z^B*Ha}dgrj}AR4`qZbG=;d#_ at 2 zFsU{aG;%6#soZ{)#GACS#s#8a`Cb(=-k* z+ at SAL{E=-PJJpIK2HxU^+K>cX?YPeGiD85+V1Kg!3dJ3)3EmLbhpZoXLGBYjkKx at g zjCM&Lm|TJ=>MbK-_4DE5J*{8?$79N0rLUY$dr)^=5ZR%%k)9p-(+pF9gCO^Kf7%|kS z5J%xQ&vqa?ySjuKl!IoT2o%@zis;auZV~p$^0$=($JT?}_M)5fXW-KwVOhmi&W at xn zNqC#MY>5XC3Zu$jkk{qpQi+*2p>PnOIwa2N`fyxyhE~6LEzne1ZxVfIo8K)pE&$g= z0C9QWJA?)Mw$JvI+MXZwG-bsj%!um>6Nsk@<$Q3q(5|*(Hn9=YonjF$|NgN&f^q+; zt&;bo;+%6?YT!?AyH{h}b%7?H>KV)G^v0T7sU1^uPx>}rGy8rqIA~vpwegqqe&w~o zB8$qF=rpk|*o0T(+?aB%Z at j<-*NWwGC6!^1{Y+C=L^`EA_;UzQatU21d^kQRTsYod zac at _1XL;gSU;T1P{$ju0+qikr zXeB_up3DB;Tq<%T&m8BI`QEo9gpr*Vp+1$YK^0(t8k}22{(F17C)cJ$&YKXYR3o|P z_vy9^^H#0%=@ti#!%3oj4YSYS!J}eki?rIGUzQs$+8VMB8)5w5w at T~paNcX)wlrdP zbwy?icv|w*bPe(INx#R^{!bpId48Ba at j9u+(%zgX(Ez{lx$D|Q&_{|(W(lkx%~M z_^e(zp{o4D+s15&Fq?|rnDv`V|I(pPwRB}s5U$>mr=A!0Mqg=IE1H5y4SgXY!{cxac%CCc%N!6`^CLYP zI}W$A>W8)}e%~~EfM&zF1lsqA^8gQ%nYKo>4qOu>ca9e0YmGR-)~!jV4+EB70M_t$ zUX$`vxGC^3$`k6t5b%XE&Ohj;mz4r0hKB5h^x3=T5=H#0&P=d#phBPWvM&R#_DaEp zwO(KWc`@EhLzZwr#fWREKLu+s%Chdf*D{m7hc;^j7ZJ~?v#XDYXRAGa-m{rS(M-EC zevu`#%uhA%+iN(yj-Qq44eRUc&G6`ar-)4V0-US1E?Hh54c^Fd at UfV-x=sY4oALIX z{|Z+au2&cUYy|`3WHW?b?r(U}W at Z!`0L&;Sz@(Y%;_3xpQgojaUEJzn&4O5tvq98q zz|T`0IXTPkg>PDiAFQ%PfXX%%zqDAjO1b%f at CYC#ksiAE-_dyVquc(N&x7b>W z{$ko^`+Z at 3P7}JG&IX|FjVddxb+m1m4u)lK3_-|SBo!SR$vbaM9;pov at o_)0?B(IxSJon?IL@!eK2vMPR5#E&;-(pHT&;WGSyqlzE945q!=UK*`Qt`RZi>zqAxGELo*-^gQ~ z;~)hC5 at yl!M3Mz9G0Cd898IfJOGWUB3G~4biy&nz)Ev)+6$iz4$g$^vBDDJ7nn^?A z4Zi%)U2bO)p!gAO**%sW}rGUD!T6 zde!B{@$)X6@<&by3B-z;eLBb1t83zdISjWKG3kXAtEVfq!Rof*G_mOi3A(Svk==*W z8LdCyqfJX2qv|m_6KBRD_I(o{=!R5F56HhtQ#;cN9!$9Q-PN>tTe*ESbUJPc&KUc^ z$xb*rdNp&=wErctHEDA$ySlA%gNq__IdkWG}g;<#`j5qVFiAD1!gVzs?y}%W ztY=-cu4xZRd}Iy&4VVopRQniLqigUGo>>q`;g0ftJom_AVYyi)0O+P!dy|&ScNIO< zWOI7()1z}tdqIF_LLu^b6?x;W5ywfNA)sNU&^p!m^2R$ga zmECzScQl}O>7kc>uA94fTXhj1OXux5dnew zKOGJJa+`f>(t_)hB!1+>&}1W(VwNj!N;Ud=c)z=eq*5G3?={%3x){(`z-Z(Gwf%;j-?WDNhp1v{XXL30hOhN at XsJU_|62~zh~$>8=^ zZ|UuC6QQ$!)wW5 at H6G4bPqqhR&XfanvG$u at s`@^SBkvs3cBch~R~T|To8>|BPAAdd z>pWLZX^q}P`(2u>%S;?=tMR+{OjPZC`EarPDK~&ZF>DFQz4;QUJD-yjqP1Vr^v*i- z`F3OV(|QLHomDG{p3Zy>G!oj5Nswc-zcmUM)eq0$30}gFDO2SZE+c_J!_X(}5 at uC|zrP z#f{R6akHEi1IEf1yY5G`{}dx)Zm*R>v(%%+JgV7|9dl+dmorqGtT#ZNLlDDXX#8pU z8ny7t-LtVSnGlT2x|A)QLad^Zar(Ff%{bPnmUA`>Z0`9 at 3}1;bv0?KBZUdSymruOM z0qtjQUAYq{N4E`!SN6#L_?7|_(vAj419jE at HtKNmXM4zwy at A-@o<9)sp#x2McJa-idI~jUZ=bYmFRj)Z;Y!7 zLZJ92=yl=UPQtE~JerYn)#b)6v~!t9(TzZfUTN_TfpNUrh97&L>U(O2;WrndCX2L} z1Ro)FHtC*v&^Lgbv5pT`UzBQWQ&fITyW}o80{shZ1=HeE>e7Z-KFrQ?px4Y?UJ6;1 zFa|2Gpm?5oJCAeKn7Cd>z7^B&)hzKD;>5H=vYD$Et9jFqFZpoJ{Y~VSr>NdBH7gLV z*%R{O;pe5PYM-eaPx(`;2c)%n%qWOe{I;GprH2A;Wz$G}Q$mHHYCB3*J+WW62;?## zW5&@*FXvjFmxi5|{%I{^y5|aqoT(4Scki=1YWQLUOO;BZz_2X=yYMblR76= zARold?uio)_~(~caX7hc!Dycu6r!_xS+9A9ioFb$soV}o)54RDKWWI& zuvL7Jf2v*qnCu=}u1oJbkyCR)1C|YvGt&_moudPx+flA%oEzJ`h8B|U>K1BhTnx;P zp)m=fv*Fg5e1?bOPyI6xd|;W0;)oiTl+2o)p7kEm#dooR8*FCjAEojegZ!bf!K*7y z!a$0j<~^n47v*lxXZ+MHy0)i?h6Sc60y?U;FgG1d(OfSmmNk#}RKHi2?uM7=O6Ezv z5~mghRwlKDG-=wWqMv$lxquV_Lp-dw-Zd$SN^nenA&;RYo?+6gwig;qBn&`j;{NF?K1h106VCmy+^N(>f?uOK=zxSK#_jpA87aTUmKf+1-d)w&!UjAo0%{Zfs z)lGqbpd|mdWRgG1#{Q>i-hW>xKL$RItN%M7$A1=H|CsnVV*HPUx&NcU at yEc&p+JAM zApfr;f*z9|2k`t+^Q-?Xj^}^;zK at b({>WVMKgx}H4165q at JG06|0dSqG3v1)>mQ{W z{X2Ws$E?TJn}2j^{BMmo|Hsep$n^1#zM1}O3&_W$$0m1wL~HqPEbktp9@{znQH0%p zXzuhF`Pk0okLI2JGjo^6#K#vn{Sjf at zrEb)?_vMwjMyLXrvK~nV~@Yqoh`9WJQ9^1cBR&7`jRC(O(!Y_8RsX&8U*6P4t^fc4 diff --git a/extlibs/asm-commons-3.1.jar b/extlibs/asm-commons-3.1.jar deleted file mode 100644 Binary file extlibs/asm-commons-3.1.jar has changed diff --git a/extlibs/asm-commons-4.0.jar b/extlibs/asm-commons-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..8d564b1e029e7b4f5c984c3fa67293ded9962e5b GIT binary patch literal 37774 zc$|E at Q;aT5*91Cv#^xT|wz0>yZQHhO+qS)Do;|j0+r~ccIXO4q&3{qJ>Xl9>t2?Pw zRnm$w-~eRft|nUYt=*NM1@@OhuJJPTVY> zA8v>VIsEna4^XaHBpRhCu}&QjL1O8YaE<{!UZ&gfb{mIC;_A0EJCjW4G;zdwp##M*oN1}A>EH7?n-V4|Vhm2%euV4|uj#$l%_B`bjH~!R6Z{~qQ-Q#MfY4!q zfYARpfrGOJql2-vnTe~1nK7f0iyfnhgPom&y$hp|sk at blnUJZGqpO)SgNdz?i_5Tv zk7MdG#y`Jxjb`89o^*|5D2=e=8N*cc=s+MOn2`vGj4`rR8e>nvc(Pwtg5eo(W5YVe zZ&kfAEikNYiKcL!-B`&wM(s1(>BE5cTK3;w!q1_s1<&{7ORmpt$2wULnHk=8p36+% zsoQMd>DK7$%V&cwm?PXz>EQet`ch+KQ`Kc6w`sfRv}eF%e!qx1Rf`a`4?7obh at 1}l zTV$$=F|$<{PDpS)dRcczJxo>O$U>=)a#~ zg>AWp6nGr=mbG|Plf07?9$HyJqMe+{@usL%2&_2yd3CmQtZmMd=d=}TIza(Q4X>&{ z at DZ?V=}~P{sXpN;m{ko775WS%(g8}?eo7?#W&krT75rPK!~IGzHC6YpuL(O2w5WDl zInffbNU{TA^lFiiumNbo_M+ZeZ1roM8c=MhCV)C5xw8%GCKgwqw# zwS~g@`T~P`suKkS0};FN33suDTF#EpwnxlqmGE& zZNA~BAOGj=miVA at 9`BT6W at l(e>6EACZ(yzQru3rjXSAG$x}#3DAa2V6Hew{8C8}+8!c at h{-11IwfY&)xyX{bB zDSzxmEQ;MCcR4NcRbej4hBt^@Lme1=FJ>!KHf5x*i|{zo#XI!`Lf^pun;9H^C-ix> zaP+TsN0_jBcJb?keNP&qRb at 0nk`M{QViSFSlO_L?@xMXncO4G77t0X2<+T)eCGL60 zn2A$0V0BfnA_->6-`3W!2omBNdRq!HK5?^YL|XeYS=i!A-IUhaL4DTjGUDo#s8Z_{ zvX*nuWp}a`HhPbVX!7vNOWBw$uSINDwoZPt5w4_j+XZO|D+|#ns;I7^aL;b%lqr#F0fO9jeW4>zW&qWqfIP?Q5VDD<+K8pe^y))JSskErwr{lpUp>QQ2k6wx}^v z&XoY(cqk-UK>gmNtK^LF__#Q0Qv3FbkrJPBv!bN8EX}0yuSarT_TFW(opehQHp|hG zD4IN#hO7g7_6vT^%RwF_f%8FcB>UIGqC>?&wSHm2rO}8cBpe09%7?1r3 z3qCD&-H;qlwj!`nJtAnBC%Z{i0)+EI6QM%>Hc=d(o~|!#-p-LZyTk+m^X!f5;dgi0ne+T&QWWo_Sa%4Le)b06%Oe1%fI#9|2pN%R zm}<)Q_e at CK!1#%&gpt)dcb>D43FWyMDFPe+p5*T~@_~M6*K&db^9M)CEz<`>$u0AT zKnWp}cknzC_IKobN^CsyM^gsa2UrOsi}#p}h&h%SwqMvhX>9+*nN2LgvoSKW_$W3% zI~=BR>_V)-=-Fj#{LIidmid#HcmnfBxC?|AR%ke=stGk^PJXHk_oHZDE}amyfoKia zc<_ySDk=$88t6QEsnoK_4$fcTl3c)^cnQPYp2vqC#Mg!;)-W~j7H61sfP zI^}dwFfOIqmNN>|G3OrDKYNrhGM6vh`;bKV6OM~FdT|L}<*`dC_NWkdMk$y1!E at SO z45LujuH+6+)WJey+N+n!4JB;>J at L~oQ^8a&rLRgdb;*aI7+0^NPI!DtW(J8>ZdrW61WJASyHn9Gl at I+>lvAGqU*#@zdbt;9e*g#b^E{MWlb-4Ul^fQW$Plfj(m9 z5D1GQRe>Dn$!wCLG5ICUlAh5{`8|_yFI^L}aOm=>mm#0zfjE5o(6xGWUu^?eX5ru* ze&Ng-A`;3sj14rfq{X-mUx07x{#MnXoH2xnb3NfYxd)f(PsJ;7-ilE^rL1UD9lr6H zWTu=sHuBf4=_*~)z4--4ed??~b6o%DA8Xp5snOLpy#{&k2I-+scT|S4!CjT*>7F~R z!5qM?YM at 62=*#_U!roJ-^=RcoXQykxx{NUZ_N}as;VG!(VL|kG8e*sLA$hb?7fWkH z{P6;eVg0-miP#LY(6u{~A!Ady^wG?UO9KbB#uHKn;Uf%X2+01#PC at sC3(wm~Cl z&FEbZ4c at 5S#rV#}Ll4y#^H=%}deNRo+&&WGr=Q;NZpy?xO`F;Z3q0M{_J(ZHG2lZj*gFaG$ThE_0t0VmmyE!7j+rC$*V&(XigcB5Qj z@>MSISrr3pbon*;hSDoZW%+2ck4eU`a=##ITg_u2C>q7=UMM4w)#75Rl{8wli2>*n zVwtTAUB8@)*Sxi>4+H*JO6|UV^FbhjfItv~fH3~wQp(=Q*2~+>`G3SzohF>8>M({t z%j?a~^aLJQA+toS|f at DDwTF+)Hw;z5AhnaHE=xSdDVs@F;pMBTkCyU!|}UU4{oc&SUD7hZcM6 z7=bk-5|TdE at X(YbLC`d0X)dy-H>gITbVVv2u5eFjEk3s*%Zn{V(p{DOE&DRAorZr| zZMm`oyXoCVJdb!8R#lJHc~zbdwLocSk7 at ttSyW;??H!GSamFp%(U99w+`Ds2(u0D8 zwxr6EC+XJ%PY5yWoUN&>0O&Fk%c=o&rBkja^)YM0Rmf(5#SFKuFQE ziL1pvFX?Fg%$F|y%Y~{#eDn5SJ1cEw$?cSuuc at jIrz`Gz{91hVLe#A)pgb=M at u7ET zg-g!Y{Cw at g@LMH|M=n9ac;rh7mQB_FFJB(#$5VDV=`MOc#Jne4U*zBrIWvEnw$T|1 zDYuM+184W*G3%sqUX(1I@``zC+htQG3bhWQoJaa{fuFdY$~J_I#u7t=1GUbtMc%s| zo#aR?%ZB>*+Tplo&jETn+j={*KX<6AIN92l3Uvm9M2)p(V$0DVD=hq0sl#aJ&8p=+ zyh*aSD6MmATdp)A_wC4Re;37}6i5da at wIaejNwN%G$)_!k7U39h5*ZQW~^=heh##~ z!|PtumWP*zuY_-mgu7f^GFbB06+vuk0{^s`GY_H$^8}Xx5CD_V+R%-iWcO@$aVJDd<)S8IFVSP3NX78NUq8~@B_n^aKU~ac) zIlcK2G<_VoE1P5NwJZ}7&r at dG?1#Q|nkC7M;RJM1dTTz1E$X2-9(@Qiuy;hXmo%bD zSHa`tN|9^A at PWxjj3PhYeO-fkMggN2G54183jnVmddMFY1JBAS%FhBF&%$WT at 6WYv zog(E2PF{3Oewtri!NZI|UlGoNkw8zWz)WqdnnHbnb&u%0i6+zf$d=Uoqz?%Z8AmZ1 z;}>i9DVFJ^#}7{t=U%k;X`Fg7diW9A{l^-gdVXs=-Ys4y^UU{|C6n8^n1B91ky}x1 z&1}V~YfNTC>g|zTd at Em@phD|L$pmorpa}E#sVd5)^oJBVmcr4CBB)MASBuI$SihE! z0zofjv7>&>>^l#2JNS{!wQsK^5IK+3k~8rhYb#SC#k7j7U{do9PC80sbN4hd!iCt@<7w#EiHk~h>n3X zST^JwOrfYcXH*Ys$7Wlh4}eu;DijWL1K>Lb!#ZV_2!oM<5rW>d;s(>`%Jz|^Rwovd zFEYjdX%G&-dQR+nR{UL9JtxDv1~OXX2$NcQ=S8Ky562`GCQ~FCHaYfiy!1(eS1}}> zSvizpm<_8jC!Ay04Xd$mrB?cB#w8wBV^j;f`o|NaKCBq*jp2$IiwKKsO{OtnPbl~s z;*S4~c~Ai+pV%{f?-VdV^hQ5;>*olybs1837l_mjob_!C@%9)34VHlR7rjFZ)`0du z4aqBQLi7K9hdfv#uqM{4H+LIC_k2UriF-r&_MZg=G at yM&?acxlkb9->Fb6jQ0mPmW zdkug9QqPRNTfo1&LH;|yUV#$WOdeQ;6W=}aJ40)~L}jeM{H+F$NJY4r#gAbv9; z_Qma2xMLbL0WhNWirzUB`$7>=dV-c0KW)E(s}2_AXY%|O6!P)BEG|7T;jzH(F zG(UXnccaZS5pD<659^W{e2>;u{4P+pYBrjjIg5 at sCQyjriJt+lCL*H8D>@xTIv5Ar+93j91=G zMLLXls{Ca{>TVaF_h0MY_?IR`LHHXkq9D|12_TY2?uiV3MaA+-CR=Py$O}XI17gyf z5*Fz4B$7tfn~^7pDT&w9dYlkOBOv_B@=EZgX*(s65!BT*oJnGDTT>=hmeK*tbv)m~ z=^`P at 86`Dobr&XXyS)xBjxI{HO`e;#pp&?l#%`u85o at L7qdm$;Xbi+mT_dW2j}PhT z2tvyF;q`JUM2cn;-(h+JHb-=%Slx29QX26}t*MBWLav$8W08cUkF*t3GSe%7-?FM4 zYA+==^})Zk3?OYN9+reKSqN^0?dQ$?J&ZlS-32F{S3On?*F;oDY*daVlzT9Ah$vyc zW5CI{F?rMtT<=$833*BOGr$19;)0h8vor8C%lV`kO(|-Dfr)DpE=iuSCZT~a%~??s z(QYV;|FwB4VJ%li#|;gEewXmU&cX!cx6^~sZWB^lJrWl(DA3uZjAJN$A1ttj=V-Ej zQ#{R5d2d>j`32kg+62LXC$lUaMY53U!yocN4(q|aw=?{RGYUE at pe}Mld-l^(o}87T z8`Y#sj&n+L-$%gsGR?muNyxZ(2w|RUzR8COmk`oLV3K=^yhhLb0hXOE&*oxbzJnbW zzQ}o*+4%O&CbyIc!8DmpXf%bCq-ye*LQR)E-s}P~P&GbtX&Ki3U|gS9;(`Y&27JhWEnkl*`ir-t at bHJ;w-;yh z)ix;m4(N!aKL#f<++U}NOv7+Sn&se}HC}WeEYKT=1osNW*W_FXq5~-TaCW%c+^EXG zG2+u~pPRo?o~GT9+2Ps3BL2D+_fE>>8O at 0h1m@om`@fAAZ`k|WlOn+vaF+*hn?Ea{ zK}JtqVH>I_e%C84-D|mq@<%w$juyV46*bn0HsC$D2v{e|r_Ig3so|q*ustJ%dHzF| zi_yVDL}+9&8WT&9UsPnzE;2pDM1+Bh2yTz2EB8-aRmbG>oOsRVxVz?ZHHn#4<=tE} z_Zz5l*xz66nub-%U&-%|KVPQ&?fM(XNNjgqEN9=_vb!V=wSGkx zDm*;-mZ!8DLG0v`uK~RDZEwT;Nk+Ay)^Vi&a;IKB-f|Y=aUmy0BtQg{Y)QPkr<@i9 zTh3`+5Vw(IF&irvTNswiIB9=*pA9a>O>8H*7V^eB7fZ27j&(}^b<$q&OmIY-$Z^`{ z-VJlkQHn3=lcW#gcqp)yCW*z%d9(XXw4fr{K-Bm6FX7#5Bl3j5*=6$iL3`G;)JoE` zJl~As9|nrathUR{k;>P5t{uO^(2|$pQB+`zsblhE-Ynn^Mr>|`uJ)y<%;yvcauWcIVx at WdTg$WQ{&3IstKc*cr8_ at EPLx+#Ln5Zn^V3Z6ct&^V}kONfOOB3axp8x}98B zFIS(oe10NzzSh%LU6;_Bpu1D|)*9AfcTc^gUSl}y#CuRT at M;z#(~aMr<$ZA at +j$e< zeguu|O~*V7y`QgZ161iUo|fmh9wMcWz*B`z(-j-m%Io9H&e3|YlrL}m^m=+=3ER$3 zp}z8#8Ox`x%^>{UZ=HjA(5^7ntagz52(YHFZ{%OaIax#0(rua~u>n7j`@Z*IYuX6d zCVIr1qoF3>x3fMq-DfYN%$#+ifG|?S%rA$Ul|T*fa3cMD6O9xw%>()BJ1^PAmVCO! z{o)ve_%ec4jA+$;3<%NLu6%dc%hR9!r?w+y`IF;ik#{l>T<4I{7Un7Eyh*c zsCZeQoh|y4dWqr+XY5BDBjOX&S!Q(_;iX=m;%c3?QQJ0KUG`xo!3kG%Sdc;u)GF|6 zvFL}qq|ZuYbvk{$Jx6}45@*lADcEZ{#4As#HjGP{E~M-BLcPs?u2J}Lx(X^mbum8L%5(anPKkzZr9bEB;Q3ywE^hly4w-Y0KF9a*E^`L(iU<0WNg z<)VGP-nRQC)x<-`jsCE{OvNFm%*>=`$@YS`{mIKa=U=cB~ z_^PO_2y#m0T!Tu91SVn*nTsqmqgPGrU_|SsrkCvrXP4WN$yp~ibHx`Q^xp=<#R!j@ znHNgJf5X867n(vKVX!iP9*BA&_G8H~L%cTA9- zns_=8wXSqJeYNYQ3F*6q#|!~;c#%vJjA89p=x`P$NNM_t9eI0Nyu7$-P_QJf3_n3I zKHGdA)U>dm%SH}4fSj4N+~YDX=jOWCrzHsz74EV8m9JPp+5CmDGpvg41!XYaym-8A zXGg3JGb8(Crgfn~V4<()q&00(ZXpL*Mky)CATZihqvbQ4b@5)v+q?dm{<=~4>FxHix_c-#61n>Q&$TH2ZRzSoeHlJ~*@lJv zJ721nEQNl3{HkU=uTQDH>%ie%ii`F0QbZH#vj%dqL at p>@veHS93;RkFD?0oDl-w%aKf%3Mq=6HtKHK|V;o0JF4u8rCzL;xB zhKE3T$~=}w3h>i1BRAqNR^6FX)KOCpuvdA+R)Y_xx at d0RD67nw%*m<#+oNdC{ zPK%60X{@B6Lw6%(JWBv6LW`M3PhDeKtxeKtUX9!wHaTQyFJ@<^W(L$ZP+%t&M7 zsJSu`UUu9jEs;DYil(=mWm($YUQ{cET-#jSYcN(61q#e5QB~PhZBumn8(MvU7A2jd zU0rEcX;8^EZuU%%(_%9;o}e9Tu3wJ4c{Fij%Ei*gkz1Iv-HF!888^|tI$AKsT-KnY z9aFzjGVt+H9fpqIHraswdoQkoybl~4d3{X#MZ(}cd1d-D at N_9+sTT1 zCPvpxbK-Jp633bbV+EGw0O#oMBmy9$NEECpXhmJQr(0MFJsfawy`5KNne6$tffG3j zj%zJ4|6&UDLTu9n!a}cW{}+0H18W{NMoc)UQX+K{Ea at iEgC*M`s!rlpNRTM%sy%GI^g! zypewe9T*w0NyFo0?F_VI*JX;>yfB&nu!m(-uO5>ASwTjWXlf$IlOqG4H>@l|5W$P5 z;D4)R?uaO{F|iTG=p0SHzadH(MeeG17GayiPNz>~m_1<<8%%742tI2eTcw(bUYQ)a zH|3OT^CR*|orJ^Lo?Eh$EJlc+INyUs1kCe{_!qV(Gpbzq7glGh!w-!6T{aBi{}A;2hDc#xc1!FZvrxl}HrNdlZg9vI at V8r9(u<+Bny zskcCc<)D at FtyrUs2OciUlCAu at M^v-9Y%@l+ at Wbo~8F%0Z313Y9BC zKell9QTU(bF+gFDUp772V7SdX+ at 4g z$oyL#T&T9JbIkDhi)f|%-*iRAyg_K at 7Z>WuMc86y8kdKuR`gDCE6o$I1)gMNkwoMR z$|b~uE!osUl(+_7<_r^XQ$uD=L-0{<)*UhzbU#y$HSew zOTH}G>d6hLX0uinT-D~O`BGz+!B6Lr^_4=#m11De$fB=x%PVP(}8; zHAR|}Hq-~*Came&%X?%9GTV2%|9E%fj5TMD8R5vCAfB>kYo*pa9$mbJ!*;``9?s~N zyseaqOSnV*N;Rgzw0|DUFiy~jKQTq4V;+P>6P0spf~jX8jHBpW2fSwO6~g2*4W>|d zP5=~g_OQ|TEP_wv?pV=!4TFEl-O-|b%>V+}nDe3#IENO+Jx8ENWAAEF@>z!-#XZNN z1v!TpWAB<#{H;P?4JQNnE?dBQ2uXQ&}s ztCS;msA;Kx4=ZRTo?hRae51pDulmBH2C&49339X-nP_YA_GrfnrNc>j6}S zxe0=Vxgnp_F{%Y at 7D@(Ri>`wnl6Ml0NZo-4rsAII&s;-RSc;l9|Y;gzOgYf~cXnemLQw)CzAq^%# z6OegE?x6$|qJ4$#RRDVEv6AJ3+W?m^9LTz&j?9DN!7|VcZF`Z`(A6-QXaE>(7-4`N z;J>F1euQ2 at 7KJVbYy&Q#8HnCM2h9LE&*a=rr0{k1bZ=`M(U+# zmwsyIvS*ics*w_;7&gkWwSIRY$_9D>$bjZPNnE`Mf7SeRWkJb2LZw0Byo;hi&Af}! zzaVkW;vbPXdttv4an6#R(s}wyhq*KLCC245)C3;oB;Z>e4GIMvwEDp2!HAP zb!9=t{NtVAiF4{BmB&5mBNrnxgmD+TNjN3!!Fpxf5Xz|`_4@d}$0){)DvPUq+kSAtz3j+U;3Z+k+YL5;=){!^FZD~o??qxuI!6`yO5%@`Lo zqSv$$KTnbWxk at c1Y0mxxKkh%-44PqBDi at R2F2A~*x5jcLbzSWSW-^T(UYZz>#4&lO zL`%*sGk-d{$35Vk*X#}c8F7 at T3v%x64uC&=z4w15qkr}~rNlq`J~jn(oIR>kVoXas zrhzjpo$kPkiy&b=QEylB(>N6GwV81K)j3|VgR0nc6yujC<@Xa$FDS=gm49a6RZziwGFgY|B1hXdY3D%1^xq|MZ9vK+Xb0^cN%=l_ zIprTwNY6>o-h7b6Ws{{9#6CohkwJ0pwK4Qh5u__s8~*GK+~tj?>f184DNe{WxuJf2pE2kHy z7 at Z!0tb~^ZjDPALW|v(!&z%~4Gyg?01$$5#{f!g1Bu6;>UdyF^dHq8F)I7hQwEerl zMiR10Y=9h-D4ueRVs95-1hw934)yrlq!E8Ne6(Pr-Cuk&>f1zUC-AVPci{4R?)>4( z5f-&7IG7var>LGaLjCwu23bKI042M3og2PP-r~&Uf?=p5>xdrcl>?6z$O%P9y%UeV zqwVKyy;ZP)pd#5&UCKk2WMU>Th<$u%Hmb}M;UAx~dIi$JINX2Vb&fHl$Q+FR8O^#L zz`=a=Pi^?=*Dkwx$I#!H7Q=W9d9K7aFt^W^74Ys9SI5-p9eQOxeQOA>dQIF#vjaYB zm*1ymiiVnf;8&&1;N4O at nmdovpQRY+_;VN+MqLZHHq{ZNVgu at gaZ^VtvST*Z0Srw% z;cryK2`?B{R{ya7ruzi4Wzwg)w?7brK zMZTfx)$jWzhqVX;yV&6>w18doaHn(#r!#c9X*e at _T3j`3xtlGHGb at faV?*2$z;_zB z(=E0c<3X*dTT9Pe^!;*H+Yqn;U2R`#J%1$G5#fZ{NCGU<9e6Q}J8Y?SrZN*U8u#6) zMzY3R5|0n`{)%oc^-f8hBe7n+UQ&x~8TKP^YeZ~f+lTv3=8V2N$9jzsAdVTL&Kcvz zIL&vT?Ja|*;?g9+HaX#^duNn94F~q6vh{Xc?+i69XCiK&Eur|)06+X!FZ23Z%|pX! z#kP+XNByB28?Y}7eN{r=arRlnZ!Wqn3k&4O*M!~sE?Co5&Uv0j6=2V4U$ zX14*>TqOhi!xA(P!?Cg8MmIKXPS*D8oj zwQf=j)!hz8_oo82KXC2fxfA|zxKw-}Xy`bXmeD_+VK76%myb#x?LJDbd zdB}Vn7WLQE=AT9=V0XYT21)nSX~}b4Ptd2^)#H_SCK!Z@ddEY>j0w+UROC^ITB<`eFlF0ZIEy*V{}4M=I&&?VUUO~ zUQAKnl@(oV-_`iXfe9AO)rC#%h-FiQpV%<G!%$|}a)r$i+BzQwx?UG<)Z~hQv2BXNITlDVw1t_Sy zhWXH5b%(>tR~hApYsXpjMnk7t4yMihdV;YwU|#N>H^mTst|Kqy)og&~O-efRdoT9c zU#PX<1dSUT3#aJ54vBORr+1>94d2APSd-7VkT}Vv)%o{T<*N?AD-8+PvT$GK__CoL zKT{doBnac2IaP*c;EHlDviEgkoOA-dyCU}l;$~Ir`aUR)oO|cM(r-jAglfijUDW%n z2oD}|3mnmzzp}y=En53mtB$Q+ZIUJx3VA0=2eRo$PJ)N4jmqnqqph`l>ze%9E4xcM zqfWI at +u68h0r$a_E#@%}8&y9)^oGsqht99B2K%qCxY`wO&nnsoH4TyKpI>4r58~VY z9UoR&Ooo;EbiK-KYyg>pp!)KsZJwE1HrYWa`s+g6d)2L3{cL4_RzJ9wNSE{=llXyu z0-l?@2H7!s={Vmry0$9T&e^%*u7yjwjo1hBk4EkrbTN~`yYp8FepSm>ZYMW^NenT& zR(Zjq%}br*(dB}BDmJd!x{w*qU_CRyb?-Hfm|&^kkN-_qm;d$fS|g(6TJXyR>5BDhN*VrDIL;d`&0_rm z$jB0)qhmMgQzl)pMr zCP#oe0J7Iz)`XG$NcKPa6o}my{NZNnE@?*#j5$6 zo5?XNbL0 at 7Nyc=-+Sgi0074z>^yQB%+7KIV(X6?6u4M~ReA6*We6tqHqpfJ_ToiB% zhC2^$=<={9T13N2fWhtHFuCP}{dKOPB`Ll%2@@t+0p1QizomQsO9!o`Ve-_YvG}_i z#&iD9HkY`SM+y$=bIJUyporl5kjB1}-50?m*1>37YDY8oXXwcKt_3N76|tSVlzvms zxkmKq6=bJnOm5Ee2l^)~4E2jo*)oD6h4wVEPZjbl9`M*L47{TS{j*U*M`tGniK~@^{r`S`(1P()RZAD>psA9kflwWiZ^8nF zNdt+7vs_C?CSpd$8A8P at s-#H{mR74&)!YI}lLMrQ!4%pKp$&)Cq2egnc9-c?SZH5k zZ#tE4=G$-PJK6eRS5)-i=l$FI)IY{JD%$mZd_MY|`F~T?fz$k+eji!~|MzQ+D9cXE z78S at Ozb~FY08N(Bf9XdBL_ULaEKz9W^2wUSP0ETL!9{A5U$oz(BtMqhky%lmT-q9R za27JTlvE{#B&^(7)8l0I(@|4umAVk8EO0cYJUCWrbo!hm?WS5(iJBPNEJM3XOvMue zWa!lS4q8KMKIp2t_(;FD=9LCHn;eh*Ay)1k-}ewFE5cEqoA$08Rk%=MWb}6tz1VGV zM24-|Xt>Yy4Wo;-mCc-#grMfN-Vcj9vl${@Ul3vY&n1_9Te>x%*oO%b#Dz2a5PMb{ z{&Yv83gM~texCB;EiR+DF`rzpS)RZ_iwrH<|H~y5&)j{$P*-11 z!~F%qpap86_-C=ooQaVuC}~L zap}FYe8@=k&nDuxBI9LPx{98*mcDuGNj7(xw|MpW`Z5NZ+x9-v-(oo!Jh&f2-B$a9G> z>%<|j42{lO+0%3$e1;S9NR_u}Hg*_ITIE=4EV27bv7ik9$YGae1XosC2y7nhtQUXY}FyYQP;g0nNMaqG-6BEWZB9+ z)B>VMgT3#FZqzdby+DW%TAk5cQpqfzH#DEtbX>HTT{#fcvnqBBMBPVpHEc?jcqA%ZnI?;kz~Yzhe_dqZ zl_#$Xw|!O8+*PD>tjEGAXb_%KT{v at H-|U=hF+r5p7t>lJq at JEXG1Q{XLf={)da97- znnKRLrO*P00XZAY{k8tnIkBNJdZ6W+l9HX*x*%1P+qxlTlk3`%a^tknC*M6Q^~!s$ zM9F_rI-1uCl!G`jKO0J%oJ%X>3|W;EIXCBg$AZNUXNI at H8gwKD(!+PKY>hBQe{@^1 zA-FGI!+S8Hv&I@>P1ePk*zwt*Ri at -fpFwh_B?INmbeWQha*a?W*t6QGm)7Mlj$Bp9 zHF{EtqK#;PY~j}7=UZV8NuzSCRFiV7)T46jOS5tD&2 at c@3#Cs z^|l;h>oF|1FUAN3XbdR`L=6WKNhJQ;m|7HHluta>7;D5W5?U10-9_ zwL6`=uedk2#~5+;1O)F(F{}amY>n&~fdclHf;I}w?^YK#<>0yeV~&yD-RDdm`_LLb z;cX>bVJ1tHaySytbPBIdh!5Npg0o6_hK!7gNSu9R?E1xn>#jllqj!)%v+!HiufTn| z at D42hvAd4-Cz@}B-%rl-QXf$<@-P)K@{5AqXYhKaZ;AV-3_LOotY5Uifi5bkhOWxA ze(*gUyC=QCF}Hc{nSS96kmAImNFywuV>k*tC(G7frsRF|a2+grv(7jpbfD$0;IGjA zU2FlfHw2&s1HeCO{}#*t?;Qt_7yg#zD|7!A`zL6hKl~M2!0?SSJiz>o8aRvf6Sn^g ze!%oCa$f_Uko7BjzXN{2Id zK!jxr?;Z{xE(-}If+ at lg5B;nLdM;vcaxSBY zP$VE66n>TYh*fu%DbWZSXc&%*70!gt1aEf7ye0pBwm|!Ezm=0fZ5dPaYmUee#d&*7 zo}*N&pHFFx=0ahj!X2_8fTx5O%e_>-prcZ4DR*i2U=1;Pua)*!yr6f%A<1aPMVEZW zT_7Py7bwdY4vTh16h&5jsNZ)$q#vj$bt#H7=MnLk`xwF4{(v$(C6Uya*jP>?p@={1 zJNwaVA|sPRCRVM?#8}u&uRXAQCUPNxV zZlG>>FTy*>1IiKWSV1JqyuLZ5q=KYCDY7%|KXLG?z^PEW&?O=D-#0sF!&;LBPm at yG! z!@y1U|7da{mmEI)8$ueHxkpp^u}Cy{PZnOhx_uK>4rTw$5ojRIL`SlIi4ka^U3?xb0d;=9IdETYSaO7*?p?-AspKOLH9pMzK5(xyoa19{SM90=(&c+RO)6SP7O^A at jzMMKr8-xsRU60|xG>y)iWV<2tFMMK#| z9td4lcrseH*GEIq>)h+l{ndzux^@}nt&UPaN7|VEZ=275jfm*iWD17=4s)4!X{OLu z=CG7Vqpyncn}ED_GK;Y^PH7hEQCQDk7X7b)qt&UQz@)}))v`^=>ZB;IoZ`x&R?li; z0X_-}t%y??n4#C at Oi*Q~_>?c6&C-zSEmqKwT0IeaY!>#_utdLvPe`u1%8Mz|u~Mp< z$4=oXW}#-S2Vt}rl+; z{E;c+0LTrqbt8_$#(9%+mnsn?196UXD@^TbGGDUqh5jxp{xj~6nPGr|nf=T>4XLuSEdfosJZ z-bzNBRQs5es at J(+FfaF^R$Be1iSlXSr+ at zd0Y@MY_`)p0gj?x{|r+W~dgFnf;{XN8xPdc{h$w1$#xVs*I<=Xq}V zl-Kg6%Z4Mu20Cvs2ggy&#b+aDb8|;m#>YiLe|gK>U-*3b`M1ed?xaTLnF1E^epnfo zaoC0;NvSaEBWR}_a{ts5=8 at hQR4)l}!S5fCcQ{X7C|VWQFi+w&Uoc#SJsdhmR#dZz zRRcYyQseRlDryd6pvwnWfrTXD;+c>iSkg33ym~o0SrMNdN7aOO3K>R+0N}$F%PcFLZxL?ROq!@b2ZelAP zomJZJ-FLiLi>W~AgjGsO>l}B&gANDku|tO{q6d4$643lhyRrqT6;8?tbCitk)NS&; z)Uz-|i8q&rLhhF0Z|9`uJEfz%e%C{v-|>W?2^V+#Z0J4TWa6kC=52f_mmyPr#g7KN zN~C!{GxX+I9a^`^4Pe1`7n^xLAKe9hg31K!9!nK%tLBb{2MQ-RD`ciAx=GV;Nz<_R zy%JH$Dehf=llbChnn##`g10xuY+6cxwp(Ngc&SzM%ad=XG_z)&$>D}aV57IoW`HHy zSxt$+Vn)TLu0u^V2S-mqzi(a%i{Zw4Kk!PAK9&DZn at vOY@i;-F7JDtPRSo_eO~08l z3qGOVaVdOKONtWsrs(ooKkk}ZM!#1(c5dL^n&qUx47jK*THX;|#r_ zpRAjyY;2J~Duk6f9qaF=%JlO*;XmgYIDViITU~;mI-*0*&^{M!#PT_!NBN2=lAm1n z5y&*Nle?DVNj6s+X0A5csXW{a7 at 9>kghhUoirrwA!-1-nBW5<23O$!c7MH?*brx4i z-H5l-hvsd^0mPzLPMzoTdGEM-uO!c{6s^7qk3$UxW73RG(?Om5>2=$|cHRuH%dYhw1FLAvXPNRu{FGj{z(vQdcXicgL;3sN=m4n>L_xCoZ zicQzia6#F1sNfYtj&zveEtOl- at rs_qV?=3%q}(c6T-7ygB_65^CVDR|64K1 at jh20A zn|Qh^V!@A-*xI6MTDcC^qf8!l!H1XrThP4TDzU|uvXOmi%o;vId3cnF5n?Md*($tQ zTE^Naxj97u(st(*Cxdq=Ii z>7qLXm7dbm9kaU~wT?As&1A${`mCn at Fh}}~wRCsgGO3im$r at J6aqKBU`m8|?Sn_~9 zJgzug`x$=8*MLT~56R#nk%zpAfIaaeBEbJG9Vi2|B4|2b+BJ6Mhy~gqE9^l`o^Afj z at fUA{=NNsPkuF;kTd{^ZAIB-R6dEie zFJox4=~>S<*`-_*lW4)uuYXN%sL4eoIYEJd2BH2jZ5=Rc#I5*1rzWOWojI+6{NYOL}G5p5A^)(sM|Pa#r@$3nH_G$@rQBgdre zkP<`o9UBF%CHrsWn=(26 at iw@eK!((e*1U5W{&$cM=nrD4ImuKZYlV4}(+=-B-`S0` z+%ppYukR;%pxFYNd7KznXq=c)vC}`IysFDHLRO0nuub#S^PRZ09Ab>DlsUUvgSdgc z=MFZ*jnI_T%=AsO#2JzoC!s2<*D<{KhmZ7Rt92Y26K5r|&$obQ z-s6~aOidS8U7PqfDx{s%J^`b4#GLFmE-wUpFa4or-694H4j$OAzamAi?5zppHy^pr zIjy%#ky^J*)hGs zTm)YG^o|E{k|e(=uvm%^Wogn&!+ZlywVM_c(o7$o+%he2*MVA-_Y{?@w^&(qIxsH%Qx;Cu#*;!r)wjA1m4fVi*_q^8%0Dy7xs*sPBdKyDY&*pA8Qo-J9f=LJ zR>_jsdCca?U9-xnW0hM6;v#}+LGGy8iVkXmDuObBr3AGE1q2oQ*^z1<7;qIFfk45P zhqT=Vg&=yUV2~ zwVnPt_RDv`RyVwNm4*a0Vo9XY_z$lU;t4xU$v5KMox+ZgWn60{1Y#s_=uULk)Njjd za|`+XqQyOrk;m0I{*_y*b+^~jws{eEuv&$W>j)~Sy#Z=9izf%v*X^Fx!WbnJGn$Tw zm*S~UwB2Ki#G)x}e^RyWK^8_kL)e*TFs^2=hR+8onMLMIf}Dr4w?;^ph?{QcpHp0N zLD^=!Rjh~I(o9!8ZBh$cq%Cunwp-2h8pQd-WbF}j*GZr`c3g&%nUXh_MOJ>4Rg6`s2T0>}F1GiQU=%93YD=)tQA*3%*XY znYs$Th?2F5gy7o9Et_^bTieuR3j$2_2b7Yiyu?75nkKAp#BB{Blu8R_0J at uAK=6cW z7aeIYDjwl#4k?QF9vGNhMCm;oO|!|zc6eMX z;Tla?Ud-!*D02aQ0^MucWq@;qODcCvqDod3C%28>wHmDJlaFEsg2c|dZ+NU+3H=U%JkCfDlxa))C#g{ zXB<0cqquk7%{(Ut9nvFfbEAy`b|pKDH}lS;t-0PXc(yissOsp3tT97ob-XQit)+BF zLK$?LRFYPl+=7IhW~N>#Gi4I1IKQJaC<4dae2o*NV|QbDmygd$`9Oy!cf{+Atwr6j zRQPIP>BXz{@`Gw;GhMb;`b0T9kN9dKs1ohwe%)@v(Ghgayv|B!Xa$rq-CXTJUeVN9 z8TE{uF4KY4k!vtT^-cLu1}lGp^t#c?s`9+5gfdFI%9kff^eCmUs(JfxsN!(6RI)1E z79%MNcf)8)Z)RV`yMqW1x1yWXaGDb?wtpSg`1E=KHS9!@HLGsuJCcQ6y-A<9#wP+V zmcvq?vA{#rUY?G~;T;797crvJ^oXC^w7A;&TuV<(2snsHacY4T8Zy?_q_ at A>E!fD; z;v(EGQ?n`1?w7bG)t1*U%SMU3TGMlyKP$VTe~y-j8GLO<;xia^Dd!n1;UT~HU6pqR z&!y1Q*;8mfT115AG at p%D6D4y`ojL_W{_%N_;vy6YtTeQy$8&3+6zh__dHaUKnXMEP zL8*GFjY?@3VtNGm=1QqaF~rm}Qg++6hfb)R!P&7IO7YKOt?E zkq~jUay0}C)y|MwjZSNCrVvpHta4K6&S~OX8ea+|42sN1ma5~*ead=MP~OJFds8 at G z+Py$LbFnItdFYSR%$?9QVT-rr at dAq~lOy}96NEIC^FvIYPqaA$io<(zEBpM)t*FpG z9#eBM)$Gw{kd~G|I4p;PP)Wu0^@yuewET!wF;Y(7>{&jFtEy#;lX6{DR%7TitdbN@ zxF(S^+3C)3ViFs7?n`ojK5r6&)Y4|jnxDC5WGs0tb1-sUTGQ4sD^n+z*UVX*mwp at f zr0$BuaO8U4M$%oDEch&HC2h!nnOk7yKyc?V!5^cDN(kWUAImk&@2(p*r}t~tbrFKe zWgnu_IDC=BeD;yz;69PZbJWF8#7KyeS^IyyrArhuwZvMaXml2C$cE~yr6#AWa~O3Q z0$ZM;xtJ6pk5`)(8KcS_UuZSiXNV;*&yIH$dd zNxh_V)Jh|nR?%}{=cFqTIz#su6+{H&GVA$(RdaK=tgkV{YkwLUR=QSK^ zg8159(dzW(zIUg;bqBa>O~Pu8cD*&8yca6>eeWsTGiz*(6X5sD3HTxh2>3#ghT1TD z$L at Ur_)K4^2O9)#`(-eFMsKnRZHL@~*Moe3UjTc?ukZs&Kw0qlm>=K{ydkS%N9M-x zfY&4az!I=G@%Gz~>8N5%9 z)^_NUVQg0}E!w3$V%r|L_s)=e-az03*fV``gv1@`0qPidM(#dZ1OdXc@?Bmn3$53~K90Rk^Mb744g;ywPiWCL6_jb`-z8oPWY(*r$9*rPAc33?5 zbsv`_>+scbReJw at g+miJXHOHQ>4cw46FK^|-3jl1kH>6)?%2i)<3!=D zNkK&Qo=2pNFvj*Sfq{$Y7^pr4SRkqZI}*tuaRg*>P0TT8e7I~&A8X3k#eKeMRJM`G zSv-lW>aWjrMhe5jZk6u3+U^Op3bW|pm(V1SH0-k3uXll{dvA6ZAD#Sig!<;aR`#tu zh>_VyeI5R8Mf~CW)k-`vs3aNU)~}D_<>MiGFV&x87;ZkG!J&X8m4%aP?M8@`IyA6T z9<^w<=HqxidN`jlluHKSMKyh7kvQV5wv&^bj`KElwu##9ky&o#XhNvrXXmLqArL8* z{tjn!ZAXnRfe2BxtV70|&S7v1(SnQQ|S79r=$KE@<3pO6c2 z!MM}G8A|@ch395 zY!$d8Zp?t3d$CR0aC8=96yO77U64`Px52EFbMo-~aGrVlc1~RT<>;jRawiTQ03EKE z9D9>lay-I=JTjPTOOT`rb?{#bVbQ1rF zFwYlbElOCfiZFbUBf^>s{Gk?CP2FE%Qo at GjzQ4gDDI)na-SCU7F4nIwC at Tt@ED0w> zA3DY^)}$Nay(5R)zrvR112j~O_rN1 at kJ2j@LXKLjXz`8Yx?`Jn7G)Q>6IgmmJ7yQQ z3s)1vL|Cd?Knh#HucFFr6 at yW}j>5ZS3$OW at oCGB*kM$5ZOShqk5R^e)a2e8sq)7CE zoH;8ieIWFa<2J4g%!RD(39MA#34n1Twctd*!``PW-4VPyJ>#&99x at v(+<37%Q+YfL zt08vkJnN?(fPSzZ_U(;%6nul%S7xYx4Bn`R_-&0vzItfT;IcN4mXo60jZ(Fzn0KW4 z9q|7m&_c!$2mS#6t3Sn^3Ede12LgJ80Rm$AZ~du^y|JN|;waAl^qm_7L2b zr}Pt1Y%|z-d9EKBQF%~HHq^T&NwPYYamjzYFM1VSA;p?psFs$d{U1kNrDPxd6U==_ z2)!pMcQ^>#Fe83Y@(R8?lp2&=AV@%8KPLl)NxSs$U9T<6TDN9TvNhRvcU0+B=8{Xh zO0#RTb*VU)bk8E~3aDLuOdQ_sD~OANGnO^hWF}^%IqRv*nLQSfhnXW~>sYp~dN5j<;t>A1XKkUA37q=4W+sl({Rp{y5)U=Z(QK)5D z9Fd~atw8R>9qg^;vsL3 at e!*#}g3d9@#veRIxK(p3i|kTSOQd?KY*!!gr2<#QSvC|f zwJ^0u4Xlo(S4b^QXz z73^CE6 z;BiZgks%m!%vr{1#%X4rQpE*K0FQ8B!MH=_0U{t#Of-&hnrRtR2f(~8$RX7?D`=Fi zK~fWniI}KC&=HYALdi at xDF2*jQ>5<%f^~q_$R>P%?{1+Mh9dc_GtiX>VuXfUk#`hd zl9*jjRO$m(r*-pS-#pcB&|?3AwlU>VV2*14LaF9W at i9!K;tA=r&!h)K5-c{avPySg zW_>8#Z9ygGFbB1pTf8o$p!M+pF-7!h%5z3b`4I6Yt#`lW#q(GZeqtG7fx$v1y44TD z!r>k?s)i*az8H7+=jik6jTc9MlzB)xobHGcX_RR;X}vzWOtO4R1EbU~H%>#5=)j)Z zqiA7yp-Oh7yaZ?>i(?^jUS=}7cE3f;>cgs1G9r8Pbfws~c7HC0r8CG+i~V78D^gR8 zp&?SVGEK#EvQ{LH64~$)O3z-Vi2GVL$;<*b=Qu)QO0?NGW?EznME!ozo#kmm)Fqs? zh!-4HV<3-@{3(=`tGt)M`WLf=zjc)dX}k)^L_A`o-k?z&;^q=M+t8H9A#rn~&zEsI zR8DdB^19C>F-mw5AL8fHm_^CXYYQFW$P0dmZ|+T(D6Ap>(2HCj+J=0CZTf+~(J^jw z#(}?q399{{7Om8R%$jCbW*;zrb`{|)nM!EFP6B4Vs6dl-g%LWs1Hn{4XTFs82aED2 z`Yi+Ng02qeU at 4nf$jO9B_>K{Mrbb_q8BN4dK1n7+D?%w4AF2u_;lay!<21p}Ir!Q4 z`E%SQYWPo(qu(0T?z>2cqs}pqA(lHU<~Ix6qQnvg;U?2CM1!aiHmkT1^dGUp9IL;f zCgI2W%s$%S!%-V2eQ4BTo1)aI1b#+&?|00kdXH!ig at klj$F4hrd%XNE^gYC($2md0 zffCms+l9kWh at MWU^iMhQJ=}y4MlQrO%B4L`u z*3rtv4p-O(q_01yP5levUuAKt>C(Z)H)|)WyQyL!t>RD-Bhg~gIdCMbDEyqty(BD;!;fT$pwV+92j zU5HU0!~(qEeX#%V4?%8H2AgQ9!j}22_Z;V)=IuWUcsl3r*8y&T*^3VJE7w3cEP!(W zFw;fkO=L)%7#rqYZNr3XkES4O#f%M~72Ne)-lC2VBMwkLu>EBAavpH*3fMFd{#nl6 zG`Ok>Tss2*o at q3zf@y=$Su2|z*yL~E0Gi~#I^|yTB7_i z355r=sXJ%1b}p3J>`quN6q!?)mWB at GcBIl7opdfwJ+g2soet15dxuB%kuqcZ!P!qy zAj_&lKsrjc4>}*JwlkK_=OQO^HGRhkoZ3?;)Y#BlrmLs$64kGAdP)<#Gqh30E;CzC zTH%()*YUo7un*M2yUDCbmL#i01un46iK@%WQs}I!FqbSh$@05vddgb5jIUa2Z}EQh zzW6Hg8k1HKG1=#b#irCt23)2ZrPfSqN)m5lPQ;7lV*ukq2hv$d{>Vw;PMAEq$ON!h zWCHLcl^+Mb(MZvYA|z4)>3le(dehUeSjBWJ?q@{crmt|AX2XT=oCei(u~lqzj2O_xI}Dt0kNR(CP(Gtlz z-9wPf(wU71+xzuR6dO!qYvhaRg@$n%(Gv(J(@BnL(eF%XlNuz(4bh}bESND&LQJWX zzo#_lj`T38O?U{73^A`vY!V;RqsK_A)8?rPWQDpyV3F_=>J^2`LTI5*2c{Ur2X-tJ z&dF7b(o6RFKvB2jFrn0h6zicXgI3Db=0iH5G8Kmu$_!w6pjHR#^1(=<@Psgf;|yDa z;8uAfslc*0_0Y|z)}b^7*(Xt->+je+CJhYfhnisQ-wg=Pgd+)K&M@>$Jz@@A0qhuX zj5uZ35`}b_sMZw(-#j|SQ5s5jbPm7IPo~B- z+<|a`PqBt2EG_=9g6d#8#mXi7>)3>2+F+AV2yJsV^-NS z{P{?x2e#6Zuiz^gs9xzQ_7G#+7l!x31~uIQ_e8(=Zt`jwg$!{yf-&>Nv7^ETo-}QqSsZW- zf9lw({uBlkcr2B%UDf;{wQ#x`duXJ*@w-xzR9;PWGMS$MZ1Ry~ZAy>5R%ggkK(i()Ve99Rr;pP7XVykoVs_tgHeRQV+y*MkBb!%Co}1?T%EJgpkvY)_(HQ|)ww)uP3fq%qx(Z8=2u>R7?2g9n z8+LWly%!yuUf9Y+Zb1-xOJ5>L2$Y~i;xJ-(Zj at Ycs*u#D-ulG1+v?Fj4}@)LwAZF; zmS=lBA_oItN9FX4|KPW6%189av#QUTAU(9=pNK*P<5#eXXXN~X4k4i5jfFG^9-{--ZO`Ae2z zvS=8fBta at 5s6aSFA~Go|(Ex=)5?cH$)Sxmzh$%#n5h4jSj7_z#`%vrq5D3wg+N-k0 zWV%5rt#3fM!8OzTx}FU zx8Fyz9TGXB+-yx30({yoM(@;~z2y0A_7xI>3o#x#g5v|ZuFeE!7pqD;D`_WzQ4`qh zvu78UOHopHdX~S|rPYi8G7j;$u at Bzb(fLXG(=3U_Kct%7it zOMY1 at x0ApCvgQ^2S*$jo7UUEHYT=l4mb^ScR!inP1+sl@;gpxM^)_Z#dSh^ul@~oPEYB*H6RMFwWW-UoCN# zqiq6(Zf@(u`T-Dq+P}2%MVx%uE`#{;1$C$BvVEtgwOc?|5`CF}{r>d^tU+lQ6+#E8 zO=^>LA01*&dYw?OKF9~z10{6NC;=mlv58teUNJ0!>Zk%Iyl at Q02W0ql5A;A%Yeq6#Z{U1Ot!I)#rPNr*7?Lq2Va_mRFvS^&j00L=_B{cLn8DTd2&j&{j*0tw zM!&bM234E2#F_+}=$T?3 at M(kkX&naF4hX3nM0+COl at _>me+CY93J(evgp65XGsOHu z4%aT*mBz*_ at 8B3I7C$awU8eWv&speNV^x%0l2ao&wM at u=*Zn*fQ!U-Q< zX#OxL3KKbMcTE(AP`XZTt`E5%gm;NiC!A(Vb at sLmmU9%MEocZE2Z+%XvW1p(^Wt9W zXew%}T~?-O$(193R!b3Hx12J;MoI*61&!K}GHf zDfTGZD|APwkL1Qe(!_y}#Q(qn6Yl-P;Gg)F%{)pXQQC>w(XLD)dd0OjC1~5Z1xq at a z{xZ3Q`8K8PgjSHH_G2CV3CIy5mA)xEJl2bJ)o=U4zA^O|^u}Zo;lkz68U45)( zSm>5KdSc~?UVMD9>SpxB**CL!&yzy)PIX^grwt5Laz at cFFku!~{Bsa!bMVQ0tR)1Z zwg0Y=Xwe)=$NCtjp}gmfQf|mm_ZoVFi;Jm#Sn=80WYzPLozfI!;FpqbhTn)>=`!-Q zmQlV|d>-4{>tT)YxSt&G|0|}0C(gN_e*pm@{ex<*{{^Nk?aT%3?Cf0(|DQ3Qn&dm{ zB>|k#JngR1nle|{rB1u0Z at Wd413d#`TN=f z{8C?fUe0dd=mXszPVVp9Prkj7X?Og5{$TY02+reQ;5`q8s3E%C>-;WU3)tp+Xufm1 zkKY7H3D|G8ZFgdV?FDU^ZcL4o3gq|Q{dZekvE*L7=I3pT7Pygt^>HD4E&8NifWK#p zU=H+9x_#Whm85{N3WL;Xm?}zdtFJY9C6B`oyXJ{_e=Hmh zm?=zcjY*{dLm3zhmP|h94_p9I%;w>FIuxy0`B1%sCn_K;P4M}4wx3SpUIorOmiHt6`SN4tbgC^9Yye7&M7K-JR&G+a_~M+*P8uN|(ggq0qi0^XT8rjE<@Go?30G#>KS_JSZi5vbdgf40{vx z!9^ljBzr)Ozz=nc)lXz;D34G`KHK%abj^o$4j-6}05o3ikHCu1#r#vV>g81iy#=2{6rc*sf-*Fpo`xccqqq}3l`iDEUqp!`f zg=WsN3MsQlENY66Y+HEA`}BFl8wvZ4qmN{go0xJ8;Zm;YVx87^#|8 at mqVy_n5~l)Q zIqfw at ttyLT;TBh38tXxa at m3&A24whF5hjCVJC2a7VK|aDmP)KdRqVN@;prXY>}DP1 zXwYU%w}f=djc2F{r^`J at Eixkfr%7jV%8^~puGrd*S?*$7nrJ|qge`|SyZ8bn%8@=5 zBMbCB(^Pxc6|%zAd at h**S3FZ1Nkgc0wnv*avzS at iU3Q2$SXb#HXK^vtaX+Irvhl@TPzyX;dXgJQ$J>(#?@0*P@ zeqqDD}!D_G8F7q_RjmmaxdpLo7+kAoq$_VK&AsrLUBhgepP& z*#pXx(S at Qc+xIsUwD2Udu{hzc$Ezo)lHd8y5nDb1iNvsPTTUBEXu^PKl1iZ zB}=0E0Tca5LD?W`dk}_*BbK~0q0oc at L1#IoZEny#- at jUM+Rt8)@VzrV7p;Ns!BfD> z9*3o!vwQYeAv%>ypL2_sucXH>3Z99?Ax&A~AZA7?O at aw^mtYe<(kg$p73IS^5z}AIya!^a`pleB1};;W|8Y1O{oDZb({CVTs%jFw0vjSUAETQ znM|Af^`I$ITxO+lr&QdAJ%11WuQb at j9p(%9M_Eci{?{}Rvoy6a`4<}GDDO!RDq!%g z(Uw`8W at MIRWJd5e3O*+zN-V&~<3WXZWp$byvN;a at E!KmUD#%~U=cnpam&H#cgLQMe z>vf)WZ=HI5|MLN7fNlxLBM?8SlRP6Q%vL4aVzyVMs at dT3uA;2{C(_Kab%WB38uViUcB908BHaX%ft099qVFdvVnmj;#JG3fKoY6_iH$zJDaZct4duFu5K` zF9`n$NsZxbgo+4;O#~Fd3;`KYL`CHH6%lPUp&%m=8<1aV5p`@WF9LV|4jS-o$}8A5&E at m+z55g zYeBkXi4_}2J}nxEQqZbNYm;C=HMcyLHp-?VNw`g!Z6W=MV*Y~c$Z0g4O|v!~YZNDiA%A)wWWQQBb#`P4 at tJVA)hY?# zV4y!(y;2kg60Oo|nbxu!Ex(kO2AuH;-`e*c{xnKs!Y(m>88DGxutkSpYArCln^C;~ zNI9}hf5xb3v&X~Kh=$7v`7?oHf=7q`qFh!9=ff|YWcFCH6=ZFzYPZ~KsSP_o5RT%b zZxyj!&^%$y32m;=r^iUifwkLouF-AV83Ws)QH@@}-5q^EXk!<8!i5xXWs46rk?vR1 zAG=|2?^1Cz7e0Tosndq!gpAw~)nrn}X-rYE|%jV_& z%%r8y>};~Z-X(SZL%MlWu+y!lS!%28Dk}6U7fg0=PZyfV(C(Z8rKVUnedVU9UyjkD zIpqdJ^n9bI4oU6~qDaXuX4hRz-_a}IEbw%wU-ml-R+-FotX$Fd`VR(|8pl|S_PM)F zl-Xi?5xsi(%%^VfR(rQ5vB|RXx*ajkW+|T+#Q_!+>CgHJu6~UcLMVDO1oyG!`QhVR za|72b$hl^x?i6ZHUCFT??9LOf`5L)Pna8Wn2-R*`#6vO*%Cvfd!b5B15EZyeu}ZP3 ziHeCT43rD;ppcoPLO%K@=RJMT5 zKJPFnV4m!rPbDx(0hF&_8 at P-BRIW(cARX3xo{%A^2e^oX!~yNbn=up<%~{bW#0TZ* zEqa6}ioS>=?1_fY+%aav6^&hE+r%+y1f8bW$dNk|Qpeft#$ZOtNEM=mEV at f#Lw32;mn4OUmHHkIUO*Xm5WXprcM`(h6s%2b*=r1U9#_)U| zhIe$t8~&Svh at 206LWG4A$pdwy3AQ2&=K}?iWn|Rlp#aMX=O~tjZg3%GQ^XrQ{m<%g z8K{=`yD{1C1i)OMW4v3oxjvPI(~52dCG2{w at FtJNq1}Au!D{=|uQkiUOUJ$=#n%q? zZ<#WpvSf^shigbL7S2+S>U5^%{-F(VDA8~ENn3o+y7xAYZZpVx9Q>#2ZD^q)^TV#Y zf)`PXojyb at Wa(eAcv*2vzeko@=uhUxhsbUr>X~mXyl;tmyZ$Iz4Z=7)i}>pF at qh7F zu&4);$!Zm)?W+d~)dR!v{`vDu{bC9v7jATVChj*i){InjPei2n(7&xT5&*V`(f>yX zTYdupasKb9scdO(XXxVU^sk#DTT-l at m&8y2doeq2NQOZXAhs4AEU>NDA_t4qEToWW zncl_>vK_Uy8>&{)c#?7l`YD)&)AJdB1O8F~oJlq&16bqX--f!n%=3I-vyCVI{>)tc z0MQJ{5J3K(Mv-Q3J8oU>T)ehmU1OV`1q(EV(smPX!qWCy`qs9$SiG=|U0^KXu6M0r z%U*#UbD+(NC5bHQ?ALMp_8n>w?5bgQ2DraoWEC^J;#HPZ3IqZiA)nY3{}{RY|1~}@ zUAfXMEwVl5-MCZUwdq#y`B`mkE=5L zYrGAb`tqqN_bAy!8gJ=Vav_&bU559V3+l-x|K>F1Pu2U$a--; z at R8rAcScvE31X*77YQn{39oa|6vb(YtXfp=+_!?~@hxrLD5G zV#^!G*)Tc2)#efr4SY}}XiCh^`)Oys0{wJX!d9T>zRxC5*e}Fg{bn}5EbDexLw6Hk ztSMi~m~E&3!NNb?xgC$>3=KA++ZDhw4zTxeTZE)(Hx2{f>n`s+*>vyql&;MFUMURf7e0l-rqRbm^p%} zWAaWK)$|s7BA%M3L1*d+$8R3-Nf>4Sz&nLC#WiJ`N=>7#S=;b6sbtzQ>lA!KHbtAd zMdPk<+xR8+C#MWif?%#?k!FrI-!X{$sP5uqP;gPWnQH#dH)u3E6a8e84zCB)KXH2n zfm2NULjKp%p-cMCj|B-HL!kx+ROcXFwS8Kq91R! zx9B&zIlKEqz&R{@*3uK6Uzu_i-rwIoRs*v`+Si&D3=aJ7)51H!e9yG8KG4a-A^OM* z$4gj5Qw3mSWLZW6i{+ zIAbnErAT96n2b at 5(TI%Fj?-$x^HYdS%!EmB>3w>!;S=#3NNf&NHU{jCn&C~Bpllw{ z|N7NdKiEJ0{l~(Vf&5S5h_b1ZrJ;?Qsgtv%y`8G0h at gqde@w`@nA-k-K2~YQZb<;) zFB_bzF$^prrGk*L6lHAADvFmNSg{ga0 at WXcauNG1ldSg08-p$aywF~tG`)BUs=$!_ zNnt`WTXlg4NNMgS=FjhFvA+*bPwGI{>jnzbW?2PRZ0>OH*tgN`{0>}>=O4i{$BuCY zW`7 at Aw|G%{Jd_iiK0nVsGE#@z9zTAXb8&HT!sDlBa6Guh1Ic_$Zb1+FArmooBWs6< z=Ptl<(cco55DTWny@{f?`~5fkdROkE96E5J=`*ZO8?L$@lmUls^XM?qUMbzC$y|3| z9u!7x;v~CQ5fq7O4;pX2UZh=&@FP(H$sa_C1P>qKalcu(j~5tJ>;9tc%Kh%E{<2rYfLcnB at l$om9F;s!rwRo34=8SFb=`$Hn6(J(*fW%|o4tULk9-Mrfn zCxoO;aLTArbu||khm|{@{jt5ph^V&hWL60|IyV-p<22*2 zJIkD}(n6;!q8Fyma!Y3H!HY at fz1d8IkKS5M_Tw-Om#`H*s8wIuzu_51ZxyXA6W$${aDOO>PPPm&DB2dp%mLk-6`7n)zomQZYHE-7t}Z4luxzu{ zc3WC*&tS?#Qp;Q{cFF<|gB$hE61xxy at _%(1Oy4iWfkf(&jM(+4-`?6$$%XRz2!?lC z;Kj<@WD2G|*iB%{R$#M?#KdN?QI?0rY!#lRsHrtstZy6BC6;CH at gfpD5+-~$No+$# z76YK=icC6{_X-q{1tUpBz9;6Vs^}0SCa`3K?$F?R#~5q!isJDWRa7(66?jcM9AS>F zFhe?>W3S~L&T#2P>qZP4u<7BH?vxr6s93bW3*H3vZg3jPVtoujo?To+6F>*^V+TjaUBkZ;B}fPxU>) zlQ{hGlxQ~=^=3FSAt$5RVod}=2Glr*t2SKLJwzxx(v3hS58F4+}8I=$*Oe8G=?#H#@TQ2|d8%7h at c{*X195&;-yk z^32>L4Ndvs3}oYrKVb4Jy_Moy`s~KR z2-WHKQEzzkGK6bZI|Dpx41bk1*Sr5JYxw}I*5kZ{^mu-i9>#z9+Yu*uN^>o(}DU#jZaOu*^hq`4a)x7lUYZ8 z+|>=HZj$HObsh9J{X6Mjm{y-*mzyP?FI*5am{sr8a3Nc%G1}EGv!XZ39|D>QijO2C z^npUlMyTZ at oE01)+AWMnmwTf>+F*#49?C90%|xKTyj zAt0a4-%b|y-k7TyYmCT~T zrhpbyv4AzV+>EHM03tL|g8&K%6=8!*mZif<77{vM1g%88Qvw1v2_BRqS;JytI|bJJ zG$(W3k8{SJfA2R?eW*8#G~oSu-1myB7uzkTr}!*%2N%$7*lVQ0y1CRA7Y7e-8kY`x zG`$n`P3#$eoxUUvvxT|e(T7K#dw1RWU=q~aJZ*K8(eHSWh3NqRg5AH6IgVDP!$QWb zgc%9bJ1339Xm(ppfPq$4rs#B}8G`GPR40R3ku(Kpxs}08m1*6KzgkY}p}b&D{u~pW z2xtnvM38^aIT_+w)$!=2*O0-5vKHy?~q%KmjMZ=}C!JY>&Rr z=b{hy@`#G&nfPXi9MorakYKe8D4w+UH;g+b95IRO=7(epfO(p>_XD#8lA?go70}cN z1@%*{^I)wnHvn8s?I at g;F_p(uF}P~0qQKdt+5y_fEa#y4+nTUm2}^H%*EF|z zRqbo$p1j^Epd!hBH+y&DKQ2k`p^PJda6m$27SgORY$a zX^d}Unm_;EgxNfkd4fUHN-PT=g)uz#Fp5dvac}~cLSHt|WgcUm?@S&K^bYGB{>#7_ zqslD2g}rLN)eXT^**DXYI?h^V8~I&y=8q6a=iHqsx{OcUb-$F*0O8Vqpcg)sI7{~`S4Qh)t~Ys z--2tTyN>4CRP at If7(D&k^szVDMx|F(Ie{$zgO`7 at m+?$l1h_>{oI&09xzXr zyJWd#drSyuTTF0yW=V1e{AMLccCh}M zf8CCajm?(L&y6jO_pE^%TO_al{6C9I{{C6A=E{>vpRTCD%4VDw(og8Y1XueS;2=+C`_0dF>S^C$up*}d(UsyJkgQ=@_{FR?%esa zC+Y8mBTMF7dGP7Xq$fP(9iBg3-|(z?!;_QK!z07q^Qz45$H*$oc!c$$SxoiL+E<9K;Qh!4g$5eEey+IJ-nkc zGH01Bxw7$c&cg#s1y()@Ik~7^$>R38Njp@`Hf?wKFD$;~f|raydYwqpwO)rBmxO5J z&Bj&6pVOYb-tIr2v1G&ffKAcoCChT(U#Wlmd7?c3kHP{ir^*lMOG=M?IPh&!$$`l> zpTbz~oIhscbL_FoxgVRq?0J5=;77`omi2y$%M7!(oNVE9Fluw&AF9owN4MPD9N^|MVd1ae zu9DL}UzpkBwr6_y$J9xeSh;#Vt2JBl at 1?K!pRCLC?SEX?!a1JyOQ&?nxJ4GnAD`4W z+iF_rnimmQ3r{!kr6n?^a$gVJSit;QY}ExFokLp+qIYH+ at Z=;Mci`R4_G-uKE4IR~ zZy0HATN`rth}x_hi=JCayqgdbsus!p>as`4loR{i)`ys=6-1pbQu;`1w-WR`_^T_sS*@<9TsdFrAIdjUHzBB##=zm>td-UxY z&*XySk2*YEC%9VZChPIPO;xj>FwNDzAzE64worbSak=d>V8Xe@%)nqwYQlj|pauK- z-v%a|*)uE**$$-}wlpa=81jbgWc%uHL^0 at rQ)|fA6d7%a9Q{qx7yMh}mD?QEsmu;c zG-A&M9G5n<@aLDgeclw0#<7k zM87ufIk?!{ym0BNCt+(BK2y<^^Q*ouTlQc5#Yc at tg|BLS>r7%E&VAc{XSc<(&JV`Z zTlXsP9T8_+dhoWL^Ut5M5@!}xUy!)|`H%NO1M7-y21}+jJdrF4oWAgzT0PIX**~tH zfATf8-J at pz`|mF at T~$@B4)2hVaTM#0-FeROPMG1kMQf6Rj!x+l`XnU6=_;G7 at nS~9 zx at 0M3t2BeCL+mwEHY`fyJ1w#pz|l`!P84XL*)6kT~ceVxF1kHTYdF{d)xZXI6s_oexn9^d2c>&~y6=-0RCC;#XB zZ{*CPzUi;YyPwdzsIomU`j~yh`KXT^0p5&EA`FO#pZjUwi3z|6KL^A>Q8eJ|8sezy z>F1{J>*(j{<{BKL=j(=U!au&78VsBa3_21F47w<~58+KnjwxlC$*5Ba=tkfF at z;ix zkAZw?JJDT{6c`Zgm3 zI2uXprXzGS(O0V at z@>QN*RG?RioUoK0V-1|S!#(?gA_`_@(XBzBI6{DFWt2=Kq1%H#m4E|$bf^If?pBVuTHId$fMmHV38-f65TgmH`pxc1n0YHGQZDe)_(5*mk cDk8wU4ze1K0p6@^AnoEnI2o7=o_2wF0KKg8(f|Me diff --git a/extlibs/asm-util-3.1.jar b/extlibs/asm-util-3.1.jar deleted file mode 100644 Binary file extlibs/asm-util-3.1.jar has changed diff --git a/extlibs/asm-util-4.0.jar b/extlibs/asm-util-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0e1059583543a10cde82abfcfe3fbde37347c8a7 GIT binary patch literal 36993 zc$}2EV~j3N at GdyE?U^&SZQHhO+jz&eZQHi3GkWKY?K$JKzni=J;lIh|W4^1yPVt7h#Z5lw?v6QIwICP*Z1A zkhDnXg&SeU0Q?o+Ka?*Ki$N`3s at H^wB(?TPyg&u-PD^cldzFMn?FszX&b2JS+}iWY zBGVMSM^|onLTE*CLJ$>>&eXt$hF5fyyJoL8L;<#{x531R)J#A$(^}TN%Uny9VDy;9 z_?SsK%q+3|ab+|;-|L!rQGW2`=4 at 6z&a4Cq$-G1YXQ@;HbRo7ML$wc7`G3T){SQkl z;6LBX{}ZbJ#L3l)$;s5#!pz;v!j#Fx&4J0o-Nv3tL`}iQ(#FKp-h$E0-o(v~@5O0T z5DE%P0LoJm3LmksZmdQ8J8!Jd{TrB4GS}x`xzg6QMrw!PQYCF8W0^4EWE#?Li9-gi zXX at f;sY^i?1|r%Xq^fD_3QHDd8mQ6}D43;IkW+ at N4!eAXbDf)=k)4&6Iy0nB(rxSR zJfiX`nwp29kx&b!CV{(h#3YIjV|V;Xg28>2aKTm`Iv zK}N7MAog2dh{)+t_n%ALeF`2HZtqcDY%8^-{QN6i%=v5SY3b?tpJ;OO|NEFM01fv2 z$pYsN2G4_l2tfmp6q=hII;Cjn!k2eY at bEPWer`MNg|~1d8Xzyac~$)6Sr3l|&>XFR z4;+e}CZlgd!N++=c5S$Z3Z at FUWBdad2&IZf!B|EK$bRdb?y=6uxL8e at 3&o)3){|$? z5BAi26{*sPK4s25b|;Lb@;#_%^%BeK^@J%-?Su-A^ZVi5p5U(Swbzm@#Yy)|)o?pm zg%VM>??G9NxL2cXrzff>-6AznE at iIa&r;8IFvOMgI7a18VlBwa@*c4eRcN6-l5CizuBQKuS zn(3SW+A!!j&I&#yF!AAb9|vacL at RiN%N!_%SZI~CG&v>IlPtI=%m;s;+Rx4Tpe at +G z-?3BdafLn5APET3Df(?|R8r$BLl4nl9lKkQ+yv(_X6?DJdf3BBd_=~r+tkDw>{@8R z-aOLeifVHiD4tdIhv+<1USH&-0+lYXcSOllcduG?LWKZd{YNZfEqNA`E8G}(_*bxr z5oXIO?IzgsQ=F--XeWAT9SMMF=^DBlb*jY_gNsNd6A}fZ%z;{X^V=)_fg4=EGxmJ* zhDIkZYYZm{#)GZfb8CbHg2zjscoec`EEhnx$9oE1?4j*SJi4T6Nwv(B4wfb&CiGU( zH4YhZ-50wSyREe0;GB?nEb~L~w>*1QAd^ECvJ=bYJaM$RS+O=Zo=A=rZT&P3Og!@V z8pTw-l$4a%XR=R&d;Xk at hK`MP`vD1!huM{fGJj_DT!Q9zB z$PA_$A5aqDmqG+{OUzRDGa6wnY9bc4NsQnL$!QPEd8FtDH@?epD9zo0M0o0Czk6}8 zM0owk1*M`}a&to{62!c;yg*V2gWm(DfS>zft>$K>j2yK zsplf=i`)jC+pGH(Kd&ppXL~JD7M!%uAdFnIRF`i+ID9HutVvS_%qzV5LLjCh~dHQ{Ym-! zm!3xaz*K{>+TFN>(}dq|bd*eNq6sxR-p3=*r?IH}G57BaE}1#xM!QanZ`LWoH3h?a z?$?b%{XAdTPrSA(c-LXQc9ffiEbui`FOfdr&{)~_Z~187bEWX~vy*E~CBa6Ox+iPb2V*ZGNt8BL?SeKb)|)BX>J7QW5F9%XrZX at D8r?*vHX z&MomU!u%|E%8qh at B_bH8uX+q>zOY;{>j~3~Xci~?&cpH7X}P?8?KM7Y at wjE>xg_wg z!+yyzxSL67D5Te06~rCX>X})=@z=G%mvzac?|fVp1LnXdijga%W5iqKVEP6#VtE&n=FdY zf at M|=(~?OY%8xY#Kc!YA&H9A~x0Y7sZO_f$L|k8?hCx*+K0DqvLLhQ#m at X+$Tdi<+XXnd};Sp<=i<*%+?wK7|?dgfOf_!We zuV at IbYH1#5IdJs`Kg6%J67`Az*kyzj^SEmA4bEi;Tbm*HznHC_1?M>AWZ?n!GhPH; z+PS7|={2?_J)F2HJ%N9aDwkd-5!BSt at K{hp1613{WgKD>j<#(~q)dZ at 0u0oqa!I at qN)fTiTVdaNOf(kQmZX8X%3a1pF7bBLciSLI~sNvsZ6TlO298v z_Yu07HR;##BJ)hq^3Xt=98wH4li)Zt?~s!WlJdxsQ~MO1-zCnKwsr!zj2T-6mEH87 zxW$3L&wMT%U$cJMH0a at QtV&hYF=rJ%gc7HS1Wq6rfiZInJV9oJFd>Sehz(2k!<)s& zB$%o9NQnmc-RnQ8S`39Ui{=2B at 8P7J*+v3Bo=uy?kIdHCU$XhOmFDA}Pz$O{m;b8} zQZ5azBb;Iy{nCjk6vf2&=PFcu;&^59$r6m_OFYV*@;(-_4O?-j>LuREkxYDXygS0x zi}SeYP- at fVTL=kWPN`D}$=x(P;@gOC0hG at y8t{2{oKvd12%LlsyCzTK~Bg)-NXjOjQI_p%v8#+g^X%|dkFvm-HHT?rB z3VHV(y#HpB?}3$!2X1L7H;83F+Y2ct<(SbL}(>=kCH8vrQ| zAr2V_(0hY7;&?E!__Pq;eA2N4{U%A=m$2y1f&8pM8DSq9YnwP8+L`5MW;7n?lg`F#e~(Q z*N!%Bg`mT%lW*D%O^4@{YU&Q1N3RoYT7`Im(WKE%Hx?YOfviQXGi=Hay+NZV*KRZp zVB|gwwKBM;!S??RS?DtSpPC0Rco!^x^cW%B4c?BuHCWuM#uXYIS2HC;{zBpFj&G<6?`GbG z_kpv^UJOuER~`OTfWUnByC`_wKz^S+o9IQEoSi1>}7o7aw$c zlSG%WCOqA49nxvH4mjR47Wxxf6}dAYmmvbVYrDG&7jz{f`5Mj}Jp_wO57xrbQ!ww$ zvK9!&rKiyL;+&BCeo+sP)vd$T?+}*5Z#c4vZoPQa`rg4Gh$j^LzoJLuE*zo+!$z?t zTS{HzF-lq_>?14Wd;jt;7+st_V;rC@#J-=0V4OLV at Fxu6LWM!Grf~ihLK4F8-j}6? zsx4lWBa9fL3+4fF3CoV6EngHnwBaupJ2umuIRplFcKpQS5B}fPHV>iu_|Ctdm3XR& z${jX at 1||oaCufWsasr`=qOD+z7}5^GiMFL^3>^{+t1k+ihwwz(k{}T;$`mFJ`SHI! ztUP;?4YUMhIvD^nocM;|g>}cihZ{gUB`bwKXR@$dT{zmYhePz|rJ=mp80uW60)X3bYHP6-(${qP1kYn&|a&P?E3UIwf znez$7x433=3C#9?Cm7&2ywTB}Xoz}>76T6dO^H477Yc%jx#$nsCkDhE_4)6(EOh?5 zp(f^;aWXvNM;I4RPt()nq05`}IpOroE9|(T9{lF^a`X#DCO9dTdQYC=4(ipN2yk7F zI|DVFH5t(5EgU*IK5|ncocDT%)9Q{rK=$#d9W&9^`X)~#IvcNgu3>$Rc4JG_K#AvG(V;fFD6exj6ZwGwaeK1&biKnq4=JjK%#Wz6pZWgf$3o-yb$8sc0}R$ zTQtxLHn3rAQT1y#uF&nl4W+aZsZc at oz^&|#`C4`B40EHriHTa?O|Y>E6YjHQ#2 at Z6 zWkgYJD--jSat{5>X|HC=OuV6i{zPl?y;n`f!zIv)*6=V-cB&bT)>R1F0JD2>7rs8` zgRO*D^EmzN*NcdShR^=5DLS(WlPQJsX@|v;S!Ln7qSdDKkD`lbe*6hmB zQBfr=fL-x=SB)L>=dGVSTU`h|yBN*y(T8lgR3U5HEtq&;e}eJqsqp&Oz$5Y-4e##O zwd}ZzIlG}&#aw3ug`zg^HQN!R6u(b~_e&ZNdBpK-gc*z+vW`=Y%;wBxfLN`oO%*BE z!a;7%agc_zM8ky*f7LpxcC#*&TbaSc-*wiXSq}AMWzG}%*^1pq{j!|xG(Le`*BLhp z&J)XI1)Kb*{#2KR-($dwX?LBwOa|yun z?O1nh>@Vo9E$DYhn)7UEGgjLexkvZw%J+soN4au4ML)DcST z83nzv=>8HU)6X6Z1+{oU at e{6}fqwPH6%PLK7V)syQ~4p{x1w{szZkytDWD*CRDbE) z74^@}=1O0Q at Y67gjJeem{Nh8K$)_=s?I&Ou_Iw~xh3g33xm5 at wUae9oDnZxIwxI1U0Mz5XEZo}q6 zYTtG=QEyUui^Q{fhh$q5=1Lpj)x}=w#oMe|&Cyqudh>pamv^$jo9CeEVbHDCFcfVY z#21izAYhUEm&Q(|4{ID-)+}EwuAaebV>J^;^^8u|QAxBx at f481tLZQ&Li1K{ztM%c zamnF%0b|`9AKdHU%9A_e&*Ekq>N@$8LnopD}DImEjSpTQEhY*vgi%XbvPr&)n*!b!(TL1iQ+2*r=NbQISR}$Jg4!l zEZlq3TIH+KKq8f+dJDtPh1RyFdC!q1FXtp?)giQ~{{*U;3dqo}3aX&J7pPkOt|nrI z?59z)Nb5RCa~9Pt_>?CqC^!qCOq5=HikenSDL5O=sZ1-k at KJ77R}}q)DvPDIk^O#u zB0j0!z*oUSX8UDj&8xsF8Kty=Qx+XP&5OK;yaaQCDMgD2<`6C;#$ggsx9jv)Xb6N zRoC=73orIhma>^p9_^;V6aD8IIr~PQ at xL+RMcF^qvO_us7?oU!q;bPq>fW~&qN(E6~6l5LbKhr^Z6^~U;4l7prOa_&` zFGaCEG2 at MqD()xtPg0A~LJ>V_Izy|9X4s6OR-i9oko2~brMB_6yU?(b@;rWO6YP3l zh)~&SCyg!E?<$+9Cp$S^8U4!-Pti at 0wHM;@E1@^BoG8>PJr(kQCT$XB=CC1cdn16d1;=D+ilHW(qght;@3 z$0DO~Q1J&hVVa*bUZ^m*&$1C+jMuo41+^_I49)r`bhujet=5du=T$g4#{TvE$v#OJgX zywd86thc9Ai8sxa_?L+4f2uzD{;f$FglBNq+LDiaX2&_Z*@CRytvU2 at F|)+-S9iOo zNVj!`|7%K7{jc8YFE|K at HVg;| z+yD2JLd at F2%udA7(aGJ!-NwmL#N5Q${r{O+q-z|gp=)9MWI#AY#fmD&Xt;|klLs&V zB++JM6gr?_;>p3kZYsDcgytIL*snY;b^f4V$0iPRu%)|S$~zd%$QynBbN5}aJc2UG zV at E#la=Y~!@LTM*N*Vn3ed7h9br_BU#UB1Ax-Iew5AESO#(<{m`Z{BV=b+kNR&%ym zXSRj#BF)~eU!8%+(;}yx>xfRTg;A}d4X!#)jYcQpLR at MaPmwrXu0Sgxs#D_DZ=&FF z;VS*#lc3c4O0v+N`F+%`!hX~w->pRnTeX$nwdXV~4;vmMG*~I)d=4wUj;3U{rU$}r z<`#^qY)TC-CLNpOG8?>=s at 7Z;O~vH}{Kw={+WDoDbgq~dS)ZB5HrmEt{7z at -fZ{d@ zsWj<-Gue2i^$Zs4Gxb32$oNf84tIe(vn(rZV{KDuHhMO59BryAJYQFdbicl$8XiPc zCxuPNh&z>U_L&&6lA^pg0~hvZ=tVZGor;tU0J=jnVPpza=#amPrg_5el47PP#;x`` znUPcx>*+R%_e7{>7n-&-u2KDzL%>&w0!p zS^{nXwda~EKaV$d_a_2nct+2ADE7ff4P?)b>XqqHe2z+U)u5{NkY#&AN56U5KERFnChN9u>muwOIVT_LDQxp75;AXq|H!NS0tU=U#QP`%ZF zbwfNMv0#}H6A+B>`lwOx zCc*);G{7FC_Kj2)w~)1t&7Rp_@&Q(`vUO7$(*4&&rC%*-qTjhz-mSux)BzMq3866g zQG5)I)0E(1_b(>zNA1}Hm*F{ok57#eYwv||u#3*qs7DC}cOHBKw~2 z*^YDnCa~TN+Z*=8Qf)7C-_-}>&^-3)KRilaTY^VmGcX|bH4?s1*(SBwVt*giBlS-b zK0;p${ZAfgW^!uUL;?X3B?SRt{6FxB*#BaU|3M-7I`IB#CzwK&-P8RtOv+%Oj(Q|8 zvNC!x+^FDHoF%zg z at -J`L;NkAcTWr8u^g`ZBz;M)eHPEGB*vY{q at RTCs zkZ&!mvG`QRcWciXx2vk1#UR;{=z+7VvwDK{n>&b6_{w;}H)^u9_H)@;K1Xe5&rx=k zm)KjM^Iw;%-E5%qh`m*}w#Yadk|;Tpx;%ckQ*SCzHjh+P*j$)xfUlYfFpa+kP$b$X z;76a|dUHBjObk8k)vt)q*>|opf2vu08t~13SFEUKoaw!^Iq$Nn3h3046MfbypenU{P_FW%(z88-7K`HR{VrgeY)p^7DJsqKV|A$!YgRu{_f&2+(UML4 z9m}AQ{zt2wA1r;#ORHFI-Dpjn#t>7s$U-;H!h*M-e~TlHlQPF3;~De9{Phv;c?OTM z5X;J9`~E2nv;Pl3c0_|WIeoOm;+t5ZE5*l;j;C87TRyu7SBYX0&e2f9WI3gxJVYl9 zQ%6B{BbNBOhxNDDb2nx?6-S6NoZCNp;t z=dwQp_Y~opYiFpIuD8|7I^t3~{o&2(Xeg3!yTo%87IwW33}#ufGY|ERW7jFGOGr at F;SrrkQcDwJ;-%eJIIqJ6u;L!kmUSh zjUrGXKT0oh6Ne|0iY#oyzEjflce=~LT{v=<)>=-lC{C48pfk>}BVH+~_o9WFpujGL z;-7Br+eDu{BnswESGW?!$aO*2w$d$&b_}7lxpgljK#fGx-97b@(w3m4?(g_pRY%XM zb{-P?TD7pp=b5l_1Ys$U!|5g4RJEa~OZQ3x+klL4ny6_jLOQJ9437WO#Io+xpDkrKTD)j1#3FPHrQ3TN#V{?jE~Q|w<5X at c)(S3W z5tV7vSQrY%$X$!#%sg?S2}=^W>Tc0C>G|)%piGwEiSdq$X8v;br&hkpW$(LcaF0u3&HkbB zEqkMszq3#6;$vFbY&r7^d|Ni1rwN*REGi^QH?oxW6qKYeUvh z*khC>G21;#{iyb?S2oEQ)V(IktcWSH>*6SgE01EEkB_|6h*Ko-!rRslt!iD-Y$Zi) zMqE!QBClFwR5ArQDXn_I@!GVzbM#5MrtNXenXyYpK=;bULr@ zBLFyuV4sdrJjY5Dsj>Sk zwieQ=<1%4RC!bZ5>9Ec)#*rgXbyCSYBXqdwle%z3QA>tTu%9nvg(ulygrzW9WY7mYD%f;9#5v~MdQZbG^QPL;yPv?YOoSy93tV~ zrX6yy?oy1}S$O9oG-e(mvi7L}$XE%|4+U8Jv;e&p-h~K%r<~;he`lTb0mxI%jR?eP zhl02Oi?<|%zq9uyn4FXOuiS^vdWpwUh5ERt7fELxppMiI2XB~3DmwjT;_ue~P zI|6P$Jh{~dZ4w5DJPb*jXAG~%e1oc8Ga{qu9P|E&0GTz)Y!tCtccQYP1wjnX;GZW% z9EQ!TUo(Qc|LC%${svK}dYI}Q4OeLTQV4*;6a=T!;D(Q<%?s1SEC|P9`U2hQyI0Da zY$_-YGeI9!WctF-#ob_OW3xBk8f)5#jgrIB#c43!nrn(T;S)>5Hb6l0`~;p=eE_lF zOo_kH>~J+%`jQSM5ZdnPuAhe+v+uYN2FLCE at A>qnmS&n#4rKwgIG)UX;U<~Lfr&&= z at x=wjA;rmuv{0t+WUXJ(hmGfE%DAT=K&L9^Ym2Ug!*T>Bv#x?eC_n%LuUI4UPr`p^ zAtSs^DU{tAb>*1UBL9rGSuHO%1s|dje`Rt7AsG!h(~Rl at W&@aGT5)^)pZRP6i3Fz> zS<_8XCXk~R2zofL%=%ZOczGvelQRe&2(h at K2-wW@7TOcezeXhxW^r?HL_E0MNpfpN~nSRVr5`N zw7{KSfC(i!cJ>Bng*-*6gWw2zQ>`p{N zZIuty-T)IK9U at JRc8BYkb!lH55apw;MY2I*HpR3m);SP1_> zG=Lk?$6t=f$))}Qf?s^Qa1xm)^2{6S{`kQ#em8J81Aew1bkX+pf+wqb+C%H~;l&S7 zyx2a0e{U;GB;-nv(VPqJ4umcU{&)H?N|seAa2Y!1yCrw#ubcW^NVQUsvNkzWCa7yb zo9IMYi}vhgT-bKk)g;V}koZ$a0em2;N%BFjlt z2jKGeqxac|GLcdLuQh6kr?;9OkI5moF3Yy!Q=F+^vboA(ZH+96UIOH6BnFFi_8e}~ zuv)bQwiVJst|enl8$beiBOg;G6#B7{BI4Xf$xR3UBaRC5%R>cRbosF&~r;K~Ud26_F%OjIOat4iegO zM|3NTnblINQ24>UIi6{|5B{FCZ5L|^M;4Zv<(2x(c5Ab*%I0^ULoNT@#@Z7{GRJOc zmtadcS0Y at Nf8zOsFgis~vNE>?DI|@khwPhNmi8K~cM(``%bn1uYu4#%i0F}v{RhoX zX5)J1C3TMuYV!&-ePq9aRfgKVu`a0$ueX8baL;xyS3nGm?p88w82@*J%D;1oH#{k) z7!(>-VvW(mmIgnf1?kW9qE&Zc@*il(Nd%PaZ~ltaF9mj%?`f?3%)tcaC~2$y;A#%Y zu4SEKsko^rxs<%JOU<)kaU at 3lmXRk6p^$KYN#Zf1>`%mUq&H at fcW4jMqGAZ(zh3T2 zbE|Y#e&V)Vb*oK#azwp)AL+jiClytSqC1ubRpJJFW^aYe*pBEBhT(4hqMc-2(;q5L zIJh9Rl3PO;TH#hZhA0=#p}cE;vwfSldumU%Jk^_7cVAn`Ws2_OiMF9i9+-ltd|Bn& z!D3YX-TX;h=Tz05KVyNKd-C>7cf9I5TW)XF?>?)NWZ>>1gMYbK{*L+LYBL~dtKY>$ za+7*X*mxm@&c41LAKi6jCCB`F0jsP{Mf0}c4Y?r#4EmofGP?R(q97Ouh#tiMxkZ+= zv9LG)A1!ixs)N$1GREXTuUz*vFkT`|Tx`H^58(h#!7=mfEc#(Ba`OAzhW-T8&6FFY zZ`we31$MTSDLHhZw1?dW at KlD_02g21PriR{3xgMTLPCLHTNA7Ft{`F?jCXAITQ7TE zd+tXQ&ChGl+s+b|Cj+qN=XcQg!s9pCc)6WkiR0DIVyGN at 0_#X6maaekWA7$D;ieoh zrWEQZQs6p(h~)7y+ns;qMJj at 58sr=2wAm!(DpN}Ubfz$B_3+y<0aSqgz1sYJ zhPqVq;y540&Ub14)R|PtD88yBEL{LVpW&4vTQ^Zr0tZD1Cw!;gQOc!$CyDO?pV5emz^o07qw2Q*9X;%wZ;r3H5ZG_a!DnR`2}K<7hK)SXerZ@ zmSSQCT5Focg(LTDu0U5n at Wq8{k$5%~Rz4AtR?ES|F~ZkS_3q`NAu_U1C1jh7Zd3BB zzARjz$t40EG~`I<0%6YKPZ4B&zUDKVv91<(x6 at YHu}I;p^{i?`mOLUxUgOqRSwt*! z#0gQy;wSwN*#AVL`e0g>9ykaH1T+W;%l`q13Ks6xPX7-S$yxq480*!I)bKS31UeDz zwXsEt>Ot#wusFiQ8Mbs8+Tm#Gn_=6OhcO7xJpWSKZ(mRB^{*6U1z*Ht5gXyuyc3^ z3{aeZNmD-)K6F!e_cdFz#n}+*hMX_NOL3q!Uj4f%%Iwq(b~_{tSgre3J4!A+4*3uQ zI?BIu*3|7eg(`DKZPZCLP`EtN|lpPAWcosLoFQEfz1#3Pz0jS4e{Y{8q<0sH{yC5Ih3tWVC>@zAs%Dys@!)c z5IE9mFJ0Vyl0p7;*Va~d)|#Y0^_Z)U=kc!rvO$u+gAiYJ0rcP;ueut at iA`lHiwc!* z at yS7O02+$AQbh%9&-miR0fUN8*vrWA8_DuD|FCx#<;~ry#cLX)09 z&Vq?`yEGjSeY>M475p{wh^8&^sGYvzZd6~D^uJNjvooprCvg~z_$Q6wTThZNC^i30 zao#sY;PQ6&?TR+!$+4^SWlzahq79m|rCS%3jWNt6o5!yq3ef?#iP>4+^ z6&V2+O46(!`|&!y#q@ z!z?;qczAGus{Ky?4x3I3>O3^s!iknpt;PO0f+g^hSamY_x9`lpa&v&PkN+yw6R%CX zg3f}b@$y3tY9c58Qj4NoNK<6Rj7Ru*z#FwDy>xRI14xw#qTh9TBV+kuvLH7-tQw>$ zI6s>^$)1~*c0%y+L at q}VykKC?zK*3*_4hP9y&k)qU!=m1E5{^X=iaMB=)p-juIFM? zXyQtVD|2q4N|COp!FfAYr(dWvJBN78Sr$sd8?o{FVK+56h73{)^-smaV|I>~9qbl$ z8i6To{HhjI2Z$$6{HX69Bs%Ixl&xZY#D9ZJVppRo7F+eke at 8La)Y*{yx2nu-4Xc)JYd}ngtNa6-ryYg< zAns(47kglJ-2hMZd6i>oZNZHhJ=u|x%1uGro<2(0rtLO>W(Vcxi%_EOf)#D4&Ur at n zTQZ|M-9cmiPlywdKL+bsZv3KNS^RUeMu*Fk?+0?~`OK%Y^U2IX-xl6F$q*;3jCJH(-bS?mN z*EvA6#7p1NR#RP(z%4~^5a>S;BF7Zg5c~*F3vVu69M>=aVWJr02bb)W4>B0$DnuNV zoipD^pJawxWyuTb%0MlgX(lpHG37R!R*52TU>89v^CXV$fUZzfRU?XyetnD^VeOUl z76EAqHydS$bz*Ttn!JRr=={XXI(_cAFQz_NXn+2lggzUq>cMhJQ z`FRHg1%~HMb>L!I5BYHI$Br^gx8Pah$?v2r?bx8J`^M__ZjbpK%`XlI{lS6i=;4-A z<{OklmO)gGkL4?wpsvWd)2R*Z&OxTUG0XL+_hluO(q1etKP)5i40#HuUh7 zk-Nu7Bp5%Z>?Wo|GT~^&#O{VatA5fGk;`hXglgn%JFr?ASXbn1N!QU0yHSUs{iX3K z3+hasa+V459^6WvM(`A+9Ou-tJoNUM{<{H@*+fHGxV2Hs%Hj`AHeq4<2izb_-h4BS z9nMLx+0p*Rl^Go}n*5E=siD691c{byyNhr|fwjC3eF62XCT?4NMoA8jMQ4mzl${Yr zLop$PiRInR_3Y12j-%@hA{FW3o{CtS_O4a2!p&8abfo8>0UHEZ2B=hbLdjQ0v%khn zDX(KLJL6^7;U at ED6P0KW|1lBXK_n>S5_J!obKAPFkC3)!^8RAFOItXp%%yDQaUSP( z7E+k?wKm|*z&FtEssq8HyTNl(0Vu#o9HC(h at yO@cFq7qtOdD zn=0cM*KAGF*~3L;^@rH6MM233*kN?7(aK3eGKX0B!^C$FcPxMu{u#>Im4$24jOVk! zsH79r2njSSy^D<3j at OQbjtb?SgpG_`zRgY#omFwuSIkhCc*mxzpd_5Kg7lb=l z3cj38_qO`IrIE14>#>^Yk at E;=u9>DtXefl=zg`;#oJ(LkeO>dVLp2jhks at vjf=gBmt2`GBwl2}=swGzV!*f>7sZDcg3bd!hMDIE(m$|X#w zs^Kgn#!66>Y9DO~{s4h;f<2!s`R$Y+b}D}j+U05a{_C&SKm2_Iv7j9V zPjwq^ME@;i^Qp|$qhZTw+Ygv}5$K72qjSU~In`!oM!%Q9pl_**MO7L@?08XPDt670UoQ{!|W4 z2R2-&0;Yelh8CUy5t!tJm(2hBMe>N)y_;WFv;WrgbGy1l&p_FuFL#e z>YCY5p)zcSUuV_`ExDC8nUc>(S6S!O&sTSi_ElKH?sTQ~}#DU$p at 5 ziAir3Wix;5g`pHRyYxI=dY<-{WT`X5O$A9=(mc79-MyVsS-p(&YM1oEUNz!`G*z{r>ssEkES_-tPiGYddlIA z8WpiYr#AJ%ZL;9lC)|SulgleE=MN`ubqMVAnCsM*iRj}7wF8+i4fHB$0+hTji^=|$ zv&B_TG<;5`L2AO8E54?ozAgzGKMUnUCTHJyl*}*jI1iqT#?_On{Wqdg3z#QbQlIcR z#ISGhZ1^bxR8i5r6ipnQk&ODiK2cbNJ;%8xO!z+WiN6R)?$@!#dYRQk24e~;Exo{2 zHVCLabQ at c)*M~<^OUp;xTKF0Fdv?L~>BX10^l;s+5l%I=Zh)`ss_M*&JaX~x=bDh3 z5C!mFC?rI7#25}|Tji3FhGB9joiHRsUXHDj zVNJvi8|N^n9S-k!s9ts$yC%IbM#LTtX7=;tBCRk%L{hxnl3^mm61-=-VBRqfoF$+p zA{rh!hqMiI)vzJrt4)(p*bcjQJ(QQ7b0U<}3UD5;Pa>?-=H3%=zj(Npox6Ov3aW4e z=!W+tA6960FNYXdK1_%AB^h>LbMJ-tQ$HNUF{k at h0zPmY%)|$zL-HO5HS!pWMS9Bt zAGi&6;s)j-y=8z8+yvio1ACF)3cv^Mf{D3-kw|aJ;DOh{h1|eOq_=+XA7HQ$FHi~T ztrh&|Pw*fw(23U`kPUH)QbnpPR+KRW2WAJuj=ohis at P=^i4VIgZyYt$53w%|6!fk{ zaw=c$HEBk=3vmSt1k*y(t{C+z7LEKHq7;cdq`~Wtf_32xf(Off;hf~|6Fd}Y^C|)s z34?&XXM#rvfC8&^=N2s`WA}}+OdR1QOh{fp9u*}N1gq!u$7onOMAa at DErlQ=n*AJf{20&IlykT#b4lTOm zB8^ZU8l#Upfg6X!P2!P3BkjCjvCjW~MNGK-ngG7=sworEh1$7Sj3DH17fD!owx#gE zSSweznr1b!QSpYR8z*HemdZG{FHnlLFH{ueX2E|?R;<|3)NN$rZ(P~qE&E6hxmRs& zBfwnRQ_ijG;MT3{@O;Gh9LAWwO1>I`-I3h~f)SJ4i-1AH at GH;l&mp0`VT355duI%3 z!T84yb;9~b4kf~Vr423S(a#Ks0CN>L77NJk`%=fZu=DMM`&Xw^AXFisws&Cs_oiQ$ zuTc2pfou>1vOo#21B!bAs^0ki^r1*terX^|hzXdGOUq`{sXz6YN*a5FJFI0+0(LP!8w?5vT-2hWL>NDnb0n1DPOxWPwf) zKZ-zNh#wiC5yX!IP)N~}_%kK7Ke|75s5k$-!VAS4IfM*?h}8N2BIF)}GXn$XYYvJ6IJyhGa_G9#IG{H6`Ao#8)OAT zM#mw&M+GCMyoU*vf)$VinnDm!-#dd%z~+%Sr3|7&6i_(D4AKO%f>pxik>10CS;7iP z08=66QF)Yr)?f=LZv?>$=x-sZec^q5VS7^sB=?_a9 at y_F!SE0PYQqK#LUKT8%4>(5 z&Rl=^Gm-;*kRk}2Q-K7GZMY9!s=~_CC$K{1@;&jpHWePCS8}15YT3gT8C|48yc-WA zk!4UFr#9Sel-t1$HsxewBLIn4#$La_JZv28MgcHPy!}UtcTycp;aD($QcJMH4uyg) zT}1`}|M5K?+y%;vwhCdRNb3V+=m9r}Qld?De&Zw1$Opu%9D%2JB4LE)XZ)z?uzS_m zV9}^ZpnYJ|)xoa;P5FRpa<;dCkW8N&Dp{F!x7^BYhYsmyE%%Vu4%A~a>Ptevtil~R zS2F>&nab)fWi4Bz9PMY8Jt?EInNlTd=(hB&VVX|oARKbtN*`qnqy^iXiY;P>PE(39Jda=!xZlDBn0lB zgTS9QN_=4*Hx{>9brA+8pjJ(w5;F`3%ZAGKjLuS>&bREaV7Ttu%~i1- at Ym?E)-aIR z`xCvZR85y?C1MDbIkkpwwGpiy^S}i&9C1-RRE1adwTm^4zLLz=c_YQx&i_fsGSHE4 zm6+j7jOeTm#!GDXQrq%r9G4sqJXaxxaLm5prJ-%jf2zV-K#Pq`Di3DUh1zfgGcb&o zDxcN1;losdym+I-t%ZwI=l*JVH3=I5y~}D5X!?{HtG?wc=TYDikfPYpXZuve%8jwx zmkK@?bV_FGe`1-SiS~2wxUn{Wg<-%fZ9s*2BZw^CJg4K$K at UrEYj(rD6t1Y7+!(jD zZiR6twLjC{-c-id`}KEanlaDcUWlK_GUb!Xde$O#FX4L4q5ZtAWrZJe9!X5yeW~im z{f1y(#T~vzCtg at iefOgNkL_VG!-maRzRk$F`nnEMvj%YkrWYU^aBLx1nJ%3z%a3 at v zw%Bi&!n|x6ZI?`@sYAvIS4??jLEDEQ=9WtPkfRsfSPAt*wio|Y<$23imcsZ4EkgKe z9NikzJ1NX#um{YU1+O_aUzo)*DT9u~)8_Q5s{pThB4X+j=j%2LZy+HIoWI7IZd6~) zYNa-mRk(R^EEz@>lS}J;l?(Z0TWrr4otm4=Gp>0d*v=!Q$pJZ}K_V0&rdMph%;&=oEhsOllJJSXIA)W)C at XlaC-@6w%N{y2MP|sL^FH z(FxUEY(Z?8VM`k>{&ZE#uD_jTEK}eOPx~8O;m6tBlW9Yg_SGkBYbb7IxMy zyB72{)uGTb+JeS=R?GCNb&Yyi2-|2YyN4q at qo%!$C}z!)S)PUc`yDy{%{DfJX%jSA zI#r>{3%ixnD;V at QjIm*qmfpl at ig1F&9P?u)BCh# zE>}LEG`rfkwnJ+XRDX?f&&~~YsY|6t272zN#-a|@!%)a*0yx#fqx=yx9GWfGLyP>8 zac#l@;~ki9D0O;?sd6YX4-|X|_0}6}R=ndi&g^K%H&JNyTLl3)wa{wh4?$GF2*lzy z;ELVk9G6J~`q_RcFMgZ;^>6PpsB%E)1E#vfuhJ!G#OejQ>V=X==s|rUOeO({zcOPQ z23K>8r1;8C-ahBKB}C0W1+`^WIW8Oeo8jp_w*qjQW>H0dk1bl^W4%|=R!GKH)0O(* zkwRPjF7uDWA^yO_^I5~{kU~N(wH-YIG^8gn!^8a+V>G4rZ5m(&Mxc;I!G#V7a4 z#?-d?e3}p4@=-2y3gy>G8)UUPZc|f-zfaI?my4!QHzVNpTtP(tK;5|0ogSd?c}xrfpKyy=JsTUo^M|pK6nQ#y4Jd%()C>KS?ay=RtCQ{16x1E!l at QhGK7PcfsACDCcHpvB zdt1U3?x2bYYGbXOb=4C7Aatg^(h{j)X&O42KetN4MSHRv3Tan8|8s1vL0sqHN7jjj zJIAoWQ5ejIvDFNM>istox}!MNeI~GW@=SHk{OV5*x|dYbUpNM9 at AIg1TtYVXb>m%c z8aQw2ENts10}Zqy*FXquZ<8BoW+SR~d?!$7A;&qy7Z=?@_4DTHPHPLs4&UovLX{J@ zDv2Q at rA!^BU|!bs5u6BopipQ>j+5+!S=SDayYr#7g&9T|yPj9*kuavX2o<*WiKeMQ3=+W*F)QsY| z_0`k{*MipPbrgIDwGVIFPhaM{es?-RLU~TW%vNhMOKLmAk~b}B594jEu}x0gOQZkz z%9FoVszBG3wAAMdrKb&bo)3WaUy~$K&|D+cBA3*49gsQEmR7X=4M(h)ay at dqkaAJO z>7K3q8Zc9*zg#z8BDw9OqDekZA7tHIo(z;kDs5O~`E}%P_VMacK3gg{=qa!8V!o

)8-cTXOR>L| zIYkOlg*^+6_u0t42T?N8mEX98FGD$`POoZD+mV|?EX#)y$*A!ow91pEntYi5U}gIP z*96bBZTNT_)3-h8T%UBlnPA(*`~#VS)5M5?5ZiL at 3W=-|slkrmk!?gs_3j+&-=OE; zUCX|5OJFbTuyl~PDjvvfsF?QR-_o+;$9CMoeB8wh9oT#@W|d;5lff9txW_eZ=Xlip zP(dcVX4|T|x9hVhMS!y7`jM#7(ueHVbpRSFM8PD5{oWGWVuf5YCTQG{t8U&g1OTdf z-NFU8mJ!RDyE7cFq3(o`HS;VEu*hu_ZPDGq7-Tg;>L)F!5Cx587fMi>WM}G{=Ko&U zbeU6lEKI^vq;FPUqSM<_;RxxFUG*q_Q*O3_sAwxR2lvWZO{6V&5_(PmKYLg<<|6j! z_0nvDzz!f1SRYVg?Fa6r%1%KJ!hhH*(tj$^P=2U;w(8bx90QtNn|8Z};3npTt2dd0 zX6Ag9=zZITi#MeP6KGZ!2;piQ95$RqJ3N9TU`gzl>*x2_K(_VT~~ES17+eH z3?0{WFl(8 at eL1U5ABn6m^D!bk_>Z_>#6JUIqpxII$eyx@;C%X6BynxA;_u{D^qhm_mohCC0DN;?1Fg-_{eeBukzkA9q7cQ&Tu%klA0T4sB2+LX zFjr=YeOzlxPupH?M#~J3viSwYv_o_tYUA!;y`6BSrEjRXMK~M*@+!%eEVCexjkTDQ zx*C?pNb9X3 at 1Q#`sB~_wuGx;EjlQV2HF#3#GfYEP<7~jK>A!5P1}HLJ$;x0l&7h_& zQR=r#yv=iKiTq|mL|;5dXuOnV%_!4np8V at UOS~XwZYqVi_^btQAKsx>r30#vF6dFQ zN(6c%nfXGYkjxc3d%IaGdXz&&Sho&_ASGHe$=S2gl)Bn2UR`rGhcTiG?~I>-(f71L zGzYb|Z^)j2i$F&DREv{t@$gy*w|#R)EUVXO7;i^ zIYlYOs|=CyJ$RIXfVeMxMKYB(i8h7yBajt9B%eIWdiMj2onnTfFtskpOj<)`UAl$B zFv(A*MX}|_Bj(fw#X*vv+~aB}MM09^nQ>trWwt4K8bh_+Z#6-B%vv^|Z0;ck+vMkR z_`U1?ujE^Yb_1!zIR}%Mcdj1XfXnm;zsSbAR=a0a at _6;42=-_8+Q?7b#Q{;<%{w at 8 zrH9YE-q?{p at oy7`roy|TlbV|!@b+!uibXk29 at _*$Q*@+nD3RJpO_M9% z5i}og$btn%mS2b!8 at gnbZ-?CTc422aCkcWC(e1zsVzs3%6Kh9YFr5)9vcc67dEN{=AsFIHqH3? zRUCvPat&)-Zids~S6Zs167?884SCuJY-m&V(C|ndk#||dog}jwaim}|0cVJY7J3(u zoL3ljziFI8>MO|KH7e$jXyKJ-N&T%p!7AR)C7J%}jS9=42NsM=euc}x>ndcOD&X`) zX`JU>Ot!a at e`-WK8yx)_qfF=<|IrCQz+>a*u+C$3D9OVlj+5aE#qq;eP>d!U!h_gV zbilczd1hRu>hw`x{i>QwN&kdB%cr1r$GQ$!XcJZ|KinC+2u?L=0?WLpzkbl!CpYL2 at d!An%;A@=Vd&1Ii zriR?yW(sz#SfTrbw4s!5B2-+~&dn&o4MYc=zF$ z&{a>nr_5iKT*Aab;)la{*O)OCVgfWTcZEe5tC;}IyIeBOCo{P2X& z`TFeeWwYuzUq{W7Ztz#Nw&70|Xw*IYajc#RHkF3JRUaTR`I8^luX4;xxx==f3>s|j zZpYM98OL{C=lOcin_&=TH^|3v;d#TWkTJI=z(>Epwoe2ZYo-F=GYI4?Y~)0=!Ka-tk_^505XDS z`FEST+vASie`F9OU;_$GVXK}H)#%t*38tK$Jpp8?&TO)q%~}Q*)L>T80z+;M zLmw+!tBFERt~8IHYn6s;HHXzAfyPv4pH9}tv~OB(lGZvt8`0eFXG|mK2;i|MO+y?M z;=}7!?>#EI!|zaxb7VFeu+0ItUZ%3 at u5$eNE5H!%K0Lx=5xd|%9K7F2dG(WKFA?A$ z-!02dGu6j`%bz0_(!Wr)@?Mw|= zhRML*7{y1Oo;oXYgwdOiecpW8eBFHV&@^G42v2l=PXr8qqB;AOBhX%mzT$N67Fxy- zC&#<1R)J)GsZ?=mRx`j8w?G zrkVNIHH(~!Q`QM4q*lu7=O^jPC&myx#g at vc?u|91jN%4QDh7z4$S;#Y+{=Pbjf+U& zWv5+PG{@s3qUSWBB+6xFR29&fjP)KvW3<-NggeejACFw;kc#1T3|9Ra;~fe$qxG!y zqV>30dg^NWr^3!BGi#pi0 at cTc6}*CLIi@2V2%Z ze@}^W0#i!A(eg-W(A8isy}Eavn20W3K6+IPP)Wuii6Yml|I)T87Pi*{5HnkmOmLQ5 zn37I1Ec4*0y6xcK(rHA_T`2JaOe|%v4L`>WiXXZ6QT at E$@taF^Ycy^o_y!<1TOLIw zQsfl9+dXuGBJVzzCWaPLDMX-6i3oL^3MY_tCq(^ihUjV3ObMlIFb76oTyH~SYwF|5 zUAh3RwhoY$J*MfB9*SGfXx$$5Y&0B?G at 1bRH$z(8GP##wQP**M1)J~laFE>0pA4$d zhOLQgndvV6^9MiN^OxfWz;)Yh2iIynjda>aGERSL7|?J7G;g{hI?ggGyONb8=`-`` z=$9K~bWIDc89lvbT+>?{|tL~aQWv%K0Qj_z-wJnG4cOgNyilqY0Q~u at 6#R-=wMW^ z;p(hcfa~87(+gb)r^lW5_V~`tWnoPgZqJubZMB}QvS$j))UH~sT}d!ZkkIFP9g8$l z$6n#OjF3yeX#LWwAM>vK697!I!VOk~_)Eru5)6*|<_A%bFvyO|gAqJ}iUSvl7a@<+ zV!Sx)#DPF=yf|VsYDC;NQAAu2GxQ^b8a83 at 3&#(X3+*~47$TGvC&CF~86`RxYzZeW z1O*)3V}b-4c?_tnb7riH0Cz8rz_2OOR1IzrN{sT61eAghrh3C2TBGqp4!{i01nOWI zMBJhGVuou1&mjg#-YAC}OP#XoG7qUCgyV;6+x!ssHz72E?jhV_iNL?+Ae%5fRj6qm zD$H^3xQ>WOf$4FohO=L at z7>NJ1lTJbnoev|eEk6mG0vaCWACVB38Hu;Yd= zM-xEfarArI at d<%}R0D&Z8UE9YiDvkt8q0woe>7&V0K>-*3nTht?dz;Jj!~Szz2n9o zc at G@(k)88zWS#dkx`n|GzJD}Zv?+tzUU}$GmA4H at -i*= zcRD1W4+WE)zdjV*$lxb$s*w-#U#)gKIgBGMZ^w7Uxob)juRRaBddN4|un$`cW`tR= z6(NNb$9yw^>s~v`N(X2k7kInBuCzmh31mh~HH}?su6E?^hu##tXi*Pl*AEV_#>77$ zbPbPexl!-TuN)tq#mV~58GlKS8g?ROt8IA7Vv%O>3}Lmi$`qZ>^1R>Sm}8K|OpC at 2t?IS7UDrwueVo|9{BgN*kN zjHGWE%h?|HL*M122S2J)J~VE6kc`=tN#(ERrqNX^{K z?Z2n68UI at fJId?-4`GLbh*tk!{~GY0{&k^N9{dtoijGRk{}He!2Mxf^)LYnDn%P-e zS=pLco7jRt$l=Ms;latHVE at gSU^UrDi@*f|@e~CCq56Nm!M{`3w%U&MG|}i2q>@Nc zrNBuKQN<7$(UVx3w_y*HJQTF83_?_Gwv;?@SspwZsbb{>F6*vhCMjA?GmYabQ at XzI$A#Ffd>eFhXCQAUue!KprC|sNE}bWgz9R`{~G)D|N)%`l1FrJ4I0* zf<3f&``GTNc0G?qOXU+pd!>jHe^`pnzQdtnX)6{C1vH&s@#7_=P{X;q1c~-?(un7s zR(@l7IW1lu_4H;PR=601a(oN6}tWa{R-t%fqiql+8q(}n+XgurL3PT0T5ECa?#l`A8t8_orAM>rG$X~KCxiVCx;`JxQ zX*j%QhLGA>9|x1U-wYQm5DzDZE?aePz?GQ)9w=MpAE5DvUr`xdEGuy>*0_2|d<9iT z at s*JoLio~YB=)FkqOa7!jiDvX!HY*mq)uYOAx%G+XE&@Lnt2qOXXTk|3dpmUH<;30 zmslc1bDg}!@j_*8H#g3S8A=He%L(JmEQ6+Ov`DmHLnFjc7Mf*oQpnywo%sxxHI}Mz zWiYKgHFFWZC^`@nx*nw(JO`qixsQO>b?}^p!8)JGy+U(q at bS1Lg+ATB^%4T~&qr6| z)0^pVZeqg}XH%uIcB1m7*ZIHD<6D{RpEr|zI<}Zo?m#{OKU|%p*?j5kOYkEO(l%4FQ2&`hisLj?)MJD1_dZm`iKLuu zzn*<@FA_X?qzSPnzS)cmW_4{3nxU(4!OZpQM|vg5Uvk`d;LCGXCR2=FB(Ok5cX zMzKbi3q#kwS9$lnpL!2}X{_#}!;+pZ+R3JS(%>K?MX)IMQT3z`*Z#@?>|tNx5)F>; z8tC{!sV3F;7uWX{&mU|lCz at 1}lWy+d%Tn}yCIdx=eRn;eQloK*aWXp6 at Ss*uGQoOv z#U8|Yu%2sz`aD49=4StknB5 z-pV}nQ}j|70|6qnCUDNCd^h=X$lwzFtGzuU!>3!j>mxt^CU~1OAJHwdMt5yn^6 at I? zgOCva3jcoV_70(~y~sFb9hIkR?4YZn4>YryX+08~IRcwrbL3 at z5hXj4$i!=c&H;gg zW34nSq5DNd*V2|BPMIPW#L~29Ap18T{ssqUGUw4rgyK|$rjVV7TZv0=pMvhGW3{8r zB-+G%2mlABZFQ-Sb#ZxlkqJ at U&ZVflwYYEWpsg8lOwP~#iWc#CFDj+28ZJ{W{;L~7 zN=jEufAAnoQ$F7Ix!c#isLvJAoxPWb&5tkVvizk&L{4lb=WIK|W3+#FN*?rxBLR~p8>X%?9Z-6g|LO+7Yq(*trb6Z;aCXJveOGOgbn*2x(RPTTgE`_(Bx=VB#7g_mbc}ZQOjpDS;vQZLcu0~}l}e6}G#03i3=Pcz zyN4-Z_{qj;PtQLgE at 4*Dtte1PL>ejVT8P};Q3e4CjzymM_$Ri>MoMJ3$S+jZ$SO#9 zvPTALh_Wk_*w}dD|q~~Fm;EMl17W2e7 zzeJV}!7S^4CTp=&PhcX1E&78Q=gU4jv~GnwO*H*z6H1M87EMVSB+0GQtvH71s1QF= z6P5P6YPXVR{~5`mFSVw_i+YEEMB|Xd(azEn+1^po3ULc#UpbRA9q%+uoCxg+WL%V| zkH>Myh$WCrQy88qui3#r3zNTIt63X~*0t(1J5zq1M%X|EPl`~S^G=RaUdqsx~sD^ z7mGq=d)SEqmLYHgB3wdSJ85)P+ at 1>3De*9k+stG*!}G zO42-w1YG)*#828rmaO9Kwh9e7S%#Ci*(uzbHWBy~iA#ztuGFMU>%rEcwpLbxnBUod zDcCd$$<8lR)v6t3p^(MVm)fk-7dg-}D}(UxV5EF8D_uNDV$MSp^Cfab`$RiZD-N2f zeJpI;Z0+Q#0-!T+j2V?_wFCut%s9scDlnHb%X?`F6e2@)7Av$ISz5SoHuzhm(P{f- z-TB+iy{b%gdA54AqX7bQLpQK1r*p+8XIh24qQ)8<^G(a_{rM)Oa_5RaQPLX3Fd)fU zt{q|RQ0{+ER0|w6_^(cWhpc^oq8iVd&{WL&1Fc0`ma^MVD zKN%1TlpC&7W^fM70hNUeXbX0W<&+rI2>%ul^bRRN0{j7r47*8hq&7GLMud8w732u# zr8l_pFJc-REPxbf4myB#UlX(e*-Hy#4sjl;faB6_8iC-~Yf^&sh%=gi^T;!ThumS% z(rRKye9Hh;!nrR4J>UZJL-}n4eL at MC4;muA<$?xs1BszNR)PX??;XLvCW5|k?wf

|1k!DfdyPJ-Kr zjiNn7$E4|l!FmTT_+E!MMu^>eex7MW$B`w6H^E?GlsEEVVN|ck!9v(xIiMiVFyh at v zi; zD0P$r0x%)4bf?H%^&v^_+K6xmE^KwO!F2(fIqD2Zr}$jPh at TK#om*&mB)V|+4jy23 zF0FVxD|3orvfR2*YYy#sS|2P6bC*V4xoha%aA!T*>{~5Rc)QmeJX3Ss)u!Zcdv at q{ z9<4+zybzxf*Pgv`gS%ueQvD at S{*zw{z(ADy3kW}m8dwIZrm(>WhzvBIsj+~euTztO zlPA4vi5FyS-)JS*=1lMC*uG)Q&dtVOH>TL&ojaA2Ge8C{$Bz0+d> zBQyHf3jKp)`$v%|SrR}kuvi!d&*p=c0Wx5o2q-9Yuqc=!7!>G_q9_r{;6D(GZp|Im z*M*x0uphC5fqK`30X)Ivumlo7Ri+oFLWRLAlRMM{-)mC{0=;X0whw=UYti$MbdVBa z7wljeh+POO^ej;$I#83da)<=drj(#U5yoIXuxAK77!EX^>_Iv(P_SCqJkg?P5%zy- zp&nuzCQr5~Uj#Z>5&Iqfy)xEc{KbD1ncN8?xRkp2z?CcdGuRh~K+5Ql;ssO~RMmrU ze>>%e|8WSplgAyn2y5EVvlAlA7tSXm1k0$fR}$ zU^#?1%G?gjdN~w=Hwb&fX6S?`XzTga$Zi!nRjDLQeMRk{b5t%Ez5p^0s){=-heDt1 z3dZ8MLY??%ds`{|DN at QhXB`plk^(aESD^HR&JZ^C`V{{jb#G>2P|A+^AS!XF at 59Y- z$bd)HUzxA)$IhCz$fm)lEr)6x$T9w5++ zU%{7w$uQBMYj!}C^#{aIb+|wIsIMh?c>GgnAq1_Re(czHF!bhVMO9$RF|>NMK3r-K`fXcfpL?2^M(H6o{ZFP0 zG0ThX2UEy#I`!tMbZ*$flfVk~jh=~DOssI9_#4sD6&&CL%qOEs4&Y~5oqTkTv7qp9 zQx2v}X$KQcw6z^w-|%>Go8My`gXe^*qV{BBmmxe0t?EbL9-~iFG($a2KpWtnZ7Q7C zndrZ&FEmYDN4q_-f5qe)_egJ}XWr0Kf-wM)=_Hs?KhBg!HaAPd{`NVi8EE&*!B&3Y z7<=~y2!N at du5^a~Ei0L4C~QabxMhv^lgHCmR>;7(h1R=u%)~tMxd|S at 9BDEkIeHeS zeMvcDI}hL~p8fL{-=y5U)Y}c0fsu|y`mB)^Po7sU0p9|3LuW!xJkapwX?1Q##xch1 z7nbPq3m`YDh0^U7C3)Hp{)-j6)J2#;(*DCi1efv}5SDJ8sCMdM7|}#`%u;>xfp08n zuxB}Ft at E0F$y at +Luq7#jJSZhl&E}L)W8P!rl#N-?ws*7K5c1Cfhn>vPPDS>yCPkYX)C(&9a_xH9Pej?;MAx6TBzjFNm-j zF;I1N{mc19LmMJLCh;KF7tfP(fU|F~|2ERgDc=;mV7v6ATQ)!4EJu&&DGgzOw!emY zQ at 8Y^A2k3Eu)mh(DfQ=*ycd<0dF3KFEmO5OFztYA_?-NKQo)aQOsw={9n~OVl$-Nm z4nx>BEzmR!U)oOs-B9KsSS8>c<{c!u(e~(ymI(LMGrq}?^np{sk8x~);M6mrsWSO3 zg6f~|vRNhI6~-4Oy3yvSmX?U<)R54a`^e{zwbz?F6}I|~KyaY&I)d)x9X3D*E`vvw zaIMoQa&p!^zp;C at 8HKuSCRpzI1;$qFtC0Sy at R*wTyPj$Q`%hrSTVMpS?$_8as5#_2 z(r+cqZ>0y*nE at CHtsWgkzs at nfUEi8d zg^@OfPK1&E6z(CqCVgvvY(6ebtSNuE;La0L&$)K at Uf>i~Co*S4SEb250rwQ2ynYAs zq%RK=OO zuus|8vsWu>3!bxNt1hkco!B0Dmm>w!$JdTCJiP8UVwhHA+7`86h z`9^9ed>TY+=InYfw%Y`q+agU$zEihc6%9V;#OtS*zRAPYvi~M3S-ww&t!%id`*)Ku zEFIdIVFx2#kU4c57+Y%WZDbj~pz&yU{tWpz4yYo3e`!AONPM*46c8JqJcemKTNT$! z=XG7?v at EyQd<{l8fC-p$VvGR6EXzE>C at cFyXK;@fBdSbb7`X at 2Q5$B$`6mnV3ybYf z7~GBH8OP2cOcPXuUoAHfE`Dh{>arO!hURMujrJ@~Pg8F}_Z%ioQ*T1&*nX1x8G^=T zNl5zb_BFG8`#=IA_MU~dk4MjSd0+Ahx*QCsV{>~>lslhHKcGoEbi%(pjy>@Mn8)t0 z*Rrlo?;kH!8ekKDi4N2$r^awsUABom8>R~mUhCKS42Wnus?Ez{RquSI+&&7qUFkvTK+b&EW2I|20@%@5&)2-G at E18uCX%mc at 8+$({w z{Bn(rrY1g0N>_-sefUU{jozmPS=;bh^aUQ532hi_cyDzrD!Rk{DarN7AZjKy%*HY@ zBH;aHQub-3LiCPI2@|hbjYjR&j80o3H-J>c*h62~%O3|qz& z`LPdI6y~qKRn>?e%K%q<4`;@T>PW(iwXA=Fiw{qYLx*1^rt4Lca0#Ugf2WqsboIFb zvFt_s+xkKGC-{6D=C^YD9B-~v@!FQvka(*DHBr!XgymucnP0%ndIbNhX5D^Xi2PyM zd`;oLp7}k%avOK;eXU*;{`L`5L-zm&_xE^JjsZ?In~H^*L0^8dH at DeIuTN{CmJ}cP z&x?F at NB-uWdVbqs-fH?j$He1jeyUfcD6Ki~->t?!CpqAMDlk%)w>3Ir0sSf3z&XFjJUc4% zLb`9-?^Jl^#ih?)ze?XeN$wCbRWO_@;uV*B*i`drk?$ih{WmmN at j^YjrzJF?abwxX z-GXFiT{wLG*3_|df8qMnO;^kC4 at _VdI1%BTy3&vIe%7fx`#LClYWA#&r%1k;tVWJB;dCy4{WLEAZe%-PBe(Wo<4XPAOnDqsI zK0c~tk@{((#UUK}UhX+NM?8j=L?N8gN<3K591uT^|A{m;l=~J*CdkO#NTf??N-EGO zOUGL7V0#$8NR)Rm5M7Fy8%wbEQAZKIR0+X{bd5*lwJJxQ#>`cFfH#*1H+_k0Ubs=lR6Vr%Sx%lkH z65pImnRbLUwd~%z#-j4AkIuY|!;m|#;ZMtfnV(>;JuE@#R>e|aQqY3vY#z5c``UT( z^H00>a<9f?Q^U*Myt$t^gj|w1RPp#NTZ*BWIrdmS`5(9A-Wr*_zvB9-b32eSPR|La z&h!f`nLM?&fPw#ZHqjo?+6)5*0>TgZKWgD>F2<(j|EYy*Si4%gIsV_{Icbjna*W0c zdpy$OV~teIS`;vx^}m%--RQ!P6ZOYJ_Pm<_6#<0&zLJ{`k0*LytI*S+5}{+5wA}6kszeJgI$hT?OK!L7FJ_9H-We1!ilCNJA|9TJtwL8E z!J9E-K3g*H5^i2_iWfVy%uqUwudZjVZDifFD2bTaB+du_rF!MZXO4G at W?FXKmJ<>J zrm0~3y!aQQj3qt~6cY?1=D1=$%zoR at 2$7{*HbR}=#kK6O5m1M21PCJv*@72IrlRP8b=M7_)nTJ}H at bYc?T)1xE(XM7t+I=bvOAq%SC zCD~Ih9!BJx7e{ALVu{VGrSP8lgaq$Vpr0t&LkJQ-l94Gq#;y;20yRFM{%c`D1eW!8 zf`fpl!T*mo)_)Y%fAG=&rKWyreEv(I7fcLes8dQas#B4zeQ{ACMsjH7Sv_@^x zLb3lz%Fu-4VclZ%UHY{>zd9E;`+LHpB2caJwf{N=f{Sz{Zfe&1wa at dm>wK?+zxDg; z^_CfALnW334n`bs91GT3ZQ^Xv+NL|LF8ku+FjTMe^4E=-o*9X`8F;nI`mCdIrolDW z!Y?RvthV8rkkiYm=~BL}aT{!|p at ChWbIP}N at oHc{@sqC0Th>XTq1}Dg#<&lT_I1;Z zJ1=8Jec!bYe4flDOQ5&M6J$eE^5I^ibZyZ)1!CLQmT^Z zu({NYRKEMh{r2?jby#itAlJamq=RwCjF zRW1lgQ99T-_eOMCt9nr(K9qu-f$sI3u{1ks*`I1$$bt!A)eavXzWUYm9Skh{@!KBh zU?#bE9dlA;Ob!FZQ%sJqc>vRu)!$&dPmqL at b`rx|7TZH5%-1Rs at zj z6C8^u_BfWjj<0 at tf=fM*n*9gnkRROt%Q}k)K9P#Gl_B zvVX&5jFRpd<|I)_k&1B1^dq03-zLJ03!Mste8 at PEa4!URbs9|RRVO at Bv0uGSl?$b! z at SQbuxLO>W&CK>qSb=~J{|3d&&KGKT0p!Q3sepYN+NR8v zyv%v8DjaKXU at wTG`9~Mj6zlX$DN8Hj# z-VYK&-I39!W at +Nr2mYu&b}u`tm4A84#0BbbSHp-yO?cPb&-6VuV)^XJ$oBOtkI_0v_iUYnB>Iarary9Ykm8!s$B^Hw_}2OuObx^Cz?x3upqv1Z>x z))nFLOYA>i at T{U|jB at L`K%Dtsu1xyoiDRyA=i at V@@`EO7P7{o)t;05^hELd*&ZI#g?i%*gA|Rq45qeAW+? z3Vgk4=y+Z8Cw!|P_h`cYRn<4YnbZ37%3Yx2G+f~|)B)Pq_0yHI{K*_ga(m?m#>)<5 zLHu at aV`#>EL4j at I`#ujjV&`1EiiY~pPajp=SMP`WE zxvIkzAI*40srfz4GdU at vFPBO+qfM!z7h<64&dvj~-awEmZlFi|8x_me;mV*CNubU} zAY$-C=RKVr%{guvfHXMEHFbhgEr%j-*F#wN*Zfg8pqEy1g}NO82sHrOC+kD z;ewA|w((0XC>TLPF4_iJ2`LDtVh*iHI_L*$Wkq&X&FO)%e;k)$(|MXXt;QO2l}#7? zE1`M%K+`C)v|?9huLV)@N43?ukJkq~YcaQ?ylfjBb84bOw^x~!Nxg6!6XoF<4P4B1 zZMT-XU|k-7=ifqz9j)9i+J6E_6Vm@^V*N**{BINMzXlM^Ef;ht48c%J_`G(|P{d&q zWRk=a8Vb8+n9)s?*h!0KmRM3_3PcM##sq;DXOEV<_x^!X&T84Rnlie^>S?KR7smw- zjcZ)p^vspLjs^X*-#1JbcYy)l=!4*I&5)oXBf(aV-Fn&bX|1Xj^99_ku%_)D)ItG~njUf|~s#pUy{@iBW@~#&d6F6M5e?qcT=fdvb5NP7AWIlFFEp;*MJeKWM*KL&1|2o22xinvbFfH{0N`5lbJ64d8M597{6(D zxL*y29O at 2%*cc63vpy3*gZA8x??+yj)A?=7j{bal)iib|UvG4=SCjdKNSupJ2| zMZRa(Jak2U3a<{Mh4!-I1YjOF+_}^QcMB|i?G$fjWi7keduD#mfx&UKlf9NFAu2w` z-l2_odS%HdW4O+dg=eXQ2PkYpQ at Xc#Lvve^KL!i;QMI*1wunZS03 z!v!xe{NtV1Amx~F0xDR_nK%@MCpc+P#tzd9;R*t3u^Xu}*@R~&LX~Ia9zra~IPH*N z#5)2W0ULK5hYcYUXB?M_UC+34+9}>RiQb&O83yue<12VERagaD5O1M11?aNh4Re0Qc8#Yul)&Q?Pb)RW*EB2`uWd8cWPE8Tq?w&eQ z5`Pv29{?ql5gpG3e0F1{wI`2cw-Ru at cN94XHS z1JVbm=?gXGeO&$cZv1cC_+z9NQjqV!&lqV83J3mIXXhOa*S5!T!AyivW}<{dADs~8 z%_uhvQHG2j1WWW1;u1YEEH^q~BADFdD$!ezM2TKvqKia^=p{xFjB5x&c+H||3#Hc;`eaMqLRT8ma%|gRiA_0e+A~&i2l2 zv0L<4Dw=h&$WHpqj-S%5klbm;7IzlKb8%4eR;<)rT1BJwmAdTO7~fIv$|q7u4J0@@PAD-ab(g5k^LIJ%QBKdxptt*0UKAE`ls?K_ zTDx(0r=ZX+dHP^?my2dGlB~rB#w}LVU>as`F60e~qRKE?-RH*=UF-9_ufmP&Ox%c7 zPaoH97I}VgU8|(u8}u5jt4gcOahd#LE&5DF!9(}$?s)tg1NJVU&b)n1S at A}LO= zD$(dnu?x~yF&>diLS(6p=u6- at gjlqsoWh~pE<%KM0ICy?3_<;t)ImYXj?Nb7`vjJA z5pcC7bOsVz`o=@0PwL0TP*v*2eswMV67x#u at w0-SrdlhN^!oWjiY>vOu*`y+b3&pf zlo03iY`bbdP<^+FWxpLEujE##pJtr1bnl?~SwGhW+dl3A!_pf1fQQz@#nN8wV z>!`$tDRFte+7)i1j~r*3pI?aLi2Dd*A3M?8xmpeM)btk at s}d=cmZ4uVcxm~ak2DSZ zds#Hs&D- at jZ%3<)HOP~4SEJ(VRfMdjTKTiGv{T`v`kCjDgnizM_ZA$pAWOvi&t4Nl zl=awWB<7m&B3`87!(0#1iZPF}w#0?^Nz2_l$ZXRBR%=jTkTZmysA8Sjqc>WT;n5q| zy--rqYt~&(O3QIbuTjzn>c?*N$rY*aj3DH&UB0 at krN<~Eks z`D5H#Yj<;yMIjWDP&a9f=hN^ASx>f0(77t%$>eu7{OqB-|DTg1v;7>(0tQf|qNfqR=p9 z*bsan2X{&){*?p_9LEhqWHY&d!{N&sPZefL;%oXA=o~MLFK9WgLH%l5$xsE0d;Q~t z#Lw+ at +~EP0f#QhVVP?Ti8n{_}6?i%?)lAAqoj7I%s!d=!gBQ499Wh=kmYr15#wF$R zMT|x#I*p5c+(ei$KQU*rQ{RXE9}Hgj)-^+!*D at Cjv~g()B1IMhHHXXo*qb8rx=Cn(@L1ff2rMEk3Z51= zPTiH%oY?gt%BhtuGyVgrfaLxe~}jcAi+pLH7SXpv@`sPcO&F3{jaJ* zoSAc@`>#L)jjaetJx*HqcQy`qctY<%>DK9mJ-SYTBqn6K&%UIWVi;?g0g{h?lj}aI zbu8q~b}R=4CcB_$HsI&-n*>+g?RW_%TW z8Py6Gqi?*^Lh*wdtzX at Iu@P%byOY~;O3e_;Y(B at MZE|RNn&332w?gy~7`PruVEg2I6{c!}0eHrc?=2LCuYN5r%r2)v=SY3WOf^7mPRV zuB={mjL}ehw})kf7I&0~U7|6(MlV}-k1N!N)Vg)T)Vz;`JgGR zmD6`nW%z~vLkgdJEh`U9;O2)AN$elF&%qRtkA!F1VS*DqjQh~i-Inm%nmeq<2B&D* zX{f_QL;w70%F*yJcvOy_0)){vN6DZKb!0IpL$r>znfXPG4v;W<$f<=rdN=>5i2YEz z<9`o3C^O6to8N&@w22PZ=^PCWPMd~CqsqyjA)RN-uY*1!Q|0v8XcvJO1aQUb66U=W$A zm%+ykDFfNS;1pH0p~nqX0olNS236Bx#}01*;lO!2Ro5a http://hg.python.org/jython/rev/fa6fad841143 changeset: 6332:fa6fad841143 parent: 6328:04ba7316b47f parent: 6331:8c4ff6487a0d user: Frank Wierzbicki date: Mon Mar 12 15:56:55 2012 -0700 summary: Updated regrtest, added json, fixed test_atexit. files: Lib/test/test_pbcvm.py | 5 +- b/.idea/libraries/extlibs.xml | 48 ++++++++++++++++++ b/.idea/libraries/jar.xml | 12 ++++ b/.idea/libraries/svnant_jars.xml | 11 ++++ b/.idea/libraries/test.xml | 14 +++++ build.xml | 2 +- extlibs/guava-11.0.2.jar | Bin extlibs/guava-r07.jar | Bin 8 files changed, 89 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_pbcvm.py b/Lib/test/test_pbcvm.py --- a/Lib/test/test_pbcvm.py +++ b/Lib/test/test_pbcvm.py @@ -53,8 +53,9 @@ # use subprocess asap 'test_types_pyc', 'test_exceptions_pyc'): - ok = runtest(test, generate=False, verbose=False, quiet=True, testdir=None, - huntrleaks=False, junit_xml=None) + test_times = [] + ok = runtest(test, False, True, test_times) + print "got", ok self.assertTrue(ok > 0) def tearDown(self): diff --git a/b/.idea/libraries/extlibs.xml b/b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/extlibs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/jar.xml b/b/.idea/libraries/jar.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/jar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/svnant_jars.xml b/b/.idea/libraries/svnant_jars.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/svnant_jars.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/test.xml b/b/.idea/libraries/test.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -190,7 +190,7 @@ - + diff --git a/extlibs/guava-11.0.2.jar b/extlibs/guava-11.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c8d5dd6f5bd5b0abf33f5b0203bdc8334e2cbf GIT binary patch literal 1648200 zc$}QO1#l!umaZ#iW>$%rp-Rlm%qpdrnN?zDW at ct)W at auivs7Yw)w?tA&GhZs`GNlBfc{-%M3e>SBxFSy4uVFF*vJ#>qO3L&yqIWVA4nA1*!=cG(DuQtr_8ps8Whbj+xYzXn3$F at hpnyKTyXN?|y$H$>Jc{vuh at jh-4jB zr6$QfV#&e-y7}wv?N^5KCNruoy)HeF{QuhqmOr%t>~}G+v10h2BVhj#VPa!rVrld* zfvkTDMEUo?-=|hK*8dXE{-=1Hzl=Aqv9vTYaQqt`)?e!Y2Bt=Tqr&`4l|I1X??hkz zXOWq;qmjKe!17T%mPL5`le^Vdv|12`Fu{LnBw>Pr>yMFoWN=*R{rhn5j1b-<4SX?0x8rMZOlH^h1)>)}m#$ln9Wy8# zDtGwA-s8QlJF^px1`F!a?GYn3I=51y1>*W at 4#JY8Z%nQ(nk(9Dm`$S?Cj+HW?WUi> zxE(*gYvsnQFMg!B;xd|U=R%};HwGpztcQ~R0R8vo|6&4);DG=FNILj7@@w0M8`b)$UvTyy ziN;GvlZQChS8hIbIzMkPc-2hL`z`TSzAqe|bRQF%z5YxGe1XNu3Tt&pc9?$6a+v0D zIjr{fdWPqR?0O^t(qY~6;tmKke;^;6xi)}dLZ7FW=KIld930k?BE8TfSO-C+jUuB- zYxwpJSc_Eyokj4p&eT{%`zD_Nl~)^m8gpPjJnu0MksT=U1k-cSI3C^?FT7GX4Q!nuMxkNyzt=2Q_pIOO=o5*Ozhi>*NR zEQ#G_m`Gld)j))!9O2 at kQA9)O at Nk6VkhG>ro){V>1^U7RMP)>#)z|qg{T-yD@ zj3qzkg4Y-?Q)X}ydY(X5F0KTfL;vJJb#E;~5;f*;4GQ9!<*A)ap*F*oSb|S-08HN(Ro;^867;i0}7GA z)jYjT6mW%g at iS*dpfZ$U at p9Kl|Nd6so%|%Dg4aEFasx&Pmqh5LUCJE&K+z2Kou*eq z{XCb3_LW at Eaj@0T={M>-CfW7*7k|v*RUr4QF z#_37>@zlAf4#d~Di0KQq_*i5OoXK(o^iOf-^eo1x)V!DlOwA6Z^E|ewQ3VTf6UVH| z3o>!qwaiewZp+7T+NMdof+P*WUJ{s^ATPXGqyg*Mj;dU2E!JN!zk|4mwy*+d8pLWU!Q!g=91s=l{0vbfIu?z{E`^pI1p{gCs{i z{%&xfV^7oEq4*OMZnkcdJghWJ5*x#%5i(p#(JoO_xV+6&8ylHImmJT?14dplK#Uj0 z`R3q(sH=l57sM$~zot8Ju>fR!Cgj3&=Lx{^vv*mSF;{C9vGx%z8~ulBa9?xoMEKj-7EEJuu(#r++sfN7wB#cO<3(|NvbN#{Dp#Ln z_y5AQ!3|!mUZCU!YqQQb?y2WW=8ymK^em1-lvNfVrIJI^T(zVuH^|K zSH}}eefMl*O7|q19{W4&t$&q>(D at C!9c|lC at yt)G4^UrRbi9Rg6f{61H>{d;HG(la7*+9hZ2Ka>(ixY+EAlt!}JfOVa=$+1DWsRtR>x zZ^4tzFg~*Mz~=NI=FUDHQQp(2qTJcWJ3!`?ceLKqnZtL=q#5eH(+5<-sU5tk1+dre zkpG^Fn!*~tqJRJa9fAS at 3H@y<`ezCvm9YN(jV-_)pl at lU3b1rC5^*&!vi)Oz at Q>`I zWMP9MfX1Wrv&9okt1N+fsf^oF?TwN*&lD9$A5}}@#m)y>wtgaJ)Ay;lES5a&3G_{2 zhzmBL=;>*j+~ewe)#0l3acUwu`+GNN$*vtp^SmAV~`)wJog^SrMve1M*c(UaSBeq=9eF%ok`cArHija77)%OHQLM6jM}M5k&%EG z#(``}vPp-a$X)$5#c(3cWgQePD at n4S2(MN<+1E{&V`m7^c5(SvR9I|;hCMMBB~h1% zEjF|Ax0AzBSXk7dy=IhTZ*9Z={78=?@g>%BXIT{5nh%Y{M{deK9{Vn(_>1fB4!oxv zo)y7fVtC?Oy|=W+TTT5n_tqs5=ixy(qx_0bQiTmW>?v{rq7FH0zJ_2&>5W>}}y?K~#cFKG{Hn z-a3kGYn%vDq`FB&+7s<~v7i=>R at yt3;|a_Q!A;jxFJQc#*+2T^aCm&Nmcqja))MF0 z%Y7s_o*(h#bH-ze`r8B8xcD>=Y9i1%C(4x)VyCw`pPe)_i3KTZbUq-Q-F*wC4I at mA zB37_&U`fXk8N{=Kb8!vTLJ%?xP_tu(O$<+HxFq=1={vrz=Q2*BYXP*gkiN){(A|DL zX>|D-2-)Jh|EI}c&BNN9FE9|$?QiV(|98j<*z21)+5_y}{&`2-#`5>cfAf~9I4;@G z|C_hL!97mMrl2)=x?-kM3hg!dEKNx2QVq~ zQU)`)C`_h!ST=%>);)mEQl`IzcKD9M>5ml0_B8lngVw{f)^#fJ)Q&sfHCSI=t}f<- z1_ at 5ya3!6+R-s at d;%|}2OMdfJSvC=rn%*=PCzM*=6Oe-qn&iWyT3UPa(+cybQn6_~ zS#}P!j1xH-%^8?!?wHdHQF~)yo>(fNh;q+NnxW_ at 3>jVg5nK+j%)HSZd$XDWzSb38B8nk1R0S!tORQXwKg7xz91{dD_3h+H7lW-VdL=O5QJx?EGo1(uX6N>$1 zh}bY7bP>0vT%1|lf|-~wws7$Wx*ils09Aw+o-VP|)BP6FQis46+pe0zv|KnvT!cu| z-U#wxiKKkd4&^9VQH(qAzYp(Wu-bCO?|xGT|oMn(ZcHi?U74MV^OAx=U4Ec^OU8zMo^H;P{6N16v0WeU{ytk z44?}&)?S=*I^#Y2UP$f?N!lT=%909gHClw0qAu*2#}eUMJzo&paT{P&l@<|FiCt8d zVyJapV^y>vX;*^Dwok6Z)x)a=HBl5|+Ug?;QH_8ByO6w+maK^6KWf|t64J3uB)jKR z+Atcb8iup%<8*D??A44eaus98m=qA{P^{P{R3G7+h)Nj%^=r#%VHBTicuq~p)(kT$ zaLQV2Lrv>iSSuatKS!K>7iCG840;jQaSghWQkV5DjaGsKJ?o;#pj0J26#9A!q99W| zd9kS863Z|+2TrsJsav!;;e<_-T>ZjnB}DN;!Io0 at uG!*i8NUY~-DEi4haRDhH3%p4 z+$|*o$=$3680n+c#Y(AXj0T5owoM-^YkmccWG9cb_{Co at tnvxvWQ zRYt9BvqeXgaH-QSHd#nCbkAy+MY?O02?7ECuKv{^nGpK%WHDWN#$TMMIv#re?uGZb zI<|;Cth~WJQnWgT2u{94`LUNeSX`xx&?%4 at r7ioE|e=+Bx~>rKp-MR!UGv1ja)CFlE7Iw zXmmJ}=E^F)oKU{~4)7lUVb|~hGb2(2Ou}H$3UFiis9%G|ARSGuR7pjkFNU`sWqA;6 zxxJ)&cXc4 at LEu7=GnVi9`C=KvcldGOSL2B5>DuYa?O{!DG7xS}06X6k*3hR)-ODCj?-9_`z zeXq#$B at tM5^F~B!WQ-VFf?hr9fPr}ccF at XR)xjme-k4)oa>g2}br6@`j$Cz&#wEeB6x5 at GOeNaPlyVf;+JKq-iqgtjQ99vg(Y_X_+3A z%2QY>WDJ!p+t=I*bE6F~l-H51m94R~>sO0G>|`b_SX?U{PKXQjGb)HfSe at me3dCHI z9CG>kPMNV6xa-pxBDG|{6lMEk{Hns%=Ih)PqHifb*=CHf>jhLPmLi`Dt-(CJp%SeY z^|Jxb&Yfh^&b}zW{94}SMlE;vsge`k@=@0Tr?O8fk?u1numjhehVwzv^$&C%47qKv z{?tz~smP`w8|YF4j_`2xTxLGW#A0KtoQ}o%mVj{$?x;PD1g1&@ws1D>Tm-I#4vmUE z>i$qjM3qz4Qa_EjxkTkUFE7_=gWQrmogmm~KYK&+C{oA8!w-11CT!-e^A3uq%JDp* z!d7LhS>#SUwJHod|GBs z<%H>tqSkC`u at +qX%y9t(#ZE8 at FD0WZ8$ zc3!pSeowRE0ar$V`IbDc+}`TUx*7L!;~USe_?%lM_d7DmO{bz8;mP0}tLIUJlG_Dn z#QdYsacy+2nMdJt47E2fNlw4A=-zT0fUu!g>^?tiz1Ehb-tV?-dJbOs}VYQp|Nef0c%FNmMw%&ujELW%`NfG`}53I}D61rKGypu~!o2m+Bv#=8Z4 zkCCe)#ch{)9GR;;GtjCxNoT*XRcs2hzG(BChfAxHSuco2YjW}|klETyvff;}oE;wX z`uxn4r8qGhm*K-FbbRdoeD|)ty1My%N6dO3g{%VVLBPA|HQ6B)e#(H#PVRyK9O z-2wGIt_Sve(l+>07#RIi8Dicw8{rT9E~37#WHCEhC}2D5#BU at XPZY=>8h(q{c~D!i zdhl=IP at mMk**xBAe)s1eHYi}*gAh+H$R9#}SG|v^IiCsJ-P_$FDKXpL+mO;Th-6R5 zZz((<)nI(SXRN_J^dt22&UR9iIl({kl79)sM&hi%W(T0Kv*$&~M7F at BuNDS&s!!5a zp4SEGEQKA5sq>_86{6cqT7QUJYfqZJfca(2II(?AP`GttW7y>kxK}AhFlJ#zvg7F+ z3dow0m7(D{P!{DWGBjS;X>H)tnW^Ixyc at Coah@f7ngu$#(_6bk3PO&Q7F6fnm2(W< zwIRdHACP3Y+avI*`RMfG|K(H?KwfN!)D*}mCayd!%+3|7;9>eLaq%Q+wB$rkPN5MP z3_!_M#k`YN6*VQDspw!J%>njZGJX5p6fYWHB%kDws$Nn~be6(Bh?WH6VTp{Aot?EN zxnMIUV-|KTA#KK_u|xEie_IwEC7chpU^6I1VMESQ&nif=wqC-3%oM5vS$^l(jQY3C zaap1P!Jr}*a5|-hhL}nC1!(azarR2XD5`ZLYT2WO21WT{vQ~_* zd#Cr}QU?WdAH}E`u*_DZ-GrKb8B6mwJe*JE?!+4}f)OoZtvQX&oE^sgjw_LugCo)) zONuL{64Ga1iAoWmg;!*Ne55%yNoPWhnG{io&ZGss{}ZdVvnKfm&MCJjFP*fx;c8k( z+SKXZeh87)D*O_PM?yVLBz`1w728-*Z3XWpT#&wOriz0b%-T=&F+CkZx3Ll<4W80N z6XrmYVq}DGDwRr-x)-6-$7ZS~r}RC=G9UpDMsCCb$y%tm;fTW0HW{IVXO%5%t_zUz z8B!KgB at UXLT(L?;6pgGFng~@;CdD)RD-OTzQ>DoXm+jrCr+7aY^J;2M_mSM3+JzDw zDD4;gpVip_g8 at Td6K&936kTOXNxLkE86RFbwC?6uB&k!dsc-#8`t;ik*u))GuYe;t z2&DX5GXxh$byCub9M(>t0Vd?r5wOaQ~K+<*e&HSg4t9g(IhgPJU!x@ zW_pvZpnA96Xacw5Puxh{?6(4DoUv(5J z55~moy_84$zon at -EaC zliJMcEJuZwni~^OpD9}zr$GGlu*%<1YN@$}W( zby`8S3lXx~!2 at QrYY1e2=BAy<1+Rr7eD-Ns=P?;#>!ezIo46hH>u_dk-{kO>-h|CI z(rTjm?xwpnQOuOw0Vlywx)oWI`8C>j(L0kPEKQVf&$~hA5!w0Bntb+2aW_b1%)@+D z10_uY4Py=qPswsMEBvjBgRf_&U{jej9gP=CGEgpi((V_x{O?(UE>lD8E*J{7`ejP#NRmM z8A?BlUVqa at vJ)SA|3<5?9fY_GjEp#z(!*uw%102l!^}NQuV&aXCaSgr(>HZM($v4h zrSq$ph=q59=)Bb5wG`1qN_e&8rn9QRR7jtdjr|)ZtF)|+zD;?K!KQ9yweA9v)57uA z)x?cMlCg88y}P1JHg=(PxPDPywR%}aW$DL*fZ$g;ojG2&+0 z*~(NXMeUHl3b&~f$Dx&*a(O9e9ob0)!3voo{ZmJXk_$L3HtESD*i*DmW?{Vfj!Jkg zFpIvEh+bDKCzK1MVXt;}JR}k_E#qIM=Pk~fG!L~6CR{(vDt4Q#Lb0|b6TWbk&nVdY z-!X-zGRhC%6hWk%R}_?+w9*PakJOofAGm1-c#4Q6 zESWo~U#`&AWnyTSn^0{~B)(Dd*|Z2%+#vX`{WGdj#F^t z*>pr?3Q2e#46qf-FvdcEC3z#;_E_mA>;-Off3`$HuulWq5O@?#;}Y(UjUQNm3-{#Tq|vJB1X#jy$U~}Kt+_V58V at d6I5IM;>)#z*+Tj%9d;SC&tx(x z*4s~ZRV*R8fTRnCC{c;#G(=to9MwBME?k?s=g8L!%m|hh&@O%2escLGgHvw)958RW z6~Ap16qY#m-6H;yr2dL7e##h4>ax^aqg$eGuBZaFVPG(%FIL1<9qfByg at g7IrvY+= z|CrTnuUSgY<7k~r{1R8>Pwd+(hq`;X)#I`Vlu~BNEG7-Z5dAT#DjXWhn%+EHq%xr< z9KBTF4P^jpQz9 at oe02qoD~>%z&$GD(2p7l;)H4dayrKp z-9lwTOL7WJi&o1iGC}5Ka!%o#A8-1)ru3AhV^Uq;WfO){(2ez!{rZnam65e`b1*d) zFfEz`#3Ukhv()JX^AY#P_=?vZwxWvoqS3kdnnU4$fXYfV=KSP_{LhrB~S*5 zB%kvyqSX=L)%k6pGy8eX)kgwW+9wOfCH{c8)56wve?))E49MP1cYj-KKZ=cB5mPC; zzDTso^en&0{7p4K*qX9*a|aKX1XbsN_RUSTfSYZy7AkSH2J%yA*F3>yt}l$Ibie>) zP7Hv>XdmMs(6$zlPc%OleUI}Gw6<%e&P3t=FN0{CA%@Ei`yw~o|51dyf52Celz&4ggS2Ux{!i>&CLtQWVcq(`bWWl(8; zNyYeP5}lhGk3sJ&{WbhmrB1xS!&~cGVFlZ=U9F{i8Z`=R{Vhuh>GW=H<_dl29priP z>K^tehXXG+)nolhxm5G#$jWy8cCVaIM0UXa6V-}eb`T>kq^IkoeT=lVCv53O?xq)N zN1`Zg&I{e$ODjuEG{NCv?d-bg{vnBRogPc;7ISNMdyeVt`pF|yM?WJfc%E6#v+DrE zFHs)H$cFnOVk=-d>Xjq-hfuHD3%rJSGku#L2V~AIi1HEX?iQ#W$j+ynkfZ8uB(pn@ zlhvzEJq=HmLey=O-tcUH@;B~=UCiF->Hf$kvXJfM9gH8o72X8;Pi$Cy)edNJ1)~th zJ}z-&a4#)J9vgK$)~f`~meCFyV0~xKPX=rIJlnze4bLoK at v1okblkh-1Vb<2nl at kV zC?|O!u9*9;Bd~+?3&P{r6qzSOdau^>w3|@wzG*Xp+DBbRL`o+XoH5RqwwEVhm9KCS|El>MJFs6(h^IR+WD!u;>rP*2 zprOzj8#VUBD*xC}yks!F zBRJ~c;nl|Oe{3F%u`E;bvk{!Vo%7578cb)ERn0uQpO+eiunw~Ipllp|p25KDXg)~c z5k`wR353=}9j&n at c^`cXSU7nL*_cGQ{ahZmwE{0d!K(-4O(N~}EIFd5U+POuIMOi* z*bB7pWKFK>~^@z}Mz55y=LH)7x zefjBL3$joOHa#ANa*mH|Pq=Tp94lDYFSzdcUA8 at _*Eej4?DAxv#yv`NHu&LRmuVY$ z9BMY%5V?+jUbSVPd88Fs7H^3`(-Kw$SzR+x&*DN8TEk*AgNLsRVKghIezI2A zdFAG%dhnQxc06Wa+q$uAr*R}DNazP}wpU3ac8y{vP9_!p at hK`Cty3AURDoS8Qxx|c zYTfB*i!)p~NP)X5F#IMqTEjnjU1b!%qp34$YZYqP(k9IOOGWUxD_ekByD|~3of6x5 zF&3`foT5K?luS;E`A0(Bj+tbTiI?oC?S)Ai-14bhPPrlAonHsSZUjCZF<1R>?55#|8EdZS|U3UWk0-}Hb0^YsQ2xh!sFGbfMcMX#sT)`xVovhic{&~+BLYf6C8*ccjm z7LhT}i;=2AKY1=qG2(+JxkQQYzxLQ1))gUHaaV)094=dnr`=vM;y<2W&%XLFXN at 4m zCK3^07E|&Ce}iGZ+ at _zl3Z)FC3~w3!auQ`+jxS`OZi-h%xR{rl)~UZat%|iP(`iyR zHB%IK5EEx!u2QOyDZePQS;}Ns2jFjI7qVRD{F3k-WNpq6^d4p0+_7{Lw5SrtbfHM8_&jl= zA;?*6eg2t04)_DZTSx%qZi8F?i-Bw}dPRt9$u=?pO-q;saT9jaG?#GD0;$s4qFEUn zE(=v3(xg4r@>EID&FvtetfKv+Ap>p`d8?8!^S#+m-ONEh2hmV3LX=9mj4amWln%kq z6eyICShDxgBFcFpLL!EvXyj4ME+Ti~VoLfrnK($@S=?&q6L=!va9uWf1+cHTGb{!! zQoTCF#~sqh at M~9E#i&-_P at bzpK7=E7AnAWVYrhEfo<3i?#$vW zLGO4Y_L>mhKih0Koqe at S{gFnDEJ7P&xU55aLiq1ciz at QPQ2mD53=9Z}=6?zGKQ?wE zm27P0`0>0Du;_H~L&l3H_~x0^df-!)zSo=wD#epYf9Fqns%yY>9-pPRB3f;p6Hc8S zK->;y{-|<<1&*tfx$=7a)q3Rhd3n|S-5ZGYnjI3<2sC_!^%_qLhZYpOQC(O>Lj|9W zO^vl5tXM at vkwqBDw}q-F9jQzf;2wiu1lFdDOonH7S7rCRA0Fa|AjIO8Jm zWebJill9oeZ3bHkL#xYR9F+^nJkuxjSUCXh3uF{`G-U7`f{^Tp>iEs;eb&_ at X?6VS zBTrhvzO19CuDW%Mocp=cJ|rBCs?qt<7ZiJGl8kSyO~-D|tWd`zjjaXmvc+yW3&h>{ z;C*Kb2vs3=F$M`(jnLN)j}dt0Q=@~4S+ft2zWsbK=ofR1M_lHRMkoG9;(Vk#1_YTe zRY7f`$)+hS{$!|b=jN`3F+7sb4GdQhf^FQ4H%QUa9YeTb4x9G$c%z#z{fCt(Bl0N- z!IEsai2Xx!zpyZN at 3716a1Fh*3h5R(zT)$%z}O&VRe3D&@*QQ3*H}#^**CRGh^8ml zI%$+p^}>Lwz_zKIz1&hFxhGff6dZ#`m|sAu-=mb;G)U%(8(@^>3vH0BE3=o<8K9R< zUhM(bCiKx)F7S1};Ga{>eJ_4Mq%0m835x7FKdKF^f=q+?1=m;!$jN1>I~pQP7}!ck}K`L$g(u_#f|V^Ov|JTGrTJ>M>llB-!1#NQ zs3 at Jfq{?8Qb~eAoxS%cDnM{WT5K`8T%CE#}u2}^gs1oFKPH$hNvRBU`J?0+uc6lxeqR0ld)F8-& zWpwn6hv?yzT#C4sX48ft>w()*(X>75OguH=njru`6 at WYmRNg|E6QbzDyaduPLr?5@ z;1sl&+7!HV at _A~ko|>CTi;RtLH;#0uMZ6_`M|XstEfy<2e<<2KUgIJA`An^QQj0zI z6_qcO}~1Df_Nq7 at NU zntux3bSiSbf4^ZZD| zpXuaw1V!*f4d7$-RFj~)w=HC40o2qg%on*tkk(Q4q*@&9aTm%zC=tHg$a8#|`awvF z0L66njV!=NQ|sY!YU;!I at akqcJDV5O)hAfP(3T>YcIl4NK&bl?XJvvUP%`SF48k1Z z6t2)9^zNBuF4skR9rQet0gA0pu!r3W#IVCDANCvl$|aeCOO5DZaLF$ke=dZf}*TDjaP( z8tHPH;mJETZ2F8}ci>RwxlxoJUwv_b!zXho5$zgx3B)kGX=n-J6&B=8tSSZ}dYyLt zCeH)U4s?ymxR%1u5gN<`k9t(Jf(^LFD z0BPE#Rr@*BsKHa*HhJ9dLLT^;%PeG!f~d9dpz*?`o|{vcuMtOpidpiEVfKIp-R7%Z z`9VW zh>B)g+~m9l3FTv&JJ^4xEVE0e3Gz2(QvU&Etp9YUb!${6Bp%r$%Q*VUKt)X`@U?_P z!FG{d;Dize^c-dm5`9eB^HA0R2G70 z at 3*%H{2n2^!K-40ll26pnjO#MDNM*H>rdVMQBEH_ina*LVzWf z{6aBeeIT-h*g3>#Py!KNjfajdoOYqYAm6JvPSrSJq$f`viiomk>8Km31{mxmi+eL& zR60MZi1UC^r$Kpp9_UbeKIDZi!#m-E^-kTh5QxOXubZVa`B|r@@*_n3<%KBHw>r{^ zS7j0_kJ->lX^U3b$!^VF~!+h#{$e^Sv?AeC~B%}u*4-idlM18!OFB at l+(c5kPX=N zCL7XQ(8pn{;~Q!MxmrXuQ!TMm7^F!}S3)F^@4IwF#nqQ$G<1&Od97xqzjx3}xE;-$r4hpl z6WfxW>F|(#rF}FJoxRod+ppf?6k80ECuy}ebowwPH7xhC!tpVUAg&@H$;^aDZ632r{na*FK?-Q+y+^_ at NsUP<9l0^2L$r<}XhGoz+f!NKT5unz2wIvn=yI3MaXf zOjUiyF at Q#G>?1a2W~_NA3fUr(*RXU2aUvI!xHQa~rU>c!bt}9%smf>k%SKlJs>>Al zGT#33K$Hw4EX%Gn7p(53(5^$%d~`lu zfgOiX`I;PP+zIR)Y7v&_J{+XGnigZM6qg^&sYvbLHN65!Z~}$T9PKd6{9-nP{FP0b zTD~;ZTXuFNuFOaB%tU@@Duaw1DmF4~JfW!219P63BSf0yH2=ly5oS?N at B0p8Ox%;7 z6yb-hqiwGOVE0&aLc^bB)_U8RcG)hxz#o2N2z at RrpinQHb+O6!O!nnZ53|&k5hEe} zMymQhK#KkUv?yx_k_4$-{`5Igy3Jd^62(SD^hDx77^+-u8+L2`{fgPD`74mnuyIhr z9xU$hJB6p*@!2;jEkLEj}+0SKm%JMOXcxVvQB`?|l%|8kW1Mk#x8!K^uV- zH2K at w;*&x at 4Jey=T`{w0I&-ersScgUY#3>AH^c;?w&pVcod at N)>uO~Ttx}ir;MU9G zEw9c&xdjWpPyxJ#E7e1_x^fC!1~pMC(d-k=!aZ_g{q%@jo%x=wmT;69tP9{^Lu$}+*wz^Awfb|Z*VbAj=>$y%R)y{?%G|S9(#A+mvYbc+ zEy<))bj8Q3%&QcBE>~fS8j%6~&9&ud^N!44Tzcj22cBEvj}lh$gDvKTWYJ)XEP*u2 zGD2sr^itQj#eVWm#v9(sK1b$+oKD6KB%zF3`HKpSr-bPiwH4}D zCVR_{BjkQ?$y>b8)O#6NN$2Z2YF_s7czXpfTRQB1E87x!5I;24Oi z!ngr^v`$6)H8zZiZ$;!{X-rUX$F#gvH|&&O5!^yft6c52 at GXYW((Xj?V at B=|=voSY z%DjV#DEYo~<|i-3kHm-mh;mn=s+CCj*Rk*f(_W+A7at{1m1M#wXpRWbXqVv z%QTDeoWyUq)s=n4m?Yu#r#^osamUU6V3O`lxrT5NNkb~tB_Lq1mSHuRm{%B6HU~k%YdTIYnlijw at Kp4o5x zj7U~uC8ft+2J2L|*Fue6SfD$*68HHt1t>DND at wEv*XX1VxseIIr}VBbQ;?R;BuL`H zzu*JbNKy}qqFjGWL^|Ht&D8UxGWzTjP?Jq~O~eb!8(NJS$3__-ufhsQIHe1l6sBuh zVPTlx$6op--av`k_3dlcmABwyt=ZdAn>KI$TqQ9y68unI)75IOh%FnxwkPM9x2G6* zP9jJV#}juse-6)(p$M!xOAOP`MEZ!V;qlzfC&=-=2h!LF*=NH1(i0SI0&H#2J6xoN zfURoMMqYO8bk9;T5hJN)39mL<%I+Doylk0$5}8re+C}}@?cB&pZFws;bx at U}GIc;} zIlK4kq_!wbL=D%6HgQqf0gKLNis58 at B21WO#Dj(?$syJ%MGT2nY5!xNGq((`R4HM3~!H6 z9YNAHRPzXp5-sSX(TSy0%aM`ypZw`Y>G3=NZ=PKL1D-hk&$$!^l0|1uqo%prR`mY_#!UFR_M8g=KsEu6v!yakfnlr%ALU-I5 z!RmX-JJN!o8W@}&Bkl6RN0$L4Foj{|(yhDk at Es?@SBVQZdg$RDIy23<*D;VksAUm2n~r_S zj(bIzu@{MaNZBNaeig?Qg-*q&=6WU=wk2?Z(^zE?E4~CBFUPp1E at 2@fJH?W1%5%2r z_7X3|=QN>61-c0dBvfj1=2B9GWC$2M1q`@ozeJD)YS&~CVHAp(JTb?P5{@eq7`GwY zTMOcvH`{V0NVNzl_A_7ZQk!Y??aF6!zA at WtzWr$@;C&1SxaK#AAHPAQ|KBc}GX8(- zrdx9J@@OBInv at BBNX5+FOiqH!LMA+Aif_XND8J9J%f9c{e6PDg(S8cR7F{!%qMoe)Kouy5`T zWR~EhnaHNSoSRF^^Obetct$Hd9mm?NrE&+s-#EOiMyR(ZixEq!DcJ=a(F!>LE_JM^ z(_YtD_S#X02HUqo#rC#tcKO5%jHN5r^dQdHBX!t^M z+QqCHatDbe9xCgd_3H at Zj}}v$+1WDep>}`6W3F%2#h;VApLYUeh;#2b^a8ozLOMCq zHRn>6r4supCzHFhBANM%par`t5h@$t_2e$Gbq_h}r}PW>x5c(uU7Q+}(~Je&!{BSU z2{IflAxtCb0+q7Y#v^0iZTIM)S^cWfEM+jL; z&Ym;4 at dvPTXof8y)|y07nC3wfArTyxLwQk=z^F36cIvp6Vm&2+NC7UU3lv1!Y3>@jAn?6L zH~l5c`IBW$1B-Yf3i&BhS3NiUX3v3WZ1r%W)=7MVb4J?4y*JH7djF0i0u;NY?WlWZ z{Sd(e_-2zeo%y|8Z_5OK;74r!&_=xB+Xu_}N4mO%$Skgkd!1$*EjGpADxtonN?k_y z<76BsNp|!k)D{AvTh7A&^_ ztw{K90`$_%n at 7DqIM}WmCoJbv%32v$0qR!mB-JK7N5sn$3noehf}P%nzbuz2-e764 zT7qFtao|Ti;i(TtKYvelzxmTl z#u6f!-7`2~^BpK^z*&Aw*L#ZM%dC;d{Ov at fw7AX{}u$xn;F$(su{ ziM$`Q at l~Dwd=&x74 at 4L}gf at GaM=ZbAT?6IgE0L+KdK`4E!cU7tKyaR)J&Z4)x!W^c=kH zy#odULikUR{O8+AO5 at h^{AfJ!Ep~Bjlm7BBbaXTFc#x;Ykdi7G=;BEr>B2 at AZAmPq zyRqjIm_N|P(I{bgeWC?7?B;HniTmP?ezrPX{+=1UKRm}SSm~two$8s-r##vhUGc8nbd;e z&YZL2mpP0XqxPwKEkFr^8H(fM8L=mCSs|IP2Wzu!JF{`&*$$~dOQ;#5`uD}3%y8lc z3Bc at kMHNMf9VIeHQUZ_wIaMe{7rN2ZbS9mYsf-n?nHm74!9h4N=RV~i?l4a_8OkG3 z`eQxTQ$mzFC+v50wY^xpvVdXa{`tVu(YsDKZTvAalz{2hOON|86S-u;J9i97!J+_f z8SSGwr$t1>XdEUwry9<+tb}K)BlTay5qaq zPd*uu7a6f~?-jAv%1kcvVO;p=iCLC0=uQIj9-Zsr_ zOj7fNNO{qnx{OxgF|U_3m&?$tQM}*YtOXr{@uHz_G69)nY^W-v_$y$H#N}z9_!POE zA>P=o-&+ks>od+I{aA+r-lT7lkh2E`2GWwi_6B{8NNv0tmUx4;qwrzi3;yvdM0a<1 zgfn+%#Uq+(#wu2mB(%Rh%KNP|7A_ObW}h#0OskAtPyCr}bbZixyjZ*X2l&6DXZ$71 zW8ok46oLE?(DNT%sTd{Q|80yEUa{-2De!@$q^3q|);1=~yjAFj`KKP9gTUP^m^Q#> zOp|`}-OP)Cyze61@~6K_N4qzJA^lE}bvv2fa-QLRIT*RI-}z;;=ZWWjJ1dM9SGs33 zHDJu+c(*vz9)%v{H?AseM!Y9XhKc?`@tN$7w&LjSw|~W?;$ED(MnB-B0B%9R%;9|; z4r%tG6!r3EL7CW>?$m8hTnq0>eC50E(qNpy><@ZrO_#_!w4f4CaVl=M7!wnba+=7= zoC#kdlB|0yt*u=rp;8l{lM!r4WfA9kl%Zmb`v#@V9}hUz%vG3PQktDMnB5>VIgv6X z2&G7_Q&&0%TjyrhjS&s2PS~g zaG85XDjcYH>?p*_ToG0Bv#&JK=m8 at d&@pkzjFULo8Lju}Kk`K-H=$nq4MID*;Nah~R15rvD&>Ivzf98q2OProcFwN0mUiZfuBNX4E*WyMclu9L z{)QZiBC2kgGFKNY9bw at vSxVI3Am&}R0$CKLzIawd;eihqj%1<*tn6H(SM~IA5rR*k zp8*kHg`VElnZK~9*tU;Hm%h)YHC-ziZ?^|q-ar!`*`bkdtcjGxqcmpu#)3n5Slw0q z3V=bzN1okZ=9o2j>EfkGkQ+?7V+s*OO}6a1%AkBl6!gavPhJ&5q7e;O>xKP{dZ$5@ z*NlTz+w at N-R?QRaL25xCu8n&NCe_E9rH#h#&7JN+jsW|Xh??`Zt9;XrDMSllhaJ at 1 znS9$;`j at KMH9O}@nibkQQ&!%(Gl!tf)RRO1+Fz&k;! zdB4o_+1!|fB6F}OCS>2TDwV5Di=_=4e0V4jCLHq@%y4N7p2mkYyuG7(HJ5p!dF#H^R2A3&LVBs z6!Qx(`E=p(a!h at -A#Bls=Is3b8dRSNjeq~s^@!GQoMeD`eKAls2!7q!YL`-*`#8z z;BT?tHF?CP44t9(iFVLpr;~{x_fU>UEK1`T(MmRj%ChBY0kaqR@{fnLBAj$a-BR16 zrR|;GE=fxy?=+P5Nah?BXZG!_0t3ZRFm3LXLg^BxFl7cOALJ%w_e>_E?$m|6D6MGMR9%*ni2a=Eg%c$%Yi3Ls z>l>I9++w+rqB at 1&Sww306#o_9C=Z|#?*Ak|K9K*uAnrd$>Xt4RD)!1Q|Ch5?c|xxL zpJFNu6QcDC>F!Iyo2*Iv6mc1fm9he~# zr at P#Bw)3^i``5!8*e>!2wTVsDYF}+2FW3h(JSMT|9%RoTp{X++c-uaoQ>ch8$EV$_ zwR4^2Ut1$3*A>>w)V&CUANlb=;*VJKY7HnU09caO8jyX1~R>gW|DrofC zw{q>;YE7MU#&a(aSAVnn`jXD_Ym=%PjLK~E at Wc@7)KzQQsKJmW#=aj6p4rrHv*p5V z{l=9h$Qr@!cY^iXP0(-Cn38|oZ0R^up`21inH=>!EdRY3V1BQS1dB*e)(I(R5iX$U zP;Lk!4y#@zHxi#6BSPTFhca-6j1IeY85jT!Q!C9EAc7D>BvVH(5_Mdln_S6EL;{=F z6V#Ei!MC-%47kfWAf{I*n^i)g9*@*zMYkG8xmW;yCIh{GChRCd5u3RZj z z3X!NvCH5{65i&9Zj(JvlgL}f&V~0Q?@&5nre>Yl&7cQ%6OK)S{S zpwu-o-pU}%$ePp}?L$dTgOx68RXp@^v;HkV>avhx_jjOPFIF0jK<$jFSj&nK^WIiH5`mqfU-GdpbH;C=ZiN-Ml_6m4lJmNq6AV4A3>Ndf0I1(S)rnU!p6y$Y|JCqp%5#o z{%@PC3Jc0snbUX*rTK==Am6NIW0lCnR_=P_8|i8#oT}IF at 0wy! zFH%P>dQukB#w?Obu>1U-%IWx?HxgcDKtN^)TeUVLz at V?cFa-BE?P|HU%XS^Cjb-oe zf%Bz97S!qa5~;kCiF&7yU|5)L$k4)~KnYmPZM~Dr18#cFWm!X~5hO#6^~#k9sHGpC z3_gUAF78CRL+T27TIg0-1eINu%aMmx+A*+X`YOPnx9AU|VoNnpTkQFHm02qYG96o$QY}q*-;#a=n$-6cQ?a#BaX9os!0x{t{0L zq&xF`A=~}Pk0t+5rr>$YOp_-qz&nUd^dctvsC0C~w;TDwNt?`&W$6dXBuH`THZ#85 zB?%9CRw4hq at +Q$tF(t_R*yq2{@o!){1NeUc81z2 at AlrY^aoK;9`S at mWI3{9erXuJ2 zpq at g=0lRwpOAC>yC{`$G!N+*HZ>BV+G~%qm7yeZ02sj92zbS at mjxdF^TOr&{PIt3E zm@$7`yu1(qH3Kw-v1U#b1}h_)u%$HE0fze_P+0|=Xi9_Ju%aEFlLnWSDASBPD2W7e zVj%d>TY>@!L%H{xyQ^>^d}V?p_>tkiV3)g-c{brTDfdwU-nrPE-AaFY at tnk^5}|;v zho=8b3d_bVH|x7&N?m*4W;6Z0+^+bTa|Kp^$0}XO2B!c(miB3ch*XB7_SPqh8(Vx< zz1Z+9bY=(LG=F?e!viYC`_t at rprBsK>( zIn!C at 0&pD7?TNcIDA&5Qu9l3NHrEp}gYkDzytrB#{mhkD)v#iuOX{tHpReRF{hI*{mur0x6_4`+MlltBCc=DDqM>Nx4Vizzuvj2?+BM(Qi(J5ZJYcG zU%`ewYlkfptkjAlO?isFNo3z4<4`_8X-wdFhFB(()JbHh3{}4Wg^S(o4y%4+0s&Dd z0Rd6{_i**^pz6|w@=;k@;y;;^(PQ?EN0fjJ7BHDGL54I818NW>AtH?E8!W*iXE1bN zMlm-8sM%U$bW{#CyP#-mx6fj0hZwB47pirvYF!!8xy{ixy8)V)wBDw>Zl-vXr zfcX86yVzfHyr+M%y{Fqwwm&>BW4yaTfMmy+8Fa$FE*mCbZhGS}+z-&GLsfBa10hJL z#Z+-=Ly0>ZFrk at _hd9VrXNn`eRW>L7+!*(~G?rDZE^MqWEKzss4q2;orrveOvUL?< zQe&n;`wNkNjwlf?)2O|2|6}=Pj_bM2 at KK@8YaRpx5Bz!kvbD3+ah%B zp7+J?{4wnN;sALB<}P^(cLq$X`xL65Dom_~iEMwghGskrnYPEdaE-F<9`;XeA1=?_ z82q3Fh0x?hj6e#c?#ijc(GpV?Eg-=g{%i^0XD68_Tg;d|-C-@&sR0`C() z$2Vvp&uGk3y-%XonmrtvNuYYyF@)GVvU)L+F^|w#c7wM6l95hO{wmCH*-xSJnSkMT zkRbF4h?Ms-^bh!nh?Ms2JzY}?RwZqAxx9XrB!y+lV z9N75E_UpPF;6hbCVshLAAj#ZZ#ki3H3dID1)-fWFtDz2r_$vq0 zd~pf at BJ2nXh|{YON#2SFy9kSD4joji at aNEXp=jwy9HG8S1=3`Vpxyf=SE5#S5$}qo zVmj2hjU*86Cyg>e^<{K8 at P6F@%o_&mtq9!$j{fXs1DAXNKlT;EMa&}yV$3WZ?s8DX zaB{H+i=YIT(Cx>%8^kjx_CSC{PqBTivy})X?AV{AY%1#cglhtsf}DMUp325XPdHcV zbI2!g;0TlGQ+kc1wt1m;*AqLXV$T>9siF>)Mbrb?Zk=H)ObK$#C-5R7)EJY64##L4 zMD)0tk;-XV+2bx<(*}y& z*fKoo=32=Va&0zabU(M(%R#hB%#K{vcYZ|(pN6hM{GYj>I*=tk|C93 zL>Z7IZ$K(TwbGR3*c=)I6lHmEw>o%D%PgYt$J{OUw at 5dk4A(4IE1FWK1|;M>?y>?l z4fyGg?z3uTz$rn`#V4H2^i1t?GJ~>cXJC*r?Y7%b0Wh;_7+etGdFyh)Uceh)acOnKPOP8x&z!LXF)CseTCjmCqh^I#R3Mg}~ z01X2_e2-U^MIHAD6nyuC2%*^HDo0442b7vH!(V at 8kY9j7IxJHlStO=a^J^ItDEF4fQQ^=)R{W at lZ3+$ zX65iQ0L at tB8tNLMp-CoZ#&EQeF2jYBh;FR#cT|8*RXQ+rge9_|1FrGOog;YAulJ2H zHFR^tZnuvUfo@*=USoy*^+w3=$HjAQlBQv1Jya=(AN at sMUg5kre-DC#NPy82twnc2uwC@ zYEdJtOt0okc}=Cd67?kE2aDhBN0)0BHd?h#pfrwXaNtG}@k}_}>YFv1pU(||RR7rM z>f6Z_5MecDiN^Bnj;TTQSqx}p_WQR5-5)ONeOWQsX&Y~<=h7NOXAXDg+>&~h?}-th zwY;X|$zOHJ3sVR~%1^{}4j>6%m*Y~T?)sEMsU5qt(UG*M489AY0cp!=x#Y_{>eBX} zjkDURihwV=&C9Ja+h#MQB(t_wvd}`EdaIat)5n0m!9T_{Zf?WqMMc{%!wqQ`r+cybNZ7@# z;g}=-bMW8J4{H at 7!D_h<7KDS712=e|Jmx}-u7Q?fMc4~3rvMJ#si}%OvRv)qVn_IB zE6VPOHSP;ZW%=3%QZG$J6mc}nlAd^;G${s at w>g>a%8et(Kl~eS9|4}mTu|g~uj0WCG8=Qi zv*);GVKe)AtUgFT)%*IZacQitxZh}o?PL9C`6)i at YMy0yjm+eJ3%l^2+#R37K^?0L zx~~Y($S9#tyHVgIypDv6(P}Lgw{)+~;No|ta2N;tY(8K=m3uw6JCIG}?b#59*gU{- zR<8s;ssk&#;BXA2e779m>OmB at u5h`7KY$4w>`y2?mAm9p|3K_d9mUn55^6iyJ4&$1 zLMthv&hkEKnYpxN;^2%maXV?|Y{;Rf;8KqiqhQBW&j{>2G|{3AR)RcBAs}pLQ(R#| zy%&O3MO7)*5|xbnzKcuoj8YjD@}n_3!(5lB^hqb#3I+0$HDjg=#SDtOM4q!$=2GQ* zQoZ5uGAoWCPieT0>>?Gw1S{ML^%C|n)xv{GQ#K&8fQoIL6Ptbn?a+5zW<1<8nU9q- zLuL5a`nw6`=7bw?rE-(5Z2U=fW{#I^rI at y65mjUI+9h+Cj&jBX;UaU3ejyd#y}XV3 zIi-n=yj7eVX;8;tLiX8BD?U4+j7xbi>rmaIb!#Y3F1@{iuAK at wTZ9E1jVi7J6N1I) zf&~rczNd=8;n7NR1;uS<2{~%o{{5AVqM{M?XwSlU%SFEr6ozH1W=0)#OlE^X#X>T9 ziJmID)i|*!6B$yf*pfFTlnqT!MB?OiiftbA!bRox76+P#v&^fD*0nWf z&Xl4qB1ic0h$hLvDNZvcuJZ+U$_x1s--&7^1tSNhnYNWxl$&Wc$nhelcrgy^ zr$!cT1!Lh2+79NT7VpTah^;GM#xrNG9#>-ONA`xf3B>4d;E)w`29wdWuo0fHWVW{7 z0{=mB%$8tx_l&Po4(DMm;Z#Qi?c6d~sD<@ZJMEQ`{<0ZA*|b92;xeu|#KV429cK{} zGLO}R1{@|XOyFGKmra#p49f)%7Mr=O=_L(CZq3Tjd(yBuznwmUb?szB-jXZ$N3QM~ zAN4qo`YE&f%}DkFuKSIAl4fp3{>NWHZ1<7xdRtECpEt|vZ#MuQ`7uV}BWgz!e(G!^ zcwats6fq;bvc1Yj_!(ZDz80&n)JnK_&~SRyUwEU;=NinL!<4_3#0J_wi~-};xm z4jch!Gw?C!Ezv9ER at 5$u1BoJF`fK<2#_Tn$uWP`M--8cIuN at 7S^p7yf?%DGJlR{Yd z;LuvCB830bpbdyju&e_7iKfV;f7Y&9yB}-K5zvELi{PB&Eio?m zlpk&+Qm7!e5eQ;4Q2De%OcQQmp*@LXUeJuPANjSOm0 at V6ad?%%elzPLL6{>nuBAKR z2d?62K*1|GoUP%Q6m#Y#sX(MRT~Z795)AEmE~_eh-`3==Dq{ai0cxdJ({9};YJA#IPQ7+AR^aKcPQKSiZfNqpCOGWHUzf2B?G z#-GS=o^%T>EB48UbgTgd)reE>T*Hk0N*32WB;K=3IT+ihm_L& z2*T8eD_PQwGH(X>=o(kyx>=ADdIU820u+@%kcuBt`BcpjaU4=HB*5aHQ6)2oe at KJ{ zf0g`_rNwG-gK?z&>Nl4(imOP$zK z`z+55uL at o5vLf$D5M~Jtwoq-k)FPbHlgXyiVK8Ed*)xAoSC{)6mSt1C)_v~@8lTU# zu4moA3D-);g){6p`CMDjl>ofu0y3by#HR_f6lQ5TUL1r+zyP0=kV0Z8Y%Gj`=;u!| zB>~Ag0pim^J!-c&)y0PcJ&z#gF=#e|ydVP4lq?_=RYR(@8?Rew55Q(+=KG-b-a(egwz+2q%ZIv z(&FZD)+^bg!?k9~Uvr5`U09rJS*hKBWIFSL^GptSN2axLQd&4uc!xas>F&SC`n86b z>rd7*)U{w$X`LOJK3VB7aBkp7-4P^(zi3%7esKQ~9r_7PvZt`7EZbGs?<#LFzOLgO zQI(+_6oekbR(;f at qqM@QsHMtN1qiXcRp&qrreSweHRz|$<6<0 z&Hsd+!rk_S>^O$RcjD}YaBzAN_5BDB&mw*v?26ZG+wWn9e#Je0$fI(B-^lfK%%|gY z+St|0yg#`~PN7StU?plyY}ZXlNx!W2=D>> zCgV90?pIDr;KWAg_h1$$5!CJ_+(wWcK3o%_gV7X2fztJQB1Z86n}}!)>eYueT?J9T zMYiajpw;V^;aX&t9x_~Y)Lak$;$CR^A+cU`Lmq99K4CkDq`fYca*yD&(Iba7KAdx$ zn2njiY`<$(dIV3rtBg0K6HS93VD3=fOje8R7E6fN`zLni?tkhF{cwHCr;^**MO($@ zrT}sC?1c8)rS%kT=wiH$4n$k=R#faJIa6eZh<{83*cP8AqMaX<`a<5#wqylT8+8K zAbS*nZd3X%ptPTjW!_+yK*uPBh!q41`Z1^6%nENmaiMc~tc*Bdbvi0%B3)QvPhxx5 z?fjOQG|Z!LO_ at ECrL=ry06-Oqp5>8h!3f1i1=Q9`z0k<~oD6ptZLe@{cYhI;Q{!Jt z%ILb0%OLLziT)&F0h81NHsqUkOwu|M4()*J=8Y1#p~|4!l9<)tF1LQY$u0Y93?a#& zIERn~qQ~y?a0g05^_d3m-qS)xM-t=p5xre=M&z%nQSG_}vI^7JF~ih6*rHV+Pb*oh z*&5LOomZC=)kqRHsM0m~X9*94xfz;A0G&SN4HruQM-)spotS6*HLYk=VtMZUrCG-y z4jq(!5;9xc_N)h%wd`wVat+iP_>wU5-ppRoA3zjJgeAd=l4Rx-yseu`OKt(44{1I8 zmnN7UAnp;*oU%R_^!IM3&adt10qZK>&g-Jv_PqX!fWNnydC&|tgJ8|KnQ^lBTS5^A zNJJXZ(x8FfB17%Jo4(WyRf5q}eKfgEwz?{%=%|~oIAE=o7tR>~W`2$Cu7 z1uC4R&q#9*Q);?XgONE|rf#JxLi33NHRMa7JlWT>+i|9Y0Zlp&F4m%` zm`DFA))=p^i#WAp>NhC_jCtd(_Gp00f5jKvaFpJpf at gU}PpiZwugHEKC%N`DB|mD5 zz0*;Asr8zySfyWUfi&uz1kSkPv$ju%4b`eyxHXO88ORRL)4mU}s+Diero#zD;jW=i zjArucr}D~==3bc0fHauLI=(c_lnu7pqc>Sb at Hg3;k)mbY*ftL8M68a#TWC!{VO`;j zeP@~Yx at Bq1&@va^DHrn5T;PQMnP|R9MOt0bU2=dG5+B!1`Lzq&W^sxF!jcn>$_u#;3EN;gkRoh^gk;>a z-~5z!F>)9uFH~`Xbw6TGXZ)MjxPW)-&v8%|KsNiWI%v^yiILQ%cDMPu$CFv7k3^@> zX*WoF9>J#`uVs9H3z0MybQlYQ4>i+><$!}UL8HX2dZGF%SLjOFFwi>_Y&IK~cVSw} z0f%mpJ{dxwC45uCTEciQ*Tk|Q5&!wtf5-cFQU4U;BaBR(7O0iKo$7T{I)AYXwQ_61 zAk~|5(ve-;s$Prpv8gpDtU(Gz4Wg!@8bz!I$fEN?Mivu(gv$fT4eF3Rsyy?IVS^u5 z{i>Y78>b_tcd3)v^8?+DdUe-<`t+J~7NgI at 9Ydv^p~XLk3O(@B5<*XgnPvz-x5*%z zDm55fwWXMg at T3jDn>D|0SlXkq4V3{UNOxeVq~sn_N4RmUNmz$v0pQZNcRw%W14CzX zMNu}84=eaSc1B&ru&u>|`(pSK<4>%iOM zh}DTw8|2;wv$y5qhhTYL at ZoLwih+|U(AZjs{?fGHt+&Y@=^fSD67 at mvxI=dhvd>3( z&E(jlwOPk>{qrvmO#~L}CD4Hb0o5V^0kQsnH&JYDU0wdIiy~|2Kq};F`G0QuFHzTY zKvhNM&8bO}q#zOi4#p#vA)f#O7iAU`G8q#R0EhU6!IeaAd3qMX!YkmQuH(4l_|@>b z3(+D_ECQINe$u9^`g|EFp`Flw>SRxvmYEL#m6*GEy6VVwzVUwPdb{44p$F24dGXZ< z4oB#46o*1LibL=Q%!F|}s#8%rws>q78TBA=d4+IjMe>OZO(Hgel$?$TP|4t;#tBo? z5^N0)4$zD0lwS|!M|%585S|IM;S$MJ{KKbL!`?Uw_sb)Rz$y*7p%x^l%g_1B36_JX zM*arcMg;RM+LGs>gOM3F?kwl1^eZT|My&sx=d#(5_^a*3OeK at mB_piaZ~Jag!wPqG zZncJHX?c_vSQu}aC07;bAqmlHr6V{$}--Zutn>@J5)gH!Uo-dyjuWz!D}VLGb}_gt^j)-oAm73oJFmzrbE7h+)c=Mv2vtWDk^qE)a2pdIe zoc*3qn*B{bx^zfBQ?1I#Js}@vOzJ{GZ;ihIG1NT at S7@MDOB&{}%6~Ruov*V>BLWTl zUBOi_mq|rqE=tWEA3kCN5MfZP=gW$_lvxniO}dbDBe#3^O{#9kIv}YZBb_qdRFnz} z#FlSVAS9dxAIZ>bd&z-xt;uVRAi-}~zMHH&{G at Kc%jCkYn?8UUQI04Ftf6)_GINV1 z%`Q9Osg-k-?(uEb88W4odk72!c}NTmVB_}{VdD=t!o?l50{@`SN{>_L&fb#d&d&yw zsqz%d635~^9A3Y0~zuyqE|RUaQh_Ls_5 zptLkfR(dE8NOqEWbl2?Rbynp&IuUTkd?%MsH1I-Byr8nm+8aBK#WH|NBx%WJnLrK7&AOm3mxz-t=nXbF6+p at -=5uBh0vZuZ4WTl}Tqu zG>Us3)=nAyi7Q4JUXSqcdMZZROkgZ@?3i(xY^A$L!DB28^V*k_mvVVQ(+lV#zC$12 zQ%n_(3ClI4 at N~CYfp{uELo^TQ5#Dr*G at b4Thf+IM@h?opWmhU&oy>-?G2lGcJQ1Jb-yzs<9XS{`Hu`t}ZnUqgm zsUe6tqzIh at hRgxpGmrR3xcg*a#+*}pmlgWG^Z46QgEq>*5b+of*wsSdP-ALo2op zE$fODa_=BeXJhb5g1^*s(@7fghM^vo z7TMvv0*}35<*$Je at 5rjH;n+SyF8ckRH!}=WIId~=qn9lO|WgLQ?*B0TBXhoEIrNpsWR~Niu61#&`SG1j6RdX z6 at gy^vm7+ajDb#OWrm<=&^RATa%Pmp>T4(#$r0Aco;bskTV>xLWHbaUB_{;wVFVF} z6gERMiSGXQX5W=4xL}njtNy<=U*y<9a#q9Li1BLdwD?IcHqRQ+v|8GwJyFcF0AvF) zqeIY?=+)DP%b2yqR6lIicj)pOokJOzmNVKJ*7%WFGZ-vU9JrW$HhLJxd8q~(+7jsd zJHTzX5ns5K)7j!r_;w|nlWUrjyeJYIzOmy-lM}||*3CI1pS*D900USPI78qbKzxsL z+_&VKKJD2K=v`a~6PIEjy~{+tA$_AQ?pswVyZ=?jqUwXTmUUQ_YnHTiSqEkRD%r>e zKnI;Z?(BM?f%q=Shv8iD{$FkmYPHmX`~U$0Vt at hy;{NZKA7xV~OG6t=FH;jSdneof z5SyuKD{HHwe!C%akmBacQbD6M)o2j at Ef%!`=u{pRS}Io-%Sv8cAvW*rj&V+oL6LNy z>)$H5;$AJDRZUaooUh)kVfY0je8W6#a0j4|4hWh}uUqRcYwff&EN_3_%`n6PWe-^a zE6PwfAk|@du*H(nQ!y2(nW3Z)_;BkDTu7O~=~#*bbCT6!Ye?h^XOKI}TG~_Il?I4{ zcm}LOI5ko`9J<*}t=BWh9;LFZq^_7yr6XEw)n{iOJ{MFz+D=eO^jLXc$6QwXx6;ls z9kea=It2xCtppAez){$)z?XuBLO7GvB~p3ottDVpqRkxba=^xqsZlreYPlV%TKgK6 z3ox>5N1~pNuhr_5tEQIt>Dt1OI_pL3(FN{y0#=E)dUp;v)Cs1lFQoj20hOvDZx%U< zboDu~AdeTyq-cN-u=c#wN$~j=;F%LWT8$>l^^6sltGL7Q&J%Ue=`fSIo{f0?A~b7V zLKpOO^(=k0d~^1rsVCd at t|<@M(uD<9J~U>z0}meiG+mnVHw7A9H^|RP_Qjjcnjt>f{AamoIqqv&~X)m-!{;0{%j?k zZVK!~eZS#SN4?p4NKb54vBUBn`3mK-B=*_^aLA!s$N07{`b5}cGfx$bphQ7hWHyJj z!MA_k!EdwO;Sa-VbP{Hw=0uoAXHXi-7#tcT%XUV?kgE~OcE&aIw*4#_&~nF2JTq_L zJdsDhS3>h*O;dezOU126=B$+7q;$f9&eNVF at _D!s>#$xmP1$X7T;5;Ru6d)7z0@^? zsMVYYelpHV*dsMpQQ&p_!P)LM#nMUWMA|4nt;ztuV9TY24W(*Q$aa4*kFtB1g;G|> zi at g(#ya#XyWvIB0mXTCQB^VRr_AhK+l;H2tjx&Xrm-9T|5 z4!9pFUS+Lpp=U1E!xIlpvn^DAe(4SpQn@(zK;8ZPi!P`Nfgcy=pWg+7|EJ#U|H>)< zoj zIiRIz-K4fbU0z-;N~fxo0$PvilfV3OLBUV(1MjCaGug$xMqy|4Xv~+F<9$7ual?7S zZ9Y9Y<^9w82c=i-b0}=)00w&c%@JS!aUg(!>a`&d=Fj3D&7amgRWSXBfv_k&pBx(B zfhha;J1%;v*VI6J=dPPcVUq3iun7<4zJtz_j)&d87Z2wUuYu zUs_feK~*fAg)ECtm{48pI0VZJAU^SZEB4XktSnjNZ-8fCTi%hsP;{sZ$VCMp10#@@ zD+U?eTdEs&1gkC91`aEB_XRB_sO5jn!3F6qCB>Rn^Tnza^YG%0eP{@%`brX at ur;+f zPE4rTXC!0q-Qw5xun-N0*kQQlRp*#Sk~xQ49Er=ZvK*ruV;`G1qg&Y4KH;#g8GW=n>)j!;M#SXBIh#wptY{epdWRnB&VS5Q9;nkwt7!<8ne5m3CC zbgt+|tmKst7WA$LROfV#tzpp$iE=lt0_D1q7^ZhbRHeoQxx_G!z!nZ=jAz2`Wsqv_ zsha4~D-XI3BrP9|K}j_oGl!d=G?ET9IE|y at x2+&W&9Rk}_E3g~b|8ujTwBPjSPamJ zmD1!g%SX<}#ZSzc^e;w>m=WyYN{?ev)Of!)KrMt{1c?n3G9y at 7($!{pwUZ=BWM*2D zqKNEBF};XLB;^!r+t3cLQQTNNg at V_7o!~A-*wn2aeCbr*?@PA_FY7iredsDHkb*3M z?Fp89DP%H~Mj8nL>}%|-%9aEdXAg5&au#wY^uETb(I>(?mqzX7m8ww(3JXyoL0i3I z5(>ar&Tvd-XX8*#jJ3=r-yQOC^8@$TlD<^1kc(iWwC_&Z)EdYLrWp-u$4ZqIKYNoy`DJJz at MfnaZ{hA?@8 zW7g&#?neFNcY%xBI%Wl>3p^-Zr>$!l(PgJo%w=ZxliX)jDR(My=Ej*7ag?n!`y;PV zWI9JjHx&EE?HMwMACjYXO~FmQzX7*sxyAu2%CAg1aoGU3u?P-2Q}_i34_<@S`Jx0UZ` zKDCC(ZPe~?I?MN4I83(s at 7kLD9_ywjNCampq2}iTg(J* zXiZpv{?6a$G*R`5uKGgqGg?(7GY|Oz-Tm{WImF_jHl)lk#n{8qXPJ~DZ5nD|8dO-1 zF at JV-eMNA3dUZ*iH-KiY1Ybv^O0dlAb!wnhro?Bosx2H7dp38sT|8#ZtEjtmCP|^> zEB&SoNnl-lNllfwq(yR4?aNk8MaknboiP^cqE(cTnw1^dG zEy|#ar8RTzr2Sfad~V~;BdWrdqK7h(ylt?=-WL;8+f+UP&M_N~PR&)dd$19(-7>2U zg87A43+K&5?j!Vnl1P)+dpK^{a|)8(6vb4 z8!&N+535NPs>Knz4;Hxd+3TR(!5=(bv2FkNC|C2OB!O^kdm74zi6q= z#Pk0)8BZ70gAo50f!FPK4brLq3%HMP(k;eHp81vL2UNs0Ny9fsO*@hXhds2FgCSg# zayi}ceG=HyNqjZGFWJ9;JfF()eDLzIjcT4ShsKM#5L;u~oi*g*-cA674pDp+LF#~A zp3Od*0Ba4274z|6YmLKRI@)WfZJ&W-G`GLKQb-i_UeMCDx764!b{(N5Dobz9SRke& zq^bIj+dGJzo=6u#aLW#Lh!&kwXf~@lH~W&0ok69psIjEWXkx7W}!)F!`Ck at B`Bx|)x%ya8M zz+>@tRu-)D?CS)k>RUrE2OIBjZ!i;sx<>2U at QL8F=yB?+CNgI^XaIP3|k3;U;QL zN#uSbixit4-1YzfWr1+r$!|EM{J*<3+Q_65nkbHtc_nx+>6g9k)yA|Nq&RV4Elq3& z?Y!r#fz{_6 at FOpfb*3jo>%;C1tfdUBNvkEBmI_UKOG|zWe7G&;K(_{Y9xh5bS&8C} z>HBMK^n-q(Uf(#jOEYB?I#;(o6l;8MDxty6rv;ll!*=nfynM5EEvN_h{4h$+jQQ&| zH?~n>df?fu9PQe&<_^s7(y?AsoU7R*tDaFW>r6*Efz_>Ea%^6LdOAj)4_a2DnAfNB z(k1yJiM}97flmu29p*#LV5lfaUlb`-1;gFmFaaPR14tW(w6q!AZ>g8j7yO#XZQelj zD5;Q?Tgy&q4H#5ZiC;7B3gK2nAKub$z%xV3&#P%deOM6Y)q&3%2~XT_XJ(NRsE+p+ ztjyW)kvCahU9ei88biD*tKFv>1B+6c=O4&?#CY_F&HLn4LuckTXvA-+^$uhO4)c;4 zO5kxUnS38%l`aYxl0ooydj5rEZqj1*l>h?)RYL#)iTw9Sri`Vt3#pQ+o2iqt>3^O4 z594}C@{Bx+BH~C-9i5FfdPP&=uzopOGnl0y>YNtRpoy_4$!On3gKsj~hOddc_MP8- zenk1*E`b1#$L(%kkY9x3wiaYf2j63znG_ktDb?WeRUUCORgPkttgJuR zCCX@~)>F)Cwt5Xb`Y&zPul-#kvln&RdR%q>my0lZC$%F_R!zq at wWbQLBYW4KwjTH| zn2}+iR_hsdVM#%z|2#)pUP#}gNfu2wYP;`?6Bd$ zn8hka1BXy4<-aDDw~_nVfU#NdrB9|vHSMN1-_n-dCx2WNRu}qzP=h;2iSo;pOB9qF zL8htdBpQLLt6E^H-2pXH*N%={V3rQiSw5RhQWr|0WZL=fB3^LWae^icPbNE z0`G at fI>jCH<(a2nIKjHEVUyqymrM9QB7q1+1k>UPWS&dlhkR3ImkQ#LUO)*!CgG39 z+69 at 8G$W1w5qjlq>*o+|z;L2;cSyBST at U6AdnjgL^`sY?rf(7j`3(Q-gE93-;FN^e zUORl}8L8+8smObdu^{N7B|_cn(atmTt<_d_Q)eE+0Q-MsThek$R=N$3EcywHGou8@}A5Ag952c z4DQdrn#)`=yYo=Mfq?dqfPjSle;$K>KLj-zn$D=IsNZ&}XOqQiz%s!RLMzw zkWdy9fwAPI4Z)%+Tr4 at W#br1h-h{ic7mY_jQYi?07Ac~dt?>$W2=Dnr2zPxDet}1v zyzX3$WbhFc<5%7{Z71A2n%8X=n;$1(`aqX`5J)znT!EO(hM8wPS;uRzGxYZcw+<0u zYmhP~ngjbKQv;^k-WlfbGdj7R&`wBycc~eUJz9sQek0&B)IHor2CAcVlF#zka;vjZ zuvoR`3anVHPm`P5cn>cou}-a{`^qTGdylF7&U*MurF>HK1-yqc99`ncDUPwKTeaOg zmhe4Lyt#|LA}L=CDg+X0>JbL!wa=z~lSvv*#4U_?AqFSSpE at CTHZ7S7^EZ0kaw>Zf zH)zGFv9H6T6*w#QLfvI#NqQG_G1>HNI=-TVdh at n(BBeTNOo{qN+ob}{)1nV3tUNtp)Z_-UN=*h;j*`~43ZJQ~$TFoD*Q_!; zZkj5=I~&f64uWJM;0r2znRM1F6AF4>9XqT9H!EkKtLez zFRF$Rs7qa}-T<_6v}`;LtSdq_N4Y|yR+6=eZ8kqyOMT;3m8M)l*@4+QrIq`IdJRfu zb64jsp34HOSoP7U&kbySu~idLs_ at io8ZMN%dCM(VZg20g-Gs~y*{ADM_sqS3grJlq zMduy5UuRDOt^7Gs~Rs1fSFdYh-sO8VDJ6bIs!mx+s at IZ`0MOy{cpf#YgQec0H3&3_1u{s2`0M!Zk z7xrnt{PsXjQgFx|xcHr%S?jDIsKYMIPgaTD)%@>KQpX)Zh%~g zEYEB*$VxWnSEMz#qA8^AapCVL8z_Q!oP*1kB%K={Ys&1aSXW%iugEh|Y+(@f3k&S# zJc0#>T2yRy-axtTt$qclompX8e~B!iac*gCo$Zln2B(<=1Zc0n^=Zq;q|xEGs6wsd z{ugKO7^K_QtcjLw+qP}nwr$(CZQHhO+qPC=RjsPt-|chyp1tph?yv8!H{UTMX3PF?S9moezX;3MSwpSqp*=_8 at Z&sUy>xN*-PGVm#%&f zP;vGd-iWv4$iC1R92fm*_0jv1d;Jkm*`baS6dx!Qc8WmSc9faGILUOAVDsE`Zb?6P z&6!)Krp*?8jJ2cbhw)!?DF)?lM6%NuVr_JP-cX5qS4T8b1~pQ4s3c1l+R=%7cc+cG z2CqbrmmXOznKx8HYHafqncm(I7fqzQi#IoErCbq_s+NU}i8;(+VWPs8r9jLUw|2$; z;0Xo7CbTq0`oC!3U#h4DiaOw zXc9 zgAI%M$8B5&5MAyhnCVKUr&ALAsUr;-R>tbeSqe!7yjpV;gma>JC{PX0g&eE!ywt4JDICN-Av3e8BUzDe{ z?e6ETgj`L at M9I9T(7fmG6O+a?hjuXtu?TNQHpc(r8Aui3{b>iFnpU17^KV(cTiL2B zhNr_2S)RQ4gb%mJggcWvFOuCEN5d`a!e-~tvfF0)l4U_eY?sI&F2i0)H8s)- at oI6C zS@{54^L$7BYF at APP@NS7$tj%VREylssA?30!0SX2yMU^j8SHOFRSxf=Q47UuOaU84{XwBJ8QQX5CDK2H~;|F{|m+VTQ5VcnzsA4 z2*P*CNZN74OA^aqAktRISbCdW0eXe(fNb(wtuvvdau!O34YYVA4X7sA5H^1>_&0D4 zu-!o+xZZ~%j+u#OfH?c{@l#moxcCiH`D;n4aJxPe-!uxydesFu}6py z3blr6!`PqS3_}{{i{vz2gR^Ap+KN15ZYe2w4$qYA@|~N9X6l2?p!w1fDK^uqwC!Yv zLWcUETGH#f!!qYM;@mVCtn9>w7RwbHS=#O{kjX at uH)~2}fgr=0!%RD%kid^4Z6SlA z-7-|>P+_I at Yt^E=n at dq-vpMt|q_aC~IKe-ECI#K+36Q3CyA0D@#e=fiX?8VPTD4@$ zLqCKj>&mFxbQyoKz*e`3=2~8nvgg*TUDFLSWMkq7Ld3dbaq(DScDrgdtf7IoIB5Zv7O#q3b&y8x7v%-j=TTl7sNq1 zQ1rU at 8kik-|BzC=ph2;`o3v+ka{FIw$uL!o}?3sLPcgILb~qT6L+ z+0T{|N2-6hzceT>h5)7% z=7isnzmp%i!YpMVrEalVn&q64epx+{mYg7-=rcYr|A9Y{wGyug=ZP2O3^lx>Z!%HF zvp+=omCkKe#v7fI5HfWkdSyB$`5hFvf(V8U!7KTVav<)hIwz3YjQ8rHyfuEdh&qFG zbQ;%sX+Vp2LoG@Z^fL$Tnpx zv4{tJ!GvegFNE|HAhT1{_`PkCVesEnb)F_jfQuk?#J9-2X<5)EWx$mm0Z-lUdGHPL zAJj`mmm1i!E7fSDhi*}`6+EMyp5Vw&cG>4ffQ1;DU5kgE8Un%Vc3>=ao_XE3%N}Rq zG(&2ucN(e)X>VIJVnES|LcaaOMkEar*7zW3_X`nFnf8x(e9<#9F z!Q~*2j|V7aPaLqF?N9uPLyoJ9PrY3{$a`` zQn*a2jNu(aDZRnq8(ukB_(!SS4CL~g=wDr0YybeX|GsC8RGCm$$Y=HQ{9MBWZVYGxO)qy}y0kYWgSM&jura#;}}K z=;whSEZ)K(X#VoSGgnPG{l$amdlH;}SiQxADsCT`KKkmuMKJgwq2li{u>GY$=zTQ! zeZ=(ps|ViqK8imA;rK)GEF0Tkc<+rBACX}EtA>1EGQs)Q574-1L&JFQr5!&~I)1ct z{fmR}@em8)qWSw#)5TakWy4S&8o~RQ4p3iu7$3nMUy8xUc<;$@fF2^j{Ly0;R;dh+ z=(uXy82+f~{gw~zuz2eSkYHPz$dM-*nWhFI%a+XDq?og(GdRJT#Aa-WvSfMIagQ== zqXov{o%1tiGY(X&iScn{vxg#d^8=}!A%gny_YO44PBhH`+c-PfnZtC>u^lz03_7{y#45$Cin){@t`(Dzp6o)r>jb|txtj9^|v_`N|OXY^K&yGp!%bHC9lME2ja2#-#%PN=b&U?%3;<-<1nX*%0YN zgt=qXDr2(b>baSdLcZ$N<-(Y&vNN8=Ba=5<5`}17Fm3~1+bF}8J})=IfU61g6N)KP zrI-HZuX>2o+JrY&L#76s5f3omx#v?HF`(xf=>h zg)e`Qawu8xz^LIpbkD at STsfn0g!I8UlE#aDeW&s;jX=yLv&Oyx!(wwC&H)VTO4G2h zfo!*MXJE_=9ma}@)(A4={JSGm(sd~=(uFUP$(_^*5 at Zu^R!o_!C}inUhL0)<@pzr| z6AwbHl8FLIWcJH;l0u6PW624*cn!Q?mG=-ii5}m``r1<7TF1qPhQ!I$P`+ad$bnEv zCi^qo0`$6WsfD4_AiOLm6a53<4NDvDV}A=74LMNfJUao24kpgmQN}_|nWnSZjH-Da zWzZ2%)vhKz;m%@i$;I_gK5J{uFHSVYnQ5}3Nu5*^1U+-Hw-A at U2?*69Wz-}bR at ZS&uy9RaEdZOsGCKAqPIl{!AE99DQ5v~(Sz_g9r3_WHEm zat}`Z&FHP~2GXvVf|-d?Q at D#S8f2(Zqcb{kAvPq;iLseHgnSC^=@iac7a?|)nWd&u1B7_n5|XILNEK z_>v`!Z26Mu39JWNYa;{dbVY#lVbrW^HVtTJYZ+z?@YbUST(hWH%dl%>Fu+R*>ly0- z>BHlr!>1SKx`hk}y$lu&nl^2K^e7s9!Lx?9U@!v(VBWB7=w&c#gJ+lytUAHi(^nVV zGrSaXZ9|)KIBlZlqbt3<$r8p=ix?&h{Tl$|6jxN?KoYUe~IXnjUzr6ndTMC9V z?-M>`CVpcv)|an8T8ow+3kuO(EIv9i^OCW-44)>8M0SxrhjA>X*;!BNdp}`TSNRO8 zFPKKEF?2|a6|dQrTGVNO<~dm5D4(3rS`|jaURSY7t;WD!tXP zO4^CK=0IBMms*`dn^-PB+{eLc`wm^OU|( zaiTtU{o9kh)urC&S_CJ0^quR{cfXRndr$Q0o#a!9G at PWxqb+h4I0_wwjzh*EW0A4M zS*A~+OQ*Y2r^g#>!S4n2S9MxCaUL!GW+xx7OOLr}D4cjC;=m^#2{`dc#)D5h6gcUm z=7*BVNGXn-hE7AKA=8oR$aUm8avV61w2XMPqZ|`S!LoyUwHo{O*R`545c9|H9g|LA zm6FUg14tzKC70xrUXn at v{HI7QDRRlF at g(6Gg~p+IU=o-ND)(Omtp<}WjVTmWreB8s zxYyu5Ub#%7KDFO!W$_HGoLg0V7xh|F5WE6uCr^rd4Vqs-0uw*fctc zM*cUU#S{`F87PhtFdU&0_FA~FEes^)-KGDIEAfA*F#l zp?3W2B|+GRZF=y8QSSy|mvb55?}9=fBsHS0PbVGNUk1w!X??)v0=ymM-!*r7cB8Y? zKOIzi at p-)k#O_eh+ at o}Ih|tR?Mk$>f|0${`BA0TcZJAI4dOH?xhAkhJYCKJK=!LpR zBa_SJa5x@~ME-vTWh73`MmfW7788r%X_EN60ThdK at H?RS*n?50Ym^K2V8jmGEex4J z#h668O}>a4ye8Y`Zbo-{;7>N~6_dh-**VE-Pt#wZ8$ty&0>OLOh13q at 9^{5=4*MiC zeTXl8ln=Wwv%ca95%m_Gx>ipZzrVd_lKBnPaLR4pZD!ITH^^!01*Shy(~r7=U+xGR zz3NO{JB?i9mWG1O&Qmnfn1R1(e_spcoTt81Tjj}5s7stsqduWd=(KDiaJ=#%{^)Iv z{cc7eVWG(kdL at 1mS#D9wu>?wHc$2%Jz{FPqEE^^=6JXB<^_?+4ZUMx+p*hm75{vM{qY zpwu?!W}{OES61|@Wb&icDVGUVp=&EZpSGiw9)WEuXdjqXQ1M<6odv|~NIy2YpbE|o zNuGN4Dj?&KPEa at 6HQcGvYA`?6ZE*z8A~W>lywhaUaR;sI26ejx%(6 at AtzJ2(HYx$Jh`C2t&|CDe3 zv}^HZo+C=zt#!gsZU5xaK2zUnoiBQ==>Wanlh%)7t0r*+onpRCpk3BM%{-$T^ub^2 z&1bOPPm)7q9;-ZESWownrV6*K4fqD|QGh)(B#q<_NH(4SoObXxM;?(4>Tvw at l#3*= z!2++Yf}J7Y!2ej_f at oh#UViny?hK%Yjzo9L6G+EB0mC zq1-x_3-+x$e5Ha}MRst)a0fh{Tt)rVrrJh at Y^AXY at vMz-|Fl5t<4GYK>m~C#xkDBG zt=qAhuFs2Ur>^@T58AQauf8J(&Zv6S`EFuy1XX4eg{j&tmg> z?7eXM?GsFEPTf0Nhj|I-3mK4ph3TeZ)dB_mkI*5G*>FFKgw#*E at UB?}O>4XTs{6c*U9wsbyE;Q3%QYoB* zzB~`SV9cjdb&>i{H|}g5#ZlWZjUe*%(Xip*z3 at ysIama38LB;rR)N~@JbjecN|Pue zoHz$_Zn92&t0I4_jGy&N;#=jyzsjs~r6CVfPHju?i`;pW!OeEVk#)H>X-r!Z9FA#=jSF5rFc1J8Ms+eN>r}3 z4l~%og6|XT4L5H+b)6L_=w!(b%t&Oy<9M;KxatfA#Q{ZOqq+P9RL2En7*mc;N>+Z% z2QcMeMMn%^G}Xe0y9tKkmJ{M%e?+o#L*06vn`a%o-WB;CBd~QO(Jey at Fi>)$wGTya23bMDJTP+2F%}e5O0S?AowtYlrP5_PuAE> zsD%6iCpnmq#lO=czLJLIDNo#8q)7Wd%7x@!?1f8qZpYVM`~zOId|t3cC6b^a&4(12 z<`ev|ihVk1Gh`$@B|dP-wh?h)mp8`}Bb~o;2M8O-hu+i^)d+uAu%Ql@e=P^D=o<0FzNsx3QJrq2Y=$gsX! z?{qpAMn)xu;2-ci6w>K*I2?|(KF-{>Ttb&XW_#apI?ui3I^ShJf83Yj0wiZB77%O( z!o^T^L@;6=LkUStW+)&GmI&#Wndl at rY6_)X&KQ(kOI+wq)>_ZEq|{}OuKfApqV8ZP zaiMuCs_Z1qmV~IKF`YokJSB5KCwUpy4k1aKbllS-{kg+o-|S6FG=EJ>Tc30yF-K+b z)oku8{~SyBOhNXivEAM>TVs%_GtX~#$$jWBl~QOfo4ol;wQVBZ|zi&xV{B&m{poOi;#@>o<*KHMJxk$5kJ?$P-u<;x&iL z+vs->txx8LXW2eo at tw=_9!{ZvSDrleswyktZqCd+W6ZX`_ob?tDpGBNwh8pM$FV-- zxMQrm7(+!3FPQ46GQwJ~7}@y%VmXS#;^B~T}gvCn%)NS)>~YZrB;=m-{!ga&5@ zLK at QwN@A7>=4ug7@#A at 69#f~;W{{R(*$Kaef7Itu-5MmQr2|#Vp+&s6oNz-z8$dTf zQfceLFVoI52_Q+ at 2};TN8!xcE1e6l$1iR#!`gYhps{Q)AKI9X_J>GQdZ5Sfdt5#w+5qYCh?6PMD7gtY1sdn24(3dPVNo zh2wchIa@;Ss9kM{h`-TJ#J2WXTZm;_h+SKThn{}UzBc8Zy_QyTp83?a#-Ygh3AQqh z(y=-mkaafX8865^0UZgESvdDvB#g{H3;qfBi_{HUM*5dk at q_%^EkXaqs{XqwZK;aw zzu2|>?B0~rrUC*ZD1suoU<;o#g at Rm}nQ at 7k(h&F)x^KCp?YxuQh!^vZ at E@wNV8xLA z0{EeLZ_6Uhd^Bv9yyt!IIL|rhdH*;jW{9{nXP2k=;uRLBUxiB$M-T!3(;) zXq6s3g->SKX)n at N4IDRE^U()sJ29lV at LRv6n7^W2O&%gzROYi)LaJ1K?(swMZUzT9 zZTxQMo^obF==l^1k;+57_Gx6P!Wb*O0>@Q!J)S at lf8ULYm6<8B85$^wgGGjKoK(Q2 z at 98Btuou%oxK>r?YLn6MKxszDaQiODTY2?wF3%!KsIJ-X3I;2Ua#Us?FEZAsT7l0R zCvWxoQ_=Z0Qkk;>J6^dlt7V)&h*h7tlF?cX3r7;KN6Kl+rSyT~=y;OO2~<3|Xc>dy zw7`JOp2GJ?nvp?7Bi|He>4m7Clfao&;tE^_YQPxT*NMKjYp|PZwcg2G#+5> zqJ?3x>_?1AKx}9TIX_!CZ*GE4JbgO9K(|Nu23h%*@h9%ZF~&#q3}+MG-=e9JX&LG5 zY{20{Z at AV(cZ}#3G|5Hkk?Sabi0W?W{U037W at SbpJb%S+9}xfcT;YFF!oOF9Rb`d` z(mvjLSx9`<5)_2518r$&H37v!wZa1!<3UiEiW(pj0=X;;30z&STIp$y4r4=kSMmevp5So!*Id{MRnWbKvY1R z4)3hu2EI3$Udj!wz`?o5?NHrql-}go-e-EH*-f at t$SChSHcyu-ZKg7S@*8ZdNdyRM z?XI5c at zt{_Pvsc~TLGj3-=3COY)>LYGZ;EfvXK=HxF|4Pt8qY87Gzoh> zQ=(ZRR1Gy|Z2iuEQQ2LQ?mC^~tqDBEvx;LTTF@*fBbVJhD$ziTz;MX|rn$3CvB_*W z%?w>xyL4rDv_F$oHaLBMrRnY>Ue7H8mc*~S!7774-x?oURR#Hd72=#3aD42w611s2 zRbNq8w%Kvj$K}Avbv2u(ByOV}2TG<)4sx`WnOs+iB72%I>>I!e9yRpqe_b8zgz zcVcXXcO-I)qW-JTt)Z&lski;N@}AN(HVHMsDr_c4B8+Lm4;j at -c_hCZW~p at N3*hdt?$nA6%`Wz5(8QUxsL$6Q;y;um2?0Vt>xn4I9Rl1GWxPb5LZp=^ zJYJeSL4GfXK(;XGAH5^1vpJnI@`1Oko$W#v}=k zacV|zrf`U-qxk$OP5Z^kaxw<2yo8}D)g02$iURQ(BLN-W17Rc6a*f_bX at 7+m$& zKM=rwyFuf>80CL7NvFo}!UYK+gzi&B5k;n?p|y1#!iXS486QHT?GTu3O1?ijpy3S& zV}je-=1k6Hr}up1)qesD#4Lp06BB@#-(~OMNLfQvx72;gnXi%9)J}FM?ba=^%WB-| z+I7007MYx10Zut!rF6 zBdenP*kW(6>@)O+$}BQjzOAg_>VagL|YgF67ygFis&oi?wF^vtF2LlmIeM|EHf zDCrGD(5L_s;H}`F`?=bE72sg_DWJ4i^q|TlO2o4XW5*=k`ZX(yOTJo z$H+|yk<&Nfij!8mZU`%)8(=NELSVoMK^BXk at v$;aK z-#hSG%U at vf(&Dro9K*#s+E-;)2GnG6rOpIt0q-WKIwm5(c+q&>>k?p}f5_3jlKdr0 zlFU*QN%H0~!aq^D`-96*LWfL2?5S!7Y@srMBkE68qKLx`?NQuXiP014ew&*7cD zY117P295j}E7(lwPsO3*4GF^v>5_o8Czv9ZUs8obPMW_Jy6fk|Zh_p^#t--OuU^!C zWzUXX1=-+h)TAuW%1K9?H&M}3sZzC@$6wVqb)TVi_~AL{VhK{Yf%jU4yO(E=-xURQ z>U9mJxX^6BI-puty)o&>CGA?VI#Pv%su at c|t3H>gBX6k~%c3n5JFDu^RPdhXg;@kBjqpMaZ}MnZH0xlV2~}TS^~-Vlg09TWn57hx{$GA;Q`Y zD5!JNy6Ag9$b?miuso%f1-l at jkE(&t1%F5Jen7B1k>LFEE_T^w at 2UXdk&P8`RmMh=tAJUvUnIHGTR^`-$rYH;#vIJGfWm zK3DkK*%DFxmoLlpxH8;YNbu_3Gy9g%+X3+es5;?qyW#bBX-tT4;EJGt0xajBpc zCBzamb_vKWO-yHh&zQJXlxI>5r(=hu$A}-otg$=d2ldR6NTmFC-TZgPo31{IzdlM_ zHy?+%h+7kFS4ldF<4}u9%3^*k#;p%(YtnN; zZf>%a6r&pRRtdG`(Q{#JdVy at G$~8bO#B-r8#U!(zX!^@;$?Z6$_$PW~{xLn=PuRKW z9G?bmu`*%IUz|BND$fWDyvBB&Qq?{sqh$wBGk}f9Jav1IvxP5x?Kta&hnHLzly2CZ z68$jz(R>=X1w9Sqd)<^0rp7ZMjk^bDcen^#!{?k(Yy83$a`nEgD9x4xwj+|YBNX;M za?LKigGA{tDWbTz7?ZJIz%=M*GQ%myFT&)xcS)G0mEhi3bMp}mh?GJJG|Hs71x{gH zLRAI2sj^24#JUR2uVi;-BS1{rR;kHXrXxO1zwxW?w5w=k_5^2JA#8b#BbJ$k4Oz8t zf74MaeB6Ri1VML2Vex9*3Typ6t085qH3jtALI?gkze^4X_MddjA|5eVn}1y(%b@>{ zJXHUAS}L2m{39px*UEoFgXk(_o1*ybnIyv+4yzMBX;v;|nIyJU*oG!ZDK{*p6e-w5 z<2RQ;+mUaYvPI+ODAK!(ZR=^!FK}&D*2cxGDMD{0E^7NntbYUj>gkq-n4BuX4eQZA z_nmXjbDqoo`k1fZ28cVHWyo@@0wmv2Y0 at ajZOchihkA~xd~EHe)UdZasc{`*No}=h?67+Lqq%C7 z(9~6zl^LW&RcXSMHH|%b(qu at 3zCt1!9VRDSDBzcziVkjF5aH%hf8Uyl`%{jG$;!&k znMP(&Skfyj at U6i!O<+|zc@))ZR!^UtmsOe-Wtss)-1yGdM|UB59MxvBJl*9E(POBl zy at qPNN&-)ghh-36WP!=%8y2Ur!(0nE${Fuzw)zZJ><}8-$(i+9ekNuuyTs^+?^G;ZfyeP#SWofCxo8=W-#bjRp{<<*V(JO{&w=bTltnc+|S zA;4|R@(q#Ci+FdWY(vNwvk(8mR6N{onnj*XYLE4x0_AJ2R!lq=ybP7pKq(0c&Y{; zR*gO;G*zBjjx|hl>XA;{LH~NFM=wyL3NXeKBDjr<;1+ibah)`2hz%=OvOD2-*g%}O zgY-W>ouLIi*OQ9BjYBqIMK;M%rQEylgiD^2Ri)h1iaBF4uxDkTBsCH`lN~*~-_S at p z-Jy-{=!jZ+U={C7o9UAGdRgFvNLpM$Hp(qb@(Xi!Mc6-c^y=vm%=Ncge&fD70Z!1> z0)*~{b1Ys^Ca3EL#i<6>;AEO)Ee4+|eP at pm#4>*}B=6GwuWA?zB at 33@I$)Kzrn9rlFcF5tAUr}7jc1>k*K$`E2GK)m!kLC$* zi7d~`;#SgKho>?iW^G91b>-b+62xUbQ_6Ly1f!spU2U*NZ3x8L2!OtJ4^%E;#9zK> z%7-)KSI-r?_{aT9wZu|~2?zjy78C$L?B92qDo%!W&Sv&bwx%Y3TmN5Ess9fLT-cAS z&bf)j&Jv0RXZS&hLVIEdQ500EL>dqTX$o{5j`wxf6W}Jc${th+5E42Mz*|JS;7k at s zsRESHuA-0)scR=~L^&Gd{O@;9T&hOA!T&sJM7x06iyaPX6m7H7YcC*d%q z{Wl`*7^I=97PkiBsX5B8&tVmkHewpf`Q5yHDCvh0G{+^vW4g at r&qoT!cVhjsB7A5W zF(KFe$Q%N>KNH?FqkcD57KXCIfT*xocGexiuCQbka at x&kIfr-tq{;x9Zsx_zD1REc z!`c>kN^9ne8QlK#-jK)$6(~`Ox#_L4R8tHeO((N8laTp at g*~1}Ah~vdcmuB zVQI8dxkr at Xu)>;O at a2$RV#YqNsB2l at 4{BB8Cwhwy^PFAQ3+-jsS0w37!%#0YLYORZ z(k$xGI**TanO>phjDs#oywOi2w=8RmpX6>KK2hJoE9`xPeXxNp`U|?~kU(SyT^LVD zrA<-|`bniba9-Cdj4_1})fLJt0nMTs7L=e=B5l6?BOiRG`CWVo3;^H?`EO53|8KPN zKQqGf|FeXuXKrhL{6zqng2g~u+IOr5IGYPBK^tyGHVWns_TGEi8{@v=buVAi7<<1ScoZ{N!_|uZTnn5 zT_#_!aMOlO^d%(x1znv7MB=&^Ff zNCFeL!%tiU*dfU<7zyfhEb?L~YO3EVHzntk7EDW*fk$bs1FNO&R(n=yy=a z7|KQ&QCoJBF7mV0z>yQy-5lp|14^v1fFN8Dlz2nbYA^GEtPEp7aGr`I1Tw5}50_%$ zu`EUulr=|LVL%YnUcj{CriMw<(;Gmj!UekON{+s+Lx#T6>oL>jB3EMjY&*#!I-w}ICq8D=^6`G1Cp5(+%FMLeGL`n0f+u$U5aXuO3C9?@4^}t;sEXbC|FaI7yr{Lr%XK zUS)uooNXG-`1NwXkkRvVf+Bu=Q$8qkX)X_ucw0dnAkbe(QkpMKaqZJ_{BGXuT9|_^WQ>&e_|zH;ipW@ zH;D(|DI7UMfHO!^C30jd3aR2CU`rjcm^#9sO2UvvlXR`B!mN%y>_e|IiA-Zdt}-Fz zxJ6fp!N2X*uay$lN{4`!6(1#fHGXWxd4!os^4f`4*cSG^tM=`qwU{=Z|2jHv7<;Jh ztb}xadX=l`^mq55lf=v>~c6BWwHG!5cr^4 zP_v{m3=H8w=>QRhimDJHK$pWlPwdjVS8G#-^h1>(Kmhjx;D>r#gM?6kLrt at pj}vFM z-`Dp4dHjVP;JpE at FuDrHqXX@L%kH!D(s+BECXmZgY7(Vm at W=H>B)3w6nmIB~j2s0$ z9B4MDN#v5y)YE9TdQTbfQRYBsJgY~c41S$*j$ zKg>OsYlO)z{6X=}k$eQs4HWN7U2x~Y|G2XvNy_F$n%i2o^mMD!y$>f(#zuZ0uNTpy z$ARhG=76y614nhYgmBTt`>fNxFfgE#bPS1b{~)b~VcBHmwADE1)jZ;LkbDBZ)UH)U z6+_CSDJblvVQlA2Ce~GqB2gMKhVJlb=b5h`SJ~b__8rB8KbTic`MXGb|92tJo+R7! z7|c1zB6{X#X6JMFPp`AP+0*)de?J%lJaY&GAM~NKNifD(Fv40Qv>|YI&4$q^8?z_H zp(1`z4S5W%+D+I4=&KORB_nlS!x1I*tEMBtp~6r)5D at 5cgX%CHbVnYyVxM9Xs`hd+ z=CsnBv(}~@B*dMCc$kqojp_i#JXvpdmKKq)zZNr#x1 at kPOB;EC`zFm&iZ$n~0y}kS zkJT-eXRcS6lbPV+8;Z2CZF%!L-Rq-~#F~MJH;1 zp=PDVxmC%kx-^O>8a!H_Cs9678nMbNl)Z#*EZ%qh6fm697N}tyqS{?SSsN;^2mF=a zlpUD5=nZGF_G at aiY=zjngyuTTuxT*qncX+9$*LLWvH~I2`EksZ#yOOiA@p zcE-yPlCrX~mf33Tgpki1v-z&Y-KU`*#k+k8^z&OlM~iNdER>sVj>EG)-ppA~hQ*&6 z`c6EA=>6H=;^4Zba_iob1OL(Q~=-QsryN_7Xm|Kk0YJ$4U8(@4Fx;L6< zQeq&+NPS6)I`peUpjOk|HjV~BC47957NpD(lzd=8kBCK`{GAaVEy;8J@ z_C)Y`mEDv+(04 at 0B&>TSZ8|L@~Z7`UY#R-9Ey70NAnq zl3C$VVna$@d{&8$LH+^djf8$tJM_l+**p#3sK^MSDYL#w>}nl0lUL3lJE|>fgmkC5 z>Qjf|Z;&5+{A7L1bPf41?Wg*RT%WH_IEqw<@E~2$XN(qn1QZ)}jgN_-CJq8I%Q6ws z!L+$)qc%>jMfegqG~#*<|3CnPB#te&T~2H`v64J6?!y|_6p z^N6r~)Rf)pHW_A1_3Y6{Ms^MzlbFF3zbIV=uUieVZat9tZXo-pBmP*>Yy?myX|G#_ z{5q;6mjGOM52(Or1*JUjGBL*Q#zVi1bYmPphH4GT5{H at s-RpR{F#lt;nd};vR%88M zk<5=df#5kgc^f1AI$C}4!|t{f{HxW#*Olhb;@;JPlbq$-qbSPSNAJ(*A3KGwj&rb5 zxmWKAOgzs5-=|#a373M0iQwC0^Ewjx=LzB4Jlqa$xxV2;t8&B?U at A=@$Gt8YoJM7Fcq&@Hb0Hk+PYY*WeIl%7u ze9DvJlo9%l_VdN&k5H`sfcyPk7jXZGmxVC!2KqG+3_3P~5A~iHfX at set!!1I9my== zL{m1BO;ji%B*`Fisc>XPQKVPk(r)os5s=S-gB%lX6e;^s=`y`&L4~=6p~#g|5|Ga% zV;wUtyuI8lITNpWbR+Vz_Y%shEb7OSkSim{Xyb+=+9*e8LoUHCRK zG^vuKHTyc-TAMw*Eu at O5P(xnzb8NPxvd(aZ7Z^}AJ$|Jrjt;bTs{_RnCQ-do z{-m-3k(5d#>Bj at aDa>dl)AncB3C>8Q;Ri+9;(J2$*uMfLJqJ`GJ~VOpW;Yj?={&e zc$w3_ib9hrQtwob)B8&{C`=yTLJx|ql2VT;#Mu+!=G^O-kS05uypkVRWCsho4DxRe zDw&P)H2FD$M*2D%#a0wY^K-_I6^-_$*gfqS=1^O*Y%k$RJt5YT3xeXql0?4TMTMXe zC}qZ9UnxsAU4^Q$2+Z|^)Tt`Os=pJ*x;cr|&2!k5nNBgNZcMIhc_h8&utvv|AI1}c z%fq}`X$^A_!v^P^I)mbL2n$JK;oLQ at xA)}EYk06?A!%%cf6FB%OXbAJo3lpWoM1}X zbX^0JUHn#r!O%4;GP|6vx|Xtfgv>~#w9iakRxzmcw>huV!T3 z6wsrtzbK*2yixV^ttCs#hAbr=d4`LvE1jJBs8k3U>vdZt%P+XJ4eP9?h^$sDRhF#~ zaUhkyff5xnrYR#8#>r|)xsqyA4Xv50YEvOGx}y&&IU%Sr<6%_6Z>7+~jkemoBI`wy zg+5Onqh&dfw6xA?P^a`wRLF2rR`d+r%_OzK=_)%&eA%UsV&(r1)(`jb#axHNi- z`nvsF$Gf0$pk%ZpE(t6F%_9$v78RbFmWqFL7Fw&x^LOGZQJUyZM*6%+qP|X**3du+wO8zm%5D8-#%;awbys=J!{{% zHzH$3yz{>|#xF-cW6UQrIRNtluPlWk(ixmW2nXMBX%ERo*wCTLQ|*B3q at S_R!QOQT ztUYoItXz0`m#}_Qv}p2JK<5uLV!<@>QxJ#5q8vy{M(k4n+e-dJYbO z at W~NOn>W)NAavw~UL(f>_D{ND_ at pBal>zIf+&ACq7i2)Y!G!*GScg*EM-Dd{PmhL8 zGs>bAy$Eu~;TvGxVWc6|4zUXJoE`GxkPziF(w~_Q+vM5e6QOVUBipF|`4NHhJ*|i# za$4PRY<3O8g(x1`H6@=KOP-(zBs-twI0o%1x=M+?!cGZAtx+EW<0hY1y|oUY-_qM- z=IbEGD`My}bZlwB0xO!b$rBW7D>p46h$SJp66>VzvT;YCJUC0Zk*SJ7StuQGS4FzC zZMzghMn%TH4X^7OdSzC)2BC}zzlPq_s7IL3PhVpgO`b}ScXsc+oTpEoXcJE at qvkZ# zov3aDN1jrd>KMv^zFnDla5vZ^{oFm`p)kP}9zD6b;XRBVXUY7t9M_%;33d4>rQT0c zBTo4&PI((GE at z6#+eJ2SYz&UN)TRXm*S*Xa-^yQMTmw}VmJBfKRym;_rX?{x2_tcj zMIMfK6`fEt$vR8Wb-}Ghyf9}rmOwL=cHk=3aFtrR$PMY-faH=z3dyP%&11E?c$*YV z at +!c7)rB-X_H#UK_=3Pm}l411~229Nug()Nj(o2E|BF7702)e zl%qS9Na2Pd2TW#yqV2%blWy at a_Q0X)FRbAkR^bJjvjhU8tI)Un^TyqU8x%j-!Gbiz zHN at D2LE9B?zv|Rd|D6jaYtGJ)Yh%wvXpJ6(r zgTLf-x)pXZx#F{)#i(;{mStZLcTT5~P4|@89lgUUhMT4rGz*Y$4VQOqAhuM>1^n-! z{If>hiraNzFsYH8TIYX1Sfp?sR_BN}g$gPbEvh7w!(W5JuW<_cuAB*Xgxr>*1QKO$ zBTb_f$V_}lv<^`_xCN9RI(RI-YB^Ua33g(Q^CjuqINSQR^|l*G(|>=R*yd*#xw41y zIe|;y~)NmoR6 at auA!SDjyuSwqAlr?t>ye&~3bwZR~<|P>{053F_ z|21Bt+E$b&OWIcUZSH;~ALom_f*CKwI9Dhv`F7 at b!GWy{C(!@%5%N34 at Yxfz_F%Yl z|0D-}Nig(v_ctLyh at yeCyuQ-;rJZ4myhQAz(&1z0$I+zqyS}??%^oU(a5Zwz(Xj6I zNhap12Tf1j`39fC4syy%&Mfil$x#!Zb@?u(i-(@RqeyHO;iQjex1c>G##@d={Si_z z!`D9Wku%Xat><=^W6UnC+Ujv~m`|-y_)vN^VaMyncK4v%EEp!n`v;QmOmK$sBC$B^Xjh{gN1M2_rU1JT`vC at W!?R z4T_$TcL8hKe1&J1RN^Z>R99t0#MQ>6fr0It6gcBf>&?%kfx>O1oDT;cn4VxN2D**9 z$vbrFCD3Q~0k7Qd8w&EMwgvfW7P3fW!7^nLqZnA(7^|=Sw`YpXx(k+1X&_&l6{0xq zJ$F?^;}PJmZ_jzcQsOL3in~RiPrd`sK$LSmMp!Ky4_kLJdB3rEDBDhbTC;ps=HLX% zmcH1e-AQ%@BTOKfn+TJ>n5T at 7rq{JP(&gkpX~~y2S^7L?-C!?4 at Gpf?Z8D)LP^8z1 zj!mueQcJbS`17acro0&%*$k?!dxw^MsHgYrazxChwj;40c>w8MY*$>64ei;b?pVghvCBsqs2B!vzeB*K=8w6e-bY0P-UQ*jPqx*&Yh9cp~Nf+ zlwnfwa)ZymmE at R%KcF4>}CwJ$lbbs51uPtSI3a)AnDU}yls6}zBx!3UE$6!tuHhyCdx1LiyUp1{Xt-y`oPpH z{{Za^_Ft=uxw?wKoNr1O6(6q+HCLj9l#h(dbD{l2RCCLJH0A zQkm#gL2ximBy!jju98MaQ>`dO0Vj*Ivx-tOmZ(tKvv3p!fxdpH8Y)gHnGB8IooYI{ zH$8ZYKhXg4)|4WR3njx?j0ovW8FE6=3KP|*0l>h`$4<+Htrgfog+)fG9du~_I;O;vYec%oH zFkbh+iC=#urwTIugaMO%9$2;oiCHrJlg6LXFz-u(C+O{+C-*A>Y8P!G^s$&O-|em7l0R6#8}M<3tl=0xI9PT+ zM3JDW=%mCds*{-&-_}spOTZLLE at qu(RAH5{- at 695#JF^iW)kHN93fsu-0bV0gC|x| zitfHfWcx={02^1z#GtU+xZtqj=ML+pGa>r?t;@SH6o)ncC&sK`KtNpo;~4*S*3G}h zxkOn{0reXif0K at OxgF zz*_{hYLS-)!xt9TP4VKb)8>9AR;m~B7t*d+6F<=<|+ zWkWV=x0=l3sc7>NGfb_FT~XP5C5=wG!fA)*157z=oAz}mI-Hj-^^cBV)0xCNbc z_iRYNihH78E+F*VNZ_2kJ6KpSHqT|vldL#W7s7BW(0it$i9c>9L4JKuHkBNP at ELQA zDD_hfPW;RWr{zO?sL{NFMxg9xOr-Ia?Je2?XvCk8Ke&xm at b*1f-0J-erU08WtZVRreS`b2 zm at KC);+TQ}0eOG}0e$;FV)9QPtuqUmIKbu)C1$4oS7&jFs?J}$e3t5Urqn7T;e1<) zLYL`h7^cOLk`0b*&_{tn?3GKG!e+?@xV4eJqxlCi_GSph2s~RB{-LH6ZD87P&*)^! zy!TfQtHsGv{x3lwRYkeMVg4>O$hr7Tw%YG0-*B3+r}lfJ8)0{c`3CnmG(!8R$b&R- zrW2~{Z*8yLjVsG2JOwYK9mWxg8ZhNn0bYpv99QGpk+%0$$`y zvZSAjTVo!*MI{1?LI(hJldWVeG3nSVQR#i$U1^!F5M|~ZV1tT!R=2H-RuK-doM at in z=M;NZx#0^N{ADKA7C?jd(H1J at sTYu-mu#&B+Tguf8&VJ3d>Yo54z78O#T=BrZ*JlI*bI5)kYaKq6`(f{uA$jgTV7-wqAB%6593 z8zCpN>7=)Vg!ZAQJI6beSqC-Ov5}agM!ikdy8^S(2n8{+xni~pHG6e-ZMpbuqe#>- z9MX$L7*E;AVJii`d4UHnk+($${P^2072U>6%l}^xX8BKqx8?sr*u2X{M-xy{f-EXl zt*Lzp@@bqn#Fl||p#ZW!&~?T_EfThF?k+P>bPDTn7z;gg8j84Af+-MpD at z?B2pSlj z>wKKUz3V=c*>r#LD?T5{TuElIpT8;PHE}={M?;Z72qzU-_OLg&5_Gm7Zg3AnLrhRn z`nds)O{AcqzpZ^WvgGa@@)1XbML%81aikwl@2lwd!L)3MsLyVfW#5Nex3rb zkBaxkdO4JCV(Q;%8rpM1kU4L+NAV&N_biU+(>BJrQ}c`CGLPdM0cmu*%t9%qOHvZJ znth@`^tbb*MX|oW`Ho1l)~@U!fq;V1fq(@6zhL~2Zneg`GnyIF*Yq_-vP~E%(pY~Y z5U~wMpd=g(83;323>h$S0A5t`bb at R~E_4?v5fw?)K`doD=65I(7*$6wMV|%8Nlf4S zVNCiepBn?Dw>NXQjLR7cYbxc6m)gAR-PMna>-GH49!J9ubniwnGFM{^*rkmL)HBfzH_4 zp#7C%{VJzc1z=&5i_EAjScM(at8%+&Tqjfklf6Z=I<>4dm?C?VOvXu+OUhZtVJ>9f z4x6u`W at n4V@scaU)38#fG(8QSix7r)w%uNbudL0A244#A4ve#@bLt5YN}d-x9ciiT zT-YJJQZ>eRDih~L)sBs*u1Pnc(b>!fZjy*yTzA@(ai4-t(00*_WCu9$)h5KGe?*X9 z3uD*OD=e$c<_HeG3K at X(FU(iTiJEn^4OSn at g7*1va-gVKmW at ZaB|Sy3=t#sF`2N&; z5nD*rtNN8t$!RjM6}ld>`|gCf?U;1MFSpWVt?v4mByh^y_|EI_q!U$%>o;6+e~IjbwueH zvoN-?<8&leCv_E1gC-GWddKzRP92~MUX7Ayx{FjgA3yDk0XYv?&S}d9_J~|nJNgMW at wooMq*R=RIZ2_BN-AamWI>&mJID~?Ga--iCztrUja0mm&cOI z`cyN;tD9>`o|ZllZ&A~FM71Y-EbRsjv(-(iu%cjHM(TW}ew(O$}UM-2ulyQggOCuV3pNp{Q5$ z#Ru51?e(sLtO+agrlL6 zhqwhoN$fQ7 at M^-2qU7Gl5{BoDkG3bigXNWrXp&nU+In5Q;_zApI#JfA6<}%-vK6(| zhtDe#ZD;P*SW_oQa6M0rU0PMQSR|g_8S5|9krg-;yl9s}mmArof3-ymgs&en^)N^- z7f-2-=CzaaJ8I$KSbMo0yGgV)F!SZ$|LH#?4L+oEuk!&-3g)PWN`Wu7rAlc=^Y z{I=R^u{+4`?3pQiMYS*2HDkrlEaTW2&>Al;7<)LdN)%F6+lN`(3-U$2ac4rnPnlq4 z$ji at uL=x5Tz*`aKHc`FmKzI%LJjF6;KJ^{ZRiqe$OW7H(f=NoNp5XgQu*Vq0awuIE zFgPdj8dk4t2E(8MdqlPMSnny(j=kP(dV+z`QyKM4Hm9=dK(< zO>8Xjt4aOe16t27#!$-@(&j`_=4Jw><$!pd-w<&(u{c{Bwk~E15(fTga_(Lx06keV zTq+ at nSSj=*SFJXrGkumP9BN|IQM!X|3xXF#%htCaLFVy=p?Pq=xL5V%F;b$oNG6=R z(oP$bODu>^ib>=)pyjxYgE7$6zcwrF*JR<Ha+AZb7NZskB)c`5lH= z7McWN+tV?W*mymE4fb4*zZX>ugh>Iy_e4X1Cz1B`p1J7{ehs!PJ%oyul1w#BEnU1= z+Xs=`C+`fRvu{}K0Pfc4+}g*j^E1SmeVSktXY=IZ(gA~&(qL2+SX~x2j#4)_CH6$u zh+ZDry5SJvb)#uJ(NNYeDN<@Y(yzaSM^MbQw`QYrm}f&LpW2z?%itJp;YE(;Bdz at w zKX-?uYIm3Q*v28lIe=vPT1m8|-eFJ<%@$5WPlUNEr7jDFz60o8$kMM^_^qkRunRV2 zIMPvdC0~+e?ONHaVK8aq6wPKNSq_kx>R_s}K=Kxv at FC6P-z71|VG at o1X2!>dxnR+N1*gI+)OKTJBnKp8!p_C=NET|`aubgt+kz&_^-#&cJn^e<$ zPBW3z at _BX6nsi79tsp{>w2^d3;D>=t6Kr`V0pO1i!wh|N7>f3Xv0C-A7~ZU{Iy z*@eBAs)brHh-82N+kN1 at qJv^LeALQHh&lRAV0xoqc)kd+yu98+fpjyHmHh4;q$FSnmL=&bXQ;G zY0Z4HQE7GwuBen6Tlyj_uR=O4iP{S(sI1G#X;L(&Ru%6~QGQvCceXz7Mq}gm$Pt1_ zz2W78H(aWk-n!LNRg_j at C61c-L>L`_H>u*TM+0u-t#TNtE+fhA3fo+7-L^%R?yS=o zgKfMKE$F8&+89H(SXoQ!o=o~rddo!z7mvy!4{Gxrg4v;@AMSRbUq$#^6Z%>zWXZ${ zd%WLT@>UVANG-m?%)hmut2Dxc#84#Bx21LSRAk=pk9lebr at iVso=U at IcN}y^FO&78 zd8+Xf{alYypx+hlP-?MJNxE9$bR8$%6dz1UEu6TDZS`s&AjCu-%?Xeox$~Gpx at VOe zA_~JQ?P{km2GbCoGL|3W!w}u-D-56{;kZ#11(5;<58E=snPPgWb2r!Ik~p+hNrd;+ za2*5W{qz;{>oQx at ftNGUly&LMzNBNG%4hs+t{5U{RcK-DmVK5JePUemkHcUzCon&q z{#&l5z{2Z3xV!bUKNWuc^7^co`*=%@>sGnLxM>gS1Ax}mrzr`jAD#l6rmgk3o= zIX?m3`+bZ#aS0Rb$2UW+MO0!oO*kVAcb5o;g+=CN^?i31fs#KWEw?Rx-z1rHNMUUa zoEvb;&&o-C*Hk`(ZVc at h4SQv62CA;t2k%3b>QF17cua3d&zHw=K1 z!DxZIgc1B=DWUgo+IY(M&VC6P2q*~@2#Dc-KA-;4l89B-v;M1vwP at EVrMt;y)#BG; zwQ&rpOWWImX4;?_ at tS~g}9Dx_sy5s90r^)&b4UV9uWve7Rn%_62=yfbfhut at rG0BTIv2p0E)!GdSF at 4#IVxme+^U z6*wE|*Z2`sG5goL*37$;AcbqXR$dXlqP!YKXSzUkoa>dP30O9(a#XL_Ld<42$)3$O zn3a#P&{=TG?}BDZ7Cl3*QJ|PAD=g~!8#R%*W})TP^$Qn%z;6Lo&bOr9J7qFvg at sca z;4O5Ah1u<5Zvx2AT5=C5Vj$0ZZ at c+sO6^phJ(w|(bg!1ofJ^!7L ze|T6mUo>#l&^`&EWwA=>Now30N`kPGN*iigS|h1I=83>ys8cG3jj#+i#${zGny(3- ze0R@#SHW9cfvsk5mkd65-+7nbD3TNU!0K~A?T>rju0O7OcDtV7{Xg#C2!S3Adod^- zl!sjBz>7sa3?rBlF&usb!1>Rv6hNc}8FkQGz;4h+qN?6PZr#;B>c$Qxc=IP zyibop?*t=>I^)s-l~V4KDkCr1OmPq0naX_v6;fB^u&i=(OLgAh(Or(Iy(>0K)rBRQ z$w*x*-D$F)j=AQ4Dk-s*@SiawySY+z>@~<(Kcdme<7vAi7`xK5vzr}R;hwz}##o)W zEC61Sip3~s?E%Lo#bLg!F)>fjQT;2#~aJ7wz8Ea+SpAUqzdqTYlLLH znEqXv?RX&f=xbla23&xiQ!7%*lM5FuTn at jJK%vAn>?W#Mo5vb;(zJX*8w*Fq^uT4r zZ1U*mWVYIGDHIi~$GQ>NbZ|T2#wlXjB5W1Um_Qh;P3gjnbjo|R^;;4x8Fjl^z-x$} zzDVk~4w~)}MTOL}h|El7C)@kc^j|t`C(~Al3rePrUaF_h%$IlR5u1TU8)});0 at KLU z;@v(b9c`g!!Xw^Aw29MZlM`TfV(8mv@&^f-lTOZ*SSW$LHAw>gHqv%9jVm0;bvA1TzQ3M7?K?D+Ss0EU5xO)>E z7<*G3IIk0L(0kM7!hn9av1 at M(0 at XfO2iTJh-P8p9BJ+vYf)?D9I6y74QK3n1$r at Rv z7-SO;;}MI at Aa3&?;0~*znbYg at gcdx+tbNzuiR#KCdk^CdTWKLSDL0T-t6ZCWDrMD{ zKJ;kZZ#P2DJb&Yfi-UiNcR`H%Jvx#^`mqF-5+fZ+f)Kkn99c_fQq|^9@@0k^jUXXo z_Mz%d$rk>S#8N{;iCUUEcBZEhR>>3L5>VM|$_Z-#)2+?{k<& zu)eS$a2oen;tDP02kiOg!VegwiItd at p!elG3W#cJa{ktrGUd=4!Ayv|+({2>8>@>@a6)}Z=gc-b z>nW=txDC6X2{yxWTtaE~3_84;y1b&+$hh`s0$V|Dkc(0{9gm$tHy~D3Oq(Z}E%->1 zvUH#hgwtb3bM5foBac07>`Ll1>}nD45mI=z;^ZNv1+aW-qDS}w>^3k5 at eu+{hsPKfDw?7~x*Q at H33Uh%#2=TA$Rhd>2{&a44DgKYq`;8s=z4thp2iTL;E94nVUf zO@|!wMU3TjzzXJQMlxeSTm?kK6Y4^tpC*4&Kg{np&Hs4 at 7SE1GA2ic=l0wTxZ;YMZ|n}8 zxO0mEQW|xaA214knAQ;p*yD$-D>J$WY1JKCnWtCaG|pa$xPrCxvLoP~MW2lvlWP=! zaVtEkW?Qs9;QF$F8i_FV^yiI&j71n$7RRIJwPayNAuoT4Q5NO at X0?3qvJH@#Yp`i| z1D^h|H*x=HWT5Js0w=eDTgG%XWyPki at I%M4CJsiFw&G##w5);o%RcAthFLEr0~?+{ z$_wvLHN*dZTv_Fe97F-;=4MW2b|z+I>P9xMX8-*C4R0T`9AuIY53 z3}VF%ru`ElG z=6UYcDE6Dm{@AcE`q+0|@e|ZrvUU`npBjVE6xRtPpqW5<@MjZpcLqfTc+J-AYfkhPbfuhSd}SFkTBDGn=`D}?1& zW6n{F(0cm(kvA7h{Mmw6a+=mwacmVL`6M=~`QIoZc)x7!v6#w*JgwNZ at vVw4ifQ%| zA1z!!vx-3%{Gb_-#C`;lvsC6cm|4nM;C8ZsQaRJspR)`8Ehr}Z5)RdWf?^2z?=CU< zm!SMZ?h|yM1 at 2?0)~dJZj{>iPyOU!O;X}FNcrC{>Wl~pz`G`9D z762R!_jLPAe3aDh;CK<%k4AF{3wJKvyQBuc8P@HF?` zzdVIw3#z8vgS*zZ^#v1P5Tfiv^PQ6gpTLFY72~i%9Xn;x;_ZilHNqZ(p9-AQD$fHx zA94~JtZ(eK=-E-3MQ0^JSL at rB9U|6d+kKyaFH3WTx3Jz;V8If zaYku1c@(LOlM7*Kvb2TZ->wM-{(U9M4h{q)01pJj@$bU!O!hCam$G%R`Ns|&4couY zKk~D?Zv=F%QKYN{3HJ$Y7MDa=mdMd63ekkpR0KBn*4wt79hh_4aB#gN7*ri%3XY}w z1z_vw;3|*7A-r4+I&oZ-CAJ9d!- at k&|NxZQGOD{SN zSqSr_6RjVMn;29E3x!HsUn1+KL{g&ry|f%v2pgdlSPnQ{EsLdg9mlZD?<~|+38QH( zMa)%^E&{31sxhQ;8&(GIA4v@=)yR)7D#t;P;}^frC6FyTDq1!b^M at T?x2JhJX?1h1 at -+P zTg9Xm2_WP-I8Ylv-K%V)m)V z#}y2Mh!5FhdGwck!@Isp6o!_Vu0ookGSkR(Q;m!=OnH;`IMc&I3G1TvSOTt*Zw_x1(jfXAG4G*aJm$eEGq`zKUM)@#kB1w%h&nsjKwkPvu>HPqTNR zCHGDqRKy{-*|ryeB&iFi(XFpaB}!Km<3tyKn(Gi2E%ci|-7#Neqp9smke$}K!->KZ zyVRebhJS;EjW?c6+zujpdGq}Q&fnEJDVvwx1%^xVO{j)^fM4WH?1WF;XbDSO>cau4 z=w}C0;qPY;QRXjT53!%m0t&O-lCvQa5K{DsP`^daLm at QjdIsY^P`N~=9rl1bg1>%)w_JZgs>Qq1$SnF^(rws|JIwK^m+4FgY zlsr+sh=AK7pEkmuM~6$^74N-#={d3|{i2 at zMe!r|9bq;-h!Y8}8o~->ZJY+3%&`GM zYO5gEU26O(0dtoZoXm3D&C4_XFr=ufqcZP=DKJ?yGy1%c+kLs>oJNDC?6y*4#cY8p zJujtKjE-q5s+L|exnf{5v&J at QxSs9jGsMxvj8OT^=s2oOkMKtSv;|ISbQnfC%NA+gt`3Q1fCY##QOA<2O_i;R}R`#MA*(N+so;4j|(dA znRi66Pliy)_-X_!NaGWR%#ZJ802C?`66u7ewvDU6MJ%dzmj7wXx%WPo(XsdKZL$tH zrym}jv80bFSr`U0*|di)O$*%_^820>Ox<2oy}sIQ*4k8+2R}GGCaQ-BALdYFMxQc> zMyO{jvH7iQJaLc1;&UIBPS`e$fnLve_70m!qj{^%;6+EyH~ora%ImBeco>Z=22MVw z_+|L2QO4|xi>;q-$$T5#w$AP|ES-8gW*!QJGkllhjBL4X9Y49~qtnN2cscm#qGu+e z#ZUY`RT8~Is5wrmp~+xNr_;Tz)UIo>sxUD5x#b2cacij`16f&5-^-hvZ|qw9jIh>X zpS-Mz^&#-S`Gs at w3Nxu0fycZ9-=5lxG{k zgro~pMSL{3c#ZyVXs2Ob%FW72wum?#v|?}Sa=M?h&yKqm*}!#!GE zstg^;d9n(B*t;CMTV5i{HVBHGvsd~-sC?eg?jzB7_z7WsluKig- at p{AVJQ1xFwW5k zF{*ISYf^loE5mE`)vz0bm|Ygt}C-;PsCOS%921dOqit(3IL4tC}!+tvBjQY}$PdGuxQy+X8qN7Uw z{Rn6xfASdAKMG$P=HFe>`yW|G#oo!q%=G_B^rilXD{u5m#jC(9H9G*kqg)cufrbVQ zs1f=mLSau at z{>wn9AVuqQOpUVFFwm;wK#r17HqO` z^Z$CeMeRdV7goFx%_swwjeg8zVjY+Yn+xJL%7bNPlqCtk1TF^g7~fN{3NtUmY87u~ zg*=yF*KcI!?*(Xc?CNR6qpZS-JHzcXcT8eyvu5 at 0rXaYtr>eQTM7fwwbyuFK%Aopk zp0+%-kccRRHdJ3-IY#4p_Ih~~vr<)s_184lVnpXq%$VIB8+HGYX}P20{A}=6F1aUH zTxOWzRskq*)0M*-0x7CNjkaM4fYVW2 at vvX(aC!?@OwC-$JAhE%te>2*8kW?Sb-Usi z$5V6zoj2iav&d;@4FCr`;KMYi!s$Vqn#xQuj$!iSfz%Pky8Y!$CIfJ!B*w_|u at Qli zK!C8!k!#99(;kU_CjC`xu=**cO~c6f?6Pw!eGdbJZS<$&uRD4c(N7h8h%?&afPD<# zA3+a4V%0t7#CI&7&mgH9b{cN$IWKvE-=se%nv>z@={#60Z>x)fU#Tq^c;?|#dI+}2 zYi|bHDb15tW%O0nyA<-;E`KMUhzPzcF7d;{iEW1uHh z`DS_gBmVWZqyK-S@{;HWTPtmC^e?z znlxH$`Xl7Mm%wSWuziD#WGtFt9rG=&Pweu-S#wuVGe4MIS2fDo4vmvy7#w#vR@$*3 z%pqkz#~3g9ryGpkQWWoe5ZU#dmS7(U!E10z`Vd&w*Wc{YV)h|xCx1%nia!&M;@?lU z|NOG_ALm~n`DSyu<#e)rK!wyPOKan`8Pfa~SA$j)6P7zGP`k#paMZJPOBAHJtrG$v z=DGoWW{v>07^+T&O+d5pba#84&Tiv9tP>RU2d)p6V6f7(?i=~wUTUxlgGAs#;K16F zVc- at 1d4>y#h;0=sC3GSjtGJZhwLNh91Dp8$H zin?&ibc}~rT!`+D^jna|`?Y4^5eo=skz6Pg&E7p zO8Y2*uT6?PMaYe%nCf*lP9gPF0mOUN6Km6}LSe=^s8)dha6%QP~2bOzxo9VCT<=P!+xn?)uw0Q9$C*CH-4JGGAEx=R7bkPwoSeu zTrb!dp+7;v(k0f#$+fq>&`zs-{q0or at SNGgQ4k;?Oh_Ogo_~+Zf4A3**||6Y%>E0X z-2cqVi<@?v;4rE;Fy*u<%34Bwu;^sEa0O$a=|iI>_>)Oj@=e<$KD2V8F%;)bgnzlD z0h3`u*)GSIncP2|Gg-U*KmER-4N;<%hL{;3Ng?1-oibE!=)wR~R2i|~5+}IwCig>w z(qZ(OEyGJ|Fx#i2OGmMjIzaE|*edhPaIFd4!$vi)Z($r)@WQ)fTD2<1M$dHhQ(_8{#IkY8(n3U%ZST7+Y%+dEU4th2HKv((-osr~ zxB>a~$6vFAq=^P5T})^p_-oK#IlAj)F+UuM?lim0wS`sCim+%wFio{0hX_b{KCnB- zPo7-5MI0t!IXx$iBBgbjgnceqiZq&5tYTQ2xJ=UUlxnz+Z+`!(y?lJ#dc5B1rfZ*+ zIY?-QP-#>=7o&V&U*~uji1{V_C at ry|cDFUdkz3f%;V#6T>~$CwRSol0bcR7!=HbiP zK(FL_ at 3WlrGj1X)P6n0d1D(=78m6D4y^RqDrx9yqE>s^L|8yxKq}B+C8oaJz()XPz zW3 at hj6OI%!@{%jns)J599+P8|MN)=~R>D(1E$9dy;1OihiE{OTB63Xe(|XV_R7hGjJ{&JVEI)dEB_3=h%H(YXsH#$@qpC4V7Lf0*AIupLc-)%qk=u1=DV ziu_x{UhVr2m|)tVSAf1y#{B`gz&J7tvmdLVJ$-&+&FEG7klC80R38ovtqv&h2h0rL$Y%xHQ5trqw9<@)Nta3fA1Kd-xA~S{wa>|;QvR((f`f#_^&>d z3hrNhDt)(PEF3z+)sS7o*kUyyY`>YsC~BYNQ3A$;>bx_Px!iw5iVEuS}Aj({q;~ zgTITh_|?pzYBJS=#$B|)tXCHXG752vdz?UQ?8{RmfQm4v-23f$PC at X^f?&h{I2i3EflS+ ztX)CNmeiFgeQmKTi3fOCkYv?pN7-tp^e~Q zLJ5=#F7w;Gm|xh}x;a>b1H%(z^{L%cC5)XL&zVwew!`Hp(iN-~q`jip<`6|nkE9R$ z at N*Rha)rNby+m1BFdXI6QJ%Ril8rCD{cO~3^u!rh?AR at 1YgVddRh`DHwRpD&)YqI)44oT zmZd^oaz-|GIHXgP$Nj>8 at LC$#aisJnC_QDX6=b&(K~DiCJ=X|HOCR7b{S@ z*v?Qc^IpPqQ{M at uw}SiJ-QyR?tX(EaIM~)sbNeM=)-7`d-4eO~H}g;w{fL+UpY{3< z90-W}|9wL8{O1A4e|hkPus&PM=5VUhf9pFYYifBhx)GzXgClG at Yzefgjaz(MaJ zFyQ!1B~we1{6dK}%JFYzw_tn#IU)d-@?{E4nl97Qw{oUnI^oyX zIHY}wC(8}h`Q at _W2cx5=lY(b)pDo!bN}+8DF137oAo5TG1t5F|E4Sh$l+bXuggz2Np)l9O%72#GLzw^3$DsdCwJ_k%tA8M^ zrlYc{j`SH~V-vF|l!XNaJ(t4K3zk#dhSt?QBqT#5)WJpGBOB^_5HXe{feGU&o&SdT z3i-M*lR{x at o;5o4AmQ3c3q9P(pRt4}adLUR{^9mRFW>+38Ljt3Z<4!>+GO%~q5^xBnzN{@4B-JqO`R=m2AfpaCR6k}7`Y|1?3f+x3asBg z(@a)bV~eeJrw{XNN)7jIYO{daY`OnM+B=75+Am$AF`qc;*tV^XZQHhO+vwP~ttWQJ zw%I`^osLfLJ$ui5-#asBzt=hc-hbZLT2;SVRjZ0wqR*x8A+zchevxGNTix>+-1d=9 z?`!l43~kP0S%Z|D03G#jCn!3js%Z5x&8k8N#u=H!8%Zt|7S}0t*Y0V=;vWI%g%uZ7 z{Io{I+w7-xP~VzDB_}H2plU9Rmn(1KTw=Z at Iogj@ATy1)e!CAtc`cMaN3iEiI{TfR zsJq~1l+HHN)B(n+5Gnt(Vww$KB~F9)(BOpUanjn$&OX^&S884Kv1IFVS7*!BRl6dl z)v5~DQFfs=mu1`HBO~rzF-MR)BrQ`U;fS}F1-h}_^s`O&?=4H;~gAW6X`aV z?nryBWfiSIReybhGAi6nw#bl7B#0Uz>jbT~bZx{^nAwwVb*~bIN5J-n_j1#G<3l60nD!QeKJ=7bmYWJ^dS^Y<|$kBBPIjOf|K7 z_LN2bDH9RSOlw6NzPAgLeoWNtaFHX1s;zs!t<^=_Z^LAL(MFU}oKE=}4^jXluBaHS zbjP0<_jcRPI0(QNF}GS`+4j{hh%`lm*;sw)j_+<`ks;{V1H4kYLuUE{atFA+Q^@wp zk1AiJhCDMakj-)@h3PX-l)C4mEVAmNT&I4uBrL8?NVWG!E$P$icf#sqqoO_5ArwRq zbh|_@#A_DzpTa*0B)RACEr^`t)f0&uRB at a3$aLpR zQY?BBG~S?U(DNT?DCNl2hl3>vIZP-S|n$J)$`5OLjh?{%Q#2D#NfNxq}Y1V=6;b6_OGi` z!t0LT$@swuXH+GJl6t9bldk-H_qvzgScdb9Jx-~O8MXN~<-A5i_zr&|6L$6;c8GPK z at Er=}+5U7gWJf#FBEpsnOxO$j;WU|&s_9DpjGECjhq7C!a-{GmMdXkA9F=5%JkdMJ zJLqvFB6>W=FqC=A)!b4H`uJV*D8F`$+F!63d(vAn88vSo z0D684aRdwc(g-{5335aN*^LLrLI7g4tqF3}9K;Pa#24}M0q)Rp|Nd_Eiy*W7sdIa9 zd;Rk`-rkc-Cex!Ie!TN#@inS at oaB!1zeg$CXgVv}Ke;y+;%~_+{~F0mQ~8&Nc+-8| zeNee|C&+lPjYuXAi2 at l_goybITjBYuEB54pd)Yd?)MpwQRx#2CNI>e{v~py6TpUuj z%L#A$t?tQb{jDHK%Y0Mf$OD*j1x91A8XBYQk{lb>mCMblyz#ksUNT_0tr|++pt6q< z4;5OPho1n>BEYt3Bysnt1oN6{=|ZIzS1toy+=iUQ0JVkfRh=FG8N5Mh)u)v7}94 at X| z{b%v>r}`cWJ;YaZ+LK1 at A_sqwiD#Kc(@5yWMA;tS!ifVfX<}!6Sf<>&=y_^L>lwY! zp-VDrQ^bLB@)~FifXuN zzv<9n=#w9_Zg8mCR{H|k`$=4q*47>=83#HB=qB3ICu|TO=8;NbyG=_;VR#UDVrFC- zemXF*{F2o;OhC?%iY%pVc7mbb2ELQoqF^Mmcz$&zFD!OLa&S$6 at yVI@7KYT5nrleR zi9yEe_;uRFgHxXvi?F_7 at NOGREa%|#^z959d!x>B;&82Y*al|S&uAtTt+=gCk-Rg>6Xb?jk=4M(Z!&U*@=t-K6`)M;{8LODO>L=*7ui4MX-L?vk zjE+)_8^v)DR=ayGN at z#i$u at G+|E$c?IsrTdC|hWLv_mKL;W;ZL z1SLMXPAZ*wyGy(jVkKHBZLevcc~Sd8gr8OwbNOc*1epYR?^C%-~(JI6P-Y;86i zDY9qgpF{WKK7yrBd21Xk8?8^QDbH|F<=xxt|P*|GXfe}GpAgc`5F2ykB+Hx~ndc$D!Y^?oU zS>SR`oPOvMb`U%dx1vZ^DXPg6-~V-;)-!SD9qPa1?$_!%Ok~=WHu!fFN)=GL1MK>mY0cWKfHGn;reQm$0=sFmD1;Tv7lU5?h at BVLAs0^5qv!iH(UyZT9tNkA=XlId>;93fCTaSnQ)GV?5c>r zKzdem+JundHXm_nyyg at -Q>DAReOr`J5U;c5&is{}b)exk;4fYH&ji66jXyv9{O^&S z?SK5`Fx7t^V&KotJ{&GBgK&nB#XKsci82_3@)0;X9GSsxoyh-}*vYkf{U`fy&J99L^B9)CJR%yqhT{G9D zl at HI@094|)%N#8tOrbbHN#O6ddX7=d$pYCsw@>oOpOaWI at H7R$v07H+Nqg|KU;BO> zj(n at LgJ)%W^4evzP3mB~eZD5H?UvvB-lb`acW+`30Gmp$5I(C<+d&(4{v8r%B=BXh zfvL`Z?X%pGnxSB4qq=pY)ecTITYYYSaDenm+V%rQ^CB~Wh{MBsbaR$?8SOV(epQng z<}6kgW-c0~Qom|MYOYNe_#ApYomMdoZx^wMrDJ!zRd?U<Pn#3}VA>#zh!hsh_(>F?IXooAiYzlfbPkCHs65F9QwIdcHB+{t! zg`^FTIAFa-%`Dpm7$xdQ5QsBH4XI5F31D6 at 7LtkZ8qZG|4A7KIvgDAY4M=5P3Mz0P zX>kF?`4+T?-FW($CyDtvC%P~$G#3oUr6jELB|4X!k1-c^6S<=>e9}en$(5XNX7UU2FTTHj zNuYl|lQI9#Hi4Rr%Hmga{>}6d(aVg#e$P}_BhhiC?zv&J}x&qE;j-{AQU9H*Vs5dL!I?YGm%4&3O0nJsm^=ECBG+zcAUBe at rtLir30pC2!$xOt; z2bvmdnI4bS^wujhWTLeaWpIdly^85<#MV_`+To#oSz?{=s=A^Q@=5h*@RHo7x&=48 zPqb#WNzgwl@)FG5P7)reZmY8s;Jf^o&ZLw!k|wp?Bm6L82+GLFi_n9Qdb%SNosxRS?>1G3$5UNEExjiH^phlW|T`U-TOgEL0I==8; zS4ZIYabK~ZoLNM4z;-owOcP*1j?;>9c9(16AE8UHg9XvXpGC z`Xz_ptZw79*sy#q&o-suR#CTDkxU6L9nSHxNP9~Dhu;~cYhVqY?<2^*=smpVpOPy- zS0LmOQJD||(J9P!R=C#@W3{5!9}F9;zoMcjGRkEI#gXfl9BI!&@+#z-v>~Bxl(RPk z0FC_iD}KJ5qthUM%P?dh?QjJKA)I??tgo=_mgD6n at fx^&MpBCE648E+s31#*MC>ot zp?A|DCT}|#CCYO#$v#Tm{JAM8^NQO?d3dX_xd>sC-lE>EveJWp1ap`~BzZB at zgC zPdrJq1ROeFyzq!EVbl1d5h6FX7o-uN5>rAs%NJ8R=Fnbnpxo?)ra4v}SJv^(rhM+L zoo1eiqlXT!sUjzR4DV&xN!ON{Ce@`ozfSXY)r&XAr%5#WRa#OO zJgV`B at Zz%(Z#r``t0^Pd$DcZhLf{v;FZl=l;Wv9JDpWS!iJQ)V(`imt!GM5IP(%2i zEO44t1A{7A&V^hgG}q`+IZ#rm61Ge zs!0}Qc3^c~e90>WJow%GP)t`x)>@lootWZDf_Vmor@*a-%&>VDUOfYcfIZAD1+>by z*wXu`E1SF$6!wap*ju+9cHZsllfKgCDK%>((+2|+)2LM&T1tvIFej>Oj!6zH;1jVv zl52r1o!h4*nMK)YVK at eoSSr72gLHX*f;grPfcBG}5?Ia0ADI|q^nL(iS6icsW9L=B zDbwQW0ZzBb>vT5JP)XhGwlI2DZ5YguEU`hn4z6%`tkE#a8S6(;9q9AOsDzj!vqibx z%(EH10xU00+ArL z4v1=Sy#3_6rV86Vb+j{BYRihu#}f~cwNqSCysGm^iyLwf{?@mqkxEr-TdZZuqAD(m%q<)wAWSAwl)K` zX$=2`S8SE)AhVpbUyMFegRPW%q!9VmGn7ArM(Jb#^AY3Qw(|F*7xi8eT=L4IWOD7L z>SXP7K-je%>8`Fy8H-iI{dZh#sJFa7?#2PEB`-F9M3PgKw_j?N32VE!L!`F5bboQCdBCvxR>^QQbazt0=>lqm?%AVJ79!wri`G_u6rBf zcZF<2n%<}e!rkCg0-hHj9pxtm$=j;kh#W880!IXl{s5%5)<|n+nH@(u<7q0J!W|~Q zKMg-=OnfUE4hQUddL$CTbj_siqWZT?AkB)}x6B!{Y*4?{E9j0Bf7K*lar|pQ1oEe0 z29nG!_p3R+G50`W%KLNoPzzVTblV}K`&8WqvJoL&S>8O_NAM2$MRs550Tg0cn~IiS zQxM1}soo(o;zK|ShTXV4Zb3RjW^ILTmoju)ou`EY;nW~ zXTwL)%Hv=3Ys!i;h^Rk>940&n$k+cb5%GUc<^F4^MQ!dM&&-eX^zd-1jp$%OWQ<1o zC1nUDZ4~+fNep}}dx8a2>l`+t1=R?_vCpp-co<0W7N78pJcolJ&`1PJ?NTuGazRBA zSABl3Pd>LkuRAA;x6gziC3jS at BI9r!#0N}eqS{+mqPS%*jxk8>okH@%0P`2;cqETs zjv50!fj)qtEUVPpsY?K*@!gxs%eR~=?W%Nb7Fijs(l~$!lSK^;K+j7}gFtl(azr;B z9>`@q%K>r_ at 6=gMZp zIaZxulFmvdX|z3Kv&vF#Q8qQeUW1GUAu|vC)`}Nx|I1!H&pUW0&{xY3W z^RvyEW7q0}b+TOfl at qn6nc=pSfS&`bWDA3C>#6i1sNYpQyto}A9_*UTOzsVNS5%vg z>8Wr5V{NwVT8yP%;1#Gznk*AWCem>(qeysL2@=>h*lk+fry2%H{pUe(e+kEy=}pc} zRDG>I9>%Uxg?Gop&gXg}{PwQ678t at 8=r>|GQDxqJV}He}^GVXpw2n0-y`jK;QJiDl z+mFlR!}#SOS&2PnGG~%7l}Vy^T0!zmIFI-1HE3~-Pf%7uy=o|Ni{cnZmv z*bo_kD&F}UZj?-xXoAV>M|-r<6;YI-Wb2yl8)L)FT4k)RZN$ab1kK%>h%=O*`m7ls zz{AgE*5-feBoIy}D9H8*Iig(ycwzmkiK#e{(Jx^}B_;6p67a2u zKX$;Lkk2a`b+5o?-kM18d at Rv~anFKzc8Gfx$B;J1oW?e$j36?Sir(|Odi5O~LZ9&Z zt&+vFoltSP-))o7df^zJT-u3>ILi0sT%od(eygcqDJ7_)A97GLIC-~*q5M2^sz#Z! z9;S`0F3GmcGOV-;{$!K- at rwbLpkBstAg#`1A&=EHxSZ;%9(RcSMG-68bJ);QF>6P7 z{9jgxhO6Fq>i?-EfBrowk^SFN;=kHdE!*~5rpFZeUx$l&so>$PmC2YP&_sk%IN0~? zy6~qC8aA)&quv#IGCg7cF;lNJ$~vVj#=$1XYti>I%e~8OQTC7Z$cTm*bFP*h`4WgD zN~Vf9Vew7j&|blW)|xAZR+>gk37vF3nD3l at mb@HDkU-;^r}&!qQ at 4_aalU)q>Je}w z1TMAktMEgfeF~tm6Ibt&sicFK9h`u^i*Dm8uQhD{piXjPRF;Ly`cYr;6LTgaQcfT! zV3c+h<0Jh at h$z_9sg1IptYU+o*#*@{yyGZ`Zy76@)p-VL;k8&d%iaz}{ z+K5wkZ=w-T(jb$IzFz;U#J+AaP~4<^!&04dLaCk?KO=%azXLw%1=_UKgr`jM#=T~> zR-}q at NQF>cHHIOFd5JMtgtF185|NzO;Mu#6UZ1B*T+hu_t8;#@O;5)==+NC=%yX}m zy#~iKbPVbqi`~$0W`HLTD|56byd01MTel1VeCAuX)UoBA(26yFBENn*ahjeGFJI6ol~M0JnOw-bXav}us6?=jd3N+3|Fw$ z2ZTEJ2n>*VfjURD^J8>9;b1z)>5ywOYvdn_;&@?Vw&`}X>-0Cqr6rTrxkFv=&U^50 zjN^G^(fl$+NXcg%agaO;V?wuv%-a7 at 6meuaBBYuqU=~Rd at ZRgym{OJl{$d6h?YP<0 z{)5olzlTtc|4r;(DkZiP?rcd-7G_XvSAA@;l%oaj6$*QQNU17?)hixyAzc7J`JzRCWMJ^!1 zsFn?1-=3AsJ(nSAj$Kx#hv12K$nGv)EKe86+_8L8M}1nzx=)x%0FKp?(MG?e7vq!n zqi6&>-V7GF`us9LYoF3VMhK`e!FjgbEp=*K;yRMhCH!4Rt~4 at WK-*6mX at wLnAR>S| zsEDQE!S}1&k(#Dp$6L*&)rJ?nf at 3Cc=Dkp6Ep7abv|%X;iTF#q&+qJ6;%mwuV*=wG zxdtYdc^>lDqVK}^%I;<706mc®v%t?zEw!f~6;2vc{m-R+ET;N{hZDnM|)rNqHl zC4D1*q16A!sJu!03%+C~^+{~tnY{yL zOMhe3+~YUSvBen0_fZcKy`ZcU1xukbn1J3-D#pQ*V{Z_PwB1A2ct>*qsZp78AUZ!D zeBnIdEY=bwv|~D?FIUC6OHO&TIKl8`)-9Sg3pdJ*7+RIz!;Uyhnmf2XJl-^J?&3Qi(|90$OO`sDCp4MejB?j`&CXeEoaqS zss5l-6$3WuONpr0p4}l`CGA+eZF$k>Qie37DgpAGFS_vxdyryvlG*LmIxDM%h5P%% zYWpn+#}DDK;0WvzrCE|F=`S=@a0F&B{xybjL3M_?!~w&#sJ*0jI~e?ndwqtQRyea? zZ+Yc+QF*?BkF9iXq5aNOv5;h!-F$4vR-altPeT+j9y?e1v0i2s^Zvbnc8lXyJM<_! zey|qNLyjA1Ff_o>8(=uUv)1P5L3iUd6!XP`E1eu*uzM&{-y(L9?90^>Z?)CxmoXaV z{E$fK!uf#`BlNzHzEZ at q63O%~Jb>lHE7I>{rr^ zj;W-VG1JOoWMw-0=bs+iA{z>UV*(Q#dio}odQj!=MNXxN)Vzz%;&sIO+0F at 7HD_6_ zg`?LS;m4k3+q-BVL5nI4h5N91*5gFgLcp?c3(va3KypYOfD20H(FH=)SPKEm(Z{ZC z$?DM`Xx1UhmY)|}y$oHClPWB}2jDI`>l!>pa`wjmlrA9@>7kqR?qYl+f&}_ at qAvG* zi#jmOy)nx|?1oF9nh0K?k6)}d3ZJ(zwIdNnN~~NF2vO at NahGn!GC$8IK};?mha`|~ za>Rc~T#dMpqr)yl6CYQb8?Zi&WX&N(0ZJuaI^;AH$=?OzjwY>u*)ROAbwZ5VqPUbV zFkya{b{9~6WtlEjw-HQy3to~cS&JdN;EIaw)-3xeiuFjK9(*St%|_7>4V_6!tB{H6 zS#o}>F2Y>;@s|$m7TY4D_aB4~{>LTZ|3s*ev5Tv-k%{ZSw=4fc1^cIs*X4g5bhrDH z{E^2#btdsWdbKT4;*emxt#ukGsc69D070Re^DrEv9-Hp;5_KL&_A*DjFT!Y1gP5bM z{#1uotzvn?U~K2JTU*l(<`(X^bG!NdAhLzFh9F+8=(1Q;WlTX*t$YjnB?U&(V=eKN z01 at 7;<}gO!HU_mYLr9`gN7IN$$6|Wj>0^xxAZyE&G at HZ%%eme<3E-v2&`sbKIZCr@ z-k|Pl5E?^}K!S4aDbB2R(<(O1q)`b?UycnSr@&Rx29_Us8r9`W#nGeyx{+&`=DqV% zPs`jhqaWh5#SWtiFfmdOb$Pv_nbgiF0c|cUecI zb_wWfP$J))#>VJ*))4}}qhoGg9`cE$QP1ikZ5Zh(>Oruo){>_sWpy8|_7XY2pHwAg z3jv2*dKwIgZ3aarg%O*1^tC(Ul;Ay>%0e7FKhaclbd^t2qhm|Mykfr(b`1ltq)#`? z;vvJ&A1q8WdmX<4z;6bZ at y_FZ{5mcXT9lg2^BqeRSP&gz4~zW{D7MfDWBwhC^(ZC< zK&+w$C9^U$JuePG1iHf4B|qUrttC^-Uj<=MJ||LreBEtda|%_D!z=6^VPBvxB at Mak z5V}7>nWC?V5wj?O*Qco5`8IMZc||($;~2~39eI&&kPRu*wWLCFME8=V8Q)wG=wSIe zkKIRL62LV)n`dazedV-Fv?bP5y&Zx-_3HVRB}#~|q?hUc`!7S at 7hZGv>`gf;!ZLP6(SPR>v2HI>@DLZH at +u7Z7?;Q~<3ucI}ur#O9(&NFhMv5{>} zz#h#kYgxQZEnF@1n>?*!9tcy~BG#gH+?ntSwR7P>dpA2KHg_Ij>V0tBOyf?R29S5J z`rO#4X{XQwOC*ylt%dW_H{sK(TAw at JhnA?j%w`|G2A~2oXY3J8){dID)Qk`BZ7q`! z{IG&UE;1Q(AX7@%Us%qY8dG*&l;V_q6U5Dkto6G zk|Rp}dGc1{=Tt(=EB`%BiA2-~$InQQnV@}L at QcCGeq=g%b(fq>ODw at +YUgiB*EI!G zvICQ+h?Vj9YVyA7pnci!@bo%ai(_Yx(0XzF at lEo_7|agQ at a*mR0wtzqxNTdWO``tm z%NGvV8Ox*wI34nw(bz~<)B{Zka;{rA+sy%xoBNtjxivZ?c#l4WTS=~n2ND4cC!rxR zflok&WdB at i;ty_ys1CY)xH{>M at JkYV$zNc(sBI?Ik=dyB`!Xo)S!wjnyB8_co1cRu;TenlMxI(H&Nyjin=yr2B7|x${6q`N z?z$85WeBu-d-%q22CI)UvLOa at g}zA+JNDxblbHFw(lZaCQeDoIHxjX at QG!B5LiPH7B+Gm$iXny#{F<*>ncU?M7$+$GOf+A% zEH3|w1 at o?nutS*H>w!SRCO$>Se3S1%d_U|bPh$A0OW*^+5p%%}fu-DEa3V?ffi;w% zABY?Q3toYSxFM9zy}3o?){-~i?Tk;a6XRur-_jOjuC^xWu+*)q_z~Zv_I(5 z6`yfdRXwkEdR}CI)^%O)s5ABB2RA!uV(1lZR~f;p at aUlQD5d`QYj at W!`%e;SP#oxv zO$nG8;%P%diO()>Nx*YMnEnNpKQP#pk2xX?pwMtekd=cUGoflA*1$BFuK3{T_<2sa zJQvwolpZNppr0w4Qef1|6s8v(?-v~OJ|y)BUna*R&ZfRd8O5+66{`FD%?`RN%AP;Y ziRYR|M;X2l?@bv=WRI+H9Qw!!RDZ){P$7Ey_?4F2ivZ5q9KGIP}P1!L^=`mdCF-_?)PU$gE=`mF4F-7U|m(pX7(&O3B~0a2UOUp$+Om2C#U})P*T+vVB;5 at I{&?w%;{f?9;X8(=OdI5*PMaRg#;HQUU(*Vp z!>DomPg+4j{97)*|3g~&cO%Hg1x*dhUq0DB%T&fn2Bu|R-BQM$yk#p}Q=7)}9I}C3 z8qzI=;e27nUX~+`1|}M_=MB^!)ZndvH5kGIPw+feaFDRL&%&cyZlM-N-h4KX|CIao zp{G6ND4{>^1I!R&7wUURJJ{JMh5#Mp9Y4j`Oj^loe*?kL at xol2%FHUF%2dpmFezS^C#i+vsSpKT-nkHvi(`vCzshqR4Rm2&` z$J~{}MDjLSx_Qc_(qeT?Fj`Wz_fid2dhJet>t at apc4{?tbat`w1wasFX at Qh@D;=vS zjt6TD>-mVScTTaitL}shR3YN@$xq{|f=fs>`R^?iHkCQ5Nh%o}Os)mTIp(RW*s}s? zIoS55_)H2sTRD1~&3@~8(76k0YO}b}btpw+ZlosFm at Ls{ScibIBDoL2%{0yQLC#Xf zDL&6=iaCuK?#>>nV^!_*oaKk)th7nEfObs3(P&}qgwC~Dodqs8vjOrLs~h8xiJuGM z>(lUS)l+-RXB-pnpRfnS)=ARjY4?8PWlH3=iCvl9LKh1<8pbk!9W}393CAf4Y}SXF z0d-h$GT)p+r-T@%4UXEhDkxy(=jhEScC@BnF;WQQUT9TZ|^}bt4{rWflR;OpeiJFO)Sh);i{f@e85 z6a*DW?a%W+EcB!R;F}^9zcVoOMaXLC`$w0Dr$o=3YTrqAa{`Q z5g?^x&Y?P at tkkaj%PzY>^;b`Gbu=o~)JrCNd{f}RPmk4A*fhf~Wt%^=Es)vhg;N$Y z-iM)1{r-KOg>3;8Epq>K7?aBXr6i4#IyZInO86%=`Gb(9HjV zrpb2)ljnJl(j%Bz7GZT2iiG?$NO>jk^=t&O5Glf{cb6v|Js#v_I(g7SH!#9qZMj$+ ze+d+tU6e{@MG2>p)K2O7485_4l$r1oWoQ2g?U%LX-5#%mdSU at G)ILhMEVt8TAZa-` zrQ-tG#Q=4d*V$tHBHP0X?4 at I<(^6)L^kN-3oe0O7bwk*8nVUZYo&p)6h$oof`2$%p zdyDs-UrGnp2(1!kbpt8GRV4i8fjEw0F(S=%!DxkA(RN;=e2Mt0(&>(T}gNl(L20^x*LoLcCkLsg_W#^XWss?ChZL({nd>jZgsm at -m?`Ri($mB8&%0|*e1 zdUy~J-v68({+$*6hn at 1jcf?B7^;|YZ(fM)5lCP=UF5BdTIGltxc-&EyByl3Q(X%*^ zuO34nL|)SIN0gN466jc6J@*}cK<~kp$UCF-ci> zw|dF4b9kxlWf~{3bDEGGi-c9uqr{p68UEsWm;RJi#(@u1)u7+}zN*pUU8mXDwp3-N zCZ|`rpRT4dr7faSzxlgM={p`jr;_oRLCcC;xaaqZbB$~rvu*vwNeVGkvFf64B^*thlBTE#^uxBd_=+APa^L@8WM2r!-wMGBW}CS!QtlMp>w7l!`Y^E3rr~=j)msL%y%5w9g|ge zW7XQfDkRQxbUQ6L?ov!6&RWhTi=&efT0JQ6Gk{y4{`=^x7E&ptcg~dL4_S#KW7ERA z^(>Qh0HyB_F=mmDeFBvi>VpH(Bm|&67i2Drw=J%Xb!(M(t#8b19P<7ngb}tW%_IlY zBY6Nt at W6dpU8@JCGp1Zgw^FY=zB^rpKb at S+vrOQUWx8IjZs5=$`!T}ihO?T2%Q863 zRJ?g+-Mx_kcXy$~L)eS`o$^=P{cqkQ8j-K6qgBf-v^@0XS at F(QR()Rwm9|tJQ3;vx z5DXO)M?-_ at C@_3u6-<4r_E>!x4&fnjRKx0w)Wo%fATQxuZK*N`y|C57*H16JA+xde z>*A?B!5`ol_V_}6$7DYWjA(Xp?jteyVaF)m1^rR5P>KG3Ku;a(0-uS6d}{C zJ}l=Uj6P1mpr7`t*bX5jkY`zFZ z3lzd8QvarqI7^U6^y88zjWOn ziKY6o#i9t8`&K9g;hs+;kzPa*Vnp z-ivi;XLE}%UqB>yO_;=+-4yqSF#+vw at _9Q<^tPA at pV3Fk3ca@=6L{sfl;K%K;FIiw zBJjcP7=k(!_AsJz(ZF_#cjZpmI1Q%Tkj*qFWbeu3+K?}SegNNyA4m8C3Mi#WBZMFC zI%oZoh(!Ftn%-byzcGLd4w6#+q_pqE at v4QzJ{a|Pz_Qxb?XYu0^DUsw(uU(Jfx?8)OJ)XMfFQLJy&L;IA7zez$kBOlU at sX{XdH-B- zR}`;}-9*m3cH%<032wX#@(&9MKP1>Y;v-!rfh-ra)cZnlNNe>1b1}bDYImbKQ at rzU zvHjj;r0o(c&V8n#J>SK8&OiFZN(ZKhMOOz9dcLZ?v%FXHGl-olcLYI-e*7hFITFxX zID&(KP{M+Mu>SqHC1d9GU*eUF%Az9rhrN!nB{&QTqk)>D4DB$qfR54trm_L}Vpw;J zJ`+x|eAb2Q^@`vgqvN5lg{v>!7SCaTB4^i9EA5!e0xB+*y6g9Bm$`@TQ(vjuhDU(Lo&wU-A*keeN<|n&}ayB}z+9u`1*&=-=sm1K(n67WD z_#w}3X2ZQE^W5DGIAyfdb3HYvSfI61jYW1 at O=m0{_m)h7@?WYoW!&@{#@JmlI0M72 zo}u?uWvUb9ZR=Wg{eyxGm!YOyZOU5ku7O8T=b!0epK(EBn<;oYKm(FA(kYA-Ne|1~ z#-EkHSHqUR;V^EbSL3RG+n{Tx_4ib1Pj9^p>t>6cUZW5C!Qb{&#|dYf%aE!k!Pr&( za39&4nk(45!@DcWxf~5Gch4Ei*Jh}ZQ$$AUR22eF(GePLq^tft%pRk6t;(2DyeRWf zPI?5xRf4&mB%+!IYMpQV0 at hMVSH&qepA%w~b3`$SG+Pk%XZ^$(1O?~kw&8{=RB#1x z>8`^;UEFsR!n4bQC4JkVZ$~&c?_zguwsI}eh4qd4G~bp5Ne=sng#s9IA2ra+2<6bh zbR^*lBh+!~`Uwl%8jJ)(VfZ5&bC2-J_=^BFN-F1f8pxF)j40kW$J^&-Wp9%bRFjm$ zX>)60U8*yL-Hp&c$PQ4BEuxY_`K(e)n4Tcto?kzpeLo3y1*JaNV@*uS<$pY^^uIqm{vmb#d!fVsGFOzU*=V2|A^Ypw z({?~v8EesCQ)8kvlAtwB%Y5^s=JNfq33fZ!YL?MVm;PBbd#CJo2K`vfGXq}{bR at N( zvyFXnKRwOMdi(MF{g5({tI7V6ghHQ{U_7#$IZ%s};82RueynE~@~FvhIznz_*XVojOyjikk7+}U}+MT1-Ne`nG zf$A!c%C at xq5?16uOffdrSA>WUd1+oyG}}nYj at cbJHwY?pA)cr9VY#Gh8AL64rH4~l@ z4WTWu2)5E|$&GQ(ECfVUCIC>JTYHKiqYD}g>0bj(^MzV~hgF4;GVRlRdTSX;I#Clp zsSBIu!t`8kr2!ixnx7UoU47-}GfczvS%Dq0(p%c6uJPF6YZ%*BWogo4#m#wF4G{P% z#u3Dx%;Nf$_iJqv at ZtKZ^vm<-Jm<7m_d{c1&8oDEwKDH8*OBs%t*%){kN2 at C1-!at z-Mc3bQASXa3#KWf!I$(fy^81*-JE`A%lX6PHv_6H}1zwMX*mKY&7#i5ib9tTykBK z)OforWOz2EhyETj-!&xENA*_;G_GLFT={(^J)S_TUy(71#|U%-m#BnSqxJ1lXiHsY zkMo>-K^SWvf6;^nI+!Zwz(7D`q5sw}-2V&t{_VN2Q}~lg{cm;{XmhiBY^9IHa=S2e zbL(Ny#6m-vh{C0cb|=*(8f~OjQC<}M2SmxNjo+>kSn_nbItO)!vT9DBdidt}PxE}9 zUgw_kLGCr9goA1HpUD6uf|0MDMEXeF1TK6 at 1I)BZFVtgrV|*dL1>dZI%lI>`_~A(h zdF}<32&+uXY6dd;C?2a7mDseQ?D>S at _Gca_lSF%LRcR+e zgmdQA?7|8E!Xp!Vb(Q_im6CVK&Q;PIZne2a?6ZDv7NzEy6lr7$efNH<8x77iEe%{I z8nNr%l=^zhWw at H&>b71t$sxD?ct(ZlsjEtK?>4VO^;Vx9iR*@?{0TNad&1 zSB(anZ1|g~or28Z%&MnfqA*4pr&P|xiPOw0aAqMA4 z;11w=NsnOihSapDjN`aQ9pjEXBh0~!cNB4d573f@$tm{{{XifNSFm6j+h8hn$yA0< z at s8)9W)hq~0Vh)_&ol}*h(r$v>{lyOU~*g{Neso!7mZc$BAZxb$|nXxlwhWe^BLfyLTi0 zU{r)a!0`YbOPUi at j6(@aHcG{WNan5C*6oXoOqcwzj#V%!`yKeN!q`)H{2CLZ*pAxX z)4Z`;kJ--hnUA;k7u>H1XLtB+;*^rqjCld1x0Xd&_BhZR%2=FDdx(Zx|?M+m_eOQq`C at mA3=5w-D5eS zO4-9z#459tzSp`+etQK%@pH(YOr&d at eYJ^ywtqsxfMkIhbGgyBY8FdoSmOWT>>Y!1?Y3>v%xK28?abJ=ZQHhOXU4Yq#^xK_wmp-~nD<-zo_*`=Rrl6i zb*e@^Kc3&MkJd-4-daz)aWd&`_bo2$G`s)Eq7Y%Lp191_Ycz%6H3AW-d|to6NOUS^ zxaFF5zz!e3`2jaO>qw*dM7dmdX8x#afwA3q;jUHOZN*DA!#FBpI>ba&jL7thFSQ|> z?S~gO^j3*c-&qYM3!c5+2)eGBW+xRKaES|-$S_3c{I`T)kWq!mDHh7Md;~G)v;yl_ z9s1HVm;1&1Sy`Xqf)`K&_06!xV~-`HqLC&UrkRtWuGq!R at vp3h&EYR_NGPMal(214l_KB> z$ZreboNK{UdBSLXLpH7ujv=nBB?R|B5BAsNy~hNQ%&ESFkL;|Upa!9pQo5i?&oIUH z8h?vtNUSJ4fm1+xPg&p!v~H8=kOrCh=1O;6x7aMx(&xM(H1yQ1$cHH`quV33J9>N( z;(bqhI+9Otj2(J$Xr6}1vhwos{wlSk%b=Y;_(h!KDB7I|-lM+-%;}P6isEe1Q1`}EW06HzKxXx!TiIY75iB!k2C{BbMR`^h3(u{2 z-c2LP)r4kLxoe;B%A5Ea2dqK;RY#Yj=842LCfTh0T)RmZNS_TRA$R&19-V(V|55?s z2yFb8&Iv|6JFPxd_M4sKYRW#XVuP$+n=0e0({hW>A_@&w!vMJY2|#{6=6#zzuj1=U+dZ3s!5EM6T7gndMc%75+kiEkfc0$!I%+Emx{*Z!M)* zT6eT5GWl=?BORF%m4Bh z*@GhvpH-QffGFbyrhGG<<0&NuuVXPKi=2Q08A4}?n0zyh`?~t&X8_5hPhd(!yrPyR ze8My733s8UP|&=kTYL4IL$tcZMHG@<@-`$`{6;Caym+6m{}akRW{JPqAwfXc5&t7Q z-v0-b{}+%oY&1|UkowQ&tr{!V zvU_&_X!v}uAU=xljTSYZK0M_3Um~8*TJkh?X`wVOljQu}G2gK`$;|Y?`1*KH-vx2q zdq>K0q>%)kBem|!BGG%O6CQ;0wjO=nXRG$W1AGz_|8vCN5N4C`WHR~Su^PKFFv z!qWL^lVFO|-`5!4mku+|9D>^DnbNa`lIz0kWAjb|T~KCax`~h&EgpO??V~UutPw7; zRVJ-eA{x!@&nr5K3gFC}wC#zCPyTA_7m#MMpP(*=Gv&^sH0N+MvYIh#Z^$P4_qx#w zb7-B-H+8O40vH-^HtkG6zkZlVqpl?`HErA;e3YcgR3>9{ucxpsSewgEpLcs8d`?Bg zB3Q{3XHm~}=x5hH$vJoTq6JtL8XoR>Gx;csY*#ki^txkqNmD{BvpSnnETrYA%~nT= zsmzi==DI9Y{^hT0R)l!+j`WG1$%rY{2FUk;4k-C?S7*g=9W*R2GFLa13Dg^qltxQ# z5 at E|(u(DZPQ<1A#k=j&wr-Alx8H<=MUAY>YI;R=WZM!QAV&xPtBb!l_Pvf3Kb6PUI zv0w*?@=R4aTm)Wn56|}<`cnap>__gw9TxyY9+wX{B$ za!ZYQC!w=D6gnXP0To;Ot+#U{9P#Mvhw1Tmju`Oygh_=fMtqe&mCeOww_roPWMa9b zIaSJb9~Kkg(9+Z!tiDxVfX(B%T)Ah~O>$Qi>`r#}y1RbqaBT=!MdJ`B>P>7f+LPIN zC{j6~g)lh8jdDOIb4rOY3i|XA50;*0DL~nUCR>S;dUWkVTljgTdq+PR1}`SnqGRAT z9 at Ib9Iaxnf)bmEVs at Fc3Cz)_z&ZOg5y at db%S5?oM2(VaP=*8Ex;#^O;+?~dmwm9~c zGLsvMQ<9W7zu*E4=jtBwE19X at SFENh7v?h&pGLI7l&ij07Pz;lmD3wq%%_=#e;Y{} zv5(+mtj$#C4TeR7=Bv%hdhVi21h{qbp&C>H;jN5_Mb at UjbH_{aIJoe%u7j7Mycm#T zJSiI5QPEPmWOh`LM_P5#5kKjdL<6jq%Bw5)*@dbZeYe;up07)`jW%8_5yVUcfS5f& z(KgN1{hzFml0TgVNSf6>$pKM7w>#!laf}sA4JjMeWZd3yxvD^05sYtCLG_h!zW`UG!K_Bt-yCxHhkc{J_J!a}zr9&0Kv^vg7Fap9wHl8Wr z7 at 4C@U)FwDSL?P$Uq;&O-7F|Lr?ExCxR2yW(iSWSs&3Y$+iCl&uef!R(5B$N!X$2* z|80nEqwV6=H73CoSmMLs##Zz$fxJznhJ1uJzZ`kP75&ZHI*C108gIlElad3>$Qgys zbQ9 at kg}lSEfJgmx2c7OYLA)bKd95Dku9fyNGfn(#zST260C;>({Ib?eS|Q!*CU7DU z;p~hJ&u+KC*3lqr)oXe!vOxOf18LNzdB*bxZIZfN8U1HUbc+-HMOcxss%|F?U!e(k zt*{ex!<7?9m%>uu+pbf at 2v)A+FnBu~^q-woW1IF?P**lWLsfJ-=TP@!1uHMLN~&yRoOqqDp7JTfp4kbJ2BD7fg~ z`RKnTajk!);D5D}?F?}$T1sipfc{tjx5lwY8C1Fn6|qK#9*RLtGjzP3a7uie3D`#` zt8$k7=kh2Lv9ka&eI$CwDssSf)nCC+8WknihbQ`$wH;p&`ZY~ z9$J5poILwh>pTCn0ehHQ=)t?VAf;$5`74`#^On1AuYCmR*$o?`DEgQ`ZP3E6_FlTB zS(!oYtgxK~uBiLUIFrCp_)S at jI=l5;4NLyC$X=$Utf{IEuiOkecT8<`1y@|>4DlSv zeDPM)s&@uS$2kwi3u6)EnWq|lzYYsNhK$EXei3jHZX?}G8|yVICp~w7v at 18-D7u(j zxVb)nhN{?N@~n&{rw8bn7I2P?+n=-ifIFuedu$&ijP)<0rD-) zsO{lr9A?VBvR`BkbCsyb$MdqVo;$a_${a;14>df7DHOa9Al*a?2nT~xcL+5K56|Hw z1C*DQxP}2it at dPZT6rO)BCE=%^MGFPlkoFlml=)0Kdc+*a)M#tu|YB}xtJJG6~keC8odCmN-%(1R2&(_4wBLQ+&YZZ zxRG=6s2o9XJr-_#4T7vAP^Y4+~a@{FYN3f$D1NUJG8HQthqiKkdc0^w at 2@Ux> zniZ*%8ptfE~^PaB1Yl-F2 z0O|cyErS}ervf1Y6HRht1P+2;A)5Pkk at BgXx*|E{zNY8>tub`+UYs`;`8(8|A{hi{OELA~HAk{?WnS4mnIwL^td`(&3T6)8tH~m{t|9yd at E12%c!VeG-bnySkXfI{w=aHTs&FUmL&fE7c)ld25kQ57 at V=ym~h5x2t|+PFsQ=qF at C$=y$(N!!>T zaQPBcnrkI_77-noxw}_Nk+|U*P_acSr7aiK0;l#GGP~E8$(7^oV{RNIA0LOW*KbCp zI~7-0_=v+|a+Z+K0elargmlv at svP%2y{tN889DGOVQ8N?-o4RgYy2p0qAhr6imr*G zBSILo53>@;b0ah&cT#f9wtRh{R!;1id~{S{u}kDG=4oHk!_0b6F*lIeIjryGHnBT& zBj;P3rq{{4F)6EkA*lg|S6SWQ`g0s&TmS|pp;i-H?Q|eo+-u<&>l8~!x+wFMUKW$f z_&xkun?!r{&-Nq2_9GCEO`8YwmYuefhB;h=L-;t128`bnHbHCD-63|R;}-%LuP*9u znEw+gWUp(>%m3QH`hSj;|0lge?_X|3K9RQV*1G#rsK`idz)~o>@k3!~C~G1TECZ`w zzCESc*p+M(q1=bm2&Nnv8UG8|htd$wc9tSpMXu>{9*@hP4v(3skM6fGuzvO`@*{wD zc!ZCDYYKvJ^XHUEE at A+p*9$UPn$eStr zC5wynKRx)NZ_+#XdnMM}hqxMzh8f*&}r8 z9SxaYYj;Qqk>k!ci_vqXJUyw(OTu z;Yn<*{=BxI=IrwIxwP#DJo$rS4d(=V$3h?vnuX~f3U`tmR)G>yggWbulmvrNgz_jw zklBy5Qy*f81md=~^o-eshd-2cmX5%-mW_ at l8bbZD#tpZ|r2BQq9^xQ=Wd=2k3)!aJ znKk>D7YN|^rB$}0=F%gt=xjyY(43P|#1Qh0%%E<|g(Q`Y_nlUSDS9HADPVTNJ-e1= zH5dO>6C#{X1&16vtYh)3d1$UQm8a{VaYAOqoUf$1X#n&OVB9t?te9qmz zPxBu9bxWN&XF^lAX090X+mm;Gr z{p4vJJ$=2>pK^F$vszHh7(tbA$eV+R?@d%La}(DB6*KZ6c5{Ry3_S5e5kn{=jwNgS ztmz*rFws_3s9H-Nt$3!O5`~dmBuFQz5jf!5-6CUX^^^Jt-F6tw-$BRPZ?beD-7)W3 zNhVi<+)-3P$jX>3b%j3PmI`FLzwK(Z)kM_65=s4*g`l7K4^@WBR#3Ms at dVL!Sj z^cLE4y(PGt_Twxfr4EbR at mb^)g90u8^OShB5Sdax)q^6JR{Mnd(Z?1~!%#gehzSOF z3FvS#L)H=h{x)HYr}`V=jmp6L=z?wvDu+3mKKc+8x58#s!KhBfP=*8HbIM9|FtviQ zcSTT8>BNGuRK*?SlxOf`Frimhs+3mJ0#Q9Grlhm*l=ggjr+Osv36CWvUtUHKA2YB5 zRk%RqDw5PjM58sWLo8}DtkRbCsNZvvO)E#30mCY1NuZ&%FVJY||7I|ES)nE{2L%Cf zg7^W20$fTWFv&o<1Lc1zx_YJ5?QPZM+F2UxK%O!ZJR^-THQikU zojN|Mmj`<6y87fphteh2b-#1&MN95)^d{3R`&pa6S>yzPB(1tAYOdfDbswfV1CE&0?Kji||q*W=+O^4<3mn zvvem=(@7d4!8?LwiXWirFX2O{LNoAh@=6E`?-`T^=={u@{UqyKP>tYDuvX_oWSqN; z32^V#eSKvp#y`f8>IY2D4fI9ie!9-g+S@#4Ci4vzMS8nFk33yIv)tbw z?_Xen)t<(ND7)C4;n`eU!dwwB_BNV~jNyOa=?)Mg(qHbt1a6$IQY{2ZlX7?(=AZNZmHoXmj0VUTw at L3&%{in`Fza-q-^YLNaeN z at sWzl+;M5p5-01bKgdVnK*jE4+$L?(TX`KOmB_PN`O+armDDvm9d5vz=6%e9&V}A? zW_pFKSVhfh)%9)CFriZIvw1*AVO$>V{&r|xgth`xQ^wh^=vU!*_?;98W}cBcx3T(OJRi-P4z(q0=p|1qgo+Z;ESb5qvcc4AGb_tPp?ziTe^|%XA!=Mf_Zq%(> zTI9NDT%vAY`XiKG7kaIIW}$QAC}QG)KIb|U%C4NPr{ZKWh#X9E3=|YJVmpK9rc{)f zJmy>zC16$R)@|XK8?uq~4|f-!)426&P{XOLa09X|&Gh!b7?gCy#20k2C at z29k??Q{l!OLi#?)qy zC|W8hU0_PMTo5ejxJokWGd&~Ip1^&WvxtDV*<8;&dL|YW6dEk)&ad8;QvvW*On2o^D|o=8(K5rUyjC_8VYr5)IsW%<1DV z)I3?uz*)_RW;LwP4UetdsaM^p$4bgzdU{3nY>cvpuZd4#_{t<@t{a(~h*E5~WxOV; z=M^!HPQCJBRT7_hV{+rC4lCwOAIeM+?z!-N924xs- at P7u;2!DkS<;cJXwG)a5=zQB zUp|b^J<8#&=I at 1m>Ezq?Qf3n-O+TBSj}qTJnA6e5{Qbjt$HDIvLmJUm`u5T|n*I{~ zH81fIvX!ZSbD7uHTe#km=k^Ew>7=4RC;41(?wNuzoMDzcpD&0V{80GWV451|~ZeoWc za@?4V>EMINB%i at Egsqg^PV1y^gWq=Y$!Pubv%>6DSV9!{XXuVgzRS$t92akfzVDA0 z=z`c)9A!pkMI(6;A)#R)9C3nbimE0}E4K1}CH_&H8ZSlHcy2Eg)`Q~DrTzgbm4%r2wyv*8}lf_3*ES4qYnRu5iJ(lWr`xC at iG@Gyrc6vy6w|m z<^_Jo87i~h$L at x;!(q}7oTkwjk})IM>S$6`%Rc9#`#Hg0I4OxN^PnfsMgB4m_pLcg z{4+LSPhFrHA3KL|58Wk_d+S&-ouFn*?bk5gI}lo-KYQlZ9=QVRZb4 z0}y}KE#*mqoHRcMIY%Ux>eHG+&LXc42loq-EqsBfxrL9K4avZLkX3?P;6E8(DUE}} z07%-{!)XO~N3gmZC*}OHqU2gW at F2tH*CT=Z8QNhaDN0q_)h_Y1mEmA at q(iX_vkqNj zzMHtFz0|L?6sS)16?~7bl79RF>%1W;5A>^%a0bdZOUg%?5)cV!asaplS=Ndq71N~} zCo|L+N*F(=s1Dqv-~UamM2b{{yZr~M_wfG_DgE!h<`#7u6;ul}e|^bDnZ~6eL0J6@ z2=ri_7Hv93y3ztDQSjI{`AzZ~Q at 1AE_!z*Y!NhrJ|6pQn&uv(DtU zMKr!3L|cgi%~t)lixO^)nooisrRw*pW${CHS=u$zl5V^K2LeT{tL;J~1w6g at X0zFX zF_!j1JbY!QZnDiPv7*6+A2$mjv3g$2OhZt7gQx^%N0n?fc2L$y+5qZ>6Pwn zsDk1KKD`7)aF&%txz)AXYUhG!79JB<)m%2X^`{EbQD5oUrw~i}tZ7Y6t=!ctAk99r zM at 5Prh`ZAEf`M5=3Rqz9L?%@Gm1Pe!+=)){*@`iIhLdisMMiv1BB at o13yCD#ZLGJW z7FIr8!)qVV=wq3%p#4DI7nuojZdKcMb#}i$;GkK{@mF`T?lBNtaOpXZ<-6{7`I4G6 zWvkk1A at y2ZS=1JuJy(qYTC2<1i2AizX}1FDsOdeJGomXYjOg+>;C|^!GiI=|rb=5@ zxD at yiUqTaVX&@Kf+~wq|CA%Xt|6w02R_D)NdULf;pt%X6w=FZIU!h)$rAPTi<%x(% zuB&YMVq4BnR~?bn3LUuJ&9Dy!k$zVgjK3yzVz!bInt&vHw<{ueToX!aytC~wdzeI57iM~Wl* zvE at m;&U$mdVAF2kEi_l%NwcQG&V%+!Knj-xsjvqMZJoY$jd6uP_nftR-Kkl9(VfC>4F6Uy&eOoWIg+ zjO!OcF9yj^q%uF=-rcadD&dK1D_GPW+f%I08&3tFrcG8?l(LC7sy4e}$Pk*WlP=A` zO&9&rkM88_55(Kj at jCs1*vbx$zvog>U(l2_{c*GBALO_ja367bBKE_$x)Ai&Pvp)p zWrRB6-}Qysz417&kQ+zYYoxn_Mz5_vABpSLwRe%(p_M%PCU^oM6O8b^lfxBOw%!|#!$`{B$^5!r3>vazrac&0~s zrbm3H$Im|ImOlb4E%k6^XDX+U3i%u`gTIQk>5IFk6Jh)T zbc>XJWj&eBf$HYOgZw(DfGXplMeI?lo@#X>TID6vXb-u%ccV9{obw-)E0RXMH?-5= zGL_bg&|&qi<9rIgdozIZ^6T#jkW(V9eWhM$KVWIn?3-|DK*THC;G1 z^{?a?xc{in`Jc0QacVX$sAg#XJEqBg*|yZp&83pm=`eQEm14s?RB74;51<>$Xb!d< zHeIaS at Z)8Q-TQiXm=Bn at r3N`pf!r5?+`w4w5Cj9)rMnnz{m}rTyr%3jDb!qdiuXLf z*=w&Ev-ej4LSMK7{6FG~2@<4h!J|c3Ku!Vqs*FgIP?e8+P8kJJM;wLwOO+4Ltm}NE z^L45j!30B;@Mz9aW;I^SVQ*P6Cioaai*;>_Z8+KyQc1(KPh0<~3dt%?N~D_x+sSKm zD0VglD5_8SEwl=(R$CWV79Ojzk;ifHZB+!G at VtyU6^uR$26T at NY1pwJn{v|$nRS8e zmYe2P0)^#^6joUg at D{Ch6Ha9)=D1N!@p2L*MmYAHk$JKlzkJ+bm(a{J6nGt$X zw&Ezoy^-EhgV)X at l}E;QVWtN1+TJmy-woZEVZ!Uo7ZhSMp;N=xu2mPp!-J}kgIY at h zmlFqa!v8v|>CQ1G#NgyfbcNeLShgpWV%`=-r?cV-c15SN=?>yOwyM&zJscGD->|u> z0BJqdhHY^4PfZ;dvrITE4&>k+_U+*RIF3xBImS&&XDc=4fgVGASQV7ZdPJt1nW(r_ zxclk2Us$o&WS^Mvr_WoBxu-+vdw&*B8bBdBWrQyts=kol z|7`Bw6E3(Dn9GsOL}Rsg!i7pUm(3oTsyK`{_xvhN-B#Cb2`2N>(be*msphLKmzai4 z(QN1`7G+E0k$9o{Yre at FpsJv-xJf;kOVFN3mWxgJmp_F~F64E+$$g7}kKlWEj~8Qt z{mnrQ at r$;Y&<+y3_4krQc>xPr7vvoQw2*DNMFzw1`0_w+61XVI& zEz_ at BH})I+d-!>;l4A;C*fX1spt-R;@=yqIF11UPC6LY(?yz5_{cb7r1$FWrVUJpF zWPuPB6X;X}!+S9E)1v72kg8s&Ss&nP_bRMovy4OzUPOci%{bf*2_+y^XTC`9<848L z0-{NS1&wH$7X>`~zt_dpdo3uv-k$WheDaC>x}`ZtwYOp!Ry3QzI*Rnlx`nuLP3ScW z=?iwMv+ at gc`x$moRv;1$eoK!~IfzWuEB@*mLGT)#obsJe%B=+#n{Ke5GSL&^-mPM> zI6f>=__fVg$3TsuhL7Knc3IIL^tcKzauPka(-Ka-&1w&g3*KmnDz)x}SsuL*)=+Y( ze4g0Ozrf at hQ8L!onj3bg2-!tB`J+hOCn5V4_<1jZ=)-Vs(ySND5~_VM0&LcUp|Rvc zDBLw!36@~oGrAdLx-96$8#g(*%yRB5?pVelJ6~fKX~>mNy@^8)Z;2rtazITm-?l_v zT)|UGs2JH2S*opbw9(_-ET8_7)9L)|UKhZ+^sIOp9o-NkKzeUMGs2)6YoJ6M0OWt= z={zRnB>NtMe#IO)+SNCTN0}1QJY{2(ovmF*VVmnRDAI;AiS*YkiqegW{pWO}43F(3 ztVqrK<U2$LX%es+qx>mnz{s&!D!i;tqoNq2aUAB+bR{e>txIn=0#W-)VY`4+2tX z1p-3$|4R%1HyiZmLi?&NFAJQSd$BMifTOgA;)6mbhmIL5q6{Dfi%SYZ8L1dCdr5`M znh#Eeie2`qSGTs*9&B_LVxV(C9Yoi*uC%r{x3s!9v{Y}~JS+6N{PFpF(!=4<8hHQC z^ry#XmhUuRhVOL8UbeeFBv`+DLJ4nA0uqgwzLZ7;_VZy4v3mzDzex5CULPHpzwia< z`UCa^%y_ZChXcOo4+C!dAYKGM1it?M4jrus4H{AmSBsURi&$&a#hx+uLYYi2%hni^%ciZNVFzoEt47Hs8}T at B>4igO6E`^P^Q(jlu}{L&R3~bY zXHWm(wWq1xLsv7^QKxUfk>@TCTy9K$nbmbBU{^5zyACSv*f at 2uCY+f&DDQ^4O at d8e z`uNc>ActPwv1Xh}Z&WT*qhu^Yz7o1;jUW!}TCGw7FD1uP14eK<@l*vXnQ$0$4 at 0I09KH^#vVw}CIk^uEnM z*KidwpTR&&7p*B26rSYUHJeDTK~9l3<^T_l0k}8SMlnHS`Xy1#No^rx)JWv$l~#^c zdK=v)+exiz?TxHe$tyZ=4&*%a`=4AZ>$HA_UmJOf6_f=l3w8linw#fw6)iYI9YWd) z_=|gpZ^bdl&NLPtL`UplovJ7eNmZMW?>x(nJQ_a=Jmj18ebSLhe|7^9kNLGtAJ;p9dKK z7Du~<^s&}(vnREG#78iT$!%wAuCH+TQ(+*hJ9$vF`d-{K-33{Zy3w){z#oOJvwjdO zrbO>5$>(a0k(kq-#n|Dy^P_&2a9fU at Oxsvr-^#k5m=id0ehNv~IG;qYa)2id~Xf zb&F1}u)u*))~Plwpo#9{C3Zp^7QbbiQ5Kfm#432WxS6k}3PGs~6LnrX$pK>p?Sk+& zyrazwMA#y^CM5PprWd5gr`dahbNLePEC+A*GJ#1!n at d$L2zfFL@;Z<`#JPd;{;k}NI|8?gjo$5lvl1l6TSRoAUnMP>QPK1HY>AP zHatkjq~s@(_SH?=o*#7+z!PH}TVklcRr$JXicg?M91_e`B|A7oWXhTpu-$q%6gr&8a75y!|8m)Ha|j`nGDT=Y?FN;T`Dv*e6A`u zk%ZU);!I=Tiwu+&S~8%I_GC~%mD!iOdZQlq?=WJXm!iudtmk~!73@;WztCG%Q-WE- zvvJ?G4+*I(N!pSh&$qH+4rYno%f17)Mrwq{_OTHBYG!gf*uqgEQ6HrG$lFD-pXi%< zlGBGQz9g at e*)GT_NZ+QnkiBU+N}=me*%$mW!mc^U?@|xx`SlTT@8=Eqsm&G)64*LSa5G` zhzpL}r8mNB#`YS>Vw~Y}mFNriJDf-s9)3 at BHYAR#=jThQNc)ZhWpctiW z1mw7`Qh zo4Lm2)y1_*GybI3G$+L9GS6{QM~dH|J+z&%=()N44P(oHZ2sO z&^MT0;fYIvCO`3- at 4lHfr_)cU>#h{cyH>+-W>&%V)|K!erNvE_y^i(Bq6t-()aP^KE^8Bk+WW-x)Tf zy)&*GKxFN|%Fi+Ve&qaq>2<32^c3GAoNys)UeqDVuaL+vqwX!M9y^dbqsOsY>8Kx$ z`qDuew~Bl%~@_FD(lggDhCTO at K>xrHQk<`|c3ZB7}U4Xud;fQip)V`;B(-=P4v zO9mU%{XzFf5q+1^Vu#37o;MJB4S?5bFQ45MeL~)_uD{7Q*1F2WKThB>HZ1$*TLjrE z;>3IlHQhhb-N*_yVij`uq%gFkW%{n3OZWoLL!3<>CGw1Bz1_5hMeCznx?Patm(d!M` zMHdH15O^txY}4Tjaj?m`^1UB4Y8v(CH*Ty{#5=IQ7cZLb^1TS`Rj}Z}nctfiW3U^u zY<|elSJCQ^T!aaF z*_|SZNw|=5x(Mcfz7);}(ugdP$ETj7ww>KVeou*UUaFv}zl-pwCi9u5=CejwBEAv} zNkc2tb1Y0MblV&cL;rl!et~w1h~Gn(W-YM`u#U4J51E>i$!&$VFb(2Uxemn|$jE&{L;lyFZo%1$jK-E9HPx1t~Qwj{VZ zQ^8mdMn$V_$Qx~C@&jgbmm zHKyGVI$oTUdirW1>t!5PiYs5QAN?x@)S&?uJttNL%@ck{bxo{B#2AzI3MDB5)saM4 z59fzeZ;jGg=@s*@L+2>HLICZ$8jSp?7utmra8zICJ_{SAOM3v~3Ma}>+i10MT6g;r z?FrkxXUJZ0E$*rbg zld??u5zThg4aG;$2+_J&BN8!^IEt at iPw%Q4W^>3Lhp(_7Opr~X zu^i1k5Whr%U9 at A?3WcWxP`+*?&7eYSiVdTF4lOQ5ksWrRw=>0>(jb at V>bl{PcAmR@ zhdbq}m;0h+%FPtND^zB4^g><|LXF>Nm9oatOd~^0{F=!W%7q=fS$p?zjs^Ap z{;Bkhz^1&366-u`X}1M1d#rk#wrQ==?k)BEtkRS&kP{rJ*Z^vEaA`>#PPk2PSOleH zr%)PrC><;vuOha at -ac0K_KrBt8VZ!cc0W?=a5EK_3RmXeW6WoNlKScd1YYDqIx9?zt_GX-{Zz^;Qdbdql)s&1FKI z%VC$AzM&%0WUe<>eYBS^F?~XPWNt zdFzr1B&Sy~;^Lb!&%~w~k-zk!p6o`jno!DSPpgyR2&A6I*?nata(R^N7KS?Xq$eud zf;XggOpRd2;08D4s-l<5bF6RtvrNj$Py-V%33 at ex*X)WFn z%ANuIv^;t1kD^wm9vGk@^dun1?53Gbx(%@$rYhHqjQX~(9jAWOsvb>n?HFQy-=Bw` zWsb}Ec#!dHCREF^|2lneHY~;=9XN3DhK3Bs_>uXz4*&SE1!-tr|0!r7cL+3daz3UI8hnAMV;bpI}S3YrZ zYzYWlqWq>2TBs46s1YdKAnTe{l1|;^F^)jFiNnfq2bVju)(^^ArXPJPL;dixKv-A5 zd1dDz#ba{sFC1UK`3x9rm(cADj>}qoj9Psu at DfMCFn2+pCXfes?=On(s;0a`Fd9xc zF>uSHA6RCi56wHbI!m`~FYZMY!%KjnoeT7yWe?HnKNQx=Q*79Ft4BZC<>DzU?>h^} zaf2VTmv*8av3M?bbu{}RcAFafVS60_Uq8C#G@>G=5yg&qZb|jR&^vRAfQ;_N7EmKS zAcu&;m3kWy6joxlCZ4M#ap at mJiBBrTdlpgbIFsnqO${SC%{`wkA&))}AFwZG#^rJa z^4XS`tf~*{e^jas2I?QxWzHwKPJJAqDAwmyv*(V04ts4FtldW*kXgH^yNG*;+`I3Q z3cvIyz4SxJeGE%ZAu_hK_1M5wHmsj~&bZy6%7%yIN);h>rF#~@VSa at e+lJ3qz#9-4 zm&_I1NjPIc4nKS=+*<5Od{GVSU?t1N3YQ)Cok?q3xA?Q at T~z*!PUGMuGdbxZ3+7*UN7uTDIg z68BW;oYOlIg~-(=Kg`*;(Nt3>BKm=mj#5^?`s$4Vl9j*csniez9|@>_P1B~zz#<6A zA=K=`9y(u?EcogxSHTVBXx>rL)G^KDclpLP{}fL>Aqdt+5XKd|)HTs%BO|Y84ScdxWT&rastwh!DoSy-_kL6PL{4aMg|{4TvSWlf}bqt z at rU*MPXT=sElml6P_{clCEyZOgP`@8WY6M_ikR_HC&;8koQDMeIm$>P!i6QIg*^Ds z+vk#i$V8~V!QY(Hu;g at Q)l<6{=lf1PMq~*QjX*{Z6YMY`uXC#x+e2T9ukDUdh6Cd8 zWSASKWo at WE(T!r8S|$J%)q`tL{o|L$8Vv?|FhMF7-}d=~FsYEjnTy+liKptGCLfKj zw`%un#PFlqN5n_K4`p>nXWF28n?r#ZXBn4jgaKj518Rkjiw0+DowPm*@?pV>EO5;P;M>qhlX`Ph}WL7I>c&&b$jY`5RWE3 at 8HRRi7h|xI7a{98iaU& z%ATEj6*7CevY at 5WBJ}Bn(c;f*?={;{dp_H&J!4Ya9ZCy68r^+AK3nlcz$m34Wa%wV z$EebRDNMKQjZ;czt9aPzS{gQH)3#qX5VmqH9pH-fNCz z^|+GpLy3FsSSWaeBElZrD4mPH4J(n^%~}DOfvBiJ^9HDF@*_hTD%-SMfR;0od|Mbi z51-W<9^2qa1v0xt9DpkeiTyARfb9 at E?MZ4Y9S6t+|Mj(?H>)B}mWO}H?PfgZKV*G0E%%Bumlf7l+) zx!ih5Q(hnbKtB00*tdp)PL_zV0x(jLWv8fy63tblE20`hc}~ER9xmPV>{#;Gb&DlG;jE6$nG;Iss4X)_D*4%220v**|w|8wr$(CyKHwCzp`!Hwr$(C&Hj7M{%5XP zGqd;F*BriYo at U(fWMpJK(p2Hc32wT9T!kkRAZK`b3LIg&ez2~5 at Lu5*Sp*79rxv)6 zB`96R7sT^r1h_7L^6O+yRb|dAAMyMev?~z%V5%3u+O at _)mY18$aS*K*i>aRUlf!1Wl`w*tm+mNs5%$+&F5e zTUM?Ua4S|ASt^2A4Vm9FF^b_Q!z^{dP;KlPr{h`^Ax2B$h()>;SKS|gF?Tawxfdd> z)s4#z)sSmV{55unU0TpynD-th)aGzSoW4iJ`CodgfC`ryE|%_fzKj~^WxSv!H&p?) z8aGF_Y}+tB{rchCrKZ6y{FSrK4VPw8XN>fVj4#Vkkro8PFLqooE26x$U8;1UR(#wl_S4Opm-LtyZ4H{Ga&JmOeW0ZG z8gGU~JOF{O>$Z-XFVbhTtLe5&?7eyKXlEKDxjlyLbOn>EEs4M*u_61uoA$&H_zMHPJ=}L9=&!m5o6gYv3v|9-um*-oy$R; zo3$2P*)R;T2Y34zNbHk(q8eI?_$OVZ_u6>TrqKx-NS%zSdPHCXTz~-h2U3z at ZBKwLbw_xK(ESgEGFbYdcM7p3!($e zXi$LEu%0Vxf!Y_7XAQ(Fw5Gx_kvX?fP52c0=|LJh)K<@=ID6KON#Q3b9ZphGy*z1o zV>F;VOHK>pO{P9$8+0PbHiWmmp~TS5K`%9nc~6_dP~ajFP#yM+GhY~3)n{O z>}16klya|d`ZXr!3kjDXh*i}LrnNojFA;58`H`>0&YY4pelqV6twr`YxtoJ_(A&93 zkMG&UGiM4cPUN=PCET6J#t)ws(7h+O5Ar~kQr$Id76vFl_9%WWP`xhz at Lh7yUQDQ7 z%sUxwAT@)P$O?pq8;`t16XkP{>auY6R1x69w1B at SX?Q0fZ<<}vdo4!H0?ud~TcU at KM z&n8W;d_XBz6JempQe6?kD`FL1DX=hlc9f1|i~~hjS;`%4W)zT($ zY{52D4exmU%sQ7h4vns_x!WwRARIV>p}7)Tt&mD*EJ9fxglM=Pgv9XO($j at gU@xKI z*u6e6feM~VSMcOZCxY3jGgG1^xBS*KDA5TvcR169^|Oeu&F0mRa5ObSA0|k zAEuEWTNO$fcaC*^)Q*p*OlayuLJCGMS-oh9`Oc+cAm&Y^FuW!Sy9r{jYV0PSIM~Mz z9Bl7gA$M66dY5ASkE)^`@eX$j0+xPFj6X4TJAL7ycS=+|;O=?7+El~xE39OkzJs^_ zimNurznF4~ntj5+De*pS4-vMFt!|lDE4r|4W40-}xKjO1pm&pdk>%1wvjdOs^2I!t zC8q%+)tXWLGV98ucT;rX>r(Us`KI(`{z<4Aj37X{)KCA_z8hDf7F|wKYR zXBT_hfB*jXck(*_7#VhGWHqO;nfx!To*G29a at ZtN=h at qAyBBj;4J%!*N{_X z at v2?B;VOMhEq&Qmrpl6DgX2?tfVDNj>~xFqXY%nIf<>!OrZ2rpXNj#<`3-h)dW&4b zMYfSn+mw at ATsNEuy*u0#t at 8-k+f+X~gj-ggfW1z2iI%<=i|=;S>41aNRts;zH0*Nn z9u9f}gI4mDRe#w;uG?|g?2#4R8z7EOl=-#&7^@{$2|1piW(Rm13seW{RzgMoo&CDQMu7|+)sSAF*?Zc zrdkLX{?K=&;eu?ZFt-UJP`Q@&`cQ7lmFtYb#cz3lwW1?qGtG?x&6W0+t(5@|5avdW zh|}TX^aq%tr7a%*oc4SkK*~DuI8;(rvUxASqoisn>E3#L$455MP_`Dm5o)xLq(&d! zX1~G2+pXRvVGKBDYxz{R%#y->0JNN;muD=rcQ+5 zj^<{K>ood^o=$C~$V_q9)Fefw$r`)(z zy05%RB{}?+P6W_eO#u(C{QU zW$a;oa9cAA3PUoD2CX%78y{mmJX^#kAR+|xCq>_s%kDuY0{P~r?@CD_A zGBV;~76=O-z}g}C3H%vm8RX+(Kdf(I+FC<3NceX|(It at xx#VKHYk~G;sfteAW_w1g zLG}s9TMplN&i!u6`UMn~e%q8u=a10|ZR(Ruq9(E`<-u#OiJ^iod?e`EeLr#u69GXno|DiP*i4ww2boRYP2cKK&kWvQ<@ z;fkU0*-8=6#&8VD?5{=(%f^zKfTPq)rDAa*gq!iKM)xBWDCwkmuok2b5veK-;r4*4 z874zg^VXp$&??yc7IySDuUvwy(_7&4{dndpxoKOd%K82})&ZI^p$Qk-3^fL>ksN(8 z1d8Z_+A9t!qO{vnn>#Ep?ZzKshRN58tEHy3&Tk_z((8u^Y%D5`w&FA9)KQ%J*>0SU zo>g+z^b_YS-uU4Wpi^;%)4~kLhpRoLh_|v2w-S9nQw)Qch);IKot{l^*_^ONYkqu| zV>El5Tzo2Kx0Y_TImN(Sy8-9RwNQ&cYQ!xiQo2U6fz at +zSZ2b(=$$)V*3`LhsV$MbSE7wg{+iK+Z at OEM`fRRQ74ly8aeQ0Yp>Blt`|ypnAx4c!^9Ab! zRk$OA<975Gyi>vAbe6`&WAP7xO7FOA^;sVMWFyrQc?-Ee9f$U!N(+UJi*14Ha4s0l z1M#2v8(BkYk_cwK04%`XQ?eh$Y%67L(*O}hHN?7&=WT3qga^~m?N7lYwwib{8|FyZ z8?LF$i$`*c^Koyy;&raWD0P?;#IzKLls#1%^#$I6v1D0R6p2KcwWEvg%xbKpA0EZ6 zF}B~a$yc`!8O3M#=NYbv)-&e_5BTwSyFeDYOx z)8tX{1<~b?xH4DWoj!MK{8y9Tl7%z6S3awPQ34)Df1R4fB%`_Nuu#(w%Zbp5T at ZSg zAbdiN3iRsOzgM=~UVHRSe<8Xemu$Gj($~@Z(3VHiH=u4?VjW=hQFcXn9we|rcnz6J z%mhVAg~B?(SXeU4+Y>4g=KrEhdq<(=`ao|dAbAAu&xvCSYFK>sM%Y>CCxm*C;FT+A z?SVRR*zS-Gxur!3`mqg`LqFN*L3W{E*1p2%`BrIxj4_0-IGzx4dnWTM`gSFhkyres z#Fcw%`*4N;e$5 at ua)uw9s#o<{t0Zg75wJX^C49dK61gA5x$mQH4}mhGuJrG-2JoCBGR8e~^ShiuA(b z70lk>2^#SY9jDf}I8R`ofy95L*lsb;J~_y56%wcuTC z*3#^cGq#=t{(L`i__;eGiK7t)*8yV4&;Uq%?~EWGKa5BsLtaH$hZw{DE`-s|*~qLS z$Lr1UCf8Er4gSEVEVpGhV4k!sGw0J`nM$8-V6Ds$Z_d}`)p5ds*E^WP8&H(0zz)A+ z(Eczj5!5;>9_<8CgtklCERNpY at toIz^xP*Hhgw%1O#;-#u)sg-~u0bi)K8LFKK zzrIEK6aZ9sM;lqY>a#|(%2b^COfkyp)LAtQ#a at AmTG5yicGpHgjN!7DbR7z~km4~8 zN>Ld(=pQWwnUi{K&7o%uC!evZX%kLb1I%lfH>KTz>Z at 3tFpsI#%%LzQskOpvtRQwA z&(XIxHK2e7UX#m|Ut!4nkGmNy1r{jN>jF&H%(L#Bu1?V!=M7^c0DT$YdUdq&)HJ at G z6~)!gOViml^%(MNdA*?3ZITL%a0y#}`t0(8TfbQ}-oB_*&3ybB&W_La)%!J=yN5ZL?e=xBcZA{;X8&=G!hcr%&0knZ;ELD6 zzpxkY;w0;EFFc=rC33x4Qsu?!xw?bKf&gg#2N<7qPns7wyVU!vDuJL4 at a;YQmFJE{AJd*K{Oeh`@vFG#BEse}{RnYVI ziVVb*(i4=#d=uvC8qagz>7mfW^>kv&q>P} zZ2X}-1LRFY82aYZ-RB_-5(V!bE8748 at V4Z(JOhDAVU)Ep(x`F}O%&9GVK|*JfX=lR z#oj0awHa~r1dUAY_MmQG4CzJ5%Njd=%PoON(BtNbcv@^FESFafY at aPB7m3WaF(p+J zk||GRFvzC{I42#k?)>@Xj{V7KK5SQo_QxmTKLagz#&6~PFVHOE{-q=Fe+AmVIVk-% ztW~L7Y2d11{h|+&g%;5oSI(8ut_286=)MY#v&r4nK zG}8xG9y)>o_MBp&rexm=U00|&y+&RY z&{b=98fV*Wyk=3;OB$}Wv?us5GU-^s4NJdrP at +vE_rt)n9~8@^DO_?Qolg^#fV8+* z3hhm84w552>pS%JpT|G zBzcrRuRZ+?VH&hPx}C0J`!|)RNHM?RF&M6n!$Y2cNL!sQE(E&`RNp?Z#K+uze9k at 4 zG&px3Lr6Al;=)nX3I#jLZKk70S!so+i;>;;CRg9SQi6BT)EJQ(x(YwV;*S z3FF%H4;lft8$go(wnd2}NhzcJM`TpD_#ASHLb$$HQ}ce>shHQ$^FlQ^Xk$rp#dQdy z>>p&W_T4Lneda3s!I%Ztprk&gpLMvPJ#KS>*!?CfQxqFnV8DuH>Zb94u z8Bqg4V~=Q-9*^&uxh_m(uL;c1nYpQE$0YPS^0|X50p|JM)Y`T zwIVy!A_&Rx7_;=wSyM2<22vtZ?t~swQ5L_XK+v~6{2v5vy9&nmVvG4 zsX4HdEpcxwQRY$H4Ym at K&B2r1ax1o-BJce+ac*=09FC#S(7<0vbzz4 at +?KYorGZe+ zL=C==b)Yjxel at ysmIB*D_)gl++k~773+P1B#dW*xV}rEYu(zLRiQa(QQK@!Uh^6Y8 zpGCX;AD2I!?veD^Y6lY0Ywe*fTTYF4j3W64NIwV`E<@VsQ_BLfiDqw5Q>ErnzjodI z3D;$Tc22f_Xs=Ir!GbfdV2wj=!4@(qWH<~V%x!7bjnt?x&20AnF^^{b#Lyg!Z`l@! zU&b1H++~R*dHyfuxdI2_b?v_(U55RawiN#XQZ+kUds8cODVx;-midu9MY8h-9@*~WnBE&0MA}OAQ zGad8y0`9G(;JPUI#e=%(pA0+KTE5o9PdrX>zDT_pO6j6$(Okv1KxR-o%Gnn7dI!Pm^`lbQbjdzdxg!D~c+r zjf$n>&`-5kq?3=;Y1$)iz=dHiX>#eclJ(O#*hc2?{fCZQbqB7(pNX%*kCsy!;NLwr zSf2u{SJmx&Nq8>4!1B{YfN|5c%vSfBzYpCi_-4ayK~CJ*SoE95-R3;(EOmi at TmUqg4*vWg- zFo&pH1C6SDZA3_!EfL)IqqUC`OZUn8S|>>Ud7XN*lkiphLa*aLZj^yQ+Nvu;E$TlL z(`R4w at yt&N+|wON#I_b?(q$wA!^TV$s20k3k_ at Xj*#IFl?IKp-1kE at dC62j+3yHFe zcyd$JMH($`qYON2Ve|euk9 at zBM~J}^g}0OpKZ6cI&R9x#BcX2I2i%zE>Y6w3WlP|7 z?faT_r)u%+bHV8wE9_JRS3y>IG`2V4&rYy$CPZ~M=Ak2X8fh4sq~~g-Ee^u#%{6Gi zedi3RUzXmur<7PtVb%K@@x>RmY&%N#B?{GKe-!V-RF{W}s5lZ}n%dl@$0;c)1y%2h zOwK{9lWE-Hk)a>7lE!}ZG_b6AI7PeEmW~pS4B1vNI>bb at RT<-0anH94fPvX%*4?;3 zwWLw`^K6lqXvDva=K at RLVy|w1F(C1PGV)nhDbC_^KUjq7poS&0?7yZtp5_?+ITQV8 zJL8lu$O0+-9^D&7N&=knA%dML at a8*vrIJFMxR3!BZx|5a7!QE7!+sS;%nC%mj2&=G zO&p@;HVLGyhe*m_iAZ;g?{X-EI|No6IR%l%{?IbR{z?@MUoIn`lB>bmhXH23#nW2F zkp4zETft}*1l2vo(j5({xH1H|uoCfCig2P-X+X25Ds&A<#-nzMN$$e;XM8|)3p2VV zDjK<$K at v&b#Urfre-#q_T!qyCC{DNGxM;5PqOp$?1>M7}KjE;;TqxNVPQK+Jrct^1 z5up)VvYlJf6e{#6C8Cdv+N9V6mCWBi0=5&PznND;!IsE!oubm>e-cG{qAuj;>YTC`1h<;5c1g>8K*SGk=*)A&b5t}ATGd!TvZY1>D7 zp7#2!&`TEQIhq`CR-)@H}Ha`^*k$hQVjLN|071!3~8?{whA_tk;f)z4qu zE)3$(0iP>!Mmu(Z{~nb1sx!t%bR86~8InJ$QK*Lmv39pA;&pRDe?TNM{*hpe{($?VrlUx6Hz=fuk3YrGmw-><3 z&;}TNuCz73H*z{Oj3$&=CIAG-Kg<%v7J#9XaaPv>Ii!lxaPvXXz;Gj_7Ku|4-&sWc zo3uu%{601$HFIHM!DR-dN^LLiW7~P=e(NUN*$%O1`+ZLW$o7>xK#h~oAAtm}0f#0I z-h?{Mza+_{IuKJoc=z`BD2CJfcfx9v;Ej zf5(+D+&!9QccbK;RTy<*3||;^66O9BRzH#&O9W?yFKjFuEG(8QcM1TgXs7F!Q=Xzu$U$^>iCw{ zc|Yq)Wrvul2v)%k)*cma(>T%=ld(-?XlZ$|uqz1VPhGgq=JW3*)vj=T)|POKETc=w zjkgQk&wUdB_X`2Tb~H5_Nn5duc?j43fiet1K_}T%h*%z~lB) zcUhv)F^Mz+vJovf84761)+pFhJnw5IrnsaL`lzuf(VfCDCMH*0g=)iXno6NFO_u-I zpXd2}d at G1h7|)m7TxFtjED at C8rRcODMY^oMP$j$3Av4w#j at dI}RL*F4(R{1JxJp`& zeYC)@S=g2EtZ~!ifLa%rXM%RhAh%DdI?qx at UMXolA#C8lVywN(ruK�flB9I9;4I zu(i&q8bqvIe$2sGQ&1|ykWZMm0?`UQ4vd-Sks-OYc9VKz9EvGkNkQ{Fq&@RkRx6nV zNsVfJ3B6ho1ba)vFO_93Oxl8XWmpjPL?rh?n{`_A37T4+oUTCDisH=qm=7v{tf6U8 zs|U5%1`G_DcHSa6RR5(m{~^tO_v0fKi#&P at RVp%yE4%Hpln1A`P74C%6VV0D>if&5 z_s{kg#bO?WE2?A)nNjYOAMFYY43h6b@!7QJDqIrb;?Ohhu})+1HKVo3ODaw|{atOt zR=tkun02teMxAu~_?;Lr)2mmo#s`DUy+f?3-ndlCbSy)ivq(jLUWbQ8$E;Gftiee{nqgE19+h~Kp?w5_!Yie2ywc at vwOxz-zyst z@`7YV8c#u=?DJIZ1!%!F$o2_WL)SA^ulxp0v~P6l=-3 zTWVEq^rluJdU6pC8AG%?L7sT*h(Ucz^+vbUyhTP+MR~wqsl7hTRcH`JVuC;qH=koGF?}CRTlh$gvdS}{qVzJVZ^ zh=bd~qiW5cMUtc)$c7Vf!%BVNhcSmD?hiCqa0&uT=b=i+_zDOKhaL*^s07_kx5Y3n zS(0`$X~o)6xjy4!Lui%S($Ih_(LRKHLkgwZ4qEUkXGJ8}-N^aS>Q)qo^DT#D=1d5H ziUF7fL*E%G=LeL$h8AbWiC at Ez{{v7|w9zD>V4g>_TO6cIK74u^D#pp8ui$_chLeh0 zhl8uCAbJ^kew at f7))Y~zZ5LALPbbtq=NYIFUI`vpe6ZoBxWnZ1xDymWH?jk{5GFl~ z#|{P+;ea_x9`zsq)wcSJpbLH&mS?F@#Y*Jil1j^5p at HrADQja4JD!U3;^9#K6OqC_ z+Vn2|$~LVdHQAYIYiOvkvNTm*nJFvZIKDJh*?n;vWqPjMmCq$cZcT#6JH|H#J@{qS zzWcf^_lgsK%FCiQY at 0@MJBXvMF8)uHCwA8E?_llUe}MlvcOn9A4o5(MfJ*-6Pm%vc z?i6yCGjjOnab`tH|K>(F^2Z&~B at qPNb3Qa*b`_#}z+ww%EGUR`7ra(!rEpkIx6NA%a53T;N8&)P!R0 zQ!Xa<+ at w@1$pQVfR4W4sgdBMeBnpAF2k9PDV112_jSM_WDo5 zDQ1_qj$+IiNsoTUc3X|i__y&zciQg5sC1>R{)xRU%N{1O|- zC;<9M at pOIbp0zdG1P6`RQiOpZs*rQB?K>=-PFS?$RdOONv*^8i7|SE3Y(~urHP7Z2 ziV8LaY;>NE*j7~mh>2*SA23`*R%zJG+_?BOq=yP0^gJ>*-Rykzb=3oC4pF9LH|d(& zml188jiksomK8Vq)af?sMDz8EZn(fNe;vDuR6QgzN6(?P6IV_%htt8W`K$Wox(12u z!z6pQ<}#sc!Z=Y{&xNu!2m>ZD<9B(D9E^t2pA*eST-jDBE3G{jiD;&AD!ImzLWJ+= za3<1yuCkP^{#Nnp^r=Cf;INvesr)LPw%$!YmmGcd*Gpl_4qJT;Z_BZu*5%gM at vnd& znz)1-&$L+vW3PT7h+JOk#$?ji42)%e#z3jUZZWn>%(GwvT=Kuv+YLjE0{FRLvNH68 zRMpTRbF-<%a;hn}2C(v43Ru0Ok@^>3O3V at Zlp8{zilULeC5st{ORtC}f_!v~>jdLz zs&}cM4o+xSejre*2>{h7GHj2PDM0y(1?~BwKDdIa*cpwN$WjZ0p-l?+s>Y-#0Sr#x zLC!=_-)up(Y>6s>J>##D_Dws2%LJcT>Y;L0-3RsY@;)q3-}FGamW8A76PCyvfk5_^ zbGg#r;o7t;O|%Q>S}lLDqDad9(7I7cEz^NyjF4f)A>9D_a)coI#rAZ;@Xv7qV_`Y! z4+;dN3-kZK$oT&fC;#5Va%Hz5jl_3RD0QBWvEJyTPpQ}|m6w-z6O at lciKg6*Lk!&0 z90n~Ot;dBB`bSbyvJ+ZBaKFFn#~sj1UUg~{enOC(&Z6eJR!&+L3ky%eVb7nQFCfO4 z at NoRr!hPoZfmubYK6F}gN3|iOaB8BJL1mN)*Sbxl31yU)cujN3CHM(ThZ)0E>YiN& z&+4l*_3A^-WTgk$k!cpVnsoRKZ`+hej6!j6F72{o%rhfNG}(UB7LXx zK}L0U+XK6fHuF~WZgXU2eYc;RO&x3zKYkB}Uj>>+JX$L4<;KMYf*i2{kR|5FQf|=Z|1_UR|i8O;?-< z(t{5A`YBNt)Zxt%GjQ$A&Y-Fpdg|kka4Fu=GEy(Cnh1{dQWJZg(4E*@0f{CJDpE64 z?exE=7|SfOA%-zpaNE4C8Ag+7UGzXE{%3 at Nd{MKMN7tVl|Rc0G` zZnbI=RYkd{fSW}AqBX)k%cRp at hHxgCP*6`i?)B3rF5=9-UhGKeQ7;{z-^guC z!Fxe>zbM{X^|CLkkl(1nmMKonoU`OT9;AXlXw4eLhc~OV#2V5>ac7e~V3fOIH at 7j* z2JV03gMV?#b-GP7{*vvr>Cn}D3%Sv2|*pzGP2yKsrV|c?zb?_#HQ+IdR~YRbS}&x^B{sk`hxo?#+XePck;C%Q88X&jj;I?9 z?NT`Wkdxdpr#MSUnW&BA1D%%V12M4&`9o9?E}=0xKFFA;nl+D#y%;J32EmZy8Tgz2 z$LdZ257L>N*x_#?`gY1fdK7v5ki1KaL4NT>Xkh9K{v-^nAk`0VBq5|$K2a>!->1)9 zaiKrv`>%RJSrU6pP95EzX;6AJRgDT7bE)+;l+R+NiY#y>yyB%pGX1YD6BpsGqW3tf zx}IKR;bfl$Qd63Cf;A<%2vc3XTdwN>*@+k5 at Bn2gkDIP^#2!&Ikgma3vq%vVd z7~GxVf1e(Barjvyw8hel5+j>ArhmIg)hmAR^$_m9$r@<5S~x<$Dq&c->z7n>Q?&WT zeFvoJwEJnEzVgz)-V;B+vlPT`$zA%tj-3Af1 at h1Ft@c_zG59yWtzrMAAM*bg-~YYw zqe at -R9#sO3&tycu!A2H_NO2ti1pEoi>3?grvd9T0EDJ*HxWuoz&KaoHzTM=ug8T_r zsGg+wG5dSAo0Lv6(c+it5>H3Q)cUq2fK}Pt{ASa8x{bx%{Bv)I;|6GQzb;bAhc3N7 zXoDHe#~H~{)pS!xt-liv+CA7)i1kHOC9alo4|pJTicW6nVzZuYK~pEw!qAkUDjjfD z3Q*B_LQv at aVLOzzS3sX0asHx9&TNR&}kedMzW_QQ1!2?ZuDWhQJTGpz~kQ`=YF3FS^ z3#!mqoX3qH;i8Mpp7ulEMx8zZ{}((x;uYRJmc3Jm5x0tWwOu*59$R{F($fi=;-pt` zbitWjt;2U*4_fg2iHr)^m;-5;Q4?Z{%Gm&^)0L{gE%eGjUrN{&T#+H&~mR{lY2155Lujzj`Cw39Iv` zp3wwbhw=k2hcc^PPr}f$uLLz6piN=%roQbk5H+zvFnt zl3l1|G at r1GM(zP3*c%p@>HW;0^negebIzWOvvec(b=w7}*J0_5XC>ONEll`r3{at# z{9R&ts!>=!3Am!KO>x!toc8=euUYWLCt;sHa4FQ6- zvk&tlp11mqv}sFtGXQUD&LGH{4>k=hc1E0pa8rPJ%bVY6h~YShvdz+vfpbn{EDUKg z>JNN0aVLCdaQ;Th=__c6RpBl_f5 at wpFChofAIN`Z#2;)RKXEW1AYl0aod)L$l?LchfnoH4PY&n3T(VCj13RsI^z!cx|s+!t^EH>NMrfk?{KU!Y5u<->> zT_8kD&Mp2>j(o6B)MwB#fv4?twY+To<%9iAM at G+|w<|=ThE;iEq?e&v{~*K!tloWW z(YnMz=5gbu_(AGrQlCUo0e%dGoKPb at I2mKjxLPWs2&3A*zo=+wU7D3OalRt})iIV# zk}WW*0CW|d%Mk>Aj36;s0?aY7>!sU_mz~rWD$jW(Cep2D3okm2PnO%d<`-?NikBa- zjn8P(cruN0E3ti=v^I{H0qs=@N4jg3NFCBRr)zA_Ydes#v0!B7AUI+rQHh!FL|~($M!~Rg+!o+i^eMWf=G^{M)!BMOVN at W; zDlNUaI6`ypgYGx^dBH$ZGgRDOys(OnZXa2EtC3E6X;gzWPh-#wmND$1;49132KdfF zxOR at iXD3>wO0&n*=Fvm at bnd4+bx6E2M$N^~U>?lype;D)CoK$HyRdaAuC&)`SSGaN z8AcRidf9g7#sK$*Ha`C zO;M3=T#rTVZW`L1YnL6EI&_2gZ1>I3ly1Q>*9I%KS6?~S^u`fpy1_B5VNh)QU0*;2 zA295RH8YwiDR1H(7r|JnxO_h*Gr<9}>p(#vN0fMjJ_lXKP36*=ZA44$ZDaq1F;Qtx z;vM^T923QCxAACBJ}mPl_t~1XBKCC1rqOt at jtrbnwLWwOSGxn~RIWZisp!hfO at C!V zPm&6 at TvVXEV97t4T6o+85mIQ1ES6FH3|2sr at PhIyW|ww)&L^9H2N_PN*b at uW(l<^W z(JFctZ$|z)@JqOYl721~ZFv+iRO}Zi81kOSo|>-PFQ~yX7jbA;+FJLa4cwA0=#V?= zs?tf_ZturIOL@~5{bjJto5mIrU}pW$lfaY?Dq5F)u9t at r{)PLnUJwqO62QQFFsU7+{)76 z%I!kUTnt5O97TgSr at w1s4s&crA-hdc^qHXzn2koBG1g9t+wr)k=IHSl at S^9E6(B=2 zw+89 at v0y#)?mCNkYuv{wigurOd8tMhq7`qc#KJhKc(|HESguB1x)l5lp<@*tz$IG` zpkwtSNc<#^6xixhJAY!}cGj`eg^Q=F$OX>bFb{UNqk+RH~gP7j8_M950M6 zSw)zs)z4Zia&9_GWoXk{=G0R#oa@*-Je?AMVIypZ}(@38>l za9UW^7 at R7K(}u6#sX;qt7!x_7(yMUXl$I`hkgf?uNK3HOyC!Rq7!oI?i*3@)vMelh znBcWtvQjQ5o2}M-erIeTp0`)2E&gOzGQ}Fr_{cPB&BgX<&|f=Pj&3hWFl{tU9)(Qe z&2!h_H2ht)ghlQi72a0kdxYn@$4q$v=&S0iUjCW6_`uis6KARVX>gKR^rdZjqFl~y z@(G=MK-8OdrhLkSefnC<&Vr;vWs)9sYUksY(2K|w5l!&(9jN|&+;3SIwG?1{WcmTs%w)j} zT^0q5np8-izslxVL3)dopx#4GLuRv$cQMf&1jr}eHA5$Vdt?}u%fWv*pc1PZEYz85 zB~6ET`2gJug835ZWJ+4CNp+(Ui+oZ;JbnG}4%O{ebHO;Gq8WF}zu;{?b zJbWQU&s=!mKXAMnhl5GVLJKFhm~?l1#5K*4k6NWz}%(4+IY*o?ZPiYta?)s#J%LkewEcFW?|10$M?myQ)4$^xiA;p}wO308kDp>&E=SCXGkOyni8C$sJs(Ay%sVJ}&gB_R zh;%miX981hGJ+hyiDEl9*l9VaH6KAP*3mf9cIG7hJK*sZYR-Ur_4~O_jIX&ghK{nD zD}Ij8fy+gEfRFRrk+T?=TMy5;MbMy(D5R>0?aGRbugYDjVz1AewBX{@tM+(V79-6! z8Wt`~>uW`Wt*zpxla32vWTm1 at gbQ&kA#(JslyvcYNGy;4?+0)S&ps(lr@#b<30QeY zG6d|nLdOjbwBB+Njrc3hvb0!d^wOh=YdHfEU{$wsFA<=Ri6DWY17SIWfkk3t;MN~L z5+g_N+ at ABSIEFP9isRnnU%My*`n0amQYnS*?VB(`lU=NFKF)akE;jetIVR=q?H`b) z_Ihz91t)Lx96sm6rP!|F-r%zPi>MS1 at OS-*S(@JlrefV<_`Hqq6L+%Svl!oH3mUoB zrTN7|L-hbS0_#@)PQb>f3WIs@{4JRG{2s!;xSF%6?0g3)^ zt9t(!a&7gW%HN4PDhq;WBY!s7;pu>lg>C^H`N;u=q2bb1%up^6sk z!hO=8uM4Gk$wE4)ugh9za&4VQYDM-QW*@L2q%(XnGM;ALCWne$07Te!tNw8sOj8ba zOI4oeA4O9u_)NHoZ_Ayy at 6Aw9&8O}CInEwPqdi0MM at y6CCu;ac^YzDVtX$Ex!VS9a z!X3jcAP4T8R?UVTZknc=Q*MCp at SiSGL`)}YU?K)%ZbJ`VwtBBL_p~C#hgzFj2fqTB z(8x_OuzGJBN!%l)!fk7}`lpxulcrZuLb zqgCk}M at M7l6zMBzo6KG9c7!&ZVQH*chK5s6j>A`o1{86hk%V9t=6HSws}vAqy0q%B z8C2TGgMvIHQ7 z`C>jT!Q~gMAR9y~X=C7MhE2xZ5u<$pzH1>3KcJ10QWo_=3~XFJ#PP-I_e^JKl%k){ zj72BS1)G_V-c)hALGpHnd+7o%$?T<)+cY~95bHN}XRRwDS5NtSXlL{ZzDFKA!1&du zIjf*KyFnXy+E6c(fz9Rg$+vj0+O@!0El|KKy4U^r>FY#6$65*5npET&#_=%HVeY~m(GfC|GNsdZ3)RjXS^8%U0{X5KcHWOG%qchs;*t=>K+bga6-DQ+(4pn*HXFEDd#xj1EZ z!x~`m<8CP{H-*>|) z&(*@U3^EoVD2^>*$5*&5m{@7PtG9I3 at UV5;$D0=a=a(Kk`d{>gw&7yhVHc`P;Uh99As~c_bs+d1uL{lD$o%Vy;oMQm at -UPdS+VB%=_g z`N(PD97>&OmjgSMj++F+EWf42CLL~MX%+639%nyxq}Oxpr$<+9{g!R4x6NnQ=^K1dpjeb|Gs0fcj at 8Dp>& zb_X`?9_^NXfiBYoCf1M6Wfl+EaxAC*Klza at EUo?-*q3|85I2Gecl08TXp8{okjd=G zmr^!k=FwQiA$)f1wn{9wrMc_d)(^>DS$ADKwlIyVl at AL7KM^FCuIKh~5?w1oMSFC> zqq@()^s}JG$A at z{g&wTe at g)&)v}yROQCvBnls&8qS*VHV1IZ&RfEF$Ngi+x_!m3H( z0c%S7n?SSs7Jaxow*(BsGBY1Lj4)32GstD%0*_*?(>@B76WoJl=i at B&TDEioFd8#Q z1B2fR)FSJ|9gj8hJFIR-L{bV0wZ}sdd*_EAH+~!x(9YEXX~8$t<~A{s5HZc>uRt)7 zCmvG!L)aI_Z-H=P8-z!zubN~X1-`)p4gx~;r#|!i7d7dR3jNO@ z>VHI0)&H$1e>6u21BB^FBbI3~)=7&nK$9~g@}yg>QKWL^`xWt||I}ohH=3LMOeVo2 z_=r>--$yB)90pLh^Psr&$(#+B=Ps9rvyYG4cPfAS9H|+AAEb)4=$QCSfE@%E3vrPi z1NK0iXoLyQPYm(A at N7QV3sZ6FLe?SksPQyoW6Ee80A;tiS9oQVH at va3m0f0gV#>w$ zUuM`NIEp%Syo$5CxZxJVz|p at vXBUiduJM<))U^5KN6hdu=s|oA`*|WOY+1s7p{5C9 z1zx%=k_k{_)wX)75ya`;9%@10PGciXJ1j_GHUq|9~*;fG$6iZKd&Q!Rr8mFM%rjFdrHJQy^boz=^ zr at rDPfXJ+q^?B)aXmXWY1(C;==A&&A>0afcypYJXR-=g#GzN1^>>7-PyHkvAGjSk zyd62d9S-EsQrq?k-7^+*Ml&5DDMVo%zXERP-V?5hmvd1Zdh#fOV_!$k3uxy+SlU8L z*@GEvS^yHj7zs*a=V-|=ZkD#vQQ}wGIN#h6LoY1zXAE23g*2J3&`g2^1*{Qi?11?> zZU<>J4)vFl(mP1?B7b?<kvzH)F*zXBJm470DcrA}j%&|! zIpHA&;xoLvhskdS!gOJPXgiiQXB~mfn8+^iAuC7lHxJWe)*n9ZVfn*q(wkoi3t86J zDzmGM^$D-`AzMPRgoaWcDsaOeqCCQ04zl#GJb()A#tgp$Z`+)S^_wP`^ByeJwV72+ zuq&_ob=TGE2a#~j$}c0GCihgxNdaTcc#T<>$m{|;aci(Xs5w&XQ|W5zM}0dwuDaoWH=((?^m}v?C-^l`F8I}2?V(`W zuVB~359URy at B=f at JZhC^tCj5Ncgn)8ICJ(O5mZeH0oPrN>3MTm!LAE+KxO#(K|!>o zd5K-4n07g}pGlrRHa?AJyohP1`Bj6FEUr_+nZLhu?aswE-xb6>%AFGwzY)o7Bfg{2 zzep8HO5W{&k{^?gCIG$B%^DH3WY$G#oA<{WN{kO$)r!Wp;y!S}Yi3>i{h2M972B%Z z_L&1t$!~wtbLC;#p{j|OhI5S={b=y(^OQ@{>eA1nzgN~xrLJN;P%r>@h(G6CTo`>u z&|#-E5(MSz1qom9NTcxyw($v!|L`GM at KP#$D^`AXpf1EaW4svrh8wcN8~mzH0-Z?d z3);Uh1J9c}i}LrW?>oBzbJHIbtN*DglK&eh{@1DRKjuCS`#&WH*{|A>ghHAInz}1b z+#Vb?^0HY|HUuX$kf_H`XL51Zu$7&kZa}W z(eQl#x{d_GQ#pd&<9qEH7aSE8MPhDYou*)lh?LmK!X%P<6(+LAMt at JXWhJfU9wi|5 z6TUsayXO3=E!Rr=X&qR?C_TdBFY?`L{TG8C;J0(ENu8=khF8BcF6Od~JufHBIH{3u zmBq8={L1|ThuP0|WjVsC6#FfX){;XAk={my?vX1JG|V&Cw^drP$}>A>z)pnC?Y(Bh z(1t>xrL(h9iG#LAKgS?1^U#1VPKxNzT-TbXQ16FBDmnd&51%u_MNLFov_-v at hT;pdc=e0&Dok4qt at j#7tl_l0rJ?LUyEFN%oS;!aD45Hd(KTvRY$xGm5d`6S?J03O%EasW*XqE2trK)wOq2 zJ}JPN-O2Vy(ueYPIyN|$0QQJ-5X58jJ$V!sg(tS#5r2nq#JQ96QgJU`$FXF!nh449 zad66oPQj6!9${%U@=q}-oyMAHH?hDSj8~Usrx8xzO`&Ibi6vGjbWLj15J#rqshlJX zv~dXyvo=C`7X?xe9i`_5g%Rx09!JcuL^;dHWt}zX2c=Cdvq<=ZwTRQzVJ#yfKl^}P zcq8e*q3iSex0CD+E7Z?=qxV!NqFc>Dj3XlR9Ui~z+6vJoEZOct4D2K8TkXTXaI;(P8#tjx2T$=>sYGZNJ_1H1-5H3 z6spWdkwGb+zn8TIm+|WJanD^;&;1ZYf{W%NOJJK7EWCq>YF0NFr(%1K@#qa3B!&m1D%;SF z{03rWMjd^g5?{=*!V2Irvn#?oDal7yo;ScM-JFm~>z8iVNt?#{go~aF0b{ehX5ibG zs9c-giN>7NUlQYWfzAP{&1|LlkU+CO-%;(?u at tkZrLU1dE=T&cq%-<8SzwYeMj#c&O_LMW-9!TB_BL!SF6yRdFN0h+A%N~n`Y8lD!zqp z-TXN)82sy#u<_TSy6aBm&##d+BMcfHegU&pv14o2 at k;Fc&H5$W-8}^`<3ns;FYwsz zB1SK_Kq4ACtg#$4B0dj-?nEdouDGjRywe`~`gDh|5)j+afP^(MTk4#Qiz zoelXBKq=2S6Ct_s50GKF at E%@k4+h2%td#AMD;|&R;@8wRoQ$B8FQXAyQJ7%%+htB6 zL(XL;j`2B6mq(O$2?U2AKmAFK4kpI{hL+~=>{Idez5sS=~_j9sE_ zGr5Z6xQBwhm!SAXhsYk03vSK=DR>{y at vl+U`VI)D2peCOm*SDNrDA)eN-G*qhD<(e zZ-VP1if#g;{1xd*x2a=XCI`r=h=(co$aXV#Y29#j7ToO6JeLQ~<8cqv;DAejG7gqi z%sVktMiCgZBS&LO$T6dQfpLT%k|*z!HQmB$T>yCSXf~7}AG4exoLx)PHZ+9|X|~kw z7c1#1;vRb_$6%Rk_u1($*IX*aa^HN!TZ*B%;$MT$fAm?C+cZHk&VES^!`C7Wo!%2| zF&rpX<_%LhJ7AO=2bDKNBEa5vAhPJR_5nOSk}f9}QNF!>`CCJ#fB6#(0tBQK=D)tQ z`Og^pPrlkauB)T_Ih+r;?KT>;A at WM%7#!WyFVdk?lcUR8ldvE2s)FGmI|X9!^SB>y zqwVGPP<34gkg(WvK#({3N at Q|Epn`#dg>MCLFFSV at jn4F;QaofOf)oP#|XG# zM4o@@^AIq&AQ)9_#dq48LQ#f$5}CoKy}0=pSHV72gho5%Vqc+ZaZV3jZm?}b9j|$V z*)18UuwKy1e&1Gc0ojBq0IdV|*I(3u6UDvzgPG}%T` znbzDUE3IRCm%CK2Bb}BQmRYzj7ggA(y!K=U@;~&kJRWcCqaw1_S0^si>nkE( zS;H9i!28e=%E0c^Jvyo|r#_s;CdQrE!aM9r6zWYFG z%zeG=6z at y-aribb*7vNypcbQE`eux*UOLn<*ccL#CU>Ud6m3%wsST4fLQ%cmioBe# zdxD_AWo4BsXiV~s>TPg~sa at frwKG>9alaUQLp0 at FPD0&eyWhwCo+3X_d zO`rPDn0jASxnE}X`$n-Jgomv|cx`&K6Pz1|y`753Ol!>F?M~F2u6sEP2%GL6%Ph^j z4R$;>u1Ts`I&_9QbEt3ogl3k at H|BC*kwVC0Y-g-F*BL(#uGOqA8Se>nuT~7QsAJ~X ztTG6N>}(@a`6os1(g#hL`Gp%0qGs{Jir9?&i at W<)EOcSGMYl|D0-k6HA!=-gI+>-y zdis4+zQ;_j4-eDNj69ki(-~_KyAreNuR*=)Alcc0aANkT8X=1ywkuxyD1Bh&Hw>`9 zJqwPE3&h=k6rG6?mP})-n#+;xv3;aFiQ`V2SBtzrlkBJ-(iY8yBM#wIi#*70ENYDC zQSpT-3;0HTuZ}xY`BF~Lk6 z1zCi8(AO+;Y~)uCATKvFfRE-QkGOT z_~3fLE{0Lvw$as|XCGeffG_)$S`Log4l;&amL*cWLP59MXzdvXMCS+OzbZ^WgJ-n! zpPqmo=D&U}=6_L`|42mswS*B^2MhpaNNEe60(6_ui}Ic%=(JHFY~Bm{qq;&e%4XS* z$!Q9O2935Ok$4MPkD`QnjQXDTBL$D5_BO~Dn$c at dT<11Ay)SvJE;}hg!F<#Wm+*pvg2K{Z<4cZ25`UrTT z$Qnhp7DK3SiVUm@#TBD3$y}?l{jSphcTz8sl9Q#O9!;^h^vuf)`$i2_-lTgqw*pQA7 z&mxWV8dcvYuaapIfx79yIm|F%bCU~<_4doEpAtMDpJ!m}5Ah at _cb#Q5(BR63jP`$| zcmomRkSkjsj~x{fc=9KC3%-1?+bpU=#mcqASV_nd-8Z!#RO<-Q`s7^0QT-v`f9%P$ zt4kJrMGdKPN4*ln1DG)4V84XT-ZC!s8zp(9O&eB#frC{fuHI(J2 zg5aXUp8CZ28QczUwXT#A?5%#rNmFLaZ~=aA8`v$^mm^hqJ*IrqjtdV@!*UE`nW`8M{kom$D>l4Tvl2MVXYY3wVWvw)ugiuDhfN&z#G`!Ozzdd1OOyg6 zVye*1Kng7sFNF$buVX!OBIwf~45RU&olmC$e(t+_oKfw4 at a(B0CNDqz+76#LffzI6M z`8Hw!#tBe%0Zjl8ROPh;n42^-oPmNyNa#gsR%y;+>gm;Cde300i;`A}GU<71c at s4^ zJ^F4nb#bw!cP2)Ej9m^-{Jiwu`h4Gd-F)2S>gK=QMNh`61 at vKvT0!m!bn>YGP?;We8z-|`u-G at Y-spPJ zEFdq|@)Q!?{mYA(EIpwLq`XqL{gG|O5l&*V7FT at ioM*_KmE_3ON87RX-Ud>)| z%#s2FUgl3}&m6ni1Wg9vV915$*Cr98Zs0wX1`z^OQ=DTes)jE>G`d(8yI6$-RXI?= zmRxpagW(hsx(X~Jvr(BH7;Gva%Urz{G%d8;cKDD(W8Of53_Gv{L+w)XthY`kY&Z9! zjtH6W7=?79N at g%tO)N9E#v!DmGJ^Te8DeTjEWD$a5mLS7w9M6vH=9vZMY5J$<_Xnr zmiCnrE~OD|@d7`ys2vjlpVTL_y;;H^J&Y3xUS7)YA0aKG^t+rZKaROtkv3*MQzQz*zDr_vB097_91 zL0GV5t3-^O=d)HRo+Of-P{D#eX9~Mc_Lj~YPm*g2(!jL2 zGUIMRX|9C1+D4z^GMuYQQD}h!0vb)(8V-e+9`EL6dmU!9fxI1~ZQ9g1Sjkuj&L#a6 zA4RkWNy|YqN at hk-olu9dZhmLl9(C%}8I}F^1QR3sR2G%H^BdKVWG}TPr`|DPvKe3s zX?aCgJ_mEzE;j4QT`6H|y9H#1%o1DY-`DErk7F4C0x81`#lDN}7-t#Xp24yD^`pmb zf5CAy&go9R=6f at gMCKZA!PSD%X3+t at V8klC1tj?H4%!`Z;y79m4%bEB>|UY3{7AZ{ zdeiAMGJnJPkyuAq6MyaT76kObH(3?3_!aqTj^D3><99d8Jrc|Ppr-Omg-fch+x!jh zGavG6P2#mthja<2xRvzK=T(7tD#sJ$G0w*G+^u5I!FLM6>?u1Os=OTwiRCt7rit4w z+B|-_x}wc&v-iU=*~gMDf1McfPydsxc9lqHl--#42JIrlsVx1G=qcA#?wEvF*EO)9 zplfWY!F|o#t!M^4tWqVOoHpOzE56D-0H1QVlTMyUgRa#!y(bH`mzSeHZs)J$>oFU; z;=ddEvX at G4?fSIjbNF5K91+W)R5SX&FeJ<%Ge`Ommc+_Wvq8Iqt;BczH|&?_O(V zfU?J7_CS5U?~O^0Dq8&IbAmV}E(PNIZ$0=g%|_v1m3_8h)CU(57}tv+qqxpVa^3gs zFpK&>Z1khQ&WPS<8f*g6?=E^IaUBb0K|0}%3{H5EdiMxKdL>q-MEK=c at i^xjf;W+~ zkq1TPQ4CsA%#(+3?L?^ZV&NGLXk0dy^a}?oLM0cRjz^cc{J-*U-|!R?0jb4PqyJ_y#T9S^=FBVQ9!$3~$kstIgEX^~V(va!l>u!_ldTrFeX z*hbN#m#)_~(J6{?uv~N>Q?fj118H5}6NueqvvJ3yeBP at +Yf0!!PCIQrRHut|pD)ej zXFr2Ho{Y-IQl9fBRLhZVSW4MXp07V_?D$6cJ$dG&xlvs%ayqh?Sh!wbC6g*>5{(tw zlo{!ZNHG1Ej45I}))h-i6~-?cGAK%xwMg+vVN~lIp`{qt*wIJ8l#=fCPoxh*;?S+H_$hnF``XXy=7|_H%m&NMR{;&r+NCnpU5p_=_ at i zc`3Sw8GzegmnBYo;w#E+#sDl!ESS>>xusp~GP&ghL37}(*IbDb7#nw0nS at h@zqp78 zOAIzCrEX40To>yEauLR|Ea)*5Uj`Pi_gOMwBbX~=g at Mw&E<_;k`1ndp=4ue+@@F$ud1 at U+WRy3D^s2_!Gxy zZf9y9ycFZ(=Qrij+`tSkB_>X;;LY4Os2S0&h=KF5TC=e{U;vg!2=Z%`u;%&Zfx1dy zt#C)8 at I}FDy9()M(6?)D&4@=Gssj95XDSS;!=G!scooiCvXRVM|(`)=!e<=Zgs#7p4m|jqPxiXYRi$6pH{pY|(6)VhS at s{H-pX%BN zZIG at F8O6aQWs~H*4&OO|OMu8;CTER}ze&%@?`GKlE7xme{~m#)fjfUtY5y8M)Z*a6 zYk0q?U>d>qSvskhy==-G%?49BLdOkeOsi1N@)~myIZF1}O$!d1)g)}1?E!Gjs{4}# z{~OjV=#(S|f}#5QgZ`FX7JBXqE4jXHaPu*4?aLwWyT_oGgw1hlKgh0Vj%^|MYGHv< z+ at sEv%}LLc6FCfr{HCA0u;F1JmlXfna*ha6uyccffL#1HQlG5<@Celml+Z-b1?C-e z))<>GE4PSM^B6{S7X~2u-~tA;XM%y3^A^-_>*N*n&5Iqx+*r3P*?#RE)V4a6ZMwn{q@?c3_cM6m9(`aApQ;nn`6fksLr`~V zYacS3Y=0!akRx#HN$X_sC>&gJvNDhn;?_}XY`P|jiAQM%$24oKol}aYzU+xW3ElMB zfCwmtxlw^EZ2swH2F;^{J9C{V^T^9NkXWnSUg5QdyGB7egq|h>XhT0BcY^F6S2I)lDa|w+%f)cR)$KOr^Imy`Gx%~m4#FziN z)u;Z=#KFbV at teJc`9C(JfA_D8)$RXa6WOoX(P|ydRs&sKxNHS;|Ie>L%z`Q%B_X8z z>bqWTaox833r^;T|MjIc7|ToVU*7f9g8~gCd*{A`rImY5x|Nl~kB^rRaAD9>=K&|J zABSknPE3estK{EC at U)q0t+xe(oO{kEpk_^_u^yj6f7(@_EUk}qmA-t1XZfMzm2Lr! z*{?o&Fy?*Pf}pal+C>-g6K$o-?us(#S(awUVePNb@>PMh8?NSt^GS29v^{r3usvG& zBHRsY3HZsvsjAG6pdABu_1eUVZx(8XoDH8Em=aPsXo4NSzAI|-K$f*=JioH at Y+<|{Va1@@;^?15?g{tZoAJ_ zS=jWWuqWz2DZ`)6o^JiY{S|QB at O6NGBjn3_FBYE+Rgp^zqZVMS6UBe6g;VcJ?78#8^l9t z$R+oC3q(b#w`*uu)MYZUMTlfyw%3!Z?@sELe-T9c-WnYReTGu%q7g++f2a(t z2AM`e+4|S=ak0Hl`ZT!o$L1P!gHq?=i=pdaz<#4u|D_qHB~wVJt*Wf-6iRY(p5_oi zc*!!cKp at sqV_!1(b2<2T+OMi6hG{z-Z}>Gfk`}c(_~iq}e%mIKpLaleE{5vFm3m0~ zltH{4Kc5i=gfH|eNA)!Fjv at I8gc$SsclRwy+-s8*96Y8!PqFY#L2?fF>Jm zpw9&@SppY0c1{d7zXmzu=sXMJL(E=OL{93F^W_R-6_onBtK0Glm+LsP!u!DzV}3Gk zMzfW!S20>oqXZ3Fr6qLt4pcqok8S3tb3DyVIn|)4rQCU5JZr{fF1TV0)?v;GAah5v zm~`yCt7)3IQ-(SHi}pD9bIyW!;7IT$<7jbD+*Rab`vPKrJID&jBSlR)QPCTgWq+8A z?FnGR9oJ_gX#@4LN!*aI(7_N5VccC|w$j;gcyq~#2#I~bNmC4e9G7qxwf{K}8<$ab z{iJk5A>@=PAy5kb3f7Pfjt8cx9?T0W-$pL=Yy&)!`b%%$Q{!L6U ztt7o{rU)BKj@}SbeVjR>Uf8N%$9>o8*`tk z2#Fhr11!pC#wpuPC>Rn0phrgwd(9O!Xa{gfc>JR4i{{LhCfBooxhB=xv^!_M3 zw!r-QL;VaOQ;XVk(Z01Zj~bQ~AZ)687obbzlaW$KpMJsFu7~=OOo<$X)Rp$s6U*w? zkOY{My~|f<+xlr`IpvYwz-HCm{RvVV77elMSwtv_3bU^!ogXLsrC}^n&V&#SR~{i2 z2Q^gxF!;P(3O5D2KyS=qW^1k4iHqWqe}^S174eCLORtM!l3;TJvOyEa^rP$GAcdXZ z1f)MybePEJa6TouF8&1cv2g zJ;RUed=q$b(XEpkj6Z_kK!rU=F^+ku8(r=+-a!k4L&L+tNcXF0!5c5C)PdOtUpz*H zh_bDakb{X7iF{vl=B4c_G7z1`a({ZAyw!kfOA9G1a|o?nbK}r&yqLZ~vP++wUhylf zelv6gin!0Y|PEQKMh9_CmRvZt5>LT?Yj_z4D12MFu!pjI}g|c1nWj z`cuBXEsqCR{=xbfc1c%qmP#}9Y1dzaMKQlU^UZJ*aW&m4cQDG_h}Q>{pB`m7;!34n zOJhwuKvriluPxP3U$bV7Zht&a^#fjT=T0iG_&ONHDASa?;28|5B$96zDJpOc+0s5+ zBL-$hi#F;o3bpb&rHwF<+>$4m-F!KV3b_d?g{c!&c)>>!j-X-Yf1sPWV#g$EiBk*D zg{-30_Wgnp4RM72fk3G^!zPJ_@*a-2e>z5$k=Y{g;EweT>coeF1TCL*6UfDpLXS`8 z8Ufv(N|)8m=uGL&ooGKrqXAJLtl-figc6&PNa5ffWlc5Eie|ZNKD*ao+4?m-lmU-JOuB4pr{$Z*eB_fg6LxKePZs zgMjG#-=W1nNTK;vY2Fy!Z<9rn7fv3z!&xPro3jZ1(%~Bl2 at 8Dqs(!&%n~Ido@>Da~ zP0by6g0(5R->nqR^mTjOQ?@CIqr;p2*AamL%vq3t3GEyX_ianjw zeJxDeCP_)L5d4@|;yr4BqnLu>Y=+60Y1k1~eLC$3lWwl6^0rn}?iAqKsoTbExootE zmkoA#Qzcz<)f#+cYrRe~9Z+XhBYmLUW~SiOb~PR;=lV%m>+`UoA z9Z9kg6VcEJKz1juz{wEvR4kYmpPmrZFo$N!%%rtvDZx3Z at Mm^xx^Y`%FCvNXlhu29ijHK^z1g^m(*r}jOQT_ zmfalG3`QZTV^VV&cc{p)27G>O!`l%!J&__UIIWSYorYl*o`n=!wB2jvI at RQS%;994 zhNc$BrnhhOeAZ6DLIa(o4wwC8X=TM!N-NC{Du7&HxH}m8%kw$u{V>m+4gX|sDg?h3 zHvCFRFkZ`GoDh^PE`QbU9_EkKAmmzkg#{f>Fhk}MD|{CCnon;8>^4-NZyJ0AX}x6B zPc&3ro0Q=F146a)E}LDZ3)BL4H-(x~)R=pna5J*!a+f2FFKTj$ZfQjv!TJh6Seu|y zvNpx2TVt!ItM at G0Bu7v-pjt%h2Q0waBTgG**lmV-p}5_sLBDN#+$|x@;=Ti}*3E5+ zHga{Df3&6b=cLAt7Q+mT3eK71Ij%S)+9&KIUks##G3_{-2eJRslLz_{-$07eZS=D6 z)`?J=!ph`Mtw$Zrhxlfo12^s&E%nc-&F|vbrCLx~kBS=^cX7UuzE$+UMkiQAnUZ?? zXBHuOp9uXcm%5}-t(U+-Knnl7rS*SxFe*O-6DJ`UL9(X6PxhTc8|1w=AduwvcMLz at +MI zx$KU=(jqdHU}g0?i|4n8`ID8{ki0oW;KIf!8{C??GRruF7o5jViZ~!x#^3Go~1Xb0) z%;TnU0Ja!zgUuS5JFaE6OAQ?JmB+RzZEo{}O%N$=OifQ5BC2ljuYTJu&PGk$afVvhI3MKKK6bI-Y&I9 z^hBeZKx6Im_$?{%3QTuiESrmLGxIQeg#D#SO=h77=qx6tgRx|um+9ZI4PAEzvC%}1 zet at W{#;SzyUX3bCYQ=uiUDIW at dNgm-aj0_O4t0izH)j_8hVoK!Wi at uwSx6I}IaO-g z7;#x2q5xLM at 7j_jCw7CU>tD$DY=a`-$07PbyJ4PPb;Z#e7us4CcOaHAI!R&_E5+K6 zLJHHrl*K&5-c&W=Txj1Zu=JlZjyINBO;h>&{_VS(nQ1U$&xD~2M%QS|Sy|pz8m at +E zLsYE8qB7)gmZ;LlIvf!N*CL&MyNO1{G7N$v_9V=n%FW1jcDs{O7f~NoBd*rF%-Yq9 z5mUix$voYF!UW!0?XDo^al^Sm%|91w^g__)bBZQ1a>C!DPH*RE|BOX0)T| zXMLh}iMJmRcbKE29pedX#&_8{MczSBjh~Pc7hn_k%=O|1*t!F^2DJ})p1!@1tlWM1 zf?Y~r?in at n-t}sq)9Gpvcn7BM1*78?;(UyhYLm5JU?@*=fI6`5>Rc3063f7=^tG*u zf;*iWSE1aSoPYqvVf$g#gN##KfW-PK0IpgyNuHhlwVue at gKcOcQtTnl!dIV zw;)p1iI(wh{Yp(LY6PW*!i5UzN}twxpJAu-dJEru_63E2gP@&|$A_Mn-pGB-Q)HOv zk5kn4;{F#YC2>WM(3r=fyxRbo?&W`#k~Wkri(h}rvekbhW&HmkC2aqk(EdG6si=oL z_l0_Sr@&vi4vPZ4Bd-dhR6U*)$@RoV*Aym^GMn6D-{=_rWIJf at uavP89xVfk^P2p$ zgZuQw&vvWF{ogf?TcAZ(lEGo-&?LXGSp1<(ptTPp at rPhl!InfDck=zEzzE?y`;c8@ z*!kK>w`uxaXaA@|r_JI*zkPol`{L%;qZm!K6Zp9plTuAZEjzs?98Oq_21+f3hVly5 zI*xhbKP7lDo+;|=Xo~;{!&``xk!Ue8=;emV!~*f{Fn^3$eFpyCzED%Msz7x~hEYvHC!=j{smI8W;3<*QLxx>StRM6d9Y%tb&<+*Nc0&RR*p{99>AMbX+OowBjUxOr<$zsw`Z3BAm^Ukr z4sBhE#Nw4jY5t&FU+taWd->lzG>%k8>rE at Zb(yH+PqMQv4-bj$JqIIB05nu?afNbv zA8_bh%xrV*3kx!vE!7{@e~<7dUBTPHppv2j;^VLInaJ&o)%q|wAv=<4qdWYy;0p<_ zP%WJ at fyK+1W?`<&K_(YOkSJFfBCQh~S$^I3beED2;h0?zqo zWE&-XX5LC at O;^NNB zAzu$D+nhkLEMXoq*a4nuy#5e?Fg@#=Q*4M&@n%0TO=mjlxe~TeJLNZof8`HR2UKG5 zpO!WS at 4p^K{?GaI&-B8n7QPkECqg at 013j83nka6d4K({IT#~Rtbihm_I~RBnN?^X^ zWUah$Vy7EZqq_ZEJ=C_#7Frv3 at D50lb7k^G z_6BAeDZz=3+m7j1{_fu&7dwuhzL&lroh=yR5Yv#?{D#WcrUHFWDG{kp at Aep5FrtGV zK~IET(@8|^J)v~8)nD>=LPhk4#^s+?;vNibdSb6>e{>Dy3YmQ5mOtqrXI}9p8kyYS zb-eHh`Sr#cm3y*&J$ap57OG7;loy3U#eCKi)r_t&}B zTTy1`$Y2XJ$^+HzWXYqnyGlkDnezSU1rz6PLn=w~*ZboGuFc-}&^q6PT$@RljLj+7 zSrVR|smeSk0=y`fb-o7&6Si!yfp0*RWwJyo-KDpf3vl%@Y76-&=FWS=K6?hn&P`o> zgT>p+gV(X$JznsqhzKc at ob6?(u6(D(lqn9E?eo3Z9b43;)Xt$VS2?^B4`^zvf(U#1 zvRmfqr`%T-mkP4w4$_B)`X+X46SRS)gi{!@pA=89T!JdT%A6H*91bIZ_uDb^XnK0c zrD9+bka${|z5jl;&3b*CUJwz_F~&$~KO2t2)J13UqRW=xtIK2?qK{E;nl+=wCNNww z6;J%geumVZNbxj0^^&EXJ{)Q zLjj-t62df4t&1gBa^uCH-0;;_OTmMOW=BdoMn`-hEdn*BE|s%2%gQ0&s*l&rsub9M z+QRy{wDPFD(S<|CM6&y(C}qq&W`C&*n#R`AB+TK at N80oNqc9=nb1WOmEydCK|&zf1I>5bPfJ?;dioe-yZ&jvt|;L z3b^mYx_4^cH0uUD+EAQ;MCFup^CBb7u9Q=;V8DZmrG`{ErLZv}((-Qtjex_|u5AdETG)-51K*gF0WBKTh%}?pKVn<1p%hFeGwja)ZV!3+;@EGpTQA`cF7R-xXX6rxC?hApCwN95BKqUPu4(2O;7jTzp0c?pfsro$`rh2yq zm9s5M{6#^v%1(9~M*ztRA!Bgf*&XCFA$$_I?zZsw%{l;YV`?qB`t7j6{vavEX-+Ov z`#RwyFxY{f at 2ea`Q>}h(@E*yd;tANe>qNe&ZF1!HOooCfc*elF`db!13T^k2PgE|d z2G at Wk7g;F+7LzIJ&DYqO;pf5m9TA%7X;$yrY`;krxpKupQw-3tcLCFlQQJ~Y7hnt)=evG&yF?Qz^Jw-5sIq3el z@90ZF at jJTlx#5-&mP7dh7NftZ!| zsIn?>tPal_3*$BEyd079`DNlJFJbD-S+4l`rq_dFh(e54_0|ag at nk27o)His* zv#`N)+yJ%4@&~Su%E_--D_; z%uR!suWuQ5v1(a#O>!wds&IFe7SWZ|7N;^J-8b#1?k0cMe#gnABx}^foHad^Ye;9B zOn$yWJb;TY1Nk`uw?fMV13#IBX2dL);nK=)RN47%T9d?NM2>5qW2bIqr>+oRdcHX6 zrrndB>~`-FdZ5sELm6r&=Pfm`S!&J2TXocC+Ww;aJ;fouoc|pu7Dx6c(Ru=GdKD_I z{Zk25I_74Bc%fW!`&rdu{ihpV{hm0VRIC<#M^q2Ste`92vfNd2tktIo|F~&|@XmsxS>2P8z z#ngU_KVQet(A+3M)1 at FayZL-^!ca2XPEVtluD;(=!FnNhGNb=ALxJXS->jgGvb_A1 z@#l$ZV1;ICabX#KEFskzf6f)AgvI+ONrVw4?t7q9&B?ijMwQ*2_F_=MSKbo)_Oxa` z&o%d}#`7XR|5btY$%|FPS%G8*0oGW9 zBQ55y9SkohK3cP=#eDP7(Xs9A6L`H~?uNI?KE|6FNz5b>!fFN98f_Bt>>0jFDx3{f z_N2V_MZK#=4Amu&sRvb7;t+)OWXQ(wa4QH6vkH8yjC+Q~gzx(upk5XJ2H%&ALhoPx_H;YsaTa`m zKV!thf5Sp&`Ffm0{9TLBKAs`G5r#M3W!D^95~es z`f6Q<=ApR%hlT$5mxaEB`VR|T>fbH&v2}80q8I%yR%4e0BmZWhvrj!!{1jm1dkB5t zAy{pVQLhn$KZg4^3!Tl?4TXmBU2iB)h?Zi*N6AF8L8FAiW!IhjFAMz^pbPFZ4dMSm-Xced^e$EpYQv#;t9wWY@ zQ9`-IV7HwNiROaIy25Uv=NZl0Kc=3Y*GBo3xo*(-(~1CoTy4J)cF5lGcnBGl9O3B5 zydR-&_PD4$8++d-z4RPI;6Cyv^W58&-&Wy{u0q<>fR294^KL2E7XfFlJmZi+2Rwlf zbYC2En92Bizyt2+(o%QeVi(ChPfXpBQpwTsApdGg^RYUiM}Dp;$|JQb8?^3xB6B>!`%T&1q3 zgr at S>K-<=AkY7-c2PQjcSSxo8 at aOlB!;Tc3VZXj^6i5kLZTE z7gJ+&=XZF$vUm5|6}L49n-^TAUbAj+lO^km%bWLPG`3Jaa at 5%B!UDq~hU5p3x#9;B z!l69Px5L9N_=^YehUBpmsBBm!viiq+VEczYOG+GGJHg at Uz$usNAi5f>CK0)dFDL8l zmpm6XoOCZe3XrJuO at V67vfY`mR#oYYPv#@#prSuNSR%gsswp}*)BYf9cj0oqVB%GH zTw3KYO>vM8>NZ1$56*SC_ at p7o)Kt|~$QAXdXp zJ;o^x3iBJlm{X`i8`01w`~IG0f%k{)BxbA9+d~Dm$vXSD!EX69iSj;TDhJL^nKP)j!JQu!mY3y2^f(*H*w{?98&?=H9!*nXIEe8i0b+Jz7Ez!g+!S?Q*# zfT1GxMeI3kF`GgS?>IU`fs3 at g5%$kSp(l>;we+K?Ztf42n9II8AA(>Aw*K>*&GzZr zvxau2%pV``@5sWagCL?KBP~p393V`Bh}&qD&ny8-!*wxs{$6+;kIF-qAfP@&WU)_s zE*~oi*V>YXLug-Us&Fzo$;~oJ8f{mW45w71PT=NgD=@{JCYjag3h5ThbuBzGCow0# z6_{sG7$_+Jw8LFEYSV2*)2Xs`TyWK+qf1`!??5P4jdoQlw!DEi!*P+aNE@*Qywqwk zmTD@}9HFOAWJpL%)1?e`^Yya4>P52~*yf)(sVh`9)0wmgNk=AXM8iwU#A7hgH~bPM zSc3sLw{Oht*HxLMon(C)79aN(ewsKO|MH?uRhqLRX-dMSpRva$`X7|NQ;=v;vaVaU zZQHhO+qP}nwr$(CZLX?XWvnvq+P!<6yi& z4tK4;G&N?FZnK5fbHhy=OAJ-OEq}iTMcAmtb7 at mGiOVPjDH}9BB*kjPijAzi3D!oI zWr^9=kPi0j=tpkXxVtSp5N?OAX#IUN%SoJAuq4JX==%D3*1a z3}X6ur_3*&@^k2u_LZj2>bl=t!Zr{BjCU=iYA&S}r?~VtkF4Ezn$4=wx9;qr=DQCP z9nu`Q_7D43oo88#>aRf;%I+VVAVac-X62rAAt9UCo+>xWnoePpXQwcW~m~cq8B) zqu^wma!O%C4)!jcErH_NqNpF!wuhm)4bzGIGw16--X<01jCloatW#{g)!{Pe?4Z7 zpzwG^dy(zR_pVGezFq-t#IHOZ*?NId04~WVl;q#T`TDmfhB55NjTe0oR5j>kvTJ%T+PT^ z#UIPiWH+`DF~&`6RIun! zzse&$vVRanjvNI4FIAbtyqgFVX-oEbCTBC#zK at gH+wbS?9$5fYTGK>9Nt!d9CdTj4 zSd6wA>*j?xHVRBxIF-I#YJux=V z at D;?%M!AOJFaLmE0#y{HI?7*7#9BkCFvO)!-3;N~vVUxi4fuP|zcs_IqrOffX9K$gzZV!GMgF_Q%*3N{d11SX=RmdnuJ(=-}YMT5y(sH3oO zubckMijcUO?pIxV at iAoHIfjs+I9xDS7-RV{=a_5H00-(*ziO+S-?p>sjB!#}X}a at z z!+^qdClxF`W*B`2I#}_?BMWuiD+Oy0(b`Jcv}MjG!3sXs3=3;a!B+0}sa(YveFJ}D z#!V5Km4i4WmL79Tm+2sbYbQ0?@2QC;)TD_sRdT?j6}6_vMeZ2H_g-;HZDFD&7))ky zgRv__q%rqL-&mY+3)y7i7FiuaU3IQOol(}Lb#5B=0=t-O3~~X`9wF{0T5})aBMiwf zdUJ;T+ at YD=;hE8lb```9*)~X-u at ZKpD`kYR at W3UQ5{s!H2wq&$ZO_S(rfBdCsWS(ZXsa*%|C{V73 at 5xVL;!#!MF0TG ze~;|{26|Q-+5pG2m5)4ocT=V;n at w^#WC5Jia&NYn);2j|DGg01IVCA6A!yB(NiyBe z?U+wWxKKp^1q2bH;S~g*M}#)YRw at xqq=q5_UZK;g*Q*o$R=88I9=%un?vuH>`DbSC zX3nM!BL2<&oAc*w?rrYp`-kV}6j>fnfV+=mh at q`n9NfFcAU>5yC#)KTM;rvc4$UDJ zLNBcjRnWw;90I8htr5CAx)5ugb_`EPJ?8At>v at CV;B8bPEPKP48M#AX1iDduAR1(c zNQm?qa$~*;3}lDuV3dev#1=?zs0j>ohi*uzC#4q#l7r^JlxXEBB7hsDM`wikP8X;z zyObN$2VVN?s!@7C5phca%@KzjWQTSLsz+&nm#Ai_ARw8jW-KAV5OM7Y#rdHZNKEAS zSVaIMqSwkyM}W7eM!Y)eFqzJ{(=#N;>{7L;M%YK@{5r~UtA~IHz1}z;IH*rPgs%s0 za+lx$w&+IGI`pgGvtKgA_8qY3<7+_#`!Vg+dN at dr>cBR_sT~}Mv6BeiWjwfXpyUrq z&6v#SqbL;%@~P9-PdSahAnC0hY88E at D-Jx5f;CWc$?gFtTCe!21AybpL%P(8#Bj`ma4otn(8Q z^0P8#9$mnN0yW at +s{0HgGj=fXlMtl7feAba`8%ZIZOqsb+WH$@mTSdEcemSJ z967O7y at 3uDUY-l<@ZQl4b=f*@%4o2nz<`kn{b}$BKhL__U8;@*{Vj at IFYBl!yR0XO z>dW^EE1O%E<$N+=qc}t(s)8HcZYHc#4_uLVw8Zxsha|uAeZw8*v`yDt;~eoB?S2!B zJxFnsXAP`zJj6_qo%@~Q3bC7~$o6wKO=E6W>OReVD%pV%9N?Mrk+G1R``_mZ^>4C> z%QzGw02lT;k+g9l<%vM7ZexmFO>E%A?=WSrD0E56o?&xVD>g~i5hw_^hJ9>EE0gob zYCO&&!;TXduY9a;4AbBw7c+*8swwQsibx|j4p(T}mCv6-ceK4M|8d(^E$MGwo@`h! zCg;i#G?5K9QuK7;V(H>Wf&;BPEzd^ZjB1;e at FI8Zot+!&!p>!(1kb{S>pXFsjx2ST zfty19##pT%l)39oPQJ&`U!ilPjY}b_aUz;$fBbV&8Nnl!7ely{hCjD_%t_LJk>nBa z at T*XOWx(vSP=VvrJl8m7mMvL~)VDwg`qj!7LxOJ3goU4I1Hb9gM!Jm)56*s4o~0&* z8$TO;WSMqT%tkeI=eMnM)s`1hY9++kv94#`_nV<#VIg0+TzuUG#%IcA+;XR4S=@va zpR#z0<(Q*ITGu7KGhPrvWNz+QhhEoGob1k#;AIau}PF8-yhLybG z_iCm*Gk%CeCv95>^|WnV>UKSPbDCjJFZaBUJRi`4Eck$??KGXD1)YvPr)wdBv`v;> zj1wvKlH{tn1|lJh-*a6JOz2H*hmvN_F)1l(RStk=z)2+hKyL95Z`g90s zVA~8eG2~+VyQsfL>Q&cHmJ4Us3_lPok8)QVq^7e9Ub{ltL%;xl!Mw#2KEsemDS@(O zxk))gLpM2-u>+e2Y$npr^X?r=@}KstXSTVX%R`}+UKCo&a57iLWa5}xk~EGMNE~q* z$=7j_O|8wHc~X9h+18?#-b45c9OAA|nQyeM6Cy;pUYKLTw9y$E$l_3Hm!zb at K-8u4aWJCoYd*XyWrjM)x7uGT!YP4-CCextyVnmjB|-* zG_IiQ_st&PMjV{G7Ep1mI#|Pn3!eOI<*j6EMxQG;umNmVeOY?7F3Eq`W at 5g#G9&1I zi#uqeXZ69wq#L-9(G!2@#%m7LbU**ScXRc|<&tZDZ-f?@S^`V(Wnww|iLrf3h at x@H zqD2|CyTv&;9B1B?hT$5R%PcG#Fm}Bh%T-HAF)J$gK>0Y?At$%vQR%t5?d`I4;!;N1 zvV1f!nQge1{GdJje)kDYEeCII7pj*9?=}iN$k-;ygT2>ALEmZPsbVpTO59jj*DJb_ z0L9R^Zi}-nhn)mkc`vUa>Uipj{;5sPL9IF>n)pE at 05@tQ*FN%op~LMhW({Sf{2U7* z%}l(|tpaD;skG*bJxxh0#Kn;<(oDCP-zzH)=GyD<&Sm;SBqBdu-$Av8UF1#qu?~(! zFY9z#@uWgdNjO!*p-Q(v`6B%LwB^KsfcB4 zD{JY~mUc&a+|OyK6H|pwBH=uQVZPnglNqkdFKp$Pmc<3m$>e(i?qGL70I55m9*RNu zgA|Z`v-tEwRLCL(;ol9y_4jMEsUzMMRGajcJk(mI{RM|M_0xi!e8HOwn8ghvpA~k^J&_`vTyhUK2oGj)x(vuQrT* zQM)F`Nu9Q-B<`okJ#_KY?aN?q7Nd~}BDj}fu>VX at zk@Iuuqp0Mp_q&R}d zNqm6hOn-5n+i(LhFvml`mW1pZP%*PQGxNV2=$R!>Kk}slpMSo=E;|wt|B=M~n(TKn z7?s;9DF}w-ryaCEbZ61qq)hy_r_HD`w>hdaNboQ5RIp1pje3 at a+!J80ZBb6|e+2y| zDGZozio4bZ;v+w7uM95cyGRMyA3U?w>Pb5EQ6CcJST~DQg`jrEOd;igPG at SlmDC6} z1?nR>jDGcnJR2koX|}Bp$*|5NBw*QS6s`1wm~}Hj_8&=Z%w~(Co-JLBb1{lluou_R z_2jylhxLz1u1wXmg(j+T+aO;1-3?EjqYsBKR3XVPjtv_=2DCL9$9T!IS`N_bM* zv$xd1304Q;CKLx-+0BjjE;&fftL&(xVBT7se(@C-GrUCL&P+8e+WM<&ILJu*GKS0h zC5`fZRMGFbar&lK!8{F9z6RS?pO^IGR8-kM)3hfz-wS at euoms*bqhz2nxwn5zz~bc z>_=lHv9;`alI$b>YGUk7?K(c|-Dg_cuZ&v2tM8sGBrjUQsEbT`IQ$I^d$!s$mu9*^ zZjwP)>Zm(viX}a1qEj at JTW{I+`B#B*>J1k9IgM=Ri_zTGdPS{d_gTu0A6etH+;ZWA zLK>b~8n|OgU-jPo8eRK(@0eb^)v7K1+z at rpwtVrn%Y%JsQ{bP z9w_1orrZnZ8J(B2KX|{S|IAfeo025?gE5gKnU@{<|U2i6cFL(v!j+7 zDl94$N)E6()fogsfE{st_$)r&`QO)G?{2|H)3G5hejSvk^VJ8anfG~9khj2Gd*G0_ zW*wxc at +x;xvK|yCAuoiuw`xP(uzWdDV=VP#3a*iU+mw#1E63KA#@08@`qY9Cw17qH zD)xafsL0E8<)33dgR7L&@;vN?sk5)<0OzeZ|(N!~4`=znErIwN9mSH&b&_ zy!b=?R#3eD`xBPA9-qw2g~}HAvytBIGlhO~2p@^Kl@@loC5JBv`mx{y9gig~G6Khj zAGb>SlPqJx0cf0b!CUKs7mm8}n%jW; zfakGmOgZ;guRrlNpMiQRHrWakZ;g3i at Wa{0+`W<1O?K-px4 at o%(;FF2t6N=-X2vi at 2lZ|W4#k(xvBmbVhivsg1 z1f#+YSA{8kqsTFadq~c4gY*O9XSFcr*>ms&l$JvhsHmd$!DI&R2fY#Xb2re~1q`FV5Br_9G+#4y*K2CH*Cq{?4AHRQvA!3O}3uqeAmd`zhC)knQ3^ zogC*ZyVw1KMTT2%{Tva6Iwm=OnT2|_?SBsZbSt~jAMztNEC+9Fo;x(>N#@3LeDEw2 zFptdC=sbkR?LRRw_fyjFXI#Z?jrz)lq4C&rV`MH8=IV1WDEEieupiKWsp{k;r73BY zg?T%oCNzy34=Pon=%~nRJnUm_G>nz zb92QPLi7Mtgbsr5mAR;ByZq2=Fc{PX8Xtu0WT|v-rSw}!NoPDdG%Rji1h$LSO3spb zJymKnGZ6Y6yA|^?Nz8PNYe9%lhht~PthN_)!3l(}==_2{D}ErYgkO3R41sHq)H)@ueH9ook5)_3sKKWr3(o>6) ze+`I;JWBP%3iDD{S8AqLV{4`O#7eQrg|ekgZJVhT zYo4Xy#gI!G-IDBXJ?jaVYwI5t8*UNSFA|&L7iqkZrQ-%$k!;6g_~0_D+b>kjAM3i# z)$_D<%IAmKTDkUgU+o+VyN;19sl;3?OV$qn%}Jd)3m=@eWYhF#YBydu;aN1XUO3Uc zePL^~8P24cIWiI5Uw}mV6=X6ryl(@w%yroPzg3{}T80AjYl(_{i zsHNSNADU8 at 0ek35UZkb1DK~{I66YkPsVQL;sT8ovR7zZ;^7N&*r7OagAxlg<5cp3h zgZzgapUveEy$vwY706b~Lsy}w9C3hB>sGhCT3h9%+N+QC|Dui}$@u^P0{}#V0{}4m zN9yQ5wb6gv14H>PYcHHeo6?OXNUt&#greH3pm0(w7{!1P(|4gvZfe*i?basxnFN;* zDIyy)_fNT(=~jVarLpBQKh^1T&ON{7-}eW~7*N8Q?VwKghEmzF7XwOm@*KF2IBo=r zBY)s2O^{1FrW|J(XAXPVP$sMEI;zWx6KHn|<(Atb3g%XtO>~51R8ab4y6il~dAFTZmQ+WL zA?6;-unbp+X7NPWI%S at ww=zS^DU5VYiZu3+<}$m?QOns?kX_wn9N|14GZC{Pz_5kE zdL?93XE&a${|g8s$6Ut9p>|g{5uYc_;p3e*)I<^RIE}E&-b0QrkPN&&$T<|f>LQuI zs(q3Du4|Q?r*C^1+h#<*t~Q_U`eqgUa9fl0rSkHlX+%AisPxMeTq&1hbgU&g*|RL{KHpa;X@#Lgj8mcui$TNBAEPngHw4!sxyXE zEHYSRP)bI3ghJc}<9dv=Mt)u`l~s?1vw!H4V)(S=^u zroOBzw#g+ID8mdlmL)$W=_koiOt|^i&j5}e43frQF+DzfH!<;#n3PRr!KF0}3>9et2pW^-VwjG9;PZ2{ncd z1OT7}>fiSQ{6{qX*WzabhwB=>JUd$?K7)! z0Pj+7*L&_I_jbpbg#Y_2o*$40-WEpu-U;YfL&5-v{naU%K3bBdkfd?uSPBWLJ;?(U zHBvoU!YEaJ%|k6!BfW!|;li(iJ5w6T9ki%=tB<%qMMk+(XSSRlq at XcV!neaMQ-4{haoQPLn%pV3BoqWi30_c6Lvt z9abw-quHvev2=@T|07y4E{n+Y#dNv#g`GwHK+9rErkpr5_l9h9-xhfn0#ScGoRjhT?#s=sq6F)-i|TI4AFf1O zM64>!`Te~<`3z9DNXy!Yur#d!*%C;9 at pc)$0b$ZogWQ^sQPP!hDNrmu^Eg&HI1`G8 z#O0gJZrS80!R;m7T&S}+t7_O-rY?)DwCbkP<*-+Zda&rXr!qr_Qpd{;t>LX=mN9th zcc%z~T$$}YU64rFYRmN&)LiOU357D}nYsfEISL75;X$%FN)Oy+sJ6SXk!&cZj6 at G< z0&F&RsGCDu(Axvu$QP8JczBRFc&U^i8sti!&9Sh7)t}XBB-X&_A5uyr?%^j86TQWy zV~P`16H<$^d)!?|*XC0?Y^~tu95>@+^NKMtZo1?{wc*$vb4eN3DjT1g>d0z5>7u&U zPe8stisBaqGm!l(+<>p5V_?`+nhZYBcGh< zRI?;MOCHF;a*MVg#CM>`otb)s&V9xQ=3P;Tq`G1gV9NuPS=2n at KuI3qW0m!(=7V`l z9&w47P6_TF^yx34du8~XO+fU^;OI98^WW at 2%`ItzocL{5!(*7w>>^%?*Kof)@SS>~ z-+*cr(cdJ03&!zX3GP9M(sZ2pjzq<0SP_oFF;Fc)e-r?-t%7Gm8PFT8$qy1^6|>OI zeuBR7Mlr_|R0E3U$iOp at IRuPAY?7^;|A=`#14OkaBE14Ky%QHDh9?edETya(MS0fc-v(@7T=qAD=+Xi5r<_U!`ocvvpnb9 zT};2P?{DA%I6W(g0SO^dJ1D3JDz>B$o2m^Z!>SE436Qh2{9U!i=>nYSy7>Zp&bT`` zo12fIv^S?=+f3PY+pQsz_7g4>8*LV#=A}m9>d|dKwKB9wyLqP?gM7nf41QX5;%nd+ z8HSk at TJfHnmW!e4hc4L(n at wAX?lE5JI$?!GRptOgW1Gw?y47?{v&*(0rnvcLQcp6E zZd>}OXHkB0KBiDZMyUO2JoM_; zBfimAcp<#SxzU6wb)Bj5j8aLep+xmL{Dej7z~Zvk0Bb at 95I8=xjlYr zVrp;6ye`~&La8(#@XEo0b`z at HFyV5;?!FTiY9bEzc^94`V_d8<*OEJtab+Im`y4|$ zA*pfNox)@8?>7U9c(=)h$9y)`9s`CkRKtuGpu_utr{4@%oz%=+P>xwrI|=GUizt96 z3_C1D`)iL1%P`i)D1oM3KUBNfk_|3ea!KD5M~~8mVGAstq$9tfN&bY+8@$y=_+DIh z3eJOE2YN+nKDeF}M{>?2&%zKwC%7k{%F87Ep{*q;*Ln@(7#>F)g6AEQ at t2mM=p{t*;1m=XL)_^^E&$TGbL7J)| z+-`<%*b`3nkl+^79h=-AOkt9Q`ic(%vLkQ#mwToeh-azuU;qFr2mkRYMFPr zGX7u at Cs-@Z?pmfrkYtTt%+#}1LaxAFk+roaWG~z-z6cRaItf-2V;xh`K6BT{aD_WJ zX)a^nPg~*NyekXh|5zhf4JPVFBkBwEHqaBGq#m(Q)=x};OtV< zoL!@O@`)P=TX{;VQNVof>$Rqm8zd{Io$gXGVc0sh^2D80%ata3m=HL8(UL{S(Uq8& zo@{g-lEqn+z4 at n#dI*IS52eE84_8cNI*9#NOrMDsA(0=wv?%cIg9vl<{^$WW=C(K6NI0rVz5mP8Xl z1>ZVKt}DGmJ=WVt+*u3dJ|*QupkbUgm*fPLY8DzL%8=nTr?r-`R2{gM{6wf+ysTt3 zGUW!_*%^i_s_BfYCm|hFso at Oy;KE7~wW0YKZK5aBlY?Y8 at pS=l&ZtHN%@-oj73M^D z8`k3)^rfDs5x!~z^Ojw%_Ux>J@|Gq?Q0qpyK{1;o50SxQ51AuJQ27A5rDQ0t#?bd2 zCG3 at VHo%6_aul9eYtS~@Hxoy9Gw68=542sVyx~7TpaR_^&`^3K(olM1)GOXYQUV2z zjTc21+C6O~da8F=dg=?|yHH|{a!0VB{f~qZK3V;%P zBcy<_2WZDthgKyPcXWs>0gDd4#gb-8ss*THEo}->yBjRCYYb(lB~@k!i5S8u;8THu z%@MHeH$9*pra}8Y8in9G`YwBy`)*NN_QTvBR&|=zk*;i^9j*!-$?Kkkaqom{X@?X^ z8L&Cx?%P(Pfa++WJJ#GmT?&@r8{+5w=zYQ*9gi3vO at op>5hdRWbsvE# z9@~@*z-F^|LtItF+Qu)8V)2bms-`$=kT&N3SOtxJA zll|hvN#j4})7q!^cRlBoP~E#o#(Fx(Em##~IY5I^=8avZy(!I=G9x2+?~rGy7n7(D zT8QhAj6$gAhP-9aJY-=>9BFQ(Z&*B9JC4ZCipWmz2+c>3o3vN}wSU$Y9wP1+G%%$8 zgmrxLR_r97n&Lg=M(Lpa4bv at s%?3r&BjisrS>_%(_PeBgD}H;|GiL}a5v};f4 at O<2 zI^uNNk#w at I@aMojcC--}zS9|IPd=9Y>t9 at czJLF@@&CK3Gx`r2+SCkfT>n3xlGJ2r zdn84a at gH;w;Ncbmf~ShV~J0o!W*|4d3`kpl;^N^ zPod)lwp(ou>ohl>PTEy%IdzL}Ic=mcO5Jg?Lro&n>{hO3wz#b0^`VT03^w_F3H^1j;Yz|#O;~9J%LOw_k6|Jwi+;PoRi|tuf$+JRqk_te3=b&>1KGN at bi@ooFnJ z#tdYan6kGzWCjX{VD!l__~sf_DbKiIOuorXN|||&$i!hf!{{USfe1Z32KjiQbaRTz z#c8x(`kPFf76W1){8;ncLk>&O|E^^pz!gt!JDuQTiFU?v1AC%(2C&5O&?U4<>~Q20 zAVhx;g~?-pQ62vF{}-)BL5I&T&UIeDo; zb at TlEoUeS|#hm}k>j!aw=cXz`K)vwDD5Nc&NMoQVXqsxMgNRrCO^FwE5XCK73Mw`#b>8JCn52}<3e!@8RU^vTT~x=wx9(8{_G z|ELIb&#R6`X{*<7fo=g%c8nqFw96|-nwCfj_E)x7yB+A-b)sraTWz7OdR7(0dYJl4 zYZZ^hHXS;ei%o-~G!v)ll70HCgq4*?WH7U7Obbq<3=fso-$XGz6%ZF|z&CeIf+m>L zO}aNw+C_0*ne?uD?ibmr%PH5S5e|zi9J?c8UcQy7MEhgyI|Ve#6&-N&U7K3Q5FZM~ zU8d@}MU7Oy5OAyIr*dXi3kubTC1EH#DhY$Np_;J77{#2o-#SLmFbNv%tTRM(hM~$> zW(w2?sf3%H3BnrvC6ye)3;SiKD*=DV4HaOZ(2~q5ENQ+O7JOk_{xF*$i@)KwXPdp5 zp7Z7~(#IJ#0n1ETCE;L&e~wI+LqF_!3&xUC3sbWK9sc6m&}IsX at Dlu`!gt((eg%2} z0%n10^Dq*C at QWtFJi`YtCPB1WAT5M`*)d at 4@E11-9D)glKm_3n;NkdWrmstHrE(RM z!dp$L(Hu?z_X5y+ub{{Xc^d48ZpO*MUJyB?%0{ff+=CLmCiq7rZzZeC;|KfYN|64GY z{_dw3|IG;d-)=nrY=DOAy>i=(($Nw{Kt%8YR8#3$(5eMNDk(r*0^gUrl+()7UD%Q zpwiwE$8bG&Qq#O2G}6X>LE%w(j3Q2Dw;!Qk3RSvh5cFL4Ai at HZETe7v^$>69>NQL- zsW?^bQai1uZqpdAdRehyrn0U(%Lrum8*C5jw0ag3@}Wzsl-aG~l$%2Yt#%tFHPR}) z#?tIP&2n$q&9oLd!%WPRhQE?UrqKbXZtYIpraOTEtDe?Khi#~Kfgwgm+-9<7dG||u zqIp4cB{A$WZbcVnV5jt4ZQ`@pT!|8?uJ3{EG8ZR?@}&FCA|Q@@B%Ep~k!9KU znQ4uqZ^21%k?5R%LCgs<#JE9Em at _5KtWfWh1r^z_$ygmr-#m2Pg=n|fjvwcpOPCo0 z4sZvz$BwnxYc}12Ai9d~au!4psY*Mf7pCp&aLyO+jH+=A*JxOJ(A9fY&(0|(`Ka%a z$EIAh;*Psl8||h*J5=(Xh+>uti|dS|>Zmpp8N(byQJ8c1BF;MPIfD=+*Ow^;9j(J1|3YWJ}c`ZUScnr2!zt?a7b zbb&VwBPaa9e~4U?h6Q`dZ6T5rV at i4hdX7v%00SatqUv|xbb!NQh(Jt=gp)>k{75V& znx@!%cZg-d(uDTw1+6#bE55}b3 at e_)q2f*!=1v#3J|+0#B7 at L1@+){nn9RI_58*c= z`oKM;jpX-_fdI}`3^S%6#0iyahLtR`0*S&3t)t3NG8R0Q>{_QBhutCZ5wdkm*g`3z zY&JBKfG+ts$VRs~S4?lo}y5<*KXSqV#Po8e%4U^#<{E4rKTM*boHqiA_H zzE|K+#WC*g03g=D at LXo+vpwhAPUn~PTYP>%oC8rbN}f3*Y|ma486L*_6_G?jUkY4I z70jejrQkshH-3n)(Jq$}O$+u=_sQ%i8uv at P=xVT+626yMv4uoF;nP-R4|Q}RgNaof zagXt+kG_KJFR$s=+P2HK)CLRdZn!|DB2JwpvlS?5*k5-(2V<--%n zlP1MVB;&H-FS(j1k~N9OR}3f7QCjp%-S0^4C~n)!o=ws!sdL`W&e=LN9>>XsFFF^B zR0|1xB~AOzaa%-)+X=^=0PrQ(2zT13Pn-L~MK0*nC9Vjg8=*E_ybwH8lMAoXJJ}RW zCB=IfeK>hN*;Bh6gKD{5^p=K5r5B zq|d+qobN*2EPv^ry5zqFs?}Y3V<6TpWetF_5$_BE9a3$=UK#97C+AVr)?mXvL8`0;zgV%xFdl4Wv9%On6fsBM5H%M>8kIF=Q~yVok+(jFcoxtLL&p zwrs6rLhU-uSfAadi?B5EX2VPt%rG_Qht#yg->^>=nJ&)IAQ~&OyPC!mrFDtvbxa{_ zwJ%u0JvG@|*=olE%`dCK!92sJ)n!F}$@tou$b#J8;!P37ydtCpK0O)ieQ0dVnYZ{DcOPKAhtySzOIh7%wqvh7AtK!0 zFKiiSo*GeS7SySQ_L^6Z^t2E581kr6`9z-l2{E1gnroIyK`!f~7<<@_4nEg}z~eApdpf$u&U zb^`PcI}rW#1ZUz0ndweApKwcO_C at AHBA;-2F7pgiD4!5izPX=36=ZP;J_KW)AY6Xt zW2{2{ipH at omeMbj(?5nn-}%Xmmo!gb!$}fJE_aM~gS^}kjc`{?ro%b1)uSD%t`BAD zK4%bcs)NBs z*J)b>gV%aG&8Au|DKCuxUJ=MIkt zkX>g$HggCDen6PfhnljAmOGLn at BZff%J0m_zx(?mpZ^=k0Xy7t<`5VY|1?pEIi84* z$^aWbdNod?b>uD*<0fiwe9P!14?~NIi|K~hBErhDmF1Iwff6OZY(gq$+}MlJ566>O0**df~R z?1K~#RMVtuY+tD-ak$Dl5 at sx|O at 11a@w at 8*>fyGFK4#ec!lE08*<*QYFHfNW0xlQ!INt8P zpkeT5;=Sb=M0f4B=4r}`v#G$`O3kl}??qvz>c}uDe{whUGIq;q`kdMsrkr!&OciAO zy71L0u(_omocrcxmQ+Y6Eu2(XcXNhExz8=XNreU5>1CK{UTy)d)J54k&Z4(D7h9&Q zm6vu5wC&(RVLx2bgmoZ|Lahgxf7*@iSWCopB?V z^RM0Hb z4apkf<3E3Pxrp(ZD)`aOcYy9GKEugnTi%|cQ~Iy9Fu*l-d-E_N^Qs=8r+M^m7FCfJh>+ zkepH*Q1ntU>JC})`{S??{gMON70Ofza-TV!{E41GC(Hd~e>EEkZ(=0R$x5C9ohNvO zjzOsnS9pb#j7&}$OH|7zNFFla?ck!M$m$zXa$r+MtY&*eXXIH`7NQ}?Vs`zwRw!20 z at QFQ>&xC6^LGcS4-5WfQmq;b5SV~o~Ag<94+38bcX3}o at noT}cNYpm)KL}kwqJ(u! z9crXLD63A%JJ=(Lp>x$J#c+?`NymIti|oksU=p4MGl+&Vu)eLJoU^E1B*?dvX_UYbt88<{eFCjBidH)3h1knG>J3ZqB5C zlQVCEh1MMV`r92ajo_yL*4!NJDM3&h0WzH47{A=a;pOtKkevFL%XDOVw^7D_t13C@ zzi%VL@;}F<|LlQEv1_MM=!`^1DU_g}3OXXSBxM9a5>`Z(!1u|v8)xF!wQbWj@(+&e z4?#z!|L-fJ9%h=>0kNdnyPSV!-EW+q*Kcq60cs8_A%UkcOA_%18K8(66j>bTh3|ZU zsljZ3t6?^Y>zr;yZd>WGmJS0AG%C3CrtQ4+lp(W6($2PA_YmFkmCYnnOQ?fk!%9C5 zyb8w>b{?@ze0r#K at 0+%(p#AgLQ3;V%=MSsKd at ElNGhpCM!U18{px05q%Z_s62uwJ~ zvX3cAa|ZUVs|4CSx|6lbA;LYoYrR_RIs at e|ZTh?>;yZR>OPbt0xzUeKhOmny+IL|w z%8W5#n9YT+T7SYg(aRM!_bG4Jr?5*bZYIm7gX`pX-ZXxEo8pYQiYRW_uGOD}rKm=b zZ`ECM>2esabV0z|iXZklTsAU!>o2*Dv at dYR-%WKFy;g>3*A?}|yJmF}aXeswtrN8%T)4^b2v zlhhIm!Y5Fs^#!2z6W&L;GK&z+BJdI1zJeWsS0O_3ynDCSsH9!W?Hz^R2fNM?Gu)nx;wfGkT>~8gCrT z<6``fli3;L$t5Q)c5gtai=J4_8bP`-N-BXIicuhz^&dhqQ#$<@%NxD(P#2 at WtkV7m ztg`-JSq;iUk%So>(O4;w{mUwyF(%VrR=Y*Mk?G0y7DisL;+gU^*RTwXC(YdFeE#G* z_hmAh`+t2u0}o*3WiT}42&0W6!W6RrA)5lfIDzc5Hy91DHB2!$PN)X%DfHZr=DBzf zV4zvWtv7Dxt*Z@@H6M4nMZbjXo~d9mWiO=;q75rKGW4#PNZ5OOqxkfY>E2UawS?>+ z(27oo%sO{iIq6?`!juL3ZW;pwKMlEt_SbsUlS63AO`Lj2L6SGP3!_fJ-9AHMmpEj& zcV9$|;j-UZ=FqOey%M$$3s8BdyF(-D(e{!?xpW&2Fyu}cWN=d7SA3|S>Ld-D9h!2xX^jzA8O443`Em`=mTE}(*0q+dj&X%P2za{jO&?dwt?nkY zk2p`dcf9etvCe{@>M-t-qMm&BxensFm-nBf;{1cuhCp$&GRNrw-8^a4 zWI}(xY?r*?=f9*z{&pGOlSGB+uiOqOqdFJLcgOabT3s?7Vt_$)bvM~2iU47dL6w$F z#p893&?uFgQ}WI*cO5n-7I~uIr+n18sXg1v+ zMopGS!1)94r#$R7vlt~CfAcdO{AE7V>G7n+*Q5LHIWi+Rm(rDh(S z;nHl!Y at +o|s7cvUO1=mGp^NC^v5q>`yMJ6a3tX8;AC7sFN@(xwPQi!Nb#)(cYHyaL zf*DSj9DQ739!!1In+cKSB8cnlUCt<&QoAJemVX=^D4pJ`kef75zLj59d{KA3$jFV? zpXcKpHADv=n!3Q2iUKrw{V`lXEXaX7h_rOzT80&m9l>Fk?%XlWnD9qfXTo!TBbyFF6JZVDoQbI*j#fk;3t(Sxdl55k+B|?w zbAqlSB&ne+vDkNHiqcby%KTu54HBGXB1`Qdq0GlwKD-mxtzb?g+n7yHjo2TIDA(0NXTU0|u z<9y2@;l at g?`pOk2ZtF-uK18F+SlLoS(dQ?uy+Tp41LE_f`G5(Q_^+m5GvkLnO|02{ z4;Y3qg*r+i5(7zK1Pyb8MoJzN?n9j7NQ8!uA}}Tk09F#*6;*kb>>y%%CdeRspl2-u zvjktiUHK#9nhYmMfI22mY{Mug+wJAHFhwz`li}j{y8BUx>@Y$bLU{EiCTPa1unc9` zbuk!KR at J&Gb<&p|aLqHR zrxHnTq z4t`O6;e;df!D9Fzs^k!EAzD3p)HY~mJKff#_5g%iFkHue$Ju>;rgf9(cAb-LIqwtS z`$sF1#xD9B8jo`!n4 at r{CaOXMqO=~+`HSX*o+N?0ztiiqWop7+*2901#{Fg+u+h;y at Zaj8w zBKBp`2u9IJYSD;#(TJ?lA&%1F=9ggfy)~-Y)i0zC=>m1I;O=0^Fo92`rp-=Y$RM_? zw+rMAux7u1`%4Fh)GP$=ubS)qhz$YuHkQOBoqjl(WIEbCAplsfQ#p~@utvL at ug2N4E)Nb{)DFfr-}N>NMuu)>~To)}=+^Es^dKn_{@*m9)_B6)40EXPfqyZe z>Oyq%19tkm{_WVfLCz;P)(Xek(dHp|mLS#}*&H;L zG)8ZpYRr|;C5a=zP9NLO;3!r(MbDx0}}z)MzSVkYLXIK6zSEO zR6?kAJG!yF!thHZhYcqmnf*jQh-IA7)mvC8oG&@Q-nyD%`8_o=^YQ-i$m36DOxzX) z#Z0Ubmp1`zCDYJ7Bsi)7R;o9lKpux! zIPw^o#|+{Dm#xPu%1kDyaek838>Tm5LNc^lE{=!03>Hz!XmPl>1sU+|5Qr4?Ax>yO zWf at RbX1<#=D;>G&(qI>1jcbujQ<}HX at 8C?t>5qT_n|p*tQmAgNvd5Ye$vyqj;6R<` zn%Ne)nyw~V&NtYA)9z0iUZv$g)0AcPVWR0ljHN?@6ly1iyX8 zvEr2cJtw3ezNtBhJ)7s=M9qSo at jl(wmbS~}pXHof4|PwoP2o+hM2D`j1F>>@9|i8T zik+UvlN^!bHo))vb$m0DxQZMS9UQgz+JR|ZcBT at GaN|g6 at i^wwYvuj?Rr) zhd1#qd4wTNf!_dBVFy&gCADI7=3>dW at nQ@XHDR0Oh-)~oIR=RaOAI~`9E_5woxR#Z zQ1d#@Fxr3%KXlyzCt$L#qdq3(dRCe(7uPR#T)W$zEDrxb2PQ$+KUw_z-IC_>!n5>? zuDwqOpBPgV){0JT8{9>awNEOy+{{y-U}Q3jTd{MrN&N+i^9~RB&s`%0{=9G5;`xkuw zs!$q_ at EK|3{a)!M0=zrX_7ELIA7+VtrvE5U6}gt$B3&hqF`KX>NaH-66vay3 z3$QEDCE~XLB7ewI_MnG0f+GzSmKzS&Sev*~U#M#t5>rfYD>>7t1=^HRToIPM?kHNA zJR^2ntb+haEq>xduKzCd;T8WCZ2H|To$N6r=efEYaF zT0>6b at 5ij#oLxWPcW}l?RV<{buu*GN=93Pjks#YCBf)_}%5V%a-jq60qRF}D+H{y~ zBHfL}r)HT!wker at cG;RvpiR8s+BVxoIM-iT8PWjH9Yb%cIAm7KEZHDUmK)lX8Jj(` zSIKCVhrE4sDka^edaT~{6FUJR3AXAiXqz=@yu#MYEn)7I>4zGRB4!W47*z8BVx at 7c zlzrqOo=4b&SB$JJQ)sj+yqP(5X4=mVMLH)lX_`#ZbB6T}Q(LPTqR-Y~qIp6{MpTAe zRYP_f(|JfI1s-4rsK3Rxx#DHZlW+3{$J`>J%gWP;EjhfI-qPe<7R*Oh{dId3vo_VQ ztsJe***YZ*L0uLqw9_`6Dk}vH at 9lyjp2BqM%8k_N(f9b8?)QD6SWGo6+`wnE5Plsx zE0-J(VOdt^>Em{|V~U9=+YNZ}Q&!}P#%E)(#erD%D)aLa9geCAZa24UJc!vi^|>G- zh;0Sbp4S(gV*iI6u&2 zIbzUZrYjuOnXbDp8D}i`JY<|xgHUzAA3(cFpcu@{c-X8H6z~Iv*=mD^*ow+;f at 6_? z7D8g%2iI^_qk`6_X?*vmyoSa5ApAIJliM&jSV6oa^(lWK(y+Wh3|Mjl?{x=~JOC1j z3KH7{yNKN%_Q`FL at N5#J1hd#SXkjTqZ;{~<@#K6&34MYQ2a!5JU!bWTVDk4)5x|#) z!#I4jpaV011U?knbkw74>nzA36ZCa!_NoqEBn<}WjwmVx}9nu-i>m5CHsm?``t5uAUwD}~km(a2; zg3 at _Lgze=pIk=sUS&|E{9~5Yb&wE!)s?Je`h(}aIJbg zzSa7HR2_tJs(24E1;ido?9XsUP*S}Z<0 at 7;Yz>#fPT(4qK|h+|!fYwm)$BO|)BYsR zk5^H at 1QNB|rq$e>bw1XdW82uo3RY{S+^EP at FV6G8vSSt;%juX)HJ5DDH(7U at TtH~G z*hJcvlyhtg?e->OiA_n|68}m8Oxmwv-k6Gi)3Rg~p?<2Fi7UfO`OMqgna`%P86}mh zFy&xt%;y5S- at uR%8yxJ;J#)CE<}-u(jDY1kFNl{vJ-<2Qm<2M}*r2vz4>zMpHXbYn zAD76OrdrB3n`z}=Vw?6?nt3mpYi4Y^ggLorFzi8+qQ&mkRVNVUe_tM)-+W?m%$e~_ zDKTw^{qB~NVBm1h1lA}j7+a3%z8H$)0$o5PoAq4sBC-e*i= zwDkr!cJwLfL!vcu8LoUqyW7+$r(B9&h&ubq*Gk-_k~NqVVX>sj+b0YWtKuDAi&+xL zsA^qMqc1(Yn%7<##mkwl3JLvYr{W!HgBJS>PuRowCxkpEy1eQSh+UQ~Za9*`>_(^w zd;UBY^S;Id5uD9s*={l~W(Vs9iWumzVzQX}OF<(X)|&Z}aw~+vfy|)NhB+9n{aNGY zZZmvl2~!7L_&jwgQHPyzDlg`V at ErlAU3*B at H@m7#KX23kiG42B7_`Wboy5d5JY z{0v}iSAvhAh?Sy0DGDSj7COg}m%BuuAFD(Za%{tm0bEC3>+GIrQOEawLR^?q&k at GI z?G5?00h2 at hker6Tcp*2C=UvEEa}|3|A5mdZJRck*El#f(VXNJScgF&ZzGKr6a|F+}W6|gY>kEkoR|6Gp$b(6bV#YTQn0oC_rZN&vO zy-Q{eno{{W5ET)1UF6hQ2-6UB9qJIO(~%`Yr?Uz#{_6+>WquFp at E;HGw`>vFEgAb# z9<#EYZhmLA?)+1Y+5T at e_Cy*f)cuDVCsL;WRpaD;s4?Qk>QwLyBEz-CpNtJ>cxAe^ zl5v;SIyzYB&Q4%rTH;+4ks7N^D#y!=*rIcEhMJke3T-3 at Y{?1dR(zdIn1`8grL?=8 z*<{B05rS}j(I#87<)&(4WzmXtWbkMKz7bcr?L%;Al6gRwiX+gZP2?B92ZZ}4MCk;e zKd^fc>rEOsyvu5ZwzIZEO|A(k)l!pgQf(0SWn-kk8ukr9lR8Vyl!?}Omd8~_pse$) zzljjq;<3ZyhvTp#4ykxTX$FxYpBMXMjF3Bx at ft^LG at r#Kqx0rd81lM3{Zp`jp1 zLKB_y_46D<49*cAkqzFr*@fI0+`!^e1SAPR at mUN8`=lHLSdpf%%pw{gaRJ+X_VIdz zNzS2Ru})Ec&=;_Aka3MS8qjnSaI6?a*gYqV`-)IpyWy7j5cY8J*HLcoLy8`+qfU8G zkne^bhO#Y_>(-4E=Ti*9y at D4dG&u!{@@K|Hakh)iQVE;Rf9)Hja*lVH#Vj{;GV-@< z*nMorr9jG>MD`yof(t+ivAMV4UzlzK_j>;dA&vQs#(!)*`ThR}A?AN`v_39)qT~c9 zte_K1K7?T4qU`frp~yf)qE5yg=i_Ng*XssXk&HDI_ at 2n2XA+!!%y zI!w#0|8yy?kP5;`1`=r5ZF_}6mmwE)W`7{U5?oC)OTL=`W0wx_&|;kO8h6sJ+_|2% zNp6&WFp1-MtSIN6hD>hWgYh#(jNeh%TvnL2H0^GXMz7g=HqeT?Op4k6u*erzr>U4` z!C4Z~QO3*RQTHvF8Y@}0HqR0ha?$0=nNPYagr~{KFj()<)H$4qX|CSGx`*{-D$0Y3 z2*k{xq1+1zE(kOsCG9fCyps^?=d at k)a)p7DsP%9Q#T=Qnj1N`^IGqNVY4G~30AArz zWhU45Vk$B{2K6x|-~VA~Ur`QtgDbZj_^=>RBx~_-9wL6kWSGF>3SC{N5e*LcsR)uF zEb^5W2Qpxz!GR(c+vGRimg)gkC3s}EsJ&~77?Sxxq-F8 at Qr{51Fjnn at bBLHljKNmJ z)xl%=xB6rY3h@${!Uq2$=$q&sUIBl>V0rCb at pmMBPLa9L*f`K!#5=zmA@@V#AuWCz z at P1iBxwm;1hLz1TN9qr_e7m at geRjFN@lku`1c~N-t>ST; zwjVg;(UPe$j8_HXH>7Z z7ql*H8)U>jh$IX^aee~LFQ&F*OEu=OHF6LAuAyijO5*PglK2vAgj)#MgvzA?y!OwHYq34o%0Qs6I3TF zu(c9~GE5fqF|~%}T2?uTyTg#oTq52}T$Ec`033xuAj49Covh|UrYJOLWo at gK2`wMx zB>06WjH(Dmse+ox)071oF!C=l16DR z)BMAcL+gog^QyZayvXAv)i{zIxdHIqmav_g6uFVzzmaWo$xq)_=~(Ep=W_2AS1nga zw0N;x=->_15-*RTjME~vjrNjfsIhDXSOc*ZNB}5*On;-M)>U&)GfCTyf3pWJhT0d7 z{WR4a)K80fa-)T5fK{zCqKWEElI|w9jyV093r`sdOu1T%i#`7Y9Hb`&%2vFZEY=8^ zuKCiab at 2Q`GTYZ)WEkXK6kr_}6cg913$f+aY;)3(9d~rRJcjO^;ixk0E>L_`ERl1* za1g9fazMTM%&}Hb$aXg#LCgHZ at kK4< zho&e5&lk*%3Gk|q5|+}cQG5dqVwdSBSByBY_z*=^!Gv?Ul(alq#N-xtMf)^y##w!J z&CPc7yCqhV&b-E=Zyg?Cg?#NfuS}C*hrD~8x;VV}pB^fJWnWK3K8#S8z*uD7cKBB@ zU(yCchcsX{<`@`=>4XzMm0QDh-<03 at LHW#zk)D-4XcfHwjzq~6bVHE at p z@>r24ApN!#?B2x8YlF1WVj$q$EvO=(7dD&0EX2Z>w)*W?fdwc2dpx0G-Gc79B&Z#EVuIkIIpNj z1hLo(zazHz!1$zhWI at u&nIXbD;&l5Hobj!exDhH17 at kqLDOTe{e4prSy2{KGz at lX-rVY`PF4Y0B58;Ohu8ujTD?BN>J#MH8=hsy z;7!-Xukhv$@?S{@d^gT{{;zuf{Hxy5{~780&l28vu-^}nRL at Yn+9l1I{Wnm z;Ao}{d>CRGd~g=u-8N6lQB=MJ+`~;SWEYfo)Z9djp&0gWD_j!eGe4xz&T?%n at Bx)H z8?B_4TPjOx;NI04+RY5ho3fbxTri`g*6?qD+0J-%OQKP;1uk#l-}TWnq4KPEN0aZ`agI%C7) zB>xuI^D^_oB%i&E4J!pmV at UcNJRW$kpmr*-W{ZkHs|- at 7kq>IT5p)J1sFF@|4B4mU zw&a*<IDsEunu=x+rWH;n41 zuNy(9+l6^Qfr+2*2nU1_7(_XzUt;#D{v_erF--^A{psup9S3Gb3Xve3&Vbmki-dOf z&G3PwAYLAC at 7Cuo-qamrra3c>_{%-huHaZY{uccl)RqEPgcnbx2 at 6p={fc3zr=T?P z<_tA^sUR_KMCQk8l@#n*!8ch*O}&|e7(2WnTvddI(YaXFp9NwR5}h*t<$EK{KMgeo zjAI`#{uMbQ5lBsof90AV{y+A;|GNHPt!|@?ql)TFPo(MC_+uh-xFw9W*yEd$d2tJj zipU&vzAEEJ#j@;Li8RN0oORhU*2huoncrT}%!8=&NcmwD!MkG2sV%!S`?eA!q43SN z)2vU9(+uC~)^zXJ$0voqg*Sl+0sqn2sJLMY%)U{T#2BOlf)&w=152>#R>EDl`%97$ z9u5)sFD!9{TLqY)Q4&Bs?-r4mQ5_ znhYx7UWXbjjcIoU^GnDM2_%;?edV&KPWkdsiOF+`^Q4hlxk#1ld33T$r1$)sOS8VE z7*}_^^t3hs(BDI^QnZAO60mO~%duS1kzRdSqNYTRd~e(@6itY=Pzh0(M2jt^sGi75 zhh>6IJ7w%7Ot*l5RPPE`(4 at 999hS`@FEQ_TqAw{_C`~A>l zOIUHl$DFz4&flOfQX7aMDxD4zkog2gjB+&iFQPkpVz)!Qycrt8)h( zL+&wZb01ri&V%i6L{$S`igTo3tEe=U+o}&b at o8)6Oj|Acj-x4Exo-R at QJH^+cc5=a zC#iCkOpQ=obBlFKyxIL(YtGw#GTBcCTqi+Ntn$R^S!du$_X1#aMcH0*477s{kRvDV zzZ1z6G at KWzbLItomY)d1?|5P(go<+HdH5R_x at Q_2J*X7TiyPVT{z9ew#Krp+UV8T- zMNBZW=oYJS;sNgQjn5keDFI&duDi`Y(w_}Q1uv{)#c*bWaU9!p=$t12Ceu4WCf_hr z;1m1`BUDKPTDPg}2pA}f<|1i`p6#DaisizN;J-3M`75Th5emN$XE{*Ztz_P&plvo<4Ay$Pm+1&4v;?zEqfza z@?5X8TVpf>O?tpW_zTv!Cz?rj*hF`b&6aqWK+AL_T!H+Q{xITrk8!8J%EjDi24-rX zdWQ at p1f{TPWv=(+Owa8h#0WrDbgh4Ej!J`Y^$B;YtD7+KZs6Pq?u{sM|V;+ z&12yfWO~c>Qy_t2ASPd6&WR_-Jw}(uc|Y8Yvw3zJg8U06>&yCAEW0b$yD+-|g#gA~ zPqxP&EhcfRop~*1$2-V#Hd6xqaqLuwj1jDcZTVh at 9cb`#sHs*?X`b16>)@3)b9Ol+ zfg8iF#>k3+w?F^3C5!tj at B#RjIk)~Y=a2u0Isb<+|NMh6Kj~pQ*G&SN@=@uunk0mO zEEsBAg)fZ>$BC;V!W|gFSamozPLkpz2 at Ln<^=@G0D`)>&oq56FIyB-nb89?;C=M`a zi*>sB=y96)xRJd-_3QokwnvT&0mG{>A2jR!&>kWEQUFGyaXg=Dt)2KQIRX>^-dJY@ z7=hq--y9{o^A;UJ?_HU2%wyY=nm at UgP)~=L%SN|KiM=UpGRX$_R^!iZw<+c at u^>%W zNII88M_13qZqzyafi{R1x8htm#c$DnM^|q%$b8>n1?|jmbLQpQah0K#!7c|)Nn^UR zvh5h(b*^P+>S9nZ!F;Td67M8CI#X36E3-i0z>C0H5itIvCPxb{=vNFvHc8D8XLFhp z?0MJW5gm!_V4#um>8~Oh$yCV8Nyal1zOx|26Cr6zTqFwSllQfD!N9y7Hlsk^-K;&2q+ z^R@91E*i67P29y zU#QlCGN=5=p*Mqh)!Y}f*!UBD^!<`}*{xhO?vJ9Jd^$Ey|1o7|QARNvjLziVe9Esp z=~oPkhQ|f+jX<0SS)`pXVXHy+=-ci&w`6Ny%vMAbCdeaASb2NLay_J1vZAE5vVp>d zcZhGx?$IGI-fKL at B>7NvUV?Hy;51?gNIKX)F|Gl*M3EF>G5Ad7xK-F81ub6IV4ppV z_59xcUcuE0*eGL5MQa!$dw=)=%2`E^4-*QL^-~a3Bb+J167rXAXk!&x$re>aiyD0- zlpWS_`@+;Df8JnJeFH=;+=f=p?~(`*My-mLMa zN{})y8p|K84{Q6_g!VC91O1>uy`)9I4UururZ-5 zF;5RP7bd;!#UhROQIeHNQ{Y_MCiGMjQiV(;UY3+ckb;g_hDxbALqJ|7_Cnj%a9>P7 zW5J0S497219oDre=5On8Lxy{+=;JY8OUUoAAMuuYZ(t|_XqILN`Y00a|834s#y`(t z4+a842lKxlJNmzH+<$%f_rJ7NYXAMM28vJ$Eu4rg=ni55`8Q1w1xBQ!3JGEf!!7|@ z18RC(*YYbMvfm(wUmu2E6*3wDZO#YfWDXg4e{+F^Qu_Jz->#~&w3K7l&-(*%4>kuX zUta}a#EflUh|hdrC?V0N84EIEBD0qgM@}X)Y0ODtpf->dya{N=$v~Q6YNA+ef|sS^ z>d2SV2KGC}*rq!G{eKI!4hkcmUX zvI*#z7pAhMZRsZngEGu!XiHrt$M7`?8g()mKe1iDPazNhzr&T?;YZk$=Vx}X%-r!h z;`;9}i8rDSH8oFQWh8Wr-zLM-bfwL!0Tx&(s4PH7-Y}mk&lbFi5IKwbi zr^G6nKjK~XDCrQlU{b~nzZ~9}%lu at C`-WolwPrIjl&O`-#reQ$q-c;A)OIY*O?7pC zYLdXI-+Hl8N*%Sb0aJTv__Flot!wD#+t0bC_rpnEDF%`j)ymTjRUlB!jEZR?hxjWl zG+E3vT5M00w>%80soO$DAt>g`^I(V|bTpLg2_|6|G)&DO3zXyf!C*8YzWvm}5wmgz}%Nd_;J?*Jol*Gz+pFX5ECD5CpT7dbTDqnMJ+ zL}33M)~j%6VNgYQ7(d3CQ|Q at Q6p3POLv`U}m1&YlV&miL*0#7^;LZht;!Ct=zJjC3 zE;SFwzJuLK;nxE7g<}fU0m%aptXOTEBHkL9b76c|l4=a*@>}dhh{%BqB;(w74yP69 ztHUW;St_aJKfBC2{MOQE_ at R9_%wKpCWaSPV0l^a58PH5XBSP8Y$|`L?^)JCVcocjN z27$QCWVYAaWq${-t}tH_*1?DG!(AxV$KE~Kk(>=`OMJTBt#;MMO*CQMn>mkd(mOoU ztE6j4q#_b^AT$w5$@8zK`&8~ksQL|GFl)lctw6D{O2#0hu+&Ll8wxY7w1T~&TW}r1mOCa>w9IK&<1aK1FdSFNNWm{i--nnM(`Y^#Be09i+CiJLL;00 z#50A!1rQoaM7&b`E3Tp5b|}IA;+hlse?M#W{~Oo;^N96Y?jMQQ%2KKHA?Qn%NZ<1H zE%J+DDO=R?z1I|?V2WVKKQ$&aR;}G6-J}Nya>p=b??^1YK?o+?%{J-jsOl{`&u6yN zoo>0 at OmC)gdj)*KBo5j!z``c(h{=tmmtP|-U&GW9l1QRG#eRz^&cjNH zqU}D)wT`72=u5X!oBi1`T)WB<*a{PZfzV!`k;9I9tvM+D?y3wGqC!sZejv-c1IvI@ z>aDYgDHQ+CbF3n%LZ>QiY{jH1EI-|As4tpde$B|$f+r!)5~#07cOIcy9ryI>2^^G? zQzEjstfQJt|5B+bH7Qt2h4wzjHt{vy at IE+5Qj&1Qmxm8H_;s)->-c1jWG&95dTkN` z(?kI2v0J7VkyVl&4A1i$AH$b_4ElvJuql{=-}o-cRrEHKILp`{`p;CTi}g#~F!`X^ zZ2*}yQUDik_*;by!$?Lr+ at PzIsXgbUI=pdE7H6OT)K zzBSk?@kkds;WM1qe5Amfx<#63jZokHTW+`ZdsLD7-zI_b?~%ZN0<{16wR`&?J;Ikx z!+1jGv2vfGVtffJqU6Sgm^5RGn58nm7M!T`$A&e%0nxgND at Rn<^LKl1h4hu$x4s}e zakC33?!%XpD7#Ovo;SU)Q}O`hF+h4B>GPJ;>}$4 at -)YwN`{QnHFBoU&G9h=|(b*9A zXr%}bxXk^G5>dk=3Ov} zV`Fik8Tz9OB%P7wfFy?VDjIzdGab8yMRo(PnUk(N;G5mB^Pm|PG7C^A>ePlu577ZR zvPD!npAf*%6M72#E-ryQ5NwgI8?moc#1$4VDn)B^3NAbvWf9)4#6*(?!KY0q`y6F+ z79zUMblg*+V!QwtFF6PygGzGKqq{$O!}siJ(MyniXMSqTD#Kp1zN$?K* zZMw72ogl0^gzdNyNqxB&R?sb&;}f5*>LVPB;Y>r&8?Qt5$Jmr~u+Mt at G@b<*XM;&L zij+c>860n+FU*j1R8niGcRwY>s{>=Zf&O~uGTM~gq|;Cqxg>RktFuX}<~-|)>50&0 zTA}60tBK)I;2HVJE$3x+4J2`v=e5|OKR65LDo>!cWqO%J2dEM7Xhb zMLvi1dh%L?9r~aVn9s#8>l2m=>T3>KOf5!d;)mVgS28#9!aFTWP^)1QM<a+mTaJ>C6fAL*E@(bZMUN=N~KP2afZBMJF&f6Pl<*A^#!{eSgdN!z$0&I0&NC-UMW z@(MQeaw>86*U|fhYroTMo#-9X`-RbdLDG14dhc5$FI8fsEMSRDsOt_wi=8(Jj}b;- zQ0XT5Qboth2}b$y4NKgU1VlcB at k*0QH9(G61d at +exaW}Q3}5hSeq-1dYQ|S~CMJRK z6W+w5cKWlQ;q8 at 2-cP~?v$Aw#a$hA;yQk!VH>%t;LE6a}YHJyekl-n?DyGCxjq!^d zIe?Ju5Z5zl<=+#H1MG~$$`L?7f~Y`1xc?71>z{T&3(6a173)htdgZ)m5HlzmBFzNF zdR$)y^RZ9A0%w-PhWxF&ObZPJ>5CJysx{V_>gmyo<3&-%G}()&~$q)3XiRPY5P|_ zULpN_7h~=AH{YM|fIh3CxBGv5d7}wlkcPf{9E$V5V+!og=H8!vf4w&IeaD at B`33i$ zkgCUYwb~_dKWqLHP4MkKC3TnS<=OlGJO4Y9-+}!2<1F?kas9^&&F6^mXU#qV|2xXp z{r>LDcZM&MU^BLF3nI|E5$+Ba1F~TSYZSafBoPCZFx#Qa1L9G^xnpoaD(Eb%iU)(9 zOo;+gSiF<5$?hW*6GPU(X at hr1S(TSM#VOKjQL-SgcXoM{-#%;9=!`{DC~!V&M5dO8 z@!#>>rBI|<>s9icy+|{dQBD+|%~{c~5MrS*@#@pk*O1{U5>1u*wk>k<#2vgEGTrz- z_RlB>rH>|Uxv{YTr7}v6tgdt9xUusj*lbYB at D^%xpq_R| z3ba|+vU9I*pfOEPE-ep_txdn?;~iF{f8*joQ%pmW;p0*6pi7gd(v*7RJqxZK`slGGVk{yr*2Z!&L>op4W|%De^}S0Uz2OVE|gpyFP3 zhdHZ?dl0lDMVD-bab7}4wox9H&=CmlCF3`4P$gk%G;?L{MZ)> z?zPF|ap4r2sG;%qYar)Y*5dSJ4$HxmM6u087Zvy1QV5ep{rt*BUT_^B`z_(BZlePw z>Q35j<4)=#*D_kF~u+ at 3V0$dgz>*J?fzXcUU=3Xe-vu7x at 2lH@k&$N^zm1T!`u z3}Zj#nL;**iVj7Ujyr7bf&cc(Mcv@)VILh;Voo;getmjX*1TkFEkA%8LqGzFFJu)f z25~`tx+I8Tm^!g28jl^og&;k#t-?EB(3c(xescV+6=+StP@~$O{XIaFo`I4BvvI8n zppY}WI5fpmr8QL0)sIMQu#iwqOZt`tg$)<6`U_>j1;&XK8=rNNuDn`7T}Gwx(cPI+ zw#ox`Q%-Bgg+|8MAN+U7n+UQyiK~bLs3vP!dJ1=4C$Xd)@J9}z6br+wko+JHEIO%A zfjgrm5QRC2s+;cwzHr}MNv)glIE;ec0vh$GLqCp+zT1*jY}eF}6pP5{27zK=kbHa> zKXO>v;3Qk7b>0K)nVD_ZP2>JA@);=8u$MrOpb5>7N;!9#hqlew87O#2eHP3sdv7myWNb798z3#8CcaTzbRg&`}tEMQ3*uPvuJZ8cn8? zC_C+T0F4y|tK>4cwgvE#Vk6h_F5TjInBB_%f|Ih2Ru9DVPt1krczsoTGc8{o_o0y( zwmChWdW!|>Eat_VDRqJpS)1J@$Q*iyCu!3u zO<`*z_9~E|Hz*YHaKl}dcUIPs1gOJs1D5=7OUI(5aywk^*R}O&6t$=L6hH?m$j&bw z`3I$N+58364P7zxjDj1jMwc?eA!j)+ZK%ShpFVBPja;oJ52pdm#}-|w&Y8a-N5oNr z$l;rkbjd6SbjFS0aYwo#J?G8#EPop9f#5U7{aE+`TL at V*YLrpNWDnrLZcBL at V%{nX zp9IwZT(T^fK@{BaAhKn?1KlbLk0ZJmh6UqbIdTP7vD(L)&ka!vvm#5 at YyGs{6Lqie zyW%yl31e$wSkaQGWxNyHst$JnYB1y&?FkozZz%HbS`@4!($P*{x1~<3451fbXSM{8 zYr)qGHdz=J60wK73R|OV1G=KAXtOs)Aa`Z}w?2A z5G^vN7mA6mP9U!`SB!W3j-R-roq at qtiT$yoizb`*%T|SVWX at 8Y*SXcVxJvm>IBG zt$?9Gau=p#oP?qz(({O+m<(Yai3Ta9mDQI+Nf$f;c)h)m+zYCKEN)Ln>7ay$!49~7fTJ= z**~=VPCzwe4)h~WX1*rvA`o$Wk*#QiG@|631qq?yi+TCx|2Ta^&Cl(zh*R42vMBzn z>Um!D?EB?|SG{Di{0u_fu3B+Rq*cCMek+_NKRXyU_Xo+dGd+jia|VzT1P#O&QLOtE zY`dX|gA=!)3&Oek1hc&r$oKjRLB8!pB6~5s!~`ON9c30n_SS=nhMDO{Q&#zgG^f_l z*4q+d%0 at ReC~TgObN1|Mwv8&#+G~v;?&IAyDnSkoG?;{${YcB*BVrYhl}C`>Rwb0p zFtN!{PdE~NctDY*V}-O+L{OAPuCAL)s(HBU|{gb9{b}s{)d9_>m6n+ zsMI?1-9=>F at k4wcb~!iH4rWqf!E>k=Sht_D2sfor!1G^k+0EDAZ z#0D(qijGT~-zeL6HfW~uXsA=Is7AP`B3x1rXV4?MhV2?R(zm8%r@~5ON$DWi_*jeZ zf#~F(>TB1mrO>n-BeWc9kicG|hqzS2-fcp=b~cC&p;HlxX1E|XE)XZT$IT+c;Sob5 zNqi$yA{<5jW&+bev!2rS<23SoT_Va9?x6~E5LeK)tSHqHyK1{%q0c7$Y^hN|Hd1B3 zNeL!0k3qCpH`?TlnQ8 at _SWEKB2x&`Y9{qr-koWHePeMAv}EIi>BcT{a2N31UQnYEH+_N>zuU*%Le-hbs4)B>WH z4h?rOumJbtqE6zwVYM#9qY)K`0lRLv`g~0QcR4}n7J2b5d6!m7ud|HCOKrT`T2Yf> z)oO*-JGW;iN^Pr)$A+t%vcU{Ywy0|Cps0E+XJJyAzR(-BqY??11)b0vch%~uw8;i# z!97o$kawA5Xn)Akf(neOQpZvImeA8xS{KI)c=?%U~+RahgqCR2| zKahYcHe|bM8WSBRP8l5|{xIdC>IGFx;;XpIug^xiC}ww!bl5n-P*cEk6)Iv>K_|G< zqgHHhsZr0sG1hQh@};~*#}$8acCOKNOX`v_sA>tcbtj_z4RUIAQ=!^!2-XK><@|cB z$WAP at 2cq-Q=4{zbzqbda#5bhjfO{%YjaH0JZ6CjZc=I5v;Q(nf!q&2v;uraXJH1P< z6-$-*e4FaLdt*WWQE)_^ zc#k?-{W>b at ZJzf&ZiO0Tv$j7q*rj%8 z`AE#W at RZAmF&ldMQK|vo$C%=F8&0cXhcoM+XsQ+~qI~1 at 38c)3qJ!`)jwbSSkZ~f* z)T?$-0NI1bX7%LSzYk-|3zZ~Q&M_ at Vp2e1S=qm1f(spJPqR@|JOgAuB?sds~F;G$4 z(XV3>ue5me7khw?VGihVhL`k)u6Lj-xA}_CTwVl29m;crn}~bOE#BNY(qy?c$%cndFk`snR5fAGx!z`0}LHK8qopnps2sCGP(l}{8PmS zP5Dsgj=jeoS81TmI1J)DqmgC{lMC8+sJrfdx#Fen at l=d7+Oz0b=Ly7cy`hxN2}r^} z5eL4NI<$XcSuf>^lzwXRs(;}koaKrueSwNSG8~wGNV}JRqUsja< z4Nk8`Pf|g}Ok#H-b()B|pIJ7eosR#;)~rmQs*82}1rm+)eI6$Jx`_CRKEknwdOClt zOT6U)7F$yQ7`ut)NwBZog|F6StJw8Kqg#qr`w_7^7_l05 at CY+}iIf~3i+ttDYbvgg zizk?TGzpJkp;Vk at URbuS|9^4zj!~Lz+m>k9wrx8i!?x`V+h&Hpux%^Dwv}Pqw(Ymi zJ*TSP-S<_Uy6 at j=ZMF4l^`SZX>|JaUa8dSJO=?BsTu{P7YDG}`*B7TjMaa(??XW9< zulD|t+M=xG`_?pr9@{iL`sbw zqYB_*Vu2{ct^W7rLXWS$K+X7 z+{O*o8{m$-7s<(j{qJIJfQr+Z-{_;%#|oL%)gnNb&bX5jglA zeV?>oZ5B--M5OEOT+K--fmN0sCqL-QO;_|fzqizm6z;3M5HQR+lUDlSJ3W5=?aU)l3DmV`Fu4zrjJ<(b-b4MrecQ<5ZaZ&rp4 z0dt5 at 1sDjN5vkU_EmPAL?mlcojlcW%(sO$aiB~drcKcJiUkKMbCTQ& zh5*!lt=~|%z$NlVWJ6byv9P0AhMu7EU=aK=BKl8w`?ObQeC2+Z4;t>^@>Jb2!HidH(QLkq2o_d(6z?x zKOT#Yts2M^&xH>>pH43MkdE4LVhFbf1 zUEv<*^k1n*sLx$nd~`FuZ47SlDPB^DWpQXeP~PbTImYfIvpQM7hcDUVA84)^`hpBOaf6Ed!H*uXA`K^-OA@Oo%;C#dilvYj>xjmeSvuTnrJ0m6DuhY*tMN0V~t7`H63DqbKM6A0!DF@ zIrvS&DP{oU6b3JfYS7PCZI;CX>Tkj?HWicT%oOV_$3UbX+z*9`%-F}W=YkwzAS=ZEdiBC-$de`nR7QqN1m;@K?SAwK=cOBPt-F*&f9y zB)#n$w3YlLJ_(_;pWu6AYe7+L!rjn35B{Bj_yy#bblVuBEe(yBnC?8C{o{En=j-+T zoD=zSrdg(fp{lKM%7QyCW!CI at K0FPoIvC+4wGj1mee0eiX-)AqzmZS;(h$qSa9)!| z`-%6ifk{=4EtICiOoe4t)te1~; z)~EB%aY`GarL}2vAO9gNS1dCvx7^sq#`k`|u4X9&tk at 0A_@dtSrU^>L7zfu}Vv5}a zsrJ!{MIReqz{%mf--(p%G!sYpmNwfLFe~mh zU7lN4NEXIBB>x5V5tb5A5i8i4M>sFtEs$TTrDc$7_;c`Vr&AEu zW!m!lZ<6(1&ZIcae}U!;^xs)NsMtHXn40_-=tQfm%lH2yPviv_?13|SNXg1FfpPHD zBoD?}L at h(@`j%&wv|lFFi}g%G3iQUZ$m^8(huq9uOl6&BvChw5=T0*MafSH8yRlPQ z)Jhm^9Ypj>-CiX>VxdnkpBld>VV}!5%4K at cq?vi$=E5B2_(izRT zkXdB~UlE(bC!xh*uccQ(|AOkAK8fzmh%Z4?LU-x{jTVSNm?S3kwgcUF1D-o`*nDv- zLky*AhR(e+-QG!>)~6%ufmhC8gac=4r>HH+WBJDFx0ic>PrO`cibYba$wbZU<|YX#XJA^kD*?8~1g!f4hAB-fT2- zYDz=LnJXztD%nA+;rJy)sw(RU{G20*7|i;($^w7d2GLUwwnjx*Wu>Tfi#>zo`@F%` zH6uXUOg&QjrBxIG`LUh=4FWA`l+|y6 zz^2)&axXIn1Z4*39ddMluJ=IfGmX+PV2^Ods_FAWvnTrLu^#N>VAscyLtVK7`~v=; zK at h8e0R!__o1_5t at 6_(3Y;9d#42^6||L00m*wxa;#MJ3;>jD)$`*|ibKK%wjNK7*D zCRP+Y){Gkpa!rwH6i5MGP-wDbCsAAZq9>VrGFP4y(H9CYe83>$js&sY+*P5CNS;{4 z_494p^3(Ls?O#Bxp=zkhbWC(wR7R`)t{Y5sMtc|{KalGV0x0)H#n05M-Xv_64$s6V8sf`R1vId?E+cd)0*O49vzFvL z|fFSS>GY&IKnf${2{|=y(v1fu{@&K!coZfG^CO~S?E-B z+Of(H=M0H=YOx)$#hPPddm{u*E^9t+i|Q_2R$x{zwUcF33HRt{AIzZsIP(z}pQtxb zoQSNOZqcqxPQFz$#JoLfb7p^m^#sb6yZCJZKAu*DncNi#p2j8O6j2GS`9O+`?l~2I zR3M1sdA8lBe{E!h8Nz6S$s}^l^bR_;M>^)ImlJv4DtR}TR+`W=@MA(n4)762qBZdX zvwzQT#Qf~b9c+dt#42u)>O2gq`eUJb$BF^dk@$GHY$P)+ks22fLE72X`BF znr4-~tHk2hyX`ojQDSPM*D*$}Q7wBsUTv$Y+hPPA1ZX~wtEE#?AC9r7ov@~ zaeW3KaM*GgthP at Lrn^ZHOR4MBp%Biph$p}{K8rqOmc49K4*$$5Bs&%(Ct$ zhk0biBfdOJ_rn$4YqfOk>Ir&}@3er|sn*U at YOB>?(k*+*QR{#yrd8$5lAvbaS2Ueq z at bKa z;Xe{&H_*l}QA%?dXY-OhNL%syX}x5{(Bdj-B{!_}Ws!0VHmK|pWirH7uSniMNFLLW zfGM6peSc=s?d4y}r12>|ORSn}(+QP$Ezq(x at V7?{De4b+CiLYJ$Dr@!{k_OK3H=mQ z`fCKWMF#@<@&7Ns{tM-rS`KI<*k9V-QEWWIL}VmL5VByE>L}L1_<|h?L10e72v7-P zf-hKA5S9k+;_2Ds>U)td-Pr>YS1*zdK10=DK^HW*J*~RsD~B4T9|k=?l8;rlgukxR z at h`2+!!;lBu5zxvU%nc=A6ve=-}(LVJ#>aCWMyVdRSnxAa2=(^anhmS(vT~M=?J^0 z1*)KM;-Y)SV-QP8ErtpyOlPuBR<(7HrSgyE8ZbDN_=D5RG at d7 z at F2?ND=s+Hls8bqbYh1YI#$LbFyD@)w6v7Xnk%*WF^YS9h9!xG_11DeOWxX1+e|j7 z#6??X^_EvHFyBlymqV4u+!F3m#y~0to?>_ym2XhnU0d$Bk)M^dLi at L^Hk>s;{&(r3 z$JEmNZHO<4-nDn!g#&p=Vtf8NA6$UNIhRQ7bQTGht4Mo(^Z`p^278HoiDl`pKeFYg zj*D}zEgjg6<_~m13+EpGLfA}jlV>s&tCixAoVvrm17s=8otZuFwRNeX?PTNY+g3aK zucW~+Ug()J8?Y$~Vie|nGvf7HqUC%42bu9n&9qQIR|W>!It?SSkWV at C_b0W z!?o!0SA#a2IVz#Q7f9P1T2R%BOS+8F(FtchPDQdS*G1kF^I0=itL1BO!jotp4`fcf z*R7_~p5_o7TdL-KTKW2Hj5MK+Yp_=MnkadvBcabt%VlZ;Q1aV<3L9510M4S^fiDLxBVldOMVJ#fhcP(H53csG^i{&eekF-3hlDoPf?vcAD zUKcage7MYK(m4#WmKwNcuh`+{)jbF6zgjxm1(B{7ZIX4!KG+%BL7z1}|BNGN$9Y6C z4HjyUg=6YyKa?bcpLn!LqqY3%PPYHiQ7tP0JZ9olThX{P;``+F at fOHybyS(ORC7<+ zmw_U-{v$GwN}HT_G_I_-5Z1n}U5p2&ddLh~f!YH{ApS-LoadGmTwsJ1Cg*U#*+ajN z at kR!^NBPG3L%h%a_38S?8=8^I1DTO}B~l-paUT)ot89l(KmLaDEP$UcXbZWRKHG3R zIgQOqyO~1_T*pX9<+Tu^2k(&ISFI1jMy-~xhQ45olNEqI^h&bp3U0q62ktkl1II%f z26=e6$7^8G0V1SYUA&NJr5;IG-;q)O at w|Kl|{Wv~4`P~D} zYNN9 at aF4}DS;Foe*F%b1(0%s%)Mvw2b}oTfoxtLhr%>CSkU^DyR{a}N&i9m|>%n~C zBFrt6{ucw%MBc7XnaYAQ&LNJRyeXiJ0Q< zYQW{Y_RCavac$-5&if(jtg*#BKeU$p)BIaP~Av)PRs*MT+_Y?cf}S1A5YvK#E=%s!2qr-u)lK2!P?A` z+I*>|n(rh=_%tN0T4xPciS{~W6|cx-mS@|DV*?Kww<)N%7oAkrk32HK$Jm^3B#x>JgJ=LdCv*mp^9nC&p2U|R-3=l7|Y7p*helC zcmHVjDN<8luFsQUC!-;?`@jaX))4reTfevxfFd;PhS4WqLeyt9J8;(Na4pJiM at b1* zn|*Utx>hdCN_-S>jJ^7EhSswc|4l0P%fGg5yJ at wK?NDtNjg2{1FzaZt$ez?JtO25; zyoaKn-Gw74ap(Int1p)L`)|j^av7 at 2EPu799e>S1qW{f0EpBOQ^N;D+#nj1J(*A#y z>|&LF`6x6#^hY#O<$07VAC}n2iWtq6#2d`YMc_2=24J!@Cc6G{Xs0!Wf8LG2-av`)h#MIINs%twRYC^mWiVJBOXgL-*ECLB z-Sl#A-EZPyMErDXS>GBr&Nj4?fLVMFVJ0zh;H?sCtn$E%OfzhlhlR950tBEilm{s$ zDoQ^@okvPKkt?*u=T}FYS~8*eVq4fHNHRUtBow}4#&Kei0SKwgE_m{yatGcX1Q$Ikdg+;}cf^Uv|ihcZnZ$O@|E1{6<&`Kq6O#1p?Sq_ba>N9VB& z)BM8!-HksVIX+XNHzDW)JDJ06s&O|!b{39rIX!?xN#Pl_$`)>G_i zF*k}V_ly|zqUHa77Ie$@8ft=?0(Bs+ORnlLT2eE- E`n4GuBg^e)qC#*XN#teIj zah4rEdx|%Q%Oe6Fl3aFP*4UE-FR5zltp|C|yLnJ=$aSZikDCHdI0^i*DjuJ=gHoIPYz;YnnWf2CGdjspprZNw`XQd at u@UN zoUKs=-v}7SJd3+S>H(VAM&b1 at S$bWWa??Lrg}-4{$D37Np#L)_KLx8rO+bNwVxWM4 zME;wY{0~aM$Uk3O+S~n)8#~47|MYX?=qjS`Q)duU1V(Qx5~QY~IV2&WYW9~t4YJQ4 zM3F@;k;8taeuMOxfy at F%BgD(~x%r2k+q{#dp~+hMRZbS)yRW%IH{azy$o(K;r27&` zh%Yxx{zwFl)>(+*6tV^hh$vk%VATr73ms!XVkaU>)H6!Z*$&|FMpw98Xll=KnNV*#|&7L$#X=vib- z>dp95SSPcphyP4uLddy!*bwJ3YK>)7Go-l4kj8YYScqO{&%jM)7)eUt2>*7!34jao zUeYaf0$0h%XGp%Ywj!Q%^az=(EHF zG9z9`wF=%@PZ)(7I=hu&7p5Pjy^d;^MVqXVl+H*>7z`A}WKfKbwQ)&Gq+e!`yi+*K z at I*KS?N+-VW)9CU&Q3?9zyzyXQ%Kbn?;)O&FBMKXU8Q{$I70Qy$3b9 zL_I;Jip)NTpM|B9nZ+enPSX42_s=;Ra|Z?m66K0v?P)DcI|51 zmMzI;1aYH_s?MAxs0NE6XJolu+*}GnNxVj-m7^k$^6)kx6Ct08|7`EPNi$&D&72eq zLNRQR>FjYJZwm`dwkUX9`M2;VG=NslOf0`0^0oS*ei877-mv&I+V(XI2)g(Mu0I~4 zWq)Jo`N8Y?CC3EIy*jr~v%!AwHn}*Z%bUD_|CEj)=%21d z!7kM&cm+yzb98&Wr#}_Ur1%w}ZZ^u?|L>KEDW;2u&>;?7%_6w4K2M(ZQj`w*+co)>~aW&~C_a|c2lH2)u%Xxa-dCGUH z>vMl~x(7sa0F%Z{X=(?E!9=l73_Z2BdXG<4WkoT55IuSDI&wD%ty*4as08awxV|_6 zpITpLms_NLzJa&Fc*C4a%l=2U(YoUr2IHLhNS$Rp-PT=1lYHqhb_d4x-J%R!x^06k zuKx5PoO$6&3T|exc!Mf2VT0aP24L~PZrSA`dkq4#V~k19^`hE*MSs55ix>ENB#th# z`BV){{+Kjh&z5DdVhTUdE6;B2L%XJ7d=oHZm{!3<-*13~qW#|A`dqw9emUNJ%wL9p zhbjtDWwyRir7hkvF10I+hSzr7sRUkM*hjdr4eH=25EClx!=PLYBBE5+c0(R)}!yzV$%-BFU7IG=R`ew6_e5Uk^E2@@3} zm4H(n`lp-()```L=I~p1*PFaQV-pu}4o#E!VGYpy^~m8^X8mjYut0ps=0~%68i%79 zv4DdGwp)jX?=!&=J at h9SVUiIs9f6n>x3UJ4+eFT8vSLy@!;LBR at ywZ@$`-G{RV6k_ zg=po=_mb?Uo0nbWPiFA-24h)X@(cFP2wWWfeq9(&cAv0IG#nha8QEP at cv>!b{MK0h z(JE#^uvg6isjNB0!BaFlW;{5dnq3b5*_(1K{()n-VqejccMfGf^5`;3SY)GwXgtae z;Dh3BmUN0)EhpDZRNO~Q4pjs3c2tNsecbq~s=7?}sH=is^Q4e6e2Yh06s0AZ+t%^3 z)zb6bJ|TZxYJxs-&pjk at L)ke}PKL6JpJnpn%Ve)tgxWGF_vnda&QlM);&bfcE|7c) zOKS8o&@ri5Z$OA4e1kNS7o!V?{qP$?Q)i_1LUezS6??zqU^3<2I_B!plmu>Gm>~far^uLGaG7Sk94$q7{46O9j9hKE9I!RKGDJ_#u#| zW67}WQexl79_VGIIz!t_Y7d7EqX+(;`w8#GLV7CQ^LJBM at vF1if7s8tga12D|9?#- z|5*|=J4r_YM+j}?8}tuIHMqL9R}<$Nh<3Ab6J`{nI4a2uBt4>BqM2 at Ks~MwNI{PEf zW4 at df&il+m8{zNMbnq(4c`(T|=Od~!1gJl)%l!BW4^y~*$-H0LTi?5JL=Ni*_EZBq#`ypTfloA`99nQhQV zfIn!rlrxFzuCAd0HUm$hv at Y&qwT0EJSn%6>@|lp$YtPZp$%LR->cdb4wUV9_2u`tx z(<}Q(v=L>O_jWQqNpQDDr}W^bVwvei<*AJWT`{j-&;Eig++DWrybJ^Wy7Fi;Jht`p z-y at H>(~r*=h)Rv-$vVY4)-H?~* zPyU?#F;JEupvB2KZw=SswlkI=fCZfPz*{SK<63=D?Ma?_g#XAWa at 6is#HQDRufh6V z*kL5OdVF0hJ&84GOK(LfSH{fS2B!kLNUVWROxgl>PZ}K2@$fbO;Du9G7GOv{)>r2YkXNj=$ttCHdlTj9|q*VEvxPa9%SScatI%+p77 zZAaW9EB`f~)I;JH0X9%7Gx3a>mQHMTlqD4;B1B_WG0o;R0S(BN%n>$z at d>xpGr$$G zDV**ugb^*4erWP;B^-sMijy^fL8RuKS>-xa)6FkaKJiV^6eLgo`r9$6XQyq}$6wH` zg#34Y#Q!_!{x4^Se`wj-t*)qZ2%4xU`G}cjGC@%FAEAX(4CIR&i0`G^EqF>TCp6FR z*x!Nv!;T2pHHv%@HM_Iv^{RF|`!Fm({O?5~cpU2dE*HSY^9Hf70xxmX#i6J2H3NILls zjKvJ^2pK1&#Aoe`&A4wW3|`sXvx$~{s3TMagUtROV8vVndrEj3j?rfHFBY-~*hE07 z`)Q&XFobwPS3!bp;x}o#HnHkn#U+m85Hr0<$OA(mQ6J@>*ZILPUvx7(jt_xP8DROm zv&rbL)1!-P)WvR+OAV)Y*6vQb`ZQC|Q5z?COv$uRv~=aYR|6B_T>E}me~(0 zQy_fZFucJ0WjbOU`OchR+c~~pnkJ-9l0sI1@`gLk3nrV$2 zef|#gc7ljMssKofOw_;yWu=1?yGw_JP^=6 z>%ZIH|CfmRXDChTKzpbzqVv16u-cp534;U+VlWd4vxs1EaH13v=K+GjpdpGgMeZn~ zWX*=PK>B_Uty$^lwAe}Ov`besq9-E>g1cMWT60?Kbd*&sF|1i}>d^8Xck{TXboP3q z?nAyhZTq^vPXGAkd+v0$e+X|u*gyn|Tv0~+0Qn^~)S&ti5%E*y7MJE%MXxh~;*KY{ z{*6EGFNx@$=Ux_%t>_v?<=X at hzZ*en-s^x=%ii%D3GgpfIF;S$hdWFf{aZowPHi~9 zkRGMm43HYyn`fgkfS=;CK=}(M`gh45eBfs+$oFHfjYp#Xmqh>eT`w{Omp?ONLth0< z1EvU{v*NBOuktsiqrJnm&D==VCOcOMj}joGs=CItvj>eOu9wmLtj4TI998F*Hp7Gv zPofsMV at 9?X<$$cy98NS at LV#q#djaU6 z07SC|Qd at NeXVp2-GqSgJBVuZ0BPrS}w+bk3(+f9FAJNQ0w=5+aUf9EX2Zw$jQZyfg z?c`GM7`ow%9w&~iOQc$2iHoRrd at ImgD1JZQ`jOZID-51DL|rL~`;;ObUky}KaXsYt zFW96LaSZ7R43$AyFwf at 6$Z!-o2s#}e{!I5yTMh*{Mwu{7Iu!6b7JfH`uEGmhxFDHu zAv(bD(9Vm8&u;6!qfsk=NbB(4SWCe9EpxTa0xC8{sn)yV1Tr>~Q82}saZ*ZraZLj! z4(=JuUCsQ8WP(kF%>F8Gn$+opImw&JvVRu$NR$(tJhj6jMw-9oc zna5O#B3Y7+8Pm4Q)Q0+Y5Vew%3eSljmg+o7Favf zy)MLYG$CzvRLWqJCf7_wF{0pkEP>ei&4h>`c$vN(*g)P`UfU?;yrgbG9VD7XLm_7+ zIFl9n;w%aJqqP)-d0Y|5ZIYr1QljUi6Q0eS2$P{|jhtAmoOL7|0EHND9wl5f5f~+r z2?07_0_fX`9-HVotav8L^T_EMUJ^`TG%vR#QQO9u1j2pAt0Bif(JHo19=BE9%!naI z*MvPHZs|>4NBQat)WTU%qb*Qn>6xZ zBZ|E#0Y5xP0ejI7nMWyaHdb^VJ&AA%L}l{sxtYuF#RwX)`!dT#%wEf at rxR?DWv|T; zN(PA?^*Z^$`LYKbuxJ{)-ql?TRqCRiXb{O%O-ia$Hr?$*`yCG~`# z4`L=;ZDuf;v3aWypco^8&`482gC9(X60=lTHV-YZVB9PUX%62xJB=yX>stFk+`e6o z_1LB-I3J~Qe-V4yrjt-L8-Ue)TE+nH?ELW9P0}8tvI2+BQ7cXJyR59F01$y%mNsf2 z1w4X=UJb~^dZCk5+oioxLuW9i{Oy2{RnbplF>-AKScN4CSEU=SDd;eIa232)x4T?4 zdQ)?&g5hk?!WxWTQZ;SZML at SJEx<)6zaZm~Fr=)oVHh*H*TlcGuq54CzF(oO?C-iM zf^m;uFkC6@=f_eq6u?u=2UTaaXzaJy+T>%II8)OEJ+8Q6;w at vUfze4@->+wo`Vdq1H_g&(4#N+ zjbJAoUdKF;9JcY=>C*N`f7#Xb!}MzUE!DO%6`EykF=-)V_qbA+xdx+*()~CpaDOTq zHYNzK%<8#|WArv>47xA6=KZQRy=U_|Y3-P!9gIkg;i07%n|rk1?$Rc>({;w?A(uBk z;&1cAb1IJ2)PxUjK&62HajLqMZZ&qI&TFxoU#7AivAasJ8 at q8Im((<~5t2w&HX=+C zm*>axCu{NaQ{!5c}fSFJ;;XZi~RIVrGU_=X3eK33x|K!{{diZ5KTm!pON+%zN z=cTy87o*h>dnFGCrw^J_5d;iwY5;B$!uBPm4QZ*Spi!vVeV6Cg*WtUi&-K*VPe?Tf z;D?=eudiRk3x!GWHw=|MxH?v~pela at h|b(J#`fO(Lz7vb1B{fmA8K}SSQ9k0 at v;%`j4MyZZm<1z0NH; zSnB&mB^{y6m0|Q}L at zV+X(KNavFa!82RU_8j6gbeRxg at Wt7%#^;TH4UmM5quKS_^3 zt=zMB#91#@#wKQzE3>LumB37varm?I)QHs{?W~zGv4tZiVPy=DaR;r5k#@i1KZA3J^Xkh>&opxAZxU6^i|27EwS);+(72>uCGaJ6nleZy<*t!VL(3K z&h0r_I<_^o>T2sU&@-fBq{>8&hYYF87)}mZ2WdJxW3be-QPWbHS}Ln6j?EQS<|P$N zX$euwB-RH~$(WnLE;aYZ-2`dJ#BBXSN{W06pcMca9ICYCI%o0dNo$J!0!8pq_ap>* zre|99#@fK|HoVz at LD7<$or at 3qZukb@SSsocLeny$B at j|iMyY8v- z<|M&M??wrmKn*#}#j-sr))1GVAULX)$(;_HPpdgPMX1T{CAgNJ)v5!pcvNY5pGq$X zxAs!J6}B1I*ME)Ol-1la_S_E%JYM)+b_Z|<>6Ujz#MGLyiH{bq$Q*A z`_6c+C&+%+c(n(#MNT_&+Hn1N7nXv()eJ=4fO2^!QaA`UcGsLUX4ky2uU=qa)yXob zSYuyC^PPods;IGWwPOHezwHa&Wt+4s;?#G`JI at 4*;(98vem+XW at Y8xurFw`mWK3Il z5QzPdN%qpl1C4 at nVjJ<0pBTZ+IaWD}5YrJ-)6L~HvynPU+qQx&du(;-um z-bLLygu!c@;o_aUJ9(z$6+%Oa(LR(XxIoY7$ENVCWeY)@N*mH|({j1a^mSdNIyzI3|N1`fgYQB$- zkQ)1tlzdJ?y^jERox}hiEECb43wDYbW{P8n~<*oW>_K-;3QbdSi(R z3xMhtOLA|>_JZuvCXpY($Iy}hlelBIQ7vj1T~rHkHJYzT*rXA|lINhgmeDd`c9i*E zG>YGhC?18ZFdQL^ho7~w0;%x4(9YEoq90PZDCdHy7FFE z1&RQ at LRC#%_cOY-f!imxPxV?T%@_HIgwl2ewqZub7u(Rw#}gj!;;|B6j~;MOeVUiTx%|(TH_#{^Yc55Kp;aArdAl3TA>?vDb~8%f{S9aOXS=#lO!JBDyD3H?PkeA-JLEL)zF7eb=!`)?OJte>4hVL^a^O#kl})&DQz_WzEv`!5D% zD>FMaJh)eJaT17BoYk##K^amoPDa0oFquA$ZI)WQX;;hzdl(_`E#{3X7z$yp1o5!E zG>#;4SxP6Xx7pEzse8}&%N=~L??yx2mH#dvh>inqW3VKe9=8SiE*^?p!xmYbWrp!A z7JEenu&SL$I?!b4j2>wTCjhV!v$FgRmo8j4X|NbrZIEUyNuM+HOCp$lODTAQ6C~E+ zNBsORDD5Lf at q=5fbr4q1gb;7du8MFX`5zw*ZR#q?;(6 z=g$=~7db(Yu^v^zh0^>8RbcM!ggP5g&XCB=_?}Pc)1$@ zV9!vx at X0s0^L at r)n+RX7A+yguGx*h%`3Mavr at X2?FPdcs@~UX1*cK+le?8NeCbyx&J=c{vB^uM*&p{=?fu=p%NU1$_W#_DQVn`vo0Bm-O6 at 0Z3)Mh>4&Yt zSigS8W&=*n2d9Y&JqwBg?vhQGT4l|s&&3N)g0=b=s5zuZdamEt8 zo*fgfrY=Kvfw1&{d at lST6h-J=sicSW2D7aoK{>Ex+;F8GH$BrRQP#+W?4xoHG8yD}+-lv-PnJvm%_z z+>6>;$sk2&h&4C}W>Mv0J;JFOLe*I0gu=$RFsL^vc{0DCF0CJe+rV#$6#__}pVXO(#J&1( zQha2=vEd(sy)77#7J2VDqOt53h7ai+(S+r at k0@QMntH>^L^V5fQs3UlLo|+xe<$x+ zLb4RqLjIL!asHjB at c${-{tN9|S}wSY*k8l-Y)=*_lrf2GWbjCEf9?v%z;HUzN5J>I zWa=u|xR8eL7ScsC9E+83RN80ek{M>QuZm$eVZkr3yu9X085Ay!y*;S-d{0!o-!|qC zzprJh$yYUOB96QO#F1NM-pc(#ZvK+}eQpBI zTFhJ%pEdu_Lfn(1X5X7Ggx8(Q=mSOPR)%%FnVPx%dI5-kr z;5s7X!TW0}LmQphxlKn6jdR?)rj<5pV>}-O3>RWTkvT1CO)6}Yo(z2TT0Hxu!%l4l(@d<*0$LMq@>AMpZ~+i(7qqD at oi1`m zdOCx6S@?u$a)@xKZYJd?)*ejEj(zPW#q}v2X&E^^fe;ezW`(u~X;UM=UxQn9Bq8wJ-UDv6>rOD)Df7ZBo} zX#&`FYqSY3C>GmAHtCAx$;n)61;qOZM$OoHAJ%RO?k{- at ZAVDqZ+WFAw{n&!|gLOgRoyD)VBRcW?0*VwU4MmeP{)cKw}sx3ejo|3+#2&%?Nd_x zipV{EX$v>M%?dZ{TpeV*>5RdY?F>W5uW3Vv~IP9^%N=n zJ|a_YJmzfAYd|sDqFE_d@#NWWgO&H-NKe0aJK9S+RzQCp_KhsqYFEW<6{*>VWZ%%% zdE8RaxD;C_JhrcC4p!Dhy(}F-WXiCTRM%*{gV{O=PW5URCX+6gW_Yhku6RiI*`kqM zP4&I4lC$Dy-z%0Q54ETS=f->f%|^PVcP>l%+Sw#K6{{5jT`K6$NtxvPD?4cP1*jP& z at nU7uR9!X#)Lvp01e?D5(QHNQ at Sssup1}g}J1dnP-^23EL7l=F6DB(pQDw-)nw#?6 z`6ro9JExKfSD;8M^hX0O&a)1VeSV9Us0GA at bhWTdcNBoNBCIoP_}GFzP{(pZN at 0i7 zV$gmzaGO}j-mEu>;bEqs#ilqm2d4#z4GKCINr1GG{HLJtGrFkvi9389lssi_vhoX~ zLNDP=ga8aQCm3%&SPp)l5^*7X%WS2Pq+aP+qUs3Q;-#o7&XF**zxutx310<&o?v|5NL9KQ5Xd_}A*B;nx`?w9IMaFuaI ztOiu~S>90l&lB?zrcp811w?_ji)S5MGegzed7gv6t}c+Tx+C~hM)l(fx=1*y3!>R5 zM!w4jZ-qQRf~3!Klfb at F&M2h>DT|3p#e!iNsI#WRnaSjE`q4 at TiVQ_S-c&$rB{K$9 z?GsO(2`9}&N9&2TU?7Z}RaUR~240=f-?@_2Zy|o~M1Xy9hI|W=XAr{Hvgn)fSiGLHGkTREq=r8iKoc11iz+|9a?lr$wt+9%9qzUV7cbV*4ccR?0C zKypf!>d0a(Bt9JUX4(jRy6N`0;wsCmYs|GzL at b#CSU{zgs*#0r5i<{<_|hpdbo;)d zvER>8RxH46*!;=4+5D`T~mpugz z;x))O>&O75!N=cxA__P}La0%IfO2_&fY|=qoxr~qZracux{I#-5_1!o*wMFvrg0j? z>qN0+&7zm#;bQAz{7J5yiXQpEZ5PU!Ha24WR_4;5zsR;92C^i at WZ%f z%)|l07<0i4tI~5EmX?_eQaWqFfUo23(h6)(GBYxspS$dC(FV&IYQsG&)Z-pzQdmy z6UDlNL&duNIm%D<#F)8#U&`%ipib26Tv&POycE5dx0+F+bELfTN5kV5AYgYxz}f?- zAw?6hxrql(;Z$u4J5I#ebgU}DF28k4MzcnCPJuH-uE!d%N%Bd0QyoqH&F?CKrjN!C zokIH5Af};bK)jYmh&S4_8Q7i5;ekThgw>DtJt3ws+hBb<6$$h$Z`6Rb$0CDItOOX3 z-heo7P_Ws at PH>our5I!movL(Gusb()%qWaKxpB at pRAl=cc;vr^@YdxD6HXDfF at u2xHg-FW5V1@^4`q zI0z#2^QbF at xfe~QO{gU=^fl$#N^V4`0kTd)11n4B8&-19HXKTLe?!YU?5zXA={Eg5w(R9??p)rwXv`fNWW>S70kB%hp at h~+% z+inONxh8kmlK>Q(_q at k^4u at _utFu~le+$0ij9yaf`{P$D&;q|YlTX3uOy;g2>iJvA z;hx+Vvj4bj@$~4Q(4srpo#K&j7Yv`!^r%GAV at IpOMz?P8P~(e59nE}g=ehSG_edg- z9QL~Ndo8qbplgpX*ZW+6B~RdwZLcSZUum at nEzacq1yqXFa(3%(22PKQ4c&Z}1$W@` zDR;>7sDqgP9U~M$AG`x&EpWCw`q5%?8G=gFPQ;58 zBIbZN8^Of(6D;ZzR5`=828=X`}rL}E3=excG*Zp0AfI8KDLb`!$#lnfW)#4;=#dG=|X)J<>=*R|SfP*F!!pz52Fscrs@ zHf9799UjEe=Sq}B+L(Ib#Dx>h(A%z-Xwr*G7o0jUtnDR@@;G(rwN+(L-#kFD3;vJ* zn;7v}=A-Z0Tk^Ruzxi}$lyv}tBi$}fC#5+7&@mvJ7N^^U)Rl~TP92wlI at E1qo06vN z54fTBqgrq*2x~i548(4^^1&-cY9_&-VfT0SAD}xEhdn_gEmQun**CO&=&`x0RCv}z zDt0 at Qn3Y&($6xgmRV(>S;yHg})|BB??q?f(D2zL|_<6XvQ78BQ)rK1H66w;vyOHncegU$T~qee__Q$W2MIZ z5$H+G at isdqDgw6=;y_{t9lTTN^Ab(LooXYG8cY^V@!{1qR2P%&w3i;C)7G-sb4075 zJ4Fp&E~o88pc9dI|BhYk^357C#c4Kii-T6|dRYiyZq&jnw!8NnUYFNs&i`RJiv?hb72Pw>J_qkZYLuE-`{I%T4(fvYg|3H zqm3riDf$@A5rSNPhXC?<)Vl-(8DYMl6YkfI4X04ZP=R_ZyB!1l0!ksnd`f^*5C@}9 zc8<{A*DA3ysy3JGY-7?ivknuob;h15cbf8c`Vz&VIBbVg7|NZs!)spOE%DDEy88Dh zvN%={t4GcPvQkYMTY4e=_UH|zTGUPW#Zr*0q!Ob0yl)K~KT?Xo7R&Rc##KaO-`!%g zpCH|duCdVha0{0)qCXePP1_$%$f0bB{2xp+rBw?P>ddhOWe1nJrN_isO;l1n3zBu} z$l?^kMb_!e_x`kAK)$M`4z}E0LT;lR{C=emyhfZCibU>CxsIRn2IH*d6BG+{3eHBF z2XK!o>+}Yjre`h7nrf=-nBtse{H#A8ZQk_r^J3Q!m749bB)3{J8I&CAB`vLKx`gqh zSZeznXuLa{u6clGP45}!(|<{Tm(s-1!l=V0osX{=fIlaHm}b*TOf=5Cwc at rg!cbZf z at 8hu4=Flug+hF58ejz#7QE;`(ywU``SVL$$5D$ZAa&jKO`a|>Q0ZCy zzjggi->jnEhNjFfMqiYI?_bh5J(Ey0c01+Lr}vf*zL}+5=Eq55sjvgbgmUOm1UHYO zpWl!O+>M{P+GXX zHa0>?M5lc|PZORCN8*}as3nw2v%^_sgV~b>{kf|j)RoncGzF&8`3MrDnpt)kMcN7b zYspnT_9m at G&O=cIba))ixxZDZ<><@lI6zx zqN=1)6sW35ikp-LktA6nZ$&ey!_CnMV!u?sw*t1!wH~j}0nFa1HoYgJkMERg(VkS< zuDg0IB9tnzdeJa$t!OdDhMHeA?!n>FCTziqfMTV@| z^3Kqd>)VcgxCeEp+v^o(hZua|mg-6|eU#g|m8R at TZgWcN2cZf%kiJ11m(-Wi%9vP| zvzFpVyd{cwYDYx-OMPKmz|va$qGGVOqGl*7bH36Tmhoc at z(%UY2dACzE5>#!A``^p z9Ac9f^<<(}Ebzt-tCtu*K{a^*DJkNzo&o at 5wH%B4PC4uKxb75|<6QX-cKEdLZ<9TB z#5$|Vw(jB`Vpzr<0P)Pk0p~8Q3lJ&o07zBM4b4mF1)Hg*e;Y2F at pDtyNu_gi*zPyJ ze;pPpvmIyIu z3{9DO;2+P#*bXl`;|JrItKHkWg;LX33e;Z!FrKkuJL5)jW5MHWM#rf|UGJc$ zvDk$HYYXnx0^a=_WE-^C^(S3nAZ&kOfwYi%4N2uP@{%R=Ia|;pZodbDK^I(JB%wRNc%_RLYvSy~!Ni0Zluid&`J9p^*JHB-Lq?SxAJC%!G&W$DB9TUK>TQum z at tN-F!*K7SI5PU&Qdk^rOX8JUo6-#hpuo4;RWz;e0yM$qeJVidF)GNhT1ZV1+}ntXs4n~DSP)GlQC z5oP&)5o=BgP}QdRvNK?BLlDZ1ZF9!p4ZS8$tTl;n-{tQPqP`Lgj}O*qC$xKQHeXpj zt!&e;yqtayqFe_L=%V?MfVNCNnH*4`DJKH&WFNVqaV7dUW{*@vP~X)=i8uU%DY0;$ zM8d$!dUibGfw{-lB@=*7PmQy;?zxBH(2mlT1vl;&zvYXN&hi)ZGQ+IF$!ghNnYxCH zM5)J_L^@&l(EObNvxVGTsY z;M`v1Jk3Ll<=Y>Z)1ei^<-w8 at IXebARbgp8)nziLg{D_z at dFK$6ODHGveG-+DXR*1 zl>j6bjGA~k8|Xoezi z2ItscVBKusijOE8psdm?=G;unX~0FA%{(41Tcs!FeEMQ$b5SpRa0{1PKrJ)3ycyRu zM^_ctBePy%xp-8m;;B;qw)^Z0y~BGlrSCeWpNb?8vn|2$LQHqi0btq|TE6LO2TvE+ zUtIbHX{ALNY}5ptP%2+SiGH&wTmrr#dX&H z4;scLs2>y81?%D_lK)8qt(Ob&pFs%pcRF=^VV;r>B#%=sS z+!c#q!AD at h$FYE4j at 6XHU|>UoIaWt}CAw at ZtkxvF{3EOyw@~qix^p$i??@0&=7Hxi z?%r`^;q`hjt9nF6cb6{2+LYUCnul<_T`lcG at X**b`A4es-<%QnLS8%(nhrcdw*31j zxi$04^^8cZ9(pS0Qx9u9Xd^j-gXa&yM*MRQ$PoNDgz%*UJ?_iWpZGF=gzj6i^B~ky z{-Ra$2&l>M3Pi}xF8&1EO8wHf9Ey+($8sO%QOd~;=~dd^!I%~iO}qUyHF{tTVw=X) zt8LoJFNNzh6!Bs5#k>!bE`LRH9}yHC=)?E%H8bH|Qd-x?usNIPupJR&Ce;BsU$|)F zP_&re`C8POl$40WK}XGX;vb3qR#}FSJ;2)5M>E-PM^}2-eL*|rdy1n;7>`-`ild1_ zJz!9H2mra~?vmK<6SdEk+r=0Cz|Z{yev(td^Z}-FE2TWZPypKyy;~ zft&ULIrMVA5JJDhzHz;0I|u$j>7CpoGxE~$z|$jA<9F at +Mc6g=C;$59`IPPpv}?c? z$nY}qVEGlMxfOVFkE(u9Q$YMu2BQyCGVNzCMh zC&&AM8E`qX6Y`*PeM;<(Bygwma#ErfASfw=a8eYHS+M7gmUhV`+?P?B?CT$YFh?~w zcau_H;XZ>v6LMeEdphfj^iWeSqZK6o{c?teONc-pKuaMRxG7Q(CuQiP2vnvtjNv$NU?1t}7Tup{9-e1S=O$RIwMrwDa z&!IL!<#QfY({yVRhQXNDt@$PoXjx|gSJFN4z_ux*n5~bh2aaRM)#%x6UE)l+<76*F zVoo7n*IhL`n$HKXJ+EM&r}fbGo*w>KqA@!61%tf;-(HESxD7_)RbEg`6LFi-_>X2! z$Xl=|p|hzJrQz*7U*%_CMI2lF><<>7PcOVrxX%jhwM24oucDhmd^#1XDxo5snD-F7 zp45mF?wTCJyyx4EnFs)arT`JgjdWu`%GbY?o}8AcWG8-rfGDDafbjm;N>Bf>rQ^S> zLaA-L;;JBL!}&u<%4n^X0<1OhlK9cmMXL}}lM8#y#eK=el@&AoRyqMqQfQ^3-5;)R z#vC73J)$W`_{?+G&AjjRZaEt|G;%#TC_s=L85*8_wkKV$C;KP9v%g_LfU}{!5-;h} zVUxINV#eJh_oP z%dmiCH?ZP0TvbYit*Ts{Dszby14<;0T9jI?f(;>HYy!cktPI;hrZQ$-8~{m{74-Yj zd)}%hH?7~WU0!;Iq_t;@6`Lpem}AJAsVLNf&AF#D3>wg4mLEg at Ay-5&KMgTXTuVnS zBRvwM5J#7fP&2Bc!kW(g=4el|k$sxw1W`)1DYH1slnmuEEhD6=DAl_5 at SJ4KU!N;y zABPip`;kT-oYELmFo{rZE%8mdBQwG>Lk$alyJIwi6EAD$4M1g;!;;z|M at sAaHIlWO zVw4rV<=IC(sD5lNk9)BhV}Da?k~o>+lcGqAaNv>Qe1TBkQ&XcY$hJPB--$;LsiZ at D zUg}?E6OU~tfj{TuL at W6_%Dr+sEylmY;X!ub>Wf6WZmaVDpk8 at oUF&hI8X^|zYCaYx*IRX1Re+Njm zJLY!maqcvaJSA3O+DqP?o$K38$6Bk>=B3TP*4eSF!&Sj`hZMYI;5in4coS%|stqI% zo)F;vi4M_&t%37gl*Yl!v5T>Bb9*#=X at O>*F3l$-+QIf6Jx+8N zJyLiVAAQUV<*$@Haf9 at c0eW@c=dTUQ2I%KnT0{+nMmjl=WtcN=|LOSG#7R~K%CSr{ zyP^>vl3q-gP{Kh}5Krw$M^|ieB+!toMsVD5IZ1`bxiQ-rO+XO=l zsXHtz;V70_Xd=+`{p5yOmu~DwJQ at 9Fm`1Q>Zd$EjNNrTU1B1T4Mtdm+#Sw!H10%9~ zIla$Lj%@}%HVi)e4S23eBWZO0-lm}qt0+ZjWPb^`qWk83G4MRd2 at NZKvwB^f{0U*9 z)g5$Zg0&e=8GRWKWP-cTj?_ at M!?x{}>0q@oAPwzACEQWU11tx%tyO2E zReSYL?FER|>%+kpnrKj&SJH>Xb#I7L_bR|1}I%n`Ux3b6juQsFxJ`u8LZZClE5XIwPJ}4c9-uoPqq#k zRYNtw*YH16S-)A1A9GlaCpR9kw%;x$gd3xgJWpayq;&6Q5g52mV?^$M;(nI7b?XZF zit1rH`c}{Bg&ym9oYFj~Fny?DJg~i;!@l9Yc|d&9eP)?|=@$5w=C(b=;Cc^8NuA~h z-w39fRx20_7eLYWoPkcr0!K1e3Pplc(=Fe>?dD29bDAOGnURV81E}R;qj1W*) zs_I6h=q at l4FbJ30<|kZl at aHN}yV{T^?}Z&p%#R|5Oa2LuSj>QRmbjDJG~@Ze+t##; zaNM%Qw0>c7K2u61N??0-o-i$Aym+MW6i9oWFn)~r0=^_vK%F|JHGV`oZ=7;F2bzqS z;jsDdgpxnZs2uZYOn@%$5qtkxXRBYyd$!HGVl8SbyY=hS0KH98v0(jyQa|`G14QA?z~|n zoHKrKOn?j(7l*9WHVF{ZVa5UiJfzY1{o<`?lUmJKhS$lH)(3|bx;25uEFeZK_|_O| zrm at 1*pb8S^Vfm_q+3MJ1zl8agPW>WF%jbr5gZIlf|xyHsDYor4uL{+=7Nj9;`Cqx zeFJD8`+TtSf+vfhAkB<1C6;M2>Bj92Ib(Bv+E6=MNH)jM5E(x}icI<_eeXya2w(ve zqJgQpN(1EeBC~KA3^lbPt0Orwv0 zn2tPN)!bB0ynGYq?se<|&6+Nf3YUTIFx`wPdfWfhp z47IVUCeD+)R!^N3JM1&T$M80gk}`7hkrcy|)8>hQcWHc%EC2CAE?l-?Y4>A at m1h}m z);J9<5IxDD)?urodpLVTO>O;FBc8m+ at ZNMUfiXz6Oi9uCViO#tDr*~Z1H6u(34~LH z??4G)Xj6pDp5z#x(v&idf_R4Xg5hJjxZ%`PMICm`u027r>;eh)jGDik zpP=DNQm>Cd9b3Evc*fQAz+anA{JtD2L2f8E;(vVMcLG@&Hg)rSled>AMsoC8b%R{kEiq04+u6or%ceHrF`eKpuQsjV{L=nCmniI3a`dTTrql1 z`NtoKIr0%4+nx`^Ru)n|COUd`k|pTF)O6cVn0lIL at Io7Jkf=wrO^{-z4!`UN*#mkDQx&zMv-A?n?Jc>-)~%UL?8z(3kH!(~SBquVuBAqh^-dh{ ze4`t64Q$JKw&W?j2kq874(!x>K!iDX1Lfka0=l>70=YcW%j$xvMjGo|c|$B!0VY;F zoj+bY9gu4#(&>HgPNWK5!K!vMDe!)#ED+$y$SKAaPQ!$Sn&<+X^ zBuVJfnC@%IO|z|2{b?4`4dm>k?Rk8Z`=C#ZFPF*};!F}%Y=tWvieW{$Ur3Ced_)4i zk-FS=BlB?wEWtdA at 6phY4(E-?+*e^6VaIPfHP9I)=P$Zl3;1 at U7U{$!8LVQ$UQ3 zkI}gCVMh(=f!1lFRY!(;jViR~4z2cff5p{7vpT*2-#r8bGwFL57qEv6?U^BJ`nPvX4c zXSSz)CgwIk4^NcuJ#!VEJYl?pt{1dW>#yGY3t8du`#IPJvcuCQ=&b_^vi*5CJEI{Q z07Nf7f>5fKF6}VDHD1}LihEbZND3 zqhkjONZ9ulyCEeda5AXr6xDB0`tF-h|Cx14!w+cJR@^2zc8vuOSMeM9bgO7EKOrWF zzbijs^ccM$pI*5JyDo6A5VTNHuVStppFc at mFdtnySr(x9Qu|9WTRNq1S?g5p!pf#K z!*h7#j{}PF^Rh^?cNd&2Z$~uZucBR8RqhEwff}VJrH9}OSXrYGbyg8P)p%|GzX?`; z0FHw;F0&!tolNEIjW!9qy-J6bkajakwS`y{@a!ChO)vB> zMlje&KQOY~Ug#D5P+fH1l#8KRAmdpINE-#e1`G)WNhNtuVo+^7vLb4~q at cJ2Gz|Z&ToX5X^`#) zziWXtKW_$N{H7o(Xf2GOD%gHi2!o1%S`~qna$>6{67(*GhmHDYn+G2CHiiDPq*~LW z;KYU6cw9xr0Z9vS2?Uxl5(>7;!hgGH!CwyHjA|tI%fxnun<`|~J1P^ZCf3rh+iRm( zGLTxxs5vlN0FC4s=3A5;Yy!spC?xELc%WQ1b?UY*OAV&pW03^u6{$MpO1rZqfrL8>13K${Y%P ziGhoJe3nx(n at 1=w^?-8V0F_2?G;z2rnN8+`)KqBJbMKq#LO{rgSfOop?(_WnjW$dV zfxxYy1wXrQ5MdLIpLj85%LsbQ2u2H0f-VM+kM`{gjLJtg|GUqd-z6QeS}DB;MU=r^ z0Ou0J=0MWnmVm2Bq97*-l-!f3 at Mn=w6aEmU_;G|vOqt4`B4J->UTt8XM5qsu=#LqZ zFF7Ry`JQtO&9(IhT=#0lOA!ZFo%GxZLryP=X!?jm`iPT~!>9S%96z=eX?n%>P!*D< zGkXzl1#hXL1UJ|~Ou?b{?BQke=xyJ>$pmlkivk0~VYuw^2^odK zn22!J2w9~iL~+r7(m9?})7Og_Jw&rb236fvyM2`j1a(7bcUP=O4S2sM8b6r33R=dZ z-%Moo6}FdGXal=7f?LJ)v9`accbs>y!MZXi(ZO`35Ou|xIDj4n74TxE1P0ZV^+ma)523FkL^(R8tb~(}_^<_&p zX at wqqva@I4*jixOS_mwb%Jt+`zevC6=NVS#oO`T`u(mW#Z963^>euD65#5QrfO3R{ zqjk#_PPg+vPg3qL9 at lWa6b+{yXwZWNK*H!4Ux*xB3n!to;og9J ze*2Vr9Ogd{^0lw-z=I!hyr((n`66w46G61~j9dHU!#Dn|>(?~X_ZzEhX!xG%%5>W|c(ToLYPL;5jz)CSTCSeRE{0;_pKjA at _hiD($J9Pg6rP4cE z>47IFKO(bO&MsK at h~)t{r-@E2=_ at 2%Q*$+q=o`CdNNB<2taQSY6x(Y8~ju_YWED$Kb2n!In$S z{gt-W1~qFL8U-^IQ0&Z1&Bxo< z3#^w*S(=k^cQ%OG|78XEgTDNkjNL?;*-Sh~SJW%F>QLO8OPF{QLns6=bNHivQFs09 zu?m+EY-A?8;P2GCA*n9;HDk)Ewqwg7rz8tqA`6K;qC>Y5Cd6sMPl^GkRMN-t4bbZs zR0Q<3_;`N%;zgj~JQRDgg*RBzU;Tn;$+KStINEqhl)TZ0u#0O%hAHm^iI_%FI|QIg zoJv=+wRLEP at QE@Zk_Z$fCu_f)atjAZW@&aOh~@QW?vx6c|9G~{b!!uv`-)V)Zad`L z4Ai}Au;?7_j at kqXucqZ5rOgaU%q-a-OAq{=yxevAd$*k>eR7%6t@?zm(3)1j7KJ*> z5KbAJp=6Crj68rg(!-oa9P3AJ2(ADxEuJ^^x(sj%U{GW}r_xyA|5JE?Y}>CIbRP;Q zA9=&RgxE!}f?x&nG>bdB0`>AQeAZjI1Eenh=u`I}eX{%)$V&dvsW8CQ)WpHW#>nK~ zdj}~_$bvDUcZnGPP$1;%ZM751r+3;LA0#0UpF?IO=T~o~F~X7Jrb|23|6s%N at gp+n zgcn8*5!YsIIX-yEem at yGUjGfE-RlqP33-7hPaJEc=$ZK{L#3Nh-}jczzkATgluKp- znGV-b#WR&ncrr^GYvm}WNZ=OPtI$}!QKpquts>z3C3c1Bn$6^HD!F8=(pDY+qh9GK z`T2cvf1W8fw4ELUG{a7M%{;YQVyv?~w|mA5EN0>puh~IHj7p3Vh^WH|-DhQ;Zb`SjI`JEP2nrv at oMUJdZ~HM~&nE9Q6NhRyIcyr~lOi@!$P3wo7(^5&dt>`cVod zY-251urY}t#2_j}8EPnrv=ybg4fP0SSm0m<(+vm@`d)ERkx2iKgN8{)@|yo_l_4^4KR(68$NjWK^oG&DyeWNBCAqlr85?5$K{b z at JpAmb+72K+#pqKJ at O@vJGoP%_$ZCIo2{)%ijG6!`R2&R&U{ zRPIXCWI}YMf&O$iRQ_)nDj-ssG|$q6HB50K^CMV}#rm8>vwHbf&{Cl!oFghXsyIUl zNA at eE9UdOsX#{7E!9aM6gu_p2D-bCb5_-8E_|8O`i1Re2b5Z3SjspmdZi^A(c!B)S zb89`^#UKC%0zwY)Ut+xbXKw#D+jI&nl#|&czZOr$e`ctvaO%BTf26EOkh# zc-yTH&)FCS^9=SuZ#$|RiIXxMDzkl3v4PpmBLXY2WcMx#h zuLPzBsW_qsQwgD1-^ySfU;E=!zDN;m-XP zP2UzEO;)VoMOrkk>`1{R0kr6OVg32JT!xGeK>%jLjf=8E)k at 6Bp&a5xTPABH+WR;S ziE}?iX*He`6JDKe{`%bb!HzXCVn$P*-+$v-<|?gCZ}WEOLOWh5$0AqCSx8OfF@&$X!u13E0Ftp`3UqE-ImpIOpmPe&Mz{ zbi=!y#@`b00>_;w+6XG|u&Jm3!T7iTWM#2(~Iby1m zrbAkL;_(}CFfXAo-j#S zN(oH>`HNDco?HWA5F1`I6q|Jw1nyTpNu)1E*@ zE-jCG_NSQcLbeX7z%SO0CSVuu=Djy?lV#i2=M`2TRxUr(ND>~%^sAMmF~fdxCmGw+ zWFt&ySjT`K)>?L$7v~;cAw{d*0M8}RUj^IP#vx*zP^iAW$o4$FY#rfpbr`e8UBp3; z3Ag#GNqZVumoA~mSBvAHH1$fE=jtqbpSdt#HrXsyb6v6;#TIC8`V(ikf^B3THyX&; zCR%>DLN1-a*cfio#N$11AVmjcN!QL5Jqpbev%+%F5y=)N>zO7_%H*~tR$#O0-l%79 z?V#Qp%+5-;sXnhJ`9g|}&z%B+EHYf*piA>;7#quX7NYzuf+sJLSU36!@+ALAw`td0Vzw=!gC2(v^; zSxzHzytjA0JcvX&?rQ%7!VZ|bvACxsUw^zjoTvWT3ZdYcS|P3ON-nQK2Z+5NN>KQ;ouZ19CJQ>^*XEx(K~Hl7H<0xYgo-Z%ddNM90>;q-#@xsY zdV?DLokcImW2+#fc>KcH-2&C+f4v`=FG#2xQ)kH^xws^q^Dar>>V))TfB8woY9J}n z29QvajpV1AGUX_z>nlF!3QhlH at eJL{Y4b9ZMMjvfQ8WOn@?+AAHtJ_c36_A5OD5OC z?<3o1uNKSi`Iqdbd-757>z|N#`2z$*;lJrK{}vyW{=JQyfeiuGXmE>{n~8W(DK&uu5ej{cHmT zSNwm!#LMCi_}cQqN5#jW*0x~=l%c%GTz{U*1Utw@=JS^@nYlHKTU+)3t&{@q=}=%c zP2Ci=pxb?V^{vZDcB`F42Db|haz@@ML-OWT0{IDl)Gt%o^zZLr+8 z|5g~>r^6wKk;Cr%C>kkK4M*~7t=fw>KVqb;;n zHTj_%?#{Te9~LhrY~7`LO$aIG&k$&S&~r(o$i`;d!p(5JfB7npi84MTfh%vZ^Pr52 z^wP|D at 9F47n8A!C<+jr=IyNkX#kPQ>o0F#qU-5lc6>(YgdMzlULjyKAsJcm0U$s_fvnZ)Wm#EFMic?F^`J;%KcIWv(w8Hbd{uf3Xj@ z;0*l4Eojr2{xOviW)(?OzqM at VZDqSdx(e%VSt#)Lj`nUz;SKIT8(Sb%QGmfeIf5X< zf3J<~e>Ap#WlmC)4CzjflLf@?`dLRIDzMKX|>1XVQokx?wjbJ at f{PnJ=uYh4;5 zI`B~R-VDzhfg#yK&P z;|;v8m-pkJAnmo-0_a%hbKzD$5?aaml=kk^BWVzzcgtV2(bAX6j30v|IsSUl1hnLZ z&pClRq at obfS5{A?M&;r-8p23(mpugs^7rM)gx0;bP+L7RtW}LXN|eC{RhMvm0uVSzJ-FmxHDoPUtbIq!HB+ zI++Y$&(<(?Zu%n}7%eSQKZus_ZOWnn3i*b&2#oYN?vA1zSM{>*o})Dfs0O3f9**CT zPnH7 at E8)Ka*^_<>5o5|JF_}L>EIJ6MnS1pu>K6Gq6z`U%3vgLPnb?%JEF at OrHk921 zIiTC*QpGp+GfUI_p;^r^;VmFUv(u=;jR>BGy%kZE1P94}AH|xKMFd!WXtE8~_F;J? z5U3y+)={6GsWUITXGaj9H6jLM&J^#MdzAAO6tj$!;iv0x8GEjKBgUIf-mE8vS|%hI zuW$WX?brhHOIHr_CfsCN%(xR2)2b_5W4(4(ADOQSQYig3X)LWKH+_mxc2t$xj1XNF zY!j(B?Hj*Uka;k3(!nA?F-FJttJddu8Xcu!v=jCZvw>jPOO14wl&|u^*g$`$jihnI zX%_q^L*5KZLZQL#1>lg&<>lt0p)uP~srNELvMw=dFqSS1iQm=e}OXMnM9ZuISAEMw!qjwaY z at y2g4mev=OT;E#ordMwjPMurkaHpi32W(T)3k3dHI|and52%I2h#by=uN+N3&07&= z7r1x)_9aBYReCb_ie&|opNos4R_KQv#FTmpH-P+u6>;R7R?zkC3k?}={!R)rxJ-ka zA?$meQk5D~$xBbksrbbx7?Ib{@Ke}hc6(3 at Rm3+sW0vA48hww&ZtUGHgSb&QyCg&u z1kRA&6~s^}G_ltULGW``izr2sgRYi>g;+R0y#}wtoMVmU?p%Ye3TR&O1ouOTgiK%H z744G at 7lG2Fu7FqGUl-nu^`0wZe7yosB+(5q+J-O= zMaX4 at od<+IXqyyWq)mlX#dT2LCk#>rX1?<>=5kbipzv>?+D{Y3OmzXHHRhw_ at ig+; zluV?mt3T2EN=!_EC+~2;zO4S(>zUuh!^{jNpQNu5v%mNv;TV1<$gL3yN;H24S*KB0 z6`ZQYCRo#EWI|^`$4eO1G)j3yUcx`uiAAPkpXhrEWmWZc2sG0q>bxD#94N)Z7;ujwL)7O`8~xbhICeWF z9$`9zq>OXMB5)*l)cL7PqT|<2FR-R783Nsr#Y(s)A$ZRiPZ8-&2nhdw z6S)6xNkNvXjuM^|*{R1s8%AM at QDC zj9BLt(#?{VZRa9R#Sq}P?r)_Y0yBI9h7Y1MNA^7M;XY!P%xB)?PNJE2`>iQ8U!Pl$ zUh?V at ls-5ZX|fc4LKa-pj=2b|#k+WJcP at XHU!^9p172YEw55khoYVQG$&U7!ViE%o z2oYd9^YPAr_w3%j#d(DN`V6-9 z8$9~1!rxR?ib{(zt at EY2@!3Y3`4+ww7uy~-hFF1C5w6CMmAh58QsZg7R0r$c<*9on zCA+Ez0cDCDv#OmiMTPq?v;a4i5fSZq`6YXt2`|iV*3tqbDCdWLCIXt){9QJJn*H)< z6=|44Zn}tQ4#uK=8CuKM;(fZ#s)640;P7Z_Xvep2SE2@@T=uMsC6NZpekzqxqwgpM z8Kl4Ul`G&{Mew?^T)(7dqQUt{W2V8OE;i^J9@|qd2-??mb at blL{F-gtBJOnlFghiv zUh1RONceVhO`2zB1mJ3e{d}6owb-f?^3Knc#u#~83o$6rRM~ChP*?byxhm8YFy`rK zblT2u(9uPVlsIt-Sv{qRDD=TE%o&G7EFHZ$_PSAloA|&8dBb^)7>8sK`>mhzQzFJL zl!bQCjTD$8WXz6&x+1KuPnp#jGfE%~9P_;W9s1X-g`SPw)R?h8jNTt9Rz zL*HSK<)Xvk_u$Fb=*G}j43P+Du2-mDYKGn%gU^8deB=vnsA(uOO!Ypfqz7PVHcG+J zBN-cAH>=UzAzd4K27)tZglV47!Tw7YJGyKe@|X(a`(Jojw?BRY!T$MFKSlfR5mf$9 zQ2Cc%i#0rfqUgMeRueA5wcv%ZkmGv+MtGBJ6fh)xKkN+gB+bEo{0gVV_qQr)hA;fR z`JC14 zhkhrYh}Ug8CaU$IAp2m1^}yvN&P3GUh&f{lCiPZm2!q|Bi2(QR@)y6EscP^2C3Nnn zbQmZuZQ*V5CwxIiSdtKJSFE`GGR&_ zHCUx{tRn1tr}d_#6hkM+J9ui25M#fvFc7?9Z}PgV%+kvK`eU_&O#lU2g;2aWS`(b3YCsi|1) z^hDL{|XkipCwF9siHkKfvM9ui?!lVrNP#j^2n$kZBd#u;K%PSV4S9- zFBb~Z`xw5#zCJNDp-RCJ|4NT9c{FS1 at KY3&oZ6L7O;2W4#<)ef4dSb)Z^CuX&9O at I z?Vz7HG*qA(g- at 4qz&1428mOp$oL3iQU{TqqUyTkf`T8^0m3%Vj76ndg{ahA)CA3?X z1ba=g8^RVfpk8$*Aw*SQnoMJd_P&STL}rQyFvJU??na-iAVIX0;WiOkl;#fBjia=6 zUnhJF;<~WmUgTdu&BJkNc5D&S^mOQ#5V3R-Iak)n_Tbgj$+m&24aUthRZ|Z1Oy_kB z4M~9zihEDNQjlpaX{!z5$~}V!muR7X0F#Yc_=wts%cbkoj?OJhmctWktyBGj9c^9$ zDf)(c3;EAm&=>h?Ghmqmbl{M;xNrDGi>x2 at R@V7 at KB<%D74QW{__6uaoY% zg`~NPJTRe+;2>%deVxI%$ql~0 at DGN(i1&_=^7WN~@uA&vbtB(W*w{mJc%Fp5z_ti` zMcE4D_o9&oGmT9)fZ0U6U~Y%GL6)qD2d5209)YklMm;s%+`+tLSO1{{$SubV?Vsqn zsEiS&NU{Llg`Y-6M3~L}T^L^X*n;Q5LU2DzisDiKXegh+rmNsEy%C1rMUv`Goro4s zc5AK^xKC-HhCQ008Ww-NI-Xj^A`GW+ z&YxHbv(h_haQsQ{C|>yyFRZ<_nEUQ?pw+Eh9*1$+LUn`R&tAY2BZ>T7bY74 zL>4UJwIN**zT}i{2ak-s0U$r9p}nA*feq$w22i96qUWN9`hU3neg)^rDowCNj`B8& zS%nco1E= zySYh=`grA*6FS}CSu#UiOoG1Aw71YZ_D)Y8J*}oaE5%GR(=^DwC}RaIPV(L(ui-0R z_gnDkN_4Hl*D66(EmS^}XOmt-pbBIN*G3Nl7tXcfgOBNxrDn;bpukprFA7%u48T}P)mg?Znk)p5Qly*QdqPl#@|hZ$A2 zvZJSj4j5xp at R@%f&-LxH3od9(?YjPW(~d)^cK^XuTbwYUQ<>Izf34 at bW7N33G{5!3 z-yu5>YnN8|3*Ybq9q}HEv0rZx+qX<{+=mo-0GFH*3~NbAK+HaJPee0gzcERJ3D7ai zijmL=8x`Aw!zIZJ^qqW)S^c8wcyTIviA>ly$30vUzxv2`Akq at NLUS2TSSYw|NVtbaez96d4E_i8KK?-wRSf=9apoHOD!$8N at TxE%HeU&F0;?u8qMhCr1 at q)xL;5+TLInS_5Ck3Eq;(c{I3WgAgOf!J%WP& zvo6u33FoDyg7cljJ|<&x)$XFz;f%EOKRA2mAYYs%UTl5Vwr$(CZQC}_+O}_d?Zdxof&*s1m!_+dJyCRPJY1wf)el_mz!z1tes}58bN1; znfKn?pP!lc8IN9GZq`dTlVYicS!2V-C{-lRcyj1&C z--lLEvtw^e{=|n`yrVw;7hyQFk1MmL-M=xm-?;Rh4>8`zem+t|47!veckk+VC*JV% z)12V^XODjf_v1fD^G!do0uq^E>K&`=C*Ekj$q#8ib7gwS_X(KM_uRe@^FJ@)IKD#z zWZvRo;mzLGVZ}(^A;Q{(O1t>*6et&U3F1jM5$YNZ0!8FWOtJm+F-%WKl{>6qIRaSH zV29eqg$?V?rEb&OAL)gpo!NyuO{4 at 7DR9b7Euw!T_K)HWMK5K;Jgfk8xGUD+^$33*^u(`gwAOY6r$Z;ZhnfJihbN=hhl0>9Ys-mnlW<;ROo1x zonsdR2l_Us_A3ezMLOtHWx+(A@%q~n)`^sr%vL0=^}QdnT|OKn04jfGSb!JzS&^Bh zL%a2HBCLSf3ZI!=PxcI0H!r5gC5bUtI)m>C;W#9S=R>j}#YvpZ*{e5vQE)-5Y`Lp at L_2c zh^>~7(XSEt5M~{*CF(6+&iJmV*Hd^I!_c#Wsv#oLWJZjv+&R;TwM=ADk#)tAw#qOx zk&&~|PDXcgH_TN`ug26Ssr{4 at H*O~>B-bm-Y^{WWU_F9Q$M{08`ac9`cREeQG6UO2 zM|GpeFF&ATo3YTvWLz?(0c^QVEKq3vig{gILW>7Qwz#7Eq`5BkXRo1 at 2)aYSEvBfB zc5m6nh7|ktZy%5+0?5cC`Bv<)ty+xrhWzZ+`c0Mnxk2Y8h2b7R0Sgy9ExD_7MbnG{ zM^@f>*eZkA>o`s|GsxmEtJUTfeiqEA%593>aS$NmnzGSgo at q&*xuhTGWAGBM%1kFE9rp8!hpsdv z*SJGiaL-u6GZC!}%cv_MzeT!8E5i_ZEd?2Mx@!5JM{*@3^!RwoCH zL(^EGK at UVo+C~kOHCn;;f}}|rrPf3(JiIlL1J0qd`>V**L-tK?~ZT|pmly1L+eB&BkPnjEUp`edaWUY(`hPD znA@{tw|tvQ#%g(N+s6(igM!Xu>cMir-9?nQTW%A~L3oM?F~mvRrVh-QT2QtB zdVRq1D-SZ-nw`^x%va4i$Wdphp%?WynzXbJ6m}Cs;>l(3%R|ZBX@`}8sSc<#oUNV1 z#+Ss!6ibK$yv)?mP3O|pni!bZF2DPrDDc!DP}f?6OM}5vqlgMAXBQI!yiWmqE$55b zIvG)qbTbWOA7bMb8r;c2PShpH%^}-DcKMub;}1diZMgLmAk^X7dUrliF_o3mbjwIF zx;4*s1xds`$namfW|{_!XO=Et0p9-eEc!jUhxVM))@)d1G5li{pT!%MDw_)Y8^j0u zR~*p-nOU`!0{E&iojr*U`fMpnZ!*Qy&}`9v@#wAulTx}U?rMJ^HLee^b3JlJCQ4Wx znvVo&G2zLBd|Eh9<%QU(W_}olcVk;3EStR8A0`^v>jfN~FaghLu~L)FtRrinm1>9K zo^fRMs<6Bo`K8i_Rn-k#Myo7q2gOK&8c0c{K|; zB(yYB!1C at +{tg43c8_}lS_RQaesu at oSbVc(!sTF>iXtYiaVlM at -sX#tKcnslYe at Rg zg|WSOMINz*E^%{fhL*O!}$FTwzf|>L}q|< zrzI_>3yhfV&bV>Quz#pOqODb_TGdfz@~@oNAF5l9<1f*6{~YXf^-?3$f|cB#%5x63ud=e;rKjXF`G8+_WFI_kA5$V} zy1c5 at cnB#x-Wt*rhL at Eoaf7`ZTGzC*@L-FT_!cd>ye_uY?&>^Gr-&uZ`D#J?fA at xt zGool5$?Hfzt3!5q+(Z{|+5Z;}I_!93v|JUr5$(vioR`RL!=ND>)%4MWRfNyZntNYB z`lIwa5WmTR{fXS;K>8#XCLlUkN za4`qjq1tm9YxV|{zQrtg5d>YLt9mN* zFYn`o_|jbUk}RF~f- at IVhZD}5D2F>hnpwSNiUM)UM>EPAzAmQZ3X@S zgaAwBE^>zA^Ew+w*qH6t2|JYT?sg!7^jH*@aUSs7Z#%+k}YgpRky<#Q4P~+h-y1~ z at r6#UzFvMYnrrbaEnaX!WVw8sJ$E%+EX!t!xUh4f!PBU=An^X1*in~lAIch%DIssD zuCPsLK8rVybI3_I?L(Ct(uXp1AoZ|MMLV>}Iy+kcJgclIAo0zsfZr{+c`7zBzyS5L zl4OdP8=pSU?vgMo5^P~J$ANN$& zepx}1zjlmejWg5PpNfJLY{Ly{_;?qH)Dr`>%nct_YR$0JfxE>Xs^3cv^FeClX=)be2#kuXl z;g7HN4%;cy(e}29eAoNn<`>x^ZZ=|+C$V4Y11EJ13e~OfVSA-(2P at mny2Hz(^z&ck z*X+Xm4p1*1a)UM%0LQg>Vev}3YcdF{QDA&A+F>)?B*ESnQ()GQ54O@&$p`suRj at 50 z4gw}TIRF$2R11l?SFbsKA+65D0@G2x(ilfqGVfU=`#o96ww7)WpL`%ChNlozw2Dw{$aLj5 z+(6*?QZ_YA|6)(wEwfE%qyyK9ikA1Q#dbTY%<)Ngcmg-*LA7E2eyt at Y5V at cR$jN1Mg843<&5D>Ay}_ z|EmO4^fN2zDIxFnrA{m=mnL%=e!YuM at j~fcH-gAQ?sz z%t38fj|Tce#9>PIc8g>T4=<;9jQoeNSz}6Lny|lXar3))`o1&K44(JDG5+x|rQf26 z)Y)y~(PRK}(MF98^}gjL*sW#d4|M{Ah;-I!A^@DU2}kWUs;-8XB(1W#{Tg%27v at 1% z-5T~k(}+{qXi3=gmSLUi6{)H=GF0bBSTq at CV!P_Ju|FO;LOu%BERt>5S^7#=c at J4e z73%sL7jCK8b*PjPs>`g^omoZJ)2w4>o!YG`HZ9tNC(L4tjmy$XEf#p0u<@%RJ`ZmR z8TX|bZpx18xE;yF_&*8Cm5f_XALmg at a@%y*$=>EW4zx*C)ojZRUhq7sk&?Dy*-p&g zh~fRUqaFr_H6$}NR%oN(oy{*@(~+kKU7)kPvQo3>+#-d1w>GWT_eS3)8HklkQ;=Kh zB`oQ9^Qbv1{YA9R4!vd0k8^OCIU3V&Glw^j@=M&Bj)llSvk7spsuUtonnP*PA zD2?2L4}4Y#zWMyhk4*}E)->O

+-w=k0=O-nk`k96VY*jP}zjJ9tIH;Jm7tn8oV z8WkFMxn_l1ox7&d%Z)Uv+|Ox$b-M>ekZ7{ts%z at 3KLI%xyu8slq$bc&AxSaJXH)VK zJEB;J8436F_IJiwBgA!UlaZOB#3F9lL->GzPGG1YGg90o^XQ3#o*!?c5B0;^FW z*n`FaR0)Q2W(PJ{XJ~Pcs{ySpu2PlNl|E_O?6FZJqjSNO>90!<#d3=~ws#sf^6dm* z3g#iAS1Z}xRo6pDv@%}Ga~Iu{?R|2fY^RFz=}Nx(zV`-a6tm4rDb8B8s}_q^owN9^ z at 5H#D{Y8<}&#f`AFn+aoeqQkl9&CcUYQFVJd}2Q!8AFiE<#*)E<>O5f?1Jv3_o%dq zzF~b1m>=N%`C}X*Skwwh;D1qsUNFMecRizhlWUncW19qDflUt_VWbquGsz$i(mPPk4tSWRC1^yM{RZ_kPKX!g?V8h-JiN zWC%9WFa^TUI|W+1&WMRt24f~fdKS?zeL){2$$S<_byE_Hb4M#Qx!@y6v;Yyr9ziMNaF8>Xx5_ztWC>dYH at JT9Xn<}xFtS}@1!p3 zrJTDVQ6aq6SbbTgt<`i~5R4_5{BHkfg2)cE^ z?g5f-^eIQNw2<5S(%3Po0}LMXw#DLRlkU at d&dsBvfVIXFR+x497I*{J)rt1NKO_+L z9d(`|lv=1NS(ZL$W}i-^<^orgU7HObfV3fZV|OVRodD?EEc)gK6u7~b1+|eY;oFNI zO}%cdx$e)}@uI0{sudbb4nvBgZCPkuOQk>0HN(nFXhrfVJp at LD zdzKt9tzb at I%w at vg{@{=gC%I1%VuZAp>UT07&2SwQrPSa+3_c1kVEXXz0$5p7d&?ZL z(x7`%DM=L4Wx{%AgvMB at voPNWpL(Rn7P7)5zR_Zga_%A_|A+=)^U)_yBOxcHj+;l1 z8V7^pEzUfiseb{iN2g~C0($`UnRUb at S-JrMfi7y4;6jF07n1<0$~RNV*dZg at c-iQ zp8q+9)|}ZP?NDVMu03h*%#YF%cLy8$^zvB?vl2vVoMMbS68UV{nReIsSIq&x7kHV21BC=h2?u z!27at5vU;|=QarXtqz4?w>bW`Ywy>c$i^!Pl>Ze7Pd9zPg6^HlTPBP@{2#|aP=Bia zdfhvlH at Msv9Vq|PAgMbaj8EWiNuTedAb~*x%S$*8+HelNJB_z&uz+&Dp8|%Tl7nwC zf}b+KpF%$esXGG<)xpaMVW3RJAd{g3a&=>uer9E1gX<@v`EXF7h~!q?r~NVnEn*a0 z(;}FQG1ADCg}QNiOF|V(8)`q<;&|o{%5=$4(K4Bmq`o0~vN8za3p44TPD@%@!51-N z=^8rJh|yF|U at JLgxMvzB5EO154!f5&ciY`PgUuTX#T@`m1I1i|Y(-&MtEDF+A`EE} zAhkj;of{E~G>Iv+Pk2#kTHApV5liy_`y zQ5m}dD^C250#!LE62gEpM|N&mZ(dXQ{8ky6(o|0f#<{@>9NYqgW!kNBcWLH?JLS&M zSYU!=PP3~(aiX==QeeYIIUHMwJ9(d0pJ5AswyZ at nXck&Q7yEK(PpPF_gHRYF_lFb%z?v?L^@0a*&tfkT?q zP|Og7ufj0-9JNkPhVC1+e4&+gBPKZx-3-Z(R=l7)g;G0SQ^-3e+g%3Ic2)yWRbqHQdeJIqDH4*5k&rZUIksFoVpV9r31 z6Rj;RF3m+|k!eUCpj$=At`{o~&0*5ffooEmfsH6WUX9OOgPr|{F>}gOEY;_qvm$b5 z&(Nh$cI2AahAY>yOUv*uh7nMeI(mDc-XMrN9`k2VrG)~>T4 zHM(|@xzsE6q=NPA;?sSB{2Z2R`^vhr!gKDm9?Ye)lIg4%E=tO zU(9KrQRpP8vjsd*IC)-k;bt=8d at _#B8 at MMGKj7t#-;??da_SnmkmFvedDi%n>+rSo z?}}1RC3#YRql>O)yvgn>aUt0$=;75;eqWSNhsZeWn=VN*ro>eH+==E$jH6Nt`?3!w z`%Q^vKk%rBKDgdShz$lrV${RAvZ>PKmZGt z=H+h#ARTjM1ry;5)V3@^zGju52W=Va5q2P`)Nj@pFmVu!sR>dZw4r zX03>t85?J%-Xm!mCwr3QVhY(W1fsI2vxFTD{<1ibNS{xU z_|9BO26NU8ihMsdBy&+Q^UKsSIGj|OVKCN|D6mtwTa+BGM2S3l%s53RZOoLaw`h1r z>hBC$Lvu!wH2Gx3j9r6t7|*_bByIXQbbB=RlNwfB9}`wySv(3OZStdJGHf{jyxek^ z#Sykx^x~{|bI<+pj3|zGMJxMoqGn1!K$)a4x`sBQK?ux>yt*O>9g80hK}B4GYPUG$ z0tGB9N+19WXEXKts%rXm%LvL677~*-b$eWpGLOvnP-5rJLPo)9ZYHNZDpUzA`DX z7`_ at 6litGZsH<>7_CpLWWSl`ZyH?f&m8<3LT6(6EpL`-h;hsG<7|4pIq|Rf&$@N(# zhC at Ki=~wKk1EDn`&^6&{`k>WVIY0u at r}EG_33i!`qF&kVgs at wO|7utK!jLOi(~sw4 zaSHji at WG{xpZ|op?JLiHetBf$cbo$o(6AMg<<`FE)Z`N}`?mg#5ro1mp;E#K5d|fbShv=vp$o*$&TR#T z%a>>52p at b&+P=8dJe+<>DHjy$s02Z_afp%9iP=XE-vBDz0InDpB$EfxF?w-+0r2Vy zGa6u&Wj)ZHb)0BHYslQ6Q|D-f6p at X8AI>niT1OB2qL1?D6Mwh`{cXzsjKT22T&I8`rEyM9Tk=jlR zlE5S+-FgyypDXANSI85dLRM!JU}mzkNb_Y}YEbhOo$3!*h^JvAqYu1PjQm{&c3(tF z@$#4Yx?JWuoiO7n^~34f;7LM z<%d=_^ptVL7lLHsQTEvmyFziBLiH7D*-zMwKqI&Hqd{#zTPTLcJ!JQ5yM41G!~PJmqmUa+UQW`W5+_n{gY zAq;M1!?_dzC#wd=PB9wZOa^xBf;}>az316x3`KMxGU32xq at VV64}d*Nhk2omZp|=l zLvpx9kJ^BALQ6|V!!J!Q#nFG}lD#sGyAU+e*67o0&l7pPH z!945#6!IXh$U<{9fS>yUdC~^+W9W_#zBwr{%cCfSP4_VXfOcPHKHX2RPSi zN_l8z2UJT+uQK|n==O*bbllyALd1!hlxk^myXk ztspqfG*+=lH`!;d1us7t6=RvJzU3LGa$#+9?(#|4y0J$TCnF$Q0YSDj2T=}aKF=u& z5pgqp+9J+5QDGN$a0HtoS>pzg;F>~Dk&%+ZuXlr-VFGcxbWIA8M@|cRH9aGR%01KU z1S)@sGkh)&e1>)=sy z??U1(0P}!1poDQYBrDBHfRqE3HGLYZcP4{&nG|K1trcHYTlkr^&!e2gJ at 3Yu<$@vzyr&)zudX}vefP%?qniEJQ zGxWvR-#eLziDv+5n0 at 5_`~vA7B60rpW6FRR7>0kLlt*OA3l$wRg1s^vv!KLOtU5?( zH>`QjoSp+OB+{^^dFU`s0anA8$6?aZ<$gYl-KRW(%0?t&wQeX_djPPop7ZUNCFn$xF_D-ss76 zE+Dj=lSjIYEef>C%x>W7S at AzQzfllWwa-iNhoTx<6DsvT$4)N!I~}Be0s-~I|JQZ? z|I4WsH*)iIH*>Z!HB+&)viqNL?_CvSCDhSba8$DCg+^H_nt+1JkfO|l(2C=sF;w$3 z1sGkY+%L9C;g1y=gy*%V09HOW6}g^Q3AWs>uFkFpk+leF!ENYwrcurKM zM_iW37E!Y_O4gaU2g{0i85I8D!;`-SDMo7AdX zvhAHX-VI7BiB0~{ta6Nf!P-J;pE$l-!jMc=Y7rM^Q=VEeQ5yTNuxiDAIwTd8?TTaE z_z5?$dn&0wkO`Xm={5U36>6{Pq8t5yxsoC3mVS=BU#%hr1p|ihQm$JFUR32-DNk3y{yWn zC at p8{QTbL|lFQ#hn9d1+Ov1Pq{Z$(8ZAPDK!xfeCRh1r%KT5&y;jrP3C?rK5EzbSP zx`-|>-)+<%yX=2qGM-n?{}jIxuv=4qG+Ba?#LFA2aY at Bg5vs3eiqm9_$d@4E85yU zK2hZ-Un|4rj{p0tJ-&GCygR;lZPJTimdE>jY8|}2JU-fScZz<0E&3K{1Y?g#Hze at S zze{|?C{Ya>Fc8r9|7%-}e+jyjtC{ovF82SDZ at 0v4=|M)+(VtA0?TghdL9qTyFQ(wO zR at krtScsr&7*n>C7}`Yo+}o2-ggueSay^dR+pEGaH=Q)!* zlrB%COhTyvRU^vsbh+h zgIPgMHO%n)Ywns*srN%$dK8S9i#me5#u3>`IXHnvue33rQmYexQx=MRjw!c9aS`6* zk;>4Vj8tvvhxk~4Jg3=ok`ZU==ze8OWm--hj7|F+#M at vsO}d8|IUDZM{gAbs$;0*y z?DlRnvGd^s{HwQdm8}487%?zbYM>5eW!$BzwZu0AcD473+DGA zOdSDE&+mauc~A#N7f8Q_3h_#MhAfQ?3(?W%rmu=O!`Pd_A(L5Th3=L|1Te*BJ>#C` z$)qvcp0~Y`Wp=Hz6ccfqK(|vOw#}5TpOKSa906lWZQrkP3@`M!&-)OZPQjC#t!Zxu zZONhvNSEcQ87)aLWF9&liXqBmfwebtTW;-`cC55_0Bal3BaIikds^RGQ1#2zX*I{T z>Cl2`?VHPGgWFVsv(Q_f->6$5DS((r7$!lyQ at - z&Z9fM96ymf6CO@?Z&5Vl%y^J>U8XcoYr8=@JsKhpKH8;L5`%+i&J?WBRAGg@>_<%5 z5{;uT&zxOMWq%-c6o;0wbxP-s2oPVzf-kM=p7M5D)N=~#^5eKta}jUn!L*-XMD9dn zjhuIklO9G?2_Kd at 0i|A{Upqs;plx1C zdf?VLcimJe$}^)5tkFV0MVj?FRMebt0nuWA4sxKy`7{!9Wx2(MT}2g_!~aDs({k$P zV}0XW?B6N1Ka;&8vP^9$4tPQKqRf&CWxy_e5!LmWAJLd&p_)C zy(!2v%Qx|8M+Et)f{f3cv+2-g%-NA1qS!i^)SnQwfq)s;%3dmi at 4lwG)pJ}$xMk0t zR%K%zJAJ)&6O)QgvXgForaM=CqGD8Ar3Ir8({FVn<|vL?{72gRThROfK;#COde_%F@|mcLjHey=L{?l#b_9%w+C>o3r^zab>X zxWsR7#vcw()DteQw)`TWK0^yUqEM?-#0J+@&2aCgPSWc(H$+ryHs^+Rl#Mryzqw7q_F|YeTg9;Lf6X7O at n$RTsHJO2 z+K{$L+!^*bq~WI{eCpot($CK8?WWj^d+F-7$Ns>@xqJHW^p)}WN06|-B)dYkIkt;@ z${g at 3C;X>XEG<@N*YppB2ciH0iT?k9 at c+>l?B9UAM?=a5M-26QBZ*cAp8?R6WhkpI z)>zC*N;)(`3P{}(jRfX_2zR4(OJO?1Vq%#X$m@$dz__DHqV5Y(6|%2{{`C*6JAy(- z{e$bOO5HbDvFbe76a^v-^*+6?&#(Fnov*X2yFi%z5=@kybYat;dZ-Sfh0v42zXryl zh%rD%!I{$H4~%(Yt(3Z{#9ftWBL^Y|VhVqO&wJ5?iD?#@MGqi3aw(w}w-3!_AG)XE za7~ZpQ(eTFyM!11QD!$W zkNj;dm6peJrMo2A+={#ErSCSDWVwSkIAT3j9g1vUWtEa7_&3|2{BNY at m7=c#VkZf3 zS-R)2rMggy>S!}2J4#=Xx0DUm3!bP9D14t#=5{LcHXrtja<6 zhb8HJWrT#ENHP7VC#u1ukEvQzhdzSIrFdh_Gv at U-j zBgiR6sbqpUpT%~A(fNb*8b{4k`9nGlLsW$J2^4(PQMW(5z0450991^@1{l|rvwLMs z)X7inyhq)qATRFq7j76wzmP_+W;2^mcGO!}@x0zc zYX`+eXva)Qe%|iYBEs)Ue at 9kA0+X(tzAbz$Ycp`7{cp?dVE3Xl at m z1G>SD0+a+8Mcx}OUgnV=>`oZ-ZCz2a5f*K-tZ!hP=mT#mN0Qm>*AdQJCh{Ie^P$GY zk9g!0PvN&xBBE2g9N4ClX4$sl^4f0!_C1OaNE|$;*ufPwf>r_0kZY^P*!qxdz4$K; z!7B^jE2*l|kG6T1KQV5*D}+CIgytacmQ7=@z=`MTcL{6*P)gf$Pm=K4!VVG09rfa< z=!x(U+m+vOw<964s`Jvx&2(smH!rWf8Ey**&rM53)nhI{P^Cd{GMks31UtyRq0fop zu-s(9pf|SpLJaagu-=J at u%a>z(BmsujiF at KLbJ-oWWBuSepGLvy#5yB>^+UVIM@@5 zZ9%-{*-59arM!HjL)Aea17A!GIwVK_CU!+TwUFK=^k+z`LbFN>HAq`!E&Xy)Lw;U=`g+1}PjxmOUX}48W+f2jqfOxB4SA zjs9ryiaoK7>ixucfG^IVNlZJt(V8LKVjaK4o3qw{|M+A^EaCeZf&c{M_m9^^_1`Il z|AGA4UcRUrct5?F+gIi+P(-A_!pg#s30Dvx&A6cn$ijW035v+b!L9AKVT{)|ww=G| zta}>Ns#pG6*4p)CRapY414mZ0Z at qOKYPDOm1@xbLqyM~`ySuxytk1N5y-B#6 at BYo* z-M#(Vx$T(_R at ibO`0Zw^0c3N}N6>pahye0N!Cx!TV4sP=A5W0Ye^A1IQo>&&aQ6`5^U#UlTQku6GjjGT^UoLA at 9DQ{ zv1bncdk_8>gzp!H?|V(~@6dopz|UR%&#^%OMjr~Nf-UT4 at ViqOWX92GGXV=f`LDTt zUf>fmGyjuErhwn6O+fDh)Dw~NPz}=RXuqdU-ZkBTaK?4m^9$V#$kSGot+{j5lM`Ku zvEmd)FjE at ps>gRUNmG?o_|*sZZWkBFQADgaM$s9;K8&q(mlqFw=tRtB6IHpfBFn(h zG9^*8#$na=J$aMka3d>ETnB~t at -SE9tbJ`M6J at Ipxh}N-n%aBb&-Ctq`tgbE2X2S^ z{6c_-CBWxxXu1XRGqb#oCqKwVi5wD at y)Iex6fT#bEfZhN4IX!5t2{^1!I}tfhT=<_ zAytE at x0*tC)A+ at FPh#zy z!85A3m>(f-Op;jQxPtps5^qHnhDP69CaGaJf>h6ENB`E=+C at YhkYpXzizcxlejBgj zzI58?Q zG7GuUSG$O64z(bu#9W7noCK$~w$SvS61!FwBaTXARdwWX(f%B=5OUWK7!?57FU*&j zKpeTW0tOgy8ULW0cv2Fl)Rzff*)&MM)iuX6+_53!EgyZ}c=99>UL*DlMAHTB8kaFY zrUbFhX&S?_iF|=1w)Z{V$U{NB3GLd&r($d8 at -%51?&~Mow*y?I8dIGmwA4xZTA zDG}i^a;0FNLac at 5Bw2abG2$%aB~=n?QCm9}@LM9yrzOnEOIqZXYDy?&*e(6jFZQXx zQZ~~HU$&RhE~&!ab)p(2%o5JKQFc{Le>uZs^u$Qc_|cDkK1(KuW<=V#vxNpD{d^60 z5;#!&Vxkl`A2oAe$Rjm??vMm*Boy0^QihdIM+q_!QZ9Nk-<>u z#=ZP#gF`&r4>_?RybCvT1`2lmUJ%ZT&zAhPRLz{2!Q}?%5 at ViJv&Ve?i$-MkYjT!K at T>L#Lz`b+9UQPB79QO0R4Z8v#+5j2q(#Hl9?GZDZW! z^(*tN`lCdW`W3n6*-9E;4R8%HT3v(-wrrE!Tq(D<&Ja0VU9Og!bQeHDhboLp^H|@9 zpK?FNJDpo>nUJz?o%&GOcvKr4Q at e?QeI%2SRb6|X>%Cy-<1%o2%E0b%CM>+X0DErm z#an6%wd;i|9p;N_pPQ?MnYkUA*2;<&SGEeQQqeej_!eZrsyR;Ig at 8wZ@r8GT!#H=v z)7)|s3A^jGG=3OrYK}Cqp3wB}Y9{rlISbrXBRO~dUC%0?-mPj~MA1+xCeX4ax}d`N zq{_Zk?l|EQkdyOR)W3 at sn~7l at SSU)4rRHJ9+p4z0w}Ne->=JG+pnKDsC5)6`;=r4U zdeyHVHmzXqQ?>lA%%mE`!mnQ5;N6-q6QWR;AZrqh*(t+Td&gcpeZ8McqdV2G6FcyE zsX4PQC|7_Zzu7`>p;Oc#zH(%OLFxIM&P;P(90D)1FEbmhHHM9{6El`iPGP8l2VcV?4Fh4}HL-)>=M191c>D#)=gWvR at E>zLyvxm#vk+_Z zc;$L8+9YhndM4VVQz$*(N;{VrWkccV9h&*?OH>{IN>-!RfddPuVx!mc8YYW^$oiE^ za0-|fRRdpUIV#G<{>n4tiB2&uO>^8v%Ta3=erztIAz;cjc>-0ElRdWcDHb6sI at dsP z=)=bK?qn&tx_j at G3)tw*jtSHstr&y)*Qk@}#nx~U_T3eUb1OIDV;v$}A ziTRSfaVm5x1!rOt(Z-(ZxhwH|F8Fyos?Ij^fVjhSNn^Yh3 z`(i*&XRP^)W2eYzBT~APkuGDaP%IuBAxtD^D at 1%AhWAwFLjWls!y z0_$g#C&la9RQe)i-WhifsbaAZ)g1R@!`;VYsm6ngEM^3B3T_hYnZ=XzeVc-|pfjLJ zjqmD{BfF70*e_-ASkbkoCxfrW4TGZ?O|I>EQVauA6!xWT>_ z`xCZ*;G#dgiy^anU+_MqdS7 at 9(&T4x|Hvu8m!Jz{D8qCwID?g_H_Om8NNGpnEl^*j zYyfnip*84tD>kDe`3h-p^q`RX`msF&(04iXzO59TV z<(S1I_dfOHxPCgB;$gQ$0P8Y<^>A;i-y!hEnau=v3#Dt+czy0xkXfAfT4OQhIZ|X>sVj-KGckYeBhZv;t zA|rA|@Gdh-(T^p=UMx=78NI;=9?>qJ^pr8X_gn|BGsO2k7Kv}$+O+-;>^fk-)GZF% zIwe1+JbPf&s$&`LvxP-+Uspcg=#K9<#qVusV|Jsd{22=0dSIhmlR|oP4m|LNZ at r^- zX)OJEkpGrw?EiKJ9ll*g{j;k0X9l5}RRkY9*zh_(KlJVA!7pvuZ8VR_%wClccJ)%wn z_nm|AorCX&`mhu4_a1YRp6Ty|Kr=n0fLi&xpNub<`ea4>zj5|XQKD^2wrH-jZD+2u zZQHhO+qP}nwr$(yO52%lSG77-b at qGj)~Vat{Fwiv_YpCAMD&QmC1UH1vR+WNPk&@C zDy}^YdW6@(_uiz?O_fh()q_?{bPV(}{Y5<83Bi at 4x0*2xXF|XnsBQ&oI5BiWca`Ltv35Jez_u%E3;NYa{VpH*4YXqLh2QT$0R?p)Ka?_O zphr)ev^`b22XVJlfoR^OATY!DJsTB=E1Lais_)%M(BDuCf`|CLJa6)(?~zzVhN(nK zUC~KZ(OEU%oN at UfR{mU_VZGZs-a~p)cVnaayv<$ejW;|h^}%CYvRpEf(b8ykTFz%# z+F5U&b at SF*z=2-zkTxCw;+&)D*0JQiAkuC at aRz8aJ7I)ZapXW12c$-%sux^^Po`=R zsAXLYS>Bkn9uylHJg_?>#~fbCqeOJ6Jp+4RjtOc`cR19(|rDkp~)8-s|zCt}T zeW7G&2%~)cT#_L-(>}7<4kvvQVonPM)3q`gITkuBcSNj4##*3mBM{l8w1&%Mq|ws) z*9RF%e8=+JYF2&ALVYX4^p14wz|%h0{LZJbv^JZ6RBf(hSjy0u|Az9SMWkuPMQ1!Z zN<;WKvFO+bvN8YIyD0duH{Z*1E?{{ z7pSr%yry(b!vPiX``#GaBWFftldR}=TMhRoIUUx+(bg))7l(c at r769`H6|8sWHg7a zwCQn2qnXy=v>P>p9?4niN7pdIWqy=*gN at 79g~rLl(iA<$j&pYi?$$-cd{emBpAg#- z*n)@o##Gc4q1kLBDQ=99ss;xRF9Gz{dAIMsjS`fAEm-#e0s!QI006N4i~8<=_CNf$ zB>~xr+W$5(!@aoeVr~vqppqX3US|EK_9n*&H9cX6kCLu=i^#wB7Y)i~V%V)AalE>j|rmaK&Lvk0p}n;Z1ISlxL&C>t&O?oJHW9{EHD)FJzRA1V5+?Rau4l`BY)yoO{< z;G*a?W>_v`i()(>Qys?|27&oX?9`3Q){JE^wy{F6)*3XsklC;=uEe!flZ at fx_&o2j z0TpYlVs`b%Z258dC6u3nAzqWt?Yni+_FqP1fXg3st2f at RNc(aJO%+VtZj+k|Z zz*@V{?dR>DDhz1>?X%OY&b?S8jq;SW$LHscWBuG70~j8#n8?tRI{3lZ+;PaD at uZY5 zkVc`#kz+COuHgp1k|ry5v#L$ss|>apwWeE z8a0*|0luA;(q)rXFXjeGuJ-(XYAzK|foj1v9~*@T4+-xHJBm~{dEXea!*Vs_7SH!$ z=dbsmfg~m<&%<2D92t*^OD!2shM*OEuHm at -8zXDe;WZ2p`7Hygb;OcAn~B(0oSd16x=d8!IvafMu5oWKWsk}GM|6yd1Ia|ea4 z-#hD-AnhMP-aI^I=M}biz;ZD=qnpdAOLoRi(vQ=d+FgJOw?skEN_V3>DmbKKF6l`Q z3XYr$xBj@~Q9>#e=PG)?{hgf5!0Fdl~3{ z4fYYOI9s8w4W;9zb_0KOSm$)J- z9%YkQ!jZrKdUH6&QhNha&^^oo^j?;zbKD}?lw-M1>&L+~1>VkrLX=wNTXT;J;s|NksEzS=H0Kocx zgV=v;fY6jhl866>wd%ZTNDgTA5G`9nH7du~(U2cXVG5unCgPzvR$H-hoxU!I;K9K2 zdWwC`gBZ~~fV&mNI8Cx%OsUvjv~qQsnR=PdN at wr&@%@3okBw$KNL$R)=Yhpx9jOBl z94-g}zsIyO5VuHC-cqp7B%pYv=It&!fE`pzj;t=Brpko^?LJ`J(rlI9J>?PfX*^+x z>bO|3wuxJ_!|_;Wsf8%KIx6jihXmGX!j`OJpfVNkG<8K!a(0bnjIz~$_1&<#bg&>< zrWaoPz0#ha6|q at 7P+`;v{35mQkp#xxL#LZAqNvs)5Ag_s@`6rCEb0aZjRj;KAqZch z2`<`{pmtZiihN~8qM1*ok*S>iU>Ca5Vq2Q8yj`MtXe^oY5gxN05S5IXf3#$^+M4x_ ziuQ4x69X8*F+x}KJN$z~<&JMy5GU0>m=Js$_`GXKUGYwAlmqu7jX#5fmnkL!anLL6 z6C)~)iedsfUH?M3cps-CJm)}FGh6hj&_D9ZK66!i9<#$IQ7AS*pZHO3F-<%ry|=TO zGya5)hHLRIw^Ju at U))4a6fSR<+1n;5Q$|{?MiHG2?C0nvXqxWJmr`n8yK=sHGC_Pj zn27w5h at L-nj!4`%Y7TDB!7;brL6`16yhp at 7;kz)-br~y*P(77_AbUjJqtt`x6o1uS z3!f;wU4+wtHh~lPV-4)31&YQ2ng+2?yT}wcRZKJxvCl^FY=MMWACCSV267NiC`W#2 zzE;cHUO$4~>nzZB7bKSrG#7j?*-sC3Rr3bAfx0>d zTP7~4Fv+_isbN4?wlC>3>n85%hm*=luVsgs_#d zwXu!Ue@;wRCtt}f${~;Bay~C4LjdXf734{sht%Y~P6!Bq5|JqKK!?9qTd_7C)o5?b zr2a at CB?%!(N8v@?*)rsGqN=gdO{EpLm%g;0zHE8QY<_)yokRH%bBPi9XHp;|C&=ZK z)|C-P1V}7OLTpLwu?TK?ns=-Z17FiYtF*ne5pyjb;|l(XH?}V&f?hqQ8B}PuV14Yc zUIketw^~Dm5xA`=#Up87haG_Ik1R3vsDz%>*j;bO2{9Y5u at BjAFuxNEX$XV+FRgo2(oYME-c1#x-61#h{B1VD8k5d~ImCWiHCTW7sd}4xV_4!E z1gO!t+=ED>(8(fJBv1>DbRq*DT2UiZdYm`bT$87Y;=;aQiq5-0P7Az+-I0NHj at X;Q zX#n2yQVudV|27rXYGcN7usmI*yHLeq*oIxX$9w`57RR|9f1RAjo+g-JOIjcC1^pxz zCs)I!a=i&BcC{sAi~gvEWk<c(FkUdH5W2fDU~D*_u#*mv5TZ3t$ot|32p$lx{(1oa_!ugj{Aktw-RL zUdE7wiILw>X(e7Pp_IPwkDTI;%ZpKNf~6c_614)i>43f$QnBQVZah+ at Q#_n%>( z9C7s_^j8$vL;wI_{@=s?ADwn at irA|N-?*KZRFh%{@OsdQJbXKYW`e^mi2TUd z49avjPZz6S&b_rC-3Og`JU at ti;5!lf6vzg3dX#E5{Q%e2!r(Ch2G9sP7=DwJ#He_t z!AOuQ26FZZq@~E8+#%F#7{fW}*MnbO`)skea&{S{KW4(IFQ@(J-{GNZ&vul!{e_>W z^eNmk4W!6i<$L5HvQSMkf3BUzouUh_Ax1}lQySLC`vJ#n;Zlm}fh-QJG zm9DZTHiDgYS{_PrO7#0%&I~g=R-|k7ag#K;@h*$2%Q!#BdJcLN&q_LV?v zQgmb-&zPHt+lKu7hR0x}8r-IyL#TzMpeKdTsdHq|8C)=x2o~OEucFQ%I!|k8JQDt` z%k&bg?>e4W70m?D$)=X#8i12|u~;#_RFb*!}pj zHtJbzCtb=t5~tj5P4CP~VUYL0q>pSjut`yZ^@&$;S#ho!*2JfHaF~y+IAdf&Atp5p zOB{UwT75B^{{`k8o}`1&DmLM+2!AeP1gQN>-iaB=_HwrUWP^5e;BRDahPdP=RPaSc z;zgr|#PG8O6|H*;TIAD1G_U&+J!8x9IQi*j9ChyEfIbwIrZTqRYD>xFE-wQs2i0n? zm!ELw+^ej)tStTGNm$7o<=+tZ$i;$#BnJ+q3^H%>qb64giOVk-TDO^j6+7d9D10J) z$zNL|e)iP=n4ny$(g)#C1sl}fhbER}s z9=66Fv2 at e!XGi%N#G=><$~TC24&lS$>E>4h|wWc(EH7+tqeZ1smY?&PXU00|hSvmSahGEYfC~cKMGLr2zezCj%3JBCj(6cWY z)vCSON77N~z4o}0_Y&0a-OZUp4#aW6k)&oWuWjj at KEM#nwgFxx`MX9fo4&jvY0c%V>znlU?R~F4ORLqpOvpy`Vp}cQ at _dHe?jw*!^575AZAg^ z8s))g-3wjSfOLWBCps&3E)z~kn|1D01e1EcHN3}qT$UiAJksnPGhY_|+s}w#OURdX z5$%9%zyMcs2+&8g!NwNOCzf|CRTj%dJhu?V(y(8HtM5TH!tc-M3y+LLg$ffXugL3H zpK(y|0qnWN6S9|TAqt|)Uiuf(__LU!mCFuXMdEY`kDw#ci~vNgD4SFM#JGVvS2jOa zb{htg4_8j7%x-p{j at 0`Z+PP#q|05#dL$1JE#e|E_M$g0|gq5iGCf7zNZ({UQm2hBH z{R%bz3Io%ItWWnX?(-MPyRLvFLvzGg at b~KHD^0=>6o(4!8LR|vka(y%pVZnJ>ZCC~ z(yuWg00wzbg(qUmaxq{q^F(dfyx6Q(nc|+}CEWlH*`kf6TL=vZA&W0J!zv1yJoTz1 zH{W^ zAxC3549Ka95yOKgfK)mfN~zpgAG=oLl6fS5SKdRfk{ zjwjtXgVrZKID-cLTYocUK$-c5STSmbymM~Q78L3-++t^Z(8A+sy05rfz6!u3T{)2p zW(f*)@p~UhH$}G25$}lPx`AyDbs95aL*m1NFku(m*Hk6v16;~US5NJ$;8DqE$70SK zRrqcSTUFQmycF#gl`6K1#7gvXWt7U7`CDk`&0GIMnR#92NO%X;HjS6?j;=XBqUfmo zi82dyJlhW_9!CMJJcF at lDY4)UBIF66;1SWN0zFr-r?wfzL7WqV?*qTC(n~0HR?Qo( zyD8BP{-`C1OwVEQ at pVt0a^MLOGz at x}FdtYUElam5t~Jnn?e83& z`FZu$W!{*bC!&$})5Rz5flk;8bU6Z74;!Nc$MH=J3-R8P79)@q*BQM!-z7w1yWF?g zlmzQJ64dVHQ>pKM2V~zG10kHo=*?i?*pJ^szmC^UWPsBWtcTmdN|n)J1iwOYKQBb|nk`vOT?nRhhc2iGH~kE3^n%rYgDh!CjS` z+~=@4vO~fID}qKB%k5vr~Yu%yoM6 z(!3$JYwoYKz1kfL7+K7QK0LO0R2enkO`S_Jp_225VSxy#_=er5w4vQIb|*`wIj|=k z8OHzI*YxA|o9s~H5=6E2Vi{8(DG6|$y7iE=WB2#SJ$V97z7+il at QiCNkdq_p5_f5} z=xL|Ngz$7jdv)HfWu<1#xcBEP6)hG;RYJ$^bHLmaCw1{lAa{7|T$~#Mtz?&Hi3TE;T0=d#T!f_H0TPwCSHvt)OC7a6Lhj~T{41dD#;e2uY){JT$ZOUx)@5p% z@>oN7uO%RwL4U((VSyJWD>p~OkBfJK5r_5tI(y1l4-za#pp5I9p3kHG^$+=N6^F#C zC`!)$=tf>n_!9b#*mnMdvcEx;1^#NP#B55oKbEhBHM>V{rIU6pw~__Z)Z-hvrwDxO z=9T55+Mwm$J47Y3j5DKAa&PO~RYxJt)SUp$twk#&h+;GVv1DQj at GfK8e)I=qvt=FO zq>%eQf{^u73#Q*?ZR$q+U{;nd5!w?o>{-8c8ud)%}*j+%SK at S5#xbxCJT zMr!|3^l%_kH$1t4ObS`cS|Af^JqTHtZ%9;oB*u_lMMG+gSJ7$2D{WX)1=^i2jFXYW z+0|9Qp=xE{4T9gfvcTZr03SthJ&r0-$O%Z})++X(b9L>NxHkNN zfyg?RE8pVixd4g32eVYL1=A$iX|>1U#zK+WOxr&uTantTqYp)s-fFu0#nW_$a3cMv z?m9R^`gvO(t*Mp=Ii=*+j0)sya_E?a#FjiRk{AE=3HVf%j+QpNm#ZQD=2VFwuDl2J z`lI_}nkl3N%tR*h-ASYUm>8q&_{g#jixR9==Gv(xma?^4KKg?Z_xu}4ca9Fr-V{Fr)2p^aF?N4>}@ zcw$0TP(piKn{|ZvQ`83=0objpw{1bi%@^+PC_BJv_KGe7ts at Psc*}6LS}z8RRemUR z4{0BM*x1B!o|6FFBa#%@h{@Z()1TDW9Vkj?@`BSZ(S4*?g*r3(s63#5e&Gf*J9<8$ zh;wU;DEVk_Z&D!EGH#pQ!^Sg%_5=9O93SeP5KsJzV-404l~G19?C^@VH at 82YH@7*@YkPg)VEV9m=R!WE at 7^oO%%zx{csuR+glCB(2~uQ+tn0xt2B~M#uFeOx^UuY>WtKn7 zAOln3vxL`(#Yn{?);^(|G%p*^8V at X2)iYk$XhXz;EaXL8LKWwuL5 at CAg&NF$({}b| zWg6=8+>Vs at MT-cTGG}t at tnPiB0ug%i4_ at QNhn`9!U-P^V^ zNnu>m{mG*>_-W2-C;RR;phqPce-1VqRg_7GuKhI>@E*H}B(Dl~1@$X0WJP_oPPUG32;cu6&eQ(Bcw{8MiKkx8Y|0sFsd* zV-$hVKssuna&A}+O%$)hYh=mhiu9Q8!fD*0jJ-89K1 z!_sfS0m?SyN!2?oE|BP%DNQ$(*~Dkei1zru%fNY;H)j at r004rZ001oiBG3Oz`u(rM z$bT&IZL`13U_lmZe?g5% zZn=I!Zv|-QL;%-eT<;2^zc9Nm+7Opf39Gv9%1!?aWQ(8~2NIFLPjg}Y26Q2|Jqqdv zzyi4Y7)sZMv1jB_8tG|lEUp!cdJlZ(S4^Ow2_rv4;M%=Vb-Pq at 6IGo7El zvsA+X<&l8YKwV@{h8-L@^%=cE*|&k_ak96^yKsMXJ|^&yPR at 0_Q72ZW@yoZ zli~HHi?HN-{u(CZYLU(Z-K7Y1&qbw-EX;5MbCX*rD82!abq+;)bjGpRN4!;S^G ztnMM1$&{AmHzsbH#B}J^t9)sluACfw^B`<`*_RZVQckFp$#UE|kkk at e$VH>+_?AfI zZa;MjUr3{cL2a*5#L`aOlb!R4vF1k<;7 zhH_(sxq9uU%y&tI{K_Tby8T5d#3A2>`B9!2hkvU?*O&1p{+lPo z;9r?2)BhU1|G=)c;-&~PcO>*c10s<17O0pM5C{^;=|Tn|xk`Z(NJ?8IYDSBf=}#%NGT^|v>|5FME+pK zy^0iF8y+Yb0sT3jHOMwoP#WTtLI)?o$_1G?r0^IS?GUaVr(8#Q{MKVRTD4^4BhB82 zxImW5;rnhkW)=@RNoU^MDG^)8X7AQxX18HP$ac(eJ#pZ3^x?D^@h!PKwb7(CuK-OB zp5dw(VXu-y2p46q%0ox0cs1J6+H at 39@EC5C-Sf3kf0@|_Pn=1%rTP$BB`#yN4s5b= zVtU;W%^x at +Z$ji7A}-#I)tKkajs;UaHA<~#?}*x=$2a=yn#4bgPR^r0%TF25oWVrn zM0Tsvxmd|5zfp3inucDKP$r at _D+liI&|(s#r03C`fe%tkc*((_@#ZRo7 at 08xp=$fT z3xWgS%&`$gj4 at a7h2U}dU{}p?ZyKcl$iZO}j!D)*<4Tv6fPcgWETL-Y>>z{lC-djc z$sENfgK=@GM+%$W&7|*B+B}gZ=f}Xeh82rIZ||p$(FEtTKGJ|uD$S?jdZBW|_s;j{ z%zynnV7&ITb=kvyVnZVKTx5oMJ;-OHnhD1$ohY8yF2YCNRcqIYJgyichAv_5W7!&3 zK$oJMxCK7OE?HgK8hvvO+LwkJa*fc_uy4GujgNM!Md-!pJF zq^;)+)s9fUmyvE-QEgTMs~GjP-Wjv)_Kz~f&QnPK`6gq=<{^9k`rB&o=UTEZyuVo9 z1NuMNx&Akn|I$Hbs6QM&}0_S4K}_+%uC< z!>lcORBESxkj=W~MgU41wewyWby~FzOkhuSKJ$?C;>C4Z`1SO$=?ajjHkW6p6&x=F zyvjsGKYr$ch?I742qVIp*cNOq(yBaFmWC2`N;P`_04U+%B#6&((~|;dnnER7qcoYh zpvlT=z2HREF1)xy#~nGF&+wox54; z2BtBeNu{D?x^N%o-e`S0MQSdkg!Gm|HI03S8n3LP#~8~o6J?h%l4rKUeW00#(cF5v z+C#Wq at 6Mu$`GmJ0!l|i1T37~u+e#0|HGb6|7tLvF&>QC~ZP6a0n*&!*XIK!&oF~d* zFQ9MD+$BC`f2gDU=?6|wQaRzb-az>6erkLqhwy}T+fyABsU4 at jFx zQIu($519*jL5oNmm^;XfB8cr1Ey2i-b3Hfg(tzRvDE_z}hzt-9Uh$dXBW!`5#LmwR z_-$wJ`uEZqsZcVvaV`HjgHk}HT(a}ogrXBU)|pC8+o$hmww{cm7kT9q}L(5W at L?D1>CZDC$CJ3rKS zXnA9Of^cw`3y{x6`9={&lp!-Y3A_U2M;07JgsxfrYtj9(Cj3&8TUQ-SQKcRH{3O_E zDNYtf>Zr<~#R<7Ps?j;|hCsQ53_F?)0W(0=gYdtVNR4nvO7VaJ05Bo`byt#q{QbKH zjFYW{xV4?tKNO!`MM{I`gD2*o}(SdS#I8*uNn5t zuZLP)A0RvEo1(eMM4YpJHd>@Esgn87a%6EuOqt at meIm;eX5`m*DNOP#<8x*mlh;=d z&K)s*)YCOPn&?HgT78{CVHhaDtKtYO4r3HZ=&21K^4{x at i<*fhvp$x^zFD zLwAZamud&~WDrQ{s!@$G9yu5^eLdt3Z3sXCL{oZASpJ^3pEOzgV~rr^jas*%+B5>; zv(OYQN)D^Z&N7K_WdnsO at TO??9HbbiD9q}l0u0}FV*jJ2UJ-;&Qykf8Wr<1(wI&tq z1tSyhO^4K~zJ13ksSx4N*Q at g2>fj7=>o&mO)BxmgOb^ASH=azpPth7P;iEAczn{BR z&?BOLQb+W4nhTV36j#ga7RKb;6Lg;D437$sYmTc=XKQux$+kvCV!X=B__g#M3h)&T zgX2XW?nIOs*P3fIZYlk%XV|8URkP~~FY^ccDmik7bZ}(%&2hl!^A3f(h~m7_?Pqk$ z)`kNrCAc70t(p-ydP)zCv*zl^^qMAOW2kce;?HfzM*qFJS;wXcP6ZC^1^dU8jEfh4bO)L22H)$;sNc0fo zfr7N0%2mM?SI%Rb7 zDa$!?###9(YzrSq$l3BPR74DmQ5%Zbj;Jp=#APX?v+&m^)mNF{lOyj}nSRB+UYDY< zx$MF$U(5`NIICG|lWQg%{?wqRSej at HzAsVokiG`vCH}6cf{!1pJCOFhAU1(Fi^Cw) z7?3h~z$hY+B>Zc(%IF`Jj|&xOjsVXrr=^W1hBC>f#%Z1ho`hD2P46-5OT;!1YWLVY zFWu19k&ydB3LrAm9Nb9#>8@{JendnS~NjQMM z_|3sh;}MT6PX5W%M6Gk?G>OIz(Xb>qodp**{&;`p-sfcwM(2)5&r)&=WPL&e?;W8h zGueoH`_$i#Vb>mD>P`*U5Cm)EVob0{IX6Mkrk5-iqHP?Q#+VlAY61ao?zSoo*>*S1+VZqOiil0Eg z02itJKo>rSm6#iyG{-hOq)mrni|F?Ko0|rF3hxxxU$0SdkbhlSX81>lm$d!s3Hr at K zOKL74=qI<+Bpv=>mYrl+AVEf@+I4C_bUSaU at BH%iUTev zAi~nzb%b%(tC4Z%ZdO;f7szbS7!xzXGEAQ|8jZ}HtTdiaSWsConqVGL;S~&8zT0a8 z-jY*rrfvr%0Z(?+`?`nugGK#b+f;9(w1jf$V+;LZHfR(eL`qcRy2X0&flXav+nTC zRFK$fi_juB|JD_Xh9r{ZGNi;(88(c587YP7tGwdf`_)4EHoC9kBw+_9{j@|sbAdtT z{kH&%Dm5g=o1AK{`*11OQsWMDx$G8!YjBeWD at TrnaL1|C_Ag&*B|KZ|+L0U%5bZ%h z_Bx!{wAeP^6KLj3lQvdTq+6#9QBM9`>q3Iye2Uh2YkLoa;pzoFi8P0&#tU0E^A`BL&lR3Z zFijnAbc-V851`6PK+VtHqZ(!$plA=LPN271?2)0AZ4rXcB&v+ at B7FMW?s0Af;N*;7 z007T_rJS7qM-cu)@cjR6ipy5qlmL`R))o~NC6#P!@>CahgQyNYgc)qEv|hE=?2 at Rt;xM9$#4706y$>$MIw&%PSUfEdY3n#oGl5#pGjwSksgo!B?q7B-xGPzAahksq>)}Es zgC{wff%p9C>Gx!-K6l{?#7lQLn3}DpP<@Zi;RBurR;nr+i(lx4)flD_G;YGh7yx-| zObSsoQo|DfV($Qg)CNnD7~da*ny(}TeFr_lk*8wRDF1|3@!&s;FQ8-6C~N|28$_=T z?^_)s87~24NQ{%kR2(8=e<>%lj9)-n8-(ll;OQ8n?GQ_~;V@$o9HXU;Oz)d9AdG{Q zH~w{aM5#8=hWG*e&qsc%5qe1V*S%8%@;`O7|G$s?pB at _7N&hZ{h5SfguF=y#1fx#m z2eTw$OGxo=#g!>2D;2rwZyuq)mbzGYjJ%!3HYkkk&hlX}?EX2ugXYIRmS~7E$U-p)glcQASD-t%3gijxFJJ*yEU;kKD5; z^9cjQ4C=jvKN!hdV_rh$MzW=@uB;Y0?D>a9v!)3nrwCx^bRpKWwPT;|{k>V at y-5sJ?eTS_&V zG`Ms_LI^52Q}bqq zYevZx=p|C`ZqL=B&xdYH_V4jp<8|?DpIgt>hpf{s(bKV?&zob}Ut9jZWNj$BDz`XX z<$A!oR|AT#xUo4W&5c}NK4?CEcn%N0F?g>70&>aRKxgmI*m>T&qH-zD^wSW!`ewhP zGSS-I!!vUoAE0);)%z*kn8gcM-QFcJPLZMaops(&YCknbY>};oEEEojHp{3OhjCX%h)FuC=*Lg*gAgmk7sy at w`$qS&I=~ylpAh{Q!6^dFbYB$ zA|^13%r9(N2&dN7*t>eMaJFQ|5IONLo!d*SA+fV7*GZ-qSffdE3l1h&%bR9+^iN+_ zX4LGTU5CAt#g3QV*$*;oZ6k7sv`&eKNpC!GV411CJ2fY*QZ{Pr6eahNcjl!#Y7FnW z*P%P2K_hlJgY1NN9jY`1XdaSI_=}V=9%F9dRQ8p-6Q7{Vp5;8TLp1CgNgBUIvGPjL zP_Cs^VxX?C@&5UkSgJBG@%={EkGVr&Z$ndAbK)DA4y{PBOnPJ=q#qjr(h#ORuhB`b zquN~78Z@~ixEWu>kft&zsVo^Uc-?{KsBL!%PKvdG*jA%aD`gaLu3E{dvhOB* zh;?+<&GRlor$KfhnIz0;0gY!3lI(Q5&Uywc6fwo8g5`0p3&@_qYJiEj3J=CS`*CHT#8XfjUsuU)3~enz&cB{9tVnHN1i_BL+Nr at km5Utx6%zj9pk3L zEjD#`6bw;hvl|`-?*Iq`ulyC=SN={F{+J0?VomGiSbwrSWzuDM`Sc}~Jz;F_@;pH2 z#6Mz?t?U3vYtKY}SeUB3ZD`uqMylm1B7*R{gfO@%;!rKl&h=y1xCr;`GN!i?3%q2C z&b1np1e_Tq_ka;2x6)3nI+B9;;@SReTbI0~OhSA61<|JcoglQ4W_eMoTuR;O!3 at j( z4@%y3h-)HGkOlE9SVt>&-b!;>t$XqWNO$StyLmx`y3XorM8thH@{m+!hQaZ1;DGRbZsZ__`7MX}~{{y0k%PRL{UA+GkU(Mmt?E(eoK zyNh)Vksc9PQ6OQnG&=G4=`i(4`I$i_M_ZezkZDTCJVW9hByW{{Pum`$E_}lL`929@}NA4 zzU70AWi at f{Y-7Foo2hQ6Hk%L&eM)aI3U*qb5D^h)^n*afA#w%NcU&N}5f>!oX8H5Q zS=nztf4*@PHc#`7=%rrC2X_5Kxib}-c%q!g=DPwv(*{)OkKGMRZ%1b0Sl1N4- at Ki6 zc#l1OGPrj4*FRzYU=XBBjH1>*$E$5a^Pa%+jr7MICI(Po4l2242F zp}7B9Zy7>)#BLAUnI&wcKb5z=p9TLT#5Y|im_`uQfdHW|RL~!$j)_CE{jH4y>-6H* zQL9OF6cdv40{)&;5_f at 6Q!E?dcQ9Wm=4pkpu%uT!!a#~$HvbTXU%G&mGKYpjhesF> z5>6#%6j3YkGd|$!koa?QE5>K3K;@7`66WFtu`22ggHS&i?zwb$Jdc3s++-gpYW~RV z#a*XIGlp at 8+%0)g at VPuUJPhKSb?}u5Lx6>*)%B9L_l_Ffw4(JTU&A4n)G7dgZI#zj9&+PXdYB)ZC7QR(4W z*{sFY~pb zWvs6-Ji$PCeWC;;GFFH1e}I2A6l}LXxa>?Na=$%)O{xN{g?9W(`PB)^MZZT5w0P&~ zjca!W2F+5noyh1jb0r34j#nHH8t5SE7I8tw2fEpt&wNo at J@PAl+LaL8S at L{uz>gbL z^^iKyLX#Xih6qj&8skzPH=&h#_l0Pq>FO;4m3)5wxl+smp`d0smHgrx`thVJfx-Md z{#_xrY}DKs8WjwT6r*1#oLi|QFr(k2W;_PZ%!!Tw9G%B{ zdc}NOYK5Ok^TZGe{iW&mx6jhAPdF?dY3sq>#>$HJxO82-%<9wL79YAqEcft%hy&Vu zO8WA#%UAimz4|yN7nKKPUaTel+=War^ZCIR4z&EdPTHh<=G6gJCIbs3B6pEGIC;l~ zaC+D+y46=n75>6)Y z8G#@J#%fY`i2Ig?Ztl>!c!QL683$NFwgVaws}Qz*)yTUfT at ae&J%Vmn*CnsG`yafc z<$v~Vz;K5wVQ?2L7OoMhW6xEi>ATsN42zY%|7L3^6ph^)_ZQHxLH;LOI{{l~8zUum zyZ^8Pk5;n$_wtL*O0_mQ7OOnEPFy5bYj}j72sm9SfqGiK7@!YD at l?XI_xQ at ptKuh! z4~p238I#wuD8{TNDz at 0c#!(gz_bJyYS81wlZ|@f{UFa|ovebFnNK^zaN+SpKQL#JO zZ^s3$g}LHH-ztLY1BgHccjXN|blS~JmK`;x zEoB^TrwJoP=PKRZRXwA$7T%!jLAe>h-X- at 4|!OpGxQdXh-nho72 at KDr@ zNp5Gf&BE(BV1Qv31bJV-*xIhnX6LcFP at IXLnbaDN4{!9v>9Yq9U5i~c! z1U8-liA&#BHO8jN+du|I>Zh8yCi9Jdo(7z0myK5jCa}H5LA^cellj-N at pDspJjEvR z#jwR63*eU0=e+Ol=VJSN@(!WvXM at mf;-rP at p^xGAOc;G}apt#Yc*qiU5qJX$p*Uzz zwg at e=O7-Cd<+D=wT6o{7ht7bP#>@8=iDGJ!c5TR2A?7dJkdC*4Lp;&VWg5hEPKrW! z2;Ki5(%vyjv$e|>4BNJCn;Euk+j_$h8AgU}+jeBw$gpkO=ySU2>s$BK=yCh2{FxzZ7|N;h>aQv%lGogUr=lZ zq-3jjBWx`Pjxq?jQj0Ui>PkbHH1?HL%!3vEDC}1e1(dp1+zcXJ4*`UCx)ZF`x*8c4 zv+k1_Q{5 at FSVy5{XzsMH>~m4vHCn88_I7WhaE-oaxG`qX1FZO&uBal29g>Axfvd9B z6)WaxUB`FgBB}~aSPunuupR?@Qze!xRmpIrIhEYPXWsprhu#=cCDJi{)i54%?av`b zr!-dYnv`Qyxf2NsK>GSeduX49;>*F~*l94Gt at kWa6TriVMEjdA;x3xp<4~0IjMYCp z at punXwD{Fl^PBh-5dn>K1YVb)t!Unz-4Ug%_kfI7pu|=$4QbW6u9WIhi z88y%jtg~#5o9jV#iCA8<^tVGqhyIol?pY}|;W{Og%aevDDTiYC(7H=b;LEN_%%%GU zcvm|z=mw`RIJ`W2X at BaYY~a$rt{Q)(oWrcIyH_0bSUF<9SBHgKj)ugLN3=y}#h_Q6 zwGp>^DE)C#Ao;9SlWxb2hG~{#qJs;$pJj3e*-uTQIz(5`&Y>pOS7gQ%wKD4)$5XCMeN%M}_kkNq8k#3Rnt z2?$1h`=P+>1@|a12fIu2O9cw_0 at 3oqV{kRMZ9Iom%sE>T8rEUYE at Qrw3_EWsi(FvL zN75zy=rw;*M&w2R#mC<$=5zBX({5eh`hF}qI&jWhfP3O$njx+VHC7C#JpO~~B2jd$ zoroR~&Ag42(Z6l>>?P6#bSNQ2-59LdTXG#QbEkX*Zg-lR zZ;UCVpfvtU%-X2Ro2UC87H;&4nB_R$-Z&qMbU`dPwxRsf-4nvrV>iuPwDxkPa2UpD z{)BIxHjp~+;jFi7XQLM(Vbd`pwc4C!2wYo)44cB-8U4;bRyw4j!X_a at 0|8B900I5@ z|4AnQNgf(H9;nOcU(=Eeww|`wb-*JWhQ>lEz}T30ApI+cD0sGEh9d}4k~}F8-a<=Q zR)geCa+w@*YY$sTAad96!NXE{zo3H`lS*Byn<^_SFGV`n!k+SdPek4kJ35{xPb}%i z=$cM~ES|C&XSTLm9VEU^dawO~3}I^)4MC at ak@~b!a*js0{d`zNV- at NjtWt8I_gIM+ zc5La-ZdZ|VhK{XoJ^3&PF#+$MUx2`3#)b#-B`@Y+#(mn47aGAHjKO6Q%|M5nEzZ^c zR?Tm*uMZCYp24|^4?qZE?cJJZ3Parkeu_TqZs!Yu%r at d4r0|EL;h3m+X7*yD_oS+{ zf at Wwsh9cy=6 at MdTv00;+I?+W1oVJ&E<79Neb+Dhh;pwc?WfF#r)oJ;PNaD!pgM46y zk_k<(QV!+EX>H zdGVG)9YYgv`B7E14M|+}+}|?s(g-P`y*_|z2Gi_)kS~7ogqM)8=q7=L%=86TlQmQ6 zV-zM-ZEM{LtdC2EH*UDB3vh1>i~DyKF8DM>f~8vWZdk at wzlan$(<+*q at r>GxCT8>zu4MN{jC#w(T6%xeR1I423gk zrLN^F?8Q2e?P55j*@qcqNT;saA~F;slSXzaKU3Iqmh8 at hT=fOh=aqx2sg=FD?wOUD z?9%CEZC0%)c^6Z-t<9nzRO at vtk~bDnsz6SXJ&WhuZFNj#IEsiR`tHChUXlCg_1sAv z`XnZ)5lWj>WAbyC8thNN>R~BLpj&eepjoCrk at GR<%|Sq&F&+}bIP|g{=_C`9wG^OA at BlZC+PA+Vgevwt6~e^ea%!*XH0D?2VKc z?s7T!;)%i!=|xw4&Pk36V=jeAifzz7Xi5*Pc6fi z!xO;C4FPXYQmAf(UD8~Q=%eG-ONnu|l)YfJRA3FIMe2WT1a*UC>+hV3G9><)U#d%I zi@}EOtbfjyI%%XUdqMWY8&pv3iir}|RlbE_P}xp0sWBGpoZe}Ogw%SY-cof!5)qy( z#~Kcg6v0xyWkP`6P!o1X(`%A_qequm8CnNOh=E9 zYEE8ue%|wM>YF_LQL?sHo;a%)!Okv`pL4v{WM{6Xl#fos*sjtP>D3{9xaSUlxUz(@ zEnx&__EL74xF%RD6-eD)Kj~cV+ at Ag271n(lKbW zBKEHIvdZxWg>4(bP1Q1Z;@dLV_PNq6fG-uvqTPyZ7u&tpYGRM4Jqtk-Hh zeiBWPh at FEO#TPRWu|CvbS at E)~;so6XU&o=~Xw)0(GeO{!Q<2tjOC4=Fe{RA9)D6Zy z->>Xkghwj>4)bSS&X-1Do8?HEepjHn6E^;yoNE+!Mw7#C004JjuL3{rFxZsw^tw?+ zByD5%LceaA^f`;^B2{-f9^rZjkHHNg;)Wd8mH at C1vI7r80b`iz(qhF*Wp5Y(Ahg?~ z;D|C<*-;&7f>bsd0=@%6Kmvkb5#sH_G^ErhdZp1vYvnrvAwL4C;ie1>dhk)aW8H0Z zNVtRP|FBZSSg*%uH~;H+_&iM~_?O-jQIDS|d0bIS at 4S3;Q_rRU?C34P#1eN=o+Whjgwe9e=ZT^J?6zhs2 zagCR~lvD%ih7ZJsj~U(uxUXX6lF^SLv8P&?$O~j`+>u}#_Z9jE9ta;)+L+lD9j)k> z?cf(d0!%k at hBJ&dK+;mosB5o?L+ at s3LsA*L$0~MjpgFj&-EsY7`KdRB_6(_Hq|6!& zv{saL!y0gJ1H$9D7f%DQoix~alDsR8lC3g_Cxxx7x;R|yYO+$SJ6{YXlsK!}j8cM+ z^C*Bf<1sg>bx`Hu1FVT<7ZEMQU{zW8h0^MmUu?U%zk>VA`02ItvD)vE%h`lj`AXF6 z<_1vjPrNb;f15j=H41IUBrsZO?jUDE>!iyvHTT)k^#}~|n8k4h(PV)Kn$CKWQ;FP$ z5%KQi4~cR!S8EvrgI+iT!IF!y4WZ?!rp+dLO%0SDKWu>|PScl|MAv=-(#iYq^*f{0 zbIv+x>Kw{((4>9P90o)gCZnRr4nDed2k}r=rQxYFWloU;a{w}@Rp$K_xcB-&4)yC) zf~)fMnT77iWmXqp0=xq?JE=O~pgE~7<=iqiuiMc`y7ouh1z&W4b6Ns>WZWH83iW={ z9dwlv!Q*cmk6rLtYs!Ay5O?g5Xt*aA*YV?@V-iNyKlK*0jY_Akn(Lb|_Kd#)N(7~C ze1Ub&NdbIPYWHa13XOqPPH^K~&7G%E^JxOst?Jy8TIp%A8$7X$%E$Qf*|pk5)7aIe z!p9Po93Z{AHawm6tU(nG16>qBZk!s&qm){}VzxSKNc}L&baB^ckyh)m zqv}V3nhLghcY>M&GHovHq2st;Zpq25S=H=Ju*Dy#YjiR<;D0V)K}9`h!vFySq5%K5 zs`dXR;QC(@HmXy9r^3FLoH7YfGE!QECKRkdi>%6b1Gva&DoBWlf9S+hNp5hA(b%q5 zk$V54Vg%v?LhJ`7cG>|3Pz_c|&Et3xB?YnXJM^T#nlEi#3-41}yXaN{R;+s8ZIKv$kr% zews)m<3M<^xuULl-_k!0pduw>QTCKGsyMfUXuWy{8;}*TuE&MvA+fxTAu+Al^=P-g z7g~EpK3Rjta-IPdz>6e6HyRaO(gt%I8cImugR&wbg3m``IYBy1XF at +^kK5de4 at zd3)9< zse<|^C7;aboo@%!NVKl7*`Y1Ir=**HWYvLB0HS+SlA0I#F#~_B;yXb>DHPKJ>$+{a zyy7%G(+|ych|~(R{l>eUJ~MHIZO+rwk at pwNz^6ZtN9fvtCuOUm68 at jT?O#hV|DXOy6ZP>=wx7UgQdab7+Wrpxq0&kdHg=z*qe^TEH z3RzPSc-(zlh6TrOv!)v4B!BcV!FkX8y|2ypc*EuTDA(WLA8v<4;7kI`#R#v at C#@<3 zN&oov7cf};=u)OF{VgeGKa02h&4gUb*4_xcpWg0>HIxJF0}rkjyO*#biAK}-Sb|wH zTsm2!Z8{rPC>_t(>W{_x<^q>)b1pBf$|6fWZB92zQpbaqYBd^XdY#xsdKDo(HaRN` z_-gHBwZQlKPs8IY>s)Io5muQo+>lPRJx}Wxdom5W^>`cFge>o{=oU%Yp?i?Ns%8ps zgkx6~hUIZ^t6FRDAU+8fbtTrjjOzQ&V>su0FbIA+gYe(Y-^7Pf1R#M52mBOvV>)>b zaySh|+=GG}Eih;W>0(-LbUH-ydU9YfoRogG4cQ+b0&(+|GUbatG^~pZY8j|pn+(Zp zwfSQq3}qP!rv`syN{$w6=XwbWN2jYGMaKBqy(-O>vnJ2gvS~b28k-wji}-CaQVN~0 z9%r#N#w?_!JSb9aLi>s-Hbux!U*3*BJ_V7ZJWc`{FD+VNaY~|TiU#cB6Xoi){6qJq z-O{8LyoC7AJM at bE2-gs7uNHGOvp`PsX6sAKWm3^!ZG1zxG<1%7cKSa$3x`};7_H=PUAXtH-wVY&*$4e$z= z0*WIGxk`+oJkeWkV}93j0B9(fi}yenD%yfP)VhLYXc+dDp{|wSJKH8yyJi$?cOoMZ zZ-`;J^GSZ$(3m at l5p7OAlHEM^`HJJnY(09I<}Co^J#y+oajA_b+;r4AF_w=f(8I1i zgrb)zpK1a!vPV;1y!)yezZL~Ws`SWzBHzrw at bn-B1#L(?1Qo`9Ss^0-mTKq`Li_{{ zL)}LtM%hPAEd3dq_aR*aB>#u?2Wb-HpF*FIaA(5Ou~Z@TxyC#0JLqZ3`iS2KP+xm8 zS7yC;)wF8WBLL+>IRXroQkjI<>6oyt9pW(Pb_>{U5Z?M;o8JhnhGCg?24sZU;)vd> z12IVMWii{!;e&#@xi%z&?D!DeiCwfG;T?bLwxDD z_s1nxH4L<37 at OibRSrnbomLgqRT1>|<)!Cdk{uj+dZcb_2FqwHH4H5^9sGoLkvR8- zC7)$hkrg(+$v&*!47)q}(l3-!z8m?$>3Y&>Ry0Px8_jPsc+IWAPkIzjp4wuJa0b|N zLhk;N*vv2tq-XkztLkBafE52nTqSGe;`(3T|C!db)4&x&^P|9BF>M474yGwiNoksr zkpr>;Pb`2ch6mFomqRx=qtF`IGv}o2?0ZTDd?5PGy3m9Z^7%bUcy=|ec9p{PB_^ix zdYI?DZ}2{EeV$)$e*@KpUw@?akD&b2OlA7 at 3y8olk&#fk=~hxSbVdg_eC0?a1(DZh z<#52n?-V*!;5PB0JedEW?W#PyE8GIE at F~zd1XIjs7zv=RQlZwIv`CjJJdG8qt+R|i zp-dloX#1y%Y@$SKX^|`feLhcWd9ff{msZnVj(UyPZF7l6ntcN}i3HbbYW6}cRMk{7 z&N8R3(>_Ht^tQ^ptn*P?xcV^Zr+mg(m6qy5m-76}nwnR;37iT(6}C<_b&HnCD8d*i zAJ8wntSgF}hBdNy-mq*}d*0-UQgu{(4wRtF;;=5nl~}e$c?A;Df_Jzc zYZ+u)kdsIyc>xBz1YB1eGL+(X(+Nd`m2?QR4w)iG_G^yj6lrMO$cI9%D*|e-O{qj+ zaj=m=%U}vWbwz3Ny{B$t{xa3eRJ1~0z6(t)`QP2E&*y%7Yp#J;N?Fui~LUK at M*WNm=YkNl0UO zS+<0K41-{p(cSLqZ6qrl;L_^S2&3OtN3$T9T5_4LynRPTOFw-WUdDyK=bUXhZj?PS z^amN)rOnxaa!K*Xvrmk%ou?>w)`C$p4tKCG{CTVi*N-s$D(=tKkF$hyhD}b)J+tJp zW0==NaGgbJHYexkQH6!`m==ykGPV$uYc4{IsxS*l#Yn+UIEEIE@@!EN6HxfJI(B?nWMd&v6vK$%8_;;By<&xntk*@y{8tXr40WIi*e~y;axv z;uUD0(i_%~g`n(<-zjf(#p-}E?{-^nCh}1I9*>#e)tyW-eD|UIOIhVBAYe9fH)#iDaY at Ej0)L at fqq$e0j^q=Gu472FxP8 zC^_X1q2-Y$_OHL#ad^dd`Gu>S$4cL5kMnJA`b#p02a;kv$$V4=Ds~5zB at L~`QEg?| zjW{a2?p!g;2B?)vTrW~U+dm*Fvk$)E55}q`qE=tBz at Wr*S14z;q}S;Y0YjpBWD$49 zd{d8tOI(rK&Og~Hg4PlU@~h4M|5) z>=rZcCD6FGAo3^SixItmW|WJ!mzTQI=pAJ7oOkVY=XH)tsz>Ls_xIOuE6_$DqdRG! z58~5~E}}-PsL^u)kOYA)_L4VppN{D82#GYwy(!hiuqQUdsH2iQ z>TW$1!F3O_wr+DQBd^D4OJk?~!V{@uPdt8PhIj+AY54&DYuZe4y z&&u9XMC?2{rG at i$d>`Z1psQIQ8FdsXHx}c`X|pC{&dfLy$V4Li$MJy2(YFWZL83~= zxNC?VUXOdCWl1)c>(*SN-G)c2@}Sh*+}qv;%lhGR&TFx^P^XTs8(?hhWMzG1m>7g+ zgJtV%sLe(#*aIH`f!U#Oyo@(bi#fI?tK3Mx^Gi69XZ2ZVH9x00iSZD-;(e+>s}7)L zjz97!t7M`V{X)i2GNqU%pw(g*K~Mc$tCgde2|M3K%Dt3vl1<-leZw=QYroXO4oAuA zM)N33IEUm`1zUO_JJ*%+XExr$c}c9MG2y8t3^3U2l1%#NLTjlgc^^1qZS(2(1K_vC zH3b_8IC0^;g}Mj}>r%}gFLf!+qI5w^uXU|{T;JOn0rlov_P=3P%T%u)sy#7PS^dMwLaji%RTco&eoNdaff5dk!1Iv~_;MK;0#m~C1xdgXWmJvr~VDTG($?whJt-`w2fc z1TF9!(ZfHNP4`Ik!54{_VryiQ_7a41^QYN7+& z>Y3>~V2vYBT{>Zq%;f3bfNPvfn# zPTGu8iPM#IH_+#LxDR>J2DS5}Z*GOsALudy>o}-%n2pV(`b@|ae=*+dpG at _E2*2<< zMf`J!vRUy8NYUI+x$v-~b^8SRwuCq{Z6wZYW+8Y{+HFp>4iXTqwKPly)~ zXRH0f^&d$G7h~fU1^WaZRqzxA2lUR4+jKrb8qZP%?y;S at 0)X*`s&ez&nKoPi>}DCg zJj4DWTmznnW<2-ZgdIhsu5g5fRD!`DNGahN?DY;~iIC~Qjw8_CsS3?A% zRyWV4&yZVDg2t(DsP-!U!o`SXW@?#nP_m z2f7Fxpnh}%ZEl~Vra2g&$ez)-b1aq{x%7qMr2gRn{yB?y6Q)PIj59pE^BZy#$A2#%!p*Pgs!7xqj8$?{+w9kK) z at h#qFWpmOrO;-FYvb1No(dgH4o3dM$GJF zt9#k^KQujff4K7Ug8%{DfCB+Z{(GKP*~s41!A{u3#LUIzzj at heRXqn3VKn{$hGIp! zCYa{xT=Zm+%d;p(B$Pom=9+3NXmMYh6lnR)Z1Q)bi`o;1+rG4yoxiouuR#iCts`IR zy#L-_;g_{B*?Miz0|E%oCSyZWo^|33e1}FurDCQ7b0{_d{8nV9UuO2IS#JyxuGyzy zX`!$BZRz^)dtd#AuL<<@#xEJbUT&(WkT+R(H at E-UbHWkkcuEucpi&&X+|+&zo4eb@ zCF6CU)_WW}r8dKLf`@8~1`TS3Tk>$~b88#Ix~bN>4(Bz02@@JkoxFmW9do1IWujub z=t^(j+D=(`PgN$t!d!*#yy%u4Y6iVcc=+qh2*4sE;XnGL!TNeoYM~z+7z?AbAA_Gj zk#p6G`y_>S9HWgu#8n;%{>%qUma5}Di$xGd?x$<$d7fuE#bYp?3Ib7_v+n?Hf zi))N at RfP|VKO+DW+S9)8TZMkDs(L^XS-z>5QK|)VV?PEecv*2A9spJ-w}!`d+qbiy zS5LU+Uc}m*#p5h8gW}Di%+IOk&sk7XA0UboB}u7h1mOFAW9G~7bqXCUj!^kZ?deT5 zE}LphgDZ}jcZwq5#fNjMv*k#L+!7KeJQd?i9px?VU7T$#8jegXNvL-g`{!RH7R2q+Qi z-x|328=^91p8rL8CR<(RZ|%pgVOpE&MJ{!e)c|8CXc)-`6D at gT0%chglc2f_EK at wD z*g9>*IiAYRg)5qn@}H=XTsI$(+=mIEszYLf#6uCFf{_Il8W<_X1$D)9@(Rxn&yTLp zlV`QP{{A3&K(wJ`HP%=oKj4mUyzrJC`D1XYqy~)fPyr$WDXMfbQ<+YKHz}bkTPbsq zk&$e*(#OqQ@;fD=Ze66s9%`y;wq<}=Bh{6jPMxQa%J-OwxT=ej=Leq&&gzezmQke2 z3^$!;of<NiTdRP14OG?#al zWO*bZWAlI>9K}wiGAItBcGq=!Jm<#(bCCishF(=i%ut6&Q*??Eul13okA<4mxpwCC zYONFFY0b-~z=%e;h|RZCf>4hCG|BQlX8 z97kkS3o5~dkQTB=r|CUMeE#K@;zhgFf6WnR_D~9%;#?{r={kagjZ%8=^zU=76%rkE z+)$&0y8556Z=$}sX<)^4+l?=HHC*EKx2Zh38RS$?rq~W4_pdBer>yi+nPZp4I&x4| zg240mXN(-dlkbO zCFCslZ@#XI{%BzxLw+lE3Z!F9aLu$8Vau74y9_+^8&G6;hPpsb;vj*ugJZoQexs#V zx5f#UYg`bG9%JOTj1X-*JK6%#&laq#id>N9d zSwOZrN~$zwFD^}oOVVE!no)pZn2h* z5jD-_cNg>@nfC*^P_jgChv`l4X_uV)jl_ at p>uZ0Iv_W^ckz0E_{3Kz2XFZd5{J(wNMb at Gu<~`-vA(qCHiZi8KDdt77`c zo{Z|Y&~$PUd7>6`H2THrB)34@&#TEd)v#6OPAVM{}2WwnBnk#7O#e*JoL2 zMyIsN%EFAbmEehV{4y;i8MxM~JJ&tTlK|?Ef}X~bP7vv>hKIYKyTgj*kszYi807SAeb7 zdDgKM+=~rVNiD|J=ZL68KaLV>^v22%dYEL~9=U+lM|=kL`4XWpa}7G0gi+YRW*`F8 zEf@|HZZg6ri!+*HlH&Ao`KcD&#kwrdd9)LS)~7L~5b^hFev6fBq4UPBu at Ta@RP;sD z#Z`TC5D`u)#=;^8tQg at R?KLTj3G#zeIw_YGK1-`Jhm}=0SdFyk^QLA_W*ll3jWoW} zVNf0J;Y(#JF^tQkX#73q8siy$i-yp-whO0RgzAnkjMOJ1V&IgsGMJ^8-iaA#K%FnD z!xk{&H|;_Ww1zNOI}Jarbd!VwVQ0~bnCbQzaNWQS@~BKy`pCN&1{C84%6_&wrIT%Q z&|vF;9LEe6{VsO*TK4NSJat>#6bZbqz7ns*MRt#_EvHH^3 at di7$SC2Jx3-R4dl1#R zbK&*w(FE;p1 at OBDE+@}p@ zwe-G}Dp at COgH0tMj&aifk$6P(}C-PlL4UcscymNVcf_`=smx>-ni4>y-cWE%WyE(TM&Two^* zr=rm at pkjS_RJ`@Khj+-w4Qst1QjZw58(YU$$*^11m|NAfTc|B5R&l(ZAhAr^k(E^n zbL<5%O20vz#_*T;_XjWbzCVgg%j<%MS9vjRKTRFBlcXDI#nUB$U)P39)aO z{;4-vaTpgV{}1uEK9SV&VQ8+LVXR?jF({Q$<9=Gl$S-2K_!-cxQs0ZkZdd~31zMkn z>sKEM*3J_j;KRIeCjol?P`Xde0lB7#%(80(NB`T?9ud|Nc_vct6Ox`MN4nr3pUSFl z-NJ0qI1La7MT7#1Fws2xEpOJi8=a;C`y&ap&$6+}QIjk#sP3pMNV#AQ;16w3B5WW@ z<6+V#qOl at G!xRA)R*qvcS-FK{=Ii?v^x#dg0_L at O9FoqA@QXVWNk8X%z(^+M2}F>6 zspvBRy>x6YDAtJw at 9{vW_Mf3VIdB$>|6g&E)?X(6e~;?^qt5tW2`^hsPi0;aiNBRP zI3=7)Q56hXY5fja38@)<2*ghjjhnYn3Y9`G+vr1ur;y}~>uoQn=VdQSaM;Nq zL3|COI9uL at v(tNKb<^Aa{qp%;0f?dwMHp9E$(3lTI+Mh_plQom0;~1aL|rtr)@6f# zrW*XKZG!MwbOZA?Ab)XdL3$t+OS}=hk;)Uq2zNDYQ#ps$d3DK^+d{jgqeXOjkVb^dq^2BBqA??1fDZG%qPgI} z?GA4y16<5NjqX>k_cT*&hOjd;#$tAs_58W-fMRuYO_DT?SS_dG%8eh{mVS9w=^U09 z2(5XzT55Bn9<^Ny at Y2J$v9%dHJFEVH0J`XS;`1vjLy0+#6 at oBfsHFTl6I!RO68`d@ zT;NS(coNMiT=(rDFlrh?3|_$`)h{!hdbIT>EP2&F(+{XacswNOSY${@Ypvxf6nq~K zawUyu_*W&rC at fE|oIFtoCl$3Nyb!XzN6$ySwlJjnDNjB6iqI)BEFea%9gDptFyo?b zngKG&_2eWKQJTE)fz-tw`*gA1I^yZCUJy~8KdxaN&CY5$9EHjXx!(nmN0SX|ikNJE z=w8{tt*<2L6To~jJ#1pgVc_h#xT$HrseddmPE_r`=} zNcT#{R1R-J!`s(D5a;5Yr3SFV2o-2k)ml;ehhOrCqKP1Wfv`u^wk9J*_Hf&fjw|>x zr_Jw~gipHF)Gf5vnlF!82 at uH7^8jImFO%6swIB?>bDSF9bNDP*2BUCOA4p2e%RD!n z{C}t{rK+Kzv;qSG5rF-lM9u!&$^MtE_nf;00Z=ja?6fqPR zZq2mTdP9>4;%Y`S)fMBFvi9-XrX*|6f*%#NASgMMx_YY);yed60(RcoZyzPnZF<;} z-6M+B2q1LqSXH2I#8~3iEJzl1z100Y4qgY?)zqop at C4E(&six_almlXPDtT5zxS2M zMjN?>Hu^b=`M%-RG*=2 zv%?XRyHG*V(I;00Y_D{iMKtiFRL)jXy=q`_EG_ttP9aQCJy4G-6#r$RWM2Hiur6$LvhbzJcIG8 z*sIy-Z?!a3;DjH*UsSj92|rZhOpTuXCbL|w+j(7Fyxrh;XqP5N_kF<$1YTZF_E|;# z5KJ`nOx+ZtrgPz8u_}^~adKotE0Z+r>I*hQ$6g4RR7Jm9MLF^+%XCg4ahL9r}u;zs5wgo!yFd0J0u*gWwFI{H*B{TK24Hs2bTtHs3g{J#Pg* zbLYRw&5hQaWs3oL%vJ0hIYJ6>RX$XZ8S8XT;H4m!uKvv(-Agr@?y;4V5nlq}4Arsj z3Olr66fz|BjM*C at 5*hL@*rkMbA`;_8%7_TT{2USjDWFw(1bG3*K!la9(&p*yvFxEo z5AcHRuf+WDhqlq$1x`HBM&`vZ>!bl}8NtW6SA*5Ee?SHPY~Gw?)M-yaQ!q-@#-iYN zvv|Ivb;=gEdqOXLgl%w(d8(f16!G6w0L1-ve8wTl5~?>RCj0pB0m8B|F0twx+WDTq zPtU-c8(@07$a+Sy&(13+Ak6}I`bJik2K(?@hz_?1Ght#bg92WBD4i$CSO0MN+Kq=1 zv><=oY{36*M6muZHQqHLv at CF3+%qaRHfp(Rc)7qLE-A(eut>B&qCY}<0sx%Tk+x=Fii-&}YPfE6b%0<)!zz;l2eCE6LcytOnDC{|VI^?ltHx6&ZBidKQc zF1plKS}|d^L6c@^c|qEw at W)`C9^Ga at 4h!8ThVOR#fFiptl^GvIfbqmm#w z`#eHu{)9rXv%BxK0D0ii*NR6s5sF{$(4m&2wc$uVgTA(8U!7rrai4gO`XP&pt>Lx! zV3$4UJ6yYstq~RDR=Uv;d^>6TPnc$odsbA%+#S)KM8UCwHPH6&0Hu9r`&Nuu`6=^< zJ!m`I>?f`X^JH%{@>7=h68gma6EJ9=Kv~aYUd>lZ6oV1=){~q9981VLsuoq*aCB3v zF8)NVARgy75!uN5 at U1cruUFiaR9e^C(vt^n9{v)YQrbZH at l7#-5?{jkjL0X*1da4< zIp$24$s at RX-v%=j{=vfAm$WJpl(%>O0UEK)!D=Jt4H4+fa<+2sK*)^Of5_=Zt1dKA z{RKU?e;;~m{|UV$JBK+%w2^O2ZSA at V$F_)jE1oPq*|TVGaN_hfa?zV9sB0OIfg0+| zIepm|^^BLemwv>ZFqRxxbR#;5wWjBXhpcVx&u#Db^XJ%HpqLvPc=&hh6Drdiuo*Z! zEGm|wgW_-)Mr?$2d!{BxVWyilxg(|GvYSu~{cGivuZU*Ba|24a}Z6c!AF=60e?Z9C(jkPHv-R=wZE{(|2OvBtt*5fm^A6PkB#PC3c?dhJH$8p zZLB>lkOh0*bd2$p)#4|OJ_a2X={_mF+3wOci8%6|U1n~fKi zG!Skl%!-ZSPv~#dsqZzQRoo+}oi$JmA2`OD z%7QGMJ+%07+R;sxV;x}rweUCgzVZeR%^Z#LjCYY3>52?BnUtChNfm6Iv#~jZD%%>w z*CArCoH;G~74^HB210S2CGOJQU%?+U=lPId$P^mNIE1bY`rFtuS3c3TOO0Vajbq)L z<#Dsj8m0Lf5?s?I=l#aw+(N;!g-Uc^Vbs5329KpC={riPAhhu at R#O_NO+dA992fyD zc`P9Zagq>$c;%)Eiu%y%f@CA4B`t59dH3&-j9JOLnrgbV6dMfNqA3NysREa>BrL>o4wz! z`wBq&RLwi=U4&wUM+Ipkkjy^eAy at +aB(y2UZQ+MhQ|bk6v9VfD&=UfSbvQx&I5GnJ zs~w?`T`zp0To{EfAh@TjAE$d+2{_bpe+x*|k;7T#Aq0orwT1KG_F#($__=$2Nw^~iOWJRm=_=WU|WXm#3FMH`cSLHON1ll?;uYEp=RFbRh&M04vK2j8JlK+7g`^ zPHn;6Yol8FKXa{gLv-DFvPKk^c0b#vyW4laL787{kmPz>hTkLN9{xD5(GY9$ze}!= z5n5l0q8(n&A+!ieYy1?up1t7?WLR9rqZ}^1zyY_24L{}KsIFdZZ|oOeD+b~3I7`~7 zVs^MAcFi^SN@}HrBQ0k7Ne!O~qjkWB1*0=+v!c#aUpO1PjBZa-$TViIfKG=&sm1rJ z69n at NNQr8vrXOfaxo)+rl3)rZ2%r;GSQljh=3k*Elt-AuGV+hx0Cwd!D2#YBIR zGj#?MU at L|xT&uM5_>`KR)qd!44b2_jwfkzfB#YYn4Tf_3Uc@%4m#IaS#OIEt`<95Ow*)C%+s4$rTUKNB1<|dXDG6G$IR3`MU(QB* zPWvFMzKS at szroEGJNpe)lW>He at hQ|nfm5nX3W-#{{U-^BTl54GKXb;f`7S5LH$h-)fFFQbLI-6dI>? zQL-lJyG#RARuCeMVm#0U#9x at cSUhHS9Iyshn(luA=213Xa0- at RQr$fz9wu_JOos3} z#DFj(*mqtZnNxWpFtj3H+8Tn7^sN^6=q~V%b^Xbh1hgI63xR at eoKu*6^e2E!t|tKQ zQ at 0Pr$i_cU*Nj{h_gCCZUQtxr zL&Xn-ENE_|U^>iEyM)bhJYi- at W-WwyF^?Dp7tZ6-anIC{JtTfa`THIPw;TA5!&b at B zYez9Z18_1=2+0OGGJ%0s7a&6lAfyr>Z-bly=jw62m*`H%I1Q>%TZrcmCyZ3fi=y;` z>lx8tL9*l1^QO~(jDa2?cxC)8On(Li1SInBF`BT8+`pcGlbe;9%YV>XvHGU-yg1qy zM at p5ZQaC7CQtliZmg5DR{9K8UT|x%~FluIRu<1#*Ee5H03QNKy-1TqN8#vwHaA;Jl zaLat4th$av;IiwGCl6IcT=6DE5H<&T+5GRm+c_ at o#TwtAk08I{mQb(;t0MJYl=>8C zj9<6|$>ia7$mGjkz&(@kU|{57?>~T0G!<`YBVqhhZg at pDI<4BuvB52{4hnP at m$91~ z%$!P1&uS+0LRY0X?T>I;HkmwQI^@<1hS at wfC(vzbj!)cb*I4)q%WF%0!ufVF;3jU4 zu#e`t6>>Gr;-sJ4rkPZk>HP8+tDG#vYST?u_3F<%+ADZN0SLbmG$E*;k8|t!Mv%ra zy-MWm!1K(a#mBCy9FTG at fjjCNk_@z_W)xm`RPfR2OTu3ry$YOVdaIAMbBvCDVo{|0 z3N7}g4|_4^838}RkfGk;u&pF2J25`tYG6u0=#tyCK44g~k9YCgLxeDoGPTDoSaSl*_sB)1coNwcWx_dcY^&*0 z?8Dv=rnHYJeu>stW at N58ZVJmTnspv7ycQ5g8Wyq6s~9(g5?}nO!;FHvH&72abl-y@ zodIzZ9ni{BQCxB)kb$AWsc6gF#fo9QI7LB%$8?e!Fw<44t1<%Dz?S!4999&If=_r`#4FN>@N;Aga?Zv_#8>Vi z-&hbq*_+Dv6=Tl>Ya2P?H{Dz~Rw8TcZvxlf-K!v!4nc_`ZOk3-H~g!^PGrIS5?uWf z-Z3lez at K2slyB?wCu0eM+MH(euc5ew49RBgbDTFQnR=H<` zzRe{1970T!L3>wI$G+TvZ5$$UnV(Y8-Vx7JXpa4}(`#s9BZD3*3Aetu7cvHRvbbMQDl%YdqZQ$oiJ2wrG_ zcOLI8I{NeIX_g2AlPQc at Wk!Xj`VbQJnmRq}B3tr!GT!pi_?7#V<0DP``Ke?c`{u%? zTj*lQ?&4o3?F-%}mxNP)R<2&9G9|dXG#Rcy7Okqm9F1Kk^_b!hf1S0xm)rZ7g=zK;74NWO}HE zhhw?8SK&k)!4gvOa(QxvGwW75Zlq_?|3%t625Itl+k$0Rb=kIUb=kIU*Hc!PpE9~^ z+qP{RUAFD6`M-1K&b{Zo6LHRsiTsrL=@*fiYp=ayueE~vn9nh8YKSjRcqbyHviEbQ z%KqHjR)}_02ZCYjIgBR|70WBL+3edT72~9YS*Z=kbak;WCu%Ulk46|uCz6<^DX01w z7q`Y-4htuK-W!>sTV?=Fy_xno{2EoAyZq at GC&Ebz`s6gIF}*UtGPJq&5*ZTs!VNUaYo zz-sMtMU$f{_T}_xhUMlXh3-KFj*{;Wk_w2bY<;5(fA2`mrK82OH;1%Z%eyP7G_kH< z$eU(1$ryyoL7Xe${IcGIA|L&(LS$PC#<4M05ltjQeXx9m1=X at Qie>$bFfuNWMILky zTB$3#MH5TG!@^6nJw!h!4HvXY&n3pD78FDOX%ZQvO|jd~x(MRffl897c`9ZK+vtg< zIUZpardC1mWFUL)mtbSI2VOAmYXcl4jqFYw{~Lt<2iZ7tL^sF& z?%qCg at Zb}mHmAX)9e}%fUQ?kl(uHd-R`PLbLNE7}YZc{V&ZgmOl)CG29Qt7+cbllp z-VcFV4jH}wJN^{9*UIG6GIs3(LX2+##c8bY==M$-qvx{g5iXT at 5 zQQ`KQ#end~ZUi#iof!<=h*tzOGfGfoVwW7IDI6|S>8oc4w(x0}m2cK at HcC(gj={`r zf)Q{y3MGI*1S3;n-!42$V0f|}!~&d~Noma-k(Lb%kZW8P;h>G3#D;BxhX`wy7OhW&RVPjvzrsFqR4jDO?5G*B zpJwNkkl5rqqf#nLh*~#Zo?({{c?QX$Y(p^C$m2>}|9wWiFZET*=YHB+%1*aHKgW#B zRce}8!c$(!vZ0U(C4ir-wc2J*mDDDXwq$R=0lT=9kCU-YGpC&yXQI(@E&*BO;39J5 z#34!`qYzgafnu&lB{Lj=qxq;zk$<;NArq~cNAaT+rPMuyC(GK&-J;)0mvDum`=3q!8BX z1*cP1ghh?D_GaYi_OyKzQ&DOC6U>85fnqJyat)@2X=7aSks_fZFfpnw^yCougN_Pv z{E#Jj-4sP(i+Z at 3dGSB#n2oDlbhv`~#%$@~mEE{I5gh9=J3|w!xO3Enu#)C>5 at I77 zOK_JnFRT&^qcoX5lmV9J{9z~NT>)4$OzrVdw+YdycahOwYZ!f%tnasV(Z8Z6JP~Ur zJ;5C(JmDQDvHRyi{`_VMN5ToyK8FFCcSXUo*Iy%D4NMXTysZ5dckj|1A-u$}npq`3 z;<8MJ&^T#32djRQ)ArbPzF4BK6(?P4GEV`hTqzKt{;u*`$?>s(&~pB1*tmj0eR#fd zIzd+OM{VDExq);uvwZle)AOY0V at 4n`g}{meXAd at M6s^Lfa@*Rprovs at zL%9{zW4&{ z!Y1{OuLavc7Cv+}OViVje`uo7RF8dq3THDrb-bf02+q#Hz-P}uiLF{b&M8pAFFfXP zTwOHRUr_I`9yIXdOf7)Hb<;Y?^W^;=K*-$0l<$vbB4%5%O)lW~NFTLg7#993ILK)?Ssi4NR|0$3A9r``!A zxnu|LJ4aFAJD(Oocj&-D$iPo`f(3J_Crtrj63k at Ae5H4CM6qW0g7}#qymu`Yx9*-@ z-b`5bO}3KI)d>5<%38cq#J*1tFnV`- at 6r$prPkL$22;Y95~UXk7Cd32*AR+~Tm!OZ z(gl_=wq2*3LBWU~O4KzgKTzb^Ij6{)u+7r?0J{y3kQ2pB$|U;2#gECs#2F2TBxTMh zV`V~EgrsrFNkt9?Z}@6>*#j$WWhyEHIZJ~3B at 6SioXO)c&qsI z<>66!^wl`%&nXSQ0alNs&S={gI!Mlp4nmk?Gmm;1S97SFBuu?u2EY7Es4R=8$8Qjm z(2ZCI%VA`~aPb`Ssz63x^nu-cnrUla9)NdW*aKmn`CQ6Gou74mJg(#%$5TGR5+MXZM7gsUi=g- zNBe`X;U5iR2yf_qd|mWpwI+%=qNEWA)JKOtBiaSv15mx!{$UeuelBHG?vEFd6HKp# z#I3^|>xfUAa10A!VYbRte#hc#q*!i*d$Y<3v at aWz)ZL-9grpb8&a?Z(mAehny{cZ{ zLdlO*oU;DKUa|Cd_|jgCH~X{1s}BLX=>AEO%Gm_tp-rT(-K4M1^p!BbX76*hQdYke zCki7p|34P{ z{Kp={|5}^WZ~m1j>Sw8|Q5DYZhE|G5k+cN*Ew$e?M?U0$d+-n3>qLs?g)%i17ST2& z|2~{?eGPtvV at r}dMObv4x|L+Ply0zDXC1QOU)jF8?tW=%ZGHd0b%#!9J5=#~H6iGN z2aU7hTd7u`Ca5fzcakwbpT+qP4^p>Y!e at K-<9K%f#QV0e(){~9j$*!(#JWK1N=cvd zs16&psg)d>*<_Q^l}D59yZH8 at _%d56`{C;}+Cg6}xi_QQCiy_;k8%t173>sS`9gJm zmS{A6hJ_~cChIx3W@{`u#7WNNlJ1>(`|9GXdq4B)>h(>8mxe++{P+gNku4I at DjWRY zD`xVxl|Oi^fi{HHh}rbz8S`q7qQgtC8*C$OHb7~tLK76Y;^SYP)fwvlRKMh`OtRC7 zN07VJM&20AFnqaMym+KYZ|4n+7B(=NpFzQc3(q$3pYGUHaaZ-4`cl(YsXRe037PBl zocD)RRSw*PdYoK`#asgdSn-s~lnNNC^@xdkG9V at AKGY7z;gwzc>K8-x7CM|5KL_Qw zGⅅhQnek#bi)KI3?>5NRtEcs0GzAUX}st{RD#s8g+=49<FR at X^VAF&Daps;XE8Nr(y1o1=pM7vzOj#EiJv2+nd z+GDCkRC_Si7W#wdtSegHm%eZ+HI+rw!@+FmI#u{uf1(ZieA$*P&#Saaz`^H+^Vuvn zhQ!}lNU!vVA>7g}O1>j)amaBadla#N!1Qe7G3pnMhnY{Ng=F}`kNAhsRHL_ndmPf< zIo?Ry$EcT at frxxN7&y+i)>vL60J{U6#B-%xw_&cI)np at eqUAi8iy zwec|%ocOx~D&$#OjNP{`pLo>1A@>s)zg23G@`F9M|IGTfK7xWntaVOyTubkwZ zM1>Ek>=DT}`M+{~t%n~gUpAY0IQsH&ACe+R9GqCY27+Puh-AG- at rE9)uZJ#cfU&pe zNhkPg`K1J+=4;97k77+y-M62KcN$i#oIrBZ3&Vu^J-fJ<(UazI#`tDt|+O!IBrE;mB4l2MPsAi3nq^r3i!3BSRTh zX#{I&T}5tVSY9Gixua$d-7RBNxi1!R$cyN2ZNP|R?w8cNtXpreTW at ejTn#yFmsl^n zN?oRXe)}{!TDohB3^?@S-gJ36{`t6hIKy-FKbr)pL%(?%h|wB~^ZHE7m5np`MYq=q zY0w6Xb!<$N;&q3rH{^Kar4)eSr4^z6S+-IK)SP&&Pg7jEuaWiY2-#sgXy(mXdB}`g z#q~TtX&vFW8-QctG=;Bam=3mItJrJcFB>}gv^o&I`qb*j)41RCVZXdJp>nrwiyU=8 z+?hPE`Sr-WmW*p~9ZGq*>=c8g<5UgQ^vuVoUAm=3{OFnkYTCBVz|-BH^WW}y_oFv% z&B8#jZ{_VtFu5L3BG%pw*x(<=WpZrohZ<~E>^0*$928&S8k~eyI?*ZCoD6bVc at _e> zyz+Bju5JgQ2*C~3$hi<7O7ehY25SSmh)j0F!iXNMH-+?f`kyd&rma99b_82)U_2Lg z3`O+s98Z5EeBqlYv1lzvZsa&TXNcDJtX|H9aDq!&?0O+m+(P^NIo^Zayx&5%L2WEY~&?+KQf(=3*#(cI_qjCW==JZCY$K?!D*ND1UDQ#t9q z_w7Kxz~cxp>MgkvsYPT=HK}q|0?=d>y zFN79~{MmIZ7)5O7N at AIY1~DI|f7)}1X<`Ckh(;(U%0|OY>tvmVodqCiY75jF!)0HB z9v$WfPCa+_=0Yn_%##C0){z}m5rQ;=gmPQ|>wRX_VEd^VkYKM#jVj|xhQ3^EUH=QF ze;JQ}Me900oQ0W%({6|p8aUXb(jk0zl%_69+%*`uo1!#M&?AN+~tJY@^8?WTAfz6^HWkq21`V?+hSP#S^1Q4 zq**gYW)9|`C7!5H%}nL2bt#lx>OP=(aq1fd6>|Q)61MRRpQx>e7gX-y-^i%36Zv&y zxgr{p(8KNic*b^ea0+R~ZRCR^wX>_-z+&Bru;=uR_Isa15TAl%4CdlA?s~DMVt=`m z%8n|Hgs*@oTA2G83O62ysds}b#@rKl8PoqEx{96oND=$g9jBC*(h_YdhtSg?Vozs z_Bmpv?yiKUH)6#2SfQ=~x@~317z5D at NwZWUQ#C at qsZ|>;sPn=mRID;?q6vZ|qU{sv zdP3}>%?u0-FqI{P3CgXO8osgM3^d`gIQz|wLELm$0DP?sk(G`naq_zL_#I20KMf0T zl^FTv8g=h>eL4&(S|ci+ucSq{{uvnf&^mAR^x`jo628ytd4a^KjG^t3HlIHv4l82} z`WL*cy$I&o7c(NC2>6U=WB0DqGAyaOH*@)BaqQUH;gB(OB3o0KrK;OQrDfBsKJ`6g zg6lEs8FeG{u0^;Fo)5_%Xx;Pm&KWE+1O`E=Zm&MCu}I%AJIluS&*!(Io(f^i(Py_L zo*IMUNd6GH%ghxA+zTh2y9NY3V7+t9C8qd-m8M`+)Fx)CiAer1x$}F3g7-YHrUWnZ z;5{)PZm(=@hNIy8-C=)r;XReYB)#6LuUBv5fnjdGM1QId7+!x7APsh-n>LC`62$F> z#1iE}`+^GA4lW{G;dp9zyU`N5>lg1w?^hD7h1s?|>A$kCj| z9q9885!VdD-yYCUplLe})92~da;LW`D*fP!Iw%kJxL^kTC<9~;TTgKJS>EJFn!RU) zzTckFViF+r^{?+anCFtDzVq9)0beUs9Pm^(A#h%G+i1L0$g0I@*pBsd6A^Wn8ichP1GfIyvG(i|gX$19b$gvLw zw#|33SU?p1{vDr=b|2gsy_=J>b~=>SFJ4>e!1vN6p6-SkB(c03;2hu~K4ioMvAk at o za4!-45k$iTworoyPDWOq^9AN%xekJE{>Kpcz1%z-&d- at vORpc~rQsLdUwFe7&u}Z} zJ7r$=$&po;LJ5&a2A)R~19D8uP5FJ=mOnvSe_c&%VV65%>Xv9l@(~fh%NjtXe$paM z*AphJ!g08rJ?WuWyTobHRnr-0ih&O1(L)`!UPTqgcZuDOLuC)lH zUKnhtjBV&}4Q_BXw`FYEQ#}e0TKB6rN&vA~hev9!*p+C5#jitj7ed;aIASFh1F>R| zaiJ|b`_iZ}U-Aw*Rue6I`<0<;p!p!m{?jgfNA5w_&S`S@%PHiT2>C%bA4N~Ca7W^% zbx|fs0y^fwH!+VRD-b_qG5*5V6O2D at z5z{8ZkCi6Oe`d7?gZ_fROA&!hvv8BUZE3o zfM+88w)Ka*nqL%cgCLa4?m=X at BO2kz9MkQ4mSRAZ)E#M7Ab-fOZ=5-lSYi0?L$a*k zpuiC}rSMx~tD1vd0PFB3Av9L?jPRQ9Xk4y8rT8x#&r>h9HfdIa1POuh!r;StLP6 at a zTa9?*gS^tH|^Yp;B4wZ#xk7qEN+%*<4_lobd|? z9J<5K!LIb^2Tq`7DxO at I$A$*>KV*@)TDeqW*0rt%&Dtn#7KR=$YZY|C)_=s-R+O{Y zpHmkwJqwaq+oytM&DuN8{=#pOV^=i>dL~5F7%r$7AvjCw4J$Yc;fTgQkV~zXTll-$ z8|PrcWG0IKSgvTww7OlNDmK^u&p?@Lx2h6&;x5&y9-M!%T?>%fOKi=Kq?^j#J-xsS zXMEd+5zyPTZoXdrt at _#}{Y60e#8Fao%tv0V*uN#wD{bGQ(G?Uxl at Ib)14SAcU6`W; z`7K7;Wp3t;5}qcrhDADYCryu%btgYONzrCYUeS99fe51qC{0ahbT5^%jA?fH;Y?UF5f3zElmf^mCsG{CN47?TUTLEwe)EZ7>LCAObbrM;7zX}4%PDj zcg^|>Y&F at dXnvA?cM>15K(DeXP~9j7VKdmng$GHo(YT1l+<5&in4??OhNRrzs$CHF zx2#qFkhRiD3h!a-S{0+(hIUTXz$1va**)@dW^=#piT90?#-7n#rlJmJu~8SRD`plC z*pIfEh=?|hYURTs_teJiE2>#;D2l&}b!CH#S~4v8Ss{CZNb>hqVPUIgcDr0~NCZ0d zo%L#HP<|mTIo}Z!^BA2HYb{aRG}6tgOW-!%@MWD@;JuVN1{9*c1QmOTWx+c_XrGuG z1DSKMj{V4=NbaNqpsq0E`id$Jq(pyZ6Jo-8j^Vwm$$t-%wmG2+R2_P2jXyC{42(*< zQy8TIssr$LVQDS&LOeR->vW~sGL57VO3{H#s8FykWkDYSL44)ACHSXJb5af}WGZ-; zavyw>QtKccS(Rh)v{Px5I>-S11*?&*38Yn0!}1FRHRV(ZQ4T=7K*Ra#+YOUUR8LtT zxJw?COFsBR((h#<7GKzzg;+3F5lm!0#Z*)!Eb;SROr9RmaN;AA`@>Z6!&8;$hrhkb zu%Gzd0 at B868*8+<+Mhnf`DvH at W1$-~TD~e;I$=@p5l9~8nQtVM8?I8goyD5xxpD5()y%LMiLju{DP4Y&uU78AcHIX at eB>r=l=M7$b#hFKW4=)Y7UI znmS}Ady5DtW3bm66nq^4turM1o{Uy(b_)Mu{?I}`Si=s&*uyUCYsLf{E4xS8?jaX= z!&WjNwsuprF_@`Ie${i1o?90$Cxl{@xONYpo(C~CyU02_Yb6`#o%4RU$IR-$T+0 zA53x8FBj7)uQGLz=%`T}s8T!gzIHv^==bkrq4`VeJS6n~IY1dXBeKXznm`XumH$>` zm^QN2I7g~^L1|3G^vnA#j?K&A!cQhXTrui z3BRTHt;1sQWKkSuLtG9CUkQ7L?D0xqyhPVQ_%PWd`kgrrp>_!jL!;MW+$n>Edg at Sb zn9;*Eq}fjP1zt`G+$I;S{$_4~f(-<&%9uFWE`A9uwH1j`pmcyPy0bGLD7+llVQUEK zuGf2a9t^Wo1^uA6dmWYWG7GgJ{Pw0VzW{V4hvSQP!*;DKb z`>(5qre{+1bkrw^d$yS2w8fxlFJWp!#``+- zs4b1#MK$y2viV)W0>TgKW-pM!Po~$<2taiN>kGY|3HoXgPpWMpq^kqesUF_xcS*DE zQg)JhRxoXy9i=mp1=@){`OIc1`pFvmzMTGyfLyO3Em#9o3PVaCD>>NYikVS6XZ8!9 z1&Y?|{-x%5#;HT&l=jxHPsoiwb&KP{{xQBCTDBn1t-FIlO{0NvIGy~9`mXy+;IRQT zSgM*<-RKFO2I`#+dT`w(jBhJxtpFamHJUcT ztLrJhY;iaq9F;L;ip7hiSc_0k(G0z9K1(oX1*GPdUJepY(T%T?K|s4l^%d#8Jd|YE zPJx0J;WhIOw7`~1dt+{j`_b>x;mys<0f-a+Rd_IkPHV*un6AxXhS3OXtNFwxVg*>! z(P(4tIqLx}d)|}~=keGp)q!}uvq-w^wv9=>d|O&8GA!`v7(%oSiTzm$H6}PFOLyx@ z5n4&%2@+ll-UJxl|hr5x2g at i~`yTMI$3$pRdlDA0M!)Ic&{=` zHl(ar=T2v4vD8PusZlT%%zb<>)RP5nxn9vFZ at WM|5+UT41?(bcv=}mW_eHC at wv3T% z_Lg~WnFBankNGt*)9?{YT#v;ynFB&xx_b0KC*z?8@!$I9v0uk+!brXUW>GO$^HxU> z0RnOj4+6se-x?|Y%PHkQj}?oP^<6f_(1ANosddUCxK{6w*3|jVSt~L!H2LoG`l&6} zSw-wMvV+XgChpNX+N=%u8$^8!-$8tgyOimBL3p!A$fZ}^wc||Cy{8cq+qul4UnouvWSFWsxK0;%8joUUX`^zW-Yy^#V9eiUTZ`;`LeazBmk&w!LLi$t4ufEByO}RQ35mIn&!@XDk%emo^Q};YxJh}si~ikHnVA%`sJu*UH1WKG&~7 at h9H(Gx%A|=S^PMjx zs=R_dV=;RDt+v(06Imv?CWF=mN5(W at I}`0C%-ZR`YJKYi^o*Dh7vSkcD{Bi>R6|!%Qy#D! z at RPn|jM(PDATs(*;@?o3=xuUe#j2M>pB(}Devknr at czgXhm%#{mGT$H)Dw>ub$@l? z9YOoqDt10=q8dN&OQMo{W+Cma%8NXI55M}@mnqU6^j70$Um%kAXPpPjnr>eAi@<&{ zgqTgx4beg*t0aEEKjoWsf81BZYi(c%IuBT@$g69BB3aZCs4s6{RJUG$Za+o_#(U|A zx(>54^Y|awMl_U5=+OrC+1k; zaN-AW11#`byr(JOsh+DiCxL zU*7QsdzT0nPg=tww=W)?ep^oLU*$a^A0wX`zeSlcdlays^AHj6JbaTa7E+S^M0D#X z`4f#KumR~2#Mp-CT1?9zc*wc^HA_)sxFT9MAAT at _n;P03_VMQv1dnw<^xt!2v?gm$ z6aGOTTtpBMw*MCTsG9#f_-M##ZfYR^W&B0$E-o@&NPZR^pXxOnpR_Q-7;_P_WJC-* zWPM78F;iVBmQqH(Xtw%u&VNC?Gti~u^sM8=byeJ7UeS`Agj^Rw3Tw-U!{geQZHIp< z_xtZNUx2l5<|qi^Z9|1o%u84oyQkOCb!#{mG27Cy4D&GN*d}yBTizS|6 at U8#{)dOp#~J zL7T^kXE~v!Zy01_Zc4-1`~WAN_6b*7AeD)SPoTn8yaz6eVXo!J+*oj|wC_0Z`c&*e zV0vX^A=!PHok7!dmZtNhyOk+Yhnk+z10nc9gc9AlqlJ+GQW28X<1~0n*|vn{sv at 5! zmKF9t8PPA&oc*;%lVM|KPIPUjBKv_scDoL9l#y)3$>CnHE-a20k3 zKK-JkABXz&Z8x*(v!@V8Y~-v+tuE*&8xm;p>)J~kY7|MzRIdGIIH_;T)~t4NqNz{u zXgIUm9T&EtT@)cb2lgS7YaE=W*T(I#Bx}{H29W}x*7g$nNq;Vj!)4NOR!dWXa`)P; zOttGHShsm2^KlrV+!J1u7OqS=ZYWZ57+p}6B{(Beo4(=|+lAI4zhEEf`0W|47tcId zS>sJ<*j$eUI+i`2<}2((WA{E^N?iycM-H2!o>)4Au!LwDRLORJhX-Mw{HpZyr0qwk zGrqM&*o>uggMtsy)q4FMLAc>rQUR9GpF{=XVCk&VMI1wT#{+^szV4`(v2&-(YY|T_ z5f3bZAz5qY;Jp`hUX=cj!PhwOPyB=D!3cI2EJN|82c zy+Zx`Z&anC;9Ugh`W at gcacs;LaW;s+jc{d;0*C;9B6Hr42f=ZRfijH(Wph-youACK zMC4fDZ+U!}w6h at dMFPWKczC&M!knP at 5zsuBwxRKFAPI^@dz66)qfLw{>4Xk!^>sf!1*Nw2PNJdPpcX5kn{twEJZ1UYF?|GJ^rlR{ym_j~xt)0)%Dntk zSFkL!AG}o%ku>yhx4NGWRbfaatM&Yhu?0`RRr&>7<$U~!n9-Iq{q=7IYX>bb^;54mOs8PfP;6 z+-^fAHH|rgrSP|N$|riS1 z*UdjfD{a&Ux6qS1OcJ*z{-FS$aMD;BshOR%Y|>a8i4NdduqTVC$ia?1(lNl&wvMi_ zT320*NyJpjaM*FCcu z)lMneWz&m{KxG4 at Nb$+$*sHqdNTfgD=oF{VYCF}%Ik;|>NZpgDHurdJv2T^nUu-bd zWlt}$YWFs;zToXT;GEtRTV~$C^zcEdH=HDN?nHO3I)b^5>`B~n<>abk7)xE7k at S(F z{nFBHL*PjUj#szzG(0C5Mfre^^q|!qZeMK(F;3*{iKLYHNizvtX%`h*;pzu7?!kI^ zO12G at Yo%NPyhtkoTnGnBX21)3w%FvoY*oZ0T`v)pS>%E3gBHDmKhMM65?ezwN5z_v zL79!Ti^XrPLx4E2+8|9-L!A0L{l#{KR at fPkc+)2 zn at Wjr%(KicbK>52dxP&SpP+oAk~BnQ%gB9-#l?J`BpE0z z_r?aP;U4C>_8$TgXTWV2o&9_g!wf&-*6)vXNv~Fm(2E)lrN;!kH#xr+NsruiLT07_`P+ z%yGkno!UdFru?M#mGZpRIC08Rq7v;X at AC-sT_ijh<}Om`f01k=y$hGT_b+@^P4GWd z9QuW*BBesCgp;QT`AFj%WEU=oF(+%tm^WD{)F|O4p`JU6t6XsPW2(&KcjD!7t3i%~yaCt&@86_5 zg%Y%MhdqCEJ-KjSLAtxeZhDf%irapVIST0!y!>&um&$hRX34e=GhD~mdO4;gqz;)4 z{CDFV|GN#u7)THh0P24wWtMORco+lBtQ{=>4OKMteHLBOzrR)&9P~%{AcbA!3|f#h zO1RzV2HQbn-MZ}6LITb7FTt!;5?q;;gp=TzK0$tg5IJ_u;rZVFOVxaTmqk9kQMA5r zG9Q)w>EbUG#k&5Yke8l*W zi3wXdo3`nF__!(Mgxi;N+$;1sIn{{nPN}p7{o!SG&V40OnPOQ3UX;=x3IiG(&Gtu~Q zWQFGOMMky8(ME_+3x-|y3JCrMOnDtQSG`t78u`#QhPWzigFN;qbQq_w^?iY*aP?_} zK9{sLd5TJ6zkLG-(<+4f?|nZn`I%LF^~qVjzCvNb3l8TJeXZp=c%+PA%@y=@^iw*# z4u;AOH-pw`w?MSungYs;@zk0LIVV}$JjFhQl2c7=Q*SYP>-bM&LWrw)ZcYKmnQ znjKAZ)f(Cs6NR%5PY z3gq{|lr1|m6Ve#0!!oR9_R5P$p6cmEZKCm8|%(@q@;;G$Mw(Mml^B{ecruUWnCV z)ebIF6xT1pTx^%Nk*}&5l*~J0tp|H7n>?;UkX*4%m2&S(8#LA6+uHQ1Rh6J>xivtW z#_KF6TDPz)g>Z-TCDS{xX^ARw at t_ebtdMdZO@ZdeMT3N3DZ;2C?Q(@(bw}&OA0Xhu z-CH>g at 5h6zy=P*5O_&6bcjF`-vd|$V8J^Zq^kdLt8ir4Fa(*+f at jatcR9EAqoRgDl zr7XGkbu5Rog2Vd&Ak7^viu$Kt8J3Efnq;(gkeg;tzl&-QA at PNU(ijX9_T;ucgvOWD z80v&V&#YZG%@m+MfcT4{eoNk$agQ^F9GxX)!~^x3bxwdDHtX`xySN+Y=eBFRUG@!o z57yeEg(dtY0%qn&o;b5tNKY)1&|E6QY0}~0{AT7Or?{fqxl9S)S}`MYC(I;LeY(p?yq_>5VZv zP at g+9@A?8b(b1fdtH8i9R??)Q&@=`q_zJ%k at 4@wsb>Wth2uYt>ffn?Uo<&g3Lj6a{ zQcV2pp4(G;4`yCG74V)VZNqcb1VDEh1>w~LHB(DicbVOpILZS{7qyBlM_1dvr}Ody z=~^=1z+$nu>k)@u+~tJrl0r<4UeRLAX?HUl{`26syJPYv4#IVU{vM9rg_C1D%P-6< z{*J=J^DaIV*7ryMvImC!c}bCvw;i;c?-Q1jUhHOu7og>%IW(Jhn5V~Ab?>1%Enn6L z&Sv&f_dri>yu#lgGt$$KAM)ap?{Aa)Q9|<#S4;suzcMVk;yc#&>CA$GzwF at 3_|TPF z;d@s~cNcgQ_OCz1-3XNFe3Q9o1#zQO)8xX0Xp zjVghHfcymeueSaEC%7w`*!=V0|H&g)mRB4QLeC1lH?9tX`IXZJs*ER)ZX|~QYqMZQ z3j9#vbd&D1odENfWlHnBg?=rJuAPGr=P9It3qpCgWd2X5!Y{X5okp1r4sSsyo7a!b`v(F#((utH)@(bMPr?A$z#I(>`Txd zxFSrg7xY_WX+Y_9hMJB2+n-I;>q+V&{I3|&cp`<^pS(tEKsnoa`!U}dULe9s+40FC zq+P{~NPwG2T@^XnG<`&JMph~1 at G(Lzp)@JZ}oS&qi^1KquF{c!oPcc8l<09g74$M zvjkFaK5nRXzP_HgK^Kybuq_c`*=aizmXaG(U`6B0H2Q68dGZvc4IWFD9CsUc& z;F`Unl!#(>hU64e?rAGpq_d{1CDULXcZmrFTAPX;J!SUh%wQm(t-T!VFokdETpGdk zh1BS&C at V!ZAr^UZfM9U6*qSC~HQBW)nv=VtNKJay@@`Eg&J?qtU{YIpwV}*@eV(Kx z)-pq%3l7Ft!ApmepD$!do2O8I((jBNTHe?Lk`KuRSw?5)kn)FU#+G^<@)ewi>jpWP z at HnDb$s>;_%V&*(O$8$jEfj#JGd*QV&CYC}+km|Wg56X>dv{F|+ZupsJpYZOJuE87 zPIMFE%*>bxbWu_zX7xqx(;YDj?QBs#9>V-#JLN|zG>cjVdaPJt4ogOPs$;vCTJkFaR{f at 9GL8zByXson&c)#cXx%!<-#}d|drofQ)O&Py?B}Jf$$B5p zTYZRL6(Fd->>5Eow5^e95+4a|vN`WGq(3P%A{XARqA at X+7G)<#YKuq%4eGyb##NvhIj(KkA?7;!h=^C^oT zOEE>;D9aiC8-R;NyBH2^-_QqeDUZe3sOK0j-t%b$#62RkiMJF;3?t2MT8R|u2xcZh zW1RcTJIFhb>7V317%mu}ME|KZFS(5hq8;G1!Y~GRjhutb6l;UN#xRDr!^p?;7V|{* z7C$9p5i*JAbWd0lH{seQ01A-rgJqRGSVC~q4RpG`2}sSKxqx*s4M02P2VeiD+Dh{IBGnyPq6Q5E~dD6pwNKjRe*@QK*y)>r3G z-<%38Yiz)qkjs}qsa>6}CO#oyQRlKjyQ(%O*giac+AXUqeXzalox|;0iTGa12rO0U zujTwaAN)NyPxJ=YX3Kpi%r_BG--fYLh&~OD3`D{wGpADq$tf)uOpa;OfMm%s{@RP) zg~suv1`t#@1jPk2+2adP;FCa0jvX4UWjZ5HW|TV&9`m%>3|?2lWEL{^KN5`A!;Rt& zME`;CPX>3L1F>h0V^PZ3hJHEtRbaPtzd8bA`DFV1lLEsJ+24H%*-@ zLKv;)AqmFu&0JyKU4F)zzM_puLpu!&3QvJ1KJgFSakmskxZz)}JE5KPd at e48CsN=K zk!7zMpHbX?)EKmX(HW|h&$PMW;_e|d^=TvA at rZWA)NmDu{>WDmL^h&W*=@@QbQS|T z$^14Lel%|`lrFi_E0;z1eh`93luWKj2JGCapuT9CR5TG2j at 5p zy1w{+(GPwLX!?mar;uUymA;Dnf@;>XnZD%_>^0nN^qE$2YlgKc-xv|O7|muJ+%H(L zm$P=can{SE+LB~wC1{|~PTaO`2*i z8bHRGC0`Hgdn`Y^U*){~+XSeSDzsY*a?{9nl9~XeabjiU#z-+MinaTY1F$2Y5dc%?bqoHo40G7_7e_~JSk++H#kmmQLSO)Bs+0vZ!tU!5?uGG(nZYGR& zPLVQ=We_m1zg|FD_Mf9fW~f3s%(FS(_g|H>^D$ZT_mxlZOppQtXL)3cJx z*YnO-ISZADgdf2-4H^=4x3Kh> zS!ZLrn>F0=2TAMq#ijYDXOCAb4B#_KS15#$r}w~^qHZhQ6%6jOS_8HY#ZMi#;1pq$ zmasjhBI at qg>F{-Q4tvN&A|z+ia<#VGhWlYBb?F!O$J1#N$X4J2?hxG+iA7NzjJ9dUpnB-QgSBnp^6`q{=fK&fTt+uZ=i0{~SQ;*?I%ZA;nH; zCAN}4g}&yJ=%JiH_=RP%WY_% zdC!(FWctn-4(f(npTDD;x~WmIOTG(U*7IBUwLY5Ap45Mjcwt~MR~cyxi$_zZPi zAr3bJD6F%3kZ9(JLVK`jqzY7;RIOX(Qhr~J`-6YTD4=#XP5g4g^lPfsRnaW7#x1tf#GW0 at ZC6r(An#8fUY~rdgwMnNGgo at liY^$%Fwyrtk;lpP=G>f#kVE=(on&#iM*f_rg-MckgXfQLrm>@NOkzLD0s6vdyC z`TB65Pwt}3-}}tFvNLT~n<~+!`PRFRG=!F?L0mOvEekp)~2(H>)H3U;gl8 zt!ySA&Ya|5$*Jv|d^S(-)!o^$mnK7_2$N3|Cn34_#2l;$l$({VM^es-BWhMx1^!S? zx;cpWdh>|I7Ej%4g&NRYT-IJ*+CiE%@qbl|_dnAi~W4+5+cUyC0EM`&iJc zs&?rU;rR~idX-1-47G-RczX)BTfADaX|pYHoMS6HVMUtJ!W at 2Rr_U|Y?H0LmX5ima z<+}E2$^QR*E*i#mZvVq^DO>eF@}N1L_eVlF8I-6)Mfx$M%WT?+i_|cRRf;0}0>#=L z6V$F|c+I<{@wwryJ-JL%ZA?Yv0`Z*1G@*v9RB&$;KGy~j81KHnJY`SJX$ znzL5TTD8`y>EPfudV=;9Q_3tP=9 at ewR&FqS2$C9!0_c&LW at 3ymW5b} zJjx``im_PMKzAK>xDUBKBh)N*|D|P52`cB?%3r#C2mg1S2min6^1s^;{$Ky1qNji+ zgw8i_-({y&oKGB4c!Ikwt?9**`U|81rr}jEs|V?#IBqq^%H4wLoko(8oc|f at U1^A? z1fe;x)QRxXf1=}f!^h+JDKD=VI&Ru0OA|P)nVnWE#rk zWxz}8X^rsgLf$Xn81d0|5DI=g#rlp$U|-1E6kGSIekIZGFJY1vUhiMh6CFdd8aymq zMa3co!nUXxT3m5G#6%F6d1s&EQcPDkrBV_SIMpqf6IfpZmDe0eS_(H`JuGkW1RW{i z>wHFtuKIv*SPVE at A6LhJ3DceHBB^Z;{8VMRMze;`YRbr=>%>RYLszF?4;&f)Ijaic zjYVaxm`$Wp33x$Ne+!%-6VpmQ$)SMPM1ec-St_dzCu=;6oM1k03VItf?dL5;jrZ(qkwR?lq192fD`^ksbg?X`6dCnbZqXt!ZnEIzHQ(g`mak5jeW zE7&}azH+uZoPmem=|Rm}JZf5wwVhYTfATAp8qz#{%a_3@&z5{|5;CGyZR;7N_Yl_o zQ2C>|E+T^qh+(43-)<-SVL(u0K8q~afJm`kDcP^NE zu!I-RDkc3x+5r2|2*@4gHB$-USE8RE+4{9DhD%2C8Z=VqDC!<+toXxJNPPEkD>WRH z*-gsamT`_WvKn??)D^;V>;cNiT*dcr){uM^wP1!)w%q5HrVa9&t!Nl zkKpV2D~~)@I|VK^ck;E3bzKnxH%8e*6iaUVYCMMIK z1IcxPWG^mgfG`OUNzYyUd<=A36w~@dLTCWct}syMq&i^XC_C^Yj1 at jQ7|m00K&l}I zc1^@na{zqGk~5qNA-cr&y&xS?GF3cGDHj-YSxXzsIFzWy-Ju1#$-}JGsChv zEZb`Y&f}>vzJgieEZOu;9#;dpK>IRvuiK at HSNsnSz+AG(x-coS&>Xdy1B1(oCvx)y zL#}9*g@@3=9oxjlP~Jy_WlQv0-+tG&Gs at d0HuvfVYN!@FXm4H2#gygN6H#2;rCFfj z?Zv5+ at Vm@A$QFW{D%{Hxlmg3g22x at posqP+QoZ})dB)U`E+sB414v4DS zJ(M!Pm^SFsU1W`Lf4uaw>=!JmjU+YgZhp)xIZj4IObkWv^f~WMx;45>x120Hvo$Rv z;bHDhE=GDNn=7d!3ApzX#H5!ksw%G^=CD@}VqVI1E)T&EyOpQMKl!Ir5NGt$?IZC< zXwr6-)0Z?(1E*zZD0$fq1)q{|4;Zt{I=?-{ck}GO1yqu~Tgn_eL~#e$2d~xf`W~emT_!SQ zj+XGfzI~kzK6j90Zs(!t+t+!uL0J54q=+UgLP|`jD12Q at iVMLbt5x>J&5EAVISt-# z|LkT8?LPpnsE>2V`st*hY2?U{VtCQonE?E(P0MP-akk<`v+_|#e}QfE_-w*>-Qrgl z<-Mf$lF(ZN$D|LcUXt8oayQsWniE7g?~2j3UZ+jmKWEwLZV}C0m^VcL)njO&)aJ0Tljo z)oYIfa-_NfiEk}k7r5@%W@$kt)bSp7(}mt9FGT^=XGVO3kkH*i7u$pG-Jt-_to>8& z2k&rxUGr)GH2Q$)mJ|Llf*-x*QYqPQjN|e|mCh?|&YDa1VM(LE(@ZZOleW9O)_S?F zw!b?9D4rRf)!qevLj_(}+TuZEs4*mx>t;ORGb{ZkWmMxLo+roj2|xkxP6FV~tt z-sU(`;+fDEF80|LI&!^YDPo#I2(1raY8v_Q%;ZRN?d at wt)0IhGOQGz<$CRk1x_7aT zH#F5&&#=M1RzGe0NA`sL5jxGC8wJ@#5Bw z{jy?u1?O at 5n6IW4rzTI^z|&LD{iJZ~@sk&dEBo%9k#F!rzURsLYCm`X&#`jW=f5aK zj;=^8GB6Mj1gL+PrKDo!Y-MC?K`Fq$;_Z{hzkfs_XJ-O6YoJbokm( zLgHemM_E7y+S5f*Ur5=FDEllqBS|nu=Acw%UF>U|oqOBgH24*{gqL3);?g zkwdISx6&}w&`!z(EM>+X}j&AK(kywV&Fyoz@9Dx*#d?Mu?v6tjwaHm4(;P7h03}6=EKOCJtP#oIb2DI6o zT_o`bKsy4;(MMt?$91SD+m21`P&kW!7P!&S zEcb`h{Z-9iOfsq}^Q%V1DSc)1BsLUNQ$$4SHVz?LBtk#;GU4NPXCU!Spik?hYP8BS zp^C7Ht;I#TpUrM)`n&kLq9oa$kY{zzQH-Bp#2P{^DByl- at EVW=a?tw8z at OA68_|%Q zNX|B~#K>)>v|YT$Hd(YLc8RD1)5iGo=YEqkZ-}gylrh%A*A_m!`01tp5bCDhj>XKq zitrIxN4TX`R*7nxa%yi_}`a!Job{cHRq% zwyTh=3}pv*&(6N0{qx$3C)x$8{QGzN_hb0~vG)G+ft=VFA=rLKWU(*H7Hv38g&kpJ zj<8%Iblr&P+#f^8Ds$j#r~O48*B}Ja*?VI-EEDf9*T;aZc#5CjtztOEg(agLYf`qf z%3zv=m({s_(rOU=^~SPDW!v;SW;7iTI{_gsF)&6Y!ep}0Lsoqj7`)Lg+AVwG4I?l= zihZu!08Wiot|BAcjgE78PP{4aqMDyD6Gt&;yE=aM_0f!mv5W_NM^c<3IpgC062qvu z_;bJw0|F9``|l1I|1|9X7&JiR%?Dir$Dg8WRmz=$6dcr6^2c1UEqh4voUx2B^}$>% zOkZL;CTxieb4VbdxT^_$FSHT}s&=L)!=T+RZ*j-{|8Q}|>?*b_wI z_e|YGPGF#MgFr}qBS&;iH~ZF#HTfJj^IrQaU at ROhbNlswH|yJxG%- at 1jh6(a`PI5CD2cWA at FF-HKk{5}pXn_eST-JkW8Ma;k?*D&*hRr#OH)q3YW%85-KnDx6XGGk zsmy~-2qz&v03*`99&GPYClp;1Y;t2cEXvD|GRw0PJ7i)@jN&(Oj=fZY!c^K{iW2We zT`qgFdz0%)ZBDI;iM at fvk9^6vhp*#)Rpd&^p1~Y07bVK0BLbe5><1xZfug!|!NXaq z01G9B!9Y{)Noth-dURbJwAdP*Y$eLgIhSE#DKqBUZVEc~keoK8< zh=D>1I at w)b_XsAbQ!PuH(pHC5uvq zs_Z1*SBrlx?%DUg^OUO8s$Lv4&J zmD5#8!8qR;qI49U;(m+}N49+E=0p*nP-*||s1>_O zeMRh;!=KE29kvlX4UvL7oTSgVja4&oQ%UQ at fkC|RyDj>t#2@eZYCQ9j_t{9WAeiwYOyP#$JuoulZfkk-#1D0F`n_s(OwBE zD9EUauCwi&Cy;>QDkeUMwnxO2vaw?QDk`u?$9;zY$xa+tiHGyM4e>m!2Aq=G1e6YV z6+M!s?^_+W9F$B}$6LFe)J&yMc(>xYWIfuRbI77uQ3jUJWco at sm0>=jKI#Kp-K9pj z$7;GW*EHR=dxc>fj#2|z?bU`tf!-y%%k9;>9G)@*4q|nL!MIzP0FUe1C>mH$7rr*O zclnbKf;!6;m_1*l0L2>#gn<4$uUPs)9|R at d>RpECs$ZX3QN1>vgkOsFkKCw~sCNqf zjuU at RG&1Jk?6)>lMB;C#k?pM4sX-|&_mj98<0$&tN3gzf-a_p(B0Ar%Go2;b(K+6< zc(PHRqwOtn$M at E0NT>IIK6h7+X}du at 0MGnii=?f)z#5rVM|d{s+pi{&nz^Hv>$~^V z%n%ee>U)2+cQp>;8_2i36omjdvcJzEY1g;S`^omu%HoaoMEYpfK at Re5QhX~*GQb+a zN)=M{UFhuc5%ZqAr4Os!i38P!I7jbqD7 at dwm+`)mF-QeRf1`8^9Ud0TyhR8f>`!T= zi$Az^RIastT+=ittcBU-)1;&T##IKv99XL!J0>oa-RS2maumcr=^S?RDVC#RGTeAT zMafTf_}A{f?qRYPLF|`PQzZ?%$hrj&ZvWW4C?O?-I1?BlA7GUE3T+lwls&>dp5_N!;m^+w*Nsw${60+{dlAs6GjF7k&~VXbOn zJ64fxZ9EawSe}nYJA?{1;0eP>YsqE!gN2f$NCFCOpJ8VQhGd1=pdgVfmUj2qqrOEN z&xkt()`Z(dS9LY)l4e4iZ+W-*rb2z#2fVOW>a|}nr8%FT_L}c3%9OmFc;Z!FgJ2p$ zrQQH=kfh5uv+MeOg9wdbF&RVX&Qs<;V10uW#eUFb2x^}TiaL-Zqtu%1Z^gvcIIn6) zL2^v&h+j+bv_EkYA3%+y;`XJ!z_K^9Y2H^f{9#$JpSLjUlFQR3|9zD^1R5<^*rk|w zxv==;qEa89v8C_}rIBAccM#f4xparUQ(we>BT}i~p*YSk0owOxWTycnzhRT43300# zD3)&{Yn#j(+zS-!wG~wG=4c4kp^6 at T9wN#-I@(JGEq}=@=Swq9yaEe$qsr$mQIuAt zY^tHMMzemTJa at B_#YQIj z`88!$(j20Tz7UMWz2gW$4^7oPU=UjdD(Uv^>C8vdLV=7XGeYlz2mAt!<`pJy(yLpc z1lZa5`uky{OsxD$4FT{5^N%Ef>55^{uIqjQIj8yjztP-qA2ZxucmCeUHOuf; z5pNB~UaKHkDhhI9XKo_0*0`Byjyf>jh#{37S{r#mx8P&mVg>lHX#JU-=~_;}aI)4S zXq^i-d)kWG1ZzZo#GG6uS>PIZHOyI;sG#s&g35?B%VIEmX;mBJVg*cGM%h(O?Ur&B ze_1c=khqImAC`J&xo_{DbZuB_Fqc(?x0hbl8R01L5de>Em$a&A zj`$f+;9L!MzL-{dfm8(PiO41*D3k)dm5f!6 ztA at LqhmRYW{8(=sNOtKFlctCoVr%$NIFzV^#DXQqyl#u>1buAIU{X}0nLiv7 at Zt(` zoFYIBqJZ at 2AzoZ>6Di3>wH^uyebRd#uvk-SV at Sr855@x}1#hPb7%q1|HW$zm&{2F? z3u;mdvM01-YI#WG{`fU~NEI>_0+ila-Rd9yUin7}(+(k at n^V`R_Mz52h<+8u)`z(i zDr^l##_L0f?l_2Pl;OLEM9~Fz+Xtzq>ha6I=i6Hd6}e=c7rC>i at Fz({Hid#N^vbUC zmbu+-&Yib20lSh zSQ#MLp4LcZlWISQ8Ib19bn_2LaLQVsOk at p{HZ#25^dBduj+ft{ezIGWS+39#$MfO8 zaaY3QaS$Wl(22C{@^&iJl5PHO6L+En-6mkCfY(--kDGTAZi%J2EpUcV-4r;&4uFR*X1xM(3RR z4ZoheY*;s1=Ly|kgPFLrtG3yE+q#xnjS)u2X6X%sj|x$b~24BIVj2M`zV1keSxd*3ZvKLatS!*o%Z_E@$qpy%mAW=jvjJN zD@el#Hq~&mQE*5P znkPwZ*XIbi5KtZyaB!a2GRM9|Zc1MxX?C$x_Dg8g+V7mVMpj{@f+t$%V#S4LkqYPt z6ryvsXN67OvW?2M$}!%WOc}8z_TL!~Le_#*M~@bh24bZXW!GuzZ+75ORo|)eT@|I8 z6)KLoS1GZv%g!1tHci0Mhc)D2dQ5aG9Sob#7kku?bzGdpS-Dht*NT9DtPwT6tWvE! zC^VB4ml}g6Q9}YTu$3Ev)WRxwR8&!hGvP|`c8VydA(0;rJIjg5b$uM#VuuQ>SF^pD zB=;Td*0%(RSs!RT?)19Q^4)N6*Q?jor8=iS?v6d at h^qX!1%47%bzkD)hre#DpPQqQO&`qX^mAqsxEo9m;YJ^MC!+8K;vmJR8KCV$?}^7E(yP zH>6X(^pAeKV)E0Hve+i+*0po>R+VRo>~AncA+KQ1N)fBYp!9+z4-?%t6InSKAD{bY zWIz3Q9~;6RaCsMOOgGyc2L{04*!g(x>w(v#xZNpY+^BMpX*@;>m3#}$d%m<-s`HIFdCK8EMhDWcX+ta-7b><1)bxr>9vx;fXf+P;Ub zgFIoA2QdcMnofL?@e_u*@?Fa1P88#^k1>6O>0YT(waqX at DFUT}vjWq3Ypm3ZvlYx8 z3rQkMvXd(Vt>HN!T at j!QJ5VbkB!XykVX?g$uruPp1yUD7<5T-)$2V%nH-sfcevpjd zd^KY3`JTDa+4N6Y00HhI^e}+UER*dQi#^x%7=(t4PT8z=9{HDC{%nU-8IS1-K)v3g zv0*`%j$NvXj_^qzKoF*LZ&`UCp{dz6-;BA72Q9fxTC7M6XX*E?>-{Jo=x#Q5&Z6D^ zi*JJiPLoJe|2L9j#4-Jnl6X$)!jFp`OeR%KUX|)!x+DfUt`X~`S-sV$>Qdb8BJe+> zeMkvsk5y_dlr%qJ{+SL~98(@aFd!iMgdiX^|5G~r2N at 1E-(1j^F+P`;z{bynVbUqV zDF+R8Qma>_L}IVXPe_o;s7Non5JFi47YgWB zyxeZ#GDZz%rtS$(dS~Pbw*g)H89NP2XqiUZK1Y`Tk7=%_>?_}=4Z!QQfdc?4AK^;O z5xxVO{8wFQWYCG+(r;m=Ah~*AJ!#l531?uEvAy(&p9p*}&Th0rWQW7 at 9*<`;q|SAE zx({!R3Q9H5is?g?E_YBx`1B8SPxKYcNM(-16I*jwB|&YQDo?Rb)t0YUaXQ5jLKeu*Y)0i z-U%Sit03a6w=Ni;b}?yA$~etb8$$Ueaf)1?II%v|A>H0nx~hPJ|d z>YWit?>9CPKMEl}VI+cVbA(3Ts=3JV6g>xo{how5%0!n$B}e(ZgE?IhZ at AGcK_25< zae|p|)AMw63+HMTLRN&7!9~JyNP^`c;_^=Fogg*GlmwOBSl6^jWGEACplEL%O}~xFE2WbJGR^CYVTBT5=v9; zyt=Qb&B at EIV{S`00YofpGBIWL340H;)qJ)~9R-X5U<1O4<_7nqhy^90AbQNdg-v&I at fDSjAQOizBK(g*WhIr=BF0YKX5Ei~vGi_>S zY?T|HiLjf}sPSh&6f0ub4HQPeAO?m8Q<*V=Lxm^aRk7!LJevNy7mM-AU7jiH2sY=&YO|d^rx~8m|iF`T at c>^pIHNY0b*T5WSNvn1pt_KZLv(7Z+3n6&VpIXUj8%s6|;(9#`TKB z>eqd-Yj4|c9?`2--p9TXYR&3+j}?M^(8R$Gb!ZrExwnjL)e%&Q18zeP+`B8U6~>|f zWzht%Eji=#J%1POOowHVt#K}G)i12Dwza?$39%!IZXV3AA{r zu1OV!y)?l?Iqt;!GWcT{G2N4y6FA6rZZD-Pgb*A#@k5_5g6v31CzPTk=NnUmK_K<+ zjwbvmr at X=QQ}`_e&($*27>F&&oMFVGBvB0FMwmSJ2SjIAG=PEW+8*Z_fcnMHaQzRn zF2fEwfq|}k*%pzh38{n^%7gmf7Lvafny(_Phy{Wfs3 at Z0KKlz~H;*3rBUIzwWjY2PwC-bML^<8_7sL31MMT7zuzJ76p`I)iV}h|1-`JPt zg3?P=iE;CtQk>0pu0-(HmBP{r%D9(yq2YdWN~HpS#O(=vA6RDm2Ih63_!9xHY~}LT zJ&cMwJQ(U8`S(I`-5}lzGV3*&h32$!E2$OhRhxuJZOM3(n$4!AOD&tb>IcuI$Mz*{ z)57d~UPlpcb*P5xHo-rvT1Sene*D0=MZ9=~EnYB#&0;*9f8>;4a^IU^D3A5s~xLxp{qqZ1dig3;C5ZPSJ#yhN{e5$Ys# zoTQ41<|W_;4!brl^cbkv2}utXima{(w&tNir_xzQprsG=9J7hzT%!nqCNO!F*zq^F0ff|u%JHy4{*Z*OpT)Y!%BBr-QqpjSH z=Zso<^l))4AGs~;%WI&g{X_oK;$0T|M0K>h6Ta6y#{^i%TqMt%R8~Mad@JNUjSlX-O!x zM&)FZcZ71>RncM7^lnu8K}!+|ifp2S5hHe26wh`tLtB?F*w!!o@;H#QVU#})?a5<} z)|}1~Vljy!u+ztKzcbao{-sEU;5}*;@K at RY`JY4|yZ87^*Pz1Jrd9a+4G|1v;sZ`Ih$)-}J=i`@;w1 zZX9A0?qb|-2w<60s^lUGf&Ki?Q!Cq?CUB at ws}k22~8M0`B?I at WXb3g zH~srVNk&dAy|B}9RVlh?4fqoCv+O=T_Q!o~;+B)iQjr9NXT{l3Z)4@!DKBz5eFE-1 zumO4J(K at f{c7kEP`Mi>(ICSfUDdr at A;q{w&YDpo9osi%ypR%XDjAUtzikWl8FhyZ{ zdO|oK(%UygWQg)Uq-*e4kZ?<8+b;?qht at 4-DId0C!J8n-Jg&KMx z3iJ`>`m6}!xM|A=cL(zfDrVee8^xZJ=PZtfx63?UE2#E!YeC at +g0#0QJTd|J7rik< z7q|bJ156`Luq*%Q$_V>Eh;sac1OJ(JtG=y*r-uHS`W{qYDu_c%*BmMi4TD?}1)D5Q z)e8$wN<}wFsMpV~rRknA8P>WVGyMrS#o6o^oJdehZ4F8l*_>NmjR zitE^a`{l9&>+}6BZ5ssMh$d>hefuY-Y^0GkJPU#)&=%dr6S>b99c3fl*^4Mj%yh7R zL2$cK^Gy?;#(0FCI6S<+0k^LRnn0qS{2S^4*MMS;lpa;uVq?hf)>mQS@&44tvSK$N zWoa6F>p~D8bpcTo1_H2FlX}4UP8a6%R7I!1CN!uci9XX at Nn@VXLpC_6mW9r*&emc= z&P}!0l(V%?6<%juNu#B)wV(^CgMdA?bTBRR@ zd;ELFozgHR6&bEYg>!$)3rV at FhD~d==2)C{m3oTjZlU#bbd!zT{USF&v2dEJX-HUV zo+FL6pgLrAFaT}bS~w0a$DzI&rffugRXQw^IKO6K#huCKRy`*iySIdmm=8fb6n~?%d~A7s*Y*g*hzn942P505S!~rJ5?Ajf8>q|PTsByj7Hoax$D)2 zL3WkD;*l9LA#NuU9s-XUb|tyMSaOKRQ)9?Sa$K at NAgGKvigI*@k+k4U*NBug2Qwtr z+g>|63kr1)@^QFnnzc(&Th)C(CbrAUiG%L41PDM(R!qy|iBHADHd3(;E9Bvvh|HT@ zRUEVSUR8!GZK&{qLZwSy=yy+jjV_~Tpr;(0(jIEwjNVk)cdCA&2gfQcb at 64hb|Zu7 z#QMnyXwhG9LZ&5dX69hY+HYvPcECd3nK0kU%XIf&+@JFNqgPL!DeDCS7$Lmc_jK|9p6IA>6YgkS$_GtM>>5QGs z74qbF7`He6r~0Pn- at DXZ-w2ksDlz(ofOzF|RazV5NP9Hi5WTx;&?Sf{1n*l^fvb*7 zKz;n&O)=a+Kg7Nd0~9Tv(ARB0dAc}Anr4 at 3`xNMSe1E&k%bwH$&#bQ=Ns4qt4JLqJ z6cq!fT_5W)Q!LqN(=L)|&^8hF^KLS=f_(mv at 4^bsLVEZbtv- at CTnOLPw=x&-e&a8c zAsf-R_{DfGCfu7=&4<=tkNHWSStfe@^w|OV;rrL>xYxl4w^u&DtlX!Yz~MuNQ>w>_ zGX0_(rEB?HvICLs8 at 5g!L_zZ)d&zjKa478cHC7DlfB$3rT}$$&AT z`&PIuFU7Zd-yapI3I%JlsaEEzj!~<7E1Z!Oo1%@HSADV}eS!oeKf7ztL{T0w-|3rs zvM|&sOoKQ=>ku^yub3*{Av)2zhQY7p>@JY&YSXYe7e=yyYws`IB`pj;Vis+}F~=se z_FKfs3LTTvr}8Xk+)(#5NH2=+r#KP|#n(E-JoMApC_}CfWTZz!(PPRGSZKpBi^88; zcKf_*WcEpb5)W at apExLZ#2*04HAr{0u}2vwSWpkXiL<+?@Tz2jHjm7t%@v>%AUU%g z1~70j-ZdVjxxWeMe%WT;-uVPrC-G#C^;{SX(A%?E`cLD6FqR8`QmaAAD3(}p<^A~i zi_w%+^IQHj?m}c*UKJ_bDsDAa`!|ICpXhQw|0U*LdyXYE@^`|&fq{U~|34>O!pz>x z*~s>P2blh^Ea{V9|0_#uvN)YKjq^j3l~XX$z9VX8S9n|EQmZDZBJA~Bnbe^cP0~9X z=Nl}z=u`-+0io`TDyJY9oQ0xHr at J}29K>0gdcWSgA?u^zTDtxd|+DOHWj>Q;URASsP+o#HA5_!|$!EVmK75#F?bPtm_ z;N2H^%^kJ5iw0guH40VYUJE(*{G<|qqGh at Scf=g;?3R%-VJ!#Ad3T!5Y!N)28l?jt zx+B$k=$$Jj*WR79$_;sVef>TKqJ4)HowV*Tan>zr)DN5*!6HmJrxQRKtU6!YANNYZ z$0le9ggOz}>Q at YhMUjvqqWHrclmD=`$zczh at Gf}6Yb11_c4GXn at dWa_!uCa8Vpsu_ z4u4qe8^czH_hI(xGXA#Z#`5Z8j0 z4#F)afl^r1=z#46ntrKfj_*&1MxC!;v0{ywsgz(lJ20zQ_ddmL2ym4F|DsYE=u90G z;6XqVe*C*d_}@A4e|nDDxT-E?ps=0t3)84Q!h{}=9P_ at ChoEGThO*4w6-}r)&9`yQt#^Qe7$hF z+L$0sVyr(H&UU%vdOQEP at O!k`df#SY0MQKT#n^#rHwc3=^<*RjJ{MHKnyt_ch|r%? z{T^7+0pTE^66AWs*pYZ{fD;%!o+ at JIB_Hs|L2SQP$p|1H*k|Tt`iAB-6HB4TNs1Lf zKVW3E#4vz at bD6eVe$7t~olCvrSPcS(oxIy#kAn)YFn%2aH;rl7^E*BMc*9fw2@*6I1Rne?sH$Uq68Qg;v-6$C~a*)wUv&e zPd#}Cw1o9(&4(H8txmt*tRXQDl2v+cN_lN(i<{QZVzjPcKe-0{g6A=0_7C?_V_ zlGW+j1DlXdQz;itB)HUYRw#;$^%(*HoVzZvbI}!Ote2pOkj7Vh6(dHBu3?gp5m9%3 z(SocXJ2uR?)?e&q$>tPOHB1ORL%(@&1?3Z*aIHH<)SC}H;GxE9S!Qwvu%hVAO1Ls2&G17XLr at Dm z#lspXe1N~gdo)FI{oZ&~FNcAmWSU~7V}=3OM6q&~;%;xSYhX{gyxm4_n) zYesQpKhmL|8 at D}-y1BQH7E?MvyCW|y6ilnDiydc>Z{6)RHKI5yFW$uspw_UpP?yUt zI7{qMcq+4o`3(lp1>t%FA^J`P;e6e at s4mh;J9>qa=AS3Y&%FK2s`PGHikSfai z{bEir at s{!sdx)M&7k|{zG`c&`Vc|x4KSDL|+>1g6q%y~`x|D1%j0m-7_M8}2+j!K| z;-sk{hxLa2Q*K7rb23<4 zl(&4~jG+2A9zl0x3cYdjGP`$&1yzO8C_dCqhw}xz=q*ZOKvN!`0ywA{tEP~c% zH<3^QLk7Ih=pJLo1{tPR0-GIaQ`57-dhI-B#VB$8VZ0o78nknacj!4L+Wz>Pi&KOg z$#Y+NE6cSumga9v>HenC7&h`tKPXh^j`}IB=JqCsxhS((2t?kOF)r{A)S76 zY)|ekk(_1rVbt3;sSs1ChtPlO}907KV z4jH%elnZ9Av#h07R^2gc_Au`u4C*6A9Ciy&T3xf0RZ}#NO&rz_tE*jj=8)oc)x7?8 z5*1TOfK~3z36^^EIWz@#*D|=z;R6l4DF$RCESi?sTJKW#Y}h>h zZbzJpmG(%Nwj%s2Ivwh+K6!gWSQkqMaWAfc at Ha3!r?^Wrhv`pw$5t`G_4^v6m`@ie zoQyol)8 at qYG#5Vz4}KB;@7Z;aNWy0l-^#kd>TTo(wp+m*2}1o4(hyCCsn90}w&{Zl zmp*AX>_kS=x?VxK>K<3)i*^_xR%QkpWMOom8LSz@%{620VD3PxcP}9zky%aXEEt|n z>*IbOE2=5+#4m7T=u7A$uojhD413Q_1xsn>z2$ zQU5#_5HkNfnidsq03iXO^VKSOwZ0HhgO=D}0~E=~nD2KTqC0Q_|3}^jo_dv`W0DI3T+MWJP-4wE%jPQV3h6 z0fFTYF*mVh2mvnB(8?K^UG~k~FqXm`@A_)KZhV&$$t6(E6Sb{8yd!EUf*Hb&OrUKg zlvjhQ3ZGderon2w1I0;dT*nIV8%h&jU~3^nV#)ssRD}C z9 at 2B(bFAKbjH)(9Le_w;pkJI at vro_H@LC|WKcUt`M;p{J-MeOb#i|+gcgy$Hxm#1x z^}=A1m8}dk9Z8Pt&>RoaEUo(24N^^&MwESXsB=`53V4 at NQ;9(_ ztqYJe at 4rAdiyk$YjD?kBPjv+R2>)!c!g))|SQlkt z%Jk=y6?nz>+9v8~1gH{UvNugUhl^lKmGH-C)6K{y9&jvTmsTAQu^~)(+_7&mmt|}i zKdht4?(CJ14jqtLG7dBiCrtaLe8GFy*- zs0b;gdnZuqb)|ocIde3 at CXcshQEy&Jbd24pj%wvR6xP+N>s)iTqqbKhGYeB63nC>mqkq{h zmL8iN^lPG~YEx;dt4M4_i*GVCOGXE_&F-yB_CRt_Q4LM*Cf>T`-WqghvGMQFGA&m1 zLVF0b{-M}WZ|M2$IOMNOH8oOK=+~~B9VT$^E6zC3z)R?%pJHL3R*^SfmT6LVdLEDk)!;b) z4gF;6e=+t>;hlcV)@YKBZQD-Awr$(_#dgvi+qP|69ox2T`}AICecwL&e{t4+p7)}z zYt}nz)R#Gl|d0m2Y_PM`>mJ}{$^KO^fT9h?{o!EPpfunUWZE)&@4t#Fe9i!ul5)3;%g_Od8?22u*xK8- z_)byqLshRM{Qe6Vy at -@>fhDP7AUs32d&3snD^+qZDGz1)q_u8%R3zTMG(x))Tjs#` zZM%JCN^3t!8lj;s^x#)Rd6n2cB`zhTf^kI{DayKelA%l;38B8?EQ~U%{TKfxbwe9uC=HNc-GO&1OLK4K67ipiSK=N4fLA$enRh2aJl z at p8(xPAL<&>>(fSUCs{IzOu7`%XV~JrSQo}!MehowP`-XV z2t}4L_e$=oW?9}F+gs&ldnKKe=}{k*%-iv|kNHykmKm7vx)r=GeMwal8$+khTlxdN z25Y;@JyPqL-8NrDFz)A3{(wY at dB(C%J|0=}4R;X%$8J%nX^tVy(i{%T;;>r%^+fvv zp7}wckNTBbqn~TFxl9OTa+pXqnYVsWxzSA z9o<0kaUBjS4dn)Dqme5N&eGOU7S@~Y&OZdL$g`A-T at WCk7V!VY^@@U_v&Fx~Lls^5 zc>`2msgB7>xfMjzn*h6xTSdj&06OVd5mL<|ViSxFmqQmC*ULGVQ2yTSy(ocI(}n=pP*r^w!Vn{ z{h0Vrh`I$-2GynOa7||GtO;d>Y}OI*^Cs;Te0FVQ at 3DuV1J9A^MQt`Aid(*6w6n$i zdN>q5Fo~=!+53{F at hCNG$yO{HgBDn-2{u~EmzLFr+H}CmgCv(4+=@-nigZn~$^{%- z^mZD-+K9CUut4rW5^3Q;fCzsuSPZy`q_rq&rza0?;M4pnD>G3iSYL$5cx`sbWA~Nk zYL6 at Zvu#%S1tcV}snWf3++pj~FgpSjCZ5UFo6wcRJU5%+qjn7I^~~Qg z;xFI&byPe(#&x8MQd-2Xk2|VxO{nKsK1uc-FtCKu`5{y`I>=7t7)U02VhBae6F&f4 zBo9%0Tq2QiPuU;DS;nh&i1pIum~T+Gs7kJ{sBzN=h>UVfaA5}^qoUN_F>`1egyW4l zkr^gIC9eXlN5ZL)qOz{}@mZyD at H12!`OJJGe}>cl*lZ9%h__3!Wh0OJ`aP5d(4Jwb z^Rm~GOyE6C5PU^7W5l at e zM6xNwvDxLHnFNTb-&hb_N{0-bW zp49d8l!R)nP at tvRK56RbUwQ$IsYNMYFx|8(*y%A*J(em!|UtnDYFpivvq+9%Q==(sPv z7|=o8T11g`-ZXZtH;OlR98^QRMMTC}8bvaG0R2jIXeK*@i8FCC>t0Q>V`6^4Uw)OeJ>c#@QmHxl!z5O2=81eHR;GY#AA zs;t-n_IM{+p7S5X>sM<~)*FLgv zA|W%(Hu#vLI at T1OMma{CNdu@{oB}RrJeI22TPryl~&drvsr#$yKtuS;w!^8#_&CPH+pJb z#(`6t(57)M>^cT7)dWs{0*Kc3|dp*1 at 7W3aQzdZ zR)5+cY3C2DufHe{LTxx0i-j=V9QqZqu*=Xrk~FFM$TH#OKK^JHzZ%#$DcuGIc<+#K zy!>f<;yLEQvhP1aK`s^K2 at wJaNEi(Wi2Q#M3jgLZ>g!H8>R8`Zbb!mpVz{AJ2YNc$ z#icj~Vn7(qYAXjZRB`M0jrw zOM+k>K7qphfFGz>z>cB!I#YMtv9q2Hz?1FtI_381v+a9)a{2wW8w1q5r;c4Mt|uxe zj3NW4Kir6E#$xSXw96sam>;Ss*r4t312<|tp5rqZQwPlyZkdn)lSi;D)KCugo?6cG zq_>Q1Bf_qESNo+o{C&W?Cm7-ekI`Elc3b&2H#|heTmNtAP|$4CzM8K{pJ56XMl{~s zX$UsCsSQsVYMSL=wzHOLnqi!@N;RLwQXF2`c%0d($Yao&yaF+h%5JPUe5A9LCM(Z9 z?#Hn=H0uAw$D;U)(WYwgLvm z&Y~dkBvqzjdaZ+hS~h3YIJ)=4v$F3*}gf!lTh>y%hm+B|DD zeizzBxNNs?7hK{6yWoapz+|>9Rhh{KY=1LP4lY=^fDk_=6y`xlHCE7Qf~$Z6+7a$I z5z047NYV&KR{iJ!;LAuytSro+p-*xH4Fq~>0j8^)N)t05 at oWc0k_9@n3R$GDdgn+& zi;BeI(KOp4(vq}F at s;?vq{t$9Jb at WJp}qkAOYsK4cquemXD#1nv9C~|9ZHPJKx0*l06fkJRDIrP4p177WR!Xn$mb^()P1{r0xcISkT^aZ;>ZkqTdUY#DOGVE1OA`{@xdZ&ZTGh9`# z%2Sc5R~TRAu~a{3k*P9+mJeWzuSUEbY%q?x3h=Zf*)NslKx4PNY95GMJlgL56squt zd#7nOpG+@!%2aJG^&Du%o4%nPCg<=WLXRX1e#rKa_dM6+vovfmr2CeeX9jn%9+K_! z!{K09!B=z88b-JYjV1^;gi)gQE!(0c5wMn8rdM at a57r)TSwh!AImyJEIbWYrjk$1jwXt%a90|};wjn# z;7#vns!3>oyYPe at t9It@i*^?7BkCJ50^yW2ga0(DUDV^i}77) zhs$@%R at B$#M^c$j@$CGH|Dit96~MlfIJ!=!kf1ZlYnnLuz_&cX?b-)zsWd&E`if#4 z&8~(-x09^3&nL&y=|8ZAmScI&cAav}jqRBZSq0GObI3mJRIwJ#)zK2jUig%x0&bc?k=7V} zrC_jtRlq}zbuzT88ezRbmrC!&6m(#<6bq#Rmm>sC{ON+ z at MR+Dm~u3+%@A5LCH%^ZA={c}EQH(>s?Bl6_rq3{{TO{#aD*%nfn*3Rx67|sxGekL zf^S^cDJnQ~Vdm5+529-h49-V~@pyb{ZjpI+!Mu<`dp6vrm9Ex}-Mp`=1Re2QQ@|TI zOqveAvaWRB)mzPSu`a7ZD`L+&*ON`5$sL033bF~aWKbh?u&ly>QF+-&Bl1bLmO}$$ zu@>{X3mQG-rmc5RpOb>a+(MRjg(5h6dFIZ_;!luzZukmw9beAUI2<6;D9v5H(u$Kf zt5RmiFuFvOJEnGoz;uv@{uA%1O67Ah*0Cg#f`r#DzG6CINv18Tp3gYZHtrEC#i2;z z)&&-nOGHN&_*eT_4tWp3Ii&F+9QHtaNJH&P^Y0}Ucdneu*NL?ouv6=ArtqJaG~1$w z9p_XC;~Ow3W!?xqp8Bt+x%ACF;8n-CYj65VKoUOw^at$V=Qsde{&B;}Rd)Nyy!+NC zc~$;3GXI{uDfLxuU+MFnin8KMKY1fo>V}4c%_q|>pRldXCMIY8t0tm61|74LHig4m z`$G(R<<~8mp+^*u#>Smq5vVy2ixLko4V&$ks&8WSuh&wdiyAars=> z9=W*C4m|aSU7+Wy^m^O7x{Nnmsk}9xmgksh;~%?p>zq~yTU$?2GNLvjyY6}-x_rhv zx5TD at _srk%x4uzu-O#h`=yw8tPe$JmJWV~nWcA2z at bw~jhZej at h`Do zs at wm*2S3^&>>jh|ScO0s-AXWG;G9rx5HXT;%%%1yr1o%A{cCUvND|c5IJl@(NAKdt zaaY5JW`v=UK7Um8LI5o_fBa+DjLFlx_cSaJkPk5s5ZQmussGk-G@#sdRMEcd%$S(d zI?0J_(%EbP@!%5Vk_olRY+`ebK|=9H4T)+9*_1 at r+R!ChwcH>+z2Dw&U#k?S at T{oyqlUpc&$5 z=snO27$Yq5kCp3T6GXiWm>o7-I|L&zc>8NFLHC{V9K+jIsArm{|f;_(=K3^CS at To;OeUS&`Z<+aC`S8CsV)X6b?TPUF3WD5Wdk&`e zWgcnxeJ3yN{9ov at 4dCU$Z&7`R`?v3J5I#K8kF$5%%s<_uO?|RUzDJlkdvh>6Ug8ND zARJKjZujK{aRd18$0~e3g2-NJDqh*MJ)*pR9dGeN*MWW?RDIv=yYPQq4*vr6M>6g} z*R~ut$rnqU1Vo{SN z+N_y;{sz{GH$*t9yHO_IbTu&Y8~t1rf|x~l4G<_vnIuwB$9u{e^4Kb{2ph>>K1&p( zl9|)~>)0ZGc(=hu&fj^A_Ds{cZKgKgDR|MnHM~dq~J)-Phcf9y&RwH0b|JwJ??Roz}VREp}}G|j_bv;Ebig##3FFz_UMxNpS~d(r5GP@#%NT`wo*_h4%)vISB&H&5+{N;#iMw5$_jF? zQ*j4sHA(Rp%6(pj3`slY>}b_x!wJKTzly!r6b=iU6(!9?WnELh226(?jp=}1X-0nD zm?;2ao!XC`r@&6*QQ;IWG$hdXTa6MQvT}5{5EqvTaj{t%qPBew9<1FdiAKGKZebs_ zHJ_y>F34-Yz%p@?cB>zJo_!u*_2AA?oVJE-97t_7-Qy9l)G*@mZprH&+I5} z=z61^E0JAmVeD at v-uO7n$XlHN*CJjJT*d at x(jJAiQl<)J}6U&f6TwsK1^kY>ChwV2qt zG#?0fNM+>Z5+PzDGuLcrG~MT}f at fl!j6mSnU2Ll7$`c1?h2L0gI53790W_FC%~X2u zE+lIT*l9$~yDXYd>1f`m3baruxi}#U*wv`UHa=Bn+Jf6)IR$UT-*%F=5YtFn;uv-H zGa7S)#nXE5N;gxG+=w++6GEA^z7gfcO1GmN3t0hLf0C-9>0+Sttyf1J8 at Jth-eK+Kvn7U>)&V-s&~#|APr6v8B~)v1)Ng~uL}@W(y{9L`Eq1qX_9Vdi zA?FjQH)o*yS7~`YbOCDgKWzCac*b?T;OZAwg=n}-Vx+91Dn5qRPW>!BFVdm&Ow&#z z{d<3lg(;#RsWS6%R+>{SmXErLhDp|hJtZE?3*h}6Vi}##bK#e_b08Vjj9r)IXZdQG>A+#f_MrTcaRgqQu0vo3b2 zk)*m<{TTGhUZ at daZngdZWO~pOq=w{dCJznqeH7&(G!Ce9fOkD^jz8FfYhK11PU$n< zL4dyCaPX7x0=o>M9eX)KZ^J84XT~#0&jLH}FQ0x=kOjG11Ac$E;Irqvp9{4JV|0!4 z0m`S^zyv-hH%5`vNtdO=oEAfE9KlL2?-oUKTwpk}B)?v{my*-HXzlPll}q1n%U$3X zx$^59&q_F{(ND&?oabQY69a8UcS(iAZ{J4)bp*>@apAB zHlWB0M~d32{9$bwsV<+OM^Ocd@;g`600W4_V2IH!{P^L?7EBI!g&;u-X9>G8t(=DD zMTcFYGdS-2hxPmyA!l37cFUNysXI>d*W8kzW@!Pxu}B7;Sjkfo5VA_ekI@| z1*)IX&}S-=`B#Xy)ayas(_6fDyq8%@cAU_s at 1!5@&|vQA7Y|s8yPC8^PLR7E`5s}Q zzpxlPg=UXcp at ea$)Pq$+4FXX$BMXp%1V5T*4}ZSkhZ7}X4z41{XTj at mhe>Y)pIfvG zM1-8)NO15pkGVI^11Gpea~jx|Y{92D(9 at gg>ol@Cd5xC!r*!e`u# z5ihA%ij-*tVb4+ at LThf|wh1-s6eR-qh)KNQPHz>@JPIq7AAI0_a)f)P^7O?Yl0OIv z7Gul at 73=IP-9EC!(i}EE=y%+=XgQW-`s=u8q8a}%%5kKBi{tY9$kz{N9GQWa?jLC0K}Aw$Ea z9)g6;`LdfY8 zz8^9EpyO?;@;g;?PTen7ZZ1~ko9)9p-iR~kkZ{&l>d*H!nO5Y?L^ow%*YX^z zB!%G=TD)eE-dpoxuP>D9NPai1p`3G*j|vCbW-fo~oyIc}o(yF?q=W5C>&VqN%zf(W zYH6t_V^j6eObgY1qNEVnTo)9Ko$I`B|FVLkgfQXG-?{EcgL`C5F)37i-FwvK6(&@0 zs|`}$gu0JSFYUT26crKhI>!pS$DmE;VV(%KwP4mQF!diZf{7*P at 9EOp-sNw5RBv|^ zQ4&iY+l6P=47T;N)=kE)gd%A at bO>H#lc>kbx^bKWcF3~O*u5=n)>MF!yJN at YB4$R!L=* zAh_lmI?T79J+hzoGaFvtx3|B6ZlJLlNgY(hK$i1c>34mwh`b4daTL8NcS*1mHxhG4 zDD!CXZAVIf!^FfCl#11nqWEJE(m8bX5l&8GU^w2tYPM$`r8}^f0AO!9b&t*TlxZWh zVNZotOHC_+6&Kx;ZLNakFl6^lxijom3ap|NV4)&1%Jb1n6a1Yl~*_|X; zojm2|v$}(B5%ljQmRCFhf)zZiQx6)u$@P^ctfDn$_hMDmseh6a2g5B@)h~i2qdPiMWliN0iYm3h zY&Bt|!>4L#y7+chT!KgHLxT;y*rzV5%K6J`sJ0gae5c~duUo(@FS7&5u9?pPC+CELi$jK%?8 at Jot&B^gfn=bb_JIjnk>JU1n+crQa zjH27#bXeG`(Jo3UQct(ZNs|e2B^%mciHD#`m2#?pm6b{uAu|ovaVe2hJeKYzF(z7I znEZ;Rnn{GbiialSU_BVk at wCTA)*{I(ZlNklv$oLXyFUZMeo7|K>TKR~n3R}TGQgQ$ zzW|LvnU1Mf*w6 at -RB#QX+&Z0JY{(SZ4iBQ)Xga3FgsnxUid>u6eHSlL_PcDBD2?xK z8UrDJX8)%`%$^)Bx!8WKz_ClYegX5vWm+l6l>eQth4JczLncEr+T!Li*YR?=>^*n; zg}*aBRpVor&Gm?9EU)YIgIEenQcv+&#MN_%4)U!B0!6#%iutOce>Wt`gCg5+q*(=L zcK at suQ33$T)P=2eUYu5d+0*QV)x*FESE^wJru)T8p+({;Gz(%MlU{yDt5wh^Jh?qk zfypj$V5Zxha$q%Ce?{oWX#p&k-4z(33Bqo!u~XoJ#Y0>Y)fUt$UCQD{=>DGFJwJ3TlGbUPC3kd;H+T>f3pqu?c7`0oJ+3V zK&}Vy*KXJw*2givoQ*yTx0|ei!jzmAfY^dKw)~jN1}#34$)DYm4fw)RBw4^e!^e~Ul(Ig zrU>Tf-$eSo3L(Gq(1EXK at NCAje?NB;h72(yAi;e`-Uz%Ce=;JP#~x)W`x8!bqI##p zJn+Xv=&i=gsjdY60 at eo5yvq9>qPgCpaK^t>AA5}@V2($A2MwTDdn|z4QxN_px$80 ztP76hpY2R0F1V;ze~}&!{(pn?f<|_(rvHufYF2jZDu0o_x;n##%y}~_sA at evv8uyf zw?i=9bq0y6S+6;IJ at X*e)A3@&wfPp|1#T5_EP|QSII0BJ8)j5859c6SW1_|3dii z{3Z|NEdpUntwq&$VqqSA4MT~^^Exxt^}cz^>wW z59H- at I^ji|;I3Dp!)8bEv<1{IMoqSKxlhv90wHdSyoA^CHV59lL2vVvFwIJ=K zx%7PIi*Y-6jn>iFPLfVTOq>DEC96mCs_4Ua;u8ehDN1;-(@@!;WEDmmhewgKOXsi@ zBUyb|j)9=hi8Y-Ymak*09pzn1qA32bRi%k;z$AfYsugCA8PnLZqKhT at u!YFTuVt>M zF*fsADw~4ll(yT*!EH7$@(2 at w5(}T-oDz!G+5-%03KWBznH`MyRZhg}6?s}`W!<9d zDvv`l+KXo!naFV14dq>n>ojvea4PF{{~~31Aq+S14*_!cgq%mK4JMYj z?AdH2k0Q?ug-{c>?qBMZ!&h18!k#E_nq`X?>CriyvdDuYl4$MHg{SF9oA7t}vusu$ z at zlX3B90}X%HWz8Q#(MVQ9$j4vCij zf$f}MiV^{A{GudLO|UAsh8(C^zhR|P4LQ2IC`C8qY4S|kqSku0C5bPuv1XQ7EYQwO zXNM`+10pdYUN4&|ikiwcoIGJmPS;H+eDDWq^-WT at o{V9=PMi#D8aiU8jEP4YokCsp ziuEIxRN`z1pGM+5{IZ#y_N9o94L}(7ASGKN9gbyu!(S}f1gW>*DXESR zB!L8<5Tm)6_8)kH_wnbrNr^O!Zy_EcArQM=5QjFDw}Ua|2<4B#2y`z{PbWola*w4s zPQA|7)3hdw*$IO#y_>_bdZ`F at D=}y!-P`^0YQGSGeMXma3Nu^3Hc4Uje9%EZKV}6- z+LZYGWpb*_c`K$kv1mXqctX at Ih96&4J-d(YH*;C>>)A)1oPJkX)f_ZP`dBLwte?C0 zM at +F?4(K$a){X9-d?1e)#$NIiXWjz{POISOL|onR($06wKhOXl&0uR_IuH4^wPCt_ zlplORk}p$l-q#CD8PQpI(QaL1vT~Ki!~KYT1i=1<^05~r62XwEnCAF>s?%Y+VS7G> z`})Ljkk2DI!0CoLW|*cEPcxxeoH<9xpFNk(TSO&GX(S0R&=-c3zkY$0bMNlOB#sPt z$Upm=?!HIaAVDCpELoEjZ1wSx&haIMS>KB`b9< zO+y_EG}u`C4Nr8o#T;tKVzm!VjhQmU&N3#Ro)XH*)3Jl?@Sl?!tc%kI!VPEPZx;L;yN_M0R!WK3y{}bLfsH8F#DDd{Pvn)Io3o zbCIK at A}Gbl^Zi$JWQkkA4Q)V2o0eoYMqV^AMUYl^G3ApA#$uo`VCcd?bUtFk5$31K zaoNpTc%_oIE`1f3x=qb9#N83kE&^NlNIFyLybA?;%|J}*y7pxQx;ow!&VehTs*+ at r zH2yRTnKFrrJQzl}d^+rUML$z^kKCJAkj%-EgP at Sr6z0^E>2#*%_SM&9k!H~3dSNpVn;GT3uu56 at zl4}orzzBAt0};@?17ikn!UE;d zGKax}yWo(}Is>QKSSr#FP^?7n%O{yrX!U+Z<&)Er9sPNaT%lOnse0a*)B_; zcE2U-kP9;94l<-USk;?^<&Q1wo^VabqPbY0 at CbG$O-9MX&i}G<|Cqbc5S|x_mHTfBYF6oX|T^4-dmYDLlQkzpdMDm>xjMzVJNVad(zio>v zdhJweZGf$DJS`2 at K{OniK{E1gIl83MV7#Ku@>snICZ8>1ecj?vuQ$ZG+AW9Yzb8D` z3bky0Su3qKaGZu5h_ at 3Idpz*v>qdk=dY|&@PPh8 at cC`%a^JjIt$%xn at -Dx}{g!1+# zcdXnYj>$YDH*a}`CZ~}#`Vy=xK;0sLB~-pd>^-rI9umOr)ma&*D=@oSn|6?+M^QE{((Y~+Ds9QC9*WVh?*7Zh2*ECykf1Lv?r0vu at _w1PDJ9j z7mCw*7>t|m!0}t_iSo#cboq~qTHhc@>k4+O1`tMtpYa~t4ut*4^-5_-b5*d-N_Ba4 zRQ2gvX$TTQE<}H5jf3~9pYt+_Gp(T)o!_UE7-S2Kq@*Zbzdwg8AJ?H%T^@-Oj>CLbUeH5S(I}wpJCLNQ z%OoVwW{;iFgqiBRaEaE7oeOXU!W?2xT*=jh<_ at G=sIhb?^~Y zY|8V5SGpTv%^A8@)D=3d#}LPfq>gP8JWI$M%X at p&snIDv{>!;(qBrT3ltEg~Rp>Jl z@}_7h0xa9Z5xr=jSnaUNn|ah!?lo;!4y>5wMcUJ;&nMKBis+`%<~g6)Rue=EY2P|Itn0CV)(w_6YK1?Vc-w at + z4|?TNKpTdHrVt0 at 7FtOxH*g2yNZ=l*Ejt>VP?#5l63SLz!*1KF!$`AC_R6ngCY0I7 z4vLffM^px8V>sTB)cKYC=9~j?q0hwB76(QvmBSt>!g4J)qng?!rL~;>6%}KIU9Lrs zHKd!{wV(Xb4Ybqp3Z$c&M3Hdo>)aMksuL}Pw94m;66&~QTkT-jRL?^yny}!P&o%$t zuAs`zoY&0%1=?uc71?|Iw`GxUEkLod?DqTVIoqTx%lK_}ib2iH1IQ%*{I?lyt|BrM zdLO(iD#YopmVyZ3(3NT74%XPq{c{sVd2|xZjiJlDIt(BB^1b}#;a`3+zd!j2PrN|% z at 8$8Gf&3F at p;ufHn(;nWYcKIDW0MR~Sh91ESsM(ui_I(dLU~km(^2_?={^cBie}6$re1RHW$1G9XfN6Ma{k<2MO6ZxHXUzs< z&Cs6^$ZcROw}-n$sJ_A(|rO z=;))BY)pmr_F_0Xv5f^$d;kW1k+{NG6Q?${LFX|Vmws-=+QBY1Smw|Kmun*Q%0)Y0 z1gDoTgt*03E`viGZt?g*ajVH6x__!T+%rp~{lGv#MiRjoJQ z%GmTMNLwZ7>DC2W=~pHg*8uzxu8=&*E2_Z9*Q`G>-0Uasw`K9B8Mk&Ena-b(DX3#K zCZo;7mX)K5OPZBdKK(fPOf#^TgU7_4W+rQ*)&IG$H^msR&dP~LU#t}2%ZeAa7aD^q znyi%I;4%RNcvYQ2y2f0ZQ}&%g8GPh8%`i-oeJWD$sG*d(jqD>xFCQ7`ZiI at mRlQm} zSIIA7HZ at a z=WxUKV5n>=$FjC`yJ)pj_^pSxUGlDY at Gflh<_knRVqX~G*YyEZ%fR0+G%JH{-^`iv zPZd6X=kR>JKD;F^`7lmzNbsi{!_eq6`J0WS+^xdUk8M-(wDG#d8WG;19VTvHx!B1g zT&?2Jzat<_*iW9RmK$iTKfwQI6r{-=8dLwJ7YTpq1<8Mkg8y?_^S8P*MfGKqY><>8 zLKmbA0zsEhmI}|Oq*`PFqYXs&LMivpaJFf&b?v_ at 2J76}-2TlEG at Rz!i^YJK#mMY&eVlomd7tgH_4&TN{RLzXzdaP&3!x}di)q|IicJ at 6>P;ye zlLsmsOocwqbTv2wM-v=SYs$gsoR2JwiH1ePq-MI2aw`BrIxq|;+~nA9v|dg}luVaO zbC#K}t|BL$U9Sg$TQAcv6yol;8({eQ(FcBRi8CxxRGLaU1Ng2Ekef9e}0TF)* zb`mSjp0cee_KOoLFSAVm%IiKoPfkS&Y%v|l3%UKyEbb3#_`!xYET=Sf)72!#q>|?> z3x*5pq~R#b%4xfn^ITha0+OXouCGG1!-iA#N#1&g>g0_=I)ktS*W!SrIU`en|LJ3V?*j+4_8tHW$TC)#ei;fJUKU53Sp3lmS z)cbp*c%TZZP`6CFZHRBZ-(`3LT6fo)EXu+QJb!QOn5$r*^|P=H1qYsYfV3po^}}3A zLX|zWNl9EQu|hR;G>dsHlV~~HR8OVCzNs+g5^L)4s6E{0X{@Ka4IN z(#k{DZ00p!EXwP&Jq2%Pvi~LVrvM#4b!wi3XvW*$K^NTd88T5gte-rB44;wNB|R+IR-q$RA_ z#waqFzfDtObxtb1psJJ&rg_w#ff~e|Jj1m+z_b2jm`$I9N5<%CJ(8 zkQCfUWN%C+Se!{m2rmb89)V)v3J64b2`7#{K?kG!S{j^Jz?WW4%mMA(g=sPjtRK&7 z)=hrTEAsL2ZGFdA__BU)#n+crroMH$`Ok~&j)O-M_s#8J0r%GXnU|D~xKKqUt at OFz zO7cFY{W?FW&ZNM-$$nt=AHw~YF}Q`MKcyOt*_NG2aS;R+0=|Ug?H at gZ4M7ACVpW!d zh`I9%4==?Nzo5XJ?h)h9kB=H*y?e#1Tr0sfuXh zhaLu_Cwva!Fm7`f){$cRUEuu%ZG$m%czK3wwbREpM&{Ju(> zech{#JUzFzcRmLFSum$;qYih^@HOx at Xc^<+0*-#66(NhQ^YxMx>Iqi&Mo-HbezF~L zk^JY%*?sCEtLA9)?DlPU7vq!c{1!>Z9yHO;v^~I&LGFbTDTg$RLE8s6=PfgiD?sxb zKb%@jyTh`@V=0aeYekRvl3TM89(v_7TV1lJTR&Iap={?lr}LaN;cTKk*=OrgV0#Tw zVSe|Id}rNBU{)g4h7cY`Xs3je2#p)}vWw^YocxOCuwDs~R(zssTj%;;*`I<>AuDbT z{E=7R{}`>N8j?4B{7X1Q{^Mx12*AnM(bU;g#LmVLVEf;rvM7S6yz{o}Mfrq;`7glX zqv#+w`ha;*ZI*O!6zTMrA?LJ2q7LRs*XE_1LzFP`x2qVYEr5DaQrq|WzDzo{O zulM)uE6wj?cQq0Cbub<(V&n695Le7Qw6el7CX+6uh`zE at r@q>SSgA}>MeTu-PCVp> zxfx&tZJy+2dC6g&5&V8zl9{;e*>)7 at 9D_o%q at SpMx99a31Aju>qgz!>gC89VVm9^7 zzBcHS=C#_S)S{7p^xN;S(tG5*6RG3%6c^CPR2jFiWSMDLj79H}hXGWVNg9x|Ks)MA zq_bwCH=I_Pb->t`V4tz9x{1830J=~eaVm89)nN~GgX7da(e=uiLQwi`}bV6p23rDVN6WOHLChgq?~wEMR4p&G;4QXiMRLsAm57+ z%o7F&l=oBo4-A33hoT3H1}oU$a*?o~D4R0=5&H at vLTUSggzaimJCpA>SjiME*Vg at c zZtM6SLXD&r$qRUjrYcSy>IONGCUrkiH60N|+v%f0TLmFoIfphtaNp2tWhQL)m^AWy zUGnw&v$j9E@;X)sO;T!O6SzW1XN1ht30 zY4cx+Iq#Wm2VAFt==k;1WbYSEOMLH{%->(n%iBQoyCI-_{aPTywfMt|-r2oBtOssH z{lWE_?qk!$CB1`cR(~Pm*fJ>_6;DJ?OzeYFuNd(LrBO`qLnP5l< ztCeDki6+4;EW&1Ct0qaS8OoI<%dEy9x7sNRc#D>u#G7W+{}wt4N~mZUq|(}CFFOfm zB_qs%M at ZL1LCj(u3v_o^oINDdUQe7<1t=G#kwl0|DlL;L8ydSYS=vyk0;j=aHU!&J zp{>_e(A0}gM6(Zh)Ljl@!{H3fyK{E3m_yBDtj8BIfg%0O((@+1lmJtmqXEsektQcm zx)77uV7e-;CqG9=Sz^ol4e1Bd8edHAY%RYp12h^{twHT6*;FwGZ>qV1`1Ai^?VX}? zYn*i7=#6b>#kOtRPF8H2E6GaU*tTsuE4FRhcCz- at XLt7*{lDlvcAs-Q at 8%d!J at u=q zS+l0gf at 61A)Rwjn({+)4H2?LbAj$+DTet?@`6gHKLyxb6lDPyZ>y?qSS>d=9Uhp;7 zCT*vYQ`5{i%va9=>~t~W9Otj$6KWD!Q8Bg>rf5Rc;5!U8cnQKJ2)3yF(Rr$TCOg!( zZRUYW_tT}k^xZRAqrBa%saRSUgTBLcPb{6kBJ#8Pl~{Mkawr>iSTyKV=V-xVRIIHr zt|t>lY`>hewtYp2c~(w>O4cxWacO~8V`ioB-Z`=Lnt9}?A14U`&F(*-e*2`S)5 at pj z|ZeWQ|)9yT3*4l!`M%jU-ygg2rz4++Wg%inZYLuzxf3 z_qK$2+(m~Scv3>Dieb14653H33?es>)G(WvPy#JTat=bm9PYBil=U#3veRLX9e=0m zrbX=eps=QyEnuZ-28Oi%*fk!dl at qGTOoHRWy6mw{F+0H at c@51K6=Cb{3r4(lGLx8 at _jqG|f5eJ2CKtbg!F}2# zQ^z^=h!K424%Pm!O;is3c(^oW at i-iLog&K>KEv|SJ- zc9(LnK#&yID_qQ-ETd45%w{m=hs-l909z7FGkji*U at S_J*}kgZ-HknC3?=moZ&)h-*#3&13S9(Q@;k)zXr8UR2$v% zrY4tmF8j{0=0Fr{#JQ6DX!mf8ZON8DL$#Eei2kUsSdVR4H?JM~#_w>Y{M6eEz6L;R z*Y5dT=t_cJTD)sWV3FY{;O>;Nl}bA8E^AA4kB=OeGwg?f!R`$X2zn`8Uc)l;m8qH>s|-_G{K*M{=vzqSk>$ zr7nU9k@#&$Ifh(%c|CevlJ`fZ59+m#Xg3yh#&%xhgWAc+;=0 at AB**1?`|IIl#Q{X| zc2*pvb%N^W))3 at 1*Q%@IOrIa9$Il=k1Qk0H&_Aq9`GPFw=v2ApmL$KtuUiKkv&Q}N zbV{)dpp!bi(Z^izX#=a@>~A=pwSICd*QW?84#Ak*tk*&e2KK5Ki)z3`Y8CdWNYjjR~_CekyCJ) zCtFu_xq)$*Hy44BrV|*+i=GOWxOa?;7DC at o`acmwA;H?&VR}J^WF5 zE1r4y;fy&yEI5`eHM3F`C+RYFVmb=1nI}EPy4gHtEAD45u62T>*2Efy-#M^6%iu!e z;#dz9_k2uc`O}Xz**@wQvg~usvCrWz!j`cU{~^N|E2~Gl8CY7?J!L(kRNTrlHf*Lh zb-bNjpkHXGOo8%({ww;zZ8OhduBB}wOXUF1SupNz!jV>02whL2k=%Jw2{!lUn0R%IZ(97brt)N%dPXYnUf&{6cn{TRv^edHiw&3B=>nv8E>6h%c z>GZ1`LBUuMIb-GDz;FoEv_+;6C}z2lJ0(%{SYyvBVqiLU&LGpotOjz;VaX>|ODe&N z at vKV={btn|zoI9+&K$G6@?)_HEB0G~2 at d%Pb$b7g1!r4QUx!1w%KZm=RZ|-n7x?fX zy0y*PwjiU9`pdWG;&wogWqNAMBNlc_!p%LeZz>)|tL*UjGUCt_yOy$bHgSeqOL^9F zSJTi%L^Js&JI2s#x<|yO-U%7>+n)L2FGlImNwcsVFR!yVH5XP7{hpaw^-^Qt_5$C> zkx5PXL?V9W!~I|JauI5?eesd!_NKEg{;`L;a`|)M%vQo}vX+}dNqdlkCO=S at IM}s6 zAWOgI6_9IO6;Lw-XA2C31A}or6ID)9FIG$KIgv4}if9;%EYk8|QLl~Be2{HCdBI|s zHB(Qbq42P|&sx-?<-%yCN+~{9eo2>zqQ&Luw;p;fCU<_Wc`Wj_*@&4Ls2DkCdiVu8 z{J<}Gp=EYYm5A-e*p(bn8h*`Icnlp$^ElKJQ<=6f7tw-!?6x^bKmV>Jv|rj)2gSZu zrtiSd?D<|pn^g+Wnwry||M2EYubMh-f$dNQ3h(zc%$usZz`8semz!>h%V3onM4ctW z at rlp};itpCgz2l|m)D%#1H-vy_ECxTAv_#8`S$TdRJ_)S3-Ge1pe*0q zApPzjIy6LA9FaszXPc4z()^Xzl~rQmsFp;#e#l`I6Opv!BRU7Xrn1Vd1(ZjWgvx!D zx%e&5-tv&?yv;XhW!Qn*YFzR9u}qo0|7bt$Fn*9 z`{h|P3pZOM=l_hd|HrtQ|HG^G9Tu3-`L8MIL1m0W>Ji4NX5D9-M8lveq%CPwiV(@3 ziOD>B<>im5os{+q?)t(1K$9VdLHUCS!a8NQgyjdK6Yl$5X1UBX`+a?l{A1VNrzvqG z);It?+QJwhP7Rh*VOSUgR-P>2^AIdA3?a3A0C=^t|m1^4Pn4^RV2V>5v5p9f!+F>bzoRZpC~rfls)7SpU{%tH`9~0E<2#137*V(kY at OV_^;Y~ zQC6+3hXDaO#sUFh`@h!SzbjAk;urc7j=y8yzdffMeVkDSK8uQwK)ptk)}=38f at _!Uz!M;-i z>_*;mXJaqQt8$1G3Gn^8~hYS1l4Si|Y=@(cr4>Mukje zNEU02RXezIjgpT+)H?pWa&sp|`+0#QU%`r9jz&)@##IXL zv|$*4JgLU^@)V!P0%0ZiAbE6)0X9}&>JpmA)Lwa)-EkDD`5YO0&;|DZ2Q2S{*Tk~j z0_tg5~*0Dnu at 5-v%Tzm52OX}U%6>(;Y*qb`HtGho0HD3_zYqOWJ66e}@ zi~E#2`BTDIhFBj8houSOMx^y)w0IC>rd)zt!G_f8$SSd}v;WCIhtsvnJ&WFl;|{Y^g`cW`x)3qCL3Com((#5<^7=0E-tC%v-aD$1W} zcT`%NMrXxS8uwnR)NQJ}jdL`Xvs6Z>6xJmoxN5{VSmkKFFmRNi^%qvdj$YYi%toTw zr&u>sgLeKr9vP$8xF)k_q=bqXfaS54aFf85++Kjq?j48iszBoANOG} zaxGt3z1j4J*b#WN(JcU%iup=EYz3lRlsFKE&S(N at xf6L*u zIcdF~c3E|yyz6+p2({9rKdm!hQwfEIG{h+^Ir)^8q=<^Ad}*Uz?i3VBh`}zI$gUUF zm`lHe#}z-Raq)tpGcXtf+`OK{**p|HgxFYX+xZ_%^^*Daa#2eQ-l!$Nt)v=*`gwFV zTlRVC4RMN#+i%-o9Gg>}R`~+dO7AvKa0*P{4~yc7FoL(>h;7SW%wIbmx(6n6!VlRY1l%1H zrZbQynzPzt1c{9;_ue^b3}?23I|=dXP#krPC7pEof9y5|i-N1z+H9{vy7E4le4-pW z>}Wt04I32!Te7G325&5h<)IF&QU4L+3vDt=#Q at srX92addkgzMlp zCr`E&)T%!IeSj(kKf`AC>D}%-Uz?C9`*I3Pl at NkP@6Lxg(FO7IxE547HP$Q*{2Ni5 z7mBqbZXYh%#)O>fV%q8LnSGyzNUB_zb#?e59WM9-=u0xp<~iJEgx#xoNN;sc_|>PT zco;zpzq!|pfuNC at vDh>5Mgsp-$nMlbne)_M|MMn797s0<2Nb@)M*veT#RTN+D>sN;_WQt#H-zdq7mK@&0Qwm z#q-Fs<0OVPqwYtWZtC4Z6J_H at Ap_J^SzQ8>85O_eNOXfq(L*=O!&T3lyUdC at v7*n= z8Q-XYKpZ-TUPRLih% zVaiM+iX;@{ize=CCcP=IsU*`ssh0BsE3VN4B^SJxpt-l)%OY)|!JKbuzY7^|JdO)} zZQhqt*^_d~j_5Q;ty7NS1kA?f$jA8wj&g9v`JbpC_8j(GPTNaAKF6bvt&wFaG5_jpEV4V*5)FY#RG zBb9I;3kr{1=={its|r@?t9VXx>0RnDcg*2p)VQ@|Ly8M8ecF;{lTN~^bPN?JwneG9 z5C4SPbKg%j;{iRN!ZKLud5h1b=n>N83A>H^*Ana}j(;S)wMBh)f5vx}( z#Y<{>gjg4~B5eKb%_Da5dBWx$wq7FyA}|CCIH{M=X>FusYvoeY;qbdKH1n7OJ;vSz zSU-}eeI|VPq;KECf}g3s58_;Zvsd_}`1ogQ at 8WkK@<}*>n%G+0VbXO?C1c$|GThzh zOAZZ8>b)ql-jyM1+8I%-O8xbTZz0T=4DsxD;v4Tx$$W39eKrHOzv}XG^8s&Em$($T ziLbX8_fZ(u55C9kDNoJ5kxw+=im!K?7`^Iq;h&eqzQ;%P=U_OK%!@_-qPE9jYak7k7 zs@*Zzy~NL^g-si~`Qh0wa=dfk^5eOTMhmd~;$G(KF?aIt+pYEV70*c1Xe89DxTMEw z+xP6n-`v7*JOCRR;x^x39~z(3WGwmUgcxXF`#A^>ftIJLMp9kI-zU!kue|?_VL0%37X#`M0gGPAor1|E;DeubN`7lOG z?{MB;t0HEG=3-_>?f|~ZL#g|xg9lE0(H8sIgQ>i2kF-vFktbrl>@l at _7f!z5JLq at x z7&CCst!A&h1%LHXcF^vE!)_v91H*_SUgN`vB45M9u*5#q24}=R^#&QmK2-*5)joBE zD?Pd`sZP^7iWo1fWLvQo&{7O&%+OsY(;{20ll7-xIA(IW1k-Vf=W`PFGCJ68+Q=8` z8BG;wln9k)+4ok-6Bv&>O;?aFm`8a{U5#x^KbmtT0X3OLX$)`F1*S6F7%tM{RdX~9cT zX0nYHUc&>3BdBikk5pSH at h`x#anaz0AS?FmF4Mn=r&YEsVHuUNcw8d3O6{n?u zVH;D*Z9Gb}i=t?A(k``{I){F6MDVEd)OKv1vcjcWiuUp6mz)*-&Sy2N)p|DPGxz9Q ziB10W06=jrs3GTerLac$YnQ)92YnUr8}pD}G?!0G_Vn*vn#`g!xAFpZ9QNvP0 zV*Dw-iFUtmJ&UwK&oZMfdPjgoXI(SZ=&P}Lk-n+;FL#kurZ_qsxVf7;!lbvSO6kO>{H=tvshSFDom| z7>=Vk-l4u8uq$rwuNBeLj<|B`x+MBt$HNVSA*Am at D?2Ss&m zXwwy0ZjlK5DjB##QW_N$SiMvZd?Bvf7e}}WsoD3y^^a``iuca`&cZjd=N_p#Wo+Q^ zs=#g#{Yu`>`-lAu`sERR4d$X>+HcY$FdkrF(BkS<&2Q-F`O%QljJ3}!|&a+Dm~A#e{uQ-Fv1xu8$Ux*7T-C-ZT*Uqo?w zt*UgDLsxPi at Z2<`AwU6d#qx6d2_8#|(r=j^yS)p?fWE_7R^s|Tty3#SC!ygFwzBt(JUME6D^2I`Yv`5W8-U{JH9*{KFA?09qxXcA;7L6zS z&LWzRbvCN5Nto^pm$mwcY%`dL74BAPG0;fzZn_uIb(c1+mR2d)O5%eTA7d|PHvC5` zgY)qRd&j3sU5W`>rapDWN;oGE{RanMIrjN%yo;NKA(rsS)212Z&dve9c*nJYBsV+jSKOaa8Be_Dd~k;mUamI< z1^I#yG@%hYs)us*OYd+ZdQU8~$z1GSCmDLBdppo{V7!q4_ywi!sYmE6BeG=2mDD+= z4!Rt|mI!U(P75#%`=GR<&Y`(B at 3(ttsH#oa48qFgi^w;amJtYHL6j(Q&Mwz at fen?M{GS`NnA$kxobp zutxn-0iiqSI#b=d)9+T3SjOc~>1MUu*y7w1cP at +{DuX;9K4dnILr at T={nh5a> zg0L0p-$)Gpg}Fn&-Txd@`go6XTE zR7T<mBNWjlD at 7>2;Nb6e zCbXr+**^8Ix1kbrLA??2YG>s;V&BzV%{vr6T<5udlw7#zTV#Z2xe(^a;xrb&ISw#I zV|BdxSqTJg4e{d;Qn8f5ly;8glkekqK0VD`J7UKYBeH-4VIokE9~mcj19#)dpdPo! z9DAN`VFA2N`W9Z%;Q^gKosOv_FV{I&*95g1%G?Wo9<@HXE;t?hmBo-8vMrs! z3p5MjV=wX7q9uAfPDUT*jC?Mp2Q(ri2v at mTYEMyMoLqI&CouZ7o1-efA9R{83{Gx_ z#eF~jWya&Is^LQn4gymDPtxZ5Zxgn#v5Tv-k%_Ckk)w!_i<#+vByTe2|Lhv7>#HsZ zq4Vpm1A&Vg!b(ag)axlS)W%;_1p(smm}=PDqFOd-Y=OQ^x0~UvdgVE%oAFLq zFQ)e$JAtSaWPEYAal&gV(Q5izRGBs1qTyg%AV6dB#`CufvnBYPQll-Fa#r}7_P28Nk!JO&;#;ewJsb5I zN4L<<@}S=IS^2GOQ!S}hNGGyCldz(m!#W4>;Su)tfZCq%D>JvH9~12n#pS~h)))J{ zOh9n~cn at 8YJ&XA*_|C?9q%GXzu-+t_O?tepY5CNA+H5N_n=*6yKW!ZfActtW^EM^t z-W>E8(iSNbrZ%N*I1^~fc4w3L+}#atB_s0D3ZA>z0{+OLVoefkg{!XuV?x9uM~yQ( z((C|vSfFg6zPsACrN!qf!id`B=GP z5~t7gYCVKvxrZqsxqW#^;KkX%ldEYs!uQCYjFz#~-IqC#q!xD#NY(! ze9r*y1VQcf)2lu}hZp0#B_Z)n!YJY|kcne~A4y-qEgn54jLpi<5X*Ct)%&q%ZNU?Z zhE@%aqI$<_=nzx^7H6`PV{0$aSHzRI&y17rL}~ZLa@@UL6bZdQ)>N=zrEVaLA`vd3 z2ROw9MKVq|hJLKA`ZWELp!-0%C*%<^ZprwFdCt0dI1Z3xWCrDk50)3?gBoy*4-Iv) z{n)HY*kLkmi@|Fmsm7|4OCXPiuYa3r#lA&=iVBT?_{hY*tJV+pO_9(Rv-~3?B{8Jf zaz`ahG(y&}=RUa`lJ>8ydbxvS*1LZ~PaOsXgy(-4djB4H8g~D7O4^^nYpu>!1{S@! z1(n%^6EqXJ+=4Bp3V{HjgI7dvojrA|(BRrQakQ~Z1 zdnP#mRTqZ!lHcc=d&cY9t3C72-?syt0I(jMVeI3h18|H3s+gZ(aQAolL9s>eCIE5_ z7(Lma(nFM5gu?i=umbAwgBCP3d2~~n>J9p;O3HOLKYtSwZ)SEKT{{6+8%Vo8;C0rV z+FDKVdS?89s>uWb!CW zQ!ZwWH#X7V$Xl<%_DP7NuW;N;%+p at zN{RXDaoqPoOtl?nkZUAcoaUN7CjmfN#z2N8 z-#wg?A2ciQxhpFhEp@&OMSp{iw2b48LYA$pHud<@A=gvj)<{)9lbzM)4{S$?wPK?w)`%Ik!NJZimhJpK6U$$=NdP}=JT-t zoY>}1m$E{gP0x6wb1d!y8Z`I=sx6V1z&5OB(z(1z1!S=}*9}M9w~J2&)_#n|p%K5B|DB;-V&sB_p(3ohm$tw0CVLr;WPvtmp=COZil=IiXLCM7;y-_=& zK4Hb$;c<5b6GWBG at PL0uGBG@R6;^j-uD2C>jTOOPf zd*?XQ*ZKYrd7>PrjynqEd`8?So-v0ww%~>GBz*J$jSSrRq0?UxeAwF*R?)UaGnV$p z#9H>x#6ag*l(%R#6uAXf1z at j!m#89roMe1oXHyPu(HwEDUdAA at XNX37>9POFtg0A} zKX;H7VXvAG(-H#(0%&|v8kllI04u>H_JGSEZ9 at A!C8~!rYb^7p4d;0H?oau5G2Nt` z>>ul+Z5k+vH#-ArH>n-PS(nG35=6)HD zI=Mf1#5vaSUL4c=0_!3$GQ=VVXwe-e+xITO0JTmlcFLYmA{}FblIZkSS at ysgdC})n z at bJ#~UyY;{A?n@{0tBSvA0tuzpBc%&K9F`bb2f5yaQ at GwcU4_=bp6m^Jt=!wfJ~-< zt=b?NRiI8arkGU`JGl at XJ*Mx|@i8(3!pr`YeCZc~e*^2+CDcV!HZz~j$VgeC>X&@X z1sN!+$VC`M;=`&%Zuhc)&yCCdVXfp2IQFm(Z_Hly4-!w#Feg1|;*b}Sv|jOMM``w( zP)B^LCB0>)a8E0|nnieCDFmAmCNB%H-Gv+9-<~wk+4VI6uaZmIUf(O45)@0mRg24-nL_Su2ASbzU+RmE}69Bf|pni#m%Jl(Xc(7J*f?Fbq ziWOBbDW43Rqn<>l3|5$8=VbzRVhqKMoQri^nuWjSYD%Z8kgCx*-)(LRm*i at Ozd$vK zS5thuM*^)NE%W1KP2jQLM{(1>xM&}D z>0!owK`}nx6B{FBGAIG_pc|Q^!GI)>z%V7Qz>*Uh5LktX#!W!!s3J*ZFz!Gkm5VKS{qh1r? z_&eZyIYzM?;oNO$HYIhtOPQ*Ca(cpA`4$t-k&ilk({C!qbd1MqD7nPsgbssq8&lXt zJEQfOZy*uYw!WQ=M&0Dl`M~`;q5p1V9 at g?>6Brtb=sTn at k;JG45rm{p%cCyu=o>L( z0;ieB^2_3zL^lO)F%$;T)xCn|U~Q&gd5lvl39sHjkXS4rT}Q6HM0< zgNpPv?n0nz{2AG2m$vBubnega4+|c8C&2{YqCi%Jgq2k|^?LTEi_0Y)vOD^wkJF!6 zt0I}bShJso{Wm^!;23380#(1m*o4L0e|QqjA^`5VUn-lEg4#mA#V`u>cO at Yvpv%21 z;W{!xSDeb=>Fb5meG%6xWf82iXL;Ffn3bi1s1LzzVR1m#%lNPETPD;qsT2m zYna?qn9;qjYbV)I3W|2c)C^>vt`FEg4*CTX7Wx>0^9wH4Hdh^t@}H`YcmueQGr7D; z_eejsem=3v^(xx_I+p$tLH)x*>`xlK^G10BGye*{@Y=X9P^2 zySKdK%bizf*K!MT&&Pp~SHx_ygA%}+NsOWShszByG{e~ZfBN8zk=7h%atEp_voxtA z&r|2?*e7YTC}E^gjL7pQL^n`w at M$H=>@NRttX?L?SdZc1Xn``;ZsHIMsx?;xoc6=woH>0x8hwh{X=a`?}d*18jdJA~4+}yvBR&?5p3^j^ojFl5wd! z1Ut%Sa>j2TiEETx=i-H-P{7Ecv65+~=5Ay8ExahL)P^QQd5c%$44(UC!b5+?S4FKW zJ=MTjMnm7S-DSjF%P)z?G|nv1Y~w at VOxCXdgtrB8uqIO@;`I4T4$_`CCW;FpH5Fjb zH)Bgr7L;gy>lOXchU8IehWx`MXp8{ggHFEkrcz z^GG!6 at R!7;WQMV4;tIs0XGbXfOUkwhs>7aL&6;Wo{v)~x?^EDP`?-brH;hCMF~jW_ z&Lk8i(-f%O19sxp*bnw&Ld`E*h8=JMj8}wkQS2`E93#2iP!q(&9%K%c0{v1%WFH@|>StBQ|GD6vl#kAr3jl_x_A6=#j+O z>pRI=LsX>J#xiYLU>|J^gauSxXmiPs1+-6vkuL|j{mveKP%9nFUR|^^!vsl zf2FlXY?|crKi=T}t1*m2Bn5B&!#&*yARw~;e;LDnUg%NT&_LIR!V8XuhG0Sbfe`%(m1xn&9Fm<&egqchyH>GhkuTLSONaOefY z1ki;j$4VN}9XO>uV-9!*DZbs}wDKPfoFKe{p%Q7l#_jo6f|-IEvOqY`LyD?;>#rvz z092I|S?7nDL at f=*tP`}EOo75L*P|lVT-kFjV^uX4>fF*3Sv7M-70$zQ3a5Z6d_wZ5 zcXjRL#sun4m}9duZ1`kig29N`}=b_VfN%MfG%f& zWd!#)6GkOuZ(`^*IdC_)$67qk^4^xXl>`rNK0+oXr70(Vk$g<)wb2CL`Kw7&OrhLa zVOcIBPB?3sZ7ofy*w=s}mscG+N at HJT_R5}I7f+o1jE1Tz@$})S9jCGa)e}>3q=Qx_ zZ_9=jQ at GoB9B6tDT(MZMPmC3+fDbvTpPCUCO3CLC7tn=w5g;VJRw_ujU; zVm(43nsol*+O?p21O1IjsX at _Ft59a#25|pnWKK zSPtIu0Cu&Qcx1BHaO%gmVzh2bU-N=_$Z#4+4ObMHO`Nmv)nY|O at fF{8F1f7&&JWZ` zIvfoK0a1~bBfMbCVpLLLr-Rxk7gErk6a`p*i%<$h2x7I&0caIq&LnK7U>st;0VgE( zcYQ(zgV at 7>G!ocV^gFNx63F&`1u|?E%7Wi}=gf`cv*#`V99(^kid2jHlp}+g+OBR} z*CzyE>5{9 at AM^7SSx;r8E`GkH$fU8+H(%GhT!C4_uUMp_`;I4nF?m)!0sJ;>h^Mjb zG(*SGmz08c{~7`HYMiNST?FjLbK)LbtSU##tZsHnB>uDbNhw{cwW1SG>hRA9v)imrK&oy5H-D^tT>X zw!+9iJy49TvW!`|2F#t(FRvhkLBjTFepa`|;STEgY!!DSHmnuw2TQe%$FoQnpLrK> zeB)UgrdnRK#ZPIg60)8=x%pD*s9mr|=CnLS%|RA;iHU=AG^)-Or_gB5X8KwJ+s2WLP9j+ERhiai`gTcdO~ z__{4w+$Le=cA?ZE!ML?d?AjWe*Ljs+Xn$FBM;U4#W)WBFj8y6`L27taV1<|37UgP8 zGzDKfD-*c at k7Q+SwEF#W^IJv$DR9tFT>X<>{f_h0cxNB>1F`$kXY;3El9eY2IJ+S(@*-gGqm4 at oVMAy zyEW{kP9et%4Xw(7T^3(*ow0!($X}3+-{1do!Aw+Y+2RZi1jLL01cd8+p$Kd~OxsjpQx(r;H+w0Vo|NzFz at w)Cl~_Z2i_ zDZR+9$gOj0SvAA17=naf=Tl_hl02k0ZTf0mp_;)2Z;Xe54K8>Er at O@5LZzekb90N_ zqLtlaxVopqVB%c<+|Bp0QEodyn%{nK-TfTtnZsHB)b=&m*T8H$Ph?pqC6)TwY)CG`!46;;BbYrSUDRg{8brKr_!Z+z9uX zMMO60{rco9`ec#vN_uWK2OJc-d!eg z<4vGoT)myn;|BX at rzON^(Vrq-%;lKT*!kxJYYR-V(V)*}qY-iLWStxgKeMRqMSDtr z7l2c_c3G)xxL ze2dYrUF~`if&GC{7+BG#+DA2u|u5+ zrm+$`O}!oBg-lxtvv at AI8g3JsIyq+ZR-{gfm4d!3Gkl0li9FI@?(;#njz1 z>(c1s@}*r_M_no^IQr*K*o8OFpR*TT7ZCiLl^gWt{bM<2&7vI(@nrDB4Ybwd>3WIP zi%ldNM_8iH(2rw-SJ(-jZR|k0kzrMy3nzEZN*XB-#+2a%wmsO(1`W%WVgKV1A)P)4 z0LA!k7X+Ic*_P?!c!6BtqfQoNY3b6+3S1KbTwCGtS$~FBL#2P5i>OJVs;gvgyNP+I z>2lmqRlY&WCQA7l^Js~(PN$QYEf52Xywma_h1 at O@t~?b%(o$i<*$W$!pD`5b0G07C z$wgL7_k0|I)BYTK4y_{GB#yU%t_O{OY&Oky=u4#*P*t5yqA_A& zu5cHL<~wX8y^dQ*s=)x`CWO)yw4DWuY8~SQ+{Z{ zQ{v}6vRCo`&1)#Ey!Crk#K~<}FAnMKfhB9v;#DqY7`h8VuQ^{e%&r#}2Rng(z z)4pbf2~&RF9Cwdn296JK&B!cJ at -i`s$-p?-%A#aSgly`D052zN#6@TW4Uc at uoA>-XQl|Rv>B1vU=Uqm-57%%NIYOx628!t4EmjT;dQ9tEg8NU#rl)^d1J+Oji2v-)fRNI at z= zhk`(rVO0rA%?dq8t!Rd~6%2v)jOwv9-HRLgr)Gh~l_9PP)nY)yXrT3G;I3WIs)~hE z2&s%444<-%vqlj}>J^W{%rpJwV5eFE8%Lx&LI#?X#)el5=|q&uPSiXYtBfD3%)=zI z^DGrpA<>>MD at PXsYX`y6%+u;KipPqw*ao%N at Q4H2of-grTCXR3hV^QonIo at LTN5wt2LF!O_Re(wQ zj8o>#3`b6?&)xu6er7(4fS{WFq%jV|Pn>BOjNdl+n|#Zyw+vrw;$T9#Sz7z=hoDq} zeoE#4-bj{xtG|Ap{1!?dOVji+{odEn1|xZ;OmnLDzrir=?ti8^ab zV^=pHG$3m1CN#gd!a9=~{o;eV0eR!_v4B$btj&eFKeQJNVRT|bO!dT;O=2V;S11az z?$G90$AuZs at BIelvay$FE1_;e!bt8biIe1Rgupvi173oMwg1onKA(C~F_ at zVs{TT* zMH}J_+eaByta%G6jDa?$7W~!`$5{t7szmimFyo#?GD}6&3nb8vU9c1o-!=Mv(h&(x zj5wr+?x?VNzgC+UJIx>tmn36ka<_F)jL-+ik=onH19XpV3pDvHo4}EjGZ)10FYbT3 ztb`k=$Ah?uRPV?4-Gy_mtmSXFwy-+aYbFB at E`L=9YttZ3dw4OjG zw{B*oc_k+L$&8^Rw42QAHGEXkiD5!J&n-#Y#%KIm@#~7(17^~)L+bH at F4`SGlJ at 0Z1iD>utci5}~ri$2`(W2Xk>5s=kf!gm#)yDH*Ucz6DGv$AY_HPC*7eH%4 zJF3Z at u@SZ~qQAI~w)wVK;44A>g9Xb^G2TQElT9YHCTi~a3{nMKlTF>~fmwkk*3{vl zFZ(9jdkby2j{V|1jtxB_-<{1=v4KqO>kmm0Hd<_ecE2oyt)u0^IxK-!dX%rSO}%I} z!$O-o=~&53&LgUN?Zyw~hCiowWwQIUg-SS_w&=d&FqwHL8Hxw2(_cJ9gBNd|MrZ;P zm_N{X#XwG&_X5y74aMdWY#Z=o2k2fRTr{^{z5b;K6C4ySc at G8xvJ3b>{_4!Z&HmqO zh3KR$#RVno;oR%OEg1r$2qJWGAtyYMH>NpLAu-g^1OPm#>|umGFAlkWr9RZ~-$CA+ zu00Vnm|?iW)^FwEmn;r_0@=rc($X8R>4)#_m#nLm8;2cGIumtqSO5k~gm%Uht!I at n zXe2B=Ko)hrv}DT+wWtBYYs#7Km#7GfVVSg)UAw#vPK_4g##PJ3Brnqihxjm!{XmmV ziN)OwQ`&uObxiP?%zzyp{fgb%WS-TA+o{<`)gGR%{mPvz*;H!#uZAJt_(&BCtDZA9 z&djNw=^|$ojedz`e9LF+MUxp*6jttoHHbv4h`g16&wOF^;Ml2YClJO)PW=Unnmga4 zK|Xeb4Og9EgRfvunGjJH=L^cN0 at _Ga^Jkb9>&A?w`m({)5{s7fnJ)PeC%=VOy-;7b z`iE*G31O2~n~g3?)A+lsiW_YO+5Tu>;uNy51d-|v{o1}3`fX8lSIhW`QEoXycLnf( zKlcpqr!KMiCYM=ny7nLJeom+eG!k!2MZ~|Wg3EtpB?OrvG-|~&&F|pQhzHZHl(BSx zwLCGjffn+ct=(xydUahLfts0w*A&3R!1BW=h>i8-{Vbp=1Bo5Sd# zML~1 at emc>|z`Y7!}SX2id%~p_+w!u%sQJ zTR-|@plKx2 at M+`^=)FA??Im$?5;L&!F$|SqzfN!WX^yO`wCL}bL=0g(3Lx!+5t2SK zu<-j-jXg0R&Itme!e?b;N1vq=(M=27{gjT#o%Kjxp0tjf`ors-$t!&C{}*ZR6f8`$ zWs5F+%eHOXwr$(CZQHhOe#^FP+s65KoYQ?{ciekBqEAFURAp5}J>(o?B4>{Lg*_SW z3+jmSDn7`19T0qe&lB$%efxqd9t+j- at lX5+UqYG8Q9t$^DmRL3KbMO?fdtD$$S^%G z1xcqOFb(zc6Zufevmp`9gs?$!7JFw86Dy#F`}!|k(*2mm2+*Ja0GhA>04)E%pi#20 z{b$tK&h|gI%Kc}FGDTHO4M`38CsdkI0v$Y%5Jj at 0{HRd0CM~tJIXvG2p(a8(UpMp! zJSYhxJHvmi>u)}t&s-U=^D^(-T&;@2ri$9<2Hx_rk7=lZxF{;`(Nu=h%lpgD?)%Hk z*XJ%C9U%5-5b;Z4_K=D+*<8%*n>`H#1e3&+q3pn^g!U*51e;bu9}O>gO}bdfrt*6q z at s{jAfRiZBe=vxEb9?Jc{8J`TE-?opE^Wk8x(UQdmX?e{Qb+M2__OeZShaQwC7!$l zqSJ6miUdy)wJ!Op9}VEGO*s6MBjTgoC-7FLR2-dlXpY>DOBpjx&0 zr5?dLu03(>#I`_RKg_~-oPy54!cdzf$}cuJx?ZdFfvnUUh&FdaSnY?RI%c2 zv##s3V|Fe)JZB at aT%$%WO3I+cfQG&;rQMS8Pi{f6C(PL-gR1tNsi0!V6 at k{ng#4Sa z%G;dak!7i)Dy>DrtI{f|u{Kg}L21Q(Hl>}ey>K3XY`<83Am|cu(~3DW7 zPY%b16<7RjJHist(B&f1gbhK#ik5Ap*QP>q3rT!J`02U3MrrIZ at maUzqE*viv8)(@ zAgNcuP-vpO3ZvDa5~Qb5=k%bfdyn?0-$N!Px?Nolk)k%;JGa0-kpmBh zt0CeuTw(H$Teo2(YLl^}y<;4uFmHL`b3-f`Bac6$UQZ zqLa?(c^4YZ+f8BgXOvi-(RvBQnVFQ%;2(m$Nl0zeZjHuhy}2pMArsUk8F>2SF>?4J zO-A&(xYDzGaw(U}trR-TDlt3wIjuesYl{?9&M3Hd^1MW5H-z z<(eWaKejl_>V5fzUDR*Es{&l}jz^8F966^=mwRuZ%!BLu;~upJW-fZZDJ0is-3-35 z z9fAR7#}Y8)ox>0$lGj7!Gl7uTH)Gj1PHIn1>qB23Ud$mQ(4oZ@;#^ie?kBX{{+$wh z4|XA2#OowKLKdOrb%dU0=q}Eam3av}9h_B*#@OvFAW6QL=hoT9I+K_|Wo6O`#%BRL}q=s%4StR_g$jS=pWSwkYH93nZP-SN{Vo}bRC!n%d~ ze*f-X^g>TB2LFl2*bx6a_wxUE6+1^~6XSmq+EA5pTNFk9G3HXW9wGu%lmt3XK;D#) z2SO&75E637kWL(dm;A_YG>}moq<=bNgv}lf(6My8HJBls+~u5xsBw&&NFon>B0DR>e8>9eNv8!e0o$h;GdllrBp~Kr${( zZjZ->A!GvU$2X at +5ugPF`u0m<@rJE7S(H3wm*rf<`s54iyaJIDG>{?FXvCb6ne57@ zb<2{zsVr|@e!CfR%8f$9%CAkV=yj?}5`FIOe2d9Vzg^L8F)Np;#hk!pxbmg-j`m5; zC?LK9;*J`MQbVj#f1e6xTNRJ|F%_-lBMiULBW!CX7LJSaYg)|CnsQE at y`ALCN(xVn zT&ilsZ(+{}Lt84-j51fd$8LWjD3xthDrs8&se at siD| zGDluT;0r6$);_izu^==i>}49Rthc3_D?!*+#gx{q$=-9-Sz{uDi1_if=UKb!kaF;s zgJ^h|RkCR6S!5^_7p^MsUPh2ENb%?t$rQ63wic*FC3IXJ87^xIp3OLQl~>VR23pxt zY$~dxT-tEUJT&wmkWv8R4TD3z0Tg~?$^wkV$`Ok+Q&Z7*$$mS6lES^ z7GBF(Gp;u2*Xa#pbU9bC*DGcg+>z|sq&b3{i+yFsyA at cXt{Nwxj(<{@@7U2u48Zjy z*u&k3vHKMe^rYe$NcX9C(&)oH5O&4g1MNt>!^)oCTF at H%CRAh?vM$SlA*3A(%@BJ> zl at R#A*|7{iYp43Tizez6)}+#4nh5p9?D;1yIGN1KztpD=xcMa0`$Ztq97G0Kv`kYtYY+1Q6-hu5{(8NoTX7cOnxnQl5B* zQB=Fx?9^xcl|(X*k&!yVhcFq+72)hOAp)1*14!f|sOmLN7Vu8tVL at NY3=)dS>;Sq-*^Gw<^xtW!*PvzYUalz?gY_tWxV#(hHpzk at e7Fad_B2$oF at x2yq){hVO8lvU6M zP7JrU;1Vso;WS*t4 at y3o1KFpx>F+ph_J9}jZ)o)>5tj^KLKUwNPCyz;oWqQf^b$sp zbQxwkBCk?m1jT&jxwd<0({EfvW!C5uw2rLy at lSv>%)J`?Cz!9u0ZM1yVV at Q8O?;sF zFF%X~oj+Ye4d}THdQxmCg(2r|ymVuo#0VHO6?@O)QWSG}5?k=AP~&1dKa=*F%D_JF zf|d0tAt7A at Q98F8W}=v-B<{Enn!ANfLhL-ID=0#pTYPMqdGv)#RJ_Qi)f!50t`$;a z)yzF}*c8e50(uWv&GG9Wjt88vS&lKbjj>x8!QGw2FAdBhvh^qn{+}CtRX;?@-oCtH z)yDI}D+s|I8zL`)Es^oI#a=dXW#|%|F9N%mH8f%BFo7)=nKX}ip>CPW_iH4kuaRC9 z=>33DD9R5rf(6Fcz{odtdjXNWBg`9jVvgIfLk!6zpBj#>$JkG7hqyx+$8JE6aiQE7 z*y1S4`OTVu?O`36viak|X?awZ!RuW_>>B&UHzn_r<~$>q?xXo#7iInYPriTm3c~zC z)Qf-s01$rw03`l9iAN(BM at JJ|XK at 23^Z)FX5VbI|HvT95a5iyt61TH9Hu;b4P^C%R ze{K6nDs at QAY;Bi^JXXNxp9BhmuM$p?zbH at 1ZXGCqVx1qt=una|jps4#*HfY9r+x$A zg>_r zWDZm!Z2c`>oJjSat7YMAC0Q~(7j9hGF|E{(Z#IASMN(nqoLyEi=bC0V`mL>z0kOGL z+SwAjv|!6LWn+uOpxk9D4Vx-hG3?8W5#ih?7Ku*B%%CQgUAg!XUA;q_8#ZQLaq z6XgU!dsX(_1&vYdX6RztfRVu+BO-^|vieK?a1{LakT$h`>h7r!wp`QN(dP53Cg_t^ z(|xZHHm%?jk9DwKJN*%5HNuacv%om?lu4Uqu*h%9P+dCso8)=g)cvN=yY-rau(4uE z!po{uEgHs>AgnXWpoX1w;2&z&Pxz5^ARE#q9U(IgevIP_%tW7TEi38B? zr!>G>^(Ad1?|j=rQSR=LEBEdDve0##2A}(_)tby? z+&S#ZR>3dGZx~EQxCjmr at 9RrpgsY3BnFKL2z1gemb%y6Pdoknt`}7}MX>yO}rz>4L zG)07ve(mpz4%L8hl91e4ps(9!4eGUv^iF}&W%8Mc*WG4$l_}ca99Y}?0TPP)YvlEg z5!#_5wGxw=%+e2|xl$q|0B-v(s==u`=+be>$Jmq85_)Gtcct5mv#DpOPV2n8(_hj) z3{N#_$-n6O=2_G`y)EOUC2y*)qFK7esH635OKKF!1uTAIG`erAk)AtB!L-Yg at kL!R z-U8>*;>KL=)ol^7>SgWSD$i};V>npLQMzkik$YK9XRC^unmkBbH|ev%pbpLkzF2`F z*XCyNB6!aMT(sdXWzj=0#ALz6>qbRK(|fwPK#<*#N)sSwviPXQ_A~~dq~T)-J1CF! z*Rh<(n%hs=@;04!xC!OFmwvnQdPy^xl+AdsTxxjYOPis at KgC_~`Sr5XvaWV&hh+`z9!$)a+DOGa8GLkTSNjj|zu764? zEIfse at Dol+;n+eG*hMFfq5n#!rqU(H5xK7UB(y>_#VWWwAYXB0<*?K(g2yJ{YYPai zFA(icFqXm>gCxg?SeCaQ+q)^s)e+ecp?edm3LYhXJSLoBq-Y3{6XjrUL7Y$6j4%GM zFX6N=2(sjmM%m1yv3js``Em*X#b$Ads+vR02p-Z@=pUxZVzymk*Xmc`X4#%Fvw5sO zonJfqVru3)P|`qkeulAB`iTBMB2PUK$a}PZ$H6xpIMF;X002J3{}2a^|Iu at 5^RJVG zd}(bOjolVgTa`l~kqJvFNNoUjKLo9?h!b1QEk)wfvaU_KrcB$KyjBzP3jO-(mJy15 z?bGkGet~(<{A2m}dEAf|MpQT0Nt3p`W^*62Pq!WuzrIf4_<+!Zas=sSF3$$DIA;!M zfb9-(fNu>2dD5BbLo9M!(U_+y2fZ*)V9?1e+slb!UYGY1V-b1fEz?+%S*YpHSbBAz zjQ7Ih3;uei`OQEjIBy9`MEXndrR$5UU~e8WLjDmFq}Vm0m&zpz^$R&=T!ua64W`^-w-^KBturzkmJlHD#MsD+hoJjH8{(DRHJyhX*`S=E>}hA zXRPZaKBxIabyIWSD|ZrFs~BVS-`C!}VLTji%SU58^q*gae!Hs at eb_{#e!b{c4To-%GfeI+a%#4 zwI!OR at 4o$$u~(j1k9<-I5x_+%d+2g8^D>!3(Dr*pAKiKxKtQ7$uLTc0TXmGDR7+Il zsdJi2GCAKU)zOB^qBqr3IKaLn*o6q!>Kx_2lw+FQ!zE-q zx8kmj2ZVgdl6g6xrPIkYOOkRj-V+renuVrSrd1jKwINt*&sO+xTQ7o>YbucVk_G}3 ztK?<0*mvb<*&<#kv6{|?*2uNlu{3fw0P#_9S)?}${8S2C7{Lvnr+a>`03-GZ`vHBR z;^`Re+GZ%T=Wct%tA68!J$Bp+>=hm>?{N0 z8$pZc%mmFVJUg=L_q}B71dZA79+K=Q!siu9 at Dh#r$rjzT%P{;Cj**MMO#sOeWnh>p z#^#6~5tO?=;^|N9Qp3dXn*sX!@!T`dBrgv;k@#{&0Igd0$;{}A+>A4F-iCN;KiGi*{!&^@Ri-M{F2KlI}r z1;L$VEQCrSXxJ=pFzsf)&$yWWwe$V~(*HBenvSk8XabCbt}>{OsD|P=-RH7pE{4qp zvxd$Fo+Uq6Lrj{~KArz5tHL-06#%`8K4l1hM=z(JqJ~kep{9J*2yc?N$y^ieAAIYi zw&BF0=cz)=^jvfZZ4;%-VQ)-x1pN{KC(BJ4Ew^x9t1>zpyhSk$_M at rrFqc3`?Cv_O z;c}JvXcVuR_vtO9{aln!P8>v-wEjt2yK+0GZw7~z0IYus>_^F^aw-I zD at 1bh*hmynz?HShb;;yqD=l2zQrU`or?%u8B#d4#C`wq)_DPBG5UE~LZm6MBQfms{ ziHGl~BA=@Og#xsSrozZRdfZ4( z;xIad{2}dp*d9TP&Ex>YfrO?{;*dt*CGRGUJ(58DKzdW4Z-|*1fw83~{Y~mQFNQ|x z$)<=?WE^L}UI`NlTl=+Jc=qiz2A!c=LQ*zy9TML~Nba$K1gIl8sB?1jD57EK%k!!H z9HDU1xc3N|QPL$~?V+Hwcw=q#iR>iuG*`4CaO(h_Il-`fDXVG0o+(=u2uNJv8BB8K z2Sg at uh&+uOFB@$<(b*1b3R5f8#EbvZD(li&TdNy^$1dcgG at US@kxjJT1k53)s7698 zD8enmWl3k-6ZB$=wmoa(e2?1c9%RcD2yL*03$p=|C`o3MkoBQ9w3>hq6+r_9YT<8_ zpYy$8O0sQ8(la;#V4!h?sev$5;tY!X%trjYI%kBJP)wpUM}}Pp^^I#IM=c6#ZBmuw z2tX5>Tzc4zD)u*Z?PQ2Q3JEw%wzzCb#}a*aV#^D?i|O?cKSOG_NbpKz^+(PbdC at eH z*07$I&Y(PY1HF{FvYch1Cs0|?=jrnA?!UtihSX%B>Yp5E9vT3E?|%Y65nE?RkN;d| z$x+i%+Ej)AiSI-sc+L(mAdKIu at 4YCKG4d_T#mi>ul}O-{0?VIDn at 5fpEi~uuL(7r+tRJ z6T&xeyhqa6GAsk at 0|-1H#F4T$X<>puaNg5tR=u4FeJH(fcgh2*(0reKl at T-alLwKe zY}yP{3AIIL>MYQIrWEzsd4)MrWl|C5vq6z#t^A@@RpFXsBWE6ZTGzCl%&nKFVR~;i z^OJHgrQ5VTYxyD95+#`@NA=^;RAIgiMe5MWZhm&0F?a=flXFMW29&}Ky)tDvMN))h zTyd0oM6ThCIVgrTE>8Bk))_jBqMC+AZq*=cA~)DTK-T&2GMA>tnA~-lP!O)m-<}*H z);y~!wFH|9dMsl5tKdOf;xbY}l5d@>c)OTjk|tHF3KSWQaz*iCmj<~!$_z4U`oJVZ z3aM7I+>l%>1vqJIQO?XMxvI6a>``-AV4=b+oK*@aHVH#@Hi9vYy`15#)~Ma8QKqy@ z07BDp-MiNDx7GeoDfFI||9xEf)p)#>WdWmW?WY3O0i5#lv#L|}on*D&SVv@@@q_W>S1pLvQle#5 z)@pcJsWfJpP?%G<23*B*(28b4lXetl))`Zq()Jn*)#1bQyyzAmHRhqaKmi;`j))R5 zh}lb+Dd0n#@flN)@foyN&-`ML#WJY)PXXGh1@%3H4;;)s=`#@wRa>85GWnlj0X2yM zlYpZ-cwb&Hw3;9&=6(?FcCIII^b(c{o4CtPFf7^LfZsoWp^s}qE^GUwSM_1j47Z-j zZdRvcQ%ewmf=FlKz?^559{JwP0d5k!3;10sN#n#$a0&TgkSS(&8D{jUUoZz+!4DLe zPu(K!WG<%dX`bM2 at Q5RGWYMb#;U0ekjg1kNVE!250;;9fBBU40Q=f3t{Q&dfK&y*? zhm1){m;DGE8$J9%93*wQrQdpmd($)YcYme at 4FysH_T7c3eY>A{tsJpWuI7&?fP at ei zL}VZcF)%=MAc%o50CgJZ9`wwxmho4c_lT?!J_Ok!l4a2Bha?m zs1=Rzju#)o9>VA4Plcbc{?mgG at iu3%ItI9vh9(-Ymt~jAnWcFh*qh(7sPyZ zNpx#p?lEoQ(^`0Kk6aE8)Y>WHYLB0JclxILWbSsxv4)Q&9V`&iR2?jk(p(+ZiD{LF zhiPclD7rQFX{2 at im@)X8MdTPOrsvCX?Vzn9f^+5DgDTo7io=4^r7!M>Le<&JM;nOX zFJnlxT5wA}XjU!2nm2Zg$+fY9sOPSzf7t|v^Z*6e@@$h(3K=zq~>jpizY1eM|ye6k7clxc7e z%M}kT)R`Nki32NLh?EvmVLe1=6Vf*Jj|Let^wbkiv_v+B7Ms+uF6Ahtk)CI at aG)s+ zlFgJb6;JeG)!75xug@?{4qmCKL&Gq2VZ|9CfhB56F7wc0 at 1{US%zXa@@{HSyF=?`v zIs)7(CrNw(sTDp0jdxT92j2!8f*3dgpKf|6P8KswG?u1!CG{kdC&91^A8ipDz)tCE z+}BY^ICgm{v7N?ep}4HJQWFCUefWs2MxZpMiXqt%R=$*Q9u0<4UfZ`0I0i8#_zKQ^ zkRCl_8>wUfV*VyaI|vqlHgh2LAR`Q at U^O$WAg99-pnUd~427-0C_{xl7#cqio*sza zDfhL{GLW#l^2fb}9))F`ZmqEm4@=y(-<9vXf#SVtDjbZeoFY!dgF at dypW8o_1SyX9 z=62u#`Y7j*#`4QU6%U1rAzha>AmCXy557;fwmK>#?5P8j^Q`B=W=8W;O59g%WJAS# zj at b?O(kRkN56w_u^#~e+)@g*NoJyyb at JkYOe-P)afH=$cN6A<*twt~VXBrFhrz8T3 zcPZtP9N-VZf0~_WBTh1 at Vvn-D0`L~ zse6Z+Ydj1;TZcRk0edKjA>T39O?uR?R4nK$q at zZw$QJ|Sq(j at EVsvz}>9&CG6OJ?Wv%DcmGheBQ%RZg at u@VQ57Dd4?~RFEmH zy5;u$CI1$#BEwczFIG{yIi?M4Q^M|DDtiXzD!c!c6gzu7cnFvLe###(NFl;jp%5=a ziKU3nuN-6PFZbqgtH2H$agN?mJ(ul-5`(@lMQ2jC<@$RuaXQEsCHfIP0FjckMRmso zkp7-O;o~j7kEPt3z*qV(`c7J!VU(L+j$qS|gK8$*PO!5~ML5 at LJ~1|?yNSif>yO-$ z73RWG2!(V^xjWSsK1sIc<4QA;)Zkd7jXHGPFyolwD`*Ezq-q+?ys_G>!9m8ciZiyyh*b4uRk>9LyIEPMMb*4xSdC^D1L}s at U+z zMCp^YBagoC at Hf2d_Rb8&m;c!J{*LHIa@~GvsOTZ+D}EqMg?GSyKM%6bOUiwl%UQF; z?fjJTTTy!lDNTUk-pUip#Pmi3LX5vPdT5E=wx!9(A}g72XUo=U>H#5O8&!(6Unj7Y z#7WF7?_+j7-*KMuv5w2wc?TfVO<>K0ZB7!Z$B<&Wdf=dhP}%;6}QJg>Q^*y^0kB_X*Q=`r&rk@)Ffu?AsQE2& zildWBsw32oY6DYK_ryv~q#OZ0A*D*P|8x$x62-u=MmK at jZ+c3Fov@TE)VU^upxSw; zXT3nP`%R?jx&?~9MI7oXR-r&druSc^WCI=^PiA&(N7ooeEAhwT0Cbb{wdicxX;D~u za)%zWY7pUzS%|=^mUECnJD8jtgc`fI&m}P=bRw9NY*Fk7#PL>jX3EaL@#f0=i0dei zSF15`Uzeov)v at N3AU$)!W6{6dsokkE#l0iFCyz?YmOLOe=S8nZ;?@E^O28r4FSc}6 zhd`2xqBgzox1}Sue~ipIR%|>j$@IcXpy<8?wCq%%Qa_2viUC z-+jVHFW`#{5Ld{%@a5FF-Y4A+EYKB~<)?Ym;ZZGg>S<&)K?vYE0v zOEIVM-o3FWin(XF_ISftAxDXRl$6{eu{dR89Y*omK}Wu#U(ex&?Vj|AIwpyi30ZY) zY+wwW^p!$K78SLageG1sYv;*abbaE at SkSd3c-IB&xujT^6ao^_v=54OH~?Wm7EV4Z zTLe-GSj4AT0!sEf{t9CykPTI`@vF(}7D?~%N9CB8XGTvB(O`=^Tfy`BzD(POH=n`5 zz&xqr6s8yK6_)W2m2!!37U2(7m3d^oD~9US3f;h~TowK|1CQIRE at bmI@`*<|237z3 zDy+K0zvSjRmETQVDL;cj;CA3F8At^#aijB$nqme}5j7`2uqc(ESE3v54{mZ`GM1Kg z;Fip*e>K>_j#S>jg at Lgmp${fs$o&N`1;U5K78Jw{6A5_*r!2HMt^J$@rFUt{@Nc36 zV6-0bDAfHdyai(fpA>Is#%KjR%wEV7vAw5cq#DQ(WW%GcdlRtT at HTLwVg!j}1jR#r zK1pdlb*7k7s~Eq;oknh(sJL5VWQOblacOI2lJbCadg)$TN?fRm&|Fx^lbYF*? zDct;#0RT)CZV!n^(OEFd$QGkICqnL)&eqmm++4kYciMIvn*vB;p6 z52&HP8u!aeJ+VKeOARx zNJF+oN7vFfIf|N`Q%-RdcJnvuYe#_7UmW(=N}8}K0aSd>s7osUZDjfk+ek at Ukbe0nyv7nN7 at EBXbm#TMDe=P;!bPO75lU4qS07eH>|Bk~(1(4ND<4DU;hQ zCAEsL5S5(Lxr(dvfE${pydqKY9aixjbhNcR0#TE)bBPC1_DYbax{iUVunQ%0W$a5G zB!d>V;}=+Cga-|x+;mR;n!2a+0Zy;b*+?3dz-FSsl`=}!MT**fK;}Eaw>=?FM>v(j zWm-afVH~~!m-Bb5i+1HXKR8@|Vyknv2~|6z5szZ>@4)8X{_NjKTUSD!2)S>JU1yio z;*U0<&8zrK+(gr8z;Cnv at VUAd!Z!=yG)yIrGjnSp8bxM zJ^0l47j#s;-r=?N@#%Eg}l0Amt{Yr6w9*w_A(Ar=B$GZiMpT zZomsX#eye0T5QKF&P5{A>>~ z&P=<)uMafNc)OCXk2a`BHLB!#vC4-2b%j$BA&!4ReE+%lCUT$TZ`uSq_=uAA`T{KS zec{^4-Tk_&+hNORsdWxJA?DxtQ(7b|%SY&(c(-X2-Dlxyt<}y_Nbe#D{_&Qwfw{-mg!s4^PeML`v|O zj=xRqzdSdAsIS2B>eachH&t4dvjc@?=F_p1xW%D3G_#AATHged{6DlE?_SBHyI?z>>fHdBz%)AZxTk)BA?vNT;}~9Ppo&)= zUTr)FmCcPh1urvlWlqn>#C}wq6ek3B3vOe}Q=#nF?8;Gx+md$bFjJ&vhC0t=y|SpzAHV^lA15BDJVZ$9{3}T=$aYv%w|3_ z^rp2D(*TRohsmuIwA=D_Es&WVLVF~Y%dIIf;umvr#s<362Umoe at nQDw1*%HkQsDA#m%R%0tj(IMrL8T57XX^WmN2wB zHdbghH8rjcE48lQyqmw>Y#ych`$)d9Xk+#U0BHM$7_|2Xj2xaF(0R!{RA24LYM}NgwW*h@ zZw at rINtdf&?G8cEY>+pk{WdB4N{rS?U7Ju2OuRI6G=jHGx>w-(u)I`YykzNGA*VKt zU)}(1hp>1z(0jC7G}$*0dr;`{k9x_#uaHS}5Kks_y$8cSkRUClQ_{;6+44Ksv0_zR zhxaq#3NrMVaSoBf(e{-e&ON8jJ)7dp!-}GWrDE;17M7LfYW8eHT+kuo)237Esj;;z zh&CS^;0#JxhXyz2-@pHa`oXeN|cGHs&$D9c{Rm5<7?m=QYCJPY}+X9i3y5&|p~$YRgE z)Yqy`Oe~Z*6(^;+1S)BA(V#6hQdS!qRu|;+17FVQu8X^tt|L#%oB|z|k55fPBQI?$ z7R9M#))W#p4jzx5J!*BaXALtK$5yLJ;xbCGpjOYt3O(dFP-Ro@)uo14Bp`BixDr|c zNk&a;8`caf7|g0`cL!BNEpdGmOUGpz>tmls2SxozS*e)Lt#qc=*5PF&%sdpEMWdU6 z^IQmtIF8yaxshVi_AWgv97`8S5I#xfCL^5Dyfc?m!ihtXIY==BRDK0wJ7|l+NTIom zsTf#I$jg=?gM&g2%p2liY}n>z>+D3X(Htldot?v(H?+8_=?CI0$dHguu$VN&0|3hE z%(SntQebETA=4gRO|IItj(^Iz{^-E+OBVPD=CDTFFZX{ba>a#JHI at O#_!tz4%}LPR zq^$;LfzkXK6jxTKeF+VNoD8~csy|AgM8ewPuu7-HJvVQgOef1&K$3QE2?jJ9;zYjT zh?jxwzyHOnGt1fIo-n;$m{VujblQ8UF*MR^M%0%Ux_+p=8m(2j1r*ht=aE-%MC at l^MT=mukZ~=WBC%d=R?i#BYgN) z4o$mjMB`h$bLuYKM|0O0ta>X!`>U8PZx(f~yLiXxTeHvhRuj6r4+BHG;&tx at V|RcO za!vzkK{Bmt)S465NnC~IH+P5nQ@$@(xc)DZdcTw`zr{P&pW1!A!X>_Yx{whF3m;@z z?&AE3&8i~2fg&ef=op{oNb~^;mnk<_p>?%37PbCL^xH$)YgHzk1R6>j4_3P(h!bkf zfMA4JGEPnC9Fa=jZtOK8*_#M5CBa$(!?OnFO*^%Yy)yZX`BvTzZau6R3#QTx2{PwU z1yVUy!5eYzEgC|S=oAPh6Lvz60arIS?Oq*#zZrz0)lADK4SQ?>QI-rA6IqU$Zo0Y~ z3G5XbIA_fd*-zbDde$yV!`3yJY{fFIBdsGQV4ikiIfNk{V0^>*^r5Ot*Js!bJg7%$WaCm;9Zzi3cDA1F`_aekeLhIV at t5IZV3?mS^q~1H$ZH%2- z at Nt@ox`YvJjor~OdPYmjzzW3}EX#v6_qZqYHfOB8L?6fcx4JYvn$ zt`prFY;+)~>c4cZjFP5Rty6IN8mWkJjc`hrADeW8yQ1ygsI)-d%f#O=wz`{RIx{qp z<&5*1463!*NR&jCy^BW=Y)qGE_oN(GbGK4fhTr7Dd;W6k<#hSkS!mB|@8Z9sf-|Lr z{;|pOx5v27SmvO*H-}`8{rgD3NBh%oJxrX21Z8`qgPFzQ`Eq#1Hn8=}izizTj zV7lO&k2yeQ5cUC=f8yLxfr$MBZ-EA-useMaTv&IizHX->Te2&GxxKW4 zgu_t4ZE~E0e)$lP6HrgFo^1VDO4ZT(4&W!BUeg_50PwPFdQ)32}9O!;cfyUcTH zi(S|ima2JcqApgXJ!xqXj+h~d=^=IUzOM29u2FOCfOp))#n2dr69k`WrB zdK}H!$Z`0d?T|g*!P+#lM>N+g(fDmWvaUepE~U>z%rvDxO(pu~lCrg0NxRzgkVqvE zS{0H*L}kB8CG6!gqIN~R7u%kxWw*?>;2Y~! z;f>(m&b%kab{U?a&E=?ep`Ku_<*Ih69$6h?l3QU27wTaP^{GFexr&g=!WnIfZKmc+ z2MCt!=ppP%)1!=}WoTwql<$!xDJvE0>_O~&h?ba|<}CoS3KSbfIZv1rhmzHTfZi7@ z)hD%CiqH;5jj$;|f at Vl%)MwaT$nczLE3H!frjmw}9U}=&F+`{DvDuu*%_Uk==hhhm z$>XWTg9*e};*BE-#XAYYvyzUqJeP%X8hYX9Q>eMLv0u_HP;fPu1=#s~g1J29n(BLc zXIX8O$nK11sglmoG0z~taxnFw$d0h6H%Xq%QVV^9;kjfa#_+={o at lWquuLPsCA_~c zICtx9Jf8&`7D)on6Z-mQ;$Cq!Hh9N0{n(<^MR+JH+Twm99AX$T3S>K4^f8CBwYd2` zuJ=o}J6l2cNOq_+p3t}^^M27L9}XL*5TZj$#gEK39O8UDLQ*_ZmU2aDmo(aXQ!PWw z9MR#LiWjA7z=k+wXL at W$7J?dbNQrCq8u3F>S$E6p| zEU;moVL`da__?@+oBMMpd2uh6*AyiU0yC{0Wb-vQ-MQ0vq)$ z*?i^Nk#mQl42b7HxZcH8uQwPBg at JkrKLlixuplTNYrO5*ecg8I9bf(Vos3cgh~0Mt zrO3wQM=V46$`HUdL(W!`SGCvWX9v0*#Vhx#AQ580D%nW3nJz~PrG_e|?5yBY36Oce z)kMAkiXgb`MONpj&3ee>;vu-sEJIRfv$d#HP_xlVVV_aU7TI^w?-BcGe0DPO(d|c6n0eVFW8tV)huyMxuxJ-v3M)c54Bv z^rD^hTl at rSi!lBq)L^l}45c2uicngQ)ILExic5O7wi2#{$CPt{Rb}w887Tm|$VaeQ zq|98^$#tml++2r6dtG(KZ)0;THK|10Z7`*l`V~#24#C+|Y&I#5o9<65-8Bh}N&K7T zUyI!)VkMHPvoXgMQ`_?|Fz-pB6+MOx at 0s(OvlJ_<68B#Fw9}#JO0FvwzczkS&ue#c zViuvws{yI^pN|2qqlMCJ2oBGh_dwdqmdq$q)9Sx{CsM-zzqQ&NZFkI-eqyRR!G at YmUz}CPxZr8Xd5 at sG_FsX_IUX+uF5iV1v#9iv`9+LVVC9Vqf8$d6FVsneDs_ixF0yjZPZ>j zdT&Gl0S9C_+`Ywa^l*VqVX5B5VPAeDPIjW%Gr8JU%T*`OR1OEu9Pb5+h1%*kZ~92q zc`(L$Ayw*YTkt04o>`K(v8+C7h?t6;*dDl%a2g98HQN{w7Pw~6Q at pMzcfL#G7~J$Gp-)Mjn}df4aIS~E^qOy-vEKH(^;`8e_sc` zQObG9xVrEv#A{^IhKn(dikKYzj0)k|-5ishl_TzIEKL476Dl#OI2);!aByq<2HUY3 zFQOQcpHy;<^_B|ND3>q)J at 9&v?j-Q4N$PeRt}P?Rvg={hp-R7Xm8deKxGFZmwW^kY za<4|$S|oX~b4lNGo8Dv_!ONLJXkBTyP=!dr`%suu!K(GBoW=Xa)nh?Wz5}vV(JxZ& zuTpPmkhL&-?1ak3ot_^#1)8>a$bS1c8=N6EE2#a=Lk8K&3CFs<=MzTwayUF~o=<-S z`ZZT4cLI~t69A-hY>~dBxZ63xtW#lQ1*-duwQdMc0+7G6&hcr%=Za3IeL0O)a=qoFd9s at fIRj}7Tkzt_ znU7lS?T8yWp%l`)VhD>{RkmQGB-WZLi5y8xPKqm`;RX4y_gW3(?X zu_oG at UpKT&oHuk3H7ShC4Log0o{)kh1Te#;oyb|N{+xihOP+}pCrx0Ai-LZA0BFR&CL7o*bG6WYRY=#Z>C&gMJ-BnnV#c`p$(NKk3{RXipP15c+jDJfEzpiX zYem!u2=fXyaEL>7r)8!sdBva{uFqwGIzRWt{xnF+YURuV=~UR9aqI-4&0|fN!^X6G zEGedR-mkG4nSFapoRBtSQOvdBNScYar!A=P_B(D$wDOFG2Pvosoa|b#_2eitK2pBR zCXTVOrDZc at d|ya>f?YfiS364gb5t&Y$+J}b1;!SlF{vdQpU#NG$?KdJT-p$%F-jpX zQT&xSMg2}c?$DB&%^YOdt-ZsaI{7=i&>7k;lplSZBt1eg69|7GuB`Ea^gx#*8~tsa zskdl~<#qV!wU&x1)Va>4B$Fid)Zt!VI0bukIi&`aUhDDAhV+IG??-YMW`ULWsNG73 z`t+LiuOAS=(t8m5m-ONzH4S^%Nh&9VCkLJj5#S1O-5liqhgEQ1eng;v&k_ljBDuD(xT5bFeVJNjGE+ndB+5#)M zFOQ>kTm(#!l$PT(^0^zgC|!E4D7e4}5<4Sov_(BrGj4kYW-_vksGM_kA_2X?nYM(7 z!Xg?#?vNRpvy^&f`_{|oN*M#J7Lnb{jXw18MgWPsmOS*L6md_e at db(<3cX at E9gzU? z2HFPVhSCOXHbzJwb6A3a4|dPdi?F6ln9J))QO^qRD(?CBIva;#jpd at _;U$oUVxELb zoQoeHqH0{Y>lokO9FGmd+jp at lmr}C}VGjp=AM=F;c7cYT&hOZxyyE<9T-Q<%i at U9W zh7hc*BThvZ=CJ#odb`uHU>_9q+$pG7)teKL^(t6kP6!}b`Gy{ zMbW&(OLsSze-c;?@n;DVSW}3ke>TiZvSPW!{`UiLfb|E%jt4v at GW}Q~0JNCOkH4(GQD}i zuI|nYRyG0SL3l8^m{0Q~>u&os9q+T}0-mI9fz25vc*T}G)zg`@K#$tE;QJc~et&}> zq->#h22kyTl;`M-EMW;|yDvWgz54dpVuM(?`#dAh4XHK#+rrCRJzs#Q`Zxp7%uor` zeN5_5<4C?XiWaycX#Jytee`G^{Wv!55#^@v$nwhe$oTf7vrszRH#(UHuv|F3mL-~5 ztZPvW6ZT*Qss`8O);D&S1|*x-h)6$sj!|4(+WQd|c-61ELZTY>2`wg^FNovM$ha@{ zQOod}rH9Mqqu{}rU76pIpdZd@$_H5jsA{Dq7(%%M+*VoMq0pC*#ANp)PaT|AWu10u zhNRQ90mEQXm3!*U=5%6suB*|MAC3pjEqgrL_#5n;+06m3c&0_QWu?FUVLY{Hx+lv| zsl?U^TzT589hOj+^$gZ!xskb*@n8c+67xgMtx$lqGDhl5oMHy)RypaZPkRF_s}B{- zrUqI;i{M%;N6i4a*!6xh?LInNQbsp?>jSPnZ_LNVjgpq?{mj8=- at nbJau$2>wg>z2 z<>=2R+5cGc{=5hn>DxK|>z?@k-cn|RTBpCMF~)6eEhK`C@=Zlk7s_BAjRZ;D+6--* zK0``v<=lj=J?S)(`DOBjiR%NZdkG5?H?5W+>&Ewq9d~+@<||3ZNNn0cw&#`OH0Lzu zQTE1P6ZH|l(Dy0NhOJX^*@+2=ia@!dOP8niX;Nu0RDP?_6BVI0(S%M+nA1YLb(j#d zmy5Qo2;J*aR+g{H-SP7$64I36fMAd4E5mBK|K^$EH_4DWxuQCGn5=nFOs;|C1t8iF zHf}+Mo4?7l0V*1=(`68e7z{RIbACtt?*-XT3BO|6jj z+R>S+8EjS1K%4r}r!~xF*E|1?N(f;=#OS{aS1>#tSxG8C!d6X-+@!lHr^bb#wN&pL zP3=%c1xx1~7#?!ZFZYZlrg2SQRuy0Wj=E?bY(}a#$Y6(i33qgFEwb)~^%4UIE%d0f z6;r;xag~Fea}%_BC&TnS{Mkq at yZSN~0Cr>t>V0 ze?Xa_d8q7Tp2Sid@<7knaJ*3wN3Y$^hN+7Cs)WV3X4-&>TZoi;(Cgx)m~bZeSO}SL z)>aDfClZB;)%{LS^Pr#y6&L{qXPe-^a9hYEQXA=wxuA87=c1iD2G_c|90Lf)H4+IU zGMHR@)fGKW-nnK+nYRabh z25|rIKST24&el&3B%b!o*GF1rv7*!VV7wQ7)x0e~~V_Pi|c z&iDF$Qs_ouxr$x^X7AN6 at Ytfbwp1_bBMJx0TG;#7b+Ub?#hN)G at h9~?TtbNfVEII5 zP9i3R?nUQ2yNB6%(a`|b-K-Ksoj~jxu7v+D2N4O95cXalLdL-Hy9$&q=TgEez!t$< zH9XP%+mCVK-Y+`e8Wr;+q>ed8H-9I_V8h4PtHzoyIj5M0YCcYuVgD+QS+p|dEeX&V%p>)nkQgM1VTv!YR zlYRE15cw|jF3bDUQ*jy7TrElu*LJ3>p$HuJtVz%>3cBMYrr9oO2)2Q)A~%PlBifZg zw0f3l5;*hvw=HQ$cN(Q=;9tG~kiL9T{U2yAJDBTRnS1=B0w?ca>*oGnL2eQVtE4G{ z_JIN7Cq>~cuJJ7yqwKepMmTy#=+GBZBz%w{jhvKm6uOO#h)2Jk>lj?Til#-bd4io7 z2cGs;_gDyQrU^BZk!)U1{OxSVhmB3&5ASD~9&ID^2EAe|7!&kD#u6mfYQ3)!{x5>P zD9MAT;i-Hu2DG8{Sajy9F3XP2%*=;r=@pt}{gW(=1z6)_03J!BC8mP2^8Nz%IDpV? zT{ff2ay at 7NPR7B0KXrX=Z_?rlhq;bZOJ&6nRWqK3M`F639y45}#JH2zq7zW1e;RazTG&Vb{PSV7LG?fZ?@Kzn|@Z9=o zHg=I0Hi at N0woJ>0S>5;ey|541)eBu?D3VHeNo!3F_UDci?W2eAHXEcPhqXBhPpZS% zUwq6vHYW%|Kqg)3ai-yyJSsT4wWW`*{d1H!R1_F_vK3Rwp%;{FW$79&PXe_RLl%=b zi`&_y?fGS}MlB at 7aGi?>QDd5GoW-kCkFL%c6PtXI;^xXz?Q(A8J0_q4?!u_ z&E7j=FT=VYRaAS(+<^R8id$tZ2rOF(6j!LhuxU4W at F@Uk}ig>Yxsaz~F{7gBDD zchLS6*Jr;papO1GfFllrGBc{S+BR9YqH{;^$Vf5k`73 at o5ratS`LVSX54xdJg-#TF zIZ3H$*fAC#L%w_C8-=Vo0=1B*8#coz1tEnqhcT^n1B_nQ)s!2;U)SGxT_m$d?2{y^u!`4A$p)Q`- z0+BQVp6CLv1Tvi?!SjM at 2+43W1dIe%{P6|RTm at GkwDDX37}M>{-~uvkFC9dEcHK=0 z(+my|h9h>Qx?yEOg4)a*6u-2#e*U6$9s4~Il at Hba!q(LE`7TQu?RGSJ5l|(A?!Eo219!^K1jtyH9 z at C1iQts=TQS=aXZ=l3KOTb^aw2o*GDY6b5yC*fRv at 5uSVrG@qm?gW}x&*p at 3gfdA# z{)`T0W+jF>i;R?E6l7$iXJ^(zjAR1^xt_6}6rCJB16$)4y<}SIDS3A9mf}M{1NDHq zwmN-m(7nTTgD^^PQh>vLm_hE3-$4$Cx+tZbRcN#8ohP*bDGW}sDAs~avM8r4uLued zt}hG at RU~1JTz9ZVo<;GtHHfLavjQ8MJ$@y)dEf5q^sn~ps at 9Lhu<}x?nf-Ouh46Ut zNgR2Y??21}voW^gxPUk#m&*eocVhjBlfHVz1hJdxLih=gE2!^FIH9A+_K_ at Z z^TbVWvajSN`hhm)3zC!2O;junT`Z~*Ml7)aMrN*(D>*}PfDI)vUk&~kMVAHVlsB5_}AJcoBnG! z;!)|$v~Mfkx}QNGh!>odcMFalZ>_${a^37$f*|^kQ|+!>-jADCo{yE!kKNs$U+wU_ z1MLB*`qFzgNJ at mbeVyO7pbPLHRmR)(HSj5Jvgaj2(ASuvu0aV>8BYsHP%od$)puGK-Q)2i<5_P`n{8W zu4{DpijKF>ArMj9wJb0c8N)hg at g+8~IAaOR<~FWSn2t>p_l%3whj29Hj(5CJv_dr` z#*H5oo-oCCSz*(qw*AKB$S!7#tNkghO7 at giKQYkoYh<8KO7R^zAxK0z zlQ at szl>@y`dCOGe7+ZG`n3Zq7vZow1z!ur!)5Hz5WfHB*FwPkJ&>5sL#G4d9^_!UQ7pMolxKr@|6DufoDu_50#uCZ`%DW zJ!Z=4T!kB|BGS@!W5=HToF3!|qOo0BVM#2fQfuA7T>d3#`Xx}M#+lQq6yC+ at os*-2 zq2Rc8|JykQF5IklLKMoNgcA(h#b_qARX7eHYEK4j0qBbskctUdr|mhdpb950GZ7mGQ8Xd}&1~gP)*0%LzHV2$c>s!TuTL z&Cm4EL1t&nCFXlKc|Y4!1$q-oc^HFG3 at pUtAZO)6_VsbHdl`8OW=Z~$Kx-_!)#_(# z&*OqVUwImal27TxR`uDO{aY~9l@>8 at 1f6~(c}{T#bKXJ6!6n@~tscN{%~8d&Nc}*L zJxm>yIY3)j;HXkvhy-lne55wt==ZTyY)8+Di&Jh?X*@}tS9#nVYXZW0NyTh#Ws!ah z%>k#g%4z8do8;aF_;TX?0_}#NJ&g|RsnEGVi{4=|`046?&jGT)%h7*T|K?C?S*E$a zDTQ>C-7S9$(&(Fi>56R`muvMKm+q!Si#|Yih;u0#o%?2Z2mH!agj%Ox#J`jtTvy09 zRx#>o at ys)eBo8}h&3KGj{6!d_p(`BAJ^JPK<{_FC%!gV5$}KO!cqR_T3Cz3YSEHC+ zmafQgsV$`-=GX1q1H3EHtvuB`!J7wCFx^}q)(v>XDvn at zXu5%Be}B!d&?-ORIJUN}#VfJioFwuvSb8=T-9j2l6-2SB1} zOJ$<|p>u)`<-KN%$AGDG1XI*{1BEK*ko?3nzt{m^ny@;ydb(P=x`vvD`a|uxDJK%p zDaFoCC48V7f6)MY>Q$LuMNPcoFxbQJdB&Xo%+HPcwubAF*O(G9F&KYGOQo1+2eD;| zU<t+cF^qxX8Y!3&)I0e(8z3*i+& zaATeO_tB*2jobv2AYZ;bLVfwd_kRrjf1S2U8z{tROYVUd0|VSH`j zp)nRje5<$5fOCeF(zIt4sf?jveh-q4vkO at NeJ1JPx%D z;mUeF6`Y>9l{n>wN(PY1pXNksl=7^2KecH_f|ffz&^jW%#P%kD_CuisXAZUMfUQz2 z%s;lcnLV8e;GtDZZKjO^ZUYPoHigsBNi`EqebaL!Qbw#)G#si~Fp-4Y6s$EIaY at Geibv^DPEbW6X}!2X zG7NbX^}CLDFYQ9cuwBmx+M|=8g9Qt~;7$b&Yf5Suoi#p(!rc!f4x!@^18bItq&C82Y)bLJDmffGExHi3i|Q4hfrw1ggK zf_(^^gp}}4;aUCoT3aaZR8EoQFy8_2o(4n)b;okh0fta+J~KF1``JbCjshxulaJz@;bBPVE{sjjXu1Lf#Q<1NHVyoL&b8D-7nylBIqeSzrZ zA=xbG<(jkFVS8l7Gg722B6ajABK)IY;|b%L2bcwapPW%7zrE%A{_XaDK&evf;~!8` zp#LLK{(It>+`K%R&n3Vz&GA at XSVUL=w;DXL**TihpAar8n&!r^SzEH!GVe at W{7oS> zRqvmmICA6SXfD{WnNOdz9`QVK9%XN>U-9$%f-{7e>Wil)GHeC_5*a{J;S=0-`iP-p zummOgnKsabe0l1t at yx@^)Z5~n@%rZ$CvR|t>?Y|Pg0~{|Z&H#Jv$?r7wn(IC3^7 at l zOE`nw_?aO#c?%}K1dkLO+nY`e;R5aR z^?fFhqEW>#0hi#-CUNm0l-#vxAuBVT=r}4mbor}uoYC* zpVgmb2#~zKISs&Ahc%9!UJPnlizZx^=zd19r6~w3fuq;JW8w33l|?6?Z>atj+*JU< zR!yyCr77g>beyVyJzQ3Vup at Qf!Kx&kt(v zJWE>;5`E5KehZ~ai<%Jd2Pe>zuUh%0P251pE!`A^M!g-s$NP}CX-YbS=9l at 45j}|(Q z=1v2K+>+Cf0B%DTp{_peC+JOb%sPohV^p4fg+VuQGkZB4@@xZT<%*O`FmplycG`LV zMYNYvgk^CZ#L;7N_W+|G2XKqRM6K6aL*XeoZ+}}=lDCm0@%*17#r%Ij>QF>S>nQab zpl{}QB$A;0f(b?&R$EMPFQ#t*tRPHR=1szfA$z at dWhLLGUcys$n)j%6n)C5)>*MME z5a$QhPcTA#tv(}6B6d=lT*$iNNZDrih!CPh)a@=!hLd>v|Yqiexxi*m| zfVT?OY-Xntr-W`Q%=(S3r8)?8B1-BKEUd|;!Pm6etMgM*2!=p5>4f!)U{xynx&cMb zic&P13O&1^g?!_92Dog;MA{2Isr93W;1j#`1vn1^GMEh-j`n^>DxsBM+?iXBJOx8H6~mSwSlB{tzC;>gRc~-ajBR~@%v9(OIe-0vo;I9IWG|F zdH)fiGG+Zg0o_0nE=#M%P`n}Kj|f3~IgVEL$0+ZPSR$3LG+Kywp$bOax1FS_YO{Quj8^o;bO_#?) zz7do8A;oWnUq at TMrZk6%7cd5LWQR$hpd<^48wBc?Ext$U=QYYhJPT&omR$h$F77gp zu3wlW-KMVVRt5HJT}_qknPfa*430U=4R4Dl2Af#rg+ijSihMFPP8nWIV}?|1Y{k&a z;NRa-^O;qaZX1f*gwFEaX!IPgzrHXd0Uvq&wnv z`iuM%;@_bPl0pc|0{!wO{m&QUT=|%poD?AKO?1i zfYw+_9s&gUi2dm=iPS*_s`1KL=8J9%y<(@ahJ at ycJMu%q`S$pmoxPKVCYE|vpyzZe zL7Qt)H~-rW<`1|oAad^u5%~e^s0$7jFVdeF zs6nEO4dca@&_cA9 at rFySEA2*MM3WlPhqTO*uJ$DSN at NX>bNSM6SgMnZoyAhpyNN5I zt#7djhg9?tW=7``3d}z!A>u*9bTd8Ajda&faUfMau?1 at J=zc68e`Q zy@=Ops0GI*ZqPjCu4x;3?P6M2_ofZgiPgC#9jdeOfWa-3JpG#7b!lZS$hR4*HJ!_n zVv#|-j`j62o440r$a1?H^pn#^fMcbHJV<&~>yqu%KSbaTrMs>ZB zJ89t%?Iw$6kFy)_We3^%?2G1Jkz$pCS*HrGd6Y`;%7~XthT>heOS328% z?%Y;{W((Io84hN0eruQkQH1 at GSBu?q}hWa2(#bmflei4KT^#gNn9 z at n)Mtp}v=bUUN=1eutlLIlNMen|Is%#DkfaiJsWX;t6{D#lOR(*ylRr=ChY8z& z`jcSh1@`x`*E<6O({1UYd0eEpHS^E*wAJrL#-bC+BilU<(KLhu=aw|6Y5un2{NIlF z5Y%`B6eZw-HDy=HfE!c at D4a5(5E0Af*6he(Be zusrq)D{?SWsa+UN;rPngGzJmTfDzT2({WZWX@@ASFg at 6P9GJ_v4!JYV_>)q9_js&$ z-Iq&Br}@Twc|K4q#Dl*L6X%>$TrdBlr6PZPoZ$aw?Ef)gPgLK~$=1RBzrEaFJHgOC zwb_;!VJKkye-MPW-KZ3Qi=$Ht(8GYhZlbxlVXD&3YbVt%Ip5?L&k<+2S$(2U1IS(d zssq<)b5Ho?b(g6-4V-?zKUzopVs1so5Ly^K2nJE}Q(vT?N{Gf#YJHkXn(UVRjhG#m zj<#UOv#DW1t9$@y(>KJ1`c1 at WMmNm>w#NfB^vtk?5V8a&h!qZNt zvrsBog$!5D8Oei3%FMvt+Y)i_EBY+aA(Dwz!yWm(3g|?5R(Ua_>V4~P@|(e!26^k% znCbAGzzBom;;bQ9G^Thg7`l=fBIS;FNWroR$u}>1)5Z zs3e}J%XE4S^Xi}&{zP*XUpSs#}J+4BX1~vv%D_>Rz&`E0+lPHweK)ap2N?FcA7xuPz(j+6JSt zA;_FyHZK;hBX=iNEO`$W3MY5))u0atX0>hOf=SnqLt&owxv0lU5T}CvoXJrZ9z+Qe)ceE zKCuD|V!uDkL7vAmR7 at CK1VcVbjDUJqNV-o(iS({YVRGR;e_JJXYY9S9MA}=qjOriIE5Vj0l*^W!gDexpR zMoN3#tWAGT`6Pk<1O79hYb0{&>HNvn%W3GwN&^In-W-cH&1E_})A513dGr0_>=yV% zsU;^6L26hTg|;P+j6FeIPh*%CuNe!)T#QQ~IM3ARnbdcZHf7wu5#uSEW at U92H{hYi zlMWzD!>#yJRT8I9_Xvm1zAd?v$JKGeb)jQw!9QQgB6x&M1|e zPA at t}9I4#gP8$({8nu^WP&bN?Dnwt(M$z-NKiu0X(KKYXE?$=nGeEHeI*sd+>DV$~ z9))R!vES~k%#F~C at RkTo?}-h?v9XQSQw|Q_wu8i+8)tsbhvLD^@$|r~6(VZaC4i5y zp$kPNsTy=jp)0&Y%Scb1sAvUdkNot at UiQ1Q!sbR<)anqfcs2d%87FrEE at 8ZWEoGqR zL}N84_-H`5+>TFiiU|S)g)0>Oyq>)X?EH$Bib!&LMHO!xz(XU>PYH#y||2v1f0i?M}pRiE^;t=khr)}!(KZ{3w@%aS-tXcJ0|$Gx at _%rxYEL{OUdq-+L_i` zwW2(0rL!9d6jOrxR5vDD?g-DpjEG(n at IX}PEC!J{n)jb**GY at 6L`O#JJR*ZDblxy* zAz&`|yBh85TPohK7^?!_mG!S!L`8;G02mn~ID?&-O>z6B_fMU+E^}nrm8EL6S8~|# zZsB4O+9d{PLMS!0dC3eY8Gpv$zCX(_wDo0O#Q3}6G;7AVR1>MGPQ*^h%nizgcxarM z=4RQLOXODxRoE*UzFXm(6VK9eh<-wsR%juU%@*fNRDfpXMI{^)(iVLpSl`7DU^ejJ z5FF1p&At$787~LpthJ~oL|CPA1Z>Szh4Ez;sh~R}yc6Q1f^x{M&>``v9c2<)hra%c)ti6~Qxuu0sk_GbI5rVvCPgb+RFiTf-^Fz!W#EPz$b zmIk?VBmbfjpyzdjXk(DTfXmFkaq9baBJr{%RhQ6mJM#l?kHzP2cW~^Ex+K*9XQ*ZV z7qxN=f2f5xZThK#oEQ;~DI9dDcul7b?D(;2Hw(2oFq{`HRm4rYN!NDM>-LQE0qGql zjG7bWJ1mB}pH_#4q|+v~z}D{g>n at XdyLEEnQ8%X>1kj(w;-tnkG-uXF%G#PK3IlY~ zTC|TMOmZ&5`32y5G0nbFv2oYJsC;IyGoGD7L<2Omf1vi-nGGcwR4Hnp^@8Z$h0e3> zb8k>z_o&=rE5W90Fo6OlIueOm&Tbskk;vKipGYf?Uq$59gp<7_0*;``8%&T0B`*)zpYLIr}@ZEG0 at Pt#P)yjMUF zG3izd$dfe at XJPR8sS=43H=jS$sw2}q%Si)9PFqIp$n}-`dr}5RRhFSujF+iiMr^Da zMW+V9?=o6~po6W5|4{4p{)bwd9G$X?WR&(AURy33=8f$OvbY-DAuH#5fNbGF%}n>> z5qqy$gi8}Y%$~}e&E|S%xSl$+5Er8)CO_V(d2x;(Mq5!)SR0geRst4J?@|vR%4XpE zU5%9E at 4v8R;l)2aSz4NTBh)aS9~vJSI&^Mb2 at aEW z5^<4n+6PpYm+o^Q?=sE?Bm`cd&6ZeZ%I32jOfMXG&PXYm5-)gji0yxcKSS()HY>y^ zih()zL{a&+#vCBjZ#gs6I3eHs0R7t5C^G at MXmQS}v4Yc3*Q{C7JiM}Qczyx+mMMdr zL|C3ilu`U-r8oV(Vl*fE(9`gFOU-9KLSPSGWPw4{Y$3k`FWez1KP4L))EYnv3lTlz z#$p_MN8x=%w5p)hZQ2uUhu!_RBZ^-!$YXu}fGhr=gUj;I6FZZ(sA6cJGIeh3m%o#m z2pPekpsn{vX!5?Ut#J4al>PLQj~h{pNiaU8`Dt2kpFUKgg9Ir%^MT5n3>)`-FY at K; zE;P`MnJptwSlm*~dbw^pgWYzkBW8OY>+}6%5$B5%MX~;Fd6=cSlfDLgRf+yy at Jp-t zo+m0lL*ei2yL=F#?c?8|AEDfQDd?uOFudxcNke0BLtb{e44GOFg=&>RcHx#OcCYw5 zI!L<5ah|({7E+dcnd+f05bY#IP)FW670~f$$(y;S%Ko`~upuiJ-@=}{?1)W+Y%8xr zh-gN|1LI#=@F~YAtY{qAVfuzfoT7W<_kgr40>q9o%H at KhWWV9aFT-?&DGI3 at K>F8b z1KS&a9zGoGTn>TGO(mgdtX)ak{H#AjGpjto?w at 2cG&uI5z%JK;^e^zR{=G&9N{viC z=#tnW56N at 69uqONBxW_yg!$dao3dGF3SIfz027VN!7jcduceO2?^67D$E)8`%#f(c ze8Q?`s9HBe!rVeCR%Ogi7o!73p3YeADhdx4_=~6H_`l0 at otul`i16M03NiR99BVJG z)sBBIdF!GBN$264uq!`aOD;anpgceAD>MX-Rd~{is)|w;%Pq)V&bIp(XMgPa22b2+ z$Rldk9+$C;e-cVnmkQ54D<@VFEF7NaSIU5J4BbK zQ3F7S5ZXTH+RxYA%B`i@?+tL+UKn#P)<$+{F3MXR0Sg~195Jv5>mqyfO(gGt at O%2k zyJ^GJ2GNG)lpFZjeTa0#{^oSW+qpuA2RTI*S);mr)C6t at lgRUdA2%q&=_IUr=WSb3 zZFEBihe^vDmS{$Qf&lyW82%MzVUz5JGKZTogk*%fFiF?9q&(dMcrh&sYH{>iq{yW{X zmT~@ze{5y`e{L&T|GP~4SBo$?Sx2)1Z2{&t5s`&E?|0GJ!PGeh zQ~~~9`NzE-5Ze79LKMc5N<~;Gqvy!J;!LrPup48J!%mOz`tnH=FrWYfEXtsIn;S`ySduK-72{5`brGrKfn;lmfjVJ< zll3>F3<6kk;v_qgW;6a)!X%~j18`&R#!=${LYhHtxl;Wwf$=Z{b at 8Izul-5d_7u2; zuzgB;PjPqd8vPlw at c}8XVujX5ULF=92GY)^vVN+kGXPbt$S^`X8Vj4wDR8lSsvF5L zKjYA(J>_Tm1T$WX2K(WZtAg{%#_xHN#;@>K_Q)5 znWr6;3$EqKhZreZ!j3MBl%X>7wD&vUCDZLoEaGfNy>-+qx=le;tB{OlYD?Fl*c+xA z7eb3}+r%<_!RS0L+I;%r&dl}zRc`i at ljSb$%ThzHkQp6a_zF0By7V)?b(2{;dVfw` zQMh*&=ky;sK#`;ugP-7$#0d8fM++jdzqheJeZMOiwM{$yq|HsSQFgtbkrPV2Y=^R! zf+G6P!o$nlH`T-EiLLO0*xQN5zk_nam_nWbc;O+i*CMB0{@^{iZ;Q7*c4xi?_gkIK z+rjeB5yvpQxt+bet*KhyBlp9}zT$vjJkXEWCky74wvW_HypBTV--;!%t0?2&njz at 5 zo=d-u-R>os9T!-@?AJyd;l0}RCJBS+6xO=&uMQa2NabTLX8ca5L+U|`Ms{I7F~=wD zbmN|y+fM!VH)w*9DpCXfNTT_FE{Saa%w;F#aQ;XlJk3_4WvL-K81^@U83;HdKeEEX zAwohV^{;DSMwG+7SQBJt>J2*NPl=WvVGlD(2};x|A{Is26(8KZs^u>xcI++!NlT*U zz`rE%s`I%s=K1MjI>+ZLL(DxG%|x17C~-gr^xaN!JPn!NUQ^h#wAU2UIQJYh3|v40 z&h!(kO}m!r`9+Vb5h*Z}iV;w;rPO=98%#W?+Sx|^hSzl#Ptv)Y)T+7HRWKxzhkVY> z3c)}Up$Ox%Gu<}5#8sl};LA_N=x<>Ayv{U`S+7#7#yU9cp{ zrkrKnxd&@o6PrlQ6|W3Yw0{^k95r(N=>@oD2xN5iOWW%7NkSiqsvVHlfj&$^nzT0j z74F%Fjx)GuYVxGdnqcd+G>zyFgdC`raEP*=lEUX9&zT;c6QWE89AcQ-P{#_|3uUH5 z8a+=2(>6IJ2)E>)+WY6*U})+ZImw at 9^*{x=AN9PSP|0|;lGKiOsSUYZIxmB9xhdO_ z1GGIeDAe4%ebGH#5NJX2ye2ddh~9`fw at G+vt1METlp$*r&Rd zr!o4O4P-38V{V{leL#l^`kiIWkLC+O-q6dakkZcYCeD#xk|WP2YHo-P`e{=k7c9;- z2Uc+kSJpAk(~vyL2C at Z`?H}%BOH)tOa6mgaL zh=rqa-;$Ul`Dy71g9Iq^3#hhu at 2O1AqX}0!$LH7gD_ at Y*UPTxTy7ZPrVFaM!alZ;_ zYqEcsI_k2_+ej=$+Z?sNwRKu6_SrPHtsj*+sJF-Uoew z-qqQc6P`;Wge-nJ>t>}8EZ`W%okzejYyu0Hj5ggk0~R&Gs!$1yl}^C~$AgwZgfxe& z;kR3TlUmW(fxhNo=erMWjycB2>nunqeP<%;x8$0~IN^eYD)gx|t9-wP`Umfb0fwD at e*1&rf4}<#D_%v=y})dU~gs@ zNb)u+qRXJxNHw$7Mt480Y+qxtztk5BwvkcZXp?I6=mFJ1HFA~uFXy_}NA66gv%-V2 zRslb)^apRJw+j=?&-eNJkF&DJuHUMSZ#|W5EK=>s2o)-gSu0WW%RtC^xX=12>B{G* z9%QL1E`i_&#?D+6iO2bTC!TKE<)v__=C@&U5(Osv1bsde)%Queo3yjQ@@mcZ%uQ-( zL;U6iqUL$PurM}kOTYa2VZ34L*;Xdq#?Q zaj>D&tjG@^i%^LB32~g%?^bJBw+s5cPe-f>A2Q$LjPK2#B{DiAJwb5KpT%mhSzS7tOEK|No;qBEHOU?n{<(KrPhdhLZq0ZM;ve9!LqZ+p8c(x zLTwxS^RFgq(SMFN$3IQ&zwmCd?2%YU;?`0ULM7Li(13}Ofr4ji6z?OAE8>$)4y&)p zj#{$B=D%;`FN&#DW<^m}$=8rp2&Ej at r$uz4I}i*qgjp*-EZ^oHaD0R_9IkvDnzAWjFhS5`z68= z$ZQx=aq?9$nHU6CM=(l`nqTsfG#NsbJGiHr*;!7&L at POxPS`x0==anQ3 zGe&I&P$8Qxt|Lf#wntaHX?vWm_^GZ9WV?x3!szOYzKpS6h~{Mo$Zk6!CE4m{pV`{5CMk}?2!nk>Es z0%sj|WGY+lU6UhD&}Z*4oLd#&y$5zeS)>%009a(?8{oKCeD5ajHYAy!X1tr6mbP96Q8{FYsW0HBETqjd``!Co{qAn at q#zRVKFRSu z9Y^ApMWWtN_(;sGp at Sm9SJuBV#ca6_9u0ktM1lvhb0R=Sz1t9rR&~l1{vC zT&dn7I5%UAJ6jZ?AaSf7J)^Wm#sbIwC&<6UpTK$G z_CMr#IsfmTm-_$Wd3XQmd9nHFjLi|NJP$ld{&-$T7DmF^f$5u+Ss zZ4%t|j?DGb9UJHGPq&9SKfuit0vXEmxcvDhL}!CI!OQ*KgXJYt+OkZnGk(MPk z2~M3}DtbEodLLaHBqN2I;&m$ahAx9G7=KmwRU8CCKT~!K9T1?HC5;=r_%Lby(rA;i zb_&=gY*+&JQuRlS|7x3VQlHs~&|6AD79x2+GKoCT27v$4Zj57H*whL zkMyGrGl)WMQ`{IjOMo=vycjya>u(TN+9N(|OCxn+3tKa8-2T{j#OM1SZ#E+(9E0fv z&$HBbm&O?619O8tdzQywE~g*-K$s6Z-4C{@z5BPWYc=T4!SP!o(9tXe>b&q1eKs1C zx%XWCMS8dLdwv!LR1y_)&I!)&oDI+TPT?r`<6Crv*;0*)u?c672jkxMohgswQHS<^ zuipf~gD_~uQk$_vp`97;4D>WRL%aK2k at eG>yAg&tXP|Cizaf`JJsJN4dn5kBUhQ-m zMvT#oZ{1hdrNsSS9j&BqvYq>}q%9}^g}p1Xd5AWDVQ=4G*t`4}_KuFv*Qz&AXR12} z$y&|-6`Aqhydy3vuW`50P5+8atEj4>KlUgde_^kO8QZ9VQE%Dm$lAR8*Teyf%s+uZFS5AMar$V%^}s|90;rT9{#Xzs*M<{)L at WI z9BlQV!4_PNL^YHbi)@p2Cm^rS;_O2@(v5Q}UBK>E&aEzfyzF=Mh{6%Hp>*pJKskn| z_!aa*_F|&v8jLE#VANfr(!n5hy at qOR4!2E9&FIeee}ix9ppPCZ%Gb!4ek)*Ca;3M| zi}t|=59|EC^|W-Sw4cVi?F)Rp*RMZLL%lCO%d|2tRd7xUbftsmTUX?4uGg=FOB6_|rV at VA=k~JvIUaD4HxLp{ z+c*{N_>A++&lj&_bkXn)U;G$1R6wJ~af!1H{u%m=H$u at TWrONN3}zV z9p+G_Yx$u|*x|m*qi4et^*gyNe5S9QEEne*yHz?&;l6^qC1D65%-{}~WR&^JNt_95 z8L03rn7?uoMs}2d4)BpD`-vDHv)C-=3za1KfXVTM(K#2}$mdG+M}Al}K%$_i(EP#C ztXo3!NCKur0E|R#$e5&LGzcoBq)DXU$q~M;M^Bd1>TazOeQ*FZ_4ABIN_X-- zJ`~^=OeKo+{YfdL+Eb}`;@!_nhpMq}>J4dP#5&H_um%!|`6%7xgVwBqiKj4;`VG{b z`qzP9I!_|uk>|+i7-C0zZiSR$LJ8QzYY;y$!C*OPL4FZ5CP^A))=+vYuOKTnr3;f% z9hwpe$hqwFpaCJo&B4Xci)`f7Vb<<6MZ75IBfR`kGA^^4vp3iZQ}lbGF`H56+(8bu z<1{x1y3yE4rJ7Yw+t`3qslY?57o|;ftt$f~A|h(fBI(;W6pEVNq58;kZYpF6?5!@L zjU>9h8+B~({a*y!%-i4`Fw(XZiW^Ifm2Bc(9?Il8Secl>;nPJY+(b2EH(sE%z7Jdl z9oj}%fPXV}PkO#>>_wZo%)_)I?fMr1haEp*|JC3s+I?R{{a*y!JogU*CjBDdyQJOu zjp%J`V>6 at WDu~Er_jxF$YUv}-hG-YTamm43YZrUkP=|59co7^?#=yMfv=sE|-*+UYR_*yM(G4xa5^(t^*t$OmI{vG{g`mF+bSzn*`~x5U z7{?N)fCBZC`uUtVW8{HLuY7sWjU%3 zW!@;^grE5(^P>L;GH3cf5twl+AHgWtn&Gc$T}B0|GaZZSZXzh!-#XVEn&9TcUTj)b zmTz;5AMt#RNLKl3C(iwoIZFE3_2vU+js#y4Z_xek1l*sd|3$!IPB at HTS&r5#xfWs! zltn!{&XM~h)M1yB%p7ALf`W4l3Ij`wOfCP+Y}cZrR&oCo=dAjf7lBwVT{%-3DhF0 zn?c1*hH5A6TPjoH_KKNQWBNA}Y_RE2y=y zp7)mTPI!Jm%f{=hWc%l>m^_Iw#htPO@*~Ctp3C4-EP0)$ zD`m=YDRM6Yu0LUR6?U$m4%Z^^0J?nn`*|Oa-_9;xu%CMN7~q}`3#q)n^|Eyx6W(1P z*07 at qqnu8<$t9sOld;%5+Sd_B^-*NTiJ_h}HG`}7;g2to576KdZa}L{XP at H?vQ!Zy zIYYVekDrPs1uuT`zTy&Oe*J&)N)9p7`O=sk4E};(^h0^vL$6Wx at Hi1@OI+^XjOjUF zqDMPqDI}TL1=((scnNAG4Z5ECR9gMyVcK)mB>qInis3QKzGslJkW2$%rTW7k{U!Pd zIoZjx?Vp7<{mvL0ao zELt}TV^k3vK0S`Ipx&8tKHCD#hTKH0(JEtETrh)Oj)_!|yb^Qo^ofI&?^uOyTu7ug zIE6T+Iyq4;L~4p1#XkR*@)^J8QfI&THx3&JNZ@}Y|9@&};khfd2hFtcAhdlxKA>e7k%c>htBOIyE-pCpFaZpCL}#T z4_o5*l_I6}_hyosT>_*%fzd at lzieuyjbsZ7(FdtC+)40H9MKD at 3ikdeNG1{^fnkE; zN3B0K5jbf%^q*NG04WRhzCDbG zSf4MHZ{8a&@Fpr^?37)67U~r*A_R#G=KkfW at a;E1?AFzkz$YDei?%d5xmUadS4?`g zk-+SniMozt!5oUPwLJ;rK^Pg*bn^+ZBTWus->wzO`KfZ`BjwNepK2Mn8G+l+7o^2Dph-XqTD`VDW(BzW^EVCk>n9uX01HDrh$5m z)`%P;q<)- at Yzm7%kYv z;=;e4vW#NXVjGu*XRl+dn!w&-te)>JiDAClLgdK6EyD|yc=c5+ at 6yYz|eKt(*X-K;b)Pf`NzouMV(>G){wvOM1Ecn6E3n7i=FVu=S- z<1)K}y#!~OJ*uR5ktCKX at +~CLV at z;f-bNU3u$ec;yoX{_Egk1Cw#DT*Rk37dPMKmP zHQB)dxDAc=OJPS7xiL+s33Oz5RuP*{VOlp9cQn5v+r|_}zZ_BEu2(!a z)g9SM_=yB at -giM(xvl&S8`c3yr|k46`6&ag;TSr&e8!Nq2yaOAW`j4zcEv&OYqArJ zL$~kad`)zfW%}+=NZ))$Ew1(b$DTQgT2D3f`%G(=b?G`Vi(Ki#uF={Pn8}ZANjMz= zd#EpvPE}3XdgioMbtbIIo!>6!%mcRhUi{RdFAI0P9lC~Z`JAcLs>-?o!CZC+gvce@ zBQf*?gRRjSqgDJ6H*V2xp-=E|(g?Xz6}Bw~paBWXEnGHe-2UE*P(kYG=bCkzxbvE*Pfu2pVZ6U_bUpLmJIeOF>`@w= zAWBR?8x^;cW~{BjpVaVD$s8|%lZHB*>P+`yWEX&AN0ZHUrn^0{%gR|!W1zaE ztsFaef at 4QzAiJbZy;s8)+zN8iyWwhtcj~;P;7@z`=r9LV2)zh~7=aNrkq6 z_ipkUa at K~Y1$*kUUhph*Pl zt)#Jo1*~h9!vdshn<+8SYKvh2{WNT#y?9EjNYRzQ{o`pt3pDEyr at -eW6%s||86d=m zP0ygYgOVU+OC_B%>^8E~uw9*zQ`X}S(AL)q)3{xo<)c>+CbhW at VbEfWr;s>*nx2s? zRL?GrZA8I8AiON^HV5(k&O6f#uRC-|?eK?K;=f{$z3#$+DKB_J;49r7tWLUuMVlt_ z0`+zaZT`g|`NY+;ILopr`2;{hyqr}Q>O+F(7Ewvju-&0TUQE`o&zBr2}W64Q~%+&d-YAQYRc9&R!ESr;w at qaz?beW||7)_E~{Lv_E2hud=hn zQwg^&V~g^*{GKimj{;@=vp74U=TT2-aUC+bR2#`LnbTIqy2?vB8?P)#?_g&FE@&fD z&hf{|faRwW1_4KWukdq#tv+|77S-1IXkhZ8sbuKIupmT_o4~%PnFp|CGPk-q3iQjF z{FCuB4aLKTX}V)kdZ;FTP03n0vfUz4Ka$?%%l=%Gu;9BBj$dDZ z^)1CL9i~Ha{&2}o)658Pp0m33u8Hp~SjE0?6o at 9tuf-H4B)I4WsTp2o3^Tgv>ps%b zm-EM;t?R!I{XT8BDtcND=fGJuC--#uoo??awBHm669q>^*3p7m>z1w!Xr>E6<}N`-G8=~-DzmNQ0* zp5Huvt3m%jZWe8-ehIRl#TAjyHb9m6c`?IFQrgwDc;t(RKjqqoT3$KLMLUOGtY5V6 zwM+i5_0*&KhF<{!1oR071jPD(T~GgPtaYeP{$mS-8O&-B0YPO5zkte|F6c;ZCV`0X zpJ*Daeg_6U08_k?d#juFkRFfc^-g!4-%kkM6pyR#SN2Q;?6&JP(sj!#fx_k+?TeRb zkK^9wZ!fpI-G3;H=tuyocR! zZ^Bh|gKuJ9-blGegVS at rzt_(k8ei+2;>W_T3LIYbVm`vQ&`n!_BeX(B53tC zckBb3D1EjiFQ&W-Yh|D`ddw*jN9Kin`{075M?D(7B at m#|D4OYfs!DeGdaqz==y?cb z5nnLy5UJK9$uTX018i4g*S_=2G-Sot?bip+W~#2Ju&;YL_ufm)z`KJ?=NdlgSpD)a z+O+7;gdjo~UA`-vcW2 at rY5%Mk`Ds|{op_fUB2}N-Ah1i$U9I`K7$mK$EKwZ9_1sZM zd3AZADkF12!!)Y)nYoXCK9H(i2GL1d(YR6QH%|Rxj^n&qbnv~UL{UcE;ROjVsrJ6` zB?2{{BhqsAVZB67ewFgmQ$>w!xnm&%{*YpOo;il2`5ZixlFjCRUXBETo&sZ??{vmx z4g7vA@#^~;FYb51R20vzm>VrajPtQTL(;INxvPmXD?U`5u%YP)S#?_7O)g#+*m|Wz zL1yL569oUJQD%>G6Y^Ft_$Q_W1R^m-k zg0LK)m>;{zA((ozQpz8i{n-tS?cXsA^DM@)%SW4$>h$_qvB-zk=gZ+|AOvCSfX`QY>OW zN9KTISi`)xd4fGtU#k&_1jO@$(z81z;@oNUA at h=Mg8nw2bQMnTy!_>-u;BlRpZ;$v z{RfHub2Gd0s@$poO1i8t4qZ at wK5d5*9atNCS(R*{ma0l1N- at F6tC4L)w`QI$d2ZK2 zurCmPkXJeZyWUzbiLd75*u@#A^Vw&v<(It zGfqHIVZ4wJT+4zG^N+ at iOT9VQcZwU~?HOzK*!sYnE2Bq$eY`7}oKz+>shj94vxVvj z25+RN*g;;=3vcBW)|CpcHswvi)lxQWqbDPI_3~Lm3%SD>wPX)Xl$V_5P|8D>-pcU# zD#@SYTyx}5%+`!ZW=cnRi{`M8HbuhYJQxk5|s0Il7takD&c1ql7iez1>?z?A at f|#5Ay83GBMRpg6uE?J46KBE0**?FDxlVrSoj_o9QE zTxMBH6pIedjk#0#A6{!BlYjsqvF0Tb_#`wvrb1w2NSVDqLeU{N2bDsp1Is*srdq?b zM)*nIAfq7Opfh0?iUwNDJu-LD1NE_9N^`oH?pTHO+3zA0Gg`4aZFlYs)Yal+SvTJn(0utbw>W{glxBAGQ#-! zct~K;9H|u$L25M#$Pz{YsZ=6L)xBA^H9-Hkoq65xAHNwzLopm&T)x*loXK at vBe%E% zSAfewXS(;KbLOqn<;KVDCBEOcCzPnXXvN=#Fsfj;&=-RUz3jQ32!cFfVXQUA;@!ev zZLl#;4UKh*w22tG^Np2Bu&Z9(2=v(CO`)wTR at Z2~_fqRNW>|&GQ=R~T>}^#^=Z&HgN?J5y?9Cn2IG%qVTlyoo)URlJ z)Aa`wB;-$G at B=h1CLv=^uWh|AF)2-7Nj;fZHlbhos$()EIz#4l$bnL`SV<)P3iWZ? z#~J=P9q!z5CTAo?RK5p5ziel-+%%)u!x|)T%k+xU2aA(X&)W3)zqq`IM zM=JIXPvn!XCxuEKNWG2%$f`<}AWR{b=<5t)~I6Za^ zL2MG+!J&vdxvsaJ`dtv}Fs+QQ&FQEAcv#<~QDa_J%h+59BrgI7(nqv%BumPNjR*tmq8I=DL at zb> z5$cXRn|8BQR0{@1B#{aSEeHsS64A~b7Eb^LT5-Wi-m>ROKm7yJ8GGP{z)O%BEO`lB z7^`INyJY*}c^4o$&+!g)FJaSh56&b9;f69j*KutfFe|}%8jod#o^e<#;^$vm>-E6e z(*>`ne$}}Z`8}QYP~w4*&VwPzg6ttsBU&IIf^bh*gJ^m1sZY3hcW6jkQ1Apegd0fG zefk?hUYLY(+Zq^pEUK06l`58QPeRNcQt- at Z^chuu at H1jQ{x?W+2m*#5fQD?dtn)d6 z at kz=Gd)D~8_4N;kAIvh+Sp-`@Xu$`N^TbWyI>nqiPxQ}Xww+%gz0%< zi8T?v=;^fP`EiQ?F>K?hQP_gVc?&P=;3?{dX=?BzA71c|`xB*si4IKAB-xevKtNzX3%H~m2V=ne%L0?iP5 zpn+#uG81~>{WJyXj;9C{OZDeRqeq0Kp>B)+GX$WR6{^rG)QX{(#^9{WfoxaVVV%ZV z?e?!BKLH(JGF_kY==PA at REih@86N?-Nf=PjkE&=VdgvB4(=`!N%!`OBQX$D^Ypa^D z#EO6s*9 at 1Xy>XZBoBpz5qTlu?<+edWZbWx3{-7?NN`fuf at v7C3DrB6s2*M)OE1fkTi}5vp^e{B{Kv{(J#hUGqUbA3(o^2A-4*Ex==iXL$-cJ z^i30ZVb+75{~1G!wm*6z4DS+TKAP;NybH#HnTlLmjUvvoxE=sHys9+psmNwMY{uX6 z_5uCShwu9VL$nw$v>amm^t8n at FtGhIqW#x`JBU-a5T12;O^mEP2;I()d|SJEPIst7 ztYx}9cQ7*EnylfZNU1~C*h at s5E%m)JMY2^Am{6!N&_ShYK`JqNA!kAXb6aW zLWQ6vDYwJ9pDDW-O?vS$|GpkOAlO#)zSJ$v96W7KdpOwEQ}%wG_TEYn&xjcmp5)Bi$MW$=(MeGqw)r<37E<8Ex%dh&3)se>e+<`o4nEoZ<3B<;ZU zr(3grnjjc6Y0E15^>1kYVS>Z~{e at BAJ=dp(G{U^#o`X zP!g2&-kK>zDisKg_gBb)u){XrwX?nyd%%M7g+fB7(?LLT0CC)cxXME?9*iJjk0~a# zHZ$KeH+SRtxP4r-2hz4sG2B%{ZK^pj81Lp1_Ee{`e87;pA0YhIQPuX-u#q&uBQX#c zv12d8pXiqM{CX=|oJsdka201b85p*qP>E>ey9W+Ts7(V8Zfoa)FM*DeaK#X4z*YF_ z!8;p2qM|Y;A|>9GmydU_q12-nk&#AuQ{*%D1-Q=h#q9(mBX`6itW1$=`f at JSi%>cP z%^dcwJ0*RJMkn$zZ5k}9WJ$|(yzOzkR5U`d5P*RA|C8gk z?Cs3|yZviOJ7bF?e5kc~X`n at xbNC_)A(7YOh_{1~FbxdU{I-#1Ya~L#3vOT_{HsYZlr%??nw2ob_}pe(QO?lsU?Ja^gn>)uUvDbY zRZS~Wbyr&_snp~ICJUA3P0H*Tn5ZkF#a0r>ZGnX{MIz2ML0;IF%*PD0f at rN01tosB z7cv?PCdkI6fS9RMzsNO~o~kC8O0G?_VyPtXn7}wy5bzs_>D49Y3{#EMv-QM`7E}V6 zg}9ZZr;%oN>S|Un+jE9;=ToyE{hYO3^Mh at T0OD(n!4y?4*90zbv9`TgH+8L*x!0b$ zRQywdj6oyjW^i;tZ_$#HQ^3E5a9V z;p4W!;fIF)2ef5u+h|)}i1G($Xo=TAzKPje)C!V=!X3B4jPE5AlF?Y=^q7d|3B zhbD?T!G#kE?L=!WZV;O20ej1`o7R(3Md))}6X8(sR5wnujnOIRA at 0i0#_u$wA}-iE-y7M!WyswE7B}GSm9RX+m}9!yZCD%o zCUS3;ME8;-k{@KiF>jaSgNGz?4bgEgbtn0lBeDx*;973b at y!S1KKYylo)U#2(w#d( zI5bm$_n?@wo(-y|L{g#zNOp&JhIYwvyEwWReCv&URb_%&#PV8bujivF6CMs zZjkgO!zIeoHqrQU8v=p%VtZlcU at dRu7VMLJn8X7ZtcVdtj$^#oM^rah-v`*gnjf}i z&O-m!Fc=u-%K-mV^Yd`9bTTxu`PV`4s?w?&imuQN7%`+AjuZ?_5?Ob$e{3Ooi0)59 zG7Os$gT>inY4K#_JP|%4l9YfVUx}_9=JWa#x0k8!N8%03;z&IMa%3VkgIwB&wGUda zM#r0SARcWoe4B|af1(ppBiKY!Qg)z&G9B_rh zsg-K;QKc`^W=SohHkD~EenseX^oGr5_01PxBE}u&f&_9jAF& zAPIa->Wq6&ICKL-(P8bHsgX`Jzw0r(Zp?J9`w8yd?pr9PS}Q~@RD5%CE--RvoVC1U zZoA;_)T&8sU7oTPUW14Wm1j|Qwhe0%N)?39(u1udYDmg6 zyxXG_W?VbBUkYb-;PPBpMH2g|beneY*z>Uap=1x6+;-+?l#~|z6g(ndYUX-Iw#pFL zI1DU~4)zYprW(&!x?}t!SE%0tM4PJdTA?3fhKejEu^O#Ik(8#(-G&4u7c?l-^f09q zfr8h&wExo228DVvfrLf}I&H$q%Jw_P_anztka-xB^3W~89~5>NJ*u?;2RKYDaf?aU z7g>&{5IgeCPC`NCc(|T)qEmBiP0mka?| z1t$p#tbur*O6s&^wF5?BYfgN~terw}7w{&Bw07uI<~2gLo>u8IlQrU3vWSn5Wd}dD zCBLNP(EtFa5E)!;lVnf3dq)&lD>Rts3K4w2lOMr@^biXjS%Nqo^ZX_PL)#)V^JzD& z5X_d_ak~TRebg^`Z#}Vw&XvbHQSykfz>qU$4$4634eYp6Tc8WYN zNlg9kiC8kU_dmT0Yj##4H;nC&P*CedEi0s8-ectCxu~mN~ z=6>sHBJMA%=!5znScRLVvCIEq6{m8 at iU=R at ZMHe_VH&4k at nPsvh$mq5Q&N52#)86W zWH-Hg3X$g{4>ZdcY&U3pp<)pO_Gx}kfcQ7+R5;quO|Y?T>c?L*mn&}wP$qz5<5L-zAg z9)#l-Pje@#Q|YxET>5LN3MJyS>PVnwQB27 at CLR}_E32Jn5F7W%D(D-6M;TyI!bA5W zt(9xZ1Adx at O)~c at nI-&;v~QhZv?3zM7F#DEvR2Z9cZZcmI#_0cY0*L8A_lieN*}C=~>jJ6p~*)UbP($m!7(#+slKW;_m(Pt#GG zp>NzodXk~jNH~y!eG#?}o(bQBqhwoKX{-+O-Kl9;Juv&d3eaMYX#LKj=U^kPrp1uv z{!}c^v7W2oTCZDEb>lu&@TRI)#Z-+`QksW>bk6Yj2%mlM`7N1Py((s;I+Fyk{G=ke z^o4mGK=pin7rWX{c4VThAL0Hm53o*!CKbf0fHcqZX}%yo{24h}=T8`^VpqQb>_Cgz z?&#cYRIe+XZuL~_{IGLhdGPUz(GTp|_i>eH2f`se2;sN+Jp;dYw^~g1JX4l6QcEBh#RF3gq4keb#}Fh+x5zO1 z-AbENk6@|vcTx3ugxg at G^zW!dFV?W9Z5##m+bqk-SE(P`k-Wx zK;e}0+@@pDc~4R&7tn%vN2r}BP~2m#1fxl*k{+3U z*Bo=VAWE~UlkuibAeU_9G};bcCn`Y*R=!mU6n;=NoiBqt2B33qdpBqV^8&_3otoL# zSFm$=`8Rni)!SyKKJ#l9i6eq8Snl{On?>@j(Xqk?r!;Kx932!FkMvVw*(tavBE at W5 z0|OlR33Yljx$wzS#6JJ_dgbvf${XG~i4l)o)*c74EafyEnZ3`pTH*#Y?824DLa!nGYK zH1_jYH&8s3_r|?In~0Y}wrGK4^X8L*3|0RigL6A1et%$ZSpVv_YxWPL%)jS)C259kGmI*@dUejhC!r#& z&XfX9=4e-JObM!WENQi=%+VoT%)WGMtC-$vuPZ|Q^VHdom8#jK4YChbnWKtx*>XHv zALN{x!wCZ-1(hTurXFE+ at Gyakl&lIKW>PETsl()MnKu2?toq)|HdvF?epeZ+F89QA ze&(spKAwlsya{KNr8FSkzbfm>D62g(C@(qGeVNdF4i(6#zG%hU1s)aa#sNCnirlx^ zPsI0?M6)3sCkBwuDY$L`1;yZLME7)9bCxjxH?L$JuGWYqPOTe5la!Fo}!=h zqi_$cJXu0%IC6EJS;;8jl3OfnVHL)UF$SmJ#2yZE8tHDx zjFxMoHs(4C&hjQsIKLp;j4bsOhu3kC8-wN{#+%semWDH?CprSyncGwPErG4cJ at 6r$ zAG&%;3D_mlk0MrO^a2Eq;WWp(-t9Q`m-NsW7SY)%SdYLR0~~|&UYL$VgAmX>dAj*g zq+ktyiU}w8q1^ZG-IBZ)+VY4-nd2QY+;Rjj at 8SZ61tIu+az{JlvnnKM-=eFM?5ADm&h_ydV#K+ac`!04~)M9&Lqr= zhlqk{-UBCyFu%re+|C=7KoIAXLNbr}A=sRInFarr_4po_FMgLWZkS1ptV<4z+0-HQ zIR>h(o~iSct8fA=vHW9_zNP*C)-l23~Qf9i)6n$u$ny$LV*B z9GEY!J4UH4&!K?rhD=|d9sKPs$uXgww^m4i?Zy~ldGZrklb)g~`dqdBptn=FLz+CH zP{%Fy3eckPTeW?C_dDZ_~5fKzF z2;IYgAo^*+szv<(Nu-PI1+M6zsN?YyL)bm2z&GWmIY%#jx>VC8+VPkzt(@2aGIGCRl3)p`1B(lFI|_ zF#KZgl6Mq}fJFOJw$7>4R#sYqU*R~u$;rK#Ltf*}yug|4{;GnHeMuCfS`6a`@3t>J zCrVoUZ?=5yUIxGNWy>^(|H*Wwvb~whzjT+z)v;AkKH*Xb31tZh3Jm!3 at r5Aci&b9{ z!wG_r_&~t0w7Y`u5DRh5cE$p~X at 7!#!s#Ay8a42WFRGzet~ERE4n%OXXYO8irZ^6f z5Sl^KYHGHmb# z at U6k@`eIxLURMG+O0zYALTYMR*(@SWwT!T(bk~EVP16|53(%BVjwP#^&YBeZj~NMW z%AvY;6xX8AHn~QSshWaOH;^PH?um~LS)nnrXciof`Zm}5N3s?a534O3fS756q-p3& zR2|M at f}F3#%ro6K_IgCwcxKUZxPCsnIJEluL${tIhZbsJ0*e`4=d=?Ssc2Fc!ZxPd zv|q++rW8=SC9&hp at E+S(U*iue7Z%+^phQ-RiW;}vJb*JV?87C{@P>H_s@>M+T$wLY zXlaKI&lcKi*-5TJ4s~-&%@jnnFaRH7!=NL0^*wMDq(VX--QKQIzYn^e6!%d%IhPPJ zUJP{zvA|HU%4O}!2wO|u4qfl*>d;yz){ftVmP8+*E=MdWk+i0~> zE;AQ8nX2v!?#!#3EP#Bsvp34u^C;*Gsi;hQGjo#;H6$*dEy(9)WRmALJC96GZVDT% z%>um%oqfh(MID@#n<80XGWtxmM$9FecdP?!spQ^2Qm7nRuDaLOLaTB at wPya;r|F)F1J1aQ(Ra1WnN!c0X}(@6On*!#@hRbvVzDXKOV0q z+Bk?Z)cL_YNw2W{HodN^BTJ5Et=xz3*3~AZw6hmG<+4%crCBfbC{>RQ+D2^~bxQy6 zh@%Lp_tt|y{JYT;LX#0k&I02sLfl>F-YB(y!Xc-&%llCUa`I)JW#O>g1IHk*oi#rUVO z1X#i_IC!@o-HbhVAi|+%?q;-OCRHu3_$k|+Q7rkiH(s`ng3-j(@4EVzaI at bB0eeeF z#*oAIQ;ksyH*0)-d;ZPekEK^&w{aqT))e1>&yf-WpI~`+qK?r0dOTOW=YhLnnt_(e z!kR^rZstwfCD3nC$uVlx({n=zwa6{q!)Jad1>TYyjNw%o zq_edYQhMzGDcxAt`)yy_ABtU at r`eA=Iy}Qa)1(JGD~H<9Pe(a*13E;}E|5J#uighk ze&`3iNrO4%gLCc>!FYhF>-OOg06q`3EGbq+2Dvk}0MQQI7Ef-iXWm at M+eV*3FA^WOSLTe{to=EXxo{9 zVrV?5TsmTWUeuA!d)QWfx47x|2DL?~mwyer56h&H==U<%H6vk6`b$+Muz}3(RFX$N zH?uEGD9gNe> zZ?k3*nPuZ~G`I=wK`vmERW$Bt*~JS7mE3&ibLjyagl`Xd(Nu}GcN zwxA?WvLz4>P&5ytk0Hj2ogeKtLq7q8t~fR9(es-z9>4N8^Cv8&VDYDYgk+L#B}Q*C z63`u$^#<$9ci19$A95HXqIgT0pFrI$^bObhd3T7*<*zXfp{x^=2V#h|3l{WKzN?pR zkF*%<(;WYX7`fO5ZXkAiN(%J6)FY^p%&cXSMFOgQq29|9{(zdMZ(F-JIc_bs_Es7ld3Pk59`NoTw>nDhZ4Lu}9xV%T7 zG{pC=ZsODQL()gzkkJ1tjSrYxR|4VxKUELhJnv7(kh=&MJv%1*je<4dy&vk#{?$_q at A#~ zz&Y)IwUfNtOIV{XJJEywkL~2&@vy4(UvCxQm5xgkj|qmP==7jai1(+TQ$xX=9uWpD zWPa&RDWD;ZwX;ff+57&iY3}0kw)Oo=oO44~D!b7Q+?YGA!`uCG+4-U)?d|RU9l~Fe z$4VT>eT6Z&&34LBp7(-0T8<#@&o_V^lb&W;4>N#vs`0J&}*MQyE7qAXG^LBYAxVm+xNp1$WO^;<``FnI>iZKkkB z<@Ma|MC6iZ`Oq<{ou>#*3njFuR=V4x49F2BXRgtT-m^yT4yJPI1gDS>;8D7acVmlbL#B*HlxFqgx$!J1Jxq5 zp`-PB_b4mfipyQ(*pfj7Pw%39CLNnhXuwh at hXTo|lMu9C6I at RWYpezr^T zp{L2jpqF_)rFnzmdFb?zf|cH>0W)u|DhEjs6|a)*xz5zm>DsoaU<@lRpUUR8b*3q0 zOJ8dn!CJ$L^@oKK(}}1r8sd%yRO_fKC^}iLeyj~kcq-GKBK+d%CWy~I;9{W{9pJTD zasYF&QZ#n+{<1L1dX;gT8)+6C6x97 zzW%}oez%B0 at L55S`EdxeiPhuDC8LS%Fn!1qBHb**F at iXvWQq&jEBJ%51tWO7bY zd9Mv{s=BnuLdAAHhf;7rL4H0`b}6_hi{Hk-gnB at 9QD*uB_Xy?&t#T1lw1*mSf<5Z!Z_!VHYLcxXtl{%->?098)ri4NBRJ^ z#XH>JPGx<^X|nzzDMol8Ao>5{py1!Ox1{aA*y at Aq;VHo~uHG_r!4}#_Vet3vjZKLx z7CTAB|Hs)q1!=adZKLikblJ9T+qP}nW|#4nZQHhO+qUiMJ?C8C-uwSntdoC5JTZ>O zQAXTPWL}vg2NIc#(F!uF`Ti#RLbTZ=cct-9aq3mS)!LtR2Eb6nAW2~Wc)9&{1KkpwYJ3l(ZS_WF9tU(Y}2jTuW0 at Sv|JI@U}Z| z)`s;5DHz$Z at e--NVs;W0Gl$s~C9-~{Wo>%?hN)8i=HOCd{82ZXH)b=x<{Yw>t{;LE zKCy}h6&Xx(!ei=YQ`(fGOoLl9F8r6WYc01NTG at ESJF7qX7zL(Q3zgO+d24O-(PMli zs)^9vjZ48!5$4ndSJcCDo_vB&^SQ6R?Om#SVw at JyEk047QGRAvsKWrF*QZ(Si;7rXV}U44o;16V6tf zT?Nl4&l3}B*Se>Vwp-RaL0S1uk6BHCU&S9L6`=XR!?5nRsQM%4D(NQOiOt_FsbgDOh_R4m3 at KAxKus5XmyMu?oF@ zrIPT-&g-Pzs!n at QB|IfD4bJPGcm;oB1BrdwQ0$FyC at OQDn^C&!f zBYaU-MmIpI-1P(bn*F~%`TSiL?m5 at 0iB#Y|U?sq0y+bHBVc(&EzK)dmALd(gv78|6 zu0f{SK8hr~3aFywxuR-53K at 2?L`$=V*@O=^N at iQ<0*9kmF`;xUf;KEZXUU?Z-7xoD zF`Xrc0)dC=ub6$W5{3=kFymY?dyt~|epQFmRMQx&#kJT&cN)EyjvdpZf-5*p z>;aKN*umNnKK|Q*_eu+W_y1mq)JzPl{(}(7#HR%@dy5nnHiZ at aZy`!=_JupMN at biJ z9Q*%;Xz1M``nrO4v+Zvn!g8~Hbl;g|Ka5BvsCB=Y at _G5*zHz(B;Nsx^I?1^C(HZHD zZdQvqjA`qJAL;T}+cIF19>~IXGyrjUfqr+O3;Pi0#2MrQ0@`r2(DIATD;j>5`Kfbp zNx+nvZ03}1fejvJ%p8T$P_9i`7w`AzsJkPB>fDuEPfX+X4-k1UwGpDJ9pac8GbdoA zSI$2aS^m|%qG5`1$4uAsfsQwTGS;;vZH^T!fUedPmKdE{0^L)r+bA>K&X?{eZk#KA zQl3gG0g6*Ceu{d(#dVUA{ndqtVV>#FJa=dt7^PG$t8IDmofOla at A;AoBxlay$Z at tN z0K at f1TQsKD<64v&`4gVHs!o3c(Fi(y3re}yhz{uuyV`!c7_2S11RCFdKL|7{8f|aS z04#e^J2d!d&9R64XUxTb0sb0CE_%8x38m3XH{H3;V3CV zFlALwaKi}5{Hxz4%80C#s-Mtken_mbkT#g897*iA)bvi0WN&uAsuw&0?ii$W=-#HT z&`<^hR||zC+`O&hTqU2l{9p53+N3We at M~}ZGm1)eJXJt43*k1;F~O_^l#*LYTg4pCZ}zMEFf~q^G4{7mG~wOeeaj^6Nz;>4a+Sr31vlCPjtrB{xmuZ zZtg at CoHSXSRVl=sc_~rc8EUUE=;rX8V`akjus5K0z94wJrXVwh_yMxcBC}EEAb5s~ zy{8CAT$*Lt)aM~%xRt1BTO!BL50#^6*nrz+d#T<5`omieuWn-_9W!^`F zbhJ62=sDg}`V)$M4ox4)25~2928M4C!F{S%*gZLIc42%3C~U#c0M at Toej`3N(E35k5b0N=3T%wm zqR||2Tg1e>;^O+5$J0M9`F}zyfzH68FI0EidU&dWF#S~+*F)kpVmpQqYtjO>)i$E2yci1Ws9ZdmOF6*j;Z{R}EX_bhT+ z_7HL{q at p=@wvEFyOIPKM7>HXby+Cp5GCVYS(8SmJ6(L(umWcIQDSE9h

J>Ve?A{I7-RpQiaA zg~&O61A}^9%Q^3upA!-gKUmpsBY-|xlg^vY`vBl}96M_YZKd5Vza`#5jg=ZSw1#-5*J! zs3+)bLm~By{pO^>24YGHYpF0U&kTv!QS5`u#WnV;(_~kD`JE=TOOgh3yLy;^hzRmz zQj_f;B3iOsu&$t4u*Q%kX|Qp$gbrlEaZ$Utv>cf%w-43OW;%V-rPEdr^whI+m~x<5 zw`M|AFY8vSWCK)ya6a at O2`UBWoHok}j%Q{>AD at zvO+PHDt%tjoTN;pE^=DLzs7JRS zSuPWBX(JsXlBMqgE z-c$W8L at e*0{|Hh38~si$cy-3#LZot1dE5+_s`6qXqdZk?%FHZh4IEnbW#^m+wGpwfS7uO=Rb^S2PqkO|+5H^h)rQ2irBOBF|z527=!#?v}&PHyD? zuMjbD|8F6J;j4RLma<~fTuazv`ohq4f)N at eSzbehlGKh|>{^dGx>x?v==e>Xy at C1> zy^ybYvvy1Tj}Q?GIuF at wUK9NzM3T&r*{d?~a4+vM(Gp(zZs$`JLZO8z{|J$*>ib0z zL+<}6L_5w^q#KLD)n`AYQb68_U6GX;ig!`BRdV&I!*xJesHs{*Dg!KxDK7Gt+k?dZ z%+VoADqsuREkvNJ$ZY5LUMKf_bt_c+b`k7-|9?W{r+bPajxG|Z`+dkB7U3O&ARWsR zfR$S4nt0qP^oIhA?aaaRHHg?no*3LIq|%A_6l at X&74>f+0>t$b8`i{;fBt%7iT6$5 zETLfN6nmjy(9z}B^!0OS3(9Z=ZMY}2U0AJ$3)bkoQOFtqYZdx{yr8{Cz%%d(ivgEX ze;8zr#$E%p{7QPWHzCk&gRjgabp?-f&=^=BUm}C+ELmb&xV80}` zhnn-qB&KFx4*d1l)AJs8Q^*^;_iE0wPm^{s&W-jn4q@|fM0}JA_c(Dx1=a`O%Rixg z_6Yt9>3&t5UlnqU^mn&#^JmTIyX{-zJMTcjk7q7R9?oD;z>&#(hOp-aO`(Xn_dJ@> zoBidlsJ9Ov+2sR&M#U79#cFaRliJ8d6O0eyf^SreAp%AK52K;~6R2v}vs9!K)wpqD zcWuoC1?6x_V&DS2-X=-mzu$_u at iX|`;J+rKfBMOPBqE)E5z#_oOnz7xdA^`RE;&Mv zye5J(e}x~obe001_P8d{*{_Ade!Tm?g~NLduMxB~04#{Nf$wq?5iyuQQq z5}R)19hhPTPtZ43rHPE` z%;Zg>68f90;F&Eyq+tME={*%%B at 4@{PS#5Z9v3$1T&Fh^PZLFKboReMqVbz>bm<`JRQ-Afi5jJL{H&mV(un;`Zx>WD5)ZC2xzC+D$}T*xx87xi%;*snKd z-)};w_dbV^GlreyU0Wr!NYie_j6T9>{CFmfV{bQ?th-EN4QjxhJ=bmg=l4F!2bS_s z#?E|5-eigLJUd>Y#7Z%F=g*=NChQxX$k25-bv5G4OF`ncclW5k6LA&k at p&z(6W`Z# zJTZh$yt729AL%e`5E6fC8Z7i0cuMe5rHd+R1kQs9a|RtAiRlvtbqW*y zCZetXA)?~%I%McIau)qo?^0(@O9{8>nIV+-$#Z at 2++f}TW!QR&d(GK!B4aM|YjWk2 z19X^<47xBSzw-!m+1QupVaoXw+#Y6o$q(q{?|@{vFi_DCekX><_rHmVKjRxx#}k6= zDTQ6)?m~d~OAfeuC5EXn?f#ej^2uhX6T2MyI2JJ{X2_@{l4y19h|<@6mE3pE8FEC-*Fk!u*$;HFuhrpcY77j4SSi^4Yj9*FzM5XMG66ZX(V zhoU;@D>)21iQ#QMV`<)HHYs at DHozo$ci0W?o!o9?xrf zetZ4eW$DBlrZFart;KeKjQI#+2ulL5S3g?E#It=c$bxeVSOq6U6V~Bud+SP(h>TAZ)SSHtz at sFEhGNCH3F{e at J(`qeFjKx={C?^v)Ray}% zC!tgwmTPMyxuwRV~r*37UHw+#l1!oRr zI3Y>63N8 at C4POXkbo%*Tjv%kDtGJ+B3|jHVuYk(6^6 at jo^Eku` z7jWJLH_cEwR*5O2LF=5mk>t1TfkyMHwx-Du(hnQlmUrkm`4)o)7=6y=KSdLdXa!}i z1&ISs&(lnnuFRp?Y`GzaD_U`4Ew+}BJNm3#=>yX)_8Yz5m*Y*(6Y8h>7f()mHv1&| zx#u`zXUz)6Qjla!+XiRQV0eQ%5TMW!>`@R9p$y1_JPpx` z#J4;qgP+3uFMDVsVz99j_OD@?%-od(I;XJi$vtJaPyt4HkG%nm`EO$9pYh?Zi;rhW z-zDf_G5s$f{;zcKIryi5SgQW&u*(G?yy!w7a|ehTm$2fUz=^IU{4sM^^72vL*Y*Zn_21iMyE zpaS*r^KT&nP;NrLQvrQFLH#2{7k>*8`c&J;RQ$887-pU-=FYRYQ8iPPJXO?9*zgNo zu0t18)CCRmG1okJ%lzt1oM<~!ls#2cPWbQwaOrSVG&5lpbM}+CQ65v2I91e6_%NQ2 z+JM>uYTe;z20PF;gU_OI13H4x;$}U2j6;9MkQeyZza5vFv&*Zr`fGAB|6eb5{^R{b zs!~b|^2p!wjTHJe2nY(e`MJ$U3J7|$njYjtiY~~-u-AfJi~Qn}>EpL}+HKEdt+5zM z7+H5=udt*mCz(vH+HkmO=^71ZnlcI{sI0>!RzyIV>&n-sTcbjg>MtkN5AJ(=GvLU@ zD^lc{10>?CgOn=nkvNLSHCat-lTw|Ibp27(I}abP?9J0i&9QFpWE at D%9t67%c0 zf}c!GsmCWMCDs)^MO7E-^KQFn9 at Aq`_Uo>GCalcYYwAaf{#=0JRH_PWy|uX&2Yp;N z6XZ`&NKD;apwtC%PVDGO`atTZS+PwntnR7KfWRV|r{=H8*&<90`J$l8-YBMKx(cPo zh;FU=%Ai$AoIRc>m1aHdQeB=^ZWTa60W}t>s*{o0eD$iK91-1l%?@Tfp{=cNd}s2s zwNfSf&i+$n&}s!|ySDM20 at x{W+^G?6qI&ylkksf=XtWel4cYHwzhzlXhKP@^?k!8u z6bhbR`w=es_ at pM~lygd~M&nVq at 3NKlH-FDInt9VedG?LgY6QRZPh+ZywNm|TG-UKM z#fH}Zq2w#A1m&>72AtYQzTz#;ua at NpO1ufOar-nL6H;d%#kbym6WJqK4v!g%#VFHK zDsq7BGyN)%72#Wz>6{+;`14Qz9C2z8y=ue!37OEqpWoTs9!${rm4$nw5zQfW7=J33 zS1_J;&+ifAiZ}xGjy<5jujzb{VSYw!WKP8M4X}YcrxSAHaN7m at 9TW(M(0yuzmz6z8 zu`xig?$Aj04w;=2ZH0&?sYjgxB;t3a=$2ME0vT9wMYi^1det(;{G at KN+rJgd0qU<; z_L90a%DDjeWSV%>gwkpq6VslV4PgV$iK>C<^-~zml#XiKeI3l=tUf|qv6KUEwriJE zgg6-jp?kSQ6(jZC5$6u_U9gnGrTKUR#8?86qSs>crVB*frL|uLL6UMPNw^!){7o#H zNf?kNjEOlg#>brr?+n_t#}PrmNulBp7$x&o`GlBc{aj^*BMzFD at Bg-u6^2MqZ~R}! z`R|Ra{~YHH#lPaLBVi6y)cn_416e_S!?7%k&AduG5#c9J at ELS>uxDu>vw!UPEgbLL zCD|)Jldh at rFx+k6BG`yS4s*zM>GJKY)0$b9kA_#ymiO1w8I+&HCWK($6KmtHXlzIZ zWbtd}zK~`g4JgLXpQfwJ*#R3s{V{958dBqo+}fo1&HLz6SxPFnxU9waO)1P!<2 at E8 zFQ_FZ0xV_=FR0DPQkJSro;Vs%p))i>$`^b~6?G)}Hvq|O${pqmKOedii`3ARD%O-k z62~p3W~~9nT+NMT-SP?TmWK(b8{(d7xF{NNMdPw~)pqe&i9PQ78b4{Aj+G!u>kBb1 z1?p<2D^*-{$RtkU)0CbnEiJrnAhj;dFz;5|3~g66ROlGx3jEecv&xnPv_YCZ3W46S zm&b^jXx;>zI;c%a$y$>E++iqF(y5In_p5sR*3)IfGcS zp$x#8AWh4HU#~ImrUMneA%ibeN&{t^Kxs(;~jKMf(Lf`h&|nb zJ3Sj+037ZHzvEdwrcM6GSsOCxN41m>N_;8OFEuXldID|drRq6Z=S5#XXLyHLD3o_v z1z|B4H;6+KtX`7AQ%k)ejYX~qFKIG!mPmw^Opy{qw<9La<&ZH`{X?R|a(m>pIu3b3 zPu2n40fSJrxjJ7zfM=;M914N*Sd2n^6oCZM3(-M6g`{1%bxVo@#j-p_yDLa})m{3e zJo{3fGjm)TmF_v2{Zd*D0<1DFB8hRlWK9ylJRbZeFFtz^wC#!Qf9II|tz8-MuN)6U z{`a3m{l_G${FCG at G8+jkDtuI7e&L at s5%BWLL7F0oae1fs(sfPt**MBug7Nec7DUpA at YbTM%t2*OS;9QUjv-w z3RU8k(T8Asdts{6B0~V7_gor^CRLO?ba?lG at Q1-{#Uc`FCbhnrT=cjv7a({00!r50N2^2Vcng{~YJiquG`=+u;J_tzI&r7EK=&PQwS#O>G{NintMjZr=`W%0-L zhw;T8yyxfxczS1U>}mu`14vYUK}p4nCkgF3lWs`ttCLzmVTCRrO)*D{j5D3T{IJ0) z2yNZcarOnF=Z1lpi%(adyBNu6_va5}`IuctGp8Hl+OWAN)q_eAX~Aej;d@>N1k4?t zDfGv2^`rHV^ZHOKZL2sps1N(D5Lo(00c|8(Udx>S& zlqp8~iX=a%QT>6v5Skg<5BpKI)%`&k%(Uo(S*80zIUqJn+V>4{_0j4s+we`Nhcg{z zc_cvEB^PMVp{ER`KRQErYOJzXTq0rJel=4c(ZAn^dqdkx{Yio=XoHRaT_jGQbVN(i zBk(|bS#1NnB=N(ssK_9-1hxP)-Wz6sTc)x>q{blG at 3_)-p2kbJm|)VVR?H%JnxMg9 z63NGbzIs+!@AKbs2azL{0#Eki$B at a7A6)ftLwY#2 z1LIES^vtpQkTz1=bSzWb8+8r)M$nE0#|jk?DdeDsciCYwWj6 at SIr|Lq!w?XZkZ_pQ zi59!4c5lnlr*j at fe}0HY#nD8tcld2lG~JW8g}yGD$B-du#~@X*qXz9KGt3H{WSETl(9!*0`MNM?i+O zG(4Hp1EuMksqHtYoHLZ3?Gs=_MjFBG7P>-Xm8;DaZKgJ)$)4>+Zz9F3^$(}gCe`)9 z+Vx2 at Sn6@0w$@CFXgBv at O6Xg?zZkQF4Ur!1-b8`)L5lXq;H9;xV9edsfwxBhomOjA znw1;$DL(9G*l&p~^CI&;_V)u%DfQ%#!-aa;Y9X z#4=53S#>_`lmA0`_$WidG#oV~v~4Mz%EIB^c!)SLdNm$)X^jSYIkq-!1V*2SfMpeQ zvKXO%5%ce2TMV at 77;2PSs{TEFV{4b(YFc$NdxZ`%oH<^N4^qZl5wkrev|q`S(9?S2 z$Yvq5ga}Tw;IvC$C2SyArBxjR1}^yAzwL?H?dt^Ax8`&O64U)hFyw5X0NWz`lYJCpx^9gW-WsvlfXiO3 at dA)?ygJEIKdDCn_x)^ zywm_32ftGx8Z!{0=CEYjaar*zK1gHIja;6GRUWGpdMRP=kVH{i6RUvpd^T*5!yn;F zIU4tzoPr2jn_7YBN=e_`V8~DC4keq at A}9rS{FVs9O|@(OYPSCws-N;MPI3`BrTI62 zh*UZf<;Y77Ww?BL>0j7qXT5|vld)prJ_o3rj<~qHoyE=TS7QYC4Yml|Yp at 9-% z7kDHeV>?P~TkLsg2 at lW4o&`g6+4gwfwCmk*BEccFfDgAn`44^ION zJ=te}&?S9b`rg-ML2^7=!L1J1R!@pRaX#C_b9)Pk3Psv)53|ay3dQk}Wu=!#Yd3>G zJC#(%Lp|!>5}P54GZ6WH{_$rNK;#bs at x(rT3o}eIaE${oEsmnduXU-v0A|m)S>0<>e z0mu1N%yFu;!N^Hqgt1z17I)g%Yc0wLRmLeMZp7V*E;|s5-xtN(pJl({(YBKG%_feYQ>LI0}R93(RpFAYzHTxS=bFq76Whh#2`<68% zG|IP9wg!!Rz$#y*+ds_%JdRG5#s+};2#2kWsteMb9Vh(llbB?JnKCONFL4#cSaOyX z^0G0Z$Vll?GM zRcP=|6c;ao0*T at j8(ghvi^{<}AoCU6W1Xgt;QKY8hqTNtU&W{T>!8357~7pD)JNn4 zR3INSH$r at 0+BsUtOdwuyVoCcH!3H`@H>pysUdBxVPt#~Pz z7*)IHJ+}7B+rAt^(A!_dt0o8(S_EA%J;m_Dv%NqPPTN9znh93Hl5&AMNDuKH*lRKvx9cwxQnziM{RTH~n8dLZrD z7?rfFtBYR4ncrS8)g-(Np`pGjj=E4kSUEUpc9-frK)G38CERWpvK#tf%|^jn-50v! z(()$uwTp-u!t2_XYkqBbjfmRW^U?C|=ll&*v%as?u8*g;y}!`|m;n*Rj(%G;#NW1i z!49V#Kn)DH>zuIe8nO0)ZT}+rK19)5HSD3c_MV*5Q)H_9OrrS~wb{42i&FEpintlv zvAKi0>w-y^{Y)@;0)BZA=WeEo5@}6Wm47Tb(>a at r+Bj;u1O7HSK-phEa>CF} zvFM;qvFTvcPGj{IhKjK7jFMBQM%#%tMEOciaSmdib2Vv$-bk8~6MG;@$84I0gCD!sH8;*cd_KkBzB< z_Ip_LV?BB^Ic%qW^|-}$Qt`ya1?*(DxY`>R?@mn-%@;xwrMv=KxZE7909$0F|MkV9 zj%`?%CAAqM_?`vVridyPWMku%-^3@%TZfN!uer;vcwY=@s$K|>rnaODf&H2F>Cd)Q zP3GJA5AN%#fz$qH*^T3_ftAq8ygxZR_wH}OC^j3Q%gDH=nHxX9{!ka#B$Jg?UzOvz zQcm6M9AQi}WuHWOobQxX z7PpJFVC9(6Oy|e%vG0}Z>>YFRw#m#<9eLM~@J;Kq&jq-8w>bbGqVhl8D5t*1Qn)gT zMlOYtf5hB!<+oaco4f&s zWiY?!cIn8^GgqKg#P)r_ZEiac>Ex2}fZa#3c&iMDTNA|PEfYrQbqH;k2#Y2!6DUoi zX>uGChY}%9r1 at Mn%ML(1|Crf=$jUj`I|jj?E?6Eo;Om*V7I&TKU z5MW-g1G>R9r(1OglmIE45pd#0ZeZ+vGCrEa6}z26cE2kv51JZ^79{m24%C&&ct6zD zH+s!#9kS=qxm at N89gNKG);~-mGg!;KsnxbzyrHwyQqO~8dVC2wrOVN^7$TH$%DFhy zby!T#)XBContJ=(RLQj^;PaF3?Uz8ZX?j={2Shn((2toZan)T;!>Q~^eqgP2N(J|- zIG^-GMjjtxeeN`scgiLgc!(8!R24d~jXhg$m!CiD&3 at 51ytK^oT=6}9;W*1_8F56j z#w{XR=?N8yd|emstaEM(;VgeShZ>db>28X_-GGrpxeW->SVd$PW?b1%c_3cX+#;jc z31}*`(1_DfQksXfV07p2o1$05)!~r3)MM@;Xz4pyi8 at -5wwP`~Bmk`6=tFT`&4u4p zoi_ty at 9V5*ik>^wz07QH2sgeKw^^36d(zmQ4}P}85*qAsA>r;28^28plI^VBeoPD4 z>HQe_D5oD{!-Mic+ojZlxqcS8#gC$JBp&qSCRQ`8(&VbRi&AEjWdElhO-~%;!*k$()F4wC2%jN(yB*G@!8F5jnl= z0O|6cn4NLcz?S-Ak@~u86+RCMGLv~v{^^qJn1JwCG$Eyo_cn)k at r7?x*1drDODVX1>} zFx`Dt2xr`Ie!W(w%;TI)mK9-zok$=OSoP$mL+N4%|LM0)CyV*s5wyXjFuNEfC$C_SzIroik}feZ2wLbtENc|cKHm?W^k zN`VQWN|XXHe21|P;s~GE&&nu at r$+Q2IwhA9E3F0*cwL@%tO`8pi1{4;I^{3gdC5hd zX6UV!Y=wcKf&HjKz>B5`IfdZ67+z2Oo|QV3%IttXv6Zj?$qTgbLVo6q)c(p^(EH+! zy=H4O>Z)X{bZV4yYy_25xo`LqF1%qoyvvc`nkRP0gihEeP3r#Wm_j}}tsClmUl2ue z)8x2>#k&tsoob0{U5}3L#u(ulsAkbptlM8A?D&MyO_5^! zVJF at ZrBSiKSN_3v_HC#52br5*D(D*Zv_%o9DvlZfn z3E~AR2u2Qd9``itO45l(SIe~RxmKB|lmoz=$LmSp=`XMJkAuL>j}~`50ey at r z*bEOlF at Z!bV-ysw=!!;+fzsu0?&mw&%;d|4=Y;8QV!KZ^NJqU9(AMpBvnN$vE1~`d z(l6?A;7u^+uUL0S>{A#38SDKtpxv~_3eoG$X4NVAQS6?ZW|YNGH>8(;0B6K7+_bI` zCW0h=D4rNqsrT9~{lsScOb*{YYc|AAvM$6Nf)V-8p+uIZhKGW~46wvPmNzvt7A_I6 zhA8Q$C~OF37X9Yvkb6NxB0$EJ-0>E{m(CQUR8{&^fcT7`-d!{5VZxTWs z%m7C}oPiyKCInZ%2!xX<0L98fWo(E?Gdl*UzRpCdB9qY+y(`Y>QOvCX9ypRPk`=%( zgpS`YD0BD+x)Ca;7iPv+**IAfJ2R-21divLNU(#lN~ z-C&FPV~hDm`<|3{(ht97_BooLKYk}b`&4m{I1S2kKHQvo%p0YC;(J<;BytRq_|7Dx zY9<$Fzb-TzXllt>XGTFEU^}x+lN4~sIda6CUP at wou)WG2w~3_h5N7>BJNxVrH%+wF zFv8&GEO0)4?Z_^Wn5h$*>T5HhF8B=H1Uhtge#fKgv#Ut_&Pa5^yLbg#PfS*@;k2u~ z9@b03w^I*^E5^3yh;LVNa}**BhJ(>f7V|dEw-BBS ztY6_QyM~9;L at pXieO>(`Z^1sLBoxKsYv&!q_p%efj*;x!y~>kWj8GZ2+ua=Cg)>-< zG_V64p8$vBF7Sm1)*j9XF}d19p%2zYye6+~I=_V at 3=gr=E;)HG!f$}yR;NiIWZl%Ra at OtJg0tlg8IvxGjIMbXTJt71eGjQlj> z;7G3+HC4mkX-&_3bSXT!P_X{Q4vfOGk90s9Mz63(d`dIiEPgTjn$1#fPfAS6%VeG4 zlliNN9Mc7jsiB-juV;x0JPWs5pw4 at 16p~1nD+ZDX*OAzat`p<8#E~+bp|1<$*O^oY z at If;vSd$vZPxVh_*eBuSM;QXvW;(AfvnvTut~)WON at b4)P3>54ab+%*Q&k z+>vkiSi)*4Z0EnMU~13L6k;_y$H$Gu&fcZ6gExQcBkrBad} zvlKPb4k6J+2aGuo3rxasy>iT&{ei|^PmX%`@*#`!rJ(0v`jyzk}1B?D`xFZXRMQ;nPaVw8V!!tBeFC{moRyW7$uDPo@ zv@~1;O6N(IceaQ0f~301%d7QfZDP#L*2PzNJd~^I#|eOYj at 7hCdL1(Zf9iqKq at se{ zIAnDFPH9L_(B?Zzj^GvYA6G(gcUX=fHAtr0_ at G@P0$(=LtiGWdkC)o#Of#=PpiZ+< z+!zh^(H~JsDJXEn3|f^9Fm1j}N3U{2GpDtW5S{GHYY#mLC`72->x6S>_r}v~YO-l0 z8#tUQ6GK|rr>jbYz_rSGgp4^Y-D+~biBnqR7wvJsC^f#aoun2VIY3_A{hmdqN&zhQ z`H4knwE=54DV|?vZMsdQygfCOw^$vwWIcPWItf&lkt+r%JDb5~O&2UjKsLuGAV-W7 zb{wX*A6HxKNimp#-izqe_gKdF53hIL{#L^wkFm=r9O|^Ghkg^Bo9E+=u%TU$^t0!p!N6oFrUb`#~=uCg{7Bth9UEP>A z!<$CePQm6EtSLCNeuQ~9)STLQ6a7l_b?97EiDY;X3D&?jP2C#AZs-6{zwXct7cQ_Se`6?~mDLlK8e>|9%mYR>Jb+9y zvt6%O9JtwtqV6GExlP~+#d1j5(K0>8EJD>_(Kw<-ezV!)B4Q(2X$Moa{l(KVHf>`j z+EI5zlRjYh0lNUgJZr}*j%D7n6{*Q}XKEsQM at 9(V(Y#W8;BvA%JJP^?jQ7`GF#XKDfcEOu0$ zDTin}SzbSO48<`>rfGJhM4{hGwnZl`10#2nUJ+(>YujF0SxnN6D+CG_nIU?#z(b4 at C zbYA6sgSn)2XvnIW2ye>=#nj(w$nsj8MB)T|GOr?RZ at -3-vr3cVa>NAKrH0dR6P52j zFyKP=k>-Rn)h2&oM;8o+511)GU at Uoyvg9aW?%9j6=DGtM%gHz_<}+_Ua6``}^VeN3 z2s{D0l=3L0{3 at turJl(}DE6 at UMhfkGG`OeOF|K=9Ju~4Vztl3-A34Fw)SRgqjj7ki zWSkpJw- zco$8kX?#@%L?auvQX>SKbQsB7&E-I!3%XBozE1u!PLJ4SLpvaMqWG1DW{~Q^fH7;r zzS4PL^P9YG;DaK>uS$V&I-2!Ebtx2*#H&+}eU(EKb$2 z5CLJ^d6s-Zpg!_|GB%h)o?4te=+;oZr&3i=ZVWnKc!TNb-$6AYVL-KIf{(%Z?6w3X6 zV2w#q)*@0H240Buj#m#n3(XKC24l{7!$^>bx_z2qwOuwN)P(80;_k`lCnH;S-q;~^ zMx}aY*Q!G9sYs15HB)UOBi^_ at OyO{rf1sLfO4@$YzwC-V zi0m=yA^u9zSey>ilT8H>Y|n?aK$uaH?8Ef0L5900*f*;XZi}&RkRjZVNPprZ-1y_^ zNe&|Iivvfx!=id%-u+J at p4j4`8?wjD?G&8dEIqoJ|24unINd at lyfhWpA${k5yiEZJ%^gjzV7rlXnujdsfVK z{dI$m)gY!mz^7`6CcJ^$jx$azxrt$c%iJ-oCoexg%N z^6iQ~$R(otNR at s^BNoV+AKX&dV1EOyj?LVsKe6f3^mbL8_}-rF?pUARVvj#7-dMVG zKYHfAUX+{V$Hcn>Rc{IRBjogH`h_c5bLPRp#+phM#B~Gf&d*#QRl at MXy-?aiXS)Kg zslChR)3hxe?6;9_$TQ&vb)z1f|Eb4Tr3eh>nt?IgDF~zWJiLDfG14}avS1?*WvLMn z&gVTs at ML!6DVh5s=rk_uP;o}UguSL{)SlHTq=A8AKx2V*KtfW8xZEb(vH at jjG4_CV zDRy#dH8m56!F9uwKf4urbfC3(%4Ohv)jw(2*4EVfospQrXKWsR#u4AQW!FsrZqG^M zTgbhw at Jo|yjsRkx4}S2E47{B{Gw7iPP!~0tBsH956?0_$yhHTS0MJBlaB>t?CA7Ac z$-XHSl$$0;>&AJwSCy{&=y}jcrM7St_hmEZ0ZIkbcJt?J?>S(mY({PI1TR_4z4E%> z>Ipe{Ny<659;%6H at TQQBwzI>Erc{CLsyw?fYayjsa>502t!yu=f)q&p6DAyeI-i^%<`EjruXlLGq z8zio~L^FO>1&E(z7!i+kU!fB^jbxhzU}h+2-~n0ITXI3DTs3OR;Ouk{nShb4$RY=M zS0qs*b1UIy?hx19leilqn)MWJ;<^@rWZ30n1^D14INb_9YO5axRp48dhL0`3_SvoA zht&fa;?5gNZK_?c%PaHPbH+8T(9f$59LijPRMkyd=P>=bDv==E3c%e8?s8RRSFwV{ z%DRUzE9447b89$Vul)DUk>Z)=B$nzO0^d;+-7>4_yk42tF))(MAlXJ$BAy(V%gLYj zFm2j0l}?@1?SNbM2v3$=eXU&HNByJ6JOOXiuDgMa!3Jzcmv;+>UZ2qAPWaJ at 9{aNT zFB}Hb36Ir7=@O8cA|aeuZ_5^^Mp at DR%h=FO$A+ygzs9Q?>>-=7OtT`Gs{DLUR$_Kf zvGWlJ-cuj3Er0}@zchVOQslbl!l8WV1u at kw)EuU<6?nuFvWd!1c5eU}$ z``(;;E3OrksvmboES3N<_>^1DcgRqI=di%xRK1-G$(xIs&q~3wa}^ zePa{&K;=+SE=f>k1pQ1qI#iWZ?PxnPn$|?^q-Hc#RmJER+pg+`B;&x5y3osu(*MKS zJB4Z5E$f`*{EuW26oDkYf%h~G+qT`J6&2Y+Rn9) zm|(-0fD0)r>AhM^PrZjUZz;>EmYgYB(S|8d#iId~;dnN${piqMc_(O$C_&L2ddyO- zk{G8#8!|;DJ!d2~%vDPOf=UM zA|x)SZP~OgqQ&!XYZ6YOPb|JlUGJ$iITbjSx=X3EBcP}bw%rVdTc)}@VK at He3LR5# zM{4eZJzaN2Am5Y0^O}7yblpEw#oE at _k-5`|W?k)l^Q##ydRf?_0k7o3 at MnwWvmy8< zzwmSC>6dB7xvn+uR%uIY*(LpAOYYgW(x<+P`KYdl+$|VPQe2}#$oWiRZU*1L zQvSH-FJbBmOIAxQZj|aac&8!8MW-qNwRky<)i#zi+*hH#R+14ud*&@SuO+ at ZUTZ9I z+S8KUc+yt*OeHUtRTQIp`4fM;SyyHU-?K4gkZ9LQc%7;!(KbIz3d`$++ at U)nD z|DXNfdRm4t5T|N#O72Yn(K#iKwe5%uwN%ZSWtRD+Nb at 5MR+V}Epx2L74SJ;IoYJUW zP#y6{RhA<=Yxd>2&z~;aB8O&F_$r|aOJ@$fMN2qTx5hgfS=DT^;)t~|*vyW#PI~Qa zvYfSgZF1bT)oY%%OY|PCXR($oWcejpxR8ToS92=v78Q!J$-0^U=Z{SmamWD`HX)v@ z<)0aDoNde>d=VC?kk~G$b3WCG)g)Vvn2<3O7OpzCaF)Is&WYP2dDLh9qvaIS zu_F%yuhrfcO!#^T`FcqCzVJrG z)u+VOErD)*n*8kks0y(Uk2vfZ2XiRi-ZCYBc=^l7pl4xCp=IvzO=a>Zw37KPDC2y~ z&h#$pXnox#EcI{C5DlP>Hf)Zz@}3x$=EurP+hJ2Q%0 at NOMzt{S^~_)u9%2?gWW;`* z(bKb$JXp5M&O~;#IY#`Q9dG=; z&v$S!dn7y!$5j@!jPDeqtRHzVPCt>rXVUcEYy2FY$y7a+WC{N95dGZ at Nh;10J&|CE zf*8FQRPf`=oNO^EaVe=QYyzp&m4zv+1Q#Zkm&DGhaB2~d<5iXOCT42-nI&)Ijmqgi z&ZKqit?XmBj=9;l9sC$)y0KFERDZK3Y`9t+Tw-`)lPeHLCG1WW+aNx8yIc!v|H)!c zZn)CKq7;eGIbop}a)wqTb_PMG?!xn|SZ^{{<0whCn2!p8XDBJQ*L>T3GG=l52p{OeI{z;=G;IvPMJj|fp^F~Szn z>a&ZYAUIY6q#)4ZVb~ON;><1O!Y=%ST9$-N at 8#!*;xO}s(z=pt#-ow at bk-@~ahLhD z%-j9SGd>WNM;ss~^OJ$0vWoMOirkSpd>tl8$p=ae&X$_N9XEau7cdEZtLGu4Wh4r= zh4 at oHQOQF(=JdVaTtlOE!>j$MgH=3ftg15sYy?qFVT%EtZ8ElBJ2Bv<=yaB6JEoGU zsP!U)B?v%{p=R87)S9c->Rtg2g3EU^n19LkQGx+R{HOJk2eMmQNci{V_%ZBUUUMif znB9BU9_D>ZQxGU%Bt)ZV4=$+X;7UP^dc>%`Y2vmxdNm2 zhC=SZCqyNx8JvTQ0~QIIw{&(j1A6$EenOHD13h{Y-?h zYDk#%US$*~`EGUfY5G-nvwR^@V7;^L96ZMoG+W%Oapa)GSu0}o_aPgPbk!PF&@Ek9 zJN!|;BySH9?Z~68<~l-OPv;0 at Fk+12#=eBnFXEsdTv_#RT;cC96W_uF13p=@CS}72 z{c#j!o4J?a0hAqEupKYR4+^5E89OGAhH+cz%bskNR`M-!GZaouPBB$0P0QlOH7w3B zYHxrZrBe*Z$N8S%jruqdpD!fKFDOjAU7lAC#1rnQec)(h+Z at R<=yM`EL~T*cqI9hV zY5n+ at jX|vOvF(!v(=jT>=ko(*2w!(B!;mEa*r0R8M-m5gMcjh)fubT)kzp1X zE!mWeGuiZS*eW)3mn+c-KTStwt5G*u51pY^Or|h;9oVC;9#Bw88(8}oaOr*m0^HKq zqkYTsL1Lr>ob#KKQ}EGJ)gu;A$|A|wdHT>_QeHw+zE_*;NF!NwdMvr{Se5F1C2vU^ z?auq1%kAg~#-Qin$nRUvqD{uF-%9lATsrkMs%jL0puW&a)GvPQGzyz+)Ut(CVh1jN zan(*GqUmzjoqj{4&Ld059Ao)RCqXm0_8vHvr at 3uc*=oowG at YZ;sbyyXsM{(CW9(pg z+e&u1>@3>ClOnWXiW%NmvW79a=7cWw0O5sd$@v(8324=rAXuYKYuAtqR2Rq!?eaKH zN+(g$%k6RAGw|*1TpJU?TVmr>E7mZ^;!r_`UZ6uKq(cdktNIOGCuf2Q(~Eo!IRtye zx~m)7bv9qTMD{+Ves8e}$W1dGVoyMv3D_}-pxa#GD2AnL!(c)6g#9S1J{{5p=(GhY zS3kKhs9rDV{?H};P4U(gui3v?2 at 5Ut^R2dhj&{2}e>g*#pBg1;;7@~M`FX;E=?Mp< zsxZq~fE*{nODu(`y+sB~T;AGTL33>rb~sDi-3kb0A$3XYCuk)4eWj78X|Y)9++7p5 zT@*r^j3OT_2tHvXQ;6zA8J|QCOB8&+L;kx^;zrm`>p+2kxDbGV1pmJY<-cU2e*Vw9 z&EK{SmKhG(QWTch|ZVMX&<`krC= zH_?li48h>LjN8XK{~^q8klT&TL$l09c-K>z=N#{=?%(&^&pcl5$NbO!KkCr6FfK75 z_u3hJII#M?cz%Ns;_TI}Yk?FF9;p83&V~jxdxFz_ at fim``LK`;iv80l{9?Kxm zgE*=M`Y5W>Nm%d}%T=1H(pMCAXzIoFGIi9Xh)YQo7pRfIm_`oUSPe6nNm)e}CQVpz7G_#$s!Oq4Yr?S;5VGV?okVETRwBiC0ZXIDz at w0X10b3xt4}jH zN&2?e*(H0TFwi0VY}FQ)d|ch6Xwj3(kt~Tc3(Jzok{gDPW0ctFtqwFNPP)`sScUmD zRV$0|bV%DxN5Yj|+N(p_#h=8wfjYC`Fcw^JkpSM^Lq*p(hUIQe%v*IJ+%c3hN1ccJVfnRayf;{N$jSs%W0))HYZbhN=L~ml5^%t`^u>hvv-0_9`h_T zbHKP(InGfDi7>c at +XD4PR4A=x(P302 zf<{R^jZrGH)k)(VUQEt at Lm?0Q?O=Y0m$5K3?lbPDvBB1-`=QwA$ zESE06J~9KyV$C`#u~uCGE_IHsOlN~XVRlq{@TAL)>cAY+oB-Gp6Awg3Kq>13T`moD&DJI)qX7Rg7f at FS=W zlTgb*waQd|b_#8FK(EzC+?Hj8Ej6buYrWp4TKq36?{||Zf;)O7GX7EZsnBAQ*dVYqO?yd*L!j^r&E8q_XfkVu}P!)!TVxUe%oNU-mPld|MG)`t-Z z&}2x(Y6q?3kFAZ7^q>AK1MbdHl+IWdZ-T6o0&ZCjIhcs~KlYqv z+=}a{$emt;bb2HYT>@*AD^UyN+IV at 7HatDS&F-^qg>=7ucL4vHN9aWx`K9X}WIM1J z3&>i>YME5Tay;<*69~;V3xr)~2wCGV+UEL=ZdY1X1uQ5m<>BBC;8L z6Q#<|dK2di>UWG3gP_dEC+#{2%`3n?j9_b3@>|b1$;s{GMZS_bCb7qZq8j4c- z`;-3!0t$r$0uuf2mxF)J;P`)&gX+{jO>e?yo)(Rr`B}$ecA;a?m?(w|S=W$bTyCYhAmU*f4RxH_Q$HZ*Ewf@=t?0vs= z(W!601&lFZgP`uf8iuB0EsC%b;vy`=?mOd;o(nYmGtIza;WdW0wXry3yyNfE#KONf z*CFv-ldp9Bh%Trr?|dU`4rO8wZNP-f`T&`8VAPUF&}eJca*idZ8CiOKIpHoU6S`wc zR(H+i_2TfR9 z(Y_Mk_q!L`q7JUeM6BNHv=t{qB52hj#u%3R_cj zf}(`#sYVHD1EV+Y?ueU9Ook|#&aD-0!vh2#aVMM84*yJjiD#E>1Pp!5Xi2N+PeCH= z`YNLrwa7MoYAWS`ip{Jw>eelUqMA2hC0VaZA*v#3ZX)npCJgjeo|GfhC`0j`o^4 at p zb;nssP)-4`WVLonxyj|(gkgK%&e?tvX`|~9MVcmGZ3INexj+<;Y76Sztd|-yjp_`o zqxZre2m>iGsGm$74l-gO3rt#bbcM*5ix+s_B)>2LtKWjjgr|obm}ESP`R}?1^!b!t zbn$EtIGZEV<;^4MDsQ`43#lq(1F-D^_ at 7#V566}zf|RA)rXh-g+-KcZZ2p@<{6u`GAps>!m*o}`jQNQAW zU)mvRU%v{q9HGDtuxLeTTsuGiDhG)}pt z{(=YS at 661q%P17W51acZ-A*g12 at 1_u$+mbuPiA{hcRQQA`G37V;r4>yRfHLk04SJr zPejy2VcH>vjX;ixF=7n at 2`{QJr%+ZCVR#$YVF#9R2axD>uAIPZ^&sqK(*6Z8vC^v6 z%=)cW9b at +4ZS&PGD2U{%8Ja&4%^XVw6f80#$Se9 zX?KexsANsN(+sFI;DE0}A$P1$qn}bZiAcx5<7TW;$ z75tl4KUNqgKL|mSKQ<&ch0Jverg7W9;R3zP2NPX(s*9=|yN4Op)G%P?pedzlX;LIc zS;;DcYV1f(Y%WR9QHAj4lgIpkCk}cD9_F0S3cndR3BO>>N3Y1modz@;b~KOUNiO>1 z>woy$#4(7n0d11b*+o*Me at 4Iooah?iTi_3Qi7tL7ZRE^gCC=^5AcoU>ObUbF`y7$b zEeuiA>*?IGe%xZ+bc6ZQmz#ynBGi!OBve>eKcqs$uPwe1eT+oRR6^o zDTMzK at Bh16{x`_z{skEfKe+}=zCX6Y5SE!}6be#*N#>4lz9d8m8YBV5f;KS1ZlHyx zs59GSKw$(EcZ54MH(YjD+JxHQ?N at 2L4=PIl<^Psmo?R|Hnc$^ zeZ7c0>}w~>bp9IfTRjAJj3Vv~ugv`SjFt*j*21bOY&F+J!D(!OT6SewbB3C68fDVd z<3)yLjcOB3_<4z-aB)F$wTf}Ik<|7EUyF#nOQm5M5Rg0rh){7Qskh*?p>uA_I6TM52y&aE1{Zt9VOuSpv?1IeD zQf~78e}Rmx#TqZ5vCvqLS)8c}9Bn`}RzlXD+;*07Jg1_?ZmYEH0*`h>^}2F3!m7#? zUF`}f at A47Br?g1Ca>>1b1vC-GL z%FDDQ;_Osvtgu>jntz;PjHbzWw9 at 3Ry{9 at mcX)v~CNKsHQt8c!u<;1|fpc0CwRw_w z%csP|CqNYjZ at SSh&J;s15qH0r6&0HgR!_9g#)4T%aAmE)>&#DP9JPSki;KCh!xfAO zu#_)@>HbDE1URo>VpeY^uwT7onCUuBjA^!ZnkFrhQhkvvy|hFzUKGu%WHw? zwXQJt$9l at 6=To~B-H1b{x{(_938nS9W_%?1vl6@^EZ!0wP~jv7=4YH5XQV#t5;y+v zr`Sqw^{F`@xUhHEaR>Z$@LlnLz!`#nvfynLV7ACA1``(*68`%CIw>J!W!P#)4rYiG~Kt?SKJW z#{l`Wpz?+(w34Yofeu za}nvxE^d;T*qS9RyK==T?t$a|PPH#QME)TecA^v!bVeDXJQx8ru<%_xqc(K!WWvlt zNN{ZtI$=sK!GA!;_#cpA3En4prF49^!6#V{MVSG8CwcB$%|&@nH1eO9J4Ei!<+{9G z`18Jo?^HzWNwVAI?72__5 at YIm}<3e|HixArQX+xCL38T^E!>5Fy`UVru9g$tL`a`0B=7?M84G?M2M;zC74 zb44D;?6kw$F?@#lxFXFWE%D(I|6deCM>vOCpkFJUtpk;cZvW50uuUfR|8=iQ$st~zuz5H44tk2S1~A7(f-FceU)rBJTz<+Z3wng6o=5E zx3{PziXkTyKoWp4_F3Yd^}DsK+C}%gOZ(ief)K`o_%iRdzF;pl+JY(y&u2_czaC9a zy7xFcnN9cjbAd7hdH)DTP|pY7>1)CloNTjD8_J4U|4|n9J{SB7Bvzkiq&SoiVG2+P zKwlZksSBBe1oTbv`471!PITEt at _vTzfFDmlf_($xQ#UBro7_Juy2oUusZKm6#xsS; zHR?z(7f?9G_4kKZ{Rl2pPa(9O5|73#Sdt|af0Yyw!jca$V3)@dGS&~}6;-1bRk0dN z+}7!gLU|{e%ig(|RN=6={Ve{Rr*BWTTH2_d;-l$<3DAymhu;tmw~GO4$OFV8JxwaF%O14yrbPlp#k3rQIA z1b5by9DKV_3$Kex#WuXVM9|HISa;KyHiI8yQ!xp1B)l>UHILl|s&Nw|`_nVCtaQZK z8UMo5|$*5m#p!C4t~OE5==BFy9UfOKjFD>6=G+QDa3w=;*m8`F9=nL z*?A8vk-4A_Bv)vSo%`T)gZN%MupIBq3r_BHKgoijZlvzf+eQSoM}7JlX at zzbeh3uy zj>u~XQoF?LXx1HUK29UKkSdm?lP%NI^KHsyaah z@!49n5mkx9h*fEA=Z7bw#*`&QzX~TL7_lt8O|iX-mvZ9NFf*a)c52Ej0D?H`Dmn;)rY4F%81sxWcDa}t z9^!KFKpO39!ppmgq^e2aHGOUg)gXt{=6T|&D(|50c4kJkM>%q zb8c(e&)oa_`9c|B_t5leW!>h(*rVk^Z+7ua3~=JZ9;crfo&m$#-zw4fiap#R9GT|A zBcZ29(DWLKyy`@Geo}#@AwS1&2%-YuizQx8w&EgMeKn at BR{9?ZAtRqJf+$f3sOTsu z*bc&$=!k>n>x9H|aTN1{Q6S9RPr4mX8ALfuGhBu_D*`<#8Wr+FV1zRs9eLA}Btbhf z2g3UdNaDi=P2)!Uf(4a%=mym4MDeZWz>6 at MXe_b3vX&2HvV5VS){GH_Ta`*w6u7x5 z-?=lMTwSiXCFWVcn{2}ZFQ-1=>hNSV>p38qvZnIvNWqME4YGNg$08Hj3^mO&-YCWp z=#Ik-(+i>Kj%iH&V*oNMCu;*}s17stA*^;F9Cp_{>Jjf>QMU zG49k{s2*p?zDXIPQ;fnbC1BpgrzGbEMJmf~u|lrKNgo{DGK^CVWNyAPW?;OUe&Mf at dWz|^^$XUrb(v6y%u61jM7 zPsR}quf0G_gZO2C^tl*`M?q`u6*9+l9iDu=RISXhB_3vJjtwa` z>f$@Ko-i%TA=M#&CE<2bP`IH}P%Upf)4-iY)IgmL7^C)|P%Jm&SU|Uh0%OH4)7D%a z+&QbwPCgziR*P{dfS99V7X$wA#@Zv*eS5$RHu+E0o-Zu^jxemC&C(4b-|}o&96D5xs;j4~--Vz1P>>g=|B-OipRQSVlpTys&~ z-jkh_>1ZiZRklfaG9eNzL9Hth>O at ymh0YKgOi6JYN@aEi``WZVm~9;HKkOU*lxaNB zz`QB6cC=P*Hb0ksUYI~jk~yH;W$5SD6AeYTXy5bJLQ2 at a235y)nG7;AJ!!xmp*~ab=^qQu{6E#X!08Zc5R)PmRU#*XPd~rI!*f{f5RKn58RA1M zDtw|yp|m*GlJ_Yrt225#dXbad7|orRh-r#(ZdJTF*7h~jge;iQS at lBou6)J*CRAnX z)B!s08d8jAx|c^CpgpR9-vA at W?1UXKwusDwKectb8~t<{t8qX)3gredh2cAB%Jr0W^O8ks|9j#?aw=7H|@B*x2}L# z=tdu%6Dp{Jsawa5u at NS;cW^YGzPlQ6joT>Usu)93b at q5_e?QU=_fbK2MUtLArCVCl zZFkI!i3XNb&Wr^>Gji=f^#diyVU^i=(lSCAznhB5n8xk;}6p&TM-4*M2B;tvn#YI+$)GEh{hTiV2;h*RczQ; zokKb5EQrqt;7`_y##Ga*RETubA1ch_pTlxN8jF|~w6Kc(Miy+PK*$j5bD&3rT6f7@ zFsSRh^K_qPDWb^!A0|fswytMy$bztNh+HwH^RBR;L zWxS-9^eeVyPgwL);UPfI_s&q;ecqtMumxMZCz)Uv5SHv zlEL{WmiDRm7kBhRti@S*6=@ zU^T7oR+nF4}|1ySWn=@5&%+rg&QApzkAs=LF5P$VdmZ7f at q)`CL7eEZiVccxih_M& z$@y*}s0>{aXuO=EZIPUVX2=;PNx(S;!nlBbqUkhKGV)|j at 0(w^hfhFSI+5A%Aanug_E2?v zS2Srt<$=5*EN90&iM>|d_X<`H!SjE#{{?)v13P~L0lEH<+W+cKmM*3$7EboA<`(~t zG5E!*vi2J)D7^IdyOWEI3zGBjP{qOdlj2CBYy$a&rV`o^>5yS!L4#MOZ!G)E#^ABK zCvb#cBCkJf8i2w<`hc5zfmP3-5UAODuLU-&xd9|#u7mx4&wAVL+wI3X>(AdGZ`eRH zM%}-NJ?bHF>FZtN?WM6&VhKW}MY{sYv}+rhl?F}!nkUr(YvA!XmQE-Wg{uz<;co_jS_^C|c;1y%45S z;F4(Q-H>Q2yHOM9q$`qmQ7AA9=n3QUrDmpJtjx3j>1lir04ew3R6h8Tm|bd(HA3N* zRTXPFHP5ALe<85=dr-sI4LtpA1Fj)A)Kz}Ady;dQ7bVKx5M$eL{soVm(hrccpvMz2 z5- at 87W1K%!YVP2rzl;r? zyM?}6SkNG^Se2l~=3RFYggDM8%ZN4Ic0u0clo}cBJ-XTFvrp$_E5`SZdI#J&d$q%X zFZtzhVZACJKV at Uy0)O*C%(72 at GCad!{*iDqSu2G47}q)!d at IT#l#EGgjb%DTrWxfP zLl at ndLoR&dE#eNgS- at gfH7MY&XyDW2)8zXrMgLn+`V at h-_yt3d|H7FO7k~as!G(&l z&C3{lh;2s0?a6-LQ^4Q at 0J-m;6wUu-S~MLBD<@D0 at MxPCKjVpSO;s(ak|;V(*!9Ar z4?YLwK||sdqn|d-B6{HLiqh)2`Hu!y!S_}s*vXO;)4DA>d)8L{W&{O=O0-D0Jr3zBfI2QiJwh+oB3W(I5^C0-lf|DH;i2K zse4w+bt}(q-1;pk<_z*wFXx`Q_(!w?DkcPJyZAm4Ep7We>=Oo_sZh<-GGLwHv4`KV&H} zuUH{&bxbNBKXwW~1UTIiTx7GCV=aSbZ`_`*0nr4)xjbW)X~UB8R|0R_9` zMGFbMSHzk9!&Tu7e0xeVRFg0xgG+^6K80YjgS_H*YJ<#g at ZkAb zU#!!1jVtB?d@=`qF^76e9h+aBV(uU-m%ja57#6rgSc!ik{rknhceL9!Td_5WIw6CY z=Ic(iM8T|YK@=C-EP*^5;0?cl|Kp5#JWzl2-yr;_S;X}}vDV6_|24}sJ9*}x?&`?z z0kjrfw6y{Ps4pSECQ%Imk@})=K}c9pI2Kl~%$mfGwoTG?TF5V9JsyjKIE%fxApdA^ zdc83F at rI-paI1`L&-!X53H`4*sBy zCNz{vO at +tksZ~EOq zPvz& z1XC(U$mUKpEaw?JKQ)eUG~VB0t0>B==n4<9X}uQc4NKx`-bI;OdYEzTxKQeyU0itC z;W~qYokFu at 5$ZKLvCriKbAmA#6)^%+sryWUpHlbRk~G{Am)%i%#CBt at J^~U~*`vT1 ziy3C(`<_nWlxr)^u!b6^*lQUUm|4c%N}>}QI&Pb`7YS06wL!(}q`*KTt~mhj?T41x z6Sc+>25+uqF at dBp{*b{9J79FVShk89BmZ>`bf)ZJpUVzGl8ODaYh&TJuxIisuv^q< zDcV^sS;dyv($6ytUS14xd{@%Z7tARpGO980lg~dwU+W?lwd;1f9640?b1m6^QxUMspkV^<#VItsu)OD5@$Dw3A4Z>lJYUoCS?UR1%~tu z^zS0 at o<$Dy_$z{a(Eo`D{)GU}|0RN?ZF?j^gpuFSNkR8iD74EhTGr)v15QoLZ$N~M z7Rp4;@T4SfEm`OrUK^|5fn^RDki8riije5qHrBJP)>i622uh`p;|Eex4`ElQ86AecAFkk_M2#w$(t|# zkkCx9 at c8E9U*E@;XgBjNG`EYo#kZsc({?cpsCkWdr-KQX?RBwZ8nGH?+IL)*oGyDV z6r_txF}5x3)Wo&$V2EY?nhg>_aR6{3|X6Vp>-+4xmrh;|N@!-!Hlmw#3l+(_I~ zw6$0l<&AY^EII(E##&T2UFVw(A7J?Ee{A+AEkf!Pj%$9uP(WR&cztZoQ4?jp|6v|e z0R2~!F38D`MVl*djVG7 at dlOK^YfmNuwouM_)^cRZ0MCT6_;l`sSkMj91e2>dzxI+( zp&Q#L?mw79`Xgoc=w)l96-UbGr?3X$M`b&H!}O9;xnU%^Mn at AEp0~i9PT at G1N79>_ zGBB~o>NOHRzf^NQcGOv^!rPT8_D5CV(=WJRCCYgRv8r z)pYH#MNxPYn;Tm?rvNRGlE?(XP0iU{Zg24{^^lb1!W$fr2*!&&)l=g(ovX0tu0=QU zJDB0Ae7{tbejo*=65YbTFo!Wetu<#Ruc<6gPj)*WZ#W-q>AvQE`@R3{CF+S19&rLL zY%4Tk{Q(M!YJH3_Bo0|+z&pKL!@@6T at bkH-mLgP^(}yUO7L^qB85HnYTYaP>N1$EP z3BC$AXR~3RI1D&GuO~%=Nz!@mXKAsCa)cDHijXuDfDX9RChkd42 z7NFOTX=yV;Z!O9`M?8S^{0W}gGd5(FO)fb at Vj5)RaBi3l?bUeLE zG3gpmX6(bTduzyk`nJjdoqXw2oT0CMG7zJ=!RE7KoMBS&G0MTzK)c=0Slm04_R_QD z0Q38h(X`1|ZO6^RA%A8Cc}{i$|9(k#gq% z^g7bdGcCpU2cDJLOH`dO4%Ve9?DnrxKL>X){Hgot;**E*=N(Fmuxm at V%%gvv>hkg~jBgA*dt_6 at _JYNMye?^PQXz z*~$|*lKGXyP7rixllIk8^;K*q57!bsAE#LZaMjj$If*xHo!n!mjf7q(Z?thHyw;qu z$XM;6SY4Mf)#VgOQ6W6F{8|Zw;fzsGf^@KDl`MR0%j1*PTzr?f9(5*BOmHyeM8S(BdX?1eutk-Kk75m)MdVEdzs8n zLM|?injCPJ6u+V{0tR1)#pU8&;H(bBMUu#QwHm|XmyuL_F&%wDiQlM(A9%>#qlk8m+z>^NoplTA9TkVRw?7(vE}ulRUx&Q{%ZwuQXSIoP2XI<2-6Rw(T74k{5j-ipzbg}@&7$% zU%h5kwf1IF z9kDFF)PXIjwXRiJ?fcyNwc%gDzm((r+y{)^a5Dyfc)z>BY(C96mu^B5p7Mx4*QXZ&|(nY0!$4XR!hs8>yxX=>w?gb+9TR^kbRup&BN$gQ!(t+?* zonnX6bP|pmaUjD*j>1DWkK~gi?~P_6%q8@}VlfQr;u-wX;k?LJ9uTD_G|(a{O<@9( zy)5W!rND10;*(-5Lc=RE18XUGS>%_oL?^W+pye$;B143&Hj7{}O6aWADLyXF2z>^;ofsbj^S- zR=~x414Yo1bah&`l(y4Fgr#N`y5qvParyxc(fMZUw9~lNdb0}w`XAQl&b#x=O;1KM zSNBs)yd)9qde9bjGWJZj at zwk^W>ja6SuYK&J)$3o74qu#PSxY{!<_LZNZJN$5H{mp zr-faoF;m2~voV~&+G@(Ab*!m7Hl5z)fx{>(`YL_rF4J>8;VuWD9Vy;>jSVk~<_ial<~L*JSH1y9^&dQ@`U>W+e1Q%U{apj`IN2Vt=<%~ z%rfHMSJr|V*~SeY=aPA~_1{eEcTwU)5%dgLA3EHpTr^pG+LT) zUT+6mpg-t&%7l?KAno&OPk}GQICB|-Q|}3h)w#@1KK)+5fOzqBo at 7d656&g3UBJd3 z-xj6F6#>7&&0iJ9dGG;3=ZG&5*WiPCCOFR4FZ5H_GuXRpNK-O%hV at oZ+VM2p?< zt(xEKb-jVqt>FtKy&=4tLLIZ8AmA)x`{mzDD40w@!5B&W%}m|{+dv{$uKpMREJoAoPBid;IL7G#)6w0pQfhAfc}#USv+%q9Jiw=gCC zkfm||VG0asBe9o}CoR(6Yj6)t1(GBDlMowp6NT!hEG_h(!7kM(RcV{ANPkvHE%ZcH z at h3rVB-1rzi>2w^Ur#J=P38=FywtQ$30G=1{TOy7xY{SLXd6_ at yE7!?v9(05>v~An= znzn7*wr$(CZQHhO+c<0Q-hJYp9p^@L- at XwURrOLY`Q`uTh^ic8Z1+b#OOr4dx{*LQ zfa&{lI^qkv^hn>=MulHWOU8c=NzNRFj)13 at xlSU|N^J4nwYt~7F(S^tH{lTHHGuxf5s~#A#m9>KmY)i(Ep#h z`2D}dDJm8Um`Z5gFho>T8uRlAG*#3D%eLTVl*&Z#5^bxzzWij19T`(*?N`RE*T8uP zG4tqEjNZ4Pj+t^Mol~zPJ5YufU*qRo6I!gs5Woc zDBruI8~3S#vLfGF+(HM>fVxs!IX3R|8qF<~O4x7+K4;sEvyH*8?~7QDHaBz}IcgkH zwV^6d8xriRhX9d at Rc(~SfC{j%))%6#DvfE&V$rhBDCc|F^LiLdDNRwp&Q^WxUkJls zW!|1mD=Knq2ZR|2(UdmEDf?sI at 8A?Lot|!jNXtsE0xw3-UOxnv-f*AEpFAhkeU9v~ zxvl5`Qsrnu6%}6~A8v|66}%bJF5scY-8h5G?_wEd1`h2?;Z~d?a3e;(JL8GH26_JlnrIxeAbj{W$ zY$CU{6roLD!GrIVOj41QY3hOAJpeuK>s4w>zb3g|#(clI3%vB?Wtj^R`r4;>lk~jM z_1I4?Wko~E+7iz=_CCgmb*q?Go0lFmsD2H<_gc;douDEqANRhSy`h2Si(F*?N%KcqW(D3qK=c* z;W$qZ;-;r^KrH9>h=NC)w*2scmI7-~I28a#-9Bb}7bvi(I)sPtL>n`3CoaB9q5>QN zeXTkS!@L- at IywhM2Q_(&wW7 at 2vfcHrWbXD}ISTxi zxJ1v0?@GoNQ5yIG!QC4I!QEdN7=!FdK$5f12%bYJ8>c`QP7jPxOniuL-F5oZZ+l|Y zHfh_?=55q!_kOI$)}v#7)+D~i0HvI8?lV`Zew}}m_Lffgd&C8>EA8Ra?;QQw*(#uE zSTJb9djURADkAS^mEVL7b#=A$3|A=ePQ2*bM8>j2I6Xk`^sNM~kRXc5sI`5EW5y%n z4ZB6Ry?Od<3zJ7l-Y$w;*64k+kgfm`BFe;c*`FrRv=D=|Ev3-MRO?buWMuf at E6

q!G^egLY{6%*s6ju3hPNDcAlv6zlwqkC~E}r!F6yV_RMLtPIIFet1 zXb8wt7KLtGFP|V^+eDB?JvR$vY~uzpa}44!%jGp%{rZO{fdoCdg!dIUHjSR``!$g* zwh5oel}I}_?7B}ZU;K>>LKru?9K9Pwa<`X+rLnz`HIdOgLK`lzgOy$3ILO?>-h_`k z_#)rDE{8IY!r%95P{~$`s*m_#NP1&~Z(5UZ!bvhZ&^avYY5g9Lok42r$dQ9&(?KFV zL61(r-BMJ--_LvF!To at nuYO6bHF7XlSjS&>fG1{H1TQms*jo=*t-L?JR=0|20-1pvVK-?hYl`JX1Zr{dBQ&&xCsEu$Obnkc{MFF%4n zAh1F-WCG$q06#c7aJn`o~LgPpxq7p;A at JFe=NOoD6|g&?%!%NvIv zT()FDCQ_Z<8Q8Yv7`A7F=&wK?o}-xv8h7!|L0}$-IfMNZtPfz+&v~h*eU&xG=2zws zZRdh*O6$AwSLl>)mW*t;o`d-vhqIsC6Xx$vK6szQTPKVjx*of} zowohR!U59hQKOW(>ds$ZvZ~V_a{Vn$qh*C8&W4@;?k3HhDjL&!ujfP z4qJ^H$`tn58Nr91Ld&g3zuIC)lq*JI+t2vvD at PNy9N|Np!a0TFN+8B_50zh`+i?dJ8_;n2|uq3x82n*cguf_{Dz;239oZ}OIkgN8Ef-7zx)mtSwX z)}{tXoB)FvJ0N5kz=U!SiW2-bhN_Au3ILi281MF?G*z zA4EGAZ_v~KE;sF7njO`l9xXb-95bFZ;VhWfG594tse?Hsle_cl-Mu?bleBbmcd(SJ zQGHUJN)4A%?9}MD at jMkh!!(>C5;8 at Em$4cqUeoi-@{*S7p;M`sSB3sjpfzayu7+Lg9to8ZFh_SKiff6x?@x(St|{Xg>omU zD(utZQadjT5djB_k7g-oYRru0CT6EbX4a-Zy6;$U^~hFa8_RX=Rb^gJ at 5#uS&~A?C zYq^8yZK<`x$;H9TQJBrlS!;`}bp~D=&B#*J&>FKcgzs<`45P2Vp+_&lon0*OO*JRl zx&d{hdT8~l=F)z zbLcb3Z!mZF#%WRLMWZa66clq9-n3ucIE5zZ5Osk@{X5vVLhk~)WzR^pbD)LnC2WcJ3PA=d*nz=j6$>ky6wrpGccW?g)-me9hVe?GIgGuFl%!h*AdwjtN!D}1=2RMyOG|#!uTPSgmK!tvGAJ<4k?jBn zY?=)1aX^JNUN_}m$y4E7ij1ndlB(sGSh%F$j`fpW2?Q&Q{giXm6LRn{5ZDMmURK(e zUR`a3hg_*7vMZC`VsS_ at u6$u{Mj7RuD}2SuM(-N(JwroU8^?^2AUQZ>VXgc_o6#tXmdMId6S}?ywOjE5`U&5P+CVwd`%UbCcQ-w( zn=(vw3);B+y?v!#8i2}4)j-`R?RX$yBASubALCytMt9X at jjlOMlEX7QB!3)v`4}L= zd?p4ETx at ys@^VTfk3L8A$~!dx%!uLT)h+E~NY)(A1oH8lvth1K3BUa`6@=P5R={h{ zFFPLRm2Jt$g`m at O^t4Zo-GoxucvZxfcqVd4l9)ed8ZlIo_(-=NaRZ%JqM*Dsm zT1|ijye%y~SE0ycCzZ7tedy}w)gFFuNh00QbUU$89iIeCXvd at _UC}3Ip~mb1nym?C zMsM%f^(?gYAUdXwwV=(ixVU|4+Tv_PQQd!0t`0oF5J{@GKie>DYh at jjs_W)!f?o_Gfwq#rJM^;0rfB^3fxu?`rhcL#01C=G3T!~GVgGuO#%nx z8d$U`n)%4+5W2iP2lv2UUi4#-qqBK>t85(~0Q)Kxr9~(nlrqcnt;6eiM;$jd?P(temuNntvK12s!>1FMti84Rx_9W||`)rnHH1{it)PkGz&t+&B zMr^5m80ZA*`;fv|r at k!d|MOVfspSq59nWJsP{ba$s=t(@5VW zCPhrSx?oh!r|d`y*2JJTwJBT_IgK*~>cT{OEjz)clG5>d%UOr#-pS2gjd!i71(U1y zMs_rJ;4~KO!H4kl!X>Zb^1yDXktmQrp&+iP>}3+;*6IDWx}vFZG8du$;bvz}ZPl1R z=JeHvaq;GFm%MKc`y9g2l;q7Kl%R0B;%QwvI#te at kS%wJqGVlUq8NwYuH=@CCVLp7 z^ak(NEKZBBVV!VN`bhcSMB#WMn8LsbnD1D}KHuH$8luhYU_Nd}6ki=E5QnYgFBm|=5mJL;=U(6;ZyYxYqKZLtl zB(G at hH=X zY!b?%q!?zd1mhd7N^q{!rU64?FN*vilt5t|A+B@@fYf~7np-ll?Var9QsreF#0 zc;7mS$wosfdlaOfPT|bB)G+8SgOb?i^3h8x=E_8_-5xh=twUR_o3ug$3|6Z z?dcs&!Gq63UWyllTRabY3M{0ZKQ3`(edGAo(nZ4Gfv5i;iO;8a< z0UJ6~aW8xf+n+I*OHrN3N_mfx6dksK>{dZxlK_hB)ua8oSR>lzq%XM19h`dJ96 z`;~2{)}EjK$`CGM+mh>MHYazOqUff&T`=x(lmfg|2&$ilC*C1Pt$dx>tUMd}!dhSZ zURGI=yL6Vvwhh at pe2_X&S^$_s(X}ilvoL?nbB&Do8QeI;v+Qi=ZgpjIFwcT?H**S< zl})m8ptD)TV{sSrkX%ycO|E at YR5Kt3`!!Dz_emlv>+nt_?B>Zz!$#^axaq)s*)h!5 zZ<wJl0ed)LTcqr_J?^DCGk2~AXJoOGK at 6FO-HSj(q zWwo(fv$#35 ziDybP^Em-=<6u%#b_3~$n{nn8 at 0$L!GSREhH9#G%2z8}1Fy>X*?c}U9vjN0o@)hG5 zG{+iA&7Usy+OL6mxk_WfNTEML1l86twFajoW*YWl%YgfwG)#Fbm4x!_sf6I>Pc=g2 zzWTRx1y_Ytr2;c|+S2Cw_T23Hs^h1?{lOel$V%p`GEGBQftA+^cDB6+QB|k;9N!?|n^ue8lvQ6!TC+G$ELkylLd{u>954Npx_1+Qr z(wm*b_`uBbA~PvbtS3TdIK`kNUwaDbX9l8!7*(Yt7f=hz(sHO?b7YD-qX at hK9g3FA z+Z3f#lS9dJ8)W~$aLme`B1d*&6EiV_%qF{{raDi<*u6%^&TE7HMw5WIJ&kbF0xFAe z60(viUy?z)Cv_Jq2OKXRs`ZI%~%zNL>99}`ba$^Jh4dd*8cdbfVF2lAKwD<sDg3hD6PZ2Ae^f4qv#V4-l&%*Mz&TF at rjoMkuoma?q)BMez2bD4n zkQ6+_Fz8-xkRXA8VLTiJLpFfP)+l$yiK%p&xMXDxNdkA at kfKw_b zmU{?!N%=eeICe3o^a-p2U`Rr6S#9|_J`+YB!6zj*e?mxEU_>#L0(pqhfa0{$IBss4 zOZ)|x)E~iXky8DM0Vc0hW}(;Oywh+;>0Qmo=#LDP|0 zntRUUYd3H~(kHrE53_YC<@S{09l>XX6o+`3NTEcq5c at 8FPeB+xr z_?b>=L1{tgpkmaMf)A4dBinSLHHQ7A*PJEN^!Z*+YSA1jd5~q}Be3(4{3?3ORe1SW z2Uv#zu?+kU>n|OHc?LXOf{fTs;(7YYw9Ay_r9 at 905a*rlJ>LTpRGv3Q=AJnOq+VI~ zcw)q&P|0Xu$=oxD9EOg$iCpM>AtFlFzEg{L*KnXGv5K8O at w3P`gV`V?Kn#tR$z at Lhz- zvmN^6*oYUg)~NE92rzTxnfsi99YV>rfL6Fh5ftf!o4ptO7YRZv`Vgj*z*8n<5|(*o z?q&T9B%J*dJTm-LB8U7WHF-M_I2AzWsE%Ha03Qzoxb&p4+AxYUy!<$r^N^|4d7{{ z#9DP7`-cpOG>ze{>EALZ+P?v&x(txUi&)0n#1b8-$B)R#O>jf*8|mey5fp})RJn>Z zi&Nm(adX{X>`Lg(?|sdvDQETDQ{y)Ez4;+WOeRrqc_Y&H3lCA4!>FTEsg3i7Eal9i zSxu$q`pFgS9Y7ws9s0T*lJU;DeQ^CJ`MBcBNEtv%4&6a#<{a#2c3f0RhYw3~f6FV& zHP@%#CmE+#R_2+FtC!2GTS}^v9iL7h-f6M2KTW^nI*_iEQefr*FBv at uo9=ntMJltL zGnGfW%K-~pR;QLMC=GdP`LQb#qU2J`2mrHBz6&XT1sQ)~$VJEppyLLX`Gw*;GoZ<% zqLhRx0Nybf8vl7r=BHW?AkN2WM1S&bG-i5R5-C%joiDcs;c*G%MjN;`793wIB-^lj zeW3n)+jrDOcDE$gM*yMFzzxIp=?==dSW$nnklX3~$xD0%bV)O%+tb!(Xd{C_^|#{F zP6Tr!#rv>|ji4G8(r*KA6J7LsgJLHIw~qr(`^Srz)T5Nb0h~HaY5Z;2Noi;qaQ_?-fsBL3Dg^OvzF3NtR7EKU&9~CzO9f4Gh-i)J;>?gy7G!mpG at c9| zIze1l!ch=yc+~AWei?|%ur8SdqHN%~w}mr+g$l?{aIpv at tKLFPvMc4A7Y0zwFO~KF zQqr9+1T at 0VZ47@Zc62JBS)r+BsHKaASHE{OZz#K5&_lyU(x3~6Mr)pqsG5#A;MmE9 zg#8l}Jei5VE}3mPJlkr7MN~QjdeHF2lkSYNok;Y)G9gj`Prn)pmFjtsFhD#vXvffspD+O0jZNvS^%I z5yr;3+Wya!%5^Qiw(j2%E=o@%ui}xhNmFZV=Ep7}T$NgHGekD+UyD}o3f35~1{0W? zF%NH!mUk3JU|(b9&4~gf6CdhYIn8xPkni%Q*D#^2&;+U4f(dL^(2hSoYNr%vfa`bh z2L+iOQ{s}vPTD{Gur|ChR#D3-F`bCm{G4!hQAAG?ry+_*Ll=lW{Q+4O!Xr at C_WV7Q(ycP|Z91`DOZ_#V`UgPM zVa>q&lKbf@o&-J+2tAKjC}Sz*5C&ylad?G at Y{!C)T`%F$TE^lz|aQy zC&w{{Lwy&MRwkwMP*llqrhY*s=$BF0_M$?^cIrCxn8F7^@iVdH)yy}x0w$W5`3j~& z2fmxRPf*zxbMdp0QNg}uKQ<(C-OLI3PRn`RD2{GD1B-;iW zzZ%QaU5aID5(i^O3w2HCch?H~Z87AfVPD#3=2HXDs(rAgk>C=Kr)&xG0SEM8 z7xv&6atZ;q0f(ZavsSZuVCQCVmfw_7cDY5p8DT`KlWQcZ1(IVn2ubt^Tx7m zdiOmMm5(xz4=2pd5Su? zXy>?c?{ZI0ICg4Aq9Nse4wGpe}KYCqgsq?J%4?@doJx%Tj&F_1i zui$dvasuyi#6Jd!Wk0Ci0krUFjvm<3g**n0Lfh*2bt*FaB_}_u+Q)P=m at KF6Yp>NI zX4^DaaS*t6$Z13%2j;1TBz|iZ1XZIrK at sKD$7%vXfNT+XiM4C6GBC*TS0kyU-M_N~ z=v^pjdj)!CoZO3~s5vO;aIetwZy-9I8KDiSj9$4V*>m;OS$&LG-6d*_ARZlSv!iO8 z?>EMUqffa~_&=F0AP`x^uze3H&!GEF_OzUQ9cqI{dJW?vz# zyW>Dtk^p;z7B at T1fh0e^&LxpD at 77*A?7PhVR1pho%Y8hJnYRrT zGEgBOyz;wN``+CFfGsAx>n%A4s2t@~?eEw}!Dbq<7McX~Fw2x=cX}PRHBnpOoWoBiO2#-r>x-~EG6(>P7jhpvJ3nL{%fClxR=C0ml$m^(Qe8gU)E at uZoE=2 zk@#$n&%(rsx2KcHi%@Az{_FKDy6DIVv at Ey1)48qzNCAHHrq}(!y&tCUPZWt8Whu}e z(+!lxFA_e~)!haKb|Kc+RX9FR+NBxYEyYsI&(k#JN7+m-o`NIfvwh4&I(vL>m@?R?d0+h@&@ea3sOW6B!HI&YR zUf!HyEvOoE`yd;U0k<9bNDXEqIH$MO-0>>SB3)Wu%*5iNw_c{EIEBN-#NMV=fy69(ovfsWV zr91pqEKo-yPDlp-lcRrWpYNS({ReOlS8kg+0@$eil;4Y@{*-_aX=dE_QiJ8~-wQgN zLSt0|0s;Wg{{jGD`!D^eCXzR at vT@e4lr(d2G_p4OSH@$OY at c*LFPv9^C}0_$CMPDW zyIlb&Z1WyJKR;PI*qN8rvawx<#d`mU-RY_Va{!_0650!J1tWo(t5~fj=N^iZR`Le+Ht)U1hVT)~xWPNlF$r1Dv z8e2HBcIE;%zM at GpzqnL?gCSSq zDuILErmmzZ&FVe}rL(OsqNqmG6i|3#?I$*IuQ$Du{-4u&@EDey{dY>?K>n+FAOAV6 z(l(A}#%2cpJP!4*sr^^6G-Hn}+J?HYXdL6&n4;I>2^)E$_}_Ge<(yE0APP|L?Y5m9 zEfW;{8%8V0-fPEvc)xqKjVx85d_?)?Wx&k zZi#f(_MEI&H>=QLTbxg2&jLr)D3K(C4c9hEnzN86kS+2Wh(D#ejT8zy_LaoIr0r+9 zVMvZ3Bht^p^p-izxLV3J#{}n+T%0xUdVF3x&)+O)T#co zw8^hCNj#KuwwW`VS#8vs)1>6d%r?9QWF{wKYr|@pvG+IriU{T2=XME1`u4wYXVB*r zhY_UiVQ?ihtqf|e;vl41OOL&CNFPI0cjaqK;Z!ZxP$F+G>+#$pA82SxT07v#ARRpZ zk+WU1<1bUCX`A1%iDzip3-VUlY*}1##JW#c+~sJet17_G;;`OV25CXRZgh5mdRwqJ zpqnnm95^lewwWXT!NpWyGFlv+osD5)U}CPHtA^eZhq_06yy|zW-#Y9f$snpg9U12F zLnh_s^*}Xxnst{pve=1T?k>>!@PkC6#5p`5pb>Hq6TziXz&?6PC=tpoPwEAD6Oa>1 z;#nQ-nIG*De_J647HE}jX5{067CEqH!|`CH%jdjUNshyPvTJV{PU<{xe%5vR-zBqukQum at mXc?z#D z3Wtbrix(Ww(qt*_be7({n{&TEHWk&u;s|Z(37hpt-pphZP=Jg z;($>OX!f*;At#1A{%^E-s~uE6g?l=r!Aut{=6bCnO>#?r!Xt%PdA7K%BN?r4GXMD~ zv at -A%DQ*~{GIaw{?uT0DyG&6iv`G7-=+bNq(CF5C$BxOEN5Krz6zZKg3Ze%sc<3d( zC^l!ba)}p~x(Quc@&bvO5|VJJr=H{XQL1uguCIU}N_6pv&uY7Hw60EV`gOa?Swdp4 zEcoS4C)dWA?OyE?WRfiKa$mhZg3RUASql6v2GxwS81i!)`h%ks2Ii8;sYHpy#<2dPAgl0EwSVjJ0}P`@@;^bx at So`ZV+tW8-uKyPs zl%b?$#wf$!dG$#!DpZ^NiJwdxbsKA=N8XM5fO^NKNhr$_FI^!=HEA{Jfyds?y@!}& zaRC<1$EJ%DH)+A%C^TActf@!#ZALt(AKr22L1`VAqB&WRlx-y^gggXkW5;LN1a6Q{ zC%ggkQT-UHADOZR)SU at VV{tWNIADMr#SZ+E0^$z5O0{*$XI!@V!(sgqyF9RAH)Veu z1`(W4c3!=`4Wb9sb2vl$qrQ25uk4RS^~7Yp{K5jyXHR at y>*NiFN$Bjv1#%wt5C)fg zq-;{{aaF;=?`M!_jtaW7NIBq0Dyn|)DDW!8dCIVcLEc(aRtE1W|I`Rn9=f{yY3LH~Rlj zU6EyOyQ7rGZAqsq!`&|EtK6`fKR7)}KS{^Kv6J at 6)#b^`2dFQ?^Fb(qf&RiEi$LYM zyS3|BEOjH!Yv4w_$L|ir_iENsrU)&Ng6emF{3UxXJ4T$RK%Wth_*6*=c1`EDn{!WL zjJ?@^qI1u_z4!;Z;!XR-Q5-Vn*nSc=c^qK!AjEa6 at 5SSo{+XTdxO7{!lLOwv3FP2c zMpz8Q6>y;(e08#I#3ea{9r%_1Kxg(B-QGXZQTOMalj`cG z)e)2VigOD*?>+JOJ)<|~C;x%YN;e3HT=>-gFS>(-f1<1UC%XKQS};;3l16dS8lq*B zcZKkGjX~G9qRAO at LPjH`GPC62;l-fqPT at Zye^oa{&=_=?6oefvs_}2C(?X!O`k$a< z`oE+5t2zYAbLjsrI)?wh(H(almBw+&n&bUdUEzPIZsW6T3O6XH2bqw0uYP*OZ&XJS zZGVQ-R8o@^$t&12&s9cIB+5%fv!h+>Uc^0rDq$k{L=-vptr;w&Jjd5hEBJoCOX`w- zRbu>f{-G=kOW>)djfNq at UP$KW_D4MUlc1*}i-4cDMkTP>581sCEswE3y(Kytb`^8= zqOre_Q5ZQiSr=Z~RMIplR$Huc=8^bc=o(KFE6S`TqZt#d_17`0iAWX{VN$TKJ2-OU zh1qO>gU}ISWRrfTAM)XavYT<3o4zESOXwkDQN;Ks_Jd!c_*mY7?w!~S%0{(S-pS$J zmly at VBEp^<{FPnIKV%2Lq)hlP$4tighhtv>B>T z?x>}0nlVCNO~&Wt<}W+Wo(dfNf3XAp2Rnnm?4F-pRw-8}3jc#$_TSBJHg%Q&zbjrf z`y7_++y?&OE#%%)7(I=mKvb%pNtuMk at q~Dtoqrv*93_w0ke1p~R&f3O->PjatPNZ$ z{{{dU0|fwJ{_n&4S7feqWxpVd#8q!uQ%N?+2FMRaZMUgQigd8si_~EzFN74}zd%+< z_9-8E9zHHVg6sFPD-_P9;Bsyjvg1`MeIrhh0EM2en!V=W@{;Xvvqk&!HG}H|NVXRg z3ABjBtiiyy>zyU4M^Oz*AgzZ zW7F;&H<^3`-&(zOiqcZ0(_EEv<$T at BA2jIFgzcrU)C^R(*j{aMj?;oZRC#4jX}t); zgfV($b3Vf)(0d+1-%m7leTOyi*3b6Ydfrp$U*b5 at kn^k_;_NZQ;b;~J-2a3NZ0h!v zGg?y>?R?18{yd?3>gy+rpX;8!s1{DH)M|Y>g}t2!1jcM# z38Bh?nISFMv?mN)HWEMEsa at fIeWXdsw|47s75p{32g&}Hvtvb5wF at H-(Y?E3D%J<< zI;{&qmdzOHkBkMR?g&0THYN9Y(Mk_ur_|T4I at keGZva05figl+O+IS3AC&Mxj^~mr zfR8t4>lNc{L!!gxOmrSnGaBd2_VGjUYdISCY6vzQt*n~601u*Y8`?gv93 z&_Ev}>}V&>GX{usP#UhANCSM!7IR29TN=M9X!nP|5Vtp3kAd1K-sSSPLGJGl4`pa_#=iR^N<$>cpXsRiwB5po==c zDS)1#lR(%~U!d**6AgrGL;`9#@<%Jt#&rB*!ptyRmcf7jK%tq+^(P4!0DuJUzgiK5 zNZQHLQozRAz{%d;$lCFLpQx`=F>_cDM)O{-C&U#8+Y83=D~7xD^_xes70uf-9bLmZ zKKIMFj0~kJipPqdeuTVAN%lTn`3~_mHECU+egu6KaeA*Vv^-RWk}giGbAH)+aeeM` zewgX;`G(%5TE0K+*Ti`!J)RBQU{BwIZ|I=7KAQ9U0LJP)ar5+}eGvQ>_ry8OGvEu# z)0YEQsT-WVvRhfKqHy6_s5=prm zVMc)BnSP3n*1BNwS@;bY(c)1bP$LO+#Q5y7gQ6ouzYUi()nn{QMUzpcfz-rNsAHL; z02l|dMTZO#pZZx4SZTyYk-`ICAre)bOG!|sG=11mXOogZ+-~?iM5OLb^aRv=t9j3b zQ>tlP6ZsWg_~;*+wZzy9+dYToq2t?DlO^kuD-EcH&ElKh4ou61WP#QD1ktvh)Z(~0 zJ_;I`Jr^ht%kuZ(i&mZb`fQCao at Fh?q;DW!3qyipa$usg%!ibva-l~Y;|@GkSkudC zo2^FgsYq4KM=dx4>({O|pV5ZZV5bL9#H-?A2{8*ussFlY==dp+D?Y0|K<6 zZ3_1byUU+!_kdo=Mz7 z_cottse|uXYzUBJ%GikvVUqNE$c7DUltsUi-nAeT`Nn6lwYIic*jwL%yB4(ftX?os zKquLoEo+jTulEOo$(Wv+#%WG*Xk|Jw{d-J>RlCgSwbX-1DB|biYul%FIox=WfWN=cYZFD(1Aq zhrNbUbcg043$q2tle6)^u+nzS1o&{hJYtK_fab at En2aDilFT|~9>4PFq6>IjH?Ic7 zki?wG=?3$={C3w|AWFhC(7qCt`DuziDX1O6tcx%f(&NyuH%VTH$rrm;DP7ecfK;>S}n-@%H0PsIDE z-up;?;y+V1N_;W;e*~U}kEYL49$LeO%G5F4{(4I->5o(w7Osm`IX_jt1hB9nBd>cF zt>l7VmPcIiJ#43H1L}uc0h_B9)0}{(Vdhm>#bBWY;Y|Wi1n0E^%oPVH2g+>*Xx$bb zul&L#CzRX at o#qgrB(4MKj>2wOS`;QP)K-AVA~&P at +)ljKijXwV(2L1pl$<0*y1gOW z-5KFEMF=F}Go|icF05fbv#1(cVI3REtMSQKQqN~6=B8H(H1)<~;z39+sbdfmX2i&a zZ_r?hND*VGo&!)B<)NA|q_WlHi at QcVU?U*_4W~fZKU0})CK;Up9HhfJ1Jf at Ht4~8& znBO%?1l7+h8b|hJe8m0YgmE^!gNeG)o|s2wh(R2UPjXYVg-f8LUyA$qw^UO3n2jhx zAOL^~@c(Mxp?{gZm93MbnYGFP&GnV7Trh-?yn};yPmBEmNx0;ws_KY416ky&f{NE0 z%@%;v5yc~KCK!k}s5&x@%8q+VbsFFM3W{;0%DG0~*Km*SrfGEbP5CHK=w7C?OpLQX zhHpo5dcHw+vC8=bZP`Ov?~-vZIVm9~!Z<}!~yc5y*rL4`uwU3n*7^D73sGzS(1;+s|n68KGr66|=d71j4^_Q#J zG+IuTQa3{_6>~w6s*I+Vr5Q_|pvzwr$CZ&uWuNidLk(D{Psv^;5243 at -M%@Rv8PZa zIXpBvkkz24bIsTiZX4v7pL3{ON%EN?B~n`-z1ydeGrFQqQoy5Y%|U5fE>Uh$kRxYN z8Bi9B&&iUJFxg;sJr^$o3vmC?QF1YVg;F1i>LKa?Iu(vG#$)+PNRX*bqTWKmI1*FH*SyT?YybWNe7 zk5E{_?8IOU)xE4X8zPgTulvLavQZxXc;(gn&Wnt>t%DN6;`+Ej=%d>v1ojshf=$|+ zcVGq(cDzC)ew-vRh&*Pq&TtRyK4>sL&8vKuM8v8X4NgFPhsGPQu?R z34$Rae}V1nc$M_*Wzj+uAo4~N4Ta=FgIZlC3^ucHX;E?8Dui*?XC0M0?1}kYDSL<+ z at p#Vj%{L3xhKpzB~FtjaAxK3ShnIK8 z=jk7HCrH{JntPN^xd1wCO6d+1d4~Wz1C*a%NloasVlg584yhY1{wzs|n z_wzz4+6=^Em(H`pPR-}xj_oee^%3d&#?dZ}0glzFN+FjS4`rfGl3sg2Jryw0XfFZG0opC+*TZ#_FD$(l2j{sx;a zbN~Qk|0NIlm(i$!dt#Y5`PekhM=l#+QwrUo*HE*^t285NIA5-Y?@y`MuV_m|6HUbZ zroUJc)wX~&a#Mlm)XJpEzbr0V^kSu?97{Sp_fkGdBCc at gBh_!Oip0(W$XJ!mx`s54(oN`MwXi0K6 zu2#5T{kyXqOJ0?9Z|O*|+1G{UutsQ;${0j~NRwipxwAfUL>oNiK^K_y$=b3vX>wm3 z9CK?mu!87OY<03y<>8sxS~Z56p!t56BU_ttzui7`&xxR!KIW-9qxskE3JB|_?@C1L z95i;T*dXR+Ei&ufxH0_37F;h3yp6p8sWV-76+))%z|1UdpBT8b*ll5Z=b$i>{o-r(I zi|xXM6fW!6=H-#GZ-y7aHpPB!=m$Ii9}EeCI0YPJ$$~hBo}3E_3MA2i0XlO!8aNSR zoFqjN(c;z~eW1D590TdT)nL9#7->wPfuAi&Rp={BAcjHlpEBW)g1A}?DH1q}s5M!p zDheVby}ssYnxAdiA3t4}TAou_Y_Qjt*WZ2Ld_YhHlcZ{9%$c&F{dJM@{Bx>7wR94Q zr)MyiS65e;Fi<#PPB4zat^pJMjStIQecC=gwIv_CEj=A2F)QG9Z`;@1(kN>>{eY71 z3G056>QckZiI%D3rUd1}=<}*<2ud-8ibD0Rgd+mu at WjD%v^d--Q6~FdbAOOAq9{f_ z6xDI%VCUddzc-P>i4Lj=#|}j$&5CAR8ThoQiUk*y5nBInmKXYiD~S>J(_^q2lDEVH zM$_GzDXWl=4Cj*%@kn;O6y=xCV at nf_S+pYNP1hgC2qrqNt5%A~u2j?6>>SUc at k}6K#~fpd%)n3 zBsDw2Wl&5Zu|p)5&5e?U%+>Q-el$S~YAsL0T=9~bsWbcTLJ)<7@)?n(%eFJ#1&EjP zc+v?oX3H`lL_-HE$l+in&^*a9T}7@~Ga($2INY(%>4y!@CH z>>U`W71_`V7Z+4TEE?F^kmLy;h|}2-rANn0`Vhn^HWf$@n>*SBHM5Wc1ke6<89rtq;%+g9)&5N7haTvti~A2u(xEeqa0DX^NgOpT5gK at 3V=f$Q_qBEA z*pWkec9c*$*^)yLa2RZCn4gZJy_xduL+aH%`pl`{`Fv^`)X>t<06E%^xdXyknl4q3e=j z?zP>*9IR64tNo+o6RaBUBie*59!SCAx+Y83yykkeRGX7bzX%Ca`Sa<>PO(LtaI*>6 z%CpQ_A at I7aU;}0Q2UDQsmWz3b4|I$vlJ%7 at 9!QPP5PV2uy zRGHNl53w>c9KE_lvGBnWCIP_kk^p3!rEPD1ub|ihW7FY#{@4V8kjUx_E>kvMFrM*Y zi#v{Ve?!9Ke9D3DDx_|t8N at GxsIMAm^-~W;JADyS2DwN51*P99rByA*iuF$!p>55EPSZ zR75Crdz4}Y9ytcLo|)vES*PX8>R?PtP!bUwzE{NZkF+AD%c=j91Ymzfkf3h&-`=W( zifYihe~5E at M^c)+#r9MWJ8AR6il0BrNoq`wAaK2io at 2U6W5xc4BEYl?L*UCoRk1;?4CY@($@os zD{_A||Hb<$1Idv(`_(L?nEhn${i`0OO-M0mIF!aJ!sdM`5}(L~BNwWQi~p~7b8|;B zJFZOW%I)zG2D_x-CXyo!h1t7yd?TI6jnHM*7{yU^=^cccE%vtWB}oeTI|YTak}uoP z4!mfsse^Oa>l;z3i;J79vmN;ZznpJ9zU{?jg?9T9?-(@Yq!F9d<)$RU at xtdxw-XK; zsM6ukMBQI2b8(8-#m|dFP7}U&mm=*|)NAOb-8j)+!B$Y_V at 9D#NJlk=U{l}bMDR4K zI!L~I|j#8eMP)0f`{$;%CrL3&9u<^0f(EF`qtMJ at jj<9JHZ~NvOy{kq)Hz1#h zAYk9FWH at 5!r4%CLMgO>4dD<2cJw+=9t?^=QF%TOgG~>@*mO7}o0cJric~ao(;=4}z zgHFp&g2~tJI-ng3>|Htf<@C>=f4;2smsHU&vqx1Yt1mxs1+n^-fVtChwiWM+xX7Du z_8!85=O#N at cBtlRHi^F+%>j}{#8d^0f#^L_f_Y2`Ae`h|ZNANlJP3t5QhBSde8N}k zM9LpTZBSO+#8pHg>>)EaR^J;Y9=PhA|l9t0Bx5c6&ry5xDx z8EID0rS!7LxUyJ#sKpGd?OD&zORY$#9;uNQxfdj3!Q_0aoMIrErTP0Ts&T=aCph6W zyWE9T^TnQ$UV)TG(0t&rw@#Yy0aa2}i|v^xI+lpIchoAlxo;6xEAgoKeSA0pLEi!y zVG8rNbbN9$Rpz`;vWG?~zNm`)z`4|A#5ptTKzYqT&sh6z$ayPM0I;qVF#iXKD~s%mbj2$1lX z{U05mWCGK(SOUIdfepbCdW(t}8H&2 at RJp?{bs_z2t^o_FtZ0g}{R>W1t$T|K$FtD8 zy@|cwv5ud-wm}Aca6x#dwocC4IuhepADNETgXbf^x42l>e?5i!FeC^&Vov8#5baNtWG&gr#Gj<}XMldJ@!U^2!Vn)eL;Zo2;MIaq zWK1s%i4Z!Y*c~2RoOPLDa)OYj=r3Fa8<#=Nv9A^DBFR3~D^4>Nl_VA}zJ{5fMqViTcoV8GdQL&VUf zZZqGbtI)mQ$YJn3gaXq{@uM*=Qk~6r9k^xtrqjvqm zuT$fq-SB|RcHy$cyJK%LF>p?tV-sq5fTCd&zD{?|wqC27x*}IP?dH#`byUvHfWe=( z(kaz`n_bq`9tD>U{wM7#MvE5O0mQx97+Y>x80LYekiv5~T{mERtYR3aMhn>Ht0cz* zZhj;h2EkFHZfScS*awC__3uXoovI);O!wbZA%+EWcJ*8D*(CSjOW*9DW0I(LBQ~Xc zlbhE;Ul`&?+%exHap$8;-M|4hA?_jG9E-~P-VdaTUcey1J;zdO?ih!#bLD;>az0{d z&*|jojO^WYXx|9_i7MU?Q at dH@nKiS&)})*B2C}^CjKbii at OJOz`k()(R|^26PZKb3 zhC)MKFVaxiSyKk!s4)0hWBzk&cm;rUP3O*mukmw1Z}V{j^XKxTI!=N;$_wuHT;9z+ zKPlWK-M=jNf;CU)c7L)1gR0ccraLShI~>(!d%ei)*+0X{_xTenTNiD{%tP2cA`q}E z^zoMBx97pZ3}{iI=Z3uvlp6iMh4U;Icfb&UwHr9e7kT9a3q3K^ALJ^RT z4_APm9c&x`ZzIzUsf9_~yBIL@)bm94C-TMKLFxfb at _fu}gLqK8O6Lt@4VvFT!jjB0e1d>^I1_$VGtF at y}0jufbLLPY{{hWw8wjLXoLrrd0DVq~*88X;?r|C{iE2Cn?=)z`v#@F#HSHkU at cfDF4T4 z;u8P6GuO)GU$UhC+OYdq?Lz+ltl-t_u+zHMY%h-}qlXep&Z=IElFUp_R3u}jpx87k zkKSA_**5kiBorh at E}FmH3}?w*XP6UKDX?G6$Z>g_;oi;2`1(5eU<5+EBLRYL6yh5& z!RBW<4u&!of{XU25>jS>j;3TWX31rFRmr$iXK8Gh$Ty`a$>5l1nR!B?SIIs`SD{aP zVi`2nZiJcdGCPvvm#zhmUNp_ at Fqc>j2`{Lw9Cmx^*2k#@k76D>*c^YXT&5db$XZeI z{ix7F&KMd<_z6r^^(AE#{lR>;hl%Q&w)pg|o!HhhH<5jbff<2tS|l?Gh;qix~!(hG~rr%H97EU(f$0=e|M;r{5@?hd3*@fS7MabdO5v zlC-)1n{GG5O}5ZdHJ>e at U4s^_KEC3C<{AxKEz!?PW=e*AtaBhM1T~8eXEKD3=F054 z!YMieGkCdNZkMUnm?IWyQ!)%b3m6-=XA))5qaW108V2YB>cus*{l?KuE_d50%}*bY z!9;lZB8B?#=lIFIMRxNzz~-U_7M>TaW6bZs5c_%tT;Ogjw3&5_=1)#3#sxwyYQFIJ z;+nb<7lt^S at I_D%a(TjmaZ)Ozks}qoe!aU7*Dncm)a)Vh at D5} zMvpPZ#hpe&wOmY-D}ioTfTp;B3Mv-BksJ=%WDdGj9EsZ%Owjq at ev!yS0rv=kMOnN; z7O!?Uyg+ at 6fEDL8-4o2^_-n%J98sT!WC}y3Ftj at +sfMSQGF{CHmd1RunpN~9fr%v7 zi<-KVK{(<%Sq}nX4>JQEe!%~gYW-HTX|`ZMK=trIK#c!?sPSul)xW0m-8$48N}# zk_F=(_jWRJypA(6J{o>LKTZrpo5Xj?spV6sGmE#Wr4`ww;!i8Nu7=AoO1-mlsgf(a zJM at v`Cgto!=(4b6cwF$VsghgTjqn=-g}fOn+STUiMC`QHRZeJ1!pw~4+-lm-8Emc^ zNbMO#yPRRw4iPmp*kD|4nkp!w-iWYp!KfXnZNcP;#RG-S|;GpA=C9QAF%XZ-VTg~2Fw>V?7E+Iw;pBX7%sN{ zG~0<=`(W7ngS)2r^^mp{{MpsI(irrg5Uz#EYBBd}8Q~1=YGDw2mQv at TYH}PQ{|fAc zQ>3-nJ^H&Rm%A5MI>~B*=O8K_#W24~%_DK5vXuYD<(E_FaB7v^qjs7!&lxTpEkX#X z2|qt!XoGmwgXFIulU&*CU9Y{-2haYQfCeJuRMTTV-gE}wlg5YHbgE3H#y>J!+uYWl zHtr>N{JK0JsR4+wGi-(sYKxk%#ja!hJqxPs&xqWO5y8A8Uzd((Oh;#yE{*)VEA=!Jw8Z0FAz(L2uwo1JFn{TE0>g=!WyhUJg&Q at 5Y?d0Qv1KTrg?2k}=uhssEq)Y%z zlWRxm-^HucT!^mKS{3dI4{U#gF!1-n$y@)W0;q6E)hMzrCe^dGa`#}4FQ-XJDU)aN z5tgc!yafbu;wiz5z=Nf)Nlm|aYW9rRe=DInFTVRNg8%`ELI43V{I`Zn%FfQs)yUY^ z?7yruOi{H{SQ13a-QhjKcOZ!h_aw4<)l5bX^anqo;_X{Xc%TqIqWXe?t*nF5tBZSv%tX~%S z8Uvt at d~Nf`PXUqb)L at g`XQ&SP0t>fVZ{s+g{dA*=C+2ppG`*!cD&do$UgRv}^a*0A zHNsB$SDkK4_q{0SRXfBoc^Y^&lYP`7pXe`mm9sDlt)Q%2Tn z!aZV$q)>#e-r?gJJu`x4At8(q(~bu4mjn&sgH#bY+B&8u^1Db8?k7xa7j6I*wsZBk z%MC6W0?tK&UG#=#&0K-6+M|V_L$MoGEvKnLSfV0y2+9hR+NNlSr7m at Z$N_b=WGKzq zzNRy8o`Ih$$FOW9{in#_uzH{0!ZBk+nyOMty{?IhKI4T6nYh;?{1=Cxb>y|KY>T1x zr4TzQzWSPe6iTbg8r}r~)~vuS`Rd)AN?^(!*zc;g0d%ZDNc7VnXYdNekt|=|LpzL+ z+>`h0Yg^ByH1 at QY%_Y<@h<7gs)Scaj=rB%FIeOm$@4*nBo;MPKE)>%OgF5jKkX%ww z^v6odPy03){<&!XyvL6_T42vLnKl=sY6UD*m`ApFK^u7j;Sz2)sC7oHi2*ab4h%Yxr6)G$88~sN_|3Cr(G5xm$`Hxi^|G4&lp@@vfrYh36J)KTup at 3sn2*;9~j3oYM zEDqD$N=-ks6|__0La{(or;Ws at QUZCAgk{SoNXrqT>msCeDy{Vi1SPwjx6u z_Pcjqlq_L?VtpMJ9F`Vr7PUc^E*ue>-YwHVD_5X70M)^|NBrK+g&e;fmhmLJH9LEb zb`vOGXX%{+0828CU1z16ZKugOPPyJDiBYEa=Hfa1s*C65=5aUtq)QwvT;pJQoKNjy z%8x|u`M0`RuU5HIkF3N?%cDtHr({7!rM~re0|#quPRB7K}j at R zl56R>+%ISL(8*XmnYTN>$nr%AK&b745shpXC9?Y1>F(=n>jEOl4&T{UzM at J__*J5Y8|QEjHwBOL zR5PC~R at -QrDM)An8$Ney-X5!{vj};Fb|0*3Ncu?%(2vYq(s at h4a*G?UI3qW4NMvv7 zeId7tW6y(WFax`-l(kJm=w$v)kBxUb5xRw`)0V1;$t45Pff6^g1*WC1<&Y;_CV;g^ z&(q44eLP)%coZwwq at x+oW6#lhckY$vd%wMcN01I~{HC`86^lF84B2D;KECds`pSKV z9 at Y9lSel(tNH~`wxSF>xuY6vbYoqvxUh-r=bixB35kPMMH(aU2xEU97NDMJ&Ztbuh ze-vfILO+Ab4|HXA*B189#n}q*-6x~Ls$y$O!mDM*H at CiazJVdeBlA3>N=f*L=n9;b zTVjl9$1UC^rLuDRUk?gL{Q%BS6#&V6?H(s=9s3P;24Ea$rD^N)Jv;5>87fV$65^Vy6TU z9DjU%TjAu>2tGTJ_%y_;fY6@#Wq&)FRy}cIP;<6OwwJY_!QVjuFdKrblK~jxDE!iO zgL#GN8Q%XU_X*>xw5OqgfR6BhfSCV#qu}gpi~`r|_b~m^ebfEJ+w;-`xGN>_LK8&IUAT(_ zV(U^F>kR4A8J!1`HZ=#|VNGJaf#37<3;=ood^`IBAtoPS#lc<#^9W$|+47MwBBmXH zg-tROQcgO-#6xjcABYUx0)PmHB|@^H_n3Xz0^cEm8>9js`62n2iH?BT12U+!ILG z?k`nxB^^~wCY0~$R%Mbp)SEGGI^}F$E#fOkOYbP20XPE|30`mdl!<$vK)cjgC^8V> z4Pj!qN%D3B4c^r|+Pq3O!>r6n5X&V=8LCUxONuyhTG<70?+}Fa^QLs-m?1jK)GlS) z^1S#NSazI{Wkqf5>yxoA8&@IC%&0f@%6b&dHtFkDFXXb6N&9QM-9}~~_AYa9qf?>= zo+`8UQ98?4tgC$NK$V>wRp;mW%d$jrPYGkH{TeNlMUQP#y{L_lTUgLs2UCjTrGb7? zP|kB6D++bY(Vi90DZ}0MVdO~(vkwV32?f8AYuV(Df6kHMVZ1Q5*}!|{2g_>n3G0*JBPpRKSeQ36lw$7dF8JNbsij!wq z| z at o3F>#?e+QzR2SD%I{LR8nk;j&3IF at ByliSJEzu;=jAytoRc!*caY(tM~oxL?unOV>t at auZDd3ucSRUT;YcT4Y9Qm|RY%O5Ua6^sVuA*^UrT^HkM*D&!A>uhM8EA!oY$kG-?o_bSS@&gJ8&%p5?kusCj!3FO17ASx3JI#WMq?U|A1=~$fKJ| zh@}}RXYk$Mtio&uGhVkH~)BF;{^aomc_q6})EQP6m{7 zKNiA2)ZpSZ_V?~S18DEyO~!@4m5m{0%lT{Y?_V%WzW`GB0UWoOpK7DKaG!bX-9mL;&<-4qjS)N% zI`DXj_^r_Gdc|ABhw{JQl)GXu6UvVUBP2BKNwXTn^hB;KOPWWfTr)Keo5y7fIm7=p z_{)|jop)OXHJTyZs%lVHb?e`@tjh;vd1SbLSgHAuy at 2`nPF0YH8v9H&q3>ijc;)gRr<~t)GLgS%YorhL(zlMLmB$exU!=u3xSxy>yNPhi z*x@{hT at +g%t}~#*j at TXYO%OcOb8CR=T|>jX$znIN?9O-_MU3SPJFBwMKqP`z%w!i4 zx5K1^TJEnN!KgQos2+H=g*c?$+d<^cx^yac*Y5jJ=T*K{jhI;;S4=*DG^@`vV|?o; zi_=;&quR`k3^(gm9I1Ry$ct<;$6${xjb0w*3L5gSPzxb9+jO^9Vh>vz2)e7S!WEsS z at 8fK@;^RtI>M}H;QY?*uUrt;qvT%B{Y+B}DW>d2S4^jz~*b<;)tC7H`L1)!v%wnEQ z+X5ERx5o)9IWqu^yCgLpIrovpK1>P$NU5rjnD-OTyygE$H zI~N9z_s*~mvn0z9Rn7ncSnl87bH|(|}t;>U= zydzCxfBBI8#Mc20d$mfnhTHOFm6lm>8%@+R}nYE5Vue(f=Ojkn7jZ?90M&t}>)dC5E@ zdn5!<%`(Kj*bzF(lty2R8#p~JqK_g16FR~FbJmg)I`yALb#iYaI}eA(DX8H6TK!aZ zTtB=Rm#oCg3i^z?=g*ofRRJ2|%?ckWXNgs?NNKmjBL|eKj9-0+e(k$3UV6OB*z84_hd-(&0T#>Vgt- z5LpP8K>rXS&7?U8-*KXfQ0^v(fbAUyYaUrgQt#@IF%$76RV!7eOqGFNZJTK(&c3BC z3kq-2WNNcn;wD^0x=n at onEAC~)S^$UMn+%XL{XWNh(Bp%Z)~LlVg-CW@&p3GT9kll>Fw;a7Njr4T9volaW<#i(XcE)*NUi=x8?ZimmsS3P2ZSQ4y(jnPyDNhRvb zk%Pvs>=Iao)TR9Og6Z7a)nfvTOyt at zlx8NN$Ei_GZFfBqX^l0g$%o8_X3)@?b at go= z$hbN`y2#PHJ?rDT>sp1fz4AuMi~Om_;Oyl|d+at^=7YM)Rt5{ar6HoTsGqZ at WBxaa zat9k-6-yC75L3YfaX=&ca0ERiUAJ`QAQI%tIXuAOuKst7?c1b?2oR4sC*Eetx81Ko zP#w}j`G#NY&;~t7RMT*g9ZsyP#t3vhz_gJ-p#VpO0*IHG^?MB61HP_9h!_O?Dx?f) z`Q?RBumm0=a@!nAc9j_8Z4?x8L$OD^6VJ9i{Mjj$cZimL2mu5*3fNWRmlMMzM#>^K~hEgOtf>jJ1MGqufTw{(eCYqq7 zR5{59bMZ_`@k7vZ)Fqx2xYuNIzUd|D9Rk*~%<`~RV7jG$xE`SY=H!~X#VG^OId{U* zf&j4l{>vUz_J4SH=wOie7X%2%68wMS-G3x%WUcIN%uJ+%aKi;tS`ni&X=AnXeDR2&;A1YCEk1Hf+-{}^nBS!gnrH!@1XS6tv2+EQxk^k)6 z%s_fA3F1r50jn&k8-}cOw(eZyo%G{K`+2dwONt>M+bx;JP_8G(Q?m8IgjwSWD*6PJ-NoyVzLL!soVL~lU#yx1td$*w{s3A|fX!@rPzksXY}CZE{Z at P$s}%hw!D#Sbf|?-0&2qBJ}M5 z^BGHdfp}O`mlzOCU^$f_wxl%Z><}`81R6m#;O-Sl(;m{&?%-6v-NWS!G7S^~aqYD| z)+H1rx_2k|A~wPPo&x`7r5zr at XL|1*VITj9I8ye%mRb{d`AKBy-?y)Aye`Q=aK_o0 zqfY$w)G5Fyke-spm}P~M?0-#~?kO#gaGMsYN1 at 31sa4G=9Z8WHf~6Wbe;fQO at Cg7L z^ltwE-x>UWTBs-dkC$;U{m*$(%4RPA_#CqTdP~*I(d<7Q(1*i$CzT0^%vKo+g&7RPLkv2!(>0-#q~nj~5Gq7@ zhk7}CMJ$HMV{@m;m3G**R?Xt;Yrm;tMVyKIWXsM)27g$hc^iK7RfpZC>Y2l++t_-G zm8W(2N$iS4W_Qok-x>Q1lk|xWbmuS&Ra7cw}bHAX#6o|ug%7z|Fv;2N*c3N&N;4PrdoK7~D6v!$_CltT228YhVu!F*`c*s~2W at 6w>OnlYpZ zh5es~F8p7C{r}*&S^dI!Qxxrc#eH8UWr+Dt3w82B at vwSkl;asWvlJe$9Gv)7F$L>a zKT|^&*XD$>L at KNognr;?AVLNU)8K7Z__?F|-;VlOB_(wyx^i+><(7XNwk at aqSn zE~GZGEkPWDlhv?|T%z^Jh8q-~)@lL$=wcF1y*_oQBRe^9&2Y^BfPENopalfb{`57P zEmYaT at G=>PTN||3**1G_`D7YuChAd*m1#W;aU?;MziniIq3>mg^b# z)5EA;gYN3b!>rFK<>Fs at 0Z};ZAtu3wr|+!Cs8|Q)T<|>SZTw}b$^X~L9eZx*F3tsN?Ucq1lr)Yl<`~Yz?bFWZ8nAQ;$hd3W{uz2$6cYLSlz_! z11`+q8EtnR?ag#pTm0WtO*bjFANYU>+5G2`c@;@*Wb?$gX^l=?QM z2+zen5)Nah?daM&GnLQPC>yL#HFMz$&IDH_0H(&eY;4|~tGmbuMhpIiIBO_1%uW at 1 zMFCeEo|Q|68V?TZ>CW10u}b3tu}spPgR`f4g+|Tg;^W?Zd~2gvUZz92+B6lB_P|R^ zwv*2nT$ur!Y0s361B`Z_-%UN}3 z*lQqBV6KTG`?sTuMUH2hhq6$5YN^kr8UF at 7JX`6=88Hm>!BJ at OO^O7>&}DR~whK=g&k z0?GBD6Tbk*3}K)6MPKZMo1|ItSxpt??Fl1L(kB#Kf+ofdVp%{#00YTiN0G1FTn0i~DmbHCQmn^Dtk_2{qDM>2uh9JO0?Y z at w$2WI6nI6enkni|I`?U6jrGDcnPSs3V+< zc^~wLR at gjL7u{KIOpKTj#!Gz6jd&O1{vY&1zt#M?fv#8k=!qhvvRvnGs|>L9d_491 zxn0{EoBs-ij6;AYP|X)bufmfobxzG~7Fn%WEG!c*?%^*?@hpGk*Bug z{iC2|z7SDjK9$X#!St?D-t>S7|(t?RAWJT7mO}Bab-Z#Um at b+w$@;$W$AP>kFgE!9=K!>&~W at xq{HTnI^hy zhY2_??Qe7RT95Ue0Z7nU;@%3(92}gw at l>$%%%t<{V)Qe$v=N%T*1mwZQwwb&Ow`NKds`6?@*wiY7bu!#A?6#77up6 at rtLqyBQbu3--33YivZ8R#%FgG+<-L2W zeoFRlD3kI9onajmbmis`>F{8dyq1W-sAq3c_?h?PxRJ%=P{OWYh at 6{ypSANFYg;wp zAE=wh$_mG0&-54X)!ff1O^!*YywFW$E&JQr9%_+hm+e>`KHAsZ%NptH| z1HDOz=5=Te%r#~k(%ClB(CLJksQld_cj$A%6G4+HrQ4Q0f;dZ4$$fD;F||+kX}v+K z$iS5~uTp8Dg;L34RY;Pm?HWyGE(u6vuO6j)?=OuF6~FB4V^ER*P2o_xNu!KrtM&fO zyw~kxIb%1%M=zgHnLMC5yUmByF at aMZW^{>sZ%zzZrp-)hD-eD(ilZMK5tV28O6^~= ze}bbw!l?SGJcu1r{+bd7%T*0<>XI9-W&eceRlDPb at 5Q|RwHHtGT at 09gjgIQIe$A5o z)?54e9bo;Mmj8qMGtU%i1wWcF_eWS;1Om}&tbgIpXnGhnc21uZe5vWppr`0yk*DmS zR=*FP!>XhF^FJgH5#*;n#P^gQq#8K|m<`MKPrH0Echt^>qPwCc850$pICs5YNuQ`V zAF^Zo7`wftL*QZ#$e(kQHvF<- zdO9faG0?}(;xHclXjFM4V(A9 z%_;Q$Z1ir;o9Q at 2T8ZsbUn`nAb=i7Ur_sqWb1#R)GhnBoWPnt6ZB^DhTi9|;BMfjO zN6{hL?UX<+9?H4}A}wX*N at _VofSgRBE6Qm(FePKq1R}_?a|NJ!!oI*dZ?QLLU{s%@ywY02dFY8P`d$za z`z1%jGxu5Wt*~QO*^CI`IakxdKN)>nbGw-O3w5U;y|6~bv0%QTDdCpMHom@^zh`z- z^;qC{_i}a}!PrB4IBhAb+ViU}xNLb4IBRm;RoMcR*2792apRqp*e>%i(6$A|2=hVY zK3A`NEde`HLlIhV(-0b77W6aCgDry^b8sd-#E2ZvlLa>=4|NyIf^9Y!wchsnO&$C@ zuxQCJeM9vqH{f{S5mQ+q(R at N=Qugdy&0ZKbp9MLe8nAN}u=GV_5Ow1nHeY2za^>fpqA=n%HWSvMchuR~t9SOaEWA-qJI9W7ujN-(dV zC)Eb-P=^>TIMjC(j%PC8xCa&Bb~k+8*uPBcH~3m57dsA8Y_(4?k)2OysSlxlMs~ao zV!xyU4&^xGrsBo&bm25~MlpRig*Dt9c|Du8)-Y-eUDQHH at p*|jvpn|oo*%ZK0b7!} zFSl3S;kN=^d51s$DuN8A9ihy at fPmZ){- at S{F*`?Bum9}bQ*m&1H8cG`qR7SUKO-bN z4O9sdUFb6TI{uYW`omJ=1 at 5?_RDYBVVfU+F*3&x5v>vUxX4}XY4h}m_A2eLT^8q^1C%b? zORD~PvjzQT%i0C`0OC)ovnu_)fTyiVNp}agN}?ByE+mI|ThzK0Mgi@$hx5 zO&g;p)U=p2ANtyT=`h%YpO&+0v)okuL^pTe6rlqSkG2iwrHZlL$5*-#b2PwnROq at 0xLuSJq z6T^I#=<`4h?#pW@=KRyxmmH-#zmJHIq_wtdZQ=ZIYh8}^0zZgh%#6yzMjR_?m8DT& zVhWN=Mn|0+Q(?o{Lj8)9?R{!5Y7kS!h(c|~seVz7LW&BGGlDM at _Zx(tbyXs~k)Cdn z*z8ZoSes+7xV(K-$H10q2r+u2 at 9xtIr!3;;SRdPo+3cZWL4 at 4~hslA8*CdG#VoCNO!a;D0d}cXo at yrJY9Q-cDphspw<9x51EK)?`0= z$Lbu;ynUj-fc7liM&VrrA}<4_R2Fbbh#6HaSC~TZH3D2Fi-IsyoCY^eR%$PDRfn?x z(e4g0EjJM_wDRS13cIxD9;x5SqLPMz-kp!KbFA#lZ6sP*OYO>lDa$bvRSnYI2RT-l z?kKO=WATnY+0mh{I9%joQk?QK6#ibq!EF0EQl(YW-&ttDHo*eo0dm})(LAmduZbHJ ztvXcKu175}4t&lY+ym!Xp3y_Rk9e5IHNf??;Ptgq5zy9 at nqulJ5do&|0d^->D56{Fu-(DTeQcBPzO5Pd|wNYQKItt%+lT0|CvW0|EW||JHW= zucnJk*v-n;^gsTeXx7m2KvhHgmbYY)!UDD`SFYHifsZ6d0}EY(8Bzy1n^sqh-gjk5 z{w-A^PYJa%7f at _tHF@8E)EF;Nar2J)IDE8|amL1MVVz!rxPCGvaN at h$lRY^z`}28A z8mQ!(G6KIPTSRzMa!0VEQI|ddyk$HMNhe_Hlr=0t$A%%pC#FyYLMqqIOP8v(WoFdS zHo7kWD@sVw3MSd$lj~9446Z!?ClR%S9Y96IBiyM+1`* zR%v-8bEA330SF|kb5jy0n0J(WX#R8RbSAT2Ed%yUP>X4TdBFM#`$gDs`sWp`&sOJg zMWFLvdu{aKOI4ZXOaL0ao!fH$Z{dvWF~-g32D8I*oo1UQ&D4UK40EaDI z%5alqIP7U68xV3$rh$E;VVQQfwrv?Clu^%7?VA-XMezuS*(lXV9H z&6|%U3J}yxL`v~TzQOk6m$wp~dpEid+%|oj_L=r=>oC}D>xK3%DjXZ&oCh+W^o|Uu zz%eTZF%9;?e7o!W6df1yjU?j|mw+?5F{lqM5HI?BrL-Wi?$_d(IGE(Z9vGCq`I!cd zN3;?>TB=t~LmF=w&VtOT^r+ll)cV}c5Puz4i^O%KICwdn>hT@;q#-yFjJ$VhcsrP_ zoPV=mIU6f5mx4$P)99jyD{9;d4pVwcwq{llDBa=ZYB0w%L?P>{IE4)}Nz*Xw(L_t3 z$KRF*&8qswF{auOywr$(CZQHhOblJAqUFPkjeeU|lxqF{D>wd@?k&zJ at neqOfF~=Np z0EldGm4;okUnH*T1|xF{)KER7OC&U_fIM#~gXRS6ce^}}WnNox4c4p1*xa?|h_P9D zul!?IsIT9KYuV+;S6;lWxddn;F~Ta9LMSIggl%%!3|-iat_QP|*q*ESS*LPMyhlgb z8XpjmT#JQ$@|WP_q8>|S?dzGmSA4G_20#8Iyg~dMUHoVvtEi10>obTUE`zPxXK?N< z;&xQ5$VQC%(g(ziG|?0O31g0chf_;MPPa_7$h at yX%B*bda3wjv z=*SOl!HyB_4EZyDQFNq at S!DJ|maUl!lS`)>Q6bvhVOZm1M{i=JtNgCl? zp78;QQ1=tBp56C0|FbOn-?LoIr%)M5w=v-njUE<6htOb*0gbL=M;|hdZeK at x7;@uI zzKo(prvZ)r`3c~oX5ErBW+Fd*!`MHU$lOhnSO$z5pkYOqvrd`dTFleOg#4U#O$77u z5k<{tbCG9j4QBoHN9bhg?^)N{!KLgUc;D6Xb<^6-4p$P*<2+PM+*aM3r`bc zQ9DPQe-?(S+BjjUp!nYC=mT3PF_*R!M9?v){-7g{sj$gcCyqfnIwdN z+16vTJDZ5sL_IXiG(F~I!mrSF(?yB+tieF5Ih|C4M6&fTQnSFMQ&g#aVht^b&T188 zNPeeYxM8^*!c3_yofvasQ)PQ=0axf3Zb2TSBi>@?hHgu?2_%`-#m~}ww<1}O zQe^n-Me~j(nLR49k8kmFteje( z$i9HoV5akV^`@cRZFtUjx2}kpJgguU?wsp-eQZIkzV*gSG}|^DC{|xDW;8L!4q>~tV8kKfG at a4j-9@amrMJ^Bq#-m+m4lnKjYiu zzN6weEGh{CWl*14q79`Iov`rsd{FVt-NPA&?xFyhv&W{eX!WIs!d}Ej#;|w?%CMZN zE6eGH@x#qXc^@gp;LbC)SCc75O zhINHPp|_))mwqIXCl{}*sOGu6wm%PR<@ zM?{b}2-7E^^)%+^&&hDIJBG;#VF<=;8b7+A2K9b(%anF^p`I=|MxChKOb|?$9B_8`4prG ziJOtQsP*A9&h!bq$gi5hmkb!FWa8_ELq)U64Ju%Mk~gGETq%$mbV$3NNU0MHd1p^k zmeq at qcqvP$)9fn;AK=mKsq)-JwG6=d^+)Bid-KxNZxn$AX(9+{qPlv4wEzgthd%A} z-aOS_V|T5tbsk8Dr`nHSTWDNA!&L#Y9Kllyk)Juhzb?tM=MzjztX2Fhe=P4U z5Wn^p(`pS2rXnPNdd%{CZ>zh#yl{C~^Flmv>-gA7CFt`TFKUsWzkHsbI-J)oKnq*N zhGRhG`QjJH*2aGd-V&e at zTjj^lN6A3g+xXuC1tJYSgn1|!I*op49IWYASSfJ`&soW z$fFtFL26^k(@BHr?hmrT9=9MsbGGou9o&^477QNIXb-uZy1x}xSKp0awpUku2dAJU zb?)%l2(5SHhkj`Eg~-~tl9KV=Wv|adq0vf!l at 2yH^En8Zj`gre+b!|Trj$XmJgFw( z%{62kHfjjP=l~uK?IpN;6)fd&!$X2QMs z>~^IAR@PdO%&(}Pw^>f-ZW*#Dp;};Hr4fXI8Qbl1+S+A8c4>s^y zXcKLSZ4a~vw1f(Y{L0F>M%e-SJYs{rTOyCRNEV>1s2`cklg zR9-?ssf`>WFx}kg#S99ppr|NVbS`gZbKVp*?kY75JD1-H#-|8+;-^9+OCvTBxhW at s4HkBfGQIbqve@M}ccR7OIotA|hTsVwXfS*G?>aNl@ z&FC;S7^p-FRO5zH=4n}j=AM>FOAeAgLXBOO7804mEV2 at 7=*n)RTL;V}NfLWMOr`jt z6FnfDm^yya*LpK{nlb3SCAR}*Vl7;iUY1f8S;n-(GP2R)PKit%oxvvIrNA*9o|Y(Y zp8kFV-{yLZLR at SeNokO0WomR!=X7od9zd84l%X&XJI-8z=@i3J8K&=22CTSRP+qh= zsldnOr=VAT9qJWuEl562#?uGSX_N9BJ{r__|6#emZ%yMZhD+r2@!srT8?yZ#6Ii+z z at ubfV!L(Q?R5>&>BV!`-;|CbUcUvV7xsSn_WlZ(|5-m-{*3YtcZ zp^&@bG@)rVYi%15U`+4rI$s)(CgRNppCmY>`HWHAtC=RID5PxcW3>fKTWbfmw_cLg zEGy|M8QjIRQN9rDty$NlK#f`2rj at YZ=ooIt7(QHkGaMV2qO?pPbJ%>z#0KtD$d>NU z{mo0b&I+}z*;Dum>vt^a?q$^?T+NjmXbx{$v=4$dhsUHgwZ~w{R>L%`ho5lEFy@(c zq{X0+9Vh;1iut&z6!kc&;_j(|i}sztEKs>IOvKeH`Oufd*%f=#*)#?{fw1O9{c_B+ z#Ma97kXfi0p;U;ZBH)!g2=egtO0ht0`#6wVDA`dpP}Va1&-SIY1)S*u)?hv^1 z`#IG^>Zv*0ov|~s0lQ9eaB+uu_2SW_dlp9xTJMYG8*kk#hN|=XE!>p at itfk<6RVZT z2RkyRM!)=L-0O^Te~{q>9Zn-(BC5tZh?c?l=eBDlbk6I5FXgW^Qsj4h969kypsv#X zbeRY9GZ#wNDVddwk4CP=X)%KnSvW3pM zLJz~~%ZYTYC1l+=?p86FAoF^TtxaBUs8Wrgwq$Lo4p`K?3g-4VX-B1{oGVkR0F2a4 ze(wIPFvZss4`fNB at ME*?n6;~P*~`Lw%W#CKK~QU+;Ml>U9z`K5XUP!(jd9$ESXAPR zeE!S)Q?LsBYcKbFa~VP7Rq=ZGT`x}aIa0TjgEMRf&!;RT1G{C1s~CzveUXPv z3ti>OMNAP-j*+^u^HUN%FtX?u*{x2pZU|)1J!Obw6tPNvzD`KGYUkb7p~ZVFGIyDy z9t{g{l*bn^MV~o^eM%2*kzcYGcJ?YRwZPezL&Gd_J1xV at nf_LN$`%rWFQhqlKtkFG zwWz^Xp!=G#=_%UEjb}?miLwOeDF0j%nWHg^Yy8m7LlM`+Goi|N6f*oeiT%b1&rwjG z(xk}vH7skIQ-{Yw>Z^7&GsH$wZEBlUPny^`3Kp=8EJI{};nffJ&_lv4cK5}ZzJ7L| zZ^FnMbPA>4Ae3?ipTpU5Qe77-=IUYv>Kw^ZnZUALfkn`x4Tvy{Rd+^pp4E%_N}BN!TIoAzgF8~lE7 at r3o4)g|{KX+rF4JygL)5Wj-Vw~* zIAIOM!zy4o8|Rz{kiTEG2~ZF(QVS8=BS+K zsFDI@!@+%W_;OVz1o7(jzrgPmPDzWoI7lh5On1Ph6Wf-9MsaXpgpb%>U8LLArv!Phn zak1{K)1#R5304M>vMG>UFh#yynzc{Q67cUYB-?eLErBtefVale63xG5=XYt}ZqYyO zkfJ69w%5d+w?|`gW}+*khcI}Y6fCLxO|gnO{%%>KCQGqb%VCb-E9&`h#Ahc;S{xC<5V^ya4r}@JXm^m6=D$CdMgPz|v at dd2;zM zgnG1&<TvXVw-riZ?f>hYT}Z&<+-b6v#nOJ0WCN&k~w*k4NDZW}e=~XY*6C z$YDnbhRn05BF&r47CL0mf%>+(=*+Xe=yw5|I`^}rA z1|>?up!&P{Zu0c({r4Sct!JuiydtWSOcrHktajfyjHH>O&{Gs~m)iJ>}#zw~&j&)3n(Wb$An*nN~E=$<4YHL-hYSO|#T@(>{uA!NK!GYu=h_eV4-ayXuE6w)EaJ{dHQ#@;wi zSW52UKH1Q!$O}cc8pyjj67b=nuQXU~kR35bvQr~&a?9OEdkh0fxZNPM_O>=&Z*x#G zUI;8CKZc!eE&kY-eG(517TuC^YA(#V$+&XYPEM8gyM;3y#bd$DdEw020k~{sSlCJk< zug}0xuuydOvncwsHKZjuCT7O;ny2S+?`mA?t~C>0)lk#j5a?fZv>QV)P?DqF;k zQ3tFv%g1}jsLhXgIy!K+4Bh at xNJxX8U%r9^A~o%v!{xm6D45FpF&{0DRPQdEiW;*D zB0}5XLF1HKvi~EmQDo0zjpiICaP3MlK~i~TE$JX|xD2`kNn9-*SUNZ0aqeprk`&8i zO3dhrQS^tBMi<+womJv4yU-!KkxGwy)9;&TS1dDn*}X>#upW<(CHlA+Cmw-48Q9t$ z%c8n_J1Ba$0Xpl}>|IusfMfH+a%Pi3k8_%qtC)tWydLt(899#5N zG%K9ZQs0`O_;@OGc`#bgdk*FLn)AyzI!J4x_!Smx_$Jdfb1*mo1C5bsjuLceF%DHC zl~`T72fDFn8vObzhio7L`f1)ZJ_!A at T&~Rr5sSbt)cVX}Gy|;^ zjsQngV7^uUE>A)TbvCAe*+UTd+w)F409XFB!DjY8FW2L-srY-F>;T_((Gjo?AhejT zQ|@p1*tO~zRbaC4+D-Oo^ir|=YbhkwlbU;+51h#jxd^SUwb-<^S!k=Aramg|sxY;- zO<=fBnQ;4PqQm+$r-EV~2q#w`pR`|_Xno-teyCq+V19WThX-c!0HVA?5*?Ej!_`m* zDLRX|X{BAMrO)ZG%JagoGKfv3k)&v_hDU5mDVJ0gOqW9HcB`1K=QxedzN6Mks5zMh zOtvda#YrNF(LkXGzs46)vxtP)7ixXh3O<1?`^+r9BQ$CwpW;HFOqxn%uc@&H#+CV? z6o#$c@|O?CgrRW at w#Asc#?~6X&0t2YyyN=VcMjPvoO{O{jvRZ(kl|?imboC|qn`+z z4Y7x>K;1#m3m*Sk163Qahy?@ykO=|+!2jRs`yaCYTiu}(v6P92yrYSeiLJAsiMfHR zg`MNS1}o<%>DVpOqwwf<`dWvi4veY=0OD?@|3C=l2n$O)+|@+n7~=w(|y#mlqO`~Ld<8{HqPHBH}uC#;KO%WQnb=ll|E zXd~5YSgsw{e!Y#0^TA}-!VaI&IJ1%rL$a1`B+Pvcbsz8+3`N5sWh_Vt at 9l&S*7Tu2 z4x?Y*T8d)Ow7*DPzWB!T?^7qi2T9$^i8Fp6CB#6c?mDgfXv(}N!Wyv*kucb%$6F~ z^F}39I7TK_!h}Z^eDHB8_$fAAl`v{-&gF5G%-{DVRZefUeVyeWGf&?b&qgwFEx9cm z3y$4N)gH#DKV8;rTcpISn_$u_LwiXo_%Xh)Q)ran(^>SprgR%>C-v3pVqv^swr9SBiU^ z0~y845zQh!M$njUZnsx?FNJ;(_2g^czjJ52HywQOhr0*R|BySzf6cJhQCj3j;gL!r zZAL|a^es>Yq)1leuNJ4GUttub+)Lh{02gdZ)z74th&*`F^1cf}*YkF~8^F*1mgvE@ zDihB!Feme}ySd5rx>@gf{rY{$2EgQwB7|b(P)tu78o|Dht{krrZxW71JqCq_38r++ zbJ#z=5vnw$3N-6z>EYuYB|zCpYIa7W1*d1VR}w8O|P)y)>9Sa0!9DUGj5$rAlnd%dloyfi=>`pO;mqnJzsN+or~D6+glU-n8On|(^iB0qMRrzvP!dv zVvX5TPbpNrG5CXo(}+n}_qUM3Qw6bdtIQsZ&vz-&nVRhoLsqxRrq2*X$ky8KsX-+& z65h>sibFY3n4oD>vL1@`crGzzBkID>^P5N&r|A5B#0AfSX8X*0Lo>iENb at ro+)DJS zcG$W}HEMz8y6dabVZ4jvM5Pv;JghSgcvl at JK+q#@Y z{*;+KH@=+1^ZY=dA;q#N`_Yq}i74zvCq=FcxLr>%O%X-GUhxzZ?5jc&tPQqG*SQM3hmK-`cgSxNQv}bw&JaC}1&lRH)=*0G zoRJqP6qP^!Qt_m-)=InhM at LKlsg9WbrK4RrWC4V)*6T+}tpY;u$QR^zL5kzBTz+U) zLedx&X~{bg*wwBU99_GtOH`73x%&xpUGMvey&ymTi0?#BuO+Zz(qPgqCN{3$KiQg^ zKJPC#-2j}_BZUTXKuF_d^^ue)87UiK<^!)cz9@(EJG-r}FgeETtvVua*KKL^GPexF zt0AM99#U-5_^g(zwlCaBbq4tqZPu>(spT-tB}Tb#{`2vp(pc~p zu|h^oyaoQV@>QnQ3r$=+E7avw8D^cUojwtbd)6?|8O+pa9ysbVCfY2voSOSaxnaV-KpUI=Xh+V} z)YyVoqm8o?i)>dat&A&nR)B3%7 zcFEGfOm2iKM4u2ELe1{HR1bqqwFb+rr?`Y5>VWuplvnzRM5CeAFw_^KVWFU1^gGL at 4p946f9p(td{Ika)i#M0%iIWq%wy>u zx;gZm7zrUF!3K*d&NH4ULiy at 1d1QoZ$(Ln+-d+89(fl6^=AYh8OpE~3AU%SJUo%z> zs22!&B$v?a52(O{Lb7m+a2g9BnFo7XZvQZ(vUZ1a7$!g7>28l6d^rG6M!1;-#^RDb z7s*?zD$HLCZVGB+oWu1NM>>qtZn7HqmS(b?x;`TeM(R|%P=`GYnsaNOVum%U3Lglm zpuiZ7K~9~UnwWub4 at IX?R5^&JQbJ at fRekoaf%?GSM&gi;kfOzqqf2GV6xa1T$4P(r z#|zu7mePMr1n7TiBAEZ>;%z%F$Rm8oN=(TSl`N~)l&e&H7BH`zhbUoG6VA|&wh~F( zu>=zphh}Hy#diD49meRMMWgfj!ymVk35PRfHkmzd+Rfg4{oTpqF{hY5 at I`{c z6Q at BR^Tff1aUz*&_+T8GEcG?j#>li`x2d`5N?oK~X_duHjx=`&1>JUhQJAxFY%^fC zX{0_MWWG`wYB};VR{n at RX7CrN;ed0aYTft9rY6}&(W#*k-aNso(Akf#x3PWG)M at 9n zJ5N3J>QL);J8+ES`f}P~przhFd5VJhZ47PQchdYq1{5_8)@x#gI?uzVJ%n!SP#%1E zf+>I=_IJx*B%Tq3KOqp;HV3R$GdT6+B6K9T0N#<*GN4#%(sC~`3msaLeI zAy=LWUw>~X-o#wk6AFGpVI9^5@U+SI zN>bFcT8h+2UW1od#gLXFSPN$&G}v?&*O?mB)w^`Gt?OV(c;8Lv9Y*n*9|ZCBGFk7S#~DhJHTc8oD2D)g=m*LlR!zj2!3mUK+{r`dympjS zV)YeMSPdA8zs1PT+#0E-{Yk4RU#Qxax?bFrG8#OhUOh|X75}hGQpSklG~l4!ra5 at m z2}gj7PW4_yEp>QHF3z8KKlcf}V6tlQOGpY)2EN5iZDfvKS$Hv(_UAbEO-o6JFvzCF zQGL=d&;rc+A66r|hkpNqRdQEM-ROU?n$K$RRqt83x|^G=`Y@@G6PfKxaQ#HR#3W<~qOdW5VIen;M~JyOW3mQcU)L+P^;{q_B1U|c_3(&s5+AssdqLBc(l{1p61iYcKSMX0Y2kQi3&Zoa5 z$2IzYv19`S09--<0Py|?u>LD4?%Qrd72%t^cb!3YNPMN#qLT*FhCo9~JgEjMIkdRG zfpMH(=G0~32qCVM at d=FdqWBa2T}(B8lzFLw?=~*eb+(nWF`oiT)HBbmw`+F0$Lltu z at 9XPO4gk}eiXeK7i5Z0?`7XnM6KE1C^&S*I7ot48okHLtx)((rwSiFJ=_u1*2(b#u zF!v+HzcZW#5<0gU!aQ7DT>asw3 at 8?(Fr at Nr+n}c$r3yCm1^KgVD0XL=#!SzzAP37e zOn_D^b%%q##a8W>@k%w*m2124I<=zAVxyG?XmKe^Ro0CQcXYIjvGLYH+OQ3#o)GFC>`>5DXmUfqDJ=!={Zt|`c~RDjIaVkQ zCe(hvhLAd}JIWDQ`MQ_~|{kL}ykd;u at r1Vi!br z*nxJ4Z>S$zwOy&&Z4yt|FKcbP0{uSNIb!agZo)f+)3`upI5!LAUZ(9~%~fSFQbv=X ziD2j85SQ3fLJ)P|V>hg!TVxjGv{Vj-S%P%el;U$2!;dThBK|aE$EK6hAg`w~1YD?nyt0*dGhoOx8dyids z)CzCi7aEclkhA4Ze2R*EMf{+kpDyJ3yCcBf;_XtP!S@`z`F at D-5QxYXD4tKknkw){ zytFUvXZw8ru6vj9?t(Hv000)?|EUn+FS-{n{ND!56lLs|=n;Huhe$VRowX)`Hi6Oz zH7OBW(Rme91Su4S$-_i?ypX9Jj$25^wC4R3BKihGkdgi#Gh={@QU(lDp;`a^!9B}l zG#i(<+Y5}bw*z!C5ADD-Y!kXtyR>l4 at W9%H>^o^R;(`gElhP@@P-7Ij*N+ltK#`=0 zBQr{5z;~BGXiCDwp*FT9*_W3XP-XlRAXK)pr5-$TwdDutgdv;kfbjMNHel)p0r6Mh_AyU&^R03{t2F)kTD31?{jHRAYv1iLh#8b#P8%bo!Hg zYGzkNiS%1n*eqT0gRiq-L1NGDLP$Zzns#>r at 99m*OI&wgCC^d^BMZ+U*FL3^GlG83 z{(6ZOghSZ=1j#YX)VDps4P*DqZrRV5xuD_io6n4FOuT9L^Dm=m1;1AYF{XZ0%Mi2z z+`-&9JlndaI((+{tBT=9hm4I^SqSH;~PBOa^N~Alv!ftJoA8Pyr3l6re&Xs4Qtx0($ z@|@m9KUQ at Gmhmp6GZOLkqwGU4o8`v{hc>xZ5%xHSo^X$0n!X(Xb?L9RpDd7hA4ISG zo{xoRVCqP_oxfo%m-Kv>%vT)pGz$dGlj={0S{_B7u&>mP5$863!0+J@)YL$QnIrv@ zc>sW)n7V8`JF=^$`S=ifEmCx?tuZPQV=_Hk?GU zB|z3M=uZ+l8vDl#FgmX+F!|09jkw at FW~Xq*B|R#Iz6D at Hgk~sP-g_`#L3<6pN2Yfy z8EfY_QhoYLujmj+fzdZ3)r9cKcT)4TcL;2*N^;)hDU`cEOL8tV5oJZhEu3!kqJ5XB z$+v`YDwP(Cu_M*e2ccc48 at PL2VgYd*x;sg63|;wY`;WnRvH5HS!}nmm at A_~iFby?9 z(rxeZ$GlC&Vg2O1QKVvq=pnp%y?c#9eL}tx`zHcG|Al}v{PW)s7*}PZUG3HRDEid3 z;5rOf(~L8nEB(Db=@nZzt9Ay6r&`9FWs#{Ps2lMaKS$V!pQ%n7<@)j$C-8z;u!Q2z z^S1*B0O0w*XW(BGv#jJ6^-+9xbk0^#F%Jo)yYqiwmpkpjvLYITQaVXd6Gq{SW4f$3 z+bp;U`vvKJT-n_P at e_&`?l5?@>~O|TjwsYwo at V*Uz^)WUYi!|?vneaDP~$PgxTO*LrNpSPV1;ts%TkW6uw1T@ zx#Kgr?GUuKXwxY5bVGOtJ0KL?8;Bogl}py3 z&*o&cbbf(f{gv~Y!)^)aR15X-sgjIgBw at R2+$79G-WlNQ`(7tH_%!|xMG4`ccZ6pI zE`MbS=g=ny19%ix^w!TrZYNWhcMy;M9J9P4v5EzGzYz}zeEjG=26v8Kmh>I zkN^Ov{!cad&r$(39VKKn3}3hjQz3O2paPMaNRbc#Q7sXYWVCxK!2zfdU-KzajzP&r zDL1ws7dBjrQnp%UY(4dh4xEeF&^hN}Z8_%;a?YjSgHJqWYy|QC;yD97?D)66__H2) z&)GchV~cryp!Pt|MCSeCAh(9hfehL)KO&!nooE6bq|4p)9+F(zW8sB=8{qN|ju|== z1)^<5=VRuTzbKC+L*)R%XihSB at FXwdhH+6Yz;uPZ9_VlEmwLs{p8XCrsT!wePJF5S zIdu$E;5)>;1sKXNc1kQ{KR)RgdKPZ*YhIA|=QSix4w1xRc*?v}Qm0LL2OUf&Q|OSr zGqKSz@?t7W&LJe$2~AR`cC6XfaJxwtHYW~2ake% zjJDtzagT>ATN$#Ds;_LDNdD2vN1IyhEeG`~DfN0r;qmbqiO`T|JWMp&t|BfKiJh%a z;(Kc!K&XzVXH8qvrfxDoPw41K2Vn}$CEEHfivs}%KN{c#rsY_Sg_0XIYlZKwUqM~n z+X46r@VaF zHT)+}F$cqy6QA at o->{p8?C3%pq^G0%CCd*XJ04mVuH>t}FSUl32nwftvk at O!Z8~R> zn3NZciwZ&2f|~7jlX%Q06(0ddUQq{!M{XVsbalE zkwx7C#Y?NDwDj)2gAlHVs;Yg0=S_03pJa{eG!EkleAeC~v zw(yu`rj|uu7d}nvKzzvx(t;!A1!+(HZio(52WIY~LdUIyG{%hvBdb3VD4cen8%N#b zP+zJXvWH7R)lMc^y3Ma==lI5Scq;Z)nk&aG_u5MgHHTneV8Q3;GIdegSf&ZZxcpKQ ztU5DVeg$Q~xZ%Khq*GGEI=x5-!FH;3VnL;^*86i|p*g5AKV!hzQM at OoKZXddj@BT$ z1 at 1qvQkb$gZ8sK5+u5 at x7>+VFh05ipX6$FID@>u14A>VJIZ8RJas|WNL|aeKIBwFH zVJdr^E|l!f$Uya&3;4oYS05`WTyAupZ#77NxA}l>1k1%x4VB5l0Dx~NP4Ot(oXsn zT8UJdc=O at e3m=e6bqJ&m?(B0_!)o$UC8^i2BgyJ#TH5H_%6GnX8{4RH6;$C%`k*d= z51~f;;B$tRb3WlW>Mz(FSr;mJhJMoLh;PQ&*_r`p{L(QL>tp44o)34sx0*o=#|*AD zrB_f`kmj%`X#ByTh$c{m)WJT|BG^?zT#NS6*Mk&jBLG(Y7 at IMWE8$tykQOV^8Y_Wx z>QuePUd9`CbAjOYn05+PhS5l$tTBUxkR+6;#DLPVI|M+MN9F2dQocFOi)J?Q)~J*} zVP+%*)vU}al&1%^)Fw9ND_my|1M|g_$%jNx@&ITjR?`xGxvijHgdNucG@$j{9-zP) zFe~A6=}C2wMXJrLeu4k{cEMU_3xWK{UHgd&0KoX)ZWsUP_WNHw;r^?@tVRt|Yik9S z#}E_Nh=Wu%(8vgTgPBEY+T9|F6`>8|(B04)E9g3%Rbpfs*x0K0UOXs`_Pn=F;+a at y zaogsa77y$B@^7tBR-H%+5c3B>f$-JjJfCx&c72|Ao?mADcE8yChhEZR<&N_AlL&cJ zhRW_Eqj{5t%tD<2&Kbvf+LQTC6H_72?BgpIXM+rKk*OG;>?6s20T at zLm-u z$qD%uo~8c&UCU)x#T{m{I*|n%^3k;V5jb><+PmngF7#fAV7?|+qAOOBNcpHKTSvKS zy?DCjWVK9q$~01W01g}W_NF8rS!+{On3q?dO;zbU`G7XFWWD<R3Z1hjpU1z-ThlO}bC at _~l{zWf3{;rwEf>){M8W;}he3Xq-*Fjj^Zq3kC)JGb-!V z$qZ!Mcn*CB{sXOJLzA&b?=i}!gH}q)A=9{~z>qMq9ou;4)lEb%i28t<3IYDk9aJNw z>#u!ge#>Mc8(1N1ky}m7JnWQXjBAN~EX?RsS7#+a1(}1*YzwD=*=Y6HWBkRrja9#Z zj0-w-7+vh=1iQ^z6&k&eEi6w$$EldDjOy2vOupkL`pKcfy!*h0(4I>R%kdaJx=Km; z1Ww>M}e9MuB0$sT1+=| zk?G9ZK@~JWopDu;vr?HXH(^Zm0zIguS#K=$mr{690mQ?B{9%evU|dT^x_+?Jtj5i4 z7G6S73+enC7tvrkBE>R5$>q<;_sQxFNqZcih^J2POT=+6cAGxO3TPrvi&;eV=4wZ zTP8dk_|}SS73I_SITAji1m-U9s~UkC_r>PZks8g#%Eblfg`!zIsS=8cPNb{84C at c@ z%w!pwvZwTgn?XZ`4J<}Jm&y9xl{>fM>)XvaP4^;jc~UqCxQ?2_Jl>x}f%|K+ at UdAV zR9E5A7`L3LZAi(7Xle;Z`vQ~DouluyTe{DC0B>`FzP&B_0CIO7F}v`;?8b%gw$Jnl z at K25qWgmZ0@U45z(Js$BashBiX6z#`dFuf at eDz;Uj9-vz2Cc(2Y$%CcUh`KNutt}W z$H+tC_k+K}1mwc`hZ5z3@{R<|1due-6!;j%2ThL%3|PV5;rTN+Dvcj-#L9uU>lDC> z-bJ_1>>9lwbntc?+A`;I&2+^3MEhM?d80o?m}8Fi^PFk>w8qAAF*wokXBt27CaT8- zBpnI%FTXf)^P4qA$D7Te)kwv6rNvhnX+ga)yY78NvV@#5CYD=3=FX&_qCg2F=AswA z9E06Dq6SH=?dU at gJrnYHL@@Yq3?xQrI7VNbqf&Q-n*{pVd^noAfaQ=36AK}6-a(}V zmxjS{^MB#af>7;X*S^pK(~sW=!Pa&D__jsCX5AhBo#d|z$1wJ zMd5S}?BcvF3knyrxtgr$1v6$P0JT-?%y$cKHp)W)`FxfmGk9N_2-N1)6m?ue25LKN zx__c*wA!=2c2Ag^%H-9S%cN?F at oeL|-Az`?(fR%Dwq$!?&Vk!ub~!G~>3F-6;2{$m zZ?+!2`7+&@cU5($bG`;#ARC<%gDuHwNzPblzm&N*MVe`Bnc3}iX~CEj`?0o?P*+OS z_vZ^f!iY&)@OPDA7YMtzU&=veNA`%Xif34Qb at B#aw~Al>l2kgoDk&fU1OT87`aecR zoDFP^4IGV?|CTsT{P$JpA0JuR+5T5X(%;*P(>kMc9w4}IGPzK4`btB+>6=1E5YQ4B zWQqqx*rhG#n^{OujDE`XrcYD9?cwiz8+y-~9d?vN`ZFx2{l3ioo#WK&wJEpD=M5r1 z#skU-g^ARLQtZGLq=T}mAgB=@8O?*~hM_nB?WI`Gkjz=iwh)@j=1d(kop74yh%*J# zY}>yL_zVtq%atlC0=wA~L^`C);HpwF_M_$hA?+QUD{I$v?{thA%-FVVbZpzU?Q}R} zvt!$K$LQEe$4)x7)8}1h at 3rf!x4!!JS^JEtG5&)4_l)a$ZgmF@*UvTRpWV1Ew!L4+ zkZj+`UEa4lA_&3Dn6Upu+FS-KKI%cYTy&;wyF8njC=Uc|;K0jDHIE;e?C;;q99^{M zBkor?G`kg*aaGAaBM#1HEsC{L#Y^n(WRPgn3s`Eg5k$WgtRyR&gAF!4%Z(Vc5hmq& z>7x}+E4_rvfaF#PJNYwSheiShy=Hm#>e`Q-Jj(@6iIiivvcpP)F07E>lKYM=>N|Vp zA4+?z308N-neHp1d@#k0Rlrmh3^ zcx>rum#%ju7f8r2THQ}Cu;|1JjR;??!+Yo1{afhM(fAW6NJy*-!V at X30=prtOZ2?M z#a__I+YTt4L1s}dfitVb6`zkui8RFo?x1@@TYzJl(T{iN zEd8LV&)^ceC?jM|BUQkib*fW*9pp6wk{i;{fCuDe(XV3c8a*DUH#P{qrWja7EzNQ& zgqo^$3D`Tr3afW=^&o}XeTi~MQbk_HG`T;MO)B8&qSg0*tA at G3+u7m$D>hmG+occx zAF-+WPYIZ+ru&b|f=`PAdONIWt11qI%EChx?LICNav8h%P#aP_IX^ynyp7KDBy*NW zp%)XCg_97Wz8_}n(`za;t;p-?9XV{jQVYmg0E$rJA;y~o}jv(CeA zHg_^)4mSfdkWal0dcU1qbS}m9n$uoNtvxa=eyr8zg15;vty#D&eecCr91s;L)bf$k zYS7b#OkB}arU<;|6tr%Dsg``F&9hNigiDn*LuD1PJcx9{WJZild#Uy%7K9(f*c$T^ z;NHo$cq3;=AXxDd%m4+|53rfq3Vg%VdaOkwI8q6!lv`|o*O!FOZ01zQ=CvuWvN~Dq zLnPp8kS^DMU>)`iG}JP!kZc9v*EaO_qHCu=Ck^l% z5!!a7F%Sv!h}`07z~=o4`S6G4^hM%)Lrz0BN9y{9#3`=jRyEEOu}wweobPIc=`d69 zmYtPQlS((5AC0rhyT&q_yi8Clo#>ABgl()$#^ET`uf3D{=7n+^KGrndRC256#Zj at N z5t{n<_8Jbr?4c$E7#Jhme>brHU!zgf+|KU5g0V#1{vS1)0j&%@Dsfmq6pX`R at CyuU zI%+GRVU$$KSMXwqANmuegdJOnXBfjoyPkg_h}e~Z at -YDqk~o&}A>b5VMwwYTn>pS` zYdPO9uY|S(z@&_6Vk|Zs$epQTFy*A$@g%^|jO9ofb_3AJu_O`{d3$%jDeAB*!fm{g5q+SJrkLgkc=Tg$Mq`(_%G|6Zd@ zvxGI9I_RXh6E#&?Hib5}KBQ;0 z$@2SA8mwwvHjzzmnxON@)-vY`f)f9%ulfm6ipyWa3c^j7ftNyD|B zRg6-x07v*#JmIQVcECBUiurbVJYniJT&*K6Sj7|TOg>iL?u&yp%UFbAFVaP0oM!w^ zpOYX!t^RVYCLsh(&Tk&!Rls11q>VEZnt??c4uun~Wh9l|z=V at zAYk)7(tDbEuwGIZ zwDk=?r?Y+N!u;-mf7|3_)p5J%f;d at vWUXc-mtJ)X^&mjSk1UaxS#8l0k|3PkLhE(I=v9SWBmV>~Av4ZE63!E`t0MpJg-9l29XsU{qE>_VEaA#n z7Z=*YNY#(+G{^gtE3VN%uCVsu$n}#yu0^?H at O3!7KGGwZK(fdX zPtKuAp^7kY2|v9Da9y=AAI0pSlqw5DEDe)0&P9dN+(Y95J()$-4w9vy{M`1WH$twM z{x*N`EQUrG5)6z60St`y-z4>47Y610b9$;{R{9rGlkys3S_%@_-Qjr|>L?%(aTPu` zRcD<-dvMPp-GNghK;{GDV; zGe5q_72pozY{bmgql<&Lk!p=xVEfdg4iao&MERjtX`xm5vfS_EvG~#L_O5Ej2bqcv zc$zSZ-GFT)JctI>)8v0kxRx4-M<6^Ee+wW>-=sFfIwum% zV0AIgK85^BsY(THal(kJQ&Y$_&ATtKPnnU>Qlk-0g(Gn%UX(=ISV5yx}JvFFr8M3G|^+tB8VZ8=9*SROI4IRtdF)~&6jnPGtbX5*IZ zvLc;u-NenN&04H73fz#&s5enC-{fO+vV*HQCk)C;!opxrjk=L*SST5|2SyM`BtN(u zZ7n0cSWt`sjJ$Sw#&T`h%(r2- at 1$AeSYmSel6Q at L8wr^HNP7b(#a3c7wbdLd9((K} z1xQSs{NjLdve=kaRj94pQPj at VUZe$+4T!1xXxXXtgEwlhSWanVA<_yxPI0?#;lVC| zJ^paYdwm9ywn_1eNb|(-84x8ZNC4|vlqs=*>o2%-{w=Ec{!B0< zFQHN;y9WRq3+)Awybe*8Bj1w+wzsb}f2IhY3j$`Po?01^=e!D}zp)TvA%`uKB%N#~ zP)g4uNegC5&YQknmuwH at Df|Fkae%|Xvf>jD)g#k6Dmx69pmO-w_I{V7a89@#9`K7ppmbPJ>&M7W>jHL3d+g8oeK_R!pq>xg_=S=;+1`yZ$89gVP_wfi zYjdan9`C+~UnS?1vfT(zZ#E2Kv$sya9Xw~6>3zY}vERUb2+xIHkH0}D-*@tSi9?Sn zR3au}B7fW50myaE6Yk1xNDj{Zq545j{yD*D8pFQu497-pX at 7qGx4jp<)YGlAU%ZH`wqdf1V`gRxl<~mLf;qcFDUkK7bl7Ed z`!)tu;(bTwcppTGx{s8X`joo%88AETRCd5b*ZL)ZpFhz#jjFm?p1LqMB6U+SB#s~l zOeCQ!d3%Ru#Uco+NY;vRu~!@eWFn?jyZp;?uLyReA}ZLFWlyf72wJCjKcnMp6w7VcJ;^d~})Bj=ZZtZE|rLgV%4dG`l<63f+q}R?22tWlcv+~AE#j&2L`;4vO>O<>s0Mvg zopNa*mR={5e<1!fKzOWt at t6PdLO-Cvz=Z$J0Qu_`cW`s@{!4|Dv-~q$N>X$c(Ueg} z|CFU)3`618!jl@%-UnAl6l#41lCWs7r?JnqEnG-z>v=eLLA at vlT9F$0T|+#}$@$$B zVIQB at O38A-%llaHvb|+Ze7{U5$`gdh7z%;hn>}zAh=im}ZV#fV*py4UNaHUxZ6_Ec z01aVsEeyEi-)?$KIpGu(iV2&cz>$h>lw51fhk z9>H$5R)TC-F*ge<>)<|?qAqIL<&q1U2+6hK9Xg6CWHPn0w}ih^rzW96NzHqWqn0=# z`d=b6 zsHp+{)s=M7sq>j8zdivu+GI?&RgD$59Yy!o?Kpi2HttjnEK$@t$h|$@UuRj*slzdr z4{r-^qvkIN at qHB5mo6e#42EU}xYd$DP~L17cw=)_YMO2z!vVeD18gXAbhPE=lQ;8J zqdV=?<=}TsT+=d_1XXEpbfbD?d4tD-LMYFM59WVCL&;XL#{Q%X=YCLRoTfaAiTbW- zq5h_Jmc;$j|MZ&8$AIl;rGcJOwR;iqF7SxlZLc{LMM3(czdUpzLi$8frOy=Pgr>pU zlV(fGIih_;5#v-zk4aANQb7da=BWcRhb2%XJZY_*ri5bS8uVEe=HkCA!h86P^#0|CzILmECpgj(JV3I5u`M~(2qc>{sHIV6i!IUq>~o`+zQo^0{zZWk~pv_eklVN*sr z#G);#Qk6@&Lj*vht|AQyG!vCnhghb35Z at _=uGM8SlOY;QRCX8O1iTQW;e-$4ZHKs_ ztL;mB;q7!QU=v!tX`YTwjXLW!wJ7UJVo5ve;7EW at yuk<1d!t3_1O+!nF!J&Ojvw#- zmeZY-PX2WMi^&VvfA7NiZ%qEvpZ$}_b%%7mV0cm);4k=+y&ep4Mjd;g^}^6|b2D9S zbC+3H`LpUfMDKHcWR%QaG^Iq$C;5K%g^Cuvl=VO^kLyb>kE=!6=KI|XLLj#bX>dDA z{-`(*l`+z4_r!oRENv{)g2(lKTorE+{`U at A79NY8cs0{@=7W2f8!E7Fj6pg%U zOhuAj1vLgJ(M_0XG|kPwqIgJ({tTC)BuRzYR9kg9s!@4zJeq<+Yz_`wt}@d`fjI_| z3ms>g&8zgja9}n`gTvgRrMnzEEvG=B2J1k at fK#ovEtN2rS2Ur}l6^sIf|hbHRYFRX zPlV=yk!s at CPt1jTVd3PCFfj+(#0e@&2{_-y$ScMPI)MG)?mgN|1->rFk_tUpT>?dd zdOG`>9!JFas)O&m1i6r+xW6#t<*rjyx;2;FQ*Kbek{V!b5s|k9Ldg7VysRl#r;h=; z&K(wX!%HYlWjW?j!{U00;12f(i)x1x0-KO?Spvo*PM6@=M{tD58Ds^Ks5WyE7kz~$ z1ydE;s^_T}p0T7E8_ZgzGj$P2bZDM98;1lZZ?&%?GeD4y;-o1eqyQ%+J7%ObfPV>> zk&ZGz%<)O`CWwBF{)EFwfcmu$d~o)QEitidi9=vyL6Jfpb11T(?sEIAIv2ywFmrWX z(pf;>ASDdrVBc1Ru7Ip#mP1LmNv-*P;p>=>Y_W~&p{5PPF8#)q@{t9uD{g zWypRGT(jbhL*@}DBP=@ceCz@{KMb;o$>VsWF&*wCw)!6|ur|^OoVLF0baUzveRMb_ zxv^7uR8BPCs&(<4!+6clU7>8$p+p1(r|-JQN*y?y)4iW(i7%@oHjTeq73e9VtvZL- zlv&`_-GNNjneUxd7}^@}9ruHYD#v()c4- zH71yqCtI{gFqve6-Sk4Ct9t0UZg-`O~xCYkBwYBd4Dwc>=aO z(kG at 0ODCOXc(z~PG at j3{w*NrZW99kG1z8jEvg{AiWFH;ld}cok#&h*>hqpaHw#Hjs zUCTchr4dO7Ouppr at _##e@$Q$rr8#2ssvk>XU)Q-M-WR1ydvTr%$wn4F5SSI9hUHeY zV1lDA`W}-eTfF3FFoEzK$(=OkT9us1sFXZmz*|}a&mPB6PG at 7NGd1}{kf%SJ^qL>& z$;y$Z{2-!0W~xdR*=VjI&sfTOXJ)3Sk6F&P2=7C?DG8Ybi>?YPMGaA12pJrz&|Ut4cFWaP} zAmcjSB+VgEbENXl8OaDuH>+B+z(@<#Z_m)$(%Eh7n6D!$s%FGy+XI@)L`mch1}U{y zPxq^2*33^GSa#&whDT+UxJ%2MyS)-<>nv+ZveCtGiX!d;8nC{x(sg*RB`_4guknjE zMo+p=yOOzUCRHqs1<3?MrU8HoGAd93sim8AHl4)BWc^3Q%HPJu!gdQO%NWcx*}ccH z<_{ERO|zyl at TWsFS0ov!TFeDfr|NgjbW~kS#<`A4T2fkBSU${S{^Z16a7KnSc?*Jto1#yoiT<<_Y5$%ydX*#L*!y?@sX9lN#MO%9@{I2SRKM4OwEGBx7 z&bHX135Gx94h7VR6N+uLuV{?L1D`8XDs!mQf(R;wUqU;fZ4;j8WS91>6q7fkxaze+1T~-b*38-GCE2#!Lr!0Ui7HE=V(j4#Xqh z15bq%TdmE2 at f%^j1bi=Ep}0X=w~UtqqTy#i8v?P)XtB#d-y_0}Hj2$2i=b*_w!Lh~ zGHgnDryEjuQPx1fyyqCWORz$kHRJ7X*BzGk5`!ZjQ|GJX?Exa$-vPS>{%u(SBvK~r*j=%k at A;-jK|L17YnN?Ix z5hJF5gr&p4ekWr3o#sSA{24Xl0E5f?9Fpi#r8f-H&p0>L;SQ{er7Pwfylw{^&W{G> zWPN61NKT_gAV6raoD9~a26DhWxZWlNrJfj)9yZn-1spR}0xeiMQByki6Z5-LKtXlm z6gQ9OwA0lLcFn5s(h=qZ!Ddl|WVxqF?Aefb)W~I#F`5k>PjI`4Qr!Smt#MVm0!62B z2tk|CsQjuQpUKoz>0%(oLnZ}>4U|)g)o8VzU}-WgL=J0u0~MqZ17<1#yKwPHZi}-_ zxhN%D1ZCzQPH)_D&%!jNZxS+j3x40e{CG~nJ*R^lT7ivnoMr4y1)dk3Y%KngNXoK8 z8G&s>yST?44Q<}G9$v8?X#=Jftl3+~{gmR1h7Ox>*}z55Q3%JEjIxR09g-#CKyVWC zlyM12p4}$B-!4$_Q#|=rZ(kmJ<5o1ik$ywE6*zoGN%+B&8r^rIoSw4RVTThfC at gw_ z+?-pAfs+rl*oe7F-^21<2sI`Tc4Q`{d)p2r7&FuYUO)|!#7fx6U{zSeryp zwhb+X6ErWS6kJBO_vIIytS%3xjiwHvfisc)UIC(PS6E32;ID6(w*Y2Zve{a at yopS% zqfyodlLPLZ>niR3NuS4_SVfNshe4y&yC40JmOo(s`fEY}dEpH~fq|hR{d+P~)X~n} z-hupYGE-Am6HOESbDG>tiWQtTnApBWLVkdv+=~nd30VTJ6RG9cl57kJNyf>PQ?j$S zx4mj>d9@&V8;C}}(7`OwubSw6q`HT>w_LnrV}pZ}#+pk_b)C+>yXg7h&zJoEaOL<7 zj634$!)nkC>_RH49X${x{o|xhH$bm{i8#0&bI5%IcF%s}V33d03`y#SjpA$h8kpJ! z{H%e_kRFO|!Hscl-sVvVAu$?G9P6`DlorYjW5`VAf=fXNX=5`X%Y)yDQNjqK=v3T^ z3uD<4wht9L8=7pEg^s3a^JE6Jd}l4KhTX5ESZyA at tQ6HwTo?2qX>}1ccH6*Rr)Tjn zGB&^#&{f0SDti{-PMarPp^Z0CZ$F at B<}WdA^S-uu??QzATN073i at in%KxHs%RZc9k zsQXi%o&kL_yH?$r)SD$2Ka$FF4?-aBGZ*#aA+yB7e4;q8EtCxH?zRwrLN}8T&+`dx zKW}*+WOvwP);gVL&aHxxO}&2X2-lh at O+}5x?j)km!udb_*VF`yC|+l3{38 zF9$%@vFs8VdPbNNrQ^WfWW=zBS&OPKu6bDfAr^VhWVWO&pU7Zx?UVXka*&PNrPP*Bv?vu&XYH=#V7>WtJg>tZPYSV zSxkx(+Olyd_VUGxb}E?cqILkwtk at UoJD9_;^p{NG>sTcpm$ZZR8QOZ0WLKB at DzkRN zH{cs~SsK>x8HABaTr at N^=xL{?$nY{a at 3h4U7S0Xm>0SvL>5Q=qlI!t403l3k!TZCH zR=?VZIj#~DLMTX?jDg|g8~yq~S=7Q4bZ5l at Uv9=-{|(Dkm7~~DWM5L z;EO}rVxW{V4#6Qpb4;V%QG;_T9pL(mX)Z9c4aYa(P}G=YU)!p9sN&tBlZu?=#NV2Z;Jo%7C!hpNfXRJ!XAFG)z%WARr5Keguo> zi9Cnp@~_Gk#WSNIk%-ww)&ctj@$-4~TG4i2Uj&3R+ozkzXJ(4GcRNu1!5`7L^0=%n z=;mnEty1-B^zSidMSWTBJ7YAhMrH5nsruc8gg4Qimx)=c3v!JcZ4m=NlB=@OV1sOs zWt{~1%^(KwoM%GT*7x at -{rKo?9VJOnoG6L{G3|YkVZ?q4vyp2|QVVtKLfyD%r~`#T z_?+da-RdF34*CtB$ooJmWB)J_MR$k`sT*KapU47s at Waki!0DwXe^)YM%iK#Ko@>aq zo!sC8eX}-{BdjGsm5UXfma)_`o=3YD+Qw4YJ}dn(;Fwv}B|B-D4HB6kE5_Ve z)XXE)0n5Fuy$XxI7K;CuIXq39)vr=5ljjth?={xq`@R5s?XoePPM6ZDyVOB&Pk&O- zWwz1S*wMFjvWx#^O|*8 z1!dA`bkBXv?mcqY2CW&qqS*sKG5YV`qm534&gwwlfePbo^cnbSSN9xmI-C`|WIy5u z7qbC6WRk*9UKSIFAX6-PV_wdllFEje*corh1G+Tvh7`s at zhvlM6WMru7I(m$+hwse zfeg7>@)xs;{jmj!KVLRVU!22dc|~B8FJu(6152nBQDnYJKI3%^U>Dnla*~?uGa9R# zWZpeR5MtNf#e9t;|7}8=GF0V8wPJE=8mcfia{Yj6`2ucP9mJ-w??)WnNBuG~-652e z>I)5V=>gh~K(QEAikowevMLvz>dNO_&F9oAOC#Opp66&`y$Kyd;?T@`4qBzz+l3yk ztjhqH*hZns8zn7=pDjyFuMp1bBn+bys0XrUJYE1SJ|N`wfDWj*Bpc#3krD4Z7ITum zNujSFo$uR!gD(~vA~4}E_(EX+yFtbOSMdGUsxnVpar6KS2)n?@0`G<8^wp>|lnH3t zGlUFW>4lM5F@(a?Xx at ZGyRP#idQruNPt8cGYv?~AR4?^5_o39S z%4?R#G2s-Z>mOdRUaPO928;tQTJ6~MaE!G1$-5{$=7Y=|e0osQu&PQ#S~Ro(y#SUL z`?dvdG}~rIZ-uf$R{9h?g9#fSgM~y)2HjlQu?K`4WwAIL`sad&Y`>WN#u)%QEc`0pF3?Z%x)9>ls%%ST!u|b?&qXL!Z20UMvBLzW1j#vL zp%tHLpCe8?g{Rhda|n9W@;Q5-mzJ^;f8kjKnT^s0-*AsEPF at R;3<2)CF~Z5d{Eo#2+b~#qoxVBZV!`iI;kAv(am!{<#~UL<2B&!zc;`6 z>)An at I%wt8o>lyc27+euCBKTyi#Ju~bV1|{_&S9ex65AhyO_;NFgfQNAk80~ENc^D zeQ=DBR9_6IGlGR5^rC9y3mOS+WzLMiTla$Ktor^K$i7whVkebUz*Fd(W9QaQbSgcn zTR?4rRRq}H7jY!8d?tvz^}~|x+3VpS>GbL+o?WfO-kzKm68=4h{Ou$01BVLs-AbrT zH9}dzvmX(LDi-q=6dim67CkaZJc<+Llaz4h#W!YusMHG6>H5Z-;~C$fXY>8G?bVNA zu9`*pr_mmV5AnY3#*14(pjySHWD@>9?DY(eyen z%=&_SEbW`QLM7(ya9GUO`iM8yv_eRslm`0!#25 at vuIQ!=HlS!2;zMaAGuPT0YP7L^ z_j_E9X at u9C1z7{N=!u#2vK{n8iM?x^(P=ESOVdv at h8hl*{S z{D5M4D*tBfiG#T&lP>?9Oqvx`)VcQpXOB84$1I&E*jMU;B@{s+j17P(pY_9L`RB&N zJ`N}Cf4CpM-4TcB}CmkcTb56gVqqU3|&X_s6khP3a!&n7Qvhl4NUc*8+h zY1_Tez^H2l*TH};BUun3AX(Te;K|*=lc`O{qr^&iQ-7&- z0%kEbUe at t=IHPVATSl`#a6IJ!dc{M}fCX`L|3zq-TA*GI;>eWo7tcEB;$%ITx+cMjRkq%sYdLP40QPsSujhD}Tez9co5yU~D7VogJ4T>FNKQl(=n_<`m$W^T at pQ=^zkBGe+j~&tynx22 z#?nvYm}Y5?-QX<}?G{>eRDZeca>~P78(J_Q7p*uUv&@%D6ZM(mhKa3$fnd+X&mwoe zIEbg@{VO0wALzF)kYHfs05CAV|0y8aWiW{ z^WS0F{lrtaARGBp7s0wC9El at zwsZroDR+JO1$IkZ_LI)a)l&*x&Sf)Od+q7pHXBf5 zD2o{uR*#T_9YfN{$koiDWs at AK1;z?&i(w*+RXTBSq6^s-W3N$m*6*9T09T at jyUfn6 z;$HwPMJXIlq3(&5y7kvN9!F?vPwG)-1C8Z3dsq7|!FoAFj_pt6aPgX&h| z0+jB;Lem!Snpj%1yJ#x{X5t8VEcYO!Ht6mb0V_NOv;~eBgHXNi_d>qFCm9;60KOZ9tU0QbPJ0GM$$w{RhPre%+(9>IG1&0 at nV!m`k z%Bpmi7(pkyfMQjs^qLxmkb)@%alW875vSh`Iy07{<8HJ6-Y=PsxMagu(%NiYWrbb5 zbv!RO(01~tH%E_F^LPaDYo+yID|JTlA6p at fLQ{jSI6jyh at _c~PWkuJJ32RmxgLVTA zQPc{yJ}W|6;k1>4Px_%s6j917h!Kt at 8?8Xb3-1h-Ge2 at Qg*mV|l;H%`1v}A*n8Fyl zRBY2!cVOXtj1Sdkj%pw&VKe~}52`l at wSjC`f1}jKyV at i&o;7gdSE>`t6^ou1J+{nD z-wAWE0*GqQA9NJh^_N(tM19C&aBs_~YU;3;$=wor`LKwiUdK&!}h#5(I*ZG3~MUAhKFpELMC|^aU|gv zp0Q~Ra>7y!PAA#d2wf4~Uu#U|9zA9VOyE9J_u2R57>6;6M|pig*&C&Z;J}FBAT$yB zfRmcVZ6Q{?s1DZ~O?*PxlEfH{58n}@3973Kth<9kHW>@iCn4=!88#-$|3xq)u;>TJ z;zzVQYaFL2%iT%K-RT!+T+AP*&N~CKdF~8&B~KjO$>Z6vukC=DwzQ6!{rn=|q{#Mr zVT at 3|I+*hH7})D)AcA#wYJ%a$k{8$6E6HW(Ows~?!9hRFAJ9w)t&8`jId<-!DD(|g z7B?kj7i>q4G&c4kat9dZ=TJTX(g!!kr>_Zd1 at V9Ux!T@@ao`}4tKR;K(kq_sgzP`y ziS*_ at a8~$!92aKIA8YB9IE at m1zCwqzw>0TrGz0Ww9b{ZvO=DM;XUifxfZAlC7LCEKd|E8&wY4s^YX!!x^nf} zT5vVOc&ZuktD=s><*f!Eu{k6~$ez$mF#u3A0d~`$dkfR}nY+?P_}FZzYwK zNLXqEe at Tw`|C!{_Ft&3ycl|#l2bwUtKvN2%E at p+&Uy{QnEWij$Nz6{XLBxb!g#I){ zQK2ol(X4CTu1)MSnTfKnA7;PlN8r#OlkTRPP>~OtDVy;G)YqL<(Z?i!N*~mOgfP;-K zoXLTIqV4Loi}s49-_oI8b4 at dSu?6r&67qCDCD5~k-a3dg1F+~NyX}^L4j?SE#h~jY zuTxxV-+sdbjOXI?)&J6^xEZd-w}yEz{=o8&FUFDnHFM_vmT(T*_cfzJwanbwd+-Xh zOs=C5Z&n%Uv|yI=9CYofYwRjH#~p4dRCjORzAr!cUdviGuHsOgW8zw7W0(F^kp-r? z#W==d7{P+h6s%9FdW2|v?p0{=eFLlGFU2tthrU^A86{7*`VYl%pu-D=7iZmtI8osM z_id);#4D78Koon41y)}Y5bw_4-x*cLdz+zt6Jy*QT_0zgQNXsnPhuRAn+F#A>PV*4 z(4X)kBn>*uwJBEJiOlpRUbfFNX1&S6lUUzKPk6G+r+qh~5T#E%Z#`{r05s3K5#;G2 z(IB}4GL0{Z=tcql>+GG)KU zEtp8n6M|APYN`xk!*oFqOJtQ<8E=C1SREt*_+JLyag5fir~+AOeiW7kzsRt^%XM-a z;^;=hAxqnb%PDzJm7w8tVU;0jcwEzouT!D2>B6IRy;6tv17kN{X=WlPJ8?nbkbRP5 zF3q;3xaCm9{yVu!ki4njSEhX=3~*Z3P+2c2G9}oqP~ZUc>}!}a^2*>Z#eao^c4z`@ z{4Y4t|DWLauZ0fl3TVpc`j$Gpaya=S!V&r97(V@&|0f)dWf#&otU1=Ds-!>mke~OW zBdxCcpU)i=o^eL}OUVk99COSpuGZ39{xaUT7o*2aV3-XR1w_^_8m}-km;)xKI0%WvR3lG{2Hjc!q at zLfs5FC{1uXSn~A`tz28_7Ta{smCg zqmHWk^Jk*RS0c`U{wLVXw0!^WIc8*O2d!FB7t(;zQ--Yw??<~mjIaogF|8F?(5b`Y z#^uDh15KAiK#kQR{begYt#>Kily!YE-kqqN!xHQIq5toZCb~MTgAAr;>?o|*fAArn zxaKUjRPLmC at TnC}&!^X{s~~QNyLIa^$;RMnjb*2WvEYEKVK3Y6>!Cg>T78N=R37)` zgtySEc%NlioqsNIv^uH`P^2H>t~U(0cp>D16Fqo`v|9Xz7ZimEy8olhO8=xrb^$Kg zzEQs{pKQ$fnS~}Xfgds9x@?G6n?8;bOV!EX(~JjBpzZmoT)1DM4d#`YeS_C*?Q0#K<+8jZh at QI9Lac0YkLEpUkiDJd`ucQU#I zOi?wZ6x_8+NgUyRK|)doJxS4$Qza4Q7smn3xFzy}xs*a2fq-tl(d$i9Y{%ngfJ#>! z-a+2)Yx%raha at J6&S2d{cayw_^H0qLIVNs_sC>v zsO}x8s~=zgfHCo(Brdb@>NEP!QW4#c8}4Mi=6sjVY(}%!p0MCJp5%Eucf7jF zzN6 at PSP3VBSPg3gn;UR*ph(1^8Iw<4ePe at 1L-@Kax9fA+TW^}OepGIS{G{2k~ z8qOr%xCpcP2N>Yy^9b%m5ze}U5N~jI^0Pdr*zqsqcHfTp*ZWA1%;4 z33R{Gs#iJax&e}-lSw7z;T*@Miv$zohD^Iic8T>EZ(>@gQS}rl%v5_gk+ky;aF)&r z1Kwuj{Lx($=fi?`)pg^S}xgVbwWgEBflT`um{=r7sNh;WX3HS48oQ}s`+8uO)}>k=&F>5>!m zBgg10=USwQgOxmt)h^qOFW@<)_BT*iJ;Ds|Rs6p)Y|!NOX$lM6HkbLZpNh<=M4wcm zDSqTfnchdp)M`+d_Q(4*mH%8>(2SnR^U1OUk at EI6hU42Z%_dzbWgy z=-DdqNjq2Rno1r=A8`I4MyNDB}_y*sd1PjtI6qPK)LBkH>(pK#E#9!yzJ zaKd`T3Q7Q$$u(+lP#B9~W#n7~wS*)Gw7Lb;$TjIH5cHxa`N9aBCyXj+Sm;MPM);6t zC6b`iaZJY!#pp{}OROWoCW?bP=;VmQ0JzG}gyD~r3<#&3eXw#S=#y0)|F1#xn8d^6;;}??Qgdn}Eix2D_Y`+$u3?p)q zc?On+<>AZ1p?)u35#atxPrkx7>T7K_CPzguD!3tAu>#m{zzOCK#g8tNPcM;zW)BVRvBmR1lriYbWJ`G42=EXKDYlfo1ppf zzbihr%y5zb5slKDUzH)KomWI6NX5lbYLu#%mywJ^rCJpz%k>#Nwr#O&pMDLumI*Z< zx2O0hD1Nh-X8z>@eXgq*87xCXlhU`u^5fL z$1m at dIApqUvQga5VpiO9ZIq2M{geARY#^C@`b{Zp)ZYtS@%0)#_vi=*2g|R#uZfk? z>!mQ}*z2=V>KFdK)$tq0-ec=mZ_SNa?`3J+C*+YP_TwfO=ZI7$L5X4}9h1itHu=hzk1>z2)wigbM?eofB#NbGC3xO7Bc|6vV!{cvMU|VB at B=M8-b@ znf?*z%yiRl at ZMd$&+K9frDYEz>V5ZOw_)p*+#+C%>rr%e_KENGGOj3|diReQgDZ z(;Xb^jV;ic3>8sp_<%K?Mwo3Sc%d|W(JZ6_tN9&%j_6CQ<@Divc2AB5Eh!w^ug)|X zNjP8eFFEOy7uE at K< z+dgb4fxCF6h}0k=zy>o!uBPi9vahdI#ou#bMH$udXV56K0XU$RZw(1L&_nQ!<<>s= zRXviwlsOt#Sxm6>Jis5&ig2EuBg4RV9?nMv`2j5A9wtr-sTE+SOt}4qmg{z zj$TmAW=KW#lxKqj`yQbLY~Tfl;Gl>K6h}tk6?V~Z@@Ss{d34X<|BJPE3bK4%{=B=a zRYsR>+qP}nwr$(CZC978x at _CFtKWUjocAAd_SNi(xm)qOTM?Px#FP0+H40x3!@6B5 zUCJp9!!kI?SD1y<*x`9_r7`q3XtlL~Iuq}rT})4Qbd+*CjIN()DDUNKjDCHdjCEF% zpU>m3vig&sRf762z)5URE(f;{Li6&k__HBA*n3vA!+15g;Y9El z)oI8W;EesI{{vYfr#)SZNj1TDpx9^3 at IGF1Vs+;89BnfJWIB;4Q2~z` zjd7g~amKJQo5OlgETC65m)=)n!6n?(G8 at bG*Hcl<6{$@)7pZAZiG at +BK^+DVuFLwV zk|u%H1+P}sVcO>Q8&h(uyT)9ICe7$pk?5v63BrU^N2B; zyhDy(kIqG(fvSKhX^B4i^i28X7oM at AfK%`|fb?3~v&sc{XsA>MN>%0_FEs-4qmI9h z2h3+QVAia%E`=ERuRze7#lw at DX_Jh9%}p0{$2Lk(Bc%&>@b8RBa6-2SE-Z#Uriq!DIGNgF#=nV5L=*9mUvdjs}9oD46s%J;mm7hCw`(QVIn4F+N)ZQ zC at I3wiUTpxLX2VYy}1G472VquSmO>r-&O at 2_74tB^{zD2`-Rvg5)$lz;13YbsSwNP zLc}7V#2AI&Q(2Z;S&g+W8f!wVtqdAX*U(9^REJm+ZCa@;J=fJt7kVQXbj2+6GU%?5 zlb at r&7J5xmo9$W_eAi2vBE#461VEl at Q0hI28$yYpW0n)GQJ*f#_2hbXs`ova74-rr zv0c4RZGDl6rW5}@*$9x-Rh{^&bnpHv#IgOeq5J=OB}m!%*Qm;9pBs+z7AFLGz7SXf z-bHA%#AgSGUwnC#5>l)Fe$tk?X at Ql*ioh-2{V;?K!Y~A$$L${m-t_X5RNHF^(xtF% zuj{uvj7W<5XOZ(#hO4VThuH05FN(Vq#4+!uCKBUuh=`31QJ8l~93`li1X+l)6Ja;Pl)td_BDoGzW0+-EwZeOv~3w zE?EZcR%qfPTQN2kUNsfui*2x>Yr=60dZpCb3RPO28cuT!y!Opf0|*u}KU-1^u8V=V zEUHm5b4 zLqEpVE_DGdYL0WU81Vql9_BD~I49zC&?4 at Dcm1)49C+iIzr&TEz-vAfG;#)|ALz_n zuR9I~k9&0M1Hd+n-?M at L7K7kj4~uKH>J68G?~;sgCnJuP!QsCY`F2b&8kNOOlu~LJ ze&(~UfX%ZV)bqS`KZiWf-Kr1 at 24)XL_YTURO_D+2Y#iQL+xJ=9*JT~JSOS=C`M{ZJ zSN-_L;*??h1Em88UVoV=*a!6A?m@@;+UEaP)y at F>58)sG&i?-U9Zg3ISq;HgPIfHR zxW-%osG`I_5nk{Xq?uG0tk0jATv)NCWh zcWv2h(t_d}kc8o+1U3gN-498;35H&R-2KB0pGpw?Q2U9zX^d0f*bGb9QyHO=B9WHS zy^ljxadM0y%c4X%dTr4!NLXYi8w(bylog{)y@!<_SxOpHm7qyj1VkldR(_)lx|bVO z-BJd*O{*(mz?HG+Of64mp(XahoMun)oPe=_tsoPhWIu zW>8TqRZ5mEoolZ<1R>muf|$7w>~#sZc_Q{^+?n;F*g~cUCM*Qtw)Y zpGAA$a)n-zBnkbVOkycmGR at yLPwDyXRhJ*;Z5*RM%C;3xac$VttH#a*R zDmh*hBZ+S~5P#EM%T?RgqzdDXD;GJc5qkQkzL>qHWC^GVPch%+!BYlIHCnTze0#C_ z*@`g>VRM{4LIC3n9id7CYG*=yG(DOLJ*l362v}x>bf2+RK2bh3f0DkQ=739n4bQUE z7egf-$&zsdF{y!QapbNic$CrgPIyG*6W<6t&G<7MeJ}*x!ZLJRb_&xtl&cpsv;oeg zLM;+ig+Ya_)58rr8arA+tx%C0(Q+lI at CyX2q`l+3 at uz+v2|JGJO-vT#ecKRJUux at H&$FZ8_BP=noyV(9^69u{`7D z1tLs;RbO{uzFFhfVAr+*3;3~wQ at dN?!b_6Zy5|c;QVp+sx zArN!2!6fo^3$od7L^FFHKsR(Z1aOx^k8SwxI70|u+>lAsf#t|{Aa7uux&tqlJcmj+ z1Wa>XaQi!lMN!)?g>`eod3P9y4^HASp--cLjHSZ*<~W}dvarGJzv{A*oEV5 zVR78f&cC^ch{HlO*(#psxqV(t>k+p(pn<&6b$NmD_+a_?f`E8K5pjQk!V?V>wNDhO z?;f-d9;ojnsZ#zVZ-)Xb(81L~E=WjLlb+?F#VEZqxxk%J!~hYWBGJZ+CEO$Q*i2Ha zC=%OQ$t+M5X}FB{GLB$l-p{GAC;nkWE7j6i9aJdXN9E=94`2BRPv?(MO-9QL94ece zp)*X^6O1Mc_a`=e1I%-WnE1lJyjDvIMhDg<#k)z29XM&13KPHUnJ3N0E%G7}7Tamb zcBGc+OoD2xzX!r~Z6^|ERV)Oy!O?X5DK7DGcyv|9W+h{bNYWY_x7jz&W!J!$MPnFT zX#d5OexgBr*EKYG&nt@=lHkNK-jQvrEsI2x%?wR+;+W{fA<=A~=*SgH{+EEdjxsAb zMiVey%QLd;mJwqS(Z<5ic6QI?_I^aMIpXC{gXxuwj42syiY4>)qxgkSekP=pg|kXd z5#1j$Plh^#Fd{Nhotb7kYYG^Qs7r%K{I-ZB2hEAkQE=>I03b- z>%t{?#8YWs{>n4FyH%c8`B6zYeOAir6_rg?p#u-!}dl`3^w^gP1uCg2Pl>Fg6~Ld?-EoR&_qGo zG+0I#IhFM8?p)B_;`hXN%3oE7-GF^!lT-T}ey8@X;>lx|tYqe5q z$YgaMh>PvsUu?;Grs7P0U6<}jPeV$ZK)Z4%G+rfAAPcA3MA0rJgRv#JxKx#^MOk at n zCtEYysfTvq+cT^;Eh)#&%4~>?pJJwJSEM{Np7%fjOfCa$j~^=syrou0E1&?SHchIn zwqvZ2iant at +{V&pajv3OYR`nUPv@?_SE`jE`_65U28^|f+8u;$+V60MN>jY)ohp*m z$8BSH6i<_;cw(I_5!*A^Yut at -vWP|dUOf3Ac2|x}kpxio|0%9jhWYCpSzDEdgPI zExRoRA0Gvmq-145U!A{2o33oH8W7eP1Z7GE$1=V}_TtzE^MF+ at h;@>GyVEs)`*2zp?$HkaXqe59q at FvCg zfr%Qam&goK(5>5UrA`u<^gP;XyXD^b^1dGxYZQt&WwPTsNK!w8_L7}i*8OGd&iYNS2TsjK$XDuA%Nx$1KmpUUmV19CB} zU5db#KzR>D(|3lS@!m&1kIeQGnLs4>Sg8tCF1 at aU9F z;1=XO`TYDt9V7L4A8^8S`?sCwY#;Vn at 4w2kf`14t{qK2$l%yRyq<_JjCKYP2%kXQK z7V$)QX!t1A&h2WtnQJNxear`g>|m^SGmoaR#ftufGBC{f4M50POZ(9Ceu!b1!Iy(s zQm0)`UtUh1n3|gTeSLp}@IxK3?~heg==b+40z+*oD=CaR0y9*X57XeZxoplkq!F}? zmZj66u zU(H^-dfsaF3w{fI9<^@TB;_Mk^Cd_@;z~h{%FgcN2*& z1VEGZB{9%xaM+r4MM~AN&7!aT3Mp82v at NG}GN at LrFKgo1wX!m|*WAmC5LBK9`oMQI z*(ODM^3dAaOQ(;PHM?F at NC7S7C#uU$jA_j`l58wHn_`!d1Lahdn+d{6AD=olQdTtow2Pw zPLZAQ9$y7g2}NN1SiSo%$oPU6Yk5CX1c?&m6re<9N6!ZZOs4dbt)^lgAyCY55h?jB`{zQ%e6$0`^ z({EzwV;D*u#)@n6 at llmH*T>jIy9>HJVkX$??vM+0D=EC+V){DGf?Rjvc zJX5!AXy7 at a&p-}W2N8yG&wuQ3*aSPmt<7Z!!6Vt`#>)R8TKc#KC z_`Y*uY9chM2`Z{GnFF{PYPJ%=0k;+{xw?wI0{=5^=9jey{?0jv){)HUT5~jGgjTFf zmI($=-R85imyjD9=Xt<-l%SW|pp`sbcj|na&$%oHzRuvjb)gGt1Ws615 zt#wTc$SiuE!6lwil2Gm5Cvm^ZG>BY_l&pdr at 8(n8d_U7PNR+|JNyO>}G5wA54Q8s%|Cl zFpu#3?W-XXI~$Hx{u|%aMo6O%nB at jWJI_JtncR`Ma|E5N5cCJLw4jlNgn-ThnuKT+dVuHqlDgUN*@Uk&M6yGidb~F9Nj?_3pe}(IP;Kw zu_0)YJB)d+d6Hs_lyR7ODd{GN$>!*I+8Cyela at Q6UXo2BYX4H;h)Ci!1^x_5iyMU;`1A3%+f}^789d~LHwWF4iNtZ at LVF!HV4$;EX2nY^7<=-njjfM5(N9hd;j3Q)ta4l!Dh2%qNpJ}(Z#;8Y8F} zY8ZysWuk7Tx+5%@b!&NbmRf*rON~w?hJRlR{=KyRY}#P7fulq>Z@bZ%I4qh9flU(pFI5lWl}C`!DK(+>yL08Je^2uQ`Sv?wTG$+&dPj?w}4s6wl_ zGOf6TQ^uEBn?E!gPB2Xy&Oazfb=f#mkDsv%b8a0mDv5%mgnIP}1^HL??w{QGG#hH~ zzyzc+tW!W+Y$lfgQK|Nv3vx^>RZ87U>-iNGYhJ|yH&*Gm!=mnqTk8nJ9Pz*HEsOiL zWyiuf-b;P*g2}f#JxVq>Cn(|P<61EzI=7tG-&F=T3NadmnLmBn%}oUYrekw11B#Ul`KrA+#Pq)y)8 z|LP5SWa%KzF8qTICio6TH=iEG0Mr}2U_2AdZ3YH4*CS{T{K|P0W%kKX=;p+QzZg;X zT=2~uJOQ8Yi1(z at NtjN6=aNU)C8|1949aM+EnxkVaj?h-&n0-fydRMd!S@@m^6L1*Td+4awh?$s; zm+0-$~eeW^~&1O`9t122J> zC}s3SM|*OTM<$I?-*G)@(8{1`3eaQXGnr`<|A53vc|iZSKB&Feg(&@{4}bm&l!E`4 z`tY}vHWeME1$hLXG>-sV99tHdY54M?|#kI`zz0KX4+-^9`Uan<&zuz9g`iWHoPX|rF2(+OLA=QG~ zLoayR1B~Gn+bL8Rc-X_W_HSCFEkcm4$>r&Z2;ER6(^DA84sxSE09#d?yCze60Fbqx z>z%3P9GwYc?3>Hjld_DUPM&Lv*_kpFVjIQ9_mktyM=l&QPnPbAqM at HA7fT>lBte-B zGPX15nk^Gm0OYkq6^Ue;D(hR&4%A6vBlPY=V#iq1TFYlkT`Ej&Z3u*Vimk;Q=0RoS zzN{j!&}j^-l;9T=mn6DnN)g*G3P4z+sss~sW=)hC-71Bp{%H;ij+apxf9NA`#$fN4 z@=$)B^}!LGfoa`X;pAI}ac{iz=mqheDbibqs?K2 at 4mbspkLYmvBfe2C!EPxdK%}q> zuAV^Id978K<`#Aijcs7|x1(XjYoPONrSReYkM(P`iO;)avSwa1);jfzO;nK+hI){F zGj$8tR;(7E2N*EP>B=<{-mkCWmOC^SI1JqIa0z)7T40vT~Lx~X~)VO+TqB6p` zQA)T1yw}!TM-|k@)w#3`0m3wrESMD|8`m zKW4y}jc2!07a4k?SC0Dm=PIt!S#+ePg$&zdZ6NO-2PFAAI)2OLSJ7CdaR?tK2?D>y ztc4o3Oomgb9Tzv^Oux`M at e6cOt)b|aam%JUf2GG-*Z|?eAZi)-H;_lPoBlm{aRAO6 z&^ykcgC>W7Zo)F>SZ+j2A4HUouo!hKR4bGPa*h at xy>&s<9?zj$GKoR(H)?~>x~Tkn zXwqXf5*h)*2S#I2uXs8&GSTJTR066MbiOyRw*fHCUEo~%ab#~qrP`k0 zBI7U$USYipqQjR2w at mBc-pje#-M`(2zF`m?^Zd(Y0Z{)exBXu(`yVG&zK}&0K>04E z*|OER4y^epTp_PntgXDLiqb(YPYWbi$j7|VSOIfIyGBbMw~u at aBEw85EV1ZE${QkQ z$lbJ+s{13#w8 at Es>Exr=>G=2O=hqRHKM-|z`5+D5xx+ at 3!RFqS&h{p9Ma1&2pmhHa zV9{=byMC!Iyn9pSej=a)z_rNNQg!zLzKlhtVRXrnwdy!@x_)`qthABW#J{O-;BhQ^ ziqiLtdX;PZd_r>E6=sAKI&vi`kg!ahqB@*4#8YF56joJ at 4V~0v^ODKghLxq6M1Y=w z${tTubZw*e%3rexYAhzUOiA(ptC#|gTC$_ZNb7QMTPz)IOd-D(lmKmDaXl at H&1X?u zMok)3YY&D_ZZsX;h}cI|eXFES(}~K|9EDa4&7eCL52 at H<6B^VExoSkw<`aw{r<^)g zHQIT_$g=JS_R(yM1?7bV?2Pu}Qs%WyW^vco8(ao08a^B({Tv&mdUxaucgqPIZpFz- zdB%6Nge5Xq5!Mv%2*`Bf@&;4D0qS-MCGavYoJU|MVpP?|p}QpVvAayl8e_^Dz4-dM zIiVG%<9u_a_g->QG3;7DgKinL(Jk#+mZ)Nea!n$2MHufj$sV>QN%LNVKN(W#EP(+g z5EK)nWVn&4AS7a^EeQ%>(2Q!ApZ6)-GS&!5gbWzqV+MjmKSS^S%*-(KEpj*aG4Cj? zApZpMhBd20;ymX~g2!Y#u|GCzQ*vv6%G4kThKF4c0!2uVkcvvBx zPzKr&W?dl2Om}Jixrc|a3a80Fh`YHrgMj at CC&#g5puqku$o?H^|7o(lQv;)QauaCf?nJza8_{_;$PqZ#Z^tSD5gQV0k(LC<+*nVYX~7tPz5F>T!-`+a%N}X8^Qw|Ghs<9doNd z^p`JlLH_t5^^g0*|BAr>^Xu>2*BVt1IZOeRKd>tkovO-_Jkd}2DT9GxcI7oC<`v~N z@=2^;W+61S8m?1~>F+u3VKUtFtY;9XVV3Wv9E5=}#Qfwqe^t4x6;DE5{S6mKP6lw`eA_RFhb#tY1HYPEj4D; zBPp~($9HG0#~~cMEh{v;2W05ot94qCv=Qom at 5-#PUflBrCC|AGOItXW6e@#u8=_lE zE_9mU9-~ANmHER5x{#)R0=cSn&>QL7;d zohiu0cU`w~&l*T!jD#N4S6xbpvGfpQu%VXJSSBA^Z?&%U)-mgJw?*%-Uymved}v@1ziT z&o%N&y~`mMS(ddHt84Aw7%ENq)#cA~ZN_XPSLK59o&rpimAaa0)jCDw1Tm;kyr9I| zgZaS<)zI!l21rUsr3{k at o!s}*9ojAIojAF{fNe>2A=UoQU|4I%b~o%}+!kdy${2!W z9YT!bF4y1j=K}S>+f32U?4qH(Ef_laB@@#+`pO53tAkgKBU_>!>X*H3nQ8~vLa&v_ z#>`G4DuHz^n1jycJ;=1pC=l2AO9Qcv46}xjP at b6Jrz#Gw-rdeXnH8}S2ZcN2wzFTZ zN#!i;yTu;#NIXDMzjON$If5Rz8nW9(io#I#Fb8c4No0{%(MK$L7k*{@=wqy4IPa%o zcFI8K2t9z%2JF!4$L0;9Y|syrlCnU8jWbl)BZEmV({BOR^lrVQ=M!;+*hTdoQMQ at F z#bne7+3aNmon_Xpfm!@Jxe^!|f)F at 576`Mt}-EtG2YaP?*?QA>xcwLWCyvNyl zv~JpPIj!KdpZC8YHl45^Ti51&Lq{X9h&&?nJPi^*AiHddmiq*X at 70ce{H}@&7;P`M*G1vW~{$=*)zL{3ub%PKbiZl_dU}!X at C{@rH1$Cn5{I)Vx6N*DHoRtd z$Mybv-(&f+_dXTi9PnO_aPS4P-;9E3Tla%1LhIfa!KDrDn}DTZ?G830=-nkfQyIQh z;??cB at M+8j>z4vq6l2oE=x}c%1aj~l8 at x8)19~Z%8GSGLRm&}*rNKBtIjy$Iorh7i zO>SXN7>BDlO6Rn3SY&wkvge?|diw3jGp0?9oH{nOMdRj}vzRQ#j31j(v+9|hR3~Rj zn=_)fk5(lo->N8Iv@(5iaIQ ze;T8=a6(Pi^hiKqj$3h$5q?) zkKLw6_lK+~vb5$aE$VZOj16=1yl2+3lR-tXrcGVCRg=#@2G9vJ?0%*HRY#|jVP+Nk zg(|3pfuMR33My)(S8S)DMC5(SYeJ9EFkZoih(#!KnrUVlDCV|?T^eCbWk=;?Y2?e3 z{7Qq0n>wrRCBN^M4dFj$9lNr%7r&mGqMl8%S3%Yb!H$5`ck$rK>XM!Hem)c?6 at m~% zB at 4X*U~(uCKA`IWsA(qpRl)=$W{{PAQWt5}xb#%8;-`bIeS_t}3F at NgCB&Z^?TvBt zw!|}1;_Rq>z9Y05@|NW=?t7{n=ZU5(Rzu8`wS{y=$f&_YP*)s;24qknW at T=+mE4~? z_W=mcKUE(0IKbM_TRZ9%?$B(j+_A)zyMx?RHV16LZYtdMF0s+#;BN~8<50Y-_mRCT z_n91a(PPP9wTFMUSM5rL&K at wtnKp???b2|3O17U3tpEn)0?38zYE)IL2)~D7Cv*DJ z2(+yvNKm{7?JJITbIUtUMogM^^olsQWM#wRAKO$}sJc8 at Rc+|C*ZNTp9YNY%)B<`M zD$yu9ojOUd)SWQ2Twpe|ZG&22&Q+a&k96Bo)xTULqXL}CTBH*Q5!I_?YoDw{XoS96 z1f#NhB%DHd zzZue{cb>bX?!KLECqeqcphoI}hxht%BiDR1-1JyYByy{I8D#DzU2e$ti&?bNweVMj zd7ZH=I_p5mUh9|-ePbt}H&7<|Nvu38QW%f_ZSHRGXJ$7J5N@)s=4BEIA5h{8zUVTM zN at F?E1&KzsDlT>*hRXp`2XPFrUOti#&tMPB7_z3h?iQ at mT6 z0=joDZzB>q2-RIPb&cGU!k!w_D25JKcnO26!2mRs{x}vw~UHCs=INHN2#Eye)4YUj= z5my>PJ~(6_pCs)6q#ss-JEHGN79%;z0d17_STEqdlFzNor$(~K!%i;Yy^7D%724Ly z%qjUP8*Su_#x6eQx?tB0w{B6U5&rCbxTl{J$2kwyJ;npv^+`2m_Vwp)00f89Rp-BA zhB(~+4Uy}=V#fde^w9I~&8xp62ICa*nZ6K33Z-Pqj}HF%AA#|K%jAks1+66l$&<_& z8x%}0J~H4BMgY8XU1%@MwM71*?Vzq#@Sb*=ysFtWYJFS zGh{#8pN8p`r5_X|u%U_oG|_Hv=GaVI=^@i>$Hv-;2K1oW8aQl+ZNY8stJ%44+26uM?+DC%T!nt?e98P8t1sYc6W(s^@%$OXCvFy6Av z7RQ7={xkZ?ff7J*n$ilunBwZmIvoKS$ z7NiCFS z%K41cqvy1fl{HXknBnj3nOsoEBhtshGg?G%dx98r?~1>ypYCK- zqg9%ZOBvyxI~&eQb?0SeHG!XI8j-9@%EWn0b_2S(?9M&_Wo>hlYzN)fdR*Q~@hYM6 zMJcj^7Zo=_kI|pcD~sstO-yt?+{QkHhY@?38(Ot9AE`dxfHGsL;V^uyKi)smL2%-_k6K z?sRCafMM1L)rJFX;7xZD5c*tY@@!#-1iidbf}fqN|M>DYN`SOeW=`BY at QLdDa$@EJ z;+qP{6~6!ZiZs4)+r$;`TS~&0TW01DAjlbT#ia6%#uaWz+V09!HQa=PcI}}YVnJ>+_Lh{5GDH4^NPoXbQAxI8KH-NrzZYM7@` z=>F?(>sY}&E;CG^KYsKB{@J|x|H%3O at ZFp+RZx6s?IvkAf}16xS(aC4Q~9w3D^(zb zi6mHHWh at 2Og==WDaEfWWGEByq`G)m&fAXzjY&c&=>*d_xJxPr^rA>u`B?>+S^t|MH zO+REi%}n0zT=e|`iWiaj#omi_rj(2 at S{cl;d7M}Gc7g?Tfdsm_7Y19af at H5I2*}#B zjqRJY|&D%>`cAgMdDHBaID at e$BNu)We%M(KzvB~ z=#XSkt2l;^!aX$Pb07LHnUkbupaw+!j=6^|GWdyJOBU9uS zKz$Os=RK~B+Eb|x>+2dqaE&=QHHVj=o&8LNdx=wkHvJeFj9vX;JVPcGm*PWGL?z18 zq~axg+z}F6Zo~E%UG-7r+Fx{`WFp>&(SPTED#2Bn8Ct^}y$lYKjcME^Ww)p3yfKs;8bYd;vzVno1ert2NhaH##i;{3q&pzR9+@iJH^4Q7g7V7iXpDcwGz_2^>rH+BKvVpu(UOVqOzn}Bh1<*EY!;^ zSOU+mZ3_##!jk1->^Ry3>!wX^7sO;prOU~a0XXrVGl>1h8am?>_4idyVJ2m#|2ox!Ac9bsolri!gHEx*Ul+V zB-Y}eh%uQwLWyJlbDI^L;R2Eh5d27ncjY&6TC$dhy zlh?tj;INb`u~0kbqNY_%M;noj1JQduDO)@&Djqo~VRSkYa6X(JrA<<$5AlX at dB%U( z5gQ8sRv48&dJ;T4Du9;r^Bq`^^8$K$p;P+hK-mzPIAZP^xCXc;$+;~Ynh_B(j{{r5 z at qrh*;Ph_^=KeOq^}nu3lmDefbpJqy{?i1EQIfG+;79Pu;&ixTXNC<>%=a#3md&>< z5EqZ}tcXNmp$Svwu-_o28XeY9i$$K(3y6>36|?^V6+8jta4be(nlsC40oP)3bLoD3 z<;8Ts=jZngTpxP^ZmK|Upw9t|9JgpC5|$&1WYXeMeGn0=f&(}B>Hh&nP;}dl84)ig zFcx2ja}VV9o^ZnTrzZd>eCbTdMYkocBC80N%S;OQd6+Q1Ml-x?N~64UP(U~k z=J_j(hZ3k7xl2^yl;9=T30!gEj?94oY^vx*RAY8VV^ zjrLeD7`FQI1B}6?riJHM1p~2`u+@>O5Ljx>_81cIk9iZrFu!h|DhTFhqV%u{BJW1-I2** zm&MKu<)@J6Rl+2bPg5i=7VS|MsZ354s>E)$NlZDI&`_Hu4eSewkM{==$5)06XX1lq zxF~Lxa4M(qavNou>1E=&&+Fs!19Fc%L7OKx(KjH80^pvlR6>zO5m$QNtqvh0Tajvq zh7iC at 3Ra$8^d0I0ouiP;C4{RqX3UdM7ynty`KDn+s_0T^8 at 69*=l*A0= zZ%)~e*LHPZjKC;?oi}my_`~0=0B|xnVKFf2CQr>t`0Xz>s~{Xmrspf99Rq5G+&L?dDaIb5Wmt-D+DULbGq%w2a>5ni+2`yEW(k&y zblHZp3>HgcmDN$b)d44p)mDFeh$*zntn2FGV7`_YR}m|Ym9 at e6fHf5(TPiJrfG-C* zq9+|?@SG&0Xc;4XVXSA{p}*d-mqq*|m8mPu5m^^tAy-~HVvv)$QkXjCfArAFzqkO- z!=X)Z!9B&AkdHN{T)8tq$rt}BSp|CkD4PHu?WUgJQFAgxv5V=Pq!953dG%E52x}GU z7 at b!RaeIb%_ANe*ba5p3SGYd?r|3N>MJS!pUsfm{!fQLUw!x(=^y}GB46YNP4kwozM8?#6V@)-=k2(U+j{R2V+dsrulsI6TO zuEFP?&E(EZY+9BjwQ8OVYvu&2^doIr!dllq>R$|QKAK+y{_J$OHQBlCkYZUU?M!!P zyd86W?=U=UAN+Z{6^k%WSv at M_eFtIlJ3N;2JufSxx_dOU{oXI at o8Mu6=X&{5PKfu_ z6!|Ukr?&9VtOj!+JsBt)>SjCh9yr!sMIpy85ZzysF(XdAzLmz5d~7NzfI|eqp((VC|3vZR4_&{ssz zlCtjKZR*B^;V%id;qTOr*>A=dwFFuoLIU8c z+_6aO3mna?i4n)6%K!ocpG&v311%v;JXUV7H9BE_0x;mC$Qi5U3 at B2g_)bEE3BQHa zNvUnG<4DCeL=(po+UG(?=Zt}Klq+p6STb}f#0hbjkTB}!p2Z65&ou?2a9Cl*=0!KA z?;0B1e~SlrUO6-G5fWKbS}7p23sjZL+nbRluKtv`N|I;QP&aaG-{b*glen7LdYMq3 z>@S%_sW||_T}+Drae?q;{&aper-wQ|nW1-&&U&dw9ltWUuo>}%ij%2oUcZvj7+3B! zX8M{|Xe>NkQ#BKck zp~{{bZn7+}a~#N>$J(SB3fke7_yLHGRR4vJj)%jlsK_PY^pT`cju^m*u9bBCI{=-q zutb~4Ku(7@&uX->dpR3KardWHuE2mNcu3H|ok&uIH1Wu=O$Z4qu0(XR4IVEf%?jE~ z^Ce5s&+!pRw3;f&B+y!g*rs~%#RLTq2tnN?oA`~mW|2kXjed7-+XB6u z7JRSnMb6a$O|_xSdn$qFL!hKeYUD#GLI$qH1oAPb)k_^BZCzRlcrr3`&4~?Yd-+A9 zv#BB at 4Dg1GCATu86%5DODDQz8D{UU!2oO9uMyGyp4m{>H`^k|?Dh_Y?+50o{!2o{$ zuLCXw2|W6T(KLzc-^KR(z(b~8F2~g2Jag at c5)!D08Y(}myei2|gc(%35I( zXv-Tgbfm`99b#ezVbqerOfq~O0=U|uyf`VBDOgtz-w#Sf{fXMU%n`N^Nq0b)TUC8l=u}=ID-eETFrnUOGAv)RS#G3I6DeDsmh% zu+^DM88$q)EaOGC_NYG2`u0P%*x!v4E)wP3YVPdOnY~p8qyLlWcKxR1P at I#cvgvH! z#920sxm-AbS*KV zNLibqxZ7+_Aeu~2lq}I>u&mo%t=mElXUQ2BXHQt{#iQ=>iED!hvQ`Jg&BtjvDea2G z_(tKv#~E&nUR>rx#bM_u2*}*b6l>BFgtMo(wSdFeS{Pe_&`9s3LrYRB+$?h7F$W5W zj<>$nlT6HMURyZNJh!REV2gChGipv zeTc5OL(~*snRh|&laJLCj+)bxqZ at gUx*h6)@sZhO?f at Bp7(+Jq@$V*MI4Vpl%#pHf z&YH6gNYJXtqz!`%ymQ3r$<`&{6I&L42=Qi&=^=J^d$Fm{h(~)ptCU1dF z|4eS3dc^dsSuD!19Z~`#KbgPK50E<73BySGF2}xGmr?iP5pANZzk|Jpsb1TbZc~r+ z>sRb%Do at TO?#q{`L~5>aNpuz%H7CF|g-R?1Ey2Kj8T$V?JLm39yX?=WV%)K9+eyW? zZQB*wcWm3Xor>*LQn9UyD#ldz^fSNJ&mS}0v(~k)H?TkZyK(k8`=&{takT+ySBMSV zyz8bJD)XYmtuvAV)KAMh)2N`riQdtVbd$#QN|nP+dNQPOwD`M}SMg$F^yPd=N0el3!2A<~61hRb{w9MTW;AibH^ov-0$t%vH9sin3^ zQK+6mZ&%gd4RW$lv%t= zWxTs@;lH7nzWp={CREipp~7dXe|Zf?3pT z@`!h8i+&fx`Eb7Eex}=ywPLHJ953i{6LwuL^}A2?3Uwv@{qi)2!*gW!p~~|9 at MNIL zCUvENQs2!33-=!V%$|pspKJ~#mHWg~Nrw9XsRJWzEzQ&K+1tgXybf%ce{x)(&{2E*qrfT;=W4>~}o7jTQO02o4DzteOPZuy+ zz6Q%Ad!@fK^K8yNkV-TOMeX+jO>$OL4n_zT8#l-D!c|kO(ATRV^}3w?Ers6bu&%yx zf3k+972wuzywOSpR~6a2L8DKxB&C><`gQpM_G87QQ!%7IB1-iZK)>#snd-oL=LF&1 zq%|ivc6$^Xe>k0L{|Nd>24RYm@!;-_;XzPhNIMG!L4TcYl|tG?R0STVE;Ks3Wi#2H zq8j?Z+IQ}B@}Z^qz-_v5e5(8cYFEs-H}OEOi|{=f?A50Im7m&42P!4FnP7|`Aj2r8 z%fu3Grfie}z7<`9DDg3B=C-`p6!>1Fe!==c5vM>yK#3k#)M$G%qfn6(S4rmq_^u#g z(Uh!bXC}l~TX-iDXn0NyyGumnD)7=uuXdi&`FrB`ZyL38yNXI3o7Kq2c9c(H86SGG zuz1Q*$+WN48<)9Moq$ge=4Z6nA;LY;=LWfiy(k<3GxQ32(bO_STy!W{D=L#l*;GsV#L?{T z>D?K~3Y>TPnm_RCgX6QVo}*?2K8L5DS=+Xo&~y#HnhmNnfyR|Y_CZa;Edx#RqYI2D zr#x|7m4o^g=CzArL3Z;2JIG-a_MxX>hcn{V3d5H%Or8MU8>m~=xA{`hV9*W(L5kaC zOGTo)HOv$ggMr2JqN=XO+N;!BeK`6~yk^JgQS#o_;wn^?_OBJqPb_P7V?oo}wqMW& zLip*-475RdY>KO2gU4TO(s4xssaqZOmIr<-Pngv^<|Ktu3Dx4tXnXud!zfJ-H5gUN z?A_hDfY-8cFtvCTjDVMy#tTFFMSprRg*HQ=A?<^z5SD`CM#W)PutHa`0!q)pZFOT| zd6Sl?sLKk0CXtM>Ee!F&;XArO0{PL10r9O&7>La^nX>L&y zDcs9-&8rUiUn0~@eC}1MQeRIj)af7RXFF1ZUm2yH>YfZ7Kgr)G_O|SN`L4gYqEX^` zW@&n$JJb#Hc*i}nzl%S7FWJ`O at sIQ4xxs8&ZO(YH1gXNE|JAqQb+2KJCoT})i~BBr zpL61locHc~PZ!NIhiKG|``&aYV?=l<^d0kE?F!Zl;pMo{AO!U;xh+xKaC@}-ZFjQy z`_GF{xPPzJ)zFwNZN7kjB!hy0(EML(^?#k5nAzI???OFPQBG!15Gkj|YGI^OP3Joe z^n%DYryFarxd25pdaLpNbq)rr33JRlrQda)*HBMILsHt!Ye8_67v9~R4(0;<+go3D z&=BBP*mnX1*>@_cavh#%1A%7Sv8y3U{icGy!c4Bp at RRQc1smC-xC0x_5Ooi%EuE9c zNVK?|*MvHQnny)BRJ6MUi07Iyveps7V>e|>jfQ%dV8VhPHK#~&Z=aNxFhhP?E9YY3P@ z0UY!#waL70;4&z&%)h^rqH?{I<;e#K!rZDXUmpvK=!&a?;x{md(S}z!uZVWTvJcsW z$8^ts1xdtJln~Au=P;@&U!Uu%EUJufC9H$#uz-5FKg0ZYlZB=?AN2e&ml_lZ2>Jip zWdG{zsp+UJ3Zn7%FD!gRRz-pkEs$;yMstufv0&1N6f=`9L+qt at DhpX9V^1UbU?Y6{ z@{*Z0!|M~nJ6;7bUEm8u&#`daEnm7=)WNSF?+~9(WsLB$?Re$W)XT;uz)C|6!aBJ!%(4!?GuBUSm7}pVzl%T zJyS`>@rX7GXDbG}dmAyuaZI`tc1gOzI#rOdG+jJaZ}ry4X!{ng=gQNy-_;iXe&9AF zph#a0J|VjmG80>@n2JOK8D?UF`qFvSW at 5s3b!@3ve58=7IrJlez0X!j`4SnI`FA6k zeM=`iPt$hoLhGbv`iTfP2y3W4ZFs)#CM_#uN?Mvh_&oP;qjaK}9^q4lH0w`Hl#vBX z67x4g9 at g4w>QRhfX8-0qIq~}{nwK>84s-rEvTfr^ zIj1T&jza~DwgguKS+*>S{Jhyg2GB9YJdstmpvt;OyvaI8Cepd5B)bgPx@J{cE;hInTdTTJibQ zL0n=&_`K!QMI1}+V+k|S5VYO5+}zxCXZhLnyzjjqAobA}PE_rAePDEz>FN#1eN?HT zn)6JlMEjN3nv3yh?X|?@*9Ac8z&KT2^YC68Oc^<0(w)HJd=0&yw{3V^m)d&3l+07t zZ+5dbJnFFoJh?JET&dUxku~-^&aCB-sk30Sd1=(QfEzE9SG#l#YW6cTpk|3?O^OWQ z>`lJmq0^SBy0=62YK6evD`?g0t8)eTMCxPg3tq))t=cbF?bPqnItV>VW=A95KFaxuV7nkpl|^d&Qz+bJZShn z^%bw}Ms0co_dXM7QgFfQOgT*LE+nlN4_`y0oVSTsU}gocZgb8CLjx^-$t+jZOBX()QLa2brIixG81hh$P1493Ee|SLSu2EI|di~T>!IGg;%U9 z$t(^9NQF7`%`wdpk=H*Z+9P>_c&?=LyyxO6Jf{vwT}f&$9TYS7tq+jazU(PWQ7L05 zM-rq=#H#{Ll(Ch*Ct;i}LUN|?L&lgl#}OA{pPLMEfvkVB2BQ^{<(WV;T3WkSexTS4 zF{6B&Afk2pf@&OzRzehZGo7*h?>skOn#lb86M_}NKtNdjJD&gAAfc>egDQmd!O<~E ze$#BhW*3cK#V4mc+!UmM-q1`9z6g#(Et$uWM&8lbk@ADprz$cjbI#4Q;N+!bd!i2Vu}rfiU17~(Y>Q~1?8%9P zXT!Qm0-w*o`Nt<5bArguf!(*`zMy)7Ki(v33h1xHc;97SVzzzbp&T4^2GnbYbzO&| zGFZ3)N2iyS9=myq+nUyYwO|vxE7X+TQ%QAX8-V46dCzTa`C?bk<71pMXel;L)+6u2 zU5^`(ktLKtTlzuryla1iZ$P~s3iLa@{MzBo8w3?{N7yEn;MHgV#bmEuwAY)^B>@g( zAJeCfF{spv^Y at uG#^fmxpf_^s5<~V0rCi9p&?eu}!A7d;48JtJ{B7{PPN3p^r zn{CUj$L2EDJ7EVRBtE`fty{6*1ftwCU&(<6rTeZ3$zoY&Gy-m*frZuLXzJ1TI6GtY z`-k5XRDf7_S|3~NXagqWXu<%k at qMMGzRZqmH}WVT6~&Z+(z1mplQVQX($P~Uof7Q? zMs}|~s13cEhDtgByyb#xN~Z;W+oCrpF+?*5H(Tk~<7*mC>H4 at s`xS8dmhGY)!L at Z- zHuq;1|05tNjr$I8<)vNkt`&4qU!^-BdsyhSI<^jMN~mLJT)@zd`dI@%y2BUOR}=#| zEsI7sx<_kjemuKyq}C>8qk=wZw4`4)-VK~@&IoXp8|1g~NUa}~%4nlE7)W3?MLE2X zFSps0aEvn9L6dxk4J040Ti>t70neG45n#B`bmNESn8{YZ6rSG!f|uAmz009Jd%{p( z>Djbb4O)InYmh;aN5_#VDyRJ@$C^67%0JhPu=UCksX+3Mn{hUh0Hb}l`3 ztQwq{F`I0I7IVi-JG1FPID9=ZDUY!WdmE?K9TLL0)KzaFoGsTJgR_r zL;tmx90 at C5RbE)S2aQnW at rAL{1J;>lIn)Lrj2sVuGPj?aQ`h-Bca>qadJs>))4H)X zKPCS4b1A8wN&n#_KE??hgB%a{@o4U}d>Mx at hx&BbS at p%ZMjG>*u^gj at w2NMgQhVuc z(_81L>`yB#BQq59tc)~aUT$xF-3qfBzu`Ue*XDV2Ds4is^CHUvs>^LrF at Cy5E!UpZ zLo7E(_3>B;nnRKMR at p^V^a4UP4lJeB6RUCX{jvfCLd at b>Rbs z!nX0)J))MRA7El at 1*B5%#Jj7HqfH*MUUs8XcL8)!O)NW;Br%?iq+fKnO`}kgWMvl| zz$(G%zYr#MD*!F`NZD at qr$PL*vxk||>x4b{+ at a>_hwOzD{DFAB0TJ|6#{eT}>+r0n_u^0}p#<9|G>@_$u{ztrJ>-UU+9lfh#~ZD7c(t}c7j1CP~@@jgV`;qkV;qj0? zfW8}%Ii&52xrj$e4%~IDk%xq}l{>aIZPh5iZ}A>tP*cZxo_Zm7EY?E-nPruOS!0wp z>97aXmnWVZ3=8K~JF2?EBNt9Mb-h8VXeeDYB7EbAC5v>#iukL#=|(2qXMM{w62M~% z*G-so3I@({u4gs8KQY4Y2mz&D?ziqlEL+GT-fw-1DN z8REfO>PAhUR5Otx#9_N+)0gnn*p%@Sd4v%BbiaUSNFXv3UAtvy3e8!%Ju;%Ubg}UI zvKF0u4O^zssa9TJ{f&PN6CFP(6UXji-=tcR9Q$JW*@2j;l{uDn7YGmK=wLW$@(zLU zSKLSN?mnuC(^#W!lsXOLx`*?K#%IY>J}OEkEouQ2?cSxj9p5g&%cF>oNmAdQh1c|N z)mGi#9 at x$CUVt-c%_7FHwZkv?|8CyLk8{!9KjxJM`_Ik$*K~)np2817G`>apOJxmF z(KieDi#}taVZ4hH>kI!^Amh(mw#ge^V*Qij}yf^ zCJ%LDkhw&I7W2ljc!T)IyUj=7<2znV6wG at Zvv1Qf>1SO{Hup*1HrzO zS>B#jD1Vu6ZfX>MpYQbF27N$`EJ)}6U{Lp8V8Hq>FIWE8tXaF$ekO`=zK_Uy@|sYk zP+x at _BYFx==r_wXu(p^cE*(2Ja&NuBp+Lf+FJwqTU;+Vzp;%qSVa5f^sTSs=tPWc< zQ+3+{exM#f`l!zB#|43}a2^4N!qx4XuJdNs3higow958!6LY78cc=u1>XnubXPc&$ zwo>$$9D~Y==tu<2Ts-DvSPYLP7_ZN!R104SX>OZeDUQy<%Nn^9a$@l(qrZq6D%d1k zQRSKi at t(i0$QJ%n3#KCGi<40ra+W4L6(W*&j#hg;Y_QLSo-&DCJx{=Qsl|p}QF?F) zR4Bwa5lss_rd4S8F++mCJm-FvEf?gbC-|s*`_OTZYHX#RBFm)QSE~1jb z_b4ziW2s0=8;G4A8_tXi(|p`D-jYBKjGB|c)$nz3j4`^@pUbu^+I+|XWjx$o!C4l6ALJm#xP6z$4WKshvn at 02^Q*0=XJc4Ul$?$|pDhMmF)d0WnT zh{+);h73ugstDhcdFIj(CtRxs_oj{1VHR_L zpuIn~{0JPnbg+CW(QFpOLJu+ at D5DXQPLX9SSfp)UuyI+)!b!YJFJ34GtKP?sJDT1J?G0E~m4k)r(Q5&JQe#%f5J`|I}%o=efv#T#+HPZeL(d!)P*#k6HG^i*62M z>f^86_gN~)9s1j%`KYO0Ir%@H1_$|{dm8&+o~EaQCV|Gs2LJ#_FF+Y0OR at MvR)yTZ zh{YhuiXthSCec7s`{DxK+@~(sGA>K5%T5TdhoNdR&>bCjTWms8$mzOI2mRhc-} z=P^%N&t~zrFx=|%g&eFKWsV~g**;@+7^Ph{L&DG?i{qo-(*nk}00~I1JBSthKCFvkz1aaxBdLi4m*5I7 at -Fc zD!DS`tJzdikB%z8RjTY`kGjdiOf6I79Y&)y5(xq23A8!xgal4mRbq+HAWLVzlHBrr zbI*!Xz0>OLt6IN(P6#r}WOz7t{4TE6fX*ui`Aal$z6m)?KL*o3f*ZXBoeHu-c(Ts% z^D!~L#0!fhn%iQu at KiNJY9sTW3|@4`bAikjEa^VCiS5JAvfvZE)935sywsqWwln3S ztoSr+j_V7&ZU;SG2+x_*bza#8RE-2*#&G(>9;wSlexxr=|-^vv;YS~ zksiLxa<)}Mt48ccg%c>tcTBr5CM<&4o*|}FO_CnL89V4pz=5z~-N&cP;csTcv@>zs zkeb!@3V6!=4)HxSwkW0OIf+ at 7X_i&AH;3k`1>lDJiATiDcSHUyiDLm+x$WSRR`C02 zX4SYt5!~Q{m?E9YA_HfId#>aGb}Bqdd^y*(b8%R674>s4z&rYVYAzhqiE^Zf%c3j` zsINC{RX{aI#1}i*;I(@gI-cPL6*f%NaX)-c6uU2C0E#xDS%|ZrAK3rymiaf%m5G1c z^7g-QOOAhKMyh(wi{fZ}U5!Pe>L^KE?FI6a63Td85e0%{n5D$v%;FnPNbvH$iPOnSMS(Nkvl@%ksRY6kU-vhx1(WqXbrrY8`&C at Vq0gQcj2S zUWdeEmvKj%(8_alyC%WG%=7pLyG3X>_xmu)@W$@iSF<~%J|Z)T2(u{|O5fFaJ~Ek9 zLPdrqti8_TQysuN?R0w$&(c8661;F}bo(v`o;E>~6@6b3jl8{M^8JG zdLgJbQqA=~e^*KV1*uA1y%K$O_IS9Y_tAhGa@&=*dEV9MZCCI=#AM^wRXbYYhGH4QUs4c3HZ>r{Zie9V(V>*<$JF@@V#7qMXz$Nw3rXH!?a~0z zIpR6S_)!8B(g?G(m`EA>n$qicKIaO1mF|`w(!FZj{kPaX2QTNEE*I92nV!xrEr<$TK#1RT9Td)wSXdHZEv(!Reh~Iqx?Z5ym}BQwCQ8tk zFHYD;dHs(?%Y^&^bvs?Gd&hH1Z+$EhjCCP)=|sv#*r9hj zbYXz~iMT&M&pEt>L`ND!>n(??V2d$X=iE{?>Y-O!Bd-3k at F(A1lD@&oi48q&Zf^rpNtX6{6r*CP|t%^gQKCK zpidm7hqE%J(>!U8AGSkvr`s6jgIhddb=n>P5NM{05e|-JAjA|nx?KT8EG(t>tgI3X z9=`8!?+WHkdMVy4 at 2@}09Kz_()*hd5bzbAdX-5*x!J%YEbApx4=ffSv0KX5<*$}El zUL~V6Hgm|9N zhRiK$$q8W6F9`FIc~$iy;BJ)C6(uZi$+Bzgyz$s&T_H#W5YBDiu473bU=Q;(rwhllD=J5qnf1+HxM8OnM>51x=S%B>)rlNea`p-IEv+o-LSoukjHEGnX&|?gJO-)lO zyxaVC+{zhoI$?sUc%$ZqS;UU at nD;)u76w)>DN_xvhB~rA(Lojbwi;C)B!&un@=c7m z5FG^(suKU{RqV^^Rb!={C=j5>yniVH*FHzTXn(I1mLYl{j`XIf7ys` z_pt3RO`k?)Sb4v4nOSk1AIvyB+l}wrOQ!ZJcdY)vhZB>)k1XcU>-ECs zC`zDB?vx&XNIe7QmcMq6%&pcOxj?!)>Ujl5`mFj41)eS(GMmzY9i5gH!W5)V>CNWmwBaJ;FWYF9PyWzv=di z`J|xb;>Bf>7ix3L?3mwrJn9yBZ;yl_f9pnS45^ZoF(+xtP at z)dk6J>$U_bq>*MNTW zVHx-bUGx7!kGcQqMb0Yx^I^lTdKWEA2vsztW}?d=v^SUpM`FWFRo>+IopG~_W|3A_ z^DgqCPtiF2ZjU)pGU-Bnwlkqm()}zm6`YemIk&AW&h6JNABU}9{(0X)(g%HTdK`bV zm<{$fKiK~+L}cagWW|W&pp!ixtJXiF+h}zh9nb?Z7_gfS^+^MKyY!g|!aKuh_8=@A z at AXA_?@7>E04eU>dUY$&qKb6n^I?F^DB(!U2qP|ovk)p5zG=gSno;1y`A-bUQ|0|v)2=|c#Be8%eu z7s5JbzLDU|?it2drvU1#w$3h;hq$kKKrmQ ztx7U|T`R_y4}r67ge?%y?6;SAQ&l6&K+TG=U#AkC%QerWpl)(Os-Csm4#%N|Xu95pVI>pc&o4`?VWh{462{?W`u7}tajvLBt zS(UV14 z1eG4nZlj?-yf74{Rn~>By1=>s*a-op1IV(dLKivylKu=iz^(|s3qci#mfn}QdHPr%vb%t z at S*BQBL=O_`G`hxw1XyVZ&~4QIwzV+|0U!$XvPR`|BFC*5lW{Cz*a z7=}~At2))eAU^u?Uf;wQI8EFUa02~JHQ$l)u2l$*bj^0VP9r2Q5Jc?AQkuH}xbK#M zgUccP>pv?DHDgOq9FChRm`wPmrJ7LALyl4HO`kuC?k^hXu=@1;G{ESBv^9|vudY{22FD0SJ?|-efiItUmy!K?rRfm;d6ZxH<-35UAHnwgma*FjBAt+gDj2dgqXylJj!7v{_|FijlXRy7)A#GEMIogpVN0C=J*8B;Dc$wlZ$ zxcZ~Q45MiM8^Cz_^SFG{Or$(HRAKzHhn z{BqWQ&>GNv?D9Cq at ik7q@2d?Zl}o09;#)Q;*gy|MtF#XWPH3%G zpBlDI at zS~(dzp9{y_!S*hW-xL`;;FMB8uw!D1kj&-GV|6$&taA_B`Xx;QjC#H*4^v z+Jrrr&EC|=XxwrVLt4v`POII at C^Yaf84YkjE at Hk7FYRL7c#P|P)q4(Jd%@GS$+vq7 z547oO#GWU~)`o(=uE^@7~-BxC}fRf<3G-cIE%Z7qJ zCZC~4P^|Yt0M#qs3&Vbus>ql$$_kgGlA|=g at jgY zbOc~GMrY*?W5l$2c1EoE8yb}`sT{9oG31MXfDcMP0M?nR&-N$iOdQr#5}P~gl7eJU z=oG%vY%witoM>-0h zQ0%Y#zB~d_#@Mkam=6>qf2%Yn@&pa17_w1Ux;@PYO3x`H4mSKgtbH?IrhVX>&)7Z?rt zf+kI}4e286RIkyukg$vtnu|Bz72|SS8Tw0v!AAc;ImfY`i_8R~o!lSB0#Q&Tr+0xQ z(>}9+j;{w1Q-=`?4JH{Z0sZIJ^oe?Za+UazU+{8x;v=HcAwwhLs7lfRyOkDC!KC7v z7`cf_{5uze?lyp#fQLwWClbc{4x8MtD_SoOUJ|XA2BK+k$23YL|31_^|Ec~P<%$h{ zRst_g;s>fnR=3+&ott5!DV6?2cXCHl^YUH&kDyornj~rbOBfywQcMNj>b(jm%qD`$ zYdvs+HO=dKAjRO>p|rW?ckNC9ZJJ;yY^?0UvpZ%dCc;Z3{5p-f$ohPCq(o04_EmGwz+dik7ox#Sa&mWMUW`Uj0<{sh$^3HMOj zo$g`wy`F5!I_{0Jd8W8fR&ckMsROj9(ex|E0uKsZYbC?(pUvrXNR zZP#hnn={)WKHFiqDo|Qk>?HX#_y1cpD5l;ob at B(AivI>0_Wv18`A2(hkwI^bq4@`> zUy-t-PH~FpKcR_7^U2 at sZ?np<4U at H)x}tk2@|hDgx$h_3iDTKKmMbzNT$!HP=o68nQ9_7fo2{9wh}s!04cdY_SoWZJ^5tp0kSq=5!vid1o|d#dj6 zf=1XB3}DPS;Z1vlWA$&F-FgFCdPyHc<+*$D;}$U|5I+kQO2bIdFSE=xDm}lf%~FOjKzy- at H3eG)!mWqXAG(?BNMS zwalv4t at Wzw%~&`T8b4gw)#};#*muRkuq(}*s|(g3WSE*$C8ZvxW8ve*hRoOn=!Ysb zO%3k=>^3vzvY6aPD*&T5O^q1avxkAmu at zOcd}Cl_v$^F1w1`T#Dry8bB)>I-GE_ at a zCUGfj2ZYgdC0u9x&rEE!JQaGms~)1Zv=&~GmJ12iM$``W9H9&*fKkkuH9zBtqalmQ zk+Rm})ESAG{S4dK$yfFxk>jq%4Z#@khhV$vOHc%Y-;K>>+B(!DxuuEj at v1o}k5bJ>(=0JTm^VqWKrEAf-|sIZ3VA*5i~N8-Qk8DgCwO!UQbH6s8vhdbb`^@~gC z6PRPfrk7=dbMq3lFfx{?7jtP&z}HY2)xRHvi^y+A*Q}8_lJOf9Mni78LNABU&nkl9 zp!&iZRq#IlzOPE2ua!mUzmf74*b4b}n>8=&M=O>(o|;f2;|C`5aG8IB3A(;xK!qWg ztnSJA1m at Tqq5XkGNrmBLGbfJUccXg|>uZtop|vvlizIFfq6Xz1K})=q{2BeQPEiKv zF99(q1O7~T-DmMV1~y}iko!7P=b+#HB1%$`!XQV&aglW8RQN|bk`R#omWDD(w3TD(4++g=gH)37v}6)Mf8bP^x1jnDT?o&hwlx#U=%-s=OM at S#X^q%9o+N2mha_} zisUu6v!^3 at P>lz=Lr(-|8Gmrb^Pr^ z68niqPlx<8yCv-zRCt)SGk_+Y at cUx#0ey#eI9k9*v3dOC+)BYv#@qNJnTR;8!Fe* ztKmuqn|C?OQiX@*PQq_KZ^8`6r0ygvaQ0WbSd-xs zHNn&CyYMBVNhM{pCTBF3c|s~U^9H5V={Wx~4Cw~3ZvZ#9MSO}jKDTTv> z&D-a{r7%--6iJVN0#YFi2nhH8AL;*xa}^v7EI!P3hJj^FoFvQYQsgWMQDfswQRo^G z6!PITRqIM$y&Xu-&`<`MvXA7CAU`>aOq{F?d4WfrPsR0PhI%owSfP;~hgs(<&lx`N z$2xz%Pq03eTnMJXIH1!PLRwAuzNqLRs4tGZ$w_fRnuA_QLZ*lN4M7T^V at 9Oma<=26 zZUKe4V_RjgZb4Y1CeLFuW3*4vf&SZQa{WxX-nF0kl$otcQoIQ&QovpOBHJ^!#lqjR zzr1KPs?|^rwQF>dVb0WTDA-dXsn#Owh8?))W8bJfQLC;=?iF9Muu&^70$zYVNbD(0@uL;)ygt?dG z_0I;`(Y^27SS)%z`w{n=Fa5T-yg!?CDKAlzkL=crRo*NYwJZ~A at mpbMBM>gnIjz)$ zS%+q3vrv3X!En!@y!P$T4X>4D9NI9P)>>5k4%r-E04qzvgRS?4n^Cwc73?*I9;T9y z(d`VH$vZS#gSC;=y2M?GhB?=#u} zpazxg!Dh<8?r&(Gq=$b#iTAhBxS*+`nR&oW(u7P!Wb5bvb-+}Ik@&t(xj1Ituj$$4 zp9`1DTdi^$1QskZLTn=7(?04uP6TdQcI0SYvQFg$qw0nJ)?Za`@q0>W^AZsE?iCo4 zVobrJXkHvi)kQD5sn>2pJcUFzw>n=1+gv`SuUdp`m);(NdFl3IqR0UUPR>{+jvVN_ z^U8fj12{!4>H1V(E)eD?{O+OYI2Ymp6FI6LP-ahlxpVl^AZWXL9 znr%14$hl>~J;7a~lzt>MyW*S9Me0SH9CC?4kq_}^-=09eKt+6f{7p^D zbqxKku|PniR6sze|1&lD*R%54o`SkdO9B>KeYn6tBvUC+sd%~pK!_kp42*aaazy-4 zfMR0#|Dx=jgEV>CZPD(YcE4 at gw)M8BZClf}ZBE;^ZF}0bHEr9*`F;27eQxaUMx4EG zL`79pRzyYqu~t4$WoVbb^ZjbmU~7NN>H0O>X@>hb%WIqTyYtu=#C#Cd_GI9% z$84nU)57^M|Ao4uvO_O?dmAMohJpX5&LH&jkrC4G)j#>(fc-jL#^EryLYm=Ch2YLL z`K-?ir(NGCV6U&3j{9uLwc0J8ZCZ3{Tlh?|Eim}nW&iz#h2!v$MsGLt)t%hRSAg`z zKSI6z*0PI&uyzQsA?1AYh4_Q%{WUCt&_#s)%5Z9hb&yc`cHg#aM851rl9O$xbo0dm zIN4!mFM=?T69me+6_#r#kn7TSyjC_-{^G%z6~oEg&sgT(2={07W^1osTla;WlWm`z z0od>l#%-OVyU-d1Ae(gA*_7NJf?L5%V zRk7#5>AaH`;nuke6!VV7?O1c#49R8y$`5({t%JK(zV+qQ@$Xdi?uGAMyB9*IL^5r% zitiINuVXI}{iwGG?_0ouwTOQd@?)zIMZRmbSl1I{V#E7MwYl0;-FV!;JRQBU;%fUh zrmm@)5xB^Ng at 6dz4C#pv`}+hLVChpIdM_-p`_(JhyN$bua$hSpdJYW;{it{UDY6=O zcyrVe`SJb%FXU%lXJ~aT`m at CoUY1+?_fn6Gh?VsDx{D1iJhb!!@vR2Ys)3-Q(L&a* zr_CclDkSZoyv0RVVy>0n?=WvsErJpoD1>KAB-sEGVF&HD8N!P at aW3Pzlc-CWI2_Dk zWVSwjsV>;2{M}UvNA?U$%f=OZFQ;P~T*Zc*iuT4t+PthF%iP6S1u>`fidJTFaNK4% z4sr)v05rX;bh9Upr2|Al+mtjrOO{5>n#B!#Q5^MQ-04|oD~0xMNq#i?0{HP(9=v!H zzn{#xcpF`^R0->|^Afw47Z42&V4)je?%%NzD!iK}fC2rxz&bziB%#+LjunSX;#}9( zPNy20+s7~i1N5|e(>A<2>KSiisg!{uq>>RY;`IkWyqZ3DtfKO7K%S+Ljf7EGBqb`* zV(~8v0qtf at -i;6B?>MnS8Ow?tBSf|r6Qh9?cc#&%DH7M8xUkm?%a9gOW%8uZcG|VI zSh9U8n3`cc%8kRwW z7cN6GtYf;r%9iWs3m&1;@NX^dLQ%gHYDx+EU31FAGR{Lxu17icjCt6h2?kur+jSfq?@C at 8DX*{XB;?N<=xCdqO9C#+6@|Qq!{_u!A)tu z)FmvXOUdXfx^D&R^dlumS)6MZI at L^x?K*#@h1b8971)jtA1&Ck zJakow&?<|ImbSMAxD9YgtZ8PZ@&mFBr9PhD3olu~)mMKj5_s1D1(z4st8Od at W46Z|~+ivTZ>*m~odHTQU(B8h#|bG-*Ai zpv`=RfiqXdOEN>~w9aec5G#?!UYnpC`@WwwGenwGm52H+^fO+={}LQJ)0*5eTa24G z!R9Q1J<)U{I6#ukDD6q6+D}`l28_DU*VeVAJBzo3xJ-Bw3Bi=!cDYMwB9j*hdRT+M z+pNPy`RP~ZK5;hfgc$!r%#!E=Fz{rW>2yl(${J%mlLa%oL_^d&hCINWWQ6Sg{(u zLiGS$=xb1A!%TV_WtAd1cJmMI?QswI;x|iuAj&TJJFi=Zu=U+9WIrk%q!<8k zRwDXlin|0}?wZ|2PJo0vm4$u{s8Fo^U6OJM&yMY!Q(^gVqBngd>e$rM6g|h;gm5vv zg^J|>v#wk|z_MN?`B&v9F<`DUbU?A*uyU?DVArsvwTQ-Ro(yFZF7oZk+{ddmScKRn zuENE&<+RGe1XHZ?($EA;Nx`U9JhUK=R|weRVxY at Ka29I|oGpcq9MVl^e=qiE+Pnv@|Vr>}4?uC%4-T- at n%@+*KC582ES z_c9i$K~Bu^ zSONriGgk52Jb+`di~ejY1?)z9){z){NX$`ddHjcdX zZ*WMc9l!ZQ`C3f;^Qva<4-;awz_HGGT at G#4`0VwIyZpt)Q~nUifKS1vmE#sxSrMC8 zV~-#$ajyRBTQ}?65QW9Q$9ks$?=_}c(D%_^q{Ww3RL*kF#A%VmS?zykHhaIsT^pC z4R!=*AcBa&L>B=+A8Tss?Hp}-=2|m#I%lB&em}36i?%3VN1K8`bWbe^%zjzUW2*K^{4JPF;UWokB zGi5JOh&o`T1n#hUO1GMbU&!BsT2CgUHX%@7px+NWPA|s*@vQNiPjZpH1+3e9nx37$ zKYNh`?mxCvZpjgQqH5i5R6lSVi~pE$tw?dKSP^7J-XmccD{RFXk&QQ3;Iy253u>rp zv!lh%qgbg5(c at G{T;BdZ5wDz|NT|3G?1y#Nuc9e{fBiws5{E-mWl8-N1~clnN)|pp z6?Dio5d^m at M^iDRQ*Vz>`@7<;tu?(ocfe1HWRy0#La>QO6V$XQVj-PIPh2Al#$kV6 z1_pPn>HBU6_r z at 0&$uaTsu#G5W at uCqmU=tE<9Q${$;>-XuW8&vFx%7>@N`6p7K>!d1`hq44}t_!jT4 zG{A6}P5dP<8BOm}Gu(svOWnlve&GgXza{+z%U^%(Tt84%)}>?kY-V?tXeswzDI3et zHkep^K|qUV2r`ndLnk9cJv^EHoYL<$@k6G}7xuEa7&8~KxRBFI-PcaVk`o^N^oe-}G`yZBez3BXLskl=U`*ckqG5zu;8pSC^K*<9Vd6KY?!~-Q zggkDPdnDbIVoRN(?wzQzEZGqiTWcJ0v10$M0&qC*EUDdRcNf`Ju$yAz2j;@hDuzS; zObMw~#XW?QsI~Gdhiqkb zpQ1brXORtw)7~1o_T*;9Kl1?Q^1to4=MC@&%gW*l at rtSBTe7N>u0o^_!i1_62x&tV zD1y*8-wc7=Rf6%~h-!AF?YFtCSRVME{hAfOD4 at 1TcxNa)1y$Ox`OpTm&5^KQ1dx0vl+ zy(o!}ncBJ#g{SKsMlXpMX)?uk at 6m!1efNW12=liPS;Os=0=ZQ{z)wBO%MX$GTzak# zy|=}kn0j!7f9XUq8d0{NnAfsSUKDsdrJ0)2r_S9wGF0<_quUo_efrjnAoi*X4;xxK zF#)9-pKa}l at j^*F$3#wgz-~vwF==C at u1v`Adnv=el;aR{Dbf)a61GR at l1>|;xznk2 z;8$ihO~Y%G!}ukrYJw2wCILeu5C-4w#~g%YhqY)OiZj`PlwP88ZZ1 z7Q+3rcP?+?vTLUYV^xpr*z_<*F|cEufP33fx87Y;##ujtbAD^eA>#m7FO zOnxawQvj#Fq%=RFG(Sl at d88wK?bio;}2T zM}JU`Fi$VZ`#)F=eM4ruq|)@I171_29=sz(XIc~1PSXerDB)nOPzH6_|Yvq-4``l*qRy0q^#$&P>JvSRzyLv&hU%>G`W z3pz!bDg2~6<3?cJ at D}A2&*$1LqI97&X1qsFjS{wK*dGl)_7*)xy`)OQXRSp`L006Z zKd?@4K%g6hEgO;If;+~>b8ocYLE%F0fz;>ZzA;VwK}h=G)|<`anI)RFTA@=cVj&G3 zzb`#Ht4FC9F#%H_+l%tk^IUCtQq?XL5<8bHTarb{J4ATyz8<`~v&J36s+v|ygv2d& z;39{I1c=~75ZAzo?AfcOFb5}kQpm0c=2QooVNYE(Al4R_gTqh==E^;ItKyDWlVsJM z<+|HRwbOv!BV{gD41b6VY?{i~eaIJr;e`WpO8oe1t#{#% zcfscF*fSW1_^cRJ9GDQtFQ}-tBAj3;ti(rF-Xp5QQ)4&a=FX at DESaK$-6l2O{w*HN zT8AGc+caAVMUgwJY*D;INwNT3-=-$|Y at csPEXXB#o_Bnnb9_$3Ma0 at +3?@`~0sV4? zaZ^S=>Mu+Y94zytDyJx7@%xG82M|DB=cQ>{k+~rVjTls7h<`svM`&2WOsKKkH1gPX zN?vAiX69l7YsU(~#tPEJ`t895R=Ojk5px}?>OM*&-KY~`TED_$fc}v*xnyX+Zko8j z&#{I_ at H-c#*bX^dlUV(YYtn2?BYBC0U+S!TD~<-ef5u{)r9`UgFg4*2HK_q8*O_jl zgyMRKrJ{ZL$*+v^M0V+WM0O$h5}ozh8vI55lAZQS^h%ppnNfI*t2OOYmnVMf`oQIb zZ&Y_uEz0YOwxvz*WTkk&y4etymt at Xe+}w&BHcBd zIFQ~eHxg)vRN&)wdFplFiu^-t at Q2($KA!z!y6%o2W}33MzSZn>>Li#SW`WY+Oa*lw z=6e+MTN0!v)x80!XA`U~=d%oBk+1#nY1D<#J3a1?@TfldfnVX}(KSoa{0GXXW4Ld- z;LKJ|A!o=$d{J)P18Rb=@Vq=yH^W at +*lJGTALwun7$c+G%Ou4zX3)c at Bf+5V!-4yo zz_Bfj3H{>k?$M=3C0M(1ldZjG_edki1Fi^}t-G#bV?%mIX at Xj$SoK}IKyluwpZ=PN)%zpuP$goHCW)X;$D%D(Iit8eOI%{T2hiR at gM#)?6YDkVz8_AT`I>Rd2cD z1EWDNA0GL(BF6XY2KN#XVE1D5(oRoU(|n2#^r>GOTUShOp29Fl6a3=q?0Pf7Bozk3 z5{klOMMPp(-0)JgkagssYd~7}rGg-(cDBKU!biIq*&p!}e8!^Q1 at QX(hDzp08 at hmu z4t97!6qWsUEOir!7k7iEUghQ2T5Hd7#?J!h!=8aQJPlIqn$}v8?Kk1w7Oo_AH4Bw! zqYg^rA637`9`W^wvo{e!VhR<`UT7xWyy4|s at q$8Pcn at fj=V`pt%toxGrK?tc1+^ro z6egU-6|tz&gstsjlz%nK(Ox<9`!MeI#M*Dmw-FL;q6WX`yFs`9Ko8hx+LA4-o9x(% zO<#UTY2Q-2AOELkQ5R+Ah8K>(9=ePXg)Gyy(w|gxr3VQF6QlcQReh%xqb at +But}2y zzx17%t*ax;v0`f)%%?OGr}RM;3Z~PC!i2AepT;Ex5het$u#}kXP#tB%^N-H$8r!f4 zUEMK181qINm^B>09Y=OlXx~<#KLr50`N9RYNGDGDNk$x35$GsRA-z?~x+$yZ$0}0F21PaMuqsp-P8tI^o$s`(i zlfk0nk_v at M{_ at nxkxZE!lVFO<%hCa7A%Y%Baa-i5K#Djy0h&`p$+x0#G?YnfjU)!h zoN1#S8fkz^#aKRuzqY1%Q~(z%@{f8fd6p5utZ?#%S{0I=WXh#5ortF1BZ~vp&|c#Y(IY_93%*X>u>_NIm!NRu0YU+aI)tbn6Do zLNyHprc}6jGHcNHNf>2H(-c#7DeDY{XeKSQu9=IjxT+&7_5dKmm7d0E8Oy5!1nW!f2vdQ^$NO@`ICM{=9_*E{20d?-G~(%Ug0k z3tSpb_e0~?Du$y&(J;_4-qeVu957#mIVW{RjtP)@y@&BY&zU@=j=RHze$~vp`WQoJ zh~rQr!qZLtvp(I8IU3likJd#VKJ;`FX`_5c10{=lMeaDzoYF;(A~l9a&iJk)w7N9} zCUJV;6hTUtSf2z?n|Y_FKFx4{Igh?-%YV3PiX+gxxr55i5xY4A5U!khd;dQ z`pe*kFNlAneZBv!B(h89!{mind^-9+6u~%*8jr|)MX=)UF-4x%aGoK~%kvH(8Jez$H{n{7I(?Xd_#nc<0 at 2iNh)3o zK!V&;f~MI433 at 5oa8h?2K at Bp)eu)Z?wh&x at l9_gj%9w!`M}|N$h_>}BwKigCw(ggc zjj;e_?b{<18ky8|J&YQd%E~soOMcZne=)DJAZUBhbfb?LW)=fo8Ngzln9;bc@;BQT zzAkKv!;F{Qd0LxEsD at QPelmvFtOwh&m$zciAQ3bu(m8K&Wlb!*cMb_;o8f at Z z1pOYPjSg%~QRIHaxr(Hbk_V#BNEs^NM`@O-F7Qe$@J2(1SUF^`<&~Lq8 at C0xTMwq7 z0jG_C9aX^oK_f1>!oNR()5B_gq%`AWj at RJMjdf2%&aL&VJGR3Yy36Dr)by`27TA8E zA=8va`bt+JnYVb;RhuY=k3Ae~oWuc5PDI)lcJH25=TA`gHiWhi6aUr~D6c|5J&zm-7+^`>8r6X3LybZ}dCZx{A*V+7mhfY> zTcA3Sckmu~+a(BeJD>S?1(WyboFf1z2uM5Vf9GNKpS3{$W$V>MVMA&_5Q%T0D7?B= z>-`9k46);-qFA9wDnC!-)(1DG&ZSX%UiPf at bqDH2ac>b$_?~GpYapF9HFl=e4J4H- zdM?rdrBEJPU8)-iQj$k|Tnm=ehT#fRI{DQ~*sR8h)<=~_m{&5FVlqUn+f!JjqJL=; zO7cwx3z1S?_P1irHQ at Mdo)nLyJ#vX|I&uF_R( z`IE~W;S)}~aOhwR@!nblVPDMkC=xOH!Ki0fd#JzFcd2V5eQx}N$j4#HBfbA78|)>D zOlAxQ0s;^5-xcU7+c`R$7|R;k{~u|vXcZgz1qC$UE3ESl^z>eep1iOh&jrrP-jbnY zp$5OO%o|JyKU`OIrR%LyYe=sIZifa_ccAvo{6fON2i$GTMT!iIG_Tude5O67xm(Qy zeEmKl^CC)V&^Bd>!-a7YsY>z-igxrOcHUvt&`)4#0O>z$kGI2jt>m5Qg5CoS%Wd0q z|2pd~VDO~tuFP$8F+L!d4##P<;!SKDXfQ;TVrm0!Wm`r1O3zbBU7`NA++=jwpt2~t z!P~aBnT`2C4}bDi&VWE(7VksbEgXIJ5Rpku+1qGi^=#Sm={vi+*XGtLMI?5uH2!X~ z1g% zQswYgR9iV8A4fk at _qXRTjkkZ>i5Ip4hhQf^6m1 at dt;)hZcm$`Rt$YV&z&bb&*xg^} zSpQzc`1mbcUbs(VGOAAoME_WB at Y%JAB(`z=?k+>N^47N+k`M?D56topruIfLNTWq7 ztZ_V3NmR&}l${4DGf0oJrki>M|74Rv_6)CLA3On7D!!wvo5vjFpJfQO at T3g;@$r-5 zCe9T$l^Kd#Y0>T17<4t0aLEI5m3J^qDCs{V7obUQ?*n%4Ag0|A&thtyCR-oZLgIi& zlQR&A!7_7*iDddtx2Pn2c%AkUHE3wuFhX)B at pFitZr%e3 at Whqw^Mvxy+SeF{H66m|3}^pq7o27YMXkB9p0LAq6zs7G4N}_{=MV0 zqlDg><-MlR?N#B#NG^!D*@8Re&rqF8x=gJr7RrWgY~XQ53h9&hXU)xemldj#c?V=G z?`GoxKRD`F0J||r(9^g>aI4Mzt^yKDv1wZiJwV^CJ%`cL%bSU=RyjhFA8U1_>5A(g zsOl7ZjK;R{-~9`!+`YI-a4I4i@=C0UUMip%|O9npU z#WzDFKAAO-6amy6ZZe;;&vCZsJN1YSnyE8bTB&{EpQ|5s1T2>_6ZjsXtIY at aPRA~~ z at iD;{T%nf;^dp=9^l?MEuEY>OmfbjRDbG-302R2TFo+K^gJntret7B* zT3(Q7JFd_pNpkKQH{$(O z>dcDmogO#{$X_ at R5a9n5sbUt^|AZ|Q`$X!J&)&=VpAo0Mc(P((B#LItq7^mkC!1)CUfYh3VT8uCa+)T=! z#8Pi2CpDvQgi|BNtGmtQI6Yl;SAKk+Jqv*93?yQqw6O*wSJAZL7H)eDKpV+M@#74S zXb=ulj)rUaV&S$iQV at i#$U@|XyFehXp~TM&8EN;W0_Lg|*|X3?51oDWzvWhNVhk-I zCR|^xLiPTc>n;bV)mKG~vEvYEs8*M)w6|E?>lPOA0$IDKnCdJq9Yfu>%I at BygGgFi z9||Pne{Rv79<|uw?)^nX;PMj7-kr=aenDhZ@@}%Uk`%?flGeZPad`Ty`}LX=8M8 zqB%ytVETClvjA|Dd&tPPGa}8Qb}KeU^%Q|9R9eaom3 at lTl@{#({*y(OobP$wB)+h~ zhhWpX5~;&AZ%( z4`)B4Yz>+*lYQU5KZtK5Y-s+gPT8PTmS~F at 2@$$Wq~1zt#|+SRs)KZN-zW=Uww{~} zC!1nNhTG*1^%FL}N>3{d!x8>U_0yC32^^f zWVRf&N6z-qb^OkR%}XJ(6fPLtZRuKoKk#BqbPJIC3W&$wwOf7^-;(bZ{4kFJtjN!6 z6HC*D;~q>p&1Gc9IY}$MQ$(MP-!=OY*^$^4DrF`(@oY+eI!y<3inFkckddNFh^-R(_-|ZY|5kx5!0UI0_m1E!tJp5_ zn=CC5ai;bTKnHyNn~Z+T9oV`ABnXHW#((Gh@&Arn|52c%VdI3Vissv5w?VgYGq0qg z2Ts={3zx4-lb~@*yV#OHk5U%aA$4a*b1Y^|RZ!egHj!wP1-J_KQo0ki zMw4+FDo>qywx^s->$+67hI&65!;%5&1({RJG=hZ^p`e;d7~TsKGZN$F7BtdCwrXdc zxki9*ht*kNLqTw3OUbbbDL*7;QWOrs3=WJoYqUgbZ3YOlMY=`LOtlGFMj|&Z*po^y z^6b^$=d-)@Ew|UT*lAg at qdlK^q4|qyV?Iy+ at aduV_BOT(25n1WVi7Q~My+v$iz-pU zZBfct9*vG)Mg5eR3~~CTxBP#`d~?Ty^f8aqmxUKrE at P<8Fk^GZaavN;_O--FIpMKG zEodjDLfctp=>KRctsjIAr5S2xWFR|4o32fqZLTL+!f@%kG*yKV!ga;`5-}+>3(^f+ zR&Ue=9kE;@zLpaM2G~FE=DNuOXovlq%E%K{T%y25uTNRTQ*w=K|1PP-DX!23u$@@W zW6YXcl#^$o)7AF5+%=jpTm at ICldmh+JvD!0FCN&8sAMJ+*!3RuuL z2=Zx+8V<@Z(x&{%++t!(D?ycNv$NGok-EIm&9leaXEQA at O8!tRIGh<}Z(q^oGd1U~ zo`*Q1Cf#U{rZpVO28=XxOjodMXeH=-B%aZP4_kKXnx2#_YADiZ6BSj(PwJLCC+exF z>!OqBuhC^^k2h2bTA96C?=hTKm?s|}8~hw}k%G$U0t=cy2igmfDB45-uYpYP1a9?rd=Cu=*<* zCykb+rdo>Z_i`1fzT1OgX4g)u)@zR*N((vGis+DvKB}_rH at o)TmiZ_3L$0yO?vl!) zfH2R0u~gH}^T0QtoKrR~h_}Sn5`x{xh(R5j=>}P<_z=0&bu_YJ} zO;VWQlG^Baz<9DTnZCHO^#Cc!Rzf{o?8J$v#;`IM-JT8h^^Pv`^_V*$;jFrn>eV?a zi0PdOwi&Zpwb~#5fOlSe?BkmRe>K7p797GccL>U#-gNt at -ZcBHn?wR?KSbfZ9RP~) zHTBPEx9z_(anTmHtL-AL_V2*D?B=7;d>C=$C`Dtgv}#GU7s6hyeCeZ5OX|xGuSmJ; zizpa|Wir_*C%rACTvFv=R at Gl)!s{3x3!ndP#NFjcDK!On4&{-wt3YI1jvJzPD-tDs z(+;)NIHETVp~9bt(60A>K`4wUAup~iXs3xuk+X%`3cUmnoZVo3a@>xItRkeC>VWXp zB~~hb6$H?ZNOr_X{`RyjyrSS+!Zgp_U%!k2cQr!%ZP%{{6gtPxY4*8V_tiQ-u+ztBW|SioC+07)Yc}7lY#)jOd5af~pObFHu!R(A zftG%X-1Ap4>JX%MVRW)(&Ng#;Gk|N`32tg3e`^C8P2^j$?+%midn(_J*Ar`oJ0E_; zArL9>r)^-)8CQ1K;(g6x5iL3?_3u5&$=S95HNCv=QkFFG3?~x{si-4J{S0A{=)mB- zx^}?Sg6bSlHeNyMK8kRvkzuORnd{<(mwRfqHtvrwlQSYqcdK_0y&KWYZ}U at vz(GHw zoc6)R;DJH!JfeOc-R0~oE5l%y4xP1iU^O>DpU#A;o;M~1YrtwS&Ze2~fs_Nea%v%K zL4I}qT*Mp;)Uc^H`jRU)mD}7aMgfHWBJ`mxUb6d4YN}JogOdhL67GXKUOK8jIBjf~ zalXuv*19`hxD#F5;t)iMYZa{*ZEKJ%nxu7BhSvMz-_|F at -C~88KtVtP|H-9A|F7{# z%+Arx(9zh!)=bvL+S$U%#F^|rjig1bO>9hTos~_T|0AJR{*RM|ww;$+`FVl<{-eL7 zn5%&|DuL9&6l6nC8#nw-i9Dum!xz)PKGZYJWxQ{oUShrd?cJ)CsEGeEAwC-&Z8^00}|^e`S=nwe5#3u5G#?vL!k$p^sP2iY=9)rA%$p7OypT+1847tPc9TYP1y*tIn zxELy3%d5KpSd;pY(JwBas^b?zubLxlI^k__IXvNO=P?ahwuJsjR~6loiQ znWOyqS<4<<8m`y7hh!1{prXVf@Ll0nCI>_7J8p z{U^?lWJgg_LsLitBelZvGMx!E#0mqRoPZO80LT}}@eL`}b+?lXdq%u9^>4%ur1~iMLO}A(|WEM8!=e zHHeN-Yl)?FkdKtanqYfydJR+8qW)N5U{Il7slvJ{3d|QXRA*cU&pDBpU%cBqU<;4L z1WZt!F~GEWS$jhv^TYB;N%tbRazHsmxrcc%H6KZ0Fm zl=@$1v4!t>5_70${8+e at Bd`MktvtWj~NhP(FP zw7Vdl_L8gVE{rpHm?BI|2F;b&eYwlN zc$Iu$Fnq4+IMZipGSdjK7o&=lxz|#!ckXz82mgugU}1{Cu_QY!5;wJ$%GUu;C!UE_ zG2NEHXVS(qCo9>WlAmfZ=@Unq?Xr at 8tC#y~)#z+pGxjjmR)TPCv1#M(E8j{V8SI>1 z2piK9n`1gUhI0pi`@m{sYjmo$^BitKyCA$T=Q)QV`*Al#jeM4D@>?3)vPZSgej%hh z3i^XL!zk<#Qp;?Jeq({Ful#A{bg|{qjv-Ckpbf%uJ?MeB&L57nPE+52VT>tN`H{)8 z>%K>jXVy7C1(}U{v&;0Qiiwh;>8GcH9uIf(1zo#|)CAf9JHYq4OB2P{>W6dC9~}8n zvQxRKY`~0st17-X?#`cE#Hz#~DNKt&mgG?8 zD60qm7ynQ%ru<#KtVMePEB-)i_{KEFTV;5&8~@N)L%jhoZSCHIh+K;oZanlqvo|<; zD|G=buFg7r8l9;M1B~@Gd+Ip8(c9+kKkjLKD|g*qx*=58=m(D6=-XcoNkSUDBhS9P%=p526hHLWd_3ScQFY2a8Apo1xI6$RYb_# zn$5NC-DQZlaa!IB6_~dQ~~s^{Cez1dLN zDNzOjnwj}u4e|2T?m2d-V&*tEn4Iv!#5DB^(oxw~LJ*Z=m6DLYp{JbZIMcU&s+;1* zGmH~N6D{Bwk8V&1YFvwe*S_o|5a2yhzs}iGe8D838S=Kh?ArV!C4Ozx`4Y0rO{#@? zt>O%)PDo9rV+%OA?2xbEkmVb17jC{6y0~I`3c@$A`c+awPVSn2h`n0~F0w8rlV7wE z*0|%OLUK?R9CvEr5OHLxJ*GC$Fyl((6?0Su3A1(_a{rs#eT7y&#mPc!;r at deR|wnt4|z-Vz at b+6#vVytGN$p at zxn7s1PVBq-4v6elIOD8exZ z3eQg`Fp_2sH{6)mWq6l$ulN6snfcwFAZ|DMyBo|&GD`>HjWt4?TGRu>J?AK`SFu6R z61N-nh&u6sx-CHH?17d`JeLoaW9wa>F9=@I7pz9npFdm(7_xE0R@{5eA6OV at 5V)*n zFNaiBi=S#mSjsN2M8z+JJT$(9^n4-Osz&It3mGd5vHgR4_Wuox%{jyc&8@};Fru}R4ISU zNCQUva$>iGE9lw~o@&Nl)CrO$)Mw07G3A++h&)Z6U(uZv#s?ZMt9o`1>N)E#a> zXvgoBrIaQ>HN9(5;YfuXf<2Bq2n_=QLfUwaOA%|WUm|Ycj}HtR1NR{L?>3pdTLrLa zX^vY#FdJhdWzQ&Z0$uGkJ_Wnv99IHeu)SX(dno9AHAsW_pf<_fHbQI>3=?F`*NBBd zLTgak!HRX at gRV2u=;hIWic0&*b;p`i=W)>;6>S(kr}M-qc#^mLGI9n}MHsDVcKSw^ z!d-!VL)G8ggYj2-4?2CSU)>b#0+QPU218|V*M;8zw}mYsn$S`szJK4ATyp9#YlQ#- zaYY0HVf`Ow8UK6T+Yl z2VgRF4ZWBqp%5TaZC5|cIaYby6S*r8B~bE^R{awFlAzIlo{VX{U`VA=hVb$1koWVM zc4O%F`+k2X1bMqv1cSPf1DkT^3=e7}4ek8ZMj84%Xs-`I3?9dazov}$j~~Qq_+_FO zRBk9VP at teC)!#3|>`erzZ4R7`Ti7wTM_)wLiaFF(L%Kf8QO!f>ye|p-i<)92hvDR8 z>N}j)*gns;YYOkRJgU9NtD(|OUYSS48t>wiF1n)IGzBQ-UdgYsVLdky`};vkDqzPQ zxnR4+dR!`NCn)5^y}o~lvX_1-1V0 at G(4p9h at mS!%gpY-W>gb>(z at Zf@Ini{b at U$3c zYCgfzW0tQ at InyHV0{Dkf3qP*~DdaD#~C1bEeRwU at 2M%=uOs?6P1WpQ6sX+T7( zx(_+%%pk>)?fgs*WYeQEuF1$D20{y(`h;m4bC}I{uvC%G`!9`poQ9Qo3t!OG3z!^j zqR+PskofBdzLR`KK~)0hRZZGMQ;FZ4J4GzAIDP+#p69n2OYc6?Tf&B;6vyvI)Gwo{=_9`U2twxG3B$)8s(wbwV*oF=p)6i z?4KUtl38hel!23=!iU zmc7Grg{qCWG$gwUs)}aVAA+y^at~oO1(<>PviZvw#CslM1 at Bc&E zd$osyTF=v>70%ZJe?d^g{O89-XA<*xQSX(eh;9|wM<}@6(-N3HGj9msd1L%(eW1H1 zuFQ8 at ZpE>rXFk2$hGzf;zAiN!6*FT#eT&`v7WQESrF&`xu6xcw&6Cu$zc#JwHbl*< zYzfoyQE{Sm4{v39rN~*Fy!hEt!PE7J)J%#Z4r(`r#HD;#wNlGnf9TkQzWK!~DojUi z)GkbdMPD$%$ii$`FnF%fFSBA|>Th>*30ejS>!x3V4T>W?JmEq)eug?$23dbN$)ek$ zR;WT0zrn>^N^BqA$VMl#Ws1FWjE-k!7bz9?OU)+&qIH|S|{!p-Z1)?Uiqu%7PDJ(nKQ1uTG+{NjMBnIZ% zCna{nGL)B#RLsaE(7vy(ZTxk`Ev8z17iI({U*=gv*ctiAN)P3f}~ z=`-v1nC^b|DsL-XYv;VhaNqNZycvxu;bxF=(jdPH_r%`7l)D_vFjNH%BXhXRUJQ;=&X)U z5bu`gGw7TZ_uU4|_W`z2965^iIBp34YaCD?T4qK60Rr;+-7jWMz3wQ_A0^Ldtk zf%3i;LRH)gx?S at -ARlCHYz|~&elR?mOux>$&%U2}+ITu<1Ys~(7KTK{cHRpNk<^hX zRL5t~Y|>H7p|#MF-uJ{&w%BBf^P~%8VwvUq)0e|MV$^U%r^eBSJ7;1lx=0p at 1Iihv zkxeSkvIFa5UX2fIFJa~*Mg+ef2SSH15++^YFkRuEWIUQ+F=HpEuk28>`9boOgrLnu z1?bq?Epvq2nb5GGtB0#Rcg1<_QbmmPWF;AfP7 zCb8tZm$OYCN;fTYxoqXq9&UuEp)`!=CK?A{5JjaV$-zHHDC(;+vm0! z_M~@tY2UcRQZpuE;!G$ieY;OOfB at AQT3=H8SH65Pv(wio+PY}cv=+lc+UQIUQ~L=q zL{FQjovi2$suG8h-a%h+*^Xv2yB&Mpqs|-N^7HxxnE@|s6^+sCV*k#bs)!PWmd@$F zlyJU92h2?KM^mj!#p)wd9$nKWDiQ2bhf?IlCu84ivC0pRW(NKJpk(HrY%*^*2=mAP zBzx0rGt2FWBlgh0Pd964exQNQ?@(QijCzXlAD%LL2P$Iy4c5fk5Z6xBYRIcji)uiFM=f>B57jEW!l;NSF%gLSa0TMv=eJ2^8TmLhu+bVp*ozD)M2{ehG`A zFCsM6A1HV@!o^ciZ5TT{=v2d&4uD6+Ce4?IAMC5%f>P|ILVwYAuG3_ at vW>bMT=s}M z|Jx^-y+Y)v?f|xI_g{(Tw2cz+FMk~`$p0D9RNUj{Xw1Qo!s6 zaqX2_D)uUUXb-u52(tPd#EridO#(7BfsB75TTvQJ>GA$m&M;PErJOQN~1j_^e0Ow=Z^AQ7UdEg zLn#3A5WQniy9fzz^x}^&aWY^$BUZT{SJ%GtvQ|!M`-yAFUGkNEy-IOCaoNj{A|HC5va8Vg(lPEzE&d9B;FBMucyTZMKDhxExPLvtr2PxY8Qazd{U; z{K!kc9vK1*%P>C~K5{>zTNW$p{{k$5Xw#ksa>>?i6Rw0X&tn;crv%J04_xqknT<0S z+P6QI%gS&#X>_a9T(rf%6 at f7e5QfA7-F5N8dbCpFj{XRyfmK}?trHYJyiZ8%yC9)s z{N@)T67#@7uqko#$53zTOKLwbTKP*NMgHy}Eq8{Szph>T{j6p at 5-$I;VxZ)AA zL?aY)GZ9>qQe0x&;|^$1dqwRmV(WB|Quoqn$)+iTAr%=~Ci>&K2B>+|4;imGOv%9GDFcTR?GW=Wi z%N3O)SUcGk2N7~#SV%a$QtNOVoP>>#J8@$HqZvNgyttYf+i&tMwwOBXEQ7{01I(Se z$j~|atU}T)Jh^?q(AShr%@lpguMX0PAZ*s$A(#yM{v#%Nfv88+fAe8yFru&fhoQkR zARxm36NWk(+B%uqIokYdYGmTzVq)uTVQBrYZ~s|lSe!EBq^ycI@`n>f^6kx1+TULV zf>;oxE+6*GUt?}vn5aoY_%%Os;~;_m=&~p$qzfpC%$E(}#{aWK&e`7|(409Zf#bUGDZFek&a-(qpFAJKx+~J>i z%uQQQ%olEo-f?#F^PP=v0y8;St%5Ac( z#13735qIIC&;V(LrCn^aN*#-gT3uMO?{1;ZE2ZR1UQgJK+AO-mo;}5bkXgFZuG?(M zVRI!e3oZ at b*rvGdv#A3<)g{$c*9I&lNw9H6ROYtpAiS+AYpx8+Md81sgi^p5i~nd6 zjp`6!jE!1$v$one?86d#I(-N6y(86a#*N4FQ2xM{+Ytd(MYhCYbwmi4nK|SQWTpq& zUDWGdb^6QtscYkmIz2C`$+oUDI>Om!W*i;Bt;wJWxS!NTdUx0#+V&V90?lQ2Ozd{c zP;K$x}?gS%e%%(XV>Bk=rx79i3gY4oE z-nw2?4mov%w&8nEqAjJ^v|f(`m5W>Yq(FSp36Hv07745q3%$Gmj9)CuF1qpuOw7Pg z0~1Iy6^3sV^lSErRo5rG10#w|%AL*g1yAIAhe`NhFYZ}TMX_7N1mnlmJH+ at T`^q4H zgKQ-GGGpFM2yG1&Q at YQ|m>o8i|@$aPXBG)<#H zvz|jHL1c`IgFGjL7{ipKK~xgvdO!|%Jb{@Z zv?tJVX5r!MO*tvoG$5(1;s9-UyPsJRvyCav at XV}?(Zt*4t8U(QUKiEs%4HVj3$Y!a z-qWe_gabz0xnJG>@(pG9&-Tyuyxy78PLS;7>R_}alY2&9gYC0Yd=-{*PcB|7$QVVL zQQNqsi~&x!MGrU5onX`_%&SsQd{O!exhmNY9u5B=z{q-uK4B_;WvhoW9yjjijiQ43H+=3S!$84eV4h6_O8%lXD8CY7jc5 zdIqm=S|$8K#@{Q&$XGN31j&VP#6n|SO}LrF2ifxF+^4kek8lhW_(5rfm`{7{1fv%;|o`G8}tk#YyOS&J8kr_M;wA9!XYeafhS*e0 zgA0t*R&f{XI&%x%RJrvjWKhUeLc@(dgt%clrqXM%St+d9*eo^D;}uzW>{5s!`^Hy> zkKmQ}8l^}mcMl!ZGTw3Bc%^o-x+Vt8Fxb&c4?fEeXENP`$q{}ql|2q2`UV_%y0vDy zcE!#xkwrP=wL7K<_nBh7Q#(>eNmq3ZdxXDAAXYl6^7gA*q!lD=~ z2f9`CpVESnTPY5ny1VLq-iL(nMIiRa(nr?PYMUca)GD%SynC#){3_)X^%8Y0WKqzT zGhph9JSt|$-On{P9cc8BroLSFZwWz{7(#NxEpgQp%r325mBz?y%-1^OQnru8W_zZ78MW2wUN^?pvw;-)i z`z$X|$#cBIMwnQ`@_d#;!M)<(UkLXL!X_ieC8SOK9$Xh$qC at t|uv)P&tFo1w!PDyq z!%SR89!uMVrEAUcf-ijtdn%cOf;dIL=Y5$L`3m8Jja)K`aZA;3EyKpE-9DbfvEshf zgwN<%e7?0)Vb_peC_W$C| zbHSu|Eks)y!d;rcU1SU%=;0vlD&ipTIvUDFTuZ{5!j at wswVi;&Tx`ld#c5iBr|DKH znxqw)Pg-%AExd9JD~NaX^zdjGW|i3Q6th$_RhUjU20;xQ^dVPkbx4&y-9n|l{-O!j zw`#xK)@Hk66J=s;H{4X0ok#jnWWcP^;&bdU@(M)Ns2es=!43C*YPZJWuINIh(oS^$B(t{omcX$2x_U1)w`3Jt4 at A-8Oa5yAK$=QtQ=1dwj9U_2DH}>9Pi?TCFrkM4q- at 8VnS! zulX(-{bNEMy at J4acR-ee*cZAZzL$iA9+jVA4HArmk6SHOEpF)h0I22ogo`*HVWyCw zC^5*g1(6Ky5>4?#UNu6_+_j$Sh3Vgjg`13i-Dsn zct}J9?aJP9CY3i5(e2dH~J=B*|T*< zz#^mb8#PK)Ph1!d381(Rmw|t(pgY7B$-yl+OaRu6G3}SqPLu1dXbdePhEWI7bsE;_hsruUa1@ zpL^hE;Yf3KttA2tpY>kz+nmg=E$(LjTRS^IoPFB>q}})R$Hp6D at q+C&HFMm+)tz&p z at 00_IWwIETtky2?avE;hjZQhx%e_)w z=V5xsnx$tAvdp=bW}wx&Rw_;wCRtS5{GxT(;Xr5LVxg(RW|*-G4r+)cclq08Biv!j zz*0+-xsp$IK at oL>8~q{u^!SvU^i|t8uUa_imGUaSQ)+TA15-9B4I|^OY-8ocr700{ zzZUQOaXI1}0-j5KgrZeXGzTcFqID9k!XRXJDWezFGkiRhX#V3fK-E4w)TMW+OvC2eh8T?~zEO#gFABsb-MHZX?mSxTd? zrK&+h00n8aqLkKZAzDaCESj_qflmE#;Z7ml+A(pLe%H);7wowQe=m-?qX{Jdl<``e z%glAod*XchnxEGPsM5d=3=Ag=Q)DnaOpF}&Fe-`wO$H|gjt0wvGCA^Pr&58Tft0x( zDZFxLBkJC|8ErbLEW;iJO1t@@vhiSwQXy&Bb_ufULNcKl{!wz== zb6(tSJC6QHZvvpb4$`_9brj3WI>+kD!Nx1W5n+wqwO6jA6Zu(4yw}zB(=2HtY0Y$U z_dO0>Wac3_>Mgh}l!*#W%wc(mq6#hVC^Rq~&C0{nU}MO-Mx!IR+vY2v6}bX7B`aH1jBvUz&mL!8UtMEFXb(7F9d9L*u!mqqEVjwU_(AkqWoXZ0+h3R6iz)1 zo>F%m^A4?2(R&0^%+34>pF_S-?eF=eXiBUxih1%hv at ym&5+#z`WqE036qaz}mGidu zBKap$`h;WbB|2sIW|Z{ z)-anRzjkp8*yeLk<12>dTbp$_-&nXdmMg8$b< zo3=W#I?DIyF%t<4V50W`v=R(3R)SZh2#TULilFGjnpQXii7+{HRwl(}bnp7Kw7Fbo|X$s};A}y4P0uKZt*DZQn98V+cX0QP9j^bDHPd?e}(v@%?{(QwJdW;0l7% zi7!S{>vUn2o at 7P17eO5CP}Cjq_H82+-Y3hTAky69vPOxTbfz3tVWp>u^ytUSPTY&u zi{pXyn>?P7>Dxt8L^Obe&~_JKY68wGOHbL7R#JZ_c|j4zXQwx*6uawZ#$*F|@BUD9vxvN}>2am7?-SdC at 4 z%E`yfFOn`ER;P4AMqDow=uSuA?xV=i+S668nI(v~8YQL2syY;Mn89{*O$H9v-HwhN z)t{MDcg6J;zK7^LT5MNm0jzj9%rRXqNkGm)<5nswZB43&Ve!j#zO1|VfPB`d at 8k*41mIuKhG^G9^HKcc= z{1Af}Nr{8Rz%J|uvB8=3=`TXw*$0WRCZ_Up(RNs}$dgr5;%{Wd3PC08QlQ3^?4m`* z at 9&mglUu1En?LZ-EcDDLTv|RpcvUZfTH_i}&K;0jut`Jc_D?1b$8jUaTF%5Z)naRN z4;)}t?LJSJx=e-@(`@!zShnJ=cLhIS0AXfxCinPDWuz1RJRo#Utv~Nn^JV*39pp;bqU!a`3W9J(WE29@(cfgSKasi zCGiWdsxClL{7W{;0>q=E9I-&ZAkZ7{j!w`kF3f7(5!@}i`h1wppdWa;6qtl at en7hg zZzMy!h_L*&rN63899LzM_eBAeFS#dMyk}b~&YE;2uefou85tE&y3afbyV8`I5VX&2LtbI86u3Bmc67XmW==Yx5I7n&pQrg$buR at j7j zMgOd#f37%o)(E>hK#vVPQ+J4>I|ijYX!;tfZs`lwZ71 at W#523dERR4hw31aUQixZC zC~9DSnTHH_ZPWp9+#!d^b{Iu2K`-DHe!={R#MNVSx}n-NisbE at C0F&qbxQt?9j{)D zazudY8zFd5WnZB^y-wUBp51o#fxSrQTI>?Ac;P4Mh{gDjo_bk26+l}cq7vnY=u#66 zmnPiL3$BqghGECt3^=y77!G=}0^Km;^BKlmXcALGHsKxPNTFf+2?aeIfigfs#K%!BNanuzzs=W1P0W#p z)NmvO5k|T{Ik5*8^3oS3Y&i>0wSnx0N2k%cr?8;WbB~|kyhayqGG^wg^wI8=AZQ`s zGFxslcRM z6UF9hiilI2Es9tTuTGl<^F50`jfokQXy&xULQRTIAI-ExcP6HSo?66^7GP$uMx@@( z6{t0 at T}CMvh^*HX#&UtlMx>9ToAa{So6W0c9yZUsEgYHLGHu1OrG^rNtH`LE3{c}C zn(Uby4tENSZKL(J=(yVq(a03E#GIaZXd~ublB8P{X%n5Z#3!?h)kYn@ z`aYH9h0j!y<)j5(S%oU^vH7rcwWS9v;1#l*chcWhcmPp>0y% z;`M-K#hPI+*m+S$uz7JuG^QEk?DGc5^8O at J(#QMQZZ#dJ=>3_qLNO7yuj&N*#X862 zzm?$(uZ65?$bPrMrnecBs#Jh_+6;J;b5Y=m5yU at N)*qa7`-OIB9S3rI;12_sWiNpG zWPxZ;G}swe#m=<|+L0!5f|&$$&w&5HV0>|fFewTGVkgvldK7jJ{-B1dH!~hx2%fFm zL%TlJdg9^Bj?e=k+Y80o&;WFIqk4Zk%2u~0uASVlwPSP- zCd6KV3uV$x`bV at z(E&7f>DEp8qASMWZOBKU)9X#XQN#$DCF at QA`HqNgcbM#f?{gG< zUDP}OeVsJ at RL+(p#V87JM3O3&Fa171-lKr?z%Tz^9PeO|>VTJZh)>& z?t69Motf!7C#GK at z9S^}kcp|~Et=kUOw#5V)BX(;{xb$VoB0&?;KDF}OTMxZYc#d@ zYifr^>*X=P6J4oyH7DN5*$UB7T~RmM0#ZTgAT>$L!H`W|*VoU{uhGV>@Mv9Hdf$&- zZfWx_*=KZ%s1yzq&ULk&Z)200dR*6zaUOOSdgJq02 at V%xsRwMZd6}$l5UtNW;))M* z)w+{Ld#ad}Vh~XNBAB(58q%woGQ-TCIG+eZ!@!+b+?Q?R_FGg0RVPWB0Q^^T9URg4=i!q`+bTV-rj6hAw**)&sag3=by(pC{!A;N;%+Mop~L8IYl5X(Z2>b7hpSP5FE9hIAa!VMvA at I$(KOr& zO+E$}=Rk5{+GzNh%YqcR)Q|g~eI^NkycQix*p0FK=zRkdlP+%2s_L{`O#^3ie-%!) zm12fu_>~>70LyE|p~^tcm~U};uBkd(15IMK3q^HHr4gfBcV{nYv$EMfmPprGu3Lwh zKX5sbX=VX{K;3K;Fw3>yaYMfU*+sO_Rw#xk#Yl}BII+>qu;o}CS~_JL4NnsB_)4SY zYU`3R7T>7i5>t4hph+b~&sS`R at mIuKz^2^5>Bp{3=k2ubWL?U38LHj2xn)^*-q69# zD2|d7#S5Vj4Se!u90?_6hLZ49tW_j=pyo^0Dn$K`Y0oAZqdZ)hvYTZ-$r+7Y8M29e zg!Ed}9BJzaA z#2z<^zT-5zoz;3$=MuC5tb7Zac6I)ak$?V2BV;fUY0!X%IN1;2&pK<}0^iUcU$?(sIbw$6vXCKhw}4=};} zAu56(5(51Ts!1&R at _tYw57;Hh2G+21kUetdsj^XL^i+dfLklzDnsebxz-tPv|miSBYj zHx{EffA|?I^@~Ps6!1LkDSnVPPjKiQBK2- z2-k`TCpz>hx=oDNVn=Efz>B*e#8W)$BDlvw&u*<{Q+WQ12ajx$$*r!v&~J8WxAGF& zUX|QXT6(XQwM}Yl$&|>JLO+vG&qn33160!vSk*-ESs)f*QeqWEm+KMh_WzJl%{Ppw zDy`}qqAC$B*7gYWE7=m at SPY6Mt^XBrTfST71$#A`}Q=Qxy7WK`SAUYCxqZfuih^Z8wrk z9No2{qVg#&-~ZIU-%8`Vh!w74j+_6$n6F^suYkV at nlCuJ*|%-kP^}a)_rBe7zUAzF zbe-)^y0iCvf(d~0MH+I>jWz(qj~fg{4b_oPQ6!INIOT;ua9lbBhDXnM1gXnEULw`! z9UfTXEz8IxZa+9v$uZB-o at mg6Sp{X`@e}1{&mhmRi_10{4lhR12Q(Iss zD762gNN_QZ*IV-vmk!R_sE0#~T-r81UOf!3y8KNW;rfcXLp1!^!Z_Q)@{55~ozD7n zx5!Epi*d{QQH+w?24h&1R(d)~v8+;K<*^Oey7jYUa$uA>kS?b>z&0zoD5_h!y4MBs z+G at DL?Cwpxg>wfj<{}B8u}F(iw?n71AXb at Xsk1F7q~X?2s->>^IT}Z%@u9)+qRlRa zG-O36kVp1RXH~S7Cx at 4XLnx0UO|-R0ZE4Cz$pKh08L)*iw>Y!C{t}yZ%S#e_fi{=O zRfBak$;{f!z0+o$idYE?DX#3H<`S{Fw|JB&JS`>kNmQ0q(lrZJOs3W(#t|`5zLh2d zVTY0E_V${X&KADhnKP{(pD8v8LVAU5gv!M7cyTjJ?iWy{JFbg^&@c`5YOQan^DF51 zT=JZRVqQA?R9jVZa`Y0b%d*%cfim at 0SF|W3?RVGul^Wvc$WHDVRm~*XU{*{WjJilu zo03`6ZUrmXx!R@>oJzx*mQ at 1vDw^x%<-!7uoD$BV%i*<-=`WsKDuGtm2H(5*(z zK`R&Whp-^_2Q=55%svW@$dn*kj*@-bp5lF7Jhy#2Q169W17zwBbZ^w00ZC9!9F>LP zeE1^uK|>rx2b4chyTf0KJ_Y;2J|+7sc#8K7 at WJmH;8drtoFb*EM1XByRUxj<3B^p+ zxD=4Jf~>(+rKa%NSh$EDsh+ibi^mf;&e~Nep%%ZY_>)T)=!F=NYSSVi1OlaeFwQ5`?n!KqH5JoQ)& zq1%$C7~T!+NK2RRWr6fgi)jtQL2Zh`x$iufAU?SRzXc2YKLxOP7sTLM&;V>v3Xs^r zl8hIaW(mmyQHEp=xk_G?E8q>e0vY8ZexsA#+2a at Sd(sirb2TaxfGw{_(iL?+?1t{J z{F;tqeB(I6BhR*35=>mh$Yu%6Kw&rqi~K&4wx>zh%{ZfCUGGA62$B1`NE98SE%8KVq`EetSk+)C>Q5Bj+JnCD;zJKDbIKcacaB|Yr%H>;dUXHX1X@`*MT zVmG(Vl at -j5wpS$AttKK77s-xko^w^UNCTEi{}@7i8$uMvFCD>;>rj}7jF8fMzj#H{ zD6eWj18G#7337!2X6|y>mgawo^VWSQ)LP^g0 at zgf)KRJwN#g!Rg2ojouSD;NHHCr} z$`Coa47!gOpt at qN_9ex1qM7svCqU%@pu{|NfU2$3Aah4qc4<8=9x+)*fzpn zN^Maz6~dA`$d(UDn+HitbnkfCrClXsQJEXG+`QTNZ06RIjEilTjvKG^RoRDMUs(G2 z+csy8wUaA zx{fmwA)HSLw8DLk4Uxb_29c)a)eHo(&K|?V&avD~{`k6UL`NTP(GPK)BeERa<@lgG z-&FiT%|Lv?#ldu8t(WVV~%3-POHz z+k-D!M`|8 at ktmoC;$Nt{fy2J~3I}zj)qNYvRc8>%2Kt>SIO6MqHiPC9T$It#}D`QJ%3&1`(Tz+J=-`^6t}YOIM4{Ny)ne2#7DwkG7bA0(XB1^@)bIxJA}le;xf2_;0vKyW(Bw)>qCOxC z#E>zHYJ~=FKbzM{bYc!s&LkNHNoB+vV|qr7b~uA_iukL7Iy3D4g8|9%rKunQ{q_7S z3M2nF1pU8?hsxUaNPi#4wl-`}S16>i(iQ}*3g!C{2xinsW<3wCednP;=IWYB$kkQ; zNhKo_!~YE!+dt{y2H4618<}l0=We&xdA;$ZzvmCYAwV6^a(j|6b2FkO@<8f-WW zq3={r??c?`b;M(AK#!r;t(6&2T`=FPP{Qbq!4$4ESuot7dDVM_ at 9~%De_cx=w_N## zsi?z)4tvQ{Jy7AmhxiYH<7q$8F+DHSj9s2)y$w at CkRG zuAmd0$wA3Uv!a-{kcAVv(}+ib7s?-VtDDbW+4P=TRgBB)s$(F7_Pl(U5LK9%Uks?1 z%vC;(b3N-m=!iL=9;N)L!2CoLpL%IYw0c$oDfh}4&5I59Fc}WAHO3#M$zrQJ0vo;^41^ZLzXh4U7CzP=3IkJFGE}(F#FAI;s7i9m<}P%qdbj9 zh<1})M0`rlY*zgM8u`dhg8YusexLq*#{ayA?-i{@m;9rKc|v^YNy#25s3 z59Y&zwsL!*)aXx{t$Z5)OmaV>jCnCVe$l;%@C*x=a(1Oqbx_Da?v*ea7t7sY{Wql0 zOKG&&=nj~MUzc2&dEVnGG1<~p7&Q(`@ae5tUNNoC>QbHUYDu;(o$pvBqh-Qcn;ly& zvdWLHyg)HcE_4W~195sIj+4z(6QtdaCt2M2f_lkQMzlPr*s3@)KnCb$N#DKkxh(wENF#u{wnwsvTchk(flY z*Q4fbw+omD3uSRst2(Z2%*^)8&CQPB{dfC-9iZA# zuSL`Z;n0sJ+=WIW`r(yK#?oHF^)jycV(?2-s#uXD1C at epThpSLvenyId z$jma&z`U7|y6iGjrJb(gkQMe*=4j_kpHh;iG1ClBORuL|p-Iq7M$B!Ra_#7{(6lL3 zr)4x(q{=)#quS~+r?ZUj_XC at +XtU`gWl?tK6<^?`civf4SI;CCpwUEgHkX}t#UzzQ zb?MHk*mN5;!Pr)}iH@;k-a__pV-*RZXD#4P-!K|68iDxe_%|w|tI0 zv}>I$4_lV$_imAv7gBL;5$UXHCO2I1ZYnGv&t+Z}J at cQ%pc~qi_b*InYqNERu=WmS zv2*N}dB7#(@8Av?On;85Vfo@?ljhIx3w^v00e=jc`N at tngYl0xAKPg+ zC`-1QlriiZ$SLyij0XC!UHAysuOh_ndm#V#3O6Iex)2GFg9<{^rrdQ||c9 zg`^byX`uM+T z?Ega_%VNi at tgW^CuLgth4G`e}rjMY66crR6TP4yuvh1Xip#Ev(gTed*_ at r`3sM;un z;U>F%xjmlTnZDlso}dk}VSzNKE;Q#FD~%%w_L8Ko2IF^T={38W8F~3RX-q>)V~_Q?Z(1OAVf3n+3z; zyXn)f6{_0l;fuqo4 at c-rsyvtADkg3nxt2=X%Ts~4Vu0>Nfot1saj(nrJasxx zGkwJTvp>DxL}_WCia%$b6XlKvZ@}U>(;e7iM9rw==n2Al<4nW15x7R{n1l3xs`q-C zSiTd7p_o_}S-e>_5HhWxP>`FlQ2sqO2;&9nnCePD&nm$Po70JXH*R{=p-AoSvAq;Q#4(>}!QPo(Bp5S|cCGdcOl^o_asv2&xC5Uu6KEe(9*bn7`zzsK3jzU3X;7rC04ipQsq?sIO zPmP4xC{zn$rk)8p4H1jAM&yjtLn!4KgfnBR-n5Pl5_P#A=qmyx->%ZSiJBy`@;PHF z-txI3Y4Zh?3(}RG8d&?2+&u8f* zFOmZHvDiUN-$)GxrWMS$@ZrgjHdc~|a?Q-TUq+DzL>RFQ6s^x!pT=4weY9B6#Njr$ z7%N)ku$_?wXiQ|(pYCG6!jm56G-S4D!`4KfYYL6 at 8IWXX%n3ZRz%e+wi-Ng=AM*@E z?qtK-FB|=YVya$5fVC_HqCqcoVYraDf-PD!c>^svd?~PSp)PLLVa18pLxj8t7Uh%< zrx)fBeal6!UF4nTMK|GUc{3rxHfJG8Xl|h4L|a6d!hWNFs<~sB5YjTO^x0jBPB?8i zeYN&|uTG~C1HXllXc5+Y5pxGU5FB2|h!jD_!bEADZ5XUBf!vti$he3O55I>|L%QpT zrwR{BOBzGAV;V0UZX`uh<@1qxNx&EDQ*_v*5ef=muK^8?*n!Q&v%z96CWh;(mf^d> zXZNiKeHu%|m}ixGUQ0 at kw_37lS#e}8%tq27H!mOAi>;Sp$-aQni&8*Ct$PgIOS`kI z)sG`%bWs$p8UvonpEE8|)hm{7B4$sS!+dFl!tr{h%=eq=B$og at Y4$N7#-ak{NakGB zuG~ukwP`c=!Pjy-7&A2T-V9qk8{+Mwrr~*ifD=N^$PuU!G>h_~b>qpi)7BJ| zVOnl9%+g6`S^OnjAtU`STNRIXDb(>70T!kRx5;`rz*s5dO5=3FbaL$w*~hJ_(U;d- z6B2=_jXTGq! zM at h);eWo#7@>r&SpPytXMi}=^LZV z7)D-UT&keNz+84OfOkL>33HvQg)vj1HdO+RKKD;9DS at 8csu9nxooOazy`j at 3EL~r- zNZ^)4tc|*AwA%uuy_(}+poMH#lUw_lsKlW!gzP~T4q5RTSF}1nwP?KLKx&fX7pK(f zJ{+s@%_XuN6E#kcJ3_J3PBRD;eiHp3S_%>@SSuonNCnMPyFX&t_nhsA5 z3VQTushr^Rlzhd6K|?z1I^`d%SUn|5qRZxQ`mPM%V0U~VkQjrgdURx~PyGPWTN zmdx~)3H4r=%5<%?LDjAuI;zn&Ggp+!m!uf z{%W;VD^!KX7?4ajAmd55HDD+PFbq at w6oR5lZ^mr#DIi+_Y3U(oSjFj)akcNws}&@q5JjDnb)^xmbku~#2}gG$dTJvSmHSC>cy6fflUlQ z9%QIu6pm;A_B5|$>iDT6uKq?BtB=lWeJ)`=WiJSQ7%G9kKMkcnL94}3FfB=4JDTxDa at O*X?#YhYk{IM_Vy6 z&fWK7bToQzwACfRWvZ3|tf at tEhr?kzx8GrWLsHnQh#PCGa&&|}M=D-6)e~E~10(R)>AA&$n-m^C#+70!(T;-Q zt>j1E-Iig`J4o?l2Sue0M$OeI!r1SI4cgKQSyh9g4C3%D6uSn1-wk0uij`P6Dk6qm zJ3;n0>r9`@%F`4L;0;FsPY;?i;Jyxke5%0!yYTn}Z7EZP3GauQ60$#1aY4q*6cXX* z#$Bd=u-2zI!3+?z(c>=O{kP08g02#0-3CvwY%aKcbf+;m*xPuxz(n~D&+$SJTlH{K z*u5fKM>N#||9ILk^UaH=p%18ls6{W(?FVq+Lkx-P?3;982vImur3hdUL6A;ya)7Kd zw2f_(a+n3go&?brCLxu#IppT(w0CW83An`tC}RaDRVrw8t5?@52zj?MI^eS0R5&OC zwj8iU(_RroHUvNuN#7v2?NGunMbIv?Vt{$Vto&ifqzSq+EoQI;SxF;Sm@|N(S_)${ zAzftPrftGfnAKeuV-|BWwyyBDtm^_fVFEm{A|Y&R=1gJC*bYvj#v~|EyOuR{z$mlB z;d~IYZVRs)K6{zC0;>qYUS$5_pcsB_MjXPcbAf$>Zhj9vrDH#%8{`B&M|Bh6hfs$q z&>b>cuJI$xUNu6&opOS}LV(kVVS%kXgkvPpwI#n0E-NV&N}B34ZZLyjAo{sNJEijJ zKzQo)fj6l$@U^;vCx_kr7Xz%f1nt&@a~>p&cOIhTVRT`Q1&bEuFd>dQIrVDJ&?NMb7z?2osf zBtvutTa_(S=C>*zo4sc&95d4q5K1XlXs#@EMX_2|fc5UNjidtQi at Oha;|s(bz*1#t zpU=T&1N1 at S6Ky;l2-JROiTr6nz#l~*d#)?q7kk)Mte8%k-%jf}Vmj&GXI?k%5tqOz zQ-rDVC0pf7wpyPN_~I;ck~EMa?nbpk)})|;QI4N1^y5##4^{5)HH%Tum^=QXxuL3?K8%}V%exKfZn_?IddqgkXT5pp3~}&u4+>})AFwdS9Q-x+T*u5fySoy^=>s>u zGVm2^DU&>bb&X14R6k_$ngyzjU1e at y9qjG#Ek{nD)%|N*hB)FJV4Hl~wQD_tqBByd z^a*1I7gT<2*F{D9)r`{zvCpK5+rsSltFsq=Al+G$9eT~fpv|m#H+k at r+F`=vj{w?L z{ZQ~w9OU3;u-VfsxcW5XJzkh+I1F{s$tGK2#jCLRpmgqsrsvuN&P3di!mS5h6%PFX z%y={!44&bn#hApVAN;}MD}$K>@FXpf<&66$gDFizNem{DsmhFlef}HB#1h0r1}~c4 zIX34*(U*bQX95GGM7nUS3uud^de%iTn7O#;Cq<|jv+oQ#1n&7pBaQy at HX`yBal{LS zk1WTrA5P&;OHpc%BRvWyd>bEFv|T9Cg~1i0MhhCNMhrW`cMrDJy(^@@u2A{u(jOwN zAtGJjYqfh|58C*v8 z*WyZ($8>{J`Y} z<7siZ9-aK!3BTvT+WjQEV6qE0i}c%o(Is7-#AZb)WV4)c1V2WZK+SD*7bAMsRBfoe zls%=FAchLxx%{I zdr(IzAC4NEW&h6)uepa^C$rks2HmJX#_n1N=BXoU+R9sMh~L4mqp^^nkgNq9$ce8%Fc%e( z?IlqNE0h5vq3DvEkVXFCv`CudY0o8n`Ezd|K9eFmOWZlGrAfWd5-y!yq at by`zvP#w zjGu9 at H~9A2yq>F{#`5|;!3|LLC5VpnP+#uFF!jafVsCI8qtJSXVU(-YI#FYXc<{R_MpH~ZeN;Z(ePao8XT5L79LQ at MZ z2be7xVd-v*gChU{1?g~;-?qvw(yin~3;r^mlxbPn#AC6I zS*_EBMVYgeR>{p~?taKxi=7ob%EJ1P*#Ik;lEG55vt_v;)*L6b z+u2v3CX}IK7Z1=Dw8YkyfsTPLHfwJ055u+CQ1X*FWX_diI4erKZ4qQ1o z29aU+mtoOmW5&3o$CA3pOhaSDW at Voo%!QU8yL*D~e at Mp(s8F{-U~B(!xKq zF%?w_BqULN+~_Fs6hk`U3$WSgi8}K6$*S>M+K+avxJJP?3;F0Pz;(Bl*yOo-=>aX$ z6iY@>DZvMR_6#VpciWB=&QF1 at l^8CE&BdEmLL`A4a!ZaXVV)QTFHm=7R4eMG=+dDF zBYVFzG{fAAVMk(5=T{O(q`5hiX8bA(aE7n at f3MW2sIjVkb%f#0Xp!;M?W~SmfF9zQ zQ5 at cYr8B+kAkq-yR1O?4P8$81MKRCZiZAL4m%fJt$>3=V^yM^6M!h*gkp)9)$&FT#aMAgLyg1h%%}S=5`+u>^?MBWdQ$(>=`uXP*sd$Qm~Je zs|+62gN_;1bV>uJc}$tsf=nNoi2W$Y7ADtHUXp4{W+*xn&&OD`?`0^->6h=Pk`DAQQG7%#Xb{%JcMD z>+Xv{VR<#im6=zz0UsmB>Po67Bu(lkzGOWvK=cH1VFDY^3#I8EJYJULO+T+3cNrAb zPRb7g&uENh?ci54cb1fog%%$MSlsRQV!bC34w_)j)PHZMGlAL+x!-lG@$RM!Wu#p# zl3b{kA|%in at u@=EvkI=(fiEiVibmjt=eUTl&CD2j0e&s^SJweS;8!a!q;%V&DK4T> zq-j1jz at i)Ik@#b3an!rgPOz!!J;X78bQg&EP^OhNWq2-I9&H~#nx5}4!uDj@{KmS; zi_M#rpFwMuB&jSmOwD`Ld)9u-b>kKLk-IjrRKi2{({-q*>vY9Pbe^t=P4f3&CPrbq54 at d4vZpq*Q^n+eE*X_m|Mo6A3A4)dhj)S^9#GP zUY;S+%a_X)>G;Qhlg*d!_Ll}Knge2+b<45#h!~_``j8H~>;>L6SRNTmY~hP~ww70j zJO_ks&W>p|eGx_a8-&Eq1?`kbJp{Suhi>79yH~6ckZi&%ws(E~vC)4#8dKN!rIG^! z0ipi*Plp*L+?@YUUWlbB;9nAh5Jfo|5GF()OI!6z^(sBl;$HKGHXuhofTV8-ZjHbgFKP|hPmBI0N|Mm>OkLv}@4ea{k3c49zhd<7;91hC4 zR^NwJoqfsVYeR)Dx&NE9O|R^!n1zqY*|O$w(%PIQ;7Dm8L3~5Bl0fiTH at i$HK#v|Y zwvx;EVcH;$Dkg-PtL^qnq{mHsOhz7ZG_Fm_oduDzT0UZ#muPM}$;#WH91)YwT;+)% zG)PH*f8T3)o}N0C4{wA%CBi9!XaX?lGMSihyrbLUJc?xQxU#G7c@Eov_6d9ie>Ylfb;r~ zRHd-0g{pht|K8I6f9D{oIGURN-v?2Cnwpt9{+D0oU;68xQ-CE!)NC9c1)a^}l4Lha z7*4Q*L2#%-NmVk^Vj$#(MuRg>jHAg0k}>-FV~ThUAfus5n0P at ++E*ZcXeM7o$t5wG zjThWGyt(O)=ej)s-yiKEG;HPVDj|U@%&U_c7?d}fdbD8JIl9(!%)C=>(PLk_mJ%u-AS<_YUBy z(_wH$a9bNgYs%84+D9%fIqECDdJEoMCmc6sPYuf(lco90RMxMeY+U9kZgtRg0noCcd{l?1j8098{7G)+bKyMHNEtVYJ#9M3}i>^3hH+x)N-KG0zO( zW_QPFcDKjv|}QWvsl;k^>$GYxLzY zU%^3Xs8r~U%aXi$@E9GHPS}CYgroYS>RQbvufmS%TES?mC9lBA6qwS%5iFjg*z3g) z5%OW5g(L4;GnoUYic?ug3CY0ia9*lxnFT5 at v>QI=lS%ws;L8HC(AQ?|16T-|!Gp(^ z71JBK%qezFPw86IO_@@PWv?Ynb!x1B15~^)uciMA524)%|FKw9%+sm_nRlOs8oDgc z%&_K*92v<|Xn*t=uv(UoKv7uv6Gnk{HdbLVtsqKg%_?#35pJR$6 at 7az8NQ{7D#sdM z9|I86DsTg;7y+i_BCGi*d9rq1|A&-?d&O^iWI* z$Z at 2`qTO_#{RWdW7#{>8fptEL3S=priP2vZ#LZ!@-v<@T(YBuX4hVrQ8Ftz*H&RXI z0(|yRr~J>XjX7mA4n(AP^9q)yn3McM#s>Ym8V(dji8Onxx*RmmpCpozhdaPn5_Dy& z(R<7=!FG^@@ox&)6Uo@?WbmD4+MACH8L-OcIFdbjL(CV>6|W^gm1o+ugi`y at zTthS_X}QexpyN)`T0-mta_ADT>$#A<8ex zK$DSyYH^$O>FYp++B|G-&tuJ8UDzDVSDIwAToZ;$h)HquNA{nL{VO z>IebrQ?^HRL2II!+DxpcHVnl-?R<0};5&pi90oX;oVOkLp9^#U)g8)%#xRY6pc7kx-h#oY_yw{n8=;pa%=2o zk)ftxFUn+4O>o9?u(5;PPFvQjY*H;z{0wVRzeb$*i36F}a>}S5VzoFkw%o#peFPx1t(#wKS z`)HLVs_&-bc}LU%XsQtytF$9w%zQ$KK2~mZ>g#1{;0rfry07ZefGL)@QnH^sn<)YZ z{*izoCfhbkt`@qRwVlf74{B-3Dt8!V>fQb<>QV>Y5l}s42QW=EuI+sJ2yC0slJEt3 zEeYQ0OcnFGLtsk#$FuSDNWN{wdop~eU-}cTS|c3p)rZ>N6zdGICVM+ntYWjJp_`2y z9L&)H)>&S)UcY3jTm&(*|VmaB7 zYNyAKM7vj`TC}v{3j^MQ= z%Y{Ion&mjssHHvDUGf+=3w83G));m_*it%NV at a>b^wC(NFX;!&-I6k4Ed%BD at zM#5 z{KS?!CoC*2^Da^+M1AyMkMl$1HHWebzC-f_;Vhrq19IUgt{14Ki$N96j1~9cVf~*8 zv=Kgfap`kzcVLhpUn;7qyPU>LUnQDGQKgD^dD2%DE- zujO<-5pnnU*Q|@UVs}M`7>^OC!+*56SJV<$T at r60#{L<)Ndy&ztM<2Jh(rFb#zR?4 zS5q;7v!loVeRtY!NfMPWiGgB3a4Y1Y0TtRr<}j7qR#Q at n>N?dKDwtSkWXMWihXs^m zO}sT|KZc;bFNgvkJ>th9 at cne0aJIv?jWm*DbA+S$>H98=`D_l>+0dnMZ-3*^n3Ig>6Ue z(;6-dqzR#YgRRHbO6-{nuBNHmmeU3&JW5qoZ?apbyafa^ZN*in;6d+>!%Y1pij{Br zcFByHaRyMP^Kq-QltuN|u(z2S-qN+oEr8DuouCYhJiev778;2zK<9NGUYaeyaquEN zPrFf|+=EH=8;EPd>MvSo|S!5T>+Zn-vZ zya at e{A`<;|7XRl}?+!!3jiNmfk?yCLE8_7|eH4nBE{>~%4B?m9z zlj`znbKkpsPt|Etr4olQ&s3dSc0lg?#TkoI*;ad?fXCq=Gh~ZrD+?uy;GpM>I~*RX zZ!bE=8B66Pk6nC`M*O-^E6<{`fMQA5`m46qiWGOoz zOER^jB_Tw6nBE?#To}+~1XcEClgK1Ggq00em}`_2=@}`JStBetqICA56lodf6mjJ@ zq%v)vLb3}#j%}Clr%i#lEZc}IQ{@(HI4O7QND1Z1fMH%;JVb4vmozrA0)>4=o5^dF zruLZ*x-RC=b_3#M0cE$yJ;UUE=bVWw6lEqR+9f6ioep9fxW>v$L*cU+cS||J!Nwbxzd%irZbS{F+gjh69!a^&* zF~e5y1t;$%0^&Ll8wwKr+ahDQ#|+*-__T!~M|=O!-q04BSLcBO0d>IqCl}klRjRz5 z$-g*UkJ{dUd1$`@$Qq5bbcD=C3(_)6h{aH-^>nBORLKU=kf<%HQ;FN5bXmG)ZcD(< zqxS`0B;My$48IFv(MBQ0B*p|L at 3Utb^BGweupaGi;<5?$UamXbUg8A&-q899 at hdDw z>DV_oGq!9>RkH`8BYDzQ6NYfJ;tt1;=s#v?H1=u)VV_ewbEm3HkW!gt%5SEtvU*A-Ksm)%-vAZ9CjE~IjK#w z7bbE$E+sVeDboV0dFPhOZPFJZzsDN)V@@8xy0YmvTqlw(GgED&z?X{uEYid#yU~=I zw=Z6vL>s$sz0 at GbS0fzT?A9N9mvqzTp!w_+=R9}o5~^`K6uH!6J+i|Naw)1~1)P^| zA4HFhLk*WuO=)%+C1f%w^A{EjFiGREx_;vg%&r1Q7I;p^)yc-mF at j@PY&R-3I at cX4 zX3mh>u8`TWsed8SK827SS|p!T9$*g}DY-p0J{7Z=YPObnEpwAzap at OcH{%0J&uB^~ znlpqO>C`rK;tUWKMtM&~${p zfx7v+{oXsRUGbRr<4(91Vi&QgZNx&CT*(zSc<8IIGID3<_c?M;j8IP8cI*ivuj-?! zNcb`e&Cz?dV>ISCXK~r69iYJGA2El% zv3B<-g3B`&9l*fu9TtJJo(Frs?5{AyLqJ1iMHQ0t)T0R&9Fs~0O>E(Z41l2E9bXd& z)Y5sydck+oUenFcb2b at hjTE;>Xhvl>F?5=wQk`7v!%BML;#R_m8FKmqoVOk{!lsu^ zf7m!cJo>Q2 at -*4y&Q0-LVrEHigK6e4aNs3v at Z7w0Kv-S}-f+%VpWMaLbR{xj=m+#*hU4o>Q5+k%jF0EZ>M5Cv-E z^4#%;98X^n at aH1F+;0Tuk>~mOFI?#>ui?TE3t1Ndy!Eg`w~_T;VOq2zmnH1FtW`at z_eA0%_b?j at bEGW`WS(=xu6EMi!SGk?+eN>j6==@5mruJOrKkNLM28zCJfhjulnSD{CWD&U#zVofpPIKA~4i!f==W;VmG*%l3$|P zzM`Mz<$VPilG0k1VO0~49~K at +i7Hr?ui$)#+Ibpf2z*G0mqeNB-W6D#r$e%!^O_H= znzeew0=4)GzujOO!p5ikP~D}e`5$3a&?3SnM?_8z0~{j|#d%ez at XJ+HNtZT7_d-R0 zUBCzK;bgxc_5xry9{%#CLe*oq_DL}+cT5t)ddQ$61}jMLgyYRQ&2jb5T55B&wIG0!1IfJjNctWfFV2`;r2}QJmg=ws6H@*>Rb&sEa07$`bFkGG z6%i;|aDFf%YM_0R5yBMJ07y9apkKI at Uv?qM_!yIL7;6~4R*YI-!awH{3_}=m{~tg= z`QZO6Cd2Zt7YEh3|32H1tgEFS5?Q{lAb5pf80F3gEJbZKjLItPnMa>wI_|o9HH*#Z z{xrvUe<%m9x9rZC`&ATem#RfWX;~Dus)n&_$<;5uYWSSo1^{Fj0u-`F;KXiDmAV zftuY^Ixy^PCro>B2kQJjkXmY=X=1Io%Nyh2t5fjW0pT?dufwHRKB+V*&2Mp~v_9tBmnLNo& z?Xrg*a2GVSN#Rd7FKkN$U^CfVauv31?=2S%9_FBb^2{V{A2bV_Z6ZRW$ugdkCA!I) z!>y!4GOe+wH{npIyw*dhdNkbh?9JLH8COIc>oS-BOce#;%~iko zl6u!pB>MfHyNdf1PZ!N~r<@7Jxj3D{0{4kPNX7_mQ2EZB-#SQ*(S~;%=h5h=6e)=# z$33n_ohWQxeg%@dT$*odV3G~Zl`-drn=`?=QLj{nF+^W$ z206D3=1 at m$rO>RhGf~VK6)}Udo)e+ zrrBv#zkN(-$Excgpi8G#=Pfb-LDHQ2*Qn5lPMHyWQu+^)3Mkn>VpjHj1XLzlGkRmP zox6ewtF&Kdic`*LkWD{F5jB4fVnzQm|3aeZI4kNemV5tqSZ4hnEbl2SDWZPguv1p4 z`j#sLD*-#$2!|D>`;(%u2|-{JdG*n7loWTdUDpIa{2>WnfMDdu%=?SuGuI?pUs~;_ zf}XOnvyWM>y&k@=x63UzASZXDLIg1stZfdZ{^$Tr6mT0K8mx4dyZ(NW&|NYGPpb@~ zoV;3Q6SY9PfqDJ=VvV>!W)kKRsNOeiO%udQFMwVMqs?Qh|)5U`TSqkwAH_osP+S z at jd(0FiWwn)FzrIaPRIf10oCygZAaQD!${&aIE8Ky8x6rwUUW`D++lCP9)(X65UTv z0XQ}zGghEJ5e&sg5D64JYz3`BbRduDvO4v5ka2Xh`{W`GQPQ+JqpC1P*lD*rh|u zenMT5V-{pl{llKXgS~%;_4sjBWz%0+3qt;{V9oZgZM*7!Usi9T(=D%36kI-}AbbvL zL>-AsjwehA)|iJRI&h#oYBcGxb}a+P{{s02@&oG?ER0xy(En5#x`rVW^WF)m{@N))(zB93+M|l!`RmJok&0s{92j;r at HWbR_DG4;qFAv8%w-Ge z#~2FxfaiYFJ+D&Ivoz(f(NGeA^mtq)gh&?#EX_ztLY{p_uT~dqr0!F|ksm$l7ZzAd zy*LZyh_kHcVT;K*q^^0=RsVwLZ8ul-n+@*H#V>TfDciV@*e at fWD9#kD$d#5WZvM0w zMaI-f)e97`Ieo%a>aP+?kvi;N=S!oN7 at f)|8T^ONc;f8eUxJPo;QY2%Lf2ikkE{7T z%Xhpjtfcqf&0731$C_IV;3v&k1df=|w(lchTg9oW921HHSpsv`%#d!Se>$!z?=DQg zrlz~Byv)C!aMbagvH2dY^$J1BR3ScZljiO)C$sP6vL1d}UB+xw<=Hjhi z^0`wyn`vQ-t}7ND4j|uj;wAj({kr*|%AggN&wgxXya($s-lrdk+;F-ae9lcditP|y zqc=xGb%t>lY!&Y_BsQp)_#EjU$cx at dygeS(V3eum>Sgv57~ELlb? zd!T~p*qg#E2VP>;!ZlRU$@pg0*EMt<+G`wdQVD2rE~?lPzTqn%#xs`07qZc?y^q*u z4^m^11E|CGtQ|QYW-1Vz=7|+b&c8lOlK7BIgW%Ei%l9kAfZe%5y}9BgJWt$HBo(H53|!*y%4MP3K}ziy at hX-Egb18? zCElIUvdC(*on^cPFx5K~Y*tj;VwX)jMs$IwY7Kzk~vuixN+%`hnD;;8gcZ~IN} z*3S2%0f$zCveDRF{9H*1UIsSJTO<5{9R%~{?FPvAP1n&&Z1s;rXqb=`cjeMUgQLuD zSEudoYjk~#Moro8kNv_Yu_07>Ye}P at wZE8bEY^qd;HbKBhjifx3}lAbv6n?a*3%4L zSXu82LgVJ=@1XTe+dZehC1!qW?qbq^5XbUk_}+$b3u*112MU0NqIgz~c=f!MoDiFu zEZ7Bl at Fj375E(ouUn1MekDM#6S@(|b`c>3PW!;{Oy2zyG{GwNqk7zm at TmN%B7sFIj zf?h3Igm<%@x|hUqG2PA}ohW<*Q^Xgo(IHtEm$b|-A3&DW$a_wPA|$B>BQ-Y<$Z;jg zT(P;a4sHyC^b_l1EVYale$KviNL|g;5gFl{p7%BsWrm at QF9F{uEEl(+Y4}4N3^~*C zi9(rT^9v{ejf}0vJAzZH at MCGxnDpTa%IKqFjB}<}?9&&ZWf&$Ysi}AK2%#7!O7R?4 zOGhZw>MI)j1sd}eP4x^j+n~=htqFb10Sw%W58$c~M{%%G%TnPZZWIv4)n3agheup)=3kAsvm%+bTfb zf9HSwsXUC3e;sG)WuSrASzUPEQN1YRoFU8a1|l_I(|fUDxd;`3ICBa=FuHf%FYatX zBF#>&J50Hufz^QYn-bCsSbs$O#vAU;GMDHL6zL at qxzO#_ML2ihlAiqgAInwvYbS}G zzyG7);QuMj^4}VXkcr8^_mC8o8F>^X)Ng<`&sWON5=z)os}W`~EkrTe#CY%|axppD z7{j8a3>mEK+4Kt))03=rhlA0W2++eph&v+LPt9|g at H2Uuka{fgB&Rv9m+Z%!zKl9Q z0Y6~Is1wRs5&{ueWhG*1SO-+2^iepXSc*C0UGL{8@>t5j0$My3_J${3=fJ{EEY(=gQvn>GhK+zlgXW$H*yWQ8kt zHvO5;;aMzb!4KxKdsn^BF`XwYyNX^dy<9GQR-=1$v;|#hKK-1+U2z-b7gl5dlYhZM zpS~|l7G2aVxLz7)2AWB%(EY6(&HeffH+G+0I5;dpPws}AekC%1qTb)+2Nf)ZJ-SF> z7l|QLKo=!NykMeXVWC#)wVA5!Tx5soR%J`l3Avrq)HUQ38Pp5rsk{I~C|I8SpNs(W zU&Yk7ZEVZ1N`4C}HEIo39o=NxMby&~bJZ=U1F zH5v=1`-nk$K7%av4yQs9Pb5ZQJi#}U?%v=pm0l>B~B^LS1wet}Dph52>C0_q3VLm~g*O?meZB`2n~Gn~uc zl4u6|PXXfp5UtqSxtjiaRphA1*dhO|3VK;DDpBzDIoO5ZVoZYZ z!5!!J!E?qnSdkjP(Ha~MIh)P)JBU|(S#R2HtU0{%DS)_Uwio`($LuAuzOUaqY<_f? zl>PCjq>c=6z#C~TN!_$CGI%5|2d6ZwrS@}AK2ctH?KUcG^(Z5 at bG9BJfv68KRlAYe zcnzJjT>ErxuWJZlHiS{Q>jqLr5eRLlhBpVbiiu7fWEDalq?SS_&C_t>erVX&Mf4fk za*$|lrMsEB)$A>?AyQUKZH!5vqMb%}7DD0;-gD|PSl6jmM?u+(+z`C&fNy2|?!MYq z_rg*qUaVugU00nVe at D)HUs_2n$9HTEhV3ZaSu;N*lmsrq^1ff#s$N@;G}elqLP^sw zY#=JZLYg<(YZnC(n>ld2V1H54VtFBHtRn&4xj2a{!woo0jb$R`N_E*Dg&xBTJ^7;r zY0FFu(B~30lka>`!ZCM8_rUto8nr#Kg`=jB9_MW+Q+EOy`{emce*@{c%FDNF4=sq} zQKw*RWm<0SVbg2}nj7}Mwq=Adu`WcxieHOLqqt5mkRO>zwn7XzBU+2dx4aLU&x at pDO3 zniN$4BsfzVn?!(;3TM=8a9uMShujYr9i;fsX;dP*`I+(kfN-Teut8tqTp8ktY8si3 zM>r3A9)(e^0{jV`NvUIBoT&?@^$X+oTKp!a4p;tZJ7e*2JLYqKvrN0}`jE5tx*V*! zum at V%MRo}fE)1vG0vD_=RHGc-^FOxoB=e}fl7G=0_8$*A{2Q8;O`S#TTmb)=6#pka z!)(Kp%7#v?#Of{V(n$FzNT9#Z zqimKzYGjn0x$N*@&{OG(6O^=8 zL}!HY;9#g|Gx7~y{y1UYCrC^(F?(&QMrtz;J+2$Swo#!f^xg0n>v^HutG|OFL0>Gr z(|2`k`+PBC%8Pq<(lMZV^6Al9`6l*q=M$Bg0hu&eaUV;?$AyYTxrWk8xdzToxtbDW z{w;AyRQ|zb0U-tN5CF!r;gwiDS|ZnZb79zcy}rhhf1tQ6xnHhi1ZWi}glHyoW%GX`efnNT8hJ{HXIX!d%)7_r&kk7UlOtHJ1XB64ZeQe7%s z|LdG$GXWASuXhu9+n=!+;fup5lwKveBW#2CVJzk at 7VY>GIGi$PWS&W)8ShCXcr3ll z?9SI5|Ae~60M0ZjhSof$)$|97;Os3`rP$1A{EO^I`TL4IRF zK1v(>IyfZ)B63b9EwJ$q;Y00<+M>;t;!9NhPq1$geecH+3}lRGgujG8`F^_=BsnBenIzt8UzRB3qst2M+W z>|;X|cFZDtkj_hHwxRQo>su4REAC_KG*^Ve7$?`1o2S$+%Ey^9Y8BJbWzKdp;JTx< z3GH{!1>3bc`wP}n=%r)dO?nPI#obXl92z}g2^7Wm&DqyLewn!Jcgrxta2 z?z>HI>tC1yUU&sMX-e51AQccPA`_cA?#&%96K!C{pOkwVpm5YYmJH58ns^oq_X6c0K?(~kL(0cK`CMjN zUl7<9A$oBna2l*RMAs#QX}YkWL}NKnB<_mg8TP8I7C(}r48Erywag)H4)o9=i{V9N znk%A~`DY-gbNcY81sV|0sMLSbApbwn{;w^nHk3E6DVm>MIT0Ck1Aw+G6Tzs6bA60 z9&P=-uwPo4Eg4?qQysDbg?L3qSxjN6*24^a at s;Wc+8(pY1DT?ok_>ivOtvfff25)h z>B at F$4>aA`Uz|y01A0sM*Y3sf9h9MVWrv-;q5|6vIZ(Ud`X*+snSEtO?Jx#nK0o2XZifSi zIr|{#4?nszMt8Qihh}=Vx5sAi0nd(3C>$?Nk3bwB?HhA5gd7NtkBA&1+umVWdI0>? zdn7Po_r&Np>iV2I2-NWV-(8R_nZyTzjQG*PJ_Yi0yQosZM>Pq8_ST9~#O1s88d2;a z-VN#KBA6W6MzUe67#js8_{prGKPGsv2#SPiA{2QsmuQ1 at Y!m#+kB%Tm=mzk#oH+4! z(YbsO8+HZ at XA0jK?W?rr>t}j}UBDaOtO)>Y zT8ue+wy|m_RN7u&W-4g!%`dO)HeeMn^I)I$?4HF*6m~^u<{2M~fcWajMuGbj0O+ub z$Q%RR at P6RSd<$2RqrZe4?er=N(|~>vEIR(mUqQNB>OR05(5R;~8uuIQlT!dkf*w02(wDW#y^11g2x;!OX4sO(x7L6tK}CNjwRE`7FWa zDY!~oXJ5|g;Kr7418J-sXjntHuvR4263fR+o+f1IZ;&9J8-$F{Ne2b zUm+r`nHjEeM?35JnXN-4+ZZIJp<{?tm+)<-sSa{xF4wEk?UAN`c?Ky&YpxB+sb>=n zI&@s3hO8;0)hf8&zmpaoC09Hn-mBcg+{6dmT|PJcrFJqC{wV}RdWQ!UyPtbCAy^fX z{)p&Qk500>VZO?(6Yu04E*jJ$G?_&8>l9hT%7*pA0Y1m$IE at 0_QHjxy>2fj$0dIit ziUh1z(EsShe(mw$GBJEFFFev+*c#;`V%l+p$4v#5h*gZKNU%Zwm!91SdhVEFKOr@= zHBXZ6fE;47;&;o8BneVwBRQ|hSPYd_<0uJN{23Bv)8ljKRuM4WB=G}uXCeAxJMLp9 zPl0pd#+n|rc{J{DF7567RA6fp$Cw9un!S1QE zb}|_XsGYkmqcpF at 8{w-&MNc*Rg!~2;ti^8oi;6>EdMoc5Sy z%XT%AUWQoKpofZ=a};_BtbM|gm6*Z~b$P9Ra#EOT<2V_Y)BzK%g)H;VG)6TC!$fyn zBrXe8tKw47*()jj6q_VY;I*zh2amB`&oCD$KMfJV|XY&k2-_7i8|ZU`^L=tLN4seYoH`-LlqI} z^Z}%yni-hg2hNZzjooSYQk7;)rkcCTJt>>4$}l`1&9G6LWDTMUR(HSOMkoGAxTm<% z9hxz5xNOrBVO&%ELa!Zq5=+tjc+w4qLB;Ro$7CDB2>aQcT$73ssnqUbMZC}gE{11O z=G%-CH-9xBJfEu%piBN;CfhKBu~ka&qqF52N}rNl_RB)q8sCy;(FoPjf zbz)F?Poq20CSGOG{6hLlcZjwc5Jq0F!uXkciw~z>anQyN+_ChP?o~f)py&2)O}yns z*6!iZ_Kr_qUeSd^TuMTJ|Jo|w_%d>o>!tn<5FaqUYmfF*xmS2K59SUVZS-a!4LaHa zh4A&SpT4&#@$<8B=A at r;QwY6>AA}Ce4uu=*>$hh9RvmFW&_(lwFxluk*h8AkLFcCK z9V6Kbb!&u|77^k>V!V6FL8vf(M^O2U$2%l=RY3bA#t+3YC`auZ{73Cx;8kA_1fl$u zX-8V{QdwB5A`vvM+ at 8u?Eo7>_1DBsc2CVY9 at FY-GgH9%dI#mjwnW$PJNu5e2mLmOn z;;bi*a_#t9eYwPMUy(>1lTgx7$tsUsCyi3fjD|3_K|MRrK}|pGh(^<1aXdOC2e(?; z9^QXsRITg)MX&0BMX&Ba#!*!skaiB%-EVj45aXmx?;zi~%yrRN+`xR;=yZnreZOOg z$=WwPwK!ZIzJ!7m+(>F<*G0xWGYk25B6#(b at 1Z4il1L>=4IMWzxsS<1FvKvCt4k!Y z7~?WBsXT at tnPjMxkkqp2tFxWx1rbg`z%Wf+*ONEr^u$n6n_ij|F)uJE%LxQ{`LcXcf}CnXj at T($z*zbb!+&_a z#x5=_q{X?gk;-C0|YK7RB#=`PhUFT0U6duSYK^ryE4N3W7gI78QCPPUW%g%n9v>-_`V zIf%^HAf=WFCn0rjh-*u`Z3gG=kHRSoG$QL=dsx2Xn--j+Oo5Eh5e-U)mrx5k;Xl+D z)O&+t$eKQUH4hKmHQne at kFj#ISZCuNvWg0)(~lKbRQ!3uNu6{vmtB;Cc5=E|JLWaXgQ$qech#OdDcu8aQRg1B@==ZuzdF@#Gk!5k-{4}vbZSUhb?3xOGQ#P|_;+z(j zvzhbhZ2q~7X^||a%Mq5!?2jg#Z{rjTOX9p>r?;S;o_MKFrn|hW5G{z-Xcz*(@?Bd- zs>;RRzlY+8n{s=!QgY1?X7u$RFvTOBX~XzpXqjsT78z!%f0hEK$Cfi7ZZx5DNntc# z0q5Yspt^O(K}^5&fq;;8BwzmapVKcg#vE(M$8RTRKh04-)nBJy80X(n_F%tzNpI?c ztIoBAZ|h3?tc~pHs{M`l6^qi=ma0hd1wUt7Odz+jAcS at i#9kh- at V!&CICOzyS={#s z!F^-E at A?6q4_g;03WM#-`&%yZDd2fOVDgj?F8j~0j8O9==YO9zQ?$*irn%5~2h}n! zR&A9J1@>7I!q2N78U`tDA6DRknkG?@Sw+v65$M$8p at u^zB)NFDbpR_0(ve<;73vag%lxR`yiWpF?)o^lL%3pFCl5ym zN>{tsK(Hz?N0cTY#1dgNd-TQp0BXNs5tAbf20BCTddyG8HK*>7mmabV)wpT!sKJ(J z0Xn}0FtK&(3wreXI|A!&_?o8V`Y_7p8&ayW6Veka>&g<+7ktQog>SqoqKIZ3Y;12y zG$;Be6=E}1(6d(16H()>`&vO92!X6Ki4Isv=E`>I1DO0xCR6u`FqvWV=lqk|LG}us z4c&ux8DGMgKv<}6A=daY{eZ}u=W){(Y>DK?hK15u4I))RsouCel%=0wMVz6cN!ak^ zn!aE~n!j)S?+R~Y$-Nz=Uz24I+>ole5QJa<_G-g5gm8wr)1SF_6*aU?Rs^zL at Mfwv zMI||+tVLFcX2|uezl8b&0t3|U^Dr+0usLBX^R;x|e3_<^U%Xe881lhjkF5ZX&G*4Z zL^A-i8C$rSpL8=zMwxNknFy;EbV_uj5P$G5lmx#VU-^|JMJbeSp{y=NZ>0)$emae& z4Jw~TH^p7>!l(1*vR`aqTP}zlE?M$b8xm2Sl$wvJH-Nwn9yn+4K{{=&~>POpRB)|_6o1utC>iayJ;ZCX3+wTQH5vWG5&`;A!%6b8KqTOxxw`r{~P zzt@|AfEn3%^fZ9PZo@<=7RJE~zo7236kI>4KBEN*B#M0H*=bPGCGRmAJ$P*&+*gn9 zvnP%`lE#1!3+fW}A$ibbLUY`;-GTL3b|f`1dx=8}2LB`63eSm+Td_$(kx at Rok#8=G~!$h at W?NjTp=r(-j( zESYJ1u>IC!F5nkY+)!8d%ncq41cp%w-5vF>3RzRAti}(-#vwclK5tBZ%7zV#!ur2Bd*>iepD#PhG8lw*#ihlv&~1BzA*=dF%q2|9uu z@=}TlOog?fP zN8BL~$JfX~U`V6pVW!IX z7sB5fD5kridgM1O&@=D+N`8L3RJ2UyJjokwi$k~08{*c~oQ#B`?iCQJ;W7*zJ%0QX=EVJZWh9~1g6`KQ{c_%ZY+`-j;e z>RW=qt*&?t9l9$>wML5uaahy^J# zHH4$e{rXXt732ix3h*4SshQdJRtR at APC=J4ygvT9fj(8beth#rpx zrR1>1lXnbhnAKV_21aMi)HSa^ETE at uI4iX5vyH?IdbQ3;D8LF z5(DX4%y7EjW~;9`@g3xIKFI&Nrx1KGDRoA{Xay98AQiD+G_=S<%SD;Vv0*EKty#iuns zjcv}{flapmV}1G&vLT<|EM{aj&kY6-hWo5flK~CwX9;fd{on8!`T~Ung}m at Hps%>f-|prxbuJq1L~LmP7r^4Q~}2=%!{N|y8{0kbj~oYJGn zi~B&P6i at _`V#&9bCrQgx1A)>-id4{osnhrOUbpD@~km+tT1Zxe#PeGq!+J zPLUi2pqg~sYm}*nHMrd-fs%JKNjJ&np_i&`c}xDfw at 8S)i3=Hj$i>v-rR&DXZRSR2 zm`1Jt8E%1et|_(uiBzBsG0?|0^jjZ;nfwr*G|uA}NYbGJAg9U&$*t-P+%i?nTRuIq z`m2!UrXPVY=Y}DoXk3J8>*P&B7Ki7)Hg*Kh(w=8=?#Ui?hazIRz z6P#blqwJN(BqY-AX)Viw5T=XZw`-FPorl at pVXfGAi7Y?OgO4&+eZ}MQTt4?rVpAA2 zum6V6J!;iEZpzGSru5>9Ib1DNoF{#Yu1=`@L5gxNnM|Q0@)(1g`S9f07QI2<^se62 z-lY>qN3U*aOQ6X&D?mL`MZR`Nfj4SP2hs|4H>))zuCg`9>t>fOb<{F(rhmuufY4Us z5C4Bf&w03Nn=&vEkjsCou=)Q%&wmt17bi>FEeN2Dd at qnWAn9NM>(19EBN0eSH_SRp zs+3D9t5DiYE_GbMmM0h$-hnQHAfeNFW5sKbz!)2}x-^3X{e>o(&^Uo&2od}f)+VF07H^kJe|r4HyfYnSTaV3)F4?6a=0 zTp|l=oOhMNmKk97=Hqk1qoZ!z^2lZ4?rbZILi>3vj=g4e6MuKw3~75GMY at GzP+&IC zXHY93|A}6#E- at Ny&c}e}lbIMV`g6*Ml@*3 zK7^D4@}P=bU^NNO;hgOO=B^Le8cz_%-Lo4!&RD{Y5bkkcSbt)1hFmuDIr)CILAh-8 zBPF0X<*6-dF}$N*K44rAfa%x+qhIc&o at ER`$5cu@)t;p5`% zlCGys4tqIXlMwE8sqEFYMn0!I10ZthOK%Yw6PLqrMV_?=kV%Ap-Zw;e1>F9_9LEHc z;==1MNC7DST{Z6i8L0muCRM*sM;1r*`l-m at T-vhzW|cLk9?4kC;O=?v zaJ%keetr0@?*}m(h40I-4I0i_KI9!jve6;6cwZ(* zb+PTvxnDtP5)m;vK65s^WQtTHJXBJ)m at dJZD(`PRR>!Bs#J)ks0W zCErNP-%KNm^w(GTulfjQrr}3Q&eZ&j;c&DxIa3vmuXyp`}tDj9$ z)VHgcwkEBPqKemxoGYDau+iSE-zCQ{wat#Ln)IL17wosDs+oDjKmT^prX)u at QrjZc zm0l+tRc?_W)f^GUasS~pZYU^jWDakiQ*cC}lC%T538|otrqiujZP zW(udi!w`>;B5n1^T6n)*pw0D>FF(0hWs=2`LZY>du96b8F0ODz1!jGLITh-VE&7t9 z8Uc&v62nAwpW9QEyLLafySfliSLYd`gLJ=_d)|4Wc0lSasH>zq5;HJchYo}@rJ83{ z(=#;C%4a~Z83X0MFckit5mer8bGSSh=s27h6up5`zga8oo|8A>zBH8no)y$izHom_ zEAbwk-IIY;bX)Y+fe>m++fh*o-d$kTFX?v%Uxpo$^{Xa_f5t;Zt131=zb zAHQB%l8}L)QYR}W;i2cA49nBA4GWaHqO6j&U4f+TJka#hXQLyW`-ADHOW|Aky%`i< zts?pLv7#iLdY`u8ioJC62v&giT0n>Aq;dD0Q|5MPJf!8Z?Rm_XylIz*sLHGi+)Hki_ zj`!=B&$8k4&ti~0Z{vo1xQ=jA)5tQ=NTR~FR$RmKwZ at V-aRp8D6Y`_U+9S}uuyyN+ zc{S_F`*{6`5TC>qAq1xkhtBXjb|-W2HFYpwHpmri;1ikvjPW1<+jEpm7x at FMDWq1I zvzAq~mer$Her|ICqZWXE7Ufk#+Zxy|ae_ti!)>>;PwWSR;x{pmkXn|@F>x?QrW27( z^Dq|6LJo7f+uyFO)m51j(TF+A;dsA3SrjB7_8WpGmYc at +SFX6OelGnJ2hDKD@~i+t zHLEpJZRD_n)|$-Dvtz4GsW%Xrq;j&MJ2WkatOLL7W+lxSmi9=U~wPQ=Tn4vnh1LKFW1T;ReCg zwc0 at XS#1UjuTl&!OP?+RuklMx at zw}-CgZ}FM_y3LBzD-MW*tX%HhYB7?CR3NHMh|% zcA;#Y%xxUx3&n9%tUTw}O}}A%V2LUVdVQyoAS0)&(_?mh0y<<^gI!6qU4-+O;1>a| z_RN+z%#pAefKP{5oaW?ExWS1i=J31A<8}5j8$^HOB;7T1y#YQT+j4ola;;ftqefj} zYMKS7P>9n=pL)%*Ij~u1Rrg4xA(ZgT)-}M(Th|^18EwYNeeP1fe}b*w1kGf!4 zxtvSsf^?(GuUhT-AF3ksw6aj at zpP#FFZZJUzlJj*r+)~CQWRw6ff-S z4{47KR$hKIPPIB=UVNis>pvCD*E zIND|5D;nUHd6f_~M2g^44F(rK=+d#E1&`nC8 at H32f$(AAkz26c;(;}$TufxQmC}vP|9q?jjhk4!f88zmB;|RG3cn-|+ at O0s%4ncVjMT`|lR03IJ#G z|1|4T-H_W5K;+E|291V6(emsO(mnx})AA&SEEg3eDE@(pQXV&~8B#nPWv$%j#9!1S zpr3D9Tru-mR?*NL0W1_l3`Us?aGlOxYbe~}_w)MzR_N;t6`VAeFk*vHUaJqqp*nwH z2{YrIJi5&$>>$wjNyAhW;~hlUK$4XWXe86o+u7OL-!5r7QZVi$vzf5a$W{0r>659Y z^#*4+t*n{oA|1K+kxNjTO6 at R}9#0*Rb#yD19(HKOO}G0rSkisS+|+IfygHLg0fgg& zZvF{z#)OX5u#*E$wvY4NcZWf969@ z?Q_a&%jKeA`m$K8mlw)ea!I7nQ3pMsXEX9ZhOIt&}^bS0 at Jxz0MHnr)&Vdi&Qr}=;kwzY zj|2;$CGJSW8l4QC4R02}4}^zTG=Y#3_q`6SNl{ERx82C6O|S^+C&?HGLY=Q{c|L*9 zuq%|fnZ)A-5_B=PGJ?g?Et43W zZ7a1H5^y1-Ag*W-$|=vW3fZ?Sk{%h=)1jUhw_2GmTRyPY9Y|8hli4f{@HU5`NSs2f z37!Dp6&|Si1^x4oU}$i*arEzY^9B4bLjOO~yBMWD+XVqcp9>BLLs%DWb79I~#bhp2 z!C>l$5EYAl#=0fru6;EWMu9Irz+2>+@ zA+m^YgUz~w;y*|@eC6O$3DRUbGZiYqtxoZs+=XA1A^(+?5vZDYbL5i){TZ2-1W}T> z$mKz#ns9Ugq9~_wZm`j(i@*)Z!?Nqy8kQQS8w`u>hyE}t76pjoibb0ek2)^=+xVA) z#9<9?Jw50iyAMSPp~1gf1pJ(ZRAKi_Ffp6IJzN-H*D=$WiI<=^M(+Gz%tKu_&)_j# z>0H(nxuzWHPN<7<)%BlqdobR#A3e_>Gt+lim|1`BQQwa0laeSFKtlHT=lD7C_q~~S zkDIN!e)C?YIcX4U#I%zFr-K2G~<=MlkR;Yh at cM74j zK{AqU^m)wrX}0Jm;NyD(JCFzi!zj+deZ$@JxDVTmLAt9^Y46;! zhrBu;ry5&TR`XI8>jvT60aH@@t|%;MpHJ*8WbU8rS4G2HR7R)S^|+Ob8rcn1QE79#=DPEaxsv{fXHY4!x zmbcoig^tZo=xq88U&vKj3JpG*G95L0A>FA{ovhe^WW&>g5o|dFdM$G69n+Y&%-l9} zuvGSA4qF2%lG)qcMa_rKHXRlt!@9+?m14>wRSV1VpBlxc6r7txHf}T%w1}tRtP@#^ zve`8(JTs2KaOl?&Zykb at t~2-8F75F(8QsBEdkM0f!YHzwkv-lm(>o5MW;fNtON6I- zwaMll-Dg!BE6~A(3v^~`RH-*7VWFWcB&ka#8Ush)?>sh{%=}eiM0FqOI(R39EvSlc z8FNy+LNUg9=AK5<4U}kuIxfuse0RRy{Io3rJu_p}01?m|VpsrmSj%HXX>mplPBucV0>NH?% zT)r_oMGl%Hc6V(0Us}ta)NMvR$2UMO;=GmnT&mm^MSA6$DQVKS1TWR`R8&9mi^NEis&aCt0+%Mh9K*x2Ed at kDi?bvWv zIK`CkRlcliHhFI}RNQ4xBkE)Eg}%5fPs9zPw42nndFhrU=$rU#lF!a~6~1;`rA_iZ zTR?IW(vOo4naGK%GGCw;}i{A9B^%Bu+``I zd_c~ULINsBVKG+nBQlGW8e|#y1Ov#+_bIOj%aF*9C{4WC`2>Xrjh*+CUQl9i2wX}X zWn0BsLubS!VQ}AA{DM_1k;1-uS%;d;VPW-zmnk~qHakvRgSY#466CsqR2=PHoG@|O z^O;xQ`C5 at W)~W~dOc(P2p~LBU!sDvMD$oBY8JH93+g*Jk at xLbEJV_dTtVcSec&rmh>>?u!_$v4bpjT+(1l5U8s3u+V>U zzCQ}>adoMOo%eVT!F}UwjMu){i(U`&HeDxDak!Tw8}jM`$+*p(xpPg%;|%D at F#k9? z12R?V8P}O~xkD*&)G-s3Y)6DE+ at Yi{OE&q=u}v?GkN)=W<~GM?3fwH?M&@w z85Gr*Dt_B7$@>TYL)CriB%)2tJL_jvp4-yZ40}+kar-hRZ0u<^QZ;q&wbAV1{*+&b zIWfu47&2QyX+;lS7`G#Q;nBQP?i@%5j0RB3dSU1KbeH4yMbF5n>mJU-s)uI8_uuR&SnJIJP4)hxXi7;$a;E ztuH!7rPFSLbIo>&GKoe-BF1(} zIw%{h%g6__a3%DIa;1NgePZIO*W!6RE2yW>FIKo&S%J=mC0n7=V>*azb78{=) z`2C|4HW_skgXb at Ui~q~u`2U+19L!v-0gjS3HZINpLu(URfIW$fg{_r|@&9g1sPu11 zB%;rek$N{u-;Dd8d((4Md1f7 zJ5#+KmWQ{e58z$U4Z3Ar6&-5^)9vph at 3TZM$_ZRdPlUIZw9FcWYC`T_uM9-s zJHL=>zLMSykSba7JawGYZbBtllGUXaM!BU+xN at I5R*gA6AM6;C(S6!h4a?~6hV36K z-7utfRB-$WMagBc2bmh#?J4yNC_- at VgW*kJg3ma$`_ExlC_q$9w at i$4cvMvsogHuf z>%??;_s)s_os?hTKtLk@^2Es5*{Ya0+E~~EtpB&!saCm?`!@%W1^IVE0xE(Ru)s!9 zozHS at Y{{Uy0z+WgZ~2KL_{-_UD_h~6KDS#`mbvto0f^gzXgAl3l9XYAiMR}}lj|I( z8D3`Y9^da5s9nzHdWl^{aEGeWJC2ws7HC)~(rKPh9o-6KhsH{tmYMk9l%$&#Lmj$v zCJYxgBWzr;3w6PQHCGf&sif<<4g_4?LtB|P?|62a`?&nN`29?nOkwqfttTCU1zem; zZFOdBnWiC#$|mJS>Hu at p^O4RGxTwn5yKWa5hU4_n!^;iQFG zqv35}JT&)TY?pHl?Tiy76P41I?+!|7?jd{%S$3G5=MhG`h3qTM;q3>O0`S at Hk|Dac z*k|1~wFu~i|F#;g<4Ej5IogT1Pb>VuISRv3Ked8(gMf82FK$RG{vGZUTUH!sz at MLt zfDE3DCQj6D4(Sya9=z?t19>T21s}gWs#nM;KS#nAFK1Fd4PKr0&kPVCRBT1`7pAUY zKtO{3GED!E7~S}{lrYC-KD~&t3#hnQN1Bk1eSnxFCb)t?R5of+%y*}iy5Y*R#qqN2 z^+)^*l<$w+c=uh97mC3un<|Y6MAFgw>6goljE0d^zmJb6Tp&Gv)gUD6%vzIv5M(^0 zGM2VO#VCP+^W0g&Ca{$5&t|{=&e05!W?kSTU6)Bn8rL>s2!~lSK-?1;5w-4-;@*7x z#R)8p_|1!duTWgbk2IA=6O>rUMQ){fd-d5q|Gg)<73F{{>LVCaBP at ytLC9eb0f?&ND8A_jO}+$JL#=-kUsV5HG02enT$e~chB_ at hk*L5}Z#i0 at lb zs)`WTkaXwA46Zw69q0QX!W3W|9+e(%S4!S&QEFTuNI6A_0=|!|n}|`v at Vo~8VC!co zJ9tH@{u)MoY}H at wfUcNTFhYA zCM<0YYD~{++jB>_DQLHQ(U(J1vD~&JJZNYRx2lzY{=>Ge9=_(_<1YZc|0bL~|1tpo z9eB$B>l!adRZTB!H7s~T&_b%3N(`ghqgQxgLr(2ca>o#%X+$W?V;C~90Ypu12mM1S z at RsZ22huD%EW?nSB8>Cp$Lz7IL{f}lYV907eW_|Qr3ICtyk*&~TvH4v^-+REfWk41 zHt0 at cRhD5>@(#*!JC3QjE}d~(!d@!fySU_#ZxK2sFieTfRSi^@V24#^e`7|?veZk)n%T7IhBz4R_S7q0PDWSHrx3puKtOQ4@!BA%}LU08{36@ zmBSyx)$!>l=;L*TJk`b*V*SM;Jm+JS+=kQxF^R-?8HUc;Y%PvTYk0r0&dgP=N5l^? zw2o<_ZrVF at 9^6y)GP$(b4id7y!br%iLZ|bKcr$RN$zH)$ph>Bz(Of)yxA1 at w#-OQ& zS!D={3!p6E{>-Xu8k;|q)c~-Vu}m3D_s~pLCaqdy^g`>-I|~d0Cbg=8VDBOgBoT9` zA`KanWyn-%5`Ug{^P*{syN;=QJF!!BB9rePs>0a0zob`f+e>*e5pz07A`U#+4^C9^ zjg*7vwe(wg`j_B)^t|2xfRW{;HuJUFZv9UB88n+9PYZ86tk6p zf@|eGH=}sL<9S9~hd@!NfD_{rSRdwoNt~Q=D*Xb!Q;@pH`cZi|V;-lhp0d at 8r*Z^_ zveRw1L%JHF<>?m`c_Xq9A^1_mzeyivo;+ at KIs&HS*xMnIIx!t8rh8x5D%8gG%7;Zg z({nzJ(DvYkGkGrtZa);FyqvATS<75mYw7P?Ab*%o5TD zCmVt_qwFInZ(pbq1s`UjiGNS3+HtQRp|&$8m at puKsa0YpcfseTjnl{Tcp@(@4=9=t zd5~h?Py+Plpa#&7=rDr4#9lHI8E~kKM0?SG*dTRvHq3o#59K&?nTGs34q2Cl{Co=@ zyOEm*AxY(`=$f>@e|q4SJVhdGAWDl7sawx6pklOEerd>*C0$Y;$zP0BkzIX`#vyFSlB4u9k37SpsaxazMQpxF zQl|v%^rienn?YEPtIbpaNUKs? z946r?)3LqsFb_B>4TE$0?HEVI0xYsPV@A)GVs2i=+7oSqgj8 zVh){dxF0u0=o#_1-{V3UsRTY at sOuhkB<#!Q=DY36)lEH4Bx{uyrf z!n&5*F0#cacr0y7;GME at xAE5iInVQQ;{up20S`66S*14jbyX7=Zgze`w(gOiK7w-kBW^WQE&rwmPA8N~{3XS(juji^9;=pdpD9VHeR zHZs4>?+XWa`a at f*U44tdyQ3ifUVM}6E?_}n2~W4SEHhWPjA7!W7-g1a7U^cA6F%%Ui>y3ko5yN at ma;LYGOp2l+7JG8nb}_hun2C>m)>az*h~f$@ zxWEV~FN_ThCB>Dm{RL1RQLa+VD3WF$kgAYnq$wpd#&DhCrNLaHW_n}09jJLHFLeahv5FLy8 at ngfX@XfckzDq#7 z;CCroNtN;vIe9OGt&Y-bdU2&xp>|YEOt}l(=S%o{A?k(Q9}}9 zD5o?8%__?)F{zGvC)lV4_e;WOQDn%x1^JN2y5U=Y6qIQGbiCQj;5^x6X5Qle_RRs& z=tYJiswdhXl}sNPz&IuiCgcw46gdjPKr?cmM4W$R4AQB|XxCw%YA+d0J}(gzTu9EO z?NK?GjnO96wOjA3pzQc)?IpObbP3v!l?G_QH+Q6Sm!Ysh5o at WyEo~cXOoATHsA2SP z91|wQC94X1Y%f+uy6nm at N2g3-tx#<$<<#lJZrm(^E2_0Ft58TL!wT0mvu>Mn45SzU z&*Q=VVOW!Ob=)MPfeqGptk#4%4ZkVBkQV-w`6!TS9z;~P8QO2Q;3PAn at AEb}JuY~g zzWQ}|Lx@`$z~00az9KVlTp at TYXFM+cL7c{FyLi-f{?mrmcxM){x>-Tp>}2Tk04v#a z7pUDVbzLz|-a@#}EE%{tB&)r22wyxCnG)lhJ|(@_^11N at U18BUDE)4_P(dlLdO}i4 zfBT*=klf3ViWJX)GT;bItx+1qGFo1WjL!!`Y4ZPwI1h7D)2z?d6?dVpc+j9AV z$vJ4nT0AFl^6-ig2`l^v%TE!;9cq)qa2kOBxZyuj927fkMNFW7 at tK;voK&54j)u7m zp%$q5W`%l&pAJ}TLqkDkL5dei-e(Y_z%Qbac8y7- at 0B0Mm9OkGONqa(?2}~KGAb+oC-)|` z((@W+PH*V|mn_02Nn~>vcc;kqvsbss=T>$HiEuNDYl%?f6q&|dqfq;Bh!@{#VkGiV z?&rlBz9084k&pdPeXUWqT|T^4#vrIjW|g>wmUrmvnbv3R;yW#sw|_WtWsP9+;lls{ zIpP8VG5 at Oz=s#qMnic{$N0`3gu5JdJNQtcx*aUs?BK0Ji`A}4d$;1&P!Gr#*@oKoP zuXI$-Z=Ai at pS6 z>kkGQa?!+kmjgvr$Izeb5uy^?@Wpxzi!4Xf~64bfO&a^uq&9vR|bmz{@v2VKn*g;vai`cS@ z8gUyu=%CV5x#I<^v87F%M~3FHDJdV(Cek7zEUCGA>yzUxC$MYCh}ItHr{l$Am7yg{ zLqTyFoTQWny9!?CiDX8b|Z&&Xc z?AobCslo48Fz}P1wL at AAhGdfLlQF;g#F{AzM&M}Yt4EM^x;m>TiB4W~<=QV^ z4fo3N(kx)*n=$659JLM4SXzD6z_zmP{@UxSrlF65d+B1)us>!;(_jf>iur6Ofd$JbUAY- zP>f;FTHDDQT?V!~WQufC(1Jlb^lZ`%?^&CueC+(I=uxCJLA1#@s5VyV6p?`ry3$hl z2y8*V($U8=kH>WSG1&iwMStd+$^wUY at Bb%qzZAnwrIZw5;4a_s0M zSj{W4D|OrxT1FuzZ(06ZnyZXZ->4nRrt{(FTVnmYeY#pYQRkAp+s2u7MPy2(K at A#M zOc=BCQ30_kBt#rhr%+KkJzNuA)nloRJc3iOn1pYKt_iEzp(!${#)WC8$7+!LYB7Vy zrvmr++0P835Jsj-%#$K5E`;0Gk31){`*$hcqRvUbaf0H6hy}Tmh;Fdoet>;NX4FoW zr5_U1t8P?L%IVWOy@|r- at CtXRsm;U^6-rROqb^RT*mkNMlN#m7EdTnIt<3mpTCJ+s zec(xiT0s9&a>Z5}Eg=#2FdOKg1r-r;)`n??N!8J0pde48rlzV&89u$ZW=zd$mT~L| zUP;DMhK98`sR`0{8TG56LD{r zvmshX4ycAmq^&yzGE)u9yT-)A+Cb4MDPvKr*1us#tqC_+%#wIW(P&-QJm#q zM^o<60!`cTv}dFPkj%s^y|g44+;JmlfknYN83BCEJZizTPh_loIy~|tsK2`){Ce?K zKgNRi59skeQ2mte+z`G3{5)?3HwkGvMMph)6duvuPO^jRu%_r at RX(Do6G??9s0NzH zht|m^R7}UE(HlCuo!@=7%S9vQRLSJbh$^fc5)-O*TXf!5Nwsv at k9gf<9&M?5W1}bow$QbI;n`?NYTQtk|Z~-{tcV&}Hmxn3Fs;N-0Bp#9HO$ zN!&6$8w7n+)(EaPM_jXI4c}Ry>pA_ at Xmb@>pTD77|_ z7=9R{vJ^Ap<$r6{cNp#~?G!xOdNrNS=$(I%u0yd|9e#D?v>OrH9K~r%I?$!D{yhMO;3oGL zN7!;dNY>MHh=C)Xpv(krR=A^2Wk%;$PV9_gXl}g1;nt7Dm+Vl|2ZD7lXSqIBxcT|$m at Hj=LtZM|NHv%g zlWaM*vT*;LFrA1hHvz4jN?Jfq+b6+2%E~ix9P*%x#E!n=k19PT?9T`U2)a!{S66K6ZdLxF}^mCP_xm5zDH^moo{U3g713Vy-+PRx?Kf5r(iY;eaZi+E8Vc3Gb#_!wd4+3wg< z=P;gyo)gx)DHH at Yw30qKt`iPul%swoQ+7#qYsLjBWJMyle@^0+)06^ z0%3W+%Nm__hQhE^-r+O6Udzz$x#P4X?v$0FB=;kkgOsFW7vjS4`?)0Vj+bo;I&wD+ z^H!s)2(e?q--VBmslWelS)OO}mC9J9+#6=c?q%UlO8%Bb>WL-<;t>fJ8@>LSyssGg zZKN at Br)@7&LE7JzED`CvZ#=5Tkfbkh_mEz at O*`QC1LWKk^Gk)ohaTJJ1a|Gt at NTwP z-lkD at ycciMvUKG9g{IDs+R6yE(2z(cDndz;`-k=+f9yOj4b6mS?5|+WBFBE=t^3o3 z#rq7&1U+jQN5?Nc%_SjBFQ2onRA*o>eDP|{6b-%_kqm`>9;!N?EF}7bqlr?5{bkJL z)|53Dornz%L;gI`2-E|qWEfI4r3louWcM7JZzpI{+q6GC9Y`$=95K{)KVn}z0Q%LV zf&0#Fekhg0we6?virG6~kW^G5=y8Tqs41fC_7*5#P$tH7>Qd>JsePq1c|{6s)e3|s zZu`QRlC7IcWn~fD_N!<+#$KsO`_!c+Yxk1VN7=_Z(<~jdliCYw)x65C)tXJ(Zl;&_ z>GC)AYhd%2kXMky)P+N~Cg2?%VBAQ4DEJdXRj_%v>C+}#&%CYb-TbldFLe7E at 0@?x z`q*dEzT(spmuar!Q>H2+zjBQkHHmMB&P)}t at 0QNYWDg2oH~W28`i)jv)~+}HRL#ft zKW at U2-*7vVL4km9{&H at n|0~}XwzIJZI0BsQ9RFRqW?^gg9}4PJZS_qRl#y=$T>v7N z#1EKiuyv(lwRx$gahY~9s3sL^y8Q&jy?&d4^Nio$Q zK8Z5vW1!j^GII4Zd|uyAN7;vYe%~K3y>Kj~uzTIX2#RQReEvVIVTnRzp|oEl`ax7) zbX5nNgK at nl>GN(UN{L)Wy~zYBvfd#k4Pz~!FzES><1*$QS#&AE?gRY;B9|G`7wT1h zoDio(E?EL1Si)?U=F__iwVF+_HmuyhAfLftQ)C8Q)AueJx{Aqmzo8`1ScRQZL1l^x zbIe>p2c?hkJmgYXg}2PFR#Ym-Ex9Dc#!Yjw8672Ox*4unShah-GlZ0}O4epoLu{XA zgTQswFXX~LWv$};W5fc)cT6sC^KI<+R8rS7S}}0r*{2GTx)zgyIQ3P{#Dv$Xcu59A z^dwDV9LL;ed6iidkr9a(R4Q5E9%q)0GEEsSYJV|RZlf at 4M5ruZCUr{u&4bVJR`Mf5 zSK1PUWF6U^NAw*K~9u z|7;jKkCbLZ1AjPbiKLFgVT2xDfI at CkCtI@9mML|`jw%C~u3U+UsYouMLbW=yn~pn@ zr{Oiiif^d9v1k+jqMct;hq7B^kO|{#oV$GL{*VI%D6E;EwdZAjku_v(vqctrpuXWY z?AxO!&p4L^Z6(boUKzU7v6mEo at 7-(zZ);7dP+ceF``i>tpf;E+EqP)6KDy{)oOy6T ziNk-)yjz9opkBB7i7}F}F at BCb(sXH_tGssYAAVOTKFsM&w-1Ag^9`VlNHnDa!lba#{a`2lJXbf0d6Pt0sMASUG#H#BmInN7HzU*OT2Tm&RLU! zQFDd0rsWpP6AM4Uv8#L;-zFX2E^@Zps>N!tk7+pr9euJv-94n?Fc>+f-R}IbwvBe$ zs!TqWHVW6XRN=b#L?nMQ4%l}Pax}Xa<4-Im{K5fOmu%Q6stdRe#&L|m^KZqIM*wIN zN0g!`o>Sfk;k-LMvNOM=n=ID5InMMKJYkksY&UxNXXFcW;*foAjajePEz^FhP^y_j zK<;oCt2+q#R+`bqiOR~RGXp!)?c^-(pR$`ze`}`;$0zhbr&s>?@I8v#Y!Y39E6?nw zN8mW7xykkirkZ)(yo+}YE3Vm0n8ss?i9(4anxHCqzzd2J-3(_gF{WwjavuR0ERy4B z#{-guGqc1Gkd;h?##l_0MBUOGqPRT>tk-sw6ak%Q&bJ47VH0;`C>n)wJ6E7$;Cz%R z`uH`_wsuML9D#D6aH}p<^DbPVEh0=C5ByVcd~>q2Pt1rH#cMm*kKnmY7}zSOcAih) zAZHZr=_L{q7-J$qF%cBVHi<5`EP`v$R zyxK$Gn7K9)bvaM;z^v`Bswfr=I=wL$Ixnv7iE_HJMymw)HuI?ah4`T*^?Hnl2Q4Bm zZ=F6~EC at -n6kq&H!>fOk4u(^9`w?yn2eTT>VEQnRbKBya zrWx?_>~4T!>r4v6;b2@~vS6jjl_Z_U6|9 at zV2fjY5n-2dRrWn`5JVhjAbzS^^5Wi> z%^+tSMH!C4nvB=3z&KxqX at w=+o?%&uB8n0*e4)yRDTUaCI%2`(B9^b&xL{HVpHFUK z6hGzQkq5NKXVf$p;KsfLGh6S(rXJ zuemA+WdNRc(3x8^I`AD(-`InGHrWRQf9f_vH%dZ21|+`*N7r_KLq8?9&_+soI6$CA zPJ07Q)Iw2fj8S90W(U{n4LoeVEjs0#SudA#u;zF;=k^>~3*}1=F4K>JtJS5>s63n+ z`T%r6y8j`b&^uhV^!^)i5 at CUWSpTIX9wCeWJmkqyvr@)Z#qec=(nLxP6c`Gmu(1e< zk9V}Nf%>H*B}!)#P@;5Uf*cDtGaayIGx*%szqR at V`J6}KGAdlc9GUq7`Hp_e-l_#1 zb!MCXAC$dglqTJlEu5}orES|*rOis)wrxD=CvDp{D~(FquC(pU`<~OMzwUm=H}2^h zKVs~N5kKO`nhSfcHRn{;*<082UCv#O^JA^Q-y3)@R~1)BJ(dWs-AH{1Z^JVe(9~xR zfL`_6NN#A8qiHXP?s9}V2tm`PVkHvwNie7p;WhYFwhc{Xy at qFUU;ua_}yS`2El($D3UP5aRnV(O1XYb&$tBA}fYs*gya4%fo zf2Z}hGdWgxitQ(~K-1s!+qU8e=Q*FGP+hk5y`H!yP83QURHsTj5ZYOQ&AFVbwa}8g zqZGX*14snrenj*RyLP6*L-G9HDW{k?bF1B?+Mc%^F-XAKQxx*>2vOfSSmxm^@ZoD@ zxhSqL*ABhk+#oP#U4=4kl#{%}B2>$^v^bi at vnIDiqdt(gUtJ9W3< zG at A#jv%%o}pwu;&c;PrdJ#f82&=sX?J>?EsKH{BTjIgCN6ynm{tYS(ow5fsq;ko+( zi*FJ(y*CYfj}^0V+-8Hn9VyP##Or at zvF!`r)MI>`!2h)!Ms?=bHTejV_#+6zuUC8z zlPY3175XFcdd&hoo%!SO8_!gEKvLTYTtl(nz&i_kZEx(%5 zPvXrjGH0q=bVT7EXPB3c at n#uL1*=bN&>>wq>>17tl5mfo?$%+`{7P4ALTMek5UWTo zgqh639rD)3ZimKpx25a&d0gTTRiVZpHyJmEc;uaO^za?CI3WSc1*y01A9g}+`Jz at 1 z)XU$pUbMki8ZwvP{Y_EEPz_z%A*52M0qo-DmYmT-h=($lWl|~h?dZhn$Mvdft)~yw zuNDUp8AfBI`l##@aF+84&)E5dzSKY69r}xx`GRqLPY1(`Za21euo&Z^?0DrnyJthz zGwD2K9K|~}YufSStSXP+L9-L`A~{z)q1bQn;;*BWUFKa~z|D`L_&TPzE2bALfQ#z0 zu3EnOL=W*9pV&S-OO1aeqBDo2kB0=j6Gf_H+l1i)SD4T7vshO4x#KqRE25P2us}@9iRof2?+U z+aD~g*B1HBF+NI0N9S-aGTd?^T#|@-rve(38X2X=(J?!!DIhw4PK2mjO@)7G2SMT% zzQ at K@)9`qz9Q`2YCj- at kSbJW4F{e8HZ!Nu=%J)r<*ZU)@V4+d0ik7Mc?4lQGv2t_v z_E|*>V;1$Ql>K6><|1lGt&~c1rHm4^hi9L5n`1nR!mVWM0S?ii{OxSZ>Xu~N662;n zd)b3VKjKML>?dci2|}G|Z!7SY|438&{i+krk5H2_VQlJVOk&?E!C-^>s;I(N2}nJ5 zNTwIL&c3;XVlZf*EU}(ipMjB_DFSPsiH{M}XDXsuJ7~*Idt{7$*!z at e( zk$$>Eh>au%IAp-{B?JK#xk%!fodu9*x}F5 at 0e(b4_-^imjWya;je9`S8}$A~6}Ryq zqsPo|Aa`b?RR##GeT^nwdK8QJbK*}r`xPnxhIPd?M&KorXjb$wD_2+BbiGG37GUWU zte22*5b)zZk-$L{N{V$$+e5Z3743=~KYCc4b5}F6hBuC+9mJmcix<^x)Tznv<&+AT z-YbMxnmi)ge8GO~k?qhWpRkNn&Ceyq!DF5|tUSl3tMP(nP140y`8YK859R5$ z`RN}_Sbh5fl!o$W$M88ZT at _&tbZf>#MeGZyJMDR=B3x*@(q`bjE3bsKgA1x{Th`{d zU{VE&`*7niWEKMyl6!{*@i#n^j$@A71b#X&gmI|H3wT?EfE__N2-}zlL6L5DiUiyG z*Zt-_>F0&;OQb zR43{FLkI(~4f^|N$*8- at wg`rXx&(6zfoX5Sv~^XN=|e&9I0lFD z9rTlGKi%}FL4;;Rro-X+MAtO8^Aw$cpWoZ}yhsVlB1K7KOtFJa8PbS^+e=zyHF1T! z1i at rtKPtHs0%lRT&QkdLj74O48CT0l%nv=8m0FMSy!6G6#lvCh)?%+GO5;oI6Q-iv z$EnRI%3E#$^BJI=@(Oz}FEFq9!)yKYM0flYN0_qJJe>^-VA1*NSi9_wK9+d+rT85y z0pBp3!JS&Vz77|PWuZ8u!P=?SKCup2%R at t8AG`*4qrAkQah6 zG&pw3`4(|q#JrIz8>&@TDkgrfdwF0P9$Wi*D#C%zSkSXZc_$#v at T~SFx&esTHmh!{ zgZ=ZhhV8yYF}#RL_btc=5EF5*7Dqy_OuQAbn`6}mD;tjc^~>y}WU+O9FI@%G!xlwJ z4Hm)D1jQrI5b+F$z({03)wE${IZoLO?hW4CS;qz-tbsn@*48k0=`0G9Gb_*WulGSK_Z_;2_GOL&YqOu1`J}Z+N7#8DW{yD16N=n%; zJ~fSv{qxtld;LWWuf|Oc!(GiSOTw?enQBDyzy`x#rdsiDbzA;ss>-HLmWDQ#UZy7E z_D;6{+4Q3MPaUG~>mW*6>srlL+O%p|bjnuI zB;w(%1Er{%=wx{0MA~Zpd_5U?Q^~Phpw97cqLBvSeDOomCYlKVhXL00nm83+y|V4V zA59 at gyzn(6xu)UY4?TzCjjqKzS{#Sr#}B06RI*?uk(Ly_7kN#|qNw=wIicou&mFQZ zhI2JT3=0y|g<>oP=CciuUVs<8zMfUzjCC@|Dj~zcV9RJcBv;ZGML{+h@&Ne#iC=s) zu%{s-%)Rr9!t6^^z+drBI#D4e+#r8mePFvlY7J5y(9|!cr#|l%Y=%g8MFcW&IGzv3 zLY7Bq&`h`w+oXxwQhK%7N9spct${+6g=*76`dl(bIk~$$Ya$srMuBI^QL1f`2iIP| zcW|Ddmqj=tc{sT`u}`aR?=b9~@yoJAX@;&Oy96W}s?~mxJiIVALp9u=CulJ%jk7%A zSLrKt9@{vi^lmEJqsriM#_v5b7&4pC8OCgyDDLvW#q8ra{rcNxV6EcU!wobDh$6|q z8)5zbE6FCctQGOivHdWv<_xCWylzG%q at 4{WNzGH-E33dLAJBybcq{cJ$e{PmOg>89FB} zLN$AS+_e97<+*kAv2`_k-T9^G3*Jl6g)NSz53^T^+_YShw!^;r#VdUxH%H%!1kHOl`Rp(Rp)R$VVW^%x-%a z%k~)*Q{c}YI)fkDU at YkhAlKoHn?VnLPYI%0_R9(>72O7l`L-m7g^-y7(d5n&vOZ9D zc=W0GUbv5nD*V3GdC8`hyXXiF!aK^$YHpNvWln&NkH^o;z~cDXLgC8b>tri1KgSUA zrq6^UJ8jCWR9QS|!i7U5R^_*(Rz#pnhs6mhwMbq$Y(MFti+F3Kr$}Gj6>x1w(^p)f z=zhXwZ*)-8DzB#MgyOm4JSiyq0zbJ8?RZ>1f%75QY?w<&Rsrkf=V#Rp at x{yst>rM^ zX$P&rf;eJ%p>hBEuA4vy4N9XYQ|5xQF%JUMB9Cyz)Wt3%ZQRK?ysstQ6>FyUsk&T^ z6Sw$*31nX#dJQ#MN^M+~_sUw*%X{K2wGd zpa$&(Mu3s&XOWw(qSyAEx)An)Nmqwd$~P-KqAxr~_*oijBv0yfh)q1Ww4kz^aWQ5Q zd4uz7CLEmJAuW=NQn3Z5B`A1PktF)8h9xgHiuAv|FwwFpCyEL7pl2_?tzWjg)8E)L zxC@>YDP&KzGURTMI~>ts#i*t)CrLJEq%&9B!PcUFf4?|HL4u$-X*F;V2ES)4zY%2a3T0-DO{Aq+8BrGQbYkiUB$ zMax!0%jGxJxT%GdG`tis>yT}E`{ro!tB9q32M9~e(1m*gM%|<%1Opk!_DlnO*a;X; zsc)M(XuT5Q%Y7QWeeYTpSjl~&?DG}UhPo at d{9giDn zscy=qOUS91SF%`P?dU6Mt$X&rl<2BUk@?fvU_+N`Y8aGC$(5&Au8Y2s%jVMk=xe1@ zLPjN9Bn$m}|IiAFybNwn=FH%^Qrrrf4d?teW%Wq?wt8#BK=wVS^|j#yuY1**N6q1~ zR90CI(>Cxqc0Ylx$BJunyN4SOe z(@?gbw?F&vmnB7|xnqY^`*t5XdDj!`=AW2DpAO%(y%m~ueNGQM8Pp zwPzZ#Is`*KjIk{l_SRX9)#?T%ui%vZ5PrQZCT~2>+Sw at 9a(t#eE?! z#kk>%l7yx$V$(BS6IGbAO%qi(iInxqhHi>~+{7<= zpc13{$i&ow%H?r~Ylk~vK?Fwfu*@Up3`(+zX!B%4Y*Nf}e=SJ?)xjotEz(@W=W-KXB#V)W{`6#PmoE}srWNT_K#P44d85| zONMxk4Mv%Q--M%}WA%jwyCwf*>kTZNQ6Xe*S_AoZ{d8~iNxYCV_kIbw)HxH>n=8(9 zWBMbw!ZHN0SP$s?O#l%KhR;XdMWFcnOue0GGMl~tgAVItU?KtQOD5aeXMHQ)T?p9eDlD40BS#yb;bzBlgX>O z6q*Qa0hZIwg at tK35O}_ at O{*1SckHi3o=UGAS09FEBM}Dajh5BLj3v|MkGpnM|W?x$yhZAm#M< z at j#YDeL+j7yd=ceQu%rBAjTsT*D+XOaOA*;>*SA;vH3fsjRVT5ZId9Ro^ak;%&&H` zdK}XUoEu_wBX%zZAf+0rQ)gz`Y$;Mlh!^SBt~8lxC8Ow$l+S|DdFiK73Z2n9S9P#^ z2l1OU(Eu$`_E>X$Si^@gZOWpjjeDur#&m{jV}pP1^=d73*`#ZQatnbOuhPPLP(w zu61Szm#A8jnw}vEW6d at hBlP4lA3rUdnzb=>4|3 at 3!>{ix>SpL0d(hH1LiU?J?E>ci zex3T8nU{K}vu7Stcppx at eBJqez1W-o_&6Jg1~IykK9$kKXlZZutV54+Moce4>?Fcn>&;xExE9Q^*ygZLAIi9c22IM=6 zU2VyCrm2Rr|F+fARcj-8ggbzW%B(1eah_K~@TKdCdb~0$yJB at 2S99^!nPut1xs1(s zB`aLF${2azUQ{Y&+p0VRRIfCpTNnpRk>Y1^L|ev;SY&YAr!|xzt^3Xa&zgS7Ts5UW zR~|ut4p=E!Epsc}sB~7e-nob?+hk~q56dQWl}IeAdh?1X7mdo{@5A@~ARQViSItH= zom1YBr3z743l>k1FP*_Y+0=z!W2M2yCET7nN8we?%lDGVd{m zvDLUle_1S|QVc07L%jTM1GHB at Flet6B}E5lXZ7$%F;b)>JNg)wm$u)bn8&G93h-M` z^IoCCH%p1MqN@&Cd6FSIc${Ks&eN-;5pSrG6dT-n4rb at Xd81W!dq`TVNYX>`wgkg zWliZQvR8jUFYl6$Krm&K8&i|y!feo!GuBAY#qwPxD?nHsB^N_^jkGMR&7-90>iJEm z0u5=W%W?f(U^0|>iqFJ}oc%n3IXYSs9&m;OY$)*-s#B`oZ*(IS82G0)SBM>opnf#RG~btibCfUVhqoRxgff$ z4rOGsjK%Mj09zD-R7d(u3Y*g*8kCL3X at AglyJ_K>ke;EXTiEkJ5yQI zorN>u_3QI!nGQ$hm4Q8Oa8yI!rLUAyS-t4pWaTtipV(OBCPN#%hg}4!l9Kae+n-g=i#iM~^`m&m>FsSe+R&!WRbWZ-U zcbT3b{Q!x-RI>m7*; zvM13{mAw-okZY8f*AbpSpFJnZu(84?C#$a=%J;;)1v{<0mclL}yi3#KE5W$;mW^tl z&#~zp&)Z}x1fDw`Nr-9nq5xW>p8YDQXf$o&V;7EnN#s{#Wa|BEnD$)k+aBc)#dHed z*dU|@{i#uJh~Y80sLr`1M<2bv^9Ztb}v-xg{XHjcu;NdA83PsFE`QdgXGef1 at a6%a(-j}{`K(@z1r zBQ|SOO4p;2GJ_h(0|8FV2G#HRE=S;xnjncT+BkM_1Uvw>;+Y>(-+~7A+ zZ^~f`Em`@MxYKe!njnsNc3!9@!(~u%I_Pj3neCl=EP zh(4fvTrlmia^w(en5WqBwLfBIlD^Buv^DG1+G)bK`#b(JTFLOoVpjNafPY6OzRsEZ zgW6PyI>#>9bdTLn$wDGIhqEtF9ERSYybsZ at +TR>!j{gp8>X0cp;G&Q8!X=`v5qbH& z8;oN#b!ao-kv(59jV`rE811^@J(G8gR2b56*JCgj-yG_FV@(vevLsypkh#Ji8N+_1 z92rub$I1vDn#XF>!kVe9G>cnKMPS4m2TMqUBKfDDwO^u5ERC2pl4Q;Z3{f2Z=5I{Z zV8K~}o8TZIh%g`^6#w2R|26p+qiU;;s*dD$X*QP7X0Q+!l%u4w&=pR6ubOv59-4qL zn1K|fdX`Xia#4Ak`j{3b8 zEltjV%B>T0=?EhfrkZAp2P)O8c#C;0f2JW&q)Q^fGHj~Z+&1~`KLSqUYgXBGN~z-{ zOT5xBzy&}>r5o&U?K-8Xj-a6EQ`J*$(YUo-ZI@8tjefNIE!)^WUq;~ zn~T(K&Pr)I!!3E6D7S2 at +~?hxcf>Jw8Pt at mlgum1ui7V_IOd9l<6$sT8%P1dUYCf zrvT~e+y))Kzqxf&m%pSYNW|hIKCJ}8gJFibFkumq;FYYFJd3)-)g~? zm;3Q>n7@*JwHVkoaJr2XAo6TjsMcw!38vf~4*7+|zL|MPtl#jo=5eKXfX{u!eeE>+ zspu5UKp2m^YKVGwf8-GP$t+xtr2rzxLvReUG;^HV`|Z9=KEV|nR%H(LWa5YD>*7ktS*V`8GRrt32xvZr|s3TGJ_LK*p8Xu7>6riMNbG2$E72`S!=I zd^IxpHEtL%5X=Ia#WS8te5>ku8M#Eoa)!UpersC<=Ryb3yES4+j3tN;uuJEIJ;8>W>Jn4ws|{z?_jknFwM7)z%|*Cg zl_tJmCkn0veJB+Ij73j>gao}||02#An-C$m<+7wg9Q%NVIdD_}jM)LCCT4B()N8cy zy&Ftk7AF&v2Za6CKLI at -IK~q@=)>H+-;YdZzBpImK(8x1CX9NNh8HnYYyB1+ELN?p+%}q&kYm!Wd~iF zl0S|jV)8?BfNSGTJcqVSGmBj9Wx}&^1ogCX(@Qg~0wroX6bdZ)No+T6)uxMrG3CJ& zTiWDh{2Z-{>mVkVRP)dNcwZ`7x?OpeKPU*j)qyy80Cnu7EZrRzDZ`u47^fU{wfin9 z&KvIanMu`dlA?2c8apX2c!L=;`Y3g$l1r`)OTAFTObSjN?BCdFajMX%>MqMQO!pLk zvxM}At1*fOy2zAEI~A(6_!9BeHC- at G*2yjDQ#z$Uk>X#0ucMBt znc$Z~i50LS2z>JnVzy%b}X+?reBN%;@gy6NY*sgcvGxRvN;;0HE+z zk_Kt{wTm`P at E`i0 at FQQglEKt;IB2DhLS}BZQUl-L&5u}UE}7vew9-qvtF6|NL-PIY zYu7ZCPxILg69yHf*|dR6Zy&Wr1RAEDL`z*amFunGaw22NkykyX at w6vXVE(5qpJkR= z`4SB=dh-SnVOazLR0wer`%2>Be!9mcM at 3<6*3g2)Yl(QP5HdhJk~q9|QKqpTp%>Xm z5HEg8uK+MchX4<`+dn=?5=8ps8R88I2G|8k%jxf6Eup^fgAhHW_vN6+rud4bh%OtA z+(PcYTqow7LMm$^iTe3|63 at oqQK}*I?4sd|65$uo zNL5kSZn4l((Q$q*oiv`T;yTUK`}d2L8`!T$$u3~#5j0$3cU-a?hLHuH8ipBV&XUx~ z6DkLPYq{)?L~wlmE0+X9{jX5T`Y%+fto{dU20T2>0F4YN?5G*E40Kzb5E3c0YMV+R z-!n%#TYkAzEIX^gN$xS?v#_QTB-oEA)7O&5s^=j zXeCu{O7k83#7owg0@&GxS*o+Msowt0Dt+-rafB4m!9P!M+m>r)p|#HZG_g>_c)q~% z#0rmKrOfkLQRIy z%(F0ZNfyG~Qo70hA`ai4Q%xcDRhCRxB6u9*FeQGVX%$Iefh};(#B9G;Eyo0Dl560E z^q*$>S>1x(Jm z7p%^#wtTKGKH?166=nC}!CC^E+uz6u zy{wrd|H2L-)W4&b{wH?CEp1#(olH&s8=sTzKbZsO={xJ_3X=D}MTVoVD`^P%%y3`{ zGg;0NA@>K{&$FbE&+Bd=7JiLk=92w*27muK%-gvxYze*?Hnq|2e93QqnVtRld3T2y zz~05i3?N6HR#Xug6I>M>>V*x~bJn5UFj=AEkbgF}lgKB%@I_X`rLQ$^<*%g=l`|W0 zzMw!1={|}gEgcg1NsrHB(%Mbh$F%97Q;+MK(J!zgCzYc!VD0ER>MK#LY|g>w1_l^w z1;Rrf5EDREUUu|vr|>~T*s1}LTKTBOXjM9b`a^eUg0b5PmBSKd{hQ&iaIW?Ug)p2Xmu-Pl_YYd2_xoBO~-(@(h7#8VueInb6 zNRH-J5;|?)bnimG|D^XN3cy^i at CAQU>3xdF<-vD6hWNf{68qLgdOV?Ba~8_y!k4Nv zJru8Rv*ogkADF$fCmN_Jzl_ z=g#Bb>{KD_#D1EsJf?`{0T0;1s9c{QqjBe!esH&JLNNf<^eQ at rnu{u)o$lpgNh2CB zbUmkLRQC(;jRmEMp#aS@&9la#uO((}M}Ortb!{J9D-yT5z`f at rBDXonC7ute<9}5Qa=ijJZ zN?Gv6G9f at fR^k3#qvZdz>whW_{g-vCZ7budqJ7$>m`G_9%>JOYLR)A(%bwem#VWTL*vj)tJQ at AAV0zG_CdV5|3a?XD9)_NM3voGrqT5VkLqp1che9{ zZyq5PRep3h4^1v{y%KQ9l_h)FIipTLu%oI@?rq)yPBIc_k=7ZQVc2A?0)OMh3Id=l z{Wiw5L@>7R#hQ`Hcwy|<7^h7!YQnjl5q6 at S{aYVFcHh)@dSL?~w}sY`GW(66wxG-+ z+JAWlo~F+N#KPh*$E(#z(C~l-akTf=_y{CQ&V{Y2*cf6v<-WNn`~-Qr^%S|*m|6uh))@}jHGl2!->TW&0%76#Z=>c z`-SUtJ}*D>o4F6SLJl5D at qF%sQMDbDY-_im$8uoaje5rX$ul%}I1SdIn0Oi) zumQS53v at PGgB(M)H~2Znl!B2xQZew9at^uQ!G-OxT?|kT!K>RdPm~2=;mmy8P at P*~ zyepu*SiP at OKcyu0F?+uRi%8PPj^bLuBUjr+?q%{ypOwjg&dJ)a$?&MjgI%dq#NA>_ z*7*sB`5}wK7R^W)r?zvmyhPVh61nPt8 at 1f;%t$8(b8a#h!y>7}{1WeL_}Rt%th?a~ zUkp-FrL(mBCxnlAxdMTHpI9F#PM{xJir1o#?(hVA$x~M9+7;QyWo`x4Yo2qPu=V~0 zx+-L-A*uy!0IbXK-m>E(l4s=EcFF=!s`cXBuMgfLc@*vYX2Krh54Q9xPgcG~vt}f%V&TehL+M+SBN^JZi;K!6wj1e)nP^N02sKOPU}n# zNjyl<1}p+p6Kp*0o7B5xbX`Qa4XR8WNxKO>;;mw(?(!uKxzkkbXgpjho+NsjiW2D5 z3uOC&{-1=3I6F(*Ytovk3b&5Z(xbCWdoS@{Uw7lmAec9%P?}x#yG%a}E}Wn|eJtW1 z<0E3}i&nEnl0q#f($Y*{A|e#%SK9g$Vc+!FneB~)h>E+}7txVa16`VG2I{3yb75A{ zDZ^FD at M~*GGSv7LAkmj$M9^V%%Gf{L+7I67)sv-c-w0rqRVT}2KX+FuJ4>NGwY+&U z(9`J1*8YNqpxQe-xkFhAfAfN6ZAIR0Rfh?7&5PVf_W?x4QTxf zX<2u~IyqJSN(rKbQPFUu_+z!Z^R82NK89Ag(PVnTb=G+&iweleMboq at 7`NiPtf!0`LaW;5vI1BCNpbXL z+dtQUnEmICVJ6^8+0FI$VF>x|=(<14yps=}>dncRlkS;Tq;oyy#>g at hDW3BP1y=5w z96i0Tt_BG;X=hHXQWzYk8uhcia=7LWDVKr;k0@!9;^i=>A4)-3V8J|FvD6`N}>G`B$Vp`;YnEH17i8! z2KRBLKI7~?Y*Br}3#D*8`_ zi!Ymo3B#Sg?Me5h*n8Ihg=}Bw|5YOMKaeftVfinDuVl4NrFAu=Par*=iF{Nrs+H`g z2A+&#Y2>=eY>iCAg(g@|bbZ8?}M zpnhb(vGeHsvb8f8c>eX{{ed%}_F6i4aFa|)LvoJ*V^zoK;)k`WUdrk_hZGJytw-;n z2s(R8ESu~;v$ZR_0>py&Ix{YSHm;I0OTPVpi+-Fcam~>NCB>Aj%c*+)#PhYpv#7B?Rv^2DY~F?nfR at bPv_1YEavD|bXQ~i zS}n_N(hkR-O1CBj5sZG*E?J$kwG2X<(+KJahNo2Yo`?-^eO_+;AgvJjh46WIrjwpv zaIlnxB6^vB)9J(W><^kdM=O=Bw);A$?ihRNvMm-Z1)}6WbrM&MD26%t)NXp at 5ej1+ zg(Da$%9#hXBWxlHwycznnA8wp&^;~juLJ|kd4Pr55tow-wYW1lL9pT%BKkHQTG;5B zLN-+!-wJ*yGkexWYo)-;lR at r`)s8ifn`zz~!4@^Yj|7_YKo at xp{IPWRi%TxQ9|4!b z)ht at K7rIsiH+0chbpAELZvt_*c&e<`&{tm1A;EX_TAG89rZB0;=X@`U91}Y% zJJ#xPr0`2^K(1RqfX1V*HM;>FP*wph9 at 2 zKohD#5;NxGd*mLrfE+gJd{dd4A>!I2LBg*Ga{psW#NTofa>XZ at _K{OhhI7QSGrjCu zCoLfeRde4*tTzN55sg3a7Z3w1ki!9)ZLZLwa6%CJ0hy02ChsO2<;uNqf zmU5TOulC+7P$!yh;VW+Olsp5YZ&~(a=Z>s}4{;iPB53-|tBY_{?8*<$@QB at L0vv|C zeF#uYA)UH5x36NqVU6P%(xH+JD&8!6X5CoF&gzGhav^+vV~$}&euMs>P5>QT0Iu<` z3f%+|1cdqj%?bRAB35178CMMBb8UV}sYY5e`)ukK*TVXo!N2tD%DEhFx#-Zv(A`k8pqGq+oVn1XP^tRl=z0*gT!nj5DLms!=AInWjh-n^YD0`^ zw`^yA8RoyDXJ+-wpPK{R6y5m?O->(+c4t|P*8$!$b28+GWJD52as>CDdJpE#^319Z zSwW^n7FsSgICSHqp5?Oj8jtsupwQmSW~jzmr;s8yI at j~ncCn+a2U2hbB;C^mmjuqR(`e-m zCkxMvqQpvR^QBd<$uEB=o^~^XtYzu0+=O3aRew-kNcW@)D#8$@p at 9FwW; zr1aLEiec2SSaPV&)W#U$v;TzR>4*2$bQJ82uX#1uco*HYX|jy1eREMSeP!MFx$efd z31=|qgLOyUEiD_9N*}d3 at Hl;3oSwHHa{q4AE-J}0`l}M-lm7%fn0At|+>juf!Lugk z4r>p=mmuBcx7`$%O~ZJ<&APnVVq7mPP0nK6urto(P$A8fF(2WaPKR5gcw0( z>vlchh`lR7z$$z{JW{~&ne~&T?w~|B8qe2PKm-=HgZ&iacNP-6Y<9btZ?|(zBI8k) z-n64v=_J_MMFQ+iCvbY z(hyc+Wm6 at 6R+W@GuA;HJ+2|JxaNb5yCrk3Avn&v zl6LI%t=b+r2byJ637=*~$m`oIJXNkBO)g214el(lcUlF zpAgsP0_2+ubtk-@;qP;TI+W#>TXJoW^Pl)+q;b4j$=(4LfziRL*iX+GH)A3$EY}Z) z1wXBeI6c#*<{u=CjrVMu^zx((Ji;S>KlLDM^(un4`on~(!d%h`_4=@PVfI9~P{V4y zWsZw}Dw48v37fQ$un2k)&X%31#`(!Rt at KCyc?<6Wh#v^w!WI~Zc<+Pph(j?LqBg%Q zdy2Fxiyx$L*2QoZI)P@^3gU+=<+yMdfVMuDPD?p{u1VZ>O!C%$kE>QR#qDQ_G+Pb) z-VW34#M<&(J1&VCFF}_}_>OsXAGbenMf?)4kjN35vVu4(Z$=*J-puI+9Bl&1MNyD| ztcNHBUlitfbtmAAY8Jx%Jd$&Iwrplaj$%Ylj29d44uRl0=CUJBQg1Nj45Nt!sy&9T z4L at T8IN7i*u`2V1^Fc^zQ`OuV*?^1qLWPM8sWVck6MbRGATyO9 at ou1?>U{J9+vPWf zpRPbVpqp&b6?mv2GcEh71OD=CC3p_Z?f^Cgi%`3x&hcBMde2H3$8M;L;ZgvZ1#YB# zAgd#*xrAtcCNh114yXM5Ow)*;gFDvD at h7aMF2=MzAS1XN$&I&~Auadk57qAbWntVF z;|3 at fmY9+H<@fRH at 6f=GUkRQFyg zfy(lbqC?7;VpPvHVPOtNa~?RPA%n5q#>z|gT61>HuiDWO+aGx_5QP!{q-d^o|KkC} zozcXa?Rl8Ky1M#t_jF_ra#x1U!SJDnt=)dz&)~eJI ze_8JHCP+xhtwmZ6x(=;k(Fj!@TpeZN!0OWUEzf`s@?(AmFUymkKf0G;0b{Ee7 zTo;!^pJbZ%PATfy5UN4c#_v%^nxrA2MO3CxFU}w?w_mCrdU~_C+(TZ^H_cB z8xzXpYbVnwt|Svtm$CBDm_!gv0EE-|-kUiB86xhAx&>+K;gf%N8Wcz97D;;_zvX~P zobUEZ=5lWU!je?a&K5D z%0-8sp|tkKKZL)ujZAs5Rsw6DpW;5YYbO20n!_`So13lEr2n}7k+O1m z+v;VqRF3%kV*Wpzy;G2GLAEtoyKH=A+qQSvwr$(CZQHhO+tx1I+_(GO^P~Gd^objh z4=XbAVLgnT9685kV>GmBcu8KfM)bdP;yi;)^?3gIiWuyFMC$%O82|5LwUUk1l01s9 zEpig8X)RjYIoGL{i;sg0^_zuBzLOxqlEheloQ3BE)1q*qR*s*@7t)6S1oRJ(U$VRH zhhPpH6p$BU4y0!K74*I>NYAd$Cb4pW;%1GaF$y1{zo ziRs2OF}Mpmo_#1OdH7q at Lj7ElP#eBt>D6#9HeQDW!7aIj3fe4CsHtw2W!NNjb}MH3 zO#MUI#V5Pc$+jnLMcJF9?n$POo9uR5Eh|94JchiWOq&M|R7K+o%=b7_LGYolk_&FFC?u`s$9Y!~skA=QsM;eg80;CK;N3rh2eQ(FE_grI_L-nXP`z3psn-!Mz`A zRZw{rr;Yha5LDbtKHFceQco7LmeiV(6t5VIKBm#p5%=v<1o^VMq!dZVRuoES+CymC zM}SD3{5Vq at _6)s#%ri5}Z?k;Bw-spM$1gQXT|$BZ`B7GasMMxys*%!RleyZZipf`g zx#F*1I}*9~xRaNnC$JY~P8ay6%P|?90njJw*`16EdSzAqStVx2jf at t91<}V=F_UWA zT(=B*eQZwijUT7D%^KfEaat at q9=iiOG+M*F7f8!lf(}Vkn#8kjWzlha{|dxqvr;Eu z5Fj9p|0s<0uRs*EaQ?p^rT$+M4CXpXa2W{|K_L-|fOd>9Givl|7i~~95p-GKpWvv-ZXu{B+6SJr!FiG2{kOIq6Q`M=#o{A25 z5G4$($73fL*r5y|W`#y4Sno|uBD@;X85HK+28t^UKL3IuV-;l|*%nqm9VbUO5hoID z!|MlKx5MGy@!+rHo2<~5Vp at p7uN{>_ zYY$fu`MtrusN%73J?;oLZCRp#QWDL1ssl-YnnO&%KXN{8nKZNNMm3EJ2bx;7;mj(H z(%?%8X at 5!d*ivrZu)kIkg1H8F@%aM*^S at gDswy(-D4+&sF$Gomxp}OrvgY8e1=iDc z8uAnwr+^T?XoCcnfACXEZrwI}A(Tccd~6J#BcK#CMxH;=qixOyAwD$ z at CUxj=t;` zoLO7E+&3WA^Ion+mBZg<%V%)i+p_yi9|hh5JqGEWvGcF_i&;GKgd|Z;CKqo|$CNr{ z-P$$$hSD at 8%Am5NzNPF)Ejs7yOBpwNnU50O(%6qvh+dW+QeX*kWX*L>aUNNp)~T{Z zp5S at JYSl1`bta0pSg*Eix_ZR`3k&FCadP=1I%VG++F84S72>1QkQ^%cg$6g|j3UO2 z8DU}Dk)#wjv~4N1rjZM2DDTr&a>hnqCs^F*qZZ5 at ZcX`;x+RJEB zyPS7k98GI}B@#nWY)o^+c~K<9Op?ED$1mnXW&vp~IQzn`xJ(my?Yqx3@%J$zi`&+m zyAP9e)NDL2UqlDpo@!$iYN{5Ml at Y&q_`W^bp{WAPWwxM<*eh$9TD(_k4}XXFxq+Y0 z4f!bvV-#vN5b+M^T2OpGx07L=PuS~1B$4=O`VfhWTWT at P7_-oY%m;`tXG4f0XG6># z!BCULK;H}@XwUx3=_$7#h`<+Ep*yJjjZ$=Ej)B%UmZa~9L!1!Ko^t5jnEU2WV3%;e zO)d!*nkTbpRP!Q+KEXFFxEsh?(3SjGU{|6J*qlo1Q7|Xs8DFp%Z+jsGI<%XS&qgTf z#Q-#zdfb5ny#{Icm+c!~aSY3moB#NlPQ6~s0Q_q|yjQ*LvE2MdQv3dZpRiT>>cn(h z`0j}L9|+;P#58$V{DvL2ABV$V_vGS-bMYg340Jz}Ik}}?mXhl!3yZ|ZHgfJh<{pW@;YJu+18^dUKxQ_0#jj-;lSseZLtleATTZF<_a at k0~ zmW8ByngqjGzP?->(c8FzPp{x*ALoZlZJ2&`KLplbiQeB_Y0M9D!g zh_Pe}Q6iC9$QxD){`aXk;i6nqwEu`_-NF9TRGj}ZaT2z!CXUV)hSnycF1AL_7IwD( zC$jx7!9w1w;f|I0a at vE%QhCS$2?8>~yF^9Gns8;xkTBsCcjs-Di%AW!R;3C*FaUZ4 z#BcvN!D)^HBB&bWt%sYd*=#3Mx6%L7)Xa}Cg~y8KSuB5$KPt!_c!b3QKEGRrnxqF? zg!-{&cCm+_9FUc{xP(cWdg?|l58!-)%?X6BRP#z zlceF2f_xj<-DtR9Ee=c(VmAUs{hCX%H!m7|@m32(NWzVG%Q232 at 8H>*c|;80-+!5P znUa<4;E?-b_?5;5ZV&{;YQ^J94 at xEaI?dH4y{0JiIJ6&aUvu%0>W^`E at N*>o@@g^t zoL$g37$L`L0=HTDvgN%bOCo0_ z$e6!R>~WO8(tlv4%ZE47apf$m*p(KA!=zF1sfND{yjMgO0?ISMyXFVA at C7$wu37Ss zEyf};pfy6Jku$eYz8`Dm(uo^;dXAl6divdAG^5HVpxjUBVF}oTvXDkL$TZn{XN32m zZtk6p&gXUF)&B~V&0 at P#k*-TRM)Kc_l82tqVr2P+9%l`id zgZ~SG3zq++xg}XQZm8STY*wmhv8Ki#&@_F1I$@duiMHehU|EqZg-q+dzqb{*4gm^IoEFq!@X*6+Z6`dpd;w;INq!0 at 2-fR z@&;7y{RY^-B)v-NyX41sa%aV=a3vn4kADzE7<-c_*{q%BC;81|8ioB)F6kh1WnfmQ zMJBFyG>?{iHOerF^vXpjG{%xnGzL`p->@*UI8+z%U{vy0rEm%c#6(r*{r*vaM=!gK z{WvhEze;GWjVkZ2<>N>wV+t?H0KFY0mqyq!5%0&oh)8&+DRCVlm&vjQwiQT5@;+!w zySRI1^3Xx!_t}cPc+pFN+06=io}9-yX_!`KFf*PpV3Hzs$-jQ$)mmegY6C`x%e@(- zZRP^5-=Ia81LcB2hOE}P5!3(VgM;dRO5-5&V#fR8p4kW(q8{~&daapEb2^wTS}QYY zD(C%%zAu4ff3MN1Z;ha?529e3uU)Lw;jayvRv&{SVvkUN7CvlYZ&P+4k!r!2|!mR0^P*)p5sO5n79KOT-D>Te)UC=K6k>$8R z{f{^k%8mxMPNsH_HvbnttVCJIX-gP|ms-oUx?BQ#5eP2%FnAT;L5ICLV7=I7F|+fX zf`yD<7h?mhma7rPn3MS=WG}%C&;8(+skw#wKEz!S#!U*!M(he at z`gtH%}$lmY;Mn@ zp5Nbla(}=JYPJ|>h=sEIn=!zuy=b4V5~qebeF$9am7}vRKUB`+oxkAF3unc{J$+ae zumy~4v$M>dSp_3)$GZaGVz|dTeOP;w3Z~d4I<~moE7a9g)RiLI(mhHlb5ybG2)89^ zD5hU(i+d4k#Uj(Q+Sc9euh~Ykv%%1!D|ZV;W7l$J+hDYXt3qEhz#ryKUaIf21mAXLOVRO!rB+V^_d at O zjM^LX+UxjZY1i<4yyFP>-;PCq at yOTc+jH#(=~h{L+AT-cAtGdYa7US$3lx0Tj?c*r zpI-(|??zh93&nk+;-J$;DPlD{rM2Vok$Ey4o@>8J*g8xuGLIS-2`y7DE;tT7g>7xl z2v$tzT$)oaHO})yHd;PqrRp%fl_+0sxz?)E$08$P(iI$#?8xuMM^v<>4w+H&jv69q z9I0FvvhSI2TU={;UEui!zTd62N~&!DfhSswXZRASrFahCCA}l0Gene+EC?2 z{RKefz43QGPKynJWtM4eNBk$;BI6-2%CN5B4{37BKJa at hxyW-A2qg?LX6Z8}Q*u#S zfM{v?!Zd57Tms_TJIc!iVk=W<4d{BHUKP-zm?2 at 4{J34yZV9^h4TJXq1~MR)VQga% zruc!r0EZCsFVy|IziVVq;w^vTt)b%X+Z0GY)pxJUzGA4~v8 zUnPp_PO;8_ozK2g(kft&vC7!NBhfor!eTnwM{Xut54SSoo&_?_qrUAQS81^IGrmx( zKtT?8*Etq)g?KvdAKvX&6eo zfm3fM#y=MKhmP61?X%>UFd3tVd!cHmN(oo1FX8*QI~HgP15rd ze3$PnA_Gf33=!{S2Nqw%kezQ4qipU5nRHG?fo69wF1Zuer|Ms)9>+A`NHih$?G+e8 zuvJ-lSUvKQSjbNd0`z~MC^23Jfw#3`>zEHx4c(I{iJ(P$=EEK6Uye4Q$-3)7lfDua z?fYS7o&=4x-p#TCw>owT_Bl!Gf#*yb>F<_2pnVsluHT_`^Y=q^&-$Yz9mqS7H|>)G z(Y*}dd?%vP_Dg8?r>^#=-cBD3zaj(mo)6dVphI0s0 at XYYV7oIhu{~mI56Y(A&C&wb zsN8b`_2@%&M%1hJ*}Las_Kq8NpmpOI9Ce5=q+W)R6>7X{QU&F;j2LMfXaLe=EhK^- zR at POi;vwuJ%_krY@>Do+geY~fc1r-R_eOo964If8ba&h)9vle^s6^BGLj_tcRt)?kI}gY;EK#GPW&RWK+p z0n50sz=T= z8;E4JnBgUZ3NgS0*~jm8u_K2S1Y$r1wQlif(}*n9>#3S(aW4=e$MGzz6$y+9cbwHD zGVh>Bsp&hrl7xdsL-);<=gjRifVcz%DrX0f3j1P#Sz07itI(=3u5;o at 2EMXGs35^` z^OPQ8g=J(}5(};!3HUUl#^>T3wgG`4n`t6$UbJamA5KzuH^Cl8n=GVT#3RBz&~xW%H&AzMeP@$A#@UHj=AOWa_T; zRL*JwHP23_=JglrJ3-A)oZ*xLiCK;dl#J6jS7TN+Lqtc1fQ$GkGVO6#d!y at s}sy1eYt z_NGh&rtCEX+BL at 1_WAxLw0b332h~=k*mq?vjaUS3Ze%r1Ruj9i{5r0Qy<-mz+f_vD zkp&L!yQ{faFQMyEDNZVix|=gTYOcW=tWnVb?Ix2Ebn4>vXy>_i;(Q_qQsx0urt9Ot zh}o(vZ_LK8{aB_03T)g#hgCdL{lG33yg2iLbf6YCzcYAJ0XOH5e at j@(**cH_s2p)#C!=x;84z_rbN(VOe^BmUPy-nB-BeR0=7*_OHg+G#| z=(FJr_~uYI$`G7cff6+atU2aG1^SUq=jvv+sau`j+Z_yb{bUeR5e`xYza1PS{N8@< zT*JIP&zA9E6f!9af^@2!#YG&&SSm{Z2lEqTkx0CU at p1Jm)QJxt^j;k(ujAApk~#18 zS+?lmPOu5q&|}TELOdBvh*RU#=X0>rn4wqAda+Y{KIg=OzLQVA%k0?|wDOj*sCx!T znY|^LH#C^ut)$i$b&eNuMdGOX^(m+2)2&rGxu>g!6{*mUlz5VQmNl}&T at ZrFk7elv zEn!KNVdW>FX)HJ1Ov&8^TDB9}baFHfX1&TyUFyc|B}{|WnVG<`!O~oA98_7wU%90v z at 1_>wEiZ`8kCN#7=1R`dbxIg|RhKTWTON%KT7nM=Ugd zUvOCS2w$ws;z5cgcGjQIwuGJ#nSkVc4)!#(i*Ni!78v6vY2>1Nxk$YxtkFwtVtpa9 z(_qM8LXHlHnMm%#CEx-{r=sWQe!iSrai+ at mk&{xt5qJjn?4pc<41Y*gNtE2HRr;mY zKWeU#u)%%{FQD2;+0CibG|dei0pB9k1X)w$KUVGdOLt at W3NhWIDWc#npL}l1?Roel zK$E3c#VS_#iGs&9oMIZMk`rFYXL-ya{E2P%yqx-?v$FtXN_yI`$La_qB3={~d`-=I znTG7o=fxR+ at Jo{|D!4v%V4r_70RjWnZa6yf0cC at H;OkO zGLHOx0aS>4fzc<#kjy1QnE at fHA0T|wOfltl%$tKet??C3It}G^gqybV)GveYi*WTU4! zLOy1>z(y`2ZVNkB z>IV7Shj_hpKn{ONLmuM}nVOdVyc_H^xRgrSAH4(+vtM3RFzfJy_x=$kY8N`LDxPH| z-t&`G8&|wuTc07j~WfG6P`_dCRxZ9kWvE zw#0QZEPF#!C15M1E4d~`g&j*YG-&%`m)*}f6hb72Ne9U)h`N>1hi-qX2Z!7`s|nDg z8Z8+2L%h at Vv>$N&z$N6$GJvozpo84U;Yiz at +J~{nYX^JG*eCS#Zxq_Ucz^&O at ImDH ztQfKZG>Sr2EJGbc+4u4*fTQ<^u=pmJSeG%nGRF8w^ml;Lm9!@B_DTPx+X6}xf--oE zjQu61a7h>#^8--;S-^Wo5Y69?mnLVXD? za6RwgI+X6|vk#P9v-f%aDXnYQV2*YGbOsK_f&s_NfcBwJ6l{Ry(FRXck61Vl$;g3u zX#Bb{`0#$*X#x6Pb;oLOD%uWQTdW%3VvnjV!$up7X%F{4BGUbPUBub;APx4k1^m>#SCoJb zg8to$<(EN_Hy8Q)n|R`8{1yNctp{FFEGcO0ysh?hSNX4mid2IJy>M}&!Wxdrb! zN&>M&saMGJ=nFO}{)hFE(RH_I|Lz>b+Ys*Jn-G$$go@~POTcQ6yTioRG*bft3(%1j-v~>vb}RjhxQh-+;0A_Wd_B;>z8%n&9;l#KNDjfid!-^D at F724WO}khB5F#P0ZZ56|fb7rxpR0{L;U+z!yze;DHIU(FpTRU%kfdW+>DC#b)IZq)LBIp~$u8oiNg^Mx z(S`{hux~F2gUPNw at T#j4YAVZ6axS132>r^At6gMfDhZbT5&8P8%KC88V-pN8KK4Aa zsQO>U=4cB%kO)X(aGZY-JK}Kb#b*!P(uEF5hL4hyYC%;pgiaf|Iiw5$@MEQdCr9+iQL+Rgwi9lH2*&xoyB`h^NKuQXT-dvNfCVmHsNP_me_I?G2VaL+U0Il$i_bfaKWY>Q_j2ch5V;RTSubxYd3 zEI_eiu#qtdy73|D-+wboL~_*Ez!IA6h}we)zL{14{}RVEUuIzgyDFS4>I=q1l< z0bL1j$Mm&>qPp=Ifvn`4|E#*pMDZc5FcnYwJ{dz8gt`Pdi4qpN(UTUDGD_>Cvq#Ld zj+%CXrl?iLIJXRHs7)dJBpXwibcafy*7Lhak%(w^_a2d|$GF<=57T`Sw z^U``Egn7#;lPqrt< zW;vbh-rTKcq76*ADd{U#zg4*+*cv|68wA7Vvl+(i2eoq74>+?n{s8b=U$jj@=1Xti z;2z{6EEUsV*;$ja)&a4_cD7#6v{93 at zXtPvm-7AQ^8cn8-2H_L;!6-qB`+R`;e@@4 z2XBoJsCs$qvel0=*r(E>b7l8G%!R4+!i#pI_s6^u2{ouRSm#JGhyi`t12!+3VOU|X z&YoZ>{kxpc4qH_0Sdr@`e~jLHnAYUUch7hVyeXrKZC1F$KDbDb;- zG=Pd7VPHa}C4!DF at F#L_fk5bgpJno%$Gkbu4b88d{Mi*)uXjac!wY2Yq_E4j&`QaL z$sczj#JSwC&`g0Fr1Um?G2&EJS0#<>F^i62oyIfct~DSnz>gaf=etULR`2PGD1CA& zwXD`u%}2h>1Eo(f$}>wgvupGyz4fSJ_M~KA`1sJ2SZOd z%c#bw41%MBmIwDpZRU5SjP0^-Ys&DGD|l3OJ)1x|H}KhWcbMw!Gn#L~J^zB|6!b+C z%z5hp8+|*cJUc{0k=f{-^I~QN(izmaL*K!LuCk}@fE5IE6(|1N$HNypw7AQ z38FH(XUU$ujDbKj3+LcQi%Vi|$w+<>Um-lZc}TNLUgP9WeGL!W4VpKLIw(viov%nN z5Ry}mVx}z+GCE@)1r|M9PWbW6CVk!$ZS;74-ysJV-q}^4CpHo62~Qr$wfqY at 7li0K z07icE{WN2#m5w6PuYwX%S%|TW_KY1{U5FJmG%RGmq!ApUB`twfr>6};P*6Sso=w{( zhRdnclUG`ZEQa;2ZGXgb&$5T})9!CaO|;w)(AharqGkTat0KlT@&MM-2-FO&#o^*M zzcp_YbvakYCUCR3Ecnor`MODWGUKZZBXzu0!|w0D6)UGZoZBOSfq=BY{!^br(8*cG z#o6GWZ7)R=Cl~AgO)acZwvqcMweW`Rj4cXQSy&jXqMJfqp&xx0yokSq8Y+tfR8O&! zOHz{loNJlh_qps%LmHAX6o23Dt_@>u$37krsZhcz?=d_3GGm~G4*>|4FlQKU zTRQ(&8^G8Fa+C6)l|aW(A+bHk7HK|-ph|6C*5Fy9o!Y>^KyRYQMaYZT%7&V4PcbqZ zomVVfYn%LzXAC|iLowY6242Wm#!Q{3ifjtz279elFzs_nw&E&e(n0O#o6QCjzm0dz zZAc>2+-?tAh-OHnQgrAUx2e132Gql9hghy at z-CIT0a)!$$ZXhSY~I#dlRNc7!&iaT zqt at DPx+7L?KF}Y+2zCO89-@``6j~sPq8bN}+EPB8vf$4a9({)|<7F^*H-UltpbsX( zoxCWrB2y?Mkr7H9#^z79+^7-K3n(!l7y3CpTC at OfEI3+1ngLe6YT0t_pKGYLf;>_w z6r-QuviBAgbB-z{8z6K+ at ptiq3<~om$4CiE3HE#m%EP6`FM%Z5ohAO&zSaW_QP*L_4I!G=NAS8~$SQITcOhWm1A0fSyHN5flDs1frcXuK zq)=tWY?)Bty%x|~2(uH+>&!0-S#}4jA&6Y%E`TwBT1hSe>7CE~ibQJ+rr z at c$38|64^uZN~{&1?4ZTL?)XKbhAG#J~2LFsf48Pua at Oaxy?m at q?SB?h)rWNOqTVA zwSOT&cp*hTLF8c-F*C<3e*!QQkz8!iU;nz_T)$s-?zg+PWRk!Wo1>4UyS#38oMvyc zoo>H#vi5%7?|=Ebyluwx;6bjR4ls$Ekia#HCG#5Mjj!L1B4WdO$wP2k661+0-twyv>ZLbS7YY+Ql@?LiTFKDOWMgBcecRXOb at +O~6F$Bu z+2&)9Q0<IHWf zk=ieC%+)GW)#wq1Xc4jCi^a|JdRbAa+CQ4IqL1QsTHyFK_oo_`Q3>e~qY|jc1uj$_ zH0g(nu)_Uc&569MDM9O|Zbu|DwlkTi^QrXt=PP%nUIu0gDlf=aw?7(oslFxov~3!Z zSed^w#hOG4Ln0=7GAo6}qR24fW=rrgN>pv(KavX!RP|Er{w#7OK^GPA;D(in?E=nm zKtZAB)cUsvDkPvFQI&vy9RxOzbxGu|ru<^CcueBEWu&$(kQoyZV^T7twF$38v*P-? z+P`%N)*(VyasOyZ#!F$R?iQ1Qv7luxxC|S4)QK44q$BUZVDV9q2<48&sL}Ke7X9Nw zsxB-e-0hFPVU!k*s!ll=#Y$w^FdCyov^!$4sUY$Y77i3hv^h^xn8Uj(lorlajVhm0 zEB|;5SE{qdsx$n_L2Ssp^aX_9>7Y6+cII+qgmh}JI}G*|`4)Wc9T{b-4Y$>j< zr?(%8p%?KEsdBb$O7pK&6K3tc1Z9~?r2}&>>%vG*bZl2kE7Bw?RllSX4Ldm-2sf>- zDh1MueaUJ1Zr4aU1PQc^CVA0KZ zjYnpEX|}@~FT*-$~4tS@?TadB2eED)434DHRY>oE~ilhaZw zHnOuab1E*%u?5H#8hyZ+{5}jXr;`e`Mmrn4(y}g~3PEL)=OACYX~;zXdvG6|`Q?{; z-~E(v#HSL`Zse%AaFQ;g`8|wPLBdDebx-r%s3XePs#9)^BUz-vk{Pt}B-)Rb=eSK$w4gO_{>xG{kHkwpl;ME$EQ~i?O=`cm%^iQRmY+e{4Z_KGem&rn zMvvg!!xLPZ7Z106_z=);EIL3Edfxv5`@PcIJGc6}@jbQj#)jIZjg`>UN^6e+~FkcbUEp|r5C)F8l6Kf z at 8BemY%Fw at 0VbRUw_qxe3=rPn;Mt&fKuKP-peTtGvG7BY^k9o*GeW7ShMC}$AGS_5 z7N7ubov+>35_?Oc*BV0?qwp0%>)5=9tY`3j+a%d!o({>4>MJjM`-M+Azl5vNZr5p76j4V}S1d^iSWEkrM854^Q7HpM1z zYSmvDFWSh`^KNbTduxkqD{Jnd6_?u at pWBAXBPI1O>s2G0qW`5LdU+s2Y>8TpOHW7# zyT`(k)})o!x(q~OkKP#e>Kgm`H_M}7(^SUGm!dPGteMht- at p1)zAfK0{C`A?=%D}U z5z0S&s+|2lDgOU(s{eZ!ZjI88EkFVB2VNe{zD4V6NV8?Lg at 2`%Re_$Rl;46>hk$Z@ z_-T-43aORzim*#+gG85ZMHB{ZnM5Ap6TCyCf0$msYoEz) z!WRXf`#Euv%-aNY{2`Ko2%&N$>DU8^&fHPX%^s*@hA at vskL@9!MMi1G{bP`j#z^;EXJB-3-7-EYZAn66kq+r;`cq%vf5jT9&?Q_33=j}7 z*?;1|{|nasJ9bmIaK|3O^j%vukjO$N&rkPY|LrA+NRBaER_$Bx~$$ zU{4 at zN_3Rhq)_A3jCD+&m)C>_rLYk)$AzHy1r3D=T>?RiIJ+37+dQ|_XS0`)vgTN* zsR$7K=E=>;`L2DvjabO)+WxDtxcCe~F*}%sunbW8p)b zaV5udH4HibiU8UY%T$J-YmC>A_KqtK#urHR~@_2Cz=(bDHTz2kxHzHC7cN_ zeiG)sZeE~9yl|QIm*FwrYUd< z<~6b8`9UnlFbq+Jj2a;!jJlFs)jGlr!zXhAQvwbp$!VlC&S-po^&$)94H_Yg)goLD zEXk8NJGOi^Bm7)pHK%`=E!9|RDUy8l-6B?)6DI2s91$-mMI-NQY3%|F=Cqq9oH-EK zipucGiqaJpN>4y%ARn7)sWl%myok%A+nA7A-UvlWmFt?12&R~W4c=e|=fcuq{M|Hl zJDz;}uYwBSAnI`h{CvXdT8cPBQ7OjeuP8wo49`BixMAsliK4ol3}a^`O*Jz7N8>ck z+XaxyxAFlt8(JCZ#_jWO5N|#8>WKv$?_+V}WDVjt!@~9!8Oorj3Z2tXcRzs%Mf(lP z(oWPYky_(UHx?M{(CK9MxOq?%4WCFl`!HS=BwIc at -rQwar_Ee0rlptrY3n}(wrhu! z4OKh4^7Fy(jjK}%>5LwUcqQ8Nx4IeP*a|foX>0WkuNCh^U>>cr*|}PW*pAuVPPn{d zvIi5LCfG_3<0*j5XR1F%vk~}}Z%Cmz>lKEeUD at u+BS!Aq5%^W^z){LqXfsLfk|P=F z<%i7XE{7JVd;`o>xg&VwFO}}_b5&7M#A2PR$o zCzW8(mGG(8F(fUWvO-a0hd!R8QCPV1g_lDS$?XZ0=~_9L7fDB(o{GCI{Y$^t7gZhZ zY3pV!ig?xr^a7T;{g(Q>aTbol>qzxDs86osz;@Hq^^(X+>#^|I6m8P%jxzvTtr3(w#XGHu`oRA zXUT+|oCGHzooR$w1sRY<|8~eopxic0Er|En!|LHPVH(?ps^zm38v}l{6Rq{B6$_}l zBN9SmQj-KD2HU5uj>UB$8 at Ao58iP7qErKtsha^Y9s|Sn0(Ny5DPQWoKI?D^u_!c_c zCXCYr%jRh3OP&}ZbtyH$6`Of3)qh0N)EZfn&W^--Blyv#KuUw4zzOoE^4|2}F5sD# zg+i-$86V)}h^euJ-gnL>T=7Wpm!awlSBwRT at +PL>9P2}OHR+H9YA7g5V{>Yf20Dht~ zD}z7fPt}Lw$`%Wgx%u6 zy87+cZ$*yKLTnF)s|&Fwo}KkK*Pwh0q@|hFB09h02|Co&4Ak}`ZyJ(nUR3=$npnC& z=ZwFN#DbHU3zb|l@#>2y#_>8>S>OYdFt8mjsvXbLO`OP+B!sk)oPs5Sd#G_i0=x7N zK*}kk1hbJPtK1 at SgA^*;H0cmRu{{wua1a9*(!Oex0)?g-hHKE8jM*%dk<=XBJ0+32 zYmIOmii?xS1*Y;X{e`3yVyau#4wLlVH+o+W?xDwJ%WwCNYb+c#k?W&yZZ2_r&H!4q z2*-*6riX+%(xbbL&R_Im72wNPghN1qduotF;)ZHuGYqTf(>lGO^5xk&+(spIjFRXB zKTF!_Xvm9jy7Wk+==zJ)`e}iG4(^FBj#^^=DxZ&!*y6OAHTJQ7^WmRs at S%S60kMJS zNfS>nHH>UZh at 3Ya8JW~|_kD(h&Lg#vYV5DbB98&vO+GC_c-vf}qPcKGO| z5<>MYaMnf~THzM2a@~0D^2HHz8jv?@0^~fb`^Ko8&HnwClitHkd{Z-%xEF$ah3M#n zDc|u%1R>WvF<`M6ESA0=F}dSg7qoGRH6USBfpiM}3pO#q_?IN(DSQ0BO!=VcqBD}z z{HewVohh_Wz>{wR^`WAqPH0SfwqBj_E!B2pRRh at CKAmT+v9$?_=`Ci}Yv#%k=maYC269Ewc&>OCK=hk%=~-LS z%Uq{8CkApi&BBa4)-7WkPCBHGk=dvYx{jd%JKebKP^0wKlWh0g9g8uxBf^;-eB*Jv z7$=I^cm%WY5LUw>w3?AZA8%!3YuwcU3F%iOduV`+niTsncb$(1EG z>9+Y;DAjv7QP1dFm(oxMJ#fXqz{R+JHbouxs9}@5pG*3ZJHjPc-3{roDEisK*YA+R zaHqdGnKk-+KUp0;cAz>%U4wTxq1fBYMjs`CuV3zwNr`f56r)wcG07`-J(s){J=_LA z_CR7RDvd__$*@3U9M~Y28%8*ga z+!$D3$}c&*!dcKOTW*JV;VbBqB)>yo9Fd at Mwgl>5s%!l=td`AD7rS&$yu_ zCd^fi`(yRd&%f1ZH^guwm_UGlSYZAK`Q-nu(Yjch{CAYEswIc~k9<;AOVe|}5UhJ& zhpuNp at lKK&ngm0r1~h(n?7A^^nhX$4HfrXV>@a)N*n`w*CCwu9 zI-UJ(`X`HX>HPiu^3n~6lO{Ai%HM!3km3(fdki<>Hr&!|58}<^vjF6y_e_|){#o6{ z)+Dt^Eu%CVX%CgMb5G$UaD<9Zk%)@P1Y+vNC^L4t8KfNrstgMjYleWmnaaBMj9uyj zj4`h~nuKKprFL7p*k(Jts||Yf at _H`4ZPZth0CBb8(-R%&H2Rs>(rf35z^O(~@Z7AyqXth3 zW2q_#n8;EL7+AZ%4%pTU2Uy&aIfO?Q#D9J$uHF9boGbh+L|%cKij#Wfm^*EsY#VAx zGKepvZk}#C)3fI!+0G^n+`n-OB}mmA(QQr1eD+^vTtgAxj_AFOxNR*_?95}cO6V%Q zbz@$bw_DiuGj#6G!o|f25W#q%aZNdFvQ3sy`-iH;v4gW zG1}4{H`GB}wrnV}+KABUOlu^Ps+DS2uq>k-5N>#nQryx?%ij=5vL*5*W=EKxjyo30 za+X}5`}vq(gyVzZ^TP=2M53FYi}TD^vv8+Zw}fep=!G}KmTsO&+>{?V_0(f4FuhM- zQWb;t4v06ZIe#CXaxV`6Wir<)t;eaEIS8o<+9+ETyDMkb^XnGWC-g^2sWgLg*q8G# z%0OtCx8qARqK7;Mh%-f`QHuMtK~{}XmfiY&nAIRuiE(ncR94$e61!8+SZ8?8-tGZB z at 7``Gl--ei;`VlbTJ`{;1q-lxxS&Y9~{&_DR|Ufd6!E36;Yb#4&f)Yf8)*?esas*qPu%X z=XgPa_lGf4ZMAd!n1!|Ww at 1)aruDYr18b(+YUji;59`hESO2L{YhJ?#hD^Ct at 9|?M z)LbfaC*h&lDFy`x*o}5Bt}1?xJpIo&8;%;=Hlub8)au)B6lc5|%^C${4XbtgC at 3XZ z&6KNiS{YXqV at L3gr1Zus2_@q)jfUzdUHrJV&!o(zQ=jzig-u at Y>ILaM{SktVtA=3m z2*XqZmvF_UMIB2n*Cs{8E@;D$h&(oE#VsBrYVZwak-n+RmF)5$l?4`@J!J2RIGrL6 zY$pH-yo%J%0!LvoL-6oU28%P>Cc&%tulP(SvL_23qw{5BQ|EnRf+slY%+l{s at g1P} z;*Q@`am^fN=%aU>ZMi6~4eJqr11!}(Tm}&db=p_uG0N2y{=J4*OJvA)A$kop<+Nry z at QMRML{|qClxXtTLR4ou{1%^XHrZ4wyt6RI6kwTrHTD{s7Dvt*g$|4D!A|t&8ktDODhcR!&6dOG?fWo_2nf23 z!9gLFEoZDUZdt8ed_sxTvL9+}RRRmdX0D-Wp`G-FI?0Lag&o8|9pWH^qf!m^B;z|8 z!xkB9GL|sSLsi6zELri2YdkbOf}e$RX2#)8^y~r-73iBmo*uQ=Vf+0|@skt8-7~un zofO`dp6O(77|JERz5b zDw#eYlKZ;VdV8U0D|2nE&HV}@KdrF)iYw=WS2^}^K99&JP-8W%%y)XhUWQV@)K#8q z7Dms%OlWO#VD>W$QbG=wMC#(;&guO1b0dZ%B`-C+cmTQd!v>#ivphbX at hRL;mo(Ou zwkxu~a7M0cE<7U`We6(!g9(oobcGcyp*E!LT<+VQ3u*!q5Rn$CHv!dJ*`1YwU^ZvWa0<{OvbK9)m1HN`iN$f3 at oVF^v)Xgr=@ z42v$stku}J0U~P^7^HZz?yVcN`E#6y at JXHhW!DGfu*F$>)0}4)_s0F)^_X8Jwv*0t zLMJ4p<1bkmJ45I|t1l~A^m*82ZO(!v8U~Y4`DH3!phWo;|M1n0Tt3Y~Or-Bbe5r5F z0EORtOiLmh_v42x8OKz at Zkb%1bnZyIvM0P|cAwMQmU$n>6fQzNF=z at g&3P|(O3{oX zq>tvQjIF^b4sn!4CO=oFQ04b3zqYIBh`mJe&+cfR+%5(PH9&4h#vNE%u at 1fn9$qodSu- at 6|`4 zywS)xDnaN){s74s?8Hw>;7PSSPw22ibI^pT98H7g*o)Q}&o&*s at ZaDVvY!29jB zrmK--Xz7vcwbVM)+o45zZM0~z!X9--EPcdQewU at 4X?smdi?lnuTdv5ojF9K2((0WC z!3Af`jdCr=Xh(>4TVIVjdpyUJkz=;ZGReLk&TBY}7?pN10K0OFlRNO`+fS6JI)%~U zNhZV_IKHkA9I7+lqgsj4iV^9xxf;KvBO|S=RiDGo!`|>7^d`?#R0Z2Gn`U%pbIKmQ zGN-&yJx2%kAm>GJd9g6~!A`C0aw z3Dj6h&}-aUn^W%l=KChs!%R<453oJl4(VKoBl4fR#c<+oNdrt&&?S_01qpo-Otr+v zKTQGemNeMvOt=073Y2OUA&w3y28IR;Nss7KOwreM z!0L#MJQKGZQMQ~H;P%Dl6WOhoWSNGUiK=0)M@*;apK8$CDAcU525YH&!1};UlZG6j zWIYGe%Uq}7(d4`;pZ*|$7(x;Meh0j`SZKBt z=rPEI+4}FX^(r;S%YwynkH%6k&Qs z>DFw_SB0xAFiC*SXRm-YmFjQA97cp2=B|w5J8?4~kGo7LW|U*D?`_BMt#6gE;aeZK zie*8aDHmC-Z at _*s&m{o9KSbGqVqJ|~?IHX+j>ed%?j_`DXXL)dR%NZ?D+9=Mh)n50Ln=FkW zuE~L|5MMk;OEsj5cC#Pu^~6G8ND!ry#e5-+j>IUyb}UMSt#{!(6P3fl*AFImN0YInV@$jSIE3Lj7|b|4Hoh%O20ohUDPUJY1y%Dta)0e~BZ zlh}!&*F&2d6WY!dczui&xmf9;zBiI)VF(wt3Q!Z;I-bhgDKFS zVa8=eCCs+W zNrgzzv4~zksgFDy6w5?GX&2oixw~f1lfMNc%*I%+FnUiz{K$-JhuN%Qitxx46jDK9X0~;0^3SJNlI3_7&>*)%TFu zTfpW%{wFZwwiz?RzyO3fH*r_A;l(eKjQX7xctyK_nqKLNu5Z-rsohAVKfD2Jw{vNW zib_gf{Ek0}<&EDBiX2Jv at e8FSXa z2}2+gZ5y0w9(+!+vR*$=M(BX#ZdZc?Iyk8HM|ydF{<-TF#xem#1yupnVJU zfVV+xTKZ)hjy&bpsp6)bw|$v+Y at emX*eAd~&|hi#!Bx-WS-w1fm$f`6fjD^gbJo^F z7sYZ=frRU~`=Yf&dthwo0VO;wBoCgc#k6!n8s22WOm-hO9=U^P(#4Tv0yPdtquw9c zu*hG!iy3m?cUEy=`MjCg?%F1?m2)b{fHj5qos-ZSTbl#JPp`L>5EbsmxS%ol&+lzG z?uI%@Ej>LWch~arxqBV!@L|SUGJvy&-0k?JGiHNNe$llP_e^=nAS(}H(6cKN1&VV| z5#1bVss0{kO1+>fZ!^rJ&>s=U>_$9^D~8Gw{iQ8CaUTMzXgE$aaS;5tfM3!GA`KA| ztTo8AhBO9LGDFRz3|5L`aGZAgXlogN!s;-`KIDpaRC)-XaMPWP`Q%2?_irtvElJ9W z=I4{lsJi3jtq)wOZ+11M4akjdjMMF?bMkTfX;Lr`EE&q>z+S8E8H*5iFret~YDH+LoIo-xIE zJR^Ta-#z>94(bWhGbr@*KSswsrrT!6*;75=pHB$>n3tyX!Ar~#^(lRz-sydutnR8N zcX30ck+tgFhV?^+nR1u6mkg0)65iPYeBEQS&n*(85{qCE=+VvH`RWx_@%SIr`5cCMO96_F1n zj8a$Q)mz}d1yl_+ekmxzEz!alJ0X?5$^@iYZT1vkjazEfQmCrbSTr)V8ZMjID3#P% zT-gj?>LeFrYnEqv)>~xA$WY8Hv%z68%am^nndsPUSo`33JrghXZ6j??V%o>pvg0}Y zR2y00C~d|YO_5Qys~GR*x1;TmsVZwW9Ba0K+8jO7J9x~`&xCs_|9R5j2JoKFd7V{g ztVb)}gbHeiugC<@R6;PY?{5hvMw>cRKS$XgbIb>yO{Rarck%Ba at rx{gi3UkixAv8l z?Clz#e`UPJHWCGkiqUv0k#LDuREzk`@aCo4s8UPu?n)iG74%OZ5jGdf95leN zpp-{nDOWOU)2f_sE*;@mJ=91DzShuK2|M>IYT88qkXbth*p!PZ>8H(mcyDeMGtGC4 zxHQyUS~%)JX}vNS$2Q{{f`~LIYr={S6`!dJv}IBvD7%{uSZleMNF0$dBKtxvTn6U! zd2ZCH=xDI!RMI3bq7Km8q$>%xbmQ$Q^0Ja|Z?&LH`^2g`C)94=um9vaFODG(qZhHW zT8zg+rY)c)h-6F16M>JEAVZh)ec)`f6OG~uRL^Z-N6L3Y{ zL~337OzfFoW9LX|VFz^b=X((cRBj#hdQ>cm(K4rTJ_u^MbsA|DGTP?O6y#w%8$ zNFSleMXov8 at b$#^x^74e(X-!vSo`xcp{1NJjS;DW-FH%9z;8&C;Or9ieSwbYI{2pCwsOH^%6gs>E0jwJZ5c-XOq?f>O z=OL|v*WMjoiUrQE%=gAOZ)~cUz at ac9+E1a9VXmmj@BfZ=qO7bLRiHpXx-dXMod2_^ z$bY!h{i|8$L at Z)$Vq;?K{9jBNZPXUTQG5a2!GK+CYVwXsauG#g=#KM>YLzOHIp}s1 z2R9!$lR@|S!Nj7RgEhbXTKmtu{ePGZTh44t%s+NDW`R1{nO*zjn3-N at dw<_tumMfD z6C5DYj$;fJBYglSptSo`7>oyJsxWH83CI8!hOGof;A|nOsrFL+6~P;@cU89MwlM?+ zCCwNG9#)}DIJD=adbO&}ZC&Ly*vw8<=E?tQKF5_7)n4lyDnN_T*)P*Fr~_d##oU(7 z#yqmu=vuDcOnIg=vCiV2u^C~KzyPc3xKvTn34ujCC-Fexmt!@|;HnFu%nR_HD at Up6H1-~$b1pEtWLVlE*tGdr<$)qiHRGF>r6n|CvQ`-|zWtCFz)a_F%MZ!}qf z1|=MvwihK4^1~Id;!4(auo+QGJI|}j%uzb;ZmlW7#x{|OlCd!D3UHt2!1 z>;b_rZ4cdUtT>Kw2Pu1b7>ZWhLmRM;)q*+ at fwSf&uTpAKT3Bq`c014Vy at gL>ofRT_ z02pN}cRWQBwpVo*-wU)b$FYhu>SrrIzt!otKXXCNl-+T=^^`WHF}q{A9__rV7?*SwYH9=XI|X&Fa#@97lnDt$;z1 z{Q!jCP(hr~B$w=9&i&EnyZV`%7o3gP*Nb-qAlyq8efvXw{b$O2(zjJ_KEK_m5 zkqOX%0PV^X{7}8`(m-frdaC!O&lD}B-@%8sp0$w at s<4gVQnwFM&kKc8-+gUK={DVr-&!K~IEH3vL zKoGJuB$YX5Yotqi)~oE2VC3G?cX0pg#6gB*?}<9L^AFBTS7aDICj4RzI at ZT(JK8H4 zt;c1VH{d!;6|%@8!X;Gp#~-%w&QTyf{#)zsAj at xn{!-^D8%wE1h&01wO|oPgWrf18 zY1An!=X}s#38r}SQ8`RnxqZB}yVEE3$1GXtd#q(>_O+h;tM6;7boF`)+JmyG{aBbU zz<4E}MBK7XXgPU;^P~(kiwdmcMW0I2Saw)Pf79~*+UK6m`>T?phW!5_q8R at rd#9ze zz>o5UHctu%EUD62 at B?)tP`MYoSv4+l0rRjJ_J%-5DvQ}6p&I at Re*`jH!K at SZKU{xf z%%q at YF7&fW6Ssbw&G_!LnfQHv-TmwZS^g;>zm!isXpR6!m4bDs zw}Z6M+%^%fe(2q|U2?UW!HTH^rNxM9xN!8FVhHkwge|6-s64UCQFC(78Eik9KV;uT zevLSR(Y3*ao8PhrC!}7lp^=2GO#jMj=zty1P&3w;ZWc!#ZrQ+t7gmHW0-x(uM-5 at s(*9+cGY zA+UpFT4VH>+pHQ*OZDu9o~L(ViQGw&` zZ3qAZz(wum2Y`^mqTGp#jP)8(SE at 7E<0>t_e7ZzMr~ul&!=;9P0u1 at 8D3>u9yOu)? z2JhP_UL**H35#o(-=iu-__pa&MUM`KF at 3IIYh`*o9qlHw*Mk&JU`pFDn~G)kM&RMa zI*rn<3Ho5yauUbspX`LC=VdDAiYF2z)+C839;5Y>Y%_=@GBNVdXPtiQ^*Qb^+@`Ar z{RQQ+ti4)A=FAxlF-+`Y5AMQFc=v7ok-@|aY8GPGLymgAye_?6RzZ<2eM5q+Qjc)E zjAu3aguyxp1}sqTa6#FlHyd$Hw8k`n+!CB`F8##Tp`+zQ#z%+ at 0HHxlUT1r6>jQBY zhay3E5 at U%2QKy`~sS;H&0JT7;Vs{XMNZ~yWkD3F*%0AS+6VgJ&^WQA4``{?PmJsYx}0lYp2NX z`(Xng$aP;7C^PQM0{hWl32{%fMWjLaj_0#OPxJ4%}p=dSOc25Tsc(Kvcc&1lyMGhcDfY zwC>>V2i3(sR06F8wn_5yi3F?(#%p*N5%F;2d-V$WqX9ue> zr%@gw>}<2D)5_!UO>sdPt78Ysp8XFZrxjGLYo~zf70rUb#yqH zvXjr>9E;!hP--$2k~y>vJbkf7B{fSaIONbNQ!aZFRTqnd87r&lL`k at 5Ee371L_)KE zwNpAag0PO at SQ_h-l3{+1S*I*s{OKzr)oM}JHPmtq*?AJ1p~{hRd&@#avS5 zT*KU1hwkk!Btgj(+n^veu3k(7mhwk0?unC>?e?%;ADQ+HO6yDp at fc`p3%sh&g?~ts zW3o`j62F+jp=sxGr6q=4tr8T#A%wYu#on9eqUVOUM$CwK2hfQ$8d2%IP_-p*xIqJn zwUZhGy^C=7O&P$3yT=&uMl&DbiPOqx_Hyd_oW<%bD=P)|lTX7O3s&v=mZGdIbN{h;YMx;C60sWew9oNIe6^7lCcG26?obP&=^ zRAgB14^wHyg88k|PTp>>+BxZt}jI+Miw z?8K&7R(eS)g%JH#Udk+Nb5e`wTM__+pl~r4jr7JcLQ%n`kM63}LpIZZZXYBSjJwN# zrO=dzG>}WyiFLlg=_fFyzM`kTvex!v1$h(1w$K$R$EZc#>GwqmZd*DqgUIQ~Ua9g< za3W`96GY5d0UGvfC7qYt_NK0vZR8ZWG|{+eq5|M{ts@!3BV9r11otIo{{B;VNK4uT z0CXU1l9D8KByZ7F4o0!L%uQL%ikh=ws&rO}q{5Ln9#-zt8%O->7xu;~5Q`ZohzK?! zeIdqbXCi2E-9EG z at obg7jH&v7)gsz81=gI8K60yc|FR;!G02A2)}(<-HB%@IXXqB7XNn-qAyEhs(gmK| zP?y%nIn3HNTP at R~-u*7K at HlgF)`Za;U>zzYwJ0xGAVorqRV!X_#~r at ut(Okg;2{GB z9i&@BTr0EsW9^i)2JBf9wN9IqR4RLU*f6_B)k8Bjso$1zxLXyDH97diVNvxHBl@(1 zz-+ at KR?*~!6T*Rdr7TIxa0{v;{I|JpT3_?4ivsBx8~IDK4{y!IboAt&uNAS2~G z20t-Ky-BZnf_|+uvV>TDGMH6=6*Rp)EPG~I)6Htaw0yBHqxElB7+&ZRZ%BxXpwAL& zLK~z~2AZ^5BpwkzQKy#vwnDmqzVn?y+AuQ9gj5*3AADZr7o at q^-QnUJBd=KN_n+W~)Z1>NWsgjo5PXUy# zk`^1Op?MJ9+rU{%tzeotvW+;5DhTp8^}suaHQ9B7jdWADl!=~xvQFYR^Zi)HoGmm& zV$BnS?sTRT?}uy-GvAMo57b`9lm+p;I6y!_z=(yg0?q(R4hA_UId&QSp{~QsaRZI9 z*@9c+ZL8^MmBiSV%E&$UHKw}0I2+FPfnrPGfv}Evz8XeB at jb1OwMrAmz*I?`_r%SW zgWJfu(`bSf<%XjxjT+c{K0`@IzmdB6dWD&5(mDHPk%^oH$jDwZtJe5Zrw{2!C4;nc zD<0*lt6O^wCv)8>qMi5^9#d7)SHJ79(vNJbqvLKD{qz_TuH)xzUJpdSEQB!1!UuY3 zJ=vR9zmx(FMk$|C1ucRKWhv*PVxQE4m5XR}Kg*9;6v!fzjB?u)8>bm6Z)>Cszp|kaxtamotipK#sFroQSO!?qV2OM^rlu&){=^O2d3Ay#=%Oh&yTWu*txd!)=4g zSp5no4_L1ex4Vqf2|Cdu+Hz&~fpu8rt#T?qf4DlO4%D-Fu`bR(iACqZ<7BU9*|72fk zuWCQlP`&^ppaz at r!uyR|?;Zl(&hZWn-OlL_9v#8)t|sbF>({%scdr<4(p@~*D{LlK znj`}h)tg-9fu*oo^qhEXjVYrIvSs0VS-$2P^AsD(ObY^z`2}(D5oXG=GSBcl<`i?x z(^c}XtJJ!p5oX2|OLYd7nFdRCKjdZHDXf$fW1r#HlsSOQvJFN_v1TJX5y3n at TVlMz z0?v{~ux?@rlEMiJp_{C_4 at 7k7Y36dm=edI|f4}I$Y$*tY5md?#b5Vbi-|d!jUc-|m z2UQw at bUCKXg!w$`4Qr$b9S%w>8k-T1SZjwmmZsLRuJSVRLlt;T0^}2KEJ3*Aq at fy~ z{3Nu<=kHVO9)cu(vn@=kyLiNATt5%4AYIXKcU7%(hoM6e5OPW3ZL&#{Y_`B3j?Y0E zkm|SKRhQ=!BnowFvtfEq{3usY1mCO at p$|g$>sdr|O6{oVMA2EtH z(3;;AN_gA2jx(8}pCGYRlco>N*HG$^(UZYYGC7i0UR3DBvk;M at ZX$JOC-;%Yb~ltb zGq1>;lg?)hS?4G(#IP|hd zHf2q@;g z4^cB8%V3bLPI((i+4WA(sH{J4onB-f;w0Y`Dd}*@ZYU^%oV6Z0lqpIum2k?sZGk{f z^Q^{;fYH`uSQ8Wz*<_|xVPa(HNUVKkJ6Ad-3-iz7G)5XU_ at u>_E$FX z&fk^tF5b2B7J?>=)bfwAL-h{5;W$QsZZ^ye^qED)37|a?1Lrdk7C_;fcoFFX|DZfz z14n<|MWj`zrK40qhnim9#*>59Eqv{?5Hc2d;&c-y>w*rsi zA=7Ja42;g%rGC6rgfsg!>P!S&4)3DZDVREpx520Z)Z`Z=Y8^M^@lxu{4GQ~6v*O?_ zm(_2KBaYPxE3%K+()INWLLDD}xGFLD#ct25ck?J!ldOhiELHdQAK$D&7(S4SDQk-~ z{jR`0z;a0YA;;#WMD15sMYFL;@r~Oq1``vmA}|A?Cc;a^Ofpc_C2dx?2s1k6Lcv7x z7P#AdK)JaI3I7>OF!zaD*2|$g`G|_5Cu1)B!@zTcw%hHO;0$L*Pq;4)=4O=V;=Qh5 zV#~ZT9i;_GSr_b?usH;3&#V}UYy4w)cy?=aks%e77JsExQFu=C(+2pXEu?2s4(g*e zT879Gb;a92zJ+q=2`n}EO&CvEpDr~4>85;87nqHCsTrKHb6%o!Q~UAt=#0xz%eD-k zWm?Rggfi3>|0$z4SwB;pnZnN;(JR!K?<|om*d+NE

dk!v!&T?yzWfYBEi4{fC!8M-b7IwI-mV^|)Jb{uHC+`f53e6f&v|LO!b(gWH8qVN{9OR`zj zR8=+I3x3_o+(v51T>H}w2 zPTcfjjlwwcTWD6eQXtRNM2JQrt**cXVE2lIj=60 at g5s7 z%-Ic?P|MG;E0 at jex0sjhx2;ax+5ErxY~oB3B?(2c7L*y&L9TH{tFeZ8`Dmv1zH1 zV{ColwR;kmx)Gb2qPN{$Aztn=cY{RN6w-jZxf!>HJL5pNvHu8e>p`T`ro!LHE!cnL z-=bQt^F~i?pSrT$oy>j0bNWdgd&TTW9bR5i*_loFS%h8}>*loYh5DUPXj-||qTnIU zICrBlJ^lv7eg3Tp!b~5)rUMED#Q9g&W&IyBu7IJFv!j8L^M7PqVkr}k|6(zjtfFJL zV2a|qOa zrnbTe8`y((pHnhA${!uCmJ)gWo!N(WI&R$kYA`XLCJ8!g{0p$ zLl8d%2-(G-Nt at sEP&TCvhTAh at nk)f#fGyXlx&x_zaskfYRufH4rZzF{!_8-hSMqPB zr>`K1?~AGJik8uUOxL*FxjJEAjcaCOa`|elZPnr{4;wMnQCkn%@B?wGDs3C^d^^oO z7A=lw8kFg(tM$FC-st|i;UEwyR`7&}ZHNcy6&tl0*JjOmJti%9l97uX6Hb|hmL(^( zH0AIg{JZ;cz=viSe$D7kCtqBf26N-kG8 at c6Dz7k7>EtLYm|567(r6J54KZiUR4tl+ zeh6ME=Z`km1G+cwn at x-dKa{NX$t2zUWde23(yn{3KEWEj-9=(8&r&&kF2npgAD;n>^8fg-sbwyx!CNnfdPb)Smz*Q5YqVpMrq7-1i=vc_^gx%y*n0>={#4_ z2(7~$zIQcE@~hgu&);vtaW(R!K9p-^&cC%GW#nh9^|xC-VlZSl)E>B0L8BmWxkjCR z5U8AOHBw`Oy-KOHr*S=&EWeFZtqx*#-_38fz#@C|G#nhtC14A%CMq0uZ>OWpH@ z#FpPdwV9lgXF6MWq8B(Dpc563h;tW_3#i|2jmZq>z9f|*-C1}8xX;$`#yHACPPknI z&?T0#bv=XQOU0o-e1RT at c%{1#ly(LV-I>Hg+GH!P9g8uTNp2xU-SY1gydoF^Aia2< z&p~R{6MFuDWt2o^&Q0y9Nuo$9)*=p1+&r`xKns4?udykb3&QB`P)lSP6uih0~ipHG7Jz9^Z)w7{&Rst#p*xo zX)fGw(m5>*H7z43N}dV_T?Y!8N#janu=iQxFhWyGsbLCL;~5(iNA>p5>7_&65}PL< zLA?*e7&eoao2?_Gc!W$FI@lsk*c+C`jnyrE*??#O;&|WCV55E*&}4 zS3E@*dm34I^90(f~?^sjJ zI6uOFak at B3(HDQvKntPcmyY8E-TKj2dVUgLzNL zVhlqIT(;_HpnD5qMV5#T%H5nED` zAEkFU81*P&hoEd3sd0?DOf`2#Ri&8La|omCGT&1QYAj at h;DKmw-K5e6I)gQ`4oj_3 z+=w at a$P~OO_n3@{I|HkNXB>3<(O(n;qXL6T^-zop%q5t6XcabOmz&n0&6G$wgJF3r z8zx}UhhaemBy#)n%h_E=V~?=visdIF3S2qYq)f)IlA%mb^<9+akwHN+aQ_Sq7)4mz znqEAvp>b>+gN1N%dVh#cOOK>Pqlq|H at _BMMY{Q0?a~H)pg$GcK+8bGyw*TI=V?V?m zot4{w{Zwo)PC%#3-v4piUW_I)w}RyZ-r6Yd9n8P?qfhUYD(u7}Iu7oZM|O^q@`6x!mGLg>vX?UuN3boj?3?&w1;lvEAM-!Rvd at 3F5_p~q#5~3kk?$Aq zUtdf=JJ-ff!)<_MOMYqJ8Pu44_o?s#D!B(m7NqU36p~t9+SPy;VC8->EPnCt%jUZW zpS*$Zm0Zb1T=yVDznUcuhFvld1)=B^e$BGexG0YQCYe=Lt`LtDuEe3F#db?>cf1^TrF at aY z;kO(*=tbBavES_lMl at V@$Q>gHPujXWNw+iYNq_p|r`H2aZbSivy5Pv53|q(y3un?c zDSnyLXqq^>-yH$zUbY(_I0BtRA9d-_LBhJZQgC(+1(0?Ly>S>gmK|_c*+DX;ABod$ z!GcH7#N!xbwG1{#NofJuyX$?zXt*j<)n6Ny3{FrZTy6gF)&O1;Vo5jG0YmBBXYbc) zXuE;QH7K!cmnqz9htt9^X4MI0-6+`{7TiMMwuOjXrreprR}??@n5Ykg9+1rczO`LC zX92t0%phT;mKp&KSnrS=PB;VV7piVt5z^mJ zGE=Kt zp;A6mwpn0|81&vtYrfEuHBtfFxK06ha4*^8p|fNOi3-7k!?8I?3E{P{MCmIJ1P at ZW zm+ZCyz^Uis9&71^-Yyl&hNpkiC%uuBI`HCs)eHG_#QKE`+%)B)FwYfIS}+7gQ5qgaBhQ8Ylr$(EWF@&hih3>@B0?8CWf6Q2^ijioEt zJ%CiRID7f;ej4IKMeIRWLpg%^?ow83nwQ$ctytjmg>3qFN-;wr-7#L>XKQYb^r8=9 zZs+cOcmyh4?JCEzThx_}y4Kgbb{l3o#~C~Tg(H}S`8_FHYvpnU&vlB5^biQY9j<>s zgJN3a3pJAP5_wQhn3t{F5#NO>e|ixb)esrcj$_0+o|6OKiAw~TBRepNsD#v0x^L0V z)sViv{^rImjw<>+_!nc&hyLF&=6^;1KU1)(mD5iZ3}0E>%pw>Wm_04mGzyq)61mgul^YeO%pcB2JNqLeEZ4W)n~~mmMfTyG}Tu29d<~6oZ~j+ z*Pm37CD!;Xy1bL~S1;4Nl4~qnU77?(coyCG+b-BEFwe8Uwqq?7~c)?zI(V1Q9ZZfsPBbMcDmqeaZMCBJcf*2=JB1WJY*km6Ta+j at __M0uD zC#*dlJ?k8a4u2CE<3D?or_3ZBKkMG+RqCwWHMCbP-)DN*MAYF1Bm^mA}squ<$yA(Lgb- zMeOEB;Z&U7IG(Lks96B_U>UGdwej1`)q1T>QUtM$63r&h)iLem90SNe+Q<$QX(Jk# zPVPckC{TJ6<_9 at Z@1qlGLll?@x6#2im^=IJ!8gX*!>Ac~5|HG2KOwqP??BOp994#6 zTS*Ua4>2ne3mCM+(|&m75|X76=prt8z`61V%};RQHmywTlqvEgLv1%oY)|Gcfs!Ha ztTxa$Glth2Jaoj7fq*gY`68L)^bZFcP&L%=1z|ovhaJlPv9`Tb^g;Qi8H1y^9yJW$ zRbzU5iky?>5ifLKZ_6G#60V%*5Mn#m-p?xB at M#}1&!tPwB~;}U>{Nb(tKW%d7rv)Z zlnX;2 at zDGovk5c*jg5Xv{1fDCPo at D%8&;lnE(Z}#lCyst%K?l|Vzqn(bTmoGn*$`3 z8zS{_cawgb1WP6!vO`WZSP5M_wb)FYiCYMe{|ecFAbCV2&4UNCi&}hyKeC at yd7+U- z@@0bZO ztzm3$PVhcWD>6~|r#}F|QHr_s^#Zj#Jm>j-;HVhcU%y$b$0yETKfOm+NxeCZm1%D#n6qi6Sl&~l}H37 za_+(mY0oo92L#(ol*1LVxM0t3)O!;O8;46W(kzf!=;iq(VhUQAtwWwtnUpN>Gz4HJ z!RyDmEO&Ty|9-!!DeC!tJ)i?RsOy*ujXgZl#rY(6J-{m2PaBqo{d3^%zsA0XH_Q$SRW?F;9aFJk-^vIKS3^$+t5foF%j|6QL$SeD2GXF>%{aqS=ZX8?=c+{2raaT zj=4xOfjpfxrlZyh`*|eOJq05(Lk~0IO?BmkirL-?Hy|TNuKrgdyJ|3HgKoFEC?Stq zt)tPDRx;N$Xg>CYU+D}TCg2xwKXV9YG*Jhz4aiStLH?p|woWEsG+O}|vRkVgl>Dvm za~i8Qy+|U(COT8)8spwi3p2irev?D&hc6mvb{>}&WbcUpPI6d%JAKGBPk(FHSa&|y z7OGH7>x%QJ75%D}Wwo+)C7Ky=5mhH8Tjn8mlErJr<~&SglMHle8c%sa&Z at 1AI0U9q zvxXfg;0#vL*nI5GP>&Sx=KDpxF&n>CiH$nDfDg~R(~u2Uh8oKkj;jni`9!`PoqDQK zr%lHl+f`@iWVE6+;(`+5HYP$qS;aem40>6Gdq_>0l|W8H!*#roMu(kZK$7JpC9qb- zJIGGOJ5&N(TLdm6f-^YKjMBO7DMC&-2&vERorsV!)6+MV=4_>9j9*bQFp2W7#bxhfTE?u!RvMZLsI@ zaw%hMwhIDo`C7^doYZzj;JRlvfe&)iu#STJ<&Sl3HtvCxje~W-Y>pbY-#G;11+adS zl{6nt;e}nVjmJ+zW$&Fs(gAyZ{l5I>G#sPRoD^O|o0p^-SRP2 at CZ^Lnr5u+>)1dWK z*{jj^eU3$eq0&BKXCx#NfzO}ICb;|B3&9s9H!%v2>*Y7cz}#Sn_&5S`Vq8Qba;?6e z{s3esjys at g=C7jgS-ZGPST=D=f?)dUuC@=Vy3J9lV8Hh<+Me}&zn=|{TwT&B1;^xsp8wq40u*tM>V4-g9t8j1>L=1^J zX#5KN3h8|OG5f2TVC8&HV-4HIkcVSr$eyE`DtS6~wqrkULR)Ttl5XuWD752a8zK}Y zWA$Oxj*JBQVih~fb~7TtQj|Y}kB|oI31j{6hAFhw6#D2WEvhNYDAkqfrV)RpoN$x0 zO`wp~D{8g#y;-P{>YFiq}b`6b*njl&MG6k0gc9{m6;d^#VqsZL-&-GiK2 zdTmZ(d4 z+qR7^ciBdlZQHhO+qT(d+s3b|%YJ*m at 0@t=?6`5yy%8(cjQQt`H6vG!%rQpVig4j} z8zdT6TV8HeJB`Hy3YcgX4S)8YOvUQjxonLSv!{LcFg%oi6l9NIoO~G znY$3vyh41mSibxA$NiTww;i1u3}5&!DrJN=lxWlFx0`i`ENh|d#&%ZhQQO$OBkI^> z_F&rDAjeaWsg0OQcCG%NAvo>!J>J05lUsOoe0~ja|q=vq` z6ZQPcm&L-%BX+4zRf*g&WcdvTBPac4QL?DJINz`&(K$JyfbUIcf&GS1j at Kx|s1ejv z=)Q>DX=8(%YoOg6T-i(d at XLze`N+_;t=OWFy4#bfaA2BsD4y5aK6!nKSapJT)n&gk zqXXNq!Tt;+*=vEs+kZm%=v1 zxmcD(um>@x zJamU>@^%&Y_Y{7*C1UBuXfbmc5&4N-IEuvnDd-&5kk{~Y!CaNnCvL>_#{(^#pcO9< zjgygjyrD^SQ&sPfGY~Ql9;F24r>Cq-j>)DOVl7u!E#S5flv8xczH>A{qyeMhi zr*{e`RzU?q;1X820i(U~8+)uTjkT6*;I>fWGV{RA0bN&Elywv7s4&(cn3&R_wR&_2 z)9Bt6iiV})j<|t!l);_RYuZnNp;IsH%L*?#u-H&Zzo03BPmJBy1?87qoxt0|;Aha- zvE#mQ7`Y at lm;p-U`0sy=FCT`jE>i#p0xCxQzXKuvjsX8Qa=BDqQbYURHrWLO)}&Hu zUMsu-)$FIipu!Leh+Igx)*@^PC9iEDE?D>9cz(ZQeDLaf6*8ld;$1vH{Zh=yO)?%b zh3=FI$?%%xKi%2&$msb}uj^^IZ>U3}qP12b!@FFrRv2~T#E0!Va%pY4Enc2u# z7Ao3)kMP)=$785V4w^tu9^ zC%OXLlHg79VD-PQUMGIgGx}mSMN=;(uTMLlcq(8moCCSuE{9+JZ~>DVT7?DQc%y(Z z;vGq{NHxu-y-O_6Zmd*3h7rl{@XTIdgYoJdt*|ItQ4wiFrIFI93NZBRZ3Rbl?ez>2 z(j0GxE=#oj6m4SW*uIYHl-I7LseEJ!g$IVxvFJX z4Ca#-NMi~@rYQ%?LFw&JL+KqX6wS-3^T1B9$FZA_-nadi|lQ5 at TLUKXA%*q*NekW;~Ux?}*O?LeX0L3rj4vQQ> z87 at F!ff_rPd6Y#G5_~qS$Riyr#OMHrz0o8f7yHEYjNN0vuS{m389Y}M$2U&JD&_{S zV+^S?9O8tBO-2xdxcb43$uT2tN1|qD&1iU_5AW#>>A59_$!Dmuw0mZQdR=5~Z3}yc z@~*3t_K> z*A{c(wA3!n>;ht!h)g{>E16Bgx;DqaD^gTj5Nn<69tc^8yUUAa)0<)_(poRCzc1gc zH+_;@c&(_b5SoBS+Ug6*eS9Im0I-Ngwq2o|@@RCZ%cThS#7(m8Z*A&|czV0qv83vP za~pLjJ;N|z%i0|N^6XZMIag$KR_r#)N_d=b%)P2Mdt*~%)vLwS)rDs1A$^9c2y?lx zT`iY(zd+$KGqc=G2tFP6_zl6mpcz+vb1;r~;^tzE0Pu{}A+jXaP*?9^xF$dA#Hzkb z at zfptUS8%9Njg;eVdJv2DqNYc(YTNCivZ8uSI>1n@}@l8u`FUNz+EnFRopOwqM^P5 zWXG*b$B|o3CUZ*z&0%Cmu%EbohiQ3T7BBkG_c~`h#e`RL5xv~EFKMX*s*3%Hx z{sM%wus}fU{}(Y@($>|)(aGfhlkDM&q4|cAS$EQr`xG&%gwt=35p6DES`P_PCua%^ zLCdN(cS=HZx-?}q at xnf0mgg-Yej&bt$NJvBbO=_C at n*@6hoXr%$(DXLoh>mE|RI0C=DM&bo=|~>|zn+X{%~H&FlNqXd zQftQZRCIs>>ebKGeYTd%WUa_Smq&^8g*D3It)1?o*X$-cTdm+YNXCiYg0S&!lmngQGvFc9cxMr(+PbD_L;_lTx zW`zrKDz%C92o*Mc%xJJW>t&+J$29;f4=l$G0sP& zq!oV*;~%P#M4wNJFS8l5sWo{Qz!)-Dd5?=p{o15l=4|UwTBE}}iFhzn(HWE4Ez2!} zZ0lrA|I&U8l$}S>q+fx9G#Dp}0$at}M at gpo(H_`56eSX)T^TL!Z<#O5ZE;j>c!& z_|>-C{`Mv};*C at saLQ?tlr~KtT7hb9ww9^g;l##pOwjuJX6x>;^X<*x_z8Qd~$ zUz_4K^62WwT8tQk!e^b#I~8lU%0sl?8#HTw{HQ86UwLOU)HZxLlNn=j6hdn%ee(F* zA at 0}Zd{;cTXV$vf-2)v%C~LucOsu0SKf?xc=1lgP70aC<%Y;#JtCWtK*%C!Zd?~<* z<)vS5z#>{7h&mH~4{kNLs4JL!Sue?V_8h#kLNFXCC(-acRUFZ-i0f>gU z-?gBgKYE^Tdw8FQBGAqwk30nn at nXjSBdN`VeGInNtHD=3Mi&rINi zlfNeANZFL|CX5iFE+eOYhjw^kWqXn)GHdQApf|%>bdST6MAq7~=R#u^`R3AmxY5`m zi{!Hn!O0EAQ7SfIl8E`knE1}MOn<1Jc!w*#2Eb=gvcaZKyz>KFNH8&pu(M;E*14_$n?d8Gx3ctdbyQF{gS1Cl at ZAc{p|`<(kS)Uv zo}s7)m3qWh$Cmkk*)d%dvljb77_&4q(Xf}5OAqsc*EO`HG=}(w4qj7Y9 at M>Hz(leG zzIW9WyeqJ0HSk+^7$34(xy!`fKPvfygC#)be+6ex!vDrL{f~41B9J-l^P(Z6=+ zJd!40B}K9ln~MWNIWjU_7f=e=i04Y_L!Du%p|KV2Sv+LJ~S|0Z_aQIzM&vM#fvY}RLuaQ$_G<8Qtm$dtm8c?x}e$}D!QQRU3TOt`j3E> zJSpsq-s0S898GXbKg+m;2^<&@TxCP$0V`%p32O9Ge?`#j^0C3VYFIHr&p2< zWUx?cB2=oFQ=}IrW%3y}t=Kl*+DhVr}!d#y3%~uW+6*fTp)f$Gy6gE=62W(0l*+ zo{e^1ncfZMV8fTg at +eBfYt6j}vPmGx&yKy#;Y)sfa}(Y$mMlwqD|dRfP~)(EFgTn7 z90F4-a*k94^lG at ZHlt)IspeWTN)8t8=E>o9Ii>S^E zPsm9GFe{zq$W`OH&h7!p4XY5^Q~E~UjYEbNG)6Kd&vSz;ZJ;i!lfs~Co zs`cL=gT=~(>fZ)@*B<)Lv6qRG2U?zX9?Nzbz}^Ac!xU7xqS_7wXJx2!)6Svz=8?d3 z4l$1gjdE+f&a&jI^Bt}2Y5Jdlh-8 zt~vK`bxBvxo3(CJm8~0s09bFUBr1wBdFUm>9s;*LWopBBV*YV#qOLcJlZxy|9Znm| zn(I^5!JU=G0M0AVbEqb@)+#j)KO3Moki!pZHFbyB_4~0GYFAe6G3lqQng%?YI%jIV zXl5-IW^zQ;^&BA{3i?)QFjZe@bbzR-G5RqPi0pXJs7hw-h z?U)t2PM8&Yc34aI8wWfOgW?@4yxtz+Dl64uS4)k4O;eQ{L75}9vt7G9Gr#p zm0N9{sslG1-#9 at g|2C`kP!rrWNnmx+GBy4T=7)&Snnko3s^4`s{81okKIi*P`GS^f zA;FQq|jE#i*mQ(;W|>yVF2Avo;r;>JQ$_@@ukP zb!Ktqud#!qsw0ARiNO!MqF-)^mH9M$u9+2sF>)ySB${x`N~b?b=11Fq9`j$aBy~_b z;?bboi&asrcPD*3SaHX?PgOPQXz8RZR@`XlX?92%@^0iHJC6U3=kH>4LriE9n at F)W z8)T4?a%wEnx1h=+-*!7+uNf6E+?S4!N3SqTDP3x)>Pg at Z{_F_W`9-Tn0)xoY0HfL- zUtki^L;Klk z(tsajZitjNcYyTxGzg1e%U*z8USNMj1%kLR7lpr+OOiShf at p9zBpH5fzcR0E-ek zFjoki3Xm$L&@wbt$;sprwMappAK`?w|%oN+#oJhIn58(=wq{|TZ zX_ESpIE?9fs;FzMmQJ>h#o>T`IF?Pyf;WVrQ~pp(98dhATe?7)*aC_~Krrd^_%Y7Z z&$u7BF~P~$OBkA$GGOIB>CL!5U^$GqxkV_s2Vd93``Z?Gg~A>oN**DO6A)7I&-0si z^7$495=p^Fk=vG|=U0bL42u!0g_yg7WSlGd=gbu);Z&d4vFNp;CR$*Nr{opll!#jB z?6T$v8Zw8qTT<6%a>#8QR5w+%j!7oJPE~I)4ejCjA zAK~|>1adxWL at s6nSD-0hr>aO=%ur`acaYq65HWo*Lh&p>L4mn8|dKxGN0kwzXy%Y4>aD?Tw& zx at XpQy3rNu>K?XBb~PO at 6e%zHOgf6TPK$?PFLH8&wrTRXBj)KwXT5C*O8g_+TR-Pp%r<#l_GGE_iNm(9RiKkLB1E%F zmtutx=`I?Feiym3ymZg4VwpL$&~cYq9UijutYyItSpPo^D?J5o8~$$>vc{E~>X5g;uOtasHSrx8v`* zb!PwWSi$bRRO+m;cy~&ANfI#)W7_a at 0Hc#43LS3{dx=|j;Lv;>M~gX%{Gm2OtSYdG z%joFVFOPnDw at n`!Vb6Mt2C0#jZh((vGp4yxQOTWjhb-Pja!J>{=_k-DmBIWjS-Xqm zhm1?p at HfWAd{jTe5Hqg@#~H+^6Po<<8JO%9u6oi*g!HCynqfK${kz91%z>=fa{Xn)UXn~(zHx66_ zhT4UMuy+W+&duiZ6ss%Jq&reQn>vbgQ$-pK3eBjICbm?$Mf|gQXp!(JBfJ%D^XOs{ z1Y$q)p->|cFwvy=KPJ1AgdGw at 9lSny8b|P3MbHu6s7Oj6 at oSFqFF6$y-R45JBa at 6U z^RwK`rWv%fNImhcc%s&}N3P88yKZg0?l*)ZM1_`p+t`?nn;9=f4#!E z)0UlTJnHBr+eFCvv`q8S3?r4JQ(jcC*Huu=Q(9 at Duh0!uP+kl+w7CqIT_?O*x)BMH zci)e#E{Y!BHQ)#-`Tdv49NGCV)=+SKenEWIouzPvwbGRVIv#9_061^0dj{5(m0$mW zDz9+w3mm{eK*1nDKn(xelwHZr?SF)fDu3I*{ZGywqBJEn^aG7w*~;j$N^2k_5Es*> zAgGaKLetvJda;PE?yH?6yuzYmCOBsPp5 zagzWCZh6?W?GJNutU;T{5`IL*UWIaI7>C230I)org2-rl3li+7DBT*py|xLhf_`3R z2079IIn!8N6+(Jkg>_^%HbR+w>-^eU6_C=q1zkR(vBsxSWijVZeY4RkT z2_0(X5fs5bx{9DfjLy9+x>ZwWEPN&V1xLk7fZIQ8ZHpx9gTR4+;8FhD)ad`Twf+Bn zhLV4CpAt`2j(r;(6SQG%VBm>}=CC3P^gW^1gpm~-k_Z;)v$h+%&cU5WXTLzd{qx?0 zoFNp<@IEi%9KC1PWq)#HHKxow at OJ@nPq_h~M|pmJ->CiEeDX$!1mw4}f+Pxy<@uST zAnrJEiqeM6A-Z!5WU0aKB*6@#x=lDQDK9#ua>SWeN;(OvYtZru^Eh z)0s0(4;q~CTFyD at Iai`S>za(qm+%rbXCJXhhj6?$wicBFv-H}mFaMpW{5EP4YUF=TESfhp zm&W(fYxoZn3q%`7 at k6JE7NsvDGnZA1QhQW2NrJ|@*h#l(8pm1G%U(LUSoW+Ux9pbS zJN93!hwPhq@>Z>5t~zS8EOU6bXs|-h%Mo7XNAZ*CtTbCney8Gg-h|K=th2-}yg at p1 z`E4k;1YX11|F9-XQ~d*2qlmC5C9zaX#d>msu=VM{?oP5R8aH9d;JYKkRP~ylmM)xh z at sR`LV&!Xu?p4KTRtK|@tHQ2atak^A{mIh6L`6Qdr>3ZGla(|k7;O5xXZnwj!w&`- zaA&JOhl8i>S*D>n3Iu~|+(iti^2hjl1$aoKG&PyY6%%&E at d4g?F-gz`_g9`)VLMxk zZJ|Zy>$fvgZ`GNhMV5u at av@e;7e&{y3iHy=e#*>NwF}*ry%QcIb8QE;iqhV)9i+nI z+R?Ds6~#s~+^MEZSWgIT@)+v0ky45A8K;9I6=yW&#z^jlRp|s1*KO^cOj9<>zxI8l zwUuqvmA7Re&mnl6 at mpPN-Mqd;^^e~rNv+JN9Xl#-wn0*u1UeVbzgsy)JZG#mRDDHI zjqHi`2yjuEaJF~68L??^f&o}pW*{;?tVh>Z)2e0WD{1G`_+w?Aj36|PmP3v0^Cw&F zfk9lu_DA%razYSA&}?YcdxjuYFe~-B{j7I-`TYXlaszr-%J%T!;L5_u4$?vdnCLPv z4npA$M`+3Mq<*c=%dBu=(`ZBb=^nD2O6?V5GZ}H9lC+i6O>OjY4!U#QY}CtQdOk`V z_zsr~*gaE?P2huABJ9yk4_y|BpUDyWKZdh%5%dLjit;!>mEHvql8TcPPnawkn_0Bp zS?c=r#_0*;qot1}@rWzhaqU$W=1t-b30|5ZV?{Z=#}hb=i$nMVggjBltsXGYch_bG zj?zU5T>3nJ-m!_Uv|E>*Q3o1$?qCovhZnn&FX!(zr|&l32bAWFV$U`MEYQOUai%|l zd)G$KcEdly at r(S3S)ATDMX@=GyA&rp{51lk(Q at PB`%SFJ&?CQ97f!WeuL>BA(9Xm4 zZ91I89m#cgPBjm2cmN%#`t)T2aL54ReB~vjTxBBymM0u$zhTOadS*l~$(s%-o{OJx zML+BYLzd309=5$=UT_PWKNJe7WTYBDZ$?w=s5973=6z-4UlmGIyfUAl&&`vaorXX0 zn)tZ|$aRrdKgrk8x4ZyKiKsP$okt^e at BU#nLRNzP at R@aZw!uW+OF{Nj;kTwxgO-Sc zvw=|3`_iT2345;(PPNlIk(DOHfZx|A`2;) zgCQ-sW4jcu+^TGsM=#)#f at 5vlc)YMGhfcaq-{eZZw+%NP at _Q9O?0N9oqj`b%zU=q- zZXoz- at 3{F8P3UsT`a7PO&tGK5z}~AM^nZ7*1^D9$43&n%gGF% zVrW-NJw^%1q6mit5w_GEVj0}Kf}5U+Tzmgq%2j)6zQXe>pJ{MXDwsJpck%pMVRU(G zk#mvz7J2Mp9jb=~r8B?E at alW!-F<%kYe5kFxL?Nvy0G7fLvP=X>seC|K3)Ti;kPUI z1NXK^A-cU27f||xd4l7?<>P&NE4(o6Q3i?tm;Z#w7edrWdcGY%ia!9z%%q*5Ai!e% zIfM%R)QB$f-HLh#+hW`U4h;;huA~lKNCiHxN0ZEo#IaCRGEFWh7dc-fW3?HFdu1ju zLds&3J~|=9tUHeCwr=NBt}&Ltm9lq3v+bm zA>NqLaNiVUgOFy%m2+|7p)wQc97t%qT293fII7d5kPghllIc zcfoX10+9bYZKKM>lc)4D9%9KXs1}p|X_;nB<$X6EK|Yx`i`>)QUgkr#DK!;aJ=EV8saBUz$_C%m9KjQ^#gl;p at QiUnX81(X1kcz2 z7pK|LY at Mg2dj(T|4__)93M>&uW8ssqk_&tgdlHzT`~g$3=QcUiT}uI7Y-5(zAf{li zp|q$1C%}>s$82>~=pZroc;HA{&zQd0nv+#GGP#D^6{K=p8r7;kSXh_kB5kmij4Pj> zJ~)i-x~9}IVgRyxEZ!G?QJ3J=X(s;YH1#7_X`-IV2$ntLkA?(2)3s at nsrWKnLWVg7 zxJuT15iQ|y56NgY=_%q6Nqe7kUW)UFC at nd#*M^I&!tdR`rn9h5tcoqc34^?qt(z`jptOj8YK zr-_UV+E8Uh$*nfBE{doufh8N9MS2}JhH^?w*_aRVW3)tEaw4fsX!cx--iV5G%#`%Q zRD_7bc63=y>4k%*s+Xz?le%98_Jw%Uj}=G+BXJOLYIp=ZX^T29Rl*l}HO(>KauFq5k zFU=!tpLT1O)TIaMigxee=Gw9&_g;?HeDRbrWy=-0BsqrBSaImrmCA~tO%-lxD>CAA z>~&^gKw!npqwSB?)A6O`YsX(&DbW$^9Dsb=;VS?lKi3`T at cSUoyH$1B4V8}%eOVl1 ze;CUSmrz8RDnV^&SY~mTo`k&Ws3$*IUSB3KAy#ZfPc9J;IbO>c zwcIOPT8KahqmD9fphpqaq{uVb_NihdZ0b$?^!^3IP|TX)NE4i5;2*m3T%tUaSuUR( zX}=`t-MxifnTOVxHVqCA9*!^355BUyTk;qALI%D_AW*T2ETZ|4NPKflx02DP1Gv-> zYsai53f{OxneR#k(L?geM#cu9Uy3QdvKDWlhEMd%BW}sXfcZc|`dxL at S}Jme44w zxG>9EBZKD*zwh6-1GR5?k~fUa%Dyi5%`hRUx&oDt=;otxQ at Qb0F5!HeDF!XFecOo` zjx{GL4yzYxfgAOkEgNPN)+YvpBP5}3$Ak+!hVvVK(lz`L)p$Z9>$45+jAi%(D1S~s zQge at KJz>s~#p|uNs$kIOUT{_S04m#l at n(LCs-HOxpqcpcA1bWZXZCyzZf;FReKsy- z+PYqICezy*BKItVX(A&R!e0PFXxwovLE{I5iGL^_T}xTJ0Z>3d5cvNM^Zl>DMvo?} zI_?z7EJ82x zup!bo2IdGhSmT#i<|SpbRF0_lP1#a-#1fJ`n+205E*IKK;_gbL22dB3Scc$1EmR36 z%|?&2??MLzGjmnQ`SXfSz1_N<^tCcm3L}f<#KXqQpsQ%r3>Xv*YRh1vI>!!ljT&kj zMAZ?oISFVaoLH36LA4>8i;KyMbvANMZcmyQ$BsR|TH$iqiR-<^*}*PM$;st$VoI3q z*U_msJBByY=PAnhy>gs4 at Rld5I4ev}!>BbNL at tTa!Bodg)FvgdHPf8VSsf=yh;&r> zC``om4J at 3yI9cjqrV=t~w at 2-ZB-QlfY3F?#g%(=ydhRVMS?mtj?H?31+gN_~Pr-TR zq)YJFq at r*-hHe?@e>Q)1o*Pevin44e9=hV&4-2~mCzBMTH!LNp@~m82XOJwu(9Fj) zPhNR`@eK7%f?LU=7*WN2FS|=jX0|$0(ewhyH zu>>5RJSDX5d$R8gPjyqngm)H`NUIoat at CL*|C-Lw+D~0jNLC;18Irbo_+wN*J<>|r&nXanvNNiS9aifQcC%M|>$#0frtp?BP73b+|6ZeBROQ(>SweW$&3p}jl zKOM#1Y}1UA+R||~n_L_X=8D^OGnvL|_FHNOJs`WR^Fxgc^E~*t;rP5YW6d(D;@(bR zI>>h-AK?bO8#~bpxm1m{6(wp>?m%@+!Px{eBySFCqF~n~1cR&~dgu=5tK+Pckm2Ek zhm<6~lUaFp6oEbO>zo1 at 9!hh|v1NULv;dV0|wCNo9l8JsG^kLpX^3m;Xu=fTeD=VUZpBc#>vKTe2C-LYqE%WmTT1$&cy$^xHi^ zA-M?=qtZt#kmVg?OA}CT<&ow0Es!OPMStq(M{<_kmWM<0O(N;wC&IO3E~7QmtSUAMD66MkwIvDnml2GLVdd^102aak2B z&?a4JIKR4+`bV=9UWu9@@zl8p<(^fD9a4#A#J+f?N~5B|W%L&m>YcQJ%F8 zvkP+ykerW?>U%ucvCY3ivuHb`&;Y}}mTnn_?f8(<G_ zW*O(MfF85&L5nR4;Wx}h*vt&!*0F|0ckHK;FQ$Fmaj!-2iqx2{8nK>qg$^gC+!rs9 zl;~@iUtWkUEzX0d5`y;0ySat?T;J#mEL`xWF-8>UVvF+eB?cO~U^X1knh&WoP$VeJ zOGMIloUxb(;W9dJO|1PKmj8Tnq+-ef^Zi`PdO$aYpms=a(EJ_f7d+}*yK&gIs6pc? zC}+eIdfgy%7(wzXi6f6bQD(uXOZJV$A<{4{D9rl1xG&?Z?|fMaaV?ev(c6UJMFtUy zSp?U_c6xEiYei_whA31P8#Y03+twyxb`3A>ZkTh-rdmCou=yBq<4>6Nt6U=I=hAp3 z9YI^Qr@!YakJ>eRwPmwCjM`niStxjjThLP%a at I0l4Tp$t&$Ag02pX1LB!?7exk&PeRQEs1L at u8BD^Cu2LNwMgsz#n?@u<*JAs zKpeCSQd^TzOXD|(Ev;%AH;F&*j%C(*q{q;2bS0Sz)>bsmd;AAfcSAmdVpd(UYj at Vg zkuiAf;o1<@-&>bdJ6L@&YCo(shv}=NfN<>tv93z8J``(nfL7ILw^YR1+m>LS6~x+eS_X3lyXe}1X>EG;$4Ok(M_Ex9t;WhQ0j-CNqE8#+ zs3{3{J#xl0a;Ap8kO20#=l##6dp~1e|2M=yOr~5X+rbAUPt*@*(1Ba$8m at fbCVbEUl^B}@K3C-MfS>Z(VfQ7W1_1s*iPWjoZ z*l^_ofpZI(3uLU-shoWs91c3911*D)9!`uGIIA9x+Sn4~hQv$sh&v zmEu5=>4nN3S|N`x4@((ZNxaJEL_IW9GocH0B*zlKIkL$m*D!dRZtz{>;=dpsMPWnL zwT?&iQFmCSAFZdmu6Wy2nt~ubC3C at s{QY(KuXD zSy&g?p^~fB?`TGD6 at T5(v z+z5}cDvYD-iW^n=&0}okFfj3FL;>Kv)pW=Zxh3eqT?RV#E(Luu+6EykBlvmffS`4dw8ER_EYt?@tqhOL0zCp?zf+ zVc%x<>yYv~!uQB*mJoM@m#(m0mv?Jl~_xxxDh zjg51P^3-pOv)m*-fLpMmv~-38-{e`YU)o*4b3idVj6^I$omzg9q3v^;gYepTC&|i^ z3(JyQ(g8oAkJjFVY-5k+a+5u^^wbv_T$P0l%Uy at mgf-lU4X(tW_>&4e at sJ|Fz1)st z4!7n>v|725M!LroZpyn)jq{#q{HcJzTJ&(nBK@*Ij2Ren=&`xI8{J#hyWf+rf{&iJ z8n55aFGq~7NMh#5UYm%*@1uxOb!k~rF*HtrGChP5|ID;~d2NVCYTzK&dbRsX5PZe_ zf*0qAsDA`}jOE^<@4)a|B6Rz#6hV3{32e>z1sz7 at pKP`tzIVlJ0D$}cK at NVR?d^mB z`3uy5{WrDff3{I%EdHK`ZS8Df^KT+rjf#HllfQ77aO^gg5g5aSm z%q^v4saE>iEU+)*w=+!LTE+cR&LE>HzJUCa?`|4_QRh at R*L$31x14T_O#MDS-thZD zm+QDI z6l;afnNa1rUYz-5O^?gYfojz#@()wa(mIcd6j2ZmmOOh;s z^&{BO8Z=Gcj75JftPp2OL~ANY=GdA;s~CAdO`ebk?LGy_h(L<`374GMJ~WCaOte;G zIR{bG-4Yua5mV7cQ!sXa5e&j&?~XHHkMCphK(rd{2?I5F3mQxgxNb6*Zt!$CRM_oi zd%ZvOdH at x2`K?)RKcK at qe+;PSrn*Xd^t$G#Kf({rf{9z!9zrfaYc1SVu^q at 0DbL3u zRDx6(`ZS0sI<-lG?W9_7ijLyghIJ=iH5)OZUzz{vUrWyEe|*wZ+;&J- zZz=)M@~GkByUkv7+ODc$Ec34x)Z1X#@TYvu7 at b#Lhg%VsQo+g~m~8;?O|^MBwN0wj zb}Un>jAdO_iI}u>tgj~97A_z+T63oe_&Z8(cv#N7WSCvH{DKV*=FFtata_{gER6ez zDH|J--7YX{{LncIidniE)4p|PR>!I{<)vB#T+LSOMX;-o2D@}))}20eMI0_%4R`wu zbRlMcsP=>ixYHq0|J2uKkHOVqYanX~0Q_I~VxP&Fp5scnCKn at 5@zIAUxx8GF at qm9V zHy7=M9M5^y1m#eQNHa~ic^jKM;6W;X?Cvnl%1#jhgKB=k?w7aIF1Gvgahe8uf?y^T z)9ELVW3_M&qa>T2y^!;qs!_E?fXv5ZOK&!gEgtpl26gYqy{0_x*+o82Z`H7F07 zBI(8nCF;h20Ml)}vs?ZE6ooMHC46{{On~@~ zI%4*xx7-0N%CE$iNHEAAxdSVd-T0T(VK=f~%za4U;i5)E+>>S?CE?W!>{a6_!&IOu zI at 8KVj$s*T_6OF8ArL4^F!N~KPLruleljbBDoB8Yf4m{fx+#dW_(oD>LX-&{X;A}~ zt5axfOeyn7EPh(e74f>EQIMmSkuC_>;V4$ER)&g;>*Pd9#)JfzMye8Pr!_CdQ_f8Q z=!AoZaI8gRZbXh;9I2Z6mIUWf(PhP8;mtrm?ST90o`O0eP8)yXPnF~8%;Ez5Ib%3{ z8a{b4j+C)=YwP~>;c*yf;FX!m1DVBYU(3YB*{BxMw7SidcWmGEYI$N4cjiK}Tg9$PQJPs9uw1Y}LQGwFXwu){Ts z#CH{)8KCJ#dkWmtFmrIGrl-)r*RY2a*s7{u696MfNL at 4;_HzKn&n*cDukFlKw@?pW z*Nx28AGtvA$~_gIv!&O6qHmVDlKg2EVs_S6b9r#LD&~ti&U{j=)G_))mQ^}bVvQFk zS?uP>lQ+k+ch;I|BvM&Y2>sbeeVRV~TThqMdVSOhFG8DZQbmS=%BT!a_8!J}q&ma_ zfwte1kawc;xC!-jVwvlGqz-&51JxFHoN3GPo%Vitw&!Uw)i9V@;i{0->ddhJXWTu0 z9xH_gvFL}2F1`gLuR3+VH`8#9xPOdT(}8Uuvl5pk%`mT6E&5?Wq|yOJbX*u3W32Ya zfrhEn_7VcyZgG4hj2=9L_)dctyR3gJ%#3_>BhU=yo~T$t6%)LRGOy&-;BOk7Bw4bE z+rZYCWSfH&^8U{8kCa*rbq-?(?RGalhJh+Z^NO at v5tSO!j&A&adIkI-$ZvK=x$}L^h=8V?Y+Zh`=T373ZSlkXi-;Pab z$6u-!@yM0nn*n9MF&yw at 1}X%NmvmVCWXwuYqiyIG3E*1lmTG zX;b3lQ^~MBrlS+g+oj7z&2IxC=S=nOwVGy0dg)=Ryk5gz>m}|PoCVMmjn4W!ZtC`a zjO)+Z5jjVRSc_l}V(f8QpE5BcG!B7w1Q)3k*3hpC!R-X=?;(UwyX6KcA5B<>m6(hMD at heLQZ4JDuL$RhF(o3V{r3;fltktJH1t#;e+~L|Idef=D zNn)TCVe{BcUz26yjxxBYWLWcqPxw z7uSWovWGYvCN}Y>BGaI3L6bi)CGok?vw)Yd8?BUuo{s;Cu?ZWsUuH at PTN-9Qc6Bs_JZ~_q z{7R)ZIiI?vT&gzq(3d3dCE(;jiL;Jj at 8qY6ZR}r5=3l!{MBCbn5^b>e;aymeUuwI| zpjOiB&-SjEZ97K0>c!mS`!lbDHC5;cb{vH5k1d1y_~)RjDzrKqn6 at G{_U?9G_G0L5 z^MrNX2kCwz#D6^ej^0yav+v-AoN9>sA>;E3=-X&Hn!SKU?$D2j%kBbU3^)DXtvBJe z0CrYkyk-8|d*A_{IBl_>+*jZyckE~{w*$wh>5w1zntV(z&i4Uc^($P5q;rrr1q)3z zN?ewg?rStsX6b6xPi!W%P8WBCG4m+?#?)bgIksSG$P`%1`cCf+U z|M&wIhP<7@{FSYB|2 at +5{}821I-58e{FSQxD^p9{{R;yijrB>_ at pH)u4U?=8<`>$i z${9TjaL7WHLM-T$z$4x^+i;F0cIi59V|?a$&tb+0ygou(|=I&dbK=gCHo_ok#1CLcX3gxl9sp at L`Ofg4|iuY=t>R+(9D8Je><(|Qj|Q5BVJ z4Hx`P3GbhBU(7ud at fH#*Pw5aNL2A7LK8L}kg;&nKKU|89$b`4aUlcpOO!*pEmJKEU z_=P$>xlme0Rz@#tVW%0hGL*mzIwvO-tSRcQr;=T#Ds9-4wiG^lau{Iw=I-_IvTpM5 zk;l5Or~(bwFsSb(4stQga01Iv3fXdb1Dkj at YHY z2A~a{CJ at LoJlKzVa(xmwQ{IIO1XwV8V;czMMXu*PV~jX{AFbh=mSNAZJ5b at eiyidj zhW5RrI&0!5WwaL^*2sHyo{~wQQ7Ww-= zsn|){IyoEI8kzj9^ZE~#M~(WWD~dYWmt4Dye*-b5k&#`6;ZY)3OoIiGVnnH=h#_0J ztSA2XPYMLk5MtHcV)?ngYb}mU*P7Zd8^SWgIoCW^RAYZFGKQ7Rrde(;KQ92_YTfMR z9`MT-)E-;@6KklEFi(FZOtJcnIaVH2LxjWM#Tv{WGV8-ZeXs|}do3~k at X$xl;`Gzq zfA#}PUwaUN^K&bXs5kz$B)AUi!=xnB;{PG-Eravunk+$~MUR-7nVFfHC5xGvS+?jA zGcz+YgT>6uXfZQbT6b^v&h#6z{msrsR8>^npEo1V&8*Bk$MUU4JMo4+$W#&QP<=qj zMz%wxw$cqKyJlRB$EZ$2t{0v7y#|Zzq(htSpz_FhKn=E|qee}XLnz at _YjHAQ$aYZ; zcwv)K+VDOefU<&Kh=$2rWZW*tl8uJ=%|V8hjdf}lR`L#TRXonXjXiD+?3km%T-1&^ zV2(1S6&IhOWsjb at 6mM-WRhC%sfsuZhR at aE`D90LVff&g?QLGptu+IkYm|2`waL56- z9C6tbeuqW7 at VUQR zKX4fxj_7)YS7vrh*I9L1r)3aO4si-aZxj`h6Q~VTAxq|LEPJk>Qjw)d`w77 at M>X5l zWLV2H(*~M(?|A0(h?;UO6mQcL)Vkg$MEnW;tY3;+IQ#LK%QI6h*~#hZepR4SDq?U_ zJ==+vANdmtLp5FO_^R at pF)=EP=Ml|QDj4~Sm9k&z*~Vv5w9N+W)E at i2l_pwSS#R01 zGu;>RiHbCK><V$VMzN=Z&A#{=JpEv85Iouz at D1^ed7v3J8B4S-n;*Eg(iw?W;?0_O-sot{ zvZBMxg)1+x>9y?lys#kV}qtv1;o0|AhX_2pJ@>YUZtSCcp3VjX9mQ%b2 zvKO%h7LP%<%CRZ(N`I&fw0NzS#J}Ip zardJ04$e-9bp;OMBR{kilLZ3fJZCkS7 at v)&x?LBx+!E|}OD-8?_na4ZYoYC3ND!GP zb4-f1&h2HbAbDkIElbV4M&pXf>Gx8w91iSoX5wp|-rilmeSE3L4Z|cXGaWzf{rnA$ z at c9o3k+5fSx`w}Bc%UF4{Qt+0_n%B`(fkPgOn{KwS6VbO?_h*UF+dnNQ5+A^w>BZ1 zs(BiDBx<~v0B}dD;DBsUou~W6>Y3Q%O9Vrpaxj&MT$snFGe;K#J?eZ_4P*2)J!3V3 z(KRb3&LzO%!AkqIk|IiT`a7YFrfnPdn`khxk&$mT>^0nk%88z-vrpM5Qipm;+miuODO(R at bd5WCzlET+>E$48cDRj z_`d)E0pa~W-HiVvtknB=&S)FnlifCjFUR%jODfW^A-2;c6aCe&ez8$ zmJm$tgp{Fte at 7Hn1qw%7cYmflHe-H9$!R4^jgf5s2#cxOYoH?8BAITgV-P4{JjKdd zVM)n{zj}nI`q{0pnj28wVs44Qw1m~roU%mkPFHDSDSqZopBQCiN#EMGbor#$Y-PEk z-Z>dpbB?d-_KrZm5!P0v(pk8z9tpH|kI0FW$*oL{6jv_ zTs1TA;Z``B$UzKhG`(1rVtr8-Gp#3v7oM{2f}KJs5$&O#Nl8_eV8k)mVnfKJK~cyv zI;oOYu7ahE;CA<*107Rts(Vmmv(letH6Ci5GUnhE|%~n`nDvKN@ zKt%A&vUc at sOaYGMIE}`*vON=t0f#Q?Jh(l$j`+|jz)&1VGc_le3<~#{vuoJCwOX$d zOVW?kzk at rcAWm>snHTkycUH`;yhvj+V?UQ+jGX5Wr at E5xCgkILT~l^R%4`#iTp8 at j zhwse~asdz}cAQL*IO&gb&YIjB at 2hZd!0&b>rD}BiN{j8zJ_ynYNx%3kG#oLsfD??a z#4d4mz(~{ps#&h>V0~$)KrTn8-iXVPuW>b+Md7l@$ zB4k#I0{R#)ntreAXE%Mnw99Hg!Ti81; z3>C%44%o`@G$1x(psCUsFM{}S!jIwPzwMDJKgs-jrfH+=R~`%_RL~7G7z)k#13l8c zAG3$Wcyo&Oi1P4t_zzaPxWV at zwZEua4EC?mnEyA7 at l(-L>}NvjhBO5$ctI!hB_)n8 zV-rZP3lWoIBYQ#C@@155Omd}P<9TR(-9@~S#Ad{$`F=1kec63^%3ZqlK5~u=qT81b z?t^f_>nN0m;moQQZbY*Sp-ovxoykg*4tpxpK<2bToA^GK1T{>qgdM5GoH#sc^^9t%1FR3<}LM!lkLv1 z?+!e!nZ#&V&?0f&eNNaZq!!10-pir){ZJ?Q1Ep|M}NxjUB#eXRDXn?+bi zD3tNE#C+!W$y?tKs?mPCwD0r9NKT>Vw>pNbe%F*cG2dCZmCB6kRxrqTIZP1!fqX`D zjCj0c%*4yrx3rK$2I#d8uQ^P&-CU>V?+p*OEQD*I;G4Wx${-2uZ=7oe7+(k)ZgXqP zw>hYI-RK`oQO7uXd}@mjHPta%qt?u7Y$-2^6r8mcpAeWM`elcstn~e(T&@U*WAF+M z0wPZU0z&uS?v9$Xnc06W!&QHe{DHQF{z(y=U6(Eth$JTzB|~gW1Zo$Mkc0z%l98H# z1>3SZW-j&3-6CacO-Mwix>>ujta!E6uXTO7r65j8Im&OPXXo1E-Qi)y{hjNXcZdIZ)8+c8`K#L#rcdKTbBMD4g-ie)7+Bi>!X{9-->CbV6)_Ww%Jo#_CoWcw`6~fsVByvZkV(E0WWnLc*~~`eSkOJn6}rV zW#8Es)HAe%+3p%YBul6NyG2&lJ7fqiQnUSXL-!3K^19)LAo9A=Gh+zx`$ybR?DwwW z{Si9<{{2!K|B}3`GUg={$^>s2kBg+h;U3brqV0I6Nl(d|Zq;82#4elj*>dAbbrKbe z&0cM-E|}#EnTrS5q+#05ePLKixg07b1cb~gRtqgx5my>{n+luWwzQWgDXjgTOE;g? z- at 6%2xXt^+v=hzO at uG3JQp|WeM1vM!dESiO3rsd!Mh+yP&{12K@{iGY?D?<6s<9d! zJ?YkJF at n)`MP=wyjH0kj=u4K2$yl7W@}1YGi;NcuBZ>jmN=Q~)RLm%i2Tr8FT>+(l zLP1nYpm)M-rS}ChPGi+fQ&fPQ at uC#`xvA!_y_)T8UcH$?Hygfl?B8rE6(%cz^d588 zo}c(u$+Z<-Zpf-S+ZH31TdvytB**fV%)L%D>6cuh_wbX}jt|hn^JWu`?CcU&3SnwYK^uEk-7>E>em!?1e%cz`GM+5O3oa> z3pDaB;sIid>iB0 at ubwWRTHfob?>Yq&g2ca-Z@|K1$Q#%ZVKB?I6`$_~5~m6b#Kzpc z5Wx?XN4*EL2~1W96w_n&%*h~EyeCZ8^%HO=xyGVc591_J``h!IsNPGnbybBuXTsCs z(JbO4a%nBiFWndH8J8){-lEL7tLP7rn(wHqa!L(`7}3~{Heer6e>lOGL~3%Jd33u5+u7pgdEIvK;|(urejHmd)E#m3lDRFUY zg2W{U$Y at pK9Wzbjrf#6J#F#yB$y*i!u882tkEvIgzFfiIDvY?P6ZO;%RuA14a7s^2 z>EY~JlV{>!`1$wr at o027C8!1GWAft9kNLlbS`^`)mg?K`O9w4u-zo*~>K97kp5pEoAD*(khy`}$tX5`nwhZ8jPW={mt zm92HCvO|pQAF#d4j!;)>x47`VL)TPlrqqdUmI1iVeqhpy&Lh`aAHoCjo`t|mI)Y)S z$fPk&9E821z)CV7u>oEux%s6TzOS-9#TO9VHXTvG4|7_N%9luB at 4f@gXU!hrrXR%D z;tiwuox_J at P&8TL8IFpS4Oaj)`~n at q-cO*%-WJYwkPrK2Xd=$`u-*00ADrz_D7G#_ zL~GA5VZvcj90Id$RXTzLqu54IFv59997L+N@~E3ph2#WF*IC6SSZ%P>inbgD#MNni zUXy4 at wHih{dnR`CHe7x5S}K13_U1_RxcDALfOSQalINQ_V^oO?s#~1V zK}g>*y0l!4Oqop^E+;w%`qAgjRoyq=LS&O+qio-HK~HZPRVrdTD*mth3k7FC9ZH3R zO_E1Cs(8JtNqZVE{dtC4iUvkUuwx6Gogm`z_I(1C+@?h1#^bPU6@ zUFE6z!Opv2G$#%i$ur at aPXr0XZ(ttYH$FqFI^Ff5R<@9SxL&r0U=_cWwtoBbMU8_D z^S4F2Z6O<@Ad#o~v(-9e?z9f%u3z at M*IIO9E`hme#dw%vzYIAN-;s-5v+L+-;GxX?z zlEg`#Vh&(MTO5)tc}8b$m^-TLn0})*uS at 8Seu$psFi4JUmALtu;#Wkz2P4iMfX$Lb zH3!4(S&Qv7$4cT#0*N$_9pd^^QD#=aWRVWx6x`Avdm+tu?ut at hNlKPMwbP~*%4s1i zTD{tXN8S`5e!XZw6q6A3CvRN6nB%`Jk zt4tJ<7yMW_$Np0)gSGbIjpHSkL%d$gC(6eldDZ4@>TNG;>?GUHd(`B5U`LM_({lprx)eHmhw?Q(HCD(&T7la%W`;XeYnzXFGTK)( zry{?80gtbGHfRXvFoBfmL>v3=@;}rC$mT+xq+0mJIB$M&#YbP=l=qI&#|~1fX{;wy zWx}wT{?VIcJ}Z!pd%c3_G796B7}!T2_gYt1ut*86t0)%I>*t6O)r1?8_JhD_UtG*P zEliKmdugg~-6mjk3$t@)r^IBeY>kw^f}1JF;w`}&52vMY&{AQE>V2|Zslx4aU*Kc0 zifXmhY1?EEkw-Kw4^r_*n9U{Z+$h-2!#BfVBV#Vx5Nu1I{dLqR};Sk1_ES~ zJ0C5U!ckK9a*o){`%XAKT1XK`d5Sw&IvTaf`9M#XBcgm$Ts$6VU`EpyqF&^I>+x}o zGdy;FPn%mfk8DjMB9B6&??rX1HKOY239|b{^)^%1ny|LrJ-TdXM zpV6!|B-vq{ysVaIe2T{0eA##26Qv6hWm-gnO}+VSCUp(!6~TCdmm70~itNwQuZSWL z$HDs%_06=#Zd*#*#-gMnoio?|Gj~p$hjsMLCgvN9;dhA7e>7x)#$m_nLx6xV!2YY; zSi#NK)BYiKfdm8e_CC*781(#(@|Q|JXe4|e%3wO5g9>7eiK3LIqJp_M z0>d?~f>uqgr#6ul>2G*u*Wt858Po%l(0R(;i?t zo9NK<(8j{zfqR;oqwVX&6rp+Rl5v at mDG#}ti zXOU%ZV#E^`Jy8?cT(*JYi(&ygl6TqdZF4gzG~#*7Zz*1J!*~&EUJ{*}yYO0Q!duFZ zD7wywe039s=h)JQBn?iqyG#pYUDG+0vw(Lm{hp3I+7# zz at Zl8g^(kvVZLz*rv9RJl at fd!8J>ndhYDr=r|-PmQkyB&u`1%gPXoN_fUT}|f;MyL zOpYtRJw^s2dv|N8T4d-?#e;)ie6cv*dRMp=kGtQR`Pp2&`BkTZUmLz?^gbs0#_wy7x!(80Lx>+J zWV+%Ieu2Kzp;U4Z)PMu_uIb0R&K?Oxr9$QDon6~hlVB5;ca%BXD~mz at Lz;;5rc|Oq zeDSE9txfC$>(TpR_)S;Bt0F?XkI6ML#}rtW_91NEz%-I8ml!ZVveX{|o=xfRsJBwA zinuoBKSbzK1%rK%zfy*Ld$SiNaZn1Ui$4m at K6ryExYR7N5D=^>5v%}!d= zfhQI9Ld(ou2jg!Q2Yj_q0jW|dQk1d*mcAmE{BtDL1?2BOJvJ?KN>@^B(tL~pmP1hT ze_)SJWgom(Q{NbK^R6K@*S+-ZVB%mQrCvb`1QuM#q at u19$&mF)lu
R0-}rn0>bp)|H*T(b98XCH~p_zRjjF{iKdD4nW2TBK~9AeEOu*{28pG_hAg4m z2N at Ixy`RvWZWYSGzqPthXw1==!FRMK7}s?Zmz9_|?BYCWlXIUSn0VN^B at fO@FWWD) z)8S_GT4AsLcr&uo`}xffWQSrFNDHGo)QoT0?#QfHz~ixZ(&uLg76Qjwb3R=%mxfUdL9 zSlDx{dp$XM11*S>F;P)W{Z?h2%)ZdZCqNP%pyoC#IMm9 zt)vPph$#X<*jA7d at DC)ItmZRcysXHZm`!e zZg%+L|IZm-9n&TwoFwBC!d-Sze(Z12cO&vyTo z=sr_sIEDI$9{8p90y$y8)!w#A&Gmxhzla3g+7|o zd61G<-Og}yhXYN_{Auc%j~7H=7`VZ*K1Y0jaK+NBlQp7ON}HiDTE&o?Faj^yEU^Y^ z)=X!D{A}tQ7HjGorD*CK at y_f^ap2-hd?4#PGzhg+9c6S#R at CZ0z%sqp6$PVv=vv+* zMW`E at yVq5kn{>-g5H`X|cb^m`Eho)Y_xh)XsJ26=v}x6TOGl1aXRM3Z$l8X#JsQ)N z&4GbVVeTP(SF00WRVLq2X63cu^GAuscnF0k8}*)?QsozvO+2 at -%qUqas)p{pImS*F z?Un)mgtm1%o%?jW^kdECW^;<#sFjZi4c1`{E{KV*?VnCP2`$s2N!YsoS5nZNJ} zrL)KhhVQW}VSm${&?TA2yB>T|oO_QfJ4q0MHAV%=cyzegJZ zL9z}0$~VjzlVI>&SLA8oQ8gq-_fA-WtZx*%O!$x0yc2I0LH^D$TrDx)HH4n!mL9r- z;)m;`VyqKkk94FxQTU)jDi8_gK%eEq;w`B8>6uD}!As9-8pcZjGGe#MRPCt=B(JPs zf;Pc&^dp|MPwad%G76vEJpF!A*Z4ScKG6ZCHu|hnufSoX7zu4sL}a^Yx<5BF2KnTK zkNP7LDUWkAe?XY=_wD0mNEIMR`K~4KMx at 25no%jKP$?**6S5q?MltKcW&|Ug5*wC*ak-9*yUI4-%Sgnxf;lL`pM({aK7cD_l>s0(0oxp zTCsy443-nky1%G$FbMlxG;7@@_r#Y?s at -Q#?*CUX++$S>Xq5=vz$k zv*Ce4lhLLWdqkA{=Hhv*TFP+eU1_*XDL*b-Z=t7=Q+4QQFW3?wi89d{5}m3`fyD)r zQFTYTQ|@?@^Qk$Ko3i#&iD^dO%;fgLi$Gz0EUoF&Ws)V at X4VcRv&^2{yZU4;u!}l7 z?EtQowz*T9O0W)m2W>t*_%MYUsN4Giceh{GOEu at 6Jy|Z)E8k!j at 8-K=sg<#Dge|yQ zWq_+-LMyNG#tVsRUlxhjkz&*I$UneLHRB^@eO|NOZlu*x*$%Yh{!{g1+{)j=zSJgT z`|WT(S*9(opkIH+`IDlrbzX>=lI*;&WnKU?nU8 z8FQ>2q#Hx8a^1+0DCCawtCVoi#5J1l%+Udve_tY*|6wYS5{#CZ0X|?deF^NUwhKD%lysN09nwLd%F>*IIsufvTek#z#chYhj0k^3MH$SSCBRND9(8V_?>*>

%-L_rHmHp8C&b)Xg~TS4`0p>w zzi;bxd4-QC3B1%>#(3X0Kn`xh?@@2DlznM*a`#+lOzzaC$Fd;pgg>LZzx`M6xG5ft znFRv at F@**Jk^KJz9 at 6$kCazZQX8&0KkC-vZPH{o$FQl~k1Tu?3A)u*=4cb#dJ|>fj zv9Pc<uUW%&?U6-GjOj#h&Rt&tRsS#Ts_M=05)7{aV<5 zn%Obv1+Ch3!jRr1lmJ6y`93aWBGoA|!pZ+lqi~9*wY_yXPR(Wr|E-+s{oBCz?2X|R zhf8dG(H&Omgj!ztt<5<-h9_aB(`K(wqXzSH`B*}1^bww-h!_*ib)HsiXZ8(_&4_Xj zo^R+HXYwQS+A#|(@X;wLCJV7vIP!|Pv(u7H6M*y*fby57^&cU at d3M!S9Z(@G+FSy9 z{VrZN>5O5U4ylj at EdX_D>$)1#^L#76JvMLG0QG$!EZqR>rrU-)-_}8le2}8-IIlcn z(0YnP257~S;P8DnIEz|L#0vqZj|AUHG`HF(Sqkw6z-g~5$WCm371Z;`DlbI1MB!$p zqf)C(JNr0-!+lD%PfwfGdu22wrCn9InoKS$)2+nPqBebvu?uTXpdGAwGmfe{dPQ_} zS_ORm`c`!LdNFPh#;Np-J#WtjTZQgsV|c(gxzm!%=&lh0brJUR*SoM8m3~_MFVb&J zbd}8dNVI0R{n}B)eJtHjiAdQDk<3=?a$nd0WwELp;e0{EqCx+_gmUKfK*WLeBR*W&VtVx7`8nS^N} zHLdt7l*)*@F#};Jq^WT5<{7X#q#oEkNpX`p)=c0_`oF0JS6YkeZwG(Y=X9^_7D&uoi%;hw;Fjh~tzQagpQ){HNUiHiWr~W-UuB(Nijvt0 z6iq>GU*()%nvmHM7tup(UuB)c5 at X7Q$_5wkoN%&}1wPabJ>h6u=~;z?A=+T8!)e)Katm23v5RMt*Kjr}6{}UV47NPWglJpEo*lwZIC5h3J9jADi@!@*V3lE|^laD at oK0N2~_h9V++9^ZHLASArce~Sc+AW}!4&{v=IWsAVZ?C~* z)HkEEnYgf84*wFai?WpUSTCWq*GvZmV7EVmEv(`7CgwK+wyK4!00|XV9S3q2tm(KW zdoA^&(VqIO-B3am>z64d4%i>&v93#5$H%hA7wn>IJeN%af_l5H!RH5gM6`u!M&%!W=*Lc2>eC{#*M;#JB~#FL0hRY1S0KOHIgd34!lUiT*ngY zTox3EadF_#P8o|(q^8tl<HB-r{0sN7|2L@)EBpVDxC at D$lL2Q&5_ec%w_CBM zefez at e;M at 6pc-0R0~t2(9I=SFs(ekXrSWm+-$z%SG(sY1v7lY99VtBSo<8qjcOiU` zfyfeI;C~DsOwQzt_+aoT?u)f)Pm^YjE{(0&BgZmveIRu1;!o+f6F|Mv19J+dkje|H#-zf}>hdb!oDl;i~j zs5l&u|lRKhIr)Xj3>7)|KWlru%-EW=TX9`1?HhGMRX8jZ8uwcj}cGTz#!{Z733ccO5Wyd$?AV?$NkrKZ2$5Y`Cr>BS$RwWOc=>8gbrC5 z868y7+c`WchnehKs$m!u=GD|{00--qX$jN^y&?s{2Z-SKcYdU9$9lvi_1em_?z6YI z&ld|DF!!oWJ-;4+X*W;ba>+Ip;QAmWg!4g~>*eh9c|9 z7u8$T1Q_tJ3LpKO7P`oxI|gPX96beHzx&PkA`64~IFjr)!UkM2QUoGJxUW|=p1hxO zVhJtT#Wv-7g_8TD*ib|yV-rWCnudFWQ2LAPjeW`Tb>>un7&FUK(3qojH z3(FF+XpE5P=txRFpd{N$+7alO4499wl>#ql<5f8Fi8XNrpW(UrjBPi+5N`@~bEJW@ zvr0w#6O)IN+&;OD7So3-*Mx$gleaD#!sB0G2 z)XA;APMban`t5~>(@W0-MsC8ivrqiU&3LFxr(?sJ%KOQ2&W?KUeA8^yoaXvbUXRtS zvZnjHkD_u&m4kIVusxE9MBrvdM&C#>9V%PB0G}Zn#0{Z zQdn!S)%1YhC_wEzB=((u=quxQNH3YySG&Fec8^Vzj4}ObUAw-?b at g0WwCSqIq*qY8 zM+UJ=DNV|d?93$_lZQ!)i7>{BV8Xm-Nrw`t`GenqF at KHBxE@U*eX@=)5F+Q(cZI-> zc-^R;m0;P}J-Q2n^zNz(U=zJ7nF4HRoJUzVFHfn9E$-uRSPl`1_4jE8 z1taIKVNN7P(1Z>CJgAqX&-v0l<6q#??{mqU%(I$10wtC_`n0kNx$zqSAmPDrL3Eg- z7z5(k at hrilyE_Tw5-tYzaP=P?`^>&uqAW-8fH(UDu_}fG*vnE;AMjt>jzV04${Fa& z!|K{hPGkvxmI$82DBmXoF8u3xF9eQX^c6ZlO);|M17jnZVqKhZNA~fHp84jLcNmG( z$;-d%jllQIhIV}etKI9P71j5b(Q24OPtu|rGm#IcYl%0-=bmiNwyQX>Rn2#%R7@@J zr}i at 29)(TT^>>CF*WbNu*-y&jf?R0eg49;ZqM;|ij*r?aAuAs(l>L3D!$mN)m#fXP zD^b@(Mke-FNxr#~D2B5u;!M z>hV0fOV#g?^oJ9yMu(d=)snYlM2x0@{tbs;?M+Zxsfr zujFVhXC&hU5Nsf|Si0mI!oK!%{sg*U8#J#YJiikRB_rZ;3RS|5Jktp$bBWJgzff?# z_n66EN5qr at OcY0rB7c2%$J=AK-9DGT9#XzO>pOx28U*IsP z?k!xTDI7d}FI`Q*#B?d9?>FVjrDV?tcDHyx#shZCYo&}v?AxB3V zhRd^~2`eZ20X&6pX)c;?qmFFs9S|5>=^VZY#Fu9(YIJ<}Zm;)l zE{PcRYms5tvDUXrpck{16V*p0oWH+6foUiQzNk8QzVaJa>B=cL6W}P<~>g^L)AcEIS{*;rzh at d+jOX+8;E;DaRxRHew(Aku*hOz=GlHv`4#@I%Y;yP1ZOqdo{ z=6Qzy0n$;=qoQ;+1*fYCz^vH_w>{F z%P-iEZu;{+;9`%M5{RIMcT|+3x^#i!s||$Ag5#Z?XP(~xJw2LbBw#H|ckrD>^1BxO{w&%EK?4Ty3rPBLw#(9*+qlJ;a;%+>hGn8S1rMiARu5U|NDGu{}WkB zwZ at hvt~yfg6a!3f$h?e+jgAiNx)5xAarJ6Z6Our%3Qa(Xc3nd-JKferNhZA1(wnkR z45GlxA@?UJfr0NVCg000;V$8kletGDnUBZR{w=Y~b$0ga)N%G^@8{=%B1jt;ijaUu}bC_CqnwYhid)NiaYw##RyoHzm`JEP?KHh};E5u_C!EYyNQ_x=k+k`gP;~q<&eXE8xR!dVSz^#ZSqJ^4 z)M-X}nU$%T at lBv}7#LodO9lllw|a$!ncRGmCfCOJ1;`%TI>ou2xOxhp3O8bT97o)C zpdvv-W at l$r;!&=!*heLVq-E%O+(%7D0(2r)f{QD2aH!DE%P^FogG%EAhJtL7K(Glo zzD>5a4e;?Q!ZKW6T68uo%$5KEq95Gj|SU8Gkx7bp2jjvsteetCVj=Q=^vnnvH z;XQ51v=fYYqA1IRN}#_+pNi#J=$Y^%wm0fH>Xyytq;{n|de~V?QSek7EiNNYeZ;59 z5;o(PC4OtlH7OXl%Ency;xr>Jc;NP0TVx2_AC-g9dCPlsyW>_vy-%sqbc&VP?) zJZCSYnxR at 0=+5yH6v=UPq%c^JE2f*V;+0Vs{tPZTEfItHg$8)RNCA-ILxq>+po~6g zlJ-T8;N7)F{IEy*o6YfM8DtYCiJLEbU;&~Auf|Ta7yKF5-qRD`YSEZtk56R|<0sr~ z==l(Zg5XagCHS~|iaQcV7?1A=o5&wg;Dm(hp`)NTcpqo=%=3n%)2m?{9C#N-htX{{ zGn^)HczADwl2$*JPk!3u-*8*wjU21%N_QqYszS|T7-bPO3Zb^7fy;E#I->U)*uE`a z`{TMLy25*`1SO!ECAywNOLqkDUHJXDz>4Jeg1GRA3)LK_?!(!?A+sVsy8~^yzlntM zTNddxoM=x+A+|A#a8GKK3KE~AhuPK{nNKJs!$%&T6`4p_y~$?yxD&FD!r3Bk^ir^+UA1At#i`V>e!M^BMBz9Q0rpPTh+fVac7TxB_>Qg{tbfSZ4 zb6-;i5DK;S1rzJkiMHh7N~He1P`_PLxpkR6DD~_l=eit8>b-g;wGMPg8r=T)<#b7^ z_$Nj at O}a7qJn<(EL;s(?{5t6Cc2Of3kJsIbr#kheuh0qxsOj#5i%nLYZ7>co-j$YL z=$rh|89tP&YfT=(YidH<19|Pwu#ta0pjWR+5p%&mFLx$dz9Qo;V{74l{7`K8^!I`I zAt<(O;_+F<9U at -@^bfSJ?0AoRK{oE6A-d7u>9r|y>aTVJa}d6#l4(<}>P$~}F0iB| zeZQ%|e18XGt*2wH+YRPW`zlFIzC$2)Q=cN<3;ddJpfm%ISndcn8SH5#JkajnF*}c% zVfQ5}F2Mi#M_(R7P~f+vzX9C)-z9|OtzfJ(&3_TL8AlpJiWOsvdY z{%Bc-iBv3jzsl7Tsc>uSPg*UHgkBbnlE7k0Pg#1Io|LOPPZ znkys{So;AC%mWDI`HAjJ-l!rS>$jdZ$V8XVCLL}k9#9 at 1aUXB~1^3rKh#;J^SR)Vu zi+Km6 at R4oh`zhZb2^Dua1h7X?#&J^WNs82?^E}ix)$2=)vyIN`kEYgycVd_EC=X-M zoq!<~_^$Gl(0H+#WbWX(95V;*rZvwBac01JvlWj*b)fM+;SnxChTJl-(01w3t9r-o zw$8qpZ(dFveB%yB<0Rr*QilAjjsF|d$wtr2K!nAkcNUwh#d}p)*K#$1L#8Hb4M$F!`D z=5yJNeJbZ>j;!#dcK*^4GUAG_U|7{Cysvdm|yWJluO zd+Ij+m`ty$K!P!_BorHmq=Y1#*@_F#rSvguG8+2r^%O@&1S4 z1V8?J+4&0|q8lC2jN^M3C5-5mc!woY;{A~0xo-_N#UI1iR$w%HLhisTZqZ-c>8|j5xqYDgTY<$j+a98`CD)N^KKHcJ8S}i?=ey+Q`Nj^SIUzii+A at LK~WM_A$cf0iF zw!2vTU!=WblrCGdCR(*>)hgRwW!tv-mTlX{D%-Yg+qP}ncJF=8`Odv}_Z|I>?jB=~ z9GNroNB)R85bA7$33e~ev>A?x{ zB(Z@?lj(GkM3WZ7BeIi;RXA=@DcYu at kDHxgb%1WR9>x_t#BCezSyl`@dQGueUQ>nM zY3rCJzspdg-{{`xn($=C47Pvg`_Lawg9KteKlh?(%8&9>+%uBd<0c zM&|O8=#?S>(}Vpn52O~ks|ZB&QV6$bFRZ!nva|J5755!G%xRTDL;$JL>f#`V}x$arA7DSyvg7FE)fp~o4Z=*8Wd_)fO6(IwWbb8eA)<~ap{ z`xHPOQ}bR-bp9i4{BZ#0^|$qv#V{GD*~A%=$ZAfG2$N{~qShw+f0bbXB&^1 at XR9pk z$)(X1TEom3P^e6>jTgk7{SE4d5Lo25bvY_>@e=Cv05NK_`8p_JEqt#uyI)Y#&2MpL znLO7VOg2f%?yBj at F`A$CyJ4cHinJzeH7aH4CYAd{+sS-zKIMRprl;|CnI}4(>xXOH8COi zFgtsCZ`oyF;VO*zp^^<@PnKS@?=9}?=+sY7HI2QB{eeW!L?tsAEfO~+w_vt-6`|p0 zsvf?y$}VghuXWJE)|3R5RvgM(JIeaV8^hyMzV8=MuIdMzSZ%QBOQKf6Eo37u;CIMSO;36;FVm%OebEe;=9>O( z@;(-kXRc3F{Y7lPr88rbr$c7?5tye{D5Ts9gmd20vN9ktFcl6AH}}<(?FLH#Zf1_K zK5NXK9~N)~&x(lggnD2Tq3A({3mb4~dxO8`{zJ*~GQ6Q_?k8XDnpuNj@$*n2_4D;B>w4Ks`Cm z;HckEJzkbN-f$+4hn)SiUjt{gO_d7+Hpr+iq5Ox12CQXLUtJ9>i&Yvsc=w{=QRp%^P$MYkGw6A}ZG~}T7 zI^%%?0b#=aUwJ~te?jL>1uP}x at 6DP~5^4k5Bn`1(feKDx3ZCYiKT?-L&pJioqam< zkEXqeWJPq7PK+N;B107s%SIFQ4O>eSQF(fY(q2N0%#_8`YelgddSXQm&is?>EYhV! zsFr_w!DCIQf)iymI69_#KK6FQ*8bOy{9|Snlano8k- at kRLH{757C~qg3pORvr}P}s z{@;;n;fjiaYc&t2^7!SPQ0hxW(hh4=X2v28&|h7Z2^&WFBS625=Kk`J3kzYwnM|MW z$JmGH5vIakb}ofM+81on;|cXyaeDPb9L1$8cGSmfGL=g9K0~{B70Y{7+v}%{u1!kc!*(BZqW(OI4h=>ywQ<=W}pUP{{0&cV6!cmoFq9Bo;%6Nsak-h3yy{S96^ z^=|&#rSk5Up1DU_Jyu}mpc$yij$YQQbZ92n-b?gS3nfZFpMo`Pt?%Z3Cazs3b8-;c zN6Fl{1$sR!xDPM;-5`1`GS7=jK>dh}{DA&(B0dc71-~@wgSE%>4lRC+0G}2lbj_hk z&>F?JC%UjnssuD_3LT4o1DaI`K(GhN>WA9d=5v&bWen8Ij?+qTe3sWR4Urt(8UU%0 z7PGK3g9=tSeBQz21}O~&2eoAxIcz!T91;CJ>?b1i^}_f-;vQex^1w}i6=I#!#oO2E zu`kcn*9d8bw+_f8sGn&YzM4j2lz at KC)+?_#|{S}&0-M3F~%|3QwJF_`dDwE zP{t8r<0?1Z7)0Ozg*)_7Tr6)M#Za=TcO>&Dz3s&@es0YeJ1Ee=<3j^<1N+if%? z5d4(}&Mmq;=&L5!gDYcgTyZ2seEn%l(R`REb>oQqV%0-pY>7;dR;636w_Cn8x at 6xw zKkFlN?G;YoR<_Ro3hfqcvm at FL#0M$vdq?ntvL#J0k4&?}{%C=E`*IbDX z8D3t%c2VTQA&AJG5rVT zPx`Cjq|m;Z2_30hu8ETei0p`=niTy#^3Y!5f+4jlZL9|S!OKtjhpH9Lm0b|WDS_;h8L+HN(V-Ev49w7vIRxoJ+ zR7q}tT34!twc4z!fRT@~%uzQs!F3_%{K#`&c8>C1&vf+L3~UX;oGqM6GURgkq7 at fA zw??NHsdWT6&RmO2V-2G=39Bi4EP7`CD{0O<`mV+_9>u6c at Y3*DsofYkeXGN)^{~(C z3y^Bcwygw at oVKDzk;{!m4$?J#j=3lRdHF}6vCF7pxkHU^a*`gGq;utf!k#K4vw2kj zd{Ch(X66a+bE^F={Hmwq&qBg9fZ;?i{?888+g)Ys<-}*jxA~LcwI7p&dcI%ku5i$9c~jYaVdc$OWDP3=-)8 zqDEk at -D+JO>|_MYcAP_K5wiy+99tY#v8O!}erNVx25zIKNxZM1s!fHKC-A|~R3;iQ zVFF$`^M{#5{8#!Y4I)xZrg$P7&JULmgR^RE-1Pi+hGEIQ5pCan8oLe7xOXKlSt-1b$M}90^~mzt)#_KKE2M29f2+F<7Qv=^Xie80Pf&z1 zC9VrasD$M4-5;MQuI6>c6h8mZ-<`)-cz6D5DS=`AJI=a-ne|_ at jyBf+zirJ`UVV_3 z5x%ReN1<3CYZZRb!$a0ZAp8;(qx(B%K8SAKE|U?Hkl3*THCIJY$tLJtV6|5Ce3^9` zJLBI}0BR6NLfo1D)O~vW>3DQ$t|o5bap=iI_rB%2<#{~$`mpuAqOS?}g)it(WO?>0z>94XK zv8Q1rwzn?TH6L`XUj?(>|D6BAkIZXWizj@$|8t4{j-zAjfRz3tp_?~+_xQsr5~XwM zfFfRp?v*%RhyIm0-a^V7Y0xJBCG%%%-YFxf(*&E3Vka3syS)f|u_0s_Pds}TXa3RT zC*t1zT0~XKVjTrO8@)(|^SR;@nPPYw8+yhFV)x{pEJa{hOeT at Gq1-&PgIHgGsqvvV z8+SaSfSN%XQ&Y5Q8;3ge(ZXFo9A$}RO{@xJyoB0*=OlD$y}EGURcr at fVgmhFYC^8j z?98bGS)d(|v|-*E+{(^9_{)#C49^)op=u{P#$ zlqxX^u;(Tu=9!lr3bt9Ngq31cTzT6)35eLGq|Tb>>Y`nqVOlT2?sjV96IC>&{dVGl zC^v6cA5PO7zP>kURVlx?bx~v*Dp7XpP-SR!D_UvLO_g5j_sU5$T^U7cUQ- at VWi&42 z$wW1qmmrB?Hu5V^5kR?&qo`t$Ium{`AbWaO$ZkYOHk at l{US#xdk|a30S1RNyp?6TG zuMEQ6D-4hxX9nlMWwJLRdU&%SK6OmPPrhto?p>*nPi+iRpI{oAWS9hpuu!pAAOLKi*ygkEKrnP>Y0^`?)F$S zH1GIHK5^8F}IU`fb4Z zW_V#(7d{HJkw8CvfEo{c5vtEWWYvK&sKM|R(rm;PTAb$^%<7|mhk&6l(Mq_lB{hOR z91w72G$$}*HZj8HcMteb8`8O1Ci^1UziuJd3(x+UFf)q|iDC31D4=2>z^%RrId85u z#CuCiat+vk(>z-2Hgh@*i-0`2f#@1#idQpb5TU0c96kV#&qt57gCta(qvrJ_D)=}G zG5sB%#WO;V!t9V&ArFbZ&yg=v1B*#pX^#DVwdG_8&YU>5VLBJ5&veiz% zwkBw>&v1+1u52cgj9BY#T_~&99o<^_wZ=QR&i2W(#i?v_3qle!UNYT#_P%-7Ltv(7 zMlc*a2%ZD9 at F)nGEpiPt$Tap)P<@`%&yt-$n%>I9>-gw58k}`YmqD5-Pf_~D)L5g~ z)SA3rC_46 at BtA)ec-dRi!sS%M^eF)9_n;7`j!ATpqXmSqcI|liZq_~CxE=ZUP{<;B z-r3+D*@gdREw=5KaHYk!L*jROxrZh39BT6d1N;C#D-#fEoli(Ua?-2LV8D%07u{ke ziGVvq_($~;t)~OCK#8vcc7`G(m*dqx%5y08+U39{zQgDvIN(%m{h{75%cyOxvl$_m z-x~|SZ-B^r|Du(TBwz`Kk&O`KtUin_*nWeKOS+TW){W!%<-Bsch18IDWr}5+ at lfCT zTwoJ3Z5`8X{k!AOz>l>m&K(5&I!U1Mq!t)1#bI_bDZ>~zr0BM482Mb<^o7Y3L9m0`(>KD5RSEh8UnE3~oyTsMNO9xX~8?>s3 zpeh37j-@{iLOYfXGHg}njtp({Qzz{!nJiDDr{85jwIpVM{0BeVEAv3cDVM?+XC{K^ z7C%&%nEk38HCH<{ZAJT-BCc3JZ81_*{qw=;3f-eKmNY6U~jw19o(^v0{w8H!`Ieg0_7Y_r^<`+ at YQ3OkkR zhqBvx>V*~wE_YSdA)*EJ__*nm8OfD?6g at bV6zY~e=-Vld!#f?11M|+)WdvBQb1$?} z_Kb^8|AX4gW;?h}er?d|C5Z>l18tH_#H$>O1g~XMV;q!K?50}0_kjhZcN&&P*$Lj- zW{q at 8e%5%s9?-G$@Q^)3<$VVB2T;sPX1{%f44mBCQaT+|PhdP#=;LvkV;fWZ zuV17Y51hk6^L}YG&cdyZBFju0IOMlU(>U#tIO&OQHWasksgzlx9&;^NsgEoECyP6npF3nH z6%Cas+k{Z2x6w-WsI_SQvX!_Lh}UaCK}e^1=z_3kgjo zk-6qHYbJ8EZm*m!B-&pQ`FPCqtZM|lXXd8h;1qyuh(S6Yg;zEZ znGmLb6_-XPP7vi*vZ>54lif))>VziE&X8}!2J0pgq?l!A%cEg5oaCB84H%*0t!5?m84kiI-!VD!%^99kS90iC zsO(;cgzP=j3Kv6HrB(ZqD zZ!4*Zu8ugp94!u{0TS$GWH+p84+^qiL%<>AR+(=8lTn1HyDyW-!J=f$m7+c9GKGC~ z#bD+q&QLJpf_K#IG|kOZh|b{Sx3M=5^L?bG$yRonn-xPneb(z>!UTzRQn5yh));4t zhWhnvm)JPIP5npi(?5#JfhJ?8Hh%#D#UTDWZJPhtX8sHLDqpG~D`9&Zqd6xTAq(}O zl}M4J$th1ZBs8D^(AP;7X5Q;z-M at KLMHE z&r at _%^&nuDyb~Lp&pgxDm#y8L-yiSq3P2jS4nHjD5_{OCRB}*{ky`#d8)`=EfBqc1 z1^)iV*J&LP#Z%fd&`h!`M1-Unwo9z`jLR7={HcrM at l%n8}<_3HNuH%}6e*O^G`lO|u;{zIyfoh8>qGSEsC_CY at mm z>b*b^n`r-Vn;%TtT^6wTPq0nM*IQ!*e}WOWW} zy4n(KNX+E^T#ZFK_4R!S2}sN at Y$sA&pO{nh3Q=n^#uR0ICl=E}Oma#Ix-1D|EI0#I zhP@`mU#h}Ls}~huTIC|jt?0)lEiP|k_J2gZGng2&KPFmmOlQwiqTa1wRXdV0XX&)O z{DB0G0a0fhUJ>>^JW^-;T%OeLHMhb(WF`8L?SE z9nK=Y8vq9Dr!z<4TYTx3UzJ05tG-jBBDaB96O at 7G5h4pIV`^X-JXahFDK%rZU1o8E zNB)Dn>Jeq$V9`m1T$~2lg78d!XZSXEw2?3^$1S2Wm3oq|@%*Dyk6XrCswQ1NR0}}n zaxiZW*PA8iReejUS?s(mfH_MZDypcMLsLXP!xXb_oypQWLVy*4%Q3ez5X&68_$WM& zxV9ctsabejfqd*NZ!?QPzsNQn(?NHV89rO_QoOl+2*+WjmdQXsz^d*gr>&mLGQ4yj zWP;_99ChO$`$!%C8!)E&^fM1rPTkzKFa0B z(bs?VtKzWK>=hw0+EBcKai&lWMlvQ at XH(e$lwpJA8H* zZ at ELDdPKTz<5VW|Fm=}zjgOrdIMvOX?k%kpCB=IlmFUNSe*^+m|FVU|G6eDxSWRFT z!*Yz~SWVh;xJbF17rFoRJewbyY0`thexqtM4AVBzkq&`kz<8K(ni+|(jRe=22ChIG zWmCfpBMAxTjD+mq<{#-kXmM;ST-SK8D52}0F<{{_2zcUYPz2+CBmMYdUxV6yRJE&U z<_=iew=tY2I1s|HkcOS at XX_EVoZ2W$VjmCD4h?QgD8h?yhM!Zvp_fYql(>!q6 zxp+OJJVJi4M+Mv3URY0mf#>y&k1Z8<3s^@=_*Z5SP>?10v%)7zFb6?Kpn)o#f+>YM z%Y!mYZbN6U?w=deMs5kMIXuRgRJGy1fgAP9%JIk}d4RvlZeIqd@(N#N)6}V4u9pw- z#38`B@^Wj;Qz+dMQjM$lJ zDzXtMM;q0C6LBE1z`hY$@qUpG# z3o{7kDXh30`tVD6uSkbE(0IESVpk;dS_EecWiG|8f3t9|>W}J>M7ypyZ9B?Zti2B4i=uAv!HDWtv+d8Ln2+5-2k9w)ccI5kWpoE%O7D+)w=3r~Dj zjghJ5ijZ3XY?ox~c)WZ?;V!Up0Am|U^lJotGTmSb20EJbO_iyGL=)aTB_)kL5fAnek%US++ zjaZ_hJ4Yz}llkxw$_k z-mv|8B=k_?^lgK{nE(`F`#7pDh(XS?quLeTKVZ=~9N$K^_zPk-OAdH8>J{$~{{bcK zL0KAEv-zjNd#2TElWk>lzQJ4w at GEpl7Z+kLl{`C zTa_m@)h$vci27b%AIf2}V>|M_erK?gOcQ==1h%yi4MNmSzM&f3BF)B*EWc;hLtC at z z(Sdp^G(RWz3}QGrmvjSIMby3`S8s>C38sRNwFX2I#7Lh8>yPhwOYcleUkQD}luCf! zeq0>gLXtCoIy^~SRYXAE`FTTl?44&hC8+{uO(L|qkCU-A*R^$7+D`m?OB;;}cebo) zNom_rANfj0hviD)A?-|)`Gdj8oTyW=Ml4%688yS*Bdu7V+yu#uHWh at Rs$^cg{kUgFS1^ zZOOQSC-=@~bi>|8 at 6OCgl;RN1N(awoC? znv;Ka5vEhOE2sL)8Y%v_t&!nh)~IEJ$dAko0;OR)PoVtKw5EU9U)OLu%7QLvDj at La zTXYR2b;8t7wVKI%SA7aeTv4P|L_4bC-L-SN8rpFjg zja*-IGcnW at dCVdKeF~BrU`&%|`}rUg4g8)5 zgxZTj;1?a6RiW!lf;PInfHQ}e&jGBL4_T|^>4*w)!GYJM^C#auzs7w}Ou%5LS5N{g z?s#YIXv3o#bPcT!j#kEeT_Be2ZJ3>(hN(Up? zqK%=ePKy`v?L#ibZ28z3z(`~IPQ94yO}20oa<1T`n}4WsajS_^R4$-DX;tO31f zL6wHj%1hEeMC`D(Vnn9pBo}m-2osCLn18UQQly4n!m_SW5a^gbFJf<3+wPX4cW!SX z)J`FiFNU?6I=L*_75&uMbv-$50VrP2$~#Xj>h>l2H1&B%%AF__V?`?+GpUJAAc`q8 z;rP|P`-?l%40w<^g;VCeh+=*tH-&Cd=^P62nErM93eV0(Po4gpWtGEv-fb7Ip8rbD znN_(v*+UTW+2l!Ei%hXBJBCZ=%m%Q_U!gmRj<*NE#xwBG3nX<7QyRMqP_r9`w9bq0 zqOp3>X4P+aGtKJXEd-k;WGPEV z>LRi*I$xFEH(pj`9vBR%m7X%cQ*TZgm3&b7cn0W(e*PeyVwFW}d$q^6K2`{dP_^0+nAOmf z{HLE at WiH7_&Q0NPH?^l%{^n=AaZ*MFwd(aAv91rB!wD#iBV>l0z>h~x^ROGeQ7>xl(%MdD!`B1&AMkQEIV(7^K?)Z-%+ zVrQ!r{O|2waM-l_mRqx+bDW~#d}h5wPjXU5trIB(QKhgIl%0qi#fnWRZn-bm{*Vs9 z%p~@y(9G~;&(g*cy~xXaTe|y1TocEhuLB^?KSDAzlazqnFlD(?<9Q=VcigR(8py1R zso^?_5xyT1c=GQ;G&0b((%U!klU2eHiY)oHxymNMgUt+ at uF})+QO<%}iEnYCT3~g9X zm#lkJA#-+*UqBW1lWk!z3lkFx`zNL-Lp3uA2R*dw_qqf3pb=6YJ)mVA1JgC zd|yv^>@#_L)G$87ysDTao#7 at 11nJ|(wJB*- at xx)(bM+$k#2AFJO>a`kF6#O{Vw&^u zO&<261%AS at amfaD!Wmd*58Ybh@4O^(B%-VO3_-Rt3|_X`_= zQx)EAnb)mPRf)mDR<2U%KihT9^FC2Jf at fhDPMBL%XVt64IYO z)vGsX!FKgdraDUSuS1YgvpwcEG%k(I{pqo2)FGrAUn|Q%d at 2wt&8OQ}WnrM2 z=dQfK4R=QUSjw=wpju_hG4Y5vw|vFJ;5y-#^qvTNQC?&)A&sszHJwzXFo7E0Q1{7& z18|bg2XZ8X!pKq^!*v=Fb82I7K7I3!$yMc4G?10lGPWgdW=zHWwvfPJ_b&5#-o**Y zhuG6$rVuLr8R!s0=mD%K0>|eTM2o@}KTW~jicSsh<%is(#+GgnX{t>&I2krXKhheW zpI@>9A0Mp(k3Q6~g8$P!Z3td*2FC~GjEtiFIX9|YslVjVd=Xu->Qb<94kz+j^f7(` zDW)m;H&u3`Bh5hS>4QFOCF{)BX+szM^}(2%X}^5KJ-Mf4 at vsA3B;_$c5`;NpdJ&Qb zl_NdEuAY=0L7%}4GCREy`Xj)d%?W)`Glik=*=*C!T^kGSdLB+sq#1c7(wv@~ z5fg8);?`7M3`Lh(@qxiCS&wFEei}w<aLYV=>Sg z!afm^!GjbpvMbI-NNqf z41T^!$@LHY*4{zAsEDrq at GiljiWYhuemE9)p^Yo!t|YheaU?t5Bk6-ZXLkpX%MI0@ zLG|fq_2_Ut%~2^-``V at Z{H6W8n6|O;K9bYe at xidm2<5{MKydgmIE{1r2h`xOZJi&2 z$!{2sv=f)laMP9#Aeq%@h0)O>gy4Fp4Q at ROwn$JTbt+n&^#y6aES^0`RSB0IFJu!c zn4uv$o!+^zwlR7tIl2g_!F2%{CFToZCd}&cxYO-O%vd|71<-w%d{w5PL6j9al|>xO z?O<~g&vzs1QfgH2C|5F3k{nM)NpxE%!tTW4LzaoYOEwIbn}`b{M(5a8m)evK>5nV? zc9;12XNGu>kbUi}r0E!i=XhDT7)iK0(lx=2N4l#4!WOvbyL0-89XqaI(vVe!kJ&dS z*j)_lp?X)G>3x`sVFc`*=`KL(CXQkHkjAbAQA&K^Lt!*2-S2Pcx)#5sOa+V_sY1@? z_|@}apz*E813&WeWoGPV+bTcr$9u^e)_zaYRuxTnQSM(jPO=ZN1ixVJ#&3xZ-SpkE z3bX*#Jt2s6c*O6gm2 zIZP$K$oD3e^pX(7AVf?Tuyd?AY`9f=t_PiK!U$qJeNFDKEj}E1DKU4LXLz*EVtm8= ze*tD+=X+rCUuPSMUqC<#|4V==Z)D-B#M&pBB; z3R^qcyZsj*S8?<2w#naC)t8C(-~+tWP*A=`7v) z at E74g5VJ&Wrm9Q{iSPby%q1(u_ zU9iiM!8FgXu0)TW1`}m2abfGH4*1Z4`(ha*bh!unojt|FS~s6xc~$c}EZ}cep$R++ z>r<7lnd`*q4}-oD#DiVC2+x6tv&QfNVR?Oj)UzZ^KDTz!L`*nuxnM*+uqrf zDRdfRTjkj|`+vMTCryzhnqdU9q}PVEtZUU at KCX?AL$Fktb+4Ot%*2;T>e$gr5vX*; zxeMJdJ2d9`QbYIG>gMU{!6yacZ!px3)hsR}q?FJpezjI6u%@kte^UpEwE&YTpSF+A ziyG<*DFDAIo+R|eV;bcrbkcW?$%4BL$#TR>cbw;Ee}_(`MN2$VFd(j+Fz0ln zNWZ8xygl&mBq~0R;6!*3PkMG#ANY at y-mo08 zj`v^dKm`2X={5bEbwK|wMHvknL;(C3?BO0wxv(YRyi&blgR0P6KY)qkXFSPo at m`Xl zVo;gp^^3uaEUSz7?w;>FxTOKG{d(Rpwstvrbw6q={0v44YKD$77pwY`)h6Q`g3uzXS!47L%CL0Jd+5bg zI%(Mw9RFrZ(Hrf4#(*n(00}M1=G-7hzq7GBD^eCVkNmP0V9J_4pxil{abn3Sy!&wi z)@7|L3tz3dy{xv7qwU)VDCm<4qbJ8w71gCI=&UUxW^7@%NHW3Y1WAd;8~2TK4W?Lj<&)wQW3&{5F8cAqhhz zWuc#xw6($xa9%%)Jsxo?Mm2{;DN at atB=#aIJO}-0IPmE!GY1y%gD7j<2W%Y0`}YGi zU7LhOLc|}Es at XIGL56;+IKJPTJ=l8pgl!9QE|fhdFQ(6-Td}lwp$Bku_mAjWD(_)zl;>pf}K{$wO z;(s~r0#6cBfqGy at gE(Ty+GZ9I=>Z;idEAkp{z<<@Uq`fE2L=LS1^K_UZH9kok^M*N z+UvZ<4iTD}x*-=CP?Ao;|PJp&Bu+L=Lo}+b`4G#xv+~lq-?8=JFP7h4#2c!d4HKw~rtT zOLg!^nqxlo7-|)QpwrYnZaA_^$#TKPF2~^Iwi2i$GBp(vi0(egVEY4$=@R`&`R6}` zI80wLC;k2g2cZA1WK+t_+QP{2?_Bl2RCkDEYz&S575=pNk2XW~)LykK^0j1S1bGdI zwZFSci6r#(OH8TE^0tdE3t%lx(l2TJLT_o!2x3h4{%$;aeUbD_UB55+oz3BD)8Sg` z{rGx%8%X(vC{PbMPAs=%(i0nsTnI2 at Oz%s4No|$1--0$wA!w+AO=mdH=^3rTq9T1R zZ6&(U$sA-T%!2alsRD215g(JwZT-%#Tu47uSY zZ~XoCWqJElam7!)OrxztU_ at k+S%ze#av?rkJPl`I zg`!qpXwFa|3+pacL6rEggmHA|pASb6NHN)pFp)}vqd#u57|=dx(KIveaJErpuX5G_ zCDIuk=Xfxch0`EA75^&Ne8qJ?rNR_bG6s8!WYapX(T8;9P>3DvF$Y*MV~}gKxy3cL zdTpv~Kb_?+-fQhOHF)hS1r|s^FPuA?@9ix+);&Mw4pJPv-E4CuZ+yA!ZC9ORCLyui z4hTg+!ia#c)fs`(S%cY4bNv$xeUS=_o0>A1$%e~Vq51NL!SHE*>UH#}ZqTubTGm_R zI)wvwRYGZ18NIEw^Zf#a28c8|!6S#yN0}|^u?=MaF{?{ecqLnnDL!zb8=2-^|4sU=&LHGGa80B(GZAQvd=XV at q> z0?(6cifYjHM=w at u#iiUdh(x4JaDrky5QXMwlkN>IMB`IF{{SK+OMeSIc{hMY@#$d` zpu*x6 at Y@3)6czJ6AB_UNp!HQ`thkWK&J{XCV3dM?C*5 zja?`b3J3_F at ZWK&{@45Ae_HpTI+W|*ElF+SCW+F45fOibgO8QzA%O!^CkUD1hEow? zi4mYz?isp>kz5gGZo&waFDYAH#w%M6LqRTi`V{HeNr!7jl~z zJJ(fLqyy>HZ*R3SI$Zfo`CPRgXSM5OdA)}217QjYV_5fJ%5>o2?QDUK+k!pWITQ!9 z6K!Y(>2LH;cFKsgL>uu??Rt~)_2fAvp};BkJx{`{b1EOIFgLGHM;T&Ot0p+W%ktSVCHKdUi1*mb(K1WD!Wu?S|XEMt9%SjRMk`gt(tbxRDkWJY0Qq8w|cz_!Bqgk zxz&{lFQZpsSx>NrkoC2 at F|Iw7$AWQ8+z#oJykkJ7asyYK2HLO0?@ z)d}Xd1{_WqI~uHo%m%ySIt{&{xRUQt-l%ll7M6mv$PbzBNm*TM=dFVR$1^6nimNB0 zANhu2D#49n8Eu)x&X8EEWyrx1(8L+?+0953eDJC%iMsRl=T4HClSOOf=DIOjr at xCS zi#%k&YIN8hd9EXeg-?BY?E^v}&uNj17&Nve(3 z&D at 55F@+sDk=75eW-t}EJ9vD4rz@>W8=1?&0Ic5^Htl}#l(PrKRCsuG5%~>-i zv4)M7ucstK6|oWJenKmFq+>po at BTr(l5H{wip at nzRnk?GAw~-pjQ!IzK4L1qy25+N z-+JU+2hB`N*ZX_X^q59En&j!ziajz_n`Ya)j2_8BK|)xn?JqUHPOpcl_J*?=8vhuNLf1Kf3*gG3taJb9rAj)!afZ5uxp7Woe3i-C%DBzNS7MbL`SyZf@^!eAm+&rb z-8T=XDIT8?avh-;hLUj|!-%+OlCGvpc5>;k5zv*6T;}Ai9#KTIqd#TN4;(MZ3UQie z;$HX(@qL=I4gCYuL)m`*w_LJAt#LvsvGi9?Bj|is-ehlbXIx4bNXBMt%asbNx#lPJ zWG1z8jXuP79D;~YU$c=X*mmMAR~PB-JA*fn))3sSUjQD&!oj$F&VGV1Ee7up6oa>4 zNQ8C=*?#d$YR}r~Sci0Vjs4L8rJB;&A&Xi~a=vH$%@(30-6JQR*63 zdnVMJ$$~U{Kz$V at p=Y;XI7|bDV34m0UJ((-3*HsDelR>CIg0A204WZ+^98o|JLIJ!k}VTqi&bpHje*v$os8 zb*{=$_(CX1nA!d_O+nH_Fy%a`RB`5>l>M}(HxBhNAjs9)Wl`!Ip0SWo!AZik;N#Cs z+<1^;0d|6;lj>rA!aHS!w#8gDTHt3Hpwq4X*D96I*@V3D3YD#L5kRmFbxxH^{hGOa zknB557*ycT{V!05Nn;u?2O_ii;GsMRD}ZRznR!BAlQ5245Ob5Gb5pRTgmcKtI$s4t43;=gh*EW zvRqm5TSHA=v}1YL6&}260m)}^2^I6KV)S?Q-mF>u0h`+H*;eJ?2MEqsO!%*MDeUCX z{W at DsYNSPnULz)RGh8Da>W~nbU^Zg1ow0;#g*fe8+&;rE}j?lH8`TYQ0? z4a-xi^)vE&H=5Jc)=`gH5?QoE{r##=2e9o4IrecWqBH9F!vZsx{&v)A=jmVQpy at 5a-Q#Y0@%RWJ-Jkm_I)*4$UEcoJY3994>0I0eoO3X8e at hmqc8u zb5eNtY%T#5v~*E^u)F!*_|)rpufn1LB3m%bmScD}-#w?OHiH=VW6r3&fH)Q{iO^~E zjLxonGRmH)&uT6gX#47RYi!0Ly8GY0Xnlg0nrtOje(@7=qg1Rca-7d+9_g3_=f4* z0rlMIDSepd)}=tLuuE7U#3%8==D=H!wvd(k3RWnNyWd zC^f*przUbF8fKun&ro3&lR_uP%d*7Fs>DN=E!yr!(e1OKc?n})^^sjQ0InL?9Q#VY z!26=Zi<4|2l9mYi@;1krMfZ&( zDrZ9MZI)T}iL?<@&B=d1unZ=z8Ofd#QD5Z`v(VC$U=m7^`idH$fD4qEN%B$RUmtcN zL*;xiS%T!3qD!AYU9;Gx;_HnnOkMtMlTN(_Um#*4W*AlkgvH<#o}* zon*z)1xw4)inO+&Es)^@ z{#j+{)RRIo0kZ-1O2tu);m(M65e$#HC0U+W7HzU9Tqu$!08f{PY>-o|;)&Ymh=<`B zd7+40Uz)@s;%wL*17L@^!6f~`D!RaScYZL*CVg4AM0fcfP1fcWJEb`7Et`}q-OLi9 zk#IsCu{4K3Jw~RAL*3?%N{*E+Lr&bet}Zi^0s_jzzKzYQ3<7L~?#w%~ntQ0&ofc$ z{&=DrageE=USY)@{&Xgx#p+AsURt;Fj&WhHoq85$5QMQe5oW$qDv562rJm;E7zVU& zmHJ5q3a;vig;U}a^I)FPn!eLvzy2RL`BMSm}Cdlhsmd zZ1XtuBD<+pGs&Zt*2E2E-xPl>6y!2)Fqp%=q$VOTNhIshomq)eqq{(2+u<2`A85Fe zZ~l>208^gimpH|^HhKHHqzL(t*b9AlpdSuOvx8D zUD_S2Mxbvgur-yM|7BSrLs7o(YOpTDnN;NKEL0zqstRXbQ*N7#g!X zsXOJ+3g=(YS2VyyOVG6-bJ6(`oi3FnBVf<2ChO>`zpdxkRF0Wxb*Lx4*L2uK at 1omi zi9F6x at N1t9`K0W6eH`EHJ216VqG_5lH3ap$JMqY>Em|1<9AK`XNM+${fUMj!GQ^Xu z^+{}1g9K+#N)q*(BFxCz at hZb=hxKHLh-Y#Tk$mU!FHw&J81km6CD-bPB5KS#xscJ+ zZ>BF0B72cfX_LkZi}uGGb^O05`~PSRQD>(z2T{YunHAMjn}7wgP at tsbje7=_vanPk z*0m$O)8!oLvjH0I;cr<0=`0OTGKTwhKPn}<(LEnxoI}pYA(xkQlW5`9ditT zz`|taFl`*xJP)&qlQa4mZGG7Gt9w~u#}X95WFK+$UwmB|dke7Eg%00UvAC3cEJa6c zP})N)tcqL}xb+7a+*DP6GGutk8vPbiWWwD0rc>gVYL$kCw$#tltfvI`w(xbiZF2k@ zg_meWA5m8O9d?n!88ZxCSeU at sLi9GFwbon?*=Q&+Zdm0~;Fy~QWeeYE&K++Mk+y`i zOyZ=ti>9S563HEI&CH5`&cn99^crS}<)1tpV=#ehX2d8oY|xWYR!Cbjy#&7Rzgq`-AF<)Of&$K; zvwFspr9KaJn-bb%7Cu7;2=-gprVDc{5m6_Tj*&&VNPx4HU$8MtkMa1ezhN>OEa*I{1?bNXeOS>x{!{3qJCEeSFSGtFP`MH~oZyasj{430T=K~_~ zm3xC;kb6OAm5PFvW!WI9%^f;57u$KVZko!$7M}HwKz^8(R%so#I^AVKFe+Mm5B$$p zl;T*|8~9-d&c~=$FloIaSGk>#)(~Zs>TQ&o9h7FT3L;%|WMyo!YMH!h znH_4G2VZ69!^-dvv++y9Hl8X#x|Kif7ka(3uS)P+y_|bFs7+^UzxpbHQ!RqYAQJgi z{qfywB*eXBJZ}HQC4AQieVP&Z!*K3&k&l&DElKzH4;L%IZ0HL(X_w1$`FBHyUUgdO zKlC;}XVotB$D_O|@5ursUlj`_Z8hqS-L&p*2w|YL?s(`{+(Ab5Gu)EQ)9d82D|Ej3 z^}n6&FxtOsKy9k-OdYk}?v(7+s0n-@#SfhBMC&{P^+7Bx@~w2-ZTFPHzX^89IzqVZ ztYrojq7?%IfVxYa;b_}&Sy3N*^4lga$d7YxuzH{WsP3#tL>{6-f`LK*{Uq^!>-5F` zzF66txXPM&{loWbjJtmmNA9XlU{BzS#GrHvl8%l*I7Xq12q`5D;X+iV;|9mUnP_CU zE{c$36<{qKIIQ2kMx)beG!mYwkLV8~hZhJ^1h0 at Jm5j|E>=oHu)L(3|SJ%8hp6&^F z#TP=UhE&*&;X=5DjW!_;6sL>XmDiKrrq at e}G;8yam!VZ at XDDvj^MvCp(wCMgYK>4Y zr>`t4(^7Sc+DWGk`9Zl=_ku}@2Kgw#}WE0OFXttX*%@ldOF$1lk#x(4Br^KG% z*md*MGQ+qDyirSAb{)E?+{f<0jGKge(Svg6nI=NNkVUTq8R2Z9iZbJ0Se8hXYdxqk zOIX)0SuKY)PMuMlN2l54WU*ghJLB6*kV^xTmSKkKT;uEu_hG|)nn8~2dK9s}d4?2- z9h;jM9o;x^T|al*3cJeaFKU$8nW#=CDAeV6<|}cMbSK}cU+_i98xvfCj#Qvn%XN=X z2YuCRL*oR;kE2%5RX^}f(J;>0x&HMQX z)*{PK1)5Rhz;a4n5|h(KY1xgAzD>+(4nXa%hDLdw*|HaGw3E5Ko?ZnFh-J5(IUlvW zFAJb<+Rqc>^A2C>cD at _}27^^(IC7b8c}cd){%YDRv$huG^PfLLv# z8d7F-MSfR!ZzR>~d#k?uLF=H4pbtBLA?@#F^Sc>3f#r^%QfbhX%FVm9fV8kIisjb& zS?Xl%m?JZKLFyHvu at GI9k)I-62{U| z;Hajh9Ny(znJF3xkdH}H%+Lo5 at 8VQpfB1=#bq{(y;4{=+Lc>e|P|{COqyiZ}Rkm9t zVlgt#Y%jo9-iMtXUOeadqrenp(yZd1=f*ulkqMr|p at eCK(`$Fx1N`w7U&~dG8P`ZA zlhlTyJOkOp3DG|P(JJB5n5sto3I at iG^dEQ~4I^7OGYJRh|AW`j_CQxh{b$t7xw%6`*W}&H`hEd0}o$nYNNa5bgSaBQdfO*`J?Rx<%dQ#tvEkonh{3q zRaFOoKRjiR%A0&+IMIaegjQ1Uf)NB3dwT<}k-cqH7Y&5=@(fR-)P8lOmbrpKD)m%) zT0y4W&SW^k5T=&j*jxPQ!1c;mI4C+Y_x=tOcCVKyO9UzWgw@>U0kg0Mgg_ z3eC=+3eWQtOo^#h6c@?K8U{ES(HI6FFVeg6vL?9swNjm}KDD4fG+b+~<@ufdNL?85 zt~I9KqbYyH0cNPEWLhDQv%3$JkVeu*56rbsIgShj>LLat?_DmlSpAW;wg at j~Dy$r$>OaX>HL`buc z8EO-RB^m65d?U5~bO8R|mum5}pV9X#RG=T!Mj}I2TBwOEDpKR=17*ZG$G1q5*pgj-^1FAGYZ2wiVISUE(IpFnqOwPs^A?^k;!e)3pUWqY=}mlgMWOQA zm&6pK{;Z&gcQBQbu0W}%X|*C_E2Uf*kX(4us?BJEQV4wxo~2qJN!;u+ZH(eDNWO)y zh|`HNpUJAG(aoy^D*cj4&lR{s&iwrnAc-a^gsNHf7qa|vC)#G&f z`t8`q1OrlIo>PL|1LKMiqw~G!P^ev=?UqPr?@;_~Xv58o{gE;=ZJsfNX*AQ)yifMC z7w9;TC-&s$*+1!W1UXovkO}jpksd=VUargl@@_}Qu10n{3qL+B}CCSNe(Sz&p<8m at MLz)+TQwH+K#D?bu}rIQ+v&h>6F3fXtA`@7RsXe z at ITYVLoXMy&wIQv$A7!)FJDhac(t$4Y7y6{==lDKe`11`u^~v-fR>>UUzc7|jxX;- zpI7{#oF593JD^kL2B|e1HEQ)0*_A{TXP}Z@<1oKxr~3=b)nbe`fp_4SyyBJk->B86 z at 1${?zk8X#Gl2MO+88`-bI_Y{=s2F#V}+ at w^Y(E!q7;U=$6a&Xm}A8rC=Qj!Wffv% zwa}&@t&FxA3g;5m%UNYHH2|BEa;~GzA_j+SA3J(3h0x$wo#z1^cZi+?I{@XKl`Ge zRmr>Eyy|1=J|pfF%Mk7X-H+(wpjy(a(H_`fV`aq0g7CmOR{gtP;Vn>pcN$L(97~-D zNxfGbLn~zLY~o^&_!VdHyqOZoOdN^*aB-jz8pZPi>VIdQ0!-%udI&Hu44D7FMFjr` z*7+}`Qt`j8UMeGhDCp|wXyg-7VPfRV=rTYtdQy{U3DMGj{8-rTId at h;wDoZEkR2Fi zqM)GY4iscV5tjc;?_*r0^u@^}R+e))CwkouQ>z&#KYIiNAkupi3GLG3<8;BPTJeSO zJk}hsk_0y3d!wMiZ}(Xf}3v4Sw%uz&xoDlq%@Of zj+;@~FwW3irgr#|JZtSOS2@%?QT`b^rXsvaQf+bQxoKoODcou5L^dkWu>>bE;ZP+m z4P}zWGw~4D!m<>yTa9kN^;f~6E5kSkyZUrRYJ3l^L>yffI6!8MsWoLmef`iB$Dtzi z3KGBQh^lXD30&Gm%LH}YB&sF(BvwpSEmPql8AQLxOb=8d!=V4!bqvFwTjQi+9>uiu z^zExe#D`e|r&_5cirVL>wkqxF09)}3y#Z6pb5#xNorHBz(t&ZP6->`)k5rJIL= z9(~579gc$!+aEF%oD4JbvVo3WqMRp at 3$P{7U1W at e^&vzaCWJL=KUg8@{Q6cn>-;>W zTK)3|L#N$lE^YFHhx3Bfk1Jax;!$77bNa~rdbagbu26ZKpns?F93zn*=Q=w==~%zF zDtzpbLEQ8+Ni{RstBq(#kNF1t;nfLy+^MboG(m{yk=Y%V2dGOS`sG(JigdH+CpWD` zxCVN+D_WG?sx=u!C+|}YNqHY%`r)NXossE&8zW at Yz69O>V?&^-OaLd(U-;cZ{|E5< z_iUiL&%Z7*e{M2s9P{)(i(QARJ_-%_ZkvRY1St%$1sdKF&ZlHK72C+KXKYilNT9{w zilGVqARP0w*BmyCDba2Bx$t_MYAZeRcszT2{0S!G$rnymqGm}|o<49uRPFEdGxVKyOEyAEfLv0)_T`K^Caj#*9vp+npDZ=Sv{j+)gh9%bbWqSXlfHM(5c zf1j#bLYete$s#@lBkS1+D7I~y*}xU`-7+`=fJ_g6X*5pdsCU^XQt1Ce*wmZHCw>fM zVTdvX3)ZNoyO_voKXaaw6CcZNlQSb+%`!Y&{7p7nM?tQ!f#E>az?fCZ1b~U-ZMWb} zCe5nsUif}Cm`XWeOg^L9yB%q%)xPXZbt+aiKXIz!mC6SVSif;Knk7cESobfnXOE0K zV=T{ezTht2+}CX|;+GiPyDE9loX(&CSvJ#7`o0SFH~Yevj{rk5shJj-lF|-hLW5-r z2k_4trWW<5XAvAieFBh5YgXuox1&TJ-YunE%-H0IgUr&KX{&}<9y$KFL3yxG?BoK` zfouR11CSpbmDa))*dsdMf+HR!_Ju at dJI&NwagI)0bq74IgTy6Pa8 at Ww?brWqL;*EWI`(M);YpPX2xWNSV&6X34&n*fioFz3KolgThVl8gOlIbv|INvr_s#XoE z$zffIqXUepqBy>i;}((W54u*zM2|#Jl>f{%ik=bo_)#Q2a13Ae+^<>p#$o)^ayg9c zoni#KzJ*Jwfx at heE2OZAV7(A0gHO at UuePvysMIjp4QZ3GQb zpW7h#@+7&I3*MbPX*YW<>_ z^rJt%fPw8ofq at DC-(vCKiXIIsGmrnli^u at sc({J^3d=N7sf+Zv9GMD%>X>bliT| zc5IORI`JXXOIs!x$K1mFT_=t`7+%tt!#kCDBnPV~#tNvt at pDvY7d46z&MB5zdFB{`!{bBU-r+%NtwQ^SB?c!kv#qS3tnU)RL4oko{ zX0n^mW%LFtMV9A&VK}|vN?pcf&Irj4Roa3JZe`lMBhLS`NKvb166cM~ixb=mvffk_Z8yURF6=t~euzuTwbK!c)EK zdaRE4d$_r*Y6>Z72dz~V=wB<+SsdZHtp^1vh78>;g4T*SF#t&x0-;7qct#RPHcRg( zDT<&{9{X$k)fs-b0j_sc*V98{suF56r1&D583)l~4 at exHE~zyVbTX-usA9i5V=qFP zYf at Cgk>p;g80j^b1KuGi&Z1a024dM8=dc5~{Ugy7yWk_~G4`%j=mRu0pojhh;c&V) zlB%GwN}*DGqE$=AA-Kzr9oj^nnJtfm00Po1e$z(zZsFRXEYm_vYsvQl)>C0%K*o#} zXYzL`>Yh(p=U;yPb{i1~`uip}xKMgT^s*albdi$z&iH)NnVRwM at c+Acuj?gp4S)IX zR3rZXWZo=f%>Og=(^Z{U`WyN=5R>bPG3a1G1vM8p71IPA7*~rY6d*DADS|RkrO-;G zl|Pb at cvOeRg9UpD4_YbhEPk+vSeYj_uKw|VJ^y3>F#Y>`4>+BnE-;#M7X^VdIz3u= zz-)q;*o0t|Nk!^0NnfI06?Ph@$YfFt=@}LzbuGlZq*7w8u0l8tt>@7QAolp}sK%oI zmpdA)v^!Hd*@t%!LEg$OmF1CknsT`$_13zs=@ic;kwCYR$4KCw{j&UWnYCmECD#T$ z&RbHZG8W`Vq!G>qF37$~vP$8h9#xdc;nE36EV4~_y2w&{Zf%wnWoxI;DyuVzd`WL6 zWI7&y789Aa^5pfFROlW}(3kXuPjAP*Z(rTM4Ny3{VwRHR5gl3Fc8 at yD0$E_^`B1G9uD+-^eWKfEuq>MxuKU)60q|%yrQr-e>Q#8m?J(?KTQ0qvTJ3fNVYE_*I*!+HB+$U^h zpVl9f_Xua+X4trLi{7=0b;x14 at wY< zV3Ufdeve`?k+Pgd6ZRqLN-=SptK1&7gef(3wgT+%#@q{(-2oO{khHrDYHnCsvP%y7`L zGFqs_so@~~*Uoyk!G_jG%hQ^1ePEmOV9ilwvp&05?n1j=0+YPK^}j0ld%R|#`z72G zi-mi?Nlm>AJDj&*4$@09ABY>{L6QTg_gF)a)&Ha9J+Ok z&5b#H(P#)0tv at M7`Dsc`U+idC6$CdNypLh|>1UkfJ(iy(pu2!qMes08r at QuE02gX8Sxz!p`wTf`eR zLkqGPFc&fCKmY{_4>(q2A^C6kvmP0LsP_vo^-*k! zn5pJkFNwV#7h2H4&jX at pL}*n^;@NoJ-J}GqOut;P1ah55{8MaRJ;8jr~7f7WR;iaR zB);DBvcEcYvbc!lc;LJj&05j2nIoJbTy%X9B9YNSftmO-v2iZ_GSw?LDfIkX(7~{aY0LC;19o at n@ z#B%})jJDX?x@^m0LHIyh;l{C(M6(n?F2yg~3^G8ljeUDwR+w*39&Zh_vPPV7T0P`+ zw*9GnEHRb?1f{a+6{GHJc7B at ibBByq+&b at Ru5ju{P;t40 at -H{$8k~1ye}G|n55I$L zra7`*h at e1wo+Shq`H%P5j|@ZKYq8vXS&z2r_EhX^(CE6x;L=kjL#p at ji+2emS_-J594ECftC;?RKlZB4V{b@^{Dh zyDpoLg##Zpm`^?_+2apTIwBymL%_d-+TS1WsN1LJ>Gonqc|lSF_;!US*1+Ji0GZ^R zi~3k-t_A~Zjk+nReG~R!S73bww*^HhK{#Ik-)njw^@HN{g5wr;E_VdTX}0B`x{@WQ zh|ia(R;b(Ij$ke*C>4kUs$E7%=CFiUu%S}D<_67S}V4TA~-tumF7HW9r?u|)3C3Zwc9h2rgDtR~|5wHl8qcNzb2 at 31A> zP4qAQkf8qux}*OUQvWqTtEugRzKrqFZjqjA#V&=Z3uc5umz7}3mMAZ0XgVk&Wg3JW zHGrHDvs6aPe&;&Q&rif{U_7kd#ak&Vr;$a+7hfS3UPj|J9;}-37P?Q)xT@!W9X0-x zeZgD33K=b3zTm<8_&Vi$$?dV_{fQI+ITJ=pvt~qooTOO~(F_OeBL751puSxZ-lwu% z9$q+-bcCU&G&^8?tF>LtcAFk)&bJjpc|{hGyE~nx&KG0xbc>Pdtud&1&Hmw=1KXXy zoki2Ut4os$x_$Es6lA3Flt2Qpi^uOg}T(?zig zIpig5S-9L5bdE|knB;%>gn1`B6WHM?yk62TPQ8M+q3zbMU8h}bSpu?pTm*{4lFI7~ z%$zJ?ND34c8C-k$?K$g;@@oY^Hrk=jM;A zs`UTHnwUFyj)jz(`6j0uvso at 6I5~RT^>&gpvwrLjTWE%emrdhYlY2WBbnJ7&k*yP% z#B+hZnaynMtg)^)z6!F%<#DV9=Cp?S{8qo>NBBLA#8xDf`p1T=+O%J;R2^}ikVo6& zuHL%VY6YpmdRfL-aV>OrBYV$#=x&z#keCr+`Y4+Fg6b(B81YwNDtyWdfH{C-)P?a14iCn5IgkPafCi_xd*d74Y< z>`Ab5wYkGnj}sXd?Q;E~#PvJb7`iWF^(|mt87r0TdIVozRfgv-#)@8GULN6oXrhMu zv$j!{z{`0&g&vHHDW7||DH=mDymlu?RsE}7xvNNx-+aQyUx+G9(k?(LqY|Xq&)@Pu z)B}(`;7a;gXx#j1z7`hy{a`Wvqb}<`(;v-GmVwC6gYqoY?jB1hI#=1>jG#5Cu%Fnf zd at 0L6x@o>gtcRy46?5wC&ZiiP1?x*@SDXYXTVlC-M|%KL+ZirNPq8v&$MH8(oRI*D z#24Jh`~tK`)s7D15@~$n;6Z30 at ar7m88!BIMQ8h(3}Z0{Qg5 at 2QrhMqwlfxXlIsa1SB6bKRy zGHIs{3Rn8}U1ENp-7=tpNN3#w3Iw374f}J*=4Qb5%IChL!#}lr#X5l7o>}>v!4+9 zn5B at L!U<8kzDij22i6$61#}35Hgig&!QeNgR`x7n1Qd9w(sU+gWaLwJi!+mEGZDDQ zVo-M$RMlkEUGHo0( z$mQ8n*+Sbgb4x0Nw)D?)@6LZT|FBLW7HT9R9pc)Ny+2cP6g9~gHGU#d=O4YCG}PEo zlAnN#loUgjqha3273KT|P4#l_cziMXg#8Q2h*m+B{9TSN5RYgEAKj9lVQ7-=12v}Q zD+uWy1JRd2dplnUFtBJ?Fffk)TYhH!A6a3lo#MI%`tT>Gf(a!vsR_Nf*(T2j5iFaP z=gLx_rRJEZ1dOeaM5#iibWITN at YLIn6_2$j_0!-5ne|t{vhpJy3Is$c&!~N$*y*-M zj}L+F?lHm7?q_%*9K}TJAx>j0Y2sjLYTuAB<0p;?NiB>m6XvQ2BYnU(;}vvK at gWat zz)oN^J&rogI$#uSawJnDiI>G4djYo%BW*p?X4O at fS>C=DH*?Q1%&2^=Zml at g>=(d* zq{S}76cEh0p`y+ia4=bM(Yl_yb81(ebZ$YpWkMW1gMOYhHW&J1 zi#u4N7z0XPU at 03{&<&?Z?}Jjs{DpJb<@uELT#ObcbCu>CkDnA~QsLr+Ue$#^YfOLq z;PDJy7R_k+kh1+?mXtatHw(Qia&^B{ptGOJH5E_*o7GZ{c2Qa$mIx}pi`g(VOEB|i zWke=_Wx`N?Le7cj7hW{SUuA%aifKlI at iwK+&*hRKA7wSVhlQagKW$} zb$FY$b}o-A))h|#f at Q4{x-=3 at 6~=gvYNpq1k<@?2xs;TLgCc{%Ck($2(p^+gMdp*0 ze1vlYPadt2DCV>b7JGmbPw08f;~b+zl$%>gW_RZf;eUeyW*Wj96tpEU;%@c zr^jH-FJr9HM>Nl}TWDPco|B&=m{u+lOH$+G30SiXrF+w)l`~sa9-FIF*c_tcDiC3^Ou$eF?U_TRU z;eO6|T;Z%nxFkr2??ilb4;T=CNQQf^NUD7emx<#FwMwK4{|3&yNp9d1 zIPjDBcwWHL8!QtskGtJ?M77E>Lyw#8F^zUCr%kTLIdH>VtnCivI~^xZs*kUD+u(S3 zIn!(_NkVMek5;eTbpM`Gl{>z8p7`S5HB$5 at 43=lprdI5UK|Hr`*4Sqv34DaSYdP44 zp`3A0LGsz-@(<2Y$!8p|@HgFmQuqKeG!D#n`|JWwybGE0-PSU-nJh~3C+eyqi at Sl3 z7#FV(HgpLwCV=tQofa~M&t&UXg*Il_08pTx*fsx#_dkv#9&Fo;75q(MSHAuSeK^*C z*FyjMkor8dO`5)Nfm)yBAdOw0fRM5+IdcqIOlW!&$If0uPV($I!$oje&nQx+rIPd; z_y^Tqj$L06Qo~wFPRHYx%hbeq*Sy2;9$zS>J{>q}bhR=qr3BC}mwjPbUJ*$|Lr^3f zlq_5-#)c90tw%^2Ju7-v$vopdUa7 at 3YKGr%$zVh4Nm^#Ve_x0E&hxjxgQ)I$U2;?T zmHzK0W%~ufxA;J@%@b!JEZps6UeDxabG==HMa4-vaFJP$_-EKu$Oah%b`#LfrNtg6 zcX(7awkTV_#7>bA%d^Xe3N at yZstq;QQ*^|W;dfrOHoE=O2D|UDS^6aV&E(Ngt}>jj zQA#GMun0xy=0PnsHh2=pVi01X-P}u39`3nqp&@FSq{#A`V#T?FTeW8p`64R+`V~Z) zLdNrLpf#%O$t~%%4NR>{Z*jKqpIF*Nx at 6NNBhUT!vj#(5c|ET*G1+d;z;!Gl>(Dm2bgLS$1hk zq!BY5CBlBL5mZA$i8EzDne|E$n at 5FF=EiLUtr_mK`$FHltatjpQ#qT5Hzr6$>>Rk! zg^wV1`$5Q>d`TpVRW9Q}la-x}AgPfpz%w-`&nCRYV|@2 at p}$|Uu3y0T5|l0dLQse| z!08lgE5A0t77E{_KzLh3-ebE(Y!R%1GY?PLD?t2#0}E`SwEP)6bJ{a=D%r%EUW_2K z1{UFXdjdh$LU#X0V2A at T&lUso(dlqA;RlT(x`Sw(AiOvW#EO!bPMT9_ncG;W%&Zm_ zAN~?CKRUrcO_D=wu5qjIE(C2<){Zy)Z4<@uC3W1b>14bNT(D+h=Q5Qf4&TQ=I7~`d z1j7BV%|}E12R6_4UyD4{?Eckz_P=OPLxhtPxp8QR z$hS#*hz+S78W4MD&NP&J+y2*XhG{$61kSyYhFq6v?r9f;3#)*Smk)?ulH7xYK<*H_ zF|XsYvSB^MMLYuLW9SWfFMr*Ars?=Cl9)cv11}OS4=?Pt?u*xWZ9{d&24BA0tFWIbvzwrkHot79!nk{m zlaG6DwzRG92Nq66Fw=YB(_jMNgAXdpjd?}vBSnGIje5WLpf{Y`mg~2g9$>^i-kRsH zTmL{OQ<HFk;C02tGhB6bFL=m1Q(JGA<(lE7T58{ z!fw_fnc}%ka>$%LQdUK!7Ea9D_W}ll73+MF23FO z at dbX+1UkYpt!I0oS91~;_RRx;Ga>0J6by19$n0b)vAm6eaRO7;on5v5JhI$Es(K9* zp`<*G?~C^DW3!>^W%=nc>t6$W5LkfmD@>@R#9#)*F_vGX$l3+fFawtP-O9BWr&G<% zHi-wGvkX>;v4_}i>zopvnqRP>Cx{XX5#*X6E|(DVgXa#@DbB4ffd1RCAxY)y$r+1J zDEiHOM>V~sEN-UDXH8W*d7(F{%Jpou7fSoAT^97VwFfO8H&J?SlC^8E-lTBqHX#KD z9(R7A8dV&i4ZZr|6;x#vAzKM1qy$n;YpxC;*Or13^lA*AIbpCWPP~}= zmNBk!S&jHqaZP*>eDP$Ng)@H_5;srE7pTNHRsCf~%1`tYclg)`*J6ZMehpUyW*%F1 zdLv9~dP|b(9eL++1bxVcEX4`?+#rTfOYu%p{dP?lcdDeXRb-1oaJ{J6QIro=-=6>Aa zt+Rkts7>d`WB^cI<9`+T7+iJZ}+yZ=|_Q zOugh?`_70<@1IgY|8&20S2%i-K^e|3)cLq*OLCyWg>z{%i?mFay#bKCdKP+;Wkf9P zK_K*B6g;tf0gv_IIGBYdUvnFo#bj7S^Vkj8LB6Ja6X^4N1CvEKllBeQl;&NZ$@IB0nC{Jag4FJo)^q1vUlqcZZhd zHr3^3`Q2y at JAGD8_F?2#23C?FQ?Ou_db*2b`AIi!r<*{&(nG30_5RR49Rb;ppiC4k zlx0uZ)E(Cnk^Bs at 8qbYczICH?DNU9|tTh|@xcSBN5*% zPI%}XH+0i{#+`X#ccp1(?*%l6tD0xtN9Z^|_FY8QOy=4lfCR&si!9D+w$YlzeRTf= z3`q=<)KX!B6c3CXhRZe7?pKA{YaOUV=F$(S)i~LNyJAsStP_#L2-#${?l5!*jLtjD zAmBXNqH17I{dB|v%nSEolfexzi*d)5#AzzbI$)goYtOq~w3k2gA>?|`TwfEqeIGsO zpWi>x0W^a9X^P$1^hH~q0<3KVOCHSdr875KVw^ZwNMzE=nBLX1i+4EX7HCB7z?|Jr z;k6#X@)f(MV7g3-g0Fb9Np(=zh+}q1s!jZ|Lwd37W(KQfXiTjiSXVSddWie4cCi1v z5 at _8MYTd&;uuxD5fv-ypAPG2yAE*AvX?=7QN}CvYV%cFhxAT7dkCta;f_1H z at KzS}@oQ*qKZ*U|E?GuDe?tP#?myUe$5h?9{4Yqr|C8ppu#3Er)E>H=;$B6PrnIYT3a5Tln~hEcn#td7-g8 z^aIRhE_dE#+Us9&WY_!s6yq z2%V=~ex1Z96TLDG!A8aj_;U`k0tk z2P%zjp#wnZj7z$cnT|A_=5TGQ9aEDu9)RbIZ=%knfbn3mxvd3H#+Q!^Sdh?6n|l{- zzivtwu59u2sfI1cQftG8djM0Rn6}b1N<}Uui=IV3SL_!bXh9a=8q_>u^O9XGQk?m{ z;Qj`x4a=tH=&JpwwBtL`7JM(6o-fFr+wHn9-Yw(!x32-QB&172Kh6m1HDJ%+ullWZXn`kpR{+QO7o;* zZm%i4bwsvwd;%-5$;xJfU>4uKq0A#4ntze04R;IAC{6S42qhx(FL%&VY#sl)=GWKO;6O9eb>FIW$$h-d_IrJQru~73X%Zj5H?9x+ z-nxv0^Z0xtG$0DAJmI*LAok5%oDVYrOW6>6Lp5e0wz+5Dy7^RxL$si?`l4J0w1{vZ zmSqv%&b}#qAU44|B5onRsn4XZyNrjLCa2mc3q0l0n at FS8&@b1~Se!vOK1-DzU}}o2 zOm=gTT&FpU?U-ZI>#DgZS*vgT8DxLT!0nZC0bZ($n1KLv99^5Evf-(%<~YsD?5eTH zEyAJE#aLWXvdbCoW|?p?2Lo-ann)i|RhlCE2RsglBlXVXX;qa^RXj|YAyxbe#KYx`pQGA^xNw&cTs7w;>Ot}3(sZ#g{8Wlz01179#kS^(GEhl zG|B2-0O+?&^uI{>=XNhB>sIReWMUEjB69kIe)rU at x>_6&`v0-^PC=S>UAAae+LdOd zZM$3d1(ir^hmGC5DuSa_H zvR@%oW23f{cA6y}3n0G)J{+OSI0w>WKm>BO-G$=)?94nw+}oBN zlQ>EOXBHQ~c^P3r^Gn9>(G#{A0{85;jeN#C!}!* z61jtIMJay}H42*%1zxv`c22taw*^iJih!gu+^7T%k3wh at k6Xz#e8Yeb;Gq~%WqY7g8;ba-er*-PV~zg|UH$Q;{UQpX zIrx+70)i`O12-#p&uqUnfMAc5%Nzc9j5P1HEto7dba*u8`Sl+IBo;`a{7`>)aQu+} zgKqc#mr4IRlu)v=LE=O3Mk7~=9*}>#vZ%uFQ`Yt at Q?6~ESFUTs3ygi(PqIE++plip zjC^E$JN9+T3|IMTBzn(WpQw)Y{5qSs7) z3d(qDLv`aE^TL}gN~IU}kZ>7bLsj81Sl&3O9raLLHkr{RwOs3x8jZ2Q;_}{8Y6pS9 zmkgj>JIXUP7`s>07!EM%wOas|&Ls7nR-DP|E|i<>7Td7)Lze1J-Nj*8X>6CwG>|B; z1m*bt4*E^hyLJAA%EXnFssqSSGN_p&V8J9ZP*t(Hm`)~L9fHDdx&7yGXORF_VJY3C}Y{_Hcr5o+_N^EJ$WRYlpf!LKL<9M>)QmB z81H?kpaai4`{3-zVF$QB)$G&=xq${8Z2F#foIbUY?A+tBD|(r{L{Z*qYfTjw>8gNl z!t9H!@kq_0i1DWE&7X)o%LHC_5)MQnhw;~Xzu|})l?SmHg&Fwn4SzC{ya<6bva_0@ zwX2?ic;+Cm^#ctc`or4D*!o=WMQ80rJGIj7Aqi2mK5xGGg&Bxy_~+p0*Lp_IDw{tc z+;v2QsHML8;O~8(a$wq6S#XBMelb=fJQ~JWmltG^ZYjlkhKdlp)nsW#A at qpyz8HM| zv}iY)dm>SW;&4Bzju%B7*dY$Es`+YeQJZYLmkNhA8xETG`5BLlD86Hn~V#E}iKbL0rIGy(f_Ts3>o> zkeMKl#2zVKx7btRSCmH;wGlDp9IQwD*=n at _Le{#$*7o)l z&&>8!*2l_D&*zWaNE^kI)+#;N9LTc#+;YDD_F(2s#F&nP(p><7m8s!Po2w<|s{9Su z0Lcd2=YkifAqFd+23hhPRGUF;et+)OeX>Om&W^He4nYTnCFa9>wZ%JjG%BcbZ|%~x z%4OPe)xPF|BKKcO^X3^}K|QV)=D`i(Px}g3D&qwUY?>Jh_GUi)4F|JO zP1uAEnG2!>2)(ZTz)mY1m>EhJx7KOd=@JJTCX7P3>ru2*hn4Nq#-CQ-y&R6B05f-~ z2{Tn5^m{=HsCZaiRVlEf4k0d+ccN_Ep3rpKly0L at F2sriIyy#b?vqx*4eJ|Ug?f)=7bys)P-6V9BkU9MqpYu z$~Sh2u0{J&IGXj&Qu`{S*%zHOhuH=$6}h!wLW at jEXla4FTqymo&PI2&aD*->Uc^U0 zF3#C{v!j&~1KR~nxVH%M;eWL&L3bOcV$JWvPM9H_BsU161sqr4ZUNFf^YVPJV5ttd z6Ryh1MV{ra{I8H{2hH471L(=QRxR;DN)XLBa?Ll>m`C(5&L^m>;Ko%8Sw}ItJcUn0 zv;-l at wCl|)CiLK_+YnQ@{Omv5iFav zDw*Jv();|G(D|l^`H)7b<+Q_*+Lv3JSG6*(NIkNM&#nTet>g14Arrm*J_dM$RXqMI zf=Y|B+5-F{9F&k-J6DB-%lQ-8vQVMPVx`FigNI*1#meZu!zEyM;$EL)lV|LgK~ozA zU$tX;(G7ZNUp#@U<%cI+V=8Crvt>*NEvO138d$)?sEB& z(iVkjk*F>sg>BA<`VMKqFt2~22uJ%-*xR`t%&A05;$W5B{osiljV_-_t`sjAk(^?uX6pYIOi?zhTK{%8}j~r{LKh_k< z#NGz+c^Z1b+|F5*DZ;^ZXU|s^DL+i#OqCk>7<`U1CIbzZ_IMlGT75vj$aH_3QkyL& z1RZoRh#;MGeL%mdH8ca>dKq+Zh at c#~2}xpb|lQ ztjmQiZM89cjj@&Xz?8IgHC)*F;A5vd{Ij#&b%CB8h++TDaBQoXXJkf3+bdg*w||C4 zYg9#6!k}ycgBvB at Jc+U9uS8wv3*h7*|#p87H6`jJKtzeey!~n1E-?xKd)ab9q{E zrc$bGu{e+&W-D6}DMzsXVsg?vii|ZwtE!jc^m)+T0 at FD!SJ%T+fid~?8YDkx$iP&+ zOMmw)Iw-M}y%b1X72V41Yntt;=mNMkPoI(dG_|lj(#km8;Q1dEspaC8-m8UVtD$7{ke_Tt$ z4SZwxSc-Yg9WFJR?scuA874ic2cUAK-bNz=jz>HZC`yg4*vytBX`(+C>8SI2?Hg388zDI6IhAIN=GM_upx;uOR3Qz6NDA=D zFELn;ZJgD?ybwR=NjK~Z=GC*9mRmM?q!^L*f@=S+*efOV{QOk>#z?A}SJ*HUX;kat zyd?{-WNOzutM3*oY%phee!ZsqR2A*_gAY4hnMs{ed at w%4xN6-N)0X<;CRIa`SZSp% zO<_fzX#};ZOnQ|BJjhorLt|ib83wY!BFK?#j`reqUF`~4?RwR6M%hv6~Y`mMf zQ{V0U$}T~!$M|UER$sJMp)nA0sFRc0%KDU3Q2WzgL7k_X2AUSaT)o%?;(2%hMY|y+ z&tz&bT1V{M8WFkZA1g#$NV1uxbGCn>kf@&B!Fcg*eI4zyBdE{x(j3fFK^C$R_1$ph?67HJYGr3clS~xb! zW9p{tz9{Kd90hZJN0LM*jaoATA{4r2-K$o9P$bSxj70}=mFEA5+(@H0D2?&VV3VoQ zw~hg0DW2}qFS at mTXSxWnB=ngZJ1O~@cF`uDaT3bHVM=wzl}KNwJHN|qY1H||r{k^Z z_kwZdv-K_g1o%*5QQYk}spNgqlfdzbJiqpwP#@aO{Afc=AS=t5LyOac zMb;V31t=Qu?kGB~7eB3A?Li*{p(VuVklB_Y;J~w>sYxw0Lp;UjMp?jBVVZT6;|Q?@ zEX-=?rd}AP*|(Kvm%ag8a{p)dxhnp9gkNNXB_+cRQYd;stY(A#jx$g6io0A2m0>-L z6|dvTROa#7DScv3b5VvGMW1v4${gdX$gJ)?YfQ9b^yP&DCU5=XROXNOCF9A at 2ay2W z!WwKxR4ubvmUZjdkT#b6W|t>@alMG zG3=Q1+^Lnc(kyN7tXZM!oEbBom>vCz%olP__zLE0S;+Q%DJFQDZTN8;OVCa7#Ebpv2S~+557W%2H^h?+KJ3;$rXh1LXVR+Z at Z3rlHp?ePQ7ymCNkg3^gLtAOe- zvB#;Yh;c&xbBuN+Sx;ckZ8RPy=hqsb8yi at z(- at L!#Ql{FL$Mbrc!`sTtgf*{B at s}$El*P?fbO^S>#GDaSHQGMo~{h$pq4tuP8vK}syy~F+{nM76&wcW=_3Abaa87wVEa{W2E<|Jo?yeH=u0m|7&=L;!%a2AE4rP4pSUUwSUNGcv at 0** zkv5LI9bx4s295xCyp(;J*{YY|I&bVRYncTyGg`1y_;%!ooc?)5&sUvOMCclB(P7+I zi>s2k~CD%X!&%af;x?e zG)_d}zY66dN00d(ZQ%3i=2C9EI8BalgWj|oM@#DZOIh`UpA~;xo{SPu?#OWP7(6BH zyuIMcHrYaxAwN=o0W$_{q2b%eZuOgU> zv!YlaCR2x?=>sfVce1uchD6GY8T2 z;_>dFo@`{)7V|Du)R=VYbO7t;X7cT z_W38nlse}tfbqakBkJ6IB4>yM$Y=&Tl7C`m7USzr4fNTtSd{7(f=}g8d8v__2jUh! z5A(7<+*i3?-w*RY+W;mpEH^x$a^(T%uWt-_6RU-1HX668!XmVIv83U zzG&%wau1-CfiJueE;=8`C0go|y&F zT!3On{TF=}HNx9SK0s?0%TpSW$@ZbDk_pvUUn2&Upd3jrophX7MWGItpV%w0o5rnF z>0 at dA>*&Vh(p~aWUwTadxc?~};dkSzWVTVrQ~fA at P>d`NZ8c^LcVRU?=H?*Aybu_s zekN6T3f~>~Ybsbz+3F8ZOsKZF0pw|KLHz1NP0>9q^mf_4B7}N1bhbsAH8u^)Oe19k z*b|V#_q(|-qL2yCMkDCUg;0cKB-&a5FV(kmy>Ro_PV at dlEWM()T8T%rx7w6`u#dq! zCz#oKl}R at KM^7nM@{&|Tb}-;Oo^(uZ!G9>+YawZL#g(mRw1!Jm9`}0sFxqLxOIevr#u(Ef{UlFVPY8I6yGKk*3 z74!2~3d%hEkKIDH%WM8vPTea-ut}Q%2vJ{WqK)%DzDJr}rhiT>mR_svu*}v^6|1uN z5Uujs#Vf3`-bny-{&Hxg+E9u$pyd!1zY`%?{4L%^nt3aI%{K_WvF%&@H!JXUeK{NIt5Aj%}TB0W)suDfi62^y4`fq z)~u_NC1%E&T at vP%-$TGJ#=(!7VKoD8jo6wtpVaJ9F~6#qVO>bEOiL1OU7bToLu8`y z=iKYMd%J2!B8#b3;;iIb=yDYoxIQ__rR;Xyz*97m=KXi@*|dm3?ASN(SVpvk9nmKe z^i##b#J^Ocv(Q$v#`Z&e*AEOOb}t?py1;{ip<8^L}B8`8#=joMYox9?>H8l$~@pfwc=}{*87krwPq7 zOD)Pxh9}qsueP~RqIZTXNucH?7LK5^M_{roc&($=xwrbSsXP6kh#LN*AFj*R>7_XK zw at POBhayq$&7RkP|6$dl-XVPZsB>~DXkNM2d^547q-%uPApb*oS_`|+%MJIwzS1{k zq<3Qf&mmNLA@}KCk at zhm?nCqOjeL>oZW9#>-FMVBjOZN9()?bj5qpIZSi^k$On6Pw zM|Tp+L(`n#j?#$Ygp)w&q5IJIwO;q{Tyb(&UNa+b~3&YyiJ$c=Bb=?Gq#$~BR{ zawBXhoNm0 at i}8`?vFm&Y?!EzLiQS>YXC`xD?hWAv28g>~(HaSAX~ogEOm8C749(7; z3YT}H!8-~|lSmzRR&PQ?{iRR at Oq|_z zMKfc(4i7+85x|!u5GNono;UPfqOs)w^DGVnZ;eJiV_FDP?q|chdhb6cGI#wo-Pw+x z@{A7{Q?snITwMv%%Th@$)4p-+0k?b=h-rPb!Wl{189_gnoRqKaf16w7biwFDc8AxA zfZpM%2~iNk=A$$df53He( zWI~x2>VQMBDyYiH25kpO(uy&=hf6Qhm6T=|v%7<*SwqX)$eoHL3Qt(@m9V2UDy)>f ze3N@=izO%Jkd*tSaQiJ;f}8vsn^emxG{{I0e&a`aRwX8}-q&0-lQC~(ADCzy_q?Uk zvfiP$#_i;TInuf2pL1zD+Jw!qv at 3VC((Z;V(Asz^FOthqQXw9?mC1zle-yJC-+vl- zD at E2Z)YL^h0F{q|G|pi+B{6`ZocTtjd!RBxO(8+83W^V at GE9>)N}Rgk1>NaiP<)%E at AV+Q5o8zxx1Kcr#0Trlv#Qc4G^+8>ne{D^S9IH@ zz+}(nMw&5X7!pAKiZjbsUvvdJCj#N=OQ^Ro>{S>FW4U>Kvf!oAtlY&n+rClO(kVxg zHK*WxlCIxQp34}vndsGy&@7(q*JoR1i>bp)7#h=W|Hvj3kY?w%#}NiBhlPgb=Ybm2 z3H-3d?4L8%q3 at Hjv7;=( zrEU~M*U0nzj}A}N%gw5x?dU)(ZR05IWNG=IR{u4V z at b3fO94E_5e%OStii1$tHXx{oEW^5efovhhYz7~TNgU8x7VXi2KKn8VqJgGNo=+l} zGc<74wW%Z)2_81r?8odgZl|xG$M1ANFsqRLF=|i_qG6%osO4OH?==T}0AVL!qEU^1cckDK4P9w^W3wp6Fk_rv?!SXd0PQgw7 z=1cNQ6XjUy;nB%;eqq!gM~!QPGWc>5 z;}q7|t-lgw`FaIh1NW=E>9?Mn+pjU6{?uDt&Q)?p z6xL#2idyD#QHFT{-dlV)!E}%LHlW at 6aU9K{a!jxlwI4TfKy&$vl*tSJ_7hg;i!Vq^ z4vkwiK#&{7flt%vXME0{>qT8=F7i)HB&eU>$Etl=PCHVavn%B at fA71IJ?E`1!sGqlg!h4X+g638#`ulcb0P1g54et^?m+f z`rgA;GLiO|J0O3#L;v65&c6 at uC~C+o$|8JCZ;xN0IjhlzvvyWmw%~)&k<;db6EIZ1 z^|oJ!T!~R6CpT)rev2dbk)5JF*~`fWqmTJ(oSz&nIfX*c+*+Mhl6qFxbmv80;ngCqpP4-!K- zJ;O5udu!G?(!{d^%Z(WWoOu0V6aS&@G8p!;_|ytB`B*KQUUchD6DgW#QWiKRS`#W$ zqgIPk)6lh&Wd2!F$p&DU+!?J)&TOT^b!}Y*(=)V!Q?HnwJ(k7tZ1swR4cHBqGV;?a zUm at pnO18f`hZIreB8~>Aeb*46w4?Wq1xX1Qgcctl;?^Pg+*gcXESca|D~A=VDW))wj0LVc#M$@l$%N|LAqyVo5KUJi|> z$km%49?@E;4||O9u)QHP^_jwf!c|y^>^_wHh?SV<`M??~9qIkrv+p&YTExu$!Y&b5 z;oraLeqeCI${P3@&U?GMgfvX6hd`nFT_;H|z$%tqovGMHy#Wzh2p>-(aE(v-5C9j) z5`!{NEb(@Lo66G^lK6#t+JY3Wr|xh7`AauYnR#9UV`wcjbX{6IemEDWEoEuPuZ#W1 z*8?^icEF4X5BjJu2uea~qFDF=MqJ^8mm%qI{EXm2Vwx0xVrh}VpwU|x)F);_JZ{k8 z19|KbBf=hg6jk-=cxQ|k^;amh@>_zBac{iwv5TKb^)rJ^D-4KZSdF9VA<^FRl!jD$ z at Qaz9XNL>V|40%2niEsZe_`GW`d>Bo{sHs*`a#0i6OCjOw*Er{lM1p#B1V at g(4PZ;x*N_n at muDN-TBB{8SN^W>((OqR#- zMh%_LkIFr at AMDiX^tZJ at FsKp5A}Y0kw?cOY(YbR(K#q5TEH`_3H7fr$ zbjThjb+d`;gK7fWYKY^%9>T)yH9o+BY)8?Q?*N+4LOdA5LSl<|ZpW_y4{NL4D#{Y1g`!@)Ffv?ljz*K1# zYTpRYS at EIW_^*a1LxM_| z+9#?KYrR}#`aptj!nqhrXDl^Z!6H1eZ!m--G(1zznRgl=&^^hNM2s-Oi=2k)xOWbV zF9C%Ss3sb$zeZ{UrAMqril^!Yhf;!r49GD>?2E15Bw*dDh`e;m9n%ODZOi=$w3)2x zlsC2!tix^hS4>C}`*OX z-kDQmVY1}f=I<>NI&Dwp94|D>GPUx5wlN0k94SYM#?ug!>GDUp$l=`4NB%mcvBrLz zh at z2CaJ`IdRKaaFKP^vB6 zBdDhYx0N132v&;3FWJK)CBKpWI_dV;Q8Aak2++)ZV-9D$JHOM4D&ODS%DUm3` zmw9z*wF9RqRY-5yPeWSjbQzqwdGjGFk{Ee1w-0u_)CuNOmvkO!IRMNh%9z=RblL}z zZEBTk+;1f}PHTA!D{9$WV8;0+XEI3C{7%wN;|>e7_{HXM;W? z&N;^iEcB6N%Nu7!8vKZ)2pPbTPp!OWwX2|AiWT;kMlahAQ03(!{2o475V3qb{)f2_ zE-d>H_+R}^|GUKf-+}*s#72fv|2}JxrM#tpt%UNuWyyn24MvD`N>;^?!^>|$!$c9@ zs7gFbiBYu_Lef^eL5pqNP&N>-A6fGSxQsNt?Yo`A{3ai9U^$Q98pLvId){=I=I+_y zKHltjKi28_0 at sDo8DR)}-hTnIVDMxMhpHU0O*!`9vW(>G6S3PIIl>@(Nlnq{tgLUu zAxp`^z#Y7i)h#4|TU)fGpqKM1=UxfN(O?bVSl3h2byTrQPv5E=O at Gj!^3XW!Qg=)0 z+3+Qjr2rsf2;yBP%&AQ$;ao+|*W at lVg0mOJtr`<&yo2ADYuWVIg!7!kG^O~7MKIrc z0QX3n9DFOPF-RM^tgnAYR79V7CKh|Iqci^DNK)0t=i55a)|o|l`&@nZQf06;3&_lX zb%nvwVemA~b8t@$8YbV6ktfzbbvU;tDg70vUpNIZD5HRLLO3f!!5+=zoor}c at t%Wc z-X3DNVqIu{_{fX+kVorKoC9#nv at 3-6#8?Up$D?m`fxU4XY1tR~ySfG%o_hTDQn2+o zs6>t0XISO$4YM^)oU51zUvM1Njf>im0)Df{cFPupB6%@g0CubLz;Ac2XS>baZju=D zt*;qamk#ri#N;>f&mI at HT11BjsLVo{GJnu#^ish_Xub5tMc!?WFuc~3&PNhKv+hVL z;+ePyqABPp^t&G31DG0wH=J>X{#Q4V$X`Tn^L}mO2Ecl}hKOkFlA&DF5x~`P-qqN^ zHv2feaqWq!`iumHUfP&57VG!o at hT~VL&w9;P}Ok|?}B%~2|oG at kc^5{ZT~D)2f*Y! znPHS;v&e9?%UZ8qlS_vlRiLma(|q`?ae-v&3i<|~P(|{T;}R*mBC>fwA=U-T+2N=R zNovO=IV*0>by>H*FDHV5I&o at eP;;lkl-Bou{(?1AWDIPpRa~ zC%`7t3?uio))|8${PmCg>f&=~bq at jrGzRlu%~SvX3k<*6e at IM~vX;Y!APV<+%xdz| zqM3k#y6L at K=mi^d5%0!oU@^QO0-03CpEMrI>AljVqDX28My{K2keCmI)E|sR0Lh)y zT at i*&DySj6G<9Y!)#tOTHHVq)u8un$pYJaSUyT=eK6pHn*gi&&oI=|i9p!pg-*WzK zb2KQ=^nMe|-!ghyd}!EQ^82Ht9vKvtP=&DPq8wHf^a>WMRq_kX8O79b8}&4d#T3}q zr+#&1c*$UloWcw9ThRh9AM~C^E!x{#^5+>p)%Is(GcPT1+`G2)52vmALIvhW zXALC6`p~B+Z(2$bcb)Y5vW`SKv%p!Eltvdb;1u^qJiM=t;Ior?%0{h5vrYpJH$gS!g z<#?w%i4XLu>u0H?=vm5u61XaiJhb3~_OtY_ac3<14uLE?mHYY>$u09_+$(MpS2y~2 zJXol~oG}CIXFzbgNc&n|a+rd&_ws4llIIV%Ynu2!3kFxWa#f^_yy7Fwlk?FJSk1qc zp_12No?x8X$dn)N<;KiRrOdRu!F949UrZQdn`N%tpNSgQ|RTl_M at h5n0v%N;A1R^`ddo at +?CG(M!ZXM zd3c($bp!QSCw>a0W?2spRnpw&KxuKTH2gbyZa^KXMcw zp$ilDn0-d>kuiQIdeWyjR3sbu%0K&dU^XDxE>rs^F at Pbi7>?+p>4!fi0w0>8Ik2~^ zkk=NT5ZCcj^5*_i9tlXBO-zIFDiq at j3qi<(I)t|hd%X!|Z>hXTk}`ooFJ*Tq z1qBH7J|bM1PUSZ+ at i0Tj7!d_G*zy;}`)pE$wdQmA>8jfGWO&M|r= z;-5H{L?oJ%5j7p+3ctvu>Pncd6(Xf|bM|4#$DF*(5O^OHHl1 z3P|I0n4ZKu{x>&VPG9Z|ir8CGz8^70mL;{}Sxm$zMu|p>7$^%)AH4u-GF@^fNtZ%6 zO&48r41g<2W2N-*!M$pwniWc~NsnE5*02=K z;6B+g*l>cIbY61A-qnTc%%R5Q!7AL+S#zP*X`o^7IzpEbL!D<}*blIqJ)@B_tn~9& zhzHHajh8ero7?))al2kj zSx%Pz at n9-Ox)mG9WvvhY=f< zr-v+3HTfVVb^a4vjztZZw9kwIRV`#t_lj+t7VAm0Rfe9&7_P*Gvr^;+)1Bk*(cI>f zvGB1mO2-)D*y0e5UaU2zaM&@@QR9i6zVReF(GTATsIi|Y39)(49BQ>IqV=q!wJm`V z2l-f*e<%^$5l5QZ8a5xOxet4!acOq_x$!OeL)5=Q4V&&zsgR5(!+G_uV~wu`mOT?W zjg;(QTA*ZHT}CAWKN>1Gna;16&T)-|vNlUPM<@3AO!4%o42!7XNG$nZ;r=s1eYYJU zd;XTxHLyTHg8$Q!`k&9*sAwo`2%~&0ucEEyYYOCU%F_?7q6o}C7^ehcn3_r=LEA~J zH=@>?3mT3!9WZq^_2kKTO$)rmI*-Dp#7;AvN}8;n#+*G=QU_YWx&lWwigcLt++VI; zS62Fbd)z|!Qh2TeN*BIZG59*P4pnXNZT86{2j7|jO{hY}IGdP z7$bzH(h~l0467ktG8^yoFj|^%t!YKP)aIQX2G1h4SY&*coG2D z1mR(AboOn^qvgc@@Wx^}8ISQ;5*iv*#jguT_g8()UfWAaNqz;pZY at +qmU{@f>0s`@ zI&8pIa#PSqwB@>@(@q(G#V`fMmX53>^n`7J`_1FwX6&I7DpblZX0e%J>l&+A9nT9k zF9^fuFu%EUh;h;lu#`kei>tWGgDgzApNUf4BO?0r581u31j?*60hn9625vg+#wU&A zmdS8i`BJP4op+eiON34_ at _O`2VW{<)VoSAVaO)x5+sfmmN&y9o_h}D!O0gh(z zf*lCe9I0o~ZV!Uzl_c8We9Xu8ZWasL03~HM&5q)V8&`L%pW#V`8)7{oKy+Hf+U^mK z35R at mTVlai_qrBTDeSy7X4!98r&vQmcaRBA37%M`R$+oJy at dOmH-b;IH<9gF^ujK` zUpUVg2n{1Pg<$yXsq at 9Q#l}qdz$!2rbMAiFfrc z@~r|iayP(xj{7}}nA&iZ552U)u3ZzpGpGbzxWt->9p1y=<&9GWH2KLWw5^Pdj&IL~_^o4-eg{P>5r#rC_LxBA}{J_+`JK_D6b zqc>Xsf$;JD z?iKtFzukmavo#fcnay^X={k0s{`-CYe~yAJ_l2-1xDa}xU=2|gWOHfqK(&O`hKnOZ zVDIWq%SAj#V{7ozM~ZjTv#mO9 at a(BP$6}#7q;svu=rN#~cVPPcPF*_}LN{km)4aeB ztB!B^rkDeKAz(Y4Cay7?uQzB}M=xJ-F;_^~3iO^v5cG1T{g5M-MjZOJf{R)37KPZ0 z&;;s_T-XGfr7d=Zx>)djrCO!HymlM4(>VMIy(LdYxx?(eaj({2#F2027^A=V)=T@@ zL0F4gF;P{(o$}m@&S+_>uqbnW4czoQAE__^EoxqB(`XR)6ff25JCD1U2RiX8C>Xg7-$|$%9V|1vE|yn}OiSvne`>ROU`3bFeY_ zl)Ei?7u&vk at Zk&f<-Okdg(XUfBKxPkS%Wq7@~Kk%sX7f|+(Z~Wh+)~*gFVT~gkF&G z{lVpeDq+UbM2YU(5e3p4nJ69waUSnC${^Th^uz&GKUpkQtN7Eppds8IuFeP?FiJ1W zAxycyH?Xrmahl*O0F5~DcVr(xAL`u?^$9?#$}NG32zgCfrN^-Jy1DLpg*LSn&Ai2D ze^9k=ZF#-Rvqqd$x`*WE7EV#Bn}(pk0Q^sX`Rx2${5EhPpj%`hApZYD?EdQ-qpF%M ziV_MpT|(hlp at AaWWB57`OI&y}A(i+3Y3kK0#AMjUCxQF7%cE<0W>?AP1xR~`v9UvD2U zKvOTH5pJ%75o~X$7)GTdv|t@>k~b!~zi^3B3p>dN3MRz>WcxyB?8Q&ytLH)_Pi_o> zBja-ZBWYbZVDR*hg6!~nvh3M|3LkFjeGP}DLk=Hq+Y;c<4T~_6U8R3Wz(T+}>l7Ii zq%4FPscKuPlCdC16v|xreY*isGg;AF?_X{eDu-H!|hRou?3^(jyCL zf_{%}7AF#(A8m%RglY|oK3}AXhDK>Ad2!)sfyaP%qeuOoHW{N>`mNRR>;fTJkGtVp-h}jN1?b+eG^tOJCs9#4W7xC1$Ai zt^?O3#uqt-fjSL^MOjUrnbE3Bj4_FX45^6n>q`G{CN?x+ZDH*O+R!;DM^D9GsG4S} zkS!ini`z{hpAuToU`aZf=E9F at K{_WRchB*~FL(r7z$IK=d8%EMvO1<>>fp#E!s=`Z zZ{$gx)puWnch1;=jZ$%=Nf7kzkH6RAB$|%j!aTLaoQOgDBelrSDSz6f-aaEb4C4rX zy{t%!v%m>!ouV|I-I};nYT7>m9bM`QRs+o>iED-mQyY6WX at soEfCopJtV`juEKgZH z-|#sFtUFm#2C2*7vrOTtHH7V|AjG*Wv-HKt@|EmgKpDN;8jj3XrcZPwf6F3Wb~0=X zc3tXlc@}gdruyX_5o?5^ok&?@EkM zrF>2D+G4v$o!{Pzeu8Q?)<}x~U^ED-|27T}qVeS=$}z-olj8Y70ge6^=|w=Z4jhD(#lT zr+Tr*P73o3vKGUTn1lRosYd(GsnWt&O`@4#YF+-0#gw2-w6nT?d z=Ek~B0+iH6%c5nqlM7aYb6ti7+`Q`4+&R3-fc5oUFqNW_YqvygVK4!jnE>;{Gi?7i z8op2X$2|{Z<0d0f{|cg(2rFA63yTBwf}4FdF>Az_`d;{>m~f at hjji4bW;`{@doaOn^~zH27sI14ngg(k8Hjz zB`Q2emezZ^VzCY=^^BOZM}CCAuCU#($eIv$>xiY)%USGIk~mM8ilJL?a$LkPXg`IE zi6?BBZ0 at BN%!PCIg%~SGa6tZ9lu1L1iJK+8BGHFZS&+*@z&H!GAbmLnwm|p~F&Yws zMy#Thgq>DxviSdE?VaK?i?+4TR4TS at +h)a1Dz^E?HY&Dlzd^;eZQHi3>e{Ez>F&M1 z at 9WdOyKmNSU95|BG5^na#+-AE0f+%XbOL86xSCmu{qvP?3)ZMA*Igj_ArAhBS8IUq z2th3_7Gk2WGb~{MUWI<$J~y0`#0|aIwI26obj$z!-qjQ!(9QPLRvg8X$*3QYDa5nulbq#-mqr|@%82_Vv#(#_tcly5!D^freLK^<#<-_HP z*TmOA5)q&VfOXudSMp!`5r7fp&o<;HvzkP@%$10C^A#!a*P59>*Cg5UVc$4?~p?PZTXyl`sCh1ZR~``BrBT z7F`C;Gf*2akIC?ipK4g)+=IJO`VKU;2GgpGczXw?>ixV;AXas at o_1>mM0N%=k0Oq5 zl*7jU#BHMAC>Z2dV1O--P-ZQUQEm(pn$Iv!tf5o9g}>t|dC_a*R2-VjY&vCR?U;U$ zJ8!JFPAArJegYHe5Jk{_T&uEod#Mu3h)+=7RZDLN>OhXwRDgZQiug23(kuGwu>|_=j5%445qPq2Y*ndhUS{G+q99-fpk+AUf at T?w2k(Y zRT?qoYm0Kb*SualDYXTp{>=F5NXzj9{P at jG#l|?SG-}Y!$VqXh?CWl^SR`^~g}<=Z zRI59jHm;ukYk;k6Y8CzP6#IUXK$p|k3B- ze(dY^yut7A_4dA+3&N0>ILKCI64$Rvp`G{wms?VsEe6A at nZTB&W9*nc3QwWW^qMd# zN6`-OP8OHx6CJLJs=C5PIl_H at fb?v=PFHKa(ny(ok{zy+9J$EQ)qZ|sz^;UjE;j#M7Rt?#Kj>`^hDT)+NJ+*+_Tkceg%w^gzU6q$#Mm at 1t zh&|1*=UI^_sWN at BdocLEebq-Z7uyZtTX1mt2+tXI99I~nbxjt zyi|KC8{055rCabeN$4)@mxArMkx3%NMu3<))-;=GqR7XlOKyv0KJ48kwXm5FKhRKn zwC~|SPJPdamF;guXb5v8d_|RPH^ucLQ{9=9Nu}!e)HRgE z8iB&ulc-E$pP7^9j at QnTs1v*CL{?`97k;!LWicj0wgRQ7kL2 at 0VIDR}Ht7u#E#ps8 ziMeI*iO09ZhMZo_J$=e6N-fleBWVTVmn z4|f71#JYtK>`g033O7VjEm}Q|sM_m at rGG_0%@zgPSsPO+j%JNq`2+5Oe!)*Pj4 at 3@ zJ$N|bm*TXbe9-3WxF`rJXRp*BCR+Cg9Jjm)C^&vZF6|8;Xk*<}noaQ~amh{sbKW(S zqGNOFBHB3dAsRv$(n*67Eo5UPyl1Uk zL-!%ufIT{npW$_-D9^QAk)w(g$*EID%2~lYXRRMFbuDy5Jj at X;w=Ej;>J|us$PE_@ zl95u=u?uzKGY;^%Z&vsv09~S2s~4OSw6ECtfy|w5&adNt=?r%pE7SCk`%OCkZI8tN zwfOvNZ at 6Ub|ClBFXIQz}vrm)b!H2*3CjuINpIygo2W;_jUhmv2Yn7u-A292|8Mbfn+NF z`n|60T0xifdlfZbpNh41i)o}+j(1iy&Q#TweO3s$Gm9I3CeJuZNOkpnCu_hpV3Vy( zoyBHe-=Ng=odn!8aor>=DZ9-;QjPk>#>q{lg}uu(o>JEZ&eq0pIcb{ST-0nDBxKOn ztZ-7vtS}oC(yN5TC*Pcm$0#yZKt$yY0gGi-NBb>kCI*s@!X(#8C0QdYl3Nu;SFsuUiKi!ek(Pg2?F;|ISF zf<{uU{UruotwOik2#2rkfSKq_ at J53ha_Xmv7-B@|*sy!NEW|~tAk*e$g&o3kSHjLQ zRRhEqyRGmRoeC{j z(hmIDp$3It*o>PfmM^h12e0S_Zju5f7>x~RI)lHgjDfIO5O3Isr!_RaVo+54&5W3J zBRuY9pEz%gmZcOyn_q)h~U+c9m`u|MC54$fX6A$0se!_W? zX*O=|4-v1hnyY)cKCf at qd(m~j9apDEBI<4)y(WJ8DbGR{fZ zjv)SDq3`%JkBM9e(!)22EqW5FAA-&hj2Dt3tPQ}kpP=UR*tb&5bnq)YZSdmG67{OX zb!CqH@*F4W}>eH5!MfGtN8krxD)&(_VBP~d7% z3RG}zj1gwr3<(;WKi$+L`E2>nr7ioHG8vV?Y!Ne=O`kx6B5k zsE8=)>aoGRmC&mkYy)GY|v z#FIraXyxe-S}83(4MG$cmlnbW8i0MarXAGU37)s(A>*-d#Y)h3=_84 zu62IU_%MprbwOma(vRqoPU|b~f@;M*9f`FcI&HfoavmH4N?Bdl2P4uP2H!&GUUUZS?eoo at wd;-OBjBfEX5=}b-`2Uzi)8c+EBuO zl3K*Pk3zc+jR&b7G_Jt+x}SPCuLB~%?V0Izod~C7$S}z6z*EG+qn^BcnTX;8)~)wM zVW=R&E0EN2(!%BtpKn&ebe*SEaB32GculVU+`v-G92*> z#4qV~qQQDaDG?Nr*Xd~DIr};*z5f3Ax_TQ#t;UQfG{B!k+EHVsw#ZmBbTBU&e>$87 z&Nbh4q}!f025)%{IbPT5h5q;HyPUd)Nt1Uh#WH&Ii0AOS>NafQFJ3(p%=5p|p_>tF z$TEhqX at 4mP%JnrzCg(O|d&f2#GDgQOd-bFT8k-`4$mmZcCb$IIxPh%_4pcb_Q zsa|sDpIgMpmwS|;FJmb_&Sts0U&AYrSt+Hw`64BM{2 at EYNsueNatLonh&4kr2R|%t z2LLw1RkYQS!f=E)H+l0NBEfqU(2qKiXIXZKm5ue#3-2!sTUBI9cqbl=8!NZ_dBhxe zs{yEhY*Q(Y{Qa^RRn+O5jRDw>h1-aH?{u?b&V7_dmMCDv!fl4qwK7$I=KQ3_CDaUi z&UJ9cyI|S^HGbiIWM*a4c%0xp&XbM8eUTSW#jRe7b!lH-Xc7n!byd4O!AVP86j1!>!gA!L znb2n#`DPgIsUItT)BvPkXP6kU&o=C at mYiKlT0He?oIqGRsGUnp zW5e6ILbI_|-%ZMkW#xBG+d|gRoFN;~7*lN-2s|}9DTk6#X;p~x z$Bl~iii!6O??wyMz0?t?-CNKVp-XdIeA7xb zlkJinWVgdj*^l3-yWz}=h$z8QbNJRtqw-LC(w`I%5Mk9)xr1#88lcD=eGFr!g2qg% zYggJ5Y`A8XjY-mf(oGg=2vnA%N#0MS%!=o&eRfu4dT1~SsGEcranIq1pJrY7>Tiv+ z!4#6o2B=?hO-W%N|CZeWT4{5;Pa8qql|l-aCDD=o(kiE}6FuDy_2mIFDB3|22bIYk zi9hu?7J5M)b`gEV%NoMX at QcSlU6RQ8s6L$*I$#Gb=mBbVg85!c at 1Ur9X&1(7ov%=Z z^^px<{HY#S1&rQ*3S=R>I1?)HkdNq*$J+YH^7-vkG5ads zWKiiaD$sv7i{I^)GoMf at J|V(w1en95Qzug$OQl8Ab;tg`9fU2(L&BgUbSV!&s;zN(GZMveL$8;UI_EOZ!fu zcE{r{&#B~4uj}Yj1P&3*aRS_0x1HI(!pbgQ>guje2z5e-bmybHosFQ1RPD{H at l2$i zMt4kmJVW?WDo7x<49K at k(!@N=s-(>P=J(hU`?eE9_f|)U$7odQA%|Kzq9+4fqIc5# zS-yH0OyY{EKB*B`~G+nfe6x(^5=YA~og8@?B z^zg8MZj&oB)f9m;p$of)XsklkyZJQF?`V$BT;wayI&n8-(91=LV!OZm6fLx#)@3lx z(nxBKoTiUAfMP+kt*xV=G^A%L;gK5EnUj`l>_SO5MRTz($r|PjxM&_Qx`5|zWhA$m zZ#sc8VJ~G?n|bH3EaL#qIkVze!oZL;UQiXQgH3q+Q^s{GMDMVltVX5?(dk~muJGVl zPY;y8(DE6)l7xCO#!{fGe5tXHi?p_B^%~)ogmDdt1wJRuo_`wS0N$B6+nQ30Q;&$7Zss#d9Q3!aUVQV+cS7Y-0{94KX~rJdLM!*cYH}z<9-MYi#T6t z2Z3%AW4sVZd`G;2I1Q~d=88n_NutA{V1 at +6a?#9ostCdREmT*x!J|N at 0^6kQQD?xR zdpZnt#ak7W&T=zTbWHy}(|4iRPzA#}!&#+^(vY2%m$+s89 zoWq|G3Gu^%1zyYC8p!o&#w6ZSSk>t?wIxQmteG%$DkE?VeMU{PmFH_oO9kOJiU1U4 zB}FV at RX~2+``kG2Txl(2V%VooJvTfyTiIHVIainTgjBa#PPM7RY9$!wllX`ay-KBM zOB2EDZ*MW1*YqFA`auzY4_mYz`C%3LqsqA4lxX=j2XzEK;SMcquyJN$(5sc8ai{Gx zyr5S#uN$g;LEB7nKJB*kj8re>lcW0WGv!q9EZF;F>@@dL!LKj!;{$0<@OXN0|M2a% za#fD at f{5+=hR}pIfqt_SB*n(ZZm-zsEB%`NDiC4#GV`iAK$~SZz%_2X#dwNv2W^s4 z$}iw;ZItQ#+CPjFxfu0m`d_SxUi|9oa zy{6%Z(9if37&d01h_oM;-a2C%n9c2zt}+MPFQ^aTD1>l`IH&|4QbW9(rT{}&+M?5m z%WSV}?&paK+t at GPKi>>+xUpGsB6c;wrU&^bLoiti(lAA|;L at S$kUOFb;)TX6Ld?vu zIrd)*H06_J>x=Hu(oN^{q?SEqhg7USvb zS^2cp*dKD09fOr}E;5t~3R`sLo^Oy4sc1ubE3>N9erJKE z20E4 at G*hLUS!^HiFqU!bLN5IhV(=Wq9s;%Mo7vuY(K~E;T~@cHsBg{KqARKoVnMG- z3`t7Qdr60u&akg9z||W4d6^-G?+sO+8|n!y=}_KBE?Q1e>vSHc(tI^MY#r0u!*9Meh)%G{yLkD6Lmas%NFiNJx~nW z`$jPLW-z}N*ZdT=gx6wNC(hUMDBi+B*is0)o8+l5Y>zNP^?DN4MifF at p@aF9fjE{6 zp=*jL=BgOP9wM4pRkxgT(R3_I&aXS%o;skLkKVhh+kbQ=!Xvj+GdLvQ21X+30fx4$ zO!b%!SM|ApMOmQZK`6B*Mtw z?AFfS|BGtu&%gADel!f*2L44c4EEnYUi+Id{|_W8qpD;1$_u-WwmrfY!&p`pgn+>< zH8q&Q1Ci07_uypl7*p*jblX==IdFkr8DGIq5N4jUw`=2i4fELM9XEblU6fv2SA8VZ zaQ(0D-8siT(_T|Ylc9otK-y*O&T&`z~D)M zcviJ}=~(w0Ub>h!o}jjmsiRkSt4Tz-o890WR#XbiBonv25LLa&QZ6rkmKsGi+q9 at _cq<^Ef{gg?PI#Rui4$+ClG*yz-!6kS)F zYF#}|KPkQBQON~Ze030%?hD3`WQztLU{OIH940K=syY zs}fD2%_!3G+y(ZK(tsMESyOZofrIOp_al_axuOVHm&7-g?y0a{1d-dg1o90AGz69C z0o%C}&Ld8%)2*+UNi at wzNw=pz8$l22mKATEd4rgExAswF at wTuj6!J!^1IuZ}K&h;d zaP61g0W>qYjiF{ED%gH2VMU|}E1n#d3H*C at qna3H+z{OF=wib#szirv%zW<~fzAzf znuaq;D5{j`RdW){VBx1u*(HAxxq{*3=f@;czCb!PGSEkcT&STTr==}+^wl0u?y(-yo z8zgEV8ZSeZsT5u at fI37jS6KTQNrvYR#ryHgOHb5Bp(Y!titR> zUHfAIPL)dpgQ4zCJbPtxp54J%ij<2lwsDf%H^Y>-us%`SWOgTpa|Xri>`00xQMz zV4#B}Bos!aV$7Wl6x-wWrXGtRayL9m-=u<7Qgd at 58?S%fJ>Ob&9(}wVi%)L6+;q+a ztK*_5GUf7Slf;b!H>6O#Q40v`uKfFuzW!<@!dcmd-7GS zU#!!}QobLklk>c2`0Wv-qu{szoq>Z`&mDLP0En>Co>pd?nxuGb!kekn*6;)pwA8$@~T&sImDc~3|BcJlQD}#--)-ECs%i6ugx}E z`zq@XFY~^)HU+x{$p8mNN2A at wGz;Dq`}c&?A|UUBeFv~Tv|7Y(Z(x@ zy#Xrv)j=8p9)e4G862sQ^J~n at rbL^<-|2hM;;uo#XHV0%wVx>`f%j=U8p$}kEANBb zNSiK<^sMEI>6a*`+v2PIm<^V92MH|7 z;LP)YqqZo}{(a?EHf*&oa}VqY-Rlma?ULp_U44d1Or?%xF#BX*w1J+JR8S`2ZN(_! z0H=mJq+&!OO66w6-miR9wC$NvB#`(&L}FV;Svl37Oj*NVJ5>yOD6MF}ubHGy$`BTu zf3 at M|RUui1EFt$X*XH^nDF7%q;3$yWV>r3v{zV(=?K@(%E9O&rb*PO zH?B&5qZF0AoO+bD=2hL36&mjk*T^e?qRJ5b at PvN_pJKs--!H at sN&Pv2Xk0EbC+)Di zQO-44gnZ>^cb@$nj?m at fn%SrR4sBA8iF zJ$pw7o>Lv{MZgU|E$Bl&UB8>7kdFhs at i~?$g`s!7G5p5&jc;EocqgVe~IZXbd&0K;{rE)XWAl3{W!tg=pe| zAD2O(5ynha*?LyBgLQ)ulAxJnHglw%^AFNW&t3Dt)NBF{ARuc?YM#R;i=(spLH3&C zD*Iv5B3|uxvIcbUwXvD`QRg2&yR8eI-|qy1pWGn0*d{Nx#5vw+lx{Z%q%%|nti>El6 zPrj30O}>L(oDIfZUV?_*c0Lb{zGpJ;-25`Z@?lhF_6ntkm(Dc z=CaYU+J+bwX5X3|*O=P2kJyuJdDG@?Ob+&&}@nENg ziBpnj{UV?&NOUP*m%%5C8Q;B~l7wzli& zlicc^jP(jD at 5o{FFz7 at i{O_`ZM>5;?w@`vvDaFbHGlo+$;!Igbf7%{+(OKC*HL!iDy}`xc0KiN8%dm#5aAdfm*t#txrv4TovH$R`F at +Xr%PC4sg+ru4|3s z5qr8-FRN9z%%nfO){;tylynw*=#P?jh)z+bU}Xt=YXY*X2Y0uxnHH$iUgr>Z<{pAc z&nF{O9B`S_?TXP^idWsp^064~iR!6h0J~g at 8T?`t*5S{{YMK1`fm$aweLizRoY(Xt zKZGN1*8@>xkq%k267(@mky(<0wXx1*%LBNOqi=B&`f(};(OE+VU0jctTSR85QJmsa z`S6PxX2t8;Cr?7yJt%&LtiwQATe38f(rl6$Yp7B8QEufdru>fM2+**jazn!#Gi(oTBWIU}<4PV5~)q14OXq9z174`VwR7jXVM at A^RV!tC2uvv at iPkU5HG7=ED^aZ@}S zk_t5bh%)qI#yVR69&_&$A`{umjPK1g!HDIG25!tR=1?O+_My~UePacYYy1=E_s&>1 zwJ1P2zSCk0;54_*LN~5qi`^E{%P#a)H6oO-)vcow)us`{^`{WUw|WQhr7%d4`i1q2 zWVagTE2Nv&9qyRyL!?*mmXYUI(I)}Sd1&M9_~MJu_x){@ufm<~7sAeCj&(%v*!`>k zO8c1J^97ByQjOygl2H4h&`g^cWNU!~ojr}!FJ<||AND2>{Z~dgKTSFv7yn2a>&|YJAK1V zk=9MWDqS-hwu<%WqctHE3{xSBHk%LjY5h-Rc%0EZX^8t=UL`1F!>aI4qX!o>^^S4{ zFP~bDDpjS^`jpI<$seXdqv_eQCp#;jw9nTrv>;CNa1bpeQ1|+;eb+S43w|Cq;-j78 zKY`I37_Got)*Fuo_Pl*a#0JMp;%iuCJGdX#MbX@;%h1cxcC2#BqN8dV#SxOxoC<0D zioPKQ`BIN%>3Rf>W}*S7Dj6g=>`E-<6GAjSDQOT^dAo(XiT;JugK$yQ0h7Axn6Nh{ zR{(Cm9bUel#F}VJ2?4goDrJl$5;El5ata-HOniOcm>m>)-YV zfZ3>@KHJ2*$RTVa)up(%9$0HFAa+Ave}_M|vmR-Fc(5Mn!{PlNeoe#2n`zg&^SkM8 z(_q(2o}lY^?S?=0B?pl`vs(P7vgU5nXqPuGl+mQ0Q{Ed#FK$wu_C-zW^{VDZ?qHYK zq8}5;l8p=371pbM%p2U+X~UO3Ow+5AYo;g9%_L#`!1gk2Gl#KYh|*?IHeUCuSxngm z01JfLKl{L7gMyu^*SaCnv`=Xur0EGriw1Y-%j;Ki&8^1hh+Y!#qbr;?wpV+Z_*bHPJ&U=|MfPbaO&y`5r5!~M6OeCt6USL`^ksx)@rEI~ezu2*1 zlx-}&bVpuw=*-@>0>9>o+_tv)=DTgM{~QUh?gnFIf2k at saR5y7Wjw!PA?q2C<8dH+ zT7Y_{gFKob-!{nNhG#Ba_798iQr7cgU=3+)Qft`oau4KA+LuG9I!yI52E3Ybc& z9_ at B6uXqfOyHAt^r;_U`GWY}U-5Y~57c?U6rYn^Gbe>ISdo=IXR8Ktu0~McN%jTH}dbtjZ zmM(#{8$D`{9dZ+yJ~yXYzMT7%{$$sJ(ww>IZy3zPMWMQc_jA%$HDhUe+`H!D0|}+O zb}50=Lv2f%(JO#4{-!uP-yOQZZ8?z>@g-AqCQQd7Rw=qWZgY_RmVBpapmHsi{7k?- zf|u7AY~yh at 8}`ah3ub at oRKPt0&bd?;J{mXy6P=ceIzV;Oa;g_W=iaQeTD8_QdAGN9dcwQK#KiPIn>ZW2DZuEoRX5lqI#2--- zuJb?UE~D87ruXc{(BWOb)WbtezW!y87h95W9v2h at Bo!P4g!BK_Jt~=+yI31KO4-=B zI2#&So2vZd at n5ISjVdyB^FNTjI2`u4*e#*Re|RKGKzaPwEZq|pAy-i>Q-VPe<0i4$ z7<6fT5|4>KLEO`0AmSpL`k)%9K#h>5lZ at xOn7U|Yy`P*|yT5!tW&~-|pf3zthaK6E z32!$=n_+U87M&N3%wM?|5!^Bv;ne;PVJveA8#35M7-25Ogf=T9kQAiyK6dEXL#m%! zl7~$AVhq8w!fQxXKtDQcEHvV|t?Iu|eJHgXhf^9Cl++iUjoBwd7V8>76s};j*p3Sa zE`T#injI9Eu&a2Fs7Rr=W?#4{cwpB;>T$w79UAH^QyaA$4}*nsA8b&XU3G2oP(P&Z zBz7`+#DrKUHL;X)9n2?BLK1mI`pB-d- z at w?{Pk9P9P#Y2HSp0>&7vu-?Hf3MuNNN@*mBF+9JVy8X;X}K-BE)Ja%jc}Fe-t#k; z(hv98!9U;YXxl&k&I=rl*6)-$&`F#mB!P18TPk#!%;bdmv;n^=)sh7e4FHwKW_Q<6 zD(6g-cobLk`b+qobj3 at _Q6sN2E#SNc&`b%z6$kSn0-&=40Sqh!3 zx~Yt!i1ud_T+?4{29I at oj^vOQ`Es0SA`J(d+C1sDxWr|1snN8$o-V^r+E0kFi!Cvk zpRJR9o^a9mO4uR-e8PTuH*5Q~<#_+ at etFpr#L*o`6p3|jBm}9?8jHozFo>D5#RL0U zxTu|R-#;pp1p^D>S%voM<`bp*vOMO at G1RcAuJEdCHN;A571blhP~#W7ExY9tz&p=i z4XAB0Lcyc$nnJ;e^+DcM%qmI?tn9X4;BYA^x78xUF1P<{g;a*oy0wM7+ijMxd-9TO zwB4jrw5rd^(yJ{xQrNjT>G)-=qt`|0WR^EBGHluC7O9sl;hQgM1tgZ^*%`5STZ*(X z`YrbeeKTA^)2(*wm0`JM{k0hfucDxiz+||WNeBtA1889VJURsEqEP0F4lxl`M zC$kiSdY!evu0u0l}MMiB`C9FPbb;=f7snbJsVs<9=g;g z-oT?fN_2str?7Ks=X z{r;`sdqAJWHkDBkKAG(|CFKNZLjPhGi8!U)-S;0P&?3$dP*7Mcq9uE`ig5cZ1MOn? zDHP&8%td2Hiyp%Y at _io!Fj3n`>r=i5&! zR}#`r)fCl6#L>tTr2Rs(@~H;#b4g(RXhlJ#Vu5iKXA%%@ zRMZYa;cesspAXfpnChUt+y9IYErY-}wZHg?Lx6zD{u}rx+Z#GMnf}i;yi#TRA7h-q zQuNhtWNS&(J`{h4K~h1U1wvTQsfCM{D?(k5*UnkR at H%d!KWz$@b}bA*8b>L7DGs#; zl8{(VKkV9?n;*Tqnz_1m`TTi-{sE4N61HmwYG^`!fD*RX1STe|C+ttGHZQliY5+z1 ziXdXLeg++K2(*pByvn1!;JC&q(gbMXaPn*{b$*IsJGed~f5$oq0l;{z?-a%pP1Xa= z;1{|~AK~*8xN2mz;6yB9-n1Tc1J|Q_dt87zt4nd~q|7B1D%b_yTxNo_%I3 zDqnp9rYpPs7hp=0oX;=XRc$f0rA3rWBe?50Oi6((%te0m1HCsbScu;p7uU2GT}#@8 zvTjqhI9vDEMDJ-VT$OWL>C9i8##T)1>#Msiu8ORxtXs$?;Bg)Z#EG)oT6=ixg5cLqB6l_ZlTRARJ?#mCSF!jlPz%RD2dzpj@%?aYut-DMc=ZSEbtYUxfRFNQ`Zq zkLKR!bq=4SGNUDd>fq2ncb?&3H9`Uk|7}CCSKr6p^MdJ{ml6!-NKOv1{4R;q z at 2}m|giPljW+k`0{mn#<1NBZBS8-|Rj=nbRr5H#Jhleu zMR4GFkH|7)n|(0E%ZdZK6<_~yjs<1v$4CVY0+L4n0wVqY)B63d3+h(RxDx1JOP&>E z)mFnRfPw3Y?zvHeT`?oD7nq3;bO!r|0~XL0h<=-6ZY)J66x?{???WVV-i z?)x^X!nczlE8>k zn#j4;V)$J>8KIi at VjPDuBwcvIq+NZ^T{uNYRu!+FP}@D6*r3#WeL34OyX)>rQh&eb z2MP at F#MXLjn@&Ebl_ko)30V2|v` zB9^oT3oOSh1o+EN_GLAH>`PKmmr$7Kn)*1+uvX)lS93{AFPRxZQXG%Kd|NEN1kI4X z33ZBKIA-DLgq>-q1?Mhn*+4uh2a#&5tn2D~u5`tWWz?{ZL7X{fNCm!0W-`-i0gDXf zlpoxsr_7Qoe#PHiVx73Ore0E*Y`+*dK&rn(c+z0wIb&toW1YK==harkOg{3njY4?5 z+_u!)Nrk at myIw^n)P#>ao^v!SnKcLD`sJ3FwfcUe)Pa08J9m-AD!Zm|m7P53H{Dj` zPA*B at m7^&`<9+<7z2|HBplW30Pa$`#r@;@R;2H2#tCh_dwmIQrf;OedO>lWna;3y` z1xghBapGbwZo-0FbCC-F+7SvpbcdU6XU_!$TqkA3ikrPswp26uf-uR2 zyK-jI=Epn>H+P9yTK=W?n~`i2gmK}k%GksjW~B!jr%1~xbr9mctSuGAih#QrR^oD- zcHn$;egCFP&S$eIO?8*A9xA|N-I{TKC})O*_6U2|w{;(yUZPsFL#b!e2Rd|JX5*5+ zWbMwlnk~OpR!@OOgy#1weGKXoQ)WZA84{e8L^M;)K@#&Sou$*Bt#{alRRIqBTMyQw zA88Zg%&D!yw1m~uvv0!i`{A|`0tCfj1q$w%mAIpmWZ39L-|hE#59o5E(uxA z?i(FX|3Go at R2b2|kCb at H7)(KP(1mQKE(_PH+~~^(g_a67Rl6vWu^m~$1 at y5*cLgYiY#khz0L zxw at k7Xa{cxipW&|sl0bkdfK61;J6DfDdP`hN~w*E7|;fgNs}5b>{(urPZGKA;ONL4 zjX+h2Ao6#%fOejcmQ0{vL=9!p8FX3BenTWDTvb1nKh}Nhp@?71%DaAHNHg?JH zl?@XNU(At4*h{6OAPR(L;i_&#RH7loM1IryD z^?G&P(YZT9p7&x~2>td%>1GnD^7*kSl0X1%``KjRWrW1y&m^Lf4p9bZBu%@nT~5B@ zpa?r=zhs~@80`U3MK}!6i3i_k4VsY#_3o%+p%c8bE&zS(6$Et^Tb7!glXaeH6*x^X z8cnv%)|-Z_ZS!@H4C71fqbaq~ER%T!fT3`41&-?C`d^WVVhYBzms?HsP?$4HJ+3Gb z#Hf22eiTLB_DxMVtd)(;_DxZx^j*A0o$ZSei_{6FF_{7vg#_ASztZ)^tvuqs8p$NT z0~^n6NF^$Wvh$hSn9 at eRQ`E&0r}lq!f-R|kJFo98XX9uV08C<%ToML7PrFFs3LpaL z$d)8CDX9-7wd%hE{*(tautkgEOIb05e!8I-0oYRVSxtKcBo$JS*CV`jS=Jumnw%9W zHWfv}g&!Dt&$%_lH~paAyVZ_NUhSjXI1+g%YDaz(Pg1M_1v2!D>L(vY-Q6%d=gZX9 zMNsR>DjK@;5h<-re+FgbTSh7^z6KvcU8uK zmF!|;4KgmXQ at z9wHQd+fggX>r>+e*9DT5VAL1aPFVRnsp7L9+OVRofNU5g}Ly<}TZ zk^2a^GfY29o@^5?zqLd)-GO*7$bq2fEFfP^;s*2jKdbaq?$ky1QLDJpbhdjJ+EYuk zJVp1Ba at w3N`TePY~YvEEg2hRN>Q2A#d% ze*5|$5-=f%^g8t*qzu7_B~)EzQoSJBt1O~_*_w^Z>Op~lB7li5ktH%QRmcmYfm#rO$r@=C z^fB at Er;W;H1yAahMX1UAZoJZJm?>{ulMd6OUW}+*Q*EzyZLaKIYI3c9%6cc at Og!+n zQ~Gj$-t^k;G#A|FzCLuzLfePzPQeKJHRINoIym>5F! zK9EAh at IW3g_hIvnF;}>?9|`OiqY@%SRAB8j=W|a9_wGWP_OKraW!$0i`yiRldEN#0 z4iCkAy6H)E*2xuLoCNq+7c8n3>;fhXu1E%1pnufDzEVeFo) zzrMNAMeI86eFl$E9>xFtpldTaG@#~F@tc1Im!BllHok&0<^2nmow!t7xDTgBtVjIL1`0Izq?iUsuJ%G`Xsc>?jO?(OfWbT+~b)&H6&u zr)%(8tOal_<0>UEl3Be!XobxDZ=AhTurO_tEV|xh+qP}nwr$(CZQHhOzst65^L!IC zbM`)e%-IvOBl at B)yQA~T%IdDFv^pz0y^eK0FU8oju2`%zv!r^A05B7Bq~ho+rbwO3 zYTDL%QpWN_CAX0jCAxnRryR9%TAVMrJ&;4iB at dS&x;-LaOrKXukY*Iw#kSxvTEwgN z_eV7_; zUZsrXs{_Oc5Zqv9Djr{BRU7%3Rp&&Ka&BdEl+PD?cF#W4={3y`Zh#K3 at Q!^XYN8QU zVD-$%6~B}uW|B!0QH#g8 zx=44DQvxS!s;wMEg(+eMvBBfT)gI9v#rnWP%DRGX3s0UuoR>`DM^MR8y>V6A3FWq6 zYZ`1#zuiPVKex`Fr^%EyCTsxyb0Hn2-vYiH1E{3g7$IG)WfxasG;C`_jB>tG(Wag# zPRx`bO+9f$I^M+qF=xm+{vLKA zfpzRH_*@(;s-g`0CFxZLvt~sft{4o%VY at e^EQO9M-K>9V9kA^}gG!?tG@{$3LX~cZ zfTv#XQ!`;rSy>nEK*qH5Fi3qOF=1k=Z)Dh&5Co)XcQUtBL>+0WM8T6_^oit5`Q5f4 zz%-;rtYp(^y=}?!mJo_}NQV2RJoNW26pU~64(dyBsP4`Rrf5iJ99tVqZ`Cb=Q3?=-2#>uGaW_XZa47>W)-} zRPk6+M!v3wAX*bf?JhyfzKRsmzA1F1+l}lt#6x|0NN|6yKFe-vKqxs3SG&>xj~2z8 z9i#^L*eh4L++zGyPh4NsH=n;R+0{cnuIKoz#N(yk at Q&{g+RI){h1T at vec|^Qzjg-+s-Ou at L(x>uH`BqzcUpnRt*2gcSSvLA2 z7-tE6>UcU|HmZITN#aV7l at jOv;YvD0-pIU-XS0<=CDW#i`vlL>DE44Y2J&IP2vI*I zYGN`en at pmGtZDmo16nmB4P+uRKf&fP)7WdSx?xwYB+~7R5}H1cMtj$^t{TOo?ZCmFs4!x^5cT1Z&^G02(nVb>r5Kv-Vb88^OhsdjM zLfS%e(e|m>A@$ZYj@@tt6;xdCnuW+~D-&)Jij at S`j@>dQ^=6nBe#j*UZTmhgqKT#4 z-5DcELsaAn)^5*5&K06>M$$oaH_-R#u6FO{MHMpGluw{SqP|4v1`fHw%Zi$(pRq at 6 z?caE6u(E#!S9qh9z%t$}0BgW at yS^k$wmg&LC7CAbQ_#sO=@o$Kb(E7Ftmeo~3q*kD z2~3G-Pxc at Y26Y+Gz=plCQK9al)yZ+{v!>?(aV{tR;5zRCTIXvJ9H at uH7+ce!e9&Ll zmCUV4mG=1eq9zz2w!>$Qr#m?WIb(oLHmya|_-BipN5?nSFjK`d<(R at o4-K`a4=zw_ zyZ>>Ze{-Y!*$nR+pel9O84MuiaHfED7%9+l5GRKCoi1$U8VRICp|?0bi5*S}CR~D5Ax3;?I|j>S zR(X~zKqI;ooyE00L+j#{HJPi!Tm(BS9Bk5TnB){5cQ$hV{n6o}SDngeHHx8>`UrYO z4;S=s{3H)&!D#|IZva*{eih7e3>q}?*$}~+i362wQrciaMUJx%of5`Q7B`^hv;`-- z2uFJkM)tm+;xACK1yG?V`6BT^WVGB9 at P{{3WB_ztGQ)@Wy*$Ue8Fq2l6Lby!` zm%)5EJk-IdY`8z!g5mJXWs=Iv9F^CW3(`8QSXZ<%cOKb2!oKQ)zSP>BGnfhR`y!>W zXhaoK07ut>K{U!nF{EMCM2Q(q^Z=-lJezG#EA2y-jX(O5;unU26#);mvzU?}g84Z; z!ZHpfGQoDjxzRy+#3}+9pTG>e1BAmt$*{36A@=}qV*{%Eo^;FlK~Kmob;YXmsd*rq zZbo6Xirs5Q`uy~CX8#l+auJM%14YYWGS`36(<}R|E^?fq>{~c6!6jfK!k{waxr+6~ zz-)#A`6CBd`v6~(gMoZ-EEwHqH2A}ZFK~ti{Bpzum at BPnK`J at L9V!_LHJx^joS6;L zoqcaiI4}!`)YR&vV$1m_zQyZ>Vy%YN!0pjtjRqIGEBn0q&yd~tux?*ce3~cppbn6W zNn>0+==Q25HT^3lmUR{y*j?ko at oXG>IayS-)+LegQIjy~j-dN#{srf5WWK)Y^S zdV}>~T at 3`3mmR$NyJel=9=9Ult)PYjU1|7N1uiE(z=J=Pac~FNnsumf0%c4(2mTK# z{L5n!!9}a$dNCw;^@>-BfR((M%(iOGwn at Dg3hC2q zw~D=;S*B4m3?7|>M;Or)i(&c?M9774h@^a?>0fX4^c}r=(Fs!ITQ>zPQ4Pb;7-%fF zOkiVE<=O5IFcD~J1ODSQt;A{!+Kx~TxA2Z(3LM&wT at HC6&MHGBZeb)H{q_?gG~+m; z&-N3~d%j89Ng6?0D#_w3D^Jnl4pjb*hXDd0<2B^BO{LtIzs1#_cVPDp?>li}XV*pR zLr*`zJXHfU at lii)u<&+#DWAI9M=z6kTi`9q7~TAzy4 at rkC_n$Qx%s2Mq1zV%03Zer z0D$FxUK0I#`7@*b>4&U_ at +;fe)zpQ74-8HX0whyBVLOOeUqi|eLJLR4FaVFL1nJy} zkr=YAu>}TySG2ssTiycqF(~GvqM+5%OadWNg$kn8(wp}i&iD3SzRSgwab*PFCG~w~ z#^;rHn)}#un(cMd@%YlG>j%V7_H!e~g!@tiQs!gLLm2rt;y{7n-a~==WbDv=FpkV& zG_LHf8Qp6%&g?!L&+HxqL+{Cmp!aAj?Y=wxGcy0f5~nw`Zgn5aT>yDE*5#-*Zq83{6z)qsCe0-KwMb&A?yUi}%%q$0kOe}j)zVY+Qi{|`!-cs3 zCQ2}Hq3lwVGf|!igNDf9{HDmVGg&g$B4XHBcsNN9T~;b!05jm{4d)72V_7kzu7 z&unwx+6$C$$R`L0afP!UQ-w*>-AgvkaTWOsWkU@*s_r&d%?xw{=ocD_7$yJ z at v1}g2UjVnqoyCXP)l1%5xc;o%jHzbH3Ksl0e$jf(|s{&jM+iE$%1ju4%XHz{?vFH38szldej zHaAwt3( znpUHVPR7$v!!zD4qW0&*&zJ7SapOECr%9f_3V6j at mnoMQ}zvqinQiP)~;V at ZKVIis?;n#`y|-xJ^RQR1V#wa?ln0hwNQQd%tSY z&qD*Y@&_-?jD+%J;X5b4s1D78eqFQeN1~7HbTlaOePp^vSQ`m;`7K3}G6;sGBfd=Q z>A9e4fS+fzxfx1JOtkSUmJ{j=rqQ0wEo at ZzL01oH09WXChz<&ywpaAYr+Kcp8GAp$$SsLo=|N>^U}F=BoYN zDAQssHV+Sc8Ws?4JPD%hD5KML_Bf6Ql7c*J5!XZ-j+Mc`VtkCWFHppwY}v8?jGWR z_`#3hF_0h1LHzZltP7FsHV~@grd^7>R{0ZaiRuO5o_R%Gqh$Ux{2`51lZP zedQPJZc?(ipQxCAE!HQAo9+BN+KAWfF`+6{@m}89p7MNeqhZfa3Z=9LIl#nafv(nw1XD+QzB(jpF^6{n?fnNM*i7M8|3_8Wo_$9NrDbDGA?; z#e7WC;d=d>eg~NiU(3{wh_&Ix{>P^p%`w=GbZT=Q%S2~r120=thTi#4%P9=REgQL& zhHJmb4zJ at kfL9DDOXnO6It`M9+`tytb%!gK3f*sa3{6KC$Lteit=gXFdg>X&XeW$B zB!`{E1qC|7mrSizy}I at x>Z;Na5j``AUQidGGs;xZ0EK%yn+NC)#+&E|T|Z7H(i*=j zJ`!8T+qfwUQc#BttH$8A@|`LrvtO1BDzuYrQO}GG at bFQf&mZ%u7MVJK29RGV5v_0g z9n~HZt!GU})I*`OrdD=yjA^l0mjVj%5o)jp*1e|dqoVSh6;SCD-Y5^g-$rAOF+=ZQ zXz8mS)R)W+Lj)m at aw|#s)wOahnC3PtOjeH$i}VdcFR{n94ym;csH+|*syhY1a+bAT z at kaUYYxX~;R|MSXH9go#(JNzXl??c^^KolWZtG8<)*oHhL+!irZ-fHYm0Q#! zwXo`wk?|?&C0Dp43RdgKtX-a#p4L7Jteg5cmrN2a2*zsq>5lrFTHKyB> z>Gmf|sq-M-0U!ChVcv3teMp%%ep;O%Gx?KH^GO+T^Y{72CtMPU=7wRs$}%l*3)Xog zn|eo2`ejpk03x{~a?Z}3$sHoOgT5YU)OyA$o82SlvLSo(2udJA*wW z*J5P2J~GELc|r$Oqb9bP&3It?C!x{&;%fcyYW-}ter41Arqlek)AVhp`VFS?Nnn&> z-DQ3jkI+uafIsExn`17#6Z#4S z?P4Yk!e-!lPquFeU+Q{qaNb9<7=n_}@dkZTW6X$-gIv%WT#qx``l8f6hE|>c+Z3P3 z#O%n~p*#aM7jk^UU%G(CgssXm?M$W54S%4n#Jr&j;^M{5aUnGyXbQ!rsWM;u>+I}7 zB-Xt0$Flx zfjIa)B*I1*{*H_zN;Ec?BewESM4F_IFkU6^Yfz!Vs`TcQDv0UhK52+fz**;FD&Qf^Vk#ckHqZGDx)&-z5=@zidRM5`gByTok53aF zz#p5%){-t;jPG9J;*I>|r`SVh>WZW_7i&&xsa9^ErcE68t6gVpxz at HA-CEJ}iZT)S z%kj|b4l%%}(???_yt=T!5E)AOMs=igSQZW@^#fcT@{@8m)j99<)5%#?AG5YzN$C61 z^#&Nbev4ix89Q_DqQpfV at GqL7o3p$Z*mAb#DsU~zyee*gD$W)84!qjK4(7cSETw}7 zL>aTa)+4VZF9s(Uc@)z8%?5)u>N2~H9GmlNE*q4;EYyb~p}>il%-u_OkaaB5hXIjn zfJy`b8eBy39or%Z;(D~I_(-ZX{O_zwfD^nE*_jh;?e at N%Fin0ka^EEpNAEb7;&xIC zJu^p822GMW=75#W<3-IJ4&lz3SYlRq1!6*xa}0^81#@uX$Wpubk$m~y1#}>XPq6{3 zw$K*4LiH%5 at qca!pHr&S3&f(QGiZE6$aC-oW$t&$!bR<`#J>Kr?l^>ltl=yI6y46i1QjV^AzTMR zf-V-;#wL#c`Flo74NC?22ev~RTqr=XT%SgyVI~BzeohM>Mx8QI5CvMXiXB1-opYi% z34+G*vc^)YDo)oo0Iv5;b5dm0 at p*lB&rabrBSRL6u^L4Y&v7=x=jHvS?UmOoFRAb6 z{aX$|=#4boRvXd~vH!A&Hb^~zl4z28Y(_WT_Dx3`hg>a&8oYDlpiJD2;8(;TVR1iXc2=m$!eh!nF=Ek zGt2(SA#{|3Br7dCk(LSDK?ReCgAWIfNaeRYQ7xJwv^JhglYL|_XD$_ at lBDA3I75+^ z=JHWdlVoC`I5lA at xtQu}6V)?DrDPmGIt|%HgEaR*nV0SosZyDGlG%Y%LUy<@Ggajn z9mYvBms2H$Nz|G$jS2(XRCW=@<2_ONtjXYDYZuZAD?|)+>_QN`1b(_~n*6Dq%T6pJ ztY3*716s|7M`hB?sOg-A5xy=p_|j$0NoHqHphnR6u13l-Li-t>Xs5J12U-Jn$*gYL zXE&s~An91@*kG at +wAR@?`JQ z3fj(qz%vdtCyZ>L^U|!9fPBv!8$PFitRGHppwkb7z}7%O7#Rh)gLeOi7ujBF*v6Z9 z&j=xJPYEG!A6BSKN>tc8mW!}=PX_s$uyg10w%-RqZ~xEhffWKobQF8o zBerw8L3?h}5Pf}L_+kXy{bx~~r-mlwWW!Wv_WZ+CWP!OyC)UVxWp)Q^5e5^9Zc=R5 zRa5=uGya`q)!k-G_X?@A&W1RpNUcLR>kjME=oO?;_o&W|?$)M`yF7ETNhK?et*?%O zd9A-8c)Iq9vE~{oC7W=edq`&mlKhpRlwAnqb0eU4y{05 at o#Y6{d#QnGl)L-m$yh`$~ReNu9{ zcW3%!bDAX;@5>H4+;Vky8qryanI#)f9K~QazWgt=56d1oro~o}5%Uen1m!c#Qk!UN zKjFL$Gk5SQo4X%D2H0OkFMrQ^6n70&8f%ol3Dt|5LA==j(+MU-$_!|(C$XF_M9hVR zhFX0BYr(Op<8^l;pKbfQ!S(R(>kPO@`qloXuG`Gs(~54;ZF|I^;E8dD%$D>N+$)e= znnAHE at D>`zy7Uv!o5r;p1>nMkTHwk}?I3(zIw!vU1_=G&vTE&k_STObOtGJ47Q!rl zTi=lOy(;h`Zt at chzyv&>o^SIb_Q9SO_>JAePcp_QaIp3BTSE+xYM}UjKHV^QsDxhU zhHeg#z4R5M;qBozqz!Syg_&a&k~YGHynyKpr%PvqOwaQeg4hn&`&)D!vE4I7l{;*} z9F0T5Sf(Gv_-_ncZg{;^;rkxLxPhU$fcV} z!w0FDhbV~4PdR(XNjdR`K0D%RQU*RM^?gvO2Xcl$uxKsp0R4zNBZh9=RU^M;vA@%u z56lTZaf~}1x8w6Fao(SD$Llu6p*MZevtX(N{Tanl=B|g60KwXe*eWZf=L#LVIK$pAO`{ffa`xs+W+5G zmpQ6ZPMgZeKepClt=^l#tPU3btjUR-lS9R&G%+%Q;#r0V#c*XO4N6y03Sz0+8l_6U zAe%pctU7ZUiLlP00WeTMf at mQatkmiNIH=U&KyA5B9eY?J3 z`hV~$(MPl>qW20TMUamarRN`7BT1;K)Fp%lx)ggT-O`k`M>7MdDA^?`dx)}LQL34S zGd-gWdbOLfIznyOq!Wt%5gy{{rR5zRicRYd&o)ZR)?+BoFg+^z;wsUhC0#gT^x1f4 z4h~j5^(r*f2;=ti_0Vn+1_WH`zvq-f-pjQ~j|q(i5i_z*TI^a2;rrt2wdbZPZqOdE z$quhdMKkf;)*Z9kk at gtw6OF-5mKWEp`B_jvBKDqWVU6Qg&u(okmrn2c at j4)#?CLs$ zX^p&L(Jw694ls~2 at NVVv>*sM5ur`NI`#6%yFheM at Hyf}+>sL=s+S|>UuG??JQuWB) z1$T(LWG=MbY+K7X0 ze7GQ@@D_!xQcG2x>-XmKV1m%jE at cGk_S}s4GD!u)-N1Y3Vi|`Z*b4On_mr{@ z-Jy%vS?!g3m}8geiuO7C=D}RCSmRF0^&<{Q9v~{QaQO_?xZxit0z$@!LYG#pi^Z0r zdgJj-(5J9RK?at7&(Ed7pcbz1Y|xR$B?Nwo{}d7XQ;qYf-5gDFN|~2DHu#W8eyboc z0 at Fkf%1iaa3 at j2S1Ln~$x=5An+w(K5q~}@;lDpWUbi^X!xFw75qi0os>!2HWMcb?s z1c{X|;L=&|m_l%8$U{-hxTFv-$PO<|idSgZWICg5qrkd4uf$eqVST_R8#C597{A&~X`hGaGiJ-M9G=F028!bRgoF zk{k#TyV8HDz at 6RdxeAiOpif? zb8!yw?#0Nj1xArG=VIT2dM$>cod-(;4~zy`<_&wy?eE>^ySorNwt z+a at e2`1u#+IE#fV$Nr~q`33&(nsfdS%%NoBXklP&;b~$lYUgP4pPl|Xc8CJVJWc!o z*R3m>6(e<(Dgmt9Pb0zv-E*u13z^7AKK>B4OHUt(RJX42JSBlPNb|zbS%@VRg7yA3&wrg zAc*EB-d=`5U(pOn%1nqmRcvnIMIw*F4JnQ!<<>G{Bcm>ASu+t^Rf-wfv2at&h6;!U z(;yAk at 5t*Q4oE=08_`$rxg!YOh+o`QQaCfIUicvQ7@>ed%j!rXta#&!1RlhqE;KRq zQMwSb)f`*e*PK3)g8x{4Uyg9HPcY|b!-CxAM2Wwr6ni$bHcWLcuSjx?BQHgZro?H+Nc3k?WhW-v#>O0JodZ}Y#N zd3~#qZ~NvdW>yATEbS0hLt`+Un2;+d{gP>%F}7M%E17cY&(EB1H2+=bRTNKptQSzXMULreN0Te&G2P7M zoRXWpib(uy=Is}HfVm~m5M@>R0KCLP%p(XMqCZqV@{VASWTAL(|zCKsz9XI(8gBMgO{Zv9gI at b-~iK&TtK~pS^|+ zT5opmdj`72O*dhB*lNX+xT5cz?`xkn)M^1KOtqmGcG;#eQLoa3^;QI zIKpfURCCX?n(c(C~@cES_VG zT`LhL6x=zGpYx-IUZqSAZ`OOpQiS5F7&67XS!R<37)br{MfZ;@3g}-(MzZ{+>hB_m z6swvh+OhwKEBjiH5^6!Rv$le4FLDJj;?_EA?VaE7+kLM`8#F(eJt%PTl>*+BS?ia^P3BYD-lqS^4_C=D%YH5jgc)Z?HG zjntQc?D`j^|1=0B$rLnyQ>hm`;Uv)Y&Lj3183&JZ z)+S{W2r&*ZD*Dsa=%>^_Mbk1ZZ$B|`vTKseYi&poO5TH^qVwtzPUzw*loCVQ9>Sh4 zGIdTXr;%*yBoei!d5aihB~`~lB&=8#ykX7Tsdr1eF_5`PmMLz%k~wEKKe{B+au%!) z1NqJD7sT1_BiP0#6HbR<2=Fx4|e5oVy4pwyuwNH?e<$^+-Qh=0_4 z`{nIief~E3?7D`C)SgN))>3s&dXn+0ud7fIcOj=#pdXG7gzzB; zrBC-#jMN`HHXt8d2b59M)Gjlkl_O>6=@mzesVeP==7obB78`-5OW9S*aeQ;AQMSds zN3!kE-dNe3MNpW#ah_@*Q48`ED>R8(S+nktcjJ(G<3gRc zy79+YLOgQ#T!%lFlv!>EYdADP+vFO$T9HSn`T^&jZYU3760)cxO+!@ zJVAHzjpX1n>@6A@&>4G<$g;Pe2AEV2I~RuEvx_}A2a;JV*`^baV* zzyJU^{->b)-z~CoR5ooF`Qdq7YgunV&Qhc-3iuOSA$kGanJH~4_3GNRd#o`< zHXULvVt2%){#C&eDHrf at Ioll*=L?B z=1(@e!SzMY8X3~D1?A+DNk65p0 at S(b2qv|M=5;m`>Jg)U!5nuhH&tE+stD)|yO}{@ zEYaX=)>5mOqLOjqP+*^gcuX!-X+^XHtucw7dTb29fIT%Wh4&<$r+I}aHbQZdAI z1(1tyIFuK(iVQALDjlOAxQJW}uWdV~rCpXE8I?A!;Kp;sE@^fLtgCbiHJi0$N7hWc zH%!7 zPBl{{rA$;tAc;qW;KldNQ}8R~xBY?i2+aRNj?5lXd60RlV+fV#-+Vt)D!VD=avQ=q zv1%^DU6}O9OGp_PMcO66Bf2XY!aVVP?-(n6w*%f>qWIgahSMUUyby%`wGoughgO(( zN%JscD0|dN#jMEwFvuX-GjZcAQRG~#V2|Y%%*-3HkYI}I2I8(-Oatbnutc>1wq)uc;!}L=~JE=$C*iFUE>X6!`nR>T zO%j==T{SJEOQUMbl at gkr$iM@^{?-(th9F9>QUBZ)f$jP>#3%S!o#Nde-#f6kqG7Hq z8~jo{?aq3y)7%cHzZqOkudjJ|eE`_{a$dBHhR1AK%gq`nckA zIT9U at Ad^CKpC;OC(S=RN9uLA_b>@=kbd!q^Fvq%Ir!|{IYB8&m}4zYJdab^djUtkrI__m%GZm2W8Sei5^XUlUI~J zT&H{+!`sjbC=SFQrArG-fIa0#2l%l$EO)b_0$-LnfiBB2$PGKfI|D#nF>-a=g`IJJ zQzSmQ<;Ys3Wm1gkpvbm&BnB&O?Y{kF2QmSdFl4Ni4pEiC_={#1XDze~bLaAlB2mzf z>PUYud-Bt#jM>bW$g1Fb?t!WsK4CV{9vs^RcUcI~y2Fey){jTk%y$z$xs7xb+h2GMm`WKaHdn9}WmKh|b_cJA zZH<`rOF&Ed)ImP}#an6jcml-Y9{`&E-)Lgy{}2?(T6TyE at MFJWwi;-ys1^k~l`V$H zq){ywK*bCeme!KjK)^^ontS4HHzn&j(cb@|iH#1}7-u!eDO?uo;a{MCGn)D`IMVd| z`hEfK;N?(;6Xf_s2_PUuFphyK;Ea`x&7mEB$L}0fLM4kX)irk=K1f%`o3XP%7msxG zHk+yg>fEGvoVD{_VV{yPXR5JU_wAUvXT`EOrJRTEzBCJF at UPi0++gngs3i+ALFvoAT4%O#lwP at IC0P_BJ7_BDUIIE5(>XLkubf4Pk`}8A z2dDsf`>Z~1;`c|YzdR4s{pzfMcIjCZ1nB#AHtJe7T5LWT$$P6dceKV@%B#KA-D~I- zWwvju!g7oP!4$3Lzkf at hHWr?v|hnzT?~1Wxgcoc2kH}k`C{g#7YqzP17llc zx%#~jGR2C at iRPU_ZPWPJh7)UptFzp}u9tMWtT=NGUg6sPj-HH_RXD at 4C}{;068ecy zwA`r=A%+yeRYzE~%MQ_P`WUT6>9Pv2Lk98t4u|H46?rEo$p1PENzZzB|NZun)w1Ql z>%4(dvKhkMHe=LrrA|TQA+?J2g&-bb;a|ZT1|-p-_5r0z?IV1l0N2bn%MOJ9jF~bv zqlh1 at 4`+r~mr^ICVLG0Y^;QFlNsSWy<0*2B7^(dc$`KlOitjhee*_^s3bRG*XF8dd z^QJoC7IlSgTb7GpZKJ(RKtZTUk?Je>5%~Vt-o!$Ilr8A7i*cxofc6F~i)pmtz=rPB zj#iG<9!F(dA`xZulpsGSsr~*hvV*jtk1gOI=q7^xceY^v1$6&Q)>Qd-^BvR8#_LAy z!0{0(Lc=Z*Rrou_qX9%j>E&U{2nf1GSH(1Iw{czZCpC-0MDqiz;qm8gyV~{}#DKSDfkMbYT zN+m$P!`I}_+FfhUXy}Y4WjFWq4Xxs1`sC1}B0P_OM+5y%^Sp#?HyPJ=X|Db^9`>n;?Rwe=D<;&H*3il$y|^WlQJ z4k8*K1?4=4VIf<%LXG5B!uHii?gt)A<>0?58^iPpi7JEx5s>RPW{lpKz|cj^U+iv}e@})MKA=l>}wseOy=ZdNC;$i;c=mD~HR? z7$p~+S5UfM6oBWr2v5eWtD9D!J%}8(GIPl1a-18Y-5V{3JRGJ?-)hK`rIJA?l=3)n=&fKSYdFchLGA47h##1T1qQLRGt4=Pn9oV2 z0kT#5r6vc6qV$q4>WjE#V9lq16A}wA5|n?-Q}{re9`y2kL=T8O5ZlYYhzq`jB|k$D zuGvb**_I>wnU6)4x}vFq?NgkSjHjGxruI2|PVIxPPz?)5_OTM}s^!G7iBuH(h44Dd zLpKV(11i3G0@&w8nHhpTsI&R4J!}(74H_amu$qWZ&n4&2V>1FewH at 0fS|ko>*Dbcl zBwqeyo6#(L$37n_0KkR>0086v5a0jNxTy`{t-QRJ=5s-udoR(cecW~U8bXt0lkkZBCx~zq=MN-j5rvU{;K?vThM$2Y9t#e7|lg6fR zrA}p2?t8Z5c6KIfLMj{L?lP=z>-EMp^_S;$%jqU7 at 2{`VuMmKIXr5<(2vj@!yv&G% zwz9iD0quf)0~nP9#4F9QA%u;4YW)TfXYF2LXjBTfehOG$P!&t{OelhS**?XV zdR~mxoifa-=^-b#Oi)>)0dnr_2nH at U(kjz at 6Z4aoKKJ~PsP&{MP*#WeL at 4)Gz5)MG z6AwKGo2fy3UX6BeBmMMWRygTF8ETbbpqcgrlyFA`qsbXt?67NFZb&Zm^chUs{S(w$ z>*qaI?y#z7ZeOmpoT(8HTy8u!^EVwh>VBy9TS432 at gTIrSLUzY&@^{_hM#_*D0>RG z->lFyPkjvC{$bk1yD(h!*fgs*BDm`Q81A-=C at S?>s*d)^Dz1(<1|wINzHi|nEAINx ziOxGsT33&Hq^|T6xem{q&{eNJ=>x%(JcoNHTHCz?QCi!B15+3~0dz$xVZa}K{jB+B zVr&bMxhg>dqDJzwIMJB$&^E&8@>j6U81o1IwDszJ+u($h0(E1n8U!iaWRzR}In-9L zKp9bBg0j-Wo8)Dbegwj$W5-#|dMH(4^ z^1&t*vlMN6qJ*-Dk5iYaf2*p<7}VkAiUN at e=5S5%WcC^~LN)&$B_j^j5Dm_iuL(Yj5=+*UDbtAJ zr-5)p4HlSB<3&d3q(MC31rlvV(-*OmU^QyCIw`bAw5r&;;2SSBx3QupaN-8e$@hBO z>P6MGS!l(Rs^SIRTEaGy zfx-+_j8u3=H7D3xQ!DARWN<&bCNrq}tl=BSJ8Q2fVUT#AY$V1ES2u~*y4foQ7XLeW7Kt4ZV}8m4H8V zK9R9Th(*$jxjx46BKpAMXgahttnlXq*o`&Qx-^fg_x#&AWwRPwjEu(nlc}WL?v}YL z8WqN+H63*JH8bjKUi~;#v`A)W$=I5C9A0dF9=YN!c=@_OJ%70zP8bMyjS{hbIbSHB z5E*jpOPUyyt&66_cUfI?5f^$go2!fgJMtZzm&hJ-7WI30pS7s1qmaO4VQOhi$;nZjD6$DT^s?khg*j z(FO at H^Yjc)U)?rzXWySW#Hji#n27_WWl09%4+mi!)9ogoUp;T3Km&M}xP%=MJ)`uL zdccnAB{sAP{{a4`f^m>v(^1U8 zq!8q9~NkY6M$)eK2rUC!Na6b%_PO}CJWU^^7BH2ECZGqy#W)T8e;1A3V>)S zXVcEJU``Ejcbc!@Q-M3QNKv0OucuNz6#a`h$eS0F-$S6^?0kNb&W>#KhY5bE=mCnO zX>yOw{lG}wE1tShB1~;x1V?v|5cHa}d4Lqguj26f&MY!{F+g~Thf_P!$i*GZx9$+f zolNa^!M-lm?T|NkJxD at 79CN4Wu*W?wcH2G!7EZ7&^wZ at kKJ?FqpG9ybdRCFf9z;$~}U&av0YgL$J|;V$d`Sv$ysb z*`5fDU&+wtT>xy}UJ at s7h@4XKu2r~-aPbIUb$D}gTjH<$J79+7ZT<%Ou7YNNhR{o6 zdk+n|dGRxKVG^MxGB`>?o<)(vJRwfrfLX^IiwK~|k33QfcUa$kM&I(i$5z>p>Dpkt z&B8rMcKKlxyT%xSJG0G_ at 8oAj6(#{R1L^*$41_aYz_ z?pc#_-DN#cZ`Baro)gUO+`Zcy>0tHGL=CIvcrlTW(Yv#nHK~)IR2bBL;UA0*X%@e{ z!o$rwnNDpphE+HCNKctYQti#1_5wz8V)dX{+v)lH*KWyMM+T6x3wG#77jL-T)dm2k zg<~GAF@|nCzTi0KFa9yOdm$;_B}r;kQPL at 2Nv+bKl!93eNHKE3)9(zQBp-Q`h>Y zKz)SL7hHV7S_?jWpvuUbVG-wR0=+mP)Q|nKCjqK2_ at bt*k`CR>w`U3~^h*o4vtG?z#)^S(^h#_ZkiL>&f0C z1Rf+ht0N@%Ny|qxv?SRmELN*^nmQU<8cJdWo+>gv#}}QGBbQZ{mggmwCNMoTwcIEM z2LO9hT_}TWRK9xYPa#6vfa`jAmI3A at zx9!>#+Gfq-chN#H$#?XxDk-3CviQ)mj-VQ zX&JyZQc73JHo4DJkmZ*gzx#(qURh&T+$Zex9ie{ESu~VWm8rCcnz46$_xQ;# zI`^Ep3>+m!ky~m)_(!Kq3wRb={`O{kcvBxYBS+8gXgWmZ^Dm%_4R4Avl_8q;%-(gFN;yhn}JKz{!BK7QbWlN-*SEMlc0O7#A97i+u zkb8_?0v0!6GP?K=JHQ57TEUoaea8(sF#>1d_p%?HGyOn&>d15eoSj+m;ZJ!5&nKQssE$Fvq;gi1fl&qBA1Z*T&;R%UxyS~x~FWtLJYkk3lyE6klKFmobB(+dABM1WDM$O=(x6EFD at HflQKFaaom z)CS4yu~h@#R?R|AwpIGyuVULTSE`nd;Z0l1#o*o^XD*a&T9G!T`D?}h6%uxmg0?|G z`x+SfADZ`uZTRfQ3J9nMY~n^<0wd3m5`cur3G6G$zab;@{%1&x{PiMbIfZD~rj(`C zzc^K;bbq1P&52S+JMu3fp)RSh*V#2}yHW>PSpMIef=r!}IbCkm{$=eDGiq#?iG*G0(_W^6TioR~ z9fvJBY_C24qjm|$=~rC;eeh)xxdt>>QmSk+{coIsS5o64u6U?h&Eat})z?KOqTOt2 z&{rH~pB_VQ{&;S5HEccjet at fq^jjZf(W^kjTO#_xQL^C7OKN*w5DyaK)tY<`HzC=+kMdVdlbWtU37UQ}1ocQxiDae at Oqe}sF7XVSNJp}Ud3HFtY+b14p zBI$=?F0M_sL}XY6!aPinSzL6r zM0@?E_)D<2aOd~*{_kMs at 8srRpyUC(0_-0^lsh$b(7gYLvu_I1EK0IX+qP}1(zb2e zc2?T9ZQHiZ`qQ>um3gagPtX0PA7;L}kNce0SP^UOh`nNP@=k%Lzb^>m4M%$)m&d3- zNM->zy%@D_NVWq*&ylZdl>-+9b)Q(6Be)`#{In-hv5E*Get|n*2<>5C$unl=Hyu^j z_&#)_xKE1IRie#4k;^wauhcxNA^9kn0(9m0 at Up42{BfwP{ydF-zj{xeN{>Hj+X{i1 zrq5ASmTN%u8NY(d;n>N(je(Wz=>pVFMJJ at uZ|$JF3iO?GK1EkfGQ3AFFhB;Ph+_#* z(L|0gTpqHlOR2U!OGbLgpBq`M=N_C^y;$!|@l23jVUXS`Fz;Y*FZ~Jb{)DSzOESbI z)dPB04*Z|cwyeb=Zl18HRgi|p5ZnpekVZ>e!AxG){uxP}t+-LEJ at y%Cr|9ta)|?4l z%Y=OsLTzq#^?jt+ig=(raiQEtB|2xl=#*5w_zg;QbPgp6!bB?;$)PDbg&}e;Fy{fB zJru3ERIcC?H+*18BzH~;1gNgg6G9+%%th|d;+*%eZ8a9C==uE(*TgAJLj*1G5VgN>qEE$k(^0V z+oBY1EXK2JqE6y04?grqET0L}DMzwG0%dIq6YOSCP3@>$ zS4>kA#})_rjGgP5pN4Dx8GHep?@9oj4RBJe$RT?!^$dRQiS3YMeUd{G+ef1~G&5ep zYEQ=JZAb=QAg?!|qr*Q(0f1t(Hhkp-E{a5jHcf at DJ5TsHE;S`k$b<&5k02rCk9! zkPPHiRh32C9Rt3G1eOJ{qjk*s=ZCDDaB2HpM46-}B?*4ZxWt4 at ss1I=EcSlBWhA6fDcj{^Nd=^kn#_-GGrKiSQry at 7}EU!v95olDehH|M&W&0 zn*Or8VYDJGm_!ThyUA5ZBkt0%&qAKeSLTFcs at A)?5b|%W) zh>1UCdBoM(k=4aanF76u0^<{9pEMSSTw;~SZkl#;{5!hZrmTc;n3cY4+#Hr#DBGYmUy*3L0{@6BRQ`& z8KH0eSJ-&*!8a$@v9Yyig{Km z<~$RAl0tPEp{-_-0OXoQ-KVT}a0oGbK&5?2T6*NkxaVRBxJGq^%N_WRsiCW_4%)+Y z2l4lu0MKG_-Dv(fD`R3W)QNs*vI16R)54yK42M+KF4`-1)a<^}@cD`&`k4Ec!c7Bn z0Lg(5Q#`_paX=WNq5W|3Os!z%FZv~b^aS9cX00`wr626_G48O|+{7t9d6W-$7+)c2 zl&=;E*SfI-h1@)Hs7_QXr#yZ%m1;FTGxu-mlKZX7&5m7rO4rR_ zK3_L4wecMK#0eIk#w?kTVrcqswx>CbA$C!pEwApTt;}}dIqO`VQLZ|h42;#g50+#3 z;gA!OTv}BI<`jRkw+kXU+BR9sW at Nh`>)U#+Jv|jmp3S$-%hvpo6 at Gy|*>_{dvg2VG zbI3QXpItzf^>Y-AEvns0ig-T+jI76$l>977QWGVW^&LwuAMPO?I#QZt!WkE_wt(uG zRjTPV;v%d$>DG8kg}W#M(8;wOmJ`r$#2}gv-x)TT^vj5L+c341-Y14kgFe_9bC;cC zYnk;mQHH)Z+Ie9F3s6eceND}Y&vR_VC8DfPdP_A?E_VwtoY!Jiub!_?d-s}k=IZwo=b3W@ZT?$GI5$4vO|qu>2h$FPc^KtP2EKtO{3%j;-yBR5ZXGiNJPGZjm#|LC^N zs{fKlRYKb?r-!Shii#rHC~~$!uFw_JmO>gqsv>LQxcJq=mooTQfwmMW_(l-!RV$EX zRm}6hBm0LajQO3!ov8SWqk|JmztbCT7lvC&}J%e^vB2Z{PDy+Ri?(Ts95#v`WNt8EH z<;+%J^$rqClA;FQE*xkcdzMC*4!4%8>K1%L5WQ8V$wQ~2H??@wM>Y-xr>fGw__g5B zGJvaKH?DlXLGu8cnWQ?QqzB~w_;VNOY+D(vsvdL1II$@5*s-M0sTc#<8G at stY`G=^ z9OSDcMMJc>q&P76?M3=PkS=;LsN$&jM<(b|RH*`&j-7MY at X4ON6f;?7S!q#7txZ%B zP7!gXbfTE8Ld)oZ2!UI?Ak7uV5x!yNTQ`Ox*@`*8{+lfy!K`C|W#rgS2D>feDE^ya z5}~wrVrlHS0^X`U<30L=e1)|ri#I`4#yibk`YM&zeapuqES8MPv^SKP(Z)nCmAz+}(xi6*9wZR@*NjT3<`SFAK%BVSV`X at _Ru!|LVd?uk1jyktIGJG1 zfG}&lEr?1i?+Gq2p?^nX{!dJCU@&i_+I at M)+bmv)2jD==-{zn{dJuqheY`+(guooz zE{^bS{Lg};CFjq?@2V62c=HFIzB7CF6Hy?HLFuwwrr$pd0O>Z;XvpOWb(r7t4p*Hr z5|lTQt84<@1`=bPs3_ett<9^i2Bm64+04C@*1dDqyh~_4uV(Zc&E+5Q)xE=Qi;kcJ zgpb(SH~*|=c?L8r5f1s6&nczPG0U9#)VQxNWU{%{J>+${varQP(B=xRm|3 at T%dgLI z2cgFyIdlC9(eo!s%fHpUuH2_I`Pe+>llwHXL_zj&#Z5HyZt==~obU=p-$8od at l)vZ zRnX}RFlJXAex+^h8u!_{$S%Yd1$dz)?#>M5t at hEq)fk$oLs at V?cB-Vt&-3Jla=YY* zgI9M&_z36&kDMBTGyMGK{C{ZW_={GS6{&C`2p}L0WFR2w{}!#1MlP1ZR{z;E>eaB) z_{SdAF!DgA4kasa)s-q at C1aaQ2xVlUMJh`sD7|pgkibdVELqK(ZIABTX@@h&KO}8= z%Y+MrtIMZzaFb+kYzr<~E+ at G^Ty{Tu=Kb1#ykFi5e1YA;`NJDifI(*=HOplLGl*jo z#}LgR1sT`jZzAbS$j3YgYZ9X|5e|W1h-ePsGkc5BbpdTX&gcWg0uU7>O|yGBYFO7W(UBB{Y0y zS-IgUK!t}_A9s=3mtld2HWG=Ym)9_uS5}mvZsGGw52H|U3bykc67*3HA;=Cc zJ!R~v(SL5mB%#MK7|ia;TfNK-(l}{P_co;H-H+5cpY2ddN$9OfaCS at sAapy*He;M?UePAd#|TN0M(R+(vy>bo&# zT{C0Q=pUmoDVyq8R<P{@R4_5IyzrJ#RdgZG-(1LH{yuM_*^`tcP+qC?MYTktC7TEl}dfDCI>a||a z@(Y^WU+UUF=Z!6bhhO;hy%l=qz+JD6sj8Q2KDXo|r^RY>>Y%3DYsf48CO6q;9#Gy| z2->X_%;#G*sDE|X8+rTs$dfR>yb&jU@B at L< zVmOp2xM3}P2Y68dB+?ML?Pvi!;DYX;E&o{0mw|BHh3&<66A*a-kecH at QMfmrebmZO zD3~kTK=FzpYTw=4Nn3m?kR&n%MKFP6 at Nr)aBFGA{YkE20Nz*wOIVy+SwX8%f40#VS zxA`c9w^uR7p}fSSwQ|8|om-xEI0g(6Y--KLZrSW~w1AUyBrT8njaiPPJ3^kmOwYL~ zyciBA`Gnk-Lb7kViS|f53MS`MgiNyp%M8tsE=GEk)HNhys@&5As6#ox5!VIr&?|RM z7*OBZb>~v3(uX1_;wS6`W#0;MDDkrw?PN!UG1W{W=_-IL$y4&sg#v#$A@!6lX$#^v!ji%B%_^W^UmG zj`Y58Uq$%aAy@?Te<%F%|8$tpy;OZggH-`6j{?-Zw(~}w{%ycfpU0<<<1cHpfC2*I z_;2fwn4P1m*MCyS|GUlC6X5Bsd5O0uuo~2(GGFX-Pl2LWBcL z_F+d&im(Z}nG62R`7UHkB90pHQ((%|!X3C2T-tUicfI#C=QHE|`SVi&2sLA#D7F%= z%!x7h(=$N`g_Zhfg=wBxb(Mi;RI8s;ys?r_T!qJ{nE<4E{<)sMv0ay z$8mVlVaSqp>-*zE8p)n>SRwshU&9sp4djqZx{M3l6}E`YpbMx~r}Jo&NS^3#6U!-R z4M`IF8H9Q!GMF743$AV=-99XyYJh<<7#u#VeyAZmNV!{2X2PxLKthdYAuTpfGc4{} zn%P!bw|$@HHc=t#FnJhSd*^Vfm_#eE$T#f+27&={Akjv8ngh44v%qavUJF^M5Z?CI zW3SbMBeMXaxDi at siq+6#!LoLx>3exwAW2ed0 zE03jO at +zDH_(mHA2sI#zPW+t$zm}vRN@~?5$l-Etmno<64UnW;d|qUmL(=|D-<&(~ zq(l{JCmt$)O5+Z=c=t}ZQo>idkllp+1Cx(=LEyUH7uTLbnLGAJ&$+z_;k&$X+&Y5W z@?pTYiyk(wS*p5XHTEnhIzFmWY1;_Y&QgKcVGr6{nF=do_-7#PnGu%2HL7s|Hg;Hc z`Gg|Olcw1vJ|Si6^cMj8T|P>)XzYd#gJzB-n6F zRHJb|VfO`91tM#W9e8K>y~sY{Yp+dT&a@Qx*yR=FCqv~OmcQq40i#HE zrk2bR5*<4$zyD3Y)hq(}*MR>;Aj*~nJG+4Qe+v$yys5=Yf9 z|I$OG{A|jQQOyymqSY!$R1h#<)euQBIF7_3lmU>|Ym~KyuFch12tq%r-Rt%*)IUez zYk9$KeC6Zwe~P_%Twc3k_bJE-=BdMHZB-$z)M5B7c$HBsBag#GJC*Q*sr=wKS!C+_^Vfbq~o}LzeH2KpR%5Hu zwP=d~hg;g1PmAw=EyG?D_^l(H?q1o%2Vl0f~iKT zBlY!rBR}&bdDM3bYYi^naU= z-ySY{j#+Yr(Ntz}5(2mVr58Nx9{&ueFRllge?umCxV8~-CurF6M^G1H+z`Qv6A0Cz z{7*d at gx_#N--m%mw|kF+CIpFso8Z7H;lvSIBpD)uZ~iTK&L+f at iITWK zg=S>8kgWMvR3 at gz8^i8!Yr*pZzcCp-B7PtelaiY;9l=Lbl)7C=5JYw~yAi|~9J zC>x-Spnp>%1T48d?-djHstzP`#AW5%SaC&%qL%vaTvbR=(@=GO73Y0}eRQ(z?$h&7 zTI!EddU+tt%2_5W@(xpXwR(7>{V+tCJN&S6Krzh}o(=6BFk*4eaEG4RsyMzt;3XN%^sNP*XUFjj2jhS2hvU_7*oz7=eo2MQtLD6uho14N=W-;}4Z?OJ z at hTrd-B9w8o{^G=4y$M;aaSDq=q_q4j8-f3N4_ZbkqIdiwQTsNzWUut;aN$;bp~;p zQ!=d#W`L62(ku|EhdnS)(W5k7&~BaX?mc at xQuN^4i+ZB;cs~M5a^JNP$jo?8$x+uI_s_OH_mekC4IN(Z~h$Z)M7JO$88IECXqC<;deiJW+) znR&T$=AZJ;C);f7Y*e>%uIu`|_Uycz99?h!vi5O#czJ2r+Tqu7CNN7x%m^AMn3C%+*ld?RSik}C;{R8VCkRMCoA4%GJ)1?Y^$MMdc^D{;h at PXku zz4QE^zMnrnS>8`~cfWufVPz!{(_CFmI#Hc!BFxn2Ye6l^JybyGuqB)X(GtRA7EC%%LmYPr?NP9YtmjivQ2z2w7Qz- z_?sVQ*hlqo)NTiAs4^yQew4~CIz?g3Culp{qNI(!_RcgN@|)WawnXFB^qBhGBwK;| z#TqJ1N&Hkf70#NhRXBZEZVtg>bd1K#l)zH at mJMt){{_%%&@3H_G!1a3`%J)Zl3iu3 zg%gUwYm~am5X<&bOJ_iAf31o}qjh%3Mg2M^)rj64omtxvA(1*=Ji_8eC4HD?t)2o^ z(a)eMv|`)zZs!9SITm(r8EOczfe6>lmRullL&JFbunq?t3I2tv61+r=>)l~3h zh*td?GGbtreW5B{;wAW?(~Jlj20tRc^)$&mDQ%wT6C>Ca2UQy;n|gcZL8aWTf1BXq z&YP}X-B}Zu%1g_7*{-9Kr{2aZ@@9?_|z^x5Ykb%cS3!x>2*cV zRmyTLdJLy4ULVNmv^t=J#mq#LMmEOgYh(z54SH*&JnRR~XLn|`!F~s1fKqtEJF6jA zJ)j3_ux}&%h+pVyvZn)3OW>b3rIpO(i&PyuA))G67|wme zb{V2;bk6(*F8xhC3`od1rwG_I`aUImHT9 at kKP%n=ZCVHrrc_mu+lu6`7;J{5sJ4h=+9}?Kpi3Fs70d?QPq+W93Xflpq;ywA zJ?5(i*GnEoFp{w0kZkuvX4{JHbBwpaIU(Ll*GQOfg*1t>aafOZZ3#U8vF8_<4Th-= zbLh&y;K+fMS2`@ZO%@v_4gp94M)e=SF`myJvRe<83E4;Sq=dulp&=gLF3P7sd19cB z%8=E%7t3txh)@k)!=utjZ}F5_IzZ7M{T$&tApMdpAt9q2{}%pDO)>T@>KnX(YSn+x zFB}l%zvWT(hvwZ!&JTk9f!7(YH=9X_wLVa(hVNk3k3!>I*Vm@(F7W$p^6oy_Egmxx zx`!XG7i>QMsN0^iTy&I;8+`Ixir-K)VGgDY_b@;tnm1UybYV$ZA^Gc&c|ZCqmt}U4 z^n#p|Ool7T7;TtMB&bOK^GAu>n`wM6gh>770bBmg9On1^bgOpNO;jR%NAQCpn z5gxOfadm;*Gg*JwX14Z2L{BPQTbgGjtEx^c>pU?{0gPRi^=Up*ChBt<9sxn at XH;d5pMm`Ui0h`HO#9mYHS at JE$UK#T$=^;m+1kinu)I zyK-m8;5EC^_(EzkOjTpuR at a8l&`-%AU^wYDwoX2Wic%EHNmo>6F_jecT`f+ZALtsh zL~*d9RxMr;`UKs`8l)p9 at SU3>G)ZYx<%R&%SS zH2L0Vw8v<>3$wIYYJ!L{;ELNr^)J5I1v(7#(brX(Cr)f9_<8 z*{FQ)rFAX=v%>RW)E%o;+hV>2F)&!&0kV-6m2}Kzf{apKRi<4mrngd<>i57|V0acw z3-Iw_x*Cc0OM@;u3il}fB7)guNUR)r;o zQ(X+&0n7MXM=ES`tk^ih(a4v at jDqnh%iE}I8&XK2ui70A=_ at m6xnr@Td4hTi!+1 at t zShjt;C>uR3p$Tp{ol>s3P_Dk at 5Pi?8rp>Dvo^P^n+N~0lgl!SnKqB0d?I)ERz7)ul zM{#(WCZkjI-Jn7XAG0%18W!JA#(VfLMzV+E_%$TzpsgF2+NkOFLz+5dd at fS#5UiM$ zF at ie~B_|5Xz9EkgpyAU1rpI!oV;tGeD5+UlA()wXQ9se}c;;ZZex#{bJR#$PRUqmUOR00k$g#T-Png~!=dT?LsjzRN+RH}sqrGz4n6 z;)|1iZxDMYI3FZ1B3B at CdYti0Y8+{#|G at _|YtZ2>1~(o|D0G1KLjQk-nf-i*diGz2 z5CI1S#P$CLvwt}|*{S^H3I1t<99n6 at R)u42(zM1g zH?Ym!g-iMS`FGKTu47BsxlX at NVg#n{0o~IO!ULm-fL@>1ozvqS7lpUa{J$)L30g-) zfWX`d`O&z-@(m5vxS~pPC1EVdQww95l-ak;2)vqRjqOYmlhz<&UnUkoK)tc>fEJwk z*WbEQzoz at EqT7Dk7(&i&y)fLYQQJ_}wi`Jk8$*Z9BO0cuy5}ZCXxIeihMZSjJDXPB zV}@_JLAKmpHRtDQrUo6VZuz_cQj)S#0)taHq#5{O~ac|HYcD&Gu7=XFSG_V7nXI4E|u_&{f>DbM{Oe^#MPO1i;{7!e at 7QL;E*m9#nM1 z;GYtIh1lX45yV%*O#J~VLW_Co*7rqta6R_+eJ~h^2MKuwhZ`h!r<9^Pmgr5{t22Sl zz_{B?_2A!n*2C3%Coo1X*|jeD$)ZJ^b{I?!V@`kpxQlPcW{BO%d6JHx(IsgAokez6zIE(5vO38AiW1%Guf at OyB28Sn;ekR5^EI%VaJmy z)kU&z3TP{H^nI>lU&9A>&go_oEWgV7 at pnf0=x-namEbN$V-quCOA9FkWoCVB9;c>N z(~&pA)9_2`+hH0eh#ehK>k8cts6jCo%rsk3&6sJ|jn=)ZVf|X2efM`>OqW~TPZ(?U zH>}nW7y-l?$}1J<_}sqbhbRn}9YO1=89X~f4RLZSR49}zr6#cLu1r`wdB(~T_{lVF zZjQ1l#XJE9*m~vTUBxhc8>)Q_bPMqdu>+vh|6W5NO35fWUOf(~9gf_XKhRbHkpG$RfEdARyUEv|Nh! z*f3$ZC5v~FJ~5O4%FDU(seebsfx3R7*+@=5Lr+$R`;hDun$QM`4F1B3oY_q5%n`)< zA-J9|$r$$y&i+igat~S|2O|gL7e7!IzcD at f;*1u=8+dtENQ6e>L+r*-L{KcC=82Wg zbM_ at RXHH_FS3mSP%UPn;!}lEk#B!qT^l%u*hN@&F-hdJVL_x?3o~5YsEHkW3*v&D(Wuuu)bX z7*Uno*B_5aqA=^gdEnr2piR4YWuKFXVS=em+L1Vs5%EMF(OVm#kVNz{t9U2Cufz^{ zW)u5cv8d`iW at eX^>Hc>J3x#m8WTy+Rr{FQ9H3YS9ME$)IPc%tis)F9f at V_OzWH;e@ zT at WB3TJZnrN=((+%uLwG#mw}do8rWcOk5rQQx>V(DJ(0Z`QPkZSVM{!M%f2Nb-@=7 zNVL%n;*gjdx;94=-j2=Eoo|(1%id|csjw+YvE4(y6~~;qn{8?qHzD%9_B?sbx!BM9 z|M~ht9YAnbqw-7Jl?h0IF&JkZ=Pu|ekhiWOp zA1<@&SW_t2s1$ErpBY;@%tv_TQEnP}eAr*Y({87c+PV1LJu(KB{9TC&y{Fk1;`pZr z^j?h64_CZ>Y>rnyp~!8D$Tgq3U(KQN<9(M2jdqLhPi>SVDmT%|NH%;y6_cB?%(?Ik z8!vS+>g7tUvyR%;_eI54(&v+TP*`cxsgc6aJ|mD%{?rWof&H$D?VZcZ2JZ5ev at iiR zxIWEJtQ2b*@S|tf3F5u%cyP8dp3nWRD;2RxY1QpRw<8}!lp^$%^d4t!qk-fWU0i$} z^zU(DVzxGlPPs-#VM6BVY&FJmg9yVfYPTW$fN9}#_pic~6WsDJhFZG%y5IeBhOrnb zLLlo2r55^8C94aTLMRja94AZ){`^mvmdV7cOJ14s_)XAF*3Wn~UH9mb^GD=L1*f{2 zpD@%t6h|2LNg7ychZr{@v=!pEqm{Z=In%K}I%Ozv97jHL8nCslA(I at c4HCE{E|xR6 zQBP(PlyFzYVn!<^sasI~==m6Fb)$a43t?IE+gBrfcXD>Uf?eg zl9qbP4~DN1`~&)5--m|ItiQ*Kx$v!2XJ3(AUv6DB_XE zZ?C-QXzghtB?oM6xZ!p)gml$K>ZO-hO-b);NSEj}Yi~+Tmja|acME})sn*l^Lo&A_ zaVZ9(ra2G2LQ$lrI#Hw&HrTM*Lx0ulWZOaJ~LSATB`s)rGU zS?e-V&^B|CBI0n7H&|W<-`15E$l|j&%3%(Sd;i^3`NQlN5)^~%qWo at T)A>>Km~mgq zJVuO3nH6_ea{Ek at U_YA^aqVaJ`KEJWK{7#ZOp1nvpTqSft@7xjnI!I+;M$<0ycX4BdXSXSB?lMZt6z9=I3|J zBlcmaY_-Q~2{`43^JvaWlZ1ju>4&kOWF6VsTE7~cl!){%9}X_!etl|l{OEHuo|(QW zj0z{ZPRb{f!*jWjGpkL-e<`Biqf>csDrh at Ban)hOi8ESfGYA=|Ng8Ri4b({)W^}*d zO12qi9WY8RUt2u7PbPMFdsJyoYe=il=gwzOqX{}|KBNl2PV+S}cH+kT$dajIa`kpU zmzN~#1(2GBclDb8&^%(+F9~v5EQ_w58$CS1*_B=tY z;Cgz>F{Y49F)pdFoeLADDfn0qxriW0!+2j&qaiu1jf{?$G?=J}l&A zU7&Amag2zsnlKa|B`)!LW=9Y1kO>_d4$e@&b3 at -9fQ4bGe50UH!y7IMa;SXcV5s)Q zVgdkW2Iobny2Xrdt)_fg{=6oDb7(I4?p z^~GeQe#?u(GgtK`Os5{8m^73)ecP}?kJeOVo*zcU`oiuh85+<+SJ-a}B7`Z?t{Ezz z+Zvgr>JSgWbjP>l%`0^+J+%$icA>sSwzjYzoyZk1XH4g2e*%%oJ6N7nM`c_P336V{ zsUkVqF$a?jVf35TMhIYp0`&d}U)g^3mC|SNYL9>=-Qi1ZZ|p9-{9(g!w$QYHC$mDO zZ8P&qe}WGE5yAuYfh8Q#H(%j_Jh1(Ak2!#p#MYi at n{h&5f39ab at 2s%6l^XlMA%C8VUM4}z}64tI*1@{`(uIQR2 zWg#9JMn712uq}TGtS&K^Ui6-Z{D8;kjXKm##CVm;>1c4=dt`WuR^CFfj?0TUvcE{+ zAaJ9J08;V#yl|lHaD?iWcoVziOkY|U0=u$^;*OC&CdB76Q%0n!c#GR z?TQI&eLJOvQx2uAN8BCDF}*D^ZgX*E0)s at TM^~e3orz|yp!OC z0hq6O9m?r#yL&+Xv_j;%K57LgJuPN;1pTkH+9rK#3H9tpyFsWe5_H#vZcy|-GFJt) z!4#~UVB5D9y8#BNO(F3N#LSUZAQZl`(2=I$a0JDx#?z9 at x`PywUxJcf9k5BA*+iMu zBEpP9h?6|CHQNey+kDC1 at Qasc++OHD{$sd05zwlFBc=-9kzJ4TEBOI~1ixEhWcwj0 zWalZ#5eaG&W8a&U2xq9Z`4(9+bZ`cL$I5=?4*U)t`28ps4BWrX$26ZvcvB%&C3edJ z;kh-WA1L#11FkQWBhwn{2fVdazk0QeGcdo{9;nZ+HV7d9d@(q>-5pu at t|Td*gkZ_4 zAugu0;ypB}UI3_FQA)V6N%XH-#nB5K>-1fv?lGD51cZ5-ZyaN9CKb{HFa}~|SnZST z_uaRo^eU}aft`Vn#WhnwE_~4Bz<3o at 8DLe(9tDRdljpU+L zA0WP~_czBei-IUQS)ezM`6 at 8aqt>TgX0V^QK-$2+Yt!;KpZE|I)N!AR`OjRAGo>09 zeC7I-(j at MOiH7NEnBK^$xNLu?bMx#U&=pWwpx!1hgPpND;5(GR6ZHi>4*a_rW~@S! z?mvuwJpXcErvD9>_>Y^kSXCVb93iwXh(tH1T20y)dq!(a#dVqb!HgDB6qOo86jW4$ zFtZ?=bgiZ3y;KBvg{F+3 z+>uUb6iT8}!_sMcYVbBVbnusOnR_ee3`=F2&An}_4?StLbX#qFQqh+%KN>FjkQ_WU z*e-kaqgcf3ek?(|W2w(B4#P;moky*s!7Z~(M0pr>6aStVbL>6Y1n?d770)qesE;!L z9Nb7&enU_9=nhIqP1M5VtN{43c-6ZIF?r{)r&{EA at Yu&2P1fYzBLZMR$6H^#%5~3v z+=36C2Ap2=ekOA5px1V#$X_7H{k>CU3Qrjl>O)Ugc!1{ zmk|V~Wv&d7R|PkDD|PaemoR1OGF7fg%s!q~m;$JlLQ&0ozrT}uYj@}`(|nnYhxE1| zrrk21XgA0DsE2<#qJukNdo at 2I@9QVvmhfK}&(mFbFeFLV*5e44OHH!EJ<)388?g#y zG{KyesKLF2vUUYBUQJIPX{R~ zLPLY0uq>rOlKp-3(v>oNiLZYf at f+r?JY2#;-h$Fla`1P-YWTKW{#ir$K%Y^ zpRdP5paH5A(gVTCUbz=(yiH>5N$< z^Y#=3B0XFrY6qY(H-Y{uOHD403CnB9VyaH3O)P9B>N26hPMWm&3YvMkx~OF)x-CIp zYr65bRakrF*!D%Kwm|I at OmLQqjH-*yj`N7IA~g(S42hMqoPE9HeA1^#G0n6gP;lQK z*U&U_y_!(kVA!KfoSbx?JoxSwS69J3*D#B`Y!cy{v6AmYrA(!3?@pDxCk{0 at Zkw5N zex1=RR+h?n!(uU}F1Jd}2Lb0FQj+E)X8LfGNqAnBo(9voTnm(BYNX=FIIC{8Y3hEA zuPmLVJJoTrCZ2wY-O9Z;H~3 zrq22&42ZRu`iiUwXW{Y_YtQN7yp~$>&nODvB>f1}(QHLjJPK%3INKL#nwO3iZ{~JE zgC}P>Mcw03FGWI7P!~37P-gOO2=9};j1KsYk_U)l3rehVBBT%e zB_;MnnW39j6zz<(LWi5ITV9mB*lP(Z70Zl5#1Iqa>6eO*(8b<9|E+uCTw$8?4g~}x zO8^AK at V|h}KLOLK1+4*CL;nIZ2NO0ti1m!LvAuwcX4SV2$BNVAWoFawFYiT<0)j)tLZ{;59TL}nszVe-wZwHt#sRw+1fOv<(7pKG97I$^1>oR9LrL)_LSx962;umHXmgz*z{@c z at T_f2yVQl|3mFY;oY!Y498j5EZSbQ%UXg7?q&?tf at z!!vjC3fyZ&Qfy(-bk=Yg4MV zZW_$Xo at u}YP)ML9)^&&M;@h6cuS{)++9+lD#D`1l7KhoMLvT%e5G<+vd?j&N-IAK= z?Bkc~j{U+)U(1tCx(;h4J2u!GJnHLLK3q$v3-c3wY$QoS?pg&yU;a!vd zhz#e!-b6+Hp~|D5yg>JJ56Y=djJ6_a=$LDqHw|ZwJ_kJUnhY+$dwLsC%pZReGi0EC z+Au$jCY9+5AWB4g=t=36L zvjF^1j7#y8jd&h!N`%;Jnt#iZCS;%MVp6%_!qSCOnj%B=f2i^3y66STZERFHIhzg8L{BS_rPc($iE`CA+aixE29fQPK`I~Es-vKRxy0{~>dVzs8 at Pkpv zzM&qG8d$_8{3 at Ifb@Cf&)z}!Jx9Wi&U|&2^6z}v?F7qdWEyp-gejAe5DJtWW_fp%d zx%Sgddb6eaA`6#%InB)UIWf=Wa;#j1&yPGKe45bJVooHTt&cJKkhR$XkJ^}O;n?3= z+=F#DRC72=j$&3M8`AtG181+L?8&kp)fl9A&5eq*Qjt1=AGU4rU4C#TTT zQl?K)lFA+wPfpO)BQrMO%X&gh^_bEb2EEiatMj>6+ybQSbWWPTbI~o@!{7JFEk~k- zX})=V&?86`vR9Y_dQ_05z?{-iyR1G`maW=m55FRbIl46KLGLq)fRdtM> zNr`Iyk#SXWB$Lr4?o=Jq#Ist*cg7ROE_5Gle)DAU4v at 31l=`j`)$y(jD~ox2BEhW; zp0s++;gq8e*dOzrAhE|T(b?@diCNZqhz>2Fqze8^kVdQ%1F{7JLrD^%@OcisSGU-IV^x09uX4?!(7cmKQ#XK(0dKEb+O%x6Q68Ss_y-zP zamB4qzokYQ9CFei7)y at YQ#g$NI+LV3VsI!2n1Ag`Z|K+Loa{- at fBKIv_^1McIj7!w zqu9cvg<$${u+9-_ZbHjQ0-ey4nN($&xo63sWk%WJ at d*AP2PEBFpkv-+bg`n-$0*~_ zoinn0RUJ6Ib;kr$yitCs!A!`DzqLmp14<8ob2RRW7%DuWUaLJbBpk+zX?7w#Dm^)O ziVu1{^P|Qydk6_NSJ)4FO2t(@r@Ic_3Ulo3{0W5boSat&5q(K8rET-Uf6JC6%?|=Zf^CcJLDuc42D*9 z4T1J)OtcT!yvAr>rXN3q^wz-8e=7HZL;1 at X+1Do`6LNQtxv|l at O}Qtb#F=_~=am=4 zdoQK!hH8s;r==+r62G_Vd%XOi*|%?mAP-Q>Ye;(OaGLt$nX!B(B_F5zY*M7^Ul7fI z|4}ifZV0YH>D|5Ub2-2R2<&~@Iq&r_LbYx{{IvS5owXTdwnGSgaY_`cF9QB2TkQC8 zCm+5mQv3`$2WA1m)8}wdKlw#{!A0$ooetN^WQeNP4p_J}ToJME4?|UjB2C6%?o->? zu7sO+Jf)vnfs4Z0R-t1pY0Ifw9z<^-gnNNdG36^w)fuPo(&v^XQTs8C6EeJNtGddf zwqg--xKl_Te8Qqcu`IdgwPnW|A&pZE)pNFBq{IZ9xWPJ4_=OTnpE<&mPh}IA2(+DvMUU+?PF^r}y1i!6_U;qYe#kEJnwNNSz3=2Bgz_7yJ at lYrkMS zfwu`k=x?O}{AqH!w-Ll^)I5Z$dGxb|WcJ|)-z!wM_8%iR2o2TR27-DFSIO87YF-U$ zS`EW&620U<`LIV+Gev^aWjK$G4d$ToQM%*?sjmN)aulBE^&OI>?=OhPyqM_7$-{wndydXwM~ZUBpPxWgfPPn7p^S+R>Hj-4H) zg6-Tn>=Lx96zK-lc6OnaOo0`8R;7~@-%fQKYmbNc$ea)9ia2k^!b79lQmU!^P@>W7dX-y>;?WdS`anUCn5_?d z8*9pv8tgFajP-Q<@{qcD96{oD_E*6O_{58+;Jj7~c|VTOxXScwCzj$0<28T*ZO(sW z^9MmXeles%zjh!os59XCWx?*XrGrZtJwZ5O?33RH}aMj-!UQjfp}rP$H(Yyk)(lzVxsPv|5E8)A}^5nY8k= zWK|tM441_zW6)^fMa&mLuX;;-{Q=mQN at KoP77AJf^d9o{5a9B<^E$(Aaeo^S at CTGA z-W-hC7pKgKJBag63(N=*bKn9%5s`vxC+!IChPjEH#WZr(MAkQm+V5*f9c`#Glp6#E zH((9{*cGGBGwae`{vXobF-)_z*%C}u@=4paZQHggZJU*R(zb2enU%I}XQfqX&U?Dg z>6!0Lcb}_ge(h`j-TRIevEq(c%bj+!`Kolhso8cNL%wv}jZ at c&y{dpa2L3%Q@~XXC zdHI}zaqgY64 at Nwv9HHjTqk+{7FpqvB_uXfh(cpPC5W|`@(PGz288Q)-+g=pPV zq)So*>Y8uI#8b at GyHfbSjsp!Y=C=d0C}X ziD21H&+Ba(ab-!RdNk*?*siiq*;f1#@!yY}Z)R(|hzGtR+YeWXwaCpZ>H-%F#;Jo_n!BrlapJBeA5xcv$y?D zL{wh}3=w1ec;Lor4EH at m@1s;I4PCJ_H#j7(v+oz$D9`HMq1@Ho=5;L9tr)!|maC3t(P(&^g!OUA-FHP$OKTe^YV zBU*bfSnO6a*o25zyQwkg2)|j_T7AB$_w6+8zS>zj?&#%O#l0qB>XCSP=vJ2NZzj7~ zL7LbdB_N#eMzig{$<}UJ%ZbvXc#9~%}*aoMiQ#?c<46)Ch#|26-xgMIE2dP}@alvEXW+kgqb-1MLoOt48w zHP#XCVJRT_g!P#wsF?a}C1DGs at xkW|(EL}>;UQY6y!|(~H8>Cu(f^O2^PePPOEh#n zP}R}C6c)@g&(MtfgYxMu^E>9r)aNo)mZ-F#e`F#JZR$`aS at Ck^jAzQB?dVTp8v4#t z9!uxB(c3S#e1LvYrM+iolv*VTp%8jAykCA^-T1mZDSW>^&-Q^H-IYXQF-TZxDc_+m zRD>V&NXs4iG5Zn$3nLNl5`rd;UC3n+2;u6~nf1_HZH%d?+iUlLL0JG~he_KJ7eEyG z_WF!H&rGSAsa40-8k=@%fzNv5=oOF0#l;M#+2~`mcjzizk$~}eOQ1g7N!xPgL}&3Fz3G93g2dVXTF%fC at abu z;c+luWB&BVe{OC1mz(A3 at q~AQ3Y}VIXi6x!wi=kFW13Iwq$6Jf-S(m3U)xF68rudx z5&!wd4l9?sW0b&k0sF~6RI{+$ini(Yi(Te?Ke;+DY at B>peTv-Uv=T=>Nu+xLuxH1- zG`f(_DRLB at q&%qZ3xv;j*! zn~6t>KUqkyhYw4|C4RJF{r(wyyA<{-(My}4;GLWK2zv+TM^G|Zmf8XiQSWLLx=bul zrjEN#t-T(H_8T7aCCR6Mp7BS_XZnsDg#cC2);HqWrwnav; zrHmRA1i6r=73EB+N*t0mumL}s^}`?JsS9DPf?=%!T&HP`2ZYZ4ZuBfyudy*%Q2)@^=VZ2;=mVWYZ*WDe9(R(S84Hgz>RFn0?HH zXQg|dh!xi41#&l^1Ge>LIvzW|i~aFC9XhaC_Cgc^QStpsg% zIqh#K*Ac-oh}9eXv=vn!foWF1IT--=q+%Yf!9`6>gBnj;eZPZX5=A3|MnV}7s}-N9 zN-`N>s;Hi|O}IMBl~Q(UZG#$3YUCEM$0_Pbg`ONkA}~ zsFj)j;0P-i^!$bo1IA1$d0I%jzftyM$2!4`w|x4SY^>yj-5##Ie7Q|Q&4!4ik0R|7 zex?4_=YP8Tpe=m*wfhgOrojDIV-)}Mukas8YNxs>f#i>13#UgJk0}M#3=c0I4L=6# zC3nw8T2u;7YUX&9d%v=+tyR&!mvUC=ZTVz5UJ0u~9OHxy-Cmv-)S-|G91`sQ=0F2Px>^BEWt%iNo+36)O1&-~2Fq!sI{EDjR2!rj%R>gek{{4o| zEr*t!IO#`YrIqaP*RFK^OsM8byA?;UrdXs*tFwd7gSHj&i?-(?&Y>x!Ka*PP*=koq%xp^U$f4gwT=$s;+&_Rm&6}MR)mz3f#42na)JCXg(@3*CHJ$Z( znSiuO^WZVZLNOOZY$yM at a)T<-F!}xAi|)H3bGGfJXUzG at zWd5{16E=HX4ekHVCP0RPW6Y at NYChS_~Z4gUrA9=_|!iI$@SW;bm( zLvCVnBTs{-5jrCe*YlGO$D~1no~5Qsr?X`*Pp2JA=uLw$a~43!(e0nV?Y|}cNq(=s zPWUvmz~?L&-~5TD?=1fhg}#=yE#^Z*1g`a~-eP z`9$@rDak2t0rrVC9pQ7H4epU_8>3O(k06XVUj6IlwrjGdBlk#*&y`o!~){{V3as&muT;8{tsEWMz5UH)+f`VE{UhO zC?Tji{%uWOuQEPSlu{6;(4%M^OjkUub?y=U6*cDno8;u2uoHli8#DW}LXxz{Ys{v& zi1m!L4cYB5o%G0(`;)M?^h at G$6OA|Eew#47SAwkP7ukv3hN?Tif{%}1obvr`MAmsp zZp-n{EARLxMd?oDq19>Q%lP5;NfHIRkpZm_IUj%S)Zr-*j3&^imT@=ZJM3xlC^x~$ z`K3J18_P&med^e!60UP at qIPOu0IS5!BdBU zycnnHo=-Ey-4<;-G*gxI6eNA$+Xc~5jw2he|o3`fiNJ>Wm|kNO|TVEo at g#{YC{ zHb&jXWl;i+-)59io5Csp0IEaf^>Y+KA)gV2(~e1+i5Vd#hWdeeGm2EHIGQf3RIohn z9&{sPVN|Xx at 4bkpht>{HGZmH3`oYUt607=xstI~NCcTtLQQsS!$MKC|#Nn&l1alJ=2!dd`|{-_6Di z$k|2LRTe8Iz>e!Z`t;dGW`kKVdme8^I2| zYg{Hnz+o=%u)=e4e?WkT{B^=42QkPZX4}&vifhcVTP7NRXv^ag1mS0)sP@=OjYeGd zDB@;C%{4NiyN_r{aJN!#!8kQZFfBj+wzw1l0TiD`3q;|8Z<=no-;ThS^fQdcxqa!@I z3sw%Y8pGO#;rp-u+d{9l7H;lHfhYKcbaU}^%L>Ph)=2NqteFR5TlQSlw_z{5s`GHz z+nd|!W>TFw`EBh2h*DNJU`CRR$N;RDs32YVXkj}cs8d}TR87CooycN5pmn!2QLz?c zdqQ(Nx8R%VZ;4t>?e at _{XO^mATnBMB7K5FKyyWgNxr^b==~0_?W at -`llIv;WEY#dW zEawrY0S^PJvS|ku z)A&2S$_?2vt4zL_cjd4_uvEmlUekr|Xh&itO-$Ket*Z`D3ci0sP~e`BpI=`j(0Y1y z)@uQyD4denJ4cL~cDlT`8|F_-97~&YJTa#~0Txj9rlqkz-g;vfFdYEIGQ7)xly&j! zVeZD9GB0SJfAi#u}~ zRgrOpp$DdzECS6-=&rCsvnRk}t7MaG5(P!;8ZP_thXRRWM**T>s5Tj_!5$1wPfJ!$ zi>~QkDqo at RfB4OmYMv=`pJ^VH)W|KfKtk`|1x`MK=dPVA7kJs#cuVR9c1C?t7l(My zE0>*9msrmkld3`w=|4UY)UHY=jU9ajACX4|i2KfYIx>p%KYnCT{Kzx at K`hb}FiUn` zDkeW|2D1dNp$Mk%7@!K#eNbD*_j5?PyQoQ_<19bqBVs9ulj|>>ah*PSoY9Z`v>f#< zr%@7VD(A6!iSNglFe0z1OfR%{jaVC|L=WJIV+cc?_AaV!y}i}(00z` zlH4g4WF{RmV1Edgs{Ry0PFXo`M#IAIK#u~Wv7*c=HBV$2Zw|mzyY(NwaHcoZf7=UY zSgouEBt z_M6BkF`d#WK`bXke1Kw}s6oh>`A6CwO9buF9yy8xtN~C{s$1rO=8O)7!>?E3zzxMA zzMZ1q4Q3~Kj~;Z$XnO7v85E@>P#QGR#9SObzp5Jhyg|ZFrY29L)OD$vK5H>jpkj&r z&3vMmze*eIXmZiKMu~m8vKHgE#T at 5l&dqIu0gvM%N~Wg}d%4kkT@=hTD3)QCGY4Jg ziN)93*AhbCO-)U|hK3_F4VP+`8cwFb$i_QR*iFGwU9|xNv36Inh>%r|#y1K(=i7AI# zA*!KG)wk9e=h0|1t#TXYxJaflJU+pB+d=7CvlU-~W3>MD>%)36P)pP11gw?UNV$`j zGz&*PK%vdb9=>`6jT-Ms&#yaLjudksR9!>(tcPCeUmhErVC_K zfgPY*Rgsigvfsc}u#}P+sf__Y*oSzck5 zT7!koCn#>*nO-D^%sQDbGZF-c at q3NH2~YE`dZ65z7P at uh&*uIcP-r>_QdtXP4Ywtr zI6}#1X$S9YM)I=O9E5<gqvQV0| zPU0~7hXI{rkAfYv5G2Ac2ZqE(OyDRY at R5{WUU at g%F)^~h&U(Ohscd-=XZla>9 at 37e zF2tH2Y9^j`^XSwDpTBaGSvwTRq$A;FGBIK>%N8Qy*ew$u$siJ7@|G$B*)v*98OW@| z1#!rN7g&VSO)rX_o48Mwow$$BMc&`V(hYSpc?;@GH7H3Y08}(>2hE$f#r9Cj-r0Daohd8}{ipD=QGP2FR+veK*%&^_>5)Ho8K=wXs+@#2%}z!UT`M%2iZxAQoR zof|oo-Z{=Xx}LHBX7f-F-lzJq5Gz|hb$zx+yotdnqxRt15xGro+`@CdZq1!*4ODTa z{rVmU+sS=Nvq2?`@Of$Z(HHrGcDtVY{UaprmK^kxN?ei~psPGl3u+tebJxM2zYZEN zhZ3cnB&v at K*uzD^*&X}Ddy}1u{Xl6p^QaLb0j;8qJ;6ADABoaZKlQ6)wx1xxYTy3>!g60&Fq#k8*iEh@*2 zx^kfb6z#a at Ih~9ubLT+sPi;4ti23zb0gdtye?Hd);EiyY)XNe)p}wq~OllyQzLTBb zs{BRTE;NVyyE}jr<|FI4x=KXeH^@50I(NU!d1z#@hc)^eAj%gj7!mF6nzzj zh0hD^1haB06eYmo9x}GpzeQ;ThAPcPVEDUi62WynRN9qNGp7^$7RPnqF)O!Vxdne` z!@%J(7g(kppQHd{v4 at QjFyKvj+|-r2Z!b`U+uJHlP=BN>F#z*y8^Dr?309NyNaYd> zx6e0Lb3Q<_ew2W;_$*nLsK?13JddqKjkB_y94Bjdw_Umq0p|MiC`&w~fATP7_( zO%PwO%{iq}#9$A$Vz1eiSi)&Jf;LYp$c=C0MgYJZLhPKBI7$ViNz(@c;_fWuj!WC6 zDV)Js!#QG-hQ)cCCT4ogv}OlC(FbP|M-}|brM8q{z%;vEu!+VXbBTV97LOw)V?Y-k zI9eS-Hv(|IhJNXggd>){BYoXu!hFUIb_`?Q3DMT#do1&wAb7Onr~jDtn(=DrgT5vF z*97$}FAhco1_ILcPugHg&-z{LuaA#6cp>;WdDGjuA at C!3K9+=$)CZxxplZ?$LNUG+sc3 zxg#BxhHfsJL)d36be!jEnN%%0*VfJLoa#-|Pnv5lWN at r%KWg!{2QM_3$jjF3e1|UK zy|)31HbN;>) zSGye5Z_?XZACY7?b+3E1Xsi|UIlx&Hv${P;g3;lPOAKV+Y^%WZ64e#5|LdF!d0ZH= za3pIB_0-3`J8aY4>)6m}rH(aVCOi52Aq6oL)Q$BhHySrey;Q-J0CI2+xsKoMeEOGv z4kb;7{Rr*Zi|~wd?DS;k^z9zPsYDQ?9DpfG`=uKr2htRS5N at cw46Tu364>- zf)#*nS^$jFk)lfZ2&^t-ok(Gn>K0tRq}eWp-{YR|o6#-%PUJMT#?Kkv+bV(hwkK?>lP9^(wG9K&W84+Ftgqfcd7lw(1If zH&uPm1=C=UrBMIF at Co*>2QLzefHdTvL-!8&ul$Vvmk00PTSS`weG%3kEX!0nu+Z4A zY7K~jLbjx$n2UnJ*&0oFrPk!60hBzSbB?ariz1E4OM*NP3u} zb*O*U_=O_K4*gRrX73%^fN5(jlh&T$dTO at j3N2)f>MD7~BbUyeH5&8r+`m+%Mnf*Q z;LLxS#3)nGgSBd--*?$rPnVUBa};Tli6- at A#dhZQveEtZK=w*$GCfm$d at 3vR@JO|( zqqFDnUbb<38s#g0&`y-Kt^Eq?AFk^a7+Axkm-I99*xt%K=6T at TNXa$Jh9SW#{t`=K zdU=8(ZANz4ETY7PM4G|pq^b*oNr{cFS7VdWrHjlJJNFOVItN{sOEM$6X at IOWV&e%; z>6l8b?uO`ar9#94m45Mos>WpISCf&tl(^W^X at pVx{K;~EhJL4V%j3X8VlUyK118xC zERjR9D7k|ckXM%5Qu+jAyR6HC3-H`EW#gKb)lFhU^G-oVS(l7(u=GI) z&v-nthnAL-nc8I`y|y1{nX=I|R|&h_d^KAQeAgS>>GfSIhj%wQr_6R0Dd)p?8MFf#1uy->>Xi{tYZaUWj?@lao9H~!)|p9F|_OFS)Dn8W-qh8P;C8q%tW zydxky3*-GAzl*?Wr6vV-D6loU;5o!;P#nkLgo8Rly-TNO!4acq8SNv}9=b_}3eQ_a z#(&EDAj^I&+DDWfKPO%C9pW4`rVLUu5gZn7EHQxS6FJ08E*e2BADiy#>d%3k9RoT3 znrxml_QFt=9LY4^>q^7#6n$z_f8vQzGKj25 at 3S8=BPAq_ at W)$VF*DrUU08zMGRMlSkygbYxRJlZFyf`jewwvCa{V zkxiu3Vn#BTlzPUy0-=r_idjW7tVh7H&`9#PI1Jh0pxJE1n+H;7{AqO_+CP*qnd+or z?{F)X$MsLyY1t0W3*3aVs>5-3Wm;9;t=5DYT>@UB{3kxTe)5+hvf%tT=)XdnTc-db z=|7}z2LS|x?tcqyipJLeJcON{jlBNdojoR1S9MbYZFE*=EVA&wbVDjKfyn$^;;iC zd(9b^)l#$T&pofjEWvBtudg+d!arx9?&tZOn`aE$hjDEi6_Z&#(-sGhIqu$R*BEE|GTEi(ik$ZD8mFfTAhBqMST1nhK$nV%3Ax3 zF*ybjR%>}855H~tbS=YSURR?!GkNyPd~UKvHlQoI+^G6=BL&>edQsB(UHm!$g=Qd81U z1MkW_6huzBFM|7X()-TPy6_Ao-f4f_+xf%?<@Iw(xE;B{5Mj+e@(DW6H?amnzI-I+i+bJ|!Tltpc6YO`Wny^#1C!~%#b z?G4ekgnn-10cAzPWfvVH_&IE35!}j%;86%q`Ey$$awrv+V!kcRQ*i?!X4 at RpAiO7X z!YA(oz^b2`8E;6UBs=ulW=C-fhM3wLZFI7x5FEpX5bpJ$6kZm=l(u^7!3^xmOO>aFET{<~@zD=H;OHPl zWTd5HHJ1iAd)Dh&Qv~#Y%5t8$_3ft`CHP#aKq}5s1~3DBuvoT@;xR za^afsQE4DSWcfly=nk?hDRlPk71O}PU-!aQLU4p1Ac6y!gb%`>5RifI;m zEIJjRU7x2``||og#`e at f@CKd7%TEV#h-UU`^{%BadzT0xkopHfB$z4_pQyr_qiNHX zm at 4*|MMqQ3mmoyB+6wHftVCI5&xRl2l^sX0z$U%Nm$EbEA$L;LMZCxPbkKlQR^ z`7h%F4QrxLxslfDD5_ z%H&5^j;Ev9j+1KM&r+qk`-A9Dk>i1zuozZKdMU)n4)`%As>c-|wH3aK8wsorEk##pn616QN`0qF&9aA zTR&tGt_G4mAa0<7y4%I7@&JJj?Q*mpkM?@~?1`(0#GFLCAUMmAcL3>*G768q_29Vu zZRD97`D|;rGVkBgNs7`kGvtZRjM>#m?o5{hik;t|plvc7zY%FhXDPlM;eNIE8#1b9 zGj(dlY`GmIax{2jg$AOv2G8I_6jPA;hjfPJL)Cq!RT_L6Lho^+A1JE6Xvw~4k#^T5 z{3ZhGdEruH#t_B0*q3z|$K~feah>;Z)9r-{-u|av{^+#sA>}_&Mu-9eBKZF&(*C2l zzv+UzjQx!--AZDG&l{WcA|X<5V>;eI#2h-5W^4v1LUd~RKKrvF+HBcPU{aKY2Y;@R#TqjCis-i}6~$_CzSK}0&5 zXboxa&@&rl2tKpAMcmwXzmwnilgBB4 at WkqS1|Z(Q37f~~?bhFi6?$?-x`64P04CE{ z^+ogj?~{AWEh1~J%*+98hD01DGn<{duHhSM()e6Fn}T9=`->xuLPe6zu08 at T@8hZx zsU?Gwl&88E4C$dW7ZBc*O|N?90(p6D(EvLauPls7l9Q=ot2~Yq`$af7Rq;u7mpANG zJSMwEd=#$4t?W}BCiPsmSy(ZNdzS^PMUK*_jwGOqnxGZ-rK~`eZd0ep{d!+?Jti2A zbR5olcTtyDSnOe|9T#b;0Tq_m)h^o9jI;jH^^8o{q=ihYBu9yRK;cZsS&hnWCYgv5 z0yoww9`y#9-Bjj}B-@<=Uhf%4c#E~xzqQwyURhfTh50*S^vorHq?_wQfu;Q2hf;(tFaC6I5I-(MjzCE(G9dcGH7qmrU5h zEvXi+ at JKN9NwMSp<;WfE&sU|J>y4G9p2b%=JTIkRW}{rKnJq=Ba29f4OF;aS)6~go zvGLc;4mWQcGpE{V?Wm#I=IZjyj1;FLdSl6p%eWp`Tfip4bzxPJ zcX96C>OCNPkFmi80*8YP(m7J~U;iFkOIF7OrsrxQ33-I7U^3styM6Q{Pl^eQqnNVaHdUe z=P&EpjV5zbvQA}D`=7tLwwV&KDq at OvMdVw~+ltR~2$G!HfWp{YpXkltksQTf-=t at 1 zYE)>Q3ZLQb23VE7`hyjrfvNw5wKVxf at +!xjnuOOH at oQv@_`zF$UrWF!~UaI=!z} z3-r>oEDz+-chh_DpofBxEy>Qh0$bKO=vHM8`~L7Lu{`G@#3C$GQ>V(X!Dcw=FqNSj zX$0wQzX|q}KJ~j at iI3c*Lsv=gmAEt1=EfWZ1#~Yp%z>ZpUYGer?Ey6v&G*HhjOzBj zArJx*`~t-7d8sK{VL at B_k^+I|a>f&3m&f^{pk}pJDZ!hxE<~O$@7$gnqZ`L2HP7`N zY4xQH1^XziHTlfY*M=}7yU^DbYV&z%{Z}fET_4btbFGl}X+e{El4x7l8}q7Sh7vE7 zg!{r0?Lk*yNmhM)PsL_law)%`#(r~*qr8ro>=G+&j~M2o8yV6|5#tkeawM)!oTFnmFbH(Sx$_R&Fx!!lh^i0 z8Ij8Vx=ww1)|^A2+HgXzL~SlA+id$1Qr~ZZz%Wo%qWBiZexo$IH&pZd-VxjPLM>JE zR5x?4qiH%%wbYM_wyvg!UN<8f6YD`*qaC;)qFr7ap=XZFEC0PM*_B7*x%--ANy1l- zQU;uhDIrd_kEqV)4 at qlCtF1+$Dkz&@M=4l88|GknnK+J{*pgD7Awq$MfzK>2O5Bne zc$A8Se2BEeLXY91%Vc73FYk9l=U3j at BT<@|huKvo;L0t+nO at cAUXcl&Ov=_sgi0pk zy}2XQRGjgHFG8Eid#!1G8&O)-6omNIo5(3qx%lmHjy97tHsOY_I=>htsHr%DVL7gBLNZf9mX88+QXQ1tTng9Co z)Q5st)T^sJ>&G_p&=yoMi4!DKaaW?|AFAhhjgg{YmzC>wl_1&5(-!)#VKe9<)UM?8 zWBHMT2%Ajq^;cBX$S_y}BMFgMqxRs= zASxg_nb<9jIa)WSD431$Ivf7*_1id7j}9~s>s89n^ebSxGb2y-b$r at i@^MSq_srS_ zp-GL3D6?yO$IhdkBQ)10h2xx9!_{VUvW6(1hXbtQL44r=13@*$d&#j2VLBZ2VG1T1 z8bz(}ufukEWRJ1Ue5?kF#B6R**_qsY%2)6}2Z$d`!X{V;8|Ce?y(GRU8AE=Jh&u7q z;hW;y4-uNms<y*LLy>9iC7WD{p2vkNI|z%2ld!V3ES vpbaKhUEzbbU1KY;0`K3TiN6 zuHJfBRwh)a}V>SB*^epInuBxbNBWZ7P0T~ z(Bp+4 at z?EP+)EM}{qMXxOoFeGRH{RNwUK52%Noc at A8@MX!+{7N#eqM2|jGs;P|rl_stAw_k at p)a1cZJ z`2vkUh2#*mz1#HUTu<*bKJ$Nn*hw$4ka*8s zvZ9Ra)bChkD$6zjP>7WlF(M@@eG2Du>kZ@=rIxB!fH0L^wz;X6-KvUOz;#v0jX_|C z;*C8=O*^r?U6;g^B8Jk*Z^F6 at gEnpG zF{j2YN8b(pfmA7Z?huG^y>JLqxQo0cC1smRJn{`uIqGD(=ud08;2pg)PMny&Im!i- z+;GmK+wCNkn1*bqO at bXIei%{~z=*cW9%ZSiPWL>A+W1*+pVY2bN$$OwWHg``m5`ZT zYRT!OP!{)=YHC_XaI-W964>)t)6%+WG<{jI)A?+jsJwdIu)-u=!{7+^M-w7AiNniW zmrYE`CInjhJiQ7b6jL1C&ik3HI~8>%_FzUB3d_yISc~`QgwXIQy-qImv)Rqz5w8mylpjeI)s@=Z zV3wcMzA>d6uXMX;lnwIs!l4zmZ!ek?5&62hgEVk3Gv{cg!7ufdO{&_xM%u&4GN;M5 zjbOzm+$gT|1?zMFIQA-Q%%-srA>rVqZHLVI0IFq-BpI>aaF{5{& z7s2GCsH6w`jkb9Zz^Uj|G{t$jd=6*zZwETIsI4$iQPdmmX%t?zZ5~fuq(d*dq6$=04BvoRXSu(0W%s7z}PbwFSz1(d1zO?|-f(Z){ojJ+T;+}?7 zhg}B;d9lc6EFqK>A13q6AKK(p&2v$S{(_ at D14i4Oev%>!%_&w$x)YgN?x@{gUIh;I zk*iM$}ze!zYE>n>uTA8-5wyTGr)Bnky}Ky>{#YNbivJp|}i{4gzBDKH^QfSpZj7hO(gC$_kj_n5pvIGieV42i!4(s=hB-t+wnD8tG~rroPeVw?XoQA}8#vu1kRK8Cj_S`D$)0C#j&y^m#_M~vld%m*dtnBAE~kg4$T(9t=zop@$i^MaQ?)9Kutd zLMNwbElNuJLv7qkBQqQX*n&tT!KgG&pi&*`piwaHBf+Th#6hGrj-Z(s_M(Awl==B- zD#xhU6H#$G=+9wZL6TZg2qsy9nwiYTGyfBGQhh6$v#LGj7=Kh39a%}7JdjMIzKm8~ znYxQ1qhc{{XHYc|pPuAb&xtcQkyL`gij zT}xc>W^h}Kkt19}T`wrE@&y`^a1aJP?>D8oFYI%bXF%BOo-jIM0vcbCBzE^A4S`9g zFad!@E2XC=ilTD1JWXtvUI7{2)_JMVp8+#MB(Lpllop*r=_cOLqpkT!V<%E$Es4C` za)eBbl8nNqk;x}l+ihvg!y0-Y9uNBx_bOwtuOsJrrlxsQIyjccPb+4LV^Vt5GQT5Q z{m at H|NlCb!D)NW(Sgzs3bvrKjjb^1ff{j(I8)=F1-z?AeCk%KJ1^P|i)E#1gB;Eb# ztTczx9fyw($-+hF at AO&}98*~XsVFPrU>9s&VQ!yIt&EkT$=PJPZLpzUbf0Ck1^ae= zv%kqprJM!TRt6^&Ap- at veKMplysGc{eCy~xyeLy+(6On1ArR%0FEZWAqgE;&vg@%* z@`^75E6*`LL7*b33D1^Sd&K2rqg-k1)t<~c?k^RkbP15T9&5-+QrFEafoLn#7pY1NnkNCCCz++atMCy6uf~G=T`5x);|H z at Qp~tnd!k^mZH26t#i5tZF9F1TLXIg z68sqz_h9LS1)la~-pc38SiJB1x`j=zaD<+M at 8h(6 at P812w(i9rox8W=jB%a(WnJxl z1t0TLQi1>bC{pIsDj!-kW;>Q~6+qu4IdSP`%0a5 at e9|=a8^l at L)ID-cfLf&`;^&^V z_qD7p%;F*jeu1Gi)G1ul3f??tQm+`U}1OC7-DwNHyJE}v-&jIY=9_)Hm&)d z&eZTeS_^sjekNN>H%b~!#hv5Qw&;kXsw(9&GEZey-Ge<9H)VX1AM7GniS2J9SPyiQ zw-1w&(P-6lCtncOML?$H4)|(Prv}S4G{ymy-9CKzFte3bM$H6sw1uX0xYx)}ixMo| zG~?>y-~MS$DJ=_Y6N~vaV^(Nz*#p&TlO+WYUafyaYXE9bCNncex)#CTMBdp#R>LG) zk;_Zo)uUI`1xgni+O!@@QWwC!;cW*aPPs(qn`hpqRvsVjoGTciCTHW z7Mn$U_0}M8m44v^iyxZtsJ06GL?_px25q)y-sVQz?6-;`CHi=}$lR at dQID)@PL5!I{3i*bUjYrW0 zKeqyK7v-qkv-5FF zBfHeX^ec5ECOG!!QKCNRFyZ>?tAZs+Lrlj at lItyt*?CpmxjmK`{*+$bUo}g}*N3e& zCK%Uchpe^D-{5<81 at HVhjX{-y%ZYZO<>q^D;8OB}mA#y%!?ZMX!ubOOJLjB9hwkd3 z)mq|wY^4Tmot^fVj>v*?hELG95d*~(3Hb;bwKCio7+xTw7YrwkH$9N}1S#c$es#}# zt8kF1cym(-y_e(Q#98^{X2eIOaG>;8-BvlqXx($54Wcerq5GCNz~k_)gl)cXi8t2fDQ$dC<-y&0x at os9C4vUT06?)1c5uGY>UBJ zD2gYV){f2pK!7|-t_E-F1$8o3J}r!C_BLsi8YQa~fvB`#$|Z-%mL&8}B>Y?Lxt%(t zXfxGmE#;0l17sSF$WP3VQh*O-!Y2ynRptmSnuFxP at BR+k(B(T^t%>^B_g$~Zw|!Qg z-Cgg^wuLO?T08bA$EwV$rtNgT>{Z~I?N_#W1-Y10${hcUa-w(YN{n1`7KL-F6y7#; z&s_VQ?vCl4=WpHnx27~-+>)dOq=zE+N~Eo5MIT#T!Sn7Pu|0NerfVFX4*$G=s at auh zb%nJ at b%WdaI>qfNBRavWwp^2?B+MT$(%EO8 z_xo)8#WUn#cfu{td76kOSLN|k)4$TVXj(G3`}?;s69ah~^YkjJ>yF$vBTVDgjXLYv zR(nmZZ}OJY_4Qtvrhn)^--JD~z<&#agMef}f`G98A2}=h52=V8HC+c>akQ at ygUtr* z%wqBadC`KB;@-XLoYYpfi2g{NdNlM37%wVCREs0Ib=h@&%oM0x&jXmd5k?^qFJY1Z z&pq^rU;Tujz1R+mXj!uJ)_=0OT~2s+J1)Q8-W3JGEsJ!8u_w*s`dMWs>8 at Zk99x2H zJO?dTW!sepvcN*su3u&Lrl546k44X3S at 1k>uC_HlUDfwKwvE!yg&qgOc;;O%fkw#_ zYLZ4Ib35mfft=xmfpvV9!f4+25y5S|olV%oyfo5oTttPaV at IN(^Qh at O@#Fmx&9kS& z?D*%+q;us8d-GYQRaYpsu0GzfVdpbUYpQoMR9TC<%7$-UEGy=D*f|eENiCd#Zi4rI zh29>^KTjvyF(E{C)9lPDnM!=o%bAXkU&{gs`8@&tSL;fv?)G)=09Qd+)e3p`Kb42t zE7vf|?<`xZ?<_4|@|KBnbU$eh17&{PFXPDi$WY#x4{s-rkJ;w8J`yFLF;Ohpa>gDP zC1pcw8DLd<4yH*Lj-7tCY_^SnyMGZcCOM{!g7GPIHsZq{_HHbdI$BVwS*$~#TYgRY z_WX6~ME-%;e#m~%8DVVb`xy~9{#O;L)B|*0wdKYbqfJlkHaki+-JLo33`HZRTWcUQ z%FR`;J5+qcuT&%Tw)OY)w=QbzQgH(3BL82_s^7zXh$e5-iqVFyC{)-kTmKhl?-- at o zx?~GyW~FW0wr$(CZC6&M-n4Dowr$(C&AR(^-`m}1e|_)yM*mr3jkW&9jCf`|F=tfp zu|SJG%_+WL9?$Oi-rqEi$!5I76asE=i(rQI+6k$7RcU6#io#;S zHbCpZHZao1b#8ym76Z26n>k`Ue1Y?hU0gNHKzWFOvr}+O5`OV?6RUF=|Ht)6ej%IH zOZ6QZ?Buo~^YuMuCmM at kEu9u+$b at b^vb~>D!^z**pwI2tDUhqt4&2R~F7`r(cWU7Q zS%2EICAz`-ZW*lJr at zB(G6N;;?pis$0Yr*BWW+Rlxz#=}iXMY`*F`}K-L_Q5lP&PV z)Ul1J@*1jg6H}djz}a!_x|&gs#KxV~{8Z(n+6keiz$%$co2D_ at 38jWh<=5Y4JWslV z1p7dMfZW0V^)}3ZL!^jbHPKv6>cZdOg!Q`bQ%*SrmHwTnaV z%nhKViZ!Gr4d8uk-ol^ozsfde0R0u-)2kr|6ooKs at hj13y4beV3g@HtWHK#{WoOdY z<@qItKmd5sNGveAGujB%H8nME1VTA|$&%`v(nx-&Q~o at J8o$i5lJHE^FPBhdtp&a+ z-=yuySc^41*+LDkxm0lD*lh(`IED&yl`6rUarNL^RZ6JLI6}ORUUbVy4EZm at IOUXz zhq_bmeX6Oi)e2k_Lj2gGMR-H+lmamU%|7YJ;33c0B14ua7F92!);hsHAfDvKGhb|2 zNNhW?*2GIcLuaO3Tmu9h3AbXVpN755GC%o}Hn)h2mdHsxcHFe*YnyHKgyXCZz$G6s z$E=le7ag2T*Mq(hUsYT%3CY}#vqUy(3vE1mFlsLUNEFfuO_qMH40O(uz at t$UxTWRE zy(Xw#7w_ezLEJ{pqhFBwsS}hvwcKVq;yIE|hF{lmydHhqrt at ncfKN%~Zm<_58(Z?A z-XDpV#c;PxmmXVlFy0?SQ~hqfmu6FyalH%=++I?r%)r=3|4f&WX^8-OZs4Hf!Ms`` zVy6vG>3|^rjC-J9JKAkOaeIKR;llAW*^VVg-yv+cdDX139d^^lyPIvUwzYzAhh#(T zdIKM3)%s8-_xR8I{DG_0sT0gS0XS)>Pku)BdC_U2bjcBGEU(}WWOb}rV&TtvDLHZj zPXG9vH-ISrFW4j09~6>)QJ*80OJfL{1wZky&IqztTEi~{NzI_>{KMEcOl at W2=&2;a z-NSqYJ08c;A?e=mF!+Vk_z&U-`G*bnP|s5^ePiRn^mBep5BF+OYbA5dnP)`Wm9>Jk zEL0 at +W~uM#RDm}7?qLAr^S)qO+~MUT_E at 34Tfi(t{j_1|*8&%LD;5jF3_)BL at MAb$#@kq;Yv&ST z%wZTZwI*t5HCv-N9W{8mW;*HarfMQCKz4p5=Vnb?P!2ClPix!^oszPKmRg%D=A;U9 za*>8}FhlYWS~IN^@RoO4X^D3kSerAJqRbpA^8}(~4Krn4#n@=g3bmG?j=mP#a9DKJ zu#Jq(B<~%_;ZKfvlT!w0=#Be8${Na+ at mO6q+`VJFYp;N90iLMB(nZ_r(gV4U1_eQFl*e at BFUn-6OX>st$SIkomNJ_8OOo;{4 at _ zDm&>ZEYCq8fWn^#RvtWAc0(L5juJWb3@^ajbOqxf#sdt at ud>OCb9j#@ucPE|Gy?I$ z`g95uAS`4tH5VCUv2zoAuCletX;Vy{8l_rl^{nJgr|gMA60iy at s~ zOH@{XZdja=i_L1K8U7k6Ns@%tAR#+^ia0?Bvk2 at mUEU<*oG+L^2r at BA+y30;{NbZbN)xV|hG6 zYk2~~W{EsXz$iSixO>Vae$pS|q3(TXG5ZiJ%wb4GPa~bHGXPR#bKbCaX*W8xSZVCC zo45TgdDmPa^rD=JvH;>QyX(J*^&tFQ(}wX9TIU~hMk&B5c*0!sXsW*CwPyiyiEq^i zV at WYW-*YtDCoU?hh@?!qKM$N0_%--^BZt3FqR-;AWoRTDsocI_ZE;+l+DXQvtXJxA zlVLTIbl3rPQY%_x-{15oJYy{j(Xc>3-sJ!4g6F?O$G^j&OAEsHACnaVI`y`1xIEL0 zSksP~h7<0YLzc$ExFf%Nu?C~Za$_TWn-NH}+IWVb8o{9HT$Qygr8MapgPN^iSUCZT z(0HylT`${#*X&>29wiN=GWDqQ#}@xsmG#p7_4DR~KId~LLE(ocmAcxlQzTd&_DJAq zuP4}4HsrokCgeVqFJWlOoshl{z+#4ZGsN at N5r_b4zrZs(kAHYzn6sRDB4O6uUCB{1mH^<$l&-yBjA;~dw5_a at D;pUOXw1D$zgBf z^BwQ_x@TZuec8&SDwQ7$#PHQit35YZ&{>o%^skK%* z*)GS at Yb<$fD~0jkdI+ouWqH#AtNGv=Qj|4P$4{QXN|e&mrI7vdEJi55HPu_ZpL!R| z3whWw%(FFV$@YUDK^#z_5n$!*k*#JGP8|kOwc!Mm0U;6OWVaD5y7kNCv0zt><()q1mKkkaGCvVsW*KTt68WQ7HiNQqBV#|IYfZ@?61^VYdYNAbjp z5u0ymz}uVyF=0eUiGs1SKj{`-Yitw*HFQmcMwOCJwA*{Q;4h|GSJy^em!dE1v(qrp z at Po`B#98*wza$V3+50Q+OB%|d at Ig}~FDeMeAXq{)!$VI>qZwXwSDcQvA2X(Ht4|S4 znWv;TG9Wf0fAHd6ju!n;rjap5=c{Bl zdu&>Y0Jq>GuRa=$h{8j|xn`a% z>XfVZguc;2ny<8yR^b{Ey_PBG7IjE#XFT{VwAC1T#v=KPE5CPVk at jm_LMw;xC%PWQ zJ!hNk+wW;FPGOiMqu_At%-+!v*`AY3bW*o_HHxy4JY$|1D+kNMUD z8q26AoZS_Bj1X)NuUYD^-=80!=1i0%cGkx>E;2k@)_|2BIk^IkZfR#z7~o1myqTo( zsI4Qd%{_b#2WQQ+B_ksXyDU?n>Sds65 zy9*w+f>8v6YuV+}M|enT8wnR(71x=La^L)9?5AGG>vHUYAj z<*?Y!gx9L0MAfF{SQhFtFiamdE3u<*JnpTvxu?`Y{8F#{AKED^X8p05^}ZnnMHD(uGn{V}+^C zbKpyoq79Y9Xf&Z2juI>DO=~w%Pea3owJVaTNLL_P6U$s{m7SSTP>phSDb=bKi8f5a zV$8|T5s1A8XrFMuG#uITq3QbtP%~rTfIn6GdTwukz6*9qi at b?YH_4?@ZHL&!5}|Vf zQg(}=kyjPI6Xgzn-_o?oCnE79DT;D!d1xwS5^%&jm8En at s!|eDQlsUCmj6yI4z*S) z2tCV}MrvXm0KTMfAB1i1xZf&I-24H?Q6o=S5JHs}lX63?5jPpjw% zbNO4dG*rx(N#^x8G4>!bxk!U}dRS4bFw(?e8c0gDblqpLp)jH{;q8HzN*!V%Bl zis#Vrbe6`m$MfYWd54PGVlqRF`58kBYOEraBsiS(vbd_sfiJ;P)a at c`k7c;%WElt3 zyv1k-yU&|Xdv$rR%5O;9^mY%1pjZR9%BBKL8C0cVR`XXi at -Eks@_kXPJ$=RAzt_CO%15m^e+qC#)$XETIynsQ=sm5tfU{p@{13R{& z#JrTF-Kja1oRmrgOs!qn+DzH4m6Cns;m6vr%4D_ at R-BzJwCtBNy#<@;lP`CV7OgsU zoS)RRHsYVSa$&B$u_;{I6q*{J?TW>(wtrtQ>r0zzM(B18)wcPQt<|$7uFbBPRx2@) zE4ihMK%E2vV(Q7?bVTso(tfyF42G0K#}d%0jR|#+N at f$nOPibnf73Ikb%2ObMmY_a zIu7^`RMH}|(MENe**Fm?Nm6<|*!8iv#jyu3g*H1Zul(Mstn(D}vodOo#-r7bdUR3qHSTcT1U=xy^~?BD!=&(FM&`dNEY%?ln6h1-}Hy>W~3l1KJ at 67^-AprRHI z)lohz#Sw`fXE%r;a5L(}{DNv+$L=DnErdO+uovACtP3EPWEA0jezGb{9W%SYW$nAT z<(b?zO%jCs!ZkC2oV9twq{hF)q)8}EE at 4zXVNwm5s8zXMF~V@~fSoEX`O&l$xPD-D z=8SC+NpqUD7K$his77dtB=Ur8Nb|FVO`@9-#1dJmlGvr;O7EM*9*Yzy-Zm-5*Dz+d zVu1+{s(8`N^o+fV7 zjfx^yJ3#T$N}MFSV)UlO*#w--t$jnA;PMo5?N8J#)IoI4Ns4;Zh3U6j|`h2*S_oV^zG?Qk2?- z&V&r(jGh9bpWbZY=>woxhO|O0rHuQNWhM;-(|i$nK|~rCFJ=0nEJ~9`svSm?zWcni zv`Y4P*k#SW$u#K*%g&-=!J~qxp&+cARotMY%@Z5ZOB>RADGQQRRKzw0Hxs#R|FTm-SsK(d?O25y8?A zTq!Qgn^gI6(>1L!aAD<+v%Nd-o$dH>T8306mQu&lj61N;#2RS=rB!-|_(>NNX;Rk7 zGF)p5YZ1R->#lxoS!4w})mUHDbOjY8?TBElvoSokPd-PI>JC!X at p{F%PA;nT8z_n+ z?v=v?e9e+x%Ywhmkn7C#2UUO=ERxBD6TE$iBz at jek!L~12b+Rzl&DVv%`@mHK7wBi zM9)@W&w$EM7Ap^dgS(m&QQtTvBp=}Dkpu87yS0;TJTWfSTqzsz+9G-A(Kb4j7o!8{k^(wFjFl;4zMEvY7 zpqnv%BFdCWGkh{X&QrUea~!Snr1?7Bplx=qkX3#>-X_RPKG0-A;)|9;NRYcJUgJX@ zd5O2X88F^daN7vX#$+k&?}!;Rq=54Q307f-pw_vHd-+n~l%-C8Q8Alv(k}u}UmKNgsiF|%We-2T^1KFA7cT;<-I0Y_UAfdbL z(Ge`cI0)tWjX6CZIM$?b4RI%5v#hv at CY5?x>X{-l;%-xi9U_kd*Whd7 zspM`g|E6}JRB>0j)Vk>TY_Cm|)KH-RR at AB}1 at C^C?0R*U(3l`_FYgTQJa(j at E0+7t81Y*Am z8Wk-irh09u at Ibt6vKsHe1EYHXsRmRdb({^fKBcAwq(c%7PsWjOoKdN5$5F8vn(dq; z-WDo-U^5x02XykbSy~d?2CT0VwxdMVTC3&7ntl|WNXwLq+)~02iC6Y9Li#4PHa8&WV zdCU-Q&gXNme#E>2J>@Pv9Y at +^%z+o!!*13EvB69y*$OD_WE{X|k5!5_)9lETg)8tZ z+vCTl9JTTc#-fJED+cZB^n&}sG(PRo#Q?mzF*846Ceytx&HvfTT(dbd*R&FV-QJpZ zby*brU;A?_yvxZ9c@#rx1Tq4*PyWgKXRGFbca^oN`G>f`ih7MXFRZ8K(9Y zo|Hu8vLAP42)zTF+56q2c1iq!(zsQ$9!U)G5_MTfy-TW0fQ!9K69{xx8>p8+wgL7< zUW+hE{&Z!#8!VCXG9ko-Ga%ElQ$c=|>X-E7Ha*2w)AB>vLGmVu0#(S%&SiKE6z?;6 zRFm(G{zg}MYNVY_E)1<~$|XJK<%tnO5K at 4d#~h9M`=yPJ9EK*#4V(GqzPqvE)*!rj`0dx!D>_S z1?xBXpKtZ$FTvDKt@(95B#M5)s$ zDR~0u8``=~S=^7vLzE~&RX--i{dW}Aq!_4#8>o;jrBgaZe-n at n%q2twWE}+E0jQ+vVW>>k;w8tC5rq`Zy>5O566X= zHHQ}diX|PG^$Tyxr^FrZU%26dix8VvqTrI8>cIKj+6Jkyl!n7Esowdm4BFQ21?oP{L)z$(Gj6lO3vQdkFl*QHkH<-$QbtvA zMTFD_qjZ(B%s0rcN7p#SqB}0_H^F5Ycj7NNU2Yek83oUmJ(-!bf$pEL0tp)tOz+~m z1vf13{1o9BoG~ewB}rB^pi?D4E~Zk3B;waXl|Rrt6bIm~gA|hot-=-XOks41KnEU+ zdU{{R;`TW(4ALGu!D`P;@Mt2(p?%_(OVzGweN6dG3s9GHxI}vcDI)y=LJ0iayhJEu z#F6P^Xie^15>dwB4X9kpdl5X{6Y|Fitoa*84;obbA`-I7teF$VfhzA0thIO-+x0S z3<{T(_+N-j{|k}a{}V+1M<1?AUCLoW5%F6;p4{pj9ecjEu at OvIYM#uDCKw2#%Ijjp};Z0=3 at 82MteIbH?{*EZd75q>Nc_kcL;5bSb zPkv0#8(o)MQyp4k8NTExA7b1Myyc!_lB{T-o+>BTL8thmOX)|05tJ8RFEk(WvOc&+ zy&k=qEzY)MC;e-|cCNh7*Jy;=v}I#GQK?Pe0`oqUP0Jy%dZiiCC(kj1NN8i}(3oSM z=f^3t|E%W&si|`(keAN at Q-j=1 zAot=c=;V4;eg2jO{Wp;t4cG^N+hw(`xi@}0Ogfc4nsQCR79L6t(ke1QQO;1RpIIIA z{Rc`M<8M9KHpYeI*kOFAlse))NM|VBxZ3avWN1q0OcB_UZ!;vU=wRAZKn}*lGTBzT z?cF?F!a_+=b$IncDcKRc#&tE$v$qWGsA$X23wHFEZD${t7yxznFd+?eOXcR}CGEhm zLo?IiNXds;xUfcPo$v zq9u6Baf23*enRC58&!915Dx1nawf=x%0%XiPM z7&ejpN;YKXlM=uu#a}534S$8PwSDdKad~}}{k5`#K=7kAbVf{ezdn?^+O(D*0A*`> z3$L>?MI0uFq;ZFzfPMMkhfcC;JkMs{I$ek$3bHero7UI-d#>5s5^rb;RF>^Iu?DT} zeg&AR$wHomol2Tak5l7Eo^9m_7K(r^LT=fut{7ZKZ=l;A4Bh1mn at ek&&! zTt|7m+L<>u-SWL~st!oHHFaVtwwe~zc^5KuXB(>7G)9chOT~NBwuxz_c9I{_wb`0& z$G)i9+%o}*Kh*EFjY}puTad3gs?#7|4T+)n2)1+k>ns-e+>^>uosWa>rfk(>b(%ll zBga{F!+vEZQqGE}$pQ<^63C(XawE|qi@=JV>7t1tmVatb47cQrxNqC|(K{_kK9F*; zWXxR%bC-3R(Vybh)ZXo_X~2^Y!9n{GZQSD4;PQH9rOl_a#O}&Yj`E|y(Vs~&wJ!wg zQnEEn2jm_JgOn(w^Y at z(xu7sG1zBgPF*t!#Yg7yw?LmO(jf+x0MJw4JStsqDiZA&d zTj#WI4o2c&}*m3eQPONY3RdXg=%WH5-6_V%G#eQvOZ906*hA?+5 zSl#^(B4(m^x#GvJ2VvQ_sdg${pX1})Od<$}(f9mhkq$}12?;1c_#}XD^m}y-Z3i>tcFhq35_ at MdbsiNF z;)V) zOC*={yr=*D;{ZbDbBnR-vd!n=ti6Jd&BL`{;e)R8s>)_D^%DE+B=-A#M)<#4+5aQk zh&5t+;(-AHg~R_Vcewvcw)rn!rW!hbB^uOkQwpbpP~FQxayjWAg<&ogD7lI34aj>$$GjbtPJO%aN4e#o<2 at qm)&)OolLC-OcvFwAiWAxTui0Du at akGF1>ivo&Dx) zu57It)y0KgQbT at 8%}1&?ST@$oCsaiTg!^7R4fl+uyuDt(A{o_1h1#kyffBpE&`zp& zynAa3-bbQIa)Tv55i1+0F83llZH06~S#r-;2ek6;H=Z-~QAk&ZLC7 at Tj42-pO&=y# zfJ7K4j0Q2wk}lF&@f5eUDs at Vkw63k(Jk44~kzRc_r<;mkU}vtJ&zJXG%z>hx(uSQOd{_~44QAv6IKDbGk@ z5Y~LH7Ewek2wr56t8)~*-v>*E`1uY=M-Taq`kq+5j=Vo;=(ZR%lV>@KlyJemuxypN zGDQTJMk+bJ%bfagHc^eEFu${4)aL at wrEd}?faHD^gcjst-{gmtWi>%J-a|SOZWc8& zGXt|~>on2$hTKHG$2|-(unNDur+>iDEuDMwacCG{jr*bmhd+S%)r^@>z<~7Fzzz09 z`v<$&p4xu*!-a>=#niqmzP6DSikRS*i ztDnLF!s$Sa=_>`V9FIvf6mK94kO3F!YPi1y*ew<%mz-5d+7&oA{sT(X0bGe1imeZXT#1OgBf? zJxKmLW4i=!ck(`@^PccCE-4F{@`e8L>jeqNuIEaA{*PzG&S#0E#0&Dbn2hoWhysEN zCX|`6f7TEIK_i6z51wNffS`~GQ;beV-NV)hdix~jDPJk>Zl7M`MyS^s at RbC7$9WgN zF)G&f>_|GJpq#YcfkV$8B6V=AXdAz4R`vG~Q*=Y^ zT2?(>CE#Z#BB@)$tp at ziD+x?L#dfG9esX&`A!I&%} z?oiEqjK()4JonCq^!~0D^Jefl>k_Vz6oHNJ#zcMB2wk@!z1zWliGvmXxiVeVH`VpM zI;oV!!yBRMXsbV>w$jg*KH|lFx`O(p;ER6u_nye7Pp4 at IFc6UEU*|lD|4G(WHnKN$ zuoE&dF>`VG&kS6oqW5pz!j>U>opL&~+aChZzy$&Jp0`3RR>IWc2~p(2o;mgu6RZnZ z4LoFf7H_8ef&Z8hYTXFd#uf?Zz1(Esu$a!|@wmAW5cmbWIwX!J#(RG|IG}<+CtOw) z>5SLEak3|v3Hj?V at mVCPoiOrpHl`}7=@ARQYA?4bGIOVi+$~IT7>pqr5=L($CCIxp z@{cRJDp`}R$Q1MOw{b-;V^(loyy3LnE1mW_-tcOA9aj%>Y99!AB!ZR8r_OI zZ8K{^w%se(T#)jmD7ntjHlIm{E)QES2y*7QBD>bRZE(Q>!_2RUBK!AWY|K$YP z|D!5Pxtje~GZIyue`un=+35;XfQp2B)eCjQyMTaigolh;CmB_qfWdP_I#dFz_DRd4 z6~4)`knn!qLcA8>&J^1f&T|{xn$2W4>}20;xX9l>th^8aE#I;FbB;R=*3u>?k*epB z)dAeq4qz9SSiY*Nn|KEn%K;a7o||)g8*8Sa1lVvgFWT^Z z=HR{556HmBXwY-2L>nVF{xDESM-2%IX=FwF08n1Qv-vv4odB2mA;Kv+? zYGEBBj5-)4-8hf;nM7Pisuu=^%K<|Mjp-DdT=NRD;e{3MavU*kBZz(!m{0O>DMr+i z{TCQsScyL-_NSxEI_N2O8x(~%hk)Ns>#S=cUmV(%-D^_XH|oxFv73Q4&LSx-iWPBr zr5b)9bXXI6cTF>{&6%F7i}-jsi`)7+rwuoa4Otd3{6)~o^3Et at kxoM=pvs;d^$}U- z_)g{SJL_AVxVoQWxGy)RdA7=M)C+DfoGe>1v3EE`XOuCp8>l5wBM;&NK;xmsnaB_7 z0w`8v>>#xxl>YNEt~A`fne#@hmhu&Phr`!IZ{_7zbHDn^g3Dx>oGwm3!EqE85n7 zQDWZb;YZ?rE$%Egi`{(pCUX4&u?}3Z)$415C(fkCXNtz)_N}fS_ z6U~Dpx0EA+uEou_g?D0)QEL7z6 at Ie5lDkj7d$ZnXOaVz|>aDm2#D<)!9ArJwE=Ie! zA6;rE3^}QI#!?vLkD7-|d$T}eCm6!NfHL-;E$NeC%qo)Ah^`e at DQ!h^#0F zW=ZMDdc1W$+0--rJofm5CU6=_cocYG at rQE6Dxp8giM!!r`?_Q1p;N$p;n(-i zCyd_}uk2A+l_gFPPo&rKM%Xw~w&8F3=>Ud#%iRfB<5%iHDc0a7GJqY^CI&r1yl3j* z3M^GtMrVO{rcqhh+LrZ5GY@%9{8|%Tx@>}tzFUQbH(;Vm4N!(xU{a<(lSfhnDPi4# zQ(@yuU$vHe!BuYL1slAATN&c#YRwgIa^)--Uy7BySH)zDRv?NZCssCuShK+m#=FHz z+r4$s+}2RhET=ujZYRg4Q*IJ^W5{%khe<#1K?J$-kqIk3P~WP;p|)~#h$zU+c)ZaP57vdNhV zfE{3e>g6)Kv-qhJAQi%!w3m8o{-HClX1mC4A5~q`Rh*j9{2=S*I&dDzi^tr(>>0_Jr|T34})qi93d-KK}y8A8kFsg$nXM>R>cI#5LVjKWQL6*q2uQDI z(i4O7DDec=)pKu?Y+G*hnl*sB=9NkQ0bBJc>=Jq0a3s(-o|KaMic at zInvzn)^@ba^ zW5ok#U^PdA(1dYn4zX&EVYx&)w)zS{@OLp4((VQ|g1U#Ih4rEX=r`nPM0fgz5g@}n zDHA$o at dnM9z99_$f+->$B=#XbL)#(BHNezHQsuuC)27)~2HJ>EBhGX_0*mj#@B5P9 zpMJwP(u6`)%Kr+^>l$*b!8LCaM&C;KT_LyH&qE_zIveX5wn$V=?wF{7w>t&s)Y27l z3+2GM5ARBfeJPK;)9&3Mv5mXW%&o*F=JV&HGWteLTLtpc{>_YsH4Jf{1_O2&&>Q at O z#1DUdCNmbS>?}g{8dP}^S4df)3@;geCr*`akCvEjvG- zq&@!KrYOU|7(XIcCZ^dk8V*-F9#VcUQm$@st(>uP>eD)9u)9 at Y_suAsA=5hZ&B4jN zccD9Q;@lnez)bP at i|{Mt3t0K at 2RG2P&($h$ARtW)ARwCmzbWV6(@T@)g$9ZS;vYRw z^nU12UeO|BF*smQZBhOF)ckqj#^0}&HXXD&nsV+|^@N%>J2x*A$^4BDAN-95iQe)G zA5A;&3Xe0EJRS+Q>|^5Wbw{}F&(m3HJDY7U)04+BJ-^=21bO@(bMcYB8F^R3+l*fs z8Fn)vz%&tSPyK&CfZ#vnVq$>ulJDk25aVOq20;{M@}CKDWh39Ra@Cf?YP=(wXw zM+k3~j{FQ!Bq71jAhfRvdr^;?8QV`yFp~N<94Q^K$whmSw``@C15aJ`h&|6nOzvs}LNh-> zXsLvN*|{yQpW2<7QrS=he_bK&vu7 z%XpCSI%++eWzo>aIDaLpBx-sb7Jm((^b at 6Qu=&yvC-eO9r&eav%@nyrrYC6n)=&i* zxgWpCszX2=+;5k|{qE#(Dv8frycABZON5nt76<*cdR9L(W{PV`$0th7`8N6;a1AP+ z?bkWdPELUoOwD%J5n`y{<*>{+S+7nO7`lVxS`;UcMZzg#Wo`Ghc*zaUq0wdHRP>hG zv5a&(X6*16RC5d8Cspl$zS1-UW5ev7>+s68Y<-)W+@&K z`cgMIdr|IV>v(C?mW6=HUC%D`6nNn`I-AgC-wEObL!g9^yvpN4F~bqp166^NUGc;I3MGhtuig1FT573HZ=zq&qdE%X41UwPL6}|qdxBWvx!E-N z5Pu#EneAv(kdu~9oIy8XC3$}e?6%XQW+j>N<~FN2Jv!d{No{Fc{A64)Zn{XCg+vTw zJiy3rDkncZFD-DqHSVx~VV4}XQP_v8fI-Efoetu`Qi88J;7{1-!5ThnhvlMlA`;!L z-avZJDOrrBVBXkc-jpgM*ytdhXoM35w`4et1G~lV&z!g(*~B$hh}wV3Oon$P at r zWAO{LS;TQvOjzSl3l=;XO(NwFh(a)>ShE|A8~@7OmI*i9>`|;WhAbkvW?*ixGNpMb z8>MsO4&_q at eaXDIJ?}FHQ&1t)qgu6KsI_9soH63=eXiAkvdeSzrm}HCk~h%!Fkn)Y*cf|idoQ5tdhj(RJ za?OF~6VF|V%7k45{Xy%*=jr=}Ruhu)3MPsZ_8!W9we!mG&s9$|o?|fUFFJ||@vl^V z|GeYsZwyq$P60&-(XW}0QWrr;zdQh%l7Y?vf-*nR5E6BvP>Cc6!H-F%BbjW4$9W6n zn?m3e1J3Us95k|F1>Le{5c!Llg@@;3a+0N?$M4T8lpz#@Y^o;X92`$HCwi0Sys=gU zg*NY!F&V&usdD%>GtWh at UD=LNG@79XJ$^H2D-KWYmMxoB+Sp7Klp3Bjj6+o0^x8#8P z^gL>A`GxrmF5r?HQUbM&ICjsJ+G9|mRZnTYE<@SlW;}mFZK$Mo&gREOsggb=BP>~k z5xhslb4DOZIe8USgwlAtW0E-~s$dLMkfeP4{M?<0zTZUz%9+|Y at X<{fwnk=Ir4FKn zKZVRsT!SFkd)NpmjI>9gLDT0Lp~br`M8`fs_FCsd7jm$E-^=uLMMKp#tG>-W+luK6ieFzDX2 zutY|C_yD>{$bd at avNC>WLX^kK${ zfEl?cI(@52ST^(JdPcsXXiKGL`1>Ix3@>KC(& zCwT*&$?99i7AcEwx742-jY?y)0m}2{e#7fpvq1LyJ$-W#)>%}Opx(*LE#Zs^pMN{% zWh{+0u>Sx85{LX(0sn8#{{OzzSH#TL_TNOU{~>Et-%wsqMAZvPF0RVU4cJFpgtimX z4);K;LTl0%qTdfLL7ZM>{71(n{N_7m`ZqWKE3jW6_dy`SchJFho+J`@y1V!D^fb54 zmCN&*RL}R at Cs;2dy0N85a)>T26zs at sm@g~|C&37qZsY+n{lgXwukO(*<;d`AN3o%9 zADn-wNe{J_%ze{uN~p^Py9V{9^SD)+DOv0bzd;}S*0Iij03guCcr&RIOY3SHJ%3%T zmWs7-I}O=1vKDI{Q(2XB{pMZH_3_MR%W+es^yA9M_<;gZPIFBF2fZUdnyWJv9|I!& zx{Pvem#wCAy}DjvGy)2zVzb*+<_d0L%|#z$2}3Lb<&lNACC%P=1l)YCt;i&Lg`~r< zpW9!>)wOv3$n2^pnT at R?K1*A-I1M(9jXL>w33uL7uIR*^vUt8R-vIX)c}N6mw6do@ zi;deMF9}RU^@(NsNIQszht&Mcj2yc>CJCD{d9l-e_{=(+L`n;szWv8>I)KwATvoH) zsso_rMc8%n93P&Ms_29mqJ}FN5^le#?gT*w_M*Beq1E>TEg at C;R&j{cT(yzKRsf+P zb^pzU8sGms14f$)ECy^EOuMpIkrB-w(XKV1#P{1bz_mPa+a~1etuZ4Hm04p|EG9XsYu*Qv)N#GK75tD2mata_tZU-F^Rj>td72v-zUhUR^fV0s+(eEG#=W zMGzBjQ}EEu5h3nuxBG#PEiVR$Z4b%Yn1JktPWTZFI?bOgbn=d^(UhM!ajY`F0lF^y zmRehY=pHz{4R9LGpL*oDOe6VwvSH$GQ(B!eE zXl;G#cU4jHmxE3?gBV2)Opo2A2^x$6vu}@|Pk%OU{#8Wa8b!t1GdE};M2Uzuv6AtW!wY0S+KbI&hUtCgZs5u-DTnu+rsJlFWGMByW zz_rzIR;PO6tJnk_7y)zq%AbRscBTQ>UXk-z7aKPOA?R-KWvZZh&BK#Fe?_XvsH1t+ zVwG;NpgEimpt^wL43OP$f14OZEC8 zNC$Z8DT>+786QERlbI_V3Jwp?gv^5-60T?!G$R+>B-_Bd7Xi4AH0!F!`qnG*F!ap* z)VX25*wX)*Q at BiOXX?iYH{wcnp!Q32Ehq+ks+0h72RAg?wJ*eu2a&Gtr;4W^Ni&$0 z at P#MJuil)E`jj-Sf$@1vqM1$q1F&YBuHF4!obyIA4>wwomAZhC#cxlU^crb>xe+$o z+3qL_^VN@<>C#n`)i4#AArio+*ZWwlt%R9n0(w4J7UTw#{Dex1O7QLO;(iu8H!zW% ze;ihr(F1{BotOZ6(lu at CiZ8s^C?$aJMuJzYb{=X?oV5arZT6a`%l6lHD{%(Q)sd;$JJ7?d)nR zj)9EqCDmf*9B1-|EFX#GwqgmED8z5lR4-sM7BrI|8pUXdvwwWS%+CK54%2PIkMN9! zSYmrvMH8wHBaA8qa8j(eVUALr)h4-q{jGTP{9+=)0R;m3hWb~oi~rw{{oetrZs3BV zhWclVbjrR(2gkAu9gP at VlHG0ryb#F*(#+e!8V&##-c&)1n31faZ`{ZSroW3SwV)K#P-nzgJy13kX&P^!AVs at _m4dkRv^Gd9L74`f4>zYtRI8wdAT{ zXgf!wxN-EJXrA#33)@C at 8n1}yRQnt#Lt&k%CZJ<7RvKJIDhZRA zt79B%7#c9NlJUgs(a8b`1nbDpAlqUZ+_n%8Qh`;D&NwFbz*_7ybE2>~j{+|VToVMK zbaTJ)w(X2hPc;{@_{S!P(H8|Sn%Z5?>S3&*oE9Cl=U}%2WMNg1JcGmeB-gU zS*??=+3}E)6wO9olJu~5B`MPBB~E2x;SOYk;VD$S?n{hys_iusb4A9Ip;TI|(`1h9 zgvW}j<9vr)j1;SQhDAf8f6_Rpz1aco=m$HG?y)iMqGGih?BAG;Iy&j3*G)2r at M!tv z7Lpr~*|B;Z$qWO*E&yINNFpsKgC^NTn4D!yx~J5u(rtU(-a|$BufNz-*sqFJ_9_6U zJ$2DVT1Fy651v9pM6%H3l2zZdS=p%?PRLSu at 7+Q1K?s=0LcXeZMAhZ306HjwvRBL% zEcnMoogoV0a~0dNStWHPq~>zr|HaumhF98c+oDxb1v3 at fwr$(CZ9Az{G-KPg?WE$Q zV%xT at Ti;%5pR?C@?!9}j^JD&af6nJ=z4z8e>tnRg at +SZb@Yu{D`K7^5w^Se?aq!fe z@vtH(8nqZzTUciLUmg5#*f`xJX@{?5rj0!Hjc|Sud0Sg+0gpJ90NO>`+6d* zB(0foQWGUoDqfEQw7LqmmTFNW+YsN4Ig6~!GbFk0uOaN6Y-C4;zYQ52hC(m}#kD!o zSd|*I3UxwMMWlSgW151m*cxDV>3Q* zG&3SUeh#b1tPV`!=IQZ)zdE6vnZuoxz at _KtL6U`tHLtlnb5{zAE?f{az#LyF4R^Z| zjPeZMAO$N;dH3rL55iZ at -w_SF+4H=^-=y((M{gfr=Fp!R?h(x0quM37Pd0j(5iv#Q z%820Zx}Q2*o1)bQm4>*-ZG8p4vb%p%+ at liib?d{igNyIh?-nrZ7Bcb0pZMq}e1$Q2 zXh!R?xRDTnvXGAVb$F3t3ecF*DPR#&7Ir at yA}ir|IqdHcCzI$ZY~4a>UJ2uXpnS{2 za|)I1B{b9YgsbqK-lYj8W6g7qtVtE?jAG-iUh#;0 at qm40;R>kVNE<-VjE-&IMeZ5x zkB#lSKBAYM#${Lz58(a$+w&`I=G`t0e_D+;%$F|=|KnC;XYFER`@iysl~z^ZKccLO zRuNL{r37b}3V|;mDa6EuEHZ*n7V9Ze^dv!dh|A=n_)^Mo63-$&$3mP+kh8LMa_7>% z%Eey9B25Cb4vdXMoL;VvXFm?P+QmLzv$K6c?QvWIeJyxHkV!3fKlykO6vBx7CwHEZ z;daT5H2Nj687dsdF&DYRjBpakS%tkP64SjuQeM4#inZQqX?8+G=rCyK0F}#AQZG?A zIG|Jv!YJ#k(Uf81Q_V-{$=*TAGcE(#bH<~J)IhEMv}y7=*!(IAa6~MiY(NnOOM8ue z+RZdjdp^P0EP+s{B5%QE*)|Qjud~W<%&r2B4K*AqeSmBBu=jqcy(}@yAmxY>RgaY7L7~l!4B)ZlC8_o|f50g{tK&hxZm2 zw5(p3!r?qatOE{SnmK1XsZ8O~66hhN#UClOL1Fa>6M4qT>t*r|Ji z6jDv4Xk|$@zgg0U?=4J1)FO&BlyFPlrjRP*GY?=$h-2ffzIVmiLnV`F_oyJqVc2#F zNZqg-AsQ=-%n^@maVGxeI3PLWkG%r8KwTQi_E&)=wm(#3O)BlGO0u0Ll*J2|)mKO? z^>u;4!a{KZpyJtMu4trzZ&vt4La+rgU?eyIawX0zz~#C#n?#6HtEv(;6%Uut;)rH) zvd{zHnq;Kt?164z$b at qqmmI`2MeV#L;A9A9jWdjEHoX at CZp7jEDv_Naqc37VQ zR+Ua&Z^Wr(WfTRKX0}e<3FG7a%Y~ z9q~PUb7T7M>BL_bUtT?`PXiu#5Wa7joo}B8S+6dT at a6BBSntPr&+z>U-VpUIMmNArz9~NP zS!-QQEaf9`>=gp_iPei;g5IanGFU9`b_@&G&fx6%LS}pe7C^%Z;Vy3wHerG(B>1(y zHv*LLkn~o7)&sv)nONc%eCAg&^1Ux^7TPyI+dpo*KE?Jf<6MKC-QFeJc68VCzJ$}tmaza4Do0lOTs)YVW3^3M&=hpPx-DX%m8Mea3huGXlHq9egDR` zuoLBNG5<()GRXh#y50ZL0!3_{9XjEgn+2j3Th?@enk*K z{yo6|HFpW`h6*+nkyIvySmafe6ZGh*@7q-__M?`Lej%asZS)wTm`VuJMx_49Df=r_w&}YoR$p&HP|^F920~UB%$B+5y6EXs zbLV+xGTk+QVL`|TTBoIDG9V94V*{5fEE5$)Mkz5h!~W>?IC_ALi;`4RrSe0ff9?QN zk^*gNd6AWxV;WX=2H6_;`rNt*(4$lWz!7T(X;L8+nafn3zT(=dJY`Lnmdj;T8WyW& zo!R|52yX{8sNxWdRh? zCNn^@+CNK3^6)skAj;t}K>k|9&Bnnp8{&+0D0`GNYbp4sGog>7N~mCx@}Uf!Wjm%|ppH#IbD< zL{wOUZPTDYHf_#ib8y}->06a4+qo&rxjHtdA%rmU8V5 at FV3SE?uMyEOX|A`nXe(Uj zvHlEi2pnE5iMV~BY~{~r0FRqB8Ze5J3U^kGzo1$$r#w8H_$M(ARbAlGW;nUdu}^^w z;ZOXLiM=Hbb;m1gzdbjw?pTVD*E{P%ez2rzxwc^!e~+KR#NSS+1Ge-+3Hl*pKriF= zy3B6?XMkL$hBtnyPB2=0 at 6NB?j=L%u$D=+yk~In?>g5GbyQWgFv7MoHtxve_$d_n2-hR2uIN8W6=%k}lYuJVDD7_z{^J_3$fs`Jh9L*oR* zHHPA%z5&vf9Ei%x at _Xs)5#0Oyy7$Acaz?-dG#-6$ZQW&&uR{z9r(q#n`5<3#n at 6z0 zcww`K+IxQ>04D at SkKNZeM-+)7Sr**}IQ!}isezuQ<1s6co*4wI_C6n;>_=Df&x~WN z{#Cn;nNx|MMD!%d17Cpi>~X4zGqPuVhWakR=XmIEUPF|%EmUz_%ZGyBuH`6F406@! zSX?usqj-?3%QmioQZ$ z)H>9FKXdJiD8 ziCW__Mt(TxW=5^%W`_V#FF`4)3zLK38XIjSi%iV1kD3_Jx?lq`AR2SbsieJvJKy*c z90OQ%q*f+Ex<}yBAkk(1N~PXyT`U8Huv%+euK$%uo$Te={rPkQ`wJU)FLuZV7L&B! zR#8MHe||1zAOUExHcbzzB%(7wEz|?mp}W}pX7iEcrvYevO2oo2PBZ5cXzoG+7U;t*;*e|giWZXXb`Fh;lh z7Ikj3l1ueLrmt!|Aa6P1jQ8x&(%fSNv3}!&+r-Tk#=eZEM52FJE)SLe&hY5!JES8+ zvUFC###t$9R$t5LB0v%3AZ}3B_+a%KsdG6{rPhp?!Tt>EHq^YUJFGIs1Q2(l zJXHR13;8g&!9uK2#D9G(wH~(Smf&5anGdSNDX6y^wln2w`1|aWaz%6s2Ipf5C6fHJ z(p8lGggmbxKLQ*F{3ziRgVSz|fq%$l4PMesh5AIjmj~q$19c*2h~Ck%k}?ScC|9cX z5CU}ISl`3N!{!(k#gscKI%nq&i+I-XY|bk7RoL#=4S3gt+bmM|fIaPeQs zEoxmL~7xSm`7N3Xhfg(BHy`adbtGiAiARnMtH1Lfl9qk?a!y zp|D8E2pn{aEIQa^(iHD at eN2tqApex?b6#6E!7FRBC z?|(8ZFICJSIE>O3Uwv?+9R2nN_P0A6{(>Q at e^g)$%)fI+`X6xq-x=$w|HxRsh%=5q zZ-SC9F>IVKf=86hsWyin_=1Tgsb!w<(iUj7mS)Y^o(??=_hR=l0OvC3PsDW6Jn`3_ z=(1(mp=#Fll)Bq#<7MmBwat3i7E>6$4zHS6g)u(qr* z>7Ap|7=4X;fn{_DwNJZs#d^{T+1cv;wvRR at xpyt z?y^lh6S7dxnB5wkH8KoVVsEcAUw_JbrEQ at Z`rx0UiuPEaItK at iNV6x8KnoQtt&xt8 z)Y)Efoe!e2WwHQs9qY^HsnSZrYuPXm^2jyy==;W?;zb3;0;bw4g`Rpx&7$Qo_E9Y67+c at s0Jp!##~IvWvW<{FZYp;Pf19phS+BvK ziT%+9SE}E&d%=NzE&)A2XKzSq$BZ{S5%J08Lyu}#O}?S1FyMl+niE4BwS|YS+CFcY z#=5C%<)Bo5UsT(nv`;gw-~gi*SU?4sB at 2%#tFk*V at fIT4I2=}p3|dv;^u|ztKBhlt zNY-rpO+)2l1iYAOH?SKt8vCOQS5Z|jj(J60ib*;}+6>ehJkzlAU$Z98>h*sBenB6NcUcMgS!pj_c*;LGTJg zxW5LIF^Y at dCP5T>PV{iaK`4hX!gCvnY(UEbp9l!Ho^yE|&O;X(gxYu1w^`G}y6qcN zh?ZPKx&cEl{6Y$LUmfG*74jL{e=-L%d`1EMp2J>N^k8p^XW5L8Br)O$rsHhDEs)0+ z$*n*lu>g2KkL6@!+?H?x*C}kZYPm4+8Xt8PtcgpT<#Qopm2Z!^iLFgjdSf7UO#)kMpQ9&PD?Et**d2Rs+w_R1#^n}5cx<+m?ic>nD_^?wpagTH1kk6lDkA_!<8K0ae+4XlCm*H{_k zZ%1QO_%NY(?H48q&NLQWpnSic+?WLj(w;!y6b4`07`{PbXw7!D-%hk2cD-J-cYnS; zf#V0U5s-_M9}P-F^0=4iqdGyyr6k8H;&0dbgHu!XYsOs*4>AVqonzQClk8Fm`7W at Q zqgY9CE!A)zng at FUEGOz(;#pW0_i6hab(^V1{tD{KBCa>oVoo7l?A%M+H5UV~G`~3_ z5wlSIjh?h!$!KhN&N(vRhT*T#-jDHe102{?r4qS#at8W!R9YQW9iZ>{;sCn-G9V4byEg+H zsF8e&A!sm4pcyacB<`{Y=TRCin%qt8eRVcq>y(7+lQ&8&)!5%_-{BRJdirqjqG-#? zKh~8M?ve87yLZHOW1e(nWcw}vmV36OB6gS#95&qSRvr%(3AFx)ue!0bk)@*;+rxxH z*-QCSTeicYJFKpBji`ZfN_m0*o8Bp)FK4C#qjwt^A%jwVrOBRF;BVJ#j*hx2N!X|8 z6~|b@{q55U1fV0 at _iSI$DnB87jPB3y={o=N73Eb~>RuWqzw+uRg+=F(wlU4av1?ru zMtrC`cb_t`j7*)-3wg*nTp1`Fe)2<*w5muESlW1pX|{2?EIUNISvoqbverRte at A z_{b?H$=gq1BA02eI|zHe4%!PlA3G1heoqR4wA^s$@zpp?=(z4mQ}EK-%CtdH>E~T$ zL*A7D_Ln!vK%Q{jG$r|08GUfKLip#D0V1%Eza8{iar@}!{3)Gjh%aBb|F28uKMy(n z3u$HKztVwHT?(5TM-yg~7zQaaO(P#g17-5dStmOwXR#Az%Z~$X<8nk@4!f+Uc}+u at r;l8GD3yl!4BI<@5gU at 3|Dlv}Gj+fsM;k7nI*381VwW5B=f^ z=%gVP8CSFn6JSk#uR|bQ)v7mEVLAtU|KXY*=us_^QtYD&dO=u6x0tRR0ngBr5j%eYr2g6y^DD4uX%q at Z$9QgJa-zZ1nIh9D#!>JGCR z(h{*K+z~|uf~yGoX+u_r-$!Vy45ln1tsf^l3cey at Er4(h$%3$&f|?VyWKh(3>)NBZ zIF?YPMUg0h-8NZIYKZ270BcU at d=`p6&`b!3sYFI*P?<|+`YP;PJtPaBu`b5ZaBZ!9cQbki_MrE<2#n45o^n&(yL9t$!FMwx6fAf`(g0_^j zZ`tB7oyl?>qO+adxL`c#Jb^}N-ZJPLuaE2yagpUh+v>6+P}et3nHr)4QTWoZewCLB z9OQhhFVjX0jl#1QZi&wv2c1ZN&>XfT^#DaeyiIyPzDxI=A4HSD;g{?gQBE797HMc7rjlE0dVH zQ~m=flZ};z-FcZ9e-?3Dkv28yfY~ap;j$e5UKD~?=+h2G3KFrX+>`_EFhbm0EiCbV zix)Crn{%TOSz_lCqG)9p-I0KU-!|@oN4ouuE*{tuRX-Le__i#CVKVVnpX4*t>FmI^ zt`XNV^z{1lYkeOk457$@z|DW+^;}B_(+k|M7U$$R>RjLiH)5tm9bc}TH3vT}96}CaOHT8E21~jQ687I~7=;7JegR5GeiCtLCZxVR9 z-7NtH$Hmt;m_sFMgZbCpe=|93wt$g1pkKZK{@WLu{Y_TetaqJ zJ|ipo&*bmGd;d5*W&5%_95fxK at F6aOZ%7^C8W9{jC=3?wj^2Ze>tK_%itBV9`V- at 8 zJz&~rAf!A=fikVGwbDmlpHZm3J)i5k;b$>GAKqkk?hIVW0ejpaWvoP%L8Yd`Ketev zMw1k(Z%Ubs#cuWYc2OK#!xPY@#=PypK-Fn?mkErsJiU!;h at OT81fR?ikPB|5m0!lx zR$7 at 9<}v;th{4I2REEwmu<+b&2e at WMFT%{ZrM#$u;927Ww*_;UOBWDuN^TSa(o)1O zt2`toKdT%z9Bf2f)Dn2AJ2fcd;||Da;u}INCJS zr`K?-wED3RM1-d)@?aN*owtKRz^S3t5wD at E!G{Sq^fmZ_LscQ_18E`6+^#rS%4S4T zqcIiTT)?||4)eSQOAuCz3tq`+;@49}M;9WID~HLxV!G>29bV^z70>TsOVu5VkPc^M z9L0A=4f!X8#BuIC4h>|;D)ZPU))BuJPq|(jf%&J-z);MbUzwjZZPWHH^%sm;@v}k z{Vj<)N&kb}><{N|1OM`c{r{@y{!^%4{zIr@(NJZklZSkFv7EOdH-R(&Vq029 at l6WmT>z?_C!+{s+8-3k1loCK*%WScE?(vx6h!)>Nk&WD)$@iA)00fhE8(ZI2i_q zm^W7+*lJj*yy>*T;i}h?)p>rVWeIdF7O&pCwfYf^M_=H!R&^QjL;N7fH-;5+{$A9{ zCw`bIA9?b+{b6(gS4GtQwxUfd7BaI*KB_~>jYt8B+gTXiHp7ApHZn5 at uj$!I&6Vu6 z7(6^qd^l0*q1t z7PkE0TtKINFN_AnU&yDrYCCvaMB|k9l;&|l$?f0~tjvU2zQe^5IOPc=AMxeR$_4H_ zI<}Ha&Sdt0bLwh@=@R9}l-~4`)!e)hAmXVgMrC1=5L|Nd_ETM$S zq!u3>m`jhK6kxbm0}UO{AF<%oeavqL##usjqwmA_g)d5 z1d4a5PWTS?TLfRfG{y!Lo#44miQeORto7QkZ1@#UF<;EE`O9PQ6@(%7bF@|Ui0Vp} ztIphG{VRAO7KXXJ{(v_g{NLDM|1aSE&tRtiA{DLw>2F+sgX^(M4CfV%Fe9KM@;&7y zU{xGz&bShOkn))m>N8(|ODPHM?%6cpZdP4RFki0AYCp`l<$lcY^5pyB`}ma~r at 3x; zrw#;s){uoLzaVBFrGTMa|GOHpa?WVU?-B;U>qgVI?bRV*On*2~?u?(vyUoU9{iNv7 zhO^`Lue((OSS(J&#*l4f4$%_F~Y?U#t55A}-^QX_K-B#hW z$loO^LxfR0B1*`&%EGXfEngJ8s^&3rcDQLF)2tX#m8o~yBCr6B`Ed*pc$$R~=>Vf( zWlWdgB0GlVlJ5X1<|fTJX3IPa4Q|K=&&Z8}V5rUT8@}EM+h(+|k|vyx>of`U-!XXR zpe(#nY at qnLx!VaIek zipDHuXv$(?nw-H7f)i8sUaawjo_UjS{|e`C4Fn{Le^j99zq9D}2hRV+->~{41kr!U z+NQ75!X^u%lvlC_#eDHg(nRhjM2mzi1jj7YO}3BFieDeQCgtzu`$X)*8TZ>OZTNnL5cq7qwxzh1$(f`v{vj at mp?JD zd`(!KKb(VKbN1jF_~

k8&SZ8C?(bs(VmzqSqZTf zDZIdnc5$U=zke at 7Ip!iJWmzISBNJlEHTDYn8jqKS$-%;A58}KdZoVwV-LnqK*d&Gc`}^IE>O&Zq*9&Y6 z?)mxZ>Kr=mI*kHp9Cat5xUv}1!Z^Q!qlVGXCxRj%72fKPi at TYXj%+L?3E|*wt%7)% zXkqX0a&zJ_bHU~8jZwt80Yrg6Xw at Cf;D#p8scKL}IMP-X39FcagKq6eOLOV4M2;nE zE?E*?Yf-2|7Bnw=&VYiwQ(x7{zRyRfR0rP^(28oJgpzZ`!Y*epBJj72R+OoQvIbgI z=LCf2;7wGzh6Z`-I;DjTeCMbqXjnw;ZmiJSZR at EjxE8?>W at MwMcV=y+B5y4>&_Rf` z!E0bZmkq8U!`Y1y|CQJo3{8B4!=oP5>{GEA-L{&ujr%CGq{mbssxr|-X02hJgV3ZK zgsgpl!*KhGrZeQY`{xU2rcn;yuUhG}Lt4Q~lfV|naBxVm05dA8WP})^6;O!cytjXJ z!RRujYO!w at 6d@wpLpp%0_m*tCrx9at=QaS6jUpma8je;{#>TKmsStAMV!NlGL|OV| zoF#IEUP3c*rc^Ysp-p{{Ia%-DmuV9vY(fXpSRBJJ>Xk!E)(p6 at qKiKd`{y82jp>mg zF=w>`O$fcq^9p^5Y8r8dpIe!+OR}dx)0{PxV-i)!R+%=Y<2DF%hJ(ObOrlowvX#oq zbr|}jFs9W#-qs2SCGvg6e(vwF4a=`yi#XGwWsx#@BHL7i83qZVK!#Zen(fZBk_&%5 z%u*m&1&$|3kC=~=gNlqHgL?(ig)h*L_1LEI<8Blt1Zp*V_>(f2S^`4bY$^3*#p)ul zgwz-2Ij`+1QlVxl?*(1dN)()s8iBJLj;!hujY`~GR5)_UZjsL;=UAHZ>SjR9e9`W= z at JyNyBZpN;Den}Ko{EuqCyJTI3bt&vK)Z+|&N5)DEF*N$(M|BMt}5;b zkrT-iBR+ at 3LseNPGf!2v&6%!C>U2M}4H=(v6EZM3uj`-1EQ!!&d{yJSd9ybf=`qj~ z%()ss+fYRZZLds#xnu434T<5iuJk4CV}ci}kRr+}RF-V9AyoYmuG}`gRKd)-kG54< zW*yLm&_?SsGQG0+Ru7YTk1CuKfhfyN?_6}09cuCU23w;I)DsdJd@ zf_a&6jt>Cf-G+QI%?^Bnx6n-fz}qF>t8L3j+_7PzV4NO=!%#|0F^mq;c*~8tZVPeI z at P#n$)-Xl)%VD-LW+>{p+|5Vm${50XIQFWUz9H}s4Vmwo!rP at aVAoE#bMqVwaGP8W z=wbFs at eJ_jq&C2RnsNZkk7E>SJ0RvJAF#l30PMvd5PR1Lfw at P9#SL{Ks+qvDWn<(- z$Y6o8Ir9|CHPxDSCmAqCyG`6lzM%+x4qAas{jgzzA1GpmIcSU`k~Fv-*kR at d>?IzM zwnr+UsgsWnHeEn1^p0~x8Z+GpLRHNkj-Py?3^l)c+}UBi9sy$F1tTY`UTLws6uEib zumXwusx~5(8Lsx8q zr)=AWNMs2N$caeaAGZLoK7(CMlR&CE&j#Cjk(Hp*v~IGWL+;@(HI at qAg48cfIw=Es z^$0GfBUY1-R*^ms5JSx|xbSpDnoo3gtfkM8C=naKS>Alfti+tXw)ee9+aYge%|zo@ zSOtSyht9ZfnYpsoj(TQY0FSC=fB3~9T8s0P=ETmCE?J?3!U at 4PxN$@bWNU3vw9@$U zS4iE#S6WP3R+6VYmY;%p&n!G*vpRmZ{wq{xX zbv6aqb?(J-+7&3x>~mXU&pz`x%-4c#RJtoX4L+g+{~F%)8rf6x^zAzJ%J#u$^3Dfi z9l_^<)f_uNtK|Uno1zc;`a``xFtwi(mI&SdyNAF!4h(o!T>g4b^>qB-! za!|TD*}r2ru*rmDBwMdlq;r%>U&N^CdiBqhJmaJCuEwO6U&YD+$3M zaj;RL}>?FT9``W-g?d7J5ywS-hw zUmo&eXmFsh^^CRTjJ6(>mlK9E)WU48oFrB)x7311JeEK=RQmx5f=vUbsp5 zy8I~pFZZ?0$SG)?2^@mWqi;}y9$AiC?&|FZ+Moj=*O z%|S(vf0-+ at iQfp6pfF0; zFRW6UIy%!@X$AH at 2bmj6f0rp1|E;S zswI1h^O#sFgmXzGzJDYie>^(tF5lfAHW%av%V4H_b8Z;KcLez>Y~6GG at Yq_p*H$mlZZX!(RYJyWR; zAJN{sWZ%1B-#wnI_PR1suhTo|Pj?8IWYNn4{r}tN7dxl8|Y+GAXFu%^sJ9(cf z_xJU;Vd!3>q~H~<`+(YV!0=x^Pem{*XW@(Iv?CQ-CWKgZCa8s0I0>JL68s=*v5w&o z#X|K}Z+W)={U^$rzA&?o5j!Kl8WLSt72e+i&z!u9Fj zO#{BM=rBXfVS&1aG)ap*VrmfaL=WG%Bk3%@hat}OyoWOP#d)H7zsWvit{G6)q#d-$ zT)c`V52Ti z;dvu=KCZm`i{|VCQFe1)d=X>)rgviDI at JYi%qZzhdC5qS)41<|y6>>r?T640=ADs- zexUZu*jKpm!0tvWIevZItg7$7EGaB~Fm3-3Z3oQX*i`?~3&_0 at dsyA&flrYOr0IdL zEEy}W at x)P+#%JOFHeH7QsTfxm0q7+m3Q;!>Wz-)2+z_m$3!{&M$urHK>oq!w=AW8c z(`WU${!=)_SutXO903xmFt$tvoDFX zZ;X(f%e16Rx;(H3GSs3{{hQ4*K)61&<{VXE3I2Ow%kY|?V5AQHq5BibJu6VL=dsS} z0q54YyQVK&mAgA1JYX60qm0+I8CU#UY2(N&6B;O at nbo! z4V>oI=F<2;^(f~$z#b~p;~DGAC3YhQTqFej2dvjL-a6KuMO078-yXE`t!2wfZOP&_PlMc=$)M! zj9S#JmAAxDc!8qpsmTQ%0T#uD9vR|BEQIuf2Llp6QI3}x7<(d5Ez1P$s&L_B?K z+6)b%)J-mPQCEQ>iAxZ}SR2YSwT5WK!BaNVs7GlQ+AE0{6{c1bbZ33hc4F?wD6Web z7xYm)z6PR8We~+B<1A zXynOrgn@%5P{Kxf>rYdub)TvrCfZ{uRI}<5%1dJbcPv5t#PT}gX*KRuV_Swo8FBks zax`+XB1HUVpC>@fU9?&IRV>o9Fgy;$YdbFfA9k#|Gy zbV6O?Tc`B~lpT)b>pG3LXvejwi7oseR3iJ#C<^90i+Vig8PY-?*cDc{R8tn;JH at q(C3 zr;UvvK)P(5VUgL&b5Hc@@E+gKp2tkLJ_FYJO?&M5uBjejb#N}L<7MiEsKs2i$WUN5_gd?*8m*IF zoq0;a&Q80sDms?Mm-Z6N2P&8BUmnuop?aL2-Vnu?m>;+x6mJXhza~8t(RrIk45o0N5>7Q_|LXx}@)2SXES*+T~xg zps1`e%&4y?l4!@-H{;E at iRRc6f-)QRKp;4=lq<1oUH8!@muO z)pH15=#gf9 at b4q&d$?vh;e+A%mkBzt!fOw;^_@|z1I{x0l!!Czg_+*`5~mLXF#>W{bMEGKx3`ZxcFLDkADV+OW33jU9^!ael;p41|S=Fw%^z1{g+04q;bQ zxS~@ZITpR7D$7Ju3Kjlz6q<*`duruZ)K`Lv+$+oxO;?mc3d;P>()aWEW6n>neQ4j$ z`!_s*mjiWxXEga8O0<>DK(GawC^IRRGRvtbGp!7nipGirfif(1Yj9R*Dn#4Hr^(D~huU(5;Q(D at mBD z^sA-X at q=-qm^>ub6nUwfNlr9~4bmxnSYTCFDvyWi?(8{oC^`9Um4}B67>Y>gYq(im zcoUO)tLZtkcAArmSN6c_?K+9cX)*kzwC;pvso-oqS-Xx{u*fC at tys;l!r81 zp1^lT_jM+waepqW6Is(ky)Abw9YMxr3 at MU|pH2J~vyQI&eo(Y0LRp3VC_xucwdaH( zU9&zH5fvbz723^ybiyAq%B|W5%m#`KGZ*SP*i8B_#jP2ou=YJ`;8t6ck~^{5yG;t2 zqGqB=Dq$EfiA`z%7s9R(%?!OF-ViKsg1 at Xc)B!79NDzRH4asotems|84e1qYpXC!rR0M%1cW3)D#= z&KYf*4&D}iDX&^AN^%*A9QFBkg%6V#xq9U%DNJ2rFm8Vw9HmI~2S8?K2;kXK(!-b< zTHV#U6`r^28BZtSaTKd;-|H&{GT+%tWQ2V{^Dq9WY?%0QnIS^Nzzm`d>H zKN%w5#3NveD-ZmPnmvQgNub~&KFB#Rc5{fuRK(&|i}vvbU6-6?T=2efx+1=+0(Jf5 zIZPnB6NKy?V167Jv7pcW>uEforCh&?3h|61{yE91tavp&MeQ8gGB}n?D5s(!WzKa{ zAQm+*PWs_GM|USS1b7~U0oh0NFg&Iv8=$Igup&wwC(3^6IVq*3Nps%8l!&JxvM-DEvv)V0?w`Zm{BTnpbY=7Ywpf7rU=lHZK@;s3%aMhII*Z$*4jY!-bJ3mj#YA zZ`n_%p9I!Tz#3tUT%$)aYa9v7Cu)CPU%VLR`x3ah$JcVwS^y^xh1oY`n{y4{Z~?cx zt~*@#8j9vyvQK1bZPEu^Wx5y6%J;5Y4D)k at GC;FNH}4n=u3P-qi^MS^HBIs~()kQT zWz%*55y!MIlYi_ilmN|eG~1v{ITmc4ZDK)svE)P`&@7v#9TDD^p&ls~{=JQB`UmA# z1#z#8Gn_GTuD%3L3O}x9Ux%uANGn8^mfdyMI45vR!cn1YA92-fY?E#5q(Lx%e97~^ zSy9j}n=A{(CU&ncs*><8pI^#n;w`_3;W&hrCD-;fc(M}xl?R-rhHge zdH)K(i-mWa?B@$2?l#+ZD1qm#I2O at je zk_M3Iml!gXt-yNOw)175h)*CCzX<&=P+tUIagn%k{clCQ+i5wnteHVc4qppb*PH3b z?ays6;X$K1QV4paQ5zQ?d z%h;2RSruQ=z~Sni3h8>cSdEWBd%H6^-7N+OGv`@5i_ypvgpXNrbm0Crl}>yv1-tvGvoHDEGo1=d*X&6mwdGBk}h##&45cY*`iK`E*R^pK{n8m zm12dTi@}nj9lWdySSDf;<7I+rRz2B!&p2e zgtUX8ihHmsi*HP&ntEZG3SAA^oGulTkwroG8qT9B^4nP7xH^a_=juM<7_pLa`0L(C zU`!t#9;5xyp~pg#l{k4=x2_(YKdYQ>tzA%7V%08xu!+`P+dVE>XXd-wKow?pfxZum zSYhx^;~Cv1RZ%uPR(E>CKxnsJXuh-$4^}@!`r)@4x8ZE1ti&j=Uy&oloP+DpHDBrW z5yfooAe2&yXsO`W-S(XM8}K?a;A)<+Aau&7YK8IDIhF-cS7B9w;QKAhtO at _1kAQq5HfVqfV+gT+q3aH>5bq)~CTiU< z8h4-p=Jx0em?N?;*&ZtoDM#HGK}XoeEb-nXh~kuUnU(n;Uv*Wi0ZFmC$;ap)!GUwh z>^<4wkpsU%AN67ShOm-gq`1JPvxAvyc&Hxl7rn0s^*8-&f^lF02-fK>>$awge9hWt zl@}5;mXzrWGT9=O*~e63LGIBLyFKqBnX>x>Z#j@?1qyebR{;K2wpj%<^uSeOH9DRZ z*nGa&P}?-P#^S2FUKLRs|Hy9+ at Sb;a3ENJFHYH2Df{c0~gV8DsA7%Cvn@ zVoXHH*g-Wtk_ at G~lT2-4xzxh3*_^cW`8ZOI;=k#k3rOb zMj&I#1v!r;^#fO_ir(OD4&tx~!Kf0Pam59JZ=_?RH{m%To>DJ_c<+=pmAvTrHXP4Y zAG}TD^z4jHkIZpgrI7(uR~5DNBOB8xmYHwp-Gs(Cict at ykZ{yvpuHbsOA{o6_E0C# zbYa3p=c at W4hXp_6v?;jH?L(p8F9zt*hmrwb(Ew9EWZMUHN)h-L&K)#tZoHRicg*GH zlIhjO at c~^z{E`dJQMz%ARx&mxu&aLXfJ_7AG?|~^k(pvHajEu{5zU;0I71fK5u zOUgagq`eOeexLg5{ohDG7k|tJ3xNOtrosNxOri2W4lXvP&h~cyO8)=!VNf%)`4{Rk zCwWV5Spg;VcQ!yynv;scT}TiYtRN6d1X0#w9;OSr&uP`qA3&TtPz%caQ7_=-( z3_71bys6I44$BY>QfO9fi~QbiUCY+b`{yOQzX#2w!XIT}_(-l&#YM&-Z7x`I)pRO5 z>ND8(t@;|OCSvJy;sJsAk$-2ThFkX2LGrl8ju`n}_;pgW`1$ zgU(8Vwv+4mn*i7wtvRAHv-hoPGiboN*(<6?51!PdjyqQPa4H!EBNd&shcz2Ckb4J@ zq8m=Lp~vwu$%>;66q~H!Y1#w6r|rli5yNP&$xLO)@aR~))Gcc~2|gZDr;rQ!Fj{w8 zZD3WOsi?2c=k&2PMqiV;QzKenuoGC6{0a>Q2XJGm8?5#)QDAk30wc+R!*e?20UPzz z5!Hnp_|{kdn{`iY#;ow9F$7a`%Qc1gO(}by at A9>>&)5E|M)dUjy#Ogc=t}AvCea)* z%%@0AV4vhyWwoO8g7P$90m>O~@e}HpMvQ!Oe$jnc$NGqU1V{{7S7Qiszy#8#1Yzr< zb1nNy at 7Tsij3V>uE=re{MRpUjmxS-^$(MPw{0*YA5=X32WlrI%rQ+;B=yr+&)5v?R z(jY7-D at P{c3gR#`q*YQKJM+JrnqK543!gMuJ#?BO?Pq!8K9T-n;t2- zYh2Vf4)5nAbl~a}e~V3Oq||zwaUY&Ngx5xuiVf*hFELr5)iQ%YB3_?AolG+7vMMoG8R zV5>LU)SBJn_);vLmUs}xpf|0DkUp>e(B8iC5~2UJ`E+D zuxfVD73oVj=^E&#oxob|${eLxc9#&UvQfb{)e7d-+cvT3FvcgEG3&}EyY}9YjV at BJ3h{KD^g;!N}v1~4f5LG2Z`MX+KZV6UakYm zho)?|2H)4x)EMz~>eZKSk019mcu%Z)n*>g*){fTzh|7FD23a4MiN$gkxn-pfqmzo_ z#fEVnJ!0Ho at cfcwO+S}ZgbWh__};JPC%eZ zFU3fS4vK_}>~vBYO~cDsNN7JBuaLe*X3iR>4-O_0}g%>Gcg% zCM8(k^U*#gh5`*OH82?yMMT8PfB6NB(nXGPfj|A_T-=C=r)x2V1z+=`Qz(1487f~+ ziG)#SLH}TCa8S8owSlvbL4yLSr)5If)m!r@^4(o>OuL+JXQdJsw(sTq>{i9vLzgnY z)oKl071HPB=JF`#6`Vx0HqH?tqdB;WUMio-lGjjz1|tIHr}0g{=_Mn(GL=UqWE4?7 z?HVjki`91=%eg=@&*gdQoKR9}sEthGz_*so&9o{qYCj2#4SGw7-Fa(_?PdYJTDiC0 zp1)_aE566Z?Hie4*!gLb(Xc^ipAYv#bytru2aFK72Tpyme)-ckvl9r9*To#F at 3zUK0-#-FZ5Ovj>voTUzBrA$1jYCLwz7QO;aELX}pO2gkiSmx`CmsuBjtz z9NZz~VN|>(UmMR6uRox=>tJT}#N{Q^+S-yL&bw%lFHG-*avldcSeKSKIP?fRA$# zPi!gYH#g=LW<_L0NNwLTz)s2LF(HuH;lD~14C6u|slU8{MrfZ{kR%4(IPKed;5<>l zorb?XVd3O=j2P#ZLtBTttF5eB zAkHa$RPoF at I@668{??~8dbVo3K}-zS9P%f0MVud=j_0gSx4x4~XOaz8U5 zVrTac6?z8ppDMAc(?3eFioLS)Kixb3&Baq$`=3aQpVHS<(dIxRchHp7t-v*K2*?T} zsm#QAp+bA%u2jM;%qH%U;l1M^3!n(H9{|7P`)SwsO*Sm^Ca2k4&bC<}u5gH|pNdwL>m~9p{$0u1w));Y^496C=z3NmwrfM~;%Inr-tM^=KD{V=n z-don at E_A4k%BoB_i5n2vxpCIeDMHKbz1KhmiVk((f&NxZF=?sLOzEDv at 7T0pT^P&A z&scE0A)Nxp;kb at VrwvCpxLAs*&HNG#Gl^uCBmiSn!XB$KpM6jl-~A*~eMQ*GnF^qf z*3n=-6hg>7ud0|S0f|r(0a_4|LZ#NL_pygP}yCWbLSOG<=!7WHxo>ocse@$ff7yc|clh zilHYvajS)w$p?+#!1*jCsu@<<=yWYCC5%1?2mPKkQf3y~PLG`Wve@ZebWGb(e$q2lvoiuAxB#YSBs-cUvo$-Y3IYxRjnSvKM1CI_fiiCan|eB!x3 zo65(aMkawTUAp`_QH5C7Tz?G`T!Wf1c$L#z|D;J~HVvB(^FNPd#T;_(IAOy56b-*;OE6-84aGvy#m3GvyVKK#_HoHwbvM3N9!6D?~XfZ)`Ae>2>W^KvD1KXfrN|tGWRZ+uHF!{LPD=#)U_b;O}_m(!*6b z@;pn^db=CTSYk>1JDzv-QOHXwO%*Bi4_g}T=zZnrM&-LpfC&Z*D3f>HTY-OhW1=jk z7?38bh4E;L9B`n0p|HwS-nqD|@q6Azij_>?uH}dCRBGw$R-ZbPTVN at 8x1vh%PqseH zDerUKt?T+H%NdW{<0?Ij4LxNo&*#JFBT

JlK?q)`+G1g>QZyU!s4<-F6 at aVJ-Hx6#=($x5C zuY|{1?9n7a;!mOr%Vn(wBUkxHvsWcP+-^y96 at FCWVK3$VHrtpn)O2f!2``VUTnazC zg1Fo!MEIyeBOYm%Jq57`_pOMD3 zcW{UJB)bl|!kq at F4#dkH7_3{c7==TQ}} z61^)FDO>vx+lI1kEam+w9*@N+(Sw0w*_gM9ak%8#V!_wV=R4JHXRj#E(?0 at zL7-iQQH_2p@h(46P?*`EI zz2`Ae#m%2~@c+8IVha_FNAsD?Z8Vwp-Dcm~_96S*PI%H-7isXKt4AZBkl4?Tx>e9yX`NA_}loUidP{ZWCc*QTEEs8e)X$E7pD z+%9^J3RDv`t33eg9)-HWdgTm|>#RjzKMYamL3gbf-j%Aq>4hlm-lV!dJ82IH;vh at K z=CZ at W5T6x*`h;8;jHJheE33HPe^S~P-$=6*%4C##d)RxFQKlP zb}=MxI5G%jJ}#AZHf*{+f?rJS?R*;B{QDA1TDY~QmyoQl;GwWcv-}H_w9<^?H8gE7 zux&6fp`nu%dBhuvTo|uxA}VKL-uf(Gs+NJVZGA&|T!BQP5JVc1gZ&TD+!5Nk3bqYZ zAny`U9NI*ZO_De@{ViRb at I$g>ZrLxz+=fJMg~M?trH8BQLpP{~J at Bsgs1-!cNPRQe zYzV|@0RR8qou|jmBu)PimNZ}h04)D^-1I-YI!+}2YVZh~+SvTJu2i{}`zI=G>l!>H z#7OW<01>f8mk;er4FXcr7)XT$^fm0a)I}-nYBqC669s>e{Em<%A^mL#{H`F{&DGkr z0J4?e?1tCtWt;i+=IOr>{ndvH3=bM~MBvi2)K;3b`*wh at Q0;Yu_+YngZwaA}*Z#On zQ^tj+Jr+23r8-Lr+fLen6CB4_Pv4zFnE~jZL>{7hZIBbVO!RWO+{rQGJkA-XcMOie z_g0q`V7A&r<+$MzOoX_ivjyKpAD6Wbe?vpZQkKAez$>`08eQ)~agwcS_q!VQ_7C{1 z-F0xOED|xrQYq|%G~ZWa#urm>$CL!wUU^_gQxSNYdH+Ao-Z4nCF54DPyDDwlwr$(C zZTm^vc4cOzZQHhOqmuVM_jKRr^Trp^=j(|5XYIXz&auWEYmT`lnrJp&&0=PteN#~W zkz*ibzoZ$}im}cgh3ns9 z)dsAOgh4qj*Dy*+>}=QxaGJ`cS09af{!Ut}*TI~=wJ{Cc%evJahUMwl8s1}Rr+zm0 zULN#-0W$yNiiqf9qKQcBT^>9P457Jzf>cHnSdU+Zp0(wc8d#$&Pu+Q{?UJahCu22fmd@=uu!VKP{H zgqhJ}6ByCs3bLd}M*T>2MntvB^6Bo`7~Lg0#87jS=IQ7Vtx9i{b1KJV^K9Og6P!{d ziH;;kWZ=KG!ujX-;@nw=2KiS|G+ufyn-9J( z*$W?k-ml057&~DI0u-TNKrBW)n0YYZclq!f+=DuhH!}~Hi$lUcE)zn^flQ*`5D&Pf zhm84={CM_`m7$s8x?Ane<$?sELYd)==Cu|uw3OP*X;avpGP^2{;UdA5)$~}IDyp1! zeniSC(ld at Ov?Ur>dXkr8LbN at Umaj<))26U+sVaF|3sY*S_06I%vC||a8(MgZmoHL2 z<#pm4pYp^sb$N!cyVfb)Ev2klF*RpKkp8NW_tsbYL9~b{RaL27Vf4#PP;#k1~A1MM0zTCNZ?;O6j-O)@U)dXIk2jpHVHvb zoePwMmJIuPP)WIiYd|_S;TeI&d`M5ZLu!DlYN9a>sqLLr-N??UxBGqPSRWsag4U)% zWDn>=_M;&V`W0dtwg+2eBEAHL}$_(>S&n_^P~}80+|88S`UlAF398UVB at 4hV^2w!l&I*P1eSohU}MO-}m85 z&XRFmT(=(Zti`D{`FvbzXeV8LsU-9K_9)+~Iun=<=~*S1bE}wAHCaA3Z?S!D8$o*Y!pJ(uMP&rY zN6S^}5z=6V2XK=S{djYbdi)@QL^LWg;UJ`Oy)K#Qm`mx|b;Sq7H(d9xR|B7Cam<-Z zG`QK2tAT9Jhbhh-PIJ1GnVq~IAeLH{fCz5lQA4??4y|O^U-?$MdcdBW>#^_WNL%UiXg>J8{JPd63OllDY8PTTE?r5LLwFv2(5=rjS}_U54b7lt zf60!ErNvom-f4Uujl`H1fGeMI_00oy>&^y;ES`1pv8xH6|G`6=7C!0-rL3!9s2s|h zR^$CPD!y;dT!UQv(nh9R;3MCx|6rhgg<+wA5ol@%9EFBwbq5s%fv4>eR0fgDn4Bom z!VpR%YoaurAd>>A*Dk4Mzf?9#BLCJ* zEaa5SOV2m(Yvn8?P;YSOejva-6- at F&7BYJsntQQ4JY&%XX7PHS<#gYYRVq`K`H9%1 za;L95F|i+GEE_ at -?Vwn at 4w%dVxZQcqHz~!pfljXogxpd_x&O~7vAhqf&SXZTdLJmt*WV5|pkvCW at xXw9{Qi2y z`yWK_f6>UlScJ5lH&hV5V(ssbSY)@_?_Q*qaFZ&#>Ta28P*}SOmv6XjEuwna ztfJYLmRrjXML8q|LwWYoW2DZ}FzHC{_nB?X~TmH3!4>z5x#J@|gaf5}R- zM%WRlZY$sXiY(W1Juen1=@adLPr)pj4nn at _Os|PN8E2PU>i6xzK at 6>6hzo%!j3bu z+YAsE+03AZz zl*ct3Dh61_B{Ww$BYvT&u*$ri-<&+c&?5{l@?c$BN at +?xk}Ql*SwyDrts8i=XIRV% zs=muPO}ZY^MQw52rvwhL*U~o1>=vI1 zflC at bxH3S7 zs)v=Rjq=E_$!4HHN=k-I$E=;4m%|M;A)lE^4n-g^Kh#Hn!!h|1IE4iJgv=O$vNeGx zWE_P at _>x>byaW~b>D6YANLDL3&MRuijA7h>VJ^Av2;E>4OXoR$z`Qj*yGNW$XBc}= zetM%?4Csp=d=Uqj7BLc^* zBbCSc!iTbqupPb|Y*{7wU00QLy2>nmKN1f6a@@Wwj6g%sh_h-CyolkI*-;jlVH1p>JsP%wP*Unv5 at qk!| zn8LxhVX)FsGC!^9aH7Sx6-UfH|G!;$eV0mAAM#hy+K=|{$^!qN8_)l9*E?V at VSX(q z(r9W?%Yi^73ed3`NXsP`?@TU8PaQ5cP&;8YGYH7vV={3|74q0 z_{A-}j>M2*xEpu|M}GxM-+4Qq)_n^En#1S9_4&Q^G-s-=8^yHIc(%W5wrFj!2qi4J^%O>l%xu(nrlWK;wM&U zgrh2TGh2hz3Jt|qiqi7qifLf^w-|JNm9DO2-L_X}=pWO`-q8>E0cdt)3v=7Ty0L_y zYARCb0^qOn;;xiJ!UB5(7dg&S6PKa%F`V?=qK7rXaMd~%-Uj`Q6BPGm{YtvpC>}_t zlwwH at b^+mmGac3q(?Fw>sqw(|DmemgY)_kE2USoI8=g~(*0zKZ$SjL~kGddBjYu;E z9r|a-z&PcfNh?yvjvJ6!!_;9Vs7sVpzY}WUsYpwHX<1pO8K$T9r--*&+s1P_w_BuCW4kf zH{DA(Zfn&xM5w?`sY|?ery^*nkc;#gjqfLd620L5$sw^vXYU0ZsVI}xV$FjkkVQ9U zMQsGb{`vywvXVAg;2GPeaiCpj(C0Nei at I>G8J)Dt>z!Q5W-GZVy^}a>C-ojIf&ENt z;#TDb@`fIo1{rU2zEHT2<@K?Z;OH4snpSO5=G9Vk=?A1Q{~pij&(2M9P|VM}qzaYlXKT4`;tjIt-j at Yt9%UpOh-kznj=}%{3GmeUu zc2GqjH|-4Fk<`EkqBTaK#N;1TWwIMsVls1#iRRRyHs&8Tkuee)=1988_`qNv<%q^M z-3-Yp^3WdUe(iz-Pa9Y8v_&`m05Co?hQ$`bftE&JO>&Q8pdRB6I39lr^qcNHaQ24L z&9iP?-`OGw(B at AWBY9yBh|PqnInB6d<>*36Q#G9sXL;EAH+F`r1z z$*G>y!3`&s)M2SsWp7s_#bECWv4Gr0?ag_vOS6KLgc3#?HFnP-gf at h#iGdP+o{ffC zL~SkGj!!>Kc=3`J<5=~M5O=+a+d3NJTZ4F}xcf!gw#tt9GhE&5lJH)ICu9iXQ54%Z zxIx}SY8ZG!na4QKbx|T&Hv;mkrXyHmW$n(9!c|cH)%Ay>l#7Q+9!zv1F{2_eBNen} zlC0^No at QCrDA#P}?~APQ^XGA{1(9VH>-y6#0*)OZGU43E*H>@IS;-9HufXE>3EG1& zI9)=|%g at Fkq|%F7*Ztr{hklx6Mw+!UW?fzw} z-^g|TB9}d(&)j&eDQc*5%w=1zWLK|#0V&cNOM7QJ{-n`8OCg+;kJ3m&zAZ8^x*k;o znUjc_)01F-~4smRhHJg6B}ARP&6d=)~-amrwqakYi3nXHumrD^)b(7i1yW* z)>ltP-(5d0HzLI8S-%T8Mzm4BE$S#v_fBeV+Vp&Ttb}(w_i<5mFC4Krt>5O$lK>&; z3wZ<|JYEZrc&m9_F%My>wPJ;2ZElPztR_Dqz`Mo3b_gQvDSdketUi#j at 8}Z%l at Z#7 zAt&)K5iX~~ZFIQVx~Z#23r|%2Egic2gBo=U8Y`!3{wp4Y$9F<99;vxAe1Ma at VelV* zB|FOqEm57U&Pkvp2lK?m|{rztJ-O309Js54#dzKSF~(xw|U`8q!A6sbEnHe4@! zU;iMNimw0^w9i|-P3yRqJtHjkgp$u>esn^+9vMhL8sYZxG at aH#-s;~c7??Cl9IXGP zhL``McFzAbt^fBZ!2h9#b5w2r(!&UT&B=Hxc+DV%z{xFQ=DFr(_HNH7H}*TgCbvQ& zVDA0#4CsLX7W`vTk%YZ at A+S#kxC6RWuua&cGhbkMFdme6Qz*{&Ox!&5cw;~c&06h? zOl9eH>S1IxlLU5HftIIkv+a_Z1`U-NtuE_SMRlpvE(^=i=hRDU?CzvI z{gENk81W2%5hS%bvOQ at 0dk-qZ9O)HDWdXr{W*+p~K7E=+2h8Ca zPTeq>6_v#(kC^Y^bUBxbGBiA{om{XRd?QuY=BXBX)%GCah}a|I1j+5i3)X?A^9^ex z*|+>N;+y*4E0mKF4@$?> z6e9}7%}3#Y`p4}R&>o0MeEe(Cv-Y+% zUnnhrZWPFDCTm)e-7HpEU&n|fMA&aezz%N|(B#%OFM6`OEBW;uoOTQ8F$Swd2 at MaG zOLfN%q$&gw5+C3C%V at f~t9x*_n8#!KH9Nz;JA;|KV~6kKo*Kw`R+uBiTo_}-d4MDQ zWZ-uWyfGYle=DH)FG{C}BL*}g(8Js%*0!SzPmDs9srN_URm`H9bdnh>4r7N1_-_3Y zogN)U5_?dcs at Q6*MD?YuL6yzPr_oB)n at ZQJDqVpxZy@bRq}XssE2U7+_8xm;opg%kFI0Tk+r5d% zfpHdPnaR~4C%(gDTXHdfMqFdK+coXeT;a2&=*t~5kNFtJ`ag_4+HlJVeAgCaOnUQV zZq3?RLn}9oM^p~|2$LSJMkMKIC1l!mm4K?YZgOoAQ(|cz#U|aTunrq?=tc at hAazMS z6U@#T#ANCwA4smKuoUdBP`}*3;Y(&7PgS#5(Zs(Q#?U-MTgKx*}jx+|9 at z6`wde~QBS@!+BtN|>9 zhAmC*lVn|r(O9wa&M_I4Ma})pc0+t)HEF5D at JjlgPN%#}!gV7bHabG%Urn%pKl&0D zv6O{bvHra>fr)3 at r8heXv2y58iL~`VHi$OyEH3?qD`t|TY^_3bQlo-~%Clo0_C&Y{ z-yy#)XR8A$w{cS}%hA+=k^T6%&6Uc)`U{b9h<=U{0S`1LHZnYYXU6Xfw at -1~H?ip= zo?-Cf!0N*}9;+v+09S%X;im5e{3Gu!A*4(LZx{6u_v4Y5>=cq`${QxQmYR$c!J*Uo z1gvJ$1Hb}m${7uXqHwSQW#icjye9~c(+Ry&7(w1>&MeAfj*+qydYp at e}!4aBX;${8n1K zy3bbz2Aj^PZ0+YyiPezHcN9KLX)9%(aS}m(!P2~fS$e=iO?tsjtxyklW7(=)ACgM8 z8&$)(s##MJQ=wJ$QndLI8S4e<6C-g%u}TX4^Ddbjm*&$E7nR}A%9xW-Biv^o!Dj^G z8|=a(d*S1(F-Je57MyBa!TP{#Q|8 at oIgVH8RN;>?j+@`+ZO*;qd|xO!M)Y?-IAV=E z(GTJKJO~D-KDed{UjJ4{k`&SA{IB`v{1E>sZ!`Uaw^eNA7ZgzZt}&ABhJLUF061Ls z^^)reU+X1>03>9>NSe=M^zKJYQtfV*+zI|A(A|UZ!!utL2W=$?YRxq9rCntw+3!3v zZ7;d+FFQ3mKvEt>LV|RGj)$rwiW2#NGMHS_(XQVD>a~UWgAB*`nR=<0s$ni$N6qfL zt+sXgC$iEE7B at E9t=ecWJbR44m*L8)T5!rtp>rmijTa0w`){8N!qQ at lQ~*U*>!m$? zwYeRAA3ni^-A9*6nJQC_L+^GSl$#1WDpQQDOS{#S-@@iP%Y#5+O&1TQ6U83w=+DK@ zKYc-aO`$o)xp6N-2$L#t at 8orE-bzbuZskbv|CnPq<``>QE%I+%lrOhXJ&Bdq3lh4{ z*sN{dv=`TAV<)HGpi at 8sN$-(FZP5C*c#0flm+8AP4)WEEirye2s^|DFSB&u%*t^>f zu;X at cNt_WBC|McJoVACovK_gR%q;t89xr5eHT{^llj&$8{t!0TA8`I{DY2UxhO*4s z*((iR!_o->Ec+O5(Hh0cwad;yzsNB+kBJ9Yt}B>Q;9|>mE-`?*iH at IbtTe@tap4@~ zRBt{EFGLkKWXLU;ga%|b5dS5 at 8lgRLmslVVD>D#K7Z0B%d;U~z&AD5cOIaexJ at L2g;3+Ut=stUGKm1 at f1gG*NZV}Glu|t-P?0Sd;@Z1eX)cllgp)&oc3eCQugu7ZS*8GrgruZntfiVsEHc75Q&~M6nQpK=K1k&FA zzqNvt;^Bsb{T14x|8ZzD|1-2VCx0=5YnDP?gYp;5dfBSQ*_RAEG^ z6m#F|8KoJVE=SWUK2)jaqTUpq+VE9fmoY>@6u}~K;>^uvIR9c%|L at PYANkSjR46D) z7~+beSY9xsG?X5xL@)Iq!hMlJOamGY7JoeJS1{^-#BqNGUbqhW1-IDr<###b>@C?` zzxSJKRA$+YSajHJph0Bdt`wx%!ZI at yqWX2?7YX60PSgd-hQ;*%SVqr+8_VpFw_KNmd_8XZl{v81fcd>FZQIoKLrnh=PXDI83L& zZ;;=S7>;IRb#F_m?k1~U)WdKjVd**C%$s*UVyj{OC%jOcNHrS75o!(0 zZ!w^#JEAOZTjLg25!9R#eHTWOzhb*v9}zJvN4>Ff$k)&&JQh=D&wdo`* zm$I3*jreS#nSR3Od`)|#QFq5_otucm<%N}Jq&*D9&T`a1cmTFj(!V%-US~NIdl~%jbQ`M-xhlxC!HNGY6}x~un8uTQY+WqK zPe6*^7j(g&;Er`Xqwt$?Tu^Alww~1zxgS?%!Mk*X8P?N!76T!1 at B_oxiu4og5{#HX z;bT6$9i>1n?|A6fe0v-uO5Rz-RPG3#l1=O-*l~mQV0u*LY7C}o*CS-n4&$)RxH*6sd47WsQ3-JMs%ko&k&fV@}aab>U}%~BHGvA(nk_|@K+>gARrT* z|3B5oe+lk?RBkli{ZZ6Wzo+dI*S6q7$WZ15phtjqL zupQhJmo#w|sQ61tJNwkOO;lQog{kt=1PTT4sJ2yVRqH*&aVL|L(|l%Z4F$*H-Z$Ca z*DpLbobLRd7dILa=-eMOm>_36uS zLrW?yQmSQ%Qpu^5tg^~X<%3VZ`sSrSj3de$f1j}I at 079loiff2d2E;J(RbD39^sw;6`>s7XnyUZa>7}% z;EnA`PD~?o`fM&Te3atOUPPEN84jfx)Vl0%_hw6$=jB~aVgka5_=s?jDGC}N8KbKq)5*g_{I7k!~LpioI z%^E-Qdg_KyzR at TErDN-Q5@f-x%0D~($nE)W~!2KEi z$7jQWu8Le~T!bi#;J)_v7^SFsW1x%Hl4)~rtvUu)cI-GCV>^ACj21341Fd=46a?<< z5~HqkaTyrR6%Ac5SxWlMON^asYIHiRZQ(}D>VeRuJLUKin17bnzAdzWA2)~=uK}qK27G&cN^w|--lHVOKx>G&qe4F+9>lFDqQ5DVuMbXM z{4IMY at g8G5S`t8-17zOLw{KZ|eocq0$g17R#9wSKx)&}tmKsxe7&>e=9`&v|q~`!1 z$!XVou3x`n3#2#qwJgNXN2E8E+mAuo10*liAvGM>M`h3(=_}NKCqa!Dsrf(>4}#PO zQGOe7)C`&%(}X-Y`#_cd;+ZwJ&(rPA{Z<$88*#SFz{cwK$Wzj{D>LYN+{|RQwscne zT%x}{UCBo)0)MCM+z0n;S^avrBrc)EPBqI4kUd6n=G$0NpQsWbVHcd+;@bb##Wbs_ zw$`=t6svX{a1u3mG&CKT=$aCTIyv#IVBGkGR@<}CRYfatm+02IF75rh6n`g6P!!8m zqrWL=SsUoJHl at 3qVs&T3qPWA%pI?Mn7vr5q4=&9iW>rVqw%T^kw1Pv5g({GxJ}CSQB`>MJCZDX{@Mj@@noZ34Yv-*` z0$O5KXoxt2;jT1?0JSpgSYf&rl#V&AB=O*0QQLMrOL)Kx;b{<|MaGyJY()zg>h6W@ zt1#+bu-t1D>Mp!W$agyI2aOPz{!NH~9mvOC%I}mi7AHjeEE`Ii*ZM4-!OEr*?Mny9BgDF@a&S3IUhtjzE+y-07I!(1P~K!iYTy-a1B9I=O^N>Er^p3~dxk^fcvJ=ulc(Yiw1Ue`F_DT~*qmHBrKbDtYA~aYd2v299;MXCuig$B|7kVV at skJkMtm zd4+&LImTI3{pY%1dRZ&keS+3dkY+e7I&IQnY#Y$^V#AUgNbnf4K#ou<4%U{wdy&x!{dggjatzUXK6^bHK}8JAvrnhjqj8)A8fqyvDg11d-F= zKtMx?|86kvKhi8!J6n4bOEb&=TK!9&m7}KZj;xCEMJCBCi(%2GiV_ckIt?DqiOr*MYkXZk`2>d1|$WV7(!b4|BKEv2>kQ691NT#gqwp2A|mU9ivxXul* zT?iBMGrgDV at ipw%Q=$ddK6$E8R71aLDSl|5o(v+>Mk7u^&gs+^mKCGe3KXkxx3WH- z;R)>GF_ctzlfb)yl7RC0Iny`kfUfS-*q~-iQ`pa9o4N)@irYm=KfyVo)`Sx=EV6mD zA_N0MHqh}$&M)k>&&zyMH?ELz4FzH5HapR!xBQ%kbEcK-B4zU^G|R-~_x28H+wh-@ za(xqb4$91*@v2Uw2J&I0vzF{X=?_3f#aouBsLNBO4D}LZ+s19oT`_*0#|r)EMAenpV-AZYq_W0CUGur7+k&sOXj>gLbFHMv2o|fT zB$NTra-(<~)FZ`X6~j!la;~TJ_4ceN1s#&B zp=G3p3{?BZ&@T at 9y?al)C$1CaOK=NjM-wW$c95Lj+J>y%@wY^JiMP;vDGbv;e8~2I z at uWOZk%{=yZo#{g6%M(aF;W!zLqaY*l>5~^266EV*i8=N5bipyDbARRfQm;tv#RmS zkD1;g$54dnEB&%kl1WQ9GZ}5Rb-;0~KH*rDtjtkMGg za13g at I$z*jhVU!Os-c)^3Xh11YxC~xp?%v}S01L4TV&PS(PEi39j;u6a4g5#WhP<% z5;wqA_~Jy|g4Jq-f}4jt2l9RA4aIo#44r+$e8Y-1WS{b`P4nZw_}UKV%X~Qis)C=l zia5rY`dk}9s3)!jd1uwBK5 zes+VrKC)s%i8w1buuJ0kbbKYed3$4?xrXEwi)iuQ?*$gy)rWpH0{%S_<+t8J) zGDDSUIMKv4(IuPejZM=dP>;+ZS!B+6eD(o-_h$U~g#l59Y zST|~gvdAv8BR4d&kfa^I*FlO at h9f3R#mB8E0E&}a*fB{wQq`0_wniTKB#~_GP7^L@ zFV4Ump7*n1$@Lu#jIYmms`l-`F5ZX(zd{ARUGn`C9=m>(>aMnofUaJQNDF at IJ_K5! zUbDOIE{1a>SG2s%nqi&G_L}P4_3dr%+jjb1cws-ftOqPaf~jv6vyTX!p%txdqxU`E zXw`n|U^jcK?};*Co4xChY`hb%etkl$^2ygLNjKZu_C4bRuK4*7H+Go5p$Rb89 zH>jG!o!=}$IlGqlC9D3}_AFGj9PiW-+dPY at S9w;UZ1;6sf8a5(*cUCyS#ZeY;}GW@ zj4l4HTdXMs<0cXm2Rcim;G1mMDLI`d`;UOq0N=vJC8#W&) zgeVF_Wq|JkYg%PEA0nxQ`GxvMa2k9N1^>1i)%|LYGeZW9o#}Ko3b!`JY2I_=({W<* z{y9 at N10+^QQ2=VZ at 5mnJjWnE)f*@XvOWR6s2m(*SGg$1AgVfM at yNw=Kj!|mtF*s}L zsI1yZ#QxW2u0JiuTw4Zr*IA(5T(}`BT6quE$scARx1{PFw5L_Cz(kc%Z&hXH7CncwvI+FVGXq2k)f(jOhYqlS+)AE-U!+G{Inj! z>$ACw9dn!Zgy) zQA4IWYeCfsT=30gQvPbK-!GGY>u6Jzo?_hDkZg;D$F8gehCS7 zNW18gkQYHRGff*M6MCv#V&F}91ZmdUDGa0P#O#$vbD|ifr_}|RGleUhSA&^oZNGIU)|- zy=lFox5sEj8A)BR1K|^JLL7jp*d1X*@M4+IkRS2qX9Z&F?XUhuSxLA*A*4J?D{1S< zsil~#h2s1d&`}+Wws73>&z0}GMRa;)bl1x6UDk<@CZ_Tr*rESMqACDL0Z`CH zx8!lybF7$Z**UK^HzB?-Hu*bi)JMU;(J1~)7-FQ-1{)Z zqr+*ZJahVwba5cfbMFU>x%QW-6hJtdB+H7i4X5bBeN}jK<*v)&$0bq;9!Ntmr at i(e0w zIF6sLiw*a4pqM13Et}bk7%SQEE$}H9F7Of;bSdpXtDs9Y(Eio-%Q(f*^mk>HHNenuYTvP!K^~rJt8-7-pC381Z08&1Vr|~h^Bw|UNyFqu~kvNX at P}O zfl3HOE1qFD5Tq6Yw6v9IiWLy07z+evo9V`onzt at Xvvetz-ab{I`owX+f%JVWmM|+O zInImX_}=%U{lgF1*riA5D6t2B4s^NS^e=Q1GG81%e~K$3GJj z_d~A54FR3Uqn2x0g#=v?*$J4+PQ%NJ5WDc-6JHZkF$Qx_K9P?4MvqodU!Z|bu$^Xjzd zz~p{4p5|qLt&PcQy!TX1h^Yvorjt0sj!Zo=SC5Jk4De5w#^2J|I at Y0_gLcS+ zIgIfh{t59gyAViAF5mWy-=W)nF1r<)qe|oD$=95YtsjQM&1umxw(ULo&|5}%_4{FE(9du;byz2Q`^vgzpn z|8DS#Lflt^6WTq!URSL|Y1ECa3AatzLt8KHSHP`Yh`cH-j&tbOhB*4$ z6`&G6)R}gDe8p%v{@!y9!GS~tdPWy{J3?0FDwSMs(w9IEMb>AOr9n4&-m*>MG&Yw< zl3anNYCW_#eUX-!Hja`e4=d_v2O2^+1)y6UZ9Op*G^ALj!qv`Zoho$LABnl*?CC{i zCfO4H0kDw at 7VHdaBWS;C3_#X1wQ4CcGS_mq`1ZEqtN{`13~i8kvE|=}-q-Cs8F?4< z34jlNg~EsBcy{P5rnJNy8(kIHdKD39sLK_j7=W5SBidGAo#hD zuvC&up$LrNFe at EwMFMFMEd%8_;pC3&x zr*rBMj2bYb|aH&MS(UG)nnKVZ-O1U}g(H`_VyS8mvz?J|0F0edu0ps^W*=TTyv0y-xQ zHqJ+i(!}}9AH-N-JOcSIz=Lb9EJ`}d2%9EWW^yoCAVINadt~O96z4`@j at KUK)5ggh zkT^HPQa5zTsSl#{MmY3qYLgpkfD4QL&M7+hQ2Oy#5g7;gHH*Zu(SU=kq4|z-q#e at z zEILt-#aIUeTw0oZZygs_^>GlaRU`$r2PevWXfHV{4fJGG+hX=iNVWN&BbWokn5uM2r2 ztG~Ygvo@}4k1dMAYs{@Vvex*gUtnHIStxVWF7;klX3B`()esrmf-q9lz%TW*26en&Q9-oEmC) zcaOJ2r>^^j`V|P@>veU29FNbGLYxRq*A8sJ<(+WnL~v4-eRbWFLa1S!VSXZ-!ysKo zl*n at vQIe|Zt=csyaLXutb(V@%C*x-vGh@)l2*bB*Y4l}8>UvuFX2ejt(z=6iAEof@ zPgnX=tF0JO0W65t71871p^4BPza%5-w>W zF8nUC6c%f^wA8Q-%x4;R3 at L1`!qEoX@6rYuHsZqR=JtB1`{_ at SB9?7 zU>JAgszYPMrzFN#+7gj^#0M7C5KZ2a355|x!{EN#&^?{SyCI!EIsG1Po;_Yek$ZN+ z6J2RY(0%YMO`L~riw5b5vZ+R!$7adm^IVa~t`H3WWC`Nf_4asaO4nRtYG&^Y!p2=* z@;!@ln=t3^Fq2K);gaL#C5L{H-knY|l!rTS9T?~D0j)NGUDsCk|mPmVwG z-hUZvhTEq_d5jEX#$7zWLJTZ@^MbcOlOGX}#d2-B*@yUS_MkJ1UoS5^CczDnQqS}| zfOGSp_T`9#Xo)i6m*QVX-oDG)UP57_$+z{DO*>!bv6e+)ML_aIO>Ol>(0#E>Diqy_ zWo#caqA*&Lmb!b-SIE5MkU2nrXOngaY+J66KywR!uc6cwh{RIql?||uMq1FX*S^Uc zJPprK at QBxKfBewAbKk3FQPvUp+EJ- z84kM*13QYHYdrPwkKegp+X+drU%{A=oow at -Y&!d$9Qb`a+|;}Pe#KRjTOgN1ugfUQ z+%rQ&adC;MCxXa`)cN=3gJzLd*L3a3<_vJ2P^J618 znfYzCOZ{}IH{A&(#xhII;IS(XEM~dcQd^`l3QbXe&<0zMF)>O!$y7yb^*z6V55Z;@ zpsJ#Ga|aC|q0px2+NL7b0OHkYVU4e?NRt!92iW4Vukb at Ys|8e0EgwSkSX5hV2KEAX z+dV4!hSprWZQ8vgvlel2^JmJNwdQrE at R(#LR6U!N1sSpwD<>yC))+XX2u@{OS0*-| zxe8%k#hMfl8aYt|u8=Yj30Z}ZbJF^If0NN*Fu at 6qanVw&9D&=yK5rawZ!3~3=Vr%< zJcO051I6#N3_YZtRdA6DYXmK;^6}F2HP2sKXyb}o&PdC+i%F|*ah^f$IO4Xc>%zuz zrykK=Jhb71fTtw0t!a&A3La;6MTh`62T~pY!E8xi^|v=#!p&9Fj)?8_kgo1jsJ%bc zP%HAE1tbrh=)w(81g=M=?hGPJwsOZyr5u{D82=Az?-VRtwg+qP}nwr$(CZQHi3 zZ`-zQ+k1a~Dyq6~*B{Z*5vT9tiuJM{*2v5`=ExjfWbXi72%p=K-A|v#WEL5`{Uz}e zf`S+K)s7^~PCR!(F at XyO0{Evq6(B8}Y*I2BrrhEWwYt6e>4m1>x_PYTJ-&T5 z-fy7$U4K?`WBl228m at CrJGwNl)hnXg7&BEZ*kucB1n*Hcg}pTii}&TYE9Re`gM at xq z3g#7mc}DZ;7aN3#S*qqGPjij*(k3juBnuh2hD>qfzUME-*dVr$f?mOJ z%m>2n@*Ko0$?JY*&i_LEYF7rg8C(yiZVO0Sfr>I#B(?*H3SS0XNkQnvOjwa6J;NNLvp$el zKQv!&SbfhKhNbD at s`0SYa7xq%f9c_Bgqs8g8R8ZVscMKb43PnwYQS;W^hyt6B{$qE zF{h;W6~AZZmF|v!Le{|2ioLr}ER5qse;VlNBf7kt>Qrqo)CZglxb1hIF(?`t{e zAr(G75|-cxemUm$z^F}~1WKq0;%HZMTnPoggDlDq{9G4CIrnJg5KcQBe{?c_AG**{ z#|@5jl1d+`m*H~VG;IF at RLv3o0BzG-S1ooHQRS|L?B~27I}PsTLC&3c3BudW*IU_; zsjbVKbL*Xu>O(T(_ID1Ad- z=(IJNAgxPd&hTEw%qe8`XWcAK~h= z&mSJi8Qhmu~kui?Y=R#I%0LT zls658B%}3j5b#KsEiF>eD92$dEQtqhM>{!?W6ceCg0)t^(bO~pLX;vw37U*YfJo3p zX`%P^3HrRp9Dl}%pki3wwmIK;`kr!`-^%^_e&G6f(wxT+RePtkJ!qq0^yVBriNo0) zRq5?DJ+=l}1BK*4<6PKP=AC`+b}wZCAM*MmQTMJw7opipuq#nM;|07H9&#Kc4eAy* z6Z0jxp>Wsq)D4+`T}sy)_x83GZyGdr5G3l}wWSQYPCTq=FYT)K>$Y7gIaeOHrl~V? z_k2y6w%xp1^!)c*+ky9-`P8*zXcP2bcu;FPn%0zAG%Q+w>UJJ};;L=zy8FZrx~8q* zzh+}Wt)NWWQmVO_SpKDZ5F}iS6?WG4$)XS`Vu}3jCjc+6#zdMu-qf5U1LflnITXy- za^uK{C=8;kP8hO>DE~N+KMIvsv*qLo`{0iYxT#hIna({4V>Zp0-1j{6+D`>8>P73Q zqYp2SNVx`OFLvAlm}~iBNv1Q-slWj~BZ5zo-)uFtSm zC~#Vq$vC-5Gew2$J4+a1PVv;!Q053^Ibng~p>}#>Oxgy_)aoU~6Y`ny1uE}2wSfHw zg8p-;d243Ooiplu`Z(2KKgV3R+ZfxDchG0j)3O2$T+LLg$FgDmfMn`6xt)t11DHJr z40}T6N~Uu|Smq~iSPhucvhdf;;P{Ku7=xJ at E0;-*MI3i5vO4Y?lvQ%lsrQvsX<}!S zUBb`fYituw>4moh`>WeJ_GfBu>9T|p%Evq=<|)0P{##tfpBy*d at +G9)AA`qn-~^D? zv`2_(7@^4tKXbl$N4!OtUeLM`;4O$IS%>zNugs|q+?m3GC-BDB`n`1C=s)0DV z!zj!n5LSw;6bjQn*X$&abVbR5007)W0{{s9n^pUdjXP;uO4#BEVczqGf;8fQqXh|Zo1voDY at k1+Q+C8s#I{D5=slYc;u>*s&+Vk znW<|@H5?mc3oi=0%fGTO@(}%d-(T2?v`ThBUKYDBZYfmGi|{rj4A!s9Aa+oP&LBU7 z+J>+5F#1r06=AlZZYW&x75_}(3bVg;9AUM+ysUx|yTvQY547pXxA*Yw)I4IW_+yMb zg_(L-$24Ug8vkhPR(pk2rrL}hfs@|Weo85~!?k{W#d~gO=k6Gz(5{2$DC#dXyvwyV z&E at L)?uD2&SfnTFf&>57Q5Wwf9x!3i at itG2$Jt`;5xNlr6T40|btp5quAMk&Q>WcT zxmj$5ldUn-uA_xm61A`57?QDUQx(qw+dT^J2%jFz^D;)MR^j~hFy2V+Px8v)!AhA4AKr?K3*H(2@>U~f&u+GvyD{t9XVRV8uidE5%MhdySFO%u=?@v!i at Y zm4dG#vd?``K-Wq0+{m$hgD)fMt~h+3&ISK5un=W+;%qNH^M5k#z1x; z`wTyPrjIpBd)+zbDm`Y83?h;xsL3cayU!c;5vfDcQx05X=`k~TbiW`oQ4jwn@{;E& zSY&`mf;|`Mn7wwsd=DlX1C-La{F{tXb*DU*VY3jC;#Z`3KF{|uPF50tKl3ZHU?1gg z=3llBIf6N}64!oa)wyS=?!YAZPSQw(X>yx-rPu$-Pnvj&I&h8|w15_b<8r>kH2 at z$ z+!tI(DY>6rpB~-bJQ_&o}$8 z9TYYcOKu`}U(YbU5m7+uAuZrTx??)^H8 at -`4m8*~`%H6fXULpcPj}9WMwN z0DwBe|1J0D|AHEL;#jd z2k2liO|21CTrjOaN!Vc1l6z at N*!**~e!lM*(2Q&Tx$tJ${zoAVagsvaP2-x4DDJ%Ak_%<&Jp{eCe5D}MMv at OZZAE{dn}VeD`=>TZf> z^CWgAyEP$C0Fn?Wm3<2V9 at s+!VUe_|rb=2#6`l2E?Kcl__i%%?oU*I1N-U{jr6l0` zUyQDDQ&l!Ij8}4K>%*>$TFj;-+VQT$Wj> zeP-^H%sx*(cHz8m9+KFHUD3{(D6v{8K_$Hz+Tz#2yIw_Q*iItai7uIlwc#p_M3_ph z>Z&Y4tQ6ZM$7P-FMAY1YYav<1_dJSM0jDO_{DZUsuqt_)REZ*!K3)X at HEA7@PTP>f~0KsfN z|1Q^oIH_&d9-Y?Brk(jBwQ96dXr at 2XpF41H51>F|1`rtls1o|k;DBF_0rI#=4jAGf zIm6sQvj$@Qn$u7jM>9OLPp3rzJoz0VQ$TeFgb`T*t~_u?!u_x`P#uxlFy!tYsf;-v z@=%};ArJ1;wI*L8ZDl1(F*uC%X~4Of%51|%ii?IbuZ)MJz_8ua+Zv8 zckhBqgW`Y18A2#thMs?K2Ju8H at CPVnMlLKt{k(v at lrCVrAzyRyd_9sk5j2BwMH6s` zFn;jbuM_(9o^*GG&CT#XPUKxe#y<&o#XqQ)s4g^QlT;^T^2EYEcj=y#4JKI%g2j<> zO!G!%+$+=1KXLoa;iTB{&B$ynpk)@9h&rF3I2T=)M!Z z0{bn at pm+FWR{TZITl}l=p8me(Ob3@>t6OEDV7UQ+Nsu<+STe=}x`7$njFw6cE|3Hk zbC?~HIBXaH>mg*WSJoKq60)g0t6A|+v*HonGJ*I`i=gc+VH38{^fm1)-|WyV;u%iZ zdQUXtEyF18D2LpE3$pRH;juGkxMSA!g;WD3zOuX*ffMbDb|1vc?R}Y ze at -z^Td?7`)wg+s!Wcq3ri;$j!$gt$mbFx4 zeEMPYtdt^gUbsqByqN1tNZ*Wg5$l$yJ6fwE z6qyus42d=N`jRV5=~9T#iK2X at tvkgF>Y{h7pKEM&N>OboN~@9BoRfSVw{6XC9$=n= zc8?}H_dqmv!1V5|zuDYchNjnax0yd*9?;)g{o7yqI#moqVs32 zmqAvt2I?dzT)*A8DyLoFBz5xw|3dvx`Y}BO^Y`PM=JWz9K{JLqOqiOPo1bNxo0r>Z-|Azl2Lf9U8#v2ydf(03JC1_ojDe4b{_tcLo!OKYW z=j>bhn&mWvGZ|`}=Uv`2uxa_B1^d>4lWjr?Cz8NL6n53NMr=iqM-tr0A!Lo?V==1? zlCv^pg(#&2 at ncz>=qqA_)HR*AIvT;0QnVfppZG))4{h&>$i>f1TyKl$%>>I8i&8Wj zYvyi|cRN*d${GW0>dw70OOX?MY at Y<^r{N6yj5 z{MuEe9Eq>DE(|}dR+ydLnD(r?QZdRA7_(~OO%^P&TH-{#Ev|T*JwH>smqkI at d25(k z>_B)PEd^Z3BM z#;z2VF{J~=I-sX$uI~`O8rg=B(DuHUEaqlFy#?E`G+?;VXU18Cex)>`!?o8%=2-0ulwQGIg2cmV;tQo64qA%Q{+#0;s*sQt8gD8F~^d zdVbCVIsP{^PX6*kA=Ruv<8C;|Q3U*1;22pA? zFuB+lxFo4W_fxtgLcruc_6akXrOaCDcLW(alvLn>!OHGKP2$uv=4eitiA4sp%O#8K zL{?^Gky#b!$Tdn at jq*EZEhuUIX z)3$l**=m=K at nut9?tFHa7f;hRAAq4iR)%eEt}ENKxV%!0nF%u7<&E)J3XIO8N}a<7 z)^y_twcY*4&PUp?yRhaQR9#qvG*@tJ$b?cIekt6s=&s7s6wB6vMbx+nPtNiTDL;ud zSYr4tAuz(Fl-n+Pq(x| zMR8-93I&M_IewPc1kEskB(BEOIcm-$AWD#nX~e6F0Nn)`?aNG at D=yi~FgELIaMu$f zPl{`(P==kRPud8zsmXMlI?ayY$5-mJ=q5Fd5!D<|J-TV_lXJ<(sWGZJ+{SBVjR}pC z9+lL`+Zf%A{`?z=E*MBgx=6*1cI?_xY at ZOJHBQfUaS$3p at uGhknkH^7jc&^s=rW5le|I-xfJ0 z-63mZid&ZoH$r!o+1VrM-|-3sAZ4I&P7o$SI+tBpe8J{W!AIs!u4w}aH^j9tdQp>N z0QSLoC77z9tU6DkNgkB&<#j{fmWN}Pk$f&p-?Qg+wQ{cMUVNmW03R(vQizU+BAi{I z|FC*z_uRt~UF!xK>@ePX5XJer_ at 4$vZZX8Dm-_aqk0bs4DU}tF(L%7Dg7BDE*1CRr zO*zzy4jw~(Mn><=KB98e88T}-j*`e8S_tzS7!U{MP(Vy%BPY_ao{t1A_~u4ml?TYx2^LR>hjMu6oO at m{;%bVyx04{XKM zFFk&Ao(gK5vlh0~7aNc6NN4a}9`(&(me at cg-oa2ct%-V)2HB7uURMudCRJiPa3I5( z1xcL*97yk{h~=R>3=z($AmEcB{zOP)^tw&SkC;Z z?S;QHI5!PMuN-mFeo$Nee>_y8TH03T{_5}vYYzV1=LY6(f}DnMr4` zpJ#A8Q{Wu9vPD%zOOe{P)k?b%elsjBz{0va3ty-DuX6Y2jrZO5wxn4ScSBaI6W-T# z^P790^X%>!+27y0Gku`-0D9_$NPN(TtmS(8vEmM$iNjb_g at -Z}dr3#pD17M$WXj#T zVbvbuTK7^9`KWxUhdz|GlJ`s$esu3Y39H~tN5U7sN?rJpZ^jpXL_7MDS8IabVq9y~ zjbQ8|kJ=Z%aw`7%k^K8*DE=^q@`B%*f+Lp3R?FiQ9u{+yzDn^X%#9u)L4Kf9;>Jgk zyvefIP?wM5;BdFM_$5*+C3tgKrw&wj>_wRxRFwq-#hm2jcG3fZfx*UUr3H!8CB|Wx z!?d7*H`g+h^I}Po#Jo6bvP%r8Hk394#5>jUE*j3D1*V!d;4aC)AJQcO#ECwU(^?>< z>r~|WA&ZUVSyCdS%9Rfth=$CGQcX?E#NN#hGSe*-*N=s#PL@~~8F={2i)6ff{Esa_ zrs+YcLzN|&3(1*`g{DG;=vIjxJ at _BeBx%J;FNI$q{3C|SGo;G}aW%ObNk zui%W=c0EB2^lCiFRA5FE8fFRu$b|eZo8+W*kXqQ+AzHymb$jF(L)&3d-Q5IC03&xVp?Sh)V6#!6Hskvzjshql36`wpBW+32{TRaH3dEtc;*Ni zIHwSrZ5SxWQA{<-zZv{_R~x3chGoO-;^xxh^WYk at i0 zguiNKv5_5ktfM$UU_VW2Ho)z41EWRRT8V5(m6Ca#CvHQV;}LgH$;`+Rqp-ZTJAk{5 zmkMh^BwGynY0}`ag+cPsszjm((e(MU_ z`ez<<3ox*_emc(-7m5{!Sh(5h_3I6^D;y#y2xm^NZIQgOg`WBwoPxx09U6}ud0tVt4-DoDJ2e75YS_H+7o8QLQ{EEYCRa zh^@gF%h|T;Y+bW=dM}5dcQQwTizGuI&MOh5eStkt2)ZB*cM%c5p at R;990hcUNIy<& zS_Q6~2cP$bPcl8v>~3rAvTv!_9aRYPzFbYmyUpf$&lHyO=BJ_d+ at Sb?)w;WR#pRl{D71sxs@;gTMpm#Di|!m6mhXtJ+-?+g zHs;>0E51GYMAMe(gYUEw`P9+`*4K)x%J+du?OV%Pmsh(kuW*UcV%w%L^&zJTbXS42 z2#b87EWpu6zJiSU7Vrip(`{yizNQ4f8XZ7CB-}wiz!b*a3tdw=5z1*NI*aeF%em9s z+Ia at i@-?OrG)hV2yow+C5pfG3<^S*}a0qT>lG3}lLTdAgwa_EnM8i82F5QOGA)Q&7 zXqW%kTup^IhirMZ3>#Q487qx~HwnjI9OtC<Fb1ff* z7#B$K2Aa8UCwpn3mE at tN!}d+#ve9uz^5+0MV7uxYy0*iX=s6bY48dHQRG7PY(V>Rb zkh(quE}a-zCG4olBP-)nFN3UBQMyzj21zK)WNH{*^k9oxZ^gA+~XL>;oNMUZb6*HQuNmpV7eHi`vb|I~SuK*(m#bWnU=Y zOBDFgC at 2Q|so^)A={FVitl<|FPk4!1Gsfm=RKpRmsz(w_J6y|0r;EePBn at eR;7 zQoxtod?CS z`5+$$#WTIF=sV(%l;k!n9)qK}F2}qo)e5q)R$=v*o`BcNMICWgFJa+{VW2TA>weX3 z6ZptDe}rejB?NG0zdjXyj~LN44CwZ0il+^Xzo{Eaxl7`L;9t`(bV=A7J{hnB!9sY3K$6&3hrdlmpg%mN4Xm+pP?!L(E+V zKav3W5Wj%VL>F&O#DN at Gt|;GAvLafJwqhJ4&CMJmsvcpVk-ixQxm<16T?FZ3qM%OZ zJ^OMb^-|?d*3cHX#p(jE^)8bK{W$h5Gc6NVkWD;-E zFHZk4Fojl2K?Y5tT!*z}PnZkzkXK$R#lm#I7RzzC(Nf1!S>iSqwk#4{T*9>{b&?^X zkZE at a|F%yW=KzUUNKvrDcf7{Rp`X^up^JP-^kSb_1h<5hJ=>13)nNL*WMds{C zWUEPO2`J at f!#2sw|3aQteO6AF&ocaUrkU z;?!pgQs0&w71AvwR$;D7+VttQW5w?&R;y%9=W!WcL3 at a$@Gt0tiy at Qs1L8P@^W>J& z{JH$$GkTqr-`Cu1#rV03De>vu5!Scu9)VcT3QPDGyh5C|JNOg|SN!=X18u_C2)3*V zJOaP(ew_D5#Fy82qhAfaqS?A*Pqa1Nx%|(~Lx8g&UH7)(9&9ZbXg!OjYR*j(WEp)v z>L2aHCRg6{ZM~?7Pf%{R7-HO5l!s30Z~NQvK}rKec3aP>+d9FlmxcIH!w7vOcSqod zf94OT$KXq2fC2!h!2tk>{M)lr|HQ5TbX)Drj0ttMC;+j9R<0{yB?%O?8f8Ziw4^;Q zND;L9(L0dubZsz9lm*H2as7hweX#Gxv>gU>%>*<5Li1g46wg+`U&e58#hu;KZOwp_ zq8U2P&2;_?!?^RiKOXbt`9K-MRuH%v2+~9`*R&Smt_ZdA_(AZ~gvJdtuhoW=P|Mke zZ$Sx-XsL}RqD&=6WijcQS{#OG>`Xf*987-Oyu at YGWM$=%h)3qL7M#MY(xP=nr(go5 zh0+8wSz+{YR#%iF(=o)VUKaD}p)W at RN>lXmq-o8Sk)P-0^$ta4SDJe?7NJHbuVH|@ zC+FF88KlarGBj1`p8#_B!wj^TS)79iadY*lkCQuv2+N;HY at a}bBkG=5m34X*R%L1H z?MiGQx~z_q*3|5mEUhS}_Vej#oDa&)?nj*bQqj{_RC77R&!DYC#7R}2cMLygw6Q$b zk~f%E?NFh^UeWa5wg(tK7#Q$M19 at o_NVHZvXPv7g*K#cvS*3*gY#wC;yJn at sZmrbY z*xYtHodjC!z%Y|$1YazsSu#1)OC5pa=~7{njx=ja5|!6hin7kg=;biQ22^CJ$fPvt zOS>~wbj_R^Yp#f(LQE*QmR$E~g^ZxKM5P1$4bXcK4TM`IO8eL?V|XN^rAl zMf2#l50txR5q9<->$J2J?awc<+BYMCn0EzMhB8Y9v;?cbv3ia&AlQ at 4Id%hbuD`mDMOAZT)*ZCN0kyh>0gQ=qTCo61g?!qwj(0xAwb z_7oW)%rWNJO|}J5goTV&1T}MzAE|=YAGm at Zag^@^(NS?k$$`!pBssY^aE>Q%3Cx>R zz~sVOr5+3pnH}@Vw+);UEHqF?KDe-HEh)~(RJTzrpO?2szTQN!IMNt&GMtU3I&##7$S;8hVl++`p^bJUU?%GEmpvY<4 z12LJt!(^gzOL0h!S?tla&{TF%r#cM47>8I?oAgSM&;n8+b0J8WMUYRo4&MrX;`G^~ zODWu!+S6i0(H`|js5%a(zKR+T7jHV#{1INJ*NO0j_&XE&)z}R&>^{y6F*=rjoO&}N zV*1XUluW5cq|}R2tcN~ec+m5VYjWZJEXA)OVWa-F6YzWl2?hKVQn&{j%)xyZb|ASK z+kL+4GA~-S&?-?8v|>pazF at 3KUxN?1Di0ye?`y87rNAr7VKu)G`w~w$jb0-cFS?pozO{gci z{w_Kb#0MF@`Q9CRw|E!w7ak|=cUba*9!ApN8_K?InaKR@&W)* z$?EEZI(|bScO$?yZ93L?laXB>J>nS5_ at Udv+GbA9e;(F7;j at bCM{w;CRL6;C?_MUb zn`3+3>O$iLFk~T^cXe}lQ|^7d-aX%6d-(o9{X9L8Lij#YVXXi)?!xpoAdVE< zfPiel3L$4Uts`ORHXajh`VEHBu-SkVpa$6j{<)V;B`KA9>8vj+n^1sFas}k|m9D}{ zu}vi`74S9uK)*RPlcPw1=8Zz4)uq*0YN{4k>8!FNl8P2166q{E1>K}pHf$)ub&}p2 zgWQ(-Qq)OWviy6V;anRVOn~-!TcseMP)$$w;(>P zVS?})TId!84BJ^(2fLPiBie#_Tf5_S>CMs at 7mDN!xNbY7omEm|!r}^7xVhao!$05T z`fMu8#ipHf#*^AfbSo8tFQ%$1FcbYz!@xKvZQzy at Xl2o`qJ}txZ7w!#Lqi(p(}M%S z3Z-Cy8yV6}Wfg|wlbPUV54^m?h`I(Z%PWJ}_~XRTX#X~2b-AVZAh zf}3$w at cx)kr#JP`Zij%$1)LEKg?R!gtLK8Q<=g73)3Rdx88qH)8PpO#Da9_CKQt(# zWdg66r_8R!z0{Kqc6{B`cfyWFr=6s0D#d1HZkKav?#8CEgzXhlH(k}d;|iW;tRaFK zphg@$pazPBBZ@!>mCx9zfq;|%E1(&)ewPb at ArbX}$d9}y(uip(XLXl=;hgm11)2@?Ao{=?ukS!1h%rV;6+8$0GY^gUjmNq&zvKJc1i6nWSD at WCh%9;|sRPeU zUB_x_EnB<_jOPQ!H`2K^gfGTe7vLIz4Ko2XnbBSM?tT9aJD3PNGIuP*A5NIXg%&e` z1_^Bm7F7%rJ at xpFJgb)`^v!o z0%ZtUp>x9^1T_$$;V>Yz(NGkJL8gkRRz;RL<}MfX^xSzOuih9(MiC^LC(sU1NtSr@ zt_t%Z>qAIGga)DL`}Ht$oCleKL$U#J9-AFAd~Rg-v9iWHpglhD`Eq)?m)>sJr6+sF1(INIsxN7kCh5A2 at 7fb{v`^tuS%)E{WQVLSZqe_Tks0Jvmq0|5Yh zga6x86N1jNh7O{3E>4#Jkv#D~vnOg*ZIzb<5d7-w3rW|39*s~%Yc!yc1W;0;mX%Tp z55tYdF!@8D$wDNN$s`fKRk?usd>y{8(7(W at X#&GaN8Dm2boIFTFK_O#Ec?=}nlbDSv+;|SA` zse*d#G`A+QE3TbW3<-OxZ>pt-m}QSrJJKq>uC>x=}58knCS?h1p|;$0cEgL_h}frr1XIGrpL&lVFIgkj$szN z4ew^9Ju|tqu3IG1`n#(t%@tf>9`)G3M&&S_v&2=mjt!Yd4tF7ENDyV9g6fgkI_kVZ zI8t&goP7=h^Rz3~9LKHmo7BCn3mJnpv?xPui`pY2q+StHXL^dP)F4dTAWoMudc?M6 zRva+u@~5&Zi>Yf{-7K=FGk=baXWVwH+R`rK-bRdyz5$X{qD>$d z{Sky+?%c5z``PAt8(m4k4Cbm9{C0v@{poDF0M4B1Pn*xnIRm z_niRPD8WtBx4OIDFQ46B at 3+sdxwm`(GldAEFiJ)f@MSow=yOgrvZR4q4|gw z%uU0pToeDd2nvSplz_Vmhh%lvbO7ZG$G=ChX)#r$-LBy|CXF8XhAV5FYemFFGtRTM z^)07u^AQUTwcDSg-$8H1Et=oKQ}cUZ-Y|l2O!f$GxyJduD6B&{{70Z_uXwdAuGLw- zot?69C8vKm(n+^G>$y>fs=($nYE0I0ne>@N7+qTN9#b@=K)WqcWxK^ps<(HVsHyS{ zG)7Qesud8`7lJ`S6l>Sq=9PB_mA!1pI_C4AGB|;79aK$lwTZ z5=KF?U!Wc;O%O}7rm;>OnyfiQ7l3cs2#>WfHn9SAT?l zmQKLac~NpmNf6IEn(%N2O3G*VSM60F at ERyi(J0;(mAEv;~cwAR?Z z9yAk{&TX94FkklH$G=zR-;W`#VCEv;`&NuQyA5+C#*Q(-xaIY}_4K at TzUA%q|NeNY z2N-Qc7Q$fPV4yER0E!Rz2~`;0L6GvG5AoJ8i+}5G2>L+S9Rs&{ zSLhc9B7y5=-B2KDCBbGDUAvu?b>6pg;$SYdW>sFCPAXY7<;UWO3(P5^G|Lm_QCv at G zE0x(%S)NX^F}o30U8Ks?uEuuSn2t;1crSZq%@mdwTsR)_a#dxETC9 at F>I>2<>p?Ot zKMPwlucKy#J4R#UqC{?ait at _YzHI zCQ);ZB~vYZ#&l2csE*Kt%e8KzQYTpo+UOyN`?cCh!Ds9cZyO_A> zXgSoVu8=&tdH2#2{$)Z_`+nN*(Ico*9xF^F6jvgq&I7kWWKj6V_A>oi;U}-UFV!fq z>_F#XbK%4%s5WksEZ0<*nKU%jl;9xon~xPDS9q;(qom3SL&n2ywT-Sh`mj?bZkL1< zlb7+Xz$S47c3j(4k~9NQxbAYxB`LVgfRHG2p!pc at jkXwh_F!wf2OOT1-cHUbS>Bah zSlVlcVyYR+n#9n3oqAeT1m#R5<^am|kFs0lI|q0}fHe`_VN!(QI1nG2;s6&m3LrKS zUm#Thl~6F9f$}gK3?ge83+S?_jIs7GOdBZAvBOVF0*4MS<^fQJ^qY6W?1A3lvOQ$| z>)@t#MN1+FuM7t2HP-6 at r-m+)=!ozP{$Pj)R-ER(Rv z;fCPyY|n>kgmW)njv1LjqZSNVvBiE$e{#GzdS9^tl=YeK7 zfl81nse%@?f+iOw4s?3O at N}GAp1gF0Y=kz5AVCBxT7qN8UQ&9`o|Ahf$;B-=dU@=E zFr|sR{Wo6g(bbc|Ray6FPZ*_bL2&I5IKp>Zt{!;EJ-DuqF^pq=S3?{p1~}Y8%ke_X z%RMU6HpwM(kR!;2=MVq7t_ at UfkD(oe*N7Uz$-*Yqz8KAO{}Nl)sCi z#HafaxRmPClZMffFaj^_zW2r)?} zB_tAC=V31rAV7>fAWQ%uA%vn}(i}B0bYr`o1`DEBQ8~6t1?TkutQCS)(vj zjWEW85f)sE;E({G3La9;qDKnN7$)2!^-$0}bfB6A{)h+X^Z)`LxrTSLdhES%EcyW? z at A#mSAP)4QC7 at r>)JT94WcrSmAbx701yQ}2Iv2^>rr= zajW$vc?@eh93$Z(xi{@Xii)mUSW2o~gPXk`oxlc>p`N_*BCG~e7-kdxD_m{?b?tCe z3lJ8u{!Y%idU8|3W$PYraCd`)q<<}WyWU~+Fl#Yi4u-l?&{Km{Qq-PF%+WMT&RhGO zS?tIq>H`>A%Z4R&`A|Id=U7`n+ at 2;gB90`PxC*J%l&EsSq>SQ{&2HQy>8VX$F%@w` zp~tm3z=|Fvy^NG8n#w&W{aV6WjHeK0~}Q#E7EOPF5O=30WfFY&Egs8lw2eQuSm>VfazPSj}iKlL=kOUqTeb~cliPlCwFK1 at tKEzqsJe8M*_55EnPYILlLb9Q=cRVmRALqc zwQA~kAtnhIL`jN>bC$OpnR_PK4o%^Rv*OH6izV9X(+`Rwe6dN&1UYHh zrMQXDs at 2bwlxMfqRkrOx0d8Znv!$S%g)>5zCqbs%XmXT;-Lvy+g3V7v z2s$s-0o}x?X)HV>RbwQp6=}6ld$9LBu^}*=wBpE68DWf+C;W`mW)uyw_dHo)s!Piz zsR4G26vn7LM7L%qmKVuxzz7d7=^jW9aV&{wmJ5^c$RP{<28 z>iz&DJz+Kad`Ba|Yg2h4=cl$s|8SAM^el}~=u6CbFT^QJdtRz<)1q{qW)a86%B~aQ zfQD97#FB>0IHI0_pfAd8lfG^GJo;SjsTGIhw3eW~hlnW26}(pXJH at hfvr+3P;6em_ zMilf^`^Ro6;9MF?tSQgrx~}1Z2&zsX$E5&7gRakPFo6aeTP$3Bkg!(ZEg{A$NbI#H zIb>jsEjQR+{Z3pKeg98LK)`9`62-N3o>iw$noLlI0BWXc;b>0nK5B|nL^%SAe6frV zF7ybyj(}Bj!1AU5$gMbbzu}{t9s(QSb0$C*J)uTGS|#%jt#WPp%ssS%q*!VNn>n=) zB{BM5$-RA{lFt^5Eh*=93Xx2wwrHW*{~+xxgCh-+^;|JCjF_2m#LUdh%*@Pcu{2_4 zmPR9HW at ct)W|r<8pY^@F8@{%W9noJ$)c30^^3A8Jv$8S;Lhz7q?7#{b?U9b520TF= z4SyivnE(Cn9WNlc;b}ET8y7)qq|_2WvVKAc z8`y<9_zboBPKnOngL2D^JxKEhrqNWjY*IM+T|%t6FvdQGR5Gh*)FF6?3Cb0fgxJ z!U4Aaxyp)petCm7*M*fO4fi&3#-?AQGL}TC5N#Ajl{+HyG-;ASAT+7dn?J|#(vZXuE*^cVxAQigq z9#q*3Hb<>fS-KuR;16ZtdDC%9`ap*IGphAorDl&Fq=jaWazjs?ja&xH)CU!d;0qqq zs%Cz6NvP&yoym8}NHEZcU7mlUL+Y4O>h at Bq_8APg?V3OHca8(n^`RMBH(u*EUN4Qq z-6D-w?5AMtN0WGsm2^m7ks^>G2<8DQGt2{0*m(fXE~R?+RBxLAoDM{Ii7|6R)Jdd_(7bNzGMy`F^(qS%1I z0gzK*czbE(8OPoJmLr+*RnRFv>$)c}?OMEtkA)7%&qlTW9;v0<_x9TnH<)3gjp7DZ zu2$jby&Lpx&*E&j6izg^&}yPXDUqyYiNPla-89AGLTDL9bWJ5j1iy+P()rW&5tHX_ z=?&LE>CM5(w>|tO&NO~$XXY-w$|H&iTd-(wy}^V)w^_x7=0a3M&&Scix6e?SVx8nU zT81g|8G3bMdgWxkSZAZ|Ud}=}%hdWLEB2h6epz7|*@+Ui9+6Iy;Lflz*TXL~%2|^3 z=aNw*a|e7|sHI&!&8hxCn&ZsFlmp#8F_#f8$2cbA|Oj=5%LdR zc34r|Em*|)Q;AZpSM(aqA}yr|u^$bZ&L*SjL01Ww*OwP|yL^G) zi0vPpBW0Kw-(rb$S znE>wIgVbqBCBMiw@cbAOw1xl at v3({2&-|p zgaJZPxH)!%UqpD>nOwmHlGFv!3B4&Mzqo|OaYFXkT}rG=*H71e51W87^$nHv)WXW( zBPDtcB!Q0((712dM{@i)na0*4x at r!pp?j;kp_;_kOU#uRf7K*bi=*TpXP-daBzA at 1 zk0-dDWF^9~@qU%e-Bml`5v*^VM>lP96Tcl9D7sf%TRH(}<|MwyER^cn-H>^q%IK++ ziBF?@IX=R(+7PFED-#v+EaE5G9CH<2w9{HB9cU2{)om{*8^5MHb23)+&JEAZ&H-;< zd<#T?)xwZ>Zpc^Kl}?871}(;J&MC4aMA65U=WafxtAoFKaUw*vr# z3b4S#zlc(Y2Lj^zKSPv|rR at KAZmO${ql)R5Vj~eiHv`k4&_FlHwoRpAO%@JbgQqQ+wG4npgUHQTL~AlPig=u$a(rTMoNwyUqgXgDQXa+K5 at nDazcW zZk0wse`|4;s>CrJjlG2>0&L3Y6k|hHcFtnzBIH9X+dXm(P85QZy(G<9MLb!XU3w<$ zGO5He8E$6%L_$@Dn;H^g-+ST=UvXv|FWs(L5f$n)Ex_t%p1tXMKF6|+G$WaCT9Z2i zD#^}@=CH3xZ9}0MUQ3QvlT%4mGR=9Ka{c)sA!Psj-Rw$lmiaMkEjE};P?J%%io?9D zI6*9R)PJ?p>CplYZ69rG7LKlZZG%aJa(yi)PuZOh8gvo&nV{o<)B9kvG>y6%L2Kmq zb*6m=;r8nz>Y at 5CiIowp)rQBQltpQ->9&d=i$P}AgIMzoHj8GuOmC&xvQKjr_A=E; z at WNnWCez{>_%V97M|$YM7VaVxR>9*|qU;LR-c*e at x|M13YU4>~ixR;-3z`KnV}v)2 zP1912m=0n}1(S7`ku7kAQ@@K*UyXQGMZKmTjYwG<&0YEzF)VxNLKsMi4(z`$KAW at - zjOBJ4E_G2R(=3KWS%`?1xWKN%rJ at R72}*uYoO_z%tdztNk5DgmChVP8OLodMYJ)&)q zYM(FN73176sN)~KV|%R1;6(R?N^+EYVnoUThIIJyyT{?fxXXXz{+gmYV3;+K^gSow z{_)qHcDT}>vEUQ7t&t(e6WSdC6#k3IdZ=#KK9Y(KL7YLu7%^qbx^6+t<0+B9G;Xak z^%Kcjb4pGV2vr(fDjcBL?n)50pn?gM=;FgfHM zn~)R2<{g6AL3{YvD~w+`mtQ%xA8LalGk*7V1P$LG0G=PsG1s z5SIe_B2-nP$%iQ<$4GgwQLO5;Ad>}MZAokNnqIDzJlOU3{1yzHp3pc1_RsC!K<3=r z9k at ug6H1C43FebH9AZ5;-;WF^SX51fAm=wU{HPV--YD#HCA1N6UzvHuYmQ9qZ* zRYm*O#WXW;xA1IeKqpus)^$szFGi&K-5?NEOuG*0g6 at Mb?wZcUJ%2I5wu2E9LB3>B zAbSS+vt0inih!|p(5j%s$6}Abl;`>CVx;d+sA+$e_cU+ZHs^DexB1uCaWg*4=)6(V93!d_b}IOBB%qS0px$s|*9!`pIq0(juncBS1cp})8yL!n)`9mWyS0-M5BQck$3CR5a+F2a9S zdji-}F=YD3Zi1vg&Xtd`R>-9KLX6vU487-UQ9t-0ep;@Tu#e5)l*5h0^)p}S?A`6b z-?7Z)8Y+-ykTJ)mk8zk{p_hRts)fUa_FtuNGmho2y at 5IQ7;}KEKYT zh36P at B)i^4WbGf&=HwY})kcg2pkxkuH=imcO-gUhRdeDnoFnzc^YvtX2o476~8s%cBwV+vP`p-SSxX;M+e0p<1<9BHtk~x zJOpZy_?4oH{4ppzbum%w%|;4X-#MzBh at pv0Mw_~z}>dQ!yWIW!+$8podGvDkQ$ z_-d7$GR!UmX<#oTl#J64X|vl`^0=wAMXcgtmvOn=N3;c-l$=g zIP7l4H8u84%EI5G&nfT2sVY5iS6j;0EY%pflT>a{6MZK at jpT~WQy&J3J>>xBDtuC9 zDGda}h+nKle8-wvTF)zhkZG-NOmP{gDGEHt6jTcERu^Z_F~h7{Hh=ZtS1=YGrksM2 z=foSw#IWR;bSTkthbui_mj+Bx!wajnusAo&i?NOCHa{N_s_wT+JWj0+rYo%;7Nd4H z2Gt(^L4g!}6lQ92W+mO!xl(+XITxnbjE#9wP{H3!&}FsmQD!ZzfI6B+I at aV7zsKkF z$EQ}Tu$l7-6w9(8QKZ9;st*37m3^9J5$RLl1623~6|!DaMGys*b)@{H9_C0#Cpkk- zkeg|dwva6E6*%(%GJ~QBZ(<$M{w(rQlAH|^aEdEyc_^IKpJC*`r^MD4-`7`|1C7hC zB|yeUg6%G#>Z)b?J;07Y<(~im^rOXupOh7m-QYa{zz>xz#%vp?a(Bb;Jds3j4lhN= zenC-ShoBB(!32Q|CKc(y6hV;bgE7e{Ed=tNF+kP-!b&Jpjteh~o5lOYTl0AU&LAiV zrKi=>7C+%rsl{E_$c(TZkUrT@;+gr*DVILrEpxXvhD&8U;~QFH9^!pQ{xQxy at B(l6k;3RFj(LqdbnPB^i+el7C?_9y zOYJD48v;GEwIbZ`bEmW?oq8depy*a9G&DE{)|hyuB_Y#cRCYa$qsjN4YP$nFhF9Qy z?Z-HQP2F#Z6jhxSBh5!piw9v3a165SJ|azWSq=gFH%Qgntz0qw0d^tmL?i-GOP$~s zFbQM){D04g=13W_F9ZPs!hi$<68pbEqMD(N>pvfe|Dz5E11?=D9XOR at Z*ycZp*om; zIl71>lqi4F!t}VSa;%R1=q7rvelawmmC?sV9P?BPww4!WgL`XsXL{>#dUpEe`|J6+ zJ5aqwG*N68cF7)Q&jZkvu~;y&Fvu$hCr@~ytsMM4Hold|K;E?zxAAM=VV4UQKziLL z6$gI1E at m;sEiiw2yRJhFG|f=kNGlt z824cNwIa#nqR~qjce=+dB{3CZ%$}RN;Q;3PhOT(I*w1W!p3Z`4%7?Ft8qt{d5cY&@ zxIZ?(Z5DB_*mayTU|pyiPE+KCYKoLs%4pF}OOiN at rp+-gUtSjCd4{H#vJDjGKWo=F z%CYR(n at 45N8oLh+MBA=gwHve6MEj#tP5XZiMi$R;ujDjgJrcS0SPwT8i~l3o9ef9NI+&R at YH z`8j=>k2F;glW=AS53uOmjpA+81cBjjti>#2+h7enHa)uc98+a$iEG1}vgFtZ;ra?t zU at oVI{8hx9KrS_n1h9P9%U{J7f=ZM*C_(6Tnh%3I7-V$yqmo-2MW|fYo7xZr-UD&Sj{QS3yG at Rno)~SEpfEM!q_+r36xxv3WK}wU3 zWhD3j at eVApk!5myfnQByyh==3q*&fioV4b6!a08HI?GOV0-{tw#DCVJS<>pGim{zr zU-k4nT21e4CE)M&gH#v at Mg!EE;CsS`q8YW=_BJ_$8BSp29LVW%k(gSRPa##e zaR(78CrbT>tg_v;y|WEtMg7?@UYGf2-6cfUXk4`+BPnX~4l)=A%+5%5RZ5YH{m+Ow^xsM46H2JtXAQh1yT{;U|7m-Ox!X zbc(56Mao at A`1a6r9je7Tld?RGrfku?HJ<90)sV5qV at A~Uqq)}0g=>c?UL3z&9}ZZs zs_4barl|*{Ok(Q`>N;g#_j`7d&k^NQOYZnPue#IA;n{Dn_tIIPtvWD_SHVi+hc;P{ z9Afk$dg(WX;(;OT2m5#dV+Iy*aS#|ozKB_VnF?^#ck3H@^CV{p*aw4O4p>f~ zC?#9u7Ll2PJfN_WTH+S$A!whn{bH6)xg at 8&d!)dlKD$4-A-IV-0dTy+(=QYnw$xN9V7x4{RO64g-26#d71r{h_fMolUu-QA~3Cc?9KhYbIT6m)m)MK-JRG?U}V4 zIpi#P7X0dACO7B`9B&c)FwU0OihshC{`$8{e`UbYU=@Ey*MA at S|9#>AgYz-bf-rrI zNTS~sjaslvI4wwyrYBe;y`e2PU`+6q(isBU;Jg{Ih&%ZMRCYRC{S&!}{#)mt9v~9P zVNk*%Atwh6jdSgNR(%&P&eYYNG*?{Osdv=S^Hs`A?4c}>n at 4=GOhmtvszYwKH0WM_ zcNo{IRjPdu|DXa6 at wm?V!>+~_V+SP(`9qD1B=$JLA8P#DV>HW>*QatC-VGSyH!z at M zmuTkFajWyEmFT)^ImPyGg<*TS!Pq8mv&J z&B~fT3semN5bXD at G8C;ZiZ|96cCHig9vsU9z+bVbMYIwC`HZARIwe!ZM z3jdJq*O!;zxNA-pZttVI_C#pUoQYM>Y45JAc$LebS9r1{jMGc z{ex77+woLYn?ZFnAJx#HYAO#UQIZ^`8&`DM7eJ6b^-D^mnU8j_yGp~&gC%$rwU(o3 zuRA(VVFBK@@{KPzzrt)pB}|U$jWGJAhg@$$J1Be z=8ZFWx5AAy`sYh>kUq^zOi(Ij4-#j>=t*mBQp)tXCwRB12D>LwB1hu5S;F&aJ>(tg zTB{|U>Op$9vBv(G%L)Q{Xq9f0teG>ouiA?GxLX~iM|%D|nHQz<2-zc#aJ9C%5`zqy za;Qnh`Ko~}C)@0;iQbr&b#R%{)Hyf+f7M56e8OxV5(Sz!_qYI#Zi*u(Irl)S60Zgh zug;VIc8KwAZeBmst8c{PO${sXt=3S?B1G)@vF&9pR`ih zl8dG+-P#CA%UZXRcC*Lq_N9|HT7G*FXU0yO);m-2%JI*y!jTcX>BMqQ%|~J!*f+435|I1AZ2p9_>LK-Tbf at udpwURy{Qm%st+qXVM!}ONTv{LO**-!b#_1 z<&hf1rbu+gs#2JUKR%5YW^XMP at 3c07dZ|*Q+IXah!orq(b79UUZ9~%uY+{`SJTl*d*vimaruJs znm7}H&)?2(LF(pN-3qlErI*^+p8IyKeADgV2PrPYQQ;+Aa~0o)SV=5`ye#Zjn0Txg z>$XcCd2({FsxnAakxlj6s at 3eFYA-X%dZe0vF_#XcPn(ph*WMayQ>oXDm2`ltr|02M zW!J!bNL!~?(tfk;97q2gC0G1zw#!R0{FX74t&9$DysUDVy$5}IKqXIqlj+;FUTn9@ zYUv+EeHFOczLH-G+^`MIyz%q*UROMHMq at N0XUyIy8jB$!!>d2MQPJCmt_<}ruu@#z zqC}FlpJDsY1r>GX#8oxo!Av4Fl^OAi at a)i&&KG7JrX0q7=DUHtl2k7sPmY zUW`K$!5IS&WQ$Yr4CP`yf&F5R)dhei(GuJbP^a=G$YH?xMCsifmHBH53fuy{BS>uV z?9jlmL)v6I&9ubjIYHyURI?^R;&>gltosfm!`#$VGjFsdFwt0l#^g^LQ%pHzUviKH zvG2+O%-;RjR}$F`Mf_~Z-tMrxhov3;Ov4t{$Me=b?@au`@r7ICf$Om0n>XZTHpg~%pxqs261`mba|n?7kjGGWm3^ae|uhF`Lb-$ZHOYX);8Y9W&QS>X2w>@oY`e7gTY6M67Q?l0qfW_MJ%x at fL1Y*~=+Ifrid4!q%DHxM(aflzV_pNr zj^R%*-3GHt`9#oZEaFIb*l-d39>7YyMx(?tPRx6Zi$8C7cW+B~;8lN=Vp|>ai5KOA zGftqLxU>b(xlr&5(pto1zAh#dyyTAXQV9D22tftkZn at 8~RnTJ8uX#5zUWwb*b7s at DkHt#04Ds6utbH42{r_ at _Z*dNXk9 zEz$EtyCjf}8&Jr)El}$1ZsgxDWZ0d;t2~1K;mJI6$&BL%h5KimxVazBNYD4p_?=G$ zv2suZqRt*5bi4Z~a)^9^kl=E0uwlo(bA6s8f%9_#^0Vv19>&`yv4FQSOwgL{x at QUC zbIXz3AHe6gSoptO at JnV7@=^a37jnDc=g*$zqgE6fILdmG|dV{xxF{) zq5w}o#uQ-$GruBt+lcmc_3@#j$-R4xm9cmB2m5L7MPo9zEdMv)lY`o7D|TNHS2a+i zRg0TeO}ZWAv~Dq;?(|~CcC!Yoq0UsY)a2|Bjc%ZKGGKG6*{0oejAydR){$9u_2j at E zu6cJP_Cj#87`OyJkV>5kV7FAfkKN>|vW1NFKA}-Z*IcNb-Dc-ziuNT>*kq|8W-d*b zHM#^&Ox8{XPEG?LtK595bwPMEPRvP<+$5}$bLx7Zk~qc*eiWniTtgl)p^ke*<+VRk zqq$ygjEBF07LixM0#OH55A7|L8O-6h8>nfQiMPP6_<&$q&0`fze_d4!!cF;+qLxT% z+h6gFqCXCXkz#RP>NgTX@^~bCx^@J;Z3YPhIULuD72VCZL%(`S(N@^7tHg)efpVd` z2#|vXaV~rjDm at 2jMJ^(#lsJt6xNH^+1#aN{emc~qsa<9KG?QG4PAPV8LrCVt&U9iC zxTDiY?4MfhnEKh(S=M3Zo(apL4++zeU*ZWrK^WpmM$8cE*%5U9&?%+uS?y3%_s}6H zpHshstLqm#!oqL>AImh|8ia$}s0Xz5a1t`N49Rcgl6Jo_hE?#4VP?cnNbe`&M0B at k zAO5{zF6{^r6?Mm~7R~NOnX9NN-6A?g8RZY#j77Jg7CVw~Vr~gx;u%NlJ~Y+$=eGWW zWN*;Aa^g;<*o)d9du~5ixX!xg@=0gYjO;h63PWY`P^bnywZnVt&woF)rV zU>Ia(9ry%^>70-2xR9iqkSBVxJtXF#Mp at L%?>%&gL)ZxucLo!z8azmOKd|0o7}8(L zH at WZhFu9wtcI+5#?MCgl&RV34Kh2y+Dm)?2IYJdu1WU^~>NZ8NReX`S55UF2)VVW{ z&$3Qjsv?u5{Lcq}1=!XwZ?08u)VF=&0FZQ$th=Kc1}~ez9- at rjEv|Am at rMmmjhG-? zhZ37+VMepVBsb0nhJdL#)Azq6m+GXU&0hb-f!tplaQ&BXAY*T5{x2-}M_a)CxEGRh zR#_qFlAt2V^2-n#xMFxx_!c)9Io;A2RCZC222J@%we!t7YjI?T8n` z?ky6r<^ujc?}Uak=UE?QVayc=DLB>HRHK#1U3%dTovKT;ia~gQ$zW3kS$i?o zk6@)H+AB2KN!QkKhpK{gx<<=&*~ChdCYva(`2#O)I;=leH*C*&S07Z9)cq~vc)~2_ z8;?E&niJ9k{|pwEIMN<_?D0vR#s}t=ml!^p9p}HKqLXKX*s6E zx%-t}NWdo1l1D#Mq^lN>JK$A at bj>&^g}aDkq6)%xV%KiC$gsmy!(G!KT-5PGUUPVzVIgpiUv at 6NmKOKEkdU!yH3P zpi=>KN!jJr^Qq(12=CB^E;FjZWtVw|SdmE!Ev@!_1+AvABkgnfr?y<^el_blnV4&R zt3RuF;>XQ!ifYQfbtzyHy}U)}Hc?0LGBh5L*VJW(;=S}|Fq`Y9;M5l5#+{1j2Q_(w zQR6U2j+}sZICXsrGPra@!-lZD7$xFsw5P6e4C;2AK6>@`CP~8&>Y_}EWaLB)({rMJ z6El`Pn|fh;;PD60jG}hFP^39xPnY|7k0?Gs^C-eD at laWDbb>j6hx#%4&Eg82c={kg z(@MOk9w5Cyy#+EM$wjVo9^5SwqG#Z>3pU#~fhHE~Clvh|Js_j>4u7lP<|BC)$ZO_ at eTDX$7I%<9_j?O?sPJ!y$U=G-XQ_Lxdz!Gn)}R0)W3@& zyQAs*T$!R-2 at k_#Q0S>Nhq(kR{M-o;BB{ZKQUib<-^3$!$#SBp{u-nE2wfodrNHDy zAiW(UTjWha!&`CX%q<9RjYUE>zpa(`3C0v at B_q9so&u+7-=RB8Am>pk$RLpT`So44 z_X1YQwn zISj1$``=be76b^~+u at gw37*UcCB_QN`6$fJG z*6gNXgls at IJu#L3dc at 6g{QKkOS>F$|1|+=~JxSxYIb&=LZBCyV1gFkqf=8-oI!4n< z+mKpl)j4ei)k58YXWZaBtzA*gq!-I8dQjNDTY~- zZWGUH%2eCtES$6em3E4YRLN1>96F_nOM79HZM&^h@PcRg+b~11|bvS9Y_Usaurp6M<92RtK3XPbaQ(hPH zj&+DjM#E8Gc>^kcp6*t|hD2`}z{$4jL5`t2H1#HPT8W&VE7Zm>;)YSuVlEL<`l^&3 zDsihSoVmtHUZKp9FjkpKtIEbBJge`syzpzf)$I0+er;{ut#MJK_wi3jk!4R;)0yz@ zV#M(=t2TOF_oq2#!)oODZ+9b at HY|jn%Is??N3M8hJy#Kmu*1zBbQh6^m9F2vu=II$ z^_$yc>Dl4=&`^;hrL&Uy{sd)mRPPA?nCB?nA=6Q~LC#UXVWOvg2^n<$c%#y0vDq{_ zXR!$J!X*PA*HFxJS|Fw`nL%s$*!C_JfW*uCkVMX at iDVTqaA7=-v~9FR at QJ_~9Gikz zchMB))~l>r&{AQ$bj!>sJoO3SUgMLdk7t6;N7g}WD|7)lmg^7>O!6PJ%7x|0-o|!9 zE|1uMSS>;#wP0q&d1IEjr}W`PJ;QLwG14RD257!94tWF|j3$bc(MeDo6A(LYBc_vZ z?r|eB$}2&G)a>-b=BTIXRb1VisF at U@WBXXmXJ{VFsj)s|@o7SbR(Rlo%twD36 zbqx1NI*Jp=PJy}^iWIqOWPHX}-P3A)4HX}uo2w3+r7RC7DRS~v;_QfJ|9HgRBBc at Q zp{5V(u at C(mf9c`Pie={JnCp=tU_}i;S=du3tM!LW9-@|I3GiBqBWRHN04I|zrpKik zn{L%-^1COR;t}uxG4~%j04<_mJj7Xj_YGI<=G33p{DLsQrR%JECEXt4?xI(+{DLJs z at msisEBOZdS3;=y7hn*900Cuy0|7DoR|xTs-9?hN{X8Su at b?v+b_x^b{!+|3<;+#e z52C;k6-#UI3Kd`@i)*_YX8DL16!(t1_#Nm0P=Wx&P!35NF4JU-(cn0S)ce5gty?d7r=QS2CFrbU)SdN*MqeOfa!XqhSl;3Oc z+z2B!{-X&q#aYBupW1Q_ZqRE#Eq`H_0IXk1pZeAd6JF#a2T>?P^U^vuY?vqI)PqNp znS$AHlt z^Sw(VL91Sp;`yk|O>Q((qEV^**jZ9`%1Q26vVvvWw<}E{E+>b%ljl at jh=`88%!1Wv zl)3J(%HBY~T)79`ie~kIT&>(y4520RXI)ea;QS!D4`&rd(ocLBR?{uEYG16xEiqhs zKHMnBgPXiUqvwsaAc=x6E&?9Sk^6kJSGSJs at hZMEcMw*Ic8*({e3QB=xmIL}s6G1Z zpRy}i{;KV`aIgB$-_ge3hx&i4HbY|zQw9e^V{1cmQ#wmKGyDG(nyf4 at BCsHm@AS(d52`qfiNcgYRt2W73q0NTCYk?+L5XFDin0Wwjf0)~a1PCQkP zWk1LzYB>qn#=P6{8zfhvfVr+lwer at P&M;tjiA!FOI};Y}$bMRM?wV3PNpUQv-Y4s} zPg5I{rB%*TJoJ_%@Q+iuOqMj-=d+fvH#D)dGZ+4k!9UJ^lrQBL1kiXv&wr?? zDBQv#%SH=DvwkH{lD7cY8^%QJeC6T|DP>KuUZUON`4IcR0P!W=x-c~wR{kQ-_CCtl zaz5TToz~y>2l5D|0LF*VfWM*a$>^~u>g=h1+^yw_&yQz=*^Y~Aywk>+*9OVXRxVa1 z;Le2fpk?eP5LbI6o(FM0hxFFQfh3vxq48L#Dz4?b6b543XKM`R<(eJ1oQ{hlOLmyR z=tR%VWs=4*K8Ps=2qvZS8TF!2{(;Yie$tiaa6M<*W>P zWO#jvi-96lWXCc%=|dW7+k&C|?ha&aouTVGA*rl`iT1tPc?kzigU9|?&zV0Sibi`6 zcHnW${s!k_1ts(%!`u&~v|W~{AK#sBQO%IHdjVyG8 at NYUlX?9Us%9ea3_Dt&_gpOO zQ%o4OD!Z8j%?|B-;|qLIS36fGonh}f+|l?By1;&*|EdYD()~z>zuZNI00JWUpJ?Kr z#h|jTger)1Ndz5;j>ZrW5RMT77Lu%kJ{=C z)qGOKSfqYWxzJ-T%BV=8DpYnp3nlW61DSm{%8&RkBr`OQy>gFrl~L{M}5i3UB641wM=_2 ziU$&n*Mlj<3*y2Ee`nJM2hlo at wIztF9LadI5TlMTEGF!}>X7cHOw*2^6+QTXpCYQ* zy= z_!+K&_~;$OHMtKS2n)&YXgp-hFboyCtQ+P#DGu5%x<9Jzng?OcpxCk|CL~sT?}3Ru|r5!pL9o6Mf--&HX%QK2nLFmS_e{-RVMVy zqqG2*%BQ2EYY?G&-2aJ}5jZL%OI~c}Qi${8&qkhhoJ~)hGo=cz*Fy1dm4A at 8`k7Sc zvnjdk+^mqd*LLT1r}y>s*Oo8CS9kRyV!jf^!1!7%v508>;H?H!lbo(FpM=}KXtx_EA^A0AasdyxQx)>gQ-D-ZZs zNRY;8g^Ex6y4&EMOrrwhxiWMPwk}=Tc+Mf$mr2;MSKrj^*l$(lQ8xA8Lj7J3WaG6R zhA=rfzxaba!Oz0mCA{06QjBvdQ+`a`{nn_lB#(E7?VF0K8*Jh)_Y$ovFd$TSkX|KQ z)~%bQEhk$Z{UMTXVJ5CI<Rj9yfvJ9I zzqO at eXxmw@XCM%)!8C3(dQfgTkKFVe8zeF6Q~~Bh{7Fa&N$@)<{2YCf8M(&B*`||{ zdJx-LWst*BIvFNY&8^s3eK2xltxt1Ij!x$%>{e|r=h}``w&!NUAA at i3iZBE^dsSLu zFRdie(T9mU=;8c?bYPfHaj!pSqQ1=Df2`Jhn9+ouH?XR0IHh6SN+59(7R)TgeTJ%1 zV2>=LpJA^w@``$5!vXikROAZXhyMT)lcrCqxoNzac*3-`y;EPS`FdG9q)8-vk zdwBHNXM)AyFAQhL3*toiqtK!#;>in|_~_v6F+EW29dCSHytPi32;pe+@(gEt4AUU~ z^vpRd_WWFd(CZt&Q#iGQvyp2eq&9PFv-zQ8K6_Vwnl}+ at O))0Dm at ukaUUIzB?o4u9 zbQ6izK&n=rcyf2kYoRgK>SMJQSyOqmfDX<*hZ+MpGA?5K?Vne!D$0>?I!@HdPJb<1 z1wAC=o!;K!++^B^>5f~^V-zJdSR_GWD2wY<7xN04VeG`flLUH8@&f}sOUnLgGa^h@ z&YqorQveOxj%E&JL(}QvahT8l;(0iUpL&CX^chqNQ3dO`bHbOhd__E0K-pfTe52vhG(NzRE9 at oix!4)tU6fZZOALt# zImu+AsKNc6iDX4klnL(v7a*jpov(`+%J$Gb!(~0Qz-V!;oP^jE;6|9_4#3zPcn{0( zcn18yuypOh($di{b8c9ComV&xb~U4an|N5PWuHfdFFZzw$z`9JKZcA&QB9oC|V`5`z8Jw7$*ldK|n!;x2<3x at v>&Nlr5XD4!HN{p&+qGJ!IfB=S z07-&5hyaO#F^T{Qh8%oX5q&%G{>R6V=lIw?g6;|PGS)9FR{8^XmSmmNS<)0vDRGj% zk+Set#t>ss2 at Ar~(yVJc_|P?c7_%0C(y?QRo8#T|M at c$Cfm}<(#|&b)JaZ7}gZLy% zAEt!5B!3^JMBFdF0S<|{gd8K%BI}}S1KOhV4UfC~J-2m;5-?NHuRO>%`Mw8?qno&a z=2S+^2i1_#RdRyufEv$^01W6`#krqHmua*CU#GXLG;a)J4rX|p5tneE_$bgr`E_-P zg7tM#$n^;(Ex&pCG$dQYHt9-B%itTpOP9s4uf4#BKhK?mh7wUg*I|5_G6qq+{<+fR ze=G*)93GQMe;0!@SRf##|H)#YWNK^gW at sa4?_z0YX>90XY5$KvQnH$^GMYFVZ@=F} zU95gto<%s*0Bw7ZLC`Fe5z;K7K1_=u3TkG)u9%zoQo3eA^((k%^ebrBi$Mi(hDLH) zsmh^vv6KC at i9>3wNM+Vlm+y6J={4`>IRE$87i56)%{@nSsGEynJioN(hJfa2&w$Jc5cSlD*q0q1t{(Ef?0Zo`HKAHd3S=ouk{4cFk z#Gft`8>l#azhO#^rm8m*)ffx%eP{o05LhwVz7!F z(^Us}2x*rZc%E8`&9YulD{3B~IDl#Ufs7`SxD?NX_j^?(Bd~dQx;4;uxk+X5q#=7! z1M&QOKidx at PtgiX)jJw!Qix;wl~bP8{Vn50L>6Ms+RF0}ad1RUVyMuzoOk-S-b*4* z6Z(kioN&H<`kJV~{O|r?u*AFpnSA-vIMftjqS}b!q{spg33z)o}cli0Vt%K^bEi@`|dn+Jbj7Mt>Vjpq)%YzeVkc?r0UX zKivXqvSB1?r`$KY1&IR&=(HPk6*zPinwPc9+lE`$A=vs#=EJs-r8MoUX!EY-UEO3P zcNXDq!Prt*0!fpxRS6FSFVusYN7k1kQLJ!eQ1BIq*u3?g_md^Z=^m~rN+osg}Ij~$b)S<>bqQlVKs zp{~wdsQMsOX?OvejJ{clB0(8``GrofnE2;!qDehmf_)Fb{rV=%Pg at Bl+H-^XG@%1f zHgK2u1-GGF%T5Z#@)(OzMS?lXihc>#e%G#id-#+nzl02RmY*o>rVh(9$>{U-am3)J zQGG>T%%|C^VNFxIiJc(TvSiWCoFX$>oiLmk;@cl_Fa4WL($zG% zgmX0 at ITw9p57*alBA;XD_0l|}%`k36lP=A%HHrF*yMOtI^v=;7m`7!jbRH#8J!)V;yA!R{~E9Ke=GFlpY&fLZWSNgIN-NA?PC}Q zgQh4*&KHuU((-)MQ(YdlxxxbXo40WpC5 z|E5m|AS6<~`{5GzgS=l&xcWC_M~a2s7Zx4~YN$Y44I1UM6+ zijOtQF%3$SLpmFXYlt=4MU`o|6UL_x{ia0eJh~09W}ZEJ#GQo zI8()r^=w7OGB2XI0@=2xRD!$J%8v{X#j?H8a7|{Kc7G~*X-iob zHYn2A4VPiiPaJ at b!MI}SW43kws~xf=EevJ<+QIn0Vh84b*g^5X+d&IiRADw)+(;k> zU8chT3c5F>$P1~zcU_51Vg8ETwm0`~Z*(A-U`HIwoCeZ}$0cFY_uftK=<;Iud6**L zM{FdcVq>kjac;f?>ImT_^8)r3i at p>4fzwg!9LKNvsTxkRnl~$I%rQN}!B66h at RxXb zA)|_%J5P=y$Gm%V%i?=NLm**G%Hr^MB6$=+nf`m#gQ=v9&^|Ius?)cPT-awp5v$RD zK7G=Htt&<}eGg_02tVo)IJ3f6kp&4lBmE7CHgQv3$9&zy&cFxZfLLafA^Ji z3ZVC(B_~G*@bC#uYje;$_s$Nm zv-dd%a9j91in#*oy2F#lmKd{+-PjK>`6>e?+?Np3oE40QB5)<~MS4ty0I8ohk^5_` z33nVU1lDj56{@|!h6G87d21#d{#R-NWW+9cVAMcIiXDMS at h9GcYc~>{B>bRhcsXeJ z!vce0d9%jM5S$XXlTfV^4`nqB(6Fw&{oHZ8_$q2)Qn{Q!ub?v@ z|Ka;)XE7wUtRm-gJm{BrME}H4b{vbCNhtlXvFW| zn$U`Z*LYbk)8s0j_|LSGh9z{_vBt~ACJdl`1Wop>dd3^8lb6hY at +`6N$O!5GX;9ey zMNlq-{xB`+OQInErUENTnYOfgD4*eQN;D*IUqa*b3cQfZNeSosv1PZErn;}|gjrxq zoHRMUseyd(&w#$PFVN;mIcuP-$53eVqA@%R%J>33AZ11e!G*ZBE(OwRReH3ESiF*LqB3-w8?R)%rkqpVNLZ}ve) zJUyN-d3Y7?sMPvOCZ6V|woGO;nf(fx>71;yzwmhdCsf+OUts^oQDOf_R3v-eqmtH7 zF=t`@>!`~xMzv49OQ`@|GEnG7uOXz#x-~z>2s5_+H6ByW at 1wxaXjD@}Bp|Pm-XE+C zv}e3Ly*@xr_6x#7&C;EyFBntlLa~VdgO!$>34X)J(}oXLxPWgV+9 at +nkhb5F|3*JiVUTfO-BwGRTWPN7p#|`zin?zktQ4XbLMwk>#Ifv)tb7G1n zyZMFhe+ce+Xt(8kOr20_b3yd?mJAjg>BT{45I^v%-aFln6TU;dOH@&>$1M5a>MP^H z)x$9dd$`a$r|2VD)X6$JFEBiSQBb4&Nq(r-TA3BI^%}YY$9 at UZo#W1Xg7B|V;Y$7j zP=Npg`@4!YOwe0%tf at e?jnQamR; z$3)D}@8buD4+N6QU8Hlx9|*#e6NrMce?Xa$?2!%XzY&7ViHu5N!9Qbww~>4zlMZz2NhSlHTYdQubFV;ZN+UEaNo*sQ=$4skWy?SZ+)S-{>Ei^Q at +E}x!SbXr=Me^! zqS6zKWn<%D;X>^xwu1Hn&u{s&G}o>=UWJoi&h)gF)j)_+6WbO=L$=HGh=HEO9HERJ zj8=$wsoP6(OOe8DEv5u><{~h&G>ly3`wjDZF&gD*HWkIsG6NL}aQ3%#sirBn5Os%4 zi{fc6V?kqk-ZKSs9C-7WpSjX;Ys)n`i5lOAbLd!Gl^kV$tdbQNWy*-#jwU+nsCT}Q zV7d2$;~D*OIyGsrY1Ay|OzSZ+G>+4vu2Dg?t*SE#geYP$O%Ud1$U^)Xq!NwV&Waqe z)rgCGY0)Y{6MNQ>miY2h{}(SSr&px8Lvm%K&bs+RsmD$|9?etZv3utsPo@<6AcDrw zZ$kNY+h-Gres*- at -(8i8vi|DJgL?aEs8;TX=n`efc4OUtHQv+L$k8!? zQID&;iWns#DuT4(H|(LUIJ3|en9 at 07$7xc=jnG*Wl)*Mn;a z5cs^tiHLr(3PJO?w0L;&GiP*#z}^Q#E}P~R2bj>EWS8JAxTNNACj+Lc00dMtd!(|M zhc at 4jvrov8Ruqf=vwh-(wK05s_jaw}Q~doACn?HEiwynG$xOATGkodCTb_h*qIZ6i zJ<6CfTbTI~MjuIAyIhz`aZ3>Uok&-^+*XmfljqvRJvl31&;yZ{3Y6k6(O+}*2$c4o z7YeVg6!`eZ2sZ)Ihu^$l_9CrmYEZ#`c&vCPpI z12nnz<}S-fMJ-9iS4>nh9HigAFU98b#HePxlbW^Xx3`xqgq^R~_fOD2Kh4olZ8zww zDQ|9CL*b2?(;0O2#0DE9(L=v!_tIOl+$sS{ltfwE&qYnJ?jjEdSje2rKvL_MTj zYykqzAJ>hkOd%2)Ir!QQ!64pB8>H_HVhUM|)qNr=%BH2KBkLQChxlnKYUKcwrxFaZ z=nnhIIrXNpSV)b at Pxn2t66^)GTaz~mMKjRmJoPRTbAAo9)p{>*vKR1YK*aQ%2I((Ey>u14 z^OngytPA}+aC at PK<%RA3Ke6{X^dt1OL&rmfoDNw6# zQ9k=%zy1JvU~II{U)3>!Npz?4o=owf!N8dQN9y=f8_HU8XoBdkh4ggs392v~2$zb+ zZS-_1$K=SmFcbk{u*j%rUJDF{JVrc*cS1X+DdHii4-mf<`dOC~lnG9p<1)A$@6yjl zoA&>B2OtX!$CVitBKqd4IRustw>pd}n;Qz39l{BM7Frd1RB68IVqztn6oZMbL3TxH zK9qEmCo@(T4^mrn+}WZ!lly at rqIqXW-rB8n9~6J|kk0GQM~**n+q$y2&j)O*n2pyS z_#A*fMbT5qP9|+Kd4wXYFNNu7R5Ia;L!ulxG)uE&DudyGP)mx!%K+3gzN&|wPQRyxxg)9PB$+$H-S)$mvlxsr_fKy at ggw(X-gT zx3#3M138A$SSZWvt2;w#Cmv*Il>ou(XgItU2aP1?FFYzABZu%hW~ip-StP0s(u+Eb z=Eu8Ep12(Dpsv26_8iwo#SzO704hvKl9K znq*S*AdsjZyWrB!Bg9{&x>cmrzwvHl at sR(|W2gVERR27JsibB3hfpab;y{sixsgd> z6-&YSVN$xQ$dkG9wZ--NIni-W;)N&U at hOXXKJnRdetrT!3CS~8do`tUXq(|3&(^uF z?e_*Is at B18E*5%FIdGfLbNnix8*yC+<1 z!be!@uN`TgF$AOE=_Ija+?<0;GvqZmi0{)=?-=Cnsdj`4FHoz*o$9HWY8(3j_W}~e zX^}{ji`^TTKEte at 0J^4(yKk-piJ4kv`da3H%bmCPuf5uGfz%{E^b+1ZfF)KIh*9AS zzNr6VHc?mY_sakh$x^-OVT|>L*ExJglvyy1$p&)?e?>=cmGm)t&IlS^#8tA{`53C8L2-C1tm*^TMZq-|TR+U0eIA3$DFM)UO-i)%|mkI;k=t$j&X1S}m-*rMnu& z at UUE7k*`kOksy6uPE(>PLuUM%DC at 9Wa$Q-v`8A0*LoU`WGoqE%oV#Txu{NPwTq|Ut zFE&B$3ZZT497CVeQKsNQHVt{(%sTOKsc!ekfSd?V4)@q;=)Un+gDw_<*0CpM0Y$o1 z2*VH9t;7z1Xps-^!>$D9Z){c)WOsFpTUf1wkL~#KND5!Flp-=Jk(dB{a1lBi|3n)4 z*P2M>_oN^U1qLSY|LcwaG38_IKql&BWB5luMA`Pg{QBomosyO<>N|QtQcZ!@;SInF z%MW|ohpVlb>WoS2B2A-112^B6*s-C&mJB zRp4-}3ziz022ZKX>zipK6eMEwb8H&O?>)tsc1(XI;fVE#)~OeE#?#`3FUxE;$GbW{ z#D42AP%o!Cbk}y5v3Vwm+U#LctIgj{z^-jcQQA!d)P!;8#3Ys_qO<>)L6!AyvI;9# zPLOC%Uohtb^tUUG7^~w7vMC3q73G#bgxX=<2vY|t)wCSL(a_4K`~)0D)>NJ-(=EBV zJNW9lu!-y*RU3Anjm}ciogEvYf%T|Xy7#X;_UzSK<28*39AaE!3InDbr{G1>6G^m# z9`RCmH(5cFVvG!*IEs3QlNQ}M at 3YqxMLXV*GzcMHLKqd)It{}hXysYi=UQ;t4%E9c zgS_zNzUvQ;%1aD|lC;sj7#9NH)maPiwx{cOqx9$um7}XR$6w zDa6mq#2&R5P&KE7Az~NQWSM!28$DS1EM(GK{2UZ8am4!HJ&;jtP?vs=Z0WDtY<^nQ zTlrF-rv6_qV*Nv~O49|YD(`|7{~rie$;r;n%G}uDzZdMEi<)vec;$dx*Anr*Myl{6 zOlx6j3uz*RSoCLp9g5{|r?PdJXum%m`TGFTB9lID*9i=}IyYGpl~e1-tvc?lbh555 zUhkhzd<7%e3PnV)__;H?T2u0)D!OgvAWgwsZW^ZSXS)?b zj?3R$#=+&P{jqT({Q$0bNi^EeNRPNS+$#-ZY8k@%Pz}QxXu@~mcw#pN&56?%$jHJ? zYu?UtO-`9|qpH6 at 4mF{8Ko&G9A82e9L^O|PQPrc6V;g6#a2R at C*Laq at 9-z#rJz=3GUxYToxLK+~ipQzU(VxQS19nw z^)MlO$<9CuWfw42`}Yp`>O92 at E!t=D at NDexGrpQy5{-f`)nt>Qqt1 zd8gErFwB1Rf*ldsJU5Ekck2;0B|8;ck2Tv7vQA77~0*h{t)_&@Sy28Nvr#$$PcRv(?jr3}J zI|W&)=U^#}_k7=)`~24cyqVV=F}?=?{f|8NZw5fZ=6$VTZuF0z{^?&YP#BTy`GU at e zW|_;pq-mXFHDzl at -u%Zz<0VDdClTcIZ!Pzk zT>GQ=XUEIe at VlTV(FjtoURR7%A;4VT>W2{mrKFI)HRk}%G^Znilbz{Faqp=Kp!RQ~nVva9}U z3?EzdNp_FjQx!j!bLV;|jZ=kl at EOXSy{jO22dTt?~Rd9)Xu at ct;RmV2SWxVATI! zJpO)VwvNlP2y#bl#-K9-H9bP_ZeEUg4VtFHu$tlLjnsU0dt5U`;pf6ZEj7VJPa|r1 zg6Hs!K!*dai}C0!J2eM9jZZZj8;<4JW8-Tn9jt9-0&h>JE at 1N)GAKpW8X_oKz?FV{ zj0zHm1?5X)l~&0EY3>G*6Epg4<3lkqiHUd;}wPsI;CchaV+KLdfUfFVjY9K$5!*S zwIDyMf+dCTmfSiydO6lhTbb+Ylu at 0wQx1ivSgpUNbd)-yBe>2(hh`ZX5Q?g9 at rq1g zBQ4fz*oC2|NOCOTK2b7fB1YL&=7SfXThHHdHz0i2rPD;$uB=D85!R^#wH2M75W at 77 zsT9e;g&Fz<(R8ZHFR*(wo;@-c?$h>GpeAcKlR$dMgQcTea9ggk(jPT$wpCX1RahhP z>5r(`JhBkv8T~+$BhP|$+ruwgo}$k(H%>|L9B#)+useJs*Ygrte0=UaP4VgqVhyGU z#%(-x6}+$Z)BI5DeUiQUx at NgpkMuC!(woKuxK{3A>Xj#VK^QR*5IMATvr^Fx;>2ST;NWu0dYl4+3zm7b80GH-0sXCl*jt`2K+BP58JR8-PGG)O(9xQY|6LO=# znHdV~FnV6BYm6;MuDN at HKv=Z=*J9DbgS-yYv)2^6M%g6#$>7^Dg{Fi(qO+_64?hHV zi}BzD;bYpq7!nU0 at 8aWJwldYeYL@V0isYyL50vJ!)q|$gpr4km84l*%iqH;WCo)DC z6xLi(?SV}t#&+MHSk`i6ppRxqo?EJ0 at 8DT}kUT5Vsq?@%6N7M|;+BBrklRq&xrwl- zoOd+Q9SqSOYck at 6el)w(nyQaqaku!wXqzR8QdXNlL-KoHiS94B_FhBCO(BQqgZQ_1 zu8a=6q8Mc&5(W(CIX}tmKoq*-6Dr2pf5s*ke}>v4tcA2lPw*Fqg?oS at l#BnO$)5wr z5kSbcl@{J72N5H_SbcEEZ@{|YJ~BK=(-tna-l+THO at Q3`r9#jx+%Yx!0!nu;oX#!u zMq#wE`uw(-ZBl#%5>luO=(bWWYob>&jU0Ew+GsS?IU*--^9$ zP*Q*yTaCms_sr*O-Tm$BQ~WQO`@}fJve?6+=oBfdw5Hf_rwaRlIkCG02 at SEew{&>8 z{ApGJ-#Lu=T}>R{*gP>DPT$S=7ah+EO$_;!wH$-y*u1koUXMx}>n9V8vB;DGmfYjv z197{W?^8ds&;~M2V>&_?$%NKQ)LGb`l#Wpuv?W_~ujoyiUDwQtR2}l0hD*)qo;7hx zDfF)vpMXK-NWohEbwBs}67o3oe!i5{QBJie%Zl(Uy!KI-S`3 zr!oH;iMZC{N*G8mux*(C=M}mCT_nt{?W~Od?|5XyOF1qpqYu2zJJXG*#`b?}{LW!6 zteKv#%!aO*s%R&j%FT&%gpA6B1nk@{CY8e082|ZEuS-oIiuF4H6omBiVyz4D)6Wm; zKmG7~xMIKKi%S%L+Q(ZRIA6K`A@;O05zP;62U}%o{{aY9r$HvKY>!9IF;Sah=;%Mj zo0is|KWZY_<#*w at sG;ud+rEwb`ou(-g zU)c6Ju_CR~u#r!WyVK^uW`^a~V1uS|CK*LOO|=Zen#ZI~v}1`w1{-PD&Fl<8$>urn zSj4}h^BC7T&_uPOFyE!cFh%G3&@$2RaULo*@RI$T@=(Q0>1){TV1cuvl6zTyp$zF` zm?h3#>ZZnT0))cf^kqOtm9iG=ky6`-O^tlY>;!xl#m?&A(agC_MA&S-A zlQdBG%a$}|6pdIDvfyInkG_DB`wv9q{-<5pKNqHGhE!J at O^0z+CqF)4V79nG1=*lv ziO}=#sE*{$QE?+S;D@^;v5A^~WXIL$bg!a10wW=jgE#U9j39 zM_|mOU~+d2#nBavy#7(T$wFZ29J$DDGM}tt_{RsRDp>87dELTu4ys9x^q|gmH?7oJ zMWwelio>sZv&X<9e#V#TrjnHB?WkuDzfN-;ISx)$c=)a!8PJ(HwteEO3nkIPM51UW zMp2e=CJ^a&$zWF0Z at V3_4_P^0pgbe7!&7TA>JNLAcSICtL^U^a&`Rsy-#C8aAti}oMN!y)`|=?g59Wjm>jD4q90^=EfB-xRCfP^> zHhB$bli_J%B+$gDehDG*N(z0Ugvmo#cbz|2;LGPkr1dCwH_`hVxbTCZ+ncWQ!d$bb zw5(S-Gp!ZE+P}&SvxCm+U^+)hCsr2|c(hUJm?3F;HqVxSJ5Au}gwAA~}BAtzxUT%W%}dd@>9l`3_o z&yVkU%8Vj#VFz8=;)Wtr$>`Y9 at EGJVeYJy7ro3pGq@P@%T z@&Vm}bT6lRLWoqEu75IuoI@*0um?_S&45rxL^c4Whas8yL^RXdo1z<4Kip0P9kSQ7 zURzhq6mPL+#-z(mS<08q2CFn-&Ujf>!Xd#~5-OK8HHV8DydgBR+*f=_TOR5pa~8m^ zG&oi^SI%2CBkMV>Y{W;ag`?$>hGMEw2ZfiVJgV(5#FhkNmzYU6C&SRtP>svGZZsSU zi!&+H2d^lg!hK8vT*j+G#Z5OJ4J_qgq6379^*;=EV9c6+eV$>7SXf!C>MIs7~8lZ$Bj^qW!hC-Ov>fNVk9gFfEj)hgW<}Mv+b8*(m zft at RJ1OtzPoqQj*TJ-qSBx<#Gx2%>qiBi()v~hUk zfCZ?+dJxt~#8ZFk9zx*UR6-^4jr6{UH1Rf+`nEI4Z5l-qfNx)Ct$Oq!id=|mYqxJC ztO-)6EY6x_xC1%U?R6GmKeQAQVpJ-=z!ADc*`@?uS^)G0*m7DO!cef7yC=@BJ!;H5S^K at sH8@+ME+G^xRNr}vxLHcDi;0}= z$0X8Pcq`ODNiGDxD6;^Y_5f|)C(=GCuw|G=5 at Ug*Sfb9=5N|aG at HEqIWd=;xf9=M6 zQ0!Gh?d*quT_+;dhglDMknO&I5bWm4CkK&UE2`}3!E-8|4c=LL4=1cAU66Vkobkmo z^`R419Fe0|n|g#m;Vm%te}FFYJ45sslv8nQ*qQE9a}lMH8cyH~Y892^LvfU7OmaIt zr=>oO6&_A?b!*Cbnr=_}W>LK3ywMkubgp=>op>72dUnz1=I>tIg-IVeNieB=#XZ?0 z4eo3-R!zCEjK5 at T+l+7OIpy=|W0~cX{!_Hd{rKc_QSxKtArQO>ZJFTb+vV at MxK;BO zy|NR1m?hRWs}##MskYB3?vrtmc!h)^^hBBm`=)3l<(}qFzN&d_aBOq8{NFBcWi0H! zcPezcp#~q&wtP6~)yIjBKLJgN%Rq}A68O&?ezc~Kyq%DDe1WydvK7YL3CXC82p%*U zuuIRHC;djy&8bN8Ygg*_Nzse!m)teX=}9-(n1!9+oqRKcMGcjz&BagN!s9l1SgWEAnJia*f-eswx at kh;-p)^e{hNGh$Wi97*z- zPa-69n;)5}{~Vw{F(MgZO2fi0R5u(Ey%Aw67@q~})Orzgk+abux9V-kzb;MsI^*! zDh&r?8&i=UFL2+i%)=%UGHW^)69E*bPq1^myRf#D&Db{8o ziy at YT_EbiPzHbt6?9y&6C5wG_bmNn1du{2N*SuvoDh&Qs4ndaWHcKq1I~T8`#Kudz z!q`=Vdk-9+u%bvRQRnrxZ9KK=`qLUub!?*dt(Q1HGgXKHtrKuygAQe>SV4}00s5~v zC)7`0kWmKQN{}t0<+SI+L_)04q6i3e_V1FR9oRDPjLc at HA40=P;#CIummAr?cIFdFURCASD-{k9*-`y{yDd5h- z=_kvP;aXzL9WPzz(*jk*P{41M at vnUI19wM^#k+a3OWHw}KpMhYB#(v1B9ZBuZbcfA z?d$yUSE>>uDkow;9fck`qvj%|fvgH%D1Pfu9 at et!3ER zrPQ`%*Q#$0mgM~eHEU$+xNX^g$qU7O}m|eQ!?J-Z^f*qrC zz;*;Uq#twHaIu6qEQbpRV~h-)4>rqj%r~)gRpZ{FH$&pyZfW7NYpOJw4$)^i6kF-) zS%fNfI^>A>>F1*i1Na$2n4~kl at l~vS66tl$6c1S1rvH3Hr(j??OVWVbdHrNJQ-r&L zyR02;Ly>z8=^bRDR$)UiG>P*WB;^?9mV3$C$nU`tDuTc4Nh+fd`iKNNv`?%omi(N& zhh1UDO=}wleX3s4BE0FIEm86F7ma`>-|-N$YLR070%245Bl=f%>3h85 at AznIMjADW zg*w>~+psRR&fH)E1cT~E$(M>oJll9arv8+X;B@*LL{&_qZoXcJcl2`e{^zgP`61Ob z+xlS9OruOolPP`3=0CFpxfFvtnn-&@db|#-Wvr=_gqrNPQHl|-IwBXzF-ujDKk&cLI(-AaUU2{ ze(KMe9PoW$pIMJ~+;XO{Mvb*p2qNvUB0OO|l;M<{_!L6>8-Gb02_^%12?fN=Jt?DW z at FI3~9RqNZoTdcfWgn{Sz^96d-4UOXxPpCkTcJM9GoFa_33y!tW-$;ePYNFhR^c)S zlpW-W3$+CuGt3~{WM`=(efKsy?9%IdGwBl$scTyC?7qS4woAFjdW5q*q}}N-eDp3J zR-<91(HDWS?)@bSD>xeFuABWvq9TgYi;4a;i6cfC*($DUpXues zL1s7t_h}^};h(nAdhLRFSpJs`vi_aH|7e%KGuWsa0+a_=$eB}Q82JTHAEK?CZ-K73 zy*-V%+-Iz|Ods^N=`R=bS(ll)OMDCIg7U%ePXx8l(m)d_tfrmU87Xy+cLP);Wa z5 at 6oNEd9TmLqfq)nWznEzzEME?J)0+q(?$n>&XBkb|%=|c|$VRT1qlw)4xyXGi7flA&eO|Iy*!DAbZ=v9l at 8QPHWph?3owSjQr+;?OW z3wTu#ZelC?PKqOdMmtj!C;qE?Y)%P%H~H;L5<#Rg5ZIanSf7L|th=eyn+(MW=RvK2 zYOUOD(cBa(E8^p#usA`dM=W0o)J_#(lfEaQio-{FXRvm_q;Qx zYPdEMqhEf;ebZRzPW#SaR`D;4_Ss8y?VG61IzH^Brn0S0Dm#1pTUE$H(QMTTB^4Wy zw=?_JMBHWqAnMZ_%ueIdYu#6cqx`U#92O=#?qAhOaml!WLWB at o^U`l%cN z=#&@)^VNKX7(d&1J<=!Qbqbh8M-o3pdLSB&%j{QnQ1B;$FgDrI>i2QpMu(!!Cq8v2 zggJ{^Hv9_ih(xMeyh5GbT2F9pZz7#-7>|1o!_y z5cn~YTjDweJ!?u4#u&El at 6#tH34(z`^ef-}b`1kv9R~?o`&|l{g z>46IP^AhmP-(K~?wkJ7dsR1z(+Z3{C{k_O73_-MgtDHxJ(;I{M&HE^>A8pK8gt1td zI`&XplVv9)qbO~7iBwV->&jj_uZtX2pZ0%c`9M%@@?gN0%S~42WfJ6I*tC$3IyZd<#1y1+Wrpcumi0g+g_pVj?XNxx?cL{U%*fftztk*3X z^)f|DWTm^Ho5v6nme=jV#kzpIZ?HqmZQ3U~@^Z`x^aEF_*p*Q=o$TvmjV^i$qi8|D z?4_&LNo6kE7sPKL_$f!M*U*Uv7YfV(YljX4ae}b2reyC(fBq at zf+Mg z46;>`{P7z~v*61*?<1P{;AkUK6~w4j-V&SC7-%e`+!}Gn3mpu#Y}syqHHBD<7i?Pl z;art)W?p&K*?RmUeEOtfbYWw&J3zh4isW{Q7qvi}aa`z>gsTmRnG8k!Yg?bAyMf$y5K-fY5YN z6LjAz!BvzKO3Bh`tRA8#(t}X%$p=Ce-Po1HsoYo%$u~x*i;-|)GlHUKPn8N1dZ^T+ z0@?)IrGG}s)=s9;7q7RTCw>4VJO#3tG(Wy+Vx47H*}r)dM)O>W%@o>d7gcQoyc`M| zG%n%5W9uMNFjz7$$bm4}Xs(2W@;o|uzhq*!6r+)!@h_9Ud;6O;9J5jM5jev7^bElM z*6H=^-(f=y6!`8L8bH)53PU)p4X-!2N$Qgo7SnI}`c*L9#v#9&$>qaipUESVz;#e;d&S+v;5OWQzzbi_Mn&1uLCc at c-Evpw2He2r2K)z!BQ7mlCUEp0BG zEL;LgicE at 3;C at x@Bm1JnBm2KM>iLmX%Wa&QyXHw4)_ zxc$9`toZx$K#6M#i1O&@;9rp&pmvJ0DRhOIU?hZr!V+i#3SULUO95`#-w_Z(AN4EGOmm4%hPO1SPl z&vAXGf`{TrXjQC;*y7m$WoQRLp2t=NOdu%GS??h|)KLVt`*8T~S67T(f>H?Dnn!V5 z#}~k^f^CeR`cW{8 at K%PIXrMq(2He-(TN()3?=*ciVH%gLD-<4WOP+5{b(UW8W9R3b z&&H;FxzaTLGXhBr5jnAHG1}}xxtFv*u1~C9cO9*cUsi(0&B++;P`EcSn~`-w$4}Yw zuPky;e(}*fSrS~O%9D697-u(MeUM-@*DP|kx{jJ!vwrZNCHE6g@)JD>v!0lbZgf0w zKo?1*KYS9*(7l(+DecM$L{~*9XQmsVPK1NdF#plCS*ZhgolHD`k84`}9Fa3L-KG<= zzUvC`ST@{%6 at G0$#47s5MVXr8_;zPRW%N2DoeQzQEx)WT82gHr%l_pDIsj*x!aRB~ zlgONbZoC?;x at yT#{8^;#1$R1MD at OLU2kRG>VY8%y!f#5UNV|%2EY~_Vo&;XOE%;M3 z9jqc8!;0Pcu4<-l5|NghIF**Vp9<}SuWOhhv9~y+o=zK$KYZqSZCZMrxnU3GNxj88 zi^Y at 3Z760-9prnt0qKNwTq?6eQfZk1v(`*zX6cJ*kihmy#qUpv~!*U<>d zU$y{^=#dkTn^kP6S?gl)TB*0H?MLjliL3w_b=ZKeESkb7TEG)Y)ogQ!lQheT?gop$rT};Ufsx~j={X_bw{D1enWzB7?fVw6DU9K z!)nbV))9&1InUL5<3ywKl at 0s6MU+RPB0 zYZ7{EwJ8y&L?LUq(915(8qw5o$*OLBG-*G>JytZ~!W~e7GSA#2|9deeg~DUIkyqXE zN1_oG!ds4i7 at qS;MGm=#ZfWNOgpAx;@HC`}djta|_s)!j0E7-GZV=T8aS4Y~z&)VC zuY;l$g6B{G!fn+RDb7r3I==zlBR-PgCMI##Ckp>2wwDLA!U(vrEIaTlXt!E;D7KO= zA0p?F#``H~JTD at E7^5bE-;WYF&>X67Byz{&RCkJsS)69)WK~C3l(#j+wasCqmk{Q21mDRB#YqS3-5R6^ zqbQ7NaPF0elcG at _dY03Po0-gGmk58-;6CbOq)G&8Rdz8er&M0y)m()`LQYbqIfMtZ z=qJEQp1n^$(INAb_jjWKyT>4KtxYy>u)nfdI>^uW2b&fDOEy{m&gQb*j6BvGez9c= zh61`s--t*cGd0ZGfe1Rgh6tOGi6`A{Ge(=zwA0br%b#fWs-bQB%US$3j9BN2VCn5e zw6$)$zCCt%%s6*`dR;zl0_(RUN5D^vs$pAVVj!fL7T=7Bs^cDK&cDjM$fXX->{=w> zk1>3VqSCllI0%i^!J=U?W9{-9uXdb6^Q=_W*xB@}J3uqNx7y(Lo`U6jT+y>oSS(|C zhZCl&2YbClmCL^0bT!)`!7qEqF?>*xh;H6~WJS@$gpA8hMnwOmbz4+Woe-<(9Zo{p z!YFva6ECAma|lS91+=#LcQ~)R$QW=aP6}7oG_|*Ej4)%1Z9x`D)`G!z3OZ0--z}k7 zgr9|VlfJD7yu;~SY7DJPqdpiJy*wEcDvg!Dq9c6{==?Emug7~l_dt?e5{^o z1se4r-xO(hhjVN_d8Per>mAODS>cn&IeK)V^3Fg%vn8`VSs4-CK+KL(F~J|F0kVN& zyzO)%$Xqd)Fh}_i7G-jDlqQ;v?CVJyu{93QsAe+J&Du|ZEG{!V{wP0GUIh)gCvTexW))+^;f at O=JgncEz z!xXn;GnzPHu{R$J2<#F7Nyqfaa$%)9?vq=D2~1w at coIoy7m6K@hy=GU9hzqQ^OH`C zWCS%14*zIuhvPXqDJPSUTH%dalQ) z{~@nCXYHxXL7}>9fJ@YhZ=CqekvPFKeo= zlTH6Ts>Wqtp^aIDa~VB>yflL(t?;2-e?rJ|kT7(YwZ at Yo@#}gY)1^ZgcOZ%;dqPtN zjT&|9VJb&8Zk|!sPXf*RLO?7*!TqziGx~lNPBn(?_CF0n_OI4mTD-Hl at xNq~?H_C^ z&8oh$8Io2lid;@~j4!XR0Sog>vT+cYzKAk~Vv at lhyKAD-s`*C-mljK_h2T~se#|j at tbN7y3^A= zQv#!wubjjN)VR-BjKVT6wxEK#E*p}@o1%7kat*9|b0}$?&2vYyD1O(_YNeNxp^||DRpqV<4Ay}xA!_e?Ig_J{eJK#4B z(;J%rV-3ql5OI<4J|lMbFQkv@!MtV|9A&3;cG0pk7~lhg){1^ZA+^}Gpz68uW%dI{ z0#-krZdW9&M4l?*-1^I&h8iBo<0+s)3g at 5=0#>VBg(+T}ARsAEnI||cToHM4JDNUEsi#WQ%g*ff`FgeYm z=`bB;yt{^HFLkbrM4UI{Q$i#-;60_j5l|k8p$g<2r*-$~TVt-;CM0>`X2nOg6lxpv z^l|}c+bA43<#frNz%elh(30#@s&$B;B*PsM)zBVe5`U9N#LgxQc_GZ3^A_YhGOfsy zR**hXb#)Rez>*|o(XFfma#ZcY_befCPT{fiEb-rf$3i`0 at SS{4H~C>0 at -p>FlmV7B zDIi8TlgNeIBDUB@(otY>5uTKhp60PE^tTy_Ke;SB8))QqPey{dA{+HDr``@d*0Ox&*w88&m3_XPhq`2o!_qlV`0jL(bw#eh7 at kb1QPDC9pLO?3u#Dc zuF(jSBna%-HrqIAOv7hd4#mc#F|a_+XLxlnB{$_SRI1zsw2jF1oI`?gu>^Ni{Wu^08S$NN>Sbd)J2jXA$t-1^p>HkZ*XUp7$7AxI9>33DyTAX z+`9Fd!zH-7PT>D=_KxwLwM*V_cWm3XZQFJ_wrzEie{7>;+qP|69ox?7d!E^I_P)>a znX_kJuJv}+?_2e&byZzhY8Z89x-pygTt?3+#|z!8m;m!O?OeSDktkzi8v|X395>%$ z-xMXkk)qJlO5cA3igtp%WK|%rZ%tq%R=lOG?bAAw?UN^w# zp)oH!s{;%r-UAN772a=d1q1;fc8_dZWB|j48rI8!_ysW>mT)0PlcABAo{h6v#cD73aVrUHG4E z^wvZf0S&sBY(bTi6;zI%vO at -5zuFxTnu_VUV3JYzEsG#MnVUsBDUGf3#u%KHH_&op zt7d>;x+e-8W*K*#MZIjEqV0{$h@(8KmCYUzxKP9!;D6?Bz#9X4+w&@s{JwFMcJ=0i z0k0D%g}?ok;dHjDT#qO=-sncM(f$jH(s@{h5bsKaMMRCEhe&)~Q zNv_Sa_RScEF}>3mGyzC$CuH|tDu-NVY%MFj{wx+=$#6urf>})2OtTnMcUYL at da;xQ zAY#3Qonh0?5^ag3tSf9Zc|DavpE7^Z-vH?N!woc|GP1I+m3}p{Gf0fQIj8H;XBWfc zL7!q4=%I1Ga=rMMcwnR(B^}Du at YZaH;t6DZGAm>=`0Z27dWa@`B8W9aDSFFjNqv#W za|>DR(!+T3KXHSNlMhGnVsu-|)1SZRU(o!qd9F|#00*0Pe|h^%9_mvNIZGK(nH}Xm zxA0?S+$qLPxdU?UTjW%tQj4f}7{2_6l7NqpU8l}D!2(&(XEP*Kg7CuD+f`m1O%|!& z4*T%NL+uRkly>Kkb?1~&=bGq`hCe$~_386OIKWw0#TRm>uFQXSg5(qXam8gz9TX$I zperVZxv421>Campuc113GO0*Yqw{^%I$f2m{kf9QDA_Aecq*1NM;?Q=1LC=mpc2<%~?32PCY0cK()5D6PdnD!k1 zkBlpqX?=lz{5;!gQW7PJZK+%kKkirIWoC at 1%&CL(qh57-oOpRTe4qUMxEf#nMx`;{ zHzW$30#F@a*>U;3upR4a$wN_rtfXb7zg=B0fv zH#F!z2u=UlhAk?h3bOgA!Oay9lHPTBzT}D9G-HAe=38T%&-i9lt2ES~D)n+l!_ykZ?!{$v-&KU+ zvvf;q!|!vA+g&>FuRhNbFp5x~um8_u&f|s6rpS+?k{8LlqkmJN01h@?yaMf&ddT{}mE zdGZ+YA+#}>C&N(^d!XkEhG6f=lRiD!N(AI1kyOz9%mR<1Fjtomn*WK#nJ}2c$-zVwf7^?fw0uth>w^JVmG827SYm}aRf4xrl?4e;(YcKGfEX&X1V>sBiP)Z1 at Tyq2wme?;s;=w5TO zYA_<{<8 zd;O%Su|Gr%|L(L$PjEk~|87Pw3EeAMMSwXzZpV(C at nV7uzN;l|mLc3A;-dtEig at k> z!(+Ug$zF^@@j&x=&0xm&M{h-y*BNf=7$D zhU97zSl{>mTFs|-xt(j9Wo0i{p8d87NQkFwMyBK4TXt z*wOv{*A_cs;%}F&2 at 9Ow;j$JVKj0!t4r+oga4wB93_K13{d;j7;Bfi-tCJ2M%X4qZXh^VlVs-m92KqXe?Gf>Ut^-T{yJ4VtEKeK<=CEj!)O=}U%uNu=(D3n%|Jl2w* z$G?V}nqNnWLRYd7szw-(2+|e2_<`kyI(?u0uj;(tXV)_tYy^&E3Si z?M%^><_+uH3D-WDz)|@1a;jWR>N`vgkX#fgMxDO#P^=8^jogkc&EmT z77}Sii^(c3w^fW;WWkA#rot*;ON>ouq+7^Zj8=~4xOf7-(Ax%KO zgUPqOA);$a%PQ~AhJ--43?jkH`g&@uZ at AxzDjhikaPtABF(&9{5BCLZ86;sOI5E?V zFpbf4=F(aWrD$Bx34t+ z-p{CJAWa`D+JA*4rnD6Yodn)!4aYE5iM)e;PYuUzq1+vY>7 at lzVhq!cu4dSyl5?`- z at 0CU6ADmX1Fj5?xzJW&V9*Cgw4c04nhmBsMygPY|tF;s}2ZJ!ErKK$v5mtGN8w|W(S0*;<%Z(cZY{k_Y+frweCL7 zp-#@!2EUOAd%YA3c at WrjtFR?07dEU9B~T`eon$RFaX&G&A%B?B!*mY5MYwYU*t~uv z!eRJH&jjj=kXIlv!ds?!+$inXaagWve-zZ3cjL>&u_#kLG-mCs&&w(CB`l>xs<1Iz zCvVJnX>aPf139y#v3zT)ci>8&V-Z3L*%q~pKx8<1HJhkRJjQc%V!1I^fg)nF=N4sE zp6h5PS==)dj|$Wn!9i#Q?IBHv+k&0!1$(~v*7>s;_IytpR-j=!cNm9jXQoCthMQ$? zMo_L6S(rnRd`j|jWGHX}kIphX?@>b0D{-x%6KJvhrAw9xG>IcHM8fE&)?4T;KPmXM zs=HmUTN?inVxb-AmCw>+ at V>(B>^OSd9)XtBh!NMbiGHFepvA_ z%rRGlQ}ivLI8;xrb~!4ceNGTjS^Y#R?H6G6p%J;}y`0BH-q44kcR6u6q~;2p1rj01 zlGXxbO5RdFHD4HX5U*+ll!DPWkm)X4+Ur}h9=K4tm(}^H49u8 zPISQ1`lX_1(m0$BF^ETle~h^yN$Zl7;F+P|8PUU<#5SNgVpZQA{G*#W&`t5qq0emJ zdoC^ha4Pz2Wyl_Py_3KdoUjXENmpq=P_>T*qz*N5M#1Y&mg`xhaFiw%NDd&IjvN^f zThbXR(A+WmnSq{00}YQ?d}Ww>WoY2N-HCbnWF6g>oZls$;~OQQJ6!nWxZo1xd2~^N zPr6Va#3fhaBE;*4uBaZE{PmXU!YxPW9sGNmP4DxOD;A1_q$B%ugf0wzM(Q5oGVmFJ zGvUU73U)VhvHwS;pLTzhhJLdf>VwC*X8)GPPGgs92VD$+m1PL%?Y-RH2T#_ at JR0<} zTtieEuhPmq0(7lV)%jqy74T8p^W6irmj|vYmm2N3imX%Ebv4Rki7S;^ zO?iX4oj$u4Chd9kv4Nj>>Ibk9UOJLIESkAO_JcE8_%88tNe;d+{w%0H4J8Q1WCXwRN8W^5~O(W-2kMt^CLsiD~1R z6;lN=d2LMI>s`*kH9S|ve57OVL_2NDg$&4Prh+~CQt-IPJ`UM^5aG7RlCGUSh<-UL z_qsGabwGV=#q$2O7C5&o)-czNPh1vE39ZsG7qveOA1HcJSuHkNts5FG+whDRZDl`~ z#QqUKv_-4hrxBDnD<28`sLCWhjQrGYFr~kT3hOP?n~*AX`+Mlcuc at 1F7%~FBW29IliN~y>)sWXc zw(o`25~leR$!OZhp~b3{-5ffe+x2)w4t`5KS5Rk@&9*&)EgDqD36Sc zOy at X?J^dMr4{(!l(iY&VyhNsRemU`Sn0aN^mG<#+bWQCKbm>MMWdRHd%nW9V$pkGF zt{+GEE1QDRnZ`pqGq;(7M6deN*6}N>@dRm3 at 7{WxRJ4-NT|}O{MG>bx8xJ8IYxZjOM7kt zBXrDc$K6C=+$}2MiXNVDl_fJP@)#<<0_@?+SL*_GWKj~@cd8~nOuXkN_bWyX+b{x zh7*^4-fa)u0H2NYWe?K##;T>F&!is&O;%^`1R!8{lX<67qhschejAj2sK}cqg)5!A zsy-Rj5bAnPaa)O6vLkg3y46Cc8vBB)>r4zO!sJXaMv}HHfG)9WnBcD|GR)$eM{M4- zK#PK7Z~=Dq57 at Tj+y!&fnUMl|<&gvQ8hI88LTNh_vD3;QndS5X>{9}|ue`^wqi#Zu z;Xc;-UEF;#q7!_XHpWHU>aARh$N z{K>I|L0JrFpx5)O_{r at w%^v z8F(6#N*EEQ1v}j6M)X-|t*?i!Uy5s3;Z%b19XN%W6s2Ffezv|dj`hAHmzstvn#W>w zgAZA4y1vy50k?UcN)|APY)0XM at JjMxiWjBUy?zd#ZZlU#;o}TYKg2O&1%tWZ#7fX4 z`W_g`gOu{!BL$@+Dd3B>Uh|~M)HHC;M;%6sAI at Yaa-c_Xs+9V%@E!<{BdY*>B&;YDRxP>|;j{je)*9e4JqB!N+J2_R zi}fajGWn;W&5%UZ6YDLWNStz6oU;+e7fKYuT2 at xpUl%5<@b%s2Fv!FKT$3-e=;+bt zR5m4T>5 at q$XZ2Sgh8<3lh5D?kymE4$WtLj5v at U+(iuI{#p)D;yO}IEo#HLxU16+w7IfeTM$mXj9wk*P;RW z_DvH0zu))$PthjlVr~6Tf!3%#?erhx1g^B}E^}mzw&}@wg#HPD7SaaLb3nn6%`Xh{ zQr%|43qeF}anWS1c-&+Aot^+-aJbB8{9~8~=EQ)2lQjPD-O372nwOOGG%n_~&8J77 zx6Z3d*CfBMw>$iA==SvC2vUsJM&f;mK^cq#3TQD>AU7DCc43&Rkj)6?t;s$Y4gV8duaVqij1cx=>`idSw*&+GxOmUIJeHT3dXeLZO|9j zFo6vUn-p7PDVTF_`9pvh<4Q`k&R8uRPL4$8t{oWi at UkiC$=C1f)VBd*Xrp4AUDNig zs@??nqZYDDRws`ADi2zw4ht?tHeRZ1s^70F5a)h#p?A at Fk5QGMS{g+Wt{T1c87Adn zhftZ|(w4L8+Oo(BK@|lVl?`F5_I{FePs>(O>-6FE7pxE2GybNAb;D3x$0w&-j~jgK z1+HRY+Dv8@%C74;$D}J9BA_Zr<+&xOj81Zx)9n<8*Hf{-B875ri!AW at 32i~LMoRkW z5-4IB!fjVS9kmO0*Uh-$(Di^2WH+*u+c^n+514U}K;8tQT}SO at 5d4G{-Az_iJgZDG zN~lO)$C9#X`a$M3U at q2&Sd`Ozc){k8paWT6yt=(~FJV$$vcC7W7ON}uw&rGZdTzHJ z1xk0DMe5-u<6D3wJD&f$VsRPO<9OwyiqL<(XlQ8 zUw&JFkpV|s|D$09or9BHr68t69bu5gbR;8ZmZxzK-3#cE8)zEwJxMIm^t-_>wC(IW zi5%x0J(0dRPPU-=2|SKhbSwl!3y^6kzMX8p#l)(wQdSn^8#SGTpMQh%hVB4c at i*m#HiXCFRy{~67%QO zb%k0du_O4LhgCd8b_9)IM15~Bo6w%7e+zvfP?3o1IrO9e;=OHZ0{PEB=}{ze2`Y zf8&e6`P}BU;MH)zJyie62aD+m(Mkh6%XixHF7MI4he5vw(4i25mQ$i5TZPbDqS at xHz z^pxqZ53)#*izj*~o^rq08;k(&WXO+>Mu+$O>j9nq6FEAAMJ=A~T8XEi-R|k)>cY+~ zVR^cHy93-`F%@2bc;jA}=^JdD%!|Pgd_9P_gCbHR$ai^;c)}go(X&K>vpR~|Bqc)W zB$n*S{6Zs5v}bRCx`>YrR_7X^1nF4HR8 at 8t^n%Vu1eFTXS#2&67pNChGEa(Xx}0jz zr`AM}PQq+&Gp$JS|DOkOrHnGfO8rP at GNU(D7V)b{}W^Rtal}&+;TdpN2DdX;Xb+9dNp?F zbZ>Y;M_eq7tFAiejOKl%3$?A15dRH@$+g0A2c!LfL(x;}uA|MMLmT?JY}Yf)P>2v@ z>!A7BJS)XZ)BikJLGMA>FjeqZW0LLy>80f`wF-)g&EhIJ{0aOt>Y>3qJX{NvK(*wP5XZHlM4l zCC_4*9t&tgT_h?w13`s$d`b!&CLeRFbg9l&TdCGvg?xJdc~0fwz}RvHX|YIHm9K^@ z1tnlA%wylRL^@XlB?-uspDHekFKx z+6cS?+j-#oguo@$6=R%BC3&+oDGs9e|Jv|;iTo}n}kZ-*VmTKE`9?3nV2`MV?s&niawY4+uL z=24x8E4p&NL7fNuF9T1*2_E0J14OgKo3okuea6PKScU^wbHUXJS9%%Y`jkMqL_+)! za=CsB{HMQ(SbtPs1o*GDv>^YsIs3;QaS7wL^8zS69%N{Z0FCQ!Ja92l at CiZCWJ!4&Qw0`M;jGul6agv at i>!qb}yge zPL8o?BF(!%+TN*xKh$B|!yYKj!LRxX{%QJS_;QEhw3lw01*BXIkb z;V at p`C{;JH#gu8m&ors384t3NzJXRy^^ILr9RMW%CiPg==o@~{TGS+&NbYC3$r zRg3K~c8i5-GtGCUc{^iXs*k^|;kUPO#`pdcMxTFbQI>yuvenMk?4Of>`nn^sI0A3E zt}YGqHe<9b5)f1Jfq#pzbv^+$_Xtv5Z7 at twN+ZSrsD*kX`moAvY>KzoCjq>qs!l26g6^-E5BYEEH$34Kcw&kJO9+6PN&c8;vk*Vm zehN{3E{H$l!OF;nCW)p2_IKg!Ycb5TWA zCnEiI@)E8#zR8e|Cx)_KfDSTiDX6G5oW9A>kG`=EIgMS6)m2@$<|j at 72hTBeSe>S8 zxj4EGPS4V!p^P;wzhn&gfp475t3&gaL&k&W^t$w(aC94$7AcvT3 at Sj(G*yhdm@@H} zm!(r?gcm72JF$I;Tdb-UMW|H{5${-(F)>fu4XO~WUi<(-mV9H&%=1~53dR%*gDc>U zm#~dry0$DFDEdVfZ1~r}V^1G$P*@uHBeak@>2fCeh1o$y(!0`; zDz)3J376_u`D=cAdZGFXK&d{X#L6KJAGu$X2X9z?>RI2vBB>G~fY1W}?+x z!%Z12)?mTPvad!|g3Vua)%mIzz|ujqZ0H%GFf8Gf`j`8JoK6>Yic#=)q;ze^x8)Wp z#qHvJbcO!>fhI8k7bkKH at j(WupLjTcK5CT7q|P7Zm8s~)Ctgm_#}5dVmw1hHMv8JO zZAMV)CbWlPY;=dAba}++T_`jP^363t%${>YBNS-+COOAQGss9bx!>T7SU(3O2&^Ql z{tScuP1{oF00|tuh7?X-B=f+Dh3#p&{Z0JW2QrARvw+?JP*i_jr=&pNC)r7hKdx}H z=>|pWE9%@d-5P?rR0La{hErf5&E at QMeZ~<@{H2pl9=)4aHjB6X0enz)m*_z?+w`&) zk2n{PIL@?6yaYF1#DOAD at 4n6Ye#4~lfC=MI>ic}<Ch${J%pqQ at yUVo(?f7QNwtepCD8BvYJ~x~fJO`Rz2*XO+IOARAX2WI= z70*>!on7TeRd!3+Pothg>}R*&C0X=7!#8!)9G5TA`wxE}Y1G;qSZX^9aUW;rmL%Np z&!X4O0L)Vw~#NPw5t>#^8Nw9Q%E=*y5Upfr@(YIpVgKh{%KyCuW`zql8(q#1HiTm1a>= zQ;!ROs$1zluekmvG!ry3GI4VHC#DsuZ7XA|qI}Y|j{<6P=afXgYg=gx)l}SruK|X@ z3Rq)_&?Y##IK~}ewb|Xc-vTM+KY?F&0_j~}_adU1qg}+rhC at ETf8;MXxuq0BDrBU} zJZAAeZCv?ow;owPu5SDBf-*$3f0XQe at Z7c}y_{x0&&T+x+-daWHSoozkis^zZp>a2 z3U4*gT)ttuMljcyI6{0fl!(azdcEGEFC7eSND5LC<%SM;jx-G2wWQ}AWSIY@ z16ZwcncKf1m~;`!1Ap5*EzV{ydyr2q0sg{{MT0nPhJd}A!B at s}?o+UrHU+*F4imta zi(d>;#wc>|HD#7KM}eqYsDp3{mA32)Xd&M%pi at ngzxLK5Z_0M#JM5E-l#$^Zkd?)DIAn-r)jR9pm8;da~$sY!a0+(Ub4 z8Xh>w1YMH{8F33H2IK}-Ws0_mv>63F_}E>1_bV^cX+DG#$y|c$qUlKsRFH#zmh7yV zLt36u9SvzY?+L+MzjRzwf at 83^x&v*%N90hboJG1^Wx{=o$ZN5Y#Q1)wB>seKkyEib z-IiT+gyakE?~3I%=dLaIR9tlup;}LfLIK^;JShC-!&#hjmG!LA(pMGcvF_H4Vs5gI zcA077o^_3)Q at M}{_~Dk>M(UgnJG^8iW+QxzT5PJ}G}kc`uBab`T5pT(yTc^3dkryP z9ud4~nJZC{>lJX3;IX>J!s|4NM7r+k-OrAjaV|#v6eYW#Ys*58*;@rlSL^*Dr{8jB z=%dCYWs9XIz_u1%!rsEMYnKXg?6VUtI}h2xfm>=Z&-Rh`(~&M{iMGG$?5biDowZxx zk^tRE74$T-UhbS2bskMx&`7qW94v`~1MjjNtBUe!Uy{|()p^hjw;k^`JjV2t;AXv9 z(Q6O6mNf7JX+R$v(A--_F`uZKtDloJzZ7WmgZY<;-ysPy3+lunhjZ)*S**-)YYRo0 zq9hG=)ht4ny|$&1xtk3QXfo+wY=|1VBD9E2+(=X{BTKc3(j;xr at KK1{$42b{O47y5 z?@fUb&-Ae6+=~Pw zqralhN3gr9Te-xv?)660CEa~V`MM55Zlt%^Xc_#;8Zr{T7KyAhIqLn=?wWysEfzFZ z6?;)({Ade~U?cA;*BKcoGPq*3-h*6|+oYO=-%xSSEZy3#JNcHSw_7~gSA+hyp#5Ud zv)5SLqMFzKaXqqWFeC7H{&YCSi^0B`J1fH33GcA(7zY=nN8AORz2`_yp-V>!FQ8(# z`~4~1qUxU at NHMV!ejy9Q1^I+`thh)Rhc4eF1wOw2;lzEZyuH!~aQ|rx#;z70P#-l1 zG7 at gDW~Pyf#jjz|y0|6LI_Vvx3uYYRuh}9$y2oyb!!V70jJQ%lL at r7U`0DCCrfMa@ zFgizNrZ3odJ+`!>gMwG-5t#@aL(>#3Q!(Kd$YaJ0rl)a*(szqP191FN6LI}xlSX0x?Y7xJ7Z!g< zMy0yVU)6}?$>9WOhI0U9>P;_U0K$peabPtNISgn6f3t~ z&AaNHlAc*=U6R{;u}HABVj{4}@Vw at iNwmb8@~Ny4af)W8V8Z-T)!0cl!%9{e`(!d+ zEj`SlVYCJ#-2xguv_uoorh~iSqKcKG0HKM|$O39*vPZ*5rfQ{iF7zxJ70^IOmvHMe zifU9+dX$Z+HI;~_Kz3(U9tIVDyWDIpgGLjKZaF82wezK9meljkAc at AYQ`0m%pHMX0 zmgW4*GnzdcG$)L-_NyG=j!4v8bo{@*%15Xr at ix+o^%X at yyRgazH zCwPZKERNusN at Wh`*4 at +ALhZw7GztaUs}2qA&R2iOJ}RIPDOIn zW=RH;CO at RcwKzyDOn|2Qm5Tpq^3$(ye at +u_f#-6WXEFEiMSpVNcSae+^VN^y7d(&! z$vev-S3xb34DoI;qdZHUoeoze_{n#^hBu(sQhxc*AFqBD^f;uMq#eR`4)L#Vp at 07q z0EYbP-0}x$dkFvbUr2Qm1FL^&{!2Syiz0ju%}Lb}ao+$BlaUA at amSx)1R;PEX%9RL z8e?}8AN3MjnGjVIUs1i;uMP%7i=wi_>Fo3bW8>sNAw!kzOvU6Kuj;aCjVh at TaZTJm z$~<}Nxyi?TejYvXf7j`C#c`+ at ss%jAIU5SYWEi&K7Uv=is^KVZgzed)Jms}aBW%S* z;esWTEB*#26Mo|I8*r&Yd&#ss4S@;kD0B2FqQM4Z$Ec!1ZS0hhoR>1mB6N^fW)^L2 z>1USKQly)PxXIfVPtJ7`rYx_AD5T~0R?lE zu51j!dl&*Fj;jv%&fn5M=J$o-i9IeT_L!JvQm%uxi-4-ScbErZi;>|>fGAspCSmp5xO?zZm$~R;&|I8xx_qjOmArZRxWV=ES%uqG zRr8!ZI+!`m`p)%Wjp4q~K6bCZ?9NBDJ`zhIP^`aDV{lRVj09Y}&Crn?7_$Fq^(c5- zt?kff$YE`skD?1Te^v^9b%AZjzqQgT>bui=4d)}qgT_zNCNQb%0k$3 at 91%*U=JSx4 zDyglPA5D7Q^knFE3wn)xjBPry*oZ!(Zd#XLolZBflXDT?KPcC6x9Ty_hshX%V)C9j z0^}J|1o-91V+GWKHjgEDzSA-5c!FIuS!yJO7iGNfN(G;}W~Xse+=e3rQKuPHBrQot zl|y;}sA-YmO_iS}$j|QP-VN%w at 9yODwk%6k>Qo3wy=01 at +@n5)2Yc;-2>-CX=u4+q zWI%FR+7bNKUiqN!4X@#dutNsTOyV`bRMLFTC||yJt~+-hBKLlkIA~sYmso;--VmaC zhJ%1jiaAt5FIPHUw3;PE&;rlQ;(~S?5B$Z4fcY;D9rDd}_u&Wcki%%QEPNJ$i^ShGb~Xdr zXLnNfV3MmnJnj)ZWWaYTHa$jVkTIoLc&$B)cO?1`9oQ|NkJ?pP83Fm977>csa5xXs zKLj2+&{KzxXm3*?C-%qD6?p4Y%dITB2~^hSx@>a`ClfAxHXJv%oFql&@)sVm8(&*y zq_zd(yDIY#Z_GtD*iBZN+4d at 7Jy~u^X!U1lS1qx2 at vY3g(L=%d<5M;*-IQ!py6gz4 zmPhB}_;RdB4^chE4Z7pWYXAvx7(enn{14^Q^+eDA)-yT;r;>a6;{$&~{r9&N{f&eF zmyXf at sp;rO52IvHpyyO*7Mi4xVw2Fy*etBW8^DyLpv8vir|LEUHtg*#da1Xg_iK=$%ra9%2qAV%Ca5?yEpQRg%Ng^vCA$# zSaa1acm>_ADOpr1mMIj>if5f5-KVz}a=*6qmKRyHmX&Lhg42g=0~kfGFQt zhySK};#u6HH}~^-jvmy at iV=n-Mr20^d=c=D{V&wm~O>XVwA0_ zSbu7S5%Ar&3`>K%;#ctRrfZiy#FYsJ67t#EAk^iy+1{E|H%?u!CWSI(K73%6RYn{s zV8Z*u`%Ense?P9VuP5j1>X#-tv=R(4sNmKGtSEQUGT`pXrn0G;C8U>&<(bm~;#`l{ zryqAx-UK{yaI2g}DPe+DBh|pRI)4T*ZoZai2T3ekIj-bI)XxliXtlRwJ@@!E~ z;q6C|BrI7agC}RgnAhkM2uycbYrJ{S+orGjVv*q+Pdrb at T;YK^}68 zX)sm4%rwpkXlM3Ln+aPf)l<2i_hQKszjn^(+m-);{#@qE>^0v9i)jx-D28o>jDSue z2+R(RBrr#affo4aA?#~32Zwx2>m`_^l7c1WA%!G&>@jd8I(aeOkI=86fISAo_SkTK z;@Sw~ngZ7m5rgj%FxNMBI__F{hyS9$`IYhqx76^p0Wb;}w)i)XPMfF$s{w zAim)9<28AZ(%Qq#Sb$(C`*soK^RB5qEljh}Cy+}XhurGww78gl!ViIX-y5UoXANXU zIHVT2U?cE6^1S2vRN}L5G!Z>ye#hV5*28+hELsKI;I9oZ9;LN>I0hxlOvsP7A at A{r z{m}{`1+K18^E#ax&@-P9CD~&N;!X>0%wkxi#OEbk=G7|4yBJqjj3YK8bNbdXr~9N z4us at KkxbPo9iT?wX##~mmR;_xhbVm9CCx=L)Up0S#GWiE6x$f>k zb8AWtl|N{Z=T>Z{ox?m9H|B7CHg{0x8+0ZYX%kjtmo6=|*MwCg5}kjpUR(D$E}mtX z+FeJL|BP!W#KfyrRP(48&0xMPlKTb>Z{1a>orPQ^Om|XrnT(mviLb at VQeV3EUWLWj z@!KH=-R)var+XONwsuXp=+*^r(9tMJj$e90ruV3Iw((=0LJqLsrKel(a)U#a at cpWn zTc`cX32uBz_1B&p5w%`~KE at C?_;_r~bTeo^uOf23?Br^}P+2?$R)hhEocCL=)va!$ zQ076E8pnEE0RxH}q!y<8(JknZ^I5JrBC%ozvw_!A;Gxc}b>*P0?Qom3wOtCG7l6=F zNF|939>9n(BSI%nT*kp@!qj}+9Dc?R8#l~k(q{Qe*8CG|>h~@01Reh*mIr-X8m8x-Lty at nhf{E0n|i at 2d(tU?SJ;8_;h0R%gCT`OnzS!U%s2fLu1hQ-G1 z^mhi47D*aqh{PNLRr{OsJ9z%c*l7FRLyH$Y)R0+ino z7u^#7G$=^*e)=T$5gcVkT0Zb?(eOd+tBvW`r9dMmWoP at CfU=*%ODs6!JFlHmiF3v| z=0J_QYM$2x`$K+z9)i4ERY_%9k>THrtSYqsRYz0xT4; z0G?-e`!unOc=vnaC%RbfGAvvhc5#_t41W(wv<4HB6OJzc8YXcCDMkdxLliUd-LFz} zNL6Aa`h9qMiO4N7&?&&j2z}{vM?L-99~fr2#2{1tDbtMM004OZr}5;!8h6?hL+}f- zeFx<0u2ZX%%^K|qm`kb*%Gmb7x{>l!MuT!>;oFC0oy?w-3V=P&BbXTFwUzJ3z^ zBf$Rx-n^X{)F;HTR*rG=^5UjG+t}%j_4_=F{|6{-D3Sxukk+4Mg_!^AlE+bkf~?M8 zmd^IxFcUuZUEyF*4n at A;jVq!Q2uZ4a3dUHwnh|gSijw7JWolgt5S?vZx`erUDuq>< zABEtUHTqmyb(jI;S{`-cIYXy>m0Fc7QKQn at Nt5!Hxm|&tdYP1N$08~o6=7G2I>Shd ztD9-lD`@?C`O1xwTRt9)jdq&k%=21+b!nSw(o$<%MW(q1u_Jzf`dGk|nmQ+8Coh>c z+bI1(SbF|-ZHGu4g;SvdEkC|RqgX5x`J`v!ymx-xU#m5$&}XQ3RW*@wJmOL0`mXu! zQG9+Unz^bh>nW(p0vlL+g$1gnIlXD at M945r3U7U9&u2vPv`tTRQcMa+Q0j&E(@7+# zs1J)w8I^wLM4d20^I*~{94B_W_Hp{70ff_W`Bw}wGQ(0<+uu2B zx3T%`34r`f^(bGfQJ!#~NgyvQNt_-|q6BO7i*UM*9TY0|BQ?Sd(7F>)*CHbX47P#>8`2SU!i2{?#h0Wb=?bGU_SbF}cBzg+iB}M6p7)EWP^8(I$1u z2hGB$Q`S+lLCO;sucqomzSWrB at QI=*0S@;?TfBsKHXQ7U1 at U*v4)bmBidhb4YBv|& zIapypw-|cFaSIJM at AKB=8t+!bqHEi~3w6d>&B&+Z{k%u~Gc`N>zHd^19q*4h^&>vM z3dhLWuF~|4;8x2$OFXfVF?133Bs{{YLDp{?1EMaX_c{ZuV^VEFNkM>oK0~lz?JPk_ zf4yz>P=H3X^XUy5On07&Ipw_aYgEgWVx8pmlAMA^Ctc9H_z8Y-=EqwL_t|_86Z7&A z>iZgje-w=7{HaM?^T4}V+!JK+zx7$?a>wgDh~wU|~oH2c$0HfoG`9 z7)a(0$~q%$ZQ+!R;g?^uGo22=xf?n+1|XI|BgKj)5Dcj!404X`E|FzHjDk)fW~0h4 zJoer>i8ZIRL^y8ce?llT5)C!@iCj5!;ozj1H4=fYEP7 z0>xSew+Bz{+KAqrmyAxZif=jCA!B5(#6 at uGj9=C?MCrka%*q-D!p{oOzxf(WuK%L) z)XnGm8idY*u1HSOoS!hWWD+dE(j4s zr{#uh5k>1T{Idh*n$6)07ClVHg67MT0;ElTW1rpb+%l8eUyb}as88}HP1`!-WH5vL zlU3W4_6Xk3DgP!|i+pzQJI4hNZ0Yi0dDSFwSZRQj?T0lRHu4B>mmNo4ZLpjJeOA(* z`-Fa$dSJ>Z#=-88cymTF?K$-CL+$SP{h|i{rz0`G!fngI4TKb_%qKAGC0>;3(D12q7V$0pb}1o4Xsy({xyk-V1(jf3206pphlsmC8c z5xxT5-2+=i`H^|UD0s{miCz!Tp?M%0v{0LGRrb`KMfZr9velKQY-ku)*3^xMZXCGc z505tsqp9?iWs?Rom&nB at Y;1_r8!s+}ken#XutJ)T_HdKlNmd5coGgXuiFb;nN%jaY zopj5swRIe>BDUv>H-?zHxD at H6thDl}Z|WY2M)j-~$U(c*kz-T2zu^ErDUo7ou5x;J zm7_~)iyULngASYsRB^qFE(^~u^_qq;9DGR&&42lwnta{Tb;q zn~;!CtG7sFVcaY at AX8dK%smxfFYh`&O%H{2+X8It$ zWTck5s!D4=Jw&~rNjpPP(jko{_G+?B;)%PiUA|nZQ((YjD0}}oHDGe=cZ0HlFgVF5#AfWG4a`6m^4{1yTRkMNB4usXSMHO9qxWQ%UNYUi!$YE)6zPNfwa zwU8onl;Ayt;p#eUcQf9d)r~|oTy=gs5Uc)Xo0|_>FwVZQCYUxv6%eN;40gjx%_{?g|`y at -*BO|5D|+&MG7GE z`w5D~c2ka9swg`J1>=5G^9KYZm+i5&1bUG zH;-R)@p}QH_RLU_YDD)&Js?&Ko8%(I$%1SklwkyG(nri77Gdr?yZT^jD8Ewf7>7<+ zqp_Vy+jUM%L*}yz?295h^l0u`(y=>I)J#mXOPxE2Qcr?7+pviT5j52zGi=mgX5u(G zgxpLC8xv+_kQ0(rS(ix)f<v0tG=0ZV8^gQOO>zhs zN^23X3prH}Ba@?5?W)EqNgtXtPahicBiu(Z8CF#j%5632(>&W%_UVWQJ&0kf;FXs9 zM+?Y8dOld0gJ3s}p}bh37+h{ny57(5Z_`iOR9(&T=vu3gk4uvctNk9Y47_lRR75U` zMD2DCtsJwD?#L4!i{L%8`thVmGBb|L&1O{3QC3})X>I5pN>h?xaKks`AYTlpVdIfp zG~R?Fek>ka>=2^dJ94hw2{SN$#b%aZE;Ge4ywhgzvQ(455Sz0Wk6BfzwV3b!x~NSy zMwIgr!Wzq){s-O7@@4OT=n`4V-alRqm|Xk$!S6Qxi*Cgj>%Ztm&|RVm at 3$@|{EKcI z$-;;O3NvF6BJ at 7kw68KcZ-{0TM3Gv^4c9P36i!>*$czWSOrf_<<_EigPF~}uc|m)g zKIGFPx)P8s=Z7`w#k^M#Un$?vIjj&=Lu~wW01iH~8n5c)op^wCqHx4KU(_U`4#Yx_M>>hwL!^~)g) zFX*79mS_|G-TX1BRp8Ug0dk`|F5h-14-xTs2w>@kCOCE4M#ya=_>C^AP8}HCS>HMe z__#aVDefBSq&N2Lckb-~Vb&2~2uk!y3Fa2U& zDZxK@>mmQ!Wyb&h!2MtHRh9mSFUrr2%&v+6P1&1}fNdlb5fM-^Bw+#q7L1V9fgP7l z2%#xhsj|fH-#-JrdqPO~;n3_CLg;o|ZH|W{!N2_;C;LU&Y#I{MAr9?u2xUku+R%r;Da;DeOvBQBA~SVbF+QNUA9`q#O?8v;Qry~%rWuD; zSyfZ3E5c!d9ScnX({A!xC%QFfN*o%=L*Xdj$}=ukOl_9+}WDYCJ8 z-+&6Qw5SVsIdHA3-kn)?A(V`L&c&k3e8> zA#~Jrbt+L{Je3z!ORaMiR;`jjhZkP1;hzOoXf9C9*_$KnG&a<1lkq+L({4J!+mqK% zY75thQtaWf&p^Um3$3VpB&oS?6MK!fN+b)Q+er$-NFC8m3)0NfZthGC&S2GM7#yz_ zHaC%dXwK};2(f;C1u>qy=4)5^IM+G8jUgmBTA(E#(6~0Q1Mhhlq3MgzEv>GZkh5VonQ6u~t65n}cR~1n|ah at 9E~E;$hA81wGD{ zH$aIW*7K!0An{Zy2#t{2>P{)y!k}3;>OA4qAi5z8{Hh00G8jPN6ZeT~JV-w at Xf$?P zTk5txLMYr&iSbU*rbW1OV2%9T8A7*I_4NP?+fMTJMq#m(VKu+~)HY@(=FXhVDcM3Y z1#O4&*!VY=PSlvy5 at +}~hp_DDq3j93Oy6Cn)Z)Ho^qh at ETrvKB>8_4Vsb}oF<;ADh z)^@Ayjuo8B?!_3B&x^ao9T3VKvh3>+d2=EWk66Np8~uAf2bKXot`Q&rfJ6uY0O9{` z;I%Zja4|LczXjiJ)oZy$0~Eg<-=<9*Ve&j6BA^R4J}4kRTOk-kVGR~2%zJZ6`eF?& z8r%@--878+lMp4Q3SlNS||DNW)u%vKV3gA?}q0qLIUptvt+<%VO(3DF_#SHJ| zuA!1*>ZV!Px?M}y>P=E{qi3;8UXLL(jEU5c9A(G}iOCMZ2DekxNW(MRNO at WqW!RJ1 z28Y6D%Nb|(IWB(>Gig_>_B^nzv9Ixj#mTg>(GH&i6V7gj9kjBLEe$)$#vuqrH>gDr zNYf`^W20^YkGY8P5xh?KH-dHditXcyZ!Hr2;?NBy%=chsfO1y+XeWSHlE#s!@8SW#WxKmwqAdoNyDJjLm7-LyQ9-w%oNtnaF!TvLo>}=!E z!T*0u{%MR?pLr%6v1voyyK;HaEM;-p=jq`37JJ{Dc%?L=?wJq-p{g zx2&HkYnw*!9i(-hG&Y!QqSRZ&yled}WHISg&WOGNS{@B6WHD+KQ zw)NFtrRuP?qNBI=|Ba-oefWxRon>!n-#?BFX)H{SF;;66yNEHi4zaUwtUkl=GF2=y z9+iBYTt^CQIJ0pInJF-RG+)k!y{S3JMr|k}tt;wGSzC>YXf;*z`o3(S>uJA8>Q2xr ze;{BPEHqPkcmK;HeAG;lU|8n(50e`Edyx)T+I)e3nAkx7!-RLoKX990*JDF3IJi0a zON+8s0HqL?nr5kMfCN*Evd0Z|5+vdqLVPT_(d+oyV2}HM7@?hnmF(%&1NL7v*kcvZ^RsLX zAZlE~ARMJsSEz?VN*f5ah~gUK&qmJ5y5+Y30RV78002b)herPI zX-;|G3Rw_^H*wn}!KK-DqeQiEB_o9eR6Q32nTV7i2n-atWj67;ZQYGon=KRVcN|?1 z(dQ2Mi{gHU1WYOr^|Q`-c8k|}w%y(Q&(FsXa38cvWZiuo0CX%z3ug|)5uGUpj563t zzAUqf;f4{#YDejTP+Po$|EHY;)pyhU`YXnjn-39YN at sq8J$a$O%!d(zV#!jpFQO+A zKz0HG~ZLV2wj|YeObfNkx_Z`}i*00ew*yOMtkEG8#S=5wxPOf*! zGLFL)#~9J*ebW9jE&1@>13xUY4NY6FR~0wA`jB(S58F2!40Q*(5T+N$0}6DI7z%BK z^mCxS!SjT=3E$$1Q2a{g2WlY#+8#Q zS0h^tU{j&YwE|Ubj-s+z^Gp4>cNX;7bCOzYMRTdN at RS;pm8o#c{Z9`Aqu?s*oSSRL zo46#|d%TCv=QI>Hhf2|K|tP0P)oY=1{p=M|INNs=Xv-)_KgBGW4HG6st!eMHSW>%g*{uNno>e>p=cNz at X`;Z=-dh=D2y%-5p#xA5u_;7 at Sn^*%;suvEvS8v4uuA-StSK zC50u&fdf-m{dzdr^_{}pzOT!=OK<8p(^2OFRR3LRa>%bg^{evw$%{CD+ at uMVAGK+A z9k%a}#JXCk17(l%y#$N58i2%kUz0Ia=>Q>Uvi6FGMbRw3M7sh*XBp%Jn)2en0 at e<- zl%5)Me3DcGrZLNJy!95R<@WfMC{@Nz&{lO8V}Z46IPIJch at U`FMW!pvJN?EscH$LB z?J?i5T!Bv&7#JcN!FGnz{2gVmJ>YM#)B3yoxz`vR(03uSWF at QjwSi$-SZ%Q0;QpzS zpUt)TqHuPpMJ6Vxn-2a`Li=~&kJS|#ZuY&t_4mQ~nULocO#r?BwxIkOJ*^PC^6bvg z=eEs-Osk!h5Kvdvf`#YN-fLaRw0qMtK`JsbQAp?Au4Y(BQCzlWExHD;HZu{ude`6K z_*S2_-gxFgkXnADyfSkKq3g*YxTRmUZ#5-g*ansiqrkOXR9sK9AQ~onEuM^Y?%Y_@ z*ln9m6~_AOWb}13S?38x1!7g4Du&Ok!>n|uB#GSoO}Xt14%$Qi*flQ3 zkTzQh2u{Iy7=DySo{*R$u><7uoU`u^hK~6R=>Gb~BcjQ0+JSK5gKj?MtP7K-oKDAd zvSffBc!H1NC6fz?(hkRn^r5PAu%qBz;1`B;d~}-iu-W^-?h&ws+{J38aPPKzH}i4`;uFI1#Fzd!Ct(Je_`ziMlu2>1 z>L{t-U*HEU?Zrx{nRiP<%xB~Y!fLD`z$sXPL(C`V#9KQl&c at 97WTey-dk<+Ef>~=2 z(P^ng_SS2HqPfzSzd61B+(W79$NiO zSs{Wn*nHw3SU?m(SWzwzBLRU7Rubr{AXpou2w2eJ9c+VsDVnl+1QCU*z49z~ub0lo z-0N2!)GP8|Z|26v&hY|55BIFADfZo|E_QppY)|~xFZx(MIDk-(2b{J39M*L>aF~}W z*x82cr$?OcFMq!r_q$Wj56^kS&NY15mjvLNs}FLkcjjfik_~FI&q!d~wZ^AAD%M`H z=2h935a8?MxK^2$7GS~mJNCryZGWE^xbH4$+S~cRujMcP(arFRIb+zm4L05Jc9ie0&DR{kwt-IV;;4j3yKO+46 zop+F*?8|=nx!oKC09BY#elUx791KHu86mSQUvN04X(fi~A=iBpgZXrH-ws3D5NTpy z1*Rqo@@NB08ysRS^C=}Z=GdHK-WOg7bTebcqXfJs^YY*ynt4{47ieE z)4G-yb}E-KWmvp2hX&v=qwZqzg{h_}b64H6g>x(sIBA19%~3rXSl?%*y{0%q$N6wc z*uV}_hYT4Od6qCvc at rD~4m=C25z+lIj6)bwxFLvfg=MP_714Pc5<;FRhHM#PQTZ+P zPs}lXBa0xUPm41wWCZom;Vg=j-P{>|6KCc~-!ft)j4}D^C21onRHcfK|6H7nXO0k; zE)u4>#FlBs9ixXMPcN5;PQEZJ`SfB^k*sVBhnPPgn4yNWU^w7J_dUfN{SLQfAX0Wo z$ubXgp)Y!*FJY^=TE>PpKWpTLSeT3TQC^(Om0=9|O;bE-3S!2&ELWVnXpyqWJE$0R zb`SHxndqlBH>>&dVpA~Ww5W03XLg8V#h2=*hJ5y at uom@reh>7~9 at n8KVvD|bNc!YV z`K=>np>Kz!o;H#U!vj5u&UmJ%rPy7!+jVi_sk-l{p{s#=t*)rY$iG$F)KSo7g`x`1 zTvsY~B06b(X=DiItHoe4))XFCDvQqp6Z%0_aaqs|qX7xr+S1X|WhKVJWY5>)k`_Qu z1U*PPPa2;wmQ`^VW`VN1Dppa*3geZWqtsL6quJ}U9oAQX>RPYCp|xqRqw874q{HdN zDX5{Ory3e|U%u}NeQ&zE at s60)r=_9GDK*eyeL6b8`dC>>Rqt-g8DQj4me#AUYgsWKsyW!u5 zG}IEXB}@KWU7vvIL8IdzJ-M96CV3P=thmy2EkJ29I&kbLMq$(clO$q2_&C6bb50X2 zYIO+hGD%G}z{+|NzDgj!5~exGxY(A_MqeJ>Z}>UnHI$XHq2Vc7EyCl867U2cE<)Tq zh>@i*hcr%;K8MB7UCMkHQ&BVIYLX&Wu;0)T>^x9!sYKT>{Iob}jOe8ntw*U;a?q4Q z>5o^zPDh=nhMNB(dW;&cg_8ABZjeGB5xBv=pD~+NWHvyXpL(VV;3E#g9Sa at kFP7fI4yYU~$_ zTVuI?tV^P)3#ys4!6JR_BT6MP9Ck62r74V43A{OpR!N-ndQ!NWpa}1W|B$SbOov;S z%V)GX0yzWH>M;ef$k4}d+&;(RSqY?*0!$S&EpI)u3X6B_~uVX9McsLH@=A8aHh3Oh|RSc4i8Hf!Nh} z_HQDuC2ITa?{3@`09!lkMi%1y1m%9jg+_6hD~8S^KKYw{0#mh2T#p*nRn{*~zP1>r zsh$;rh^a2>w9KhAOwE_Ci?t+HYSHt=P(@9JN|3hG--(u>tmGAmCd|mhuzcTVi(rU0#>3h5$l2a4d1ja$@8`*(VXL+t2>W=mFirg at jJXA6Kq`SSP^CUeh0-IAgAXI z)e_%zJr;QzKc`c{3&Q#r*C8=Ky&%C;-)?-RvX~nu(7)&BGq--Wbvi1Y5fu)eRh$b2 zoUjY+2clXAaxxTIl!i{@aQ4wt5V7xN!24#5!YLv}DsACNxaw at vd4>F7;!R-fNQ|#{ z!2NP^^J4ds59yX at ZrF`BiX>!WA{NkHpat#(SsPnyIJz>%6BX9P&cvufH5fR*oguTz z1JISJa|BTgL+vuNDXyjp at A%<-nfuDyTGlH{z4 at 3Tc(VEK^Y+m)J9tHtec$J~Mb0O! zYh*XItMfj=7?A2qR(z8}BQIk2k*x-yAG z)h& zHcTHcES4V<+KEq=!ZwQq{2y4&CyPJl8X06I9hSno5s|&RCXqL3S`LLW- zUuV!mvbXl$G^#2lq0uYDwJEt8csshx{2esVRg)tJvr}kkc$1%{?)bg<8cY+5$(4NQ zM3XSiO&=hv6a=Muxo=Kq-?NR|nyjsnW2qCi9u{^fnUs&HEC}1p7AeWwGc9;YG>5v3 zjhCUtr^O8oroQO6vA)#1qgTrGQ$G2*UVd-e$iYoSQEtOdKyHUJ#Z}c+_d`OclVx$1 zuu_PAE!X_70AvO3l~p}W^6NmVBXWbvIr82lr}|Kdq^^sek+hr at qLdp+VZ`vt>Ytd@(38!Iy6K*Y>K2z?#@_Wi#a)bX2=-Nwhu(e z;qd!Haoh%+adv`QIecJp9pB)3PVbPvY_L`x4z&)sz}|aP_J;Ru->BJFFjgJkxR+NJ z;uN$<#LlfONg|FCkTEW!E;+lPZygW8u(X!~cyr>Da*s*yID9~E8P7HYFvUp7UE3w) zaef4ypLTbr&`5e6iOo;3*&RJV^^Qioh{pBzRPDBGwydyP9oMY4W}>;HV6)oAc-e1Q zZVpDaM|ii^EVit%UL6np3IWGy7vHTqXsRm9ubIfVNVRZjBSKE|iF-(Fu;3jI1rG`B zcx+fQM$GJZjBNI=NZgp%@mO1&JOBk7O>H>YTQFnOM-I2v?0EXu(``V_N9zyU?@0_f zBce}iurr6EOA(~m{^E{k0$zpzN<-5Jw%<41!#o%Su#OBFEuRHH|6V6P581E;oxRWm zb`8l~SZE9yF+8=B^Rh*BN-?E at sRz{sVsksTUoonUYxdmZfbo1*OSRpDA9~t#{pGgl zvbbW3=65UB6&_2P-Q_`&k`%aUb^UghizuRa;U zwqXn;*0N at bOP&M4w#Tw}WDCQciEfR?W(<;va}a^e&Ks4q!JznCg~HsuzEd%h zX=WYQ2Kcqf^l`q at HhdqUgHmEhRo2HJN`>nsnnf_C6nB`pkJ-Yc!SWR?DGa1MV29MD zC-|k#D}RkhC at 0dns=lqsDn5>%?3i)eQ;k`R9A5D4`^6a|@B_`W=-%b**R+L7_l at 23 z6%B8Ny^~?P{ZHjjElzJ!3>8^%Y7A*FDJd|;v^df)Wl{!WtE}u}w3X)25(|syIAiKa zaq%UexdKpd9`~;pIv5|L{)h85OQ|zOGjGN$XK5GNmOayUix at TW#mp|^4z^_}1Fqw& z95be_ON5J-%FM;whLp;y?`FzWLdEBve!Z1tN1<87 at OVWG;*0X#pVY&lm3!rowqzZ> z5@(Br9cTi_?`FiOT;n9fx>(*!GOoQW+&|607uRVV9^&1+g1hgru?jKqxaEp?)m=!~ zq|7StR1$n|ax;pysZrH;W}pp}tEAyS2f*k|@l8`t=(K)8R57y~s71c^2cP#uzWl)7 zvy73KL}M;WFpIv-g8%^lj14Fr1+B9;FixJ9?%;+SKWs=3k#$vMA%vy0e zC9q9=$3TFY#%6MK=|Ye1mjwv}>9RC!McFbwuS*JY&YuA;<}ZuK_k<5a^N8=yI%*So zP&@VKh20rSfMJy`YQufo+6a{d8OM=m!RHrc6zOeD0Fv!ylHrnI?B}^BS|yf$DqFPJ zSWPKGE5nC|8S at r(BKi-~bD$UR1)$Y7HnN68enT!FxXr+bx*Mz~&_hTA$0%}P+&kza z7G^`jhC*dwM^i+C>Pqf2|3IUEkkmCOwIG$kO6{~$x+>1Q-qjW_QLJ%#uOwlnKfj#9^g&U*Tzq9Dq!Yl>#3_^t0!v?R7)|+tAT{egU4uOGnqM^hbb0) z(6Rs(lNL&qTvNjW*3X77MZv49#^~@#Js9ZZcS?Lqa^bTwBUK9!9eyGze#iiG8Yxy~ zxOp&9*(NQSEF7ZYZ57<1b at VmX0Ru1*M9wt(_v7D<|2;M2$c_T~UJoV>LQxhcX6vE_W&mMLEahgLc{gAeCgeP+)d2c?LT$j=l%ZT9eS`kyZ>9ahz at Y&aQ7Eq+YZJS3~d8yq-uI^9b`vgpX at HU z!w%>V#n~o^8AZ}Agc|W${(zXnijVOW?tEd-#u_&1__=y9WT`Qy>5RtHK_ at ip`ytG2tQ?+=k|;@EjK)mo~YO zzbg|=Bb7l0D|$th@*WN~6uU;`zBG^Vx at Nj z_La>__ul|sucJq=z at FjV+dXednY5t7^44zD2Xogo7+h?Y13w_MWhj%Qq!zJ}5PT42 zL=L*R22>8nBk`|qNIx}!8lYMX{=a3*pZwbK3FSqYZBS{1LYfrs9cN-HxpmK at yNoA`NwT)j6qB8IEYqR73{gg=Eg36D`#jcy z{y?$y-@(H$IZ0a$JQvk`F$u-<7kclIFRP;%wFxRPs${T$gbIRko_g64JHviDobv-C zd8 at +Kkcgx1Z>R~-xwJYn)rA($Qk~O?W^)G=CV;I`x zH=HKkfD at 8@K1hS4K at UF()uAvGG(kp=`O70HAsuI*reLSc@@}E0JbStNc(UK+)MA4} zcse$MCOHOo4v{{~B_)K#TUQu~nMP$@H_hO~%^HJ{;YPw{7oxZs zxN|)mgK=pi&IBYA5@`rA^_NRA2ktZ?VWahszFArFT15{=K0?Xv6K4yd&Q6fC4R-nI zx~$~(FWm|lgy!?yYzH!2>rDXS$~MEg7mk?*_P)ub9>;J8{Keh7%cUU)`ebCatOF(8 zJ(e}|mIW`6`{4n86JD_G3fo%DZMf}8Kw!q6M?W0j5 at CX<36R2vrIr|VEV9TTLtBtyA?wvp#BlkmL=F!pBK39tRtJ?uUENgtmxX#M|bFPn)Uuz zH3RN<0Os&do_lE>dA|VhR8ce7w-P!rV%W9$GVp4&W88C`>Xz7`ePebB4$jjIRZC7m z`4G!OP1*i{!LzD>R_UKCPXA8AKoV70A}o>>3KyI^-3J z;!3^hl at krU`D$1LR_9 zb?lz)rLo881~h(N!|&7wPEYesEanROR6~zR%`>`N+%xQCt6O7WwY}!pM+~l+?`((` ze;v{#Iot5YWXWcq*=AJs-)E?*TqAFdX4`tMO|wdy8M;>77O+V#ZfS^PER=B8I*BkN zGMP}>D)tp7g0UEs04qUywJ{+IBRG_Ni at 3t80YsWuR3q%rd5g7=yfH8doP&e#fczn3 zYbl<3vSDYQND9K&y3e4!&%W6kL(wXHsOsq(lkauHHu=uviMX|6%d4-j?4cvrA&~)g z)-PVH9{qlFpz6E~EUT6fFN&1&AzuJ)ne`ndAMqA<(|Ckd*FC%7!}wPDHN7{8tTsA3 zH+iAPNM1QILV}#z9 at GhQ+hESMMxxFJ#DTNqsp*{1WU;hfOrlNYD%t!xIzjvT^q~$j z;Em*=!e(5`b=Y#Hz_q13rP_HPOd%=%Z9JP#0t at 3)LH17Kpewn#*&CR|D?5j*ZQPSJ zUW1x#<*QDWI8vkCZU>wrs^+N5B`LS!HF7d5$Ic!lPCiF>@tJsXlnbe91$8K`QSp!G zu`8AeR{|xEI0)OZ;?C3;(8(6j;38}}%9r?Rl6~E{yDglIxtqwy>r(VUVU`2iW><^K zYGLhugMZ$5VnwvBYlv48s9X}e)zx}J+P26WP-Nk;JQ}eyVET>2FeAe-hQi6Oza$ax zhAX=CWM`XDs*OhpY=Z;fgdLz2ya-REXsLpESA!0Y!1;L&!o=$<*8iVeVf=y?9 at P17WZ_kS5kKiqFUD!%;$S!o|V`sRR_dQyeCqYj& zD{}x}6Cwv6`+bjEk9|-Frr;l7FN04%+XNX81E4A4s1revq=bY(3FhQ*E*2VABuc)BXf>MW>;+L^6NGjX+9$i)!88NPz`7;! z$(kNW-5EaIz_V9+a&{Eh9+^?VpgjykMM at 4f= zo$tU+To?pl`-shqLdgoWHBw*@Vl2(#WT(@Mk2mv=8D4t58SYU^RKOt884(!9 at fe2( zei$>C$UF9b_J?w*mTO|;y`$^(iL=Obix$U4p%kuRz+i{{R{qX;2 at r}|nUjU`xv^@z z7(uKtnj~|LHKq!{dt*M;rwZ$T!U$&HL)6kAFyy!*!Yt at 3m-d>){bUG!P$!0>pjI6O z^H|JEWrUghkq!TkvyG(UcopJgA`R%707O*kiuWQc%1i_8aNgz$ZBr8&ZN)nXqJG9f z+!x~HQtgFibMk@*8cyQz`V$dueVU>R=*^J_H5R6GJAmYt>Pu)fXGKKk;aq~^o&~lV z^_AOft^PACYIEr$P)^{1GiDr>YqU at u6M!@)9rX4TNN^^a-#f|Wg=67OmeTWr*_vu7 zO~(d9n5`aab7=8#Swof-aA%=?ZX`kYDUeFF0h^+p{616 at +jrFz$1k-*eIQrM25YDO zyFCC6*U*HkJs6-zNN2YCP{7yJ3f4N1h1ZpN13hqPYu0%)df<~+-uo_}d>W>^AgODY zhS9#zTQ<8;t;V0(YkvGOn at 0A3ORv2==6jI!nr{Po*WCxjUwH2*U*3T}uSOokX~MhZ zL}RT0KUhqR#~(Q*>R`P%>jd6R*-QpMsd8>WY9Z~X;Jf!h_oLGp5L%$^rv}K!o!A%y zUMAE2*^HEcU!bVzX+Q4Q^ao~F?%b_L3iQpyc+D-5sa>%!7WgN6ua=VdWk zqhts4^uv~!3E4c`e9e`&wjii2*)RJkiyIt1fe#>tMXBcQWwjM2aHohJoA3b_{ZMqg zv7zpa+afm^DAwpGsADf4P)OZMnf^+gAunS9_&698b&ID7G9+W|^ z|9R#Fo1C5K!2EiC+udo+#5q}`CzkFF(CCJ;ye2`+6(= zGwahl>vNYj>yyI;n-scgfU^tINw*0tYk*FB&&cHhFU0L^Qpcz-3WUN@<}z>cnqzKc zKkgO;M8dOdOA&i7W`p;ff~6?l1*~SA+$;T_*#Yr2H!RH454#@jQ-B5?5t_&d7oq-Z z7qOlN#~q1V)9?c*<%lavc%~z%>e%$%f|g!-pwk-1-lk25RVTgyfotBfr6i|l2p0x0 zD<^IrMWAL8n~OVmZu1=YJG+Nr?Ht at V`$w`B;P8oS^xQQDd9*X6440(F5{VkGRGo*; zbolsOjYs at 48d`uW%cWq~4q9g%pqZdNM$Sr79kb5uR$TJ3a`)3~u^TJulLd#1lQ=Jy znd|(cNTQk$n5#0*-F>2y_ai%94_&2Bij?D&3h#ozR^wCQRIE)4lhJ9k1cj1#MDb9e zYh5l$Qf!J6bdeJHMka*D9I9!UX*NA2$QE4o9xk9`++7j3sVf+fRI(!$kxl)9$wN-WiVQ at +a1+pe;LnOl?$9{nUeFi4!n; zB+)QL8SXKgvu+HMJbcEeyKmUaf89YTA(d#nPJ>pphuApD%=o0iQ_3XeZ;# z8dTP?tyHcUg>}JZ7N|pbIr-k7RpUbk at yXY=jRBMDgm?V z7*oO{7g#dIoQqYR8Lb19Z)=|x*ut;gD}l}*a1 at mBMZI0MHbXT-1mXK>2jedz3*79| zog|`7CuB6?66C?=WdZb3xQHxLhB-~B!YosUVNTUi4q!#*aRE0JlLpW#DG_dER at jmY z3-gK?w-PIFZq+$bM{+Xr$;C$6rN-;|#`k5L1u*Ff(ZyYGur9|_#h-k5FqGQe(i`ni z$>~-QQ>NF_Va9S{2il zVX0f89eFxp4GjC42Dx at XdiY?^n1|69MVfU0akHrv)AfU~|FAwe*9?p5lqP%H-$4&w z_g_z-P3HYNM*^W4vjUwTkU=MO%Lv{b97#Kh*XN=VRpOkl z63g;3)x(#vg*VF?mr^U)pd7~aFMpSE^cNN)caT1~qGoJE8fwmBCCHO=$LBb;_#g9t z0iHUdgk4i0$ma?0KyGK3CeqD$U$8zcS)Y|Bi^?BkXtY6TxjOxb$v1<&&n$`KnX_n4 zr`rS{)Tyfw^(mBZx&!Gp*%`nFOR-5Ec2;ayCI{;-5p|A2H}X z!od#(=n?fl1pd at GRdk-wZK4QIg9*|+XvI)ih3PxkqhDUdoTRS!6i^J-2_!`-E}>gf zp)FD-J;Hf0-wL%n;<-5Nh-W?mHjJktIQ{r9ePRsnBV%0qK#?11uf5|C&7ju-T;3C} z*`(!T6ayzwig5zLA-a&f at Tx9;s!W at dvLT{yE-Vp0K8*$CRoM(^RjzR^ z`7H5K-e8hYY0*|xn(`~A9i|9gBr_Cfc5kYnUw zj>tJ<#ub at y-+HY&$3?kuo~i^R?@0{o(48?zr_m(Eg-b+)wR~gwhh6A#(B3Ye7b(iW z)zHF&EHGv2>w{Jl7W?pz at jRl_s~GPMu-j`;Ac=2Fdnwct4NTooa3FPj|$V^!H9-=nd5EfX1<$ciZd zN1E$+_Nn=^fI!aD9yuUJC3BOJiZF0QdUKQ#bxm at 3!|G0dvqx}JmegV_8R3l9C6%(; z$bQgcwzrx<-G2>i&_-$2(NoZ~iObVLe0Gc>Qn(2T(f+k3)g~C at ju<#`W6U;P8Y zT)#*k7QHp#*usmp(mAxp at k-UcijNTAPP#|!LDsz&7pA$*e8=g52iS`XkKaaln}#0} z-0r9!%LNkbG at o{)WbVVYh~rIfaVo1vxKUeK${qdNHP$$^b$$f}-~`)^bw)Hz-a1^T zdj-?j&l|_+q--F+nYfZ`%gH^QH9qY^zaqKv!G7t%n8HPp;6vOe at e~U|0&d5-!8}L> zcG=_KCv?hy5QG+XA&#!m(3H!a?|_X=z9n6U7MZ8RnkkJ~a>S)*YB*rqGDc?-`hDI( zhVz&0lfxIsFMC#{oj$KE%nq|jG^L at G4=hr at b(BHT^mKJ?VZHgk&>5gQv|GGCMHjlM zrjgAik0&5*G5HeqLI1 zQ=?YN^`qh0!=#QZh`m~ip{`Ww0ucG at p`wB4+)C~2T8o%9q7cVF4zEM?Np)XHwAus8 z9f;?_-_8vTm{ZnwT z0y748C0e0~h>pq=Xhb2On$ah`7QEAbBwsGgQ?x}s*k-$Ll#*d{*Ad(1RS#RdayJgFS2Jv2eNv$f6xnB-96b+JiAv=aok5!~njmYqh`Qro}PT z2fx~BbrAlBryYBfqmy%x;?=@)um}8mZwH34qpgr^8~C;ZcMrCWpx5QrY;R|}y(`MR z>$O4e)o*3N4he5J!r}l1E}T(x7Pen|lF!8xk*BJav7knZYbM~f-y+?V9yK?rqH>p| zJxgDB3%+dV_(}$Ee-LhsY|);+JfLe$T?9sE&)U6(NlCI__X@|jAR#yf?M(}b9nKt% zw;I1oK}y)i0=l9I%d~Es@}=nHJ*5Wugq8u(k{U9QmQOymtm2-HJ&y_;hPRVBi7U}5 zIpb;}L&>i(L&R-i#yGPI@=yTcoyL; zk%3_%r$a6AY3dklGDgj~v%7*74Br?; z^|S;%VVdjNM}CgT*E;L)*Dw3DJY&*?C&of;9O7w}UMimk;Uc_12%8X$M%_Xnk8@%+ z*=(hL9OZU`KtSid8=-h|GkjQk`~cRg(^E-aK=}vRUlqkdA%6I(ZOeTXvS%C*%B|~f zU;@|t at R}RgyWd@~c}}~*r(3Ve1>az|?fzkk+v&z_A23&LKZATXRaQ|uqN+~cSa6DzxN$TSFJ78RFcU8@ z7U(T()8XL$T at w-)8O`0k&(SF1NaaQ_%4W)vHe-fn~OKkzgjd#E{) zaB{*`ERa&Q^QgaZ|K5|(_Qy^A86x}jYMbc{W?5JE${%vqp;D^UE>*fk!GbQ8Mjic| zM(~U#b28$USZ!RcKn`4~RLhw{2=#U at b}AtjA&2wk>plfJ1Xns*zppJKa at g*D)LzOR zr7gPY*-{HK3F9qI=C@}W6>oi9k-p4C3D#lY2eizDB^7yoaS9+%*tcLc#V#JbO&2hQk3*gf%e zN6fjOzZF#10l$0DMd*cLdZS6#4 at wtp+35bZ1w2)&N8xV}<&2ab5s(%Echp-IBGx|c ziwP6CH}1O`BE~iDTL&FkuS}ws8j}!Dqf0^h6tqo)Z43k`NbqwtG`zV8lEw1!5htSG!$Q2K(oh#=Fv9HppTk-tyIIP@~tZ&W2W zCd-W+LGALTPYRb at 93R3-3a`o=Ne27n!e=5qkgB;~a$(7_0nAlA#ceHH;d<)$2X~Y$b*)Ow$%Wy>8o`pFG-_2Nk zD!R`h0C#f|-aquIFx9DtNTiQ0oFhn5_S)`NRBauNY&S45v61`4K|Sz?PJJ^R zWMQxN&3CG?1S4X;TtZ=}3n!OOiK}jJBj^#x3BK znYK#FXh;|t6ZSCx$$bMm8=w>sG=K^A!j3sf-m?_17UVF`?YC21#t+} z20oO>Q}6eD>k)RM)$VqJpH&8Y1fST?AE3bQ*<*@$~dypbF`qk@)uOvO`H zbe0oWQ>v7jAU)C41bs)v at lOvQuQZ~iIL9%l%K`!?c8*at_j$2maJ zOVD~xYYf>3V{p3K&-&OjI;muedlL=#;K3^rNh&t3f)R`h(sX-E#Gm^drs5$xcq6!r zh7tQaz)6FI4M%t>^gACT-A_mFueH;8*=*;5g``P(O+#^k=z*C{&L<8fj361{pG!?u zG*!gehp#Y3zo^#WHfa^Sjh6aM=K?!R at l>mAkf<|)OrXqX{YLx(M%>x79IB%nx%I4S z)nk at f>ucxqX>WQE5XMKT(>L5fnCiu#D?Ta~?m2R49bzZVca at l>>+g873^+yC=3&r7 zz#`n=#TCzd>LKgHm-B;c#~ZunC63<(?|I{AN^l4%)FKSGlYE587$6Klt*_og9N_zA zqC3bo;@;?MdM9;6hS at v@&|X~I)rSd&b^6e51wHe=yZibt;a3nbhBhgaPQ;8z&nql9 z?$JFnViFlAGn}5U$i}ga1nz5_Bp>t~t!xc&?0rsXKZ%NnbMF+y=V;4}OkXFzZ78Zg zzlH at C#7D-5!{QE)t;Dl;5K+{jlXkp(a-U7+hl_lJ!0j=TxP6zi$|2?Tf at 70lrA6xa zB)SW+mkJOOkYKIQ+B~>0S0;|XB{!ahpJo3c4njU`%Jk;w%aZr|BzJT5jZ#eE*!&%9 zIGvT{4lPjSofj}h>PSDX?xP9{p{*Z!bgBOxuqOJs z51lO(K^}8ZUXO4JQ(dNj27D44-NzTw|A4W7lu1)NsR at uI8Q{TRvc|@jE`z#u_ zCvI2WaC$_FxdeEZRLr--Cu3&6UkH84!IgD$3z+A83HR~I3o=__*as|{sYXg9Dy)o% zcTuBd^K{q$8D>N5SZ)GC9Jf`phF7f>aCnShj6KG6F?|R}+!Wt2#;+DlnG2c{>p-wa zD*3(VIxY<37x{8ei#A(V2>$~S+_0_G-xn(S=HbZoL(p*!sir9?O#XvychpBb>L1t{ zfSCpfaKw1&;xg(te*>Tk)D1mY&{<=ibp at gpbnTJCZkHr4r>% z0EQ_8@{{>>PgJ*NYA7IGwPxx+pAOI^5iIYF6}Z9N9a9qLF{+|k5p0@(WKs66>rJ5E z076ab82nAd-zU`&gew`aS1~?Fn?X#V&eyA8mZa*qkA1{p=gNsfRk zfB=8gzbE9w#gG7-8c39bG9J7k1j)rYkIVq=8e|KayB{WmsYOT?unE$$e_Ckc3xbEMzN z!wc#Tz1qGF7ol9>LaF~NZ25803Yqs)(a$5ZMw?A6{_?|E;v?dK<1J*nr&*eZhZES3}!A at KOaltIhFC zYtma6RVDSpB+Gd~^8ve3`S(z9_ERVe04qkSux#r=kt{t+mhz(I^aG7U<3Z?y1{0xi z;X#1K1ylr at a0xJBoq&Z2kujmALBs_$fe!5t_Dh*{LpzEakyJy+gk3iD5?tasUIho< z*F)#G?LDGu-Sj7AL=O%(E%Rpw>+%aTrNe_3NHC>?Lk^M4)N#+3H)|to6*p^ZYSp!@ zGt8)TvB_R9(zU>Hb{nF|=GNHH94IxhtM!H1*p&aiB%@Ou+9)=DN3WJcPLfI62%%dZ z=cqz!TpE at Oz_IdY+es-1)v)ta{W7PnqG-`Wre@(4Ph5uBsxJjhYTASmVMi zvCCQnO8G(E4MX23ub$tm7kNua32Ilfj)K#wW)nv`p^W>YzXDAY{XtQChe#!^yDa>>r%F0QE7CbZZUgSE=+{0Mjb};Q`tkS z2Zim2rxRnxmzODpw+;$H6K*8dq~ao_re^+~j-n!)*wg5ybFDG#k^QY@#Uq6%XQ1#M}(o7^W1wE&W|!Shuu$g$n)Ct6E36DvMLx>;JG%lV=ZeE%HYalf0&X^%uB6PtdjZq?Zji zcjQq1z6o;$(Gi3}RJI4U88}0 at dmwER2F6^N`+#+8Js$iM^cVM}&NH`6UBVk)iEe~I z1zP^^;o^O^{L-VOim^U at vCOA?p*W{6UJqK}oCm)o1)@)?K at 7tJ>L?jw9xCNhO6kg>jnVo1oH4homLtyaWUdW7)^pd zN0a_24O(n`eYbh at NbjiglGWwUe>=5JXlZA}1_cB}fei#C at IO1wDd%8pX8r$v+P_9q z+YwI_ou6NKZjpX7YAn)p3c1xZ9>d3EA`V|Vt$1AJmlt0ny*P=5U2LAj^|UK3KYyAz z3J7#YeR6$Ry at N%futGO@<%6iY3b>%sCy=0;@(855l8`dmr;wAOhoWs-8avLZ>0i6o zJeOPF*X`F6%%6|*OQ4s19W>1QUaHoE3M!pDSG3zPR%9GMp<&2ksC{bz&ouwMXk%P~ zVL`$ZmGt&SNzYp^WWwWMS-o#ly}d(a07!n!f$AIEt*^u|tlpm2w-+k%N+6m`)_-gMMRff`LqSjdB>_%vBtf9^yp zsnbhe)*@w^PPX(ZCJFawJ2w at p2ZY4bMniSFNI0O!R`Lv2aDi7~VN+46A(JHBsrve% zpC-#D?ypX%RYGGXo at r@?-0 at m{i4+p#YW1Jf1WA}u0nWONOl{yzex=eB5ZSm?Gb!Rf zWj2-TjQ#mm*+ at uOf668<+^E$}&rSTIun%*@gqn{3hM1HCuH+!5wNpt56wfD{E6uAo zOUv at Oyf2cBvuU6)Ph at __v&HDNN+VL>jH3_~d_$n=8z3Ml!^SyjOwXyO_y7>l*!ur&Kvjd6Z!(vsyno`@@~a>_e{}JHs2fqDL#dAtvjSQxF#I zAgKCBj(v{ePmoLlUkR2>Ugk8`JlnRKocgL2XPcG~W>OSyrW~dVHvwQUX*{nG7Mo)X z6KqS>e(kNga8B1bM{dvErxph5KI(vG%*34J!B2GkBEk3!!edh)0tBJ at i>u|4jJv~~ zw&Nfw%s!)#ivf<-CQcraw>4LbIKYjm>`%}{bJU>IMU5z}dJ4rPh?@oRHAR*sgF;GU z49^1IvByMTclc8j;Tr*);l^tIonxkos>4D`x}c8RKooqI%|q6ZM!P z`)#TSPi-Nl1&dTl|FraWEMLiO*>9o2sqy8y`=Qvg)NNSfMiVL4Sa4*+!YvQ+>W|Ye;7dZ@#BvqH^D&_{Ji3kD{?_j^Wdicr4uhy2I z8LA?;;x-4<8ykV!riwluu1#%{w}6LoOO61$k$D at 3Z2QcsePJrPh%T;jj5ydF)hE at I zg;fpdOA&9CA$7#Gh4>%uWun8Y%U6Nq at OFaR#IGRn?J88ynqi z$4#Tohn0$VzHE(&Qx&Ke1ZeDOj<4#~uJalb>-*_;r at xkWSYOz`ySVrh2=H-n z at Z<^cQ5_90S`R)M>mI50R8yQH)zRLP3vJzoq&12KDJ2pc^Q+6|IhU^WxMiVx9l&|U zbmPAyXj_ZGT|EZk!@Youz7c=~u7(SSUVm^`5WN~$xC25g&bn;mjhcU$_bt2eA%*Iv8w3kdZ< zI?dlVSTKK;@kpiJ;L>>jUj0_{NNK;k=d8eA>BpD1`t$;Q#$iSpP04Sl`ebvTR4Sfz_m0$;4y1pI$Z^Qd+z_Nu zF%$el6FzMx_ja|+YS<`~E|~E=tR&Aus>OJNQ2%Vim7Ym*)``|}KcSGnOeoxJnVlwG z=FNQSPM+)%)BNn1pNx}pl7}-2m4$Ea(ZaSKas8^hF6G_~Q%({LU7FnyI3MQRxrZPl z2zyRWr}jES(!{H=2nzg!WI2gXI2JT6{yc4LAJY#$VD};Lc;z!_IJK;N1;8D;>xB%7 z$xvcrZ#>??|H^1~>ChJPp3AnnCZoN*fNpj`NN8cy&LrrLxjX5n|D|_vwdMkPpVxoV zj|;e9VZO7L{Iu8P6FJOow~VC9p4dQcY|U;>ZfhOuvbrSt0XKfHvr7As7&*GNO8g15 zf6qTl{Ru^W-<6v9X()1xSu6}?>$nBx;kqn;#d=n0-`pqw@)(U(hCtPb at pM3OXrtqj z53kP8=&D9Rb)JuFx3biavBx~bXBg$xk0A{)9(&bq{%hYo#w`)gbId&|`WJ>{x4%cT z5 at FGQ>O!Qtlwo+Q^Ui=u;ResmMm{6_38R%xorL54qViQ$BM#;$!tRaj`JDYSC$Z97 zf?H{ZWJP^0t-&(EtsWBZifF7hEH-rj!qzAly}pU9jO4VxQ!_*Hj?6m&t6P!CwY|IH!g+}8TlV2 zWS+NFCOL$#<-L7wxcTRN^IYb7`uu+0pov0HmE}xmqM!)IkVa6A<)e)$p5EssP$hU` zxWmdP1Unq;hK`M=SvjJJOn9ys2rY18rj1=o^jEflPa!^eH%Rr$1ldqe*enPq$$rsAJ`9m>@E*!PjZ!w#)$Zbhpi1clYX( zC}yWORcwZ3d?-lITL6hx_O?K%3^zC7JUITKwJOvr1DB$`Pkf)o@&{SPP-;w^t8tgS zRhBJ0Tg3QTl~uc4$7ux!O&U4gZ~&YU&~T^*S~7mv2nGVkh7k4ai>6FxbU{1T#^ zE7GRYjx)wsZSS(Z4rwSL3Kj;pYp*CkokJTgps@;-8LOFPKp>rB^0mYMbK&LyKP073 zcFuy9Ixo|y{abLFWZTp>v*tBBb1Pf?wqPFP^@k9}*Y#fF+`#^KI*mklZ)P<_^Zc3) zw}Ulu3puZx17#=GqWlWR2+rANBA$SR=mRfK@`S0B2^79pdz+OScrQ;#c~(&6>^{dk znn(fP)`0%s7d0<$;@W(Htw&Am0(LREi-1pZq0~@C{92*p*+OYx9l at IqtEpZCcQw!w zFQwc(q7zYQTcBXJyue1FC*ZI%2jHy2%!tsWT_WEa;JoTRES at puqoG_i9)(`8B!Mg5 zzTU?2I#&rUitY zqy|7F+%+LfGYxijV?Lj9R=jlLf9nS^ z^$O104FUw at 1^IvDE|&i)(7O9CcYWVbZR%WL6>tp at Mxc&yPzeqjl9E9%6C*^3+zph~ zcG-_CCf%gN`-|P{p}Lkk~US*Oc*_6Z&59bx7=ZuTksQ?4f^nfx(~$|u^JEhBiM7tsE*zBf960rYPM(7Be3 zE4G_4X_?|nxXEtK5}D4a)~WR18JO4A=_pYt2dp;xzpViKpr|V_P%H}FYpC63uR9 zWnoPiYo0Riaqlp#2-jm+!v2R5#fTonT<>#11qG=d5yJJaBPn|>Sqza&K9&%Du2v4D z8hDh_aqC5Wl%8KG<}mpS1NCatx53w?H}a1vu)laKe-k%>$>~sm*bN6nD>~o z{rP-b*9VLhh$GHPG33b|1vD!*AFA0(9HjY9N;smO6TPTI978QYEx{D~2)G6DpAKQ3 zYCA1Ta7vVY{B)v at SsiSr6VfxDECTWhqi0S&CwJFrn|1?MF<8yyuAn|

|FEIU!9Ow49$x}us2bIYz1`3}NF zRi!$tvm=&Dot%XPeI)&PPu6tM#S;}SQt3KNH5|-_bt|bcufL$E{KV^bC)UngDJ8IFV zf53cw*WK-v|5VEPegzN2^;qEJ=MU| z1+SwWauM{R9sVMK4R)spCLAt+uY?yNXos&$RF+&+NNgs?VZvNrm_*5`%Uq3%R9TK* zOf1B85OtiTZ*M84TA{3C>`YjJp3&7umMejZMwBu|5N&(N9AL9L5wg9e4C7?>@laBE z3N*AhY%7yq7sK=}eyr4(O_pvdeuQo{SsE`V)GQ@==Pu%!@tvhg>pd;xoVcl-yG1=k z+rKhRxa=-ofAwZw!5uNVy1}V2CU>0)^yy6U5kl`6zTU2)iBjt at V9FFfiAzx;DWVdk zc>KIeuX^_8EC(tf`_!gKa|OBW&l^k>MHY2yvkI+A at eru8+&5aFm)2 at vSpw*L!G<%# z7*R82wd$mGN2>LYU62GPS5sHN4?adBU8_l1$Kw7UgW$XZCFo zaos$U*W^(07?B{CAdAM0Tqg3ld{~O2MswNe3l16ec4BSoP8PgbUUoT7ok*Et(Neb| zM`4%VckH+EOUDuwBCy=oaC4jp8+n#3A~Ywjb1w-ECf(B2SIQ|6>&m7=WFZc}knPAF zjwr at pUy76!gAPuii1xe`#ZO+)XHTlfhL&=YNa#hkwzXdt}Iht^SbUc11R() zyy{Gr6cN*VDHFsxKf8KQ%I}3Q)M_tO{>^mTh+GIuWieK*L8-SgEPrj6k<$bO0v5?; z?Ko;N-i`qkp at PS=GRPiHc at kSXm^kcE)PgJu{tx&VN1##dBv-p$bIN8%8jD+wBY?{xaMNz83*V5HFOdz$mJ{=8 zM!~0#Nw1@~q at Fn#b>)eo40$m8rrV;b1O0oCb zM}5X1&;Jw{ZYylPh_(TWsEA5 at R1%93cWKOK!d*J=)z~`{$Fm>GybaNwNcIm`Dz+Tf zUHwKvFtuxr#CYIrdYCaFCv%~isTWNJnGqoVmbx3~YM_>9+6B|Xscz#h8UkA|q3- at p zKbp`q at 6fcI{Iu())0Q~mKwWt at sA2AWThEPoF~$5iVm=IM%DG$0UYk2AhWDBh#YhAn z!@D=$torAA{y!Ff9b!F;+g_7{cw at wQb!^uPrrM5L*~V>9wl@(Nj1G+qLs|~723WcK zo~0}0{9(lQIEz?u=-oZ^QNT`B;iu`=z?@KmYg*xLe-V7X{|L4BL at PX~?4tk$ukIr$ z=n@k;FB!;1oj zPR@=7M$Z5LI5@J(H at 64Tfb7y@s-&-p) zBQpQVm1mvUxzC9cJKB5mKS6w(>4{vc-*!rS9SZa=nk^ zdi~#V`&=~`N#bMoa7|RE%Em?zMshGve6R*-j`!0?%^hiWYd*H34*1ZHPVO;MPqM9OAQT5ASln4^*Z6+t7LXrwSflYVT*}%M5p7j z6E6UYw~=b922AE0M=Je}P^8Smmh1J(06UcFrAxJCXV<|=&bJm*^y6Yi+PU9QE$XlE z4(HYJOc&B;k3L+|BGm?7*le~V%FfybBpKcX{ENz at +jK>0t-0xdG(1~&NQgu>Hmh7! zqEg!>oz^J5rZ*EN?ymtAVh5vXsZgi2#rXs6bRm%$#flf0ql75#S9V61Is z&1!dtfADf^f^)AOh?wObnOZ at ruVgjjz{&}&Ym`l3XbrNzs13Tm=!Mo8LIVJ{=~QkkC<;qASNSU6N^F-_)k=;! zvs-%AV at 7rXV0V&ZRypKJ7jeA2S!tRIni9$8rsNE;%PLKi%lo9febm zhYv3DOlK?kY_n$9T{8Z>do at d7TNAHuWoWTUrds&hBwMm(0(;v`o|TX#ShU`ypgx{Q zwqLw{2aaBnwDg`zyIp3IYhwioWUC&WrRwS?Zr2}hlbW?D5g%5=b?UNRBwS at ea0l(F zJgK>Z+L6aKb<|*2J4NtMfr8H5oNNx}(cojMf9gy-p)7ERHsoIHKIa5*!YG_T3xCnvaa=6FnHcvL;VQq at AvdAIcsm47n$el=`eW4!h(7KWfW7M5b7M*{i;NglKxCPc(Lp13TdP8 z2&fwEZUM+Y_zA})Wel`3FjU|W;P=c)IB>C5%D#ZKFyQ at PPiiC7IbMk*WP9UM3D05H z8xPxqH`DKzfA8)fJW3Tq?Wc<%75XKw6U5StFvx{Ml`sZcFHsX?9d!8JF`2u5=lA(D z-N?^>3u~cj4a9iV-n;Qb)ey`onvoOL?k?qDy`}8jyRO`$L$Zi&IAKG+5ZktYraP{* z#WX~2L9Kz7|egs>Wni- ztM>2R=HHX@{}Zi at 44qBs9Sn`F4b4qyE$z(g{~e at cWo6;}1rU6- at rNS{8<{89Bf^si zNUj#mHfT0=En5floo_%sDC$WOoztJ0u8nhR-$D97{~#EKrwW+cPx2fWFVM_!EBh2A zhfR>UxfDS|KDZY)+uB0nnyxR6d zrfkT9f!9x)SlL!+dS$*!h=5Ig&;Ho1P`6?#-x3jz)kQ{txXA%(o~nN%pxTFLGu#m=@#BQ0} zB@}|<0qAN!UA62bC^iTy6voz&UXf at O@t=il)c!N+Z1z#Re+V`<#pJNKWyh1*T|9_7 z3`Bg^pA_+aqT9}%#aVcnH=Tl2+bpEQH#Raq^UZe8=Co_^y+4z;0&T^?cUuIX1CB*; zRp`-fZ21nB;B{!S%B_JB|GJ_ukoiNG^XG&ZqtfFPu zz- at oj46V^cKC?^AN$>n9-a at 04JMdiG6YsiGCCA@H2r=R`yAbKMTmzqMvQJYAOw?k_L~N;|NFw}=x3^zN;ooJsq*$%Q(+s!y2kd7BhQcP>2Etl> zJg|EUUZ^A at 7=&S2jb@}PZVM4pCqk6RvA9uePV`twM*u zaL)iVQW at DiZ0^r_k^9ro8(UgC$Xb(eL6oJQz8i(8w0&A9yaHMp2;GIVaDU*^nwhN@ zRirlYl(pq;rI&i%O-xvAXQJXTc2o-s^4mp$+u;7N0Y{i^8yuR!LU;0N6}CRwN)0P@ z33j at OWC}NLpDH)R^^m;kWBc+e;RAi at EMWUHd3AWH_3@QR;%5AKG`h836E3VZ2>5wJ zz>7T>*PVL5I-YsW8oDELfOTG?zT2kz!x9iYBECCR2

S0Q71D^d4~t6n3H=y#PdqxcF<>B at u{2At3!D zh_WTpi<>Hk1~y0sMI|9fJ%LK#hmY_fa-Sd$k-Xf-K1Cwh2sq5L(v)nZXNATr@cr7_GSYa7Ds8basXRB53rJn2Fqqxq&j=f$lOgr?bmfu(`p(%_+)iYpok7Zo&% zSLg#hT0T$62JPwbnii5W${NLs*b!tK7;vH7B+G4tyf`yQ)glu=$3CcDm%|>y3VN2^ z{Ilh_o;F)t9FK4Z at 5kPoRGy`}$96M at 2X}n{FA%vm0&W$)t_}TDy{{=GN#wsBRiId> zHOq6|&V^Uv*9Gt6S{?fIi`|oI&*T!%i$$Fezc2Vc{g-^-OI*_=pE(zJWjkh*uFTo1 z-(lo5Z^^1XIwh)098Rft_GSu9aw^-xq+9ZD>&@q;W(t#d)y39A?KMMmJ+_E0k(OLZ z5PYGvLeOakfEDrftzcZiiBz((_9nsZMjXs{rF{tN3JLPYdS&`ynYtt%I|J0*5DDEN zx!0&o6=6{du_(k?4MbfN{4dZm5wS^&y!3kT&O=5$EWPg5&YqulGWi>WyyLjRalLZ{ z&9AGiPp=^_&nJwZ_0;E7pW)8a>X}y-QC*I1O)Cyns at P9``p2IR5p$qAbj-oi_`jo{ z?oW?9!NLPIew9wBUAheY=*D(W<^L9+`u4!9FUQD9PZ-{a^EM80JAi2h9NncyG6dFO4ogy$Ij3ctUU_lP*U1=k+d zwvjDkm#`YD!)`1}md3dt!Nm>NjP#=UTn$VkG>$bo`_+<5#{HAa5%`|PS*V`wO4G5K z+7INs?EaonnPuX~_kSZJy{ykJxWGU_&;R3m=)aK>F;_d|e-M#>&WFa$N(~AijPzF9 zE~r(i-W&?v5d0BDuWf-K5(z0V3jS%IRTq*xZ70K4-IMtfzb_1lJmx#AduodP_te+% zpU)%IK1es62VEQHCXvhvbHHG~3E6QFbw05l@|1~%_ at HV;K64B)txbX?;HmFfO!znX z>u${)o7|yq_Gn;YD-m);6BGC9hK8YWp);WSXn>rqN7PT3g47~FjpME!A=0MPl?EQ> zpx(V>4#F;r={`e^)$dj)aGaOes-06XA6h zk+WB44LYevMYZ&@b^|0q`sZ)1zYle%y% z!E?((#R=GHf;p38lvRB0m0&zS4>GCcxIJWicmnjwFVd)uw6?#rJBqPeFLt|vMV;X4#<^T zApXDFRAY0qsu!#6T|PtKC8x-fkY;e=?#<*M1EHvr#+7A;|bLV{n2KFDY&m`eClf5`Soej zdFHB?Ka3w(X4e%I-9cKETa5U0Km&zqfog;?f48M+JE8#9{m4PS-xrk%Z)`7Lszn?M zk2>81BCE%t{kjb%XI-_Y|FOYd>rF^i8ZUvg(Zad+5(+SdNtaQzS9K;jN~tA8?l at il z$nzZ1({_~=J6%0>cXx>L2~+Ji{;+=l#ROw8hi0SQ#*FsNv&RUt0um`N5gl!r^@TF% zPyqaW2qkPWLW%JFRAm{Z<4H at uWt!V6fjr3t-m2DSJ>jZ~nTUf4I1m2mQedJ@|4u~C z_m(^$(vV0PwJGY$*h>YYPqtnT&Iq$KNcw!0)Wui5+6K#>Y6VCYNhAT(-~TAN&%JgU zss3AO-ZP(R?b(6`BVB#>xPCdwQyN$V#mJ<~InQL)6gbK@>zHoywiy}kq zQDX?+n7q5VO=L`Gl|I-7K*umRt#l at Vr7ynz0nXBu2pkNH0x&G<4^|dE-&Yj1a{c^v zVj(vPYqpKot{&OBm4(VAa40#KU0HAxnnd6?e{Zc}!09xQQV3d#PGsOa#Nk(OsrvOQ z|G1t}U7FmcekNP+7Q3+thlaRV2+LzAEvzUJQwJS&ZQedRFAp!m-OVT)K5jKH8v|A; zjf>l`76?<}L9bbpm|WPr^iaCMZBWk3QmnLTuxY_35N?Q1D{iqJc*h#vC02;_;x7!k z*(R4LCV>)%eOkyVvH;{MaXD*}&{G&vhC?t_7ts at mW5^MdDSJ)S5y2q4v69x?tK4a^ zSrBk+P^jni8NjQjcF~R3PhY_B`LDtm{}>ln+l#Z)e{seQ1PF-y|7BeKhi1mS+$IAG zZ%MvogNqApu&s at 8^bgB~RMkywM0$%PD%XR+iUquF1F*s+v4}}`Si+E at BHunfs|{BQ zB%=f_>4 at 6exLMv+zTWSxj~{cQn}bAp?`8WjQLgx?U9Rx4ku+#;S?FjKal^|>MuE0R=1P~=*o#<@|a4rC3>q`a(_(%3nS zRUv=0C6$R6wI!3uquoi6ho at Nzove$0b??=+%8zY(^Ww(Ji`saR>h9!!67xP;~n^UXPN at D8^ntB{Pt7y(il=!Lz;J(DW7IgyrFaZ-ml;;2O=9E z9)j)~(Ste29Lx-ChDK}n-pDU7jfGodkeVmIOtM{cO|g(^_yzi3JpwC7tnLOB2q+Hb zf0`!ySC9Dn8*(8h@?9cy=)CVeswcoY^h8m?vW2rHM?bB9c2v$jDXQ46ZWpOYV7VP7y zJPZI}*oiu3&D!7XRa0EuyxO8>{Uu*5(>iA689^@tv9~n|^)TFdnj0I2n*ND6YExad zFQ#cYLY0*!XSeCrSSwi0yo>erQ?rx`HB_g$t~RsmHvZFf6ErZdr36f-8zubJzv$;B z;&qhgI4=$%K2L)z8;6}7quMJ+Qb~U}HHerX;POfvm+CX{f}J-^@|e9tJ$P=KT~(QS z;1$Lk3awC at -Nh!gY5-D2M`vs>@g`|fd?Hut#16BPrTl68--~?{Z`}k-BoZx!B1tUz zlg^mB2^tiLJflW<3SI4q)@61ah$uz=IOu>CPJ>!KrRExMimg{jR1;8*fz9X?s2(QK zg6)IiO>()}wd|&MF#$F`j%29w%A1y~%1xsenoWz|&-3_E9E)|RG|8N^E-)SspNN%U z5bzTAd*tKyH6{a|lu=629JhuWOcgmXcA#ogjo+7*o at A+o$@HooTYf#Qahnd_!C5j? z^wk}pd&DA&uTgZhOmYuH%IVQ>_Gp?|mzXPg(_q&qn(#TB+ic##et{?OQ?~t{#0X>@ zbl(3QN}-B}8_lC^8!kV9OU>Id(zOSEOa3EQrd@ zr8h#&MRyPxbnqCVN0p@(+s;$ex#TXGJ>w=67D|L~(_xszr3Z56RsdEDCBD~sWid&H zoq>S9GDc{J!r%Kt#vU{0k0W2yTm_$il)i zWcg2wK1Uw8S^4l2;5V}1id{-Ae%VTzXN*4#5M&%s_jD5fF

wL&P9wurIIdzRO zQT0Di7MLP1BT(ghBV*$(c6(}rpxOIENp(nv7#nhi+d{UJH%`wyEZ}o4nol#=-UD5} z>!mPw5yZqxH;Tj;gLYwkpatJETb>OeoPW+9d#*)ej*7K}CdN0ajEHq{sz2emj6PlPgm&GqTz{ z at dx(XesDAVFI{QhC;ZofTyAE}LPnRhd9s4$~-I6GL5Pqo6yzI8FX}DQ~H%xt(D*?tEyQ?zFMRP-) zyXQK=^BojRC~yz-9}EWcF2c at t5hT<)`Zk2sEG+^^d|Jnaj`JEYdMeV*#_ at mK_M{oWu1Em ztKCbi*u5)okdIn!^>!FAt8V8dm8(O!SEogWh zL|Cup`CqQ;>`o>H-Q#YXU|vs=*XLWm6b5s+UIV8VwVAi9rk%4kyU275TS=-^+La%} z;>5}Xz*ni-TkO;}PR3f5z$vwFf^qjW{>BH1I*TC(GE>vjj54MjE#vDc`BfHT4v;io zv&T}YRUOq4ogFrxJ%IbF2USN at VXB$~X+W0wZjfO(6uT5jz?w%DB)ky%Y(36>(^XM> zS}v&HaC{9n(VskTvaFRes=|fE6~c8UGR#ItpXz;VhrehQ*pZAVt~pG*Wv0;7XO zlkQfzCA%3^vgESBq=ST`HBaVQL;*GIEE~Eoe-6_5|SbT=l)L z`ljv+zxD7^*3E$TOTV;qD at w%QO0>ZOnF)!gJnYBe58t;Vy*ti=_uzWuhmZLY1bZV1 z01R?E3`XiWx6tg%gTXcBK7VV!GM>+nJLImD>(5$GNqGWc at 5C|*`vvI?zR){zq(sV% zA(pwJq7WIVhV+8ZGX_b^grF&pj43ZhC&B0(0!`O9b&|8jY$ztXSmq at ZaoB@07m<5f z$D*SchMBA;EdovA>YoD}k8LY^0%*b8tvr^$N0j=Qu}k=EcPS7c>Kt&HKGv1lOOl^)%4~lWXvG+ELhnSu3 z^$!X(H;~r`mMJ-b_Cv?_oQ=Ch;{9n!YVIFj@}B>@;J+t+1mV+6l>Xvd74-j_`1ucf z`)Bo at nyvGu2!fx<)T>NV9(gY;Chi)W zUX1%9Yp6;p-C38*pT(}Q8);Z_wVW*{(3`bTm88lL_(YKiw_1L7iw;LJba0E#~xqYZ_4TF)>@1meNPRv>3n-WO6 at 2vY_abzqf0 z)p}XEQzb`=3?D<1Uz|>>oZf2|*Q_+vusycmN;}2#b+>KTd)DJs7nxtp#M=r8ea~t( zS`MJWMve5Let7C3=o;n+OVOVd{0;7*KxSuEH5tD9il!eBhIH}S5~|Kz-(&Rf?tAGt z^GrgC%VdvEe!wBeN|Pt3#?)cKw!y-z-q+8=FJf%gGYn%30)*9F&P0ZsD%YE2&csgK zm{)3$CFA`!9908Zbx!T$dTJyfYpWs|b|{4=*{gquR#%>iAwOG~Y at _!Lvo)L5Gb z*~4vm=AqUt=yRXwvEF#>cWNyj!m)1gE=0lM0C43Vd(TT>p8QfjDG0fwBR9zaB+XL| zLpVCN6_i(DliM7B2VwpBe@@4x<--6u?z=P`?m+CW+~JX&t;|KKfB zr01qxjenML#mTuc_^q_TV>+Nmy*^9SVM|6dPOm`f%vklb95;S9WhL>V0z1O~ zjXUB2$EagaS|}(PBcN(O{hpn&eTw}YlT&10)FG#>@7smoGqYvl7>Sndpn7hf&z|$# z_KGzz?iil&j$CPiY28?}e^aWkI*i&Q?7$`OkZP3ejkRDFffw_aeb_1Ty+5&c_yax% z>Pv*fUD4<`=nk$!0ZF%9jq}tES?IbzAKQ_Rr%osuM$swpy;EP<>21OQkKMzoLSoio zY$s at IP<=pXfYXst!o{;=XXh7z2EFSlKKMmk$33z5w3oS>n2nNZ=u!G4XYSx`8u(Z>p3ue`qE@>(d;fB+gqYq z;=8Vqv at t=NeyC0bBcf9|tW!H;pIkGl5Z$s(QcMZ1IVy2}6fIjQmivt?#xdO}lfQW| zLtYVuge`KQp-{rPO zm8kGLUN at O|F1Hm#;R=)}A!PJ*kb at 1Tjo68@zU=UP0q~@9sE9TvO!x4=XZfc_Pd2#& zu(OLfWEn|uFk?faYxoticf9XN07NNC_&I!PYqvmBvosuTG)4s zRrw>L>?{QA$M3DW$DZZ6jy~}TOZsTHdbX{{DWVZs9O_bs#sOew=B6${1^z}3fq>RE; z9H})GpwpSr#1WouG;?GR-@=icoSZ%gQgvN*o4bky&qWEWZ&Y&YAdcH^$eLc;o|i37WB?N{ zUr-kB_KF`KLNN*=vHKD1*T;#cs2c?(~vvFKaX zj%N+G$|!jfWL`4)mX2hqQt|;dSldH*%az3=b}k+_w`iO4h%$!xQrV z#fO>xgLY{DBcA$#14bHH6KE at MCKZ560+p~Rw+$ph0k$Mm5f(guWZ+DsOv-RHQ`#$i zfqtv7)|7Uo^}X*$|NY6h;!Ebz$7Jb(sYd4gbj0oLe{$*j@>!eb2h0%a^s|EjS)AR> z7$epguGLt=-3ae`d^D(u#%&)iwdkS8MI+XT6tK*J;)5`#h2mb=Had5u>cXyTfT6Qm zW##v~;R!Z at yxuC~mG>(0LsyzTlv%pQxue|s9wy2P`8V0|6r1oxqAD6pgzEx|^)m0C z%`I;*%ebrb!3dkX%d203O^PN{fS at Kbq|x|p4YdUG!&~u!I^}h$FctlXt#Uuvt$IeawRNuD;VRFb!)$@dpe`kG7I*H{(^60SvxEiS`aaK%$*FzF z92sI+$WEQB=@!2SM}xi-;<^^ey at 14$j+uEO{oSm48Yo4lEyRE?h09RI#yw-XqVRU1Zpb22Lhz`FPnXFuj%?Lw;_^&~qtgCDy$&1e zpcACKum@^o)vs__Fv$ms)8Q~hpQ2wO)f9LXYa_8iarKqEgnSYE%3yhW&S3hx(r3a3 z#-;6i4BMHu+OgylSuKZYZj at _ufT%48PCEs*Wh=uW3SUO at 85G$XyJ zc0wkMjTISbgtThAtSc;=B_u$)_R-+{k zjD=d}yI37IG~83|6M{K9jKqn}tb8CR at uh=IMpiCi+ueE{b^F- zQHyO%`IcAy+4-3pS}}=mCKPf%VST!HkhP(>a9(k7Xt&&7pW{*d`do6kTqQoE#zPl= zwSevy;%8i1jN8Q=@t{Nr#Zv^jIzyN`L>)6rm`3V!qr!AED!V!uG!3*$8gchG4!3ns zDw;SDwVTOoF>KT&`5{=ub1L2oBvjO7y}F8$506jSct at y`o5Axx`U*dc+nYh zx9memnOvJbD#OV(kt>WGZhql)*`8Y%bU)Z90=ntw1*6s3OJO1jvOpdv(2-OBoU at T% z5eReIpj?YU4;}DW{hfYOuv-t6rz5mFBxkk_F8N>WQXAGNp1ogh?Ei{8vm;EZL=Zqg zxtRZJCj6hcBWvjJ at 4bKSl&r4pj=YNc6-(<~#{znQVJs{xaX`{wf&j;2X*(KYD`P|F z7KwvQL5MjS%u6r}VJY&5O?LAkky`fJa^WEr6vqi<15`+}ve@@h_*=l9Ki~IS%l4U% z87r=6ewZ5GGlSE4hVT7-X6HBG#@oHW|Fbuc?+Zb+?O0enuDQ0wLoq{YUDfX7$88Ek z?vVQWE~TGO48Fel4XhtOZa at 2NH3ZQM8-GvXZU%(btqsQP-YbM&U(|v(W+;OPPycY&axY;~)D~xj8Fli(G}8l(f8srm$ab84uT#q-NIurcNS>BVFa|uQawD_6}{m z{OJP<$vEI17YQ7N^9?vLhcOS?X|=Nc`ew`ia* zp%}2D(ep~RHzt%NV=kAOHF=BI-?ICxQ(PJ6_2uUHN%zL;sC2%yUL{!<5OE(}ac8nx z>dR&^ID>xyWEUG))px!kwRn+iH_q)c8D_z4F5uc=npA^_!tJaNO^Vzqpn=P>FP{jk z=`A0{6$v!eKUc2jA?+W9(Wq)PB#pP8PF0MIVIjr!~;)6SwNThK^WkX|DlS}O-mmidp zk at 4(}f5fqdwW=IAy0YL^A|6cRV~hcliog&pe3T58c?Qp at VKn0#(kg!<^vkBHSGnW# z%}dFdDqSR%)z2r_mHxI!%(CeFiAj{Wv`s?f&7uv?a19q4jDb_1oOxNF+NnC%R^zZfiPDU3Du^p86#ta`nbJ za7D?E>PnEpM8-9)#eT301<0Cpj74^u&TpwLd_L{>)~k+6PV1&u|!q~=eTRO6+ at th+*9EQw-I zy;k_sCCV)|R+gdpmh5bZhZT;K)1Xw at bMw27jKpaT1#7{vnO>IjiGq|TH5=a*L~G5_ z4|DpI1?Tpw9$giOPHR=?UEU_jQy%7G!uu)r+RqX!0sIz2?f~#6N7%)(80(ZBY>U|Q ztg8a=(+kHptD@(UwZAXh$1h-9c}EmtpMN0Ctd;nw*v=`^x(XRGbYOuf|4Y~6H2?L_ zjM-2fNIWq(veS?QEXz&=s3zl at q*r4%R at Adz7?A_&1>K^1;gH3#uTlSr`r}8%ny5IE zlMB6D(r;dtt6!~+Pnh<9_%b{5MhG+4qh}|OedHQWOA#A6^kxc*lZP{)XuugXMucbw z+z{}8wG;a6h<^O&&afmwa|a$Q4wyum<5U;|iI%|F3y%1E8Q`ISXOrQ>IHtVAFq+)S z3YQt#=dKab9foYQzvamsf<~e~UIPbsfEJo;gND|eF>dsZqDLXA*XJ4+rH-5)WiDX!526+`5-loF#SEH8C&CfmV(hWZ zZ%JjJ??EJVi0-0xNd?3HV4vs0jPnf`!CkFS7;n)Xt%l_oaGtId*0X!2MemZC9FD6S z&vNs53Of{1FY8d(d+yYI{XP6*RrlryJ?|fk^huVVBVO7TpjRLCKCI0_Kxd at Y6{C3z zhc?{lq16 at UyzkpZN4MA2Mg-Co7TYahm^DI-5-FEG2ou9`O074i-u0_?7eaCfl1qAG z{k5$1UeVp05YdJoFFw4`G=k%JVuLQtRlL0FTcY$+8BDWw#U{QATBuxpO23Ng_~44y zy-Q~bx7g at QdK%kIb;>Fs1eYu>B|pz$KF{@FS at 2XvR9vmj?+%(VyJ)b1}*cl=gx7HpFCOkMYkG<*Ne!0^13jiQD-qr{dd98*CsmE_x9Ksib#)U$)f%c0T*NRm^tZO5y5FIfvval^u1zt;N$` zi&tAU6S3cxT1LW;D<8aMaoIACtD!C?+P_{e{e96AVX1 at YvlC zJ3`ExH#qyJL|f#y3eM0A3qQa9ThSL!LK-FB-$4BVG z2Sq`v4+ey8z?}!fZo<;<`=XTWv25FrBL9g4_k9{sAHEBhHP==^ci;zeM)J$!xxx^WF0W9+2~5jq>=S5>1zp#TgEG8J3Ix~MQphk}tLnMnD)1@~jjV4=-$5X05*V*W0SK(cx!r-jj z4Rv0X9i$8Sz4X){&AP~Is;R75m}O^PrSlx3$I at Xd-^9XXAd3a12D at -ScR3ZJh_OuG z0M6aOO2>cstg8gCcOq} zr31~9wScym=6pISNVh%Z&t)UvM3tzF((V2va zo+_dw5oMt!|HkjhRhD;7jx@$Q(!~ixnah9#dJN2N6Pbk_v8nQGy-eD!s56*H(luEu4gKlNQ(VU9 za3e??nk>3?l4o=wG+Ib^X&y;~uRg^j$>TqlXREt%Zj!8F8`K=!C1g+ at LVl`)l9}Y= zRvl5Qi*!&ONm++AT(?;jUus(@U%}^poI))e)BqWS!K>w?9ttWjS;=X9k4aguXR|^N zBc+rVB-A at 4nHLb~=hn_+&7TW#1GP~HgP>LMmfBx)0)<=*I( zrE?~=MhYQ5v^2rWR&x7pc at i!S?BwlFw(;P^s*y%?Nt~z`jG~rSt!f|Qbl;+GrIndt zuJik49b%U$4ak#NDHCRt1jz)?j)UpQiqh?3feNf_BC&>URkmq!3!uH)%yXEawk0YC zrxxZZ8podhG4pT6PG at 5}k;huPJ{)~Jn1XzjbMl!kOFAj0G^Z(=2D0d7IOJiqGG^+bj(CL$*_Ujk;Be_Sw6%PG z+KOB|Yd?YufdZp)F;^MlQEIVwaqMTNg4j9I9$)!;k|cYCCKgiNTAM7&}{ zXpFr>BSFnxFy0a8sEkqprFkmv`PM%2yQ!S)W+zFx7SuCnNi zb_Jo)^S>qElr{sNjUtRHZ_=9}UyJi+F# zc0pXt0qjvh%{6*qd~DD>UUdp}pv(L>3*@Xa#(>PZ_>QTa?=iNMGwYg(e#Xwq3^l?9)qG{+JCM7%D!$KCc!xHw~ zyIj1bHvsigA_TQ at j<3 at +Ld`$_mp&Dfj^o^+p7#aQHBo)gv={GpkOCX_{nY?xLV|Xs zST}HOIOA=#i*#AEV+9pp)>Ss8k(?sFIobw)kZj2qyDhTzm`cq30zs6#!{X4-YeV#2 z_JKgnJb# z(h&mQ<#~H(L<^Y`v|l?Si>ws2TpaH4=mr>w*?m;mC?2*?SY25h0$YsSq6GXT35!VW z>tcSeQb3m!{kcR&#&m0DKU*-b^SQ0y%G93b02pqGE4LFGOv|3g^B3W_sTaE1xhNXX z8)|TBFx{uf_l%eQdUs8;w`0!m+|HjYEqPbOEDMpq^=|>Yz6fDOX at d{mB0HtSn2Xeb zJWPX)iTPqM_5?Kq0mduCiq0HXaN;o at IMusloH(9#bwP#GSLp_fBF0ljiVYI?8M$Oc znL*U2(xhiC8JydWAeHC4Q!Yh`E+S9qv#00ZUkO?p1H1}nUWl;ig~nYWF&n9qmMA-z6qeyP0L|Vx_g#d&MWEka(w0^LUBa2 zf+J*++bneu2?4@)t#J#%BQD*6hzMz)l)f8|hv1EUen%3klt6ZO;z7*BnL3tiFkp*& zO&T0MIf_4|xOXHEQ%gW%L)P`kj)(Hh_2U$>JxpM_eNbhAr!|`PSmoK+AyK{eN^x7F z;%tf-><}}CX7R#xoLbz1?WdHK`0&TTR0OQGOw~*qt{yM69!JA)U&83y%uGaj4pkm? zb}xVY!IFz?p5n?$MD!;TDCOJj4Lxmw>B^Q9X61lYwz_HaK^IA)BywprMWf_d4#ldNr^QFXU-HYbsfbz0;GqA`Np*^VPFR9YsH%9D5XmRnAnnE at EDtvb ze_keHizZJh_uOhc-2n6Yvu^QD^81B|Erwiqf`_Zi;ivEe%Sj>R*Hkh&C(Rp$K{bTPIjv1k5JvIz zaixN!j5ZH&xwWY9Hdb0`b8KnzgWU0b_-$!Lk#C}f^IeO}hT#s^&bVREY*a_A!fI!Q zY!rt!_f+W-WovjN?P at c8i-YvLVS5w^%fJN|X187WpT at _=+0d=i8`~jqk7P`-je)FSmH4Hg5S}xY!2Y>lFU2 zk=Bd?n zdf9_aBE*9-kdUeLnYg>91$q$Eg#M6(NkD)xG2RFBPMcxknA*Lh5&Qj#_yO#@M_3LO zWm-W~b*FR`toC|Z$Uk)VFvU?fskF`kU)m|3ci}#B_WCF9+8>Ak;DiKaM=~GWPGYyu z3wHl!sGW2?C}{J}j4=XZC+#pcsF;MS$mVD2rh|G-DBD)j#ZRa!YLC7-LcUro?JX2F zNd}nNv`g4-n at v;Y)28h at +U_xGp2tL42ks;<4%3z8LbvZsPr>;Tx z^hRZ}!fKacMCiGgBF7{XPDX)lfdNOT$VmXE^D4}QaQn&4wCo;3nR6;>wq}w#RS;bR zEhrNXh4P5+BVW(f$L#DH^jZeYIr9b-lpt%w*dhJWs#OBFk8s;SIki?3jSfJ$+@&#d zRN1oj9MVeEF44ul0&)hP=a3^KVq at 49{8Myc(ZuPX`p|8uQN>pKAceJeVqV277Ne&7 zkPDz{H#Ko`jOsIH;$QtS+hRr9&ItcKR;VaBLef6vP|qq0C?7wHARA|c96rEk={bx^ zy;Wtf8Yk^MPabj=X48HqyeC!)1ZTDQKa{;yR9)NBu8r%&-Q8{C?(PuW-Q6Kru!+07 zyK8WFCy?MFxI=Jh?(cZV7UNx#$?=ie~)f2efzBb5GokeqS z>4zHn{RxyLbdTC2G}?s$z5xOBN`+b at Q#^`uYNrN8J8Xt(S9I-Bo2yv&v;_;H#FG*R0`OH_22+LX!D_Q9*c=s4QdA600-s?vT)95+L+ zr^b`FiZ`p;a)nO(78bcOv at PzO at VmWPX z&l)kg?g78V1KPTz{?rBeRVZ_jcd9kYn|)BZgx5kCe#h33vd{ewue6o{lh z-}l6P9~jz`K-KD8p~+^Oi;THP+G)(4j#p_*oH`TlkTl#y>|k8LUu#=PPd1rnRTY2X zN?G|DA?a1bZ=!!#q2I5(_hPm77L4(jD)+#@{{lODRgP0H^;0S7_OvB>ex at KiZ`hVx z!X3g1HI8w3Aw7^iC6FN{9Z&8R6T6HnjzPl0mRm+ttZ-6*gXL^b2{Iy(2trj5q6oj; z_!=IrrVdIoJg;!~JHeg|=i6yxG$bF3_41O?Tu3ns^0V43(9A{1xhmj` zN}IR{60`w6@`R>Hh&^I<6LFLTdv$|Sx@@KsE`s=}#+k5N#u at 8ApK|J>ob}1utr3L6 z$&MwE>m`5F@>=ivZ<6)Ob?37EAz8zpDpcs7k?j9IyQ at 3>ZQdYY4} zz_M*O#)@{9eH?mh&LcLdu at Fs0*{24qsZRlwrjn9*g$A!GocV6 at D^vr(PHoq=n5Nwn zCX;#3sm54NL$uLN|9U)7TenVIhn5E&rCV^qs+fso+zvXi*VLey4720);YLHd0T*$d zLsXKqW>`1wY>m3Z+y=U2vuT~qPMQNh at q@xx9T4zhB8)Ha3141gYG+S6 at ek6nHs}$) zils>-df~44gW`Om?%L0>IyA6cLWRZH?bgb;$D9TIlbTS(XEE_iZ)W)#=Uc7UOe;HE zsW*Z{DdgSdpg0)MMMyTO+*?28Y|u%^9su) zKmdvFdA@!Z0CM+>)c{p4ek$KJ)7QAt9>d5i?`m`Q+jdQ^I56|SfKv~O_G5WvE$8NYE0Kl4pNHz<88o!Q6^5}TI%G$B-{v4Wk7u~; zS(pzdzWpXmLl+)iw*cO$pa+zhX!NRj$Xb+<)o|RZz5a>mw&#pLv7yfL-0t zt3aVFVSQen?-W-@=lUFVS?B<3d&WJSVqigXjA{aXDw=cmP4?}`9P-E{qkt+X5qknCW3X4 at l4hEuz z8DU8#O2ioh>P`dht`ps%^BYMd54Qs$*|bnUt3{H#mpoNWa%5mb#UaP1x<$Fs9Hv zx#d|xphm?1_|(Nc>3jWZ94c3APd6v2*om?7Zbd~vt at t~Zjz$|g;|c&g?A?o6p^!>t z6#DO%HC)QBH~NF#6+|#F+JE%2|Gw>hQ;R?n^Fy)8JXx`!RJUYgt;|#w&S5xyEeZ1} zL4*TBtRxsEj|^aPYKg;5pz;CZ|G at G)64syYFvZPp$?Y}V at APWcQiqEy$9_ikV0X6X z;i1dxVtOw>o#h=07*@{-C at LWfqgrLGrnOV~of$R9Ijo|36$awbRIjm}Zz$W5$2z6w z!tGC>&n|1g0sOR&q8_>%xzu|m;|@JmujSM`JK?;5gSo4mK|v0kL1j28yO;(_u&*k@ zSPZO{-Z5ZpVlvc@#x+#?jgd~YMrrJhQh)W}eF%+euE&_vF16&m_L!<7AXgp&SsZwI ztL^#UX3+uxUY(Cuzor$rLj4*@$|`xbDi7+?U&D2nNyab8K{xz1*it zFk?D<1IOKrGK_5SKr!+9<({=8U=9}f+z&QxpBv`VBGD^{DZzOo&vmEj+AK3qi&oik zz6*j%r!D9hTBox at Swdy$RiiI`U;xLxLU`2A$C%ZnVzcYjmrmM!n at mHGvghoGZcIYRt1M?te<1qOJ!>axC2Nh zPM$JSl_Z0D?UJ6~Hs_Y6n)#EmUy&duT`pKEk^{|1KMN#g`^Akn#sd}Z`vqDNRT?80 zXcNmVaITcr!^3H%op#%zdByC$qPghg*u_5U+88k?>U!A_4)Eg^2LQ$7FDLCJ+oH%( z at M7oGLBO~eoMC2Ja<=K5u~*)r!(k&glLy*p54q$EbYjQTmr%9w&QK at Mn%HMM8xo&E zs&ck`Y@(O`9aL%?9CGGbhv1aD7ByNu-nIImt*-mibTGUbn&NHnYa(-w{1|=Txv^~W z?uV~PqQf_H>N&RB+LBObyngX1o|$;>Yd6ov$ySaLzpCd8P$qMw<$ z=Lj4btE>H7a~?2N-a9_ at 0jq&0*NfIIGX6mUTAS8I>JD^S!(<;VD2bF(Z=4&CDE|$q z)oLwVD{wF{FNptf7FosK#NE=#)#3l*IKe<3LKG9UHR18rFQ at pz7EytSWP8VVHHrZ7 z@@1Hye$+!(`Ul>M!Ha>18tMYdk+h_hCS+qlSf<J91 zn<4Bvb~x$g2y3=2Wj?zhuY6^VpU~W7d=v*U5Ps!86VN3&d)AW&Q`eqiIs83;SS at 6J zhB at W*RE7RhSAs%Np)g4t-4oeP+luGW%Mo;)zYTc#XsB2m(gPX=V~2ekDy?vys4(2%bWXvNK_jR-s!LC+kVm~9Sn=|P$-WGgnkyysD_LVxEi=6$43K*DVd-ZZB z^TcXITSlL3?8M_2Wyan at mI;LXZ>{9udTZSN==2 at xe{5I&TdRMyE7k0jF;r0nzcShD zq=gGe5KmT*V25F08BtL-MFpvIw2`R_Wvri<8Z`N)pF!@%vwaLwn(+Sk1}r zKkSnasknq+x@;aam8GBN{rX;H=i1djui9jr1Y1ahD>Wz0Gq at u zO4-(=D=W8_ZA9b4+D`Qup;k5`Y?%;bXd;+ZSNZA(nkYKv`#j at e*EWCr-KErUyLaAb zU0}siF#H;j?Qu~Xy1qWBcc*`-P9~8&<%9>=e3uqRorOtvTy>Su|He1;tBxkZof{A; zO3314{3C3vA at 9X#O|3!fosAUzJ8#*HJ~L^L`5MyxQWC-EGVNA!+0HoMym)n*yRA^R z0>>YFdHZ at LYie|xUtrT1WIHUzjtLErZaAS~%&#tX4K2ps~0EL@~vk+?owFJVWv3 zTV at TovMdzmmxJ_sSMb$%hSZ|GzVM~e*a1DRL~x(8^*$LS2mLlr at u2pqeA-2R`)o@| zCq>SCd_m3-97HsnAjG$Bc8L3Yyz~wM{36=9*dA3V^;`WF zT1A+`C1OvxL9crOjQ~6#OAf z7sUUV^NCxVxGI{sn_2(=TjFC?6_wXTQ2jCZSy?qP&VyIjOq@!1t|6oof^JM-(|=4XF7eVEe&YrNinqchFSq{ZNf0(3lS}BpI9}C0w#t6eIjW0+P^{8Gl`Iuag zi=rU~Ht>=_$%bT_Xpuxw?^{Uxl=wrH(Vt72?+TVYIRJ=hW3;!eQg)sz7|c#jShkW| z;44*-Kt-A|vTxz1sC{zFJdCqFMjrVZAA*Q?;0vRL at 04BkK7qEO{7jFu?`y$VGbix) zMdDU^Ag zOiKIfckt}GaBtwFr#f7Na$f#Mr>u;r%c4IzcmH#p+5WDx%Z at G;8B%E}NrIFHdI^3z z*_zxqL}ii0_!arO=sEAsmh*9BRd^J;aMejoBx$g?j*VyU&+OdHp68br zlrM_ijj97tNRTXy-Al6!i1kc0==7Jxl#{~fF^-oB#-C5L(Xn4?6Z2_yMas4$P~FTI zvv)y=#LmPpf>v&~Z5gT_lvkt9EpUOUq+ z&i+6iz{f#Wo32~tCs!HYL7Uv!qkI>&_IOL=!E$6w3VNZ!od9kvw10a*+Fa@(9C)vy zwxNBX*fjCK81TZMZa$|nscE9cBOLduh$GUj;L{clneVPGk0hVAIQa#?7CI|VP2Tc> zLZMzfo$gaNv;Xwu_;U}fF^DZNMFQg^%Y}MT|i-~@Jx1KGZ zR+Xn()o5aQ4tIn8ul#LZyJp-Q*65i(O4q#qO=*kFYoGEzN)P>WrP=?Vh<2$(AG9iD zVv^JVtAx1=El5q!E0KdimgIF_&q!@f+?8w-y_GI_Pc-BS`Ye+3q#B`vAqo}lS-Sf4 z`Nq at o{^0%+>kFr!v+7U|B4RyJH|wk(><#iyG}~-?jS;Qj at 4B`aXCfqWgVq(FI(#=S z$L)>W(c?J8i6Tpw*eqT}=b1a{X}ca6c)u;}Q|YRK=66aBZ`31#I3e*wJj zpUchhZ at H)B&O}fJIVTiyaNU`kxY!dFKFbsxrAK`H z8clV@*;$K6uih;PVQwkxG(1$-(&+1c4}@q4)**n7SpxzsP4xLOu&J38&=5{VF-x+c zio2b~fPx;>@SCZmNiR6DRWb1roO?1(l27CUXf6eBn)3>$qGDhJtFh#GzJ)UA6Nyhz z_4tm8mAbSBTm}}4%K7C%C z^g$#^bvKl%!*9yV9L!#=HQCQ;6f5B;rDYk3N%C(}V; z$gqn?WVil57A3aJ**t&4vWIqTDM(~I;Yl3-8Hk%VeX1vG{e-eF2 zPHg=iEu>--t+lX4-#maDOV9l754r-ov8&8(`!o{&Niq)L`mS5}G$3fz$ZRkz9e-T`gu-##rp4GK` zoGa{|aESp&Nt94!?oCz0N>QTtcD{~--{^8?cKZF*!x#1!R^B>op~XC3A%zZk^Ep1$>{assyAseBx?lErw0wvBJsq~wS1Tvd(1K@)SP%1 zMhq5o8+zXBL6oHxB6`l4lBomjkqeQMZ+BAUt2jEqq=_Gn`Npws;dGW`>q6uz{X1w; zJGUIqQr4cY7*`tYi4ox!hXav-rruF3=Fgp#eXdY1(R}g{Ph?9(npVUc3x6WppHPAx zX?MGKTIysaD6A<&aS1L~_>MyrDpP at wu~>2CIX at EaJa7mO(d4As?I(^E978jOkie8$ zQ8 at WW>K}-Ioye|h_yh6Q;+5Plb*r at f2VE(!ERFqN-B65spx#6^mdf^)YY_RCJ4Lr` z<6Z at 6ggapsCf2Ho!K*H==(85tobZZOQ!l1SfYiW4d4t)MDuI+L=RMX#q?)})8f^=Q z12g8Pl^lkH at oT657F&MwnTZJ+49o-YkHzNt_i;mtUKkp<0gh}Fl*jWaXS1h#uQlM}uL^ znEsc!#~c78Cc*NDpBpc|b1&WbH*XfO0g!pxQJj4E{%-r;0EOD&3*JmTFz&qPr=UX9s=Ty_UT z8}76YUs0pBqq4wRR`=7Qi>w_l=Spvn<`FQMTKn}4CY{gKBgdBRv(ES@0neG({T2K!$pxrXWnH#pzQ3|rj0 zsPAx|V!6H|1(?@NC)h&w;exs*SogY2Q=nyv_K)kNLB}~Q?FKg|0KvT&Ekm1C)h)?(v(VViq(?_=u3dHrdvyf-;|PbNFNpW zO6&I$DZ8Bp7Cd?@Vo#{qOmK;Fani7$#M;O)!X(AD?lNEXPsL$Oy2m!1IfmH|@mi8O z*^1FS0xNhsPy2Qozs>!J9f?qh?#2l;CW{t5=~m0E>wA$27R55~Z(1C*m7*bh<9t2J zt4zT7)w`>=dArMZ{EvU-b;#=QxNqLsg+G3V;dzF zB#wpu5j=iikHe?DT_e^rTKknC`c^}|+022#Q8kguX)UG2FEQu|m4#8m;LpsrVy}0L z!l{_Cx1xMlHsw!o!;c6n>FyCG5kE at 0yWH2aahd}1MPfHW=}u*=H!jg+ElG5)$+)70>b8F z&2GutOZ}_mI8XZPiI7XgAKj1oaWn4=m7vg6X*3HNJwmxC>I2KwUl+j3K*qLkTxh|9 z_=Xn6zu!A#y=hpnzlwn+bCp=Yjr0)%|S~-6Jqs~DJ{%Gf)PS+KO|_1Bk4(cEwT>Sz<2!}Ph+I?Rjwxie`Y8jt2pG|Mi3duL zs+OApEm7$^hRm3FNqDxkz{wW#HOp4m5BwE)JSuQ5B7p2ZgL!evz2~$HRZe1a;e~kt z0YSWNoVzs)dy`XIZ&B%y3|@YFcrTWHJlFXfGsQlp($onr#lF$dX;N0kyYd7W at Cm7) z{q1ib+Z>a(kj0_Ez-AEtF?6~A1>MxGzj^{=eaS}Ip{33hl8h}suvsZnzF?_{>f&1~ zA_b+%VF}(dX0xt(He+~k3*H%Bk^CNky&Gr~@_s%e*}s~#)K3pf>E|_}X?_T}c=*}j zcJm+{_zrE1wsnv=a4tZ!!LZCik7r+eXm?+3%K0nOmc5JDXNy!(J6NM}DvgS1VjwVC2YLzR;@>kzj;F0UtUUjnusHVJ^RpGYTEaPOVLQZDw25Gsxzh!o1!{(U at L?$;{ z|6VSpCB|**yAKy?%D;Pc7R?XTN^rEvJ at tzur@78CADC^_dE(e89OLC_{ zIv$wD2)1WOcET6p98)mqr_CCBTTi>RSt-2!9_qbzUg6otD#NvimagGb`YmA2ce`d5 zvv=3E>CD|3C?jKtkw=P9_meC(&{$9ZI(Jd?RBQE{U8&9{uY zmo&4r!Q#cug8+FBcYx?}L-no at vGvO06*KY4Bl-(I@$n;q5xc&iAOR69sqA6=eVWPh z^>_N-!eT;m1>kgkt?OGyS5uzS&^6PxcT=L?hMz7 at K#$#ele7};nd}{*@KYOs&{_Tla&e z&*XQWpU4nOzlcWKD{*y?snFxmKSHiuvzbU|uql8{p*HOive4O|8ph0%iw$48EqI#n2PROMCRsr4eBUSk+7FfNP~26B at -R{W zFCjWac9TTg)}{fSIOo$~hmc}=49Tfi%Ehi)+#TP6awyhrD?9v;BS?ltiNuBx)V4BX z9eCeZ1%WZm&=e%u)r4CzN7`@QS+bQ|g(GyH=9HyklhWF%z4AeVadT{F at N;6)p!kqv zlSdAKaQPrj)YUIX%JwYVVuD-#)-nO%VuOh}EcyCG{~-O>XKV^`*TM)w-a6PfPxgks zuvk)l-ukg%TlEJpV?~oYSJr|3Q&b%wic5 zc-nPyXcF~&N|=GRSP&OtsY4dTpJcz|f|irVvw^6Ep-}KF2oe^#>zmw0``sWoYKt`r z!|bc7^%jpf5Jo~J<#A@(H~;DLPv2y(%a1pde%Xy_ks&-Rog9rT#M#P>Zy|3WRM6 z_buJi$SqdA*pQHUE)Cn?NhVl3kQ$VBxl(%-{iOb5m(+sswTGE8Iw at v zIMpU43Mmp1ruZHh1}BR9U at 6wUV{T}dK7oFvCQcJ^NpN2%#XSx514340;iWd%aAQdD6~-Fzw=kV?xZ)kUY3> zGvC&Ll0d at IcBnb|!l$SLN3tg??S0b}k zTcJc_yx58uiQbVJjkAJjAYhafS#^t)h)NKdifWT4RVDGN`IDy9p at 6@>ps(x!&wCOXh?ko4_=Na zVL8Od;$vhU{N(A}isBF28Ji%htasaHTC>ZK|Bl(gW-ny(KgIbm)IW|{-hUP7De`~K ztc`tSm&oRHI#|olm2}HlW5AyDdRKl~lKK+$%^6H1czslds*bSBbpt^Nfkxfs2%M4_ zB8rD}){k~L#;#PA2UX{1ZZ6S>=e;n+$NSAL%@?YT9|eUeqA(W30Al*HuC&7K&j^TT ztZLc{CbA;y=}L_hkkw42RS*+hZFaB^(CDSMKG|he%jysqoa-8QJxbzFbLK;2bLKP6 zCCyC!*~^LSXf5Y;U{JS;%NhaS6F2L~=k#Z;`7EbybmQ12&b;eZ6AUag*S~G;?4}xZ zH&Z7dxNR%*1mUElP@$$fs{L}Yfg9KL$si3vV<8nU;L-P z)k9sEuElMnmr-n{J(V;T*BHmL;P`fo%e^<#B>0 at 1Kc#)PZmwAsI)Q*y6D4j>+x2kx z+FBaiw!G9BgGE$4?-667F@`yN#1rkt=V&Z7rdR{Fr-W=;)B>@8+8(M`G6cLs%XkaK z-CVo)(IaA(}$1!?BH=b%9fp&R_$QJlO$wbdFm-wV6{L6AkfjZbIo) zM=U^^#|&!0?ZP!Gw?vTLz#utshe`wT&;se#4&>Qi9^YRvIt6>TyyqweavzRKihwjaW%h z0&Bs4BrkbdT4aK)Wi1?MiW`XK#z9jdaKl5C7WuAjV*a1^xBunUXsq?ZfInUZg9Za* z_=jB|;J+3ab$R6_70h?Xa`8h|6BsD8-(doL(8pjxrYh(T91DP^{s!k|y5&sMa-wzQ zM5AJUZe|WNS$*6{M3O6Ryt#9Z`546Tkqx)Y<9KM4cy0N}AaR$Z^Tr?-TL%-8t$HnAn2NVwkkScS9G>!2 zzlu3#C^D>|rr#J_c65#w41a=>`Y}Dp{>?g>eQ&{^1_4VQFN$+3aKVN~tIqaKrJU4` zyw-k6QcD at J>~tNxeB6^}hacdkTZ)1ZY*FjEzG;Q~-L~sTo<)1wGLY-EYa{N5MAoGyF*KHBV}-Vc3lTT2 zl+qD&yoI!YiVGe$p5==z>d@`SE^eBVmWC>kQ{WBn(C1D*^3TzIXU=nFb$40^G1P0> zg+9l~s6?Z_yt^%xM-|`HCKeVG<)~Ddzu2p4n;)0&0FbUp&mG0ZKxYX;K44|aL?Yi% z5}!y5aEm;^OpoGKqD&M*i(;BlSxhj^;AhOD(#GQyPe=v~i)m|aVWM8KT at MUU*1u*r z)I`gy3||n!V{*rsv2Ab4cuye)KVX=fP&Ls&z=j3f6Y<_dQr)vl8VHp!n<3ytByE#3 zQ!PbbWoq9(2wn%2C#7~0miltYX`%0JN~jweJw~08!F;~qmx~-Hi5 at q@*E;rvVRw0D zJQ$x`D)Wh%cg*mUBg`xg{7Og-yu$f!8}GXXV)p*A at gvkfw=wJgwXqt8DC#@)s(EsQ z926wn4rK6NkUcpXiAWVNOhX--*VrXt(Ht*%WQN(1E2YEtmc;vJa3orTJ`HxV*=jN* zt*`&1;GR)0VKAgYuX%BC at y6p}S at 7lV;m{vUl5x0 at JY59v1XbqD9weWkStze4Dycfc z1bRgN`b{dNiwQI at 6-LJAv{t5N8DY*vzv=-~x?_(3`dMWYEq!jO*dFgQL#}A_owdDn z)yL54&!vTLfOC?Ysq4$4>1W zGnMT3s9D-fxqEm>c54-DTX}C3h5AxcP+|EA&)nL2(0b;y&9APw>8DDUWyM8v_-yJn z1f9mK&IHp532QsoHUzdtF3uEZJ#j*KB*6>~7wI8`jYVgY&>w+kqGB#X7AO at 0os_}+Z-QWuVsHm=Mt{hI+%XZ~K_J4OOol6ODp1rMWg%IX*qsVbI5-Mp1?oK9W$0_Z#Av+)KnFn& zL|nu-K_eB|iVI?W{aYAN-p5fE{0Rf>{{_w2{v8HWj*BX&g3FDkl$?|;988K|K0P~c zd at Er>Df~nkAwn-F3b6#uKzK;+;&L|bN&kq{3sxEJsQpEvau}lVz^Ou;R3xP%QbR!} zf!WpSVk48?ig@cFatU at JYeSXc`DiTf?SJI?8< ztBo`#wvZXlDr<%)D<5aY(JVJyvA%A>l+i|ptky(@5I>Dme-sO}E&Ll|tVQg?E~8%q zbleLw415X{28Hct at Z5&|8V%?5X<3Vb? zqZpS2K8)*;XR`kc+W(q3kxcF&p6W$PV at M+UvL-ooM^4UB7>h2NXaabGTc&mm&ii6k z?H2ZsfC&9`Jf#8taq??QDaTf6X|z|=WGm597&sYVnnUECtaxjToV>5vuOn9^VMFz8 zZrd-#Gp~e{9M9>!j9Io(N=C5dj7h8yRkBVhRtC>4zu?T|m-YEe7PW zQm^x at sUP8!YBwqNk>sl8 at 1z3iHDeCCFo~fMr^WMmW=F5A^R%PD>ycr^XJfy6X}q}_ zNdoJ|3rp_9>s%+xS+9fT%S&Ofl;89Hlx)<1nk*R;2ZYn{tZ}mXV&hL2ZE^g3T)1WN z9r-rlMHd|c=l}*Rt+pIc3X&0zd7JsKC2wh-m+}k;&=Lj9?;;vN_3Fa!4RG-$##0F) zy(oyW}+0QemIu?Gz`4ucxwI578w7Ni6 zivh8TK?D1fl_qDrW%rF{XA%_L16X at y(YgdKv%4rvl2{5dWQ+EXKsm#h;ul;~RU>pA zPEx*D6Rk5MdXvcxGDRceR%&rep5au{&1eCJdn{-A5JZ8OfCT%4Iee_eZGgU z-p0#eeZ%t at OSzV15(7;XxyGs6l5N?!o7S$r0NvGf9KdlD#fWFMD%QKap@)rS!_Ml) z=5BBC=t4=E(h%6BrJCG!y1`F-gsjZtoxscvA2}JPP>Qu;i>VGRz;s!?!mzc;riYgy zdyEAG>}!M`b9!q+6T{Dz(3X*;wWakKDL^sKG43rA=}Fsi(m>fOi+{2$lVmLH zaNg`eXIB}Nuz>p(E8we}R~76a^5D(r&op(}4_z~v^Uq9M*mFc0M$NIh>ZYBUNH$%D zi;1mFXiGi*ka!AsGP_Yh0Tv33cQ7&=`EfXnr<-!?9zuy2g^JLc7#Edyx$J^{6nyzY~IMFwyPH|)fSUORM^)Fb9q zt}jAs6)__B~lbl at 3Ss@VK^CJ#iVHGtbDw{lW?JQXfeeS8oeJ-6bCOZ}QKb=X19 zu#lQr;?BJYn^{y9QKG_1ovD-!(WsDJqW|Zc(vB;^f&fj{p~OjFgmsu1X`yyLAJERh zLpjG}+QYUhvyYA8Rpc78a at Gx#Wt=gZuy!mFQz5Vm!_3yL`e0{zr>LaR(}5 at YI|oOJTLJ%*}^6VKlt3v5D3j zdeFrwxmgS&-B;Ob-Deqnh5*~JmJ8U1tDLyZXYIrj3%l+ME>UTT)NTWfi_JymCCzSw zxu|(UR_#M(DU=+hYh~P{^LSg42^p4fmbnn6PIH-Ui7YJB_!r`=c8TQ_hev~1*mZPs z8dme!?2&e)W;nPlF6&$yHB at p`AvsqtxFbhoE+;?pe0^NlKjxL%E5h1zF00tg_QNbasJc`Qa5U_E?CGyNf=4GW(8z%~3hQaSe4QjJlMktX|0g?u$&Az8dEl9~)_j=ep{-eOO- z&RdfCmw7?>m2h9mK>fB(hnEB(NA`E61^W?<-1T`!SaLc=U38aj&yrI>^dO{O?tL)BJ|L_Bxc)jy;=5e542*UN5IZ zc5Cw-q;h>}sBhW0{!2P*{Np=E5(%D3sb`K&dGoV2TFF=q=37?3wpzwa~ zkm4x3~ z<1*&hHFh%x;d3al0p+OmO*%!^Rj3P`9CI>KSfMnZ{EZ6hio$lU at LMv~p=(JzX|DnJ zfpPw?Ve!P9#5h3w+~RNCNQ%dmpErUPUYZ^Ss}`Lh_7}dZ+zQNS?v|<5fr5_1_yp4BQr_ zFa^8XidWFckd(fZ(9!XX8cEow6>yL_I3tGgAv;);o+lSsqeJVQCYsBXohz&#=l{a_ zJt&@O10RG3I((1q{moF|Wg$sRlA8s4eDSl#_p;-Vcr~yu;2xr1`jISz*)IzeB`^30 zP!r4;wRp->{oNt(A~s+Tv)P^`ie)sJQIDxVGaqJm{n#1IYvTko2P{}4jJf;87uL5G zZY{Q^Ij!o>T))zRZi`wEjsm7Q at tDu}^Xe8X926rs*O#nUQRCW*e9JTqmN$Jixqm2n z*@BYX74_ow=YWI^XZ0%jrZSo%^rgbO&4kTAZEG?vnEXeml>-%VJ9|pH(l)|pOZptq zG<$!sRk+2Ob!zB62qgPi at q?x4Im0jf`Z=vPvw4<&PjS{DyBhutt__M(rvke#o)C&- zSr*%Na+1~D4DP^h at w-3ST!yG}swvcdm+BFvNn>*r-8L*~JkPQ(k;E z%l0tvm#>m8`%oH4idt_kHpNQ at m=Q&)|0Gmb4Qk8gwU&oD2C+m308V^gH#5v-F!v}w zKSbpet|O#MZAle+w?n+3e3qp=?bPDtej{ZEm*X3t?#ed51S*XR*H<+-xatkUFD1Uj zYdUt8k>zN}!z9sboJ_Rq;RN(ptOK5gpj@<%Lwh?Xoym!b6J^nh at TzW;;eelIkj>*4 zq9~#uZZ=AQFIE-$=G`;%O8uZ{7EB!$=c&N&~1>Ld<_5%jU>dF<+< zRM?ZDnbI3Af~%;R*hTF)u1Uh<6CyFm*BG}#em5sB!%_rO^~0l1!=sn1)Su8WhR`sc z;EaedZp){hEsvA40j&DS8VSs)MmtAb&p(rXQiV@)n+_>USAKhhIy}zV6+;a~yM#5{ z33>#<_wzRG;y(Ya#0N#l4KVykJEQ&=l at I5?OZ)-HzfQ#4EpbW0H`PU8Ds4$=@yJ0f zCq=IK5=x#xU+N5o75P_pfjN$7RS9}a%_SI8CPj`A)k+9~^;8PARICK{a`tSt+yBOL zSvb)D1=*Ou3vs@&5>!im-4I1vR5YZiq#><1<{-AM^0+V2;$K;;l;IGzoxT05RF at RD zOO&*@jAciAG*oH|=|zbf(ADd{auy!6h~4O(C5Uz&Ieb1*App}LK29ab!pse~Pv@%f z3d!<2Njg;P2M7EimHH};dA3Qo9Ybrkh!Da3Ivc(Q|1yHX_GR?A+PgJtH3I3E2F at 9i z^@n!2p8U at _X{}kQ%TTUQc1 at ijGOh>48RN(%i&Y9VlQFn}SFcd$Y7bK6u-)i_QvoLu z8SYip-)rk2(?H936+bj&3N4{Kb-DvwTLb83IAw at s6f>5ii-{5(PXLcLt1}uEB(y%z zxX9$UhA#Q^N0=7RprX0?FPIBdt}=8`!}|x1*qa}dg{fK513z6>d^l$Sp-%u~mQB at X@VpLh!-;FF9rOqPxZ0QbgzXMSNMvh>g at df-j=oiG6{rd5M95C;E2z_28d~n)R{4}3 at XCelQ z3f&X8s5cvk-634~bIc*X=~!Js at uFu)cA9a;B%Wv3NY0JDH^7g at M?Kndw*AI|@SsA@ z3gIcn;9y`Le-<8&f95#_Cnq}(XLS=(`+rT#rY8O$^MO7L)*DZ= z%9x-eAfe?%Y>-_(OVqY&Lr5arf}Mc3+vjNP?06 at h7eqkraC$>9>(d7%pzi#XBfS!f z&>53ZWq~5`^g8%>SkJs#y{z8?KiiH_u$w6C8(2F2=edE!n7jYC5Q{phzo(IT+bK)F zNQ$jPEqit=#(5tuhh%oV=u(5;$HI0DOOYsq?!%L0V+P)!Tx!ln)ikCYREx~87+HfU^tj2uzkeBzh(ouzZCJ z)EQuV%qY#8DB%Eq5Sp1F-tDZl4hH6)Ky%L76mZ*+>a~A*%=ueE%qU1KBY^=1rb+)l z&Qbq|Oa66|qBf$R`uEI_{0^@JOKR>3N?^hm0Lq67gEUlHg?IoJbu^Tcl8iNKkP^?> zm<@vl1IkE3vTI#4+VN{`yRDz7zlxb!vN7iT#oAh}Lu=<Sd0v zD?5B-OyAZZ%c0-lhFkBA|Hn~n{ z-&*`^SKLbe+oUHoqrXJh%#d5yq9MZ+T!5)MoR)6=6CD2^WA7Z at S+H#jCmp+E{*sPu z+qP}nwr$(CZQHh;j-AfybKiOIjC;QE-FL>QU8Ac0tJ-tVnpJD9y)*_B+zegmAS74P zZu}xu7Qa!Vi!G?8{i#llIv1H!_Wd%Y7uJks29NugScDA~0crguY-%Kv3u-MOjcV|w zXDex={_R#+cv7c}?a+45RCqIc(_o)*=~$V=#TnD4Cw3BHOsQm_%7*UnRK{;zclRZJ zzL}%sFy>YH2~dcl_}qXvFoyUKUWcDfcC5cKVYEYr$Q;VXTvhYtTEj zOKTJm6lxrJNoH2fAj%_q2GPkJa)z)gW>r)E(<6G-BP;B7>GW+ute1&v;0wRuIuJh3 zt&kq>#wE>fQ!On1xTIvzZnzDWH~Q>!4W=epRt at -PgO^5QRXXXhhIU98F2jza#*f{^ zv~c(;lJ(_%4D9nYQ61UZA~Z3oRTRKVn70MvTS`xNEI8;MzgNRydpTcPR7y^+SW|Dx zX(&#{$=6Tzj_P9Ehq|Jyj1=_W#-PHI8^_yuPT|EYe+UAGHWbyB+nohS#I2Ci=f|i9 zt0GRsEcau?j6})g#EdM7wAPMn5l~XDA4OT;4W~Il7-(?t*a|Ab&^O*SXEUQt<=r0JNDBfD!?5_$W6SOl{F_T zC at w83C@`*iCOmYjZKc7yS1iS=BAhj`y(}+T>~JWtF_i-Rd(;C!e{Xd)d=51!O%hNC z>1znn;gnsOSwjmQ2OBF1Wqjp(_%e-+IxK8Vurky!6a-!;$74MGx$UXAh9!2lPaQ at m zhtt|dgk*(KAtH;ArlZ9oL8B*XmPCV1N2VtQ&M=>{zJN}cK#K_i(ZZp|sL3C0Vy3O7 zl4nvFuPLC{ZDU`W$K4v7X8CCoj%O1qR9WbsqSwePG6?66T+fV7T+!8S9dr$LdOAU8 z{P=ZciQQ9pe7fE3 at CSqLYnmRZAShBEdkgV-l%rtCZ1b%-GfuHUwTA%%enes{=;8iy z9K(>a{mJ6sk9(Tjcns}nD%Ki)TzX>aufrlSrZz&1=g_d`T+wt%QY8`}!+@>ocnm}% zdqj(b^Aj_3O;IYoQ>h5-w*kpQgjZ(j1bO2tzBNhM*${LP{9TnT8V? z<5t9Z#UZ69Qdi}vqtx)huLfvEywGms4jm3dy&69}z4vL2ML(?a`P at XK3_?5yjCp!y zD70etict7*$=ofc<74ci6jk`;`=Y@$2t9wK3K3SrKJ*ZsL?yCYT?Y_knngA};A^Mk zmgZp at 0IcAaAT|SoG|ky?!ru(}B^Y5D!3w*BeH;_up_zWyK*gm72}5h(7e%}U>I+sJ zndMO**`_ee2gx;*xISb{N_JCps$+t-htKreZX2HGxD98KKXd(8UF=K*G;A*Zp=2P#cp z>8dCJoM^YWd389ORds5cQV=9aIdlfT(ZMR3`eSr+tHv1QDxFd5wbDj#m-Lw0{ofcS zq;;KU_`DVJq#&IFrkZQXSe+84n(Hl~t>|~xn@(OZ5YAi?qf95O>d3L>P}aIdjc6l` z?{Da&WA^muW}M7!MEwBCSNI5bM$r)kM)KI3q7XrP1C!VF2wRI;gz0J{Hkn%VVIJ(_b&L@=@k_8~D7$ z8By77r*F^fY+5Hc=WY9n2XVme;5J9jkUU`9O=?s}?pG#9KMi0tq5qJhr(}P+rnPhT z8prGCb}xP~Fcufr>+^PRelSq>Z|mY#Z+5 at G6afL3la0;J?smN+p4<8M at ufqC*Xj0gFuN3w+wDZ1;o_40LkK5cYd=J2m1e=- zu)uP>;Dxj!#j2fgzS)S1)&A4w1Ut)i_hY6NayS3OhskMo(Fr>#eg-y+&GBF at 9eFm3 zoj&gnt>>AqU at FpiE8}d#xbSLW3>dckRPslXUC4C^!-k0N at yh!`#PlVbw#Pc%G>j3& zeMyuqOjt+8svZ|!%6(M!>Ex*_>mP!OQ+93zO3H$9_d|5TdPq|>tmyZbyX&{lXk)WQ zM3 at lhVF;bFR#CS*lj%+Yx*W(93mu$L%>V|xVx|X)3Z{<2K{A)6uE{qWZK=h>h6X~E z1L1GBbdN4jZqE2qj5}J{GwQfGPye>{&udhE9f;|fP6GjcFf}jCZ+(2*D;!fsZ-RNj zKN#H{Xviv+ky3k23iK;#%6yMcP{RWQXm_uR`Iq at yML6~EEo3U3PcX8 at gvU# zroKm}I@(un^$>dxEL$ze_P}L+mmU{{(o_$7a?jr$Q?8#FvkNl$n=ZVvYc!9ZON3}b z at 3V1Em*q>ku=f*>pnS6uCvZE!hb?40Sx5P?5wbN`aPZn$kdP@ zZ$Y#uL$EXuAV`DVNA-*Yy$(fXNLru4jezF~mbq5BHl>5C;3?i>Jl2;@#5`!hW`{1X zRZ)41 at XGR(85iI?T-+ws65m1nOMrY zg2*cu&7=5A;{sAObdkX;iK=tFHNGM&s*44iBp+eHL85cKz{T$Xd}*-~W& zWp3MZ=NRAnEw_qYj*%pDr*`~f|o&5}0Zxr09#nrjA$+U^(3|BFa1!O}x4_cW_r9{UHJ4yH(`b6E%B at -8a zNM(yjiWly&d$cxTP=Y7;{t7PpK8NSA_1#LsQ7QaeeSFepuPB^J(xNHRH1oG9r7;-` z-augdJ}X7P^%9`jj2}tj!3%8y59d51%VPB-=1C?DQjC}jff5W|=`pJAa!gDb#Yt{k z2oA|ygB06vm8an#(3}p>Ad_S42RSI{Ovca($>nyG=}x1HbduxrAf*6y0cv5;ZGG|+ zF>)rUQK)>T)YGD*)1TEOb#-%br9;=}qXFQq^%n}<2n3^=dkUhUjqOXM at MT2nANC2- zgfntzaYn&n@@NJT3PI}=1V at P7eCiZMngXV5=ESKnmc4UHHu*_0inB21Oh+*6?o(d< zL)Tp?e0A-`#A+jI0SY1k)xt3i at VEu06xc{DL3o)zwg_l#Y6gB!#U1cNpWmUIa_Z?H zoXE6~?r5P>Nic73k#w|UNs)TAG^}^ACr1SBXJ%SP(5pu1MIA0%fAvTK_b%A97iK8lE>cmK#5Ft zL7 at bYDL?CVH=tuDTLza9hjf+rXcqaXFzt~l6{yEa&3}~s2$hoH;+n2BS}b-8KdE|6 ze{A(dCBHZ&L8>fD+$e`n7cxVMhMJsMJ=j{b!L>~tjWzjT at WEgI0};+&5^Vu*SM16I zJhdGl$kpq~6S|gR>|A~`O{2W6V&%BrP&L{~5Oast94 at XYOB)r=4+Ql!ZT zE!dvQ*NxEOzze()JPxg%eE-uSIdt3`x8LEIj)vqN=~zC07(Broew~ID9p1FLT(Z0|MC=xazzD1gw;4vpwx3Hl z7a;;TGE-gy{cPn zC9XKWTxV^s0m)BXhi5l35|+nwHvz_aWI%@s54Z*?5wh(N#Ze}XIY+4D{>N}OUZQ1h znAb5WnSxJ*@q{Gk&g?j}u1NL0IgO#J$g!Fe%+p$^njtdPShh0?19!I+cb6i!KV9;uNZ{Rk!GsRYNeH()J>Hz3)u( zPFiFHTwiRFDMj+X z#r@(G)IUQ&3E?TAa|+3NR-{t;6Sh2IswVgdemrY3Mp7 at uhBd`xP-c$bMsbG?9E$#M z7gARfpYu>=z*`H15zlT{=s zC7zm=Fq4`Oy#Y+pfJTG%m6DUK_6I98zH%lbJ_>toqi^C4lqoo*q*` z8!S^Jz{r_7%K{UvEHzI|J66FNWI`DaYe}+Rm|C<^!#__WxN_NI=SehUT~*v6>Ml9aL;vB?U)kzYN-jqYQM$#Ap zTtIF3WCod9SyXrW8MY24u}*WjEf(K4KcYX^16ogMeyMCUuNhzSJ}#3%r)W*Gq){gT zr`O#9z+TQSlMgggaz*sOZ<>42wipt!3Jzb(VjJ3!`maJ{;BplgcAUV89X35A0vi*! z_ETmY$&6?gNeexZHi|rO*^+du@%KJ&e^&9(#h0Ucwh%cmTL>zeY~MxeE5KWJ0AjFK zYZ5 at jc|Iv)T9x1G>p`>N2>2qq9Ny5Wy8J69E<;PLN1Qxt7S4#VQBHlZp8HO<&bq?N z?xQ3r#fF!nA7WC;8c=e0W{YXaTRgOrva_D8T`@l0+J-`=PKG ztRv{t>xDlT>Q&5ASgO=@JZ$#qx|z9Kjnj6LbFkwd1u&)Ya4o)+JD!@htiFug?ibnOXC`VjoI6@{7s|zC0VSpJVX_h);0vZysi*IZ8AQuj z_`=hWMpm(%832$qaXB#0I!mC=aOkIB=0{Hy7eEmhisanXrBYfUzoK2{y)b}<=J>yy z+cI>tJ at 2F`_Im|ac7uN}czyzVF!IWzcZODvN?tj4jqe!0nIvQ7txo(luTFMw$CX*+ zfjPckf0cWcBBbf_4R=zFF at Ckx&rC)c{uce5Dx26fn2`&f`G~!xkHVAS$^WCcAKa%s z)<;$0K$t}R8k?%R7-7C7y8p8l=nrGE^7D9u>%}kz3)dn)fPj?2fPl#VhqS+TR_0Dl|1c2z-{iJQoB#WgR(gvKN+vU9 zA*E!lL>gZlL55ATybVeiS^`l)&Q|}h3W?BE+p6@!@E466v`rkenAR;27mC3O6dHw4 zO%QRdsSEEnVFkNZFx2IJuQcz9D5Gti;6j%mJFsCD~;eLs5YLb*cr23ud2Q zQxS^J;(iaUS4efsG5mDT}zATj2%818?56 zd#h-}q4hj{;^zstb0I1s#!5B>uRebU9n{)PIe0T$L*0?waW*r_zt-4dKgp^794{(~ zFkFk7rKlpbS1}|TIVtVq7 at TP0!Zh)=AK=Dq(;?l{;R{dFOhy}w;&s7X7a78tz#a5D z>ap|YtkWKkyKW<#MUu5vmb`KO^hQl-*^|?N&u{Q03h>`#tPAx9F~R5AYfeB at 2%ynQQs>qDE0B4MAQRgF1Q3uu05ykVAqR&s(LudKzt*{ zW!T>(aTcF##klFgfhNmmkW_$@pn$D{utp8kVa_7kOy;mz%4=37mlC70tb0g_ujS?X z$@D^`%vQSKQ;NI7H$HyN#y>@QMdye(pE9aByZ)v`${myaC2JT#wg)&d--6s_s`IPl zGowDhvY*fxaA at lYxJ2G2J*sT>dcwKF5%(|)rcHZut-?`yyjAohg at AH7#1BO zlb|%KrLFLK6%>wCV%maKPH4ltzf=m$n9d8MG^$>ZAR$^TV(f8Jsw*`9_XxJ-X=Sv3 zxav89{f~dH`xhAh2}Pyb|u48O at 1m# z;JmWoZpth`dUSw%Cnbge&6R6Y8Q8gvaxj16bd5njU*7;XB%BK}FG)G=B#_i-*y7o=2t(jOH%gYP}G=zMyR==z6vY9MfhR7jJxuukV?Z}x z at FuSH`4sdG%n=e(>P`85c7A3xL})|L_wn*=~_*k((puz96%~ys5oKGX$~6E%g|XIRXlXLes{42jzzKG}V# zTKe#?I!^9K)NpMkI)%V{a2-d#KT1>*WZeM*B^7QgvS#8X_HLKkZ>hYb5wsKvs~6|k zF*99NvSiUULYG2|wJfwwH-RM^r^fs^RHASgK9EwPfyPSMNPZu$;=DXT*A=b<@*7nA zc$b1xLO}7+fk0D!>W6RZ^b>*X at CrszmHYv$w!88v<>s=qO^*r-bHn3NbU{Hic?rd1 zi9FIceH3S71Q9vH>IY_syr|EQG^4Z52vR}QXj}3U15A^C1*ym|A;)?g5XE!k547~M z5vPN4=AYWcHRZ}Oe;%}GHBl{uC&v?X49;xID at CN6l>|+1(W9&z$8^gG*86k=76Z`T zwH6|=_ at C|>S}8=tM{sb*&-hZKe&J50jUwYIFf6FW#q;+f$QpAE5;T8dJ>BoK3obyd z{R|U~VdBq0Y9C^`z=+G2w(fTxW$*L|!!g~*^H`dD^aU*{hr1%vC|c&FuR7feFjk<7 zK&6s z%?mA3Es|`SybBksdp%lWZF?4X-3PDM5de1HDsmp`Atwyd=}WQ6kF^u%i1y(y#^}>q z{Ed08v$1*zp$B1y$FG4g7I(lNlB!?FL>er(KswcV%7s6>Cn_|oK8C!*7BU-rQXO{+ zX^pqHEjU^edi})%v+BCt^li7SiF4 at UlS|&|ZEzRt<|7OXp*Dc8lh76LTkY>YFLTAk zFk}gf3~3073mP{_CvMY`S<)%!!n~rXUSpVK71c$12ro{PFsh+WlR!i96N63GvCt>q ztJGy}2fXf>%`fbFE!rO27yZR7wJc5EDS-%@VsnheLjUk|lnPhu&%asmC|UZi82^4R ztp6chGyJ=9Sg^WaV?u#GUSolZ6D&{sp~^2tMxju|M;kz3AIx$?VSnrvd98FSmfYqC zQwEBJ&?ks*0uU at jGlFmEO3zOJa&hsM?eY0|1mlBwL5mk21{$S~*#uu`GmI;pkUuPQ zWWsXjX4d9#Zaj*9c%^`EGc{@8dR9Q zJ8C>PBKtZuIFpE0Y_WqFaDC)*F&U^wrt|B+^2mAQtbzO?p5rj9f^1o|G?t8(j(n^x zh$vR+yT_qV_BFwxoai{VuoKzEr2K3D=0c^| zFkse2nUBr# z7sTA-fo@#$*Cmg_Bale<9dMOT)RJdLv0cmv)iIE$TETpj6^O8w-;I(2J&992ouQA& zyKr~Cd(>2?VpuDp0r!qa$lMA=jnExe%>kCe at MussuAwWL=BcBA&(MJR(L7GVw~)hD zSUe6ZbHah;{DiaBoGmzUQoWQ)_?1-?NhoTD_5=o^Lj5%E;2R>9|6qSj0?1Xm6fpFxsFv!%TUZ5Wcy!N}AV zA-gvc9bO#{gV(1 at N8^Qf*bXZrl`Msfp7oLK*yHJQ!#=p0o7)Riws!}sR3&N82?pn? zKvqB`tR4Y}nn}@uX(HREjA7Tih)yF|^OlioXLy#GvLBIyfeGPXIT82xQKGsgUq1*0 z-mSkmP_4Q35Hwo1a>WKxc*@2ti2(``W8KtF8nsey{N7^+)5#z*-6Z`DHCW~b?1NH_ zrDSQ}X}a{WWgX5csP8J|Y=K@(2wr^S1U4wJ*fjjGpGUog-enz6yy(QS#c at zW{uC}B zugzE`nyOhQ7g&$jEyL4bCtgKIC2Q%Yzk at uwb=-5<;&t<`BvvnPK}XcZXB_kt*J$gC zi6;0ocPF*$WEG+`iP-_TTT1Gl`kLvbUR*%F+5|+Fx%}pP^)9Vk+}K*Cj|2lSik*uY zst$7lUheotov+T_!niY at z;*|-rhZfA)rTkLm60|sgA5)(YaS0v(lGZ*P$$MfIslZeRP}DcNv5!h?2K$&f zh$UePh-XFL??j2Hql)C;7!+{c=)cic&Xn>B{oDl_yu1gL{Gm1i@{9gmQncc*b9nrP zDg^j{Mv;vF2dLjN{|Gc};qJV47n7&RBm1GeslZ0 at ifmv2NkRlBWg+(I=xMb zJXi{QSlpv>Obu>5yqN+U=)9SXy)C2oPAj~KKYiR`3S}z!+M+QkL2b49SI$N;uO|PA zAPnG3FzK*y2Q(hLQ;TL0xp1voMet=rYmchTN5CX0t&oT(_u0qlm$jO9RyV6n at 1-R8 zrFa~(4OpjBTJN(SUDh~Jw=2m=?JIF5EByS;AVm^lvX_rujUn=J%r62!)UXC~&&Yq; zK~uN>BU?^d*SnOkk*ivZ6}WTT(L*hES*{0)6JqmM%vtqpV+`^6qOLfo# z3_yp&aO=C9>x1JW&_On*UP+oX1Oba$z$DpVJd&;0u(}b8gl|j|(-sq+SivT^5~|A1 zvyRihlIhQzOd`-q__d;jK3`oA}dS{tixKtDi$tL?!JF zPnD}`EwHMZ at dq4S%rm at 5xabV{abn7|ZURxk);xLOS2v>(h!;Q4y<9^KKCIw2;Sw`_ zz%S0|p5O`2x(oaTY`pyLiYX=2SiAi_45`=wuVSShVZY=YMcA?;dacL+6g$A7QFfrk zNv7CoZoCZve5(Xl84{Z?o6yN#?E20{I!>VD!ebvh3E?eM3Bjy6%6a8J%gr9NxFXTR z7-?i>5n%q2O#W$dz9VJ+|Kmc8*~O;(7rtcwA=5Jbi)pq05jn-}+F9qMK9L%rK=Dgh z@=dKG3?Yv;nuK{dZRs{bFukdAlIq3=s&^D!*Nwg(!}}KEwJ^%HrH&q29f|dPhMm#$ zhP%ge*@~7eogLz|r#(I-k<6TgT942V1~0;A at 0@fqaO?fw5p#>5UJFa1gjB|z z6sxZ|Bje!u_=~w{E0C=<_u^zi_hLZ=@B=DT18LDpSd(xAd`qQ6ZFxuHTECx{J{+SH zZ9GcgArHyD0YW-gU=ez)0Xl0bv)tZo at i2my8xX#UrWMzXO3peHZP++$YN3~UkTHRX zR%}}E!Vm~_*8BN^(p(3Z-6O8`b;4!FP#=DdtZC+pUVf4%Xbi|mAzex}443B at 2IE~1 zzE^j{*Po&SH8LM+ug1C+GF!xI_HkAOQrbPi*rx)Sm1p;9lVj2DHoB46nIj{Q-3$|V zwxD1)Tk;~bX_;Ic%gMBP7Z)3<7`f@#7>6&voFX|fOu2Heoap?;fAO>0B|2kC>u0F8 z_t}4N-Qd=md6%nkgJk2sJdaZmK461G;^|NO1ej-)gj)f^pzF*ZV~vWL)S(#39LzG` zs0ah?$)#I{3t0?MWWO7D(uFcFYD?x}x5NvM=~C<5scy~gcek}+88h~iy$Wy+*uF*u zP%BHmu>U(YZw2hJDgI&;`ae{k{|u-qPW+epJZNJ|Qq1SuBnl>?cK*=~BOo9jPZ0b} zK!&6`X5TWSGJ|DRN?{9zE(b+~>lZ38#Sx++JceWB?&@OlygAtW at U&S<3$)>;B!tTh zf|H5!0&8Ty`%5;vuz&t&&44b(y7mO>SOgh-#c+%_MM6Xt!{JHCP)vIj4<@9zN6EmK z1rWX$%zZ!Bxb*_q#NO~`W*rf9=l6Xw5GOUDsjUto#U;Kwj8fdG8( z^15+)pq00k;>;qP2h9pI-HqaKl2A2Cq3EZP`2#I0=;3S_Lc!+EKz(@zoFHFveQ` zHF65H_>XmTramIi#*UUBDDAH3KTV?4WK(hoo005#{)r3nvlj>TLuW*eoy=2B> z)!M?Sas=;l#bP+25)Nxb6uhW&+GF4 at 9Lw?|j2kG7P7m3^vel(ljB0z|yS`6^J(0_AsE zZzk3!?gD6!Tlp-&4*U`J3V$|^h{=m5K~TAyx;#%^rBD9(eENd$GhMUJ_jhizVly*X z>=)!}sW&dPJcI(_MYm^7#Dhr>O3=4-FpLLZ9tRd=#H+08oULPreHw~w ziZM7(SlF+fQ) zHZBuH%negY_cm^V6$Y2n5EUm_Ba3Chj(^ zQ_5Nu$GD8Dvo+>fDP?J4&lxzjvx_!_qK1#b4Gjfc>dwfqO>wEK4g@~9a zg>bvtq?#)EGt_jJe8oTtrq3^3FKz+8N6DrwNLbF4natI!mN)>4q<%!G(K<5GJ~74| z-7*`J8>`|i-Pw|Kwl7G`zbP+tCG;{?kio0?N}UYBBe2`R7$aNjCCHFZz{DL#x?v(5 z{5M$Da%+cPnNR~&>2H$KnAMV9&|f6n at esr`9*gkyNzCEhndN+X|4sb`zC@&*{KZTE z-y!<{05j71cK at gSPk&dHZAENll<#dXYsg4F&!B#mPKmZqN+{Yn~? zItiOblP0MquIbPHuHG*1dbv&`=@x%04Y~6?!kFh+h1qVXpTC&d4kvdUXGec$dG;ib z`hLA)^!-dBI2&1q3YyUT5?1>#eQRv!^=wPc#KgnJ#(^pmz|K4JGrMg()otQP zg+AGtGDI22#7uHC<|XUwntI};zzi>mW*e$fTk?(hzx63MOv)K)J2<6%2n z<-PWhbOOx=b7gaOQ^-a>T+Yj*L(mCr%^x4=Lx2F?3KQNkDGVy7*z-_RkZoxx-{wZ<+0ej^A0SJg(s%9GhG01Kw2-%SNTaTe1I1J2C4Fm_76hL2#bhCkzpkE?B(#0Z(_eDZvxH z96+YEClfxAcZksz;tp^}VS)s($}PzU^v~5d;&Rv+_-mC&<~0B8by;f1WzAv}#yYjP zFfaUB%j}eWy!0s@@9LaJW?AR7miH$*+5<%=r;|ViL|(W<-%~}OZyA$3M*P>+x+7d>W?k&UhF zr1c!*TEFj-z)F!FryQl5!8vrRT-6ofy%{{bn4#HP6SK*%oQ;N+>NG*CP&;~pfA)#i zEI66c{iR?oHfv5i#n%RB_rPjS1?Da8IKG zlwt372pWC at PolY%<{>Oh-_u%z4{0p{GQ2fQPOSbd>s#NRDGEzZ)f2^1Gf-!bZMldh zm0}H}Y~w3- at m~QrAE-1RaJdc6TgJVIFwYPw>$z%%vP$u?1VR+lO-8!kgmu*sp+>0dsT6ZY%EpV;A&SiumKZ9^DNE*E!g at Yg@))*< z*;o^h+1wSOUMLzrMa!6VRoV9c{mcP8^OSP*w^#djv!(eDNK?_tLEp*P)cv1~8P_iX zLjPCZl{>fARKJ7ka4kjlKSZPk$dNt9k%|reR9p~hRPR at P*aLZ$J5Zv2T8RYF|D*5I z!#g#4y2lu@>d6_G$>m~P~t0&1ezay;pJ_Y*G``F2AqTLW%)15jbQp%(0bIVUa%6UJ% zqInoa$9)@0sh>V at qfFD7dgvaNW!moqa1Dy|espLy(S%HeXhY at 0(9>ih!qF#tsFwm! zy1%ex9#Hcj#AXM`RGz^6_x192#>VCUhbVyr0%HA7*6Y6-<~F9{e|!2)w*LzGl)_O) z`Ez6ZoC-sAEP8R1f|q|KqnYx zd;o-?*+ at 7Y?!ce|Cwa4ed9;|dl11#;Y at z;p)bat!f&zBxh7d-ny@*9 at aD4xv!(liO zNii38pAyg_Eb!_C4H{f(zV&^>b3+P+g$aJL&fHbi9|d*Rhj;OFBkbY?8%8JDlWK(u zJ at w#%9D-(}^zy8eGo2yz>1oJxN!NhD3v+Sl+DYCKCtC~r zMPS)m6rOpz8N*YNimiGOzBZU=<&Ai);1MF(u zRJQ+O`=rNCai81 at Sz3l>OZjd5_FU94&g#njjS1qQs{lr^)_#?8%fq|5V1rt#xe&FhKgI!Y7P=dfx<3mJN}FFP=#8+F9ymG}JU-1_geU06JYwJCk5oF!xo~)Y(_1T` zStzbpbWoijG(MSMu{{3luyWtmLqvA4-ms(JF97<-n?y(g9(?R7?^wn#Z0g)qK&fY5 zZ|?ro&UMz-?woZAAj!P*CEmq_)5NToo++)`HJ1i!zQ6`;3oI7${^8WzwTffTJfx<( zGOx7c$UG)WLNcgXhP~BWh$?=Z$kn%ufU`4$Bnp?U7Obq-oUY__lv!1g;|$I!-*hE3 z%!+=2paFtg902(y3U at IsnDa;;=M5Qmm6VV~vjtHQ{kYmEFW8{!jVD#D4yGFG1(Xnx z)T8`b3|mD|hN~@n2Hx)Q=r#@l^nnZg0gwL-g0&vYHs&Kh`hgj`PRl0614v$ato88o zum=@A*DDvl&B~MWRL!efH5bOPSM)~6>J6?f!cjSPh1;KJ(-ncC7Pu at crdMUx*XH;3 z5>h_2{Mi&SvLlkkg>sInEeaULx=8)mF|jr=(prDUX|}r+L+;qhc^jP^Z98_OD`3sk z0{cBNQrQGcF^REdUm}&*WtmZ8ks--oC!;`OKeRG0CkP*Zd4Yw++wXs=i8F%)qt{C? z<|7FB090Qg2(9Oy>HF?ud|;D5BgoYG+UIN!2*a;s?L({DC4bz4BOFN6)D2zQMYHN< zi{8 at P4w!bK>OQcxnlkP*uVw?zeV7!+2iNUxYNhw85mR!4vBrg`-%I^<#ad#_s2_!ADw5U z5>M4^ADQb#94z*L9y2%Lt}OtKt3NSU{+5X6a`4pc?t!5vFAt#mxW5S96GTh-3Y~Mm zU&+ujaw$9MCen}Vm5tupf3W+wua3E^P=~ksyw3 at 3{-V8d@_}s=TmJY63JyGRWZaE(}cm~Tzz`Nh`5Y?aj9`WDP{7U9g{bHFH*CqgtS%+ zQp#*HCQ3%rn9{On at pFYSXRL^DT#6)pf$%Y7CM_O}x>U44Qo}`{5lPa+MNPnx#9FQJ z-1rijAIVZCfJqj#oq)d#OU}Q!G!M3)xde8AFe)vmq%g!>ZItK{>@t*%jj|tmn(6{c zV+2kycd8Wq at e0!#UzpMQFg++GW4Qs`H&VQ|*(h%1!@@q!<<6RnK{xi>pvp#Ygvb at 5 z5aM#KFLyDO*}h6aX+TXmdW-4lS1Ve4a8l4<{~gQ*F?GVil+h6TPDkEGON2NZMc;i& ze1y?cQ4do3idx at RiHCrMfT%Jbls2RLBEy2mRF}~aEXOJ0;*?s3v5^$Vr5KoiwWFZX zRRb!cxlekJc*@~@Ldt}r6uog8`5+5%w%7=j1qz#O)mh|WM|xArtC-=F+Da1A2LkBj z`VKx-X0_fb at FpQ8jV2lFsob*5r;^+GFEYRmdx at FvRh&qSo4c5$eRUh9n29i_0KIm!AmNNmYf{W<#uiG z0142FvpJvjx)hm9Rjb$$R@}rH?CJTEaUVqh)1J6_te0xR(mW7nnks?G8ZeX5AErbzhBU at l_yh^hdrb zBYO7*VCJ84ZN#&z&rw70;xBr zH<#R9jH`;4?FiyvhSxm}OhpbC3FqZImAyBEW6r!Xug4VtV&A_*a)1qrdyO;CWtI9O zS!fU*S4Nr#d=$j%a+Ubb+!?Xhd<6&W-#NlX-b;pXFP^jn6*IfwcPAgW{W{H+u9!i9 zwfZ2tuN|HbKnwi7M%EId-4uTDNa;pDUcpum;$3J5BW-j;%a+-q?#OkzqQYgqW}6kz zOKW7_5(=_V9g=YQ!5dlk2*NAG*DBuLVQa4H_11UeeneA0A}x@~Kv{#IkAHY)V?$c; zd6$oE8_nuAyDOO at jMyP?tMiZ?6&3;4Hixp*9bP#z&1#EI;-s&1#AIjc#T4e`P0Mxw zZQkj8kYU_50c9cieF#{Zd15uZxVv#%vs&+&Ky+pIyD9_u!gJmQzKEoYD;Z1q|NTSL#EQ|6dAXFf^K-)M3AdbN`T(}=$O z&ELVyPP`v8$MI!2vhYE$CAeicwp#pe9AdvqhYk~4;81~n4_Do;wcW1m%$UNsTv2vd zerug_z*{+^KS at s~><(j at v5AKYhcwwvgz0r3K_M4ILi%V)ldEhL~4jQnKcDWNA`SQz3v_omc zx5jMk7k4&eTL|ZhooPFDBeAL6IGP0~=t@*wabv3;2(-tG&0SKVD^m1Af~4)s*Kwyt z&CACfa6hw1Ybvn at sHz>!QfExyF(^C1SSO at L1Ss|EuN%@agmomWuQF-0Jy%67&hnV2 z-`=SB2onIuW{C{PLYjq48PThH`QHVYJJRJgAl;U3qU=Y9G-AGp3%0vE3bIm>FGbg= z7JHz>_VI-vtMj7p at hgZlr0x^KNMs41WX__MiB0ch)w(FHS7CL9;oLiFKIZ6JuhL>r zpCl67N9Y6e=l%QZ1$^XeQ~!8#-G&#Ip~*2GX$#qZTax}_cg}9C(s{e ziQlzzMxm1x)}wrC1<)%n1*Jc2S4=1*04Sz)wKAPYkvirYRaH*QA*vcrQ-=RTU7-nrr z8i8P%8XesP}GyrAKtK8f8$&Ds6jA^%HNQU&v_CTIJ|o_w*S{1jQeT5isq zizTzgp`LkCWAcK&;)IGZWdYj5il;fh^jhHi&l8Fl-Sp~=Is1M)i2`_R$~fJY%WDKT zxAEueUi`MF^nSa$8Wy_^ z`(}SfxV47Re93BV){Ob&Mck6dd;8z*T7>Y8xw#E^m#}(mS5BIMpZjHP$(b#pZJ5QH zr+Z+q`NEZHvX_eBy at jak4*nl1bAhUD^eA0XVR+ckH-wXR1H^7TtfhTJ*jsAQIs at Wh zwW*nzTV4~=Ihj9LSy+X^Yz-y&e~5!=y5;F%v%d%I^YG#-B;cH at VGJz0_s_Y`vCJXo z-&bF{rnkkdE~cc at 9|>0{C9XHTJx$ro(4zx%fN8}OyIz^nzqz>*w-&!XfwwN+xVbVf z;YcqLWS8-BYIwO6ZP!wlr!c at y43S7`m#{h#sN?35?p`Jtfu z=oGn72DPTs(B at aCe6c2f;{AGws_8<*3U!fULhU)3&uS;}t+;;eeWk at oGfI-<}|<(Y3NKWr&%k}czP7Uuk`L`?9PfYI!# z*)cpvjH1hxQ1_$3?MdY9+9mNklK=)JFw+X8n%=5?jKy$w7PcZa at 0pue4FlzH3(oc3YTz;WQrDq$M zC$nC!4?4d`k@>=<1SE=noU?Cn2!3qD^SM-DF?eq=z1M)HaN25xHMfdh)b111|0I(# zONQ&`Q1EK$uapo~=v{Rt2OXZQHhO+qP|gd8*E>SNFD8_j|2cTR-MlYqs?xW*A zBJG%KO_uAdsVla at munpdHaF8yGz1w5$%I-`VTDy#hfLI3;C&Q`o^lEUua)Jd|JFx$ z6KA3qB#QGQ4`XUvcq>fYfaB at v{B+U0&HkR5`2BVK%nKON9~0Zxp4Uoa2**mafebH< zF5W>(=%>jb;l>-}0CUgq^TyZACfr0`1Qb_7E$${ZAR4_V2U$9Py*}uSZA1U0QZ2ly zGQBZPcyVd4-Zr8o zox?XOfvH at lL|tWa2NYw8x?WBhTPLO3#(vV71U>JgKFESDV>+Q};oYKFZZeIRd)0cB zhLKL$YK>VKN%;@=V-}S!zs6mi3>fh at E^@fGavP>4mAADSBUZ+5on`vHEvS*P!U)Qd zrmPg5S+V3}PgH=|kuiv=FaiV_0^%e{Hxs7U1MV8bkIJ-tib1gK*%|upYEY)Q`qBPI zS%i7q6%5MPRzr4uPvu$J;$8ldIWFB`dL2f6Oe<}JP1mY&jYZ;_p01`goNPtq3$^s) zPZgS>!N85-cX at bg>P^Qn^+&|4A^Vf>$PX)9CkKdzjc^fO{9YUjvf;E at We7Y$qxt4N z1Rte3!}a>RLmkFWie>0J+;LBi~E0gse4?4s?zL znN86GorkU|U9E-IS(juAQCUQ+gkq+q+EbgG6C at 4U=109@$o9C6$xy&iFYLOEPc%$^ zxwR=g4(?ax>5kj9dnTek)U*hGfKhJ091pIIoodB*sSP#rsb7bijjZZa2OLpFzE)9s z at gR(SKp6B}Vu5cN(AbGDvMw6iBZB^r6y-RL8R z^n};nPU_QlBy)o%&+|lI7VmQnux$}2O<*aX($0Y=KQB7|#!iE;j~b7Y8V~Z|7UMDB zI*Fc^t at aTV-e;rOeKt6m`vuQWw?S{*E%T1jqm9nXPZuek?ol0zL1pZD at clp=i~LaW zRGUmSSddp>s(5ICjTfu6J$wN06{!LA28H1e(wpJKIpMiH1!{qT6Nq@&$xHV?vzMO9wiz2B z0KhBYzdesrGB>pRKZP}ca?+B(^a$SO%Qo7}D(B631a5Nh+MYjzZWWLdG(aS;Pg$Bu z+aZZGdvOnY#fXVVubty%mvgtrd}0D$oS&-8yAUg262nIFyP$fgt5(=x5F z(1ZfLL at yk|Ti%a at s;Ua;8sUS;@!T%*YHH*vWA<0#E5FKPXfG552uDN|{jC}^LjFW!3+dm;=ZNRsOE)q>o5=w2*Tw;{NB!PXg87k!1BJ=JtU z&&O5|TV_cT`+O?Nx20i4yo{zGEakU;EGy_P<{?oj%N3dD^CGjg!&nH&I^fw2u#)_~ z$`;4qSP=l5*Em`ti(#s9Sl&;Y%O5Edq|k=uZ at b4^wP6{}6N;61!D-{>r|w>*eyL#j zF-cNrn%x0x#fkzwjS58Bh8dQ0R6U&?oBQeparW5H^vpo+3Q9M}@CjY0MyzO>7aljs zSLnC*#rBbRy~G{R2~*$ZZlmwdH3$rm=o;BugloeeKf_X3^8rdf|3<I}2SN^e5Fk zfB^uY`=6h(oW8k(tGT1Gu)VXni at ueyjp09<-l=H1A}J$($&egy6cPg!qW-X?7WWX3 z&6{gbCX)-p$D>x3OE70(0Unh~m6GU%KI{IiitDz^zuZUAmIST)3C{Bh?DeR=aXgVa zS{Rz-;yjh*`1JMEY-{@V&dd7^wF7ZAn6u-L#xsyeS0(aeSk(Taf7o8DpY-FFT(za@ zH}+?cqy}0!J+j;Zyf*v&rtU5sPk3&+zmp-gAEGYoSIdu~Ni_VV*L=jF(U_TW4`J5K z`DTluAeE&_zbU#5O0~p^G~>#|N0?BQ at reoxW$yW$MB at +|bjzZn1uF*e>mDN$FL!oM z(I9T+O_qkcFdJ3a at s19+FyBnWleFfEvi#JkFqNv)_MI=fpqU7Lj47=C-2<7FLKQT> zdzDx-=VKVf>1B%Yw$6&mBy-Z(dZ+^pLZAm4R)3k%5{3w8f$kFYC+qw&*5U4M^s}ip zaMuG+I};q-2|Rc?YK<@7e!8 at Y%^8*kDRstWhVUpGN0L<+&(d-wcEPSpy_I#D zQvSmNQqCl8)oON;RpsJKD}Sic=SKdAz6(pkt4wT5RDaKv+ux!{6dI zF#4-U9be9g(B-TTeu7!RLv(@z;VEyqL^o*a6bC{2HH^$~xO29P4GhjRT?a01GO-v^ zgva=jR`f$#7$o;(=~3?)@2X--UGbf$r==Qw&{$&DGR!;gZ}SBnCon)Ov>ZJ6ur z)>E4)&L56El*?hMkbOK$(fm+`+QKwzN+Z5;E5mpm%1inn^NS3Co0YBhqQcro%2R}+ zY}PYfWzn+B*?i+Eru?9m*EJ5}ne(+4tWk7#B!gZC+5*IiUY1lTrgpj0(k?;eZhvm6 z&C{Z*;VV}DlZ3jW{7Aw?{KNdytTn;i|Hh>>C8l2 zcRiKKu^%~4kJ=eET|lOtjNfSwJ%w$ymMsU0Y-;MNN*A_|{U*IFYB1G&INWhw8Yc2? zJKc{4hR6wag&GB3Fav~%`(S{Zd#Bv{L?CE at +hvXm7N?lS$Y~_~1fk-7Ljs!4`3Tv8 zZz$ez_P7GGT@{4bQ+~76hah}t+HUOCCmK9nxlgs=kbF1w=gF4u%e{)(`X;gZ64%A? z4%3EtrLUC&AI>Hiu)`(v<|l_O!u7WeKDGRTJpPjaKI=P|%fT5}FM7fIx7`iC-xwjU zpHILEyC0qX8A+7jzy%xqC;?$!sssDWER~_3OiB!iI8 at A``y1^AY~T5iITkTFnL(vy zk at qI6*O4X;p(HDkZJba)0pqQji2=ip%*4@~IJ+5GPY$*g(Rv9kc<)~7fvRa9 zudic0?lF*Edl9HtG`t7MzNb9Q915&qCi8(2O%)-5u8$B>dO`w~5{CK|LK$*-M`4XF z!Wz;~w$`r%-Fa8>ym29sJLXEP&R-9#1J{PvCyWErj!T9Q&7hC5b7SsFbxh!i9awk? zKTg#Px83(p5l|jdp7xOk<*%7k&l{=-Uo&%gCD8hTx-DN(L}g{HeHYy9_ssbVDQn-? zIg(@8G!VX&Ri!1N~7V!C()1;CKH;o8)&@M?P&}4~-0QcFwQmA}^{vS?f{=@0{ufDZX zf4p`A$iL7 z%R$2`MBXE_bW0&gUzS_cqa(tsd>TDh`HaE0e=#4hj^?*zi?TasdFJBpPAno17SSE+ zqK0t at o}+KuKmyyXq;C#1gt9e_>lm&%f?VEn5pBsL&U}sp26LIHQAmzDb{xL8^Ca3! z at roGxYfkVpx+ z4kY~>;-- at YQUER3Qze2f9AaDqj-NT>iHu~rM|J1=Pn(bgV{jc*HUZC&8$`1B-#=|c zBWOn`_#5xg4ekR(@pqR%=!hfsWyDJ4N!abg2jo(hlSq#JtJSoL$jldiE z;D7C6h2qKqYp=izQl^ok&Ry;JnBn3HvPd`ED~*_Z1O78Iv#3>Z1pgq@`VTT0{vVMk zZe(oZWbX90P%1I*KPohWw#}P2UD`wNa`HkH0)Ey&CkF+YQ4FOO5h17P?F}|$Cg87U zwzOOOb&o>x($J;70Ds62)#EM|Src3hX4IQbxgTY?9vxTP@&a7wPxE15g0aYt2nfm# zH}Sg&4o5|i!lYVs+TV5Pu)}Ob*?FDnGNdRE|F9W6$|B_oQmCx-P*E+dqNZ~29IMsX zKw8>u at 4~XvWV7C_{3hQvZ8?Qhb!aEolBGCqc=Pk^G)XBX8 at _MdXKmd?B^Saq6iY57 z`~(g%%3U#stk|wTZ|rIr0)Z z`e1i#Vx*rcQbsZJwc|DSysQ&7PuEU}1{%Q+Y+rEmEe~F^`7sfrzDu)*$JMh4E~n(h zy*Y%woV`>J8AErZ)dFG)ZFh@(3SG~k1`=s%U1||d)8I<=Php2tKqHf zUp`+zHU5trM>Tu>!;HAfT+cOUyMe*UK#g0W3^MJsK#^JW6sIB#(#mJMiF}VYT=DV} zhO(HKPoQI%>BB&YRowDG_ukeEc;TWH>~Z-au_oI=3>-lBWYQhFtL9gw?TWTmn5ad5sh9R{3^lI)9UeIBN3ZbDXabirb1rR?>(09pZqh=*&uc0jW3J%9*t3rSu9z-4wzYAt^ zqCJ?&CeE7~_XD6;$y`N(M+^=J9Z~AXuRHqp>S$Sj=#xP)11CuB^H*mDwx+>$5P at HA zoa;B3nBz38v`OQ4p>|yq4#Vvf5c+myXq(*SWa_UJMhxT?WmUgS94w5LDMjWhT}ciVCbE~(b!So)mRmaGlcyHgA;GE0Ayq{e+}mQUMBQGl z*C6nip?9M{38mow#)69O zj!wqb|J{6rN}94r@(5pW2{xtUgAU2zmY~+*F5#}Ay#Zndb$Sg!&zDbf at T*t!p7OWD zFK3qC2#^#ahD^7j=%&quKcO)8`mZKZ?23Ef{w7YG0{+$oByAY+~4E7}X6Gy>2X6&zGLa69~`~Fs&NU zI#AjLb~}F;4rad!a0H0sK552(g~4PvP>MamB``Xy6pxm-lTk#Sg3}n|*c>;+XcEcQ zkpVC7Q4(;~lp0!21y50U%#`cN45DZmqkT)#LsgZwL}9|Pm+>=NYj*7zPbR0Ct8d&l zc>G91VVJ!LVQ~H^3e#+vj42d3IOiT+_Kbt~j6;o@*3L_@#c2-X%wcHwg^ks}`F+MH z_??XmFPXk^hkljGW)%PIv(UvdJ`?+CgjQkKJ$3Tiy`r;z5|S(<0e4cclXpH)z*paZ z*JTG1<6TW6`8L-;|}$icntDm{}!!ZYT%A2MsAj$dynrssymTp;@#YH>O9l?pK~w zHsotyj4pkktx{ifh;&p8+?ce;+3B*EVov3fC|Evjyy+|CdA}WNc{bY-eR`^iMnC?~|4y*i0sv1`rJ> zWDmZcha}`{AOdR%dPD`WH3R+uaR)K*V#hr#jj-qUPxu$gGWgPQn#0*fuY35Hz01XM z|2C)A4O55QR;Sj5;0gBCW6tfbr!CW`RNC*i2Sys4lYG(-v< z_+6~HOtxqxgn4|e9$}PIgeD0$Fh&O!%z+FnTJa=Ofs|q6*7vY5Qo)tLa{P;AOLVTn zJq-le;2F|L^pm?-<=FU;4k(;HfU0t`5;Zw}vX!I^oNTFrDILyu8QEf#fOysiVs4W& z75pT7>wbz1JUK13sB+D#3>yzE{$cTch7CoiH9~(!C?NY-QcKmj8n-dc2?tM+=`^jl z&UONcxQO7>YG_Gu9kF0g5h5%!GPMfo+en`65iO at kc{t&-WLndux z6{>PhE*4|8HuH@*D|4UB^^LLHaGd9tT`-B#jRJLJ|A$&eh8BFjZPeVhD%Bs#)a{t^ z%p!pTC#y9cMzKEhS=LFE!W+!Y2|Y65w5t2)5ev5E&l>HD2i)SA>}zz(V%IVphiFBS+lL8lzDr0rXr z%`_afs*dxmHuO2_TlZ71AT)pAXtGGnKc^o`9rdDAyb&A(ltEDkySj+nY% zmGZ$hfAe!|=>~4A(6IaVx5U(Q*;_h%rIwFw at 9FnC-HCTceD3K5?AYZm{Y;As5^d?E ztfb4pEp>McuW&!Y*dv{dGSA3QP2UHb^Hwa^jDAByL#VfM?h!{=Mw2iBU#`J8rngHy z*Kp>pfl`#xL=296X#=Cs#)x7B!QfR<%_5ocOf4S0ZGm z_3pC^jy{Z0!{C~mR at ff3Bb6O~v%kb#Hs1v>{i{maR#D8wu?u)~ON~?oXG_9WQOg6j z=e at KSFz!@LZK0b-o$;E&@?8Zc2X z*`RCq-^IeC=a~lEen9mJ|S6S at TQ#w+>S}J9eu-g+3|dfd+T)_o{@1udEU`kYX)Ao$Gv(+ z2ctm5xiRJulWoJGROlihXQ(T5w#wA?{|VuDR^G at tDqu%1kt%i9?Bc~6*c z$yTEwxgkFX_YvarA;kWbiu^5b_G{4oBM9;%s{FX7$SEO;!8QvPwDA=jvoKx`L8 z265lsgGZprC4)fd_tKkLfvvB^Bgtn3(B?T>3cQzy!&)$-rC#}Cpc3-7t}VLeEvf1L zKy{3B-|+B{LVBrs|A$+yFucrc$ClY2AO8{$$u^0N0sM)FzJULi at sNiqDOiE&t`SgZ~&@**P@p?IN15=y@ zFdOldZuO=wCQ=z4pYHaLlWhTT_Iv={H%9hN0Gn%$_L{;y0NFR}Yp)FY2TAUuU_TR9iTJFA$VGrzWJEqYZ7hajTy??^uB%xH_Y8Jnk>ijCL8(kBS~t5w zD4m=S1msaxPBnH%ovrQ>K(!3a5ZG at i6|*j$s%K^?)zT?lXNuX`SBH>jz&!q%9Ix?! za+lz=uyUG4v$k4q3a1Vd{ch}sS)Bh#3nrSN=jNb4hUDC>PI*jdy1>v9y!P;t^5j;} z?uziaBF237ahj5RY(H<#`Ep`-X`>G z7;Keb>;SbGKuL~J(iKq^!Z`dnR{XTAF>rds3#NRCO||01GVN~{JEOC at NW zg8UllPz%F6l`Fh at ibG4fSgr6{<4k)PaaAMC27yAB8Fs_ at t{dQA0CuXC1PcxTFa-|) z!1BKU*neWGQB_kFa~b6ej0kqbFkRCsrWXdSSYQBAIu!d3=DF*klQ-we)r1J05HCE@#k`XJ z{i1VvYkSKy+dJy(E4$kpW at p^3`iFK(Gyw>HDJY6NO1OMVOU0f!N>W%M8HRqj9fo{Q zB3O$&@~&_$n54v=qq0nLz8e^&C&Ey@!Xr5B%P!8zORN?xhMm at 6bbiP#I|{G-Z3j`c zxFWCetzTHS at GNld-XK}j$nCK_R$$276YarqGE~ES5v7C98vRk=_-TSQwCe^#n6SK3 z&3D5Hd!ZlkQ90CVVjgJ{#r$V{k+s at UeP5*=K~ns*BtcS_l at _xC@pOYioax%D(poYs zxmkL~SVUnljZ{V_Qx?v+39a!^5h-#5h$WSOoBH%2;@K6p>qVaF%2tGaBHEoK)RX;{ zhw`?v>6d^il^P5=Gj)fsX%<+Ysze?UGFF!^xw8rtgz5_WZ9sxzExqNDbw6dRl8>9{ z;V$ePqhs=^jhT|b<4oo#JjWnby zcEc$|1{YFOHO3&zG51t-=42?DTC=zKEm)aiD#-&_OR8j~!My=ScKI8rVG at u*#hV_m zLC5f_da6kIpLahe^I)itsS59+;+uuS4&n at pk0SEK5|JnxEgc+peB3Alp at f)CA^Uym zdLCL6g`qf_BypvkZAdX?Uc?*JBru;`NPO&c9Q&CGve__U9 at e*8MYiAeJhzO-G?RZ~ik& zj^bpz$oMqMy7EMZM%Cf*P+0%GNv+GYs05Sd(fl_yW9gnVY^WRh9R%m3!bje2AankC|MzZ#dP9UTYyQm{DLsG3ms8&7 at jE z;W{KnB-2+I%Sc;y?Yc=-mtCcfpSOdX&R&T}3`2wP8 zy4ySD>?E3urD$NU49EMyPS{<2?3m1_B&+5l-)Ymlz3l05rx5NJ#~)D+PqtHqol<)& zXJ?`|xjK-)0%okdDf?Dex3cY$~{j#m1e?W!2HMZyw$UI;0NW9VAH_Y|!<^wZkEOjJx1oNV>6o4Fv;3I`xefJrix`*cN=|TkaQ|Mi*P at cr|&Ikm`jX51a?`VB&qJeocUW{U1} z^1~Zbmd at PS4Z$>)IE(JvFS9 at Xpd`XEC_(B3FDnmO`NKEzegO{3A<406+5v0)fnfhy zyuqpF%b at PdprTtPK+QMUril0oP~H9O3%iHkDG7Lmbdww#h9$`5Fb4h&AhNMuq09gJ z?Twq~!&47v$~_7&<(ip!2eC`HDpW=n7{b2Y) z|MR;X0WN=brLHJE(&jkYl6`=Zt_w>?RDJ=@#8z)Ij_d~ihxbCY3TxgVZ}9wpYm}*b zP~uwxZun8QwX-4!;BiN^&(!ykn%B-!pqiZa3F#Ce7C75j)-8f)=6F(aFVk(AyahO#4=ao# zm+l?k-#j-_!JAiK>A8e*+}!L~F7Ax8rybvRNNvbVVKII>2|}-$zN;qZQaN+7(}KQj zn8drYi$=&Mq+eu35vN7IxY at 7j18q_&cj0CfHK$;w131N}Y;e|4q~-?EALeeGYY86l zop>~qr#c>qpu745q7%B+=JoWzs7jZ?+GTNUjbZ==~vsC zI$6S_FFDTd(fRnL^AP~dOe>_qur9?dY7V6b4x=c8=pH9SeE$4nBv1y<&zJ+KkFUNQ zN%7G)FviSn%fpxz6%&p!@@%%`nI_x^+qJ|>1T2-H zR`Lv8N2YO{kMw}CnP&4*Fw1f$dH)$46o=KMnIHfFFwp<@ZI+0$jiHmd?Vk|r|DvAR zRz(s;{$fct64c`7uMJc>6lGooptLAt4uQhp`#~0J-rK|>{!^`Ob=H|!yHtsKAv|w~$h!@ZEkP5}Yfy?;tAm^$7HmpJGPU>!Wj| z5)UukR~Vd_!^g$V#L}}`9jS~5fmCAqFr>>6*RL)hvuDv at CYBv;{nBA}O)*{pg`(S_ z=mA7-C5Zw^f0zp(m0ou$CYl&r&pIMoMPi5SMK2b!YX2#Kx>sb*UKPjV<-n|b1b3l01Om>yk1iL2jpaCvG zHZ`=Ndy0Ar>KMyBiinai86U~M#eMQJbFInV#InmYVnS0Dsj_hf%KErnjKlV(%a#aF z`8S`~PtDBN at Hd0SIyZcBA)|O1MN1O)DRWUR()}c9Pr<%aw>^OSHHy}h_|x=Y*#zr4 z7Uu%QBKOL`>eCbS+cLWD`x9YCnMN(TIg;zPt|E;HdsU92;=ztiMa6uX0Fz}8-Iy>Q z>z0VQ$R^)OpZzJeLhCep4+^l`LceMyu0cjf)HNkJVO|5JhNrZWmfztNXj!ErhDySK z%ft~_#ezy3Js_PPn3j1tC3`=`CLJRSGpo{6X35Icz)^Iu9WPLBeY7;9 at 0ris$#eHu zuH;OaD3ed{+QRy&-Dr{{{R~m1tBEZ1=gGV}Pg*)KiM1?TB-1v>5!SbwbmT12z^^>* z6t%|gsTGzp$jxm(#KSEmL}TD7MH`3(K^L){6ovxC>;Fip&Y z7aw^;`pf at B(rmOjga))1e>@@YAHrk) ze at Zn~jrA at 6E8YCNut0HLW}Od#J03(zK%xZ|<7zoT2rVo?4(Sjyv`a{s4`Ld#J^*wW zZb-zhTR;HsF&B3xx-3PS%mS0I<*q*?H8YdlvE%-J`56~rsTO&dv;gU(Psne!z?U3& z9?S${Q}~dqTj(W?JUf(9f32 at Hy}gmq{57!dkY%Fne979J!Kx)n9VvNkLq4izF|uUU zK{rcGmLq8c+6WJNl>)!%5=T;?tODzm+H9dfbv8Aix6Tr>or0_IvsiC}S2;Q0(e;5N zZttU2*LP;W5nDI;3QzW=Z6*UEyMLM=?KAzt`JQ!mvPLRAQ6hH$CEp727FgLe0M|{+ zg0esN8!5Hi=QN}BK{RBLUU%n55%#<^R*SFcD0ZP}wwLvQ^5#;H72;=#WM7XLBD5M& z3VtI&!FI~;80g-tnx85feG9x$E*;^K$xjE9oNun^Nz{RkD+j7Eqbi2=A-4>7Pq!X- zP&InoA$U_dNb+C5yArj&;2wU9ec{Y%MhV5v+%BCm9Glz#sz21R&Ug6|iOvXki`i>O zzR~w2f}=;*S)0Ogo5DISLF|j2H$?InR2UEA{;PUJuwXL$&#D&S-}VLjznwPx=i|4I z{HtyTS?G9qt%S09i|@yWTc`~v=(G3>EVVgMW800{f0WH24P at 4%Z5iO)d+=rfJf%>Q z1)}S(Ht at ec(TJKG#n2&=oKL3KunnH;720$ns64tBMt;LqUT}EN2UJFKx1(jE%B&3c zi0B4^Ewe$gh|{PY`it;d zYGDA)@C8uk%|F5vW3E#nZj$|)G1YNvmGS<3I+_x|(@kCo9Uh8IuafU9cgPtD69eb8 zrc`inzz~T=aPo=9e+Ad|wbgrwwk31Gx4|3bO&mFtt|{6-)D0JmUht@)Kjzo|`0pEP z!6p at 6eY!LYGPI;kJmgLz283C9TrmxG`^4!($Y`L+<#6;{U;WKRnW%%^kyCQo+u=*T z5q-)qrH8cKlTxBPVa^#)Nu7!*TJ}skRn%B{%7?--pQW(qcr`j7W+x5j>et-RORV34b1u>}L1EIjF-?D*>&&|(hJ$lZ4azfIh#ftRC zWQ9LJdsA=BWfIdl=&dHo9!fHu7GyZiHb9d at ZMv1qv)jHmrGParupi!Z%2%(kJz&yV zuUM6tU<7DPRmEH_oH-}+8vt|9U5?Cj$`t~)lw!BgC=(xZ8U=8gYlPfWPmt;gem}X^ zlxGiCk9f`MK4HS-fBzV2M?Zo$T at E&>HA&`j~-Du)3Dv90dRF$KhM zY8}!;dx<3TTUQNxsA5d)OJhBkkoU at G%vH72lww z8S<Vp;p({byN=Sj%zf)YN5^;-z2l+8ejV6K8M}hBwkXa*eohghcB at Gc7xM)N zZUS>bCrE*Dcw)bicdTVdcr&x9C#=O7v>S=0peOy|M$z&_ at pas0lJSOu;Lbc{9*fr~ zF3}+&wo8QibBO||Tvo>+sPOrN#YF9(wgOT}1sMt-42IRLYQGGK7d#^+e(`O%3pxJU zg{G1>`(gu1xZ($iQhTRQ=#b;~QiP3dV at _ro@g*xEjW=R8t-fEm&ec=Ry0rF(w zNTm}L0o~K?G|-Zpxm3l$No1F%4lk at k9-9l24T>sRSem(}U21r8XjY zBg<{!|X`1d*ra`Rck{eT~XL1 zZ!wIwOg<)i=nv^Dk=i6KOG!T1(`jyS!O|aC)9G&fS8)101J-Et@;xmQlt^;r-+-v=EnL zZcLj^TCY9B_tcJ{!JJ;{m&y)#ibg++FZWL6X|XDk#xa_VgHg*J#gBza7Ox^G1IpZy zRt+u4-kOy6hIAWa+1W(iMTen+!G}b^p)s7^Ce|2+noNSb`c~*g at A~^+**XT(QfswM zHe)+Kerx%dXWwNooK2JQnR|Xto_EV=YsZ*Jd9V^NwG0 z$M9)H5niVq2$fOF=C)m_ETeoZ-8ngaf at Ry}WoGLZc%bHJ3(aRI9!qP%>iF89a7k<* zWUAlyH`j;;1xAEI7^Ye;@#rMq0T4_Ye1sY4Ub-VnhkG4*-BHB^u=@T zPCANhc at iFEc!0%qUJHB+!Yt=SxByogNm=4PiT1kEmv*cZ^j7oBcK8e315rwA{oax^ z9Ou%Y?K#N|_nkL_a64f0Uu;3ezQK&M3XR7KiDz37wK$KufsW`};$z1(s;ifJLTK9C1=DZKHzK#{quyZqv8R{u#HWL zi`;yB8iY6jp`4b-+lOH=dsn4c(jC?)PaMXQ%yN$HcmFml{KmWddmUY}zZPc~hp0-) zz{XTJ<+#=WhZ5DWV^yvez1c66A4>&g8>4;$oAu1SVcKxfpkSM3wctZyMsm+p1ZV_FxJTJU2Nr)C_~hRE+7d(-KMti}1Y7T?>E&@uZ@^9tFTDaWm> zgZCDfJpz^D>h$5X$a}SPo#Ax%3fV7EOp>%^V$_;ix>&VrwVua7P%Dj%z-#+=9y~yg zeL>-CkwqrKS}8%aK{Rz@@+EAmSQ3wIzv~QDM_+855Y8~CrpZ`qIYB7dw?C2!#=9!$}?S&I&ku*Zw;|D)=`ur zzsHT(OBKHVC2T5kW^4ZaCm*bb$h!!t!}5LI{JK{C$9 at JiDkc(_%3-h$W(irGUK+M0QH~q z+|6S~*xnry>=So&3??^sI;~1xLpTtdBKip_$@!aT5{ouxsB`PGXq8B#$rKN%LnY1M zQ(5APvKEFLTcj1H8{bilYm9`r1QmiaaHQ#-q9`Fr*O&QYB=fF;Cx+DC at e|LAO;%u) z1c!|R at +PnhmH|>^8Z3 at bOqD@C%94txgQ;2gQ>Eh{D~hAD_4 at uKm#y2N9pTOn8#FpV z7S(Y7K~T2|eBppUdY9vbZoCRsDs1$CV1kpWw>VYG=)g5nY946}{!A_HA`mIQ2+B;X z%(@Vv6ujC?RF1>ncsd%wG6rj1wLm-)%C?4T&yTHWJWdZSvZ28!X+mNvL^bZ>G(6Cc z=)@G;2)&zOeS9Z^R;Q<_|0yHDX2JG`kQ_b%eFu}CbQ%F5*jcXzHmSn^!b~hRE|vt1 zp3hd9-<6XTkhyqY?=fps1+qC+7Yf;4E|oGXDZ-{OmPS%k=6Vs(X at krR0*Vbytn$Fj zov~c0#de7-P0708=?bAD{h%5*0IM{5a{x|gwWoIROPuDZ%C87`VCZJE;PGVR5Mm?~& z$2_pOm$BVVWtaVii<-~6Q#ah}N$-PwtMt^}*ve)&1@(tlc8+5X-IX7FO;rW1wIL|)jxy4&*?2GI3wVXB0 zgH^oi4V2`Tr|0ZXOr_`jCnA0+!97Q;EZrTicSO-yRVR?=m=_J1jo>{%FHqWkXk0|# zgnZ*w2?)+{pfs}q&n|)L9GvFF>IP<+ zXdF&@)S0F}WnH*eyqK73@^v7lRJ24Lr$=?0u6d^ly+A}HQVrjY1JT~cu16lIuONvj zZ8RejD%NAYwr!h_>GWHzMMy1g{0vPk5aop-`FKturE`qS+jD8FGKIy+xn_eCY&vz1 z%b6^B+u93ZS}?k at I`qF1f4mE1NRnw+i$=a|IR0MdC)V$v_V!)%%5Adsp at Us_S{t%) z)NS%gk~)HxBE6|q^7i=hG!&}v;z6Dy*2Ai(*UHEFP+TG{#E>jLv*})rQtjo$`T?rwN91SR5~bNo9Rq1z zl1hNk|ADS#6Ox9NS0 at B(MngA55?tV7j$%^eCdLySf=h^R7hwdW8#FKkBu0#v55I$- z`pOuqwNpwEuEn0RIjEp_y-Q*(p{=jh4_n~#FMfFEE`YrE503l);F#_I1;^6H*0$yz z<~FAP`05`hUY9|VN7gPz)mU>t2?c^8GvK6#!PB7#7|;`=14YtIKUr_!E(I at UoSaAy z%KCu&)uSp!B!b&?8pzpwK98dhIyXRnhpA at p^kdZwfFzLW|Us+udjkC|0^%1Vj+j zcyv=GpCB_%o_;;$g5n+HV#?W+aj#RZs%Iq1YUPYi{V`qxsMLBqZmP(>YzF>#}z3s6PNlu*8z1IA z>KU-jnm?=DVvDUiSF)QquPy3j^30nv%Qh6dAOdyjB79qV4ib_NO92~Ak4fdJH$8RM z)7Q^s_F&`34XnQ4Cx--PW7{m-4$m%aoh}WQ> zN(la^crGPh9+vj(7JkA^o%;F!bZ!8`l_wujkQ{FZ7KLss0@(FpvFKN$Ttz!yIHYzD z#xnZ)xx=Rb2kpG?!7vu$SP%@9;39g!f^eu-twDM~CP&AT~Hs}kaHX&9+=eNP% zrS(>u_5QT+=l3OE#aC==5H`AAG1u7C7SmAMz;5xR_lSu8xHN7-C1 at Oi>?u6F6L{Ss z-fUhS*TIOhLIF}lz*!>92WzUslIvjC$Bf)>x3~fI#Z#i~X1u*Wmt^K3I+$mlRfUq9Vw{~C=4}X{L5Z8nL%)FjH7%OxU_dT` zzkS1l`1Xzezex)bcYBM!4O08Rq(`B$l at qcFiZ5%k%p7cGBM>4(rK)&9JQ^wsMPp&% z8kV5N91JJtKC1_8M8 at WnZrL^0>tKMlNXK5G;>WK at -#al5-Ye3mKpWWnv{eqX>FjZ* zY$wOh=euLQZ_;_$!cf&DH}0EgUhT(WwvK|`kN@*OxmFme}K-yZr-OEw|L8J&p;R1HbSK=RfPeDf6 at b^!i2{xM}+`| zXzyaQX`n|-?Vs&&J58 at 9pPweHrM%>we4-2#!Hi!Qp-z~+JvJ_U-}M4WfS2!bMb~r) zPMSxkkWw6;K at mB*Cb)x-1Ab8YddaY}_)NlZ)?g15AY*Q~4~4od671ZAt_B!1(uOzL zZ2YRzQu1#y*XT=Qa#==o&N>U3!{wvbkeI3+XRvx3s34dxrT`7W7xne=LI3#u)lGk|bs3eqW#!3Skj36ls~kwf zY%5-;PO8!9Q%r~kBe9u_CsJJ49$-Y(by%AwV%2XCD>|W>d;ywIv at _}>dG5!Ba+Z|} zx?T#oOg#AmcDT00P at -Rp+-c0`mlei9Yk(LS;B#RZwLjLQI8vMo*`niK6;nv$X8&F?CcMS?HI5}vbZ8;^1=@ce0zcH zq6zu-V2A^miK8o_(VR7blka`&p$GGEv-pUcqSnl{9 at v%#a74SfCEIgs(!%;Qn9YOF z8N$vHD!hXd8$%eC9-3*$(>tv at E2izKg{}eSg8r`Yav-e)Y9;46S1<5So*W`kZ_5G| z1?p_F?IT}5pC{muj+w$H<>={?5yK`k$d9*aMg7J{VluQ+e?`6rk+`uY%MCZ3ib_f6 zj53)+TgKa%G$G0j&&_UM-LwY!=Sili`W5c?@UXt2(C$M)SLw6Fs$J_6a4~1 at +W(w} zIHN^+&K&UT4W(OsR!i+!W{u>)~5Zwp|9mAD81l0jXQcsR})3h48i=st7%@xQyjMDtHi_z5 z%y#`jhXoe}qYMPf==UrMFp}4c-+A14ssNV?U&=6f$1sD at IFxvU-%*X*b;gth5ydYb zgb^h5I&J=}57iiG8C?S5o*NM&cnSDIxwJ`6p3zHRz%sshbKo_~K;NRo8?mu$Lw9})# z4<9|qH|{!jFR7tiT39FF9K5GG{V;ntTbBqH0)&t^uck88MI1>y852R?(!sq+h!Ane z55>5NlqBAYZq5S7=L at _ryt0=B)K_yuF;p|pM8uNa%8q_TpKpGwJ`7n~>Z(bAkMf?j z<2rrb&I?Cu-t6lW=t^G5bGYo)($eJybRtnxtGka}-y=QF2EXai_b=fP+#V4%8fWIq z>3e0vSb$|JuD<~$ z(8KFmM7J5Edg%H-Wz5agbIoZ=hbV1R$&BPymWr2H=UBK@>cTRZHSfPUjCVAyujDnL zIeg0ky=|->@s at poCVd&cPL2a$=;8QktG%+w%GB7py3*afOTmB93$Wmkzr03Tb%1YOijV22 at L!ajW9l}A9 z3n2qPW5`AsvKZ4KnUDp#B?SFcMvG8>n5ou-!g at cF*C z1ZqhPIPmym+)_~Q0st9UP*~wul0f4+CZ*Z;NjlEQmFf4^C z7St at c??!_WILtOGgd+f at aiX4^1NWiQwbO9kfLXQHAV8ww39mreEp!0eNzVE#GY_;K z`k58VXP>=wRFeLv=q?k#Z at ZedvBaE`&e%GE+KBtqXbyZIQP>>HUG4`t0WJ(WMpliV zB=^Y6R2^p`pFwDNgi at X}@o9MPHX=#JT02xx#}ro?E77B$!6jCX<0|MCg({G|jM(1t z^WZP)x3#Wtw*DsovBCfIWgY*fe*f at 3{iD9HlAG5@@!hJ-Ungh$E-Peu4>k>iK#x2iG!cG+%z!V9j`nO-i|k7s=8i%#V8qwp at i? zr(*&!D%)CNRn~Zf0jk9W3uduNuS``=l at zXNkUEJvp_pf$E}|nd(`1Yl)}g3?Y?hsL zy^SLQ#?X;9+Nqs{d8FGcGE-ZA0vFSb5Y{wIU_8l2DdZ;0v;bS2s8&hyqk2B-MA5Fx z#2s(+g1lW)P%Y9>u!&}poHXAC^n5f8RAgI~I%>EC6bYuVz;V5hAW=_}i8&*Ec3ZgL z(>bH#!VT*XKejP1cO_axdJBT>83n3)m>%EaM^Ze;@z%su3227k8*~2e6_|aRO$i+% zU9ZFXjlRlErCQWmJ~QA-4CiB|}iUllHt)-k_Vzq7bP{xu)5+ z_z|G-`F}z9AC;;Gf}9Beh3 at mNez@;g9w|pGAb!I51z(quo$!br6O!y=XLW$b9thQZ zcmD^wvL#0qexF4PqtP=rF21ZK5BIJZf~>020uv7&8!ST)=Bc^F(i zgQnFOH_`h5{zTZ;xnxS)5U(?BqqJf;p2+U(w)1<_zFY3@{`$Uy^=JaKZ-j}xl4!3c z3ZsQ|DKRpBGTan|iwXQJ+~{OgJ*%__>^X{j1qOc3`0BDc9Aj3XK`0DYj%`TJY7yofqQejTQ|uXL*JEkA<$sw zm%@QmZsfrwv*hA at C+LT^mq0e&VnjUT{@5h?a{Zv8Ynpsj5X0e!8apYJ=b*CAG$|m* z at mxwPW?{I at u*6hkb<1yng-z?Xp%xsC3sahTS`Zp9I(b6bCrW{{-IMg*AfSE%R#!m> zuhg=UWULjvT+++ixN_frNoSMiUae3w!}ZYqFr)FFTa9g`cY%BTsHhy}fzpp3n#s_l zgOhl at K;=|{px+pRvHyuqB`amBLzidOa&^(RfQu13Lt zQwW|br)!kKWZh(9W3mE)tuF zp0u!{IPXP~vJBCFBeiQaq?u)yaj8D3dtUyG!3N)qHYLh5E))mXJvow~-`_ll^U){P zBd-zJAF#cze~h3{XE31TWnT$ z^plNV!UjmGMOc?;g+J4?NBxNH{$eU at 7}C%yt<`8CCywXH2vz}Fn=DAAjdc5(VR~_o zK5E=o(I~YyW5B8KVqGiB&f=Bz+$<#*=IGirRv at fK#1%R1_~Z*w at yIMP^Ov6-$vxQ= zj*#V%!o0HOEVI9dVes@?gLYxlP$9xHmvS4{vXEe?5|?{`f9J%(I|EX2uitfVv3GCa z_m&fySns1Jw9;?2Xnnn`eQsgbJRNd)0roTqDeV3oV*5<)>6ac6$soKviWz7IqpZK2 zp5FfL5K_Qj%zwqV^A$;4Typ2jSiy0ummag(H6lrKqDfe6uk;0Zpd03eiB0v}|d zEy0UDuItA-ca`U`=eU;Bb6-H6Q3&fNlaPk8v%eAex)d=&o*9z!R+;#jXoA&BqZHn- z4!-`PV571>mjB=EeoA(x&i`ij(~-kcK;QvB0m at T+uh2uSq$xRljbkpt(3QRqHm4qW zGwIyS+{rCq z8hpTZj at fSd{Z=Cw=&ag5pW``z^eIk9HXwe-3A*_j)os9s at Pi+BZdas0X*EowAyiO> z6?^s{E^Knd at yr>~eh|Bw81xgQj(&lOp}$DAt@{m@{lhH@&*!lavHP?Mtd63fHa5V2 z5QWz$OdqfiPX93m5|o7S8`8?4 at W%v?Ld~&`HE%On_10|nc#SnhWa~v0WkkYQdhrRwa1VEAc!|Q;*eFKH~kG&7V zCZ+~1*8gX8w6c}cyeJ9}_K&>)0(K`lY|aWJAeLEsfw5?2 at r96>8G=KJqfVzo(Q zibKh1yLyfHz(rZ7 at cPd((pOcHG^^RJMfqu+X4O+$!>d%CU(d(e-;#IEo^i&JTOz!$ zruMq{El at FWjntQ}X;hsx at lNh9a{(%~I)mwe3Vw|P<_hSB=njAw5Ko^GEH;phzEXcO zzZSXq3Ys~#ob&IU((o%~@9Ef)%40P*=t81?<=xQkJyj}uZL19YV$6m-r3d#J%N3aM zo8~n8bH{2+6P+z5hq_Jj zn>wj%CD87^O`a|Lfv$ZVSWDT2UBTSF<;t=vHJx=L^(UV4iHxSCdU%g<*z`m(4qH$d zw}~#+S7=u^sZ{!^`VyZ# zG^vXBc_wrkQQc=cljx5$<59+$e-|A;HD_8N3aZ3)T z+#ym8ScKnG9D*xoyS^EQ^}~|i$I`ic3~@!0yOR=;GX}`wAnNwhV44sb_Z1itC?HW_ zY7Dz<5Ijy|SapqS{;s1o47SnwTJJRFmkbNVL$M^0pHg7gQS(xKLmEJVif2{QWQP=(NDovd}uE&G_12vr(8w`!`C!`yKUQV&ZO zY0NER(2N%$QjMvwJaXk>Sr3OYLG*4qU#c|q)Lb`FeS3)&qd)r>zgOGjR-v}f5vWDXb)>c(uA z#mT#aOwAif`t8ACwRUyFt1he(yPJO{!L+JYBg8We!1CPg=6=Q*l(9IryZ at qOQQY>A zNK+G8>AELg_$`eACWI?ww`VTM!8?JZD>!@6z}v`f66MJ;E25EblM#TlT&O)wByl?s zpixbJ1{ivq+djzLok9Y8;lPTI71ZqE?BDRSNVf-B at 8@z>74vspn0+`6G4rRNrk|l?`eydp zeJ^RQF!{`FH0w|=;Pj?%bbSUs7q~yE9R0JUTHJr`OZKowDfYvCa!$fkaeIE>b-9Ph<`WbizlGru*EH{kmBWsz zF1k+L!~8O_?y#_eXaCrGj9k(p;lL*7VwMP7$+bF|gxo-kCv>e66AEaj=#47*(Hlsn zYKUW&wlnm!cCGQ88weWKaV zZCecV*KU01N;AQTzuO7^tK9j=Xv4qej>VtcLE))pqQ9W0PL at FfMXd!j;Ad at w^+%wW z!Ln2&!Qzt%sfA1HBD_cp`r3&>6dy2W_I?z at yz;`$pcOVWi*Md=x at tY%Y<_?JxFGv! zQeY_0P`yuq#yr51%IR4{l72{@Eizk<+(neB%2HvWZWe0#cn7}z#?=l3oJJf1ZfoD9 zcIdkEn%O&If0^jUU9RXr2}7l^PM0RKP3IXc(H}oO8KB}Y(T$jtrW%bB$m-OR-Jb)7@)*k1BIu-ERprrb4?k?(1TC(}vy4gCOk>^Tnys7>;T=Hqri5AKX*lj>16nmw|3HDEI^QBepuh79v zALgYD$_8?{!A}Q9Zsx>+QDi$Rz-8ve>!ul at vmJf9F3ecLa@pFEUz!nZU*E8>grxI@ zH?t{fY$ZJc4mKnbcLI4T3KNJyUy7dN`~49#&Wb$8LUdT!6N*~wGrtA)24*W{#}ZtmMV{w~%f^hIhs at 4T@W z0V;I5%NcPW?>6NQKV#&=Osqg8o&mrfFq{g at fp&l+zo$txx(dwUWw`_a#T&=H6ujs6n$WJwo4?p) zSUGp>8UNG+4}XA=_rHnnf4qs>Im#H=%i8 at N75^UQDjH7MA_$+V at r`vIya>@UI7(=} zVJ<(;`G4wT2g1WdTMr6HhvHV%a>uc0T!iy{O8|eyF5Tmy^MFv<0UoC|U5Gv~d0lkf0zp;znvJKA8D;UauHCr!G zAHBe-(XX{}HEU#UR!mGKEXI!G2Bx82wg7B4HFZ>fX{*h28*5b!Q&;y%=R6TSlZQ at Y zChtyCiJPnunLuv8&k*+gHBxu%`qXa8ZYl4rZHk-A8*bX+A;fd(g z;yNnVrM&1IWn=@{EY`Ku8#68+8nf4{HlBMEhL6N z3TMi4D|eoqbSsl>b4+bHQs`eAuM>#80`3{DyWmpkG7MeAgh*?no?wyQQ9^BIvCid} zSx`j65~VLQzy^hNvrh`8xc#_a0Cl6387RO`RJZl8=$9M^;8})L?J{{+?LmVs%Vw~` z+U=DAFlTr~*VAKRcTX6I+hwv6>RuAzl%~>InjDw$8UMSKU++fE=Gm3dy zA4%y}hA%SBVs#wgWhTVUk$$KEk at pqUa?hLf23q at WcM_)Gc at 6JxLA#I09fai-q|RJ8 z^eJpel}^VeWVb7U-NyNOG|D8B$Z$tgljs)M3{R?N*<$E)KH}E}AG%s9jVJK5iFcdtN_wAESs9gS)R*;-M z3mOq_|2onsVT??H{i8+~Q=Oe}f7FNz at jvdd{vS2^$6dXCTJx$XzI331R^Umc z>@zZP7XB6 at 4o*#sYe1U4W7eu6Zw9~B*MJ^4&?uyJsV>V0**0QVq88?r}ak<;#*pfEj4_AN8O>|;Z257CETk$B_x zW1v8`GYrVb)u0RElm&fY3 at Iep69^>Ok9-5T_tGzj>Z+y7G>*oSH=eoZC}CsMq?`sHeXTb*^y&Cvi#A0 at r2 z%sH8mdBM0j3G5 at 5)WYslc7Ki}M}nbMR-g=Mm=s_3M_6suIHu(W86agy0Wi)U>) z{!Ty~NK{I5QNBVo5Cpn6bYdyjv7o?tu%sya0N3Jcza^oeR5Q7#cqASU*|=aR7nzr&AJlG5Z+X2m=azPIB*UVW8fTU% z!zX~^3D*9bL}-gnD~n%CC#L}t!ghW2R$X56z~NGVpMCA}rpRyvL=?=!7i!z2NJv5u z-&=X4Z z)D{BiI*p`V%T$*)7{d5Csd10E$l#qu4M`_i>QA18i+YAu-X`xaSeSD)_hP|;bemzU z;Ar2g zeMAJ~1`L76eZt at y@#~ z^2KE{M+MhIV(PiJ!*~UKN39Cf5ml_2L^jODC)yLU<_r}P^bX2^GsHz?!1jsQ#dUNH z>L=2nFB~5ww^b1Cv57GW6U}&y{?#SrF8dL$s}f=!**SPJ)wjn$!uK>C at D|WHwtHkY z-XeC_%;SXL?vyi=S?PwKvM|mZX*(DW@?N0(Di- at BRK*FKKAE8ULMXq~ zUP_vd)5Wuj-U2&i(4uRq?}>I8s(x})qclodkfc%f1(SL%u|A9C)3up7cVBDq?vI@%Arggkb z0u4Eec)Q6es8snV+OUg>-psnqR->3S|RUAAg50(rh};D z;%qOO*?T_D^rlYAQT}|~#DQ<-Tl?|*M)>Akkejx+ z(b%}&@f%5$h+3$+-$sW?a>Lbmyn~l(vZspCSx%#9-?He65U?|hKzCAfDa!~`PIItk z6q$^Xr=%Jjk#It)XT7l8(wSF at iAPp0?Z6T)d)I^EV%64fZ$DHwdI-B&Df0%NOFWrQ z+FT4X>A)^9HJwuFS!JoA5_oK`-aN69essMd-A~=_jAGU at 35n}g!*RA5^+kl9-IpWJ zjqu*mrp8!;$eF2an_8uN{9|*LVkh3z%H`7WtIhVy{fy&=2rd)k}o+O37br6E_LBKW#-y9Hm7!P-Jwym9&Y%<2R)0{ylY_tz zI1KWa9ycgm#3YJ6tVvsO<*>3mfAFq+xu+Udo5C(@V8>;vGOB$=1mNIu6z;+olUBi2 z3{`qh1%Uh}U!d(0KR!;e_;ii8o?@-rG!c%c+ at e@@bDJeHj_M-gRi1f9B?6%~FJmUV za6aR!Icu{HyhkPUGgWOB#*7oi^;i*K+0I4%mtoX=|VrlC57NSBV&$eWM=%^qiLaznPPfrE-~|a%vF*z z at VS_txinm1JR#3ebIvz}+8lF%J`2k?gu+KD%d1 at QjFVwCcA;cKKPF}44mCdl0%Fks zQIJ*A1@%x)q`YXvF)}YSjjO!|{5zURF~K3A2g6X$zULoxvxm^+zKHTT z)9+yeq;qM*;?xkn8n1TwRtd(Wj?57k1QO2qTA`9pg>N*Re$bfP0=-WKBdQ~sy%HUQ z6 at wl_LZACBCpYL7;1-i&heC-vbjnE at B^KXPN>GDRC^E(S^?$n+sQwUWY{5dsiQtmY zo(cCV!RMw7?48a6i{sz|IF%E)(3BXc(jHZUOQ#qaL_6+vRN~h)r7(SZiJy-r^BUf+LC_m z71;$Rnnb8{i{(5LS9cK}(PojyDy-C_d{GyEi!*s)ZFzM^O{ zv#hQ5{38V1pP*Rk;}+bBrw at TlDJ#wH;?j(cS4CLjX&*}E?KU~_ZuFcy3}>gkeToK9 z-+Bx8m8u2jma+7(7F`kon!hgWauk1n2W=5PPM??`BfwvBvX{^57CJYoTf41hvP)=l zZ^;GY>z!Tn%pO>D-^uDH at _f0 zOhkL)4qDA9jc at 8uXu}1&d+rXK;$po^>Y^SE5Qv#D at GODrjIKNrspNj*+hO%lc-jEq zy7}vFqdma0b;vJe8#HalmBgJ!Lp1l=(=KmLAwUe}5j~S|+!_UFdcVRm)yz;_F+pE3_3C=;hptlCGURPI0k(1eQ0RA7 zbG7g;RRr&!dD)a5*< zOA>@MZ5ZH!Navy-)j>Bbenoi%z~==+o_A^o zDj4Ivzi@|}oEa{yMix!IH!=i2(&Yv(mN)W>7afgHjCiOtkBH=j!K0n#2Uoz{rikS* z=Byn8l)Uid(!sw?{bJq{&SCu5Qj)RlQ(g8C3mHQFmn?7 zF2Ue*1MPQLXtr7_vaw4S%wJBou`tm^UmNqEV#ch%%0P3&hQri8v81nWV$~riSJq(% zW0UGD#cp!3yCDT`pR~8$YC5BB-aul*&O`5wA!IdD2WaWDr<~#`Hx0}%*{PA|`R5sg z6^d3;XR_$BO2pHyaej9SD8Axf*;kF??7x{A7VMwX36B)eX`tSn$mq~TFK~Pye+G_t z70y6jyOO6m+rI!lIH%jW`Z=KOM(eF2Ax^iw#fq;K%{WN&8EQq^%-VQ(n>@35YMo#{ z)g;qvGBJ^4-AKVCJWA1D3L}$6W3*Qf#uiqYkkzxq)5YNtvvx=Wu%Z(bkVT^RZ8m5X zl}U_j6R at tb4_OYP%G4OI)45Dz%)Aj?nRO>$NX9CnI3+{Bp{!Q>&5nKGABP9Tq*iPX9+R(MGD~}=MgEp%l;)0M?LTI+Vp|iUYKUlS zO$c5fTn^?pUs)?#o*hE}UK^&;zI$TW8>^BHlix!bAnacKp?*uYt-& zPh-?7F1Bhwi#g>Q7A9GaY^6N2nQ*p9q0&1r>wVg!!Vqw#_E0v%r&Fh+ap&CESQsnd zK?1*i2+LW>c%Fs*T5=HNpfElELPRY&QYh^;-|(cse|Jy#0e7)b7Q at h1BTEn5G8ZoRvOid>_N zEfcy%Hu&?U({;?qcm_aXp at Xmh60nOhPU)%Ih>5A!3|81O$qi z81)POUo|Q|mcG*a59-YQXAAECYLt-O|MVR=|MhT5O9 at 2`<~r35i{&lo_U_E7-B%AomN~JE+GlVX5RyxJoi_;TXP&N1IuyAst$w z^=t}L@$^&HRp#Xr{-+nPKAM%s{jMn;^9G|mR}6=8;h`4royUQFJ^1$MOEk{q<4$%a zI?M)Jjk$i9!1kdm2?i9^x_8PS4!~a0w9#7V=KyTEwC~>1-;N4+)rlwj|BYK%gYZ|f z-{x<9z#e0B?RuR8W7~HDkwwHWMk6XV%W%h-vWZ;Zi&!!0ptndx___?+4OuLgg1&;5 zaYRPSkrBw)*T{yfTTH+Q_P*ItIGz(C8qlZcs69i&!2=24si~dm&Re?c_9LRvWMo?{ zx)W3cBKHb=!Hn6qpx&)ceZQ=nhFAO1c|>7aB at LZ+x)KwIy(Uv at 0L}{f;s4e_A-KEk zqC@h^YDl=gVI`MhrB?Cyu_M&#(e6!F!eUahRl5*-CL6iGm3Sm}Zj(_JHTMyR zhY}r7pJN|}85>yD7Pc#xVtTfv%W-DDYs;uj?Zzr#rblu+(fH!l3RL-tQ3zfKk9oh( z9tEl);F$$=FKR*`N(8VEcD(6BTfpUJH504bOLikR4Ln3vD1%`vSZ zsUvwE`vRWU zt at w_U)+-9XdqzQE{YyD~1>NixW4>8xd*xUkft zOdA+K^+n&nS4!Wo5z at 6xIv%-)Sj?OHE2dF>NX5QQLE<_mEbv{`Girm5&H%;paTZ%_ z8a;Z}6W_G`IR!p9kyBn0GCVod7j}8kJMcd4u=qU0&K~Y1=3f(9%?G#_`VVwuK>n8r z{eSV)tJwT)gs3m6zqPtrC`CY2LtbGlI!jU05-UYz5Ro|uGsgC76Xbl2bG_8lVE)HK z_v}|sh-Y+gQ}%wX-dnz>r&*l_AtYJj0e!vK at sv-t$7N@|-`Cx-)HhJ?V!_^kaAfjw z^??+qWYH1F4-7y}#STEdl>!hRphc;ixUY_SmyWTt-$HZ51yu&cin3u6+Wt8eZDAj> zYh7s2d at HkVo6ap4L$f}%?2>X^?k^Q*P+-YSvw4R*Mb9^WW5G*KML%o~NlU%HYKpy&guO`rAPo(?kKd;@AQPVC<3f2D2OkP47X=<TE{>$*pO zG at k``xyS~;j7ZNUAJSBeV5Ckqt~4gwR#(ZlbXR1{a%c5mvvnPwri*MtUxB-gZ1|v& z`5QgB24iaThGyFQCVdynxyxm9R%>H_ieni-wlEA(s&*l+LiwsyUy`)KtcN7wl%C)Zf z9VtM`>TK+S$ZpjxZU+^>3+mF!{U>#Q+IJ)ijA02__#5$FHJD&F**t(0x%o4MS_w|O zQ{xWyQBg}r!<9{OJyYebl{YcK?zCvs{24>7bhq7wJ^k&R%Ag}hQu#g5i98~Tke%3B}N~HBD-tjDL48wA37_JD!h+bXFZFP%MrIJMw0P{ zJFABA3fn(Df>t=vLq4f5g<-hNFqG_&Y>j-u!yfWMj*ui z`pVe}X~*)0)9*(xbZr%i9eDDU0e-!JASVKM49qR_Jle={N+D0XLo^A6ig$Z!CAx@> z^K6!W$}fKS8E^|d`$U-N78(dfn zK`MAau>}VSxnNxvAD|mxh|Y3Gfd$$qLhq66uBwQ+dNH?`4PuwWhQ~jJS2r;lx?mwN z at CHJ?RHV!AQxjt(VFN$BJ}Z`Bbl(vo+`Jb9_e=WWmvo~7(l0DZF!DzJId#@%_{R#W zEkW|M8t0(!ToNi#ZXbY0_%#+WS|$mW at tu=5;jvX}oJ5#>XY~%x*b5mmG2%bZqWhb^ zG;DiV=l}V)^X)&*H2hzE`NvGdNExU;dW7I@^G3~xM+gyZY)`P-9YJmP01P2(38t9_ zys2RDYk9-)oh6Tn=|Hya^AC3*^4OtJBa)zl37>Lj4GkIf!6`c{kCdRrEsF6j z$D@*VY&|1t2&=&;`iUV+#3?{li+J_mm4^}nzc~EVsjFGx(;9N!cZv#U(M;M#Rb0X^ zv9a48%w4U00uXcqB-bE|)Vmppk(r&kRq%iP(Dqs~8bqLP-$MWM4UR&8enjmYZ48|M z at ug7-c2@K9C__2xt}^Q)*vH+R#kRDr7nu>Lo7f^4I%9xS{52OMFT&>2!bx$bA2!9? zBg>Sbp}&EjhwMnQGc17vq{XxE-f20Gvoklmzg`|-_(79!pjzTY;Knr^*-)#@TMBoY z;<+SMlPWA)%6IYllUF^?Wi|}5x*2ph7{L|cymNnxgPF#}1Z(^#9km}Ig9+OQ223z5 zKLOd at W)f;p;xiPK)zM+xMx%!gIWHjZ5?;MD)E$VYyoqt&qkQQ~hq}Q~O+oS&yq?wDqDp_2tnMa(`QqpRMpqghWGg zj;$;>;A_E*e{G2j13#=ZAxVu2Su#6a($$Ef((l}lk^p(T=b4vh=7<6f at ZJ`I>lfL(u~yTlMceK`AJ>1!#N1Fq)^b} zFXk at j0N%cmZ=N3vHwZ$jfPGq$#+odSFQ(CBQub}^ZQu21D!aYERcepY0%+M>jQ~}J z{&Y&g(*QfP+1R_6w{k>31#LJlY`>71Z`!aAnUM; zB)VLRa^8Sn3+K}&4(J+q%o^L+5eMh9R-YWVoIIuudD{Knp2%{5R-*Wp`@=Noj_B$3 zY9JOPc-SZV=e_f8Vi9w_6yWpmylQuTj4|mN$KCY_XNNH9QX5JPXprXI8A4|tE;>!T za@*vSSb(n}_gWSI#n4d7L zNIVP{0>Ygtj-7VN(Vse>Xsc-o)9Ix-MX||%6^*ePY5fRwjT$@zz{AIp83KrbgEFH? z)cWrSLas$cMJl^??Nz1gXfoF^g+z7m5}Qp!L2S(a?#Se!%{cY=A?3s5 zw=0fdiQgrDA>)n`^cQdG)M;JXbbKjr at 0VUyKQqX{RmHD8+e(7Pky5WELv#X!F-~H+ z@}=q<+^O=lNENaGNxRIgc@)_!5tfHcN8!n%35PO*se3S3E_9kt8IvC(FGU(lgZ>yx zjrC-awZWjlXS0^fU!U3qTWSs zq1J!X`7X&Gt|$3S>ic7t;a=()3=VQd)xnv(+JYERmLchCPfBjSmqK>gmwn_yQ$w=)9% z$2%gv#4{Wzh;?O2?f*yGI|f(UXj`M{j_qW{wr$(CZQFJ_wr$&H$9BiI)8W_eKB%+b zQ+MBe?^kQBAM5$|RE;_29FxGRBSd)&wS3iBQJ!KM++3^umY+ivsU(|yP=y`iO|c}K zf&rG4Kf at p)-)_k-NlCE#3XxRnNq6yUJv~nL2S*+`O0PUu(!gAy?TcB2N}bt2E2SLW zUz-w+KI>{bT&sC~Q?-U#Bx;IPCwA7OK at y@Ub&mJ%1pVbfBY}WL{J((#%7BU{d?IaA z#8>#2Or|RA*57(6GSnM>29lPdwqQpsb?IEXg^%*nR?nl_(nq03Rcmzy*Q>8zws|=b zLR9b;QV&y%U!Dhwa!VYhcNLVPLVfFZ1FIHaJic4t!19%%$F1FpG9D;WLJqeri%{-R zbgF9+jI~HIY~ejLiE&A}5PaEAv3xdh%izYNkNO;OkGx&Pt%}cyWCi!b1Wf!ut_kkmWW?zOJ zvPg=wb`Siqz~KUdsWF^b78Df_GH_XGA6C$cAF7$%y3?+(d_d+V0M{|z4(4bL%`vRW zC7vP|t3{iVRYlc#IuuuIlvWkHqa`vMgV=CPTAMQ9Co*WWSgN}FL9N&f7xpWFs-Y_| zRQ{Xd%3IOC5*19HbL`w3V|Vosf at vr`_5Op}WJ{#?<5tFFKUYfBL!=!?kS%`7)xbEH>j!LE2?qDQ9coHqZ&iwm>L!j*|8vvovM zG+U?jZaMDpv1g#b$=%!i%d0w+3!7)Wp-ky`9?#uZ};Xp^M<-Tu43^=(_ z7=0v07C#u71KRe8Q(E7KGQ;)U at dc6e+_NdBA6bl_KH67ss2}1n`s^(Uj6h%Dj;N}+ znCxmu7rnp8E+jQ1MHX_-K;r;R4!Waze?{S^Ay3j-xN2b&Qk6=AJiGY4Rj^UC;X5cT zVur)OI|(gPi9-b`xS!l5ReTAKS#jeZ-y5oRDeXYQ7Q(@lPY+s*6fH^>a9r+8tIws| z;NOg*k__F2TnYi#4EVI(0OKQ0o at 7zcseRx!#X6X1PSjmS$ZL)I#e?QQU)RjdOuH?r z6-i}?dinWAVN~RRb!d$W at 2x7@0ZaG;y&Om{zrYWb2PI3lOLpuRzHn+~oLq9e+}c?8 zdzb;yOx)-sDhbhNPYacONXnWk7OH+(jeiV_HJ!d#_<2|!QijWt(gl=VLXe$;Qio*r zu4eLSnMvFhykc{7q69oCr0CoOS(bw*?N%t$p`lYVimWhH})Y4t7`={Vg2dXov(llyt0>uhcM*_t&lq-qS z9u%&`uVDMaP3u<87tUGXEqw8X;|kxL1!v&ME!F(?uno5AXGdr6 zoWHkAXo`hdIQ|JTfk1(PnEu78OG77TM*|~g31<^W17|x&VkKt-=l?qPp==}fC*1U< zJzuU#a$^NS+%B=kM?vu3Af~2IAc2;mPN4RscWa(bsA16=y-tV^pEG~Ch-J+2vVb9H zsFImpSaABQ8sKH;_xbt?+()TflD`ulLqc7drdnTMgi<+BWdT^Acu_a5vKoWfoQ*?$ z5gttHE2Yd~Al6g)$ptG&wHH6Auk5o8*~;_llpP1G(G=XK5fy}HhT*gx=fyP94ZCsk zLYSbn(DERd8)_iy03BoA>+z%2LBXW7N6kR|GNrQlCtOel7x{{=8g*zgn-97yjzcXK zbM+zgM`QBk4$coYMJFG#+6`OIU0yrS2hn7c^J|Qj`(`2EA(_}WnuSQg6+2XDA2!Td zP}XNS_mjw12jt;n8?m8J3x20$?d>0|7!7IFtHAn=OE6ZUsT(Q(n)E^x;T=pW~yZ z0HmW3*}yOBEhpja=7#hng^&Mm(I$@rNq>To5^#EDsl?VW5`OF34h4y7KmZB z=0DJzvn24qX#7xyCt8MFz0GBrEvFM7<~)@g;)GIf^44x}fGixAl8I#BjEH`3H0Y0v(FDfk9?3TD9nNO=bn5VD znDY-J-$|nJMhRy5LJ!6*sSs?pX4O{;A(x^fPDHPAnzFBtjIfrJSC>ZN3hpV=w*l#; z)j=BgR-fRu{ldVC*iQ4`=7oc^?|xi(&$EUnvtMGRio$=ss*xvn6fJ8e at UM3Ok|!^qs_Baq$9i#Mw_M*Sqdlj1ajeD&K&87`{G_ zc7Kw#E(ER%V`A>ML=s01j0DRHV&{A0N9)z%} zespN^PheIukfw!xFK+ at d%uBcEwof?(v<%QTV$VN`y?}RJyBp9l8}W at yuX_0TKPo_VV``}+M{+xx9bUvC(rYUCEKCz2?F<@TW&u&iQ at k2lKUT{!Qk zRJ>(nxQgTpy6dPz9R(#xc~n=CS7j(LxdCNM{-P=%@}1Zmb<{w&-U<%PI&Y^WSUe~* zYmOT*CA#G3H4<=+>zpnS%d^6udE}1~vh43wGE9}_LF&e{#n(n4;JOM-OQ6whhMOU} z;tUtrrAl<0?T317 at I|6})r9Xc-z^~y>39auQTcl}N5)JS-JUr6 zb}*W$ROhSS*ik8Po&mg22<2V}5_;2X)j4XxTp{*xQ%F%|jBUltfz3>YXd-SyXTM0k zc^8f+%4UOb(ur(vJR%55(Mu?7gGbc??lM3IgMvLq3bk1$jM4j$Wt at QwZsf4uipvW-T&7N5+(14&`Z z2BuoJeZq5c_YfTI99k1HmCT~;5+?Mc=iFhr=2^t}fd10s=bj>qY)Oiz9c$~NbEyxV zD!I?sIZlCX`BEm|MKW|T*W!M$XSFm=y-u0(1PSCTR-G%4X}jzO9A$|nj_C)=&iHBP z-l66K*0YVRi|b?$|C|{4D})F-`D-RhNKYxWkVALNWtvW}g9Xkl$rIM9~6z(H6>4iTM^I<0ae_ zrk7lk8RF;|s3-0NdDlo7S0LUm1lu?CgaO6CJ5c?KEqt5gi`)B4`No^Un;1`la8Jxg z;}|jjmh$isy2=3cocZWC?^4dA{8GKn_2;ZC=9)i&`2{3ZpRcy zdLSZX1Q8M}3CfN;q=?&udpMFpHj(r!LTMT0Kh5^hs6dD6kJa%6Toc>snji4~nI-fz=LS_kfPhe;{^iv( z5nC4$si0q9N)wnkD5ry!)1p(suPAyI6u2CE;7G9=35uXu7v zj2 at q#qTRZ1%=;SBo2C2kKUP1PbMm}c`7F!fW#TIFK&IrFyx?YXy7tLwZ+v^^qx%A( z|4|KM*p}Fbe??js?S@mU{A z_Wc|ScH8nrcJLX-!S?OZW5S#nAdA`(jYDLH;mSfLww0Vu0GdL676*Ly$U;1*Ii)ny9 at p-mVnb}y at YLoo_$Uvoq|#LC>!b) z7DYO<_T>@DjV(GsBwo3n0y$Q|npw3!T#ZTM!{1oLr{iG5B-WVzWTItC2XexqUpfC` z(Me^rT$5WY)@5`$IT~z+MiCNoA7|s9aGSNI`;skM?HA;!O!BlV3D#tI^jq|$ja95c zm&;VgafT~Pt_39I_dr8p!!D98YmF{Tbtl`UTBi-IO`3a~WZ~@?c_PUb&`J9ebexC+ zqCLL1P!Scbtq$Ynrr`-)-uqyJi=>uyg(c#_RiW*tNlv;9*u=AD(>Bp;ug&a6n^C4< z+5sLqx2vOQQ~K6DtrT*4fgwxLLbNt~?s$z7|6`EXU<<}>$M#t%b2^XwtqDwD{ef_` z&JVYTIoXK?s7qO1Km7Ws9?>1wYmO3ibZpsWDQ=nwNGrWR9fNFPzCJwfNbvhA zF{)XK4edr2*UBQ3gxmqvu&n~!?BfOW1EPoX7w<+XYF_kSQIkqPp-4(xA5OV`k|E?e zPe|6mLZ+s3#c0!fffTil1tf~MBtr*^q=3j_Zq7S&y%``yP?tz_>)YN;o`|mq at w-+d zrb2|edAVT6c-9Du_wq=V>SXRhuV^Zy-WVN|j+iCr$9MHOTU8`d&Inv_LY-t{{GUxC z4M_1dWrE(q1w)%-R9Wuc5Iin-Kp)>;`6(r4z}cI(`y18<80Uu>k?M$#Pj+l6Q&d!1 z+*2ZxIs3e_<5sjNQS4O7WqB=Y<+TH%kh7I`L=Gd(UGESsJme1M^hJ<4B*z9Fc_TN{ z$b!Gv3o4`y4*fyz5>8TYARj3_BMo5D$BJ9a#2BCc7RqpqT`}eT`M3DzNBsXrQvVs? z`us=XL$ueNMHBi7h>-TL%18M>Dj&>n%_K5;7Cc$d at H_cK0CxWW!fGES4Xu-&;iZ2KPbEDXee~Cu9fqF%dhuY zk^T7{onzL!mk8t$#KE&0)|1b)7mYasmiVMP3`QY(0ZxGw1Hop&6we%LlWc~0&QIU| z`3;j=AaoD at MDvHh|MK?2Ki=>^3p+|Wb_?_=2(D61ncl!n|uUXod|@0GXAki@<~d{7SAwwfzHXybi+YG-(!+1o$wpO5W;V7r{@ z!={jO*vED)AZH}qbqAoq=#!q4kQ}%UBnXj0hrhuq)%(p#B-<6K!VH%v&o=??v>v|+ zIO6eV*VMA-9H zFiUb5V9BKVbT0Ai5nY99gW8hLRDQ)C5=MoifiRfbhZbAGz${f#_TuT0SIY)ve)Oy~ zMDt*f+s>!)H>~-w1vH+G)-AI%@4r+hWFmX;AWNaTAG>7d$QtQ67pWW@<5{j4Vl4L- z{Tvg&D36yWF88ZVV%?mdE7#kWPtg0mDMwaPU1)Sio_Mxs+wX at E>Se;-Hdx1W&bC~l zIeN4RU^P9YSEilm<>N-`$+u0{D0VQio3yUe9IS*t!9_X2TqP5u%N}**^Ptt}fJ)oo z1%8XS*)DER1J&EbojPOyiYklK=|f6^G)d$VwtUXg8}r#RH5Bu-(8=kzt at 8e_gD5#t-WT9^g-|YN0bpXn%*p9= zr|WhOx1-P3k9{(KG~MXDXjA`kpoQQwER!TJDRbIpxnVOz3xn6W_=%*`(YFa4L6gxZ z;{0E#qPQ^gHIp$SYD`RXEfKRg at f3bNgj83;had=+ZzE&YVo}_wlU=rCtUq3tpPHiq zCCkD(@e?QXi9E>=WcS1HTT1C|R)!8lq%aYUOdlb$FB{t?hF$Lw{L5VJsDxeb?DVq5 z4TX-w%Wxv3il at dcHqkBv6jrNC*7 at AALo66LFilV0_7U+!Tw_STWq(hf`9;@wAToK8 z&aob6deUu0TrSD?WA82jW5V7<&%W9bc(wI|xXXrLdro+5`cXZ>^M1_;4-D``+Ef<~ z6(02>)k1~3Q&vQ?0=#&&HL?q@^Xx=K`@SgOPnZ!HYdj{+)8cbWM*)Y_wc7`Ywd$09 z-T7IRNmCOi$@7JrBka7>>^l+tAVG{dDESi1P)@&QiFBEwyRfwg3QN=0U>PR3Mh5;i zD)BmNCD{501ycXNQNZ+HD43B$VF38xab3WipM4*wn5aNxzacVEk0 at mT2}+Br5+Azg z*K%vokmRIEKgE2H>TG8cjZ2su^V&?&#?cc|wG!Jb< z-}{#Ts*Q2T3OQAL75{>7NHa;#Yv0Z|XzbQ52GMfKkA$gXa`21%eBwR(#LBd!lNGgt z%<*sq-FOF1MF1$j$0~ZVwV51he6rEjveDiAQhp-Mz*J at vJtX?si9^2JzCqo4fiI!F zlNgN+X`qdrcNq_|vGS)J0 at Bw{i0mZp~)vcN}4mhmwtqEH;E<7 zvPL;)XfGl9Syc0_u}u~anMzu0ZcF`y z=Tbn}CP$j7eE*grchDMR5xi at ZSX6wf5tX4cUUe$sk^6}81M=UR&(3QW+y1Z6!2Dlm zkdZ?XK&cvqZxK0|wx^iT7Qza3YzoU;e`_+S{c0F z=1e4?l4U~U2-cZ;CCr*r5w(JAs2$<`MGDI;<$p+ls+X4pxV82#*C6x9HI)428h$k? zWe)pTz5R!4sQKd>GADBWat-gY&-^7<(P?_J5QBR+ at _q!-U%A&s^cpY1_~(h*tAyMi z^z^bO4TVs{bFLz^jHkw*(}43}rDgkya>d^qXlBM;JhSV$AvBg=u5qPz-FIYG at 6fOF zQE6-R|L_ed&TlPhV*VBb=UUjzLooR+Mg(T;qrvWi;#8e)O)2d2JkLit z#~d^5$J%dOe14y>dEupuAlA}z^6|H at tRmErt0@kUT;A^Zds>hd7>YZ}sJGd{9vG5! zzT|?5b@)UWRd^9)5 at Ta&u*)upu_E3x^g44ns?s0rx5jRn1Pa at J7HpoeTu%WDb)Kw2 ziY_{xjcW}ZI-L`BB`jU8`KKOJDLQ!;8&1$~sw=eE0v&75?8=0YK^Mx**#+S$A09Sp z3xFccEr?P>*V=+h+jE%n8B!=DKa=KH?ftFIpT;otGS~i!vgR>XE3cP6okr?!G_PV0 z<>!3#++!AW)oQBwChb#!zs}ihm2}d{)g|vSRjp>u*ttak%bm(DG<$x)F^D*M6a8L4?Jm>Ej(J|^rT6`eXKiR-Fj1O)Bia8| zZ!Umo`5R^@!Jy1UWe6FJzHFa4cXu|r$oY33~Bsr?SV5%v&rg02arFS6U8Q6wL?dc&*o&YU$U|`|rXAS@{ zbztD_6z~ckOesVhm3`|=U>~K$pPE-Ug;pm!oTJ~ZRd~Ae(I)7WOov<@DAht*9w(%T zH}zyC=B()>72?8L_4}I)+&wj+O8jHFd*DDo%>S0<%G&+iZ2wB#|FyHxiYwj-guxXF z-y$=PbO%0sK#jt|5>rqJm=pww5tzIB5XUQs8dTyciPz-?{RaGX0C=(~zYj)8 at 2!xt zn~G{6VlZuWe`{&W>$?5;V(E4J>z5CZJ>0XRxDjm#(hMuIzpTJc}vxh&gn`t4Mx;aVtv`02W(7aUm;JJ*U0@^ z- at RJ8jTU=!nk$b$S2Hg{FQshA at S`!?x>7AJ|5Ug%E3sBVyH^{vVgbDE^@bcqm}AP! zcXV6z%^EDXip+rrso!BmZM6p{>xSVjT34L)lqSo4X*Q#BG73P&9gDV;KUWwu=MoFkgEBX_NJ35yvEjxzPcOBnFJdpw2j zF44Owp^-5g>IP{ipv6Q%RWS==r|eM}ux; zv=^9zYueAh-CBjmdV?W5C>O%#bUczqniR8aGYLAJ3;`qLqV~}_vEVagd9+0g-XiC< z7E5^?qD~z*U{&((SoN{tUm-(Q4a2vvKg7(znBw#s0mjGlvMuqhFa&;Bn>Ji&N}W$7 zh26VlIZ90hrVw*e2s~OZ$Ps&555qU#HTU3&_vi}0zfyo)7=qigexD|c9iZK at 2B~_A zM7+V!Q~;hY^G_WU)QDH?+c=5k*@$xE=v&y(CHS>SJK=0!j)j=M9Yh2q8ui8R6_dXw zX5Omu$@ES1&IG&^1_^~5{6}(LqX)LxA&_0*lgsNgQjQ at LCIe2f-KeG2u~r zqOXH~Ly-c90GbcK%Mw2F{j-t7%lZ&nf&c+kL;kx)E?{f?cOzHbR{Lwf`L8*F7JrIj znqsj${d-{bI+1$$B*mzHev16Lg5qpqBlYQqs7@@o4KloUva>?Eo`-xMF at XncIiE+m zn_7iy>lSDUd3-Nd-_3TXYq#EZH&(yTkMnCF(z;^7VI0&gb at ReGvdb|;1=d{3v1X!B zlJ*vC8S3b0a`pH`FDO+NbMNyCnkvqsu zM%Pr!%*+do=S*_rILYDQ^l`=%<)MQ)73rvNFtQ;b>QtbDnZaM;$ z`=g=za5${|0*{MaULE%%y9X3DQ!m^MldND~m5UyL3$|%&Bam)e zWV5gyOiv$)Rb(h(6c|M>$jTF6Z)L7*m)l}Um6{kxdukjP9ytz;i7nAv0X5mIznY?5 z?VBwC&a;CDfeX_8 at cT#}XaZr0HRD&EbJ at j(?cinq`WN=2rVPHU9{$KK{UD z%mMAM^yoZG8p07O(LVkb&QM;vYx6L1lpl(lrB;`}i&$gj4l_OLmt_Wv5pCWUdJYu{ zV^qqe2b%~mVBdDfZLJ8^K!Y=Zw;*Fll3&KZNe+w*l^Hvbwn!U+(EJn*!`eg;E~JME3Ju`uDJ*oS0wHe?8(v{CeC@!R8VV>vs>Y}P#Mr_yroI0-3cI+SO|Ayym`y=Y=GnOY^3`@E_gct<)M#fy?Dj|zRp45ZY=S1tiUhkx*rDGFZ|nn;Gqeva`>bfn(AcL{B^JHY?HiBv zw|)cfPUp+x6>~dcStL2tA99=jB=p=N3P4+bM}XS!AHm)IzHd;5$#WgghaqbRu%!D{ z3*B78f@&$jj5k{;KerbO{{xCG+%0HQay6(|z^g8dDI!M4`7^La^TlqCI6lu5-As>l zR-RXQP#+mKh-FkK59OWyMg_t=yqL*LzZUbtWRSl2K*pZI`=B%%dukU=gZ%~(Ixq^1 zj3ai#_lx1zZA3KxXFg`h6Y1kgQCG6 zYjxJ&lq9tz|3O_H^5upSb19lICH^6zTFpe3pWrysQYG_0^8n-{o^)+OFDcDPeg#Kn%HSVo2glttoxv|B*mKetYbwll%$xFF7 z3$=lqaKiAsL;a*!vC1(x^B8y-&Td9Y# zP1tj0CQx8!U6qptK`IPp-$^qnQm5BzPD}|W2bSB<0a8CG;SHmf0k_qQO?4`y% zTK5yCdwdbs?`$3e6pub#a)AcJ8KN(dw=f0f_y6yoB0$lr#h at M5_Hv8xF0gHy8y-nhL{wwO8!tfyFbB9Q3gd?GK{18q=2^ zoJdoYHwN%2y0d5x00zg8?6oT~jxy}YEmE?ILXno4A-t>dstj-#nUpY1#VpF(sj^ssMEDAdm{myv)@%fle6oV!^@1VkXnvR_=BSf z=#qoaW2EKeQ(zUKzQXE3Gi^EAcQ3vu4~5B#uOBOb2Q3@=p)<(A?DAFL0Td+ zYLw~A&cR~$TRbc{g&qNazEfL>7#k{Z2`3OfBAzWhuo9k5%7yb5YoH7+x+=h{ieNR) z_FHEWY3S)-5wTxy-&*R^tktDJt;mLn&odW9!(8y@=g5ZPb~DC(BF^D71YXkymJopd>z-Gm_pRRKV%!gb)-ir9PM)d7+o{t9TS+3h^u$dz9Bdz z(9X_ at 0BiGvP^*y%wWpg8w+z#Sbju-jhRs*n+YscQbMQl#l%}np at mbK+p`lN+jw^b% z+bfO>8vO?Tk-nYJD`0nov6wmEmu6SwsBa zr1o}e8C2;~eJU?i;PFE at BoZyv$6UEBp!fMi9n$MX&D^cUfqJev=Gs+!5h)(I#0J0Mt=JAy3V%X0zA|-vdG4#l;L$kE z)g3;EtpimVy$b8_ic~Z4r09&{?oc8?0Tq?;scVRleIqsYN?rBaum+fG*zRJqO*?LD z7b6>10dRlVo*Y)nE-Jut;SwmFQOJ5kx9~&oL+^)qNO+ at sEt<&)PA^0~r14 z*qzsy%l2B_Ig0GQ2xs}Dz$r4Q_L1c*6d;T+9z>z(R1u=)l)7VV%Me3gM4eWIN^W1 z8V)j>7?A&ABB?)d6iaB1^AS*W2}|uBZQ=s`BjV4|G4Fv|En_R~NXXFpQP0o-OTHyI zb#?)`DNfS+>U}Yat2ucSX6+F+=K!s7CK$YAV3$XuNet1LIdDJw zav!tUhvMCmN`fku(5TZV0?XV=f9IZIziV2bdAz}go(o|RofFdZ1fTpg`F1R>+{xR^LuQ#Zu%qfgNX*vo>KKw~nCy3z1 at GV!|7mjr7c89VO~ zr%x^hjJzM%oLI0ko&(a;3uji^5cX=oo5D|Y!cJV_-B1RoV;hebK-z at CQutfnQz3Q_ z)_Ao;Rhd(WNj9l1A|u;^Hw46}*6nyRmLDKzMd36=KluFX4+ozi zj%uQK_lSnI1#bX~p_5&{yoTf1Rp=}OI-f2B&Xp6d_#5KXfVg8ITAaPLhj}5o^eOfa zWeKYRxgS?T{7>K7$D6`_3FvHza3`UWvc zg=8|^qYhn+TE>bN5IMh&Zc4k$O0DC1dKF6fRpgg<3BF#=gjO}p{@Tn}v2bjg0wlpn zKP7!N(f*uu{O9BJeC?Oh4MZRO8=J8$UI^ESBid-7k4!_-_9$+MhURmz&jvX6Fm6~K zEYY*45WbW#Z8;MII2WtUN?#RU#pU3&qi=59q at 9#Ttb at gBGhTq6Ixf4}ss`q~2Z{Zc zC$A#rVX}9gw-%?E?Hc!*W_(~17L~wHI9GttjP8k8<;D%!hT&|{3B97D%aRAN zz2WnZ(-0FC*sv(Qcp^EmMOR|`E88vDOH>v!a8?G>B04qYvUjYS^AJYjQJBL=@%wy| zOhK!PEB1AYj4|qQ{c-`L75;j`=_PoVQxHTQ#-c?n^`qw5Ojw_d>QikLx8L(|a9C|* z&LcIgWM at Fqa3ajaxVm$LaeX1crx25^i4CH`#U+tvbG~k|8<;xz_0zlK$$$ z;MruOH`{~umT=PyXLW!XmErF5kC*^3_x<#E_ETZ7YG&y-a at o*O=Jjeux-dsLwemLF z)9RX{q{(QjK>w{82>SYTA7rvb0s8$IULI26w88)N>&dH?Yls4|!UksNrC{EJEg(U+NEsU=(ipTMN3MlMo&Y^3@ zWH0Qbvq1~&5i4zcsF!j?Q}HeXw=$AP9AxarQd;6kKjr2gk;eJrJ*73!Jvnf9Vd?{l zUSPNO+zJ9ziEy$+{2m~VjV7VBGqbP~a!SzA+dZLy8IHmjOj{m6%I`?$vF1o%Qu4Wl{DDAH}q|M118M5c>%Tf?n!fI~n6y6R5E_K{g`J7}P+Cv0E3s#iq>aUO>@^P6S!_(y?+O zhNaLZw=(y7HT&6kR+DV>lsM2xR_J!eo-c}zoW27M&T$VYe-CpvOZtla?j3!PNCSDN z)z5Ko17~)?^!G`UW8~gtmOp|B_m3dr`}dMLPEHnPwtwAN5_Pn*`QNl6hpmF*d(|^_ z<*JEBt-qmcE=6_GB7Ixj!><5UY+LMKEb>PkT`_8anVH#}qEUPe@#X2g_LHJUla`Ra z_GhG}l`-7*0&=;yboAXIhh&~|xXh+`W;kXzj;9y=df&eFK}c#8F(iwS)tEB;u)_Q` zF0V967;rB6Q4 at -VY1%lpV~Ob`IbE50UF at L5Lro6e%DlN;SGMaDV7!)sh4np~iONw1 zv&ETmq=?4HPZ_^aUj-Xuky~lU{Qj-}on6MU=Tu`}mzihVF?(Z};+uoc&P~zzOMr8r zh{ehzaX~J><)mYke%2?L7El-(C{p4T(j2EL^=MYLid2c4REo7_hv_Dx1M%DoHU)Bj z!y)v8>`PB%QisJ%^|aSff=bFa*oT7sG~JV5MY|``Yt@*jE7hwd{WeQ3(FqSSg$_e_ ztAprHmuol!K}%)^4=o1;V+yClhi4TZc|I*}ztG>G+2NaGVQV1;=Y}W zKa&k4o`+hK|5(egsSG|P#A$;LFylZ?UY~`F>qtSXfBX|JAXFULHIe%Hb4CY)j4X?R zOyiDe at Az7^yyak9jlRE_>sYmq2(E4~izd0d_E&qDIISzXT(6GcsXiIg6ttXFEsbvt zm(P)A*!cSFuOAD{<@+YjxU?N)WZ<>v0 at mveudifr$Zi8Qugu#j_l3NN at -pt`98k76 zc}L=6?%VQqajEWlNBz6kwJ)exCUhBjbP0w_Zopi;1K&7_X>T?0KP%gcj1Yvn*fOX{ zW_$JIFPdFd5ZRslpCFFIU|H%~ZPr{;s>+l-J=UoGIM2Z`2R%pTKh zaDoTjAZK58kji98##R5ItZoB zDAh>?pH6`?v+4U<@DqL0+QwH{_QL~Q72ixJBy0$knMM#-r zEKc_exbM9s15*K)_ofGyl!g?^bk+jgmUs6~K|sYGM`R*=TL$(N(T34vND82IM%+nu zyEZ?Cn$mZ^B4Z_Bf?-D0D=@MI&}x+kQ$PRKAmoxGg7(*4>zRK$MI&MRze-42O4uSO zpPuNhDJI`1LgV=5B?R|$#Yu&`OyU_ekQxyoz#2$z*E=_8g9c%yCpCx2zJlRD!?@EZ zLFrUfy&v_|i+kL?6ehqY?wqgbFB&p|yiTt;d|tiv{CuV#p1*uPX#6D>kxu%lAhAc9 zK_c5~c9(D)CLar+?=jJsH)n4$vU({pNnj at +PukE%Y1UGW?>(_wP5i_Lbztqx-4h9p zoLWh}L-X5JJ_*>)dMq$NM;nBP*>JdKW*d!{t*=&e`sp|4EI7G at d?n=CNLwWb9>-iO z*(dsHn6N3?TaKMJ=o~6(I}p7gJl30J{6YguxP;6kVRS%CCEGrnN@&o|tW0)k?;Au? z7PFKH=w;&`umPR#s0&6XH0x0{Wf`bfi3)V5jrW$Oe2lclPM0YW zy6~ns$WP{5ud|cxx{z~=S-zld&N-4$!F*rHpE#7DXN zSMSb?qD&}Lwq&Og#Rx_Cj10!!P|hF9I$a{Tpp3}1r3-#qhj5;{zPsixTf#GPzQ+~? z31SztktBsvS!M977Nd_we8nw2R(N~|FflZIX4+vwi#!b*=H0;j(}0lwE7&tKCg9 at u zWZEZ09pw4A at UAqFcotgb(I*_-Ig~#Y?G3d1Lha;&?V)}3f~fs^_MQUF34V@=&O&b14>{s($V00E z1>Ue-^pVReuaq|No%om~$V_vcr8^Ivr-U!vtX?7IVAR<_$zGAF zVrEFw_uHz1`A#8X(#s1y&>A-H?_%>@VxI7xG?NpoP5NJ(CF;N->sSa1XSq>p}%CpcbYqE!ZSp=` z_1VpzCSPM|HAykm%7LS zI=7tME&iw_QiS8zsVJ1xmiV3%>cqUYNTe5~>cUC9*{g%zbkE69kSur7!W(6e at +~Ux zhB1IjExV)sh}|lM-dxkox^RHUfV#cFRJENh5=Lj at C}Zj)lnOxG#3QenP9wWO at x(Kj z-l{Rfc2Qx+$+~uWX)Q^`H0*uAybrl at uv}r!v)r$`%BmtlNK?S(QV2AOwLOp=7()&t=6 zIP0}!KYd;bJ61re&SrO7WAh$FL&pYs4vTLL at s_cT?`8SO3TP$vL at 5E+p=Um)gZ?;7 zu86oH$j(+%3kG=Y4(ux)3$1k}nkyMr;W4T`EJ=-)!)DD;JPzxpbqbh8DiR-a+aaj7 zQ*KN4PcWg=vgc(NkK_7I*bTOG!=(r5J%@D88fCy&7IF(4}AnLL)PI4xlh zX|P=g$9R=;O4~|i`r=#1sp=BJnT6=GlKrf6^kLrVR4$?E!i4N#b)<(9n)@|w9i&CA z0gPGki|BAGW)E=koO!1^CK$tzeFtnMW++2}!FO#aA(4>XpL1u at gC+pXnt&^&MQx}? z*o6v6H6chmtFi*ot+-;n7+(J=V?_oWVdTLzA!0^y8Op%h)(ushPE%3PT9p-%$GL+2 z2}Uz^Klx+a#d@=K!F<+|nSi>}67bZ3qL=ll_L0(5Fo&aERd?I8C9_Or{Pbk^h z3`VqCx%o4mtb)f=eICi$Qo{3)19l7FdV-;BKR#ZW1Rr56KS4QByZBQBF98~ouL`f4soQ=T)RCfA}@$%R- zLlzXjX_gf#d%KhZB&QseXom1E>kXO*-qnHnVY4$xdYg- at b{}+t7m3UL`MD&{$S!!Y zIe0RJfGKZ7H&)P*GdGEC={`iKu2cq2DL{yaIpS1_0U0$XaxL%Xz#5M2ZdVlgs8p z$5gNR;-s4{Jz}5i>IEN9tk+7wq+ at oq_tu{+B&&I3v!Wrs#5w0wvh3<{J&pJy(H_&) zr${>u*@DFu^Z(gE;85Q7UDG#qnH%3VUK6Q*hc{UHR-I%tbtcK|Ck7~paj;F_grj&R zHm%yC3YTy*N*VGzAqbr#vCxKQY|?1gfd at gu9Xq0|bRCs at 1*#7{=%DoC{{D*xKD6hwdb;n^PyP})IuqFO`FvD=rqE at g8#&!(Gg)mmUhB`)wd*$ev8xl0osZgn zaoH_>9G1_}BH6 at YIiQiUg3<=bv(K?w%*K*4FbRjcTsqVR2d=uxv%Ft4#{1row&bl1 z0 at j4u79Q8LcwpW#wT-$Qr}pQSU`}zg6fnA`elI$>`Uddkr~Nw*NnY26(=+UWQyY9R zkDJ2?Pl9D8*&6|oqN1w*eNa|<=}=?PP}6{1szjqEcD~dzJ at z#71^|N#26qJj|N4z$_ zV|bT;9rJlZGP%bqy=t*%AK6 at wse4v&|jX+TI*}GG_R93!b$w`EjT-`t?LJpJN1sE{F&g zITksEAe0A7$Rb35kgp}=1;R!i8xo?_;lvvOYfWIO(5M*UHOh!^6W#&;Hj7;^Nj*kV zI?offW)x&+te$149v;7?;Q~iKcx3^wwSg`X74#=)4H}&+!gs`yiY#2Wpfx=hAwsI2 zEC29%X~zD at Os~?R05O3NhK=?Od8J}$KK0^UGEZB@)F!E0kNwVov6O<~oiq+n_1XAMME(NjloZXQBgZ`0_vt6}XW#_^eS z_@@!eF~eMEunFWL#}@H6D*rAgu;e at L+n9laGCVN8D~r^R7G^8c9;9eNq3$sF7-8w; zn(*#_YlT|!y9+G-CprZBk79rS<@Ee-vW5mtI5prtU}CF)Tp={w at E{7w#e$Y%Xx8Py z_B$W~>Fk4n5|*i1pDEwE*F)%EBE&>w#({4K4mAaSW>SX!_7&yPHTIRR33^-P&HB zxDx0;F?A`c($}1^F74CD#j$8Q&{i at C9765~OF{{9SDc)Ir8ZV{4#c+|8*23V$30eD z6Mkt6f?S!!@tkaQ$CRPYX^mTo`Ps*SfVbZqRmaVj>-#78esdy=vue2yC0n%N5xVf)(p9nF=NMKf|68vc^8_ z*DW%#!B83)FSRlHO~qi^eG0cPy1`+9!KvRa)Ls at b!C)(xuTGx_m~R>|T))0r3d^>Y z)T&vIkyC3aPGaH3ccRf4cC!EpMM{Y27 at XYp##=}!4WN*#^U^!VA*!&Wwpi7Ql$hT9w0=UI=#qU0(6B;;z6b0(-W^d~tSFDH&nalI+eQ*m zYfU9h|G!q4r#G9P-jbaYS-W^ zJ%iCgQd66be``uazb4>ZU==cbbqcNn^(K)QhP`0sBB{wf=qWG$W5^o7h3iw?B#*O7 z>CKxZ&jJ;aXrrbaRZv#bb^rH^g^BOE>Wh&TQ~q!~;!9QkdNZns?4+OK_s at A{@)GIb z347Qd{Ycr`I)U48XoA+tY8=*XIeo^aO5P5h!DBaDj+7(o9pwqaG{~!6h0aZc>3L`E zYtV2bJum7>7(hMB%su at 6F1!hUkag^rDqp3kYvdu0p1h at R!iVOUSKOBW_R71V4rFY#z(2%hIz1AK5801aMmndQl?CvX^O#^L6*bZz#_bgfCgpw(=YvI zpEW2dxlXIwdO)kWGET}$|2MAeK7M5GZZ at MX5&D%O)`3fY_4LTH-3)9 at 2WfL^eUS`1 zX^%2`icwXG+KS>rf<0Xhxdl=}FO|*9iJ9d+-Wi;Z%*|Z1)K1pqPY}kG at Ng?!#iXP$ zpOza&E>yJk5gg4V at y8~iYsN^(M1dQEcxx!#K__<+f&X>K61?~-9CU+bR~~d^ru7O1 z3?gJLEtjDw8r$*g?SLpjVLeu0!B3(iEU~@p1e_v!8dbU6G3I?eLXS8Pv$Hh+yb&() zSk|y(w+mI4DRR_Qo|cSs0}Eao-W9f7Rl-yH0L}dz9{P_J9~Zq;+vAUVEv%Twj5#bf z16ABaWi4J(XLCdnoQ-9`vC?2vbX6)dcElN`XZ+&%O}thEN9x8v2HR#ybIROG>RJ<~ z)vqxtuWa at +-qzL)wZ&q_b+{NpWza})A?cFocm1P`xms5T z-4s(GC?%r8E6*#_xa^ANbbj2;3VVSwq8r at 7QJ~uFN%1~t_Ez6d=k38!#L`~8S*5S0 zNILa&;qtnKL$CLqNCJH`zx>B^1P%fOMh at Zd%@B`kW?;b)UQrEnXLKTd?S!~ggFN|m1j}w79`HPfg@*nl?Pos74!6?iPEuGlo(8wR^#E9Y5{;q| zZ<9M99*imug(G0U&{HxVWVZ>@RI)!;o75f#ul+8Ek#mm%dXevR_%%EfGw;F)fqP*O zUf+U$3qahX{Y4wfyHES|H?o)M&ojthf+2xBg~*VG%DLPn`~X*CI){F7X(fJ)gwN7y zdK?}kd;(71HisX2fZTE2KgboW1AY|UgjQZkm4}|<-3+F;akBqK)C4qy<_Q5W_BL*q z((}+SSluNi?=r98yejTIJ|md|B8(dpm7+*=1v4 z;>18V$s`pwNdfn`@%l?mZQ0k#`Z4=jnkvI}J<$Mf$mcj3Jl23=PTpnFwxwC!YDhc; z=>)S%a{`v28KWpjgYRNp-T~R0*;_q~KL3E0jrvdUUz at 2Jci!N?!CWAs^J25wt|k=J zawo?pP`|Q8j=fZKn2u!|1 at Jp%`v|T|E%2YW1$%db*F-31pM)!31lO5RrKey^MnI1N z8Hz971yBT(vzgFjvHUm(l$}s9NvrZijIyyc$DAn$*+yX|HuDN?eLX?Bz^H&poZ{DS ztcH9aC9{R8tRPOjOi}#K-}$)w$G`K!Kt0`od2g{>_7M-%zyiv_zIYit2f=@`iQi5) z?l>|x2wV2zkbJ at U(zNe1ctbuMZJ9Hf?vOP9{;k$r4KMw}l| zNd?Z2yWhQT**e5_*kx|Xy1O_8Zo7%!JZ2Vrq!@0eU!U|7syk2ne3->+_RdQ!1=_?uvGvI<_!62N*AFv?2H$q01_hDDEH>a+mV^ zUMnHoVDxO@^e(Wzg at T4KvmVg0``|5oI#8eLU2_BcqS#pqcH3y$01+dQ-Uax-$tG?~ zT3X?)`XQK@)d>7AC_YyuFBhKJ(7s&yMqUn!t_z)!6y3)bikfnN_2QrOr4o`>zm{*j zyx at _$FzRRmy9Pq1to6oP*T-5hNus{yOu5dwWN at -)*I3rL at A{B4 at nqXJ`RCu7w!Uy@}@3 zk*^#Ou5p2I!6~VCIZhuBp)t<_@>fn23b(H}0cyS_B7g;XV6m^a0BRoPXje7F5&kU< zgGd+lFO at jdYG6Pfa$ya^k1t6G9S`V#H!UiIuOPR81OmcF{EreBDz45}_7*Pxk2bLi z?kT!IhMs!(FqSct<^Xbp$t1C8y-L!`kbK~tC<5?mVOzR>gJhJZ&W4&g4Q}TutKt=D zcPHl6kkoa{-??JB4`9h{_MDxC at mG1C>!!tX)6zWdoWFq`vz^+cj50YD7HfX5U8j7f zUb(N?Cf$#Dd0%*a`dui1pa>-S5adBqEW0;LEW*K2GhgE9U%4oVYP_XGB&fpb0E`h< z=K(u$0R0u5qjEMMx;W~Cu^QCiZ>l0n{#^UtWCy8+QEFO8+;r*|qA#*ojhr+Dr>4Hj z!gog7bJrp$zW02GC||+m>Pd5~)wmmy?TjT_CKsx?si{URMJJzE at Ig_W6c$O=%jtMT7(#-3 z3t)vzD(R%I)rf8M@^`PHY5nPg3cpYaLD0}GLv6JMR(4?d-crn1Zy$VY6! zXb+_cGMA^GgA2$z&f{7Ts*}o6UG|BVq#aZ#Rs7agiyze?607E at ZHpU=X47Mqep&0? zDT-uG4(>slss$DKGwKbs(q!mf^EbyO(TfDDt&2tCHe^cD2$n4y8pp}>3Ow1Or4t>Q z5%n!O>W|*+dM&gpWgFEz+ZSb?^K#&l5d% zzC{Mr9oSqls%k=&)lIfh9^%6EL^x2rv16d)iD>te>89Qn2BkTQ^-s1D8;$A+;CU#;b2y)_E5lqM{1f2c6CXrC;FTWOF_cR*_NF1)M;o2DXUVE#%>&A zO1*0fOb#25Ko3_yi1f(v2$oq>-t<&O_Xm9rH$m(k+W)@U2MldOH81If3EY3s5fNyj76L=N zKKc>oCLBjn7 at hco7n~g8Rm-ff92wLB>Y?Nw`&V zhi|#>Bk+aL4WnFt;Z`eNO)&6 at -I=2(@EbHlTVc}&pdZ*q1&nw$%e;qIFpK&DvY1OT z1Pk_pS77j~8nbfF<1gVH;YdG>t5vcFItm)z8S)R?RjjUiU1LfA4+|w~&ln8OBF!2~ zyDFW$(6ON_KXVONL?$`dxtXn<75Q;3defbl|76=?%}SpFC}a?{ zK at -WD&OnQ0-4=B#g!b{3TGQeZ@=;k=(2DxHz$T4B at B2-q(%YOrs2wVPzuA at +stu6N zdzUP>zOjHlQAyf5#HuIDF4_8R!pSRB$Ypg1;oXVB@$3uXgTN`_zE=;!0lfF$HRK1U zu^GPFiB}v1t_Qww7tfF?Zt=!@p(mA|U`pm&|C6PAN{Dw%(F_#Cd2*GlLC-0>WP^Df z-N|AS`&Jb^heAE!)<<2TQK8*}nKLz81=pU4Yqzu7E`6cz?6{QsIMK4ap$Z=p53}a* zz3f}_0g2vnM47X$X8RrDY6Hbc17n^=iF+IOH3z60JNCm{#z+smjtCgq1$i!43a1d7 z2#b&V5D^aPjX~Y_yW-6m68YX(_3`g0Ceh^3&4f+{rFswZ?{%2To9Eps*MQ!Ud82N- z7>k&%N|od845Wa3q<~_i0OAUPq!|NGg#fbY-ulZQ1k~GFWa9$rAz`&}kk}64?13f2`xES~@#;{Hw|9-%j=FIxd^4 zNPmwwl?tg_x#c#JWfoIM>Sg4VYwMwl3rdK{rIJ|FKtfTqoRTM$Iw zr;^i(WmSq zZ at bCSUD2!PPe$4!a0V9Wy8U=*C+K6Eib$hs*ikSW^{!Bpno5rF4r87wLLBsyo-#rp ztL^KXx{tANT(NsGn+Upm>DK_ zr-In8EAScv6SX=HFavElZJl(7&-8ijG z{zh^m%8Xq at 9aWSJ5G{b^ikoFu~5|_8p{tJ1A8zE5QT&Dnb z11!o#4aW=}t;Oh=NV})ZA_w1K3*~N$SCJ)C-BtXks=XI$;@H|?$uT6Bc9(orNRo@$ zB#ZP%;XaNj-z1*;0^c at vEA6I<(Ay!%p*lbjHVOJ`KABYKE3^lZ!3cEKGamUrUih^=+3}tBG<_L0dR>d z8udFLaL(Pvp;Nv#9x4GO4M~|;Ayl;-w?PD2U%tF&ug)vW53*oHd5dcVp3!SH zJds{FIWgdlNH(MhQ84g_YAXir*z0o6Kw#+am at M((Bu)wwz0g470Ia?FnToZ(7-=-6 zJEu{jRByvno@}XtsOudwhBF z%TqdIPSkPhPw<%0U=RC;qzX3g>w}#D>w&iAMjDg3r06rxkNC5qTd2P_BGIpOmN at 5B zB2}U`F4m9>8l*#aP~WXk$G-?l0+u=YOgwelR4y0FKt1T=-J(}^mI%BTD(r^%0TZjG zw at AIS^O<1UkTrs- at y?t!gfPMszP;21^t at zHPFCr~>G>y%Cq5+0-H*jGkv-wa?x81(K_>;J)N=Aq*u1z; zE1a2Nf=*SXBx zkE>e&6_3lA7ng^Rpd$v6Fvaoq(1R{PlAz#Ds!dy7sSOMZ-%Q3)?b2O|}P;jn=mFB)`>F z%hG-UWBesO+zM33*s*6OblAz7y7Kq!?gq6qniYdk!(^{SXu-2(IigQipC=P3-N9m9 z!*^l8Uh$Eh++2614CY~af~IPEu?uY#)je0p3FatVoX-$ zy7V%ikQj;f9jD61nGPdP);*Vm(0=Qx8mqLx#`|Km;#o5S5^2m8-nJe+)OjQybfU%% z-sEWPOVUHHQ~j#RksT_c{1ufQtOrqf+%golFFNjVmqY!(!Ltl|mo=KV}+oMn)!@vM*(*%`vQq_)}9oLaz`qa_YLBcp7 z-4NtTP(%4k-V8~EF|9F3eII$GG!gLMs4kyuAZgV<(ZfF<)Bmr<`M1;4zdfzqFl!3= zf?zp_v3P?i+mJAGf7OV{NugR+!p5BpfO=9oi8@~Mo}Bh)-M)7S097+8E5bk%aRFp< z9#^=@qgz*SEgW3%*W zGHRfHMZ52~bi0#_$A&x&uFSj%6E-A10vLaAGvvY723j|W!!Pq`I)ihk0$qu*KiZmp zApXzH_b81G{Got=DpCKVX8Zp)^Z&gYH9rmTmeGF@>a at r~iI5V1Guawj8wTnz&HLM0 zQlltN2@``67uO(k4mON4ikMqS853&P*j-OLSO zF6d?d-dW!^!gS|28Vt+ux#fE0?K#c%xw-oM>3oCuP5&h$gd6+mDBLf_OL~aP at 2e~X z&QEr at 2xH1iOAx2}c#jQERR2{Df*v>iRvo0xOHY}XbngXzc?ZtqC2advh~+2MpLUOq zZGfIcQFYJ8dpx*`?hCq$M%+V&m6v*NhrNqDXn~eJ&eF*OhzRzH z7}|kp+I2P<7c$K-&PjJT3d4Qh7M=IzSf}Zyb at o+(SO>)>fEt$vyWSh`Bo0Da4q95V z*$qgQJcEYrNjNWVT;;ZxE@!URlx-zr4U4mM(WX2fiiy{Z%BojfE4facTN7YhLM2E) zYp2skLCmo6reoQ+EM+OhmeLz&sc5Ufz7K1X5+PhE zbJgJ>>9C37NOClZCDqA;!Cz=DBFGS~k~m;eaY)fbIPUoZMV at D$I?0+DHM27dS?yt+r!% zK&FEiTWZAy)kRsbmP>t|AUr}o4m*&KYqcSU+&>lrk at j!w^kNrpQa(0nkA=kQ&`Zi} z2Axz0rDtR>UWAO&B;kyf(#=Qpcow7N#88C>I?zufDJ_N`Txd-&7mcjPQ(hd0GNFfQ zY0S at v5G-g}SS!e$6t`SmvuufG9d5Sb9oEO!tKBYP$znqy&;=u&FNZ578LK)D&9~M` z_D|G8O=N?P{@}Ps$^u`uISPsnX2haSv at C1OIvu+wh6#FA(RgdA!9l%U9aR at ee9DVH zX;Ii`EFH*rhK<%Pll1cW94Q9jF}Y6T<)r*+Z^p8&bz6Q>?q)|nHkEB$kJoaAaI at Hm z^bXV3mnyc}YHm*-a@|9pwKCpNUQ+C*wY7^p*Y~62FmbWbp%Q61K?` zJ%EJK=+QYuv8OC2^#OY8AQ2~DO-81%l6d;tHuj;-AS_g`HLR6wBE^*6 at 2VSo-UcD2 z8~hCpqdDS*UT2&O=_h}K1t3_ACg4fUCPK=kK(W8%VUihqD*xej1yhs#HN2$n))N6A zrbhdlemlkoD_HrMs*O!pv#<^-6_)x&6j9-2!B6N{@`;GKw at YeOAx88r79nE@qF#bUf z8zguFkr2Emp~iH(N#TnApb|=FweXiLsi_e*pzR?yG|9wAPhc2(gtiJsHaszwp3oP> z+9MG^Ei(Am$90FLXf1>fK;MGj(;#zA?K~rc8nrzXeRk&jS9g8zNa_iWDV~X1cW5j7 zR?gYPvyVsK7&V>0V4m53sBDyVqveEIE51?*anS$@BJ!0-r9t at -|QKzgw at EipshsrFM zsGb?=y~5F_Qr&_VHm>J|Vc+iDJmX!+PM1?{e*nr0?FnqW-Od5I`^yK)d&i>fmpiEt zAr}r(1vYt-cRHXJFJ{c%7BHQ~EcCP5OUO?Rc(4pAD_K(+t&(0 at eZ9fcU8DGpQEhMs zWz|pXe-PN{w|>X1=S+{r)1X^QuI_0(R6uKwTpSZLQ z%1tr*##1Yv7O61vgB}0;pHRjk|FgH{AB3$0_8$@U|3)zXDugIn8ri!#*eRQtn>m}= zoBVs=O+`-uM+l7%w2B6;Ut6XZt-b{w>Rf#jk|qQb)tAU$$cu1=DtbL<*sN9Rvo4d> z?jTqoU!d|FU$JmFo<1Xt>vbl_XO at rU^)+vj258eWsn4ZL(ioviO4x?nnS4d=2>YZ; zc|3o_QPDE{kzvcZ?Lu23$HfRT1#sQ2zWUe^`vH35D010B<6UUO zuoR`R5>*R!wBM~PqbZJZ#NgaDRBs6hb}DY}bPoG#NlRUh_*@bw0P#oZvTamtul+C) z9RMC+3da2j76536m5VZ>@TP%V at AU0`ao`Nd4zz7vu3VzD%612cs<@*g3gu&|#jNY%7pSiy3FzdKWlEbu57#m9c)PV{+6d44~+j8XB{NYIw>yAnCCJ zww~0nq>(oaJu%hHjqlP>5J=E~q`WMX4v zVMb?VZ|?BF)?QAI4-xnuc6E8FsAT<2+Z-7#jfC>u7CqU(LF3^wV4(5_?4PVjY8>gs z at W_91-?a at 4Hy@59R!+mpQ9EXwi#-W*jXEqL-DY8W`vJ+FBy6D<&OzlMXYZamN<5Rq zA at 3a8|8?DN`GNl&$t=C at k{ZXN&zUf=G43|uLtRZsEk>=0F; zg%%AVCXw~_lB;@`33ndjmR>hkmFm4vQ+LZ0gzBE)S7cFl>l9=Z-WWX*gt{;3b?Yvw zdDjVVrqROfl+A55+-#)ksh at w(&A|^=`%wD@wl&^q8It&)HQ!{s at 066sWLtN2;ivliX=L7+-0x zp64E~QTwSDc$IIKCfwWoS$E7H#Bl${8ZobmrApyP=#{BeQ8{;yrj`e7P at pWZ}Z;znNY|=l)X?w4W)aX at 0Io`xx^h;D(p6$Vk!Rt5V>nLd^`YGWLUw$U^9e zK`NQ7dcqH3Qurub?lV@$7`dfxqR2}py?RY|O|0KNRUXA69706fNRhD_rcwJS=n6CG ze+%&s`C{h7r}@De1+k#j82O^`Vn4DfTu>;`YQ7qz{)WS5TR%Q^tn?StDD?KbQG5?oTVF%C&g5YSlEX{APtr-ri51qM-J5 zVQ^Lml?KP&OP&&qygr03UbN~5Z1kQmSf7jPhfV3_1zXG6u4A6|bw^|Lr=l&xz(DWd zfVw{CFP#=s{I4)!9-Zqab*!cI3kX*EB#Jq`Xf85;G`(ZCxA8qeR0H zJ1{}LreB)CjX;J6{IYel4Ad8^Q$OqKWF>@9_(*VhNKr^HQkhg%&fl{B}o{2 zNrayIgX*TTt*aa=WaF(zs26wOrU{!4x z7d3*CP+2n)oxc~!y#+nskUSjIIo^a4I-M-g%;JY0W*>q^KU3z zSE6*ruecd-CE^*6T!DjJWKi`>H?N&M(-K=3`I4(a8^-nD!XJk~f$aX3yiF3zu3)KB zIvcy1>oOb}E=HR*{0H-sx%o7U1lh(Lkwzx3k+JlHWF7b~hq!kyp`EO7+p{Z1U&0lF zj@)S}!J6|*xEN+Bn14VNiEwpMLi$y&gS9?{SX!*T!jHuwnHdAtsU8!SQQ$AwiCkUo z at xr7+DI7V`w%hfnPG{tcfEVP{1hM~Z$h5B>YqulH#vBj zuH8xcuwLq(0ctDm2}9}nQb*(0mf at ay2q(B88phdxPI5=ZmB%#+tq3!wxNpZ05exm9 zeCwRCiMOTPPi>su!b}!CjjV0D8Z06cqPXuFC#~?uE0I`ZQX2N8z5>#TCgXrU3~fuR zXG>77wPlPF_?oW`p+9(I#Py9OCD>NWi&n{JuFY2m`#fH_{7DhD1&x*fbLe{@yCSYX z6P^^Fx%c#UAcu>6o!EH at JA-d65T*86|n;fZ7pN{sM8KvDQWK=l9DJ6!62*5b at uMIG#ntnB5D?EXEcqY3SayNvud zk5;Flp$8vwRK6OFqW*Xd03m4hMq z+qr{|bI1v*7|)LC>GuvMA0=NPyJD>{?%C9$b}Bk__N`41L+5RG4##a?z{zy<*Hb4V zKCok@=IL)xlK1j{e at KEMU`TPNxmYI1lRYE>f`d^b9)gyAWXRaPEZR>>0RopjC*J+O z);qgg|1b%Kje9*vx!i_BEB}DFUf(=IfxTG)*F9|BtT at 8`(ZxH|uVe`UllHvFLrnIs z#JIN<_}-Iuhthp6-toBIhbNDBu)Ejj2gK?-FM{s`2?oX?f%~Uf+6PRGzcd1WN8)-P z55;)&jh7i7j|knr76C;Fv?EXg`un3*U&jXQUFM^g)wl2?FQuRk`@8P8E_-%egK-+~ zn*ne420XF%8Mn;vw+Tid?nF?(|I9UvAuDQkc>DR`-{{YNtPlilxCeOtX&1n|LA0J` z#e)mWY^`FdS!c-?=TRLL$QMhaaDRU9*zE4^?y`|@(d&^^=_2Tgok!yj+ z9q^Wn)Nplwc5~3(ym@|lXK!itYJF;Uv%9iIM$!)iQQ$;lS&FZhf*)zlem%<*}>!bMkdBEd-*4b6?yCn+$;H4(d(If)wR_pdALvvE6Ak5Vy zrSGZZ at Oj07_>p%XsGr7~0 at HN_vejl@Uwpt8 at NMmwgtP2rPp=&VoFnOI#zO#~K7^<_u|z+Y~+V8X3+h7dXcus%bxLc^q at kiQ~Q zQx_*!Y*T^10M>rIM!=@d_=lWC<9h$m8WH?fPc+X82Ru2L+9}3hmom_hFLv`V%X`^v z^w8ed|N6d)c8-?74%?=4QZxPKPBSUDXkzCr2~R!*R>QfJZm`Nlg~W60_MCB}BeET_ z6~C;KHe>8jK)^%a0%bk_JF}%$lw1zeoR`byDfzrU=BWJ4G^fP7ngj1V_JSv327{$1 zGUhP#0XqgKB`_P43G(Is4%4#wF;|lovN=aPK0E%Ba4r})meek6K4(mEXpH>D@!`U> z>tiTk8jbW+ekcR&0p;i0dJg|O4lyxuMbDpZAT21i7AN`nS4+msbJcuPR1W4m8*}6v zH-(DhT8yKyY~n_!Q;J-ANUhE1`_bD_GZTbrDGhBJxrK*{tl`bkr3 at UBkmy>mk1mL2J+($Ee4#Pq8q2ByZ1Sh+Pjfq3rbT?R*k8447K&oVg%7U&$R%vIPN^Bm5ljTTlj9{-aq^nf4XWoF^ zDVV$}_e at W9V5-D3z9;I-ob%1jq=5VgF7ysYuOf=iji$t)3&Tpl79I)%!fS0Blr>Bh z$(d5x2BAUohR0vG$4#IYRVAl$m at PPVAWG~!a+ITWl8vb{M11lBky_0T=2(* z*JMgEtesuHRWXYCfYqrZsJl(Lp8#&Y`E9R?){v_;LeCRGjKPv3gI2Ff+Zur$sY#_y zwI+L zQkzm;7*p|@ckG*t%_y}EgrJE($j%<%;P%OsRM9wH+vKmjtVpRZi%xWS? zzN#pI_+WB>&BUUow&c}~&9P!0xF~lm%!xKPO{yqZ`pJOx3eue5rW3d7E)S5E)G9v# z{jjA5Wg>uKH9KZT?@W71A9v_Si(;rhK$LLzxZX?5ky?&G^RtnC at nA3HDCks5&}D8}yMq;MHHgNNu)D^1r+-|QH^K0j9XDx80?iY_x;00Bq!+R2xZ z&AO`5;l0My(LU#hCKmaP0*sm0G>7-wkwWP;Wh+`tD z+YqV(6HSUAsdcp7|Esf$`tzm+54-7rTvT0Hl&as{{sbHm_Nc{k)hmKCjI>VzJf4Ikb5GETj&e_)++z*Zql=}#{lwQG~q-2YKzJq$T zbuk-<&`ZB>s9 at ZK?7M6xgcQ>9iTObir)|d#$rvmZa8Rmr6y3kEqnODP*+qoLcElPz zU=ANWurpJHg4daI;?bX}lIh?F7Tf58<7<+BV$BIO%oYTKLX9Uf4~*7HAbL+J9r+JR zp_JPeG#FJ>*Us$_=PV@@90py0$;p*V7oV*%EYU9y!O6~OLw>vmuO61u3}ZkJ7716H zbtdZ(M&UU0O{|q%3xP!fJF?6=S{uMGuzE*cuq^Q?gLW31nYgIj{9_Kr;#tyRjYbhu z*x&-jf{R!%Av}7dju at Bk?Q34ulFPBh3D9~NJjQTZ^@-C0EIRH&^SB9$wS^rV at Ut3X z#bEVkti`2ZiNPWi#`Lrv{u#O^7G=}?%~&v9z^NSt^&W3`&T3bm^cA}B^B$hK&9#tf zo(b!H+A+fT`Ij_=xBV?ywT2YTaLh15M%z7;8FQW|Z&N=hlSPV71`}U=dcAnzo$>^4 zXv=kYwv3XV8J(w%iGoV~5ve<4pRHDeGegC^T%{;MLxGLQQU9;^$f zlSNyhQK$=y*g}5=P#?v9mNc&fPpfdTN`NAJ(1;ULyLnDH5#}k1QV5Dt zG&2*dS|P+^2rBFlZ#5?DA0gU-_5)U1)Tol_88Ch;mZP(zw(L2L0`$B>HrSZfeVE1E zh;lC^=}ed52`Qx{D1M1(+XBtN>j2_okq)f6a=uM<||&>)q?GTCegQG{oEMBC6*`3g_NZ+~JjB`M|k7^%5S zxj7c-%kvV8VxwmHpz}Q%x?G`lPj<0OS(U2L0I at 7>p0Qs&e^bl>b<9TO4`25YD!ggR zGSo at U#fjE&3fym{rUP5T%(QAgSW&b5;bia;*<6t&x}s^!uHG>RQ*dQn>CV!256RlT zO6t|Vm5w6V4POne^1JD-$1P^l4^M|XVA~|H#7tviCXH at wIbWp3)p8xo*kGy5N7 at rc zjk00e$_XJhWj_X`g*3&OEg9!OC&hnjz_Ola-BN0QVW_uo;Eiubos(!T8|ty at i!2_9 zcrPl8oN}sIX4qh0^1MG|Y*AaSWyzXMPFt%9yI0feCH>mui)^-%)j6?%>-1}zmbGH? zcKMsVxYvQ&zOoM(Rb&Zy07xh;_G at EGPv`EVb+JgX(ME;mEr#a}Q#R2GWtdS}(@rKq zw at 1fzt(r>{z3a>Gor^o|3!$C?H}$XA;L6_ z3JnDGiu at nzrw%Tz|FS-CaCZIQjUO61o at f@>{uDgpwg6~aSm+}`P5EmA5E~hAI7wNM ztSDs+Z#CXVvBwyp7U148$g3*euN}r5d!$oY}*}l8dgdkL@(|PXgk`&KSppGXv9o4hVrg!}6=RJjM*ag8gvwKbI;GmZwG42#=>Ml(rGSxpXzIv8eV6nxlA(zrZH zMZ!*PQ|1LNpmNawu#k)sh-Bbn79fcVZu@=(;S|!(nj5t zA#|md;t&m7%OH7yb_aWooU7chTz3p*7^k)91xy4jUo@X1wlZ(m zb>pd%oXFZ^9fg-?CF(96%1lb*14u=>E08xi(bzfu55B(osSU8}vUqTZ;8q~GdvFPq zQXGQ275C!q5>hBdiN_XJam zd{`W+fnB~EwjGvradk81QftBVB#V>Qm-(cfpQqVNpPN3w*$h}DX_vw>^s^k(0X0>8 zxlX5_BbyI+BSNad4&x>q#YS}LB$KebO_f5SOc8F-X?3|mjqGBR_ZdX{l)eImWu=;& zh26PA_OoqlaBuwRA=RCak7 at 0>lQ-qLE1mC2#Ooc=(!zq)UO6 at 8$ic at es?eAH*Xj)7 zi)_uTu<`ugFfW&waR2hDKHak)<{_IW51N_vrGpr-brwqmW zhIg~^23G*|j&z?Qm9=660#4cX?T5p(u#Q)&HU{r->yIL1i?}6WA1T}hiEssY4*Diu zn(KIx2I4`rY=j-7NI6eUg}X6RgsV(3=s>pXe|hUAYC-QPKT?<@Hl!9s)996UQ6yiGYWw#uxBaezN29$ z;Z>@US?6ETs4<+6$f?`3;4|i?yr2QO71ji&%pZU7*{yvKlg5SSPAU;4hq&(ZQ9r)< zM0K7mVIMb}_OejWTOJ^zgrmshK5)$p!5aS6U#@>?{4~oE0?`l#Hgw6({ramu9#@=x zJHlXQssvqQg$yg!j`aYYN_b7n+g>p+EuhLH(;T`aCC-8zDD~crNm!@Hys$BJ33NR& za7fhY4AUeJEwfQMl1t5{J4h%y7fen4e8dYj=RP^R!r_GSixH@)&FCZfJT at sb_3N(6 zn4P&l_WW8Pi<9?|c!YH~BejyxzJD*?uJ4pVEw&n1n(CBKhB+sEGxuLj+7< zWrYEK<3WDKB0?#TLhL&`-U~^PU%zdZE$_X)1}P>Hl_ z&-rA`vIym2DQp2fp6@@r$q$I*S0r^9tDUoYMQnl$_6nrz;jo at SDoT2ayBm9mw3Kfo9 zqO7WvV6KEO85#3^iN6Ii&%{+Iv*jlZi*G^Jp8~$hyXROAynyd_c_{;dfWWpqCQgmd z{$`SwtlR at v@D`S$?o)URb6|rlKb&SY7`<9j%{1uqhLgZgx6h6;5REm7#hQO2n<#3$ z>)P4lXSI&A^I4I9x;3Q^v)4o`l*;ibQ7xN*-E<5luA3YWx(I8FIrA^dtZl+E*8fN( zQw*861a{%4Cehw4-d!&18S7X)Cw`i-Sd2dctleEM&rDl85x8l`i>jZlaVgnf z0{zxdnVA~SJ716yq{&asy+nuwFFY~A=YyroFtdzT=(oSDgai}a|0U6^ z-f(A|H^Ot3&q(zGXN`hW<-CaUf1qZg{`W1?|H`W at t%m#GV7z$o8vFkxE%iTp+75n- z_VzvwzP=8=FAW at g9PB+c{ue9%L4WD#)FpW|ABk_$rt=>PCx;6J?>7u^`de>vNG$2;nmrz at PHm$F3@ zPvfx1!sCzUpTJmxDOeb^+%y|ckGx-{KNGy(ro#}aYxt7JoM3_h at qS$_RZmYnip#Lh z4NNzgwSz}LrMY at cG)ZZ?C1n4Ka}=@lHs?&HzDwoAYoxPLQS+uCXhLscnEBm4 at w6j@ zH8>*Ef4&h=FoNe`PLTh)$GLC+B($Yrq*U|lt-_~JHq@&1Kw9WUp>)&ES8cI0ONfC&jN1S#jJsh+ z%_D)G*K`B?dbOWeYFG9p%zHFIqTuG&q) zjMb-j!-|em-ts1_4cYC7R`uh2n at F6UeY4!q7xMI7-nm&+A$AO5_sFZc+L|=sr5DBL z_*RQCiIY#hx!1!sj*rJDDBol^Pb>oQ{?XpG#S~>gaRRTzPqejyb|BhS2D!*9br*y@ zw+Ie|ks~V?^)+F=j;7>oLSMH-$mP3*>v76B5E&Bn)InGxMdAirTx;L!$KEh}s%r+q ze*4Dow at vER)t;1RE{_y*eRwu=pG(W_pb!$+(ULcm+P84{eI55@?Q|&0XvDa=-0Tf& zQOj|cXmhn8b)nW at 7{-*Wmn_V>%BXtE>Qh+}J!&t`Aofy;-9-cBa{EdKGfvGcGC2%& zP1U!9=3&I7%=KICdyetB!or!-=#I#8(Imf9 at -fiVa?ne$Eo}|U9bfUB9M5zlCpgMt zu1d`Qy!Xp at yV%J_FRj|1MK7AUE!um$Wm at EaqHXe1BV(M#A2iWx7LHlSo$eDu`U9qX zRm6tVHBGo-QCZb<-0{)+&yr3B?I#=@kjM9RImCq&GhDKh6;7h?L0vrquAW$2qW|xuM{m(G4+3!Px>!>VvX^<`T>0LqFmtr zb?@l^!sma3(gZiuV7E!$>8wyp!UmY5U=%+mh=EH&K&vjOm@$>XjLV$Tok3vpGB-(t zJiFPHdbzb0ir<)=Sb_iTXB>#Osrl`wxJ?nUmW{O1v!AtJf4Nllv) zw<{BYH at n+$#7uO|rN91u&7VHG$QTde7cVF{-$ZBJwh at 3`*TDv*g4#2m`1!M at Fp0Hy zSc!lAS{!EQ=fC!%`55vgk~8Q9$HvyMFeu=HVoAzSZUzi4bQ-#(xva{VcukGt!1pr7 zerGMO0&oE23$%_ivw`e7%hAEM`Sg38(xDXwYzygYA+7#x80$excFS)QA>>WP|?&< z{Go1r_kqAvRpq&dQaYe-m0nd(@IaI6- zFiflMHfYHe{%Bqs5F#CB7j96Nvtab`Zu!H;UlfbHcJ7Kq#b#-qR at TVNWCVOU0%V&8)C_gDz{FYa at Biu~@@XhEn{W+h)m;rpR+bwhC8cf4(pu97k~8m$T{;X}f)Y!ff*Q_e+tp89#ZI(VCJWge1=YxAqaRvDVQR(O&op}Jjoc&cDs z{i|B++t5%;e9Y)~dqLb$XBJS53k$y*{Ifn2uYkr5;m%v-ny&XePWIap?%-q at fiL`~ z#5m_$3CLlKGnb^)fCLK<;RYhBYz(q`%lP6}Wu!|Pe$=U;0ZkEAFlhW=BbEL>f|x_& z=tPbc2+}yL5xz?jTgyXxNa8?w`8p(8Z7_HPaK(qST+B;!b{}dJA9Q at Fj>oZs=Cb0t z*TVjFKgxn~e?#=N369y3(} zQ;I)kYZi>CTL_!=BJ#_-Zau_uH_E`;$HF?CeRVCP%xx)Hqfz#BN1HAb%j$5anxHf9 zR{CB9J0e>yvS+6pR&~Or&j;P7nbCK`w5 at uP2uyla(NnbTS`hlJXW`?Tk>&89VCiJ-!=V{V{&~dU3*m&C7~^ zteepxU;Ho8Vu&xP38fXEup^Srh3`D%?ElDyE^dU}Cx)Jh+>M4Zl_Ei#(;H=fDOql5 zW4cDHFjl3oBMQ$lri5a;de-T=#uO_BSi9CYwnK-8iGhEa}I2*R_ at 6!azw*eg=syb(H3 zUAhDoi5 at rvV||{?P;OAOpd4)Jt#u`$2(=N1P}EEd3nbMFPY)q>cJ<(WhDYNR{4MX%zL=Tph!7COo9J|y6xbP|k*bY7YZ7l1t3fLLF?=A7vCN#% zK6JvC?+XCNOTScO)Q)U%?54BP_RD=2Z#B(>{e)L}zfxMhZliuK75=+8 at UR6t;-i(| z0b#KI(8H%5flK#9 at l8b-&ySdx#SaIkM}U)8YQfgnhay@`%(}S;R}x$*OiqVu40Pud~Mf&j1YW~415)}@gS!hhfm$`1Bk~lgpJB$VwoAG{xs!%46*b?S>SF89x3j=o6O5^Jp% zyH(^orjQi}Sk7UpWrk4Qn=<%RLiCx~K9t6&-K`?^=H zLXUQHP0If7H4Sq%@0 at qpCsF0)_L|?)l8Sv~1wpn14j`|&u?`ChwxeVEBPT6ff%z1U zchU{K_LqmvOPQ(ueH?*m`nG-VFEu_p7y`zV)&AmAJv8U6rtk2k%3o6%mgG$*voj6E z_u4oXI`r{-&9R1|j}TW;3HQ8=5on~ox7qNk;rrI at KBeB06Ao@YHqYYOl+04sGu+Ae zb;NO8 at S_bGUL1rNT;(>DN+!_Min8R<_a6Y!?1N at F9#{2lpw}PU>D(oXZv4Dad!uIW z3^cvBYD at -S#9VzCab$nE!4nDj^bI^bxF4ktlCiL9us0GEZDTEM*9_$S&To*HcdC9{ zKCQcR?BVe3{W{FcnrhZ7ovSWkPcP3eNUg$lS+y<6g;-7e0TWS#q>aF{!!$*uuv0>0 z7#fBK>$ka6zfKC9hWx=?V$^|rM=X?Z$ZLgMh#?74G!HdkHcf0hhVbZuMeRl@$qlf| zns)4;m7Z0 zG`OMrbao8qoV7LaZzdNxy)C#3H8qFbON`S~l05oP+(mOeD)E*f`;*}(k_w{-qj;w; zT%h at C3)B9RU8%_j!L5q$A2ghvO2^p-6RZwQ%p;G!eEc_Jai7YP at bbN>#5qd0iwL4} zws~gX%e%T{$2mx8l~mF2ru3*Ojl1BKt%^p at In_P5Z=hab_qiB+`9mf?KmDy30uAGE zZpHnx+I>uf--nf5eu>rR#OJ|8$5Q`q_&u}}Yn)9r7B_a#x&{0+*r;k+Xkhj{){#C%H at PfP75ST0zJrkFnbs#5NBA${n9{Pb z#<{N8Q~J^2ZN_1K#%j?)=tE at Q;l%8#h>|9hu_@$VvDQ#!%X9)Jo3Y9Sj!ih;6m>C< z^rAPBpH0hq7o=@$n)D%a7-`KU*DEWf3GBU9u_5|k%qv^{IYq0gYS>7g62^F29LN6l zcS`H|ny9{=d_yYk`~~e at _hgK726l)DQ;|PCGh+MlRh~WEOe1Kc#5DSO!Fil7rg91U9MOVUQ z`ujmoV;t2mjs at vP+RAm4fE>IOdX_Ho_JV1M{z7TEeDD!N(_RY`hbLTl^!2~-+R?uj z2C-}L at D+sEt~J<{^qK5 at A%o at F1wxJ z*e(xh9xw}3u(hW$DuhIToSC8jyg$|1Pd(|ns^VGl#8+Fs?kmzU!H0r$>S#Q2rObXMe`DW17ZUfX=J#WEcp}f={0b(I2l=1!Q!v{sZ%F+_ zyuyVE{w4pPzSvMK^a10^h8W}g!)lZmFco5n#jAfOa|2lYUEImi-}HF0Y>T z%d$wGQ(vp=HLJx^DEzx2tU~`|h(%k9pM`(zL1nUO2;76o)Qf;m^362TpA#fm4O3DL z2n|I$R18nVYlsg;5Rj;}=M}VLV>eQjwk3`PF=*{x3znuCOi<65{w`nqwW_jc8=JX> zBBaFWsJr&G9akeiv~6XQCH(Y`k0IfO- at 9Ba)Qi279Ii^7DRMQi3b9%0V!H2EKF`Lu zqX0J=*6s9NaqSP-*P9th at 1h6N5gCn4h4BJTO%Dd2A-N0oRibCNGT}4KPN6ub5?tcn z2-LNHmGp!Y;OvRa20h#0T z2*MbS_564l$fIC(z09oC_|rXhcl%)Cyi#PU*5$I5 at s=RC>xYR$9 at USJ?zP#l&WhF| zszy-lMYYM3A62*$G42E^vIqm?J4;M$S$!x5<~z0=Z*r~8e6FDug-D5+U!gL5`(b#e z%p`g7-I52b#*^ECbrpxYbUH)z0(9a#%;>7S4$ecal&sqiqnxI8X7<$$Nt~C*J!oO0 zHqx5X2`nOAmO+u1qn+w#U6v79$)iMiB~}74wU;ZJu#9Rq_u)5Lb+G^l at ncd;+4yYE?fc{=C z+lfgC{HkhIh`jR`;Q))T^14QfT{P@$?lUj#lP+{>X5M4v^{ivySjIxaa1H*EP;|W> z`^#;SDC>GZmWmMArW$<==^^F|X>K7HI*Wn*7p3`$OJ-le>qe z-{mSe=zdVC=F$6??86dkYh1dWO`H;XdJg~(d!Mnm>OD6R>rVrc{)v>yCcvVG63y%f z;=@SKrs6T<$>%w#4N20fzpp3lr;Sn=msagtg1$^tS2NwHJJ~ES3+^;csd6 z#9%L)RbATML$dR*bK^hR;(y)g ziaF at YR*a~Kd!{IE?_CI$eh8>#lek$xf28|SSMHFVtuxW0N z_4d(YWy^_;$pA`@j73x1>Lyn)qOP(bIcBaZi{Nlb)9F{Ul^f}ehu{1^FbeE>za2YL zN|6Y?(OF4kc6!8+yhfv3dM5CFQ6Zv@!syt&$avqQUiVbr;k1vnpNq~W>|?-$Y=V;6ZKO(ol6TMkVjBci at i?; zduBtN_G3fppyBDyUhkIIvF#p!3V?aljfb?#?+l6B<;TrKyvh>@4|}DNng^c()-pxj zm$717cgO6-@$p4%5L@%VF&FvjFxO|o$0 at 4Gci+S-pZ*FfpXycf^OIhI73@^Uh(Uvx z%f3d#%UCANn!?NxAA0UyeaWriqsnmPYBN$A#%qX}@+N=BnCBnXXes5o9&Zy{wGfSL zI_gkbArSXqQFg8LHpN+7)W~c+^^0$2!!I15 at w1$eT#-|NE6h4~YJoMIK>O_pUreic zu7inY7Ij>j$gV8&DKssKKNDts&1qgM%#F~N&mKq&`Uz`vtqbN0YC4V_yEgc~rhtZW za+c8l5P(1D+%j!)u;BW5K!19bi#g^*$tE7l)HR0 at kh_r5no8Cl^|02sHdn0Rc01l9 zs&5%;5MHJEX^SC-g3kb3*xYnY*QdH>+rpmJj<@A3G(&u(K`APgcqjvgf%xlqi_XwA zH1If_;;7H${)|K)T9u#+u1LaHXd*KyrapRVG(@g0gvW`BE1<$b9pOj7&+qb`(ScW5 ziAUjyM=Z3}vIO3;O6(vArz at xP*Lh-WS*3=?OzZLOM)i>B at fqv`^ivnps<0H(CMRpu z`sX*NLCaMg>K|R?i#wKK2hyj8tr{VG`d{z7C#?5;D?fy#s#ZAu at Swlxs1Ppt;K$fO z_+j$Phw%!l85xpphq}>q(EjH8f1G{%x|uJb0?|48a-T|#KZb;bu%?WTc4YFm1q(S! z+X)Y4D*jrq;inuq$g^XcMQM%9{AMk>5zpFM(3uKUIQMjJzVXP;8!x$y#GN|l&3};1 zZQ6g#9+@{)JB%AaJRH0aU%mkO3#HYmtbM|o$sg`{R)}caKsIdrOoogMgU`pL&r3tP z$))~rK6GylS8ODG4xQ-U<}dHB_(}!%fE{xbRMx7Mi)cGC5x{8G(Q}bi2nZA2J@$I% zJbLYtD?03wH2xVpeR{+d~*L*F_T;P0dz0kE2@~n)Pb?LO$K`{d9ig#Mm z`)F5hFAuJUYl}2gg9){!Cq9c@#~D;E=$2V(YoZ2dTrHz#F44K%-lF5z>dzK9btnYC zSSz2?il~f$&Z3}-zDWQ1<W|Mk> zuhyy_P55y>ws{5OX0*2b=e6hr1_oB1eLt^cX}^6Q4h?h+2nY-a2)GFhI$FQKC8QN~ z)(bd?=Z*>ozWzScU9`3lnDqWgwO989A;1xsYM7+Mc(tc1F;9 zq`v(pjw^y(r(rN;FGyG*BM6Svw72BA!pk)tZdcp$7xv5u%0!yk|K_+N$_*TDhwOz3 zGiBUoAR+d099Oux+QXr0jx4zo!=Z|Mn!;A_`#hwCeJA at BL+<(TUxhu0usr-e7b##L z&VEIgyFUC^aZg(~0)C&5l(&CozhdfTj_m=s1C&YPSqYS(=r)q*05%de)>I{6njp3f zZ?9x5L3AWDt2#h9I=YzE86X`UWz7l&h)2h4u)YJxDN)&I#8!}Gt3k1COk#IQvLR43 z8`ankBt~k^5Fktt&4#u2W$Z9OpTtNpC%KNh_bs5BttP6Dqt_JR%2pFo$KM+aIA(K; ztYhgFjZGu@%;uI_huixZkk8_lUWe724KQPIORFR7Z3e8cxWNQ5Y;a;3NCT7>X>6!t zEl2~D7a44bV`WKilosi1m}2Rb7)v5`R6s0#%vq$;q}%`zQb!g8(pHkU0RLEz*d+jA zEQb<)2~G*M4N$-?itGav~4Q_y3eTl8oNyTPpn;iJ7F8 z%-^FWDZLH*=SYkp<`~{u{Y at kbYUViJ7X8;G3y{?p-pc(hiF7P)Age%c at _sE+3FTFK zZ~T5f(iWvvT5r03chVN+RYq^@Euusj*0b23B3t~4ZLDYUKV`NU6GK?f;(khO$t6nl zgKg336QN2c3cPFqtVSeGtm8^GtN|?ZB*%$si4CN5iCX+ueq|D3RWQMYS3esGOa+X0;oNUW0#gMOUA*fjC(%{`<6hYJ>yv1! zf(bAD`b9`4RKWNbZvDO_6RKe1i_m_25&@NVz=dtUCW(M*JHdrdKMzT*N;}@g+kRJ) zTGe)J(O+zZEkGZIhLcEXE*ei at Q;m3I6KkN*2ae3Em;cIpec{zp-E at wGZ$9|t=&$6UW^gd;WEoQ|)`&J8uRfC at u9TPFC^XHXp3mwY-zYUrrEbRR9 at i)~Ev~-8>YmUj zJ55l|kP)D=jO*f5Zjlk7x=iR2ST37!qq2q6+0VcpmwD4m3d4h zFU~;qNa-uf9K03o$R?JNr_NW-SZ-M^rS1#gW4UHIO=)DBepbg}W=QlSneI_fU}i}6 z15R(MLzo$o{3xcU)CZXvQvB$rFVs1i3lsgwriaxlnG2KsXr~X=otO)g{HUgv)c2VS zQ~VgG at 71Z9EfW1mrw7zOGFv43(M<2E8#7xZ`B6^KsV^{Fr1&vRU#m+nuO<4CPmig$ zFs~*1(M_MK2QsfE`B6`=sb9gVnAc+b1g68(Z`oucQOwiI>cnia(J0WgojQz7HVXA} zT3=n8O*RI_JMF7J!PXIpVx87h7hvm%MsZKOs at Jl0M4>pQ&D1^FI$}`#(;@2TY+;co zmT8DO6I)m`ifh_Q9Um?Sc|bqZEU(SzRC~ZaG%G*P=!86=9YV^BGQ!m!unvvO*E7N) z4;Y8qnydnG?V^{$L!+z$3GLuZydfUe+Sqns zADPQ{JGevSa84F&wNKIQc$Wq{hHztLONJoA9WnTVk|kXb!;U|ELD`Zi2xEs3UdiGa z3uXwi+tJF9Q2k91C-I;+;D9DlD^X at djCluwV@4-7)Z~=u*l6%&j6u5w5C&j(+ z&M3TAp_A;Md#4&+tJq0(FTHaN_f+U4z314;hkGh^Qr?U2tiaC|I?3<(ciQ0lZ2vKU zb8orxm~jpXe{rw4laRrr7LIwZyEB-<1PMpK*Vw7dC{hc at zBk#~&nSX~qus0Se9W*? z3&*-Q+*!!5f`nt-YwfgTtgD6N+*|D2W~@V=U)(G2z%u03o-yzBcP28ZStHW_VqJb5 zvSNuy`%8G)GPKST0sD(_2^*4U`Iq_^|FU+di{)SXU!2RLp$L|LX at 7|?yN3Ri5Gc{4 zPR9#lI)Fw5v)Faw%OZu*9bS%rvZg?GI*8I#<>6ugh&4HuwG0H}PL3}v1A;h`<7~?$ zLHx-HTV?jT*(xS at 4lY>^I at ziwL=Hh&lsZN#Cb$j`SpiuWAaWg!($`A4slr$elv!1v z>e8C{AJQYVAlK5GxF6yp(xBtgnuH&6BiJCi($~sM00-$21Sr4QE%^t{$R5b7*e&S? z<;Xl}rPwXy2gAq>NJJ+_ zhj~O1gi}Tz?E at OI0VR~tNBO)Q(FH-u=wp0%N4!CUWd)HwtRosA&a#4NAMOzsP-R&` zln=*<3CO9eAjXG(BnY%$W*+IoGNKBiE;Enz;TmxOeJnGN@?jq_1R0l^$N2D#_=6V8 zRwI4bMzlZ at WvkIXJR|O)ma^3-AI=dAP+%DnViM^?JkkNWEm?(Kz8HxC5to2dF99QE zAXo`F{StE|6Qo at NPP-%+X#h=>fMJ*DBPk$(lJ?X~ypd{9ZAp9jCH6=@$g`w9?UHDu z4Rl`84!cAfNdPgGgr;8Nj#Pq*N_bW7>38w71av!(#-7jUj zgT?8p3<-IPlsc*gxQ1$mI)(;>h7d6wEd%^HHGdro1L8TzSSf!}E5*_Dm(gPWlvetq z%P%~|-xFKOjz+$me%aRLEPkU>7%NTVk9WlVMPJug)q>F9e^yLqLB#^!-+k6!XF=71 z*gtHRP)97;yNpCy_Ve#`k5%b(+jcb5At^;^QG z^yM^Zx~8aQ759>x;+xWO#ljS6;wEB$tJx==TZrt7YlYbu9bz?E%xj(5J{@9+Ec&(j zY?%&BO&0qaI=ig{gUF&?tITHVXsgL$T^r2K=x9S^F|J?FHt0;K$>Lm_&tBnUhB<{>IgtO(63+3R_oNNbzonc&K~R3LORf{)n at Z`Jk>g|u8n3_bUYy) z7}sxR+jP#=3Sq4;t{G=TbkCJLn6A-gaderK!hqMLvk+Y-t zthTPavPI&9)DiU;tJ3he2eBiGFYBe at 2@kSI#9!n~pJN|Hjs(7Rl|IKm$Q&_!i70)J zdyqJi|MIW&IYAuYE@(=(Oww55+&7u6K$nia3}}Qqmrbgbr76;-h!gR}a1%}aMI&UL2BOWP~{<;<7|%T_fbbLVQTn95c(qjHyO+?_H~Fe7zmZ~QQ|JcTIJ zQpisf$8{H8rf4*r{9O7ixtVtP$l0~{TT(OC^0M=B at wb#_#^ncRx?=Z4aYA>t#zSYi zGWY0au4PB({4)2bX7*(xXR|W*m}b7^0OysmF at +U0cSvL5WPsWVmb-D|+GGG^1;bst zv19T^Z3TxfAsfO|OgZ(+nZeni at l7M%^6N$uXTwJRMp{#bZ*=bBrWoIn=9P{Wk5%(y z#HrmGO_`QEogYh1VF53eqnvR{7*YcO%O%bUB at F2Sn9FcyNC`t)0Ksy-^I!=BEC78u z$(ggHFf{;gxyre+q%b`IdpXzHsiZJ1fN1%b^L|MoEC6je&Y8NzA~gVaxx)EliA8z< z*765u;}VOs0K(-a=Y>8zaVB at PWm)Ij z(zS#D`DF}e;!@ez8^L8ZXIQCh{Eg%?xwCeuY}}3LvWW9Uscgaxcp2YWptK|QMtGUW zxwf<;{ziJ4&e^lHBko3gS;qOiv?Jk0ZW+g!sWdG1MrfJSxu`TOzM16Iw^3lSQ{@rw z)V0xbvQzbu=rp8}X);{p5%<)o(P}bW^^x#2uu*>US>+M`)Uz>S@>%tfIE>`M8YPZm zIZ&QTC=rN~qh~;o9YCF>+L4^ugE`3e;2Vel!+}##3T`3~LG!Q+$4OYl?wW zvVKgmDV;AL^bR!31Y$aQAAAl*%W5M#Ssz{<@RYTb!5~GEa-?Bo5B4aogX&^!RV&Ic zG1T1Df`S!!7$2%>YC+M8I!qRIJtd*AP7+4 at pms1bC84&C8K#dKo0Nd8qlamtzD>5M ztz(Cop-v}TAVpD~7!TrkqP at -}V8YZg`EDpp_(!mlBZYbz$iIX*wn4^I at 8k&6vh;> zl05K<1f at JhtSnFe1VFJ(!Ib1_pMWU4DVVZ6;}a%|d`eqMp5}=Hr9Y*uEYI*nfD)OS zP?D#6qDT2oO(@GVJ)xuUrv#L`fKOy7%_#xpF8U`t6wg$xQWxzLEy{JOR=JDu2^&Q> z<*C#~^F)O*oAOldVt67#$xNLqb^(Hds1HYA3+$)!~TI)aYWKH<-@|kdT~U`GsDB}fqe15#Aot{iG!}< zf632u59bFF#s89?sUOx4{uTdAd1gW|r}hBdfy#pMwgi1pbUR6GAe*3?ZE7ztO$ghL z7a^HS5Fg26s}2;7k1nxw21>_A+1NsX;_)$?w(o#)YE*U_sTG3R2q?ClN$Rd(_8=6^ zPBry|pb^4(5C{`OvtvcPOdSU53mWz0B-e8z-U6%bYNF~n5T-y^yPBAKenc?v*v>7o zo&_PAnkM+!&Mmbb7x5XGZ{wC;kA=tvn%TIe)e|C`fh#s{Fd+;(oKyy(fZjzKJL*&m zp at 6pmXNd%H&8^#(Z)ciRq!p)Kh-032}qdA zp at v_EQ$}q^gfLGH0)_z}ZBG*FE=99#NWZ$ShLFu|5S-dhqu3WV6w$9an)gn)y# z^aAx#y00TOO&H6C<=D zm|#sbKp+1LbIsp!;i_ znE{kw7?OAIeU7FLf7&mCy&pNFHvF((=zGaIJT~7`m(ryeebM(+kQzCeLY3CvqopW) z4Uuz##)IYZYe+Qd zJ?ZAP3$Qg3bg~`qt+5TTnHN0HS<7hdjF33?8+6J7-%WdzUr+wreFkoP(Gg6BQ$)K_xIMI-d&sB6D zSW^$(t`ml$XD71T3`6mq@^8_^vbpid$xUNn$ z7Igsw%Y?3hHL`U#{mb~So;6{0KG2{VbR*L0*tsY}#8LlO>#_d4IKzRX-mf-u^{w at e zc4BpTP`(<*8p|3fsBitA&9%*GN)yxkGZe>~A<>^?z6Y9M&5-O5oZo~(tQnI0Ddwl3 zgVqcw{`B(~P)_T at M1QjRVQ8gwVX{B%{2|oIx-iL~YJLg2Z(W$;&p3Y%rM9+6^e3Gk zfPS>LNcN|h--Q}mTO|2Y&d)&?tSwUf8RoB{64q;p{^avx&=%{pWPiH(Q)r;|T9QBY z{2KJCp2~VH#$RAQ40>xP8+pw@b)AR@>|?W<^SaK#2ee~IO;KGq;sNW}xMsaBeDDF|Si7dH?iulbb8J=f zuMWqC7~#>!7%fW?0=ywx?5po#jFKe_p}28A5n8mXAGC3*!*U}v>&>pGbfYxuo3AHy zBVXxlu4izgUg^83Z&=i{6^QE)y%Amy(^4QkKb_fT^+`K!%T_msPw9!U< zitfO>F*q at -H}11!2q8QXt6%7~qzhp<@vmR#vt$avI3cXBwDF9UWeBl5(W;Xe_)QSv zd%{=O(*GMT#P!6zu4UjiQAo%M&7zF;d143o&G=%Q^?7m!-Obrzi1m3=2ldVG#YgM? zx~oO36V?FSHjK8^wIqw4Pf4=)ZOLnK7Jc9C0_`Rc9 at Y}|W{a|m9gDto`?eE(XMMk^ zL*!4M>WRDMNFJF_V(N)|_=8>Ep|j%zEt} zIm$=TlbQO7ZaMNt-jjyYfbNF%5>JKWdy*))gVbu^&xN_UnoU!_gj9Pd?UJA;Pg94Nn&8tOmm| z9<@$d>ednAIFA-5w{`1-&o3U8PhfTOh-b`4{ga70YTJnPC#;)~i&i!fX-|YVEsN_m z5wItW8`z?}&A-$q{F~avE}MVpPdGP4ixD>e(w>NKx)%R!67fgvcqVfYQsT-vrmmp&+2(LXzBzW9xNqZmI~D6J4JD_KY(n+FV&HJW%iQGw`pu_v7XLxhR8&6WTfb0#<8=6Y;%4iXC zC#pA;mH3tM`h$mv+_af)m#s#xV6R~By$$3*Zo*7LgTQ#W=VmwBYcoUp at 1sE@rgl&S;uQ10m zCABxfX;%c}4U!X^VAvJ|iHE`F&T?=<@+;wo*#a$0~ zecTOjH^iNWyAkem+>LQJ!QB*hGu+K_x4_*JcPrejaks(U7I!<`?Qv(|?tr@^?oPNn zxFy^U+%j$_ZUuKH?kwCYZWnG1w~pJ5 zI~%uw+r(|*_Tcv7&cU6FI}f)HcVFE7aQDYO0QW%LgK!VVJp}hq+{17W$2|h~NZg}v zkH$R)_gLKHaF5450ry1QlWoR0QW-N zi*PT-y#)7C+{6^LU&4JE_Z8e%abLrI9rq2~H*w#>eH-^3+;?%`!+jt31KbaBKf?VO_Y>St zaX-Udi2FJ27r0;Ieueur?l-vK;(mwwJ?;;2yZZ68{QDSp?JgamcSd12i^$0k$9u)@@6w;ta5cpKnth&K&yBfRN&8{=() zw<+Fcc$?#Gfwv{zR(MFNc at ME8rFJN_ZW3WxP(j3f at e-S$I{vF1#9E9j_a2HeLg-iPysG!Ry7FgEtp% z9$p{bzIglL?T>c=-hp at r;T?>32;QN1hv6NLcLd&%ct_zKjdu**v3SSf9glYc-idf8 z;hl_k3f`%Br{SHBcLv^>cxU0Ajdu>-xp?Q{osV|`-i3G<;a!Y(3Eri6m*HKGcLm;+ zcvs%S;oXdP3*N1Gx8dE6cL&~`cz5C5jW-`}0p2}$_u}1$ zcR$_(cn{(|g!eGsBY2PEJ%;x<-V=CF;ys1;G~P3K&*D9Y_dMPUcrW6;g!eMuD|oNs zy at vNX-Wzyt;=P6UHr_jU at 8Z3O_debScpu_@g!eJtCwQOYeTKIX?{mB_ at V>#QO>FXS`qVe#QF@?{~aE at czX63-52dfAIdr`wxE*{$Ttz{2};5 z at rU6rfj=A{{1Nyg at kim0#vg+}7JnRm24BDz at g;m2U%^-LHGCc4z&G(Nd>h}vckw-Z zA3uw~B>qzPOXDwtzbyW8_{-z3fWIRCO86_|x8sk;pMXCRe-i#={3-aW;7`S06 at NAS z)$!NBUlV^V{I&7d!Cx1DJ^c0YH^AQze;WQq_|x$>#@_^gQ~b^FH^<)se at pzW@VCa_ z27g=p?eMq9pMk#v{*L%N;qQ#U3;wS7yW#JSzX$%F_S;_%-}GemDMX{04p#zlGm}--|y7e=hz!{674B@%O{uAO8US1Mv^S zKN$ZI{6p~%!#^DV2>c`QkHSA1{}}vZ at sGnl9{&XV6Y)>NKN`1j%8kN*JvgZK~OKaBqf z{-gMh;XjW51pbrwPvJj}{|x at K_|M@#kN*Pxi})|$zl{G1{;T+};lGam2L7A)Z{fd< z{|^4U`0wGrkN*Mwhxi}ie~kYL{-^k#;V;Dh9RCaaFY&*^{~G at r{BQBU!~Y)t2mBxL zf5QJ6{}=pU at qfer9siHeF@NI!h5tAHKluOR|3`KZ*}-Jn$POVpl}axM$c`mDj%U4iV1WLF})GTC;rl^7G$?1yA|23$!KIKd98JW9>aFrdZX#v4<5wy zU8Zfh<3`gr8a!x;wJWtsYu&+vhAh9rPJ;&xomMZF!oe!F($+m)`BGztT)rA`#4YQE zTy>{hqY}0g=FnDWr5O%hsCP{$*X!kKX+i+I>a_{AQftBv)#A3fR;$#gHG{!fyHHKW z8aboh(JC~#&$UKpuFYIGcu-re5G*#(9v^{Hu_p%QdT$JZ3CEzTQjI|7f4eY{ z)f?qV)|M-VT|#TcuoWz0SfM^Xq_Lq=svLr5p)&%*a)p=?4O&Xa3LTj%HR{2-bA>{s zSgN(!E4AKIvsEcaOBx?b^?qr0qtqMFMWV4G$p^}XgfS*0g=$ZJphB at x??Dg#|GD%aEMtT)o}^0{iYUatjvlgjgr z`m9nar;y7faAYCZDA&`~7IHzfE$Sr}N{v<}nBu^pghFSot2+#+&PsRchk(~;_1hN< zmEKA<*SpvhM-1@#xM0a0rABFhivmuwr`pQ(uQKH3YWm0Uj);-&JD+$2Ni;FU(83mTKii8$2d%Em~Qy3xQ8^mD+&)7+ad% zQ|TVS7*m=XIHXqY50lc|ATpb2P>t&-6-$l9wy&dFDR=e z%v8&z^B9*jE6x5%S4+9(0E^XnIS^I~{U at m_SI+e<@@%FnaAK=e8!$$|YRoFNx~sW< z*2u0>v6AlHxUNbe*!}^o8QT?PbmtnmLTAr_IEq+{JHYG?&Q!41 zrAGVzJzOKZE7f|dzcFwpyMyG>Qy8E-u2Bl&aA5DzjZ$~MUQFYQpnK|)0G4u%C<(@W z>p@@+OgE#NxsFmR?K-wusD#=6X{V_i}Yz;VtK{MFKR64S!HXt|5sW)Z?ssqDqWXMZr z*p}-^(|kvI?R2D9LPvT at bfgziN7$pBD)wJADxqFS$M^_DJu7L4 zN@}7KDppf at H65^;&aRqXLe;cuHSJmryLN?tYH9yks#HsrYN^Fqs2Hq#SgANZqUGM0 z*2^&s=O5DUd`v5?h_>Zs2b)rwwCXD3bB*rc?jK#Lwdab(M$)9xy=nqSR2r3L%I;}Y z7QtEq+j7lxVa at PTZB`;?E4g}G$uwHY^g#B`+w%Ejun0urd}=f+!iODK4nHrN-W3pOI zR*%UV5oybJrY`PGUEG=avorN)XX>)futz1?yENNHAnI9(&v8D at dLbARY-HGLX0Tu3 zRX09FBlEdNaBKBMjp5~bPj7_U@?ELTuGD5%I(An&t*+F1m=p8$v`0PdQBQlsARmM9 zI7A at oT2GDD(I%&eoH4BydAKzY*S1e7}xP*1#4=}OjGNxKKfG6pm2jRf>GV^9q$ z%LsJk63aosm4HerN|mDxY9v=}0#Z&Zv0N|K6VOQ3-rb#oMk4BN7E+KnVRkbfi?Gs2 zw1Pq^2F+?>pxKC*I6Nvz&Q{`>-emg2ds9yjpHrEY80t#~ zY0Ed$ZEmJZZl=p=rn{WprXgs{x6&T1RNhMEt<**ho!D#6is`(BmSg^qLRcxZ6~d1Lg<>+R5VRG-gkK1gULnk5g)~bQ zlC)Jw6Ivn3aD_CnMT{U$BN|*Jg|xnl80A6`hfQ&At-U=LGurd> za&h-CABA8CVj(RDBM|AOC1W8i z86yzxdI&~*diZspo_JS;$At5pI(7Eksl`~f at ZOUbE;w(ItWuwtTdk7F?zm;)?H4bS z)r%8z)!6v3TxU%4Ghg=n9fYvGZT9= z6Fb#JUh7I|!k?YYuUSZFGM{G3Px>_z{Z=yXxhYNNJ1^1eOZc6$V%k+t`pt=GTcI9C zNuw1^FTJ%2>8%yXIx3BX6>V8PEpZCz1y)F}t3rB##UQm5?Q1W(wvd zpf6D#TkkG4a=|07m2?`F>+WuL*IRLGXm}BZzHB5R-$>4CBRQhcg;t4aIpK$gyAhYy zA#E%4r0(xY-QSaXuP1eEPr3~~$(0s at wnA_CXKpGB>+eFC^1_d`ZN;#LDb5Q2q=if| zEnA9d*-}hPn__x~L(o>NCv`+Ijg4X&8^yGcDW;)OOyi)K#z8UN{s=UK2SqX6{t&bk z(2GR7w)t1t4xFLvRw3L3kjX+1G7K2$q;ShoF zo{vCyEk_`nL at E6STuQ$ICm^5n3f35cA%RXfZYfnyzutymc%xF86|<_9d<>%DO6e?1 z(YTcu*4Bnz6k?u%-}%UtqiP zK}8%l^+IQ*(bFhbO0{NtG5%JmvUOGM4;L##vtkug06bP ziHxO{P6*n{Vf|35`#+t3-Xg1Ab6c|~btNMnbnGYd=P#0#yJpXsnu}$h+;vSV8y(6DmD#}s z9Eld*aAYbPn{=Bvbz&tE21VI|0ps;`Ow9GpO=NK~*Dp(oxmdQ~u!VP at HejB!CWbGc zew#s|*Dp&7y?&dCY-}oqSn^g6Ca6?CR0jFnuryBLk$tlC>cij!95TOCr_L>F%||1 zJtz?)X1-pH)kYM;A6gRAg-UB)ghmE;N05ti0~)j9M&O%jY?zLEqbGsoz_-m9cGg?r zS^_w#QY+_L!3`G=G_zjLHTz=8ta@!;Z>bs&OEotum-LQ*p@{~nmFC3E5slKUYAzlr zs5a-u;&`_r)Kje_s4tO at Xx00gLCqWCo>s0ewclGQmf}&{D#bWUMl^74M9VRaqACL6 zUPqFk%#0Xef{#F0eTAT{l3pYsXsdK3<^nn*%-t#Ot`<@pTTLs(N?JU|qTrIQBndpE zZIxPLu$D$+IC(?9|5WRB?7Xx!LJ-!>gf^)b^F6wy&huK*XpNV at 9N& z-V_mt{2pHaZ(RBIac|uG#+7d#5w)WScvm@}o040lW74X*RO!uQ1}F&wl^U^5TP6J_ zQ%NhhN?N8>(r+ at Aw3LfL_(}^wTP6J_Q%O&82u6n$Q}}~_J!%dMGGR!^=7OrI85DYr zAhcsaHKHSOwL-m?@@f$!S8uj*i(n~{){`EMQeR(cz7f$(u34y8EA8Du?Np0J<6_nT z&ahl}M1$PZswA9NL`UU%qaQs}y?9N-^SMT%myc(o#|vl=1l3Zjl?(sjpcbpBu_%=+ z66g_J)MbDV)JT*{1_<=U2Ux7nVj~Rflgw at L;ReoavC#(3?SHLmz}yyJRN{-+XCw20 z%X(6m<>TEPoiEj*e;7&GwN$qeq{oyQhs20{C9sehtt5)|YQ3C>L%!b6?8_x1k+1ia zYKehdwV8y>m|V40Z_gEj&`ZKFXb)&MdrHMtCHz;1*m7TDImiKpG$QlOI2iIl`CP0t z)2)vqY*ZoqfxAB-3UQxIAs7CKMNqsi@=qZiV at x5})m_g=_gu`+M^q~08u at zQ+DbV% z5|vy$sGM@!7iXuf_Ea9*NZE^VhZPbh2G?2mFBJ*1lrqDKrp$N`M at P)QTqB)g?3NM1 zTc?yBkuc at NcX+ygg=AX_^=2vPoG_aSvr+2mKhK3m%B;8Qwd5GjikTF8YNga-yoo~i zuLte*(9g|QBk^#^Tbwm|@n-nDZ#2VFEgd%rkdYmwMsV9F%#L_`0%p3Bj;=&6cr4ZW zV)>|!YCZlxnph=v!-$T0xtw~hBOY*EaQO#0r%(#q5KG2JoB at n+F>a6eu}aKY#2D65 zh*uR zN2+naQ7six&sIx|SjkMQg=G9nZ at rPGmc&oPtMy{yv1*bEsy&55YCpbxMg?!;@E?H^ zZdYQjD;H#>-jo>!N2V({nz`^?^@qr~h&7OtNgC~uB-zrKwTLsUD|Xw6uJE6|QeM1Z zF)Zfl?O`sc6w at 3gM9jr`Vt=zelE#Yt%tgFmy~!p8)n>Ebzg?wd3c*&TnKHtOIEmu$ zzkB+-q-yo_5N9IT9^}7V${H8326AGh(m<9Hv%-_Qn5rJzE44?G#q5SZmP9kE<$@Sl zZjS}AQp_5_8P=VwwYw4odA}pO;}{>_T}i{SJGlk|POIKO$0XwiZ=)at`m;=Tk}11` z7t11(eaX5Txip7#C$(22SMEv2X(Y>T1l3c2>P?m}HcCOh3rT{Yp!^|-}}$Iq0gz) zmBV>Xg{dyA&L|puvWUD|#A%#4nJLvFp7(||XG>h9)_*>at-d_P*6>=14&geHEhY-5%%f|E3G0fbC^{w8Jl*+J*T#ttODDrA{-3u zIeSZrXko+R1fyYgDh`FtjaOWk*fLgUJoGYR0^M?J`<~ z)36R>b$wOTM&G*TYh${~T(D>!J6oulJ7FBv_I+jQc4gL&UH6=sk-Ew{fML_>Kie+c z>1xbbWk>9QWp06d9u?ij{eRG?g;nT&8ES~v72^|-4 at 8$ZHkQD4vJ=U zP`86Jb~`9w%)$@2);QOD?Bl7Kf*RU46uAP8tb1tPY(Z$63=QSx(KI)5IdSX26SodL zar+Dtx6d$f3&In(y#Pi|+#0TCa3*Tv_MRthRd?c6e!-ZvpNU%@1|uhK^vF(q at kVe7!mkN3%K)*JiUiZw3CM zypB>Yae8TC=ZPz8^s!uaS>=o zot-kuXQsd_v&0oZP8P1N-7%7hTaDL at u5`C74 at OSh&f~=GGfvzVFc=U at T@vG%Ti?v8%0Md1lb7&mbpm+a+9j7%yQ z3Q9Y{YH2ceQO{k}bLVO9!p?2`g27Ur7U;C*TFqpdIfUP9Xig at sS0%19C9cD125Y8? z>x-JvwX2Ubv7$~~Uj(BQL|07h`P0;Or_}YG)b$kYg*5}{iaCQ1R;E3pC_#);YU(gdGckiZ7_&?dPNohtQg_%qbr7K$C~Yu0FAhag2Og;d z7%(y&i35toU|lCmT_;OjM@(IBOI>G8P1hV~#(*R^nYvDtx`XUsjMh%wfu+=)WKZ2m zb}$YjQk at y6!BeNxQ>W#@$kai5>JUA37 at s<5PaUFzX<-8r0ioMdtR<(ecY~2Bx^C)D zf28iLN9wjpQg`SBjBX~ot)eNbckKZ`kD39ucrx6N(!~)c2(Y at _nxC zn}tPGd7{(syOl6PT%6U!%X}?gcqy}xjmzG?hVaVAUU)*>x4+x+60UmsCs$tk6ct-C z`BF&pqb~do#YqpdbQmT)L29zGuFrZo*Qs!ElKS^He(B3Jto*E9jxa$PP$?4d5*nuZFXZGd|t0O%z|oUeyi35VKdE(FfS{=FLZOPY5Sw)^jb6w zvC!ewf_bq|yrIQS0nh02i0?0Ucm_I0XZMR=xH8bH*Y}G_Cr68Y1CzH=QZ6XR#9V53$dr7 z%JU@^eHvF0<4+Q%c@}vQZlLPCjpbU)Gw4&V%-n~4)a}JZ&ue?qKPisOWsPU0yUWroE!_z{(7-S3 z{RVCK*!FIqa=n*(qw+L%l~u at EXb}0h&c6D7t>#JJPvkHQlBlJ?(TS89`Zi z(1}=eqNtz*>_RdnO_hd^Pm|&*pAXEm(h#sbYJQZAg<92yRm+aPSL}M zUhfNfIev1#T_i=&T}A(g+}_vZ_9uGf%nwJsV;3(~c`=Ww${)F`(PwGo zx4|r{ibcfT#q+nJ#hxcPS6(`CmY3noGr;?C*~8D^7ha at 168*ff1qMCjB{M60 z#d$cwfFHo>ZsLVZYXVPnD?2l&MP5T~MZ?7udd~|Pmr=H4Z*4@$vQ~@|?)c(&(ecRdw1=bPqqrL{o797lXT_euJ_rjB-Qa4j zTBu8|#f3MzAmGW8XX&;FF&mXlc?R*2?a;^%6GH|2Hut(dHrJ%W_~a|AEh{LOyeu`r z)&NdFYn#}uk3HL<&Bls{FvQL(jd>!$Q%Wy$EZyP%jj?ukfLk8+%{4In>xHp5bhT(Q znE4Yeh<0P1(PqAhF(@L2-!jjhA={$+CY~c!w6UkbM-k7}n!a(`D2jOs%Plb*`8FQ=Th{dK=2`8eiRtta>zl=} zUvh`*&itM{ig*2BhTSZa_n8yV)tk%x(=xmTl{CFQN6!Kz{1XB(O4 zb929ua)uS;1AS43zaqmZwA?e=I$1B(S<3URD)!e4y1D!s+Q1GO~2t%Ap%IX)$OeUtj9%oneXxyLR=huTbM+i_8Uh#QQ{9-7Wk9LZR7S8w;w*8_%NtzLsAf&*El|xG at QfCGcT)Ji+~6O at N6%WDigBs0+Jt?o9|-miW$D<^lhy z+F6Ean#{cE>S}Cr!)ZffhgW8HdzvZP zyV7&&6SYZJb}sW`3zc zY`N&QOV94y!f}_%pWdyf{<_&lio1f!CAZ(7w%MIUWnTG(!>`MdrL63;h&FIC%xmrS zH22mH+E{?`%ouj2`OLSTSc2cJaVJ>vRq-6m&w9=iiyc1{u4iJ~+t1o8LdVILB}@H? zCCM_{Y^1ojY{^|lzWz7NzG>bWhMD8uw0P)OVw)MiO|tzHk~5qHM at L~D-}=q15dO5x z%<}f{Wt^t3R=o9KzumIjh#S+wzO~5gbqI4)V`DOC_fPD{x5cYjvBUF-jNgRQsbB9| zI9oQV+F3aFCuJEdsimEqEb)FCv zJ3ck5CBS%=7RG3(xY$563fquWchQqM;8* z#*OR5ybS}^1l~&JMt+=aQEzu{%Cn1szw9{0O=XO>o}D`lmsaK5I5^ov8L%@gr?}>@ z^uuKSrXPnXJTq-;s+V^Coez6x#)CkvuLSGAOucPBUmEh@^Kw2ib53u%G9BeSwvT&x z9kI^QZQ-G+zK+f_XQpvg>4n9S7m)RIR4s4g9iHlqr{&3nmU)H+yLY`-MyK`%5!}mY zr6mb2-K%AHo#t#U;fES-iR~w?ND{W5Z at tz4Y25cZQrqtK*OgS{{?6#0ZH$-`uJ%=BrDIOyS6`KUwGA-jBvy&#|}5x?SYAG9*|u z at lE6P!iTF3Y?b(%eI;&2WV6WYfbC^_oY*-J`#duIrMxYc?k*c3*x-yKZ$NR#Os^AQ z(QHYIRllN(1HpAsw6s^uygfuM8bp3bR;d*idB?+u^)jrE`vsbZSr(4G?F(WBjvs|A zYxsbjJOZ%0lr0MmD}0xwbENTXqVhTe$aiheHP%CQl538r_WpvTx9G| zuS-~Jy%6_&W`0+Mcqj5rVun|*dDqIRry@%nVelY;hi>1m4%TU1e?GO%l6`2}US85X zT|4u^t=73W%Y7=fjkQNl>#{SBiltTWjj|f&-dZpx&njY+C;kwxrdTjt-Z5g2v#J{U z%4DO&Z4Ca1i?x8F;m?-P=`k+*_O4WM}2i0XC~q6#4^jeQ915z%_}Ysc#lIZvu1h z{hDl(MYGTYGEVy^uNJJ&s?e+T+1%g!-hYr`4#e>ajVcM_C9SwIk0(pV2Hgj2$)J3$L()udqjne&b< z$6Zidq?Nj(zNtIvo4V7xsXOzVx}(0SyR;CDEjy0(X7$1FEVKpJBJBg*sZR1 zv~TIGG&DVKXfHH0&aAsbwapq2!XYMdDm=;b6>#bDGmPLuk&_4|6LyoVoMInfn<_{V4`8GD|pQmtW&(Z-!&JgAu0;Wgo-W-e0+)sA22}!1aF3v&#@*&ARwoS?tlG3VEey at 9x6GuA`!Nl*Im*iwN(Xt-1S}ihwwRk>{gUEc)nv44GB9t-XG^^vPKsz0rY67by{mku-gdBpPXD+G zylM_Jn$UY!CBwa|tZQ5EQVffJXPTo&o9h=d6AVWRQ*5P#wk+LZVf)S|PfW5bUzFHz z(-C!xy%SlsccKw#KGOnl(%G4rEUZUEwk=$Y zYlEn&9V^(lH}$;=cJG8~QA7fFXIz*#HU~x2FX9O%941npyH4tO*p)?tyfnkFJ>p_C zPF+Od!q(@0MMb)}8>PWWy at 3}Y+loPVB;ViFf at wM3-RXeob0?tlq+gh)#aN12?w`)nA z;nNYW7IUt1z>4-eiTY)lPja^UZGvSIR+Uw_8|8EyC6lnOSZG*G+9T_?!j6p{h?q}e zF$j~s(p5DJxqIxB-bUxA8hi3id6~%)rg&bpVgA!ym~K7C6%F&IhF8M at QZ!lFyQ*>M zdeY8LV(V!w9QNz(cZwa~2U#_ka_KJBIcMNJvoT!{7xvV+blV$uXJp%}%_ZQ;L^vB- zeUenRA@{CGs=X^r?sdSb!=`S}g$j8-*&iFty}^EcHL*g)27?p>mcx5C{vG zwN>a_%j>6t4a;y){{w6}6T; z%nr`Pu*0L-$%0z8ccK=asWatXXq`IFx-L$`QpvKfe5-Eh?Fh4WcnS+%;& z;rEHOcIr05&g4Sd>fJEyT2-?G%VB24kKyP{|+sLQry=lsms2zpu0rdZS}9>48qV9L0bV9JOZnA$|%v2H$^#I}ZvfNRA{ zj1^&|EbA=JbNP+yakAd^(R8gl=Fw!EdR;qQTib%OWYHN|9n$WOqk=6a+fP=yj zECkltXsgSmUXqyR=$teoDy1Pc1hK;+f%iD{Jh+HM8k)kM|RZ(Js8Cnn3-t` z2v=E;(lxkPV>YiEH5tWACN_>dyB at N}V~VZui4BI1S)*-K*{Q%9xEkqjcbl_n!Q&Ts zrf%WdyW-3I*9cBUQ6P-bx<}6$n(_qEd>nN&5)@fIqz7S>#nl08_K8h=Fk>rdlGl#7 zoLJZ%ME$YxbZ}sexz#~jkEb>8OBet_g8}Tf8e4t1IvC?#7aQ+5vQ at V}NWx}T(PmfG z4BpK_5=|zN*CH%vT13xYYzq#YZ8Au#(%3MQm=10yF`4D&a&^p(qO1oG&rDn`9m3&Y z8+(ykCAP+FGt_WJm{s^IgW9-f@!r*b4;%0lu(Olb9`i-x at x)@u<09;g9JUXz6mH78 zD5A3N^f)gN*$80%Mt%hSsP45uSJ9 z$VD?tY}2hVUuUE}jFWy;PONjoI-S|8m4cNeo#9b8^N#D at HXKK3-M!gS^xaU=uDUP4 zW1Z^iaGbkR at r%6^&Y^qVaLmqnuCq2wa(#wIcZ{K1H^C`qn;GU at W|*DFR?Q5H(4TA# zi#V-w!-4Y5f->7->}_NVv at zlNl;?+F^ z+#$O|*XIv&3~9=SjVIIHXq2W_294fx*=I%Wa#1)v%SCA#nqQQ4j}0eTp3L%zjd*MC zipiJX1d5s`$*2 zws-M+VW`t0PwO6e+mSJUQyz at BdU+3BACbi(Ju_PJ)Va(~O%IQ(LG59AFmi^qCp>d0 z#-&#)qqwqze|U2aRk1>@kp at dvp3`L82c>1pVwbIh#^#NDPWYcV$FoYk!zOSY<(G* zo_F!sB+Oxx(iUfBSnISkhM}aiix|514U-ZRKD)Nb!BS^ofM2pOAn<0H6I>xMiLm>v zy$omhypLZp#Qn?~F>Jz5r;ZKnip1(9*}K~EIt!DeJFDTkJz-_v7#f?}i7j8Jaaq3) zBfH$TZX9-QbJ(hX^qirC`HB0%aBbPw5~q(CM)H2yY$t3oteo%#r<#bZ2ur~>bsidZ zESm*S1Gy7~b2~BGE-(#b$=(%CbedW6gOEj?qvwQXupi=>>~idc%i4hN2Ao-w6TGgX zvR3ABx at KP2j-_6!B~7nIh8v5H<2+86Nnh86E`93~w!oSgY7I&W(OJpGRek z-{=`^9vy;F#QAEjTR at xj#iECYEms*$I zP3x|4f32Z-ogI5uO?<>naidGonYal{nzLzarw{9CzIRpavim}CcgD5%xZi9Zumc}A z!gQ_f6=~k=Os%lPT2ag<{W_JhS?xQNy1lwp=IVJ?ifxo+ZUeAUSG!EMw7XV*n<-Xw zS-J6i!qiKO{RdxinhEA)^}^3a7N*#@afq at SM&ly3#yP($^Ro7bm5QOA$sNu at eC}h6 z3v^QJpR&EH_O9A5)#h{NNjp`q>$F$MZB=@n+Zk at 1YUU@Ir=T_O)Ev8b7`tlU%%VO% zGZnkG#s=OI^n=p%AT8-)<)xTen>@pTSR0$(?{mr at 8*7o(;cK&u4STz~v(64S!mLX- z1xwi7Dcm}=4r@;X=zH<&DNzm zu4MJ}c`akbxukJ2>|G?``NKM3Rh!})87sA_F~*Ip0LcPov*|U5I3b(Od{Sf5+TMxA zVGLNk%QJIJWQ;y_Zn11pA2MibSAEJrr>R9SINYIxyqMIQDsQ%eIMv2sws`e6Pm^j< zt91CS9mcO#?#}NDZo06+;I;DWACvuo)p{E|N=H$@S@?!qZ{NC{9Ln8x?HWEPQqOd> zW65UJlE!A-%yG3)r>bFQYwyH9$!TT-*vUG(J-dB`J2Y at +*ky9QG)6b~PAm(wnO%!I z6KiH4$`=mfIioHx{Ia97>xOW?um?(Y((Kc7>K3$u&eY=VcD~S=E)yI?G8KRWAp2xz z=&+u&GaK9TP4!BqGo;q7)9wJnrPussP2nIL&bY3^V;2mXIEMPy33kNQyS2W5iL6N zb6k?miozOx1?8e at Yex}VMAgo+M&}h)A+ at 53%e-)racaeqqABWPA1ZPSK&v<@9lC-o zhC_?4g+8I`xmYl!G0T;9yx_} z*Ry$!xUlHS+Vh0tO}y-?O|wH-)wV$}xS9 at Lz`Cj%HeXEY2IE{hhfy4GcIM7bVZRM< z!gK91Io0kur`&t2al#q6%CaT{{RqaOiKh&`UF5Y=f4#=qEBvYk$PnO)rnebMXXbWpIK1sQtIV>2?sb64c+x5DQV_q*-6q&Nu9s=-6zqC5 zPMa$&=nRh6p>h9)%i-P?&arKM$5m(H_GP(x+}W8j#d!@cOKdgQdqf*$#?#=YU#zeN z=`5s@&0pU_Dl at i_in=UW?)eOH9hS)%hjI>+GmbH0o5$9Y-NtE;hPjvaOqkac<}g^N zbO2FS`NV?2CJrI93Ya%NwQ5FLwG?sgt&VKuJZ1(U7L&;W_i9;h`Zs7+nVoRFX at 7RrI-WhIbCr=)DPqU0Rq76^ylziA zFQL2TQFHyZQ+?}nP4nV!PV8*`VRg}rTOvi}j at T#Ot~u%1+uNEM4|aCkFbyBu-M~;D|F$!YaKIMRPycA>}i7!8)kRf3g`yA z6q{XqSy)t%wNvHTtw&;e4IX8PvG3;i>1RB1_?h=sU7_yj(+=6^qc2%aeab;SKOS3I zuW93M6I+m~?>zR`*Tv3(Z=B{G;5n_`bZbT0w1j-)i at RUVVjZ5Zwoce}#MjPIddx*2 zJ#f?_sl=AKwe@>&lHDiCh0RkRtxvoukGdt~q+F~zl-pxH;v;Pyw|ViDkxz11eXO-( zRqZ32Z8N$STl{q_^cQ>ibX*E+uc`F8Gymdd$5YZ;9`D*8znXgDQtzX=QbSzxcJ$2( zcKxZO+U<9jOR7HppZli%z_l0anmPLm=D)wvxHk5X zXwP1)w7 at m@q~r3|n`(wy&KsGj*f8?oh~$`VTG)FX!Gho)I(fP=Iu%C~L(+$G5<*5j z#r{%pbF2)}@9jEaRF>W;Sfa?ASCQv*&Qt73!ja?gLcf|c27+|P-iFEFa;bZz_cMS$ zE5XC##L7x at 9Q7ojh(hJ`d0YyT5iUv z!~H>Z`wwd^GwT(X`g%B zL8-Qx@&cLM{qjBThn3AVbT5o)ycbG}l4;j_6IcFlTJg;%-+70A8V0XDZU46Bz3el; z8e_|G-sp$ZHW!Z^d;6NEmmINb{h_Z*Zr|>ZUwYvE`cO5e3ng-lgMaTjwk7l3LfJ?DKl*zubyXtDh^g(a5RUHC at N}UFWmPUEyWn z7OCZ*Pl|iF-x^<>dNL~9 at _51Hz3Y?@TJOHK!b8G0FYbx$KPrk^-+67%)m49T+VSO{ z_PS=jO9!(&?zdY;%6w)`UD>uT at Aod@G(*qfHy%Gmwv<>HOlqe2)UGdn9sH)(w*wZbkdfOekGthA0A0}1aBJ$4m#+bd6t-|U;?Y`|mNAo$x;=VRgM>xhqw z?lxOEl-LaH at 6|Ul5l{6<9#K@>oLZtF^YyQEq1?_shuqV*s^9E0S`d*WHR7-$ecNM0 zVXxs=yk8C;+VGBbY~NDt^;*Tg{)&;s3Qggb{atwpeu;;Ze{X19C*-oD{a=T?(fE^I zpVvo>nv{oktjk&#nygw9_3!GRt78>>n0b#M_L#J6IVd3UZ>6o?fLPv#nm5-RvsQgk z$~x)wGo2B;OKWPg$%gehd(7^s`iW)Kn%rC7uYWS4`GifJcCX3pr_WuLkF9uX*(ksJ zgMm$$VrIHo+?P=25Y6pB7il$|7f>~Ayxi-Q6F+bx?^@lecGbuYDfTCXEKBk(n+Rx` z+jJgTZWSKNpR4@%_k)TU71Q|oeAm`p{RRfsVec&*vbgIvF!FAuI#=0MkDg!LRp+_v z*Um1jsVvV=z8^O9Mid^nt at rluvBi6jTXQkzKX)=8VXu7Vo{=ffU(ukoGDXKpmv?%5 zuGQy(o$v3a)rYTgbv?#Pw+LH$sySlxeX(a-^Rcj{R>2Q#3k3GhX+2XsTH79{op^bR z_;}Cv8#>;(&hpl)a%YsH!{4OGdn8YX_7<)v)IGd at _qzCfg_XxPI3F{zKV0Hc_i(y< znb*g}ZG0JFCm#ND^?QOwr%%>G#i)kDuc6bYBb)b&dwtt?)8(mNh2x|M!yoJy zrP&H-%W0j6jbKFlcfd7I&hW$1FZZm%TFOoLGGC1KNSI3cg&@A{+`2~K_b-|Tw3MBRh}%cB`@I#ufv`xO=6 z*t)E+{`?^Ksdeg8t%l|^X;PA34GZ6G{}$)bV1Ic1D6=aT@#}{s2ylwx^y8}+? z6&kK3qsiu4i8`^aQk6e`*4prB(0 at mwRihqMcs_g-pLihopOX)i)21&aI-GhqWb)Lh z+onJBOxy=)WpUpX at 0%qoXAC;`YOj@(Qu%vAFzZ{_r_cL6}s}j z_;}=XqSJ1%szrQ<`u|;dyIpwey_at`yJqsu$-0$%TW3Zt({Ov{(FOev)Ne-guGCD) zNLqQa-8Hd>?dj>MDK9YnrTA6dp7x)6i`t{t*!VhgizxlGw?Qp?alf)#+=q6DtXTr% z&DpPf$IbZS%-7oG7bF8HL6_q zL at 2H;Y!~d&tydSR&3F6Q`$jSPx$BdfpidJAehDf|bnMS?9zHc!rg^PXp!MS)J%6RO z2{>wxr8Ccd>1giXRLOWsdu%ZDiTt+rLEk#{qZaPPpD&s@ zsw8T7zxU{EklNxg{Y}xs@(hoAGlY3*ZlIzRD5Cl>;~)1yOm7}+lNjskDtB7 zYD#|Yi@%SDeK{^2_j_w__-fOnR}YGcPrpC3-fQpC%(J3D8wF2CC?@5GuT~w-HIuTk z`TFzr-g-Ba*2Mmx`&y813eyA4E@~Ia#1Bg4}0e~efjv}Y}%0nulighL!Q2m?z?kH z>%(71-rH6 at 4;S!RnQ`d#Wbumvs}pVol}r28DvwKSA9aj7UGDV1`@73!-7IhK&bzp3 zT`lv=_kZJE3SP^;6tDRmFUkmeB4pc9bxPvxnWZUayX&9iiRH4S*QD6iK5IDn(O%@) z at VhLf^!WJLCwcpV^@BBrJ%cm8*GbLnKN7+=-BrIa?^VpZ)RXP`IlBKjWOc67_G;2! zeOxYVso&tgLGPy&Kc9AR2$sm`osd1`_*wf=o=(rIfAsl#nwXW&D#m>|+8I5$iJ?D^ zS9*LF+5Btt=YMgXrvDX&`&3<)5A!rqob)-6>REX7O^saFho5h10(+Z2?Kyki$w{;- z+~aJqSO)w3$!0!t+xMPEdt2NeIiwz1e7S0v$(W7H3eW%`c{e?!EtY?9z{U z*Hlv1G;P at voHz2{39rM8#|}Pv)tt0z&wSOUguQVeuJz|cJ_w9 at U>&5~{Fn6)u};(R zyi(nfxXlYSiJ)tLZVat$URX%R^w-j} zXKR=29kabuIMU!HJzaIE^+?XZ!9KkpuG?$ABpwYmGMzTC>HD?JF+1bOWp=|IpF;+F ztPYpI^p?4zX`s2p-8oQi!~P{Th8Hg`5qZ=wzmq?EOM9mL*9EsylU}{{y~Oj^)`(Mv zdakopY<=CCFA=Z)=+o8hQ6*EupIq0*-zeE~?C_(e!$wwuO_rAFs~R^dsy)`ZVr;LI zX0Z6;lKQ((CBKxfUU={6+bY2?YhQmmd7wO9@#!fm at 0LTPiQLE;OQ(ri|0t}nd-0ZQiN+jL?Hybt z6PAzb9=3MqnpVF37 at H9H;jP~E!YgZ at 4BGB?$iG>&a!&1=@dtbK#vj=z3HjW3>Yx`f zpdMY-^;z(ZY~E at 0;%u*}*8|%h z{g0HJUA!LTbqQZt+r+aTV-muHs{oR zz2tpjpW at RiRhzzP?yNgy at ObpzI>}UD%9XRNm9>$dtcxlKz>= zK54K|zU_J+%cbEsE1-Rq?f>>C zW*)t*pYo(#>zM}AYHV~>LFfa;!aBPJDLalH(Rx(qhGl6QYrPknz}Z1?rpis8G5rLCC{ucbMz9lLt`OiGtxLS4R0 z`=uw*W(ybgEGmjklxUyls9aGw{p#CdCR26Ppjz?K$>^{9GUTGf(%)95Jn<>263dF6 z?rj+IFiZ3P$>m|WK0YtUB0=f1{&OugPqUjD1H*!hvS-D{W+_)Q at BTO&chdgTvuCG{ zb~o{^?^d0=+HsHa567Vem4XebwSrY^&g-a|8z&Ar9dtV2lM?au#6vT+=R?U_ z=Z=lUeD&TLU;X}@MrON)grUS<-7L-Lr(7Ra8oADNXBD2bwy=!Pcz9Y|i}AoLK(GUJM+g`Icz>Vk98c81Cs z`B_XSzi&6)`%5*(yX{`+84gUg4!t`v-ENxE^Wv^U)J2tLS;rfi9=Yi9G*P>FI5~JYd2h1W`Q-3tM@@HV=_tqF z-evaXxYBGr=XsiL2XCGIsQ6qe(uLKp`QU`9YP(5}<;ge;{ldYCkDXo;Evs}Yd!+5x z=hJ57GQYM5>wkB+n+oUm9gB-JV3 at Z%wS<+e(jQ!?R=qGIKUCb}=ZM|yhcVTkDmMQt zWuECaD|ogu<5#TJ*!wWXNQc)vi;+W-76yL(Lw0*lsvYlteyIO>^C#ubPf_A_xu$B& z2Qk&}lrt>7+Z^qd_Sorr*!Mrk>l{hsNM+b$S-5W35f!9G&m^%=GtPN%mUsM)j|> z-|w4w&h|UJ^U$_T%sUdF8}C%Dp|_W3w#NSi)cND3yudSX|_$T-`6XI|vkKh~{=?#*5;)4W>mM$KG?j&yH%aI~!xv6gKoV<+(8u~8Q=^Wt5rP-hGGYq!UZL4~$r^^?5uD8x@`g3Y))r)N$ z^;jjzHPgj)1ML1#iH5>@FP6*!eWSRd&<$=?+)Q$p2Uqf$n0f7g2Lg#2%BqUv*Ex=U at xhky2-G9z+qd^mrkucFr6jx!Zi zZ|^aDG5dBt`(0GM|4`ScHeD*7l^mbA at 0G^9Es-d*#mH#otB|502h9eR3=eIM6F~_Q ziP{@_0{<;fAP3F9qYj(D1YYgY&gYmEr!JB=5|27)%ZWUpiPAGW&qv`w6 at mERW zTgzusicSpI#xPmG&zk#vdz8M<^K97}aig*goby#2CF+w4F0OY`HGH??+qvh3Q|~eg-+0FT&{@9qhe}K5NEc;rnyqeC at diD%NmGj`s7oczZPJ>e4V^8NcxRX1)C7k29&lE`q?w~Jn* z+BIxrK| zbf2_ at w1ArQnD>&jMAk27^F;6Zw+m&SEskY2HtM)t7|R=r)@~Yp5zlZsJ8`N(C35V^ z&Z&g#mWcu at -}1{!wFlkV!M^hBen+=sul0KN-;!dndl~f;RZly6>`pB>(_>{nbF7kwr50{EGrL=fgIM0}S2-5$Za&}Dv|FuS;od8jwHq17NxfIp=sX~F+;FYk*Aq8>Rc;Uw>MVZGv!rUB z^6|(HIXBk#>ctn_8QScvVdsuEJYUi}=k~4teLf_-w%BA%pK?pF)4_y#lMSajv_|~i zN2xp8rOTiC(b2f^fRezujqkcnUH5YNpqQI_ee~^`(%_$3&QZaKL^=#b6V5DCdv$kI z$gh6IXyC(ECCZcmxGbiw at jYqcqt_-GpEXwc7h+nqjtd19U2y)XFk<6vj2+}6hv!3}a= zE&sh6jjmgr;gMIk at QjZ=pOyIIN46SPAHK%6mtP)@w-~-Auu7 at nUEKbtgZCK9_lr_4 z6yARIzjym{4-du^$9DGpkMoJUvu$0$ivO(Q*UC9;I2ZY7r~1h`G9IrBYeWRYZFw5D zDCFt&^+oRgH=(5>^T2tD{r7l^ZcA0Y@`&6&A$8FCeoAg_$kZOU=uQP`ztoEsqaCHD z%iNDvp3ECRSkW6kU)?1u^kaT>hS-ka*{rYCY0kGQ7lmaS#jS3=CHA4sSmV^AJn5qN zH_d_vJMS)iOaJTG>H6mP?mo|i_7f^jx|^&kelB;Fb9$4@|5U#rJN&)Okm4SVUuIv~ z4ch0U7X|QtI?8Q%&|sMaNwqqS|EBJKC-!?B{R>QOOeFDep1NSXn z!bmi1NauaN^QiT;x;e?B=Wg!T|8%CaQym5^?NHS-E$Vy{Y<*HUiWZPNX8N^ zTfc32F)yA)|LSG#%et`W`~sDdEsb-f9B#diGkp56IWbZD;dGyqg5T^ow2S+ii}dzXHVEqlINC^>)lZ-J9^(WC0eqcKYc zdQWtQReXIuN1U%NLPh%d8MRf#5qJD--%Mzxg*r*qi+q>3;xWDJ)9P3Ca%Z3LyJ}q; zO?1%t at P1YE-^#srtY0tg4G^}-346TfXuD}st at V+bpNGm0?>HE{!zuQ)dbSrc(d*i& zpOK9nqjM~(hg|+TS0>h9=alY$dR_dp>h3_ zPA7T4tiJnnzX_T=<3PyfTr>8~rY zyLybW8E>xl?m5}dUFytBhdQgwM)`Z#||bZZT6gy{vv7Fp(>L`(3r?iDeA!z}m^&rMHW# zAGK}wbLGo!?`dz#VhIK|4n+kvj*NV26K3hFYXs_zjJ$7K)v6{MHi`R5m!Wy!g=MWKEkp>)f6}Z$CqQ?^z6)1^U;Rk%Eb at tBrUq zzV##pr3{X&Ew-GTY-n?0owFG{)a0Yj-IffTg(IM-yF4X4Q7ffuzvBaVkF6S_Q;k`>If#Y zBza?oG=%5*MFd at EM&0Rf6n#GtJIBM%p;(wP(zbz-QXI&P;mu>M35*%c6tsI+z1n*z z!?CzxQb)wDxH_TjCQDyB|1vYI?WAA-oQ!Wh+XCwcM;;VAPfk8C7RI$dnN$xenPSS}IB6zrTFY7KUHs;^2VU?pnUlW z-m6}7islZdx6PJi$k=cX_qPSf4)7cD47aqIULEJPI-k$TS=J>UC=$dvctWV0FEBE| zW`T{saB*9btjs*aIVX>tkSgC*JSuC&ryX!^L(YP(xVBDN8Gb|VlP-fMS0m>X at eDs{ zvy`ppWzNYpoDeJ*D(1f`5mX&`PJcqOTq)3g&g9`ipR4xs3b}?Kwkck<;IrqM+&-u* zOOJRbj}JP_G6lvq`sqxFmiGjy1)WgGx+?uh9!!vHu`BytS)!s^`AT3SS)j%WjR zT)&Ymo3pe_xmZQkUZ_xbIHXv6BYWk9Vz~^T|D0i^VrCG_X;56&UcfxCN%EXPS9F`& zrb21f;&Sakx1e(x6T;<8-d5hpk+!q4{tM2 at bR8a?ebtSZ!82LWma&PwdP3r=8y{oV zr1 at aBY^xAkxa(|jYtT8y1m9H|9?sn1k~Zc>w(f-E)gpd2ZMTn-^7W!Fl$Cl zRHcTa=sxc|=jw*JQ$-5G=h?Sj&$Dz7c)j{x*(Y;Wo1_J;7Imo+3l*xdG(H|Et?-2R z%%#^_-{*yv+(}iKRkL1{=Y at I4|7x^CYd2~e-xhvh(ji!*BI+3E8kHmT{eWmTuaI$* z at D1Z8>EHho_2M!Je=W7iLdjjJM#H#i>F at 2Lj^|r0zP8=ywyh)mPPV+ec1>ecj^1}E z-6{H2G{t=Cw?YktjEXeTo>xCO-Hg$yFiBuR;s4=?cz3zLGi9YY| zwF-&zruK+h%=VQGO$jnge7)k1h3t at EjnZ{*#qUwZ`U1b-DkKU`EfTHf_FWyiZ4+~A zNA4X9r6K*AZN~aCzn3c5aZPO(Rpap$3l%?a82>tK6LYg1Pr;49#ee52oVimi|AEif zFmUWGY#)D+h8_$~-t at IB1r^_}IRYmdgf=6Pl$$K4lYyh&bk>Gy!Yg>@Cy@=9IH z5!6)N5fEW=r2~4dM&6w at 06Ivfs7|0W_ zC;vLn)jj!_dG747F`u<(jh)%7{cG$t&pNusZriLAYwV0>d9Sgvm=&<5W#g<%Yy2+r z$nMR*#-qMBKa^+V-uzgefA;1F^X%Wt(&TS@>aEPrl{v9gbfd#irUF-Ghl at f$Wk-)O z*X`0q6Rw0(J!7uKQauwcW@(-=*PYVpD6YT4yrQ`N4jaG9wKZ(~I+tyoNp7>}$iON)R1iwP-FuG2$#3IRVm#*Mi?mkva6rH3(Ox%Z3PFXuii zPJu_o{f%cesIo8dytHMl<-e0Ru~0O?YbZq_V4%ZUforhCL3E?Hy8!>j{0UwD{rMAf z_yh7M6#4JuPiTk+_zd+Z1dMd38FPIvH4)u-W=KUe;LK2rLcnN8hB4Q#(rgp1zEUq^ zuKrRl6Rv?$sxVkOZo)NGDq_qvTqL10!4&yB6XNhyRiB72bZKp-#Di3?xCc0QbFZ_?_(=BvkK`4gLWEQ7; zIYs3DMO#+5TSmx6iJrM&8?R|&Ta31w6lptz?v8Av?NI8FXo at 6x+D@SluF#+g-Ldou z!&+Ffuy|q_!y=3&0*g78DlBX0Lwv-sSYgq|;)Mm@%f|wX8WuM!GFa at fFlhOLFJOdE z{DP#FR8T*JI!U8W&vmLZf`^lMI14W=Cy{@NgdL_bU_pxvzKD!5mcOy!fec0=gD)nt z6^l6*%t6Kk3uY%{hGjDrOj*VV3-XxAVlhvg#vM9`LrIsf?vMK}_F zDi`6bxZ$(y at m-2=O#E-6E&c?XfbIW0#ZOp-5AqMfQ$>6i70jv;t-R250Ap(XlaFXl z06sk!%b!4;e3m?3DZ?ukc!h~qGBDYA{C%t7K`#~wEb&;X|2WK~2wy at 8E*pFHc((}U zT2ZbQXR8%o at lSu$4|q-DA*V|8^?jAhce^%5E%qA5a^FU4(7u_b+$5~ z_D+HW_X9Y?3}bFixBvB7>4CD60yCbT_=w!Z>dV>=$NDAFA_ZOc)I)2opbPTL9Q z^dVKU^vsdUq&8l~^5+U4*ce5N9`^LGr-wZ~>}BG!ZT~FzxMo~6_povxtHHq?=)hdp>GfH#97{A zSmt6`iDe0v4OlR~GYVK1VbR1Qh-D2HNi6zUW?_-TB8p`l7L4``26bi`7F~S!1?p%J zge3|~7#2*|0AI at 1l*%XK8zdTGv7p5cKcby6mcOxVr{ypDE_L|L3~- at D7YitR8OFRE z7nt%b$_vNH at QEvE0;}=DQhNLjyEpK0TPbTEMeM?FbD4H3F|ONm(TA)~{Pdg1c;bz1 zc(x5!6}YOvl`^iBag~azZVb8(%X%!&v7E*-ibV)Z3Y-Mqh{shtuB>rofuAcIMVR<$ z8JI!~3i?G*p8_1r0?e%db1T5yX8sIb8;b}Qocl8}Snvx^@zNI?4Z~;7#)9uTx(Um2 zoP-tlG4Pdb=?^Ev5K~RZ=gMHIM~%oo3r5+Cet*8g9K0%zbR3Q;9F8d*j;R$0UWLU8 z%Tl;NO81S%f^RT`BQb at _Q#dOxLh;}l9^jZv?ZRt+{sbfO;Lp=oJjJP*62jAXG{{C5 zH_WOPO^YxlKfE$y2sj&XF_u4pA$TPcugKsP243;UAuGgWUGW#4jbAzgPu+0khHuTl z-;Y23u-W($3Ha|os~q-Bu!phv;?Vly(E7$;`O}(-9syXcVp)$y66hh1B^zZ1P^J|h z=a2tpaB#5M__i||(Bgm at fUW=HvAGIuiX5YN{C5hF4BJP~TR+k3oV#N5lG<~kWptk{ z{Exsyt0=A%XisH}N}GQwmfl75wl&{FUY48GJ+Z-}=YP?r^UZxPIiHsid~_O*U9d>t zWi3FL9hCJone^#f1b1(wSHh@|TY at PPHK9{1$>;_lCl)WdZpNdmKbJO)R6ge`NuMFDTT%8PbD+NuEbaI zz`axwkSgv+{yew9^I7oXG{V*wmr%L%PoqDNxN#|MjLS`bF1O=y`Jc-_U-!VDOY=vZ zjQeLVe`(uyN8RT5h;!?*lq{FV|Np0N?9^yc>|2GXU%o?%)!o-Q4%}B*+5!i=iuTTx z=TyF0GU+B(T<)K_aw|K&RDHO0O~f^h13!^%AoGZPBoYm>hDbL^BoSUB${_qi-Vxai zvYJR8ku;#1llBNHdXNND(1&76e^dh>U@#5t#v at ly6)__=xDBOED2)A|9Aa z2 at y$3`8Jn`5eT|`AQAzBxpaacg@=d|2)eu_Vh)12)DpRk6hR`6An5XiNEHa?G6I5> zSwzH%GC{UDgjGzd~~UPOrapi2o6X(A(-OBoS;q~N?*fS^k)kwg&8r3VBlI4^1-=u$z% z4g_Ex|9(y1i at UYiJU_U&Wk+=y3`XX1i at Se zK#+p-!T>>+Y9fBc at BBxUceCSL9}l;(B5rcNiKMZ#{SS5*O$sP;DqHtVy0MAq3GQY$ z9(Xd`Djaf?yCt-1NW1*> zqWL9yQI1|*NG~Sv5V=o82}Fm;Dv(ejtBF{GQ0Km9L{dNuh%6;ig%m|18X#1>FO7&J zh#nCg5TvLQ at c==Wd?Gy{3?jTlRFSfrhyW2=bh$@FoJigVA}c_UvWmzy5OjG;BnCvE z$YLVtNLfKd83bMaBVq-jOJqF=QdEdIgP_X`BK07cix3f4q{tJIAkvI3$wah4Fc%dN zq$m at y20@oBBH19AixiQ5q$m;513{N`B3>Yvivb8y)QFq~L6<@z;~<#JY$DQ>GA2ue zkB9-f+$ADHpF3*W%fM6~XL|Tx7^P&xcE{}+~ zfnY9rAV|S^@d81Y0wMz-mD?+;y zw5#}%UR+KuhSG~>SBQubi6Rm&NTiEMGRO)d4?)6-EF)42B245r5eE=?BC$j&ks?MU z6GVu}FCyPSl!)YlAVr$U2nf2ch=>u%mL(EQLx{ML=1i at Sqi1Z;voJbxBy7Utn1HoJhK#(FsWEuor*hGYhcwsI< zM5HLCe?E~AB6{f3P9y>Zb4dcBl>Q||%0SR%h=@4|<`P9D0V#`!q=2By4$5=jKXTv9-gg7Z=hf-WOO z>_9M=7$OBo!FkC5L6=@4Eg+anHV9I1UIswWWtxZ~2<8$=#1|%9l2}V`MurkuL*x(gU;^=Y at 0 zc9~rC;stt9=@q at WmWT-vi_1jT5s3nsMdSvN6p-~qoIsGGOQaTro5&R+jvyLD_7bT^ ziWZSfkl93T6X^lbCgKBv6hk5-MC{Qekcc>uB6T8Lh^QfDEs-z~bh%C>21Jv{5fG&4 z5UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZnK%|#QE4o}Hq78z%m=SS9iUyH* z5Oj$qk`02nxPTxNBti3}h`n at AoAx+D@A2fnCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD z1?MFj1YHt{41i!RXF-sH^D<7vA6#SsK4I4{*8 z=n_W69t3l-B2t7DoR>WoFG}w43lSafFoD#&(Yq* zp7x(R%n;msm2+TEAWNiVL6`rML|IPI@^a38{$a)j+N0aevgMrlbgMwOv2;sM|Djt= zx=oPflmyVfb9p9Zwkni!xHhpvu2JNb?G(9)K$0j$hLiYC;td6ONEneOBHuvNh)jYYg`0=~kv-`0iijAI$191H5?O;3ej?jI z(B&hMXpl8TxB+ zq6LDvR1!Ik6agaEAn5X$NEQg@(g%VRJ|cP`=u$<*69jW2QgB}ELC~e1NFfO3G5~@UoEHWNx>OVKTmFtSsJw$6(t2r_!7{(WX&1T267d)9 z_MZq_$th|5ds2o?WP{)icG-c at VTQ2L4UW6_Jyzt!m7Js%?>OJ-wKH^kekJFS!aL3_ zx^K)NIFth5K#s}m;Z=Zf#?!h4}ugGBF-S_@`6Y`2<9S0 z#1$#>L?nnbp-VCmZ4k^w1q3O|M65y3C5uQl2<9S1q#r3tMD#$=C7p;D2&WiMp>hfoWC~#`k6(*S%SG?tDN}8}!+D(QTORuvmq7^t%^ja6)^3v@! z1&*cMTh0x-T}-z(>6V^;qFW)#4BvR2mBM7>T5%C1UToQ=%Aw`@>9tgVh6Bz at + zTna#tB12>v1YOufgo&KOT!M&5QOb|`L_&z at qDwoG2oTIA34~I9EFn?`f-XZu%t0`h zC?W|+SwtiS1YLd*sRF at VGC`1n^U?!?E|Wx5K`@svBDP4ud5IzN0$sX^q=R5CsUS$f zd8r3Mmr)|FAec)$k!Gaeykvu*OCOPb5X>bH1SvQ#;~?lVLqwX$Z_FixhyhY?ULuK{ zL6=SaQ>?Kl-6fGi|AVEZK6X^lbCgKBv6hk5-MC{Ndkcc>ue03sQ zh^QfDEs-z~bh%C>21Jv{5fG&45UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZn zK%|#Q3%Xn+q78z%m=SS9iUyH*5Oj$qk`02nxPTxNBti3}h`n at AoA zx+D at A2f_IRWD+Utst0-7YI^tUIy^j zg)SjP7$BI71rdLw;Jh$F&?SaQ5eVku27(lvmsSvTi6r6=g1OkQ9A zhLiYC;td6 at QzY^P#OxZU+aJ4>w@#IIhp=lwFV3PD7t)Kdm*~aUL=-_*5qV2wyE&10 zL at Yrr6Zu3W8AOH14-llxA))~iO5{Be2M}cU%iZBrmkT4=mM81Kj5t#%*3O5k} zB74#06%jEaPgfEtC9(!7{6w~apvy-h(I9Jxbb}y;mxwY5y1XN at 8)P++IwEOE5hCIY zf-YZ)dMnRA=n}`IFFX-}yh!zOuQc2`EQUr)tgP_Z2B3U4qOCJbQ_=xC%pi31I zPY}$dnaD4sh!8mof-WsY#y~Ka84yb8<|4vJL z2oTJr69g$dM3g|#^fgcO_?FA#KTCejarxlDr~1?NSC zh!47y5RoP_jJcE%(MJl-ivo=Q58iQp(rahv_WWv&^Zj?6IJ$M9+hDq-r(fyTlWu3zzw-Zd`%7J0%~7UEqk9y& zjv{vuh%lu{O%h3#B!X6RdT$Xa1JNSF*+IJ at w3~z7B-%BkU4DAe+?ZaJqZb#_iwPHq z+$W+0qC;dAhzXI^L at Yt5bMG@EDIf+!mJ+E#iXssW5GvlAM#K?BkBANkQdEg}fS^l0 zksc5R5ndvyNLfxqfQT)++#@1RwQULcr at 0SHpmh@1sMmqH at rAehT+BGQyHDoccqhyl9XB_cxP4CW#a zLMfvwi5P*P%M&7zAehTSB8f;*Afg0Y9Q#6O2i%n zbI}Gt3eJlg2)g7EX$8StM2Pqy1?NSE$PBuq5Mh8|E@~i1!FjOYIMIe}q3=uX` za9$W7!HS&T49!V<|D?B^DLpfGJ>w`5lPJ!pS{y6GzqZSNCPb0bsIEELdhx+qj+Ueu zJGqzW0_BO}C5b_9orZ)6aA(M490mqc|>q(|%2t zzeFfSmQ&=`yA-*aB0oTwlMp0v=p&IZA`L{?MzkwQyPepLq}>VHRlGwlE~ghm=|!{c zL_~>15sAM-q>D&0$OB@#?T1t|-Ngb}eumkuJ)APPhtfFK3)s{lclVIsRhKQNUA_^?0>NA!fgnYKNFxZk zj1ln!!CVrE^dUu at NFE5f^b;8a!CVSJkRn558U$U~M1+ZWVlF{Mq$s6tK9LY2dg#(l zBmx9;Ndlpiz9mG;K+t7~h&c%65=A5dDT|1tfS}6{B2^%mOC|_Xa9(;q&}EW{DhTEh zM#L5=I4?0o^3bK5NID4Sk_v(poR at kKbQvY$3WB-B6KO^Y&Pz53y7Uq02f<>b+=G~F7}ZKx{eY;pz1j&7~!mO{_cQ$xx$oMp=%U+`nNXmbq5 zSAm|%*HUCKMgB{XMoA=eNvx$eBTa~`A##WaM}~IYvAd0S^=Y at 0c9{Y6;stt9=^nkf zmWT-v3sWNNh(v(|61hPn1!O%DClI9Q5~&3_Pvi;_M-UAndx=ydMTn zCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD1?MFj1YHt{41i!R zXF-sH^D<7vA6#SsK4I4{*8=n_W69t3l-B2t7D zoROXZbn%~x=ak#BLn)l}^`2AzN4Z-@ z#}RBv!eVA at vBk_R3oK@4W at w9;%oPY(kuaI>>HyGiK3#7u~H9U%%pX{TVmX=CQGt>Fs^K$}H4 at WHXX`kT%R2dz()E*o!B5MJ2v|O{w8-~-)&^J^`f0%6r{~24;2c|8 z=0`m90<28^6kzZ(@}dGXj!!J|GoC#GR+fGSF!-5yaRI5vCzkmY&(HuXYd>Ka{4B%p z{s$dL%l!6dae$S*pE3-7wjpR-C%BgRW6zWTD`!7x82lVV(6~<0ELg&hH}S08{j_25 za}7b`I!Uw4KYPXoSb6)2!{Fx`M)bdZLYH~Jd58JWd_Gqkyi zatNZt-ZY{GHFZGEXXdv4#!pb=s&^M=;uCk%DC9Gcp!%<&Lr}^GqFw!+e?PLuKRQ+Z zqthj*Q`J8@#r&faFV?1xXn&0W)+QeazG7{9fj|gr6GpV(mIrH70tEb6n^Yj+!`id} zfgsi<4hTRz4G at 5MTp$4P+&}>0p@{Zhf_Mrb0P&bW0OHw!0K_8(0f=V+0uWCS1R$Ot z2tYh=(S9NjPZ$Is9w`VwJYx`mc<3Mi at svRT;<17N#B&4zhzBp)p9A7ag8;;%1p$Z$ z1ObSL2LcdJ8w4O;F9wQ+#SL?CkUAinJ9+1M1(|)4We}zI<7q7v?_=l0%KMTPV3)@X zOMuM2xf|-=8%D6n({{Gg`ubFt6^3{GsU!;tg#ZQy1_#C|rSUDul5foe8VrmX5e$qL zbl240mf6zY-qOaL8FXoDZ^vwB?!qi(@9d)LU~USu0Gc~7nc5gTJEv&qs$yCK{BRN( zv~e54Y1Ws2Xp#P?XvxiQhQ=;IPJk%1YSvGTGb3I5wS`~&R^`@|b0%N5?I3Ka zV>B*@%H4e$_x;r;Oa2h8Qh{p6FYM{2>-yE_`fBI%?S(0_hO$E`{*SVzqFL8hzCQ&%24*ony-AEX z!AJU9Qc=7!O^j#rjOVno$4DdCctH97g3sF}dvgh!ks>de6U4A+xlou)S;3N3v at kzA zgq0NF)GG8~6V^~`1D~1az}{gOa~d0h2!7g`QvE`hI(Utd|5yw)PS?IYWjR}}rk*KB6(JT3l} zf3{!`2^%Zp*n#ALtbI>uMgZ2VS at Fx%!OrBHheTd%Q2O#Mgn?SZQbJILDa=p0J3fSZ zmsNlgYuN!;dQJ-(+p7ahYwm8uUYuy2gg)4*6xBl&^H2_WKb2P)u7)F2z z4kFsb>Oc%@uGVxqE-U$QcvDXEq&FF67QMpJl*=Tef?^h8H!G35qoSk`j7wKAIl`mu z2n#W5R-!7a^t;y4ixfHRZ9pvQZ9-(6YxXc6k^QbbbSIbUa2;!w^f_i7po)Q6I0L>c zw}FS%G8wGxZ_aOaD)8)>fV|rq4Uq*7VVXq#RtI7n82Si@#~damBJRQWlQNZbW{^} zjFQpqyv7Z%e{4wpXfQ39IAcGPW_*c|nUgx4S|h- at 9M z at K`OP+aF7rd)i%)I?MK(#3+qF;Xdci3fVQu+A3YIzjpW}b#8U)lg+Iz|IEEZurD9w z*1G`egW at -DDcm7jCQBfWoYFqNxt-GY#2foU%vJ{oya!|allYRwXp%#1v9}vO8uY|~ zFIQzua_vkm3z~=$bA#RZ>xBKv6zP?MU6VVk-^JGEV{hcB4lrxY at ekyNb4w2KGwDe$ zDBnD2gV(Vy2(B#bbZXruw06tt31xrgO?MJrqp$g1`O4VjJ!_dZZA*-4-q4khGenCq zG7dp5Qu|m_5IW`zRpd(*`J^H!>S>Bbjjf9t(u)KpzjM9J`787qIy}i<`Kyx#B-47& zLnubtLH9IymDEP39fT)}CwsQL6I%e-j+7O6={OXK$=}03u-_dsc*k at XX z?*9q96JU at CKS_5NgMLa4@m{}ZxL(}Vq`*r^vl6f5#2<$ku=(YNXJIKDR6GE`6 zL9I2=kNW>;-#~k22V+xfV at q>Jpq+*NznQnZyeta1Fq-crw^l=w3s`0|Hafkq)Wt-x zTxKp)#u<98#U2<6C4NM?cz2pto)^EpJD4a3nHc(SgsB)T?MZf1?E>Gzzf$l|(HpX# z-z-&5s}WD+$90pka*i6D_s0kv+Xsw39`!ihW4*-jN-lUOM(~)2+6UIhT*tlXs!3>F zOr>4P61A2CN=Z$`K0np1x^`h`I05 zJzF)NbS_ykoRDXYc$K4nQoK)L8yUI`@2UsCMmA&Z%`d2V2m7cF9~IBVXI7X}B%LPNkU^Lf{ zA-JkVW%GH>2ggoTCY-j>@K)JuB?OJB at rob(q^XGC1@&{OdPSR79X{_>D#-Igo;N)y zzx~eA;7?FK^Y7CfAj6L{(Ih{W~+!PjOK@piu#)GBnS$r?F~`T^#j?D(jI)-e2#xiLLG&3->QJ^B9k`SR-zjO9eB z{SJ6cZOr at 8GfMmX_#tG5^l;NT3doIbbKl1LFb0*{=!4`Ej0-M2>7`RSIce8e|oB-fssf?^;{_!9~~1x-{Oa_s2xhhiZPMV?daxN} zVXrCi+q at o{o!bX(N4Quu>oRI0_%~B;a89-EH~UJSHsO_eTlSXsyBrXVJ9dAo98QIE z at 9qdNM5<&Ytr)Rt`o-apeaPyOS zH#~0Ho+K^2U{=y4)Whw*y|!SCND at l8RIPa1f7252v&eD32Tts-q+d#_Fb&N`{>}SA zDd{e|VdYNWoQ9=rL8YL3d9>@jF7}NoP=~184wTh0dmr3 zk6r5n5eCJI`^V2Flmz5HR*5R?F{=6WAGu7Gl-fX4*`@`{h&Sr`I>4I)f}v1=qRZ_G zIWZEhRnD+n+C&snTGOLT_^LNj8X^g+3*5n%K!Vx4lGuCrL@;T-v?lN5eL?8&68%)8 z7U>F1`zpb*?gOR77?%_J>uzao{QluXz-dr+^R&xPux8k=_u!A6acV=n!a}@-F~w4N zg8R=Bw}Zj*dH at +5FVufu;%xsean%jGg>PsASy`B-R#u46G6l(Cv5-799z~TnOkFfuAwwQ^w^#6GIfb3%;=2H4) zOTcNfu{uDMHA#f%&e+7TX+78R{(-nxgFFGE!p at Emozx z12MV}Z~5~2yXt6sDXM~_D3CGI_c5fYS8S_|uq~7-R<%z%ai-V%>=yt`C{L^mVqNg=Pw=Em9%#PgO z5AvTyRJY0{3j+%VR)-1(#`@nA(Z2^q%~xlFCF~E4L`LAxh8Rfrh at 8a&s?j at 9M;V$S zQZ!0OYlnTDPT&#$%H8_5*t&X&`u=Qa%Qp{bD_VIOk-?(bQua$!>9SNSe#iwk7zFl^ zJra|boULYt2{z0Fyd3YV?i0Tg-|Ls3b#}gR`6T`-b72`Y5wx4M*znn at KnW=>Bw2Al zi=2~)AHIaaFMJ+0+E7Ocam;L%=}N198^DR!n>4AA>Regu)8!x8eE1?l_mN9P89!Ib^ z5J|Srahz%UB-sm^{H7w at 5HZDgQez#bQaXnZ|Q=hjWvUAIx~dJ_ob8X zzv9_V*-pEwSd(Pdb7^#9GdM%5*)94h<_#tqiMCj6qpaRtXCK4^hK#Q#^K(ep5n_Sz zvO{iJsb?1j;td70g9!L0q6ciX1$9L!{Psn?ttn?=_OcE~Z#C~7c!Pyf ze5SaEt7 at fM>Bd%(?b2J0N#gkCdHady#nG_XXe70B!Iqw^-^s6Mg>XDjG zJS?&du8T~^3!$2UwtvuH4t?H-tC>QI_f8 at 4C2k;*y>G%pN%@(~)CN&}BnRJDD|Y+s z*F^&#bdfu6>qGVPpS!Dse`|sXd*}~B{=K3 at y*64?J1M1$4t)L!eTld+<{aC=owqW> zn9v?Pf$tZ`Eyh=}R~~!_A06r_KB(SRVWdwfN}fWer<6HYa|V^LsykMgk&&ze+_J=F zPa=x;4b#l*YqceZ5^2|m7jPN-3Xlj*{f1%nzfzy$)!Xt#O63I_0^D`#L>n+A|RR(w|GeZ z4?}*EJaD*=b=YIfgK5)H(n0(H*YL~Kz0VLIi#6X{+h`0OYuN()E3#@TmwGu?no zdBGoHe@){$_z9MYJjosOqEPrFyR)fzWpAJeFp+Qlzc>tHZ=4KF>=&(~0(CUOU|B|Q zy+5v=cxm(V;wX;6^qA&7tfy^3~iu)5B0Y9L at z;NfdZ)MIHNzpZd3j!yUe{ z8A#ApUeXCBza1b(KAFj6oQJJl{V_~Q_ihbu$GSNANewQZ4-g)Wl?T6qRB4V zqmrXUM`fF=e&IwT0z6{^Ijobcbe8%AU->Vw36gqZ2Be!H55vx8?f|tlF?*`6CZ{E* zXzKT+kHWD|nr1_FeIr)6lCm0d3 zn~ag+MSiZ5aVu+EW at GlW*5sQSHa@|Q*aKM2fSmZf_^2&il1_K@&Xb}nJI)Y?zy~OH z&q9o3M-BWNz9*(zf)6(5cbJ^sNT#lc%dTSgef+P7jK^=bFrWIlUBSTdoPtfyasB+w ziDd5>r!-pk7$*{?E1d1B#ZiULFxJ!_5!$#UvB?#9J`ymYIkw0t`CBDC-Lsl?jR65} z>%?cv)IrzB--eZ5r4=f1@;n#I2P()ykDM1rnWK^iTm4t4vVYxd**~z+-)azebiiXV z{!&l;P!+t9?lsWa&+=X9+~7`|)wX^^#`njZ`rBDWew9;kYIW-h$F0B(!Q>vS=Mb at 7 zgy=dRHDz5NUe2($t>b^J^;}X}8Mi3i*N`&XvQ+q-}2VdGTBpO+oxgg5%v!Q!@^zN}sASSAm&aoe40il!<4T^!G9w6H{bTuga~f~WZ9 z$2-YC2i15$Z}t$VMGMN#X#TUHDsA_VNb2g~VDta4l-epxAPlgeWiNgArT>lVQHdL* ziEWP%xLfcZpd%8#SiGqA#)azlgM_ja8;S&RVj6}0r?kvWx?=R=@54gT@>iAeSucdZVdLs-Wo%+&?)-1l z5TdFJD!c#!kR=;TQAP=L`{v4XD&JQ+H^soCNS87CjrKQMkS;SXYk{r#%pa)!;4 at Z% zr$IfhMbVb2^IQc(X&KKw*OM9d`o}XndA(qpzYvKm7DVy}3KohV3A$De+dFVW!CnjFnB zTd^+-=xjkUQ#*eqw-B&1js0xu*Dx}d>Wy}3b7^0cA)_L{EJ-WX{Y7 at 4D5m>qaxL|f z=7`l=WB0eeSC#QtA6qWLsIj;ajoS5kc0=>Nw>ARQbZ$B8NdAP>IMEq`l|AkXVpRw( zMA6oYj5s($D6@^^DQ ztP474-n2}9>9GvTT`g5ER}5Cqm)66R>ysVWzn_OK1{0shaQ&_xd2^()9o zHb9>d)qnO0shB(4yE>VgJO9VxMU2XSRCYwB^G(Q%D=IQShC(t6d%hIPl+&q{B+DQ_ zY&mLPX-wB1$?pC97D#s62YaI&u1y_mL>I|e=Wa1Gnaj(!-BIPdjfL`aGQ{xkVm29?N%( zOV&Pr{eB1|15N4< z{HijKJuYwaDaeJM|70>i(Rq at 2pe;ND@%1U0T2#BsbG{%!fnJ5RDgiH-Fpyx0(?#X{hD8#6pucQw+v6}sU;*IF6_2ZG0R*q(C4^RAM(nT;Jr|7Lf zX(y|KoBGenX_b;i#d9Jbqat5>l7jjPVTwtXHvWR5I5E?)5wGX9`E6rA#;O)wL z^4sZt+H&7H%=7pEMC_xypgH|j9k|h!BqA&fagWg9sM&9+rKB`en7)mv4nZ6~3{bCcs-F9cL{cAsq(Jl2) zjisl^+`(pT at C&qZ8)jYu)26~^#e3ANd2L7k5VhN zkM!~xQIex+Bg~39yf at j@x>g{LYfV)}I$E56*!kHeos%^ZB_AATmfEvs+d~IqyzX|d zR$T4GoCJUT at bhz24qcsOHn8Wiyfc3xP%^JDZ}VGZzZDpy;L!{|rIGem;@$D-8+b0Z z)1+-+8s5ja=(=92E38&NkJUG}y0=09&|)25XM1`?L>p|EV|VA$;a8(h&Rd{s-2ZiW za3qnBr|P^Fp%L%8arakMkxq#bIAFwsu0MeqwHwWS8}SE+CZ*8jD3#Qyp-dxkBp5K5 z0ljkZP z>gzn}6+$pFw*9URLTIG0O=*1z8KkP*bQM5c{1<>>Zk4XKaNOb1As4GhZSRMdqBt=( zjp(Byr@&$9SlC0yrEUpp=)oLf*}w?bpi)ubpuCe;R++$SeorK|$M~#aRnC1gz7)6( zmy^7+=T+?>EvAeFz*2o at _hmWza_X6?+X9zuit|g0%pVEsoB8{F=2{a6%JAA`;1TxA zPMlU3Lt9j&be}hN91|M!0$)K!9H5oAxW8CwF z5XW0!(A%o>6Bc74IMGK#6kV;4bKbWXyaLvqO#WS0<%*D0r3N0|UWwU-55B?I40R+| zT&{yW00yD}O)5InA>a{mG>T*93xP-vf!8YOm#6qhGA7RSWppx>1^+}12{>T#02*g3 z!}+SHC6htg$xpr zZoFQ1l at o)IV3tmAh#Tc26LQv8V6J{odxMD-I;dIOY{YF++rudPZjJX=s)=L=^XIRF?mWvPDnTI7UvVx zkm!ATBB%WngA(E<+(j#;;fg00mh1ft*FfVY&X3Qm&`*eyx-TW%8W`C-^AUN^j>b-E zOYZ#qmxw*!W{H6eir5wZxAb2QXlJhEWDoLOXZ!z1|KlfQ2ESp2epc9;s4_P%rF?Zv zup!*kLC3;E2#`ri=>!5oX~*QGsY+&!2VidshLW(lme#U2p7QS5uSx3c!D?9_Ssxq+ zShP~OlGL%S$?>KKJZP5#PX=gm+f)cRBMbn6Bl1+53c9M#0M>^T7iaCIc2geYB9g*2 z6Iym|Qi{28IL)-C7F-FSO!o~}_nP_jM-psA&4irbS at uKG@YeluIb$7u_MVRcK^Y=1 zr?vi>IMa1ZgF+J(9 at D`jj-Gav(-3F5PYh24Gh+ne+XSXF5GnYU!s`rQJsi3Xgc*E zz`*GLvnf?@wXyl%7bs(tCS)Lm(W<9aF*yYf5TW{wCi{N{QH!$#)}xV?dyD}ws2$DR zCAfaxcJjj$zkvzKTx3A`5bLF1W&W=Hz3u7k?+NYjBL<^Ui_xSe+*M>x3uvwgxAwA) zOzLi7M_DkhqSLa_MxSIo7n81SlaU*4Csw%WD{_31gOA~+D}V_LX$q5o1Q?cp9f!K) zh-6ZEjbEqFl0qjzzl)1#RM0}*;`n_B5C6-n49|;d0eDAOx^n`MmZ#Cr;5Zv|K02;> zYufC^B^O at pl519PK>8zvj9uqe+1xNdSLE59BeaZ}hb*kBMP`j*xFss z$D|O9GG#J7Ltn(!0QY?O(OB*oHQe at h%4B;59?^!2xPFvo!eh*v!PItho~9Gf!Gn4GlDb6+^aRaDU-_Bb_9!m;_ZM z4qIS8Fao|t7gp*Eno(&C8pI+X0snUpwSRz@~Y}O=aD7%?oXzZ zg0pdWb{y*W^)2?9uZ%SkzYBniE(>X1gY&jig at OCMjxoZOHY)_k;N at 3MPXMwF*U<8I zNjmHJ<$0vg#qN_zH?#9n;V-w{8n1tU$YB%X;N~cMh?^PH4aWD at sBg^2_|B<3thRW( zladb}F_9{0!;53h#Mdp35K;dgJr7cDZWLd-f;QzaD9g+$2$ zW4;VAI(;UNXQ87tVqOSi-J%Opfz|4dP#69nvx~43iaU>&h;%}E2(`&D#w&Br>3APQLw;H8FmVH^E|4GgaA-iu`-tI-qB1TjlT#oR z?SkvL$Qlkk-hC=c=PHa(zD!j7dX?RnlPcjSB-(+PCX3Y-jiljoFz%&iaZ7tU4Dkh% zNooOl%;j6<)=9HWgZ1J7If=yZ;Anp67}{`hRDbLohrcv`mFH)1Rq7 zmYuYBa1VR6!%MdTN?On|nzd`8(n2^zKETK{4DK at S^<{K#&j|~jxJiub8vyddJBFBO zaL9{wa}*Z^W4=+HI*@K67tTwyC#N?)xR^=#x5WOxBJJ|pq;U;ISBu!pC{=nVhUr0?f_-eYOO11zL3yCn9!0S7DA+^(?mp+ zs*!~vUX at O0!LGk#EPVe@)zA*SLel!=J)>U zR%Giq(wb{UvEMX{QuI%s+TT|#C?%C?mTmwxg8p2i(<&*-${Gpz;A_vRGAVz`o3`FT zQQ)#POVN{gl5y=mG;%93l&fJIhb`22N`J-${Tbpfg23D+3QRYX6f at +fMAXoR{S;0> zlJ=G7z7o3}l_!OT+PMDrb#tj}X^e40IrG!^Z!>gwrs*ClDmq+4u{JVvHc??%RPDGj z(3#eFG?h*q5QLpwL at rf~JKQ-e; zN at lw*jL>CK?f`6q7E)QxVTKA z)wP*vy(p_NWs>90Zu3tMfdz5rZq>AyB at fj$-GUp4X6hsb-tC?nK at CV-y8z=3Rr*Jd z(j`1HZ{*rD8a(|g{>FxxLEGC3%4F(}^v!70l+Fi_`{=azEM?Np2fUNh4f8gMPd{hy z2Vfa6SCS+KTBrM4q~Et%j#r`!tP18PsXdq&x2A at 0gMo(y8y1Bj`AvwzHLzb=!2~i6 zDNvd;Ib^o+8HT6Np%=WIiZDO0&FW>Smib0QxZ2UQIS)4gr2?XUqKeM*w7%kQS5V9F zUP7%E+T+m6UE2X at EeygTyBZm17)6Fs(7j7A;Jp+!|1HZsbun&lT*7W at c0vs7g z)5K8!50Ch_)bW2=N3*q`SHkjRQbK4(u=_jhqM&x_vbAW>L}8jCjY&nqLSd072YT6+hx5Rq{i@!Xiy(X8SM!8nbe5_W9Z?y^$v>T>)$x z{eqS>90L72C|>%+JwH1IJ#jJvOkat^QV+zKFD#y z>E&gaJwh0J1+4Kzcz#7`-- at CmsKaw&iesE38A6&^(zzcMY$>a+VQErKT;&OvEukH1 z4Y6+Nklc(ItGV=X at eq21K(AoIyR)6acH at Tw_Dw$r_bPH-ahyK+#)W0!DypQ(Z}fk0 z`AeWUuaw=sk|{?C;U0Vdn?Sv(PfP;yO1JFlHHgbs`)$P$d&LE-m}Z|+^tsRv!&!fX zXwzJ)JzE3c@?-jQ{PkcSDQbbXdKs_efhDcktc~_>SVn-qCdaV%AChFulC$qML9Xiu z{Fh0gE)6v85K@@>5lm7s9PeWA1vsOX_o4aSiLo5 at kV-tJ?)VyHsdRi69mN{7xZeDpLKpQR=UP1HKt0VM#xBPHwkPzzo~}sQP{nk|8tLst(}IrzP=;eDoriq+-XvbLU*fc| zN~3iX*s?@fZS1=COJ3>BrSwvkS@ zeI7PujND&Ml4G&~u-KW?TCwValC6_D1w8}^x5n7Zk>nDa2e$hL8s8iCo|${VDGVYq#+RO^Tcs$}!@VPs?eC_{OA4 zjysXG^rNO*@?#Bd)Ed{cLyWSCduTcz`?U0UOiANjgGh?1Rq4saYN0LjZ3cYlK&A6R zks{);$eI(8gbF)CCe#f%N88i2>U!xQTuIpSfKmwN%;5__ZElk+AWUzC3t5oU?8T1W z=FZmT53*bZd2vi^+|oYA@>`%TownaX%V^8F!WbQ&h3o70yCmmYEYXQ#k;Y|Ct=o!0 z=g^a{$Ujk753`p_y3VoQOD3u=>-CE;9HTSB&4=_K*b9JWuDB;Pv$`YcyE}VNjlA=rAtXL!EpIrb;7t+2%EWEPnmei}47s zT*f>vKWWbm_NqJ((3 at oqHYOr3j4_cL5ualsEjwV_UP&0iCemcBHHA39_rOwozgC at L z(!|8i^EAR)-Q9K_tU=yWOh4&lSM^2yZa||g)5BU-**TM)dA~`0*YbK*v0fs>*W>H1 z7LaYl%`C1E-OI>kxScHh!Q-s+sGKE&Stp%;zst7Rj~g!E`)$zWlWl*(>J3wVrX6R{ zZ+xmttiX+|wxeFZ#PLTsUE^ZsJwAJH}>vTj+{shK|_ZU2=B z_bt{VrLO3b^TYV`H_iGYI)yrp{_pe|l3ks|H3T811W`Y}-6*%s>p&~&a?aUtTxP;= zB_y^0>2l^^BXflcECor%m=Bp$#RC*7JmUEr0nDCYUE=n)-*I;l zIwLGS_x^-+SzxT(O*cNDjPjG at R;B)+{Q#Nk}bp6C5q3o(y(ZdG~6yE#7u?q8{zWQD$cDeo20e zQL;;Pib_6%8z1#*F6I(xmmL>SiH1X{yL?HGjZum$o=h+iS7NHwoB(yzQ^Aq)#1h^M zD-$eH-Aj`i$5hEpYy{m%s}VF08>mZ2o{@UaPG%;fd2?AVyHNYfn0SXxYnXH=4;8X= z{F2NRvO`Y0lXyo&yCbPYwOmxpE%F?YOd|b!CPd4scYg$XdVj6(Yi1ULP3jHtpIz0w zY;g1+*{CTp7}&S}wyXXh4y~n*X%ebq4fn2W6`Yj>j0Kk$b%g=aK at v#RE2l#a)GGNffP9hHI2PCbm{EIg at dGH-GWeJs|1_G>}e1Ht^Nu($q{-UhGR z$biG!rqy!xVal=FD|uoe&9`diesZF{1b&C at 1baPl`@QPg+hupS(X_?%l^SbcELJ*X z^oRGfN;z>ek+qGZ-};?G#saW*F{Xpv!fXD)CgTK`{3AO@*@`Zbc_bN<20%N~&=t^> zF{b4rz{Phk{WRHeWwZW!&tcmYVeZJy%q<1Wv?;+%Mlz!zkJ6w7%Z-9tO8Jdj|IQ|l zVE^$gFl%g;@9)e0 at Z#TDcJ}2!`%VPEv+YkOt>6dl0T zB)Lbh8fO0>a93sNK-cav`*CBej1O-?$6#N?YbkHkuqj2_G2Xv(qcO^o9}}Xd*F-dG^EjybK2Ce-CKyu51bakWHc+xfldx>WEmu at 6l(6 z)n{={(=SexD`{V#*JU#&ol*mr>uquZPE*ADL zYPt^14A|z{gXMGdHI*eUPt{g1#_Pyhs`Vv>%Fn~gxzSYZ3k|xP0~2W2Fgn0|EQ-M~!_DT8U#*OWx&b*ZDHtQ82Ee zm>U)9Apju}SkBIdQM;i_J|SZgow%(OarJMHuV(&YkFaL`Qja6xt6}#Ss8+G>(gbyqQPJ+zIJ+)CY%pYV#e&T3VP%2k4*KVL-dQEv?xi?IE~lB3>I`3)u9 z>k&u=I+DnN0)jJ?(}h$<0zGB|J;nk(CIUSc0zF&x#FCD3D+eB9g5}7gAF&rCV;{K} zB%>d+U|&~YeY{gngF1d(1hCwb++U%$M at 96OTlKc@M at dN_5;dohapPUP z<-EAb>jL92*iaGygi6QCF>>hUBpSvy7>>|uX0z#!j6w1uxCfXQHLxs1NYN{KiVl)kAjYien9`yAQ zeHP}o)8%WhawgeaCNo;jX4sLA6(EjQ0Q;1dN$d}5a#=#C_?%a at zd57$yRk=RYdE(! zf4LtIs5ZEcgV7;NBNn2W6QHTa`n%iVRs0bRnS zKeC%k{pKP&ZHqN=^u{MzjbpFJqRb|v;1kTGq-78}k7cYSIw#>0D-9Nf~axB at 2Hz1SASJfE-iL7gDe)<+P`}5_bCUN at Upr= zj*ypU2s^7jd3tlfZAhb6pK0_BPKYJshdRr!y4I7sSZelZSoyp-O-NEfCq1Mma&#hS z at iFp!V`fqKv at 0In5M4&1cmbC&euLE7!z^}xpd^*IhBf};JHp$jZj7nOJT2N43a%Fp zSdLJ3C`GvL9}WwBLMI>D;EE#qTSB5#l1Hjq5E7dnoYMa*ULZskfK()H99|9Z1d@^E zsPje4<)ZVwhO;xYR6`ApTDn{`W2-_?zXy`NOXNLJs}aF at vL{rEq at zcxsHaNp$rR_$ zG3`rX35slgEkTM1r;2SrbH!eB=nXwDc!F^{MKv!^GfvF;{Fj}J#!vovO_1s>|EsEJ z{}0u#*)4p-5;$N`&=W0ESuRzQ0izD+AmE>^#GtLgqJm0kki+UrM^?C_#6^V z_#(xB1OA4N@#Ts~L#;(E)$&R&&--}um!ZGk2ZRxHT-4}6Ee!S($7UF5TBSr!W at JYs zEFCf1VH{)K{59)jYizaY1X4Q at teuO=)h$aC;m4$_2f!B1Vd2k~Rg`gmdU*8}yIHGv z9J^erUY=0gt3Gj8O9!#1h0Z`rmoL4;5wEL7ktnwrSkU%^FR_ic2Ege~O{e8FD;6zw zM4s(+fLq^~OMz at V7Q*h&;5a_*0&GCNbkKup@^=^fDT_ahqNM~REHpVV8T&uvmMJC< z1V!ie=IDus4aA-Z)ZsHYD~pEsC)_7-x5(`#x}t1XZfj^zq|TCh!9UafIu*-6W#tUx zpaX5uVYzl(&8JJ)r5U7EDwkvJy~$jBE#oA^3d>BS!y?Ry#I5*B>kCcPNAQdVt&3D*tYSs*$I`^Ts9EFnFkz;dW{;?<9|eCiI at eLc zGPa(4o2%a7AF-%d0yFbbSzmd3?GpV$gu7JI#K8NfKA#u{goWKfj{3?WTG>O zbXD0_COqgHV}z>4uf|$s5-YsJKG~*Pry<{OjdUwAR%F1{*|{xpVjp^ zu*xC5pjj^)+HSlU%+H--;4aC7ln4x|vlr%c>+a5P^Rkrrd<`HEY zOF$uwZm4cuLQ=CoI4;emp5*oYy#HM7iVQ!sS%pZMQ(ioG`6#`{SQC+P%1T?OseOe< zu_-YkpGaGA5$Zc1%pu0GDbXOn{PcQPc7!ZdAxj5aC1I%{8as3 at HUdjbyvVJ6C&vH2z=W%p?Pvg7^#OZ(p0+8c;`x5Z;Z& z;5en`A#ys4sZs=?WW`bUq{X|!lvE^d{JsRirU5U>c#_4D5~^i0Xli%y50z9%;3>zp z2Uha)qww)(!+w4=f`}VE6{kmR%>^;W*oe?XRX2gzj*@2-A2RXAxu+Ns$+xRLF zeH+NyGm{`zzANDqkMRHHpM2-O)yHU7FZ<`hd6xI(Q}259=7t}Tr(X^b>^fu2c&qP=Gr7T# zCIQot48P=rtsdGDfy+{3S>~jQhGUoypVJ*T%6=#w|g>7YK(xX zUa~)j3Hc>#i_aZ(9?EtPG&WNBe)+dVx~)a?B8OuqGwh`$v at K>Bojm!uZ zs^IQB6H>tH{<*|63{T at NhBlhalxDpFv&|ICT%<24Su1nBt>RwZx#%p7&M?&A`%wpp z`Xb_w^;SnbX6lR)AI~K7;D)KT($$9&!o%>T+IyUfvfd)5kEhA%Mog3!$_G1j$1Rsu4M|C4SlT96(pqrN}Wf7-k{t3X|XNCdzk>eP^g3_wzY1&{_(5g>rU zpmF|CpGneGyP00mfgxd`kDjHlxkWm2IQq1t=n4lWp^4PjaMZ+cIexTQ<_x+nl65;j z%3!ZbChtsnduc_W>Zy;9j%KZA{CwV6gXw*pq343n5qNdKGWF~WgX%pLAp2YG&ic&V zo$!5v_GHHN4(VfhY=Oh~91pJE#n|{D+he?1Lw=OP`+df2ex$MK$jiz~M*a}<|4`3=j)k?|`a3GoLYTPQ*LqEl2!&T3qAZY*9bz<0qXu~GVI<+h*EupLNwGsop0`j6 z1PVL;42C}=BSPeDVMqnrCPpk7YiStF!o)z|wH8Y_7vaJCj?8rRHfR>=ET9XEev`4> z&#t)VCv9RLkSF;<(HV at F-!2HMuUh=xr+%J&3rgjY0;Y1Ls_7a zg~wZzn^)4Yv0?+q=>h}}?cH3wV9?v4ByjWe`M7rIx7X0{;=&P!7#Z!9gAcU4;=-fC zi_w%ZCAW*4QlEl_=jRjgnCdnb;XC1&sHZcp24FhvH+azGGErHN7`9>Q$D){a7Bpf> z))DCfs$yjl6pkiSU0GJVBqfq$79?SvDtSpOS+?IvMT>NEnUFQ9nU5YN%{?>7z{eIu zGCM3H1p?xsO0#jw6~+W?UP}4o at e#Dl%1-R4YzWd~6=eNy=TluKiaeYQ1|tW;;}SO% z#-h-Rx=^?)%C_`#i4nld#k at 4Co?OV5C%nA^CCa4QOp9(>F!!Id&^%`^2i96BdT(@34K9Q^hQLGLej=|UQ8GxrowQ~^be||H>Oh(&mrz9KJI|D}e z!MW3f+9_e!)Q>(Lvf&)9a$ixwQaaaOz>I-e*BiVYboc&J$u3YE>s7z+CdQ0lD3)3X zL%~flb$av3vN3~`po|LVHfsw;R?IT%JnC(u?ZZME&TUAq&S2CUB*KCe4ZHCE zh|2_Cxaule{CG&+Th{=o-CKdvnEd{#jNV>s>^-w;tmy at aDkapPrf=G>&p72Ug2Ra- z7iWS&=I$p)-jn#MxV89tbVMb~1q5GjeA at +q`^Gu9_j=cxXyWCu8Nqzaxe>~2=ZrVu z}2i=Fu4Om zVn>FaX3Lnj&NyLlbzmXO+9(x}nsXtYVq6DdF{g-3lF#6UTG&HeOEb%0q7`r$|NJ^@ z*Q3}7IdeAObr1`oVxCqr4UU#|B6C=6_sO0Jzj&Km2~;`$gDxElo6bFOFO`{ee_OAX zi$Jk8>8_+S{$V8 zvz?^!kPu1Z0DU#$7h&a*(Hy;%NR9qdL`!IS8iI}{xm5;J-MZL^qZrF=kTji1am0$FMWWX>p z%+pZepx->Dn at OMu<*8VJDy1d`mql(qm{-__@%X91=AME9B=^<5Ll=(~+#-8i*8Q!l zk_=h~PZieGMk$|$??d%Bk1ILyN^RPjyBSc2qR{i}FkSzc2iz=la_?e>O5U|>0t34$ zJfyRR-c(oThF$l8fc7kH4v?6^Z%$ob)`)L~&FURyGq|C`AVco(n^Jmh(17OfO~9&EI_ao-Vx*|7#^a%*hs009dY95Hht at 23Nt`oT zMrz5%bz=EvP?h=X%$29hNp?Wt1PL1gk{ztH at hts!Y%f)@I6x#(Es(@6J`~8f#3%u( z7|YLZ;(}K_XA+dy(4xU}+;;`7Ld$K`t{d z(Dnk2 at yv_FRXXBD<`vjBoA)+a7n!D}vs1&P_WFUB)M>crVKix**1dMgV8>SzM^AJE zG9}-P0(atclfbKXo}T3l4lP8oP zGXRu8()DI6`N*gM9;jmIzd5fD>0x;(j?#v+sk?P5PR6WY-EWba%~8hi{F;{b!8Tzu z$58>Ejqt_kvwmqqkiyr6Nnd#e*6uzaJLsl6_plyyfrC55AJjmV%I|TS9Gnrkp^sit z&wT`zOw#xBqN~OUsoDjsmmgl%C(6#)9mq7z_lBL?kKzWWp8mvB-|PRj3Pc{`Dz~rb zfDzt}y1lH0)(c*3DY1J4 at j1{~Dz4IO;Cq9KJ2b+ClqyWIa-novL12~WlLZ2kJR}Mx zdPH_Zpf*5qLJ)+ZbPJjz)!ejf(iUFxYqU0C1%n{BOun5$aD?a1OjHo(fOf8R=COiy zjZP-UXb48i;xKdOz1~3TingJQ^KT=@B&A#-ueV700M4XvvS*5XI(k1~cyv6aiyT}2 zeRQ21LUiDh^kS87bYqfa&t}qKpJ+o{Li9WN%&l at hZW=}T`&zxIr20vRJj#Txf88;c zD}X7xSV;cv^P?WI%<~#A*9$*qk41jF2xV2ODoxQ>aj5*XWHU`_0kxK!u`(I6Eu~_Q z?mMCNMLEJ)r!84?2o;)dudhtmTB+ix{fav8B$CA;Cbw|qH&%tzR!fP*PI8G(F~x;X z(x?;KY%!5;^*{|!)sjVoz7XTDkB%PzLO<*`jwm4>iM2RN#=0_xH;w9{?B`^~QRUEN zhvn9?*NS+|y;9y`B)eJ(cj^Q=9omKH6YvW(qJ^YQ|40P+q%UWbGaf^J?mCG(%^7~} zVws$uVx+U=90t7O+`}R=cJNs*H_tyoE$9vH^SY-ic%myDP*zsDA=gnFN{XjF^hGeCR zWxm&&AHmJmRTDdA-R5_Qo14uA>>Ug3)UQAy-8;3;GaomUQc~zyI%+ch+|LqKA7-SW zcpu^Xd?LQ=5Dop2spls{=O?^OE=ts)834Cr8g~WgEfkU~S}##=9PV=(Zb{uwL88*l z|Dq~+W&QlEE6u)kH0KRU>RVk_;vAWNTf8Jp?e~z3JzCqI zLYmi{&kta at zP@tnHR zY#eumvavpRyEkZzeUFS)i*8=RS=c(H)HbBnb`Z&yJF-PC*_vCSW-A=)imZD1*&t~p zMy&=Mcf;;-_vY-CzH~8LH6+}I`+A{D35Q#kO?kmlr+B*-M_k at 9JL|+T8 at wVpt`SP3 z<+EusDdgUeI;Y~su3Is0KCW{l!wj|4T9+zBg&k{H({<5VzCiKR6J@<+>assfVc%*= zH)eakT1Yn}8VjoX1PXS5zp(X*<tjbFq}GH)d0QpL at j}%y6f? zs4l)O?W%nF9n96&FXLa`G758W#L}IxephZ-yKu=CgesOn7IQK-^PzJ^utnW%@e at Vr#}nfT%;Xo8xf0Z%)G%v2 at Vb<3o2#exRob;~6#u=IVhv{WlxU{5I-! zp-eaH@~LQY#^3+&3uLOr3{Cn13R?xSc26MmvI-ax7usVr)~M zfmpwZq*~Gx3c90JH>fp=x+7sX(&nqXkDFUdF6n1Ba7F8K6b~;cKYN_!=*o)P=Vxf& zEF{NiQ&%51I)=I4T(H`B#Fw*2&25$+*X=U!y8>N(S<~hi0-p4TLZjNhyNF{azBaO& ztX^4y-Y)Ox9Q?_;k7kp$a|!om8}6DR at arK@;%~(y+Z7SFT at 2xt+my zW22y+gkExD-d~rnL*6+ at -BU7jQL95!G%mHK8&yI|YFRZ7e#5oY0-Wm#vi!Dk2&!6P ze86&g7yL6t8~fABQLwrntQUpr)nP*|?_4^2e?9pcNV^!8enQgfdQLVe;UeWS3DT-k z{AqV|L%p_vPE*w$Y|ETElN8an4Ao{$4W;`>;mAt5L$l7gxd%>NC3$>ZTm@$4)IX=j zU;1J;aqwhKP8-K<=25`55!@=z*hKxO8qXpzAp&K|=?E13DQyj#cXVb`sC&z=@>bzB z7Sbj!ij(Q0#SqD#2f9hebH4u*NxrArtZrA{2ByxbE5Sdj{4fQ at 1pLrH|H_1ZPkCK= zU&A~O`^vG3w^j3C_P^bsI9=d|kN*9l0sOy(!&=(Y|F1rb{}y>5T{$3tP`zUD$(xtY z?tsh=XQ#SJ2?5_IL5DEN5IrOl&b+^_;{gCq+6omYkDXadS6TVt#G3;sb9+&Aa1b`9 zvJg6hHiHD#e`=qFgOotpfwX5vt;|i_oI0w4rk3S%Q#6?>QN`0xn;fjg5NW&u^5F4) zrt1?E6-}+&v4HvUG5aThI#OoR$!8Tgv|=67Gs^kKLm7XwCgb-C&Ok~W*`VJMIB zPoea at XvtD>JnT`J$FF3y8z82KjZB1^}LWoT7F_F6!);Nc%Du7m-&lCPawJmckS zLx$%tDXaM6&)!xd;K9syr*rh>`|}P(fN;^m0HlU!sD?<_eK58N)}@FTo9+->BWCRz zgS52)JV$)+Az>WEI9AmkWY*ffNAQ0|W;n!|$n-BV=6{i)`+q{_pF<#R6Q<>W7*Rs( z5i!0|LXZ9)?ZNQK1*t2%B0eJBoWF)`5P7Tz|TXL-9N zd;R%(0e121XxkfiHv+MNGUDQ?#RzO)w2gT-l4?ssF0o5YV00;g#X_FDtyp^%SAVw{ zJQroaEVte=6cGkwufGh-;YsXWgp1=gSYCi8Qq?>)tFdHK7g-vZIUyIt>L8Y{2XXqA z$q9tqM5~O2?5vbd>(bA5*XYlNeg{sb5^Fce$!DqAlMuO&na#XYs>HZ at drs>~Y}rzZSfv;?t{r^C^g;x~Y^Ls#O^ z;re-nR7v~@TjYFDsKkQAM$%6O2tcXj^_g(O0uO}wWyn@)njX|;NLY(*oN9DE%JZwy z5EKr!%E80~hIPv3Y>ibRjR)W^%-jD{9&?@l-{B{;Dj0%sZ{SY0(8 zqC7mp1Mx|el=o=X1{zpS%ej>^%h<)8w~UC9W0&uS)G#d)E5`M3+E`W$`PLHa;iE7! zQS!ci#lg|!Y?;M%cJDd78DzfSN*2>cqK(&i}0moQsq8fRQNRkSr+jJ|nUC_Rc;p^*?H96$x8CCH?SsH{g*slht=m5xyKp}&c z40s2j%ERV0Z+rXSnS!V?jSLJnErr1bo4J=t!oXFgt%RrB#tAMFpE_0<-3At|rHy~eU`l|Ip+hS} zc8-dAB(@)Vh>EwF5!K6h5}tVgrP)xy7(ncs(Z&PzEvX}wgucxQ5^A)Z5 z1>bAxgKiL}BTT-Gu}H48;`PguTz?oyQ|-Fo!7q4}ZjGphwQQ&y=j99JUy0BfUL61W zmjv11|0b~LzliX^XrOBAjwOoX7urUeB`ZZ>t5vi at B^j_L)S^X8(qdq(n8`vY8+~W1 z3ASdkKE1AM^%J at Ch^+sFBdM+Lb&k$EieIw5PD(<$nHmH7eC6S-n;ZSNovN_25@=??L0O zdAjaJdhPbH=|jNvsmNWarB>}ZprJ%;coiO(Nz|t50~Fn^D=7M1Mxgp_Ww0%1-T^e| z$sLv=|Bz_EJE!T8BV_@O9kSFdxV4BiLx73* z6Z!cr+De7w~;;Xem6`&Eh3C2;pxcS#U;oH%83 at cI4d zF=tA}j)h)(+v&h5V^~fXxM?Rkwd&x7BC2}KF~N9Sm>fWBiPu8sGCB zVzbQs1ZFludJQu2_#Ib4XGB6Za0R&!h++o3V;Gov&xfQ-5`1WzzBTIdl2_~hY#D0K z at i2&x!mXe%!V;i21Qq$nt~x?hQ at J+4)s6E4u7XxU#aW4t?C?>%T}UsI*=DR*_#@W~ zrWr>Lnr$N`E`>)b*e$-9x at K-u| z{$1ADKcqv*)y(War6WXn)*f3F<$HwNntPJWHHV{EHc)#4-h6R|7M3o)xI_}$ph}uLwtV(iX4{2t_c3~9xrPS6NfD2&W9CMi6d7G{K6|kOx)6Z^ZiUQ zL)HK$;8{lxu|vMo>h}PhSL+Ui9<+AtPWnZ=-n6AG^kd7_QYyWLo) zmf=1b at f0|#*qXXwzI4tqYMJYn-recAT43eXRQApFi}+FTID+Nu1wu3$YLnzhoeTK1)Mx at MYH&GsWQ5Fjm$Fk^2H^duyspoK;w(6 zIlB;`kr4W-8Ld+=KkksG&D9L|PR$6Y)R1Aw6{GrA=@~B?Attc7Kh0m6CqrZI(B91% z+ZT$ESgV0 at Rp&JA+dE!EEja2H$eb|HUElazS!;3C5rQxo6b1uBqa5Z&aMcX+_Vt&3 zaJ3AMD5Emjqo4tw)FLQjmvg#$9T$Js83u<$wLYHO1S at uRHKOmw#@#<<_zQ*zogkr5 z-T@*cZ&)$)n646eBUHRhF67BR*pBz^D#V?UpG_=9M_xR4R!1 at p}*(wKHY-mgAXnbnj^WruwB zs{0&gN04)MVZ>nV!iaFCcOf*JnRU9e42nkX`>JrCTm*vi+$l>!z^Cu ztLSGJg#%BN>KpW5hb-%ue%e1~`yudu6IvnbYU5)0e>n3>l6K^=#Sun(z4?r7 at DU)` zAV~;IOYY#Y$SGlM-x9!pD2DIIVIQt{#xZZYNdb3;x zx_{v|%=%@vg`{z_%cM+^(rwkS?}<7}rBvf(H~$O_M6Cj64UUN4nR{(x{*i>twU%fq0 zQNU8LwQ32rHh@%?R#^9h3oWrrGzYeT>_L6-v*;}^|0mY41BW;hoxb2F+(eQxL_h8n z#dxe)inmxz77(r|>K;tq{>~>+a_8iXq`wr!0)QDSFt^XbiBBkeRHsCp&Oe$C$)XMs z*&`sqr~VA>74~jbVvJQXzew#ppRXy|nInvQZ2!8Vxr2QHij&K51N6FBy|?QTKU at qh z at DDb4&26_0utQv%w#nN~9 at N$jp-XHG64j#!hE`Pe(7947c$txfAq=7Tn~X3MVKSP~ z(^Rwte_#A!Kh+anbT&wj5RXC3y|R#>ShH*EE~54W=b*o%l^&DffZvK$U=qp3?OU=? zxbH at x)Aa at cR2m(A(M at aag5*M(MDp3DpcKD!ljIw!WzX>vuh|s&ly&2?sVFn1h`p>m zo at i{m!iKDqrBtUV?ZAz4q^iB~Q53vpuQ3^>EmivNtA)>xx5z=56Sr6N_nVB*4`^YA zuqIpJ14Y3M5}N$OO!h|^oij>}l_e0!8nRaRtW+E+ at sPg^40 zUB5uBVptcc;h$ame-#kLsi5_LWbm*26%nF;7oYxLhH~XAx&PQQ*4eJ2QV~!PP^sCX zyOI)qC&Xg_NhVPdvdVsP>V}$*xs|TNKQ^!^O0wMj<18tsWw}wym7ST}`DWdDHhc5! z{b~^%Aj?BT7_`ksquthUOAOK7CX$6_v&CU{z&G?96CQh%2?d5ZN7-+Lx1!s3gWt5= zMw&DUHq!25-xF*zcpnkzdcP=5MQF$* zC2sCf;vn*>=VbhIjmq5)3Ax9FkW^rFY&ffWT%7^n&=SfevMUaaKGo3WUd|DP*}MqD zubnWXbo?|s{7;ueLr*WpP*GAn`S8!-mK6K+pZb(8YBp_No>I7$a>Yu6r{4{sS{)KW zF!`sZTDAoO^ah>S_|yOkap6JToOJk9c6GSD8PV)EaN7>`XdX zH-~h{a%%~vl)vEql{2;N>y~Ih001x`|G%7J`cKaM*KZoIl7MJQlcj-4=$2^VB?MF< zRcllzN#O+(PO}bZuGMBX?n`b#B|c##Xj26CfnOkBb$bD^KzQdUmR1&)^(-{Z$?&+ncWSTMhNZr{I9#m|m$qEJ26L)2 zkivA}FgAZ_Lsu-phG8|`)Z$%(Cv3=!fgsaDOX8mb_rc?J^@!?FgWDdv<4jaAQ)EE6 zj?M^-5sgdf*?h+BI7QjG<`z_N1sZVToV964ApbEGLoQOae^;DDW|+yalvTql<2TwV zIh0f2)xYAM78U_vQoV;bxV-4JlaRZ0hVQ_x7_Pe~NiIpezs#$DYcEu!W{L40D1NbM zX+uG at MG&LYlLJ{}Zm+3`E>TN+_AW?M+%}o?Wstwu5P-S{=Ay%7u-h1bS7Fq($6KnX~{3dr2R}2Ha*vU90`E8edtY2StQhGuJl@$4ARu!h2 zxyuwI3(C2uLIl{HB**gNsYL>2Dtn(xm?m1ea?hBq$}cv&jQITSH=M;+?u<*Gho!ZGm=B&j{f2h!;@3VQeOAZ7TJHWYKWfe_5lR|;F1df zfZ*S<>VLPT>gX&l^PfyJ*qeDk248ZEAsK{{Mo7~TDiRPP1&H*KkhF3zz%!Yp_iM_` zX;sN?c51Y+wlCqfG{k5Hgkzv zI?ZyvY(m5PyMO2c)C(x#q(^~s^oKZ`@FBi^WGoYCy$aOg1?)LV) zHX=_wK(b5ax^v(W8i69Kb1_1ta~7hbJ6W|N)99a0*j!?mk>bW9HKq+(VwB}&uS%bW zx~@6ip5L_I)gzv at PQ1h5u65kk(iugVW~y}`FysgmXLGpG;Qmg}jXR;w%2p`yy>nh1m;IHMkK6g`2_%iWueTP9m`XP> z9kFR+#@XhuI6W;1_lhQO_MXS|MalFXokyYx-Lw{2Hu37roohC_m at _xxWH+quU|)sY zwufoc$9(0Hiaa~w+|HSn^4B(uWny zsM;^Uu at 5P-;_<1t3>2RiV?g}^>XT3cks3I_3b9g|uP!=P`2 at Q3Zed=9Wp&^DZb?$c zwsw41cNgsQSqra4jO}X}jM-w_KeG^PP(N6gs?^4eLGc7CUFGY?+J(`NsKCx%j#q~z zR8CXQyX{z|-1?FJvF1SmqB$y% zo{ELu-{B*jwSjt66%xig(^2l at F)qQfqWV%hDA)cyts~Wb$HMT=(=Dbi-iI6!DsiB?16;^s7b(~{EDh<)B-u%YB}sHmcy_ly4nOJr_>zH6U;LNo zM+Ib4PiIiZ4=%11fb?%aUcsR^A&v0!Bg5I=Yc5Ykw?)l928-}e9MuW^*pItdN|Mee zhAC6I>{gISsihBLqBv?3?IK<(jcQek$7!wZpne8pzUT3nkZNw?OOXm=i?WpKIF{H{ z1j%u1Z*RN-u}ZdVCx@*D>TP3KmLAQL zcH8b7!u at i=U61>Mksy at wBR3LTy271Go?MK(a#o0JPP$xF#o2k~S|et90>O8n*i^{9 znabK)wWG)zbu2V0o(eEW{Ts!C$&=+MvQK~pk+ECY1!OVvmd8*flR5L+c}thY>ww+Olk8uGxX z?k5z)IcYOsAuP9SoPJMJF|akww3DW7zrwtadtF0l9d$#^!HTOBwGE7 zi6^Oss#sP}q$bcBKW}a&CEE at Q!O<1oQO=~mBQ1&89}AUPiqDN$09}GfST7K(WUI8z z8c?jvgi6}b=Gc+!sa+r(7!ILc$2VFmEiNR^LilFV55p=gr;?4tQ~Oh>vg(qylHiaF zr&_dPrBIP1r^75>EL`v6^&4RmvTQiLZs~4awz}1AM33fxHCfc6U2ap6f;He5R^`3- zfZ;Rv!x`PoS@;4z+JWkZbS at k-k#K at yx~gBM0YuD>d}Io7l;N38Nu%HUSYfCyc|v(= zd>OCXk6DHt$60(Z|S~c~{w2(RG(Vr7UPy+-Q_UG+85|3DC83Zj$uZddQpdQ=7a_x~}uR5k#A zrsnw7Y0{VD-Q5NXFXBXO&W!kP2 at aGl}^m at pQW1BuigqCa(_Ao#JR;Q?hz(I ztY5+X+DzZ1h(5m4fbZ+ji%7>(Y at h>_1X4DC-;rnhjw|Yg){4p!UK5Vt-tCG-*9zuaFwb^f~pkJsF-#pagihQ at n0 ze%vwX`HXn^!t$X}|F6|Db5GGFw?n8W#onFflyg_}1*kQj1PZyM4#_K8xi=xi{S(|_ z)JeZhzqT?1W3HE*pOog9nKs<64{fM+6+Gf8O~mtXH>=UfKt!0qC;2G`P)kg)rHOqB zW!Z~mS-RZK4>lF1KkMVG#;00=?Pkq)&_^eR>3iDHgzw2JWJE{JNR~o^3r5yXm)A_S zbi`vDk3Ix7QP_OOaEQA1N?bfRNU$Vs9TUVIug@=IRANLon8;Y(?T zKltw?o8R$#;#Z?u={nB7K2Hm{rM7C^ZVR5x(y*exW!0G5hd8+I?$FjmI?Z!tZ_xdT z=rl4;HN3V2zE!i;micA)i}KBiXTiyMLo$x0PB#yaE+`_OpI|guk&6A!RO{?k+-7Ma zGqvP7l*rFPmnY8*Ne at tNh%Yh&I-cw9K>`7(xIVF-G1!{QiJINB5R$9Y&!FkCD}zpT z1W-_#W&26kO-aIKsj17;rRcFqqdtVinU_5 at xZL=47-O_+z5?VAq)u-YL5%LLQ;&)S zFwUrk=j*$SG$$+HH_YVJwa3~I!Q>o2it_5=DJY`R6K05bxuVJKp7tBDTRR!NnVt(KlvCe%ejb4&v;b$xJ~w=fNpaGB-Ki!MX!* zMiimg at _oq#%+!L4#j$U)9+JcojbZcddAUZd84nZt#l>)Lt-TTu8N1z%@G$Z%50BXr zs&-ztdUW}0r4Hax2cgK43}+)o*UaA at jot}31*BV#jIZF3OLqZhBQ)t- at A-*+SMzE`h}#() zj^M!wzA4_3IW9nmWBg)RnKIVh;Q1 at PGetNwM%Nmv046oK!8T?Lb{OlFb1IF3o&7|{ zu8-0nTP49Bm^!t at GiBt9YdWcbV~msS>%WYmgx`V$I)ubE1sj=8Xmo4urfbi>82V|} z*pMz^f;Kc6Tbg#I+9TI2cGZzzSsiNNdV+Iht_W@;t^w0cQtyp`i;2O`=4dMf^~7(w z9lGH<(l5uB8Yg9~vgo!UElj;oeGkX=%u>!Y~m-at=qop$BACDGoE_ zaFM;N0VT$Miwo at lvY(yKCV9T)@nGxtGPnZCblx(>*K`|@uAAS+9}M7)nOwm1P37=7 ztl&OtT_h5c*U^&&m}#b>B-u218_Hy;K9*{^ce*2miK6f=2kXgdsf-ruNld~y&_{=T z7=T>{@OU6Z?h;Z2gjtRh9Y)5 at cai5q=@JAzIzcJ&;MufP^AQ&A}j4G6ULZV$)X1 z41E)MR9g91um6EhH$w_}_S2QjmLbZ+tnBb at 6~y-Wbj-H7S|;zN at QLnpo|mVL;XuxT zRa+-!TFw0cpxw1cbkJtBQGU-QJ%rg1Z-%LUCaz&d-fHZ_Rk(F7>5FOchz{%5J|Kl; zy$K>m!y3Xs24maUQbEUPEjgymgbF-~V?20B5KpmnPht;aY0jFmL|P`T78ny9+iffI z`Cwoh at 5rCp2R14XQzf_+5}a5PIM$-$-NV0PHmHTwbWWBnN$Co3oRv{cid-9Y1ToD4 zU&cWA!hx?PL;Y-FGhAGNiv0^zbX=`EXU#QT?Gh+wOJQLeMG>LbsFR{W5|aA4-QXv< z);1^OYao~*9O1(P>oSjpc0>8LdFD_Ft7*Pz^Qb44Q&Ghx4CVq(?iTft%{75_)p5 at a zgMWMip42 at t1rIY7*DHL^&S5S#U8Tw52Z#rBWOtSTdiEEj2bs)ZQ$EOS=$l8aq3*;U zrtX51hg$U{2*s}x3-rWtu`FQv at UJn7hn-!~ZYl4yXUdT^HVAO`6C5Uhu;;(bzADK#>s^5^xX5~RwcRI$ zIQBj(Fa02HBQOm?sBRG}Z38;gGXJtb(Lly}&~L(MCxYgI$y<4)RYB~zs&}Op2xS12 z#f|FI0H8F5r!l;ARtQ$c2=&Bx5r^dXTDLaNpsPSf4vE4oON!r-NtelW!)v*vH_2fL zR=W60tH1F9E~ZVQRIMvCZH at e0sGc*ed0^apKu~-_s~>R=cOMu~^?wE3i3$txilC3m z1$O7gEBv5N9>Je=@SGoeIp9O)^sqe&(1s}ykFPEPi?@Z@%Kay?@k0 at c$}#C1g1mMd+7 at g%UGX#FA|^?n10m47FC00|2fcQOTZb zOR!QRKFzvK&0U(xx1P?|v<$SOys!oQj)m*tQ!6;9wBDN07+9J!ziJZlMcZ8z%lwU!uiw8)HfO)<&vhy^H>2maO6zb5 at VOR!#z+F>ohWh}S->zLe2dez$JN|W~nV at T)76B`E`x(hNcPr z>8cabfvcUe$-zyNBsVjD(c>YBE|79zm_heEfaeTpER7Dd&7}jugVJ}lDA}?EDy?li zGW`_w_vvO+gsn9cN at 28{k_i_nC||q@#4v|+OSsfAw##YdRk5O)EnkN1K|E3HCg1Iq zHZr(mj=1wfxOA>$l64>1Jf+I-Tp2%LnMAu_%Z1owT{na5bIu|1{ z%l-U9Hw|Rp2!(#e4Yg?ZMWTm-JLiRiSG at Won~e-zE`V>o)8YhyD*_NoZ at 1+R_kKu- zr{PY5;CfuSd^wB?stMXAxt3#_^Pn-e`loB(9KFK*l1dBo>~IIpWE4x at DtC07RFBB~ z(}0Ljcx at 7mKhVmNPKBNM+K(xP6>8nRFFa^x#f5wv9owd7L3w6rdVon`_wSU+t5GdR z1w9-m=DrS8s+_~Ee6OCqH{0@&&T`2698Pi-HzC#8i&3nK&TPx*@aE}Hhie2|^0nUp z93|ogjgJ^psky;SXOtRbys*^8=DQYWnh?^n{cLBT9Qt06bV+&vdS|NbnqIKa683!u z3t6{;k8E93-N5#eHv^*!-nSKxhBj9dyBs*utN|%%zRYIxXJN{xCmgXO0Az!c=|KmU zs%C at E9Dw8tRL?@Va)oth30oYGES2Mom6VsV9Ih6ulJHj}Myc(Fj;3jk{qz%M(&`FJ zIor~bzQ3P18lyOedV^uks1=IqUYHV(?7pxL2kc0D>aUv#J5vvc^2eysd9h7|MkFhnc{8j6c_-27yRG2`TyhY_n%w6N>p@}ku#W7PQ52F`4=Wm%vy-fXNPw9JqAeb}yi* zB!1z(*dM3_W{W at msi#*Ln3AF4(`^w9?B3r$HV*CVA;E_EoSlTy$rT&N6?SW|!k>zV z{tlxAB;gjTpzqxE{gHB7-kwErMId^8sRH3Cy!NvHn-Y`@vGA04J zLIq?*7HF-mLgvM0Z>^{Gykc07>?OsJR~ zrIQ$rXYgB(gagF2;e_~;Ly`HrE^u)g11lo#t;3ujW z3ERyxNl4$<++G9P%sxd6#+t+`P#KeWKF6nRy>k+vwqRNNOls;%umq44!sJ9^W{OBw z&2;^(VnavN2Sp1%?LF}pcC}Dvi3;GS9X1j_U-B+BF5ycFY^%Y;Gu2ue>= zFH)|(KHn~XeokL`0lff-B3$WEzgGW5=0WEQ(?@UWZ^>UqJs2gYM<3AK2-AnoF5f^K zJ4{SbI`Reu)1eib4J)8ePBa%x1tQ>v)KTQAJFKE2JZ_;yE%@^tCYfj6H1WAQ?5EqC z6-kq2H%6kmE>nva#--z_A8xCgib6F}rL|~PptKmD$JblWFZS#m!CFrLPQO at pwYcd~ zM?=>c;|zYvIlNM5n6~b(SAGC()a!Ug1pz9dM(Awn;+s6NN|53{|+brb%%qw)FH`tqc6*-3m`n$PC%$tMZ%6CBUc zC->#YPX^z*qc%y at NhI_KWQ~ySRGl3k(nlMUqXNmi at yJZ_Yh|c~5{Qn3%v7P8LNoRyR7bWD#3he+spe;pJEz~F&{<6lFCEKtp{EsZl zH`tmlJ1xq!Gi~(Ogv;egp9lS)$~zSv`D`E4NDu at z>2*&a?qY|A&PLn}?xXWZW5H73Hg zXv(ny;706e?FR-`RrY<=8@=P#t_jm?au`FNkklcBBM$k{{92LCrT|8d>RXWM)}}NO zDQeu3v=^=X2y at fAk8%jToVpw26(oHs1!e_Ow!0?QK*$)bW5C?K zJw at Ut4g*}f>n*Lfh|j*>S5a*v2k)zxhX4)(U8?lmR3VaX2_wa*zJB)ziW!aC&&tsHchY|H$1k(1rot#De z2{~+MW!)r+rfXp|z0L8wxqan)-Em~;{d)Y41$a5|232GuKTHbvU1FRCcMt`HH$&kD zNXzi30L!v(42o+uH8mziE=OM(r>RO8+7#f9e)XIc at Hkc{ui_6WDI&uUvN+W>u;p$7 z#bAXYi~)@V^c`Zp28@(pSa{k5N^PTdUzAR{f$XBQ+Td-ih~yQxQbj|+Ws&xwM$cJz zO4ghX%Ub3GqePOzK4#&AbuS&u at b0(oi=m1!a#)<=75B>4K^@zm^kd3 z$6x3tqFt0f7V8-gP at E`!g!Q{=;yFZluJwzB;nHTb#4jhF1jy5gUF$D4Sw-LW23;%L zgtlNJ$ey*VkR2982zOEFdnaS%7l3LKUukuNH+>Fk#U!knjyihe2(pLL=o`NOG+_p- z6j(SHU at TcO=%^wNVoi0G8*t{x-J{WzyJ0yIM;n6<9umQkYQDxq7@{ZM*F?P9sgIz( zbX634-+$Kp+2l1GLO6I779aF0-VMoGvF#H3Y{j+)M#lXuoyS4To| zwY0dYu?YlxlSMDS+fdQ#eSt>*iH%rSQBEp~<1 z7^m>E;T1R=QNgtSJ#2u53;q^H;U9PARj-Ke(l1G*;R)Y!4)%uu=oP06AeViten}yz zFQKe%<97rB41_dbiFl1tq90x$4KtvqG{E(mu$b(^n&|8{wsS0BHgRrjPXCK`rltx) z)sQzB!!r7yHSI8a8^8agh`rO at 8UD37xbelw#Sl-wbC`*mQrS1>k`OH|fBTE^FlkhW z0tCAf!A4I^1WMT!=#_Xqy)=vqWWJB>6JyW~f3}Xu_4gTtF!1aidO25&hSVIm&xG(Q z at mT;wp(*S(VCW6XdlyW#H^${hI{VqPO-v1b*F;l{=+r{`SyQa}%z}mniP~3D9(Z?9 z6~dt+(*sxE>gk;}VQy}YrpkL7hF;0$ulr^tJKMc^mUTjXS~-?qzZZpT at +*Um%+}7# z%up}~o_1x4XsgTfIoBnxY_ykBf@^lgU12*@m7VP`Pg(k^r>yCaqQ>I+hG?Buy^qg! z`sZunDk_UkG0)p%Fm2?5cZjcB%Mxr71K{0oO(myfaJyx2wPkSa$zoaJMUx70OX73s zH0;tu00pcIHqMJRdon%x at S_9Zk2r($<88 at m%~Z%G%XIk%S5Z}8kyXD_Du<$(1e%pZ z9 at xY#Rp;DVfzBgE@#k4(@t-4Vka|MLm^yzZ*Xn{wY$*V4I{*fi0TS5=0XT&c025Ze z67+N|8=iMfai(%lgg{*_vTa4aa(B_a9XT zzE1)wwSiCdc{Q?dQC_XPK0qF135e_?@^U z!ofe2hcNPMcNE=&+|mB?@^6%?w_Io-AX0&bD+ASoDgu48t;1xJXQtQ1Ud$@UK|}oj_$IlTCR#`lIj5#)x5qlp za&LX#KVG{2&FRPwX~{yh)lz3e6wAq?Zh>~A(Pp~OBX}GZ%B)eYr)GusKy(wV1*$_9 zUIdlHnAB2~FwQb4@!ixpZ~U9dIXB_ghC=wZ(;D(T&uuV9){FbvaXiy&czqm<(G&n! zX>n3m20^SLe~QNDsvzwg2Sl*wXue9$l8$2^5e4ZRU5zzTwgY}b3T83nphY*miIBb_ zk1gnJWLQCptQN+4_fGyDGQ%e4tv9_ykxG3q2lH;c|A9CrV*U0a~Jad z19d(vW=dWyjlRd<%b0@;;?FBPw)^NSGZf=?^5L$AHNJg0(^$EGe^QMp&-Da at ZL4WVQtlM=^ZI(8<34j{?gj(s>f@|LiIDe?o}izs_6!8==f)D?9^@ z>J?08am&_fcm&D(5U60YelhtkroSMf&RnnSEdQYbwUp=ox{5`*wK9mVHwUJeW^k*ZA1g*q?;5?NpxsVy_ zPQ_T(^j4{4`?#{o>!xDMUnzROm$b=qUOA)@yN;w|xfY#wPj-0VwVt`{N(x%A82tLz zk`+LhV?*;HMspOdm%@PhIrYs06=pdIBN`3Weye_ at XA@%|>Oky7fX=(_tQTOl_rNe$ z(NF!1cxrL1=sfbRNknN4Iuplw02;5p{i5^d%QP*jFGezd>+VC7)h6*{cPdbBjw#xV zZ#fOEamooVyKZHw!dmO&1_q-+Zwm_mM1I9M8M!gkgM)@)ECpEF0H@%Yt#j%bN!l+1 zJ6!oD8Mr&~B%5HQ%4sDTOhU2!9DNg9`PiMwx>_KftO#bEC{@0j>KVnnc3nE;i z&Tl}JnCHsR4T?bRC4BDqK)hmHfZ2^F;IxOi{)X7iBtsl zx{AUrPfyx^JP%u4M|=oz&|w=5XAyDWzD?Xj^sR()N(9^aunfbsGiNf;6vjPWzqK0w zD2Z8>w<(5dvGgzLuX;9t%3gEwX5BDYqlpFe;ZZTpB~U~L&&ro`_5NYFX>z-puy8+0 zuYultc&YA7-t{&mwdf=OMsL#IJ>{Qn9EeLSWy*-yD#rlbx(F(!u%Bh;x|laiqgC}- zn)yu at ZwtgK!6fg>v(|;xJ^+te#WXvew7QI5yT8!IXa`~o$0zP#6+zWVU*5r;D zPc2?de$aP9t3 at 8bV^_hPF7|N!)iXigga!`9!o(${92i20SyPb5KT1?_^^RrU z=D+DQA&o3u^BEGe z&U4<-HM#sS#-XzYs8+h8d at gVrzu>G+<7ZNV?(CDHgQM8QA-$qlge2Rq#tz1)5*yDT z6Za!jgJNQqmB-gNNENMN at XHQXc+4k%K|U#Hy at WSJi_%B*r1~D?in0NQm!99{0%T&8 zfQ#Nw_3CiDNVQ;VA$L-9QIutzsIXz=mlWI}%)$iR;2c}-&~Co~!|t#_LrV}+O(F^E z1V2xr at BiR%!=yBh?k^5y|6OkJKXUlrk=~ZJNPkJ8A}+L(Wqx(_?MeicQm67eu{5%v z1#vzLqTs=(aXOV?3Qhy(=G*#PAd@^6^ZnoJ&C%o}%$-;{IUP@@+D~~-PHSy>0k{O1 zp at CZ+$MiP)vV~FXSwlf?j>o)q`NsLy`GWP&hh8G|nXo+qzzGI58f|meQcOQhBI^aycXP)>G`fHH87iJ?wGmbS1A^nP=92s&0X= zyGaWB_Gg3Pn0br6RRhVzLwgR#<=$=(Rk_!h at A`%WuQJB;=Yt?4^(|{|3&#`h|P z#FKrh?q#L4MmPpvdJ{zhOb)xww$k}9RLJ64V*VJt5 at svXl&^V{L%cir+ zgr;%`fqpE+o4)(c)Rk4N7mmOH0ML{Co8KM(K;3^Z*ZsHf;$_qyTN6^+bQn&^pkV}v zv}F1!OdturH9j#qJwmg}#BoXVw5g~@KegnQ?v<5|jSlGM6{mQ#%7!!wHO)(nRvMS) z&x&TxWtykn*KYUp^e+GK_p8xVciS7z*R01sr(2FQnX#pRKJN+vE`)Qibgt|TX?d#m zZCJ72szN-s?ezHuPq*go-U+<`b(idP5x3S#_a$w-Fg_#gczX)=0a;HD`B`xX{0XB5 z`Q2T`pm0;*aa{~4z>c?7nYjpiujcQ{uomrve6W*caTo8HS!D)t2)SZvf9+$r3HW#^ z4kp at 6^()$NMVl7wHQI26+K$JbGI#BXBrClXgrshj4NqeBRPS>Ffl8aQ=JwVbPhtYj z6VjO|v!O(O3f#-+(&cmd0YMzGf(iJ)K>>;yE0_8?Dz}OLLSMy%IJXY}vEl9*U&T3^ z7+R^@{dM&u4E)g9eimg5I|O3V`Z4&u(_`00TjuG$i3jHntbbck-E%hLru6zengS^W zan8xYXJLHFvJ02XdItUMPL2ujOkLTax`Grzd@!D^bh<&nFV-7k zj_`X6{S5m3ApAEdOP3&4^au+LRwm4DYIWX6&V-g1(@SXE4H+UmcMZfovuc>Te;l8% zO+$vcpq_?HClJZG{1&RXNCW*Z5eq7bC}&j7;j!v=x&-GxXK5Bqiy27N>2BKdd|b@; z9*u9CIbpFBK^ULz6$6kXMm8}Eln(Kd`SV_MD50E=1IgNhzX4e{E||wuf7)FpJpCCJ z;EOAeKY}5-k5*HUhmtCky65eB`88zmlqE zAh$|rg8Ta`{XD0IeYla}>xwMiYWTY9EA#txd;^CkD)iV&Dw|OY3H$7X>-XSAT_BrI zRN@^DT&Tq#Ly-wis`tLr)CO)>4eNJ=>bM6Cc-e>T-6y1=968D}Ii$ci-`acYiK6Kx z({Xf(NLW=(MfzCU)p!C1a?i`Q at NglI;`7EV>T4Eev|QZ#56;eHo}f_Rmx0oArNei0 z3hze-?RDb at g}JPlMEoT*iIiQk-sY(k$^bWJ7$uoCbV< zVBHp!3qWq?Q1uMfF(zk}+b zrTY}>rB_;l=IdKTf;yj9=GUbv87+#zJ8E$CPx{iQNq{asie>s*3(Vb97U_ at Sg!hTa zy>3DYH+L z)%xqCVV7R1dw^Q(>siUAd8P|IwlX6bI104{HH0W;^#rT_d5-Iq%t at 3_`uHFeV(`Z!`^FHFbzTn-h6Kj+ zVa*2lbQTmy6yYe(!2s(VTY99 at K`--k172olQrSy6`G|3+2#lH;W8fK=6$Nms$|B-W zt5U1NE~T1e+U^($jFbf{>pJA;G^jLbA6TsDf#gV4vs|F7wc;mf at 7DML57UYY_FOcTU|hvZLZD{ zCG~1Cs9iZVM>BGmsu`G_`%0dql+nx~8mlK48G&P|9yk)WYC8Th7uN;Rj!8F2hIkof z at E11BD|0%H#;QD=iw&Q+8`k|BhwIBp+W}IYn`W+@*I&`T_>`?;#g?6pW%6KC3xE%e&=bU z-;Z+TH6gi=X25Mx8LonZ;J=;OCG0_sYX`8krcYJr5o_dsRFT=Q52>7f|M{g)6c2Gz zIY^pSZ8b#@Aah~UawkzvBY`nHv)?$aWi2cT9m~`fI-c4Q zJ2y-ov at 4^!0okq%YK{SP@#*5s{9CKfc~23tarPMyGVdqa8WT-uhHwFnZ#mse)E@*OlB5 zsjG`7C&_h4*KWuQu5hPK$?Bn2e7W4MRDO4jh{ClK6|FtZwCstZ_)kv=5M?`5%Vp{_U(vC~WHwP&Xu#r~I!^yB_5 zlr<5PKMr0imk=m;78DKHp3O%zG%FA5y4_p>*5g)nzLR^vMZZW1O?o$KMW&M#)*CYp? z>jUiZ`8yNJ?g6QDwz&iCLqp|=rhdx;A$c+5&OVqa0xPjT$b&$Q5Wni6Q1JN1~822g_nWX8N*%g?&Q%cCI2p6+j7P3n=^|%CV*akCqS{^8fn0*iw zS at DF-Et{pv94$h+ST2q-mtN6scV)^G52bIR-)KYFtYOv at Sdd6#fRj?>vu~}MkX*f~ z*UcT7R+!l=)5{i>QMY#Y8hYBIs;K$dT~itvl1oji$3%1H_7H>9 at VC;4BjgB2)RgUj zx;OcAi*6sKZ64$*9h7m~*C$@PlC-jIAB?#k9jO!Bv!iB&Rh)45l?yboA}kOVSypj} zo`BQhf!orlp7wN`J4ymF`Ry1XYhVmJb?@?FW?N(JYV|iSuH|jbi%9P4RD}@ zDEXV{nXc0)XC%&h$TUj}r26B%n}fVR1Dy;aP}`2!nTu$oIXOcHQz=7h={#$`cJVP+ zS&Pto&z*3xZR}DwiZ@|v$msG*l7j2G;9GG#y#ZpL!Ur!9ir+=o>P(@pR0%3ipUBAi zP%kX-vuQoM+WZI}>5Y6sBt+ZKgsaa2RjmZOAr6 at 4V?}f{g~lw>NU9o;s*%a+UB#Lj z3T)_rDQ;_yh6tCQlCH2TQBC0}n?k%=Nqn0n{FW)220h1^jUsAaO at uWKXX=9k(})B$ z;^kR}kI9W25mxsH&5adnv|^9^UJ)z0(eRj+OVN(nL+NN0AD_)Z-#ND8TT75w#$%S^JKOn6^HyBDNnn$L}F7 zZcJ*zn_`@xMM)1q52X?}4=zUK94Xz|A~L=M%aXZPjhkTZ at tN)swAs at JBe1M67 zLs425SssPER?56QP|Xgd3JP^eVd*2BFiZo4`hZMCSVa)y(u{MlNzw3NAo)*UGS(kI z8YvWHX{Xy*g;{SL4JPe1(%0_4Rmf(2()0Ryf5Yv8)R4`^j-TD$tp*a$M6i>YQ20Nl zp)nGj1f;3c|1xYt89fG(Iyy{4UQI?nF;tTaL;DW-^}9?Mw9sHRhumqlEeC6g0>&gI zXJhs{>+%#zrx}q7oO!fHDt6cOEUWkC_Y-w{j$@;|x}(MGRWk$kx1`TJ&2Fn at O_pFO zBA5Lo)OvA&?s&3Suab+ymWr2b-KmiOWpazdZy_z&{)^vy1Ue1@?Im|LQ*C0W!yP;* zX?)Y=tP=?+ at Zs;jgiA5odPG6%r!0Ep;?SE#B9^&w-(v9=Q*ahAo=t6%B~9e%lHC|U z#al)9CT)gE%#zMz64O}2jeF%OIiPEf*w+Y>4HNtYE^4-vvI1VWsynMDjAtK#IhUAM z@)=w>@l#!aJU51Du2}T-OTz)_KkIlyDoGdE at K55xA+h8A3`uMJ#o?MNTq~79Th72X zxdiUwJqk6RE&Us5=BC!HcG>*H583kL-gk4zVXPPGG5r-kFKzM!iBLU^4^mi_&oX!n zRtMWDH+9HI5f%A23Elad?C} zvsd+s3($|j?Lj=t4z94cct9Z-oyCQ*zryRX)O$uX7W`Z z6xpL=WSe6iCLzpsQn_l!og=G{=r*vW`n zPomHBRFVu1$g||`l9G$GUv3Dbr^Mo4ZARN+CkUi(@DWnNUeO^%Qe8M-?FG8DCsKD1 zgX>A9rsWE!O-o9HOEGtLTvL1W_G_Kreg|Cho-wj{+OlMO=O_Ae3I+5hZ6dumhWT%b z?ZG*!pKNU#+T+Dt5q$PG7a{+$={_}k0O~Gzd`fI+*fc=|X zEkP?=M`L}1|1NJ2ROBbcjttI*`#V6 zcVX$AF#&#NeS`i2^(vWJx&Z$^i{hjm_4G^q7ZT4zM1<}76(m{U$S-G at XYu?mfdnuka zWQDOZJ=0^AHEbC)(|s`jLZ)v#2i5V?)N5#3KoL_O1SY4`eg#@TbJb+na78DSD+{eT zWX&E^^l(Uz;KY60K~G$TzOKM~DRQ`?m)%g#=v!Ve_bz;i9;Il`d!FcPbL at SYO6H|J zh?;3P?Ez{u1Q at GzJ$mzTV?q)g8wGmzmnn%9|C1oYWk*;_X^8P%8x76T-x$BL9^G?G z7A_ at ytiPLB|0j~qUW>aT>#F3Eta|!3_cS}-^$hK$|@~wILp6Q zT5AwHldeRTw1nPpuO-~}uDb6cY&?Qf-VH at f6vv@X2{fyRSxq{CIcCAV#UgdDrN~FfZ_rL&@7HpjsIw*Rin$ z#srWt6tab3nRdR3BGiP_JA4>2E~%VUmOoO>gJli}f>jPfDH>oR$D3+^v;s})AK{Cl zFEUb)7a-Kq4fdmrDqc!l)M%crL&*oic62T`o^bveh9wYA;HJasL_bW2GFe at YWud^D=%`$;gZenIu=HT$6;D8C zNMi}p&AvTnQhD5ELS6QbWd7l3!cR?IkwWtt!+@{y3^kap)lWqhS)xv5E{-%=LeTHn zfk1LyP+wIkqJe6mNe9-ejtUc)?Wn)zJi7oo3^AOduwFG4eT?BHNq*kmAh1a#PBN`0 zN3%m~b}7IbEdgN+X46?B)mT*SgdMisvdwzdK8;Y5Ya?;THzlH?g{s`RYA!3z93d_t z${OKfsV3~AzlrEx+UzVzStg)aa-vg-DL`u(=^%nm|{owUd# z at DTULvB;i2NIC}mEy+;CBYNU+mW^k05CPZT%b%9L0o|1Cx%YgAZfh)kgPf`IyUy2h z8U`5F*k$IJ)!E+js!L-&K{Z^Obl4?h8oE+r|E7xEq>?1#+psz-XR_8DlpbTZ#vsh? zU3wQbqrO0mL}loJ$)O)e-ce)8)U;%}uz!B6fto5U!Hry7>7t3`;F%>FXXmAA%(B^=9hAqdsc+8Hjdm4lhB}u at o=+XG0%b?W=>BS~S zm$gW4>9um4`a at hROoaqa{n+I^xB6NH7aQ=aMz=!PPif6RXx#i8xrNE&>#h{(4h5jd zN`kGdGtO5729jBMSY&JYA>tMJF&$E^2c^zyz628Qk7Q at EQNosM+Jdu&c%Rq9ywhUe zFVegIU)k_;96cv5_V3*8lZS|1&OofqO`0NoUjc1aR#@zkVlk#0FlNqg at zM-YQsWG*=jfw4lXsWdIBpe_=Le;%S78?gAV^($; z8>GO&PN%tLTIkgbRPV_iuvZc~aRIz`a*Zf&PAjJ$0VZMrgtPz22&(!3W3hUkcfpYu z`D at a4`;Y$&@tpdv70N-)fMw{;%tHu at 9W%2nL2L_Q_EU+N|c_mBh;= zS0yuEq%+c)v88sUMwq3bFoNFHKe?b9w>stHB at P&PZ1>E3c|o^Haz9s46 at ZrfkPrV5 zW5o2gG2^ynT>ka3M+f<@HfMhyv-DpVIR|4y+rL&8Cv#gH$NvsuR>V|A at j*jWfwC|+ zScqGSo)22(v#`wgP?$#uBrxNXcK$F{x7Azpws-j@{YRA7dBb;Zrb)LB*)+rFCidd# zY7!t2ItAl~+jFLU)^Wy>W|H?$&mZVMqAs|@NV=XVd_NLT_o+ilPv3zGcFzjL>wW z<7zjG6I6N2lgktW%jsi>2&BNw5BlL!iiVL2>*oF_?)v;VGM#x6d3FTYb)T0kenD5m z)IK)5+cV9V(hV7F#kihJ9{$zB2o=g+0 at lfl;fyIYnfFdeUp2jr^Y#i$_=)CZ9Z&1krL}IOGHwddU at Lin}nuC3g803#Gj3$k2Aji73_xpAmv4 zLd%Bc5q&E2TzC!Y^`p2Nv5pMe3lBwocLrr`M at ld8$(sHSDpFL;@=I$$gIOcZ$#h8! z`0F1wVhii(1Z9;K8DmA#_sEPA&4R=Mf>XiYFGvrXrYj{iIdjO_#53(VSH{8w{z(P% zR+UnX61T)I2T*o~b}U%d>g*;WDC$QAYa`HbfCT26s2zsn{MMN%b9w_Aa$yG~6)p!c zI6Kh?s1_~Cr*!M7Z4 at X2Ymo+c#5>Hr;tp+#l!azvDw4)2RL{xka_2KprUm3zs+Gml z3f($YI3~d&n at BLWOEOKi8}bSwam at X8qZ60g?xcTi_s#;IFE-4(j1z=g`MKEjH|VDa zPYp_G+PS#Raa$9Q<@I+Kw10&sb!CZRtbRklTkT!T_Yo-CSXeK&_Z<5-Y?p|naQmuP zhnO{d`6PgHFv!PW=e=9g^}CtL{;Icm(2ifBQKd{Nic at aCP(V z+h-qHzyUctY$E1>7#=io>dQ4e5Ij(wfWzm%BpxyAmV|H=Gr(;YMl9D>B|s;AQzZ at syFGZQa8wcRJ(PrYFIU=S?m`T zG$Tj3E}j13;mZ_FE1KGS z8Wn-)k^rhj{P;ixqICjY>6ZD$=xgv`D-}N_IEIsMNMz&_fiCeR+p{d%vqqwOHQ|K^ z&-Flo<_D42TL~h&;y?Mh^_aMlPe}P$!ZjO<|B-zCbJdd zAEokdvJqrg&!hkZ0PyoK^ZWlU8&bA5rhk);|1u~BD_F`d%Axzr*ldf$hesgG at sXyM zDaqXd(GwIdnxBt>p$~#nYd0o4aTi_A#gbmw-Zy5T8^ZAR;Te1F0%4INCBC$0^`tJo zX6g3&Vgsd(N}v_CW$^RX7>h;M!E6>tWhZ$kJfhj7;3NJ_^-*R<98c)*4&1~f*vq7ZUTiHJlXfzd5>N-xn%1t zZakYA&&9PITWk7H{kH2Qjqww;p7v{~mmt2(OW?rWNYN;fyE0Dt*(#%Ip%J6uJZCy#Iy>UV z(3e8X*catbdP_>bu$BmtyOcqM8z!_9YJwB8O1(&xAu#iSbXSP9)+o=$5W&tqw|&%u zztWT9tX+7Wg!1E%pwcg;TOn%aVYtvN8 zf9x3jH!MvN8mRG+008ju|JBjOKVkWwJ0f*RH?3u7p3`X_j|9<$skH==L&Pz)2f}qQ zD!znfwFGXFOpk(ag75 zb7h;VotwJM9C~5loC0xrw#~_mu2FuNY|u}be)!)HGV;1R+m!}KR(WM)H at rE~7p=`S zzQN>Ax8#!}N|(QJj7~TXKe?BXU+?}RUHBmn&mq6}?orE=qLQ;Y1?`%fiF}jF&o%~* zY7}l%^Qx}9V at Kmzl_@qje+;TZkxovo4AwFzMXIS^(5-$7;nSjADMRL5%51shjC4+s zKp()Q%mm#4TTJG_rtCI97J+76=O1SPG-^lR`!x*(_~^yCe4iDB^Af~RMj7JjWZWXC z==SO(ovxx=NzS_4q)k!6+byF|-gRtV{#zTvR^0gGA^KMAIQtZiBgi0g9&?*EX$Kxh z(=s2uruU$RtW}WR`xTEU)_ at w=dIjZh zmf66J|C+!24y%(@lH_!FgGhnhXMGtrUya7gSUpGX>+{w_;;Oi71;u>Gn~H+~#mvbBQvO|lbY at 3zg5^3B zDce!8>emlOejA?0?RgshV^6!UZ4a2l{Gni~_A|a1%D#Tyqe-_BzK?sPzk~`4zoqZ$ zz%-hTK9xiTFE*S=Djc{$ye`Eml_JK%^VO^$mbXK>PUXS71rKhc}agdC1 z{kFGOI-y&Ly~Onl^Sp==bai(SF`(fGrqHTX)S>V%?C9`0JObw--VB^Dz(hpStI~Fu zu)~Gw7s9qYM^>u`jRy4i!=1C!0N?ibT}V{?5Y^HJ)x4Fwn3JpSQUg>K_4M?tKy*Lu zwIclMVdvji14pPnKl<)EW?&8df9tIeB{g{uRTNnI)BIvc2N%Q=90(dnK;3Ptqej6E z0}~C<*VC)BfqNR|2bDvu~MT$d-DFs<)a#)}dYHKwB&u6v1#QYd(z#(VWEB(qXrU(O41 zFFC1ZC3*AAJ$dsSF{%^9?Auvt6_p`6&vjv|9dMzyoxj z;+qQ_0zP?_pj~KqA$q>-E|Z&y0W*9&vDN`hx2PdIr~Yo3;ydC~$s=7y{#^7aNJ6%t z9{{xklr>gl00Jg?)q#(xQprOy$|rND-mcdTqwX$mf?ucf0inC_!NWuT7ywH!`_mFR zFFkKby(YD&-)NL*rDPCNJkBS24MGKOh^A1YB1W$5mIhN4TXw+xYE%f at gfRxSY)UhA zQ~TDJ8NEq9+UIvnu}Ts9JGJ%bNoGr)5?{MX$2drGmc(0_*ic^F$P9|b?qZsoY724^ zldW%+=pVrKdhg;!jA9A#pWANiN4lhPj;zLA51NDo_ z-%A0sKay#_x0EJ4k1}~Q4-u=O;mF at F`X&;w6V?#m>`A^>QDK8Z6ycbnf(ATHp2-xP zEQ_oS=^`=_)z=&3m8h*RLH_(a;XLovNCjDGJDEv!hDu0!^hW4UmmdV7EznmWJCjc5 zg`OiSoXN{?#!JM83m_h^92Ur+w8MU+e&%oq?<$&GW_d2K8ljNKlN1RRu$lKHS`m^R zUYELA0#OK~r0Hz#aE=*ZlNI(~HiOqTU3Uxnb|1uTo%233hgF=b%iBwC3-SVEqC7w8 zJ~?_%_vU>x@#!QRKFB1rf6}R+;1F1 at cb`Fr6QaeU&U$f~p35fxFp=O+HAyFI%L9`b z-o+K7S-o^bd)ks!PIAehrLMQV%+XI=jHkOKVZ)Qf&-UAr zpuF`p1AQ_rDp-_0mPe|{)Bb1*0(OLjoEdDuT&stV2mK&<#N?0xe?**tu9**|0eyge zObzgCyX1c-=nToQd?*Ki61x>*I|t4HWn6h1z22m=in9+yY>|YHtE=hgOPz++sYc{G za7jLus`zdo#nN%^6VWNViQWFjCUYcEyTc__)n`u=e}T}6N#Gooz%b6+22d$T5~g>U zM?YQ^QR at uvFo&+{#>U-*Q*oJZc4{^g;vz{F-(-mups5_8Mpss9ddM<<5 z-v(fxRJ-=yhsVh~=R12!y6ujp!adx}&xVSX?WX40CxM)&_Px;pf7Oni`-T(v;CNWr z75{A$C65qLYoLiZ)R at r!X6YgAI at rFZQe{VF+F_btqP17VMa#Cn=dAGm2z$rqOrLe# zHyzta$2L25(y?vxjcwbuZ98vlyJOo{$2$MH&OGO=dB$FQk5SKu`dW33QT4m-yRPSl z$yld&k&nVhVOl3DsBqDjGoM5iU;Ywet_|7~Oxzvp)%0cY08Cub6Uf?SF8zI#x6=fQ zRvyIFDtPIV*O%sdjaz0<*oSIa=ejnl;vs at 8I(Ztqr|_emUHORdrWPOnqe@~l#e~>9 z+RFvF>?n4vkR4jIUTnEG0xINQfb?#hP59uX;A9HXKD%embw0-#$S22^__r`pp?>^H z5J&A0Y+VrZUYhaW(Cay4tk16Ka?Hrtm$!TCCuVg9cWzcnm1PcR_U9@)1OAqt6-kAUg!IIKc at gQnK+k{h7FayZ za4y5w_q^K{1*U)8?V2d}ZkscEfeVAxs*1HGMtI5eO0hY@=(f%M*keZ$@yIHOd6EcW z!m}#7;K6<5!0*xKZ`u%c>|i+WFu;tE5 at NbwcNntU*Zxw&>&ot#w!MJ=Oz=xKNaZ0q z$@vXpwP)b)v0b*nAY|AEMRWU-T^6gm2R}B`#tX;@?2qyoQQ`KyL_aHsk_XGha9^e* zuxThJM2JEeUBMFV90W+~(C at QdH*Tdq;W%qkRJ4%{=IjMIn}G*mWL(QMEEn2KoUz;*}eRjaRVIXrR=?9s>6;4%8VQh=5z2 ziKEx#S%Avei2_WXxK(>3iB1q!MF~@F*>qPj(1BEUTGpAKu`Fv<{=F^a$%z(!ATA%O zEogg}!IQ8zfd9}o`Lui9>;jou5vOEl?xx^sG~@xwohArz54j78UfDgI|Ia at BI$?=; z2nERuw6zT3g!`1}UtjR)z{xXuk;jMIr}r_k^$GT&m%K;!>Up%F+#*#?9y~ocO31u?|c2C_A8#exeOmBt-Aa@;70xQ~; zP4ZsVFRzQuW1KohjRTCq)}?6q?pSPw1+ttLa)2n`4DOvQXU+F-O>dS$0HNHez&y#e zJjRDlg-9qf<0bo at A*?0KuFCT zCH)1IpNS-Zp_tm7qOm^!hC#PBeH zA8+N;DA`5N-Vq(!(HVRrjHY1Kn>QtI=B2#*%h!Q94Z0XBmW=uyt})bYC at pnmMsAis zYlJ_*`c7Koj>Kq}{N)Sq@``bOte(K-o1?}onv^Q)G6}2b%TLL-5p#d0?9pRmEwRiH zsOJFIU9rOOi-l3NUajvG+nz8yK4nTm3xAr=+q-g(ro4FDfI*OBfNcH))4)eSPl!n3z?)P)CBMT z&aS~H=E`;_=kMMk#4j+HJE*o=fnvq4 at cj=a-C at 7d?hk6E+Y at I(Kf$m7BPGRC;^E%{ zN-}?qhh-?y;kv6e76vY+O;R38^^P{dGn;Y7M#PdqwcKCtL^BhWGZ at Qf1!PpIG+Bu5 zC&|s0Dmd%mAd|686z}JKaWLw!ar1EiaM~_$wewcN?~ec{OW0tlv0i0Lva;pBH!3T} zzukPy;+XWqCAGBT?KUGhXBe at nX*gvNeiwo&3JYR$L!f)%ci_(HhF*^ZHu6}c3X1sk z|Co3<>WmKR6msEDn`?7jk=T+eDsLLCn4%Ilpn{Z9N*W85a2mu4q>d+Ma;B7xk?&4c zD{bC~B`HB2QBzD+l0BM0)v8|n;~|BgQ at 5y`HUFD7MeJNXb*^N>F_PMM9nz<4UTTHb z#<^%-&W(!p%(m;hYMvZM8&oOKli02pmpaRad0IC{TJ8c2z at 77__yo(ssfL#oR&!V% z)@3#)XpV%asmsf?gk~~{K>)xxt*H5yQWV}xeO{F;9BEg|C2q0yNhup!EX(ddVHV+) zR7OsL%dq at a7Gu~z`s^+i*T21O>^y(}M39uE*8EK5nz`Y%3tWC8$S!$$B7o}PCi=4i z5iqla%ueYdyqdEJm#|k1N324r3!iXS+=8qrcOI60Tr3D3mb5Hr!ehZF5}U+e;pd-? z14)S>jcyoWq*53zh3*hxR1|8|6lzozy3dR-jDZt*g%erDiq6A^-pPjU#frXSNmaX` z;4LnE$Cq!qx{Ha>Z-W!a!wUY+1`fpv?q&gfy^Q>k z6uPU2&`*re-)jzi9W>@LZwOtML;#*kGiot<#TS}QYQrZsmo8#F!?nI_Jf2~F(O|lg z-1xgq`l at +1YOwNTaUzv;XY&C#h!H+sNd&E*Szs8C+L&QQh6O1Y~hcrHN zpU=%C*T at 4!%?a}%N2ioC9_OA*{p_KM;7#& z>(aIK0$~KsorMix4ANXml1y+)WldL2l*~I*3u|;cft}~MMT at E{sz{!TK~=fy2T%g9 zFO zC=U-KB~ZOZ!i7zag3S!GuG&9M zWhweu1$mVqjdpOB at HZJ34S90&j)gjLT_u#dS?rogp_ie8oY|S(mS&ZwwB#gov at EG2 zp}ppHWO_OVk}0L_??-ZAJUe^Bd?;%|NNJv}8|e-90&|WNEY5)s3+y5>k9 at P2QYoOg zs-#*mcfLu~b6v?*j&bG`puAeE>~cIE`48fAbuQ}HUkS~fp46LYf0A!y+z+f$w&pDZnGMXnwb<(#FeM4a*=M*wne*?g{R6YyRObPoSfue-1|-vh%7YtCJYQwfP)y zazndAt*_Y;P((&+T{|tau1aeM-8g#~S<4)V-KjN$T~rE!S$lD&7%&*7P23gs!0*ix zyupb&z&sOX4;n9D3r!e$n}Fp*C;+_|=3c(r_nn6SL%K1tL-mw!R*%hbhNYIi z2W($tnoMbd^m1j!c>)M~$W}Bxzr)RxJ6GDAk-$aIS6R|h(dxc=&)lEPSHT#$Tbyj) zc8chRQ#ryIxh?AIXqMfW;WPrB9%k3Cm%N at d;Qr`$F>#JjSli?jaZqU~4A$p at YP@NVn`BPm5xwxWT3A;Se zHX|L30ezBP{c?PwpYFKdrJMD=Y<=??^r4<$_Qo%I1fkPeC at s22S_fKBcJ&K<8H9WH zA%8&SqmEI>3bhbrk6`zFaz;7X28u`D-TE}P9*M`z;b at BzfzIM|p}Z`6<&nf++PvOT z-d0#C;2P(VtfH|dTHQW^Kbp)cgRitcdq?Eq$CEJ{ib=?oksbb;U?{@n%=;I zjb`x<)Suy4%Ny at N;9;WS_=}vrS{lIgLx*UGrbntb&BXk0I4;V4ko?E9TI#aOhUZG=zvMK?BR9kiTWE?P4&B2Z8b9{EU*cTTX%E`=!^nd`nU05lq zd{AXIfqyPt&f}SU(K2_>;lVx|0FmgCQ>)z%gz<25!AzNDjkYu3?k~j~nJLL)CzaZkv6dK2Is?XS0ON#94%g+rd4V^B1fCam z1384=2t%xLHcBF5)YS#_mZHD9ly`;PwIN4qp4KYgtk at uaW}>%oNuw+Ak2lvJ%YC%efUxj}(jRovF1vLhr!O3SoI< zkGhc8H$Qw!r2FlIUIDdwvFI^b})l=1j zA7v6GU*pcf*x$hBALEbs_5qK?vk&539lirj-!M_%)Y4zraqD%|Q*5wT9K}biI(OpL z`%aQGE0R!?6kKVCf{sWt{Y&-E^TBm53lG%hvYaCvC}pEtiB|9NtH7b6EMgMxs7 zga2>aEB^13^FOPG+VW_M$X{}H8>yl+G-|&gwA)1h5D<*WXiC8Kw&r4btid3L4cShU z&M at oN)1rtsZErO+M9A!G}7K3!l?$ zP(v(O*D|4FMZ&LOn_`(_AEQsvwo(7mweE5Rt!lC$K!2VVZdzpvl51di*PFas&uRp~ z4Y|^Sp0Q23 at KU;yA?Ic7phzSS5Q at W(HdTFI=U#D4^QDm#g*MB$jsC at d@(W~oZ|N)U z7dNjxYiX&p{#zrr*07a&{XVacF~)AP(|XxB2tkV5D4&w$oC8r?7=Eo;dwJJ#nNO+> zYfG)6P_PG#L^)K+97~MkX`}t+`zA<}%4HL>M==wytJR1Vht8)N^}>xsoE?*;8U zP^9qbM?_hHY=W$q8gW*nb!Ii{8vL5GNt1~aWnk?M;GqwI_ucpJ`za*NXquTy5Txn_RRpFK&evI$1--f7SG z-8b*utq(`L-%s7p28dtReK~E?GHyKe1kapvfnGV_H%$lc5N$g!*aG%M{)F5OKae>0 zM#U&08^$A`?ns$zFc*aHj|ltT(98&d2Pl+sD1jd at 4PE;2y#6{_N7zG{uS at V`D`s=r zcjcVlXi#p#M$hSed<>;Fa=ZaoLMus#Qa+U+JlXCzJP<1k?O&THD884N3oM}D%CE4| zyUzx8KbB#p2k#N|iyMUgG&yeBzGp7RG#9O{d=)=bJhV=HP3OTs5oUIaBjOM~e;Z%Z zM;(?Rh2FG(pQ4Q()+&>@;d>I#(^WwsUhmuR}Ek5l`>nn9pEv$Yx_jU20wG&o3|G z5G@@eIp>J`1Xff4`4 at 5iF1=X?P`0$4FQ{9=*oey1EV+D|BY_U%Sm8-J6t%I*aEL#f-3~+7z6DnP0k=>kH zl;^phstP!`ld{(u5QZGi)2WmfG7Md at JDp2nVZ>?RHd(Y#H1t$q!wyfv8z+t?CCwf;n09H?^7oU-KH7-98 zx&xyt at PfRJ9%^X7v$=G6F|perg at WTre373xge(8dr=nO~+MTsq9IMn5egO>{DmY#p zqboFT?am1T>b4{BX4jL)w_umZ*J88|{R0OKb{lyi%g7VXPT3$<2neHGZow)$s8Www zh5jLy{aF*Zvxg7SJ4y`U*QW*HH>b&$SWK-A;qehl}zj=LtB<^4myJP5mlJd=*_7h}~&k=c4;>8WNR+;q9Qb`d#g zH~n4 at Y`+5WRK*xQ>s+_SgtDAYXf?zj8PR>FPfWDxfsSIEK|_TYeC~AfTBAfAjwTz4 zEle*F3R?nn)=DJK8Tv6s3{K9Ix3B!vFAaHMcx8mrzUZlUR_&A1c%9`bdP<3gqmO6& ziFv_=NQ&H`dX$}l6_U2wQlUeqq at ju|yD4sDx!?BO@*0+PiA!#2k4K(>2VHwmeN8CwNk-zmBm at r)7{zei84Zc5#EkSyq!P05E?ScW-ge%WE&||u2>rjlq;HP z+-?v2&H%H~{L9fPsvXO{uFagr>*mQmYv85+5@{w8)QsdM)JlT0{_BiTblg6I5zMKenlDnjYT8SC)qik z-#zNbH_^cj%h{3-l~{C_M{)G!so79XeN>JdKH3Z3by2P}=RtHxxLAqX(=Q6fN>{^) z(CPY((?(uU01|Kd56DnOJ)h^NOF$&up3hXGmBNn&<^kh9nkHCU7FfX4So#5x8A;Ll zSb42nm8+qai?fm%VM^yHjsEwc!^Dc>?bYpmEZ)(Q=D$W$<3y4KAh}m`$+dQp{%Bg| zdRp-szsQ>uZ~JjD{fjlJzo}35gJBA}Z^{Em4gcuucDH%Wm+lgANxxq)P;pP70#EE$ z`Qf~5#MlCcG?y9H?g!q~5K_{O@$*;5Pvh`8zi7Z$n at duAs&=ZGT_dkk5?6KIQnVXE zdzmr98}3oZZbUWf5{p at CK2D)OLt?89%a)i`III7{@ubI{K_7!tFK-C}DWAs{{ zqRoEwf#1OU1tI+8gRKxL<534ty-AeaF_idmHVb?R=sd!fY8ol+6ktiSWx5B^=H%Iw zAUX at ES&fnTOsQ3CoDKZnU2`+!UZ at iXoe`8>1VPP{dX__73H%NaNS1SOqYNJ0 zE4&GRqNR3 at 81YK7(&POP=C3-(y-n*HXstboVR;}EU=vs+X&>jw)u%tPn{=(x6}0eD znH3_;`ppL%d&b^I(!?fY;uA1^CG59(LC?~xkGti1qT?TZc%jUz{N5jDd`17 at nEVo0 zQ}KW(JAmZYCYzqKp2wReo3?Q0Nn)iyI~3a-BH|n(WkXx~O;L$)W}iK?Y8_nVZp*DX zbAc(i=C~i7P at L_rZUW}Zl9QL(oy)$~rl;WP`}*rxPg5_ at M%&PBFAzTobA2MJ7pu)P zpwk;Jl4k2djlPRq9*6r0aKtc0+gg{?WXalT8Yv+?TrW*dl_;f1BO4&ijX_WWZ)VRY zO*8B2Z*l3}s|=-noW!`P{|;Y$FRDKtlidLHM5+%F^+uxMd;J^|rZD3Vr3R!y;$Q8MsnV-nt+eqy+hCqB5h+=vbGnm>%&9w4BnEq>p z->K-d680u(kPIFy0knkrtwvT=)rlKs+$*4 zk!1RPwCXL^_IShses)eHQYV+EAJ!s!l;{pQgM3Kx2VsvO-shOF;3doVzJ7v)3O~sm zT_bhlc&_SLsVBRv+S$LTXV!H5SWe`*K>($;Q6TnP|BHJ5e>`3(xa|v#1OhUJ_dkW~|1U)P?}$E47(X_J{?n z&H{$om>jAW$tXz at k$Q*3_1dHki%eUK1#-zWPS=G}+td*U+3$yK^B-h^z4v$5d~Q6? z+23@}@ZMM5jC$Y-HMTAX3s`B#EVdu~xsSVC*-w2jvr-RG^B)CpUOAix{STZMp at ex4 zyALmcP#a9dPA8ki6o3N{iyo?J2ui(M0~ozz-JgJCa-^PMMxHwiq}08*&1?^kAA0>& zLZ1x^b&?ONYj128Um_a43}Ig?q540?{3sSVHoHD&0WY!^UqZ)UN}0X)3K6|eyLPwq zYxk`LANW02Lpxpy5q|N?nP!K_IpW<8a4QH8 at k4 zm0%$XkS}4RNbXK!mMVPcE zNQobS;bPp^CKtJUtNFQw!v%B>gbkz!@BKA6T0Zp`$YqC&CX+v%Q&BfslyH4=i=#ll zpFG}fGtCQJP7KF_$76#K2ua{`G9Yxojs at 8qX$1L2$pWyg(pL##w}rQAn2+7Zez^!IE`FR#kPp@@uz+Cg^%Xcnoc9B4FaXx_t`T_p;#WBm9 zclM=Yo77vsxgR%6t=g^B4li%EO!QT3DU>!E>0(ChWw;2E=&*s?m!s~N08XW$FI2>) zebt;>%7POEH+n2gBh<8un_nAaPJV>Z{>zugnrR6VOW;8SnY=g>E(*86O}i|ym#M84 ztE{MvgA=t}{U8NAaqZlLXAzjr9^?((0|#Z&UMCAd%JgA;G7%6|I-4ycJo+!nCIt3G zhu{TU=VcpHYA${oh7(gys1tp-L$}p=Y$NTKqi-~uG>Tg|O~?Z2zO;7jM#ag|d8ZV} z_s5fh at V+A`77E8c{A$e#eLvf3hiB2*XLoBwO)j z6+K3LK{mP4dYVBfg&-QWa>_#oi~k+u1kD^Pj&{2!I53SrZPK_Chq{99XBNHiMGj2jsaRBp? z8=K_Ft$oC)S{tj^5-v5f*SA at Xd0`17B-f&%u9s3)g?k7DkT~|x{81%N?4U^uF^UXt z)2gjPZ4nw3)V!5yLgnLr+C#(-GjS&+A1+tms8A}?A`i1&Ub6hlshUx{Otq8p+k`nx zqA68ewY`>Rk-NP?NnN#4OP$TJEw!~=+hovFcd5b?n_>R$7eB+a1Ah*bT5^q4jpkf4 zi7l$Pj;X=i)rD30`XB9u z9c^80b+cgHKnv$B+LxB0^8K=S@$zISaNH(P|}E4z(_rM0=`IoVI)FB|+XS3hZ|QI(2B zKClQ3Rjsk!x|nO}q_w0!qz`~q0^BNaEG)x*GU13d~^C at ya-4P^pIQ{8=?;=UY6))2|g>Gl*LRq!W zPnrTtc|&mxcqfbUm=gCDcQ#P?oevzOBkHJArM)-Zs7DvM#zHVx>!PUkW|BVsAxCG^ zuB*6avr-Ai*0X>>2$iPidLx^73-Z_wn0c=(jjx16$+hSWx>Dbutn+jxQ}Ki%$|Ia;0Fu5US at giu+Gno`;Q`gR&* z4PSZ76Rwi0W*9j=el~@-Eq8F(E_>4LChk$~dXofU+??B=B z(8;G`&lzF?cT9-X`#56 at k6{mVr2<&x&pTmzOJ~okr+#j)9v1zq-;za>X*bLn9{0L2>x!M+=WVRMXOC-`co~2mSYMY6y9w`r z3P$~+E?V>7b)U_mdH$1Dgitrx%t}S1`boK#V~;c5;ynw^ht)An)c}?nm!BvQHhV*L zs5emdU{?*Ogd;S(5)lLgo*f!!^nU{5{-hF?T=9!p6PD)i&j>xX+GFMQeKt>m>3AW> z?Ll~>*6q68;p7gr-dT7f9lW6M7qRkMX}My-x%ULKBi+pejg=e;FZM>+TK#cF%)QN6 zcD>a>d7JiW-cD|j)Lhn!X#Mq at tC8yB8HMe$2tvO^jQCBQN3Wy|0$ZX%re5 zGy#VF4)Ly(Quan8<1RKk+HI3FB5TIJl9hAA5~{9#J-LP5wCB&FI>Yf8R_({s-|#(k zenfdLT}#la>Q_f4d<^~teFp7rnx178!CgE>V)g8 at PX^@KpIDkdBPP=#t|yx(tT-d< z7BF{yDLyNX7Ku2mibSl-jm{)tvr3!y2W3wh749R&%cOdd2Fba>Q2X2c zcX^#AV{ z*G%!<1qWL1tJsU2)9$!EvHgJukRttnf*Biz! z8uneA4%5Umqbj%*0icJ-l+EcxaNXa{+ZjBtDK2%e`3Y}9`;l8|#XO0z%k{qTV=k|Jf5QPK%JhT#)@W>79LtsG7S7MO4wYQ-wlkgi zn+p9?7xzbkQk69IxWyxPr>>dYO?r7l$#xyj1#tH3r$v@`?uX{Ckhw|5*$4N5$J{&V zxMPdl19^kJsf2q;>wE6gc(c-lEkioWkzxBvjIq6&3xFkt_qpj}CEIGgx4GKUYAwy5 zic0&i$`SucQK6+hf|ehIY6vgkmP3POaw?xHrM z7ZY)IcbjgiAa>)#w4$7Ge>_!4>li(xyfus zOz>C-pR;7f1+|(}VXg&BkLbA1CS|7g_orn*di&9Eg7zOuH+WuN_=bz|O%k#Cie$C~ zxqSku--?Pi7pUj-7f0lwDE1#nQ1Jicz>recxOFZK z*72_T6t!NnI&gL}uTvx1A_HP#nup~DH0A$lthlAq!kX8Ebd=ufC at c7BZ&x+M&IG at n z83`wE2=EYeI84XJBJaO9su?Zx=`Uhu^F8A^VzDTXy at qy)Cr%UrN}+_Zo-abYsQ;nq|8DpA{D<9xK}i%SqgSXT*#9#e20Mqr6 at LxH_$9x@ z3Yb`%=8XR~C-O<}`~McVPtZ4ip(H(dwDUb at FF4)I>hHvX&>7K3Ip|CqAfsU`t*pw? zq#HTq7-kmq*#{Yh8m1b`^>+nogDQu-S#dOLV_f9d+u>`405O2DY-^9WwL8^gp`^$g z^l-&1*0YaWw++9&ZGFXw6r=eOv1 at PAx1Ms*tTnv|YT$9_fnE5t_G@``BiS6F2asuh zcqi>FORL?k)W%)9LJ7c`H894O0UY%?iIcdCjf86DX%O2&0Oy at 2lQ1vGfmCa%wi*M$ zkWe0)(0FAFJZYNi{oKCOHB}Wlr&ZX07q$tQs*NNK=2LBIr~wO3tcf;fR=gNj#YF>! zAcc at VlvJK-We3jSj-Q1~-9Dp;5ENf|;s#{vXf>aFcZ&r_E?gI at n;-vjd2m+yfEMSX z-Fo_U-N<8k_~m2%*+-&g;$a!9<^2EU@@Un}?OEF?$tW`70v;lMAD?w7dV1g$ie&Z@ z)}8ZoWMmcNy2aY&j~#hDRmYEbz at zCCHAQn$?+$W=7ZI*8hWi{-eqlt2Jd&c$l4Ox& zU22C|SK2L at r1VV3%RbwrT3 at UD1$kHAqj^7gkzdq;{ON!#dB_xly{}0(Cn_<|r!flI z5G%VF(RvHZ?f?dLiX7%15jJmrF=vg_ZY$)G- zQ{kS>6iSOlE at u#ZOVO=a$uq`~_J#1Dq6E{s>>C$b~jn(c|B`Vsq z;mIU8+REAuLNsa{-OjD9Yb}zr`PKFZ#H^+XM$*6Td zpQ%{N?DU|d`;9cIwd};{G<;6_pZwHivz&M6xvoZ_v#WO)P(A0tP_q-`<4TpEnbx^Y z2N!ZL_VWRDW6uwbTo-+C_n)#*h at 8JjFnXvka+_r2ckX*2+!dX6>zm!S9iRXHZ3a_> zD!qJ3b-p3DxDEVxX+&GuD~8zLR>qvN(=_Whjw5K+_&!OiXT|eFz%;k3Z8do8D5Kj~ zf4**L+tG82?a1Ra4|x2+PDtoqLUtH1{Qc)$hYp0N$7YoF68iM&t}Q`_5UxZ?OscQ7 z{dGBjzTc)s7pxx`a4qlps3TC{($wi=Y<2ojDf5;CzBROwgmiWG`Fib+Fgf&p`fmvS}A?PC6m&bxp!Lt z1NHmXd;nV&gp_U3Qe##Y&pIT-=dSGqG-PLT64?CJ(+t56Gwp}BTmyA4CvlDvt#uAt z>#J*QbBh~z+nJfOxy95WTT*Pi^R*o0Kb0F+Z?9T;;r1*KJcSNLEG*pSWL`plqr|vT z_Y|r*lA|XYxTv2LNK&zS^!oI-wi`%U2`X_BO2p4QP&3?vJ6C0F5ZL}|$6*t5&DoKm z1rMSU;G@|qG}EU_kW~Ow*66>Lxxvr*LHlDm7p@#;;v8g7s0{IE#Y{yve~|>Fp4xly z+Q8$EPcITkP=XeOH_)O<;Wl&!unLxed?xsFhZZY~g#D_l$W9sx_d-#$HIVUbQERQj zwxYtDiN2pC%F8(%QJ}&px{zXQttxRPuh`*2jYM!+Fiq4;ncz}xphv}zoA^{$*bD2| zz=;V<8YxF9WAC?L6AG$e2ul5ltl;X2%CRs6X(=t)9Y_?V`#1G%jp9g3n}!=NZAJ^4 zOJK61IALO_e4ZIERawa+{5n)T`c{r~9xoxOH6G(w#Le_q4t&T$NX9gJTdL#{*GW)>`mcx zZ14Qt$_p;OUzDt?xBTeN-i?cOKc$N|Vcprwj{%dmNLxB|!dffSN=Ye}n*Z`$_&4i} zkqz-%4U%FJtrMS~qRIE8TVws=E5%WO2ZgaYFXB93lA{+d#G1;*EZDMf(Ku)3Z7%Yw zSV`;Hp&fm at +kN~5d=`fY_;ymHc6+Y)0s~i|>KKQe3zGLWSpm1NUS z6yxkyHlw(1kDS#;rIw3MGL5R_VGyqpJn}D5-RdklyB$0JqmiPcNY18)k!Juq>)Q-* z89 at ehuXD?(pxNG-soj)PLTz2FRB))55&U)(poyiv#>KhlAZg at 6-9IDJwSa{P;LBCN z<%lX$>n;ctt+u3q4k}1ibi)Ses9 at U4h?wie7=E7>Yb-E5PWCs$%r8E`ETyy6SZb)z z#`?Krb!Bsvd}eJu70$Au!;y6xO`TMVQ2FM)Y9`K|kV9g-#PXB<5LMHRgwvKR<1?f4 zveFYg%w&vF(H6Cecr at nt(4HbI!K(7z?7YVYv&+*%(CSzhvc3SX##|VN-BAUU(pIer z^vXMJQl{^##0kG?%7$UyVH&XGPV(wHrtF%Lja$Mj;IKHX2*>I{E!6%@cDWAD8nsd- ziipPn1x1naWUEY|5k>&?RD;w$`%zx^bE8e_{9RtJvD$m*4Cr2#Z^Hw3(Q;x?^+|IA zpTVD^uE4ozz#ntGkm^Nckrz0qIxc5nGLMljT}e4AYg_g`(^4ztSFHD-#tZY${;l(6 z0)6g5kN at U`eOYdwqzqvWjmz=kv|l{_^+mHS*>TG!1p7dms}d|;d!n+d&ek8nKwbNx zk{`zh*Q+=D%5F5AlhK*lyHYvEhvQ at X=xw z)lg6g%Gu(LGgUV3Z9C4l9jR<;51rtrgz$-0{|e*(On3Zll}9Ht_1gp at 2W%u_%vQ_+ zX{|o(>*gf)x^yxO*|1 at 3_eaRcMD@Yz=QiM4eUu?Y45q{lRWRZYJbZRzWd<4UULa~u zRkIjj>(_(@U18aScT1V!vqi$VS8#gzSI)?Fx%1wqH^a-E`#?0?@0d{@`wZ`yTwR_D)TpzAudCMez zdN)KV3ZL3Oi)70lzVj>`dX=3fCs*K^BrMx&ZVEeSsqgCv8|j5v{Re5%SD at C7MA8b+ z{O-aNo1BcFK<^!9+baJcmJdYLE#3JY+h%y3F<9=&h#nD7Zv at p0%Ddg2?Jer{=%hPx z9dho?F1Q_e8Rt$>cKz+UES6dW2{OD0dm>u0UDo&}{*awnZu|FWD_P$Oy3-_?)0S+S zJ!Y{~Knv=qe7bzotMxda?|1k!>UJg?SE1wSPLEpd$z^6Fn(4`IL!8OOg~)lB$q}x| zDgDfMu*nN{#T}gO>B`}~-M#g8KQFej_Yv^E>q{qhB`hLs$P$x1?s%;$6z(whYWuyk zes}B$`~F!Jdp@@efCrP5`Ym_ySIfMrwB8=~mHio%*XLUF#9^sQPv5#`MV)D2 at pvwF zP>ZR;!zWB9OR;eohO5eR~lIRX0AJ+1~k#&8UGb(I6Y2Gnn2wLL%4n#fsX z;Y^CP(ez1c&gpitgr)8Z&9#c$1GQ*MRfp z&N?;81-EFAjtC&`Cj#2S_Z5A*Zt1V{P~E=l0;?0z79jk&+bzPO#=4;zq@Wh8~auHFS^3P?Fks)bEWwI8T z4mn*Mgc=@+hb^b&79&13PwB at APIZmGxGRsEoVpuZWgbUXurB;{z#Dk!R7R3IgQ~L( zIVAOW%h^7$6_q|3Q at C{Yvm9r3Z4<%!oRNM1l_F6xpQDiXTk{7#oI2ZHdWyP^?r at H_ zc8-jn+eXV at Ch${%>7`}mj0HzX9k5p6FREU&%$ws%&WqhDqs1$sAu z`nq?l%d-HA>2^0Xsf-{J z;W3k}s=sI21Hdd#6z<7_!K{AvJQDof8j!jJ at qP(dX$$m0e17cbPn-T^0=hmUSmR#{ z7;B%`BK7!tXj)_?*A_cxm?!Uh_M-3j)uDg4q4p|9e7B?aN=DQbzj&`~W;^h!(E at ZA z0d6VE^DW|1sVQ9yqLY~3!sF~znm7(zTe8+CZ7YpSTY33F9QBMvv1y-7>*{Nl`HXp- zvuO7)n#o(;iUo``8r`g7v9$Y<7BNd_U0Sw|+5{Zk$+a05-D%fcE9{NeN|*N3`T6q` zjHr82*f=Bl*d{&wKBOTpUOS`;b8oR>JANcf>=}#%Oy0 zrOh2LjIi17bu1;niF44s|GWB~3K#&%|ohW6$b#)j6yb~g5gj)u;5j{oj( zP}O#t|Be2Y3Jz*f-h#=fdN*IWnG9U_{E-kTs%V{4poX8T6z$ALmV?aw1 at awS$A2nK z*fnJ?J}Q^@iT#EAXq{OB5E;cb7`tA3$a(NNxio!!I(VS)msBB*XR0xR{E0DyuA{~j zPP?C=oG_}2k*1&!uLR>tA5F}JDLPdhcmXQ~zc=A+aee@*P2~g`My at X zxgY`F7C=wG+7X57=N!7`(k%Rf3r~_YKlXML0d}k>m3F|Co7QA#Q#oT+bD=vcoII9g z#JRGM>}+Po($um}nD(?zquu^qrL44c#~?(WJdL*JByx`cbj3AqYn!&g>W;8HdArEm zHEdarh-H_>neAwSjFJ#%a_A^srPSi&qhq7c8D7yAlP;tf-3j{F$>;v~Fa7>D{; zcypU7TXkvYfW0Zl)xf=S(cbZw4oU^sEMXrzhr~p4-uVBj$cukt_0B#`C_vwKAVvUrM=Gzos>E z)Ou%I(Y;0S(z4cfFWx*meqUNnUvt70O^H at Pv?k at CxWkbgghX1j2XKKc`B(V><`^Th zuw(bz1GTWJ+iMJP-G&a6+o}y9KQO_&s?0C}CAqCd1{>%W_>!bvE-se>L(DQaI|4Vy zGf&*B+lh`k#5d;$gc8n_63T^2NLhF?$pBt7inClS&>jg$RD_6g{{qE%wa!kVaD4&z z_!mMA3JX+%C%!dt&{o18vM5_p1WEqZ->-_e&v%QE?nodXgk|iATYX5#`2?qhP(;5b~l#gXs~Y!qoP~uV>}$f<528!y9E|{zXSJeQ8LeBbve2kLDY) zXk at 9rrlLZW#x=+u!2+$wN0FG5L7(d7W|Ag8rpgt{GzA_gizmuvWtGmHeb2mkEfH4+ z(1|cVen7hPn1RIFfw)l?a)wolBMpO2gANz3A}72SQb2Nkg54MG0|QW+5yB_*#uIl) zG(UizZO!ylp~1VtC>14r?aJ(Ta2WL0gy-Ny{Pew|ivFMW#Xsr2mUx{!fB*v8MF0Zg z{%_LzZ-bztqk)H at lZ=Iv^Z$f4M_tPvM;+^X#|B;8wy>ep}#SREjLn+AJv_GaLh;N&Tw;c zc>KlW4MboJLU3?Ah>bsQuQ at 0VIw00zO$$vqDhB9(if*JJy#GbCn2QwNWxCEB88+Q$ z#r5p-))np^_cs%1lw5a{#~PK!6th3?xA9yfon5#}No>qB9=d{fHkPvfRk}$Q1a*l; zlXo4HPH|Q%Q`zrGI3 at Yn{*v=)4SEecI_^-8sj<*)rb#jh&z;ukdx?2_og_}z7_ at 99 z+Z6}XDAU+jveB98w3 at _Y4Vcobq{aS&oG)13Iv`8B2Bws==<0N5`2&MeW z)XI1+l8sg8t8-Ul!T at FP?7mFC?|sNT1uZ)(X0yW4Es?SG%z}ikZR8c{Bt8*FD>|FV z#xZ6-kf?)N%HE%OQ$?Z5vMm{N%Vhzi(0Qd6u)PCz8;cgvsyK~O!PskvcL7P^(l6Pb zvhe^Ff;68Sw*G3dK8=Coq_6JFqu}E#M_e0wU-ylt39rHOXt zi?yP;g>82Scfyr3%P823Nn$qL-^yca+9gM)*Gh}B(tx`q2S=T~ar5TxB)ucCy+X9O z`D13yU#nwh_aC@>|4w4uk>SN1Fv01q+ at X1^>hJvkbny-`mmDC?K-qOEMqxj!xba6( zx_KqXCv1-wS6#NEK3KDt9pL2wnEg83wxe30?5wk^Y{4U!3SjKgak#jws-5ay>^AMD z*ZS+l7EDH9SQ_f-EHDVyPgyKyMT{@-vxQ)`lGjhqOXf|bv3RG#bM3~dQtq2Lkd#o^ z3nACvzSM{4nZZT9!{=Xey{lx+AhB-wO0>|{cI+9Ms=i&xJZJ3-;s6x+b4U-eQyX!< zToSnk2_av~LUIIMffJhwa%J%n$|H{?OX88wZf`a+Ws)ii!Jg%$)e&1V4{^&UR1dyy zcMyyDrzvFMw7Qu<7WpL7ZBi-OP-yW$Pinav8!#<<5*2RcxcM%Y85{B!+YUQ1gw{oz zmb4jYC1- at nE7)yg0IN(Q^wqpGd9ueH^H3YvCcLJR45EC#C~t(;nMcrUIIe991E8Fh zvbb~emy76uqJ^EjUTETswh(1bHz?b-3)Ft+30yu$4=0Rjwy+9s2+oj4HHN%2jfGyX zX-SW1i4J$^7)lp{co4fFFR1@!>G+I|JQX$6L7eF_8}QUY;WfcT#ZoCl|OURDP%ts$6p4Q~ja12PM5nu_f}HEMPN zzYOeX8Mu+09~{^(7X$A&eeXQ|Pk;T-c>T{;xWRl6{J-wO?H#C2(}~=g0%mCqBjOzM zPO`O|f3!b?9lw;F!}Eyfe0LP~J2LOIDom at jSac~7( zNIPO&KcK=0(s=qT9Rm^0ty?u$MLN5CEzS%uLsVl>I5;q4l#-0PNz-p?cFqyybS7$+ zzEbF#DQbgm70x-IUEspWCg2&gE>pd`^sBAJSjd?Cqdt30Urj{eD=hb!%KXWLjoVk& ze+S_lnbx4%Ewuhk!h9gVM)4iZn=?AB$4K-|or6ml&UZv at rdP7dEWFg(mbfElX|&7c zn2#Pvk`76IpkOoPJ~XJkxhyEw8&<{Ojh}OegW_~4m+0AJV|m*ww5BInT|M3>h*W1- z^UAY)Ty=*2Q@&g*rrfQWwE2(L8Ph(lk2(h-?!O1fXCtrG|5A*#*3RpSer}NYTtnur zB)ZZY0H;?|&8alpO19W+50)b!OClRfW4VKnu!YJxcWKP1ggwXuebhsp at iQuOhZ}6Z zA#qmy>$4=L`WFRwuVtw}jLKS@?dI=1kbQu*+21V8OZ|h8v2W at zYs!Y`>2@O&s3X5n^?B#ruoe;N4A80W`F1T-^ zS#&^?zpwWT$+OrKeDE-W=-q-jet_w zMrrAV&}mYO1qCUaq-2|or4Uv+(&A!8fH4cHGJBJOTPtfmFO8-OBH9sI9Hm;bp&%6S zMoYMSa at fH~z`>n6Z4NBQWe`)fM^Hh=%1jc>4hSKc%K_#hsyx0J^P`0tKfa02?r!^PKV1dKcHG6J{# zCf=>9QNH%oun(23o6*x-AOeB2L1EfQgVOYaoY{|CFtoT=q<#z!&Vj)+clT!0>DR`{ zx>v=pB9m8YeC0bfHNUC2(K}E(Kb>I?QrauIQfHo2xr?L*nYfGwGSGumlj5#KPjVw; z6<(@>%27^pa-|{*AHyk`v+>%c*WlchD;3Q^vkU#7XMQLp?SaDDe5bPZP&Fa9vzWn|cj0q(C#azrK?T^5Otcg_^r)|4NeJzIhki4sdl;i6W_;qY^| z#e-XO@!7_LDlK9#A>4GBCZ#jIyTeCAl#>38$yyX9!&wEN0qn--d$|#*1QU`~?&; zUJL!A_30hStWWLM=fV8UhMGk}t3#w92J!F(3 at PmYXzcQdIIqd2UsPgPG0&H)2xoMX z+t at aMrbSYHmVF+dq-2w5Z)mV6r1C)x7B0hLt`F$AHg0hd)f8<`7IhJwX^l;p)~THO zXMU%pg)7=qA$Q=$=Yngw5rZ;AIrplfvN^IOu>p4F71MnbKjJ>3f<{gvMYu9}Y?9jU z$O4bhE9 at P46%k_Pqdx;w!;D-^T8MC>qHVKDq>%zT>k6-{;B0p6$CG_aDNm ztDR*GhBf73m%mrm8jr~%N2FEl#pQ5y{CFqzxlEd_WpI`~B&AvQ0Ym8t?Ts8JFQ!RL zupDCY3}=gO*paGV#6(o7_|vgCsncz9y1lfg>mACcy|nbT*UHG1cFaaNhf9khH*W6@ zYM_$cV`|wc$+K6ZbeovRxms8;v!j4(l)2Ee9b&%T at Dvc(m5$ryd1|?&UaBeGQIA$I)RlumGJ z$;cMtb6jW5DY9>xKSTZx;RQ#ePz8p_lsM8ccTipnfW3b6gl{^0B#=kTQp1;r2P|7JkTIs9-c4uP(Y0BFhP|+Zq=%A8+$P13W9w6`reY{R zN)c0dNMg94BhX_nt!$#3cRUcf#T8s7PU3^(@Tm*lmOcJ%Qf~a+Rsg848g4~FZ;9^_ zh|u95>}rXyh`xOx9-ojT8z3Oxk_=GB0M(GAe1NVUvtB#Gg`ZAGC3*0Ogui3JCX_LX z$oC3|zdsOl&cn at 5gfkBaLJMeP7Pm!$0W^~LIZL*nguZAyK8*P#ayT4oBpvY`8QE^)^Js!@fW zNKv=Q6L-u{rRwGIx+7eV(FXQa682z%xh at VtFtyo0dendMO54`Dz>u{e$8Mm;2qa!F zK#$@;k6eD;m$`v9j)FO2f#VS>v3V?w>WJD3l;{PQ>owclFR6Gqer)6 at RdQW#Q at L4Y zB~z2N^^@4$hISLpqR!MR3GKAXTBcBQh*qjhq(SFCyWrm=uUg5D-jA&+sRZ=RukKRK z{QOQo(fmyEefoh>?3V2Ku%j;jQIPDBg#4kY?g(}4OQbc$;YEFFDu22pgQ7leS at irg zPFwUeG$vWBFc)dcS2h=*KI3(Es77+uofi%}%X82PeTkqc&27B+Dy$H#*x}zxeK}q` z1;11~IP|xv>X?mDx6g3=RUp`53ZCM_@&|v0pxPdO;5s0+Dr11ShP>MjTva50+QXP> zGC8$SidsAib!s&3CS-kU2V95nXt_STB2RCJzE%)J9ZXz2DXUx`N`Vcmph7_w4Heq0 zLxn|N77SKhHsk^lOxixge#jtt0dKF|Bl)@G$Z!MJQbhRyd~md!6#~ae8pKF`zdA=Y z#_ at tx?OHMW8r^cCv>~z+=O$w1S!|JYCKp6i{ySs|Hm(`nw*oAx*h!JDM!d!upVb0{ zeQt~1CVO=}d%|pusk8VQW{qi|;{8tg&5taRv at 4mOF3L0%58W3enL=SQv!sKZ{E3jP zUIuYgRiX=bHi`WDw^sA1f*Zm_b5eQM$hpzR;vbTNGNx4|{_86=RpeYD7bgjeVj-fk zY>_Y4nT|in6M0!08N9PHFqO#z$W$>>RKokMNC}PQX|*G7tZouXZ{Tf_8{5`Fn}M*_ z^QbuS!@zgMm7~kVP{bEq2CE97b;A%kgQf)7f-!+*GlWv}RXD|E z%EAV at TVg~VcqI#X5BS)E-V#R1{>yFd8dWXj#owskt+F`S%GDA* zga>eBHuJxrbv0?4)oRq-DVe!_pvh8Q7J?;}#dg0?df)RIrpn9zo{imJ&fbQVn+byh z{@|Gv=UiTQ`0jFbt$TlcTcG@p>Hqs7KrF%A6 zuwvP!TDg+wv|V*t6kDv<*E}W;;%psHim~YIyG;HW6L5+-*&|3Y#XRcosJIU at 3@P}t zofW-rvTY3&+SW3JUy=;{9N1sqH$`XExtz|Ct>Lpn8gpqd&1>pjo|1Pq>AA5~=m at 5+$zad#-r{3K9*R*0c-F9m%<%?jPB+H8^#?^O?E=Lp>woU5T2jkMHj{l z#%2(2h2KaiTXj9Jz2t#ME~+d?}!ekCi)ylEIQAnzg67j+a{wwg(Oy&-+(ixUAP;NC*Aj^d z&+OdB5meBojMvP=w%8i(Qt+;cP^5e#MiTSXzrQ6X7=!h#BRTV4xON|;+dJ(7xcs>Efp_aWAMypw)?_$>NDfTHA&$2(+Rt$iU}ui(2Q#K>vq4I;8Z0W zfiR>WXh(D-EM- at AcQIv`uA-MvbR at 1iG79+eua^?6Bopnh1c;`C1F2kiv3t1f0cuL~28tEoA)m#d{QZPjl{N^==a z)Ae~7GZhx<0b%Yk)TI|d>GdPctw^UBntPI(Amv)Ziflqfvf}{$ydyZ9tVNWZIGa}5 zjcUni#yo%_b4IJ=&wOKKXt;xB(!ny)LULk;699aeJW68&*OeHMC^S zrG40#K1Rjc2^rY}E-8stG7Y#*jLCGxZSZWpA2_E)Qy at 0= z`Ix|ZlhBnc6dLlvXDqFMJm}){j)OC?YSV-rlS^Y%_p>?l`rdI7fr0>oD#O!Z4IOgR z)68^&q$t#81XUSvhKOXYx-^$kyT7b-;!e)!A%R6%#R^rxhNt|F+HtYkSn3X3;SSAU zOhm)J!2o702kvSBeAXxi1vmU8cl9tyRu-Cv_^>hJ%^?VydSLoMn3B2RQM@`3m{)6f z-lGDfkiKT5AtK9MQ2MZ{>Afh8yx at UoL0Imh#ikW1St?dy4?A~!ud~>Ua)#Lh+uvpr zbPWpI2(vOY)~1uiA9fbMF!qH>3lpR+^QdkU^he7=?Coc)`lysd#&uMkga}znt{(n- zhqew96i3KTEn`{=WhPj#oCMi9992gTDf+tAlapYLc(9C(HRhH?flkRJK7<>$YP6KV z)Unc at GkKFxad2kI(3eLTJuWRXmYFCoj-%zN?;|~&QP)iZt}qT(Vlr>L7(@wVv)#RV5I1T3!YY zI;7+)w~vKk7yC1 at odsXNMz?-X=-8r=$giR3^y@58>pq~HiUe4&7KZC|!#)d^`KB`E5iKT876yHA7$N8yB$DOfcZcf6cBLN} zsq&BhP~;KhO`dYUc~5=W#m`bK`AP9}jGeCd-E-+4KXC7q- at ipDK1?7uJ43}7ZBM=^ z>^6VR+pRI}^jzk73@~`hx0SsxxyE>WytpOpUgw?}vAW#2xw!F?zM9P%u?lD&uZ`3G z(qlf=Bl52sf6}_wCT#1f&bvALpuf2EO0!DtMKG+JT>jz!wqw4rH%n}>P9v$FL9u-r zo*z|ggzr%O8~qcQDsHQ_Y-xlsFC`z6jFo|~gqq4pPI z-Pm*{_eQ&yi^Zw;((e^i9~;JjG at jX>DbyJ^Ek1%Is=*$c!+!m*2yO#n9;-ffIy2++ z95W3s(iD>j^EzATSs|@`=yUe%t7S>^%rcABHkquM+(v4bDHYQ9YVv$Or8hVusTyxw zmFVidk6b1PmsYBbxYXz|c?20C!-PzV7*T7BBhRbXo>#ZM55-;}<#2N#HMVg=RFDhZ zq{5ntCjPv at 8AiKgY-3{&;(X~5c3u at Nu7D?L+D20=6`+}G#ILb?RDo%P|{qiB`eY6ylV%9MsP zuENIOMk58vbD~Vv3MzUK0>%T&xOv7TE_mpnp~$X>-uc*Bq^#rdghEUb27%Cir5TCwXuv3A ze10v(ui*U1vQ9$paYKYSNRYxIK; zt88ARCeBmPyDAby&;R8TZ at eId2Q_WvrGLZb9eRRZ^BF0ZiJ}VPyiYr at vmDi%`JmMZ zKUmT=w}iDW%F2PiE&9N at DLUD;B|fBkS at 870Ah_vTfD@_BhEo~ zX at CUVNSRoz(S#|Se9Qi5}F#5 zZ{X0>Y#{fCYe}qBAT1CSCNUST2#=I*46e!Ac6AHNU!hs{wCb_C>z_~Sz0GG_EX1?Q z!_#y2E{{cs^$S6Wed5XbLqA=P(3rt@%Cq~{d*l7W_x3znM-Q?V759ZXGU)5hNPK|A zOPw$K*NE8FFc~2(DxPVi&B=Q#Y7IO at _>dSn{Wkwo8>QeN-Cvm4hHrmx+IxjlM==i9#Q`Uc_2Va)>k+m2ntM?qQz_SUzekAkp6pG~4*L3e$HrAwxxXIyx4F!T#)Weil57dMs2Y#d$n298^R*LqP2#Kimz^h8^kNU-%g&= zL at M+NtEzZ3vN9zqMR5pO4j!RY3?&SKB2+vn!rIa~zl|dcoAiV=XpS{`3|GcKT zWt>Q=9&886b!u$uWK7DH7_HQdC7)s8S%zuZOaXO9@|W~)j{4|0l}rhX>@c+j`#!5l zc4=k;Y0#(&3`+AYhALmt8JJgKW!PR(Xhzwgolfn}-!&#OGq{LY2CVzFZt)NxV?wM1L*SRZu$#yIx zU^^+!peE#;+zx)=%<+MbjPZJ z*d61- at yxP2y%%bwxPv2>lKpcpKN*Ad7X%?Dusy%Aj`nr3H<~HRu(-+gMFwzSeuMO_FpEu+jUg7oHa>vPE=`7QL|_oE0I)VucDN2EWYLG-!?NP^a#>E zcGGbM97~HAhtKiAoR`DzVt^MN4C!113 at fV#{JhM-(AKfWiXk9aD&|#w`kf2&w*KVM zwr_}8MomN{RwrN=P~(R$xVd))wIpkgt6Ty85T_~AR*lZtEY7i>KF4$5GcHS>6M>P< z+KY?MxWtxBi^QH9i!VdgCCMu1%1xmA43E$apH$cjPjzHX1Y7Xc$(T^xBww?4(p-Ta zjZo_X(mv? zlkIj%Jzj;YpKU50>RWOAUF?RuL38I6o`w$n+FQPe-2shVl@)&bK>Y znVK2gWk$GD8FP~A_22l?6>6pze;wGVzbW}L{PWo72LI+E(NuoiE(&_0?LbAF8 at n2E zZrVUk3yvedK)i;TCgjq;r^1T}JvAUe0yZlQ3C5{0r{3>rMw*D5C}%6O?PQ<_rXV*v z?e2YA7sGY#z=y*>_?#MVrbp8g1v%0~bi+0G+xhadWw+hrt>fZ5Lj+{K2bf=MVNK22 zWOHr;+uq-1RB$C+*qQ?0xQlVh^$-a?V5$()Y6vkTy!0 zWLJLriGC`f+hZlfZjJ9X*5%ME^>1ABcLtvGfdjaU^SmDr)C3vSB5DAsAaLg?fe?bA zOS0AMA)yj#3JBwzbbQIDFNt?1AwzHR7TqCbWQv4Sd7Lpb!~~*> z at T0nez|rU)S~Cy;nH at oIC{@(D zC(s7wR=Lq;ualMb_MUohb2~5p8QB%l;E+R4o1sO=nf{i=!U0X|7RL3^Z73t06h_~F zd7ly{k^Yz&a|p={e_%e+1!2BBYlqHQ2j#1*Go;u9va`ht<;&_I?uOxC`=&;TGi@{o z5D+uu|Mlpp;NoZ^W#DS?e{@b&X}e7^#Ba4?k%$6q at rHYQ+~Z?%Pd3Nw5epjCmJ;q3 zTuu1=q2ENPbaZw{aFh%Alq5YbD|&NQ2v@^l;+b5`4Js-pd;;J08s5Hm+N`6&Ia4S!oiN9dZ_2AW{5P}T zFb9{C{>(w_T at A+ky0%Q-i}*Z$tXCT$nAfMRZ9mN|x3>>qZ!!kejyyB{5v(%dX zN8V9FeOJ7t49GSeJ4;e;pvtsnVsidWIFGvx-UlC{Br4%mjh0-25>;x6at_onXXEv^ zC2Z!K`)MiYpwJzdzJX5U8jDCP at n&}ra3eL0p30W5F7=?Ql zcF9T=Qs5@>==f#rpE#^NO_y~arpeci)sW1dggQamEI4NEBuI_IE5CiGFE+BAsg7tr zTaLN!!E`;^_AJz at M&#@`Lg4`v47m{07R>N7D$unrE{BVm<_k&V~C{~(p31J-JVT{0(5#Bv_D54VxG?2Z-f z))^n}73i%}t$9K;{gnykn z1XM2;>lA5xKVsPyhvc|k82K*M39|SxX>jYNF~F01SO9~UVaJv9p+HzlgUxi9dwTF29C1`W5O}NB%|HPO?FCj+vWhF#^~B=5cGS&)TLai(c%_g+ z^Lh%?!fg#JH`%PdIlUxy2|og#->_5WfLXm-3bOC|z98W*kV)9_nplRFSKylfI9}s) z at 8VzIDvzdE^!$}8k(1K$6InP~!&inrP9Ksj?Sd{zDQ3xkUE3|!TjtU#*=89PH7l1t z>YMvuE`k>tygZ<|b(83Zg^33k`A}8X=;#pbs|izJF)+oNI`BgOtXnOlMntLz#VV&IR)(_6_<}?8cEB?f1fBQm2HTZqUtIaSfCfTu^mgNvnt6{|03rCuc6y at WhYQ zf2IpXE)kIqCPNDT5;JM+Xeu5V^g&ve=lRf%Dm7oXek?H{8dM=D at 4fL7FsFOim_&ij zYx_~oz at O3_vpVJH3|dHNxDy)WYFw%I!0RJQH8DPd;<-M9g-vVYp-!&-qYA+suhLSU zjB&5v8EHHXcbE18^epE#+jzP<&c029&Of9IgVk-PKRiIaLR(!Vq#4R&DgoCp^fxqw z+Ll=x`*K)G+%?PZ>XW}aMAlm46 at F9D!uMTYfkke^?G zxv4CUaqyb!M8F4429^~o=x*tuYO5r-BZ1Ec?*yw_y$yQoYO$vp^DtKS7%LkE$6fOfe3 znpx-!R6ucQZHfWYBWC{TlgO~h?dNaEL=DD8ok4fFD|x~IX39zjgA#uIC?lqLAX~hl zY;i{T`4r+vz9j*Pv>nt$cGOrIk}!Uo`E?TI;26^RGt>D*!w}EVEI)cXVgpF+Pw4AQ z9b;~wN4Oij0oiWJDAA5rg@=6iP_f$V`_hkS$`3hzo|wj|ecAyg(Y2z?yj|wXW1mUl zd5HyUOFEG$IX#`}H`u=-&I^kbDg*`uH1>}v#{W-<|2x8JT29KUsNb$m2xSVIv?Ux; zRBW;^!2LLM38bxwnd~i4bS3({lI#Ggaju-CBzVZe!`plY=!rAf!&`sO=naQCh_kab z2)*pPw6nbW+8z`M3uTd!scat&FCQx(FP)ij0>7W`Uweqo4A$=3F$Nf7-R>Y1-Qk8y z0rz&xQRLlJB1}xt9Zc6kTQFcKhVIg^Nrn>c^&pZ6a)uKj78r6&m$7#+nj>Qw=L6ZP ziVsLd_4%2VCg~K>-l>gode_V5;+reIjsy}eZ6UPEJ!p*Bpir-vm%nOTx-ITVscQ-rI^l@$>_ zqULQUtoIyn0o(fYJJ=neH4~7N7!%Re6qUL(- z^^#ko0^tW!r*LPpPuIgWlf#O9hB9K1Zwf6_&Uz8zw6U;&0y(`6ECMSYivjRpvKR~N z^?x^9d;^v;6y_wVGfO=a3T)YFS(jmond~6_XECzWF_wSpE;|JTn^=0<#>-fvGP_51 zBYPnwVnf$DOVUu7tcD)izlAru9&<=j2}ji(bQoK_{eBX0mscPZWjwpS$|{GO4h<^q zG*d<>0*ypRzlXI+BHLbo=B;F~6pdlVUT_&yqKi2X-dBjJu2c>AtAfR1m at cW?Jkj<- z9-Wx6Pm)QSF^cT>J6?4z)RkJH$k+wzv{NP$PGF-&e#x5c&)p;M>>v6mO3oM!j2TMK zs5Ufbqq;vOsNEn^oS3e*$Oil5HH1OcnC*d1V^rxuCj;GqywI at UWeggj^JVJSZ>y%; znq+t^kGLt(*8ZYlow#OSv&SiOGfv at fkE|?dEm-y8vtx zJS~D#!S(0fMMI_H2!}yzhT{r;Pan2sjz~~m>ODCZgMbSS#jN?5ZRMKpFShq9$#>gH z$|y|NSIgGp)?0hxjL4x;a-pOGWADTQk0yNXkDud4vp{ae=EaR?n`$y=@lllVId|i9 zq9+2~)Y;$q@%*B)k7USK4KO_O#Af;MHMa{AU*d`IiJ<1C^nrsvK$qeb3z9|3&@VlgxixHgN*xMOAY`20Z zeKB0MjB>uz*G#Q*ChI9u_s>4hJeM2Qi4B|awTybQss$KoK34v;NpGLb;MwoAgNbh| zm7R{L+pneKH?6_mx#R|9>9Xi%3xf1$V<%`D^}HoK at xRin1O=n7^wdn+x6LQ%_<8AQ zn$ueq=0{ydT`^|hH4<38)NPH(`E{*<^K94- z&NDf;#BS?+RoP6lbpn3>09>Gf`isvRAtb;3jDYqV}yq8fe9tYsbBQ zAsx7jq9=aT@OJc*g2d`@$qggyL0t0NC%GR0 z>%RXL4TKh1KK;V_5O(D{)Z7+>GcO^HG at Hr3$-dz+8%gT>erpEP$8Nzio~leA1OtNt zOH+Y8Y;;FeL3I!v7EMMqRtcOIXCfYH4A)SwR}~B)($rb8W1v+>$BJE<3hUly)iJ6W z#tBt**suz=`Gx44y;ls4D~do5s;jYsYVeV>VA5+j=ZJ+hSCs)KK$I zR`|gARJ-h|aXcpLvplw)I<{$xA;|G-xSE>{+qG}OiW_a3W%oD5C0sB%rhAYF3-~=N z0cerWn%VEjiyn*Y-L=vg#mV-RaCsUkDU}y4d^#o0wd(*)d=Qc#hsf3`FXPbjW?6$Y z4lU!Mjjh at Y*F`I)>~(1`tEb-eTj&pUk at LC1iXH4wO zX`7~Ej^v(07#B1G9?U{YwaTz*kSb?J*(35g!(c8dSmCX_93B%3!=|K)CJ+;TpV1>O z{s|@Kpr{w*!+(ywn8SEJ=7?l`^qcULGZySsBlt7CASj+C3(`&)9k?LZ|B!XnRi87U z_@<11 at gdyLP3jRWS?2jwTx7?WLc5=;AV&py3bbZE7fec5F%dF`WxZx=g*-Wtm4f03 zg&|>z{AeBbiybKkhGJkANivuNfBf>P&kyEuJ4R=Ol*yk at ESaw#_!(9585ZS|OD-wL zh{2nT%utdza*;EL5zQHzDsw!LOM$}F!q|J5Wo&^~7=F5C|u1^M)$bo3J*9jTIl~(@S~cWbL`s{3P@%Y z*1JbE4L>Z9fzb6hil7>_0msDO3!$KA3HcG|>Kszz2Ah4&ZaVGr`EgP2bHAXl1Hv4s z!91WGnu`jd%#qQhe`p*FF2SVLjv$IOV?*^|7}g)$H_5P=y;F+q4=F1cuvANb?hdVD zy8KJcu0jAjmGH=DT^Ii0fQ+FK&j0JRlH%)(xQ`ng{O3?wAzET+?OlYF; zKixj%5)(UBegWBwLP at dBq>cgr%}8Vd9rkl!U5axsomYQ%<^Oj3*8jS>en)ED#x~?a zf~izmZpxTdRi9lRLyV!&4=dG&WIsEq&csiiKT|km`LhL8W{5T!Z;&?hK(!20(T~9< z5=r%)sGWS7CmpKJ(&Va6f%ix0(({yL-*lgF^;2cGq1y~rB}-20qx3h(rjAOg4|&%b zqUvNg1<8ov0 at wmHnYYOLEQw7PYf#^2obGkk8!@mpe0(RgT%CIj(J-bO1FvO|M!k_8 z0L5i$D8}4eLnZ?5dW==`cBzaGPlODE+4b7Wu~Bd{@>5;9>y+*Y&_W;=V1v5$QYayT zfX at D&W8;U$w`!{`++v($6a`OkxDjC_? zOOKx3dcf(;-HCcjj;49MLHAZ3TD^9L+MT_U_m=1%{nPC;V=6uTWlOpC=8wyAX?Nic zw!44am0T at Dkk?yw2*q2mUmB}^=YyBTS#XHNTbbYF(R)q8Y8pmeui<&LmtV2ax8CG2 z$kuc^K`t8wMl&|{Jdmj2?mA&NlOH#*#lst=)=t*3x|#H5DvRgzhR8~vQG&el0{=@Y zFx0u=XHW3o+&+(8!zbVL8y6^>kvmiB;ljWG)1(TG<2LCIr&t=FWd6J2*m!lv9oMBp zE&ys2=}{Q5<^A51(N3y0vx`ckP%K9UxgjmXq`I=aqvHct9=5(3F`aqsQxLr>yZFz3Z-e0+2^B zyyB+ciPwTHIi*>!Iph*bbNI3)!T^qI!M6lsp5Io{P!n0^ioP*nfR05o5%jPlX>Mvb zYNhS{-#Q8IDjS>1FN8{fF31wkYa!XE9ntpM4wT1IbzczGH at d=!n|j$dK37V=cr~S7 z?`bKoX{jz}ng1>KA^lVCdol_J=;^fUG+`J--iuf0y>$HgdIa`&1H)!+W|0kMm-;Rd zR9YgfxBwY<3J!5_AycvnuNL--1PaC!F|>8YqjO^)daOHo+Ql~9PgaklL)uWz0L z8)7d15&F!*;oNuL({g1I9w^ zbsfFLDZJFw0{w+H{?PVe&HW at Cyu6v*{t73fxNu-bx&}+v!+`|94UebDv$UgySsr+$ za4N>)JOgSr?xLfr`!Sn!ex>q`- at 2OQ1*!#DljgrH1${BdS_{H6Wau2?e~j>zdInlB zM5GW!E(7qAEO1i5OAv at d?)$=yA5}dnpK!Wd5iM+r`doU6y;>oq55MIT(l3!mi}Oyg z<;ODJ9%_5yqA^DJN9JQ=Bl8TdXO8cDwO0j at ssc@`k~HfR21Htx6v8lY7y{S!se_(!rd7vSF5U;Q)PH5*LI~X zoEDcjj(n82aAziA3%C8mye=vVen$z+C$-NTYQPiPHphZsAMp155TCbd4jYSF;kij_pjf92q zU6EDB5fm=3u*i>x$@@>CPs-R>`JY0c!|Nn?O at n5y5v$1ym|f_L@`=U;i97k6XYxOV zJ{3bazG=315O$?SOeoe$!BKA at g5(d}=--a`pFFvA3+ljM&-~$Q|M85_U=WmXSXdyS zUzq<5qwjx4h5u#rd3bB9qJ8V0OlMNrw6;o;GyUF>BZmSALAL at Di$lPZnpw$gkPCb= zy2%&iOb at 1{H}@7QMFmA`R5VN~%te1Cqf1ee1(s7PDGceXqoVeM&F{|kRqu8 at FlUr1 zrwU#7-0V2bzRmcaR{Y at MK-2@-c`za9y&R}vo$Rw?*}fEDyN%iZg<$C2 at 6WOIUJSF_ z&qvrD(UB|n>yqb|uk`cU>*wZri-ky=@NPpWY99^q@@Yp13!eYN$9>)lrzN=E7sN$t z4CBRgIy4}daF7WVH|C at tEYi&mbKvN`5GKQ)96o%_#gTsvzxv?+1QJNTqS$^-2*tt! zxeH!Sm%t>68DEiDSlF|R7 at iVwT9P22F2)g9QP{G)jtoBhf-*8EL}o9XzUwC!-HZ;mn0eSxY%)|WN5XB*U2X(V*34$R(QSJ*vV6f&*JJ(=8e=87+252h zw`UnXM7-h%7pt#Y2HwN9V`iDYgB_7^H5k-mY8W(+b1dg;m2JoqBO=m!CA*CsPRcfA z0XGV9 at qT#sU9K^Dtk0{)ksJ;yRy_vKqEYrJO~1T{#h3^}1?*X06ltHs16mrob?c9{ zWBbg8Q`n2&T`cw35qyhm>c~0KV<9<+T{?imdR^ZLbi*Bl7nx>yTbHIZaF=c(VhDNy z{d`-U^*<;(=ip46t=(rb$;7tpJh5%tw(W^06Wh)c+qP}nwlOiz`|h((ec#^aRDJvW z(^dUfSM}ZN?rYVrueETaMDmn`$n4y92zN#59!NPD_A6nu(!1mG zGPR*1_sY0`EP*_Q?7dGk?#YrQucr1%>Xv(^vm{m#L~F(g){`}n#7E9xMAd3+FjYwC zEL4r}AsEN!TUs`sW3VUGdZ-Ofx&O6GovcU%Jfb%82`4)jhk8mE60loP zc?F0pRQ|v%@CK0tT68Op at kp`|6tj9plR%OsiLu0nf|K(?M=e{~O<^&8ebS}s31$}J zCY1IfNZwnK0)AxXyayoAX$>8t|3^UOdL*8h?n3CFWmgR-CJm{CtS(7IN#;zz%PQnX zXMdbUc3P}RhUZ2i7qP12!-OOUw}mu*6Y*@@C`#NG(rJw31Cz#gb3*HrQw=(fiWb|u z_#G;j*%B=DV}L5#ZO}XpwwW0Psj9tq%BuN2&B>^OjqNp?QrtkV0SbKa!Q;q`h_AY- z>1M1Y@#tkCXeS%@j?I8-sb6!1t|7xEtE;*j8L3y)ja&Nm5I;SPsv9962`*d0=-A8s zF*E$nQp4Y{Fs2$Tk~IR5-gvjWA}bw~#IHw1Qi~pa$=ID<*sSK{al^Q{(NaP2b>%O& zsOT-XDEwJsodgsnCqqB at m&P5w(V6J#aoea4G^>%8__Y=o!J}9XsZg}uMiNZ#72CZ} z#2nu^^JfjyoBWYx_dOi0zQq~JD#JrlBj`ZtpU$vuX z_x))Gm%8{-fd4bHyXCfx!0T51F`p{>aUZVZbZGninfsHd?yGcnI zYj&ciTFC^IAwgZ8^pdd5Uo-M(vN8 zfXzMz5-V=8_+(BAoRU--v3I(d&log$TglAvwG1A>B_0m;dIlB^&DJ>g z*+eguXu{rH8tGW6l6Gn(Lp|;dONOMkq~UCuXWFf%1ia`f2Lp8H(M~LDeA)g>FRiLh zr!UuwRP_-vFh&v8n6I0KRz*MJ*@y3JemmkNlVmWCo8UkW&wL4wLl~jgr<+)_Z?=%l zx;8PNU)1jh?f%7}Q$-E^@=A)clvweGPLd;Y$n=haFzT)ISap}3=1$q& z2YYWNLEzQM(@9L<`XMEO at jj-ook9G)=Gjo;jOGr_OfKof0amMm5VLtEKa8598oX(x z-1yl+mjd`0%r8Y9wsE;BiI1|4qQu`zqglt$>#P**ZugMAM~?1H=UO<_gV(HvQn=C2MLk!) zO_Wj1onvrE01KP at OJlAU8v`ixf69n=dRbLxeXznk=PNqcXtEzn zGZraO!P1!w&NVReq8FxBO=zCYrc}VIDT;AoLvTuG{($*J#JllLaBEw6TZW-($64Fd6u at W1Z#0Zh0yAc_{|=yG$Vk-hj;V zj`VN}QAEuOhG5AJC(04+l@ z8FQC($XugffM2EVhCF^9lDSE7l9yUc(?be_4 zv!%=5ia2$Xv-p5Ph`j$)$X0n4PC>)MWH;0xW*?rMjM$`nXk zQMuT0v?}xFS7-dgr$*h_#AhXwE`ocNdmF=CwY0W$hSsQ6xBX?hYBJA!Dz-Ss?4?Hq z^8nKx8}o;hX}hgX+rf05CfmW1e^l};(6A2qrtS2#UsA?1eLpK at jQoHkD`w7DX(y?< zj>mW?l@%kUT4 at D)6VY^=R4Ce7Bej$T^w|9sqp>$(35}v0>gCh1IuVzlW+ at Z;I86sh z3yQ=8@~&=4N4p0Uk2>sR*NsDw9Zw|DL`gor-hng#oHwv|w~}Acw4 at 8_Nn1R*OBX63 zbd8Hp1qk8F5Wk^#htuNcg$jQIj46o(E#}6`lB_c+m)MMQo2c;a?i^An;mZxEipQ)p z3V+M{GOo6?+30{H&k%{jRmupwch{JerB2Q?0!HQ|VHv?!Oe3gjjKzmtB1=|UgKu9I zwI_5pQqmVOv4sWxfT{bg=87w9sq*smv)&-`&8R6~mhgv%M|qZUqAmtT at 7b_HtSVRT zMy2O-m?JOfcobVQax`*yuOSv$qDwUxlFz~iHe_l{vVj-?XJ!A4!8L(4x zTV5dFugLx^r!Z$O^Z}jxm+-YgnMN97ambid^x>x~V88c4(iP|fts;gIyW*802dL5w6 z9eBEiv=k0;as{DSghw{asMF(-=0>|oMEy*hc7jNAgXOIzYJ*l)#Lu!c(h4gI<v6 at XGV7J3>wTGp9xXplMzOP)H7U{S z-8H&42Yi~m*`YbbZ=H&ULlEwu9d|AvzZ9C=;o{!nS+RfOLFlql|B28=4p07cK0WZ! zp!eC;df$zM8iO;B^$X?8?&?UoOszD%U!$Ddm>|NN^-L}K-+OVY4uiLx6xV z{!b}|pq+`6y`{-N8y@~MwNO!1Mo~xoWE(XTZexKQvO>YGC?N`^L7&$Gi~7dG`U4Cq z{L&@a1S(?G&irTp48_|{cF8u9AOCwhL4|#gUg}2BAGd;j+Tv5!;P_*2OWe9 z(E9jmkIowr5yWUM5rS_*<%FWno at yDrZ#!e>sB_AM at t%juC1DVOP66=%^@M}iDzuZ;s|xv$7_fF{7S4VLOW zYnomS?fN|Le3K3o*027iqHY+gLAd-!_bE5(OS6RbdhrJxt~Sfn+4G|&u+o9#^x(xC zHV#I~-=-`Y-Vv2j<;YIrNwk$+#TJ`3srXp6k+$h2on2ShE`5N^>~OB&b-VCq)_JB* z%b|J_RWmOf^4+K;Yd2}@6}Nm#3m5Hyr%dA}nc2v4w2C(4j6a<*gDDqH%FIVHy=OhW zhY at +);Puo;v5Jl`Sm4d7i30~TjJU%&{@m1KEi}6>f1RofGoO)TlamTB!xB at i-U%11 z*qP>#pT4&9B_7n&sp_?UUg8)t%}*E#H6=!n($rVRn%=$|gPJO;2MpAP55EX0mO9nK zaoX~id5|t!wadKQHBzZ~5q)=itA1U~2!gjR3VC?2jljL{_WM+vR^X<!Np7Ced11}GJ+8d(+$ob&fY(EB2-?Mn~`qI`Zw at fRsSc-_Mru|EmE zK^iV0_(Y}PEZal{_6;|b8nDXJNWuLm{4`T3@`*nuY>SWo6^!f=CDEcE_e=c3kYiDB zdagf|RtDl$W&37)GZF#b8TpBg4 at n#oQzhPBJ*qn|oBye!}w+DG at hcv<;d0rfuUbVi6 at gm3cWzr7!|kK{(T z_znVc`U3<+=zse22wNCB{RjAR+-_YAm6t>*Pei$DU&HcU>D~dQ(`vQqk|ilm!!%Q^ z at eCx%I%g(48OstjoP~011j1#R?iCWzWL>oGmRQbjKti$q+*gc`bQCY$0U%&HS1499-3m~T(w&?yZ{1Wwl^UK`-i(k4(^wHTj zjf6I~>at!IEgQA`^^vcZqE~OAud72Ba^IXgS;6>r(~40vY%~O^xXlI1|K^t!<%I$Y zfAh=ifAGszE$247{*HdpVpaa-3O{R1lxiiR{uB*Whmc&3P-r-mXQ_VimVzB?I5h8k z!yndrx3%3BhG557!CunlnCHcrk9mfiY*hHtg>Q`yV_(*$8eHu^Kc#g~einG4p?R|S zT89b~&i*EpER_25=fG28Tq6_~nMlPa!Iu=eC4D%e at fic=9l>b~Z z-J?h70((lO>4NeiaaWrS$^Uy4q&qN{fYAlt=?HPxc!Zd60fj--`4TMHlGKO4F)a(@ zgIhU|KF6d^nI4JrImQ7zCCE*Qib35ns)<(NE;U}nLT3d3Fd9BLvA~p*NdD`$2^$gp z(aF!y6DJNN-#`iCj<5WQtPUSQ&H7t$q@)qZ8 at S>l%~b7ntV#DiwU?i@$?=M?zGRq2 zeCQr_6^RVEu2{HPodNtpm?k!s{w-)73k(up0Pb!<9FyfI=}ZTDBL1{V4AS`QHTc3u z7hH=AC{JOiF}g=KaWrQ-RJcbs8SyQgJ|e>l#Q}j>NI}X>775*#Xz~N>?V58poXA(=GhJ#xei84B^0E>R}uK1cc*1i{rn?|BGHG zscS3XEdPUEiW=FD>)6zQ4Pgev1_s$0Q7|H+3`Qpz$;il at wb*G6U at yhFg}I4Fdf9J~ zcW%?$t+nlk91S8|$wZ|UC0Ocn&kwt;H8A^}JlxF{>zTdAKYYcY6A84yF$0|+fnVNV zPx?RqjQ{j~MfW3V!4pKSM;eGjn74|CNC+wSW+3PVt$^%nDcTjyfT^+s11CsbU@;sn)U1%4G1ve>L9 zvr8$2jjw)Mf?F-6F{52zH`_Sp=>S=!r?Kk6*DSGr-htU5^68&{?D~fxXK;8udcujRw z_-(p5&O+LV2in)0?vD&39UtRSmIH9tPmRdY4&V2N_9jXJ;O7s zA5>i7v3 at f~<}bO}%AuqFM!6d_kuoOMnvT zDB1vBqU|(wI;YpD6CfVH-gcOor_9*tP9PJSX$hQ3zWc&7bB~y}79a0}W2|2m?`^hl zAEeC{_h1(@n8jOb*!-p}dih2ZeA1P6{+82QuOGwZuY6$c))c?XzxwPMyQ^v!hpQ{h zo{Hmjt6XasEOe{>xyiqCeIPCDm-sNiJHzTu_e-~pfICd zt-3h=f$m{H=UA9DM{T!7R42{0yW|>UmMQd`P8Ep6){3Lvv6Wad at 2PSp98Cd*!i0`- zI8NO)%bQ{CLs;7=&m+U9<=k-LX%?3{+HAU|Szs1du^-Ik6Cf*!(doL6cp^ZdqNNNs zd(JdwN_rgNv=xGno0noiUkUzdL6F!gxh6Sl6=?^Z-ao2B_-E-mC4aJ!B{qq7&O0{T zm_38Qv=_BMhs-v1ER9-;L`y!O&TkWybnSQq!uZlRNYeeMTypL!l9uQWhzBQiUl`RF zyuPvZmC|?o$uWY0WRpW*RcUEe=?E5?5wr~S9NjaNt|KBY!%~Sm3dp%`uAj|i^aB)Q z1Y})$ad)?9JpTK9Lg{9FD8DD!zf_!+RqT}v-`FX_VD7CV$kY+Ff*yI0AQ{3|CT6Iy zuWav5^+(UT7oQs{t!#1dNybx$_c>1U^&f>7QeMIPnjQRVmHEZpMc2yeI?F9kn{!L; z1vZ5~uUW%i%feq7B9TfhQ01S)lO+}Xj#NZvb6>;7_NqyctKBs!Xvzm32xbz02e`_bsK4Qb`(G at ygHTPaNVF+1GW6ud>U{(J%R8hqGGci&B?J zS7ubEFUdbYf1q|#S<$^%K|Ck#qQgc+H*5%pjL)kj?`Kv$#Nt2d at PsZtb)!MM#Nq)k zztcK3^at803A~u4zeEo071)~7ehOQZuee^ziqKa&?=kWTFM8YO8xPQdi6+LIvghSN z0rCoi72C!rqs+aBV&C%7?#z(k?Ya81gFg(f)f5MJ zIU at qgEs8st_uV!RMc0TQ{0&4Y5665!5Loyp at MN$+LINiwbeHH%1=l;tw=;5wN0X*x z5C0E<LvuJ{_xzD)dd?C__o9 zfM@{3Ev!E=`TGe{z+&P;$?xhylj>;!h54?XpP;V=H&`3DG{$$bEc!;n!RYuoraWk! z9sWzKA at H;5%Brg7OO#E;>5ml#_Ccfs($T-uKi>7v{ar)}-^lSE$$KGa^hA zh2Fr>Ca5mZj8%iccFLiY&iTnV`?{^^XG%k(#x5~e_nOS1T!E7>Hin1Jo(DP{9c1d;K4x9?CFpJdw=VLW%rc#H>xbgz~49= z!pHF48Qgr%#o+JLqgd!R9>!&AnWbufYN-`F^6G3scxtbmj)17qPvtoo`o at kQf7q|b z<4*vyns0~evdc&>cH4qs>Mj&aVah?;uZ$1;&4}T;7w at V&91YzZ^$OPCsQj(aDl-Z zDS^pxC+tDCr08tT)vG+dDc+lP7WV4I#2rF3JhNR?XtU!m6a6vyxY8uS zB=oakz{qjDhS*WDoi0K;63V~LnVv|(lwbO4j=RfYLuTkm8!cr3MceXXGVFQB(a1|% z6vCX~Dc(rj=q3_{EGS16>EHoSK&EA?SiOtNoQx}%YC9B*6s|!+r92m(R~<5RTEprJ zhqdeQ-;w0ze at BwY82vv$@w6jt|A{0up_nWRB;_{>Y6{Zi!ryJc;IT7>-hxSHYtmvX z(q$IXxrl8YUCtu8Sq;Vs{-%;)D7`air!kVS%qAbov8;cZSQ8dZ2W|UPz at qab#3o}~ zY7{kxaHQ-lQj;=cReWwQ%~p=oXEJhE(z^f!R*CJyg-;_h?%~U3rfZ44!gK48nk%`^2AH|2yrzta2c#Q?=zuZ{A4+U+%-f+Kfg<#x5 zXnxEF at xR=dcMO22m=^Sf57Wd4h_O&tP^WXW+|=p#4u(`3P@~m4Va`gl5N8Hc<$~|O zxk-&xA)p8Ax-W*-!^>?LHHWT;CqMpT2lCR zm#oNH`t)*xzU8)yM^M$6@{d1`4|X(sbkz*8jWMn3-0e%v zE=`P~>HNL*)@M1kDhLrS;bB%~m>6a>+ZE_MlV()%p}1 at XS&l47Sg5APJu45X0m4fX zWi!VRb%`E-WY&7ry;!pkmGr`E{q!r)?oBR|jOd*?4H2~07t23fwqj+Gap;7>H7pk1h;>fOcY5 at -4}#W}U8XhQ1N z=IW-7yA&qr=mYJSFGnW%P4!#Nmu(%m9u?mM{WN3s0lW_R81pya2S{e$Xl??j>um+` zX@{XRJ~TT37k}dCZcLbA&HNS|qnQFKrVhiq2BaF+b-F~;b*7Sf7g>!bqX#|X^qL^* zt-~LJ2d9Y5Pct3P-rP>swv6pL$w|6UgIZw8T5x@XeXv+xF)gm<7=b^vxq`H=Dpw=qu7<`+2m3g;=@}UxU=RT zOg!X=6kDqjI_sA2tzL|_A;P$O+sz~)_Yqhv=U5Co@){VAOm^3Xn41yApDURWACP;3 zMcd!bYO*N_41s(-Gwv#9>LVS;^anHFv)0vw|B7vW9ByvgG{JmNCVFF~#lyO|1*u^@W1Dv&=c+sm17{9pp|8 z0__VI+9|*o!0D>F0Ta#%t|4r}$?krH_y?NH9ijtaOZTDcYcrGk|@5xrbvxdMzU zDi?;A`rmlcA2fVwbjr0YZ(No2l{gE!Dym|7Zu5w7NlVoShT#R4d+`l%FZ#JM4wrQ8 z4j8hr86BT?C2g;@U751c;48$NM9Fd@(mGwwt)BX8zQy>?-V!-uw3XmH+p!*Zzg2+o zRQpi7My|3eqvT*-mE9&4O1tJvEoBKk_FzR=>`iz=qZY7e(Nv;J6imBL`e+(n`)>7b zJSpzllybDYf~I~6OnlNZ7TbDTi7}#n^A2?`G&SZAjJQj%$eWnl_RZMd-{gFX+ZdoGx at ltEMkvTnl&?sjpK`deD%LMP at Dvvv@- z2(#3t+&`bvR9 at q3d$Ks-t0#f-{1E~nZ=*T{f{izL+GR2XluN7MicwEo zow1runX5ucY(FA-_E#&@BCg7=v`szomwK61mqsJM?Cd$hK1*+|>A;BVbDfYItG!MD z-eZ(GmE?myx;J)G^GtDwq6cCz0VLm4pm+%8L2UiJ;kk~Ic7gJ~=h_*=5rN1KXyH>v zBk at FT;A8?ssT+aL+J}l8zw}5zr2luyd3 at qwaR>6_!nJ(MAev_dEOmFRszG%XLiOG9 z7CBz)<5lRC+VXIu0>{YXn3?S!&cc;tcPElAJDMh7qEG^XN%qgEyl}e8i=(%vKuVuz zcrMTwHx?4+`&&3PKB}p0;OWu4ZHH?WnVR6a*+Gh_2ianw7muYw0$#9Pm!(qW%%r+p z*-87$k|7ky)3watM2n~-) zn&B&|6y}=fbs{Ss$;&gDROGPw-Ek(Qe^yS;*#nsE} z$2`2B;s%`XP-?iNj at nHAPFXmc4obf(8dZU+PA?odW6}l_-~{nr7Ku66K&clHjPAqs zW#GidJ?Ow<&bKRCe1Kg}(_x{ZS=?du4`PsRw_cRd7%4Sa!60)OF2||q1dKN&m!#!( zb6Pw!y}D(skN37vcOPX-aak{i{baQc7sLW)Pw)cAm}M}q6YD%CYs&ohWmuLQoPh z56gIR>jh&VG%0&)M}ts=L)tp$Je>y(>@h;#B!G`8LhnpIY6R1hN$IaF0&1L6cg$rL z+U at 4qZ$42MP>iEAFVjEG69RZq18b*HY=H zC)e~1$ns#Q)h`K4*^+Pgqb<0%bGM>;Y38>utZm~TgOjRe6t0}S!Gn(i>vqugYniZ at 04U^p)4fk4V%vpaAzUxenrs<*bSy at jR$!#lMDXgnaZk^A8Y^d)WV=^WuLG)qlE~)YhF*R58D7 z6U-7=4w2XA%E3xf$qTBMeM`!J@;_* z2XHBS=ip(Tm+!ZyU~PNPQGCD*Tmv^Ph0 at Vkm^quTAK&cEr(?dn+aV1g>^yFMY(4B* z0v&YnQ0TcF<|3L27w6y+PLBt{=4?hNx*eSX^NNt zIB|-L3Uy_`u+pMgX`x~#sozBg6*S~IZfku+Gg>mv>=x=ck&b1Av%mZm(zSGy>yuGE zc1LKa_py(4YgQb z{BsI5b+I%xjjoL)p-DuxCYDsV7`kIJ(L;{qxE!JsQy~H4B)^+fWwDI18TS(1AKMB! zu2lI7F1l?tsLlmbwpNlEOPCe->W0CV(W(?}r2SI0?4 at Xb8anh1(VDtC+&xoM{hCNb z7gg?@WXQzPs0T{QtcpyiRaQZ{%2D%Gj6yFGWWy$Gyi+H>L z(DpeQVne!quEFCL={WBf)w$bcs)F?MgQHOaOXxi7r>&~pZ9@=`HR<=_+vt%c$Qq_2 zfF~x}^C95t2?1qGX3^|y(VxGM=j2F8hJhsm2Na=)oB286DJ=8^nv68SL!gofWYv&3 zE5V->2*6tugT`Z1uI-YhQ<(!42pCcGZJsp*mQk9S&{UzebHk`OWmOq&2KF+`bqvp? z!;R79?i at IhInu(1#38_Kv=+m`tDHFzBIFNh=!#ic^H&a)va=HBi}O93Qd2b5IRb`P zc~AC-p(bTeojJd0kH7WaH8xwn#JTbpYA|9zci^m-HwvAGuc%c*sPEcCs$Jr>?I)1T z4uAxi-HcxEB{2(7FDFiD*q-jPhc;IE^1 at a+6c?oSC^S|T$5=u5$Z0OK7&AA`Y)H0a zx6}lSow0IxB+C)AC_Cq}vBac%0m&rtBM9uoF{1b)z7Yjly4B(xI^FwUD~W~ z&$>Z0;`!9G_HBmzV%i~F$e`j8K>mX%_+4x^8gpap*lWzyn+AI`m?zC44u^cB%WwS9YsBYqi(WKPhoqh<zdW3%WI2GCZo66L=@{A+37ZhRNrBypZXlwlz6w%(O z#y;Pp#)!Mr)dpPMC+YUM1}=#4wKP}LOvk#sBI^P|>0JXCfkqaYKflSVQoruTMPnZA z8ty at 9zb9w*Q%)O(&ajAluV at 6#-Vl5G&Vq0J0u)d9_1!eGaC%!t7{_#RTL at -slSiu? zA<<(7>=F1CHk1u at OaJiWD~ah52LgG=BYZD5vzQXzIp(YcMz2_>j%U`qbFNwKNPAr; z$iAC at Z#~rK&rIgo>_>#i7hS)aJ&h3!Ooqgf5^hF-Cs2}L zkWu at SV{-ptd*JC|FXxS;rujwxU+Q5l)JdMD*)Q||hgJlKB1QX4 zD`F`IO(^|CEABEA87mC|f|Dn7K0gn1Jkxh2rri4?qEF9g#yd*1EsGoS+S~rpidI8S zaO}3Hhjof(siSC_ at n&4nmRQ&T>FCPJmW~15E~~^w2)DG1rrK0zn|hvy#605=&(;+T?TO?kF!?*MxO8k{PXfQ zv(u*1L*A5iGvYPM_rJ7ap2y}PXj3>~)pHcF?R$$#5b0l9(TGDOM2(zFert=Vm^$cA zMDU54P83=!P>Akzgt%3LNP9$#88&iWyxs&$8ecdk*3`nOwN)lVA#9zqpRLn0*!k_R z6?xdg_4aZ^L|}QaDhu@%p(Zg|&FU;vnH`?6WY?3F>KH|3Rl`(y>@0sBj0&-dk|uU2 zJ4Ot_Vgy~4g>e#Zs62$?ESD2UQDM3KD#GrS66H5j0S@>@u2WwT<{Lq3G6HW0skvq* zXVkQjgR?waXRy!!!$q*3#Iv4-(I5Qg!M7jg=iT68o_PA>w2J+Is_4>5CE$b?h|?l1 z0*fS)wQP(MvkKW}(1Z>4LM4z-PB27^QmU|saQh7B{@O6q$-QE4uyp|gh~B4$e29r= z)Hc?->*3k54-U|-hDIDE8yH#c*g)Z&pp*{zk#q?@qM7HYk$> zpSyI%3Jw&>eMc;#CnsexOO(Upy_8+N9i8BuXdSeFq=xm48MbIF`yY6{q93=<0Sy)W zNh|Hy+d(gTulN at Hy`c27{^}WnDCp`_89T13RzKMJLq(VkLBj)?!iR{qu z5$&8{NFcOp1!O4j6Vdt<>fVs_y~rC7Ji;pzneTvuYmvlm`bY2j^XrSG*bB-dgI at wq z-u|u5kbVI8i|1d{0F?iaIz#^m+yCQ&xAs;UMEjC|-171GE-j(PV7O|~GkH{-ldRF3 zYGUkSEDo`1pz8%r}u|BT^1f<>=AaCzXe%GrQAbQa| z_@!4d7 at +5kg5Yrr;F-t}-*|3<*}fI(&F^@jv+o)PN4TGT;^H at R*1Y?sE}p+$t9KEt5KKpylQ(IG ziAU-_h5JsLw2{U21(FVGmHU{M7mcdwX7g>7q%3J)ys9;FOC-yFw#5q(5v<7NJe at Y_AZtrzt9rGN_7(vLPG?-erq!XNH^9p<1oF7z`}X?bV*eBNvqbKIn13h3Rz<} zK4IU3loXAMa~#@cOooA%EUDrIn})lnV3%6YBW1Qctjt!uiD3|%)DhHR6(z#;U@}qD zP!O8eyggyMrWieG(F!g6rwC|xY6&ol?RO>q)oz%YY;~F#1nWwMEC7HO;bM_4 zv`yy|zF6`}hU^|>*EsHL at W)d4QU}u47S6VqCV;Ufw85;5aA5%8=TGT zw>vgIlXU(m)JuO$v-Peeh>mW*rFH|qr5Zb62j1Q51v?&rekYnUJ`uZYhZSR;k4rtM zBORml7NBXEjq?fU2jxwgi?^btbay1#KKKc}He0mg^RCy6|1Q`|`N%}OZj;`dm at aA6 zYsic;u?mk+G_ueB18pNv4V>M1kah^OEwIfR1<2ETSg z37Axpi4n+N6Vm7b?(KQ)l;z;$|)rsbXR*Zh0@$Oy~g6zfsqwt_ehC zp3>Fq>5_~zSeua#g`28A=cuai_s`^9T~t(t(v=1aG at 3G`RJ-Nls$r8V_^veUzm6Wa zC_U=VVK#oJAYfEKQB6u{k?aXY>lVo&+EE};s~nW9OEV*qmQwO%+OX*p{iLX zgLd0yps&Zk0-%q)&O9QsTZgS6GO-uBn15!)3NzNW(=?D^qkNHx7DwB4(eY+O{+lU+}CJQW~22vELnSe~49+jD#U!P7y!zGhnha185#)e(GU z|NeCA!DffT_HKkR*wicD$wJ*9aMCZfzQ$}aF8PttUoXBBA1&xK(Szb9GUAZ2&_>Ji z##7cm{%js`kdjQ`i!Il^z_x2JJoV+wIf=eo?U%7ONjZ$JVg$mv63%5K{QbwNBbVQ~ zW3eAv5#W4;=qDm(n81%3s1FAR#DYm5eaYHW6h)6%n~!aU81EkoNd9H>X6;aC`2LB+ zC6 at ke89C9u-%7M?O1``7 at GPibV2buL-`Lrv`XEn*)5rmTGp#V3WU{>RP48`I)K(wD&c);E+DFM-Oua&Tf}? zbGcIoq(%tQ)0`)Dz0Af0Lk#}T95TkLGs(p4- at j`1#w=+$)dBnv@{QG3l%U at 6^RC#^ zG*!exYS}+N0DDRlipra`WOjEh97|)WOwD&ZO+n=c^BQWr0X6m(5^r0c+!rpvW6$<8s(Qa72AfiDc}2#5>9U;c`x=B5g%-+jsRlR0a% zJZ45aPK?wIP?T#Dl1O^d2`9ZddeCUkjWJM(m^2F3A5qLf6Z_qXVay+cBj6eFz`j4^3=^5k&_p0&RqDmnnHvQ;)GWun%7w=xf3OGAliyoN*fDd_igw{vZtl*^@ zWZXcmM~bh4;2Ud)ajoA_x7Q0~tF^^F#+{qA$*nWUkznXz#~AT@~Q>vd_07mq01QL%&B# zmb(z`$dGHpC^*8RbXXjv2^2ivwCId}{`L;)?$@A1;BKLRryu~0RHB&mclB$nD;qUS zS{aWT!1Y9?*A?&aRvO;dpXoOr5a$+ at fJkt(h?X+K+ at 19BZ{8GtyBlarpV7&{v62jy z^D$A4H3w*ET5 at yx5Es?05t7wuXkd+1 at 1g8DWS3VqcHsKUI4WiPS$T#{XI$3VHp5LD z*3B{uOV=EDf5B&i-iMIKs(AyL)D$a518#Ii-t6VYpYQ=`;-cpKMZ2Ps~Wk;%nL}d8F zUFL{%CD+cXVppl-^vmc&Mg}I#VvBKa5wj9Gx0S<5I3^>2ow{uMsV##JmzB9p?xf77^1IPy at Q;g?W|{R1Ad#a1o#E8z2Er452%>ND at Wp#yVC at bwBJE%x-jT=w z{ei2(&meV>kgnh|b2{9CyR`9L*=^F(ieJ%*Coq(07YE!TdSCJ_{{Oosn}=3 at CUoMv zm?SaFl=+kMo0o#rTploXx=V;DBi7vMVO`jT5eR8d5)XOJleBvM^$Dm!_!*6vFaYuh zs`!X3Y=a~D$UIfA?+|x^`?jdAM4U{T*AglXsVt~0F)M>U at tccLnq;3QOFY?(sLwo> z1jy1NlTHtjehpSQ%)I)2;I9>e+UD!O9mD??M|GSayjC7ylx7xWJZ=^t?K*=2CFc|P zw0sVHfM3%dIOHFV-y+oWf_Z$k&{u{2;T6rHC at E-vd>h5D*IN^lgA?*u5%hKoEW81cE-(%ahZQHhO+qP}nwl(j)>7JVInyP+NNu}~XwX?sStgH+X z7r{zT60X$6G)Xp58EknTwus-pu1IUTe$92g^=FqeEIKh>TjqYwoi{CRGQ)YB>3%GI za{SiN`em_B+5PzbI{rBJIBH+d{(c{_0cQ18lN+c-6kxrBU#Fy_OV!XDl0+z{$qU)B zM4`FS2+0Qx51H&>CZZLR_d^UCvlyRLhu$k7SGSEA1&%+Hdd026F}&L$4` zaYxAp-8-POAp<`vi0{hbqdGk8wRwyy=gslzsZBx}#KF!ecVfEaDI;j|Xq{b^UQ3&|yWs%4DT6EYZ?pl#soY1mQGKZ+R?I zBYS?j!mGHcI43uoQNLk7#B?o at 4h1mhm}Hbd0@=2QKH%fdZjD?=+0>yxSKmOjrs`B- zj4ZLN!IDX_;p*O0&XR{G72<$PG}Iw8^gjZ4$6(DKKgj4L$jv3{Fo^4qF|yJ7sOYIN zh3aS?z>G#I6w(MNX|~c*oJ(q at QDvhMSj?$P>}qpb9_ut!Qw$5BNN&D5Y1CG6x}N~L zL1G+MsteU}aYPyS8 at vEbXa}9c9E8CFDKt}as%$3c9jB$9#7-zv)Oje_PMK2fqU$sv zxCEnjC^kZK%=y$`eQ}NFa2#IPb{LNvbJ4~&*K>_(3XVdX^yrW0SRFSTOUXehQr=d7 zt{_!n%yRIb)$*L7Nne2stbASKG8RppFwtKpr#Raf_SrIwS4z_Nbmk991k!r?-W*U5 z_bp5cw-l6;v72y!Awj*!!qauwO2~1=!w%xym+WY^LK}T_AGH5+T%4I1KVhnMbfo{_ z=+v6PQY3Aa2&(joBS9IWOQu<+#^kWvc9KHGZKd8^*0xZGyt at b8E?5O_IMs0=yE?$+ zsmFk!$TE5mhv8u_*eAzbn42_0j}5w~fXN-9!qge=M84WRP6?T+KG;6Y$5&WcW9p%8EsycG1* z%<{e>PE6*)=3X6%wApD(_UY#E>gUGwu7+bdXdg`om})!R)h%L3xQs6WLkcPyfJrJ+ zYveD;4xRk6^!G_4${udKS+xet9 at _h<;i|OzZ^8_Jab`&(^!3PjNghjr1lWS at PUwRm zg-e!M62?UBe9;$Z;M3MV1Yu<8 at h2PMKke7Vb+!GClr%OKUI`S=J;93*U-L>jZVA*D zw*WoDsd|GezF-lKU(Hm0{8Wx(7bGS+b(*r`#Zzrp!G zR8w!2u7lGGyGWibbCPOx`zg3DEXU?1xDnReA7`D}gr7-SntdHp>ga1`+$@mtX at YV| z002P|bg{Pt7PoO2zMfxV{yISc_{Z zKRbhY4p0X!F6CVPe>Jo7e=72Qq70-kJ=kVGLRiP-{8pMw&(sVB3&U68rQHxvSqyb# zeq-t$;II{b!V4#Q>Ho5>yTO(71o0?Y>HI7xqn}eojqYMVUtjBm;SUf72@*yX7KH0v zz4z+RwY}(f{Ud`#tc!@_R9-V_u3hGLu65I_(s*fK2?`C((Y_FoXk1WoYqI1#JI-{9 zOU+-qSZp}@1m}vz$e_=`NRaPN(dX2=1yr$&BJGO0L4Drz_^%yfl9q%EUz~Ju{Sj2c z&NDa{l5)zI9=e1#t_WjvTM$j^_cW>tP@*41oNrok^KWBXhWsYkKFvLTJYRx?SGtuu zFkoX47mw7A(_<3quq8lmLt-y(soZXzR|VXxp at lUu%e{Y9xCp7}`pMNTcU3t5T+@}j zp|~o()_=$kMf5_RJ|Jj{&~b_|JVWqKx*}dM08k_her(D`7-gVpSQyn8aDxV7e5dp- zjyfQ8rz$&?`OHE1u>d|PFYOL+tKihvO3*Lobq?~6b+`wyEo5?G at 0r*kE?d?_6}15$ z_)+mP70(HRA6z5D&2PXKsda18NYKYTNKUwVL;%mQOZ^i6%SYw~-1 z`8v;<9YbSP(2Y3PFYRPkUU6XnVxZb_+(*jE6E~HD{+krTBm2rauUwfBsALFlO5Q-k zPAI}aJYtu!LSf$$!6q)P)X#N!XkGH-9a1pD@<_dNc{rVT8r2$EA2Z~O*ewT`4l&ef zN8i|}PD;_NxI}+y_cyB+lNh8Y9Y6X<9|QF#tXqf<6alL=r~3+v`?i!kBf`{3cEl33 z%ls{pvwGg5qtI=J?u|TplcD^XdFRy9JBqokF<;3GDSQO8`yI2w0{R_OxmQ1D^z--w zkotqo`3{X!vj`95Ntq|;?7thY1;?JmG(!Ub zKZrX|oYdURJWWdAPmuxI9});T1t5OJeDMl9CPysV?5SubHsGyp)5Zgl2;j7`(Xr=(*tgiKH^3clfvwdx~!CeVJ~@?~kX>7=OO9 z_(pKFL*QQ^rilok$Gk`b8q*;57ZD!3mDGGlgB%IGR8krdykKJ?)=vfBG?8?}@(_H< z26rd#;26Caq~dfL?~lPV?vhE~D0 at r}E(fl$5V&J(Cti>cyr6!~4#Z(npG~@ItX48^ zCZ0JsWCfep66+gz%&Afv9Z7%01*LO&j)}MHt61#U#5K-wUA+b-G;%VR;m>d}w;1yH zFPH0 at MyHRssSdAO7ZO`!wxMB;J3DQ-+ggA7V!XjVU2(Cw=W1;a{X_Ih6YaaIF`wKX zePBdlGaFc_FC7_Qa>noFxwy=tOWGCZPZf at Qs4mA`eHZUwxj0}{pGmgwUl>+#BsZ_M zVmi}b!mF5W+-BstR%NCgGFgIPHQNW>UqrfE)BggAg5-sej1RgzpmHr6h98K0fpRR_ z;I~y}XG%HRn$J9tmS12;rz>?l+Tib0x|yT$6(%J(G36W^fm5O5?XS~wXslmZz!(!1 zF)g@=tiXo)k${rrn;MT=>0cTtyeR!nJGzSFB?QwA?4w|^N=j_c6p76a#(%9NRPgJ% zcROM~*^?37J)C~Du?W`yr#5jr$A1Qh;>9zR#etg)U_HV*`VJhglH_diT(4`pXDv0m z7ikJ^_l!rKMs0Sd7s|}!lXWm+tTu9wqBL(xx(#NKnf3mt1Sq{c9?|k3Nw>SuHjY?! zEl=+V817~{kJ7<&EmUu at Omt_h#iI{63USPrWcmsyuy*9MoTUtdVsIL at h0I%m;>Y=Cu9V_22A)9n=1WoeJ4M<@WFoE0U?tgDN+29IvP6Dceg(Pc-Zj(U$L z<|NwW@*$i9&8UeGru$=c0;`{j-KzBOxA(kT9-_?^FS;mTx2vxcCs13NsmW)=DHYx% zWk0+t#~@Rz at OcC&5zk||4eSR{=jNnMKBXj7aYeE-OkOi!iuSdphG=DUapVH{tXD>$ zahKXm)&!lEC3gkW-Z`7m@;g(|6VP#WuTGql4QC+wFK8WL-XASd at LZp6{2->g1b1*M zCuv{vD2%&wtn(zEGp|?a5TkWk&l09Hto3&1+B77HbERr_+iY{5OebNkOyajQFEhy2 z>3|ag-59Z&-#QKP=~FaV{}CPB7>4>QYyS~?bwA#;q+*VufxJ7yLfV5g>}oHKyqmaB zdKGIR7t%XG`jYS?UOV62&LEk&o{3poLNS3Bk`#U`dJpt9Hxyg&#^8fEEPKzS&SQLV zD*yH8cS=fLxpv-hdt|FESq7?dLQX-_k&!o7LbRk;l4+tXjLM zjiw0B{l-uCsN#Sm)40rawoh+02X|yJWjNO at 6_)S(Zw^-~T|rvKyK=DyFj7uw at f3o? z7h1JP<%5rN`Davp9S`rm^y#L!aF-C1d at Q3z%Q1)Z#Y9m-{R2 zTnMJq9;Qm(X}K-d`}e!>ZmlqlXo}K})rkz3DJnHEqNzS_nHVPr=<*4t)js+(k{(sf zA@&HX(|fAs_oQ)iDe6{N&zT8E2gF~S7rjp3$6$XeWv=MQ158<&l z>H$HIL1 at ou=#-%o4BZl1Xglm76t{T9x&Tun0YI)JHWbXd#DWR(i;sXZK=g=;l6=Vd z&KtqHg9b${+RjTJEn2>1yU(sLlsH{WRNvHS0|usPOUa0E>l>V9lm_j*jBpHYUb!iw;iX|sH$ zxL*OJJ`p89$pdR*Kgql!jLOFk=&6M~ClX?t2{fUm8JycG*RfM zRLvx22a&urG{UJa7#~f>YopK68xF1(zQT+1+eduO-D3~OCi5o|ia=@vd%4Lz9 zklEp=Rmx7Fo(fv?AZsTzDozR{q47uMdmZu4npO)#_N5iJ_N2Mjr61E(C&m-DbogN5 zEy^eDb8$MFKJV79u&@}-$H$Cd7L$UEV3xPoS*ofeF)bBkI8_gtoBBQ}cBA{HT%kls zPEZRy#FMjaF+)}EzgoGP7;@e+3Xc!|1cOQ8-?aIz#8ELqc|-_TY5db(c|t?a8zNf8 z+M2|@K!;;VDYJNtJzkr17SBo!6*e3*y#-xf7iv;80*a#-#`aeH?sF|@6>xM1#bXu3 z)uJ&}($(BG6H68eRNcrSg>B2T39E_KM&mCXo~P7unYT~QJty at 8{MtYGtfmR-CXWk3 z+E;VX2E<}hTtYk$O$1A3gKK%w$PK{`kj}Kpeg&c%4^&GGcOXlQ=#p2DO)LN{DBr^{Sj0$ zzM#>9G>!R#ru7!CmXSLypsKj^57xyUEcT$P_0?lJ7L>BBIsF&zQqm6_i#id0DZ)aN z`sFTE)AYg08_XHan|ItZna!zaU2Z6e7k(0d3iQN%lLfk^)5Q(f)dvM$FrOVbV^%-> zkrYjUqC)MO#a1E?4r#oUz*AQ5N3NGxd=H_Lh=+eWhEC_5*t}oSGiLOr&xcCY;pSEu zJ4sw<8$^?f)*zN at s#!JElFbrF=e$6}eUwvu+Es$ig)Ml&6+OWxn?%)&XXK_E%T`U) zjB$q_Ic(==P&_1w2JLHFwMNT41206U-H3LImaGOcm7$j!?;|cacND}(^L?pKy9`_v z%3JR-5>>6ZD1u7}`F9!AHP5JRc*Jrz4lS1!y1YUP8Lv_M1lyndB zS9Frj2zZMg_OS;(zp5bizkPNg_I)7m9r)}iZqT|Je++KEe*F&a|K{g;#pS}m91=_R zrZq&#SP>nDeM~p%YhM5Uw-4t3Q1%KN00961f&l;s|4)^VfUT{SvA)g!te;cfR6tTk z)+XB)C$k1a2qyw0Bsa4$1OV$I77-94L%b)DSSFU0wi>Me5OC&9!lUP7sC}e=92hK9 zmf&DPp7j~=8av~)jw}jWQ4&|!KE1ls at XVF${k`4h^>be`jH at p*fLKK#M&43l2+}-I zR+1mEMq!gviBlfGmO&mg&_ZQE0ilAdfS%v*IJ7tJ?wFugVbi&5S+sw?rrBAUt}wK| zthwQ!4OD5g9<0vrXti|0pnPsIMB$8CWQhJFO*2Ys)wy+myUWlKj55jqvwbt;#bOxG zpT1tUlv~A$uA)H}N83=C$&seh+TAvG4yg9XPx|?yZ9Wcrw9VX(X zh5eayWe-R5)q~bJVPPPz$=gU?wPV?eg^5Mt6mvW0oPiz at z0_>cO~jyV*$BL|t5H~B z>cC~Yj%x>XFuAZUmNgg4y4FpLNFh{b>UkA at Eyy^>#jxBOv{+3vOXWI8`Qv6J1xSV` zHZz#+L!nZg)T?>_X{*IPHqvC2ue6hrkU1)1FnP`ntrGHvVe4In7Biu(cK=Ta@>f-U z2pFbG9jQ)ZkH#SV3?uaOtDnA;97q$n^*Br~Mr4Et&FF z;kz6fmO#NYf7L>BhT4-|hxn(3d(2HX!Cbt6nY+{y7&Mu%}eu(3nf7PjYhgjiT zd2Qbgz7xPXUBX$&1JC$~$T(m4eV;D^0pG!r`q(;85FCD_pPX(V at N~1RO`6a|t77T7 z_fD at Q$p?@GE89J4eCjT^Dm_gblH|T)xKon_U?Ly6c+g1jmXD7woP at eY0@B0Lt=KW* zLo+vzXBcfT(*7>Ic#x}a at _H`b4@!@$D;$Di5CCfkx#R&fmS}|Z9%AN at al)h3gsB2) z5^_OX6cxB4|DxEU6zUit7sDj}C6mtI7!!hrSwdN#1-oGOUvxViD2Z58N3gKtb9W$T zS3RH-UJhJ=A$t at Mynk6Vh5gH-$vGFE{)g>IS42kKHosd$>nD`>9OWQ-RgVsCRk>KN z4)_3=1f*NLkHz;3f~W^If{QZ2o*wIW8W-s> zGG8>IB7q1hDuyyQm!+R^a7cK0BC+1}{8%de!LaW2G-XCi856&B^t#RdwC=Udo-h6N z`6UAAymx`NH)F6Gv`Uh3^h!UCoPj7cWCtP&A(vp3>d|DN-b3g~;+Q^(L=psvWW+tT zm~q%hh;n4G8e$`QQvu#R8NC&{Qv;5DJVf$xXACK|%fWKbpxaHp=fT)by$1 at 3)1a-C zg!VtD at TkLSzM`+g7L;R(gtphDx~yO*PqyA>ls&m2Isk&U6s1mdlQvagq0|81!4q_o zV{aXBXQl2adz1+fbu+FAYC$Y{knZeXVjU$7=wxtYkgTIaBz)sL|h^Y6+>R7u=8{!r3~Bf|K1H%}rp)If&`7J+90V$f~-U zJH_I^f?ZREp&`yBZeghCF~k at _m}?Y+Kj}hpE7HS~UMZ4ya3-<>W#H6emF!>xZZ!HJ zGY{cCqm(V7j&z0z43 at cuOK7cs9Uoz_RsgERh}jbK3T&yaK|;8VK>pi zG1|ZEdAZ|Y`iQbkZebiU4RZuU8{W3Uq2lcwcW=aJ8`PsYpfN4jxCAnDb1-R>)1jpp zbKU^}eQI4=g_^YqRuJ>vW`SD0V3(h_-r`!TxehTO_rbA4U&OR=NxbRThkMnYpsd(k5EXRySaqe8G+%716RC~yf=@a0D|8=@3wAfzMD~em at Hc-5xFmpUNFlSJ@s(Pgj&Ga#uv|L|fjT zY1`Oc at o#G>3ie=J0Fqm@{-X86bbqgmHrI8Mdvs{2Y55K_i0vLCk8#JgCCB3RuC5Aw zc&JfV`5xqsf*pJ)@)b~UcelHYEy2=h>_wCMpW(cGilxOfSDohOD>wDRb%mwwC~NX5 z%U~w3ZPu3$njz1q*&5-U4ll+gveFDV0FqnWZqnVK_5f*;5=b-;m+JzB*tw%D2O5=I z*GEs`zgUe~^%45?Ppp}S(;bD%W6_!|ck*vTrJiYBh>z{nsIv%@^kQQ$!b*pM8`18P z4dYG;Y z+AF!Omr4z(4OqPcvK;VBAv>RUR}QZysuo;ukbMtBgHVuvW3eXxdK%{Xwku4n6l?$Q zbXw-(D1PH;eKL07uxr6(idL(g{R`sphjCNAYMepsin7}ZTh6n? zjO^n#~*&P^z1RM68y99aalpVKVxJ*L}?Yuk21LTVCFTlMbi$>$s6T#wC=*z8w%%I?fkTl;J6Q%`HLpDLGPeGXKX#6URF1i z*OnxB>mvNocz?; zAp!tU{k!z=pBEt7PD-jMKQ=en?TPx}#QKN{QiMwYiQ)o&O at 9;NIfE1m2=oF06I2|T z+OxIN+L26e

8svki7_8DSqZU z)gcvREC-KtoXKjO-P!#|`_%IJ$;F!mT#H%_FcZ*$9t|WP4Fuf67=n-jn?o5Ad~*ZH zox2~$#~mRu_?-vfB?;og88Wp~xbkB4n>}}<4wK-f4N){;rwN%&HKgguJB;LCI+$Y2 z8s at -}1(uJc1GzWmrfBIcIHUkk?qp0)GGDv5T1ksJ1+B^|#9y-AG-;tTK5{UT8C6AD zf=MH*5+Y4!DIu*6iocjFDvhezH)??V;z_aQ=!RS}o2>g&O~<59sm7qUexk?AV`Bn` zc}Q`i1Y_jpxHhJ7(Arwgk*FfmAL1`Wx*b1dlt9rKIO#NUlQyAYK3N}=*$xY5RHMnS zw=gE%LE3aCCfWOE*PbZ(RMuF?KPRs5Z4wP9zBHoW_pmElBM%fW0q@` z(&$%s9j_6I_24*E36W&jb5zU|B(@CcjeWJwBT`IqeW$ThK=?pNK*mBq66S0c zJsG$6a-nd{H6EV?MMRmAj9DASdTFT*v6rRzGLLXZm(eZi9+!k5EzQn>Nu26XWdX>^ zk#)UfbiO^2eH5}AZ&Om72Bg%S81a-=jr(GWG<5=!!y0u6jlo$K+8Q-*fMB{8tNu-W z(CVbE(w#`Y2LE8U`)2)uNw4?TggUg;Rtr-MftO)IYw8*3NY~#{9yrbf6Va_J*nBuH zfiu*>&-toDOM1YSsP)DBY51IBM*{9xsH4{r zp4yb5YWSB!zZf)uH`E at QD=$$% zUAiGA580E_n2|<7nP&8Ohk2WLI@(fDZ<~@R+Xyj3OB`d;O+4eQm#nSp5i>p|t)3%C zE6LNoTMS8sKNpTa2|3NAn|jgx$@sx1i<$1N7;{;zMU|Gt!bLO&@G`2>cDGH#R;o*c zsa}M)Lyf&5-be=Xgp0v^3 at s#j_~OmNM|gJKHYJ-rUK8NhFC>Gu#;eHl*>cL2v5z+>w-qKNd|93|Mbe25ot+)B{pnH$#N{( z{8mMzoaOM&(}up^uME+#-j_le7o69DR2|mB&Rl`r4c7>G2S+kiot~v;Ua$2r96{no zpw1kJ27M(b|^zxMx)7XqONeZ zehlzxJea4-SWHZH`l_5(FU?8s!K>`k_j1SL4?J79$!c5|_b7vlfq5nA25#Denc`vA zC(BfDSDK2o at FTg{lgSdOYU6g;Jh`2@$cenk;abWWIyR~unRSfKKLk`b$STWm`ajIskhMXmnM&{RW6w9b1i8cr!HYr{UheN|-r3M~cM2jdwG#7B2n6W7;Q>FRfO{+vm6gk9 z!Xpdk=>DDWEGF*=Gj at x&=^5HZ!?;R?LVk}Rx1dzBp_E%v$}1Z$JVSPAbRfno&Uppm z#*+86sfePdGL%fM&7WaoTOnFJxel at 1;B97GDPA^r)bzek at m<4v(eB&eq`BH%C|*6c z&@{}R**i19yyQ7Qt=?_crgdwG=LM*JTxIdN2kmYX8SoisytE>t zUS~xPM6ME;FrN1o z at Mwo~Z>J39Vqk&QnCM3-Ca@{M)N9KA(+B at uKPJV(dz4=O at +V&(1OnclJ(vLdX-ey; zN371x3YE$T at Uv1y#|I}_RO3|TB2iVoxwcyQx+~y9Fhg^Ezhw=j%77%2M}5?`Rh!=p zcgf at Z=PP;YD;oD3XYw8n^@J}S;kHidS9oPd|NXnO%u02V8?El}jXs3rsx1oX*Hoxo z(5Nv=BQ|cA5rT{G5Y();KtxUDgi57+sBFjq&vq*|){SkafJEMw%h0yqg?qd+W`j!2 zo8txZ0vWn#<~mGk5!5(Yh&Hc>r>eO at 4n66ztT!MeutDi(i8iYI(S}kppK7yC;9MYj zL0X!}Ovy#Bdtl+HOE4U5!W||z7VEeR32!*f3Xq1LUS`dCDK$=fZtO3_slw zr4~(071*m{SqjaGx71j3mThO{Pw#()wR$_(%q}nhfT at 4Sja$Io$=H$jpX2{ax~ht` zit-b~ynxRz!ia{YInd7vN-&Pfx at 2#a2WU0wKu at Z72qiv<4~j0DL6CvKded#cS at i08 zSyHXY$4uvAw_3qac|KvG`w7+YvGWtv;+cy<4Cs(ihkBaDVVc|B>;3*>_Vbg==L@|D zj4O;F$QuDmEo5eVS2s3 at h(|4|f8c_Q&{bT}=g0sF#R^B|^}-5QOpe_~IZ? zMiV;pKb at n}lWF8=r_l?_-aUW0rVm|mkS~jJa=xX9wOMfzaJ3zy5kOfFqB3C#793KH zlSUvr4$+C}>2q2m*GV>YDACn5{;673_?K!GQzoUBOM5dZ3q=k>iIz;CwNHIKknv&KdPxP(TX$i?`l zCEj(mA%h-7(ZXWKeMUrmK6&_bi%e|**^D at Ld#l7~PTyHHq5Zn;0zf%BK%SX8A at -Wv zstyW@(b*{Yp@#F=oo=Rje5+*Dc$M1dyH6NZ(uLvFy{4n3H$o~?GUX;kvZ$nUX1M=4 zBvf2^&8 at Qv4LjX3n>xh$oIzh>CEK`GV}N9k0?lo&eKfDdkWVJ=({6ZSAHgccX{jss_D&IoZ*W%mOJI=hp2|NlH at g9|Mo(@K85jJ@ zQ^p13v6iJPcK7a1b3(BsQMGr`4rNt|d+83)r&b^OlsRie@{i|bsl_C}wMp5_MX`tr zlm&@4*LTJ$4iT3+W0@#*nh)p8QEK#;<|&WD2QVaqc^hCgBU<`C&Gh^}|llwHR2jpcRu8 z?KteF3d~8GHu)S09V|kiW;NQ~iBYyrp&Ymaw>XQwx3O?fIO2GHHcZ~c-H?ib4IgjH z);c$@IIoIh(@C31yx%07 at s3VDY(fQ6G3Rs;5x-T$yd|e!pc^1$b-4CZMHEB-(H6-m z5PO7;hyTkQryuckAS9PG7luak+%&*+yb@>H&l|=NUhx_OW}z2;#vH!OAv at 3QGjRN{ z_`6JuSfD_~xB(d;sZu1nN9# zby3$R3RU$#`a->*R=p+vMltMxCT<>5N<_&|5d1e4R4moYfEVFLvCnkk!!uOYKx9t{ z^t2Z$xJ_?*SvyAA7V*R<8yN)Dp+#)z3c`+`M>YU3hLBf{FA$7u%WzX-7q1f1;!8y9 zHM?LALrf$3Q}gTx#fA7UOgtF-P{*RLu#xshMO`nJ88mlLg%`Ln*xL=JAPT<}BT0Q(HRE+P6E_^5nYn81v7xI>(T6NRZ2$qPH@?Dalcxb5W_ zns%F$OM at T>o(NWkkR*0h#r^e&`>I?=o$OJNj%|@5ZxA%&;8VMB7xX#r|1DkJ|EF|y z7zyw1cHa#d9)U|^MEK|scK!Q!OP`jI*wGw0Edi;HaAliTAh{xcQhz0H0rZG*oq!TO zP=aG>@dyNGw?g at x@0|BfId7uOHz2_=0}1U5z$t}!{UoAQNJva5I0zn?EQPhiD3OzG zfVJYu2UF9`n|NYMJd+p0<`~X&e7| zPjFM(FvvY8?Sh9uSGah-Bpw*}zWmd~5!KT%qfix(xW{JrXpU)6FQPw2*9qE?Qt at CL z at u0%?1U?Yn!2uMHfag{48>43;eg)es%nlsY!bd9!Ocz2zF&jWTq?pIxaijbA@# zDBm at i#Yh5pEP|Px2N<0vMP%t=ri8@%3Xoc?5X&YJs`D6yM4p3Qbe+H!RP;N?eQWQ#RGheIejntSvZU-5NUoiwjuMN>42Lo` zCYEBcdgT#0c&XJU^~_O}!Z%op?A&5)v~Vo=my9Pj4ZFD43k+ zt5Wg+BTh#+3YzS)%0ZD?@;IxmLuK#XXOT8J at +7L>q=?3JFxsC0{5Yh`c-F(>BO`uX z%|+!yV-sFR_-~C~om^8xiuDn==GMaug;cv6*Fj at ylrxdKOO=*GN!(<*`6%Vup#nov z4KBG^C7oD#@&F3c;ku=|!>~h0wsekmyAVZ0Sr8fZmdMA*2F=0cD80O)cpNXUxFpP@ z$_gv?i4gzqZ`JB0>1O4+ib+YUh;r6~liRSEt_ds;vFL@^G7N=L(V|KD5)(W7m_Y|2 zp5OrkH7-%-A3*_pW?gc$#S?K!0Jw1jUdkxSFkXcg94gzAE9Xih1_s3zZ98bd at MLeQcCiSRrREm_u>y;=^c3p|jyJ_4FGHglK2H zl1w1a^+kJ{D7w9M`kpZ92T#daD)xMo5oQx7FN!F-Ln_FS+npXB&l53p-C;-09JoW` z9#X<@PRZXFrOZXBCWEA at qxORFmMJwIpTTowCU5te zy{TkJtEA8a*OmKhvhL at IZqndKERxZwMhoNI&hFGQLk{IrauU$9{_V%4>ooPov6Ey& znI<<)Ze=WgvVQm%aeBpJD-PR at s<)jtgXpa;MPkQ8XHMm|s_{<@!70>ak^yrxS2Eo~ z#j*r4(pszP6%X$*!b9tBXq at uIfR1u2wfssD*NVqT0oizu95LO%bX`Z*tsk41)pMI( zvr`Zs3b^}6@*kFdG7TU|120Jj<+cwbzTgj1HeRO(jJVLivje6p$UVWclMO#l``ps4 zTZ&K4mRGZwWwVbv{U@>MLG}alp0P!M)tsU9pNS&Q3gM<18tjW$Gor$uFuo7YuZ@?I z5-s0f9OqRRtU>^pe3ViM0%6Hg^vS9x7IDvNa0y+X3D-lPq4tmR^+;f)9p}7QF6lSp zEBo{qT``odrXA%&Mv;027G1;7 zt(m)nf!GlF2Khl6y^{^=Gy6Hzx$9}1poN-vS7u=|c10#N&3Ndj&TfGSiIqc~gnY1n zBx-&{LVxi`e~nOg_P0B`JY!KlXw~0bn z7)uYNo;~r8PTO*lAvi`qeu*uoKwJV61WGvi^NVir9S+gVI{IuCH*=ok$7=1!$t|W+ zOE4Z8y=#si!2;ftnrCMjR1mD=rd(Gr&c`qQ7C at tNV+Ob_U2fuAE?#fqtDEpFd>nwO z_Zs4U at 2V((_%$2xHDwo2YC$Mjrr?7q(&yV~sjysy&r0=7jWL9oH!_LH^< zMHyz=LyUNn>w|S(r5WYMdWpTqrQq)yB6P1k?#ByRlB^a9lzm!VABUXzxPT&@dy at B;+ex{=50< z4B)m at BRoBKMFN=fm!6~#i^Y+0umIyir8rH#x+q~@oDrR^F(OBSIyzfBf0fqE7_i at M zg<9mHBz<)myk2-QEQz|hY<;6%BZjzwTK}HBJR-TJuph_k-_reF%LYbh@(!J92FXwj zMtJa*;T>h`i9?shDjM7rdpvh3O^I@$YuB%5i(^i}WXidXcu_0-x9j5+&6s40tT;44 z+a?CvMTT97*mOf4OP4e$hqB7Z@%N6->#6*VX0#LyK)df0d^DR5%8)=QCv at BBH zPVP{2BSGC{49(%OSR+=tl?cwi|6W2jNd#0AUT}A#H9;{aR at X5~sFVD)SYdVu8fOMi z%%UkzB|G|w#6U8GdvB)ttrN4an4r4 zA@)WoG&^Ym`iZ(Xh+^Zb>@Q*Zh95om1$Ua;jVM7#V&#*bb8pz+lGer4NdOi{B%p-9 zhVJ&eLsEs9Z;gbqC6v-#m+wO^374>f6_3R51%vAn`pz#ucXV=#gO!!#fOb6Iuc1W% zNg+4@{5Dr at n~XCIVS~V6cTF`k+R|(jy}@{8wa1-eK9f~?Cad^pRQ^_9aDDI!J=h-2 zf_eg71sOWM%NnHG!@vpZkUFec=T4_-V!E`lOsQbf9O|r5k0S59CTX0*=$P5R?2BCv zU at wWiwAhR!kwD>I&M-e at Gz zKBiOn&5?Vj!F3+0cP)ffkW~#sa{JoQZt_5 at j+vz-Q1_%rm{I-vfI{$|@#XV~NPPM0 zXVeWS&bHHwZpdE%sJ|iW8{D+I`}>CnOPLlIk}vd1^cI7bp=CDKCl%+;aL)MK2fF>L z4v&b|b3K-dmg{0vIn{eQmLb)9JJvFaXYe_9AHs1#9qY$^0<($D$}+^vt9EfO#LUQ) ze9{vOFu$8+0xYePCYl*TQ)vzhhyneDjaIMb>7^E)UDXf>c)$R5FEs0PCofsc)0 z6Ln$%t;mi#XumZa(n<7I9Hm=7=(+ZzL+Tg+LuS|p_u9C>YV{_4HsspeyGJkp_v#Jw zGn#~}Hy9{&k&iC3uixSk1QW}cH;Vp!XyryojNfC}NoJgta-S4cN}|YZ}lmT?|qaa=)5z|LA{DkPxVqNlu+V4OVBAu$z zHAJ_{*Q$r*jkc1C71SAiH}J&f>Fe) zQF-X-R-H^eC(dbx)Nog7glRzw<#!#hBOYQdl_A#$0;CyZPtRmzq|K*G&R!~EZZ2p? zx?n9#V$kj`+T4a3)I5PB+*bkAU71SAaI_8_LIcHdX+w=1ArV7t`Pef>6 at hPPF0jwC z;T23RL7~X{RD=RhLs$3vLq~9+^jK4kqNSlyVZ6$&(G$r{gQ*BQ8B|uS$~;JY!RpP1 zX^t-DoDe?GNHCox*D*3OnR0@#AtQHaKs9e7KVPA6F$Mm_RMP=qopOYwN-C3D%6Zx` zZzr7wO<)>p(bBVO0MQl~7LSHVAxz3_T9ERo|2AW?C8mpHOEZyX^G8ID5w^-I``gv~1h9tDdrL+qUhhy?5ERZQHiJ%eHOY_v`L+ z?>T4m82$DAvDV65KVxQOL}WzHh>qa5=7ebP)M;#vxITBUwbHIR#!+2F;ch#2QnSIU z7+iKvPsR`u)up9upjV3RyY$t`n3!_9HsN?%bM__ee at 2@qIHZ18y_?4q6LG0zZ}%T6 z)U5orpOqqvWd_t*03&ac5W&ezpDpoCjBE`IYR*)wgZp*%YfEKnSb;9)0fkeUPnB!q zSp+*o$07srU6<@SDv>AOy at nuS+c%m2mT47p63~J!ZIENnQgH^-!>}9b_Ip<)&%G6b z_BE+u_p06U at X{V|fm<+_?cza at Z%*kLu(&lZrn6=hsk!0PbdVKmER=*@j5|%rTbnn~ z+$L0QClt7~vKur6oZJNj;Ez$Y5pYngMiF2$(s)Auk**=v< za?vhFFJKT3W^G?11N^Ym=E9o-7}%>syfJj>0aWx~%7y-$u3IP=vyzQpEzw8+qZUys at h$SFRxAukTm=B$Gk1RUD5w&>bX zA6J}X^gC6nPpc|jOGX%~YXkX*RK?E-vyl#Ealt3&yF(vs-+Bm^lts$(iP>un5ifM3 z=jONULMDS)Twulvq+le^p(_37EREI052t2OG-4j#DqN431>yP}%P?Ile}uUbff)FbL2AuXj0-uOWrT(aa? z8IBF?iQcBe_QiE4n{{4e8!k90bgEA-mDDjo9=I0_mFHuTc1ei~MfZN at HeFBHocjwC{2vb%JroIIz!z z)OhL7CfPK3*nOT3w0YglA=*s*XUyT)2*SY(>w#0vKZb~WPmSnY at F&ZX2yrTM^EmL6 zj5s$3(u)TI{9Zg>%m~8!+*bvG_e83ot}lKykfcd1AK!T0ft9-VSP6kGDU_<;X2N8k z+`S}A at N;PJ%NCvQ0feOTAl&!ooC7z^DFJ+&40C5d!4Y`!E at pJt{SSc%ZLl?_hZ7cQ zzzNY=!@zmj18+m&460sc- at -slvjZElpR8go(tPPsDE|YJ8*A8l9d4^r0pA#O0Z)(! z?S<%K8?R1jgj at 5rH}Yho9%e?{w>%$?aeKGwS5zc{aep$huALlq zz40-O&Dkwt#FqeHon5r6<=_6^84ShErFIia(uwrDH&eK)PcY4Lpw{mD_QEJ`MDfxr}q+9=@`=F7sEl zt!T1AQg=up6Eq_Ov|>yzN)eL)Q}K&eu at C2&U+m1!8WFQkO>RPg4;12jXtwrewV`hx$za at cByfR<4+>AU(Gn|HA;T>hq zc|kdXt at 4UzW2`?W+we at s_X?I%s6VT;eZ;}-o+;|-&*0E<(H_D^wgBgpXt}<|tmDR8 zR_Sl68BLUq3!&D7jls5-W?Ob5$KNb0UT!NH63!?eLN^HnlK8cw4xF@3Ny%6<|l z56CY8_dI$`(gn5&E7QdnlPUZrh1*hL*FHs_yF!eeIB;en&kQ###mQZ#&$R8~i~TLn zKum3OxBJ_wOuNh1-D4eu#YLVJbRg+*SGfLwFJb8 at Kx7M~!q_`R^!RU!qP(c{Uf*BLcb#iYdIA{-5$q)`+0-+Tg at xiw zXqm5|EO}Fxg=)OXF{y@)t^uaA*rVM4|ad;9*cR at Wt)(%Ml2IjiC6$?M6*EH zBJ2PNJ+C&Pv}$o&81)W1RKOE^ipB19QIdz?ES6HSj+t9k&Eb$Wg=k*`Hb|2Svsr;Q zn+u)?y0}xZFt%_#uFG5`Nf;;P9(_}!r_KP6CUJjkAWDi!@bBa!-AG^^Fxv*}^4Xm% z`@3?h+#Ke`Bs6{)%3L9J6<-P0K}wq*IEjxXy3J98;B#eza8C_k+-=mmo}h;|A|ti{ z6o!3JWJ2jzC>?U&sSNrmt3hw*R7Wjg${NX2<7vuQRbh^n`mI?qT{D|OETd^QXus3c zIxrb>IukiS3I=uj6VKb&%pHg}!HOu_ZgPH4zeqPeC=b}u;ac0MDkt3=7kn13c%zG at tu zZLWO-D_Y$qL+oWk_e>2{{b;Cdyp&Rem at 1&k(g`4xLLpO<48k*yYWV?IUvP-1)xELQ zm|{c-uPS)q0+FE)C8iIBZ8uiKKj)De$=?FT3qyIXMWm>{)TmkaZeCey_9plRqFP5) zx(J+M7aDl{8?6mgA}@cx_-40D>;a}pnFkl)qH-qOUDb$QeZkiMnO9w_%67q2_~ddbH>$Y!U2$8l#$siQi&l#YhlCye$ue@=f88iGjMI0N^BD95(T6T9GnJ1a&z z_JPv#g$svLiH!-m{O*y={Aj!zqYPCpNzw~=nk+9HR&x at 3OgG-p5T)@2!ro*CT~$Rx z at 9LvKRQ)$}L3IX+lGfs5{N9JuhaUKT0NFJ&!?hEGJ$(LZ4p!N-d_l_+9wf{z$;uuy zg2C)w<|%7uI^`Twc)OUlDfB*g&7C6%yZ3@~wBYl0U%5A at nq8&aox`4O at s1HL;M}#f z9%OqxYtp7ZUOdWU5w43FcN==2j~VpFe81Wg$YCJl1?_`y_fMC?Vq3(!#c3;VG{QNz z3nr9{kegTlg^~s7IbArn22lkAWd(yra1D0)$r at 8GZbwhS2vJB`k;eE*ue(pwp at Gt?vw`kX(qU(2f|h$zWZsT zL26!at61nfkDQ0Fg0Ybm|7P=Yc8*jGqEqTpQd<$f!%&sLb^Mt>{jG%D3?bX<_*ebK z-sfFrwSc=y^`v-*G+!mPTy<}s8}w7P$KJV_DD9a?G-few46hyive~Xj1=cU5t6a^f zUOHs{g7`Ln*^`p289A&W0u*jhllbzEzY9iKAGYU9c62ms7dv8Z*5@#f_$<}(@e`^Q zIMUGH)Dib%FhpHD<53Vah&@b>9Jk>Sz z1Lqm`S{`GmkLn$3(m1sRYs50gM&9(Ag!M3EcsOF^vB=Wc{qaBlErO*n`6M$31p+$z z$5;ygpA6-{)%u`VO~z$W9qqe at T&E>&5y_YUSeJnM6Lpq$lR!i$V7h_q=ssY>Q#Ffs|Pu at Ap)kRye*<4AV9kALMkfKNoi;aZBtRvLXtg2 z=f!67i9Ez4x at M^4>@m1Pn?b;trTv<(39E;x z&4&J^voht^j;@=f7_`sy&q at r?W^fU{cp9r;HX14mEE+)9{V3B7s3y!_9 zR6l*l1QiXd>|RRwSjN6v{vu$o&^P?-;=gbis33-#Rz5DBDl z5_JbZ<5;~ZG!$t_w(19VZ*FKL2lVF<$*C$YZE)$rj83LOA-jIe5&rETF8}r4v=}&x zw_q6(2x#Kpspl>NftU~E_`E*Tz+e#saGrHR* z)iL6<-zJw45- at rZ&Ubbl)d{#5*;CHTKk}zfRU|5wd?ZH{B8d at G0!Qp3`qL&=whyd7 z0gD-q$$$bf^JejE?4zPB!~Y}j!}Y_p(>^n!@beJ(7YJ@|gL#MG z7eenkhg4JRW(nrAtXUxr>w8Q~nS4^;9NIi=1`~mm0%Nda*=Q zJ4kkuEVq}kZJf6^0)m>uytCGNJ?043Y8sDKdywSpT8kDABUX(~Lf at _FHnlk>o<+W) zxs{IV<)!jCjdo76ZHHFR^|PI#v*;i3JZCQG$>y4bZbj!f-DSELPp5I6_}N%gJ*II} z8x{^uuQg5f2Jk`sIBqGi)rOO4T9}Ocm at DiQIm7itH{;S1hD@&;sLF6frs9&6Xv6Gn}Axb~{+ZBu*F8VEtQMnep_%)^7sbUAq={gRl&&HF6EgBH`8 zeW$fXm^C8Hc^UH3w1 at 5$UdmN5iz at Jq+X-^z`JLVUG4aB}A{t|UHFlVqsYW3T(wN7T zTRNQU0t4#!gtHV_-(xO-{&)i>mR5J*H+3hcMhnb?xs=dfif86rG3DtTm1?ktEWAT$ zLQTv;={ejZDP68U)3Apm8>&0a>euoZwM|-X{>^1up zHG4>9{7k2b;x4a&{o}ClhV9t`7!- at i77O(0tZv(O45`?)mIG`8H|k*zgTQYlYml`> z1)l?Xr|_KBm>9Hci+g7L?$v4&#OvkxQB$m&x!bImlRGE;+&)TlTfLj47=^t>9R9+C z#@DQvS-=}ePuYQtr_f-kn=iP5n&Zxfg9g3|);x1`E%mBX>LttZ1$R#jX1Z_SebU*{ z7Khu^E;9Vif)gm?8P=!>H^N?BK+H(F_GsBG+_HY*(wLNxNs&XNflG*u`D~JG2I7Ny zT+G#*7~tp7sh2nq0>)+W_Ezhd|M1#gPM-Dj!1B*Zp2j%U@^#J+p)3uC$o>tF#5ohl&QkJ!pS77rvxWaKyg7ws z at S1=9ZY9H=!buj6I}ob~$C8n`r(ep(+u;SW#^3Jdcf?)$NXQHw%^V-S(4?)gz<_S^ zl{wBP&mby?P_kx{_GLIS74k4UWX++!&6+vRzKocke=xM&-|3Zr%4o& zhW~?~QpS(a=w0K)LH$ZBt?*O*{I6fRU~fR6C(&G7ezF%y)7|mSxqZaBob}u8G4{Yf z8#ijXn&?ViHYE at -M10zGP5#+RNZNN!*SCnCEKlXO`@Yb9loMXRWZoBvSY$E8f`IrV zw|nFDV=R(ha!;Cg z5Yx95)3+GY_g9M19224;uT1b*FJEJHf_GKRY?V=D?Df>OTf6<9GzE{65I_d1NVKeG zpi%8$jp(F{CkEBEI6LE+jE!F7b#QDR8niys zWW3HNv*l~!XBZSxXIWsJ?*M`CuSnYMp9rR*6>3`OCM>K}DJ2)J2w=6){5yRCM(IXZc3?!{k1 at x_d%8Q!A#bGRrpkdRRKa!#9jfEg8<}Eh~STQV!E6)Y686LJ2$BZ z=T3Gvc&vgRm#%0G&jY~SI3hZF2DVNYStUl$fKLeMlT8cxsf&XBwUSe;5f~P$^j9AW zjvw!kDn;7VRD;4A?zL&knzudI~kLVG&#S51p>;z{5OjI{!`PW zWKADmv}N>f3ZBl!HM%-7TOu+ob+S5H6wq)87~%x5x#&G?95^f3#OX9RTld8+_ylEI zRomg7rs5tM+Li)z?KzCX{fJrhkD8}t?GOL6+UBpPpM{(4bX#Ff(Q(F?oc5PZm!5~V zlg-s`sqG z&G3)yX;Us0uth-Cr@~svAw#2*;-yN^+H^WOYOhuEMA2ofWGEJ}N#oC0_6JKM>$+h; zY;7|$DT8avW{6JUTcz?u^zZ2Bgp;FU4 at xUWQZ5X3SM%ByDLe{(=)|#A5NGg!jpMex(DWPy_hzFf&3D zbQveebR<~JBjMA;885BW6nm^Vs{c(Ep-T zyPAq;6%T&-NddAoQpldxb$)4(PqD<2f<&>tB} zOtit37(*bKb!kE-hvuk4$c;5C3 at g$l5lg4oO~%5s(vdfATss}*iTT#{+Qe{K-ruW4 zdmoSH!W^5R0;W&pN~-*6jfSwz>nE)wltqbA&Q^^sS+Ra4kq zJc>C916O!#hd-v0+RPJMb*|{0lZR)2fm?{-O%Gzz>T~pvHhE}&L6ZXLSUUH4ZRPl` zra>eq&Vv5gsOWk;H>1LV7*qN0hMi$yq#pnYl^pFGmoA6NkFrd*em4lt at x#MYXecus z%cLSE96SOcCC~{&)%px^f4dyEgP*q?VYZ?q8O-m?G|{CtY=+#m<&{*K1Q0d!vG_?b z0E=f{kr?#GDAy^2#>`=+TU$&sb(&1C+=+wbY3(B at Bk!ic9imWbiavWbE9`d(Ueo=1 zZSl+>qWx;0o)F78IZq~_>tAika8H*1_)3Jc2jBw!zX`29=VMcENlRj?Q1 at h6u;meP z?p_-l)wnl@{u7$9AE8l=^m;ev{D?K z{aOt(fMV)Z75&Qf$|=IEGk8AG at DziqeZRxee>s5v)E4>*uKenfvYU?G*_DIueKH~3 zHumD=@%R5k=>2;ODexU806qLmo#|yj8jZD^knE(l-P*$S;=FM#Y+%&iy=GOP)NaL2 zGQH~6FGVHps~#B8;-bgWXwNx=)6D98&Bx!ybXpy>-pHj;YpsC?qJI9d{~ig!=7n(0Nz?Z}->sdbrx*F!tZ?bD8# zY5I%xH1z4410|R5Lv02h-)ju0MboFu_*&I_5*LnK5txIdIWvKTSHZ&HhWx;?Bf>6@ zQ~+a*m3_&a4w_sBJzq?XJ7_qxJUH$OEnw?I4f>P-xv0m+tH`$Q=QEFv#A8ecRb-(Zf9SNw=oF*}gBT zI_Jqo{yiiWd@$lRX!R~sNdh;R93RLso0fKJk~$4rN`aO%>e5jW43!7DHeS0yzAEDh z_3Z*dM6CL_H#LTxaI at Ce%VlMYRvnG at 6@iykdaFOqYv%lKk9ZsMR6q=f(rr zmmdozIiki$0ou$N!pT2xG3ravGoT&FOgvr=PNjHSJlQgE;2ZdcsPnDd)3QY1brsPykBE5#BRiaYB8oP8H zd!Gaup9Sp_JcuoA~SYATADF+jl`Z7ij7Na z)j(@rJo_+PgvxxNz-qR!Z$+h3q9TF zA88x@{wXRm3 at F@9SG};|vPcwGigy~T{MVm|WtMyTCZ$`e&x&MU8b%?}`}Q at c3bNd> z+3M8+y+0S$-(eIix!b45YasW3T?`}{L=pK1(2?8p8qh%Sfp4fCT4~WVJ5EY;I6Nxz z`$(kPME-=4 at m?Y&%nAR|O1KRH0hR)5J87n-AF|p6+~-i&K>zDl8(!%i>z>aDx810F{xLurrw(FPh`Ow7D!(1;$+J#uljOGIQ0PUM0L#ao;(brB@|wk;=ngGiH~x zii>VCGn+y`aB1?^ zQn8#j>}^6sbHFRuneOk?fNzo>xebm`oz-P(wllH)kOfp{)IC3KVqU_NOSEs+R#Inq zzz>kcMqQ at VFN9nVI2|$hew8YK=Qhc;0(yH)C6~e}mw0&3;i3jSrQ_$vA5vC8Stz6~;8MDL93kn2ZcuSR`JOT84~_Bh59= zL?cG!4)_zSmbXuaP?M}oP}T1k at QSn>Q!h;lB1{v0+3s=eJk#CyI at ua~0Ysq~DL9f8 zVU?wVq~a(v48#zjAumRds+uJsBqUAVI%xzKQBP$o4O2r!1qiBid3syW^$IaEnD(5= zbf270P4!gam~{8i@^Jm at j@49QhAqFg#DiZrs942z<=$epLBBYbu-a06*)X`Vc|Su&6PVKRUh$kL)%v6Ws9NW$5e#n7Igt}#@XC;JiMZnqU+!E#?|Gn;bThztSL zsvy-rJKFP^rztGuoYH!)ELE$wTyt+)A0=!^5Y()(Hs|r^0=<_t6t}_~eZa at l%(_H& zf`@GRL8&FeqFpgKoy!)@=%ie`<4=&02MJkuj}=sj7A};LRVK|abL%ad85S|g&zIb# zEeRG5Ah~+lgeOU6>aY!3x68m$whnA-`x>)uZQcM#+;-1A9pHQ9G$|}8k26aQBHD+o zM$TIvHm+>?OPAc*)4$kq9aLe!YFDmm7FlbY=WV8E-L=6iv5-e;O7a7+!8Nd9HcSeP z(EhUG4H$v{Wm9z$8N at OlzG&m9HbUyeg7C)eV_Jw6sFqx8qBrJCkbJheTKQ-DQ$hRB0(yrASVz?vPcaG**A$%|A^)rP`ti&k?mz+o-68 at 3 z@&3Eo`#-<`8)8QtM_di;?-}dj=0mwcPWOFL=Zq40IvHv7R*Ikz<~H{P8crwUR%j_I zPkM(-xnezyPU!N&?=0}-mYIANZtp!6i-mQZ1;LD(d0f;L_>ECNGq!{68;kQ29a z_dgbY6O5_x`vCkWms~$@-#5KA&u=R}t`hr|s!vD$;@BznTLZv at 932w4YrYP}Rr|3=A6HX<@aT3*8 zuhvVgJjdV+M_`NJQX*m3*-qk;l`W0OZx at 1`*8%KcstB5G9~6sO%~A-NN+OyT+0W6S zR*5{l5!lrnR-D0CqBzmL35=~puFH;4DES;V%)Qzy+iIjpI>lk-sW}cf0b&4&$pn*= z;|cZg`zk<5<^%BNHALPP2#(U^2|3qaZV7FXa(x!f#?9_xE(d-7+&rfdvS$2p-YbCT^3R4R^jVr? z5J+)_?5Rwy}U+Bikzw#aey6V$}{qlZF<{sP8tS?mJ)G>mL;cJEJk zbCIw`Jj$a=jRD at mW}`Aqlc%@MbJ?~aYlU$U6=&4&;l8BHeTf$7I{qTQbjW_$*-gJ( z^iy^i#;brrVLUZG?xDuQwz-O8&6eA>=0_XbT8gtVZZrPZ>|?0wBAuLsVW$|}B8FSK zBRn;O74sQPO+8Eh5Qcrvy{xH3x-iu$D^hM|%XvGjdR4r3l|Y+Ta-N^68_<+kyo|J^ zY8g`k$e)T93$rL%b;mLBC1S`I(;d-!?3%$8MevwxbyuZ9L%GfYs*z-&nZ7y`qdJ>% z3tAYzP+Zjei(Ero3)=lYj9#`cB|7}qDf1O#C8D$_rRi61MR9jUu^vvz7&raLIwHPyFg0Mn<|3*U9E<`&eK1hXj<4hWFP#6$X&^YKrl z`N+1wdcZ7k2a%oH+BSI;O=@1bf`}bauV!gkX+;^N4-*x7H?ji^+H_(8(loZg{K|2} zGg+=6-IV1x|$ejYc&zcyemI$-mi1m^JQ0aWE<=Gt#CEdp_}nA0mUGLqLDikwitl|l~3r*;auwVUqa%a z=pVy7aivdbuRJkfza&XN!uQo#k_&4WMyH9AueO3Vq|7ce#UWJn9N{DaqOfXPuwqR$ ztuwj%rd}MMgKP5u{yxSj(^AUSt#Sxi8etzY;mKTY3RL at MRTw`7UB1{``#Z~7OJ$La zCxat?TK at y|UmXYB zhYgADf2LOGKtMGArsMD*WduH&c+2QN at PN+7PFYz`I_SE{GHAL%6cFttK_)PiMrlbn zYUDb$!E2~Qy2dshT%qb(<&D+SSoRSO+Iew1?Ls>zzv}uG{!1B~tIie!8=Kza*yq^w z+U76W*=_(GZi8h|tk2D+4?*uk+lj8e_enY3Z;a3WNF at HV;nG#4fzq{GY{G$8I$Zvf zLFdi$!tRY#M;_d3N5UV-*Vqqli#?%Q#N1I#-qnHQFaFJNP}{c2&`zgV$d`$>*-*xP znafvyMDw)Uz^HxTmWMn at gA}K+(8W6>Tmth!Qrp)E%xO-#gG&CYfxi)VR54?oQT?8q zp|uCNwjY at +=HN+>WDBHD-L&aTB^}D$;u9!&qOvLq?xW4B(hB3A!h&YC{8plm`Ta=YB(~m90=sd#1Fgy^rNWe z526cL9CRkNIo2)FlFhKUQC8*5I)P~CRz$Kj-Egpb7sx~sT#oO~!QQXsdGk9^ci81} za3zBrqCE3KR#qWW>s$GI1U-~i6~VuNHd5f>CXxU6lg#{wixO^0Rj3`y{S5(WEi zJ1J!yDjVgd4S<)vw?`Nh3Dc+1w`#?Ia7>4`)!xD=qWCw!MOnPlZ)3>8{g z at z2-`NA;x^*(=3PRY-4oEbk)?_lg@!7qE zBZuK!k}fjRj0LeIGv^W|aSB7qhsWVBlS;OrLs-zxx2ms}GY&Gi);Ar3O#e36a&zeD9WYk)2sf=}EVFe+ at Lf;1-sc7i%$qVGv(n zU7wk9R*9zKZ&%DgyWX`CG)D!k&G_v{90nRQB zI at NoRSt7(2J=j*P*nR%Lc at ULX!Tvi+m9}%imptZWL&gN=g`&vb&x)@n0BrZNzCKP at lOj2Rn^^6aZ zOej&f+mU9%N1J{ABjS+}>|veVKyb{|26TGpv3GMV^#(<_9YgOVmS4#KS%<6kJ{CF=qf)smBL_cdCM;TXs=bz!H<2eSrXMCh{N2i$y2o zc9nugAchk3M5S1LZg2xTVuT2Owz_JBJ~z?9?S1`bebq+nHcV|#y_}yeE+u`5q}V56 zi6!`=RXG}IZE&o)z{hbJm3{E)~{t%W;*_}l&AHu&L2%&1>GI*rc&KWj% z)3(jo@?t&b9#hwY2$0i_^6H{X3&q%U8*7@{1Eq9tI=pl>uw`o_wzBJNfpM$Ywo}To zOM;FXGA4CqKfrB>`JUQjeZS!Gau^EUmU(xp(H!S~8L?dVTeYS3?MS>BL0Ie)sqzZ8 z?hCQ(6ZQLsCAfwp>>=AHN&i+az#%-WOErP#h~;8W05A$4i+M&tU_{5;7)7z%AQ%48 zjk0$(R=r3q!h%(~{SH>*_CI~CPb^3xPs}AHjWq_Zwz(B%khWh>k5smk_poD-Zf>Vq z=2lvlU`&z0=l#p6WUbiv!sS61sH|qYM&|~h1|u!ijbl5WXA6iO*|{K`2Cm!>>53xv z1SfyYDj%xk3_SMk8tGq7SYSzVag_B71g!}Ix;fl^o?pED0--j58zY1s%awe^1v{Jt zJA?$9qNw>hDB(P&QJ6OJ zYvHdB+R3l^E1$@O*PXJ#Uq}NRNnJnWRX>GLJ#sPLp*k*XX2RfFQ?`!rlh$Rgy5cCN z(wC8K!Tb#u#sp^!4e|5imZGSoiBxAISuWEv&-I~gfi`pfY9j at O5k?*LU}35s zgRskBM9 at M>P;6e-6HMo2)Gm0$M${v1q|g0*_7c;B@;&b5*kE32E~zVcUO1(Q?B=P| zCJK4(GHpt>>BHDOO z%to{|hnfjP at c~DUU4j{!cI|?G1eFMRntTyzjb%Iq{Ndif-O+1qe=H99{bfJ^W!CpH z(XL8k)Dp-UVuSAfYTpY(N#S1R`p{aE#^rJ1!F8zve&_)MWamMZP7Ko*K{hVnH7V~m zGJyy`l_E&SEqiFrB9>nQ3`RPw$!b+_d}O-1uV!E z>HOYiA@$~d%m4Z88}P4-WJV)j?f=Y<|9M#dw@$E|tCj6PV|x=fXJ<2eS4Kx86B{E7 zGkPm~bBF)w4$H|i+k-G8;fd^mpeONy$XZuKD$<}8h!*TLrX(WnaNn;%^@ztq-j-2? zNGi3gVoy(5Kfn9Ef!qcu{VC`x9C#fpHGCcBR!{R!;8L7+q4nvtJe7oLd?A}}>1xcb z#!DsPS8meh4n8_g;j(&1eZmE|=5jur=&RKy<9hMcf5=IQqzw+ftFGy;#lMi<@J%Ri zOOKQyt`q(Gfes$87UoINcBl-I!vlfg`;npU`Gqgi_ja)2y;^5^0bVIoY at w zV9O;}q|(iVF`Z&*%?1yv^^A`dU5D!yVvg_ZbH-F33Z|&aH)0?_8~oDUx*9$i=Yjh> zz#bK3)5-TUo5*?F^Y7*Z${%aFl_*lVzZfFIv3)#I4PiHc&u>9kZ&UUL11n6RZdlA# zyHaTeXF!z|f3XNn&x>XlIc)#k-odt>5az+zM}U-EkKhi;kq&o=^6TaCNIH{R~(9mP@!H_pIuls!_S3BpnvA(_s$MT=il9< z35(z`J*i5~%4-Wx`PM+Uu0G at BsEXfu(ZBvH>QIB#MK%AR&hQWF%>Q?&|G${q{0npT z)WZzGvz*ROB}Q*W>tm&Uu4;w|KB;m}%j$O_E@ z&+0#LAE%!jKYzqB?f}^y_=jNF7qzA5|KXutQQkDOd`VXF?~8k6r+}Nz_oKwd5T6*^ z>d2Djz)+DJyB|9iRtQod{sw3N`cr{L5bdmUKd>$=BX4g7U)#NKnAznnk24!8d at -kb z#pIgx*bJCJgH!M>6mg!k|IccXK~SIf3B*W{yp8k~1%ANRy7 zxhWrjLJ=Hm{C++2iV%v0`5`S(AO|(p`K5zfE6t^pO!6A-SdgUOaWbOG*wqk%;Y#b= zePRr8zvcbRyp~g~$6!#A=j7i~Hkw}=$*#P93y$$=m z#OQ8zn5pXX%0cebneEIzxKxOdy5!9T&8dM5qI!DPFxR+4#DXWlX6*Db2W=O{EAP^5 ziZpzhaV$jlgcj#RG|sn(h)eAD7EK5eR+FsL6+(-`hdib`0=>a1t`X;t&0SZ_hABW8 zSLu6G;lHW;smO;a2oR7N7!VN0zXiUWgR_~Kr&COwvw2*Or!FsJb9Z_`HT$>dSkfZJ_%Jw}$Bg-7GcAXV`$ZRr3c__L>;Z=!?HY(d zy|noKOgn4GotrVjXKOL)@`oS7!R|H&oJwV1(}it5a7Uc4c-9|jHCJnvSYc$LpB2cEI(t;X9f_)!Rck#0^4p>=pG at Xf!oiF~oj48%c?Xo)7=IAOcT zVx}0?IPGI}53qa*YH3H{DF+Ml8vbUT=A36We?Oo&l`WK1!W{DsL!*#N&4?teGq(#0 zKaOG+u6RQq5km2gH_aIM(@GWJgwh$rVvgjnYoL!vBwjs$yhkrfTVIW at P#w|5VJJ-K|W_{v%s0 zqk^V^_RX*;0uY%rL4!j=19S2`{f*-LTYOjo0wRGa?EfL<9fLHBvTf018Bbkc*kcl{kz2F71L1A() znP-CjX|9u{Es2N`Q)92Iw at wlnBs zL8h=39!A*p0jbeH|b`vCS(aUf{ZnSSpj2%&0LsgEQU8mvbN!De$lvd6jyn-LBjzl3kP~5<+3!2%CjMXGhLsS7oOZmGk`U9T5Too!jn{Y9|pFeJBk&QJ+rYK%|K>7vRZ%O z`c+^9D8c?h+ro{+pd3407Bme1CG~rNiAcqBuBx)ve at huOzc>S)f)IwJ$TOlq!Yep$ zq+{YmHm!O at Ev~Vx*BKR;E9P1rb8Tt~EDdoXi_T>JXCar52z%G*-KOi{i0jN%V;Z|H zgW3Rc-r21&1`nA-qzA=~?(U5hK6DW6R(%@aWN9g~js&lr3LP`*{4|=pLO9;iZqem at mvm6JyimD~ZSo;b&pfjTMQ|C2OxA`85MbGZh{50zuRU5W$t* zv7zr~V}AG#R*M%$c8CJP=mN+$eq36oSB0)WWL925*l3B62Wl!Qy3Of4_k zW at J})9dlQB?=(vI+lY5Ye(oMOZ_P}88R_cOBj5&{3T!#=DQH=NG-cFiM;>EEG^njR zcOXY0Lhs~Gjq3$&#JvJdhA3Kh^v6QT0jb+FrBI at bGsfkXKogMLI(9ya;*$+uu}3iG zd71JI<{3!HRO#Ux_xESucaLyXEH?dZGGh0F=-Hh8SlMQlK)_Yd#ZLTtaQu70(8<%> zJBqMqI61bp2Mf~0JDUYV05*1joUIa2ktjBjfpC!Il(@#ESYYY~NH~nQ%AOJ~2kAgu z?;JM&a9`evnLxYElacMM2^L6xvh8_UI|0Pd4;CfYFo2E)f0&XtB_Zr9&uj3%W__UrPmr3zu*udIf7 zYIbdEI7x692z!n7Pj?|smN#|@?GijL#yleQI+Z^u#TZT}i1zUvA?9FI9`a;KQlorL z4`3S at e;@3VytNS^1&S-+-#?;-ag@$*W)5-k_jAH7xI$9RbIfpqVSLD(IY(f3SD?b1J=|Jm~l5R(oB#Ox$AYFX=-EvpgoLlfxn~0C5O<8cdW^euz=eRk7~ zq>y#vtkRo?UXyVR;=T>il2C*UT{3wSi+H=_R#B6Bn^BT>GnhrK;+rIW1!9;ek>DCr zMpm@`;qSOQ?-}74U(@V!h&2Hdb68ucc!T-ZprP2%eF5<|t<47q0uukf2pa#Gi!iaZ zur(7lF|zyLH=vcZ{#H4tU&YGF&D0{ox6l-58$`;eXtep8(m$K9BY0k#w`9k6U6U`s z{@!E+eRnD*y#n!L-^)b|Q?|ysqB#nqX+uI9^Rf4F#&u?zUQf?A5QBdkg|l&fYd93# z3Q_2uCoEp7@&Fv`rt$zSt9033GoTV+0jNf9abLUP7!bGJT4iDCCa;XNkXmrVrR$p9 zXJhx7afRMoLnWJGa+Zam?8E{n-`NwEsQ_*|b at EAWGh=zK)xtM57{k#uJe`^?)GGkQ zi|wYcURM1oUj2`)sP&z_G8>GL3BUB>q^8a-)S7#cj}3^Mb$}w~QWUpJHA#K{ z&gMWJwVr##9eBXrgLq+ry|8E?;l1Mc0#|8J at aA%}O3vTAn=}eZ9gT<73`+0QKKOIr zd3ogXx87XWP7xb&u~lSmPRC^WE(IOKE@%PGrOq2HP80RZRD~TePZkR0%O(GWqv352 zoRxF-7I{Hg6Fe!Z%fQF1#ei%`32jj0kZn%rU_24xN1Q}u+rm7mlq+o z>hnX{J at 3$E^)7C&1C_?s%fqb7u5BBUVUiyKL1c-rf z_qGkR=e&`KkD`-|n(?m6W(;Q06k%BuG>1 at 7wV^VqB=m+YXcZJ7j09smILymGap=d( z6nH at RSF(LJ{_f%UOSX6 at ARvYRn+(m!+{D<$+Qj&OVqH`6|6<+9x6(S at Vw18kszO_+ zD{a^Nd655!uQkGQB$){pR{!`|MjRtaXm#Q at VL z7yt&vraI~vGXSeYV0F9F;Fh%}^LQGN%wASPZ*`uYwty at 2@x&cyJ66g7yF}U`I&_q5 zfR at r`%Z(kzT-rh#!HuOn7xYmrVt=)vDdtc4e9l|xVp>rF8 zh5wF}k**@mcS9rPp4Ps=1BWA;#$PC1wEtdcG33N6W~_>|ZK>*?*Mk*8D10rmVWRIw z!HRFe40{b?cA~)^o=k=aEB9>#bUFw;7fu^aRFGzB*05Cd9#5MfZ^i`sp{3KI)dY>R z<7MGVoPuo7C4OA}nbhv}DpTE27VHyHRedGz=_3cfGVU;^!|3Y1=f62Dm)^4)O{#_F zwLLp|WcdTo(rUD-Tsreb-lC}h()61E%T at w#!HuNR!Yg)64dCJXTAODU)D=NpL8B>c z_0ND^u)$NMQpQzwKphcgF5kx`Q?0c3g2!ismAWivMLD%vPFvG!>#kHG!`!DG z?_7K3+ZLa+Ld)*Fj#X3j4(2pV}f;FCk|ejD8N1p&p`<-kg{Z z$dU+$GjixozOifIG3#ofVARyNNoTmRQm(;b?a77Tm zxM;92McYzAV-bN3>pK9}0)fy_WSg+hBvP|OMw7K08sMg8 at oQMXmMqvca@hx3U%x$6 z2!0=AAIz!w1@{aZJzmh%s=3Br2-&&Gsrcx*Eh)Rq at PB{alK=Mopg3Ti6i-cZ0AzKx!E}BySr1Vmo($ zD4*3qlF=3v6yOhW1RyA=JOsFL*fH_BYhN6T57ZPLX9!H6uMrqJo{{t{38S&U` zRNiRBOr#vxT~4hoUf`LURg^5|EiZoAFCSVO93+e3X2CjI2B06qiqTsDOk)@pL4~AX z{TZ2mHAFR}_Z?>~LbsqVp=H4gm})PjC`+Lj*)i$YSc0zeupk$=WNJnsNAxu}7;aJ8+T_9Iy6lW`8Wz!Lt6}`}E zuGp78+yjg6D~)tf0+_f+XDzg>ZHrihnphVQbBm3bYc1-{yihUQ;rB*=7CA}rE79&m zXG9bJERKYut%_r>#s*k)@Qf07k at DnU!3c}CRmI0;`;cFNX~ePPr`!%_4 at WpjaUu)5 z^zuUiLhVvfEQuJWU0fo_^DCmW7zi*|q at A)1$|vbi(>a`v9^$u3`MN8jcV3v?$9ga{ z=S9+j3`j7`iGEy=79*=ZB1=#!90B;rU3CJ^dCJyNPjEtP_MCpHt*UTZa;av at S=#1L zO(Y(J5rh2-!URVUn`k#xj7qp#E-g5PvZZ8jkn8sWL!XDX=746a?}9*PL$lsf0=wP| z51K*sjt)WYmcJpzXJl!6&#MrfZ;)==HY>lrH2baIi#F$7v}?tad=nL5$5{F^00tW1 z5VlR<<2td-;(w1fFxwCUCX`bnpr3j>)$J{V at zG<3`Dj(&SVVw1tSgYHNcT8KPVb4X zy6m1QY2cH-aX>|G0@&MiWTlrci!FBhW1WPRXf7W&!7Ql4rd~JfAlp}JZ|aSXGcqvbLd1v5bE|( zV$ow#?ZNNZWrR*@0bS75cdHGAmq<9YtpC+Wn7sd18V8U5N*;ayVbZ|8FX^hvBQR^g z$i>*qz>i-PfcW5bb9L!P2<~l1NEuuX7f;$Q_c-e!`Eho7COiZKYk)0sk~99pa)4XE zN8uQ9JNK!SoAb95Vo^Vu0Ks&}nKGfcBn7`P&^{9yw3$6gb6|Qe8}OdZqV2&6TcOQj zu$uxusyTx5|CM*>3w*1!kUNT98>nDw=&!}t z#>kdi__3~YBs at n8g(!B&D~3{z3J#=))iHAIwk!p$GA4eNUy$?%j$?fOy)6l zc%4*{bs)oEq_XXLLoe81U7?)JqGEYo_~BG#Y&+<~chtP#p7rHr zKEYLX8T=AHD}+Sa&G at iOGpGi2Tk%ftuOi%=d}kB|0R$9`{69VC^6w(7@;4!JHgR-x zv3Iuke_QWWs#;E3YG_~0&LkRl5{l%>iX$$YWYN@|vZ(A~S)=vqFUZJhs_E-4ghjn| z-j)-|(+)=k+O6m(VC#B71HCZ%rt2X=5D7p+Sh>u>V)(fXw9GgCuz2Ir+?_YGHM`4#<6xe z@!)EQ>q=8EEZNC1GeI{R-m>dhQ>njH`Am;Wu=@FUPjyZ~6TB)wv*WU-$S^TgW%w`39Ds)Ot zqeL^E+)rdoIG)^Y%woM;5M?Cq*^=n%d7tRM2e4xFsE1iiN9)X_N7`ux0(W;l(Ayh} zF at UB!S@~ifhW7?%F=EauwJfma-6QL(b*xJoJq-4oWqS= z;%H}S&^INe_-3|L$Tgbi0*-qW>8ewvyvVC!BP%I}P};;RUv}sGohe|?#BPRlG%7T9 zD$Lusm~1 at mYvc{By`BEl99$iP*Bj8g at XcIlLrk?=f`jV2k%cFX)Bps7k+1BjNU>{u<|@>|$2o1_ zcN#kki|&rjQlz`eV%;|e4*`?D z)q9~2PC6rSrx*8J-M{I_M^b=a>Z5CRIq~#{R)AmHqmPfqVcZo)q+S5ga-+Wyd>&|^ zHXG{RfDzbe)>d7Zwc>j#VBG_4G_`ecSY1Qh?6vA7mR!2v6<;S2SC6jByjw(#qN*eH zlkgDUX at kk_*f+Xv8&BM=y>(W{a3-QPa+zo~M`QRJQ_7&Dw$tIdw5E)0iVnTou1bGg at d zc`Oe3C^k%+z5T_o at gC{}5p4WoN7;@YW^if7cChzEZ%@ZcWWyYrieCpD=>1N|{0Kqk z!Wkd~^mhJ~I$Ye5d8rbv_XO|SxU24UvF4GgU3I5uWN8&GpkKuv_+DA{by+@? znz8$UkiW9_KB5}&N=GzAX6aAH~4G>syeqw0BfbvxVLK+mb+Xd0^G<9;Z5!K zoe8;A*%GX)2E=8bSlxvSar#98SX3{*M|8%DuRtk`&wC`ftVY~bYRv3s{0iXnx5(VH zyZ$we;H0bA at f&C*9j)o7+f&>H$c=+vq!+<%`GaOL^$xs~Y-tM}t^o@@?S^jo*ms`x=z6e49rWBeXp=&dXxidmC88mN`;4d zbY!cRh)0ed=Onu}^keq`KWwu%bq5O%#am95Kg0pm4`gf!+juNi;)~%mwC+xUFWZ(B z-LirS`{#uhz0V;_Csjy0ZZD5I=*M1-UwoIkCU<%TM+lG~A&nXaW}l%Qx7_rQvp)XgiwuWR}QBW&v;Z>oO`m at h88j=e}FZB%e0{U&cP& zsWipbXdRZ04pu_NU-Lhe-pBG%x-&S)PJ2?0#p|h#e4&9`Wuo28Z<#OpW;nm4*1IJ{ zdx{=wMvqp6KXI}}?Cg&-F!#JkwMHt|)(0vR8=7*ssn;Ys98>I)tc$j+SsAaBRC$H2 zv%zU=-;J#Ncbpy(yuC6ack+e^ur6uuUQlRv$nMaPS>WxRs4Z|;1rDyYeNybM6NVug zU&zZkM;`s=?tJ>c1?EojQfj3Js0~_K4mXH7#9r{TqvB)5kiseI8B^rfEK^lYEQur8 z!x_~|{R*xTM-1%BpK}vS$wL~gJjVEkRL{vI z$9g2P#1+%A3-A=@AEZ7wX4p&FDa8 at K`STr#sQdKV=yo{7G;H-|h9nfvBe~0A_PC-_-tFqFZ;Hf(z`G}RNsig$j%xF#yLuCl?^Gx$>^L|lWNRl3)6KYjF zL$)>JL-uQ{QQa~@y%F&^zVmre>0Gw?&cGFUS3-n1}_{O-nq z`m#Do+wUmDa}c8alZ4=c>}jZn9e0@~pYaC-Uq;NMJGu}XKh(Vt0zI8=xz3;<(kiHE zXO%Zw#Jo0(VUbYDgkf2M#KW1)BcV2SJ}?SwlZfTp=y%X-#J8M!n;?+jXO0vix(Q;a zzq8RCKGby-rZjPo?Ab##S-cxR84cW%9R!?0;f!_m#S7QyQ<)(Hp> zmiDok!Ty6oV9pcE52w;zTx9g*hRG3HfC=msGgA%q8uMYd?#~k_1BY~0V$6zhzWz&z zr}+;-K%3qMF{l_3<`fuZY!xn`RkvCz(HH8+AHdqn*2w9RY7S-dh~IUBcMqkUz7m;#nBhG>UM3bVUH22I9ycq_9wZ9+K76YbLy!3PA z2V(d^J7k3!B(d_B2TXrBHmtE)m^vF+#U_0^q^FKFA zm1XP}1Q2~P3LO&C$r at +xbfEJN1DCzGkVOPlsHqe^%@^N?b>gcsU5sm}?@~DYK?Usv zGG7%!HAX~cl_lo`FOQGc*zI_ at -_M_)34pTu#th)kJ&bSle;_E--;DMHf=AHDVV@|U zC9jE&EKjKckICoHS=HBWynBcj at 8hR8@*Eu!;#q_nv65$GLS;OR?T&-7Yfmv?LV2V~ z?l_O!MCSL=Vv~v!Zf$OZAQsywOa)#{#y}byN|K-(_y|J3CjWqq5z+GYk4FUvP{??= zpoZ2y1Xxes_Vwa0b<(xSzEHaHRJTw6Iu>qi*G&_wAQhrbWMoxjjaP&tvWbkLWUBno zo3gi8RcP-L%W(>+uV_UwG*1p|j|>rg&)p`eV?O{dmiIz~Px4w$2iFi^ybJL~Z8cQG zZgIUsXpsg#TaR|+c1`J~fjv}t9;W*Qvy&tVqa zB+ACp$P|L9(xeYB^u^~>$AB at H1nJIuO)6XI^_J_!y`he1=XGd6srC{XZ0KvM^&(G3 z(jQ=pUOi#O?#>mb% zZu`eNn+0azR;@7=b;On~m8{d^75FZ(%qgGdqEjSPq^R%Y z&Q9ZX8fI?T@$>rx*GHlU#0^RR;N+nuijn+bq6|}5aU?%uz!t&@ew_M#6e#W?YB|KP z_24{WW3}}ZEM+K0-7+M!S4~a_2e_zLp08v`qz37#@PbWK>7vIJ%}@-hDqTSCqqBQ0 z#ImxCdH3Rped1Oyoy>#95?EwQMD8n}8IX at Pt(L1D70)p~68ZHrF|U;jT3B6|C|#&? z<53PvS1n!aBejE1&Bm?6g at k9JRQE>(r4Vr<>5@=WtfC9CQJ9`!;Z8m=iWd2o%z5KG zd(*>}=s@*GBmDJf^FDftL6IQfTwar`6b(4zG{cY}x-0<0xvidne^Hz3>sxVj$%&lz+32`AjYi`72XleHtX!Ih|U^klakE~|R=2VPQE z^lHi`2{_FxXDpTYhGZ)g_kuF-T|H#DYlKF57es~MFRtLJwVBb(p*qohB~<@U;keK6x?;~SsN^Iv z`wWH%%znIh#a5~Hu+)^ME$)^r@~yzsoq>7k4Jiq9`UIN#rZ+LztjDR`kQCmS^dVzh z)`Xw323*?&2T+$-?M69Q9+ZeX}!$M&`#3{_)c` z_6>0Z(#uroD_*aewi%D7%;W9O at 0$@lpy~q;esFs+c>Y6%&{rPm&7^?Zf^M6Se)(N2+N0Ob*D_P^yS= z-U0o_z+jZNZv9qyrw`Mjy?3}6CGUpQh;aa(Z65HL7_l_Qzlc6)3_VUT#>p4 zt;Fly)&4zvLd}`*8BAyyuM#REd{77Ka$DZWV0)23|2X<&b1^~ zet6vO6G?eug&~!;IOo=%xHAZ4&l5cBPwXy>a6J9({s)*$_Q2$Ds5h&ny-H18GStJD1Zhr)L?_d z1Hd%YZU!DQNvd3V at IwoI^-GQi6Yl+m9-n2z-+Wq^RHvGgtI2sS($$~PgldjCvstl7 zOM8U1Jpkeqm?tq^VU>{b78y>W(&3CXipwXcnwN_Yxz|9S7~jL;7%qz zf+?n*CXxe}x4B<(Ov5ZviNK_b<6ff{?hPO0ktGKm98YwVzp}frl6(cgt&~Qs78n|} z at UX$(%4*qFKw$6$!Mp?Qpp43uAlsN^l1Y-2z5}4jv>q0lO&KcwTr-py+8%g$m#H(1 z)A9TGf&8lqyrnxV!v9r)GYB9c$^S?Ngv<>r{$X|hm*@SDq3Zwo^4~?^kc!6NA`tcK z3KgrgV2COr09w6}Hpv1>jf$!W&2Uaw19=;;SB%Fr8LNS~k8n2?1RDF2d;NvD^U#Nh z!pfMBaxy`3^4tPW&hzi}(|3nDQYguD^*P{{&4SDGr^3xPU&= zQyW9NClZIrcD!|Hwzf2lapM`?yJpv`djRV#qMf%U*}B8nF=^CeL(yl3A*|VX$D#G8 zOl07(wP-4}(~z}S{yYheJvrGSB#%^W8Fr#p^8FDrQDI_Vc6w1er2}?A1+*fyy^fy~ zt*^m(AC9Rrk|1QD!1*WRn0!KmS=q4oTKroO{v(aTLa}ihQCZivFjuD&z zHJb2L9q=~W$Uc47uUdH!I!jFygu6q8iE+f_m`OEl5wZS5k8^6i&B8Liyksy z5+$VKIHmRKdIgTZ#YgNIOb9jC+H{5bqHM at Rirprq9``_ZEn8(a8XnASw)AHJIGD^y ztbq>ZJjgbx?0f8*im5-0MysV)3h-Ig!n0>^}&8YKYl|G0P zi*hmc at -||SC}tvNJ( zv^Ag at eU{!N$2STS at f^gs?gEiFf7Mgw^+Ng+BHg5JB3d7zeEtFL%@>wC|}c8M3u3Vf?$$Um(c#4IW7H!tr;|Kl3~!enMJq zjG2ljTbnMdX^1y2qgPeMG^_rK5V0hHRJIIGhsYId8eW#vYD(7B(rRq_TJU?*>yg{Y zb~3A9izT%->~Za}yFSQtn&G|n`jh0B<&G}^_LUqp^pYO~(BadL;8xi at 3dGPeyxF4a zz6d1@**QuFx2CirM4;B@~D)ze3VKRO)fJ}Nd~OYpR7FwD0Uzx*u;GiSfrrP8es!T3!g0)PJkENA(CDgw-HP&h$_yQoM`xGx$Abba&CR4iU} zIy9A~(A at N0vw0(}Vd6qPvt{zgrG3z{DTS>Dz#^q4 at -a29=_*bVY)xj5O{wJ|IWO0- z^SDBieOVdZ&bm}vH1ortf!ekvio3H~Hc-um!xX1 at 8<{avY0&r-G+G5M0hPudJ!(UO zNIEv9V5(BKt7NzlZX(=mjdg=}vNmt4b|F!W9SkK0?O&p~q1A=jaFud+S~vq)!(`CK z7(FVIDOmGUh{u`iwN2&~0Tz_Z34=d3 zGX*S at Z6U2qP)ux{0x#|uEzl2o^@EYe)#!1g7 at XQ#+SSwLD9HVOO$D zl~zfGP>iNjwog2Q)^_sYht+1BlEt8vKwm>Ka0ds`w+XPuHiwTMK-n$a<}V&vwMWT+ zcx%$4M`;ln1tLX=SmoYR<Zp432&u9gcrUiVB>yGct$qO%#oP-mLrEgy!tL}>AXBCBL{bK6i{8}RvUhIY)-8S%{W0p_P7&(?ictZx~q~xUMP6WF^=6c$EuA3BSv63XC&%TU^3gb zT>E}#k>^Uhs6f#4ny19T&(Q8&c)`OoP`9M85PMD7^@jB(o8=WfF=9=A0#oE`;v=+> zeg=43l3A=roPrO;No~Wp7A_r1W1$gOLTD>U=8c1i16x?=L{w4{ zF{GKobVv5U^ftiQf_*2pp{#YyAgW;?p(!e70b4Z$6<`{T1lIETjUDo*F}u6H)P$pn z&(Z;Qxb&Ws0MqjvQMs>P;H{bLHUypxYdP9pd|lhl#$^_~P77Cji92!$NNHy547JEc za&p*ETWabQ*;wEvQ1)E%_p-`Ei5XX&o@~@mc;Tm{^qwklot})>8M%3u2)Cu4d1c;K z!cD)>eZD?FPhY}~?d=nB0Y+M*sz=sR#D)GXkax-6buc z)J?dkG%^l at l=ZO6z9gntpU2^H)R?eZxq~6DZ2mD9V+)WN&83 zg;@96Lu^t*w$7+Z*kei>pgj``l_d|D#rVA>*f5gs_NUOAiw*TsT^`%NP+|4go3K2# z1LhA>uZI2vSOZJXFn}`*s1rI^L-KLnE4;`N*-7!!akB=5%QPxaDM7>~l)&FYp(j2O z`>iTkF{TN3Wze`FI1Y6g7rn>Q;}7EABL0ckqCoeuk8;PX806EY#}`Uijma21Fvox} z2p0+s8)((RjZ4;sKpRT+r(Ko2<%M9E%J8J*!suW?NfAFUw+<10*$mErtQcLIY7HjA zsc#)H;=Hw&t(MNjt#?OPIEov}(8=%%f03t`B!*bX3Nj%;1G|4`w4$#j$uRzduzUAI zn~*r77pzm>eUEpa(@_`xfk+Bgznnvs(;oPKPy#yZxUhZ!Zy1U+JhvdY+GLKkOgfIb zcvp2b>Wbo$quq%j|8uAz+K4T9%zpofNwHHP?3rljQc7YhIiZyTqKe at VjPp*Cd=1yZ z5qWG_c>{SVAMTRH3p08*dSosbH}-PKs^A`1b1EBYdGFwZ&N#H89e2t=N!eLng247JuaL5HBlqMXZTwyX{n(hXRk#7pU^Gaf4<+ujE<6hY?l+yw( z&xq*r?b6fKv!us5tF&gr2>X^{$7#1b%-LqcIRmW7Gt37braUu|-?5^@_ml3~STpy8 zxC!?^eXMW2;R!}xg}h13$fIRvEke~O-Dmpgr{!t70F>F*lQ%C669swloxl1%$i^X? zL-nN~n*}?AMQ_>IBAiYTuk#}89s0KO*RM-Hf5^eZhsD^df8dNjZp+=6 zL46VRK~QSzJ-OQhc56^RX!>>tUpQkhu05Gd&3&w1qn)QzXn( z?875)_X(*wNQk5{Ln&9ewl4{hTS~%~_8CG;FlH8~O{!O>k# z at 2hV9NoJiI;#@J=b86k{s-CA+b;c{1SzvOS>9K8}sO5IhiScgXu`Tw)cN=|$DNPZX z6l!Y0aJeC*J8j@#dU^i0!J&h`VV-ATAfP$$|Fqx4_Fu_u*MF}rXsymyYnP*nprQro z{+`#A2L-FLF;rwlI`mnKHgVvVYVLsi?)BSe4l8}xZMf}wKcau3jx=i?LKOxhu%1tI z%DB$Fo?P?z{2Y=3!b06Z{G~`&#=sI8#28)&IghCp2UUQkQKl^)r^J|Ns5m5omV()D z)z0d^5pw$&utNy30M-#Wr>dJ=i6%M$&)(Jze0+v!Au1b8Tzskd7nzGM2VE<8=58 zUdzNFZgbCL!wFWGrAWdm7Bhiiu{nT&ro%LRoc4-t!vswUo6bm6h?|SWIbTW$)rZQI zMY~T0tpWRweU!n=??@JHG2H<;R7_95nMkU&fe1pEP#lAk%?+>i7 at b$)F7hyt0w&=H zN6zp24EKke;y1Yg!Dm`>x_7r(uYOcIH{6&vsU^e=^Wct-Dje9fm# zL-U5APBYBTzt=zF2bNSQsH~^^Z0Rh)d;4b)W+M7izS(&lg6gdJh~H)8;2oS4ol(}V zRFvQq36zWbhytW>fn|XkC)W>EY|JaNka8Yvojbmaw)Suo9eB)4p6#>OR#S at -ah!Tk zJUJFM9RESEn~;2N<@c-T9I`vzE9eDh0O>kNnN1_;P3ktfo)@$W4xz=#hQqt2S3>hC z21?On)fZn7o8JtfG`@yha{2E&aKaT5)$ZKL0ZghwENq?pmzOeH=8!PiKQ zqY6DQcv?uLamvi%bfd*|-%LV_RO?R;srexKtb5LBRt|U;^%Xhz_`==JoeV-QC{QFZ zU~+Nj1bX0Cm`|X8Ws#7k$8OYL7Ww_hMg#jlZBu0_In-Z>U!EGSs|KjCA#%b<_5}UE z^GiGQW5o^Y!=V7e9FOo*OvcS-3kyPrdV64Vfwvc1FLsfv19z(o^`5C^XJ>Ea-PP4+ z1U)^zAPj*RWYUot3=9VQe2(CETNJtG`#;Fwq|-+G*%)l}hkJzp(rZc8y80)hM=O}~ zQeVaTCuOaQop9$WdE58pV#(BKJA2#MYPOBG*bAN;aG1UNUCD~2r2kk_o-iJ|J$IdY zw#u%RsCu7=Z#s{o%aW%gZ0f>2lMmCkt{$8n!-2DlFFHhue_?~~}?K1&&Ga+7tCAOJ`6{;FpwZbJZc`!6 at s}(r8DA!8h$)93a0ayl! zn{qp#w<&HB>PMI at 49323;Gyvum>qXA=IyKCLsB(3H=a*8dbLAY7bs;^_?F_8bUOQDdwj($5q1G>{^uUq$B at +{;_(?;21C+spQjd_rZ zjOZK+MT%bVJxtx at 9YBa!vo~I>#0Eo0qYSlen;4vtD5rEJ`oI&?Ewd=HJCwkUQoQoi z*YX`ktH>WIicgamEGj!rWlnQrY!g*eBpM{<2MZc*ur5$2DIaF}QLq;H=Ww`3;7~3EqdSRiAmS&cv+lDMlvrSzG;C(?sGq at R=5 zT?8+_pqME6wQOvZeLZCKOPpI#g68Rfr|BKJaw8qH_oh>Ee4Ff4w|mn2?Udb%bsBC$ zVM8-lr7ao2OTZ;Qq#kCikEq#y^H| z*@A8f+8ENhTz=3Ixf_SzR#=JIY}Sjoh<0U&7*L|(IE#6)i?#eVm-svrdx?^bS#@{% z8)u}B;VBag!?)RZk at fk2lXGB~ph_+gv5;?bjH#gNkje69Cx5PpdOmkyKLE`Cl4&cG z(-Wgs`~=y9cwK7{r#i$4aU7L(Gj+TtOw0J(dCTqq+QX(l{Ui=G zW;~0p=ifBa`+k-L>90oq`Tv8Xe@>ZXCHyZO0luRWQZW-!<->m`3o*vFvdB^g#g+n< zSr&=!{S-J_cThc5ou<3XqlyVmgd7Az=oKO~&6;iO6)}<8&f at iH_@2C&(cAF at S{*cn zQ>i at tlWnUFLw2QAdf*=xLZ(T!4%<}l(=izL&Io+jsPx={BtCIMAJG9Y at +lwn8K+nf z`fePZ^w6LzY&^jbVMM3Y<5%xTFV&FBZ&X?gLFCXuwv0v7#iwOZ>!o<-P7WO(L=G!A z?Vp1uvk4~3y^5|_ID=(eftjx+tnQVQ*I57{DV)QI at 0lJ3!S_oIE?-kKK)i&gn>~0n z)_ at 530V@ZywXj80H(@rG!~dCwVdToP5XvlJBPCV8T|oo?nmsG+<(un-i3?Wfqy~tS z48rZ&KlR66cMpQYNwHrOg-ec#sI_6Kvn&9~VbYW)4J`P4Rro3PmC;9tpcH;$c&0;k zFPwU!sDOU^t8JEapmzD}c(W(w0{@;tN+r{54Z1&;Jgj4h)Qmmkt*uok zX0?#39caM8`Q*nL<(r4xYp$AJeoq*6qg7aC3(Mbsa#$tT*O^2qxjl>uct$&-XR+I* zYEoH`8fQx$Yi^P;tJ&jvWS^eg465EotIVE_@}9aS1I85Jf zxGN8#`I2`eNU>o+GVbAMu%4MFAPN+w2bqTo7$t;)Bj>7jt#wJzU2R8oxDi6CSS_jA zH2I>}u9w>^tS at 6zO9)h`S2bJqBwAj&oyR=M<&=EtN$s?`xk-!yTaEI09ZybrP4hZU zr at 5KtbiVcs(Em{PM*wNX^a56o>LN|#!|9!BCH<{+%emAg!^>B*_XK3R3%}H+wAYin z7xCkymHW5X4JqrLNs(L4e21J%k7BsyX3a4E>`g8p1UNM!L`tFTH^xC6){7<3du)s==eaZ{N4s`0K2Gumi0M6nU)%w(}H+XbB7tf+C#wXEDw z)=`&6;IAP{vm7VOsdFkm$Wj1oh{G$9?l4eK+o6|R>=RPAkZL$@kL*CLxUH z*swvnaUnh8HFZcJiB4NA>BM2sVrG#;qoKz zNm)r{WXe9+gpvJ+DbsmQ at B9Ldfc}*+y&HlluT5q$&YJm-ihb-%Wh3->tYl|zTOM$2 z|9(ppRQS<0MXe<^J`?zSeZe2ZdmJS~-JGpTxCOl$0gG|x>iQ{Lm2cqVp!K^N%7Z}7 zINOYlYR>LC&?U=z>LzU0!N?)l5y{na0MVaZWNfsKOd?xyeGISFRDwesy{{%hqE?M^x#mmnq%G;+P3F(OI?6}h5B0b3~V z>rTp0>#3Ca4s|J-=04}p`{2Z--5 at aPFG;e6z-X*2%!F~MSQ(J9LAoT at XbcS%U^JBN zB~h1wjV6C#nsn;YXp~P*q5A6ohqQMJ79~ouK#zUyv2EM7ZQHhO+qP}nwr%qs>%QA> zW?n>h^hET;`>S11Uzw}2R_>j()_Co_%SGib&UVvf4p;|QN~LCpcL%>*@3#(sR8FsM zRA_3|7}T>mg}siF+mNzdCbYYkl-;BRW&$gJ{A=$Q#rjS*Gr zg?bd0vo}zhIr<7ir~_=6GxjJnC+*M)C+5O1kK+A9$#qY;5p1T5_3+B^=LJY(CxHcLKqvUs_$23daWH*ijm!gJ60WJ^*vZn zSF|#HX8nwQ-A0;zo)-x^3%HD9F;2s at a{LRp5h+_(sNVS-iEqil8qgFQ2 at MmbGok>a z-aOB1kk5oL_j(!wm%a#Cpem&~8TMLl=-#=tSC8wBv4UcrujJvgaH(aMB309^jhc-fBwf!A`Gq=gk3FnFAu*b!u zDhlQbdtSJ%RO7|etbrKQQLDzm at rN!p{+;iL{+q$!)2=QOg5&S z3>=#U0~NmRI%!;!R at Lm|*eo6WUihxLpMWyS9T8{2t8S}9MT zQ)e(AE0#qHr$HBs$!}3J4e9;T_kwQrwd|CR_i_levp$3rIUExVIP?lxCvgtTE*Y1B zkzjm3%Q~?Av$Qb2ak%8jd4EQiV2RCDXK!jwmpQ(WcYiQ zgB338r5yU8q|DxvqhkB3zJi%H)}_#4j}<0t3aL*k>I!z)D%`No@&=di zKEcDIi`cjHE&d^A{zL!O`{)#2 at r2i}xTd*tB`vN)3O-a#pouruF+{k!uXg%cL_D3X zoD)&u)L3d7iuNYvFhEYr4eaDjW<|T7$wj2)wz!IcWnmGoadS9%II%fWwxElzhbsU8 z-2mi}eb#!!uGb=nl5N=~f7AM at j_+{ovgOcSqFE5(VY@}r+I7S0(4XTLr3*4n8gCQ- zD49GVi~1uD z7QQ2QeKgD~am_T0OYEwx8#eUl*-c2~9<^RH>??lF7x9hO at Q2`q=mMf|n}pdS5^;lU z(zq|3?1+%uMu85=Fa;YqZ4zq)GXvRX*p|3eO4G2ZTfmxZmUx!Hmd$|;$qmcl74enc z;gkIj@>$-|7y6mr at fX5u-^{xk$DdqmN4AF^;s7w}v9b=CZ*hInRwt|v2Qk}g`cwOB zrsP=DF=5D-)+0{If$eou+wq(2FJFVx(cDS#5z8u5NdLq_ at B>LO&yJE3cW{KqUOF*Q z++L<2Hu#wWP4+8?DhaG^yQaEXFcFH#5|>5G^u0`?avxSPSHO`)N4ktZs%|@-VKZ;b z3>LyYF8+Ilm(|869(GM{Cv*^T{=<}oBx7ylsJ3+;IBH(R&LkbJviU*RP15>&nB>dQ z at o8LFzXJM3;qoJa{2X3j at IKvw`~v=*Ob>1K|0En3;lbc}xdi*_4Nq4alvKIW at F?7X z@%Esw7_q83qfx!vsy^~SOnr*)yfy{m4Pm|m&?dnd)_8|A|Io9Ji>a at C)+^kOtvo8I zJ|l5J^+msIcRT1vMk-heQIxQk(DQ*=?1)+RVzW{S=eTMyIwVaW<$LLx{XRWtYftVY zL6U-VAyNRo#qm#TZbW?+qIRlmGiD^i7*rWkQmqF2{*x0=%R!>!XxTYwiVr%*Wp6Qd z)>#;Wwh}84-JZd{;65LOpTm*QeEoEpv`E{=+l0avykqNyLCY zo}yJLtr4hZ*BVv^R6*vL7*cf^Nr<{BN5M8)vkBd0-nXpg(a)fZCca7bu#(|YcuaSE zCa$xr_udSSY`%ZYyw*q55F?HgJAhYF-pcZexFRYXD<7*=SGAA9+hN?Wx?!kJmM$%3 z#V$2>$l6XJc<$V{_hLaTwP7phr?0nV4&DQ&F(HQ at M4bp7)f8-nnqSWCW_9mSC|00I zDpTk-2cM*&TW;{W0PQtSpqcJ>YQK4IJbKecch0y0Pw*yp#aA&7yJmwy=1^({-htL| zx=}TP3|Vh5z;;=-r+(dn8T|yDFiiIqd#D$7IQ7r4bt617n9~LC-^SXwXGgXWDXDx+UmA=Q}(t>MxZaAYjs%WwK;iDzl=<|yvW6k!ec4bN8n59iQb}(7MA`;v8_mUE|ejmHv}| zL;RZ4&+=YN(pKxD)=99ztUVYCr8DGX%}5QKQ5FhG%)%YN-ob0B!fi|*<5q=^8?(+} z68j`MUKNiq|8AA0WI2?$vw)|`L~@XObO+ixQ=iGxH at 5u_A0!yFDF)L4JqI at R1VeW2 zVVa(*M8+kdhhY8$Ttg$`8rcnJTx4waXtg)+c*O_LA at D?HIEEap$Os_`a6*K9g1$6q zHZ5<>Aw5Wq>K~gnYC at QhTO74NiLtzbYuON%s3 at qg20!GoeJ)uUpF*hgP8VMD9gH{t zd6?(vdDs~ESW`rVL+Hh+*d9T`nRcxiMzLZ7mr-0euQgB;+Y{r_=*UmGN*{LoFW3$z zyLz=j0s#0e0suhwf5G;D!FWf@%^P_w=g;@LhA1X11PEeczi1)_<+z|S)`Vj)KfXMm zgt$1eM+;^|$VzScP6_)6MXZ$}xSRB0>hQ4a5Q(5VTEB$#Sa#jNPR;(|+;>67hMMomC)M5SZZz%JLq`*Ud`uaMdSGEV2BK*pv0*C6 zl6XyWvkG?M`T zw5HsUYeizi29Wo5{$WH&s0SznG>LZfH1T?Xw8k<;)@tctN65$q!C at 0b)x#7Fb&^9z zQY{zM+Wr*6+C+PnT7$F}>roX#T^a$BS|dJ7;p!B9j!5fk7Q)pC_nPp#Bz>0EsCM1J zmUa9Cu$6nq?Z_F8^}w3zMbbmo)oz_(S4d3sZ?J3l2Bl#fL~B6? z;I8$aEFD)%#t zC-J%n{t_Hs*EQM$z~DCO+;})0{c^qB1Fk$6CecB7CH}ZffPW$D8&5$zqF{WcPl0_i zU7tbT7+O9 at wF0F3$G2p&m9Cr8*=cX=>`UpYjL+8P)|J)=X4WPbCju&qSJ04((7=AY zUPa;9fxf at 3Z{H!TT1y3Rq~wz&JR_I45MZ3BwG)(*W!9_LFOSNv+X<5_q=!p@(1{`#Mi%T~ z*4>AzqU|j>-5xjgs%|vRF72-NiabM8>I+xFfd=ZsG$IiPy=ULVQ^w4zEo0ukqcNR)hTvP5I~ioW z)`8#qkFhyKgc09WY^UqEdHtlbYD{f7Un>TNwEr;UP%~kd at MGgZ62Xwtzl$UhU4lSc zQ*K?GM^vFNUZgWBMaZ^Q;uK91nwVjV?s1S5b at f=6h_!#uwRv-x5a{U>BZ`irFGH4e zWivaFd?uM*N at 8YAUgC`v6gJg}Qt=nVPKH;yPo#mt7qm_cgxk#O=F}Rd=~g`%R>d4C z=*!fnc4wLm5`baJcs?$+7mUuznjImGU=<)T>d?)|I|D&LC)x9_$9vjzkSjdP7-!M} zVVv at 0CfFbRf#d4|d5P(CFjapB5eyP=K|dHCd6fOk{+M6zcdL|W@?4D0hQ5J3GjCmN z at VJ>f=BbcmN9p2w^)tGXO3Ek&Co<^u|M}suEs#QQmxUZ5xH&J<^SvV;r0BAJF-Wo7 z$BH?uprbG|%w`oE{atp)@I_l-G;{A&%eRT4h4PZj$t2YynrqHEXd>|;MS2;R+D}Gm zlvn&jdNPirxP+fmw-zZAAoOdcaB0BMS`4>Rvo4s&y5!~U`?E!=#)o{s*8 at s;2?{=`LL;wr$`r_!!LB%KFp at I`DY!$n8NQW^ zd974KMfAj%^<7|i#K6VjAQvUly+ at Lq8Jz)$aEgh3o*!`W?g5woUZ?U<6br*dc}Vt< zsT*udc^1wF8NN32iFlG%Q+qpg-1{OIy at U#C=%BC%Up!E~F(pno1BE4GG#2MMD=0G2 zfgi4tY?lh6G(W{koIp%3&zL2aVo1+NWR2`ffQ=GD6g`)0a59ioM9YUpuJJw5V}L|2h{WW2h84#1&BNgIc9=pg8wTyH~E4OL)Nd2nl=yo8!aJbl at 5vCACFc&SWb<)b#uPY$c={0b$w}7^R zPMMwZ%Ip1#>34Z<+!FAzHz2xyLc?Aw=+R~GYlZ6(Yw^}saPS+Q4)UVidxNcRZkRJIq# z&HHv?yE=59Z$}jmk%H$5QcdKgCTl8R*s2&ZU#{A+P?i@>f)opDLnX;xLq}+{ z_4cx9Tmsc(F`s~fSo*F+NsZPq7mw>I`3PVdUCK;w z70z-YuBQC7q^qZL;zl`xs*rNa`!%1|- z;vg`Q?1V=G$|f)bG}b5;Q%W%aj35E0V)yYdYy&e%nSFr|eAI^s7;%TsjMza)$}TeB zHN(Zh>J!24d|lrBqi}~|#_q_tW@$)CgiV%;MQTjGZ1~lZK9bi(ln8v(M`HIy(W7JQ zOEHYuVQ6F|{g|gdb419RmM*I2=m+G7VJBHxk;W#h8ps#sp(6YkKvl!rEq+WlJyw0Z5ks1HbtzKD1653=_Y_jUJ3lzWQR zX(nIDxJd_I_dc4#M%I@?1R^KE8V^Im?a&4ek|+d%trma_mSras32_mn4%=aFN)7Se zxeCGT=c26MO2b~p-DtXL2e9r+qo4P_2zc=i?7ZYdTKBEtWX502zM{in#@^_72 at eXP zZzf2j>=?TNdkT>*>f|QgFnm%QeD8vR^mMG^S|w{@-amk?V%4^=s0xfqK}3|F#)ad` z*~qYqdeakuL790IZyaCTUEHzq+Q-ny34F2h)FtHD)Q5Vw}iq*^yR*lbSB}Wi*Eu8aY(OVbb8If1u+07&fnVlxjxMgF^83l z#$;Tvh??<-BA{!mAvORD(UIf3 at eN-Ca=OzsViUU3?o$;45*8b^5pAMij at f2Cm7cMS z-50puI|GJhWwBeObIq;wN(kTNzyx*6+ylO$~IUg z-3C2bVZsambuQB8X}%~)q3l>p!Q4JB`O7^JfS+^bu&oB+t-EHz`5QpY^Ca2SS|De6 z<3K!t&|6`bJ}1WoTyaC7lnwYqZfcWqZgJ#r+fZYJp!oBJ;7flaNbM06-PIF3Asl)l z*OFyMUjek#FFc}4+trfefi`pzjyjO;0JKP!W9XYZR_nNzXb-wYkebSIUQ_pp zRL2SG3I{b>DGJKf&}9JIFruHjwXDm0nh5T4QJV_(vaTKdxMlgcE$aPzr;E7&w%0Cu z!^d-gkv#{>#(%&F9YK*^b4cG|`o+O>{NyzGz&ve3Q>X0;=BOiY0gPkjk7YK<(_!5|RLL5z|Wgl-jdO_WEv#}oy(q2ivLyEJPm z)*u&FXgd{tXinDu;0)&Ojoa+CefHKBr$HM`RYWk^J$-*BKBR3ByL%>BzLr3+mKMls z5q^?zM{W~-l4W>uWn at v5A($DkuOGCV3J~}AwR?8UzJonb9;f->5hQRN8Alfq7%r_0 z%}&r`#w#+tIQ4Dy!GqRgrkg(L&p_aq01~bNG%k}sFr8u+N?Z^rce?s!IUR<(cLvB8 zl(&kUwJ%TA+{r<;l*YP}tl at 0i1RD+B_7W6-rmA_MIqd`2$oou8Q1~;C$L~M!N}O z+XKipD(Swe(a{TeG&|hfm2K}Bs)~qQ zfC+*94lG8k7ozYg+kTcqg3I{%XX*hfoqa0ZCAA&Fmjomx)-drt#l|yY zyUt#y^_ms^+_R37{|Q#&@l|3y8BKp<#F5m!4NpJw#Ut#+Bh6xuv=Lpu-X+zT8zd=e zYz%kxX+H`|QT at 39d`J?0yCW*JUKj~aZDcHix~4CfB!X;9G+ at mh3Q96sYL1l#E0kKI zuF6q;wq*3BlW-q;svt%3!>48WvWu3Wwm>?hEdf?!2!}l7bO<8>T4gY|I?Z$tiy-eZ zBxq=_iSfGHeqH!3CgUyD{hD@}C{Z}pf!)3x&8oi79>d2^?8gtT{~7>n=V{&M_94($ zP$&>>>FUMu>X<_LasfF!c0D;fJ32JgTt5_`Y>ktZJ2C{QZRj{>+r@;;IWmN)yEe#- zBW2LkTMw at 4?!YkcspzzVF&keqtO^MI-l-EuTnfuMSF)uwyX4AKJscgSvj>>vhbhD&?A?ZhLsE@{S0$67a14k|7}f={$bk3_iEw)2 z>$slDP;OIz-g^qOOwgRjrWd80RZ|@HN?=m=;UXBopV0He%}g)ni{O~SW#HiIU at tIahhGKur65KcFMdoMBXf)X%(}fG6iskFXWD!3bBXZ_CqT2 z-9~!O1 at x`_0q7BOzl;;%o?6d{!XV^)| z at eS|=#K^AO*u}_pT;A;?nY`=2W4;qog<#-%LfW{YnVMD9wQ#9Ha11dq!wYhmatuL% zdEl7mg~Ay#Fg2;=_jhy64)$K{3~DoNP_=YCs=xx}e!qo2Nhz9lvCQ#L|NtzKRG1_ zopA2;M at NeQR@_n{t7uvSpaIqj401G6n8|ikIS6*puEV+rZjTr8OZ4EbS$<5-f_dY2 z)xIEG8QTux1n!5`S&A^;1%U$cO9CGo5d^N zzi52ucr&uD{au*?{-{?ZNB+-o_Z?UVDB?cSQhU78xvzO;QTll;`>SO!e-jk3$9vbQ>g=T|i?0$R$-ZX2~ zLD|}|wN7OXqtR#`+2VqJw}ormG%|#I%%v^LP0!j$5Otd>h4!`d+2SfE*Pzc|iS~ZC zLg?Q_%Ovoc6t;_S6*A^UNu8*jW7!8U>R$iy$G=mD2a3YqKwSX+r~0}7X3suFQAX}> zqGE1c1Y;eB-f5?xnX#r7SJk3jU zJeFQhTki1c>;Qf>7!lYN=ogH~pU4IBMU6=rphuQC7M;OhZ#gAf?Kyh|W- z^)VT~;}i)op>ilPRkzBOUU2F;C8cgMHx9Jeb!m3x;h1)iBOfV9uSc2G7onzlBKl$T3xc&~jIy zYm=tSOgl{p#AqW>Uul?vGYoILLd=Yz8Kn()&>}WN#6(DGq~!(cdU1ZOZQnX?UrgNF zy1DmdId_L$-6$s792(hP_nRP|7V1 at Rzz}9JUfWQRY4eEvvNZ_nb__xK!`lSs+4Sqc zQ_i^ur5qfqdA+<3?dw3s{QH+w`?lg9S`88eN^)FfFtBn-m4q5fZ>+F9XxN}%0a#|1 zXRuL)%R)9l-akk9>|U|r{qHL3ZACHwN)cmx!Ui4Ulr=B~CjY&!@Y z2SKeO?fG at j_a>ISmM|rnoJdsS@$Y8lx1UwZjp*Z8EjHA`g1)zD>%aWj7UtLYe}NSR z5{h28YyJiK$-t at s*OvrYy0bmVIu|^Fv;QwDUjATojPZX1X$cAd!2f@!zZSM;|JKZ? zMR`gVhyl4rMIS`(Z8fA;JD*f`n-K|72w#$(6o`v$XgzvFR!UOp4U}(0&;9`XO<{Ca zA0S5o-kCu{&hC!mb$j>XYU?*NK=wc`pca at lR(%luih at j@I7p0k%ZW3Nl7yg48j~7i zKn8QvuM*iL!>jU3$Gs=^SMpVG at 4Tk*1Ii2W>A)isl9YbbK<60uX-EJdleOPID3|ne z-L|duR5gR>CSAI1P)ZZ8ObE)3M3roj4H_^y-xwJ_*vM{JQ)o6z$tSyi)_>0xcIq at W zbI7Qt@$EZFA{>j-wTx4&R0cE6 at NNHcch)Rjc5>hfcZFFOxo7v43=MvnARbZ*Ki_;*IgMXS^?M(iG7)RM*KGZnO07)OTPH ze#olK!%?E>IGW18ncxnLbH+u0Q{KyWqV4g`+ at A0S6R-{pBdX006lDvyyJ;N`DLde;0N&4JTw3 z9t_SX$N&f+qH-7{{lG5xA_GKYL-f>OapmRNX&Li#=P_OXcB|0qmIYxDoiYJ}fo-?k`j)}TIUr$W_z;A?MIOS*cIEi5zxTnb3 zQ-X5 at F~7U}`hy0Bys=`~k~p7L`?L~`jK>@&hfusea9 z&)nT}!_eH_6$YlDbP>)Si)*Y#lbdmN80FMNL59=$y*3ze)R=ZCX6}tK590hCFP&R7 zD|iLhC at 1`rsqpw*4ZWQc%cT*3YzR!8gCQYFVbrFIj*b8cNaB0P+ktkD&RU{0C+4R+ z79TQxH=g1aZXtbSS9Ijcpd}_LNhhRPIS!D(f_fTJC!JYeC9)cccP3#h%k1C~rVi#( z1SoG*BKe)Q+fG)p at e$of^o|qOU}97!Y&63~P`qZ}&NDZduYxQ`T1a+To5vDGc<#B+ zWYW!OtY#BPHD|X?C!Sq`)y!m?Z7n)W4Kc-9S+Tr^k9qEmvKKFvnrcKrS3QE+!8pcu zGYGfq)b_Azd#x_na5%^|ndB(bDZeO_^B!|fk=^GgEyiaqIiEQ|tykMxjs{nCT<>#S zBq~80d1;0a+E|u~(2mE{g7quhQ*vb8ekN?Fo6o30#5M)F`3 at ffMMbn!oC$esiSN94|EkBYZsb*x>kzt4cYS9y8E$s;|rQ-J2e_EdX)uHCMZ zJycAkd!*g&2nWUOkTzh4Wd?r$@K7mP#XFP=iWjZ at EHo4FVMiVl!a6R)R&io|H<0RzVX8?P z-N0`@SKy}E&1S3uEQUa*Jldgxu* zSc1k-k4oZ7+ at SoILx{@H75kMYpoI+`biu{Iz9ZR9*vyA;G2O-unt9jGw&7OGX)E`= zpHLK_XRg~kRfRtEV|xnjdd^q4A=-yM*KPPqmxW&V&Fg$G`qt}`ubp*Y9B(DgCfwU6 z at RP##f at VovWv=XP$qM~U;Hk3%#-W!cu>)QVM&29N?JLF?v^zi$GvB%}#vwQ^+`$37 zZRRP+3|6F+xV8xAv(4caL^JT$YyX|`6`uJ}9`9S}z9+qDNp}9nQ)t0*S^@iZ(G;=)x&rYr; zm=nx*icg&;3Bmx at 1mU>xVdEDO#?Sk3y!FuOUini6y(46cEeWy|dS#l)zl17d7$NDW*=P9k7Ogix z-H922`duT8*Asg_RxvRgv;_Yxd|Zn#hzi&$uc?n0$3fXOt56jV>8md!_ASixXOB@{ zx-_-^c~{x)l9CnW)2}%G`a5BBp_OF&aeYnTTuCp%xU$ryr(w1s$(|rrRFyl(RY9n& z+^8u&Ikkx#0_SrWRIjQFm?L2XxS+{nq?POo#Vv!F0QDX at m(&WY06qMRVIDcs>`UI6 zbV$A$j2HvgD*fRM^Vd75%p9lgpup4jznGW}2g~o${bh!6F#jpl{^u{>e}D8;bexur zk$o3;ShwOesc#+^Qh^>DYywKg!xj|>6q{R6i%Xy&GEIkA<7F&)^K%@Wmmg-S?&SUa zIkm^5seiFU#j5=P{)svIO?qM5*~LF4vRmi0d&Yg%eU|<8dvAyj0LDOLz*IY#p)4N~ zO)FvKlaW_`9@~bNqCJ{Q at TCB~Hu4}7ofmOvOi)g#oQ+Pklbwp3-d;yk!5Y;#ozZr@ zonk04K3AjF1 at bc32J1Gx#3T3MVHsL3PVPdMLeDw7(B!y-n!}a%UM9*)3r>5j{`>2~ zW6q6bhY#y5!0H;+eh5+1Y`U-}0tu3cE|igxi;Y{doYiPzzT$3Osq{<=T@!fQ{Sk^m zQ&f8ENsOe}@!QGSZki%q{WIADYe~Rj*WRqfBZ>@1DYjO_Dbp&_$29D71Wc4yw!!X?dgCea~b_SdVJqf}GWyVGwr7#$G77YbJ( zAn~Lp>iojs-ZOj&`O!3IBL$GYa{2NwE5{if)WzDwR&ImO&?~U0pW$cd0Glk=gj at Ml(^?2qmOIjfW8NblYqGWWHD~>P8YH6?#rAf%q)(g|g8GAW=A;2Uner4||BcOgjrz zcvFKQ^Op8dH1+PB$iUPiV%i%*xQBA5QnSPvkC_!oup#@+RvbO(JZV9<@b=_2%CPr~ z{zk(ON(~iU^}$r)o(<5o4xCF!qne+|R9)uf#Qd1)oN_n)<{xud6!@N809_s6$!MhZ zPKQ-wVb+ at 3q@cn0$eeYOgL7yXT$G*jgm^u(JcWfY97a?XZy>c10B#0s6$k9P3U?hC zvf+KBv`7U85cU#7Y%`N>MF%XYrxF2a73m}FE)^B#+s z)f^~S%#jf#n$Id?0(Qs>+U_t&ghGN%@0he=%xz|yO}P&5QnIe|kWE-O+QCKnkQeON z at rkc%;rhEzG2VaI3J8HR)e at -a(LZG^#nMrV4epAHX!|AaPUtppW-M~kTxX}Ii zEwet$!xU;2Vm7T7TW4QJ^cNC5_W+CiM9ey#{>wha9oDCfC%ngA$Yu3eM&OIsa!!A% zLwAVH8=9AUp(y-%lux!(mFx$Hl=O^%Aw-axhgN{sMdKrbVsN%M~)!vdmiH{#&! zJ_d at Bdc$TMa6vaLctTmTWhD)(OSoQWA_4YjRl}W_Adr|5kXbtt8)G0phGdNm*@0r| zY>D)sEObK{rE09g>|xZArjg0e4kp!4X0>=>A{J3)OZb$PFn7QK`UC43>1+>z;g*}Z z?9PcM?NP}sS3LNnxt!XJbrHcn6Y2aJ$Tv{dJxS6HRqx|k!G$%5sz1TA)xsoMBaCP{OJ_cRhbq5lL>Ah#AK$PUE*yeWx#|IOq z1DgS#Rzsc%M~{qE&2px`JmIH;cvHi-xK*R#(w%-}6ZPWZPCTxb8+N3fp=U?@uHCtN zw2X-}sl+c{fi)asFubCxx!g at P-|-LMVYHu|PcmyXzl6a($ioh(2khA+9!;CERgedA z`;K&XN>Xn?rUP!N<#Gg;g_4@}$A1}ZG?6WtTLuCExB&f6_5J>tEuZO8`EBP#?C*?BthsyL@;*H zWAG!Z1huWiupuEOFpSXS^nsEP6&VN7VTov-lHu2e+6kUyFxu#84qAh`U<}GEH8wjZ zFg&5MHd|8}S*p at CE4`S4_vbovU2MV(*2R={hNLfAOVn_}v}`H$z~S3%M(bhNrs#3( zQg7%UB2+@(NWxrH8d|3AM1iI!H)u&h^+3-`)UpbdI2N>$gXo~}Eelb>iW;EKJ)8~Cff>|k)K1dU0OZUX*BuNB z8h4*=@Z+aVF7)L8vh*xd+XW+3W((!A>D)I=ulQ#?!nEjuvrbub at q&4VA(y?mq*RA` z at uV24xC7lsFNvvlMn?1d`0i-mfOM at 0v{yt at VlzcqH0nQ0h-;$_=I;DHxq%d=ES- zGnpm<1xMNE)g9NF^WB}__Y<_g!?vXW*Qks00SOM>QT7LST`07J_Ob(H-7rG| zK~)iGQjI$b2TPV>)7tWVXXq4Xse{NEj46vY%6YGbi;mMu0u!D at 6{h=7pv5Q9X!ez) z-zEbUiUvYByRO8(@K5V|K}H2wYf?dxaaW0SuIh(I0BYZ_;gg(C)ZOyQO63QUuH#IB zl{6qK at S`M;DJnC`Ts24I(51$+)xy*>O_jYg+xQBEW*#;>wZMWQb2BGyGFqWHYN&86 zpqZprD{u};abjqo1&caypc{{^l;10ll}~BNk^E}AP10rhAFUs?Ttx$!G8{*8Q?bm1 zrU@{##FmmcNfny~**j&ufCImqBF((Xva06|;JY|^P_Lf+0HB$nS z0e70IH7a0YVqzd+h!e$BICw2Mo`Wx=bXVGrt8q&2Ais;C2KeD}8SD|un7a-1f7xNW zqxOJ(F!aN6DT3W)rU!GRfU$Fpb;T|)fE}~!8v#IT#3e`>%Ie|a- zDFpLEIQ1(>uwJPipAMvxXf&rX6=tqxv8b8z8sK&!v$ycWT6H(U;+YUdvzrXaqMUbv zP)}r&X`*5};Tjk_P&smYiY=SHmBkLg`WRFT{gh%%XPbK5PaWwugLag<>w6}_L%ZF{ zh$F>h!&_MLR^58f2SUh}$C=VdyHtXBa at ZBNOS06MHF|2u;mAE*Q~3b3F}ozlRMZOp z3OA1wvS!+5MF$e$Fy+VU{>2D+3bqN?P z^LRM|@&~ei?__>8JvI at q9wg?*8)nM*gI29qO!n at Go3~%2`jO5krfvN+@>yPlQdzCM zO1=s0-mtvdA0$!uwx3!JmcB($r=@e$4n1OCHYD at 0pxDb?*3Pc9P+Bh&>TqpwizrUz z3t6D$ip|)<4*-tV`4_I? z at BUN<#Hrw?(RrDwrK+FaIH7;l-o}VPsAvQR06_SAi|7B;82y_Qxt7#FPM9L-qj at rP z+5(nVibWDF1(}&a#Upepn*7Wq5;Bv`tpypeOq@;}uH!9ZIJj;tKT5LSB%D9_eP?lw z-mV?+`NR6yVHhtvJ7%vwe4o8t_V;UdegJO}&oH_}Wf;cy84+0+-mzMjRmGx{q?Dw+ z@}?`pX{4*t+o<9y+IumTKx{RgNX=0-_~sss;!QYjBkYbmo4rV31y4nWJ2#?>ZEidr z2x1Q8Q|~x{MX1ar{qLPuQ=blAYN4;k&*Wu z`OxJcYu71~-8*daOj(0FoR7n*>1>BIv^{nnBDOz~zo?wDexKQ{nSfaJ;t6-QyOT>9 z8P>;vjBGJBPHAKhU1?MsDeOP;skKDJP~RS2QL{FrjF5B_$)|Tuf~JyHJD|)m>fI{w zYLMPSdcXFas^`Da{idSlDn$jYm33wSnQdOqay~GR8`UMhDednto-y!y+qjIW1YhTw zCVy>Q=F)tpBQw?x_>egjIfiQvo2dNg`(;c{1Uu^p}prS68oJl3TQW< zc~wClq`|L+_CV^Ejg{$D#rMj3c4{GKFhH;T{QP;h*cmPIq447;`*jBOneM6a2X>UV z6q at Q&{96OhvRth}j_d|TdS~{?8u7ua+5c0STOVXE{+U1}4*iZ*1(tfhft12tC9;V_ z+km*K*-3k0qH3_?9*#OhPLj~WAVzPkWj za8z$2?ww7p1 at 8!{=1>k}tFRVpK=Ko6E#_(O zpNj!6$;&Y1Uy9xi_O}rHX9tpYj&25y#{W)yTgk%4{_o;{ec*qN*{rOP1dw@>tea#y zTN_#*Y&2t7BnCtfM38`46cGfG6 at h%=Gps{rmS?Ott|@=0K=s}PzOLgC?`}<@EvQ$Q z8|hyeoaQ*Txw!cJd_I5eqp~{9D at +@}UUAl%CJeM-(~#h-xmeRrzlIQ5-$I9S(M;iF zwq9+<(of)YPQrL!#Mf2#{|o-)!mAGF=Oom-+{aeFMO`W$yZ at CMu^mmNWGbcjIReOM0gbhY) zo%`E+7C|2%Fq?BStg^gG`}bWBJ$;;Yd$y6gN1uC*Tso1Z?D(#hV43K$Oo3 at ewyq{QI{b7y!+*Pxpj!QasxLG^HPKv)Ah zUv~D&2v^;~QwcqRObM>2F%}wAKVbhdL1NM6i2N6-fPbMX`2Q2C|ITvSD<#^r2n5o<2^96GE_e9XprW+iLL3AwNY_~W{joD(ggt^k;*oGZeE#GtE ziJ!b1S0F~dLqZj6K!urgDhaj)_hv>U3e{Gk#ArchZ1Id6unYqxq;V at oq&qawJGV)i zuHS^@!F_5^HRS`VIj0ji0eWM zdJ&wQxzQ~Wd3+Cm2%aNC^j5B#Bj6|+7F7F)EF-f1N*XWDM8tzx^b^bqJ;VQT2WiaCbny4CScst}j!_B at rki3ZIkb5RFD(o|B%{eLaCBdT`&^L(mnz zFEhP+VD at dix_`AtO}A{o8r?+FTGY;(TyQ(grC1X{AOSa1aJ9!pL(h!TW(o}>vvaR4 zwkTVRLe}KDb*X1P*O>^^1@*LQL|#faKbyaWteMWw+UxI?j~}4;I7O at vU3zj+1WIiX zyvhI`r_|Rl-4D(tvWB!mUbr56v=gT at Vr1G0uQmUhWCMeMNpBNNNGSfO0b)?}L>|1_h&#Bf|Q z_%EtpjOM-2|G=CeC;))m{}FTlOHuqM04izOAqpV>fVJ)juAy2DNY(U+Q|TXy;?WQ= zun at -tvo7Yt_5LNJ8J*M2Q?;XhB at u0J`ra>M7<0Ekkn{T_J{e4BSx&uo(;Q6yRSF3x zHPYLYMo?R2u8r%%cc^LHWRPX98K_-C$h2`GLT5%X{DyAm<8yD!Pl9{tl=at!@SjEi zg-S_uMu@@;+;pvIHD}eVr|PMhe~El$B|<$1c*EPv zy^WO^(-z^`w01TS|3qXB%)w=jOcjWaq6W>$wXw}B0Jh9x&T zpQT{`6}A8wQ6tYTqYpDFIhfa at m;V7n#MeO8&_01tH}O#``62j<5{(dCTrd3_Mk`NF zi($+^0 at pKy6jGxeeyCHFM8HuUGnX#zp;iS#&amt=*g at Pa{}yTFt^Uvm&=Xl)Mf#00 zC0CF*Ao$Vjl4@?dAW3R{Ml-#{_fw`76|IgqFw^5`y^U`HX4kgun#CROf-Zl*md*^z$?J1iMrl&KD(- z!+ecH`p)%3`hORgxUu_ at I*(4-v)SG5{gl=Dw0WNU*XBjdAsKKcTB`7UDO{M;5G|zR za>kipPkLjuksr~~(X at kOHA>|_c+GhXSW8VbkFrj@;LR29QirqUR4SJ|Vu%viXb1Jo zp(ql?AS at T?m6ZMa>z=J^o%*u*F8YebzV$D&HI{LOKEnqlzKs(`9|hWJ%$sh|XY$I~ z4Y$naSf?NAbewQ*IxSp;n3N4Q#*Z#RoS*scnm$ElxPru_wvA8zkYPNCFxgXlt8&e; zRYlxjn at Cl^n!F!ggL at CJ(cH#`9B$-W|90>{y`ZjyB55=vxy8hgGIu z%eahR5EVL;l}?M8&mOZoRw#B=iCM~mJv at B-C2~}QZ_!qyT$yX#=agH^NxUjU zg`5~bC_7tDPI=A4rLgP>g1`gv_PJlxHV16c3foGJa8anqLp;Az86pE at G;*0jRj<+v zF}ru!0WXzz3b{`TaoH{1Tv1(%Swx}jHN`drj$0_ubbq3PwA|prR1*0ws>p!Fyb~%I zDb}nWh|}L_)zQm6iwbpDhry0PHbV#{jFRfr6uac17I^$9Siq!Gk`f6#sIYtVo<&AL zU#Y}I+6UzXP%$}#xC1NfiKG1El6-W8NZY>AbDvatUGftA(-J_ruoW6$@6e>n0X_3h z;Kc_p(kRZiyi+~$Q_c8HmR`SfF{YpfTiK^#au`cL-Vx0hahkk;o=Ac55=iPuWg+t( z+)>0A!V&~Y^k_4hww at B1p4yt8epyxzm#&9L_BXqn0sfC zb1Om0FMJDkMOt}>n0=EytU!JHTbV0J=p^))$Kxp2zuW&)F?DhIyF|!VvHc at f5&hU} z<#=u7Y^s*iuy+z+aw3V-5uvOEhSg;`%XZjL67Aa0Q>OK+zs3<>sq%Iat|cNG(~1t) zVb~x!SXx=`cxR at ZdcWSE!FQ>wJU8hA_w5G_)b)69Z^BPDIr+0Gpu at Ik zgYpaBOKT@#n{aK|Z9E^odzs?az$0ce)=lB;E6LJ7&_z1bpD?AfXHNn~o12PNz_A)B zBmgt$Se1!j?@o-MzU_5~_mY^QOY6VH76q715Ihl~dB)3Gn~}k$bxF*vD+!2A4;4L} zNF$EXBWS&opsH} zVay(-_GhY$Jlr2Ya*Wk3KF2IBGY=~ww;1PpRufa3vUE?3CkL+&{cHRC#dMt%jFs%p$`GGUxiyb( z*tj`I- at C)iJJY$+Cb^P>YxbMo77s~rk>@*>%?x;g*_j@)6T~FEc!6ArMQdcJ%HG(h z_Nz^#A-CT;+Qm4b{919y_SvS^kBhJjS>WQn8(K>mvi}tFfo&}vN=h&rDyQ0mxE$(v z#rRj42~kn+!u<)(B=A5$T>su_ii^FirLm~J>mR5IIXM}6{`0I>%LZo!jgKUj6P2xj zN;}Gy&JCR`Su`^yWysN{eGYj;^{6Q>p)zyI$*fG4ZuxCayOZhel!5e+ zQFJC*ZlbqZNz^gpi09u6!IyH8du%>6xq;0t&t2nN#4KQ)Ca>8jCY_k1AL~Qgu+NQn z_L(IzD?#qO?NhSr8B!p(_~JR!9U=thwOKjK2*$8(*Pm-_p(P&A%|{Pl4Re-ZWo6AW z+eEUmw4h$rib^jJFM72^qgwTg>9R;QolBpfmS9 at ZSG6oqusf^i9?~nc(CcC(^O9r5 zbG%c at hfC2O^XsQxbM;KVz4=thT9tuylP66H={j04|6O3q$I_zC=fIUXgF+duE5e(e z02me)nZ~|zn`^Z&Il5!zri3@@;W$deZOzN4TQcC8EI2}EW}|X0;R&lI6KAb7oTPgz zL at P~il~J|Ur{(JLb$QGp?xs^yaqW_ob7|UVQ1!uHTYlG1am6=&+DgV8Ns{66?muy* z#d#)ONj~`v)%_c(;Zpm1P3Jj|N9<)umo$|*fy1GZ>!y>QTO`*OZf#o+i at o{Qo%~vY z+{%NGO#QsWmo0rkb3r^-v#)h+1f-+X;I6+CrBNdDTo@$4XJW{dmmyIhb2Va%9DmSU z)(1V8<%W}=0hB1G50+fqad-$=Hvz|6T;v2Vc5(>gS`4elWS=n>^SL1c!*P5_2ILj< zG2H{pfazKd#Q^1I1^gbzLu_!ivyA646%GI4;7^?SnQX=Lb6DHgz9OnoVsLP!&Ue_a z$|7Y_g7 at pYhT~nOs%F-L^>-_I#Simrp at f+F|Dn at Q!~gAbGnaM?2QA*W+zB><|t zhpRIm85 at 3JVe(qoB=h=WHco4~kPb^-J;qlQnn1lR8y@ z-zT({jJ$09RRysdo?LD9ouirBjaMtvC`|Fe*!vjs`!EBu&q!CX8z4 zK|SZh!*>|Jhx$d`NgIMtODxmpH%|r^>1~_=({^+j<2)KQu{#(^T}QgP^DdCp8o?OE zJ}BU5puCg}Oz6!VxB?3ujF5J64z}o%GEYl2L|YU)C?|jKivR zTPUxDZ*F={)lR|2S+)Tip6 at gZYHT8y*Cq(AyDowDpGiPx{Eo!J{Gam}82VV~CTAAajf_z4LKfp`SWn zpF|NK;mLloYYLLPrA1$NUp&724Zt4+b%kT?(*V_arJ1YWR&9|M%r~!aO*yhQXY(^Z z=}0^|vpMyKOEShjn}+68Xx^yT&Ad8l3dpiK2e+u#4HPKmv&dSaZjYeewipHw-5ZDl z44A_Wm<)PH#NR{p-do!UdW{u(%?n>af8WP-5&93jQB at k0LrNNe#0O?U2QoVVB-9l7 zY{*B;803C&W at -e%oOxQwDEbDexk!E+4BAq25r2HDqo9C<#Oyn!ZlMhIZ*RFo{ghtl z&4>0kf9Q^Jdk?y8mAcC%Di&3&6fS3&awd at 9rBb#MZuKI=W|S+J9|xQe^o at VtOv!^T zma?Py>I_}VoYnJ=1BnIY+ax+U-f&vP%t04RGRxD8D%7zSC+H2*mKm#eMjLe*W0H$4 zMIC)pcZ|N}30lAvD0BF^DlYghRLDw z_(_N%yKx^0kaBfQ6Iyq9uQxZWUAM{od}QMAnQ?S)^ESceonh>n zq0?XB6UJB?<}cIJbQ-K(mW$gf)aGA|yVtxdvC}Gu_W2Sf?mG1Dp#dXRu=g=a|0QIe zZe_onDg|teVs!bI_*Vx z!&hVDri^t`8n+fE$yl>@*V|?0$`#!kMD-ys{24Eo7uNR5*J|`eFDOmcaU9*NmzO3m zK^%K!zAa*$)y_~l-O|tutEFb&(|GI)fjqUF>Diicdaf`Rq|hH^mNG)x(kIbET++q~iMcI^5%H0+A-pl1w#=z+Ws>B2t>X(*@+k2O2?V zD7hp(urwh(5S$2|a0#j%$yNNPi9((Wd8k}MrYILFMAoo;*4`)AJ=|#P={FOj(#Rj{ zSPO0yfrsbc#}666l_vfFHsoKvN!Xq9r_2#V00I*FU-IMsN{eCjEvE%_#BJkAH=|1O zS=QuFM8a84`93nmA4U{ZV43k9`TgX@@yaG|i%4V2;;D((P`=4O?+d!A4)pJVUlp at 2 z at yBCrr0S_mx$$e&CEo6Qy&tRYS9bj0p at B34DE3Hwl7gXErTeKo1Pg={^o zJw*3;kmICyiRwl6y^$4Au0=p{$OH`$8Ol1Wsu{!0j$5!Kt;K^_IF;00dn{Y6Hmj)F z;56h at VmbZi*x(AwZ*VKJ zyR~=^T{oDgU^t$ZxMx@}tsP=G&|pc-n4OPKCVKYop1kEKAtSBS+Sim_hn3;7`(@2Y zRy!+No<$Bba=oVr4fnDQbpWdnPIZpi{r89x5aauX*;h&hZXi~G5jEc(kA8bg?Ec5L zTC5)AA7N?NRqG)6PAl&xyX~6OK>1+q`o~sK;#mYhy+eylr3ry4+)Fj++kwS;_YO_alob*K(QwLjH=je5J=$b0DE z6ffGkAow5)I=}fiAWQnr9VB6I`gT3>?O at uikiaUafA6b-EKpk6R>RG<(h&F5sAq32 zZOP5u$N`LF`I1k;bxH03XjG3puamiFI52DtRA&XcaCH+5;|@k){g-S!-1ItFjI@{p zW|9y&XXb`mwb)>Jtv0afco;yg^yrqg%<(iBzFi*^0z;x)AgFYZgKhCmvuX=$C9sk` z_&8?eiQ0rpk7;&p#sTwt+xSL{+1&5>lPEgM4yWI%>klM?VF?p#8PJ at 59zfKgw#%MU z#Vez0vl`cEPAPkO>B)Pb&x)aOyT(}b17ygs%(?-%5n@>UK{(7l@SO5}uW9u8iI9P)P#zdD!Immb!~%CA zm;;eUw18h>T>!LI;^6>P38s(k;j#vof~tWA5Jq&7nkR(R#F3i9Jg^J!3iv~npvT!TCS7$$3olwuTwD2)f{Q_or&cs{ za`5FkI5DR~cA*YFp*8}LQoSTh$_0cI`{%f%U_uqX;ktno?y5S?i~+@>qM$wOd!Qrs zmrLQVI5f3;EJJ7u$36o&c70;bqtmQ5gMp70!P?f1Zr?nmVx+WI0*{>jpdh=*5wi5*|2M-095Lj!?|;Mr#h)Tv_J1|b at ZZ2TgQ>m$nHd$!}H18`IK_>vkB%Xzcboi=HjaO) z-t)=&0OSb88GL{UCOph^2#v%dbythbe`b9=@(4KpJbxlE=mnpofq8Ws_!cp$TJg!KO8&})cR=MC$`*-Z1= zVIm(41z`4l<5!k`o}@%(v`wmQ`C(HP-_gpspHNB|9>T)R zL9H{eOc9U>N-Mbpeyj5aXygJT=(Ct~g3HIKq__^dW&sF3M{nsgqfpH{&cu31CX@;8 zhH|-$JlZPs?I!q4n+OZ at nl;FW_8ftPu z)B7^Ny{04EPdLde?kChSG*55`IQVjPD&Vn;to^bAkBu$t*tbw%`vQxa$a_;B+F-uR4 at Q5ye zk?$em8_C`Ks><>1wGKXbBsI at j5_64wLJxuV0?_4?SdIC at l%j&ir?zx6nnYR#8$DYd2T* z!8|8v3X=*J7I_IJ&~&HUQJA{$SU*DEAaz~O4~@=(8Ql*+Ugt-fw-k$)NhiQ^tg)E? z^m)t9hNn!#a*dBrK-X7Ghl03$1+m4#|M&lnr7osbQk$h(|H__Eqn5 zw+s at JQSOm&6`r`b!TZ|zGkuwNF^guxv0Jd>l?2Joiw$L=POd1PJz=hZpd@l at QYPIjirUHR6(Y`D!h at Ynw~SeA zZJHOk0+OFC=9XOdB|U}xwu-$0-Z zvzU`%1YlgG7uoEnTf!v8UyBG4Y<~+S~YuZoN1Y%!mKp; z&cp_O_s(x;;C at e`7*Ou9d&6rydZSB2$y>PT-s#(zw!_qP<8(S?^_WFrpNZv5!(7DM z$+s{&8#rJnkWYeqQ&$<`(0H<)}ln0D4jx5?A07KPj!#ondGQ$sc=;& zVS;y&&d4|M%E)8#f5b7R!lJ>jsHKjo8A=}BLb?d=<>y^i$d|gZ@)`jRKDOWH9 at 37xBR at -nw8UH2W@r8lxB*NHi=5Kb=J0tV at n5gF64*=6-f!xMp82vK}UhhUy1(oHI{bHRX_6`UKs2nc7P63GcH^ zqv_@|iBaZ-VPUVt$8%2YTTK~%i)AHSt})EHJO!Z3AESIQs=1UUo?WQ^AVhkk~*(etT zBPSVA+mE;p(mm)w8?JachGgdGb_o*|7=|S!*(NCE;H^3HtjoWCaGIftmm7KTH-+hXcjY5 zz|-5rhW^lZY48}ap#DfjVH3Nh*#SZ|ZkAa!VWNRcer>0QETaI|H* zTz7ny98YZB7jmlk3=D9qGZ~dviT at tu#mcahE(w`-Tk|4ypsb#*NfoRB`gHDHvmH zmS7c=2Z(1#5Ee at WZ?_s9BF=Of|1vf1XpQeM72)O)h4W=$MaN^*Vnm0N#V>rbQF`U~ zNTV-|9m+jOs6z%mYaHib8l`DKP0KvfCJ(3F0luX_`3JC&uQYmZ{7UWN6Qt*7sMNcB z?G``!buceNU97sdCq0DZN&JNb>IHL+5vsX?EfBw*c}FDiG?o`<0POvdl$pgH z&ql^4_`h=dt=`ty`wzFV>QMPCG5sAboP4$E(9Ca{9(90-m=Ni5M`{@eFS;# z8D1_HXGum^1e1^5x6M8bh**{;@Tk}w7L#v*z<~GUBaz}wO>bBY_I-iKAvcRz<1*UoW7`e)lj*+B7 zMdY_tC5IwT6#BFf4*L|nAHQfRH=JZrPb_+vGL{pVa1~5iPoTgPZiS^-D}BEK57rDM zx-Lz$r&b*wWAHsBu}eCcDTU?TAZ5-kU`lNw3%3;%Q~0^%qn)_(a&n>Uo42 z*NP``8h(p3)@Gq#GTucUwVd_|(TZi^oV;QC={S{d at h!&~m at M|LtW^^PqM5 at HP++<6LLaCcW zydl-E{>Z488N8Z?+UIsIq18qcLCA9$HO at B!(_hc+bBH?(x6ZTynI7vH^DMhmI9T;)~`^SaWe z36_pe4B}oe?2y+uZ at 8_7>n>g_zdgIE#Igr&nb<8ynFhVfhY6j2 at MR7L-50-*8M1#Z zEm!hdrcpciy>q=nM8IsFD~@PnjlwRV`#xFvDY$Jt=4Fodr*$*v^jJtK^-e7Esx?-q z3yNWF3ob=P0J2P(T&K~S`;?gDK=1WW3)Fj1stQG(P`t!#^1t-EWE!uKu!;0%(tSUA zgC4eqQhz5*@fX;Vf^LrZ74Qy_Z&PHyIyxY3!NDoip;2LLyxM)QCRUTsF2q^YmdF&B z`)QG-fyV{><|?$2o&VO>b=Mr&?Dx`-V18ms|GKkMw-~RuXJm zCnMk#i)c{HKDPpQ3)dLsYYOsfjB&m^`j>dptAb$f#iz at KSje(HCDc>9bsb?I_eizl~gV&}!+B{2{l{e;uCTpjXgC;X at IRJD|O|g1=ybFz(M;F`(ZTm7Z z^p_oeX2y%xo5LscRlf1Qq6!kM#XEjh&IvybukQP?86yXi zfNu-oRxmEuxDUZpv=ZHkcexDcu&z9;%lqYDySl3C99q z#w78irA3FiZ%WXZVQQzshCNvkq8MKGERw=m&@w*ZLI|s>JlWE&0Jpv{Sf^`=Aoldg zGm!FVyQ8~1sc}W|-6eE`d7u zc)x$Xxw$xH8oKTOD0KucmMqK)SGFjEruqYr^X1PjzHaAUS&LSL*SF6sccyfJH^(^fYJ`0WCappLrFCp;u zeBG(qF^OYYY8-hKpsz6Ehbp<(`XYnr7#IMY;6zlJ;RxxY5}SP#n?q?v9n&VpIoFWo!PGa!%KK`EQYodNVG-&J zqtzgQUbG2wm>WIu+;qNC40;Qy6`c0YDUHU5y04Cdb*_Wqwq_|N=mtFWMm>UX(4 z(LwFJPa}_Hjw^Nn5eX9x5?BD5LL}aka%rY2WBn=|E-+j>a`l5TBJmki_TJ!`Bl^S+ z)F%V1ivAbhNz;?(PiOlXzO7Pw0)7xmBmM{g#4sais3DUs#$b4KP#e)+2|#L92}>$^ zye-rby48ddQ^pV^iE48M4_bwJ9y7^7V}LI-8E3V{Qsczs3QMHrUe#c(xsQWx+QEjz zLC@}O-DDS%p1?>lb-JQD>U+L*Y5U+Al$`xZo%w(#KUZ~Rgo5+aww$R^VA{bb**2do0md>SI76Rw~t z9Ehhb-Fm^dN7gAXDuo&SZBvuxy6m3b+0koalUF?JcZBs8c|nurHoB9BRk)L{^AUIn zBbJZvk^)cm^Iu+)hYcug5V@>k{ia{Ry_9vTttc&qT=>limX{1%XwYQf6!B^fsH3PZ zyYYbsr>YLfrKm1KrejwvU}Y79RSX)a(4}ZoyMCG#{Ll!fyhByN4S`&|FfywOe3SrS z5l4jUX?))2Cn_xQ!BiaAl$PlkkY6)b-R}(N(1LQ+39(%yFY3eeq^_3^XXS9%9kvcp z-1dI?<^g9^A_lsIu}n%Ei(v>VsQpNh<-6lE;ZC(W+~9)Tbkw;<5jFH#HHo;4am-Y%}r8--$gK8-F_;CFX~u**r$-j59)WTvA6v{2bIdE&j0oP*NEm{ z`w;(n{)5^YIvOYvxL*(gLCiUyYs6NT6s4yysK?W}iw#Zql5VVz3nf%NI9L*FDB$xz8QjV;m}lZ_HiMsx=i8 at SCaqlk`-+hR*fRTmWXCig>=CdycNPtJJVnfj(2tkqS(>rLJW2kV=x z(3L$GrhaFI!-6k(geVy-yU~ids-KEyab%mUGB((yezANz9xH{joZcm|Bbuys z6j;fm)IjxBu4k=>XBQcG0MHq4K7vPF0E?}B9GsKClIp94ma$jr#u3dcQmCQWR^G)D zc{%DIi7||mayGR{zlYbc6WP?#*h)HBrceDIZQf5{hV!r`eAk$0hzsY)b{f(Qsf*y*~XyJqjP1nOuJ#4!PAA+ zJFF7kcBVVj07A|>)+*ISFUjB4Rhp=#LXp+DBXt6j4Jqft`lUxjapF|4H5xz5T(Zkf zB^hbd5bJ99do(8e1ZS{2+0;b(peNSJ5F*B)Hz%>7{s_qBbI-6lGyNXPnGX#mO6Uc8RLRlxrbU8|J`U{(gJCT8tMHUUe7f1_ z#8~~guxzr4&H7z)-K#fNT0-hv)B-?7M=uV*hob-;x!Zw7xCa@!H?8tfY at yo5)(Ea9 zzjeAKF9R3$1AQy__ac!j7#e^-7UqNNm z-iX<@J&p2usK#Lys*_o(r2GRui~LMHbVuL#dMw;lF5qS8)wa_8*{$?oY^n>WeAG+Y&jEK*TS*jG&LXKLzaSFwq;t`a* zI5hYo(Y^rK#!t$+UjX at H!Aag0(WE at +L}YRF1()TcZ@$=1iQ?Z#R!8XbGh&PwIwL{P zvG;8N1hbyVME$4~*F?KQ!W-BK$geA2vs4X~qLGTu#Vq;q1l5?+aN`C at TI7$C^h6Um z$>3LrMK+1 at HO4%hd(cU~iGr(GuV4#}_j7V6t1k#tw88R72iM4FmWf}tLt~RePy%~| z{Wj1%^HLy1CU5o at d9{vM_9699Yo*q&SoN#{t`{;E^!B#B$loOlc*)j~<>&q9|AucDoda7X%2%{!c2=`p>43f4=?mE~<{g zUu`dWosQxfWg30pDCK%p!y74*5iluPLOC|{aC at _k?BxCnn+BeZQ-+(R$;JqBX9mkj=M>l4%j3r#1`x+?3~`+0Tf1s-(4^Q at -q~(skQSr{GzlJ7 z_z9Rc$suwzAb)-p-FJ^n96X1>N+5!`Jf^kA%P9yp73zg2GN>~+V||@y*g12m6WNW_ zuqwaFhP=BadRdHTSGFDLm3S33q2W!4*}O&d{97zAjg-xR{^U+#HfcOkzuuCzI88vf zF%}BUAjyFEAcD6(2cR>+grr-)3?W_HZj>Ck2djXa4(lO>q4Le8Vlcc`8?}ewpv}wK zG2yz+jg;DX^KGhen6F+(y~xzET04v4*R`a3o|~ zm8(UtQvNZpn!hu6y~gfVk~nQU<$ih;h`3%`8Bg2sKKHTKTdh2FHOVPLesTqbuzNS; zh3zjKNZ8=!uTrtG<#T%_KFKxo`g?rwL at gexS&=ly&jmA!A5w^jX4Wwu5MeAIY+`L6 zSFtZ!V|T{DCW9&CHW5mr&{9d%OIz!0%lA}&@>iNZa=-iyvRg); zRXKkk8wv#kr1&3&>^~c{|3K=Ro24xsh#Hd8T!n3W6YyV* z6oMJKr#R14ZX6k34c6n7$!0BM0}*=-^-GN^M8i>b2cri*Xtwt$C0+-^Z<6tMY+1TI zDRcz5&bn2?tOlhWVpC-2__obbsu7*Va>!E=8i%GU-NG6pA5YVUyqxVCf4+9}X33nx zRwxNTJ+p=t#FVE>hUS`=D5YNYDaBmdDsIk9&SRs6>=tr at lEu1r@KtY*ah7h#=^>=u z_7iDIs;i5nO0a$VYA==wXT*!pR8y;c6~~xNF at Pey;Ifq*#Vk%RUIx_`8SEh5#j|0h zL<;j#jQ>39S1;+JLLI|P&KJUo^zwNq>!2%<&ojYBv!b at ikF`)mYafCH)g8prL2Rf(-IRt*BQ?8?p6MkzsbADA!X$^@ zitL at hBO>`zPS}=H$T_)gPlLS9mYZVYqkIDgNs|&DE`T~;#&KV-3)Bud%(Kt9?3Ukc z3P6Ux6yNr~{mgLkAodqPAL(CsAh=MdAvub;Z0GmCPlSRU)l#v=b?i|YEREwy77rb5 zw3)s+nvfGI5bexUs2YwxV(M}cg4n;u2em2HQQ`~}N(IFnV3Y`kqW3ifCMZ-J{-jWpOSf-09>kiYZOEDBbd-`_ zWKc8MQ*6NjZH3b-%Qoi7HMRrEck;kYG}R%>RG^paC+aAe3ta at MHI;Z|J at 24#;K#yw zZUpD<-|obaV{LEeg8>1>1ODB`-2W37{xPMi?)^vKqkh4Gv1?&?t`&qwMxt7fbxG^w zQ-YPPqFNMc3U1J6T55Kz#dJ0b?(7ui=KEU^%&E-$f;Y$AZ>S$pC{)n-t&u5cFz99_hE;wd<326Kb=x6Y>N zY^qIWCzZ?-?mF6K>8-qj2-~Vdsurz=7r9 zIE8a;Qlm#=s^=&@G*+zbbIqh}Le|!8a3v1$;FjLPF4!!u?RrVNp#?6cu5oyA7Oi1( ziCiYb+Y8<0_DU;lflCpdNb9o8O7dGgCdx+1D5Ed(bbi=cBy at F+eeJ4`l!FFFi7`tV z>>C8b7~62jV|AF8SsoQ3xD)!N&b1m~ZOEvcpq178In`Z7EGc;{6zN?FJ=%tak7g`=sWXFGVV z>Bo at MVoy7x!bzoP(k-fkVwp)h*IQuuRbghkfh1(B*!-}>C|S!$deSyq%Bm}o8(P^` zvIp^6F0P=2UkHe21P51OZA<@l8cF_`Wv{JuX?0DA`i$+yRBnjyh8ndk2iKUMuwjq2 zY7BQ}q}=b0y*>Db&7UmM>L at XowOJx~)A8_nZ1t>P at RheG@jf)GUhiUR9fp%E6*T%& zE!4X-Tt{s*_e;PFRm6O_*s0J&GN%p%%PzNu at wB~7w~-IuMNE2GKl93zlJ9hU)vZ0J z`YcP8jEg={A|97#o(Z(Thk%$g6didy{UvZX?SYqTz6t|o^C$BrZrNqqk{svMQaO}A z6`%gNfY-jhU>pXP4)dK)cdS@J_*F#UY^nBbBxtImETRf1;PaotPA?j8kkUj6VCkX|K7iFl zy;XZ2;(d6NzX*3T$Z at SK@>7tqVkza#;j-M;V67+JKd}?8DyRf>6u#QaKBL%bB9ai at l4{nC|mAzc}6193MfjbpY(X# zB3Ro9R0v8{>w(OHyOrUnltof>!BpuZONyi1CSDX+B{qvOI2?Am?Y9_h35nrz7MgE` z(I@)kFcZS*+(IE1l;n5H#bj%*)b4(e#pr<9D-uc at k$ z=1`xi;hREZ9zG`)aiL0 at gq4u9F}eM%m1KB(gY`q)owk)6Re?;!yj%mli-OfpXM4{r zUwy0TqoDcMJdPTD*KIOU=9Ik_PwJj_mr;7a)wMLYYp8m*XRS>;PU=-Sydh4Aj+)NU zr=?KiH0LI?8J3rVV!Vv4qU-fk{#vGN=|FYf at q%}Sr*h^|^Vw8+ at l0ZB z`md$;hVDbCIWJ5C3>p?d)sn}q>ILqOV+$TO&0xDkO6;hV?tZY}axR$hHhfi6?A`t# z{&M|yF*GfRgJfz~(z+s&kh$6WJOv5ebU#CgU at TNKC|^MJC`Smr at Y)0C^m4W=-dbJC zG+ig|?0flF>L8=>5*6zmOcke1+ zh3afDY#UT4k`YPpe#BBgfBqg&LfjB0eL~E{D(r;9u2Z@|48%)IJM6@%IV-*(5;)u_ zOila}!k>IDg;jb%&O`iFL403`Bt8o9gtYZh`F at n(gk~(vQ!}3RdzMlDQE?pdhbZq% zuP~KsMS`z|w?!gpiR3(O#5Sc=6lt}R)H{*^?4)bt#FU?8AOkbl<}{a++Qw&J8Ts1Rb+xb?J1jQy}R z{P?gC7y}X$On{&uBV_-E30^96CjMH+^r+`G=sRV-Ib7sE5%;W%#)68TUakEM1CYEU zrXjHZ12RoCVPjUf at PrJM!+e?UK zp~E=tX((9IU=v&0gJA^yC6RZJQh8YOCy66N$68fkxQ+mXk at o;+zU*W5~AOnO5L^lk3%7TIx}rJ&e+vQwsZCGYXwt at Bh||F(gzQ`fH7A z4CMd17xRy}rs`y9=WO|ZJc5eVcK#GIh at UM@?nk_N#AV+>s4cvqRwfY8tbkt<1hIW7 z6Q4c!*dOY;Nmlp5nOx?`fPTtJS%`bc2eZG(cA%0`C zPPrs8vgrzIM at C0#p*dq8*XIfKi+CO`XiP~P#;TYC at Xcdu+}iz`KBG?T zm?zTYl%A7p1vx-r_}KQF4Fog!#$)5L$uz9~?uO4o!WQ?nggQ$@6Svn~sfa|}q7!$` zUTmZ(M57#k=y)o&VJ7#>Sj|GvbH3I3(N zWKWvZ#6BKfOtb|iMkla}tAV)5YGjc|G#a~OJ07jyG!Z5nxTheu2>%SbX178#X-2M; zR5%6ExG5IXc!5n+fW)l}^8 at Ip_y#=zrHpMzAf*5HD}OQHdrs^Y$Ft}EA?=-`d+D}q z(X80EZQHhO+csBLl3#4wwv!dE*tTukdEdsl at 9ceFdu^Y4TeWIc^;cD^>T}c>qxab- z%0p~iA0c5jGR_dB6{sdf;u_orER#561XBba1)uymop5KiX7Z%If<=(AS(Ef>R^EHt zsoju>ce7BQae;iEaRXGKET>lO3is})}=1nK+V6hiA9gZ%Y>yZZ4T+XDRCnE5AdnH((#4a@`^ zV(@{32WGMRL$|F3Hb+qOPe|JhXfwd6sAa~THwy+~Cx0M}$Ag^I3jyCCr}iC0FkA^h zDgc1c%&esCgM^sT0?3 zm6I>3H?hb;UL?HbPf7zr7FN69s;du=#4GyxQ&#E~KMliVic)@yW2pRSy{T?t9dMgT zUKdh$5+qNB_0ydV__wx*E}LEn;_P=67M8SZ zYk~~{jDn^CB-fl91IgLgVbeg3E$g#n<;g=QvZO4g5CyHOQ}vU)PX}9Cnx$oCv}p-R zEf?Mj#?|z;e(NqmEIYTmwyPWX-Yp)se!DQI%L- at i^nWaOJ@@oDTnFR^Y`tE`27u=w znGmrW2}&>rgJEh$Rbws~h1MYsn=+HiSu?2<(~(GIM1{eRuZa-JH!@G2I+`V<9_|)=67cco1qB~?LxoI8zT=@*wVh#7-w9UsGQMOgxr&s$Na;Y at UV zrXzVb#Hs5=`lT*&O#OK(k}DQ=sic^Egw>W$JvPg{Txl2jQG>TsXGu|dWe;Z-|0WXL z!!bYINX>0K9C1AFr{1!DA>&jWp*gug#9}kPVF23}#D2*-Nzh!kl&ge43xQ<@;2UX} z!7a}X8inUM){gOO{l;6V{0xtK-JbZF3(+3X?lUf zZFk(+U!Qpl?hI`?XsQbxgFSYSUfMI$6ityn05l3z8UG zO=Dclm)wwGE}d at 47hebXl%=(_0ECLI-yH4L$=Z-KGShH1F&Z7Y at S4?UpHJ|_T#~A} zGp+uj2gz20Sp?-Y>(x0d&##f?&#YUsm8v~UC|V_kmbKP)yKGv#!fkb7SFm$B$)xgU z!Qz&b95>ZAs$d1QTWkHsGmD#ZtDE>esRTbe_x;>OHmkGW*Y at c)t7X3$ zvczuK21ABSOhYTk^fuoSa23zIkN@5(Mim|6yCMgv8%siKo0vW+bbs5G z=bnOnvZtrRCv!-cqc^5MPWBMy;j{V9#pdc3wdkE9uDigo<*GAeLERGF&xX2Wl6AppnUZ z&?*&=%OjLlwWYTJpTF$b>?K~2_+qL{#UJUkNLyE(d6fGHqG~NRPBk!;@{S9vt53-* zCe{kGN(|?VQPkym;F at V5?Km1asNxJ4RL(?F{5dhB?T%1PQkJ2o>aeqQ2%KX71yoSh zOU|#yQJB-cDPP;NE6|qO0q{WP2e=a=#tGNHy%!BLQ*Abp>wo_8!+KvjK?5B!tb at 5- zQKCIOJ#>D<47IM^x^v zIVE-sQ_d~o=_(sE8Y39=PFwHv)Gv(P4^C9%Oeln4kU@*e+=Z25-;+A=JtJXe~>LpW? zaSSXN9{^dB27t^d_dPdK{>6%~-ZiX`PdC;~)=d>Hls!36u`0*Q9vN=^fJ#5PJ(4=W$VLY^JVs3KJ==n++9mtl zewM;im7L8KJX~jw+v+W3>6wXCaSPmaAT|vr?pTg7jV*A+vgaC(fA;X_pq>0p_4;*V zf(DLva?=7U at fflHo)(h9 at slj&XX@!AO{aFP at -yxIGn;je*?~TTBZ126R^?0yv?T(@ zO!s-AoVQW3DxT#n|+2r4o=U=-*@`vX6=1z z?#WUf(T4t_*-(8iP;BIkKXcK6w$wlwwSYz}iXap_5=SY3YT0!A0Xe5kc!S(fus=3R zYW6|Tyerw+qezHpj+qV`nIfQ9?Qhf(&}&TWgv$M;%U63Ijuo$>E5w~_m_lZ)P?eS9 zTSrM8)Q1kBd;>A*Z-_kedsp!FEq77}o at t~zMcDnLn_uAO_ghV`JgRzojt}2JY(L^P z?)1pVb1jegIs*mf$9yn{4WMZg2y%I_ at RU;Buu#r~1ms#&4%?laNc`5f^B8#rX> zmklE6HHsaa(s at bzc&1;#oR?JzJ>}HV_LQVrcziG5FwDHH*$1KIB&!_?^4DLa61v0d zGNGrc3V3?AsU8v3>jRXZ{G`7k8?G_9+A0+VU-+N#cy~am?+e8`b%qd4Mk?%6+mQJ8 z)fY#Yf;6;szVuAHrdsuf-f5Mg9^ReN-+7W!&1f}sMpfg4HX?YaniDwry`RUv|C^45 z?XR at O*ns?(?O!EN at Lwg5-v4k${lB|6d;3s(OE;cKASGip{`8%LsmksoO?2 z5MiU(i3~`?)eDgn?d`krSV6QlPP(H%8d&XV_%iap7e;xs7Pp|o+U=NKZLmD&xExPS ze!P8tLi}W_8bbW at h-puV^kQW at 67Y&Q&g`Ik|(VFz2~-fuJs&8F)1 zvAbqh%Uav*``|hC8tMyu^{RR|$1g1Y7{b=aGd+Wcp^;1ov%}d2xbw_O5=z zHMO!BILUEJdGP2jRpa&AuCK{eKxE}h zzN=yqu5&3n2ywK_^5X4Q#iTcmAv#;bLy=fQk>EAZ&b_P*Rx)W$;D-MK}(Wht~M2B88cp1^8ba zz23B}(`k(HF@}Q!b{j@@Z at zdaCSl;?WB?5d)~1J1*og_oEZ8Bo*>S}^IHRr`(D)>? zO0yC?Qil%jbq`#?q3QKL0Taa#vR at 6-o7d?v)SD2y_!i<26L1i=Z_E=)u<9s$e71A| zm`ts2|BM1`0N^&h&PaBSTL^unsEYShfk{liGd<`&?MI)Uib=~k?G`_d!?{5btanDr z8~AS2h2-D-C+$XO5q;66(iDDV-j(YVgZy at Qc_&+&6Z*-3JE{C2%B z6_;?B?R)~R0k|VAYs1QzG6dTh?SjhU%nJM~%-hJu;@kg%Im}-fy1 at Sp%>T(5Zv0|03=EY1jW{S$P>iC$G~uO@&T8O`CC>XM~}+FM?Oh2Nvn! zo2!k%DR)ogP=!+jKzofpwHW|^AM%8v6hgZ=-L>SFxq8XUob`F~8}waXoS|k0Qv at Me ziqaGCqoIirDyU8Reg=WR#*_1m8-|kU7jItxqlj-^B)Q18Fa6 zd9 at TOmpiec@A2{voA&gQsc!YSIl|Y5)zX$)&`_yr%zedGRu>ZJb{kx@~tb at IUoRQ=Is@#+QKFbvFJvmx$vzC;g z7;}giktmow0WQFPNC^=@CrywXtlL^Ux&pRnpjOH0Zi2R&|;!% zx1d4@)sl32bneF;TaP!lxeV~}_{LjHcDqd7tXXE?vGB+LDU6CAm>grA*=?{9hevkB9Asn*Hd at 5oZQ?2IyF)oy z8H{^VL`d#Bi1xPhAbSRhRo~8pZ4-@!CxC3kk{oZ;tx{mA$+8Y(8{xc-xWkx3S-v9 z3=z{U^kLeiBFfU4<1xn{nDD&>KCK<`#U-Ja7?@)uCkHISZ4^C!ue=g<)QMc^Fm>QH zE?QqgG+>NG_eYXAJ~HSI+HFYnF1FpmUd^$Epdr(AZVv~Iyd#>?iouX3lYsk!{3|*q zQMt58V1R%oaR1{)+W$K`|AEae4J%i*MYJ#ZEyw!=oL at hFAte*4B%~s$3bW=L{>%$R zTrgx^I6dl;xf{XR!x3z%*1puWs1RS%Zcc`u`6UgcBy%okV?$BhqF33k?dI10*3oYr zAlc(`HR)xd9<*p)z2UQk^|ZD9*Y>`#yybHx26Vjdfo3^aN^^tdyVQFOe6xEG-mUl} zHtS(G^3JK%cZ1~kip|jgjM}Lu%d6L8>@!gXVeFCb?w0KJo~V6)SDN?Ntu${$SMm#U zH!*<$+l?mK*$vyP=SD9I8Yhmz*rq{hXb%yA!su|fv at eQJvDkJ(A3v^ti>{Qv`bT3CCd z5YccOl9AlC@|?=WiYfyiKLe2Kmv%*sIjvR1Xj8&4%E$Ly3>S{Z*ZJ6~Tnhf>>3@>$>%SkB2bpY-w`L4%j^Qml5ZgwI+=(b|jh{X-1 zc#^|Qz*11_s3qn8D0fOL1e$ptZ*v$=*U8Zwv!YhoZ;UJ|`Lq^U&JrVWGi5XXi4>7{ zQXNZ#^OZVXjOW}Z*uSdrd{MTNa9g2IgVNl+IcRGMPR1$DyAx&QH56kZO^6fNf1-ab zWw4c)Px(pYR?)QxDjUd`Sn)XFtuqapm0shR#vW_NxqsY9gI&xJfhmmr?nx~r@%lTv zbrmIcebh~fCb=Pf$mK4UR=MLOtYL&WaFr{P&x%K?hpc@`_iSR}!YYei0UVXXBs|-7 z3f4kUcm2Zj7r-0);5S8bcsWzo;ri*zE$or1(H~u9P7bxvD%Xb2@$$}OQmM6w0hLVB zR%vDj92!Gv=g8`+6Qc*>@~ah1 at 7A|TF#}3#9Vu|`>=OkFl3SzSPIH)KBk9Q%Sgkpi zdLmS48YEV+V%3O;Q*>g*(aKMBaGd*Ha z8opfIcV5(o^f56oeVY(&u#*bzZ)Oa(CL2XG#qXP;uPHh$WbE1Bn at R2;-3r at jx5x2P z9iAD-8ZW#iDxT2=!y~&9wTXP8-cTDy2J2jZM?_=Rs-M$TE`aOQZU_*+n6We<-b{^m zvz99Fq#hJ<=oe3az(`&Zkb}ZdIJZ1yttBpCqLI=LeK!k#X5;iyPsWfe$*ZWdmhq?B zQ?=M~Z!YECQ&&!}k1nRMmAj>#_Z*OZT;)&+=BUwsbt7BtXgR&Lh*>Azrt~m4vbr4zSShgU9F+7p+0*YT(1Av{s_Cf#et?2 ziKf*=Y!m$ajhLJCS{YD#0HKgxCFiR at k&e_o{*trm3R*zriE2i%!v%XyH03q(=NPs- zkg(HIoK1UX)S!6^tEx`|h|SrxW=cn=aG8GLjX_8dT}HQTvmM3(%y#IW&pJ at 4EtdQ~=j$Murkyq2u4dT$_Zl(gal4e#e;3o|@`^=Ya z<>6Yfw_SA08*_|z-K<(?qytq~&8e1W5K0+m;Mn9Og%Rk}AIqGdUV at oQ`2#f;a2M+2 z3p^0b`)74fU8wd2(3!Ktn_4DkO)!TwbZcqjT)%~JT-c(MJEBVr2SFcciby)n*PTxS9yS*zn z%kG!ntfQeOutR&6IP0z#DzRsz0id?cYPOMV7rQb}AS^rLwEgaP7HL4lu>J5EJmNhY zpg24sGK)}gq`0~61#k3>@V;EkTD7L71Osf=W8Mub?!eP z!p{)-9$5JvVEGN$>Y3e*>lDD*ka+{n=_p_dYm;ZL^7_Z>D>+a_qhg>`nv%@rj#0k(2oSYnH)G)-A;o?-;0X=)m(2m)q{lR}c z8s13ZI0ZV at WxieB3XQXilNQTC^-dR35I%QoLO(7XR!P2Yl7<`ifY!sWH`+^aRl}QE#JC166U^EzgO{7 z3WO8k(Dy6H{3}rJH5PU`*J_MM^H)!uM32m3z+&E!aSn7eYlEDK)%;~eeVJaf6{Vfn zDy~sBD)iXBz2K4z358-U at f?mTNds>gaf22;I}hi(w!WAhjFPmsdU*&sR5b1c;E1*a z`-UScsAs+*fYI)IG;^rO)99sDd_hun&K$vmPL*>^vLl(=Fv0j-FDWrBOHXG5{K^nT zwzn+ufM_g9NDIGh;7`L2<`l|_jZ^(XbK8Y+#iWLmxn9Hd0?&QpVuQH1 at C`BvuO?-u zCi%zOT1b?dESV at 96p39@yyn%K=FkJSnJcbx`qUDb!H-X${9 at k$_Q at E^t=1B1(Py)9i3^doKH77P) z?-_TNiaR)0XgNZyp(iq-9)U;O=xiLHtyMS{T_`$oEy01Tvk__7D;GQT308pdu?#q% zgtElA>sUbR&T(j0zXEM9S9CXtSv?dpPqhjE7@?zM(xh~HWhJ|slXBDQ9yqc!=5)IJ zNyJ at Bm7Kd%d}&JsyOLog75tIov3gUpo)6BSq at E*JMZO1ULsIJ#j>ha$MiOp>WcfpE ziNaGSE$S2!mTyqx%22TfwtXsSr at 7-!rd_ehoaZwusKkIhqX_}+jpRtfe^ekK8jkGe z(>1_UN~I~IJASZo!;HiC?$Whadw(C)*NBkp_T}B~q at F@9zuAW8?*u_Jk*!I4HOGkV zqShDpSf_`xT@&qaZ00D4wOM26>0;PqgL&!2$p7Ot+cOhp-ws3ELkZC@=aXCY at j~*0 z&V)S%>+WrbwKU!S#T4rK>e*C?i)mj@=B9+~YS8u;$mceQw%n&qk~b>Z7+24jVJUo= zRTDd($lWGvlQs*aqRrqy+!eo=2Wj%x<&t5?eec%P=hO+jKlk`^cIOOt);H?52sMz| z2e}Vuihy8fWzRRzzh>Q$-$EGWf0Lp>{HJ{G|Jy0~S7A!h-*w!>-ykp{m(Y-5#Gbna zEoz$Ma>bH at kWf-V;cBwJIxUIJZP{!cjW5N%GZ+pCLly!_w-YVGm-Hn!&hAqOS=%4S zS&jGS&(8!v5thdC> zGrHwa>?ALcg2&tIlI zC?UHa;PSK_k7Rs)?1Xhh$g|V$FAKpbt51_R(#$Fcxdfd$Scz(q5Sg=G%CV8Rj;|sD8ji zF^LeRAHL;CJX(d at qec;J*O$c@{$nLC$A^ z`H%3gYGr38Yh`EU`d>2`q7~&7fSC~e)J%T}2y%Hp{)E`{L=!F$MS%+!Uy5^VV4c*S zvzxTXxUKcNfp{s5Y7`u3qhz<@zCW7m^z!@m^aFAH^*b~pR1c64KiyiN-O2cXvx!9D zV&H=E#?c>-TJs8bYMDbid5)F9UF>HRExE6WeGEaJ at GRbbWaJMn(q1auuZJxI$V1CI z;<^+^JQ&apZq}edj?AZSTk<=^XW1x;3C14B;SoI$q0 at lJr+rjzPlJ3tNMZ{QMX427zNIrQ-JZt4Lg*Qh z2sE)TB&ZgQVCOPGezm)1iN at SjnfXj6TgB$)V4cC7oF_)W!rF{XX$KnNfsJuAz>1CW zB~enV86mUS;NidH|exQTRz`#w8Gs^r at gMW?N)qwdLK-x1um-);fjP$loi!5TQ!D?Krr-gWvECy*L zCA-2%4R-n9c_ys_kOT}uVTpXQ8e8}3hH-dxTRtz7JV$$2x}9m$@<$tty_7~pD8+2W z<}EYXP3uv*kph)mklVq{-OYE5jj`w64o#iA>Ik?r&RIk=@XFkD0k)>OtU z9tB*DKSfoLB!4{S;|Uy-!~!d0ANfjT{=wTgBx1&bxO2GRK2B9%47pJuj2>iz^Nf!7+VE7BSdfH^1E? zw>b5v@?l`6G_O{PU!+Ium+jAzJc$-0fiS+(I-g&Z5BuDC>Ku-VA3n6USb1u_&M>X% z>4_)uisancjsoOJb)}I|C?R-Fv<`)j7zqNzSMV8L`*fHE%(SeQCw+VkLe-w7fdIa3 z$Ak0eg#%PS{*6WnmO={{lEQUKy#DV9YerG7TD0$KLYlql3Tw#bJ?jDNBvTSHEwxn5 zvLeSidSDXF;`k6h*bu9bT*;Uyd!jB1NtL=tS5F7*0n2zyxMvY2?4i6+WA|8c#Kb&t zDu6D7mAOGgdrKakX$4_80-Rkkbh`JG7GSaDS9SD$eg?tkzlFy>MvnB*zd|D>_K+=Bex at I1oDt-gkYt1oF$Le-~{}*swa561(+Ic^34yUGL-AS+6iGH&5 z85_XW$UT&(5#Jvf_BBCuPfm9gBYyZ9qyaWrI2VG4H{pnf$^0R(iitM$qi!#yzYZ5N z)sRfpzRFBc^VJCzs(2I5pOjY%iA*bATT~2yPuATT*_WsS*c3jEBXHr^skrFg6hQ5! z&uOfJ=v1e%U!b{Y$WSusYQArS131VET z-3zn9q6TjnoJrM`vjB|3FJOu at j7e-FL(S({Y|2GzjCP90Y}sk4>kcD at cvo)SFHtQ) zqptCH6&kmAlbW%tDf^#sxfuo4aGCC7v*!$xvpWzK>_NY>zR+u zRq)0$u+Bo1^IJ+Q%*|~+BVV+BzAIbmPvqmo1Qp}v7^NGXt_k4x3pOIc!eo!@QZo6f z7v!_{za(4F*%>|M4p235;kgPFpL!dg6m(F_IbbI);lDYbPM&PCJ>y;A1fqIdUA7ES znOaRQg3L%j2ERK6705a-rW9no*0$Ve9Ysy**2Aetl?ZvkY6d_DVHPar8AU192yrk; zW3 at uYl6UjkbL?HucrWiUHEi~Cnqi?!K*3miK`6scs-jORIbo~f${NnS;mHu1#S_KV zpYY?8sya(8fZ`)(5ZfkY$(QjK9M_AnP?GXl1or$Zwn4T`u$%w-^_zqIr|$A<_9p)z z2mc0e2RBzSPZKl8|EB&``Ug!oUz=P4Nqkr+4TcPdx<7PG%}@qaaw{ag9ctEqw~Z{J&q_V0QT2Gc9+>`q4#Fch!Dg0`UNk zw~sZ+ic^m_vy~3#f(~c|4wBe7Q$*v87Ad+V#^v at c+qp20EhqygcqPM&+rc6vpbwhPjGvBfANGBT{PhE^L zPuJ}ALEK&Z0;Ui at aujv*)WGBxC`W1P!;- z($Ia!&tHaFT&8R5SKEA3XuBc?Z-Qi03R9ZOQlkmmANY;lQ#J-yP# z_v5R!2u3z~@eCx_?o6s$r8BTvMO0f&LN!nH=_G2pk(O at HusNkZ+m-G8*xa)#ZQkXH z8I7bI;_*?xicPwkmoS$qmV$NN2epEb0lUi`UEj+Uio;r>EntXhVv2$}4Ekx-i!hpDaex7E zS3u+{;X3al%r11)3LYRq7ygyyj|jE7&bmRJFuYZH5NPd$cTMSo;99~p`c z>-e+Bw}H^8!xf3LnawYB(I&B#S;L7SIYo6|_|uY|l-dJXsqc0xc)26&h;cjd1{c4z zJa^`uHO(vz4h#Kfz`w$IwpAHV0}cqtgBS=%@_(dK{{LTIW>C||QFRgTOTMAQ!^5Rf ziZEPv;8z%Of}k(*CaA4vauH$@C?fP(f^JI4r2Ps6LhhqdZnGE-`t2w2Ah4KCU|57U z*q{a)O}FAgg^C6Dd_YzVOLoaN*Yi}5CyWg=#Ky4!5x7QOGki{;J zK!sxmLC*l5f7GAagNtP^&1jy_Hkh7S$5sODCCj#91Oor_VeJhXgWBoO7 zwYt+9daPQpN<8IpeTplw(U7v58%$!kXc-wBU4m?Sy(BHKSMh3s{2+>)xv^K#U=>la zskf01DcOu7yPcG!R~a>SL`bE1i3wAAwYjQ5lje!@dy*@4c3fGFDrLKB9w$!GPoMb5 zw+|B_hZ0gEX&-HKHJ?^D>=>j*_Mo#1&!T2?-sYDK;$2Nid!)24fkp+p_JN#SGzJs9 zp*}KmnKR9vpA<&q^Rr10`Tc~a9+Q*4F+A!zO4|5FPIfLgjt{q52;%W34awEkDRAB= zU*Y+d51zPgmIQUcBr%StRJin6NMojL;&>QuT z3PgpaVNXwK$|W!9~3o ze#EokKBOqpqASS3HMeFm1;(!~N-IQ_s-)X{kA`!`xTOK~;b&%e+O;m|8VD3+v^KQz z=9#dhyNU!L#0(F^Ikj^Se0+y3Rr4-JwwYLLLu8Sv)}6GPX?#dfZJ0(+XNnH2qlYQo z&Y at m&hS8l>VyAz2lQyYtB*78_<1XLY3T~xwZg~-8z3}bL$VtI6pN21kOFdYOPm_O*r&X zFg+FB^oWtP$&`w3&Vfy0=;vk1`LMTUZppXiZrQhHZ!qw#_xRY+C0KvP+&e`Ay12K7 z4cvTx`eE}g+#;!u5D?r?d`kCo^Z((;%iZI{d%sQZ9hG3LjG1=&iPfEZ8PU75wT|j_ z$KWd4?;0os(Yi>MXfB*jihLU!!*HA28w=ma<*KRhm>iE@((>u)x#5JI)EiiK_15)cG=FlM%0BTqM9+p^W9k^)sThQrAmj zEYD*r$Y2TlNEtLApZhJ!xhWnpK$%(kC90&(5W3riTkzgdk!b!RIZu6OX9B~3<4_qw zfwRTYiPUjd=fZ%KTui*^>f;`(h8&(wBURZ(YZHWWqD5Usw=lNVQ$#y{eB{@=h at Uz+ zIMdMW?Dzz`q*vexV^d|5HOuO?7d0d$2aJ(|Cnq;vGMx-fm)ruK3A&6Pnh<@q(6q^W zx=M|rxee%nFw3d&aw6{TbK<5$b7-pJt!V(a@=ze;`kDxk_ z)G_qMzY{8O#wAo9Pejym#o`*v-*Ah6Zy*CeBM3c-x59C^WJLRhAT at IwL#uPlt`1rfc8KOdwV z*k;0InGFUmXdm%G2ObzBx#!ww4TG!PNR6Ep9wzfWKZNS=EWr{@`x$U+D!1W>#eejA zG{1SYIs!6CisSXub?>To$M%N;!@>n~j)26Z at W6P8MzCf0D{PceLC%w<8DvrcK=Ib9w3tqoYH7D zAY&}Akvw|p+L1 at Q{u#P?4 at 1nZ_l0cgaZ6N&t9T^)qcJ+wfXYN9UtKLgaKsxi1qbRX z`H6h=QUocsT06Hyd;=vJT5*yb)kLd(`rsIiF2H6*9X7QSx2I|D<4k|9(9UCOuBjy% zHq`{|8ILp}SLi_Tyz1bMTGvQvv^}FR_gp}=tWF>rfK{(zPDZ20#3DD1H~o4FE8yJR zUn at IRRfX(|V{g8kSE?*tF3WHT2n}y3JpYuYu||l9b{YVesh7_ps)HwU9ztaf9VHuy zIyfpkw_AQ0%R5hU!?Y_b`*gqPz(bAQ9S!qaPRUCl>O0sC^Tb2S-5p1qHT~U&%&|ir zrMiE~x`+sPpvN}D=yy-O*FyiZ;{x}*Ey7YeXb6n(#}BsXJzW&vkj^uX{vA=|(8zn7 zMARqB^E~{6^V5niKDQSSSHlG4sxMJ=O)^-n>DJtOb)<5O+;_PBB@#=faYTyMC2~FJQf^qe0T1*vN zt?Q5BQUAJZTSf+VW?z at Ej$Ej7=MM1ko8}ccrxiBDxH61sIOK9eSb~ zS49ksHQVD(b*|%Sx?@*9g;!+yRMm at L%Z_HAWoT at RSNJ*D3(mvdb_RzUEj^!#T#bIo zgX1^zI&>13Cu%6ch%)-j9S%B|N|5QwZz zhIs=WF;mreaz8Fkes|~ya=7a3h;cQ7-IJbgE!3w(K1Cf6GXRF^7~PZR98*J6I7$UtjTcufbV&R%C6rXG`yD^Sn2=; ze?l}6aRmwI8XOV52b=$cN6TU;9GnS{WRVj^WPvj at y#^Q|62!HvtB*mVhCy-Px?U<8 zVj%Ub3vI<`B}TaY!oB3i0_%uJ5pW!K2OMNiQF$;98>;8Jx9NJj?8v8Y5x)||a|<5y zA_w@^fqkvT+S=Yh^NsAPdLY=*^NoGhJbZ#i*uwDlrGvhS#td>8qz^@ip4 z?JwQ<#dQ_^dNeeh2K~FLNWiev1pbGxehliA9Q%~1cfGAn(;c+FBXuK))-(3xk2zXG zwhpbW2Gj$()w1X-fo5+vyDqiMp38shPbu6G?q`GiRk%U_&qeIQwhksXe;t+F%-sH$ z*^rLQygK5SJnb-Hgxcc=_m;){dYKo zr`53E3BpP2S)C6pPfIak|4m%ud1J?RYlnqK;`i70u>nx(ZDtJZlIuxZW=NoqZ`FPM zABm7yIe!1$eSh#p*cRp&HN#HZ4);3hxG{_zNXv75J!stW)f!(!c8{VSyDLstm(C-t zlKX)NyDvOF>pw2<$%5tPUX#ZC_t-JC32P4<#+WPcr!{DA-L64Ete%9*+UhoFG1Fd z^C&RI?qCN;AwSw}XK6!F1z&N0N(M=%L!BhIrr0`F)H0Xd-p at T!o?6mTEALo;2_6?^ zO%vdj%*iyj)rp4p9ZZ6&l!V4N&#+9{zGm* zXLeHRH%>pR)dK$e`7(HfAAj`Ap-%~ zQ2nP}NI3_4D_4hqvMt40UcS1EZeLqIjh5om4V_UFmi32vk#?(wu~7$lDfP5k;5wT6 zKN<0(518hn_*fd~2!jV#Xo(Pe5ib{3;v|d1Twb(jPIR60c%Ht1sr*IOUBH- zTg!%go-AoG6>Qz?T}|bnmY~He(F1BYH9DWZ_kOmnQ%w&!Ql!`i^2Axs-{Sfu*6b2m z3V{7nbp9n39nOT9%UJ5o1 at sZj4(@c==jH)rEBAZ5aJRw!(=Aig{x at B}lx9(6J~q8@ zQ4Noz#-|6;y+TA=*#VPNQRkG5Du1xW6x*xlQWL(}l9w+{>Xu5L-`w~LMg6Cm#PWxt_HV)G at mJM_h zQmnE?kGogZyQZ=^m*N`U9#M_zxgBI#t7`Qk=FW|5(j2m?4N?)N*ITS|XY)G_yqMuv z&CwZJ^+c@!Ya{)|syYTz8s1VK#8|~0;`V^_G4aMB*;vUN|DXL^M?T*-h zi5y#y1doxgLpSVOh50C5@*&0)FO!{w5_hnVsd{*@b{eQl&^F7H!35AYQz4&jRw{yr z5-dHiX=<*yQxqC?(_BQ9gzDFrbzZ7(*&B!543c%tZduB(Zjnufbo5g#&KO0Lz3w+= zr0G#J|5~+Hb@!fg4-GHeMxlFbns2g9kfv}p_QGU(wa8BumsOBbKDU<~;4!v#vp?Hl zKIqC1E*pF?F(4o!ht~`zW<)Mt)Xi;|y|`_v8eiJiNCt at 3f?CdwJj}OxP=Za?-S4W? z;OOJZ1AGb=xQOXeqU0m1yEZrb35j)knpSpYL&7T1+(jD=8etHc^nqxC-q1{7{t zP{!-~213f_6`gAGL^TS-0}}R*S55~r$+!B}^*{Os1orVzdIpN`%o8!bjrTNOG*DXe zmHHPHwgY89aQ+|G-YU3qZA;U2rkR@>5}cHUi8 z=iI7ux*v9Tbc8|*g&q_k&HtZcNMnAZ{b_3aYHa)Kns6W$AcJ~6< zmSUJGWVhlNeeQZA5r>wfxYb)D5yM{pu-_s3+Z=ej_CyLwIyHfOXxeg-vef8QqSkOonjHsKXPkD8bF;mRGSVA=*tH{|KC zvT>fOoIU;}>b8g!*X~5r^I|bx%6ydSFKgyJQnMH9i6L{Z=r!|P8E4WTv~AXwfPBCZ-=p?JQB$()*>bQ;nNGPtIkZpkG%AZ38W0%3G!%eI>0eUM)my6t*{S zjXalT9HkzvTtmRxVwO=wFOk}cLu|)?(LzzZykeNU5=dc3ztJq--1G_48hw}EF98bc z$jm^D%r at sFi^*XUU04ch*Par=2UP{-3QPeuq&jS8NaymFO=2ZZ<~Ps^ooC48aR&B19AEA5G8s04a^2^01Q+(-);E48 zuo^N99&_}zrG))3d2-26eFD2T7&^KtL&ie$!#&Lvo`)elDty#XOV1ra(-=c{#2 at vt z<*p+{z1X at xN-Zn!xz(b{t<|MWY*&?nm4!Owa-h6#WoTOg0?t%F**3yW%CAP+K0`L7n`dzaeuc!!XxjktKmr4YDTTP;n<$OcT zrKKVBQso3fFuh}SZp+5%+Kuf+hV8{W%LjD2C-Q`#up`{+8ac}+6$(%Oc;P?Z_?*YEwegW za>*`STsDS#n%&fo<@c;?h`z?4QQl6ly&!8>|L+X+#$nb_- zNL}ygiVxpW}-8*HYe(vX%I%=CXvs?yP(9D=RT= z%Jgw#ltwxF2{YYFo#jF at XoN)0O;Kq%jPzRT#&+GQS!l7^?38QuBkyvX-WmtW+^v2N z19erg>hgt``WMmOw^tQtPT`%coYNs^&_RNx}!y|Fbyh$ejDjD(&?i1 zM<12(7tb&M*~nzvH-ZhRk#XvgaqN-thnQqc#ah2`*fa7SRs9j^tFD;T8=#g?Y{R|D z$T%WWk*v*4fx>U{!y`Am1^);t!+L|}%w(!9gMM6Ok_K&dPoGl~-Nj7WwC_mNg$k9Pk~^MCHJZBSDGly~ zVQoK)RxbIHz8w8>%!_sS6Zj)-vqAFHZo<<`=77Kt#otKe8xp2p9vLN{1j{MWRO!|M zs&Hx*HMKJhjWbeuO;<~5!B$c5AvJo9Ok=+!*$e zV$784$yB&eTj*bCdiIj}^h99D1H**S&WD?;!B`(zrdG=4JI^)CXA9gG8bPyO<(|V>YCIhjv$Fbn at LcDYZ_UiP< zWkWC*_Qcp;zvFacEk2QFRID1u`4gXA<%fW*J5zz7yeyp6&NR7Yp0z3LqJ!O^typOgQ}J&8-VrOX6D8e~ z`_~@n*x64)9IeiEO7C3MDHVVC7`ux31P}Vgf{t03x_Ok_Z8LXdmu$i3`L!N3+_=xM3u2IPn); zNyaQh9U1P9Ug(S3Kv($fHF@{%5jcfGwHf?pjNZg(*|0#%ikVlENe8{)$5165)X9r_#yQs8Xq5e|Z3&%M&FlpOz76YE|Y?t7qeH z+w@{9t#mR!qEqsUQ`^JIrcuFk7vB%t!|2A*0N&GAu;&v3L4Kc)D(=x6-pyC+^~2pU zZUHZj57ws9pSdo+QDrDZm7A~bKbyoKNifH!#xg9N~)OzFZCINSt4<6dew|QdLZ8ioJwn64!>ho7mH>D`=gy8RCfn>7 zeq3UdKeR(VI?=TK5^*`Q#&t~PkAgh~Z^xbW!$xmp*AR at n6XM+OAOMu@cIKu`T!q at D z&OYQtSs->ae<}3t#%J-QBRfNGEit?4_t{ZbAxzT-gq{F*Y>ow zB2rBRu-JucrN#K#M^nVRgJ+n=jH(tPJ;X|BT7uOtQ4Qdjz~H>rj#EiQE5)c6fnAAH zyJMT3ne$u84horcK5$#mRG^}4 at s%(RvbU%0tPQ`FOb@!eyDp!Yv(yY=I_2K0<%<{+ z_7+3AvYOXvrt_Wuq?-(2ZZ^X0r)Je0G&mFB}!zV2FIm*M4#KN>u^xFYim zznn;p30^p48m88ThTRB%sg4XD&wyXd5DA|Zn=7AsWmElSNZ*=kcYp1a0p+qce at qC8 z07eQLTxBAG5t^lhbb>nYUAUY$R4gBVfWCbhVOW_L?XU3djH{KY^M1)(QOyqrwu6O6 z=TvYu8|4RFIF(kZx?%!`^~>mxX-*q2zb at a4=a z#*y<8-iIXBOj({U_9GBQ;JDPAvFfLqS|T)Ll}EmKLv}Ho>F=^GyuH=snDme3rpPtNv7%F^+R3o9r6w^J z7R0q%lhW*p%^xff>28) zEOZ!-v5nO;de>bqLTI-a1u^?qff`Y#4QqYYk=XI5topp>-8ANW?o-_t35gboiJWIR zMA;9>2R*`HgY{9=m04bH9J3mY?7vi53Ts_O=&tsBu#_5?#?cqTpvB?DM%1Pz_%n=# zu(=FO=YENdwP(?hW3yRRvmmgG1 at f9it(_kxcd-( zo{p#<2YEkX<0mF?Cp-srtfP;0r$?2cail^}@$}@PGUlOcyurXcOkSJNw)KV?c%1WX zl>3nGGzJ%Kx at 3jvEl@4tZMfoxZhCl&?rOG`A#N+{9}U(&jK(xc0a&_aM at HfqV?=ts z!Y#WcN6>uLrXy|ShfI3jp$t7?3_Ym~J-Hk^Lcec@=nfem{%mU+ZiR at An7CdgyV?k@ z;Jg?m-!XCEzAWaB)^B?vrDKmeh24Sh#MGI at I|bYOK|#hy{1qi`oASjCrg%7gD8&g1 zy at 4Hb#_r#wYpm6BS}n>x*-__Hrs7XLdFi%ZJqzN<@>&1EC5b3{)*ybLgO0Jt>GKr# zi(OEghKc#*NHs-DZ_pCY#Qw}YOCO$WAx7;y*rD~YbGik><=sHupak!3=FW3|$2O1C#Zr8^F zXwG#sm9TY at +`YqBicDv6+~C+bK%Ws3k2GKcH=y$uO^C8{)zGR&D_#TI3hjW;2sJ+- zsL{sRC)FqIF*{dUv59KeGX=%0;f#xH at uZir+~@wRVG%imF7>!B!8l+VMHFk&)F1)p zj^&608NnO}y{)6kp0C0diZvrGupM_Pl+uNdX=+a8(7y&4byoho5rykr>S-wj?#&t$ zoHL$qo#5<)?rS0h=Bqu*ROY{%OPSDM$PnhdQWwYvU9t+28nugJWiDYcaGJ~_ zs~0ABeBhQ(=ukCy)DUfhefPg1mTQ$vmOO-seVOc8BV#R3Wj!Dh-Bfs>ES$#;q>zKl zgi4K-CUfGpW}GWa%q83MBELiYS9uW3u2>BJC65#c5D@;q$Bh0 at I@kZG!~gGI>$$3S z|G_BsPg9S}gIrQ>D5SDZ?FG>g6-BGkj80PhR18)U#2?*Y(7hSkPJL}+`^KDg<`IzM zg(&_lQPh%Tek0q5(27o#?pLz1=s?UTMARner+7~)*{np z_-`JRjK$j at gWZ5|xcAm$Qyo5A?@Kt+7I>RY7W_%O41qsqj=XFJ6-^Rwe#(pYxZein z!bzhXRyZW%(Yyysp&ExIT$r#XYbQUWOu)ZUW_M&=wM+p{+41ZbnvXlodC?H2^}4Qp zZ^2J at TH0~@iZy%6HH(gY{%Ri5L#lE1YunC-zmYnkaxcz8#*YZ5eAM#7RI%*K^oHhQPiL#GCABiBlc zku>?>Ur7|AuydgHqx79prL7D)-{pVd9~4w0Bl{kLR8Kr z<*S}|=ajS!n?bxi+h7=rzv}a`7 at jCib|MR0QhA+5Dopmq5%CjSm!bwaE7c00GLr$# zqaOyf>x^3VnnZm~4TOQk|8{c;SOa6X$yHO zIn-PD;!=b48_?S(nBbYd at Z$KDE-aO(upuBJ{Wf2WFLZ_*+FtPrIOmf~-0G7vOWwBV z6${95Z)Dq1&)ey5PvSmW*1`dAOdCT1K49bDVg9Q=aE_?N2|z(WQXxS=c>izp at eg&V z`TU1E{?Pm3rHCMdePa()r5`OKB7%uPB=~+n3KSj+;EQXa)AtyEnmE*XRbp#EVZQ@? z1;#Xauz#mV+BEfeE at l1Mk@+^gQ at 6Vt@EvQ!8UKR0uuZ8a_WY`LX9ShWX}0eZ3{G~* z1Vsh9F~HDpqfZ1h9t)+bHT%(yancV^dTi&jD&N&QRcc^w>oS^eYKcH68dnu8sB>#; zKsDZ%hQ&becG`jlHi!Kk&3C^PpFB7C)aks8)wBp6sz&ZN)Va$n?XOqk!Q-wWVK#^DKgsXMi2)5}62}W#C5;S}d%E)DjYPC0ZHLbI)>=nk;Bz1no+6G8c?HR@!i3E|{gKjcw~kbkuBukbM;9sVWp38Me%+KLAJ*F3 zS(k+vjbtHbO%0(jy{Djh4dr8K{CUrh9+^tlwZ!qZoUmx^)W9zjl$BAXo49smexA at an-9e*|-GwlD zgQsBtTl%WY0tjHSrFK~f|ITXuU42C7{~k-qx! z#8JI_KIiSy(02?ux_#_vaWzf2Sjx-3IhCCbvBEgisgGcKPQ7cThc7L&R=ySu8XxpJ zA^LRRo7A#rM68t=3JWI4(>MdO;L=Ad^QzA8mVsXm!c at wG4ZJ@dw54`2k|K7MiN|-` zNRmpwvToa0_T45Dq;grmpQal32-DAr8Gt8Wr$G$i;Ia#TOA?*`fg%GcB??cLm?6N# z-n=mhoe-K`oaG601h*<+52*!J=@M46YlpPCIp!%qL=V1~d^qW74 z=b+qxx=_qKQW=^^zBiQuMov;Ywq}_lY}@!Q*orMM`O<-Z^*#rnfNM2N!* z4!qN7ONcTzOHw2L)*|%a-=-x;){=~jzfL`{|L)rH|3!BH5S=EpFWNHx7lqGMBQ^pm zisnE=e?+z%Q((DWFmi;ZhzJ;JPIV zlH_ZXD?2aS8(q)6H`YI2+}A?3 at xcA3y8Uhf{Qn$&hFchT-eUzW!vt$aw}B}|Uxs+n z?vx$?w6;2!BeETvxVprKH$$NI-a&SVcW%()Jt9YIg7;gA)DNFQu92E=)EfjNXtv1x zyEy~9)V5HEemm9`@F_ww?ifTO?g^m3M8ALv`63}!dP)ut(jY(}kAw$X4uyw!f`t!V zBt%Jsyh0JEFjH|5YTSiJH4q_~=u!!gpz&)(7QI>`DePygWh*-IMU>q!-yI&(2mlX~ zVZM(Lkfu4&>GVg{Ry`v3kRN75re&l?nb~eia?@w)1``YtFq?>HfB(b7YQ}Q~gG0({ zVzpJ)bq6(ora;Cny(WD`iZ(}8_0N<+1;+Tr;vH|1H zgW}Dz-P+O3Dg0>W+FsM33eoTA>NDpUN at yl;kxi}LEEA92;}d?qYDF#$9Vr5?KGMNt zav5h;f<~2%uG-lp+!SoKm{DrjyJTtsz)yy60^T}l_w!Crgb5Q4fJ5d| z8k-DpUPWRLem6*Bmsb-Yqb}xmaTYm~A~qvB!4b6DIO--P^KNWna+0 at bR-#L~bjB+;vkDGZh7ujfLBwXw1|^q4h!iitbx at nUqw8p$oMut99IQ9hgil znr%Kyq{6ikt4fBP9{-4`6lb+|OVqbDQbJ?%^9C08srE56H(ecP<~(vVrp9!0|`K32RWm0+| zi1QVV$<|Hf{QOHr5^M*3(FJ{;Gi3qs%&N$&$}WN2zB9EBje7DH(U^5!VHVyb at IKwsk`aR)trc00Jbzce1iho$=<&z`yhj9 z0x`QKQRO#N)OkflzvzRwdxT|mrj!cxdxX)2`h4(#p8u3x_K?kLl}e+#k&*f7Dg7I^ z6z&$alaNvxMx5EQS!-sm>9hx*KdLBB87_uK$^cpuiZjj_PFH{HQ;$^;qu(NSeywCC z8+DT!4_+E^;q~kaBpx*LN^uRRVaYGUaa1KNxObv%=jvBOR5#+?X|ELYM z6_f7mOZ8>2;u0rD!Vmw$wA4LRaI^!1zFEvhFLNrb!ewGd6qayD;sNUW0zLSiHB5Sh zI{U8GwgbQX8>Bn02x3=d$bOlx0c+H%=BuduBA#P8+?O~@ zdApJ$e937_P;{QaYQed}oY(iP$SZvj=pWn`BHkT*qAO*xxUdv$#Wp?8y(3}BQ~c%^ zYM$&`jflB#hSDss;GultP1k4Mjpu*virIR*KK)QH(}J9SWNKRyL-)zCU_c{uxo^eD zK*}zplyro#5+|)FtbYf0dRJa~ClI#bui%LX>pjxI^v>lgCxJv#_=U6UPlxa}NPL4# zcYmN*g>&!H(f-|!*iD!q#w2o0y+e@#W+t9wi%=P{$Uhh%cNEG_6o2J*JHABMfMNIG z1te{J_aGO%E!PWFSFYDaF>=)qyq5gNn9YP%x`BS#~N)u;5qHn2?OLMXjSGjeJ^j-!^N;Eis0TwwuK8-bF2;$XJkDrP*8cn}41l?Inv| ziDF^hE3m1?B^XJ7K6cza0h~e6n7k8~k>|S~J+F$Gyi=Mr?XFfqZ8oMMbe`m)`U}pj z#HHp-xbyf~dQKHgRxe?lhsxyaJ$gl|0u^GkmgBVvvxV30)QeB?_QCh0fPY8DT(IkN zUH_G34nl!|2>d-%jHR=gk*TNNR0jjCtyMu9;=LHnRgYiQna~KqG+UGsT@=Wk?lwW30Gaa?e_3v za5MUfgDx{zm|}4u>IxuF;g1gQOcJ!+U8O#z}ZG z?xQY94!<@do#8vh)NLelD$Qjycny}EHDu2LH+&;$=lzM}UW=~0E5WTR)ui5X==hu& zsqP_}DT at V@4HnlXc=YG|9SIv$W=y+zhy z_|f)>S9|HBQx5$5U~1zrM-=;N4R`Q@{oLp0pMJ{kn-wsOoR!{UQ3^bW6&m-vEc$T8 zs=TrA*Srw at -aTi`A_1I8+hK%a)2 at TKGWL5~#vAI$joXd5N>r62Db09oQt7O;ADueO z4Py^~= zD~=MQka&a#wQ=!W0)UF50VCi9aeZykh*J1;Ly!+10uEeyoVEktA>Kg-&@b`=KR8@; zJb+Y36}@l&6>;@oV8R#IWbC!P1sa}B*LjvrrAQ;UKZ{Jun)3 at q6aUYv zzyMKYm1{M+Tik7i4O=|gh4)auw!a-BhcQN$pw9bdJBmn at BdpF)^|1_$R~81MeQx3h zDl(crFrc68PEHWzyctI at kWJ38+zLuW&IQXFXIOEOZQ-X4qMwUr@{7A0t(R=z$Znp0g5$*ga*4%EiwP6 zaE*CEeIK(PxI4EQqQ&CF;pDDqb%jW#VPZPG!9+mZ@(9%(TV^S=DVpy*zj0=Bh^2LB zNxmcA8GC3-&XK508_B^kC}>}z9w>D0QhW=}@`^(G3gfV6<1P0J!FfxMafh#d$1nSV zR2op5Y at E{DD6UuxTI`q&!!NC5;>jNKg`-bdqtqPDrJxR2nVGj4hJ}98E)?kb^Zj3) zgbCrx0udYp3gxgI6B!oIcA0841~syRxqHSeeqbe*NfeEp`zsyL_9ZXv+p z5_hidycp!rl}ZfW&`4dGS7j)%xT-Yk5_-OH`U<-H?92P=+9I+8FDmwWRL|*3&st3f zVG>V&M^w-M(s-VRzrR?9i|fyFUrYND9j8?lnH6k{`Z!g{ICbAAZbN-ElVr6``Rq39 zv$LwiTtnV at GD#TKk8OUdr ziQBXFN;{v*>YaWVkzv3s-*7`JsG*ZcExcZuSkX0K`suKUs zme{;`C>{o(Y~gA=1vTs9)PQvUy`JS+9742SUAClVQUSlzw5oaH?)`(c+v^ znedb0d*RuhypRI^7TuBLr*Pa7%aNpB$OspjJ)NlvTbInuIhdir2{j4!u}8UWp{=nk z8^@i&(L393AyOX*nmDB`yiP|v-iTrSoZ at negl~kDkr8xpbLD$fZ!1M|GI at P@)$f!j zE{S6(ZX at KjU76#~NBQZ4uEfI6D4opWKj%lte_g*XK+p-^0nQ7_a7J;ziI0c(Jj(t- zf!i5_DP{PnTLvb}zJEUH$wPh}I>a04f$M2NM9~xVc at aOiM5##HldCk|lix90VeJR2 z_qqM9z{uBHcYn5m%P=K%+Fk2-Q6l=?qn?oBYDM_lF@^oGnZ20wDfRdje~!H)uFbC& z)?_{5m))~{>zeIr5!)jB&hP6TaO>1={RtM1?x17(m7hFgvrzXB at I+e1a9#)@@MAeS z$v;?S)*8N}Co}%EU65)1R`ftWr}=@19{uFb{(!smJ at bs6rGW(7PLUipK)$4OAKF-E zjT>uPKw_2kSC$Olusux}3ziRn-^Fj<*5KFJyucInbFE^z%o{Dt2RryD#O58n)fF$y z2Y}Sz#CRhqdTHru8~L(7lCK$VbCpJ3b0p2r&9W8JP>^O6g`tZf5A8&1kG(M; z-w?(+J?7Gpf5nqaj(%YNA^caP9V!Jh!2cDpok4s$x2L^ zk7AAGiY^9I6P7MLb}7V8a?}@x!X$%(ofE at Ochnj{hqi(yg at fD%Z$gukY9E=a$RtnK zdG}4U;9qrlwbVCo?-(qI(ZTQ-iSn)(l7Zu%u1{YIw!@6lE!j`9tH`s#u(HL at J9L~> zqr69~3Qj2uh{&TrAuToQ95SR(UmXK=f$L}HoyE>#Up!FRS>W?92TuU1HNp3AmGPEl zXv7E+LxN(JUXGLTNOr}jQu;P_r#9DCB$24~-O*W_2!n`YYd4F1Ce~uORTY at yjbaqO zT-V3y9G!a}<P4g@!0up*g|S$Rrx8s1{HTWjT2UM*tbIHoMMCt={ZVE5JBUsk!CS!`ppf z2K;FAM)i54ok!9X3 at 6_zLjX^sJyy49K)7lYQ1ev5<>tc-DOK}DU{ZA*T;8~K6ry<> zrL4-dEcwJc4_JX>Xrq6n)tY26wpGbm`Kf95E4L61Mk#MaC*`LEZ9Wou8g+f$VaHpyhh|($cLCL`xmq=Xb>Y5%hn%B4|QXe&A?`W$S#t1 zf at XMkMJn?IPL}#Oyd_B^;L3I41MorWx_FnidWGH0)GRHPHO+zuRhJG?dR7qqoch3LxrR zRup}|SuIB_DQa7`^!(BvyfDY~;Eb}fYhhgZ0<(ArvVMZ9!CL2 at Ke_~{mYv#j1pPoU zhBR-#Ipv=9yY8 at X_&_^McPkQBu~Mw6jDPjVTrI>ba at Ca8V~ zZH_iY^Q!tRm`uwsc}{CLciZvH9~fA*2GIk5#YC2;=%^;f+1NNX%*1G;g0V_A=7x at O z4}%8|3uDjJ{QIGHZ-i^rZ?tC`X;$};)2nhXTV2}2wr8(%;8{hbN}~k36V53WlkQJS zKc??~o)(&SP$`yo)n+G>M=;sZ7WYiF{;F&?D_^!M>o{4NMXOX2bj zz86!KwSgzB_o~Ic-ek_FrHTTcE3ULX4(w4lqe#3L at WI*(z#;h0Js9ncEOr-;bbNr{ z(+YxuT$#jJf!SKKTtKLiLLr0eE}O_=xe1cJ#7Oh7D6t^r7PWxIyrjj*d8~tdM;(lfVg at v86$z08=?*UE4e&jog15zG}QS~&rkG{+%~5{sxXeh`GnlzE8Pp_egrg| zP=zTP6Wclnp>O0j#M5b(;18Imwa|JyOsSWhx81LOeIOyJYfFY3k`-eIeK0{nQhV3t zsGe^rsJJUNxAqdK%KMOmi=(TwoC_e2?T0%DwMH8qQAC?-j#vKD%thw8!Bx>tDm$aK zZajEtbnM-cp#XopC8SY*cYtu>M1vIp1xW;mgopZ#rc zJ~ppBsvlH at 8xEH3(LOl6gD*JG`|#j`maoV!=pRFl{-_?KOpo_U8wvB;;VI at QP4}%s ztD7 at U3dIz9LMH%fljvUUECI&HOVl_)rFuF5Xyg-TwRLBd@=9?TI5DH+MyZ`Cc$k%o zv3sjSTJJm|=o^3KlkwDGck-Kmil=ax-xAM4DcQ)I~_HEtB< z?)Qp=Cw->1zr*JCw$61g7?+fH*z>56p1iZlf4?xl*&{(AS;=cw3vDf(D=Rv^p#<4VX{Pdr8YhfU)j=0b(}#|R!JIHd{*R1Rz|F5#Nm1L5v4kH7*o zFadSu7kjU3$My5OJ~JNIH`=T*P^J{$sFNeu<|)3gMlkW|H8>?pz2K~00f5$@KziaN zJ}kD)^m?-}9Yko5Eg~{d{ESig_GZ8M+t0wuyuxsnRbWDutyCsSl_p}U7NS}`0fnn{ zG4Z7e8^cw0asbi2Po|^{Q#%&daulp^*(i;8aR|vTsMy>-DH`%$4nQocV6#ui^m!q8 z_KoJ48pOne-n>I}K)7WxY}))=#05QLy&Yg_^9zrcL{rI(6OHC3;r*pP1m!`0VibC- z?8j^7%wD?MMDgTAv6V#`XqHt>TI&2jV&Llv^MVl_S$E+eOXtc3({==cjtN)D9TG!} z`ii7n`wKZ9c0gd0T8tLx2-?J{qW~KL0zy8RSCD;FpN7=^DvwWEg9~<@V1MoC+7nz? zJ`v5aSrx+&T-Y at FhT9z*Ydg{sDi_XH3)HqEu7k+eJ^a_#zjfqMu+FSc{SE>G|F_xT z|BHYBvk{=uf3`)(u&i5xiO^n(B2u at Fb}qadR)<2dsf0(dvi9uOUu|^UCin0W{R40i zc*DGfE{dGj2uN|d)*e!((>^5kaA{(F at Y|i9xoW#16a>}m3l6e at Sa5>d^TumxNA5N| zh#UywoL}voOut--J7EwhBqR6Gz?*z%A7#1 at jU?|VO;K5Q?NGDO zoK0z~)|-56ag^1O+Vs$4Xju=Qu$XMM&Vnz&K`3)wrYOj)$h+h2Yd&zd(ozMqc;eQ)z?5hDgF at l)6+G8GfY(qo=G!!ikG5HN-itr{~pHylQaIWgggS*Y|{0{9Izq(Q@ z(eN8J%9wVYwQu!_G&fg2?UfXOA$-5e|+!UOci(m>tWT^#k{b*1U#Y+o6QB zJ$hzt$1IJXa|xwWBuao(?F?1AN2w8x*@s)di%V at Xot@|Zp&xUWq)Ir)&Ma#4!}=N& zpzrE5b4BVb$s<4BM=GjFb~Y-i0uz}`AHm^t%Mk=C>PJPqOuSFRkQl2>hW^fm_ee0t zJPz at O{JwGan~7^d9(?EXJ{4KFUzN(1XR7lZ)fr&R*Nt6+yR`NCZ?z1{M2%cG-#|cq z|CKFp{H?M6Utl~d2YWGR=YOuePF2=(SY$%uzt$+YSd(aD<`Ce(B6TJFM&@~*0cKWE z7zN4kehp5`Ds6kjwfTjikm|Vyd0T|EDm7Ga`D19I=lPC%lymj#>+q5jB>t`-65_hO z{$d~t)`NfRp?-!b8HUu04~-&K+wbhBv7rNYske4X8ZGaU6U7CUAYi0cb>W&>^)p-q zpsf&q2Db=WG1NuJjdGGeI2<|!?<(1vGi9Y0%9(Ve(vg^eYqi at M2Ctfa`Z* z&vP at A6flmlqF6?GroYI-rwjB=RYzx2DiT^ob&gF4WGT|UiRtS-O0kNH#d~BHX;4FA zisqh>-(nc{8LH)Sw{Qua=;+KW;w^@D4j&Fy<7r>#!?+L8Y1Z(3QY!i8nLAyBTzP1& zAoWPcsY7r1bE`iU|BkUFP{O{_R64guP#UE&2tu^qm z`~Hw&5e0Vr>Z0Ium_Rfk+9^fTkvk128R%sD95!%$8CBDqdB|HJ-YkV$LGzap&-8WP zL+*|4bI#|}@81d_$!n^}!-H6=L&ucJA}EJ)8H%@(VlYFeYPP>Izb7K^V~9;JKseV zy5j^I29d^jd`x$;+Q4?pQ`|ec?0#*KosaRB8r@*klFzCc4e{1bh-ULP at L}h)GW=&h zO9q#ux+A%=6b2so`4g*+G(2Q5d!B*nb_PuS_gtn}>ASwk+>DPR3vT0SBp(is$)a!6 zV%z!^!%Sq1l=Xgl&L)g5Y6p0eSf9lil!re7l;Fp6daE%&tC{AiWtdU&Xl+ND+Hno~ z%s0isc9ocgzxbNfp&T at 2ZTM7)XrkfVJ$_ z3&7v at xAV5b;#SK^d+ii8wRiMj`-A!M#kRPpe6#}~{&XF_G$$bK+f`L at qse&P9b8u5 zM0>m)UrhpH6T^+gl~Fc}v|+TS6_Em+8LsNJ=FDg*%W>bs>y$sK_VrjglO#8ABA^4IhO)Riv1iOZf;^Jc4V` zR(Kfd3^by9&wC6!%%{ZnU=}4fvd{P;X4 at wauM`;dg`eAkeu8V81^S6=@)-7pl-K2v zO#JR$RAPZDMzp+okwGam%`1%epH8u*!1)dOuQJ1 at EE&)E%c%+fPq5AZdzt-1Un>6v z?QJuVNmr9D at r?*h6=){wyz4jv1q+b^g(iuNU%WEqoxY~a%q4%VdxS2G6bvL3Ywuz! z9HF3?B6GRncR8KPP3B$Y+zt5d84?$blZId2t~s0)jgrTs>2VvQxcO629Vhrj$j0iK zB(apm%vZw7Y!`WAdxsj>m>xrBWK_`1H+2AHqcp~1Uce&@ijWUe^5O%hb+67iydsh` z7L-k5N)qUDD*T+PjPS!Z9g(#ARNz6<;%fbk8N}B_GY=^oPhzzo&@cD1SbfAR41oix zswoM&uCu3KGzV4?h38RWL_A8#Lfu>blX+a0Xt%0+D>hTCdxo2TX&=R%@HS&6cLITf zzxxNTg|F0^U|`~0d%(@SBMIn=W%S%{2Xv_DmyXfQRvL5qEyWE3p-V)yGN!7wtxw3D zHmSp#&5pOqEuS~4J5yqzjMFg-8QZ_I)B=a$)=`@pkWJ5_Dv$KQQB6Y~2~dU7 at HRyT zs?&gi$2XW`8P#5A$)8HEvhAvKtxTh>T3ZHTgMx<0v-8!<4&VOuwbL2*GSz~EfbheE zfUx}^keNjt+>CAii9k}5aYa?b`YN?!v0 at 1;4pW8|rnOvDg(iy7tbP`1Xi>D1LH1>q zD>a%hEu~0q-7`5?-uBjQe*`BHutuaI*gl`hW!Ua`KAQpcf0;4O0-%MN%#7#q{`vfQ z6R`E?&uJO%YAxtm^lFi1zbYCf^L7N6eB^eM(zSf_DytG-`04O{u%c4$RM7Vpw)|ziq5{J|YdO6IWiqu^C9H9|)aWpPt5Ubs@$5|3pT05N?)GbJ)xV?= zm#Ye#7N*uab!ZZ7pBbnS;>~h=c}}^wCyA)?J$~sx at f{_oWHrR>2;jgIa at Z|ismvwd zUF4mZ%#AO6jW92A#HHV}iW^Cn)drt1Qw~<2O~LQ_8HM=F(9x{9l%=6t4pd7vrSpYp z)hfV1Ubp~gUxby>en;5Ry<5Y#Hi$-ApJOu0Mm33BzieuCU?L+ei9(({1uJ2MCy9t` zTVPc*usN7gLHS^o5H(nyokFf!{|^0Jr<;E5rHy#!?G$Qo6uuVL8gzCGezZ+1C|b~2 z&2)t=%~h$VUcb^SD%tF4rZhW4USuS}K7rcDaBx-|Fpi$lj?)LSRTHJ9Ry>$B3(zDJYqx_wZ7d`7)oHRDz`d9o^#+Cta>ZPB>THCjKve&isHG1GbC9e!MC zUg-C=?=zL9ocdCy253*wz)YGpWKkh0=VGEZ{6epPt}}vJtX7X{M;Q%npG~+k)=RZc z6dfm_fRfTy-0b;@PYi#>i#Y(H zXpi$Q15E1w$J#qadG at 4PqgiQH+O}=mw(VcqMx||MR at yczZQHhuN@u>+Gu`jpf8XhQ zd)Ar{=d2ayTSV;ViM``Q?B~v_$eTN(ZQCENIx8s(L37$%`HY&PtQvK}C;YWS>5;D* z`(T#=%N_+QyHBpG=`ITBqVMDGd@%@OMwCl1^8tXLaxEY+Q#~h2`hamdM4Eg=`Jw_f z%gxuzXBp8TaR#$cle;U`gP3xsjQT9`;~Hv at OK^DbiIq$UOTuL-?2HE0xt)c$jH{3a zO$4<+kf|KuJKsRsxnwtY?)CjVnw$$Qu?p at Ej-sn*b>BCu6?0j8%ZuAKvUIpzOQH5x zOiu39yz21P0^PzjrQn9}A8d#m6<||Wrf|FqPO2kO|Lh zdkL>pi1wKBqWhwIF7bGdwvDbgxhj_Ie`Cq|$tKuIywl3+m$Y4Lh-x_irwDd?+5-ed({2X at rQ#rA)nQU`B*xndZ=NY1;MBc_I*pF zdaz at i74FrMd^?E~P=`<6wt_9BBod;|bc&lu+5X*79fBb2%dGYj>jI9Z5xb}o8#6-r&UlEcvU`H)vp_%pDgPfB?kfIGpxypi_J#jv)f)awsr^&E2Bm-0 zYgjCX3=pO8MHwtab1;4wr2?nQ$QXj~?}8sM#NGT`!G at mgyRz{AC`xj>bs2(1^SUGF zc%8+4{F9TJo8Q;>4Q>Y$PgSwk2Tm6590$+c{lrk%fKah6WmjM at y!oj1Nlm~TA?;i% zkpr+H5K=}(`~^x?(>QCZox9 at 6gFxYOS%;K%ZB at WmJR2VYf1oIlHQ4oCLM?$~^4 at GT z+L`F47=L91UyBDtnI)@8a$tHj$CfVUL4@!*cIX~uUN>w0o=^_i_EGRNYpmXty zM!pDNiuvJ5w{o(!-?c-6G#tn5?duzY#dPk+5+}ys at 2D&@twVugD9S~1B2YCgb)||o zwrG$?x%<3KKh7~_H3W^fB&-tRMdlK&*}{6`D3=68XI*UOYH7J|pVf{D at 75n6zdt8j zY at CIdn>B^MJK>~o&^T$Jx_{{Ni{&zQ#=lFTM{0~G#VDrLS7<(QI_Q}|k0Yy8 z_bk#bG(?{=Iac9CumII`zL-SqnbxI>oS7I+LR|<=j1RW9N23ZgT%6HF7LAv4n>ai{ zM^=)Su8(k7wI()PDRn`-1OF9I3W`LPfq$?R009If^*^%4|G#kh&qEo1H^%?33wBj1 zy2|TfD7 at Gdebp9G0E!oj3X(!rj$Q-_3Fy2Zb(CfPXvlLj0jM=M?uH&n%PP?zqdwL+`XU<@nI{@sCD|BFM;t&QjKxyAI zeda)AuAA7>0L9>%b${21ND~-L at z(6sV+}3^eCdfY at 2y`Nu zAkJ{Mr9eUqSQ=IQ5>2N_M;}e%syuflf;Y!`r?F1~+`%vpZ7}b0pa^{~PYx_IT4C+6 z9QKJv98P|MVYCw6{q|>%;}s8Zj5U-qx~eX;PNloQj at 9LoNh@I4TdE%QaOE=v*E543 z$@QEHZ0tC$Q&&NK1-kW!1*zW&1a+*vr)bQ{Yntxabq7s~9%psosuAt>7nhjI8y1Gk zX}M)^42>7o(d3srU$JoQk#>d<#p_PQW!GP>RRaOw=IJZpp10k;gz*>PiU zyFD&jNZ6l1{UV3Fi;SMg6&lR7wtEoo6b$On!l+tr-}{;_I8uH!LhDegsV!Ixs_9-r zsBOflB at r}VWNCyf#azBrDa2r|FenZdhm&J1qGe+}j}9V4f{S-O&NtKm?VnU!WVTMhHvk17kPZUK5$)|0bNfg%fhek49AhslWX8_B)Hyw~hd z6)j81#xEy4SbVyL&GOstnyw!?Rr5A}yL%3(SS_A^PGEebIrfq#f<)dt$**L5h2BGL zhnuY`6ZTHB=I!2_svG0 at p~`ur1Tj+CH8kAaJMnvyZ-D%T9aneH=N9P0CiI<<>1FxE z?>=F*dJoO&?+7ac%7Iz|5g at CVU$8_ zgLkfB5QS7gW0X0Eb(|gP`0KZ#8pkAZYq+5qhT&q%4Qj=<*f!$eS*%up>3LjWL=c z_qiZomlQ&N=CQ?q`NdC_=v=9xEEM zR(->rhC38_lVVO<7tZKdBT`1a8Lm^TbK(I!HTj*)$BPk391x++I#ru9H99N? zMxw&wW#Cok$<{|!*nWqtH7+>M3q8lP&6OObgEPZ;=O at u0wC_F{f`yv~R${bn;WoZ! z|1ylaqfBZbAEb_Vw5#v*xKLBUl{O at C=kR9 zO2{@~&bqzYrn2s_Vr{K7Q{)%b7G-`FVxbk7GPIr?n{d4;Ge|>&D8d6f)LK9Qe-A!s zcDhKUmSx2Ms0t4Xh>)#o-L!w z1j8iu69(J9NOZoxQlN~8Nla1{bfTHbc;Sqe1TydWq1gR^^Hz9}k<=Aj)6Pfr3WVR`MMa;1W}pm(d$5%Jf$rM$Kr>3UuYtE(`Hj~h<7**^xQ$@?zU&u(C->B&Z?JUE5##zE1kY3lE}uO(srlP-o%yZKZ_G1tNsRYuDrX|S z!sh+Q`3hSNVA*csM47`foDL+j(pNlN2*_F3oqd at fK(rxi4t0z~0@!ZWH?}{%SFHT> z{r*XH-`+xx)L*-&^OZjYS%jG_r=6Nd^*OWDXXb4wsI{kL;b!DZFcDPSFD_E{CFgSK z7F`TR>T*BO`K}L0Z)n?HGf1XWPmWo|(Wo+G_rKbJ<^495;Fet(`e4KBTk!!_=@OJK zFV`So9L&<=wV)Hy2;<17bzFBi{G0m8aa=t%kGApg zP*^|te(`6GLGli4ELVf_k at 7fT#`Vd=LUM+FP at NMh=1 zjt8EM-Nc=;#=~TCc5AHPy~b~7_{3#MSDL*22az{gYxg0t4Z+8siX at qqS2rFDBBCdc_R0x5Xi9|_n3lQC}o9-3sl3) z?+iGVcCEo|Ll}Pk>{%s0YZiQ=agr>ceGuEh3eUmQS-S%{wU<+i5S-n&Ut?CAVtmdG zs0NIK?(Uyd#1MCquHX1brZ;>dzfX+nb6{?9^Gf5L8cM*({cbi?G*KpRf2Dv8HhsYs z9fndCM|CRsNf{$^3zCXg6WG!(J#}D$AXtg*F*gT0pVXD}Gc64PgXd1=k(JkYP0_&; zv*je+ad59(8b at DxAC}VI{~flnL&xPe?RNeKEk}%WwWB5!3HE at k3W`!B6GO2JPb|7~ zM;PehGeDZhLlg+MxniFv6b?1MdgDtje$~VFt2|~q?^lxQATVIRG1f6 zG#irKZg~uQI)7k`^Te$~b}ZW+6%H=lNyy85ds)E`Nz|P48-eueYIkoZbNLJv(gN~o zVgIg(m)$f3iH~t9Gz~n?kC{DxOlD}XQxh<{*oEo%*I6XqY3FEPPUPXU;j-kuHbG7f zrUoH0O6SE|P_DMOO7Gs74EZ9bbgu2n%hG1NdXMZy at YBR`Gh;d73_EP8pKgn7ANM#h_ zc0w-fHAp=fW>RE~366 at U5=O*~2_AY#S3&7OdUYDfd%T+$bc+Qka(QPMDMok!M}SsJ z3xh2=;s2h}gikOOu86+?I~8#x=}NQL%{ouacx*?M(X5b5kT195X9W6 zE0Q{+3-h6h>P!@HwX2DEct|CwQ5^jd(7ZiMtPpwQf*OEE*nxG{At=FOPeg7N=XoCA z1^BVhKVQx$l+z>63c1ZDl4f(%zv_wKWfjJ-OoKnYKj&3Bafa%asu2md_|CHn!f z&m;(;gq=^l??vkkzv5!w^zDiRtqx at sJ_M=H8}gQbrYyoHfuT2jG61Z=F zu=pWU4I5 at LlOCL|M(;Y}6YiRR$u`hv^=z)YO;=9ooqlD<$3Jc2zlrnKiv6KvW1#=8 zxBWkonWTxe>HkY|W&NY>p4D>o`V3lce!jN~Ep4re00}8sh=7n1E8>AqJMKE^db*h# z^lPLyS+Aw{jN2bEKh<2!xRh#J&wRYK!FfD2(RqKr+;R<6z9LN=EsD*SGB;wdIs_fT zmM4yem-!MNjig4KM5{tm$yn&T9vh(wa}H}@A5(;~E7(&YAp+~=BJZ-1qEsc&3d$|j z&U*101LN7Z}?>Q95qafSMp!-zh zzIo0f;y#A`&EwAH at OCFEw5u+3s&Exv*hXoT<56TKktHRHXCAiU(aE=W^T&9K*Babn z(QH1)o5-V(JkE<)8$*a)e`Uc2d=Yx-NNSb3P>bq(FZdBI#|YO5=7G_?&|gg)w7Jl5KQcg{K6ND9A`*5L`6_mx<5 at HDJ@8ylbhQ8Z3)zxEL)InVqx36jg)Cmy zmC|{J8=1C{gebA^7oD&e)n)e=MhQuV$_dC@*!*U^CPj3okus3WO z%m6S6ss9CtGW`=osil`m8wZJ075U0j)HKIRRw4)? zp+?KY5w=>^>vZe00IueOe(}>J8qx5tSFuc604prwF6YE7-lwA}PPe12U;KVPZ*aK* zStv?r?1n~!!ICr?8bZA!4>LW)A3oOkVWuFYAf_Pl7(=S#vCya>@|ZmaxKO?QA3f1T zc#Ibu+1Bf_l$qaJpqh(njSnG$g3&_>(Z{wb#HpNlT^1mp8R4gWV$rEojjCVz)PKP? z?Tyfkm%xtttnR=n$Iw4#w(1`5hHJx*B)SwHgO}KzSb6QpoZU01h$qujDxQTipf#d3 z at hHP`9#8PPUG|{Lz7?X5!BmMl9Mwe$$KteZKd!- at e`E!mT7cJZ|l2E-<#M=3o8M)F{l&$n2vA~-vRf~QO2R7>$A z>)SP?b8wAk^^PksZw%4Pl(V4veKuXu{PV9o$Io{C!>*f1jVG5#0y2$efrY&Iq zt~b&upx5X31vfAt59P5fpJ7Pt=Rs51=%EEe zMFr3tIbge)IH?NCio!)gpFyW!FnyNsR#q}tv(hroya_$vRwr^JRO3B23wK$8We at A> zZ=b{YOgFxZP4C)VWv!z5354mcH+_V{axbPutw9M}>OXJ@=K+4bQ(!o^Ei?XtYm#9N zHsvBOHXrv~NK2^4?8#--N%eY*;ly#YT#X^mGnx at e%C>kbK4vDVP*M_G8iWCFq6MDb z3vI?}XCd=`Y4b2kcm`Q^9GG!^lW+B-@`S#!Z2b|51x-P%u~Z8z+)uS6VIh-+Dm=G@ zYHhJHkP`C7 at EO=F#f{IL(woM^6k)Uy#+nge1OBm{w>>z^_sXKdRln+LUb6_m;U$|y zCK=&`CKXHRK2Y0%iOpk`jLC_uVKsGqUpgf)Lh at rj>dmW6_TYL`=R16q;H&DFaVZ>R z-0a$d)=|$cjuWJQczEW}$y*yh9>Ce;#M0%j)JXD>(@W?Aj&Nq6k8g*PRbx^8uI$%s%TurGOxx6i`k?^QHYZWhY0nPdU5+lr`R2?Qcj$&Sm^`=1=RaN z*{*~tQRPP;&4+>B2Qo7 at lT$)jjHxY>p&cx9xRv4bc^YYEJ`8%R&^GXkM^v`6iBo*m zFz-q1*f!8#VJWJ9^gHbjEJglp%d-CtmP~&&WwOE7;gr{=zEcP;`4n2Vc}wsm#2Jz|f|T7A2JTDAk4cVCaS zqM%S(h!>OWZw-OMl}vKx87kbHKq+3}sv3!k0nMhkQ|Ye^F~>T>c!h6E{3A&rzu&`- zmK$M4eWwg=IkVqJ=j(SKbbOi&IcLK$MEZ3t#SCj5>JA9bCO0uq3wE>6CPF7n!h8+T zU7wa^oNzJh(76YR)$SGBM5HAEt22=1)-ZX_xJKNcb3kv#M5?gOvW%-o;a4N;6<+QyjzFDvxe#n_fLH at dW0>wAO=&jRL#0Pu$O>`}ZCgG3`i?#_ zyp~-H95O4hVB3wBJp0JfVaP!5 at e13(D>@Q~MB5FUx%ptJJ+DeP5iG}+t^PgNX&i~~ z`yxv8;x9e(d<6i%5Ub_;jzH;B#z at YW_g22k$syavd_$W8KWb|U(b=B&umUtLM6R%k zN<4|KE*`6J-g$y?RP_XltQB~jjMyWW05vP0ZUv)fD5H?R9U{B at 8%Nct(J5plhi{O^ zEynG2{GLs|Pa&jtA8x+bKnY{SFNM at zjH@PtGv^noom*rQS1EFdE1ZIwXOIi>Mlz*U zU!uln);xBHLkuxw^=a>u_)GJo8`3*w_lU*2g4Q>8f$Y5zQ8xJ7uqDtB;5!TgI_Y|v z?ERrRNK!oBuYZC(TIcb~-|mMuK>xcgWd9B1{{eU#<#jOxUpVV=NJPB^GQv}7rHzF& zBw;;l8GyUA^nM%~xk5s5G>!g*;>$t2T+(UiXTGn6xfU}m^T)Rj#jLAQDuneygK2j= zyQViDuZqq2?XUM2^dA80^wuy@ClG2frRTmLVPpUeKv8Bt-c^4w za~R-Vwp{b-0A;0>)aaf+SdJ#&q_I4LP1ZG3>~9X9jr|-#sJly7vlhWDgMwR=Qsb$& zc<7;Il|2zE)mkV`{@_EW+BNWjyL$sHY^f%ZcZA{DuzwC4E?Ogm5hzOdVyQvx^cAk_ zI?ANvMNl->O^xnPSW) zMUTnSRxBSat4Uo`=uKDwdtA?$Y&CA#1&E&Y8MF_@`{MUi1dWi^eS*k?_K}@cM^Xix ze-Au?Hu=2(kx8saE#qi5lj4jp?GC%X1dw+llidr_2#G zw0ez|s}#Tu2Olu8uz=FvpV;vzSG9Z_{BVI(sCg%}y$c^?dlQLkRC6v7GM?0l#M(vV zCPGk}f3M`}%(mGJn-1r(8VdIUR(%l=3|vgp5$Fa8Y3C9*%lL-1%MFuy>$=Rq&N3t& z0#l``2^p-t+XaSgN;Q*wj7H`lZifs0yH7|j#{dh|UVHs|&lu+E!BxzTdIwxjvowIp z>sQ4FMhIM at r_R<9oXg;I_*?Yuh2e8AZhsuV=`hoT^QM(^jqkS2&8Z!$k at V^#S1M}A zsI^y4ON;M&0u1fvq*3=QzwA7wZm-JGGF{t<1Y963S;#lunS3?30uMQzqMB_A44;(~ z>;kW}t~`*!d4)LdSl1jPK`e%!>%#K3_??-BB);Nz>P)|Ppd}O445DyqcBvjjM83J_ zSWA$^h4=6gWQMehrNHaA#7*oKq}j)~Voh&|TQalPLF}i36srVvAlCh~^JLW|vO!ut z<(wBrH0CA3$7O7eeK^8SwESbSr)LCn4jaRo)WhR|!kBTi7LWCAZl;BZ zDu41LSXP-95&xSX5lGn|GH#Ow}zvZn!-Ae&}4< zAi0A#UyS^jFW@^KH`32S+r@)U7P7T-z9ZvqFfH;Ezwqqn#EDIO(yA9})>Oa$$B%C2 zKWPMW1fHtqPiy_pL;2sP5eq{n3wnD)V=F^*Q(AznncaUT4Ov-U_-}#;KIi8Oisg$m zO=lu10dXhCbo&>p>&d@(cWWr$f%v6pkQfI$Qa$kR-M6lQhAhA!fmy)Tw6%{Ir<2Y6 zufq3;NqH2^>_RECBy(FRqm?nQRq}`?^B9-nm6uR}3kKJn;vcxjSPzrx_B$Y*^t6nn zs!EnIugex}iDqJL$dIj&C+FrT#NkwM4!+F&r+%qhGKK4iQVv&tgH*Z6f-cX|72Y)N zr`GfRr(XNPeFxqAlRWpK{?+lW|LC=lwVj=f7{J=u)KU3Q>U1_W2benjgS`%_$~vv9 zpzzYC5c@%5L9>yN$O^43OoevOap1$*X2dC=xA+eg%7ijfR9jXUOJiz+_rYR^i28x_ z$AD$pwo5|6_ySS0z2oliL=&$`CN7wQ)9{~mRoq|kUh`}|`M%w!>VGqFAP=B$M4Z at _ zLb)FiulphDp&em>84S6n5#Qo=SXH`L9--?0i8{};nJ>Vj=$q at 8SCZMTDsT5I2CxWI zbP)5S-gcWAbShbPymb+9i6tkxZ8PW8Wxf1x6mykUzwJV0+iwjcAV95|vRldi=(?Uu zu3WuZ<-FN^E=w%iV5)r at vSnMioYB0w#*$gR%TRTN2N67i)TC=s`e_^rhhaCy#A(I&InRyxQ&iFfja6XUu#*fgz=*SbuO+DJnH5riUfs8dZhf?Q^Ie_;|hS_k$a5+(X+&6ez+O-!i zx2*Q9fu;J_(aGhGspR1U#HWAQpU*?}1O$s*8p^U%`On;sHYX^6q*qiH_btYSJn4MUjPhCvlk zeu#obDGuRwsz+mW-xU+bMTUM6ho-+#XeD$}%1;7b%^22It?Mf^n%D=K%&E{m at p^lR z<(s#Y#k*`N>DOV+8Ku=I>*emp6f$XC#uZyURN{u=I&@w*D>@xK+5I-k0bDtVzPLNO%cX0SZ=zHHTqU$?58{mY(?}R$?VE37}@|*~}PJcT6 zZuxR at _4|5hgWuuHCY=q$mfR4j3D9n>A_(V(MnOS3QC1M~OGx^L8OX!}RTpuZiA02b zkF;mJarEhg1mn4lC95nKENQ{qI*Eq;h~%U`sT7^mxSKS&mT~G>2RE3ef0!LKK=MSc zv%Ha#d)7R;QI>J)5%n2`VOmnH8DqSdCT6%<*HnJ0+BBN6zhLe at X?_)Pox#_ at aqkJw zSrA0$kOP!JmseKHNZ%pKdo&-hj`}-AEky%r{hY)y#wV$!lH+^JM3|h?avS+~ z+YIgEC@(6P8sQ-jRAF}tV~s)Ls8S0-HP~3v#z?(GtBK}!%WSU~+#@btrtDJp2u0LM z1=A==jL#Y-(!wD4DzmkeW|cJ))AG_s4JMrR{57?QM*vj1KuxBvs at EyY1$0YQ at J{tX z8DMh;-JH}U`rfHDYk3L_cFuWSKQ|puDA>-y|D5jRRTO7d_l$8<^jcGI^dYVJqP|`j z+xu$8*@yO!in=@9zDg`>RYj+`*7hfzhsq83XOaKNyp!6=sWQkQs=|VZK8%(mpuhr- zQN%(H)v4^(F6 at HvwZa3vuBK4b0^XwKnO|@yvz>ZaPeK{+4%S at DpDGXMf%VD6QB5Je5&8tPOeC84q_Jb0sz4WTgWq<10pl z4t3k3in8tUX}n~zJJ)(2_+B^f1*bYhB~Xi`zCKjtn@{Td4P)irI3h3Jg$|eC6kdFT z_<^ks%&2e at aZ(|{b;(dgiDJdKv)l=ju!tQ`hND?L6q4DTUkl{}`hSfDNc+X6(m%1F z{zqyv{SRZ|AI|wU^79HPzE at jo$z$sXxVd{wF4z*79D?j|=!BX~Bo4Kp9|B{Q1%>pI z%ZMN9z~LCtA=94}`)xMCh^ZFKha2nJPTBVx$Jt(fpRcbV0*KT|dkP6AW~823$P7dV zdI3 at 78%dx%sEj0n4}oZ)G|=vJxf2A{r&s0srTCZ!<)(nC_PpkGtxQ7;t0&fvNTMY_xtOqvGaUXxm}YsI!?yl&V|j$_=@nDIMeN<8cVPXdaF$wDDHa9jJI2ZXM0O&X(2s&%R>YzjaSz5Av zK3(b;G2dGWPF>uY>oCCbfS_#1GhoVIjOl7GI|_v#mzar4!zc|-SXK;c91j{d*xqOq zqmM!O%f%G5!ypa1PAf#Iv|YV~dyB<7@&R-7 at K>|>+m3`)d!b?3ueuKI+>LW*of3JE zbia8IPD!^InMp5 at _+*ylZx}fH>jJ6jIFcI!6drc7+96_}iE at Z9Q72$VIX&y2Y^y=X z(u&?##)95Zh}Ty7(6 at c)ByCf)q_ z67t#wFhYZb`(Yn?I%dd#F>vcM55-v zH(>Pe7+>HHb{v?zq0S*)D{cc%`6VY6IfRamWy#aLvJoYaL&sdv!&@96M6%Fgv+`%~ z3W)Lh)nOHT|1I2;{2lmz&-{bR<5D1uD7*kG<|IizCBbP*=ZJl_l${+?K*`8^oX2|EtMg%e%;(0)Qicn4eUOv;E@#g} z9cGldW8mX{(nb0mCOBDVRGUvFz$kR*L7W%if_4cJ$Cun4k6^@o z{1s~K0MZeXhk61dBAdS8VNAWFYHAj%RG%7;))4untvE`G&mH)$(?C!kJumTR3SuCE zfSCWyX)tvJ7+Qml;9TR8L>y;{riAZ7FlC~g19!x+fT16507l)obwL% zuLsT_lr)9$y{jxCHy;EtKd}eke$J2IYf)R+Xj!2*sx7REg79OcNzT93v*|G^Fx?dR zR{)2TVoLdU{c-}vY+3A}3OrOAuL^BG1_#ckiR)N))IEg6sa)tRUcBiDDWEBroo-4w zwM!-n4d^jgv~6Xwevu-0Grd05s!}kKpn~+lEFTgEsZ1`ft^%E4+I-g(2lppR*w2w> z-*?w*FyYR-Ysj)VngktdDPpd9|Dj@=N}mYJX`4w}qtL$F;jCo|beTgi4p?vM&+ns$Px?w_hcTb!P2Ty?ZbIff}j8 z{-f~~?b;`==^POn)-LGw<_RuIxik5ar`$WLHs;#>CtY)v3w5YBX{v2mj}sokcD7EJ zqds3;3h`!$i_>jadFX`Z&+4qN1-v!IebSknd3jpea~D+5)zMK&|Lwg=S=bWU zHN|HQYbo?d&cef3LvrVp;=h+FYMdL<7IbxA0&*C&8+ch>}Sy%mVSK) z0-L3yJG2EaBE(@2Dy%PS9C at 6*78+q!ZbpGo#KY07Sr9DA81kpCysc2Xwxc+u?a06= zWDcBFad-bj=b$@^CVt8$QucOeMy}tWKC!di0YPdIYHey{Luwvn}|;`5ls5 z`b7TfB99qOUxr2O8(xt(ZXxR)@xvMq!J~#a!{Nq8{n?9~nHNSmdmo^3j#Y at C(1BR? zCzv5<*}Xa#K2ZZy&59%*Meap|RLx(TqA5}D+oBW`t`}Gl;os4yBP^DAg6HFT0zZ<7 zO&)Q-$S39UA2yG;pXH?*i`#{_&93rsYrWlyN`X at 4%-)=z_4Cn|+ zmHZ!MT9#IP4yy#3Z$-YJPc@%wZ8!B8p+}WyfVnm5N~(va3)q$_#*BDWXt1HElo^-# zPTdOu0pANlHg9_37DT`2hEml8Dwjyx$dcE-PLHL?VC`TF%hgIV?4=t__>3jr#hmD} zy#W2Svvth7OUDpEK(VMmKotL0XaBRSlj^5#*y^ZX(XO(^G5c!{#^&iqX(}nm(yntX zRndXVYQ1&1cBGVqQ3rKAw-#biV&TZS){?rpg{C(CNJ~m7DaCS|VMjP{_|F5J-a8!Pg?n1zAmh{f$D-BNws4Z@;t<6osAx2tGGr(S1g&QD1E5-0;(8FnIHdFGm?oo;jo&3G)ophKN!oA7Lv>K$8N|K8mn2S#C zp$AisuJWh#<{Y1H4ZvXA44=dh)$2tWvs`Y_`)|hlMpa|pZQi8EEKW(iR#>b>nL!&x zhUlqMlhUd&PFGCs at -yn+xTX~gW%K`I zJpxZUVJYydV{Lv(ym zW9zf-vFSxYiq2e at iIJ+Ri};cx8fs8UYeFH=cBEDNT11$;B${I*<0)np^OkDrN+>T! z66RIb=*cQllZRY;x2-?!A90SmJTJ<8RNd9~Ob75no<)4Z!kM(`jj??=M5Wo~6;Bk& zoR9d;d=6diuf7Itl;9oU=}oee at s=Lyk0`8Spg2_Uxpl`sC^tJr%YYLa{nsGO?-LsG z(;1Iv^L0&A5hG`!(p!|M3>Dzm)plH%L)Kb!O%ZXGY>MRjm~)RLaZ*ndm#GOuT7&ve z%&-}&cL8EpF$P#J=Dr`SW= zNk4xl3wW*y+TMLa+UosfVqJGJez-?xe#faTSMIn})ecPbu0}ySvg(LSCdP?$9fP0Z z)xMvF#0MkVSK^@8(_3|Exb+$s^kgsHM{`8N6O4?sHJlN&&OyHmQhYMcA!t|c>DchV zW$L(0*}f<#C|aSW7KeW(DgI4&or91ym at N4xR%ZP|5`f0S7S)%esjxT&qRN at Cpgz;r z?Lg*+w)#~eWwE#Z7||x`7UeP2C6$#(ilcI6E5r*;U69YC22r)j`30s;dQ?YlT)9X`PL zjL_Vl!&Y|=iHkeo16j5%ud)W>##e>;YphNgMlpIzt>iNlFkGx2K-}9)Z|A1P`M>Z9 zU&R)S`AZ*YG!L*;UrOst=ApqvduJ>7MU=dhl-xF6iSEizJ@= zgsB+hE&+EP1w8~+%nk3bEo)0Gp$Ry^=$7{V&>(5frzIRKn9%veo`{6iVI7I1&Fbsw z>ALv&hKo9M2Id)6)o3%%dZ=fP!Tye;0_jM^S6C-I30MHxSr7v!_x+OW}8v8;^)z)v{MV zp_z}}ull05G;Q}dmj@*G3~iys*E4T5zS*>td%vg!)Ay62_Ekfh#@&F&p;I_I)BYkT zu#LI8Yic>Iu(BvQx%6rK;d5=j$F!nP)#JL$+%Z%;3kIi#S&Z=ORrgld1cbZ$yUp)2 zWUvc;z5Z|aVoev_>La!kqqYJGJgth&p>m_Z(YTA9F&=J&IYpk2?oEE5it)ROSCIQe8Vto*qS3Y5}vcX z>x3&KzqAH8X=gT~0+YyFX1j*IQtkGE=EX}XlH4db;z=T-Z#g-LMw*N{N0)=g6?mC~c at Nc2H?|{)srciVSya{uvtIKdO%KUk{Hmz}D(N2PZmVT&_<5CFD!6 at JFe8_YP}& zPjoajdL^iklCV)Dx9<1JLR=c=H91LdR&>4}@TNa8C09yq&_6QfYrZ(0=B8_&;DOXR zTRH}PUlliC?k^Q at 4(e`hcv*2?LPedOqWE`X)l=8jV;|86p~ zHQP+pM5_J9ZdIPXS2Rjw!D}LP3w1w`RH9>dD+XCsx~FvFcmAHL!G*p-r>s)a@(GZe z`I&QM%VOqVj)0J4P%V~j at Xb`f2{9QHcbv*H#f3(bt=76NKy{pKiDtRZuq~W++~#7U zwSqgT*8KX-0-)x646=j$*Lmrs1`dpH?IXBIU9O at t?PezPw8KPrWY)_E08c$sZ^|PaLa~@60vt z&ie4Aj+uz$YVG(EFnN2-r;$4^Yg*{Cd$up&O_juhyZ5SwmK~1%?eeU&lyDK?uRD at y9f<1UMp61 zdn%s&E6y%qt8^z_dISIcHWjm*fW=y72)JT{}@_i z`8eg7FMjH!+r04Do4RlePZXWE*ddWJc^MtClJF7(GMWvg83!wCZ=<{43t7LOG`8q& zY;Zl0*`S?We9=W(%qX~3OZGsg at SbRmFduQtIq1G~XD3!-TE~nq=V(``+Irdc0$?k~ z=^WnXRi{%!qO^D3j8u2sLq=L&=xNR&e0!)xxYroCYdf<*!1~c|sGa;JkIv#RQ(1s?!@36U5|=q7kaZBO7Q?jYHTnQ?;sU~mp8MW)IcpQ#h-*C;r{Mw)aP zGnk{7v=BL5p{&LbW1u4UN~Frkc|g>HpO(#FmCtZ~b;s)MMgrCSfq>A!PgGw-DlbKE zNJE+`E?>MblZ3XIf3_?UBi0mNb~EB;5gGD0&9%m#!xKQcjrF=u&vKZ_?^nV{@8cCg zB*p=hYI%(y>k6<}#rmLQf+VRIE%yy%;|p=P>jh^o)0y*lpCI%rZ>39!UmfIih*_+9q&u`1fKz0R&hB(W^28K2`>^oGK#eaA}c z*3H9fOCkho9}Y*=h|7ETiV#D7eE7DU4(E7I!qF;6mma#{c{${6L5Ojp(CAaJGkZC7 zkZ81FpuM`i$9<;%2u*1Osn4hqHyoFKkDE^P`vr5+$?&l6Ieh-;?YV`kMgkd|GBrNX zXB-NWmJ;?ha)b4XDNZ&!kEmmIoT0p1WXE9V0ij5rD!S#Sn5F>ftW$=)rg z0>K2q3fArCUK+s>P2W+&!wyT-GW4cpX{OVxa#XAloA0}E=LXEG>@|~*P1QGKl~&6b zOHI~nvqDj^pAi1WwlxTX3~#fbz_>rJxaKFA4an}hsPyDDu| zle|!H<*)#Q^wn)R2xFaU at anhL%lgLkI|l4!PO!>buKy at hE`W0FGzLW)ebv7Y5`Aj% zd{OSWEP2c_e|6utFB$`JMOhn1d{gkkQObfPJ9xLhk7$7(3PGlvHaF$4|GOk at PwYrf zVWpayUx-NyHOoa!mP(Vgs++U8SIB!tL5&@jlgB<-eZX`}&e`21zn|)nZ at _O5VrKWO zDTK_SOpghrc~qhU zMuDy*2 at lWBz! ztC+ejK=t7yIs at pmA)okFLkall`)FL<_4G=Ipm!Xn22(7Qrhp{$O72EV1!bbVM%@6O z-XLp!Mjur=O1K|5H6?NuW&|a&Fd?_G67eySL&et at lMnNR1B@M`dWxEFIfxuxk-}NT zyqkF~tZ7m*N`TK9gG81fDX;o1Sy6Jz3JK&n>0iTvyz0K0O#OU6`>a#vo_iR_8WG40o3=x zSQfym6hK*OtsOogZRQ7*e_;(tQAr8^?-I5~&Phr6uOD5)-I!Iu@!vTNrZ=)WosPHc zu0F0_&md~_zRg5!gDOOa0&7Hs4%%zLimTwbT*}CMiSzK}@67^vyUPsL0Rcb%%!!Px z;K1u?eD8;18`+L}MnNg<7xCzvEJu&kB7SX~T7lp?Ff|oZ5)^W^SMX)!-RhO}5Fjp?)hq8Sy{)NhHOoK6M zg$cj;xV;RpWNu7mW&#p4Mcni8o3MwnQv0C{Z)-f_*s_bZN)E!$u<Gaw~j3Ry at nYLovhX|1c*Huq#bo?~Qcy!8s_EtF97_-+0N%+S7*~eAe z at Jv=u&bHjY8j~FKgo($0&17A6WLjk(mW#c0M=E|tl_QIx2%N37xy%+06IZQ9p5NdZ zk;0k5(q^0diipU0a1BqEYZ-ApYu2<#ES(ZzDW}LD#gDpTH>uf%+4NaM*le}r2{$dZ z&9z*|n*2ejuW)|Za@{LCY^6h97)}`Ly-{+=%tnd99!iu_rON}gy}W!=d!d)(6%-T} zKWcZR44t(lXl3{HAVPP at X}j7GRL#l)S-1;BEwT`v-V$R#nrha{1M`gK6QUR>&4oLMMPldRwBeo)$MjFgjm!E(o>=408J5v&Xb`9SI2UZ+a6Jmmtpr&q zqv6y8XCeH8%^-yN?-WEb!Y37KJ8~@5PpzSBkLcAWTFRVV@?H6u)ShRx2<(j-JoeR0 zN8-KUQT?^8H?)oYmhmv5XqyBT-j6>Q#RYs!t#!oMG}Y$e*KIX~@p(6m5}Ch|-Qmrq zQ(`E$T5?(N+G8+OJ(KmeF0clXG}o)mpXOL5#xjr22b*F$1nZQ;pH1Rcr1Ow{-Gjg? z3*3spfxT8OHd7ea#f-|7>z7D)T}%!;QwVY6ud&SSs&f%{{M_vwn#H)bE zU!N#Dsm_>syz5SF6S~h>hF}SyOm;^qu8uOcGx>borSETTH~@Yp2EoUE!hsJx at 8e0; zW(+V)VVa;0WsL0;!PI05)*g1J0Yd8E75*VoG2s1mvBk4o9IgcEYTXEkA1>`N^|QlN z^!s?wZuHQc9wWLkl#593hZMw3O;_MT0+E9ENZ`S^n1vL^#tCM5oIT*f)WWEq$?gu# z$}aD^!t$`+*L4#R%rZ(AfmS)u_B5R9miH3UBCnsx* ze5t!y0w zEzvNkk?jEmRh77+XW4i^rey(7{V at i@BCwoM10h%0cR#M*?8_Pt_zEvfdv(pEFXjrj zE^Bec23J)4?5zv!)AZnVr=X00 at xqLXhACL*U_msrF at Wv@fB_>e^=&uUX=zMeU28 zMTe7R471-XCt77;Ds=f`uEG*0^3n}-iWeuJ=Sy30l_kOM;q`s%3{jy(+B!(7rQN3c z at iF)E6hqt@!PX)tbH^op4Rw1btY4{|KX`mYZxp*@#;@5T=FmqQ(k>vx70WiFIbM3V z*6C|EgmX6GkzdEqqp`pePHGPjeFlG?F3;|D^FuL}=qIkCG9G;Wi{gK829mAvB_n04OOe-asr^XE5Jpl3okDh;uly at n=U**hE z&{L)87LDno;xM zURoWVQRMmOjYeb$Deg(0fXo9L=;t3=0&)uRIdXS27Sy3*5nnlsb)h7;}HqXgE+OKbz~Mz^r83FB{5DHz%EOLQtWrD|&S zkb~nw1u;2FCFaa2MJaYEOX8fttQNma at -(1bQsV3JC)7&6Q%07wy&im73N}=*Fr at 9O zG+Uz-z&Y7DD4;niE9h0;_J*GQxHGyxHNudvee8|)nvJvI{p^2V`6f6jmX^O#PmHE&{q=teEpORjtD at +R8Jpv{2jR9`Y8got6uRb+k+GkX z+98LBVQit~p{bX{Q~qp-8CPitF99STAa`ThnSaskYm-*=6R{K96I-(`=!S>s)x; z#Ibw3yP2&#(_TPgppGT(I!!(MPDG4Y?bxDc*KOHM5XIZBQEI`^-ugS09xVfJxsHBk z-2+*_DY1b(d*^AV^Eu;9sq-`3Ws8ovMW4h2Y2Mn{F)1}htXKgF^X|CVHG*bR%)oB2 zZ2*>2CfH24ap^ZJTHi z=~q_t``tYhu$-=UHJAnt?!9e4UAN(`zm)2CU%a|4CBlLRs*@ph7(RIP)+EL8nU4Ah z?LBY1y-s6XeFaN1zSWzNFudrW4y^em=tB|Aj!c34#*X?^yugQZOBK`(4>b4a0?zn- zL4Cd_jMCJIYY}SW10Fdz4)@+$N*$KSAQ|M8<^&b4VA9FCd723AYY4>?zECj_O*2w= zD4G)kU%>Q$;8l4)3rzAm7MH|16nwr$i7t6p)L+sPlG^3vqz$q_Kv>@_pqD?j zBvsb-I at k^BE5#i024}HDfCD;2X%K at B@tTNMT0 at jGgzFc05p?TdMLGoIK>H1f;26Za z3;HuXq6Po3^l>Da^fg!fE+Fj9|WaYD%3UEW1PY;xHG at c1U=8e!+#icJjq1E at 5IIQ37_qi<~fZI9boy6MYZ~Jk8RP at Y`R?Jc}n}_*{+ZmJj3p} zjhzuDHi;6nLH0lUBKO7=Ax=PZ&U23}nkAdfc6N<=SoMfx1SfF6a=@% z(&BCLxnZp5oRd$@erCRV%6YP(hY;XWk;?M#X^=66S&Mp77V!{@nXlz6F0X_K8n}|Ay2qC)8R*|w2um3k867zn zEcK&QxzkmMLR2XkhcrjDi@~S?&m3P#qK&H5vEFN=QoF_SP`K5 zN^}ZV0$Act3*13gt^Gn at Hb!jcI}VMsD~e*d+8h$y($N-J^xbrkI+QCC9YEEkPxH2b zQ(ITZ`Wmv5-Ec{CKIsT!XxOHf!AsD72Jb4mZ+!#ZLoUmaV{Z9l8caMoPDigyS{Ous z7bxWno!bB1M%Lm6CVe0P0NhXk0F?e`8~KmBnaVCsriQkbcIJOOK>pj=|7=TT?V_WK z`h7cXqStAOH_yU`oJCeEXD(H)VpA%s#4Nli7il>Y0 at q@YnYleJ!|ZII0j_{Tp`@a6 zKOkJHK}zuexJZ=SCQuE;N5Kc6EB*7T@$LAgb*M%6Wxn&Vot z&)Ati0W8BeqmXa-sEOwn*9o5K9WgP);}g<3$NUBa-?tti?iey*%=3vvk7N31N~Ui) ze3Wq-N}l19de%F-oh)OP;gdVTp5c=`(XQjM8EP->KsJSpEG0O&cmN!!jYP;=9Xbdu zEu|r2pSZsQYP7M13aO+LM4n1no&3JOk*?ZY3J3}3?=pk;F4E$dWrsIgH7UWFuL5Np zX%c6)8P=*o)K0EA{@*F3^IK(!gsHzH;s8gh& zBH>`dQF>bDXXgroabYGFCMy4R~eM16jf3*WRD4k zX2lpHmg*DKt+s?@Gf at KaqS85B)Y7%qN8eqRmguaN{Hw)QUt`c}Q%H>F*F>GH48ja$ zRY)vrj1G#(1LQCSMt z@^~ecXOtx^30yZGHze;j7ZJH)M`;7zqlOrDiidtpoG*$kWm&Z`w1;*{oGs*tV3eqeq($F78-7k!&%&QZMlHP_27$d35>^4HJPo#5GN}`wo9#XJHqTyF zU_YcsWWU68k`EX%&T-&hOw6>LsOb) zr!JP74G8te3ezf)?ahih?_*+&Ic^7=nR&Dd8S}_PSBziyEHU{3Y&WG5d9C3PThj{PKC1E8%LK*% z9l9Uk!O!N=IUOAkJ9WENuMU% zs43WNh&vzwY})|f7BO&p zuY=ABnOWofO`#Kq$#Gq70RO6`!=4*-q{*VP&m;KmL%t8^k{4hucjmMRRsx|+=*)aR zLh?DDi0x at 8+#YAQ*)ZD>$mzCt>fmru+!%b7Vz}}Z7X39~0J;l>bu`fLe4oIJI_{Wd zeR#lfTu>fF`jGkLkA5|3C-UQb3RCBQVlq`R;#!52a50Wo#Y!1Vy}>wM1`K%C+SuUG)DPy%Pf?fr-&%F;?qUI}j|qpq%0cPo_H zAu{kMjxX*R at + za>4@(*SR-l9^=z0Sbjr4*=RGGi!sI>I=ST6;=DKPM1u-5cv13DDfo&?vq*-h;1DE~ zbSaf+mh8US^(Z(9L+deCzwT;3J;Hr7h))^VJw_dB|FcvDpid_2y)?)t6JVbb at GF;; z5m;He2<$%UYJWY_JtvS~E!e%ABB|C}t`X3cIdy>geQP_2Uv9u2!9Ke+fIq?q=)J7O zJQlDyjKSTe!9GhV97tJDRmpeML#7-@?Wtgego7Dw+!ezRjbo?Uh(ne|^l-H?_t$1+9I^1U((~CRHH?Qd}en?~! zTzR&{ge*LNV|-ph*knXu(~82;=2BPP at gK`+$ugczYuJ{BQS$Q z;+I#dhLMbN;cN5k at 6mYu<4J9l1Al}c`I_Or3bvmvDPw`PbtVb)FEimIGvcWnoj^5R z9s2O9*X5l at bks@`|UI&=>90+YjY&SMw_v${Hb^S=I#=%!TOyBd6Q z5(hEIXw=!R%dt+ieVdV5uvxoe(aug$O_r|0s at Y?<#O;t0cQST6W~d5m at XieA=dD_~ z1^vEML&FmYK9iH1tarzb&CPp5LVxgGYCEd-wDN`t!XNa%W1TzlFi+&aurSA8c!%qM ziFN)R)1+uCFDW35{glIkNTFzJU3A(iQ25MBzG?O#<_j9?XMnfh;X=sXqX} zR?%De-UGiD;=JUD7>Frhj9$3Ro#yQ9+5NdbUAx2Q2b4Lm1d`2=APAfw!{{I$PC;-F z%|J5}i`W1;b&wzNMSY?|Q=wsMsXdHNYe>^$oB+AKvm)`M`i6TpGUxO+`Kc%nUVf-+X zNYUFL83L(l&Ml6bU&sqJc+bQn&~Ue2XSm>&`SF;s3LUB at Odb|zfgl`wKh<%l3jVt` zI$#4$xOiR1_b$2%Yw<;m{t$gj+Z2QB$mN~r)bV9MAgEN5+9_O!>+@#M?qbcFxI;XE z#NU0GHvg`C1lQySeiUL{dCfS?Yoo z`#bD4G$o at Bab^K3Mu1SQZ!QZh!ys(SqLjWe#f( zILao1-Bbi6Ofp)zZtf-8u;dceY*H?MAyt0Ca9^?FFb^d1^8nAz&tT=VJi2#E0}wNr z at 8|+ePX(f+o at xvK-(4+)FGHUX3;^Kaf0SqaTk6Tk#PQ!UQvd$`|4>qDk`5 at QDBs@` zGF-eD`w)cJCPoo5WRnRI2&Rn8gyX}8vg?TFB)KKBW!%rxAjA|_GM#Bq9V(D?;P7dx zY0`-SDJP=xXe5ax30H-go{#AA3J-dGvLE{6=;6ofCLxucqJwG=qymP*&@1Ixk z^|W{&mBIsvpkp9FU$H<%x=6AjJF!TKRG2I at b|s)v>=|j9dn5=krB^RbmaX0}f!R!D zrZ)5 at T`=X!cUUDRcB8ke;4hbPl%Db!(=XYaf!Xb-IW_~GM;6A)Pinkt_8dT3n at up~ zt_pJ}FjXZ?J8oyvJ+Ec$J+)QaSUWr|RdcA~gIb+LXe6c^$-!d^8B1{M~g`(nKtT6q8fLxHiH7+P8g zDh0<9f{w9rj9ZQu7Z_rYv+zV9g2G#JL at Gn!p;^53O(@<+^xGs#x}7}6?dIN%bBE=b zN|>+zI;g8D0BydV?h;hfMDrEnGoA`b9X44$>(C1RwUSN|H58Y-_9QlXKGXFkCr!JO zDaA6^NGfGfz79_r`1;!(%W1kMlRZ3E$0$CP`Gcld{MUdJ%*jp5NuI2v at BnfgA4vm+ z8-*&rG~sM6;qJlnc({tmVs36`Te0mHdwKE}C>8UX^@GhgT^0MVT?_wK?4-g#^r8^j z8I2U-j^i`pTf)0AjLB0~|rRLPv at RQsW~E=f-!!R3Ht} z?seA2v<^g63n9`~#nl*!TcIFsRncIV8 at QKEteS(781~!a%EQ(n7Y!}VU4}phr6SjX z*T86sc#*i+VjjF&D7_#ySM$`5e%N7b#W>mHy8$LSKu`UgG)v3J-jnC@%$Jac2)vaA zAqdvPF16<*-7NfSXfG>zb^HNFe%f{T>Z-}Eb91(*Rvgv9jQ at l zMsZpU`PvGwv@`oy at Ym#W2IOpp`20NL4Zy`u=uloQeQ|I(qUG2H6i+kea$x2;*=Yt# zO*Eu1GGhI#fViV85z&`RE=fb*DpM>Iuex~1MoEa~*&Fi{$hKuI2xv%E9PZo)RR=*1 zYzH+5i$S6tGUoMAZ6c;K`#+~Du%c`5Fm=&WlA!dFo=CIkBj1yp^qc0>LwqHN(<^#Q zrqfeAlah-1XHrSFZ9J0-G<}-1P*X6Y*+fwG$;wRE&ozrWWX4IQXmvBh2 zvrb7j_F2#;(q!J!V}A9L6x+3SWx~CzEE~^*S1R;`AWPJV$xj)jz%Qj0=FyX|H$Q?G at a}&Z)MS?douA z>ao7C%Jp`vwl-$Y2SF1H$dCHqY(`f;qIfR&L;m*@>c~g{dJPZ&Kpyy?O6>d(C)9s5 zIQ>_4^xLd?Cd+jzOT*r_rzJK^WW0 at vh@wa&i1Kgjs2i%!BlufE0Sd||;5Ws?wHa#d zap4m~y8Z0itUDdQpWhdp0sNYeieqIMsm>pV5phs$yf)rz4-2N{d^56%=~{Jf_B*}< zH!>Ju1_h}Mz3E!iw1HM39EJwKAxi3);|C24>Q*mC51D(uAt!n2Y^T&X&zwlol;}b) zeX2}8g1FTJ-m>Cyc#xq>1*!)cX|h3{v*e6~Q3dhgsmR=2((^KA$p`oFM7hDr)g_G( z7ugmla}rh_qMrOp3R2CNac3gs$C{Q+l3!)RTYHtZt((#7r)0<1 at h)aW3+bIff;O3gW5(eR51ZJa`gkelGKpSuuW%9T|4?^dBq?mxYO6P_PD(E6M)2YEL0Ul){ON zN}qIj&QzKhUoSSORQlrKusl9jWL`lu$gD%{;MOc+5TeVBTmJeD>3sgo9d3{tOYgvk z>So}<_7hgy7yu4s|vfQK$MYxe-Q&9&?QI;2M1a0M#O at I$YO zVYyA=d#5n{N&gx)IW=p}5$?c`chK>GF0SCju}J`1nGVyi-RAd?kwXNTGXM#K7? zrY%+|7fSh7vDsy0j7B0e8n^)QCOc|6Z2iV{Fugv}i$WD);XT~yD|=pG)%4-!I6`c7 zf6)h*JhMp?C`U#ruLC25C|%Z^!Z+^O~je&V#(1llU>@05U-?tnUpP$ zUqut^A)YbR#Io>ev-qUIH&cQpyqjvwh~$zbSE7<-SxBmcJDAZx3B#O&J7ZJcpdl_;O{#xzR`Pt1P%b8i4Fk3 z^MB75h3#z}?42!LO#cRD|Dz33nzlOj8tT{&aV*{FQbtFrEhxkKK9RJ+#xQ9cK?#9O zY_NUA{(4<91S1$G5FSuLHQZG%nkU|%lRO{j`JF>i3BFz%S&sfhry%&}n z%*$*t(O1>br!RFJ3kTDBnB6KhGU?T(9{aW`rb<`@f*EZ!%~?{_aNn% z-Mnl09NXo74^>7M&m3LS1clv})p<2)-54t}(xPp)gehoJL4V3xM05co_p!V3_RlAR zj&Zx>_QW?#J-a-~8Gf9~YB6yTqov(g>7Hs??5ZCbXazc(^;t^)hGHmEa|_}!)|Os8 z(FveK{hs9vP)6;l2+M++k5^tQW4Si!lk}E789!Jy35bjSl(n)*W^K5M(rhU?YX#t~ z=WL#$N3UKa#V?SK?CTcRtWcjqN?WST)E?m;u_?8nH5IKk=o>jK)8n}ua(4RqCSe at 7Am|l4kpg`}TCJg9-Edf=n>X~JoD=+#d z>{;j2z3c4IKgomcJ3QsD!Lujbw|Ujo;@0c(pF!@D1BGJl0qn*~Y3%{M>a^*~CN6Aj zz3?#;Qcv{!Mk!RkmbBUI-=^M-VfvV_tbEM#(R{$+4(t7hK6d*UO<-~dEg6cybNgLj zj~Ofsp?8=Z;pVV9{i49l6c`?GPhfS2SsB=1dO{2R=&!JQPBn-sVMb>fz=s(ZmKV1)G4byd_) zkUhmT$`|~^E`Iyp8Xg+*=eqib{Q^SxlcGt9aj at rvI-TX#eLr)3i~i5gFGA`9ACb$& z{Yq9fjF&fKbU0_u+=G3>7>6uE5zbcfha`pW&QyDbvhU?OWRkzb(0ZFCjIxgMO}Coy z^cPQ}lj_wULN^v`UtR3>cjSp1ru z>7HJlmbNp~Gcy48W>dby*9NGTX~tTrmg-;y^+-#SZ1JpIJ1foo*rs%AQp3XzCYwDHXp?$QS_-LDM zYl7OKZL4*l%^ioYzIZ?!ys%&@b>;c)o9CKKVaM|*!7}JZVLiHV0d6 zd^xzCr7jTt_k`_1sFGRum*dlr>*{n7KjCwG`tWsVJ7nJ-dHI%Z+pO zq3)P{k}^-*Xo;00>X^-0?ChW3UUn2hm3^r<)_2IAk~+h=)b{XNYvk{k^(DrX|*<%{v9Q$Hm>EF2%){ zr<5Z-i$pV*ib2=2DS`?HVve+iU zm#Ktwpd=_Lh$s$`B2*kVLr58i*_v=U2p#v+9S)$7Du6`%0DeOF0jGbVAxV&^(s=TI zxc!;Q-q7^_c{7DFfS1GLOp(D at XHuXuz~%;{@-$IoR$!ke$dD)dCU67hCsM(41q(cb z2{zzJgUi<2=O#vs&FSK4Q5y3dlp+yUkMU-T!SGn`6)x}&IU!pb9*p-k;z`sjfj7Je zyXtzN6{_{>Mrg$ovUy(*TlJUVs;`BX{urb8i1q z%z+Zzf$1?9JRW<(PkF-gKr;X_vq5Cqp`YDaXTn@~F_kWU8=~ZT3TJi<^y{+?a+E at l z1Km3hMyMBCW-!pEvkF9;*?HTSN)G~>y2EBbB(H%pdAlDK`mAw)RJWvP%ew?_*XpAe zCfgWMlu2p89dZrrAiJ*?J6y at 5j{nnJyR6Eq(kG^j7)J&DDzEcqamltfn6noeYb~I9 zZWRowp+jT}(hCT)`?OU#riN+JNao1C*AJqKolo#1;WhVE at hyng^$!as=TLJiv3-sy zbYy8!0$k0JjuZGBjq`Os>KYv10c=KOfOQ z1-l%>iy!`Om@!cOR5B#BViQ z`7t1&0Gi-_al{-s13*GTu?&pX*9HUwNQRNHr5!0Qj+;q!ibz|foZXy!6)y_uck`F_uX0#LV7rg~7v zsUCJjAQSC|8T;`-+rJpI?kY|!aDR0GyQ>}2ZPOOJPi%LIp5XD{jz}WjJsk0E(-*%) zO at 4@U>kosA_$UlhB9 at Et5VYYZEd(n&fN3I{o8IOqjb@?4LFKOkmy6&xYr;{P@# zO6K#C!r-Tk$$vO%e$6 at OqdI&d>LoagCh8?QoFeKaI;McCV z#-cKM at MBJ0WvF-dKQ<_#G!@OYP4B4bXCdd{}JbZ!RYMU at p>TmXb^#+9YEV{gTg z%%;uknDzyn%cn>rnP< zDNYP&i+G}=yDQoBBG5x>Xj+j&U0ey+Oeq+#jfQz6E22b+ER~C^_>X~dpY03zG#MPY zZM9`UmF!UrHX+J+6&hv zX_uw0e6oXwQL$22eY}rh98%dygB$$%L`zLuSHwz^!qsWs0-X(IHIYVZ2XdO+)+Ks! ztY`+w>()6<1F at kvimEuG+o4`~nAB$L2Bs?v8rW78L(Ick*#P~A!4 at R5QRGQoB<)D^ zYM_MDvUW5<)Z^M^O#^psjI>0ZgS;P+(QkH0wRTVA(Uu~!r(q86Z6tbHvZ@*ZqWCsS(wRbPfrSO|w!aVPPIkvznc#O~&^PKMpIniJ8QLP7$nA zk7RDa&F!we7^R2J#3^^O>>jl-ZmY~lBDK3{?MfFB(K;_49(b>Op+$!c5EU#dvGM|9 z;UUY4mh$lYD`?;vZMoXthfeO at dr>9Kl3KUAYt3$-Rjc5YS}0nI3rI zs%faW6T+Z3q^QV-SInMOzm8S`jnZ)R2#rd^Sd;rO>BI{9O{Xh8^zU+_+;7J#JxXAOd)vcWTy8IbSpsd`Q zB`G!&*Rk94k>8mzo#5)V-REAfIqKr-EkF7ITRo6M6o=&jw|4pL?}vZrh{MNxW%M)J zFMrJpJUfH}Zr`tn%g25N%|m#Q#_eOexBe8<^RqUf_A}pq at mTD~zZVDIy6*_Qx+e$r zzBdQ{xJL)RIcJy;@4I}>4(vO^2m6lnpOEPb^grU~`nKMu^yIT`u(ALfG*Hyhkx4S8 z?C@}AYnYInwDD%LB)`a2E3z&HgR?XRTMc5=-o>=nGQ(C1xoB?A$8UY>If7? zdNmO4Zv%R0DNMCSMan04m1SqiSF<$Wr$GdV88(RWM|^npdhjgw=+h-~s_kfyT>He@ z%!>?@7G7EZ9RJf|u)5S>^;jOIZr#10z{H0kKL(#wNwy-=$Vp|tv9UA at W+^CW+a|ZH ztDzvCRSKD^B4iq#T|QxEdoDVn&vV9F|ig?20ID)27 at YmHN#g^bNPG*ip z1C36#ByYbQElOCu{LOCuRxjVG34NFg{H?d|=YXpH>s#uQLpzCR at B=Wm?A{jMZR=Sq zH=#m~=9!@hBKbzLFjPzyaorX}8vQ=b&+<|-4m?#*d$+tc*}*$kN$%}1>lKnsUe#!j z<$AY1?pinnSqF8$%YG1D*qzF2>CNCe>)*&<_|DvgsL8U_5clwZtkUMpi&0jTYytQ* zwO?rxyQj~1;xrN~TJ!9=D>VntN(-ASAXxJP at v0tkgYN)U%nta2Da%tYo=_ApO{q<> zsWdIE76Pj|l#c)mfX at oWgr*;fR>n&=Bybn9#IT5;37$JOWngnB4dsuR`epRQWP#UW z`g7BUa>LG!tU{-XPC~abPCRIC%?|AXQ=&gR)(VzJc8(9>7K^4~qZQTJ?e&jBoipkn zE>BGrS%U^4r`RTMGNN!hLVinH2*LG7G;pvmT^=Uo6xbeAq%_x<(ESG7oMjWH{x;2}72vT- zVbp`*7;{P%`600_e+USFi2JM&p*f;^2tsR`9W*qYZp!G5;+R^G(7XtS~)SMAH(j75#yF8L?;O35<=Jhb;wEZl-hu ze@%VyQ`O~o1?IpSV{pwY!~wujblPv8baxIw3Ie!PeU&wD3?> zdzuA#zMs*yY)@?DeyogMJEKcGbz8t>pzEbcTE&auE&#jL{7I|ME=en>xm-l2*=`ff zsrdjfHpj|u2DDopKeT8(MZ%moDjJN`usFw44zqm`I{s+`qE=76ldBw at E1YyyG4`bT zkRud$?Z`uXr!O^1drjkW9<+2JPff0%E4ZRPN%^};PYy3)W}cQTEZoCJ+JQvGt=s`< zr#-##&TJJB`_p)Tg>4F*Qnir`C-W=$4)98^2~L_G4TevsJ3KGXdacj{jgIPh4-5V4 zqFVQbDj`#I1^RIE=zUI>9IRkh{JH5b;)W`mnkv}s{PYfu8#|w81!8t`mOm!-_=pI+ z=m at yG4Acq?Oco0FpVS(Y#l_Y2R zc=WKqKz+f!$(a|ts=8IFwlO1~KDgA%!iSvWvJgiw7(7-1th0<={u^?PJAqXUpyRWC6u_abwg*+D=YsT2+E3aPK|;}!L} zwJ$(}Fuy1kQL%Bj!d@)B^f<^N+_4H;dg-ag&2xsggK>+~R{uhhzAF|5-*78kRs$CbY zk|2VJAZpz%u at s`hKn4OovE)z~GI8vJYeRSOHfyIA|7QYRMkIpdUwgh~(pgYre9T|u zcAe#UpWbGEJv?2p1DMuao{!1Ef!$uUptztIPTER}HDlpfWGp3ymKy4X$2En4!osuC zFa->(|M5kvTk}MTj4(V8jUc*>fSp5B{LB%rgTQ?E+<_FLcf;oHCd2 at v2LGgOzub1O zvBL4{ZJtc1^JHXfunn75o_jeohZzd(OB~@HtOKu)G%q-OGb-Pxh;&F_yNu#&@brxj z&)X)SaJlvx?pA0F4m$w}R7OV&jqPvOQL^|d^{l?wYD9l6sVY|>5%d%vwxtMr6kXJ+ zlvtPLx(RnPA~Gf^n-AQ8tdiZ*<;I>r_15l|^g8o-xU~sU4m~t|)J7P*S}DNXG at 42d z&+B+raaIZlM5MvQ7)}U;l(EuayN5Uet212hH)bhTi6TMAjS at 1>cR{Yq{!wm zTt9caT|)1WaH?gPcApw)@Q|F)qKy)^8+(2Pv7i62rq at 2#a at E`jz2^J_kDXvWAyeBy zC at yK334zIK~OhfI5VQTMV`P9UmBz^=eT!7K1% z`5wE^rTeHDrB at iv&|l#RW0n?|z$8t6{uboIcZFB at l6=@vcxh^ysD{j$5 at CqOj+$OI zhG7RtmGpJ4rqK6L5?%U7p#BZB2Y-%|naYw9s~A+m!sTMOq$5iLhe1ApvnGeAOP@>Z zwu?$aIWlctmyn=AB9pX8k54_Fu&14|^d5ME1><(#ZqXoAuIT-T=b at m`A)*dAWwe^?| zC#RJlLhV<^M26y=0iT~eGv_f96w?w5BTUepvM*UfOUJY``J>Bw!?F1-wbJC0EI6}x zO_QZnTBMF~*jc0-muk~xa>@8kv!!MuUVS}m^_ at B&3L*){*^)WiqczJ+0<{)zx4Se= zC7uT>{!P5yXVJG(S(jsYVZHL0c57pyO;$Tjbob6Sq{Pu)ePhX}+$`1DeTAV$iP_1g zBtA=Lby{|cfzvPipsl5O*4Bqm(Uf9{dCMa_M+(xEC>!PG4pYUG!7i0{s)jpB653hl zxutAQqcg4}%4)B1mqawvW}J at c1G>0ruTeL{u*?wA7Gk{?!Qc`~oZgtvDevWLtxo at I z!k_8EH)4%_2>Lh;q_8ZiYz_G?Y3a(PfEYBgeTh}$}J!)V at smEjq zM_Uw~UuK62t&t=cZtVFtMaB78RMZwm;)BizRTGSFA7b03?+_v?VGOiA>dm={MYTPE zfpC63- zZ*v3WYT8@}@qR)}l%G8P>gWs-#ahlo2w|bQD20vc+bu{vA|za#9zmzUU)bG0}qckkuhWp8H|Kx at _Y!1pXWv#nF2pYLNj^Xax9FWpUz1{d(asI6Krow+?TpL zZi1QO(^``~lA2{{1xCAOL1zxrsE)6n zn6)lHvvkK5;svi#JZelfm?+nn7xP=sxFc;z*0xw}b74~ZGER^?iC|~jR3hB@ z<1!G7U8NbL{a`{O+z^Pfx&Uj-O7rYm4kErXjm7RGJkLq$qD)WM1j7o+m$pgv{4!6D z^W({DL8ZEtiLrBNdw<83s!0KU=DPBv`%h(ACMfNOl&>B;KMClY-3ApSh&EzExSbkp zSYw;YGQH{)+6)6i9LtnTo8HOkY_D3yw|@Q=!-9tcT!OY4g;kXS$CDac>v2EM7?R1 z-6DT&%#_-41Gt(}S-KNym*`zctaKO^20u at KVL^g7EDxNRFsgMmBw_X5TA52LP5N{D z25%u)C%DbgoG6n9&n1e8Q1P_~aNUrYrZdt0$zK;=$;;|2D~|qp9eOhrK+AUw{P?-_ z1JYvhrJ(%5_5qcGTAO)kz6Zv&$}Lm7pEA_JhS;5bZ1SH(ksO~+_FK7f4v85ej2 zh!$+10v4)foFRMVl`;hu at IjobVtS~sA+hNlUMr9k`wVOHq>W>`OT}3{((}fC%a4S* znphpceTqae)`R(uuvBc+dNe%NmkR-c2oQf?XlP=7DCdAOi&F;oPJ8;AQWo1U+2s^6 z*#vm!MM>G{p()7~%7dfTRsRENK_;*)bXP0~qLGlm5q1g&{9V>NyzF0ocF$OeC=URi znKAFk><_4wS<~5z4U8FKhF?zh%&BPi!k~c=ygnwKUAS)`e?M8Zxb&7|f1=ZFkpFhv z%|A}oKc?WtZ_BO!C2aaDk4Tp-*Z4~d+?g7ZO_0sfO)#_>TdAl#0exVydSgN=N=e)a z_xl#KE3+kr=TF{+#)LVj69p7XzNgz~?qNQ@?yrvzupQp!3XPt05D0oam0COF{-NS1 zvH%=RT2<#vN>U at Or;#(eiFuVmHa$if7rICb>q+`gODYH at Nv9EotyNyr+O|=3!L}|H zqu8hrp`05-nQSe7D0i>1rio?c5>qiI)0K;m(Upk!@8Ln>^A7nPNb=%aF7XQ`Kl at h) zCbKqQF%{(qNd{$$DVNpaK6j*#V=>t~l|i}@&vR~_t_F2P_1p$r2)j&$g8HTdR0F=x z=W!&z+HRh at JURW$yX90Cix!p78dp)`U6UdW#z~_nmpsp|{1Dr53Eb_9fUwu?5Thn& z##}nah&Oyas?7;DCuV{Dam-xR&ReIS`&lE1?isLC$a~^r0#Lu1YG6RKuYqj!=E`YX z&p(>#W|DGu=(&ki!`BpZ-JL|JrA|-02^|_6SnWZMx at rO%*C0C24IVBW+ie3ggrF9B;x2+SlOZY~0ptXg2tCX~$my17k{~Zeg zCWc`5f8pTIE9(Ebi1N2&b&{<*jwtHz7s?#XYPEn=8LNhrupf`YoQkdOJOtEt^vDIa zpXdv1t2Co?CgfLkjXtRSem^Sc=kR&Ox8L)4wpKT3C}WYQZx1FWvf7_NuO_m%6S}`% zf6D`L+G8oVQ1A0xjkd%<2)&66K|>2^MH#_~5+wz0mN4NP=?;POp|sTpPLtYm9OY8FtvDzL}M%E>_Vtt$m+tWm;Z1 zinhWsx}xrv>#xN^AIJV-dY-wQ;gLLm&fWmGXlJ5c-fUc!ejiKLmSi5gj#tv-uBLNopla0)t9YlgkH>C9+{zYc9JPksPr;d-uHzD at ZwcA$ZAD6NFjxoMFlEoJ z$*16}&>*{5X|9e_t~%R&eNtR}EPqU?mBZUVDEK{itcN0div^(8W3%bNKhGiJwQAAS zYKvocgwBKP*DTvUZ|5{VYb~n0&$?!Q8&v!YFCgQ9^wke at FCc)K=aWB0hjHR~0JgJ* zt_`=p>MPqdhw(jm4q65rL(zb#Mb8VRwU0ZwI0ZItbCmtuTa!kwx4orwN7{>Yx6EJn zg7O7>TjE8nm)WaCKvdPgI5!vvdQL+v*H~XjS5P=I*dK&PeMTf=_l%)LoYgh832l9e zHjh>d{nvnz3=(O90eA}9cZL#!ZxOKf!n%gRVZu)ZXMWX+K{_7RP)f96(q9StdK-PG zVCxupZoA~x)wP2;rTodQn)I0PyxfLdy>JNhiNM_sTs|L&*ZeSb-i&QGF7u~#(q%3l zcww?!etP_P-mfi!s!fl2hbXSjo)r%?ZVfu$XLmb~551Tc)lah7wz-E;su5|YRkYu5 z%FgP<&f79K-1ZWBa-ZdFDh<4w1$p zrCWD2-%yDr_n^IF!sedbpBaSs3Dfnw;Dmx=@{zquEq;dYQ61@`>c#>c($c19dqy$q zibUt5gXhLev{L3(EdQcHNP2}+!YB||O#4UXMc$pqzt=h#9gIUS^%f}2irA=X>WD-`Oxiz>|IND`Ha06)U8LrB^{eI{Y>54ZkAM+QvG?tDKlgyH((>@Ee zq#92!wXU-%$};9GIxpwcQjsEU`ab&rn9>M6h9l8e*-xdz^ytVkX>UZeS6yL4Kx_m`QArQ)RKnT^!(jg_0=#c_nPUTf6=D at k@buJ%}2gxmy916%wtc&sN-iqs&@IS4FXzyia8za?!Awc2Xn(PZAlj#x!-0b&(QRr42I#{p_J)mRej z?i7`J%F=^2;w?>93`6 at o=OnQZ4VP}nEySC$!cVyGg7!0s}U&8rs;UkTG4QOu)`Af1|(K&qar^auA zqWCYT%4uXL%xQcjAxz$a`eP4h-n8?Wy0Mml at l0^@6-;nSLPONAEC|1u at Cx>kbw6S} znENz9EM=!~4&BC2ZSRP83-%5d0K*F{$Lx+`2AfSt3>AqBfMNq|x0XohjYt_|#Zl@? zxAJ~J7P2C z1%VIKIrMW+8Kny-ccbojx8mPWtUSd-1c6sbk=#Kl2w-_l5ZsDOy;w1w3*=oVYbO+# zyaHldoG+4!njZH^iYM`}@|5R9FVv8~7(1dVK!Qv at ibl|kN_4j at J<)R5yXc{o0B`-FpE+5vu+SMpKuCnDrC!v^4vGgkx$Ohw7~hRb z4~~wT+Nu2aoU(3a&v8+AB6Gu+>@RX(jPNQJl=!FI{g at -IR|c||-W<3QbPfUPoYbV5*N%I9u1H6E6(2?3ymwAPwJlw3htl4RO|nT zV-W?||8O!j`S*OAyoy81ePQApa;@40-|T4cutsbeSsi%)KJ`{0(sf6M=@x zpeTmVZ<|JA*cONtyjQF;XTx})e%3 at r+ulZsSq@h=V2J%n%(v?!F=8(a!DDl$vGzsI z at PmuVFm<*4;!LE`wK{So+Stb>G2PB8T9yVdu(Oned}}w7AcEMw3h8{%)MOXZSHLzm zc79X1Z~Gn==57GrbS7D3MKCkuQw~hhr1f@^3KvY|u!`n~RMl2r+ffXqnU#0J4`Va2 zb_zcTA7qsQFKkyN7CBZYw=ZxZjbruNz_~Q_3g)ILGCD|eq%&b$8weJha1A-cU_E_b z__Vb;{d$TOVC;kjoJG}t^B$34kVPl{?P+vY9I1Ckd=nkl_5vs(3+vXcK}xx zP*)jUz at L$F1ymf${0RAXJoKgQqJseg0r7$Ux8sukCp`Qk(VDO=ha!kN)V)flYY~x1 zrAjH~M@)-h7s)vELQW~tD5)$%DEna7hPM`UDZ|`eu~YE^v~`9ihVs`KvFuef(Wux5 zBe$uE>}&SzG~WBm_v0F%D+7`M7IeHsrrO%XUbqeC+Kb!^gTY>^{<-=6JZMq3^Y6$m zRj;FVxN!Rx^mG0Qn2vCiL0j+u%op&=ny~ctr`2`4BdAN;irA~nsRQN>a_W`%_EQYy_ z2ra2-*eLd`up*3CDL#|bxV=evdg{fsFNp%wG5snwI=OU=Vc}iT{Pox)nvY)xNvxPm zo>WWOE4NXvj}aT2daE-Em-F_|+L7{|5i3Ry zQ;`ZCjI)wqQAAP?v)t9nZLm@%Wh9*tS6rtaCxt39*4rE- at V&qoRt#yk+U$ z7 at Qh*;u^&$;yx_^fldHe78vxI2X(LEU3f7AO4K1b#(T=`!mIns>m6!`&d$@`!39cG z$H}2H5DvlJ9)n$X!^l3E7>}tIUienAF#m$l;Zbfsme2Do$wcE)Op1>m8_vX$5S)>5 zu^L{)iz0qxg1j&Rt{~B{wV=MlgmWpGTWZvV9^I14(xDyaB#yueZ)lF3V{VN7 at pl<< z)#T{930El7+~GOg*m1b?GY2!DT<5K0N*8x(I7ADJl!nm;vo9tH`nMeJxWYiEjLF?-yFk|{aTTWPMB2-OpEVkR)7bd+_CA?L z280l0)-7S&_XGc7)c(X3=ej}rV_!LGcez!&Y4NW^q0V=DcY0}Jv}U+zd1?qb*&QWi z29*gkM5>u{!?aYUJnw at OqGEU8C7rME4fFIv``{t8GwfV&h>XIGd`^3Z4xEZoV00|? zGqTM7*D&+(DL=0u-^?^L+QnM3!`r)oz-aMi<5QS$^ChjT7$yGg5C4sjfG*>%q&ZK2 zFc at lZbXpyf7t1^e>uL#WwSzgD9R5-BNpuvxR1^%eJyxCUP&bNSn)h8K+cjL|6dzjl z0FGmZ&Qjd!6$dr6|9+^}f51!T$G;NSf5MldtTc`y zDlh$g+NnxOQ`4-^_XxW9pLp%m8sQY7P>QkPghdf4CKAQpnPahF_6SC#PQEMzdzC2m z5KdyKI1RN)=XPLOA)l7H zXwIidy@)o62W5HW?gU&Q>;V{{z5Mq%?o@%kx{2L+E4GQ(?NZ|vD%iDvlVx0|luZkl zadKQiVbdD(6Z6MKPE*C%9r%XK6ZC2^$_=E0o-^q0Dx3{>lVCuKgUWk`I)R~7Fm5=3 zdG&1L=&c&TvzCZ=%2)zn-)L4AC{fl5TE%=zUSaYze}~Pns*-Xz)7_fnJkahn-~KFD zO-I6^Oa3M{rds<|u;CP7EpXr5jbTRi3w~u_a;O!m3Y)t1f$8{>_kD?PF`b=4wi_?! z3>xqh)CX=HQ#abuw_>DYY{Oj5{KPb8re^Xd;BHADcV$Va(l_x`(y>lhu^RH3f6egD zR?G-`qvX{nesW?R{$eCgW;P8${}LbmylSr2Ud`Q6_!w1Lu%j46L`I23AVD at q_v(qo#Glx-X^Wpb z(}H~Yc_R?H+kK;nBCCQNb<*IQ2)OFp%aO4OueJhJr&Oy4E0XE*hyI-6K8(U4X|~rat~8h)>(x`xTu!$T&~rNR&J!+Daw^)p;PYZj&7I$eU%5odigA2vpnMyUURy37+Us}v#UKws*bz6!*aF8t?#b8f* zO%zavTJ5Gapg?^ z*!?2tTRg4@=n1~`Fyyg zxmZ=#h0?|?u$x?BlKfo&(?AIDjD`^b1 at iU~VXz6fhCsMoPbvOSRdRlk$2bM({`jQg zV;GYeL3|`J$SgIR%zQ{D=yE3^$;_ at 6d<0Y2YQqcOe{{??PLD_#r~_H z(Uhg+wUq{Re#!o3DZE)bbib#TuHKDHTExj8u}M2laZLHKNQ0#BIHMKa^Bk~Fj&cXlUn$vGCQXu;< zn-q9ju>(D}TM{%<&eDIQL%>*WN0j&mx#sHAZ*>>B(%mmX8<@01ZfQCG77l#{U9-8cU6y0qf6cGDed7T&t76q;jE zCzv7vi$WWb!tp{SwsGNmIA3X3dfZw~IWrgp+D7XiNI)-eIaqxBy!seXLz$K^Xt!mJ zjyK$n>xL^44i>`6f<6#a8obc`685M_x{ji?U$S#<2hKSCNgd+NRJksD{R10Kd#@f2e60AiP9ar z3I9cep&>EU?(Ri24QW#(mpP$=@sW?k_vFB=+`;UadB{2bq_898kl)j0Ss?<&{IR*; zF>$HchkI0K&<|k(iKcSd6iTW_dq3)A4fX>5cN^(R?z=1ev5^b#f2HyIpKT;$>TLLr z;-BL9U#8(TCa9}gdutAT5ontyq|+T_Srn3yLI!gnvcwgVil?+yI<0BF0r{Y~g%95Z z<+7jd?B_k6$V#iZj*$max1e58uC3YmnRgZLg?yuj>J+?2JN+>p$A6EtCYNod*q4)U z$r9O`Tugl5AW^6sjH2wgup%$K`1PX{ei}ekffGD75#v;UL6ZkBf(zzEIU_sif)yPO zmdy|4F4obo*M)Q+h}-#^ic(glnS5!fx81DQdF=N120#RB-h3J?G3m0#v9X~=;(K&nM=!LQlpqoK46DjMN%rkp zw9W{h&r~1OlIh8mCDL6RjUkgOEmpBlzo2aG5;9H-Sc%cJMF;5-1EQ^;6oaaOI^8-} z5L>)Av!~wBMJHvKr at QB#oG4{L_c$kmQC?y;BZgCu^xD>dNhMq6diIKG0rq|MF%zS| z0k5rmnVoj6b1dboSg^S91%fi`x37=>gd?nl=0OU6u_dNc)?DCNij;B|4J&$Zyp}a> z*BdbGqiMjC{Q$_QecbweeFYhau%B4mC%76hy+UziDD)sOi_OeN at go@{X*8A9iqdJj zmaVaPkS^L8)rDcs3kWuvKXwnn-}4XN+eS$Be^$tUti<|1T1d^(=`YKO{cuzj7ns|l{-N?lvt&H;& z4a|Nut;u3y88*rkV&f at j(hbdeq&W~Hmj-D%`75U>PQj01Um?Ud7g$A!gfQFqiUnjb zy*smArzohv9v2W7Fbf|un7sA8d6FHtzr$3Bx#Bti3*idov3{Kr71adjM3%r7{1879~ua0{qJuI47vj=2;K5F@|lc<9D- zsUnT@?^yA932DywMY&ITi~CzaC3YSQU^p0UP^wdc>bfuDn%&$egaV-|7*59-p54RO zo>RZiueXzCu at dV`1QsOTIya)*+$BASbo?V)~F#BLV zw;>JL0%I`Ul?5OPU`__AJiLI at PNf>AVPh(PvQh9Hfi^a{MT=*Lj2UMO+e<8}dZq@{ zP_s?;@|&5U!AGH#SIck)H5%z9%wu1QkVQsT%8nP0b&Y5EaMx(zPRW==3h|g at a>|CG zXfiysII7QHHX09#J8#ySYL7;bd#EW-NS9};P6*aBiZ6r~Cp}9}w^oO_zgFWeoA6?E z$7icEJsDJnUq$9wI-}<}vuM+fh$=PLP-Hj?)r`u=_pt&kC!o$B; zWZt_Yz=T+tvFo&rgfiL0Bb!W%F3xb`){v$;&Z!Nl%tK3pLD_DNI9k*I8BsZ9n_po$ zyqeDQ4CNU&lO+_N3=EKRE|iG`vMko4WxXP;VktUqGTV|qhQSRPdqy}B7K}DC+HNJrsnRq)}JT0OtR*P!BB3#-MGM%Y`71zU87PTz3COnW04xAg4$ zg at ypW@4;Xa)9vEHlRu at Z7avMvH#P0GmYUxc=T%5cH7h0dk80g(&PN6 at 3Quzsj|xpZ zS^8vqoW at P%S$YaCt0@!7Iuy{vk8Kb~&1_~k=rrG*!%32`2rt?wySTb7p6y5xS;Z*G z)op?w&B!=%e*s6WHJjzxcvDmF&Mhb(RVwJsUW?rrtb|KH0#SO6+t$dKN zs{i_Zt<{{b^-MZK<|kMDP9^J(*D$!0OoqKN)XhldcFez!ROy0S5BFnSv<(INH%Ixm zLY&b!UxGF&TB0%EYIZp~q1f9(BLZ8=3uOvBbF%a7>PtYkRkoeH zmeu|FcVpg`!GXK{46JKeZ%C5!KbLk+K?x2skSK^=$brKYSRQa26uUtAkfMW^Kja-; z(elz%1I^V4Mb4xVS1pB22nzbFNm<0wLnALriULQV)4xK4y-QGpzdm z{_5vV at b6!vUBkZFFX9_2(R28+caGJzT+fWB+2$NCpt2Pf8K+m8g3gXua1|DA{9I(4 z8t$fu4i%>1wfcfEtK5-^=f3Qh*W|hwqsv?v2>mcAMqQ2rn(BOLD>(&`go4|Zsp)MQ z4xwW^oPaN;kFK0wXj at g`eb$bw^?f*Qt?~c4U*Rua|3-AhzW8V5`R#w?_5VcYf83g~ zv*RC*H+TO>T3uey3Rn=al5Hr;Bh-!GfQJJBQwb?Z%!%o^f)ROcf_a)1x2YMRKTd=& zQt-WVj|lWOw#yk!)J5H!fWI3^W>$Vic7|l5o4ecH$Y<84zqk at IreIO+y23S$Mp4yEb2P&Yui3=z%$gEVh zMNs>tsurEgKOUv+{oCJn3fgRcG7}UCNEHeQi1xqVDbc?k{;^&E{xzyPia4rIa)*sX zaySxbTzY7;5OSz(9+lhP`f9_il!eb`3$C+haj)&Zr zV)w(tlnESBpq2d8)JB^7Q5Vni)TI8`#~b%g`C1$iAbn5EVp>C;gs9Qo)5n~A6ZeKhp@`_FG+?zfBq$=}YQP$BJ2*a`Q8-BbZIM4- zr-DJd3)b9^Bp|0ROW&>L6ehhK8Qc3=%roU8CMY#Hp?Fc1M}8|dLHC2!=kImvc6GVSVv92v(iR9USVuA+;|hSIIhy)NxMvi$Yp85l}52Tiu> z at 4%(wH5w=C*N6CW<0N6!WK-jy?&9{*vh zRFCpHUh!WtN-N8t#g>&SR1`JC?;4BU2DS-(upCR_#^+{wLgHTn zSwm-Zx-h5)08y zoU_O0nz(zv&>sA*bSn5m)vU?O%Ze>IXK5nRP5Uw9>&kYB at LBUKnifLU?7@)06m^nr zv;2ow;%Bx_YJkx+_dYkV^0m0Yi)_~OXWFpK+Lf20a1q|DnotYa_SH0|qA1GRtcLTU zSq@%$P(4a=9I=~8MYdHzkUex4HH*tc(HCV^37x49>PiD&z9xtdA9 at nwK36}gjjulKNMAJ8I6)=SSF{$1 zjbz`+(6AU7PCuzx*Q8xpLfIM?8HQ5uFIjX9^FQahZHY0Y8&Qx>42B^WFmlSom!)@c z$^|q043~hu4-sjI>EhD?DM~9W3B0+ajpmQW1obBu1)Zw8TTcH{xnvHH-q z1hW7zrYQE^qIv|ysvt&xIxji&A8|p7UNR-KW(Q^CxlMxBTGl6I{=&|ST2^3#pGE)7^>@03UZdv7;ShN_888&zH_Z2s z at FjeJC8FyTJfU!SP{KSXED12e9|B{fpYJwe9Uy{+ePCbl0~0EmiNX at vED|t>N)iKq zE{)j~hreGL%7=7MExjZ|-jj$;Mk0cXPb8vsm|N)ssYHqwS3-15FrlB!dQil0m}eq^ z1oqe-S`>9~aHMFoXCFn~mTwAt0b?WSP$+-a;YR)eRy}1ZMm>`o6##+GVJ99mjUk?>yqZ&yb(FB}jNnJU*o&*9WnkHE)V|Ak1Rq zfxGEgCa at ZjJ7^=~b|_1y=E zAKC%W#fVCxLIU;u?Pbd;rsjvw=i3uV4_h;K>8>9Pge=54-IzsNAdmCSNN;cex-czw zyyZDo{}JI_0^t&uoQS}YNQFQqWKxhj_J#JoY4(+ZfIL;&B~#-%jHt61Y*H6KOmLE) z%APJCR1oKZq0q>gfH)791IeWaxLW0Ra0bAS#J|)-SkMA(Xya>}WQoV?Mlh?JxdV)S z`T}?oBpFb#E?I(^)Og0>NY5s(pXp?8(kmQ at C#L8WtFl7Kbq0F{0W`!Jf?sf-0c;0l zkioCc=@Nz>U-bRZ4k29ZaR5@=$K+|4+XY9Z*=N%E+L4A37gauC$<~nm&eo{sJCHt&3lRRpJo8yR{nT|qeSR9zx`NL*zl1gO) z?ge5OhV5U+dBODazd&PVOzZV>Md){2bG*KtXXibnsgdgB)rs*51fyYh_POrvW82Kn zGLDWj at szAyEp``t?7}9=JKYk{4=kJCvP0)&eB$43q*Fp!H1jQ9sjD1I(uJ2!Nl-DT zueT^qxH;4aT+g>?g%*7w4&LMZ9WuHT#%Q;HAma=AzlRLdze1){dED-=zNdr~l>IqG zt*saV6#&pSJph56>KP9bCC#BC?FkLh%Fp;WtBJ~`j#Tfu~5=s{t_PH73tZTjKqjapByU5 zGoT@{vJ<73nzoV9$5=l&+?)#ueF-bQ^~E|(Hro+RgxC=9t{(qeXbMAob(NHwx&%a2 zCunQ at Ht&Yne|y>wB0=PaP=D<6i^0 at p^}SBc>sBNkPn)Z1i=|**?3$84T)C|8m^fp= zFUS-A%z~q~u6Ks|YPMIja%PvN at fNniR|hrt(l?E=U+WvT at akpsOtG}-Y?Se2aT=wm z>6=X^^KfdtZQ==Oq1zXX#x-Wq^a8bE*c$dC5P^NR7WuR-O at U~gQL((Lm|;ZztNK^; zU52p=AMFkQ)a^O*r>}DjtRB$72m|#2 zU}&WxAQ(g#R}^!5a8BlUf>)#g-yZ*vwiAel0)^`qm3*RzmAg*2>g!ggsg2j)clQ`S zX)BWz2h4FuCstnkH8YZ((2rokjX9EiSnJcASs#EmiZ9q0pBOzSTz|EF?)7C z6r at BTh+>Qd(-wW$D(z4thwT%Kol=#CCEcogCb>6YTA at 3ZYYn1y$I0Cu(g{jKsTaD%tX(S9Vk6uhMuQIkBv7S=e?t9Qir zawm at cEBw{`;JU5n*N>jT?wv6=V0q^N>lg~>fFD}{mdB%&R?q}Y{82HQPbjNWL$Qjs zPapr}a6EIxzCb|#b;$nz76UB*z<{c*GL9;ykDNrkqy}_ijOBvQ3b3pMVPkWtUp{IX z7)Yr~c{A1c5sQtkD{}^1bLW#fU|(ZcP&_MdzY(3DOV525;nrLur$I7SfGc72VA69d z=J+=cx$oEeFf$NFExtI$9TaZA3h;bOd=Ko_*}!_L>OncN6ZY2W0FN0;=x#dkHQ9-? zZohx9s9$NfrD`x4XfRB1dlGf4-Domry>@j%!us4TdwJ4Ehf%c}wX$<+Gwyf}l0?zk zokR^(;PFO2>It1jv`)31t;BV3ouRU0$4+{1rx_rbYdOd;DIN&)0c<#KE7MkmDn9=H z5)`*>;Cp|wH7eLtF|=EhEr~gf93 at 7NOp$eb`H$6B)zf)4qfJJc;7eX3Y25z%;MAik zH7;$gg)lI`SWz;gwV?nA8->-I)Np~6Q?6oiZ!7?$1uIx08mfDAoS|xKHB+C8i){p|J%0O3vMB-l_b&X_VLbfJ|*_)cp8Qf(>tmb9meDi$vTm3qM7 at YG7CJxBcdw5 zAGav%QklB;DU3mnS936J3S-Tx3l^pkf1y(gYYC5E6que_^dDeju6jo at 8bvA-6w`%- z8K_}+m~qBL94v^`ERbUpOxEtp=UzACo)}D8 at Sk$%?K6df?Cf%Vn96{6*X&0LJd>S< z8DO;p`q6)a{GCgb9|7OA|M-(=;QwkU-2crb|MH-2>1^@03wzdIMK1+J-udFFsMG#8 zAHUp)=5Rqob}0<>BB9wJC5N=e6gJXUKb|*zy6~Mogqwna*0RloAW?9$sSR$YqlwNO z{c8fCsoEceA&j_lVR;N0A3!XNvgD98*`XUtiZ+tE9gA?-p(fXU%mulh>H050zxgX%wJ2?ncaijw zuipkL;XK&XScg=P`NB5=PQ(JGr0y?<`k!Pv-N}m}wX^X={i*3bQ5~{G#P3-;(rz)o z8_I9AS?M^axtAxi7#b{#;J1a5qB>t7O?@#3W2E}B2sIaH at 7sUl!@apadKqUfrC^Pu zl0pOoI=Bd;uE!mZVprG)_{;2 at _+MDBX_@Go630SBd7(<=i+q#v@?o$wt^lS~ zGNurvS#*#FC9|0pGBKzXSgB7MoP zT&!Po#Uery;kIpXLVXjF6#5P&NGyqnoM)izJ=*oXB4g79fv~yxseY at fsR_*X(((ch z8Y+%z1*EFers?UfyxHn{yg^M_RW-Q?Lt#Aaz?9Tq5#ZVtNx9ybZnDfSv8M>qh+WOviIQ z5B*AD@*)oB8{eD5`Y{-#^`Q#xn=rk-`2z7-wyTf*c_{|+xj)3!QMlV} zS2;X>=PpX2mvs7d$k1zj=dP=} zXno*d%zbJ%R#b+4h;*0Xme#xC>Rb7v0Oo>h4Qv7{`KlicU0s#v$c(9*Yz0 z5!R7PuAEffL;SAu=u3>Bvjr7b9vP-OVhl9%?C2hkbjH^GmQATpY{yLOgQcAit&x*M z;_X022t!C}>0z%>3)WO$wtj7l?Hi-NS8hNI*NevJ`Fl3CG6t!>^<0S$LMoKG at XZ)Z z{x zu2DNxY{e`Pqs+2+{EnV at LPFcduqaYPLTatyvkf!oCEdHVBS?c(q3ajC7qEwq+xI{E~UT%8DpUF zR;#Qu-epRZj~WGv^1d~}cwRg=t1J}TIzDq!hUuHWp4p9~Wa?zt<(aLV<`DRp!@^tq z@?K-8yH z|I#S!o&ytx4WwwgIB$KfiNCZIc_Fm8%&Z=RpIR-gH+2a;yTw)W(8TyRB_ at aGwp*u? zU!tEc(o)2$Pd>I=#;(I)bs4>nNI3Mv)P6>>SGEcvzD^G!OCR2NvSaMd4 z?e}J85gwuL at O;9_N5n|hhFhbj^~s2IWr1Ldy`qXwRRrc;IzX;XBINsQ1dZS3wzSMd z#M!;DuG)k`!m?q*)Xz?YW5k%9sS4A$&}JuKIn_^DBEnsC!pC1qqq;Y6_CJ4m$kR;- zB+E5eM$0)_;uAcWa%BlRv2ZDq(@!oN=1LcUanTlvV$&{JLeVakij*i(&6nzwKyQ>O zlhV$YN|hX{RLw(cNv7I4ah^6xCEpDNl|@hQ-g9M;^H>>xc`bdL>R^;q?H}G$VCxRsg zFn4T9729iVjy_n(r0X%5C;GW`1+-b#%9SBp9Hj_+of?=(v3O?>_nJ9F_VwkJHtr at 9 z)x42i6C=G3S3A+$B1<(Fkq|;aeB4P*bl}$m>WE9_6V5S~N=*atjC4K0(A5q>Pi_teH?Qs5qlYDmG7!UvlC)s)x}z+7 at h(>i?XyKV09E~GybHie#o_)6qn({hOrF=^|j>MGWmsBLYku`&b<5&Lg3 zuSX$Go}CdsRv9Ut|ptsmGLYt*cO#iV6nAaJTh`H2E{#{#}!AcsNO09qhM+H!gd#C5O_+i!P*X->!mFXgcna|d-cYX>>x1(6izw3_ zb4xgtzx)=sC6Nt&$$_nU$Vex`$_Kq_ at Ny*_0%=%yEItj&mR7nDgRRLh zJfDh&dt{9uP>;_aOcS%WkH&@oVXh$6Z+K1wqgVvP2uPh`_F5{u7+p_6q6W8DsZTGkRauB5cn(`!v(6aQl*s^y%BtQ}gROu{*QU-`4QdK-{nA5*urMwq~J={<^(NH?Jf18|BBfHO$C&~o? zUIj=NzU1_RoZcq^_{DiEVs*w%YKBY#*sBjDEJRVZ0-hZ=XpUpsp|8!Ij+wd$dLT5} zGO~b=(P3~AstwcBnVkuaR+)8JrG=KU zu?St^QY at a^jh(Reqf24MSCG=p5HI+pH9XV9{!*O2wR)n3n7&r*)(`J6G_SNpU$7!T zlJGq%+k*?s9vt5+d5gxxp3u7Ax3QtcgFctUf*o&eCoI_8sFpAgFO&{wsi;@$6*zS! zmLi({f|j&zsnHP&<-$KDzIk^pfWs=obMK=cjTqro_YL1dEy)o+J7&bX%1W(OLCfWR zeV^wpw5g9ClG8&HpW1tw#OZ4tuDyc9c1=`=EpUL8-Is at u6-Gj%knVu$O4Mth=`0)$ zidZ{tRx$GkEDQQX-YOBeZ191c^xWkjM2YTSVFltaftS$4HYSscBMs1`|7Wf zByB`1MOw8N~E;*WS>1TL*k;%d6oecwK zu*$CP-}~)(YJSDKnBB*&DZXl*(cMPQ|G}v-i|0;Tb^YkRORP5;>E>m@#y=b at txZRd@AHei zm8ms;XG_Gp+RTQO#kXD0%xYc}*u%}$B7+mZ{p_>zaQ%8h|IK+Bsmoo>KJ at +Y{^O5k zg?icD60;;$N^O$o>l~P5*s at JUf#2C-Q@?@Tt3G(;52Di5Z-Dtv$c zUO+w1o4s?q#oFn1WmbuYwe=K^y0R2oySMe38}HaJk|Y1jWL#x}p5mrEC+w%MT^;_^ z&$_2x`CaoVXEjsrR}Go9>48$q{O7tghr?E%H<+=(eY2a2%aSf#qpf2Toq`V4)EA_< z&KqRRJN0Gw!iN at j2L*XI$QVyQ!ZBBtk=85RxMzaq$T=1jwi_e2jz3px%v9_Cdg42k zq?iSE{K*y1HukBP6RufS)0W7tpjJOg5M?R+8`2gP#hq!#<%GoXc;Huph3N0pI9?uZ z7sjg3t+{XiYT~U-o$>aw_#a>IonB%and at k>Lq87o;5mt&TB<}&*%&X{>BK6;kwhK>kjN+o-(M<Ehota<#ILPTsKCLAC zhX%MYlQvV<&bMT-$FtGbYiIL3pTGI>RQsGlYmPkAZE>{JNLe%Gj991P^A?}Kdh6Tm zyJmrI{A)GwTWjWhQEF%&xlaE>_BZQ${h#|QZ&$kaNO}3`KA*2eR6Gl+ntmqP;ML9J zwOLQC at _tI&&AZXXY}2i1t08B+;{!R~R_Vo0LX5w+MnqWjSp49_&X_F;yYtQsbmIrS zUF))&n;7_Z;CrhL{E-!hbvbZx4CvJ zM{NuqQGTth_g=$`U7U0?hTlGTJ?5+0S>>hkqvmcMbiM0=<)+pPydPGNi4K#VEZx|A zt24u=cYnR=Tk>k&7K#^lDBL~LV^WT8uJV(JA*)zE$hUBMf=C?i`z2R=IDOAn0`h{b~4+I_Gks{8dmMRaqPy{ zGg?~b7x%1pT5j36BPssTGf%7MwVH3A-}xrDz&bxPqa;99;p&-#>7~>3+?4mOY&`yI zb+6z=E$j0eZ7o0hy%~S|jf9(1lJBYdaa>$Buqaq!(bmqX?0!-st`*tpMVu*sSI z*->>VQ>skN;wtk~j`QY at a=$Bgi+OiXwMVLD8hfbW?!&C1pLC`_P#u%mQ1n{QEQ{?t zTXW=AW38o$J$pHy;*P0Vx at F*r>2tOnc{NGd?M`5{pIgw2Eia7@$L1e9R6JnE<(psC z-5TW1joYa$*U4Wi#qu{xzTOz4+jri#FnOhm18%>tcRB69pinb+Koh_J(rq{T zxXoB|dZcagn%G>+gEwyvOuE at RusD3&icy1YW^8Owt&BHSU1^$~-^#9j&Imp=?CM0$ z_^}_Q`#v7F>F{i~tRVGKDkVPiPBzKx7_G0fbD)~x(zBQQ*_BD`nzO0YJ#C{*k%aI~ z9?j-KAFDwtUXWrihKLvhV?nn>&-`?$7ty zV|)5XAC0M6uM)!f^6p^c;}M+MFJ_&5{K(jDcIk%$n_T=%^Ho=UPU~kiG4si-7tSd! zdtFG8*cq at QcCuN^lAQH at GjrBIG20$9Wlzarr(>S2?(bgfx?Y{IHth773+g{pTPDr- zDmL3%eg9w&)_{Go%IxY*ttZ}&cZ_BUV4{I=Vc!(YaT`ymMEs z7H%DMdY7^65a}ChS3l)kKbCd$@PkP)C&sNE!P;Nu=(zCb={;_}wuZ&usXM6V9&NxG zx4f`oLv~@h-;^}#S|#=Eo$Ci(mx;Kbb}&hQtlTS!Y01@}p7C^x$M`#s at Lbm#nY(h| zs_ee3Nj<{9S{K-t4_VgsVc8tx*sliy8g+D!WJB+j-94&VDnTn6UcFdF|A~l*lK6Uwd-vb6Az{E(D?1qr+?V z=t1kaAkSbJ)3A`=0pEc>niF;BSt#5)7^SpCI{MbMUi-g{we*VgmpY_AW2fUF=^5|x zt~^U0#JPU|$JEy*?@ya6R+&{b28Mq%|7thAF7|Npo-Q6AdpB*dp8fE7;=@(3o^5TP zK8;~qeY|jqORf5 at oN43jy1DIe-Z9{+hv|Pi8)mEYAC$@+SX}Mc_%Un9KE3^?w>KPL zGNZQ31-*G*GbTC&+N4;sCg`5rlGOOMC~>MDbLz+?Pk94dMwLp144dLLe#m*%h|)S9 z_gy!q_};TVHSWqA-NARFtE(xA%q#q*%u`Mxf`yvk?sUVbry z>kRqs56$!zhJTpww7X0HsDaMawS6y|drrSQ>+U_)!>m)UD%?-MowDml^sM6vtNLo% z)a<&O!mT><`e*Te&B~o#M>Y;U{wXSBXUoRk+EndrKc_FI!otF^p)F*iyQOwy<_H??=*gK zaM--5-z?&)%${?m${xSc-|3XZlV^>RA&X_g9GtqWiwihsJ^lQnnd{!2%n4Bpj|)xD z-T!_xyR(sf(aLWl=9Mg2IZAOvicv-uGjq!hz71pWp1akR=dzN%AH1#@wzOiu{>Xa$ zbd{#JZuDlbE|pwm*sC44!7Q&lG~>w<NL z*|}}N++BvQNl{(;tiLE7XgPUMy~eeGm$NjRl=YpClyy3;tI)PS^jq&~v&ZfWX}PMi zYFlgOTG{l$t2gIu+ at 2=?7WWki* z+ at -;zN64JrMz$M2tAtNWus-gT%xb-u)!6?3r4|`EJY)NA`^Jylqv3D0*u!;Q<7j8? zV2AVp2f#l?S&b==Pq%!Rt#d4 at yKJy5x%9=)QiIXGMjHRu{O2|dgE0~e2aJFIPYwLz z;oxgC*u~S)B$^32z6tUFSRea82IGfu`%q#W9>DaT+cJ46)6S>tdZRb!UIkZX z at J%z#6fNiSL#9v8HaWWbL&T;>)y~*>xg$8fSHhH at Y&AdIgSpQDmfH4(AePph$ zEtk2F=#XWweB*{~PDh`{uAZ#^`HRscmxkN+75O1sde~lV9zPn(g(RE|I&7cM|O>Nf0v8+?|@hi-1(wNT-6`8Y`=hD>Ab-$~)Ga!1{ zrpBCdoq7L#8!PjAncDZy(epf$XK(cD$*3q+F62L-OONN>$X<-yHB< zeUGj0f#s$0bJN$DSnXdnHuq+awdR^x;r2OQ?A9`?yRP5g$?t@>QG;=E-O at FTyy{I1 z^?G+h+hr$*Ejzs0W__saw>v at 7N5%}Tm~XEnS>tkO$xqz``+M=X^c)t4X-^S(IoM_JqK3hmNr-?%yC<`OT>=*ThhrT1QMtG8OmpYU|orI*G^1uJBg z?Ho^7tytA;(%n at qKT!W$`rMy0=eC^8s(o`&>+OB_{*n28p9aPFR~>tDV5t`0W0z}I zQjZ~vD-Bd1_xn5}(1r79sd>a}iSLSAU)x4(I5fNRSn04nt0!M{$V_$}f8N at x>po_! zvj4oX#?d#YmmT_8zA!TIx$W1u*Uyt0jRxt(9)J3_Q~L9W`XNT4uGbTT*waSxIxG7% zrb)cf_xd<<_I-`b=3RHaYHDqnIX>C=sG8=>P70^KAM)K)+})|kc=X9Mx$BIi$z}28 zVcag6FTTHiy!?jLyJpRloa?eHem3!gw2cd#f*+`kR!iFN5U_>g(zr^_=KynC%hv;O z+h(W*4&7?B9#+1X-+%jO+24J*}7cbe_{{!#iqRvYF`9LBI z8`f6pyTshD8q{m#x5%xgAvxy^-VIuICht`5;+<`BHzQ81y#Gl#>Cux%ms%#g-8qBN zbxZZkjR)5=d0i_TH!=qn at N$4bfRr?V%GT;t9GVrD?76{@y^IC=kJG) z(3xmE$e9(h{lG2j=Qai=%a)}*`Cv6l`B6d-zVXt}&z(lAj#^hTVV3&Mz>4Oui_0|U zIt84MPte#fUG8m<)<*gG&d)ogk8HZ7sVjfS at XT__+nc{DT`cKy at A=@LXA5WZM#MC4 z8!$U!bi$9}4~IqbU!IAGInw3C+Ns})g8ZxZ_SUiQY7{vASlHbOz1HxSE|QPXcaexI z?eebtqi zWh!4i7;)ss%C55GjL)3iba&D{Kl`+YJC at q+OrNo}YyE$Is`*Rehku;)Qg>q20ty at Y`s(Mr=y8diu2_M!5$T<73FGfZ#)0k-1 at +z zz^h9@A7sg3HgHuqx@)a5lDxE1x$d_szQUthLsWBbH29Up&e{BmeY>iuWrE zy4&}BD81ez^8U~Z;l_-O<3IFEv+A}mhMoJg#$s~aiWVD}!a&WaWd4zl)i3hdI6W8STk8sLu>BJZ=n& z$7i!*ed5Pma~teB$i-v4bDr-zk3nwN9($|Gy|4Ao)JjX!QXaHlS$V&^idMiPJFPTj zU%e(Q9ev0?mMj=z7cy})n(yLk^5b|Lsj>mP}o3;X^1 z*F0=IT^t>Je2qOE{{@>PVCjFrFKkMFEey#1hLX_Vc*YP~O8om5ha!JbL+CH6N#LzP z{{8zF$luo!`uk&W|9%KJDvA}tC)Lpv(wT{`!wiXFk*ahSQrVBIGL0EaE}}0a(m*W2 z=I~iO4l_zfZ5X1aBc!G;iKoV4kynnkkcKa=2AfOz8NxNQ6jvge$&VoYj_yJtg}5Ry zJa#mj&yHusk{Yb=_k6;YisQ4RNWZ7IkjNk at LXnU^+sib}Ckj_jkbH%#rh5p9Y{wP( z_fk9A2Xz(FdVs6-XNTb5F$q at p{)GWi$G}ey!9Rok5#6>>N1Cjg#xO%7nc=L#Y)%-r zeWL+YZZTz~S<5mQS!(SYTYr_cWyq8r5 at Mp*A#DCQUZ@}|F~0iolw+0}z#yK1;@SzR zZ&M;u|E+59D~kh#kJ9eW at UV#oq{%Yv583~vy;l>D_Itk&B|Vl;^MEfA2Z2lz` zYlug}=hT at lRDA)yeWOWx@{_-udpcA&_^MLZBWe;sJ at o^IHd;tkt{<7I3mBAP%f}k{ zaiY1Q>@YU`>GyB(S&rUg()$Az``0a-zpUE+)K~;f&}Uf9{3c*p+8ANaLDYoJ2)=mD zsL1Z%i at 6x#CC1c*&GCgd7X==d1Hx_?;nzc`2 at k~=4$T|lqX>k at V}wVUQxhJBFMKGk zx4JqIF2D${8b(dn0$+GEv)>F at 6=4|R7nan7E%Aj5I?p-^g)=e2!$(jP9*!^E?DHvj zED%n>2rnB&P1p)w_(!>(#6ck3Cf&YK{a3it7>XTa2vHxY?s4jd3()>1jm}dlwp6w8 zmFHf3fBpmLeX1DcZT1wE3BEa^__2BmQ0{_Je&9$^nV at 5re_EPQ1(bJ4p~_udC at K^5 z>@g466OuqZZ(BWIxlN#;! zpWyugUvB#=RQRm4Dz{aZpkx;@t?_Cc#X2JxwAv&GPgMoVi!jPj-V~JyMy=-hQolB^ z>gng*9-IGHxx|-}GQMom&Y+CJV8%S4*1q!oE33dEm5q*$<3n8!W{iPt9GlpGImr%? z{{|Y>1T2q73Xd^-$^;)U at iU`f41yz<7mW|vr#7ZrSMXz1Pqgl96R3jlm1_s-p3eoX znhzW!dm&|;MU<4?*|B^BZ{T_JVp+n!Bp5IF*+pA5L9;yS#9-J85uKNGjEK*BTF at GD z7W6(7Db&e4lSZ9KrIkK#BIDCQ at 7Sc;p26!csd^=K5~;<7NjJ9jhW2dHe$Mb0aU_#6 z0$)02K*^2SppKk at F}n*%>+hf>ZP)$_K~DVW7=9wozrZJ_%J`+d1~#}=4kgR%rb`y2 z;HOO1IHR)55Rk`6qqgXuN0&^+Lc(@UOCAO4_=`L`VASW+<&oOS)4=9MpacwQ3Dgwh z4$=h?^yA8$A$J~te%wQ=J)_`X1n&?{1U|q%Ax-ZdXqa6}=(M@*Bqe|ki;vg?_zgbG zZznsz3>d;-;1D_k@(f#3we~ zchfls13aZr^E+NbnMlRXyF4 at PmI0bBO%5u#kEC8PZ9ma%3Aj_fD^VTFnw4#ENsZ-~IfEvf4Wj$m!jC;RRjE|@PCX at k*Q z25QG2-?ZWYzk8y zlw-UG+HsaQQPsv*o;4&mY6N^xN3#6^mA}f5TgjAxZ)(qmkF&8jAuI#IF6G~!@lhex zPBHlaHB}0AgAzVdM&V0Ke0<|P4A}5!mG*G$ztY^VBBWytg!EmaW1{dGmtU*Os)Noy zOc5ObKK~TSKq`osqCej-O%pzDq=-7cLBK5#LGj`8_^eQh<#FI9-+d06WACp#?SDyE z~!g-8#$MNC3VK^*tRN&)ckj(bl`yHGV!+L%jRBsBSBkqQ$gE8TSXiWJ|$&v z>8$ynH1B2FqtgFUc6FjnNhF-R7AwBJ=nV?C0miqs_7?5<#%dl0HFemLeSY9=Q>^m5Qn zot4ln#0C>FIDf`leA*JB+Y>Q-Ed at Ml;evq$a^RLHe|5 zOM`xGU<+$1Sc%jmI3lPWT4gc|Xr9M-mitDE)cpNi+izD7T8>}_C7clM=PyeA3Q*c= zsArixx&t_Z9(a;@s0_f=RMFX|#$Fs4KIQg;2f4wZMGBPAb>A0Pk(A%+?K2O#na1=O z7#;&UMLz{}PvFov${;sZA|as0v^uOi0KCF@;yfREC4nvTdom>+A^ES>TeW zp`*XqRB>7Oq!-PNTMU4GY?VhR{o*j%B!c~Gsesa(zs|9RCm5^gA`!rc=5ga$p})H> z$&_jE`h%=XB`P?hM9uHiKaxBz}dGKc5$(MZuIY;@hORm>Nmne%QcvF at TxpI6u9L^P8wb?V=as~ zSfYr|vrz?fNT3PGL5puJxbqT#B9u{=$oeQPkYG9&iQ5rldw&YR-NyL3OHNV4{kyjO z{ad`g0cmCt1Iz2dY~iYn&P=0=#HZo2)Rr_ofx8U5Wzhh;Sr_TEY~XT%xZ?}b`-exA zEd+yAfFjy*Ib|IJ;^X{2=UpiQxJV_`UrM at 4A1As8{OrP5;0P>5LIo|}t_u1*k%p=C zCMCoS;1&V**+~fJc1sK#wcZeON7d5<*i0cNvZ&!6H7J2?ge5Irl?UJF!kon?)QV{v zB%5E5$lY5ZITRGbOBpqfAxqzMlu1yP z0Zk_)frac*KrO_oxno3p-i5&lD`voWFHA_y#*bq1 at IjKNw(QjhKbCYuR|>2zv_bfY zveAY^hXV_Fiy0{HN=Z^e;JEC95y)kF3w&PDK^8T=$+FahaW=X{nEQ(EvQFuM`3S=_ zQ|K_0pqyGEd39R=^BrLN3o-jDcbJL&SH%6!pyYkvE$|_`K);(T^dZ)2|1Tec{~1M2 z8WFca=hy*$HBsm at mTUY!dC}k_A?{@7&jYv?G(_vGt%?85$(8CoH-fk#vQU3MIh- at dttC1)XSveEy7i%;FmzgUq1N_!g2#AZU&k%OsG!2+G6W0vdkdi?0bV5}aGhK_0v zp`=gn*&3d67@(sqmqTy$Otz)-+4$;~Jnb|K&=fl{%f#IdG}PgL5U@T2uA1iou03~0j$_p9gR|GcBih6uif_I!&`V>It^nt%D&XJ$(LbTK{DU8 zKm+&2G;qxXI{E~w$|s}WH-oRgDck-`^CPW z`upFOGywe*vgo#q@>FX20>4WH#jsRjK_zH{^Waw|LKOQD8Weo-zCleXA at IhO3_5&I z3#TTIb36-$gBlm}r~L{P6c$#UPE8o+G!6>q*c4~>1H!sM*hNVAR1`JgKgU47X99tV zdV$}tLzsM=a2JR@*Khf-M{o-cvya%js9nI$Hvz5ftzdqeE?Zl at dTLI0Vgi0*yNn)^S% z;zJ7;-mHYq-%Lzd&o1l`lzh0JRC)gh9FgW at u#$`a7g&OpU0~$s{aWXAKR at tsbvYk)~cYJ z%R|?81WPdMjIOkVC)9%#Q1 at FmTTGh3M-o-Ja$g at BNlCRoKPBvbzuWx3;NnyLzo+e- z2FdSI!tOFS6C?uVa`!>L~#MEH)i>M<%Dd{rOg zw$3{x7>xax%Z4f^$y7zJfgaUNl70=8r(l+n-%gP!i`uSk9o4KPL}4~#PmGt9zx%QL9AlpV?45b at 4y=-XQa_B4C^cOFpg|i6l^`vRbq*(BTf?{TJ=YDGv#qSk4gv9Tj&ENcgg*XE8FajPbc-I2 z-1$f>jNbJ9*A+?Ry2f2`I0TylUBArS3#P!w=4fYrTSJS2FCY0SR!RvJf`u`^XN{EP z{~0c*_2;O>fN^U8(HZn-4YJ~wWCY_GqC}k#6Sl1Wf%rjvo&qz%a)P0nYTN2l(SR|Neuh>xB@%sDEw}6V#Zk3Oe!|4H6HJ&w2N3 zrp6~=R*v%M(&UjTJr0#p)qU?*B?(%rQ4 at 7UEG+2JNPGEM#+b2RK*g;ej7~JGM$y9H z%g0%E|KJO+pmajp=8h{R`9Iz%c`+FK^M0-dHeQ5 at 3STsiCWlJnEVggyECa?yNegt( zmG4athp%5fZ$`r!xErd9n%ZS1J$*-JTtYl3Q7FqNf=y7GWtV#8Yr~ZTW=K235&{v98P6O!wKIaG&Wa<1JOqSYoR9U)zn4NXZ at NHNQu3j=6p{E zb}-i%J#cE_Q6l2Y?vlG14Hi|5Ei$N&c{Yh!LH-y5$!s&pe0R1#pmdQ%N0_R`)F{8* zl~|&nd59U}F)|Nv#22m8|3S}9@!g#^ma^ybkzom()hw9 zXUknOfp7+5Cj9kjHaEPAPN>vn38zpYDDkVAWHGS~cieL~oe z58O$Yflp{HFe(HtE~7{moj~mNP$ZE0Dxux`?(PZZT|EVK*gd?Dn*Q%U{Z1=@f8SRS z9FaBV>L}16E|^2G!3U|a2sYfUy`|S?gE^@clc3`8VKU)A*AJ-n=XX<(^Jnr_%w9e)f&sdfye7K8)8(PKbbQiC zTmDEG1_tly2p`+TKBYzSW^zKg(KaC=tk_tQ)Hgq?=fIS|neyo9r1OFnmHY(xJzwcZ z7HGt-O6ctE^I8lH!S0E~CbRjVERz+{{j1T<=B00~j+{4_L9fZ3x5CN4(zBP|p` zeFc3PmtPF at bus!qKhe at BnEj?4dAb~CRH`Xw zpolItU&)FKBrhWG`^7J|aPwRp^?PHK=o9f7|8-8x1E0@$r-Y8AvKq7)?Y)zPlr6^_ zC!+=YUn|rV3e%xO!dI_2 at Z})PE%8NnY{- zgCq=46mDnV(bV+EO`8sWfv;ZE<-yYixT~#=w)6Wj)YL_JY)$XEU*V1a*Rq&pxDz!3 z;rtYm_Hy;DUpbhCJKI=Sid7GL8Xve4;78Ihtw#lY at JU>E`XsVr%Uq4&-|qgpr7k?? zZ}Fs0B415?8RIf{2XOn8bkL@`=|!1EaQb>?`D8;dov2_grk$HaCjEQsSnz62k( z(xAR!qHHieu{i{dx~6Ynod=MH_nCwjnpP2H(zdaDA9g5EIX2dEP;!>ZNl6V at U0&)wL60&LKG}3!dc^puatJSygoAt z*hElIbf;!P3`J>t;U3>p?)?Y8xe-&pZnH!Pdvb}J&9v-@;$1k8E28x~ZVm-mf)nCd zI+^{zx55{Pkj&)^MTpvjhx1tBgwfLnUU#-B1IiMZM2!!U$dsK}9N_sy396W=Doh54 z#$INwegh=YEC!?g0H?Ug-+2|Gep#fEi;PA31NA0qu3z?+qGZAm#e%2 z>am#j5oTsmXhKKe%5aIcg415Ed;RFw%>-fdIIvcPwilBhfiF64bU}(f_+Yr*CH%qF z>nVtme(;B=mlrMqZJ5dX} zxy|j3MrLf?AyN}xQYN@;`!+C8c2h?!_|QQzNxL|{fh{YFJJTkLU;{cduA5dDpxj** zRo-}9l(Nk4*AWR|vyN5bcvP)U0a{5-~K z1vE~p;;UF3^cUniSZ%MKEIj~<$&p7xKns3$2rv3Tw_JKnaxEzNe=6uLnldSw{|y=+ zZ0CGCyitk4V0A|$IaCzH0pnAWla at QdH~Q*j(Ba-)n~Y+|jU!r!o!1NPqzs1pDVWzw z7V45o`hazH6pPR0kf+v%h~Op9UtWMYSu{{YeGf7O668cS#@Uax8w3;0DoCT3m|6|U zE9UpJn9j`Dh(E1PHP$|3)`=m9VR$v>%IuJSVqgi3`iF^pA9!U}Ujd~IA0P&WV2wM8 z_g1$*p!AeSDZ$2KPzVkqRQj at t_kl*LR7S5RJv0 at ALcVike%b#~ATYWGrs&M~%z{1) zpHb#8AZ9-JvA8Qb;;eHaXGF)u at dZ1RLNI2G!JmKS!wQFk4nBBi)~@Fv&}RUn&Lko5 zeBTa%1sg(t9t`znkw!@e{5&}jenp at X`iRe at NgetMR;UPa at R*$L$)MjI*Fa+m3)aW at lAnWLc?$8ngmjb-ey|B;#t?2OK5v<_M+=Ooy1+-DAUxcKciiay z*%$QUaT5sExXoK zd6COxT%Odj4)F+DPC}<&`aJkN8-`by+94jnVSZ&~MiNYUm4j)&>{T7&5#+yEqP}na zB2YdyrhGS6cZi3Rsb1iJ7{yr6$K at T)>JSeni#_BGHTd?(G7ssbJy0oPTd2lxm=pk}xfX7kat!`SB7WG#PCtLoN$uzbe+8Y_C*+wtb_)5p1dX|EFp%?6LAseV&uWzBLTHU z0i`~!6q6dy4iRndLKSY-3je=U2A9;iyKCE6{U=2s{RVJ+eRfc_oY|8SSSj%vg1ROGQ1ZQq=+)N zJ`syap{bVq=yoC!RH-Q#UB(G9SuZ+PP73gR_S6LY_OyOO7e0~2j3hzXomCj|8n-=p z at 5Mqkqez=d zw#|6|!)BkYVCE0OL|or7r3(_64V%juAIFL#41lRxSaPro<{!cWhjt7|;CQ58vS>UA zlgX%~cW4;HI|RhXIrN`DzaOxdrN9Yr5W=aAri~MHNRd@~VUe%O6;P#t at +fkHO-GRg zm726y`vq97FkIEqR=i~2K_ot~Xq?{n2k^08jMIP1l`haOipAu_f#1jYGGin0d5MLO zU1I<%LmgeEX?W7*!TnG2Bh`bAU4j{)bTCLx*g3BErAu>TiMV7THEPlA?_mAZfXM)6 zJ&`U$5`k3$#iiOd2Bw*H-g8F3y&a~n{s|W+}IaX=YC8UiQ|E^ ztyA=^mHQctVz}mo_9DDhK60uUtw(s?HM>GHDFJXEV^U*{4H2v12!h7;``0|X4_d5A z9^Fn>4->2U2urkeM~i_ypuEsV4_WM|(z`(No?-SyTW9-mGYDJTnR&#lwhGe9GgN z@b+dm at q{B%>e5WVW2!`B+<)^jE!_icFed~!ueB1HLx!} z_U at n!AvoJ!Z#{A?7)twMPB^`HQ$oPayuYWMgniO`Rm}=`$MA{*>MM=e zPlJOwRwV?w8y(-|2MRTF2pXPz;Sd!dzN*f=?L#}kSDrAlLQpZ8svvTm9U at d3^5Nw? z`^LH`cnw_z4VS!pkp_t%9I)!^TzGU$o*i>9fhzimd4FKXH8Smg zqQpqld#=i#at+wf({5;rualLe>O3AZQS?>Fvnn at r;3KQ93TQMC?#~X>hY8|6Cd%W<^1R~pzEE`Ljz=oHj*L!gg6m4O7OK9 z`7qGk;#JX(ZS|f^*&#ZHpNItU5eHL2(wG@{9Xo?&snkZ7IbT{S^*vz-aVj|oTl!e? zkP;|Xi~?#0(ci^^i3;?FOx3Xb(__?tV`PO+jkOFp`b>PtkXoJixxm=!RM7=hjJg;Q zQJLig{r14ZDm~DrvZc}0u$LAYvYiCS1;Mj0UOZMTn7C|N5zKft7kBF)(n9O6Ccgx< z78#UQrqcl$j$;OCfp?D^R{>fzhNiC90UC~n25G(Tu6eZ^{PdcE-e|DtPL)PbZ8skr zpY9F{B7-T2d5;bh1jh?(?_L*gjRQ1U4DEq_2WU9%Afz2$&^Bxnd?6kaC6>}hd>TG0 zuB>qTZs6YzlR`(Sq<%D5V9ugo>)%pSPw#S&<%VKq%DqVR<+3OMqb;QOy>qiGdvEy;x2 z{S at -(VyJ)Pj;jq!6dWLf)=})lEl3B at MVQU`F6<6N z at sa1hz1&m^41cXGTBXX-w2{QA&>(8+53ToKKnFHZMo&=($B2o-2lZ9$>{|@Vv)PRyJjLR^t9D~}FATEl)T}X+mNeGr{PmUy9edlJ2iNXiX7 at j_01t`z9 zPU!X0goSiL_ylFwpb6!m)(U0Oh1tYqw1x>XD=@M6d}0BpFH=kc`}kD4#USHkn}1h# z17`hE0UgUdGsNJKch^mGhgZx2HMbq(H?*#$4kNee!UfK&P5=gQLXq|_T~C*RPpG#p zuY&=B(-qKOb7Lc|_9s8nf~bj~xQl&$Z2}_6NVkfIB5$B3Q`@px at XCS$T6sA;=<@Ih zgI2s7-v{RIl}GQuady+SH^KS)?>~w1BR&j#<8}?$U5YB^?Yg}G37BBon6c|FAEpLX zMQ38;Lmk4BS!l9#+zoTksn02+Bb3|;F`)R6hKK5J;Ud6D8r at l6b%r{GptVd~ns-6* zK^SqJBI at D$@n#N2_f0mRqbyFadekzFhy<=aeAY-fg4LyhO#1Iq0$+FW z`lC<&1De3)MQ(F{uN0|EU?kTct$>4ZFU(;4y_!t&_x|}GcMwzyUiKr%IQk~U?GC68 zFDZ1*d-V=227#FrjM at 9@F3`S;IVAaTkB&aUGI!OH{aN7apG%@!0bL%FZjSy^C7h!^ zwY{=00>bW6sPN}HYQhAT&0vQ2fh)}djPTD#)PxB(VA9^2+=7WOUSaaN>pr0-OtAHr zdbP;I69_BGqQXhfsRG37V}tR%Uf!~ zIQPGx at a#LuA9z5x6Q+(YH&YYFx#%T0QEG0BSO|o}FkhV9LQNRwMi&&GqwBg at 7YNHs zqvuGTpD1<^oU2<<*_$&_?-Nz^gg8v02WrFVKFyXw*3!uCgqr6&@qB24MvwL?S z!564XVuCJ8q^T);u~?C8PB{J}6Am1gSvxuL#dGnhMJkHY+?4^Bx!W3t!f0BE|Q{Ia1{MJ zu`Ws0B8aTBwVtm77HuWEs4J&rO%I8$e=GKM_zBR|@oMNM`3whY`Xmoh2-eaUZ<}j_ zPW%Pq?YLPvN6XWHsP9?V~7 z3&N#ynnI8E?|T}=JcTQ~jNdILJUGe+iRO7Rd3-kUIa&Ty-ACI%H;uwPR(lKv%gItqCq}<9;h#ySdr=b1cT?6W4+}-WldB?%M=tQCJG<4w%eud zlRKx^d_Db0AGH8V$WAAfr+uD(3Y2-N6*AWqC7 at t`KkjWV at RW^b(`jkMiEqx z{ikP%sxUrB3Kg|a5-mzF!PooqbKu$WILzxf>ykx_{`=xX`$IegzR!}U9}Cv~T1p7l zy~8qkbuSWC$opXK4|?2CBXs}AGDRc`U-JC}`FoQ<|0-5PN4{I@$s~W-$v9pp3-)D# zlcoLhv-*On(ZVFup0$Nc+-W9XFov^nFBuAAh4xkMYnEs?7~v`Q3yYHot+HJzG*NBDdMj?-~ zwmUnXC at xvBfu9qezZHxCrg|Uq%M&c4opwCg zm at 3)+z at o5r^fAiX1Pkf1C;Re_0PV5zsJ8t{%Gv}=Y4z7lTi=3a9j%0pGj?YvYybX3 zdyFvAIHUR|)(P%2%VM%rrk$mXvIz|(r|A0gRbW{4QOuinTZ?J*;b?9=iyYLaLaWFb zfRSdHsc3e)Vz|CVuQKRzLmy||mGZ>{V z=s4R}PL+zU%!_ZE1b2p-rBO>bSWl)b{MeAF(eULmzf(S-*5WYs_O?L`3cSFW? zI`~X2bX;8bls<)E;99q5$v{wFL72mWu-9aaKVkbsP3)VxGyvWR1uF*RjN|?r5yCDU z!7L5mARuahizO9D;rkSAn8%oIy`!N{Q1KcOW3#8im`yEoRDAWGx;no08tpROQNJE# z5RP0}_m$j#5zZqHPgUDvEJ20Mvgq4xL%!36d2%_vEVx8v5~Xi~M5b+S zWN$!>$J{%<(?*v_0e4vSz~k=#HwTm1e3FC$O&s}&IEynrbs#*mlSd<44oK4_kwvzw zPAe#5ff7~9pd~Vur^_J^IZ>}PPXwcH9Q!BP?!g`VQz3*!WOm+q4I@@CdGK8=;`4yvw at y|+qfe|TT-WQu? zM1vu?NJUbV<;O168Usuo#v?KuNCQLV0#kw4&yUTZlY8|>2mb?usiW|<->H3j$p>R` zpgOvEePuzW?E{|{2mj&7<3CAz-AGI081{~G!{N?t)_rJ z%VRTEq%y(ilh?32)*EOZmP0kC*^AU9n74~lRAzhzHLy|^)%@%vQj=iywPseNX$sKn zDT{g zR=z5O%GWYQ%6oBVvUsFd4`wY23myeWNg1@?p9`fSk1t*wzAIJ|K17Xi@?65Hi`%mK z|5z*e>FK`Qg?8(K)qYn*BhmIxr%c3`UgkLB%3zp=QwE(+(zzm~T{!V99-j at yV8=L4 z2+@<0f-`vU#6zWEIuDRWLk+cfVqowg5u7-kmoV)QW|Q88FB0ri zOc}X1PbB{&Y@?kaXidH}nl{Ak7$sK>K8 at ugcti#Mw`kw*ZsOEZn4#B98J+AaPtXD4 zt2K;sZ?IMFt2p7)L;n=fcLs%T4unU5o z(bh2P`ZjoGB8L*SFLaPdRARY9;y>n^Di1 at q%=|0CNffDLsW^kEnGArUm;Lc(0f1f1!>bsH5WITt)==_E|mA z&aL~EvN*o<7v*m^;p^qem>r at rq^#u3aq at HNNw zMj(8D12TLp;$I#I4V|EaHo_J|>I{7CoW);Xz*idzrO~b5ZG)&a0{Kd}>`b?9tATd3 z3hIG=HKt at hc2L!q>%xiU!}rBS?x!yMWH{(B_^F!&y3zT at TwEZ*z?A-VfRh#|TNUPN z_}8Igq6k1G-xm3T^1!rb!i^MeMFyg(e`ic at v%BD at NfKzXKc$hR1rekYC2EOrN_xRx z;QOvU&{b3aQDmxr&Zr4HU6N)^c4Q}JVcE$? zlsc2gj^%RfBA9H#?VoqKB`YgH3xvv}*IPX&(vf%JfPs%4&q98W4;>$JqXIr{+aEJw zESf?CN^lM{H(5y<*#9{RG-SUxkX)Pt-3&HS+}iD4me+%TW~3wb6b^qX-g(*!|?~@np~iB{fika-B{MK{B(dE=rQU1-}2ABARZjYYdsV zZESl0kYMJvWk$h~+lw2;4q+3YM0e}W`f&hw2wOE!mOEc;7Qx2BHr?~_Jz+){4(3heuWZ)(W?(SvgI8VzexD3 z(t;_U*Mq`LS3{%NG7H5h5cwkPu4BqG4KU`&DWYj?mle~5*@GY0oDjaqoIfKbT;Hz& zy23Cul-X8FlPTB`1aq!PW{wUoXE3lwZFzKj^R=sVz0g#Du z=$62;`yE8$1B*H>P;P;F5aiJ+J^7$RKmy0_L|U93C|hqWv}-Fp>HrQO*0h8ZJqH+M z8YV<--wT>BbE5itS|3 at S178-BMU8&;Yq|`Ag995|sdzw0lR*jGCYl6-dm6p9(`7!w z`<|FMACXr;@*Cp-%ElA$N5D*_1sj1xqQ> zgAt^RdFogyH(i^-kQ$A8<4fh}5%Bd_e17+&2BxHuMa{vcJDEPHnZMf>vA}`g!%Zup z-{J$$j at o@?0{}{4V)^Fk(*P13^aNbFHVmkr!|X+e_MxFpI1hXY9`N80(0`8k`bI-K z`uOTSl&vnp(}rwCbmRGj5e at Y}egdAp=%kKQ38EegNBjpLTs6lm zkoAMaV~U=B;CNc!NiAe0X z6lD$H90=6csG$)qhqlrrkOowkdrFx;0)xh81 at yo#ESDySe7bqDQf*H+P-Q=*QDfM) zS4q(ADw#w^BrI= z5zanDlR)NRX at tJ(3|r`tH0nqmKPnc6O8eA3y)46qyLXuOu{=Q&O0YN7_t05Om?w2L z<{6dur)UzW6zKZ!Q;){zFc|k;&}Ht;LV7rYMY_>bC75`5yDGY1V^-1A7xk>01)!N# zyDYVVdBHlN$t%_FkkLehT?dVrU1R|Y5stYMx9$O%tnfi5`58=pC1YMb^fa*nl#j@# z0l`w%lgW?cF{8-iaPn4vToVbpOCctTsMm8c#y{y32_N(nY|zaeVx|V_sRVNez4jHI zsZ7*yALqvU3GklfGG#Oz+OA0)4n8F_&bA-`Cepy#Sf^GVR~VN`>RDf4`+detUO>{>{91(0@@v zcLl07#AAvWfBj at 1*&hTysYsw*#jvv&KmsEenA18RW}IG&InWrWOP_+zh>7 at CzvS0L zX~OXmLEXq0B1c9zaWtg5ZSeyWN1G;UXQsW##D(7q#@GJj;UK9GddL}R)Mvffk4)Qx zP6#jrrO5T at lMEo=lu^gaZGc!Hd`#Tw(Q5GO&O=o+l(w%48D`wH>EOQviDhwII;b3# z9I#mlm{DiU0Z-;IGG*j-!f1i-!?$OJa0xSNL)@in{*U2Bt)3d_&h?Ms9l+tkM&~da zz5**aj`189j-?4BD9+WFdj~84O+Uo|o!zh5(IepNe>7A1X#-kkgDiT7WV08UJ|-ds zZ*YWw=S9h5&%=}#n8d{)`98Za^bDBy6EG{}u-RgOMCY=G&=G5IjlBr0u@=+8 zmdq8ibi{F1f~i|-(n1}WdI at v>n7=>_An}?2!lXBRzq=pwvq_!N1baOfQ-t9QPg-qR zvKih;#@y`HPNVLCkk{14TV+Qqa5J;Yt|DUyrfi|7Z1H0>AY=2wd=;i-`x`yN!(IAn zx(s~6+4-iux`Os at Q$VLVyS4NP`1+O+XXB0n{QyjE*#jG>>JvQN2<5x2_2THkJkyw` zWDjkjB~N~97^3E`xW6 z(=j*GkM5?0A#`nfMTK at rBup`CvCMOyNr z>Z*?WBR5;J{k?DDP9Iq&76>2Xp0oM^%-D7ulfx+B3PlWYY=~gSni-h})3^4LMcc#j zIxPUc{B7s6OLl{w8X4$nS*MbsJkf`rI(UvHuw7g%pBw%AX9N4V=xCf>Xu-mp zEwNx77{sS4qJyh$n>Z|d%3gKb*O{P1U1ia!LPk=B66N=wh!eF5R*lYUxr0Dye#oJR zK<}g}aqwlsjXt(q2cQ1{leH#9o=g^dDUayR9HcZgGM!+^*f`9Az)~gp6nsXl=5Rll zf5#qk#AvBW#t?J~`a2*Yb>B_*gP$ZMP`7Qg4ow_Er4>)S%Xkb5b4~|c5?FVpN5I!t zcyVi2E9i$ql+b{im>y*M?yLlM2sfO^jEP`}h}weQHp?wFM7llfOSlkc`jA0v6MuIH za{Y*m&`6jX^oOeQ}Oti^0u5zP4Z zGix_iqAyqA5rB4qi5Xdh+qX|Y9vk%J*G_|Q1Y-Xo9V6oN^fc{9js at e24d!)?Xmjd3 zg2820K-5}LjtyGqnDxbi)Pgy2(F6zAP&R%{hRlCJc3x*Rh3>7HU#5fM8YvO zn4;(y=8cKlj%1quq`(v&3IF*Q_*aV{_1Tm7K9Ybs36nzSoQqgg0;B4FNN49WP_jdv z&{1B`T^tU<8lcHLZZ~jfd#a&M`UD>`iU%94_7c2!Y%Y(@PZYEgal8}+**RBg=fmWI zQs^Rc!eqK24{kgQCfLI#9h80UdrJZQsDoBqfInT5GmFTe�Y|X$1z|rxQALEoITA z2>z3N$82E1^+|B*g1I<^WAkdG>EZ|su0P+>;;K4>kvs at p-_&wwA_yk0xwC3BL9h9$ zhE~~^`DB2W!n}}1 z5koeSA^c)tQW0+ZbBW}$|A}o|n~s7pCR!d%+SI&-4B-{U^!(G5oV43A{EgC zs&QwNcf-0pKyl3cB2* zNgB|B+!IA%Pc03$GD&kHY)4uh{YXrZeK&pOen1bY!D-Vb&M)e<0! zR?DTQq|@K8gk*5*!QkH?+M|pJ4v=CO%V&U=Zc#_irehk#f{6-XFqMjShHrS@#yn^> ztw}5(VZTo|IGy4NTKk<6<{IY*@krzj(unm3tfgV3wK_TzlztM6N4!|##wSgNSwYue zu3{LriG`vT$gnRmW8E!aEEyQTIg6nx4wl?+Zk6sATnN0UkzG+-xvcm&!rk{xymS6x^jqL6LTD3_H zHKf~y9fsl~kCbO8-2-Efng%+mE*U6ZS0QT1);5VuJD30fGpe34>wp0f@>KJr7d{2N zi7J@*152 at ZBzuETvlj%M0Ic!KC~Na5 at f!}GH9V_~yF;=)uva+L{-BNcEb?<*E2kTg z>u_JOIAPyWCO&bGM4EIS_^FA3ZV(@IqD&+x%?2-*kxxLserJFlBkyvis!gz;d$MT? zT)KBwKxgvm at np*O?AQ<Ml;!*_QSbw7O(wBd{n at Ct;!~V^29us at Ys(I%ALyz zC*xezIbr~xewc|#J~&_s9gZzKoIIcp}c0<*!a<)c1c&ibu^pf6?+V7Y=I!L zYXS(0iXfl{6VU at 6;N-YFuYeePPmIPAjWO!a7>(F_i3NL)5_>_#-eQS8YSef3?j+up z=h+8+|A_M7C*SYx?C$LB?Cgy7C}zLI)g8u_UZc&zScP4l~oc(aAVV<%lBF_ z4wbcyaKfDo6Guwu5Tx-0L*Sb$_C(!VzonBU9GN%0E0DD($im0)ktLY*dW~8zaFA8r zdMm*n1ct6gJKK>x`j(HZtJVl~7PHi*-Ak(5NhDu?tzK~}2)N6a!M!Qw at A$Z*wJ>z* zw31&*5RSZmzACD~IMoBcBzGFmMM#I8aq%mUQ0RwS8QlNZWD*;;#3PTs0xesOB_}eA zW%7pnrLM4SF1zC9_SVVVEb45%Mv&&Z5!f%F35tjD#e>oUr*U#IMqtSAJDgwy4!YvE z7{AUEvl>#7PPEF&AZRm8nJfh}B|0`AJuq5L6xn?Ci#!6xgW{d~(Je!$1Ow;EBVc5| zShqZK-47_?fg5gFC>F>fpu?xnG#8+Y$=*cnpUaE6;4P6Zwm0d_5^%;>k?o)l%iVF3 zGt1~n5>$&o3#Kkvp%U^zu>gY{l>vq*`mutk*HR1j6FH||LMTInOND^gUs zHMT|ewizh)fk7HqZYm!2t6r}SO`{Uk_T(Z;(50Jrh=PtTpI;M*RuEp;OFn!=mPyS+ z6}r7mi{0pvn=5{9>sgLdc5xOxd^P9R8&s8LMK$(0CE~i zBprCxS2hPjQ1u!P&tHZtWWv00G0WwkGbnC`^hVdg0lxTXyME2ZfKuOx*YfdSk~#f8 zC=?Y at D=l;w7lmZCpn^*yT^^vyj6~_)+!0(1mZc}o(RNpxbuNH^k9e!Sc at +PgP0Tdt z%o&*?yYs}P50_MeY1M>yMO}3)7mo#7ye}s|eOzNCnBm5L__ffOaXcJ!)PGZ!Ohs?< zD?8&?c?s)z$C;V??d1u*GpZ{yj<_fMd?Wu5GrZ at DiQgBWM9G<4akrDQfM4d!wreY% ztBEQS>MP>WN%gjK!N;hyW|ij6b3u!HInJQ#$CyE7pT*xY!%RKoiN{^M+An86;^lMx zE at wa_O1n#B$~aoc$p=4L`zU(sHqLPy)(7PHup)j$>U*SAM0A=Ezq^TJU^b)^7wsWM z{50aXy@;pGqc5)`_y0sk{Qk|an9XAWv^`s532M4q*IgSxA8u0O$oh+%$czo?%=IHJ zQKp at I!t-Ie%!!QL65=;b>30q^Kx_S5Cwxyzzs5-ts}(F}D2rm at GGRgkkkDfXTtY!N zIVl)U(@cj=YlfFsC>FNHJsopz at gdW39q#u(bPm4M(Bj&5xVqPDTu~upX1;C|1#&jP zV0N*C{9fV9gnTP$(pyv9cD+LXM>_qy*4_i0VTP7*!|j5$O1bomiPXF0IaEJ+j1zu# zn&HgDK<}9dVUH)FhJ&b7iVuDb+r*8VkRB*AGe($(ULeQ16YfB7HuM`Gow%$}tjx{k zGkYw9uObD0Klra74L?O?lnRwWuwicBzK8^!?Npv{!Iopf#uMcvR#);4!!_~G^c%pesMLirlz527KT*6DB7t#3^Q<*6E4-p zHJF&OmTO#n zF%$Al*a02VTs~$N%1a;SghMt6WkPn)skQVy9znY9d9>(L=y;wR4tcMM6eMMHN05cP zL%P<2wK^*Rp8y#xr66Nedh1Vg=vEVdtXCZb at JNZb_E>}zG-abjki#E$TagQ$zf~O% zmishH0+JrJl=z{#_5fRgcY80fu9>gdhp=VQBN=G zUMU0CT5cI!nVn2#>s{O1S5{LyxE3rn0^o5+e8LUyEeXn)ABA_-v!R_E%ivONp2~!b z$W$3(R3_MVsVf=bPM>z*-W+7D6SyA;T)2#wMB%3gdGi5x2Z8I6!G+6+NSyH7{3=Ke zTL|3enOwMxc*I>l+)JBB#l6&r3zrd%*m3vsMvXx6nmuvcLJb!#<-Q-`Y9|+aqxTI5 zJ#gH%1}>EA?Da<57uItxGgHnsIBiMCSo44o>urAJcTT|C_z%o`_z@}y>aQY*n zt+h5vgNCx&`geHWD)j- at oset6W)4_7=yyZC4>VV)9_DDxYHjaS z-MyCs+wud-G{n5~K_o*W=1zzJ0(Ax4ApYv0BniX7EFbM3028C5FMf at C={WoBZAmd; z41ALsr at f$Io|yvXYkr>vUuP7!N2XJeBmrYa_Z(6?2%YlA!LI`CFh4#kg-J*3onD;T z45r01!e4Ov0uwP&otnkgl5-Q!^g*WZ_A>a{Hsg{6B;!PQ*kjQs7^*9t_}Mn*3i~*u zQX6vBMnUuhhuogOJ{!8ClP$@BJ^BZ?c+Q1JbhuS%7`Jn?8g;LZiY{go#pE~M=0lH8 zgHyBG#JIm|8U4kw9U$xiC9XO<-{Zok!^Ra{cRCMW8VCH@?icsj9!j;=a^;2+mAr`r zu|^2k{zWi|y~da`_-q#x at R~+Ayr(}X1!qE@(IjMx5$1-DRm}r3y$9aOUmll&5S0Nk z>owNbG%U{8we9ySpp&nZcqbRWC=I9DAXpvbOv0OAP4xmR_K**LCGYV{J|UfB|K;&N zoPn7VKsd-WPG!X`L!-bdr(FN)vbr;2&3Jm?>*gC5Cgd9zxk at 9s>h~0k*svU${27rM zEyt6M|DRY;1e`>;)2xWO2gkzK3I)EY=Xvu`NWh>H%rIlBT204G?h>7? zw^bUkzvJ#ujon6 at kK0)C$Sy*ct=AdV>{n+O9*n4ms#5JBDi8S8DX~ zUPmlzgFGGYqEvUpll6KZa-1M`~ zp4UO#g+u^F&lZwO`9G^!T-+W at GQ!8&R<}LLPpvsf-k3|`Bu!de(4z~D$Hbe=yw5pE z-ux7$Gr-}iv(6?q`sMeXLz_3hKoua%;`7HPQksj7sp>o97ad at Zb;DItR0p2+TiV at S zZORmFx$45&Cg{1k8xc(85i3JVqKej1ym`Z`FVN$f6nDHg at d+F}B^OHK)d40=2wpM( zdUJ$O7Eii!uviLtskA0>lI{bQ+dNR>DL0&C&zBq|(i#botS-*e{0d(e6!_L(w>Jj~ zBhk#p6?GexMFA(oQNmZnw&LIqQ~*H5%&R@><+9~_LF6laaED1|DhDhbv`4$qYJ<&f zZ-06>XR%F+H_2gbz6Q(NZAQe(_Bv%ZB6n&VB_6WbOv_Ke5Xqv9?D<6iyv+r_t4`8$ zgVUjV^*FqvE6hKCBGP8Ci3yEz$s4Ufrm^YbQ?KRTyNzeV*D(d|fe6f#z-I{KhqbQB zS3uHNmAG~2++Q4#j`yv;`()(kicsRFNBsdzyb={+479pSN`Ap=_TJoTo^+bvL8YN# zq+5OdXIA(+py^1^G#OGF8b-R+?td*kww_AUc35d>D9%$vQ)K$Ok^mH1!daLwq7*cA zl8ZNm29ts0k_&zl;x&ecq_a+n!Kd at UT76)VEg^#c9*pH-2-BuXFtqpGa|yYO<`c;Z zmQLUjltF^vub|Ib9W!Fn zC5Wz<+j0Vh6jgV_--d3P$u%ZMqdG&2Z0jh4E?a`kJS(ySIzbf@!_#FBU#}zxnl{d# z(h~?~xZ{ZqUFY)kP^;5NpM6&$b(P_G4bGC+p}_~2We%O(+52s+^~5L3E! z_^~%~IC|pET)u;eh+f^~isVtA|NP9>cA&ba6G?2k?qhl at cN!YF2)-UDaA($o{c>0s19;)1lwN~CMJz0bn_IUJ$bhGVXUu-FWi3dkiz6isAz&DRD7v&K!UMMX))uf{{toCI-xR%YjEQ^2+KcUi=89U*to&&C;w%%gEM{5zL zs1w%ZVe at 1K4DYW*eE9yqSdG at 0jhT!+4MEay at 8 zK>Vr<9wFxU4+9mwN|PS_W64jpA)lw4I}W`183Q;>uNSmwmisRB0GQF at p1pG`xzXIQxO>$AS9L#DmPVyx8vd#_W)FNdbifUS zl?@n}wh17r=wtrTxy7O!tz~ex<<^EGO|_rVbm(0pjkN at TMupz(Ez%wz^FWK41>a16 zlvf#W_YkgJk6;G2CC4U8h$^})(AmPE^*Fr~8XiMDW;28^z|kHMZ!ynVr=hiD=1%wr z0B5-1JL=b=lAv_RTUR#+=>f8U*reAs6M+mjr>CzJVR8m zSqjSjG5j<#vrZ5m;f0?wfRV~)dIy%SKdr6+6Ts6E$2%V`ipTKD?hI=2_rvlE#qAaf zMNK=r&`2>nI@ zaP8JMbHX0=Xch-5V=7E4JNs0)?JdU_gx}cAE2g4pfHoJ%8cp zUw4CH@=0xcq9q!oQR$e2ZjSDavZRGN<9a)Jh=gvHoClvxt-2}^)r at e)RhIV%7Pdxb z6hwSwwc6B*@`9my=8oS#%p1))eZ{u~bdC-_9o7hyjwK(XyNsieWUEY>9G;-y>g%Wf z1>y*H!$tjq4I2Z0NIXbK*dz2SLgQ^wiT1l#$Rs8OluS#iJ_zAGEm^aB-H6Cb~Q zKS+YoxANylKHT^Sro#*34QIpoOvtu6Gt7vtCN(QYcfefVVF}QCM at M|X(w9o0vigr; zO>>++^n}mVgeOd~f&-QjOP4?PR1avYuOn`Qb=k-S{jZvdSbG4fAQKX?LY)4SZcx z;AUdMIU1tgfObrEj$q`-B(bGagsvxa|GqOG_Ph1G1bCE2r!pA>I|=>Nsk#h;L4{XYlL1!%Dke!n;95+9-EFN=X4#;BEtcrHX$UGpn^cJL>j8QtRI zVMLlKe?F58@(OUlOU=)DECHLK&d>^J=yV`UXo&Tfq|uXZ!NTf6sMz#p{H%2BxDCqu z?Y8n9sdm^iUP)kg)f##F)Ly5tm32_13;+F^wSuzFTnPLf8nY2rk;<+?#SZ2FKO01E zPSQM6!|zaO6jxk672V!zbK=Yfp at S+%CDowIS+PmzF{K)&V4Pip0=?d6gXrw7JOf6B zgQc?99ru2 at l$FCyM?VnUbY%ur9sO8A0zDy9XOO3k5TWn={Lx22kmm_?)T=Tdq2(`8 zb%c0ED9i2h1RJ+ZC0reSTZ at Z_4%>B)BBlY#U*v-O<d)PBGRzYwj_l#37jDLED)LvEGvhOsDL2{+c7 zf5yW?M|C`;oY59!$eD-<1;_+0C*$)oZxZv;Ocoyd17%bV+h}>F7ti{EwnN9A#*=&m7q_O#;0%Bc!Rf zsLw_a;CkYr)1wR?I`~6!N{{^h+W0jv1O69)oAgRO2L~OrO#Lm9DIg~Y7d&V6%K;Lg z;X0j0P-$h$>cruHsv+x8>5JdWZXd!+Y5PG^W;=hXRW1z-s at s0}u|n|;Cl?)fg+BM^ zP0)!y2raf`k`%CIV=nO^i#7k&tcxA?1B;6famhEGhlP$BS+h}(Vw5`513$(U&XGWk zEBTS`;|RXj!=)26IH)YHsh-W3v8Wl5=f98iM(gPd*rAxkvp*wkBhV5Fy4#OKiB?K~`uuqK~> z^{B-BGiSWaZSf%qRI8UkwzLMeJba}Xr1iHC9+f!r2q&ZUZ%K(&d05nLGkmK3 at pL~Y z&hRnOkE^RyyI=mUuqGF?4_UdwP6<@U+z;`F$r at 704XJqARSlz8jHGpsKgu_4glmpL5q@xdr`yM6znMA;+ z`^bT3 z513e7)>PwBRr(gf*FXo{AJ^#%S!^XH4HvCPN9E98VEv?f7P#0+fZKtUF%aZc4Ts at o_BQHnpGZL^(&+6E|#g z`f{zU|B5r07MD-AiF<@1_`Fl3(ZA&O-U7{J4lAec;2VhpQS{{qUG^`STZ7W(oa zt|@EMWvf%)a&*vX21f)LLD|lB!41oQr at j*}GtKUc71^m at 1LJx(oblB3cVuM9c0_3kx*ej_>}wcjAjM z8$mVwH+$m+qxEN`5#P84>1`T+e!ij=%xE37E6J`+%@)7cHof_Y-i&i8d5dR3Ge)`M zF&Td?eV@&sv)2hYfBqNHoD)28!}{rpcVVZq{q|j+;Q{pZC{al4$y&ax&ZaZyNp28@ z=hSJl+JN2ua~b?t*m8pm3Ocx|X4jp_s6{S8`(?9xqbzCJ`jKc*X<1365MNQ#U2RaR zMOO!W+kRe98a~GA{HkW}pcI&X8~t$qc$uxGprKz6ru3>aOarnT0kZ39NAmk#d3&^- z-Aq;k6St~SQ`XnsKk;{Hiia!yq;2+rcW4ToZ1lq)4 at 3jm5F+>6+C%)NmotT6Zt75^CX2>-^ht^br5y0kOvZUGwrxkY0OtTpI|_-CCH4 zi#y}K4_$d43ahq$YgW_ka70!4%12SvVO*xT;O?;RE0&UqPNZ)xw zKY$1#@NdJz0b7a6oRRt87Sdj&P19HtI at 6a0Vy#wp-o9zjvl_$(HX!VsSm|^PQwoBY z!gOivg-6R6BY5cE_Jq+HuBa|{K|^()NQZBX=IoGlNB(cj*n2V}jO$Ws at o*p;M%*#) z=*ZP2+qPN4XG>Kr<|wf|=`K`yqHOK^9P#V)(pj4|Kf3uJ5N}I at wL<)RU}Zdt z{cKm*c77)P6_YFbPYN!x;_BL2 at vg{jlq92P)Z>FH29x zkft)Z_HpETS?7dX5o41}O-84R?0)UZG at xor7%a6^rKMu at s>0^$r_ct!${jaY{L at NF zMUVIk*y~fDUK;wVOd3(9$|&_37r_qp_HsN2?Y~T<0F75OVZr9rWm~h-*orEt>5)i? zVb`St->k9~0kxOV&}^9u;c64(BEnLPSATp>J_>nq#$$TN>E#j8@!PF1>_H`lz9Rw_ zM;dwXMG8TL<6ZGXu&0?1UNERtnkZ`NR7CLa%8<46g0%DcaS<>Ectzuj zC$7Ub^u0eG6+9`A2bYdI{N9;esB%v~2fX^ymZ414D6>{8Fe*ytwB54><)az|GXB60 z at cb|)V1impIp`y}ZH?L#MZuJALF6{c8Nq~W4}V1H(irE&xzC4ZhoW>TgxY#NMidf` zpD2GR$^oi{|I*O!#Onrpa>Va`Gg$If%HhwB$A2e9MMrE_YxIc5AYN4Y$X-9WP8CHI zZ|F+z`k||pRu7c at HOa6anXoZtL$=w_xL4zlw+RC6f6X%PM}Ltx`zUmzJrVdk?Pr;c z40pizZTknnBF};K5^qPaX(p4P#NBF1*nmp5z1=hFzp^@bukNV4a?rVEM9Sp+-%7_% z=NZvvTCX-RmG2YgQ at Mqbg8U?;8FlPzzi0LBa?0l(Ct>hniRz(imdoX&Gc0hqr2ZWk z4m;v{>HJF3dCqEbyVC_1{a|({Rm6|&r&dc2M}#duvS24H#;G|nyh-#2$O3c32fpp5 z(lOC_3RAzHuojd{R2BSevblgg2!hcFrb=6NhF~<=4?X at bEJ=1dk@*WUk$i~&zM{RQ z;AKd$?%|woP>$lsPWY+(!an&dbdE244op|V6#kdU6MN_niOuh==U}Ye(DGz*p7%5l zVCY7?1pe?(Nrsa0H%$2DRfE*~Q5kV1zP}7SDg{qR{5(zN^bn!B8T_8!9uk@ zo3~5@>70n$f4W!!1&g+E#0`&+FO|9-^z+iTAD&n8L3asC+(;jPMbd1tJZ@#%P?nr# zlj{YdiKixZ?>pBx at X>9UIKk-i+HEMipVkpynyxoF2rO?Y#ToXE`eNrn=)yiC&CIsH zq!}32s at wO-+spwg*kG3rBj<3;y|gLawdiQfmVdPt)Xas;g@#f&UhYX`Ci{gf9G`ie~ z5=Wk;^~?kkBVzIZA6?VhUl%>DBHs2qZEB`Lr&aeC(!^I0qN!8%o_-M8H_G55+Eq=I zrY(ALiazN3QMvmKAEOdtJCt~Kjj=VvMTFjwh%Hge>+hoc$~$Z~r1rV0mVCgEj$vc|8q^d|M at 2QKSSd_wzl)*46`an zC5l$Z4y|q-X*3+uRT1B=+vlAPb$S%S-jeK(Yve3$Og;R%U$*9L=;qMe>E3~BQOstR n0=IHTHk1RcH|X?&!K4;oY at D1Cf}4|@)8l^}6s;S http://hg.python.org/jython/rev/f37aee7135b4 changeset: 6336:f37aee7135b4 parent: 6335:751fc2258335 parent: 6332:fa6fad841143 user: Shashank Bharadwaj date: Mon Mar 12 16:18:17 2012 -0700 summary: merge with head files: CPythonLib.includes | 1 + Lib/test/regrtest.py | 9 +- Lib/test/test_atexit.py | 84 ++++++++++++++++++ Lib/test/test_builtin.py | 6 +- Lib/test/test_pbcvm.py | 5 +- Lib/test/test_support.py | 74 ++++++++++----- b/.idea/libraries/extlibs.xml | 48 ++++++++++ b/.idea/libraries/jar.xml | 12 ++ b/.idea/libraries/svnant_jars.xml | 11 ++ b/.idea/libraries/test.xml | 14 +++ build.xml | 2 +- extlibs/guava-11.0.2.jar | Bin extlibs/guava-r07.jar | Bin 13 files changed, 229 insertions(+), 37 deletions(-) diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -11,6 +11,7 @@ test/** unittest/** xml/etree/** +json/** # Lib files, in alphabetical order: __future__.py diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -133,6 +133,7 @@ import time import traceback import warnings +import unittest # keep a reference to the ascii module to workaround #7140 bug # (see issue #7027) import encodings.ascii @@ -359,7 +360,7 @@ tests = map(removepy, tests) stdtests = STDTESTS[:] - nottests = NOTTESTS[:] + nottests = NOTTESTS.copy() if exclude: for arg in args: if arg in stdtests: @@ -508,11 +509,11 @@ 'test_py3kwarn', ] -NOTTESTS = [ +NOTTESTS = { 'test_support', 'test_future1', 'test_future2', - ] +} def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): """Return a list of all applicable test modules.""" @@ -613,7 +614,7 @@ stdout=stdout.getvalue(), stderr=stderr.getvalue()) return -2 - except (ImportError, test_support.TestSkipped), msg: + except (ImportError, unittest.SkipTest), msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_atexit.py @@ -0,0 +1,84 @@ +import sys +import unittest +import StringIO +import atexit +from test import test_support +if not test_support.is_jython: + from imp import reload + +class TestCase(unittest.TestCase): + def setUp(self): + s = StringIO.StringIO() + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + sys.stdout = sys.stderr = self.subst_io = s + self.save_handlers = atexit._exithandlers + atexit._exithandlers = [] + + def tearDown(self): + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + atexit._exithandlers = self.save_handlers + + def test_args(self): + atexit.register(self.h1) + atexit.register(self.h4) + atexit.register(self.h4, 4, kw="abc") + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), + "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") + + def test_badargs(self): + atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + def test_order(self): + atexit.register(self.h1) + atexit.register(self.h2) + atexit.register(self.h3) + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n") + + if not test_support.is_jython: + def test_sys_override(self): + # be sure a preset sys.exitfunc is handled properly + exfunc = sys.exitfunc + sys.exitfunc = self.h1 + reload(atexit) + try: + atexit.register(self.h2) + atexit._run_exitfuncs() + finally: + sys.exitfunc = exfunc + self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n") + + def test_raise(self): + atexit.register(self.raise1) + atexit.register(self.raise2) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + ### helpers + def h1(self): + print "h1" + + def h2(self): + print "h2" + + def h3(self): + print "h3" + + def h4(self, *args, **kwargs): + print "h4", args, kwargs + + def raise1(self): + raise TypeError + + def raise2(self): + raise SystemError + +def test_main(): + test_support.run_unittest(TestCase) + + +if __name__ == "__main__": + test_main() diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -4,7 +4,7 @@ import unittest import warnings from test.test_support import (fcmp, have_unicode, TESTFN, unlink, - run_unittest, _check_py3k_warnings, check_warnings, + run_unittest, check_py3k_warnings, check_warnings, is_jython) from operator import neg @@ -418,7 +418,7 @@ f.write('z = z+1\n') f.write('z = z*2\n') f.close() - with _check_py3k_warnings(("execfile.. not supported in 3.x", + with check_py3k_warnings(("execfile.. not supported in 3.x", DeprecationWarning)): execfile(TESTFN) @@ -1581,7 +1581,7 @@ self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0) def _run_unittest(*args): - with _check_py3k_warnings( + with check_py3k_warnings( (".+ not supported in 3.x", DeprecationWarning), (".+ is renamed to imp.reload", DeprecationWarning), ("classic int division", DeprecationWarning)): diff --git a/Lib/test/test_pbcvm.py b/Lib/test/test_pbcvm.py --- a/Lib/test/test_pbcvm.py +++ b/Lib/test/test_pbcvm.py @@ -53,8 +53,9 @@ # use subprocess asap 'test_types_pyc', 'test_exceptions_pyc'): - ok = runtest(test, generate=False, verbose=False, quiet=True, testdir=None, - huntrleaks=False, junit_xml=None) + test_times = [] + ok = runtest(test, False, True, test_times) + print "got", ok self.assertTrue(ok > 0) def tearDown(self): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -15,18 +15,21 @@ import importlib import re -__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", +__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", "get_original_stdout", "unload", "unlink", "rmtree", "forget", "is_resource_enabled", "requires", "find_unused_port", "bind_port", "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", - "findfile", "verify", "vereq", "sortdict", "check_syntax_error", + "SAVEDCWD", "temp_cwd", "findfile", "sortdict", "check_syntax_error", "open_urlresource", "check_warnings", "check_py3k_warnings", "CleanImport", "EnvironmentVarGuard", "captured_output", "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", - "import_fresh_module", "threading_cleanup", "reap_children"] + "threading_cleanup", "reap_children", "cpython_only", + "check_impl_detail", "get_attribute", "py3k_bytes", + "import_fresh_module", "threading_cleanup", "reap_children", + "strip_python_stderr"] class Error(Exception): """Base class for regression test exceptions.""" @@ -34,17 +37,7 @@ class TestFailed(Error): """Test failed.""" -class TestSkipped(Error): - """Test skipped. - - This can be raised to indicate that a test was deliberatly - skipped, but not because a feature wasn't available. For - example, if some resource can't be used, such as the network - appears to be unavailable, this should be raised instead of - TestFailed. - """ - -class ResourceDenied(TestSkipped): +class ResourceDenied(unittest.SkipTest): """Test skipped because it requested a disallowed resource. This is raised when a test calls requires() for a resource that @@ -68,18 +61,16 @@ def import_module(name, deprecated=False): - """Import the module to be tested, raising TestSkipped if it is not - available.""" - with warnings.catch_warnings(): - if deprecated: - warnings.filterwarnings("ignore", ".+ (module|package)", - DeprecationWarning) + """Import and return the module to be tested, raising SkipTest if + it is not available. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + with _ignore_deprecated_imports(deprecated): try: - module = __import__(name, level=0) - except ImportError: - raise TestSkipped("No module named " + name) - else: - return module + return importlib.import_module(name) + except ImportError, msg: + raise unittest.SkipTest(str(msg)) def _save_and_remove_module(name, orig_modules): @@ -95,7 +86,6 @@ orig_modules[modname] = sys.modules[modname] del sys.modules[modname] - def _save_and_block_module(name, orig_modules): """Helper function to save and block a module in sys.modules @@ -147,6 +137,17 @@ return fresh_module +def get_attribute(obj, name): + """Get an attribute, raising SkipTest if AttributeError is raised.""" + try: + attribute = getattr(obj, name) + except AttributeError: + raise unittest.SkipTest("module %s has no attribute %s" % ( + obj.__name__, name)) + else: + return attribute + + verbose = 1 # Flag set to 0 by regrtest.py use_resources = None # Flag set to [] by regrtest.py junit_xml_dir = None # Option set by regrtest.py @@ -438,12 +439,14 @@ unlink(TESTFN) del fp -def findfile(file, here=__file__): +def findfile(file, here=__file__, subdir=None): """Try to find a file on sys.path and the working directory. If it is not found the argument passed to the function is returned (this does not necessarily signal failure; could still be the legitimate path).""" if os.path.isabs(file): return file + if subdir is not None: + file = os.path.join(subdir, file) path = sys.path path = [os.path.dirname(here)] + path for dn in path: @@ -1066,6 +1069,23 @@ count += 1 time.sleep(0.1) +def reap_threads(func): + """Use this function when threads are being used. This will + ensure that the threads are cleaned up even when the test fails. + If threading is unavailable this function does nothing. + """ + if not thread: + return func + + @functools.wraps(func) + def decorator(*args): + key = threading_setup() + try: + return func(*args) + finally: + threading_cleanup(*key) + return decorator + def reap_children(): """Use this function at the end of test_main() whenever sub-processes are started. This will help ensure that no extra children (zombies) diff --git a/b/.idea/libraries/extlibs.xml b/b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/extlibs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/jar.xml b/b/.idea/libraries/jar.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/jar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/svnant_jars.xml b/b/.idea/libraries/svnant_jars.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/svnant_jars.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/test.xml b/b/.idea/libraries/test.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -190,7 +190,7 @@ - + diff --git a/extlibs/guava-11.0.2.jar b/extlibs/guava-11.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c8d5dd6f5bd5b0abf33f5b0203bdc8334e2cbf GIT binary patch literal 1648200 zc$}QO1#l!umaZ#iW>$%rp-Rlm%qpdrnN?zDW at ct)W at auivs7Yw)w?tA&GhZs`GNlBfc{-%M3e>SBxFSy4uVFF*vJ#>qO3L&yqIWVA4nA1*!=cG(DuQtr_8ps8Whbj+xYzXn3$F at hpnyKTyXN?|y$H$>Jc{vuh at jh-4jB zr6$QfV#&e-y7}wv?N^5KCNruoy)HeF{QuhqmOr%t>~}G+v10h2BVhj#VPa!rVrld* zfvkTDMEUo?-=|hK*8dXE{-=1Hzl=Aqv9vTYaQqt`)?e!Y2Bt=Tqr&`4l|I1X??hkz zXOWq;qmjKe!17T%mPL5`le^Vdv|12`Fu{LnBw>Pr>yMFoWN=*R{rhn5j1b-<4SX?0x8rMZOlH^h1)>)}m#$ln9Wy8# zDtGwA-s8QlJF^px1`F!a?GYn3I=51y1>*W at 4#JY8Z%nQ(nk(9Dm`$S?Cj+HW?WUi> zxE(*gYvsnQFMg!B;xd|U=R%};HwGpztcQ~R0R8vo|6&4);DG=FNILj7@@w0M8`b)$UvTyy ziN;GvlZQChS8hIbIzMkPc-2hL`z`TSzAqe|bRQF%z5YxGe1XNu3Tt&pc9?$6a+v0D zIjr{fdWPqR?0O^t(qY~6;tmKke;^;6xi)}dLZ7FW=KIld930k?BE8TfSO-C+jUuB- zYxwpJSc_Eyokj4p&eT{%`zD_Nl~)^m8gpPjJnu0MksT=U1k-cSI3C^?FT7GX4Q!nuMxkNyzt=2Q_pIOO=o5*Ozhi>*NR zEQ#G_m`Gld)j))!9O2 at kQA9)O at Nk6VkhG>ro){V>1^U7RMP)>#)z|qg{T-yD@ zj3qzkg4Y-?Q)X}ydY(X5F0KTfL;vJJb#E;~5;f*;4GQ9!<*A)ap*F*oSb|S-08HN(Ro;^867;i0}7GA z)jYjT6mW%g at iS*dpfZ$U at p9Kl|Nd6so%|%Dg4aEFasx&Pmqh5LUCJE&K+z2Kou*eq z{XCb3_LW at Eaj@0T={M>-CfW7*7k|v*RUr4QF z#_37>@zlAf4#d~Di0KQq_*i5OoXK(o^iOf-^eo1x)V!DlOwA6Z^E|ewQ3VTf6UVH| z3o>!qwaiewZp+7T+NMdof+P*WUJ{s^ATPXGqyg*Mj;dU2E!JN!zk|4mwy*+d8pLWU!Q!g=91s=l{0vbfIu?z{E`^pI1p{gCs{i z{%&xfV^7oEq4*OMZnkcdJghWJ5*x#%5i(p#(JoO_xV+6&8ylHImmJT?14dplK#Uj0 z`R3q(sH=l57sM$~zot8Ju>fR!Cgj3&=Lx{^vv*mSF;{C9vGx%z8~ulBa9?xoMEKj-7EEJuu(#r++sfN7wB#cO<3(|NvbN#{Dp#Ln z_y5AQ!3|!mUZCU!YqQQb?y2WW=8ymK^em1-lvNfVrIJI^T(zVuH^|K zSH}}eefMl*O7|q19{W4&t$&q>(D at C!9c|lC at yt)G4^UrRbi9Rg6f{61H>{d;HG(la7*+9hZ2Ka>(ixY+EAlt!}JfOVa=$+1DWsRtR>x zZ^4tzFg~*Mz~=NI=FUDHQQp(2qTJcWJ3!`?ceLKqnZtL=q#5eH(+5<-sU5tk1+dre zkpG^Fn!*~tqJRJa9fAS at 3H@y<`ezCvm9YN(jV-_)pl at lU3b1rC5^*&!vi)Oz at Q>`I zWMP9MfX1Wrv&9okt1N+fsf^oF?TwN*&lD9$A5}}@#m)y>wtgaJ)Ay;lES5a&3G_{2 zhzmBL=;>*j+~ewe)#0l3acUwu`+GNN$*vtp^SmAV~`)wJog^SrMve1M*c(UaSBeq=9eF%ok`cArHija77)%OHQLM6jM}M5k&%EG z#(``}vPp-a$X)$5#c(3cWgQePD at n4S2(MN<+1E{&V`m7^c5(SvR9I|;hCMMBB~h1% zEjF|Ax0AzBSXk7dy=IhTZ*9Z={78=?@g>%BXIT{5nh%Y{M{deK9{Vn(_>1fB4!oxv zo)y7fVtC?Oy|=W+TTT5n_tqs5=ixy(qx_0bQiTmW>?v{rq7FH0zJ_2&>5W>}}y?K~#cFKG{Hn z-a3kGYn%vDq`FB&+7s<~v7i=>R at yt3;|a_Q!A;jxFJQc#*+2T^aCm&Nmcqja))MF0 z%Y7s_o*(h#bH-ze`r8B8xcD>=Y9i1%C(4x)VyCw`pPe)_i3KTZbUq-Q-F*wC4I at mA zB37_&U`fXk8N{=Kb8!vTLJ%?xP_tu(O$<+HxFq=1={vrz=Q2*BYXP*gkiN){(A|DL zX>|D-2-)Jh|EI}c&BNN9FE9|$?QiV(|98j<*z21)+5_y}{&`2-#`5>cfAf~9I4;@G z|C_hL!97mMrl2)=x?-kM3hg!dEKNx2QVq~ zQU)`)C`_h!ST=%>);)mEQl`IzcKD9M>5ml0_B8lngVw{f)^#fJ)Q&sfHCSI=t}f<- z1_ at 5ya3!6+R-s at d;%|}2OMdfJSvC=rn%*=PCzM*=6Oe-qn&iWyT3UPa(+cybQn6_~ zS#}P!j1xH-%^8?!?wHdHQF~)yo>(fNh;q+NnxW_ at 3>jVg5nK+j%)HSZd$XDWzSb38B8nk1R0S!tORQXwKg7xz91{dD_3h+H7lW-VdL=O5QJx?EGo1(uX6N>$1 zh}bY7bP>0vT%1|lf|-~wws7$Wx*ils09Aw+o-VP|)BP6FQis46+pe0zv|KnvT!cu| z-U#wxiKKkd4&^9VQH(qAzYp(Wu-bCO?|xGT|oMn(ZcHi?U74MV^OAx=U4Ec^OU8zMo^H;P{6N16v0WeU{ytk z44?}&)?S=*I^#Y2UP$f?N!lT=%909gHClw0qAu*2#}eUMJzo&paT{P&l@<|FiCt8d zVyJapV^y>vX;*^Dwok6Z)x)a=HBl5|+Ug?;QH_8ByO6w+maK^6KWf|t64J3uB)jKR z+Atcb8iup%<8*D??A44eaus98m=qA{P^{P{R3G7+h)Nj%^=r#%VHBTicuq~p)(kT$ zaLQV2Lrv>iSSuatKS!K>7iCG840;jQaSghWQkV5DjaGsKJ?o;#pj0J26#9A!q99W| zd9kS863Z|+2TrsJsav!;;e<_-T>ZjnB}DN;!Io0 at uG!*i8NUY~-DEi4haRDhH3%p4 z+$|*o$=$3680n+c#Y(AXj0T5owoM-^YkmccWG9cb_{Co at tnvxvWQ zRYt9BvqeXgaH-QSHd#nCbkAy+MY?O02?7ECuKv{^nGpK%WHDWN#$TMMIv#re?uGZb zI<|;Cth~WJQnWgT2u{94`LUNeSX`xx&?%4 at r7ioE|e=+Bx~>rKp-MR!UGv1ja)CFlE7Iw zXmmJ}=E^F)oKU{~4)7lUVb|~hGb2(2Ou}H$3UFiis9%G|ARSGuR7pjkFNU`sWqA;6 zxxJ)&cXc4 at LEu7=GnVi9`C=KvcldGOSL2B5>DuYa?O{!DG7xS}06X6k*3hR)-ODCj?-9_`z zeXq#$B at tM5^F~B!WQ-VFf?hr9fPr}ccF at XR)xjme-k4)oa>g2}br6@`j$Cz&#wEeB6x5 at GOeNaPlyVf;+JKq-iqgtjQ99vg(Y_X_+3A z%2QY>WDJ!p+t=I*bE6F~l-H51m94R~>sO0G>|`b_SX?U{PKXQjGb)HfSe at me3dCHI z9CG>kPMNV6xa-pxBDG|{6lMEk{Hns%=Ih)PqHifb*=CHf>jhLPmLi`Dt-(CJp%SeY z^|Jxb&Yfh^&b}zW{94}SMlE;vsge`k@=@0Tr?O8fk?u1numjhehVwzv^$&C%47qKv z{?tz~smP`w8|YF4j_`2xTxLGW#A0KtoQ}o%mVj{$?x;PD1g1&@ws1D>Tm-I#4vmUE z>i$qjM3qz4Qa_EjxkTkUFE7_=gWQrmogmm~KYK&+C{oA8!w-11CT!-e^A3uq%JDp* z!d7LhS>#SUwJHod|GBs z<%H>tqSkC`u at +qX%y9t(#ZE8 at FD0WZ8$ zc3!pSeowRE0ar$V`IbDc+}`TUx*7L!;~USe_?%lM_d7DmO{bz8;mP0}tLIUJlG_Dn z#QdYsacy+2nMdJt47E2fNlw4A=-zT0fUu!g>^?tiz1Ehb-tV?-dJbOs}VYQp|Nef0c%FNmMw%&ujELW%`NfG`}53I}D61rKGypu~!o2m+Bv#=8Z4 zkCCe)#ch{)9GR;;GtjCxNoT*XRcs2hzG(BChfAxHSuco2YjW}|klETyvff;}oE;wX z`uxn4r8qGhm*K-FbbRdoeD|)ty1My%N6dO3g{%VVLBPA|HQ6B)e#(H#PVRyK9O z-2wGIt_Sve(l+>07#RIi8Dicw8{rT9E~37#WHCEhC}2D5#BU at XPZY=>8h(q{c~D!i zdhl=IP at mMk**xBAe)s1eHYi}*gAh+H$R9#}SG|v^IiCsJ-P_$FDKXpL+mO;Th-6R5 zZz((<)nI(SXRN_J^dt22&UR9iIl({kl79)sM&hi%W(T0Kv*$&~M7F at BuNDS&s!!5a zp4SEGEQKA5sq>_86{6cqT7QUJYfqZJfca(2II(?AP`GttW7y>kxK}AhFlJ#zvg7F+ z3dow0m7(D{P!{DWGBjS;X>H)tnW^Ixyc at Coah@f7ngu$#(_6bk3PO&Q7F6fnm2(W< zwIRdHACP3Y+avI*`RMfG|K(H?KwfN!)D*}mCayd!%+3|7;9>eLaq%Q+wB$rkPN5MP z3_!_M#k`YN6*VQDspw!J%>njZGJX5p6fYWHB%kDws$Nn~be6(Bh?WH6VTp{Aot?EN zxnMIUV-|KTA#KK_u|xEie_IwEC7chpU^6I1VMESQ&nif=wqC-3%oM5vS$^l(jQY3C zaap1P!Jr}*a5|-hhL}nC1!(azarR2XD5`ZLYT2WO21WT{vQ~_* zd#Cr}QU?WdAH}E`u*_DZ-GrKb8B6mwJe*JE?!+4}f)OoZtvQX&oE^sgjw_LugCo)) zONuL{64Ga1iAoWmg;!*Ne55%yNoPWhnG{io&ZGss{}ZdVvnKfm&MCJjFP*fx;c8k( z+SKXZeh87)D*O_PM?yVLBz`1w728-*Z3XWpT#&wOriz0b%-T=&F+CkZx3Ll<4W80N z6XrmYVq}DGDwRr-x)-6-$7ZS~r}RC=G9UpDMsCCb$y%tm;fTW0HW{IVXO%5%t_zUz z8B!KgB at UXLT(L?;6pgGFng~@;CdD)RD-OTzQ>DoXm+jrCr+7aY^J;2M_mSM3+JzDw zDD4;gpVip_g8 at Td6K&936kTOXNxLkE86RFbwC?6uB&k!dsc-#8`t;ik*u))GuYe;t z2&DX5GXxh$byCub9M(>t0Vd?r5wOaQ~K+<*e&HSg4t9g(IhgPJU!x@ zW_pvZpnA96Xacw5Puxh{?6(4DoUv(5J z55~moy_84$zon at -EaC zliJMcEJuZwni~^OpD9}zr$GGlu*%<1YN@$}W( zby`8S3lXx~!2 at QrYY1e2=BAy<1+Rr7eD-Ns=P?;#>!ezIo46hH>u_dk-{kO>-h|CI z(rTjm?xwpnQOuOw0Vlywx)oWI`8C>j(L0kPEKQVf&$~hA5!w0Bntb+2aW_b1%)@+D z10_uY4Py=qPswsMEBvjBgRf_&U{jej9gP=CGEgpi((V_x{O?(UE>lD8E*J{7`ejP#NRmM z8A?BlUVqa at vJ)SA|3<5?9fY_GjEp#z(!*uw%102l!^}NQuV&aXCaSgr(>HZM($v4h zrSq$ph=q59=)Bb5wG`1qN_e&8rn9QRR7jtdjr|)ZtF)|+zD;?K!KQ9yweA9v)57uA z)x?cMlCg88y}P1JHg=(PxPDPywR%}aW$DL*fZ$g;ojG2&+0 z*~(NXMeUHl3b&~f$Dx&*a(O9e9ob0)!3voo{ZmJXk_$L3HtESD*i*DmW?{Vfj!Jkg zFpIvEh+bDKCzK1MVXt;}JR}k_E#qIM=Pk~fG!L~6CR{(vDt4Q#Lb0|b6TWbk&nVdY z-!X-zGRhC%6hWk%R}_?+w9*PakJOofAGm1-c#4Q6 zESWo~U#`&AWnyTSn^0{~B)(Dd*|Z2%+#vX`{WGdj#F^t z*>pr?3Q2e#46qf-FvdcEC3z#;_E_mA>;-Off3`$HuulWq5O@?#;}Y(UjUQNm3-{#Tq|vJB1X#jy$U~}Kt+_V58V at d6I5IM;>)#z*+Tj%9d;SC&tx(x z*4s~ZRV*R8fTRnCC{c;#G(=to9MwBME?k?s=g8L!%m|hh&@O%2escLGgHvw)958RW z6~Ap16qY#m-6H;yr2dL7e##h4>ax^aqg$eGuBZaFVPG(%FIL1<9qfByg at g7IrvY+= z|CrTnuUSgY<7k~r{1R8>Pwd+(hq`;X)#I`Vlu~BNEG7-Z5dAT#DjXWhn%+EHq%xr< z9KBTF4P^jpQz9 at oe02qoD~>%z&$GD(2p7l;)H4dayrKp z-9lwTOL7WJi&o1iGC}5Ka!%o#A8-1)ru3AhV^Uq;WfO){(2ez!{rZnam65e`b1*d) zFfEz`#3Ukhv()JX^AY#P_=?vZwxWvoqS3kdnnU4$fXYfV=KSP_{LhrB~S*5 zB%kvyqSX=L)%k6pGy8eX)kgwW+9wOfCH{c8)56wve?))E49MP1cYj-KKZ=cB5mPC; zzDTso^en&0{7p4K*qX9*a|aKX1XbsN_RUSTfSYZy7AkSH2J%yA*F3>yt}l$Ibie>) zP7Hv>XdmMs(6$zlPc%OleUI}Gw6<%e&P3t=FN0{CA%@Ei`yw~o|51dyf52Celz&4ggS2Ux{!i>&CLtQWVcq(`bWWl(8; zNyYeP5}lhGk3sJ&{WbhmrB1xS!&~cGVFlZ=U9F{i8Z`=R{Vhuh>GW=H<_dl29priP z>K^tehXXG+)nolhxm5G#$jWy8cCVaIM0UXa6V-}eb`T>kq^IkoeT=lVCv53O?xq)N zN1`Zg&I{e$ODjuEG{NCv?d-bg{vnBRogPc;7ISNMdyeVt`pF|yM?WJfc%E6#v+DrE zFHs)H$cFnOVk=-d>Xjq-hfuHD3%rJSGku#L2V~AIi1HEX?iQ#W$j+ynkfZ8uB(pn@ zlhvzEJq=HmLey=O-tcUH@;B~=UCiF->Hf$kvXJfM9gH8o72X8;Pi$Cy)edNJ1)~th zJ}z-&a4#)J9vgK$)~f`~meCFyV0~xKPX=rIJlnze4bLoK at v1okblkh-1Vb<2nl at kV zC?|O!u9*9;Bd~+?3&P{r6qzSOdau^>w3|@wzG*Xp+DBbRL`o+XoH5RqwwEVhm9KCS|El>MJFs6(h^IR+WD!u;>rP*2 zprOzj8#VUBD*xC}yks!F zBRJ~c;nl|Oe{3F%u`E;bvk{!Vo%7578cb)ERn0uQpO+eiunw~Ipllp|p25KDXg)~c z5k`wR353=}9j&n at c^`cXSU7nL*_cGQ{ahZmwE{0d!K(-4O(N~}EIFd5U+POuIMOi* z*bB7pWKFK>~^@z}Mz55y=LH)7x zefjBL3$joOHa#ANa*mH|Pq=Tp94lDYFSzdcUA8 at _*Eej4?DAxv#yv`NHu&LRmuVY$ z9BMY%5V?+jUbSVPd88Fs7H^3`(-Kw$SzR+x&*DN8TEk*AgNLsRVKghIezI2A zdFAG%dhnQxc06Wa+q$uAr*R}DNazP}wpU3ac8y{vP9_!p at hK`Cty3AURDoS8Qxx|c zYTfB*i!)p~NP)X5F#IMqTEjnjU1b!%qp34$YZYqP(k9IOOGWUxD_ekByD|~3of6x5 zF&3`foT5K?luS;E`A0(Bj+tbTiI?oC?S)Ai-14bhPPrlAonHsSZUjCZF<1R>?55#|8EdZS|U3UWk0-}Hb0^YsQ2xh!sFGbfMcMX#sT)`xVovhic{&~+BLYf6C8*ccjm z7LhT}i;=2AKY1=qG2(+JxkQQYzxLQ1))gUHaaV)094=dnr`=vM;y<2W&%XLFXN at 4m zCK3^07E|&Ce}iGZ+ at _zl3Z)FC3~w3!auQ`+jxS`OZi-h%xR{rl)~UZat%|iP(`iyR zHB%IK5EEx!u2QOyDZePQS;}Ns2jFjI7qVRD{F3k-WNpq6^d4p0+_7{Lw5SrtbfHM8_&jl= zA;?*6eg2t04)_DZTSx%qZi8F?i-Bw}dPRt9$u=?pO-q;saT9jaG?#GD0;$s4qFEUn zE(=v3(xg4r@>EID&FvtetfKv+Ap>p`d8?8!^S#+m-ONEh2hmV3LX=9mj4amWln%kq z6eyICShDxgBFcFpLL!EvXyj4ME+Ti~VoLfrnK($@S=?&q6L=!va9uWf1+cHTGb{!! zQoTCF#~sqh at M~9E#i&-_P at bzpK7=E7AnAWVYrhEfo<3i?#$vW zLGO4Y_L>mhKih0Koqe at S{gFnDEJ7P&xU55aLiq1ciz at QPQ2mD53=9Z}=6?zGKQ?wE zm27P0`0>0Du;_H~L&l3H_~x0^df-!)zSo=wD#epYf9Fqns%yY>9-pPRB3f;p6Hc8S zK->;y{-|<<1&*tfx$=7a)q3Rhd3n|S-5ZGYnjI3<2sC_!^%_qLhZYpOQC(O>Lj|9W zO^vl5tXM at vkwqBDw}q-F9jQzf;2wiu1lFdDOonH7S7rCRA0Fa|AjIO8Jm zWebJill9oeZ3bHkL#xYR9F+^nJkuxjSUCXh3uF{`G-U7`f{^Tp>iEs;eb&_ at X?6VS zBTrhvzO19CuDW%Mocp=cJ|rBCs?qt<7ZiJGl8kSyO~-D|tWd`zjjaXmvc+yW3&h>{ z;C*Kb2vs3=F$M`(jnLN)j}dt0Q=@~4S+ft2zWsbK=ofR1M_lHRMkoG9;(Vk#1_YTe zRY7f`$)+hS{$!|b=jN`3F+7sb4GdQhf^FQ4H%QUa9YeTb4x9G$c%z#z{fCt(Bl0N- z!IEsai2Xx!zpyZN at 3716a1Fh*3h5R(zT)$%z}O&VRe3D&@*QQ3*H}#^**CRGh^8ml zI%$+p^}>Lwz_zKIz1&hFxhGff6dZ#`m|sAu-=mb;G)U%(8(@^>3vH0BE3=o<8K9R< zUhM(bCiKx)F7S1};Ga{>eJ_4Mq%0m835x7FKdKF^f=q+?1=m;!$jN1>I~pQP7}!ck}K`L$g(u_#f|V^Ov|JTGrTJ>M>llB-!1#NQ zs3 at Jfq{?8Qb~eAoxS%cDnM{WT5K`8T%CE#}u2}^gs1oFKPH$hNvRBU`J?0+uc6lxeqR0ld)F8-& zWpwn6hv?yzT#C4sX48ft>w()*(X>75OguH=njru`6 at WYmRNg|E6QbzDyaduPLr?5@ z;1sl&+7!HV at _A~ko|>CTi;RtLH;#0uMZ6_`M|XstEfy<2e<<2KUgIJA`An^QQj0zI z6_qcO}~1Df_Nq7 at NU zntux3bSiSbf4^ZZD| zpXuaw1V!*f4d7$-RFj~)w=HC40o2qg%on*tkk(Q4q*@&9aTm%zC=tHg$a8#|`awvF z0L66njV!=NQ|sY!YU;!I at akqcJDV5O)hAfP(3T>YcIl4NK&bl?XJvvUP%`SF48k1Z z6t2)9^zNBuF4skR9rQet0gA0pu!r3W#IVCDANCvl$|aeCOO5DZaLF$ke=dZf}*TDjaP( z8tHPH;mJETZ2F8}ci>RwxlxoJUwv_b!zXho5$zgx3B)kGX=n-J6&B=8tSSZ}dYyLt zCeH)U4s?ymxR%1u5gN<`k9t(Jf(^LFD z0BPE#Rr@*BsKHa*HhJ9dLLT^;%PeG!f~d9dpz*?`o|{vcuMtOpidpiEVfKIp-R7%Z z`9VW zh>B)g+~m9l3FTv&JJ^4xEVE0e3Gz2(QvU&Etp9YUb!${6Bp%r$%Q*VUKt)X`@U?_P z!FG{d;Dize^c-dm5`9eB^HA0R2G70 z at 3*%H{2n2^!K-40ll26pnjO#MDNM*H>rdVMQBEH_ina*LVzWf z{6aBeeIT-h*g3>#Py!KNjfajdoOYqYAm6JvPSrSJq$f`viiomk>8Km31{mxmi+eL& zR60MZi1UC^r$Kpp9_UbeKIDZi!#m-E^-kTh5QxOXubZVa`B|r@@*_n3<%KBHw>r{^ zS7j0_kJ->lX^U3b$!^VF~!+h#{$e^Sv?AeC~B%}u*4-idlM18!OFB at l+(c5kPX=N zCL7XQ(8pn{;~Q!MxmrXuQ!TMm7^F!}S3)F^@4IwF#nqQ$G<1&Od97xqzjx3}xE;-$r4hpl z6WfxW>F|(#rF}FJoxRod+ppf?6k80ECuy}ebowwPH7xhC!tpVUAg&@H$;^aDZ632r{na*FK?-Q+y+^_ at NsUP<9l0^2L$r<}XhGoz+f!NKT5unz2wIvn=yI3MaXf zOjUiyF at Q#G>?1a2W~_NA3fUr(*RXU2aUvI!xHQa~rU>c!bt}9%smf>k%SKlJs>>Al zGT#33K$Hw4EX%Gn7p(53(5^$%d~`lu zfgOiX`I;PP+zIR)Y7v&_J{+XGnigZM6qg^&sYvbLHN65!Z~}$T9PKd6{9-nP{FP0b zTD~;ZTXuFNuFOaB%tU@@Duaw1DmF4~JfW!219P63BSf0yH2=ly5oS?N at B0p8Ox%;7 z6yb-hqiwGOVE0&aLc^bB)_U8RcG)hxz#o2N2z at RrpinQHb+O6!O!nnZ53|&k5hEe} zMymQhK#KkUv?yx_k_4$-{`5Igy3Jd^62(SD^hDx77^+-u8+L2`{fgPD`74mnuyIhr z9xU$hJB6p*@!2;jEkLEj}+0SKm%JMOXcxVvQB`?|l%|8kW1Mk#x8!K^uV- zH2K at w;*&x at 4Jey=T`{w0I&-ersScgUY#3>AH^c;?w&pVcod at N)>uO~Ttx}ir;MU9G zEw9c&xdjWpPyxJ#E7e1_x^fC!1~pMC(d-k=!aZ_g{q%@jo%x=wmT;69tP9{^Lu$}+*wz^Awfb|Z*VbAj=>$y%R)y{?%G|S9(#A+mvYbc+ zEy<))bj8Q3%&QcBE>~fS8j%6~&9&ud^N!44Tzcj22cBEvj}lh$gDvKTWYJ)XEP*u2 zGD2sr^itQj#eVWm#v9(sK1b$+oKD6KB%zF3`HKpSr-bPiwH4}D zCVR_{BjkQ?$y>b8)O#6NN$2Z2YF_s7czXpfTRQB1E87x!5I;24Oi z!ngr^v`$6)H8zZiZ$;!{X-rUX$F#gvH|&&O5!^yft6c52 at GXYW((Xj?V at B=|=voSY z%DjV#DEYo~<|i-3kHm-mh;mn=s+CCj*Rk*f(_W+A7at{1m1M#wXpRWbXqVv z%QTDeoWyUq)s=n4m?Yu#r#^osamUU6V3O`lxrT5NNkb~tB_Lq1mSHuRm{%B6HU~k%YdTIYnlijw at Kp4o5x zj7U~uC8ft+2J2L|*Fue6SfD$*68HHt1t>DND at wEv*XX1VxseIIr}VBbQ;?R;BuL`H zzu*JbNKy}qqFjGWL^|Ht&D8UxGWzTjP?Jq~O~eb!8(NJS$3__-ufhsQIHe1l6sBuh zVPTlx$6op--av`k_3dlcmABwyt=ZdAn>KI$TqQ9y68unI)75IOh%FnxwkPM9x2G6* zP9jJV#}juse-6)(p$M!xOAOP`MEZ!V;qlzfC&=-=2h!LF*=NH1(i0SI0&H#2J6xoN zfURoMMqYO8bk9;T5hJN)39mL<%I+Doylk0$5}8re+C}}@?cB&pZFws;bx at U}GIc;} zIlK4kq_!wbL=D%6HgQqf0gKLNis58 at B21WO#Dj(?$syJ%MGT2nY5!xNGq((`R4HM3~!H6 z9YNAHRPzXp5-sSX(TSy0%aM`ypZw`Y>G3=NZ=PKL1D-hk&$$!^l0|1uqo%prR`mY_#!UFR_M8g=KsEu6v!yakfnlr%ALU-I5 z!RmX-JJN!o8W@}&Bkl6RN0$L4Foj{|(yhDk at Es?@SBVQZdg$RDIy23<*D;VksAUm2n~r_S zj(bIzu@{MaNZBNaeig?Qg-*q&=6WU=wk2?Z(^zE?E4~CBFUPp1E at 2@fJH?W1%5%2r z_7X3|=QN>61-c0dBvfj1=2B9GWC$2M1q`@ozeJD)YS&~CVHAp(JTb?P5{@eq7`GwY zTMOcvH`{V0NVNzl_A_7ZQk!Y??aF6!zA at WtzWr$@;C&1SxaK#AAHPAQ|KBc}GX8(- zrdx9J@@OBInv at BBNX5+FOiqH!LMA+Aif_XND8J9J%f9c{e6PDg(S8cR7F{!%qMoe)Kouy5`T zWR~EhnaHNSoSRF^^Obetct$Hd9mm?NrE&+s-#EOiMyR(ZixEq!DcJ=a(F!>LE_JM^ z(_YtD_S#X02HUqo#rC#tcKO5%jHN5r^dQdHBX!t^M z+QqCHatDbe9xCgd_3H at Zj}}v$+1WDep>}`6W3F%2#h;VApLYUeh;#2b^a8ozLOMCq zHRn>6r4supCzHFhBANM%par`t5h@$t_2e$Gbq_h}r}PW>x5c(uU7Q+}(~Je&!{BSU z2{IflAxtCb0+q7Y#v^0iZTIM)S^cWfEM+jL; z&Ym;4 at dvPTXof8y)|y07nC3wfArTyxLwQk=z^F36cIvp6Vm&2+NC7UU3lv1!Y3>@jAn?6L zH~l5c`IBW$1B-Yf3i&BhS3NiUX3v3WZ1r%W)=7MVb4J?4y*JH7djF0i0u;NY?WlWZ z{Sd(e_-2zeo%y|8Z_5OK;74r!&_=xB+Xu_}N4mO%$Skgkd!1$*EjGpADxtonN?k_y z<76BsNp|!k)D{AvTh7A&^_ ztw{K90`$_%n at 7DqIM}WmCoJbv%32v$0qR!mB-JK7N5sn$3noehf}P%nzbuz2-e764 zT7qFtao|Ti;i(TtKYvelzxmTl z#u6f!-7`2~^BpK^z*&Aw*L#ZM%dC;d{Ov at fw7AX{}u$xn;F$(su{ ziM$`Q at l~Dwd=&x74 at 4L}gf at GaM=ZbAT?6IgE0L+KdK`4E!cU7tKyaR)J&Z4)x!W^c=kH zy#odULikUR{O8+AO5 at h^{AfJ!Ep~Bjlm7BBbaXTFc#x;Ykdi7G=;BEr>B2 at AZAmPq zyRqjIm_N|P(I{bgeWC?7?B;HniTmP?ezrPX{+=1UKRm}SSm~two$8s-r##vhUGc8nbd;e z&YZL2mpP0XqxPwKEkFr^8H(fM8L=mCSs|IP2Wzu!JF{`&*$$~dOQ;#5`uD}3%y8lc z3Bc at kMHNMf9VIeHQUZ_wIaMe{7rN2ZbS9mYsf-n?nHm74!9h4N=RV~i?l4a_8OkG3 z`eQxTQ$mzFC+v50wY^xpvVdXa{`tVu(YsDKZTvAalz{2hOON|86S-u;J9i97!J+_f z8SSGwr$t1>XdEUwry9<+tb}K)BlTay5qaq zPd*uu7a6f~?-jAv%1kcvVO;p=iCLC0=uQIj9-Zsr_ zOj7fNNO{qnx{OxgF|U_3m&?$tQM}*YtOXr{@uHz_G69)nY^W-v_$y$H#N}z9_!POE zA>P=o-&+ks>od+I{aA+r-lT7lkh2E`2GWwi_6B{8NNv0tmUx4;qwrzi3;yvdM0a<1 zgfn+%#Uq+(#wu2mB(%Rh%KNP|7A_ObW}h#0OskAtPyCr}bbZixyjZ*X2l&6DXZ$71 zW8ok46oLE?(DNT%sTd{Q|80yEUa{-2De!@$q^3q|);1=~yjAFj`KKP9gTUP^m^Q#> zOp|`}-OP)Cyze61@~6K_N4qzJA^lE}bvv2fa-QLRIT*RI-}z;;=ZWWjJ1dM9SGs33 zHDJu+c(*vz9)%v{H?AseM!Y9XhKc?`@tN$7w&LjSw|~W?;$ED(MnB-B0B%9R%;9|; z4r%tG6!r3EL7CW>?$m8hTnq0>eC50E(qNpy><@ZrO_#_!w4f4CaVl=M7!wnba+=7= zoC#kdlB|0yt*u=rp;8l{lM!r4WfA9kl%Zmb`v#@V9}hUz%vG3PQktDMnB5>VIgv6X z2&G7_Q&&0%TjyrhjS&s2PS~g zaG85XDjcYH>?p*_ToG0Bv#&JK=m8 at d&@pkzjFULo8Lju}Kk`K-H=$nq4MID*;Nah~R15rvD&>Ivzf98q2OProcFwN0mUiZfuBNX4E*WyMclu9L z{)QZiBC2kgGFKNY9bw at vSxVI3Am&}R0$CKLzIawd;eihqj%1<*tn6H(SM~IA5rR*k zp8*kHg`VElnZK~9*tU;Hm%h)YHC-ziZ?^|q-ar!`*`bkdtcjGxqcmpu#)3n5Slw0q z3V=bzN1okZ=9o2j>EfkGkQ+?7V+s*OO}6a1%AkBl6!gavPhJ&5q7e;O>xKP{dZ$5@ z*NlTz+w at N-R?QRaL25xCu8n&NCe_E9rH#h#&7JN+jsW|Xh??`Zt9;XrDMSllhaJ at 1 znS9$;`j at KMH9O}@nibkQQ&!%(Gl!tf)RRO1+Fz&k;! zdB4o_+1!|fB6F}OCS>2TDwV5Di=_=4e0V4jCLHq@%y4N7p2mkYyuG7(HJ5p!dF#H^R2A3&LVBs z6!Qx(`E=p(a!h at -A#Bls=Is3b8dRSNjeq~s^@!GQoMeD`eKAls2!7q!YL`-*`#8z z;BT?tHF?CP44t9(iFVLpr;~{x_fU>UEK1`T(MmRj%ChBY0kaqR@{fnLBAj$a-BR16 zrR|;GE=fxy?=+P5Nah?BXZG!_0t3ZRFm3LXLg^BxFl7cOALJ%w_e>_E?$m|6D6MGMR9%*ni2a=Eg%c$%Yi3Ls z>l>I9++w+rqB at 1&Sww306#o_9C=Z|#?*Ak|K9K*uAnrd$>Xt4RD)!1Q|Ch5?c|xxL zpJFNu6QcDC>F!Iyo2*Iv6mc1fm9he~# zr at P#Bw)3^i``5!8*e>!2wTVsDYF}+2FW3h(JSMT|9%RoTp{X++c-uaoQ>ch8$EV$_ zwR4^2Ut1$3*A>>w)V&CUANlb=;*VJKY7HnU09caO8jyX1~R>gW|DrofC zw{q>;YE7MU#&a(aSAVnn`jXD_Ym=%PjLK~E at Wc@7)KzQQsKJmW#=aj6p4rrHv*p5V z{l=9h$Qr@!cY^iXP0(-Cn38|oZ0R^up`21inH=>!EdRY3V1BQS1dB*e)(I(R5iX$U zP;Lk!4y#@zHxi#6BSPTFhca-6j1IeY85jT!Q!C9EAc7D>BvVH(5_Mdln_S6EL;{=F z6V#Ei!MC-%47kfWAf{I*n^i)g9*@*zMYkG8xmW;yCIh{GChRCd5u3RZj z z3X!NvCH5{65i&9Zj(JvlgL}f&V~0Q?@&5nre>Yl&7cQ%6OK)S{S zpwu-o-pU}%$ePp}?L$dTgOx68RXp@^v;HkV>avhx_jjOPFIF0jK<$jFSj&nK^WIiH5`mqfU-GdpbH;C=ZiN-Ml_6m4lJmNq6AV4A3>Ndf0I1(S)rnU!p6y$Y|JCqp%5#o z{%@PC3Jc0snbUX*rTK==Am6NIW0lCnR_=P_8|i8#oT}IF at 0wy! zFH%P>dQukB#w?Obu>1U-%IWx?HxgcDKtN^)TeUVLz at V?cFa-BE?P|HU%XS^Cjb-oe zf%Bz97S!qa5~;kCiF&7yU|5)L$k4)~KnYmPZM~Dr18#cFWm!X~5hO#6^~#k9sHGpC z3_gUAF78CRL+T27TIg0-1eINu%aMmx+A*+X`YOPnx9AU|VoNnpTkQFHm02qYG96o$QY}q*-;#a=n$-6cQ?a#BaX9os!0x{t{0L zq&xF`A=~}Pk0t+5rr>$YOp_-qz&nUd^dctvsC0C~w;TDwNt?`&W$6dXBuH`THZ#85 zB?%9CRw4hq at +Q$tF(t_R*yq2{@o!){1NeUc81z2 at AlrY^aoK;9`S at mWI3{9erXuJ2 zpq at g=0lRwpOAC>yC{`$G!N+*HZ>BV+G~%qm7yeZ02sj92zbS at mjxdF^TOr&{PIt3E zm@$7`yu1(qH3Kw-v1U#b1}h_)u%$HE0fze_P+0|=Xi9_Ju%aEFlLnWSDASBPD2W7e zVj%d>TY>@!L%H{xyQ^>^d}V?p_>tkiV3)g-c{brTDfdwU-nrPE-AaFY at tnk^5}|;v zho=8b3d_bVH|x7&N?m*4W;6Z0+^+bTa|Kp^$0}XO2B!c(miB3ch*XB7_SPqh8(Vx< zz1Z+9bY=(LG=F?e!viYC`_t at rprBsK>( zIn!C at 0&pD7?TNcIDA&5Qu9l3NHrEp}gYkDzytrB#{mhkD)v#iuOX{tHpReRF{hI*{mur0x6_4`+MlltBCc=DDqM>Nx4Vizzuvj2?+BM(Qi(J5ZJYcG zU%`ewYlkfptkjAlO?isFNo3z4<4`_8X-wdFhFB(()JbHh3{}4Wg^S(o4y%4+0s&Dd z0Rd6{_i**^pz6|w@=;k@;y;;^(PQ?EN0fjJ7BHDGL54I818NW>AtH?E8!W*iXE1bN zMlm-8sM%U$bW{#CyP#-mx6fj0hZwB47pirvYF!!8xy{ixy8)V)wBDw>Zl-vXr zfcX86yVzfHyr+M%y{Fqwwm&>BW4yaTfMmy+8Fa$FE*mCbZhGS}+z-&GLsfBa10hJL z#Z+-=Ly0>ZFrk at _hd9VrXNn`eRW>L7+!*(~G?rDZE^MqWEKzss4q2;orrveOvUL?< zQe&n;`wNkNjwlf?)2O|2|6}=Pj_bM2 at KK@8YaRpx5Bz!kvbD3+ah%B zp7+J?{4wnN;sALB<}P^(cLq$X`xL65Dom_~iEMwghGskrnYPEdaE-F<9`;XeA1=?_ z82q3Fh0x?hj6e#c?#ijc(GpV?Eg-=g{%i^0XD68_Tg;d|-C-@&sR0`C() z$2Vvp&uGk3y-%XonmrtvNuYYyF@)GVvU)L+F^|w#c7wM6l95hO{wmCH*-xSJnSkMT zkRbF4h?Ms-^bh!nh?Ms2JzY}?RwZqAxx9XrB!y+lV z9N75E_UpPF;6hbCVshLAAj#ZZ#ki3H3dID1)-fWFtDz2r_$vq0 zd~pf at BJ2nXh|{YON#2SFy9kSD4joji at aNEXp=jwy9HG8S1=3`Vpxyf=SE5#S5$}qo zVmj2hjU*86Cyg>e^<{K8 at P6F@%o_&mtq9!$j{fXs1DAXNKlT;EMa&}yV$3WZ?s8DX zaB{H+i=YIT(Cx>%8^kjx_CSC{PqBTivy})X?AV{AY%1#cglhtsf}DMUp325XPdHcV zbI2!g;0TlGQ+kc1wt1m;*AqLXV$T>9siF>)Mbrb?Zk=H)ObK$#C-5R7)EJY64##L4 zMD)0tk;-XV+2bx<(*}y& z*fKoo=32=Va&0zabU(M(%R#hB%#K{vcYZ|(pN6hM{GYj>I*=tk|C93 zL>Z7IZ$K(TwbGR3*c=)I6lHmEw>o%D%PgYt$J{OUw at 5dk4A(4IE1FWK1|;M>?y>?l z4fyGg?z3uTz$rn`#V4H2^i1t?GJ~>cXJC*r?Y7%b0Wh;_7+etGdFyh)Uceh)acOnKPOP8x&z!LXF)CseTCjmCqh^I#R3Mg}~ z01X2_e2-U^MIHAD6nyuC2%*^HDo0442b7vH!(V at 8kY9j7IxJHlStO=a^J^ItDEF4fQQ^=)R{W at lZ3+$ zX65iQ0L at tB8tNLMp-CoZ#&EQeF2jYBh;FR#cT|8*RXQ+rge9_|1FrGOog;YAulJ2H zHFR^tZnuvUfo@*=USoy*^+w3=$HjAQlBQv1Jya=(AN at sMUg5kre-DC#NPy82twnc2uwC@ zYEdJtOt0okc}=Cd67?kE2aDhBN0)0BHd?h#pfrwXaNtG}@k}_}>YFv1pU(||RR7rM z>f6Z_5MecDiN^Bnj;TTQSqx}p_WQR5-5)ONeOWQsX&Y~<=h7NOXAXDg+>&~h?}-th zwY;X|$zOHJ3sVR~%1^{}4j>6%m*Y~T?)sEMsU5qt(UG*M489AY0cp!=x#Y_{>eBX} zjkDURihwV=&C9Ja+h#MQB(t_wvd}`EdaIat)5n0m!9T_{Zf?WqMMc{%!wqQ`r+cybNZ7@# z;g}=-bMW8J4{H at 7!D_h<7KDS712=e|Jmx}-u7Q?fMc4~3rvMJ#si}%OvRv)qVn_IB zE6VPOHSP;ZW%=3%QZG$J6mc}nlAd^;G${s at w>g>a%8et(Kl~eS9|4}mTu|g~uj0WCG8=Qi zv*);GVKe)AtUgFT)%*IZacQitxZh}o?PL9C`6)i at YMy0yjm+eJ3%l^2+#R37K^?0L zx~~Y($S9#tyHVgIypDv6(P}Lgw{)+~;No|ta2N;tY(8K=m3uw6JCIG}?b#59*gU{- zR<8s;ssk&#;BXA2e779m>OmB at u5h`7KY$4w>`y2?mAm9p|3K_d9mUn55^6iyJ4&$1 zLMthv&hkEKnYpxN;^2%maXV?|Y{;Rf;8KqiqhQBW&j{>2G|{3AR)RcBAs}pLQ(R#| zy%&O3MO7)*5|xbnzKcuoj8YjD@}n_3!(5lB^hqb#3I+0$HDjg=#SDtOM4q!$=2GQ* zQoZ5uGAoWCPieT0>>?Gw1S{ML^%C|n)xv{GQ#K&8fQoIL6Ptbn?a+5zW<1<8nU9q- zLuL5a`nw6`=7bw?rE-(5Z2U=fW{#I^rI at y65mjUI+9h+Cj&jBX;UaU3ejyd#y}XV3 zIi-n=yj7eVX;8;tLiX8BD?U4+j7xbi>rmaIb!#Y3F1@{iuAK at wTZ9E1jVi7J6N1I) zf&~rczNd=8;n7NR1;uS<2{~%o{{5AVqM{M?XwSlU%SFEr6ozH1W=0)#OlE^X#X>T9 ziJmID)i|*!6B$yf*pfFTlnqT!MB?OiiftbA!bRox76+P#v&^fD*0nWf z&Xl4qB1ic0h$hLvDNZvcuJZ+U$_x1s--&7^1tSNhnYNWxl$&Wc$nhelcrgy^ zr$!cT1!Lh2+79NT7VpTah^;GM#xrNG9#>-ONA`xf3B>4d;E)w`29wdWuo0fHWVW{7 z0{=mB%$8tx_l&Po4(DMm;Z#Qi?c6d~sD<@ZJMEQ`{<0ZA*|b92;xeu|#KV429cK{} zGLO}R1{@|XOyFGKmra#p49f)%7Mr=O=_L(CZq3Tjd(yBuznwmUb?szB-jXZ$N3QM~ zAN4qo`YE&f%}DkFuKSIAl4fp3{>NWHZ1<7xdRtECpEt|vZ#MuQ`7uV}BWgz!e(G!^ zcwats6fq;bvc1Yj_!(ZDz80&n)JnK_&~SRyUwEU;=NinL!<4_3#0J_wi~-};xm z4jch!Gw?C!Ezv9ER at 5$u1BoJF`fK<2#_Tn$uWP`M--8cIuN at 7S^p7yf?%DGJlR{Yd z;LuvCB830bpbdyju&e_7iKfV;f7Y&9yB}-K5zvELi{PB&Eio?m zlpk&+Qm7!e5eQ;4Q2De%OcQQmp*@LXUeJuPANjSOm0 at V6ad?%%elzPLL6{>nuBAKR z2d?62K*1|GoUP%Q6m#Y#sX(MRT~Z795)AEmE~_eh-`3==Dq{ai0cxdJ({9};YJA#IPQ7+AR^aKcPQKSiZfNqpCOGWHUzf2B?G z#-GS=o^%T>EB48UbgTgd)reE>T*Hk0N*32WB;K=3IT+ihm_L& z2*T8eD_PQwGH(X>=o(kyx>=ADdIU820u+@%kcuBt`BcpjaU4=HB*5aHQ6)2oe at KJ{ zf0g`_rNwG-gK?z&>Nl4(imOP$zK z`z+55uL at o5vLf$D5M~Jtwoq-k)FPbHlgXyiVK8Ed*)xAoSC{)6mSt1C)_v~@8lTU# zu4moA3D-);g){6p`CMDjl>ofu0y3by#HR_f6lQ5TUL1r+zyP0=kV0Z8Y%Gj`=;u!| zB>~Ag0pim^J!-c&)y0PcJ&z#gF=#e|ydVP4lq?_=RYR(@8?Rew55Q(+=KG-b-a(egwz+2q%ZIv z(&FZD)+^bg!?k9~Uvr5`U09rJS*hKBWIFSL^GptSN2axLQd&4uc!xas>F&SC`n86b z>rd7*)U{w$X`LOJK3VB7aBkp7-4P^(zi3%7esKQ~9r_7PvZt`7EZbGs?<#LFzOLgO zQI(+_6oekbR(;f at qqM@QsHMtN1qiXcRp&qrreSweHRz|$<6<0 z&Hsd+!rk_S>^O$RcjD}YaBzAN_5BDB&mw*v?26ZG+wWn9e#Je0$fI(B-^lfK%%|gY z+St|0yg#`~PN7StU?plyY}ZXlNx!W2=D>> zCgV90?pIDr;KWAg_h1$$5!CJ_+(wWcK3o%_gV7X2fztJQB1Z86n}}!)>eYueT?J9T zMYiajpw;V^;aX&t9x_~Y)Lak$;$CR^A+cU`Lmq99K4CkDq`fYca*yD&(Iba7KAdx$ zn2njiY`<$(dIV3rtBg0K6HS93VD3=fOje8R7E6fN`zLni?tkhF{cwHCr;^**MO($@ zrT}sC?1c8)rS%kT=wiH$4n$k=R#faJIa6eZh<{83*cP8AqMaX<`a<5#wqylT8+8K zAbS*nZd3X%ptPTjW!_+yK*uPBh!q41`Z1^6%nENmaiMc~tc*Bdbvi0%B3)QvPhxx5 z?fjOQG|Z!LO_ at ECrL=ry06-Oqp5>8h!3f1i1=Q9`z0k<~oD6ptZLe@{cYhI;Q{!Jt z%ILb0%OLLziT)&F0h81NHsqUkOwu|M4()*J=8Y1#p~|4!l9<)tF1LQY$u0Y93?a#& zIERn~qQ~y?a0g05^_d3m-qS)xM-t=p5xre=M&z%nQSG_}vI^7JF~ih6*rHV+Pb*oh z*&5LOomZC=)kqRHsM0m~X9*94xfz;A0G&SN4HruQM-)spotS6*HLYk=VtMZUrCG-y z4jq(!5;9xc_N)h%wd`wVat+iP_>wU5-ppRoA3zjJgeAd=l4Rx-yseu`OKt(44{1I8 zmnN7UAnp;*oU%R_^!IM3&adt10qZK>&g-Jv_PqX!fWNnydC&|tgJ8|KnQ^lBTS5^A zNJJXZ(x8FfB17%Jo4(WyRf5q}eKfgEwz?{%=%|~oIAE=o7tR>~W`2$Cu7 z1uC4R&q#9*Q);?XgONE|rf#JxLi33NHRMa7JlWT>+i|9Y0Zlp&F4m%` zm`DFA))=p^i#WAp>NhC_jCtd(_Gp00f5jKvaFpJpf at gU}PpiZwugHEKC%N`DB|mD5 zz0*;Asr8zySfyWUfi&uz1kSkPv$ju%4b`eyxHXO88ORRL)4mU}s+Diero#zD;jW=i zjArucr}D~==3bc0fHauLI=(c_lnu7pqc>Sb at Hg3;k)mbY*ftL8M68a#TWC!{VO`;j zeP@~Yx at Bq1&@va^DHrn5T;PQMnP|R9MOt0bU2=dG5+B!1`Lzq&W^sxF!jcn>$_u#;3EN;gkRoh^gk;>a z-~5z!F>)9uFH~`Xbw6TGXZ)MjxPW)-&v8%|KsNiWI%v^yiILQ%cDMPu$CFv7k3^@> zX*WoF9>J#`uVs9H3z0MybQlYQ4>i+><$!}UL8HX2dZGF%SLjOFFwi>_Y&IK~cVSw} z0f%mpJ{dxwC45uCTEciQ*Tk|Q5&!wtf5-cFQU4U;BaBR(7O0iKo$7T{I)AYXwQ_61 zAk~|5(ve-;s$Prpv8gpDtU(Gz4Wg!@8bz!I$fEN?Mivu(gv$fT4eF3Rsyy?IVS^u5 z{i>Y78>b_tcd3)v^8?+DdUe-<`t+J~7NgI at 9Ydv^p~XLk3O(@B5<*XgnPvz-x5*%z zDm55fwWXMg at T3jDn>D|0SlXkq4V3{UNOxeVq~sn_N4RmUNmz$v0pQZNcRw%W14CzX zMNu}84=eaSc1B&ru&u>|`(pSK<4>%iOM zh}DTw8|2;wv$y5qhhTYL at ZoLwih+|U(AZjs{?fGHt+&Y@=^fSD67 at mvxI=dhvd>3( z&E(jlwOPk>{qrvmO#~L}CD4Hb0o5V^0kQsnH&JYDU0wdIiy~|2Kq};F`G0QuFHzTY zKvhNM&8bO}q#zOi4#p#vA)f#O7iAU`G8q#R0EhU6!IeaAd3qMX!YkmQuH(4l_|@>b z3(+D_ECQINe$u9^`g|EFp`Flw>SRxvmYEL#m6*GEy6VVwzVUwPdb{44p$F24dGXZ< z4oB#46o*1LibL=Q%!F|}s#8%rws>q78TBA=d4+IjMe>OZO(Hgel$?$TP|4t;#tBo? z5^N0)4$zD0lwS|!M|%585S|IM;S$MJ{KKbL!`?Uw_sb)Rz$y*7p%x^l%g_1B36_JX zM*arcMg;RM+LGs>gOM3F?kwl1^eZT|My&sx=d#(5_^a*3OeK at mB_piaZ~Jag!wPqG zZncJHX?c_vSQu}aC07;bAqmlHr6V{$}--Zutn>@J5)gH!Uo-dyjuWz!D}VLGb}_gt^j)-oAm73oJFmzrbE7h+)c=Mv2vtWDk^qE)a2pdIe zoc*3qn*B{bx^zfBQ?1I#Js}@vOzJ{GZ;ihIG1NT at S7@MDOB&{}%6~Ruov*V>BLWTl zUBOi_mq|rqE=tWEA3kCN5MfZP=gW$_lvxniO}dbDBe#3^O{#9kIv}YZBb_qdRFnz} z#FlSVAS9dxAIZ>bd&z-xt;uVRAi-}~zMHH&{G at Kc%jCkYn?8UUQI04Ftf6)_GINV1 z%`Q9Osg-k-?(uEb88W4odk72!c}NTmVB_}{VdD=t!o?l50{@`SN{>_L&fb#d&d&yw zsqz%d635~^9A3Y0~zuyqE|RUaQh_Ls_5 zptLkfR(dE8NOqEWbl2?Rbynp&IuUTkd?%MsH1I-Byr8nm+8aBK#WH|NBx%WJnLrK7&AOm3mxz-t=nXbF6+p at -=5uBh0vZuZ4WTl}Tqu zG>Us3)=nAyi7Q4JUXSqcdMZZROkgZ@?3i(xY^A$L!DB28^V*k_mvVVQ(+lV#zC$12 zQ%n_(3ClI4 at N~CYfp{uELo^TQ5#Dr*G at b4Thf+IM@h?opWmhU&oy>-?G2lGcJQ1Jb-yzs<9XS{`Hu`t}ZnUqgm zsUe6tqzIh at hRgxpGmrR3xcg*a#+*}pmlgWG^Z46QgEq>*5b+of*wsSdP-ALo2op zE$fODa_=BeXJhb5g1^*s(@7fghM^vo z7TMvv0*}35<*$Je at 5rjH;n+SyF8ckRH!}=WIId~=qn9lO|WgLQ?*B0TBXhoEIrNpsWR~Niu61#&`SG1j6RdX z6 at gy^vm7+ajDb#OWrm<=&^RATa%Pmp>T4(#$r0Aco;bskTV>xLWHbaUB_{;wVFVF} z6gERMiSGXQX5W=4xL}njtNy<=U*y<9a#q9Li1BLdwD?IcHqRQ+v|8GwJyFcF0AvF) zqeIY?=+)DP%b2yqR6lIicj)pOokJOzmNVKJ*7%WFGZ-vU9JrW$HhLJxd8q~(+7jsd zJHTzX5ns5K)7j!r_;w|nlWUrjyeJYIzOmy-lM}||*3CI1pS*D900USPI78qbKzxsL z+_&VKKJD2K=v`a~6PIEjy~{+tA$_AQ?pswVyZ=?jqUwXTmUUQ_YnHTiSqEkRD%r>e zKnI;Z?(BM?f%q=Shv8iD{$FkmYPHmX`~U$0Vt at hy;{NZKA7xV~OG6t=FH;jSdneof z5SyuKD{HHwe!C%akmBacQbD6M)o2j at Ef%!`=u{pRS}Io-%Sv8cAvW*rj&V+oL6LNy z>)$H5;$AJDRZUaooUh)kVfY0je8W6#a0j4|4hWh}uUqRcYwff&EN_3_%`n6PWe-^a zE6PwfAk|@du*H(nQ!y2(nW3Z)_;BkDTu7O~=~#*bbCT6!Ye?h^XOKI}TG~_Il?I4{ zcm}LOI5ko`9J<*}t=BWh9;LFZq^_7yr6XEw)n{iOJ{MFz+D=eO^jLXc$6QwXx6;ls z9kea=It2xCtppAez){$)z?XuBLO7GvB~p3ottDVpqRkxba=^xqsZlreYPlV%TKgK6 z3ox>5N1~pNuhr_5tEQIt>Dt1OI_pL3(FN{y0#=E)dUp;v)Cs1lFQoj20hOvDZx%U< zboDu~AdeTyq-cN-u=c#wN$~j=;F%LWT8$>l^^6sltGL7Q&J%Ue=`fSIo{f0?A~b7V zLKpOO^(=k0d~^1rsVCd at t|<@M(uD<9J~U>z0}meiG+mnVHw7A9H^|RP_Qjjcnjt>f{AamoIqqv&~X)m-!{;0{%j?k zZVK!~eZS#SN4?p4NKb54vBUBn`3mK-B=*_^aLA!s$N07{`b5}cGfx$bphQ7hWHyJj z!MA_k!EdwO;Sa-VbP{Hw=0uoAXHXi-7#tcT%XUV?kgE~OcE&aIw*4#_&~nF2JTq_L zJdsDhS3>h*O;dezOU126=B$+7q;$f9&eNVF at _D!s>#$xmP1$X7T;5;Ru6d)7z0@^? zsMVYYelpHV*dsMpQQ&p_!P)LM#nMUWMA|4nt;ztuV9TY24W(*Q$aa4*kFtB1g;G|> zi at g(#ya#XyWvIB0mXTCQB^VRr_AhK+l;H2tjx&Xrm-9T|5 z4!9pFUS+Lpp=U1E!xIlpvn^DAe(4SpQn@(zK;8ZPi!P`Nfgcy=pWg+7|EJ#U|H>)< zoj zIiRIz-K4fbU0z-;N~fxo0$PvilfV3OLBUV(1MjCaGug$xMqy|4Xv~+F<9$7ual?7S zZ9Y9Y<^9w82c=i-b0}=)00w&c%@JS!aUg(!>a`&d=Fj3D&7amgRWSXBfv_k&pBx(B zfhha;J1%;v*VI6J=dPPcVUq3iun7<4zJtz_j)&d87Z2wUuYu zUs_feK~*fAg)ECtm{48pI0VZJAU^SZEB4XktSnjNZ-8fCTi%hsP;{sZ$VCMp10#@@ zD+U?eTdEs&1gkC91`aEB_XRB_sO5jn!3F6qCB>Rn^Tnza^YG%0eP{@%`brX at ur;+f zPE4rTXC!0q-Qw5xun-N0*kQQlRp*#Sk~xQ49Er=ZvK*ruV;`G1qg&Y4KH;#g8GW=n>)j!;M#SXBIh#wptY{epdWRnB&VS5Q9;nkwt7!<8ne5m3CC zbgt+|tmKst7WA$LROfV#tzpp$iE=lt0_D1q7^ZhbRHeoQxx_G!z!nZ=jAz2`Wsqv_ zsha4~D-XI3BrP9|K}j_oGl!d=G?ET9IE|y at x2+&W&9Rk}_E3g~b|8ujTwBPjSPamJ zmD1!g%SX<}#ZSzc^e;w>m=WyYN{?ev)Of!)KrMt{1c?n3G9y at 7($!{pwUZ=BWM*2D zqKNEBF};XLB;^!r+t3cLQQTNNg at V_7o!~A-*wn2aeCbr*?@PA_FY7iredsDHkb*3M z?Fp89DP%H~Mj8nL>}%|-%9aEdXAg5&au#wY^uETb(I>(?mqzX7m8ww(3JXyoL0i3I z5(>ar&Tvd-XX8*#jJ3=r-yQOC^8@$TlD<^1kc(iWwC_&Z)EdYLrWp-u$4ZqIKYNoy`DJJz at MfnaZ{hA?@8 zW7g&#?neFNcY%xBI%Wl>3p^-Zr>$!l(PgJo%w=ZxliX)jDR(My=Ej*7ag?n!`y;PV zWI9JjHx&EE?HMwMACjYXO~FmQzX7*sxyAu2%CAg1aoGU3u?P-2Q}_i34_<@S`Jx0UZ` zKDCC(ZPe~?I?MN4I83(s at 7kLD9_ywjNCampq2}iTg(J* zXiZpv{?6a$G*R`5uKGgqGg?(7GY|Oz-Tm{WImF_jHl)lk#n{8qXPJ~DZ5nD|8dO-1 zF at JV-eMNA3dUZ*iH-KiY1Ybv^O0dlAb!wnhro?Bosx2H7dp38sT|8#ZtEjtmCP|^> zEB&SoNnl-lNllfwq(yR4?aNk8MaknboiP^cqE(cTnw1^dG zEy|#ar8RTzr2Sfad~V~;BdWrdqK7h(ylt?=-WL;8+f+UP&M_N~PR&)dd$19(-7>2U zg87A43+K&5?j!Vnl1P)+dpK^{a|)8(6vb4 z8!&N+535NPs>Knz4;Hxd+3TR(!5=(bv2FkNC|C2OB!O^kdm74zi6q= z#Pk0)8BZ70gAo50f!FPK4brLq3%HMP(k;eHp81vL2UNs0Ny9fsO*@hXhds2FgCSg# zayi}ceG=HyNqjZGFWJ9;JfF()eDLzIjcT4ShsKM#5L;u~oi*g*-cA674pDp+LF#~A zp3Od*0Ba4274z|6YmLKRI@)WfZJ&W-G`GLKQb-i_UeMCDx764!b{(N5Dobz9SRke& zq^bIj+dGJzo=6u#aLW#Lh!&kwXf~@lH~W&0ok69psIjEWXkx7W}!)F!`Ck at B`Bx|)x%ya8M zz+>@tRu-)D?CS)k>RUrE2OIBjZ!i;sx<>2U at QL8F=yB?+CNgI^XaIP3|k3;U;QL zN#uSbixit4-1YzfWr1+r$!|EM{J*<3+Q_65nkbHtc_nx+>6g9k)yA|Nq&RV4Elq3& z?Y!r#fz{_6 at FOpfb*3jo>%;C1tfdUBNvkEBmI_UKOG|zWe7G&;K(_{Y9xh5bS&8C} z>HBMK^n-q(Uf(#jOEYB?I#;(o6l;8MDxty6rv;ll!*=nfynM5EEvN_h{4h$+jQQ&| zH?~n>df?fu9PQe&<_^s7(y?AsoU7R*tDaFW>r6*Efz_>Ea%^6LdOAj)4_a2DnAfNB z(k1yJiM}97flmu29p*#LV5lfaUlb`-1;gFmFaaPR14tW(w6q!AZ>g8j7yO#XZQelj zD5;Q?Tgy&q4H#5ZiC;7B3gK2nAKub$z%xV3&#P%deOM6Y)q&3%2~XT_XJ(NRsE+p+ ztjyW)kvCahU9ei88biD*tKFv>1B+6c=O4&?#CY_F&HLn4LuckTXvA-+^$uhO4)c;4 zO5kxUnS38%l`aYxl0ooydj5rEZqj1*l>h?)RYL#)iTw9Sri`Vt3#pQ+o2iqt>3^O4 z594}C@{Bx+BH~C-9i5FfdPP&=uzopOGnl0y>YNtRpoy_4$!On3gKsj~hOddc_MP8- zenk1*E`b1#$L(%kkY9x3wiaYf2j63znG_ktDb?WeRUUCORgPkttgJuR zCCX@~)>F)Cwt5Xb`Y&zPul-#kvln&RdR%q>my0lZC$%F_R!zq at wWbQLBYW4KwjTH| zn2}+iR_hsdVM#%z|2#)pUP#}gNfu2wYP;`?6Bd$ zn8hka1BXy4<-aDDw~_nVfU#NdrB9|vHSMN1-_n-dCx2WNRu}qzP=h;2iSo;pOB9qF zL8htdBpQLLt6E^H-2pXH*N%={V3rQiSw5RhQWr|0WZL=fB3^LWae^icPbNE z0`G at fI>jCH<(a2nIKjHEVUyqymrM9QB7q1+1k>UPWS&dlhkR3ImkQ#LUO)*!CgG39 z+69 at 8G$W1w5qjlq>*o+|z;L2;cSyBST at U6AdnjgL^`sY?rf(7j`3(Q-gE93-;FN^e zUORl}8L8+8smObdu^{N7B|_cn(atmTt<_d_Q)eE+0Q-MsThek$R=N$3EcywHGou8@}A5Ag952c z4DQdrn#)`=yYo=Mfq?dqfPjSle;$K>KLj-zn$D=IsNZ&}XOqQiz%s!RLMzw zkWdy9fwAPI4Z)%+Tr4 at W#br1h-h{ic7mY_jQYi?07Ac~dt?>$W2=Dnr2zPxDet}1v zyzX3$WbhFc<5%7{Z71A2n%8X=n;$1(`aqX`5J)znT!EO(hM8wPS;uRzGxYZcw+<0u zYmhP~ngjbKQv;^k-WlfbGdj7R&`wBycc~eUJz9sQek0&B)IHor2CAcVlF#zka;vjZ zuvoR`3anVHPm`P5cn>cou}-a{`^qTGdylF7&U*MurF>HK1-yqc99`ncDUPwKTeaOg zmhe4Lyt#|LA}L=CDg+X0>JbL!wa=z~lSvv*#4U_?AqFSSpE at CTHZ7S7^EZ0kaw>Zf zH)zGFv9H6T6*w#QLfvI#NqQG_G1>HNI=-TVdh at n(BBeTNOo{qN+ob}{)1nV3tUNtp)Z_-UN=*h;j*`~43ZJQ~$TFoD*Q_!; zZkj5=I~&f64uWJM;0r2znRM1F6AF4>9XqT9H!EkKtLez zFRF$Rs7qa}-T<_6v}`;LtSdq_N4Y|yR+6=eZ8kqyOMT;3m8M)l*@4+QrIq`IdJRfu zb64jsp34HOSoP7U&kbySu~idLs_ at io8ZMN%dCM(VZg20g-Gs~y*{ADM_sqS3grJlq zMduy5UuRDOt^7Gs~Rs1fSFdYh-sO8VDJ6bIs!mx+s at IZ`0MOy{cpf#YgQec0H3&3_1u{s2`0M!Zk z7xrnt{PsXjQgFx|xcHr%S?jDIsKYMIPgaTD)%@>KQpX)Zh%~g zEYEB*$VxWnSEMz#qA8^AapCVL8z_Q!oP*1kB%K={Ys&1aSXW%iugEh|Y+(@f3k&S# zJc0#>T2yRy-axtTt$qclompX8e~B!iac*gCo$Zln2B(<=1Zc0n^=Zq;q|xEGs6wsd z{ugKO7^K_QtcjLw+qP}nwr$(CZQHhO+qPC=RjsPt-|chyp1tph?yv8!H{UTMX3PF?S9moezX;3MSwpSqp*=_8 at Z&sUy>xN*-PGVm#%&f zP;vGd-iWv4$iC1R92fm*_0jv1d;Jkm*`baS6dx!Qc8WmSc9faGILUOAVDsE`Zb?6P z&6!)Krp*?8jJ2cbhw)!?DF)?lM6%NuVr_JP-cX5qS4T8b1~pQ4s3c1l+R=%7cc+cG z2CqbrmmXOznKx8HYHafqncm(I7fqzQi#IoErCbq_s+NU}i8;(+VWPs8r9jLUw|2$; z;0Xo7CbTq0`oC!3U#h4DiaOw zXc9 zgAI%M$8B5&5MAyhnCVKUr&ALAsUr;-R>tbeSqe!7yjpV;gma>JC{PX0g&eE!ywt4JDICN-Av3e8BUzDe{ z?e6ETgj`L at M9I9T(7fmG6O+a?hjuXtu?TNQHpc(r8Aui3{b>iFnpU17^KV(cTiL2B zhNr_2S)RQ4gb%mJggcWvFOuCEN5d`a!e-~tvfF0)l4U_eY?sI&F2i0)H8s)- at oI6C zS@{54^L$7BYF at APP@NS7$tj%VREylssA?30!0SX2yMU^j8SHOFRSxf=Q47UuOaU84{XwBJ8QQX5CDK2H~;|F{|m+VTQ5VcnzsA4 z2*P*CNZN74OA^aqAktRISbCdW0eXe(fNb(wtuvvdau!O34YYVA4X7sA5H^1>_&0D4 zu-!o+xZZ~%j+u#OfH?c{@l#moxcCiH`D;n4aJxPe-!uxydesFu}6py z3blr6!`PqS3_}{{i{vz2gR^Ap+KN15ZYe2w4$qYA@|~N9X6l2?p!w1fDK^uqwC!Yv zLWcUETGH#f!!qYM;@mVCtn9>w7RwbHS=#O{kjX at uH)~2}fgr=0!%RD%kid^4Z6SlA z-7-|>P+_I at Yt^E=n at dq-vpMt|q_aC~IKe-ECI#K+36Q3CyA0D@#e=fiX?8VPTD4@$ zLqCKj>&mFxbQyoKz*e`3=2~8nvgg*TUDFLSWMkq7Ld3dbaq(DScDrgdtf7IoIB5Zv7O#q3b&y8x7v%-j=TTl7sNq1 zQ1rU at 8kik-|BzC=ph2;`o3v+ka{FIw$uL!o}?3sLPcgILb~qT6L+ z+0T{|N2-6hzceT>h5)7% z=7isnzmp%i!YpMVrEalVn&q64epx+{mYg7-=rcYr|A9Y{wGyug=ZP2O3^lx>Z!%HF zvp+=omCkKe#v7fI5HfWkdSyB$`5hFvf(V8U!7KTVav<)hIwz3YjQ8rHyfuEdh&qFG zbQ;%sX+Vp2LoG@Z^fL$Tnpx zv4{tJ!GvegFNE|HAhT1{_`PkCVesEnb)F_jfQuk?#J9-2X<5)EWx$mm0Z-lUdGHPL zAJj`mmm1i!E7fSDhi*}`6+EMyp5Vw&cG>4ffQ1;DU5kgE8Un%Vc3>=ao_XE3%N}Rq zG(&2ucN(e)X>VIJVnES|LcaaOMkEar*7zW3_X`nFnf8x(e9<#9F z!Q~*2j|V7aPaLqF?N9uPLyoJ9PrY3{$a`` zQn*a2jNu(aDZRnq8(ukB_(!SS4CL~g=wDr0YybeX|GsC8RGCm$$Y=HQ{9MBWZVYGxO)qy}y0kYWgSM&jura#;}}K z=;whSEZ)K(X#VoSGgnPG{l$amdlH;}SiQxADsCT`KKkmuMKJgwq2li{u>GY$=zTQ! zeZ=(ps|ViqK8imA;rK)GEF0Tkc<+rBACX}EtA>1EGQs)Q574-1L&JFQr5!&~I)1ct z{fmR}@em8)qWSw#)5TakWy4S&8o~RQ4p3iu7$3nMUy8xUc<;$@fF2^j{Ly0;R;dh+ z=(uXy82+f~{gw~zuz2eSkYHPz$dM-*nWhFI%a+XDq?og(GdRJT#Aa-WvSfMIagQ== zqXov{o%1tiGY(X&iScn{vxg#d^8=}!A%gny_YO44PBhH`+c-PfnZtC>u^lz03_7{y#45$Cin){@t`(Dzp6o)r>jb|txtj9^|v_`N|OXY^K&yGp!%bHC9lME2ja2#-#%PN=b&U?%3;<-<1nX*%0YN zgt=qXDr2(b>baSdLcZ$N<-(Y&vNN8=Ba=5<5`}17Fm3~1+bF}8J})=IfU61g6N)KP zrI-HZuX>2o+JrY&L#76s5f3omx#v?HF`(xf=>h zg)e`Qawu8xz^LIpbkD at STsfn0g!I8UlE#aDeW&s;jX=yLv&Oyx!(wwC&H)VTO4G2h zfo!*MXJE_=9ma}@)(A4={JSGm(sd~=(uFUP$(_^*5 at Zu^R!o_!C}inUhL0)<@pzr| z6AwbHl8FLIWcJH;l0u6PW624*cn!Q?mG=-ii5}m``r1<7TF1qPhQ!I$P`+ad$bnEv zCi^qo0`$6WsfD4_AiOLm6a53<4NDvDV}A=74LMNfJUao24kpgmQN}_|nWnSZjH-Da zWzZ2%)vhKz;m%@i$;I_gK5J{uFHSVYnQ5}3Nu5*^1U+-Hw-A at U2?*69Wz-}bR at ZS&uy9RaEdZOsGCKAqPIl{!AE99DQ5v~(Sz_g9r3_WHEm zat}`Z&FHP~2GXvVf|-d?Q at D#S8f2(Zqcb{kAvPq;iLseHgnSC^=@iac7a?|)nWd&u1B7_n5|XILNEK z_>v`!Z26Mu39JWNYa;{dbVY#lVbrW^HVtTJYZ+z?@YbUST(hWH%dl%>Fu+R*>ly0- z>BHlr!>1SKx`hk}y$lu&nl^2K^e7s9!Lx?9U@!v(VBWB7=w&c#gJ+lytUAHi(^nVV zGrSaXZ9|)KIBlZlqbt3<$r8p=ix?&h{Tl$|6jxN?KoYUe~IXnjUzr6ndTMC9V z?-M>`CVpcv)|an8T8ow+3kuO(EIv9i^OCW-44)>8M0SxrhjA>X*;!BNdp}`TSNRO8 zFPKKEF?2|a6|dQrTGVNO<~dm5D4(3rS`|jaURSY7t;WD!tXP zO4^CK=0IBMms*`dn^-PB+{eLc`wm^OU|( zaiTtU{o9kh)urC&S_CJ0^quR{cfXRndr$Q0o#a!9G at PWxqb+h4I0_wwjzh*EW0A4M zS*A~+OQ*Y2r^g#>!S4n2S9MxCaUL!GW+xx7OOLr}D4cjC;=m^#2{`dc#)D5h6gcUm z=7*BVNGXn-hE7AKA=8oR$aUm8avV61w2XMPqZ|`S!LoyUwHo{O*R`545c9|H9g|LA zm6FUg14tzKC70xrUXn at v{HI7QDRRlF at g(6Gg~p+IU=o-ND)(Omtp<}WjVTmWreB8s zxYyu5Ub#%7KDFO!W$_HGoLg0V7xh|F5WE6uCr^rd4Vqs-0uw*fctc zM*cUU#S{`F87PhtFdU&0_FA~FEes^)-KGDIEAfA*F#l zp?3W2B|+GRZF=y8QSSy|mvb55?}9=fBsHS0PbVGNUk1w!X??)v0=ymM-!*r7cB8Y? zKOIzi at p-)k#O_eh+ at o}Ih|tR?Mk$>f|0${`BA0TcZJAI4dOH?xhAkhJYCKJK=!LpR zBa_SJa5x@~ME-vTWh73`MmfW7788r%X_EN60ThdK at H?RS*n?50Ym^K2V8jmGEex4J z#h668O}>a4ye8Y`Zbo-{;7>N~6_dh-**VE-Pt#wZ8$ty&0>OLOh13q at 9^{5=4*MiC zeTXl8ln=Wwv%ca95%m_Gx>ipZzrVd_lKBnPaLR4pZD!ITH^^!01*Shy(~r7=U+xGR zz3NO{JB?i9mWG1O&Qmnfn1R1(e_spcoTt81Tjj}5s7stsqduWd=(KDiaJ=#%{^)Iv z{cc7eVWG(kdL at 1mS#D9wu>?wHc$2%Jz{FPqEE^^=6JXB<^_?+4ZUMx+p*hm75{vM{qY zpwu?!W}{OES61|@Wb&icDVGUVp=&EZpSGiw9)WEuXdjqXQ1M<6odv|~NIy2YpbE|o zNuGN4Dj?&KPEa at 6HQcGvYA`?6ZE*z8A~W>lywhaUaR;sI26ejx%(6 at AtzJ2(HYx$Jh`C2t&|CDe3 zv}^HZo+C=zt#!gsZU5xaK2zUnoiBQ==>Wanlh%)7t0r*+onpRCpk3BM%{-$T^ub^2 z&1bOPPm)7q9;-ZESWownrV6*K4fqD|QGh)(B#q<_NH(4SoObXxM;?(4>Tvw at l#3*= z!2++Yf}J7Y!2ej_f at oh#UViny?hK%Yjzo9L6G+EB0mC zq1-x_3-+x$e5Ha}MRst)a0fh{Tt)rVrrJh at Y^AXY at vMz-|Fl5t<4GYK>m~C#xkDBG zt=qAhuFs2Ur>^@T58AQauf8J(&Zv6S`EFuy1XX4eg{j&tmg> z?7eXM?GsFEPTf0Nhj|I-3mK4ph3TeZ)dB_mkI*5G*>FFKgw#*E at UB?}O>4XTs{6c*U9wsbyE;Q3%QYoB* zzB~`SV9cjdb&>i{H|}g5#ZlWZjUe*%(Xip*z3 at ysIama38LB;rR)N~@JbjecN|Pue zoHz$_Zn92&t0I4_jGy&N;#=jyzsjs~r6CVfPHju?i`;pW!OeEVk#)H>X-r!Z9FA#=jSF5rFc1J8Ms+eN>r}3 z4l~%og6|XT4L5H+b)6L_=w!(b%t&Oy<9M;KxatfA#Q{ZOqq+P9RL2En7*mc;N>+Z% z2QcMeMMn%^G}Xe0y9tKkmJ{M%e?+o#L*06vn`a%o-WB;CBd~QO(Jey at Fi>)$wGTya23bMDJTP+2F%}e5O0S?AowtYlrP5_PuAE> zsD%6iCpnmq#lO=czLJLIDNo#8q)7Wd%7x@!?1f8qZpYVM`~zOId|t3cC6b^a&4(12 z<`ev|ihVk1Gh`$@B|dP-wh?h)mp8`}Bb~o;2M8O-hu+i^)d+uAu%Ql@e=P^D=o<0FzNsx3QJrq2Y=$gsX! z?{qpAMn)xu;2-ci6w>K*I2?|(KF-{>Ttb&XW_#apI?ui3I^ShJf83Yj0wiZB77%O( z!o^T^L@;6=LkUStW+)&GmI&#Wndl at rY6_)X&KQ(kOI+wq)>_ZEq|{}OuKfApqV8ZP zaiMuCs_Z1qmV~IKF`YokJSB5KCwUpy4k1aKbllS-{kg+o-|S6FG=EJ>Tc30yF-K+b z)oku8{~SyBOhNXivEAM>TVs%_GtX~#$$jWBl~QOfo4ol;wQVBZ|zi&xV{B&m{poOi;#@>o<*KHMJxk$5kJ?$P-u<;x&iL z+vs->txx8LXW2eo at tw=_9!{ZvSDrleswyktZqCd+W6ZX`_ob?tDpGBNwh8pM$FV-- zxMQrm7(+!3FPQ46GQwJ~7}@y%VmXS#;^B~T}gvCn%)NS)>~YZrB;=m-{!ga&5@ zLK at QwN@A7>=4ug7@#A at 69#f~;W{{R(*$Kaef7Itu-5MmQr2|#Vp+&s6oNz-z8$dTf zQfceLFVoI52_Q+ at 2};TN8!xcE1e6l$1iR#!`gYhps{Q)AKI9X_J>GQdZ5Sfdt5#w+5qYCh?6PMD7gtY1sdn24(3dPVNo zh2wchIa@;Ss9kM{h`-TJ#J2WXTZm;_h+SKThn{}UzBc8Zy_QyTp83?a#-Ygh3AQqh z(y=-mkaafX8865^0UZgESvdDvB#g{H3;qfBi_{HUM*5dk at q_%^EkXaqs{XqwZK;aw zzu2|>?B0~rrUC*ZD1suoU<;o#g at Rm}nQ at 7k(h&F)x^KCp?YxuQh!^vZ at E@wNV8xLA z0{EeLZ_6Uhd^Bv9yyt!IIL|rhdH*;jW{9{nXP2k=;uRLBUxiB$M-T!3(;) zXq6s3g->SKX)n at N4IDRE^U()sJ29lV at LRv6n7^W2O&%gzROYi)LaJ1K?(swMZUzT9 zZTxQMo^obF==l^1k;+57_Gx6P!Wb*O0>@Q!J)S at lf8ULYm6<8B85$^wgGGjKoK(Q2 z at 98Btuou%oxK>r?YLn6MKxszDaQiODTY2?wF3%!KsIJ-X3I;2Ua#Us?FEZAsT7l0R zCvWxoQ_=Z0Qkk;>J6^dlt7V)&h*h7tlF?cX3r7;KN6Kl+rSyT~=y;OO2~<3|Xc>dy zw7`JOp2GJ?nvp?7Bi|He>4m7Clfao&;tE^_YQPxT*NMKjYp|PZwcg2G#+5> zqJ?3x>_?1AKx}9TIX_!CZ*GE4JbgO9K(|Nu23h%*@h9%ZF~&#q3}+MG-=e9JX&LG5 zY{20{Z at AV(cZ}#3G|5Hkk?Sabi0W?W{U037W at SbpJb%S+9}xfcT;YFF!oOF9Rb`d` z(mvjLSx9`<5)_2518r$&H37v!wZa1!<3UiEiW(pj0=X;;30z&STIp$y4r4=kSMmevp5So!*Id{MRnWbKvY1R z4)3hu2EI3$Udj!wz`?o5?NHrql-}go-e-EH*-f at t$SChSHcyu-ZKg7S@*8ZdNdyRM z?XI5c at zt{_Pvsc~TLGj3-=3COY)>LYGZ;EfvXK=HxF|4Pt8qY87Gzoh> zQ=(ZRR1Gy|Z2iuEQQ2LQ?mC^~tqDBEvx;LTTF@*fBbVJhD$ziTz;MX|rn$3CvB_*W z%?w>xyL4rDv_F$oHaLBMrRnY>Ue7H8mc*~S!7774-x?oURR#Hd72=#3aD42w611s2 zRbNq8w%Kvj$K}Avbv2u(ByOV}2TG<)4sx`WnOs+iB72%I>>I!e9yRpqe_b8zgz zcVcXXcO-I)qW-JTt)Z&lski;N@}AN(HVHMsDr_c4B8+Lm4;j at -c_hCZW~p at N3*hdt?$nA6%`Wz5(8QUxsL$6Q;y;um2?0Vt>xn4I9Rl1GWxPb5LZp=^ zJYJeSL4GfXK(;XGAH5^1vpJnI@`1Oko$W#v}=k zacV|zrf`U-qxk$OP5Z^kaxw<2yo8}D)g02$iURQ(BLN-W17Rc6a*f_bX at 7+m$& zKM=rwyFuf>80CL7NvFo}!UYK+gzi&B5k;n?p|y1#!iXS486QHT?GTu3O1?ijpy3S& zV}je-=1k6Hr}up1)qesD#4Lp06BB@#-(~OMNLfQvx72;gnXi%9)J}FM?ba=^%WB-| z+I7007MYx10Zut!rF6 zBdenP*kW(6>@)O+$}BQjzOAg_>VagL|YgF67ygFis&oi?wF^vtF2LlmIeM|EHf zDCrGD(5L_s;H}`F`?=bE72sg_DWJ4i^q|TlO2o4XW5*=k`ZX(yOTJo z$H+|yk<&Nfij!8mZU`%)8(=NELSVoMK^BXk at v$;aK z-#hSG%U at vf(&Dro9K*#s+E-;)2GnG6rOpIt0q-WKIwm5(c+q&>>k?p}f5_3jlKdr0 zlFU*QN%H0~!aq^D`-96*LWfL2?5S!7Y@srMBkE68qKLx`?NQuXiP014ew&*7cD zY117P295j}E7(lwPsO3*4GF^v>5_o8Czv9ZUs8obPMW_Jy6fk|Zh_p^#t--OuU^!C zWzUXX1=-+h)TAuW%1K9?H&M}3sZzC@$6wVqb)TVi_~AL{VhK{Yf%jU4yO(E=-xURQ z>U9mJxX^6BI-puty)o&>CGA?VI#Pv%su at c|t3H>gBX6k~%c3n5JFDu^RPdhXg;@kBjqpMaZ}MnZH0xlV2~}TS^~-Vlg09TWn57hx{$GA;Q`Y zD5!JNy6Ag9$b?miuso%f1-l at jkE(&t1%F5Jen7B1k>LFEE_T^w at 2UXdk&P8`RmMh=tAJUvUnIHGTR^`-$rYH;#vIJGfWm zK3DkK*%DFxmoLlpxH8;YNbu_3Gy9g%+X3+es5;?qyW#bBX-tT4;EJGt0xajBpc zCBzamb_vKWO-yHh&zQJXlxI>5r(=hu$A}-otg$=d2ldR6NTmFC-TZgPo31{IzdlM_ zHy?+%h+7kFS4ldF<4}u9%3^*k#;p%(YtnN; zZf>%a6r&pRRtdG`(Q{#JdVy at G$~8bO#B-r8#U!(zX!^@;$?Z6$_$PW~{xLn=PuRKW z9G?bmu`*%IUz|BND$fWDyvBB&Qq?{sqh$wBGk}f9Jav1IvxP5x?Kta&hnHLzly2CZ z68$jz(R>=X1w9Sqd)<^0rp7ZMjk^bDcen^#!{?k(Yy83$a`nEgD9x4xwj+|YBNX;M za?LKigGA{tDWbTz7?ZJIz%=M*GQ%myFT&)xcS)G0mEhi3bMp}mh?GJJG|Hs71x{gH zLRAI2sj^24#JUR2uVi;-BS1{rR;kHXrXxO1zwxW?w5w=k_5^2JA#8b#BbJ$k4Oz8t zf74MaeB6Ri1VML2Vex9*3Typ6t085qH3jtALI?gkze^4X_MddjA|5eVn}1y(%b@>{ zJXHUAS}L2m{39px*UEoFgXk(_o1*ybnIyv+4yzMBX;v;|nIyJU*oG!ZDK{*p6e-w5 z<2RQ;+mUaYvPI+ODAK!(ZR=^!FK}&D*2cxGDMD{0E^7NntbYUj>gkq-n4BuX4eQZA z_nmXjbDqoo`k1fZ28cVHWyo@@0wmv2Y0 at ajZOchihkA~xd~EHe)UdZasc{`*No}=h?67+Lqq%C7 z(9~6zl^LW&RcXSMHH|%b(qu at 3zCt1!9VRDSDBzcziVkjF5aH%hf8Uyl`%{jG$;!&k znMP(&Skfyj at U6i!O<+|zc@))ZR!^UtmsOe-Wtss)-1yGdM|UB59MxvBJl*9E(POBl zy at qPNN&-)ghh-36WP!=%8y2Ur!(0nE${Fuzw)zZJ><}8-$(i+9ekNuuyTs^+?^G;ZfyeP#SWofCxo8=W-#bjRp{<<*V(JO{&w=bTltnc+|S zA;4|R@(q#Ci+FdWY(vNwvk(8mR6N{onnj*XYLE4x0_AJ2R!lq=ybP7pKq(0c&Y{; zR*gO;G*zBjjx|hl>XA;{LH~NFM=wyL3NXeKBDjr<;1+ibah)`2hz%=OvOD2-*g%}O zgY-W>ouLIi*OQ9BjYBqIMK;M%rQEylgiD^2Ri)h1iaBF4uxDkTBsCH`lN~*~-_S at p z-Jy-{=!jZ+U={C7o9UAGdRgFvNLpM$Hp(qb@(Xi!Mc6-c^y=vm%=Ncge&fD70Z!1> z0)*~{b1Ys^Ca3EL#i<6>;AEO)Ee4+|eP at pm#4>*}B=6GwuWA?zB at 33@I$)Kzrn9rlFcF5tAUr}7jc1>k*K$`E2GK)m!kLC$* zi7d~`;#SgKho>?iW^G91b>-b+62xUbQ_6Ly1f!spU2U*NZ3x8L2!OtJ4^%E;#9zK> z%7-)KSI-r?_{aT9wZu|~2?zjy78C$L?B92qDo%!W&Sv&bwx%Y3TmN5Ess9fLT-cAS z&bf)j&Jv0RXZS&hLVIEdQ500EL>dqTX$o{5j`wxf6W}Jc${th+5E42Mz*|JS;7k at s zsRESHuA-0)scR=~L^&Gd{O@;9T&hOA!T&sJM7x06iyaPX6m7H7YcC*d%q z{Wl`*7^I=97PkiBsX5B8&tVmkHewpf`Q5yHDCvh0G{+^vW4g at r&qoT!cVhjsB7A5W zF(KFe$Q%N>KNH?FqkcD57KXCIfT*xocGexiuCQbka at x&kIfr-tq{;x9Zsx_zD1REc z!`c>kN^9ne8QlK#-jK)$6(~`Ox#_L4R8tHeO((N8laTp at g*~1}Ah~vdcmuB zVQI8dxkr at Xu)>;O at a2$RV#YqNsB2l at 4{BB8Cwhwy^PFAQ3+-jsS0w37!%#0YLYORZ z(k$xGI**TanO>phjDs#oywOi2w=8RmpX6>KK2hJoE9`xPeXxNp`U|?~kU(SyT^LVD zrA<-|`bniba9-Cdj4_1})fLJt0nMTs7L=e=B5l6?BOiRG`CWVo3;^H?`EO53|8KPN zKQqGf|FeXuXKrhL{6zqng2g~u+IOr5IGYPBK^tyGHVWns_TGEi8{@v=buVAi7<<1ScoZ{N!_|uZTnn5 zT_#_!aMOlO^d%(x1znv7MB=&^Ff zNCFeL!%tiU*dfU<7zyfhEb?L~YO3EVHzntk7EDW*fk$bs1FNO&R(n=yy=a z7|KQ&QCoJBF7mV0z>yQy-5lp|14^v1fFN8Dlz2nbYA^GEtPEp7aGr`I1Tw5}50_%$ zu`EUulr=|LVL%YnUcj{CriMw<(;Gmj!UekON{+s+Lx#T6>oL>jB3EMjY&*#!I-w}ICq8D=^6`G1Cp5(+%FMLeGL`n0f+u$U5aXuO3C9?@4^}t;sEXbC|FaI7yr{Lr%XK zUS)uooNXG-`1NwXkkRvVf+Bu=Q$8qkX)X_ucw0dnAkbe(QkpMKaqZJ_{BGXuT9|_^WQ>&e_|zH;ipW@ zH;D(|DI7UMfHO!^C30jd3aR2CU`rjcm^#9sO2UvvlXR`B!mN%y>_e|IiA-Zdt}-Fz zxJ6fp!N2X*uay$lN{4`!6(1#fHGXWxd4!os^4f`4*cSG^tM=`qwU{=Z|2jHv7<;Jh ztb}xadX=l`^mq55lf=v>~c6BWwHG!5cr^4 zP_v{m3=H8w=>QRhimDJHK$pWlPwdjVS8G#-^h1>(Kmhjx;D>r#gM?6kLrt at pj}vFM z-`Dp4dHjVP;JpE at FuDrHqXX@L%kH!D(s+BECXmZgY7(Vm at W=H>B)3w6nmIB~j2s0$ z9B4MDN#v5y)YE9TdQTbfQRYBsJgY~c41S$*j$ zKg>OsYlO)z{6X=}k$eQs4HWN7U2x~Y|G2XvNy_F$n%i2o^mMD!y$>f(#zuZ0uNTpy z$ARhG=76y614nhYgmBTt`>fNxFfgE#bPS1b{~)b~VcBHmwADE1)jZ;LkbDBZ)UH)U z6+_CSDJblvVQlA2Ce~GqB2gMKhVJlb=b5h`SJ~b__8rB8KbTic`MXGb|92tJo+R7! z7|c1zB6{X#X6JMFPp`AP+0*)de?J%lJaY&GAM~NKNifD(Fv40Qv>|YI&4$q^8?z_H zp(1`z4S5W%+D+I4=&KORB_nlS!x1I*tEMBtp~6r)5D at 5cgX%CHbVnYyVxM9Xs`hd+ z=CsnBv(}~@B*dMCc$kqojp_i#JXvpdmKKq)zZNr#x1 at kPOB;EC`zFm&iZ$n~0y}kS zkJT-eXRcS6lbPV+8;Z2CZF%!L-Rq-~#F~MJH;1 zp=PDVxmC%kx-^O>8a!H_Cs9678nMbNl)Z#*EZ%qh6fm697N}tyqS{?SSsN;^2mF=a zlpUD5=nZGF_G at aiY=zjngyuTTuxT*qncX+9$*LLWvH~I2`EksZ#yOOiA@p zcE-yPlCrX~mf33Tgpki1v-z&Y-KU`*#k+k8^z&OlM~iNdER>sVj>EG)-ppA~hQ*&6 z`c6EA=>6H=;^4Zba_iob1OL(Q~=-QsryN_7Xm|Kk0YJ$4U8(@4Fx;L6< zQeq&+NPS6)I`peUpjOk|HjV~BC47957NpD(lzd=8kBCK`{GAaVEy;8J@ z_C)Y`mEDv+(04 at 0B&>TSZ8|L@~Z7`UY#R-9Ey70NAnq zl3C$VVna$@d{&8$LH+^djf8$tJM_l+**p#3sK^MSDYL#w>}nl0lUL3lJE|>fgmkC5 z>Qjf|Z;&5+{A7L1bPf41?Wg*RT%WH_IEqw<@E~2$XN(qn1QZ)}jgN_-CJq8I%Q6ws z!L+$)qc%>jMfegqG~#*<|3CnPB#te&T~2H`v64J6?!y|_6p z^N6r~)Rf)pHW_A1_3Y6{Ms^MzlbFF3zbIV=uUieVZat9tZXo-pBmP*>Yy?myX|G#_ z{5q;6mjGOM52(Or1*JUjGBL*Q#zVi1bYmPphH4GT5{H at s-RpR{F#lt;nd};vR%88M zk<5=df#5kgc^f1AI$C}4!|t{f{HxW#*Olhb;@;JPlbq$-qbSPSNAJ(*A3KGwj&rb5 zxmWKAOgzs5-=|#a373M0iQwC0^Ewjx=LzB4Jlqa$xxV2;t8&B?U at A=@$Gt8YoJM7Fcq&@Hb0Hk+PYY*WeIl%7u ze9DvJlo9%l_VdN&k5H`sfcyPk7jXZGmxVC!2KqG+3_3P~5A~iHfX at set!!1I9my== zL{m1BO;ji%B*`Fisc>XPQKVPk(r)os5s=S-gB%lX6e;^s=`y`&L4~=6p~#g|5|Ga% zV;wUtyuI8lITNpWbR+Vz_Y%shEb7OSkSim{Xyb+=+9*e8LoUHCRK zG^vuKHTyc-TAMw*Eu at O5P(xnzb8NPxvd(aZ7Z^}AJ$|Jrjt;bTs{_RnCQ-do z{-m-3k(5d#>Bj at aDa>dl)AncB3C>8Q;Ri+9;(J2$*uMfLJqJ`GJ~VOpW;Yj?={&e zc$w3_ib9hrQtwob)B8&{C`=yTLJx|ql2VT;#Mu+!=G^O-kS05uypkVRWCsho4DxRe zDw&P)H2FD$M*2D%#a0wY^K-_I6^-_$*gfqS=1^O*Y%k$RJt5YT3xeXql0?4TMTMXe zC}qZ9UnxsAU4^Q$2+Z|^)Tt`Os=pJ*x;cr|&2!k5nNBgNZcMIhc_h8&utvv|AI1}c z%fq}`X$^A_!v^P^I)mbL2n$JK;oLQ at xA)}EYk06?A!%%cf6FB%OXbAJo3lpWoM1}X zbX^0JUHn#r!O%4;GP|6vx|Xtfgv>~#w9iakRxzmcw>huV!T3 z6wsrtzbK*2yixV^ttCs#hAbr=d4`LvE1jJBs8k3U>vdZt%P+XJ4eP9?h^$sDRhF#~ zaUhkyff5xnrYR#8#>r|)xsqyA4Xv50YEvOGx}y&&IU%Sr<6%_6Z>7+~jkemoBI`wy zg+5Onqh&dfw6xA?P^a`wRLF2rR`d+r%_OzK=_)%&eA%UsV&(r1)(`jb#axHNi- z`nvsF$Gf0$pk%ZpE(t6F%_9$v78RbFmWqFL7Fw&x^LOGZQJUyZM*6%+qP|X**3du+wO8zm%5D8-#%;awbys=J!{{% zHzH$3yz{>|#xF-cW6UQrIRNtluPlWk(ixmW2nXMBX%ERo*wCTLQ|*B3q at S_R!QOQT ztUYoItXz0`m#}_Qv}p2JK<5uLV!<@>QxJ#5q8vy{M(k4n+e-dJYbO z at W~NOn>W)NAavw~UL(f>_D{ND_ at pBal>zIf+&ACq7i2)Y!G!*GScg*EM-Dd{PmhL8 zGs>bAy$Eu~;TvGxVWc6|4zUXJoE`GxkPziF(w~_Q+vM5e6QOVUBipF|`4NHhJ*|i# za$4PRY<3O8g(x1`H6@=KOP-(zBs-twI0o%1x=M+?!cGZAtx+EW<0hY1y|oUY-_qM- z=IbEGD`My}bZlwB0xO!b$rBW7D>p46h$SJp66>VzvT;YCJUC0Zk*SJ7StuQGS4FzC zZMzghMn%TH4X^7OdSzC)2BC}zzlPq_s7IL3PhVpgO`b}ScXsc+oTpEoXcJE at qvkZ# zov3aDN1jrd>KMv^zFnDla5vZ^{oFm`p)kP}9zD6b;XRBVXUY7t9M_%;33d4>rQT0c zBTo4&PI((GE at z6#+eJ2SYz&UN)TRXm*S*Xa-^yQMTmw}VmJBfKRym;_rX?{x2_tcj zMIMfK6`fEt$vR8Wb-}Ghyf9}rmOwL=cHk=3aFtrR$PMY-faH=z3dyP%&11E?c$*YV z at +!c7)rB-X_H#UK_=3Pm}l411~229Nug()Nj(o2E|BF7702)e zl%qS9Na2Pd2TW#yqV2%blWy at a_Q0X)FRbAkR^bJjvjhU8tI)Un^TyqU8x%j-!Gbiz zHN at D2LE9B?zv|Rd|D6jaYtGJ)Yh%wvXpJ6(r zgTLf-x)pXZx#F{)#i(;{mStZLcTT5~P4|@89lgUUhMT4rGz*Y$4VQOqAhuM>1^n-! z{If>hiraNzFsYH8TIYX1Sfp?sR_BN}g$gPbEvh7w!(W5JuW<_cuAB*Xgxr>*1QKO$ zBTb_f$V_}lv<^`_xCN9RI(RI-YB^Ua33g(Q^CjuqINSQR^|l*G(|>=R*yd*#xw41y zIe|;y~)NmoR6 at auA!SDjyuSwqAlr?t>ye&~3bwZR~<|P>{053F_ z|21Bt+E$b&OWIcUZSH;~ALom_f*CKwI9Dhv`F7 at b!GWy{C(!@%5%N34 at Yxfz_F%Yl z|0D-}Nig(v_ctLyh at yeCyuQ-;rJZ4myhQAz(&1z0$I+zqyS}??%^oU(a5Zwz(Xj6I zNhap12Tf1j`39fC4syy%&Mfil$x#!Zb@?u(i-(@RqeyHO;iQjex1c>G##@d={Si_z z!`D9Wku%Xat><=^W6UnC+Ujv~m`|-y_)vN^VaMyncK4v%EEp!n`v;QmOmK$sBC$B^Xjh{gN1M2_rU1JT`vC at W!?R z4T_$TcL8hKe1&J1RN^Z>R99t0#MQ>6fr0It6gcBf>&?%kfx>O1oDT;cn4VxN2D**9 z$vbrFCD3Q~0k7Qd8w&EMwgvfW7P3fW!7^nLqZnA(7^|=Sw`YpXx(k+1X&_&l6{0xq zJ$F?^;}PJmZ_jzcQsOL3in~RiPrd`sK$LSmMp!Ky4_kLJdB3rEDBDhbTC;ps=HLX% zmcH1e-AQ%@BTOKfn+TJ>n5T at 7rq{JP(&gkpX~~y2S^7L?-C!?4 at Gpf?Z8D)LP^8z1 zj!mueQcJbS`17acro0&%*$k?!dxw^MsHgYrazxChwj;40c>w8MY*$>64ei;b?pVghvCBsqs2B!vzeB*K=8w6e-bY0P-UQ*jPqx*&Yh9cp~Nf+ zlwnfwa)ZymmE at R%KcF4>}CwJ$lbbs51uPtSI3a)AnDU}yls6}zBx!3UE$6!tuHhyCdx1LiyUp1{Xt-y`oPpH z{{Za^_Ft=uxw?wKoNr1O6(6q+HCLj9l#h(dbD{l2RCCLJH0A zQkm#gL2ximBy!jju98MaQ>`dO0Vj*Ivx-tOmZ(tKvv3p!fxdpH8Y)gHnGB8IooYI{ zH$8ZYKhXg4)|4WR3njx?j0ovW8FE6=3KP|*0l>h`$4<+Htrgfog+)fG9du~_I;O;vYec%oH zFkbh+iC=#urwTIugaMO%9$2;oiCHrJlg6LXFz-u(C+O{+C-*A>Y8P!G^s$&O-|em7l0R6#8}M<3tl=0xI9PT+ zM3JDW=%mCds*{-&-_}spOTZLLE at qu(RAH5{- at 695#JF^iW)kHN93fsu-0bV0gC|x| zitfHfWcx={02^1z#GtU+xZtqj=ML+pGa>r?t;@SH6o)ncC&sK`KtNpo;~4*S*3G}h zxkOn{0reXif0K at OxgF zz*_{hYLS-)!xt9TP4VKb)8>9AR;m~B7t*d+6F<=<|+ zWkWV=x0=l3sc7>NGfb_FT~XP5C5=wG!fA)*157z=oAz}mI-Hj-^^cBV)0xCNbc z_iRYNihH78E+F*VNZ_2kJ6KpSHqT|vldL#W7s7BW(0it$i9c>9L4JKuHkBNP at ELQA zDD_hfPW;RWr{zO?sL{NFMxg9xOr-Ia?Je2?XvCk8Ke&xm at b*1f-0J-erU08WtZVRreS`b2 zm at KC);+TQ}0eOG}0e$;FV)9QPtuqUmIKbu)C1$4oS7&jFs?J}$e3t5Urqn7T;e1<) zLYL`h7^cOLk`0b*&_{tn?3GKG!e+?@xV4eJqxlCi_GSph2s~RB{-LH6ZD87P&*)^! zy!TfQtHsGv{x3lwRYkeMVg4>O$hr7Tw%YG0-*B3+r}lfJ8)0{c`3CnmG(!8R$b&R- zrW2~{Z*8yLjVsG2JOwYK9mWxg8ZhNn0bYpv99QGpk+%0$$`y zvZSAjTVo!*MI{1?LI(hJldWVeG3nSVQR#i$U1^!F5M|~ZV1tT!R=2H-RuK-doM at in z=M;NZx#0^N{ADKA7C?jd(H1J at sTYu-mu#&B+Tguf8&VJ3d>Yo54z78O#T=BrZ*JlI*bI5)kYaKq6`(f{uA$jgTV7-wqAB%6593 z8zCpN>7=)Vg!ZAQJI6beSqC-Ov5}agM!ikdy8^S(2n8{+xni~pHG6e-ZMpbuqe#>- z9MX$L7*E;AVJii`d4UHnk+($${P^2072U>6%l}^xX8BKqx8?sr*u2X{M-xy{f-EXl zt*Lzp@@bqn#Fl||p#ZW!&~?T_EfThF?k+P>bPDTn7z;gg8j84Af+-MpD at z?B2pSlj z>wKKUz3V=c*>r#LD?T5{TuElIpT8;PHE}={M?;Z72qzU-_OLg&5_Gm7Zg3AnLrhRn z`nds)O{AcqzpZ^WvgGa@@)1XbML%81aikwl@2lwd!L)3MsLyVfW#5Nex3rb zkBaxkdO4JCV(Q;%8rpM1kU4L+NAV&N_biU+(>BJrQ}c`CGLPdM0cmu*%t9%qOHvZJ znth@`^tbb*MX|oW`Ho1l)~@U!fq;V1fq(@6zhL~2Zneg`GnyIF*Yq_-vP~E%(pY~Y z5U~wMpd=g(83;323>h$S0A5t`bb at R~E_4?v5fw?)K`doD=65I(7*$6wMV|%8Nlf4S zVNCiepBn?Dw>NXQjLR7cYbxc6m)gAR-PMna>-GH49!J9ubniwnGFM{^*rkmL)HBfzH_4 zp#7C%{VJzc1z=&5i_EAjScM(at8%+&Tqjfklf6Z=I<>4dm?C?VOvXu+OUhZtVJ>9f z4x6u`W at n4V@scaU)38#fG(8QSix7r)w%uNbudL0A244#A4ve#@bLt5YN}d-x9ciiT zT-YJJQZ>eRDih~L)sBs*u1Pnc(b>!fZjy*yTzA@(ai4-t(00*_WCu9$)h5KGe?*X9 z3uD*OD=e$c<_HeG3K at X(FU(iTiJEn^4OSn at g7*1va-gVKmW at ZaB|Sy3=t#sF`2N&; z5nD*rtNN8t$!RjM6}ld>`|gCf?U;1MFSpWVt?v4mByh^y_|EI_q!U$%>o;6+e~IjbwueH zvoN-?<8&leCv_E1gC-GWddKzRP92~MUX7Ayx{FjgA3yDk0XYv?&S}d9_J~|nJNgMW at wooMq*R=RIZ2_BN-AamWI>&mJID~?Ga--iCztrUja0mm&cOI z`cyN;tD9>`o|ZllZ&A~FM71Y-EbRsjv(-(iu%cjHM(TW}ew(O$}UM-2ulyQggOCuV3pNp{Q5$ z#Ru51?e(sLtO+agrlL6 zhqwhoN$fQ7 at M^-2qU7Gl5{BoDkG3bigXNWrXp&nU+In5Q;_zApI#JfA6<}%-vK6(| zhtDe#ZD;P*SW_oQa6M0rU0PMQSR|g_8S5|9krg-;yl9s}mmArof3-ymgs&en^)N^- z7f-2-=CzaaJ8I$KSbMo0yGgV)F!SZ$|LH#?4L+oEuk!&-3g)PWN`Wu7rAlc=^Y z{I=R^u{+4`?3pQiMYS*2HDkrlEaTW2&>Al;7<)LdN)%F6+lN`(3-U$2ac4rnPnlq4 z$ji at uL=x5Tz*`aKHc`FmKzI%LJjF6;KJ^{ZRiqe$OW7H(f=NoNp5XgQu*Vq0awuIE zFgPdj8dk4t2E(8MdqlPMSnny(j=kP(dV+z`QyKM4Hm9=dK(< zO>8Xjt4aOe16t27#!$-@(&j`_=4Jw><$!pd-w<&(u{c{Bwk~E15(fTga_(Lx06keV zTq+ at nSSj=*SFJXrGkumP9BN|IQM!X|3xXF#%htCaLFVy=p?Pq=xL5V%F;b$oNG6=R z(oP$bODu>^ib>=)pyjxYgE7$6zcwrF*JR<Ha+AZb7NZskB)c`5lH= z7McWN+tV?W*mymE4fb4*zZX>ugh>Iy_e4X1Cz1B`p1J7{ehs!PJ%oyul1w#BEnU1= z+Xs=`C+`fRvu{}K0Pfc4+}g*j^E1SmeVSktXY=IZ(gA~&(qL2+SX~x2j#4)_CH6$u zh+ZDry5SJvb)#uJ(NNYeDN<@Y(yzaSM^MbQw`QYrm}f&LpW2z?%itJp;YE(;Bdz at w zKX-?uYIm3Q*v28lIe=vPT1m8|-eFJ<%@$5WPlUNEr7jDFz60o8$kMM^_^qkRunRV2 zIMPvdC0~+e?ONHaVK8aq6wPKNSq_kx>R_s}K=Kxv at FC6P-z71|VG at o1X2!>dxnR+N1*gI+)OKTJBnKp8!p_C=NET|`aubgt+kz&_^-#&cJn^e<$ zPBW3z at _BX6nsi79tsp{>w2^d3;D>=t6Kr`V0pO1i!wh|N7>f3Xv0C-A7~ZU{Iy z*@eBAs)brHh-82N+kN1 at qJv^LeALQHh&lRAV0xoqc)kd+yu98+fpjyHmHh4;q$FSnmL=&bXQ;G zY0Z4HQE7GwuBen6Tlyj_uR=O4iP{S(sI1G#X;L(&Ru%6~QGQvCceXz7Mq}gm$Pt1_ zz2W78H(aWk-n!LNRg_j at C61c-L>L`_H>u*TM+0u-t#TNtE+fhA3fo+7-L^%R?yS=o zgKfMKE$F8&+89H(SXoQ!o=o~rddo!z7mvy!4{Gxrg4v;@AMSRbUq$#^6Z%>zWXZ${ zd%WLT@>UVANG-m?%)hmut2Dxc#84#Bx21LSRAk=pk9lebr at iVso=U at IcN}y^FO&78 zd8+Xf{alYypx+hlP-?MJNxE9$bR8$%6dz1UEu6TDZS`s&AjCu-%?Xeox$~Gpx at VOe zA_~JQ?P{km2GbCoGL|3W!w}u-D-56{;kZ#11(5;<58E=snPPgWb2r!Ik~p+hNrd;+ za2*5W{qz;{>oQx at ftNGUly&LMzNBNG%4hs+t{5U{RcK-DmVK5JePUemkHcUzCon&q z{#&l5z{2Z3xV!bUKNWuc^7^co`*=%@>sGnLxM>gS1Ax}mrzr`jAD#l6rmgk3o= zIX?m3`+bZ#aS0Rb$2UW+MO0!oO*kVAcb5o;g+=CN^?i31fs#KWEw?Rx-z1rHNMUUa zoEvb;&&o-C*Hk`(ZVc at h4SQv62CA;t2k%3b>QF17cua3d&zHw=K1 z!DxZIgc1B=DWUgo+IY(M&VC6P2q*~@2#Dc-KA-;4l89B-v;M1vwP at EVrMt;y)#BG; zwQ&rpOWWImX4;?_ at tS~g}9Dx_sy5s90r^)&b4UV9uWve7Rn%_62=yfbfhut at rG0BTIv2p0E)!GdSF at 4#IVxme+^U z6*wE|*Z2`sG5goL*37$;AcbqXR$dXlqP!YKXSzUkoa>dP30O9(a#XL_Ld<42$)3$O zn3a#P&{=TG?}BDZ7Cl3*QJ|PAD=g~!8#R%*W})TP^$Qn%z;6Lo&bOr9J7qFvg at sca z;4O5Ah1u<5Zvx2AT5=C5Vj$0ZZ at c+sO6^phJ(w|(bg!1ofJ^!7L ze|T6mUo>#l&^`&EWwA=>Now30N`kPGN*iigS|h1I=83>ys8cG3jj#+i#${zGny(3- ze0R@#SHW9cfvsk5mkd65-+7nbD3TNU!0K~A?T>rju0O7OcDtV7{Xg#C2!S3Adod^- zl!sjBz>7sa3?rBlF&usb!1>Rv6hNc}8FkQGz;4h+qN?6PZr#;B>c$Qxc=IP zyibop?*t=>I^)s-l~V4KDkCr1OmPq0naX_v6;fB^u&i=(OLgAh(Or(Iy(>0K)rBRQ z$w*x*-D$F)j=AQ4Dk-s*@SiawySY+z>@~<(Kcdme<7vAi7`xK5vzr}R;hwz}##o)W zEC61Sip3~s?E%Lo#bLg!F)>fjQT;2#~aJ7wz8Ea+SpAUqzdqTYlLLH znEqXv?RX&f=xbla23&xiQ!7%*lM5FuTn at jJK%vAn>?W#Mo5vb;(zJX*8w*Fq^uT4r zZ1U*mWVYIGDHIi~$GQ>NbZ|T2#wlXjB5W1Um_Qh;P3gjnbjo|R^;;4x8Fjl^z-x$} zzDVk~4w~)}MTOL}h|El7C)@kc^j|t`C(~Al3rePrUaF_h%$IlR5u1TU8)});0 at KLU z;@v(b9c`g!!Xw^Aw29MZlM`TfV(8mv@&^f-lTOZ*SSW$LHAw>gHqv%9jVm0;bvA1TzQ3M7?K?D+Ss0EU5xO)>E z7<*G3IIk0L(0kM7!hn9av1 at M(0 at XfO2iTJh-P8p9BJ+vYf)?D9I6y74QK3n1$r at Rv z7-SO;;}MI at Aa3&?;0~*znbYg at gcdx+tbNzuiR#KCdk^CdTWKLSDL0T-t6ZCWDrMD{ zKJ;kZZ#P2DJb&Yfi-UiNcR`H%Jvx#^`mqF-5+fZ+f)Kkn99c_fQq|^9@@0k^jUXXo z_Mz%d$rk>S#8N{;iCUUEcBZEhR>>3L5>VM|$_Z-#)2+?{k<& zu)eS$a2oen;tDP02kiOg!VegwiItd at p!elG3W#cJa{ktrGUd=4!Ayv|+({2>8>@>@a6)}Z=gc-b z>nW=txDC6X2{yxWTtaE~3_84;y1b&+$hh`s0$V|Dkc(0{9gm$tHy~D3Oq(Z}E%->1 zvUH#hgwtb3bM5foBac07>`Ll1>}nD45mI=z;^ZNv1+aW-qDS}w>^3k5 at eu+{hsPKfDw?7~x*Q at H33Uh%#2=TA$Rhd>2{&a44DgKYq`;8s=z4thp2iTL;E94nVUf zO@|!wMU3TjzzXJQMlxeSTm?kK6Y4^tpC*4&Kg{np&Hs4 at 7SE1GA2ic=l0wTxZ;YMZ|n}8 zxO0mEQW|xaA214knAQ;p*yD$-D>J$WY1JKCnWtCaG|pa$xPrCxvLoP~MW2lvlWP=! zaVtEkW?Qs9;QF$F8i_FV^yiI&j71n$7RRIJwPayNAuoT4Q5NO at X0?3qvJH@#Yp`i| z1D^h|H*x=HWT5Js0w=eDTgG%XWyPki at I%M4CJsiFw&G##w5);o%RcAthFLEr0~?+{ z$_wvLHN*dZTv_Fe97F-;=4MW2b|z+I>P9xMX8-*C4R0T`9AuIY53 z3}VF%ru`ElG z=6UYcDE6Dm{@AcE`q+0|@e|ZrvUU`npBjVE6xRtPpqW5<@MjZpcLqfTc+J-AYfkhPbfuhSd}SFkTBDGn=`D}?1& zW6n{F(0cm(kvA7h{Mmw6a+=mwacmVL`6M=~`QIoZc)x7!v6#w*JgwNZ at vVw4ifQ%| zA1z!!vx-3%{Gb_-#C`;lvsC6cm|4nM;C8ZsQaRJspR)`8Ehr}Z5)RdWf?^2z?=CU< zm!SMZ?h|yM1 at 2?0)~dJZj{>iPyOU!O;X}FNcrC{>Wl~pz`G`9D z762R!_jLPAe3aDh;CK<%k4AF{3wJKvyQBuc8P@HF?` zzdVIw3#z8vgS*zZ^#v1P5Tfiv^PQ6gpTLFY72~i%9Xn;x;_ZilHNqZ(p9-AQD$fHx zA94~JtZ(eK=-E-3MQ0^JSL at rB9U|6d+kKyaFH3WTx3Jz;V8If zaYku1c@(LOlM7*Kvb2TZ->wM-{(U9M4h{q)01pJj@$bU!O!hCam$G%R`Ns|&4couY zKk~D?Zv=F%QKYN{3HJ$Y7MDa=mdMd63ekkpR0KBn*4wt79hh_4aB#gN7*ri%3XY}w z1z_vw;3|*7A-r4+I&oZ-CAJ9d!- at k&|NxZQGOD{SN zSqSr_6RjVMn;29E3x!HsUn1+KL{g&ry|f%v2pgdlSPnQ{EsLdg9mlZD?<~|+38QH( zMa)%^E&{31sxhQ;8&(GIA4v@=)yR)7D#t;P;}^frC6FyTDq1!b^M at T?x2JhJX?1h1 at -+P zTg9Xm2_WP-I8Ylv-K%V)m)V z#}y2Mh!5FhdGwck!@Isp6o!_Vu0ookGSkR(Q;m!=OnH;`IMc&I3G1TvSOTt*Zw_x1(jfXAG4G*aJm$eEGq`zKUM)@#kB1w%h&nsjKwkPvu>HPqTNR zCHGDqRKy{-*|ryeB&iFi(XFpaB}!Km<3tyKn(Gi2E%ci|-7#Neqp9smke$}K!->KZ zyVRebhJS;EjW?c6+zujpdGq}Q&fnEJDVvwx1%^xVO{j)^fM4WH?1WF;XbDSO>cau4 z=w}C0;qPY;QRXjT53!%m0t&O-lCvQa5K{DsP`^daLm at QjdIsY^P`N~=9rl1bg1>%)w_JZgs>Qq1$SnF^(rws|JIwK^m+4FgY zlsr+sh=AK7pEkmuM~6$^74N-#={d3|{i2 at zMe!r|9bq;-h!Y8}8o~->ZJY+3%&`GM zYO5gEU26O(0dtoZoXm3D&C4_XFr=ufqcZP=DKJ?yGy1%c+kLs>oJNDC?6y*4#cY8p zJujtKjE-q5s+L|exnf{5v&J at QxSs9jGsMxvj8OT^=s2oOkMKtSv;|ISbQnfC%NA+gt`3Q1fCY##QOA<2O_i;R}R`#MA*(N+so;4j|(dA znRi66Pliy)_-X_!NaGWR%#ZJ802C?`66u7ewvDU6MJ%dzmj7wXx%WPo(XsdKZL$tH zrym}jv80bFSr`U0*|di)O$*%_^820>Ox<2oy}sIQ*4k8+2R}GGCaQ-BALdYFMxQc> zMyO{jvH7iQJaLc1;&UIBPS`e$fnLve_70m!qj{^%;6+EyH~ora%ImBeco>Z=22MVw z_+|L2QO4|xi>;q-$$T5#w$AP|ES-8gW*!QJGkllhjBL4X9Y49~qtnN2cscm#qGu+e z#ZUY`RT8~Is5wrmp~+xNr_;Tz)UIo>sxUD5x#b2cacij`16f&5-^-hvZ|qw9jIh>X zpS-Mz^&#-S`Gs at w3Nxu0fycZ9-=5lxG{k zgro~pMSL{3c#ZyVXs2Ob%FW72wum?#v|?}Sa=M?h&yKqm*}!#!GE zstg^;d9n(B*t;CMTV5i{HVBHGvsd~-sC?eg?jzB7_z7WsluKig- at p{AVJQ1xFwW5k zF{*ISYf^loE5mE`)vz0bm|Ygt}C-;PsCOS%921dOqit(3IL4tC}!+tvBjQY}$PdGuxQy+X8qN7Uw z{Rn6xfASdAKMG$P=HFe>`yW|G#oo!q%=G_B^rilXD{u5m#jC(9H9G*kqg)cufrbVQ zs1f=mLSau at z{>wn9AVuqQOpUVFFwm;wK#r17HqO` z^Z$CeMeRdV7goFx%_swwjeg8zVjY+Yn+xJL%7bNPlqCtk1TF^g7~fN{3NtUmY87u~ zg*=yF*KcI!?*(Xc?CNR6qpZS-JHzcXcT8eyvu5 at 0rXaYtr>eQTM7fwwbyuFK%Aopk zp0+%-kccRRHdJ3-IY#4p_Ih~~vr<)s_184lVnpXq%$VIB8+HGYX}P20{A}=6F1aUH zTxOWzRskq*)0M*-0x7CNjkaM4fYVW2 at vvX(aC!?@OwC-$JAhE%te>2*8kW?Sb-Usi z$5V6zoj2iav&d;@4FCr`;KMYi!s$Vqn#xQuj$!iSfz%Pky8Y!$CIfJ!B*w_|u at Qli zK!C8!k!#99(;kU_CjC`xu=**cO~c6f?6Pw!eGdbJZS<$&uRD4c(N7h8h%?&afPD<# zA3+a4V%0t7#CI&7&mgH9b{cN$IWKvE-=se%nv>z@={#60Z>x)fU#Tq^c;?|#dI+}2 zYi|bHDb15tW%O0nyA<-;E`KMUhzPzcF7d;{iEW1uHh z`DS_gBmVWZqyK-S@{;HWTPtmC^e?z znlxH$`Xl7Mm%wSWuziD#WGtFt9rG=&Pweu-S#wuVGe4MIS2fDo4vmvy7#w#vR@$*3 z%pqkz#~3g9ryGpkQWWoe5ZU#dmS7(U!E10z`Vd&w*Wc{YV)h|xCx1%nia!&M;@?lU z|NOG_ALm~n`DSyu<#e)rK!wyPOKan`8Pfa~SA$j)6P7zGP`k#paMZJPOBAHJtrG$v z=DGoWW{v>07^+T&O+d5pba#84&Tiv9tP>RU2d)p6V6f7(?i=~wUTUxlgGAs#;K16F zVc- at 1d4>y#h;0=sC3GSjtGJZhwLNh91Dp8$H zin?&ibc}~rT!`+D^jna|`?Y4^5eo=skz6Pg&E7p zO8Y2*uT6?PMaYe%nCf*lP9gPF0mOUN6Km6}LSe=^s8)dha6%QP~2bOzxo9VCT<=P!+xn?)uw0Q9$C*CH-4JGGAEx=R7bkPwoSeu zTrb!dp+7;v(k0f#$+fq>&`zs-{q0or at SNGgQ4k;?Oh_Ogo_~+Zf4A3**||6Y%>E0X z-2cqVi<@?v;4rE;Fy*u<%34Bwu;^sEa0O$a=|iI>_>)Oj@=e<$KD2V8F%;)bgnzlD z0h3`u*)GSIncP2|Gg-U*KmER-4N;<%hL{;3Ng?1-oibE!=)wR~R2i|~5+}IwCig>w z(qZ(OEyGJ|Fx#i2OGmMjIzaE|*edhPaIFd4!$vi)Z($r)@WQ)fTD2<1M$dHhQ(_8{#IkY8(n3U%ZST7+Y%+dEU4th2HKv((-osr~ zxB>a~$6vFAq=^P5T})^p_-oK#IlAj)F+UuM?lim0wS`sCim+%wFio{0hX_b{KCnB- zPo7-5MI0t!IXx$iBBgbjgnceqiZq&5tYTQ2xJ=UUlxnz+Z+`!(y?lJ#dc5B1rfZ*+ zIY?-QP-#>=7o&V&U*~uji1{V_C at ry|cDFUdkz3f%;V#6T>~$CwRSol0bcR7!=HbiP zK(FL_ at 3WlrGj1X)P6n0d1D(=78m6D4y^RqDrx9yqE>s^L|8yxKq}B+C8oaJz()XPz zW3 at hj6OI%!@{%jns)J599+P8|MN)=~R>D(1E$9dy;1OihiE{OTB63Xe(|XV_R7hGjJ{&JVEI)dEB_3=h%H(YXsH#$@qpC4V7Lf0*AIupLc-)%qk=u1=DV ziu_x{UhVr2m|)tVSAf1y#{B`gz&J7tvmdLVJ$-&+&FEG7klC80R38ovtqv&h2h0rL$Y%xHQ5trqw9<@)Nta3fA1Kd-xA~S{wa>|;QvR((f`f#_^&>d z3hrNhDt)(PEF3z+)sS7o*kUyyY`>YsC~BYNQ3A$;>bx_Px!iw5iVEuS}Aj({q;~ zgTITh_|?pzYBJS=#$B|)tXCHXG752vdz?UQ?8{RmfQm4v-23f$PC at X^f?&h{I2i3EflS+ ztX)CNmeiFgeQmKTi3fOCkYv?pN7-tp^e~Q zLJ5=#F7w;Gm|xh}x;a>b1H%(z^{L%cC5)XL&zVwew!`Hp(iN-~q`jip<`6|nkE9R$ z at N*Rha)rNby+m1BFdXI6QJ%Ril8rCD{cO~3^u!rh?AR at 1YgVddRh`DHwRpD&)YqI)44oT zmZd^oaz-|GIHXgP$Nj>8 at LC$#aisJnC_QDX6=b&(K~DiCJ=X|HOCR7b{S@ z*v?Qc^IpPqQ{M at uw}SiJ-QyR?tX(EaIM~)sbNeM=)-7`d-4eO~H}g;w{fL+UpY{3< z90-W}|9wL8{O1A4e|hkPus&PM=5VUhf9pFYYifBhx)GzXgClG at Yzefgjaz(MaJ zFyQ!1B~we1{6dK}%JFYzw_tn#IU)d-@?{E4nl97Qw{oUnI^oyX zIHY}wC(8}h`Q at _W2cx5=lY(b)pDo!bN}+8DF137oAo5TG1t5F|E4Sh$l+bXuggz2Np)l9O%72#GLzw^3$DsdCwJ_k%tA8M^ zrlYc{j`SH~V-vF|l!XNaJ(t4K3zk#dhSt?QBqT#5)WJpGBOB^_5HXe{feGU&o&SdT z3i-M*lR{x at o;5o4AmQ3c3q9P(pRt4}adLUR{^9mRFW>+38Ljt3Z<4!>+GO%~q5^xBnzN{@4B-JqO`R=m2AfpaCR6k}7`Y|1?3f+x3asBg z(@a)bV~eeJrw{XNN)7jIYO{daY`OnM+B=75+Am$AF`qc;*tV^XZQHhO+vwP~ttWQJ zw%I`^osLfLJ$ui5-#asBzt=hc-hbZLT2;SVRjZ0wqR*x8A+zchevxGNTix>+-1d=9 z?`!l43~kP0S%Z|D03G#jCn!3js%Z5x&8k8N#u=H!8%Zt|7S}0t*Y0V=;vWI%g%uZ7 z{Io{I+w7-xP~VzDB_}H2plU9Rmn(1KTw=Z at Iogj@ATy1)e!CAtc`cMaN3iEiI{TfR zsJq~1l+HHN)B(n+5Gnt(Vww$KB~F9)(BOpUanjn$&OX^&S884Kv1IFVS7*!BRl6dl z)v5~DQFfs=mu1`HBO~rzF-MR)BrQ`U;fS}F1-h}_^s`O&?=4H;~gAW6X`aV z?nryBWfiSIReybhGAi6nw#bl7B#0Uz>jbT~bZx{^nAwwVb*~bIN5J-n_j1#G<3l60nD!QeKJ=7bmYWJ^dS^Y<|$kBBPIjOf|K7 z_LN2bDH9RSOlw6NzPAgLeoWNtaFHX1s;zs!t<^=_Z^LAL(MFU}oKE=}4^jXluBaHS zbjP0<_jcRPI0(QNF}GS`+4j{hh%`lm*;sw)j_+<`ks;{V1H4kYLuUE{atFA+Q^@wp zk1AiJhCDMakj-)@h3PX-l)C4mEVAmNT&I4uBrL8?NVWG!E$P$icf#sqqoO_5ArwRq zbh|_@#A_DzpTa*0B)RACEr^`t)f0&uRB at a3$aLpR zQY?BBG~S?U(DNT?DCNl2hl3>vIZP-S|n$J)$`5OLjh?{%Q#2D#NfNxq}Y1V=6;b6_OGi` z!t0LT$@swuXH+GJl6t9bldk-H_qvzgScdb9Jx-~O8MXN~<-A5i_zr&|6L$6;c8GPK z at Er=}+5U7gWJf#FBEpsnOxO$j;WU|&s_9DpjGECjhq7C!a-{GmMdXkA9F=5%JkdMJ zJLqvFB6>W=FqC=A)!b4H`uJV*D8F`$+F!63d(vAn88vSo z0D684aRdwc(g-{5335aN*^LLrLI7g4tqF3}9K;Pa#24}M0q)Rp|Nd_Eiy*W7sdIa9 zd;Rk`-rkc-Cex!Ie!TN#@inS at oaB!1zeg$CXgVv}Ke;y+;%~_+{~F0mQ~8&Nc+-8| zeNee|C&+lPjYuXAi2 at l_goybITjBYuEB54pd)Yd?)MpwQRx#2CNI>e{v~py6TpUuj z%L#A$t?tQb{jDHK%Y0Mf$OD*j1x91A8XBYQk{lb>mCMblyz#ksUNT_0tr|++pt6q< z4;5OPho1n>BEYt3Bysnt1oN6{=|ZIzS1toy+=iUQ0JVkfRh=FG8N5Mh)u)v7}94 at X| z{b%v>r}`cWJ;YaZ+LK1 at A_sqwiD#Kc(@5yWMA;tS!ifVfX<}!6Sf<>&=y_^L>lwY! zp-VDrQ^bLB@)~FifXuN zzv<9n=#w9_Zg8mCR{H|k`$=4q*47>=83#HB=qB3ICu|TO=8;NbyG=_;VR#UDVrFC- zemXF*{F2o;OhC?%iY%pVc7mbb2ELQoqF^Mmcz$&zFD!OLa&S$6 at yVI@7KYT5nrleR zi9yEe_;uRFgHxXvi?F_7 at NOGREa%|#^z959d!x>B;&82Y*al|S&uAtTt+=gCk-Rg>6Xb?jk=4M(Z!&U*@=t-K6`)M;{8LODO>L=*7ui4MX-L?vk zjE+)_8^v)DR=ayGN at z#i$u at G+|E$c?IsrTdC|hWLv_mKL;W;ZL z1SLMXPAZ*wyGy(jVkKHBZLevcc~Sd8gr8OwbNOc*1epYR?^C%-~(JI6P-Y;86i zDY9qgpF{WKK7yrBd21Xk8?8^QDbH|F<=xxt|P*|GXfe}GpAgc`5F2ykB+Hx~ndc$D!Y^?oU zS>SR`oPOvMb`U%dx1vZ^DXPg6-~V-;)-!SD9qPa1?$_!%Ok~=WHu!fFN)=GL1MK>mY0cWKfHGn;reQm$0=sFmD1;Tv7lU5?h at BVLAs0^5qv!iH(UyZT9tNkA=XlId>;93fCTaSnQ)GV?5c>r zKzdem+JundHXm_nyyg at -Q>DAReOr`J5U;c5&is{}b)exk;4fYH&ji66jXyv9{O^&S z?SK5`Fx7t^V&KotJ{&GBgK&nB#XKsci82_3@)0;X9GSsxoyh-}*vYkf{U`fy&J99L^B9)CJR%yqhT{G9D zl at HI@094|)%N#8tOrbbHN#O6ddX7=d$pYCsw@>oOpOaWI at H7R$v07H+Nqg|KU;BO> zj(n at LgJ)%W^4evzP3mB~eZD5H?UvvB-lb`acW+`30Gmp$5I(C<+d&(4{v8r%B=BXh zfvL`Z?X%pGnxSB4qq=pY)ecTITYYYSaDenm+V%rQ^CB~Wh{MBsbaR$?8SOV(epQng z<}6kgW-c0~Qom|MYOYNe_#ApYomMdoZx^wMrDJ!zRd?U<Pn#3}VA>#zh!hsh_(>F?IXooAiYzlfbPkCHs65F9QwIdcHB+{t! zg`^FTIAFa-%`Dpm7$xdQ5QsBH4XI5F31D6 at 7LtkZ8qZG|4A7KIvgDAY4M=5P3Mz0P zX>kF?`4+T?-FW($CyDtvC%P~$G#3oUr6jELB|4X!k1-c^6S<=>e9}en$(5XNX7UU2FTTHj zNuYl|lQI9#Hi4Rr%Hmga{>}6d(aVg#e$P}_BhhiC?zv&J}x&qE;j-{AQU9H*Vs5dL!I?YGm%4&3O0nJsm^=ECBG+zcAUBe at rtLir30pC2!$xOt; z2bvmdnI4bS^wujhWTLeaWpIdly^85<#MV_`+To#oSz?{=s=A^Q@=5h*@RHo7x&=48 zPqb#WNzgwl@)FG5P7)reZmY8s;Jf^o&ZLw!k|wp?Bm6L82+GLFi_n9Qdb%SNosxRS?>1G3$5UNEExjiH^phlW|T`U-TOgEL0I==8; zS4ZIYabK~ZoLNM4z;-owOcP*1j?;>9c9(16AE8UHg9XvXpGC z`Xz_ptZw79*sy#q&o-suR#CTDkxU6L9nSHxNP9~Dhu;~cYhVqY?<2^*=smpVpOPy- zS0LmOQJD||(J9P!R=C#@W3{5!9}F9;zoMcjGRkEI#gXfl9BI!&@+#z-v>~Bxl(RPk z0FC_iD}KJ5qthUM%P?dh?QjJKA)I??tgo=_mgD6n at fx^&MpBCE648E+s31#*MC>ot zp?A|DCT}|#CCYO#$v#Tm{JAM8^NQO?d3dX_xd>sC-lE>EveJWp1ap`~BzZB at zgC zPdrJq1ROeFyzq!EVbl1d5h6FX7o-uN5>rAs%NJ8R=Fnbnpxo?)ra4v}SJv^(rhM+L zoo1eiqlXT!sUjzR4DV&xN!ON{Ce@`ozfSXY)r&XAr%5#WRa#OO zJgV`B at Zz%(Z#r``t0^Pd$DcZhLf{v;FZl=l;Wv9JDpWS!iJQ)V(`imt!GM5IP(%2i zEO44t1A{7A&V^hgG}q`+IZ#rm61Ge zs!0}Qc3^c~e90>WJow%GP)t`x)>@lootWZDf_Vmor@*a-%&>VDUOfYcfIZAD1+>by z*wXu`E1SF$6!wap*ju+9cHZsllfKgCDK%>((+2|+)2LM&T1tvIFej>Oj!6zH;1jVv zl52r1o!h4*nMK)YVK at eoSSr72gLHX*f;grPfcBG}5?Ia0ADI|q^nL(iS6icsW9L=B zDbwQW0ZzBb>vT5JP)XhGwlI2DZ5YguEU`hn4z6%`tkE#a8S6(;9q9AOsDzj!vqibx z%(EH10xU00+ArL z4v1=Sy#3_6rV86Vb+j{BYRihu#}f~cwNqSCysGm^iyLwf{?@mqkxEr-TdZZuqAD(m%q<)wAWSAwl)K` zX$=2`S8SE)AhVpbUyMFegRPW%q!9VmGn7ArM(Jb#^AY3Qw(|F*7xi8eT=L4IWOD7L z>SXP7K-je%>8`Fy8H-iI{dZh#sJFa7?#2PEB`-F9M3PgKw_j?N32VE!L!`F5bboQCdBCvxR>^QQbazt0=>lqm?%AVJ79!wri`G_u6rBf zcZF<2n%<}e!rkCg0-hHj9pxtm$=j;kh#W880!IXl{s5%5)<|n+nH@(u<7q0J!W|~Q zKMg-=OnfUE4hQUddL$CTbj_siqWZT?AkB)}x6B!{Y*4?{E9j0Bf7K*lar|pQ1oEe0 z29nG!_p3R+G50`W%KLNoPzzVTblV}K`&8WqvJoL&S>8O_NAM2$MRs550Tg0cn~IiS zQxM1}soo(o;zK|ShTXV4Zb3RjW^ILTmoju)ou`EY;nW~ zXTwL)%Hv=3Ys!i;h^Rk>940&n$k+cb5%GUc<^F4^MQ!dM&&-eX^zd-1jp$%OWQ<1o zC1nUDZ4~+fNep}}dx8a2>l`+t1=R?_vCpp-co<0W7N78pJcolJ&`1PJ?NTuGazRBA zSABl3Pd>LkuRAA;x6gziC3jS at BI9r!#0N}eqS{+mqPS%*jxk8>okH@%0P`2;cqETs zjv50!fj)qtEUVPpsY?K*@!gxs%eR~=?W%Nb7Fijs(l~$!lSK^;K+j7}gFtl(azr;B z9>`@q%K>r_ at 6=gMZp zIaZxulFmvdX|z3Kv&vF#Q8qQeUW1GUAu|vC)`}Nx|I1!H&pUW0&{xY3W z^RvyEW7q0}b+TOfl at qn6nc=pSfS&`bWDA3C>#6i1sNYpQyto}A9_*UTOzsVNS5%vg z>8Wr5V{NwVT8yP%;1#Gznk*AWCem>(qeysL2@=>h*lk+fry2%H{pUe(e+kEy=}pc} zRDG>I9>%Uxg?Gop&gXg}{PwQ678t at 8=r>|GQDxqJV}He}^GVXpw2n0-y`jK;QJiDl z+mFlR!}#SOS&2PnGG~%7l}Vy^T0!zmIFI-1HE3~-Pf%7uy=o|Ni{cnZmv z*bo_kD&F}UZj?-xXoAV>M|-r<6;YI-Wb2yl8)L)FT4k)RZN$ab1kK%>h%=O*`m7ls zz{AgE*5-feBoIy}D9H8*Iig(ycwzmkiK#e{(Jx^}B_;6p67a2u zKX$;Lkk2a`b+5o?-kM18d at Rv~anFKzc8Gfx$B;J1oW?e$j36?Sir(|Odi5O~LZ9&Z zt&+vFoltSP-))o7df^zJT-u3>ILi0sT%od(eygcqDJ7_)A97GLIC-~*q5M2^sz#Z! z9;S`0F3GmcGOV-;{$!K- at rwbLpkBstAg#`1A&=EHxSZ;%9(RcSMG-68bJ);QF>6P7 z{9jgxhO6Fq>i?-EfBrowk^SFN;=kHdE!*~5rpFZeUx$l&so>$PmC2YP&_sk%IN0~? zy6~qC8aA)&quv#IGCg7cF;lNJ$~vVj#=$1XYti>I%e~8OQTC7Z$cTm*bFP*h`4WgD zN~Vf9Vew7j&|blW)|xAZR+>gk37vF3nD3l at mb@HDkU-;^r}&!qQ at 4_aalU)q>Je}w z1TMAktMEgfeF~tm6Ibt&sicFK9h`u^i*Dm8uQhD{piXjPRF;Ly`cYr;6LTgaQcfT! zV3c+h<0Jh at h$z_9sg1IptYU+o*#*@{yyGZ`Zy76@)p-VL;k8&d%iaz}{ z+K5wkZ=w-T(jb$IzFz;U#J+AaP~4<^!&04dLaCk?KO=%azXLw%1=_UKgr`jM#=T~> zR-}q at NQF>cHHIOFd5JMtgtF185|NzO;Mu#6UZ1B*T+hu_t8;#@O;5)==+NC=%yX}m zy#~iKbPVbqi`~$0W`HLTD|56byd01MTel1VeCAuX)UoBA(26yFBENn*ahjeGFJI6ol~M0JnOw-bXav}us6?=jd3N+3|Fw$ z2ZTEJ2n>*VfjURD^J8>9;b1z)>5ywOYvdn_;&@?Vw&`}X>-0Cqr6rTrxkFv=&U^50 zjN^G^(fl$+NXcg%agaO;V?wuv%-a7 at 6meuaBBYuqU=~Rd at ZRgym{OJl{$d6h?YP<0 z{)5olzlTtc|4r;(DkZiP?rcd-7G_XvSAA@;l%oaj6$*QQNU17?)hixyAzc7J`JzRCWMJ^!1 zsFn?1-=3AsJ(nSAj$Kx#hv12K$nGv)EKe86+_8L8M}1nzx=)x%0FKp?(MG?e7vq!n zqi6&>-V7GF`us9LYoF3VMhK`e!FjgbEp=*K;yRMhCH!4Rt~4 at WK-*6mX at wLnAR>S| zsEDQE!S}1&k(#Dp$6L*&)rJ?nf at 3Cc=Dkp6Ep7abv|%X;iTF#q&+qJ6;%mwuV*=wG zxdtYdc^>lDqVK}^%I;<706mc®v%t?zEw!f~6;2vc{m-R+ET;N{hZDnM|)rNqHl zC4D1*q16A!sJu!03%+C~^+{~tnY{yL zOMhe3+~YUSvBen0_fZcKy`ZcU1xukbn1J3-D#pQ*V{Z_PwB1A2ct>*qsZp78AUZ!D zeBnIdEY=bwv|~D?FIUC6OHO&TIKl8`)-9Sg3pdJ*7+RIz!;Uyhnmf2XJl-^J?&3Qi(|90$OO`sDCp4MejB?j`&CXeEoaqS zss5l-6$3WuONpr0p4}l`CGA+eZF$k>Qie37DgpAGFS_vxdyryvlG*LmIxDM%h5P%% zYWpn+#}DDK;0WvzrCE|F=`S=@a0F&B{xybjL3M_?!~w&#sJ*0jI~e?ndwqtQRyea? zZ+Yc+QF*?BkF9iXq5aNOv5;h!-F$4vR-altPeT+j9y?e1v0i2s^Zvbnc8lXyJM<_! zey|qNLyjA1Ff_o>8(=uUv)1P5L3iUd6!XP`E1eu*uzM&{-y(L9?90^>Z?)CxmoXaV z{E$fK!uf#`BlNzHzEZ at q63O%~Jb>lHE7I>{rr^ zj;W-VG1JOoWMw-0=bs+iA{z>UV*(Q#dio}odQj!=MNXxN)Vzz%;&sIO+0F at 7HD_6_ zg`?LS;m4k3+q-BVL5nI4h5N91*5gFgLcp?c3(va3KypYOfD20H(FH=)SPKEm(Z{ZC z$?DM`Xx1UhmY)|}y$oHClPWB}2jDI`>l!>pa`wjmlrA9@>7kqR?qYl+f&}_ at qAvG* zi#jmOy)nx|?1oF9nh0K?k6)}d3ZJ(zwIdNnN~~NF2vO at NahGn!GC$8IK};?mha`|~ za>Rc~T#dMpqr)yl6CYQb8?Zi&WX&N(0ZJuaI^;AH$=?OzjwY>u*)ROAbwZ5VqPUbV zFkya{b{9~6WtlEjw-HQy3to~cS&JdN;EIaw)-3xeiuFjK9(*St%|_7>4V_6!tB{H6 zS#o}>F2Y>;@s|$m7TY4D_aB4~{>LTZ|3s*ev5Tv-k%{ZSw=4fc1^cIs*X4g5bhrDH z{E^2#btdsWdbKT4;*emxt#ukGsc69D070Re^DrEv9-Hp;5_KL&_A*DjFT!Y1gP5bM z{#1uotzvn?U~K2JTU*l(<`(X^bG!NdAhLzFh9F+8=(1Q;WlTX*t$YjnB?U&(V=eKN z01 at 7;<}gO!HU_mYLr9`gN7IN$$6|Wj>0^xxAZyE&G at HZ%%eme<3E-v2&`sbKIZCr@ z-k|Pl5E?^}K!S4aDbB2R(<(O1q)`b?UycnSr@&Rx29_Us8r9`W#nGeyx{+&`=DqV% zPs`jhqaWh5#SWtiFfmdOb$Pv_nbgiF0c|cUecI zb_wWfP$J))#>VJ*))4}}qhoGg9`cE$QP1ikZ5Zh(>Oruo){>_sWpy8|_7XY2pHwAg z3jv2*dKwIgZ3aarg%O*1^tC(Ul;Ay>%0e7FKhaclbd^t2qhm|Mykfr(b`1ltq)#`? z;vvJ&A1q8WdmX<4z;6bZ at y_FZ{5mcXT9lg2^BqeRSP&gz4~zW{D7MfDWBwhC^(ZC< zK&+w$C9^U$JuePG1iHf4B|qUrttC^-Uj<=MJ||LreBEtda|%_D!z=6^VPBvxB at Mak z5V}7>nWC?V5wj?O*Qco5`8IMZc||($;~2~39eI&&kPRu*wWLCFME8=V8Q)wG=wSIe zkKIRL62LV)n`dazedV-Fv?bP5y&Zx-_3HVRB}#~|q?hUc`!7S at 7hZGv>`gf;!ZLP6(SPR>v2HI>@DLZH at +u7Z7?;Q~<3ucI}ur#O9(&NFhMv5{>} zz#h#kYgxQZEnF@1n>?*!9tcy~BG#gH+?ntSwR7P>dpA2KHg_Ij>V0tBOyf?R29S5J z`rO#4X{XQwOC*ylt%dW_H{sK(TAw at JhnA?j%w`|G2A~2oXY3J8){dID)Qk`BZ7q`! z{IG&UE;1Q(AX7@%Us%qY8dG*&l;V_q6U5Dkto6G zk|Rp}dGc1{=Tt(=EB`%BiA2-~$InQQnV@}L at QcCGeq=g%b(fq>ODw at +YUgiB*EI!G zvICQ+h?Vj9YVyA7pnci!@bo%ai(_Yx(0XzF at lEo_7|agQ at a*mR0wtzqxNTdWO``tm z%NGvV8Ox*wI34nw(bz~<)B{Zka;{rA+sy%xoBNtjxivZ?c#l4WTS=~n2ND4cC!rxR zflok&WdB at i;ty_ys1CY)xH{>M at JkYV$zNc(sBI?Ik=dyB`!Xo)S!wjnyB8_co1cRu;TenlMxI(H&Nyjin=yr2B7|x${6q`N z?z$85WeBu-d-%q22CI)UvLOa at g}zA+JNDxblbHFw(lZaCQeDoIHxjX at QG!B5LiPH7B+Gm$iXny#{F<*>ncU?M7$+$GOf+A% zEH3|w1 at o?nutS*H>w!SRCO$>Se3S1%d_U|bPh$A0OW*^+5p%%}fu-DEa3V?ffi;w% zABY?Q3toYSxFM9zy}3o?){-~i?Tk;a6XRur-_jOjuC^xWu+*)q_z~Zv_I(5 z6`yfdRXwkEdR}CI)^%O)s5ABB2RA!uV(1lZR~f;p at aUlQD5d`QYj at W!`%e;SP#oxv zO$nG8;%P%diO()>Nx*YMnEnNpKQP#pk2xX?pwMtekd=cUGoflA*1$BFuK3{T_<2sa zJQvwolpZNppr0w4Qef1|6s8v(?-v~OJ|y)BUna*R&ZfRd8O5+66{`FD%?`RN%AP;Y ziRYR|M;X2l?@bv=WRI+H9Qw!!RDZ){P$7Ey_?4F2ivZ5q9KGIP}P1!L^=`mdCF-_?)PU$gE=`mF4F-7U|m(pX7(&O3B~0a2UOUp$+Om2C#U})P*T+vVB;5 at I{&?w%;{f?9;X8(=OdI5*PMaRg#;HQUU(*Vp z!>DomPg+4j{97)*|3g~&cO%Hg1x*dhUq0DB%T&fn2Bu|R-BQM$yk#p}Q=7)}9I}C3 z8qzI=;e27nUX~+`1|}M_=MB^!)ZndvH5kGIPw+feaFDRL&%&cyZlM-N-h4KX|CIao zp{G6ND4{>^1I!R&7wUURJJ{JMh5#Mp9Y4j`Oj^loe*?kL at xol2%FHUF%2dpmFezS^C#i+vsSpKT-nkHvi(`vCzshqR4Rm2&` z$J~{}MDjLSx_Qc_(qeT?Fj`Wz_fid2dhJet>t at apc4{?tbat`w1wasFX at Qh@D;=vS zjt6TD>-mVScTTaitL}shR3YN@$xq{|f=fs>`R^?iHkCQ5Nh%o}Os)mTIp(RW*s}s? zIoS55_)H2sTRD1~&3@~8(76k0YO}b}btpw+ZlosFm at Ls{ScibIBDoL2%{0yQLC#Xf zDL&6=iaCuK?#>>nV^!_*oaKk)th7nEfObs3(P&}qgwC~Dodqs8vjOrLs~h8xiJuGM z>(lUS)l+-RXB-pnpRfnS)=ARjY4?8PWlH3=iCvl9LKh1<8pbk!9W}393CAf4Y}SXF z0d-h$GT)p+r-T@%4UXEhDkxy(=jhEScC@BnF;WQQUT9TZ|^}bt4{rWflR;OpeiJFO)Sh);i{f@e85 z6a*DW?a%W+EcB!R;F}^9zcVoOMaXLC`$w0Dr$o=3YTrqAa{`Q z5g?^x&Y?P at tkkaj%PzY>^;b`Gbu=o~)JrCNd{f}RPmk4A*fhf~Wt%^=Es)vhg;N$Y z-iM)1{r-KOg>3;8Epq>K7?aBXr6i4#IyZInO86%=`Gb(9HjV zrpb2)ljnJl(j%Bz7GZT2iiG?$NO>jk^=t&O5Glf{cb6v|Js#v_I(g7SH!#9qZMj$+ ze+d+tU6e{@MG2>p)K2O7485_4l$r1oWoQ2g?U%LX-5#%mdSU at G)ILhMEVt8TAZa-` zrQ-tG#Q=4d*V$tHBHP0X?4 at I<(^6)L^kN-3oe0O7bwk*8nVUZYo&p)6h$oof`2$%p zdyDs-UrGnp2(1!kbpt8GRV4i8fjEw0F(S=%!DxkA(RN;=e2Mt0(&>(T}gNl(L20^x*LoLcCkLsg_W#^XWss?ChZL({nd>jZgsm at -m?`Ri($mB8&%0|*e1 zdUy~J-v68({+$*6hn at 1jcf?B7^;|YZ(fM)5lCP=UF5BdTIGltxc-&EyByl3Q(X%*^ zuO34nL|)SIN0gN466jc6J@*}cK<~kp$UCF-ci> zw|dF4b9kxlWf~{3bDEGGi-c9uqr{p68UEsWm;RJi#(@u1)u7+}zN*pUU8mXDwp3-N zCZ|`rpRT4dr7faSzxlgM={p`jr;_oRLCcC;xaaqZbB$~rvu*vwNeVGkvFf64B^*thlBTE#^uxBd_=+APa^L@8WM2r!-wMGBW}CS!QtlMp>w7l!`Y^E3rr~=j)msL%y%5w9g|ge zW7XQfDkRQxbUQ6L?ov!6&RWhTi=&efT0JQ6Gk{y4{`=^x7E&ptcg~dL4_S#KW7ERA z^(>Qh0HyB_F=mmDeFBvi>VpH(Bm|&67i2Drw=J%Xb!(M(t#8b19P<7ngb}tW%_IlY zBY6Nt at W6dpU8@JCGp1Zgw^FY=zB^rpKb at S+vrOQUWx8IjZs5=$`!T}ihO?T2%Q863 zRJ?g+-Mx_kcXy$~L)eS`o$^=P{cqkQ8j-K6qgBf-v^@0XS at F(QR()Rwm9|tJQ3;vx z5DXO)M?-_ at C@_3u6-<4r_E>!x4&fnjRKx0w)Wo%fATQxuZK*N`y|C57*H16JA+xde z>*A?B!5`ol_V_}6$7DYWjA(Xp?jteyVaF)m1^rR5P>KG3Ku;a(0-uS6d}{C zJ}l=Uj6P1mpr7`t*bX5jkY`zFZ z3lzd8QvarqI7^U6^y88zjWOn ziKY6o#i9t8`&K9g;hs+;kzPa*Vnp z-ivi;XLE}%UqB>yO_;=+-4yqSF#+vw at _9Q<^tPA at pV3Fk3ca@=6L{sfl;K%K;FIiw zBJjcP7=k(!_AsJz(ZF_#cjZpmI1Q%Tkj*qFWbeu3+K?}SegNNyA4m8C3Mi#WBZMFC zI%oZoh(!Ftn%-byzcGLd4w6#+q_pqE at v4QzJ{a|Pz_Qxb?XYu0^DUsw(uU(Jfx?8)OJ)XMfFQLJy&L;IA7zez$kBOlU at sX{XdH-B- zR}`;}-9*m3cH%<032wX#@(&9MKP1>Y;v-!rfh-ra)cZnlNNe>1b1}bDYImbKQ at rzU zvHjj;r0o(c&V8n#J>SK8&OiFZN(ZKhMOOz9dcLZ?v%FXHGl-olcLYI-e*7hFITFxX zID&(KP{M+Mu>SqHC1d9GU*eUF%Az9rhrN!nB{&QTqk)>D4DB$qfR54trm_L}Vpw;J zJ`+x|eAb2Q^@`vgqvN5lg{v>!7SCaTB4^i9EA5!e0xB+*y6g9Bm$`@TQ(vjuhDU(Lo&wU-A*keeN<|n&}ayB}z+9u`1*&=-=sm1K(n67WD z_#w}3X2ZQE^W5DGIAyfdb3HYvSfI61jYW1 at O=m0{_m)h7@?WYoW!&@{#@JmlI0M72 zo}u?uWvUb9ZR=Wg{eyxGm!YOyZOU5ku7O8T=b!0epK(EBn<;oYKm(FA(kYA-Ne|1~ z#-EkHSHqUR;V^EbSL3RG+n{Tx_4ib1Pj9^p>t>6cUZW5C!Qb{&#|dYf%aE!k!Pr&( za39&4nk(45!@DcWxf~5Gch4Ei*Jh}ZQ$$AUR22eF(GePLq^tft%pRk6t;(2DyeRWf zPI?5xRf4&mB%+!IYMpQV0 at hMVSH&qepA%w~b3`$SG+Pk%XZ^$(1O?~kw&8{=RB#1x z>8`^;UEFsR!n4bQC4JkVZ$~&c?_zguwsI}eh4qd4G~bp5Ne=sng#s9IA2ra+2<6bh zbR^*lBh+!~`Uwl%8jJ)(VfZ5&bC2-J_=^BFN-F1f8pxF)j40kW$J^&-Wp9%bRFjm$ zX>)60U8*yL-Hp&c$PQ4BEuxY_`K(e)n4Tcto?kzpeLo3y1*JaNV@*uS<$pY^^uIqm{vmb#d!fVsGFOzU*=V2|A^Ypw z({?~v8EesCQ)8kvlAtwB%Y5^s=JNfq33fZ!YL?MVm;PBbd#CJo2K`vfGXq}{bR at N( zvyFXnKRwOMdi(MF{g5({tI7V6ghHQ{U_7#$IZ%s};82RueynE~@~FvhIznz_*XVojOyjikk7+}U}+MT1-Ne`nG zf$A!c%C at xq5?16uOffdrSA>WUd1+oyG}}nYj at cbJHwY?pA)cr9VY#Gh8AL64rH4~l@ z4WTWu2)5E|$&GQ(ECfVUCIC>JTYHKiqYD}g>0bj(^MzV~hgF4;GVRlRdTSX;I#Clp zsSBIu!t`8kr2!ixnx7UoU47-}GfczvS%Dq0(p%c6uJPF6YZ%*BWogo4#m#wF4G{P% z#u3Dx%;Nf$_iJqv at ZtKZ^vm<-Jm<7m_d{c1&8oDEwKDH8*OBs%t*%){kN2 at C1-!at z-Mc3bQASXa3#KWf!I$(fy^81*-JE`A%lX6PHv_6H}1zwMX*mKY&7#i5ib9tTykBK z)OforWOz2EhyETj-!&xENA*_;G_GLFT={(^J)S_TUy(71#|U%-m#BnSqxJ1lXiHsY zkMo>-K^SWvf6;^nI+!Zwz(7D`q5sw}-2V&t{_VN2Q}~lg{cm;{XmhiBY^9IHa=S2e zbL(Ny#6m-vh{C0cb|=*(8f~OjQC<}M2SmxNjo+>kSn_nbItO)!vT9DBdidt}PxE}9 zUgw_kLGCr9goA1HpUD6uf|0MDMEXeF1TK6 at 1I)BZFVtgrV|*dL1>dZI%lI>`_~A(h zdF}<32&+uXY6dd;C?2a7mDseQ?D>S at _Gca_lSF%LRcR+e zgmdQA?7|8E!Xp!Vb(Q_im6CVK&Q;PIZne2a?6ZDv7NzEy6lr7$efNH<8x77iEe%{I z8nNr%l=^zhWw at H&>b71t$sxD?ct(ZlsjEtK?>4VO^;Vx9iR*@?{0TNad&1 zSB(anZ1|g~or28Z%&MnfqA*4pr&P|xiPOw0aAqMA4 z;11w=NsnOihSapDjN`aQ9pjEXBh0~!cNB4d573f@$tm{{{XifNSFm6j+h8hn$yA0< z at s8)9W)hq~0Vh)_&ol}*h(r$v>{lyOU~*g{Neso!7mZc$BAZxb$|nXxlwhWe^BLfyLTi0 zU{r)a!0`YbOPUi at j6(@aHcG{WNan5C*6oXoOqcwzj#V%!`yKeN!q`)H{2CLZ*pAxX z)4Z`;kJ--hnUA;k7u>H1XLtB+;*^rqjCld1x0Xd&_BhZR%2=FDdx(Zx|?M+m_eOQq`C at mA3=5w-D5eS zO4-9z#459tzSp`+etQK%@pH(YOr&d at eYJ^ywtqsxfMkIhbGgyBY8FdoSmOWT>>Y!1?Y3>v%xK28?abJ=ZQHhOXU4Yq#^xK_wmp-~nD<-zo_*`=Rrl6i zb*e@^Kc3&MkJd-4-daz)aWd&`_bo2$G`s)Eq7Y%Lp191_Ycz%6H3AW-d|to6NOUS^ zxaFF5zz!e3`2jaO>qw*dM7dmdX8x#afwA3q;jUHOZN*DA!#FBpI>ba&jL7thFSQ|> z?S~gO^j3*c-&qYM3!c5+2)eGBW+xRKaES|-$S_3c{I`T)kWq!mDHh7Md;~G)v;yl_ z9s1HVm;1&1Sy`Xqf)`K&_06!xV~-`HqLC&UrkRtWuGq!R at vp3h&EYR_NGPMal(214l_KB> z$ZreboNK{UdBSLXLpH7ujv=nBB?R|B5BAsNy~hNQ%&ESFkL;|Upa!9pQo5i?&oIUH z8h?vtNUSJ4fm1+xPg&p!v~H8=kOrCh=1O;6x7aMx(&xM(H1yQ1$cHH`quV33J9>N( z;(bqhI+9Otj2(J$Xr6}1vhwos{wlSk%b=Y;_(h!KDB7I|-lM+-%;}P6isEe1Q1`}EW06HzKxXx!TiIY75iB!k2C{BbMR`^h3(u{2 z-c2LP)r4kLxoe;B%A5Ea2dqK;RY#Yj=842LCfTh0T)RmZNS_TRA$R&19-V(V|55?s z2yFb8&Iv|6JFPxd_M4sKYRW#XVuP$+n=0e0({hW>A_@&w!vMJY2|#{6=6#zzuj1=U+dZ3s!5EM6T7gndMc%75+kiEkfc0$!I%+Emx{*Z!M)* zT6eT5GWl=?BORF%m4Bh z*@GhvpH-QffGFbyrhGG<<0&NuuVXPKi=2Q08A4}?n0zyh`?~t&X8_5hPhd(!yrPyR ze8My733s8UP|&=kTYL4IL$tcZMHG@<@-`$`{6;Caym+6m{}akRW{JPqAwfXc5&t7Q z-v0-b{}+%oY&1|UkowQ&tr{!V zvU_&_X!v}uAU=xljTSYZK0M_3Um~8*TJkh?X`wVOljQu}G2gK`$;|Y?`1*KH-vx2q zdq>K0q>%)kBem|!BGG%O6CQ;0wjO=nXRG$W1AGz_|8vCN5N4C`WHR~Su^PKFFv z!qWL^lVFO|-`5!4mku+|9D>^DnbNa`lIz0kWAjb|T~KCax`~h&EgpO??V~UutPw7; zRVJ-eA{x!@&nr5K3gFC}wC#zCPyTA_7m#MMpP(*=Gv&^sH0N+MvYIh#Z^$P4_qx#w zb7-B-H+8O40vH-^HtkG6zkZlVqpl?`HErA;e3YcgR3>9{ucxpsSewgEpLcs8d`?Bg zB3Q{3XHm~}=x5hH$vJoTq6JtL8XoR>Gx;csY*#ki^txkqNmD{BvpSnnETrYA%~nT= zsmzi==DI9Y{^hT0R)l!+j`WG1$%rY{2FUk;4k-C?S7*g=9W*R2GFLa13Dg^qltxQ# z5 at E|(u(DZPQ<1A#k=j&wr-Alx8H<=MUAY>YI;R=WZM!QAV&xPtBb!l_Pvf3Kb6PUI zv0w*?@=R4aTm)Wn56|}<`cnap>__gw9TxyY9+wX{B$ za!ZYQC!w=D6gnXP0To;Ot+#U{9P#Mvhw1Tmju`Oygh_=fMtqe&mCeOww_roPWMa9b zIaSJb9~Kkg(9+Z!tiDxVfX(B%T)Ah~O>$Qi>`r#}y1RbqaBT=!MdJ`B>P>7f+LPIN zC{j6~g)lh8jdDOIb4rOY3i|XA50;*0DL~nUCR>S;dUWkVTljgTdq+PR1}`SnqGRAT z9 at Ib9Iaxnf)bmEVs at Fc3Cz)_z&ZOg5y at db%S5?oM2(VaP=*8Ex;#^O;+?~dmwm9~c zGLsvMQ<9W7zu*E4=jtBwE19X at SFENh7v?h&pGLI7l&ij07Pz;lmD3wq%%_=#e;Y{} zv5(+mtj$#C4TeR7=Bv%hdhVi21h{qbp&C>H;jN5_Mb at UjbH_{aIJoe%u7j7Mycm#T zJSiI5QPEPmWOh`LM_P5#5kKjdL<6jq%Bw5)*@dbZeYe;up07)`jW%8_5yVUcfS5f& z(KgN1{hzFml0TgVNSf6>$pKM7w>#!laf}sA4JjMeWZd3yxvD^05sYtCLG_h!zW`UG!K_Bt-yCxHhkc{J_J!a}zr9&0Kv^vg7Fap9wHl8Wr z7 at 4C@U)FwDSL?P$Uq;&O-7F|Lr?ExCxR2yW(iSWSs&3Y$+iCl&uef!R(5B$N!X$2* z|80nEqwV6=H73CoSmMLs##Zz$fxJznhJ1uJzZ`kP75&ZHI*C108gIlElad3>$Qgys zbQ9 at kg}lSEfJgmx2c7OYLA)bKd95Dku9fyNGfn(#zST260C;>({Ib?eS|Q!*CU7DU z;p~hJ&u+KC*3lqr)oXe!vOxOf18LNzdB*bxZIZfN8U1HUbc+-HMOcxss%|F?U!e(k zt*{ex!<7?9m%>uu+pbf at 2v)A+FnBu~^q-woW1IF?P**lWLsfJ-=TP@!1uHMLN~&yRoOqqDp7JTfp4kbJ2BD7fg~ z`RKnTajk!);D5D}?F?}$T1sipfc{tjx5lwY8C1Fn6|qK#9*RLtGjzP3a7uie3D`#` zt8$k7=kh2Lv9ka&eI$CwDssSf)nCC+8WknihbQ`$wH;p&`ZY~ z9$J5poILwh>pTCn0ehHQ=)t?VAf;$5`74`#^On1AuYCmR*$o?`DEgQ`ZP3E6_FlTB zS(!oYtgxK~uBiLUIFrCp_)S at jI=l5;4NLyC$X=$Utf{IEuiOkecT8<`1y@|>4DlSv zeDPM)s&@uS$2kwi3u6)EnWq|lzYYsNhK$EXei3jHZX?}G8|yVICp~w7v at 18-D7u(j zxVb)nhN{?N@~n&{rw8bn7I2P?+n=-ifIFuedu$&ijP)<0rD-) zsO{lr9A?VBvR`BkbCsyb$MdqVo;$a_${a;14>df7DHOa9Al*a?2nT~xcL+5K56|Hw z1C*DQxP}2it at dPZT6rO)BCE=%^MGFPlkoFlml=)0Kdc+*a)M#tu|YB}xtJJG6~keC8odCmN-%(1R2&(_4wBLQ+&YZZ zxRG=6s2o9XJr-_#4T7vAP^Y4+~a@{FYN3f$D1NUJG8HQthqiKkdc0^w at 2@Ux> zniZ*%8ptfE~^PaB1Yl-F2 z0O|cyErS}ervf1Y6HRht1P+2;A)5Pkk at BgXx*|E{zNY8>tub`+UYs`;`8(8|A{hi{OELA~HAk{?WnS4mnIwL^td`(&3T6)8tH~m{t|9yd at E12%c!VeG-bnySkXfI{w=aHTs&FUmL&fE7c)ld25kQ57 at V=ym~h5x2t|+PFsQ=qF at C$=y$(N!!>T zaQPBcnrkI_77-noxw}_Nk+|U*P_acSr7aiK0;l#GGP~E8$(7^oV{RNIA0LOW*KbCp zI~7-0_=v+|a+Z+K0elargmlv at svP%2y{tN889DGOVQ8N?-o4RgYy2p0qAhr6imr*G zBSILo53>@;b0ah&cT#f9wtRh{R!;1id~{S{u}kDG=4oHk!_0b6F*lIeIjryGHnBT& zBj;P3rq{{4F)6EkA*lg|S6SWQ`g0s&TmS|pp;i-H?Q|eo+-u<&>l8~!x+wFMUKW$f z_&xkun?!r{&-Nq2_9GCEO`8YwmYuefhB;h=L-;t128`bnHbHCD-63|R;}-%LuP*9u znEw+gWUp(>%m3QH`hSj;|0lge?_X|3K9RQV*1G#rsK`idz)~o>@k3!~C~G1TECZ`w zzCESc*p+M(q1=bm2&Nnv8UG8|htd$wc9tSpMXu>{9*@hP4v(3skM6fGuzvO`@*{wD zc!ZCDYYKvJ^XHUEE at A+p*9$UPn$eStr zC5wynKRx)NZ_+#XdnMM}hqxMzh8f*&}r8 z9SxaYYj;Qqk>k!ci_vqXJUyw(OTu z;Yn<*{=BxI=IrwIxwP#DJo$rS4d(=V$3h?vnuX~f3U`tmR)G>yggWbulmvrNgz_jw zklBy5Qy*f81md=~^o-eshd-2cmX5%-mW_ at l8bbZD#tpZ|r2BQq9^xQ=Wd=2k3)!aJ znKk>D7YN|^rB$}0=F%gt=xjyY(43P|#1Qh0%%E<|g(Q`Y_nlUSDS9HADPVTNJ-e1= zH5dO>6C#{X1&16vtYh)3d1$UQm8a{VaYAOqoUf$1X#n&OVB9t?te9qmz zPxBu9bxWN&XF^lAX090X+mm;Gr z{p4vJJ$=2>pK^F$vszHh7(tbA$eV+R?@d%La}(DB6*KZ6c5{Ry3_S5e5kn{=jwNgS ztmz*rFws_3s9H-Nt$3!O5`~dmBuFQz5jf!5-6CUX^^^Jt-F6tw-$BRPZ?beD-7)W3 zNhVi<+)-3P$jX>3b%j3PmI`FLzwK(Z)kM_65=s4*g`l7K4^@WBR#3Ms at dVL!Sj z^cLE4y(PGt_Twxfr4EbR at mb^)g90u8^OShB5Sdax)q^6JR{Mnd(Z?1~!%#gehzSOF z3FvS#L)H=h{x)HYr}`V=jmp6L=z?wvDu+3mKKc+8x58#s!KhBfP=*8HbIM9|FtviQ zcSTT8>BNGuRK*?SlxOf`Frimhs+3mJ0#Q9Grlhm*l=ggjr+Osv36CWvUtUHKA2YB5 zRk%RqDw5PjM58sWLo8}DtkRbCsNZvvO)E#30mCY1NuZ&%FVJY||7I|ES)nE{2L%Cf zg7^W20$fTWFv&o<1Lc1zx_YJ5?QPZM+F2UxK%O!ZJR^-THQikU zojN|Mmj`<6y87fphteh2b-#1&MN95)^d{3R`&pa6S>yzPB(1tAYOdfDbswfV1CE&0?Kji||q*W=+O^4<3mn zvvem=(@7d4!8?LwiXWirFX2O{LNoAh@=6E`?-`T^=={u@{UqyKP>tYDuvX_oWSqN; z32^V#eSKvp#y`f8>IY2D4fI9ie!9-g+S@#4Ci4vzMS8nFk33yIv)tbw z?_Xen)t<(ND7)C4;n`eU!dwwB_BNV~jNyOa=?)Mg(qHbt1a6$IQY{2ZlX7?(=AZNZmHoXmj0VUTw at L3&%{in`Fza-q-^YLNaeN z at sWzl+;M5p5-01bKgdVnK*jE4+$L?(TX`KOmB_PN`O+armDDvm9d5vz=6%e9&V}A? zW_pFKSVhfh)%9)CFriZIvw1*AVO$>V{&r|xgth`xQ^wh^=vU!*_?;98W}cBcx3T(OJRi-P4z(q0=p|1qgo+Z;ESb5qvcc4AGb_tPp?ziTe^|%XA!=Mf_Zq%(> zTI9NDT%vAY`XiKG7kaIIW}$QAC}QG)KIb|U%C4NPr{ZKWh#X9E3=|YJVmpK9rc{)f zJmy>zC16$R)@|XK8?uq~4|f-!)426&P{XOLa09X|&Gh!b7?gCy#20k2C at z29k??Q{l!OLi#?)qy zC|W8hU0_PMTo5ejxJokWGd&~Ip1^&WvxtDV*<8;&dL|YW6dEk)&ad8;QvvW*On2o^D|o=8(K5rUyjC_8VYr5)IsW%<1DV z)I3?uz*)_RW;LwP4UetdsaM^p$4bgzdU{3nY>cvpuZd4#_{t<@t{a(~h*E5~WxOV; z=M^!HPQCJBRT7_hV{+rC4lCwOAIeM+?z!-N924xs- at P7u;2!DkS<;cJXwG)a5=zQB zUp|b^J<8#&=I at 1m>Ezq?Qf3n-O+TBSj}qTJnA6e5{Qbjt$HDIvLmJUm`u5T|n*I{~ zH81fIvX!ZSbD7uHTe#km=k^Ew>7=4RC;41(?wNuzoMDzcpD&0V{80GWV451|~ZeoWc za@?4V>EMINB%i at Egsqg^PV1y^gWq=Y$!Pubv%>6DSV9!{XXuVgzRS$t92akfzVDA0 z=z`c)9A!pkMI(6;A)#R)9C3nbimE0}E4K1}CH_&H8ZSlHcy2Eg)`Q~DrTzgbm4%r2wyv*8}lf_3*ES4qYnRu5iJ(lWr`xC at iG@Gyrc6vy6w|m z<^_Jo87i~h$L at x;!(q}7oTkwjk})IM>S$6`%Rc9#`#Hg0I4OxN^PnfsMgB4m_pLcg z{4+LSPhFrHA3KL|58Wk_d+S&-ouFn*?bk5gI}lo-KYQlZ9=QVRZb4 z0}y}KE#*mqoHRcMIY%Ux>eHG+&LXc42loq-EqsBfxrL9K4avZLkX3?P;6E8(DUE}} z07%-{!)XO~N3gmZC*}OHqU2gW at F2tH*CT=Z8QNhaDN0q_)h_Y1mEmA at q(iX_vkqNj zzMHtFz0|L?6sS)16?~7bl79RF>%1W;5A>^%a0bdZOUg%?5)cV!asaplS=Ndq71N~} zCo|L+N*F(=s1Dqv-~UamM2b{{yZr~M_wfG_DgE!h<`#7u6;ul}e|^bDnZ~6eL0J6@ z2=ri_7Hv93y3ztDQSjI{`AzZ~Q at 1AE_!z*Y!NhrJ|6pQn&uv(DtU zMKr!3L|cgi%~t)lixO^)nooisrRw*pW${CHS=u$zl5V^K2LeT{tL;J~1w6g at X0zFX zF_!j1JbY!QZnDiPv7*6+A2$mjv3g$2OhZt7gQx^%N0n?fc2L$y+5qZ>6Pwn zsDk1KKD`7)aF&%txz)AXYUhG!79JB<)m%2X^`{EbQD5oUrw~i}tZ7Y6t=!ctAk99r zM at 5Prh`ZAEf`M5=3Rqz9L?%@Gm1Pe!+=)){*@`iIhLdisMMiv1BB at o13yCD#ZLGJW z7FIr8!)qVV=wq3%p#4DI7nuojZdKcMb#}i$;GkK{@mF`T?lBNtaOpXZ<-6{7`I4G6 zWvkk1A at y2ZS=1JuJy(qYTC2<1i2AizX}1FDsOdeJGomXYjOg+>;C|^!GiI=|rb=5@ zxD at yiUqTaVX&@Kf+~wq|CA%Xt|6w02R_D)NdULf;pt%X6w=FZIU!h)$rAPTi<%x(% zuB&YMVq4BnR~?bn3LUuJ&9Dy!k$zVgjK3yzVz!bInt&vHw<{ueToX!aytC~wdzeI57iM~Wl* zvE at m;&U$mdVAF2kEi_l%NwcQG&V%+!Knj-xsjvqMZJoY$jd6uP_nftR-Kkl9(VfC>4F6Uy&eOoWIg+ zjO!OcF9yj^q%uF=-rcadD&dK1D_GPW+f%I08&3tFrcG8?l(LC7sy4e}$Pk*WlP=A` zO&9&rkM88_55(Kj at jCs1*vbx$zvog>U(l2_{c*GBALO_ja367bBKE_$x)Ai&Pvp)p zWrRB6-}Qysz417&kQ+zYYoxn_Mz5_vABpSLwRe%(p_M%PCU^oM6O8b^lfxBOw%!|#!$`{B$^5!r3>vazrac&0~s zrbm3H$Im|ImOlb4E%k6^XDX+U3i%u`gTIQk>5IFk6Jh)T zbc>XJWj&eBf$HYOgZw(DfGXplMeI?lo@#X>TID6vXb-u%ccV9{obw-)E0RXMH?-5= zGL_bg&|&qi<9rIgdozIZ^6T#jkW(V9eWhM$KVWIn?3-|DK*THC;G1 z^{?a?xc{in`Jc0QacVX$sAg#XJEqBg*|yZp&83pm=`eQEm14s?RB74;51<>$Xb!d< zHeIaS at Z)8Q-TQiXm=Bn at r3N`pf!r5?+`w4w5Cj9)rMnnz{m}rTyr%3jDb!qdiuXLf z*=w&Ev-ej4LSMK7{6FG~2@<4h!J|c3Ku!Vqs*FgIP?e8+P8kJJM;wLwOO+4Ltm}NE z^L45j!30B;@Mz9aW;I^SVQ*P6Cioaai*;>_Z8+KyQc1(KPh0<~3dt%?N~D_x+sSKm zD0VglD5_8SEwl=(R$CWV79Ojzk;ifHZB+!G at VtyU6^uR$26T at NY1pwJn{v|$nRS8e zmYe2P0)^#^6joUg at D{Ch6Ha9)=D1N!@p2L*MmYAHk$JKlzkJ+bm(a{J6nGt$X zw&Ezoy^-EhgV)X at l}E;QVWtN1+TJmy-woZEVZ!Uo7ZhSMp;N=xu2mPp!-J}kgIY at h zmlFqa!v8v|>CQ1G#NgyfbcNeLShgpWV%`=-r?cV-c15SN=?>yOwyM&zJscGD->|u> z0BJqdhHY^4PfZ;dvrITE4&>k+_U+*RIF3xBImS&&XDc=4fgVGASQV7ZdPJt1nW(r_ zxclk2Us$o&WS^Mvr_WoBxu-+vdw&*B8bBdBWrQyts=kol z|7`Bw6E3(Dn9GsOL}Rsg!i7pUm(3oTsyK`{_xvhN-B#Cb2`2N>(be*msphLKmzai4 z(QN1`7G+E0k$9o{Yre at FpsJv-xJf;kOVFN3mWxgJmp_F~F64E+$$g7}kKlWEj~8Qt z{mnrQ at r$;Y&<+y3_4krQc>xPr7vvoQw2*DNMFzw1`0_w+61XVI& zEz_ at BH})I+d-!>;l4A;C*fX1spt-R;@=yqIF11UPC6LY(?yz5_{cb7r1$FWrVUJpF zWPuPB6X;X}!+S9E)1v72kg8s&Ss&nP_bRMovy4OzUPOci%{bf*2_+y^XTC`9<848L z0-{NS1&wH$7X>`~zt_dpdo3uv-k$WheDaC>x}`ZtwYOp!Ry3QzI*Rnlx`nuLP3ScW z=?iwMv+ at gc`x$moRv;1$eoK!~IfzWuEB@*mLGT)#obsJe%B=+#n{Ke5GSL&^-mPM> zI6f>=__fVg$3TsuhL7Knc3IIL^tcKzauPka(-Ka-&1w&g3*KmnDz)x}SsuL*)=+Y( ze4g0Ozrf at hQ8L!onj3bg2-!tB`J+hOCn5V4_<1jZ=)-Vs(ySND5~_VM0&LcUp|Rvc zDBLw!36@~oGrAdLx-96$8#g(*%yRB5?pVelJ6~fKX~>mNy@^8)Z;2rtazITm-?l_v zT)|UGs2JH2S*opbw9(_-ET8_7)9L)|UKhZ+^sIOp9o-NkKzeUMGs2)6YoJ6M0OWt= z={zRnB>NtMe#IO)+SNCTN0}1QJY{2(ovmF*VVmnRDAI;AiS*YkiqegW{pWO}43F(3 ztVqrK<U2$LX%es+qx>mnz{s&!D!i;tqoNq2aUAB+bR{e>txIn=0#W-)VY`4+2tX z1p-3$|4R%1HyiZmLi?&NFAJQSd$BMifTOgA;)6mbhmIL5q6{Dfi%SYZ8L1dCdr5`M znh#Eeie2`qSGTs*9&B_LVxV(C9Yoi*uC%r{x3s!9v{Y}~JS+6N{PFpF(!=4<8hHQC z^ry#XmhUuRhVOL8UbeeFBv`+DLJ4nA0uqgwzLZ7;_VZy4v3mzDzex5CULPHpzwia< z`UCa^%y_ZChXcOo4+C!dAYKGM1it?M4jrus4H{AmSBsURi&$&a#hx+uLYYi2%hni^%ciZNVFzoEt47Hs8}T at B>4igO6E`^P^Q(jlu}{L&R3~bY zXHWm(wWq1xLsv7^QKxUfk>@TCTy9K$nbmbBU{^5zyACSv*f at 2uCY+f&DDQ^4O at d8e z`uNc>ActPwv1Xh}Z&WT*qhu^Yz7o1;jUW!}TCGw7FD1uP14eK<@l*vXnQ$0$4 at 0I09KH^#vVw}CIk^uEnM z*KidwpTR&&7p*B26rSYUHJeDTK~9l3<^T_l0k}8SMlnHS`Xy1#No^rx)JWv$l~#^c zdK=v)+exiz?TxHe$tyZ=4&*%a`=4AZ>$HA_UmJOf6_f=l3w8linw#fw6)iYI9YWd) z_=|gpZ^bdl&NLPtL`UplovJ7eNmZMW?>x(nJQ_a=Jmj18ebSLhe|7^9kNLGtAJ;p9dKK z7Du~<^s&}(vnREG#78iT$!%wAuCH+TQ(+*hJ9$vF`d-{K-33{Zy3w){z#oOJvwjdO zrbO>5$>(a0k(kq-#n|Dy^P_&2a9fU at Oxsvr-^#k5m=id0ehNv~IG;qYa)2id~Xf zb&F1}u)u*))~Plwpo#9{C3Zp^7QbbiQ5Kfm#432WxS6k}3PGs~6LnrX$pK>p?Sk+& zyrazwMA#y^CM5PprWd5gr`dahbNLePEC+A*GJ#1!n at d$L2zfFL@;Z<`#JPd;{;k}NI|8?gjo$5lvl1l6TSRoAUnMP>QPK1HY>AP zHatkjq~s@(_SH?=o*#7+z!PH}TVklcRr$JXicg?M91_e`B|A7oWXhTpu-$q%6gr&8a75y!|8m)Ha|j`nGDT=Y?FN;T`Dv*e6A`u zk%ZU);!I=Tiwu+&S~8%I_GC~%mD!iOdZQlq?=WJXm!iudtmk~!73@;WztCG%Q-WE- zvvJ?G4+*I(N!pSh&$qH+4rYno%f17)Mrwq{_OTHBYG!gf*uqgEQ6HrG$lFD-pXi%< zlGBGQz9g at e*)GT_NZ+QnkiBU+N}=me*%$mW!mc^U?@|xx`SlTT@8=Eqsm&G)64*LSa5G` zhzpL}r8mNB#`YS>Vw~Y}mFNriJDf-s9)3 at BHYAR#=jThQNc)ZhWpctiW z1mw7`Qh zo4Lm2)y1_*GybI3G$+L9GS6{QM~dH|J+z&%=()N44P(oHZ2sO z&^MT0;fYIvCO`3- at 4lHfr_)cU>#h{cyH>+-W>&%V)|K!erNvE_y^i(Bq6t-()aP^KE^8Bk+WW-x)Tf zy)&*GKxFN|%Fi+Ve&qaq>2<32^c3GAoNys)UeqDVuaL+vqwX!M9y^dbqsOsY>8Kx$ z`qDuew~Bl%~@_FD(lggDhCTO at K>xrHQk<`|c3ZB7}U4Xud;fQip)V`;B(-=P4v zO9mU%{XzFf5q+1^Vu#37o;MJB4S?5bFQ45MeL~)_uD{7Q*1F2WKThB>HZ1$*TLjrE z;>3IlHQhhb-N*_yVij`uq%gFkW%{n3OZWoLL!3<>CGw1Bz1_5hMeCznx?Patm(d!M` zMHdH15O^txY}4Tjaj?m`^1UB4Y8v(CH*Ty{#5=IQ7cZLb^1TS`Rj}Z}nctfiW3U^u zY<|elSJCQ^T!aaF z*_|SZNw|=5x(Mcfz7);}(ugdP$ETj7ww>KVeou*UUaFv}zl-pwCi9u5=CejwBEAv} zNkc2tb1Y0MblV&cL;rl!et~w1h~Gn(W-YM`u#U4J51E>i$!&$VFb(2Uxemn|$jE&{L;lyFZo%1$jK-E9HPx1t~Qwj{VZ zQ^8mdMn$V_$Qx~C@&jgbmm zHKyGVI$oTUdirW1>t!5PiYs5QAN?x@)S&?uJttNL%@ck{bxo{B#2AzI3MDB5)saM4 z59fzeZ;jGg=@s*@L+2>HLICZ$8jSp?7utmra8zICJ_{SAOM3v~3Ma}>+i10MT6g;r z?FrkxXUJZ0E$*rbg zld??u5zThg4aG;$2+_J&BN8!^IEt at iPw%Q4W^>3Lhp(_7Opr~X zu^i1k5Whr%U9 at A?3WcWxP`+*?&7eYSiVdTF4lOQ5ksWrRw=>0>(jb at V>bl{PcAmR@ zhdbq}m;0h+%FPtND^zB4^g><|LXF>Nm9oatOd~^0{F=!W%7q=fS$p?zjs^Ap z{;Bkhz^1&366-u`X}1M1d#rk#wrQ==?k)BEtkRS&kP{rJ*Z^vEaA`>#PPk2PSOleH zr%)PrC><;vuOha at -ac0K_KrBt8VZ!cc0W?=a5EK_3RmXeW6WoNlKScd1YYDqIx9?zt_GX-{Zz^;Qdbdql)s&1FKI z%VC$AzM&%0WUe<>eYBS^F?~XPWNt zdFzr1B&Sy~;^Lb!&%~w~k-zk!p6o`jno!DSPpgyR2&A6I*?nata(R^N7KS?Xq$eud zf;XggOpRd2;08D4s-l<5bF6RtvrNj$Py-V%33 at ex*X)WFn z%ANuIv^;t1kD^wm9vGk@^dun1?53Gbx(%@$rYhHqjQX~(9jAWOsvb>n?HFQy-=Bw` zWsb}Ec#!dHCREF^|2lneHY~;=9XN3DhK3Bs_>uXz4*&SE1!-tr|0!r7cL+3daz3UI8hnAMV;bpI}S3YrZ zYzYWlqWq>2TBs46s1YdKAnTe{l1|;^F^)jFiNnfq2bVju)(^^ArXPJPL;dixKv-A5 zd1dDz#ba{sFC1UK`3x9rm(cADj>}qoj9Psu at DfMCFn2+pCXfes?=On(s;0a`Fd9xc zF>uSHA6RCi56wHbI!m`~FYZMY!%KjnoeT7yWe?HnKNQx=Q*79Ft4BZC<>DzU?>h^} zaf2VTmv*8av3M?bbu{}RcAFafVS60_Uq8C#G@>G=5yg&qZb|jR&^vRAfQ;_N7EmKS zAcu&;m3kWy6joxlCZ4M#ap at mJiBBrTdlpgbIFsnqO${SC%{`wkA&))}AFwZG#^rJa z^4XS`tf~*{e^jas2I?QxWzHwKPJJAqDAwmyv*(V04ts4FtldW*kXgH^yNG*;+`I3Q z3cvIyz4SxJeGE%ZAu_hK_1M5wHmsj~&bZy6%7%yIN);h>rF#~@VSa at e+lJ3qz#9-4 zm&_I1NjPIc4nKS=+*<5Od{GVSU?t1N3YQ)Cok?q3xA?Q at T~z*!PUGMuGdbxZ3+7*UN7uTDIg z68BW;oYOlIg~-(=Kg`*;(Nt3>BKm=mj#5^?`s$4Vl9j*csniez9|@>_P1B~zz#<6A zA=K=`9y(u?EcogxSHTVBXx>rL)G^KDclpLP{}fL>Aqdt+5XKd|)HTs%BO|Y84ScdxWT&rastwh!DoSy-_kL6PL{4aMg|{4TvSWlf}bqt z at rU*MPXT=sElml6P_{clCEyZOgP`@8WY6M_ikR_HC&;8koQDMeIm$>P!i6QIg*^Ds z+vk#i$V8~V!QY(Hu;g at Q)l<6{=lf1PMq~*QjX*{Z6YMY`uXC#x+e2T9ukDUdh6Cd8 zWSASKWo at WE(T!r8S|$J%)q`tL{o|L$8Vv?|FhMF7-}d=~FsYEjnTy+liKptGCLfKj zw`%un#PFlqN5n_K4`p>nXWF28n?r#ZXBn4jgaKj518Rkjiw0+DowPm*@?pV>EO5;P;M>qhlX`Ph}WL7I>c&&b$jY`5RWE3 at 8HRRi7h|xI7a{98iaU& z%ATEj6*7CevY at 5WBJ}Bn(c;f*?={;{dp_H&J!4Ya9ZCy68r^+AK3nlcz$m34Wa%wV z$EebRDNMKQjZ;czt9aPzS{gQH)3#qX5VmqH9pH-fNCz z^|+GpLy3FsSSWaeBElZrD4mPH4J(n^%~}DOfvBiJ^9HDF@*_hTD%-SMfR;0od|Mbi z51-W<9^2qa1v0xt9DpkeiTyARfb9 at E?MZ4Y9S6t+|Mj(?H>)B}mWO}H?PfgZKV*G0E%%Bumlf7l+) zx!ih5Q(hnbKtB00*tdp)PL_zV0x(jLWv8fy63tblE20`hc}~ER9xmPV>{#;Gb&DlG;jE6$nG;Iss4X)_D*4%220v**|w|8wr$(CyKHwCzp`!Hwr$(C&Hj7M{%5XP zGqd;F*BriYo at U(fWMpJK(p2Hc32wT9T!kkRAZK`b3LIg&ez2~5 at Lu5*Sp*79rxv)6 zB`96R7sT^r1h_7L^6O+yRb|dAAMyMev?~z%V5%3u+O at _)mY18$aS*K*i>aRUlf!1Wl`w*tm+mNs5%$+&F5e zTUM?Ua4S|ASt^2A4Vm9FF^b_Q!z^{dP;KlPr{h`^Ax2B$h()>;SKS|gF?Tawxfdd> z)s4#z)sSmV{55unU0TpynD-th)aGzSoW4iJ`CodgfC`ryE|%_fzKj~^WxSv!H&p?) z8aGF_Y}+tB{rchCrKZ6y{FSrK4VPw8XN>fVj4#Vkkro8PFLqooE26x$U8;1UR(#wl_S4Opm-LtyZ4H{Ga&JmOeW0ZG z8gGU~JOF{O>$Z-XFVbhTtLe5&?7eyKXlEKDxjlyLbOn>EEs4M*u_61uoA$&H_zMHPJ=}L9=&!m5o6gYv3v|9-um*-oy$R; zo3$2P*)R;T2Y34zNbHk(q8eI?_$OVZ_u6>TrqKx-NS%zSdPHCXTz~-h2U3z at ZBKwLbw_xK(ESgEGFbYdcM7p3!($e zXi$LEu%0Vxf!Y_7XAQ(Fw5Gx_kvX?fP52c0=|LJh)K<@=ID6KON#Q3b9ZphGy*z1o zV>F;VOHK>pO{P9$8+0PbHiWmmp~TS5K`%9nc~6_dP~ajFP#yM+GhY~3)n{O z>}16klya|d`ZXr!3kjDXh*i}LrnNojFA;58`H`>0&YY4pelqV6twr`YxtoJ_(A&93 zkMG&UGiM4cPUN=PCET6J#t)ws(7h+O5Ar~kQr$Id76vFl_9%WWP`xhz at Lh7yUQDQ7 z%sUxwAT@)P$O?pq8;`t16XkP{>auY6R1x69w1B at SX?Q0fZ<<}vdo4!H0?ud~TcU at KM z&n8W;d_XBz6JempQe6?kD`FL1DX=hlc9f1|i~~hjS;`%4W)zT($ zY{52D4exmU%sQ7h4vns_x!WwRARIV>p}7)Tt&mD*EJ9fxglM=Pgv9XO($j at gU@xKI z*u6e6feM~VSMcOZCxY3jGgG1^xBS*KDA5TvcR169^|Oeu&F0mRa5ObSA0|k zAEuEWTNO$fcaC*^)Q*p*OlayuLJCGMS-oh9`Oc+cAm&Y^FuW!Sy9r{jYV0PSIM~Mz z9Bl7gA$M66dY5ASkE)^`@eX$j0+xPFj6X4TJAL7ycS=+|;O=?7+El~xE39OkzJs^_ zimNurznF4~ntj5+De*pS4-vMFt!|lDE4r|4W40-}xKjO1pm&pdk>%1wvjdOs^2I!t zC8q%+)tXWLGV98ucT;rX>r(Us`KI(`{z<4Aj37X{)KCA_z8hDf7F|wKYR zXBT_hfB*jXck(*_7#VhGWHqO;nfx!To*G29a at ZtN=h at qAyBBj;4J%!*N{_X z at v2?B;VOMhEq&Qmrpl6DgX2?tfVDNj>~xFqXY%nIf<>!OrZ2rpXNj#<`3-h)dW&4b zMYfSn+mw at ATsNEuy*u0#t at 8-k+f+X~gj-ggfW1z2iI%<=i|=;S>41aNRts;zH0*Nn z9u9f}gI4mDRe#w;uG?|g?2#4R8z7EOl=-#&7^@{$2|1piW(Rm13seW{RzgMoo&CDQMu7|+)sSAF*?Zc zrdkLX{?K=&;eu?ZFt-UJP`Q@&`cQ7lmFtYb#cz3lwW1?qGtG?x&6W0+t(5@|5avdW zh|}TX^aq%tr7a%*oc4SkK*~DuI8;(rvUxASqoisn>E3#L$455MP_`Dm5o)xLq(&d! zX1~G2+pXRvVGKBDYxz{R%#y->0JNN;muD=rcQ+5 zj^<{K>ood^o=$C~$V_q9)Fefw$r`)(z zy05%RB{}?+P6W_eO#u(C{QU zW$a;oa9cAA3PUoD2CX%78y{mmJX^#kAR+|xCq>_s%kDuY0{P~r?@CD_A zGBV;~76=O-z}g}C3H%vm8RX+(Kdf(I+FC<3NceX|(It at xx#VKHYk~G;sfteAW_w1g zLG}s9TMplN&i!u6`UMn~e%q8u=a10|ZR(Ruq9(E`<-u#OiJ^iod?e`EeLr#u69GXno|DiP*i4ww2boRYP2cKK&kWvQ<@ z;fkU0*-8=6#&8VD?5{=(%f^zKfTPq)rDAa*gq!iKM)xBWDCwkmuok2b5veK-;r4*4 z874zg^VXp$&??yc7IySDuUvwy(_7&4{dndpxoKOd%K82})&ZI^p$Qk-3^fL>ksN(8 z1d8Z_+A9t!qO{vnn>#Ep?ZzKshRN58tEHy3&Tk_z((8u^Y%D5`w&FA9)KQ%J*>0SU zo>g+z^b_YS-uU4Wpi^;%)4~kLhpRoLh_|v2w-S9nQw)Qch);IKot{l^*_^ONYkqu| zV>El5Tzo2Kx0Y_TImN(Sy8-9RwNQ&cYQ!xiQo2U6fz at +zSZ2b(=$$)V*3`LhsV$MbSE7wg{+iK+Z at OEM`fRRQ74ly8aeQ0Yp>Blt`|ypnAx4c!^9Ab! zRk$OA<975Gyi>vAbe6`&WAP7xO7FOA^;sVMWFyrQc?-Ee9f$U!N(+UJi*14Ha4s0l z1M#2v8(BkYk_cwK04%`XQ?eh$Y%67L(*O}hHN?7&=WT3qga^~m?N7lYwwib{8|FyZ z8?LF$i$`*c^Koyy;&raWD0P?;#IzKLls#1%^#$I6v1D0R6p2KcwWEvg%xbKpA0EZ6 zF}B~a$yc`!8O3M#=NYbv)-&e_5BTwSyFeDYOx z)8tX{1<~b?xH4DWoj!MK{8y9Tl7%z6S3awPQ34)Df1R4fB%`_Nuu#(w%Zbp5T at ZSg zAbdiN3iRsOzgM=~UVHRSe<8Xemu$Gj($~@Z(3VHiH=u4?VjW=hQFcXn9we|rcnz6J z%mhVAg~B?(SXeU4+Y>4g=KrEhdq<(=`ao|dAbAAu&xvCSYFK>sM%Y>CCxm*C;FT+A z?SVRR*zS-Gxur!3`mqg`LqFN*L3W{E*1p2%`BrIxj4_0-IGzx4dnWTM`gSFhkyres z#Fcw%`*4N;e$5 at ua)uw9s#o<{t0Zg75wJX^C49dK61gA5x$mQH4}mhGuJrG-2JoCBGR8e~^ShiuA(b z70lk>2^#SY9jDf}I8R`ofy95L*lsb;J~_y56%wcuTC z*3#^cGq#=t{(L`i__;eGiK7t)*8yV4&;Uq%?~EWGKa5BsLtaH$hZw{DE`-s|*~qLS z$Lr1UCf8Er4gSEVEVpGhV4k!sGw0J`nM$8-V6Ds$Z_d}`)p5ds*E^WP8&H(0zz)A+ z(Eczj5!5;>9_<8CgtklCERNpY at toIz^xP*Hhgw%1O#;-#u)sg-~u0bi)K8LFKK zzrIEK6aZ9sM;lqY>a#|(%2b^COfkyp)LAtQ#a at AmTG5yicGpHgjN!7DbR7z~km4~8 zN>Ld(=pQWwnUi{K&7o%uC!evZX%kLb1I%lfH>KTz>Z at 3tFpsI#%%LzQskOpvtRQwA z&(XIxHK2e7UX#m|Ut!4nkGmNy1r{jN>jF&H%(L#Bu1?V!=M7^c0DT$YdUdq&)HJ at G z6~)!gOViml^%(MNdA*?3ZITL%a0y#}`t0(8TfbQ}-oB_*&3ybB&W_La)%!J=yN5ZL?e=xBcZA{;X8&=G!hcr%&0knZ;ELD6 zzpxkY;w0;EFFc=rC33x4Qsu?!xw?bKf&gg#2N<7qPns7wyVU!vDuJL4 at a;YQmFJE{AJd*K{Oeh`@vFG#BEse}{RnYVI ziVVb*(i4=#d=uvC8qagz>7mfW^>kv&q>P} zZ2X}-1LRFY82aYZ-RB_-5(V!bE8748 at V4Z(JOhDAVU)Ep(x`F}O%&9GVK|*JfX=lR z#oj0awHa~r1dUAY_MmQG4CzJ5%Njd=%PoON(BtNbcv@^FESFafY at aPB7m3WaF(p+J zk||GRFvzC{I42#k?)>@Xj{V7KK5SQo_QxmTKLagz#&6~PFVHOE{-q=Fe+AmVIVk-% ztW~L7Y2d11{h|+&g%;5oSI(8ut_286=)MY#v&r4nK zG}8xG9y)>o_MBp&rexm=U00|&y+&RY z&{b=98fV*Wyk=3;OB$}Wv?us5GU-^s4NJdrP at +vE_rt)n9~8@^DO_?Qolg^#fV8+* z3hhm84w552>pS%JpT|G zBzcrRuRZ+?VH&hPx}C0J`!|)RNHM?RF&M6n!$Y2cNL!sQE(E&`RNp?Z#K+uze9k at 4 zG&px3Lr6Al;=)nX3I#jLZKk70S!so+i;>;;CRg9SQi6BT)EJQ(x(YwV;*S z3FF%H4;lft8$go(wnd2}NhzcJM`TpD_#ASHLb$$HQ}ce>shHQ$^FlQ^Xk$rp#dQdy z>>p&W_T4Lneda3s!I%Ztprk&gpLMvPJ#KS>*!?CfQxqFnV8DuH>Zb94u z8Bqg4V~=Q-9*^&uxh_m(uL;c1nYpQE$0YPS^0|X50p|JM)Y`T zwIVy!A_&Rx7_;=wSyM2<22vtZ?t~swQ5L_XK+v~6{2v5vy9&nmVvG4 zsX4HdEpcxwQRY$H4Ym at K&B2r1ax1o-BJce+ac*=09FC#S(7<0vbzz4 at +?KYorGZe+ zL=C==b)Yjxel at ysmIB*D_)gl++k~773+P1B#dW*xV}rEYu(zLRiQa(QQK@!Uh^6Y8 zpGCX;AD2I!?veD^Y6lY0Ywe*fTTYF4j3W64NIwV`E<@VsQ_BLfiDqw5Q>ErnzjodI z3D;$Tc22f_Xs=Ir!GbfdV2wj=!4@(qWH<~V%x!7bjnt?x&20AnF^^{b#Lyg!Z`l@! zU&b1H++~R*dHyfuxdI2_b?v_(U55RawiN#XQZ+kUds8cODVx;-midu9MY8h-9@*~WnBE&0MA}OAQ zGad8y0`9G(;JPUI#e=%(pA0+KTE5o9PdrX>zDT_pO6j6$(Okv1KxR-o%Gnn7dI!Pm^`lbQbjdzdxg!D~c+r zjf$n>&`-5kq?3=;Y1$)iz=dHiX>#eclJ(O#*hc2?{fCZQbqB7(pNX%*kCsy!;NLwr zSf2u{SJmx&Nq8>4!1B{YfN|5c%vSfBzYpCi_-4ayK~CJ*SoE95-R3;(EOmi at TmUqg4*vWg- zFo&pH1C6SDZA3_!EfL)IqqUC`OZUn8S|>>Ud7XN*lkiphLa*aLZj^yQ+Nvu;E$TlL z(`R4w at yt&N+|wON#I_b?(q$wA!^TV$s20k3k_ at Xj*#IFl?IKp-1kE at dC62j+3yHFe zcyd$JMH($`qYON2Ve|euk9 at zBM~J}^g}0OpKZ6cI&R9x#BcX2I2i%zE>Y6w3WlP|7 z?faT_r)u%+bHV8wE9_JRS3y>IG`2V4&rYy$CPZ~M=Ak2X8fh4sq~~g-Ee^u#%{6Gi zedi3RUzXmur<7PtVb%K@@x>RmY&%N#B?{GKe-!V-RF{W}s5lZ}n%dl@$0;c)1y%2h zOwK{9lWE-Hk)a>7lE!}ZG_b6AI7PeEmW~pS4B1vNI>bb at RT<-0anH94fPvX%*4?;3 zwWLw`^K6lqXvDva=K at RLVy|w1F(C1PGV)nhDbC_^KUjq7poS&0?7yZtp5_?+ITQV8 zJL8lu$O0+-9^D&7N&=knA%dML at a8*vrIJFMxR3!BZx|5a7!QE7!+sS;%nC%mj2&=G zO&p@;HVLGyhe*m_iAZ;g?{X-EI|No6IR%l%{?IbR{z?@MUoIn`lB>bmhXH23#nW2F zkp4zETft}*1l2vo(j5({xH1H|uoCfCig2P-X+X25Ds&A<#-nzMN$$e;XM8|)3p2VV zDjK<$K at v&b#Urfre-#q_T!qyCC{DNGxM;5PqOp$?1>M7}KjE;;TqxNVPQK+Jrct^1 z5up)VvYlJf6e{#6C8Cdv+N9V6mCWBi0=5&PznND;!IsE!oubm>e-cG{qAuj;>YTC`1h<;5c1g>8K*SGk=*)A&b5t}ATGd!TvZY1>D7 zp7#2!&`TEQIhq`CR-)@H}Ha`^*k$hQVjLN|071!3~8?{whA_tk;f)z4qu zE)3$(0iP>!Mmu(Z{~nb1sx!t%bR86~8InJ$QK*Lmv39pA;&pRDe?TNM{*hpe{($?VrlUx6Hz=fuk3YrGmw-><3 z&;}TNuCz73H*z{Oj3$&=CIAG-Kg<%v7J#9XaaPv>Ii!lxaPvXXz;Gj_7Ku|4-&sWc zo3uu%{601$HFIHM!DR-dN^LLiW7~P=e(NUN*$%O1`+ZLW$o7>xK#h~oAAtm}0f#0I z-h?{Mza+_{IuKJoc=z`BD2CJfcfx9v;Ej zf5(+D+&!9QccbK;RTy<*3||;^66O9BRzH#&O9W?yFKjFuEG(8QcM1TgXs7F!Q=Xzu$U$^>iCw{ zc|Yq)Wrvul2v)%k)*cma(>T%=ld(-?XlZ$|uqz1VPhGgq=JW3*)vj=T)|POKETc=w zjkgQk&wUdB_X`2Tb~H5_Nn5duc?j43fiet1K_}T%h*%z~lB) zcUhv)F^Mz+vJovf84761)+pFhJnw5IrnsaL`lzuf(VfCDCMH*0g=)iXno6NFO_u-I zpXd2}d at G1h7|)m7TxFtjED at C8rRcODMY^oMP$j$3Av4w#j at dI}RL*F4(R{1JxJp`& zeYC)@S=g2EtZ~!ifLa%rXM%RhAh%DdI?qx at UMXolA#C8lVywN(ruK�flB9I9;4I zu(i&q8bqvIe$2sGQ&1|ykWZMm0?`UQ4vd-Sks-OYc9VKz9EvGkNkQ{Fq&@RkRx6nV zNsVfJ3B6ho1ba)vFO_93Oxl8XWmpjPL?rh?n{`_A37T4+oUTCDisH=qm=7v{tf6U8 zs|U5%1`G_DcHSa6RR5(m{~^tO_v0fKi#&P at RVp%yE4%Hpln1A`P74C%6VV0D>if&5 z_s{kg#bO?WE2?A)nNjYOAMFYY43h6b@!7QJDqIrb;?Ohhu})+1HKVo3ODaw|{atOt zR=tkun02teMxAu~_?;Lr)2mmo#s`DUy+f?3-ndlCbSy)ivq(jLUWbQ8$E;Gftiee{nqgE19+h~Kp?w5_!Yie2ywc at vwOxz-zyst z@`7YV8c#u=?DJIZ1!%!F$o2_WL)SA^ulxp0v~P6l=-3 zTWVEq^rluJdU6pC8AG%?L7sT*h(Ucz^+vbUyhTP+MR~wqsl7hTRcH`JVuC;qH=koGF?}CRTlh$gvdS}{qVzJVZ^ zh=bd~qiW5cMUtc)$c7Vf!%BVNhcSmD?hiCqa0&uT=b=i+_zDOKhaL*^s07_kx5Y3n zS(0`$X~o)6xjy4!Lui%S($Ih_(LRKHLkgwZ4qEUkXGJ8}-N^aS>Q)qo^DT#D=1d5H ziUF7fL*E%G=LeL$h8AbWiC at Ez{{v7|w9zD>V4g>_TO6cIK74u^D#pp8ui$_chLeh0 zhl8uCAbJ^kew at f7))Y~zZ5LALPbbtq=NYIFUI`vpe6ZoBxWnZ1xDymWH?jk{5GFl~ z#|{P+;ea_x9`zsq)wcSJpbLH&mS?F@#Y*Jil1j^5p at HrADQja4JD!U3;^9#K6OqC_ z+Vn2|$~LVdHQAYIYiOvkvNTm*nJFvZIKDJh*?n;vWqPjMmCq$cZcT#6JH|H#J@{qS zzWcf^_lgsK%FCiQY at 0@MJBXvMF8)uHCwA8E?_llUe}MlvcOn9A4o5(MfJ*-6Pm%vc z?i6yCGjjOnab`tH|K>(F^2Z&~B at qPNb3Qa*b`_#}z+ww%EGUR`7ra(!rEpkIx6NA%a53T;N8&)P!R0 zQ!Xa<+ at w@1$pQVfR4W4sgdBMeBnpAF2k9PDV112_jSM_WDo5 zDQ1_qj$+IiNsoTUc3X|i__y&zciQg5sC1>R{)xRU%N{1O|- zC;<9M at pOIbp0zdG1P6`RQiOpZs*rQB?K>=-PFS?$RdOONv*^8i7|SE3Y(~urHP7Z2 ziV8LaY;>NE*j7~mh>2*SA23`*R%zJG+_?BOq=yP0^gJ>*-Rykzb=3oC4pF9LH|d(& zml188jiksomK8Vq)af?sMDz8EZn(fNe;vDuR6QgzN6(?P6IV_%htt8W`K$Wox(12u z!z6pQ<}#sc!Z=Y{&xNu!2m>ZD<9B(D9E^t2pA*eST-jDBE3G{jiD;&AD!ImzLWJ+= za3<1yuCkP^{#Nnp^r=Cf;INvesr)LPw%$!YmmGcd*Gpl_4qJT;Z_BZu*5%gM at vnd& znz)1-&$L+vW3PT7h+JOk#$?ji42)%e#z3jUZZWn>%(GwvT=Kuv+YLjE0{FRLvNH68 zRMpTRbF-<%a;hn}2C(v43Ru0Ok@^>3O3V at Zlp8{zilULeC5st{ORtC}f_!v~>jdLz zs&}cM4o+xSejre*2>{h7GHj2PDM0y(1?~BwKDdIa*cpwN$WjZ0p-l?+s>Y-#0Sr#x zLC!=_-)up(Y>6s>J>##D_Dws2%LJcT>Y;L0-3RsY@;)q3-}FGamW8A76PCyvfk5_^ zbGg#r;o7t;O|%Q>S}lLDqDad9(7I7cEz^NyjF4f)A>9D_a)coI#rAZ;@Xv7qV_`Y! z4+;dN3-kZK$oT&fC;#5Va%Hz5jl_3RD0QBWvEJyTPpQ}|m6w-z6O at lciKg6*Lk!&0 z90n~Ot;dBB`bSbyvJ+ZBaKFFn#~sj1UUg~{enOC(&Z6eJR!&+L3ky%eVb7nQFCfO4 z at NoRr!hPoZfmubYK6F}gN3|iOaB8BJL1mN)*Sbxl31yU)cujN3CHM(ThZ)0E>YiN& z&+4l*_3A^-WTgk$k!cpVnsoRKZ`+hej6!j6F72{o%rhfNG}(UB7LXx zK}L0U+XK6fHuF~WZgXU2eYc;RO&x3zKYkB}Uj>>+JX$L4<;KMYf*i2{kR|5FQf|=Z|1_UR|i8O;?-< z(t{5A`YBNt)Zxt%GjQ$A&Y-Fpdg|kka4Fu=GEy(Cnh1{dQWJZg(4E*@0f{CJDpE64 z?exE=7|SfOA%-zpaNE4C8Ag+7UGzXE{%3 at Nd{MKMN7tVl|Rc0G` zZnbI=RYkd{fSW}AqBX)k%cRp at hHxgCP*6`i?)B3rF5=9-UhGKeQ7;{z-^guC z!Fxe>zbM{X^|CLkkl(1nmMKonoU`OT9;AXlXw4eLhc~OV#2V5>ac7e~V3fOIH at 7j* z2JV03gMV?#b-GP7{*vvr>Cn}D3%Sv2|*pzGP2yKsrV|c?zb?_#HQ+IdR~YRbS}&x^B{sk`hxo?#+XePck;C%Q88X&jj;I?9 z?NT`Wkdxdpr#MSUnW&BA1D%%V12M4&`9o9?E}=0xKFFA;nl+D#y%;J32EmZy8Tgz2 z$LdZ257L>N*x_#?`gY1fdK7v5ki1KaL4NT>Xkh9K{v-^nAk`0VBq5|$K2a>!->1)9 zaiKrv`>%RJSrU6pP95EzX;6AJRgDT7bE)+;l+R+NiY#y>yyB%pGX1YD6BpsGqW3tf zx}IKR;bfl$Qd63Cf;A<%2vc3XTdwN>*@+k5 at Bn2gkDIP^#2!&Ikgma3vq%vVd z7~GxVf1e(Barjvyw8hel5+j>ArhmIg)hmAR^$_m9$r@<5S~x<$Dq&c->z7n>Q?&WT zeFvoJwEJnEzVgz)-V;B+vlPT`$zA%tj-3Af1 at h1Ft@c_zG59yWtzrMAAM*bg-~YYw zqe at -R9#sO3&tycu!A2H_NO2ti1pEoi>3?grvd9T0EDJ*HxWuoz&KaoHzTM=ug8T_r zsGg+wG5dSAo0Lv6(c+it5>H3Q)cUq2fK}Pt{ASa8x{bx%{Bv)I;|6GQzb;bAhc3N7 zXoDHe#~H~{)pS!xt-liv+CA7)i1kHOC9alo4|pJTicW6nVzZuYK~pEw!qAkUDjjfD z3Q*B_LQv at aVLOzzS3sX0asHx9&TNR&}kedMzW_QQ1!2?ZuDWhQJTGpz~kQ`=YF3FS^ z3#!mqoX3qH;i8Mpp7ulEMx8zZ{}((x;uYRJmc3Jm5x0tWwOu*59$R{F($fi=;-pt` zbitWjt;2U*4_fg2iHr)^m;-5;Q4?Z{%Gm&^)0L{gE%eGjUrN{&T#+H&~mR{lY2155Lujzj`Cw39Iv` zp3wwbhw=k2hcc^PPr}f$uLLz6piN=%roQbk5H+zvFnt zl3l1|G at r1GM(zP3*c%p@>HW;0^negebIzWOvvec(b=w7}*J0_5XC>ONEll`r3{at# z{9R&ts!>=!3Am!KO>x!toc8=euUYWLCt;sHa4FQ6- zvk&tlp11mqv}sFtGXQUD&LGH{4>k=hc1E0pa8rPJ%bVY6h~YShvdz+vfpbn{EDUKg z>JNN0aVLCdaQ;Th=__c6RpBl_f5 at wpFChofAIN`Z#2;)RKXEW1AYl0aod)L$l?LchfnoH4PY&n3T(VCj13RsI^z!cx|s+!t^EH>NMrfk?{KU!Y5u<->> zT_8kD&Mp2>j(o6B)MwB#fv4?twY+To<%9iAM at G+|w<|=ThE;iEq?e&v{~*K!tloWW z(YnMz=5gbu_(AGrQlCUo0e%dGoKPb at I2mKjxLPWs2&3A*zo=+wU7D3OalRt})iIV# zk}WW*0CW|d%Mk>Aj36;s0?aY7>!sU_mz~rWD$jW(Cep2D3okm2PnO%d<`-?NikBa- zjn8P(cruN0E3ti=v^I{H0qs=@N4jg3NFCBRr)zA_Ydes#v0!B7AUI+rQHh!FL|~($M!~Rg+!o+i^eMWf=G^{M)!BMOVN at W; zDlNUaI6`ypgYGx^dBH$ZGgRDOys(OnZXa2EtC3E6X;gzWPh-#wmND$1;49132KdfF zxOR at iXD3>wO0&n*=Fvm at bnd4+bx6E2M$N^~U>?lype;D)CoK$HyRdaAuC&)`SSGaN z8AcRidf9g7#sK$*Ha`C zO;M3=T#rTVZW`L1YnL6EI&_2gZ1>I3ly1Q>*9I%KS6?~S^u`fpy1_B5VNh)QU0*;2 zA295RH8YwiDR1H(7r|JnxO_h*Gr<9}>p(#vN0fMjJ_lXKP36*=ZA44$ZDaq1F;Qtx z;vM^T923QCxAACBJ}mPl_t~1XBKCC1rqOt at jtrbnwLWwOSGxn~RIWZisp!hfO at C!V zPm&6 at TvVXEV97t4T6o+85mIQ1ES6FH3|2sr at PhIyW|ww)&L^9H2N_PN*b at uW(l<^W z(JFctZ$|z)@JqOYl721~ZFv+iRO}Zi81kOSo|>-PFQ~yX7jbA;+FJLa4cwA0=#V?= zs?tf_ZturIOL@~5{bjJto5mIrU}pW$lfaY?Dq5F)u9t at r{)PLnUJwqO62QQFFsU7+{)76 z%I!kUTnt5O97TgSr at w1s4s&crA-hdc^qHXzn2koBG1g9t+wr)k=IHSl at S^9E6(B=2 zw+89 at v0y#)?mCNkYuv{wigurOd8tMhq7`qc#KJhKc(|HESguB1x)l5lp<@*tz$IG` zpkwtSNc<#^6xixhJAY!}cGj`eg^Q=F$OX>bFb{UNqk+RH~gP7j8_M950M6 zSw)zs)z4Zia&9_GWoXk{=G0R#oa@*-Je?AMVIypZ}(@38>l za9UW^7 at R7K(}u6#sX;qt7!x_7(yMUXl$I`hkgf?uNK3HOyC!Rq7!oI?i*3@)vMelh znBcWtvQjQ5o2}M-erIeTp0`)2E&gOzGQ}Fr_{cPB&BgX<&|f=Pj&3hWFl{tU9)(Qe z&2!h_H2ht)ghlQi72a0kdxYn@$4q$v=&S0iUjCW6_`uis6KARVX>gKR^rdZjqFl~y z@(G=MK-8OdrhLkSefnC<&Vr;vWs)9sYUksY(2K|w5l!&(9jN|&+;3SIwG?1{WcmTs%w)j} zT^0q5np8-izslxVL3)dopx#4GLuRv$cQMf&1jr}eHA5$Vdt?}u%fWv*pc1PZEYz85 zB~6ET`2gJug835ZWJ+4CNp+(Ui+oZ;JbnG}4%O{ebHO;Gq8WF}zu;{?b zJbWQU&s=!mKXAMnhl5GVLJKFhm~?l1#5K*4k6NWz}%(4+IY*o?ZPiYta?)s#J%LkewEcFW?|10$M?myQ)4$^xiA;p}wO308kDp>&E=SCXGkOyni8C$sJs(Ay%sVJ}&gB_R zh;%miX981hGJ+hyiDEl9*l9VaH6KAP*3mf9cIG7hJK*sZYR-Ur_4~O_jIX&ghK{nD zD}Ij8fy+gEfRFRrk+T?=TMy5;MbMy(D5R>0?aGRbugYDjVz1AewBX{@tM+(V79-6! z8Wt`~>uW`Wt*zpxla32vWTm1 at gbQ&kA#(JslyvcYNGy;4?+0)S&ps(lr@#b<30QeY zG6d|nLdOjbwBB+Njrc3hvb0!d^wOh=YdHfEU{$wsFA<=Ri6DWY17SIWfkk3t;MN~L z5+g_N+ at ABSIEFP9isRnnU%My*`n0amQYnS*?VB(`lU=NFKF)akE;jetIVR=q?H`b) z_Ihz91t)Lx96sm6rP!|F-r%zPi>MS1 at OS-*S(@JlrefV<_`Hqq6L+%Svl!oH3mUoB zrTN7|L-hbS0_#@)PQb>f3WIs@{4JRG{2s!;xSF%6?0g3)^ zt9t(!a&7gW%HN4PDhq;WBY!s7;pu>lg>C^H`N;u=q2bb1%up^6sk z!hO=8uM4Gk$wE4)ugh9za&4VQYDM-QW*@L2q%(XnGM;ALCWne$07Te!tNw8sOj8ba zOI4oeA4O9u_)NHoZ_Ayy at 6Aw9&8O}CInEwPqdi0MM at y6CCu;ac^YzDVtX$Ex!VS9a z!X3jcAP4T8R?UVTZknc=Q*MCp at SiSGL`)}YU?K)%ZbJ`VwtBBL_p~C#hgzFj2fqTB z(8x_OuzGJBN!%l)!fk7}`lpxulcrZuLb zqgCk}M at M7l6zMBzo6KG9c7!&ZVQH*chK5s6j>A`o1{86hk%V9t=6HSws}vAqy0q%B z8C2TGgMvIHQ7 z`C>jT!Q~gMAR9y~X=C7MhE2xZ5u<$pzH1>3KcJ10QWo_=3~XFJ#PP-I_e^JKl%k){ zj72BS1)G_V-c)hALGpHnd+7o%$?T<)+cY~95bHN}XRRwDS5NtSXlL{ZzDFKA!1&du zIjf*KyFnXy+E6c(fz9Rg$+vj0+O@!0El|KKy4U^r>FY#6$65*5npET&#_=%HVeY~m(GfC|GNsdZ3)RjXS^8%U0{X5KcHWOG%qchs;*t=>K+bga6-DQ+(4pn*HXFEDd#xj1EZ z!x~`m<8CP{H-*>|) z&(*@U3^EoVD2^>*$5*&5m{@7PtG9I3 at UV5;$D0=a=a(Kk`d{>gw&7yhVHc`P;Uh99As~c_bs+d1uL{lD$o%Vy;oMQm at -UPdS+VB%=_g z`N(PD97>&OmjgSMj++F+EWf42CLL~MX%+639%nyxq}Oxpr$<+9{g!R4x6NnQ=^K1dpjeb|Gs0fcj at 8Dp>& zb_X`?9_^NXfiBYoCf1M6Wfl+EaxAC*Klza at EUo?-*q3|85I2Gecl08TXp8{okjd=G zmr^!k=FwQiA$)f1wn{9wrMc_d)(^>DS$ADKwlIyVl at AL7KM^FCuIKh~5?w1oMSFC> zqq@()^s}JG$A at z{g&wTe at g)&)v}yROQCvBnls&8qS*VHV1IZ&RfEF$Ngi+x_!m3H( z0c%S7n?SSs7Jaxow*(BsGBY1Lj4)32GstD%0*_*?(>@B76WoJl=i at B&TDEioFd8#Q z1B2fR)FSJ|9gj8hJFIR-L{bV0wZ}sdd*_EAH+~!x(9YEXX~8$t<~A{s5HZc>uRt)7 zCmvG!L)aI_Z-H=P8-z!zubN~X1-`)p4gx~;r#|!i7d7dR3jNO@ z>VHI0)&H$1e>6u21BB^FBbI3~)=7&nK$9~g@}yg>QKWL^`xWt||I}ohH=3LMOeVo2 z_=r>--$yB)90pLh^Psr&$(#+B=Ps9rvyYG4cPfAS9H|+AAEb)4=$QCSfE@%E3vrPi z1NK0iXoLyQPYm(A at N7QV3sZ6FLe?SksPQyoW6Ee80A;tiS9oQVH at va3m0f0gV#>w$ zUuM`NIEp%Syo$5CxZxJVz|p at vXBUiduJM<))U^5KN6hdu=s|oA`*|WOY+1s7p{5C9 z1zx%=k_k{_)wX)75ya`;9%@10PGciXJ1j_GHUq|9~*;fG$6iZKd&Q!Rr8mFM%rjFdrHJQy^boz=^ zr at rDPfXJ+q^?B)aXmXWY1(C;==A&&A>0afcypYJXR-=g#GzN1^>>7-PyHkvAGjSk zyd62d9S-EsQrq?k-7^+*Ml&5DDMVo%zXERP-V?5hmvd1Zdh#fOV_!$k3uxy+SlU8L z*@GEvS^yHj7zs*a=V-|=ZkD#vQQ}wGIN#h6LoY1zXAE23g*2J3&`g2^1*{Qi?11?> zZU<>J4)vFl(mP1?B7b?<kvzH)F*zXBJm470DcrA}j%&|! zIpHA&;xoLvhskdS!gOJPXgiiQXB~mfn8+^iAuC7lHxJWe)*n9ZVfn*q(wkoi3t86J zDzmGM^$D-`AzMPRgoaWcDsaOeqCCQ04zl#GJb()A#tgp$Z`+)S^_wP`^ByeJwV72+ zuq&_ob=TGE2a#~j$}c0GCihgxNdaTcc#T<>$m{|;aci(Xs5w&XQ|W5zM}0dwuDaoWH=((?^m}v?C-^l`F8I}2?V(`W zuVB~359URy at B=f at JZhC^tCj5Ncgn)8ICJ(O5mZeH0oPrN>3MTm!LAE+KxO#(K|!>o zd5K-4n07g}pGlrRHa?AJyohP1`Bj6FEUr_+nZLhu?aswE-xb6>%AFGwzY)o7Bfg{2 zzep8HO5W{&k{^?gCIG$B%^DH3WY$G#oA<{WN{kO$)r!Wp;y!S}Yi3>i{h2M972B%Z z_L&1t$!~wtbLC;#p{j|OhI5S={b=y(^OQ@{>eA1nzgN~xrLJN;P%r>@h(G6CTo`>u z&|#-E5(MSz1qom9NTcxyw($v!|L`GM at KP#$D^`AXpf1EaW4svrh8wcN8~mzH0-Z?d z3);Uh1J9c}i}LrW?>oBzbJHIbtN*DglK&eh{@1DRKjuCS`#&WH*{|A>ghHAInz}1b z+#Vb?^0HY|HUuX$kf_H`XL51Zu$7&kZa}W z(eQl#x{d_GQ#pd&<9qEH7aSE8MPhDYou*)lh?LmK!X%P<6(+LAMt at JXWhJfU9wi|5 z6TUsayXO3=E!Rr=X&qR?C_TdBFY?`L{TG8C;J0(ENu8=khF8BcF6Od~JufHBIH{3u zmBq8={L1|ThuP0|WjVsC6#FfX){;XAk={my?vX1JG|V&Cw^drP$}>A>z)pnC?Y(Bh z(1t>xrL(h9iG#LAKgS?1^U#1VPKxNzT-TbXQ16FBDmnd&51%u_MNLFov_-v at hT;pdc=e0&Dok4qt at j#7tl_l0rJ?LUyEFN%oS;!aD45Hd(KTvRY$xGm5d`6S?J03O%EasW*XqE2trK)wOq2 zJ}JPN-O2Vy(ueYPIyN|$0QQJ-5X58jJ$V!sg(tS#5r2nq#JQ96QgJU`$FXF!nh449 zad66oPQj6!9${%U@=q}-oyMAHH?hDSj8~Usrx8xzO`&Ibi6vGjbWLj15J#rqshlJX zv~dXyvo=C`7X?xe9i`_5g%Rx09!JcuL^;dHWt}zX2c=Cdvq<=ZwTRQzVJ#yfKl^}P zcq8e*q3iSex0CD+E7Z?=qxV!NqFc>Dj3XlR9Ui~z+6vJoEZOct4D2K8TkXTXaI;(P8#tjx2T$=>sYGZNJ_1H1-5H3 z6spWdkwGb+zn8TIm+|WJanD^;&;1ZYf{W%NOJJK7EWCq>YF0NFr(%1K@#qa3B!&m1D%;SF z{03rWMjd^g5?{=*!V2Irvn#?oDal7yo;ScM-JFm~>z8iVNt?#{go~aF0b{ehX5ibG zs9c-giN>7NUlQYWfzAP{&1|LlkU+CO-%;(?u at tkZrLU1dE=T&cq%-<8SzwYeMj#c&O_LMW-9!TB_BL!SF6yRdFN0h+A%N~n`Y8lD!zqp z-TXN)82sy#u<_TSy6aBm&##d+BMcfHegU&pv14o2 at k;Fc&H5$W-8}^`<3ns;FYwsz zB1SK_Kq4ACtg#$4B0dj-?nEdouDGjRywe`~`gDh|5)j+afP^(MTk4#Qiz zoelXBKq=2S6Ct_s50GKF at E%@k4+h2%td#AMD;|&R;@8wRoQ$B8FQXAyQJ7%%+htB6 zL(XL;j`2B6mq(O$2?U2AKmAFK4kpI{hL+~=>{Idez5sS=~_j9sE_ zGr5Z6xQBwhm!SAXhsYk03vSK=DR>{y at vl+U`VI)D2peCOm*SDNrDA)eN-G*qhD<(e zZ-VP1if#g;{1xd*x2a=XCI`r=h=(co$aXV#Y29#j7ToO6JeLQ~<8cqv;DAejG7gqi z%sVktMiCgZBS&LO$T6dQfpLT%k|*z!HQmB$T>yCSXf~7}AG4exoLx)PHZ+9|X|~kw z7c1#1;vRb_$6%Rk_u1($*IX*aa^HN!TZ*B%;$MT$fAm?C+cZHk&VES^!`C7Wo!%2| zF&rpX<_%LhJ7AO=2bDKNBEa5vAhPJR_5nOSk}f9}QNF!>`CCJ#fB6#(0tBQK=D)tQ z`Og^pPrlkauB)T_Ih+r;?KT>;A at WM%7#!WyFVdk?lcUR8ldvE2s)FGmI|X9!^SB>y zqwVGPP<34gkg(WvK#({3N at Q|Epn`#dg>MCLFFSV at jn4F;QaofOf)oP#|XG# zM4o@@^AIq&AQ)9_#dq48LQ#f$5}CoKy}0=pSHV72gho5%Vqc+ZaZV3jZm?}b9j|$V z*)18UuwKy1e&1Gc0ojBq0IdV|*I(3u6UDvzgPG}%T` znbzDUE3IRCm%CK2Bb}BQmRYzj7ggA(y!K=U@;~&kJRWcCqaw1_S0^si>nkE( zS;H9i!28e=%E0c^Jvyo|r#_s;CdQrE!aM9r6zWYFG z%zeG=6z at y-aribb*7vNypcbQE`eux*UOLn<*ccL#CU>Ud6m3%wsST4fLQ%cmioBe# zdxD_AWo4BsXiV~s>TPg~sa at frwKG>9alaUQLp0 at FPD0&eyWhwCo+3X_d zO`rPDn0jASxnE}X`$n-Jgomv|cx`&K6Pz1|y`753Ol!>F?M~F2u6sEP2%GL6%Ph^j z4R$;>u1Ts`I&_9QbEt3ogl3k at H|BC*kwVC0Y-g-F*BL(#uGOqA8Se>nuT~7QsAJ~X ztTG6N>}(@a`6os1(g#hL`Gp%0qGs{Jir9?&i at W<)EOcSGMYl|D0-k6HA!=-gI+>-y zdis4+zQ;_j4-eDNj69ki(-~_KyAreNuR*=)Alcc0aANkT8X=1ywkuxyD1Bh&Hw>`9 zJqwPE3&h=k6rG6?mP})-n#+;xv3;aFiQ`V2SBtzrlkBJ-(iY8yBM#wIi#*70ENYDC zQSpT-3;0HTuZ}xY`BF~Lk6 z1zCi8(AO+;Y~)uCATKvFfRE-QkGOT z_~3fLE{0Lvw$as|XCGeffG_)$S`Log4l;&amL*cWLP59MXzdvXMCS+OzbZ^WgJ-n! zpPqmo=D&U}=6_L`|42mswS*B^2MhpaNNEe60(6_ui}Ic%=(JHFY~Bm{qq;&e%4XS* z$!Q9O2935Ok$4MPkD`QnjQXDTBL$D5_BO~Dn$c at dT<11Ay)SvJE;}hg!F<#Wm+*pvg2K{Z<4cZ25`UrTT z$Qnhp7DK3SiVUm@#TBD3$y}?l{jSphcTz8sl9Q#O9!;^h^vuf)`$i2_-lTgqw*pQA7 z&mxWV8dcvYuaapIfx79yIm|F%bCU~<_4doEpAtMDpJ!m}5Ah at _cb#Q5(BR63jP`$| zcmomRkSkjsj~x{fc=9KC3%-1?+bpU=#mcqASV_nd-8Z!#RO<-Q`s7^0QT-v`f9%P$ zt4kJrMGdKPN4*ln1DG)4V84XT-ZC!s8zp(9O&eB#frC{fuHI(J2 zg5aXUp8CZ28QczUwXT#A?5%#rNmFLaZ~=aA8`v$^mm^hqJ*IrqjtdV@!*UE`nW`8M{kom$D>l4Tvl2MVXYY3wVWvw)ugiuDhfN&z#G`!Ozzdd1OOyg6 zVye*1Kng7sFNF$buVX!OBIwf~45RU&olmC$e(t+_oKfw4 at a(B0CNDqz+76#LffzI6M z`8Hw!#tBe%0Zjl8ROPh;n42^-oPmNyNa#gsR%y;+>gm;Cde300i;`A}GU<71c at s4^ zJ^F4nb#bw!cP2)Ej9m^-{Jiwu`h4Gd-F)2S>gK=QMNh`61 at vKvT0!m!bn>YGP?;We8z-|`u-G at Y-spPJ zEFdq|@)Q!?{mYA(EIpwLq`XqL{gG|O5l&*V7FT at ioM*_KmE_3ON87RX-Ud>)| z%#s2FUgl3}&m6ni1Wg9vV915$*Cr98Zs0wX1`z^OQ=DTes)jE>G`d(8yI6$-RXI?= zmRxpagW(hsx(X~Jvr(BH7;Gva%Urz{G%d8;cKDD(W8Of53_Gv{L+w)XthY`kY&Z9! zjtH6W7=?79N at g%tO)N9E#v!DmGJ^Te8DeTjEWD$a5mLS7w9M6vH=9vZMY5J$<_Xnr zmiCnrE~OD|@d7`ys2vjlpVTL_y;;H^J&Y3xUS7)YA0aKG^t+rZKaROtkv3*MQzQz*zDr_vB097_91 zL0GV5t3-^O=d)HRo+Of-P{D#eX9~Mc_Lj~YPm*g2(!jL2 zGUIMRX|9C1+D4z^GMuYQQD}h!0vb)(8V-e+9`EL6dmU!9fxI1~ZQ9g1Sjkuj&L#a6 zA4RkWNy|YqN at hk-olu9dZhmLl9(C%}8I}F^1QR3sR2G%H^BdKVWG}TPr`|DPvKe3s zX?aCgJ_mEzE;j4QT`6H|y9H#1%o1DY-`DErk7F4C0x81`#lDN}7-t#Xp24yD^`pmb zf5CAy&go9R=6f at gMCKZA!PSD%X3+t at V8klC1tj?H4%!`Z;y79m4%bEB>|UY3{7AZ{ zdeiAMGJnJPkyuAq6MyaT76kObH(3?3_!aqTj^D3><99d8Jrc|Ppr-Omg-fch+x!jh zGavG6P2#mthja<2xRvzK=T(7tD#sJ$G0w*G+^u5I!FLM6>?u1Os=OTwiRCt7rit4w z+B|-_x}wc&v-iU=*~gMDf1McfPydsxc9lqHl--#42JIrlsVx1G=qcA#?wEvF*EO)9 zplfWY!F|o#t!M^4tWqVOoHpOzE56D-0H1QVlTMyUgRa#!y(bH`mzSeHZs)J$>oFU; z;=ddEvX at G4?fSIjbNF5K91+W)R5SX&FeJ<%Ge`Ommc+_Wvq8Iqt;BczH|&?_O(V zfU?J7_CS5U?~O^0Dq8&IbAmV}E(PNIZ$0=g%|_v1m3_8h)CU(57}tv+qqxpVa^3gs zFpK&>Z1khQ&WPS<8f*g6?=E^IaUBb0K|0}%3{H5EdiMxKdL>q-MEK=c at i^xjf;W+~ zkq1TPQ4CsA%#(+3?L?^ZV&NGLXk0dy^a}?oLM0cRjz^cc{J-*U-|!R?0jb4PqyJ_y#T9S^=FBVQ9!$3~$kstIgEX^~V(va!l>u!_ldTrFeX z*hbN#m#)_~(J6{?uv~N>Q?fj118H5}6NueqvvJ3yeBP at +Yf0!!PCIQrRHut|pD)ej zXFr2Ho{Y-IQl9fBRLhZVSW4MXp07V_?D$6cJ$dG&xlvs%ayqh?Sh!wbC6g*>5{(tw zlo{!ZNHG1Ej45I}))h-i6~-?cGAK%xwMg+vVN~lIp`{qt*wIJ8l#=fCPoxh*;?S+H_$hnF``XXy=7|_H%m&NMR{;&r+NCnpU5p_=_ at i zc`3Sw8GzegmnBYo;w#E+#sDl!ESS>>xusp~GP&ghL37}(*IbDb7#nw0nS at h@zqp78 zOAIzCrEX40To>yEauLR|Ea)*5Uj`Pi_gOMwBbX~=g at Mw&E<_;k`1ndp=4ue+@@F$ud1 at U+WRy3D^s2_!Gxy zZf9y9ycFZ(=Qrij+`tSkB_>X;;LY4Os2S0&h=KF5TC=e{U;vg!2=Z%`u;%&Zfx1dy zt#C)8 at I}FDy9()M(6?)D&4@=Gssj95XDSS;!=G!scooiCvXRVM|(`)=!e<=Zgs#7p4m|jqPxiXYRi$6pH{pY|(6)VhS at s{H-pX%BN zZIG at F8O6aQWs~H*4&OO|OMu8;CTER}ze&%@?`GKlE7xme{~m#)fjfUtY5y8M)Z*a6 zYk0q?U>d>qSvskhy==-G%?49BLdOkeOsi1N@)~myIZF1}O$!d1)g)}1?E!Gjs{4}# z{~OjV=#(S|f}#5QgZ`FX7JBXqE4jXHaPu*4?aLwWyT_oGgw1hlKgh0Vj%^|MYGHv< z+ at sEv%}LLc6FCfr{HCA0u;F1JmlXfna*ha6uyccffL#1HQlG5<@Celml+Z-b1?C-e z))<>GE4PSM^B6{S7X~2u-~tA;XM%y3^A^-_>*N*n&5Iqx+*r3P*?#RE)V4a6ZMwn{q@?c3_cM6m9(`aApQ;nn`6fksLr`~V zYacS3Y=0!akRx#HN$X_sC>&gJvNDhn;?_}XY`P|jiAQM%$24oKol}aYzU+xW3ElMB zfCwmtxlw^EZ2swH2F;^{J9C{V^T^9NkXWnSUg5QdyGB7egq|h>XhT0BcY^F6S2I)lDa|w+%f)cR)$KOr^Imy`Gx%~m4#FziN z)u;Z=#KFbV at teJc`9C(JfA_D8)$RXa6WOoX(P|ydRs&sKxNHS;|Ie>L%z`Q%B_X8z z>bqWTaox833r^;T|MjIc7|ToVU*7f9g8~gCd*{A`rImY5x|Nl~kB^rRaAD9>=K&|J zABSknPE3estK{EC at U)q0t+xe(oO{kEpk_^_u^yj6f7(@_EUk}qmA-t1XZfMzm2Lr! z*{?o&Fy?*Pf}pal+C>-g6K$o-?us(#S(awUVePNb@>PMh8?NSt^GS29v^{r3usvG& zBHRsY3HZsvsjAG6pdABu_1eUVZx(8XoDH8Em=aPsXo4NSzAI|-K$f*=JioH at Y+<|{Va1@@;^?15?g{tZoAJ_ zS=jWWuqWz2DZ`)6o^JiY{S|QB at O6NGBjn3_FBYE+Rgp^zqZVMS6UBe6g;VcJ?78#8^l9t z$R+oC3q(b#w`*uu)MYZUMTlfyw%3!Z?@sELe-T9c-WnYReTGu%q7g++f2a(t z2AM`e+4|S=ak0Hl`ZT!o$L1P!gHq?=i=pdaz<#4u|D_qHB~wVJt*Wf-6iRY(p5_oi zc*!!cKp at sqV_!1(b2<2T+OMi6hG{z-Z}>Gfk`}c(_~iq}e%mIKpLaleE{5vFm3m0~ zltH{4Kc5i=gfH|eNA)!Fjv at I8gc$SsclRwy+-s8*96Y8!PqFY#L2?fF>Jm zpw9&@SppY0c1{d7zXmzu=sXMJL(E=OL{93F^W_R-6_onBtK0Glm+LsP!u!DzV}3Gk zMzfW!S20>oqXZ3Fr6qLt4pcqok8S3tb3DyVIn|)4rQCU5JZr{fF1TV0)?v;GAah5v zm~`yCt7)3IQ-(SHi}pD9bIyW!;7IT$<7jbD+*Rab`vPKrJID&jBSlR)QPCTgWq+8A z?FnGR9oJ_gX#@4LN!*aI(7_N5VccC|w$j;gcyq~#2#I~bNmC4e9G7qxwf{K}8<$ab z{iJk5A>@=PAy5kb3f7Pfjt8cx9?T0W-$pL=Yy&)!`b%%$Q{!L6U ztt7o{rU)BKj@}SbeVjR>Uf8N%$9>o8*`tk z2#Fhr11!pC#wpuPC>Rn0phrgwd(9O!Xa{gfc>JR4i{{LhCfBooxhB=xv^!_M3 zw!r-QL;VaOQ;XVk(Z01Zj~bQ~AZ)687obbzlaW$KpMJsFu7~=OOo<$X)Rp$s6U*w? zkOY{My~|f<+xlr`IpvYwz-HCm{RvVV77elMSwtv_3bU^!ogXLsrC}^n&V&#SR~{i2 z2Q^gxF!;P(3O5D2KyS=qW^1k4iHqWqe}^S174eCLORtM!l3;TJvOyEa^rP$GAcdXZ z1f)MybePEJa6TouF8&1cv2g zJ;RUed=q$b(XEpkj6Z_kK!rU=F^+ku8(r=+-a!k4L&L+tNcXF0!5c5C)PdOtUpz*H zh_bDakb{X7iF{vl=B4c_G7z1`a({ZAyw!kfOA9G1a|o?nbK}r&yqLZ~vP++wUhylf zelv6gin!0Y|PEQKMh9_CmRvZt5>LT?Yj_z4D12MFu!pjI}g|c1nWj z`cuBXEsqCR{=xbfc1c%qmP#}9Y1dzaMKQlU^UZJ*aW&m4cQDG_h}Q>{pB`m7;!34n zOJhwuKvriluPxP3U$bV7Zht&a^#fjT=T0iG_&ONHDASa?;28|5B$96zDJpOc+0s5+ zBL-$hi#F;o3bpb&rHwF<+>$4m-F!KV3b_d?g{c!&c)>>!j-X-Yf1sPWV#g$EiBk*D zg{-30_Wgnp4RM72fk3G^!zPJ_@*a-2e>z5$k=Y{g;EweT>coeF1TCL*6UfDpLXS`8 z8Ufv(N|)8m=uGL&ooGKrqXAJLtl-figc6&PNa5ffWlc5Eie|ZNKD*ao+4?m-lmU-JOuB4pr{$Z*eB_fg6LxKePZs zgMjG#-=W1nNTK;vY2Fy!Z<9rn7fv3z!&xPro3jZ1(%~Bl2 at 8Dqs(!&%n~Ido@>Da~ zP0by6g0(5R->nqR^mTjOQ?@CIqr;p2*AamL%vq3t3GEyX_ianjw zeJxDeCP_)L5d4@|;yr4BqnLu>Y=+60Y1k1~eLC$3lWwl6^0rn}?iAqKsoTbExootE zmkoA#Qzcz<)f#+cYrRe~9Z+XhBYmLUW~SiOb~PR;=lV%m>+`UoA z9Z9kg6VcEJKz1juz{wEvR4kYmpPmrZFo$N!%%rtvDZx3Z at Mm^xx^Y`%FCvNXlhu29ijHK^z1g^m(*r}jOQT_ zmfalG3`QZTV^VV&cc{p)27G>O!`l%!J&__UIIWSYorYl*o`n=!wB2jvI at RQS%;994 zhNc$BrnhhOeAZ6DLIa(o4wwC8X=TM!N-NC{Du7&HxH}m8%kw$u{V>m+4gX|sDg?h3 zHvCFRFkZ`GoDh^PE`QbU9_EkKAmmzkg#{f>Fhk}MD|{CCnon;8>^4-NZyJ0AX}x6B zPc&3ro0Q=F146a)E}LDZ3)BL4H-(x~)R=pna5J*!a+f2FFKTj$ZfQjv!TJh6Seu|y zvNpx2TVt!ItM at G0Bu7v-pjt%h2Q0waBTgG**lmV-p}5_sLBDN#+$|x@;=Ti}*3E5+ zHga{Df3&6b=cLAt7Q+mT3eK71Ij%S)+9&KIUks##G3_{-2eJRslLz_{-$07eZS=D6 z)`?J=!ph`Mtw$Zrhxlfo12^s&E%nc-&F|vbrCLx~kBS=^cX7UuzE$+UMkiQAnUZ?? zXBHuOp9uXcm%5}-t(U+-Knnl7rS*SxFe*O-6DJ`UL9(X6PxhTc8|1w=AduwvcMLz at +MI zx$KU=(jqdHU}g0?i|4n8`ID8{ki0oW;KIf!8{C??GRruF7o5jViZ~!x#^3Go~1Xb0) z%;TnU0Ja!zgUuS5JFaE6OAQ?JmB+RzZEo{}O%N$=OifQ5BC2ljuYTJu&PGk$afVvhI3MKKK6bI-Y&I9 z^hBeZKx6Im_$?{%3QTuiESrmLGxIQeg#D#SO=h77=qx6tgRx|um+9ZI4PAEzvC%}1 zet at W{#;SzyUX3bCYQ=uiUDIW at dNgm-aj0_O4t0izH)j_8hVoK!Wi at uwSx6I}IaO-g z7;#x2q5xLM at 7j_jCw7CU>tD$DY=a`-$07PbyJ4PPb;Z#e7us4CcOaHAI!R&_E5+K6 zLJHHrl*K&5-c&W=Txj1Zu=JlZjyINBO;h>&{_VS(nQ1U$&xD~2M%QS|Sy|pz8m at +E zLsYE8qB7)gmZ;LlIvf!N*CL&MyNO1{G7N$v_9V=n%FW1jcDs{O7f~NoBd*rF%-Yq9 z5mUix$voYF!UW!0?XDo^al^Sm%|91w^g__)bBZQ1a>C!DPH*RE|BOX0)T| zXMLh}iMJmRcbKE29pedX#&_8{MczSBjh~Pc7hn_k%=O|1*t!F^2DJ})p1!@1tlWM1 zf?Y~r?in at n-t}sq)9Gpvcn7BM1*78?;(UyhYLm5JU?@*=fI6`5>Rc3063f7=^tG*u zf;*iWSE1aSoPYqvVf$g#gN##KfW-PK0IpgyNuHhlwVue at gKcOcQtTnl!dIV zw;)p1iI(wh{Yp(LY6PW*!i5UzN}twxpJAu-dJEru_63E2gP@&|$A_Mn-pGB-Q)HOv zk5kn4;{F#YC2>WM(3r=fyxRbo?&W`#k~Wkri(h}rvekbhW&HmkC2aqk(EdG6si=oL z_l0_Sr@&vi4vPZ4Bd-dhR6U*)$@RoV*Aym^GMn6D-{=_rWIJf at uavP89xVfk^P2p$ zgZuQw&vvWF{ogf?TcAZ(lEGo-&?LXGSp1<(ptTPp at rPhl!InfDck=zEzzE?y`;c8@ z*!kK>w`uxaXaA@|r_JI*zkPol`{L%;qZm!K6Zp9plTuAZEjzs?98Oq_21+f3hVly5 zI*xhbKP7lDo+;|=Xo~;{!&``xk!Ue8=;emV!~*f{Fn^3$eFpyCzED%Msz7x~hEYvHC!=j{smI8W;3<*QLxx>StRM6d9Y%tb&<+*Nc0&RR*p{99>AMbX+OowBjUxOr<$zsw`Z3BAm^Ukr z4sBhE#Nw4jY5t&FU+taWd->lzG>%k8>rE at Zb(yH+PqMQv4-bj$JqIIB05nu?afNbv zA8_bh%xrV*3kx!vE!7{@e~<7dUBTPHppv2j;^VLInaJ&o)%q|wAv=<4qdWYy;0p<_ zP%WJ at fyK+1W?`<&K_(YOkSJFfBCQh~S$^I3beED2;h0?zqo zWE&-XX5LC at O;^NNB zAzu$D+nhkLEMXoq*a4nuy#5e?Fg@#=Q*4M&@n%0TO=mjlxe~TeJLNZof8`HR2UKG5 zpO!WS at 4p^K{?GaI&-B8n7QPkECqg at 013j83nka6d4K({IT#~Rtbihm_I~RBnN?^X^ zWUah$Vy7EZqq_ZEJ=C_#7Frv3 at D50lb7k^G z_6BAeDZz=3+m7j1{_fu&7dwuhzL&lroh=yR5Yv#?{D#WcrUHFWDG{kp at Aep5FrtGV zK~IET(@8|^J)v~8)nD>=LPhk4#^s+?;vNibdSb6>e{>Dy3YmQ5mOtqrXI}9p8kyYS zb-eHh`Sr#cm3y*&J$ap57OG7;loy3U#eCKi)r_t&}B zTTy1`$Y2XJ$^+HzWXYqnyGlkDnezSU1rz6PLn=w~*ZboGuFc-}&^q6PT$@RljLj+7 zSrVR|smeSk0=y`fb-o7&6Si!yfp0*RWwJyo-KDpf3vl%@Y76-&=FWS=K6?hn&P`o> zgT>p+gV(X$JznsqhzKc at ob6?(u6(D(lqn9E?eo3Z9b43;)Xt$VS2?^B4`^zvf(U#1 zvRmfqr`%T-mkP4w4$_B)`X+X46SRS)gi{!@pA=89T!JdT%A6H*91bIZ_uDb^XnK0c zrD9+bka${|z5jl;&3b*CUJwz_F~&$~KO2t2)J13UqRW=xtIK2?qK{E;nl+=wCNNww z6;J%geumVZNbxj0^^&EXJ{)Q zLjj-t62df4t&1gBa^uCH-0;;_OTmMOW=BdoMn`-hEdn*BE|s%2%gQ0&s*l&rsub9M z+QRy{wDPFD(S<|CM6&y(C}qq&W`C&*n#R`AB+TK at N80oNqc9=nb1WOmEydCK|&zf1I>5bPfJ?;dioe-yZ&jvt|;L z3b^mYx_4^cH0uUD+EAQ;MCFup^CBb7u9Q=;V8DZmrG`{ErLZv}((-Qtjex_|u5AdETG)-51K*gF0WBKTh%}?pKVn<1p%hFeGwja)ZV!3+;@EGpTQA`cF7R-xXX6rxC?hApCwN95BKqUPu4(2O;7jTzp0c?pfsro$`rh2yq zm9s5M{6#^v%1(9~M*ztRA!Bgf*&XCFA$$_I?zZsw%{l;YV`?qB`t7j6{vavEX-+Ov z`#RwyFxY{f at 2ea`Q>}h(@E*yd;tANe>qNe&ZF1!HOooCfc*elF`db!13T^k2PgE|d z2G at Wk7g;F+7LzIJ&DYqO;pf5m9TA%7X;$yrY`;krxpKupQw-3tcLCFlQQJ~Y7hnt)=evG&yF?Qz^Jw-5sIq3el z@90ZF at jJTlx#5-&mP7dh7NftZ!| zsIn?>tPal_3*$BEyd079`DNlJFJbD-S+4l`rq_dFh(e54_0|ag at nk27o)His* zv#`N)+yJ%4@&~Su%E_--D_; z%uR!suWuQ5v1(a#O>!wds&IFe7SWZ|7N;^J-8b#1?k0cMe#gnABx}^foHad^Ye;9B zOn$yWJb;TY1Nk`uw?fMV13#IBX2dL);nK=)RN47%T9d?NM2>5qW2bIqr>+oRdcHX6 zrrndB>~`-FdZ5sELm6r&=Pfm`S!&J2TXocC+Ww;aJ;fouoc|pu7Dx6c(Ru=GdKD_I z{Zk25I_74Bc%fW!`&rdu{ihpV{hm0VRIC<#M^q2Ste`92vfNd2tktIo|F~&|@XmsxS>2P8z z#ngU_KVQet(A+3M)1 at FayZL-^!ca2XPEVtluD;(=!FnNhGNb=ALxJXS->jgGvb_A1 z@#l$ZV1;ICabX#KEFskzf6f)AgvI+ONrVw4?t7q9&B?ijMwQ*2_F_=MSKbo)_Oxa` z&o%d}#`7XR|5btY$%|FPS%G8*0oGW9 zBQ55y9SkohK3cP=#eDP7(Xs9A6L`H~?uNI?KE|6FNz5b>!fFN98f_Bt>>0jFDx3{f z_N2V_MZK#=4Amu&sRvb7;t+)OWXQ(wa4QH6vkH8yjC+Q~gzx(upk5XJ2H%&ALhoPx_H;YsaTa`m zKV!thf5Sp&`Ffm0{9TLBKAs`G5r#M3W!D^95~es z`f6Q<=ApR%hlT$5mxaEB`VR|T>fbH&v2}80q8I%yR%4e0BmZWhvrj!!{1jm1dkB5t zAy{pVQLhn$KZg4^3!Tl?4TXmBU2iB)h?Zi*N6AF8L8FAiW!IhjFAMz^pbPFZ4dMSm-Xced^e$EpYQv#;t9wWY@ zQ9`-IV7HwNiROaIy25Uv=NZl0Kc=3Y*GBo3xo*(-(~1CoTy4J)cF5lGcnBGl9O3B5 zydR-&_PD4$8++d-z4RPI;6Cyv^W58&-&Wy{u0q<>fR294^KL2E7XfFlJmZi+2Rwlf zbYC2En92Bizyt2+(o%QeVi(ChPfXpBQpwTsApdGg^RYUiM}Dp;$|JQb8?^3xB6B>!`%T&1q3 zgr at S>K-<=AkY7-c2PQjcSSxo8 at aOlB!;Tc3VZXj^6i5kLZTE z7gJ+&=XZF$vUm5|6}L49n-^TAUbAj+lO^km%bWLPG`3Jaa at 5%B!UDq~hU5p3x#9;B z!l69Px5L9N_=^YehUBpmsBBm!viiq+VEczYOG+GGJHg at Uz$usNAi5f>CK0)dFDL8l zmpm6XoOCZe3XrJuO at V67vfY`mR#oYYPv#@#prSuNSR%gsswp}*)BYf9cj0oqVB%GH zTw3KYO>vM8>NZ1$56*SC_ at p7o)Kt|~$QAXdXp zJ;o^x3iBJlm{X`i8`01w`~IG0f%k{)BxbA9+d~Dm$vXSD!EX69iSj;TDhJL^nKP)j!JQu!mY3y2^f(*H*w{?98&?=H9!*nXIEe8i0b+Jz7Ez!g+!S?Q*# zfT1GxMeI3kF`GgS?>IU`fs3 at g5%$kSp(l>;we+K?Ztf42n9II8AA(>Aw*K>*&GzZr zvxau2%pV``@5sWagCL?KBP~p393V`Bh}&qD&ny8-!*wxs{$6+;kIF-qAfP@&WU)_s zE*~oi*V>YXLug-Us&Fzo$;~oJ8f{mW45w71PT=NgD=@{JCYjag3h5ThbuBzGCow0# z6_{sG7$_+Jw8LFEYSV2*)2Xs`TyWK+qf1`!??5P4jdoQlw!DEi!*P+aNE@*Qywqwk zmTD@}9HFOAWJpL%)1?e`^Yya4>P52~*yf)(sVh`9)0wmgNk=AXM8iwU#A7hgH~bPM zSc3sLw{Oht*HxLMon(C)79aN(ewsKO|MH?uRhqLRX-dMSpRva$`X7|NQ;=v;vaVaU zZQHhO+qP}nwr$(CZLX?XWvnvq+P!<6yi& z4tK4;G&N?FZnK5fbHhy=OAJ-OEq}iTMcAmtb7 at mGiOVPjDH}9BB*kjPijAzi3D!oI zWr^9=kPi0j=tpkXxVtSp5N?OAX#IUN%SoJAuq4JX==%D3*1a z3}X6ur_3*&@^k2u_LZj2>bl=t!Zr{BjCU=iYA&S}r?~VtkF4Ezn$4=wx9;qr=DQCP z9nu`Q_7D43oo88#>aRf;%I+VVAVac-X62rAAt9UCo+>xWnoePpXQwcW~m~cq8B) zqu^wma!O%C4)!jcErH_NqNpF!wuhm)4bzGIGw16--X<01jCloatW#{g)!{Pe?4Z7 zpzwG^dy(zR_pVGezFq-t#IHOZ*?NId04~WVl;q#T`TDmfhB55NjTe0oR5j>kvTJ%T+PT^ z#UIPiWH+`DF~&`6RIun! zzse&$vVRanjvNI4FIAbtyqgFVX-oEbCTBC#zK at gH+wbS?9$5fYTGK>9Nt!d9CdTj4 zSd6wA>*j?xHVRBxIF-I#YJux=V z at D;?%M!AOJFaLmE0#y{HI?7*7#9BkCFvO)!-3;N~vVUxi4fuP|zcs_IqrOffX9K$gzZV!GMgF_Q%*3N{d11SX=RmdnuJ(=-}YMT5y(sH3oO zubckMijcUO?pIxV at iAoHIfjs+I9xDS7-RV{=a_5H00-(*ziO+S-?p>sjB!#}X}a at z z!+^qdClxF`W*B`2I#}_?BMWuiD+Oy0(b`Jcv}MjG!3sXs3=3;a!B+0}sa(YveFJ}D z#!V5Km4i4WmL79Tm+2sbYbQ0?@2QC;)TD_sRdT?j6}6_vMeZ2H_g-;HZDFD&7))ky zgRv__q%rqL-&mY+3)y7i7FiuaU3IQOol(}Lb#5B=0=t-O3~~X`9wF{0T5})aBMiwf zdUJ;T+ at YD=;hE8lb```9*)~X-u at ZKpD`kYR at W3UQ5{s!H2wq&$ZO_S(rfBdCsWS(ZXsa*%|C{V73 at 5xVL;!#!MF0TG ze~;|{26|Q-+5pG2m5)4ocT=V;n at w^#WC5Jia&NYn);2j|DGg01IVCA6A!yB(NiyBe z?U+wWxKKp^1q2bH;S~g*M}#)YRw at xqq=q5_UZK;g*Q*o$R=88I9=%un?vuH>`DbSC zX3nM!BL2<&oAc*w?rrYp`-kV}6j>fnfV+=mh at q`n9NfFcAU>5yC#)KTM;rvc4$UDJ zLNBcjRnWw;90I8htr5CAx)5ugb_`EPJ?8At>v at CV;B8bPEPKP48M#AX1iDduAR1(c zNQm?qa$~*;3}lDuV3dev#1=?zs0j>ohi*uzC#4q#l7r^JlxXEBB7hsDM`wikP8X;z zyObN$2VVN?s!@7C5phca%@KzjWQTSLsz+&nm#Ai_ARw8jW-KAV5OM7Y#rdHZNKEAS zSVaIMqSwkyM}W7eM!Y)eFqzJ{(=#N;>{7L;M%YK@{5r~UtA~IHz1}z;IH*rPgs%s0 za+lx$w&+IGI`pgGvtKgA_8qY3<7+_#`!Vg+dN at dr>cBR_sT~}Mv6BeiWjwfXpyUrq z&6v#SqbL;%@~P9-PdSahAnC0hY88E at D-Jx5f;CWc$?gFtTCe!21AybpL%P(8#Bj`ma4otn(8Q z^0P8#9$mnN0yW at +s{0HgGj=fXlMtl7feAba`8%ZIZOqsb+WH$@mTSdEcemSJ z967O7y at 3uDUY-l<@ZQl4b=f*@%4o2nz<`kn{b}$BKhL__U8;@*{Vj at IFYBl!yR0XO z>dW^EE1O%E<$N+=qc}t(s)8HcZYHc#4_uLVw8Zxsha|uAeZw8*v`yDt;~eoB?S2!B zJxFnsXAP`zJj6_qo%@~Q3bC7~$o6wKO=E6W>OReVD%pV%9N?Mrk+G1R``_mZ^>4C> z%QzGw02lT;k+g9l<%vM7ZexmFO>E%A?=WSrD0E56o?&xVD>g~i5hw_^hJ9>EE0gob zYCO&&!;TXduY9a;4AbBw7c+*8swwQsibx|j4p(T}mCv6-ceK4M|8d(^E$MGwo@`h! zCg;i#G?5K9QuK7;V(H>Wf&;BPEzd^ZjB1;e at FI8Zot+!&!p>!(1kb{S>pXFsjx2ST zfty19##pT%l)39oPQJ&`U!ilPjY}b_aUz;$fBbV&8Nnl!7ely{hCjD_%t_LJk>nBa z at T*XOWx(vSP=VvrJl8m7mMvL~)VDwg`qj!7LxOJ3goU4I1Hb9gM!Jm)56*s4o~0&* z8$TO;WSMqT%tkeI=eMnM)s`1hY9++kv94#`_nV<#VIg0+TzuUG#%IcA+;XR4S=@va zpR#z0<(Q*ITGu7KGhPrvWNz+QhhEoGob1k#;AIau}PF8-yhLybG z_iCm*Gk%CeCv95>^|WnV>UKSPbDCjJFZaBUJRi`4Eck$??KGXD1)YvPr)wdBv`v;> zj1wvKlH{tn1|lJh-*a6JOz2H*hmvN_F)1l(RStk=z)2+hKyL95Z`g90s zVA~8eG2~+VyQsfL>Q&cHmJ4Us3_lPok8)QVq^7e9Ub{ltL%;xl!Mw#2KEsemDS@(O zxk))gLpM2-u>+e2Y$npr^X?r=@}KstXSTVX%R`}+UKCo&a57iLWa5}xk~EGMNE~q* z$=7j_O|8wHc~X9h+18?#-b45c9OAA|nQyeM6Cy;pUYKLTw9y$E$l_3Hm!zb at K-8u4aWJCoYd*XyWrjM)x7uGT!YP4-CCextyVnmjB|-* zG_IiQ_st&PMjV{G7Ep1mI#|Pn3!eOI<*j6EMxQG;umNmVeOY?7F3Eq`W at 5g#G9&1I zi#uqeXZ69wq#L-9(G!2@#%m7LbU**ScXRc|<&tZDZ-f?@S^`V(Wnww|iLrf3h at x@H zqD2|CyTv&;9B1B?hT$5R%PcG#Fm}Bh%T-HAF)J$gK>0Y?At$%vQR%t5?d`I4;!;N1 zvV1f!nQge1{GdJje)kDYEeCII7pj*9?=}iN$k-;ygT2>ALEmZPsbVpTO59jj*DJb_ z0L9R^Zi}-nhn)mkc`vUa>Uipj{;5sPL9IF>n)pE at 05@tQ*FN%op~LMhW({Sf{2U7* z%}l(|tpaD;skG*bJxxh0#Kn;<(oDCP-zzH)=GyD<&Sm;SBqBdu-$Av8UF1#qu?~(! zFY9z#@uWgdNjO!*p-Q(v`6B%LwB^KsfcB4 zD{JY~mUc&a+|OyK6H|pwBH=uQVZPnglNqkdFKp$Pmc<3m$>e(i?qGL70I55m9*RNu zgA|Z`v-tEwRLCL(;ol9y_4jMEsUzMMRGajcJk(mI{RM|M_0xi!e8HOwn8ghvpA~k^J&_`vTyhUK2oGj)x(vuQrT* zQM)F`Nu9Q-B<`okJ#_KY?aN?q7Nd~}BDj}fu>VX at zk@Iuuqp0Mp_q&R}d zNqm6hOn-5n+i(LhFvml`mW1pZP%*PQGxNV2=$R!>Kk}slpMSo=E;|wt|B=M~n(TKn z7?s;9DF}w-ryaCEbZ61qq)hy_r_HD`w>hdaNboQ5RIp1pje3 at a+!J80ZBb6|e+2y| zDGZozio4bZ;v+w7uM95cyGRMyA3U?w>Pb5EQ6CcJST~DQg`jrEOd;igPG at SlmDC6} z1?nR>jDGcnJR2koX|}Bp$*|5NBw*QS6s`1wm~}Hj_8&=Z%w~(Co-JLBb1{lluou_R z_2jylhxLz1u1wXmg(j+T+aO;1-3?EjqYsBKR3XVPjtv_=2DCL9$9T!IS`N_bM* zv$xd1304Q;CKLx-+0BjjE;&fftL&(xVBT7se(@C-GrUCL&P+8e+WM<&ILJu*GKS0h zC5`fZRMGFbar&lK!8{F9z6RS?pO^IGR8-kM)3hfz-wS at euoms*bqhz2nxwn5zz~bc z>_=lHv9;`alI$b>YGUk7?K(c|-Dg_cuZ&v2tM8sGBrjUQsEbT`IQ$I^d$!s$mu9*^ zZjwP)>Zm(viX}a1qEj at JTW{I+`B#B*>J1k9IgM=Ri_zTGdPS{d_gTu0A6etH+;ZWA zLK>b~8n|OgU-jPo8eRK(@0eb^)v7K1+z at rpwtVrn%Y%JsQ{bP z9w_1orrZnZ8J(B2KX|{S|IAfeo025?gE5gKnU@{<|U2i6cFL(v!j+7 zDl94$N)E6()fogsfE{st_$)r&`QO)G?{2|H)3G5hejSvk^VJ8anfG~9khj2Gd*G0_ zW*wxc at +x;xvK|yCAuoiuw`xP(uzWdDV=VP#3a*iU+mw#1E63KA#@08@`qY9Cw17qH zD)xafsL0E8<)33dgR7L&@;vN?sk5)<0OzeZ|(N!~4`=znErIwN9mSH&b&_ zy!b=?R#3eD`xBPA9-qw2g~}HAvytBIGlhO~2p@^Kl@@loC5JBv`mx{y9gig~G6Khj zAGb>SlPqJx0cf0b!CUKs7mm8}n%jW; zfakGmOgZ;guRrlNpMiQRHrWakZ;g3i at Wa{0+`W<1O?K-px4 at o%(;FF2t6N=-X2vi at 2lZ|W4#k(xvBmbVhivsg1 z1f#+YSA{8kqsTFadq~c4gY*O9XSFcr*>ms&l$JvhsHmd$!DI&R2fY#Xb2re~1q`FV5Br_9G+#4y*K2CH*Cq{?4AHRQvA!3O}3uqeAmd`zhC)knQ3^ zogC*ZyVw1KMTT2%{Tva6Iwm=OnT2|_?SBsZbSt~jAMztNEC+9Fo;x(>N#@3LeDEw2 zFptdC=sbkR?LRRw_fyjFXI#Z?jrz)lq4C&rV`MH8=IV1WDEEieupiKWsp{k;r73BY zg?T%oCNzy34=Pon=%~nRJnUm_G>nz zb92QPLi7Mtgbsr5mAR;ByZq2=Fc{PX8Xtu0WT|v-rSw}!NoPDdG%Rji1h$LSO3spb zJymKnGZ6Y6yA|^?Nz8PNYe9%lhht~PthN_)!3l(}==_2{D}ErYgkO3R41sHq)H)@ueH9ook5)_3sKKWr3(o>6) ze+`I;JWBP%3iDD{S8AqLV{4`O#7eQrg|ekgZJVhT zYo4Xy#gI!G-IDBXJ?jaVYwI5t8*UNSFA|&L7iqkZrQ-%$k!;6g_~0_D+b>kjAM3i# z)$_D<%IAmKTDkUgU+o+VyN;19sl;3?OV$qn%}Jd)3m=@eWYhF#YBydu;aN1XUO3Uc zePL^~8P24cIWiI5Uw}mV6=X6ryl(@w%yroPzg3{}T80AjYl(_{i zsHNSNADU8 at 0ek35UZkb1DK~{I66YkPsVQL;sT8ovR7zZ;^7N&*r7OagAxlg<5cp3h zgZzgapUveEy$vwY706b~Lsy}w9C3hB>sGhCT3h9%+N+QC|Dui}$@u^P0{}#V0{}4m zN9yQ5wb6gv14H>PYcHHeo6?OXNUt&#greH3pm0(w7{!1P(|4gvZfe*i?basxnFN;* zDIyy)_fNT(=~jVarLpBQKh^1T&ON{7-}eW~7*N8Q?VwKghEmzF7XwOm@*KF2IBo=r zBY)s2O^{1FrW|J(XAXPVP$sMEI;zWx6KHn|<(Atb3g%XtO>~51R8ab4y6il~dAFTZmQ+WL zA?6;-unbp+X7NPWI%S at ww=zS^DU5VYiZu3+<}$m?QOns?kX_wn9N|14GZC{Pz_5kE zdL?93XE&a${|g8s$6Ut9p>|g{5uYc_;p3e*)I<^RIE}E&-b0QrkPN&&$T<|f>LQuI zs(q3Du4|Q?r*C^1+h#<*t~Q_U`eqgUa9fl0rSkHlX+%AisPxMeTq&1hbgU&g*|RL{KHpa;X@#Lgj8mcui$TNBAEPngHw4!sxyXE zEHYSRP)bI3ghJc}<9dv=Mt)u`l~s?1vw!H4V)(S=^u zroOBzw#g+ID8mdlmL)$W=_koiOt|^i&j5}e43frQF+DzfH!<;#n3PRr!KF0}3>9et2pW^-VwjG9;PZ2{ncd z1OT7}>fiSQ{6{qX*WzabhwB=>JUd$?K7)! z0Pj+7*L&_I_jbpbg#Y_2o*$40-WEpu-U;YfL&5-v{naU%K3bBdkfd?uSPBWLJ;?(U zHBvoU!YEaJ%|k6!BfW!|;li(iJ5w6T9ki%=tB<%qMMk+(XSSRlq at XcV!neaMQ-4{haoQPLn%pV3BoqWi30_c6Lvt z9abw-quHvev2=@T|07y4E{n+Y#dNv#g`GwHK+9rErkpr5_l9h9-xhfn0#ScGoRjhT?#s=sq6F)-i|TI4AFf1O zM64>!`Te~<`3z9DNXy!Yur#d!*%C;9 at pc)$0b$ZogWQ^sQPP!hDNrmu^Eg&HI1`G8 z#O0gJZrS80!R;m7T&S}+t7_O-rY?)DwCbkP<*-+Zda&rXr!qr_Qpd{;t>LX=mN9th zcc%z~T$$}YU64rFYRmN&)LiOU357D}nYsfEISL75;X$%FN)Oy+sJ6SXk!&cZj6 at G< z0&F&RsGCDu(Axvu$QP8JczBRFc&U^i8sti!&9Sh7)t}XBB-X&_A5uyr?%^j86TQWy zV~P`16H<$^d)!?|*XC0?Y^~tu95>@+^NKMtZo1?{wc*$vb4eN3DjT1g>d0z5>7u&U zPe8stisBaqGm!l(+<>p5V_?`+nhZYBcGh< zRI?;MOCHF;a*MVg#CM>`otb)s&V9xQ=3P;Tq`G1gV9NuPS=2n at KuI3qW0m!(=7V`l z9&w47P6_TF^yx34du8~XO+fU^;OI98^WW at 2%`ItzocL{5!(*7w>>^%?*Kof)@SS>~ z-+*cr(cdJ03&!zX3GP9M(sZ2pjzq<0SP_oFF;Fc)e-r?-t%7Gm8PFT8$qy1^6|>OI zeuBR7Mlr_|R0E3U$iOp at IRuPAY?7^;|A=`#14OkaBE14Ky%QHDh9?edETya(MS0fc-v(@7T=qAD=+Xi5r<_U!`ocvvpnb9 zT};2P?{DA%I6W(g0SO^dJ1D3JDz>B$o2m^Z!>SE436Qh2{9U!i=>nYSy7>Zp&bT`` zo12fIv^S?=+f3PY+pQsz_7g4>8*LV#=A}m9>d|dKwKB9wyLqP?gM7nf41QX5;%nd+ z8HSk at TJfHnmW!e4hc4L(n at wAX?lE5JI$?!GRptOgW1Gw?y47?{v&*(0rnvcLQcp6E zZd>}OXHkB0KBiDZMyUO2JoM_; zBfimAcp<#SxzU6wb)Bj5j8aLep+xmL{Dej7z~Zvk0Bb at 95I8=xjlYr zVrp;6ye`~&La8(#@XEo0b`z at HFyV5;?!FTiY9bEzc^94`V_d8<*OEJtab+Im`y4|$ zA*pfNox)@8?>7U9c(=)h$9y)`9s`CkRKtuGpu_utr{4@%oz%=+P>xwrI|=GUizt96 z3_C1D`)iL1%P`i)D1oM3KUBNfk_|3ea!KD5M~~8mVGAstq$9tfN&bY+8@$y=_+DIh z3eJOE2YN+nKDeF}M{>?2&%zKwC%7k{%F87Ep{*q;*Ln@(7#>F)g6AEQ at t2mM=p{t*;1m=XL)_^^E&$TGbL7J)| z+-`<%*b`3nkl+^79h=-AOkt9Q`ic(%vLkQ#mwToeh-azuU;qFr2mkRYMFPr zGX7u at Cs-@Z?pmfrkYtTt%+#}1LaxAFk+roaWG~z-z6cRaItf-2V;xh`K6BT{aD_WJ zX)a^nPg~*NyekXh|5zhf4JPVFBkBwEHqaBGq#m(Q)=x};OtV< zoL!@O@`)P=TX{;VQNVof>$Rqm8zd{Io$gXGVc0sh^2D80%ata3m=HL8(UL{S(Uq8& zo@{g-lEqn+z4 at n#dI*IS52eE84_8cNI*9#NOrMDsA(0=wv?%cIg9vl<{^$WW=C(K6NI0rVz5mP8Xl z1>ZVKt}DGmJ=WVt+*u3dJ|*QupkbUgm*fPLY8DzL%8=nTr?r-`R2{gM{6wf+ysTt3 zGUW!_*%^i_s_BfYCm|hFso at Oy;KE7~wW0YKZK5aBlY?Y8 at pS=l&ZtHN%@-oj73M^D z8`k3)^rfDs5x!~z^Ojw%_Ux>J@|Gq?Q0qpyK{1;o50SxQ51AuJQ27A5rDQ0t#?bd2 zCG3 at VHo%6_aul9eYtS~@Hxoy9Gw68=542sVyx~7TpaR_^&`^3K(olM1)GOXYQUV2z zjTc21+C6O~da8F=dg=?|yHH|{a!0VB{f~qZK3V;%P zBcy<_2WZDthgKyPcXWs>0gDd4#gb-8ss*THEo}->yBjRCYYb(lB~@k!i5S8u;8THu z%@MHeH$9*pra}8Y8in9G`YwBy`)*NN_QTvBR&|=zk*;i^9j*!-$?Kkkaqom{X@?X^ z8L&Cx?%P(Pfa++WJJ#GmT?&@r8{+5w=zYQ*9gi3vO at op>5hdRWbsvE# z9@~@*z-F^|LtItF+Qu)8V)2bms-`$=kT&N3SOtxJA zll|hvN#j4})7q!^cRlBoP~E#o#(Fx(Em##~IY5I^=8avZy(!I=G9x2+?~rGy7n7(D zT8QhAj6$gAhP-9aJY-=>9BFQ(Z&*B9JC4ZCipWmz2+c>3o3vN}wSU$Y9wP1+G%%$8 zgmrxLR_r97n&Lg=M(Lpa4bv at s%?3r&BjisrS>_%(_PeBgD}H;|GiL}a5v};f4 at O<2 zI^uNNk#w at I@aMojcC--}zS9|IPd=9Y>t9 at czJLF@@&CK3Gx`r2+SCkfT>n3xlGJ2r zdn84a at gH;w;Ncbmf~ShV~J0o!W*|4d3`kpl;^N^ zPod)lwp(ou>ohl>PTEy%IdzL}Ic=mcO5Jg?Lro&n>{hO3wz#b0^`VT03^w_F3H^1j;Yz|#O;~9J%LOw_k6|Jwi+;PoRi|tuf$+JRqk_te3=b&>1KGN at bi@ooFnJ z#tdYan6kGzWCjX{VD!l__~sf_DbKiIOuorXN|||&$i!hf!{{USfe1Z32KjiQbaRTz z#c8x(`kPFf76W1){8;ncLk>&O|E^^pz!gt!JDuQTiFU?v1AC%(2C&5O&?U4<>~Q20 zAVhx;g~?-pQ62vF{}-)BL5I&T&UIeDo; zb at TlEoUeS|#hm}k>j!aw=cXz`K)vwDD5Nc&NMoQVXqsxMgNRrCO^FwE5XCK73Mw`#b>8JCn52}<3e!@8RU^vTT~x=wx9(8{_G z|ELIb&#R6`X{*<7fo=g%c8nqFw96|-nwCfj_E)x7yB+A-b)sraTWz7OdR7(0dYJl4 zYZZ^hHXS;ei%o-~G!v)ll70HCgq4*?WH7U7Obbq<3=fso-$XGz6%ZF|z&CeIf+m>L zO}aNw+C_0*ne?uD?ibmr%PH5S5e|zi9J?c8UcQy7MEhgyI|Ve#6&-N&U7K3Q5FZM~ zU8d@}MU7Oy5OAyIr*dXi3kubTC1EH#DhY$Np_;J77{#2o-#SLmFbNv%tTRM(hM~$> zW(w2?sf3%H3BnrvC6ye)3;SiKD*=DV4HaOZ(2~q5ENQ+O7JOk_{xF*$i@)KwXPdp5 zp7Z7~(#IJ#0n1ETCE;L&e~wI+LqF_!3&xUC3sbWK9sc6m&}IsX at Dlu`!gt((eg%2} z0%n10^Dq*C at QWtFJi`YtCPB1WAT5M`*)d at 4@E11-9D)glKm_3n;NkdWrmstHrE(RM z!dp$L(Hu?z_X5y+ub{{Xc^d48ZpO*MUJyB?%0{ff+=CLmCiq7rZzZeC;|KfYN|64GY z{_dw3|IG;d-)=nrY=DOAy>i=(($Nw{Kt%8YR8#3$(5eMNDk(r*0^gUrl+()7UD%Q zpwiwE$8bG&Qq#O2G}6X>LE%w(j3Q2Dw;!Qk3RSvh5cFL4Ai at HZETe7v^$>69>NQL- zsW?^bQai1uZqpdAdRehyrn0U(%Lrum8*C5jw0ag3@}Wzsl-aG~l$%2Yt#%tFHPR}) z#?tIP&2n$q&9oLd!%WPRhQE?UrqKbXZtYIpraOTEtDe?Khi#~Kfgwgm+-9<7dG||u zqIp4cB{A$WZbcVnV5jt4ZQ`@pT!|8?uJ3{EG8ZR?@}&FCA|Q@@B%Ep~k!9KU znQ4uqZ^21%k?5R%LCgs<#JE9Em at _5KtWfWh1r^z_$ygmr-#m2Pg=n|fjvwcpOPCo0 z4sZvz$BwnxYc}12Ai9d~au!4psY*Mf7pCp&aLyO+jH+=A*JxOJ(A9fY&(0|(`Ka%a z$EIAh;*Psl8||h*J5=(Xh+>uti|dS|>Zmpp8N(byQJ8c1BF;MPIfD=+*Ow^;9j(J1|3YWJ}c`ZUScnr2!zt?a7b zbb&VwBPaa9e~4U?h6Q`dZ6T5rV at i4hdX7v%00SatqUv|xbb!NQh(Jt=gp)>k{75V& znx@!%cZg-d(uDTw1+6#bE55}b3 at e_)q2f*!=1v#3J|+0#B7 at L1@+){nn9RI_58*c= z`oKM;jpX-_fdI}`3^S%6#0iyahLtR`0*S&3t)t3NG8R0Q>{_QBhutCZ5wdkm*g`3z zY&JBKfG+ts$VRs~S4?lo}y5<*KXSqV#Po8e%4U^#<{E4rKTM*boHqiA_H zzE|K+#WC*g03g=D at LXo+vpwhAPUn~PTYP>%oC8rbN}f3*Y|ma486L*_6_G?jUkY4I z70jejrQkshH-3n)(Jq$}O$+u=_sQ%i8uv at P=xVT+626yMv4uoF;nP-R4|Q}RgNaof zagXt+kG_KJFR$s=+P2HK)CLRdZn!|DB2JwpvlS?5*k5-(2V<--%n zlP1MVB;&H-FS(j1k~N9OR}3f7QCjp%-S0^4C~n)!o=ws!sdL`W&e=LN9>>XsFFF^B zR0|1xB~AOzaa%-)+X=^=0PrQ(2zT13Pn-L~MK0*nC9Vjg8=*E_ybwH8lMAoXJJ}RW zCB=IfeK>hN*;Bh6gKD{5^p=K5r5B zq|d+qobN*2EPv^ry5zqFs?}Y3V<6TpWetF_5$_BE9a3$=UK#97C+AVr)?mXvL8`0;zgV%xFdl4Wv9%On6fsBM5H%M>8kIF=Q~yVok+(jFcoxtLL&p zwrs6rLhU-uSfAadi?B5EX2VPt%rG_Qht#yg->^>=nJ&)IAQ~&OyPC!mrFDtvbxa{_ zwJ%u0JvG@|*=olE%`dCK!92sJ)n!F}$@tou$b#J8;!P37ydtCpK0O)ieQ0dVnYZ{DcOPKAhtySzOIh7%wqvh7AtK!0 zFKiiSo*GeS7SySQ_L^6Z^t2E581kr6`9z-l2{E1gnroIyK`!f~7<<@_4nEg}z~eApdpf$u&U zb^`PcI}rW#1ZUz0ndweApKwcO_C at AHBA;-2F7pgiD4!5izPX=36=ZP;J_KW)AY6Xt zW2{2{ipH at omeMbj(?5nn-}%Xmmo!gb!$}fJE_aM~gS^}kjc`{?ro%b1)uSD%t`BAD zK4%bcs)NBs z*J)b>gV%aG&8Au|DKCuxUJ=MIkt zkX>g$HggCDen6PfhnljAmOGLn at BZff%J0m_zx(?mpZ^=k0Xy7t<`5VY|1?pEIi84* z$^aWbdNod?b>uD*<0fiwe9P!14?~NIi|K~hBErhDmF1Iwff6OZY(gq$+}MlJ566>O0**df~R z?1K~#RMVtuY+tD-ak$Dl5 at sx|O at 11a@w at 8*>fyGFK4#ec!lE08*<*QYFHfNW0xlQ!INt8P zpkeT5;=Sb=M0f4B=4r}`v#G$`O3kl}??qvz>c}uDe{whUGIq;q`kdMsrkr!&OciAO zy71L0u(_omocrcxmQ+Y6Eu2(XcXNhExz8=XNreU5>1CK{UTy)d)J54k&Z4(D7h9&Q zm6vu5wC&(RVLx2bgmoZ|Lahgxf7*@iSWCopB?V z^RM0Hb z4apkf<3E3Pxrp(ZD)`aOcYy9GKEugnTi%|cQ~Iy9Fu*l-d-E_N^Qs=8r+M^m7FCfJh>+ zkepH*Q1ntU>JC})`{S??{gMON70Ofza-TV!{E41GC(Hd~e>EEkZ(=0R$x5C9ohNvO zjzOsnS9pb#j7&}$OH|7zNFFla?ck!M$m$zXa$r+MtY&*eXXIH`7NQ}?Vs`zwRw!20 z at QFQ>&xC6^LGcS4-5WfQmq;b5SV~o~Ag<94+38bcX3}o at noT}cNYpm)KL}kwqJ(u! z9crXLD63A%JJ=(Lp>x$J#c+?`NymIti|oksU=p4MGl+&Vu)eLJoU^E1B*?dvX_UYbt88<{eFCjBidH)3h1knG>J3ZqB5C zlQVCEh1MMV`r92ajo_yL*4!NJDM3&h0WzH47{A=a;pOtKkevFL%XDOVw^7D_t13C@ zzi%VL@;}F<|LlQEv1_MM=!`^1DU_g}3OXXSBxM9a5>`Z(!1u|v8)xF!wQbWj@(+&e z4?#z!|L-fJ9%h=>0kNdnyPSV!-EW+q*Kcq60cs8_A%UkcOA_%18K8(66j>bTh3|ZU zsljZ3t6?^Y>zr;yZd>WGmJS0AG%C3CrtQ4+lp(W6($2PA_YmFkmCYnnOQ?fk!%9C5 zyb8w>b{?@ze0r#K at 0+%(p#AgLQ3;V%=MSsKd at ElNGhpCM!U18{px05q%Z_s62uwJ~ zvX3cAa|ZUVs|4CSx|6lbA;LYoYrR_RIs at e|ZTh?>;yZR>OPbt0xzUeKhOmny+IL|w z%8W5#n9YT+T7SYg(aRM!_bG4Jr?5*bZYIm7gX`pX-ZXxEo8pYQiYRW_uGOD}rKm=b zZ`ECM>2esabV0z|iXZklTsAU!>o2*Dv at dYR-%WKFy;g>3*A?}|yJmF}aXeswtrN8%T)4^b2v zlhhIm!Y5Fs^#!2z6W&L;GK&z+BJdI1zJeWsS0O_3ynDCSsH9!W?Hz^R2fNM?Gu)nx;wfGkT>~8gCrT z<6``fli3;L$t5Q)c5gtai=J4_8bP`-N-BXIicuhz^&dhqQ#$<@%NxD(P#2 at WtkV7m ztg`-JSq;iUk%So>(O4;w{mUwyF(%VrR=Y*Mk?G0y7DisL;+gU^*RTwXC(YdFeE#G* z_hmAh`+t2u0}o*3WiT}42&0W6!W6RrA)5lfIDzc5Hy91DHB2!$PN)X%DfHZr=DBzf zV4zvWtv7Dxt*Z@@H6M4nMZbjXo~d9mWiO=;q75rKGW4#PNZ5OOqxkfY>E2UawS?>+ z(27oo%sO{iIq6?`!juL3ZW;pwKMlEt_SbsUlS63AO`Lj2L6SGP3!_fJ-9AHMmpEj& zcV9$|;j-UZ=FqOey%M$$3s8BdyF(-D(e{!?xpW&2Fyu}cWN=d7SA3|S>Ld-D9h!2xX^jzA8O443`Em`=mTE}(*0q+dj&X%P2za{jO&?dwt?nkY zk2p`dcf9etvCe{@>M-t-qMm&BxensFm-nBf;{1cuhCp$&GRNrw-8^a4 zWI}(xY?r*?=f9*z{&pGOlSGB+uiOqOqdFJLcgOabT3s?7Vt_$)bvM~2iU47dL6w$F z#p893&?uFgQ}WI*cO5n-7I~uIr+n18sXg1v+ zMopGS!1)94r#$R7vlt~CfAcdO{AE7V>G7n+*Q5LHIWi+Rm(rDh(S z;nHl!Y at +o|s7cvUO1=mGp^NC^v5q>`yMJ6a3tX8;AC7sFN@(xwPQi!Nb#)(cYHyaL zf*DSj9DQ739!!1In+cKSB8cnlUCt<&QoAJemVX=^D4pJ`kef75zLj59d{KA3$jFV? zpXcKpHADv=n!3Q2iUKrw{V`lXEXaX7h_rOzT80&m9l>Fk?%XlWnD9qfXTo!TBbyFF6JZVDoQbI*j#fk;3t(Sxdl55k+B|?w zbAqlSB&ne+vDkNHiqcby%KTu54HBGXB1`Qdq0GlwKD-mxtzb?g+n7yHjo2TIDA(0NXTU0|u z<9y2@;l at g?`pOk2ZtF-uK18F+SlLoS(dQ?uy+Tp41LE_f`G5(Q_^+m5GvkLnO|02{ z4;Y3qg*r+i5(7zK1Pyb8MoJzN?n9j7NQ8!uA}}Tk09F#*6;*kb>>y%%CdeRspl2-u zvjktiUHK#9nhYmMfI22mY{Mug+wJAHFhwz`li}j{y8BUx>@Y$bLU{EiCTPa1unc9` zbuk!KR at J&Gb<&p|aLqHR zrxHnTq z4t`O6;e;df!D9Fzs^k!EAzD3p)HY~mJKff#_5g%iFkHue$Ju>;rgf9(cAb-LIqwtS z`$sF1#xD9B8jo`!n4 at r{CaOXMqO=~+`HSX*o+N?0ztiiqWop7+*2901#{Fg+u+h;y at Zaj8w zBKBp`2u9IJYSD;#(TJ?lA&%1F=9ggfy)~-Y)i0zC=>m1I;O=0^Fo92`rp-=Y$RM_? zw+rMAux7u1`%4Fh)GP$=ubS)qhz$YuHkQOBoqjl(WIEbCAplsfQ#p~@utvL at ug2N4E)Nb{)DFfr-}N>NMuu)>~To)}=+^Es^dKn_{@*m9)_B6)40EXPfqyZe z>Oyq%19tkm{_WVfLCz;P)(Xek(dHp|mLS#}*&H;L zG)8ZpYRr|;C5a=zP9NLO;3!r(MbDx0}}z)MzSVkYLXIK6zSEO zR6?kAJG!yF!thHZhYcqmnf*jQh-IA7)mvC8oG&@Q-nyD%`8_o=^YQ-i$m36DOxzX) z#Z0Ubmp1`zCDYJ7Bsi)7R;o9lKpux! zIPw^o#|+{Dm#xPu%1kDyaek838>Tm5LNc^lE{=!03>Hz!XmPl>1sU+|5Qr4?Ax>yO zWf at RbX1<#=D;>G&(qI>1jcbujQ<}HX at 8C?t>5qT_n|p*tQmAgNvd5Ye$vyqj;6R<` zn%Ne)nyw~V&NtYA)9z0iUZv$g)0AcPVWR0ljHN?@6ly1iyX8 zvEr2cJtw3ezNtBhJ)7s=M9qSo at jl(wmbS~}pXHof4|PwoP2o+hM2D`j1F>>@9|i8T zik+UvlN^!bHo))vb$m0DxQZMS9UQgz+JR|ZcBT at GaN|g6 at i^wwYvuj?Rr) zhd1#qd4wTNf!_dBVFy&gCADI7=3>dW at nQ@XHDR0Oh-)~oIR=RaOAI~`9E_5woxR#Z zQ1d#@Fxr3%KXlyzCt$L#qdq3(dRCe(7uPR#T)W$zEDrxb2PQ$+KUw_z-IC_>!n5>? zuDwqOpBPgV){0JT8{9>awNEOy+{{y-U}Q3jTd{MrN&N+i^9~RB&s`%0{=9G5;`xkuw zs!$q_ at EK|3{a)!M0=zrX_7ELIA7+VtrvE5U6}gt$B3&hqF`KX>NaH-66vay3 z3$QEDCE~XLB7ewI_MnG0f+GzSmKzS&Sev*~U#M#t5>rfYD>>7t1=^HRToIPM?kHNA zJR^2ntb+haEq>xduKzCd;T8WCZ2H|To$N6r=efEYaF zT0>6b at 5ij#oLxWPcW}l?RV<{buu*GN=93Pjks#YCBf)_}%5V%a-jq60qRF}D+H{y~ zBHfL}r)HT!wker at cG;RvpiR8s+BVxoIM-iT8PWjH9Yb%cIAm7KEZHDUmK)lX8Jj(` zSIKCVhrE4sDka^edaT~{6FUJR3AXAiXqz=@yu#MYEn)7I>4zGRB4!W47*z8BVx at 7c zlzrqOo=4b&SB$JJQ)sj+yqP(5X4=mVMLH)lX_`#ZbB6T}Q(LPTqR-Y~qIp6{MpTAe zRYP_f(|JfI1s-4rsK3Rxx#DHZlW+3{$J`>J%gWP;EjhfI-qPe<7R*Oh{dId3vo_VQ ztsJe***YZ*L0uLqw9_`6Dk}vH at 9lyjp2BqM%8k_N(f9b8?)QD6SWGo6+`wnE5Plsx zE0-J(VOdt^>Em{|V~U9=+YNZ}Q&!}P#%E)(#erD%D)aLa9geCAZa24UJc!vi^|>G- zh;0Sbp4S(gV*iI6u&2 zIbzUZrYjuOnXbDp8D}i`JY<|xgHUzAA3(cFpcu@{c-X8H6z~Iv*=mD^*ow+;f at 6_? z7D8g%2iI^_qk`6_X?*vmyoSa5ApAIJliM&jSV6oa^(lWK(y+Wh3|Mjl?{x=~JOC1j z3KH7{yNKN%_Q`FL at N5#J1hd#SXkjTqZ;{~<@#K6&34MYQ2a!5JU!bWTVDk4)5x|#) z!#I4jpaV011U?knbkw74>nzA36ZCa!_NoqEBn<}WjwmVx}9nu-i>m5CHsm?``t5uAUwD}~km(a2; zg3 at _Lgze=pIk=sUS&|E{9~5Yb&wE!)s?Je`h(}aIJbg zzSa7HR2_tJs(24E1;ido?9XsUP*S}Z<0 at 7;Yz>#fPT(4qK|h+|!fYwm)$BO|)BYsR zk5^H at 1QNB|rq$e>bw1XdW82uo3RY{S+^EP at FV6G8vSSt;%juX)HJ5DDH(7U at TtH~G z*hJcvlyhtg?e->OiA_n|68}m8Oxmwv-k6Gi)3Rg~p?<2Fi7UfO`OMqgna`%P86}mh zFy&xt%;y5S- at uR%8yxJ;J#)CE<}-u(jDY1kFNl{vJ-<2Qm<2M}*r2vz4>zMpHXbYn zAD76OrdrB3n`z}=Vw?6?nt3mpYi4Y^ggLorFzi8+qQ&mkRVNVUe_tM)-+W?m%$e~_ zDKTw^{qB~NVBm1h1lA}j7+a3%z8H$)0$o5PoAq4sBC-e*i= zwDkr!cJwLfL!vcu8LoUqyW7+$r(B9&h&ubq*Gk-_k~NqVVX>sj+b0YWtKuDAi&+xL zsA^qMqc1(Yn%7<##mkwl3JLvYr{W!HgBJS>PuRowCxkpEy1eQSh+UQ~Za9*`>_(^w zd;UBY^S;Id5uD9s*={l~W(Vs9iWumzVzQX}OF<(X)|&Z}aw~+vfy|)NhB+9n{aNGY zZZmvl2~!7L_&jwgQHPyzDlg`V at ErlAU3*B at H@m7#KX23kiG42B7_`Wboy5d5JY z{0v}iSAvhAh?Sy0DGDSj7COg}m%BuuAFD(Za%{tm0bEC3>+GIrQOEawLR^?q&k at GI z?G5?00h2 at hker6Tcp*2C=UvEEa}|3|A5mdZJRck*El#f(VXNJScgF&ZzGKr6a|F+}W6|gY>kEkoR|6Gp$b(6bV#YTQn0oC_rZN&vO zy-Q{eno{{W5ET)1UF6hQ2-6UB9qJIO(~%`Yr?Uz#{_6+>WquFp at E;HGw`>vFEgAb# z9<#EYZhmLA?)+1Y+5T at e_Cy*f)cuDVCsL;WRpaD;s4?Qk>QwLyBEz-CpNtJ>cxAe^ zl5v;SIyzYB&Q4%rTH;+4ks7N^D#y!=*rIcEhMJke3T-3 at Y{?1dR(zdIn1`8grL?=8 z*<{B05rS}j(I#87<)&(4WzmXtWbkMKz7bcr?L%;Al6gRwiX+gZP2?B92ZZ}4MCk;e zKd^fc>rEOsyvu5ZwzIZEO|A(k)l!pgQf(0SWn-kk8ukr9lR8Vyl!?}Omd8~_pse$) zzljjq;<3ZyhvTp#4ykxTX$FxYpBMXMjF3Bx at ft^LG at r#Kqx0rd81lM3{Zp`jp1 zLKB_y_46D<49*cAkqzFr*@fI0+`!^e1SAPR at mUN8`=lHLSdpf%%pw{gaRJ+X_VIdz zNzS2Ru})Ec&=;_Aka3MS8qjnSaI6?a*gYqV`-)IpyWy7j5cY8J*HLcoLy8`+qfU8G zkne^bhO#Y_>(-4E=Ti*9y at D4dG&u!{@@K|Hakh)iQVE;Rf9)Hja*lVH#Vj{;GV-@< z*nMorr9jG>MD`yof(t+ivAMV4UzlzK_j>;dA&vQs#(!)*`ThR}A?AN`v_39)qT~c9 zte_K1K7?T4qU`frp~yf)qE5yg=i_Ng*XssXk&HDI_ at 2n2XA+!!%y zI!w#0|8yy?kP5;`1`=r5ZF_}6mmwE)W`7{U5?oC)OTL=`W0wx_&|;kO8h6sJ+_|2% zNp6&WFp1-MtSIN6hD>hWgYh#(jNeh%TvnL2H0^GXMz7g=HqeT?Op4k6u*erzr>U4` z!C4Z~QO3*RQTHvF8Y@}0HqR0ha?$0=nNPYagr~{KFj()<)H$4qX|CSGx`*{-D$0Y3 z2*k{xq1+1zE(kOsCG9fCyps^?=d at k)a)p7DsP%9Q#T=Qnj1N`^IGqNVY4G~30AArz zWhU45Vk$B{2K6x|-~VA~Ur`QtgDbZj_^=>RBx~_-9wL6kWSGF>3SC{N5e*LcsR)uF zEb^5W2Qpxz!GR(c+vGRimg)gkC3s}EsJ&~77?Sxxq-F8 at Qr{51Fjnn at bBLHljKNmJ z)xl%=xB6rY3h@${!Uq2$=$q&sUIBl>V0rCb at pmMBPLa9L*f`K!#5=zmA@@V#AuWCz z at P1iBxwm;1hLz1TN9qr_e7m at geRjFN@lku`1c~N-t>ST; zwjVg;(UPe$j8_HXH>7Z z7ql*H8)U>jh$IX^aee~LFQ&F*OEu=OHF6LAuAyijO5*PglK2vAgj)#MgvzA?y!OwHYq34o%0Qs6I3TF zu(c9~GE5fqF|~%}T2?uTyTg#oTq52}T$Ec`033xuAj49Covh|UrYJOLWo at gK2`wMx zB>06WjH(Dmse+ox)071oF!C=l16DR z)BMAcL+gog^QyZayvXAv)i{zIxdHIqmav_g6uFVzzmaWo$xq)_=~(Ep=W_2AS1nga zw0N;x=->_15-*RTjME~vjrNjfsIhDXSOc*ZNB}5*On;-M)>U&)GfCTyf3pWJhT0d7 z{WR4a)K80fa-)T5fK{zCqKWEElI|w9jyV093r`sdOu1T%i#`7Y9Hb`&%2vFZEY=8^ zuKCiab at 2Q`GTYZ)WEkXK6kr_}6cg913$f+aY;)3(9d~rRJcjO^;ixk0E>L_`ERl1* za1g9fazMTM%&}Hb$aXg#LCgHZ at kK4< zho&e5&lk*%3Gk|q5|+}cQG5dqVwdSBSByBY_z*=^!Gv?Ul(alq#N-xtMf)^y##w!J z&CPc7yCqhV&b-E=Zyg?Cg?#NfuS}C*hrD~8x;VV}pB^fJWnWK3K8#S8z*uD7cKBB@ zU(yCchcsX{<`@`=>4XzMm0QDh-<03 at LHW#zk)D-4XcfHwjzq~6bVHE at p z@>r24ApN!#?B2x8YlF1WVj$q$EvO=(7dD&0EX2Z>w)*W?fdwc2dpx0G-Gc79B&Z#EVuIkIIpNj z1hLo(zazHz!1$zhWI at u&nIXbD;&l5Hobj!exDhH17 at kqLDOTe{e4prSy2{KGz at lX-rVY`PF4Y0B58;Ohu8ujTD?BN>J#MH8=hsy z;7!-Xukhv$@?S{@d^gT{{;zuf{Hxy5{~780&l28vu-^}nRL at Yn+9l1I{Wnm z;Ao}{d>CRGd~g=u-8N6lQB=MJ+`~;SWEYfo)Z9djp&0gWD_j!eGe4xz&T?%n at Bx)H z8?B_4TPjOx;NI04+RY5ho3fbxTri`g*6?qD+0J-%OQKP;1uk#l-}TWnq4KPEN0aZ`agI%C7) zB>xuI^D^_oB%i&E4J!pmV at UcNJRW$kpmr*-W{ZkHs|- at 7kq>IT5p)J1sFF@|4B4mU zw&a*<IDsEunu=x+rWH;n41 zuNy(9+l6^Qfr+2*2nU1_7(_XzUt;#D{v_erF--^A{psup9S3Gb3Xve3&Vbmki-dOf z&G3PwAYLAC at 7Cuo-qamrra3c>_{%-huHaZY{uccl)RqEPgcnbx2 at 6p={fc3zr=T?P z<_tA^sUR_KMCQk8l@#n*!8ch*O}&|e7(2WnTvddI(YaXFp9NwR5}h*t<$EK{KMgeo zjAI`#{uMbQ5lBsof90AV{y+A;|GNHPt!|@?ql)TFPo(MC_+uh-xFw9W*yEd$d2tJj zipU&vzAEEJ#j@;Li8RN0oORhU*2huoncrT}%!8=&NcmwD!MkG2sV%!S`?eA!q43SN z)2vU9(+uC~)^zXJ$0voqg*Sl+0sqn2sJLMY%)U{T#2BOlf)&w=152>#R>EDl`%97$ z9u5)sFD!9{TLqY)Q4&Bs?-r4mQ5_ znhYx7UWXbjjcIoU^GnDM2_%;?edV&KPWkdsiOF+`^Q4hlxk#1ld33T$r1$)sOS8VE z7*}_^^t3hs(BDI^QnZAO60mO~%duS1kzRdSqNYTRd~e(@6itY=Pzh0(M2jt^sGi75 zhh>6IJ7w%7Ot*l5RPPE`(4 at 999hS`@FEQ_TqAw{_C`~A>l zOIUHl$DFz4&flOfQX7aMDxD4zkog2gjB+&iFQPkpVz)!Qycrt8)h( zL+&wZb01ri&V%i6L{$S`igTo3tEe=U+o}&b at o8)6Oj|Acj-x4Exo-R at QJH^+cc5=a zC#iCkOpQ=obBlFKyxIL(YtGw#GTBcCTqi+Ntn$R^S!du$_X1#aMcH0*477s{kRvDV zzZ1z6G at KWzbLItomY)d1?|5P(go<+HdH5R_x at Q_2J*X7TiyPVT{z9ew#Krp+UV8T- zMNBZW=oYJS;sNgQjn5keDFI&duDi`Y(w_}Q1uv{)#c*bWaU9!p=$t12Ceu4WCf_hr z;1m1`BUDKPTDPg}2pA}f<|1i`p6#DaisizN;J-3M`75Th5emN$XE{*Ztz_P&plvo<4Ay$Pm+1&4v;?zEqfza z@?5X8TVpf>O?tpW_zTv!Cz?rj*hF`b&6aqWK+AL_T!H+Q{xITrk8!8J%EjDi24-rX zdWQ at p1f{TPWv=(+Owa8h#0WrDbgh4Ej!J`Y^$B;YtD7+KZs6Pq?u{sM|V;+ z&12yfWO~c>Qy_t2ASPd6&WR_-Jw}(uc|Y8Yvw3zJg8U06>&yCAEW0b$yD+-|g#gA~ zPqxP&EhcfRop~*1$2-V#Hd6xqaqLuwj1jDcZTVh at 9cb`#sHs*?X`b16>)@3)b9Ol+ zfg8iF#>k3+w?F^3C5!tj at B#RjIk)~Y=a2u0Isb<+|NMh6Kj~pQ*G&SN@=@uunk0mO zEEsBAg)fZ>$BC;V!W|gFSamozPLkpz2 at Ln<^=@G0D`)>&oq56FIyB-nb89?;C=M`a zi*>sB=y96)xRJd-_3QokwnvT&0mG{>A2jR!&>kWEQUFGyaXg=Dt)2KQIRX>^-dJY@ z7=hq--y9{o^A;UJ?_HU2%wyY=nm at UgP)~=L%SN|KiM=UpGRX$_R^!iZw<+c at u^>%W zNII88M_13qZqzyafi{R1x8htm#c$DnM^|q%$b8>n1?|jmbLQpQah0K#!7c|)Nn^UR zvh5h(b*^P+>S9nZ!F;Td67M8CI#X36E3-i0z>C0H5itIvCPxb{=vNFvHc8D8XLFhp z?0MJW5gm!_V4#um>8~Oh$yCV8Nyal1zOx|26Cr6zTqFwSllQfD!N9y7Hlsk^-K;&2q+ z^R@91E*i67P29y zU#QlCGN=5=p*Mqh)!Y}f*!UBD^!<`}*{xhO?vJ9Jd^$Ey|1o7|QARNvjLziVe9Esp z=~oPkhQ|f+jX<0SS)`pXVXHy+=-ci&w`6Ny%vMAbCdeaASb2NLay_J1vZAE5vVp>d zcZhGx?$IGI-fKL at B>7NvUV?Hy;51?gNIKX)F|Gl*M3EF>G5Ad7xK-F81ub6IV4ppV z_59xcUcuE0*eGL5MQa!$dw=)=%2`E^4-*QL^-~a3Bb+J167rXAXk!&x$re>aiyD0- zlpWS_`@+;Df8JnJeFH=;+=f=p?~(`*My-mLMa zN{})y8p|K84{Q6_g!VC91O1>uy`)9I4UururZ-5 zF;5RP7bd;!#UhROQIeHNQ{Y_MCiGMjQiV(;UY3+ckb;g_hDxbALqJ|7_Cnj%a9>P7 zW5J0S497219oDre=5On8Lxy{+=;JY8OUUoAAMuuYZ(t|_XqILN`Y00a|834s#y`(t z4+a842lKxlJNmzH+<$%f_rJ7NYXAMM28vJ$Eu4rg=ni55`8Q1w1xBQ!3JGEf!!7|@ z18RC(*YYbMvfm(wUmu2E6*3wDZO#YfWDXg4e{+F^Qu_Jz->#~&w3K7l&-(*%4>kuX zUta}a#EflUh|hdrC?V0N84EIEBD0qgM@}X)Y0ODtpf->dya{N=$v~Q6YNA+ef|sS^ z>d2SV2KGC}*rq!G{eKI!4hkcmUX zvI*#z7pAhMZRsZngEGu!XiHrt$M7`?8g()mKe1iDPazNhzr&T?;YZk$=Vx}X%-r!h z;`;9}i8rDSH8oFQWh8Wr-zLM-bfwL!0Tx&(s4PH7-Y}mk&lbFi5IKwbi zr^G6nKjK~XDCrQlU{b~nzZ~9}%lu at C`-WolwPrIjl&O`-#reQ$q-c;A)OIY*O?7pC zYLdXI-+Hl8N*%Sb0aJTv__Flot!wD#+t0bC_rpnEDF%`j)ymTjRUlB!jEZR?hxjWl zG+E3vT5M00w>%80soO$DAt>g`^I(V|bTpLg2_|6|G)&DO3zXyf!C*8YzWvm}5wmgz}%Nd_;J?*Jol*Gz+pFX5ECD5CpT7dbTDqnMJ+ zL}33M)~j%6VNgYQ7(d3CQ|Q at Q6p3POLv`U}m1&YlV&miL*0#7^;LZht;!Ct=zJjC3 zE;SFwzJuLK;nxE7g<}fU0m%aptXOTEBHkL9b76c|l4=a*@>}dhh{%BqB;(w74yP69 ztHUW;St_aJKfBC2{MOQE_ at R9_%wKpCWaSPV0l^a58PH5XBSP8Y$|`L?^)JCVcocjN z27$QCWVYAaWq${-t}tH_*1?DG!(AxV$KE~Kk(>=`OMJTBt#;MMO*CQMn>mkd(mOoU ztE6j4q#_b^AT$w5$@8zK`&8~ksQL|GFl)lctw6D{O2#0hu+&Ll8wxY7w1T~&TW}r1mOCa>w9IK&<1aK1FdSFNNWm{i--nnM(`Y^#Be09i+CiJLL;00 z#50A!1rQoaM7&b`E3Tp5b|}IA;+hlse?M#W{~Oo;^N96Y?jMQQ%2KKHA?Qn%NZ<1H zE%J+DDO=R?z1I|?V2WVKKQ$&aR;}G6-J}Nya>p=b??^1YK?o+?%{J-jsOl{`&u6yN zoo>0 at OmC)gdj)*KBo5j!z``c(h{=tmmtP|-U&GW9l1QRG#eRz^&cjNH zqU}D)wT`72=u5X!oBi1`T)WB<*a{PZfzV!`k;9I9tvM+D?y3wGqC!sZejv-c1IvI@ z>aDYgDHQ+CbF3n%LZ>QiY{jH1EI-|As4tpde$B|$f+r!)5~#07cOIcy9ryI>2^^G? zQzEjstfQJt|5B+bH7Qt2h4wzjHt{vy at IE+5Qj&1Qmxm8H_;s)->-c1jWG&95dTkN` z(?kI2v0J7VkyVl&4A1i$AH$b_4ElvJuql{=-}o-cRrEHKILp`{`p;CTi}g#~F!`X^ zZ2*}yQUDik_*;by!$?Lr+ at PzIsXgbUI=pdE7H6OT)K zzBSk?@kkds;WM1qe5Amfx<#63jZokHTW+`ZdsLD7-zI_b?~%ZN0<{16wR`&?J;Ikx z!+1jGv2vfGVtffJqU6Sgm^5RGn58nm7M!T`$A&e%0nxgND at Rn<^LKl1h4hu$x4s}e zakC33?!%XpD7#Ovo;SU)Q}O`hF+h4B>GPJ;>}$4 at -)YwN`{QnHFBoU&G9h=|(b*9A zXr%}bxXk^G5>dk=3Ov} zV`Fik8Tz9OB%P7wfFy?VDjIzdGab8yMRo(PnUk(N;G5mB^Pm|PG7C^A>ePlu577ZR zvPD!npAf*%6M72#E-ryQ5NwgI8?moc#1$4VDn)B^3NAbvWf9)4#6*(?!KY0q`y6F+ z79zUMblg*+V!QwtFF6PygGzGKqq{$O!}siJ(MyniXMSqTD#Kp1zN$?K* zZMw72ogl0^gzdNyNqxB&R?sb&;}f5*>LVPB;Y>r&8?Qt5$Jmr~u+Mt at G@b<*XM;&L zij+c>860n+FU*j1R8niGcRwY>s{>=Zf&O~uGTM~gq|;Cqxg>RktFuX}<~-|)>50&0 zTA}60tBK)I;2HVJE$3x+4J2`v=e5|OKR65LDo>!cWqO%J2dEM7Xhb zMLvi1dh%L?9r~aVn9s#8>l2m=>T3>KOf5!d;)mVgS28#9!aFTWP^)1QM<a+mTaJ>C6fAL*E@(bZMUN=N~KP2afZBMJF&f6Pl<*A^#!{eSgdN!z$0&I0&NC-UMW z@(MQeaw>86*U|fhYroTMo#-9X`-RbdLDG14dhc5$FI8fsEMSRDsOt_wi=8(Jj}b;- zQ0XT5Qboth2}b$y4NKgU1VlcB at k*0QH9(G61d at +exaW}Q3}5hSeq-1dYQ|S~CMJRK z6W+w5cKWlQ;q8 at 2-cP~?v$Aw#a$hA;yQk!VH>%t;LE6a}YHJyekl-n?DyGCxjq!^d zIe?Ju5Z5zl<=+#H1MG~$$`L?7f~Y`1xc?71>z{T&3(6a173)htdgZ)m5HlzmBFzNF zdR$)y^RZ9A0%w-PhWxF&ObZPJ>5CJysx{V_>gmyo<3&-%G}()&~$q)3XiRPY5P|_ zULpN_7h~=AH{YM|fIh3CxBGv5d7}wlkcPf{9E$V5V+!og=H8!vf4w&IeaD at B`33i$ zkgCUYwb~_dKWqLHP4MkKC3TnS<=OlGJO4Y9-+}!2<1F?kas9^&&F6^mXU#qV|2xXp z{r>LDcZM&MU^BLF3nI|E5$+Ba1F~TSYZSafBoPCZFx#Qa1L9G^xnpoaD(Eb%iU)(9 zOo;+gSiF<5$?hW*6GPU(X at hr1S(TSM#VOKjQL-SgcXoM{-#%;9=!`{DC~!V&M5dO8 z@!#>>rBI|<>s9icy+|{dQBD+|%~{c~5MrS*@#@pk*O1{U5>1u*wk>k<#2vgEGTrz- z_RlB>rH>|Uxv{YTr7}v6tgdt9xUusj*lbYB at D^%xpq_R| z3ba|+vU9I*pfOEPE-ep_txdn?;~iF{f8*joQ%pmW;p0*6pi7gd(v*7RJqxZK`slGGVk{yr*2Z!&L>op4W|%De^}S0Uz2OVE|gpyFP3 zhdHZ?dl0lDMVD-bab7}4wox9H&=CmlCF3`4P$gk%G;?L{MZ)> z?zPF|ap4r2sG;%qYar)Y*5dSJ4$HxmM6u087Zvy1QV5ep{rt*BUT_^B`z_(BZlePw z>Q35j<4)=#*D_kF~u+ at 3V0$dgz>*J?fzXcUU=3Xe-vu7x at 2lH@k&$N^zm1T!`u z3}Zj#nL;**iVj7Ujyr7bf&cc(Mcv@)VILh;Voo;getmjX*1TkFEkA%8LqGzFFJu)f z25~`tx+I8Tm^!g28jl^og&;k#t-?EB(3c(xescV+6=+StP@~$O{XIaFo`I4BvvI8n zppY}WI5fpmr8QL0)sIMQu#iwqOZt`tg$)<6`U_>j1;&XK8=rNNuDn`7T}Gwx(cPI+ zw#ox`Q%-Bgg+|8MAN+U7n+UQyiK~bLs3vP!dJ1=4C$Xd)@J9}z6br+wko+JHEIO%A zfjgrm5QRC2s+;cwzHr}MNv)glIE;ec0vh$GLqCp+zT1*jY}eF}6pP5{27zK=kbHa> zKXO>v;3Qk7b>0K)nVD_ZP2>JA@);=8u$MrOpb5>7N;!9#hqlew87O#2eHP3sdv7myWNb798z3#8CcaTzbRg&`}tEMQ3*uPvuJZ8cn8? zC_C+T0F4y|tK>4cwgvE#Vk6h_F5TjInBB_%f|Ih2Ru9DVPt1krczsoTGc8{o_o0y( zwmChWdW!|>Eat_VDRqJpS)1J@$Q*iyCu!3u zO<`*z_9~E|Hz*YHaKl}dcUIPs1gOJs1D5=7OUI(5aywk^*R}O&6t$=L6hH?m$j&bw z`3I$N+58364P7zxjDj1jMwc?eA!j)+ZK%ShpFVBPja;oJ52pdm#}-|w&Y8a-N5oNr z$l;rkbjd6SbjFS0aYwo#J?G8#EPop9f#5U7{aE+`TL at V*YLrpNWDnrLZcBL at V%{nX zp9IwZT(T^fK@{BaAhKn?1KlbLk0ZJmh6UqbIdTP7vD(L)&ka!vvm#5 at YyGs{6Lqie zyW%yl31e$wSkaQGWxNyHst$JnYB1y&?FkozZz%HbS`@4!($P*{x1~<3451fbXSM{8 zYr)qGHdz=J60wK73R|OV1G=KAXtOs)Aa`Z}w?2A z5G^vN7mA6mP9U!`SB!W3j-R-roq at qtiT$yoizb`*%T|SVWX at 8Y*SXcVxJvm>IBG zt$?9Gau=p#oP?qz(({O+m<(Yai3Ta9mDQI+Nf$f;c)h)m+zYCKEN)Ln>7ay$!49~7fTJ= z**~=VPCzwe4)h~WX1*rvA`o$Wk*#QiG@|631qq?yi+TCx|2Ta^&Cl(zh*R42vMBzn z>Um!D?EB?|SG{Di{0u_fu3B+Rq*cCMek+_NKRXyU_Xo+dGd+jia|VzT1P#O&QLOtE zY`dX|gA=!)3&Oek1hc&r$oKjRLB8!pB6~5s!~`ON9c30n_SS=nhMDO{Q&#zgG^f_l z*4q+d%0 at ReC~TgObN1|Mwv8&#+G~v;?&IAyDnSkoG?;{${YcB*BVrYhl}C`>Rwb0p zFtN!{PdE~NctDY*V}-O+L{OAPuCAL)s(HBU|{gb9{b}s{)d9_>m6n+ zsMI?1-9=>F at k4wcb~!iH4rWqf!E>k=Sht_D2sfor!1G^k+0EDAZ z#0D(qijGT~-zeL6HfW~uXsA=Is7AP`B3x1rXV4?MhV2?R(zm8%r@~5ON$DWi_*jeZ zf#~F(>TB1mrO>n-BeWc9kicG|hqzS2-fcp=b~cC&p;HlxX1E|XE)XZT$IT+c;Sob5 zNqi$yA{<5jW&+bev!2rS<23SoT_Va9?x6~E5LeK)tSHqHyK1{%q0c7$Y^hN|Hd1B3 zNeL!0k3qCpH`?TlnQ8 at _SWEKB2x&`Y9{qr-koWHePeMAv}EIi>BcT{a2N31UQnYEH+_N>zuU*%Le-hbs4)B>WH z4h?rOumJbtqE6zwVYM#9qY)K`0lRLv`g~0QcR4}n7J2b5d6!m7ud|HCOKrT`T2Yf> z)oO*-JGW;iN^Pr)$A+t%vcU{Ywy0|Cps0E+XJJyAzR(-BqY??11)b0vch%~uw8;i# z!97o$kawA5Xn)Akf(neOQpZvImeA8xS{KI)c=?%U~+RahgqCR2| zKahYcHe|bM8WSBRP8l5|{xIdC>IGFx;;XpIug^xiC}ww!bl5n-P*cEk6)Iv>K_|G< zqgHHhsZr0sG1hQh@};~*#}$8acCOKNOX`v_sA>tcbtj_z4RUIAQ=!^!2-XK><@|cB z$WAP at 2cq-Q=4{zbzqbda#5bhjfO{%YjaH0JZ6CjZc=I5v;Q(nf!q&2v;uraXJH1P< z6-$-*e4FaLdt*WWQE)_^ zc#k?-{W>b at ZJzf&ZiO0Tv$j7q*rj%8 z`AE#W at RZAmF&ldMQK|vo$C%=F8&0cXhcoM+XsQ+~qI~1 at 38c)3qJ!`)jwbSSkZ~f* z)T?$-0NI1bX7%LSzYk-|3zZ~Q&M_ at Vp2e1S=qm1f(spJPqR@|JOgAuB?sds~F;G$4 z(XV3>ue5me7khw?VGihVhL`k)u6Lj-xA}_CTwVl29m;crn}~bOE#BNY(qy?c$%cndFk`snR5fAGx!z`0}LHK8qopnps2sCGP(l}{8PmS zP5Dsgj=jeoS81TmI1J)DqmgC{lMC8+sJrfdx#Fen at l=d7+Oz0b=Ly7cy`hxN2}r^} z5eL4NI<$XcSuf>^lzwXRs(;}koaKrueSwNSG8~wGNV}JRqUsja< z4Nk8`Pf|g}Ok#H-b()B|pIJ7eosR#;)~rmQs*82}1rm+)eI6$Jx`_CRKEknwdOClt zOT6U)7F$yQ7`ut)NwBZog|F6StJw8Kqg#qr`w_7^7_l05 at CY+}iIf~3i+ttDYbvgg zizk?TGzpJkp;Vk at URbuS|9^4zj!~Lz+m>k9wrx8i!?x`V+h&Hpux%^Dwv}Pqw(Ymi zJ*TSP-S<_Uy6 at j=ZMF4l^`SZX>|JaUa8dSJO=?BsTu{P7YDG}`*B7TjMaa(??XW9< zulD|t+M=xG`_?pr9@{iL`sbw zqYB_*Vu2{ct^W7rLXWS$K+X7 z+{O*o8{m$-7s<(j{qJIJfQr+Z-{_;%#|oL%)gnNb&bX5jglA zeV?>oZ5B--M5OEOT+K--fmN0sCqL-QO;_|fzqizm6z;3M5HQR+lUDlSJ3W5=?aU)l3DmV`Fu4zrjJ<(b-b4MrecQ<5ZaZ&rp4 z0dt5 at 1sDjN5vkU_EmPAL?mlcojlcW%(sO$aiB~drcKcJiUkKMbCTQ& zh5*!lt=~|%z$NlVWJ6byv9P0AhMu7EU=aK=BKl8w`?ObQeC2+Z4;t>^@>Jb2!HidH(QLkq2o_d(6z?x zKOT#Yts2M^&xH>>pH43MkdE4LVhFbf1 zUEv<*^k1n*sLx$nd~`FuZ47SlDPB^DWpQXeP~PbTImYfIvpQM7hcDUVA84)^`hpBOaf6Ed!H*uXA`K^-OA@Oo%;C#dilvYj>xjmeSvuTnrJ0m6DuhY*tMN0V~t7`H63DqbKM6A0!DF@ zIrvS&DP{oU6b3JfYS7PCZI;CX>Tkj?HWicT%oOV_$3UbX+z*9`%-F}W=YkwzAS=ZEdiBC-$de`nR7QqN1m;@K?SAwK=cOBPt-F*&f9y zB)#n$w3YlLJ_(_;pWu6AYe7+L!rjn35B{Bj_yy#bblVuBEe(yBnC?8C{o{En=j-+T zoD=zSrdg(fp{lKM%7QyCW!CI at K0FPoIvC+4wGj1mee0eiX-)AqzmZS;(h$qSa9)!| z`-%6ifk{=4EtICiOoe4t)te1~; z)~EB%aY`GarL}2vAO9gNS1dCvx7^sq#`k`|u4X9&tk at 0A_@dtSrU^>L7zfu}Vv5}a zsrJ!{MIReqz{%mf--(p%G!sYpmNwfLFe~mh zU7lN4NEXIBB>x5V5tb5A5i8i4M>sFtEs$TTrDc$7_;c`Vr&AEu zW!m!lZ<6(1&ZIcae}U!;^xs)NsMtHXn40_-=tQfm%lH2yPviv_?13|SNXg1FfpPHD zBoD?}L at h(@`j%&wv|lFFi}g%G3iQUZ$m^8(huq9uOl6&BvChw5=T0*MafSH8yRlPQ z)Jhm^9Ypj>-CiX>VxdnkpBld>VV}!5%4K at cq?vi$=E5B2_(izRT zkXdB~UlE(bC!xh*uccQ(|AOkAK8fzmh%Z4?LU-x{jTVSNm?S3kwgcUF1D-o`*nDv- zLky*AhR(e+-QG!>)~6%ufmhC8gac=4r>HH+WBJDFx0ic>PrO`cibYba$wbZU<|YX#XJA^kD*?8~1g!f4hAB-fT2- zYDz=LnJXztD%nA+;rJy)sw(RU{G20*7|i;($^w7d2GLUwwnjx*Wu>Tfi#>zo`@F%` zH6uXUOg&QjrBxIG`LUh=4FWA`l+|y6 zz^2)&axXIn1Z4*39ddMluJ=IfGmX+PV2^Ods_FAWvnTrLu^#N>VAscyLtVK7`~v=; zK at h8e0R!__o1_5t at 6_(3Y;9d#42^6||L00m*wxa;#MJ3;>jD)$`*|ibKK%wjNK7*D zCRP+Y){Gkpa!rwH6i5MGP-wDbCsAAZq9>VrGFP4y(H9CYe83>$js&sY+*P5CNS;{4 z_494p^3(Ls?O#Bxp=zkhbWC(wR7R`)t{Y5sMtc|{KalGV0x0)H#n05M-Xv_64$s6V8sf`R1vId?E+cd)0*O49vzFvL z|fFSS>GY&IKnf${2{|=y(v1fu{@&K!coZfG^CO~S?E-B z+Of(H=M0H=YOx)$#hPPddm{u*E^9t+i|Q_2R$x{zwUcF33HRt{AIzZsIP(z}pQtxb zoQSNOZqcqxPQFz$#JoLfb7p^m^#sb6yZCJZKAu*DncNi#p2j8O6j2GS`9O+`?l~2I zR3M1sdA8lBe{E!h8Nz6S$s}^l^bR_;M>^)ImlJv4DtR}TR+`W=@MA(n4)762qBZdX zvwzQT#Qf~b9c+dt#42u)>O2gq`eUJb$BF^dk@$GHY$P)+ks22fLE72X`BF znr4-~tHk2hyX`ojQDSPM*D*$}Q7wBsUTv$Y+hPPA1ZX~wtEE#?AC9r7ov@~ zaeW3KaM*GgthP at Lrn^ZHOR4MBp%Biph$p}{K8rqOmc49K4*$$5Bs&%(Ct$ zhk0biBfdOJ_rn$4YqfOk>Ir&}@3er|sn*U at YOB>?(k*+*QR{#yrd8$5lAvbaS2Ueq z at bKa z;Xe{&H_*l}QA%?dXY-OhNL%syX}x5{(Bdj-B{!_}Ws!0VHmK|pWirH7uSniMNFLLW zfGM6peSc=s?d4y}r12>|ORSn}(+QP$Ezq(x at V7?{De4b+CiLYJ$Dr@!{k_OK3H=mQ z`fCKWMF#@<@&7Ns{tM-rS`KI<*k9V-QEWWIL}VmL5VByE>L}L1_<|h?L10e72v7-P zf-hKA5S9k+;_2Ds>U)td-Pr>YS1*zdK10=DK^HW*J*~RsD~B4T9|k=?l8;rlgukxR z at h`2+!!;lBu5zxvU%nc=A6ve=-}(LVJ#>aCWMyVdRSnxAa2=(^anhmS(vT~M=?J^0 z1*)KM;-Y)SV-QP8ErtpyOlPuBR<(7HrSgyE8ZbDN_=D5RG at d7 z at F2?ND=s+Hls8bqbYh1YI#$LbFyD@)w6v7Xnk%*WF^YS9h9!xG_11DeOWxX1+e|j7 z#6??X^_EvHFyBlymqV4u+!F3m#y~0to?>_ym2XhnU0d$Bk)M^dLi at L^Hk>s;{&(r3 z$JEmNZHO<4-nDn!g#&p=Vtf8NA6$UNIhRQ7bQTGht4Mo(^Z`p^278HoiDl`pKeFYg zj*D}zEgjg6<_~m13+EpGLfA}jlV>s&tCixAoVvrm17s=8otZuFwRNeX?PTNY+g3aK zucW~+Ug()J8?Y$~Vie|nGvf7HqUC%42bu9n&9qQIR|W>!It?SSkWV at C_b0W z!?o!0SA#a2IVz#Q7f9P1T2R%BOS+8F(FtchPDQdS*G1kF^I0=itL1BO!jotp4`fcf z*R7_~p5_o7TdL-KTKW2Hj5MK+Yp_=MnkadvBcabt%VlZ;Q1aV<3L9510M4S^fiDLxBVldOMVJ#fhcP(H53csG^i{&eekF-3hlDoPf?vcAD zUKcage7MYK(m4#WmKwNcuh`+{)jbF6zgjxm1(B{7ZIX4!KG+%BL7z1}|BNGN$9Y6C z4HjyUg=6YyKa?bcpLn!LqqY3%PPYHiQ7tP0JZ9olThX{P;``+F at fOHybyS(ORC7<+ zmw_U-{v$GwN}HT_G_I_-5Z1n}U5p2&ddLh~f!YH{ApS-LoadGmTwsJ1Cg*U#*+ajN z at kR!^NBPG3L%h%a_38S?8=8^I1DTO}B~l-paUT)ot89l(KmLaDEP$UcXbZWRKHG3R zIgQOqyO~1_T*pX9<+Tu^2k(&ISFI1jMy-~xhQ45olNEqI^h&bp3U0q62ktkl1II%f z26=e6$7^8G0V1SYUA&NJr5;IG-;q)O at w|Kl|{Wv~4`P~D} zYNN9 at aF4}DS;Foe*F%b1(0%s%)Mvw2b}oTfoxtLhr%>CSkU^DyR{a}N&i9m|>%n~C zBFrt6{ucw%MBc7XnaYAQ&LNJRyeXiJ0Q< zYQW{Y_RCavac$-5&if(jtg*#BKeU$p)BIaP~Av)PRs*MT+_Y?cf}S1A5YvK#E=%s!2qr-u)lK2!P?A` z+I*>|n(rh=_%tN0T4xPciS{~W6|cx-mS@|DV*?Kww<)N%7oAkrk32HK$Jm^3B#x>JgJ=LdCv*mp^9nC&p2U|R-3=l7|Y7p*helC zcmHVjDN<8luFsQUC!-;?`@jaX))4reTfevxfFd;PhS4WqLeyt9J8;(Na4pJiM at b1* zn|*Utx>hdCN_-S>jJ^7EhSswc|4l0P%fGg5yJ at wK?NDtNjg2{1FzaZt$ez?JtO25; zyoaKn-Gw74ap(Int1p)L`)|j^av7 at 2EPu799e>S1qW{f0EpBOQ^N;D+#nj1J(*A#y z>|&LF`6x6#^hY#O<$07VAC}n2iWtq6#2d`YMc_2=24J!@Cc6G{Xs0!Wf8LG2-av`)h#MIINs%twRYC^mWiVJBOXgL-*ECLB z-Sl#A-EZPyMErDXS>GBr&Nj4?fLVMFVJ0zh;H?sCtn$E%OfzhlhlR950tBEilm{s$ zDoQ^@okvPKkt?*u=T}FYS~8*eVq4fHNHRUtBow}4#&Kei0SKwgE_m{yatGcX1Q$Ikdg+;}cf^Uv|ihcZnZ$O@|E1{6<&`Kq6O#1p?Sq_ba>N9VB& z)BM8!-HksVIX+XNHzDW)JDJ06s&O|!b{39rIX!?xN#Pl_$`)>G_i zF*k}V_ly|zqUHa77Ie$@8ft=?0(Bs+ORnlLT2eE- E`n4GuBg^e)qC#*XN#teIj zah4rEdx|%Q%Oe6Fl3aFP*4UE-FR5zltp|C|yLnJ=$aSZikDCHdI0^i*DjuJ=gHoIPYz;YnnWf2CGdjspprZNw`XQd at u@UN zoUKs=-v}7SJd3+S>H(VAM&b1 at S$bWWa??Lrg}-4{$D37Np#L)_KLx8rO+bNwVxWM4 zME;wY{0~aM$Uk3O+S~n)8#~47|MYX?=qjS`Q)duU1V(Qx5~QY~IV2&WYW9~t4YJQ4 zM3F@;k;8taeuMOxfy at F%BgD(~x%r2k+q{#dp~+hMRZbS)yRW%IH{azy$o(K;r27&` zh%Yxx{zwFl)>(+*6tV^hh$vk%VATr73ms!XVkaU>)H6!Z*$&|FMpw98Xll=KnNV*#|&7L$#X=vib- z>dp95SSPcphyP4uLddy!*bwJ3YK>)7Go-l4kj8YYScqO{&%jM)7)eUt2>*7!34jao zUeYaf0$0h%XGp%Ywj!Q%^az=(EHF zG9z9`wF=%@PZ)(7I=hu&7p5Pjy^d;^MVqXVl+H*>7z`A}WKfKbwQ)&Gq+e!`yi+*K z at I*KS?N+-VW)9CU&Q3?9zyzyXQ%Kbn?;)O&FBMKXU8Q{$I70Qy$3b9 zL_I;Jip)NTpM|B9nZ+enPSX42_s=;Ra|Z?m66K0v?P)DcI|51 zmMzI;1aYH_s?MAxs0NE6XJolu+*}GnNxVj-m7^k$^6)kx6Ct08|7`EPNi$&D&72eq zLNRQR>FjYJZwm`dwkUX9`M2;VG=NslOf0`0^0oS*ei877-mv&I+V(XI2)g(Mu0I~4 zWq)Jo`N8Y?CC3EIy*jr~v%!AwHn}*Z%bUD_|CEj)=%21d z!7kM&cm+yzb98&Wr#}_Ur1%w}ZZ^u?|L>KEDW;2u&>;?7%_6w4K2M(ZQj`w*+co)>~aW&~C_a|c2lH2)u%Xxa-dCGUH z>vMl~x(7sa0F%Z{X=(?E!9=l73_Z2BdXG<4WkoT55IuSDI&wD%ty*4as08awxV|_6 zpITpLms_NLzJa&Fc*C4a%l=2U(YoUr2IHLhNS$Rp-PT=1lYHqhb_d4x-J%R!x^06k zuKx5PoO$6&3T|exc!Mf2VT0aP24L~PZrSA`dkq4#V~k19^`hE*MSs55ix>ENB#th# z`BV){{+Kjh&z5DdVhTUdE6;B2L%XJ7d=oHZm{!3<-*13~qW#|A`dqw9emUNJ%wL9p zhbjtDWwyRir7hkvF10I+hSzr7sRUkM*hjdr4eH=25EClx!=PLYBBE5+c0(R)}!yzV$%-BFU7IG=R`ew6_e5Uk^E2@@3} zm4H(n`lp-()```L=I~p1*PFaQV-pu}4o#E!VGYpy^~m8^X8mjYut0ps=0~%68i%79 zv4DdGwp)jX?=!&=J at h9SVUiIs9f6n>x3UJ4+eFT8vSLy@!;LBR at ywZ@$`-G{RV6k_ zg=po=_mb?Uo0nbWPiFA-24h)X@(cFP2wWWfeq9(&cAv0IG#nha8QEP at cv>!b{MK0h z(JE#^uvg6isjNB0!BaFlW;{5dnq3b5*_(1K{()n-VqejccMfGf^5`;3SY)GwXgtae z;Dh3BmUN0)EhpDZRNO~Q4pjs3c2tNsecbq~s=7?}sH=is^Q4e6e2Yh06s0AZ+t%^3 z)zb6bJ|TZxYJxs-&pjk at L)ke}PKL6JpJnpn%Ve)tgxWGF_vnda&QlM);&bfcE|7c) zOKS8o&@ri5Z$OA4e1kNS7o!V?{qP$?Q)i_1LUezS6??zqU^3<2I_B!plmu>Gm>~far^uLGaG7Sk94$q7{46O9j9hKE9I!RKGDJ_#u#| zW67}WQexl79_VGIIz!t_Y7d7EqX+(;`w8#GLV7CQ^LJBM at vF1if7s8tga12D|9?#- z|5*|=J4r_YM+j}?8}tuIHMqL9R}<$Nh<3Ab6J`{nI4a2uBt4>BqM2 at Ks~MwNI{PEf zW4 at df&il+m8{zNMbnq(4c`(T|=Od~!1gJl)%l!BW4^y~*$-H0LTi?5JL=Ni*_EZBq#`ypTfloA`99nQhQV zfIn!rlrxFzuCAd0HUm$hv at Y&qwT0EJSn%6>@|lp$YtPZp$%LR->cdb4wUV9_2u`tx z(<}Q(v=L>O_jWQqNpQDDr}W^bVwvei<*AJWT`{j-&;Eig++DWrybJ^Wy7Fi;Jht`p z-y at H>(~r*=h)Rv-$vVY4)-H?~* zPyU?#F;JEupvB2KZw=SswlkI=fCZfPz*{SK<63=D?Ma?_g#XAWa at 6is#HQDRufh6V z*kL5OdVF0hJ&84GOK(LfSH{fS2B!kLNUVWROxgl>PZ}K2@$fbO;Du9G7GOv{)>r2YkXNj=$ttCHdlTj9|q*VEvxPa9%SScatI%+p77 zZAaW9EB`f~)I;JH0X9%7Gx3a>mQHMTlqD4;B1B_WG0o;R0S(BN%n>$z at d>xpGr$$G zDV**ugb^*4erWP;B^-sMijy^fL8RuKS>-xa)6FkaKJiV^6eLgo`r9$6XQyq}$6wH` zg#34Y#Q!_!{x4^Se`wj-t*)qZ2%4xU`G}cjGC@%FAEAX(4CIR&i0`G^EqF>TCp6FR z*x!Nv!;T2pHHv%@HM_Iv^{RF|`!Fm({O?5~cpU2dE*HSY^9Hf70xxmX#i6J2H3NILls zjKvJ^2pK1&#Aoe`&A4wW3|`sXvx$~{s3TMagUtROV8vVndrEj3j?rfHFBY-~*hE07 z`)Q&XFobwPS3!bp;x}o#HnHkn#U+m85Hr0<$OA(mQ6J@>*ZILPUvx7(jt_xP8DROm zv&rbL)1!-P)WvR+OAV)Y*6vQb`ZQC|Q5z?COv$uRv~=aYR|6B_T>E}me~(0 zQy_fZFucJ0WjbOU`OchR+c~~pnkJ-9l0sI1@`gLk3nrV$2 zef|#gc7ljMssKofOw_;yWu=1?yGw_JP^=6 z>%ZIH|CfmRXDChTKzpbzqVv16u-cp534;U+VlWd4vxs1EaH13v=K+GjpdpGgMeZn~ zWX*=PK>B_Uty$^lwAe}Ov`besq9-E>g1cMWT60?Kbd*&sF|1i}>d^8Xck{TXboP3q z?nAyhZTq^vPXGAkd+v0$e+X|u*gyn|Tv0~+0Qn^~)S&ti5%E*y7MJE%MXxh~;*KY{ z{*6EGFNx@$=Ux_%t>_v?<=X at hzZ*en-s^x=%ii%D3GgpfIF;S$hdWFf{aZowPHi~9 zkRGMm43HYyn`fgkfS=;CK=}(M`gh45eBfs+$oFHfjYp#Xmqh>eT`w{Omp?ONLth0< z1EvU{v*NBOuktsiqrJnm&D==VCOcOMj}joGs=CItvj>eOu9wmLtj4TI998F*Hp7Gv zPofsMV at 9?X<$$cy98NS at LV#q#djaU6 z07SC|Qd at NeXVp2-GqSgJBVuZ0BPrS}w+bk3(+f9FAJNQ0w=5+aUf9EX2Zw$jQZyfg z?c`GM7`ow%9w&~iOQc$2iHoRrd at ImgD1JZQ`jOZID-51DL|rL~`;;ObUky}KaXsYt zFW96LaSZ7R43$AyFwf at 6$Z!-o2s#}e{!I5yTMh*{Mwu{7Iu!6b7JfH`uEGmhxFDHu zAv(bD(9Vm8&u;6!qfsk=NbB(4SWCe9EpxTa0xC8{sn)yV1Tr>~Q82}saZ*ZraZLj! z4(=JuUCsQ8WP(kF%>F8Gn$+opImw&JvVRu$NR$(tJhj6jMw-9oc zna5O#B3Y7+8Pm4Q)Q0+Y5Vew%3eSljmg+o7Favf zy)MLYG$CzvRLWqJCf7_wF{0pkEP>ei&4h>`c$vN(*g)P`UfU?;yrgbG9VD7XLm_7+ zIFl9n;w%aJqqP)-d0Y|5ZIYr1QljUi6Q0eS2$P{|jhtAmoOL7|0EHND9wl5f5f~+r z2?07_0_fX`9-HVotav8L^T_EMUJ^`TG%vR#QQO9u1j2pAt0Bif(JHo19=BE9%!naI z*MvPHZs|>4NBQat)WTU%qb*Qn>6xZ zBZ|E#0Y5xP0ejI7nMWyaHdb^VJ&AA%L}l{sxtYuF#RwX)`!dT#%wEf at rxR?DWv|T; zN(PA?^*Z^$`LYKbuxJ{)-ql?TRqCRiXb{O%O-ia$Hr?$*`yCG~`# z4`L=;ZDuf;v3aWypco^8&`482gC9(X60=lTHV-YZVB9PUX%62xJB=yX>stFk+`e6o z_1LB-I3J~Qe-V4yrjt-L8-Ue)TE+nH?ELW9P0}8tvI2+BQ7cXJyR59F01$y%mNsf2 z1w4X=UJb~^dZCk5+oioxLuW9i{Oy2{RnbplF>-AKScN4CSEU=SDd;eIa232)x4T?4 zdQ)?&g5hk?!WxWTQZ;SZML at SJEx<)6zaZm~Fr=)oVHh*H*TlcGuq54CzF(oO?C-iM zf^m;uFkC6@=f_eq6u?u=2UTaaXzaJy+T>%II8)OEJ+8Q6;w at vUfze4@->+wo`Vdq1H_g&(4#N+ zjbJAoUdKF;9JcY=>C*N`f7#Xb!}MzUE!DO%6`EykF=-)V_qbA+xdx+*()~CpaDOTq zHYNzK%<8#|WArv>47xA6=KZQRy=U_|Y3-P!9gIkg;i07%n|rk1?$Rc>({;w?A(uBk z;&1cAb1IJ2)PxUjK&62HajLqMZZ&qI&TFxoU#7AivAasJ8 at q8Im((<~5t2w&HX=+C zm*>axCu{NaQ{!5c}fSFJ;;XZi~RIVrGU_=X3eK33x|K!{{diZ5KTm!pON+%zN z=cTy87o*h>dnFGCrw^J_5d;iwY5;B$!uBPm4QZ*Spi!vVeV6Cg*WtUi&-K*VPe?Tf z;D?=eudiRk3x!GWHw=|MxH?v~pela at h|b(J#`fO(Lz7vb1B{fmA8K}SSQ9k0 at v;%`j4MyZZm<1z0NH; zSnB&mB^{y6m0|Q}L at zV+X(KNavFa!82RU_8j6gbeRxg at Wt7%#^;TH4UmM5quKS_^3 zt=zMB#91#@#wKQzE3>LumB37varm?I)QHs{?W~zGv4tZiVPy=DaR;r5k#@i1KZA3J^Xkh>&opxAZxU6^i|27EwS);+(72>uCGaJ6nleZy<*t!VL(3K z&h0r_I<_^o>T2sU&@-fBq{>8&hYYF87)}mZ2WdJxW3be-QPWbHS}Ln6j?EQS<|P$N zX$euwB-RH~$(WnLE;aYZ-2`dJ#BBXSN{W06pcMca9ICYCI%o0dNo$J!0!8pq_ap>* zre|99#@fK|HoVz at LD7<$or at 3qZukb@SSsocLeny$B at j|iMyY8v- z<|M&M??wrmKn*#}#j-sr))1GVAULX)$(;_HPpdgPMX1T{CAgNJ)v5!pcvNY5pGq$X zxAs!J6}B1I*ME)Ol-1la_S_E%JYM)+b_Z|<>6Ujz#MGLyiH{bq$Q*A z`_6c+C&+%+c(n(#MNT_&+Hn1N7nXv()eJ=4fO2^!QaA`UcGsLUX4ky2uU=qa)yXob zSYuyC^PPods;IGWwPOHezwHa&Wt+4s;?#G`JI at 4*;(98vem+XW at Y8xurFw`mWK3Il z5QzPdN%qpl1C4 at nVjJ<0pBTZ+IaWD}5YrJ-)6L~HvynPU+qQx&du(;-um z-bLLygu!c@;o_aUJ9(z$6+%Oa(LR(XxIoY7$ENVCWeY)@N*mH|({j1a^mSdNIyzI3|N1`fgYQB$- zkQ)1tlzdJ?y^jERox}hiEECb43wDYbW{P8n~<*oW>_K-;3QbdSi(R z3xMhtOLA|>_JZuvCXpY($Iy}hlelBIQ7vj1T~rHkHJYzT*rXA|lINhgmeDd`c9i*E zG>YGhC?18ZFdQL^ho7~w0;%x4(9YEoq90PZDCdHy7FFE z1&RQ at LRC#%_cOY-f!imxPxV?T%@_HIgwl2ewqZub7u(Rw#}gj!;;|B6j~;MOeVUiTx%|(TH_#{^Yc55Kp;aArdAl3TA>?vDb~8%f{S9aOXS=#lO!JBDyD3H?PkeA-JLEL)zF7eb=!`)?OJte>4hVL^a^O#kl})&DQz_WzEv`!5D% zD>FMaJh)eJaT17BoYk##K^amoPDa0oFquA$ZI)WQX;;hzdl(_`E#{3X7z$yp1o5!E zG>#;4SxP6Xx7pEzse8}&%N=~L??yx2mH#dvh>inqW3VKe9=8SiE*^?p!xmYbWrp!A z7JEenu&SL$I?!b4j2>wTCjhV!v$FgRmo8j4X|NbrZIEUyNuM+HOCp$lODTAQ6C~E+ zNBsORDD5Lf at q=5fbr4q1gb;7du8MFX`5zw*ZR#q?;(6 z=g$=~7db(Yu^v^zh0^>8RbcM!ggP5g&XCB=_?}Pc)1$@ zV9!vx at X0s0^L at r)n+RX7A+yguGx*h%`3Mavr at X2?FPdcs@~UX1*cK+le?8NeCbyx&J=c{vB^uM*&p{=?fu=p%NU1$_W#_DQVn`vo0Bm-O6 at 0Z3)Mh>4&Yt zSigS8W&=*n2d9Y&JqwBg?vhQGT4l|s&&3N)g0=b=s5zuZdamEt8 zo*fgfrY=Kvfw1&{d at lST6h-J=sicSW2D7aoK{>Ex+;F8GH$BrRQP#+W?4xoHG8yD}+-lv-PnJvm%_z z+>6>;$sk2&h&4C}W>Mv0J;JFOLe*I0gu=$RFsL^vc{0DCF0CJe+rV#$6#__}pVXO(#J&1( zQha2=vEd(sy)77#7J2VDqOt53h7ai+(S+r at k0@QMntH>^L^V5fQs3UlLo|+xe<$x+ zLb4RqLjIL!asHjB at c${-{tN9|S}wSY*k8l-Y)=*_lrf2GWbjCEf9?v%z;HUzN5J>I zWa=u|xR8eL7ScsC9E+83RN80ek{M>QuZm$eVZkr3yu9X085Ay!y*;S-d{0!o-!|qC zzprJh$yYUOB96QO#F1NM-pc(#ZvK+}eQpBI zTFhJ%pEdu_Lfn(1X5X7Ggx8(Q=mSOPR)%%FnVPx%dI5-kr z;5s7X!TW0}LmQphxlKn6jdR?)rj<5pV>}-O3>RWTkvT1CO)6}Yo(z2TT0Hxu!%l4l(@d<*0$LMq@>AMpZ~+i(7qqD at oi1`m zdOCx6S@?u$a)@xKZYJd?)*ejEj(zPW#q}v2X&E^^fe;ezW`(u~X;UM=UxQn9Bq8wJ-UDv6>rOD)Df7ZBo} zX#&`FYqSY3C>GmAHtCAx$;n)61;qOZM$OoHAJ%RO?k{- at ZAVDqZ+WFAw{n&!|gLOgRoyD)VBRcW?0*VwU4MmeP{)cKw}sx3ejo|3+#2&%?Nd_x zipV{EX$v>M%?dZ{TpeV*>5RdY?F>W5uW3Vv~IP9^%N=n zJ|a_YJmzfAYd|sDqFE_d@#NWWgO&H-NKe0aJK9S+RzQCp_KhsqYFEW<6{*>VWZ%%% zdE8RaxD;C_JhrcC4p!Dhy(}F-WXiCTRM%*{gV{O=PW5URCX+6gW_Yhku6RiI*`kqM zP4&I4lC$Dy-z%0Q54ETS=f->f%|^PVcP>l%+Sw#K6{{5jT`K6$NtxvPD?4cP1*jP& z at nU7uR9!X#)Lvp01e?D5(QHNQ at Sssup1}g}J1dnP-^23EL7l=F6DB(pQDw-)nw#?6 z`6ro9JExKfSD;8M^hX0O&a)1VeSV9Us0GA at bhWTdcNBoNBCIoP_}GFzP{(pZN at 0i7 zV$gmzaGO}j-mEu>;bEqs#ilqm2d4#z4GKCINr1GG{HLJtGrFkvi9389lssi_vhoX~ zLNDP=ga8aQCm3%&SPp)l5^*7X%WS2Pq+aP+qUs3Q;-#o7&XF**zxutx310<&o?v|5NL9KQ5Xd_}A*B;nx`?w9IMaFuaI ztOiu~S>90l&lB?zrcp811w?_ji)S5MGegzed7gv6t}c+Tx+C~hM)l(fx=1*y3!>R5 zM!w4jZ-qQRf~3!Klfb at F&M2h>DT|3p#e!iNsI#WRnaSjE`q4 at TiVQ_S-c&$rB{K$9 z?GsO(2`9}&N9&2TU?7Z}RaUR~240=f-?@_2Zy|o~M1Xy9hI|W=XAr{Hvgn)fSiGLHGkTREq=r8iKoc11iz+|9a?lr$wt+9%9qzUV7cbV*4ccR?0C zKypf!>d0a(Bt9JUX4(jRy6N`0;wsCmYs|GzL at b#CSU{zgs*#0r5i<{<_|hpdbo;)d zvER>8RxH46*!;=4+5D`T~mpugz z;x))O>&O75!N=cxA__P}La0%IfO2_&fY|=qoxr~qZracux{I#-5_1!o*wMFvrg0j? z>qN0+&7zm#;bQAz{7J5yiXQpEZ5PU!Ha24WR_4;5zsR;92C^i at WZ%f z%)|l07<0i4tI~5EmX?_eQaWqFfUo23(h6)(GBYxspS$dC(FV&IYQsG&)Z-pzQdmy z6UDlNL&duNIm%D<#F)8#U&`%ipib26Tv&POycE5dx0+F+bELfTN5kV5AYgYxz}f?- zAw?6hxrql(;Z$u4J5I#ebgU}DF28k4MzcnCPJuH-uE!d%N%Bd0QyoqH&F?CKrjN!C zokIH5Af};bK)jYmh&S4_8Q7i5;ekThgw>DtJt3ws+hBb<6$$h$Z`6Rb$0CDItOOX3 z-heo7P_Ws at PH>our5I!movL(Gusb()%qWaKxpB at pRAl=cc;vr^@YdxD6HXDfF at u2xHg-FW5V1@^4`q zI0z#2^QbF at xfe~QO{gU=^fl$#N^V4`0kTd)11n4B8&-19HXKTLe?!YU?5zXA={Eg5w(R9??p)rwXv`fNWW>S70kB%hp at h~+% z+inONxh8kmlK>Q(_q at k^4u at _utFu~le+$0ij9yaf`{P$D&;q|YlTX3uOy;g2>iJvA z;hx+Vvj4bj@$~4Q(4srpo#K&j7Yv`!^r%GAV at IpOMz?P8P~(e59nE}g=ehSG_edg- z9QL~Ndo8qbplgpX*ZW+6B~RdwZLcSZUum at nEzacq1yqXFa(3%(22PKQ4c&Z}1$W@` zDR;>7sDqgP9U~M$AG`x&EpWCw`q5%?8G=gFPQ;58 zBIbZN8^Of(6D;ZzR5`=828=X`}rL}E3=excG*Zp0AfI8KDLb`!$#lnfW)#4;=#dG=|X)J<>=*R|SfP*F!!pz52Fscrs@ zHf9799UjEe=Sq}B+L(Ib#Dx>h(A%z-Xwr*G7o0jUtnDR@@;G(rwN+(L-#kFD3;vJ* zn;7v}=A-Z0Tk^Ruzxi}$lyv}tBi$}fC#5+7&@mvJ7N^^U)Rl~TP92wlI at E1qo06vN z54fTBqgrq*2x~i548(4^^1&-cY9_&-VfT0SAD}xEhdn_gEmQun**CO&=&`x0RCv}z zDt0 at Qn3Y&($6xgmRV(>S;yHg})|BB??q?f(D2zL|_<6XvQ78BQ)rK1H66w;vyOHncegU$T~qee__Q$W2MIZ z5$H+G at isdqDgw6=;y_{t9lTTN^Ab(LooXYG8cY^V@!{1qR2P%&w3i;C)7G-sb4075 zJ4Fp&E~o88pc9dI|BhYk^357C#c4Kii-T6|dRYiyZq&jnw!8NnUYFNs&i`RJiv?hb72Pw>J_qkZYLuE-`{I%T4(fvYg|3H zqm3riDf$@A5rSNPhXC?<)Vl-(8DYMl6YkfI4X04ZP=R_ZyB!1l0!ksnd`f^*5C@}9 zc8<{A*DA3ysy3JGY-7?ivknuob;h15cbf8c`Vz&VIBbVg7|NZs!)spOE%DDEy88Dh zvN%={t4GcPvQkYMTY4e=_UH|zTGUPW#Zr*0q!Ob0yl)K~KT?Xo7R&Rc##KaO-`!%g zpCH|duCdVha0{0)qCXePP1_$%$f0bB{2xp+rBw?P>ddhOWe1nJrN_isO;l1n3zBu} z$l?^kMb_!e_x`kAK)$M`4z}E0LT;lR{C=emyhfZCibU>CxsIRn2IH*d6BG+{3eHBF z2XK!o>+}Yjre`h7nrf=-nBtse{H#A8ZQk_r^J3Q!m749bB)3{J8I&CAB`vLKx`gqh zSZeznXuLa{u6clGP45}!(|<{Tm(s-1!l=V0osX{=fIlaHm}b*TOf=5Cwc at rg!cbZf z at 8hu4=Flug+hF58ejz#7QE;`(ywU``SVL$$5D$ZAa&jKO`a|>Q0ZCy zzjggi->jnEhNjFfMqiYI?_bh5J(Ey0c01+Lr}vf*zL}+5=Eq55sjvgbgmUOm1UHYO zpWl!O+>M{P+GXX zHa0>?M5lc|PZORCN8*}as3nw2v%^_sgV~b>{kf|j)RoncGzF&8`3MrDnpt)kMcN7b zYspnT_9m at G&O=cIba))ixxZDZ<><@lI6zx zqN=1)6sW35ikp-LktA6nZ$&ey!_CnMV!u?sw*t1!wH~j}0nFa1HoYgJkMERg(VkS< zuDg0IB9tnzdeJa$t!OdDhMHeA?!n>FCTziqfMTV@| z^3Kqd>)VcgxCeEp+v^o(hZua|mg-6|eU#g|m8R at TZgWcN2cZf%kiJ11m(-Wi%9vP| zvzFpVyd{cwYDYx-OMPKmz|va$qGGVOqGl*7bH36Tmhoc at z(%UY2dACzE5>#!A``^p z9Ac9f^<<(}Ebzt-tCtu*K{a^*DJkNzo&o at 5wH%B4PC4uKxb75|<6QX-cKEdLZ<9TB z#5$|Vw(jB`Vpzr<0P)Pk0p~8Q3lJ&o07zBM4b4mF1)Hg*e;Y2F at pDtyNu_gi*zPyJ ze;pPpvmIyIu z3{9DO;2+P#*bXl`;|JrItKHkWg;LX33e;Z!FrKkuJL5)jW5MHWM#rf|UGJc$ zvDk$HYYXnx0^a=_WE-^C^(S3nAZ&kOfwYi%4N2uP@{%R=Ia|;pZodbDK^I(JB%wRNc%_RLYvSy~!Ni0Zluid&`J9p^*JHB-Lq?SxAJC%!G&W$DB9TUK>TQum z at tN-F!*K7SI5PU&Qdk^rOX8JUo6-#hpuo4;RWz;e0yM$qeJVidF)GNhT1ZV1+}ntXs4n~DSP)GlQC z5oP&)5o=BgP}QdRvNK?BLlDZ1ZF9!p4ZS8$tTl;n-{tQPqP`Lgj}O*qC$xKQHeXpj zt!&e;yqtayqFe_L=%V?MfVNCNnH*4`DJKH&WFNVqaV7dUW{*@vP~X)=i8uU%DY0;$ zM8d$!dUibGfw{-lB@=*7PmQy;?zxBH(2mlT1vl;&zvYXN&hi)ZGQ+IF$!ghNnYxCH zM5)J_L^@&l(EObNvxVGTsY z;M`v1Jk3Ll<=Y>Z)1ei^<-w8 at IXebARbgp8)nziLg{D_z at dFK$6ODHGveG-+DXR*1 zl>j6bjGA~k8|Xoezi z2ItscVBKusijOE8psdm?=G;unX~0FA%{(41Tcs!FeEMQ$b5SpRa0{1PKrJ)3ycyRu zM^_ctBePy%xp-8m;;B;qw)^Z0y~BGlrSCeWpNb?8vn|2$LQHqi0btq|TE6LO2TvE+ zUtIbHX{ALNY}5ptP%2+SiGH&wTmrr#dX&H z4;scLs2>y81?%D_lK)8qt(Ob&pFs%pcRF=^VV;r>B#%=sS z+!c#q!AD at h$FYE4j at 6XHU|>UoIaWt}CAw at ZtkxvF{3EOyw@~qix^p$i??@0&=7Hxi z?%r`^;q`hjt9nF6cb6{2+LYUCnul<_T`lcG at X**b`A4es-<%QnLS8%(nhrcdw*31j zxi$04^^8cZ9(pS0Qx9u9Xd^j-gXa&yM*MRQ$PoNDgz%*UJ?_iWpZGF=gzj6i^B~ky z{-Ra$2&l>M3Pi}xF8&1EO8wHf9Ey+($8sO%QOd~;=~dd^!I%~iO}qUyHF{tTVw=X) zt8LoJFNNzh6!Bs5#k>!bE`LRH9}yHC=)?E%H8bH|Qd-x?usNIPupJR&Ce;BsU$|)F zP_&re`C8POl$40WK}XGX;vb3qR#}FSJ;2)5M>E-PM^}2-eL*|rdy1n;7>`-`ild1_ zJz!9H2mra~?vmK<6SdEk+r=0Cz|Z{yev(td^Z}-FE2TWZPypKyy;~ zft&ULIrMVA5JJDhzHz;0I|u$j>7CpoGxE~$z|$jA<9F at +Mc6g=C;$59`IPPpv}?c? z$nY}qVEGlMxfOVFkE(u9Q$YMu2BQyCGVNzCMh zC&&AM8E`qX6Y`*PeM;<(Bygwma#ErfASfw=a8eYHS+M7gmUhV`+?P?B?CT$YFh?~w zcau_H;XZ>v6LMeEdphfj^iWeSqZK6o{c?teONc-pKuaMRxG7Q(CuQiP2vnvtjNv$NU?1t}7Tup{9-e1S=O$RIwMrwDa z&!IL!<#QfY({yVRhQXNDt@$PoXjx|gSJFN4z_ux*n5~bh2aaRM)#%x6UE)l+<76*F zVoo7n*IhL`n$HKXJ+EM&r}fbGo*w>KqA@!61%tf;-(HESxD7_)RbEg`6LFi-_>X2! z$Xl=|p|hzJrQz*7U*%_CMI2lF><<>7PcOVrxX%jhwM24oucDhmd^#1XDxo5snD-F7 zp45mF?wTCJyyx4EnFs)arT`JgjdWu`%GbY?o}8AcWG8-rfGDDafbjm;N>Bf>rQ^S> zLaA-L;;JBL!}&u<%4n^X0<1OhlK9cmMXL}}lM8#y#eK=el@&AoRyqMqQfQ^3-5;)R z#vC73J)$W`_{?+G&AjjRZaEt|G;%#TC_s=L85*8_wkKV$C;KP9v%g_LfU}{!5-;h} zVUxINV#eJh_oP z%dmiCH?ZP0TvbYit*Ts{Dszby14<;0T9jI?f(;>HYy!cktPI;hrZQ$-8~{m{74-Yj zd)}%hH?7~WU0!;Iq_t;@6`Lpem}AJAsVLNf&AF#D3>wg4mLEg at Ay-5&KMgTXTuVnS zBRvwM5J#7fP&2Bc!kW(g=4el|k$sxw1W`)1DYH1slnmuEEhD6=DAl_5 at SJ4KU!N;y zABPip`;kT-oYELmFo{rZE%8mdBQwG>Lk$alyJIwi6EAD$4M1g;!;;z|M at sAaHIlWO zVw4rV<=IC(sD5lNk9)BhV}Da?k~o>+lcGqAaNv>Qe1TBkQ&XcY$hJPB--$;LsiZ at D zUg}?E6OU~tfj{TuL at W6_%Dr+sEylmY;X!ub>Wf6WZmaVDpk8 at oUF&hI8X^|zYCaYx*IRX1Re+Njm zJLY!maqcvaJSA3O+DqP?o$K38$6Bk>=B3TP*4eSF!&Sj`hZMYI;5in4coS%|stqI% zo)F;vi4M_&t%37gl*Yl!v5T>Bb9*#=X at O>*F3l$-+QIf6Jx+8N zJyLiVAAQUV<*$@Haf9 at c0eW@c=dTUQ2I%KnT0{+nMmjl=WtcN=|LOSG#7R~K%CSr{ zyP^>vl3q-gP{Kh}5Krw$M^|ieB+!toMsVD5IZ1`bxiQ-rO+XO=l zsXHtz;V70_Xd=+`{p5yOmu~DwJQ at 9Fm`1Q>Zd$EjNNrTU1B1T4Mtdm+#Sw!H10%9~ zIla$Lj%@}%HVi)e4S23eBWZO0-lm}qt0+ZjWPb^`qWk83G4MRd2 at NZKvwB^f{0U*9 z)g5$Zg0&e=8GRWKWP-cTj?_ at M!?x{}>0q@oAPwzACEQWU11tx%tyO2E zReSYL?FER|>%+kpnrKj&SJH>Xb#I7L_bR|1}I%n`Ux3b6juQsFxJ`u8LZZClE5XIwPJ}4c9-uoPqq#k zRYNtw*YH16S-)A1A9GlaCpR9kw%;x$gd3xgJWpayq;&6Q5g52mV?^$M;(nI7b?XZF zit1rH`c}{Bg&ym9oYFj~Fny?DJg~i;!@l9Yc|d&9eP)?|=@$5w=C(b=;Cc^8NuA~h z-w39fRx20_7eLYWoPkcr0!K1e3Pplc(=Fe>?dD29bDAOGnURV81E}R;qj1W*) zs_I6h=q at l4FbJ30<|kZl at aHN}yV{T^?}Z&p%#R|5Oa2LuSj>QRmbjDJG~@Ze+t##; zaNM%Qw0>c7K2u61N??0-o-i$Aym+MW6i9oWFn)~r0=^_vK%F|JHGV`oZ=7;F2bzqS z;jsDdgpxnZs2uZYOn@%$5qtkxXRBYyd$!HGVl8SbyY=hS0KH98v0(jyQa|`G14QA?z~|n zoHKrKOn?j(7l*9WHVF{ZVa5UiJfzY1{o<`?lUmJKhS$lH)(3|bx;25uEFeZK_|_O| zrm at 1*pb8S^Vfm_q+3MJ1zl8agPW>WF%jbr5gZIlf|xyHsDYor4uL{+=7Nj9;`Cqx zeFJD8`+TtSf+vfhAkB<1C6;M2>Bj92Ib(Bv+E6=MNH)jM5E(x}icI<_eeXya2w(ve zqJgQpN(1EeBC~KA3^lbPt0Orwv0 zn2tPN)!bB0ynGYq?se<|&6+Nf3YUTIFx`wPdfWfhp z47IVUCeD+)R!^N3JM1&T$M80gk}`7hkrcy|)8>hQcWHc%EC2CAE?l-?Y4>A at m1h}m z);J9<5IxDD)?urodpLVTO>O;FBc8m+ at ZNMUfiXz6Oi9uCViO#tDr*~Z1H6u(34~LH z??4G)Xj6pDp5z#x(v&idf_R4Xg5hJjxZ%`PMICm`u027r>;eh)jGDik zpP=DNQm>Cd9b3Evc*fQAz+anA{JtD2L2f8E;(vVMcLG@&Hg)rSled>AMsoC8b%R{kEiq04+u6or%ceHrF`eKpuQsjV{L=nCmniI3a`dTTrql1 z`NtoKIr0%4+nx`^Ru)n|COUd`k|pTF)O6cVn0lIL at Io7Jkf=wrO^{-z4!`UN*#mkDQx&zMv-A?n?Jc>-)~%UL?8z(3kH!(~SBquVuBAqh^-dh{ ze4`t64Q$JKw&W?j2kq874(!x>K!iDX1Lfka0=l>70=YcW%j$xvMjGo|c|$B!0VY;F zoj+bY9gu4#(&>HgPNWK5!K!vMDe!)#ED+$y$SKAaPQ!$Sn&<+X^ zBuVJfnC@%IO|z|2{b?4`4dm>k?Rk8Z`=C#ZFPF*};!F}%Y=tWvieW{$Ur3Ced_)4i zk-FS=BlB?wEWtdA at 6phY4(E-?+*e^6VaIPfHP9I)=P$Zl3;1 at U7U{$!8LVQ$UQ3 zkI}gCVMh(=f!1lFRY!(;jViR~4z2cff5p{7vpT*2-#r8bGwFL57qEv6?U^BJ`nPvX4c zXSSz)CgwIk4^NcuJ#!VEJYl?pt{1dW>#yGY3t8du`#IPJvcuCQ=&b_^vi*5CJEI{Q z07Nf7f>5fKF6}VDHD1}LihEbZND3 zqhkjONZ9ulyCEeda5AXr6xDB0`tF-h|Cx14!w+cJR@^2zc8vuOSMeM9bgO7EKOrWF zzbijs^ccM$pI*5JyDo6A5VTNHuVStppFc at mFdtnySr(x9Qu|9WTRNq1S?g5p!pf#K z!*h7#j{}PF^Rh^?cNd&2Z$~uZucBR8RqhEwff}VJrH9}OSXrYGbyg8P)p%|GzX?`; z0FHw;F0&!tolNEIjW!9qy-J6bkajakwS`y{@a!ChO)vB> zMlje&KQOY~Ug#D5P+fH1l#8KRAmdpINE-#e1`G)WNhNtuVo+^7vLb4~q at cJ2Gz|Z&ToX5X^`#) zziWXtKW_$N{H7o(Xf2GOD%gHi2!o1%S`~qna$>6{67(*GhmHDYn+G2CHiiDPq*~LW z;KYU6cw9xr0Z9vS2?Uxl5(>7;!hgGH!CwyHjA|tI%fxnun<`|~J1P^ZCf3rh+iRm( zGLTxxs5vlN0FC4s=3A5;Yy!spC?xELc%WQ1b?UY*OAV&pW03^u6{$MpO1rZqfrL8>13K${Y%P ziGhoJe3nx(n at 1=w^?-8V0F_2?G;z2rnN8+`)KqBJbMKq#LO{rgSfOop?(_WnjW$dV zfxxYy1wXrQ5MdLIpLj85%LsbQ2u2H0f-VM+kM`{gjLJtg|GUqd-z6QeS}DB;MU=r^ z0Ou0J=0MWnmVm2Bq97*-l-!f3 at Mn=w6aEmU_;G|vOqt4`B4J->UTt8XM5qsu=#LqZ zFF7Ry`JQtO&9(IhT=#0lOA!ZFo%GxZLryP=X!?jm`iPT~!>9S%96z=eX?n%>P!*D< zGkXzl1#hXL1UJ|~Ou?b{?BQke=xyJ>$pmlkivk0~VYuw^2^odK zn22!J2w9~iL~+r7(m9?})7Og_Jw&rb236fvyM2`j1a(7bcUP=O4S2sM8b6r33R=dZ z-%Moo6}FdGXal=7f?LJ)v9`accbs>y!MZXi(ZO`35Ou|xIDj4n74TxE1P0ZV^+ma)523FkL^(R8tb~(}_^<_&p zX at wqqva@I4*jixOS_mwb%Jt+`zevC6=NVS#oO`T`u(mW#Z963^>euD65#5QrfO3R{ zqjk#_PPg+vPg3qL9 at lWa6b+{yXwZWNK*H!4Ux*xB3n!to;og9J ze*2Vr9Ogd{^0lw-z=I!hyr((n`66w46G61~j9dHU!#Dn|>(?~X_ZzEhX!xG%%5>W|c(ToLYPL;5jz)CSTCSeRE{0;_pKjA at _hiD($J9Pg6rP4cE z>47IFKO(bO&MsK at h~)t{r-@E2=_ at 2%Q*$+q=o`CdNNB<2taQSY6x(Y8~ju_YWED$Kb2n!In$S z{gt-W1~qFL8U-^IQ0&Z1&Bxo< z3#^w*S(=k^cQ%OG|78XEgTDNkjNL?;*-Sh~SJW%F>QLO8OPF{QLns6=bNHivQFs09 zu?m+EY-A?8;P2GCA*n9;HDk)Ewqwg7rz8tqA`6K;qC>Y5Cd6sMPl^GkRMN-t4bbZs zR0Q<3_;`N%;zgj~JQRDgg*RBzU;Tn;$+KStINEqhl)TZ0u#0O%hAHm^iI_%FI|QIg zoJv=+wRLEP at QE@Zk_Z$fCu_f)atjAZW@&aOh~@QW?vx6c|9G~{b!!uv`-)V)Zad`L z4Ai}Au;?7_j at kqXucqZ5rOgaU%q-a-OAq{=yxevAd$*k>eR7%6t@?zm(3)1j7KJ*> z5KbAJp=6Crj68rg(!-oa9P3AJ2(ADxEuJ^^x(sj%U{GW}r_xyA|5JE?Y}>CIbRP;Q zA9=&RgxE!}f?x&nG>bdB0`>AQeAZjI1Eenh=u`I}eX{%)$V&dvsW8CQ)WpHW#>nK~ zdj}~_$bvDUcZnGPP$1;%ZM751r+3;LA0#0UpF?IO=T~o~F~X7Jrb|23|6s%N at gp+n zgcn8*5!YsIIX-yEem at yGUjGfE-RlqP33-7hPaJEc=$ZK{L#3Nh-}jczzkATgluKp- znGV-b#WR&ncrr^GYvm}WNZ=OPtI$}!QKpquts>z3C3c1Bn$6^HD!F8=(pDY+qh9GK z`T2cvf1W8fw4ELUG{a7M%{;YQVyv?~w|mA5EN0>puh~IHj7p3Vh^WH|-DhQ;Zb`SjI`JEP2nrv at oMUJdZ~HM~&nE9Q6NhRyIcyr~lOi@!$P3wo7(^5&dt>`cVod zY-251urY}t#2_j}8EPnrv=ybg4fP0SSm0m<(+vm@`d)ERkx2iKgN8{)@|yo_l_4^4KR(68$NjWK^oG&DyeWNBCAqlr85?5$K{b z at JpAmb+72K+#pqKJ at O@vJGoP%_$ZCIo2{)%ijG6!`R2&R&U{ zRPIXCWI}YMf&O$iRQ_)nDj-ssG|$q6HB50K^CMV}#rm8>vwHbf&{Cl!oFghXsyIUl zNA at eE9UdOsX#{7E!9aM6gu_p2D-bCb5_-8E_|8O`i1Re2b5Z3SjspmdZi^A(c!B)S zb89`^#UKC%0zwY)Ut+xbXKw#D+jI&nl#|&czZOr$e`ctvaO%BTf26EOkh# zc-yTH&)FCS^9=SuZ#$|RiIXxMDzkl3v4PpmBLXY2WcMx#h zuLPzBsW_qsQwgD1-^ySfU;E=!zDN;m-XP zP2UzEO;)VoMOrkk>`1{R0kr6OVg32JT!xGeK>%jLjf=8E)k at 6Bp&a5xTPABH+WR;S ziE}?iX*He`6JDKe{`%bb!HzXCVn$P*-+$v-<|?gCZ}WEOLOWh5$0AqCSx8OfF@&$X!u13E0Ftp`3UqE-ImpIOpmPe&Mz{ zbi=!y#@`b00>_;w+6XG|u&Jm3!T7iTWM#2(~Iby1m zrbAkL;_(}CFfXAo-j#S zN(oH>`HNDco?HWA5F1`I6q|Jw1nyTpNu)1E*@ zE-jCG_NSQcLbeX7z%SO0CSVuu=Djy?lV#i2=M`2TRxUr(ND>~%^sAMmF~fdxCmGw+ zWFt&ySjT`K)>?L$7v~;cAw{d*0M8}RUj^IP#vx*zP^iAW$o4$FY#rfpbr`e8UBp3; z3Ag#GNqZVumoA~mSBvAHH1$fE=jtqbpSdt#HrXsyb6v6;#TIC8`V(ikf^B3THyX&; zCR%>DLN1-a*cfio#N$11AVmjcN!QL5Jqpbev%+%F5y=)N>zO7_%H*~tR$#O0-l%79 z?V#Qp%+5-;sXnhJ`9g|}&z%B+EHYf*piA>;7#quX7NYzuf+sJLSU36!@+ALAw`td0Vzw=!gC2(v^; zSxzHzytjA0JcvX&?rQ%7!VZ|bvACxsUw^zjoTvWT3ZdYcS|P3ON-nQK2Z+5NN>KQ;ouZ19CJQ>^*XEx(K~Hl7H<0xYgo-Z%ddNM90>;q-#@xsY zdV?DLokcImW2+#fc>KcH-2&C+f4v`=FG#2xQ)kH^xws^q^Dar>>V))TfB8woY9J}n z29QvajpV1AGUX_z>nlF!3QhlH at eJL{Y4b9ZMMjvfQ8WOn@?+AAHtJ_c36_A5OD5OC z?<3o1uNKSi`Iqdbd-757>z|N#`2z$*;lJrK{}vyW{=JQyfeiuGXmE>{n~8W(DK&uu5ej{cHmT zSNwm!#LMCi_}cQqN5#jW*0x~=l%c%GTz{U*1Utw@=JS^@nYlHKTU+)3t&{@q=}=%c zP2Ci=pxb?V^{vZDcB`F42Db|haz@@ML-OWT0{IDl)Gt%o^zZLr+8 z|5g~>r^6wKk;Cr%C>kkK4M*~7t=fw>KVqb;;n zHTj_%?#{Te9~LhrY~7`LO$aIG&k$&S&~r(o$i`;d!p(5JfB7npi84MTfh%vZ^Pr52 z^wP|D at 9F47n8A!C<+jr=IyNkX#kPQ>o0F#qU-5lc6>(YgdMzlULjyKAsJcm0U$s_fvnZ)Wm#EFMic?F^`J;%KcIWv(w8Hbd{uf3Xj@ z;0*l4Eojr2{xOviW)(?OzqM at VZDqSdx(e%VSt#)Lj`nUz;SKIT8(Sb%QGmfeIf5X< zf3J<~e>Ap#WlmC)4CzjflLf@?`dLRIDzMKX|>1XVQokx?wjbJ at f{PnJ=uYh4;5 zI`B~R-VDzhfg#yK&P z;|;v8m-pkJAnmo-0_a%hbKzD$5?aaml=kk^BWVzzcgtV2(bAX6j30v|IsSUl1hnLZ z&pClRq at obfS5{A?M&;r-8p23(mpugs^7rM)gx0;bP+L7RtW}LXN|eC{RhMvm0uVSzJ-FmxHDoPUtbIq!HB+ zI++Y$&(<(?Zu%n}7%eSQKZus_ZOWnn3i*b&2#oYN?vA1zSM{>*o})Dfs0O3f9**CT zPnH7 at E8)Ka*^_<>5o5|JF_}L>EIJ6MnS1pu>K6Gq6z`U%3vgLPnb?%JEF at OrHk921 zIiTC*QpGp+GfUI_p;^r^;VmFUv(u=;jR>BGy%kZE1P94}AH|xKMFd!WXtE8~_F;J? z5U3y+)={6GsWUITXGaj9H6jLM&J^#MdzAAO6tj$!;iv0x8GEjKBgUIf-mE8vS|%hI zuW$WX?brhHOIHr_CfsCN%(xR2)2b_5W4(4(ADOQSQYig3X)LWKH+_mxc2t$xj1XNF zY!j(B?Hj*Uka;k3(!nA?F-FJttJddu8Xcu!v=jCZvw>jPOO14wl&|u^*g$`$jihnI zX%_q^L*5KZLZQL#1>lg&<>lt0p)uP~srNELvMw=dFqSS1iQm=e}OXMnM9ZuISAEMw!qjwaY z at y2g4mev=OT;E#ordMwjPMurkaHpi32W(T)3k3dHI|and52%I2h#by=uN+N3&07&= z7r1x)_9aBYReCb_ie&|opNos4R_KQv#FTmpH-P+u6>;R7R?zkC3k?}={!R)rxJ-ka zA?$meQk5D~$xBbksrbbx7?Ib{@Ke}hc6(3 at Rm3+sW0vA48hww&ZtUGHgSb&QyCg&u z1kRA&6~s^}G_ltULGW``izr2sgRYi>g;+R0y#}wtoMVmU?p%Ye3TR&O1ouOTgiK%H z744G at 7lG2Fu7FqGUl-nu^`0wZe7yosB+(5q+J-O= zMaX4 at od<+IXqyyWq)mlX#dT2LCk#>rX1?<>=5kbipzv>?+D{Y3OmzXHHRhw_ at ig+; zluV?mt3T2EN=!_EC+~2;zO4S(>zUuh!^{jNpQNu5v%mNv;TV1<$gL3yN;H24S*KB0 z6`ZQYCRo#EWI|^`$4eO1G)j3yUcx`uiAAPkpXhrEWmWZc2sG0q>bxD#94N)Z7;ujwL)7O`8~xbhICeWF z9$`9zq>OXMB5)*l)cL7PqT|<2FR-R783Nsr#Y(s)A$ZRiPZ8-&2nhdw z6S)6xNkNvXjuM^|*{R1s8%AM at QDC zj9BLt(#?{VZRa9R#Sq}P?r)_Y0yBI9h7Y1MNA^7M;XY!P%xB)?PNJE2`>iQ8U!Pl$ zUh?V at ls-5ZX|fc4LKa-pj=2b|#k+WJcP at XHU!^9p172YEw55khoYVQG$&U7!ViE%o z2oYd9^YPAr_w3%j#d(DN`V6-9 z8$9~1!rxR?ib{(zt at EY2@!3Y3`4+ww7uy~-hFF1C5w6CMmAh58QsZg7R0r$c<*9on zCA+Ez0cDCDv#OmiMTPq?v;a4i5fSZq`6YXt2`|iV*3tqbDCdWLCIXt){9QJJn*H)< z6=|44Zn}tQ4#uK=8CuKM;(fZ#s)640;P7Z_Xvep2SE2@@T=uMsC6NZpekzqxqwgpM z8Kl4Ul`G&{Mew?^T)(7dqQUt{W2V8OE;i^J9@|qd2-??mb at blL{F-gtBJOnlFghiv zUh1RONceVhO`2zB1mJ3e{d}6owb-f?^3Knc#u#~83o$6rRM~ChP*?byxhm8YFy`rK zblT2u(9uPVlsIt-Sv{qRDD=TE%o&G7EFHZ$_PSAloA|&8dBb^)7>8sK`>mhzQzFJL zl!bQCjTD$8WXz6&x+1KuPnp#jGfE%~9P_;W9s1X-g`SPw)R?h8jNTt9Rz zL*HSK<)Xvk_u$Fb=*G}j43P+Du2-mDYKGn%gU^8deB=vnsA(uOO!Ypfqz7PVHcG+J zBN-cAH>=UzAzd4K27)tZglV47!Tw7YJGyKe@|X(a`(Jojw?BRY!T$MFKSlfR5mf$9 zQ2Cc%i#0rfqUgMeRueA5wcv%ZkmGv+MtGBJ6fh)xKkN+gB+bEo{0gVV_qQr)hA;fR z`JC14 zhkhrYh}Ug8CaU$IAp2m1^}yvN&P3GUh&f{lCiPZm2!q|Bi2(QR@)y6EscP^2C3Nnn zbQmZuZQ*V5CwxIiSdtKJSFE`GGR&_ zHCUx{tRn1tr}d_#6hkM+J9ui25M#fvFc7?9Z}PgV%+kvK`eU_&O#lU2g;2aWS`(b3YCsi|1) z^hDL{|XkipCwF9siHkKfvM9ui?!lVrNP#j^2n$kZBd#u;K%PSV4S9- zFBb~Z`xw5#zCJNDp-RCJ|4NT9c{FS1 at KY3&oZ6L7O;2W4#<)ef4dSb)Z^CuX&9O at I z?Vz7HG*qA(g- at 4qz&1428mOp$oL3iQU{TqqUyTkf`T8^0m3%Vj76ndg{ahA)CA3?X z1ba=g8^RVfpk8$*Aw*SQnoMJd_P&STL}rQyFvJU??na-iAVIX0;WiOkl;#fBjia=6 zUnhJF;<~WmUgTdu&BJkNc5D&S^mOQ#5V3R-Iak)n_Tbgj$+m&24aUthRZ|Z1Oy_kB z4M~9zihEDNQjlpaX{!z5$~}V!muR7X0F#Yc_=wts%cbkoj?OJhmctWktyBGj9c^9$ zDf)(c3;EAm&=>h?Ghmqmbl{M;xNrDGi>x2 at R@V7 at KB<%D74QW{__6uaoY% zg`~NPJTRe+;2>%deVxI%$ql~0 at DGN(i1&_=^7WN~@uA&vbtB(W*w{mJc%Fp5z_ti` zMcE4D_o9&oGmT9)fZ0U6U~Y%GL6)qD2d5209)YklMm;s%+`+tLSO1{{$SubV?Vsqn zsEiS&NU{Llg`Y-6M3~L}T^L^X*n;Q5LU2DzisDiKXegh+rmNsEy%C1rMUv`Goro4s zc5AK^xKC-HhCQ008Ww-NI-Xj^A`GW+ z&YxHbv(h_haQsQ{C|>yyFRZ<_nEUQ?pw+Eh9*1$+LUn`R&tAY2BZ>T7bY74 zL>4UJwIN**zT}i{2ak-s0U$r9p}nA*feq$w22i96qUWN9`hU3neg)^rDowCNj`B8& zS%nco1E= zySYh=`grA*6FS}CSu#UiOoG1Aw71YZ_D)Y8J*}oaE5%GR(=^DwC}RaIPV(L(ui-0R z_gnDkN_4Hl*D66(EmS^}XOmt-pbBIN*G3Nl7tXcfgOBNxrDn;bpukprFA7%u48T}P)mg?Znk)p5Qly*QdqPl#@|hZ$A2 zvZJSj4j5xp at R@%f&-LxH3od9(?YjPW(~d)^cK^XuTbwYUQ<>Izf34 at bW7N33G{5!3 z-yu5>YnN8|3*Ybq9q}HEv0rZx+qX<{+=mo-0GFH*3~NbAK+HaJPee0gzcERJ3D7ai zijmL=8x`Aw!zIZJ^qqW)S^c8wcyTIviA>ly$30vUzxv2`Akq at NLUS2TSSYw|NVtbaez96d4E_i8KK?-wRSf=9apoHOD!$8N at TxE%HeU&F0;?u8qMhCr1 at q)xL;5+TLInS_5Ck3Eq;(c{I3WgAgOf!J%WP& zvo6u33FoDyg7cljJ|<&x)$XFz;f%EOKRA2mAYYs%UTl5Vwr$(CZQC}_+O}_d?Zdxof&*s1m!_+dJyCRPJY1wf)el_mz!z1tes}58bN1; znfKn?pP!lc8IN9GZq`dTlVYicS!2V-C{-lRcyj1&C z--lLEvtw^e{=|n`yrVw;7hyQFk1MmL-M=xm-?;Rh4>8`zem+t|47!veckk+VC*JV% z)12V^XODjf_v1fD^G!do0uq^E>K&`=C*Ekj$q#8ib7gwS_X(KM_uRe@^FJ@)IKD#z zWZvRo;mzLGVZ}(^A;Q{(O1t>*6et&U3F1jM5$YNZ0!8FWOtJm+F-%WKl{>6qIRaSH zV29eqg$?V?rEb&OAL)gpo!NyuO{4 at 7DR9b7Euw!T_K)HWMK5K;Jgfk8xGUD+^$33*^u(`gwAOY6r$Z;ZhnfJihbN=hhl0>9Ys-mnlW<;ROo1x zonsdR2l_Us_A3ezMLOtHWx+(A@%q~n)`^sr%vL0=^}QdnT|OKn04jfGSb!JzS&^Bh zL%a2HBCLSf3ZI!=PxcI0H!r5gC5bUtI)m>C;W#9S=R>j}#YvpZ*{e5vQE)-5Y`Lp at L_2c zh^>~7(XSEt5M~{*CF(6+&iJmV*Hd^I!_c#Wsv#oLWJZjv+&R;TwM=ADk#)tAw#qOx zk&&~|PDXcgH_TN`ug26Ssr{4 at H*O~>B-bm-Y^{WWU_F9Q$M{08`ac9`cREeQG6UO2 zM|GpeFF&ATo3YTvWLz?(0c^QVEKq3vig{gILW>7Qwz#7Eq`5BkXRo1 at 2)aYSEvBfB zc5m6nh7|ktZy%5+0?5cC`Bv<)ty+xrhWzZ+`c0Mnxk2Y8h2b7R0Sgy9ExD_7MbnG{ zM^@f>*eZkA>o`s|GsxmEtJUTfeiqEA%593>aS$NmnzGSgo at q&*xuhTGWAGBM%1kFE9rp8!hpsdv z*SJGiaL-u6GZC!}%cv_MzeT!8E5i_ZEd?2Mx@!5JM{*@3^!RwoCH zL(^EGK at UVo+C~kOHCn;;f}}|rrPf3(JiIlL1J0qd`>V**L-tK?~ZT|pmly1L+eB&BkPnjEUp`edaWUY(`hPD znA@{tw|tvQ#%g(N+s6(igM!Xu>cMir-9?nQTW%A~L3oM?F~mvRrVh-QT2QtB zdVRq1D-SZ-nw`^x%va4i$Wdphp%?WynzXbJ6m}Cs;>l(3%R|ZBX@`}8sSc<#oUNV1 z#+Ss!6ibK$yv)?mP3O|pni!bZF2DPrDDc!DP}f?6OM}5vqlgMAXBQI!yiWmqE$55b zIvG)qbTbWOA7bMb8r;c2PShpH%^}-DcKMub;}1diZMgLmAk^X7dUrliF_o3mbjwIF zx;4*s1xds`$namfW|{_!XO=Et0p9-eEc!jUhxVM))@)d1G5li{pT!%MDw_)Y8^j0u zR~*p-nOU`!0{E&iojr*U`fMpnZ!*Qy&}`9v@#wAulTx}U?rMJ^HLee^b3JlJCQ4Wx znvVo&G2zLBd|Eh9<%QU(W_}olcVk;3EStR8A0`^v>jfN~FaghLu~L)FtRrinm1>9K zo^fRMs<6Bo`K8i_Rn-k#Myo7q2gOK&8c0c{K|; zB(yYB!1C at +{tg43c8_}lS_RQaesu at oSbVc(!sTF>iXtYiaVlM at -sX#tKcnslYe at Rg zg|WSOMINz*E^%{fhL*O!}$FTwzf|>L}q|< zrzI_>3yhfV&bV>Quz#pOqODb_TGdfz@~@oNAF5l9<1f*6{~YXf^-?3$f|cB#%5x63ud=e;rKjXF`G8+_WFI_kA5$V} zy1c5 at cnB#x-Wt*rhL at Eoaf7`ZTGzC*@L-FT_!cd>ye_uY?&>^Gr-&uZ`D#J?fA at xt zGool5$?Hfzt3!5q+(Z{|+5Z;}I_!93v|JUr5$(vioR`RL!=ND>)%4MWRfNyZntNYB z`lIwa5WmTR{fXS;K>8#XCLlUkN za4`qjq1tm9YxV|{zQrtg5d>YLt9mN* zFYn`o_|jbUk}RF~f- at IVhZD}5D2F>hnpwSNiUM)UM>EPAzAmQZ3X@S zgaAwBE^>zA^Ew+w*qH6t2|JYT?sg!7^jH*@aUSs7Z#%+k}YgpRky<#Q4P~+h-y1~ z at r6#UzFvMYnrrbaEnaX!WVw8sJ$E%+EX!t!xUh4f!PBU=An^X1*in~lAIch%DIssD zuCPsLK8rVybI3_I?L(Ct(uXp1AoZ|MMLV>}Iy+kcJgclIAo0zsfZr{+c`7zBzyS5L zl4OdP8=pSU?vgMo5^P~J$ANN$& zepx}1zjlmejWg5PpNfJLY{Ly{_;?qH)Dr`>%nct_YR$0JfxE>Xs^3cv^FeClX=)be2#kuXl z;g7HN4%;cy(e}29eAoNn<`>x^ZZ=|+C$V4Y11EJ13e~OfVSA-(2P at mny2Hz(^z&ck z*X+Xm4p1*1a)UM%0LQg>Vev}3YcdF{QDA&A+F>)?B*ESnQ()GQ54O@&$p`suRj at 50 z4gw}TIRF$2R11l?SFbsKA+65D0@G2x(ilfqGVfU=`#o96ww7)WpL`%ChNlozw2Dw{$aLj5 z+(6*?QZ_YA|6)(wEwfE%qyyK9ikA1Q#dbTY%<)Ngcmg-*LA7E2eyt at Y5V at cR$jN1Mg843<&5D>Ay}_ z|EmO4^fN2zDIxFnrA{m=mnL%=e!YuM at j~fcH-gAQ?sz z%t38fj|Tce#9>PIc8g>T4=<;9jQoeNSz}6Lny|lXar3))`o1&K44(JDG5+x|rQf26 z)Y)y~(PRK}(MF98^}gjL*sW#d4|M{Ah;-I!A^@DU2}kWUs;-8XB(1W#{Tg%27v at 1% z-5T~k(}+{qXi3=gmSLUi6{)H=GF0bBSTq at CV!P_Ju|FO;LOu%BERt>5S^7#=c at J4e z73%sL7jCK8b*PjPs>`g^omoZJ)2w4>o!YG`HZ9tNC(L4tjmy$XEf#p0u<@%RJ`ZmR z8TX|bZpx18xE;yF_&*8Cm5f_XALmg at a@%y*$=>EW4zx*C)ojZRUhq7sk&?Dy*-p&g zh~fRUqaFr_H6$}NR%oN(oy{*@(~+kKU7)kPvQo3>+#-d1w>GWT_eS3)8HklkQ;=Kh zB`oQ9^Qbv1{YA9R4!vd0k8^OCIU3V&Glw^j@=M&Bj)llSvk7spsuUtonnP*PA zD2?2L4}4Y#zWMyhk4*}E)->O

+-w=k0=O-nk`k96VY*jP}zjJ9tIH;Jm7tn8oV z8WkFMxn_l1ox7&d%Z)Uv+|Ox$b-M>ekZ7{ts%z at 3KLI%xyu8slq$bc&AxSaJXH)VK zJEB;J8436F_IJiwBgA!UlaZOB#3F9lL->GzPGG1YGg90o^XQ3#o*!?c5B0;^FW z*n`FaR0)Q2W(PJ{XJ~Pcs{ySpu2PlNl|E_O?6FZJqjSNO>90!<#d3=~ws#sf^6dm* z3g#iAS1Z}xRo6pDv@%}Ga~Iu{?R|2fY^RFz=}Nx(zV`-a6tm4rDb8B8s}_q^owN9^ z at 5H#D{Y8<}&#f`AFn+aoeqQkl9&CcUYQFVJd}2Q!8AFiE<#*)E<>O5f?1Jv3_o%dq zzF~b1m>=N%`C}X*Skwwh;D1qsUNFMecRizhlWUncW19qDflUt_VWbquGsz$i(mPPk4tSWRC1^yM{RZ_kPKX!g?V8h-JiN zWC%9WFa^TUI|W+1&WMRt24f~fdKS?zeL){2$$S<_byE_Hb4M#Qx!@y6v;Yyr9ziMNaF8>Xx5_ztWC>dYH at JT9Xn<}xFtS}@1!p3 zrJTDVQ6aq6SbbTgt<`i~5R4_5{BHkfg2)cE^ z?g5f-^eIQNw2<5S(%3Po0}LMXw#DLRlkU at d&dsBvfVIXFR+x497I*{J)rt1NKO_+L z9d(`|lv=1NS(ZL$W}i-^<^orgU7HObfV3fZV|OVRodD?EEc)gK6u7~b1+|eY;oFNI zO}%cdx$e)}@uI0{sudbb4nvBgZCPkuOQk>0HN(nFXhrfVJp at LD zdzKt9tzb at I%w at vg{@{=gC%I1%VuZAp>UT07&2SwQrPSa+3_c1kVEXXz0$5p7d&?ZL z(x7`%DM=L4Wx{%AgvMB at voPNWpL(Rn7P7)5zR_Zga_%A_|A+=)^U)_yBOxcHj+;l1 z8V7^pEzUfiseb{iN2g~C0($`UnRUb at S-JrMfi7y4;6jF07n1<0$~RNV*dZg at c-iQ zp8q+9)|}ZP?NDVMu03h*%#YF%cLy8$^zvB?vl2vVoMMbS68UV{nReIsSIq&x7kHV21BC=h2?u z!27at5vU;|=QarXtqz4?w>bW`Ywy>c$i^!Pl>Ze7Pd9zPg6^HlTPBP@{2#|aP=Bia zdfhvlH at Msv9Vq|PAgMbaj8EWiNuTedAb~*x%S$*8+HelNJB_z&uz+&Dp8|%Tl7nwC zf}b+KpF%$esXGG<)xpaMVW3RJAd{g3a&=>uer9E1gX<@v`EXF7h~!q?r~NVnEn*a0 z(;}FQG1ADCg}QNiOF|V(8)`q<;&|o{%5=$4(K4Bmq`o0~vN8za3p44TPD@%@!51-N z=^8rJh|yF|U at JLgxMvzB5EO154!f5&ciY`PgUuTX#T@`m1I1i|Y(-&MtEDF+A`EE} zAhkj;of{E~G>Iv+Pk2#kTHApV5liy_`y zQ5m}dD^C250#!LE62gEpM|N&mZ(dXQ{8ky6(o|0f#<{@>9NYqgW!kNBcWLH?JLS&M zSYU!=PP3~(aiX==QeeYIIUHMwJ9(d0pJ5AswyZ at nXck&Q7yEK(PpPF_gHRYF_lFb%z?v?L^@0a*&tfkT?q zP|Og7ufj0-9JNkPhVC1+e4&+gBPKZx-3-Z(R=l7)g;G0SQ^-3e+g%3Ic2)yWRbqHQdeJIqDH4*5k&rZUIksFoVpV9r31 z6Rj;RF3m+|k!eUCpj$=At`{o~&0*5ffooEmfsH6WUX9OOgPr|{F>}gOEY;_qvm$b5 z&(Nh$cI2AahAY>yOUv*uh7nMeI(mDc-XMrN9`k2VrG)~>T4 zHM(|@xzsE6q=NPA;?sSB{2Z2R`^vhr!gKDm9?Ye)lIg4%E=tO zU(9KrQRpP8vjsd*IC)-k;bt=8d at _#B8 at MMGKj7t#-;??da_SnmkmFvedDi%n>+rSo z?}}1RC3#YRql>O)yvgn>aUt0$=;75;eqWSNhsZeWn=VN*ro>eH+==E$jH6Nt`?3!w z`%Q^vKk%rBKDgdShz$lrV${RAvZ>PKmZGt z=H+h#ARTjM1ry;5)V3@^zGju52W=Va5q2P`)Nj@pFmVu!sR>dZw4r zX03>t85?J%-Xm!mCwr3QVhY(W1fsI2vxFTD{<1ibNS{xU z_|9BO26NU8ihMsdBy&+Q^UKsSIGj|OVKCN|D6mtwTa+BGM2S3l%s53RZOoLaw`h1r z>hBC$Lvu!wH2Gx3j9r6t7|*_bByIXQbbB=RlNwfB9}`wySv(3OZStdJGHf{jyxek^ z#Sykx^x~{|bI<+pj3|zGMJxMoqGn1!K$)a4x`sBQK?ux>yt*O>9g80hK}B4GYPUG$ z0tGB9N+19WXEXKts%rXm%LvL677~*-b$eWpGLOvnP-5rJLPo)9ZYHNZDpUzA`DX z7`_ at 6litGZsH<>7_CpLWWSl`ZyH?f&m8<3LT6(6EpL`-h;hsG<7|4pIq|Rf&$@N(# zhC at Ki=~wKk1EDn`&^6&{`k>WVIY0u at r}EG_33i!`qF&kVgs at wO|7utK!jLOi(~sw4 zaSHji at WG{xpZ|op?JLiHetBf$cbo$o(6AMg<<`FE)Z`N}`?mg#5ro1mp;E#K5d|fbShv=vp$o*$&TR#T z%a>>52p at b&+P=8dJe+<>DHjy$s02Z_afp%9iP=XE-vBDz0InDpB$EfxF?w-+0r2Vy zGa6u&Wj)ZHb)0BHYslQ6Q|D-f6p at X8AI>niT1OB2qL1?D6Mwh`{cXzsjKT22T&I8`rEyM9Tk=jlR zlE5S+-FgyypDXANSI85dLRM!JU}mzkNb_Y}YEbhOo$3!*h^JvAqYu1PjQm{&c3(tF z@$#4Yx?JWuoiO7n^~34f;7LM z<%d=_^ptVL7lLHsQTEvmyFziBLiH7D*-zMwKqI&Hqd{#zTPTLcJ!JQ5yM41G!~PJmqmUa+UQW`W5+_n{gY zAq;M1!?_dzC#wd=PB9wZOa^xBf;}>az316x3`KMxGU32xq at VV64}d*Nhk2omZp|=l zLvpx9kJ^BALQ6|V!!J!Q#nFG}lD#sGyAU+e*67o0&l7pPH z!945#6!IXh$U<{9fS>yUdC~^+W9W_#zBwr{%cCfSP4_VXfOcPHKHX2RPSi zN_l8z2UJT+uQK|n==O*bbllyALd1!hlxk^myXk ztspqfG*+=lH`!;d1us7t6=RvJzU3LGa$#+9?(#|4y0J$TCnF$Q0YSDj2T=}aKF=u& z5pgqp+9J+5QDGN$a0HtoS>pzg;F>~Dk&%+ZuXlr-VFGcxbWIA8M@|cRH9aGR%01KU z1S)@sGkh)&e1>)=sy z??U1(0P}!1poDQYBrDBHfRqE3HGLYZcP4{&nG|K1trcHYTlkr^&!e2gJ at 3Yu<$@vzyr&)zudX}vefP%?qniEJQ zGxWvR-#eLziDv+5n0 at 5_`~vA7B60rpW6FRR7>0kLlt*OA3l$wRg1s^vv!KLOtU5?( zH>`QjoSp+OB+{^^dFU`s0anA8$6?aZ<$gYl-KRW(%0?t&wQeX_djPPop7ZUNCFn$xF_D-ss76 zE+Dj=lSjIYEef>C%x>W7S at AzQzfllWwa-iNhoTx<6DsvT$4)N!I~}Be0s-~I|JQZ? z|I4WsH*)iIH*>Z!HB+&)viqNL?_CvSCDhSba8$DCg+^H_nt+1JkfO|l(2C=sF;w$3 z1sGkY+%L9C;g1y=gy*%V09HOW6}g^Q3AWs>uFkFpk+leF!ENYwrcurKM zM_iW37E!Y_O4gaU2g{0i85I8D!;`-SDMo7AdX zvhAHX-VI7BiB0~{ta6Nf!P-J;pE$l-!jMc=Y7rM^Q=VEeQ5yTNuxiDAIwTd8?TTaE z_z5?$dn&0wkO`Xm={5U36>6{Pq8t5yxsoC3mVS=BU#%hr1p|ihQm$JFUR32-DNk3y{yWn zC at p8{QTbL|lFQ#hn9d1+Ov1Pq{Z$(8ZAPDK!xfeCRh1r%KT5&y;jrP3C?rK5EzbSP zx`-|>-)+<%yX=2qGM-n?{}jIxuv=4qG+Ba?#LFA2aY at Bg5vs3eiqm9_$d@4E85yU zK2hZ-Un|4rj{p0tJ-&GCygR;lZPJTimdE>jY8|}2JU-fScZz<0E&3K{1Y?g#Hze at S zze{|?C{Ya>Fc8r9|7%-}e+jyjtC{ovF82SDZ at 0v4=|M)+(VtA0?TghdL9qTyFQ(wO zR at krtScsr&7*n>C7}`Yo+}o2-ggueSay^dR+pEGaH=Q)!* zlrB%COhTyvRU^vsbh+h zgIPgMHO%n)Ywns*srN%$dK8S9i#me5#u3>`IXHnvue33rQmYexQx=MRjw!c9aS`6* zk;>4Vj8tvvhxk~4Jg3=ok`ZU==ze8OWm--hj7|F+#M at vsO}d8|IUDZM{gAbs$;0*y z?DlRnvGd^s{HwQdm8}487%?zbYM>5eW!$BzwZu0AcD473+DGA zOdSDE&+mauc~A#N7f8Q_3h_#MhAfQ?3(?W%rmu=O!`Pd_A(L5Th3=L|1Te*BJ>#C` z$)qvcp0~Y`Wp=Hz6ccfqK(|vOw#}5TpOKSa906lWZQrkP3@`M!&-)OZPQjC#t!Zxu zZONhvNSEcQ87)aLWF9&liXqBmfwebtTW;-`cC55_0Bal3BaIikds^RGQ1#2zX*I{T z>Cl2`?VHPGgWFVsv(Q_f->6$5DS((r7$!lyQ at - z&Z9fM96ymf6CO@?Z&5Vl%y^J>U8XcoYr8=@JsKhpKH8;L5`%+i&J?WBRAGg@>_<%5 z5{;uT&zxOMWq%-c6o;0wbxP-s2oPVzf-kM=p7M5D)N=~#^5eKta}jUn!L*-XMD9dn zjhuIklO9G?2_Kd at 0i|A{Upqs;plx1C zdf?VLcimJe$}^)5tkFV0MVj?FRMebt0nuWA4sxKy`7{!9Wx2(MT}2g_!~aDs({k$P zV}0XW?B6N1Ka;&8vP^9$4tPQKqRf&CWxy_e5!LmWAJLd&p_)C zy(!2v%Qx|8M+Et)f{f3cv+2-g%-NA1qS!i^)SnQwfq)s;%3dmi at 4lwG)pJ}$xMk0t zR%K%zJAJ)&6O)QgvXgForaM=CqGD8Ar3Ir8({FVn<|vL?{72gRThROfK;#COde_%F@|mcLjHey=L{?l#b_9%w+C>o3r^zab>X zxWsR7#vcw()DteQw)`TWK0^yUqEM?-#0J+@&2aCgPSWc(H$+ryHs^+Rl#Mryzqw7q_F|YeTg9;Lf6X7O at n$RTsHJO2 z+K{$L+!^*bq~WI{eCpot($CK8?WWj^d+F-7$Ns>@xqJHW^p)}WN06|-B)dYkIkt;@ z${g at 3C;X>XEG<@N*YppB2ciH0iT?k9 at c+>l?B9UAM?=a5M-26QBZ*cAp8?R6WhkpI z)>zC*N;)(`3P{}(jRfX_2zR4(OJO?1Vq%#X$m@$dz__DHqV5Y(6|%2{{`C*6JAy(- z{e$bOO5HbDvFbe76a^v-^*+6?&#(Fnov*X2yFi%z5=@kybYat;dZ-Sfh0v42zXryl zh%rD%!I{$H4~%(Yt(3Z{#9ftWBL^Y|VhVqO&wJ5?iD?#@MGqi3aw(w}w-3!_AG)XE za7~ZpQ(eTFyM!11QD!$W zkNj;dm6peJrMo2A+={#ErSCSDWVwSkIAT3j9g1vUWtEa7_&3|2{BNY at m7=c#VkZf3 zS-R)2rMggy>S!}2J4#=Xx0DUm3!bP9D14t#=5{LcHXrtja<6 zhb8HJWrT#ENHP7VC#u1ukEvQzhdzSIrFdh_Gv at U-j zBgiR6sbqpUpT%~A(fNb*8b{4k`9nGlLsW$J2^4(PQMW(5z0450991^@1{l|rvwLMs z)X7inyhq)qATRFq7j76wzmP_+W;2^mcGO!}@x0zc zYX`+eXva)Qe%|iYBEs)Ue at 9kA0+X(tzAbz$Ycp`7{cp?dVE3Xl at m z1G>SD0+a+8Mcx}OUgnV=>`oZ-ZCz2a5f*K-tZ!hP=mT#mN0Qm>*AdQJCh{Ie^P$GY zk9g!0PvN&xBBE2g9N4ClX4$sl^4f0!_C1OaNE|$;*ufPwf>r_0kZY^P*!qxdz4$K; z!7B^jE2*l|kG6T1KQV5*D}+CIgytacmQ7=@z=`MTcL{6*P)gf$Pm=K4!VVG09rfa< z=!x(U+m+vOw<964s`Jvx&2(smH!rWf8Ey**&rM53)nhI{P^Cd{GMks31UtyRq0fop zu-s(9pf|SpLJaagu-=J at u%a>z(BmsujiF at KLbJ-oWWBuSepGLvy#5yB>^+UVIM@@5 zZ9%-{*-59arM!HjL)Aea17A!GIwVK_CU!+TwUFK=^k+z`LbFN>HAq`!E&Xy)Lw;U=`g+1}PjxmOUX}48W+f2jqfOxB4SA zjs9ryiaoK7>ixucfG^IVNlZJt(V8LKVjaK4o3qw{|M+A^EaCeZf&c{M_m9^^_1`Il z|AGA4UcRUrct5?F+gIi+P(-A_!pg#s30Dvx&A6cn$ijW035v+b!L9AKVT{)|ww=G| zta}>Ns#pG6*4p)CRapY414mZ0Z at qOKYPDOm1@xbLqyM~`ySuxytk1N5y-B#6 at BYo* z-M#(Vx$T(_R at ibO`0Zw^0c3N}N6>pahye0N!Cx!TV4sP=A5W0Ye^A1IQo>&&aQ6`5^U#UlTQku6GjjGT^UoLA at 9DQ{ zv1bncdk_8>gzp!H?|V(~@6dopz|UR%&#^%OMjr~Nf-UT4 at ViqOWX92GGXV=f`LDTt zUf>fmGyjuErhwn6O+fDh)Dw~NPz}=RXuqdU-ZkBTaK?4m^9$V#$kSGot+{j5lM`Ku zvEmd)FjE at ps>gRUNmG?o_|*sZZWkBFQADgaM$s9;K8&q(mlqFw=tRtB6IHpfBFn(h zG9^*8#$na=J$aMka3d>ETnB~t at -SE9tbJ`M6J at Ipxh}N-n%aBb&-Ctq`tgbE2X2S^ z{6c_-CBWxxXu1XRGqb#oCqKwVi5wD at y)Iex6fT#bEfZhN4IX!5t2{^1!I}tfhT=<_ zAytE at x0*tC)A+ at FPh#zy z!85A3m>(f-Op;jQxPtps5^qHnhDP69CaGaJf>h6ENB`E=+C at YhkYpXzizcxlejBgj zzI58?Q zG7GuUSG$O64z(bu#9W7noCK$~w$SvS61!FwBaTXARdwWX(f%B=5OUWK7!?57FU*&j zKpeTW0tOgy8ULW0cv2Fl)Rzff*)&MM)iuX6+_53!EgyZ}c=99>UL*DlMAHTB8kaFY zrUbFhX&S?_iF|=1w)Z{V$U{NB3GLd&r($d8 at -%51?&~Mow*y?I8dIGmwA4xZTA zDG}i^a;0FNLac at 5Bw2abG2$%aB~=n?QCm9}@LM9yrzOnEOIqZXYDy?&*e(6jFZQXx zQZ~~HU$&RhE~&!ab)p(2%o5JKQFc{Le>uZs^u$Qc_|cDkK1(KuW<=V#vxNpD{d^60 z5;#!&Vxkl`A2oAe$Rjm??vMm*Boy0^QihdIM+q_!QZ9Nk-<>u z#=ZP#gF`&r4>_?RybCvT1`2lmUJ%ZT&zAhPRLz{2!Q}?%5 at ViJv&Ve?i$-MkYjT!K at T>L#Lz`b+9UQPB79QO0R4Z8v#+5j2q(#Hl9?GZDZW! z^(*tN`lCdW`W3n6*-9E;4R8%HT3v(-wrrE!Tq(D<&Ja0VU9Og!bQeHDhboLp^H|@9 zpK?FNJDpo>nUJz?o%&GOcvKr4Q at e?QeI%2SRb6|X>%Cy-<1%o2%E0b%CM>+X0DErm z#an6%wd;i|9p;N_pPQ?MnYkUA*2;<&SGEeQQqeej_!eZrsyR;Ig at 8wZ@r8GT!#H=v z)7)|s3A^jGG=3OrYK}Cqp3wB}Y9{rlISbrXBRO~dUC%0?-mPj~MA1+xCeX4ax}d`N zq{_Zk?l|EQkdyOR)W3 at sn~7l at SSU)4rRHJ9+p4z0w}Ne->=JG+pnKDsC5)6`;=r4U zdeyHVHmzXqQ?>lA%%mE`!mnQ5;N6-q6QWR;AZrqh*(t+Td&gcpeZ8McqdV2G6FcyE zsX4PQC|7_Zzu7`>p;Oc#zH(%OLFxIM&P;P(90D)1FEbmhHHM9{6El`iPGP8l2VcV?4Fh4}HL-)>=M191c>D#)=gWvR at E>zLyvxm#vk+_Z zc;$L8+9YhndM4VVQz$*(N;{VrWkccV9h&*?OH>{IN>-!RfddPuVx!mc8YYW^$oiE^ za0-|fRRdpUIV#G<{>n4tiB2&uO>^8v%Ta3=erztIAz;cjc>-0ElRdWcDHb6sI at dsP z=)=bK?qn&tx_j at G3)tw*jtSHstr&y)*Qk@}#nx~U_T3eUb1OIDV;v$}A ziTRSfaVm5x1!rOt(Z-(ZxhwH|F8Fyos?Ij^fVjhSNn^Yh3 z`(i*&XRP^)W2eYzBT~APkuGDaP%IuBAxtD^D at 1%AhWAwFLjWls!y z0_$g#C&la9RQe)i-WhifsbaAZ)g1R@!`;VYsm6ngEM^3B3T_hYnZ=XzeVc-|pfjLJ zjqmD{BfF70*e_-ASkbkoCxfrW4TGZ?O|I>EQVauA6!xWT>_ z`xCZ*;G#dgiy^anU+_MqdS7 at 9(&T4x|Hvu8m!Jz{D8qCwID?g_H_Om8NNGpnEl^*j zYyfnip*84tD>kDe`3h-p^q`RX`msF&(04iXzO59TV z<(S1I_dfOHxPCgB;$gQ$0P8Y<^>A;i-y!hEnau=v3#Dt+czy0xkXfAfT4OQhIZ|X>sVj-KGckYeBhZv;t zA|rA|@Gdh-(T^p=UMx=78NI;=9?>qJ^pr8X_gn|BGsO2k7Kv}$+O+-;>^fk-)GZF% zIwe1+JbPf&s$&`LvxP-+Uspcg=#K9<#qVusV|Jsd{22=0dSIhmlR|oP4m|LNZ at r^- zX)OJEkpGrw?EiKJ9ll*g{j;k0X9l5}RRkY9*zh_(KlJVA!7pvuZ8VR_%wClccJ)%wn z_nm|AorCX&`mhu4_a1YRp6Ty|Kr=n0fLi&xpNub<`ea4>zj5|XQKD^2wrH-jZD+2u zZQHhO+qP}nwr$(yO52%lSG77-b at qGj)~Vat{Fwiv_YpCAMD&QmC1UH1vR+WNPk&@C zDy}^YdW6@(_uiz?O_fh()q_?{bPV(}{Y5<83Bi at 4x0*2xXF|XnsBQ&oI5BiWca`Ltv35Jez_u%E3;NYa{VpH*4YXqLh2QT$0R?p)Ka?_O zphr)ev^`b22XVJlfoR^OATY!DJsTB=E1Lais_)%M(BDuCf`|CLJa6)(?~zzVhN(nK zUC~KZ(OEU%oN at UfR{mU_VZGZs-a~p)cVnaayv<$ejW;|h^}%CYvRpEf(b8ykTFz%# z+F5U&b at SF*z=2-zkTxCw;+&)D*0JQiAkuC at aRz8aJ7I)ZapXW12c$-%sux^^Po`=R zsAXLYS>Bkn9uylHJg_?>#~fbCqeOJ6Jp+4RjtOc`cR19(|rDkp~)8-s|zCt}T zeW7G&2%~)cT#_L-(>}7<4kvvQVonPM)3q`gITkuBcSNj4##*3mBM{l8w1&%Mq|ws) z*9RF%e8=+JYF2&ALVYX4^p14wz|%h0{LZJbv^JZ6RBf(hSjy0u|Az9SMWkuPMQ1!Z zN<;WKvFO+bvN8YIyD0duH{Z*1E?{{ z7pSr%yry(b!vPiX``#GaBWFftldR}=TMhRoIUUx+(bg))7l(c at r769`H6|8sWHg7a zwCQn2qnXy=v>P>p9?4niN7pdIWqy=*gN at 79g~rLl(iA<$j&pYi?$$-cd{emBpAg#- z*n)@o##Gc4q1kLBDQ=99ss;xRF9Gz{dAIMsjS`fAEm-#e0s!QI006N4i~8<=_CNf$ zB>~xr+W$5(!@aoeVr~vqppqX3US|EK_9n*&H9cX6kCLu=i^#wB7Y)i~V%V)AalE>j|rmaK&Lvk0p}n;Z1ISlxL&C>t&O?oJHW9{EHD)FJzRA1V5+?Rau4l`BY)yoO{< z;G*a?W>_v`i()(>Qys?|27&oX?9`3Q){JE^wy{F6)*3XsklC;=uEe!flZ at fx_&o2j z0TpYlVs`b%Z258dC6u3nAzqWt?Yni+_FqP1fXg3st2f at RNc(aJO%+VtZj+k|Z zz*@V{?dR>DDhz1>?X%OY&b?S8jq;SW$LHscWBuG70~j8#n8?tRI{3lZ+;PaD at uZY5 zkVc`#kz+COuHgp1k|ry5v#L$ss|>apwWeE z8a0*|0luA;(q)rXFXjeGuJ-(XYAzK|foj1v9~*@T4+-xHJBm~{dEXea!*Vs_7SH!$ z=dbsmfg~m<&%<2D92t*^OD!2shM*OEuHm at -8zXDe;WZ2p`7Hygb;OcAn~B(0oSd16x=d8!IvafMu5oWKWsk}GM|6yd1Ia|ea4 z-#hD-AnhMP-aI^I=M}biz;ZD=qnpdAOLoRi(vQ=d+FgJOw?skEN_V3>DmbKKF6l`Q z3XYr$xBj@~Q9>#e=PG)?{hgf5!0Fdl~3{ z4fYYOI9s8w4W;9zb_0KOSm$)J- z9%YkQ!jZrKdUH6&QhNha&^^oo^j?;zbKD}?lw-M1>&L+~1>VkrLX=wNTXT;J;s|NksEzS=H0Kocx zgV=v;fY6jhl866>wd%ZTNDgTA5G`9nH7du~(U2cXVG5unCgPzvR$H-hoxU!I;K9K2 zdWwC`gBZ~~fV&mNI8Cx%OsUvjv~qQsnR=PdN at wr&@%@3okBw$KNL$R)=Yhpx9jOBl z94-g}zsIyO5VuHC-cqp7B%pYv=It&!fE`pzj;t=Brpko^?LJ`J(rlI9J>?PfX*^+x z>bO|3wuxJ_!|_;Wsf8%KIx6jihXmGX!j`OJpfVNkG<8K!a(0bnjIz~$_1&<#bg&>< zrWaoPz0#ha6|q at 7P+`;v{35mQkp#xxL#LZAqNvs)5Ag_s@`6rCEb0aZjRj;KAqZch z2`<`{pmtZiihN~8qM1*ok*S>iU>Ca5Vq2Q8yj`MtXe^oY5gxN05S5IXf3#$^+M4x_ ziuQ4x69X8*F+x}KJN$z~<&JMy5GU0>m=Js$_`GXKUGYwAlmqu7jX#5fmnkL!anLL6 z6C)~)iedsfUH?M3cps-CJm)}FGh6hj&_D9ZK66!i9<#$IQ7AS*pZHO3F-<%ry|=TO zGya5)hHLRIw^Ju at U))4a6fSR<+1n;5Q$|{?MiHG2?C0nvXqxWJmr`n8yK=sHGC_Pj zn27w5h at L-nj!4`%Y7TDB!7;brL6`16yhp at 7;kz)-br~y*P(77_AbUjJqtt`x6o1uS z3!f;wU4+wtHh~lPV-4)31&YQ2ng+2?yT}wcRZKJxvCl^FY=MMWACCSV267NiC`W#2 zzE;cHUO$4~>nzZB7bKSrG#7j?*-sC3Rr3bAfx0>d zTP7~4Fv+_isbN4?wlC>3>n85%hm*=luVsgs_#d zwXu!Ue@;wRCtt}f${~;Bay~C4LjdXf734{sht%Y~P6!Bq5|JqKK!?9qTd_7C)o5?b zr2a at CB?%!(N8v@?*)rsGqN=gdO{EpLm%g;0zHE8QY<_)yokRH%bBPi9XHp;|C&=ZK z)|C-P1V}7OLTpLwu?TK?ns=-Z17FiYtF*ne5pyjb;|l(XH?}V&f?hqQ8B}PuV14Yc zUIketw^~Dm5xA`=#Up87haG_Ik1R3vsDz%>*j;bO2{9Y5u at BjAFuxNEX$XV+FRgo2(oYME-c1#x-61#h{B1VD8k5d~ImCWiHCTW7sd}4xV_4!E z1gO!t+=ED>(8(fJBv1>DbRq*DT2UiZdYm`bT$87Y;=;aQiq5-0P7Az+-I0NHj at X;Q zX#n2yQVudV|27rXYGcN7usmI*yHLeq*oIxX$9w`57RR|9f1RAjo+g-JOIjcC1^pxz zCs)I!a=i&BcC{sAi~gvEWk<c(FkUdH5W2fDU~D*_u#*mv5TZ3t$ot|32p$lx{(1oa_!ugj{Aktw-RL zUdE7wiILw>X(e7Pp_IPwkDTI;%ZpKNf~6c_614)i>43f$QnBQVZah+ at Q#_n%>( z9C7s_^j8$vL;wI_{@=s?ADwn at irA|N-?*KZRFh%{@OsdQJbXKYW`e^mi2TUd z49avjPZz6S&b_rC-3Og`JU at ti;5!lf6vzg3dX#E5{Q%e2!r(Ch2G9sP7=DwJ#He_t z!AOuQ26FZZq@~E8+#%F#7{fW}*MnbO`)skea&{S{KW4(IFQ@(J-{GNZ&vul!{e_>W z^eNmk4W!6i<$L5HvQSMkf3BUzouUh_Ax1}lQySLC`vJ#n;Zlm}fh-QJG zm9DZTHiDgYS{_PrO7#0%&I~g=R-|k7ag#K;@h*$2%Q!#BdJcLN&q_LV?v zQgmb-&zPHt+lKu7hR0x}8r-IyL#TzMpeKdTsdHq|8C)=x2o~OEucFQ%I!|k8JQDt` z%k&bg?>e4W70m?D$)=X#8i12|u~;#_RFb*!}pj zHtJbzCtb=t5~tj5P4CP~VUYL0q>pSjut`yZ^@&$;S#ho!*2JfHaF~y+IAdf&Atp5p zOB{UwT75B^{{`k8o}`1&DmLM+2!AeP1gQN>-iaB=_HwrUWP^5e;BRDahPdP=RPaSc z;zgr|#PG8O6|H*;TIAD1G_U&+J!8x9IQi*j9ChyEfIbwIrZTqRYD>xFE-wQs2i0n? zm!ELw+^ej)tStTGNm$7o<=+tZ$i;$#BnJ+q3^H%>qb64giOVk-TDO^j6+7d9D10J) z$zNL|e)iP=n4ny$(g)#C1sl}fhbER}s z9=66Fv2 at e!XGi%N#G=><$~TC24&lS$>E>4h|wWc(EH7+tqeZ1smY?&PXU00|hSvmSahGEYfC~cKMGLr2zezCj%3JBCj(6cWY z)vCSON77N~z4o}0_Y&0a-OZUp4#aW6k)&oWuWjj at KEM#nwgFxx`MX9fo4&jvY0c%V>znlU?R~F4ORLqpOvpy`Vp}cQ at _dHe?jw*!^575AZAg^ z8s))g-3wjSfOLWBCps&3E)z~kn|1D01e1EcHN3}qT$UiAJksnPGhY_|+s}w#OURdX z5$%9%zyMcs2+&8g!NwNOCzf|CRTj%dJhu?V(y(8HtM5TH!tc-M3y+LLg$ffXugL3H zpK(y|0qnWN6S9|TAqt|)Uiuf(__LU!mCFuXMdEY`kDw#ci~vNgD4SFM#JGVvS2jOa zb{htg4_8j7%x-p{j at 0`Z+PP#q|05#dL$1JE#e|E_M$g0|gq5iGCf7zNZ({UQm2hBH z{R%bz3Io%ItWWnX?(-MPyRLvFLvzGg at b~KHD^0=>6o(4!8LR|vka(y%pVZnJ>ZCC~ z(yuWg00wzbg(qUmaxq{q^F(dfyx6Q(nc|+}CEWlH*`kf6TL=vZA&W0J!zv1yJoTz1 zH{W^ zAxC3549Ka95yOKgfK)mfN~zpgAG=oLl6fS5SKdRfk{ zjwjtXgVrZKID-cLTYocUK$-c5STSmbymM~Q78L3-++t^Z(8A+sy05rfz6!u3T{)2p zW(f*)@p~UhH$}G25$}lPx`AyDbs95aL*m1NFku(m*Hk6v16;~US5NJ$;8DqE$70SK zRrqcSTUFQmycF#gl`6K1#7gvXWt7U7`CDk`&0GIMnR#92NO%X;HjS6?j;=XBqUfmo zi82dyJlhW_9!CMJJcF at lDY4)UBIF66;1SWN0zFr-r?wfzL7WqV?*qTC(n~0HR?Qo( zyD8BP{-`C1OwVEQ at pVt0a^MLOGz at x}FdtYUElam5t~Jnn?e83& z`FZu$W!{*bC!&$})5Rz5flk;8bU6Z74;!Nc$MH=J3-R8P79)@q*BQM!-z7w1yWF?g zlmzQJ64dVHQ>pKM2V~zG10kHo=*?i?*pJ^szmC^UWPsBWtcTmdN|n)J1iwOYKQBb|nk`vOT?nRhhc2iGH~kE3^n%rYgDh!CjS` z+~=@4vO~fID}qKB%k5vr~Yu%yoM6 z(!3$JYwoYKz1kfL7+K7QK0LO0R2enkO`S_Jp_225VSxy#_=er5w4vQIb|*`wIj|=k z8OHzI*YxA|o9s~H5=6E2Vi{8(DG6|$y7iE=WB2#SJ$V97z7+il at QiCNkdq_p5_f5} z=xL|Ngz$7jdv)HfWu<1#xcBEP6)hG;RYJ$^bHLmaCw1{lAa{7|T$~#Mtz?&Hi3TE;T0=d#T!f_H0TPwCSHvt)OC7a6Lhj~T{41dD#;e2uY){JT$ZOUx)@5p% z@>oN7uO%RwL4U((VSyJWD>p~OkBfJK5r_5tI(y1l4-za#pp5I9p3kHG^$+=N6^F#C zC`!)$=tf>n_!9b#*mnMdvcEx;1^#NP#B55oKbEhBHM>V{rIU6pw~__Z)Z-hvrwDxO z=9T55+Mwm$J47Y3j5DKAa&PO~RYxJt)SUp$twk#&h+;GVv1DQj at GfK8e)I=qvt=FO zq>%eQf{^u73#Q*?ZR$q+U{;nd5!w?o>{-8c8ud)%}*j+%SK at S5#xbxCJT zMr!|3^l%_kH$1t4ObS`cS|Af^JqTHtZ%9;oB*u_lMMG+gSJ7$2D{WX)1=^i2jFXYW z+0|9Qp=xE{4T9gfvcTZr03SthJ&r0-$O%Z})++X(b9L>NxHkNN zfyg?RE8pVixd4g32eVYL1=A$iX|>1U#zK+WOxr&uTantTqYp)s-fFu0#nW_$a3cMv z?m9R^`gvO(t*Mp=Ii=*+j0)sya_E?a#FjiRk{AE=3HVf%j+QpNm#ZQD=2VFwuDl2J z`lI_}nkl3N%tR*h-ASYUm>8q&_{g#jixR9==Gv(xma?^4KKg?Z_xu}4ca9Fr-V{Fr)2p^aF?N4>}@ zcw$0TP(piKn{|ZvQ`83=0objpw{1bi%@^+PC_BJv_KGe7ts at Psc*}6LS}z8RRemUR z4{0BM*x1B!o|6FFBa#%@h{@Z()1TDW9Vkj?@`BSZ(S4*?g*r3(s63#5e&Gf*J9<8$ zh;wU;DEVk_Z&D!EGH#pQ!^Sg%_5=9O93SeP5KsJzV-404l~G19?C^@VH at 82YH@7*@YkPg)VEV9m=R!WE at 7^oO%%zx{csuR+glCB(2~uQ+tn0xt2B~M#uFeOx^UuY>WtKn7 zAOln3vxL`(#Yn{?);^(|G%p*^8V at X2)iYk$XhXz;EaXL8LKWwuL5 at CAg&NF$({}b| zWg6=8+>Vs at MT-cTGG}t at tnPiB0ug%i4_ at QNhn`9!U-P^V^ zNnu>m{mG*>_-W2-C;RR;phqPce-1VqRg_7GuKhI>@E*H}B(Dl~1@$X0WJP_oPPUG32;cu6&eQ(Bcw{8MiKkx8Y|0sFsd* zV-$hVKssuna&A}+O%$)hYh=mhiu9Q8!fD*0jJ-89K1 z!_sfS0m?SyN!2?oE|BP%DNQ$(*~Dkei1zru%fNY;H)j at r004rZ001oiBG3Oz`u(rM z$bT&IZL`13U_lmZe?g5% zZn=I!Zv|-QL;%-eT<;2^zc9Nm+7Opf39Gv9%1!?aWQ(8~2NIFLPjg}Y26Q2|Jqqdv zzyi4Y7)sZMv1jB_8tG|lEUp!cdJlZ(S4^Ow2_rv4;M%=Vb-Pq at 6IGo7El zvsA+X<&l8YKwV@{h8-L@^%=cE*|&k_ak96^yKsMXJ|^&yPR at 0_Q72ZW@yoZ zli~HHi?HN-{u(CZYLU(Z-K7Y1&qbw-EX;5MbCX*rD82!abq+;)bjGpRN4!;S^G ztnMM1$&{AmHzsbH#B}J^t9)sluACfw^B`<`*_RZVQckFp$#UE|kkk at e$VH>+_?AfI zZa;MjUr3{cL2a*5#L`aOlb!R4vF1k<;7 zhH_(sxq9uU%y&tI{K_Tby8T5d#3A2>`B9!2hkvU?*O&1p{+lPo z;9r?2)BhU1|G=)c;-&~PcO>*c10s<17O0pM5C{^;=|Tn|xk`Z(NJ?8IYDSBf=}#%NGT^|v>|5FME+pK zy^0iF8y+Yb0sT3jHOMwoP#WTtLI)?o$_1G?r0^IS?GUaVr(8#Q{MKVRTD4^4BhB82 zxImW5;rnhkW)=@RNoU^MDG^)8X7AQxX18HP$ac(eJ#pZ3^x?D^@h!PKwb7(CuK-OB zp5dw(VXu-y2p46q%0ox0cs1J6+H at 39@EC5C-Sf3kf0@|_Pn=1%rTP$BB`#yN4s5b= zVtU;W%^x at +Z$ji7A}-#I)tKkajs;UaHA<~#?}*x=$2a=yn#4bgPR^r0%TF25oWVrn zM0Tsvxmd|5zfp3inucDKP$r at _D+liI&|(s#r03C`fe%tkc*((_@#ZRo7 at 08xp=$fT z3xWgS%&`$gj4 at a7h2U}dU{}p?ZyKcl$iZO}j!D)*<4Tv6fPcgWETL-Y>>z{lC-djc z$sENfgK=@GM+%$W&7|*B+B}gZ=f}Xeh82rIZ||p$(FEtTKGJ|uD$S?jdZBW|_s;j{ z%zynnV7&ITb=kvyVnZVKTx5oMJ;-OHnhD1$ohY8yF2YCNRcqIYJgyichAv_5W7!&3 zK$oJMxCK7OE?HgK8hvvO+LwkJa*fc_uy4GujgNM!Md-!pJF zq^;)+)s9fUmyvE-QEgTMs~GjP-Wjv)_Kz~f&QnPK`6gq=<{^9k`rB&o=UTEZyuVo9 z1NuMNx&Akn|I$Hbs6QM&}0_S4K}_+%uC< z!>lcORBESxkj=W~MgU41wewyWby~FzOkhuSKJ$?C;>C4Z`1SO$=?ajjHkW6p6&x=F zyvjsGKYr$ch?I742qVIp*cNOq(yBaFmWC2`N;P`_04U+%B#6&((~|;dnnER7qcoYh zpvlT=z2HREF1)xy#~nGF&+wox54; z2BtBeNu{D?x^N%o-e`S0MQSdkg!Gm|HI03S8n3LP#~8~o6J?h%l4rKUeW00#(cF5v z+C#Wq at 6Mu$`GmJ0!l|i1T37~u+e#0|HGb6|7tLvF&>QC~ZP6a0n*&!*XIK!&oF~d* zFQ9MD+$BC`f2gDU=?6|wQaRzb-az>6erkLqhwy}T+fyABsU4 at jFx zQIu($519*jL5oNmm^;XfB8cr1Ey2i-b3Hfg(tzRvDE_z}hzt-9Uh$dXBW!`5#LmwR z_-$wJ`uEZqsZcVvaV`HjgHk}HT(a}ogrXBU)|pC8+o$hmww{cm7kT9q}L(5W at L?D1>CZDC$CJ3rKS zXnA9Of^cw`3y{x6`9={&lp!-Y3A_U2M;07JgsxfrYtj9(Cj3&8TUQ-SQKcRH{3O_E zDNYtf>Zr<~#R<7Ps?j;|hCsQ53_F?)0W(0=gYdtVNR4nvO7VaJ05Bo`byt#q{QbKH zjFYW{xV4?tKNO!`MM{I`gD2*o}(SdS#I8*uNn5t zuZLP)A0RvEo1(eMM4YpJHd>@Esgn87a%6EuOqt at meIm;eX5`m*DNOP#<8x*mlh;=d z&K)s*)YCOPn&?HgT78{CVHhaDtKtYO4r3HZ=&21K^4{x at i<*fhvp$x^zFD zLwAZamud&~WDrQ{s!@$G9yu5^eLdt3Z3sXCL{oZASpJ^3pEOzgV~rr^jas*%+B5>; zv(OYQN)D^Z&N7K_WdnsO at TO??9HbbiD9q}l0u0}FV*jJ2UJ-;&Qykf8Wr<1(wI&tq z1tSyhO^4K~zJ13ksSx4N*Q at g2>fj7=>o&mO)BxmgOb^ASH=azpPth7P;iEAczn{BR z&?BOLQb+W4nhTV36j#ga7RKb;6Lg;D437$sYmTc=XKQux$+kvCV!X=B__g#M3h)&T zgX2XW?nIOs*P3fIZYlk%XV|8URkP~~FY^ccDmik7bZ}(%&2hl!^A3f(h~m7_?Pqk$ z)`kNrCAc70t(p-ydP)zCv*zl^^qMAOW2kce;?HfzM*qFJS;wXcP6ZC^1^dU8jEfh4bO)L22H)$;sNc0fo zfr7N0%2mM?SI%Rb7 zDa$!?###9(YzrSq$l3BPR74DmQ5%Zbj;Jp=#APX?v+&m^)mNF{lOyj}nSRB+UYDY< zx$MF$U(5`NIICG|lWQg%{?wqRSej at HzAsVokiG`vCH}6cf{!1pJCOFhAU1(Fi^Cw) z7?3h~z$hY+B>Zc(%IF`Jj|&xOjsVXrr=^W1hBC>f#%Z1ho`hD2P46-5OT;!1YWLVY zFWu19k&ydB3LrAm9Nb9#>8@{JendnS~NjQMM z_|3sh;}MT6PX5W%M6Gk?G>OIz(Xb>qodp**{&;`p-sfcwM(2)5&r)&=WPL&e?;W8h zGueoH`_$i#Vb>mD>P`*U5Cm)EVob0{IX6Mkrk5-iqHP?Q#+VlAY61ao?zSoo*>*S1+VZqOiil0Eg z02itJKo>rSm6#iyG{-hOq)mrni|F?Ko0|rF3hxxxU$0SdkbhlSX81>lm$d!s3Hr at K zOKL74=qI<+Bpv=>mYrl+AVEf@+I4C_bUSaU at BH%iUTev zAi~nzb%b%(tC4Z%ZdO;f7szbS7!xzXGEAQ|8jZ}HtTdiaSWsConqVGL;S~&8zT0a8 z-jY*rrfvr%0Z(?+`?`nugGK#b+f;9(w1jf$V+;LZHfR(eL`qcRy2X0&flXav+nTC zRFK$fi_juB|JD_Xh9r{ZGNi;(88(c587YP7tGwdf`_)4EHoC9kBw+_9{j@|sbAdtT z{kH&%Dm5g=o1AK{`*11OQsWMDx$G8!YjBeWD at TrnaL1|C_Ag&*B|KZ|+L0U%5bZ%h z_Bx!{wAeP^6KLj3lQvdTq+6#9QBM9`>q3Iye2Uh2YkLoa;pzoFi8P0&#tU0E^A`BL&lR3Z zFijnAbc-V851`6PK+VtHqZ(!$plA=LPN271?2)0AZ4rXcB&v+ at B7FMW?s0Af;N*;7 z007T_rJS7qM-cu)@cjR6ipy5qlmL`R))o~NC6#P!@>CahgQyNYgc)qEv|hE=?2 at Rt;xM9$#4706y$>$MIw&%PSUfEdY3n#oGl5#pGjwSksgo!B?q7B-xGPzAahksq>)}Es zgC{wff%p9C>Gx!-K6l{?#7lQLn3}DpP<@Zi;RBurR;nr+i(lx4)flD_G;YGh7yx-| zObSsoQo|DfV($Qg)CNnD7~da*ny(}TeFr_lk*8wRDF1|3@!&s;FQ8-6C~N|28$_=T z?^_)s87~24NQ{%kR2(8=e<>%lj9)-n8-(ll;OQ8n?GQ_~;V@$o9HXU;Oz)d9AdG{Q zH~w{aM5#8=hWG*e&qsc%5qe1V*S%8%@;`O7|G$s?pB at _7N&hZ{h5SfguF=y#1fx#m z2eTw$OGxo=#g!>2D;2rwZyuq)mbzGYjJ%!3HYkkk&hlX}?EX2ugXYIRmS~7E$U-p)glcQASD-t%3gijxFJJ*yEU;kKD5; z^9cjQ4C=jvKN!hdV_rh$MzW=@uB;Y0?D>a9v!)3nrwCx^bRpKWwPT;|{k>V at y-5sJ?eTS_&V zG`Ms_LI^52Q}bqq zYevZx=p|C`ZqL=B&xdYH_V4jp<8|?DpIgt>hpf{s(bKV?&zob}Ut9jZWNj$BDz`XX z<$A!oR|AT#xUo4W&5c}NK4?CEcn%N0F?g>70&>aRKxgmI*m>T&qH-zD^wSW!`ewhP zGSS-I!!vUoAE0);)%z*kn8gcM-QFcJPLZMaops(&YCknbY>};oEEEojHp{3OhjCX%h)FuC=*Lg*gAgmk7sy at w`$qS&I=~ylpAh{Q!6^dFbYB$ zA|^13%r9(N2&dN7*t>eMaJFQ|5IONLo!d*SA+fV7*GZ-qSffdE3l1h&%bR9+^iN+_ zX4LGTU5CAt#g3QV*$*;oZ6k7sv`&eKNpC!GV411CJ2fY*QZ{Pr6eahNcjl!#Y7FnW z*P%P2K_hlJgY1NN9jY`1XdaSI_=}V=9%F9dRQ8p-6Q7{Vp5;8TLp1CgNgBUIvGPjL zP_Cs^VxX?C@&5UkSgJBG@%={EkGVr&Z$ndAbK)DA4y{PBOnPJ=q#qjr(h#ORuhB`b zquN~78Z@~ixEWu>kft&zsVo^Uc-?{KsBL!%PKvdG*jA%aD`gaLu3E{dvhOB* zh;?+<&GRlor$KfhnIz0;0gY!3lI(Q5&Uywc6fwo8g5`0p3&@_qYJiEj3J=CS`*CHT#8XfjUsuU)3~enz&cB{9tVnHN1i_BL+Nr at km5Utx6%zj9pk3L zEjD#`6bw;hvl|`-?*Iq`ulyC=SN={F{+J0?VomGiSbwrSWzuDM`Sc}~Jz;F_@;pH2 z#6Mz?t?U3vYtKY}SeUB3ZD`uqMylm1B7*R{gfO@%;!rKl&h=y1xCr;`GN!i?3%q2C z&b1np1e_Tq_ka;2x6)3nI+B9;;@SReTbI0~OhSA61<|JcoglQ4W_eMoTuR;O!3 at j( z4@%y3h-)HGkOlE9SVt>&-b!;>t$XqWNO$StyLmx`y3XorM8thH@{m+!hQaZ1;DGRbZsZ__`7MX}~{{y0k%PRL{UA+GkU(Mmt?E(eoK zyNh)Vksc9PQ6OQnG&=G4=`i(4`I$i_M_ZezkZDTCJVW9hByW{{Pum`$E_}lL`929@}NA4 zzU70AWi at f{Y-7Foo2hQ6Hk%L&eM)aI3U*qb5D^h)^n*afA#w%NcU&N}5f>!oX8H5Q zS=nztf4*@PHc#`7=%rrC2X_5Kxib}-c%q!g=DPwv(*{)OkKGMRZ%1b0Sl1N4- at Ki6 zc#l1OGPrj4*FRzYU=XBBjH1>*$E$5a^Pa%+jr7MICI(Po4l2242F zp}7B9Zy7>)#BLAUnI&wcKb5z=p9TLT#5Y|im_`uQfdHW|RL~!$j)_CE{jH4y>-6H* zQL9OF6cdv40{)&;5_f at 6Q!E?dcQ9Wm=4pkpu%uT!!a#~$HvbTXU%G&mGKYpjhesF> z5>6#%6j3YkGd|$!koa?QE5>K3K;@7`66WFtu`22ggHS&i?zwb$Jdc3s++-gpYW~RV z#a*XIGlp at 8+%0)g at VPuUJPhKSb?}u5Lx6>*)%B9L_l_Ffw4(JTU&A4n)G7dgZI#zj9&+PXdYB)ZC7QR(4W z*{sFY~pb zWvs6-Ji$PCeWC;;GFFH1e}I2A6l}LXxa>?Na=$%)O{xN{g?9W(`PB)^MZZT5w0P&~ zjca!W2F+5noyh1jb0r34j#nHH8t5SE7I8tw2fEpt&wNo at J@PAl+LaL8S at L{uz>gbL z^^iKyLX#Xih6qj&8skzPH=&h#_l0Pq>FO;4m3)5wxl+smp`d0smHgrx`thVJfx-Md z{#_xrY}DKs8WjwT6r*1#oLi|QFr(k2W;_PZ%!!Tw9G%B{ zdc}NOYK5Ok^TZGe{iW&mx6jhAPdF?dY3sq>#>$HJxO82-%<9wL79YAqEcft%hy&Vu zO8WA#%UAimz4|yN7nKKPUaTel+=War^ZCIR4z&EdPTHh<=G6gJCIbs3B6pEGIC;l~ zaC+D+y46=n75>6)Y z8G#@J#%fY`i2Ig?Ztl>!c!QL683$NFwgVaws}Qz*)yTUfT at ae&J%Vmn*CnsG`yafc z<$v~Vz;K5wVQ?2L7OoMhW6xEi>ATsN42zY%|7L3^6ph^)_ZQHxLH;LOI{{l~8zUum zyZ^8Pk5;n$_wtL*O0_mQ7OOnEPFy5bYj}j72sm9SfqGiK7@!YD at l?XI_xQ at ptKuh! z4~p238I#wuD8{TNDz at 0c#!(gz_bJyYS81wlZ|@f{UFa|ovebFnNK^zaN+SpKQL#JO zZ^s3$g}LHH-ztLY1BgHccjXN|blS~JmK`;x zEoB^TrwJoP=PKRZRXwA$7T%!jLAe>h-X- at 4|!OpGxQdXh-nho72 at KDr@ zNp5Gf&BE(BV1Qv31bJV-*xIhnX6LcFP at IXLnbaDN4{!9v>9Yq9U5i~c! z1U8-liA&#BHO8jN+du|I>Zh8yCi9Jdo(7z0myK5jCa}H5LA^cellj-N at pDspJjEvR z#jwR63*eU0=e+Ol=VJSN@(!WvXM at mf;-rP at p^xGAOc;G}apt#Yc*qiU5qJX$p*Uzz zwg at e=O7-Cd<+D=wT6o{7ht7bP#>@8=iDGJ!c5TR2A?7dJkdC*4Lp;&VWg5hEPKrW! z2;Ki5(%vyjv$e|>4BNJCn;Euk+j_$h8AgU}+jeBw$gpkO=ySU2>s$BK=yCh2{FxzZ7|N;h>aQv%lGogUr=lZ zq-3jjBWx`Pjxq?jQj0Ui>PkbHH1?HL%!3vEDC}1e1(dp1+zcXJ4*`UCx)ZF`x*8c4 zv+k1_Q{5 at FSVy5{XzsMH>~m4vHCn88_I7WhaE-oaxG`qX1FZO&uBal29g>Axfvd9B z6)WaxUB`FgBB}~aSPunuupR?@Qze!xRmpIrIhEYPXWsprhu#=cCDJi{)i54%?av`b zr!-dYnv`Qyxf2NsK>GSeduX49;>*F~*l94Gt at kWa6TriVMEjdA;x3xp<4~0IjMYCp z at punXwD{Fl^PBh-5dn>K1YVb)t!Unz-4Ug%_kfI7pu|=$4QbW6u9WIhi z88y%jtg~#5o9jV#iCA8<^tVGqhyIol?pY}|;W{Og%aevDDTiYC(7H=b;LEN_%%%GU zcvm|z=mw`RIJ`W2X at BaYY~a$rt{Q)(oWrcIyH_0bSUF<9SBHgKj)ugLN3=y}#h_Q6 zwGp>^DE)C#Ao;9SlWxb2hG~{#qJs;$pJj3e*-uTQIz(5`&Y>pOS7gQ%wKD4)$5XCMeN%M}_kkNq8k#3Rnt z2?$1h`=P+>1@|a12fIu2O9cw_0 at 3oqV{kRMZ9Iom%sE>T8rEUYE at Qrw3_EWsi(FvL zN75zy=rw;*M&w2R#mC<$=5zBX({5eh`hF}qI&jWhfP3O$njx+VHC7C#JpO~~B2jd$ zoroR~&Ag42(Z6l>>?P6#bSNQ2-59LdTXG#QbEkX*Zg-lR zZ;UCVpfvtU%-X2Ro2UC87H;&4nB_R$-Z&qMbU`dPwxRsf-4nvrV>iuPwDxkPa2UpD z{)BIxHjp~+;jFi7XQLM(Vbd`pwc4C!2wYo)44cB-8U4;bRyw4j!X_a at 0|8B900I5@ z|4AnQNgf(H9;nOcU(=Eeww|`wb-*JWhQ>lEz}T30ApI+cD0sGEh9d}4k~}F8-a<=Q zR)geCa+w@*YY$sTAad96!NXE{zo3H`lS*Byn<^_SFGV`n!k+SdPek4kJ35{xPb}%i z=$cM~ES|C&XSTLm9VEU^dawO~3}I^)4MC at ak@~b!a*js0{d`zNV- at NjtWt8I_gIM+ zc5La-ZdZ|VhK{XoJ^3&PF#+$MUx2`3#)b#-B`@Y+#(mn47aGAHjKO6Q%|M5nEzZ^c zR?Tm*uMZCYp24|^4?qZE?cJJZ3Parkeu_TqZs!Yu%r at d4r0|EL;h3m+X7*yD_oS+{ zf at Wwsh9cy=6 at MdTv00;+I?+W1oVJ&E<79Neb+Dhh;pwc?WfF#r)oJ;PNaD!pgM46y zk_k<(QV!+EX>H zdGVG)9YYgv`B7E14M|+}+}|?s(g-P`y*_|z2Gi_)kS~7ogqM)8=q7=L%=86TlQmQ6 zV-zM-ZEM{LtdC2EH*UDB3vh1>i~DyKF8DM>f~8vWZdk at wzlan$(<+*q at r>GxCT8>zu4MN{jC#w(T6%xeR1I423gk zrLN^F?8Q2e?P55j*@qcqNT;saA~F;slSXzaKU3Iqmh8 at hT=fOh=aqx2sg=FD?wOUD z?9%CEZC0%)c^6Z-t<9nzRO at vtk~bDnsz6SXJ&WhuZFNj#IEsiR`tHChUXlCg_1sAv z`XnZ)5lWj>WAbyC8thNN>R~BLpj&eepjoCrk at GR<%|Sq&F&+}bIP|g{=_C`9wG^OA at BlZC+PA+Vgevwt6~e^ea%!*XH0D?2VKc z?s7T!;)%i!=|xw4&Pk36V=jeAifzz7Xi5*Pc6fi z!xO;C4FPXYQmAf(UD8~Q=%eG-ONnu|l)YfJRA3FIMe2WT1a*UC>+hV3G9><)U#d%I zi@}EOtbfjyI%%XUdqMWY8&pv3iir}|RlbE_P}xp0sWBGpoZe}Ogw%SY-cof!5)qy( z#~Kcg6v0xyWkP`6P!o1X(`%A_qequm8CnNOh=E9 zYEE8ue%|wM>YF_LQL?sHo;a%)!Okv`pL4v{WM{6Xl#fos*sjtP>D3{9xaSUlxUz(@ zEnx&__EL74xF%RD6-eD)Kj~cV+ at Ag271n(lKbW zBKEHIvdZxWg>4(bP1Q1Z;@dLV_PNq6fG-uvqTPyZ7u&tpYGRM4Jqtk-Hh zeiBWPh at FEO#TPRWu|CvbS at E)~;so6XU&o=~Xw)0(GeO{!Q<2tjOC4=Fe{RA9)D6Zy z->>Xkghwj>4)bSS&X-1Do8?HEepjHn6E^;yoNE+!Mw7#C004JjuL3{rFxZsw^tw?+ zByD5%LceaA^f`;^B2{-f9^rZjkHHNg;)Wd8mH at C1vI7r80b`iz(qhF*Wp5Y(Ahg?~ z;D|C<*-;&7f>bsd0=@%6Kmvkb5#sH_G^ErhdZp1vYvnrvAwL4C;ie1>dhk)aW8H0Z zNVtRP|FBZSSg*%uH~;H+_&iM~_?O-jQIDS|d0bIS at 4S3;Q_rRU?C34P#1eN=o+Whjgwe9e=ZT^J?6zhs2 zagCR~lvD%ih7ZJsj~U(uxUXX6lF^SLv8P&?$O~j`+>u}#_Z9jE9ta;)+L+lD9j)k> z?cf(d0!%k at hBJ&dK+;mosB5o?L+ at s3LsA*L$0~MjpgFj&-EsY7`KdRB_6(_Hq|6!& zv{saL!y0gJ1H$9D7f%DQoix~alDsR8lC3g_Cxxx7x;R|yYO+$SJ6{YXlsK!}j8cM+ z^C*Bf<1sg>bx`Hu1FVT<7ZEMQU{zW8h0^MmUu?U%zk>VA`02ItvD)vE%h`lj`AXF6 z<_1vjPrNb;f15j=H41IUBrsZO?jUDE>!iyvHTT)k^#}~|n8k4h(PV)Kn$CKWQ;FP$ z5%KQi4~cR!S8EvrgI+iT!IF!y4WZ?!rp+dLO%0SDKWu>|PScl|MAv=-(#iYq^*f{0 zbIv+x>Kw{((4>9P90o)gCZnRr4nDed2k}r=rQxYFWloU;a{w}@Rp$K_xcB-&4)yC) zf~)fMnT77iWmXqp0=xq?JE=O~pgE~7<=iqiuiMc`y7ouh1z&W4b6Ns>WZWH83iW={ z9dwlv!Q*cmk6rLtYs!Ay5O?g5Xt*aA*YV?@V-iNyKlK*0jY_Akn(Lb|_Kd#)N(7~C ze1Ub&NdbIPYWHa13XOqPPH^K~&7G%E^JxOst?Jy8TIp%A8$7X$%E$Qf*|pk5)7aIe z!p9Po93Z{AHawm6tU(nG16>qBZk!s&qm){}VzxSKNc}L&baB^ckyh)m zqv}V3nhLghcY>M&GHovHq2st;Zpq25S=H=Ju*Dy#YjiR<;D0V)K}9`h!vFySq5%K5 zs`dXR;QC(@HmXy9r^3FLoH7YfGE!QECKRkdi>%6b1Gva&DoBWlf9S+hNp5hA(b%q5 zk$V54Vg%v?LhJ`7cG>|3Pz_c|&Et3xB?YnXJM^T#nlEi#3-41}yXaN{R;+s8ZIKv$kr% zews)m<3M<^xuULl-_k!0pduw>QTCKGsyMfUXuWy{8;}*TuE&MvA+fxTAu+Al^=P-g z7g~EpK3Rjta-IPdz>6e6HyRaO(gt%I8cImugR&wbg3m``IYBy1XF at +^kK5de4 at zd3)9< zse<|^C7;aboo@%!NVKl7*`Y1Ir=**HWYvLB0HS+SlA0I#F#~_B;yXb>DHPKJ>$+{a zyy7%G(+|ych|~(R{l>eUJ~MHIZO+rwk at pwNz^6ZtN9fvtCuOUm68 at jT?O#hV|DXOy6ZP>=wx7UgQdab7+Wrpxq0&kdHg=z*qe^TEH z3RzPSc-(zlh6TrOv!)v4B!BcV!FkX8y|2ypc*EuTDA(WLA8v<4;7kI`#R#v at C#@<3 zN&oov7cf};=u)OF{VgeGKa02h&4gUb*4_xcpWg0>HIxJF0}rkjyO*#biAK}-Sb|wH zTsm2!Z8{rPC>_t(>W{_x<^q>)b1pBf$|6fWZB92zQpbaqYBd^XdY#xsdKDo(HaRN` z_-gHBwZQlKPs8IY>s)Io5muQo+>lPRJx}Wxdom5W^>`cFge>o{=oU%Yp?i?Ns%8ps zgkx6~hUIZ^t6FRDAU+8fbtTrjjOzQ&V>su0FbIA+gYe(Y-^7Pf1R#M52mBOvV>)>b zaySh|+=GG}Eih;W>0(-LbUH-ydU9YfoRogG4cQ+b0&(+|GUbatG^~pZY8j|pn+(Zp zwfSQq3}qP!rv`syN{$w6=XwbWN2jYGMaKBqy(-O>vnJ2gvS~b28k-wji}-CaQVN~0 z9%r#N#w?_!JSb9aLi>s-Hbux!U*3*BJ_V7ZJWc`{FD+VNaY~|TiU#cB6Xoi){6qJq z-O{8LyoC7AJM at bE2-gs7uNHGOvp`PsX6sAKWm3^!ZG1zxG<1%7cKSa$3x`};7_H=PUAXtH-wVY&*$4e$z= z0*WIGxk`+oJkeWkV}93j0B9(fi}yenD%yfP)VhLYXc+dDp{|wSJKH8yyJi$?cOoMZ zZ-`;J^GSZ$(3m at l5p7OAlHEM^`HJJnY(09I<}Co^J#y+oajA_b+;r4AF_w=f(8I1i zgrb)zpK1a!vPV;1y!)yezZL~Ws`SWzBHzrw at bn-B1#L(?1Qo`9Ss^0-mTKq`Li_{{ zL)}LtM%hPAEd3dq_aR*aB>#u?2Wb-HpF*FIaA(5Ou~Z@TxyC#0JLqZ3`iS2KP+xm8 zS7yC;)wF8WBLL+>IRXroQkjI<>6oyt9pW(Pb_>{U5Z?M;o8JhnhGCg?24sZU;)vd> z12IVMWii{!;e&#@xi%z&?D!DeiCwfG;T?bLwxDD z_s1nxH4L<37 at OibRSrnbomLgqRT1>|<)!Cdk{uj+dZcb_2FqwHH4H5^9sGoLkvR8- zC7)$hkrg(+$v&*!47)q}(l3-!z8m?$>3Y&>Ry0Px8_jPsc+IWAPkIzjp4wuJa0b|N zLhk;N*vv2tq-XkztLkBafE52nTqSGe;`(3T|C!db)4&x&^P|9BF>M474yGwiNoksr zkpr>;Pb`2ch6mFomqRx=qtF`IGv}o2?0ZTDd?5PGy3m9Z^7%bUcy=|ec9p{PB_^ix zdYI?DZ}2{EeV$)$e*@KpUw@?akD&b2OlA7 at 3y8olk&#fk=~hxSbVdg_eC0?a1(DZh z<#52n?-V*!;5PB0JedEW?W#PyE8GIE at F~zd1XIjs7zv=RQlZwIv`CjJJdG8qt+R|i zp-dloX#1y%Y@$SKX^|`feLhcWd9ff{msZnVj(UyPZF7l6ntcN}i3HbbYW6}cRMk{7 z&N8R3(>_Ht^tQ^ptn*P?xcV^Zr+mg(m6qy5m-76}nwnR;37iT(6}C<_b&HnCD8d*i zAJ8wntSgF}hBdNy-mq*}d*0-UQgu{(4wRtF;;=5nl~}e$c?A;Df_Jzc zYZ+u)kdsIyc>xBz1YB1eGL+(X(+Nd`m2?QR4w)iG_G^yj6lrMO$cI9%D*|e-O{qj+ zaj=m=%U}vWbwz3Ny{B$t{xa3eRJ1~0z6(t)`QP2E&*y%7Yp#J;N?Fui~LUK at M*WNm=YkNl0UO zS+<0K41-{p(cSLqZ6qrl;L_^S2&3OtN3$T9T5_4LynRPTOFw-WUdDyK=bUXhZj?PS z^amN)rOnxaa!K*Xvrmk%ou?>w)`C$p4tKCG{CTVi*N-s$D(=tKkF$hyhD}b)J+tJp zW0==NaGgbJHYexkQH6!`m==ykGPV$uYc4{IsxS*l#Yn+UIEEIE@@!EN6HxfJI(B?nWMd&v6vK$%8_;;By<&xntk*@y{8tXr40WIi*e~y;axv z;uUD0(i_%~g`n(<-zjf(#p-}E?{-^nCh}1I9*>#e)tyW-eD|UIOIhVBAYe9fH)#iDaY at Ej0)L at fqq$e0j^q=Gu472FxP8 zC^_X1q2-Y$_OHL#ad^dd`Gu>S$4cL5kMnJA`b#p02a;kv$$V4=Ds~5zB at L~`QEg?| zjW{a2?p!g;2B?)vTrW~U+dm*Fvk$)E55}q`qE=tBz at Wr*S14z;q}S;Y0YjpBWD$49 zd{d8tOI(rK&Og~Hg4PlU@~h4M|5) z>=rZcCD6FGAo3^SixItmW|WJ!mzTQI=pAJ7oOkVY=XH)tsz>Ls_xIOuE6_$DqdRG! z58~5~E}}-PsL^u)kOYA)_L4VppN{D82#GYwy(!hiuqQUdsH2iQ z>TW$1!F3O_wr+DQBd^D4OJk?~!V{@uPdt8PhIj+AY54&DYuZe4y z&&u9XMC?2{rG at i$d>`Z1psQIQ8FdsXHx}c`X|pC{&dfLy$V4Li$MJy2(YFWZL83~= zxNC?VUXOdCWl1)c>(*SN-G)c2@}Sh*+}qv;%lhGR&TFx^P^XTs8(?hhWMzG1m>7g+ zgJtV%sLe(#*aIH`f!U#Oyo@(bi#fI?tK3Mx^Gi69XZ2ZVH9x00iSZD-;(e+>s}7)L zjz97!t7M`V{X)i2GNqU%pw(g*K~Mc$tCgde2|M3K%Dt3vl1<-leZw=QYroXO4oAuA zM)N33IEUm`1zUO_JJ*%+XExr$c}c9MG2y8t3^3U2l1%#NLTjlgc^^1qZS(2(1K_vC zH3b_8IC0^;g}Mj}>r%}gFLf!+qI5w^uXU|{T;JOn0rlov_P=3P%T%u)sy#7PS^dMwLaji%RTco&eoNdaff5dk!1Iv~_;MK;0#m~C1xdgXWmJvr~VDTG($?whJt-`w2fc z1TF9!(ZfHNP4`Ik!54{_VryiQ_7a41^QYN7+& z>Y3>~V2vYBT{>Zq%;f3bfNPvfn# zPTGu8iPM#IH_+#LxDR>J2DS5}Z*GOsALudy>o}-%n2pV(`b@|ae=*+dpG at _E2*2<< zMf`J!vRUy8NYUI+x$v-~b^8SRwuCq{Z6wZYW+8Y{+HFp>4iXTqwKPly)~ zXRH0f^&d$G7h~fU1^WaZRqzxA2lUR4+jKrb8qZP%?y;S at 0)X*`s&ez&nKoPi>}DCg zJj4DWTmznnW<2-ZgdIhsu5g5fRD!`DNGahN?DY;~iIC~Qjw8_CsS3?A% zRyWV4&yZVDg2t(DsP-!U!o`SXW@?#nP_m z2f7Fxpnh}%ZEl~Vra2g&$ez)-b1aq{x%7qMr2gRn{yB?y6Q)PIj59pE^BZy#$A2#%!p*Pgs!7xqj8$?{+w9kK) z at h#qFWpmOrO;-FYvb1No(dgH4o3dM$GJF zt9#k^KQujff4K7Ug8%{DfCB+Z{(GKP*~s41!A{u3#LUIzzj at heRXqn3VKn{$hGIp! zCYa{xT=Zm+%d;p(B$Pom=9+3NXmMYh6lnR)Z1Q)bi`o;1+rG4yoxiouuR#iCts`IR zy#L-_;g_{B*?Miz0|E%oCSyZWo^|33e1}FurDCQ7b0{_d{8nV9UuO2IS#JyxuGyzy zX`!$BZRz^)dtd#AuL<<@#xEJbUT&(WkT+R(H at E-UbHWkkcuEucpi&&X+|+&zo4eb@ zCF6CU)_WW}r8dKLf`@8~1`TS3Tk>$~b88#Ix~bN>4(Bz02@@JkoxFmW9do1IWujub z=t^(j+D=(`PgN$t!d!*#yy%u4Y6iVcc=+qh2*4sE;XnGL!TNeoYM~z+7z?AbAA_Gj zk#p6G`y_>S9HWgu#8n;%{>%qUma5}Di$xGd?x$<$d7fuE#bYp?3Ib7_v+n?Hf zi))N at RfP|VKO+DW+S9)8TZMkDs(L^XS-z>5QK|)VV?PEecv*2A9spJ-w}!`d+qbiy zS5LU+Uc}m*#p5h8gW}Di%+IOk&sk7XA0UboB}u7h1mOFAW9G~7bqXCUj!^kZ?deT5 zE}LphgDZ}jcZwq5#fNjMv*k#L+!7KeJQd?i9px?VU7T$#8jegXNvL-g`{!RH7R2q+Qi z-x|328=^91p8rL8CR<(RZ|%pgVOpE&MJ{!e)c|8CXc)-`6D at gT0%chglc2f_EK at wD z*g9>*IiAYRg)5qn@}H=XTsI$(+=mIEszYLf#6uCFf{_Il8W<_X1$D)9@(Rxn&yTLp zlV`QP{{A3&K(wJ`HP%=oKj4mUyzrJC`D1XYqy~)fPyr$WDXMfbQ<+YKHz}bkTPbsq zk&$e*(#OqQ@;fD=Ze66s9%`y;wq<}=Bh{6jPMxQa%J-OwxT=ej=Leq&&gzezmQke2 z3^$!;of<NiTdRP14OG?#al zWO*bZWAlI>9K}wiGAItBcGq=!Jm<#(bCCishF(=i%ut6&Q*??Eul13okA<4mxpwCC zYONFFY0b-~z=%e;h|RZCf>4hCG|BQlX8 z97kkS3o5~dkQTB=r|CUMeE#K@;zhgFf6WnR_D~9%;#?{r={kagjZ%8=^zU=76%rkE z+)$&0y8556Z=$}sX<)^4+l?=HHC*EKx2Zh38RS$?rq~W4_pdBer>yi+nPZp4I&x4| zg240mXN(-dlkbO zCFCslZ@#XI{%BzxLw+lE3Z!F9aLu$8Vau74y9_+^8&G6;hPpsb;vj*ugJZoQexs#V zx5f#UYg`bG9%JOTj1X-*JK6%#&laq#id>N9d zSwOZrN~$zwFD^}oOVVE!no)pZn2h* z5jD-_cNg>@nfC*^P_jgChv`l4X_uV)jl_ at p>uZ0Iv_W^ckz0E_{3Kz2XFZd5{J(wNMb at Gu<~`-vA(qCHiZi8KDdt77`c zo{Z|Y&~$PUd7>6`H2THrB)34@&#TEd)v#6OPAVM{}2WwnBnk#7O#e*JoL2 zMyIsN%EFAbmEehV{4y;i8MxM~JJ&tTlK|?Ef}X~bP7vv>hKIYKyTgj*kszYi807SAeb7 zdDgKM+=~rVNiD|J=ZL68KaLV>^v22%dYEL~9=U+lM|=kL`4XWpa}7G0gi+YRW*`F8 zEf@|HZZg6ri!+*HlH&Ao`KcD&#kwrdd9)LS)~7L~5b^hFev6fBq4UPBu at Ta@RP;sD z#Z`TC5D`u)#=;^8tQg at R?KLTj3G#zeIw_YGK1-`Jhm}=0SdFyk^QLA_W*ll3jWoW} zVNf0J;Y(#JF^tQkX#73q8siy$i-yp-whO0RgzAnkjMOJ1V&IgsGMJ^8-iaA#K%FnD z!xk{&H|;_Ww1zNOI}Jarbd!VwVQ0~bnCbQzaNWQS@~BKy`pCN&1{C84%6_&wrIT%Q z&|vF;9LEe6{VsO*TK4NSJat>#6bZbqz7ns*MRt#_EvHH^3 at di7$SC2Jx3-R4dl1#R zbK&*w(FE;p1 at OBDE+@}p@ zwe-G}Dp at COgH0tMj&aifk$6P(}C-PlL4UcscymNVcf_`=smx>-ni4>y-cWE%WyE(TM&Two^* zr=rm at pkjS_RJ`@Khj+-w4Qst1QjZw58(YU$$*^11m|NAfTc|B5R&l(ZAhAr^k(E^n zbL<5%O20vz#_*T;_XjWbzCVgg%j<%MS9vjRKTRFBlcXDI#nUB$U)P39)aO z{;4-vaTpgV{}1uEK9SV&VQ8+LVXR?jF({Q$<9=Gl$S-2K_!-cxQs0ZkZdd~31zMkn z>sKEM*3J_j;KRIeCjol?P`Xde0lB7#%(80(NB`T?9ud|Nc_vct6Ox`MN4nr3pUSFl z-NJ0qI1La7MT7#1Fws2xEpOJi8=a;C`y&ap&$6+}QIjk#sP3pMNV#AQ;16w3B5WW@ z<6+V#qOl at G!xRA)R*qvcS-FK{=Ii?v^x#dg0_L at O9FoqA@QXVWNk8X%z(^+M2}F>6 zspvBRy>x6YDAtJw at 9{vW_Mf3VIdB$>|6g&E)?X(6e~;?^qt5tW2`^hsPi0;aiNBRP zI3=7)Q56hXY5fja38@)<2*ghjjhnYn3Y9`G+vr1ur;y}~>uoQn=VdQSaM;Nq zL3|COI9uL at v(tNKb<^Aa{qp%;0f?dwMHp9E$(3lTI+Mh_plQom0;~1aL|rtr)@6f# zrW*XKZG!MwbOZA?Ab)XdL3$t+OS}=hk;)Uq2zNDYQ#ps$d3DK^+d{jgqeXOjkVb^dq^2BBqA??1fDZG%qPgI} z?GA4y16<5NjqX>k_cT*&hOjd;#$tAs_58W-fMRuYO_DT?SS_dG%8eh{mVS9w=^U09 z2(5XzT55Bn9<^Ny at Y2J$v9%dHJFEVH0J`XS;`1vjLy0+#6 at oBfsHFTl6I!RO68`d@ zT;NS(coNMiT=(rDFlrh?3|_$`)h{!hdbIT>EP2&F(+{XacswNOSY${@Ypvxf6nq~K zawUyu_*W&rC at fE|oIFtoCl$3Nyb!XzN6$ySwlJjnDNjB6iqI)BEFea%9gDptFyo?b zngKG&_2eWKQJTE)fz-tw`*gA1I^yZCUJy~8KdxaN&CY5$9EHjXx!(nmN0SX|ikNJE z=w8{tt*<2L6To~jJ#1pgVc_h#xT$HrseddmPE_r`=} zNcT#{R1R-J!`s(D5a;5Yr3SFV2o-2k)ml;ehhOrCqKP1Wfv`u^wk9J*_Hf&fjw|>x zr_Jw~gipHF)Gf5vnlF!82 at uH7^8jImFO%6swIB?>bDSF9bNDP*2BUCOA4p2e%RD!n z{C}t{rK+Kzv;qSG5rF-lM9u!&$^MtE_nf;00Z=ja?6fqPR zZq2mTdP9>4;%Y`S)fMBFvi9-XrX*|6f*%#NASgMMx_YY);yed60(RcoZyzPnZF<;} z-6M+B2q1LqSXH2I#8~3iEJzl1z100Y4qgY?)zqop at C4E(&six_almlXPDtT5zxS2M zMjN?>Hu^b=`M%-RG*=2 zv%?XRyHG*V(I;00Y_D{iMKtiFRL)jXy=q`_EG_ttP9aQCJy4G-6#r$RWM2Hiur6$LvhbzJcIG8 z*sIy-Z?!a3;DjH*UsSj92|rZhOpTuXCbL|w+j(7Fyxrh;XqP5N_kF<$1YTZF_E|;# z5KJ`nOx+ZtrgPz8u_}^~adKotE0Z+r>I*hQ$6g4RR7Jm9MLF^+%XCg4ahL9r}u;zs5wgo!yFd0J0u*gWwFI{H*B{TK24Hs2bTtHs3g{J#Pg* zbLYRw&5hQaWs3oL%vJ0hIYJ6>RX$XZ8S8XT;H4m!uKvv(-Agr@?y;4V5nlq}4Arsj z3Olr66fz|BjM*C at 5*hL@*rkMbA`;_8%7_TT{2USjDWFw(1bG3*K!la9(&p*yvFxEo z5AcHRuf+WDhqlq$1x`HBM&`vZ>!bl}8NtW6SA*5Ee?SHPY~Gw?)M-yaQ!q-@#-iYN zvv|Ivb;=gEdqOXLgl%w(d8(f16!G6w0L1-ve8wTl5~?>RCj0pB0m8B|F0twx+WDTq zPtU-c8(@07$a+Sy&(13+Ak6}I`bJik2K(?@hz_?1Ght#bg92WBD4i$CSO0MN+Kq=1 zv><=oY{36*M6muZHQqHLv at CF3+%qaRHfp(Rc)7qLE-A(eut>B&qCY}<0sx%Tk+x=Fii-&}YPfE6b%0<)!zz;l2eCE6LcytOnDC{|VI^?ltHx6&ZBidKQc zF1plKS}|d^L6c@^c|qEw at W)`C9^Ga at 4h!8ThVOR#fFiptl^GvIfbqmm#w z`#eHu{)9rXv%BxK0D0ii*NR6s5sF{$(4m&2wc$uVgTA(8U!7rrai4gO`XP&pt>Lx! zV3$4UJ6yYstq~RDR=Uv;d^>6TPnc$odsbA%+#S)KM8UCwHPH6&0Hu9r`&Nuu`6=^< zJ!m`I>?f`X^JH%{@>7=h68gma6EJ9=Kv~aYUd>lZ6oV1=){~q9981VLsuoq*aCB3v zF8)NVARgy75!uN5 at U1cruUFiaR9e^C(vt^n9{v)YQrbZH at l7#-5?{jkjL0X*1da4< zIp$24$s at RX-v%=j{=vfAm$WJpl(%>O0UEK)!D=Jt4H4+fa<+2sK*)^Of5_=Zt1dKA z{RKU?e;;~m{|UV$JBK+%w2^O2ZSA at V$F_)jE1oPq*|TVGaN_hfa?zV9sB0OIfg0+| zIepm|^^BLemwv>ZFqRxxbR#;5wWjBXhpcVx&u#Db^XJ%HpqLvPc=&hh6Drdiuo*Z! zEGm|wgW_-)Mr?$2d!{BxVWyilxg(|GvYSu~{cGivuZU*Ba|24a}Z6c!AF=60e?Z9C(jkPHv-R=wZE{(|2OvBtt*5fm^A6PkB#PC3c?dhJH$8p zZLB>lkOh0*bd2$p)#4|OJ_a2X={_mF+3wOci8%6|U1n~fKi zG!Skl%!-ZSPv~#dsqZzQRoo+}oi$JmA2`OD z%7QGMJ+%07+R;sxV;x}rweUCgzVZeR%^Z#LjCYY3>52?BnUtChNfm6Iv#~jZD%%>w z*CArCoH;G~74^HB210S2CGOJQU%?+U=lPId$P^mNIE1bY`rFtuS3c3TOO0Vajbq)L z<#Dsj8m0Lf5?s?I=l#aw+(N;!g-Uc^Vbs5329KpC={riPAhhu at R#O_NO+dA992fyD zc`P9Zagq>$c;%)Eiu%y%f@CA4B`t59dH3&-j9JOLnrgbV6dMfNqA3NysREa>BrL>o4wz! z`wBq&RLwi=U4&wUM+Ipkkjy^eAy at +aB(y2UZQ+MhQ|bk6v9VfD&=UfSbvQx&I5GnJ zs~w?`T`zp0To{EfAh@TjAE$d+2{_bpe+x*|k;7T#Aq0orwT1KG_F#($__=$2Nw^~iOWJRm=_=WU|WXm#3FMH`cSLHON1ll?;uYEp=RFbRh&M04vK2j8JlK+7g`^ zPHn;6Yol8FKXa{gLv-DFvPKk^c0b#vyW4laL787{kmPz>hTkLN9{xD5(GY9$ze}!= z5n5l0q8(n&A+!ieYy1?up1t7?WLR9rqZ}^1zyY_24L{}KsIFdZZ|oOeD+b~3I7`~7 zVs^MAcFi^SN@}HrBQ0k7Ne!O~qjkWB1*0=+v!c#aUpO1PjBZa-$TViIfKG=&sm1rJ z69n at NNQr8vrXOfaxo)+rl3)rZ2%r;GSQljh=3k*Elt-AuGV+hx0Cwd!D2#YBIR zGj#?MU at L|xT&uM5_>`KR)qd!44b2_jwfkzfB#YYn4Tf_3Uc@%4m#IaS#OIEt`<95Ow*)C%+s4$rTUKNB1<|dXDG6G$IR3`MU(QB* zPWvFMzKS at szroEGJNpe)lW>He at hQ|nfm5nX3W-#{{U-^BTl54GKXb;f`7S5LH$h-)fFFQbLI-6dI>? zQL-lJyG#RARuCeMVm#0U#9x at cSUhHS9Iyshn(luA=213Xa0- at RQr$fz9wu_JOos3} z#DFj(*mqtZnNxWpFtj3H+8Tn7^sN^6=q~V%b^Xbh1hgI63xR at eoKu*6^e2E!t|tKQ zQ at 0Pr$i_cU*Nj{h_gCCZUQtxr zL&Xn-ENE_|U^>iEyM)bhJYi- at W-WwyF^?Dp7tZ6-anIC{JtTfa`THIPw;TA5!&b at B zYez9Z18_1=2+0OGGJ%0s7a&6lAfyr>Z-bly=jw62m*`H%I1Q>%TZrcmCyZ3fi=y;` z>lx8tL9*l1^QO~(jDa2?cxC)8On(Li1SInBF`BT8+`pcGlbe;9%YV>XvHGU-yg1qy zM at p5ZQaC7CQtliZmg5DR{9K8UT|x%~FluIRu<1#*Ee5H03QNKy-1TqN8#vwHaA;Jl zaLat4th$av;IiwGCl6IcT=6DE5H<&T+5GRm+c_ at o#TwtAk08I{mQb(;t0MJYl=>8C zj9<6|$>ia7$mGjkz&(@kU|{57?>~T0G!<`YBVqhhZg at pDI<4BuvB52{4hnP at m$91~ z%$!P1&uS+0LRY0X?T>I;HkmwQI^@<1hS at wfC(vzbj!)cb*I4)q%WF%0!ufVF;3jU4 zu#e`t6>>Gr;-sJ4rkPZk>HP8+tDG#vYST?u_3F<%+ADZN0SLbmG$E*;k8|t!Mv%ra zy-MWm!1K(a#mBCy9FTG at fjjCNk_@z_W)xm`RPfR2OTu3ry$YOVdaIAMbBvCDVo{|0 z3N7}g4|_4^838}RkfGk;u&pF2J25`tYG6u0=#tyCK44g~k9YCgLxeDoGPTDoSaSl*_sB)1coNwcWx_dcY^&*0 z?8Dv=rnHYJeu>stW at N58ZVJmTnspv7ycQ5g8Wyq6s~9(g5?}nO!;FHvH&72abl-y@ zodIzZ9ni{BQCxB)kb$AWsc6gF#fo9QI7LB%$8?e!Fw<44t1<%Dz?S!4999&If=_r`#4FN>@N;Aga?Zv_#8>Vi z-&hbq*_+Dv6=Tl>Ya2P?H{Dz~Rw8TcZvxlf-K!v!4nc_`ZOk3-H~g!^PGrIS5?uWf z-Z3lez at K2slyB?wCu0eM+MH(euc5ew49RBgbDTFQnR=H<` zzRe{1970T!L3>wI$G+TvZ5$$UnV(Y8-Vx7JXpa4}(`#s9BZD3*3Aetu7cvHRvbbMQDl%YdqZQ$oiJ2wrG_ zcOLI8I{NeIX_g2AlPQc at Wk!Xj`VbQJnmRq}B3tr!GT!pi_?7#V<0DP``Ke?c`{u%? zTj*lQ?&4o3?F-%}mxNP)R<2&9G9|dXG#Rcy7Okqm9F1Kk^_b!hf1S0xm)rZ7g=zK;74NWO}HE zhhw?8SK&k)!4gvOa(QxvGwW75Zlq_?|3%t625Itl+k$0Rb=kIUb=kIU*Hc!PpE9~^ z+qP{RUAFD6`M-1K&b{Zo6LHRsiTsrL=@*fiYp=ayueE~vn9nh8YKSjRcqbyHviEbQ z%KqHjR)}_02ZCYjIgBR|70WBL+3edT72~9YS*Z=kbak;WCu%Ulk46|uCz6<^DX01w z7q`Y-4htuK-W!>sTV?=Fy_xno{2EoAyZq at GC&Ebz`s6gIF}*UtGPJq&5*ZTs!VNUaYo zz-sMtMU$f{_T}_xhUMlXh3-KFj*{;Wk_w2bY<;5(fA2`mrK82OH;1%Z%eyP7G_kH< z$eU(1$ryyoL7Xe${IcGIA|L&(LS$PC#<4M05ltjQeXx9m1=X at Qie>$bFfuNWMILky zTB$3#MH5TG!@^6nJw!h!4HvXY&n3pD78FDOX%ZQvO|jd~x(MRffl897c`9ZK+vtg< zIUZpardC1mWFUL)mtbSI2VOAmYXcl4jqFYw{~Lt<2iZ7tL^sF& z?%qCg at Zb}mHmAX)9e}%fUQ?kl(uHd-R`PLbLNE7}YZc{V&ZgmOl)CG29Qt7+cbllp z-VcFV4jH}wJN^{9*UIG6GIs3(LX2+##c8bY==M$-qvx{g5iXT at 5 zQQ`KQ#end~ZUi#iof!<=h*tzOGfGfoVwW7IDI6|S>8oc4w(x0}m2cK at HcC(gj={`r zf)Q{y3MGI*1S3;n-!42$V0f|}!~&d~Noma-k(Lb%kZW8P;h>G3#D;BxhX`wy7OhW&RVPjvzrsFqR4jDO?5G*B zpJwNkkl5rqqf#nLh*~#Zo?({{c?QX$Y(p^C$m2>}|9wWiFZET*=YHB+%1*aHKgW#B zRce}8!c$(!vZ0U(C4ir-wc2J*mDDDXwq$R=0lT=9kCU-YGpC&yXQI(@E&*BO;39J5 z#34!`qYzgafnu&lB{Lj=qxq;zk$<;NArq~cNAaT+rPMuyC(GK&-J;)0mvDum`=3q!8BX z1*cP1ghh?D_GaYi_OyKzQ&DOC6U>85fnqJyat)@2X=7aSks_fZFfpnw^yCougN_Pv z{E#Jj-4sP(i+Z at 3dGSB#n2oDlbhv`~#%$@~mEE{I5gh9=J3|w!xO3Enu#)C>5 at I77 zOK_JnFRT&^qcoX5lmV9J{9z~NT>)4$OzrVdw+YdycahOwYZ!f%tnasV(Z8Z6JP~Ur zJ;5C(JmDQDvHRyi{`_VMN5ToyK8FFCcSXUo*Iy%D4NMXTysZ5dckj|1A-u$}npq`3 z;<8MJ&^T#32djRQ)ArbPzF4BK6(?P4GEV`hTqzKt{;u*`$?>s(&~pB1*tmj0eR#fd zIzd+OM{VDExq);uvwZle)AOY0V at 4n`g}{meXAd at M6s^Lfa@*Rprovs at zL%9{zW4&{ z!Y1{OuLavc7Cv+}OViVje`uo7RF8dq3THDrb-bf02+q#Hz-P}uiLF{b&M8pAFFfXP zTwOHRUr_I`9yIXdOf7)Hb<;Y?^W^;=K*-$0l<$vbB4%5%O)lW~NFTLg7#993ILK)?Ssi4NR|0$3A9r``!A zxnu|LJ4aFAJD(Oocj&-D$iPo`f(3J_Crtrj63k at Ae5H4CM6qW0g7}#qymu`Yx9*-@ z-b`5bO}3KI)d>5<%38cq#J*1tFnV`- at 6r$prPkL$22;Y95~UXk7Cd32*AR+~Tm!OZ z(gl_=wq2*3LBWU~O4KzgKTzb^Ij6{)u+7r?0J{y3kQ2pB$|U;2#gECs#2F2TBxTMh zV`V~EgrsrFNkt9?Z}@6>*#j$WWhyEHIZJ~3B at 6SioXO)c&qsI z<>66!^wl`%&nXSQ0alNs&S={gI!Mlp4nmk?Gmm;1S97SFBuu?u2EY7Es4R=8$8Qjm z(2ZCI%VA`~aPb`Ssz63x^nu-cnrUla9)NdW*aKmn`CQ6Gou74mJg(#%$5TGR5+MXZM7gsUi=g- zNBe`X;U5iR2yf_qd|mWpwI+%=qNEWA)JKOtBiaSv15mx!{$UeuelBHG?vEFd6HKp# z#I3^|>xfUAa10A!VYbRte#hc#q*!i*d$Y<3v at aWz)ZL-9grpb8&a?Z(mAehny{cZ{ zLdlO*oU;DKUa|Cd_|jgCH~X{1s}BLX=>AEO%Gm_tp-rT(-K4M1^p!BbX76*hQdYke zCki7p|34P{ z{Kp={|5}^WZ~m1j>Sw8|Q5DYZhE|G5k+cN*Ew$e?M?U0$d+-n3>qLs?g)%i17ST2& z|2~{?eGPtvV at r}dMObv4x|L+Ply0zDXC1QOU)jF8?tW=%ZGHd0b%#!9J5=#~H6iGN z2aU7hTd7u`Ca5fzcakwbpT+qP4^p>Y!e at K-<9K%f#QV0e(){~9j$*!(#JWK1N=cvd zs16&psg)d>*<_Q^l}D59yZH8 at _%d56`{C;}+Cg6}xi_QQCiy_;k8%t173>sS`9gJm zmS{A6hJ_~cChIx3W@{`u#7WNNlJ1>(`|9GXdq4B)>h(>8mxe++{P+gNku4I at DjWRY zD`xVxl|Oi^fi{HHh}rbz8S`q7qQgtC8*C$OHb7~tLK76Y;^SYP)fwvlRKMh`OtRC7 zN07VJM&20AFnqaMym+KYZ|4n+7B(=NpFzQc3(q$3pYGUHaaZ-4`cl(YsXRe037PBl zocD)RRSw*PdYoK`#asgdSn-s~lnNNC^@xdkG9V at AKGY7z;gwzc>K8-x7CM|5KL_Qw zGⅅhQnek#bi)KI3?>5NRtEcs0GzAUX}st{RD#s8g+=49<FR at X^VAF&Daps;XE8Nr(y1o1=pM7vzOj#EiJv2+nd z+GDCkRC_Si7W#wdtSegHm%eZ+HI+rw!@+FmI#u{uf1(ZieA$*P&#Saaz`^H+^Vuvn zhQ!}lNU!vVA>7g}O1>j)amaBadla#N!1Qe7G3pnMhnY{Ng=F}`kNAhsRHL_ndmPf< zIo?Ry$EcT at frxxN7&y+i)>vL60J{U6#B-%xw_&cI)np at eqUAi8iy zwec|%ocOx~D&$#OjNP{`pLo>1A@>s)zg23G@`F9M|IGTfK7xWntaVOyTubkwZ zM1>Ek>=DT}`M+{~t%n~gUpAY0IQsH&ACe+R9GqCY27+Puh-AG- at rE9)uZJ#cfU&pe zNhkPg`K1J+=4;97k77+y-M62KcN$i#oIrBZ3&Vu^J-fJ<(UazI#`tDt|+O!IBrE;mB4l2MPsAi3nq^r3i!3BSRTh zX#{I&T}5tVSY9Gixua$d-7RBNxi1!R$cyN2ZNP|R?w8cNtXpreTW at ejTn#yFmsl^n zN?oRXe)}{!TDohB3^?@S-gJ36{`t6hIKy-FKbr)pL%(?%h|wB~^ZHE7m5np`MYq=q zY0w6Xb!<$N;&q3rH{^Kar4)eSr4^z6S+-IK)SP&&Pg7jEuaWiY2-#sgXy(mXdB}`g z#q~TtX&vFW8-QctG=;Bam=3mItJrJcFB>}gv^o&I`qb*j)41RCVZXdJp>nrwiyU=8 z+?hPE`Sr-WmW*p~9ZGq*>=c8g<5UgQ^vuVoUAm=3{OFnkYTCBVz|-BH^WW}y_oFv% z&B8#jZ{_VtFu5L3BG%pw*x(<=WpZrohZ<~E>^0*$928&S8k~eyI?*ZCoD6bVc at _e> zyz+Bju5JgQ2*C~3$hi<7O7ehY25SSmh)j0F!iXNMH-+?f`kyd&rma99b_82)U_2Lg z3`O+s98Z5EeBqlYv1lzvZsa&TXNcDJtX|H9aDq!&?0O+m+(P^NIo^Zayx&5%L2WEY~&?+KQf(=3*#(cI_qjCW==JZCY$K?!D*ND1UDQ#t9q z_w7Kxz~cxp>MgkvsYPT=HK}q|0?=d>y zFN79~{MmIZ7)5O7N at AIY1~DI|f7)}1X<`Ckh(;(U%0|OY>tvmVodqCiY75jF!)0HB z9v$WfPCa+_=0Yn_%##C0){z}m5rQ;=gmPQ|>wRX_VEd^VkYKM#jVj|xhQ3^EUH=QF ze;JQ}Me900oQ0W%({6|p8aUXb(jk0zl%_69+%*`uo1!#M&?AN+~tJY@^8?WTAfz6^HWkq21`V?+hSP#S^1Q4 zq**gYW)9|`C7!5H%}nL2bt#lx>OP=(aq1fd6>|Q)61MRRpQx>e7gX-y-^i%36Zv&y zxgr{p(8KNic*b^ea0+R~ZRCR^wX>_-z+&Bru;=uR_Isa15TAl%4CdlA?s~DMVt=`m z%8n|Hgs*@oTA2G83O62ysds}b#@rKl8PoqEx{96oND=$g9jBC*(h_YdhtSg?Vozs z_Bmpv?yiKUH)6#2SfQ=~x@~317z5D at NwZWUQ#C at qsZ|>;sPn=mRID;?q6vZ|qU{sv zdP3}>%?u0-FqI{P3CgXO8osgM3^d`gIQz|wLELm$0DP?sk(G`naq_zL_#I20KMf0T zl^FTv8g=h>eL4&(S|ci+ucSq{{uvnf&^mAR^x`jo628ytd4a^KjG^t3HlIHv4l82} z`WL*cy$I&o7c(NC2>6U=WB0DqGAyaOH*@)BaqQUH;gB(OB3o0KrK;OQrDfBsKJ`6g zg6lEs8FeG{u0^;Fo)5_%Xx;Pm&KWE+1O`E=Zm&MCu}I%AJIluS&*!(Io(f^i(Py_L zo*IMUNd6GH%ghxA+zTh2y9NY3V7+t9C8qd-m8M`+)Fx)CiAer1x$}F3g7-YHrUWnZ z;5{)PZm(=@hNIy8-C=)r;XReYB)#6LuUBv5fnjdGM1QId7+!x7APsh-n>LC`62$F> z#1iE}`+^GA4lW{G;dp9zyU`N5>lg1w?^hD7h1s?|>A$kCj| z9q9885!VdD-yYCUplLe})92~da;LW`D*fP!Iw%kJxL^kTC<9~;TTgKJS>EJFn!RU) zzTckFViF+r^{?+anCFtDzVq9)0beUs9Pm^(A#h%G+i1L0$g0I@*pBsd6A^Wn8ichP1GfIyvG(i|gX$19b$gvLw zw#|33SU?p1{vDr=b|2gsy_=J>b~=>SFJ4>e!1vN6p6-SkB(c03;2hu~K4ioMvAk at o za4!-45k$iTworoyPDWOq^9AN%xekJE{>Kpcz1%z-&d- at vORpc~rQsLdUwFe7&u}Z} zJ7r$=$&po;LJ5&a2A)R~19D8uP5FJ=mOnvSe_c&%VV65%>Xv9l@(~fh%NjtXe$paM z*AphJ!g08rJ?WuWyTobHRnr-0ih&O1(L)`!UPTqgcZuDOLuC)lH zUKnhtjBV&}4Q_BXw`FYEQ#}e0TKB6rN&vA~hev9!*p+C5#jitj7ed;aIASFh1F>R| zaiJ|b`_iZ}U-Aw*Rue6I`<0<;p!p!m{?jgfNA5w_&S`S@%PHiT2>C%bA4N~Ca7W^% zbx|fs0y^fwH!+VRD-b_qG5*5V6O2D at z5z{8ZkCi6Oe`d7?gZ_fROA&!hvv8BUZE3o zfM+88w)Ka*nqL%cgCLa4?m=X at BO2kz9MkQ4mSRAZ)E#M7Ab-fOZ=5-lSYi0?L$a*k zpuiC}rSMx~tD1vd0PFB3Av9L?jPRQ9Xk4y8rT8x#&r>h9HfdIa1POuh!r;StLP6 at a zTa9?*gS^tH|^Yp;B4wZ#xk7qEN+%*<4_lobd|? z9J<5K!LIb^2Tq`7DxO at I$A$*>KV*@)TDeqW*0rt%&Dtn#7KR=$YZY|C)_=s-R+O{Y zpHmkwJqwaq+oytM&DuN8{=#pOV^=i>dL~5F7%r$7AvjCw4J$Yc;fTgQkV~zXTll-$ z8|PrcWG0IKSgvTww7OlNDmK^u&p?@Lx2h6&;x5&y9-M!%T?>%fOKi=Kq?^j#J-xsS zXMEd+5zyPTZoXdrt at _#}{Y60e#8Fao%tv0V*uN#wD{bGQ(G?Uxl at Ib)14SAcU6`W; z`7K7;Wp3t;5}qcrhDADYCryu%btgYONzrCYUeS99fe51qC{0ahbT5^%jA?fH;Y?UF5f3zElmf^mCsG{CN47?TUTLEwe)EZ7>LCAObbrM;7zX}4%PDj zcg^|>Y&F at dXnvA?cM>15K(DeXP~9j7VKdmng$GHo(YT1l+<5&in4??OhNRrzs$CHF zx2#qFkhRiD3h!a-S{0+(hIUTXz$1va**)@dW^=#piT90?#-7n#rlJmJu~8SRD`plC z*pIfEh=?|hYURTs_teJiE2>#;D2l&}b!CH#S~4v8Ss{CZNb>hqVPUIgcDr0~NCZ0d zo%L#HP<|mTIo}Z!^BA2HYb{aRG}6tgOW-!%@MWD@;JuVN1{9*c1QmOTWx+c_XrGuG z1DSKMj{V4=NbaNqpsq0E`id$Jq(pyZ6Jo-8j^Vwm$$t-%wmG2+R2_P2jXyC{42(*< zQy8TIssr$LVQDS&LOeR->vW~sGL57VO3{H#s8FykWkDYSL44)ACHSXJb5af}WGZ-; zavyw>QtKccS(Rh)v{Px5I>-S11*?&*38Yn0!}1FRHRV(ZQ4T=7K*Ra#+YOUUR8LtT zxJw?COFsBR((h#<7GKzzg;+3F5lm!0#Z*)!Eb;SROr9RmaN;AA`@>Z6!&8;$hrhkb zu%Gzd0 at B868*8+<+Mhnf`DvH at W1$-~TD~e;I$=@p5l9~8nQtVM8?I8goyD5xxpD5()y%LMiLju{DP4Y&uU78AcHIX at eB>r=l=M7$b#hFKW4=)Y7UI znmS}Ady5DtW3bm66nq^4turM1o{Uy(b_)Mu{?I}`Si=s&*uyUCYsLf{E4xS8?jaX= z!&WjNwsuprF_@`Ie${i1o?90$Cxl{@xONYpo(C~CyU02_Yb6`#o%4RU$IR-$T+0 zA53x8FBj7)uQGLz=%`T}s8T!gzIHv^==bkrq4`VeJS6n~IY1dXBeKXznm`XumH$>` zm^QN2I7g~^L1|3G^vnA#j?K&A!cQhXTrui z3BRTHt;1sQWKkSuLtG9CUkQ7L?D0xqyhPVQ_%PWd`kgrrp>_!jL!;MW+$n>Edg at Sb zn9;*Eq}fjP1zt`G+$I;S{$_4~f(-<&%9uFWE`A9uwH1j`pmcyPy0bGLD7+llVQUEK zuGf2a9t^Wo1^uA6dmWYWG7GgJ{Pw0VzW{V4hvSQP!*;DKb z`>(5qre{+1bkrw^d$yS2w8fxlFJWp!#``+- zs4b1#MK$y2viV)W0>TgKW-pM!Po~$<2taiN>kGY|3HoXgPpWMpq^kqesUF_xcS*DE zQg)JhRxoXy9i=mp1=@){`OIc1`pFvmzMTGyfLyO3Em#9o3PVaCD>>NYikVS6XZ8!9 z1&Y?|{-x%5#;HT&l=jxHPsoiwb&KP{{xQBCTDBn1t-FIlO{0NvIGy~9`mXy+;IRQT zSgM*<-RKFO2I`#+dT`w(jBhJxtpFamHJUcT ztLrJhY;iaq9F;L;ip7hiSc_0k(G0z9K1(oX1*GPdUJepY(T%T?K|s4l^%d#8Jd|YE zPJx0J;WhIOw7`~1dt+{j`_b>x;mys<0f-a+Rd_IkPHV*un6AxXhS3OXtNFwxVg*>! z(P(4tIqLx}d)|}~=keGp)q!}uvq-w^wv9=>d|O&8GA!`v7(%oSiTzm$H6}PFOLyx@ z5n4&%2@+ll-UJxl|hr5x2g at i~`yTMI$3$pRdlDA0M!)Ic&{=` zHl(ar=T2v4vD8PusZlT%%zb<>)RP5nxn9vFZ at WM|5+UT41?(bcv=}mW_eHC at wv3T% z_Lg~WnFBankNGt*)9?{YT#v;ynFB&xx_b0KC*z?8@!$I9v0uk+!brXUW>GO$^HxU> z0RnOj4+6se-x?|Y%PHkQj}?oP^<6f_(1ANosddUCxK{6w*3|jVSt~L!H2LoG`l&6} zSw-wMvV+XgChpNX+N=%u8$^8!-$8tgyOimBL3p!A$fZ}^wc||Cy{8cq+qul4UnouvWSFWsxK0;%8joUUX`^zW-Yy^#V9eiUTZ`;`LeazBmk&w!LLi$t4ufEByO}RQ35mIn&!@XDk%emo^Q};YxJh}si~ikHnVA%`sJu*UH1WKG&~7 at h9H(Gx%A|=S^PMjx zs=R_dV=;RDt+v(06Imv?CWF=mN5(W at I}`0C%-ZR`YJKYi^o*Dh7vSkcD{Bi>R6|!%Qy#D! z at RPn|jM(PDATs(*;@?o3=xuUe#j2M>pB(}Devknr at czgXhm%#{mGT$H)Dw>ub$@l? z9YOoqDt10=q8dN&OQMo{W+Cma%8NXI55M}@mnqU6^j70$Um%kAXPpPjnr>eAi@<&{ zgqTgx4beg*t0aEEKjoWsf81BZYi(c%IuBT@$g69BB3aZCs4s6{RJUG$Za+o_#(U|A zx(>54^Y|awMl_U5=+OrC+1k; zaN-AW11#`byr(JOsh+DiCxL zU*7QsdzT0nPg=tww=W)?ep^oLU*$a^A0wX`zeSlcdlays^AHj6JbaTa7E+S^M0D#X z`4f#KumR~2#Mp-CT1?9zc*wc^HA_)sxFT9MAAT at _n;P03_VMQv1dnw<^xt!2v?gm$ z6aGOTTtpBMw*MCTsG9#f_-M##ZfYR^W&B0$E-o@&NPZR^pXxOnpR_Q-7;_P_WJC-* zWPM78F;iVBmQqH(Xtw%u&VNC?Gti~u^sM8=byeJ7UeS`Agj^Rw3Tw-U!{geQZHIp< z_xtZNUx2l5<|qi^Z9|1o%u84oyQkOCb!#{mG27Cy4D&GN*d}yBTizS|6 at U8#{)dOp#~J zL7T^kXE~v!Zy01_Zc4-1`~WAN_6b*7AeD)SPoTn8yaz6eVXo!J+*oj|wC_0Z`c&*e zV0vX^A=!PHok7!dmZtNhyOk+Yhnk+z10nc9gc9AlqlJ+GQW28X<1~0n*|vn{sv at 5! zmKF9t8PPA&oc*;%lVM|KPIPUjBKv_scDoL9l#y)3$>CnHE-a20k3 zKK-JkABXz&Z8x*(v!@V8Y~-v+tuE*&8xm;p>)J~kY7|MzRIdGIIH_;T)~t4NqNz{u zXgIUm9T&EtT@)cb2lgS7YaE=W*T(I#Bx}{H29W}x*7g$nNq;Vj!)4NOR!dWXa`)P; zOttGHShsm2^KlrV+!J1u7OqS=ZYWZ57+p}6B{(Beo4(=|+lAI4zhEEf`0W|47tcId zS>sJ<*j$eUI+i`2<}2((WA{E^N?iycM-H2!o>)4Au!LwDRLORJhX-Mw{HpZyr0qwk zGrqM&*o>uggMtsy)q4FMLAc>rQUR9GpF{=XVCk&VMI1wT#{+^szV4`(v2&-(YY|T_ z5f3bZAz5qY;Jp`hUX=cj!PhwOPyB=D!3cI2EJN|82c zy+Zx`Z&anC;9Ugh`W at gcacs;LaW;s+jc{d;0*C;9B6Hr42f=ZRfijH(Wph-youACK zMC4fDZ+U!}w6h at dMFPWKczC&M!knP at 5zsuBwxRKFAPI^@dz66)qfLw{>4Xk!^>sf!1*Nw2PNJdPpcX5kn{twEJZ1UYF?|GJ^rlR{ym_j~xt)0)%Dntk zSFkL!AG}o%ku>yhx4NGWRbfaatM&Yhu?0`RRr&>7<$U~!n9-Iq{q=7IYX>bb^;54mOs8PfP;6 z+-^fAHH|rgrSP|N$|riS1 z*UdjfD{a&Ux6qS1OcJ*z{-FS$aMD;BshOR%Y|>a8i4NdduqTVC$ia?1(lNl&wvMi_ zT320*NyJpjaM*FCcu z)lMneWz&m{KxG4 at Nb$+$*sHqdNTfgD=oF{VYCF}%Ik;|>NZpgDHurdJv2T^nUu-bd zWlt}$YWFs;zToXT;GEtRTV~$C^zcEdH=HDN?nHO3I)b^5>`B~n<>abk7)xE7k at S(F z{nFBHL*PjUj#szzG(0C5Mfre^^q|!qZeMK(F;3*{iKLYHNizvtX%`h*;pzu7?!kI^ zO12G at Yo%NPyhtkoTnGnBX21)3w%FvoY*oZ0T`v)pS>%E3gBHDmKhMM65?ezwN5z_v zL79!Ti^XrPLx4E2+8|9-L!A0L{l#{KR at fPkc+)2 zn at Wjr%(KicbK>52dxP&SpP+oAk~BnQ%gB9-#l?J`BpE0z z_r?aP;U4C>_8$TgXTWV2o&9_g!wf&-*6)vXNv~Fm(2E)lrN;!kH#xr+NsruiLT07_`P+ z%yGkno!UdFru?M#mGZpRIC08Rq7v;X at AC-sT_ijh<}Om`f01k=y$hGT_b+@^P4GWd z9QuW*BBesCgp;QT`AFj%WEU=oF(+%tm^WD{)F|O4p`JU6t6XsPW2(&KcjD!7t3i%~yaCt&@86_5 zg%Y%MhdqCEJ-KjSLAtxeZhDf%irapVIST0!y!>&um&$hRX34e=GhD~mdO4;gqz;)4 z{CDFV|GN#u7)THh0P24wWtMORco+lBtQ{=>4OKMteHLBOzrR)&9P~%{AcbA!3|f#h zO1RzV2HQbn-MZ}6LITb7FTt!;5?q;;gp=TzK0$tg5IJ_u;rZVFOVxaTmqk9kQMA5r zG9Q)w>EbUG#k&5Yke8l*W zi3wXdo3`nF__!(Mgxi;N+$;1sIn{{nPN}p7{o!SG&V40OnPOQ3UX;=x3IiG(&Gtu~Q zWQFGOMMky8(ME_+3x-|y3JCrMOnDtQSG`t78u`#QhPWzigFN;qbQq_w^?iY*aP?_} zK9{sLd5TJ6zkLG-(<+4f?|nZn`I%LF^~qVjzCvNb3l8TJeXZp=c%+PA%@y=@^iw*# z4u;AOH-pw`w?MSungYs;@zk0LIVV}$JjFhQl2c7=Q*SYP>-bM&LWrw)ZcYKmnQ znjKAZ)f(Cs6NR%5PY z3gq{|lr1|m6Ve#0!!oR9_R5P$p6cmEZKCm8|%(@q@;;G$Mw(Mml^B{ecruUWnCV z)ebIF6xT1pTx^%Nk*}&5l*~J0tp|H7n>?;UkX*4%m2&S(8#LA6+uHQ1Rh6J>xivtW z#_KF6TDPz)g>Z-TCDS{xX^ARw at t_ebtdMdZO@ZdeMT3N3DZ;2C?Q(@(bw}&OA0Xhu z-CH>g at 5h6zy=P*5O_&6bcjF`-vd|$V8J^Zq^kdLt8ir4Fa(*+f at jatcR9EAqoRgDl zr7XGkbu5Rog2Vd&Ak7^viu$Kt8J3Efnq;(gkeg;tzl&-QA at PNU(ijX9_T;ucgvOWD z80v&V&#YZG%@m+MfcT4{eoNk$agQ^F9GxX)!~^x3bxwdDHtX`xySN+Y=eBFRUG@!o z57yeEg(dtY0%qn&o;b5tNKY)1&|E6QY0}~0{AT7Or?{fqxl9S)S}`MYC(I;LeY(p?yq_>5VZv zP at g+9@A?8b(b1fdtH8i9R??)Q&@=`q_zJ%k at 4@wsb>Wth2uYt>ffn?Uo<&g3Lj6a{ zQcV2pp4(G;4`yCG74V)VZNqcb1VDEh1>w~LHB(DicbVOpILZS{7qyBlM_1dvr}Ody z=~^=1z+$nu>k)@u+~tJrl0r<4UeRLAX?HUl{`26syJPYv4#IVU{vM9rg_C1D%P-6< z{*J=J^DaIV*7ryMvImC!c}bCvw;i;c?-Q1jUhHOu7og>%IW(Jhn5V~Ab?>1%Enn6L z&Sv&f_dri>yu#lgGt$$KAM)ap?{Aa)Q9|<#S4;suzcMVk;yc#&>CA$GzwF at 3_|TPF z;d@s~cNcgQ_OCz1-3XNFe3Q9o1#zQO)8xX0Xp zjVghHfcymeueSaEC%7w`*!=V0|H&g)mRB4QLeC1lH?9tX`IXZJs*ER)ZX|~QYqMZQ z3j9#vbd&D1odENfWlHnBg?=rJuAPGr=P9It3qpCgWd2X5!Y{X5okp1r4sSsyo7a!b`v(F#((utH)@(bMPr?A$z#I(>`Txd zxFSrg7xY_WX+Y_9hMJB2+n-I;>q+V&{I3|&cp`<^pS(tEKsnoa`!U}dULe9s+40FC zq+P{~NPwG2T@^XnG<`&JMph~1 at G(Lzp)@JZ}oS&qi^1KquF{c!oPcc8l<09g74$M zvjkFaK5nRXzP_HgK^Kybuq_c`*=aizmXaG(U`6B0H2Q68dGZvc4IWFD9CsUc& z;F`Unl!#(>hU64e?rAGpq_d{1CDULXcZmrFTAPX;J!SUh%wQm(t-T!VFokdETpGdk zh1BS&C at V!ZAr^UZfM9U6*qSC~HQBW)nv=VtNKJay@@`Eg&J?qtU{YIpwV}*@eV(Kx z)-pq%3l7Ft!ApmepD$!do2O8I((jBNTHe?Lk`KuRSw?5)kn)FU#+G^<@)ewi>jpWP z at HnDb$s>;_%V&*(O$8$jEfj#JGd*QV&CYC}+km|Wg56X>dv{F|+ZupsJpYZOJuE87 zPIMFE%*>bxbWu_zX7xqx(;YDj?QBs#9>V-#JLN|zG>cjVdaPJt4ogOPs$;vCTJkFaR{f at 9GL8zByXson&c)#cXx%!<-#}d|drofQ)O&Py?B}Jf$$B5p zTYZRL6(Fd->>5Eow5^e95+4a|vN`WGq(3P%A{XARqA at X+7G)<#YKuq%4eGyb##NvhIj(KkA?7;!h=^C^oT zOEE>;D9aiC8-R;NyBH2^-_QqeDUZe3sOK0j-t%b$#62RkiMJF;3?t2MT8R|u2xcZh zW1RcTJIFhb>7V317%mu}ME|KZFS(5hq8;G1!Y~GRjhutb6l;UN#xRDr!^p?;7V|{* z7C$9p5i*JAbWd0lH{seQ01A-rgJqRGSVC~q4RpG`2}sSKxqx*s4M02P2VeiD+Dh{IBGnyPq6Q5E~dD6pwNKjRe*@QK*y)>r3G z-<%38Yiz)qkjs}qsa>6}CO#oyQRlKjyQ(%O*giac+AXUqeXzalox|;0iTGa12rO0U zujTwaAN)NyPxJ=YX3Kpi%r_BG--fYLh&~OD3`D{wGpADq$tf)uOpa;OfMm%s{@RP) zg~suv1`t#@1jPk2+2adP;FCa0jvX4UWjZ5HW|TV&9`m%>3|?2lWEL{^KN5`A!;Rt& zME`;CPX>3L1F>h0V^PZ3hJHEtRbaPtzd8bA`DFV1lLEsJ+24H%*-@ zLKv;)AqmFu&0JyKU4F)zzM_puLpu!&3QvJ1KJgFSakmskxZz)}JE5KPd at e48CsN=K zk!7zMpHbX?)EKmX(HW|h&$PMW;_e|d^=TvA at rZWA)NmDu{>WDmL^h&W*=@@QbQS|T z$^14Lel%|`lrFi_E0;z1eh`93luWKj2JGCapuT9CR5TG2j at 5p zy1w{+(GPwLX!?mar;uUymA;Dnf@;>XnZD%_>^0nN^qE$2YlgKc-xv|O7|muJ+%H(L zm$P=can{SE+LB~wC1{|~PTaO`2*i z8bHRGC0`Hgdn`Y^U*){~+XSeSDzsY*a?{9nl9~XeabjiU#z-+MinaTY1F$2Y5dc%?bqoHo40G7_7e_~JSk++H#kmmQLSO)Bs+0vZ!tU!5?uGG(nZYGR& zPLVQ=We_m1zg|FD_Mf9fW~f3s%(FS(_g|H>^D$ZT_mxlZOppQtXL)3cJx z*YnO-ISZADgdf2-4H^=4x3Kh> zS!ZLrn>F0=2TAMq#ijYDXOCAb4B#_KS15#$r}w~^qHZhQ6%6jOS_8HY#ZMi#;1pq$ zmasjhBI at qg>F{-Q4tvN&A|z+ia<#VGhWlYBb?F!O$J1#N$X4J2?hxG+iA7NzjJ9dUpnB-QgSBnp^6`q{=fK&fTt+uZ=i0{~SQ;*?I%ZA;nH; zCAN}4g}&yJ=%JiH_=RP%WY_% zdC!(FWctn-4(f(npTDD;x~WmIOTG(U*7IBUwLY5Ap45Mjcwt~MR~cyxi$_zZPi zAr3bJD6F%3kZ9(JLVK`jqzY7;RIOX(Qhr~J`-6YTD4=#XP5g4g^lPfsRnaW7#x1tf#GW0 at ZC6r(An#8fUY~rdgwMnNGgo at liY^$%Fwyrtk;lpP=G>f#kVE=(on&#iM*f_rg-MckgXfQLrm>@NOkzLD0s6vdyC z`TB65Pwt}3-}}tFvNLT~n<~+!`PRFRG=!F?L0mOvEekp)~2(H>)H3U;gl8 zt!ySA&Ya|5$*Jv|d^S(-)!o^$mnK7_2$N3|Cn34_#2l;$l$({VM^es-BWhMx1^!S? zx;cpWdh>|I7Ej%4g&NRYT-IJ*+CiE%@qbl|_dnAi~W4+5+cUyC0EM`&iJc zs&?rU;rR~idX-1-47G-RczX)BTfADaX|pYHoMS6HVMUtJ!W at 2Rr_U|Y?H0LmX5ima z<+}E2$^QR*E*i#mZvVq^DO>eF@}N1L_eVlF8I-6)Mfx$M%WT?+i_|cRRf;0}0>#=L z6V$F|c+I<{@wwryJ-JL%ZA?Yv0`Z*1G@*v9RB&$;KGy~j81KHnJY`SJX$ znzL5TTD8`y>EPfudV=;9Q_3tP=9 at ewR&FqS2$C9!0_c&LW at 3ymW5b} zJjx``im_PMKzAK>xDUBKBh)N*|D|P52`cB?%3r#C2mg1S2min6^1s^;{$Ky1qNji+ zgw8i_-({y&oKGB4c!Ikwt?9**`U|81rr}jEs|V?#IBqq^%H4wLoko(8oc|f at U1^A? z1fe;x)QRxXf1=}f!^h+JDKD=VI&Ru0OA|P)nVnWE#rk zWxz}8X^rsgLf$Xn81d0|5DI=g#rlp$U|-1E6kGSIekIZGFJY1vUhiMh6CFdd8aymq zMa3co!nUXxT3m5G#6%F6d1s&EQcPDkrBV_SIMpqf6IfpZmDe0eS_(H`JuGkW1RW{i z>wHFtuKIv*SPVE at A6LhJ3DceHBB^Z;{8VMRMze;`YRbr=>%>RYLszF?4;&f)Ijaic zjYVaxm`$Wp33x$Ne+!%-6VpmQ$)SMPM1ec-St_dzCu=;6oM1k03VItf?dL5;jrZ(qkwR?lq192fD`^ksbg?X`6dCnbZqXt!ZnEIzHQ(g`mak5jeW zE7&}azH+uZoPmem=|Rm}JZf5wwVhYTfATAp8qz#{%a_3@&z5{|5;CGyZR;7N_Yl_o zQ2C>|E+T^qh+(43-)<-SVL(u0K8q~afJm`kDcP^NE zu!I-RDkc3x+5r2|2*@4gHB$-USE8RE+4{9DhD%2C8Z=VqDC!<+toXxJNPPEkD>WRH z*-gsamT`_WvKn??)D^;V>;cNiT*dcr){uM^wP1!)w%q5HrVa9&t!Nl zkKpV2D~~)@I|VK^ck;E3bzKnxH%8e*6iaUVYCMMIK z1IcxPWG^mgfG`OUNzYyUd<=A36w~@dLTCWct}syMq&i^XC_C^Yj1 at jQ7|m00K&l}I zc1^@na{zqGk~5qNA-cr&y&xS?GF3cGDHj-YSxXzsIFzWy-Ju1#$-}JGsChv zEZb`Y&f}>vzJgieEZOu;9#;dpK>IRvuiK at HSNsnSz+AG(x-coS&>Xdy1B1(oCvx)y zL#}9*g@@3=9oxjlP~Jy_WlQv0-+tG&Gs at d0HuvfVYN!@FXm4H2#gygN6H#2;rCFfj z?Zv5+ at Vm@A$QFW{D%{Hxlmg3g22x at posqP+QoZ})dB)U`E+sB414v4DS zJ(M!Pm^SFsU1W`Lf4uaw>=!JmjU+YgZhp)xIZj4IObkWv^f~WMx;45>x120Hvo$Rv z;bHDhE=GDNn=7d!3ApzX#H5!ksw%G^=CD@}VqVI1E)T&EyOpQMKl!Ir5NGt$?IZC< zXwr6-)0Z?(1E*zZD0$fq1)q{|4;Zt{I=?-{ck}GO1yqu~Tgn_eL~#e$2d~xf`W~emT_!SQ zj+XGfzI~kzK6j90Zs(!t+t+!uL0J54q=+UgLP|`jD12Q at iVMLbt5x>J&5EAVISt-# z|LkT8?LPpnsE>2V`st*hY2?U{VtCQonE?E(P0MP-akk<`v+_|#e}QfE_-w*>-Qrgl z<-Mf$lF(ZN$D|LcUXt8oayQsWniE7g?~2j3UZ+jmKWEwLZV}C0m^VcL)njO&)aJ0Tljo z)oYIfa-_NfiEk}k7r5@%W@$kt)bSp7(}mt9FGT^=XGVO3kkH*i7u$pG-Jt-_to>8& z2k&rxUGr)GH2Q$)mJ|Llf*-x*QYqPQjN|e|mCh?|&YDa1VM(LE(@ZZOleW9O)_S?F zw!b?9D4rRf)!qevLj_(}+TuZEs4*mx>t;ORGb{ZkWmMxLo+roj2|xkxP6FV~tt z-sU(`;+fDEF80|LI&!^YDPo#I2(1raY8v_Q%;ZRN?d at wt)0IhGOQGz<$CRk1x_7aT zH#F5&&#=M1RzGe0NA`sL5jxGC8wJ@#5Bw z{jy?u1?O at 5n6IW4rzTI^z|&LD{iJZ~@sk&dEBo%9k#F!rzURsLYCm`X&#`jW=f5aK zj;=^8GB6Mj1gL+PrKDo!Y-MC?K`Fq$;_Z{hzkfs_XJ-O6YoJbokm( zLgHemM_E7y+S5f*Ur5=FDEllqBS|nu=Acw%UF>U|oqOBgH24*{gqL3);?g zkwdISx6&}w&`!z(EM>+X}j&AK(kywV&Fyoz@9Dx*#d?Mu?v6tjwaHm4(;P7h03}6=EKOCJtP#oIb2DI6o zT_o`bKsy4;(MMt?$91SD+m21`P&kW!7P!&S zEcb`h{Z-9iOfsq}^Q%V1DSc)1BsLUNQ$$4SHVz?LBtk#;GU4NPXCU!Spik?hYP8BS zp^C7Ht;I#TpUrM)`n&kLq9oa$kY{zzQH-Bp#2P{^DByl- at EVW=a?tw8z at OA68_|%Q zNX|B~#K>)>v|YT$Hd(YLc8RD1)5iGo=YEqkZ-}gylrh%A*A_m!`01tp5bCDhj>XKq zitrIxN4TX`R*7nxa%yi_}`a!Job{cHRq% zwyTh=3}pv*&(6N0{qx$3C)x$8{QGzN_hb0~vG)G+ft=VFA=rLKWU(*H7Hv38g&kpJ zj<8%Iblr&P+#f^8Ds$j#r~O48*B}Ja*?VI-EEDf9*T;aZc#5CjtztOEg(agLYf`qf z%3zv=m({s_(rOU=^~SPDW!v;SW;7iTI{_gsF)&6Y!ep}0Lsoqj7`)Lg+AVwG4I?l= zihZu!08Wiot|BAcjgE78PP{4aqMDyD6Gt&;yE=aM_0f!mv5W_NM^c<3IpgC062qvu z_;bJw0|F9``|l1I|1|9X7&JiR%?Dir$Dg8WRmz=$6dcr6^2c1UEqh4voUx2B^}$>% zOkZL;CTxieb4VbdxT^_$FSHT}s&=L)!=T+RZ*j-{|8Q}|>?*b_wI z_e|YGPGF#MgFr}qBS&;iH~ZF#HTfJj^IrQaU at ROhbNlswH|yJxG%- at 1jh6(a`PI5CD2cWA at FF-HKk{5}pXn_eST-JkW8Ma;k?*D&*hRr#OH)q3YW%85-KnDx6XGGk zsmy~-2qz&v03*`99&GPYClp;1Y;t2cEXvD|GRw0PJ7i)@jN&(Oj=fZY!c^K{iW2We zT`qgFdz0%)ZBDI;iM at fvk9^6vhp*#)Rpd&^p1~Y07bVK0BLbe5><1xZfug!|!NXaq z01G9B!9Y{)Noth-dURbJwAdP*Y$eLgIhSE#DKqBUZVEc~keoK8< zh=D>1I at w)b_XsAbQ!PuH(pHC5uvq zs_Z1*SBrlx?%DUg^OUO8s$Lv4&J zmD5#8!8qR;qI49U;(m+}N49+E=0p*nP-*||s1>_O zeMRh;!=KE29kvlX4UvL7oTSgVja4&oQ%UQ at fkC|RyDj>t#2@eZYCQ9j_t{9WAeiwYOyP#$JuoulZfkk-#1D0F`n_s(OwBE zD9EUauCwi&Cy;>QDkeUMwnxO2vaw?QDk`u?$9;zY$xa+tiHGyM4e>m!2Aq=G1e6YV z6+M!s?^_+W9F$B}$6LFe)J&yMc(>xYWIfuRbI77uQ3jUJWco at sm0>=jKI#Kp-K9pj z$7;GW*EHR=dxc>fj#2|z?bU`tf!-y%%k9;>9G)@*4q|nL!MIzP0FUe1C>mH$7rr*O zclnbKf;!6;m_1*l0L2>#gn<4$uUPs)9|R at d>RpECs$ZX3QN1>vgkOsFkKCw~sCNqf zjuU at RG&1Jk?6)>lMB;C#k?pM4sX-|&_mj98<0$&tN3gzf-a_p(B0Ar%Go2;b(K+6< zc(PHRqwOtn$M at E0NT>IIK6h7+X}du at 0MGnii=?f)z#5rVM|d{s+pi{&nz^Hv>$~^V z%n%ee>U)2+cQp>;8_2i36omjdvcJzEY1g;S`^omu%HoaoMEYpfK at Re5QhX~*GQb+a zN)=M{UFhuc5%ZqAr4Os!i38P!I7jbqD7 at dwm+`)mF-QeRf1`8^9Ud0TyhR8f>`!T= zi$Az^RIastT+=ittcBU-)1;&T##IKv99XL!J0>oa-RS2maumcr=^S?RDVC#RGTeAT zMafTf_}A{f?qRYPLF|`PQzZ?%$hrj&ZvWW4C?O?-I1?BlA7GUE3T+lwls&>dp5_N!;m^+w*Nsw${60+{dlAs6GjF7k&~VXbOn zJ64fxZ9EawSe}nYJA?{1;0eP>YsqE!gN2f$NCFCOpJ8VQhGd1=pdgVfmUj2qqrOEN z&xkt()`Z(dS9LY)l4e4iZ+W-*rb2z#2fVOW>a|}nr8%FT_L}c3%9OmFc;Z!FgJ2p$ zrQQH=kfh5uv+MeOg9wdbF&RVX&Qs<;V10uW#eUFb2x^}TiaL-Zqtu%1Z^gvcIIn6) zL2^v&h+j+bv_EkYA3%+y;`XJ!z_K^9Y2H^f{9#$JpSLjUlFQR3|9zD^1R5<^*rk|w zxv==;qEa89v8C_}rIBAccM#f4xparUQ(we>BT}i~p*YSk0owOxWTycnzhRT43300# zD3)&{Yn#j(+zS-!wG~wG=4c4kp^6 at T9wN#-I@(JGEq}=@=Swq9yaEe$qsr$mQIuAt zY^tHMMzemTJa at B_#YQIj z`88!$(j20Tz7UMWz2gW$4^7oPU=UjdD(Uv^>C8vdLV=7XGeYlz2mAt!<`pJy(yLpc z1lZa5`uky{OsxD$4FT{5^N%Ef>55^{uIqjQIj8yjztP-qA2ZxucmCeUHOuf; z5pNB~UaKHkDhhI9XKo_0*0`Byjyf>jh#{37S{r#mx8P&mVg>lHX#JU-=~_;}aI)4S zXq^i-d)kWG1ZzZo#GG6uS>PIZHOyI;sG#s&g35?B%VIEmX;mBJVg*cGM%h(O?Ur&B ze_1c=khqImAC`J&xo_{DbZuB_Fqc(?x0hbl8R01L5de>Em$a&A zj`$f+;9L!MzL-{dfm8(PiO41*D3k)dm5f!6 ztA at LqhmRYW{8(=sNOtKFlctCoVr%$NIFzV^#DXQqyl#u>1buAIU{X}0nLiv7 at Zt(` zoFYIBqJZ at 2AzoZ>6Di3>wH^uyebRd#uvk-SV at Sr855@x}1#hPb7%q1|HW$zm&{2F? z3u;mdvM01-YI#WG{`fU~NEI>_0+ila-Rd9yUin7}(+(k at n^V`R_Mz52h<+8u)`z(i zDr^l##_L0f?l_2Pl;OLEM9~Fz+Xtzq>ha6I=i6Hd6}e=c7rC>i at Fz({Hid#N^vbUC zmbu+-&Yib20lSh zSQ#MLp4LcZlWISQ8Ib19bn_2LaLQVsOk at p{HZ#25^dBduj+ft{ezIGWS+39#$MfO8 zaaY3QaS$Wl(22C{@^&iJl5PHO6L+En-6mkCfY(--kDGTAZi%J2EpUcV-4r;&4uFR*X1xM(3RR z4ZoheY*;s1=Ly|kgPFLrtG3yE+q#xnjS)u2X6X%sj|x$b~24BIVj2M`zV1keSxd*3ZvKLatS!*o%Z_E@$qpy%mAW=jvjJN zD@el#Hq~&mQE*5P znkPwZ*XIbi5KtZyaB!a2GRM9|Zc1MxX?C$x_Dg8g+V7mVMpj{@f+t$%V#S4LkqYPt z6ryvsXN67OvW?2M$}!%WOc}8z_TL!~Le_#*M~@bh24bZXW!GuzZ+75ORo|)eT@|I8 z6)KLoS1GZv%g!1tHci0Mhc)D2dQ5aG9Sob#7kku?bzGdpS-Dht*NT9DtPwT6tWvE! zC^VB4ml}g6Q9}YTu$3Ev)WRxwR8&!hGvP|`c8VydA(0;rJIjg5b$uM#VuuQ>SF^pD zB=;Td*0%(RSs!RT?)19Q^4)N6*Q?jor8=iS?v6d at h^qX!1%47%bzkD)hre#DpPQqQO&`qX^mAqsxEo9m;YJ^MC!+8K;vmJR8KCV$?}^7E(yP zH>6X(^pAeKV)E0Hve+i+*0po>R+VRo>~AncA+KQ1N)fBYp!9+z4-?%t6InSKAD{bY zWIz3Q9~;6RaCsMOOgGyc2L{04*!g(x>w(v#xZNpY+^BMpX*@;>m3#}$d%m<-s`HIFdCK8EMhDWcX+ta-7b><1)bxr>9vx;fXf+P;Ub zgFIoA2QdcMnofL?@e_u*@?Fa1P88#^k1>6O>0YT(waqX at DFUT}vjWq3Ypm3ZvlYx8 z3rQkMvXd(Vt>HN!T at j!QJ5VbkB!XykVX?g$uruPp1yUD7<5T-)$2V%nH-sfcevpjd zd^KY3`JTDa+4N6Y00HhI^e}+UER*dQi#^x%7=(t4PT8z=9{HDC{%nU-8IS1-K)v3g zv0*`%j$NvXj_^qzKoF*LZ&`UCp{dz6-;BA72Q9fxTC7M6XX*E?>-{Jo=x#Q5&Z6D^ zi*JJiPLoJe|2L9j#4-Jnl6X$)!jFp`OeR%KUX|)!x+DfUt`X~`S-sV$>Qdb8BJe+> zeMkvsk5y_dlr%qJ{+SL~98(@aFd!iMgdiX^|5G~r2N at 1E-(1j^F+P`;z{bynVbUqV zDF+R8Qma>_L}IVXPe_o;s7Non5JFi47YgWB zyxeZ#GDZz%rtS$(dS~Pbw*g)H89NP2XqiUZK1Y`Tk7=%_>?_}=4Z!QQfdc?4AK^;O z5xxVO{8wFQWYCG+(r;m=Ah~*AJ!#l531?uEvAy(&p9p*}&Th0rWQW7 at 9*<`;q|SAE zx({!R3Q9H5is?g?E_YBx`1B8SPxKYcNM(-16I*jwB|&YQDo?Rb)t0YUaXQ5jLKeu*Y)0i z-U%Sit03a6w=Ni;b}?yA$~etb8$$Ueaf)1?II%v|A>H0nx~hPJ|d z>YWit?>9CPKMEl}VI+cVbA(3Ts=3JV6g>xo{how5%0!n$B}e(ZgE?IhZ at AGcK_25< zae|p|)AMw63+HMTLRN&7!9~JyNP^`c;_^=Fogg*GlmwOBSl6^jWGEACplEL%O}~xFE2WbJGR^CYVTBT5=v9; zyt=Qb&B at EIV{S`00YofpGBIWL340H;)qJ)~9R-X5U<1O4<_7nqhy^90AbQNdg-v&I at fDSjAQOizBK(g*WhIr=BF0YKX5Ei~vGi_>S zY?T|HiLjf}sPSh&6f0ub4HQPeAO?m8Q<*V=Lxm^aRk7!LJevNy7mM-AU7jiH2sY=&YO|d^rx~8m|iF`T at c>^pIHNY0b*T5WSNvn1pt_KZLv(7Z+3n6&VpIXUj8%s6|;(9#`TKB z>eqd-Yj4|c9?`2--p9TXYR&3+j}?M^(8R$Gb!ZrExwnjL)e%&Q18zeP+`B8U6~>|f zWzht%Eji=#J%1POOowHVt#K}G)i12Dwza?$39%!IZXV3AA{r zu1OV!y)?l?Iqt;!GWcT{G2N4y6FA6rZZD-Pgb*A#@k5_5g6v31CzPTk=NnUmK_K<+ zjwbvmr at X=QQ}`_e&($*27>F&&oMFVGBvB0FMwmSJ2SjIAG=PEW+8*Z_fcnMHaQzRn zF2fEwfq|}k*%pzh38{n^%7gmf7Lvafny(_Phy{Wfs3 at Z0KKlz~H;*3rBUIzwWjY2PwC-bML^<8_7sL31MMT7zuzJ76p`I)iV}h|1-`JPt zg3?P=iE;CtQk>0pu0-(HmBP{r%D9(yq2YdWN~HpS#O(=vA6RDm2Ih63_!9xHY~}LT zJ&cMwJQ(U8`S(I`-5}lzGV3*&h32$!E2$OhRhxuJZOM3(n$4!AOD&tb>IcuI$Mz*{ z)57d~UPlpcb*P5xHo-rvT1Sene*D0=MZ9=~EnYB#&0;*9f8>;4a^IU^D3A5s~xLxp{qqZ1dig3;C5ZPSJ#yhN{e5$Ys# zoTQ41<|W_;4!brl^cbkv2}utXima{(w&tNir_xzQprsG=9J7hzT%!nqCNO!F*zq^F0ff|u%JHy4{*Z*OpT)Y!%BBr-QqpjSH z=Zso<^l))4AGs~;%WI&g{X_oK;$0T|M0K>h6Ta6y#{^i%TqMt%R8~Mad@JNUjSlX-O!x zM&)FZcZ71>RncM7^lnu8K}!+|ifp2S5hHe26wh`tLtB?F*w!!o@;H#QVU#})?a5<} z)|}1~Vljy!u+ztKzcbao{-sEU;5}*;@K at RY`JY4|yZ87^*Pz1Jrd9a+4G|1v;sZ`Ih$)-}J=i`@;w1 zZX9A0?qb|-2w<60s^lUGf&Ki?Q!Cq?CUB at ws}k22~8M0`B?I at WXb3g zH~srVNk&dAy|B}9RVlh?4fqoCv+O=T_Q!o~;+B)iQjr9NXT{l3Z)4@!DKBz5eFE-1 zumO4J(K at f{c7kEP`Mi>(ICSfUDdr at A;q{w&YDpo9osi%ypR%XDjAUtzikWl8FhyZ{ zdO|oK(%UygWQg)Uq-*e4kZ?<8+b;?qht at 4-DId0C!J8n-Jg&KMx z3iJ`>`m6}!xM|A=cL(zfDrVee8^xZJ=PZtfx63?UE2#E!YeC at +g0#0QJTd|J7rik< z7q|bJ156`Luq*%Q$_V>Eh;sac1OJ(JtG=y*r-uHS`W{qYDu_c%*BmMi4TD?}1)D5Q z)e8$wN<}wFsMpV~rRknA8P>WVGyMrS#o6o^oJdehZ4F8l*_>NmjR zitE^a`{l9&>+}6BZ5ssMh$d>hefuY-Y^0GkJPU#)&=%dr6S>b99c3fl*^4Mj%yh7R zL2$cK^Gy?;#(0FCI6S<+0k^LRnn0qS{2S^4*MMS;lpa;uVq?hf)>mQS@&44tvSK$N zWoa6F>p~D8bpcTo1_H2FlX}4UP8a6%R7I!1CN!uci9XX at Nn@VXLpC_6mW9r*&emc= z&P}!0l(V%?6<%juNu#B)wV(^CgMdA?bTBRR@ zd;ELFozgHR6&bEYg>!$)3rV at FhD~d==2)C{m3oTjZlU#bbd!zT{USF&v2dEJX-HUV zo+FL6pgLrAFaT}bS~w0a$DzI&rffugRXQw^IKO6K#huCKRy`*iySIdmm=8fb6n~?%d~A7s*Y*g*hzn942P505S!~rJ5?Ajf8>q|PTsByj7Hoax$D)2 zL3WkD;*l9LA#NuU9s-XUb|tyMSaOKRQ)9?Sa$K at NAgGKvigI*@k+k4U*NBug2Qwtr z+g>|63kr1)@^QFnnzc(&Th)C(CbrAUiG%L41PDM(R!qy|iBHADHd3(;E9Bvvh|HT@ zRUEVSUR8!GZK&{qLZwSy=yy+jjV_~Tpr;(0(jIEwjNVk)cdCA&2gfQcb at 64hb|Zu7 z#QMnyXwhG9LZ&5dX69hY+HYvPcECd3nK0kU%XIf&+@JFNqgPL!DeDCS7$Lmc_jK|9p6IA>6YgkS$_GtM>>5QGs z74qbF7`He6r~0Pn- at DXZ-w2ksDlz(ofOzF|RazV5NP9Hi5WTx;&?Sf{1n*l^fvb*7 zKz;n&O)=a+Kg7Nd0~9Tv(ARB0dAc}Anr4 at 3`xNMSe1E&k%bwH$&#bQ=Ns4qt4JLqJ z6cq!fT_5W)Q!LqN(=L)|&^8hF^KLS=f_(mv at 4^bsLVEZbtv- at CTnOLPw=x&-e&a8c zAsf-R_{DfGCfu7=&4<=tkNHWSStfe@^w|OV;rrL>xYxl4w^u&DtlX!Yz~MuNQ>w>_ zGX0_(rEB?HvICLs8 at 5g!L_zZ)d&zjKa478cHC7DlfB$3rT}$$&AT z`&PIuFU7Zd-yapI3I%JlsaEEzj!~<7E1Z!Oo1%@HSADV}eS!oeKf7ztL{T0w-|3rs zvM|&sOoKQ=>ku^yub3*{Av)2zhQY7p>@JY&YSXYe7e=yyYws`IB`pj;Vis+}F~=se z_FKfs3LTTvr}8Xk+)(#5NH2=+r#KP|#n(E-JoMApC_}CfWTZz!(PPRGSZKpBi^88; zcKf_*WcEpb5)W at apExLZ#2*04HAr{0u}2vwSWpkXiL<+?@Tz2jHjm7t%@v>%AUU%g z1~70j-ZdVjxxWeMe%WT;-uVPrC-G#C^;{SX(A%?E`cLD6FqR8`QmaAAD3(}p<^A~i zi_w%+^IQHj?m}c*UKJ_bDsDAa`!|ICpXhQw|0U*LdyXYE@^`|&fq{U~|34>O!pz>x z*~s>P2blh^Ea{V9|0_#uvN)YKjq^j3l~XX$z9VX8S9n|EQmZDZBJA~Bnbe^cP0~9X z=Nl}z=u`-+0io`TDyJY9oQ0xHr at J}29K>0gdcWSgA?u^zTDtxd|+DOHWj>Q;URASsP+o#HA5_!|$!EVmK75#F?bPtm_ z;N2H^%^kJ5iw0guH40VYUJE(*{G<|qqGh at Scf=g;?3R%-VJ!#Ad3T!5Y!N)28l?jt zx+B$k=$$Jj*WR79$_;sVef>TKqJ4)HowV*Tan>zr)DN5*!6HmJrxQRKtU6!YANNYZ z$0le9ggOz}>Q at YhMUjvqqWHrclmD=`$zczh at Gf}6Yb11_c4GXn at dWa_!uCa8Vpsu_ z4u4qe8^czH_hI(xGXA#Z#`5Z8j0 z4#F)afl^r1=z#46ntrKfj_*&1MxC!;v0{ywsgz(lJ20zQ_ddmL2ym4F|DsYE=u90G z;6XqVe*C*d_}@A4e|nDDxT-E?ps=0t3)84Q!h{}=9P_ at ChoEGThO*4w6-}r)&9`yQt#^Qe7$hF z+L$0sVyr(H&UU%vdOQEP at O!k`df#SY0MQKT#n^#rHwc3=^<*RjJ{MHKnyt_ch|r%? z{T^7+0pTE^66AWs*pYZ{fD;%!o+ at JIB_Hs|L2SQP$p|1H*k|Tt`iAB-6HB4TNs1Lf zKVW3E#4vz at bD6eVe$7t~olCvrSPcS(oxIy#kAn)YFn%2aH;rl7^E*BMc*9fw2@*6I1Rne?sH$Uq68Qg;v-6$C~a*)wUv&e zPd#}Cw1o9(&4(H8txmt*tRXQDl2v+cN_lN(i<{QZVzjPcKe-0{g6A=0_7C?_V_ zlGW+j1DlXdQz;itB)HUYRw#;$^%(*HoVzZvbI}!Ote2pOkj7Vh6(dHBu3?gp5m9%3 z(SocXJ2uR?)?e&q$>tPOHB1ORL%(@&1?3Z*aIHH<)SC}H;GxE9S!Qwvu%hVAO1Ls2&G17XLr at Dm z#lspXe1N~gdo)FI{oZ&~FNcAmWSU~7V}=3OM6q&~;%;xSYhX{gyxm4_n) zYesQpKhmL|8 at D}-y1BQH7E?MvyCW|y6ilnDiydc>Z{6)RHKI5yFW$uspw_UpP?yUt zI7{qMcq+4o`3(lp1>t%FA^J`P;e6e at s4mh;J9>qa=AS3Y&%FK2s`PGHikSfai z{bEir at s{!sdx)M&7k|{zG`c&`Vc|x4KSDL|+>1g6q%y~`x|D1%j0m-7_M8}2+j!K| z;-sk{hxLa2Q*K7rb23<4 zl(&4~jG+2A9zl0x3cYdjGP`$&1yzO8C_dCqhw}xz=q*ZOKvN!`0ywA{tEP~c% zH<3^QLk7Ih=pJLo1{tPR0-GIaQ`57-dhI-B#VB$8VZ0o78nknacj!4L+Wz>Pi&KOg z$#Y+NE6cSumga9v>HenC7&h`tKPXh^j`}IB=JqCsxhS((2t?kOF)r{A)S76 zY)|ekk(_1rVbt3;sSs1ChtPlO}907KV z4jH%elnZ9Av#h07R^2gc_Au`u4C*6A9Ciy&T3xf0RZ}#NO&rz_tE*jj=8)oc)x7?8 z5*1TOfK~3z36^^EIWz@#*D|=z;R6l4DF$RCESi?sTJKW#Y}h>h zZbzJpmG(%Nwj%s2Ivwh+K6!gWSQkqMaWAfc at Ha3!r?^Wrhv`pw$5t`G_4^v6m`@ie zoQyol)8 at qYG#5Vz4}KB;@7Z;aNWy0l-^#kd>TTo(wp+m*2}1o4(hyCCsn90}w&{Zl zmp*AX>_kS=x?VxK>K<3)i*^_xR%QkpWMOom8LSz@%{620VD3PxcP}9zky%aXEEt|n z>*IbOE2=5+#4m7T=u7A$uojhD413Q_1xsn>z2$ zQU5#_5HkNfnidsq03iXO^VKSOwZ0HhgO=D}0~E=~nD2KTqC0Q_|3}^jo_dv`W0DI3T+MWJP-4wE%jPQV3h6 z0fFTYF*mVh2mvnB(8?K^UG~k~FqXm`@A_)KZhV&$$t6(E6Sb{8yd!EUf*Hb&OrUKg zlvjhQ3ZGderon2w1I0;dT*nIV8%h&jU~3^nV#)ssRD}C z9 at 2B(bFAKbjH)(9Le_w;pkJI at vro_H@LC|WKcUt`M;p{J-MeOb#i|+gcgy$Hxm#1x z^}=A1m8}dk9Z8Pt&>RoaEUo(24N^^&MwESXsB=`53V4 at NQ;9(_ ztqYJe at 4rAdiyk$YjD?kBPjv+R2>)!c!g))|SQlkt z%Jk=y6?nz>+9v8~1gH{UvNugUhl^lKmGH-C)6K{y9&jvTmsTAQu^~)(+_7&mmt|}i zKdht4?(CJ14jqtLG7dBiCrtaLe8GFy*- zs0b;gdnZuqb)|ocIde3 at CXcshQEy&Jbd24pj%wvR6xP+N>s)iTqqbKhGYeB63nC>mqkq{h zmL8iN^lPG~YEx;dt4M4_i*GVCOGXE_&F-yB_CRt_Q4LM*Cf>T`-WqghvGMQFGA&m1 zLVF0b{-M}WZ|M2$IOMNOH8oOK=+~~B9VT$^E6zC3z)R?%pJHL3R*^SfmT6LVdLEDk)!;b) z4gF;6e=+t>;hlcV)@YKBZQD-Awr$(_#dgvi+qP|69ox2T`}AICecwL&e{t4+p7)}z zYt}nz)R#Gl|d0m2Y_PM`>mJ}{$^KO^fT9h?{o!EPpfunUWZE)&@4t#Fe9i!ul5)3;%g_Od8?22u*xK8- z_)byqLshRM{Qe6Vy at -@>fhDP7AUs32d&3snD^+qZDGz1)q_u8%R3zTMG(x))Tjs#` zZM%JCN^3t!8lj;s^x#)Rd6n2cB`zhTf^kI{DayKelA%l;38B8?EQ~U%{TKfxbwe9uC=HNc-GO&1OLK4K67ipiSK=N4fLA$enRh2aJl z at p8(xPAL<&>>(fSUCs{IzOu7`%XV~JrSQo}!MehowP`-XV z2t}4L_e$=oW?9}F+gs&ldnKKe=}{k*%-iv|kNHykmKm7vx)r=GeMwal8$+khTlxdN z25Y;@JyPqL-8NrDFz)A3{(wY at dB(C%J|0=}4R;X%$8J%nX^tVy(i{%T;;>r%^+fvv zp7}wckNTBbqn~TFxl9OTa+pXqnYVsWxzSA z9o<0kaUBjS4dn)Dqme5N&eGOU7S@~Y&OZdL$g`A-T at WCk7V!VY^@@U_v&Fx~Lls^5 zc>`2msgB7>xfMjzn*h6xTSdj&06OVd5mL<|ViSxFmqQmC*ULGVQ2yTSy(ocI(}n=pP*r^w!Vn{ z{h0Vrh`I$-2GynOa7||GtO;d>Y}OI*^Cs;Te0FVQ at 3DuV1J9A^MQt`Aid(*6w6n$i zdN>q5Fo~=!+53{F at hCNG$yO{HgBDn-2{u~EmzLFr+H}CmgCv(4+=@-nigZn~$^{%- z^mZD-+K9CUut4rW5^3Q;fCzsuSPZy`q_rq&rza0?;M4pnD>G3iSYL$5cx`sbWA~Nk zYL6 at Zvu#%S1tcV}snWf3++pj~FgpSjCZ5UFo6wcRJU5%+qjn7I^~~Qg z;xFI&byPe(#&x8MQd-2Xk2|VxO{nKsK1uc-FtCKu`5{y`I>=7t7)U02VhBae6F&f4 zBo9%0Tq2QiPuU;DS;nh&i1pIum~T+Gs7kJ{sBzN=h>UVfaA5}^qoUN_F>`1egyW4l zkr^gIC9eXlN5ZL)qOz{}@mZyD at H12!`OJJGe}>cl*lZ9%h__3!Wh0OJ`aP5d(4Jwb z^Rm~GOyE6C5PU^7W5l at e zM6xNwvDxLHnFNTb-&hb_N{0-bW zp49d8l!R)nP at tvRK56RbUwQ$IsYNMYFx|8(*y%A*J(em!|UtnDYFpivvq+9%Q==(sPv z7|=o8T11g`-ZXZtH;OlR98^QRMMTC}8bvaG0R2jIXeK*@i8FCC>t0Q>V`6^4Uw)OeJ>c#@QmHxl!z5O2=81eHR;GY#AA zs;t-n_IM{+p7S5X>sM<~)*FLgv zA|W%(Hu#vLI at T1OMma{CNdu@{oB}RrJeI22TPryl~&drvsr#$yKtuS;w!^8#_&CPH+pJb z#(`6t(57)M>^cT7)dWs{0*Kc3|dp*1 at 7W3aQzdZ zR)5+cY3C2DufHe{LTxx0i-j=V9QqZqu*=Xrk~FFM$TH#OKK^JHzZ%#$DcuGIc<+#K zy!>f<;yLEQvhP1aK`s^K2 at wJaNEi(Wi2Q#M3jgLZ>g!H8>R8`Zbb!mpVz{AJ2YNc$ z#icj~Vn7(qYAXjZRB`M0jrw zOM+k>K7qphfFGz>z>cB!I#YMtv9q2Hz?1FtI_381v+a9)a{2wW8w1q5r;c4Mt|uxe zj3NW4Kir6E#$xSXw96sam>;Ss*r4t312<|tp5rqZQwPlyZkdn)lSi;D)KCugo?6cG zq_>Q1Bf_qESNo+o{C&W?Cm7-ekI`Elc3b&2H#|heTmNtAP|$4CzM8K{pJ56XMl{~s zX$UsCsSQsVYMSL=wzHOLnqi!@N;RLwQXF2`c%0d($Yao&yaF+h%5JPUe5A9LCM(Z9 z?#Hn=H0uAw$D;U)(WYwgLvm z&Y~dkBvqzjdaZ+hS~h3YIJ)=4v$F3*}gf!lTh>y%hm+B|DD zeizzBxNNs?7hK{6yWoapz+|>9Rhh{KY=1LP4lY=^fDk_=6y`xlHCE7Qf~$Z6+7a$I z5z047NYV&KR{iJ!;LAuytSro+p-*xH4Fq~>0j8^)N)t05 at oWc0k_9@n3R$GDdgn+& zi;BeI(KOp4(vq}F at s;?vq{t$9Jb at WJp}qkAOYsK4cquemXD#1nv9C~|9ZHPJKx0*l06fkJRDIrP4p177WR!Xn$mb^()P1{r0xcISkT^aZ;>ZkqTdUY#DOGVE1OA`{@xdZ&ZTGh9`# z%2Sc5R~TRAu~a{3k*P9+mJeWzuSUEbY%q?x3h=Zf*)NslKx4PNY95GMJlgL56squt zd#7nOpG+@!%2aJG^&Du%o4%nPCg<=WLXRX1e#rKa_dM6+vovfmr2CeeX9jn%9+K_! z!{K09!B=z88b-JYjV1^;gi)gQE!(0c5wMn8rdM at a57r)TSwh!AImyJEIbWYrjk$1jwXt%a90|};wjn# z;7#vns!3>oyYPe at t9It@i*^?7BkCJ50^yW2ga0(DUDV^i}77) zhs$@%R at B$#M^c$j@$CGH|Dit96~MlfIJ!=!kf1ZlYnnLuz_&cX?b-)zsWd&E`if#4 z&8~(-x09^3&nL&y=|8ZAmScI&cAav}jqRBZSq0GObI3mJRIwJ#)zK2jUig%x0&bc?k=7V} zrC_jtRlq}zbuzT88ezRbmrC!&6m(#<6bq#Rmm>sC{ON+ z at MR+Dm~u3+%@A5LCH%^ZA={c}EQH(>s?Bl6_rq3{{TO{#aD*%nfn*3Rx67|sxGekL zf^S^cDJnQ~Vdm5+529-h49-V~@pyb{ZjpI+!Mu<`dp6vrm9Ex}-Mp`=1Re2QQ@|TI zOqveAvaWRB)mzPSu`a7ZD`L+&*ON`5$sL033bF~aWKbh?u&ly>QF+-&Bl1bLmO}$$ zu@>{X3mQG-rmc5RpOb>a+(MRjg(5h6dFIZ_;!luzZukmw9beAUI2<6;D9v5H(u$Kf zt5RmiFuFvOJEnGoz;uv@{uA%1O67Ah*0Cg#f`r#DzG6CINv18Tp3gYZHtrEC#i2;z z)&&-nOGHN&_*eT_4tWp3Ii&F+9QHtaNJH&P^Y0}Ucdneu*NL?ouv6=ArtqJaG~1$w z9p_XC;~Ow3W!?xqp8Bt+x%ACF;8n-CYj65VKoUOw^at$V=Qsde{&B;}Rd)Nyy!+NC zc~$;3GXI{uDfLxuU+MFnin8KMKY1fo>V}4c%_q|>pRldXCMIY8t0tm61|74LHig4m z`$G(R<<~8mp+^*u#>Smq5vVy2ixLko4V&$ks&8WSuh&wdiyAars=> z9=W*C4m|aSU7+Wy^m^O7x{Nnmsk}9xmgksh;~%?p>zq~yTU$?2GNLvjyY6}-x_rhv zx5TD at _srk%x4uzu-O#h`=yw8tPe$JmJWV~nWcA2z at bw~jhZej at h`Do zs at wm*2S3^&>>jh|ScO0s-AXWG;G9rx5HXT;%%%1yr1o%A{cCUvND|c5IJl@(NAKdt zaaY5JW`v=UK7Um8LI5o_fBa+DjLFlx_cSaJkPk5s5ZQmussGk-G@#sdRMEcd%$S(d zI?0J_(%EbP@!%5Vk_olRY+`ebK|=9H4T)+9*_1 at r+R!ChwcH>+z2Dw&U#k?S at T{oyqlUpc&$5 z=snO27$Yq5kCp3T6GXiWm>o7-I|L&zc>8NFLHC{V9K+jIsArm{|f;_(=K3^CS at To;OeUS&`Z<+aC`S8CsV)X6b?TPUF3WD5Wdk&`e zWgcnxeJ3yN{9ov at 4dCU$Z&7`R`?v3J5I#K8kF$5%%s<_uO?|RUzDJlkdvh>6Ug8ND zARJKjZujK{aRd18$0~e3g2-NJDqh*MJ)*pR9dGeN*MWW?RDIv=yYPQq4*vr6M>6g} z*R~ut$rnqU1Vo{SN z+N_y;{sz{GH$*t9yHO_IbTu&Y8~t1rf|x~l4G<_vnIuwB$9u{e^4Kb{2ph>>K1&p( zl9|)~>)0ZGc(=hu&fj^A_Ds{cZKgKgDR|MnHM~dq~J)-Phcf9y&RwH0b|JwJ??Roz}VREp}}G|j_bv;Ebig##3FFz_UMxNpS~d(r5GP@#%NT`wo*_h4%)vISB&H&5+{N;#iMw5$_jF? zQ*j4sHA(Rp%6(pj3`slY>}b_x!wJKTzly!r6b=iU6(!9?WnELh226(?jp=}1X-0nD zm?;2ao!XC`r@&6*QQ;IWG$hdXTa6MQvT}5{5EqvTaj{t%qPBew9<1FdiAKGKZebs_ zHJ_y>F34-Yz%p@?cB>zJo_!u*_2AA?oVJE-97t_7-Qy9l)G*@mZprH&+I5} z=z61^E0JAmVeD at v-uO7n$XlHN*CJjJT*d at x(jJAiQl<)J}6U&f6TwsK1^kY>ChwV2qt zG#?0fNM+>Z5+PzDGuLcrG~MT}f at fl!j6mSnU2Ll7$`c1?h2L0gI53790W_FC%~X2u zE+lIT*l9$~yDXYd>1f`m3baruxi}#U*wv`UHa=Bn+Jf6)IR$UT-*%F=5YtFn;uv-H zGa7S)#nXE5N;gxG+=w++6GEA^z7gfcO1GmN3t0hLf0C-9>0+Sttyf1J8 at Jth-eK+Kvn7U>)&V-s&~#|APr6v8B~)v1)Ng~uL}@W(y{9L`Eq1qX_9Vdi zA?FjQH)o*yS7~`YbOCDgKWzCac*b?T;OZAwg=n}-Vx+91Dn5qRPW>!BFVdm&Ow&#z z{d<3lg(;#RsWS6%R+>{SmXErLhDp|hJtZE?3*h}6Vi}##bK#e_b08Vjj9r)IXZdQG>A+#f_MrTcaRgqQu0vo3b2 zk)*m<{TTGhUZ at daZngdZWO~pOq=w{dCJznqeH7&(G!Ce9fOkD^jz8FfYhK11PU$n< zL4dyCaPX7x0=o>M9eX)KZ^J84XT~#0&jLH}FQ0x=kOjG11Ac$E;Irqvp9{4JV|0!4 z0m`S^zyv-hH%5`vNtdO=oEAfE9KlL2?-oUKTwpk}B)?v{my*-HXzlPll}q1n%U$3X zx$^59&q_F{(ND&?oabQY69a8UcS(iAZ{J4)bp*>@apAB zHlWB0M~d32{9$bwsV<+OM^Ocd@;g`600W4_V2IH!{P^L?7EBI!g&;u-X9>G8t(=DD zMTcFYGdS-2hxPmyA!l37cFUNysXI>d*W8kzW@!Pxu}B7;Sjkfo5VA_ekI@| z1*)IX&}S-=`B#Xy)ayas(_6fDyq8%@cAU_s at 1!5@&|vQA7Y|s8yPC8^PLR7E`5s}Q zzpxlPg=UXcp at ea$)Pq$+4FXX$BMXp%1V5T*4}ZSkhZ7}X4z41{XTj at mhe>Y)pIfvG zM1-8)NO15pkGVI^11Gpea~jx|Y{92D(9 at gg>ol@Cd5xC!r*!e`u# z5ihA%ij-*tVb4+ at LThf|wh1-s6eR-qh)KNQPHz>@JPIq7AAI0_a)f)P^7O?Yl0OIv z7Gul at 73=IP-9EC!(i}EE=y%+=XgQW-`s=u8q8a}%%5kKBi{tY9$kz{N9GQWa?jLC0K}Aw$Ea z9)g6;`LdfY8 zz8^9EpyO?;@;g;?PTen7ZZ1~ko9)9p-iR~kkZ{&l>d*H!nO5Y?L^ow%*YX^z zB!%G=TD)eE-dpoxuP>D9NPai1p`3G*j|vCbW-fo~oyIc}o(yF?q=W5C>&VqN%zf(W zYH6t_V^j6eObgY1qNEVnTo)9Ko$I`B|FVLkgfQXG-?{EcgL`C5F)37i-FwvK6(&@0 zs|`}$gu0JSFYUT26crKhI>!pS$DmE;VV(%KwP4mQF!diZf{7*P at 9EOp-sNw5RBv|^ zQ4&iY+l6P=47T;N)=kE)gd%A at bO>H#lc>kbx^bKWcF3~O*u5=n)>MF!yJN at YB4$R!L=* zAh_lmI?T79J+hzoGaFvtx3|B6ZlJLlNgY(hK$i1c>34mwh`b4daTL8NcS*1mHxhG4 zDD!CXZAVIf!^FfCl#11nqWEJE(m8bX5l&8GU^w2tYPM$`r8}^f0AO!9b&t*TlxZWh zVNZotOHC_+6&Kx;ZLNakFl6^lxijom3ap|NV4)&1%Jb1n6a1Yl~*_|X; zojm2|v$}(B5%ljQmRCFhf)zZiQx6)u$@P^ctfDn$_hMDmseh6a2g5B@)h~i2qdPiMWliN0iYm3h zY&Bt|!>4L#y7+chT!KgHLxT;y*rzV5%K6J`sJ0gae5c~duUo(@FS7&5u9?pPC+CELi$jK%?8 at Jot&B^gfn=bb_JIjnk>JU1n+crQa zjH27#bXeG`(Jo3UQct(ZNs|e2B^%mciHD#`m2#?pm6b{uAu|ovaVe2hJeKYzF(z7I znEZ;Rnn{GbiialSU_BVk at wCTA)*{I(ZlNklv$oLXyFUZMeo7|K>TKR~n3R}TGQgQ$ zzW|LvnU1Mf*w6 at -RB#QX+&Z0JY{(SZ4iBQ)Xga3FgsnxUid>u6eHSlL_PcDBD2?xK z8UrDJX8)%`%$^)Bx!8WKz_ClYegX5vWm+l6l>eQth4JczLncEr+T!Li*YR?=>^*n; zg}*aBRpVor&Gm?9EU)YIgIEenQcv+&#MN_%4)U!B0!6#%iutOce>Wt`gCg5+q*(=L zcK at suQ33$T)P=2eUYu5d+0*QV)x*FESE^wJru)T8p+({;Gz(%MlU{yDt5wh^Jh?qk zfypj$V5Zxha$q%Ce?{oWX#p&k-4z(33Bqo!u~XoJ#Y0>Y)fUt$UCQD{=>DGFJwJ3TlGbUPC3kd;H+T>f3pqu?c7`0oJ+3V zK&}Vy*KXJw*2givoQ*yTx0|ei!jzmAfY^dKw)~jN1}#34$)DYm4fw)RBw4^e!^e~Ul(Ig zrU>Tf-$eSo3L(Gq(1EXK at NCAje?NB;h72(yAi;e`-Uz%Ce=;JP#~x)W`x8!bqI##p zJn+Xv=&i=gsjdY60 at eo5yvq9>qPgCpaK^t>AA5}@V2($A2MwTDdn|z4QxN_px$80 ztP76hpY2R0F1V;ze~}&!{(pn?f<|_(rvHufYF2jZDu0o_x;n##%y}~_sA at evv8uyf zw?i=9bq0y6S+6;IJ at X*e)A3@&wfPp|1#T5_EP|QSII0BJ8)j5859c6SW1_|3dii z{3Z|NEdpUntwq&$VqqSA4MT~^^Exxt^}cz^>wW z59H- at I^ji|;I3Dp!)8bEv<1{IMoqSKxlhv90wHdSyoA^CHV59lL2vVvFwIJ=K zx%7PIi*Y-6jn>iFPLfVTOq>DEC96mCs_4Ua;u8ehDN1;-(@@!;WEDmmhewgKOXsi@ zBUyb|j)9=hi8Y-Ymak*09pzn1qA32bRi%k;z$AfYsugCA8PnLZqKhT at u!YFTuVt>M zF*fsADw~4ll(yT*!EH7$@(2 at w5(}T-oDz!G+5-%03KWBznH`MyRZhg}6?s}`W!<9d zDvv`l+KXo!naFV14dq>n>ojvea4PF{{~~31Aq+S14*_!cgq%mK4JMYj z?AdH2k0Q?ug-{c>?qBMZ!&h18!k#E_nq`X?>CriyvdDuYl4$MHg{SF9oA7t}vusu$ z at zlX3B90}X%HWz8Q#(MVQ9$j4vCij zf$f}MiV^{A{GudLO|UAsh8(C^zhR|P4LQ2IC`C8qY4S|kqSku0C5bPuv1XQ7EYQwO zXNM`+10pdYUN4&|ikiwcoIGJmPS;H+eDDWq^-WT at o{V9=PMi#D8aiU8jEP4YokCsp ziuEIxRN`z1pGM+5{IZ#y_N9o94L}(7ASGKN9gbyu!(S}f1gW>*DXESR zB!L8<5Tm)6_8)kH_wnbrNr^O!Zy_EcArQM=5QjFDw}Ua|2<4B#2y`z{PbWola*w4s zPQA|7)3hdw*$IO#y_>_bdZ`F at D=}y!-P`^0YQGSGeMXma3Nu^3Hc4Uje9%EZKV}6- z+LZYGWpb*_c`K$kv1mXqctX at Ih96&4J-d(YH*;C>>)A)1oPJkX)f_ZP`dBLwte?C0 zM at +F?4(K$a){X9-d?1e)#$NIiXWjz{POISOL|onR($06wKhOXl&0uR_IuH4^wPCt_ zlplORk}p$l-q#CD8PQpI(QaL1vT~Ki!~KYT1i=1<^05~r62XwEnCAF>s?%Y+VS7G> z`})Ljkk2DI!0CoLW|*cEPcxxeoH<9xpFNk(TSO&GX(S0R&=-c3zkY$0bMNlOB#sPt z$Upm=?!HIaAVDCpELoEjZ1wSx&haIMS>KB`b9< zO+y_EG}u`C4Nr8o#T;tKVzm!VjhQmU&N3#Ro)XH*)3Jl?@Sl?!tc%kI!VPEPZx;L;yN_M0R!WK3y{}bLfsH8F#DDd{Pvn)Io3o zbCIK at A}Gbl^Zi$JWQkkA4Q)V2o0eoYMqV^AMUYl^G3ApA#$uo`VCcd?bUtFk5$31K zaoNpTc%_oIE`1f3x=qb9#N83kE&^NlNIFyLybA?;%|J}*y7pxQx;ow!&VehTs*+ at r zH2yRTnKFrrJQzl}d^+rUML$z^kKCJAkj%-EgP at Sr6z0^E>2#*%_SM&9k!H~3dSNpVn;GT3uu56 at zl4}orzzBAt0};@?17ikn!UE;d zGKax}yWo(}Is>QKSSr#FP^?7n%O{yrX!U+Z<&)Er9sPNaT%lOnse0a*)B_; zcE2U-kP9;94l<-USk;?^<&Q1wo^VabqPbY0 at CbG$O-9MX&i}G<|Cqbc5S|x_mHTfBYF6oX|T^4-dmYDLlQkzpdMDm>xjMzVJNVad(zio>v zdhJweZGf$DJS`2 at K{OniK{E1gIl83MV7#Ku@>snICZ8>1ecj?vuQ$ZG+AW9Yzb8D` z3bky0Su3qKaGZu5h_ at 3Idpz*v>qdk=dY|&@PPh8 at cC`%a^JjIt$%xn at -Dx}{g!1+# zcdXnYj>$YDH*a}`CZ~}#`Vy=xK;0sLB~-pd>^-rI9umOr)ma&*D=@oSn|6?+M^QE{((Y~+Ds9QC9*WVh?*7Zh2*ECykf1Lv?r0vu at _w1PDJ9j z7mCw*7>t|m!0}t_iSo#cboq~qTHhc@>k4+O1`tMtpYa~t4ut*4^-5_-b5*d-N_Ba4 zRQ2gvX$TTQE<}H5jf3~9pYt+_Gp(T)o!_UE7-S2Kq@*Zbzdwg8AJ?H%T^@-Oj>CLbUeH5S(I}wpJCLNQ z%OoVwW{;iFgqiBRaEaE7oeOXU!W?2xT*=jh<_ at G=sIhb?^~Y zY|8V5SGpTv%^A8@)D=3d#}LPfq>gP8JWI$M%X at p&snIDv{>!;(qBrT3ltEg~Rp>Jl z@}_7h0xa9Z5xr=jSnaUNn|ah!?lo;!4y>5wMcUJ;&nMKBis+`%<~g6)Rue=EY2P|Itn0CV)(w_6YK1?Vc-w at + z4|?TNKpTdHrVt0 at 7FtOxH*g2yNZ=l*Ejt>VP?#5l63SLz!*1KF!$`AC_R6ngCY0I7 z4vLffM^px8V>sTB)cKYC=9~j?q0hwB76(QvmBSt>!g4J)qng?!rL~;>6%}KIU9Lrs zHKd!{wV(Xb4Ybqp3Z$c&M3Hdo>)aMksuL}Pw94m;66&~QTkT-jRL?^yny}!P&o%$t zuAs`zoY&0%1=?uc71?|Iw`GxUEkLod?DqTVIoqTx%lK_}ib2iH1IQ%*{I?lyt|BrM zdLO(iD#YopmVyZ3(3NT74%XPq{c{sVd2|xZjiJlDIt(BB^1b}#;a`3+zd!j2PrN|% z at 8$8Gf&3F at p;ufHn(;nWYcKIDW0MR~Sh91ESsM(ui_I(dLU~km(^2_?={^cBie}6$re1RHW$1G9XfN6Ma{k<2MO6ZxHXUzs< z&Cs6^$ZcROw}-n$sJ_A(|rO z=;))BY)pmr_F_0Xv5f^$d;kW1k+{NG6Q?${LFX|Vmws-=+QBY1Smw|Kmun*Q%0)Y0 z1gDoTgt*03E`viGZt?g*ajVH6x__!T+%rp~{lGv#MiRjoJQ z%GmTMNLwZ7>DC2W=~pHg*8uzxu8=&*E2_Z9*Q`G>-0Uasw`K9B8Mk&Ena-b(DX3#K zCZo;7mX)K5OPZBdKK(fPOf#^TgU7_4W+rQ*)&IG$H^msR&dP~LU#t}2%ZeAa7aD^q znyi%I;4%RNcvYQ2y2f0ZQ}&%g8GPh8%`i-oeJWD$sG*d(jqD>xFCQ7`ZiI at mRlQm} zSIIA7HZ at a z=WxUKV5n>=$FjC`yJ)pj_^pSxUGlDY at Gflh<_knRVqX~G*YyEZ%fR0+G%JH{-^`iv zPZd6X=kR>JKD;F^`7lmzNbsi{!_eq6`J0WS+^xdUk8M-(wDG#d8WG;19VTvHx!B1g zT&?2Jzat<_*iW9RmK$iTKfwQI6r{-=8dLwJ7YTpq1<8Mkg8y?_^S8P*MfGKqY><>8 zLKmbA0zsEhmI}|Oq*`PFqYXs&LMivpaJFf&b?v_ at 2J76}-2TlEG at Rz!i^YJK#mMY&eVlomd7tgH_4&TN{RLzXzdaP&3!x}di)q|IicJ at 6>P;ye zlLsmsOocwqbTv2wM-v=SYs$gsoR2JwiH1ePq-MI2aw`BrIxq|;+~nA9v|dg}luVaO zbC#K}t|BL$U9Sg$TQAcv6yol;8({eQ(FcBRi8CxxRGLaU1Ng2Ekef9e}0TF)* zb`mSjp0cee_KOoLFSAVm%IiKoPfkS&Y%v|l3%UKyEbb3#_`!xYET=Sf)72!#q>|?> z3x*5pq~R#b%4xfn^ITha0+OXouCGG1!-iA#N#1&g>g0_=I)ktS*W!SrIU`en|LJ3V?*j+4_8tHW$TC)#ei;fJUKU53Sp3lmS z)cbp*c%TZZP`6CFZHRBZ-(`3LT6fo)EXu+QJb!QOn5$r*^|P=H1qYsYfV3po^}}3A zLX|zWNl9EQu|hR;G>dsHlV~~HR8OVCzNs+g5^L)4s6E{0X{@Ka4IN z(#k{DZ00p!EXwP&Jq2%Pvi~LVrvM#4b!wi3XvW*$K^NTd88T5gte-rB44;wNB|R+IR-q$RA_ z#waqFzfDtObxtb1psJJ&rg_w#ff~e|Jj1m+z_b2jm`$I9N5<%CJ(8 zkQCfUWN%C+Se!{m2rmb89)V)v3J64b2`7#{K?kG!S{j^Jz?WW4%mMA(g=sPjtRK&7 z)=hrTEAsL2ZGFdA__BU)#n+crroMH$`Ok~&j)O-M_s#8J0r%GXnU|D~xKKqUt at OFz zO7cFY{W?FW&ZNM-$$nt=AHw~YF}Q`MKcyOt*_NG2aS;R+0=|Ug?H at gZ4M7ACVpW!d zh`I9%4==?Nzo5XJ?h)h9kB=H*y?e#1Tr0sfuXh zhaLu_Cwva!Fm7`f){$cRUEuu%ZG$m%czK3wwbREpM&{Ju(> zech{#JUzFzcRmLFSum$;qYih^@HOx at Xc^<+0*-#66(NhQ^YxMx>Iqi&Mo-HbezF~L zk^JY%*?sCEtLA9)?DlPU7vq!c{1!>Z9yHO;v^~I&LGFbTDTg$RLE8s6=PfgiD?sxb zKb%@jyTh`@V=0aeYekRvl3TM89(v_7TV1lJTR&Iap={?lr}LaN;cTKk*=OrgV0#Tw zVSe|Id}rNBU{)g4h7cY`Xs3je2#p)}vWw^YocxOCuwDs~R(zssTj%;;*`I<>AuDbT z{E=7R{}`>N8j?4B{7X1Q{^Mx12*AnM(bU;g#LmVLVEf;rvM7S6yz{o}Mfrq;`7glX zqv#+w`ha;*ZI*O!6zTMrA?LJ2q7LRs*XE_1LzFP`x2qVYEr5DaQrq|WzDzo{O zulM)uE6wj?cQq0Cbub<(V&n695Le7Qw6el7CX+6uh`zE at r@q>SSgA}>MeTu-PCVp> zxfx&tZJy+2dC6g&5&V8zl9{;e*>)7 at 9D_o%q at SpMx99a31Aju>qgz!>gC89VVm9^7 zzBcHS=C#_S)S{7p^xN;S(tG5*6RG3%6c^CPR2jFiWSMDLj79H}hXGWVNg9x|Ks)MA zq_bwCH=I_Pb->t`V4tz9x{1830J=~eaVm89)nN~GgX7da(e=uiLQwi`}bV6p23rDVN6WOHLChgq?~wEMR4p&G;4QXiMRLsAm57+ z%o7F&l=oBo4-A33hoT3H1}oU$a*?o~D4R0=5&H at vLTUSggzaimJCpA>SjiME*Vg at c zZtM6SLXD&r$qRUjrYcSy>IONGCUrkiH60N|+v%f0TLmFoIfphtaNp2tWhQL)m^AWy zUGnw&v$j9E@;X)sO;T!O6SzW1XN1ht30 zY4cx+Iq#Wm2VAFt==k;1WbYSEOMLH{%->(n%iBQoyCI-_{aPTywfMt|-r2oBtOssH z{lWE_?qk!$CB1`cR(~Pm*fJ>_6;DJ?OzeYFuNd(LrBO`qLnP5l< ztCeDki6+4;EW&1Ct0qaS8OoI<%dEy9x7sNRc#D>u#G7W+{}wt4N~mZUq|(}CFFOfm zB_qs%M at ZL1LCj(u3v_o^oINDdUQe7<1t=G#kwl0|DlL;L8ydSYS=vyk0;j=aHU!&J zp{>_e(A0}gM6(Zh)Ljl@!{H3fyK{E3m_yBDtj8BIfg%0O((@+1lmJtmqXEsektQcm zx)77uV7e-;CqG9=Sz^ol4e1Bd8edHAY%RYp12h^{twHT6*;FwGZ>qV1`1Ai^?VX}? zYn*i7=#6b>#kOtRPF8H2E6GaU*tTsuE4FRhcCz- at XLt7*{lDlvcAs-Q at 8%d!J at u=q zS+l0gf at 61A)Rwjn({+)4H2?LbAj$+DTet?@`6gHKLyxb6lDPyZ>y?qSS>d=9Uhp;7 zCT*vYQ`5{i%va9=>~t~W9Otj$6KWD!Q8Bg>rf5Rc;5!U8cnQKJ2)3yF(Rr$TCOg!( zZRUYW_tT}k^xZRAqrBa%saRSUgTBLcPb{6kBJ#8Pl~{Mkawr>iSTyKV=V-xVRIIHr zt|t>lY`>hewtYp2c~(w>O4cxWacO~8V`ioB-Z`=Lnt9}?A14U`&F(*-e*2`S)5 at pj z|ZeWQ|)9yT3*4l!`M%jU-ygg2rz4++Wg%inZYLuzxf3 z_qK$2+(m~Scv3>Dieb14653H33?es>)G(WvPy#JTat=bm9PYBil=U#3veRLX9e=0m zrbX=eps=QyEnuZ-28Oi%*fk!dl at qGTOoHRWy6mw{F+0H at c@51K6=Cb{3r4(lGLx8 at _jqG|f5eJ2CKtbg!F}2# zQ^z^=h!K424%Pm!O;is3c(^oW at i-iLog&K>KEv|SJ- zc9(LnK#&yID_qQ-ETd45%w{m=hs-l909z7FGkji*U at S_J*}kgZ-HknC3?=moZ&)h-*#3&13S9(Q@;k)zXr8UR2$v% zrY4tmF8j{0=0Fr{#JQ6DX!mf8ZON8DL$#Eei2kUsSdVR4H?JM~#_w>Y{M6eEz6L;R z*Y5dT=t_cJTD)sWV3FY{;O>;Nl}bA8E^AA4kB=OeGwg?f!R`$X2zn`8Uc)l;m8qH>s|-_G{K*M{=vzqSk>$ zr7nU9k@#&$Ifh(%c|CevlJ`fZ59+m#Xg3yh#&%xhgWAc+;=0 at AB**1?`|IIl#Q{X| zc2*pvb%N^W))3 at 1*Q%@IOrIa9$Il=k1Qk0H&_Aq9`GPFw=v2ApmL$KtuUiKkv&Q}N zbV{)dpp!bi(Z^izX#=a@>~A=pwSICd*QW?84#Ak*tk*&e2KK5Ki)z3`Y8CdWNYjjR~_CekyCJ) zCtFu_xq)$*Hy44BrV|*+i=GOWxOa?;7DC at o`acmwA;H?&VR}J^WF5 zE1r4y;fy&yEI5`eHM3F`C+RYFVmb=1nI}EPy4gHtEAD45u62T>*2Efy-#M^6%iu!e z;#dz9_k2uc`O}Xz**@wQvg~usvCrWz!j`cU{~^N|E2~Gl8CY7?J!L(kRNTrlHf*Lh zb-bNjpkHXGOo8%({ww;zZ8OhduBB}wOXUF1SupNz!jV>02whL2k=%Jw2{!lUn0R%IZ(97brt)N%dPXYnUf&{6cn{TRv^edHiw&3B=>nv8E>6h%c z>GZ1`LBUuMIb-GDz;FoEv_+;6C}z2lJ0(%{SYyvBVqiLU&LGpotOjz;VaX>|ODe&N z at vKV={btn|zoI9+&K$G6@?)_HEB0G~2 at d%Pb$b7g1!r4QUx!1w%KZm=RZ|-n7x?fX zy0y*PwjiU9`pdWG;&wogWqNAMBNlc_!p%LeZz>)|tL*UjGUCt_yOy$bHgSeqOL^9F zSJTi%L^Js&JI2s#x<|yO-U%7>+n)L2FGlImNwcsVFR!yVH5XP7{hpaw^-^Qt_5$C> zkx5PXL?V9W!~I|JauI5?eesd!_NKEg{;`L;a`|)M%vQo}vX+}dNqdlkCO=S at IM}s6 zAWOgI6_9IO6;Lw-XA2C31A}or6ID)9FIG$KIgv4}if9;%EYk8|QLl~Be2{HCdBI|s zHB(Qbq42P|&sx-?<-%yCN+~{9eo2>zqQ&Luw;p;fCU<_Wc`Wj_*@&4Ls2DkCdiVu8 z{J<}Gp=EYYm5A-e*p(bn8h*`Icnlp$^ElKJQ<=6f7tw-!?6x^bKmV>Jv|rj)2gSZu zrtiSd?D<|pn^g+Wnwry||M2EYubMh-f$dNQ3h(zc%$usZz`8semz!>h%V3onM4ctW z at rlp};itpCgz2l|m)D%#1H-vy_ECxTAv_#8`S$TdRJ_)S3-Ge1pe*0q zApPzjIy6LA9FaszXPc4z()^Xzl~rQmsFp;#e#l`I6Opv!BRU7Xrn1Vd1(ZjWgvx!D zx%e&5-tv&?yv;XhW!Qn*YFzR9u}qo0|7bt$Fn*9 z`{h|P3pZOM=l_hd|HrtQ|HG^G9Tu3-`L8MIL1m0W>Ji4NX5D9-M8lveq%CPwiV(@3 ziOD>B<>im5os{+q?)t(1K$9VdLHUCS!a8NQgyjdK6Yl$5X1UBX`+a?l{A1VNrzvqG z);It?+QJwhP7Rh*VOSUgR-P>2^AIdA3?a3A0C=^t|m1^4Pn4^RV2V>5v5p9f!+F>bzoRZpC~rfls)7SpU{%tH`9~0E<2#137*V(kY at OV_^;Y~ zQC6+3hXDaO#sUFh`@h!SzbjAk;urc7j=y8yzdffMeVkDSK8uQwK)ptk)}=38f at _!Uz!M;-i z>_*;mXJaqQt8$1G3Gn^8~hYS1l4Si|Y=@(cr4>Mukje zNEU02RXezIjgpT+)H?pWa&sp|`+0#QU%`r9jz&)@##IXL zv|$*4JgLU^@)V!P0%0ZiAbE6)0X9}&>JpmA)Lwa)-EkDD`5YO0&;|DZ2Q2S{*Tk~j z0_tg5~*0Dnu at 5-v%Tzm52OX}U%6>(;Y*qb`HtGho0HD3_zYqOWJ66e}@ zi~E#2`BTDIhFBj8houSOMx^y)w0IC>rd)zt!G_f8$SSd}v;WCIhtsvnJ&WFl;|{Y^g`cW`x)3qCL3Com((#5<^7=0E-tC%v-aD$1W} zcT`%NMrXxS8uwnR)NQJ}jdL`Xvs6Z>6xJmoxN5{VSmkKFFmRNi^%qvdj$YYi%toTw zr&u>sgLeKr9vP$8xF)k_q=bqXfaS54aFf85++Kjq?j48iszBoANOG} zaxGt3z1j4J*b#WN(JcU%iup=EYz3lRlsFKE&S(N at xf6L*u zIcdF~c3E|yyz6+p2({9rKdm!hQwfEIG{h+^Ir)^8q=<^Ad}*Uz?i3VBh`}zI$gUUF zm`lHe#}z-Raq)tpGcXtf+`OK{**p|HgxFYX+xZ_%^^*Daa#2eQ-l!$Nt)v=*`gwFV zTlRVC4RMN#+i%-o9Gg>}R`~+dO7AvKa0*P{4~yc7FoL(>h;7SW%wIbmx(6n6!VlRY1l%1H zrZbQynzPzt1c{9;_ue^b3}?23I|=dXP#krPC7pEof9y5|i-N1z+H9{vy7E4le4-pW z>}Wt04I32!Te7G325&5h<)IF&QU4L+3vDt=#Q at srX92addkgzMlp zCr`E&)T%!IeSj(kKf`AC>D}%-Uz?C9`*I3Pl at NkP@6Lxg(FO7IxE547HP$Q*{2Ni5 z7mBqbZXYh%#)O>fV%q8LnSGyzNUB_zb#?e59WM9-=u0xp<~iJEgx#xoNN;sc_|>PT zco;zpzq!|pfuNC at vDh>5Mgsp-$nMlbne)_M|MMn797s0<2Nb@)M*veT#RTN+D>sN;_WQt#H-zdq7mK@&0Qwm z#q-Fs<0OVPqwYtWZtC4Z6J_H at Ap_J^SzQ8>85O_eNOXfq(L*=O!&T3lyUdC at v7*n= z8Q-XYKpZ-TUPRLih% zVaiM+iX;@{ize=CCcP=IsU*`ssh0BsE3VN4B^SJxpt-l)%OY)|!JKbuzY7^|JdO)} zZQhqt*^_d~j_5Q;ty7NS1kA?f$jA8wj&g9v`JbpC_8j(GPTNaAKF6bvt&wFaG5_jpEV4V*5)FY#RG zBb9I;3kr{1=={its|r@?t9VXx>0RnDcg*2p)VQ@|Ly8M8ecF;{lTN~^bPN?JwneG9 z5C4SPbKg%j;{iRN!ZKLud5h1b=n>N83A>H^*Ana}j(;S)wMBh)f5vx}( z#Y<{>gjg4~B5eKb%_Da5dBWx$wq7FyA}|CCIH{M=X>FusYvoeY;qbdKH1n7OJ;vSz zSU-}eeI|VPq;KECf}g3s58_;Zvsd_}`1ogQ at 8WkK@<}*>n%G+0VbXO?C1c$|GThzh zOAZZ8>b)ql-jyM1+8I%-O8xbTZz0T=4DsxD;v4Tx$$W39eKrHOzv}XG^8s&Em$($T ziLbX8_fZ(u55C9kDNoJ5kxw+=im!K?7`^Iq;h&eqzQ;%P=U_OK%!@_-qPE9jYak7k7 zs@*Zzy~NL^g-si~`Qh0wa=dfk^5eOTMhmd~;$G(KF?aIt+pYEV70*c1Xe89DxTMEw z+xP6n-`v7*JOCRR;x^x39~z(3WGwmUgcxXF`#A^>ftIJLMp9kI-zU!kue|?_VL0%37X#`M0gGPAor1|E;DeubN`7lOG z?{MB;t0HEG=3-_>?f|~ZL#g|xg9lE0(H8sIgQ>i2kF-vFktbrl>@l at _7f!z5JLq at x z7&CCst!A&h1%LHXcF^vE!)_v91H*_SUgN`vB45M9u*5#q24}=R^#&QmK2-*5)joBE zD?Pd`sZP^7iWo1fWLvQo&{7O&%+OsY(;{20ll7-xIA(IW1k-Vf=W`PFGCJ68+Q=8` z8BG;wln9k)+4ok-6Bv&>O;?aFm`8a{U5#x^KbmtT0X3OLX$)`F1*S6F7%tM{RdX~9cT zX0nYHUc&>3BdBikk5pSH at h`x#anaz0AS?FmF4Mn=r&YEsVHuUNcw8d3O6{n?u zVH;D*Z9Gb}i=t?A(k``{I){F6MDVEd)OKv1vcjcWiuUp6mz)*-&Sy2N)p|DPGxz9Q ziB10W06=jrs3GTerLac$YnQ)92YnUr8}pD}G?!0G_Vn*vn#`g!xAFpZ9QNvP0 zV*Dw-iFUtmJ&UwK&oZMfdPjgoXI(SZ=&P}Lk-n+;FL#kurZ_qsxVf7;!lbvSO6kO>{H=tvshSFDom| z7>=Vk-l4u8uq$rwuNBeLj<|B`x+MBt$HNVSA*Am at D?2Ss&m zXwwy0ZjlK5DjB##QW_N$SiMvZd?Bvf7e}}WsoD3y^^a``iuca`&cZjd=N_p#Wo+Q^ zs=#g#{Yu`>`-lAu`sERR4d$X>+HcY$FdkrF(BkS<&2Q-F`O%QljJ3}!|&a+Dm~A#e{uQ-Fv1xu8$Ux*7T-C-ZT*Uqo?w zt*UgDLsxPi at Z2<`AwU6d#qx6d2_8#|(r=j^yS)p?fWE_7R^s|Tty3#SC!ygFwzBt(JUME6D^2I`Yv`5W8-U{JH9*{KFA?09qxXcA;7L6zS z&LWzRbvCN5Nto^pm$mwcY%`dL74BAPG0;fzZn_uIb(c1+mR2d)O5%eTA7d|PHvC5` zgY)qRd&j3sU5W`>rapDWN;oGE{RanMIrjN%yo;NKA(rsS)212Z&dve9c*nJYBsV+jSKOaa8Be_Dd~k;mUamI< z1^I#yG@%hYs)us*OYd+ZdQU8~$z1GSCmDLBdppo{V7!q4_ywi!sYmE6BeG=2mDD+= z4!Rt|mI!U(P75#%`=GR<&Y`(B at 3(ttsH#oa48qFgi^w;amJtYHL6j(Q&Mwz at fen?M{GS`NnA$kxobp zutxn-0iiqSI#b=d)9+T3SjOc~>1MUu*y7w1cP at +{DuX;9K4dnILr at T={nh5a> zg0L0p-$)Gpg}Fn&-Txd@`go6XTE zR7T<mBNWjlD at 7>2;Nb6e zCbXr+**^8Ix1kbrLA??2YG>s;V&BzV%{vr6T<5udlw7#zTV#Z2xe(^a;xrb&ISw#I zV|BdxSqTJg4e{d;Qn8f5ly;8glkekqK0VD`J7UKYBeH-4VIokE9~mcj19#)dpdPo! z9DAN`VFA2N`W9Z%;Q^gKosOv_FV{I&*95g1%G?Wo9<@HXE;t?hmBo-8vMrs! z3p5MjV=wX7q9uAfPDUT*jC?Mp2Q(ri2v at mTYEMyMoLqI&CouZ7o1-efA9R{83{Gx_ z#eF~jWya&Is^LQn4gymDPtxZ5Zxgn#v5Tv-k%_Ckk)w!_i<#+vByTe2|Lhv7>#HsZ zq4Vpm1A&Vg!b(ag)axlS)W%;_1p(smm}=PDqFOd-Y=OQ^x0~UvdgVE%oAFLq zFQ)e$JAtSaWPEYAal&gV(Q5izRGBs1qTyg%AV6dB#`CufvnBYPQll-Fa#r}7_P28Nk!JO&;#;ewJsb5I zN4L<<@}S=IS^2GOQ!S}hNGGyCldz(m!#W4>;Su)tfZCq%D>JvH9~12n#pS~h)))J{ zOh9n~cn at 8YJ&XA*_|C?9q%GXzu-+t_O?tepY5CNA+H5N_n=*6yKW!ZfActtW^EM^t z-W>E8(iSNbrZ%N*I1^~fc4w3L+}#atB_s0D3ZA>z0{+OLVoefkg{!XuV?x9uM~yQ( z((C|vSfFg6zPsACrN!qf!id`B=GP z5~t7gYCVKvxrZqsxqW#^;KkX%ldEYs!uQCYjFz#~-IqC#q!xD#NY(! ze9r*y1VQcf)2lu}hZp0#B_Z)n!YJY|kcne~A4y-qEgn54jLpi<5X*Ct)%&q%ZNU?Z zhE@%aqI$<_=nzx^7H6`PV{0$aSHzRI&y17rL}~ZLa@@UL6bZdQ)>N=zrEVaLA`vd3 z2ROw9MKVq|hJLKA`ZWELp!-0%C*%<^ZprwFdCt0dI1Z3xWCrDk50)3?gBoy*4-Iv) z{n)HY*kLkmi@|Fmsm7|4OCXPiuYa3r#lA&=iVBT?_{hY*tJV+pO_9(Rv-~3?B{8Jf zaz`ahG(y&}=RUa`lJ>8ydbxvS*1LZ~PaOsXgy(-4djB4H8g~D7O4^^nYpu>!1{S@! z1(n%^6EqXJ+=4Bp3V{HjgI7dvojrA|(BRrQakQ~Z1 zdnP#mRTqZ!lHcc=d&cY9t3C72-?syt0I(jMVeI3h18|H3s+gZ(aQAolL9s>eCIE5_ z7(Lma(nFM5gu?i=umbAwgBCP3d2~~n>J9p;O3HOLKYtSwZ)SEKT{{6+8%Vo8;C0rV z+FDKVdS?89s>uWb!CW zQ!ZwWH#X7V$Xl<%_DP7NuW;N;%+p at zN{RXDaoqPoOtl?nkZUAcoaUN7CjmfN#z2N8 z-#wg?A2ciQxhpFhEp@&OMSp{iw2b48LYA$pHud<@A=gvj)<{)9lbzM)4{S$?wPK?w)`%Ik!NJZimhJpK6U$$=NdP}=JT-t zoY>}1m$E{gP0x6wb1d!y8Z`I=sx6V1z&5OB(z(1z1!S=}*9}M9w~J2&)_#n|p%K5B|DB;-V&sB_p(3ohm$tw0CVLr;WPvtmp=COZil=IiXLCM7;y-_=& zK4Hb$;c<5b6GWBG at PL0uGBG@R6;^j-uD2C>jTOOPf zd*?XQ*ZKYrd7>PrjynqEd`8?So-v0ww%~>GBz*J$jSSrRq0?UxeAwF*R?)UaGnV$p z#9H>x#6ag*l(%R#6uAXf1z at j!m#89roMe1oXHyPu(HwEDUdAA at XNX37>9POFtg0A} zKX;H7VXvAG(-H#(0%&|v8kllI04u>H_JGSEZ9 at A!C8~!rYb^7p4d;0H?oau5G2Nt` z>>ul+Z5k+vH#-ArH>n-PS(nG35=6)HD zI=Mf1#5vaSUL4c=0_!3$GQ=VVXwe-e+xITO0JTmlcFLYmA{}FblIZkSS at ysgdC})n z at bJ#~UyY;{A?n@{0tBSvA0tuzpBc%&K9F`bb2f5yaQ at GwcU4_=bp6m^Jt=!wfJ~-< zt=b?NRiI8arkGU`JGl at XJ*Mx|@i8(3!pr`YeCZc~e*^2+CDcV!HZz~j$VgeC>X&@X z1sN!+$VC`M;=`&%Zuhc)&yCCdVXfp2IQFm(Z_Hly4-!w#Feg1|;*b}Sv|jOMM``w( zP)B^LCB0>)a8E0|nnieCDFmAmCNB%H-Gv+9-<~wk+4VI6uaZmIUf(O45)@0mRg24-nL_Su2ASbzU+RmE}69Bf|pni#m%Jl(Xc(7J*f?Fbq ziWOBbDW43Rqn<>l3|5$8=VbzRVhqKMoQri^nuWjSYD%Z8kgCx*-)(LRm*i at Ozd$vK zS5thuM*^)NE%W1KP2jQLM{(1>xM&}D z>0!owK`}nx6B{FBGAIG_pc|Q^!GI)>z%V7Qz>*Uh5LktX#!W!!s3J*ZFz!Gkm5VKS{qh1r? z_&eZyIYzM?;oNO$HYIhtOPQ*Ca(cpA`4$t-k&ilk({C!qbd1MqD7nPsgbssq8&lXt zJEQfOZy*uYw!WQ=M&0Dl`M~`;q5p1V9 at g?>6Brtb=sTn at k;JG45rm{p%cCyu=o>L( z0;ieB^2_3zL^lO)F%$;T)xCn|U~Q&gd5lvl39sHjkXS4rT}Q6HM0< zgNpPv?n0nz{2AG2m$vBubnega4+|c8C&2{YqCi%Jgq2k|^?LTEi_0Y)vOD^wkJF!6 zt0I}bShJso{Wm^!;23380#(1m*o4L0e|QqjA^`5VUn-lEg4#mA#V`u>cO at Yvpv%21 z;W{!xSDeb=>Fb5meG%6xWf82iXL;Ffn3bi1s1LzzVR1m#%lNPETPD;qsT2m zYna?qn9;qjYbV)I3W|2c)C^>vt`FEg4*CTX7Wx>0^9wH4Hdh^t@}H`YcmueQGr7D; z_eejsem=3v^(xx_I+p$tLH)x*>`xlK^G10BGye*{@Y=X9P^2 zySKdK%bizf*K!MT&&Pp~SHx_ygA%}+NsOWShszByG{e~ZfBN8zk=7h%atEp_voxtA z&r|2?*e7YTC}E^gjL7pQL^n`w at M$H=>@NRttX?L?SdZc1Xn``;ZsHIMsx?;xoc6=woH>0x8hwh{X=a`?}d*18jdJA~4+}yvBR&?5p3^j^ojFl5wd! z1Ut%Sa>j2TiEETx=i-H-P{7Ecv65+~=5Ay8ExahL)P^QQd5c%$44(UC!b5+?S4FKW zJ=MTjMnm7S-DSjF%P)z?G|nv1Y~w at VOxCXdgtrB8uqIO@;`I4T4$_`CCW;FpH5Fjb zH)Bgr7L;gy>lOXchU8IehWx`MXp8{ggHFEkrcz z^GG!6 at R!7;WQMV4;tIs0XGbXfOUkwhs>7aL&6;Wo{v)~x?^EDP`?-brH;hCMF~jW_ z&Lk8i(-f%O19sxp*bnw&Ld`E*h8=JMj8}wkQS2`E93#2iP!q(&9%K%c0{v1%WFH@|>StBQ|GD6vl#kAr3jl_x_A6=#j+O z>pRI=LsX>J#xiYLU>|J^gauSxXmiPs1+-6vkuL|j{mveKP%9nFUR|^^!vsl zf2FlXY?|crKi=T}t1*m2Bn5B&!#&*yARw~;e;LDnUg%NT&_LIR!V8XuhG0Sbfe`%(m1xn&9Fm<&egqchyH>GhkuTLSONaOefY z1ki;j$4VN}9XO>uV-9!*DZbs}wDKPfoFKe{p%Q7l#_jo6f|-IEvOqY`LyD?;>#rvz z092I|S?7nDL at f=*tP`}EOo75L*P|lVT-kFjV^uX4>fF*3Sv7M-70$zQ3a5Z6d_wZ5 zcXjRL#sun4m}9duZ1`kig29N`}=b_VfN%MfG%f& zWd!#)6GkOuZ(`^*IdC_)$67qk^4^xXl>`rNK0+oXr70(Vk$g<)wb2CL`Kw7&OrhLa zVOcIBPB?3sZ7ofy*w=s}mscG+N at HJT_R5}I7f+o1jE1Tz@$})S9jCGa)e}>3q=Qx_ zZ_9=jQ at GoB9B6tDT(MZMPmC3+fDbvTpPCUCO3CLC7tn=w5g;VJRw_ujU; zVm(43nsol*+O?p21O1IjsX at _Ft59a#25|pnWKK zSPtIu0Cu&Qcx1BHaO%gmVzh2bU-N=_$Z#4+4ObMHO`Nmv)nY|O at fF{8F1f7&&JWZ` zIvfoK0a1~bBfMbCVpLLLr-Rxk7gErk6a`p*i%<$h2x7I&0caIq&LnK7U>st;0VgE( zcYQ(zgV at 7>G!ocV^gFNx63F&`1u|?E%7Wi}=gf`cv*#`V99(^kid2jHlp}+g+OBR} z*CzyE>5{9 at AM^7SSx;r8E`GkH$fU8+H(%GhT!C4_uUMp_`;I4nF?m)!0sJ;>h^Mjb zG(*SGmz08c{~7`HYMiNST?FjLbK)LbtSU##tZsHnB>uDbNhw{cwW1SG>hRA9v)imrK&oy5H-D^tT>X zw!+9iJy49TvW!`|2F#t(FRvhkLBjTFepa`|;STEgY!!DSHmnuw2TQe%$FoQnpLrK> zeB)UgrdnRK#ZPIg60)8=x%pD*s9mr|=CnLS%|RA;iHU=AG^)-Or_gB5X8KwJ+s2WLP9j+ERhiai`gTcdO~ z__{4w+$Le=cA?ZE!ML?d?AjWe*Ljs+Xn$FBM;U4#W)WBFj8y6`L27taV1<|37UgP8 zGzDKfD-*c at k7Q+SwEF#W^IJv$DR9tFT>X<>{f_h0cxNB>1F`$kXY;3El9eY2IJ+S(@*-gGqm4 at oVMAy zyEW{kP9et%4Xw(7T^3(*ow0!($X}3+-{1do!Aw+Y+2RZi1jLL01cd8+p$Kd~OxsjpQx(r;H+w0Vo|NzFz at w)Cl~_Z2i_ zDZR+9$gOj0SvAA17=naf=Tl_hl02k0ZTf0mp_;)2Z;Xe54K8>Er at O@5LZzekb90N_ zqLtlaxVopqVB%c<+|Bp0QEodyn%{nK-TfTtnZsHB)b=&m*T8H$Ph?pqC6)TwY)CG`!46;;BbYrSUDRg{8brKr_!Z+z9uX zMMO60{rco9`ec#vN_uWK2OJc-d!eg z<4vGoT)myn;|BX at rzON^(Vrq-%;lKT*!kxJYYR-V(V)*}qY-iLWStxgKeMRqMSDtr z7l2c_c3G)xxL ze2dYrUF~`if&GC{7+BG#+DA2u|u5+ zrm+$`O}!oBg-lxtvv at AI8g3JsIyq+ZR-{gfm4d!3Gkl0li9FI@?(;#njz1 z>(c1s@}*r_M_no^IQr*K*o8OFpR*TT7ZCiLl^gWt{bM<2&7vI(@nrDB4Ybwd>3WIP zi%ldNM_8iH(2rw-SJ(-jZR|k0kzrMy3nzEZN*XB-#+2a%wmsO(1`W%WVgKV1A)P)4 z0LA!k7X+Ic*_P?!c!6BtqfQoNY3b6+3S1KbTwCGtS$~FBL#2P5i>OJVs;gvgyNP+I z>2lmqRlY&WCQA7l^Js~(PN$QYEf52Xywma_h1 at O@t~?b%(o$i<*$W$!pD`5b0G07C z$wgL7_k0|I)BYTK4y_{GB#yU%t_O{OY&Oky=u4#*P*t5yqA_A& zu5cHL<~wX8y^dQ*s=)x`CWO)yw4DWuY8~SQ+{Z{ zQ{v}6vRCo`&1)#Ey!Crk#K~<}FAnMKfhB9v;#DqY7`h8VuQ^{e%&r#}2Rng(z z)4pbf2~&RF9Cwdn296JK&B!cJ at -i`s$-p?-%A#aSgly`D052zN#6@TW4Uc at uoA>-XQl|Rv>B1vU=Uqm-57%%NIYOx628!t4EmjT;dQ9tEg8NU#rl)^d1J+Oji2v-)fRNI at z= zhk`(rVO0rA%?dq8t!Rd~6%2v)jOwv9-HRLgr)Gh~l_9PP)nY)yXrT3G;I3WIs)~hE z2&s%444<-%vqlj}>J^W{%rpJwV5eFE8%Lx&LI#?X#)el5=|q&uPSiXYtBfD3%)=zI z^DGrpA<>>MD at PXsYX`y6%+u;KipPqw*ao%N at Q4H2of-grTCXR3hV^QonIo at LTN5wt2LF!O_Re(wQ zj8o>#3`b6?&)xu6er7(4fS{WFq%jV|Pn>BOjNdl+n|#Zyw+vrw;$T9#Sz7z=hoDq} zeoE#4-bj{xtG|Ap{1!?dOVji+{odEn1|xZ;OmnLDzrir=?ti8^ab zV^=pHG$3m1CN#gd!a9=~{o;eV0eR!_v4B$btj&eFKeQJNVRT|bO!dT;O=2V;S11az z?$G90$AuZs at BIelvay$FE1_;e!bt8biIe1Rgupvi173oMwg1onKA(C~F_ at zVs{TT* zMH}J_+eaByta%G6jDa?$7W~!`$5{t7szmimFyo#?GD}6&3nb8vU9c1o-!=Mv(h&(x zj5wr+?x?VNzgC+UJIx>tmn36ka<_F)jL-+ik=onH19XpV3pDvHo4}EjGZ)10FYbT3 ztb`k=$Ah?uRPV?4-Gy_mtmSXFwy-+aYbFB at E`L=9YttZ3dw4OjG zw{B*oc_k+L$&8^Rw42QAHGEXkiD5!J&n-#Y#%KIm@#~7(17^~)L+bH at F4`SGlJ at 0Z1iD>utci5}~ri$2`(W2Xk>5s=kf!gm#)yDH*Ucz6DGv$AY_HPC*7eH%4 zJF3Z at u@SZ~qQAI~w)wVK;44A>g9Xb^G2TQElT9YHCTi~a3{nMKlTF>~fmwkk*3{vl zFZ(9jdkby2j{V|1jtxB_-<{1=v4KqO>kmm0Hd<_ecE2oyt)u0^IxK-!dX%rSO}%I} z!$O-o=~&53&LgUN?Zyw~hCiowWwQIUg-SS_w&=d&FqwHL8Hxw2(_cJ9gBNd|MrZ;P zm_N{X#XwG&_X5y74aMdWY#Z=o2k2fRTr{^{z5b;K6C4ySc at G8xvJ3b>{_4!Z&HmqO zh3KR$#RVno;oR%OEg1r$2qJWGAtyYMH>NpLAu-g^1OPm#>|umGFAlkWr9RZ~-$CA+ zu00Vnm|?iW)^FwEmn;r_0@=rc($X8R>4)#_m#nLm8;2cGIumtqSO5k~gm%Uht!I at n zXe2B=Ko)hrv}DT+wWtBYYs#7Km#7GfVVSg)UAw#vPK_4g##PJ3Brnqihxjm!{XmmV ziN)OwQ`&uObxiP?%zzyp{fgb%WS-TA+o{<`)gGR%{mPvz*;H!#uZAJt_(&BCtDZA9 z&djNw=^|$ojedz`e9LF+MUxp*6jttoHHbv4h`g16&wOF^;Ml2YClJO)PW=Unnmga4 zK|Xeb4Og9EgRfvunGjJH=L^cN0 at _Ga^Jkb9>&A?w`m({)5{s7fnJ)PeC%=VOy-;7b z`iE*G31O2~n~g3?)A+lsiW_YO+5Tu>;uNy51d-|v{o1}3`fX8lSIhW`QEoXycLnf( zKlcpqr!KMiCYM=ny7nLJeom+eG!k!2MZ~|Wg3EtpB?OrvG-|~&&F|pQhzHZHl(BSx zwLCGjffn+ct=(xydUahLfts0w*A&3R!1BW=h>i8-{Vbp=1Bo5Sd# zML~1 at emc>|z`Y7!}SX2id%~p_+w!u%sQJ zTR-|@plKx2 at M+`^=)FA??Im$?5;L&!F$|SqzfN!WX^yO`wCL}bL=0g(3Lx!+5t2SK zu<-j-jXg0R&Itme!e?b;N1vq=(M=27{gjT#o%Kjxp0tjf`ors-$t!&C{}*ZR6f8`$ zWs5F+%eHOXwr$(CZQHhOe#^FP+s65KoYQ?{ciekBqEAFURAp5}J>(o?B4>{Lg*_SW z3+jmSDn7`19T0qe&lB$%efxqd9t+j- at lX5+UqYG8Q9t$^DmRL3KbMO?fdtD$$S^%G z1xcqOFb(zc6Zufevmp`9gs?$!7JFw86Dy#F`}!|k(*2mm2+*Ja0GhA>04)E%pi#20 z{b$tK&h|gI%Kc}FGDTHO4M`38CsdkI0v$Y%5Jj at 0{HRd0CM~tJIXvG2p(a8(UpMp! zJSYhxJHvmi>u)}t&s-U=^D^(-T&;@2ri$9<2Hx_rk7=lZxF{;`(Nu=h%lpgD?)%Hk z*XJ%C9U%5-5b;Z4_K=D+*<8%*n>`H#1e3&+q3pn^g!U*51e;bu9}O>gO}bdfrt*6q z at s{jAfRiZBe=vxEb9?Jc{8J`TE-?opE^Wk8x(UQdmX?e{Qb+M2__OeZShaQwC7!$l zqSJ6miUdy)wJ!Op9}VEGO*s6MBjTgoC-7FLR2-dlXpY>DOBpjx&0 zr5?dLu03(>#I`_RKg_~-oPy54!cdzf$}cuJx?ZdFfvnUUh&FdaSnY?RI%c2 zv##s3V|Fe)JZB at aT%$%WO3I+cfQG&;rQMS8Pi{f6C(PL-gR1tNsi0!V6 at k{ng#4Sa z%G;dak!7i)Dy>DrtI{f|u{Kg}L21Q(Hl>}ey>K3XY`<83Am|cu(~3DW7 zPY%b16<7RjJHist(B&f1gbhK#ik5Ap*QP>q3rT!J`02U3MrrIZ at maUzqE*viv8)(@ zAgNcuP-vpO3ZvDa5~Qb5=k%bfdyn?0-$N!Px?Nolk)k%;JGa0-kpmBh zt0CeuTw(H$Teo2(YLl^}y<;4uFmHL`b3-f`Bac6$UQZ zqLa?(c^4YZ+f8BgXOvi-(RvBQnVFQ%;2(m$Nl0zeZjHuhy}2pMArsUk8F>2SF>?4J zO-A&(xYDzGaw(U}trR-TDlt3wIjuesYl{?9&M3Hd^1MW5H-z z<(eWaKejl_>V5fzUDR*Es{&l}jz^8F966^=mwRuZ%!BLu;~upJW-fZZDJ0is-3-35 z z9fAR7#}Y8)ox>0$lGj7!Gl7uTH)Gj1PHIn1>qB23Ud$mQ(4oZ@;#^ie?kBX{{+$wh z4|XA2#OowKLKdOrb%dU0=q}Eam3av}9h_B*#@OvFAW6QL=hoT9I+K_|Wo6O`#%BRL}q=s%4StR_g$jS=pWSwkYH93nZP-SN{Vo}bRC!n%d~ ze*f-X^g>TB2LFl2*bx6a_wxUE6+1^~6XSmq+EA5pTNFk9G3HXW9wGu%lmt3XK;D#) z2SO&75E637kWL(dm;A_YG>}moq<=bNgv}lf(6My8HJBls+~u5xsBw&&NFon>B0DR>e8>9eNv8!e0o$h;GdllrBp~Kr${( zZjZ->A!GvU$2X at +5ugPF`u0m<@rJE7S(H3wm*rf<`s54iyaJIDG>{?FXvCb6ne57@ zb<2{zsVr|@e!CfR%8f$9%CAkV=yj?}5`FIOe2d9Vzg^L8F)Np;#hk!pxbmg-j`m5; zC?LK9;*J`MQbVj#f1e6xTNRJ|F%_-lBMiULBW!CX7LJSaYg)|CnsQE at y`ALCN(xVn zT&ilsZ(+{}Lt84-j51fd$8LWjD3xthDrs8&se at siD| zGDluT;0r6$);_izu^==i>}49Rthc3_D?!*+#gx{q$=-9-Sz{uDi1_if=UKb!kaF;s zgJ^h|RkCR6S!5^_7p^MsUPh2ENb%?t$rQ63wic*FC3IXJ87^xIp3OLQl~>VR23pxt zY$~dxT-tEUJT&wmkWv8R4TD3z0Tg~?$^wkV$`Ok+Q&Z7*$$mS6lES^ z7GBF(Gp;u2*Xa#pbU9bC*DGcg+>z|sq&b3{i+yFsyA at cXt{Nwxj(<{@@7U2u48Zjy z*u&k3vHKMe^rYe$NcX9C(&)oH5O&4g1MNt>!^)oCTF at H%CRAh?vM$SlA*3A(%@BJ> zl at R#A*|7{iYp43Tizez6)}+#4nh5p9?D;1yIGN1KztpD=xcMa0`$Ztq97G0Kv`kYtYY+1Q6-hu5{(8NoTX7cOnxnQl5B* zQB=Fx?9^xcl|(X*k&!yVhcFq+72)hOAp)1*14!f|sOmLN7Vu8tVL at NY3=)dS>;Sq-*^Gw<^xtW!*PvzYUalz?gY_tWxV#(hHpzk at e7Fad_B2$oF at x2yq){hVO8lvU6M zP7JrU;1Vso;WS*t4 at y3o1KFpx>F+ph_J9}jZ)o)>5tj^KLKUwNPCyz;oWqQf^b$sp zbQxwkBCk?m1jT&jxwd<0({EfvW!C5uw2rLy at lSv>%)J`?Cz!9u0ZM1yVV at Q8O?;sF zFF%X~oj+Ye4d}THdQxmCg(2r|ymVuo#0VHO6?@O)QWSG}5?k=AP~&1dKa=*F%D_JF zf|d0tAt7A at Q98F8W}=v-B<{Enn!ANfLhL-ID=0#pTYPMqdGv)#RJ_Qi)f!50t`$;a z)yzF}*c8e50(uWv&GG9Wjt88vS&lKbjj>x8!QGw2FAdBhvh^qn{+}CtRX;?@-oCtH z)yDI}D+s|I8zL`)Es^oI#a=dXW#|%|F9N%mH8f%BFo7)=nKX}ip>CPW_iH4kuaRC9 z=>33DD9R5rf(6Fcz{odtdjXNWBg`9jVvgIfLk!6zpBj#>$JkG7hqyx+$8JE6aiQE7 z*y1S4`OTVu?O`36viak|X?awZ!RuW_>>B&UHzn_r<~$>q?xXo#7iInYPriTm3c~zC z)Qf-s01$rw03`l9iAN(BM at JJ|XK at 23^Z)FX5VbI|HvT95a5iyt61TH9Hu;b4P^C%R ze{K6nDs at QAY;Bi^JXXNxp9BhmuM$p?zbH at 1ZXGCqVx1qt=una|jps4#*HfY9r+x$A zg>_r zWDZm!Z2c`>oJjSat7YMAC0Q~(7j9hGF|E{(Z#IASMN(nqoLyEi=bC0V`mL>z0kOGL z+SwAjv|!6LWn+uOpxk9D4Vx-hG3?8W5#ih?7Ku*B%%CQgUAg!XUA;q_8#ZQLaq z6XgU!dsX(_1&vYdX6RztfRVu+BO-^|vieK?a1{LakT$h`>h7r!wp`QN(dP53Cg_t^ z(|xZHHm%?jk9DwKJN*%5HNuacv%om?lu4Uqu*h%9P+dCso8)=g)cvN=yY-rau(4uE z!po{uEgHs>AgnXWpoX1w;2&z&Pxz5^ARE#q9U(IgevIP_%tW7TEi38B? zr!>G>^(Ad1?|j=rQSR=LEBEdDve0##2A}(_)tby? z+&S#ZR>3dGZx~EQxCjmr at 9RrpgsY3BnFKL2z1gemb%y6Pdoknt`}7}MX>yO}rz>4L zG)07ve(mpz4%L8hl91e4ps(9!4eGUv^iF}&W%8Mc*WG4$l_}ca99Y}?0TPP)YvlEg z5!#_5wGxw=%+e2|xl$q|0B-v(s==u`=+be>$Jmq85_)Gtcct5mv#DpOPV2n8(_hj) z3{N#_$-n6O=2_G`y)EOUC2y*)qFK7esH635OKKF!1uTAIG`erAk)AtB!L-Yg at kL!R z-U8>*;>KL=)ol^7>SgWSD$i};V>npLQMzkik$YK9XRC^unmkBbH|ev%pbpLkzF2`F z*XCyNB6!aMT(sdXWzj=0#ALz6>qbRK(|fwPK#<*#N)sSwviPXQ_A~~dq~T)-J1CF! z*Rh<(n%hs=@;04!xC!OFmwvnQdPy^xl+AdsTxxjYOPis at KgC_~`Sr5XvaWV&hh+`z9!$)a+DOGa8GLkTSNjj|zu764? zEIfse at Dol+;n+eG*hMFfq5n#!rqU(H5xK7UB(y>_#VWWwAYXB0<*?K(g2yJ{YYPai zFA(icFqXm>gCxg?SeCaQ+q)^s)e+ecp?edm3LYhXJSLoBq-Y3{6XjrUL7Y$6j4%GM zFX6N=2(sjmM%m1yv3js``Em*X#b$Ads+vR02p-Z@=pUxZVzymk*Xmc`X4#%Fvw5sO zonJfqVru3)P|`qkeulAB`iTBMB2PUK$a}PZ$H6xpIMF;X002J3{}2a^|Iu at 5^RJVG zd}(bOjolVgTa`l~kqJvFNNoUjKLo9?h!b1QEk)wfvaU_KrcB$KyjBzP3jO-(mJy15 z?bGkGet~(<{A2m}dEAf|MpQT0Nt3p`W^*62Pq!WuzrIf4_<+!Zas=sSF3$$DIA;!M zfb9-(fNu>2dD5BbLo9M!(U_+y2fZ*)V9?1e+slb!UYGY1V-b1fEz?+%S*YpHSbBAz zjQ7Ih3;uei`OQEjIBy9`MEXndrR$5UU~e8WLjDmFq}Vm0m&zpz^$R&=T!ua64W`^-w-^KBturzkmJlHD#MsD+hoJjH8{(DRHJyhX*`S=E>}hA zXRPZaKBxIabyIWSD|ZrFs~BVS-`C!}VLTji%SU58^q*gae!Hs at eb_{#e!b{c4To-%GfeI+a%#4 zwI!OR at 4o$$u~(j1k9<-I5x_+%d+2g8^D>!3(Dr*pAKiKxKtQ7$uLTc0TXmGDR7+Il zsdJi2GCAKU)zOB^qBqr3IKaLn*o6q!>Kx_2lw+FQ!zE-q zx8kmj2ZVgdl6g6xrPIkYOOkRj-V+renuVrSrd1jKwINt*&sO+xTQ7o>YbucVk_G}3 ztK?<0*mvb<*&<#kv6{|?*2uNlu{3fw0P#_9S)?}${8S2C7{Lvnr+a>`03-GZ`vHBR z;^`Re+GZ%T=Wct%tA68!J$Bp+>=hm>?{N0 z8$pZc%mmFVJUg=L_q}B71dZA79+K=Q!siu9 at Dh#r$rjzT%P{;Cj**MMO#sOeWnh>p z#^#6~5tO?=;^|N9Qp3dXn*sX!@!T`dBrgv;k@#{&0Igd0$;{}A+>A4F-iCN;KiGi*{!&^@Ri-M{F2KlI}r z1;L$VEQCrSXxJ=pFzsf)&$yWWwe$V~(*HBenvSk8XabCbt}>{OsD|P=-RH7pE{4qp zvxd$Fo+Uq6Lrj{~KArz5tHL-06#%`8K4l1hM=z(JqJ~kep{9J*2yc?N$y^ieAAIYi zw&BF0=cz)=^jvfZZ4;%-VQ)-x1pN{KC(BJ4Ew^x9t1>zpyhSk$_M at rrFqc3`?Cv_O z;c}JvXcVuR_vtO9{aln!P8>v-wEjt2yK+0GZw7~z0IYus>_^F^aw-I zD at 1bh*hmynz?HShb;;yqD=l2zQrU`or?%u8B#d4#C`wq)_DPBG5UE~LZm6MBQfms{ ziHGl~BA=@Og#xsSrozZRdfZ4( z;xIad{2}dp*d9TP&Ex>YfrO?{;*dt*CGRGUJ(58DKzdW4Z-|*1fw83~{Y~mQFNQ|x z$)<=?WE^L}UI`NlTl=+Jc=qiz2A!c=LQ*zy9TML~Nba$K1gIl8sB?1jD57EK%k!!H z9HDU1xc3N|QPL$~?V+Hwcw=q#iR>iuG*`4CaO(h_Il-`fDXVG0o+(=u2uNJv8BB8K z2Sg at uh&+uOFB@$<(b*1b3R5f8#EbvZD(li&TdNy^$1dcgG at US@kxjJT1k53)s7698 zD8enmWl3k-6ZB$=wmoa(e2?1c9%RcD2yL*03$p=|C`o3MkoBQ9w3>hq6+r_9YT<8_ zpYy$8O0sQ8(la;#V4!h?sev$5;tY!X%trjYI%kBJP)wpUM}}Pp^^I#IM=c6#ZBmuw z2tX5>Tzc4zD)u*Z?PQ2Q3JEw%wzzCb#}a*aV#^D?i|O?cKSOG_NbpKz^+(PbdC at eH z*07$I&Y(PY1HF{FvYch1Cs0|?=jrnA?!UtihSX%B>Yp5E9vT3E?|%Y65nE?RkN;d| z$x+i%+Ej)AiSI-sc+L(mAdKIu at 4YCKG4d_T#mi>ul}O-{0?VIDn at 5fpEi~uuL(7r+tRJ z6T&xeyhqa6GAsk at 0|-1H#F4T$X<>puaNg5tR=u4FeJH(fcgh2*(0reKl at T-alLwKe zY}yP{3AIIL>MYQIrWEzsd4)MrWl|C5vq6z#t^A@@RpFXsBWE6ZTGzCl%&nKFVR~;i z^OJHgrQ5VTYxyD95+#`@NA=^;RAIgiMe5MWZhm&0F?a=flXFMW29&}Ky)tDvMN))h zTyd0oM6ThCIVgrTE>8Bk))_jBqMC+AZq*=cA~)DTK-T&2GMA>tnA~-lP!O)m-<}*H z);y~!wFH|9dMsl5tKdOf;xbY}l5d@>c)OTjk|tHF3KSWQaz*iCmj<~!$_z4U`oJVZ z3aM7I+>l%>1vqJIQO?XMxvI6a>``-AV4=b+oK*@aHVH#@Hi9vYy`15#)~Ma8QKqy@ z07BDp-MiNDx7GeoDfFI||9xEf)p)#>WdWmW?WY3O0i5#lv#L|}on*D&SVv@@@q_W>S1pLvQle#5 z)@pcJsWfJpP?%G<23*B*(28b4lXetl))`Zq()Jn*)#1bQyyzAmHRhqaKmi;`j))R5 zh}lb+Dd0n#@flN)@foyN&-`ML#WJY)PXXGh1@%3H4;;)s=`#@wRa>85GWnlj0X2yM zlYpZ-cwb&Hw3;9&=6(?FcCIII^b(c{o4CtPFf7^LfZsoWp^s}qE^GUwSM_1j47Z-j zZdRvcQ%ewmf=FlKz?^559{JwP0d5k!3;10sN#n#$a0&TgkSS(&8D{jUUoZz+!4DLe zPu(K!WG<%dX`bM2 at Q5RGWYMb#;U0ekjg1kNVE!250;;9fBBU40Q=f3t{Q&dfK&y*? zhm1){m;DGE8$J9%93*wQrQdpmd($)YcYme at 4FysH_T7c3eY>A{tsJpWuI7&?fP at ei zL}VZcF)%=MAc%o50CgJZ9`wwxmho4c_lT?!J_Ok!l4a2Bha?m zs1=Rzju#)o9>VA4Plcbc{?mgG at iu3%ItI9vh9(-Ymt~jAnWcFh*qh(7sPyZ zNpx#p?lEoQ(^`0Kk6aE8)Y>WHYLB0JclxILWbSsxv4)Q&9V`&iR2?jk(p(+ZiD{LF zhiPclD7rQFX{2 at im@)X8MdTPOrsvCX?Vzn9f^+5DgDTo7io=4^r7!M>Le<&JM;nOX zFJnlxT5wA}XjU!2nm2Zg$+fY9sOPSzf7t|v^Z*6e@@$h(3K=zq~>jpizY1eM|ye6k7clxc7e z%M}kT)R`Nki32NLh?EvmVLe1=6Vf*Jj|Let^wbkiv_v+B7Ms+uF6Ahtk)CI at aG)s+ zlFgJb6;JeG)!75xug@?{4qmCKL&Gq2VZ|9CfhB56F7wc0 at 1{US%zXa@@{HSyF=?`v zIs)7(CrNw(sTDp0jdxT92j2!8f*3dgpKf|6P8KswG?u1!CG{kdC&91^A8ipDz)tCE z+}BY^ICgm{v7N?ep}4HJQWFCUefWs2MxZpMiXqt%R=$*Q9u0<4UfZ`0I0i8#_zKQ^ zkRCl_8>wUfV*VyaI|vqlHgh2LAR`Q at U^O$WAg99-pnUd~427-0C_{xl7#cqio*sza zDfhL{GLW#l^2fb}9))F`ZmqEm4@=y(-<9vXf#SVtDjbZeoFY!dgF at dypW8o_1SyX9 z=62u#`Y7j*#`4QU6%U1rAzha>AmCXy557;fwmK>#?5P8j^Q`B=W=8W;O59g%WJAS# zj at b?O(kRkN56w_u^#~e+)@g*NoJyyb at JkYOe-P)afH=$cN6A<*twt~VXBrFhrz8T3 zcPZtP9N-VZf0~_WBTh1 at Vvn-D0`L~ zse6Z+Ydj1;TZcRk0edKjA>T39O?uR?R4nK$q at zZw$QJ|Sq(j at EVsvz}>9&CG6OJ?Wv%DcmGheBQ%RZg at u@VQ57Dd4?~RFEmH zy5;u$CI1$#BEwczFIG{yIi?M4Q^M|DDtiXzD!c!c6gzu7cnFvLe###(NFl;jp%5=a ziKU3nuN-6PFZbqgtH2H$agN?mJ(ul-5`(@lMQ2jC<@$RuaXQEsCHfIP0FjckMRmso zkp7-O;o~j7kEPt3z*qV(`c7J!VU(L+j$qS|gK8$*PO!5~ML5 at LJ~1|?yNSif>yO-$ z73RWG2!(V^xjWSsK1sIc<4QA;)Zkd7jXHGPFyolwD`*Ezq-q+?ys_G>!9m8ciZiyyh*b4uRk>9LyIEPMMb*4xSdC^D1L}s at U+z zMCp^YBagoC at Hf2d_Rb8&m;c!J{*LHIa@~GvsOTZ+D}EqMg?GSyKM%6bOUiwl%UQF; z?fjJTTTy!lDNTUk-pUip#Pmi3LX5vPdT5E=wx!9(A}g72XUo=U>H#5O8&!(6Unj7Y z#7WF7?_+j7-*KMuv5w2wc?TfVO<>K0ZB7!Z$B<&Wdf=dhP}%;6}QJg>Q^*y^0kB_X*Q=`r&rk@)Ffu?AsQE2& zildWBsw32oY6DYK_ryv~q#OZ0A*D*P|8x$x62-u=MmK at jZ+c3Fov@TE)VU^upxSw; zXT3nP`%R?jx&?~9MI7oXR-r&druSc^WCI=^PiA&(N7ooeEAhwT0Cbb{wdicxX;D~u za)%zWY7pUzS%|=^mUECnJD8jtgc`fI&m}P=bRw9NY*Fk7#PL>jX3EaL@#f0=i0dei zSF15`Uzeov)v at N3AU$)!W6{6dsokkE#l0iFCyz?YmOLOe=S8nZ;?@E^O28r4FSc}6 zhd`2xqBgzox1}Sue~ipIR%|>j$@IcXpy<8?wCq%%Qa_2viUC z-+jVHFW`#{5Ld{%@a5FF-Y4A+EYKB~<)?Ym;ZZGg>S<&)K?vYE0v zOEIVM-o3FWin(XF_ISftAxDXRl$6{eu{dR89Y*omK}Wu#U(ex&?Vj|AIwpyi30ZY) zY+wwW^p!$K78SLageG1sYv;*abbaE at SkSd3c-IB&xujT^6ao^_v=54OH~?Wm7EV4Z zTLe-GSj4AT0!sEf{t9CykPTI`@vF(}7D?~%N9CB8XGTvB(O`=^Tfy`BzD(POH=n`5 zz&xqr6s8yK6_)W2m2!!37U2(7m3d^oD~9US3f;h~TowK|1CQIRE at bmI@`*<|237z3 zDy+K0zvSjRmETQVDL;cj;CA3F8At^#aijB$nqme}5j7`2uqc(ESE3v54{mZ`GM1Kg z;Fip*e>K>_j#S>jg at Lgmp${fs$o&N`1;U5K78Jw{6A5_*r!2HMt^J$@rFUt{@Nc36 zV6-0bDAfHdyai(fpA>Is#%KjR%wEV7vAw5cq#DQ(WW%GcdlRtT at HTLwVg!j}1jR#r zK1pdlb*7k7s~Eq;oknh(sJL5VWQOblacOI2lJbCadg)$TN?fRm&|Fx^lbYF*? zDct;#0RT)CZV!n^(OEFd$QGkICqnL)&eqmm++4kYciMIvn*vB;p6 z52&HP8u!aeJ+VKeOARx zNJF+oN7vFfIf|N`Q%-RdcJnvuYe#_7UmW(=N}8}K0aSd>s7osUZDjfk+ek at Ukbe0nyv7nN7 at EBXbm#TMDe=P;!bPO75lU4qS07eH>|Bk~(1(4ND<4DU;hQ zCAEsL5S5(Lxr(dvfE${pydqKY9aixjbhNcR0#TE)bBPC1_DYbax{iUVunQ%0W$a5G zB!d>V;}=+Cga-|x+;mR;n!2a+0Zy;b*+?3dz-FSsl`=}!MT**fK;}Eaw>=?FM>v(j zWm-afVH~~!m-Bb5i+1HXKR8@|Vyknv2~|6z5szZ>@4)8X{_NjKTUSD!2)S>JU1yio z;*U0<&8zrK+(gr8z;Cnv at VUAd!Z!=yG)yIrGjnSp8bxM zJ^0l47j#s;-r=?N@#%Eg}l0Amt{Yr6w9*w_A(Ar=B$GZiMpT zZomsX#eye0T5QKF&P5{A>>~ z&P=<)uMafNc)OCXk2a`BHLB!#vC4-2b%j$BA&!4ReE+%lCUT$TZ`uSq_=uAA`T{KS zec{^4-Tk_&+hNORsdWxJA?DxtQ(7b|%SY&(c(-X2-Dlxyt<}y_Nbe#D{_&Qwfw{-mg!s4^PeML`v|O zj=xRqzdSdAsIS2B>eachH&t4dvjc@?=F_p1xW%D3G_#AATHged{6DlE?_SBHyI?z>>fHdBz%)AZxTk)BA?vNT;}~9Ppo&)= zUTr)FmCcPh1urvlWlqn>#C}wq6ek3B3vOe}Q=#nF?8;Gx+md$bFjJ&vhC0t=y|SpzAHV^lA15BDJVZ$9{3}T=$aYv%w|3_ z^rp2D(*TRohsmuIwA=D_Es&WVLVF~Y%dIIf;umvr#s<362Umoe at nQDw1*%HkQsDA#m%R%0tj(IMrL8T57XX^WmN2wB zHdbghH8rjcE48lQyqmw>Y#ych`$)d9Xk+#U0BHM$7_|2Xj2xaF(0R!{RA24LYM}NgwW*h@ zZw at rINtdf&?G8cEY>+pk{WdB4N{rS?U7Ju2OuRI6G=jHGx>w-(u)I`YykzNGA*VKt zU)}(1hp>1z(0jC7G}$*0dr;`{k9x_#uaHS}5Kks_y$8cSkRUClQ_{;6+44Ksv0_zR zhxaq#3NrMVaSoBf(e{-e&ON8jJ)7dp!-}GWrDE;17M7LfYW8eHT+kuo)237Esj;;z zh&CS^;0#JxhXyz2-@pHa`oXeN|cGHs&$D9c{Rm5<7?m=QYCJPY}+X9i3y5&|p~$YRgE z)Yqy`Oe~Z*6(^;+1S)BA(V#6hQdS!qRu|;+17FVQu8X^tt|L#%oB|z|k55fPBQI?$ z7R9M#))W#p4jzx5J!*BaXALtK$5yLJ;xbCGpjOYt3O(dFP-Ro@)uo14Bp`BixDr|c zNk&a;8`caf7|g0`cL!BNEpdGmOUGpz>tmls2SxozS*e)Lt#qc=*5PF&%sdpEMWdU6 z^IQmtIF8yaxshVi_AWgv97`8S5I#xfCL^5Dyfc?m!ihtXIY==BRDK0wJ7|l+NTIom zsTf#I$jg=?gM&g2%p2liY}n>z>+D3X(Htldot?v(H?+8_=?CI0$dHguu$VN&0|3hE z%(SntQebETA=4gRO|IItj(^Iz{^-E+OBVPD=CDTFFZX{ba>a#JHI at O#_!tz4%}LPR zq^$;LfzkXK6jxTKeF+VNoD8~csy|AgM8ewPuu7-HJvVQgOef1&K$3QE2?jJ9;zYjT zh?jxwzyHOnGt1fIo-n;$m{VujblQ8UF*MR^M%0%Ux_+p=8m(2j1r*ht=aE-%MC at l^MT=mukZ~=WBC%d=R?i#BYgN) z4o$mjMB`h$bLuYKM|0O0ta>X!`>U8PZx(f~yLiXxTeHvhRuj6r4+BHG;&tx at V|RcO za!vzkK{Bmt)S465NnC~IH+P5nQ@$@(xc)DZdcTw`zr{P&pW1!A!X>_Yx{whF3m;@z z?&AE3&8i~2fg&ef=op{oNb~^;mnk<_p>?%37PbCL^xH$)YgHzk1R6>j4_3P(h!bkf zfMA4JGEPnC9Fa=jZtOK8*_#M5CBa$(!?OnFO*^%Yy)yZX`BvTzZau6R3#QTx2{PwU z1yVUy!5eYzEgC|S=oAPh6Lvz60arIS?Oq*#zZrz0)lADK4SQ?>QI-rA6IqU$Zo0Y~ z3G5XbIA_fd*-zbDde$yV!`3yJY{fFIBdsGQV4ikiIfNk{V0^>*^r5Ot*Js!bJg7%$WaCm;9Zzi3cDA1F`_aekeLhIV at t5IZV3?mS^q~1H$ZH%2- z at Nt@ox`YvJjor~OdPYmjzzW3}EX#v6_qZqYHfOB8L?6fcx4JYvn$ zt`prFY;+)~>c4cZjFP5Rty6IN8mWkJjc`hrADeW8yQ1ygsI)-d%f#O=wz`{RIx{qp z<&5*1463!*NR&jCy^BW=Y)qGE_oN(GbGK4fhTr7Dd;W6k<#hSkS!mB|@8Z9sf-|Lr z{;|pOx5v27SmvO*H-}`8{rgD3NBh%oJxrX21Z8`qgPFzQ`Eq#1Hn8=}izizTj zV7lO&k2yeQ5cUC=f8yLxfr$MBZ-EA-useMaTv&IizHX->Te2&GxxKW4 zgu_t4ZE~E0e)$lP6HrgFo^1VDO4ZT(4&W!BUeg_50PwPFdQ)32}9O!;cfyUcTH zi(S|ima2JcqApgXJ!xqXj+h~d=^=IUzOM29u2FOCfOp))#n2dr69k`WrB zdK}H!$Z`0d?T|g*!P+#lM>N+g(fDmWvaUepE~U>z%rvDxO(pu~lCrg0NxRzgkVqvE zS{0H*L}kB8CG6!gqIN~R7u%kxWw*?>;2Y~! z;f>(m&b%kab{U?a&E=?ep`Ku_<*Ih69$6h?l3QU27wTaP^{GFexr&g=!WnIfZKmc+ z2MCt!=ppP%)1!=}WoTwql<$!xDJvE0>_O~&h?ba|<}CoS3KSbfIZv1rhmzHTfZi7@ z)hD%CiqH;5jj$;|f at Vl%)MwaT$nczLE3H!frjmw}9U}=&F+`{DvDuu*%_Uk==hhhm z$>XWTg9*e};*BE-#XAYYvyzUqJeP%X8hYX9Q>eMLv0u_HP;fPu1=#s~g1J29n(BLc zXIX8O$nK11sglmoG0z~taxnFw$d0h6H%Xq%QVV^9;kjfa#_+={o at lWquuLPsCA_~c zICtx9Jf8&`7D)on6Z-mQ;$Cq!Hh9N0{n(<^MR+JH+Twm99AX$T3S>K4^f8CBwYd2` zuJ=o}J6l2cNOq_+p3t}^^M27L9}XL*5TZj$#gEK39O8UDLQ*_ZmU2aDmo(aXQ!PWw z9MR#LiWjA7z=k+wXL at W$7J?dbNQrCq8u3F>S$E6p| zEU;moVL`da__?@+oBMMpd2uh6*AyiU0yC{0Wb-vQ-MQ0vq)$ z*?i^Nk#mQl42b7HxZcH8uQwPBg at JkrKLlixuplTNYrO5*ecg8I9bf(Vos3cgh~0Mt zrO3wQM=V46$`HUdL(W!`SGCvWX9v0*#Vhx#AQ580D%nW3nJz~PrG_e|?5yBY36Oce z)kMAkiXgb`MONpj&3ee>;vu-sEJIRfv$d#HP_xlVVV_aU7TI^w?-BcGe0DPO(d|c6n0eVFW8tV)huyMxuxJ-v3M)c54Bv z^rD^hTl at rSi!lBq)L^l}45c2uicngQ)ILExic5O7wi2#{$CPt{Rb}w887Tm|$VaeQ zq|98^$#tml++2r6dtG(KZ)0;THK|10Z7`*l`V~#24#C+|Y&I#5o9<65-8Bh}N&K7T zUyI!)VkMHPvoXgMQ`_?|Fz-pB6+MOx at 0s(OvlJ_<68B#Fw9}#JO0FvwzczkS&ue#c zViuvws{yI^pN|2qqlMCJ2oBGh_dwdqmdq$q)9Sx{CsM-zzqQ&NZFkI-eqyRR!G at YmUz}CPxZr8Xd5 at sG_FsX_IUX+uF5iV1v#9iv`9+LVVC9Vqf8$d6FVsneDs_ixF0yjZPZ>j zdT&Gl0S9C_+`Ywa^l*VqVX5B5VPAeDPIjW%Gr8JU%T*`OR1OEu9Pb5+h1%*kZ~92q zc`(L$Ayw*YTkt04o>`K(v8+C7h?t6;*dDl%a2g98HQN{w7Pw~6Q at pMzcfL#G7~J$Gp-)Mjn}df4aIS~E^qOy-vEKH(^;`8e_sc` zQObG9xVrEv#A{^IhKn(dikKYzj0)k|-5ishl_TzIEKL476Dl#OI2);!aByq<2HUY3 zFQOQcpHy;<^_B|ND3>q)J at 9&v?j-Q4N$PeRt}P?Rvg={hp-R7Xm8deKxGFZmwW^kY za<4|$S|oX~b4lNGo8Dv_!ONLJXkBTyP=!dr`%suu!K(GBoW=Xa)nh?Wz5}vV(JxZ& zuTpPmkhL&-?1ak3ot_^#1)8>a$bS1c8=N6EE2#a=Lk8K&3CFs<=MzTwayUF~o=<-S z`ZZT4cLI~t69A-hY>~dBxZ63xtW#lQ1*-duwQdMc0+7G6&hcr%=Za3IeL0O)a=qoFd9s at fIRj}7Tkzt_ znU7lS?T8yWp%l`)VhD>{RkmQGB-WZLi5y8xPKqm`;RX4y_gW3(?X zu_oG at UpKT&oHuk3H7ShC4Log0o{)kh1Te#;oyb|N{+xihOP+}pCrx0Ai-LZA0BFR&CL7o*bG6WYRY=#Z>C&gMJ-BnnV#c`p$(NKk3{RXipP15c+jDJfEzpiX zYem!u2=fXyaEL>7r)8!sdBva{uFqwGIzRWt{xnF+YURuV=~UR9aqI-4&0|fN!^X6G zEGedR-mkG4nSFapoRBtSQOvdBNScYar!A=P_B(D$wDOFG2Pvosoa|b#_2eitK2pBR zCXTVOrDZc at d|ya>f?YfiS364gb5t&Y$+J}b1;!SlF{vdQpU#NG$?KdJT-p$%F-jpX zQT&xSMg2}c?$DB&%^YOdt-ZsaI{7=i&>7k;lplSZBt1eg69|7GuB`Ea^gx#*8~tsa zskdl~<#qV!wU&x1)Va>4B$Fid)Zt!VI0bukIi&`aUhDDAhV+IG??-YMW`ULWsNG73 z`t+LiuOAS=(t8m5m-ONzH4S^%Nh&9VCkLJj5#S1O-5liqhgEQ1eng;v&k_ljBDuD(xT5bFeVJNjGE+ndB+5#)M zFOQ>kTm(#!l$PT(^0^zgC|!E4D7e4}5<4Sov_(BrGj4kYW-_vksGM_kA_2X?nYM(7 z!Xg?#?vNRpvy^&f`_{|oN*M#J7Lnb{jXw18MgWPsmOS*L6md_e at db(<3cX at E9gzU? z2HFPVhSCOXHbzJwb6A3a4|dPdi?F6ln9J))QO^qRD(?CBIva;#jpd at _;U$oUVxELb zoQoeHqH0{Y>lokO9FGmd+jp at lmr}C}VGjp=AM=F;c7cYT&hOZxyyE<9T-Q<%i at U9W zh7hc*BThvZ=CJ#odb`uHU>_9q+$pG7)teKL^(t6kP6!}b`Gy{ zMbW&(OLsSze-c;?@n;DVSW}3ke>TiZvSPW!{`UiLfb|E%jt4v at GW}Q~0JNCOkH4(GQD}i zuI|nYRyG0SL3l8^m{0Q~>u&os9q+T}0-mI9fz25vc*T}G)zg`@K#$tE;QJc~et&}> zq->#h22kyTl;`M-EMW;|yDvWgz54dpVuM(?`#dAh4XHK#+rrCRJzs#Q`Zxp7%uor` zeN5_5<4C?XiWaycX#Jytee`G^{Wv!55#^@v$nwhe$oTf7vrszRH#(UHuv|F3mL-~5 ztZPvW6ZT*Qss`8O);D&S1|*x-h)6$sj!|4(+WQd|c-61ELZTY>2`wg^FNovM$ha@{ zQOod}rH9Mqqu{}rU76pIpdZd@$_H5jsA{Dq7(%%M+*VoMq0pC*#ANp)PaT|AWu10u zhNRQ90mEQXm3!*U=5%6suB*|MAC3pjEqgrL_#5n;+06m3c&0_QWu?FUVLY{Hx+lv| zsl?U^TzT589hOj+^$gZ!xskb*@n8c+67xgMtx$lqGDhl5oMHy)RypaZPkRF_s}B{- zrUqI;i{M%;N6i4a*!6xh?LInNQbsp?>jSPnZ_LNVjgpq?{mj8=- at nbJau$2>wg>z2 z<>=2R+5cGc{=5hn>DxK|>z?@k-cn|RTBpCMF~)6eEhK`C@=Zlk7s_BAjRZ;D+6--* zK0``v<=lj=J?S)(`DOBjiR%NZdkG5?H?5W+>&Ewq9d~+@<||3ZNNn0cw&#`OH0Lzu zQTE1P6ZH|l(Dy0NhOJX^*@+2=ia@!dOP8niX;Nu0RDP?_6BVI0(S%M+nA1YLb(j#d zmy5Qo2;J*aR+g{H-SP7$64I36fMAd4E5mBK|K^$EH_4DWxuQCGn5=nFOs;|C1t8iF zHf}+Mo4?7l0V*1=(`68e7z{RIbACtt?*-XT3BO|6jj z+R>S+8EjS1K%4r}r!~xF*E|1?N(f;=#OS{aS1>#tSxG8C!d6X-+@!lHr^bb#wN&pL zP3=%c1xx1~7#?!ZFZYZlrg2SQRuy0Wj=E?bY(}a#$Y6(i33qgFEwb)~^%4UIE%d0f z6;r;xag~Fea}%_BC&TnS{Mkq at yZSN~0Cr>t>V0 ze?Xa_d8q7Tp2Sid@<7knaJ*3wN3Y$^hN+7Cs)WV3X4-&>TZoi;(Cgx)m~bZeSO}SL z)>aDfClZB;)%{LS^Pr#y6&L{qXPe-^a9hYEQXA=wxuA87=c1iD2G_c|90Lf)H4+IU zGMHR@)fGKW-nnK+nYRabh z25|rIKST24&el&3B%b!o*GF1rv7*!VV7wQ7)x0e~~V_Pi|c z&iDF$Qs_ouxr$x^X7AN6 at Ytfbwp1_bBMJx0TG;#7b+Ub?#hN)G at h9~?TtbNfVEII5 zP9i3R?nUQ2yNB6%(a`|b-K-Ksoj~jxu7v+D2N4O95cXalLdL-Hy9$&q=TgEez!t$< zH9XP%+mCVK-Y+`e8Wr;+q>ed8H-9I_V8h4PtHzoyIj5M0YCcYuVgD+QS+p|dEeX&V%p>)nkQgM1VTv!YR zlYRE15cw|jF3bDUQ*jy7TrElu*LJ3>p$HuJtVz%>3cBMYrr9oO2)2Q)A~%PlBifZg zw0f3l5;*hvw=HQ$cN(Q=;9tG~kiL9T{U2yAJDBTRnS1=B0w?ca>*oGnL2eQVtE4G{ z_JIN7Cq>~cuJJ7yqwKepMmTy#=+GBZBz%w{jhvKm6uOO#h)2Jk>lj?Til#-bd4io7 z2cGs;_gDyQrU^BZk!)U1{OxSVhmB3&5ASD~9&ID^2EAe|7!&kD#u6mfYQ3)!{x5>P zD9MAT;i-Hu2DG8{Sajy9F3XP2%*=;r=@pt}{gW(=1z6)_03J!BC8mP2^8Nz%IDpV? zT{ff2ay at 7NPR7B0KXrX=Z_?rlhq;bZOJ&6nRWqK3M`F639y45}#JH2zq7zW1e;RazTG&Vb{PSV7LG?fZ?@Kzn|@Z9=o zHg=I0Hi at N0woJ>0S>5;ey|541)eBu?D3VHeNo!3F_UDci?W2eAHXEcPhqXBhPpZS% zUwq6vHYW%|Kqg)3ai-yyJSsT4wWW`*{d1H!R1_F_vK3Rwp%;{FW$79&PXe_RLl%=b zi`&_y?fGS}MlB at 7aGi?>QDd5GoW-kCkFL%c6PtXI;^xXz?Q(A8J0_q4?!u_ z&E7j=FT=VYRaAS(+<^R8id$tZ2rOF(6j!LhuxU4W at F@Uk}ig>Yxsaz~F{7gBDD zchLS6*Jr;papO1GfFllrGBc{S+BR9YqH{;^$Vf5k`73 at o5ratS`LVSX54xdJg-#TF zIZ3H$*fAC#L%w_C8-=Vo0=1B*8#coz1tEnqhcT^n1B_nQ)s!2;U)SGxT_m$d?2{y^u!`4A$p)Q`- z0+BQVp6CLv1Tvi?!SjM at 2+43W1dIe%{P6|RTm at GkwDDX37}M>{-~uvkFC9dEcHK=0 z(+my|h9h>Qx?yEOg4)a*6u-2#e*U6$9s4~Il at Hba!q(LE`7TQu?RGSJ5l|(A?!Eo219!^K1jtyH9 z at C1iQts=TQS=aXZ=l3KOTb^aw2o*GDY6b5yC*fRv at 5uSVrG@qm?gW}x&*p at 3gfdA# z{)`T0W+jF>i;R?E6l7$iXJ^(zjAR1^xt_6}6rCJB16$)4y<}SIDS3A9mf}M{1NDHq zwmN-m(7nTTgD^^PQh>vLm_hE3-$4$Cx+tZbRcN#8ohP*bDGW}sDAs~avM8r4uLued zt}hG at RU~1JTz9ZVo<;GtHHfLavjQ8MJ$@y)dEf5q^sn~ps at 9Lhu<}x?nf-Ouh46Ut zNgR2Y??21}voW^gxPUk#m&*eocVhjBlfHVz1hJdxLih=gE2!^FIH9A+_K_ at Z z^TbVWvajSN`hhm)3zC!2O;junT`Z~*Ml7)aMrN*(D>*}PfDI)vUk&~kMVAHVlsB5_}AJcoBnG! z;!)|$v~Mfkx}QNGh!>odcMFalZ>_${a^37$f*|^kQ|+!>-jADCo{yE!kKNs$U+wU_ z1MLB*`qFzgNJ at mbeVyO7pbPLHRmR)(HSj5Jvgaj2(ASuvu0aV>8BYsHP%od$)puGK-Q)2i<5_P`n{8W zu4{DpijKF>ArMj9wJb0c8N)hg at g+8~IAaOR<~FWSn2t>p_l%3whj29Hj(5CJv_dr` z#*H5oo-oCCSz*(qw*AKB$S!7#tNkghO7 at giKQYkoYh<8KO7R^zAxK0z zlQ at szl>@y`dCOGe7+ZG`n3Zq7vZow1z!ur!)5Hz5WfHB*FwPkJ&>5sL#G4d9^_!UQ7pMolxKr@|6DufoDu_50#uCZ`%DW zJ!Z=4T!kB|BGS@!W5=HToF3!|qOo0BVM#2fQfuA7T>d3#`Xx}M#+lQq6yC+ at os*-2 zq2Rc8|JykQF5IklLKMoNgcA(h#b_qARX7eHYEK4j0qBbskctUdr|mhdpb950GZ7mGQ8Xd}&1~gP)*0%LzHV2$c>s!TuTL z&Cm4EL1t&nCFXlKc|Y4!1$q-oc^HFG3 at pUtAZO)6_VsbHdl`8OW=Z~$Kx-_!)#_(# z&*OqVUwImal27TxR`uDO{aY~9l@>8 at 1f6~(c}{T#bKXJ6!6n@~tscN{%~8d&Nc}*L zJxm>yIY3)j;HXkvhy-lne55wt==ZTyY)8+Di&Jh?X*@}tS9#nVYXZW0NyTh#Ws!ah z%>k#g%4z8do8;aF_;TX?0_}#NJ&g|RsnEGVi{4=|`046?&jGT)%h7*T|K?C?S*E$a zDTQ>C-7S9$(&(Fi>56R`muvMKm+q!Si#|Yih;u0#o%?2Z2mH!agj%Ox#J`jtTvy09 zRx#>o at ys)eBo8}h&3KGj{6!d_p(`BAJ^JPK<{_FC%!gV5$}KO!cqR_T3Cz3YSEHC+ zmafQgsV$`-=GX1q1H3EHtvuB`!J7wCFx^}q)(v>XDvn at zXu5%Be}B!d&?-ORIJUN}#VfJioFwuvSb8=T-9j2l6-2SB1} zOJ$<|p>u)`<-KN%$AGDG1XI*{1BEK*ko?3nzt{m^ny@;ydb(P=x`vvD`a|uxDJK%p zDaFoCC48V7f6)MY>Q$LuMNPcoFxbQJdB&Xo%+HPcwubAF*O(G9F&KYGOQo1+2eD;| zU<t+cF^qxX8Y!3&)I0e(8z3*i+& zaATeO_tB*2jobv2AYZ;bLVfwd_kRrjf1S2U8z{tROYVUd0|VSH`j zp)nRje5<$5fOCeF(zIt4sf?jveh-q4vkO at NeJ1JPx%D z;mUeF6`Y>9l{n>wN(PY1pXNksl=7^2KecH_f|ffz&^jW%#P%kD_CuisXAZUMfUQz2 z%s;lcnLV8e;GtDZZKjO^ZUYPoHigsBNi`EqebaL!Qbw#)G#si~Fp-4Y6s$EIaY at Geibv^DPEbW6X}!2X zG7NbX^}CLDFYQ9cuwBmx+M|=8g9Qt~;7$b&Yf5Suoi#p(!rc!f4x!@^18bItq&C82Y)bLJDmffGExHi3i|Q4hfrw1ggK zf_(^^gp}}4;aUCoT3aaZR8EoQFy8_2o(4n)b;okh0fta+J~KF1``JbCjshxulaJz@;bBPVE{sjjXu1Lf#Q<1NHVyoL&b8D-7nylBIqeSzrZ zA=xbG<(jkFVS8l7Gg722B6ajABK)IY;|b%L2bcwapPW%7zrE%A{_XaDK&evf;~!8` zp#LLK{(It>+`K%R&n3Vz&GA at XSVUL=w;DXL**TihpAar8n&!r^SzEH!GVe at W{7oS> zRqvmmICA6SXfD{WnNOdz9`QVK9%XN>U-9$%f-{7e>Wil)GHeC_5*a{J;S=0-`iP-p zummOgnKsabe0l1t at yx@^)Z5~n@%rZ$CvR|t>?Y|Pg0~{|Z&H#Jv$?r7wn(IC3^7 at l zOE`nw_?aO#c?%}K1dkLO+nY`e;R5aR z^?fFhqEW>#0hi#-CUNm0l-#vxAuBVT=r}4mbor}uoYC* zpVgmb2#~zKISs&Ahc%9!UJPnlizZx^=zd19r6~w3fuq;JW8w33l|?6?Z>atj+*JU< zR!yyCr77g>beyVyJzQ3Vup at Qf!Kx&kt(v zJWE>;5`E5KehZ~ai<%Jd2Pe>zuUh%0P251pE!`A^M!g-s$NP}CX-YbS=9l at 45j}|(Q z=1v2K+>+Cf0B%DTp{_peC+JOb%sPohV^p4fg+VuQGkZB4@@xZT<%*O`FmplycG`LV zMYNYvgk^CZ#L;7N_W+|G2XKqRM6K6aL*XeoZ+}}=lDCm0@%*17#r%Ij>QF>S>nQab zpl{}QB$A;0f(b?&R$EMPFQ#t*tRPHR=1szfA$z at dWhLLGUcys$n)j%6n)C5)>*MME z5a$QhPcTA#tv(}6B6d=lT*$iNNZDrih!CPh)a@=!hLd>v|Yqiexxi*m| zfVT?OY-Xntr-W`Q%=(S3r8)?8B1-BKEUd|;!Pm6etMgM*2!=p5>4f!)U{xynx&cMb zic&P13O&1^g?!_92Dog;MA{2Isr93W;1j#`1vn1^GMEh-j`n^>DxsBM+?iXBJOx8H6~mSwSlB{tzC;>gRc~-ajBR~@%v9(OIe-0vo;I9IWG|F zdH)fiGG+Zg0o_0nE=#M%P`n}Kj|f3~IgVEL$0+ZPSR$3LG+Kywp$bOax1FS_YO{Quj8^o;bO_#?) zz7do8A;oWnUq at TMrZk6%7cd5LWQR$hpd<^48wBc?Ext$U=QYYhJPT&omR$h$F77gp zu3wlW-KMVVRt5HJT}_qknPfa*430U=4R4Dl2Af#rg+ijSihMFPP8nWIV}?|1Y{k&a z;NRa-^O;qaZX1f*gwFEaX!IPgzrHXd0Uvq&wnv z`iuM%;@_bPl0pc|0{!wO{m&QUT=|%poD?AKO?1i zfYw+_9s&gUi2dm=iPS*_s`1KL=8J9%y<(@ahJ at ycJMu%q`S$pmoxPKVCYE|vpyzZe zL7Qt)H~-rW<`1|oAad^u5%~e^s0$7jFVdeF zs6nEO4dca@&_cA9 at rFySEA2*MM3WlPhqTO*uJ$DSN at NX>bNSM6SgMnZoyAhpyNN5I zt#7djhg9?tW=7``3d}z!A>u*9bTd8Ajda&faUfMau?1 at J=zc68e`Q zy@=Ops0GI*ZqPjCu4x;3?P6M2_ofZgiPgC#9jdeOfWa-3JpG#7b!lZS$hR4*HJ!_n zVv#|-j`j62o440r$a1?H^pn#^fMcbHJV<&~>yqu%KSbaTrMs>ZB zJ89t%?Iw$6kFy)_We3^%?2G1Jkz$pCS*HrGd6Y`;%7~XthT>heOS328% z?%Y;{W((Io84hN0eruQkQH1 at GSBu?q}hWa2(#bmflei4KT^#gNn9 z at n)Mtp}v=bUUN=1eutlLIlNMen|Is%#DkfaiJsWX;t6{D#lOR(*ylRr=ChY8z& z`jcSh1@`x`*E<6O({1UYd0eEpHS^E*wAJrL#-bC+BilU<(KLhu=aw|6Y5un2{NIlF z5Y%`B6eZw-HDy=HfE!c at D4a5(5E0Af*6he(Be zusrq)D{?SWsa+UN;rPngGzJmTfDzT2({WZWX@@ASFg at 6P9GJ_v4!JYV_>)q9_js&$ z-Iq&Br}@Twc|K4q#Dl*L6X%>$TrdBlr6PZPoZ$aw?Ef)gPgLK~$=1RBzrEaFJHgOC zwb_;!VJKkye-MPW-KZ3Qi=$Ht(8GYhZlbxlVXD&3YbVt%Ip5?L&k<+2S$(2U1IS(d zssq<)b5Ho?b(g6-4V-?zKUzopVs1so5Ly^K2nJE}Q(vT?N{Gf#YJHkXn(UVRjhG#m zj<#UOv#DW1t9$@y(>KJ1`c1 at WMmNm>w#NfB^vtk?5V8a&h!qZNt zvrsBog$!5D8Oei3%FMvt+Y)i_EBY+aA(Dwz!yWm(3g|?5R(Ua_>V4~P@|(e!26^k% znCbAGzzBom;;bQ9G^Thg7`l=fBIS;FNWroR$u}>1)5Z zs3e}J%XE4S^Xi}&{zP*XUpSs#}J+4BX1~vv%D_>Rz&`E0+lPHweK)ap2N?FcA7xuPz(j+6JSt zA;_FyHZK;hBX=iNEO`$W3MY5))u0atX0>hOf=SnqLt&owxv0lU5T}CvoXJrZ9z+Qe)ceE zKCuD|V!uDkL7vAmR7 at CK1VcVbjDUJqNV-o(iS({YVRGR;e_JJXYY9S9MA}=qjOriIE5Vj0l*^W!gDexpR zMoN3#tWAGT`6Pk<1O79hYb0{&>HNvn%W3GwN&^In-W-cH&1E_})A513dGr0_>=yV% zsU;^6L26hTg|;P+j6FeIPh*%CuNe!)T#QQ~IM3ARnbdcZHf7wu5#uSEW at U92H{hYi zlMWzD!>#yJRT8I9_Xvm1zAd?v$JKGeb)jQw!9QQgB6x&M1|e zPA at t}9I4#gP8$({8nu^WP&bN?Dnwt(M$z-NKiu0X(KKYXE?$=nGeEHeI*sd+>DV$~ z9))R!vES~k%#F~C at RkTo?}-h?v9XQSQw|Q_wu8i+8)tsbhvLD^@$|r~6(VZaC4i5y zp$kPNsTy=jp)0&Y%Scb1sAvUdkNot at UiQ1Q!sbR<)anqfcs2d%87FrEE at 8ZWEoGqR zL}N84_-H`5+>TFiiU|S)g)0>Oyq>)X?EH$Bib!&LMHO!xz(XU>PYH#y||2v1f0i?M}pRiE^;t=khr)}!(KZ{3w@%aS-tXcJ0|$Gx at _%rxYEL{OUdq-+L_i` zwW2(0rL!9d6jOrxR5vDD?g-DpjEG(n at IX}PEC!J{n)jb**GY at 6L`O#JJR*ZDblxy* zAz&`|yBh85TPohK7^?!_mG!S!L`8;G02mn~ID?&-O>z6B_fMU+E^}nrm8EL6S8~|# zZsB4O+9d{PLMS!0dC3eY8Gpv$zCX(_wDo0O#Q3}6G;7AVR1>MGPQ*^h%nizgcxarM z=4RQLOXODxRoE*UzFXm(6VK9eh<-wsR%juU%@*fNRDfpXMI{^)(iVLpSl`7DU^ejJ z5FF1p&At$787~LpthJ~oL|CPA1Z>Szh4Ez;sh~R}yc6Q1f^x{M&>``v9c2<)hra%c)ti6~Qxuu0sk_GbI5rVvCPgb+RFiTf-^Fz!W#EPz$b zmIk?VBmbfjpyzdjXk(DTfXmFkaq9baBJr{%RhQ6mJM#l?kHzP2cW~^Ex+K*9XQ*ZV z7qxN=f2f5xZThK#oEQ;~DI9dDcul7b?D(;2Hw(2oFq{`HRm4rYN!NDM>-LQE0qGql zjG7bWJ1mB}pH_#4q|+v~z}D{g>n at XdyLEEnQ8%X>1kj(w;-tnkG-uXF%G#PK3IlY~ zTC|TMOmZ&5`32y5G0nbFv2oYJsC;IyGoGD7L<2Omf1vi-nGGcwR4Hnp^@8Z$h0e3> zb8k>z_o&=rE5W90Fo6OlIueOm&Tbskk;vKipGYf?Uq$59gp<7_0*;``8%&T0B`*)zpYLIr}@ZEG0 at Pt#P)yjMUF zG3izd$dfe at XJPR8sS=43H=jS$sw2}q%Si)9PFqIp$n}-`dr}5RRhFSujF+iiMr^Da zMW+V9?=o6~po6W5|4{4p{)bwd9G$X?WR&(AURy33=8f$OvbY-DAuH#5fNbGF%}n>> z5qqy$gi8}Y%$~}e&E|S%xSl$+5Er8)CO_V(d2x;(Mq5!)SR0geRst4J?@|vR%4XpE zU5%9E at 4v8R;l)2aSz4NTBh)aS9~vJSI&^Mb2 at aEW z5^<4n+6PpYm+o^Q?=sE?Bm`cd&6ZeZ%I32jOfMXG&PXYm5-)gji0yxcKSS()HY>y^ zih()zL{a&+#vCBjZ#gs6I3eHs0R7t5C^G at MXmQS}v4Yc3*Q{C7JiM}Qczyx+mMMdr zL|C3ilu`U-r8oV(Vl*fE(9`gFOU-9KLSPSGWPw4{Y$3k`FWez1KP4L))EYnv3lTlz z#$p_MN8x=%w5p)hZQ2uUhu!_RBZ^-!$YXu}fGhr=gUj;I6FZZ(sA6cJGIeh3m%o#m z2pPekpsn{vX!5?Ut#J4al>PLQj~h{pNiaU8`Dt2kpFUKgg9Ir%^MT5n3>)`-FY at K; zE;P`MnJptwSlm*~dbw^pgWYzkBW8OY>+}6%5$B5%MX~;Fd6=cSlfDLgRf+yy at Jp-t zo+m0lL*ei2yL=F#?c?8|AEDfQDd?uOFudxcNke0BLtb{e44GOFg=&>RcHx#OcCYw5 zI!L<5ah|({7E+dcnd+f05bY#IP)FW670~f$$(y;S%Ko`~upuiJ-@=}{?1)W+Y%8xr zh-gN|1LI#=@F~YAtY{qAVfuzfoT7W<_kgr40>q9o%H at KhWWV9aFT-?&DGI3 at K>F8b z1KS&a9zGoGTn>TGO(mgdtX)ak{H#AjGpjto?w at 2cG&uI5z%JK;^e^zR{=G&9N{viC z=#tnW56N at 69uqONBxW_yg!$dao3dGF3SIfz027VN!7jcduceO2?^67D$E)8`%#f(c ze8Q?`s9HBe!rVeCR%Ogi7o!73p3YeADhdx4_=~6H_`l0 at otul`i16M03NiR99BVJG z)sBBIdF!GBN$264uq!`aOD;anpgceAD>MX-Rd~{is)|w;%Pq)V&bIp(XMgPa22b2+ z$Rldk9+$C;e-cVnmkQ54D<@VFEF7NaSIU5J4BbK zQ3F7S5ZXTH+RxYA%B`i@?+tL+UKn#P)<$+{F3MXR0Sg~195Jv5>mqyfO(gGt at O%2k zyJ^GJ2GNG)lpFZjeTa0#{^oSW+qpuA2RTI*S);mr)C6t at lgRUdA2%q&=_IUr=WSb3 zZFEBihe^vDmS{$Qf&lyW82%MzVUz5JGKZTogk*%fFiF?9q&(dMcrh&sYH{>iq{yW{X zmT~@ze{5y`e{L&T|GP~4SBo$?Sx2)1Z2{&t5s`&E?|0GJ!PGeh zQ~~~9`NzE-5Ze79LKMc5N<~;Gqvy!J;!LrPup48J!%mOz`tnH=FrWYfEXtsIn;S`ySduK-72{5`brGrKfn;lmfjVJ< zll3>F3<6kk;v_qgW;6a)!X%~j18`&R#!=${LYhHtxl;Wwf$=Z{b at 8Izul-5d_7u2; zuzgB;PjPqd8vPlw at c}8XVujX5ULF=92GY)^vVN+kGXPbt$S^`X8Vj4wDR8lSsvF5L zKjYA(J>_Tm1T$WX2K(WZtAg{%#_xHN#;@>K_Q)5 znWr6;3$EqKhZreZ!j3MBl%X>7wD&vUCDZLoEaGfNy>-+qx=le;tB{OlYD?Fl*c+xA z7eb3}+r%<_!RS0L+I;%r&dl}zRc`i at ljSb$%ThzHkQp6a_zF0By7V)?b(2{;dVfw` zQMh*&=ky;sK#`;ugP-7$#0d8fM++jdzqheJeZMOiwM{$yq|HsSQFgtbkrPV2Y=^R! zf+G6P!o$nlH`T-EiLLO0*xQN5zk_nam_nWbc;O+i*CMB0{@^{iZ;Q7*c4xi?_gkIK z+rjeB5yvpQxt+bet*KhyBlp9}zT$vjJkXEWCky74wvW_HypBTV--;!%t0?2&njz at 5 zo=d-u-R>os9T!-@?AJyd;l0}RCJBS+6xO=&uMQa2NabTLX8ca5L+U|`Ms{I7F~=wD zbmN|y+fM!VH)w*9DpCXfNTT_FE{Saa%w;F#aQ;XlJk3_4WvL-K81^@U83;HdKeEEX zAwohV^{;DSMwG+7SQBJt>J2*NPl=WvVGlD(2};x|A{Is26(8KZs^u>xcI++!NlT*U zz`rE%s`I%s=K1MjI>+ZLL(DxG%|x17C~-gr^xaN!JPn!NUQ^h#wAU2UIQJYh3|v40 z&h!(kO}m!r`9+Vb5h*Z}iV;w;rPO=98%#W?+Sx|^hSzl#Ptv)Y)T+7HRWKxzhkVY> z3c)}Up$Ox%Gu<}5#8sl};LA_N=x<>Ayv{U`S+7#7#yU9cp{ zrkrKnxd&@o6PrlQ6|W3Yw0{^k95r(N=>@oD2xN5iOWW%7NkSiqsvVHlfj&$^nzT0j z74F%Fjx)GuYVxGdnqcd+G>zyFgdC`raEP*=lEUX9&zT;c6QWE89AcQ-P{#_|3uUH5 z8a+=2(>6IJ2)E>)+WY6*U})+ZImw at 9^*{x=AN9PSP|0|;lGKiOsSUYZIxmB9xhdO_ z1GGIeDAe4%ebGH#5NJX2ye2ddh~9`fw at G+vt1METlp$*r&Rd zr!o4O4P-38V{V{leL#l^`kiIWkLC+O-q6dakkZcYCeD#xk|WP2YHo-P`e{=k7c9;- z2Uc+kSJpAk(~vyL2C at Z`?H}%BOH)tOa6mgaL zh=rqa-;$Ul`Dy71g9Iq^3#hhu at 2O1AqX}0!$LH7gD_ at Y*UPTxTy7ZPrVFaM!alZ;_ zYqEcsI_k2_+ej=$+Z?sNwRKu6_SrPHtsj*+sJF-Uoew z-qqQc6P`;Wge-nJ>t>}8EZ`W%okzejYyu0Hj5ggk0~R&Gs!$1yl}^C~$AgwZgfxe& z;kR3TlUmW(fxhNo=erMWjycB2>nunqeP<%;x8$0~IN^eYD)gx|t9-wP`Umfb0fwD at e*1&rf4}<#D_%v=y})dU~gs@ zNb)u+qRXJxNHw$7Mt480Y+qxtztk5BwvkcZXp?I6=mFJ1HFA~uFXy_}NA66gv%-V2 zRslb)^apRJw+j=?&-eNJkF&DJuHUMSZ#|W5EK=>s2o)-gSu0WW%RtC^xX=12>B{G* z9%QL1E`i_&#?D+6iO2bTC!TKE<)v__=C@&U5(Osv1bsde)%Queo3yjQ@@mcZ%uQ-( zL;U6iqUL$PurM}kOTYa2VZ34L*;Xdq#?Q zaj>D&tjG@^i%^LB32~g%?^bJBw+s5cPe-f>A2Q$LjPK2#B{DiAJwb5KpT%mhSzS7tOEK|No;qBEHOU?n{<(KrPhdhLZq0ZM;ve9!LqZ+p8c(x zLTwxS^RFgq(SMFN$3IQ&zwmCd?2%YU;?`0ULM7Li(13}Ofr4ji6z?OAE8>$)4y&)p zj#{$B=D%;`FN&#DW<^m}$=8rp2&Ej at r$uz4I}i*qgjp*-EZ^oHaD0R_9IkvDnzAWjFhS5`z68= z$ZQx=aq?9$nHU6CM=(l`nqTsfG#NsbJGiHr*;!7&L at POxPS`x0==anQ3 zGe&I&P$8Qxt|Lf#wntaHX?vWm_^GZ9WV?x3!szOYzKpS6h~{Mo$Zk6!CE4m{pV`{5CMk}?2!nk>Es z0%sj|WGY+lU6UhD&}Z*4oLd#&y$5zeS)>%009a(?8{oKCeD5ajHYAy!X1tr6mbP96Q8{FYsW0HBETqjd``!Co{qAn at q#zRVKFRSu z9Y^ApMWWtN_(;sGp at Sm9SJuBV#ca6_9u0ktM1lvhb0R=Sz1t9rR&~l1{vC zT&dn7I5%UAJ6jZ?AaSf7J)^Wm#sbIwC&<6UpTK$G z_CMr#IsfmTm-_$Wd3XQmd9nHFjLi|NJP$ld{&-$T7DmF^f$5u+Ss zZ4%t|j?DGb9UJHGPq&9SKfuit0vXEmxcvDhL}!CI!OQ*KgXJYt+OkZnGk(MPk z2~M3}DtbEodLLaHBqN2I;&m$ahAx9G7=KmwRU8CCKT~!K9T1?HC5;=r_%Lby(rA;i zb_&=gY*+&JQuRlS|7x3VQlHs~&|6AD79x2+GKoCT27v$4Zj57H*whL zkMyGrGl)WMQ`{IjOMo=vycjya>u(TN+9N(|OCxn+3tKa8-2T{j#OM1SZ#E+(9E0fv z&$HBbm&O?619O8tdzQywE~g*-K$s6Z-4C{@z5BPWYc=T4!SP!o(9tXe>b&q1eKs1C zx%XWCMS8dLdwv!LR1y_)&I!)&oDI+TPT?r`<6Crv*;0*)u?c672jkxMohgswQHS<^ zuipf~gD_~uQk$_vp`97;4D>WRL%aK2k at eG>yAg&tXP|Cizaf`JJsJN4dn5kBUhQ-m zMvT#oZ{1hdrNsSS9j&BqvYq>}q%9}^g}p1Xd5AWDVQ=4G*t`4}_KuFv*Qz&AXR12} z$y&|-6`Aqhydy3vuW`50P5+8atEj4>KlUgde_^kO8QZ9VQE%Dm$lAR8*Teyf%s+uZFS5AMar$V%^}s|90;rT9{#Xzs*M<{)L at WI z9BlQV!4_PNL^YHbi)@p2Cm^rS;_O2@(v5Q}UBK>E&aEzfyzF=Mh{6%Hp>*pJKskn| z_!aa*_F|&v8jLE#VANfr(!n5hy at qOR4!2E9&FIeee}ix9ppPCZ%Gb!4ek)*Ca;3M| zi}t|=59|EC^|W-Sw4cVi?F)Rp*RMZLL%lCO%d|2tRd7xUbftsmTUX?4uGg=FOB6_|rV at VA=k~JvIUaD4HxLp{ z+c*{N_>A++&lj&_bkXn)U;G$1R6wJ~af!1H{u%m=H$u at TWrONN3}zV z9p+G_Yx$u|*x|m*qi4et^*gyNe5S9QEEne*yHz?&;l6^qC1D65%-{}~WR&^JNt_95 z8L03rn7?uoMs}2d4)BpD`-vDHv)C-=3za1KfXVTM(K#2}$mdG+M}Al}K%$_i(EP#C ztXo3!NCKur0E|R#$e5&LGzcoBq)DXU$q~M;M^Bd1>TazOeQ*FZ_4ABIN_X-- zJ`~^=OeKo+{YfdL+Eb}`;@!_nhpMq}>J4dP#5&H_um%!|`6%7xgVwBqiKj4;`VG{b z`qzP9I!_|uk>|+i7-C0zZiSR$LJ8QzYY;y$!C*OPL4FZ5CP^A))=+vYuOKTnr3;f% z9hwpe$hqwFpaCJo&B4Xci)`f7Vb<<6MZ75IBfR`kGA^^4vp3iZQ}lbGF`H56+(8bu z<1{x1y3yE4rJ7Yw+t`3qslY?57o|;ftt$f~A|h(fBI(;W6pEVNq58;kZYpF6?5!@L zjU>9h8+B~({a*y!%-i4`Fw(XZiW^Ifm2Bc(9?Il8Secl>;nPJY+(b2EH(sE%z7Jdl z9oj}%fPXV}PkO#>>_wZo%)_)I?fMr1haEp*|JC3s+I?R{{a*y!JogU*CjBDdyQJOu zjp%J`V>6 at WDu~Er_jxF$YUv}-hG-YTamm43YZrUkP=|59co7^?#=yMfv=sE|-*+UYR_*yM(G4xa5^(t^*t$OmI{vG{g`mF+bSzn*`~x5U z7{?N)fCBZC`uUtVW8{HLuY7sWjU%3 zW!@;^grE5(^P>L;GH3cf5twl+AHgWtn&Gc$T}B0|GaZZSZXzh!-#XVEn&9TcUTj)b zmTz;5AMt#RNLKl3C(iwoIZFE3_2vU+js#y4Z_xek1l*sd|3$!IPB at HTS&r5#xfWs! zltn!{&XM~h)M1yB%p7ALf`W4l3Ij`wOfCP+Y}cZrR&oCo=dAjf7lBwVT{%-3DhF0 zn?c1*hH5A6TPjoH_KKNQWBNA}Y_RE2y=y zp7)mTPI!Jm%f{=hWc%l>m^_Iw#htPO@*~Ctp3C4-EP0)$ zD`m=YDRM6Yu0LUR6?U$m4%Z^^0J?nn`*|Oa-_9;xu%CMN7~q}`3#q)n^|Eyx6W(1P z*07 at qqnu8<$t9sOld;%5+Sd_B^-*NTiJ_h}HG`}7;g2to576KdZa}L{XP at H?vQ!Zy zIYYVekDrPs1uuT`zTy&Oe*J&)N)9p7`O=sk4E};(^h0^vL$6Wx at Hi1@OI+^XjOjUF zqDMPqDI}TL1=((scnNAG4Z5ECR9gMyVcK)mB>qInis3QKzGslJkW2$%rTW7k{U!Pd zIoZjx?Vp7<{mvL0ao zELt}TV^k3vK0S`Ipx&8tKHCD#hTKH0(JEtETrh)Oj)_!|yb^Qo^ofI&?^uOyTu7ug zIE6T+Iyq4;L~4p1#XkR*@)^J8QfI&THx3&JNZ@}Y|9@&};khfd2hFtcAhdlxKA>e7k%c>htBOIyE-pCpFaZpCL}#T z4_o5*l_I6}_hyosT>_*%fzd at lzieuyjbsZ7(FdtC+)40H9MKD at 3ikdeNG1{^fnkE; zN3B0K5jbf%^q*NG04WRhzCDbG zSf4MHZ{8a&@Fpr^?37)67U~r*A_R#G=KkfW at a;E1?AFzkz$YDei?%d5xmUadS4?`g zk-+SniMozt!5oUPwLJ;rK^Pg*bn^+ZBTWus->wzO`KfZ`BjwNepK2Mn8G+l+7o^2Dph-XqTD`VDW(BzW^EVCk>n9uX01HDrh$5m z)`%P;q<)- at Yzm7%kYv z;=;e4vW#NXVjGu*XRl+dn!w&-te)>JiDAClLgdK6EyD|yc=c5+ at 6yYz|eKt(*X-K;b)Pf`NzouMV(>G){wvOM1Ecn6E3n7i=FVu=S- z<1)K}y#!~OJ*uR5ktCKX at +~CLV at z;f-bNU3u$ec;yoX{_Egk1Cw#DT*Rk37dPMKmP zHQB)dxDAc=OJPS7xiL+s33Oz5RuP*{VOlp9cQn5v+r|_}zZ_BEu2(!a z)g9SM_=yB at -giM(xvl&S8`c3yr|k46`6&ag;TSr&e8!Nq2yaOAW`j4zcEv&OYqArJ zL$~kad`)zfW%}+=NZ))$Ew1(b$DTQgT2D3f`%G(=b?G`Vi(Ki#uF={Pn8}ZANjMz= zd#EpvPE}3XdgioMbtbIIo!>6!%mcRhUi{RdFAI0P9lC~Z`JAcLs>-?o!CZC+gvce@ zBQf*?gRRjSqgDJ6H*V2xp-=E|(g?Xz6}Bw~paBWXEnGHe-2UE*P(kYG=bCkzxbvE*Pfu2pVZ6U_bUpLmJIeOF>`@w= zAWBR?8x^;cW~{BjpVaVD$s8|%lZHB*>P+`yWEX&AN0ZHUrn^0{%gR|!W1zaE ztsFaef at 4QzAiJbZy;s8)+zN8iyWwhtcj~;P;7@z`=r9LV2)zh~7=aNrkq6 z_ipkUa at K~Y1$*kUUhph*Pl zt)#Jo1*~h9!vdshn<+8SYKvh2{WNT#y?9EjNYRzQ{o`pt3pDEyr at -eW6%s||86d=m zP0ygYgOVU+OC_B%>^8E~uw9*zQ`X}S(AL)q)3{xo<)c>+CbhW at VbEfWr;s>*nx2s? zRL?GrZA8I8AiON^HV5(k&O6f#uRC-|?eK?K;=f{$z3#$+DKB_J;49r7tWLUuMVlt_ z0`+zaZT`g|`NY+;ILopr`2;{hyqr}Q>O+F(7Ewvju-&0TUQE`o&zBr2}W64Q~%+&d-YAQYRc9&R!ESr;w at qaz?beW||7)_E~{Lv_E2hud=hn zQwg^&V~g^*{GKimj{;@=vp74U=TT2-aUC+bR2#`LnbTIqy2?vB8?P)#?_g&FE@&fD z&hf{|faRwW1_4KWukdq#tv+|77S-1IXkhZ8sbuKIupmT_o4~%PnFp|CGPk-q3iQjF z{FCuB4aLKTX}V)kdZ;FTP03n0vfUz4Ka$?%%l=%Gu;9BBj$dDZ z^)1CL9i~Ha{&2}o)658Pp0m33u8Hp~SjE0?6o at 9tuf-H4B)I4WsTp2o3^Tgv>ps%b zm-EM;t?R!I{XT8BDtcND=fGJuC--#uoo??awBHm669q>^*3p7m>z1w!Xr>E6<}N`-G8=~-DzmNQ0* zp5Huvt3m%jZWe8-ehIRl#TAjyHb9m6c`?IFQrgwDc;t(RKjqqoT3$KLMLUOGtY5V6 zwM+i5_0*&KhF<{!1oR071jPD(T~GgPtaYeP{$mS-8O&-B0YPO5zkte|F6c;ZCV`0X zpJ*Daeg_6U08_k?d#juFkRFfc^-g!4-%kkM6pyR#SN2Q;?6&JP(sj!#fx_k+?TeRb zkK^9wZ!fpI-G3;H=tuyocR! zZ^Bh|gKuJ9-blGegVS at rzt_(k8ei+2;>W_T3LIYbVm`vQ&`n!_BeX(B53tC zckBb3D1EjiFQ&W-Yh|D`ddw*jN9Kin`{075M?D(7B at m#|D4OYfs!DeGdaqz==y?cb z5nnLy5UJK9$uTX018i4g*S_=2G-Sot?bip+W~#2Ju&;YL_ufm)z`KJ?=NdlgSpD)a z+O+7;gdjo~UA`-vcW2 at rY5%Mk`Ds|{op_fUB2}N-Ah1i$U9I`K7$mK$EKwZ9_1sZM zd3AZADkF12!!)Y)nYoXCK9H(i2GL1d(YR6QH%|Rxj^n&qbnv~UL{UcE;ROjVsrJ6` zB?2{{BhqsAVZB67ewFgmQ$>w!xnm&%{*YpOo;il2`5ZixlFjCRUXBETo&sZ??{vmx z4g7vA@#^~;FYb51R20vzm>VrajPtQTL(;INxvPmXD?U`5u%YP)S#?_7O)g#+*m|Wz zL1yL569oUJQD%>G6Y^Ft_$Q_W1R^m-k zg0LK)m>;{zA((ozQpz8i{n-tS?cXsA^DM@)%SW4$>h$_qvB-zk=gZ+|AOvCSfX`QY>OW zN9KTISi`)xd4fGtU#k&_1jO@$(z81z;@oNUA at h=Mg8nw2bQMnTy!_>-u;BlRpZ;$v z{RfHub2Gd0s@$poO1i8t4qZ at wK5d5*9atNCS(R*{ma0l1N- at F6tC4L)w`QI$d2ZK2 zurCmPkXJeZyWUzbiLd75*u@#A^Vw&v<(It zGfqHIVZ4wJT+4zG^N+ at iOT9VQcZwU~?HOzK*!sYnE2Bq$eY`7}oKz+>shj94vxVvj z25+RN*g;;=3vcBW)|CpcHswvi)lxQWqbDPI_3~Lm3%SD>wPX)Xl$V_5P|8D>-pcU# zD#@SYTyx}5%+`!ZW=cnRi{`M8HbuhYJQxk5|s0Il7takD&c1ql7iez1>?z?A at f|#5Ay83GBMRpg6uE?J46KBE0**?FDxlVrSoj_o9QE zTxMBH6pIedjk#0#A6{!BlYjsqvF0Tb_#`wvrb1w2NSVDqLeU{N2bDsp1Is*srdq?b zM)*nIAfq7Opfh0?iUwNDJu-LD1NE_9N^`oH?pTHO+3zA0Gg`4aZFlYs)Yal+SvTJn(0utbw>W{glxBAGQ#-! zct~K;9H|u$L25M#$Pz{YsZ=6L)xBA^H9-Hkoq65xAHNwzLopm&T)x*loXK at vBe%E% zSAfewXS(;KbLOqn<;KVDCBEOcCzPnXXvN=#Fsfj;&=-RUz3jQ32!cFfVXQUA;@!ev zZLl#;4UKh*w22tG^Np2Bu&Z9(2=v(CO`)wTR at Z2~_fqRNW>|&GQ=R~T>}^#^=Z&HgN?J5y?9Cn2IG%qVTlyoo)URlJ z)Aa`wB;-$G at B=h1CLv=^uWh|AF)2-7Nj;fZHlbhos$()EIz#4l$bnL`SV<)P3iWZ? z#~J=P9q!z5CTAo?RK5p5ziel-+%%)u!x|)T%k+xU2aA(X&)W3)zqq`IM zM=JIXPvn!XCxuEKNWG2%$f`<}AWR{b=<5t)~I6Za^ zL2MG+!J&vdxvsaJ`dtv}Fs+QQ&FQEAcv#<~QDa_J%h+59BrgI7(nqv%BumPNjR*tmq8I=DL at zb> z5$cXRn|8BQR0{@1B#{aSEeHsS64A~b7Eb^LT5-Wi-m>ROKm7yJ8GGP{z)O%BEO`lB z7^`INyJY*}c^4o$&+!g)FJaSh56&b9;f69j*KutfFe|}%8jod#o^e<#;^$vm>-E6e z(*>`ne$}}Z`8}QYP~w4*&VwPzg6ttsBU&IIf^bh*gJ^m1sZY3hcW6jkQ1Apegd0fG zefk?hUYLY(+Zq^pEUK06l`58QPeRNcQt- at Z^chuu at H1jQ{x?W+2m*#5fQD?dtn)d6 z at kz=Gd)D~8_4N;kAIvh+Sp-`@Xu$`N^TbWyI>nqiPxQ}Xww+%gz0%< zi8T?v=;^fP`EiQ?F>K?hQP_gVc?&P=;3?{dX=?BzA71c|`xB*si4IKAB-xevKtNzX3%H~m2V=ne%L0?iP5 zpn+#uG81~>{WJyXj;9C{OZDeRqeq0Kp>B)+GX$WR6{^rG)QX{(#^9{WfoxaVVV%ZV z?e?!BKLH(JGF_kY==PA at REih@86N?-Nf=PjkE&=VdgvB4(=`!N%!`OBQX$D^Ypa^D z#EO6s*9 at 1Xy>XZBoBpz5qTlu?<+edWZbWx3{-7?NN`fuf at v7C3DrB6s2*M)OE1fkTi}5vp^e{B{Kv{(J#hUGqUbA3(o^2A-4*Ex==iXL$-cJ z^i30ZVb+75{~1G!wm*6z4DS+TKAP;NybH#HnTlLmjUvvoxE=sHys9+psmNwMY{uX6 z_5uCShwu9VL$nw$v>amm^t8n at FtGhIqW#x`JBU-a5T12;O^mEP2;I()d|SJEPIst7 ztYx}9cQ7*EnylfZNU1~C*h at s5E%m)JMY2^Am{6!N&_ShYK`JqNA!kAXb6aW zLWQ6vDYwJ9pDDW-O?vS$|GpkOAlO#)zSJ$v96W7KdpOwEQ}%wG_TEYn&xjcmp5)Bi$MW$=(MeGqw)r<37E<8Ex%dh&3)se>e+<`o4nEoZ<3B<;ZU zr(3grnjjc6Y0E15^>1kYVS>Z~{e at BAJ=dp(G{U^#o`X zP!g2&-kK>zDisKg_gBb)u){XrwX?nyd%%M7g+fB7(?LLT0CC)cxXME?9*iJjk0~a# zHZ$KeH+SRtxP4r-2hz4sG2B%{ZK^pj81Lp1_Ee{`e87;pA0YhIQPuX-u#q&uBQX#c zv12d8pXiqM{CX=|oJsdka201b85p*qP>E>ey9W+Ts7(V8Zfoa)FM*DeaK#X4z*YF_ z!8;p2qM|Y;A|>9GmydU_q12-nk&#AuQ{*%D1-Q=h#q9(mBX`6itW1$=`f at JSi%>cP z%^dcwJ0*RJMkn$zZ5k}9WJ$|(yzOzkR5U`d5P*RA|C8gk z?Cs3|yZviOJ7bF?e5kc~X`n at xbNC_)A(7YOh_{1~FbxdU{I-#1Ya~L#3vOT_{HsYZlr%??nw2ob_}pe(QO?lsU?Ja^gn>)uUvDbY zRZS~Wbyr&_snp~ICJUA3P0H*Tn5ZkF#a0r>ZGnX{MIz2ML0;IF%*PD0f at rN01tosB z7cv?PCdkI6fS9RMzsNO~o~kC8O0G?_VyPtXn7}wy5bzs_>D49Y3{#EMv-QM`7E}V6 zg}9ZZr;%oN>S|Un+jE9;=ToyE{hYO3^Mh at T0OD(n!4y?4*90zbv9`TgH+8L*x!0b$ zRQywdj6oyjW^i;tZ_$#HQ^3E5a9V z;p4W!;fIF)2ef5u+h|)}i1G($Xo=TAzKPje)C!V=!X3B4jPE5AlF?Y=^q7d|3B zhbD?T!G#kE?L=!WZV;O20ej1`o7R(3Md))}6X8(sR5wnujnOIRA at 0i0#_u$wA}-iE-y7M!WyswE7B}GSm9RX+m}9!yZCD%o zCUS3;ME8;-k{@KiF>jaSgNGz?4bgEgbtn0lBeDx*;973b at y!S1KKYylo)U#2(w#d( zI5bm$_n?@wo(-y|L{g#zNOp&JhIYwvyEwWReCv&URb_%&#PV8bujivF6CMs zZjkgO!zIeoHqrQU8v=p%VtZlcU at dRu7VMLJn8X7ZtcVdtj$^#oM^rah-v`*gnjf}i z&O-m!Fc=u-%K-mV^Yd`9bTTxu`PV`4s?w?&imuQN7%`+AjuZ?_5?Ob$e{3Ooi0)59 zG7Os$gT>inY4K#_JP|%4l9YfVUx}_9=JWa#x0k8!N8%03;z&IMa%3VkgIwB&wGUda zM#r0SARcWoe4B|af1(ppBiKY!Qg)z&G9B_rh zsg-K;QKc`^W=SohHkD~EenseX^oGr5_01PxBE}u&f&_9jAF& zAPIa->Wq6&ICKL-(P8bHsgX`Jzw0r(Zp?J9`w8yd?pr9PS}Q~@RD5%CE--RvoVC1U zZoA;_)T&8sU7oTPUW14Wm1j|Qwhe0%N)?39(u1udYDmg6 zyxXG_W?VbBUkYb-;PPBpMH2g|beneY*z>Uap=1x6+;-+?l#~|z6g(ndYUX-Iw#pFL zI1DU~4)zYprW(&!x?}t!SE%0tM4PJdTA?3fhKejEu^O#Ik(8#(-G&4u7c?l-^f09q zfr8h&wExo228DVvfrLf}I&H$q%Jw_P_anztka-xB^3W~89~5>NJ*u?;2RKYDaf?aU z7g>&{5IgeCPC`NCc(|T)qEmBiP0mka?| z1t$p#tbur*O6s&^wF5?BYfgN~terw}7w{&Bw07uI<~2gLo>u8IlQrU3vWSn5Wd}dD zCBLNP(EtFa5E)!;lVnf3dq)&lD>Rts3K4w2lOMr@^biXjS%Nqo^ZX_PL)#)V^JzD& z5X_d_ak~TRebg^`Z#}Vw&XvbHQSykfz>qU$4$4634eYp6Tc8WYN zNlg9kiC8kU_dmT0Yj##4H;nC&P*CedEi0s8-ectCxu~mN~ z=6>sHBJMA%=!5znScRLVvCIEq6{m8 at iU=R at ZMHe_VH&4k at nPsvh$mq5Q&N52#)86W zWH-Hg3X$g{4>ZdcY&U3pp<)pO_Gx}kfcQ7+R5;quO|Y?T>c?L*mn&}wP$qz5<5L-zAg z9)#l-Pje@#Q|YxET>5LN3MJyS>PVnwQB27 at CLR}_E32Jn5F7W%D(D-6M;TyI!bA5W zt(9xZ1Adx at O)~c at nI-&;v~QhZv?3zM7F#DEvR2Z9cZZcmI#_0cY0*L8A_lieN*}C=~>jJ6p~*)UbP($m!7(#+slKW;_m(Pt#GG zp>NzodXk~jNH~y!eG#?}o(bQBqhwoKX{-+O-Kl9;Juv&d3eaMYX#LKj=U^kPrp1uv z{!}c^v7W2oTCZDEb>lu&@TRI)#Z-+`QksW>bk6Yj2%mlM`7N1Py((s;I+Fyk{G=ke z^o4mGK=pin7rWX{c4VThAL0Hm53o*!CKbf0fHcqZX}%yo{24h}=T8`^VpqQb>_Cgz z?&#cYRIe+XZuL~_{IGLhdGPUz(GTp|_i>eH2f`se2;sN+Jp;dYw^~g1JX4l6QcEBh#RF3gq4keb#}Fh+x5zO1 z-AbENk6@|vcTx3ugxg at G^zW!dFV?W9Z5##m+bqk-SE(P`k-Wx zK;e}0+@@pDc~4R&7tn%vN2r}BP~2m#1fxl*k{+3U z*Bo=VAWE~UlkuibAeU_9G};bcCn`Y*R=!mU6n;=NoiBqt2B33qdpBqV^8&_3otoL# zSFm$=`8Rni)!SyKKJ#l9i6eq8Snl{On?>@j(Xqk?r!;Kx932!FkMvVw*(tavBE at W5 z0|OlR33Yljx$wzS#6JJ_dgbvf${XG~i4l)o)*c74EafyEnZ3`pTH*#Y?824DLa!nGYK zH1_jYH&8s3_r|?In~0Y}wrGK4^X8L*3|0RigL6A1et%$ZSpVv_YxWPL%)jS)C259kGmI*@dUejhC!r#& z&XfX9=4e-JObM!WENQi=%+VoT%)WGMtC-$vuPZ|Q^VHdom8#jK4YChbnWKtx*>XHv zALN{x!wCZ-1(hTurXFE+ at Gyakl&lIKW>PETsl()MnKu2?toq)|HdvF?epeZ+F89QA ze&(spKAwlsya{KNr8FSkzbfm>D62g(C@(qGeVNdF4i(6#zG%hU1s)aa#sNCnirlx^ zPsI0?M6)3sCkBwuDY$L`1;yZLME7)9bCxjxH?L$JuGWYqPOTe5la!Fo}!=h zqi_$cJXu0%IC6EJS;;8jl3OfnVHL)UF$SmJ#2yZE8tHDx zjFxMoHs(4C&hjQsIKLp;j4bsOhu3kC8-wN{#+%semWDH?CprSyncGwPErG4cJ at 6r$ zAG&%;3D_mlk0MrO^a2Eq;WWp(-t9Q`m-NsW7SY)%SdYLR0~~|&UYL$VgAmX>dAj*g zq+ktyiU}w8q1^ZG-IBZ)+VY4-nd2QY+;Rjj at 8SZ61tIu+az{JlvnnKM-=eFM?5ADm&h_ydV#K+ac`!04~)M9&Lqr= zhlqk{-UBCyFu%re+|C=7KoIAXLNbr}A=sRInFarr_4po_FMgLWZkS1ptV<4z+0-HQ zIR>h(o~iSct8fA=vHW9_zNP*C)-l23~Qf9i)6n$u$ny$LV*B z9GEY!J4UH4&!K?rhD=|d9sKPs$uXgww^m4i?Zy~ldGZrklb)g~`dqdBptn=FLz+CH zP{%Fy3eckPTeW?C_dDZ_~5fKzF z2;IYgAo^*+szv<(Nu-PI1+M6zsN?YyL)bm2z&GWmIY%#jx>VC8+VPkzt(@2aGIGCRl3)p`1B(lFI|_ zF#KZgl6Mq}fJFOJw$7>4R#sYqU*R~u$;rK#Ltf*}yug|4{;GnHeMuCfS`6a`@3t>J zCrVoUZ?=5yUIxGNWy>^(|H*Wwvb~whzjT+z)v;AkKH*Xb31tZh3Jm!3 at r5Aci&b9{ z!wG_r_&~t0w7Y`u5DRh5cE$p~X at 7!#!s#Ay8a42WFRGzet~ERE4n%OXXYO8irZ^6f z5Sl^KYHGHmb# z at U6k@`eIxLURMG+O0zYALTYMR*(@SWwT!T(bk~EVP16|53(%BVjwP#^&YBeZj~NMW z%AvY;6xX8AHn~QSshWaOH;^PH?um~LS)nnrXciof`Zm}5N3s?a534O3fS756q-p3& zR2|M at f}F3#%ro6K_IgCwcxKUZxPCsnIJEluL${tIhZbsJ0*e`4=d=?Ssc2Fc!ZxPd zv|q++rW8=SC9&hp at E+S(U*iue7Z%+^phQ-RiW;}vJb*JV?87C{@P>H_s@>M+T$wLY zXlaKI&lcKi*-5TJ4s~-&%@jnnFaRH7!=NL0^*wMDq(VX--QKQIzYn^e6!%d%IhPPJ zUJP{zvA|HU%4O}!2wO|u4qfl*>d;yz){ftVmP8+*E=MdWk+i0~> zE;AQ8nX2v!?#!#3EP#Bsvp34u^C;*Gsi;hQGjo#;H6$*dEy(9)WRmALJC96GZVDT% z%>um%oqfh(MID@#n<80XGWtxmM$9FecdP?!spQ^2Qm7nRuDaLOLaTB at wPya;r|F)F1J1aQ(Ra1WnN!c0X}(@6On*!#@hRbvVzDXKOV0q z+Bk?Z)cL_YNw2W{HodN^BTJ5Et=xz3*3~AZw6hmG<+4%crCBfbC{>RQ+D2^~bxQy6 zh@%Lp_tt|y{JYT;LX#0k&I02sLfl>F-YB(y!Xc-&%llCUa`I)JW#O>g1IHk*oi#rUVO z1X#i_IC!@o-HbhVAi|+%?q;-OCRHu3_$k|+Q7rkiH(s`ng3-j(@4EVzaI at bB0eeeF z#*oAIQ;ksyH*0)-d;ZPekEK^&w{aqT))e1>&yf-WpI~`+qK?r0dOTOW=YhLnnt_(e z!kR^rZstwfCD3nC$uVlx({n=zwa6{q!)Jad1>TYyjNw%o zq_edYQhMzGDcxAt`)yy_ABtU at r`eA=Iy}Qa)1(JGD~H<9Pe(a*13E;}E|5J#uighk ze&`3iNrO4%gLCc>!FYhF>-OOg06q`3EGbq+2Dvk}0MQQI7Ef-iXWm at M+eV*3FA^WOSLTe{to=EXxo{9 zVrV?5TsmTWUeuA!d)QWfx47x|2DL?~mwyer56h&H==U<%H6vk6`b$+Muz}3(RFX$N zH?uEGD9gNe> zZ?k3*nPuZ~G`I=wK`vmERW$Bt*~JS7mE3&ibLjyagl`Xd(Nu}GcN zwxA?WvLz4>P&5ytk0Hj2ogeKtLq7q8t~fR9(es-z9>4N8^Cv8&VDYDYgk+L#B}Q*C z63`u$^#<$9ci19$A95HXqIgT0pFrI$^bObhd3T7*<*zXfp{x^=2V#h|3l{WKzN?pR zkF*%<(;WYX7`fO5ZXkAiN(%J6)FY^p%&cXSMFOgQq29|9{(zdMZ(F-JIc_bs_Es7ld3Pk59`NoTw>nDhZ4Lu}9xV%T7 zG{pC=ZsODQL()gzkkJ1tjSrYxR|4VxKUELhJnv7(kh=&MJv%1*je<4dy&vk#{?$_q at A#~ zz&Y)IwUfNtOIV{XJJEywkL~2&@vy4(UvCxQm5xgkj|qmP==7jai1(+TQ$xX=9uWpD zWPa&RDWD;ZwX;ff+57&iY3}0kw)Oo=oO44~D!b7Q+?YGA!`uCG+4-U)?d|RU9l~Fe z$4VT>eT6Z&&34LBp7(-0T8<#@&o_V^lb&W;4>N#vs`0J&}*MQyE7qAXG^LBYAxVm+xNp1$WO^;<``FnI>iZKkkB z<@Ma|MC6iZ`Oq<{ou>#*3njFuR=V4x49F2BXRgtT-m^yT4yJPI1gDS>;8D7acVmlbL#B*HlxFqgx$!J1Jxq5 zp`-PB_b4mfipyQ(*pfj7Pw%39CLNnhXuwh at hXTo|lMu9C6I at RWYpezr^T zp{L2jpqF_)rFnzmdFb?zf|cH>0W)u|DhEjs6|a)*xz5zm>DsoaU<@lRpUUR8b*3q0 zOJ8dn!CJ$L^@oKK(}}1r8sd%yRO_fKC^}iLeyj~kcq-GKBK+d%CWy~I;9{W{9pJTD zasYF&QZ#n+{<1L1dX;gT8)+6C6x97 zzW%}oez%B0 at L55S`EdxeiPhuDC8LS%Fn!1qBHb**F at iXvWQq&jEBJ%51tWO7bY zd9Mv{s=BnuLdAAHhf;7rL4H0`b}6_hi{Hk-gnB at 9QD*uB_Xy?&t#T1lw1*mSf<5Z!Z_!VHYLcxXtl{%->?098)ri4NBRJ^ z#XH>JPGx<^X|nzzDMol8Ao>5{py1!Ox1{aA*y at Aq;VHo~uHG_r!4}#_Vet3vjZKLx z7CTAB|Hs)q1!=adZKLikblJ9T+qP}nW|#4nZQHhO+qUiMJ?C8C-uwSntdoC5JTZ>O zQAXTPWL}vg2NIc#(F!uF`Ti#RLbTZ=cct-9aq3mS)!LtR2Eb6nAW2~Wc)9&{1KkpwYJ3l(ZS_WF9tU(Y}2jTuW0 at Sv|JI@U}Z| z)`s;5DHz$Z at e--NVs;W0Gl$s~C9-~{Wo>%?hN)8i=HOCd{82ZXH)b=x<{Yw>t{;LE zKCy}h6&Xx(!ei=YQ`(fGOoLl9F8r6WYc01NTG at ESJF7qX7zL(Q3zgO+d24O-(PMli zs)^9vjZ48!5$4ndSJcCDo_vB&^SQ6R?Om#SVw at JyEk047QGRAvsKWrF*QZ(Si;7rXV}U44o;16V6tf zT?Nl4&l3}B*Se>Vwp-RaL0S1uk6BHCU&S9L6`=XR!?5nRsQM%4D(NQOiOt_FsbgDOh_R4m3 at KAxKus5XmyMu?oF@ zrIPT-&g-Pzs!n at QB|IfD4bJPGcm;oB1BrdwQ0$FyC at OQDn^C&!f zBYaU-MmIpI-1P(bn*F~%`TSiL?m5 at 0iB#Y|U?sq0y+bHBVc(&EzK)dmALd(gv78|6 zu0f{SK8hr~3aFywxuR-53K at 2?L`$=V*@O=^N at iQ<0*9kmF`;xUf;KEZXUU?Z-7xoD zF`Xrc0)dC=ub6$W5{3=kFymY?dyt~|epQFmRMQx&#kJT&cN)EyjvdpZf-5*p z>;aKN*umNnKK|Q*_eu+W_y1mq)JzPl{(}(7#HR%@dy5nnHiZ at aZy`!=_JupMN at biJ z9Q*%;Xz1M``nrO4v+Zvn!g8~Hbl;g|Ka5BvsCB=Y at _G5*zHz(B;Nsx^I?1^C(HZHD zZdQvqjA`qJAL;T}+cIF19>~IXGyrjUfqr+O3;Pi0#2MrQ0@`r2(DIATD;j>5`Kfbp zNx+nvZ03}1fejvJ%p8T$P_9i`7w`AzsJkPB>fDuEPfX+X4-k1UwGpDJ9pac8GbdoA zSI$2aS^m|%qG5`1$4uAsfsQwTGS;;vZH^T!fUedPmKdE{0^L)r+bA>K&X?{eZk#KA zQl3gG0g6*Ceu{d(#dVUA{ndqtVV>#FJa=dt7^PG$t8IDmofOla at A;AoBxlay$Z at tN z0K at f1TQsKD<64v&`4gVHs!o3c(Fi(y3re}yhz{uuyV`!c7_2S11RCFdKL|7{8f|aS z04#e^J2d!d&9R64XUxTb0sb0CE_%8x38m3XH{H3;V3CV zFlALwaKi}5{Hxz4%80C#s-Mtken_mbkT#g897*iA)bvi0WN&uAsuw&0?ii$W=-#HT z&`<^hR||zC+`O&hTqU2l{9p53+N3We at M~}ZGm1)eJXJt43*k1;F~O_^l#*LYTg4pCZ}zMEFf~q^G4{7mG~wOeeaj^6Nz;>4a+Sr31vlCPjtrB{xmuZ zZtg at CoHSXSRVl=sc_~rc8EUUE=;rX8V`akjus5K0z94wJrXVwh_yMxcBC}EEAb5s~ zy{8CAT$*Lt)aM~%xRt1BTO!BL50#^6*nrz+d#T<5`omieuWn-_9W!^`F zbhJ62=sDg}`V)$M4ox4)25~2928M4C!F{S%*gZLIc42%3C~U#c0M at Toej`3N(E35k5b0N=3T%wm zqR||2Tg1e>;^O+5$J0M9`F}zyfzH68FI0EidU&dWF#S~+*F)kpVmpQqYtjO>)i$E2yci1Ws9ZdmOF6*j;Z{R}EX_bhT+ z_7HL{q at p=@wvEFyOIPKM7>HXby+Cp5GCVYS(8SmJ6(L(umWcIQDSE9h

J>Ve?A{I7-RpQiaA zg~&O61A}^9%Q^3upA!-gKUmpsBY-|xlg^vY`vBl}96M_YZKd5Vza`#5jg=ZSw1#-5*J! zs3+)bLm~By{pO^>24YGHYpF0U&kTv!QS5`u#WnV;(_~kD`JE=TOOgh3yLy;^hzRmz zQj_f;B3iOsu&$t4u*Q%kX|Qp$gbrlEaZ$Utv>cf%w-43OW;%V-rPEdr^whI+m~x<5 zw`M|AFY8vSWCK)ya6a at O2`UBWoHok}j%Q{>AD at zvO+PHDt%tjoTN;pE^=DLzs7JRS zSuPWBX(JsXlBMqgE z-c$W8L at e*0{|Hh38~si$cy-3#LZot1dE5+_s`6qXqdZk?%FHZh4IEnbW#^m+wGpwfS7uO=Rb^S2PqkO|+5H^h)rQ2irBOBF|z527=!#?v}&PHyD? zuMjbD|8F6J;j4RLma<~fTuazv`ohq4f)N at eSzbehlGKh|>{^dGx>x?v==e>Xy at C1> zy^ybYvvy1Tj}Q?GIuF at wUK9NzM3T&r*{d?~a4+vM(Gp(zZs$`JLZO8z{|J$*>ib0z zL+<}6L_5w^q#KLD)n`AYQb68_U6GX;ig!`BRdV&I!*xJesHs{*Dg!KxDK7Gt+k?dZ z%+VoADqsuREkvNJ$ZY5LUMKf_bt_c+b`k7-|9?W{r+bPajxG|Z`+dkB7U3O&ARWsR zfR$S4nt0qP^oIhA?aaaRHHg?no*3LIq|%A_6l at X&74>f+0>t$b8`i{;fBt%7iT6$5 zETLfN6nmjy(9z}B^!0OS3(9Z=ZMY}2U0AJ$3)bkoQOFtqYZdx{yr8{Cz%%d(ivgEX ze;8zr#$E%p{7QPWHzCk&gRjgabp?-f&=^=BUm}C+ELmb&xV80}` zhnn-qB&KFx4*d1l)AJs8Q^*^;_iE0wPm^{s&W-jn4q@|fM0}JA_c(Dx1=a`O%Rixg z_6Yt9>3&t5UlnqU^mn&#^JmTIyX{-zJMTcjk7q7R9?oD;z>&#(hOp-aO`(Xn_dJ@> zoBidlsJ9Ov+2sR&M#U79#cFaRliJ8d6O0eyf^SreAp%AK52K;~6R2v}vs9!K)wpqD zcWuoC1?6x_V&DS2-X=-mzu$_u at iX|`;J+rKfBMOPBqE)E5z#_oOnz7xdA^`RE;&Mv zye5J(e}x~obe001_P8d{*{_Ade!Tm?g~NLduMxB~04#{Nf$wq?5iyuQQq z5}R)19hhPTPtZ43rHPE` z%;Zg>68f90;F&Eyq+tME={*%%B at 4@{PS#5Z9v3$1T&Fh^PZLFKboReMqVbz>bm<`JRQ-Afi5jJL{H&mV(un;`Zx>WD5)ZC2xzC+D$}T*xx87xi%;*snKd z-)};w_dbV^GlreyU0Wr!NYie_j6T9>{CFmfV{bQ?th-EN4QjxhJ=bmg=l4F!2bS_s z#?E|5-eigLJUd>Y#7Z%F=g*=NChQxX$k25-bv5G4OF`ncclW5k6LA&k at p&z(6W`Z# zJTZh$yt729AL%e`5E6fC8Z7i0cuMe5rHd+R1kQs9a|RtAiRlvtbqW*y zCZetXA)?~%I%McIau)qo?^0(@O9{8>nIV+-$#Z at 2++f}TW!QR&d(GK!B4aM|YjWk2 z19X^<47xBSzw-!m+1QupVaoXw+#Y6o$q(q{?|@{vFi_DCekX><_rHmVKjRxx#}k6= zDTQ6)?m~d~OAfeuC5EXn?f#ej^2uhX6T2MyI2JJ{X2_@{l4y19h|<@6mE3pE8FEC-*Fk!u*$;HFuhrpcY77j4SSi^4Yj9*FzM5XMG66ZX(V zhoU;@D>)21iQ#QMV`<)HHYs at DHozo$ci0W?o!o9?xrf zetZ4eW$DBlrZFart;KeKjQI#+2ulL5S3g?E#It=c$bxeVSOq6U6V~Bud+SP(h>TAZ)SSHtz at sFEhGNCH3F{e at J(`qeFjKx={C?^v)Ray}% zC!tgwmTPMyxuwRV~r*37UHw+#l1!oRr zI3Y>63N8 at C4POXkbo%*Tjv%kDtGJ+B3|jHVuYk(6^6 at jo^Eku` z7jWJLH_cEwR*5O2LF=5mk>t1TfkyMHwx-Du(hnQlmUrkm`4)o)7=6y=KSdLdXa!}i z1&ISs&(lnnuFRp?Y`GzaD_U`4Ew+}BJNm3#=>yX)_8Yz5m*Y*(6Y8h>7f()mHv1&| zx#u`zXUz)6Qjla!+XiRQV0eQ%5TMW!>`@R9p$y1_JPpx` z#J4;qgP+3uFMDVsVz99j_OD@?%-od(I;XJi$vtJaPyt4HkG%nm`EO$9pYh?Zi;rhW z-zDf_G5s$f{;zcKIryi5SgQW&u*(G?yy!w7a|ehTm$2fUz=^IU{4sM^^72vL*Y*Zn_21iMyE zpaS*r^KT&nP;NrLQvrQFLH#2{7k>*8`c&J;RQ$887-pU-=FYRYQ8iPPJXO?9*zgNo zu0t18)CCRmG1okJ%lzt1oM<~!ls#2cPWbQwaOrSVG&5lpbM}+CQ65v2I91e6_%NQ2 z+JM>uYTe;z20PF;gU_OI13H4x;$}U2j6;9MkQeyZza5vFv&*Zr`fGAB|6eb5{^R{b zs!~b|^2p!wjTHJe2nY(e`MJ$U3J7|$njYjtiY~~-u-AfJi~Qn}>EpL}+HKEdt+5zM z7+H5=udt*mCz(vH+HkmO=^71ZnlcI{sI0>!RzyIV>&n-sTcbjg>MtkN5AJ(=GvLU@ zD^lc{10>?CgOn=nkvNLSHCat-lTw|Ibp27(I}abP?9J0i&9QFpWE at D%9t67%c0 zf}c!GsmCWMCDs)^MO7E-^KQFn9 at Aq`_Uo>GCalcYYwAaf{#=0JRH_PWy|uX&2Yp;N z6XZ`&NKD;apwtC%PVDGO`atTZS+PwntnR7KfWRV|r{=H8*&<90`J$l8-YBMKx(cPo zh;FU=%Ai$AoIRc>m1aHdQeB=^ZWTa60W}t>s*{o0eD$iK91-1l%?@Tfp{=cNd}s2s zwNfSf&i+$n&}s!|ySDM20 at x{W+^G?6qI&ylkksf=XtWel4cYHwzhzlXhKP@^?k!8u z6bhbR`w=es_ at pM~lygd~M&nVq at 3NKlH-FDInt9VedG?LgY6QRZPh+ZywNm|TG-UKM z#fH}Zq2w#A1m&>72AtYQzTz#;ua at NpO1ufOar-nL6H;d%#kbym6WJqK4v!g%#VFHK zDsq7BGyN)%72#Wz>6{+;`14Qz9C2z8y=ue!37OEqpWoTs9!${rm4$nw5zQfW7=J33 zS1_J;&+ifAiZ}xGjy<5jujzb{VSYw!WKP8M4X}YcrxSAHaN7m at 9TW(M(0yuzmz6z8 zu`xig?$Aj04w;=2ZH0&?sYjgxB;t3a=$2ME0vT9wMYi^1det(;{G at KN+rJgd0qU<; z_L90a%DDjeWSV%>gwkpq6VslV4PgV$iK>C<^-~zml#XiKeI3l=tUf|qv6KUEwriJE zgg6-jp?kSQ6(jZC5$6u_U9gnGrTKUR#8?86qSs>crVB*frL|uLL6UMPNw^!){7o#H zNf?kNjEOlg#>brr?+n_t#}PrmNulBp7$x&o`GlBc{aj^*BMzFD at Bg-u6^2MqZ~R}! z`R|Ra{~YHH#lPaLBVi6y)cn_416e_S!?7%k&AduG5#c9J at ELS>uxDu>vw!UPEgbLL zCD|)Jldh at rFx+k6BG`yS4s*zM>GJKY)0$b9kA_#ymiO1w8I+&HCWK($6KmtHXlzIZ zWbtd}zK~`g4JgLXpQfwJ*#R3s{V{958dBqo+}fo1&HLz6SxPFnxU9waO)1P!<2 at E8 zFQ_FZ0xV_=FR0DPQkJSro;Vs%p))i>$`^b~6?G)}Hvq|O${pqmKOedii`3ARD%O-k z62~p3W~~9nT+NMT-SP?TmWK(b8{(d7xF{NNMdPw~)pqe&i9PQ78b4{Aj+G!u>kBb1 z1?p<2D^*-{$RtkU)0CbnEiJrnAhj;dFz;5|3~g66ROlGx3jEecv&xnPv_YCZ3W46S zm&b^jXx;>zI;c%a$y$>E++iqF(y5In_p5sR*3)IfGcS zp$x#8AWh4HU#~ImrUMneA%ibeN&{t^Kxs(;~jKMf(Lf`h&|nb zJ3Sj+037ZHzvEdwrcM6GSsOCxN41m>N_;8OFEuXldID|drRq6Z=S5#XXLyHLD3o_v z1z|B4H;6+KtX`7AQ%k)ejYX~qFKIG!mPmw^Opy{qw<9La<&ZH`{X?R|a(m>pIu3b3 zPu2n40fSJrxjJ7zfM=;M914N*Sd2n^6oCZM3(-M6g`{1%bxVo@#j-p_yDLa})m{3e zJo{3fGjm)TmF_v2{Zd*D0<1DFB8hRlWK9ylJRbZeFFtz^wC#!Qf9II|tz8-MuN)6U z{`a3m{l_G${FCG at G8+jkDtuI7e&L at s5%BWLL7F0oae1fs(sfPt**MBug7Nec7DUpA at YbTM%t2*OS;9QUjv-w z3RU8k(T8Asdts{6B0~V7_gor^CRLO?ba?lG at Q1-{#Uc`FCbhnrT=cjv7a({00!r50N2^2Vcng{~YJiquG`=+u;J_tzI&r7EK=&PQwS#O>G{NintMjZr=`W%0-L zhw;T8yyxfxczS1U>}mu`14vYUK}p4nCkgF3lWs`ttCLzmVTCRrO)*D{j5D3T{IJ0) z2yNZcarOnF=Z1lpi%(adyBNu6_va5}`IuctGp8Hl+OWAN)q_eAX~Aej;d@>N1k4?t zDfGv2^`rHV^ZHOKZL2sps1N(D5Lo(00c|8(Udx>S& zlqp8~iX=a%QT>6v5Skg<5BpKI)%`&k%(Uo(S*80zIUqJn+V>4{_0j4s+we`Nhcg{z zc_cvEB^PMVp{ER`KRQErYOJzXTq0rJel=4c(ZAn^dqdkx{Yio=XoHRaT_jGQbVN(i zBk(|bS#1NnB=N(ssK_9-1hxP)-Wz6sTc)x>q{blG at 3_)-p2kbJm|)VVR?H%JnxMg9 z63NGbzIs+!@AKbs2azL{0#Eki$B at a7A6)ftLwY#2 z1LIES^vtpQkTz1=bSzWb8+8r)M$nE0#|jk?DdeDsciCYwWj6 at SIr|Lq!w?XZkZ_pQ zi59!4c5lnlr*j at fe}0HY#nD8tcld2lG~JW8g}yGD$B-du#~@X*qXz9KGt3H{WSETl(9!*0`MNM?i+O zG(4Hp1EuMksqHtYoHLZ3?Gs=_MjFBG7P>-Xm8;DaZKgJ)$)4>+Zz9F3^$(}gCe`)9 z+Vx2 at Sn6@0w$@CFXgBv at O6Xg?zZkQF4Ur!1-b8`)L5lXq;H9;xV9edsfwxBhomOjA znw1;$DL(9G*l&p~^CI&;_V)u%DfQ%#!-aa;Y9X z#4=53S#>_`lmA0`_$WidG#oV~v~4Mz%EIB^c!)SLdNm$)X^jSYIkq-!1V*2SfMpeQ zvKXO%5%ce2TMV at 77;2PSs{TEFV{4b(YFc$NdxZ`%oH<^N4^qZl5wkrev|q`S(9?S2 z$Yvq5ga}Tw;IvC$C2SyArBxjR1}^yAzwL?H?dt^Ax8`&O64U)hFyw5X0NWz`lYJCpx^9gW-WsvlfXiO3 at dA)?ygJEIKdDCn_x)^ zywm_32ftGx8Z!{0=CEYjaar*zK1gHIja;6GRUWGpdMRP=kVH{i6RUvpd^T*5!yn;F zIU4tzoPr2jn_7YBN=e_`V8~DC4keq at A}9rS{FVs9O|@(OYPSCws-N;MPI3`BrTI62 zh*UZf<;Y77Ww?BL>0j7qXT5|vld)prJ_o3rj<~qHoyE=TS7QYC4Yml|Yp at 9-% z7kDHeV>?P~TkLsg2 at lW4o&`g6+4gwfwCmk*BEccFfDgAn`44^ION zJ=te}&?S9b`rg-ML2^7=!L1J1R!@pRaX#C_b9)Pk3Psv)53|ay3dQk}Wu=!#Yd3>G zJC#(%Lp|!>5}P54GZ6WH{_$rNK;#bs at x(rT3o}eIaE${oEsmnduXU-v0A|m)S>0<>e z0mu1N%yFu;!N^Hqgt1z17I)g%Yc0wLRmLeMZp7V*E;|s5-xtN(pJl({(YBKG%_feYQ>LI0}R93(RpFAYzHTxS=bFq76Whh#2`<68% zG|IP9wg!!Rz$#y*+ds_%JdRG5#s+};2#2kWsteMb9Vh(llbB?JnKCONFL4#cSaOyX z^0G0Z$Vll?GM zRcP=|6c;ao0*T at j8(ghvi^{<}AoCU6W1Xgt;QKY8hqTNtU&W{T>!8357~7pD)JNn4 zR3INSH$r at 0+BsUtOdwuyVoCcH!3H`@H>pysUdBxVPt#~Pz z7*)IHJ+}7B+rAt^(A!_dt0o8(S_EA%J;m_Dv%NqPPTN9znh93Hl5&AMNDuKH*lRKvx9cwxQnziM{RTH~n8dLZrD z7?rfFtBYR4ncrS8)g-(Np`pGjj=E4kSUEUpc9-frK)G38CERWpvK#tf%|^jn-50v! z(()$uwTp-u!t2_XYkqBbjfmRW^U?C|=ll&*v%as?u8*g;y}!`|m;n*Rj(%G;#NW1i z!49V#Kn)DH>zuIe8nO0)ZT}+rK19)5HSD3c_MV*5Q)H_9OrrS~wb{42i&FEpintlv zvAKi0>w-y^{Y)@;0)BZA=WeEo5@}6Wm47Tb(>a at r+Bj;u1O7HSK-phEa>CF} zvFM;qvFTvcPGj{IhKjK7jFMBQM%#%tMEOciaSmdib2Vv$-bk8~6MG;@$84I0gCD!sH8;*cd_KkBzB< z_Ip_LV?BB^Ic%qW^|-}$Qt`ya1?*(DxY`>R?@mn-%@;xwrMv=KxZE7909$0F|MkV9 zj%`?%CAAqM_?`vVridyPWMku%-^3@%TZfN!uer;vcwY=@s$K|>rnaODf&H2F>Cd)Q zP3GJA5AN%#fz$qH*^T3_ftAq8ygxZR_wH}OC^j3Q%gDH=nHxX9{!ka#B$Jg?UzOvz zQcm6M9AQi}WuHWOobQxX z7PpJFVC9(6Oy|e%vG0}Z>>YFRw#m#<9eLM~@J;Kq&jq-8w>bbGqVhl8D5t*1Qn)gT zMlOYtf5hB!<+oaco4f&s zWiY?!cIn8^GgqKg#P)r_ZEiac>Ex2}fZa#3c&iMDTNA|PEfYrQbqH;k2#Y2!6DUoi zX>uGChY}%9r1 at Mn%ML(1|Crf=$jUj`I|jj?E?6Eo;Om*V7I&TKU z5MW-g1G>R9r(1OglmIE45pd#0ZeZ+vGCrEa6}z26cE2kv51JZ^79{m24%C&&ct6zD zH+s!#9kS=qxm at N89gNKG);~-mGg!;KsnxbzyrHwyQqO~8dVC2wrOVN^7$TH$%DFhy zby!T#)XBContJ=(RLQj^;PaF3?Uz8ZX?j={2Shn((2toZan)T;!>Q~^eqgP2N(J|- zIG^-GMjjtxeeN`scgiLgc!(8!R24d~jXhg$m!CiD&3 at 51ytK^oT=6}9;W*1_8F56j z#w{XR=?N8yd|emstaEM(;VgeShZ>db>28X_-GGrpxeW->SVd$PW?b1%c_3cX+#;jc z31}*`(1_DfQksXfV07p2o1$05)!~r3)MM@;Xz4pyi8 at -5wwP`~Bmk`6=tFT`&4u4p zoi_ty at 9V5*ik>^wz07QH2sgeKw^^36d(zmQ4}P}85*qAsA>r;28^28plI^VBeoPD4 z>HQe_D5oD{!-Mic+ojZlxqcS8#gC$JBp&qSCRQ`8(&VbRi&AEjWdElhO-~%;!*k$()F4wC2%jN(yB*G@!8F5jnl= z0O|6cn4NLcz?S-Ak@~u86+RCMGLv~v{^^qJn1JwCG$Eyo_cn)k at r7?x*1drDODVX1>} zFx`Dt2xr`Ie!W(w%;TI)mK9-zok$=OSoP$mL+N4%|LM0)CyV*s5wyXjFuNEfC$C_SzIroik}feZ2wLbtENc|cKHm?W^k zN`VQWN|XXHe21|P;s~GE&&nu at r$+Q2IwhA9E3F0*cwL@%tO`8pi1{4;I^{3gdC5hd zX6UV!Y=wcKf&HjKz>B5`IfdZ67+z2Oo|QV3%IttXv6Zj?$qTgbLVo6q)c(p^(EH+! zy=H4O>Z)X{bZV4yYy_25xo`LqF1%qoyvvc`nkRP0gihEeP3r#Wm_j}}tsClmUl2ue z)8x2>#k&tsoob0{U5}3L#u(ulsAkbptlM8A?D&MyO_5^! zVJF at ZrBSiKSN_3v_HC#52br5*D(D*Zv_%o9DvlZfn z3E~AR2u2Qd9``itO45l(SIe~RxmKB|lmoz=$LmSp=`XMJkAuL>j}~`50ey at r z*bEOlF at Z!bV-ysw=!!;+fzsu0?&mw&%;d|4=Y;8QV!KZ^NJqU9(AMpBvnN$vE1~`d z(l6?A;7u^+uUL0S>{A#38SDKtpxv~_3eoG$X4NVAQS6?ZW|YNGH>8(;0B6K7+_bI` zCW0h=D4rNqsrT9~{lsScOb*{YYc|AAvM$6Nf)V-8p+uIZhKGW~46wvPmNzvt7A_I6 zhA8Q$C~OF37X9Yvkb6NxB0$EJ-0>E{m(CQUR8{&^fcT7`-d!{5VZxTWs z%m7C}oPiyKCInZ%2!xX<0L98fWo(E?Gdl*UzRpCdB9qY+y(`Y>QOvCX9ypRPk`=%( zgpS`YD0BD+x)Ca;7iPv+**IAfJ2R-21divLNU(#lN~ z-C&FPV~hDm`<|3{(ht97_BooLKYk}b`&4m{I1S2kKHQvo%p0YC;(J<;BytRq_|7Dx zY9<$Fzb-TzXllt>XGTFEU^}x+lN4~sIda6CUP at wou)WG2w~3_h5N7>BJNxVrH%+wF zFv8&GEO0)4?Z_^Wn5h$*>T5HhF8B=H1Uhtge#fKgv#Ut_&Pa5^yLbg#PfS*@;k2u~ z9@b03w^I*^E5^3yh;LVNa}**BhJ(>f7V|dEw-BBS ztY6_QyM~9;L at pXieO>(`Z^1sLBoxKsYv&!q_p%efj*;x!y~>kWj8GZ2+ua=Cg)>-< zG_V64p8$vBF7Sm1)*j9XF}d19p%2zYye6+~I=_V at 3=gr=E;)HG!f$}yR;NiIWZl%Ra at OtJg0tlg8IvxGjIMbXTJt71eGjQlj> z;7G3+HC4mkX-&_3bSXT!P_X{Q4vfOGk90s9Mz63(d`dIiEPgTjn$1#fPfAS6%VeG4 zlliNN9Mc7jsiB-juV;x0JPWs5pw4 at 16p~1nD+ZDX*OAzat`p<8#E~+bp|1<$*O^oY z at If;vSd$vZPxVh_*eBuSM;QXvW;(AfvnvTut~)WON at b4)P3>54ab+%*Q&k z+>vkiSi)*4Z0EnMU~13L6k;_y$H$Gu&fcZ6gExQcBkrBad} zvlKPb4k6J+2aGuo3rxasy>iT&{ei|^PmX%`@*#`!rJ(0v`jyzk}1B?D`xFZXRMQ;nPaVw8V!!tBeFC{moRyW7$uDPo@ zv@~1;O6N(IceaQ0f~301%d7QfZDP#L*2PzNJd~^I#|eOYj at 7hCdL1(Zf9iqKq at se{ zIAnDFPH9L_(B?Zzj^GvYA6G(gcUX=fHAtr0_ at G@P0$(=LtiGWdkC)o#Of#=PpiZ+< z+!zh^(H~JsDJXEn3|f^9Fm1j}N3U{2GpDtW5S{GHYY#mLC`72->x6S>_r}v~YO-l0 z8#tUQ6GK|rr>jbYz_rSGgp4^Y-D+~biBnqR7wvJsC^f#aoun2VIY3_A{hmdqN&zhQ z`H4knwE=54DV|?vZMsdQygfCOw^$vwWIcPWItf&lkt+r%JDb5~O&2UjKsLuGAV-W7 zb{wX*A6HxKNimp#-izqe_gKdF53hIL{#L^wkFm=r9O|^Ghkg^Bo9E+=u%TU$^t0!p!N6oFrUb`#~=uCg{7Bth9UEP>A z!<$CePQm6EtSLCNeuQ~9)STLQ6a7l_b?97EiDY;X3D&?jP2C#AZs-6{zwXct7cQ_Se`6?~mDLlK8e>|9%mYR>Jb+9y zvt6%O9JtwtqV6GExlP~+#d1j5(K0>8EJD>_(Kw<-ezV!)B4Q(2X$Moa{l(KVHf>`j z+EI5zlRjYh0lNUgJZr}*j%D7n6{*Q}XKEsQM at 9(V(Y#W8;BvA%JJP^?jQ7`GF#XKDfcEOu0$ zDTin}SzbSO48<`>rfGJhM4{hGwnZl`10#2nUJ+(>YujF0SxnN6D+CG_nIU?#z(b4 at C zbYA6sgSn)2XvnIW2ye>=#nj(w$nsj8MB)T|GOr?RZ at -3-vr3cVa>NAKrH0dR6P52j zFyKP=k>-Rn)h2&oM;8o+511)GU at Uoyvg9aW?%9j6=DGtM%gHz_<}+_Ua6``}^VeN3 z2s{D0l=3L0{3 at turJl(}DE6 at UMhfkGG`OeOF|K=9Ju~4Vztl3-A34Fw)SRgqjj7ki zWSkpJw- zco$8kX?#@%L?auvQX>SKbQsB7&E-I!3%XBozE1u!PLJ4SLpvaMqWG1DW{~Q^fH7;r zzS4PL^P9YG;DaK>uS$V&I-2!Ebtx2*#H&+}eU(EKb$2 z5CLJ^d6s-Zpg!_|GB%h)o?4te=+;oZr&3i=ZVWnKc!TNb-$6AYVL-KIf{(%Z?6w3X6 zV2w#q)*@0H240Buj#m#n3(XKC24l{7!$^>bx_z2qwOuwN)P(80;_k`lCnH;S-q;~^ zMx}aY*Q!G9sYs15HB)UOBi^_ at OyO{rf1sLfO4@$YzwC-V zi0m=yA^u9zSey>ilT8H>Y|n?aK$uaH?8Ef0L5900*f*;XZi}&RkRjZVNPprZ-1y_^ zNe&|Iivvfx!=id%-u+J at p4j4`8?wjD?G&8dEIqoJ|24unINd at lyfhWpA${k5yiEZJ%^gjzV7rlXnujdsfVK z{dI$m)gY!mz^7`6CcJ^$jx$azxrt$c%iJ-oCoexg%N z^6iQ~$R(otNR at s^BNoV+AKX&dV1EOyj?LVsKe6f3^mbL8_}-rF?pUARVvj#7-dMVG zKYHfAUX+{V$Hcn>Rc{IRBjogH`h_c5bLPRp#+phM#B~Gf&d*#QRl at MXy-?aiXS)Kg zslChR)3hxe?6;9_$TQ&vb)z1f|Eb4Tr3eh>nt?IgDF~zWJiLDfG14}avS1?*WvLMn z&gVTs at ML!6DVh5s=rk_uP;o}UguSL{)SlHTq=A8AKx2V*KtfW8xZEb(vH at jjG4_CV zDRy#dH8m56!F9uwKf4urbfC3(%4Ohv)jw(2*4EVfospQrXKWsR#u4AQW!FsrZqG^M zTgbhw at Jo|yjsRkx4}S2E47{B{Gw7iPP!~0tBsH956?0_$yhHTS0MJBlaB>t?CA7Ac z$-XHSl$$0;>&AJwSCy{&=y}jcrM7St_hmEZ0ZIkbcJt?J?>S(mY({PI1TR_4z4E%> z>Ipe{Ny<659;%6H at TQQBwzI>Erc{CLsyw?fYayjsa>502t!yu=f)q&p6DAyeI-i^%<`EjruXlLGq z8zio~L^FO>1&E(z7!i+kU!fB^jbxhzU}h+2-~n0ITXI3DTs3OR;Ouk{nShb4$RY=M zS0qs*b1UIy?hx19leilqn)MWJ;<^@rWZ30n1^D14INb_9YO5axRp48dhL0`3_SvoA zht&fa;?5gNZK_?c%PaHPbH+8T(9f$59LijPRMkyd=P>=bDv==E3c%e8?s8RRSFwV{ z%DRUzE9447b89$Vul)DUk>Z)=B$nzO0^d;+-7>4_yk42tF))(MAlXJ$BAy(V%gLYj zFm2j0l}?@1?SNbM2v3$=eXU&HNByJ6JOOXiuDgMa!3Jzcmv;+>UZ2qAPWaJ at 9{aNT zFB}Hb36Ir7=@O8cA|aeuZ_5^^Mp at DR%h=FO$A+ygzs9Q?>>-=7OtT`Gs{DLUR$_Kf zvGWlJ-cuj3Er0}@zchVOQslbl!l8WV1u at kw)EuU<6?nuFvWd!1c5eU}$ z``(;;E3OrksvmboES3N<_>^1DcgRqI=di%xRK1-G$(xIs&q~3wa}^ zePa{&K;=+SE=f>k1pQ1qI#iWZ?PxnPn$|?^q-Hc#RmJER+pg+`B;&x5y3osu(*MKS zJB4Z5E$f`*{EuW26oDkYf%h~G+qT`J6&2Y+Rn9) zm|(-0fD0)r>AhM^PrZjUZz;>EmYgYB(S|8d#iId~;dnN${piqMc_(O$C_&L2ddyO- zk{G8#8!|;DJ!d2~%vDPOf=UM zA|x)SZP~OgqQ&!XYZ6YOPb|JlUGJ$iITbjSx=X3EBcP}bw%rVdTc)}@VK at He3LR5# zM{4eZJzaN2Am5Y0^O}7yblpEw#oE at _k-5`|W?k)l^Q##ydRf?_0k7o3 at MnwWvmy8< zzwmSC>6dB7xvn+uR%uIY*(LpAOYYgW(x<+P`KYdl+$|VPQe2}#$oWiRZU*1L zQvSH-FJbBmOIAxQZj|aac&8!8MW-qNwRky<)i#zi+*hH#R+14ud*&@SuO+ at ZUTZ9I z+S8KUc+yt*OeHUtRTQIp`4fM;SyyHU-?K4gkZ9LQc%7;!(KbIz3d`$++ at U)nD z|DXNfdRm4t5T|N#O72Yn(K#iKwe5%uwN%ZSWtRD+Nb at 5MR+V}Epx2L74SJ;IoYJUW zP#y6{RhA<=Yxd>2&z~;aB8O&F_$r|aOJ@$fMN2qTx5hgfS=DT^;)t~|*vyW#PI~Qa zvYfSgZF1bT)oY%%OY|PCXR($oWcejpxR8ToS92=v78Q!J$-0^U=Z{SmamWD`HX)v@ z<)0aDoNde>d=VC?kk~G$b3WCG)g)Vvn2<3O7OpzCaF)Is&WYP2dDLh9qvaIS zu_F%yuhrfcO!#^T`FcqCzVJrG z)u+VOErD)*n*8kks0y(Uk2vfZ2XiRi-ZCYBc=^l7pl4xCp=IvzO=a>Zw37KPDC2y~ z&h#$pXnox#EcI{C5DlP>Hf)Zz@}3x$=EurP+hJ2Q%0 at NOMzt{S^~_)u9%2?gWW;`* z(bKb$JXp5M&O~;#IY#`Q9dG=; z&v$S!dn7y!$5j@!jPDeqtRHzVPCt>rXVUcEYy2FY$y7a+WC{N95dGZ at Nh;10J&|CE zf*8FQRPf`=oNO^EaVe=QYyzp&m4zv+1Q#Zkm&DGhaB2~d<5iXOCT42-nI&)Ijmqgi z&ZKqit?XmBj=9;l9sC$)y0KFERDZK3Y`9t+Tw-`)lPeHLCG1WW+aNx8yIc!v|H)!c zZn)CKq7;eGIbop}a)wqTb_PMG?!xn|SZ^{{<0whCn2!p8XDBJQ*L>T3GG=l52p{OeI{z;=G;IvPMJj|fp^F~Szn z>a&ZYAUIY6q#)4ZVb~ON;><1O!Y=%ST9$-N at 8#!*;xO}s(z=pt#-ow at bk-@~ahLhD z%-j9SGd>WNM;ss~^OJ$0vWoMOirkSpd>tl8$p=ae&X$_N9XEau7cdEZtLGu4Wh4r= zh4 at oHQOQF(=JdVaTtlOE!>j$MgH=3ftg15sYy?qFVT%EtZ8ElBJ2Bv<=yaB6JEoGU zsP!U)B?v%{p=R87)S9c->Rtg2g3EU^n19LkQGx+R{HOJk2eMmQNci{V_%ZBUUUMif znB9BU9_D>ZQxGU%Bt)ZV4=$+X;7UP^dc>%`Y2vmxdNm2 zhC=SZCqyNx8JvTQ0~QIIw{&(j1A6$EenOHD13h{Y-?h zYDk#%US$*~`EGUfY5G-nvwR^@V7;^L96ZMoG+W%Oapa)GSu0}o_aPgPbk!PF&@Ek9 zJN!|;BySH9?Z~68<~l-OPv;0 at Fk+12#=eBnFXEsdTv_#RT;cC96W_uF13p=@CS}72 z{c#j!o4J?a0hAqEupKYR4+^5E89OGAhH+cz%bskNR`M-!GZaouPBB$0P0QlOH7w3B zYHxrZrBe*Z$N8S%jruqdpD!fKFDOjAU7lAC#1rnQec)(h+Z at R<=yM`EL~T*cqI9hV zY5n+ at jX|vOvF(!v(=jT>=ko(*2w!(B!;mEa*r0R8M-m5gMcjh)fubT)kzp1X zE!mWeGuiZS*eW)3mn+c-KTStwt5G*u51pY^Or|h;9oVC;9#Bw88(8}oaOr*m0^HKq zqkYTsL1Lr>ob#KKQ}EGJ)gu;A$|A|wdHT>_QeHw+zE_*;NF!NwdMvr{Se5F1C2vU^ z?auq1%kAg~#-Qin$nRUvqD{uF-%9lATsrkMs%jL0puW&a)GvPQGzyz+)Ut(CVh1jN zan(*GqUmzjoqj{4&Ld059Ao)RCqXm0_8vHvr at 3uc*=oowG at YZ;sbyyXsM{(CW9(pg z+e&u1>@3>ClOnWXiW%NmvW79a=7cWw0O5sd$@v(8324=rAXuYKYuAtqR2Rq!?eaKH zN+(g$%k6RAGw|*1TpJU?TVmr>E7mZ^;!r_`UZ6uKq(cdktNIOGCuf2Q(~Eo!IRtye zx~m)7bv9qTMD{+Ves8e}$W1dGVoyMv3D_}-pxa#GD2AnL!(c)6g#9S1J{{5p=(GhY zS3kKhs9rDV{?H};P4U(gui3v?2 at 5Ut^R2dhj&{2}e>g*#pBg1;;7@~M`FX;E=?Mp< zsxZq~fE*{nODu(`y+sB~T;AGTL33>rb~sDi-3kb0A$3XYCuk)4eWj78X|Y)9++7p5 zT@*r^j3OT_2tHvXQ;6zA8J|QCOB8&+L;kx^;zrm`>p+2kxDbGV1pmJY<-cU2e*Vw9 z&EK{SmKhG(QWTch|ZVMX&<`krC= zH_?li48h>LjN8XK{~^q8klT&TL$l09c-K>z=N#{=?%(&^&pcl5$NbO!KkCr6FfK75 z_u3hJII#M?cz%Ns;_TI}Yk?FF9;p83&V~jxdxFz_ at fim``LK`;iv80l{9?Kxm zgE*=M`Y5W>Nm%d}%T=1H(pMCAXzIoFGIi9Xh)YQo7pRfIm_`oUSPe6nNm)e}CQVpz7G_#$s!Oq4Yr?S;5VGV?okVETRwBiC0ZXIDz at w0X10b3xt4}jH zN&2?e*(H0TFwi0VY}FQ)d|ch6Xwj3(kt~Tc3(Jzok{gDPW0ctFtqwFNPP)`sScUmD zRV$0|bV%DxN5Yj|+N(p_#h=8wfjYC`Fcw^JkpSM^Lq*p(hUIQe%v*IJ+%c3hN1ccJVfnRayf;{N$jSs%W0))HYZbhN=L~ml5^%t`^u>hvv-0_9`h_T zbHKP(InGfDi7>c at +XD4PR4A=x(P302 zf<{R^jZrGH)k)(VUQEt at Lm?0Q?O=Y0m$5K3?lbPDvBB1-`=QwA$ zESE06J~9KyV$C`#u~uCGE_IHsOlN~XVRlq{@TAL)>cAY+oB-Gp6Awg3Kq>13T`moD&DJI)qX7Rg7f at FS=W zlTgb*waQd|b_#8FK(EzC+?Hj8Ej6buYrWp4TKq36?{||Zf;)O7GX7EZsnBAQ*dVYqO?yd*L!j^r&E8q_XfkVu}P!)!TVxUe%oNU-mPld|MG)`t-Z z&}2x(Y6q?3kFAZ7^q>AK1MbdHl+IWdZ-T6o0&ZCjIhcs~KlYqv z+=}a{$emt;bb2HYT>@*AD^UyN+IV at 7HatDS&F-^qg>=7ucL4vHN9aWx`K9X}WIM1J z3&>i>YME5Tay;<*69~;V3xr)~2wCGV+UEL=ZdY1X1uQ5m<>BBC;8L z6Q#<|dK2di>UWG3gP_dEC+#{2%`3n?j9_b3@>|b1$;s{GMZS_bCb7qZq8j4c- z`;-3!0t$r$0uuf2mxF)J;P`)&gX+{jO>e?yo)(Rr`B}$ecA;a?m?(w|S=W$bTyCYhAmU*f4RxH_Q$HZ*Ewf@=t?0vs= z(W!601&lFZgP`uf8iuB0EsC%b;vy`=?mOd;o(nYmGtIza;WdW0wXry3yyNfE#KONf z*CFv-ldp9Bh%Trr?|dU`4rO8wZNP-f`T&`8VAPUF&}eJca*idZ8CiOKIpHoU6S`wc zR(H+i_2TfR9 z(Y_Mk_q!L`q7JUeM6BNHv=t{qB52hj#u%3R_cj zf}(`#sYVHD1EV+Y?ueU9Ook|#&aD-0!vh2#aVMM84*yJjiD#E>1Pp!5Xi2N+PeCH= z`YNLrwa7MoYAWS`ip{Jw>eelUqMA2hC0VaZA*v#3ZX)npCJgjeo|GfhC`0j`o^4 at p zb;nssP)-4`WVLonxyj|(gkgK%&e?tvX`|~9MVcmGZ3INexj+<;Y76Sztd|-yjp_`o zqxZre2m>iGsGm$74l-gO3rt#bbcM*5ix+s_B)>2LtKWjjgr|obm}ESP`R}?1^!b!t zbn$EtIGZEV<;^4MDsQ`43#lq(1F-D^_ at 7#V566}zf|RA)rXh-g+-KcZZ2p@<{6u`GAps>!m*o}`jQNQAW zU)mvRU%v{q9HGDtuxLeTTsuGiDhG)}pt z{(=YS at 661q%P17W51acZ-A*g12 at 1_u$+mbuPiA{hcRQQA`G37V;r4>yRfHLk04SJr zPejy2VcH>vjX;ixF=7n at 2`{QJr%+ZCVR#$YVF#9R2axD>uAIPZ^&sqK(*6Z8vC^v6 z%=)cW9b at +4ZS&PGD2U{%8Ja&4%^XVw6f80#$Se9 zX?KexsANsN(+sFI;DE0}A$P1$qn}bZiAcx5<7TW;$ z75tl4KUNqgKL|mSKQ<&ch0Jverg7W9;R3zP2NPX(s*9=|yN4Op)G%P?pedzlX;LIc zS;;DcYV1f(Y%WR9QHAj4lgIpkCk}cD9_F0S3cndR3BO>>N3Y1modz@;b~KOUNiO>1 z>woy$#4(7n0d11b*+o*Me at 4Iooah?iTi_3Qi7tL7ZRE^gCC=^5AcoU>ObUbF`y7$b zEeuiA>*?IGe%xZ+bc6ZQmz#ynBGi!OBve>eKcqs$uPwe1eT+oRR6^o zDTMzK at Bh16{x`_z{skEfKe+}=zCX6Y5SE!}6be#*N#>4lz9d8m8YBV5f;KS1ZlHyx zs59GSKw$(EcZ54MH(YjD+JxHQ?N at 2L4=PIl<^Psmo?R|Hnc$^ zeZ7c0>}w~>bp9IfTRjAJj3Vv~ugv`SjFt*j*21bOY&F+J!D(!OT6SewbB3C68fDVd z<3)yLjcOB3_<4z-aB)F$wTf}Ik<|7EUyF#nOQm5M5Rg0rh){7Qskh*?p>uA_I6TM52y&aE1{Zt9VOuSpv?1IeD zQf~78e}Rmx#TqZ5vCvqLS)8c}9Bn`}RzlXD+;*07Jg1_?ZmYEH0*`h>^}2F3!m7#? zUF`}f at A47Br?g1Ca>>1b1vC-GL z%FDDQ;_Osvtgu>jntz;PjHbzWw9 at 3Ry{9 at mcX)v~CNKsHQt8c!u<;1|fpc0CwRw_w z%csP|CqNYjZ at SSh&J;s15qH0r6&0HgR!_9g#)4T%aAmE)>&#DP9JPSki;KCh!xfAO zu#_)@>HbDE1URo>VpeY^uwT7onCUuBjA^!ZnkFrhQhkvvy|hFzUKGu%WHw? zwXQJt$9l at 6=To~B-H1b{x{(_938nS9W_%?1vl6@^EZ!0wP~jv7=4YH5XQV#t5;y+v zr`Sqw^{F`@xUhHEaR>Z$@LlnLz!`#nvfynLV7ACA1``(*68`%CIw>J!W!P#)4rYiG~Kt?SKJW z#{l`Wpz?+(w34Yofeu za}nvxE^d;T*qS9RyK==T?t$a|PPH#QME)TecA^v!bVeDXJQx8ru<%_xqc(K!WWvlt zNN{ZtI$=sK!GA!;_#cpA3En4prF49^!6#V{MVSG8CwcB$%|&@nH1eO9J4Ei!<+{9G z`18Jo?^HzWNwVAI?72__5 at YIm}<3e|HixArQX+xCL38T^E!>5Fy`UVru9g$tL`a`0B=7?M84G?M2M;zC74 zb44D;?6kw$F?@#lxFXFWE%D(I|6deCM>vOCpkFJUtpk;cZvW50uuUfR|8=iQ$st~zuz5H44tk2S1~A7(f-FceU)rBJTz<+Z3wng6o=5E zx3{PziXkTyKoWp4_F3Yd^}DsK+C}%gOZ(ief)K`o_%iRdzF;pl+JY(y&u2_czaC9a zy7xFcnN9cjbAd7hdH)DTP|pY7>1)CloNTjD8_J4U|4|n9J{SB7Bvzkiq&SoiVG2+P zKwlZksSBBe1oTbv`471!PITEt at _vTzfFDmlf_($xQ#UBro7_Juy2oUusZKm6#xsS; zHR?z(7f?9G_4kKZ{Rl2pPa(9O5|73#Sdt|af0Yyw!jca$V3)@dGS&~}6;-1bRk0dN z+}7!gLU|{e%ig(|RN=6={Ve{Rr*BWTTH2_d;-l$<3DAymhu;tmw~GO4$OFV8JxwaF%O14yrbPlp#k3rQIA z1b5by9DKV_3$Kex#WuXVM9|HISa;KyHiI8yQ!xp1B)l>UHILl|s&Nw|`_nVCtaQZK z8UMo5|$*5m#p!C4t~OE5==BFy9UfOKjFD>6=G+QDa3w=;*m8`F9=nL z*?A8vk-4A_Bv)vSo%`T)gZN%MupIBq3r_BHKgoijZlvzf+eQSoM}7JlX at zzbeh3uy zj>u~XQoF?LXx1HUK29UKkSdm?lP%NI^KHsyaah z@!49n5mkx9h*fEA=Z7bw#*`&QzX~TL7_lt8O|iX-mvZ9NFf*a)c52Ej0D?H`Dmn;)rY4F%81sxWcDa}t z9^!KFKpO39!ppmgq^e2aHGOUg)gXt{=6T|&D(|50c4kJkM>%q zb8c(e&)oa_`9c|B_t5leW!>h(*rVk^Z+7ua3~=JZ9;crfo&m$#-zw4fiap#R9GT|A zBcZ29(DWLKyy`@Geo}#@AwS1&2%-YuizQx8w&EgMeKn at BR{9?ZAtRqJf+$f3sOTsu z*bc&$=!k>n>x9H|aTN1{Q6S9RPr4mX8ALfuGhBu_D*`<#8Wr+FV1zRs9eLA}Btbhf z2g3UdNaDi=P2)!Uf(4a%=mym4MDeZWz>6 at MXe_b3vX&2HvV5VS){GH_Ta`*w6u7x5 z-?=lMTwSiXCFWVcn{2}ZFQ-1=>hNSV>p38qvZnIvNWqME4YGNg$08Hj3^mO&-YCWp z=#Ik-(+i>Kj%iH&V*oNMCu;*}s17stA*^;F9Cp_{>Jjf>QMU zG49k{s2*p?zDXIPQ;fnbC1BpgrzGbEMJmf~u|lrKNgo{DGK^CVWNyAPW?;OUe&Mf at dWz|^^$XUrb(v6y%u61jM7 zPsR}quf0G_gZO2C^tl*`M?q`u6*9+l9iDu=RISXhB_3vJjtwa` z>f$@Ko-i%TA=M#&CE<2bP`IH}P%Upf)4-iY)IgmL7^C)|P%Jm&SU|Uh0%OH4)7D%a z+&QbwPCgziR*P{dfS99V7X$wA#@Zv*eS5$RHu+E0o-Zu^jxemC&C(4b-|}o&96D5xs;j4~--Vz1P>>g=|B-OipRQSVlpTys&~ z-jkh_>1ZiZRklfaG9eNzL9Hth>O at ymh0YKgOi6JYN@aEi``WZVm~9;HKkOU*lxaNB zz`QB6cC=P*Hb0ksUYI~jk~yH;W$5SD6AeYTXy5bJLQ2 at a235y)nG7;AJ!!xmp*~ab=^qQu{6E#X!08Zc5R)PmRU#*XPd~rI!*f{f5RKn58RA1M zDtw|yp|m*GlJ_Yrt225#dXbad7|orRh-r#(ZdJTF*7h~jge;iQS at lBou6)J*CRAnX z)B!s08d8jAx|c^CpgpR9-vA at W?1UXKwusDwKectb8~t<{t8qX)3gredh2cAB%Jr0W^O8ks|9j#?aw=7H|@B*x2}L# z=tdu%6Dp{Jsawa5u at NS;cW^YGzPlQ6joT>Usu)93b at q5_e?QU=_fbK2MUtLArCVCl zZFkI!i3XNb&Wr^>Gji=f^#diyVU^i=(lSCAznhB5n8xk;}6p&TM-4*M2B;tvn#YI+$)GEh{hTiV2;h*RczQ; zokKb5EQrqt;7`_y##Ga*RETubA1ch_pTlxN8jF|~w6Kc(Miy+PK*$j5bD&3rT6f7@ zFsSRh^K_qPDWb^!A0|fswytMy$bztNh+HwH^RBR;L zWxS-9^eeVyPgwL);UPfI_s&q;ecqtMumxMZCz)Uv5SHv zlEL{WmiDRm7kBhRti@S*6=@ zU^T7oR+nF4}|1ySWn=@5&%+rg&QApzkAs=LF5P$VdmZ7f at q)`CL7eEZiVccxih_M& z$@y*}s0>{aXuO=EZIPUVX2=;PNx(S;!nlBbqUkhKGV)|j at 0(w^hfhFSI+5A%Aanug_E2?v zS2Srt<$=5*EN90&iM>|d_X<`H!SjE#{{?)v13P~L0lEH<+W+cKmM*3$7EboA<`(~t zG5E!*vi2J)D7^IdyOWEI3zGBjP{qOdlj2CBYy$a&rV`o^>5yS!L4#MOZ!G)E#^ABK zCvb#cBCkJf8i2w<`hc5zfmP3-5UAODuLU-&xd9|#u7mx4&wAVL+wI3X>(AdGZ`eRH zM%}-NJ?bHF>FZtN?WM6&VhKW}MY{sYv}+rhl?F}!nkUr(YvA!XmQE-Wg{uz<;co_jS_^C|c;1y%45S z;F4(Q-H>Q2yHOM9q$`qmQ7AA9=n3QUrDmpJtjx3j>1lir04ew3R6h8Tm|bd(HA3N* zRTXPFHP5ALe<85=dr-sI4LtpA1Fj)A)Kz}Ady;dQ7bVKx5M$eL{soVm(hrccpvMz2 z5- at 87W1K%!YVP2rzl;r? zyM?}6SkNG^Se2l~=3RFYggDM8%ZN4Ic0u0clo}cBJ-XTFvrp$_E5`SZdI#J&d$q%X zFZtzhVZACJKV at Uy0)O*C%(72 at GCad!{*iDqSu2G47}q)!d at IT#l#EGgjb%DTrWxfP zLl at ndLoR&dE#eNgS- at gfH7MY&XyDW2)8zXrMgLn+`V at h-_yt3d|H7FO7k~as!G(&l z&C3{lh;2s0?a6-LQ^4Q at 0J-m;6wUu-S~MLBD<@D0 at MxPCKjVpSO;s(ak|;V(*!9Ar z4?YLwK||sdqn|d-B6{HLiqh)2`Hu!y!S_}s*vXO;)4DA>d)8L{W&{O=O0-D0Jr3zBfI2QiJwh+oB3W(I5^C0-lf|DH;i2K zse4w+bt}(q-1;pk<_z*wFXx`Q_(!w?DkcPJyZAm4Ep7We>=Oo_sZh<-GGLwHv4`KV&H} zuUH{&bxbNBKXwW~1UTIiTx7GCV=aSbZ`_`*0nr4)xjbW)X~UB8R|0R_9` zMGFbMSHzk9!&Tu7e0xeVRFg0xgG+^6K80YjgS_H*YJ<#g at ZkAb zU#!!1jVtB?d@=`qF^76e9h+aBV(uU-m%ja57#6rgSc!ik{rknhceL9!Td_5WIw6CY z=Ic(iM8T|YK@=C-EP*^5;0?cl|Kp5#JWzl2-yr;_S;X}}vDV6_|24}sJ9*}x?&`?z z0kjrfw6y{Ps4pSECQ%Imk@})=K}c9pI2Kl~%$mfGwoTG?TF5V9JsyjKIE%fxApdA^ zdc83F at rI-paI1`L&-!X53H`4*sBy zCNz{vO at +tksZ~EOq zPvz& z1XC(U$mUKpEaw?JKQ)eUG~VB0t0>B==n4<9X}uQc4NKx`-bI;OdYEzTxKQeyU0itC z;W~qYokFu at 5$ZKLvCriKbAmA#6)^%+sryWUpHlbRk~G{Am)%i%#CBt at J^~U~*`vT1 ziy3C(`<_nWlxr)^u!b6^*lQUUm|4c%N}>}QI&Pb`7YS06wL!(}q`*KTt~mhj?T41x z6Sc+>25+uqF at dBp{*b{9J79FVShk89BmZ>`bf)ZJpUVzGl8ODaYh&TJuxIisuv^q< zDcV^sS;dyv($6ytUS14xd{@%Z7tARpGO980lg~dwU+W?lwd;1f9640?b1m6^QxUMspkV^<#VItsu)OD5@$Dw3A4Z>lJYUoCS?UR1%~tu z^zS0 at o<$Dy_$z{a(Eo`D{)GU}|0RN?ZF?j^gpuFSNkR8iD74EhTGr)v15QoLZ$N~M z7Rp4;@T4SfEm`OrUK^|5fn^RDki8riije5qHrBJP)>i622uh`p;|Eex4`ElQ86AecAFkk_M2#w$(t|# zkkCx9 at c8E9U*E@;XgBjNG`EYo#kZsc({?cpsCkWdr-KQX?RBwZ8nGH?+IL)*oGyDV z6r_txF}5x3)Wo&$V2EY?nhg>_aR6{3|X6Vp>-+4xmrh;|N@!-!Hlmw#3l+(_I~ zw6$0l<&AY^EII(E##&T2UFVw(A7J?Ee{A+AEkf!Pj%$9uP(WR&cztZoQ4?jp|6v|e z0R2~!F38D`MVl*djVG7 at dlOK^YfmNuwouM_)^cRZ0MCT6_;l`sSkMj91e2>dzxI+( zp&Q#L?mw79`Xgoc=w)l96-UbGr?3X$M`b&H!}O9;xnU%^Mn at AEp0~i9PT at G1N79>_ zGBB~o>NOHRzf^NQcGOv^!rPT8_D5CV(=WJRCCYgRv8r z)pYH#MNxPYn;Tm?rvNRGlE?(XP0iU{Zg24{^^lb1!W$fr2*!&&)l=g(ovX0tu0=QU zJDB0Ae7{tbejo*=65YbTFo!Wetu<#Ruc<6gPj)*WZ#W-q>AvQE`@R3{CF+S19&rLL zY%4Tk{Q(M!YJH3_Bo0|+z&pKL!@@6T at bkH-mLgP^(}yUO7L^qB85HnYTYaP>N1$EP z3BC$AXR~3RI1D&GuO~%=Nz!@mXKAsCa)cDHijXuDfDX9RChkd42 z7NFOTX=yV;Z!O9`M?8S^{0W}gGd5(FO)fb at Vj5)RaBi3l?bUeLE zG3gpmX6(bTduzyk`nJjdoqXw2oT0CMG7zJ=!RE7KoMBS&G0MTzK)c=0Slm04_R_QD z0Q38h(X`1|ZO6^RA%A8Cc}{i$|9(k#gq% z^g7bdGcCpU2cDJLOH`dO4%Ve9?DnrxKL>X){Hgot;**E*=N(Fmuxm at V%%gvv>hkg~jBgA*dt_6 at _JYNMye?^PQXz z*~$|*lKGXyP7rixllIk8^;K*q57!bsAE#LZaMjj$If*xHo!n!mjf7q(Z?thHyw;qu z$XM;6SY4Mf)#VgOQ6W6F{8|Zw;fzsGf^@KDl`MR0%j1*PTzr?f9(5*BOmHyeM8S(BdX?1eutk-Kk75m)MdVEdzs8n zLM|?injCPJ6u+V{0tR1)#pU8&;H(bBMUu#QwHm|XmyuL_F&%wDiQlM(A9%>#qlk8m+z>^NoplTA9TkVRw?7(vE}ulRUx&Q{%ZwuQXSIoP2XI<2-6Rw(T74k{5j-ipzbg}@&7$% zU%h5kwf1IF z9kDFF)PXIjwXRiJ?fcyNwc%gDzm((r+y{)^a5Dyfc)z>BY(C96mu^B5p7Mx4*QXZ&|(nY0!$4XR!hs8>yxX=>w?gb+9TR^kbRup&BN$gQ!(t+?* zonnX6bP|pmaUjD*j>1DWkK~gi?~P_6%q8@}VlfQr;u-wX;k?LJ9uTD_G|(a{O<@9( zy)5W!rND10;*(-5Lc=RE18XUGS>%_oL?^W+pye$;B143&Hj7{}O6aWADLyXF2z>^;ofsbj^S- zR=~x414Yo1bah&`l(y4Fgr#N`y5qvParyxc(fMZUw9~lNdb0}w`XAQl&b#x=O;1KM zSNBs)yd)9qde9bjGWJZj at zwk^W>ja6SuYK&J)$3o74qu#PSxY{!<_LZNZJN$5H{mp zr-faoF;m2~voV~&+G@(Ab*!m7Hl5z)fx{>(`YL_rF4J>8;VuWD9Vy;>jSVk~<_ial<~L*JSH1y9^&dQ@`U>W+e1Q%U{apj`IN2Vt=<%~ z%rfHMSJr|V*~SeY=aPA~_1{eEcTwU)5%dgLA3EHpTr^pG+LT) zUT+6mpg-t&%7l?KAno&OPk}GQICB|-Q|}3h)w#@1KK)+5fOzqBo at 7d656&g3UBJd3 z-xj6F6#>7&&0iJ9dGG;3=ZG&5*WiPCCOFR4FZ5H_GuXRpNK-O%hV at oZ+VM2p?< zt(xEKb-jVqt>FtKy&=4tLLIZ8AmA)x`{mzDD40w@!5B&W%}m|{+dv{$uKpMREJoAoPBid;IL7G#)6w0pQfhAfc}#USv+%q9Jiw=gCC zkfm||VG0asBe9o}CoR(6Yj6)t1(GBDlMowp6NT!hEG_h(!7kM(RcV{ANPkvHE%ZcH z at h3rVB-1rzi>2w^Ur#J=P38=FywtQ$30G=1{TOy7xY{SLXd6_ at yE7!?v9(05>v~An= znzn7*wr$(CZQHhO+c<0Q-hJYp9p^@L- at XwURrOLY`Q`uTh^ic8Z1+b#OOr4dx{*LQ zfa&{lI^qkv^hn>=MulHWOU8c=NzNRFj)13 at xlSU|N^J4nwYt~7F(S^tH{lTHHGuxf5s~#A#m9>KmY)i(Ep#h z`2D}dDJm8Um`Z5gFho>T8uRlAG*#3D%eLTVl*&Z#5^bxzzWij19T`(*?N`RE*T8uP zG4tqEjNZ4Pj+t^Mol~zPJ5YufU*qRo6I!gs5Woc zDBruI8~3S#vLfGF+(HM>fVxs!IX3R|8qF<~O4x7+K4;sEvyH*8?~7QDHaBz}IcgkH zwV^6d8xriRhX9d at Rc(~SfC{j%))%6#DvfE&V$rhBDCc|F^LiLdDNRwp&Q^WxUkJls zW!|1mD=Knq2ZR|2(UdmEDf?sI at 8A?Lot|!jNXtsE0xw3-UOxnv-f*AEpFAhkeU9v~ zxvl5`Qsrnu6%}6~A8v|66}%bJF5scY-8h5G?_wEd1`h2?;Z~d?a3e;(JL8GH26_JlnrIxeAbj{W$ zY$CU{6roLD!GrIVOj41QY3hOAJpeuK>s4w>zb3g|#(clI3%vB?Wtj^R`r4;>lk~jM z_1I4?Wko~E+7iz=_CCgmb*q?Go0lFmsD2H<_gc;douDEqANRhSy`h2Si(F*?N%KcqW(D3qK=c* z;W$qZ;-;r^KrH9>h=NC)w*2scmI7-~I28a#-9Bb}7bvi(I)sPtL>n`3CoaB9q5>QN zeXTkS!@L- at IywhM2Q_(&wW7 at 2vfcHrWbXD}ISTxi zxJ1v0?@GoNQ5yIG!QC4I!QEdN7=!FdK$5f12%bYJ8>c`QP7jPxOniuL-F5oZZ+l|Y zHfh_?=55q!_kOI$)}v#7)+D~i0HvI8?lV`Zew}}m_Lffgd&C8>EA8Ra?;QQw*(#uE zSTJb9djURADkAS^mEVL7b#=A$3|A=ePQ2*bM8>j2I6Xk`^sNM~kRXc5sI`5EW5y%n z4ZB6Ry?Od<3zJ7l-Y$w;*64k+kgfm`BFe;c*`FrRv=D=|Ev3-MRO?buWMuf at E6

q!G^egLY{6%*s6ju3hPNDcAlv6zlwqkC~E}r!F6yV_RMLtPIIFet1 zXb8wt7KLtGFP|V^+eDB?JvR$vY~uzpa}44!%jGp%{rZO{fdoCdg!dIUHjSR``!$g* zwh5oel}I}_?7B}ZU;K>>LKru?9K9Pwa<`X+rLnz`HIdOgLK`lzgOy$3ILO?>-h_`k z_#)rDE{8IY!r%95P{~$`s*m_#NP1&~Z(5UZ!bvhZ&^avYY5g9Lok42r$dQ9&(?KFV zL61(r-BMJ--_LvF!To at nuYO6bHF7XlSjS&>fG1{H1TQms*jo=*t-L?JR=0|20-1pvVK-?hYl`JX1Zr{dBQ&&xCsEu$Obnkc{MFF%4n zAh1F-WCG$q06#c7aJn`o~LgPpxq7p;A at JFe=NOoD6|g&?%!%NvIv zT()FDCQ_Z<8Q8Yv7`A7F=&wK?o}-xv8h7!|L0}$-IfMNZtPfz+&v~h*eU&xG=2zws zZRdh*O6$AwSLl>)mW*t;o`d-vhqIsC6Xx$vK6szQTPKVjx*of} zowohR!U59hQKOW(>ds$ZvZ~V_a{Vn$qh*C8&W4@;?k3HhDjL&!ujfP z4qJ^H$`tn58Nr91Ld&g3zuIC)lq*JI+t2vvD at PNy9N|Np!a0TFN+8B_50zh`+i?dJ8_;n2|uq3x82n*cguf_{Dz;239oZ}OIkgN8Ef-7zx)mtSwX z)}{tXoB)FvJ0N5kz=U!SiW2-bhN_Au3ILi281MF?G*z zA4EGAZ_v~KE;sF7njO`l9xXb-95bFZ;VhWfG594tse?Hsle_cl-Mu?bleBbmcd(SJ zQGHUJN)4A%?9}MD at jMkh!!(>C5;8 at Em$4cqUeoi-@{*S7p;M`sSB3sjpfzayu7+Lg9to8ZFh_SKiff6x?@x(St|{Xg>omU zD(utZQadjT5djB_k7g-oYRru0CT6EbX4a-Zy6;$U^~hFa8_RX=Rb^gJ at 5#uS&~A?C zYq^8yZK<`x$;H9TQJBrlS!;`}bp~D=&B#*J&>FKcgzs<`45P2Vp+_&lon0*OO*JRl zx&d{hdT8~l=F)z zbLcb3Z!mZF#%WRLMWZa66clq9-n3ucIE5zZ5Osk@{X5vVLhk~)WzR^pbD)LnC2WcJ3PA=d*nz=j6$>ky6wrpGccW?g)-me9hVe?GIgGuFl%!h*AdwjtN!D}1=2RMyOG|#!uTPSgmK!tvGAJ<4k?jBn zY?=)1aX^JNUN_}m$y4E7ij1ndlB(sGSh%F$j`fpW2?Q&Q{giXm6LRn{5ZDMmURK(e zUR`a3hg_*7vMZC`VsS_ at u6$u{Mj7RuD}2SuM(-N(JwroU8^?^2AUQZ>VXgc_o6#tXmdMId6S}?ywOjE5`U&5P+CVwd`%UbCcQ-w( zn=(vw3);B+y?v!#8i2}4)j-`R?RX$yBASubALCytMt9X at jjlOMlEX7QB!3)v`4}L= zd?p4ETx at ys@^VTfk3L8A$~!dx%!uLT)h+E~NY)(A1oH8lvth1K3BUa`6@=P5R={h{ zFFPLRm2Jt$g`m at O^t4Zo-GoxucvZxfcqVd4l9)ed8ZlIo_(-=NaRZ%JqM*Dsm zT1|ijye%y~SE0ycCzZ7tedy}w)gFFuNh00QbUU$89iIeCXvd at _UC}3Ip~mb1nym?C zMsM%f^(?gYAUdXwwV=(ixVU|4+Tv_PQQd!0t`0oF5J{@GKie>DYh at jjs_W)!f?o_Gfwq#rJM^;0rfB^3fxu?`rhcL#01C=G3T!~GVgGuO#%nx z8d$U`n)%4+5W2iP2lv2UUi4#-qqBK>t85(~0Q)Kxr9~(nlrqcnt;6eiM;$jd?P(temuNntvK12s!>1FMti84Rx_9W||`)rnHH1{it)PkGz&t+&B zMr^5m80ZA*`;fv|r at k!d|MOVfspSq59nWJsP{ba$s=t(@5VW zCPhrSx?oh!r|d`y*2JJTwJBT_IgK*~>cT{OEjz)clG5>d%UOr#-pS2gjd!i71(U1y zMs_rJ;4~KO!H4kl!X>Zb^1yDXktmQrp&+iP>}3+;*6IDWx}vFZG8du$;bvz}ZPl1R z=JeHvaq;GFm%MKc`y9g2l;q7Kl%R0B;%QwvI#te at kS%wJqGVlUq8NwYuH=@CCVLp7 z^ak(NEKZBBVV!VN`bhcSMB#WMn8LsbnD1D}KHuH$8luhYU_Nd}6ki=E5QnYgFBm|=5mJL;=U(6;ZyYxYqKZLtl zB(G at hH=X zY!b?%q!?zd1mhd7N^q{!rU64?FN*vilt5t|A+B@@fYf~7np-ll?Var9QsreF#0 zc;7mS$wosfdlaOfPT|bB)G+8SgOb?i^3h8x=E_8_-5xh=twUR_o3ug$3|6Z z?dcs&!Gq63UWyllTRabY3M{0ZKQ3`(edGAo(nZ4Gfv5i;iO;8a< z0UJ6~aW8xf+n+I*OHrN3N_mfx6dksK>{dZxlK_hB)ua8oSR>lzq%XM19h`dJ96 z`;~2{)}EjK$`CGM+mh>MHYazOqUff&T`=x(lmfg|2&$ilC*C1Pt$dx>tUMd}!dhSZ zURGI=yL6Vvwhh at pe2_X&S^$_s(X}ilvoL?nbB&Do8QeI;v+Qi=ZgpjIFwcT?H**S< zl})m8ptD)TV{sSrkX%ycO|E at YR5Kt3`!!Dz_emlv>+nt_?B>Zz!$#^axaq)s*)h!5 zZ<wJl0ed)LTcqr_J?^DCGk2~AXJoOGK at 6FO-HSj(q zWwo(fv$#35 ziDybP^Em-=<6u%#b_3~$n{nn8 at 0$L!GSREhH9#G%2z8}1Fy>X*?c}U9vjN0o@)hG5 zG{+iA&7Usy+OL6mxk_WfNTEML1l86twFajoW*YWl%YgfwG)#Fbm4x!_sf6I>Pc=g2 zzWTRx1y_Ytr2;c|+S2Cw_T23Hs^h1?{lOel$V%p`GEGBQftA+^cDB6+QB|k;9N!?|n^ue8lvQ6!TC+G$ELkylLd{u>954Npx_1+Qr z(wm*b_`uBbA~PvbtS3TdIK`kNUwaDbX9l8!7*(Yt7f=hz(sHO?b7YD-qX at hK9g3FA z+Z3f#lS9dJ8)W~$aLme`B1d*&6EiV_%qF{{raDi<*u6%^&TE7HMw5WIJ&kbF0xFAe z60(viUy?z)Cv_Jq2OKXRs`ZI%~%zNL>99}`ba$^Jh4dd*8cdbfVF2lAKwD<sDg3hD6PZ2Ae^f4qv#V4-l&%*Mz&TF at rjoMkuoma?q)BMez2bD4n zkQ6+_Fz8-xkRXA8VLTiJLpFfP)+l$yiK%p&xMXDxNdkA at kfKw_b zmU{?!N%=eeICe3o^a-p2U`Rr6S#9|_J`+YB!6zj*e?mxEU_>#L0(pqhfa0{$IBss4 zOZ)|x)E~iXky8DM0Vc0hW}(;Oywh+;>0Qmo=#LDP|0 zntRUUYd3H~(kHrE53_YC<@S{09l>XX6o+`3NTEcq5c at 8FPeB+xr z_?b>=L1{tgpkmaMf)A4dBinSLHHQ7A*PJEN^!Z*+YSA1jd5~q}Be3(4{3?3ORe1SW z2Uv#zu?+kU>n|OHc?LXOf{fTs;(7YYw9Ay_r9 at 905a*rlJ>LTpRGv3Q=AJnOq+VI~ zcw)q&P|0Xu$=oxD9EOg$iCpM>AtFlFzEg{L*KnXGv5K8O at w3P`gV`V?Kn#tR$z at Lhz- zvmN^6*oYUg)~NE92rzTxnfsi99YV>rfL6Fh5ftf!o4ptO7YRZv`Vgj*z*8n<5|(*o z?q&T9B%J*dJTm-LB8U7WHF-M_I2AzWsE%Ha03Qzoxb&p4+AxYUy!<$r^N^|4d7{{ z#9DP7`-cpOG>ze{>EALZ+P?v&x(txUi&)0n#1b8-$B)R#O>jf*8|mey5fp})RJn>Z zi&Nm(adX{X>`Lg(?|sdvDQETDQ{y)Ez4;+WOeRrqc_Y&H3lCA4!>FTEsg3i7Eal9i zSxu$q`pFgS9Y7ws9s0T*lJU;DeQ^CJ`MBcBNEtv%4&6a#<{a#2c3f0RhYw3~f6FV& zHP@%#CmE+#R_2+FtC!2GTS}^v9iL7h-f6M2KTW^nI*_iEQefr*FBv at uo9=ntMJltL zGnGfW%K-~pR;QLMC=GdP`LQb#qU2J`2mrHBz6&XT1sQ)~$VJEppyLLX`Gw*;GoZ<% zqLhRx0Nybf8vl7r=BHW?AkN2WM1S&bG-i5R5-C%joiDcs;c*G%MjN;`793wIB-^lj zeW3n)+jrDOcDE$gM*yMFzzxIp=?==dSW$nnklX3~$xD0%bV)O%+tb!(Xd{C_^|#{F zP6Tr!#rv>|ji4G8(r*KA6J7LsgJLHIw~qr(`^Srz)T5Nb0h~HaY5Z;2Noi;qaQ_?-fsBL3Dg^OvzF3NtR7EKU&9~CzO9f4Gh-i)J;>?gy7G!mpG at c9| zIze1l!ch=yc+~AWei?|%ur8SdqHN%~w}mr+g$l?{aIpv at tKLFPvMc4A7Y0zwFO~KF zQqr9+1T at 0VZ47@Zc62JBS)r+BsHKaASHE{OZz#K5&_lyU(x3~6Mr)pqsG5#A;MmE9 zg#8l}Jei5VE}3mPJlkr7MN~QjdeHF2lkSYNok;Y)G9gj`Prn)pmFjtsFhD#vXvffspD+O0jZNvS^%I z5yr;3+Wya!%5^Qiw(j2%E=o@%ui}xhNmFZV=Ep7}T$NgHGekD+UyD}o3f35~1{0W? zF%NH!mUk3JU|(b9&4~gf6CdhYIn8xPkni%Q*D#^2&;+U4f(dL^(2hSoYNr%vfa`bh z2L+iOQ{s}vPTD{Gur|ChR#D3-F`bCm{G4!hQAAG?ry+_*Ll=lW{Q+4O!Xr at C_WV7Q(ycP|Z91`DOZ_#V`UgPM zVa>q&lKbf@o&-J+2tAKjC}Sz*5C&ylad?G at Y{!C)T`%F$TE^lz|aQy zC&w{{Lwy&MRwkwMP*llqrhY*s=$BF0_M$?^cIrCxn8F7^@iVdH)yy}x0w$W5`3j~& z2fmxRPf*zxbMdp0QNg}uKQ<(C-OLI3PRn`RD2{GD1B-;iW zzZ%QaU5aID5(i^O3w2HCch?H~Z87AfVPD#3=2HXDs(rAgk>C=Kr)&xG0SEM8 z7xv&6atZ;q0f(ZavsSZuVCQCVmfw_7cDY5p8DT`KlWQcZ1(IVn2ubt^Tx7m zdiOmMm5(xz4=2pd5Su? zXy>?c?{ZI0ICg4Aq9Nse4wGpe}KYCqgsq?J%4?@doJx%Tj&F_1i zui$dvasuyi#6Jd!Wk0Ci0krUFjvm<3g**n0Lfh*2bt*FaB_}_u+Q)P=m at KF6Yp>NI zX4^DaaS*t6$Z13%2j;1TBz|iZ1XZIrK at sKD$7%vXfNT+XiM4C6GBC*TS0kyU-M_N~ z=v^pjdj)!CoZO3~s5vO;aIetwZy-9I8KDiSj9$4V*>m;OS$&LG-6d*_ARZlSv!iO8 z?>EMUqffa~_&=F0AP`x^uze3H&!GEF_OzUQ9cqI{dJW?vz# zyW>Dtk^p;z7B at T1fh0e^&LxpD at 77*A?7PhVR1pho%Y8hJnYRrT zGEgBOyz;wN``+CFfGsAx>n%A4s2t@~?eEw}!Dbq<7McX~Fw2x=cX}PRHBnpOoWoBiO2#-r>x-~EG6(>P7jhpvJ3nL{%fClxR=C0ml$m^(Qe8gU)E at uZoE=2 zk@#$n&%(rsx2KcHi%@Az{_FKDy6DIVv at Ey1)48qzNCAHHrq}(!y&tCUPZWt8Whu}e z(+!lxFA_e~)!haKb|Kc+RX9FR+NBxYEyYsI&(k#JN7+m-o`NIfvwh4&I(vL>m@?R?d0+h@&@ea3sOW6B!HI&YR zUf!HyEvOoE`yd;U0k<9bNDXEqIH$MO-0>>SB3)Wu%*5iNw_c{EIEBN-#NMV=fy69(ovfsWV zr91pqEKo-yPDlp-lcRrWpYNS({ReOlS8kg+0@$eil;4Y@{*-_aX=dE_QiJ8~-wQgN zLSt0|0s;Wg{{jGD`!D^eCXzR at vT@e4lr(d2G_p4OSH@$OY at c*LFPv9^C}0_$CMPDW zyIlb&Z1WyJKR;PI*qN8rvawx<#d`mU-RY_Va{!_0650!J1tWo(t5~fj=N^iZR`Le+Ht)U1hVT)~xWPNlF$r1Dv z8e2HBcIE;%zM at GpzqnL?gCSSq zDuILErmmzZ&FVe}rL(OsqNqmG6i|3#?I$*IuQ$Du{-4u&@EDey{dY>?K>n+FAOAV6 z(l(A}#%2cpJP!4*sr^^6G-Hn}+J?HYXdL6&n4;I>2^)E$_}_Ge<(yE0APP|L?Y5m9 zEfW;{8%8V0-fPEvc)xqKjVx85d_?)?Wx&k zZi#f(_MEI&H>=QLTbxg2&jLr)D3K(C4c9hEnzN86kS+2Wh(D#ejT8zy_LaoIr0r+9 zVMvZ3Bht^p^p-izxLV3J#{}n+T%0xUdVF3x&)+O)T#co zw8^hCNj#KuwwW`VS#8vs)1>6d%r?9QWF{wKYr|@pvG+IriU{T2=XME1`u4wYXVB*r zhY_UiVQ?ihtqf|e;vl41OOL&CNFPI0cjaqK;Z!ZxP$F+G>+#$pA82SxT07v#ARRpZ zk+WU1<1bUCX`A1%iDzip3-VUlY*}1##JW#c+~sJet17_G;;`OV25CXRZgh5mdRwqJ zpqnnm95^lewwWXT!NpWyGFlv+osD5)U}CPHtA^eZhq_06yy|zW-#Y9f$snpg9U12F zLnh_s^*}Xxnst{pve=1T?k>>!@PkC6#5p`5pb>Hq6TziXz&?6PC=tpoPwEAD6Oa>1 z;#nQ-nIG*De_J647HE}jX5{067CEqH!|`CH%jdjUNshyPvTJV{PU<{xe%5vR-zBqukQum at mXc?z#D z3Wtbrix(Ww(qt*_be7({n{&TEHWk&u;s|Z(37hpt-pphZP=Jg z;($>OX!f*;At#1A{%^E-s~uE6g?l=r!Aut{=6bCnO>#?r!Xt%PdA7K%BN?r4GXMD~ zv at -A%DQ*~{GIaw{?uT0DyG&6iv`G7-=+bNq(CF5C$BxOEN5Krz6zZKg3Ze%sc<3d( zC^l!ba)}p~x(Quc@&bvO5|VJJr=H{XQL1uguCIU}N_6pv&uY7Hw60EV`gOa?Swdp4 zEcoS4C)dWA?OyE?WRfiKa$mhZg3RUASql6v2GxwS81i!)`h%ks2Ii8;sYHpy#<2dPAgl0EwSVjJ0}P`@@;^bx at So`ZV+tW8-uKyPs zl%b?$#wf$!dG$#!DpZ^NiJwdxbsKA=N8XM5fO^NKNhr$_FI^!=HEA{Jfyds?y@!}& zaRC<1$EJ%DH)+A%C^TActf@!#ZALt(AKr22L1`VAqB&WRlx-y^gggXkW5;LN1a6Q{ zC%ggkQT-UHADOZR)SU at VV{tWNIADMr#SZ+E0^$z5O0{*$XI!@V!(sgqyF9RAH)Veu z1`(W4c3!=`4Wb9sb2vl$qrQ25uk4RS^~7Yp{K5jyXHR at y>*NiFN$Bjv1#%wt5C)fg zq-;{{aaF;=?`M!_jtaW7NIBq0Dyn|)DDW!8dCIVcLEc(aRtE1W|I`Rn9=f{yY3LH~Rlj zU6EyOyQ7rGZAqsq!`&|EtK6`fKR7)}KS{^Kv6J at 6)#b^`2dFQ?^Fb(qf&RiEi$LYM zyS3|BEOjH!Yv4w_$L|ir_iENsrU)&Ng6emF{3UxXJ4T$RK%Wth_*6*=c1`EDn{!WL zjJ?@^qI1u_z4!;Z;!XR-Q5-Vn*nSc=c^qK!AjEa6 at 5SSo{+XTdxO7{!lLOwv3FP2c zMpz8Q6>y;(e08#I#3ea{9r%_1Kxg(B-QGXZQTOMalj`cG z)e)2VigOD*?>+JOJ)<|~C;x%YN;e3HT=>-gFS>(-f1<1UC%XKQS};;3l16dS8lq*B zcZKkGjX~G9qRAO at LPjH`GPC62;l-fqPT at Zye^oa{&=_=?6oefvs_}2C(?X!O`k$a< z`oE+5t2zYAbLjsrI)?wh(H(almBw+&n&bUdUEzPIZsW6T3O6XH2bqw0uYP*OZ&XJS zZGVQ-R8o@^$t&12&s9cIB+5%fv!h+>Uc^0rDq$k{L=-vptr;w&Jjd5hEBJoCOX`w- zRbu>f{-G=kOW>)djfNq at UP$KW_D4MUlc1*}i-4cDMkTP>581sCEswE3y(Kytb`^8= zqOre_Q5ZQiSr=Z~RMIplR$Huc=8^bc=o(KFE6S`TqZt#d_17`0iAWX{VN$TKJ2-OU zh1qO>gU}ISWRrfTAM)XavYT<3o4zESOXwkDQN;Ks_Jd!c_*mY7?w!~S%0{(S-pS$J zmly at VBEp^<{FPnIKV%2Lq)hlP$4tighhtv>B>T z?x>}0nlVCNO~&Wt<}W+Wo(dfNf3XAp2Rnnm?4F-pRw-8}3jc#$_TSBJHg%Q&zbjrf z`y7_++y?&OE#%%)7(I=mKvb%pNtuMk at q~Dtoqrv*93_w0ke1p~R&f3O->PjatPNZ$ z{{{dU0|fwJ{_n&4S7feqWxpVd#8q!uQ%N?+2FMRaZMUgQigd8si_~EzFN74}zd%+< z_9-8E9zHHVg6sFPD-_P9;Bsyjvg1`MeIrhh0EM2en!V=W@{;Xvvqk&!HG}H|NVXRg z3ABjBtiiyy>zyU4M^Oz*AgzZ zW7F;&H<^3`-&(zOiqcZ0(_EEv<$T at BA2jIFgzcrU)C^R(*j{aMj?;oZRC#4jX}t); zgfV($b3Vf)(0d+1-%m7leTOyi*3b6Ydfrp$U*b5 at kn^k_;_NZQ;b;~J-2a3NZ0h!v zGg?y>?R?18{yd?3>gy+rpX;8!s1{DH)M|Y>g}t2!1jcM# z38Bh?nISFMv?mN)HWEMEsa at fIeWXdsw|47s75p{32g&}Hvtvb5wF at H-(Y?E3D%J<< zI;{&qmdzOHkBkMR?g&0THYN9Y(Mk_ur_|T4I at keGZva05figl+O+IS3AC&Mxj^~mr zfR8t4>lNc{L!!gxOmrSnGaBd2_VGjUYdISCY6vzQt*n~601u*Y8`?gv93 z&_Ev}>}V&>GX{usP#UhANCSM!7IR29TN=M9X!nP|5Vtp3kAd1K-sSSPLGJGl4`pa_#=iR^N<$>cpXsRiwB5po==c zDS)1#lR(%~U!d**6AgrGL;`9#@<%Jt#&rB*!ptyRmcf7jK%tq+^(P4!0DuJUzgiK5 zNZQHLQozRAz{%d;$lCFLpQx`=F>_cDM)O{-C&U#8+Y83=D~7xD^_xes70uf-9bLmZ zKKIMFj0~kJipPqdeuTVAN%lTn`3~_mHECU+egu6KaeA*Vv^-RWk}giGbAH)+aeeM` zewgX;`G(%5TE0K+*Ti`!J)RBQU{BwIZ|I=7KAQ9U0LJP)ar5+}eGvQ>_ry8OGvEu# z)0YEQsT-WVvRhfKqHy6_s5=prm zVMc)BnSP3n*1BNwS@;bY(c)1bP$LO+#Q5y7gQ6ouzYUi()nn{QMUzpcfz-rNsAHL; z02l|dMTZO#pZZx4SZTyYk-`ICAre)bOG!|sG=11mXOogZ+-~?iM5OLb^aRv=t9j3b zQ>tlP6ZsWg_~;*+wZzy9+dYToq2t?DlO^kuD-EcH&ElKh4ou61WP#QD1ktvh)Z(~0 zJ_;I`Jr^ht%kuZ(i&mZb`fQCao at Fh?q;DW!3qyipa$usg%!ibva-l~Y;|@GkSkudC zo2^FgsYq4KM=dx4>({O|pV5ZZV5bL9#H-?A2{8*ussFlY==dp+D?Y0|K<6 zZ3_1byUU+!_kdo=Mz7 z_cottse|uXYzUBJ%GikvVUqNE$c7DUltsUi-nAeT`Nn6lwYIic*jwL%yB4(ftX?os zKquLoEo+jTulEOo$(Wv+#%WG*Xk|Jw{d-J>RlCgSwbX-1DB|biYul%FIox=WfWN=cYZFD(1Aq zhrNbUbcg043$q2tle6)^u+nzS1o&{hJYtK_fab at En2aDilFT|~9>4PFq6>IjH?Ic7 zki?wG=?3$={C3w|AWFhC(7qCt`DuziDX1O6tcx%f(&NyuH%VTH$rrm;DP7ecfK;>S}n-@%H0PsIDE z-up;?;y+V1N_;W;e*~U}kEYL49$LeO%G5F4{(4I->5o(w7Osm`IX_jt1hB9nBd>cF zt>l7VmPcIiJ#43H1L}uc0h_B9)0}{(Vdhm>#bBWY;Y|Wi1n0E^%oPVH2g+>*Xx$bb zul&L#CzRX at o#qgrB(4MKj>2wOS`;QP)K-AVA~&P at +)ljKijXwV(2L1pl$<0*y1gOW z-5KFEMF=F}Go|icF05fbv#1(cVI3REtMSQKQqN~6=B8H(H1)<~;z39+sbdfmX2i&a zZ_r?hND*VGo&!)B<)NA|q_WlHi at QcVU?U*_4W~fZKU0})CK;Up9HhfJ1Jf at Ht4~8& znBO%?1l7+h8b|hJe8m0YgmE^!gNeG)o|s2wh(R2UPjXYVg-f8LUyA$qw^UO3n2jhx zAOL^~@c(Mxp?{gZm93MbnYGFP&GnV7Trh-?yn};yPmBEmNx0;ws_KY416ky&f{NE0 z%@%;v5yc~KCK!k}s5&x@%8q+VbsFFM3W{;0%DG0~*Km*SrfGEbP5CHK=w7C?OpLQX zhHpo5dcHw+vC8=bZP`Ov?~-vZIVm9~!Z<}!~yc5y*rL4`uwU3n*7^D73sGzS(1;+s|n68KGr66|=d71j4^_Q#J zG+IuTQa3{_6>~w6s*I+Vr5Q_|pvzwr$CZ&uWuNidLk(D{Psv^;5243 at -M%@Rv8PZa zIXpBvkkz24bIsTiZX4v7pL3{ON%EN?B~n`-z1ydeGrFQqQoy5Y%|U5fE>Uh$kRxYN z8Bi9B&&iUJFxg;sJr^$o3vmC?QF1YVg;F1i>LKa?Iu(vG#$)+PNRX*bqTWKmI1*FH*SyT?YybWNe7 zk5E{_?8IOU)xE4X8zPgTulvLavQZxXc;(gn&Wnt>t%DN6;`+Ej=%d>v1ojshf=$|+ zcVGq(cDzC)ew-vRh&*Pq&TtRyK4>sL&8vKuM8v8X4NgFPhsGPQu?R z34$Rae}V1nc$M_*Wzj+uAo4~N4Ta=FgIZlC3^ucHX;E?8Dui*?XC0M0?1}kYDSL<+ z at p#Vj%{L3xhKpzB~FtjaAxK3ShnIK8 z=jk7HCrH{JntPN^xd1wCO6d+1d4~Wz1C*a%NloasVlg584yhY1{wzs|n z_wzz4+6=^Em(H`pPR-}xj_oee^%3d&#?dZ}0glzFN+FjS4`rfGl3sg2Jryw0XfFZG0opC+*TZ#_FD$(l2j{sx;a zbN~Qk|0NIlm(i$!dt#Y5`PekhM=l#+QwrUo*HE*^t285NIA5-Y?@y`MuV_m|6HUbZ zroUJc)wX~&a#Mlm)XJpEzbr0V^kSu?97{Sp_fkGdBCc at gBh_!Oip0(W$XJ!mx`s54(oN`MwXi0K6 zu2#5T{kyXqOJ0?9Z|O*|+1G{UutsQ;${0j~NRwipxwAfUL>oNiK^K_y$=b3vX>wm3 z9CK?mu!87OY<03y<>8sxS~Z56p!t56BU_ttzui7`&xxR!KIW-9qxskE3JB|_?@C1L z95i;T*dXR+Ei&ufxH0_37F;h3yp6p8sWV-76+))%z|1UdpBT8b*ll5Z=b$i>{o-r(I zi|xXM6fW!6=H-#GZ-y7aHpPB!=m$Ii9}EeCI0YPJ$$~hBo}3E_3MA2i0XlO!8aNSR zoFqjN(c;z~eW1D590TdT)nL9#7->wPfuAi&Rp={BAcjHlpEBW)g1A}?DH1q}s5M!p zDheVby}ssYnxAdiA3t4}TAou_Y_Qjt*WZ2Ld_YhHlcZ{9%$c&F{dJM@{Bx>7wR94Q zr)MyiS65e;Fi<#PPB4zat^pJMjStIQecC=gwIv_CEj=A2F)QG9Z`;@1(kN>>{eY71 z3G056>QckZiI%D3rUd1}=<}*<2ud-8ibD0Rgd+mu at WjD%v^d--Q6~FdbAOOAq9{f_ z6xDI%VCUddzc-P>i4Lj=#|}j$&5CAR8ThoQiUk*y5nBInmKXYiD~S>J(_^q2lDEVH zM$_GzDXWl=4Cj*%@kn;O6y=xCV at nf_S+pYNP1hgC2qrqNt5%A~u2j?6>>SUc at k}6K#~fpd%)n3 zBsDw2Wl&5Zu|p)5&5e?U%+>Q-el$S~YAsL0T=9~bsWbcTLJ)<7@)?n(%eFJ#1&EjP zc+v?oX3H`lL_-HE$l+in&^*a9T}7@~Ga($2INY(%>4y!@CH z>>U`W71_`V7Z+4TEE?F^kmLy;h|}2-rANn0`Vhn^HWf$@n>*SBHM5Wc1ke6<89rtq;%+g9)&5N7haTvti~A2u(xEeqa0DX^NgOpT5gK at 3V=f$Q_qBEA z*pWkec9c*$*^)yLa2RZCn4gZJy_xduL+aH%`pl`{`Fv^`)X>t<06E%^xdXyknl4q3e=j z?zP>*9IR64tNo+o6RaBUBie*59!SCAx+Y83yykkeRGX7bzX%Ca`Sa<>PO(LtaI*>6 z%CpQ_A at I7aU;}0Q2UDQsmWz3b4|I$vlJ%7 at 9!QPP5PV2uy zRGHNl53w>c9KE_lvGBnWCIP_kk^p3!rEPD1ub|ihW7FY#{@4V8kjUx_E>kvMFrM*Y zi#v{Ve?!9Ke9D3DDx_|t8N at GxsIMAm^-~W;JADyS2DwN51*P99rByA*iuF$!p>55EPSZ zR75Crdz4}Y9ytcLo|)vES*PX8>R?PtP!bUwzE{NZkF+AD%c=j91Ymzfkf3h&-`=W( zifYihe~5E at M^c)+#r9MWJ8AR6il0BrNoq`wAaK2io at 2U6W5xc4BEYl?L*UCoRk1;?4CY@($@os zD{_A||Hb<$1Idv(`_(L?nEhn${i`0OO-M0mIF!aJ!sdM`5}(L~BNwWQi~p~7b8|;B zJFZOW%I)zG2D_x-CXyo!h1t7yd?TI6jnHM*7{yU^=^cccE%vtWB}oeTI|YTak}uoP z4!mfsse^Oa>l;z3i;J79vmN;ZznpJ9zU{?jg?9T9?-(@Yq!F9d<)$RU at xtdxw-XK; zsM6ukMBQI2b8(8-#m|dFP7}U&mm=*|)NAOb-8j)+!B$Y_V at 9D#NJlk=U{l}bMDR4K zI!L~I|j#8eMP)0f`{$;%CrL3&9u<^0f(EF`qtMJ at jj<9JHZ~NvOy{kq)Hz1#h zAYk9FWH at 5!r4%CLMgO>4dD<2cJw+=9t?^=QF%TOgG~>@*mO7}o0cJric~ao(;=4}z zgHFp&g2~tJI-ng3>|Htf<@C>=f4;2smsHU&vqx1Yt1mxs1+n^-fVtChwiWM+xX7Du z_8!85=O#N at cBtlRHi^F+%>j}{#8d^0f#^L_f_Y2`Ae`h|ZNANlJP3t5QhBSde8N}k zM9LpTZBSO+#8pHg>>)EaR^J;Y9=PhA|l9t0Bx5c6&ry5xDx z8EID0rS!7LxUyJ#sKpGd?OD&zORY$#9;uNQxfdj3!Q_0aoMIrErTP0Ts&T=aCph6W zyWE9T^TnQ$UV)TG(0t&rw@#Yy0aa2}i|v^xI+lpIchoAlxo;6xEAgoKeSA0pLEi!y zVG8rNbbN9$Rpz`;vWG?~zNm`)z`4|A#5ptTKzYqT&sh6z$ayPM0I;qVF#iXKD~s%mbj2$1lX z{U05mWCGK(SOUIdfepbCdW(t}8H&2 at RJp?{bs_z2t^o_FtZ0g}{R>W1t$T|K$FtD8 zy@|cwv5ud-wm}Aca6x#dwocC4IuhepADNETgXbf^x42l>e?5i!FeC^&Vov8#5baNtWG&gr#Gj<}XMldJ@!U^2!Vn)eL;Zo2;MIaq zWK1s%i4Z!Y*c~2RoOPLDa)OYj=r3Fa8<#=Nv9A^DBFR3~D^4>Nl_VA}zJ{5fMqViTcoV8GdQL&VUf zZZqGbtI)mQ$YJn3gaXq{@uM*=Qk~6r9k^xtrqjvqm zuT$fq-SB|RcHy$cyJK%LF>p?tV-sq5fTCd&zD{?|wqC27x*}IP?dH#`byUvHfWe=( z(kaz`n_bq`9tD>U{wM7#MvE5O0mQx97+Y>x80LYekiv5~T{mERtYR3aMhn>Ht0cz* zZhj;h2EkFHZfScS*awC__3uXoovI);O!wbZA%+EWcJ*8D*(CSjOW*9DW0I(LBQ~Xc zlbhE;Ul`&?+%exHap$8;-M|4hA?_jG9E-~P-VdaTUcey1J;zdO?ih!#bLD;>az0{d z&*|jojO^WYXx|9_i7MU?Q at dH@nKiS&)})*B2C}^CjKbii at OJOz`k()(R|^26PZKb3 zhC)MKFVaxiSyKk!s4)0hWBzk&cm;rUP3O*mukmw1Z}V{j^XKxTI!=N;$_wuHT;9z+ zKPlWK-M=jNf;CU)c7L)1gR0ccraLShI~>(!d%ei)*+0X{_xTenTNiD{%tP2cA`q}E z^zoMBx97pZ3}{iI=Z3uvlp6iMh4U;Icfb&UwHr9e7kT9a3q3K^ALJ^RT z4_APm9c&x`ZzIzUsf9_~yBIL@)bm94C-TMKLFxfb at _fu}gLqK8O6Lt@4VvFT!jjB0e1d>^I1_$VGtF at y}0jufbLLPY{{hWw8wjLXoLrrd0DVq~*88X;?r|C{iE2Cn?=)z`v#@F#HSHkU at cfDF4T4 z;u8P6GuO)GU$UhC+OYdq?Lz+ltl-t_u+zHMY%h-}qlXep&Z=IElFUp_R3u}jpx87k zkKSA_**5kiBorh at E}FmH3}?w*XP6UKDX?G6$Z>g_;oi;2`1(5eU<5+EBLRYL6yh5& z!RBW<4u&!of{XU25>jS>j;3TWX31rFRmr$iXK8Gh$Ty`a$>5l1nR!B?SIIs`SD{aP zVi`2nZiJcdGCPvvm#zhmUNp_ at Fqc>j2`{Lw9Cmx^*2k#@k76D>*c^YXT&5db$XZeI z{ix7F&KMd<_z6r^^(AE#{lR>;hl%Q&w)pg|o!HhhH<5jbff<2tS|l?Gh;qix~!(hG~rr%H97EU(f$0=e|M;r{5@?hd3*@fS7MabdO5v zlC-)1n{GG5O}5ZdHJ>e at U4s^_KEC3C<{AxKEz!?PW=e*AtaBhM1T~8eXEKD3=F054 z!YMieGkCdNZkMUnm?IWyQ!)%b3m6-=XA))5qaW108V2YB>cus*{l?KuE_d50%}*bY z!9;lZB8B?#=lIFIMRxNzz~-U_7M>TaW6bZs5c_%tT;Ogjw3&5_=1)#3#sxwyYQFIJ z;+nb<7lt^S at I_D%a(TjmaZ)Ozks}qoe!aU7*Dncm)a)Vh at D5} zMvpPZ#hpe&wOmY-D}ioTfTp;B3Mv-BksJ=%WDdGj9EsZ%Owjq at ev!yS0rv=kMOnN; z7O!?Uyg+ at 6fEDL8-4o2^_-n%J98sT!WC}y3Ftj at +sfMSQGF{CHmd1RunpN~9fr%v7 zi<-KVK{(<%Sq}nX4>JQEe!%~gYW-HTX|`ZMK=trIK#c!?sPSul)xW0m-8$48N}# zk_F=(_jWRJypA(6J{o>LKTZrpo5Xj?spV6sGmE#Wr4`ww;!i8Nu7=AoO1-mlsgf(a zJM at v`Cgto!=(4b6cwF$VsghgTjqn=-g}fOn+STUiMC`QHRZeJ1!pw~4+-lm-8Emc^ zNbMO#yPRRw4iPmp*kD|4nkp!w-iWYp!KfXnZNcP;#RG-S|;GpA=C9QAF%XZ-VTg~2Fw>V?7E+Iw;pBX7%sN{ zG~0<=`(W7ngS)2r^^mp{{MpsI(irrg5Uz#EYBBd}8Q~1=YGDw2mQv at TYH}PQ{|fAc zQ>3-nJ^H&Rm%A5MI>~B*=O8K_#W24~%_DK5vXuYD<(E_FaB7v^qjs7!&lxTpEkX#X z2|qt!XoGmwgXFIulU&*CU9Y{-2haYQfCeJuRMTTV-gE}wlg5YHbgE3H#y>J!+uYWl zHtr>N{JK0JsR4+wGi-(sYKxk%#ja!hJqxPs&xqWO5y8A8Uzd((Oh;#yE{*)VEA=!Jw8Z0FAz(L2uwo1JFn{TE0>g=!WyhUJg&Q at 5Y?d0Qv1KTrg?2k}=uhssEq)Y%z zlWRxm-^HucT!^mKS{3dI4{U#gF!1-n$y@)W0;q6E)hMzrCe^dGa`#}4FQ-XJDU)aN z5tgc!yafbu;wiz5z=Nf)Nlm|aYW9rRe=DInFTVRNg8%`ELI43V{I`Zn%FfQs)yUY^ z?7yruOi{H{SQ13a-QhjKcOZ!h_aw4<)l5bX^anqo;_X{Xc%TqIqWXe?t*nF5tBZSv%tX~%S z8Uvt at d~Nf`PXUqb)L at g`XQ&SP0t>fVZ{s+g{dA*=C+2ppG`*!cD&do$UgRv}^a*0A zHNsB$SDkK4_q{0SRXfBoc^Y^&lYP`7pXe`mm9sDlt)Q%2Tn z!aZV$q)>#e-r?gJJu`x4At8(q(~bu4mjn&sgH#bY+B&8u^1Db8?k7xa7j6I*wsZBk z%MC6W0?tK&UG#=#&0K-6+M|V_L$MoGEvKnLSfV0y2+9hR+NNlSr7m at Z$N_b=WGKzq zzNRy8o`Ih$$FOW9{in#_uzH{0!ZBk+nyOMty{?IhKI4T6nYh;?{1=Cxb>y|KY>T1x zr4TzQzWSPe6iTbg8r}r~)~vuS`Rd)AN?^(!*zc;g0d%ZDNc7VnXYdNekt|=|LpzL+ z+>`h0Yg^ByH1 at QY%_Y<@h<7gs)Scaj=rB%FIeOm$@4*nBo;MPKE)>%OgF5jKkX%ww z^v6odPy03){<&!XyvL6_T42vLnKl=sY6UD*m`ApFK^u7j;Sz2)sC7oHi2*ab4h%Yxr6)G$88~sN_|3Cr(G5xm$`Hxi^|G4&lp@@vfrYh36J)KTup at 3sn2*;9~j3oYM zEDqD$N=-ks6|__0La{(or;Ws at QUZCAgk{SoNXrqT>msCeDy{Vi1SPwjx6u z_Pcjqlq_L?VtpMJ9F`Vr7PUc^E*ue>-YwHVD_5X70M)^|NBrK+g&e;fmhmLJH9LEb zb`vOGXX%{+0828CU1z16ZKugOPPyJDiBYEa=Hfa1s*C65=5aUtq)QwvT;pJQoKNjy z%8x|u`M0`RuU5HIkF3N?%cDtHr({7!rM~re0|#quPRB7K}j at R zl56R>+%ISL(8*XmnYTN>$nr%AK&b745shpXC9?Y1>F(=n>jEOl4&T{UzM at J__*J5Y8|QEjHwBOL zR5PC~R at -QrDM)An8$Ney-X5!{vj};Fb|0*3Ncu?%(2vYq(s at h4a*G?UI3qW4NMvv7 zeId7tW6y(WFax`-l(kJm=w$v)kBxUb5xRw`)0V1;$t45Pff6^g1*WC1<&Y;_CV;g^ z&(q44eLP)%coZwwq at x+oW6#lhckY$vd%wMcN01I~{HC`86^lF84B2D;KECds`pSKV z9 at Y9lSel(tNH~`wxSF>xuY6vbYoqvxUh-r=bixB35kPMMH(aU2xEU97NDMJ&Ztbuh ze-vfILO+Ab4|HXA*B189#n}q*-6x~Ls$y$O!mDM*H at CiazJVdeBlA3>N=f*L=n9;b zTVjl9$1UC^rLuDRUk?gL{Q%BS6#&V6?H(s=9s3P;24Ea$rD^N)Jv;5>87fV$65^Vy6TU z9DjU%TjAu>2tGTJ_%y_;fY6@#Wq&)FRy}cIP;<6OwwJY_!QVjuFdKrblK~jxDE!iO zgL#GN8Q%XU_X*>xw5OqgfR6BhfSCV#qu}gpi~`r|_b~m^ebfEJ+w;-`xGN>_LK8&IUAT(_ zV(U^F>kR4A8J!1`HZ=#|VNGJaf#37<3;=ood^`IBAtoPS#lc<#^9W$|+47MwBBmXH zg-tROQcgO-#6xjcABYUx0)PmHB|@^H_n3Xz0^cEm8>9js`62n2iH?BT12U+!ILG z?k`nxB^^~wCY0~$R%Mbp)SEGGI^}F$E#fOkOYbP20XPE|30`mdl!<$vK)cjgC^8V> z4Pj!qN%D3B4c^r|+Pq3O!>r6n5X&V=8LCUxONuyhTG<70?+}Fa^QLs-m?1jK)GlS) z^1S#NSazI{Wkqf5>yxoA8&@IC%&0f@%6b&dHtFkDFXXb6N&9QM-9}~~_AYa9qf?>= zo+`8UQ98?4tgC$NK$V>wRp;mW%d$jrPYGkH{TeNlMUQP#y{L_lTUgLs2UCjTrGb7? zP|kB6D++bY(Vi90DZ}0MVdO~(vkwV32?f8AYuV(Df6kHMVZ1Q5*}!|{2g_>n3G0*JBPpRKSeQ36lw$7dF8JNbsij!wq z| z at o3F>#?e+QzR2SD%I{LR8nk;j&3IF at ByliSJEzu;=jAytoRc!*caY(tM~oxL?unOV>t at auZDd3ucSRUT;YcT4Y9Qm|RY%O5Ua6^sVuA*^UrT^HkM*D&!A>uhM8EA!oY$kG-?o_bSS@&gJ8&%p5?kusCj!3FO17ASx3JI#WMq?U|A1=~$fKJ| zh@}}RXYk$Mtio&uGhVkH~)BF;{^aomc_q6})EQP6m{7 zKNiA2)ZpSZ_V?~S18DEyO~!@4m5m{0%lT{Y?_V%WzW`GB0UWoOpK7DKaG!bX-9mL;&<-4qjS)N% zI`DXj_^r_Gdc|ABhw{JQl)GXu6UvVUBP2BKNwXTn^hB;KOPWWfTr)Keo5y7fIm7=p z_{)|jop)OXHJTyZs%lVHb?e`@tjh;vd1SbLSgHAuy at 2`nPF0YH8v9H&q3>ijc;)gRr<~t)GLgS%YorhL(zlMLmB$exU!=u3xSxy>yNPhi z*x@{hT at +g%t}~#*j at TXYO%OcOb8CR=T|>jX$znIN?9O-_MU3SPJFBwMKqP`z%w!i4 zx5K1^TJEnN!KgQos2+H=g*c?$+d<^cx^yac*Y5jJ=T*K{jhI;;S4=*DG^@`vV|?o; zi_=;&quR`k3^(gm9I1Ry$ct<;$6${xjb0w*3L5gSPzxb9+jO^9Vh>vz2)e7S!WEsS z at 8fK@;^RtI>M}H;QY?*uUrt;qvT%B{Y+B}DW>d2S4^jz~*b<;)tC7H`L1)!v%wnEQ z+X5ERx5o)9IWqu^yCgLpIrovpK1>P$NU5rjnD-OTyygE$H zI~N9z_s*~mvn0z9Rn7ncSnl87bH|(|}t;>U= zydzCxfBBI8#Mc20d$mfnhTHOFm6lm>8%@+R}nYE5Vue(f=Ojkn7jZ?90M&t}>)dC5E@ zdn5!<%`(Kj*bzF(lty2R8#p~JqK_g16FR~FbJmg)I`yALb#iYaI}eA(DX8H6TK!aZ zTtB=Rm#oCg3i^z?=g*ofRRJ2|%?ckWXNgs?NNKmjBL|eKj9-0+e(k$3UV6OB*z84_hd-(&0T#>Vgt- z5LpP8K>rXS&7?U8-*KXfQ0^v(fbAUyYaUrgQt#@IF%$76RV!7eOqGFNZJTK(&c3BC z3kq-2WNNcn;wD^0x=n at onEAC~)S^$UMn+%XL{XWNh(Bp%Z)~LlVg-CW@&p3GT9kll>Fw;a7Njr4T9volaW<#i(XcE)*NUi=x8?ZimmsS3P2ZSQ4y(jnPyDNhRvb zk%Pvs>=Iao)TR9Og6Z7a)nfvTOyt at zlx8NN$Ei_GZFfBqX^l0g$%o8_X3)@?b at go= z$hbN`y2#PHJ?rDT>sp1fz4AuMi~Om_;Oyl|d+at^=7YM)Rt5{ar6HoTsGqZ at WBxaa zat9k-6-yC75L3YfaX=&ca0ERiUAJ`QAQI%tIXuAOuKst7?c1b?2oR4sC*Eetx81Ko zP#w}j`G#NY&;~t7RMT*g9ZsyP#t3vhz_gJ-p#VpO0*IHG^?MB61HP_9h!_O?Dx?f) z`Q?RBumm0=a@!nAc9j_8Z4?x8L$OD^6VJ9i{Mjj$cZimL2mu5*3fNWRmlMMzM#>^K~hEgOtf>jJ1MGqufTw{(eCYqq7 zR5{59bMZ_`@k7vZ)Fqx2xYuNIzUd|D9Rk*~%<`~RV7jG$xE`SY=H!~X#VG^OId{U* zf&j4l{>vUz_J4SH=wOie7X%2%68wMS-G3x%WUcIN%uJ+%aKi;tS`ni&X=AnXeDR2&;A1YCEk1Hf+-{}^nBS!gnrH!@1XS6tv2+EQxk^k)6 z%s_fA3F1r50jn&k8-}cOw(eZyo%G{K`+2dwONt>M+bx;JP_8G(Q?m8IgjwSWD*6PJ-NoyVzLL!soVL~lU#yx1td$*w{s3A|fX!@rPzksXY}CZE{Z at P$s}%hw!D#Sbf|?-0&2qBJ}M5 z^BGHdfp}O`mlzOCU^$f_wxl%Z><}`81R6m#;O-Sl(;m{&?%-6v-NWS!G7S^~aqYD| z)+H1rx_2k|A~wPPo&x`7r5zr at XL|1*VITj9I8ye%mRb{d`AKBy-?y)Aye`Q=aK_o0 zqfY$w)G5Fyke-spm}P~M?0-#~?kO#gaGMsYN1 at 31sa4G=9Z8WHf~6Wbe;fQO at Cg7L z^ltwE-x>UWTBs-dkC$;U{m*$(%4RPA_#CqTdP~*I(d<7Q(1*i$CzT0^%vKo+g&7RPLkv2!(>0-#q~nj~5Gq7@ zhk7}CMJ$HMV{@m;m3G**R?Xt;Yrm;tMVyKIWXsM)27g$hc^iK7RfpZC>Y2l++t_-G zm8W(2N$iS4W_Qok-x>Q1lk|xWbmuS&Ra7cw}bHAX#6o|ug%7z|Fv;2N*c3N&N;4PrdoK7~D6v!$_CltT228YhVu!F*`c*s~2W at 6w>OnlYpZ zh5es~F8p7C{r}*&S^dI!Qxxrc#eH8UWr+Dt3w82B at vwSkl;asWvlJe$9Gv)7F$L>a zKT|^&*XD$>L at KNognr;?AVLNU)8K7Z__?F|-;VlOB_(wyx^i+><(7XNwk at aqSn zE~GZGEkPWDlhv?|T%z^Jh8q-~)@lL$=wcF1y*_oQBRe^9&2Y^BfPENopalfb{`57P zEmYaT at G=>PTN||3**1G_`D7YuChAd*m1#W;aU?;MziniIq3>mg^b# z)5EA;gYN3b!>rFK<>Fs at 0Z};ZAtu3wr|+!Cs8|Q)T<|>SZTw}b$^X~L9eZx*F3tsN?Ucq1lr)Yl<`~Yz?bFWZ8nAQ;$hd3W{uz2$6cYLSlz_! z11`+q8EtnR?ag#pTm0WtO*bjFANYU>+5G2`c@;@*Wb?$gX^l=?QM z2+zen5)Nah?daM&GnLQPC>yL#HFMz$&IDH_0H(&eY;4|~tGmbuMhpIiIBO_1%uW at 1 zMFCeEo|Q|68V?TZ>CW10u}b3tu}spPgR`f4g+|Tg;^W?Zd~2gvUZz92+B6lB_P|R^ zwv*2nT$ur!Y0s361B`Z_-%UN}3 z*lQqBV6KTG`?sTuMUH2hhq6$5YN^kr8UF at 7JX`6=88Hm>!BJ at OO^O7>&}DR~whK=g&k z0?GBD6Tbk*3}K)6MPKZMo1|ItSxpt??Fl1L(kB#Kf+ofdVp%{#00YTiN0G1FTn0i~DmbHCQmn^Dtk_2{qDM>2uh9JO0?Y z at w$2WI6nI6enkni|I`?U6jrGDcnPSs3V+< zc^~wLR at gjL7u{KIOpKTj#!Gz6jd&O1{vY&1zt#M?fv#8k=!qhvvRvnGs|>L9d_491 zxn0{EoBs-ij6;AYP|X)bufmfobxzG~7Fn%WEG!c*?%^*?@hpGk*Bug z{iC2|z7SDjK9$X#!St?D-t>S7|(t?RAWJT7mO}Bab-Z#Um at b+w$@;$W$AP>kFgE!9=K!>&~W at xq{HTnI^hy zhY2_??Qe7RT95Ue0Z7nU;@%3(92}gw at l>$%%%t<{V)Qe$v=N%T*1mwZQwwb&Ow`NKds`6?@*wiY7bu!#A?6#77up6 at rtLqyBQbu3--33YivZ8R#%FgG+<-L2W zeoFRlD3kI9onajmbmis`>F{8dyq1W-sAq3c_?h?PxRJ%=P{OWYh at 6{ypSANFYg;wp zAE=wh$_mG0&-54X)!ff1O^!*YywFW$E&JQr9%_+hm+e>`KHAsZ%NptH| z1HDOz=5=Te%r#~k(%ClB(CLJksQld_cj$A%6G4+HrQ4Q0f;dZ4$$fD;F||+kX}v+K z$iS5~uTp8Dg;L34RY;Pm?HWyGE(u6vuO6j)?=OuF6~FB4V^ER*P2o_xNu!KrtM&fO zyw~kxIb%1%M=zgHnLMC5yUmByF at aMZW^{>sZ%zzZrp-)hD-eD(ilZMK5tV28O6^~= ze}bbw!l?SGJcu1r{+bd7%T*0<>XI9-W&eceRlDPb at 5Q|RwHHtGT at 09gjgIQIe$A5o z)?54e9bo;Mmj8qMGtU%i1wWcF_eWS;1Om}&tbgIpXnGhnc21uZe5vWppr`0yk*DmS zR=*FP!>XhF^FJgH5#*;n#P^gQq#8K|m<`MKPrH0Echt^>qPwCc850$pICs5YNuQ`V zAF^Zo7`wftL*QZ#$e(kQHvF<- zdO9faG0?}(;xHclXjFM4V(A9 z%_;Q$Z1ir;o9Q at 2T8ZsbUn`nAb=i7Ur_sqWb1#R)GhnBoWPnt6ZB^DhTi9|;BMfjO zN6{hL?UX<+9?H4}A}wX*N at _VofSgRBE6Qm(FePKq1R}_?a|NJ!!oI*dZ?QLLU{s%@ywY02dFY8P`d$za z`z1%jGxu5Wt*~QO*^CI`IakxdKN)>nbGw-O3w5U;y|6~bv0%QTDdCpMHom@^zh`z- z^;qC{_i}a}!PrB4IBhAb+ViU}xNLb4IBRm;RoMcR*2792apRqp*e>%i(6$A|2=hVY zK3A`NEde`HLlIhV(-0b77W6aCgDry^b8sd-#E2ZvlLa>=4|NyIf^9Y!wchsnO&$C@ zuxQCJeM9vqH{f{S5mQ+q(R at N=Qugdy&0ZKbp9MLe8nAN}u=GV_5Ow1nHeY2za^>fpqA=n%HWSvMchuR~t9SOaEWA-qJI9W7ujN-(dV zC)Eb-P=^>TIMjC(j%PC8xCa&Bb~k+8*uPBcH~3m57dsA8Y_(4?k)2OysSlxlMs~ao zV!xyU4&^xGrsBo&bm25~MlpRig*Dt9c|Du8)-Y-eUDQHH at p*|jvpn|oo*%ZK0b7!} zFSl3S;kN=^d51s$DuN8A9ihy at fPmZ){- at S{F*`?Bum9}bQ*m&1H8cG`qR7SUKO-bN z4O9sdUFb6TI{uYW`omJ=1 at 5?_RDYBVVfU+F*3&x5v>vUxX4}XY4h}m_A2eLT^8q^1C%b? zORD~PvjzQT%i0C`0OC)ovnu_)fTyiVNp}agN}?ByE+mI|ThzK0Mgi@$hx5 zO&g;p)U=p2ANtyT=`h%YpO&+0v)okuL^pTe6rlqSkG2iwrHZlL$5*-#b2PwnROq at 0xLuSJq z6T^I#=<`4h?#pW@=KRyxmmH-#zmJHIq_wtdZQ=ZIYh8}^0zZgh%#6yzMjR_?m8DT& zVhWN=Mn|0+Q(?o{Lj8)9?R{!5Y7kS!h(c|~seVz7LW&BGGlDM at _Zx(tbyXs~k)Cdn z*z8ZoSes+7xV(K-$H10q2r+u2 at 9xtIr!3;;SRdPo+3cZWL4 at 4~hslA8*CdG#VoCNO!a;D0d}cXo at yrJY9Q-cDphspw<9x51EK)?`0= z$Lbu;ynUj-fc7liM&VrrA}<4_R2Fbbh#6HaSC~TZH3D2Fi-IsyoCY^eR%$PDRfn?x z(e4g0EjJM_wDRS13cIxD9;x5SqLPMz-kp!KbFA#lZ6sP*OYO>lDa$bvRSnYI2RT-l z?kKO=WATnY+0mh{I9%joQk?QK6#ibq!EF0EQl(YW-&ttDHo*eo0dm})(LAmduZbHJ ztvXcKu175}4t&lY+ym!Xp3y_Rk9e5IHNf??;Ptgq5zy9 at nqulJ5do&|0d^->D56{Fu-(DTeQcBPzO5Pd|wNYQKItt%+lT0|CvW0|EW||JHW= zucnJk*v-n;^gsTeXx7m2KvhHgmbYY)!UDD`SFYHifsZ6d0}EY(8Bzy1n^sqh-gjk5 z{w-A^PYJa%7f at _tHF@8E)EF;Nar2J)IDE8|amL1MVVz!rxPCGvaN at h$lRY^z`}28A z8mQ!(G6KIPTSRzMa!0VEQI|ddyk$HMNhe_Hlr=0t$A%%pC#FyYLMqqIOP8v(WoFdS zHo7kWD@sVw3MSd$lj~9446Z!?ClR%S9Y96IBiyM+1`* zR%v-8bEA330SF|kb5jy0n0J(WX#R8RbSAT2Ed%yUP>X4TdBFM#`$gDs`sWp`&sOJg zMWFLvdu{aKOI4ZXOaL0ao!fH$Z{dvWF~-g32D8I*oo1UQ&D4UK40EaDI z%5alqIP7U68xV3$rh$E;VVQQfwrv?Clu^%7?VA-XMezuS*(lXV9H z&6|%U3J}yxL`v~TzQOk6m$wp~dpEid+%|oj_L=r=>oC}D>xK3%DjXZ&oCh+W^o|Uu zz%eTZF%9;?e7o!W6df1yjU?j|mw+?5F{lqM5HI?BrL-Wi?$_d(IGE(Z9vGCq`I!cd zN3;?>TB=t~LmF=w&VtOT^r+ll)cV}c5Puz4i^O%KICwdn>hT@;q#-yFjJ$VhcsrP_ zoPV=mIU6f5mx4$P)99jyD{9;d4pVwcwq{llDBa=ZYB0w%L?P>{IE4)}Nz*Xw(L_t3 z$KRF*&8qswF{auOywr$(CZQHhOblJAqUFPkjeeU|lxqF{D>wd@?k&zJ at neqOfF~=Np z0EldGm4;okUnH*T1|xF{)KER7OC&U_fIM#~gXRS6ce^}}WnNox4c4p1*xa?|h_P9D zul!?IsIT9KYuV+;S6;lWxddn;F~Ta9LMSIggl%%!3|-iat_QP|*q*ESS*LPMyhlgb z8XpjmT#JQ$@|WP_q8>|S?dzGmSA4G_20#8Iyg~dMUHoVvtEi10>obTUE`zPxXK?N< z;&xQ5$VQC%(g(ziG|?0O31g0chf_;MPPa_7$h at yX%B*bda3wjv z=*SOl!HyB_4EZyDQFNq at S!DJ|maUl!lS`)>Q6bvhVOZm1M{i=JtNgCl? zp78;QQ1=tBp56C0|FbOn-?LoIr%)M5w=v-njUE<6htOb*0gbL=M;|hdZeK at x7;@uI zzKo(prvZ)r`3c~oX5ErBW+Fd*!`MHU$lOhnSO$z5pkYOqvrd`dTFleOg#4U#O$77u z5k<{tbCG9j4QBoHN9bhg?^)N{!KLgUc;D6Xb<^6-4p$P*<2+PM+*aM3r`bc zQ9DPQe-?(S+BjjUp!nYC=mT3PF_*R!M9?v){-7g{sj$gcCyqfnIwdN z+16vTJDZ5sL_IXiG(F~I!mrSF(?yB+tieF5Ih|C4M6&fTQnSFMQ&g#aVht^b&T188 zNPeeYxM8^*!c3_yofvasQ)PQ=0axf3Zb2TSBi>@?hHgu?2_%`-#m~}ww<1}O zQe^n-Me~j(nLR49k8kmFteje( z$i9HoV5akV^`@cRZFtUjx2}kpJgguU?wsp-eQZIkzV*gSG}|^DC{|xDW;8L!4q>~tV8kKfG at a4j-9@amrMJ^Bq#-m+m4lnKjYiu zzN6weEGh{CWl*14q79`Iov`rsd{FVt-NPA&?xFyhv&W{eX!WIs!d}Ej#;|w?%CMZN zE6eGH@x#qXc^@gp;LbC)SCc75O zhINHPp|_))mwqIXCl{}*sOGu6wm%PR<@ zM?{b}2-7E^^)%+^&&hDIJBG;#VF<=;8b7+A2K9b(%anF^p`I=|MxChKOb|?$9B_8`4prG ziJOtQsP*A9&h!bq$gi5hmkb!FWa8_ELq)U64Ju%Mk~gGETq%$mbV$3NNU0MHd1p^k zmeq at qcqvP$)9fn;AK=mKsq)-JwG6=d^+)Bid-KxNZxn$AX(9+{qPlv4wEzgthd%A} z-aOS_V|T5tbsk8Dr`nHSTWDNA!&L#Y9Kllyk)Juhzb?tM=MzjztX2Fhe=P4U z5Wn^p(`pS2rXnPNdd%{CZ>zh#yl{C~^Flmv>-gA7CFt`TFKUsWzkHsbI-J)oKnq*N zhGRhG`QjJH*2aGd-V&e at zTjj^lN6A3g+xXuC1tJYSgn1|!I*op49IWYASSfJ`&soW z$fFtFL26^k(@BHr?hmrT9=9MsbGGou9o&^477QNIXb-uZy1x}xSKp0awpUku2dAJU zb?)%l2(5SHhkj`Eg~-~tl9KV=Wv|adq0vf!l at 2yH^En8Zj`gre+b!|Trj$XmJgFw( z%{62kHfjjP=l~uK?IpN;6)fd&!$X2QMs z>~^IAR@PdO%&(}Pw^>f-ZW*#Dp;};Hr4fXI8Qbl1+S+A8c4>s^y zXcKLSZ4a~vw1f(Y{L0F>M%e-SJYs{rTOyCRNEV>1s2`cklg zR9-?ssf`>WFx}kg#S99ppr|NVbS`gZbKVp*?kY75JD1-H#-|8+;-^9+OCvTBxhW at s4HkBfGQIbqve@M}ccR7OIotA|hTsVwXfS*G?>aNl@ z&FC;S7^p-FRO5zH=4n}j=AM>FOAeAgLXBOO7804mEV2 at 7=*n)RTL;V}NfLWMOr`jt z6FnfDm^yya*LpK{nlb3SCAR}*Vl7;iUY1f8S;n-(GP2R)PKit%oxvvIrNA*9o|Y(Y zp8kFV-{yLZLR at SeNokO0WomR!=X7od9zd84l%X&XJI-8z=@i3J8K&=22CTSRP+qh= zsldnOr=VAT9qJWuEl562#?uGSX_N9BJ{r__|6#emZ%yMZhD+r2@!srT8?yZ#6Ii+z z at ubfV!L(Q?R5>&>BV!`-;|CbUcUvV7xsSn_WlZ(|5-m-{*3YtcZ zp^&@bG@)rVYi%15U`+4rI$s)(CgRNppCmY>`HWHAtC=RID5PxcW3>fKTWbfmw_cLg zEGy|M8QjIRQN9rDty$NlK#f`2rj at YZ=ooIt7(QHkGaMV2qO?pPbJ%>z#0KtD$d>NU z{mo0b&I+}z*;Dum>vt^a?q$^?T+NjmXbx{$v=4$dhsUHgwZ~w{R>L%`ho5lEFy@(c zq{X0+9Vh;1iut&z6!kc&;_j(|i}sztEKs>IOvKeH`Oufd*%f=#*)#?{fw1O9{c_B+ z#Ma97kXfi0p;U;ZBH)!g2=egtO0ht0`#6wVDA`dpP}Va1&-SIY1)S*u)?hv^1 z`#IG^>Zv*0ov|~s0lQ9eaB+uu_2SW_dlp9xTJMYG8*kk#hN|=XE!>p at itfk<6RVZT z2RkyRM!)=L-0O^Te~{q>9Zn-(BC5tZh?c?l=eBDlbk6I5FXgW^Qsj4h969kypsv#X zbeRY9GZ#wNDVddwk4CP=X)%KnSvW3pM zLJz~~%ZYTYC1l+=?p86FAoF^TtxaBUs8Wrgwq$Lo4p`K?3g-4VX-B1{oGVkR0F2a4 ze(wIPFvZss4`fNB at ME*?n6;~P*~`Lw%W#CKK~QU+;Ml>U9z`K5XUP!(jd9$ESXAPR zeE!S)Q?LsBYcKbFa~VP7Rq=ZGT`x}aIa0TjgEMRf&!;RT1G{C1s~CzveUXPv z3ti>OMNAP-j*+^u^HUN%FtX?u*{x2pZU|)1J!Obw6tPNvzD`KGYUkb7p~ZVFGIyDy z9t{g{l*bn^MV~o^eM%2*kzcYGcJ?YRwZPezL&Gd_J1xV at nf_LN$`%rWFQhqlKtkFG zwWz^Xp!=G#=_%UEjb}?miLwOeDF0j%nWHg^Yy8m7LlM`+Goi|N6f*oeiT%b1&rwjG z(xk}vH7skIQ-{Yw>Z^7&GsH$wZEBlUPny^`3Kp=8EJI{};nffJ&_lv4cK5}ZzJ7L| zZ^FnMbPA>4Ae3?ipTpU5Qe77-=IUYv>Kw^ZnZUALfkn`x4Tvy{Rd+^pp4E%_N}BN!TIoAzgF8~lE7 at r3o4)g|{KX+rF4JygL)5Wj-Vw~* zIAIOM!zy4o8|Rz{kiTEG2~ZF(QVS8=BS+K zsFDI@!@+%W_;OVz1o7(jzrgPmPDzWoI7lh5On1Ph6Wf-9MsaXpgpb%>U8LLArv!Phn zak1{K)1#R5304M>vMG>UFh#yynzc{Q67cUYB-?eLErBtefVale63xG5=XYt}ZqYyO zkfJ69w%5d+w?|`gW}+*khcI}Y6fCLxO|gnO{%%>KCQGqb%VCb-E9&`h#Ahc;S{xC<5V^ya4r}@JXm^m6=D$CdMgPz|v at dd2;zM zgnG1&<TvXVw-riZ?f>hYT}Z&<+-b6v#nOJ0WCN&k~w*k4NDZW}e=~XY*6C z$YDnbhRn05BF&r47CL0mf%>+(=*+Xe=yw5|I`^}rA z1|>?up!&P{Zu0c({r4Sct!JuiydtWSOcrHktajfyjHH>O&{Gs~m)iJ>}#zw~&j&)3n(Wb$An*nN~E=$<4YHL-hYSO|#T@(>{uA!NK!GYu=h_eV4-ayXuE6w)EaJ{dHQ#@;wi zSW52UKH1Q!$O}cc8pyjj67b=nuQXU~kR35bvQr~&a?9OEdkh0fxZNPM_O>=&Z*x#G zUI;8CKZc!eE&kY-eG(517TuC^YA(#V$+&XYPEM8gyM;3y#bd$DdEw020k~{sSlCJk< zug}0xuuydOvncwsHKZjuCT7O;ny2S+?`mA?t~C>0)lk#j5a?fZv>QV)P?DqF;k zQ3tFv%g1}jsLhXgIy!K+4Bh at xNJxX8U%r9^A~o%v!{xm6D45FpF&{0DRPQdEiW;*D zB0}5XLF1HKvi~EmQDo0zjpiICaP3MlK~i~TE$JX|xD2`kNn9-*SUNZ0aqeprk`&8i zO3dhrQS^tBMi<+womJv4yU-!KkxGwy)9;&TS1dDn*}X>#upW<(CHlA+Cmw-48Q9t$ z%c8n_J1Ba$0Xpl}>|IusfMfH+a%Pi3k8_%qtC)tWydLt(899#5N zG%K9ZQs0`O_;@OGc`#bgdk*FLn)AyzI!J4x_!Smx_$Jdfb1*mo1C5bsjuLceF%DHC zl~`T72fDFn8vObzhio7L`f1)ZJ_!A at T&~Rr5sSbt)cVX}Gy|;^ zjsQngV7^uUE>A)TbvCAe*+UTd+w)F409XFB!DjY8FW2L-srY-F>;T_((Gjo?AhejT zQ|@p1*tO~zRbaC4+D-Oo^ir|=YbhkwlbU;+51h#jxd^SUwb-<^S!k=Aramg|sxY;- zO<=fBnQ;4PqQm+$r-EV~2q#w`pR`|_Xno-teyCq+V19WThX-c!0HVA?5*?Ej!_`m* zDLRX|X{BAMrO)ZG%JagoGKfv3k)&v_hDU5mDVJ0gOqW9HcB`1K=QxedzN6Mks5zMh zOtvda#YrNF(LkXGzs46)vxtP)7ixXh3O<1?`^+r9BQ$CwpW;HFOqxn%uc@&H#+CV? z6o#$c@|O?CgrRW at w#Asc#?~6X&0t2YyyN=VcMjPvoO{O{jvRZ(kl|?imboC|qn`+z z4Y7x>K;1#m3m*Sk163Qahy?@ykO=|+!2jRs`yaCYTiu}(v6P92yrYSeiLJAsiMfHR zg`MNS1}o<%>DVpOqwwf<`dWvi4veY=0OD?@|3C=l2n$O)+|@+n7~=w(|y#mlqO`~Ld<8{HqPHBH}uC#;KO%WQnb=ll|E zXd~5YSgsw{e!Y#0^TA}-!VaI&IJ1%rL$a1`B+Pvcbsz8+3`N5sWh_Vt at 9l&S*7Tu2 z4x?Y*T8d)Ow7*DPzWB!T?^7qi2T9$^i8Fp6CB#6c?mDgfXv(}N!Wyv*kucb%$6F~ z^F}39I7TK_!h}Z^eDHB8_$fAAl`v{-&gF5G%-{DVRZefUeVyeWGf&?b&qgwFEx9cm z3y$4N)gH#DKV8;rTcpISn_$u_LwiXo_%Xh)Q)ran(^>SprgR%>C-v3pVqv^swr9SBiU^ z0~y845zQh!M$njUZnsx?FNJ;(_2g^czjJ52HywQOhr0*R|BySzf6cJhQCj3j;gL!r zZAL|a^es>Yq)1leuNJ4GUttub+)Lh{02gdZ)z74th&*`F^1cf}*YkF~8^F*1mgvE@ zDihB!Feme}ySd5rx>@gf{rY{$2EgQwB7|b(P)tu78o|Dht{krrZxW71JqCq_38r++ zbJ#z=5vnw$3N-6z>EYuYB|zCpYIa7W1*d1VR}w8O|P)y)>9Sa0!9DUGj5$rAlnd%dloyfi=>`pO;mqnJzsN+or~D6+glU-n8On|(^iB0qMRrzvP!dv zVvX5TPbpNrG5CXo(}+n}_qUM3Qw6bdtIQsZ&vz-&nVRhoLsqxRrq2*X$ky8KsX-+& z65h>sibFY3n4oD>vL1@`crGzzBkID>^P5N&r|A5B#0AfSX8X*0Lo>iENb at ro+)DJS zcG$W}HEMz8y6dabVZ4jvM5Pv;JghSgcvl at JK+q#@Y z{*;+KH@=+1^ZY=dA;q#N`_Yq}i74zvCq=FcxLr>%O%X-GUhxzZ?5jc&tPQqG*SQM3hmK-`cgSxNQv}bw&JaC}1&lRH)=*0G zoRJqP6qP^!Qt_m-)=InhM at LKlsg9WbrK4RrWC4V)*6T+}tpY;u$QR^zL5kzBTz+U) zLedx&X~{bg*wwBU99_GtOH`73x%&xpUGMvey&ymTi0?#BuO+Zz(qPgqCN{3$KiQg^ zKJPC#-2j}_BZUTXKuF_d^^ue)87UiK<^!)cz9@(EJG-r}FgeETtvVua*KKL^GPexF zt0AM99#U-5_^g(zwlCaBbq4tqZPu>(spT-tB}Tb#{`2vp(pc~p zu|h^oyaoQV@>QnQ3r$=+E7avw8D^cUojwtbd)6?|8O+pa9ysbVCfY2voSOSaxnaV-KpUI=Xh+V} z)YyVoqm8o?i)>dat&A&nR)B3%7 zcFEGfOm2iKM4u2ELe1{HR1bqqwFb+rr?`Y5>VWuplvnzRM5CeAFw_^KVWFU1^gGL at 4p946f9p(td{Ika)i#M0%iIWq%wy>u zx;gZm7zrUF!3K*d&NH4ULiy at 1d1QoZ$(Ln+-d+89(fl6^=AYh8OpE~3AU%SJUo%z> zs22!&B$v?a52(O{Lb7m+a2g9BnFo7XZvQZ(vUZ1a7$!g7>28l6d^rG6M!1;-#^RDb z7s*?zD$HLCZVGB+oWu1NM>>qtZn7HqmS(b?x;`TeM(R|%P=`GYnsaNOVum%U3Lglm zpuiZ7K~9~UnwWub4 at IX?R5^&JQbJ at fRekoaf%?GSM&gi;kfOzqqf2GV6xa1T$4P(r z#|zu7mePMr1n7TiBAEZ>;%z%F$Rm8oN=(TSl`N~)l&e&H7BH`zhbUoG6VA|&wh~F( zu>=zphh}Hy#diD49meRMMWgfj!ymVk35PRfHkmzd+Rfg4{oTpqF{hY5 at I`{c z6Q at BR^Tff1aUz*&_+T8GEcG?j#>li`x2d`5N?oK~X_duHjx=`&1>JUhQJAxFY%^fC zX{0_MWWG`wYB};VR{n at RX7CrN;ed0aYTft9rY6}&(W#*k-aNso(Akf#x3PWG)M at 9n zJ5N3J>QL);J8+ES`f}P~przhFd5VJhZ47PQchdYq1{5_8)@x#gI?uzVJ%n!SP#%1E zf+>I=_IJx*B%Tq3KOqp;HV3R$GdT6+B6K9T0N#<*GN4#%(sC~`3msaLeI zAy=LWUw>~X-o#wk6AFGpVI9^5@U+SI zN>bFcT8h+2UW1od#gLXFSPN$&G}v?&*O?mB)w^`Gt?OV(c;8Lv9Y*n*9|ZCBGFk7S#~DhJHTc8oD2D)g=m*LlR!zj2!3mUK+{r`dympjS zV)YeMSPdA8zs1PT+#0E-{Yk4RU#Qxax?bFrG8#OhUOh|X75}hGQpSklG~l4!ra5 at m z2}gj7PW4_yEp>QHF3z8KKlcf}V6tlQOGpY)2EN5iZDfvKS$Hv(_UAbEO-o6JFvzCF zQGL=d&;rc+A66r|hkpNqRdQEM-ROU?n$K$RRqt83x|^G=`Y@@G6PfKxaQ#HR#3W<~qOdW5VIen;M~JyOW3mQcU)L+P^;{q_B1U|c_3(&s5+AssdqLBc(l{1p61iYcKSMX0Y2kQi3&Zoa5 z$2IzYv19`S09--<0Py|?u>LD4?%Qrd72%t^cb!3YNPMN#qLT*FhCo9~JgEjMIkdRG zfpMH(=G0~32qCVM at d=FdqWBa2T}(B8lzFLw?=~*eb+(nWF`oiT)HBbmw`+F0$Lltu z at 9XPO4gk}eiXeK7i5Z0?`7XnM6KE1C^&S*I7ot48okHLtx)((rwSiFJ=_u1*2(b#u zF!v+HzcZW#5<0gU!aQ7DT>asw3 at 8?(Fr at Nr+n}c$r3yCm1^KgVD0XL=#!SzzAP37e zOn_D^b%%q##a8W>@k%w*m2124I<=zAVxyG?XmKe^Ro0CQcXYIjvGLYH+OQ3#o)GFC>`>5DXmUfqDJ=!={Zt|`c~RDjIaVkQ zCe(hvhLAd}JIWDQ`MQ_~|{kL}ykd;u at r1Vi!br z*nxJ4Z>S$zwOy&&Z4yt|FKcbP0{uSNIb!agZo)f+)3`upI5!LAUZ(9~%~fSFQbv=X ziD2j85SQ3fLJ)P|V>hg!TVxjGv{Vj-S%P%el;U$2!;dThBK|aE$EK6hAg`w~1YD?nyt0*dGhoOx8dyids z)CzCi7aEclkhA4Ze2R*EMf{+kpDyJ3yCcBf;_XtP!S@`z`F at D-5QxYXD4tKknkw){ zytFUvXZw8ru6vj9?t(Hv000)?|EUn+FS-{n{ND!56lLs|=n;Huhe$VRowX)`Hi6Oz zH7OBW(Rme91Su4S$-_i?ypX9Jj$25^wC4R3BKihGkdgi#Gh={@QU(lDp;`a^!9B}l zG#i(<+Y5}bw*z!C5ADD-Y!kXtyR>l4 at W9%H>^o^R;(`gElhP@@P-7Ij*N+ltK#`=0 zBQr{5z;~BGXiCDwp*FT9*_W3XP-XlRAXK)pr5-$TwdDutgdv;kfbjMNHel)p0r6Mh_AyU&^R03{t2F)kTD31?{jHRAYv1iLh#8b#P8%bo!Hg zYGzkNiS%1n*eqT0gRiq-L1NGDLP$Zzns#>r at 99m*OI&wgCC^d^BMZ+U*FL3^GlG83 z{(6ZOghSZ=1j#YX)VDps4P*DqZrRV5xuD_io6n4FOuT9L^Dm=m1;1AYF{XZ0%Mi2z z+`-&9JlndaI((+{tBT=9hm4I^SqSH;~PBOa^N~Alv!ftJoA8Pyr3l6re&Xs4Qtx0($ z@|@m9KUQ at Gmhmp6GZOLkqwGU4o8`v{hc>xZ5%xHSo^X$0n!X(Xb?L9RpDd7hA4ISG zo{xoRVCqP_oxfo%m-Kv>%vT)pGz$dGlj={0S{_B7u&>mP5$863!0+J@)YL$QnIrv@ zc>sW)n7V8`JF=^$`S=ifEmCx?tuZPQV=_Hk?GU zB|z3M=uZ+l8vDl#FgmX+F!|09jkw at FW~Xq*B|R#Iz6D at Hgk~sP-g_`#L3<6pN2Yfy z8EfY_QhoYLujmj+fzdZ3)r9cKcT)4TcL;2*N^;)hDU`cEOL8tV5oJZhEu3!kqJ5XB z$+v`YDwP(Cu_M*e2ccc48 at PL2VgYd*x;sg63|;wY`;WnRvH5HS!}nmm at A_~iFby?9 z(rxeZ$GlC&Vg2O1QKVvq=pnp%y?c#9eL}tx`zHcG|Al}v{PW)s7*}PZUG3HRDEid3 z;5rOf(~L8nEB(Db=@nZzt9Ay6r&`9FWs#{Ps2lMaKS$V!pQ%n7<@)j$C-8z;u!Q2z z^S1*B0O0w*XW(BGv#jJ6^-+9xbk0^#F%Jo)yYqiwmpkpjvLYITQaVXd6Gq{SW4f$3 z+bp;U`vvKJT-n_P at e_&`?l5?@>~O|TjwsYwo at V*Uz^)WUYi!|?vneaDP~$PgxTO*LrNpSPV1;ts%TkW6uw1T@ zx#Kgr?GUuKXwxY5bVGOtJ0KL?8;Bogl}py3 z&*o&cbbf(f{gv~Y!)^)aR15X-sgjIgBw at R2+$79G-WlNQ`(7tH_%!|xMG4`ccZ6pI zE`MbS=g=ny19%ix^w!TrZYNWhcMy;M9J9P4v5EzGzYz}zeEjG=26v8Kmh>I zkN^Ov{!cad&r$(39VKKn3}3hjQz3O2paPMaNRbc#Q7sXYWVCxK!2zfdU-KzajzP&r zDL1ws7dBjrQnp%UY(4dh4xEeF&^hN}Z8_%;a?YjSgHJqWYy|QC;yD97?D)66__H2) z&)GchV~cryp!Pt|MCSeCAh(9hfehL)KO&!nooE6bq|4p)9+F(zW8sB=8{qN|ju|== z1)^<5=VRuTzbKC+L*)R%XihSB at FXwdhH+6Yz;uPZ9_VlEmwLs{p8XCrsT!wePJF5S zIdu$E;5)>;1sKXNc1kQ{KR)RgdKPZ*YhIA|=QSix4w1xRc*?v}Qm0LL2OUf&Q|OSr zGqKSz@?t7W&LJe$2~AR`cC6XfaJxwtHYW~2ake% zjJDtzagT>ATN$#Ds;_LDNdD2vN1IyhEeG`~DfN0r;qmbqiO`T|JWMp&t|BfKiJh%a z;(Kc!K&XzVXH8qvrfxDoPw41K2Vn}$CEEHfivs}%KN{c#rsY_Sg_0XIYlZKwUqM~n z+X46r@VaF zHT)+}F$cqy6QA at o->{p8?C3%pq^G0%CCd*XJ04mVuH>t}FSUl32nwftvk at O!Z8~R> zn3NZciwZ&2f|~7jlX%Q06(0ddUQq{!M{XVsbalE zkwx7C#Y?NDwDj)2gAlHVs;Yg0=S_03pJa{eG!EkleAeC~v zw(yu`rj|uu7d}nvKzzvx(t;!A1!+(HZio(52WIY~LdUIyG{%hvBdb3VD4cen8%N#b zP+zJXvWH7R)lMc^y3Ma==lI5Scq;Z)nk&aG_u5MgHHTneV8Q3;GIdegSf&ZZxcpKQ ztU5DVeg$Q~xZ%Khq*GGEI=x5-!FH;3VnL;^*86i|p*g5AKV!hzQM at OoKZXddj@BT$ z1 at 1qvQkb$gZ8sK5+u5 at x7>+VFh05ipX6$FID@>u14A>VJIZ8RJas|WNL|aeKIBwFH zVJdr^E|l!f$Uya&3;4oYS05`WTyAupZ#77NxA}l>1k1%x4VB5l0Dx~NP4Ot(oXsn zT8UJdc=O at e3m=e6bqJ&m?(B0_!)o$UC8^i2BgyJ#TH5H_%6GnX8{4RH6;$C%`k*d= z51~f;;B$tRb3WlW>Mz(FSr;mJhJMoLh;PQ&*_r`p{L(QL>tp44o)34sx0*o=#|*AD zrB_f`kmj%`X#ByTh$c{m)WJT|BG^?zT#NS6*Mk&jBLG(Y7 at IMWE8$tykQOV^8Y_Wx z>QuePUd9`CbAjOYn05+PhS5l$tTBUxkR+6;#DLPVI|M+MN9F2dQocFOi)J?Q)~J*} zVP+%*)vU}al&1%^)Fw9ND_my|1M|g_$%jNx@&ITjR?`xGxvijHgdNucG@$j{9-zP) zFe~A6=}C2wMXJrLeu4k{cEMU_3xWK{UHgd&0KoX)ZWsUP_WNHw;r^?@tVRt|Yik9S z#}E_Nh=Wu%(8vgTgPBEY+T9|F6`>8|(B04)E9g3%Rbpfs*x0K0UOXs`_Pn=F;+a at y zaogsa77y$B@^7tBR-H%+5c3B>f$-JjJfCx&c72|Ao?mADcE8yChhEZR<&N_AlL&cJ zhRW_Eqj{5t%tD<2&Kbvf+LQTC6H_72?BgpIXM+rKk*OG;>?6s20T at zLm-u z$qD%uo~8c&UCU)x#T{m{I*|n%^3k;V5jb><+PmngF7#fAV7?|+qAOOBNcpHKTSvKS zy?DCjWVK9q$~01W01g}W_NF8rS!+{On3q?dO;zbU`G7XFWWD<R3Z1hjpU1z-ThlO}bC at _~l{zWf3{;rwEf>){M8W;}he3Xq-*Fjj^Zq3kC)JGb-!V z$qZ!Mcn*CB{sXOJLzA&b?=i}!gH}q)A=9{~z>qMq9ou;4)lEb%i28t<3IYDk9aJNw z>#u!ge#>Mc8(1N1ky}m7JnWQXjBAN~EX?RsS7#+a1(}1*YzwD=*=Y6HWBkRrja9#Z zj0-w-7+vh=1iQ^z6&k&eEi6w$$EldDjOy2vOupkL`pKcfy!*h0(4I>R%kdaJx=Km; z1Ww>M}e9MuB0$sT1+=| zk?G9ZK@~JWopDu;vr?HXH(^Zm0zIguS#K=$mr{690mQ?B{9%evU|dT^x_+?Jtj5i4 z7G6S73+enC7tvrkBE>R5$>q<;_sQxFNqZcih^J2POT=+6cAGxO3TPrvi&;eV=4wZ zTP8dk_|}SS73I_SITAji1m-U9s~UkC_r>PZks8g#%Eblfg`!zIsS=8cPNb{84C at c@ z%w!pwvZwTgn?XZ`4J<}Jm&y9xl{>fM>)XvaP4^;jc~UqCxQ?2_Jl>x}f%|K+ at UdAV zR9E5A7`L3LZAi(7Xle;Z`vQ~DouluyTe{DC0B>`FzP&B_0CIO7F}v`;?8b%gw$Jnl z at K25qWgmZ0@U45z(Js$BashBiX6z#`dFuf at eDz;Uj9-vz2Cc(2Y$%CcUh`KNutt}W z$H+tC_k+K}1mwc`hZ5z3@{R<|1due-6!;j%2ThL%3|PV5;rTN+Dvcj-#L9uU>lDC> z-bJ_1>>9lwbntc?+A`;I&2+^3MEhM?d80o?m}8Fi^PFk>w8qAAF*wokXBt27CaT8- zBpnI%FTXf)^P4qA$D7Te)kwv6rNvhnX+ga)yY78NvV@#5CYD=3=FX&_qCg2F=AswA z9E06Dq6SH=?dU at gJrnYHL@@Yq3?xQrI7VNbqf&Q-n*{pVd^noAfaQ=36AK}6-a(}V zmxjS{^MB#af>7;X*S^pK(~sW=!Pa&D__jsCX5AhBo#d|z$1wJ zMd5S}?BcvF3knyrxtgr$1v6$P0JT-?%y$cKHp)W)`FxfmGk9N_2-N1)6m?ue25LKN zx__c*wA!=2c2Ag^%H-9S%cN?F at oeL|-Az`?(fR%Dwq$!?&Vk!ub~!G~>3F-6;2{$m zZ?+!2`7+&@cU5($bG`;#ARC<%gDuHwNzPblzm&N*MVe`Bnc3}iX~CEj`?0o?P*+OS z_vZ^f!iY&)@OPDA7YMtzU&=veNA`%Xif34Qb at B#aw~Al>l2kgoDk&fU1OT87`aecR zoDFP^4IGV?|CTsT{P$JpA0JuR+5T5X(%;*P(>kMc9w4}IGPzK4`btB+>6=1E5YQ4B zWQqqx*rhG#n^{OujDE`XrcYD9?cwiz8+y-~9d?vN`ZFx2{l3ioo#WK&wJEpD=M5r1 z#skU-g^ARLQtZGLq=T}mAgB=@8O?*~hM_nB?WI`Gkjz=iwh)@j=1d(kop74yh%*J# zY}>yL_zVtq%atlC0=wA~L^`C);HpwF_M_$hA?+QUD{I$v?{thA%-FVVbZpzU?Q}R} zvt!$K$LQEe$4)x7)8}1h at 3rf!x4!!JS^JEtG5&)4_l)a$ZgmF@*UvTRpWV1Ew!L4+ zkZj+`UEa4lA_&3Dn6Upu+FS-KKI%cYTy&;wyF8njC=Uc|;K0jDHIE;e?C;;q99^{M zBkor?G`kg*aaGAaBM#1HEsC{L#Y^n(WRPgn3s`Eg5k$WgtRyR&gAF!4%Z(Vc5hmq& z>7x}+E4_rvfaF#PJNYwSheiShy=Hm#>e`Q-Jj(@6iIiivvcpP)F07E>lKYM=>N|Vp zA4+?z308N-neHp1d@#k0Rlrmh3^ zcx>rum#%ju7f8r2THQ}Cu;|1JjR;??!+Yo1{afhM(fAW6NJy*-!V at X30=prtOZ2?M z#a__I+YTt4L1s}dfitVb6`zkui8RFo?x1@@TYzJl(T{iN zEd8LV&)^ceC?jM|BUQkib*fW*9pp6wk{i;{fCuDe(XV3c8a*DUH#P{qrWja7EzNQ& zgqo^$3D`Tr3afW=^&o}XeTi~MQbk_HG`T;MO)B8&qSg0*tA at G3+u7m$D>hmG+occx zAF-+WPYIZ+ru&b|f=`PAdONIWt11qI%EChx?LICNav8h%P#aP_IX^ynyp7KDBy*NW zp%)XCg_97Wz8_}n(`za;t;p-?9XV{jQVYmg0E$rJA;y~o}jv(CeA zHg_^)4mSfdkWal0dcU1qbS}m9n$uoNtvxa=eyr8zg15;vty#D&eecCr91s;L)bf$k zYS7b#OkB}arU<;|6tr%Dsg``F&9hNigiDn*LuD1PJcx9{WJZild#Uy%7K9(f*c$T^ z;NHo$cq3;=AXxDd%m4+|53rfq3Vg%VdaOkwI8q6!lv`|o*O!FOZ01zQ=CvuWvN~Dq zLnPp8kS^DMU>)`iG}JP!kZc9v*EaO_qHCu=Ck^l% z5!!a7F%Sv!h}`07z~=o4`S6G4^hM%)Lrz0BN9y{9#3`=jRyEEOu}wweobPIc=`d69 zmYtPQlS((5AC0rhyT&q_yi8Clo#>ABgl()$#^ET`uf3D{=7n+^KGrndRC256#Zj at N z5t{n<_8Jbr?4c$E7#Jhme>brHU!zgf+|KU5g0V#1{vS1)0j&%@Dsfmq6pX`R at CyuU zI%+GRVU$$KSMXwqANmuegdJOnXBfjoyPkg_h}e~Z at -YDqk~o&}A>b5VMwwYTn>pS` zYdPO9uY|S(z@&_6Vk|Zs$epQTFy*A$@g%^|jO9ofb_3AJu_O`{d3$%jDeAB*!fm{g5q+SJrkLgkc=Tg$Mq`(_%G|6Zd@ zvxGI9I_RXh6E#&?Hib5}KBQ;0 z$@2SA8mwwvHjzzmnxON@)-vY`f)f9%ulfm6ipyWa3c^j7ftNyD|B zRg6-x07v*#JmIQVcECBUiurbVJYniJT&*K6Sj7|TOg>iL?u&yp%UFbAFVaP0oM!w^ zpOYX!t^RVYCLsh(&Tk&!Rls11q>VEZnt??c4uun~Wh9l|z=V at zAYk)7(tDbEuwGIZ zwDk=?r?Y+N!u;-mf7|3_)p5J%f;d at vWUXc-mtJ)X^&mjSk1UaxS#8l0k|3PkLhE(I=v9SWBmV>~Av4ZE63!E`t0MpJg-9l29XsU{qE>_VEaA#n z7Z=*YNY#(+G{^gtE3VN%uCVsu$n}#yu0^?H at O3!7KGGwZK(fdX zPtKuAp^7kY2|v9Da9y=AAI0pSlqw5DEDe)0&P9dN+(Y95J()$-4w9vy{M`1WH$twM z{x*N`EQUrG5)6z60St`y-z4>47Y610b9$;{R{9rGlkys3S_%@_-Qjr|>L?%(aTPu` zRcD<-dvMPp-GNghK;{GDV; zGe5q_72pozY{bmgql<&Lk!p=xVEfdg4iao&MERjtX`xm5vfS_EvG~#L_O5Ej2bqcv zc$zSZ-GFT)JctI>)8v0kxRx4-M<6^Ee+wW>-=sFfIwum% zV0AIgK85^BsY(THal(kJQ&Y$_&ATtKPnnU>Qlk-0g(Gn%UX(=ISV5yx}JvFFr8M3G|^+tB8VZ8=9*SROI4IRtdF)~&6jnPGtbX5*IZ zvLc;u-NenN&04H73fz#&s5enC-{fO+vV*HQCk)C;!opxrjk=L*SST5|2SyM`BtN(u zZ7n0cSWt`sjJ$Sw#&T`h%(r2- at 1$AeSYmSel6Q at L8wr^HNP7b(#a3c7wbdLd9((K} z1xQSs{NjLdve=kaRj94pQPj at VUZe$+4T!1xXxXXtgEwlhSWanVA<_yxPI0?#;lVC| zJ^paYdwm9ywn_1eNb|(-84x8ZNC4|vlqs=*>o2%-{w=Ec{!B0< zFQHN;y9WRq3+)Awybe*8Bj1w+wzsb}f2IhY3j$`Po?01^=e!D}zp)TvA%`uKB%N#~ zP)g4uNegC5&YQknmuwH at Df|Fkae%|Xvf>jD)g#k6Dmx69pmO-w_I{V7a89@#9`K7ppmbPJ>&M7W>jHL3d+g8oeK_R!pq>xg_=S=;+1`yZ$89gVP_wfi zYjdan9`C+~UnS?1vfT(zZ#E2Kv$sya9Xw~6>3zY}vERUb2+xIHkH0}D-*@tSi9?Sn zR3au}B7fW50myaE6Yk1xNDj{Zq545j{yD*D8pFQu497-pX at 7qGx4jp<)YGlAU%ZH`wqdf1V`gRxl<~mLf;qcFDUkK7bl7Ed z`!)tu;(bTwcppTGx{s8X`joo%88AETRCd5b*ZL)ZpFhz#jjFm?p1LqMB6U+SB#s~l zOeCQ!d3%Ru#Uco+NY;vRu~!@eWFn?jyZp;?uLyReA}ZLFWlyf72wJCjKcnMp6w7VcJ;^d~})Bj=ZZtZE|rLgV%4dG`l<63f+q}R?22tWlcv+~AE#j&2L`;4vO>O<>s0Mvg zopNa*mR={5e<1!fKzOWt at t6PdLO-Cvz=Z$J0Qu_`cW`s@{!4|Dv-~q$N>X$c(Ueg} z|CFU)3`618!jl@%-UnAl6l#41lCWs7r?JnqEnG-z>v=eLLA at vlT9F$0T|+#}$@$$B zVIQB at O38A-%llaHvb|+Ze7{U5$`gdh7z%;hn>}zAh=im}ZV#fV*py4UNaHUxZ6_Ec z01aVsEeyEi-)?$KIpGu(iV2&cz>$h>lw51fhk z9>H$5R)TC-F*ge<>)<|?qAqIL<&q1U2+6hK9Xg6CWHPn0w}ih^rzW96NzHqWqn0=# z`d=b6 zsHp+{)s=M7sq>j8zdivu+GI?&RgD$59Yy!o?Kpi2HttjnEK$@t$h|$@UuRj*slzdr z4{r-^qvkIN at qHB5mo6e#42EU}xYd$DP~L17cw=)_YMO2z!vVeD18gXAbhPE=lQ;8J zqdV=?<=}TsT+=d_1XXEpbfbD?d4tD-LMYFM59WVCL&;XL#{Q%X=YCLRoTfaAiTbW- zq5h_Jmc;$j|MZ&8$AIl;rGcJOwR;iqF7SxlZLc{LMM3(czdUpzLi$8frOy=Pgr>pU zlV(fGIih_;5#v-zk4aANQb7da=BWcRhb2%XJZY_*ri5bS8uVEe=HkCA!h86P^#0|CzILmECpgj(JV3I5u`M~(2qc>{sHIV6i!IUq>~o`+zQo^0{zZWk~pv_eklVN*sr z#G);#Qk6@&Lj*vht|AQyG!vCnhghb35Z at _=uGM8SlOY;QRCX8O1iTQW;e-$4ZHKs_ ztL;mB;q7!QU=v!tX`YTwjXLW!wJ7UJVo5ve;7EW at yuk<1d!t3_1O+!nF!J&Ojvw#- zmeZY-PX2WMi^&VvfA7NiZ%qEvpZ$}_b%%7mV0cm);4k=+y&ep4Mjd;g^}^6|b2D9S zbC+3H`LpUfMDKHcWR%QaG^Iq$C;5K%g^Cuvl=VO^kLyb>kE=!6=KI|XLLj#bX>dDA z{-`(*l`+z4_r!oRENv{)g2(lKTorE+{`U at A79NY8cs0{@=7W2f8!E7Fj6pg%U zOhuAj1vLgJ(M_0XG|kPwqIgJ({tTC)BuRzYR9kg9s!@4zJeq<+Yz_`wt}@d`fjI_| z3ms>g&8zgja9}n`gTvgRrMnzEEvG=B2J1k at fK#ovEtN2rS2Ur}l6^sIf|hbHRYFRX zPlV=yk!s at CPt1jTVd3PCFfj+(#0e@&2{_-y$ScMPI)MG)?mgN|1->rFk_tUpT>?dd zdOG`>9!JFas)O&m1i6r+xW6#t<*rjyx;2;FQ*Kbek{V!b5s|k9Ldg7VysRl#r;h=; z&K(wX!%HYlWjW?j!{U00;12f(i)x1x0-KO?Spvo*PM6@=M{tD58Ds^Ks5WyE7kz~$ z1ydE;s^_T}p0T7E8_ZgzGj$P2bZDM98;1lZZ?&%?GeD4y;-o1eqyQ%+J7%ObfPV>> zk&ZGz%<)O`CWwBF{)EFwfcmu$d~o)QEitidi9=vyL6Jfpb11T(?sEIAIv2ywFmrWX z(pf;>ASDdrVBc1Ru7Ip#mP1LmNv-*P;p>=>Y_W~&p{5PPF8#)q@{t9uD{g zWypRGT(jbhL*@}DBP=@ceCz@{KMb;o$>VsWF&*wCw)!6|ur|^OoVLF0baUzveRMb_ zxv^7uR8BPCs&(<4!+6clU7>8$p+p1(r|-JQN*y?y)4iW(i7%@oHjTeq73e9VtvZL- zlv&`_-GNNjneUxd7}^@}9ruHYD#v()c4- zH71yqCtI{gFqve6-Sk4Ct9t0UZg-`O~xCYkBwYBd4Dwc>=aO z(kG at 0ODCOXc(z~PG at j3{w*NrZW99kG1z8jEvg{AiWFH;ld}cok#&h*>hqpaHw#Hjs zUCTchr4dO7Ouppr at _##e@$Q$rr8#2ssvk>XU)Q-M-WR1ydvTr%$wn4F5SSI9hUHeY zV1lDA`W}-eTfF3FFoEzK$(=OkT9us1sFXZmz*|}a&mPB6PG at 7NGd1}{kf%SJ^qL>& z$;y$Z{2-!0W~xdR*=VjI&sfTOXJ)3Sk6F&P2=7C?DG8Ybi>?YPMGaA12pJrz&|Ut4cFWaP} zAmcjSB+VgEbENXl8OaDuH>+B+z(@<#Z_m)$(%Eh7n6D!$s%FGy+XI@)L`mch1}U{y zPxq^2*33^GSa#&whDT+UxJ%2MyS)-<>nv+ZveCtGiX!d;8nC{x(sg*RB`_4guknjE zMo+p=yOOzUCRHqs1<3?MrU8HoGAd93sim8AHl4)BWc^3Q%HPJu!gdQO%NWcx*}ccH z<_{ERO|zyl at TWsFS0ov!TFeDfr|NgjbW~kS#<`A4T2fkBSU${S{^Z16a7KnSc?*Jto1#yoiT<<_Y5$%ydX*#L*!y?@sX9lN#MO%9@{I2SRKM4OwEGBx7 z&bHX135Gx94h7VR6N+uLuV{?L1D`8XDs!mQf(R;wUqU;fZ4;j8WS91>6q7fkxaze+1T~-b*38-GCE2#!Lr!0Ui7HE=V(j4#Xqh z15bq%TdmE2 at f%^j1bi=Ep}0X=w~UtqqTy#i8v?P)XtB#d-y_0}Hj2$2i=b*_w!Lh~ zGHgnDryEjuQPx1fyyqCWORz$kHRJ7X*BzGk5`!ZjQ|GJX?Exa$-vPS>{%u(SBvK~r*j=%k at A;-jK|L17YnN?Ix z5hJF5gr&p4ekWr3o#sSA{24Xl0E5f?9Fpi#r8f-H&p0>L;SQ{er7Pwfylw{^&W{G> zWPN61NKT_gAV6raoD9~a26DhWxZWlNrJfj)9yZn-1spR}0xeiMQByki6Z5-LKtXlm z6gQ9OwA0lLcFn5s(h=qZ!Ddl|WVxqF?Aefb)W~I#F`5k>PjI`4Qr!Smt#MVm0!62B z2tk|CsQjuQpUKoz>0%(oLnZ}>4U|)g)o8VzU}-WgL=J0u0~MqZ17<1#yKwPHZi}-_ zxhN%D1ZCzQPH)_D&%!jNZxS+j3x40e{CG~nJ*R^lT7ivnoMr4y1)dk3Y%KngNXoK8 z8G&s>yST?44Q<}G9$v8?X#=Jftl3+~{gmR1h7Ox>*}z55Q3%JEjIxR09g-#CKyVWC zlyM12p4}$B-!4$_Q#|=rZ(kmJ<5o1ik$ywE6*zoGN%+B&8r^rIoSw4RVTThfC at gw_ z+?-pAfs+rl*oe7F-^21<2sI`Tc4Q`{d)p2r7&FuYUO)|!#7fx6U{zSeryp zwhb+X6ErWS6kJBO_vIIytS%3xjiwHvfisc)UIC(PS6E32;ID6(w*Y2Zve{a at yopS% zqfyodlLPLZ>niR3NuS4_SVfNshe4y&yC40JmOo(s`fEY}dEpH~fq|hR{d+P~)X~n} z-hupYGE-Am6HOESbDG>tiWQtTnApBWLVkdv+=~nd30VTJ6RG9cl57kJNyf>PQ?j$S zx4mj>d9@&V8;C}}(7`OwubSw6q`HT>w_LnrV}pZ}#+pk_b)C+>yXg7h&zJoEaOL<7 zj634$!)nkC>_RH49X${x{o|xhH$bm{i8#0&bI5%IcF%s}V33d03`y#SjpA$h8kpJ! z{H%e_kRFO|!Hscl-sVvVAu$?G9P6`DlorYjW5`VAf=fXNX=5`X%Y)yDQNjqK=v3T^ z3uD<4wht9L8=7pEg^s3a^JE6Jd}l4KhTX5ESZyA at tQ6HwTo?2qX>}1ccH6*Rr)Tjn zGB&^#&{f0SDti{-PMarPp^Z0CZ$F at B<}WdA^S-uu??QzATN073i at in%KxHs%RZc9k zsQXi%o&kL_yH?$r)SD$2Ka$FF4?-aBGZ*#aA+yB7e4;q8EtCxH?zRwrLN}8T&+`dx zKW}*+WOvwP);gVL&aHxxO}&2X2-lh at O+}5x?j)km!udb_*VF`yC|+l3{38 zF9$%@vFs8VdPbNNrQ^WfWW=zBS&OPKu6bDfAr^VhWVWO&pU7Zx?UVXka*&PNrPP*Bv?vu&XYH=#V7>WtJg>tZPYSV zSxkx(+Olyd_VUGxb}E?cqILkwtk at UoJD9_;^p{NG>sTcpm$ZZR8QOZ0WLKB at DzkRN zH{cs~SsK>x8HABaTr at N^=xL{?$nY{a at 3h4U7S0Xm>0SvL>5Q=qlI!t403l3k!TZCH zR=?VZIj#~DLMTX?jDg|g8~yq~S=7Q4bZ5l at Uv9=-{|(Dkm7~~DWM5L z;EO}rVxW{V4#6Qpb4;V%QG;_T9pL(mX)Z9c4aYa(P}G=YU)!p9sN&tBlZu?=#NV2Z;Jo%7C!hpNfXRJ!XAFG)z%WARr5Keguo> zi9Cnp@~_Gk#WSNIk%-ww)&ctj@$-4~TG4i2Uj&3R+ozkzXJ(4GcRNu1!5`7L^0=%n z=;mnEty1-B^zSidMSWTBJ7YAhMrH5nsruc8gg4Qimx)=c3v!JcZ4m=NlB=@OV1sOs zWt{~1%^(KwoM%GT*7x at -{rKo?9VJOnoG6L{G3|YkVZ?q4vyp2|QVVtKLfyD%r~`#T z_?+da-RdF34*CtB$ooJmWB)J_MR$k`sT*KapU47s at Waki!0DwXe^)YM%iK#Ko@>aq zo!sC8eX}-{BdjGsm5UXfma)_`o=3YD+Qw4YJ}dn(;Fwv}B|B-D4HB6kE5_Ve z)XXE)0n5Fuy$XxI7K;CuIXq39)vr=5ljjth?={xq`@R5s?XoePPM6ZDyVOB&Pk&O- zWwz1S*wMFjvWx#^O|*8 z1!dA`bkBXv?mcqY2CW&qqS*sKG5YV`qm534&gwwlfePbo^cnbSSN9xmI-C`|WIy5u z7qbC6WRk*9UKSIFAX6-PV_wdllFEje*corh1G+Tvh7`s at zhvlM6WMru7I(m$+hwse zfeg7>@)xs;{jmj!KVLRVU!22dc|~B8FJu(6152nBQDnYJKI3%^U>Dnla*~?uGa9R# zWZpeR5MtNf#e9t;|7}8=GF0V8wPJE=8mcfia{Yj6`2ucP9mJ-w??)WnNBuG~-652e z>I)5V=>gh~K(QEAikowevMLvz>dNO_&F9oAOC#Opp66&`y$Kyd;?T@`4qBzz+l3yk ztjhqH*hZns8zn7=pDjyFuMp1bBn+bys0XrUJYE1SJ|N`wfDWj*Bpc#3krD4Z7ITum zNujSFo$uR!gD(~vA~4}E_(EX+yFtbOSMdGUsxnVpar6KS2)n?@0`G<8^wp>|lnH3t zGlUFW>4lM5F@(a?Xx at ZGyRP#idQruNPt8cGYv?~AR4?^5_o39S z%4?R#G2s-Z>mOdRUaPO928;tQTJ6~MaE!G1$-5{$=7Y=|e0osQu&PQ#S~Ro(y#SUL z`?dvdG}~rIZ-uf$R{9h?g9#fSgM~y)2HjlQu?K`4WwAIL`sad&Y`>WN#u)%QEc`0pF3?Z%x)9>ls%%ST!u|b?&qXL!Z20UMvBLzW1j#vL zp%tHLpCe8?g{Rhda|n9W@;Q5-mzJ^;f8kjKnT^s0-*AsEPF at R;3<2)CF~Z5d{Eo#2+b~#qoxVBZV!`iI;kAv(am!{<#~UL<2B&!zc;`6 z>)An at I%wt8o>lyc27+euCBKTyi#Ju~bV1|{_&S9ex65AhyO_;NFgfQNAk80~ENc^D zeQ=DBR9_6IGlGR5^rC9y3mOS+WzLMiTla$Ktor^K$i7whVkebUz*Fd(W9QaQbSgcn zTR?4rRRq}H7jY!8d?tvz^}~|x+3VpS>GbL+o?WfO-kzKm68=4h{Ou$01BVLs-AbrT zH9}dzvmX(LDi-q=6dim67CkaZJc<+Llaz4h#W!YusMHG6>H5Z-;~C$fXY>8G?bVNA zu9`*pr_mmV5AnY3#*14(pjySHWD@>9?DY(eyen z%=&_SEbW`QLM7(ya9GUO`iM8yv_eRslm`0!#25 at vuIQ!=HlS!2;zMaAGuPT0YP7L^ z_j_E9X at u9C1z7{N=!u#2vK{n8iM?x^(P=ESOVdv at h8hl*{S z{D5M4D*tBfiG#T&lP>?9Oqvx`)VcQpXOB84$1I&E*jMU;B@{s+j17P(pY_9L`RB&N zJ`N}Cf4CpM-4TcB}CmkcTb56gVqqU3|&X_s6khP3a!&n7Qvhl4NUc*8+h zY1_Tez^H2l*TH};BUun3AX(Te;K|*=lc`O{qr^&iQ-7&- z0%kEbUe at t=IHPVATSl`#a6IJ!dc{M}fCX`L|3zq-TA*GI;>eWo7tcEB;$%ITx+cMjRkq%sYdLP40QPsSujhD}Tez9co5yU~D7VogJ4T>FNKQl(=n_<`m$W^T at pQ=^zkBGe+j~&tynx22 z#?nvYm}Y5?-QX<}?G{>eRDZeca>~P78(J_Q7p*uUv&@%D6ZM(mhKa3$fnd+X&mwoe zIEbg@{VO0wALzF)kYHfs05CAV|0y8aWiW{ z^WS0F{lrtaARGBp7s0wC9El at zwsZroDR+JO1$IkZ_LI)a)l&*x&Sf)Od+q7pHXBf5 zD2o{uR*#T_9YfN{$koiDWs at AK1;z?&i(w*+RXTBSq6^s-W3N$m*6*9T09T at jyUfn6 z;$HwPMJXIlq3(&5y7kvN9!F?vPwG)-1C8Z3dsq7|!FoAFj_pt6aPgX&h| z0+jB;Lem!Snpj%1yJ#x{X5t8VEcYO!Ht6mb0V_NOv;~eBgHXNi_d>qFCm9;60KOZ9tU0QbPJ0GM$$w{RhPre%+(9>IG1&0 at nV!m`k z%Bpmi7(pkyfMQjs^qLxmkb)@%alW875vSh`Iy07{<8HJ6-Y=PsxMagu(%NiYWrbb5 zbv!RO(01~tH%E_F^LPaDYo+yID|JTlA6p at fLQ{jSI6jyh at _c~PWkuJJ32RmxgLVTA zQPc{yJ}W|6;k1>4Px_%s6j917h!Kt at 8?8Xb3-1h-Ge2 at Qg*mV|l;H%`1v}A*n8Fyl zRBY2!cVOXtj1Sdkj%pw&VKe~}52`l at wSjC`f1}jKyV at i&o;7gdSE>`t6^ou1J+{nD z-wAWE0*GqQA9NJh^_N(tM19C&aBs_~YU;3;$=wor`LKwiUdK&!}h#5(I*ZG3~MUAhKFpELMC|^aU|gv zp0Q~Ra>7y!PAA#d2wf4~Uu#U|9zA9VOyE9J_u2R57>6;6M|pig*&C&Z;J}FBAT$yB zfRmcVZ6Q{?s1DZ~O?*PxlEfH{58n}@3973Kth<9kHW>@iCn4=!88#-$|3xq)u;>TJ z;zzVQYaFL2%iT%K-RT!+T+AP*&N~CKdF~8&B~KjO$>Z6vukC=DwzQ6!{rn=|q{#Mr zVT at 3|I+*hH7})D)AcA#wYJ%a$k{8$6E6HW(Ows~?!9hRFAJ9w)t&8`jId<-!DD(|g z7B?kj7i>q4G&c4kat9dZ=TJTX(g!!kr>_Zd1 at V9Ux!T@@ao`}4tKR;K(kq_sgzP`y ziS*_ at a8~$!92aKIA8YB9IE at m1zCwqzw>0TrGz0Ww9b{ZvO=DM;XUifxfZAlC7LCEKd|E8&wY4s^YX!!x^nf} zT5vVOc&ZuktD=s><*f!Eu{k6~$ez$mF#u3A0d~`$dkfR}nY+?P_}FZzYwK zNLXqEe at Tw`|C!{_Ft&3ycl|#l2bwUtKvN2%E at p+&Uy{QnEWij$Nz6{XLBxb!g#I){ zQK2ol(X4CTu1)MSnTfKnA7;PlN8r#OlkTRPP>~OtDVy;G)YqL<(Z?i!N*~mOgfP;-K zoXLTIqV4Loi}s49-_oI8b4 at dSu?6r&67qCDCD5~k-a3dg1F+~NyX}^L4j?SE#h~jY zuTxxV-+sdbjOXI?)&J6^xEZd-w}yEz{=o8&FUFDnHFM_vmT(T*_cfzJwanbwd+-Xh zOs=C5Z&n%Uv|yI=9CYofYwRjH#~p4dRCjORzAr!cUdviGuHsOgW8zw7W0(F^kp-r? z#W==d7{P+h6s%9FdW2|v?p0{=eFLlGFU2tthrU^A86{7*`VYl%pu-D=7iZmtI8osM z_id);#4D78Koon41y)}Y5bw_4-x*cLdz+zt6Jy*QT_0zgQNXsnPhuRAn+F#A>PV*4 z(4X)kBn>*uwJBEJiOlpRUbfFNX1&S6lUUzKPk6G+r+qh~5T#E%Z#`{r05s3K5#;G2 z(IB}4GL0{Z=tcql>+GG)KU zEtp8n6M|APYN`xk!*oFqOJtQ<8E=C1SREt*_+JLyag5fir~+AOeiW7kzsRt^%XM-a z;^;=hAxqnb%PDzJm7w8tVU;0jcwEzouT!D2>B6IRy;6tv17kN{X=WlPJ8?nbkbRP5 zF3q;3xaCm9{yVu!ki4njSEhX=3~*Z3P+2c2G9}oqP~ZUc>}!}a^2*>Z#eao^c4z`@ z{4Y4t|DWLauZ0fl3TVpc`j$Gpaya=S!V&r97(V@&|0f)dWf#&otU1=Ds-!>mke~OW zBdxCcpU)i=o^eL}OUVk99COSpuGZ39{xaUT7o*2aV3-XR1w_^_8m}-km;)xKI0%WvR3lG{2Hjc!q at zLfs5FC{1uXSn~A`tz28_7Ta{smCg zqmHWk^Jk*RS0c`U{wLVXw0!^WIc8*O2d!FB7t(;zQ--Yw??<~mjIaogF|8F?(5b`Y z#^uDh15KAiK#kQR{begYt#>Kily!YE-kqqN!xHQIq5toZCb~MTgAAr;>?o|*fAArn zxaKUjRPLmC at TnC}&!^X{s~~QNyLIa^$;RMnjb*2WvEYEKVK3Y6>!Cg>T78N=R37)` zgtySEc%NlioqsNIv^uH`P^2H>t~U(0cp>D16Fqo`v|9Xz7ZimEy8olhO8=xrb^$Kg zzEQs{pKQ$fnS~}Xfgds9x@?G6n?8;bOV!EX(~JjBpzZmoT)1DM4d#`YeS_C*?Q0#K<+8jZh at QI9Lac0YkLEpUkiDJd`ucQU#I zOi?wZ6x_8+NgUyRK|)doJxS4$Qza4Q7smn3xFzy}xs*a2fq-tl(d$i9Y{%ngfJ#>! z-a+2)Yx%raha at J6&S2d{cayw_^H0qLIVNs_sC>v zsO}x8s~=zgfHCo(Brdb@>NEP!QW4#c8}4Mi=6sjVY(}%!p0MCJp5%Eucf7jF zzN6 at PSP3VBSPg3gn;UR*ph(1^8Iw<4ePe at 1L-@Kax9fA+TW^}OepGIS{G{2k~ z8qOr%xCpcP2N>Yy^9b%m5ze}U5N~jI^0Pdr*zqsqcHfTp*ZWA1%;4 z33R{Gs#iJax&e}-lSw7z;T*@Miv$zohD^Iic8T>EZ(>@gQS}rl%v5_gk+ky;aF)&r z1Kwuj{Lx($=fi?`)pg^S}xgVbwWgEBflT`um{=r7sNh;WX3HS48oQ}s`+8uO)}>k=&F>5>!m zBgg10=USwQgOxmt)h^qOFW@<)_BT*iJ;Ds|Rs6p)Y|!NOX$lM6HkbLZpNh<=M4wcm zDSqTfnchdp)M`+d_Q(4*mH%8>(2SnR^U1OUk at EI6hU42Z%_dzbWgy z=-DdqNjq2Rno1r=A8`I4MyNDB}_y*sd1PjtI6qPK)LBkH>(pK#E#9!yzJ zaKd`T3Q7Q$$u(+lP#B9~W#n7~wS*)Gw7Lb;$TjIH5cHxa`N9aBCyXj+Sm;MPM);6t zC6b`iaZJY!#pp{}OROWoCW?bP=;VmQ0JzG}gyD~r3<#&3eXw#S=#y0)|F1#xn8d^6;;}??Qgdn}Eix2D_Y`+$u3?p)q zc?On+<>AZ1p?)u35#atxPrkx7>T7K_CPzguD!3tAu>#m{zzOCK#g8tNPcM;zW)BVRvBmR1lriYbWJ`G42=EXKDYlfo1ppf zzbihr%y5zb5slKDUzH)KomWI6NX5lbYLu#%mywJ^rCJpz%k>#Nwr#O&pMDLumI*Z< zx2O0hD1Nh-X8z>@eXgq*87xCXlhU`u^5fL z$1m at dIApqUvQga5VpiO9ZIq2M{geARY#^C@`b{Zp)ZYtS@%0)#_vi=*2g|R#uZfk? z>!mQ}*z2=V>KFdK)$tq0-ec=mZ_SNa?`3J+C*+YP_TwfO=ZI7$L5X4}9h1itHu=hzk1>z2)wigbM?eofB#NbGC3xO7Bc|6vV!{cvMU|VB at B=M8-b@ znf?*z%yiRl at ZMd$&+K9frDYEz>V5ZOw_)p*+#+C%>rr%e_KENGGOj3|diReQgDZ z(;Xb^jV;ic3>8sp_<%K?Mwo3Sc%d|W(JZ6_tN9&%j_6CQ<@Divc2AB5Eh!w^ug)|X zNjP8eFFEOy7uE at K< z+dgb4fxCF6h}0k=zy>o!uBPi9vahdI#ou#bMH$udXV56K0XU$RZw(1L&_nQ!<<>s= zRXviwlsOt#Sxm6>Jis5&ig2EuBg4RV9?nMv`2j5A9wtr-sTE+SOt}4qmg{z zj$TmAW=KW#lxKqj`yQbLY~Tfl;Gl>K6h}tk6?V~Z@@Ss{d34X<|BJPE3bK4%{=B=a zRYsR>+qP}nwr$(CZC978x at _CFtKWUjocAAd_SNi(xm)qOTM?Px#FP0+H40x3!@6B5 zUCJp9!!kI?SD1y<*x`9_r7`q3XtlL~Iuq}rT})4Qbd+*CjIN()DDUNKjDCHdjCEF% zpU>m3vig&sRf762z)5URE(f;{Li6&k__HBA*n3vA!+15g;Y9El z)oI8W;EesI{{vYfr#)SZNj1TDpx9^3 at IGF1Vs+;89BnfJWIB;4Q2~z` zjd7g~amKJQo5OlgETC65m)=)n!6n?(G8 at bG*Hcl<6{$@)7pZAZiG at +BK^+DVuFLwV zk|u%H1+P}sVcO>Q8&h(uyT)9ICe7$pk?5v63BrU^N2B; zyhDy(kIqG(fvSKhX^B4i^i28X7oM at AfK%`|fb?3~v&sc{XsA>MN>%0_FEs-4qmI9h z2h3+QVAia%E`=ERuRze7#lw at DX_Jh9%}p0{$2Lk(Bc%&>@b8RBa6-2SE-Z#Uriq!DIGNgF#=nV5L=*9mUvdjs}9oD46s%J;mm7hCw`(QVIn4F+N)ZQ zC at I3wiUTpxLX2VYy}1G472VquSmO>r-&O at 2_74tB^{zD2`-Rvg5)$lz;13YbsSwNP zLc}7V#2AI&Q(2Z;S&g+W8f!wVtqdAX*U(9^REJm+ZCa@;J=fJt7kVQXbj2+6GU%?5 zlb at r&7J5xmo9$W_eAi2vBE#461VEl at Q0hI28$yYpW0n)GQJ*f#_2hbXs`ova74-rr zv0c4RZGDl6rW5}@*$9x-Rh{^&bnpHv#IgOeq5J=OB}m!%*Qm;9pBs+z7AFLGz7SXf z-bHA%#AgSGUwnC#5>l)Fe$tk?X at Ql*ioh-2{V;?K!Y~A$$L${m-t_X5RNHF^(xtF% zuj{uvj7W<5XOZ(#hO4VThuH05FN(Vq#4+!uCKBUuh=`31QJ8l~93`li1X+l)6Ja;Pl)td_BDoGzW0+-EwZeOv~3w zE?EZcR%qfPTQN2kUNsfui*2x>Yr=60dZpCb3RPO28cuT!y!Opf0|*u}KU-1^u8V=V zEUHm5b4 zLqEpVE_DGdYL0WU81Vql9_BD~I49zC&?4 at Dcm1)49C+iIzr&TEz-vAfG;#)|ALz_n zuR9I~k9&0M1Hd+n-?M at L7K7kj4~uKH>J68G?~;sgCnJuP!QsCY`F2b&8kNOOlu~LJ ze&(~UfX%ZV)bqS`KZiWf-Kr1 at 24)XL_YTURO_D+2Y#iQL+xJ=9*JT~JSOS=C`M{ZJ zSN-_L;*??h1Em88UVoV=*a!6A?m@@;+UEaP)y at F>58)sG&i?-U9Zg3ISq;HgPIfHR zxW-%osG`I_5nk{Xq?uG0tk0jATv)NCWh zcWv2h(t_d}kc8o+1U3gN-498;35H&R-2KB0pGpw?Q2U9zX^d0f*bGb9QyHO=B9WHS zy^ljxadM0y%c4X%dTr4!NLXYi8w(bylog{)y@!<_SxOpHm7qyj1VkldR(_)lx|bVO z-BJd*O{*(mz?HG+Of64mp(XahoMun)oPe=_tsoPhWIu zW>8TqRZ5mEoolZ<1R>muf|$7w>~#sZc_Q{^+?n;F*g~cUCM*Qtw)Y zpGAA$a)n-zBnkbVOkycmGR at yLPwDyXRhJ*;Z5*RM%C;3xac$VttH#a*R zDmh*hBZ+S~5P#EM%T?RgqzdDXD;GJc5qkQkzL>qHWC^GVPch%+!BYlIHCnTze0#C_ z*@`g>VRM{4LIC3n9id7CYG*=yG(DOLJ*l362v}x>bf2+RK2bh3f0DkQ=739n4bQUE z7egf-$&zsdF{y!QapbNic$CrgPIyG*6W<6t&G<7MeJ}*x!ZLJRb_&xtl&cpsv;oeg zLM;+ig+Ya_)58rr8arA+tx%C0(Q+lI at CyX2q`l+3 at uz+v2|JGJO-vT#ecKRJUux at H&$FZ8_BP=noyV(9^69u{`7D z1tLs;RbO{uzFFhfVAr+*3;3~wQ at dN?!b_6Zy5|c;QVp+sx zArN!2!6fo^3$od7L^FFHKsR(Z1aOx^k8SwxI70|u+>lAsf#t|{Aa7uux&tqlJcmj+ z1Wa>XaQi!lMN!)?g>`eod3P9y4^HASp--cLjHSZ*<~W}dvarGJzv{A*oEV5 zVR78f&cC^ch{HlO*(#psxqV(t>k+p(pn<&6b$NmD_+a_?f`E8K5pjQk!V?V>wNDhO z?;f-d9;ojnsZ#zVZ-)Xb(81L~E=WjLlb+?F#VEZqxxk%J!~hYWBGJZ+CEO$Q*i2Ha zC=%OQ$t+M5X}FB{GLB$l-p{GAC;nkWE7j6i9aJdXN9E=94`2BRPv?(MO-9QL94ece zp)*X^6O1Mc_a`=e1I%-WnE1lJyjDvIMhDg<#k)z29XM&13KPHUnJ3N0E%G7}7Tamb zcBGc+OoD2xzX!r~Z6^|ERV)Oy!O?X5DK7DGcyv|9W+h{bNYWY_x7jz&W!J!$MPnFT zX#d5OexgBr*EKYG&nt@=lHkNK-jQvrEsI2x%?wR+;+W{fA<=A~=*SgH{+EEdjxsAb zMiVey%QLd;mJwqS(Z<5ic6QI?_I^aMIpXC{gXxuwj42syiY4>)qxgkSekP=pg|kXd z5#1j$Plh^#Fd{Nhotb7kYYG^Qs7r%K{I-ZB2hEAkQE=>I03b- z>%t{?#8YWs{>n4FyH%c8`B6zYeOAir6_rg?p#u-!}dl`3^w^gP1uCg2Pl>Fg6~Ld?-EoR&_qGo zG+0I#IhFM8?p)B_;`hXN%3oE7-GF^!lT-T}ey8@X;>lx|tYqe5q z$YgaMh>PvsUu?;Grs7P0U6<}jPeV$ZK)Z4%G+rfAAPcA3MA0rJgRv#JxKx#^MOk at n zCtEYysfTvq+cT^;Eh)#&%4~>?pJJwJSEM{Np7%fjOfCa$j~^=syrou0E1&?SHchIn zwqvZ2iant at +{V&pajv3OYR`nUPv@?_SE`jE`_65U28^|f+8u;$+V60MN>jY)ohp*m z$8BSH6i<_;cw(I_5!*A^Yut at -vWP|dUOf3Ac2|x}kpxio|0%9jhWYCpSzDEdgPI zExRoRA0Gvmq-145U!A{2o33oH8W7eP1Z7GE$1=V}_TtzE^MF+ at h;@>GyVEs)`*2zp?$HkaXqe59q at FvCg zfr%Qam&goK(5>5UrA`u<^gP;XyXD^b^1dGxYZQt&WwPTsNK!w8_L7}i*8OGd&iYNS2TsjK$XDuA%Nx$1KmpUUmV19CB} zU5db#KzR>D(|3lS@!m&1kIeQGnLs4>Sg8tCF1 at aU9F z;1=XO`TYDt9V7L4A8^8S`?sCwY#;Vn at 4w2kf`14t{qK2$l%yRyq<_JjCKYP2%kXQK z7V$)QX!t1A&h2WtnQJNxear`g>|m^SGmoaR#ftufGBC{f4M50POZ(9Ceu!b1!Iy(s zQm0)`UtUh1n3|gTeSLp}@IxK3?~heg==b+40z+*oD=CaR0y9*X57XeZxoplkq!F}? zmZj66u zU(H^-dfsaF3w{fI9<^@TB;_Mk^Cd_@;z~h{%FgcN2*& z1VEGZB{9%xaM+r4MM~AN&7!aT3Mp82v at NG}GN at LrFKgo1wX!m|*WAmC5LBK9`oMQI z*(ODM^3dAaOQ(;PHM?F at NC7S7C#uU$jA_j`l58wHn_`!d1Lahdn+d{6AD=olQdTtow2Pw zPLZAQ9$y7g2}NN1SiSo%$oPU6Yk5CX1c?&m6re<9N6!ZZOs4dbt)^lgAyCY55h?jB`{zQ%e6$0`^ z({EzwV;D*u#)@n6 at llmH*T>jIy9>HJVkX$??vM+0D=EC+V){DGf?Rjvc zJX5!AXy7 at a&p-}W2N8yG&wuQ3*aSPmt<7Z!!6Vt`#>)R8TKc#KC z_`Y*uY9chM2`Z{GnFF{PYPJ%=0k;+{xw?wI0{=5^=9jey{?0jv){)HUT5~jGgjTFf zmI($=-R85imyjD9=Xt<-l%SW|pp`sbcj|na&$%oHzRuvjb)gGt1Ws615 zt#wTc$SiuE!6lwil2Gm5Cvm^ZG>BY_l&pdr at 8(n8d_U7PNR+|JNyO>}G5wA54Q8s%|Cl zFpu#3?W-XXI~$Hx{u|%aMo6O%nB at jWJI_JtncR`Ma|E5N5cCJLw4jlNgn-ThnuKT+dVuHqlDgUN*@Uk&M6yGidb~F9Nj?_3pe}(IP;Kw zu_0)YJB)d+d6Hs_lyR7ODd{GN$>!*I+8Cyela at Q6UXo2BYX4H;h)Ci!1^x_5iyMU;`1A3%+f}^789d~LHwWF4iNtZ at LVF!HV4$;EX2nY^7<=-njjfM5(N9hd;j3Q)ta4l!Dh2%qNpJ}(Z#;8Y8F} zY8ZysWuk7Tx+5%@b!&NbmRf*rON~w?hJRlR{=KyRY}#P7fulq>Z@bZ%I4qh9flU(pFI5lWl}C`!DK(+>yL08Je^2uQ`Sv?wTG$+&dPj?w}4s6wl_ zGOf6TQ^uEBn?E!gPB2Xy&Oazfb=f#mkDsv%b8a0mDv5%mgnIP}1^HL??w{QGG#hH~ zzyzc+tW!W+Y$lfgQK|Nv3vx^>RZ87U>-iNGYhJ|yH&*Gm!=mnqTk8nJ9Pz*HEsOiL zWyiuf-b;P*g2}f#JxVq>Cn(|P<61EzI=7tG-&F=T3NadmnLmBn%}oUYrekw11B#Ul`KrA+#Pq)y)8 z|LP5SWa%KzF8qTICio6TH=iEG0Mr}2U_2AdZ3YH4*CS{T{K|P0W%kKX=;p+QzZg;X zT=2~uJOQ8Yi1(z at NtjN6=aNU)C8|1949aM+EnxkVaj?h-&n0-fydRMd!S@@m^6L1*Td+4awh?$s; zm+0-$~eeW^~&1O`9t122J> zC}s3SM|*OTM<$I?-*G)@(8{1`3eaQXGnr`<|A53vc|iZSKB&Feg(&@{4}bm&l!E`4 z`tY}vHWeME1$hLXG>-sV99tHdY54M?|#kI`zz0KX4+-^9`Uan<&zuz9g`iWHoPX|rF2(+OLA=QG~ zLoayR1B~Gn+bL8Rc-X_W_HSCFEkcm4$>r&Z2;ER6(^DA84sxSE09#d?yCze60Fbqx z>z%3P9GwYc?3>Hjld_DUPM&Lv*_kpFVjIQ9_mktyM=l&QPnPbAqM at HA7fT>lBte-B zGPX15nk^Gm0OYkq6^Ue;D(hR&4%A6vBlPY=V#iq1TFYlkT`Ej&Z3u*Vimk;Q=0RoS zzN{j!&}j^-l;9T=mn6DnN)g*G3P4z+sss~sW=)hC-71Bp{%H;ij+apxf9NA`#$fN4 z@=$)B^}!LGfoa`X;pAI}ac{iz=mqheDbibqs?K2 at 4mbspkLYmvBfe2C!EPxdK%}q> zuAV^Id978K<`#Aijcs7|x1(XjYoPONrSReYkM(P`iO;)avSwa1);jfzO;nK+hI){F zGj$8tR;(7E2N*EP>B=<{-mkCWmOC^SI1JqIa0z)7T40vT~Lx~X~)VO+TqB6p` zQA)T1yw}!TM-|k@)w#3`0m3wrESMD|8`m zKW4y}jc2!07a4k?SC0Dm=PIt!S#+ePg$&zdZ6NO-2PFAAI)2OLSJ7CdaR?tK2?D>y ztc4o3Oomgb9Tzv^Oux`M at e6cOt)b|aam%JUf2GG-*Z|?eAZi)-H;_lPoBlm{aRAO6 z&^ykcgC>W7Zo)F>SZ+j2A4HUouo!hKR4bGPa*h at xy>&s<9?zj$GKoR(H)?~>x~Tkn zXwqXf5*h)*2S#I2uXs8&GSTJTR066MbiOyRw*fHCUEo~%ab#~qrP`k0 zBI7U$USYipqQjR2w at mBc-pje#-M`(2zF`m?^Zd(Y0Z{)exBXu(`yVG&zK}&0K>04E z*|OER4y^epTp_PntgXDLiqb(YPYWbi$j7|VSOIfIyGBbMw~u at aBEw85EV1ZE${QkQ z$lbJ+s{13#w8 at Es>Exr=>G=2O=hqRHKM-|z`5+D5xx+ at 3!RFqS&h{p9Ma1&2pmhHa zV9{=byMC!Iyn9pSej=a)z_rNNQg!zLzKlhtVRXrnwdy!@x_)`qthABW#J{O-;BhQ^ ziqiLtdX;PZd_r>E6=sAKI&vi`kg!ahqB@*4#8YF56joJ at 4V~0v^ODKghLxq6M1Y=w z${tTubZw*e%3rexYAhzUOiA(ptC#|gTC$_ZNb7QMTPz)IOd-D(lmKmDaXl at H&1X?u zMok)3YY&D_ZZsX;h}cI|eXFES(}~K|9EDa4&7eCL52 at H<6B^VExoSkw<`aw{r<^)g zHQIT_$g=JS_R(yM1?7bV?2Pu}Qs%WyW^vco8(ao08a^B({Tv&mdUxaucgqPIZpFz- zdB%6Nge5Xq5!Mv%2*`Bf@&;4D0qS-MCGavYoJU|MVpP?|p}QpVvAayl8e_^Dz4-dM zIiVG%<9u_a_g->QG3;7DgKinL(Jk#+mZ)Nea!n$2MHufj$sV>QN%LNVKN(W#EP(+g z5EK)nWVn&4AS7a^EeQ%>(2Q!ApZ6)-GS&!5gbWzqV+MjmKSS^S%*-(KEpj*aG4Cj? zApZpMhBd20;ymX~g2!Y#u|GCzQ*vv6%G4kThKF4c0!2uVkcvvBx zPzKr&W?dl2Om}Jixrc|a3a80Fh`YHrgMj at CC&#g5puqku$o?H^|7o(lQv;)QauaCf?nJza8_{_;$PqZ#Z^tSD5gQV0k(LC<+*nVYX~7tPz5F>T!-`+a%N}X8^Qw|Ghs<9doNd z^p`JlLH_t5^^g0*|BAr>^Xu>2*BVt1IZOeRKd>tkovO-_Jkd}2DT9GxcI7oC<`v~N z@=2^;W+61S8m?1~>F+u3VKUtFtY;9XVV3Wv9E5=}#Qfwqe^t4x6;DE5{S6mKP6lw`eA_RFhb#tY1HYPEj4D; zBPp~($9HG0#~~cMEh{v;2W05ot94qCv=Qom at 5-#PUflBrCC|AGOItXW6e@#u8=_lE zE_9mU9-~ANmHER5x{#)R0=cSn&>QL7;d zohiu0cU`w~&l*T!jD#N4S6xbpvGfpQu%VXJSSBA^Z?&%U)-mgJw?*%-Uymved}v@1ziT z&o%N&y~`mMS(ddHt84Aw7%ENq)#cA~ZN_XPSLK59o&rpimAaa0)jCDw1Tm;kyr9I| zgZaS<)zI!l21rUsr3{k at o!s}*9ojAIojAF{fNe>2A=UoQU|4I%b~o%}+!kdy${2!W z9YT!bF4y1j=K}S>+f32U?4qH(Ef_laB@@#+`pO53tAkgKBU_>!>X*H3nQ8~vLa&v_ z#>`G4DuHz^n1jycJ;=1pC=l2AO9Qcv46}xjP at b6Jrz#Gw-rdeXnH8}S2ZcN2wzFTZ zN#!i;yTu;#NIXDMzjON$If5Rz8nW9(io#I#Fb8c4No0{%(MK$L7k*{@=wqy4IPa%o zcFI8K2t9z%2JF!4$L0;9Y|syrlCnU8jWbl)BZEmV({BOR^lrVQ=M!;+*hTdoQMQ at F z#bne7+3aNmon_Xpfm!@Jxe^!|f)F at 576`Mt}-EtG2YaP?*?QA>xcwLWCyvNyl zv~JpPIj!KdpZC8YHl45^Ti51&Lq{X9h&&?nJPi^*AiHddmiq*X at 70ce{H}@&7;P`M*G1vW~{$=*)zL{3ub%PKbiZl_dU}!X at C{@rH1$Cn5{I)Vx6N*DHoRtd z$Mybv-(&f+_dXTi9PnO_aPS4P-;9E3Tla%1LhIfa!KDrDn}DTZ?G830=-nkfQyIQh z;??cB at M+8j>z4vq6l2oE=x}c%1aj~l8 at x8)19~Z%8GSGLRm&}*rNKBtIjy$Iorh7i zO>SXN7>BDlO6Rn3SY&wkvge?|diw3jGp0?9oH{nOMdRj}vzRQ#j31j(v+9|hR3~Rj zn=_)fk5(lo->N8Iv@(5iaIQ ze;T8=a6(Pi^hiKqj$3h$5q?) zkKLw6_lK+~vb5$aE$VZOj16=1yl2+3lR-tXrcGVCRg=#@2G9vJ?0%*HRY#|jVP+Nk zg(|3pfuMR33My)(S8S)DMC5(SYeJ9EFkZoih(#!KnrUVlDCV|?T^eCbWk=;?Y2?e3 z{7Qq0n>wrRCBN^M4dFj$9lNr%7r&mGqMl8%S3%Yb!H$5`ck$rK>XM!Hem)c?6 at m~% zB at 4X*U~(uCKA`IWsA(qpRl)=$W{{PAQWt5}xb#%8;-`bIeS_t}3F at NgCB&Z^?TvBt zw!|}1;_Rq>z9Y05@|NW=?t7{n=ZU5(Rzu8`wS{y=$f&_YP*)s;24qknW at T=+mE4~? z_W=mcKUE(0IKbM_TRZ9%?$B(j+_A)zyMx?RHV16LZYtdMF0s+#;BN~8<50Y-_mRCT z_n91a(PPP9wTFMUSM5rL&K at wtnKp???b2|3O17U3tpEn)0?38zYE)IL2)~D7Cv*DJ z2(+yvNKm{7?JJITbIUtUMogM^^olsQWM#wRAKO$}sJc8 at Rc+|C*ZNTp9YNY%)B<`M zD$yu9ojOUd)SWQ2Twpe|ZG&22&Q+a&k96Bo)xTULqXL}CTBH*Q5!I_?YoDw{XoS96 z1f#NhB%DHd zzZue{cb>bX?!KLECqeqcphoI}hxht%BiDR1-1JyYByy{I8D#DzU2e$ti&?bNweVMj zd7ZH=I_p5mUh9|-ePbt}H&7<|Nvu38QW%f_ZSHRGXJ$7J5N@)s=4BEIA5h{8zUVTM zN at F?E1&KzsDlT>*hRXp`2XPFrUOti#&tMPB7_z3h?iQ at mT6 z0=joDZzB>q2-RIPb&cGU!k!w_D25JKcnO26!2mRs{x}vw~UHCs=INHN2#Eye)4YUj= z5my>PJ~(6_pCs)6q#ss-JEHGN79%;z0d17_STEqdlFzNor$(~K!%i;Yy^7D%724Ly z%qjUP8*Su_#x6eQx?tB0w{B6U5&rCbxTl{J$2kwyJ;npv^+`2m_Vwp)00f89Rp-BA zhB(~+4Uy}=V#fde^w9I~&8xp62ICa*nZ6K33Z-Pqj}HF%AA#|K%jAks1+66l$&<_& z8x%}0J~H4BMgY8XU1%@MwM71*?Vzq#@Sb*=ysFtWYJFS zGh{#8pN8p`r5_X|u%U_oG|_Hv=GaVI=^@i>$Hv-;2K1oW8aQl+ZNY8stJ%44+26uM?+DC%T!nt?e98P8t1sYc6W(s^@%$OXCvFy6Av z7RQ7={xkZ?ff7J*n$ilunBwZmIvoKS$ z7NiCFS z%K41cqvy1fl{HXknBnj3nOsoEBhtshGg?G%dx98r?~1>ypYCK- zqg9%ZOBvyxI~&eQb?0SeHG!XI8j-9@%EWn0b_2S(?9M&_Wo>hlYzN)fdR*Q~@hYM6 zMJcj^7Zo=_kI|pcD~sstO-yt?+{QkHhY@?38(Ot9AE`dxfHGsL;V^uyKi)smL2%-_k6K z?sRCafMM1L)rJFX;7xZD5c*tY@@!#-1iidbf}fqN|M>DYN`SOeW=`BY at QLdDa$@EJ z;+qP{6~6!ZiZs4)+r$;`TS~&0TW01DAjlbT#ia6%#uaWz+V09!HQa=PcI}}YVnJ>+_Lh{5GDH4^NPoXbQAxI8KH-NrzZYM7@` z=>F?(>sY}&E;CG^KYsKB{@J|x|H%3O at ZFp+RZx6s?IvkAf}16xS(aC4Q~9w3D^(zb zi6mHHWh at 2Og==WDaEfWWGEByq`G)m&fAXzjY&c&=>*d_xJxPr^rA>u`B?>+S^t|MH zO+REi%}n0zT=e|`iWiaj#omi_rj(2 at S{cl;d7M}Gc7g?Tfdsm_7Y19af at H5I2*}#B zjqRJY|&D%>`cAgMdDHBaID at e$BNu)We%M(KzvB~ z=#XSkt2l;^!aX$Pb07LHnUkbupaw+!j=6^|GWdyJOBU9uS zKz$Os=RK~B+Eb|x>+2dqaE&=QHHVj=o&8LNdx=wkHvJeFj9vX;JVPcGm*PWGL?z18 zq~axg+z}F6Zo~E%UG-7r+Fx{`WFp>&(SPTED#2Bn8Ct^}y$lYKjcME^Ww)p3yfKs;8bYd;vzVno1ert2NhaH##i;{3q&pzR9+@iJH^4Q7g7V7iXpDcwGz_2^>rH+BKvVpu(UOVqOzn}Bh1<*EY!;^ zSOU+mZ3_##!jk1->^Ry3>!wX^7sO;prOU~a0XXrVGl>1h8am?>_4idyVJ2m#|2ox!Ac9bsolri!gHEx*Ul+V zB-Y}eh%uQwLWyJlbDI^L;R2Eh5d27ncjY&6TC$dhy zlh?tj;INb`u~0kbqNY_%M;noj1JQduDO)@&Djqo~VRSkYa6X(JrA<<$5AlX at dB%U( z5gQ8sRv48&dJ;T4Du9;r^Bq`^^8$K$p;P+hK-mzPIAZP^xCXc;$+;~Ynh_B(j{{r5 z at qrh*;Ph_^=KeOq^}nu3lmDefbpJqy{?i1EQIfG+;79Pu;&ixTXNC<>%=a#3md&>< z5EqZ}tcXNmp$Svwu-_o28XeY9i$$K(3y6>36|?^V6+8jta4be(nlsC40oP)3bLoD3 z<;8Ts=jZngTpxP^ZmK|Upw9t|9JgpC5|$&1WYXeMeGn0=f&(}B>Hh&nP;}dl84)ig zFcx2ja}VV9o^ZnTrzZd>eCbTdMYkocBC80N%S;OQd6+Q1Ml-x?N~64UP(U~k z=J_j(hZ3k7xl2^yl;9=T30!gEj?94oY^vx*RAY8VV^ zjrLeD7`FQI1B}6?riJHM1p~2`u+@>O5Ljx>_81cIk9iZrFu!h|DhTFhqV%u{BJW1-I2** zm&MKu<)@J6Rl+2bPg5i=7VS|MsZ354s>E)$NlZDI&`_Hu4eSewkM{==$5)06XX1lq zxF~Lxa4M(qavNou>1E=&&+Fs!19Fc%L7OKx(KjH80^pvlR6>zO5m$QNtqvh0Tajvq zh7iC at 3Ra$8^d0I0ouiP;C4{RqX3UdM7ynty`KDn+s_0T^8 at 69*=l*A0= zZ%)~e*LHPZjKC;?oi}my_`~0=0B|xnVKFf2CQr>t`0Xz>s~{Xmrspf99Rq5G+&L?dDaIb5Wmt-D+DULbGq%w2a>5ni+2`yEW(k&y zblHZp3>HgcmDN$b)d44p)mDFeh$*zntn2FGV7`_YR}m|Ym9 at e6fHf5(TPiJrfG-C* zq9+|?@SG&0Xc;4XVXSA{p}*d-mqq*|m8mPu5m^^tAy-~HVvv)$QkXjCfArAFzqkO- z!=X)Z!9B&AkdHN{T)8tq$rt}BSp|CkD4PHu?WUgJQFAgxv5V=Pq!953dG%E52x}GU z7 at b!RaeIb%_ANe*ba5p3SGYd?r|3N>MJS!pUsfm{!fQLUw!x(=^y}GB46YNP4kwozM8?#6V@)-=k2(U+j{R2V+dsrulsI6TO zuEFP?&E(EZY+9BjwQ8OVYvu&2^doIr!dllq>R$|QKAK+y{_J$OHQBlCkYZUU?M!!P zyd86W?=U=UAN+Z{6^k%WSv at M_eFtIlJ3N;2JufSxx_dOU{oXI at o8Mu6=X&{5PKfu_ z6!|Ukr?&9VtOj!+JsBt)>SjCh9yr!sMIpy85ZzysF(XdAzLmz5d~7NzfI|eqp((VC|3vZR4_&{ssz zlCtjKZR*B^;V%id;qTOr*>A=dwFFuoLIU8c z+_6aO3mna?i4n)6%K!ocpG&v311%v;JXUV7H9BE_0x;mC$Qi5U3 at B2g_)bEE3BQHa zNvUnG<4DCeL=(po+UG(?=Zt}Klq+p6STb}f#0hbjkTB}!p2Z65&ou?2a9Cl*=0!KA z?;0B1e~SlrUO6-G5fWKbS}7p23sjZL+nbRluKtv`N|I;QP&aaG-{b*glen7LdYMq3 z>@S%_sW||_T}+Drae?q;{&aper-wQ|nW1-&&U&dw9ltWUuo>}%ij%2oUcZvj7+3B! zX8M{|Xe>NkQ#BKck zp~{{bZn7+}a~#N>$J(SB3fke7_yLHGRR4vJj)%jlsK_PY^pT`cju^m*u9bBCI{=-q zutb~4Ku(7@&uX->dpR3KardWHuE2mNcu3H|ok&uIH1Wu=O$Z4qu0(XR4IVEf%?jE~ z^Ce5s&+!pRw3;f&B+y!g*rs~%#RLTq2tnN?oA`~mW|2kXjed7-+XB6u z7JRSnMb6a$O|_xSdn$qFL!hKeYUD#GLI$qH1oAPb)k_^BZCzRlcrr3`&4~?Yd-+A9 zv#BB at 4Dg1GCATu86%5DODDQz8D{UU!2oO9uMyGyp4m{>H`^k|?Dh_Y?+50o{!2o{$ zuLCXw2|W6T(KLzc-^KR(z(b~8F2~g2Jag at c5)!D08Y(}myei2|gc(%35I( zXv-Tgbfm`99b#ezVbqerOfq~O0=U|uyf`VBDOgtz-w#Sf{fXMU%n`N^Nq0b)TUC8l=u}=ID-eETFrnUOGAv)RS#G3I6DeDsmh% zu+^DM88$q)EaOGC_NYG2`u0P%*x!v4E)wP3YVPdOnY~p8qyLlWcKxR1P at I#cvgvH! z#920sxm-AbS*KV zNLibqxZ7+_Aeu~2lq}I>u&mo%t=mElXUQ2BXHQt{#iQ=>iED!hvQ`Jg&BtjvDea2G z_(tKv#~E&nUR>rx#bM_u2*}*b6l>BFgtMo(wSdFeS{Pe_&`9s3LrYRB+$?h7F$W5W zj<>$nlT6HMURyZNJh!REV2gChGipv zeTc5OL(~*snRh|&laJLCj+)bxqZ at gUx*h6)@sZhO?f at Bp7(+Jq@$V*MI4Vpl%#pHf z&YH6gNYJXtqz!`%ymQ3r$<`&{6I&L42=Qi&=^=J^d$Fm{h(~)ptCU1dF z|4eS3dc^dsSuD!19Z~`#KbgPK50E<73BySGF2}xGmr?iP5pANZzk|Jpsb1TbZc~r+ z>sRb%Do at TO?#q{`L~5>aNpuz%H7CF|g-R?1Ey2Kj8T$V?JLm39yX?=WV%)K9+eyW? zZQB*wcWm3Xor>*LQn9UyD#ldz^fSNJ&mS}0v(~k)H?TkZyK(k8`=&{takT+ySBMSV zyz8bJD)XYmtuvAV)KAMh)2N`riQdtVbd$#QN|nP+dNQPOwD`M}SMg$F^yPd=N0el3!2A<~61hRb{w9MTW;AibH^ov-0$t%vH9sin3^ zQK+6mZ&%gd4RW$lv%t= zWxTs@;lH7nzWp={CREipp~7dXe|Zf?3pT z@`!h8i+&fx`Eb7Eex}=ywPLHJ953i{6LwuL^}A2?3Uwv@{qi)2!*gW!p~~|9 at MNIL zCUvENQs2!33-=!V%$|pspKJ~#mHWg~Nrw9XsRJWzEzQ&K+1tgXybf%ce{x)(&{2E*qrfT;=W4>~}o7jTQO02o4DzteOPZuy+ zz6Q%Ad!@fK^K8yNkV-TOMeX+jO>$OL4n_zT8#l-D!c|kO(ATRV^}3w?Ers6bu&%yx zf3k+972wuzywOSpR~6a2L8DKxB&C><`gQpM_G87QQ!%7IB1-iZK)>#snd-oL=LF&1 zq%|ivc6$^Xe>k0L{|Nd>24RYm@!;-_;XzPhNIMG!L4TcYl|tG?R0STVE;Ks3Wi#2H zq8j?Z+IQ}B@}Z^qz-_v5e5(8cYFEs-H}OEOi|{=f?A50Im7m&42P!4FnP7|`Aj2r8 z%fu3Grfie}z7<`9DDg3B=C-`p6!>1Fe!==c5vM>yK#3k#)M$G%qfn6(S4rmq_^u#g z(Uh!bXC}l~TX-iDXn0NyyGumnD)7=uuXdi&`FrB`ZyL38yNXI3o7Kq2c9c(H86SGG zuz1Q*$+WN48<)9Moq$ge=4Z6nA;LY;=LWfiy(k<3GxQ32(bO_STy!W{D=L#l*;GsV#L?{T z>D?K~3Y>TPnm_RCgX6QVo}*?2K8L5DS=+Xo&~y#HnhmNnfyR|Y_CZa;Edx#RqYI2D zr#x|7m4o^g=CzArL3Z;2JIG-a_MxX>hcn{V3d5H%Or8MU8>m~=xA{`hV9*W(L5kaC zOGTo)HOv$ggMr2JqN=XO+N;!BeK`6~yk^JgQS#o_;wn^?_OBJqPb_P7V?oo}wqMW& zLip*-475RdY>KO2gU4TO(s4xssaqZOmIr<-Pngv^<|Ktu3Dx4tXnXud!zfJ-H5gUN z?A_hDfY-8cFtvCTjDVMy#tTFFMSprRg*HQ=A?<^z5SD`CM#W)PutHa`0!q)pZFOT| zd6Sl?sLKk0CXtM>Ee!F&;XArO0{PL10r9O&7>La^nX>L&y zDcs9-&8rUiUn0~@eC}1MQeRIj)af7RXFF1ZUm2yH>YfZ7Kgr)G_O|SN`L4gYqEX^` zW@&n$JJb#Hc*i}nzl%S7FWJ`O at sIQ4xxs8&ZO(YH1gXNE|JAqQb+2KJCoT})i~BBr zpL61locHc~PZ!NIhiKG|``&aYV?=l<^d0kE?F!Zl;pMo{AO!U;xh+xKaC@}-ZFjQy z`_GF{xPPzJ)zFwNZN7kjB!hy0(EML(^?#k5nAzI???OFPQBG!15Gkj|YGI^OP3Joe z^n%DYryFarxd25pdaLpNbq)rr33JRlrQda)*HBMILsHt!Ye8_67v9~R4(0;<+go3D z&=BBP*mnX1*>@_cavh#%1A%7Sv8y3U{icGy!c4Bp at RRQc1smC-xC0x_5Ooi%EuE9c zNVK?|*MvHQnny)BRJ6MUi07Iyveps7V>e|>jfQ%dV8VhPHK#~&Z=aNxFhhP?E9YY3P@ z0UY!#waL70;4&z&%)h^rqH?{I<;e#K!rZDXUmpvK=!&a?;x{md(S}z!uZVWTvJcsW z$8^ts1xdtJln~Au=P;@&U!Uu%EUJufC9H$#uz-5FKg0ZYlZB=?AN2e&ml_lZ2>Jip zWdG{zsp+UJ3Zn7%FD!gRRz-pkEs$;yMstufv0&1N6f=`9L+qt at DhpX9V^1UbU?Y6{ z@{*Z0!|M~nJ6;7bUEm8u&#`daEnm7=)WNSF?+~9(WsLB$?Re$W)XT;uz)C|6!aBJ!%(4!?GuBUSm7}pVzl%T zJyS`>@rX7GXDbG}dmAyuaZI`tc1gOzI#rOdG+jJaZ}ry4X!{ng=gQNy-_;iXe&9AF zph#a0J|VjmG80>@n2JOK8D?UF`qFvSW at 5s3b!@3ve58=7IrJlez0X!j`4SnI`FA6k zeM=`iPt$hoLhGbv`iTfP2y3W4ZFs)#CM_#uN?Mvh_&oP;qjaK}9^q4lH0w`Hl#vBX z67x4g9 at g4w>QRhfX8-0qIq~}{nwK>84s-rEvTfr^ zIj1T&jza~DwgguKS+*>S{Jhyg2GB9YJdstmpvt;OyvaI8Cepd5B)bgPx@J{cE;hInTdTTJibQ zL0n=&_`K!QMI1}+V+k|S5VYO5+}zxCXZhLnyzjjqAobA}PE_rAePDEz>FN#1eN?HT zn)6JlMEjN3nv3yh?X|?@*9Ac8z&KT2^YC68Oc^<0(w)HJd=0&yw{3V^m)d&3l+07t zZ+5dbJnFFoJh?JET&dUxku~-^&aCB-sk30Sd1=(QfEzE9SG#l#YW6cTpk|3?O^OWQ z>`lJmq0^SBy0=62YK6evD`?g0t8)eTMCxPg3tq))t=cbF?bPqnItV>VW=A95KFaxuV7nkpl|^d&Qz+bJZShn z^%bw}Ms0co_dXM7QgFfQOgT*LE+nlN4_`y0oVSTsU}gocZgb8CLjx^-$t+jZOBX()QLa2brIixG81hh$P1493Ee|SLSu2EI|di~T>!IGg;%U9 z$t(^9NQF7`%`wdpk=H*Z+9P>_c&?=LyyxO6Jf{vwT}f&$9TYS7tq+jazU(PWQ7L05 zM-rq=#H#{Ll(Ch*Ct;i}LUN|?L&lgl#}OA{pPLMEfvkVB2BQ^{<(WV;T3WkSexTS4 zF{6B&Afk2pf@&OzRzehZGo7*h?>skOn#lb86M_}NKtNdjJD&gAAfc>egDQmd!O<~E ze$#BhW*3cK#V4mc+!UmM-q1`9z6g#(Et$uWM&8lbk@ADprz$cjbI#4Q;N+!bd!i2Vu}rfiU17~(Y>Q~1?8%9P zXT!Qm0-w*o`Nt<5bArguf!(*`zMy)7Ki(v33h1xHc;97SVzzzbp&T4^2GnbYbzO&| zGFZ3)N2iyS9=myq+nUyYwO|vxE7X+TQ%QAX8-V46dCzTa`C?bk<71pMXel;L)+6u2 zU5^`(ktLKtTlzuryla1iZ$P~s3iLa@{MzBo8w3?{N7yEn;MHgV#bmEuwAY)^B>@g( zAJeCfF{spv^Y at uG#^fmxpf_^s5<~V0rCi9p&?eu}!A7d;48JtJ{B7{PPN3p^r zn{CUj$L2EDJ7EVRBtE`fty{6*1ftwCU&(<6rTeZ3$zoY&Gy-m*frZuLXzJ1TI6GtY z`-k5XRDf7_S|3~NXagqWXu<%k at qMMGzRZqmH}WVT6~&Z+(z1mplQVQX($P~Uof7Q? zMs}|~s13cEhDtgByyb#xN~Z;W+oCrpF+?*5H(Tk~<7*mC>H4 at s`xS8dmhGY)!L at Z- zHuq;1|05tNjr$I8<)vNkt`&4qU!^-BdsyhSI<^jMN~mLJT)@zd`dI@%y2BUOR}=#| zEsI7sx<_kjemuKyq}C>8qk=wZw4`4)-VK~@&IoXp8|1g~NUa}~%4nlE7)W3?MLE2X zFSps0aEvn9L6dxk4J040Ti>t70neG45n#B`bmNESn8{YZ6rSG!f|uAmz009Jd%{p( z>Djbb4O)InYmh;aN5_#VDyRJ@$C^67%0JhPu=UCksX+3Mn{hUh0Hb}l`3 ztQwq{F`I0I7IVi-JG1FPID9=ZDUY!WdmE?K9TLL0)KzaFoGsTJgR_r zL;tmx90 at C5RbE)S2aQnW at rAL{1J;>lIn)Lrj2sVuGPj?aQ`h-Bca>qadJs>))4H)X zKPCS4b1A8wN&n#_KE??hgB%a{@o4U}d>Mx at hx&BbS at p%ZMjG>*u^gj at w2NMgQhVuc z(_81L>`yB#BQq59tc)~aUT$xF-3qfBzu`Ue*XDV2Ds4is^CHUvs>^LrF at Cy5E!UpZ zLo7E(_3>B;nnRKMR at p^V^a4UP4lJeB6RUCX{jvfCLd at b>Rbs z!nX0)J))MRA7El at 1*B5%#Jj7HqfH*MUUs8XcL8)!O)NW;Br%?iq+fKnO`}kgWMvl| zz$(G%zYr#MD*!F`NZD at qr$PL*vxk||>x4b{+ at a>_hwOzD{DFAB0TJ|6#{eT}>+r0n_u^0}p#<9|G>@_$u{ztrJ>-UU+9lfh#~ZD7c(t}c7j1CP~@@jgV`;qkV;qj0? zfW8}%Ii&52xrj$e4%~IDk%xq}l{>aIZPh5iZ}A>tP*cZxo_Zm7EY?E-nPruOS!0wp z>97aXmnWVZ3=8K~JF2?EBNt9Mb-h8VXeeDYB7EbAC5v>#iukL#=|(2qXMM{w62M~% z*G-so3I@({u4gs8KQY4Y2mz&D?ziqlEL+GT-fw-1DN z8REfO>PAhUR5Otx#9_N+)0gnn*p%@Sd4v%BbiaUSNFXv3UAtvy3e8!%Ju;%Ubg}UI zvKF0u4O^zssa9TJ{f&PN6CFP(6UXji-=tcR9Q$JW*@2j;l{uDn7YGmK=wLW$@(zLU zSKLSN?mnuC(^#W!lsXOLx`*?K#%IY>J}OEkEouQ2?cSxj9p5g&%cF>oNmAdQh1c|N z)mGi#9 at x$CUVt-c%_7FHwZkv?|8CyLk8{!9KjxJM`_Ik$*K~)np2817G`>apOJxmF z(KieDi#}taVZ4hH>kI!^Amh(mw#ge^V*Qij}yf^ zCJ%LDkhw&I7W2ljc!T)IyUj=7<2znV6wG at Zvv1Qf>1SO{Hup*1HrzO zS>B#jD1Vu6ZfX>MpYQbF27N$`EJ)}6U{Lp8V8Hq>FIWE8tXaF$ekO`=zK_Uy@|sYk zP+x at _BYFx==r_wXu(p^cE*(2Ja&NuBp+Lf+FJwqTU;+Vzp;%qSVa5f^sTSs=tPWc< zQ+3+{exM#f`l!zB#|43}a2^4N!qx4XuJdNs3higow958!6LY78cc=u1>XnubXPc&$ zwo>$$9D~Y==tu<2Ts-DvSPYLP7_ZN!R104SX>OZeDUQy<%Nn^9a$@l(qrZq6D%d1k zQRSKi at t(i0$QJ%n3#KCGi<40ra+W4L6(W*&j#hg;Y_QLSo-&DCJx{=Qsl|p}QF?F) zR4Bwa5lss_rd4S8F++mCJm-FvEf?gbC-|s*`_OTZYHX#RBFm)QSE~1jb z_b4ziW2s0=8;G4A8_tXi(|p`D-jYBKjGB|c)$nz3j4`^@pUbu^+I+|XWjx$o!C4l6ALJm#xP6z$4WKshvn at 02^Q*0=XJc4Ul$?$|pDhMmF)d0WnT zh{+);h73ugstDhcdFIj(CtRxs_oj{1VHR_L zpuIn~{0JPnbg+CW(QFpOLJu+ at D5DXQPLX9SSfp)UuyI+)!b!YJFJ34GtKP?sJDT1J?G0E~m4k)r(Q5&JQe#%f5J`|I}%o=efv#T#+HPZeL(d!)P*#k6HG^i*62M z>f^86_gN~)9s1j%`KYO0Ir%@H1_$|{dm8&+o~EaQCV|Gs2LJ#_FF+Y0OR at MvR)yTZ zh{YhuiXthSCec7s`{DxK+@~(sGA>K5%T5TdhoNdR&>bCjTWms8$mzOI2mRhc-} z=P^%N&t~zrFx=|%g&eFKWsV~g**;@+7^Ph{L&DG?i{qo-(*nk}00~I1JBSthKCFvkz1aaxBdLi4m*5I7 at -Fc zD!DS`tJzdikB%z8RjTY`kGjdiOf6I79Y&)y5(xq23A8!xgal4mRbq+HAWLVzlHBrr zbI*!Xz0>OLt6IN(P6#r}WOz7t{4TE6fX*ui`Aal$z6m)?KL*o3f*ZXBoeHu-c(Ts% z^D!~L#0!fhn%iQu at KiNJY9sTW3|@4`bAikjEa^VCiS5JAvfvZE)935sywsqWwln3S ztoSr+j_V7&ZU;SG2+x_*bza#8RE-2*#&G(>9;wSlexxr=|-^vv;YS~ zksiLxa<)}Mt48ccg%c>tcTBr5CM<&4o*|}FO_CnL89V4pz=5z~-N&cP;csTcv@>zs zkeb!@3V6!=4)HxSwkW0OIf+ at 7X_i&AH;3k`1>lDJiATiDcSHUyiDLm+x$WSRR`C02 zX4SYt5!~Q{m?E9YA_HfId#>aGb}Bqdd^y*(b8%R674>s4z&rYVYAzhqiE^Zf%c3j` zsINC{RX{aI#1}i*;I(@gI-cPL6*f%NaX)-c6uU2C0E#xDS%|ZrAK3rymiaf%m5G1c z^7g-QOOAhKMyh(wi{fZ}U5!Pe>L^KE?FI6a63Td85e0%{n5D$v%;FnPNbvH$iPOnSMS(Nkvl@%ksRY6kU-vhx1(WqXbrrY8`&C at Vq0gQcj2S zUWdeEmvKj%(8_alyC%WG%=7pLyG3X>_xmu)@W$@iSF<~%J|Z)T2(u{|O5fFaJ~Ek9 zLPdrqti8_TQysuN?R0w$&(c8661;F}bo(v`o;E>~6@6b3jl8{M^8JG zdLgJbQqA=~e^*KV1*uA1y%K$O_IS9Y_tAhGa@&=*dEV9MZCCI=#AM^wRXbYYhGH4QUs4c3HZ>r{Zie9V(V>*<$JF@@V#7qMXz$Nw3rXH!?a~0z zIpR6S_)!8B(g?G(m`EA>n$qicKIaO1mF|`w(!FZj{kPaX2QTNEE*I92nV!xrEr<$TK#1RT9Td)wSXdHZEv(!Reh~Iqx?Z5ym}BQwCQ8tk zFHYD;dHs(?%Y^&^bvs?Gd&hH1Z+$EhjCCP)=|sv#*r9hj zbYXz~iMT&M&pEt>L`ND!>n(??V2d$X=iE{?>Y-O!Bd-3k at F(A1lD@&oi48q&Zf^rpNtX6{6r*CP|t%^gQKCK zpidm7hqE%J(>!U8AGSkvr`s6jgIhddb=n>P5NM{05e|-JAjA|nx?KT8EG(t>tgI3X z9=`8!?+WHkdMVy4 at 2@}09Kz_()*hd5bzbAdX-5*x!J%YEbApx4=ffSv0KX5<*$}El zUL~V6Hgm|9N zhRiK$$q8W6F9`FIc~$iy;BJ)C6(uZi$+Bzgyz$s&T_H#W5YBDiu473bU=Q;(rwhllD=J5qnf1+HxM8OnM>51x=S%B>)rlNea`p-IEv+o-LSoukjHEGnX&|?gJO-)lO zyxaVC+{zhoI$?sUc%$ZqS;UU at nD;)u76w)>DN_xvhB~rA(Lojbwi;C)B!&un@=c7m z5FG^(suKU{RqV^^Rb!={C=j5>yniVH*FHzTXn(I1mLYl{j`XIf7ys` z_pt3RO`k?)Sb4v4nOSk1AIvyB+l}wrOQ!ZJcdY)vhZB>)k1XcU>-ECs zC`zDB?vx&XNIe7QmcMq6%&pcOxj?!)>Ujl5`mFj41)eS(GMmzY9i5gH!W5)V>CNWmwBaJ;FWYF9PyWzv=di z`J|xb;>Bf>7ix3L?3mwrJn9yBZ;yl_f9pnS45^ZoF(+xtP at z)dk6J>$U_bq>*MNTW zVHx-bUGx7!kGcQqMb0Yx^I^lTdKWEA2vsztW}?d=v^SUpM`FWFRo>+IopG~_W|3A_ z^DgqCPtiF2ZjU)pGU-Bnwlkqm()}zm6`YemIk&AW&h6JNABU}9{(0X)(g%HTdK`bV zm<{$fKiK~+L}cagWW|W&pp!ixtJXiF+h}zh9nb?Z7_gfS^+^MKyY!g|!aKuh_8=@A z at AXA_?@7>E04eU>dUY$&qKb6n^I?F^DB(!U2qP|ovk)p5zG=gSno;1y`A-bUQ|0|v)2=|c#Be8%eu z7s5JbzLDU|?it2drvU1#w$3h;hq$kKKrmQ ztx7U|T`R_y4}r67ge?%y?6;SAQ&l6&K+TG=U#AkC%QerWpl)(Os-Csm4#%N|Xu95pVI>pc&o4`?VWh{462{?W`u7}tajvLBt zS(UV14 z1eG4nZlj?-yf74{Rn~>By1=>s*a-op1IV(dLKivylKu=iz^(|s3qci#mfn}QdHPr%vb%t z at S*BQBL=O_`G`hxw1XyVZ&~4QIwzV+|0U!$XvPR`|BFC*5lW{Cz*a z7=}~At2))eAU^u?Uf;wQI8EFUa02~JHQ$l)u2l$*bj^0VP9r2Q5Jc?AQkuH}xbK#M zgUccP>pv?DHDgOq9FChRm`wPmrJ7LALyl4HO`kuC?k^hXu=@1;G{ESBv^9|vudY{22FD0SJ?|-efiItUmy!K?rRfm;d6ZxH<-35UAHnwgma*FjBAt+gDj2dgqXylJj!7v{_|FijlXRy7)A#GEMIogpVN0C=J*8B;Dc$wlZ$ zxcZ~Q45MiM8^Cz_^SFG{Or$(HRAKzHhn z{BqWQ&>GNv?D9Cq at ik7q@2d?Zl}o09;#)Q;*gy|MtF#XWPH3%G zpBlDI at zS~(dzp9{y_!S*hW-xL`;;FMB8uw!D1kj&-GV|6$&taA_B`Xx;QjC#H*4^v z+Jrrr&EC|=XxwrVLt4v`POII at C^Yaf84YkjE at Hk7FYRL7c#P|P)q4(Jd%@GS$+vq7 z547oO#GWU~)`o(=uE^@7~-BxC}fRf<3G-cIE%Z7qJ zCZC~4P^|Yt0M#qs3&Vbus>ql$$_kgGlA|=g at jgY zbOc~GMrY*?W5l$2c1EoE8yb}`sT{9oG31MXfDcMP0M?nR&-N$iOdQr#5}P~gl7eJU z=oG%vY%witoM>-0h zQ0%Y#zB~d_#@Mkam=6>qf2%Yn@&pa17_w1Ux;@PYO3x`H4mSKgtbH?IrhVX>&)7Z?rt zf+kI}4e286RIkyukg$vtnu|Bz72|SS8Tw0v!AAc;ImfY`i_8R~o!lSB0#Q&Tr+0xQ z(>}9+j;{w1Q-=`?4JH{Z0sZIJ^oe?Za+UazU+{8x;v=HcAwwhLs7lfRyOkDC!KC7v z7`cf_{5uze?lyp#fQLwWClbc{4x8MtD_SoOUJ|XA2BK+k$23YL|31_^|Ec~P<%$h{ zRst_g;s>fnR=3+&ott5!DV6?2cXCHl^YUH&kDyornj~rbOBfywQcMNj>b(jm%qD`$ zYdvs+HO=dKAjRO>p|rW?ckNC9ZJJ;yY^?0UvpZ%dCc;Z3{5p-f$ohPCq(o04_EmGwz+dik7ox#Sa&mWMUW`Uj0<{sh$^3HMOj zo$g`wy`F5!I_{0Jd8W8fR&ckMsROj9(ex|E0uKsZYbC?(pUvrXNR zZP#hnn={)WKHFiqDo|Qk>?HX#_y1cpD5l;ob at B(AivI>0_Wv18`A2(hkwI^bq4@`> zUy-t-PH~FpKcR_7^U2 at sZ?np<4U at H)x}tk2@|hDgx$h_3iDTKKmMbzNT$!HP=o68nQ9_7fo2{9wh}s!04cdY_SoWZJ^5tp0kSq=5!vid1o|d#dj6 zf=1XB3}DPS;Z1vlWA$&F-FgFCdPyHc<+*$D;}$U|5I+kQO2bIdFSE=xDm}lf%~FOjKzy- at H3eG)!mWqXAG(?BNMS zwalv4t at Wzw%~&`T8b4gw)#};#*muRkuq(}*s|(g3WSE*$C8ZvxW8ve*hRoOn=!Ysb zO%3k=>^3vzvY6aPD*&T5O^q1avxkAmu at zOcd}Cl_v$^F1w1`T#Dry8bB)>I-GE_ at a zCUGfj2ZYgdC0u9x&rEE!JQaGms~)1Zv=&~GmJ12iM$``W9H9&*fKkkuH9zBtqalmQ zk+Rm})ESAG{S4dK$yfFxk>jq%4Z#@khhV$vOHc%Y-;K>>+B(!DxuuEj at v1o}k5bJ>(=0JTm^VqWKrEAf-|sIZ3VA*5i~N8-Qk8DgCwO!UQbH6s8vhdbb`^@~gC z6PRPfrk7=dbMq3lFfx{?7jtP&z}HY2)xRHvi^y+A*Q}8_lJOf9Mni78LNABU&nkl9 zp!&iZRq#IlzOPE2ua!mUzmf74*b4b}n>8=&M=O>(o|;f2;|C`5aG8IB3A(;xK!qWg ztnSJA1m at Tqq5XkGNrmBLGbfJUccXg|>uZtop|vvlizIFfq6Xz1K})=q{2BeQPEiKv zF99(q1O7~T-DmMV1~y}iko!7P=b+#HB1%$`!XQV&aglW8RQN|bk`R#omWDD(w3TD(4++g=gH)37v}6)Mf8bP^x1jnDT?o&hwlx#U=%-s=OM at S#X^q%9o+N2mha_} zisUu6v!^3 at P>lz=Lr(-|8Gmrb^Pr^ z68niqPlx<8yCv-zRCt)SGk_+Y at cUx#0ey#eI9k9*v3dOC+)BYv#@qNJnTR;8!Fe* ztKmuqn|C?OQiX@*PQq_KZ^8`6r0ygvaQ0WbSd-xs zHNn&CyYMBVNhM{pCTBF3c|s~U^9H5V={Wx~4Cw~3ZvZ#9MSO}jKDTTv> z&D-a{r7%--6iJVN0#YFi2nhH8AL;*xa}^v7EI!P3hJj^FoFvQYQsgWMQDfswQRo^G z6!PITRqIM$y&Xu-&`<`MvXA7CAU`>aOq{F?d4WfrPsR0PhI%owSfP;~hgs(<&lx`N z$2xz%Pq03eTnMJXIH1!PLRwAuzNqLRs4tGZ$w_fRnuA_QLZ*lN4M7T^V at 9Oma<=26 zZUKe4V_RjgZb4Y1CeLFuW3*4vf&SZQa{WxX-nF0kl$otcQoIQ&QovpOBHJ^!#lqjR zzr1KPs?|^rwQF>dVb0WTDA-dXsn#Owh8?))W8bJfQLC;=?iF9Muu&^70$zYVNbD(0@uL;)ygt?dG z_0I;`(Y^27SS)%z`w{n=Fa5T-yg!?CDKAlzkL=crRo*NYwJZ~A at mpbMBM>gnIjz)$ zS%+q3vrv3X!En!@y!P$T4X>4D9NI9P)>>5k4%r-E04qzvgRS?4n^Cwc73?*I9;T9y z(d`VH$vZS#gSC;=y2M?GhB?=#u} zpazxg!Dh<8?r&(Gq=$b#iTAhBxS*+`nR&oW(u7P!Wb5bvb-+}Ik@&t(xj1Ituj$$4 zp9`1DTdi^$1QskZLTn=7(?04uP6TdQcI0SYvQFg$qw0nJ)?Za`@q0>W^AZsE?iCo4 zVobrJXkHvi)kQD5sn>2pJcUFzw>n=1+gv`SuUdp`m);(NdFl3IqR0UUPR>{+jvVN_ z^U8fj12{!4>H1V(E)eD?{O+OYI2Ymp6FI6LP-ahlxpVl^AZWXL9 znr%14$hl>~J;7a~lzt>MyW*S9Me0SH9CC?4kq_}^-=09eKt+6f{7p^D zbqxKku|PniR6sze|1&lD*R%54o`SkdO9B>KeYn6tBvUC+sd%~pK!_kp42*aaazy-4 zfMR0#|Dx=jgEV>CZPD(YcE4 at gw)M8BZClf}ZBE;^ZF}0bHEr9*`F;27eQxaUMx4EG zL`79pRzyYqu~t4$WoVbb^ZjbmU~7NN>H0O>X@>hb%WIqTyYtu=#C#Cd_GI9% z$84nU)57^M|Ao4uvO_O?dmAMohJpX5&LH&jkrC4G)j#>(fc-jL#^EryLYm=Ch2YLL z`K-?ir(NGCV6U&3j{9uLwc0J8ZCZ3{Tlh?|Eim}nW&iz#h2!v$MsGLt)t%hRSAg`z zKSI6z*0PI&uyzQsA?1AYh4_Q%{WUCt&_#s)%5Z9hb&yc`cHg#aM851rl9O$xbo0dm zIN4!mFM=?T69me+6_#r#kn7TSyjC_-{^G%z6~oEg&sgT(2={07W^1osTla;WlWm`z z0od>l#%-OVyU-d1Ae(gA*_7NJf?L5%V zRk7#5>AaH`;nuke6!VV7?O1c#49R8y$`5({t%JK(zV+qQ@$Xdi?uGAMyB9*IL^5r% zitiINuVXI}{iwGG?_0ouwTOQd@?)zIMZRmbSl1I{V#E7MwYl0;-FV!;JRQBU;%fUh zrmm@)5xB^Ng at 6dz4C#pv`}+hLVChpIdM_-p`_(JhyN$bua$hSpdJYW;{it{UDY6=O zcyrVe`SJb%FXU%lXJ~aT`m at CoUY1+?_fn6Gh?VsDx{D1iJhb!!@vR2Ys)3-Q(L&a* zr_CclDkSZoyv0RVVy>0n?=WvsErJpoD1>KAB-sEGVF&HD8N!P at aW3Pzlc-CWI2_Dk zWVSwjsV>;2{M}UvNA?U$%f=OZFQ;P~T*Zc*iuT4t+PthF%iP6S1u>`fidJTFaNK4% z4sr)v05rX;bh9Upr2|Al+mtjrOO{5>n#B!#Q5^MQ-04|oD~0xMNq#i?0{HP(9=v!H zzn{#xcpF`^R0->|^Afw47Z42&V4)je?%%NzD!iK}fC2rxz&bziB%#+LjunSX;#}9( zPNy20+s7~i1N5|e(>A<2>KSiisg!{uq>>RY;`IkWyqZ3DtfKO7K%S+Ljf7EGBqb`* zV(~8v0qtf at -i;6B?>MnS8Ow?tBSf|r6Qh9?cc#&%DH7M8xUkm?%a9gOW%8uZcG|VI zSh9U8n3`cc%8kRwW z7cN6GtYf;r%9iWs3m&1;@NX^dLQ%gHYDx+EU31FAGR{Lxu17icjCt6h2?kur+jSfq?@C at 8DX*{XB;?N<=xCdqO9C#+6@|Qq!{_u!A)tu z)FmvXOUdXfx^D&R^dlumS)6MZI at L^x?K*#@h1b8971)jtA1&Ck zJakow&?<|ImbSMAxD9YgtZ8PZ@&mFBr9PhD3olu~)mMKj5_s1D1(z4st8Od at W46Z|~+ivTZ>*m~odHTQU(B8h#|bG-*Ai zpv`=RfiqXdOEN>~w9aec5G#?!UYnpC`@WwwGenwGm52H+^fO+={}LQJ)0*5eTa24G z!R9Q1J<)U{I6#ukDD6q6+D}`l28_DU*VeVAJBzo3xJ-Bw3Bi=!cDYMwB9j*hdRT+M z+pNPy`RP~ZK5;hfgc$!r%#!E=Fz{rW>2yl(${J%mlLa%oL_^d&hCINWWQ6Sg{(u zLiGS$=xb1A!%TV_WtAd1cJmMI?QswI;x|iuAj&TJJFi=Zu=U+9WIrk%q!<8k zRwDXlin|0}?wZ|2PJo0vm4$u{s8Fo^U6OJM&yMY!Q(^gVqBngd>e$rM6g|h;gm5vv zg^J|>v#wk|z_MN?`B&v9F<`DUbU?A*uyU?DVArsvwTQ-Ro(yFZF7oZk+{ddmScKRn zuENE&<+RGe1XHZ?($EA;Nx`U9JhUK=R|weRVxY at Ka29I|oGpcq9MVl^e=qiE+Pnv@|Vr>}4?uC%4-T- at n%@+*KC582ES z_c9i$K~Bu^ zSONriGgk52Jb+`di~ejY1?)z9){z){NX$`ddHjcdX zZ*WMc9l!ZQ`C3f;^Qva<4-;awz_HGGT at G#4`0VwIyZpt)Q~nUifKS1vmE#sxSrMC8 zV~-#$ajyRBTQ}?65QW9Q$9ks$?=_}c(D%_^q{Ww3RL*kF#A%VmS?zykHhaIsT^pC z4R!=*AcBa&L>B=+A8Tss?Hp}-=2|m#I%lB&em}36i?%3VN1K8`bWbe^%zjzUW2*K^{4JPF;UWokB zGi5JOh&o`T1n#hUO1GMbU&!BsT2CgUHX%@7px+NWPA|s*@vQNiPjZpH1+3e9nx37$ zKYNh`?mxCvZpjgQqH5i5R6lSVi~pE$tw?dKSP^7J-XmccD{RFXk&QQ3;Iy253u>rp zv!lh%qgbg5(c at G{T;BdZ5wDz|NT|3G?1y#Nuc9e{fBiws5{E-mWl8-N1~clnN)|pp z6?Dio5d^m at M^iDRQ*Vz>`@7<;tu?(ocfe1HWRy0#La>QO6V$XQVj-PIPh2Al#$kV6 z1_pPn>HBU6_r z at 0&$uaTsu#G5W at uCqmU=tE<9Q${$;>-XuW8&vFx%7>@N`6p7K>!d1`hq44}t_!jT4 zG{A6}P5dP<8BOm}Gu(svOWnlve&GgXza{+z%U^%(Tt84%)}>?kY-V?tXeswzDI3et zHkep^K|qUV2r`ndLnk9cJv^EHoYL<$@k6G}7xuEa7&8~KxRBFI-PcaVk`o^N^oe-}G`yZBez3BXLskl=U`*ckqG5zu;8pSC^K*<9Vd6KY?!~-Q zggkDPdnDbIVoRN(?wzQzEZGqiTWcJ0v10$M0&qC*EUDdRcNf`Ju$yAz2j;@hDuzS; zObMw~#XW?QsI~Gdhiqkb zpQ1brXORtw)7~1o_T*;9Kl1?Q^1to4=MC@&%gW*l at rtSBTe7N>u0o^_!i1_62x&tV zD1y*8-wc7=Rf6%~h-!AF?YFtCSRVME{hAfOD4 at 1TcxNa)1y$Ox`OpTm&5^KQ1dx0vl+ zy(o!}ncBJ#g{SKsMlXpMX)?uk at 6m!1efNW12=liPS;Os=0=ZQ{z)wBO%MX$GTzak# zy|=}kn0j!7f9XUq8d0{NnAfsSUKDsdrJ0)2r_S9wGF0<_quUo_efrjnAoi*X4;xxK zF#)9-pKa}l at j^*F$3#wgz-~vwF==C at u1v`Adnv=el;aR{Dbf)a61GR at l1>|;xznk2 z;8$ihO~Y%G!}ukrYJw2wCILeu5C-4w#~g%YhqY)OiZj`PlwP88ZZ1 z7Q+3rcP?+?vTLUYV^xpr*z_<*F|cEufP33fx87Y;##ujtbAD^eA>#m7FO zOnxawQvj#Fq%=RFG(Sl at d88wK?bio;}2T zM}JU`Fi$VZ`#)F=eM4ruq|)@I171_29=sz(XIc~1PSXerDB)nOPzH6_|Yvq-4``l*qRy0q^#$&P>JvSRzyLv&hU%>G`W z3pz!bDg2~6<3?cJ at D}A2&*$1LqI97&X1qsFjS{wK*dGl)_7*)xy`)OQXRSp`L006Z zKd?@4K%g6hEgO;If;+~>b8ocYLE%F0fz;>ZzA;VwK}h=G)|<`anI)RFTA@=cVj&G3 zzb`#Ht4FC9F#%H_+l%tk^IUCtQq?XL5<8bHTarb{J4ATyz8<`~v&J36s+v|ygv2d& z;39{I1c=~75ZAzo?AfcOFb5}kQpm0c=2QooVNYE(Al4R_gTqh==E^;ItKyDWlVsJM z<+|HRwbOv!BV{gD41b6VY?{i~eaIJr;e`WpO8oe1t#{#% zcfscF*fSW1_^cRJ9GDQtFQ}-tBAj3;ti(rF-Xp5QQ)4&a=FX at DESaK$-6l2O{w*HN zT8AGc+caAVMUgwJY*D;INwNT3-=-$|Y at csPEXXB#o_Bnnb9_$3Ma0 at +3?@`~0sV4? zaZ^S=>Mu+Y94zytDyJx7@%xG82M|DB=cQ>{k+~rVjTls7h<`svM`&2WOsKKkH1gPX zN?vAiX69l7YsU(~#tPEJ`t895R=Ojk5px}?>OM*&-KY~`TED_$fc}v*xnyX+Zko8j z&#{I_ at H-c#*bX^dlUV(YYtn2?BYBC0U+S!TD~<-ef5u{)r9`UgFg4*2HK_q8*O_jl zgyMRKrJ{ZL$*+v^M0V+WM0O$h5}ozh8vI55lAZQS^h%ppnNfI*t2OOYmnVMf`oQIb zZ&Y_uEz0YOwxvz*WTkk&y4etymt at Xe+}w&BHcBd zIFQ~eHxg)vRN&)wdFplFiu^-t at Q2($KA!z!y6%o2W}33MzSZn>>Li#SW`WY+Oa*lw z=6e+MTN0!v)x80!XA`U~=d%oBk+1#nY1D<#J3a1?@TfldfnVX}(KSoa{0GXXW4Ld- z;LKJ|A!o=$d{J)P18Rb=@Vq=yH^W at +*lJGTALwun7$c+G%Ou4zX3)c at Bf+5V!-4yo zz_Bfj3H{>k?$M=3C0M(1ldZjG_edki1Fi^}t-G#bV?%mIX at Xj$SoK}IKyluwpZ=PN)%zpuP$goHCW)X;$D%D(Iit8eOI%{T2hiR at gM#)?6YDkVz8_AT`I>Rd2cD z1EWDNA0GL(BF6XY2KN#XVE1D5(oRoU(|n2#^r>GOTUShOp29Fl6a3=q?0Pf7Bozk3 z5{klOMMPp(-0)JgkagssYd~7}rGg-(cDBKU!biIq*&p!}e8!^Q1 at QX(hDzp08 at hmu z4t97!6qWsUEOir!7k7iEUghQ2T5Hd7#?J!h!=8aQJPlIqn$}v8?Kk1w7Oo_AH4Bw! zqYg^rA637`9`W^wvo{e!VhR<`UT7xWyy4|s at q$8Pcn at fj=V`pt%toxGrK?tc1+^ro z6egU-6|tz&gstsjlz%nK(Ox<9`!MeI#M*Dmw-FL;q6WX`yFs`9Ko8hx+LA4-o9x(% zO<#UTY2Q-2AOELkQ5R+Ah8K>(9=ePXg)Gyy(w|gxr3VQF6QlcQReh%xqb at +But}2y zzx17%t*ax;v0`f)%%?OGr}RM;3Z~PC!i2AepT;Ex5het$u#}kXP#tB%^N-H$8r!f4 zUEMK181qINm^B>09Y=OlXx~<#KLr50`N9RYNGDGDNk$x35$GsRA-z?~x+$yZ$0}0F21PaMuqsp-P8tI^o$s`(i zlfk0nk_v at M{_ at nxkxZE!lVFO<%hCa7A%Y%Baa-i5K#Djy0h&`p$+x0#G?YnfjU)!h zoN1#S8fkz^#aKRuzqY1%Q~(z%@{f8fd6p5utZ?#%S{0I=WXh#5ortF1BZ~vp&|c#Y(IY_93%*X>u>_NIm!NRu0YU+aI)tbn6Do zLNyHprc}6jGHcNHNf>2H(-c#7DeDY{XeKSQu9=IjxT+&7_5dKmm7d0E8Oy5!1nW!f2vdQ^$NO@`ICM{=9_*E{20d?-G~(%Ug0k z3tSpb_e0~?Du$y&(J;_4-qeVu957#mIVW{RjtP)@y@&BY&zU@=j=RHze$~vp`WQoJ zh~rQr!qZLtvp(I8IU3likJd#VKJ;`FX`_5c10{=lMeaDzoYF;(A~l9a&iJk)w7N9} zCUJV;6hTUtSf2z?n|Y_FKFx4{Igh?-%YV3PiX+gxxr55i5xY4A5U!khd;dQ z`pe*kFNlAneZBv!B(h89!{mind^-9+6u~%*8jr|)MX=)UF-4x%aGoK~%kvH(8Jez$H{n{7I(?Xd_#nc<0 at 2iNh)3o zK!V&;f~MI433 at 5oa8h?2K at Bp)eu)Z?wh&x at l9_gj%9w!`M}|N$h_>}BwKigCw(ggc zjj;e_?b{<18ky8|J&YQd%E~soOMcZne=)DJAZUBhbfb?LW)=fo8Ngzln9;bc@;BQT zzAkKv!;F{Qd0LxEsD at QPelmvFtOwh&m$zciAQ3bu(m8K&Wlb!*cMb_;o8f at Z z1pOYPjSg%~QRIHaxr(Hbk_V#BNEs^NM`@O-F7Qe$@J2(1SUF^`<&~Lq8 at C0xTMwq7 z0jG_C9aX^oK_f1>!oNR()5B_gq%`AWj at RJMjdf2%&aL&VJGR3Yy36Dr)by`27TA8E zA=8va`bt+JnYVb;RhuY=k3Ae~oWuc5PDI)lcJH25=TA`gHiWhi6aUr~D6c|5J&zm-7+^`>8r6X3LybZ}dCZx{A*V+7mhfY> zTcA3Sckmu~+a(BeJD>S?1(WyboFf1z2uM5Vf9GNKpS3{$W$V>MVMA&_5Q%T0D7?B= z>-`9k46);-qFA9wDnC!-)(1DG&ZSX%UiPf at bqDH2ac>b$_?~GpYapF9HFl=e4J4H- zdM?rdrBEJPU8)-iQj$k|Tnm=ehT#fRI{DQ~*sR8h)<=~_m{&5FVlqUn+f!JjqJL=; zO7cwx3z1S?_P1irHQ at Mdo)nLyJ#vX|I&uF_R( z`IE~W;S)}~aOhwR@!nblVPDMkC=xOH!Ki0fd#JzFcd2V5eQx}N$j4#HBfbA78|)>D zOlAxQ0s;^5-xcU7+c`R$7|R;k{~u|vXcZgz1qC$UE3ESl^z>eep1iOh&jrrP-jbnY zp$5OO%o|JyKU`OIrR%LyYe=sIZifa_ccAvo{6fON2i$GTMT!iIG_Tude5O67xm(Qy zeEmKl^CC)V&^Bd>!-a7YsY>z-igxrOcHUvt&`)4#0O>z$kGI2jt>m5Qg5CoS%Wd0q z|2pd~VDO~tuFP$8F+L!d4##P<;!SKDXfQ;TVrm0!Wm`r1O3zbBU7`NA++=jwpt2~t z!P~aBnT`2C4}bDi&VWE(7VksbEgXIJ5Rpku+1qGi^=#Sm={vi+*XGtLMI?5uH2!X~ z1g% zQswYgR9iV8A4fk at _qXRTjkkZ>i5Ip4hhQf^6m1 at dt;)hZcm$`Rt$YV&z&bb&*xg^} zSpQzc`1mbcUbs(VGOAAoME_WB at Y%JAB(`z=?k+>N^47N+k`M?D56topruIfLNTWq7 ztZ_V3NmR&}l${4DGf0oJrki>M|74Rv_6)CLA3On7D!!wvo5vjFpJfQO at T3g;@$r-5 zCe9T$l^Kd#Y0>T17<4t0aLEI5m3J^qDCs{V7obUQ?*n%4Ag0|A&thtyCR-oZLgIi& zlQR&A!7_7*iDddtx2Pn2c%AkUHE3wuFhX)B at pFitZr%e3 at Whqw^Mvxy+SeF{H66m|3}^pq7o27YMXkB9p0LAq6zs7G4N}_{=MV0 zqlDg><-MlR?N#B#NG^!D*@8Re&rqF8x=gJr7RrWgY~XQ53h9&hXU)xemldj#c?V=G z?`GoxKRD`F0J||r(9^g>aI4Mzt^yKDv1wZiJwV^CJ%`cL%bSU=RyjhFA8U1_>5A(g zsOl7ZjK;R{-~9`!+`YI-a4I4i@=C0UUMip%|O9npU z#WzDFKAAO-6amy6ZZe;;&vCZsJN1YSnyE8bTB&{EpQ|5s1T2>_6ZjsXtIY at aPRA~~ z at iD;{T%nf;^dp=9^l?MEuEY>OmfbjRDbG-302R2TFo+K^gJntret7B* zT3(Q7JFd_pNpkKQH{$(O z>dcDmogO#{$X_ at R5a9n5sbUt^|AZ|Q`$X!J&)&=VpAo0Mc(P((B#LItq7^mkC!1)CUfYh3VT8uCa+)T=! z#8Pi2CpDvQgi|BNtGmtQI6Yl;SAKk+Jqv*93?yQqw6O*wSJAZL7H)eDKpV+M@#74S zXb=ulj)rUaV&S$iQV at i#$U@|XyFehXp~TM&8EN;W0_Lg|*|X3?51oDWzvWhNVhk-I zCR|^xLiPTc>n;bV)mKG~vEvYEs8*M)w6|E?>lPOA0$IDKnCdJq9Yfu>%I at BygGgFi z9||Pne{Rv79<|uw?)^nX;PMj7-kr=aenDhZ@@}%Uk`%?flGeZPad`Ty`}LX=8M8 zqB%ytVETClvjA|Dd&tPPGa}8Qb}KeU^%Q|9R9eaom3 at lTl@{#({*y(OobP$wB)+h~ zhhWpX5~;&AZ%( z4`)B4Yz>+*lYQU5KZtK5Y-s+gPT8PTmS~F at 2@$$Wq~1zt#|+SRs)KZN-zW=Uww{~} zC!1nNhTG*1^%FL}N>3{d!x8>U_0yC32^^f zWVRf&N6z-qb^OkR%}XJ(6fPLtZRuKoKk#BqbPJIC3W&$wwOf7^-;(bZ{4kFJtjN!6 z6HC*D;~q>p&1Gc9IY}$MQ$(MP-!=OY*^$^4DrF`(@oY+eI!y<3inFkckddNFh^-R(_-|ZY|5kx5!0UI0_m1E!tJp5_ zn=CC5ai;bTKnHyNn~Z+T9oV`ABnXHW#((Gh@&Arn|52c%VdI3Vissv5w?VgYGq0qg z2Ts={3zx4-lb~@*yV#OHk5U%aA$4a*b1Y^|RZ!egHj!wP1-J_KQo0ki zMw4+FDo>qywx^s->$+67hI&65!;%5&1({RJG=hZ^p`e;d7~TsKGZN$F7BtdCwrXdc zxki9*ht*kNLqTw3OUbbbDL*7;QWOrs3=WJoYqUgbZ3YOlMY=`LOtlGFMj|&Z*po^y z^6b^$=d-)@Ew|UT*lAg at qdlK^q4|qyV?Iy+ at aduV_BOT(25n1WVi7Q~My+v$iz-pU zZBfct9*vG)Mg5eR3~~CTxBP#`d~?Ty^f8aqmxUKrE at P<8Fk^GZaavN;_O--FIpMKG zEodjDLfctp=>KRctsjIAr5S2xWFR|4o32fqZLTL+!f@%kG*yKV!ga;`5-}+>3(^f+ zR&Ue=9kE;@zLpaM2G~FE=DNuOXovlq%E%K{T%y25uTNRTQ*w=K|1PP-DX!23u$@@W zW6YXcl#^$o)7AF5+%=jpTm at ICldmh+JvD!0FCN&8sAMJ+*!3RuuL z2=Zx+8V<@Z(x&{%++t!(D?ycNv$NGok-EIm&9leaXEQA at O8!tRIGh<}Z(q^oGd1U~ zo`*Q1Cf#U{rZpVO28=XxOjodMXeH=-B%aZP4_kKXnx2#_YADiZ6BSj(PwJLCC+exF z>!OqBuhC^^k2h2bTA96C?=hTKm?s|}8~hw}k%G$U0t=cy2igmfDB45-uYpYP1a9?rd=Cu=*<* zCykb+rdo>Z_i`1fzT1OgX4g)u)@zR*N((vGis+DvKB}_rH at o)TmiZ_3L$0yO?vl!) zfH2R0u~gH}^T0QtoKrR~h_}Sn5`x{xh(R5j=>}P<_z=0&bu_YJ} zO;VWQlG^Baz<9DTnZCHO^#Cc!Rzf{o?8J$v#;`IM-JT8h^^Pv`^_V*$;jFrn>eV?a zi0PdOwi&Zpwb~#5fOlSe?BkmRe>K7p797GccL>U#-gNt at -ZcBHn?wR?KSbfZ9RP~) zHTBPEx9z_(anTmHtL-AL_V2*D?B=7;d>C=$C`Dtgv}#GU7s6hyeCeZ5OX|xGuSmJ; zizpa|Wir_*C%rACTvFv=R at Gl)!s{3x3!ndP#NFjcDK!On4&{-wt3YI1jvJzPD-tDs z(+;)NIHETVp~9bt(60A>K`4wUAup~iXs3xuk+X%`3cUmnoZVo3a@>xItRkeC>VWXp zB~~hb6$H?ZNOr_X{`RyjyrSS+!Zgp_U%!k2cQr!%ZP%{{6gtPxY4*8V_tiQ-u+ztBW|SioC+07)Yc}7lY#)jOd5af~pObFHu!R(A zftG%X-1Ap4>JX%MVRW)(&Ng#;Gk|N`32tg3e`^C8P2^j$?+%midn(_J*Ar`oJ0E_; zArL9>r)^-)8CQ1K;(g6x5iL3?_3u5&$=S95HNCv=QkFFG3?~x{si-4J{S0A{=)mB- zx^}?Sg6bSlHeNyMK8kRvkzuORnd{<(mwRfqHtvrwlQSYqcdK_0y&KWYZ}U at vz(GHw zoc6)R;DJH!JfeOc-R0~oE5l%y4xP1iU^O>DpU#A;o;M~1YrtwS&Ze2~fs_Nea%v%K zL4I}qT*Mp;)Uc^H`jRU)mD}7aMgfHWBJ`mxUb6d4YN}JogOdhL67GXKUOK8jIBjf~ zalXuv*19`hxD#F5;t)iMYZa{*ZEKJ%nxu7BhSvMz-_|F at -C~88KtVtP|H-9A|F7{# z%+Arx(9zh!)=bvL+S$U%#F^|rjig1bO>9hTos~_T|0AJR{*RM|ww;$+`FVl<{-eL7 zn5%&|DuL9&6l6nC8#nw-i9Dum!xz)PKGZYJWxQ{oUShrd?cJ)CsEGeEAwC-&Z8^00}|^e`S=nwe5#3u5G#?vL!k$p^sP2iY=9)rA%$p7OypT+1847tPc9TYP1y*tIn zxELy3%d5KpSd;pY(JwBas^b?zubLxlI^k__IXvNO=P?ahwuJsjR~6loiQ znWOyqS<4<<8m`y7hh!1{prXVf@Ll0nCI>_7J8p z{U^?lWJgg_LsLitBelZvGMx!E#0mqRoPZO80LT}}@eL`}b+?lXdq%u9^>4%ur1~iMLO}A(|WEM8!=e zHHeN-Yl)?FkdKtanqYfydJR+8qW)N5U{Il7slvJ{3d|QXRA*cU&pDBpU%cBqU<;4L z1WZt!F~GEWS$jhv^TYB;N%tbRazHsmxrcc%H6KZ0Fm zl=@$1v4!t>5_70${8+e at Bd`MktvtWj~NhP(FP zw7Vdl_L8gVE{rpHm?BI|2F;b&eYwlN zc$Iu$Fnq4+IMZipGSdjK7o&=lxz|#!ckXz82mgugU}1{Cu_QY!5;wJ$%GUu;C!UE_ zG2NEHXVS(qCo9>WlAmfZ=@Unq?Xr at 8tC#y~)#z+pGxjjmR)TPCv1#M(E8j{V8SI>1 z2piK9n`1gUhI0pi`@m{sYjmo$^BitKyCA$T=Q)QV`*Al#jeM4D@>?3)vPZSgej%hh z3i^XL!zk<#Qp;?Jeq({Ful#A{bg|{qjv-Ckpbf%uJ?MeB&L57nPE+52VT>tN`H{)8 z>%K>jXVy7C1(}U{v&;0Qiiwh;>8GcH9uIf(1zo#|)CAf9JHYq4OB2P{>W6dC9~}8n zvQxRKY`~0st17-X?#`cE#Hz#~DNKt&mgG?8 zD60qm7ynQ%ru<#KtVMePEB-)i_{KEFTV;5&8~@N)L%jhoZSCHIh+K;oZanlqvo|<; zD|G=buFg7r8l9;M1B~@Gd+Ip8(c9+kKkjLKD|g*qx*=58=m(D6=-XcoNkSUDBhS9P%=p526hHLWd_3ScQFY2a8Apo1xI6$RYb_# zn$5NC-DQZlaa!IB6_~dQ~~s^{Cez1dLN zDNzOjnwj}u4e|2T?m2d-V&*tEn4Iv!#5DB^(oxw~LJ*Z=m6DLYp{JbZIMcU&s+;1* zGmH~N6D{Bwk8V&1YFvwe*S_o|5a2yhzs}iGe8D838S=Kh?ArV!C4Ozx`4Y0rO{#@? zt>O%)PDo9rV+%OA?2xbEkmVb17jC{6y0~I`3c@$A`c+awPVSn2h`n0~F0w8rlV7wE z*0|%OLUK?R9CvEr5OHLxJ*GC$Fyl((6?0Su3A1(_a{rs#eT7y&#mPc!;r at deR|wnt4|z-Vz at b+6#vVytGN$p at zxn7s1PVBq-4v6elIOD8exZ z3eQg`Fp_2sH{6)mWq6l$ulN6snfcwFAZ|DMyBo|&GD`>HjWt4?TGRu>J?AK`SFu6R z61N-nh&u6sx-CHH?17d`JeLoaW9wa>F9=@I7pz9npFdm(7_xE0R@{5eA6OV at 5V)*n zFNaiBi=S#mSjsN2M8z+JJT$(9^n4-Osz&It3mGd5vHgR4_Wuox%{jyc&8@};Fru}R4ISU zNCQUva$>iGE9lw~o@&Nl)CrO$)Mw07G3A++h&)Z6U(uZv#s?ZMt9o`1>N)E#a> zXvgoBrIaQ>HN9(5;YfuXf<2Bq2n_=QLfUwaOA%|WUm|Ycj}HtR1NR{L?>3pdTLrLa zX^vY#FdJhdWzQ&Z0$uGkJ_Wnv99IHeu)SX(dno9AHAsW_pf<_fHbQI>3=?F`*NBBd zLTgak!HRX at gRV2u=;hIWic0&*b;p`i=W)>;6>S(kr}M-qc#^mLGI9n}MHsDVcKSw^ z!d-!VL)G8ggYj2-4?2CSU)>b#0+QPU218|V*M;8zw}mYsn$S`szJK4ATyp9#YlQ#- zaYY0HVf`Ow8UK6T+Yl z2VgRF4ZWBqp%5TaZC5|cIaYby6S*r8B~bE^R{awFlAzIlo{VX{U`VA=hVb$1koWVM zc4O%F`+k2X1bMqv1cSPf1DkT^3=e7}4ek8ZMj84%Xs-`I3?9dazov}$j~~Qq_+_FO zRBk9VP at teC)!#3|>`erzZ4R7`Ti7wTM_)wLiaFF(L%Kf8QO!f>ye|p-i<)92hvDR8 z>N}j)*gns;YYOkRJgU9NtD(|OUYSS48t>wiF1n)IGzBQ-UdgYsVLdky`};vkDqzPQ zxnR4+dR!`NCn)5^y}o~lvX_1-1V0 at G(4p9h at mS!%gpY-W>gb>(z at Zf@Ini{b at U$3c zYCgfzW0tQ at InyHV0{Dkf3qP*~DdaD#~C1bEeRwU at 2M%=uOs?6P1WpQ6sX+T7( zx(_+%%pk>)?fgs*WYeQEuF1$D20{y(`h;m4bC}I{uvC%G`!9`poQ9Qo3t!OG3z!^j zqR+PskofBdzLR`KK~)0hRZZGMQ;FZ4J4GzAIDP+#p69n2OYc6?Tf&B;6vyvI)Gwo{=_9`U2twxG3B$)8s(wbwV*oF=p)6i z?4KUtl38hel!23=!iU zmc7Grg{qCWG$gwUs)}aVAA+y^at~oO1(<>PviZvw#CslM1 at Bc&E zd$osyTF=v>70%ZJe?d^g{O89-XA<*xQSX(eh;9|wM<}@6(-N3HGj9msd1L%(eW1H1 zuFQ8 at ZpE>rXFk2$hGzf;zAiN!6*FT#eT&`v7WQESrF&`xu6xcw&6Cu$zc#JwHbl*< zYzfoyQE{Sm4{v39rN~*Fy!hEt!PE7J)J%#Z4r(`r#HD;#wNlGnf9TkQzWK!~DojUi z)GkbdMPD$%$ii$`FnF%fFSBA|>Th>*30ejS>!x3V4T>W?JmEq)eug?$23dbN$)ek$ zR;WT0zrn>^N^BqA$VMl#Ws1FWjE-k!7bz9?OU)+&qIH|S|{!p-Z1)?Uiqu%7PDJ(nKQ1uTG+{NjMBnIZ% zCna{nGL)B#RLsaE(7vy(ZTxk`Ev8z17iI({U*=gv*ctiAN)P3f}~ z=`-v1nC^b|DsL-XYv;VhaNqNZycvxu;bxF=(jdPH_r%`7l)D_vFjNH%BXhXRUJQ;=&X)U z5bu`gGw7TZ_uU4|_W`z2965^iIBp34YaCD?T4qK60Rr;+-7jWMz3wQ_A0^Ldtk zf%3i;LRH)gx?S at -ARlCHYz|~&elR?mOux>$&%U2}+ITu<1Ys~(7KTK{cHRpNk<^hX zRL5t~Y|>H7p|#MF-uJ{&w%BBf^P~%8VwvUq)0e|MV$^U%r^eBSJ7;1lx=0p at 1Iihv zkxeSkvIFa5UX2fIFJa~*Mg+ef2SSH15++^YFkRuEWIUQ+F=HpEuk28>`9boOgrLnu z1?bq?Epvq2nb5GGtB0#Rcg1<_QbmmPWF;AfP7 zCb8tZm$OYCN;fTYxoqXq9&UuEp)`!=CK?A{5JjaV$-zHHDC(;+vm0! z_M~@tY2UcRQZpuE;!G$ieY;OOfB at AQT3=H8SH65Pv(wio+PY}cv=+lc+UQIUQ~L=q zL{FQjovi2$suG8h-a%h+*^Xv2yB&Mpqs|-N^7HxxnE@|s6^+sCV*k#bs)!PWmd@$F zlyJU92h2?KM^mj!#p)wd9$nKWDiQ2bhf?IlCu84ivC0pRW(NKJpk(HrY%*^*2=mAP zBzx0rGt2FWBlgh0Pd964exQNQ?@(QijCzXlAD%LL2P$Iy4c5fk5Z6xBYRIcji)uiFM=f>B57jEW!l;NSF%gLSa0TMv=eJ2^8TmLhu+bVp*ozD)M2{ehG`A zFCsM6A1HV@!o^ciZ5TT{=v2d&4uD6+Ce4?IAMC5%f>P|ILVwYAuG3_ at vW>bMT=s}M z|Jx^-y+Y)v?f|xI_g{(Tw2cz+FMk~`$p0D9RNUj{Xw1Qo!s6 zaqX2_D)uUUXb-u52(tPd#EridO#(7BfsB75TTvQJ>GA$m&M;PErJOQN~1j_^e0Ow=Z^AQ7UdEg zLn#3A5WQniy9fzz^x}^&aWY^$BUZT{SJ%GtvQ|!M`-yAFUGkNEy-IOCaoNj{A|HC5va8Vg(lPEzE&d9B;FBMucyTZMKDhxExPLvtr2PxY8Qazd{U; z{K!kc9vK1*%P>C~K5{>zTNW$p{{k$5Xw#ksa>>?i6Rw0X&tn;crv%J04_xqknT<0S z+P6QI%gS&#X>_a9T(rf%6 at f7e5QfA7-F5N8dbCpFj{XRyfmK}?trHYJyiZ8%yC9)s z{N@)T67#@7uqko#$53zTOKLwbTKP*NMgHy}Eq8{Szph>T{j6p at 5-$I;VxZ)AA zL?aY)GZ9>qQe0x&;|^$1dqwRmV(WB|Quoqn$)+iTAr%=~Ci>&K2B>+|4;imGOv%9GDFcTR?GW=Wi z%N3O)SUcGk2N7~#SV%a$QtNOVoP>>#J8@$HqZvNgyttYf+i&tMwwOBXEQ7{01I(Se z$j~|atU}T)Jh^?q(AShr%@lpguMX0PAZ*s$A(#yM{v#%Nfv88+fAe8yFru&fhoQkR zARxm36NWk(+B%uqIokYdYGmTzVq)uTVQBrYZ~s|lSe!EBq^ycI@`n>f^6kx1+TULV zf>;oxE+6*GUt?}vn5aoY_%%Os;~;_m=&~p$qzfpC%$E(}#{aWK&e`7|(409Zf#bUGDZFek&a-(qpFAJKx+~J>i z%uQQQ%olEo-f?#F^PP=v0y8;St%5Ac( z#13735qIIC&;V(LrCn^aN*#-gT3uMO?{1;ZE2ZR1UQgJK+AO-mo;}5bkXgFZuG?(M zVRI!e3oZ at b*rvGdv#A3<)g{$c*9I&lNw9H6ROYtpAiS+AYpx8+Md81sgi^p5i~nd6 zjp`6!jE!1$v$one?86d#I(-N6y(86a#*N4FQ2xM{+Ytd(MYhCYbwmi4nK|SQWTpq& zUDWGdb^6QtscYkmIz2C`$+oUDI>Om!W*i;Bt;wJWxS!NTdUx0#+V&V90?lQ2Ozd{c zP;K$x}?gS%e%%(XV>Bk=rx79i3gY4oE z-nw2?4mov%w&8nEqAjJ^v|f(`m5W>Yq(FSp36Hv07745q3%$Gmj9)CuF1qpuOw7Pg z0~1Iy6^3sV^lSErRo5rG10#w|%AL*g1yAIAhe`NhFYZ}TMX_7N1mnlmJH+ at T`^q4H zgKQ-GGGpFM2yG1&Q at YQ|m>o8i|@$aPXBG)<#H zvz|jHL1c`IgFGjL7{ipKK~xgvdO!|%Jb{@Z zv?tJVX5r!MO*tvoG$5(1;s9-UyPsJRvyCav at XV}?(Zt*4t8U(QUKiEs%4HVj3$Y!a z-qWe_gabz0xnJG>@(pG9&-Tyuyxy78PLS;7>R_}alY2&9gYC0Yd=-{*PcB|7$QVVL zQQNqsi~&x!MGrU5onX`_%&SsQd{O!exhmNY9u5B=z{q-uK4B_;WvhoW9yjjijiQ43H+=3S!$84eV4h6_O8%lXD8CY7jc5 zdIqm=S|$8K#@{Q&$XGN31j&VP#6n|SO}LrF2ifxF+^4kek8lhW_(5rfm`{7{1fv%;|o`G8}tk#YyOS&J8kr_M;wA9!XYeafhS*e0 zgA0t*R&f{XI&%x%RJrvjWKhUeLc@(dgt%clrqXM%St+d9*eo^D;}uzW>{5s!`^Hy> zkKmQ}8l^}mcMl!ZGTw3Bc%^o-x+Vt8Fxb&c4?fEeXENP`$q{}ql|2q2`UV_%y0vDy zcE!#xkwrP=wL7K<_nBh7Q#(>eNmq3ZdxXDAAXYl6^7gA*q!lD=~ z2f9`CpVESnTPY5ny1VLq-iL(nMIiRa(nr?PYMUca)GD%SynC#){3_)X^%8Y0WKqzT zGhph9JSt|$-On{P9cc8BroLSFZwWz{7(#NxEpgQp%r325mBz?y%-1^OQnru8W_zZ78MW2wUN^?pvw;-)i z`z$X|$#cBIMwnQ`@_d#;!M)<(UkLXL!X_ieC8SOK9$Xh$qC at t|uv)P&tFo1w!PDyq z!%SR89!uMVrEAUcf-ijtdn%cOf;dIL=Y5$L`3m8Jja)K`aZA;3EyKpE-9DbfvEshf zgwN<%e7?0)Vb_peC_W$C| zbHSu|Eks)y!d;rcU1SU%=;0vlD&ipTIvUDFTuZ{5!j at wswVi;&Tx`ld#c5iBr|DKH znxqw)Pg-%AExd9JD~NaX^zdjGW|i3Q6th$_RhUjU20;xQ^dVPkbx4&y-9n|l{-O!j zw`#xK)@Hk66J=s;H{4X0ok#jnWWcP^;&bdU@(M)Ns2es=!43C*YPZJWuINIh(oS^$B(t{omcX$2x_U1)w`3Jt4 at A-8Oa5yAK$=QtQ=1dwj9U_2DH}>9Pi?TCFrkM4q- at 8VnS! zulX(-{bNEMy at J4acR-ee*cZAZzL$iA9+jVA4HArmk6SHOEpF)h0I22ogo`*HVWyCw zC^5*g1(6Ky5>4?#UNu6_+_j$Sh3Vgjg`13i-Dsn zct}J9?aJP9CY3i5(e2dH~J=B*|T*< zz#^mb8#PK)Ph1!d381(Rmw|t(pgY7B$-yl+OaRu6G3}SqPLu1dXbdePhEWI7bsE;_hsruUa1@ zpL^hE;Yf3KttA2tpY>kz+nmg=E$(LjTRS^IoPFB>q}})R$Hp6D at q+C&HFMm+)tz&p z at 00_IWwIETtky2?avE;hjZQhx%e_)w z=V5xsnx$tAvdp=bW}wx&Rw_;wCRtS5{GxT(;Xr5LVxg(RW|*-G4r+)cclq08Biv!j zz*0+-xsp$IK at oL>8~q{u^!SvU^i|t8uUa_imGUaSQ)+TA15-9B4I|^OY-8ocr700{ zzZUQOaXI1}0-j5KgrZeXGzTcFqID9k!XRXJDWezFGkiRhX#V3fK-E4w)TMW+OvC2eh8T?~zEO#gFABsb-MHZX?mSxTd? zrK&+h00n8aqLkKZAzDaCESj_qflmE#;Z7ml+A(pLe%H);7wowQe=m-?qX{Jdl<``e z%glAod*XchnxEGPsM5d=3=Ag=Q)DnaOpF}&Fe-`wO$H|gjt0wvGCA^Pr&58Tft0x( zDZFxLBkJC|8ErbLEW;iJO1t@@vhiSwQXy&Bb_ufULNcKl{!wz== zb6(tSJC6QHZvvpb4$`_9brj3WI>+kD!Nx1W5n+wqwO6jA6Zu(4yw}zB(=2HtY0Y$U z_dO0>Wac3_>Mgh}l!*#W%wc(mq6#hVC^Rq~&C0{nU}MO-Mx!IR+vY2v6}bX7B`aH1jBvUz&mL!8UtMEFXb(7F9d9L*u!mqqEVjwU_(AkqWoXZ0+h3R6iz)1 zo>F%m^A4?2(R&0^%+34>pF_S-?eF=eXiBUxih1%hv at ym&5+#z`WqE036qaz}mGidu zBKap$`h;WbB|2sIW|Z{ z)-anRzjkp8*yeLk<12>dTbp$_-&nXdmMg8$b< zo3=W#I?DIyF%t<4V50W`v=R(3R)SZh2#TULilFGjnpQXii7+{HRwl(}bnp7Kw7Fbo|X$s};A}y4P0uKZt*DZQn98V+cX0QP9j^bDHPd?e}(v@%?{(QwJdW;0l7% zi7!S{>vUn2o at 7P17eO5CP}Cjq_H82+-Y3hTAky69vPOxTbfz3tVWp>u^ytUSPTY&u zi{pXyn>?P7>Dxt8L^Obe&~_JKY68wGOHbL7R#JZ_c|j4zXQwx*6uawZ#$*F|@BUD9vxvN}>2am7?-SdC at 4 z%E`yfFOn`ER;P4AMqDow=uSuA?xV=i+S668nI(v~8YQL2syY;Mn89{*O$H9v-HwhN z)t{MDcg6J;zK7^LT5MNm0jzj9%rRXqNkGm)<5nswZB43&Ve!j#zO1|VfPB`d at 8k*41mIuKhG^G9^HKcc= z{1Af}Nr{8Rz%J|uvB8=3=`TXw*$0WRCZ_Up(RNs}$dgr5;%{Wd3PC08QlQ3^?4m`* z at 9&mglUu1En?LZ-EcDDLTv|RpcvUZfTH_i}&K;0jut`Jc_D?1b$8jUaTF%5Z)naRN z4;)}t?LJSJx=e-@(`@!zShnJ=cLhIS0AXfxCinPDWuz1RJRo#Utv~Nn^JV*39pp;bqU!a`3W9J(WE29@(cfgSKasi zCGiWdsxClL{7W{;0>q=E9I-&ZAkZ7{j!w`kF3f7(5!@}i`h1wppdWa;6qtl at en7hg zZzMy!h_L*&rN63899LzM_eBAeFS#dMyk}b~&YE;2uefou85tE&y3afbyV8`I5VX&2LtbI86u3Bmc67XmW==Yx5I7n&pQrg$buR at j7j zMgOd#f37%o)(E>hK#vVPQ+J4>I|ijYX!;tfZs`lwZ71 at W#523dERR4hw31aUQixZC zC~9DSnTHH_ZPWp9+#!d^b{Iu2K`-DHe!={R#MNVSx}n-NisbE at C0F&qbxQt?9j{)D zazudY8zFd5WnZB^y-wUBp51o#fxSrQTI>?Ac;P4Mh{gDjo_bk26+l}cq7vnY=u#66 zmnPiL3$BqghGECt3^=y77!G=}0^Km;^BKlmXcALGHsKxPNTFf+2?aeIfigfs#K%!BNanuzzs=W1P0W#p z)NmvO5k|T{Ik5*8^3oS3Y&i>0wSnx0N2k%cr?8;WbB~|kyhayqGG^wg^wI8=AZQ`s zGFxslcRM z6UF9hiilI2Es9tTuTGl<^F50`jfokQXy&xULQRTIAI-ExcP6HSo?66^7GP$uMx@@( z6{t0 at T}CMvh^*HX#&UtlMx>9ToAa{So6W0c9yZUsEgYHLGHu1OrG^rNtH`LE3{c}C zn(Uby4tENSZKL(J=(yVq(a03E#GIaZXd~ublB8P{X%n5Z#3!?h)kYn@ z`aYH9h0j!y<)j5(S%oU^vH7rcwWS9v;1#l*chcWhcmPp>0y% z;`M-K#hPI+*m+S$uz7JuG^QEk?DGc5^8O at J(#QMQZZ#dJ=>3_qLNO7yuj&N*#X862 zzm?$(uZ65?$bPrMrnecBs#Jh_+6;J;b5Y=m5yU at N)*qa7`-OIB9S3rI;12_sWiNpG zWPxZ;G}swe#m=<|+L0!5f|&$$&w&5HV0>|fFewTGVkgvldK7jJ{-B1dH!~hx2%fFm zL%TlJdg9^Bj?e=k+Y80o&;WFIqk4Zk%2u~0uASVlwPSP- zCd6KV3uV$x`bV at z(E&7f>DEp8qASMWZOBKU)9X#XQN#$DCF at QA`HqNgcbM#f?{gG< zUDP}OeVsJ at RL+(p#V87JM3O3&Fa171-lKr?z%Tz^9PeO|>VTJZh)>& z?t69Motf!7C#GK at z9S^}kcp|~Et=kUOw#5V)BX(;{xb$VoB0&?;KDF}OTMxZYc#d@ zYifr^>*X=P6J4oyH7DN5*$UB7T~RmM0#ZTgAT>$L!H`W|*VoU{uhGV>@Mv9Hdf$&- zZfWx_*=KZ%s1yzq&ULk&Z)200dR*6zaUOOSdgJq02 at V%xsRwMZd6}$l5UtNW;))M* z)w+{Ld#ad}Vh~XNBAB(58q%woGQ-TCIG+eZ!@!+b+?Q?R_FGg0RVPWB0Q^^T9URg4=i!q`+bTV-rj6hAw**)&sag3=by(pC{!A;N;%+Mop~L8IYl5X(Z2>b7hpSP5FE9hIAa!VMvA at I$(KOr& zO+E$}=Rk5{+GzNh%YqcR)Q|g~eI^NkycQix*p0FK=zRkdlP+%2s_L{`O#^3ie-%!) zm12fu_>~>70LyE|p~^tcm~U};uBkd(15IMK3q^HHr4gfBcV{nYv$EMfmPprGu3Lwh zKX5sbX=VX{K;3K;Fw3>yaYMfU*+sO_Rw#xk#Yl}BII+>qu;o}CS~_JL4NnsB_)4SY zYU`3R7T>7i5>t4hph+b~&sS`R at mIuKz^2^5>Bp{3=k2ubWL?U38LHj2xn)^*-q69# zD2|d7#S5Vj4Se!u90?_6hLZ49tW_j=pyo^0Dn$K`Y0oAZqdZ)hvYTZ-$r+7Y8M29e zg!Ed}9BJzaA z#2z<^zT-5zoz;3$=MuC5tb7Zac6I)ak$?V2BV;fUY0!X%IN1;2&pK<}0^iUcU$?(sIbw$6vXCKhw}4=};} zAu56(5(51Ts!1&R at _tYw57;Hh2G+21kUetdsj^XL^i+dfLklzDnsebxz-tPv|miSBYj zHx{EffA|?I^@~Ps6!1LkDSnVPPjKiQBK2- z2-k`TCpz>hx=oDNVn=Efz>B*e#8W)$BDlvw&u*<{Q+WQ12ajx$$*r!v&~J8WxAGF& zUX|QXT6(XQwM}Yl$&|>JLO+vG&qn33160!vSk*-ESs)f*QeqWEm+KMh_WzJl%{Ppw zDy`}qqAC$B*7gYWE7=m at SPY6Mt^XBrTfST71$#A`}Q=Qxy7WK`SAUYCxqZfuih^Z8wrk z9No2{qVg#&-~ZIU-%8`Vh!w74j+_6$n6F^suYkV at nlCuJ*|%-kP^}a)_rBe7zUAzF zbe-)^y0iCvf(d~0MH+I>jWz(qj~fg{4b_oPQ6!INIOT;ua9lbBhDXnM1gXnEULw`! z9UfTXEz8IxZa+9v$uZB-o at mg6Sp{X`@e}1{&mhmRi_10{4lhR12Q(Iss zD762gNN_QZ*IV-vmk!R_sE0#~T-r81UOf!3y8KNW;rfcXLp1!^!Z_Q)@{55~ozD7n zx5!Epi*d{QQH+w?24h&1R(d)~v8+;K<*^Oey7jYUa$uA>kS?b>z&0zoD5_h!y4MBs z+G at DL?Cwpxg>wfj<{}B8u}F(iw?n71AXb at Xsk1F7q~X?2s->>^IT}Z%@u9)+qRlRa zG-O36kVp1RXH~S7Cx at 4XLnx0UO|-R0ZE4Cz$pKh08L)*iw>Y!C{t}yZ%S#e_fi{=O zRfBak$;{f!z0+o$idYE?DX#3H<`S{Fw|JB&JS`>kNmQ0q(lrZJOs3W(#t|`5zLh2d zVTY0E_V${X&KADhnKP{(pD8v8LVAU5gv!M7cyTjJ?iWy{JFbg^&@c`5YOQan^DF51 zT=JZRVqQA?R9jVZa`Y0b%d*%cfim at 0SF|W3?RVGul^Wvc$WHDVRm~*XU{*{WjJilu zo03`6ZUrmXx!R@>oJzx*mQ at 1vDw^x%<-!7uoD$BV%i*<-=`WsKDuGtm2H(5*(z zK`R&Whp-^_2Q=55%svW@$dn*kj*@-bp5lF7Jhy#2Q169W17zwBbZ^w00ZC9!9F>LP zeE1^uK|>rx2b4chyTf0KJ_Y;2J|+7sc#8K7 at WJmH;8drtoFb*EM1XByRUxj<3B^p+ zxD=4Jf~>(+rKa%NSh$EDsh+ibi^mf;&e~Nep%%ZY_>)T)=!F=NYSSVi1OlaeFwQ5`?n!KqH5JoQ)& zq1%$C7~T!+NK2RRWr6fgi)jtQL2Zh`x$iufAU?SRzXc2YKLxOP7sTLM&;V>v3Xs^r zl8hIaW(mmyQHEp=xk_G?E8q>e0vY8ZexsA#+2a at Sd(sirb2TaxfGw{_(iL?+?1t{J z{F;tqeB(I6BhR*35=>mh$Yu%6Kw&rqi~K&4wx>zh%{ZfCUGGA62$B1`NE98SE%8KVq`EetSk+)C>Q5Bj+JnCD;zJKDbIKcacaB|Yr%H>;dUXHX1X@`*MT zVmG(Vl at -j5wpS$AttKK77s-xko^w^UNCTEi{}@7i8$uMvFCD>;>rj}7jF8fMzj#H{ zD6eWj18G#7337!2X6|y>mgawo^VWSQ)LP^g0 at zgf)KRJwN#g!Rg2ojouSD;NHHCr} z$`Coa47!gOpt at qN_9ex1qM7svCqU%@pu{|NfU2$3Aah4qc4<8=9x+)*fzpn zN^Maz6~dA`$d(UDn+HitbnkfCrClXsQJEXG+`QTNZ06RIjEilTjvKG^RoRDMUs(G2 z+csy8wUaA zx{fmwA)HSLw8DLk4Uxb_29c)a)eHo(&K|?V&avD~{`k6UL`NTP(GPK)BeERa<@lgG z-&FiT%|Lv?#ldu8t(WVV~%3-POHz z+k-D!M`|8 at ktmoC;$Nt{fy2J~3I}zj)qNYvRc8>%2Kt>SIO6MqHiPC9T$It#}D`QJ%3&1`(Tz+J=-`^6t}YOIM4{Ny)ne2#7DwkG7bA0(XB1^@)bIxJA}le;xf2_;0vKyW(Bw)>qCOxC z#E>zHYJ~=FKbzM{bYc!s&LkNHNoB+vV|qr7b~uA_iukL7Iy3D4g8|9%rKunQ{q_7S z3M2nF1pU8?hsxUaNPi#4wl-`}S16>i(iQ}*3g!C{2xinsW<3wCednP;=IWYB$kkQ; zNhKo_!~YE!+dt{y2H4618<}l0=We&xdA;$ZzvmCYAwV6^a(j|6b2FkO@<8f-WW zq3={r??c?`b;M(AK#!r;t(6&2T`=FPP{Qbq!4$4ESuot7dDVM_ at 9~%De_cx=w_N## zsi?z)4tvQ{Jy7AmhxiYH<7q$8F+DHSj9s2)y$w at CkRG zuAmd0$wA3Uv!a-{kcAVv(}+ib7s?-VtDDbW+4P=TRgBB)s$(F7_Pl(U5LK9%Uks?1 z%vC;(b3N-m=!iL=9;N)L!2CoLpL%IYw0c$oDfh}4&5I59Fc}WAHO3#M$zrQJ0vo;^41^ZLzXh4U7CzP=3IkJFGE}(F#FAI;s7i9m<}P%qdbj9 zh<1})M0`rlY*zgM8u`dhg8YusexLq*#{ayA?-i{@m;9rKc|v^YNy#25s3 z59Y&zwsL!*)aXx{t$Z5)OmaV>jCnCVe$l;%@C*x=a(1Oqbx_Da?v*ea7t7sY{Wql0 zOKG&&=nj~MUzc2&dEVnGG1<~p7&Q(`@ae5tUNNoC>QbHUYDu;(o$pvBqh-Qcn;ly& zvdWLHyg)HcE_4W~195sIj+4z(6QtdaCt2M2f_lkQMzlPr*s3@)KnCb$N#DKkxh(wENF#u{wnwsvTchk(flY z*Q4fbw+omD3uSRst2(Z2%*^)8&CQPB{dfC-9iZA# zuSL`Z;n0sJ+=WIW`r(yK#?oHF^)jycV(?2-s#uXD1C at epThpSLvenyId z$jma&z`U7|y6iGjrJb(gkQMe*=4j_kpHh;iG1ClBORuL|p-Iq7M$B!Ra_#7{(6lL3 zr)4x(q{=)#quS~+r?ZUj_XC at +XtU`gWl?tK6<^?`civf4SI;CCpwUEgHkX}t#UzzQ zb?MHk*mN5;!Pr)}iH@;k-a__pV-*RZXD#4P-!K|68iDxe_%|w|tI0 zv}>I$4_lV$_imAv7gBL;5$UXHCO2I1ZYnGv&t+Z}J at cQ%pc~qi_b*InYqNERu=WmS zv2*N}dB7#(@8Av?On;85Vfo@?ljhIx3w^v00e=jc`N at tngYl0xAKPg+ zC`-1QlriiZ$SLyij0XC!UHAysuOh_ndm#V#3O6Iex)2GFg9<{^rrdQ||c9 zg`^byX`uM+T z?Ega_%VNi at tgW^CuLgth4G`e}rjMY66crR6TP4yuvh1Xip#Ev(gTed*_ at r`3sM;un z;U>F%xjmlTnZDlso}dk}VSzNKE;Q#FD~%%w_L8Ko2IF^T={38W8F~3RX-q>)V~_Q?Z(1OAVf3n+3z; zyXn)f6{_0l;fuqo4 at c-rsyvtADkg3nxt2=X%Ts~4Vu0>Nfot1saj(nrJasxx zGkwJTvp>DxL}_WCia%$b6XlKvZ@}U>(;e7iM9rw==n2Al<4nW15x7R{n1l3xs`q-C zSiTd7p_o_}S-e>_5HhWxP>`FlQ2sqO2;&9nnCePD&nm$Po70JXH*R{=p-AoSvAq;Q#4(>}!QPo(Bp5S|cCGdcOl^o_asv2&xC5Uu6KEe(9*bn7`zzsK3jzU3X;7rC04ipQsq?sIO zPmP4xC{zn$rk)8p4H1jAM&yjtLn!4KgfnBR-n5Pl5_P#A=qmyx->%ZSiJBy`@;PHF z-txI3Y4Zh?3(}RG8d&?2+&u8f* zFOmZHvDiUN-$)GxrWMS$@ZrgjHdc~|a?Q-TUq+DzL>RFQ6s^x!pT=4weY9B6#Njr$ z7%N)ku$_?wXiQ|(pYCG6!jm56G-S4D!`4KfYYL6 at 8IWXX%n3ZRz%e+wi-Ng=AM*@E z?qtK-FB|=YVya$5fVC_HqCqcoVYraDf-PD!c>^svd?~PSp)PLLVa18pLxj8t7Uh%< zrx)fBeal6!UF4nTMK|GUc{3rxHfJG8Xl|h4L|a6d!hWNFs<~sB5YjTO^x0jBPB?8i zeYN&|uTG~C1HXllXc5+Y5pxGU5FB2|h!jD_!bEADZ5XUBf!vti$he3O55I>|L%QpT zrwR{BOBzGAV;V0UZX`uh<@1qxNx&EDQ*_v*5ef=muK^8?*n!Q&v%z96CWh;(mf^d> zXZNiKeHu%|m}ixGUQ0 at kw_37lS#e}8%tq27H!mOAi>;Sp$-aQni&8*Ct$PgIOS`kI z)sG`%bWs$p8UvonpEE8|)hm{7B4$sS!+dFl!tr{h%=eq=B$og at Y4$N7#-ak{NakGB zuG~ukwP`c=!Pjy-7&A2T-V9qk8{+Mwrr~*ifD=N^$PuU!G>h_~b>qpi)7BJ| zVOnl9%+g6`S^OnjAtU`STNRIXDb(>70T!kRx5;`rz*s5dO5=3FbaL$w*~hJ_(U;d- z6B2=_jXTGq! zM at h);eWo#7@>r&SpPytXMi}=^LZV z7)D-UT&keNz+84OfOkL>33HvQg)vj1HdO+RKKD;9DS at 8csu9nxooOazy`j at 3EL~r- zNZ^)4tc|*AwA%uuy_(}+poMH#lUw_lsKlW!gzP~T4q5RTSF}1nwP?KLKx&fX7pK(f zJ{+s@%_XuN6E#kcJ3_J3PBRD;eiHp3S_%>@SSuonNCnMPyFX&t_nhsA5 z3VQTushr^Rlzhd6K|?z1I^`d%SUn|5qRZxQ`mPM%V0U~VkQjrgdURx~PyGPWTN zmdx~)3H4r=%5<%?LDjAuI;zn&Ggp+!m!uf z{%W;VD^!KX7?4ajAmd55HDD+PFbq at w6oR5lZ^mr#DIi+_Y3U(oSjFj)akcNws}&@q5JjDnb)^xmbku~#2}gG$dTJvSmHSC>cy6fflUlQ z9%QIu6pm;A_B5|$>iDT6uKq?BtB=lWeJ)`=WiJSQ7%G9kKMkcnL94}3FfB=4JDTxDa at O*X?#YhYk{IM_Vy6 z&fWK7bToQzwACfRWvZ3|tf at tEhr?kzx8GrWLsHnQh#PCGa&&|}M=D-6)e~E~10(R)>AA&$n-m^C#+70!(T;-Q zt>j1E-Iig`J4o?l2Sue0M$OeI!r1SI4cgKQSyh9g4C3%D6uSn1-wk0uij`P6Dk6qm zJ3;n0>r9`@%F`4L;0;FsPY;?i;Jyxke5%0!yYTn}Z7EZP3GauQ60$#1aY4q*6cXX* z#$Bd=u-2zI!3+?z(c>=O{kP08g02#0-3CvwY%aKcbf+;m*xPuxz(n~D&+$SJTlH{K z*u5fKM>N#||9ILk^UaH=p%18ls6{W(?FVq+Lkx-P?3;982vImur3hdUL6A;ya)7Kd zw2f_(a+n3go&?brCLxu#IppT(w0CW83An`tC}RaDRVrw8t5?@52zj?MI^eS0R5&OC zwj8iU(_RroHUvNuN#7v2?NGunMbIv?Vt{$Vto&ifqzSq+EoQI;SxF;Sm@|N(S_)${ zAzftPrftGfnAKeuV-|BWwyyBDtm^_fVFEm{A|Y&R=1gJC*bYvj#v~|EyOuR{z$mlB z;d~IYZVRs)K6{zC0;>qYUS$5_pcsB_MjXPcbAf$>Zhj9vrDH#%8{`B&M|Bh6hfs$q z&>b>cuJI$xUNu6&opOS}LV(kVVS%kXgkvPpwI#n0E-NV&N}B34ZZLyjAo{sNJEijJ zKzQo)fj6l$@U^;vCx_kr7Xz%f1nt&@a~>p&cOIhTVRT`Q1&bEuFd>dQIrVDJ&?NMb7z?2osf zBtvutTa_(S=C>*zo4sc&95d4q5K1XlXs#@EMX_2|fc5UNjidtQi at Oha;|s(bz*1#t zpU=T&1N1 at S6Ky;l2-JROiTr6nz#l~*d#)?q7kk)Mte8%k-%jf}Vmj&GXI?k%5tqOz zQ-rDVC0pf7wpyPN_~I;ck~EMa?nbpk)})|;QI4N1^y5##4^{5)HH%Tum^=QXxuL3?K8%}V%exKfZn_?IddqgkXT5pp3~}&u4+>})AFwdS9Q-x+T*u5fySoy^=>s>u zGVm2^DU&>bb&X14R6k_$ngyzjU1e at y9qjG#Ek{nD)%|N*hB)FJV4Hl~wQD_tqBByd z^a*1I7gT<2*F{D9)r`{zvCpK5+rsSltFsq=Al+G$9eT~fpv|m#H+k at r+F`=vj{w?L z{ZQ~w9OU3;u-VfsxcW5XJzkh+I1F{s$tGK2#jCLRpmgqsrsvuN&P3di!mS5h6%PFX z%y={!44&bn#hApVAN;}MD}$K>@FXpf<&66$gDFizNem{DsmhFlef}HB#1h0r1}~c4 zIX34*(U*bQX95GGM7nUS3uud^de%iTn7O#;Cq<|jv+oQ#1n&7pBaQy at HX`yBal{LS zk1WTrA5P&;OHpc%BRvWyd>bEFv|T9Cg~1i0MhhCNMhrW`cMrDJy(^@@u2A{u(jOwN zAtGJjYqfh|58C*v8 z*WyZ($8>{J`Y} z<7siZ9-aK!3BTvT+WjQEV6qE0i}c%o(Is7-#AZb)WV4)c1V2WZK+SD*7bAMsRBfoe zls%=FAchLxx%{I zdr(IzAC4NEW&h6)uepa^C$rks2HmJX#_n1N=BXoU+R9sMh~L4mqp^^nkgNq9$ce8%Fc%e( z?IlqNE0h5vq3DvEkVXFCv`CudY0o8n`Ezd|K9eFmOWZlGrAfWd5-y!yq at by`zvP#w zjGu9 at H~9A2yq>F{#`5|;!3|LLC5VpnP+#uFF!jafVsCI8qtJSXVU(-YI#FYXc<{R_MpH~ZeN;Z(ePao8XT5L79LQ at MZ z2be7xVd-v*gChU{1?g~;-?qvw(yin~3;r^mlxbPn#AC6I zS*_EBMVYgeR>{p~?taKxi=7ob%EJ1P*#Ik;lEG55vt_v;)*L6b z+u2v3CX}IK7Z1=Dw8YkyfsTPLHfwJ055u+CQ1X*FWX_diI4erKZ4qQ1o z29aU+mtoOmW5&3o$CA3pOhaSDW at Voo%!QU8yL*D~e at Mp(s8F{-U~B(!xKq zF%?w_BqULN+~_Fs6hk`U3$WSgi8}K6$*S>M+K+avxJJP?3;F0Pz;(Bl*yOo-=>aX$ z6iY@>DZvMR_6#VpciWB=&QF1 at l^8CE&BdEmLL`A4a!ZaXVV)QTFHm=7R4eMG=+dDF zBYVFzG{fAAVMk(5=T{O(q`5hiX8bA(aE7n at f3MW2sIjVkb%f#0Xp!;M?W~SmfF9zQ zQ5 at cYr8B+kAkq-yR1O?4P8$81MKRCZiZAL4m%fJt$>3=V^yM^6M!h*gkp)9)$&FT#aMAgLyg1h%%}S=5`+u>^?MBWdQ$(>=`uXP*sd$Qm~Je zs|+62gN_;1bV>uJc}$tsf=nNoi2W$Y7ADtHUXp4{W+*xn&&OD`?`0^->6h=Pk`DAQQG7%#Xb{%JcMD z>+Xv{VR<#im6=zz0UsmB>Po67Bu(lkzGOWvK=cH1VFDY^3#I8EJYJULO+T+3cNrAb zPRb7g&uENh?ci54cb1fog%%$MSlsRQV!bC34w_)j)PHZMGlAL+x!-lG@$RM!Wu#p# zl3b{kA|%in at u@=EvkI=(fiEiVibmjt=eUTl&CD2j0e&s^SJweS;8!a!q;%V&DK4T> zq-j1jz at i)Ik@#b3an!rgPOz!!J;X78bQg&EP^OhNWq2-I9&H~#nx5}4!uDj@{KmS; zi_M#rpFwMuB&jSmOwD`Ld)9u-b>kKLk-IjrRKi2{({-q*>vY9Pbe^t=P4f3&CPrbq54 at d4vZpq*Q^n+eE*X_m|Mo6A3A4)dhj)S^9#GP zUY;S+%a_X)>G;Qhlg*d!_Ll}Knge2+b<45#h!~_``j8H~>;>L6SRNTmY~hP~ww70j zJO_ks&W>p|eGx_a8-&Eq1?`kbJp{Suhi>79yH~6ckZi&%ws(E~vC)4#8dKN!rIG^! z0ipi*Plp*L+?@YUUWlbB;9nAh5Jfo|5GF()OI!6z^(sBl;$HKGHXuhofTV8-ZjHbgFKP|hPmBI0N|Mm>OkLv}@4ea{k3c49zhd<7;91hC4 zR^NwJoqfsVYeR)Dx&NE9O|R^!n1zqY*|O$w(%PIQ;7Dm8L3~5Bl0fiTH at i$HK#v|Y zwvx;EVcH;$Dkg-PtL^qnq{mHsOhz7ZG_Fm_oduDzT0UZ#muPM}$;#WH91)YwT;+)% zG)PH*f8T3)o}N0C4{wA%CBi9!XaX?lGMSihyrbLUJc?xQxU#G7c@Eov_6d9ie>Ylfb;r~ zRHd-0g{pht|K8I6f9D{oIGURN-v?2Cnwpt9{+D0oU;68xQ-CE!)NC9c1)a^}l4Lha z7*4Q*L2#%-NmVk^Vj$#(MuRg>jHAg0k}>-FV~ThUAfus5n0P at ++E*ZcXeM7o$t5wG zjThWGyt(O)=ej)s-yiKEG;HPVDj|U@%&U_c7?d}fdbD8JIl9(!%)C=>(PLk_mJ%u-AS<_YUBy z(_wH$a9bNgYs%84+D9%fIqECDdJEoMCmc6sPYuf(lco90RMxMeY+U9kZgtRg0noCcd{l?1j8098{7G)+bKyMHNEtVYJ#9M3}i>^3hH+x)N-KG0zO( zW_QPFcDKjv|}QWvsl;k^>$GYxLzY zU%^3Xs8r~U%aXi$@E9GHPS}CYgroYS>RQbvufmS%TES?mC9lBA6qwS%5iFjg*z3g) z5%OW5g(L4;GnoUYic?ug3CY0ia9*lxnFT5 at v>QI=lS%ws;L8HC(AQ?|16T-|!Gp(^ z71JBK%qezFPw86IO_@@PWv?Ynb!x1B15~^)uciMA524)%|FKw9%+sm_nRlOs8oDgc z%&_K*92v<|Xn*t=uv(UoKv7uv6Gnk{HdbLVtsqKg%_?#35pJR$6 at 7az8NQ{7D#sdM z9|I86DsTg;7y+i_BCGi*d9rq1|A&-?d&O^iWI* z$Z at 2`qTO_#{RWdW7#{>8fptEL3S=priP2vZ#LZ!@-v<@T(YBuX4hVrQ8Ftz*H&RXI z0(|yRr~J>XjX7mA4n(AP^9q)yn3McM#s>Ym8V(dji8Onxx*RmmpCpozhdaPn5_Dy& z(R<7=!FG^@@ox&)6Uo@?WbmD4+MACH8L-OcIFdbjL(CV>6|W^gm1o+ugi`y at zTthS_X}QexpyN)`T0-mta_ADT>$#A<8ex zK$DSyYH^$O>FYp++B|G-&tuJ8UDzDVSDIwAToZ;$h)HquNA{nL{VO z>IebrQ?^HRL2II!+DxpcHVnl-?R<0};5&pi90oX;oVOkLp9^#U)g8)%#xRY6pc7kx-h#oY_yw{n8=;pa%=2o zk)ftxFUn+4O>o9?u(5;PPFvQjY*H;z{0wVRzeb$*i36F}a>}S5VzoFkw%o#peFPx1t(#wKS z`)HLVs_&-bc}LU%XsQtytF$9w%zQ$KK2~mZ>g#1{;0rfry07ZefGL)@QnH^sn<)YZ z{*izoCfhbkt`@qRwVlf74{B-3Dt8!V>fQb<>QV>Y5l}s42QW=EuI+sJ2yC0slJEt3 zEeYQ0OcnFGLtsk#$FuSDNWN{wdop~eU-}cTS|c3p)rZ>N6zdGICVM+ntYWjJp_`2y z9L&)H)>&S)UcY3jTm&(*|VmaB7 zYNyAKM7vj`TC}v{3j^MQ= z%Y{Ion&mjssHHvDUGf+=3w83G));m_*it%NV at a>b^wC(NFX;!&-I6k4Ed%BD at zM#5 z{KS?!CoC*2^Da^+M1AyMkMl$1HHWebzC-f_;Vhrq19IUgt{14Ki$N96j1~9cVf~*8 zv=Kgfap`kzcVLhpUn;7qyPU>LUnQDGQKgD^dD2%DE- zujO<-5pnnU*Q|@UVs}M`7>^OC!+*56SJV<$T at r60#{L<)Ndy&ztM<2Jh(rFb#zR?4 zS5q;7v!loVeRtY!NfMPWiGgB3a4Y1Y0TtRr<}j7qR#Q at n>N?dKDwtSkWXMWihXs^m zO}sT|KZc;bFNgvkJ>th9 at cne0aJIv?jWm*DbA+S$>H98=`D_l>+0dnMZ-3*^n3Ig>6Ue z(;6-dqzR#YgRRHbO6-{nuBNHmmeU3&JW5qoZ?apbyafa^ZN*in;6d+>!%Y1pij{Br zcFByHaRyMP^Kq-QltuN|u(z2S-qN+oEr8DuouCYhJiev778;2zK<9NGUYaeyaquEN zPrFf|+=EH=8;EPd>MvSo|S!5T>+Zn-vZ zya at e{A`<;|7XRl}?+!!3jiNmfk?yCLE8_7|eH4nBE{>~%4B?m9z zlj`znbKkpsPt|Etr4olQ&s3dSc0lg?#TkoI*;ad?fXCq=Gh~ZrD+?uy;GpM>I~*RX zZ!bE=8B66Pk6nC`M*O-^E6<{`fMQA5`m46qiWGOoz zOER^jB_Tw6nBE?#To}+~1XcEClgK1Ggq00em}`_2=@}`JStBetqICA56lodf6mjJ@ zq%v)vLb3}#j%}Clr%i#lEZc}IQ{@(HI4O7QND1Z1fMH%;JVb4vmozrA0)>4=o5^dF zruLZ*x-RC=b_3#M0cE$yJ;UUE=bVWw6lEqR+9f6ioep9fxW>v$L*cU+cS||J!Nwbxzd%irZbS{F+gjh69!a^&* zF~e5y1t;$%0^&Ll8wwKr+ahDQ#|+*-__T!~M|=O!-q04BSLcBO0d>IqCl}klRjRz5 z$-g*UkJ{dUd1$`@$Qq5bbcD=C3(_)6h{aH-^>nBORLKU=kf<%HQ;FN5bXmG)ZcD(< zqxS`0B;My$48IFv(MBQ0B*p|L at 3Utb^BGweupaGi;<5?$UamXbUg8A&-q899 at hdDw z>DV_oGq!9>RkH`8BYDzQ6NYfJ;tt1;=s#v?H1=u)VV_ewbEm3HkW!gt%5SEtvU*A-Ksm)%-vAZ9CjE~IjK#w z7bbE$E+sVeDboV0dFPhOZPFJZzsDN)V@@8xy0YmvTqlw(GgED&z?X{uEYid#yU~=I zw=Z6vL>s$sz0 at GbS0fzT?A9N9mvqzTp!w_+=R9}o5~^`K6uH!6J+i|Naw)1~1)P^| zA4HFhLk*WuO=)%+C1f%w^A{EjFiGREx_;vg%&r1Q7I;p^)yc-mF at j@PY&R-3I at cX4 zX3mh>u8`TWsed8SK827SS|p!T9$*g}DY-p0J{7Z=YPObnEpwAzap at OcH{%0J&uB^~ znlpqO>C`rK;tUWKMtM&~${p zfx7v+{oXsRUGbRr<4(91Vi&QgZNx&CT*(zSc<8IIGID3<_c?M;j8IP8cI*ivuj-?! zNcb`e&Cz?dV>ISCXK~r69iYJGA2El% zv3B<-g3B`&9l*fu9TtJJo(Frs?5{AyLqJ1iMHQ0t)T0R&9Fs~0O>E(Z41l2E9bXd& z)Y5sydck+oUenFcb2b at hjTE;>Xhvl>F?5=wQk`7v!%BML;#R_m8FKmqoVOk{!lsu^ zf7m!cJo>Q2 at -*4y&Q0-LVrEHigK6e4aNs3v at Z7w0Kv-S}-f+%VpWMaLbR{xj=m+#*hU4o>Q5+k%jF0EZ>M5Cv-E z^4#%;98X^n at aH1F+;0Tuk>~mOFI?#>ui?TE3t1Ndy!Eg`w~_T;VOq2zmnH1FtW`at z_eA0%_b?j at bEGW`WS(=xu6EMi!SGk?+eN>j6==@5mruJOrKkNLM28zCJfhjulnSD{CWD&U#zVofpPIKA~4i!f==W;VmG*%l3$|P zzM`Mz<$VPilG0k1VO0~49~K at +i7Hr?ui$)#+Ibpf2z*G0mqeNB-W6D#r$e%!^O_H= znzeew0=4)GzujOO!p5ikP~D}e`5$3a&?3SnM?_8z0~{j|#d%ez at XJ+HNtZT7_d-R0 zUBCzK;bgxc_5xry9{%#CLe*oq_DL}+cT5t)ddQ$61}jMLgyYRQ&2jb5T55B&wIG0!1IfJjNctWfFV2`;r2}QJmg=ws6H@*>Rb&sEa07$`bFkGG z6%i;|aDFf%YM_0R5yBMJ07y9apkKI at Uv?qM_!yIL7;6~4R*YI-!awH{3_}=m{~tg= z`QZO6Cd2Zt7YEh3|32H1tgEFS5?Q{lAb5pf80F3gEJbZKjLItPnMa>wI_|o9HH*#Z z{xrvUe<%m9x9rZC`&ATem#RfWX;~Dus)n&_$<;5uYWSSo1^{Fj0u-`F;KXiDmAV zftuY^Ixy^PCro>B2kQJjkXmY=X=1Io%Nyh2t5fjW0pT?dufwHRKB+V*&2Mp~v_9tBmnLNo& z?Xrg*a2GVSN#Rd7FKkN$U^CfVauv31?=2S%9_FBb^2{V{A2bV_Z6ZRW$ugdkCA!I) z!>y!4GOe+wH{npIyw*dhdNkbh?9JLH8COIc>oS-BOce#;%~iko zl6u!pB>MfHyNdf1PZ!N~r<@7Jxj3D{0{4kPNX7_mQ2EZB-#SQ*(S~;%=h5h=6e)=# z$33n_ohWQxeg%@dT$*odV3G~Zl`-drn=`?=QLj{nF+^W$ z206D3=1 at m$rO>RhGf~VK6)}Udo)e+ zrrBv#zkN(-$Excgpi8G#=Pfb-LDHQ2*Qn5lPMHyWQu+^)3Mkn>VpjHj1XLzlGkRmP zox6ewtF&Kdic`*LkWD{F5jB4fVnzQm|3aeZI4kNemV5tqSZ4hnEbl2SDWZPguv1p4 z`j#sLD*-#$2!|D>`;(%u2|-{JdG*n7loWTdUDpIa{2>WnfMDdu%=?SuGuI?pUs~;_ zf}XOnvyWM>y&k@=x63UzASZXDLIg1stZfdZ{^$Tr6mT0K8mx4dyZ(NW&|NYGPpb@~ zoV;3Q6SY9PfqDJ=VvV>!W)kKRsNOeiO%udQFMwVMqs?Qh|)5U`TSqkwAH_osP+S z at jd(0FiWwn)FzrIaPRIf10oCygZAaQD!${&aIE8Ky8x6rwUUW`D++lCP9)(X65UTv z0XQ}zGghEJ5e&sg5D64JYz3`BbRduDvO4v5ka2Xh`{W`GQPQ+JqpC1P*lD*rh|u zenMT5V-{pl{llKXgS~%;_4sjBWz%0+3qt;{V9oZgZM*7!Usi9T(=D%36kI-}AbbvL zL>-AsjwehA)|iJRI&h#oYBcGxb}a+P{{s02@&oG?ER0xy(En5#x`rVW^WF)m{@N))(zB93+M|l!`RmJok&0s{92j;r at HWbR_DG4;qFAv8%w-Ge z#~2FxfaiYFJ+D&Ivoz(f(NGeA^mtq)gh&?#EX_ztLY{p_uT~dqr0!F|ksm$l7ZzAd zy*LZyh_kHcVT;K*q^^0=RsVwLZ8ul-n+@*H#V>TfDciV@*e at fWD9#kD$d#5WZvM0w zMaI-f)e97`Ieo%a>aP+?kvi;N=S!oN7 at f)|8T^ONc;f8eUxJPo;QY2%Lf2ikkE{7T z%Xhpjtfcqf&0731$C_IV;3v&k1df=|w(lchTg9oW921HHSpsv`%#d!Se>$!z?=DQg zrlz~Byv)C!aMbagvH2dY^$J1BR3ScZljiO)C$sP6vL1d}UB+xw<=Hjhi z^0`wyn`vQ-t}7ND4j|uj;wAj({kr*|%AggN&wgxXya($s-lrdk+;F-ae9lcditP|y zqc=xGb%t>lY!&Y_BsQp)_#EjU$cx at dygeS(V3eum>Sgv57~ELlb? zd!T~p*qg#E2VP>;!ZlRU$@pg0*EMt<+G`wdQVD2rE~?lPzTqn%#xs`07qZc?y^q*u z4^m^11E|CGtQ|QYW-1Vz=7|+b&c8lOlK7BIgW%Ei%l9kAfZe%5y}9BgJWt$HBo(H53|!*y%4MP3K}ziy at hX-Egb18? zCElIUvdC(*on^cPFx5K~Y*tj;VwX)jMs$IwY7Kzk~vuixN+%`hnD;;8gcZ~IN} z*3S2%0f$zCveDRF{9H*1UIsSJTO<5{9R%~{?FPvAP1n&&Z1s;rXqb=`cjeMUgQLuD zSEudoYjk~#Moro8kNv_Yu_07>Ye}P at wZE8bEY^qd;HbKBhjifx3}lAbv6n?a*3%4L zSXu82LgVJ=@1XTe+dZehC1!qW?qbq^5XbUk_}+$b3u*112MU0NqIgz~c=f!MoDiFu zEZ7Bl at Fj375E(ouUn1MekDM#6S@(|b`c>3PW!;{Oy2zyG{GwNqk7zm at TmN%B7sFIj zf?h3Igm<%@x|hUqG2PA}ohW<*Q^Xgo(IHtEm$b|-A3&DW$a_wPA|$B>BQ-Y<$Z;jg zT(P;a4sHyC^b_l1EVYale$KviNL|g;5gFl{p7%BsWrm at QF9F{uEEl(+Y4}4N3^~*C zi9(rT^9v{ejf}0vJAzZH at MCGxnDpTa%IKqFjB}<}?9&&ZWf&$Ysi}AK2%#7!O7R?4 zOGhZw>MI)j1sd}eP4x^j+n~=htqFb10Sw%W58$c~M{%%G%TnPZZWIv4)n3agheup)=3kAsvm%+bTfb zf9HSwsXUC3e;sG)WuSrASzUPEQN1YRoFU8a1|l_I(|fUDxd;`3ICBa=FuHf%FYatX zBF#>&J50Hufz^QYn-bCsSbs$O#vAU;GMDHL6zL at qxzO#_ML2ihlAiqgAInwvYbS}G zzyG7);QuMj^4}VXkcr8^_mC8o8F>^X)Ng<`&sWON5=z)os}W`~EkrTe#CY%|axppD z7{j8a3>mEK+4Kt))03=rhlA0W2++eph&v+LPt9|g at H2Uuka{fgB&Rv9m+Z%!zKl9Q z0Y6~Is1wRs5&{ueWhG*1SO-+2^iepXSc*C0UGL{8@>t5j0$My3_J${3=fJ{EEY(=gQvn>GhK+zlgXW$H*yWQ8kt zHvO5;;aMzb!4KxKdsn^BF`XwYyNX^dy<9GQR-=1$v;|#hKK-1+U2z-b7gl5dlYhZM zpS~|l7G2aVxLz7)2AWB%(EY6(&HeffH+G+0I5;dpPws}AekC%1qTb)+2Nf)ZJ-SF> z7l|QLKo=!NykMeXVWC#)wVA5!Tx5soR%J`l3Avrq)HUQ38Pp5rsk{I~C|I8SpNs(W zU&Yk7ZEVZ1N`4C}HEIo39o=NxMby&~bJZ=U1F zH5v=1`-nk$K7%av4yQs9Pb5ZQJi#}U?%v=pm0l>B~B^LS1wet}Dph52>C0_q3VLm~g*O?meZB`2n~Gn~uc zl4u6|PXXfp5UtqSxtjiaRphA1*dhO|3VK;DDpBzDIoO5ZVoZYZ z!5!!J!E?qnSdkjP(Ha~MIh)P)JBU|(S#R2HtU0{%DS)_Uwio`($LuAuzOUaqY<_f? zl>PCjq>c=6z#C~TN!_$CGI%5|2d6ZwrS@}AK2ctH?KUcG^(Z5 at bG9BJfv68KRlAYe zcnzJjT>ErxuWJZlHiS{Q>jqLr5eRLlhBpVbiiu7fWEDalq?SS_&C_t>erVX&Mf4fk za*$|lrMsEB)$A>?AyQUKZH!5vqMb%}7DD0;-gD|PSl6jmM?u+(+z`C&fNy2|?!MYq z_rg*qUaVugU00nVe at D)HUs_2n$9HTEhV3ZaSu;N*lmsrq^1ff#s$N@;G}elqLP^sw zY#=JZLYg<(YZnC(n>ld2V1H54VtFBHtRn&4xj2a{!woo0jb$R`N_E*Dg&xBTJ^7;r zY0FFu(B~30lka>`!ZCM8_rUto8nr#Kg`=jB9_MW+Q+EOy`{emce*@{c%FDNF4=sq} zQKw*RWm<0SVbg2}nj7}Mwq=Adu`WcxieHOLqqt5mkRO>zwn7XzBU+2dx4aLU&x at pDO3 zniN$4BsfzVn?!(;3TM=8a9uMShujYr9i;fsX;dP*`I+(kfN-Teut8tqTp8ktY8si3 zM>r3A9)(e^0{jV`NvUIBoT&?@^$X+oTKp!a4p;tZJ7e*2JLYqKvrN0}`jE5tx*V*! zum at V%MRo}fE)1vG0vD_=RHGc-^FOxoB=e}fl7G=0_8$*A{2Q8;O`S#TTmb)=6#pka z!)(Kp%7#v?#Of{V(n$FzNT9#Z zqimKzYGjn0x$N*@&{OG(6O^=8 zL}!HY;9#g|Gx7~y{y1UYCrC^(F?(&QMrtz;J+2$Swo#!f^xg0n>v^HutG|OFL0>Gr z(|2`k`+PBC%8Pq<(lMZV^6Al9`6l*q=M$Bg0hu&eaUV;?$AyYTxrWk8xdzToxtbDW z{w;AyRQ|zb0U-tN5CF!r;gwiDS|ZnZb79zcy}rhhf1tQ6xnHhi1ZWi}glHyoW%GX`efnNT8hJ{HXIX!d%)7_r&kk7UlOtHJ1XB64ZeQe7%s z|LdG$GXWASuXhu9+n=!+;fup5lwKveBW#2CVJzk at 7VY>GIGi$PWS&W)8ShCXcr3ll z?9SI5|Ae~60M0ZjhSof$)$|97;Os3`rP$1A{EO^I`TL4IRF zK1v(>IyfZ)B63b9EwJ$q;Y00<+M>;t;!9NhPq1$geecH+3}lRGgujG8`F^_=BsnBenIzt8UzRB3qst2M+W z>|;X|cFZDtkj_hHwxRQo>su4REAC_KG*^Ve7$?`1o2S$+%Ey^9Y8BJbWzKdp;JTx< z3GH{!1>3bc`wP}n=%r)dO?nPI#obXl92z}g2^7Wm&DqyLewn!Jcgrxta2 z?z>HI>tC1yUU&sMX-e51AQccPA`_cA?#&%96K!C{pOkwVpm5YYmJH58ns^oq_X6c0K?(~kL(0cK`CMjN zUl7<9A$oBna2l*RMAs#QX}YkWL}NKnB<_mg8TP8I7C(}r48Erywag)H4)o9=i{V9N znk%A~`DY-gbNcY81sV|0sMLSbApbwn{;w^nHk3E6DVm>MIT0Ck1Aw+G6Tzs6bA60 z9&P=-uwPo4Eg4?qQysDbg?L3qSxjN6*24^a at s;Wc+8(pY1DT?ok_>ivOtvfff25)h z>B at F$4>aA`Uz|y01A0sM*Y3sf9h9MVWrv-;q5|6vIZ(Ud`X*+snSEtO?Jx#nK0o2XZifSi zIr|{#4?nszMt8Qihh}=Vx5sAi0nd(3C>$?Nk3bwB?HhA5gd7NtkBA&1+umVWdI0>? zdn7Po_r&Np>iV2I2-NWV-(8R_nZyTzjQG*PJ_Yi0yQosZM>Pq8_ST9~#O1s88d2;a z-VN#KBA6W6MzUe67#js8_{prGKPGsv2#SPiA{2QsmuQ1 at Y!m#+kB%Tm=mzk#oH+4! z(YbsO8+HZ at XA0jK?W?rr>t}j}UBDaOtO)>Y zT8ue+wy|m_RN7u&W-4g!%`dO)HeeMn^I)I$?4HF*6m~^u<{2M~fcWajMuGbj0O+ub z$Q%RR at P6RSd<$2RqrZe4?er=N(|~>vEIR(mUqQNB>OR05(5R;~8uuIQlT!dkf*w02(wDW#y^11g2x;!OX4sO(x7L6tK}CNjwRE`7FWa zDY!~oXJ5|g;Kr7418J-sXjntHuvR4263fR+o+f1IZ;&9J8-$F{Ne2b zUm+r`nHjEeM?35JnXN-4+ZZIJp<{?tm+)<-sSa{xF4wEk?UAN`c?Ky&YpxB+sb>=n zI&@s3hO8;0)hf8&zmpaoC09Hn-mBcg+{6dmT|PJcrFJqC{wV}RdWQ!UyPtbCAy^fX z{)p&Qk500>VZO?(6Yu04E*jJ$G?_&8>l9hT%7*pA0Y1m$IE at 0_QHjxy>2fj$0dIit ziUh1z(EsShe(mw$GBJEFFFev+*c#;`V%l+p$4v#5h*gZKNU%Zwm!91SdhVEFKOr@= zHBXZ6fE;47;&;o8BneVwBRQ|hSPYd_<0uJN{23Bv)8ljKRuM4WB=G}uXCeAxJMLp9 zPl0pd#+n|rc{J{DF7567RA6fp$Cw9un!S1QE zb}|_XsGYkmqcpF at 8{w-&MNc*Rg!~2;ti^8oi;6>EdMoc5Sy z%XT%AUWQoKpofZ=a};_BtbM|gm6*Z~b$P9Ra#EOT<2V_Y)BzK%g)H;VG)6TC!$fyn zBrXe8tKw47*()jj6q_VY;I*zh2amB`&oCD$KMfJV|XY&k2-_7i8|ZU`^L=tLN4seYoH`-LlqI} z^Z}%yni-hg2hNZzjooSYQk7;)rkcCTJt>>4$}l`1&9G6LWDTMUR(HSOMkoGAxTm<% z9hxz5xNOrBVO&%ELa!Zq5=+tjc+w4qLB;Ro$7CDB2>aQcT$73ssnqUbMZC}gE{11O z=G%-CH-9xBJfEu%piBN;CfhKBu~ka&qqF52N}rNl_RB)q8sCy;(FoPjf zbz)F?Poq20CSGOG{6hLlcZjwc5Jq0F!uXkciw~z>anQyN+_ChP?o~f)py&2)O}yns z*6!iZ_Kr_qUeSd^TuMTJ|Jo|w_%d>o>!tn<5FaqUYmfF*xmS2K59SUVZS-a!4LaHa zh4A&SpT4&#@$<8B=A at r;QwY6>AA}Ce4uu=*>$hh9RvmFW&_(lwFxluk*h8AkLFcCK z9V6Kbb!&u|77^k>V!V6FL8vf(M^O2U$2%l=RY3bA#t+3YC`auZ{73Cx;8kA_1fl$u zX-8V{QdwB5A`vvM+ at 8u?Eo7>_1DBsc2CVY9 at FY-GgH9%dI#mjwnW$PJNu5e2mLmOn z;;bi*a_#t9eYwPMUy(>1lTgx7$tsUsCyi3fjD|3_K|MRrK}|pGh(^<1aXdOC2e(?; z9^QXsRITg)MX&0BMX&Ba#!*!skaiB%-EVj45aXmx?;zi~%yrRN+`xR;=yZnreZOOg z$=WwPwK!ZIzJ!7m+(>F<*G0xWGYk25B6#(b at 1Z4il1L>=4IMWzxsS<1FvKvCt4k!Y z7~?WBsXT at tnPjMxkkqp2tFxWx1rbg`z%Wf+*ONEr^u$n6n_ij|F)uJE%LxQ{`LcXcf}CnXj at T($z*zbb!+&_a z#x5=_q{X?gk;-C0|YK7RB#=`PhUFT0U6duSYK^ryE4N3W7gI78QCPPUW%g%n9v>-_`V zIf%^HAf=WFCn0rjh-*u`Z3gG=kHRSoG$QL=dsx2Xn--j+Oo5Eh5e-U)mrx5k;Xl+D z)O&+t$eKQUH4hKmHQne at kFj#ISZCuNvWg0)(~lKbRQ!3uNu6{vmtB;Cc5=E|JLWaXgQ$qech#OdDcu8aQRg1B@==ZuzdF@#Gk!5k-{4}vbZSUhb?3xOGQ#P|_;+z(j zvzhbhZ2q~7X^||a%Mq5!?2jg#Z{rjTOX9p>r?;S;o_MKFrn|hW5G{z-Xcz*(@?Bd- zs>;RRzlY+8n{s=!QgY1?X7u$RFvTOBX~XzpXqjsT78z!%f0hEK$Cfi7ZZx5DNntc# z0q5Yspt^O(K}^5&fq;;8BwzmapVKcg#vE(M$8RTRKh04-)nBJy80X(n_F%tzNpI?c ztIoBAZ|h3?tc~pHs{M`l6^qi=ma0hd1wUt7Odz+jAcS at i#9kh- at V!&CICOzyS={#s z!F^-E at A?6q4_g;03WM#-`&%yZDd2fOVDgj?F8j~0j8O9==YO9zQ?$*irn%5~2h}n! zR&A9J1@>7I!q2N78U`tDA6DRknkG?@Sw+v65$M$8p at u^zB)NFDbpR_0(ve<;73vag%lxR`yiWpF?)o^lL%3pFCl5ym zN>{tsK(Hz?N0cTY#1dgNd-TQp0BXNs5tAbf20BCTddyG8HK*>7mmabV)wpT!sKJ(J z0Xn}0FtK&(3wreXI|A!&_?o8V`Y_7p8&ayW6Veka>&g<+7ktQog>SqoqKIZ3Y;12y zG$;Be6=E}1(6d(16H()>`&vO92!X6Ki4Isv=E`>I1DO0xCR6u`FqvWV=lqk|LG}us z4c&ux8DGMgKv<}6A=daY{eZ}u=W){(Y>DK?hK15u4I))RsouCel%=0wMVz6cN!ak^ zn!aE~n!j)S?+R~Y$-Nz=Uz24I+>ole5QJa<_G-g5gm8wr)1SF_6*aU?Rs^zL at Mfwv zMI||+tVLFcX2|uezl8b&0t3|U^Dr+0usLBX^R;x|e3_<^U%Xe881lhjkF5ZX&G*4Z zL^A-i8C$rSpL8=zMwxNknFy;EbV_uj5P$G5lmx#VU-^|JMJbeSp{y=NZ>0)$emae& z4Jw~TH^p7>!l(1*vR`aqTP}zlE?M$b8xm2Sl$wvJH-Nwn9yn+4K{{=&~>POpRB)|_6o1utC>iayJ;ZCX3+wTQH5vWG5&`;A!%6b8KqTOxxw`r{~P zzt@|AfEn3%^fZ9PZo@<=7RJE~zo7236kI>4KBEN*B#M0H*=bPGCGRmAJ$P*&+*gn9 zvnP%`lE#1!3+fW}A$ibbLUY`;-GTL3b|f`1dx=8}2LB`63eSm+Td_$(kx at Rok#8=G~!$h at W?NjTp=r(-j( zESYJ1u>IC!F5nkY+)!8d%ncq41cp%w-5vF>3RzRAti}(-#vwclK5tBZ%7zV#!ur2Bd*>iepD#PhG8lw*#ihlv&~1BzA*=dF%q2|9uu z@=}TlOog?fP zN8BL~$JfX~U`V6pVW!IX z7sB5fD5kridgM1O&@=D+N`8L3RJ2UyJjokwi$k~08{*c~oQ#B`?iCQJ;W7*zJ%0QX=EVJZWh9~1g6`KQ{c_%ZY+`-j;e z>RW=qt*&?t9l9$>wML5uaahy^J# zHH4$e{rXXt732ix3h*4SshQdJRtR at APC=J4ygvT9fj(8beth#rpx zrR1>1lXnbhnAKV_21aMi)HSa^ETE at uI4iX5vyH?IdbQ3;D8LF z5(DX4%y7EjW~;9`@g3xIKFI&Nrx1KGDRoA{Xay98AQiD+G_=S<%SD;Vv0*EKty#iuns zjcv}{flapmV}1G&vLT<|EM{aj&kY6-hWo5flK~CwX9;fd{on8!`T~Ung}m at Hps%>f-|prxbuJq1L~LmP7r^4Q~}2=%!{N|y8{0kbj~oYJGn zi~B&P6i at _`V#&9bCrQgx1A)>-id4{osnhrOUbpD@~km+tT1Zxe#PeGq!+J zPLUi2pqg~sYm}*nHMrd-fs%JKNjJ&np_i&`c}xDfw at 8S)i3=Hj$i>v-rR&DXZRSR2 zm`1Jt8E%1et|_(uiBzBsG0?|0^jjZ;nfwr*G|uA}NYbGJAg9U&$*t-P+%i?nTRuIq z`m2!UrXPVY=Y}DoXk3J8>*P&B7Ki7)Hg*Kh(w=8=?#Ui?hazIRz z6P#blqwJN(BqY-AX)Viw5T=XZw`-FPorl at pVXfGAi7Y?OgO4&+eZ}MQTt4?rVpAA2 zum6V6J!;iEZpzGSru5>9Ib1DNoF{#Yu1=`@L5gxNnM|Q0@)(1g`S9f07QI2<^se62 z-lY>qN3U*aOQ6X&D?mL`MZR`Nfj4SP2hs|4H>))zuCg`9>t>fOb<{F(rhmuufY4Us z5C4Bf&w03Nn=&vEkjsCou=)Q%&wmt17bi>FEeN2Dd at qnWAn9NM>(19EBN0eSH_SRp zs+3D9t5DiYE_GbMmM0h$-hnQHAfeNFW5sKbz!)2}x-^3X{e>o(&^Uo&2od}f)+VF07H^kJe|r4HyfYnSTaV3)F4?6a=0 zTp|l=oOhMNmKk97=Hqk1qoZ!z^2lZ4?rbZILi>3vj=g4e6MuKw3~75GMY at GzP+&IC zXHY93|A}6#E- at Ny&c}e}lbIMV`g6*Ml@*3 zK7^D4@}P=bU^NNO;hgOO=B^Le8cz_%-Lo4!&RD{Y5bkkcSbt)1hFmuDIr)CILAh-8 zBPF0X<*6-dF}$N*K44rAfa%x+qhIc&o at ER`$5cu@)t;p5`% zlCGys4tqIXlMwE8sqEFYMn0!I10ZthOK%Yw6PLqrMV_?=kV%Ap-Zw;e1>F9_9LEHc z;==1MNC7DST{Z6i8L0muCRM*sM;1r*`l-m at T-vhzW|cLk9?4kC;O=?v zaJ%keetr0@?*}m(h40I-4I0i_KI9!jve6;6cwZ(* zb+PTvxnDtP5)m;vK65s^WQtTHJXBJ)m at dJZD(`PRR>!Bs#J)ks0W zCErNP-%KNm^w(GTulfjQrr}3Q&eZ&j;c&DxIa3vmuXyp`}tDj9$ z)VHgcwkEBPqKemxoGYDau+iSE-zCQ{wat#Ln)IL17wosDs+oDjKmT^prX)u at QrjZc zm0l+tRc?_W)f^GUasS~pZYU^jWDakiQ*cC}lC%T538|otrqiujZP zW(udi!w`>;B5n1^T6n)*pw0D>FF(0hWs=2`LZY>du96b8F0ODz1!jGLITh-VE&7t9 z8Uc&v62nAwpW9QEyLLafySfliSLYd`gLJ=_d)|4Wc0lSasH>zq5;HJchYo}@rJ83{ z(=#;C%4a~Z83X0MFckit5mer8bGSSh=s27h6up5`zga8oo|8A>zBH8no)y$izHom_ zEAbwk-IIY;bX)Y+fe>m++fh*o-d$kTFX?v%Uxpo$^{Xa_f5t;Zt131=zb zAHQB%l8}L)QYR}W;i2cA49nBA4GWaHqO6j&U4f+TJka#hXQLyW`-ADHOW|Aky%`i< zts?pLv7#iLdY`u8ioJC62v&giT0n>Aq;dD0Q|5MPJf!8Z?Rm_XylIz*sLHGi+)Hki_ zj`!=B&$8k4&ti~0Z{vo1xQ=jA)5tQ=NTR~FR$RmKwZ at V-aRp8D6Y`_U+9S}uuyyN+ zc{S_F`*{6`5TC>qAq1xkhtBXjb|-W2HFYpwHpmri;1ikvjPW1<+jEpm7x at FMDWq1I zvzAq~mer$Her|ICqZWXE7Ufk#+Zxy|ae_ti!)>>;PwWSR;x{pmkXn|@F>x?QrW27( z^Dq|6LJo7f+uyFO)m51j(TF+A;dsA3SrjB7_8WpGmYc at +SFX6OelGnJ2hDKD@~i+t zHLEpJZRD_n)|$-Dvtz4GsW%Xrq;j&MJ2WkatOLL7W+lxSmi9=U~wPQ=Tn4vnh1LKFW1T;ReCg zwc0 at XS#1UjuTl&!OP?+RuklMx at zw}-CgZ}FM_y3LBzD-MW*tX%HhYB7?CR3NHMh|% zcA;#Y%xxUx3&n9%tUTw}O}}A%V2LUVdVQyoAS0)&(_?mh0y<<^gI!6qU4-+O;1>a| z_RN+z%#pAefKP{5oaW?ExWS1i=J31A<8}5j8$^HOB;7T1y#YQT+j4ola;;ftqefj} zYMKS7P>9n=pL)%*Ij~u1Rrg4xA(ZgT)-}M(Th|^18EwYNeeP1fe}b*w1kGf!4 zxtvSsf^?(GuUhT-AF3ksw6aj at zpP#FFZZJUzlJj*r+)~CQWRw6ff-S z4{47KR$hKIPPIB=UVNis>pvCD*E zIND|5D;nUHd6f_~M2g^44F(rK=+d#E1&`nC8 at H32f$(AAkz26c;(;}$TufxQmC}vP|9q?jjhk4!f88zmB;|RG3cn-|+ at O0s%4ncVjMT`|lR03IJ#G z|1|4T-H_W5K;+E|291V6(emsO(mnx})AA&SEEg3eDE@(pQXV&~8B#nPWv$%j#9!1S zpr3D9Tru-mR?*NL0W1_l3`Us?aGlOxYbe~}_w)MzR_N;t6`VAeFk*vHUaJqqp*nwH z2{YrIJi5&$>>$wjNyAhW;~hlUK$4XWXe86o+u7OL-!5r7QZVi$vzf5a$W{0r>659Y z^#*4+t*n{oA|1K+kxNjTO6 at R}9#0*Rb#yD19(HKOO}G0rSkisS+|+IfygHLg0fgg& zZvF{z#)OX5u#*E$wvY4NcZWf969@ z?Q_a&%jKeA`m$K8mlw)ea!I7nQ3pMsXEX9ZhOIt&}^bS0 at Jxz0MHnr)&Vdi&Qr}=;kwzY zj|2;$CGJSW8l4QC4R02}4}^zTG=Y#3_q`6SNl{ERx82C6O|S^+C&?HGLY=Q{c|L*9 zuq%|fnZ)A-5_B=PGJ?g?Et43W zZ7a1H5^y1-Ag*W-$|=vW3fZ?Sk{%h=)1jUhw_2GmTRyPY9Y|8hli4f{@HU5`NSs2f z37!Dp6&|Si1^x4oU}$i*arEzY^9B4bLjOO~yBMWD+XVqcp9>BLLs%DWb79I~#bhp2 z!C>l$5EYAl#=0fru6;EWMu9Irz+2>+@ zA+m^YgUz~w;y*|@eC6O$3DRUbGZiYqtxoZs+=XA1A^(+?5vZDYbL5i){TZ2-1W}T> z$mKz#ns9Ugq9~_wZm`j(i@*)Z!?Nqy8kQQS8w`u>hyE}t76pjoibb0ek2)^=+xVA) z#9<9?Jw50iyAMSPp~1gf1pJ(ZRAKi_Ffp6IJzN-H*D=$WiI<=^M(+Gz%tKu_&)_j# z>0H(nxuzWHPN<7<)%BlqdobR#A3e_>Gt+lim|1`BQQwa0laeSFKtlHT=lD7C_q~~S zkDIN!e)C?YIcX4U#I%zFr-K2G~<=MlkR;Yh at cM74j zK{AqU^m)wrX}0Jm;NyD(JCFzi!zj+deZ$@JxDVTmLAt9^Y46;! zhrBu;ry5&TR`XI8>jvT60aH@@t|%;MpHJ*8WbU8rS4G2HR7R)S^|+Ob8rcn1QE79#=DPEaxsv{fXHY4!x zmbcoig^tZo=xq88U&vKj3JpG*G95L0A>FA{ovhe^WW&>g5o|dFdM$G69n+Y&%-l9} zuvGSA4qF2%lG)qcMa_rKHXRlt!@9+?m14>wRSV1VpBlxc6r7txHf}T%w1}tRtP@#^ zve`8(JTs2KaOl?&Zykb at t~2-8F75F(8QsBEdkM0f!YHzwkv-lm(>o5MW;fNtON6I- zwaMll-Dg!BE6~A(3v^~`RH-*7VWFWcB&ka#8Ush)?>sh{%=}eiM0FqOI(R39EvSlc z8FNy+LNUg9=AK5<4U}kuIxfuse0RRy{Io3rJu_p}01?m|VpsrmSj%HXX>mplPBucV0>NH?% zT)r_oMGl%Hc6V(0Us}ta)NMvR$2UMO;=GmnT&mm^MSA6$DQVKS1TWR`R8&9mi^NEis&aCt0+%Mh9K*x2Ed at kDi?bvWv zIK`CkRlcliHhFI}RNQ4xBkE)Eg}%5fPs9zPw42nndFhrU=$rU#lF!a~6~1;`rA_iZ zTR?IW(vOo4naGK%GGCw;}i{A9B^%Bu+``I zd_c~ULINsBVKG+nBQlGW8e|#y1Ov#+_bIOj%aF*9C{4WC`2>Xrjh*+CUQl9i2wX}X zWn0BsLubS!VQ}AA{DM_1k;1-uS%;d;VPW-zmnk~qHakvRgSY#466CsqR2=PHoG@|O z^O;xQ`C5 at W)~W~dOc(P2p~LBU!sDvMD$oBY8JH93+g*Jk at xLbEJV_dTtVcSec&rmh>>?u!_$v4bpjT+(1l5U8s3u+V>U zzCQ}>adoMOo%eVT!F}UwjMu){i(U`&HeDxDak!Tw8}jM`$+*p(xpPg%;|%D at F#k9? z12R?V8P}O~xkD*&)G-s3Y)6DE+ at Yi{OE&q=u}v?GkN)=W<~GM?3fwH?M&@w z85Gr*Dt_B7$@>TYL)CriB%)2tJL_jvp4-yZ40}+kar-hRZ0u<^QZ;q&wbAV1{*+&b zIWfu47&2QyX+;lS7`G#Q;nBQP?i@%5j0RB3dSU1KbeH4yMbF5n>mJU-s)uI8_uuR&SnJIJP4)hxXi7;$a;E ztuH!7rPFSLbIo>&GKoe-BF1(} zIw%{h%g6__a3%DIa;1NgePZIO*W!6RE2yW>FIKo&S%J=mC0n7=V>*azb78{=) z`2C|4HW_skgXb at Ui~q~u`2U+19L!v-0gjS3HZINpLu(URfIW$fg{_r|@&9g1sPu11 zB%;rek$N{u-;Dd8d((4Md1f7 zJ5#+KmWQ{e58z$U4Z3Ar6&-5^)9vph at 3TZM$_ZRdPlUIZw9FcWYC`T_uM9-s zJHL=>zLMSykSba7JawGYZbBtllGUXaM!BU+xN at I5R*gA6AM6;C(S6!h4a?~6hV36K z-7utfRB-$WMagBc2bmh#?J4yNC_- at VgW*kJg3ma$`_ExlC_q$9w at i$4cvMvsogHuf z>%??;_s)s_os?hTKtLk@^2Es5*{Ya0+E~~EtpB&!saCm?`!@%W1^IVE0xE(Ru)s!9 zozHS at Y{{Uy0z+WgZ~2KL_{-_UD_h~6KDS#`mbvto0f^gzXgAl3l9XYAiMR}}lj|I( z8D3`Y9^da5s9nzHdWl^{aEGeWJC2ws7HC)~(rKPh9o-6KhsH{tmYMk9l%$&#Lmj$v zCJYxgBWzr;3w6PQHCGf&sif<<4g_4?LtB|P?|62a`?&nN`29?nOkwqfttTCU1zem; zZFOdBnWiC#$|mJS>Hu at p^O4RGxTwn5yKWa5hU4_n!^;iQFG zqv35}JT&)TY?pHl?Tiy76P41I?+!|7?jd{%S$3G5=MhG`h3qTM;q3>O0`S at Hk|Dac z*k|1~wFu~i|F#;g<4Ej5IogT1Pb>VuISRv3Ked8(gMf82FK$RG{vGZUTUH!sz at MLt zfDE3DCQj6D4(Sya9=z?t19>T21s}gWs#nM;KS#nAFK1Fd4PKr0&kPVCRBT1`7pAUY zKtO{3GED!E7~S}{lrYC-KD~&t3#hnQN1Bk1eSnxFCb)t?R5of+%y*}iy5Y*R#qqN2 z^+)^*l<$w+c=uh97mC3un<|Y6MAFgw>6goljE0d^zmJb6Tp&Gv)gUD6%vzIv5M(^0 zGM2VO#VCP+^W0g&Ca{$5&t|{=&e05!W?kSTU6)Bn8rL>s2!~lSK-?1;5w-4-;@*7x z#R)8p_|1!duTWgbk2IA=6O>rUMQ){fd-d5q|Gg)<73F{{>LVCaBP at ytLC9eb0f?&ND8A_jO}+$JL#=-kUsV5HG02enT$e~chB_ at hk*L5}Z#i0 at lb zs)`WTkaXwA46Zw69q0QX!W3W|9+e(%S4!S&QEFTuNI6A_0=|!|n}|`v at Vo~8VC!co zJ9tH@{u)MoY}H at wfUcNTFhYA zCM<0YYD~{++jB>_DQLHQ(U(J1vD~&JJZNYRx2lzY{=>Ge9=_(_<1YZc|0bL~|1tpo z9eB$B>l!adRZTB!H7s~T&_b%3N(`ghqgQxgLr(2ca>o#%X+$W?V;C~90Ypu12mM1S z at RsZ22huD%EW?nSB8>Cp$Lz7IL{f}lYV907eW_|Qr3ICtyk*&~TvH4v^-+REfWk41 zHt0 at cRhD5>@(#*!JC3QjE}d~(!d@!fySU_#ZxK2sFieTfRSi^@V24#^e`7|?veZk)n%T7IhBz4R_S7q0PDWSHrx3puKtOQ4@!BA%}LU08{36@ zmBSyx)$!>l=;L*TJk`b*V*SM;Jm+JS+=kQxF^R-?8HUc;Y%PvTYk0r0&dgP=N5l^? zw2o<_ZrVF at 9^6y)GP$(b4id7y!br%iLZ|bKcr$RN$zH)$ph>Bz(Of)yxA1 at w#-OQ& zS!D={3!p6E{>-Xu8k;|q)c~-Vu}m3D_s~pLCaqdy^g`>-I|~d0Cbg=8VDBOgBoT9` zA`KanWyn-%5`Ug{^P*{syN;=QJF!!BB9rePs>0a0zob`f+e>*e5pz07A`U#+4^C9^ zjg*7vwe(wg`j_B)^t|2xfRW{;HuJUFZv9UB88n+9PYZ86tk6p zf@|eGH=}sL<9S9~hd@!NfD_{rSRdwoNt~Q=D*Xb!Q;@pH`cZi|V;-lhp0d at 8r*Z^_ zveRw1L%JHF<>?m`c_Xq9A^1_mzeyivo;+ at KIs&HS*xMnIIx!t8rh8x5D%8gG%7;Zg z({nzJ(DvYkGkGrtZa);FyqvATS<75mYw7P?Ab*%o5TD zCmVt_qwFInZ(pbq1s`UjiGNS3+HtQRp|&$8m at puKsa0YpcfseTjnl{Tcp@(@4=9=t zd5~h?Py+Plpa#&7=rDr4#9lHI8E~kKM0?SG*dTRvHq3o#59K&?nTGs34q2Cl{Co=@ zyOEm*AxY(`=$f>@e|q4SJVhdGAWDl7sawx6pklOEerd>*C0$Y;$zP0BkzIX`#vyFSlB4u9k37SpsaxazMQpxF zQl|v%^rienn?YEPtIbpaNUKs? z946r?)3LqsFb_B>4TE$0?HEVI0xYsPV@A)GVs2i=+7oSqgj8 zVh){dxF0u0=o#_1-{V3UsRTY at sOuhkB<#!Q=DY36)lEH4Bx{uyrf z!n&5*F0#cacr0y7;GME at xAE5iInVQQ;{up20S`66S*14jbyX7=Zgze`w(gOiK7w-kBW^WQE&rwmPA8N~{3XS(juji^9;=pdpD9VHeR zHZs4>?+XWa`a at f*U44tdyQ3ifUVM}6E?_}n2~W4SEHhWPjA7!W7-g1a7U^cA6F%%Ui>y3ko5yN at ma;LYGOp2l+7JG8nb}_hun2C>m)>az*h~f$@ zxWEV~FN_ThCB>Dm{RL1RQLa+VD3WF$kgAYnq$wpd#&DhCrNLaHW_n}09jJLHFLeahv5FLy8 at ngfX@XfckzDq#7 z;CCroNtN;vIe9OGt&Y-bdU2&xp>|YEOt}l(=S%o{A?k(Q9}}9 zD5o?8%__?)F{zGvC)lV4_e;WOQDn%x1^JN2y5U=Y6qIQGbiCQj;5^x6X5Qle_RRs& z=tYJiswdhXl}sNPz&IuiCgcw46gdjPKr?cmM4W$R4AQB|XxCw%YA+d0J}(gzTu9EO z?NK?GjnO96wOjA3pzQc)?IpObbP3v!l?G_QH+Q6Sm!Ysh5o at WyEo~cXOoATHsA2SP z91|wQC94X1Y%f+uy6nm at N2g3-tx#<$<<#lJZrm(^E2_0Ft58TL!wT0mvu>Mn45SzU z&*Q=VVOW!Ob=)MPfeqGptk#4%4ZkVBkQV-w`6!TS9z;~P8QO2Q;3PAn at AEb}JuY~g zzWQ}|Lx@`$z~00az9KVlTp at TYXFM+cL7c{FyLi-f{?mrmcxM){x>-Tp>}2Tk04v#a z7pUDVbzLz|-a@#}EE%{tB&)r22wyxCnG)lhJ|(@_^11N at U18BUDE)4_P(dlLdO}i4 zfBT*=klf3ViWJX)GT;bItx+1qGFo1WjL!!`Y4ZPwI1h7D)2z?d6?dVpc+j9AV z$vJ4nT0AFl^6-ig2`l^v%TE!;9cq)qa2kOBxZyuj927fkMNFW7 at tK;voK&54j)u7m zp%$q5W`%l&pAJ}TLqkDkL5dei-e(Y_z%Qbac8y7- at 0B0Mm9OkGONqa(?2}~KGAb+oC-)|` z((@W+PH*V|mn_02Nn~>vcc;kqvsbss=T>$HiEuNDYl%?f6q&|dqfq;Bh!@{#VkGiV z?&rlBz9084k&pdPeXUWqT|T^4#vrIjW|g>wmUrmvnbv3R;yW#sw|_WtWsP9+;lls{ zIpP8VG5 at Oz=s#qMnic{$N0`3gu5JdJNQtcx*aUs?BK0Ji`A}4d$;1&P!Gr#*@oKoP zuXI$-Z=Ai at pS6 z>kkGQa?!+kmjgvr$Izeb5uy^?@Wpxzi!4Xf~64bfO&a^uq&9vR|bmz{@v2VKn*g;vai`cS@ z8gUyu=%CV5x#I<^v87F%M~3FHDJdV(Cek7zEUCGA>yzUxC$MYCh}ItHr{l$Am7yg{ zLqTyFoTQWny9!?CiDX8b|Z&&Xc z?AobCslo48Fz}P1wL at AAhGdfLlQF;g#F{AzM&M}Yt4EM^x;m>TiB4W~<=QV^ z4fo3N(kx)*n=$659JLM4SXzD6z_zmP{@UxSrlF65d+B1)us>!;(_jf>iur6Ofd$JbUAY- zP>f;FTHDDQT?V!~WQufC(1Jlb^lZ`%?^&CueC+(I=uxCJLA1#@s5VyV6p?`ry3$hl z2y8*V($U8=kH>WSG1&iwMStd+$^wUY at Bb%qzZAnwrIZw5;4a_s0M zSj{W4D|OrxT1FuzZ(06ZnyZXZ->4nRrt{(FTVnmYeY#pYQRkAp+s2u7MPy2(K at A#M zOc=BCQ30_kBt#rhr%+KkJzNuA)nloRJc3iOn1pYKt_iEzp(!${#)WC8$7+!LYB7Vy zrvmr++0P835Jsj-%#$K5E`;0Gk31){`*$hcqRvUbaf0H6hy}Tmh;Fdoet>;NX4FoW zr5_U1t8P?L%IVWOy@|r- at CtXRsm;U^6-rROqb^RT*mkNMlN#m7EdTnIt<3mpTCJ+s zec(xiT0s9&a>Z5}Eg=#2FdOKg1r-r;)`n??N!8J0pde48rlzV&89u$ZW=zd$mT~L| zUP;DMhK98`sR`0{8TG56LD{r zvmshX4ycAmq^&yzGE)u9yT-)A+Cb4MDPvKr*1us#tqC_+%#wIW(P&-QJm#q zM^o<60!`cTv}dFPkj%s^y|g44+;JmlfknYN83BCEJZizTPh_loIy~|tsK2`){Ce?K zKgNRi59skeQ2mte+z`G3{5)?3HwkGvMMph)6duvuPO^jRu%_r at RX(Do6G??9s0NzH zht|m^R7}UE(HlCuo!@=7%S9vQRLSJbh$^fc5)-O*TXf!5Nwsv at k9gf<9&M?5W1}bow$QbI;n`?NYTQtk|Z~-{tcV&}Hmxn3Fs;N-0Bp#9HO$ zN!&6$8w7n+)(EaPM_jXI4c}Ry>pA_ at Xmb@>pTD77|_ z7=9R{vJ^Ap<$r6{cNp#~?G!xOdNrNS=$(I%u0yd|9e#D?v>OrH9K~r%I?$!D{yhMO;3oGL zN7!;dNY>MHh=C)Xpv(krR=A^2Wk%;$PV9_gXl}g1;nt7Dm+Vl|2ZD7lXSqIBxcT|$m at Hj=LtZM|NHv%g zlWaM*vT*;LFrA1hHvz4jN?Jfq+b6+2%E~ix9P*%x#E!n=k19PT?9T`U2)a!{S66K6ZdLxF}^mCP_xm5zDH^moo{U3g713Vy-+PRx?Kf5r(iY;eaZi+E8Vc3Gb#_!wd4+3wg< z=P;gyo)gx)DHH at Yw30qKt`iPul%swoQ+7#qYsLjBWJMyle@^0+)06^ z0%3W+%Nm__hQhE^-r+O6Udzz$x#P4X?v$0FB=;kkgOsFW7vjS4`?)0Vj+bo;I&wD+ z^H!s)2(e?q--VBmslWelS)OO}mC9J9+#6=c?q%UlO8%Bb>WL-<;t>fJ8@>LSyssGg zZKN at Br)@7&LE7JzED`CvZ#=5Tkfbkh_mEz at O*`QC1LWKk^Gk)ohaTJJ1a|Gt at NTwP z-lkD at ycciMvUKG9g{IDs+R6yE(2z(cDndz;`-k=+f9yOj4b6mS?5|+WBFBE=t^3o3 z#rq7&1U+jQN5?Nc%_SjBFQ2onRA*o>eDP|{6b-%_kqm`>9;!N?EF}7bqlr?5{bkJL z)|53Dornz%L;gI`2-E|qWEfI4r3louWcM7JZzpI{+q6GC9Y`$=95K{)KVn}z0Q%LV zf&0#Fekhg0we6?virG6~kW^G5=y8Tqs41fC_7*5#P$tH7>Qd>JsePq1c|{6s)e3|s zZu`QRlC7IcWn~fD_N!<+#$KsO`_!c+Yxk1VN7=_Z(<~jdliCYw)x65C)tXJ(Zl;&_ z>GC)AYhd%2kXMky)P+N~Cg2?%VBAQ4DEJdXRj_%v>C+}#&%CYb-TbldFLe7E at 0@?x z`q*dEzT(spmuar!Q>H2+zjBQkHHmMB&P)}t at 0QNYWDg2oH~W28`i)jv)~+}HRL#ft zKW at U2-*7vVL4km9{&H at n|0~}XwzIJZI0BsQ9RFRqW?^gg9}4PJZS_qRl#y=$T>v7N z#1EKiuyv(lwRx$gahY~9s3sL^y8Q&jy?&d4^Nio$Q zK8Z5vW1!j^GII4Zd|uyAN7;vYe%~K3y>Kj~uzTIX2#RQReEvVIVTnRzp|oEl`ax7) zbX5nNgK at nl>GN(UN{L)Wy~zYBvfd#k4Pz~!FzES><1*$QS#&AE?gRY;B9|G`7wT1h zoDio(E?EL1Si)?U=F__iwVF+_HmuyhAfLftQ)C8Q)AueJx{Aqmzo8`1ScRQZL1l^x zbIe>p2c?hkJmgYXg}2PFR#Ym-Ex9Dc#!Yjw8672Ox*4unShah-GlZ0}O4epoLu{XA zgTQswFXX~LWv$};W5fc)cT6sC^KI<+R8rS7S}}0r*{2GTx)zgyIQ3P{#Dv$Xcu59A z^dwDV9LL;ed6iidkr9a(R4Q5E9%q)0GEEsSYJV|RZlf at 4M5ruZCUr{u&4bVJR`Mf5 zSK1PUWF6U^NAw*K~9u z|7;jKkCbLZ1AjPbiKLFgVT2xDfI at CkCtI@9mML|`jw%C~u3U+UsYouMLbW=yn~pn@ zr{Oiiif^d9v1k+jqMct;hq7B^kO|{#oV$GL{*VI%D6E;EwdZAjku_v(vqctrpuXWY z?AxO!&p4L^Z6(boUKzU7v6mEo at 7-(zZ);7dP+ceF``i>tpf;E+EqP)6KDy{)oOy6T ziNk-)yjz9opkBB7i7}F}F at BCb(sXH_tGssYAAVOTKFsM&w-1Ag^9`VlNHnDa!lba#{a`2lJXbf0d6Pt0sMASUG#H#BmInN7HzU*OT2Tm&RLU! zQFDd0rsWpP6AM4Uv8#L;-zFX2E^@Zps>N!tk7+pr9euJv-94n?Fc>+f-R}IbwvBe$ zs!TqWHVW6XRN=b#L?nMQ4%l}Pax}Xa<4-Im{K5fOmu%Q6stdRe#&L|m^KZqIM*wIN zN0g!`o>Sfk;k-LMvNOM=n=ID5InMMKJYkksY&UxNXXFcW;*foAjajePEz^FhP^y_j zK<;oCt2+q#R+`bqiOR~RGXp!)?c^-(pR$`ze`}`;$0zhbr&s>?@I8v#Y!Y39E6?nw zN8mW7xykkirkZ)(yo+}YE3Vm0n8ss?i9(4anxHCqzzd2J-3(_gF{WwjavuR0ERy4B z#{-guGqc1Gkd;h?##l_0MBUOGqPRT>tk-sw6ak%Q&bJ47VH0;`C>n)wJ6E7$;Cz%R z`uH`_wsuML9D#D6aH}p<^DbPVEh0=C5ByVcd~>q2Pt1rH#cMm*kKnmY7}zSOcAih) zAZHZr=_L{q7-J$qF%cBVHi<5`EP`v$R zyxK$Gn7K9)bvaM;z^v`Bswfr=I=wL$Ixnv7iE_HJMymw)HuI?ah4`T*^?Hnl2Q4Bm zZ=F6~EC at -n6kq&H!>fOk4u(^9`w?yn2eTT>VEQnRbKBya zrWx?_>~4T!>r4v6;b2@~vS6jjl_Z_U6|9 at zV2fjY5n-2dRrWn`5JVhjAbzS^^5Wi> z%^+tSMH!C4nvB=3z&KxqX at w=+o?%&uB8n0*e4)yRDTUaCI%2`(B9^b&xL{HVpHFUK z6hGzQkq5NKXVf$p;KsfLGh6S(rXJ zuemA+WdNRc(3x8^I`AD(-`InGHrWRQf9f_vH%dZ21|+`*N7r_KLq8?9&_+soI6$CA zPJ07Q)Iw2fj8S90W(U{n4LoeVEjs0#SudA#u;zF;=k^>~3*}1=F4K>JtJS5>s63n+ z`T%r6y8j`b&^uhV^!^)i5 at CUWSpTIX9wCeWJmkqyvr@)Z#qec=(nLxP6c`Gmu(1e< zk9V}Nf%>H*B}!)#P@;5Uf*cDtGaayIGx*%szqR at V`J6}KGAdlc9GUq7`Hp_e-l_#1 zb!MCXAC$dglqTJlEu5}orES|*rOis)wrxD=CvDp{D~(FquC(pU`<~OMzwUm=H}2^h zKVs~N5kKO`nhSfcHRn{;*<082UCv#O^JA^Q-y3)@R~1)BJ(dWs-AH{1Z^JVe(9~xR zfL`_6NN#A8qiHXP?s9}V2tm`PVkHvwNie7p;WhYFwhc{Xy at qFUU;ua_}yS`2El($D3UP5aRnV(O1XYb&$tBA}fYs*gya4%fo zf2Z}hGdWgxitQ(~K-1s!+qU8e=Q*FGP+hk5y`H!yP83QURHsTj5ZYOQ&AFVbwa}8g zqZGX*14snrenj*RyLP6*L-G9HDW{k?bF1B?+Mc%^F-XAKQxx*>2vOfSSmxm^@ZoD@ zxhSqL*ABhk+#oP#U4=4kl#{%}B2>$^v^bi at vnIDiqdt(gUtJ9W3< zG at A#jv%%o}pwu;&c;PrdJ#f82&=sX?J>?EsKH{BTjIgCN6ynm{tYS(ow5fsq;ko+( zi*FJ(y*CYfj}^0V+-8Hn9VyP##Or at zvF!`r)MI>`!2h)!Ms?=bHTejV_#+6zuUC8z zlPY3175XFcdd&hoo%!SO8_!gEKvLTYTtl(nz&i_kZEx(%5 zPvXrjGH0q=bVT7EXPB3c at n#uL1*=bN&>>wq>>17tl5mfo?$%+`{7P4ALTMek5UWTo zgqh639rD)3ZimKpx25a&d0gTTRiVZpHyJmEc;uaO^za?CI3WSc1*y01A9g}+`Jz at 1 z)XU$pUbMki8ZwvP{Y_EEPz_z%A*52M0qo-DmYmT-h=($lWl|~h?dZhn$Mvdft)~yw zuNDUp8AfBI`l##@aF+84&)E5dzSKY69r}xx`GRqLPY1(`Za21euo&Z^?0DrnyJthz zGwD2K9K|~}YufSStSXP+L9-L`A~{z)q1bQn;;*BWUFKa~z|D`L_&TPzE2bALfQ#z0 zu3EnOL=W*9pV&S-OO1aeqBDo2kB0=j6Gf_H+l1i)SD4T7vshO4x#KqRE25P2us}@9iRof2?+U z+aD~g*B1HBF+NI0N9S-aGTd?^T#|@-rve(38X2X=(J?!!DIhw4PK2mjO@)7G2SMT% zzQ at K@)9`qz9Q`2YCj- at kSbJW4F{e8HZ!Nu=%J)r<*ZU)@V4+d0ik7Mc?4lQGv2t_v z_E|*>V;1$Ql>K6><|1lGt&~c1rHm4^hi9L5n`1nR!mVWM0S?ii{OxSZ>Xu~N662;n zd)b3VKjKML>?dci2|}G|Z!7SY|438&{i+krk5H2_VQlJVOk&?E!C-^>s;I(N2}nJ5 zNTwIL&c3;XVlZf*EU}(ipMjB_DFSPsiH{M}XDXsuJ7~*Idt{7$*!z at e( zk$$>Eh>au%IAp-{B?JK#xk%!fodu9*x}F5 at 0e(b4_-^imjWya;je9`S8}$A~6}Ryq zqsPo|Aa`b?RR##GeT^nwdK8QJbK*}r`xPnxhIPd?M&KorXjb$wD_2+BbiGG37GUWU zte22*5b)zZk-$L{N{V$$+e5Z3743=~KYCc4b5}F6hBuC+9mJmcix<^x)Tznv<&+AT z-YbMxnmi)ge8GO~k?qhWpRkNn&Ceyq!DF5|tUSl3tMP(nP140y`8YK859R5$ z`RN}_Sbh5fl!o$W$M88ZT at _&tbZf>#MeGZyJMDR=B3x*@(q`bjE3bsKgA1x{Th`{d zU{VE&`*7niWEKMyl6!{*@i#n^j$@A71b#X&gmI|H3wT?EfE__N2-}zlL6L5DiUiyG z*Zt-_>F0&;OQb zR43{FLkI(~4f^|N$*8- at wg`rXx&(6zfoX5Sv~^XN=|e&9I0lFD z9rTlGKi%}FL4;;Rro-X+MAtO8^Aw$cpWoZ}yhsVlB1K7KOtFJa8PbS^+e=zyHF1T! z1i at rtKPtHs0%lRT&QkdLj74O48CT0l%nv=8m0FMSy!6G6#lvCh)?%+GO5;oI6Q-iv z$EnRI%3E#$^BJI=@(Oz}FEFq9!)yKYM0flYN0_qJJe>^-VA1*NSi9_wK9+d+rT85y z0pBp3!JS&Vz77|PWuZ8u!P=?SKCup2%R at t8AG`*4qrAkQah6 zG&pw3`4(|q#JrIz8>&@TDkgrfdwF0P9$Wi*D#C%zSkSXZc_$#v at T~SFx&esTHmh!{ zgZ=ZhhV8yYF}#RL_btc=5EF5*7Dqy_OuQAbn`6}mD;tjc^~>y}WU+O9FI@%G!xlwJ z4Hm)D1jQrI5b+F$z({03)wE${IZoLO?hW4CS;qz-tbsn@*48k0=`0G9Gb_*WulGSK_Z_;2_GOL&YqOu1`J}Z+N7#8DW{yD16N=n%; zJ~fSv{qxtld;LWWuf|Oc!(GiSOTw?enQBDyzy`x#rdsiDbzA;ss>-HLmWDQ#UZy7E z_D;6{+4Q3MPaUG~>mW*6>srlL+O%p|bjnuI zB;w(%1Er{%=wx{0MA~Zpd_5U?Q^~Phpw97cqLBvSeDOomCYlKVhXL00nm83+y|V4V zA59 at gyzn(6xu)UY4?TzCjjqKzS{#Sr#}B06RI*?uk(Ly_7kN#|qNw=wIicou&mFQZ zhI2JT3=0y|g<>oP=CciuUVs<8zMfUzjCC@|Dj~zcV9RJcBv;ZGML{+h@&Ne#iC=s) zu%{s-%)Rr9!t6^^z+drBI#D4e+#r8mePFvlY7J5y(9|!cr#|l%Y=%g8MFcW&IGzv3 zLY7Bq&`h`w+oXxwQhK%7N9spct${+6g=*76`dl(bIk~$$Ya$srMuBI^QL1f`2iIP| zcW|Ddmqj=tc{sT`u}`aR?=b9~@yoJAX@;&Oy96W}s?~mxJiIVALp9u=CulJ%jk7%A zSLrKt9@{vi^lmEJqsriM#_v5b7&4pC8OCgyDDLvW#q8ra{rcNxV6EcU!wobDh$6|q z8)5zbE6FCctQGOivHdWv<_xCWylzG%q at 4{WNzGH-E33dLAJBybcq{cJ$e{PmOg>89FB} zLN$AS+_e97<+*kAv2`_k-T9^G3*Jl6g)NSz53^T^+_YShw!^;r#VdUxH%H%!1kHOl`Rp(Rp)R$VVW^%x-%a z%k~)*Q{c}YI)fkDU at YkhAlKoHn?VnLPYI%0_R9(>72O7l`L-m7g^-y7(d5n&vOZ9D zc=W0GUbv5nD*V3GdC8`hyXXiF!aK^$YHpNvWln&NkH^o;z~cDXLgC8b>tri1KgSUA zrq6^UJ8jCWR9QS|!i7U5R^_*(Rz#pnhs6mhwMbq$Y(MFti+F3Kr$}Gj6>x1w(^p)f z=zhXwZ*)-8DzB#MgyOm4JSiyq0zbJ8?RZ>1f%75QY?w<&Rsrkf=V#Rp at x{yst>rM^ zX$P&rf;eJ%p>hBEuA4vy4N9XYQ|5xQF%JUMB9Cyz)Wt3%ZQRK?ysstQ6>FyUsk&T^ z6Sw$*31nX#dJQ#MN^M+~_sUw*%X{K2wGd zpa$&(Mu3s&XOWw(qSyAEx)An)Nmqwd$~P-KqAxr~_*oijBv0yfh)q1Ww4kz^aWQ5Q zd4uz7CLEmJAuW=NQn3Z5B`A1PktF)8h9xgHiuAv|FwwFpCyEL7pl2_?tzWjg)8E)L zxC@>YDP&KzGURTMI~>ts#i*t)CrLJEq%&9B!PcUFf4?|HL4u$-X*F;V2ES)4zY%2a3T0-DO{Aq+8BrGQbYkiUB$ zMax!0%jGxJxT%GdG`tis>yT}E`{ro!tB9q32M9~e(1m*gM%|<%1Opk!_DlnO*a;X; zsc)M(XuT5Q%Y7QWeeYTpSjl~&?DG}UhPo at d{9giDn zscy=qOUS91SF%`P?dU6Mt$X&rl<2BUk@?fvU_+N`Y8aGC$(5&Au8Y2s%jVMk=xe1@ zLPjN9Bn$m}|IiAFybNwn=FH%^Qrrrf4d?teW%Wq?wt8#BK=wVS^|j#yuY1**N6q1~ zR90CI(>Cxqc0Ylx$BJunyN4SOe z(@?gbw?F&vmnB7|xnqY^`*t5XdDj!`=AW2DpAO%(y%m~ueNGQM8Pp zwPzZ#Is`*KjIk{l_SRX9)#?T%ui%vZ5PrQZCT~2>+Sw at 9a(t#eE?! z#kk>%l7yx$V$(BS6IGbAO%qi(iInxqhHi>~+{7<= zpc13{$i&ow%H?r~Ylk~vK?Fwfu*@Up3`(+zX!B%4Y*Nf}e=SJ?)xjotEz(@W=W-KXB#V)W{`6#PmoE}srWNT_K#P44d85| zONMxk4Mv%Q--M%}WA%jwyCwf*>kTZNQ6Xe*S_AoZ{d8~iNxYCV_kIbw)HxH>n=8(9 zWBMbw!ZHN0SP$s?O#l%KhR;XdMWFcnOue0GGMl~tgAVItU?KtQOD5aeXMHQ)T?p9eDlD40BS#yb;bzBlgX>O z6q*Qa0hZIwg at tK35O}_ at O{*1SckHi3o=UGAS09FEBM}Dajh5BLj3v|MkGpnM|W?x$yhZAm#M< z at j#YDeL+j7yd=ceQu%rBAjTsT*D+XOaOA*;>*SA;vH3fsjRVT5ZId9Ro^ak;%&&H` zdK}XUoEu_wBX%zZAf+0rQ)gz`Y$;Mlh!^SBt~8lxC8Ow$l+S|DdFiK73Z2n9S9P#^ z2l1OU(Eu$`_E>X$Si^@gZOWpjjeDur#&m{jV}pP1^=d73*`#ZQatnbOuhPPLP(w zu61Szm#A8jnw}vEW6d at hBlP4lA3rUdnzb=>4|3 at 3!>{ix>SpL0d(hH1LiU?J?E>ci zex3T8nU{K}vu7Stcppx at eBJqez1W-o_&6Jg1~IykK9$kKXlZZutV54+Moce4>?Fcn>&;xExE9Q^*ygZLAIi9c22IM=6 zU2VyCrm2Rr|F+fARcj-8ggbzW%B(1eah_K~@TKdCdb~0$yJB at 2S99^!nPut1xs1(s zB`aLF${2azUQ{Y&+p0VRRIfCpTNnpRk>Y1^L|ev;SY&YAr!|xzt^3Xa&zgS7Ts5UW zR~|ut4p=E!Epsc}sB~7e-nob?+hk~q56dQWl}IeAdh?1X7mdo{@5A@~ARQViSItH= zom1YBr3z743l>k1FP*_Y+0=z!W2M2yCET7nN8we?%lDGVd{m zvDLUle_1S|QVc07L%jTM1GHB at Flet6B}E5lXZ7$%F;b)>JNg)wm$u)bn8&G93h-M` z^IoCCH%p1MqN@&Cd6FSIc${Ks&eN-;5pSrG6dT-n4rb at Xd81W!dq`TVNYX>`wgkg zWliZQvR8jUFYl6$Krm&K8&i|y!feo!GuBAY#qwPxD?nHsB^N_^jkGMR&7-90>iJEm z0u5=W%W?f(U^0|>iqFJ}oc%n3IXYSs9&m;OY$)*-s#B`oZ*(IS82G0)SBM>opnf#RG~btibCfUVhqoRxgff$ z4rOGsjK%Mj09zD-R7d(u3Y*g*8kCL3X at AglyJ_K>ke;EXTiEkJ5yQI zorN>u_3QI!nGQ$hm4Q8Oa8yI!rLUAyS-t4pWaTtipV(OBCPN#%hg}4!l9Kae+n-g=i#iM~^`m&m>FsSe+R&!WRbWZ-U zcbT3b{Q!x-RI>m7*; zvM13{mAw-okZY8f*AbpSpFJnZu(84?C#$a=%J;;)1v{<0mclL}yi3#KE5W$;mW^tl z&#~zp&)Z}x1fDw`Nr-9nq5xW>p8YDQXf$o&V;7EnN#s{#Wa|BEnD$)k+aBc)#dHed z*dU|@{i#uJh~Y80sLr`1M<2bv^9Ztb}v-xg{XHjcu;NdA83PsFE`QdgXGef1 at a6%a(-j}{`K(@z1r zBQ|SOO4p;2GJ_h(0|8FV2G#HRE=S;xnjncT+BkM_1Uvw>;+Y>(-+~7A+ zZ^~f`Em`@MxYKe!njnsNc3!9@!(~u%I_Pj3neCl=EP zh(4fvTrlmia^w(en5WqBwLfBIlD^Buv^DG1+G)bK`#b(JTFLOoVpjNafPY6OzRsEZ zgW6PyI>#>9bdTLn$wDGIhqEtF9ERSYybsZ at +TR>!j{gp8>X0cp;G&Q8!X=`v5qbH& z8;oN#b!ao-kv(59jV`rE811^@J(G8gR2b56*JCgj-yG_FV@(vevLsypkh#Ji8N+_1 z92rub$I1vDn#XF>!kVe9G>cnKMPS4m2TMqUBKfDDwO^u5ERC2pl4Q;Z3{f2Z=5I{Z zV8K~}o8TZIh%g`^6#w2R|26p+qiU;;s*dD$X*QP7X0Q+!l%u4w&=pR6ubOv59-4qL zn1K|fdX`Xia#4Ak`j{3b8 zEltjV%B>T0=?EhfrkZAp2P)O8c#C;0f2JW&q)Q^fGHj~Z+&1~`KLSqUYgXBGN~z-{ zOT5xBzy&}>r5o&U?K-8Xj-a6EQ`J*$(YUo-ZI@8tjefNIE!)^WUq;~ zn~T(K&Pr)I!!3E6D7S2 at +~?hxcf>Jw8Pt at mlgum1ui7V_IOd9l<6$sT8%P1dUYCf zrvT~e+y))Kzqxf&m%pSYNW|hIKCJ}8gJFibFkumq;FYYFJd3)-)g~? zm;3Q>n7@*JwHVkoaJr2XAo6TjsMcw!38vf~4*7+|zL|MPtl#jo=5eKXfX{u!eeE>+ zspu5UKp2m^YKVGwf8-GP$t+xtr2rzxLvReUG;^HV`|Z9=KEV|nR%H(LWa5YD>*7ktS*V`8GRrt32xvZr|s3TGJ_LK*p8Xu7>6riMNbG2$E72`S!=I zd^IxpHEtL%5X=Ia#WS8te5>ku8M#Eoa)!UpersC<=Ryb3yES4+j3tN;uuJEIJ;8>W>Jn4ws|{z?_jknFwM7)z%|*Cg zl_tJmCkn0veJB+Ij73j>gao}||02#An-C$m<+7wg9Q%NVIdD_}jM)LCCT4B()N8cy zy&Ftk7AF&v2Za6CKLI at -IK~q@=)>H+-;YdZzBpImK(8x1CX9NNh8HnYYyB1+ELN?p+%}q&kYm!Wd~iF zl0S|jV)8?BfNSGTJcqVSGmBj9Wx}&^1ogCX(@Qg~0wroX6bdZ)No+T6)uxMrG3CJ& zTiWDh{2Z-{>mVkVRP)dNcwZ`7x?OpeKPU*j)qyy80Cnu7EZrRzDZ`u47^fU{wfin9 z&KvIanMu`dlA?2c8apX2c!L=;`Y3g$l1r`)OTAFTObSjN?BCdFajMX%>MqMQO!pLk zvxM}At1*fOy2zAEI~A(6_!9BeHC- at G*2yjDQ#z$Uk>X#0ucMBt znc$Z~i50LS2z>JnVzy%b}X+?reBN%;@gy6NY*sgcvGxRvN;;0HE+z zk_Kt{wTm`P at E`i0 at FQQglEKt;IB2DhLS}BZQUl-L&5u}UE}7vew9-qvtF6|NL-PIY zYu7ZCPxILg69yHf*|dR6Zy&Wr1RAEDL`z*amFunGaw22NkykyX at w6vXVE(5qpJkR= z`4SB=dh-SnVOazLR0wer`%2>Be!9mcM at 3<6*3g2)Yl(QP5HdhJk~q9|QKqpTp%>Xm z5HEg8uK+MchX4<`+dn=?5=8ps8R88I2G|8k%jxf6Eup^fgAhHW_vN6+rud4bh%OtA z+(PcYTqow7LMm$^iTe3|63 at oqQK}*I?4sd|65$uo zNL5kSZn4l((Q$q*oiv`T;yTUK`}d2L8`!T$$u3~#5j0$3cU-a?hLHuH8ipBV&XUx~ z6DkLPYq{)?L~wlmE0+X9{jX5T`Y%+fto{dU20T2>0F4YN?5G*E40Kzb5E3c0YMV+R z-!n%#TYkAzEIX^gN$xS?v#_QTB-oEA)7O&5s^=j zXeCu{O7k83#7owg0@&GxS*o+Msowt0Dt+-rafB4m!9P!M+m>r)p|#HZG_g>_c)q~% z#0rmKrOfkLQRIy z%(F0ZNfyG~Qo70hA`ai4Q%xcDRhCRxB6u9*FeQGVX%$Iefh};(#B9G;Eyo0Dl560E z^q*$>S>1x(Jm z7p%^#wtTKGKH?166=nC}!CC^E+uz6u zy{wrd|H2L-)W4&b{wH?CEp1#(olH&s8=sTzKbZsO={xJ_3X=D}MTVoVD`^P%%y3`{ zGg;0NA@>K{&$FbE&+Bd=7JiLk=92w*27muK%-gvxYze*?Hnq|2e93QqnVtRld3T2y zz~05i3?N6HR#Xug6I>M>>V*x~bJn5UFj=AEkbgF}lgKB%@I_X`rLQ$^<*%g=l`|W0 zzMw!1={|}gEgcg1NsrHB(%Mbh$F%97Q;+MK(J!zgCzYc!VD0ER>MK#LY|g>w1_l^w z1;Rrf5EDREUUu|vr|>~T*s1}LTKTBOXjM9b`a^eUg0b5PmBSKd{hQ&iaIW?Ug)p2Xmu-Pl_YYd2_xoBO~-(@(h7#8VueInb6 zNRH-J5;|?)bnimG|D^XN3cy^i at CAQU>3xdF<-vD6hWNf{68qLgdOV?Ba~8_y!k4Nv zJru8Rv*ogkADF$fCmN_Jzl_ z=g#Bb>{KD_#D1EsJf?`{0T0;1s9c{QqjBe!esH&JLNNf<^eQ at rnu{u)o$lpgNh2CB zbUmkLRQC(;jRmEMp#aS@&9la#uO((}M}Ortb!{J9D-yT5z`f at rBDXonC7ute<9}5Qa=ijJZ zN?Gv6G9f at fR^k3#qvZdz>whW_{g-vCZ7budqJ7$>m`G_9%>JOYLR)A(%bwem#VWTL*vj)tJQ at AAV0zG_CdV5|3a?XD9)_NM3voGrqT5VkLqp1che9{ zZyq5PRep3h4^1v{y%KQ9l_h)FIipTLu%oI@?rq)yPBIc_k=7ZQVc2A?0)OMh3Id=l z{Wiw5L@>7R#hQ`Hcwy|<7^h7!YQnjl5q6 at S{aYVFcHh)@dSL?~w}sY`GW(66wxG-+ z+JAWlo~F+N#KPh*$E(#z(C~l-akTf=_y{CQ&V{Y2*cf6v<-WNn`~-Qr^%S|*m|6uh))@}jHGl2!->TW&0%76#Z=>c z`-SUtJ}*D>o4F6SLJl5D at qF%sQMDbDY-_im$8uoaje5rX$ul%}I1SdIn0Oi) zumQS53v at PGgB(M)H~2Znl!B2xQZew9at^uQ!G-OxT?|kT!K>RdPm~2=;mmy8P at P*~ zyepu*SiP at OKcyu0F?+uRi%8PPj^bLuBUjr+?q%{ypOwjg&dJ)a$?&MjgI%dq#NA>_ z*7*sB`5}wK7R^W)r?zvmyhPVh61nPt8 at 1f;%t$8(b8a#h!y>7}{1WeL_}Rt%th?a~ zUkp-FrL(mBCxnlAxdMTHpI9F#PM{xJir1o#?(hVA$x~M9+7;QyWo`x4Yo2qPu=V~0 zx+-L-A*uy!0IbXK-m>E(l4s=EcFF=!s`cXBuMgfLc@*vYX2Krh54Q9xPgcG~vt}f%V&TehL+M+SBN^JZi;K!6wj1e)nP^N02sKOPU}n# zNjyl<1}p+p6Kp*0o7B5xbX`Qa4XR8WNxKO>;;mw(?(!uKxzkkbXgpjho+NsjiW2D5 z3uOC&{-1=3I6F(*Ytovk3b&5Z(xbCWdoS@{Uw7lmAec9%P?}x#yG%a}E}Wn|eJtW1 z<0E3}i&nEnl0q#f($Y*{A|e#%SK9g$Vc+!FneB~)h>E+}7txVa16`VG2I{3yb75A{ zDZ^FD at M~*GGSv7LAkmj$M9^V%%Gf{L+7I67)sv-c-w0rqRVT}2KX+FuJ4>NGwY+&U z(9`J1*8YNqpxQe-xkFhAfAfN6ZAIR0Rfh?7&5PVf_W?x4QTxf zX<2u~IyqJSN(rKbQPFUu_+z!Z^R82NK89Ag(PVnTb=G+&iweleMboq at 7`NiPtf!0`LaW;5vI1BCNpbXL z+dtQUnEmICVJ6^8+0FI$VF>x|=(<14yps=}>dncRlkS;Tq;oyy#>g at hDW3BP1y=5w z96i0Tt_BG;X=hHXQWzYk8uhcia=7LWDVKr;k0@!9;^i=>A4)-3V8J|FvD6`N}>G`B$Vp`;YnEH17i8! z2KRBLKI7~?Y*Br}3#D*8`_ zi!Ymo3B#Sg?Me5h*n8Ihg=}Bw|5YOMKaeftVfinDuVl4NrFAu=Par*=iF{Nrs+H`g z2A+&#Y2>=eY>iCAg(g@|bbZ8?}M zpnhb(vGeHsvb8f8c>eX{{ed%}_F6i4aFa|)LvoJ*V^zoK;)k`WUdrk_hZGJytw-;n z2s(R8ESu~;v$ZR_0>py&Ix{YSHm;I0OTPVpi+-Fcam~>NCB>Aj%c*+)#PhYpv#7B?Rv^2DY~F?nfR at bPv_1YEavD|bXQ~i zS}n_N(hkR-O1CBj5sZG*E?J$kwG2X<(+KJahNo2Yo`?-^eO_+;AgvJjh46WIrjwpv zaIlnxB6^vB)9J(W><^kdM=O=Bw);A$?ihRNvMm-Z1)}6WbrM&MD26%t)NXp at 5ej1+ zg(Da$%9#hXBWxlHwycznnA8wp&^;~juLJ|kd4Pr55tow-wYW1lL9pT%BKkHQTG;5B zLN-+!-wJ*yGkexWYo)-;lR at r`)s8ifn`zz~!4@^Yj|7_YKo at xp{IPWRi%TxQ9|4!b z)ht at K7rIsiH+0chbpAELZvt_*c&e<`&{tm1A;EX_TAG89rZB0;=X@`U91}Y% zJJ#xPr0`2^K(1RqfX1V*HM;>FP*wph9 at 2 zKohD#5;NxGd*mLrfE+gJd{dd4A>!I2LBg*Ga{psW#NTofa>XZ at _K{OhhI7QSGrjCu zCoLfeRde4*tTzN55sg3a7Z3w1ki!9)ZLZLwa6%CJ0hy02ChsO2<;uNqf zmU5TOulC+7P$!yh;VW+Olsp5YZ&~(a=Z>s}4{;iPB53-|tBY_{?8*<$@QB at L0vv|C zeF#uYA)UH5x36NqVU6P%(xH+JD&8!6X5CoF&gzGhav^+vV~$}&euMs>P5>QT0Iu<` z3f%+|1cdqj%?bRAB35178CMMBb8UV}sYY5e`)ukK*TVXo!N2tD%DEhFx#-Zv(A`k8pqGq+oVn1XP^tRl=z0*gT!nj5DLms!=AInWjh-n^YD0`^ zw`^yA8RoyDXJ+-wpPK{R6y5m?O->(+c4t|P*8$!$b28+GWJD52as>CDdJpE#^319Z zSwW^n7FsSgICSHqp5?Oj8jtsupwQmSW~jzmr;s8yI at j~ncCn+a2U2hbB;C^mmjuqR(`e-m zCkxMvqQpvR^QBd<$uEB=o^~^XtYzu0+=O3aRew-kNcW@)D#8$@p at 9FwW; zr1aLEiec2SSaPV&)W#U$v;TzR>4*2$bQJ82uX#1uco*HYX|jy1eREMSeP!MFx$efd z31=|qgLOyUEiD_9N*}d3 at Hl;3oSwHHa{q4AE-J}0`l}M-lm7%fn0At|+>juf!Lugk z4r>p=mmuBcx7`$%O~ZJ<&APnVVq7mPP0nK6urto(P$A8fF(2WaPKR5gcw0( z>vlchh`lR7z$$z{JW{~&ne~&T?w~|B8qe2PKm-=HgZ&iacNP-6Y<9btZ?|(zBI8k) z-n64v=_J_MMFQ+iCvbY z(hyc+Wm6 at 6R+W@GuA;HJ+2|JxaNb5yCrk3Avn&v zl6LI%t=b+r2byJ637=*~$m`oIJXNkBO)g214el(lcUlF zpAgsP0_2+ubtk-@;qP;TI+W#>TXJoW^Pl)+q;b4j$=(4LfziRL*iX+GH)A3$EY}Z) z1wXBeI6c#*<{u=CjrVMu^zx((Ji;S>KlLDM^(un4`on~(!d%h`_4=@PVfI9~P{V4y zWsZw}Dw48v37fQ$un2k)&X%31#`(!Rt at KCyc?<6Wh#v^w!WI~Zc<+Pph(j?LqBg%Q zdy2Fxiyx$L*2QoZI)P@^3gU+=<+yMdfVMuDPD?p{u1VZ>O!C%$kE>QR#qDQ_G+Pb) z-VW34#M<&(J1&VCFF}_}_>OsXAGbenMf?)4kjN35vVu4(Z$=*J-puI+9Bl&1MNyD| ztcNHBUlitfbtmAAY8Jx%Jd$&Iwrplaj$%Ylj29d44uRl0=CUJBQg1Nj45Nt!sy&9T z4L at T8IN7i*u`2V1^Fc^zQ`OuV*?^1qLWPM8sWVck6MbRGATyO9 at ou1?>U{J9+vPWf zpRPbVpqp&b6?mv2GcEh71OD=CC3p_Z?f^Cgi%`3x&hcBMde2H3$8M;L;ZgvZ1#YB# zAgd#*xrAtcCNh114yXM5Ow)*;gFDvD at h7aMF2=MzAS1XN$&I&~Auadk57qAbWntVF z;|3 at fmY9+H<@fRH at 6f=GUkRQFyg zfy(lbqC?7;VpPvHVPOtNa~?RPA%n5q#>z|gT61>HuiDWO+aGx_5QP!{q-d^o|KkC} zozcXa?Rl8Ky1M#t_jF_ra#x1U!SJDnt=)dz&)~eJI ze_8JHCP+xhtwmZ6x(=;k(Fj!@TpeZN!0OWUEzf`s@?(AmFUymkKf0G;0b{Ee7 zTo;!^pJbZ%PATfy5UN4c#_v%^nxrA2MO3CxFU}w?w_mCrdU~_C+(TZ^H_cB z8xzXpYbVnwt|Svtm$CBDm_!gv0EE-|-kUiB86xhAx&>+K;gf%N8Wcz97D;;_zvX~P zobUEZ=5lWU!je?a&K5D z%0-8sp|tkKKZL)ujZAs5Rsw6DpW;5YYbO20n!_`So13lEr2n}7k+O1m z+v;VqRF3%kV*Wpzy;G2GLAEtoyKH=A+qQSvwr$(CZQHhO+tx1I+_(GO^P~Gd^objh z4=XbAVLgnT9685kV>GmBcu8KfM)bdP;yi;)^?3gIiWuyFMC$%O82|5LwUUk1l01s9 zEpig8X)RjYIoGL{i;sg0^_zuBzLOxqlEheloQ3BE)1q*qR*s*@7t)6S1oRJ(U$VRH zhhPpH6p$BU4y0!K74*I>NYAd$Cb4pW;%1GaF$y1{zo ziRs2OF}Mpmo_#1OdH7q at Lj7ElP#eBt>D6#9HeQDW!7aIj3fe4CsHtw2W!NNjb}MH3 zO#MUI#V5Pc$+jnLMcJF9?n$POo9uR5Eh|94JchiWOq&M|R7K+o%=b7_LGYolk_&FFC?u`s$9Y!~skA=QsM;eg80;CK;N3rh2eQ(FE_grI_L-nXP`z3psn-!Mz`A zRZw{rr;Yha5LDbtKHFceQco7LmeiV(6t5VIKBm#p5%=v<1o^VMq!dZVRuoES+CymC zM}SD3{5Vq at _6)s#%ri5}Z?k;Bw-spM$1gQXT|$BZ`B7GasMMxys*%!RleyZZipf`g zx#F*1I}*9~xRaNnC$JY~P8ay6%P|?90njJw*`16EdSzAqStVx2jf at t91<}V=F_UWA zT(=B*eQZwijUT7D%^KfEaat at q9=iiOG+M*F7f8!lf(}Vkn#8kjWzlha{|dxqvr;Eu z5Fj9p|0s<0uRs*EaQ?p^rT$+M4CXpXa2W{|K_L-|fOd>9Givl|7i~~95p-GKpWvv-ZXu{B+6SJr!FiG2{kOIq6Q`M=#o{A25 z5G4$($73fL*r5y|W`#y4Sno|uBD@;X85HK+28t^UKL3IuV-;l|*%nqm9VbUO5hoID z!|MlKx5MGy@!+rHo2<~5Vp at p7uN{>_ zYY$fu`MtrusN%73J?;oLZCRp#QWDL1ssl-YnnO&%KXN{8nKZNNMm3EJ2bx;7;mj(H z(%?%8X at 5!d*ivrZu)kIkg1H8F@%aM*^S at gDswy(-D4+&sF$Gomxp}OrvgY8e1=iDc z8uAnwr+^T?XoCcnfACXEZrwI}A(Tccd~6J#BcK#CMxH;=qixOyAwD$ z at CUxj=t;` zoLO7E+&3WA^Ion+mBZg<%V%)i+p_yi9|hh5JqGEWvGcF_i&;GKgd|Z;CKqo|$CNr{ z-P$$$hSD at 8%Am5NzNPF)Ejs7yOBpwNnU50O(%6qvh+dW+QeX*kWX*L>aUNNp)~T{Z zp5S at JYSl1`bta0pSg*Eix_ZR`3k&FCadP=1I%VG++F84S72>1QkQ^%cg$6g|j3UO2 z8DU}Dk)#wjv~4N1rjZM2DDTr&a>hnqCs^F*qZZ5 at ZcX`;x+RJEB zyPS7k98GI}B@#nWY)o^+c~K<9Op?ED$1mnXW&vp~IQzn`xJ(my?Yqx3@%J$zi`&+m zyAP9e)NDL2UqlDpo@!$iYN{5Ml at Y&q_`W^bp{WAPWwxM<*eh$9TD(_k4}XXFxq+Y0 z4f!bvV-#vN5b+M^T2OpGx07L=PuS~1B$4=O`VfhWTWT at P7_-oY%m;`tXG4f0XG6># z!BCULK;H}@XwUx3=_$7#h`<+Ep*yJjjZ$=Ej)B%UmZa~9L!1!Ko^t5jnEU2WV3%;e zO)d!*nkTbpRP!Q+KEXFFxEsh?(3SjGU{|6J*qlo1Q7|Xs8DFp%Z+jsGI<%XS&qgTf z#Q-#zdfb5ny#{Icm+c!~aSY3moB#NlPQ6~s0Q_q|yjQ*LvE2MdQv3dZpRiT>>cn(h z`0j}L9|+;P#58$V{DvL2ABV$V_vGS-bMYg340Jz}Ik}}?mXhl!3yZ|ZHgfJh<{pW@;YJu+18^dUKxQ_0#jj-;lSseZLtleATTZF<_a at k0~ zmW8ByngqjGzP?->(c8FzPp{x*ALoZlZJ2&`KLplbiQeB_Y0M9D!g zh_Pe}Q6iC9$QxD){`aXk;i6nqwEu`_-NF9TRGj}ZaT2z!CXUV)hSnycF1AL_7IwD( zC$jx7!9w1w;f|I0a at vE%QhCS$2?8>~yF^9Gns8;xkTBsCcjs-Di%AW!R;3C*FaUZ4 z#BcvN!D)^HBB&bWt%sYd*=#3Mx6%L7)Xa}Cg~y8KSuB5$KPt!_c!b3QKEGRrnxqF? zg!-{&cCm+_9FUc{xP(cWdg?|l58!-)%?X6BRP#z zlceF2f_xj<-DtR9Ee=c(VmAUs{hCX%H!m7|@m32(NWzVG%Q232 at 8H>*c|;80-+!5P znUa<4;E?-b_?5;5ZV&{;YQ^J94 at xEaI?dH4y{0JiIJ6&aUvu%0>W^`E at N*>o@@g^t zoL$g37$L`L0=HTDvgN%bOCo0_ z$e6!R>~WO8(tlv4%ZE47apf$m*p(KA!=zF1sfND{yjMgO0?ISMyXFVA at C7$wu37Ss zEyf};pfy6Jku$eYz8`Dm(uo^;dXAl6divdAG^5HVpxjUBVF}oTvXDkL$TZn{XN32m zZtk6p&gXUF)&B~V&0 at P#k*-TRM)Kc_l82tqVr2P+9%l`id zgZ~SG3zq++xg}XQZm8STY*wmhv8Ki#&@_F1I$@duiMHehU|EqZg-q+dzqb{*4gm^IoEFq!@X*6+Z6`dpd;w;INq!0 at 2-fR z@&;7y{RY^-B)v-NyX41sa%aV=a3vn4kADzE7<-c_*{q%BC;81|8ioB)F6kh1WnfmQ zMJBFyG>?{iHOerF^vXpjG{%xnGzL`p->@*UI8+z%U{vy0rEm%c#6(r*{r*vaM=!gK z{WvhEze;GWjVkZ2<>N>wV+t?H0KFY0mqyq!5%0&oh)8&+DRCVlm&vjQwiQT5@;+!w zySRI1^3Xx!_t}cPc+pFN+06=io}9-yX_!`KFf*PpV3Hzs$-jQ$)mmegY6C`x%e@(- zZRP^5-=Ia81LcB2hOE}P5!3(VgM;dRO5-5&V#fR8p4kW(q8{~&daapEb2^wTS}QYY zD(C%%zAu4ff3MN1Z;ha?529e3uU)Lw;jayvRv&{SVvkUN7CvlYZ&P+4k!r!2|!mR0^P*)p5sO5n79KOT-D>Te)UC=K6k>$8R z{f{^k%8mxMPNsH_HvbnttVCJIX-gP|ms-oUx?BQ#5eP2%FnAT;L5ICLV7=I7F|+fX zf`yD<7h?mhma7rPn3MS=WG}%C&;8(+skw#wKEz!S#!U*!M(he at z`gtH%}$lmY;Mn@ zp5Nbla(}=JYPJ|>h=sEIn=!zuy=b4V5~qebeF$9am7}vRKUB`+oxkAF3unc{J$+ae zumy~4v$M>dSp_3)$GZaGVz|dTeOP;w3Z~d4I<~moE7a9g)RiLI(mhHlb5ybG2)89^ zD5hU(i+d4k#Uj(Q+Sc9euh~Ykv%%1!D|ZV;W7l$J+hDYXt3qEhz#ryKUaIf21mAXLOVRO!rB+V^_d at O zjM^LX+UxjZY1i<4yyFP>-;PCq at yOTc+jH#(=~h{L+AT-cAtGdYa7US$3lx0Tj?c*r zpI-(|??zh93&nk+;-J$;DPlD{rM2Vok$Ey4o@>8J*g8xuGLIS-2`y7DE;tT7g>7xl z2v$tzT$)oaHO})yHd;PqrRp%fl_+0sxz?)E$08$P(iI$#?8xuMM^v<>4w+H&jv69q z9I0FvvhSI2TU={;UEui!zTd62N~&!DfhSswXZRASrFahCCA}l0Gene+EC?2 z{RKefz43QGPKynJWtM4eNBk$;BI6-2%CN5B4{37BKJa at hxyW-A2qg?LX6Z8}Q*u#S zfM{v?!Zd57Tms_TJIc!iVk=W<4d{BHUKP-zm?2 at 4{J34yZV9^h4TJXq1~MR)VQga% zruc!r0EZCsFVy|IziVVq;w^vTt)b%X+Z0GY)pxJUzGA4~v8 zUnPp_PO;8_ozK2g(kft&vC7!NBhfor!eTnwM{Xut54SSoo&_?_qrUAQS81^IGrmx( zKtT?8*Etq)g?KvdAKvX&6eo zfm3fM#y=MKhmP61?X%>UFd3tVd!cHmN(oo1FX8*QI~HgP15rd ze3$PnA_Gf33=!{S2Nqw%kezQ4qipU5nRHG?fo69wF1Zuer|Ms)9>+A`NHih$?G+e8 zuvJ-lSUvKQSjbNd0`z~MC^23Jfw#3`>zEHx4c(I{iJ(P$=EEK6Uye4Q$-3)7lfDua z?fYS7o&=4x-p#TCw>owT_Bl!Gf#*yb>F<_2pnVsluHT_`^Y=q^&-$Yz9mqS7H|>)G z(Y*}dd?%vP_Dg8?r>^#=-cBD3zaj(mo)6dVphI0s0 at XYYV7oIhu{~mI56Y(A&C&wb zsN8b`_2@%&M%1hJ*}Las_Kq8NpmpOI9Ce5=q+W)R6>7X{QU&F;j2LMfXaLe=EhK^- zR at POi;vwuJ%_krY@>Do+geY~fc1r-R_eOo964If8ba&h)9vle^s6^BGLj_tcRt)?kI}gY;EK#GPW&RWK+p z0n50sz=T= z8;E4JnBgUZ3NgS0*~jm8u_K2S1Y$r1wQlif(}*n9>#3S(aW4=e$MGzz6$y+9cbwHD zGVh>Bsp&hrl7xdsL-);<=gjRifVcz%DrX0f3j1P#Sz07itI(=3u5;o at 2EMXGs35^` z^OPQ8g=J(}5(};!3HUUl#^>T3wgG`4n`t6$UbJamA5KzuH^Cl8n=GVT#3RBz&~xW%H&AzMeP@$A#@UHj=AOWa_T; zRL*JwHP23_=JglrJ3-A)oZ*xLiCK;dl#J6jS7TN+Lqtc1fQ$GkGVO6#d!y at s}sy1eYt z_NGh&rtCEX+BL at 1_WAxLw0b332h~=k*mq?vjaUS3Ze%r1Ruj9i{5r0Qy<-mz+f_vD zkp&L!yQ{faFQMyEDNZVix|=gTYOcW=tWnVb?Ix2Ebn4>vXy>_i;(Q_qQsx0urt9Ot zh}o(vZ_LK8{aB_03T)g#hgCdL{lG33yg2iLbf6YCzcYAJ0XOH5e at j@(**cH_s2p)#C!=x;84z_rbN(VOe^BmUPy-nB-BeR0=7*_OHg+G#| z=(FJr_~uYI$`G7cff6+atU2aG1^SUq=jvv+sau`j+Z_yb{bUeR5e`xYza1PS{N8@< zT*JIP&zA9E6f!9af^@2!#YG&&SSm{Z2lEqTkx0CU at p1Jm)QJxt^j;k(ujAApk~#18 zS+?lmPOu5q&|}TELOdBvh*RU#=X0>rn4wqAda+Y{KIg=OzLQVA%k0?|wDOj*sCx!T znY|^LH#C^ut)$i$b&eNuMdGOX^(m+2)2&rGxu>g!6{*mUlz5VQmNl}&T at ZrFk7elv zEn!KNVdW>FX)HJ1Ov&8^TDB9}baFHfX1&TyUFyc|B}{|WnVG<`!O~oA98_7wU%90v z at 1_>wEiZ`8kCN#7=1R`dbxIg|RhKTWTON%KT7nM=Ugd zUvOCS2w$ws;z5cgcGjQIwuGJ#nSkVc4)!#(i*Ni!78v6vY2>1Nxk$YxtkFwtVtpa9 z(_qM8LXHlHnMm%#CEx-{r=sWQe!iSrai+ at mk&{xt5qJjn?4pc<41Y*gNtE2HRr;mY zKWeU#u)%%{FQD2;+0CibG|dei0pB9k1X)w$KUVGdOLt at W3NhWIDWc#npL}l1?Roel zK$E3c#VS_#iGs&9oMIZMk`rFYXL-ya{E2P%yqx-?v$FtXN_yI`$La_qB3={~d`-=I znTG7o=fxR+ at Jo{|D!4v%V4r_70RjWnZa6yf0cC at H;OkO zGLHOx0aS>4fzc<#kjy1QnE at fHA0T|wOfltl%$tKet??C3It}G^gqybV)GveYi*WTU4! zLOy1>z(y`2ZVNkB z>IV7Shj_hpKn{ONLmuM}nVOdVyc_H^xRgrSAH4(+vtM3RFzfJy_x=$kY8N`LDxPH| z-t&`G8&|wuTc07j~WfG6P`_dCRxZ9kWvE zw#0QZEPF#!C15M1E4d~`g&j*YG-&%`m)*}f6hb72Ne9U)h`N>1hi-qX2Z!7`s|nDg z8Z8+2L%h at Vv>$N&z$N6$GJvozpo84U;Yiz at +J~{nYX^JG*eCS#Zxq_Ucz^&O at ImDH ztQfKZG>Sr2EJGbc+4u4*fTQ<^u=pmJSeG%nGRF8w^ml;Lm9!@B_DTPx+X6}xf--oE zjQu61a7h>#^8--;S-^Wo5Y69?mnLVXD? za6RwgI+X6|vk#P9v-f%aDXnYQV2*YGbOsK_f&s_NfcBwJ6l{Ry(FRXck61Vl$;g3u zX#Bb{`0#$*X#x6Pb;oLOD%uWQTdW%3VvnjV!$up7X%F{4BGUbPUBub;APx4k1^m>#SCoJb zg8to$<(EN_Hy8Q)n|R`8{1yNctp{FFEGcO0ysh?hSNX4mid2IJy>M}&!Wxdrb! zN&>M&saMGJ=nFO}{)hFE(RH_I|Lz>b+Ys*Jn-G$$go@~POTcQ6yTioRG*bft3(%1j-v~>vb}RjhxQh-+;0A_Wd_B;>z8%n&9;l#KNDjfid!-^D at F724WO}khB5F#P0ZZ56|fb7rxpR0{L;U+z!yze;DHIU(FpTRU%kfdW+>DC#b)IZq)LBIp~$u8oiNg^Mx z(S`{hux~F2gUPNw at T#j4YAVZ6axS132>r^At6gMfDhZbT5&8P8%KC88V-pN8KK4Aa zsQO>U=4cB%kO)X(aGZY-JK}Kb#b*!P(uEF5hL4hyYC%;pgiaf|Iiw5$@MEQdCr9+iQL+Rgwi9lH2*&xoyB`h^NKuQXT-dvNfCVmHsNP_me_I?G2VaL+U0Il$i_bfaKWY>Q_j2ch5V;RTSubxYd3 zEI_eiu#qtdy73|D-+wboL~_*Ez!IA6h}we)zL{14{}RVEUuIzgyDFS4>I=q1l< z0bL1j$Mm&>qPp=Ifvn`4|E#*pMDZc5FcnYwJ{dz8gt`Pdi4qpN(UTUDGD_>Cvq#Ld zj+%CXrl?iLIJXRHs7)dJBpXwibcafy*7Lhak%(w^_a2d|$GF<=57T`Sw z^U``Egn7#;lPqrt< zW;vbh-rTKcq76*ADd{U#zg4*+*cv|68wA7Vvl+(i2eoq74>+?n{s8b=U$jj@=1Xti z;2z{6EEUsV*;$ja)&a4_cD7#6v{93 at zXtPvm-7AQ^8cn8-2H_L;!6-qB`+R`;e@@4 z2XBoJsCs$qvel0=*r(E>b7l8G%!R4+!i#pI_s6^u2{ouRSm#JGhyi`t12!+3VOU|X z&YoZ>{kxpc4qH_0Sdr@`e~jLHnAYUUch7hVyeXrKZC1F$KDbDb;- zG=Pd7VPHa}C4!DF at F#L_fk5bgpJno%$Gkbu4b88d{Mi*)uXjac!wY2Yq_E4j&`QaL z$sczj#JSwC&`g0Fr1Um?G2&EJS0#<>F^i62oyIfct~DSnz>gaf=etULR`2PGD1CA& zwXD`u%}2h>1Eo(f$}>wgvupGyz4fSJ_M~KA`1sJ2SZOd z%c#bw41%MBmIwDpZRU5SjP0^-Ys&DGD|l3OJ)1x|H}KhWcbMw!Gn#L~J^zB|6!b+C z%z5hp8+|*cJUc{0k=f{-^I~QN(izmaL*K!LuCk}@fE5IE6(|1N$HNypw7AQ z38FH(XUU$ujDbKj3+LcQi%Vi|$w+<>Um-lZc}TNLUgP9WeGL!W4VpKLIw(viov%nN z5Ry}mVx}z+GCE@)1r|M9PWbW6CVk!$ZS;74-ysJV-q}^4CpHo62~Qr$wfqY at 7li0K z07icE{WN2#m5w6PuYwX%S%|TW_KY1{U5FJmG%RGmq!ApUB`twfr>6};P*6Sso=w{( zhRdnclUG`ZEQa;2ZGXgb&$5T})9!CaO|;w)(AharqGkTat0KlT@&MM-2-FO&#o^*M zzcp_YbvakYCUCR3Ecnor`MODWGUKZZBXzu0!|w0D6)UGZoZBOSfq=BY{!^br(8*cG z#o6GWZ7)R=Cl~AgO)acZwvqcMweW`Rj4cXQSy&jXqMJfqp&xx0yokSq8Y+tfR8O&! zOHz{loNJlh_qps%LmHAX6o23Dt_@>u$37krsZhcz?=d_3GGm~G4*>|4FlQKU zTRQ(&8^G8Fa+C6)l|aW(A+bHk7HK|-ph|6C*5Fy9o!Y>^KyRYQMaYZT%7&V4PcbqZ zomVVfYn%LzXAC|iLowY6242Wm#!Q{3ifjtz279elFzs_nw&E&e(n0O#o6QCjzm0dz zZAc>2+-?tAh-OHnQgrAUx2e132Gql9hghy at z-CIT0a)!$$ZXhSY~I#dlRNc7!&iaT zqt at DPx+7L?KF}Y+2zCO89-@``6j~sPq8bN}+EPB8vf$4a9({)|<7F^*H-UltpbsX( zoxCWrB2y?Mkr7H9#^z79+^7-K3n(!l7y3CpTC at OfEI3+1ngLe6YT0t_pKGYLf;>_w z6r-QuviBAgbB-z{8z6K+ at ptiq3<~om$4CiE3HE#m%EP6`FM%Z5ohAO&zSaW_QP*L_4I!G=NAS8~$SQITcOhWm1A0fSyHN5flDs1frcXuK zq)=tWY?)Bty%x|~2(uH+>&!0-S#}4jA&6Y%E`TwBT1hSe>7CE~ibQJ+rr z at c$38|64^uZN~{&1?4ZTL?)XKbhAG#J~2LFsf48Pua at Oaxy?m at q?SB?h)rWNOqTVA zwSOT&cp*hTLF8c-F*C<3e*!QQkz8!iU;nz_T)$s-?zg+PWRk!Wo1>4UyS#38oMvyc zoo>H#vi5%7?|=Ebyluwx;6bjR4ls$Ekia#HCG#5Mjj!L1B4WdO$wP2k661+0-twyv>ZLbS7YY+Ql@?LiTFKDOWMgBcecRXOb at +O~6F$Bu z+2&)9Q0<IHWf zk=ieC%+)GW)#wq1Xc4jCi^a|JdRbAa+CQ4IqL1QsTHyFK_oo_`Q3>e~qY|jc1uj$_ zH0g(nu)_Uc&569MDM9O|Zbu|DwlkTi^QrXt=PP%nUIu0gDlf=aw?7(oslFxov~3!Z zSed^w#hOG4Ln0=7GAo6}qR24fW=rrgN>pv(KavX!RP|Er{w#7OK^GPA;D(in?E=nm zKtZAB)cUsvDkPvFQI&vy9RxOzbxGu|ru<^CcueBEWu&$(kQoyZV^T7twF$38v*P-? z+P`%N)*(VyasOyZ#!F$R?iQ1Qv7luxxC|S4)QK44q$BUZVDV9q2<48&sL}Ke7X9Nw zsxB-e-0hFPVU!k*s!ll=#Y$w^FdCyov^!$4sUY$Y77i3hv^h^xn8Uj(lorlajVhm0 zEB|;5SE{qdsx$n_L2Ssp^aX_9>7Y6+cII+qgmh}JI}G*|`4)Wc9T{b-4Y$>j< zr?(%8p%?KEsdBb$O7pK&6K3tc1Z9~?r2}&>>%vG*bZl2kE7Bw?RllSX4Ldm-2sf>- zDh1MueaUJ1Zr4aU1PQc^CVA0KZ zjYnpEX|}@~FT*-$~4tS@?TadB2eED)434DHRY>oE~ilhaZw zHnOuab1E*%u?5H#8hyZ+{5}jXr;`e`Mmrn4(y}g~3PEL)=OACYX~;zXdvG6|`Q?{; z-~E(v#HSL`Zse%AaFQ;g`8|wPLBdDebx-r%s3XePs#9)^BUz-vk{Pt}B-)Rb=eSK$w4gO_{>xG{kHkwpl;ME$EQ~i?O=`cm%^iQRmY+e{4Z_KGem&rn zMvvg!!xLPZ7Z106_z=);EIL3Edfxv5`@PcIJGc6}@jbQj#)jIZjg`>UN^6e+~FkcbUEp|r5C)F8l6Kf z at 8BemY%Fw at 0VbRUw_qxe3=rPn;Mt&fKuKP-peTtGvG7BY^k9o*GeW7ShMC}$AGS_5 z7N7ubov+>35_?Oc*BV0?qwp0%>)5=9tY`3j+a%d!o({>4>MJjM`-M+Azl5vNZr5p76j4V}S1d^iSWEkrM854^Q7HpM1z zYSmvDFWSh`^KNbTduxkqD{Jnd6_?u at pWBAXBPI1O>s2G0qW`5LdU+s2Y>8TpOHW7# zyT`(k)})o!x(q~OkKP#e>Kgm`H_M}7(^SUGm!dPGteMht- at p1)zAfK0{C`A?=%D}U z5z0S&s+|2lDgOU(s{eZ!ZjI88EkFVB2VNe{zD4V6NV8?Lg at 2`%Re_$Rl;46>hk$Z@ z_-T-43aORzim*#+gG85ZMHB{ZnM5Ap6TCyCf0$msYoEz) z!WRXf`#Euv%-aNY{2`Ko2%&N$>DU8^&fHPX%^s*@hA at vskL@9!MMi1G{bP`j#z^;EXJB-3-7-EYZAn66kq+r;`cq%vf5jT9&?Q_33=j}7 z*?;1|{|nasJ9bmIaK|3O^j%vukjO$N&rkPY|LrA+NRBaER_$Bx~$$ zU{4 at zN_3Rhq)_A3jCD+&m)C>_rLYk)$AzHy1r3D=T>?RiIJ+37+dQ|_XS0`)vgTN* zsR$7K=E=>;`L2DvjabO)+WxDtxcCe~F*}%sunbW8p)b zaV5udH4HibiU8UY%T$J-YmC>A_KqtK#urHR~@_2Cz=(bDHTz2kxHzHC7cN_ zeiG)sZeE~9yl|QIm*FwrYUd< z<~6b8`9UnlFbq+Jj2a;!jJlFs)jGlr!zXhAQvwbp$!VlC&S-po^&$)94H_Yg)goLD zEXk8NJGOi^Bm7)pHK%`=E!9|RDUy8l-6B?)6DI2s91$-mMI-NQY3%|F=Cqq9oH-EK zipucGiqaJpN>4y%ARn7)sWl%myok%A+nA7A-UvlWmFt?12&R~W4c=e|=fcuq{M|Hl zJDz;}uYwBSAnI`h{CvXdT8cPBQ7OjeuP8wo49`BixMAsliK4ol3}a^`O*Jz7N8>ck z+XaxyxAFlt8(JCZ#_jWO5N|#8>WKv$?_+V}WDVjt!@~9!8Oorj3Z2tXcRzs%Mf(lP z(oWPYky_(UHx?M{(CK9MxOq?%4WCFl`!HS=BwIc at -rQwar_Ee0rlptrY3n}(wrhu! z4OKh4^7Fy(jjK}%>5LwUcqQ8Nx4IeP*a|foX>0WkuNCh^U>>cr*|}PW*pAuVPPn{d zvIi5LCfG_3<0*j5XR1F%vk~}}Z%Cmz>lKEeUD at u+BS!Aq5%^W^z){LqXfsLfk|P=F z<%i7XE{7JVd;`o>xg&VwFO}}_b5&7M#A2PR$o zCzW8(mGG(8F(fUWvO-a0hd!R8QCPV1g_lDS$?XZ0=~_9L7fDB(o{GCI{Y$^t7gZhZ zY3pV!ig?xr^a7T;{g(Q>aTbol>qzxDs86osz;@Hq^^(X+>#^|I6m8P%jxzvTtr3(w#XGHu`oRA zXUT+|oCGHzooR$w1sRY<|8~eopxic0Er|En!|LHPVH(?ps^zm38v}l{6Rq{B6$_}l zBN9SmQj-KD2HU5uj>UB$8 at Ao58iP7qErKtsha^Y9s|Sn0(Ny5DPQWoKI?D^u_!c_c zCXCYr%jRh3OP&}ZbtyH$6`Of3)qh0N)EZfn&W^--Blyv#KuUw4zzOoE^4|2}F5sD# zg+i-$86V)}h^euJ-gnL>T=7Wpm!awlSBwRT at +PL>9P2}OHR+H9YA7g5V{>Yf20Dht~ zD}z7fPt}Lw$`%Wgx%u6 zy87+cZ$*yKLTnF)s|&Fwo}KkK*Pwh0q@|hFB09h02|Co&4Ak}`ZyJ(nUR3=$npnC& z=ZwFN#DbHU3zb|l@#>2y#_>8>S>OYdFt8mjsvXbLO`OP+B!sk)oPs5Sd#G_i0=x7N zK*}kk1hbJPtK1 at SgA^*;H0cmRu{{wua1a9*(!Oex0)?g-hHKE8jM*%dk<=XBJ0+32 zYmIOmii?xS1*Y;X{e`3yVyau#4wLlVH+o+W?xDwJ%WwCNYb+c#k?W&yZZ2_r&H!4q z2*-*6riX+%(xbbL&R_Im72wNPghN1qduotF;)ZHuGYqTf(>lGO^5xk&+(spIjFRXB zKTF!_Xvm9jy7Wk+==zJ)`e}iG4(^FBj#^^=DxZ&!*y6OAHTJQ7^WmRs at S%S60kMJS zNfS>nHH>UZh at 3Ya8JW~|_kD(h&Lg#vYV5DbB98&vO+GC_c-vf}qPcKGO| z5<>MYaMnf~THzM2a@~0D^2HHz8jv?@0^~fb`^Ko8&HnwClitHkd{Z-%xEF$ah3M#n zDc|u%1R>WvF<`M6ESA0=F}dSg7qoGRH6USBfpiM}3pO#q_?IN(DSQ0BO!=VcqBD}z z{HewVohh_Wz>{wR^`WAqPH0SfwqBj_E!B2pRRh at CKAmT+v9$?_=`Ci}Yv#%k=maYC269Ewc&>OCK=hk%=~-LS z%Uq{8CkApi&BBa4)-7WkPCBHGk=dvYx{jd%JKebKP^0wKlWh0g9g8uxBf^;-eB*Jv z7$=I^cm%WY5LUw>w3?AZA8%!3YuwcU3F%iOduV`+niTsncb$(1EG z>9+Y;DAjv7QP1dFm(oxMJ#fXqz{R+JHbouxs9}@5pG*3ZJHjPc-3{roDEisK*YA+R zaHqdGnKk-+KUp0;cAz>%U4wTxq1fBYMjs`CuV3zwNr`f56r)wcG07`-J(s){J=_LA z_CR7RDvd__$*@3U9M~Y28%8*ga z+!$D3$}c&*!dcKOTW*JV;VbBqB)>yo9Fd at Mwgl>5s%!l=td`AD7rS&$yu_ zCd^fi`(yRd&%f1ZH^guwm_UGlSYZAK`Q-nu(Yjch{CAYEswIc~k9<;AOVe|}5UhJ& zhpuNp at lKK&ngm0r1~h(n?7A^^nhX$4HfrXV>@a)N*n`w*CCwu9 zI-UJ(`X`HX>HPiu^3n~6lO{Ai%HM!3km3(fdki<>Hr&!|58}<^vjF6y_e_|){#o6{ z)+Dt^Eu%CVX%CgMb5G$UaD<9Zk%)@P1Y+vNC^L4t8KfNrstgMjYleWmnaaBMj9uyj zj4`h~nuKKprFL7p*k(Jts||Yf at _H`4ZPZth0CBb8(-R%&H2Rs>(rf35z^O(~@Z7AyqXth3 zW2q_#n8;EL7+AZ%4%pTU2Uy&aIfO?Q#D9J$uHF9boGbh+L|%cKij#Wfm^*EsY#VAx zGKepvZk}#C)3fI!+0G^n+`n-OB}mmA(QQr1eD+^vTtgAxj_AFOxNR*_?95}cO6V%Q zbz@$bw_DiuGj#6G!o|f25W#q%aZNdFvQ3sy`-iH;v4gW zG1}4{H`GB}wrnV}+KABUOlu^Ps+DS2uq>k-5N>#nQryx?%ij=5vL*5*W=EKxjyo30 za+X}5`}vq(gyVzZ^TP=2M53FYi}TD^vv8+Zw}fep=!G}KmTsO&+>{?V_0(f4FuhM- zQWb;t4v06ZIe#CXaxV`6Wir<)t;eaEIS8o<+9+ETyDMkb^XnGWC-g^2sWgLg*q8G# z%0OtCx8qARqK7;Mh%-f`QHuMtK~{}XmfiY&nAIRuiE(ncR94$e61!8+SZ8?8-tGZB z at 7``Gl--ei;`VlbTJ`{;1q-lxxS&Y9~{&_DR|Ufd6!E36;Yb#4&f)Yf8)*?esas*qPu%X z=XgPa_lGf4ZMAd!n1!|Ww at 1)aruDYr18b(+YUji;59`hESO2L{YhJ?#hD^Ct at 9|?M z)LbfaC*h&lDFy`x*o}5Bt}1?xJpIo&8;%;=Hlub8)au)B6lc5|%^C${4XbtgC at 3XZ z&6KNiS{YXqV at L3gr1Zus2_@q)jfUzdUHrJV&!o(zQ=jzig-u at Y>ILaM{SktVtA=3m z2*XqZmvF_UMIB2n*Cs{8E@;D$h&(oE#VsBrYVZwak-n+RmF)5$l?4`@J!J2RIGrL6 zY$pH-yo%J%0!LvoL-6oU28%P>Cc&%tulP(SvL_23qw{5BQ|EnRf+slY%+l{s at g1P} z;*Q@`am^fN=%aU>ZMi6~4eJqr11!}(Tm}&db=p_uG0N2y{=J4*OJvA)A$kop<+Nry z at QMRML{|qClxXtTLR4ou{1%^XHrZ4wyt6RI6kwTrHTD{s7Dvt*g$|4D!A|t&8ktDODhcR!&6dOG?fWo_2nf23 z!9gLFEoZDUZdt8ed_sxTvL9+}RRRmdX0D-Wp`G-FI?0Lag&o8|9pWH^qf!m^B;z|8 z!xkB9GL|sSLsi6zELri2YdkbOf}e$RX2#)8^y~r-73iBmo*uQ=Vf+0|@skt8-7~un zofO`dp6O(77|JERz5b zDw#eYlKZ;VdV8U0D|2nE&HV}@KdrF)iYw=WS2^}^K99&JP-8W%%y)XhUWQV@)K#8q z7Dms%OlWO#VD>W$QbG=wMC#(;&guO1b0dZ%B`-C+cmTQd!v>#ivphbX at hRL;mo(Ou zwkxu~a7M0cE<7U`We6(!g9(oobcGcyp*E!LT<+VQ3u*!q5Rn$CHv!dJ*`1YwU^ZvWa0<{OvbK9)m1HN`iN$f3 at oVF^v)Xgr=@ z42v$stku}J0U~P^7^HZz?yVcN`E#6y at JXHhW!DGfu*F$>)0}4)_s0F)^_X8Jwv*0t zLMJ4p<1bkmJ45I|t1l~A^m*82ZO(!v8U~Y4`DH3!phWo;|M1n0Tt3Y~Or-Bbe5r5F z0EORtOiLmh_v42x8OKz at Zkb%1bnZyIvM0P|cAwMQmU$n>6fQzNF=z at g&3P|(O3{oX zq>tvQjIF^b4sn!4CO=oFQ04b3zqYIBh`mJe&+cfR+%5(PH9&4h#vNE%u at 1fn9$qodSu- at 6|`4 zywS)xDnaN){s74s?8Hw>;7PSSPw22ibI^pT98H7g*o)Q}&o&*s at ZaDVvY!29jB zrmK--Xz7vcwbVM)+o45zZM0~z!X9--EPcdQewU at 4X?smdi?lnuTdv5ojF9K2((0WC z!3Af`jdCr=Xh(>4TVIVjdpyUJkz=;ZGReLk&TBY}7?pN10K0OFlRNO`+fS6JI)%~U zNhZV_IKHkA9I7+lqgsj4iV^9xxf;KvBO|S=RiDGo!`|>7^d`?#R0Z2Gn`U%pbIKmQ zGN-&yJx2%kAm>GJd9g6~!A`C0aw z3Dj6h&}-aUn^W%l=KChs!%R<453oJl4(VKoBl4fR#c<+oNdrt&&?S_01qpo-Otr+v zKTQGemNeMvOt=073Y2OUA&w3y28IR;Nss7KOwreM z!0L#MJQKGZQMQ~H;P%Dl6WOhoWSNGUiK=0)M@*;apK8$CDAcU525YH&!1};UlZG6j zWIYGe%Uq}7(d4`;pZ*|$7(x;Meh0j`SZKBt z=rPEI+4}FX^(r;S%YwynkH%6k&Qs z>DFw_SB0xAFiC*SXRm-YmFjQA97cp2=B|w5J8?4~kGo7LW|U*D?`_BMt#6gE;aeZK zie*8aDHmC-Z at _*s&m{o9KSbGqVqJ|~?IHX+j>ed%?j_`DXXL)dR%NZ?D+9=Mh)n50Ln=FkW zuE~L|5MMk;OEsj5cC#Pu^~6G8ND!ry#e5-+j>IUyb}UMSt#{!(6P3fl*AFImN0YInV@$jSIE3Lj7|b|4Hoh%O20ohUDPUJY1y%Dta)0e~BZ zlh}!&*F&2d6WY!dczui&xmf9;zBiI)VF(wt3Q!Z;I-bhgDKFS zVa8=eCCs+W zNrgzzv4~zksgFDy6w5?GX&2oixw~f1lfMNc%*I%+FnUiz{K$-JhuN%Qitxx46jDK9X0~;0^3SJNlI3_7&>*)%TFu zTfpW%{wFZwwiz?RzyO3fH*r_A;l(eKjQX7xctyK_nqKLNu5Z-rsohAVKfD2Jw{vNW zib_gf{Ek0}<&EDBiX2Jv at e8FSXa z2}2+gZ5y0w9(+!+vR*$=M(BX#ZdZc?Iyk8HM|ydF{<-TF#xem#1yupnVJU zfVV+xTKZ)hjy&bpsp6)bw|$v+Y at emX*eAd~&|hi#!Bx-WS-w1fm$f`6fjD^gbJo^F z7sYZ=frRU~`=Yf&dthwo0VO;wBoCgc#k6!n8s22WOm-hO9=U^P(#4Tv0yPdtquw9c zu*hG!iy3m?cUEy=`MjCg?%F1?m2)b{fHj5qos-ZSTbl#JPp`L>5EbsmxS%ol&+lzG z?uI%@Ej>LWch~arxqBV!@L|SUGJvy&-0k?JGiHNNe$llP_e^=nAS(}H(6cKN1&VV| z5#1bVss0{kO1+>fZ!^rJ&>s=U>_$9^D~8Gw{iQ8CaUTMzXgE$aaS;5tfM3!GA`KA| ztTo8AhBO9LGDFRz3|5L`aGZAgXlogN!s;-`KIDpaRC)-XaMPWP`Q%2?_irtvElJ9W z=I4{lsJi3jtq)wOZ+11M4akjdjMMF?bMkTfX;Lr`EE&q>z+S8E8H*5iFret~YDH+LoIo-xIE zJR^Ta-#z>94(bWhGbr@*KSswsrrT!6*;75=pHB$>n3tyX!Ar~#^(lRz-sydutnR8N zcX30ck+tgFhV?^+nR1u6mkg0)65iPYeBEQS&n*(85{qCE=+VvH`RWx_@%SIr`5cCMO96_F1n zj8a$Q)mz}d1yl_+ekmxzEz!alJ0X?5$^@iYZT1vkjazEfQmCrbSTr)V8ZMjID3#P% zT-gj?>LeFrYnEqv)>~xA$WY8Hv%z68%am^nndsPUSo`33JrghXZ6j??V%o>pvg0}Y zR2y00C~d|YO_5Qys~GR*x1;TmsVZwW9Ba0K+8jO7J9x~`&xCs_|9R5j2JoKFd7V{g ztVb)}gbHeiugC<@R6;PY?{5hvMw>cRKS$XgbIb>yO{Rarck%Ba at rx{gi3UkixAv8l z?Clz#e`UPJHWCGkiqUv0k#LDuREzk`@aCo4s8UPu?n)iG74%OZ5jGdf95leN zpp-{nDOWOU)2f_sE*;@mJ=91DzShuK2|M>IYT88qkXbth*p!PZ>8H(mcyDeMGtGC4 zxHQyUS~%)JX}vNS$2Q{{f`~LIYr={S6`!dJv}IBvD7%{uSZleMNF0$dBKtxvTn6U! zd2ZCH=xDI!RMI3bq7Km8q$>%xbmQ$Q^0Ja|Z?&LH`^2g`C)94=um9vaFODG(qZhHW zT8zg+rY)c)h-6F16M>JEAVZh)ec)`f6OG~uRL^Z-N6L3Y{ zL~337OzfFoW9LX|VFz^b=X((cRBj#hdQ>cm(K4rTJ_u^MbsA|DGTP?O6y#w%8$ zNFSleMXov8 at b$#^x^74e(X-!vSo`xcp{1NJjS;DW-FH%9z;8&C;Or9ieSwbYI{2pCwsOH^%6gs>E0jwJZ5c-XOq?f>O z=OL|v*WMjoiUrQE%=gAOZ)~cUz at ac9+E1a9VXmmj@BfZ=qO7bLRiHpXx-dXMod2_^ z$bY!h{i|8$L at Z)$Vq;?K{9jBNZPXUTQG5a2!GK+CYVwXsauG#g=#KM>YLzOHIp}s1 z2R9!$lR@|S!Nj7RgEhbXTKmtu{ePGZTh44t%s+NDW`R1{nO*zjn3-N at dw<_tumMfD z6C5DYj$;fJBYglSptSo`7>oyJsxWH83CI8!hOGof;A|nOsrFL+6~P;@cU89MwlM?+ zCCwNG9#)}DIJD=adbO&}ZC&Ly*vw8<=E?tQKF5_7)n4lyDnN_T*)P*Fr~_d##oU(7 z#yqmu=vuDcOnIg=vCiV2u^C~KzyPc3xKvTn34ujCC-Fexmt!@|;HnFu%nR_HD at Up6H1-~$b1pEtWLVlE*tGdr<$)qiHRGF>r6n|CvQ`-|zWtCFz)a_F%MZ!}qf z1|=MvwihK4^1~Id;!4(auo+QGJI|}j%uzb;ZmlW7#x{|OlCd!D3UHt2!1 z>;b_rZ4cdUtT>Kw2Pu1b7>ZWhLmRM;)q*+ at fwSf&uTpAKT3Bq`c014Vy at gL>ofRT_ z02pN}cRWQBwpVo*-wU)b$FYhu>SrrIzt!otKXXCNl-+T=^^`WHF}q{A9__rV7?*SwYH9=XI|X&Fa#@97lnDt$;z1 z{Q!jCP(hr~B$w=9&i&EnyZV`%7o3gP*Nb-qAlyq8efvXw{b$O2(zjJ_KEK_m5 zkqOX%0PV^X{7}8`(m-frdaC!O&lD}B-@%8sp0$w at s<4gVQnwFM&kKc8-+gUK={DVr-&!K~IEH3vL zKoGJuB$YX5Yotqi)~oE2VC3G?cX0pg#6gB*?}<9L^AFBTS7aDICj4RzI at ZT(JK8H4 zt;c1VH{d!;6|%@8!X;Gp#~-%w&QTyf{#)zsAj at xn{!-^D8%wE1h&01wO|oPgWrf18 zY1An!=X}s#38r}SQ8`RnxqZB}yVEE3$1GXtd#q(>_O+h;tM6;7boF`)+JmyG{aBbU zz<4E}MBK7XXgPU;^P~(kiwdmcMW0I2Saw)Pf79~*+UK6m`>T?phW!5_q8R at rd#9ze zz>o5UHctu%EUD62 at B?)tP`MYoSv4+l0rRjJ_J%-5DvQ}6p&I at Re*`jH!K at SZKU{xf z%%q at YF7&fW6Ssbw&G_!LnfQHv-TmwZS^g;>zm!isXpR6!m4bDs zw}Z6M+%^%fe(2q|U2?UW!HTH^rNxM9xN!8FVhHkwge|6-s64UCQFC(78Eik9KV;uT zevLSR(Y3*ao8PhrC!}7lp^=2GO#jMj=zty1P&3w;ZWc!#ZrQ+t7gmHW0-x(uM-5 at s(*9+cGY zA+UpFT4VH>+pHQ*OZDu9o~L(ViQGw&` zZ3qAZz(wum2Y`^mqTGp#jP)8(SE at 7E<0>t_e7ZzMr~ul&!=;9P0u1 at 8D3>u9yOu)? z2JhP_UL**H35#o(-=iu-__pa&MUM`KF at 3IIYh`*o9qlHw*Mk&JU`pFDn~G)kM&RMa zI*rn<3Ho5yauUbspX`LC=VdDAiYF2z)+C839;5Y>Y%_=@GBNVdXPtiQ^*Qb^+@`Ar z{RQQ+ti4)A=FAxlF-+`Y5AMQFc=v7ok-@|aY8GPGLymgAye_?6RzZ<2eM5q+Qjc)E zjAu3aguyxp1}sqTa6#FlHyd$Hw8k`n+!CB`F8##Tp`+zQ#z%+ at 0HHxlUT1r6>jQBY zhay3E5 at U%2QKy`~sS;H&0JT7;Vs{XMNZ~yWkD3F*%0AS+6VgJ&^WQA4``{?PmJsYx}0lYp2NX z`(Xng$aP;7C^PQM0{hWl32{%fMWjLaj_0#OPxJ4%}p=dSOc25Tsc(Kvcc&1lyMGhcDfY zwC>>V2i3(sR06F8wn_5yi3F?(#%p*N5%F;2d-V$WqX9ue> zr%@gw>}<2D)5_!UO>sdPt78Ysp8XFZrxjGLYo~zf70rUb#yqH zvXjr>9E;!hP--$2k~y>vJbkf7B{fSaIONbNQ!aZFRTqnd87r&lL`k at 5Ee371L_)KE zwNpAag0PO at SQ_h-l3{+1S*I*s{OKzr)oM}JHPmtq*?AJ1p~{hRd&@#avS5 zT*KU1hwkk!Btgj(+n^veu3k(7mhwk0?unC>?e?%;ADQ+HO6yDp at fc`p3%sh&g?~ts zW3o`j62F+jp=sxGr6q=4tr8T#A%wYu#on9eqUVOUM$CwK2hfQ$8d2%IP_-p*xIqJn zwUZhGy^C=7O&P$3yT=&uMl&DbiPOqx_Hyd_oW<%bD=P)|lTX7O3s&v=mZGdIbN{h;YMx;C60sWew9oNIe6^7lCcG26?obP&=^ zRAgB14^wHyg88k|PTp>>+BxZt}jI+Miw z?8K&7R(eS)g%JH#Udk+Nb5e`wTM__+pl~r4jr7JcLQ%n`kM63}LpIZZZXYBSjJwN# zrO=dzG>}WyiFLlg=_fFyzM`kTvex!v1$h(1w$K$R$EZc#>GwqmZd*DqgUIQ~Ua9g< za3W`96GY5d0UGvfC7qYt_NK0vZR8ZWG|{+eq5|M{ts@!3BV9r11otIo{{B;VNK4uT z0CXU1l9D8KByZ7F4o0!L%uQL%ikh=ws&rO}q{5Ln9#-zt8%O->7xu;~5Q`ZohzK?! zeIdqbXCi2E-9EG z at obg7jH&v7)gsz81=gI8K60yc|FR;!G02A2)}(<-HB%@IXXqB7XNn-qAyEhs(gmK| zP?y%nIn3HNTP at R~-u*7K at HlgF)`Za;U>zzYwJ0xGAVorqRV!X_#~r at ut(Okg;2{GB z9i&@BTr0EsW9^i)2JBf9wN9IqR4RLU*f6_B)k8Bjso$1zxLXyDH97diVNvxHBl@(1 zz-+ at KR?*~!6T*Rdr7TIxa0{v;{I|JpT3_?4ivsBx8~IDK4{y!IboAt&uNAS2~G z20t-Ky-BZnf_|+uvV>TDGMH6=6*Rp)EPG~I)6Htaw0yBHqxElB7+&ZRZ%BxXpwAL& zLK~z~2AZ^5BpwkzQKy#vwnDmqzVn?y+AuQ9gj5*3AADZr7o at q^-QnUJBd=KN_n+W~)Z1>NWsgjo5PXUy# zk`^1Op?MJ9+rU{%tzeotvW+;5DhTp8^}suaHQ9B7jdWADl!=~xvQFYR^Zi)HoGmm& zV$BnS?sTRT?}uy-GvAMo57b`9lm+p;I6y!_z=(yg0?q(R4hA_UId&QSp{~QsaRZI9 z*@9c+ZL8^MmBiSV%E&$UHKw}0I2+FPfnrPGfv}Evz8XeB at jb1OwMrAmz*I?`_r%SW zgWJfu(`bSf<%XjxjT+c{K0`@IzmdB6dWD&5(mDHPk%^oH$jDwZtJe5Zrw{2!C4;nc zD<0*lt6O^wCv)8>qMi5^9#d7)SHJ79(vNJbqvLKD{qz_TuH)xzUJpdSEQB!1!UuY3 zJ=vR9zmx(FMk$|C1ucRKWhv*PVxQE4m5XR}Kg*9;6v!fzjB?u)8>bm6Z)>Cszp|kaxtamotipK#sFroQSO!?qV2OM^rlu&){=^O2d3Ay#=%Oh&yTWu*txd!)=4g zSp5no4_L1ex4Vqf2|Cdu+Hz&~fpu8rt#T?qf4DlO4%D-Fu`bR(iACqZ<7BU9*|72fk zuWCQlP`&^ppaz at r!uyR|?;Zl(&hZWn-OlL_9v#8)t|sbF>({%scdr<4(p@~*D{LlK znj`}h)tg-9fu*oo^qhEXjVYrIvSs0VS-$2P^AsD(ObY^z`2}(D5oXG=GSBcl<`i?x z(^c}XtJJ!p5oX2|OLYd7nFdRCKjdZHDXf$fW1r#HlsSOQvJFN_v1TJX5y3n at TVlMz z0?v{~ux?@rlEMiJp_{C_4 at 7k7Y36dm=edI|f4}I$Y$*tY5md?#b5Vbi-|d!jUc-|m z2UQw at bUCKXg!w$`4Qr$b9S%w>8k-T1SZjwmmZsLRuJSVRLlt;T0^}2KEJ3*Aq at fy~ z{3Nu<=kHVO9)cu(vn@=kyLiNATt5%4AYIXKcU7%(hoM6e5OPW3ZL&#{Y_`B3j?Y0E zkm|SKRhQ=!BnowFvtfEq{3usY1mCO at p$|g$>sdr|O6{oVMA2EtH z(3;;AN_gA2jx(8}pCGYRlco>N*HG$^(UZYYGC7i0UR3DBvk;M at ZX$JOC-;%Yb~ltb zGq1>;lg?)hS?4G(#IP|hd zHf2q@;g z4^cB8%V3bLPI((i+4WA(sH{J4onB-f;w0Y`Dd}*@ZYU^%oV6Z0lqpIum2k?sZGk{f z^Q^{;fYH`uSQ8Wz*<_|xVPa(HNUVKkJ6Ad-3-iz7G)5XU_ at u>_E$FX z&fk^tF5b2B7J?>=)bfwAL-h{5;W$QsZZ^ye^qED)37|a?1Lrdk7C_;fcoFFX|DZfz z14n<|MWj`zrK40qhnim9#*>59Eqv{?5Hc2d;&c-y>w*rsi zA=7Ja42;g%rGC6rgfsg!>P!S&4)3DZDVREpx520Z)Z`Z=Y8^M^@lxu{4GQ~6v*O?_ zm(_2KBaYPxE3%K+()INWLLDD}xGFLD#ct25ck?J!ldOhiELHdQAK$D&7(S4SDQk-~ z{jR`0z;a0YA;;#WMD15sMYFL;@r~Oq1``vmA}|A?Cc;a^Ofpc_C2dx?2s1k6Lcv7x z7P#AdK)JaI3I7>OF!zaD*2|$g`G|_5Cu1)B!@zTcw%hHO;0$L*Pq;4)=4O=V;=Qh5 zV#~ZT9i;_GSr_b?usH;3&#V}UYy4w)cy?=aks%e77JsExQFu=C(+2pXEu?2s4(g*e zT879Gb;a92zJ+q=2`n}EO&CvEpDr~4>85;87nqHCsTrKHb6%o!Q~UAt=#0xz%eD-k zWm?Rggfi3>|0$z4SwB;pnZnN;(JR!K?<|om*d+NE

dk!v!&T?yzWfYBEi4{fC!8M-b7IwI-mV^|)Jb{uHC+`f53e6f&v|LO!b(gWH8qVN{9OR`zj zR8=+I3x3_o+(v51T>H}w2 zPTcfjjlwwcTWD6eQXtRNM2JQrt**cXVE2lIj=60 at g5s7 z%-Ic?P|MG;E0 at jex0sjhx2;ax+5ErxY~oB3B?(2c7L*y&L9TH{tFeZ8`Dmv1zH1 zV{ColwR;kmx)Gb2qPN{$Aztn=cY{RN6w-jZxf!>HJL5pNvHu8e>p`T`ro!LHE!cnL z-=bQt^F~i?pSrT$oy>j0bNWdgd&TTW9bR5i*_loFS%h8}>*loYh5DUPXj-||qTnIU zICrBlJ^lv7eg3Tp!b~5)rUMED#Q9g&W&IyBu7IJFv!j8L^M7PqVkr}k|6(zjtfFJL zV2a|qOa zrnbTe8`y((pHnhA${!uCmJ)gWo!N(WI&R$kYA`XLCJ8!g{0p$ zLl8d%2-(G-Nt at sEP&TCvhTAh at nk)f#fGyXlx&x_zaskfYRufH4rZzF{!_8-hSMqPB zr>`K1?~AGJik8uUOxL*FxjJEAjcaCOa`|elZPnr{4;wMnQCkn%@B?wGDs3C^d^^oO z7A=lw8kFg(tM$FC-st|i;UEwyR`7&}ZHNcy6&tl0*JjOmJti%9l97uX6Hb|hmL(^( zH0AIg{JZ;cz=viSe$D7kCtqBf26N-kG8 at c6Dz7k7>EtLYm|567(r6J54KZiUR4tl+ zeh6ME=Z`km1G+cwn at x-dKa{NX$t2zUWde23(yn{3KEWEj-9=(8&r&&kF2npgAD;n>^8fg-sbwyx!CNnfdPb)Smz*Q5YqVpMrq7-1i=vc_^gx%y*n0>={#4_ z2(7~$zIQcE@~hgu&);vtaW(R!K9p-^&cC%GW#nh9^|xC-VlZSl)E>B0L8BmWxkjCR z5U8AOHBw`Oy-KOHr*S=&EWeFZtqx*#-_38fz#@C|G#nhtC14A%CMq0uZ>OWpH@ z#FpPdwV9lgXF6MWq8B(Dpc563h;tW_3#i|2jmZq>z9f|*-C1}8xX;$`#yHACPPknI z&?T0#bv=XQOU0o-e1RT at c%{1#ly(LV-I>Hg+GH!P9g8uTNp2xU-SY1gydoF^Aia2< z&p~R{6MFuDWt2o^&Q0y9Nuo$9)*=p1+&r`xKns4?udykb3&QB`P)lSP6uih0~ipHG7Jz9^Z)w7{&Rst#p*xo zX)fGw(m5>*H7z43N}dV_T?Y!8N#janu=iQxFhWyGsbLCL;~5(iNA>p5>7_&65}PL< zLA?*e7&eoao2?_Gc!W$FI@lsk*c+C`jnyrE*??#O;&|WCV55E*&}4 zS3E@*dm34I^90(f~?^sjJ zI6uOFak at B3(HDQvKntPcmyY8E-TKj2dVUgLzNL zVhlqIT(;_HpnD5qMV5#T%H5nED` zAEkFU81*P&hoEd3sd0?DOf`2#Ri&8La|omCGT&1QYAj at h;DKmw-K5e6I)gQ`4oj_3 z+=w at a$P~OO_n3@{I|HkNXB>3<(O(n;qXL6T^-zop%q5t6XcabOmz&n0&6G$wgJF3r z8zx}UhhaemBy#)n%h_E=V~?=visdIF3S2qYq)f)IlA%mb^<9+akwHN+aQ_Sq7)4mz znqEAvp>b>+gN1N%dVh#cOOK>Pqlq|H at _BMMY{Q0?a~H)pg$GcK+8bGyw*TI=V?V?m zot4{w{Zwo)PC%#3-v4piUW_I)w}RyZ-r6Yd9n8P?qfhUYD(u7}Iu7oZM|O^q@`6x!mGLg>vX?UuN3boj?3?&w1;lvEAM-!Rvd at 3F5_p~q#5~3kk?$Aq zUtdf=JJ-ff!)<_MOMYqJ8Pu44_o?s#D!B(m7NqU36p~t9+SPy;VC8->EPnCt%jUZW zpS*$Zm0Zb1T=yVDznUcuhFvld1)=B^e$BGexG0YQCYe=Lt`LtDuEe3F#db?>cf1^TrF at aY z;kO(*=tbBavES_lMl at V@$Q>gHPujXWNw+iYNq_p|r`H2aZbSivy5Pv53|q(y3un?c zDSnyLXqq^>-yH$zUbY(_I0BtRA9d-_LBhJZQgC(+1(0?Ly>S>gmK|_c*+DX;ABod$ z!GcH7#N!xbwG1{#NofJuyX$?zXt*j<)n6Ny3{FrZTy6gF)&O1;Vo5jG0YmBBXYbc) zXuE;QH7K!cmnqz9htt9^X4MI0-6+`{7TiMMwuOjXrreprR}??@n5Ykg9+1rczO`LC zX92t0%phT;mKp&KSnrS=PB;VV7piVt5z^mJ zGE=Kt zp;A6mwpn0|81&vtYrfEuHBtfFxK06ha4*^8p|fNOi3-7k!?8I?3E{P{MCmIJ1P at ZW zm+ZCyz^Uis9&71^-Yyl&hNpkiC%uuBI`HCs)eHG_#QKE`+%)B)FwYfIS}+7gQ5qgaBhQ8Ylr$(EWF@&hih3>@B0?8CWf6Q2^ijioEt zJ%CiRID7f;ej4IKMeIRWLpg%^?ow83nwQ$ctytjmg>3qFN-;wr-7#L>XKQYb^r8=9 zZs+cOcmyh4?JCEzThx_}y4Kgbb{l3o#~C~Tg(H}S`8_FHYvpnU&vlB5^biQY9j<>s zgJN3a3pJAP5_wQhn3t{F5#NO>e|ixb)esrcj$_0+o|6OKiAw~TBRepNsD#v0x^L0V z)sViv{^rImjw<>+_!nc&hyLF&=6^;1KU1)(mD5iZ3}0E>%pw>Wm_04mGzyq)61mgul^YeO%pcB2JNqLeEZ4W)n~~mmMfTyG}Tu29d<~6oZ~j+ z*Pm37CD!;Xy1bL~S1;4Nl4~qnU77?(coyCG+b-BEFwe8Uwqq?7~c)?zI(V1Q9ZZfsPBbMcDmqeaZMCBJcf*2=JB1WJY*km6Ta+j at __M0uD zC#*dlJ?k8a4u2CE<3D?or_3ZBKkMG+RqCwWHMCbP-)DN*MAYF1Bm^mA}squ<$yA(Lgb- zMeOEB;Z&U7IG(Lks96B_U>UGdwej1`)q1T>QUtM$63r&h)iLem90SNe+Q<$QX(Jk# zPVPckC{TJ6<_9 at Z@1qlGLll?@x6#2im^=IJ!8gX*!>Ac~5|HG2KOwqP??BOp994#6 zTS*Ua4>2ne3mCM+(|&m75|X76=prt8z`61V%};RQHmywTlqvEgLv1%oY)|Gcfs!Ha ztTxa$Glth2Jaoj7fq*gY`68L)^bZFcP&L%=1z|ovhaJlPv9`Tb^g;Qi8H1y^9yJW$ zRbzU5iky?>5ifLKZ_6G#60V%*5Mn#m-p?xB at M#}1&!tPwB~;}U>{Nb(tKW%d7rv)Z zlnX;2 at zDGovk5c*jg5Xv{1fDCPo at D%8&;lnE(Z}#lCyst%K?l|Vzqn(bTmoGn*$`3 z8zS{_cawgb1WP6!vO`WZSP5M_wb)FYiCYMe{|ecFAbCV2&4UNCi&}hyKeC at yd7+U- z@@0bZO ztzm3$PVhcWD>6~|r#}F|QHr_s^#Zj#Jm>j-;HVhcU%y$b$0yETKfOm+NxeCZm1%D#n6qi6Sl&~l}H37 za_+(mY0oo92L#(ol*1LVxM0t3)O!;O8;46W(kzf!=;iq(VhUQAtwWwtnUpN>Gz4HJ z!RyDmEO&Ty|9-!!DeC!tJ)i?RsOy*ujXgZl#rY(6J-{m2PaBqo{d3^%zsA0XH_Q$SRW?F;9aFJk-^vIKS3^$+t5foF%j|6QL$SeD2GXF>%{aqS=ZX8?=c+{2raaT zj=4xOfjpfxrlZyh`*|eOJq05(Lk~0IO?BmkirL-?Hy|TNuKrgdyJ|3HgKoFEC?Stq zt)tPDRx;N$Xg>CYU+D}TCg2xwKXV9YG*Jhz4aiStLH?p|woWEsG+O}|vRkVgl>Dvm za~i8Qy+|U(COT8)8spwi3p2irev?D&hc6mvb{>}&WbcUpPI6d%JAKGBPk(FHSa&|y z7OGH7>x%QJ75%D}Wwo+)C7Ky=5mhH8Tjn8mlErJr<~&SglMHle8c%sa&Z at 1AI0U9q zvxXfg;0#vL*nI5GP>&Sx=KDpxF&n>CiH$nDfDg~R(~u2Uh8oKkj;jni`9!`PoqDQK zr%lHl+f`@iWVE6+;(`+5HYP$qS;aem40>6Gdq_>0l|W8H!*#roMu(kZK$7JpC9qb- zJIGGOJ5&N(TLdm6f-^YKjMBO7DMC&-2&vERorsV!)6+MV=4_>9j9*bQFp2W7#bxhfTE?u!RvMZLsI@ zaw%hMwhIDo`C7^doYZzj;JRlvfe&)iu#STJ<&Sl3HtvCxje~W-Y>pbY-#G;11+adS zl{6nt;e}nVjmJ+zW$&Fs(gAyZ{l5I>G#sPRoD^O|o0p^-SRP2 at CZ^Lnr5u+>)1dWK z*{jj^eU3$eq0&BKXCx#NfzO}ICb;|B3&9s9H!%v2>*Y7cz}#Sn_&5S`Vq8Qba;?6e z{s3esjys at g=C7jgS-ZGPST=D=f?)dUuC@=Vy3J9lV8Hh<+Me}&zn=|{TwT&B1;^xsp8wq40u*tM>V4-g9t8j1>L=1^J zX#5KN3h8|OG5f2TVC8&HV-4HIkcVSr$eyE`DtS6~wqrkULR)Ttl5XuWD752a8zK}Y zWA$Oxj*JBQVih~fb~7TtQj|Y}kB|oI31j{6hAFhw6#D2WEvhNYDAkqfrV)RpoN$x0 zO`wp~D{8g#y;-P{>YFiq}b`6b*njl&MG6k0gc9{m6;d^#VqsZL-&-GiK2 zdTmZ(d4 z+qR7^ciBdlZQHhO+qT(d+s3b|%YJ*m at 0@t=?6`5yy%8(cjQQt`H6vG!%rQpVig4j} z8zdT6TV8HeJB`Hy3YcgX4S)8YOvUQjxonLSv!{LcFg%oi6l9NIoO~G znY$3vyh41mSibxA$NiTww;i1u3}5&!DrJN=lxWlFx0`i`ENh|d#&%ZhQQO$OBkI^> z_F&rDAjeaWsg0OQcCG%NAvo>!J>J05lUsOoe0~ja|q=vq` z6ZQPcm&L-%BX+4zRf*g&WcdvTBPac4QL?DJINz`&(K$JyfbUIcf&GS1j at Kx|s1ejv z=)Q>DX=8(%YoOg6T-i(d at XLze`N+_;t=OWFy4#bfaA2BsD4y5aK6!nKSapJT)n&gk zqXXNq!Tt;+*=vEs+kZm%=v1 zxmcD(um>@x zJamU>@^%&Y_Y{7*C1UBuXfbmc5&4N-IEuvnDd-&5kk{~Y!CaNnCvL>_#{(^#pcO9< zjgygjyrD^SQ&sPfGY~Ql9;F24r>Cq-j>)DOVl7u!E#S5flv8xczH>A{qyeMhi zr*{e`RzU?q;1X820i(U~8+)uTjkT6*;I>fWGV{RA0bN&Elywv7s4&(cn3&R_wR&_2 z)9Bt6iiV})j<|t!l);_RYuZnNp;IsH%L*?#u-H&Zzo03BPmJBy1?87qoxt0|;Aha- zvE#mQ7`Y at lm;p-U`0sy=FCT`jE>i#p0xCxQzXKuvjsX8Qa=BDqQbYURHrWLO)}&Hu zUMsu-)$FIipu!Leh+Igx)*@^PC9iEDE?D>9cz(ZQeDLaf6*8ld;$1vH{Zh=yO)?%b zh3=FI$?%%xKi%2&$msb}uj^^IZ>U3}qP12b!@FFrRv2~T#E0!Va%pY4Enc2u# z7Ao3)kMP)=$785V4w^tu9^ zC%OXLlHg79VD-PQUMGIgGx}mSMN=;(uTMLlcq(8moCCSuE{9+JZ~>DVT7?DQc%y(Z z;vGq{NHxu-y-O_6Zmd*3h7rl{@XTIdgYoJdt*|ItQ4wiFrIFI93NZBRZ3Rbl?ez>2 z(j0GxE=#oj6m4SW*uIYHl-I7LseEJ!g$IVxvFJX z4Ca#-NMi~@rYQ%?LFw&JL+KqX6wS-3^T1B9$FZA_-nadi|lQ5 at TLUKXA%*q*NekW;~Ux?}*O?LeX0L3rj4vQQ> z87 at F!ff_rPd6Y#G5_~qS$Riyr#OMHrz0o8f7yHEYjNN0vuS{m389Y}M$2U&JD&_{S zV+^S?9O8tBO-2xdxcb43$uT2tN1|qD&1iU_5AW#>>A59_$!Dmuw0mZQdR=5~Z3}yc z@~*3t_K> z*A{c(wA3!n>;ht!h)g{>E16Bgx;DqaD^gTj5Nn<69tc^8yUUAa)0<)_(poRCzc1gc zH+_;@c&(_b5SoBS+Ug6*eS9Im0I-Ngwq2o|@@RCZ%cThS#7(m8Z*A&|czV0qv83vP za~pLjJ;N|z%i0|N^6XZMIag$KR_r#)N_d=b%)P2Mdt*~%)vLwS)rDs1A$^9c2y?lx zT`iY(zd+$KGqc=G2tFP6_zl6mpcz+vb1;r~;^tzE0Pu{}A+jXaP*?9^xF$dA#Hzkb z at zfptUS8%9Njg;eVdJv2DqNYc(YTNCivZ8uSI>1n@}@l8u`FUNz+EnFRopOwqM^P5 zWXG*b$B|o3CUZ*z&0%Cmu%EbohiQ3T7BBkG_c~`h#e`RL5xv~EFKMX*s*3%Hx z{sM%wus}fU{}(Y@($>|)(aGfhlkDM&q4|cAS$EQr`xG&%gwt=35p6DES`P_PCua%^ zLCdN(cS=HZx-?}q at xnf0mgg-Yej&bt$NJvBbO=_C at n*@6hoXr%$(DXLoh>mE|RI0C=DM&bo=|~>|zn+X{%~H&FlNqXd zQftQZRCIs>>ebKGeYTd%WUa_Smq&^8g*D3It)1?o*X$-cTdm+YNXCiYg0S&!lmngQGvFc9cxMr(+PbD_L;_lTx zW`zrKDz%C92o*Mc%xJJW>t&+J$29;f4=l$G0sP& zq!oV*;~%P#M4wNJFS8l5sWo{Qz!)-Dd5?=p{o15l=4|UwTBE}}iFhzn(HWE4Ez2!} zZ0lrA|I&U8l$}S>q+fx9G#Dp}0$at}M at gpo(H_`56eSX)T^TL!Z<#O5ZE;j>c!& z_|>-C{`Mv};*C at saLQ?tlr~KtT7hb9ww9^g;l##pOwjuJX6x>;^X<*x_z8Qd~$ zUz_4K^62WwT8tQk!e^b#I~8lU%0sl?8#HTw{HQ86UwLOU)HZxLlNn=j6hdn%ee(F* zA at 0}Zd{;cTXV$vf-2)v%C~LucOsu0SKf?xc=1lgP70aC<%Y;#JtCWtK*%C!Zd?~<* z<)vS5z#>{7h&mH~4{kNLs4JL!Sue?V_8h#kLNFXCC(-acRUFZ-i0f>gU z-?gBgKYE^Tdw8FQBGAqwk30nn at nXjSBdN`VeGInNtHD=3Mi&rINi zlfNeANZFL|CX5iFE+eOYhjw^kWqXn)GHdQApf|%>bdST6MAq7~=R#u^`R3AmxY5`m zi{!Hn!O0EAQ7SfIl8E`knE1}MOn<1Jc!w*#2Eb=gvcaZKyz>KFNH8&pu(M;E*14_$n?d8Gx3ctdbyQF{gS1Cl at ZAc{p|`<(kS)Uv zo}s7)m3qWh$Cmkk*)d%dvljb77_&4q(Xf}5OAqsc*EO`HG=}(w4qj7Y9 at M>Hz(leG zzIW9WyeqJ0HSk+^7$34(xy!`fKPvfygC#)be+6ex!vDrL{f~41B9J-l^P(Z6=+ zJd!40B}K9ln~MWNIWjU_7f=e=i04Y_L!Du%p|KV2Sv+LJ~S|0Z_aQIzM&vM#fvY}RLuaQ$_G<8Qtm$dtm8c?x}e$}D!QQRU3TOt`j3E> zJSpsq-s0S898GXbKg+m;2^<&@TxCP$0V`%p32O9Ge?`#j^0C3VYFIHr&p2< zWUx?cB2=oFQ=}IrW%3y}t=Kl*+DhVr}!d#y3%~uW+6*fTp)f$Gy6gE=62W(0l*+ zo{e^1ncfZMV8fTg at +eBfYt6j}vPmGx&yKy#;Y)sfa}(Y$mMlwqD|dRfP~)(EFgTn7 z90F4-a*k94^lG at ZHlt)IspeWTN)8t8=E>o9Ii>S^E zPsm9GFe{zq$W`OH&h7!p4XY5^Q~E~UjYEbNG)6Kd&vSz;ZJ;i!lfs~Co zs`cL=gT=~(>fZ)@*B<)Lv6qRG2U?zX9?Nzbz}^Ac!xU7xqS_7wXJx2!)6Svz=8?d3 z4l$1gjdE+f&a&jI^Bt}2Y5Jdlh-8 zt~vK`bxBvxo3(CJm8~0s09bFUBr1wBdFUm>9s;*LWopBBV*YV#qOLcJlZxy|9Znm| zn(I^5!JU=G0M0AVbEqb@)+#j)KO3Moki!pZHFbyB_4~0GYFAe6G3lqQng%?YI%jIV zXl5-IW^zQ;^&BA{3i?)QFjZe@bbzR-G5RqPi0pXJs7hw-h z?U)t2PM8&Yc34aI8wWfOgW?@4yxtz+Dl64uS4)k4O;eQ{L75}9vt7G9Gr#p zm0N9{sslG1-#9 at g|2C`kP!rrWNnmx+GBy4T=7)&Snnko3s^4`s{81okKIi*P`GS^f zA;FQq|jE#i*mQ(;W|>yVF2Avo;r;>JQ$_@@ukP zb!Ktqud#!qsw0ARiNO!MqF-)^mH9M$u9+2sF>)ySB${x`N~b?b=11Fq9`j$aBy~_b z;?bboi&asrcPD*3SaHX?PgOPQXz8RZR@`XlX?92%@^0iHJC6U3=kH>4LriE9n at F)W z8)T4?a%wEnx1h=+-*!7+uNf6E+?S4!N3SqTDP3x)>Pg at Z{_F_W`9-Tn0)xoY0HfL- zUtki^L;Klk z(tsajZitjNcYyTxGzg1e%U*z8USNMj1%kLR7lpr+OOiShf at p9zBpH5fzcR0E-ek zFjoki3Xm$L&@wbt$;sprwMappAK`?w|%oN+#oJhIn58(=wq{|TZ zX_ESpIE?9fs;FzMmQJ>h#o>T`IF?Pyf;WVrQ~pp(98dhATe?7)*aC_~Krrd^_%Y7Z z&$u7BF~P~$OBkA$GGOIB>CL!5U^$GqxkV_s2Vd93``Z?Gg~A>oN**DO6A)7I&-0si z^7$495=p^Fk=vG|=U0bL42u!0g_yg7WSlGd=gbu);Z&d4vFNp;CR$*Nr{opll!#jB z?6T$v8Zw8qTT<6%a>#8QR5w+%j!7oJPE~I)4ejCjA zAK~|>1adxWL at s6nSD-0hr>aO=%ur`acaYq65HWo*Lh&p>L4mn8|dKxGN0kwzXy%Y4>aD?Tw& zx at XpQy3rNu>K?XBb~PO at 6e%zHOgf6TPK$?PFLH8&wrTRXBj)KwXT5C*O8g_+TR-Pp%r<#l_GGE_iNm(9RiKkLB1E%F zmtutx=`I?Feiym3ymZg4VwpL$&~cYq9UijutYyItSpPo^D?J5o8~$$>vc{E~>X5g;uOtasHSrx8v`* zb!PwWSi$bRRO+m;cy~&ANfI#)W7_a at 0Hc#43LS3{dx=|j;Lv;>M~gX%{Gm2OtSYdG z%joFVFOPnDw at n`!Vb6Mt2C0#jZh((vGp4yxQOTWjhb-Pja!J>{=_k-DmBIWjS-Xqm zhm1?p at HfWAd{jTe5Hqg@#~H+^6Po<<8JO%9u6oi*g!HCynqfK${kz91%z>=fa{Xn)UXn~(zHx66_ zhT4UMuy+W+&duiZ6ss%Jq&reQn>vbgQ$-pK3eBjICbm?$Mf|gQXp!(JBfJ%D^XOs{ z1Y$q)p->|cFwvy=KPJ1AgdGw at 9lSny8b|P3MbHu6s7Oj6 at oSFqFF6$y-R45JBa at 6U z^RwK`rWv%fNImhcc%s&}N3P88yKZg0?l*)ZM1_`p+t`?nn;9=f4#!E z)0UlTJnHBr+eFCvv`q8S3?r4JQ(jcC*Huu=Q(9 at Duh0!uP+kl+w7CqIT_?O*x)BMH zci)e#E{Y!BHQ)#-`Tdv49NGCV)=+SKenEWIouzPvwbGRVIv#9_061^0dj{5(m0$mW zDz9+w3mm{eK*1nDKn(xelwHZr?SF)fDu3I*{ZGywqBJEn^aG7w*~;j$N^2k_5Es*> zAgGaKLetvJda;PE?yH?6yuzYmCOBsPp5 zagzWCZh6?W?GJNutU;T{5`IL*UWIaI7>C230I)org2-rl3li+7DBT*py|xLhf_`3R z2079IIn!8N6+(Jkg>_^%HbR+w>-^eU6_C=q1zkR(vBsxSWijVZeY4RkT z2_0(X5fs5bx{9DfjLy9+x>ZwWEPN&V1xLk7fZIQ8ZHpx9gTR4+;8FhD)ad`Twf+Bn zhLV4CpAt`2j(r;(6SQG%VBm>}=CC3P^gW^1gpm~-k_Z;)v$h+%&cU5WXTLzd{qx?0 zoFNp<@IEi%9KC1PWq)#HHKxow at OJ@nPq_h~M|pmJ->CiEeDX$!1mw4}f+Pxy<@uST zAnrJEiqeM6A-Z!5WU0aKB*6@#x=lDQDK9#ua>SWeN;(OvYtZru^Eh z)0s0(4;q~CTFyD at Iai`S>za(qm+%rbXCJXhhj6?$wicBFv-H}mFaMpW{5EP4YUF=TESfhp zm&W(fYxoZn3q%`7 at k6JE7NsvDGnZA1QhQW2NrJ|@*h#l(8pm1G%U(LUSoW+Ux9pbS zJN93!hwPhq@>Z>5t~zS8EOU6bXs|-h%Mo7XNAZ*CtTbCney8Gg-h|K=th2-}yg at p1 z`E4k;1YX11|F9-XQ~d*2qlmC5C9zaX#d>msu=VM{?oP5R8aH9d;JYKkRP~ylmM)xh z at sR`LV&!Xu?p4KTRtK|@tHQ2atak^A{mIh6L`6Qdr>3ZGla(|k7;O5xXZnwj!w&`- zaA&JOhl8i>S*D>n3Iu~|+(iti^2hjl1$aoKG&PyY6%%&E at d4g?F-gz`_g9`)VLMxk zZJ|Zy>$fvgZ`GNhMV5u at av@e;7e&{y3iHy=e#*>NwF}*ry%QcIb8QE;iqhV)9i+nI z+R?Ds6~#s~+^MEZSWgIT@)+v0ky45A8K;9I6=yW&#z^jlRp|s1*KO^cOj9<>zxI8l zwUuqvmA7Re&mnl6 at mpPN-Mqd;^^e~rNv+JN9Xl#-wn0*u1UeVbzgsy)JZG#mRDDHI zjqHi`2yjuEaJF~68L??^f&o}pW*{;?tVh>Z)2e0WD{1G`_+w?Aj36|PmP3v0^Cw&F zfk9lu_DA%razYSA&}?YcdxjuYFe~-B{j7I-`TYXlaszr-%J%T!;L5_u4$?vdnCLPv z4npA$M`+3Mq<*c=%dBu=(`ZBb=^nD2O6?V5GZ}H9lC+i6O>OjY4!U#QY}CtQdOk`V z_zsr~*gaE?P2huABJ9yk4_y|BpUDyWKZdh%5%dLjit;!>mEHvql8TcPPnawkn_0Bp zS?c=r#_0*;qot1}@rWzhaqU$W=1t-b30|5ZV?{Z=#}hb=i$nMVggjBltsXGYch_bG zj?zU5T>3nJ-m!_Uv|E>*Q3o1$?qCovhZnn&FX!(zr|&l32bAWFV$U`MEYQOUai%|l zd)G$KcEdly at r(S3S)ATDMX@=GyA&rp{51lk(Q at PB`%SFJ&?CQ97f!WeuL>BA(9Xm4 zZ91I89m#cgPBjm2cmN%#`t)T2aL54ReB~vjTxBBymM0u$zhTOadS*l~$(s%-o{OJx zML+BYLzd309=5$=UT_PWKNJe7WTYBDZ$?w=s5973=6z-4UlmGIyfUAl&&`vaorXX0 zn)tZ|$aRrdKgrk8x4ZyKiKsP$okt^e at BU#nLRNzP at R@aZw!uW+OF{Nj;kTwxgO-Sc zvw=|3`_iT2345;(PPNlIk(DOHfZx|A`2;) zgCQ-sW4jcu+^TGsM=#)#f at 5vlc)YMGhfcaq-{eZZw+%NP at _Q9O?0N9oqj`b%zU=q- zZXoz- at 3{F8P3UsT`a7PO&tGK5z}~AM^nZ7*1^D9$43&n%gGF% zVrW-NJw^%1q6mit5w_GEVj0}Kf}5U+Tzmgq%2j)6zQXe>pJ{MXDwsJpck%pMVRU(G zk#mvz7J2Mp9jb=~r8B?E at alW!-F<%kYe5kFxL?Nvy0G7fLvP=X>seC|K3)Ti;kPUI z1NXK^A-cU27f||xd4l7?<>P&NE4(o6Q3i?tm;Z#w7edrWdcGY%ia!9z%%q*5Ai!e% zIfM%R)QB$f-HLh#+hW`U4h;;huA~lKNCiHxN0ZEo#IaCRGEFWh7dc-fW3?HFdu1ju zLds&3J~|=9tUHeCwr=NBt}&Ltm9lq3v+bm zA>NqLaNiVUgOFy%m2+|7p)wQc97t%qT293fII7d5kPghllIc zcfoX10+9bYZKKM>lc)4D9%9KXs1}p|X_;nB<$X6EK|Yx`i`>)QUgkr#DK!;aJ=EV8saBUz$_C%m9KjQ^#gl;p at QiUnX81(X1kcz2 z7pK|LY at Mg2dj(T|4__)93M>&uW8ssqk_&tgdlHzT`~g$3=QcUiT}uI7Y-5(zAf{li zp|q$1C%}>s$82>~=pZroc;HA{&zQd0nv+#GGP#D^6{K=p8r7;kSXh_kB5kmij4Pj> zJ~)i-x~9}IVgRyxEZ!G?QJ3J=X(s;YH1#7_X`-IV2$ntLkA?(2)3s at nsrWKnLWVg7 zxJuT15iQ|y56NgY=_%q6Nqe7kUW)UFC at nd#*M^I&!tdR`rn9h5tcoqc34^?qt(z`jptOj8YK zr-_UV+E8Uh$*nfBE{doufh8N9MS2}JhH^?w*_aRVW3)tEaw4fsX!cx--iV5G%#`%Q zRD_7bc63=y>4k%*s+Xz?le%98_Jw%Uj}=G+BXJOLYIp=ZX^T29Rl*l}HO(>KauFq5k zFU=!tpLT1O)TIaMigxee=Gw9&_g;?HeDRbrWy=-0BsqrBSaImrmCA~tO%-lxD>CAA z>~&^gKw!npqwSB?)A6O`YsX(&DbW$^9Dsb=;VS?lKi3`T at cSUoyH$1B4V8}%eOVl1 ze;CUSmrz8RDnV^&SY~mTo`k&Ws3$*IUSB3KAy#ZfPc9J;IbO>c zwcIOPT8KahqmD9fphpqaq{uVb_NihdZ0b$?^!^3IP|TX)NE4i5;2*m3T%tUaSuUR( zX}=`t-MxifnTOVxHVqCA9*!^355BUyTk;qALI%D_AW*T2ETZ|4NPKflx02DP1Gv-> zYsai53f{OxneR#k(L?geM#cu9Uy3QdvKDWlhEMd%BW}sXfcZc|`dxL at S}Jme44w zxG>9EBZKD*zwh6-1GR5?k~fUa%Dyi5%`hRUx&oDt=;otxQ at Qb0F5!HeDF!XFecOo` zjx{GL4yzYxfgAOkEgNPN)+YvpBP5}3$Ak+!hVvVK(lz`L)p$Z9>$45+jAi%(D1S~s zQge at KJz>s~#p|uNs$kIOUT{_S04m#l at n(LCs-HOxpqcpcA1bWZXZCyzZf;FReKsy- z+PYqICezy*BKItVX(A&R!e0PFXxwovLE{I5iGL^_T}xTJ0Z>3d5cvNM^Zl>DMvo?} zI_?z7EJ82x zup!bo2IdGhSmT#i<|SpbRF0_lP1#a-#1fJ`n+205E*IKK;_gbL22dB3Scc$1EmR36 z%|?&2??MLzGjmnQ`SXfSz1_N<^tCcm3L}f<#KXqQpsQ%r3>Xv*YRh1vI>!!ljT&kj zMAZ?oISFVaoLH36LA4>8i;KyMbvANMZcmyQ$BsR|TH$iqiR-<^*}*PM$;st$VoI3q z*U_msJBByY=PAnhy>gs4 at Rld5I4ev}!>BbNL at tTa!Bodg)FvgdHPf8VSsf=yh;&r> zC``om4J at 3yI9cjqrV=t~w at 2-ZB-QlfY3F?#g%(=ydhRVMS?mtj?H?31+gN_~Pr-TR zq)YJFq at r*-hHe?@e>Q)1o*Pevin44e9=hV&4-2~mCzBMTH!LNp@~m82XOJwu(9Fj) zPhNR`@eK7%f?LU=7*WN2FS|=jX0|$0(ewhyH zu>>5RJSDX5d$R8gPjyqngm)H`NUIoat at CL*|C-Lw+D~0jNLC;18Irbo_+wN*J<>|r&nXanvNNiS9aifQcC%M|>$#0frtp?BP73b+|6ZeBROQ(>SweW$&3p}jl zKOM#1Y}1UA+R||~n_L_X=8D^OGnvL|_FHNOJs`WR^Fxgc^E~*t;rP5YW6d(D;@(bR zI>>h-AK?bO8#~bpxm1m{6(wp>?m%@+!Px{eBySFCqF~n~1cR&~dgu=5tK+Pckm2Ek zhm<6~lUaFp6oEbO>zo1 at 9!hh|v1NULv;dV0|wCNo9l8JsG^kLpX^3m;Xu=fTeD=VUZpBc#>vKTe2C-LYqE%WmTT1$&cy$^xHi^ zA-M?=qtZt#kmVg?OA}CT<&ow0Es!OPMStq(M{<_kmWM<0O(N;wC&IO3E~7QmtSUAMD66MkwIvDnml2GLVdd^102aak2B z&?a4JIKR4+`bV=9UWu9@@zl8p<(^fD9a4#A#J+f?N~5B|W%L&m>YcQJ%F8 zvkP+ykerW?>U%ucvCY3ivuHb`&;Y}}mTnn_?f8(<G_ zW*O(MfF85&L5nR4;Wx}h*vt&!*0F|0ckHK;FQ$Fmaj!-2iqx2{8nK>qg$^gC+!rs9 zl;~@iUtWkUEzX0d5`y;0ySat?T;J#mEL`xWF-8>UVvF+eB?cO~U^X1knh&WoP$VeJ zOGMIloUxb(;W9dJO|1PKmj8Tnq+-ef^Zi`PdO$aYpms=a(EJ_f7d+}*yK&gIs6pc? zC}+eIdfgy%7(wzXi6f6bQD(uXOZJV$A<{4{D9rl1xG&?Z?|fMaaV?ev(c6UJMFtUy zSp?U_c6xEiYei_whA31P8#Y03+twyxb`3A>ZkTh-rdmCou=yBq<4>6Nt6U=I=hAp3 z9YI^Qr@!YakJ>eRwPmwCjM`niStxjjThLP%a at I0l4Tp$t&$Ag02pX1LB!?7exk&PeRQEs1L at u8BD^Cu2LNwMgsz#n?@u<*JAs zKpeCSQd^TzOXD|(Ev;%AH;F&*j%C(*q{q;2bS0Sz)>bsmd;AAfcSAmdVpd(UYj at Vg zkuiAf;o1<@-&>bdJ6L@&YCo(shv}=NfN<>tv93z8J``(nfL7ILw^YR1+m>LS6~x+eS_X3lyXe}1X>EG;$4Ok(M_Ex9t;WhQ0j-CNqE8#+ zs3{3{J#xl0a;Ap8kO20#=l##6dp~1e|2M=yOr~5X+rbAUPt*@*(1Ba$8m at fbCVbEUl^B}@K3C-MfS>Z(VfQ7W1_1s*iPWjoZ z*l^_ofpZI(3uLU-shoWs91c3911*D)9!`uGIIA9x+Sn4~hQv$sh&v zmEu5=>4nN3S|N`x4@((ZNxaJEL_IW9GocH0B*zlKIkL$m*D!dRZtz{>;=dpsMPWnL zwT?&iQFmCSAFZdmu6Wy2nt~ubC3C at s{QY(KuXD zSy&g?p^~fB?`TGD6 at T5(v z+z5}cDvYD-iW^n=&0}okFfj3FL;>Kv)pW=Zxh3eqT?RV#E(Luu+6EykBlvmffS`4dw8ER_EYt?@tqhOL0zCp?zf+ zVc%x<>yYv~!uQB*mJoM@m#(m0mv?Jl~_xxxDh zjg51P^3-pOv)m*-fLpMmv~-38-{e`YU)o*4b3idVj6^I$omzg9q3v^;gYepTC&|i^ z3(JyQ(g8oAkJjFVY-5k+a+5u^^wbv_T$P0l%Uy at mgf-lU4X(tW_>&4e at sJ|Fz1)st z4!7n>v|725M!LroZpyn)jq{#q{HcJzTJ&(nBK@*Ij2Ren=&`xI8{J#hyWf+rf{&iJ z8n55aFGq~7NMh#5UYm%*@1uxOb!k~rF*HtrGChP5|ID;~d2NVCYTzK&dbRsX5PZe_ zf*0qAsDA`}jOE^<@4)a|B6Rz#6hV3{32e>z1sz7 at pKP`tzIVlJ0D$}cK at NVR?d^mB z`3uy5{WrDff3{I%EdHK`ZS8Df^KT+rjf#HllfQ77aO^gg5g5aSm z%q^v4saE>iEU+)*w=+!LTE+cR&LE>HzJUCa?`|4_QRh at R*L$31x14T_O#MDS-thZD zm+QDI z6l;afnNa1rUYz-5O^?gYfojz#@()wa(mIcd6j2ZmmOOh;s z^&{BO8Z=Gcj75JftPp2OL~ANY=GdA;s~CAdO`ebk?LGy_h(L<`374GMJ~WCaOte;G zIR{bG-4Yua5mV7cQ!sXa5e&j&?~XHHkMCphK(rd{2?I5F3mQxgxNb6*Zt!$CRM_oi zd%ZvOdH at x2`K?)RKcK at qe+;PSrn*Xd^t$G#Kf({rf{9z!9zrfaYc1SVu^q at 0DbL3u zRDx6(`ZS0sI<-lG?W9_7ijLyghIJ=iH5)OZUzz{vUrWyEe|*wZ+;&J- zZz=)M@~GkByUkv7+ODc$Ec34x)Z1X#@TYvu7 at b#Lhg%VsQo+g~m~8;?O|^MBwN0wj zb}Un>jAdO_iI}u>tgj~97A_z+T63oe_&Z8(cv#N7WSCvH{DKV*=FFtata_{gER6ez zDH|J--7YX{{LncIidniE)4p|PR>!I{<)vB#T+LSOMX;-o2D@}))}20eMI0_%4R`wu zbRlMcsP=>ixYHq0|J2uKkHOVqYanX~0Q_I~VxP&Fp5scnCKn at 5@zIAUxx8GF at qm9V zHy7=M9M5^y1m#eQNHa~ic^jKM;6W;X?Cvnl%1#jhgKB=k?w7aIF1Gvgahe8uf?y^T z)9ELVW3_M&qa>T2y^!;qs!_E?fXv5ZOK&!gEgtpl26gYqy{0_x*+o82Z`H7F07 zBI(8nCF;h20Ml)}vs?ZE6ooMHC46{{On~@~ zI%4*xx7-0N%CE$iNHEAAxdSVd-T0T(VK=f~%za4U;i5)E+>>S?CE?W!>{a6_!&IOu zI at 8KVj$s*T_6OF8ArL4^F!N~KPLruleljbBDoB8Yf4m{fx+#dW_(oD>LX-&{X;A}~ zt5axfOeyn7EPh(e74f>EQIMmSkuC_>;V4$ER)&g;>*Pd9#)JfzMye8Pr!_CdQ_f8Q z=!AoZaI8gRZbXh;9I2Z6mIUWf(PhP8;mtrm?ST90o`O0eP8)yXPnF~8%;Ez5Ib%3{ z8a{b4j+C)=YwP~>;c*yf;FX!m1DVBYU(3YB*{BxMw7SidcWmGEYI$N4cjiK}Tg9$PQJPs9uw1Y}LQGwFXwu){Ts z#CH{)8KCJ#dkWmtFmrIGrl-)r*RY2a*s7{u696MfNL at 4;_HzKn&n*cDukFlKw@?pW z*Nx28AGtvA$~_gIv!&O6qHmVDlKg2EVs_S6b9r#LD&~ti&U{j=)G_))mQ^}bVvQFk zS?uP>lQ+k+ch;I|BvM&Y2>sbeeVRV~TThqMdVSOhFG8DZQbmS=%BT!a_8!J}q&ma_ zfwte1kawc;xC!-jVwvlGqz-&51JxFHoN3GPo%Vitw&!Uw)i9V@;i{0->ddhJXWTu0 z9xH_gvFL}2F1`gLuR3+VH`8#9xPOdT(}8Uuvl5pk%`mT6E&5?Wq|yOJbX*u3W32Ya zfrhEn_7VcyZgG4hj2=9L_)dctyR3gJ%#3_>BhU=yo~T$t6%)LRGOy&-;BOk7Bw4bE z+rZYCWSfH&^8U{8kCa*rbq-?(?RGalhJh+Z^NO at v5tSO!j&A&adIkI-$ZvK=x$}L^h=8V?Y+Zh`=T373ZSlkXi-;Pab z$6u-!@yM0nn*n9MF&yw at 1}X%NmvmVCWXwuYqiyIG3E*1lmTG zX;b3lQ^~MBrlS+g+oj7z&2IxC=S=nOwVGy0dg)=Ryk5gz>m}|PoCVMmjn4W!ZtC`a zjO)+Z5jjVRSc_l}V(f8QpE5BcG!B7w1Q)3k*3hpC!R-X=?;(UwyX6KcA5B<>m6(hMD at heLQZ4JDuL$RhF(o3V{r3;fltktJH1t#;e+~L|Idef=D zNn)TCVe{BcUz26yjxxBYWLWcqPxw z7uSWovWGYvCN}Y>BGaI3L6bi)CGok?vw)Yd8?BUuo{s;Cu?ZWsUuH at PTN-9Qc6Bs_JZ~_q z{7R)ZIiI?vT&gzq(3d3dCE(;jiL;Jj at 8qY6ZR}r5=3l!{MBCbn5^b>e;aymeUuwI| zpjOiB&-SjEZ97K0>c!mS`!lbDHC5;cb{vH5k1d1y_~)RjDzrKqn6 at G{_U?9G_G0L5 z^MrNX2kCwz#D6^ej^0yav+v-AoN9>sA>;E3=-X&Hn!SKU?$D2j%kBbU3^)DXtvBJe z0CrYkyk-8|d*A_{IBl_>+*jZyckE~{w*$wh>5w1zntV(z&i4Uc^($P5q;rrr1q)3z zN?ewg?rStsX6b6xPi!W%P8WBCG4m+?#?)bgIksSG$P`%1`cCf+U z|M&wIhP<7@{FSYB|2 at +5{}821I-58e{FSQxD^p9{{R;yijrB>_ at pH)u4U?=8<`>$i z${9TjaL7WHLM-T$z$4x^+i;F0cIi59V|?a$&tb+0ygou(|=I&dbK=gCHo_ok#1CLcX3gxl9sp at L`Ofg4|iuY=t>R+(9D8Je><(|Qj|Q5BVJ z4Hx`P3GbhBU(7ud at fH#*Pw5aNL2A7LK8L}kg;&nKKU|89$b`4aUlcpOO!*pEmJKEU z_=P$>xlme0Rz@#tVW%0hGL*mzIwvO-tSRcQr;=T#Ds9-4wiG^lau{Iw=I-_IvTpM5 zk;l5Or~(bwFsSb(4stQga01Iv3fXdb1Dkj at YHY z2A~a{CJ at LoJlKzVa(xmwQ{IIO1XwV8V;czMMXu*PV~jX{AFbh=mSNAZJ5b at eiyidj zhW5RrI&0!5WwaL^*2sHyo{~wQQ7Ww-= zsn|){IyoEI8kzj9^ZE~#M~(WWD~dYWmt4Dye*-b5k&#`6;ZY)3OoIiGVnnH=h#_0J ztSA2XPYMLk5MtHcV)?ngYb}mU*P7Zd8^SWgIoCW^RAYZFGKQ7Rrde(;KQ92_YTfMR z9`MT-)E-;@6KklEFi(FZOtJcnIaVH2LxjWM#Tv{WGV8-ZeXs|}do3~k at X$xl;`Gzq zfA#}PUwaUN^K&bXs5kz$B)AUi!=xnB;{PG-Eravunk+$~MUR-7nVFfHC5xGvS+?jA zGcz+YgT>6uXfZQbT6b^v&h#6z{msrsR8>^npEo1V&8*Bk$MUU4JMo4+$W#&QP<=qj zMz%wxw$cqKyJlRB$EZ$2t{0v7y#|Zzq(htSpz_FhKn=E|qee}XLnz at _YjHAQ$aYZ; zcwv)K+VDOefU<&Kh=$2rWZW*tl8uJ=%|V8hjdf}lR`L#TRXonXjXiD+?3km%T-1&^ zV2(1S6&IhOWsjb at 6mM-WRhC%sfsuZhR at aE`D90LVff&g?QLGptu+IkYm|2`waL56- z9C6tbeuqW7 at VUQR zKX4fxj_7)YS7vrh*I9L1r)3aO4si-aZxj`h6Q~VTAxq|LEPJk>Qjw)d`w77 at M>X5l zWLV2H(*~M(?|A0(h?;UO6mQcL)Vkg$MEnW;tY3;+IQ#LK%QI6h*~#hZepR4SDq?U_ zJ==+vANdmtLp5FO_^R at pF)=EP=Ml|QDj4~Sm9k&z*~Vv5w9N+W)E at i2l_pwSS#R01 zGu;>RiHbCK><V$VMzN=Z&A#{=JpEv85Iouz at D1^ed7v3J8B4S-n;*Eg(iw?W;?0_O-sot{ zvZBMxg)1+x>9y?lys#kV}qtv1;o0|AhX_2pJ@>YUZtSCcp3VjX9mQ%b2 zvKO%h7LP%<%CRZ(N`I&fw0NzS#J}Ip zardJ04$e-9bp;OMBR{kilLZ3fJZCkS7 at v)&x?LBx+!E|}OD-8?_na4ZYoYC3ND!GP zb4-f1&h2HbAbDkIElbV4M&pXf>Gx8w91iSoX5wp|-rilmeSE3L4Z|cXGaWzf{rnA$ z at c9o3k+5fSx`w}Bc%UF4{Qt+0_n%B`(fkPgOn{KwS6VbO?_h*UF+dnNQ5+A^w>BZ1 zs(BiDBx<~v0B}dD;DBsUou~W6>Y3Q%O9Vrpaxj&MT$snFGe;K#J?eZ_4P*2)J!3V3 z(KRb3&LzO%!AkqIk|IiT`a7YFrfnPdn`khxk&$mT>^0nk%88z-vrpM5Qipm;+miuODO(R at bd5WCzlET+>E$48cDRj z_`d)E0pa~W-HiVvtknB=&S)FnlifCjFUR%jODfW^A-2;c6aCe&ez8$ zmJm$tgp{Fte at 7Hn1qw%7cYmflHe-H9$!R4^jgf5s2#cxOYoH?8BAITgV-P4{JjKdd zVM)n{zj}nI`q{0pnj28wVs44Qw1m~roU%mkPFHDSDSqZopBQCiN#EMGbor#$Y-PEk z-Z>dpbB?d-_KrZm5!P0v(pk8z9tpH|kI0FW$*oL{6jv_ zTs1TA;Z``B$UzKhG`(1rVtr8-Gp#3v7oM{2f}KJs5$&O#Nl8_eV8k)mVnfKJK~cyv zI;oOYu7ahE;CA<*107Rts(Vmmv(letH6Ci5GUnhE|%~n`nDvKN@ zKt%A&vUc at sOaYGMIE}`*vON=t0f#Q?Jh(l$j`+|jz)&1VGc_le3<~#{vuoJCwOX$d zOVW?kzk at rcAWm>snHTkycUH`;yhvj+V?UQ+jGX5Wr at E5xCgkILT~l^R%4`#iTp8 at j zhwse~asdz}cAQL*IO&gb&YIjB at 2hZd!0&b>rD}BiN{j8zJ_ynYNx%3kG#oLsfD??a z#4d4mz(~{ps#&h>V0~$)KrTn8-iXVPuW>b+Md7l@$ zB4k#I0{R#)ntreAXE%Mnw99Hg!Ti81; z3>C%44%o`@G$1x(psCUsFM{}S!jIwPzwMDJKgs-jrfH+=R~`%_RL~7G7z)k#13l8c zAG3$Wcyo&Oi1P4t_zzaPxWV at zwZEua4EC?mnEyA7 at l(-L>}NvjhBO5$ctI!hB_)n8 zV-rZP3lWoIBYQ#C@@155Omd}P<9TR(-9@~S#Ad{$`F=1kec63^%3ZqlK5~u=qT81b z?t^f_>nN0m;moQQZbY*Sp-ovxoykg*4tpxpK<2bToA^GK1T{>qgdM5GoH#sc^^9t%1FR3<}LM!lkLv1 z?+!e!nZ#&V&?0f&eNNaZq!!10-pir){ZJ?Q1Ep|M}NxjUB#eXRDXn?+bi zD3tNE#C+!W$y?tKs?mPCwD0r9NKT>Vw>pNbe%F*cG2dCZmCB6kRxrqTIZP1!fqX`D zjCj0c%*4yrx3rK$2I#d8uQ^P&-CU>V?+p*OEQD*I;G4Wx${-2uZ=7oe7+(k)ZgXqP zw>hYI-RK`oQO7uXd}@mjHPta%qt?u7Y$-2^6r8mcpAeWM`elcstn~e(T&@U*WAF+M z0wPZU0z&uS?v9$Xnc06W!&QHe{DHQF{z(y=U6(Eth$JTzB|~gW1Zo$Mkc0z%l98H# z1>3SZW-j&3-6CacO-Mwix>>ujta!E6uXTO7r65j8Im&OPXXo1E-Qi)y{hjNXcZdIZ)8+c8`K#L#rcdKTbBMD4g-ie)7+Bi>!X{9-->CbV6)_Ww%Jo#_CoWcw`6~fsVByvZkV(E0WWnLc*~~`eSkOJn6}rV zW#8Es)HAe%+3p%YBul6NyG2&lJ7fqiQnUSXL-!3K^19)LAo9A=Gh+zx`$ybR?DwwW z{Si9<{{2!K|B}3`GUg={$^>s2kBg+h;U3brqV0I6Nl(d|Zq;82#4elj*>dAbbrKbe z&0cM-E|}#EnTrS5q+#05ePLKixg07b1cb~gRtqgx5my>{n+luWwzQWgDXjgTOE;g? z- at 6%2xXt^+v=hzO at uG3JQp|WeM1vM!dESiO3rsd!Mh+yP&{12K@{iGY?D?<6s<9d! zJ?YkJF at n)`MP=wyjH0kj=u4K2$yl7W@}1YGi;NcuBZ>jmN=Q~)RLm%i2Tr8FT>+(l zLP1nYpm)M-rS}ChPGi+fQ&fPQ at uC#`xvA!_y_)T8UcH$?Hygfl?B8rE6(%cz^d588 zo}c(u$+Z<-Zpf-S+ZH31TdvytB**fV%)L%D>6cuh_wbX}jt|hn^JWu`?CcU&3SnwYK^uEk-7>E>em!?1e%cz`GM+5O3oa> z3pDaB;sIid>iB0 at ubwWRTHfob?>Yq&g2ca-Z@|K1$Q#%ZVKB?I6`$_~5~m6b#Kzpc z5Wx?XN4*EL2~1W96w_n&%*h~EyeCZ8^%HO=xyGVc591_J``h!IsNPGnbybBuXTsCs z(JbO4a%nBiFWndH8J8){-lEL7tLP7rn(wHqa!L(`7}3~{Heer6e>lOGL~3%Jd33u5+u7pgdEIvK;|(urejHmd)E#m3lDRFUY zg2W{U$Y at pK9Wzbjrf#6J#F#yB$y*i!u882tkEvIgzFfiIDvY?P6ZO;%RuA14a7s^2 z>EY~JlV{>!`1$wr at o027C8!1GWAft9kNLlbS`^`)mg?K`O9w4u-zo*~>K97kp5pEoAD*(khy`}$tX5`nwhZ8jPW={mt zm92HCvO|pQAF#d4j!;)>x47`VL)TPlrqqdUmI1iVeqhpy&Lh`aAHoCjo`t|mI)Y)S z$fPk&9E821z)CV7u>oEux%s6TzOS-9#TO9VHXTvG4|7_N%9luB at 4f@gXU!hrrXR%D z;tiwuox_J at P&8TL8IFpS4Oaj)`~n at q-cO*%-WJYwkPrK2Xd=$`u-*00ADrz_D7G#_ zL~GA5VZvcj90Id$RXTzLqu54IFv59997L+N@~E3ph2#WF*IC6SSZ%P>inbgD#MNni zUXy4 at wHih{dnR`CHe7x5S}K13_U1_RxcDALfOSQalINQ_V^oO?s#~1V zK}g>*y0l!4Oqop^E+;w%`qAgjRoyq=LS&O+qio-HK~HZPRVrdTD*mth3k7FC9ZH3R zO_E1Cs(8JtNqZVE{dtC4iUvkUuwx6Gogm`z_I(1C+@?h1#^bPU6@ zUFE6z!Opv2G$#%i$ur at aPXr0XZ(ttYH$FqFI^Ff5R<@9SxL&r0U=_cWwtoBbMU8_D z^S4F2Z6O<@Ad#o~v(-9e?z9f%u3z at M*IIO9E`hme#dw%vzYIAN-;s-5v+L+-;GxX?z zlEg`#Vh&(MTO5)tc}8b$m^-TLn0})*uS at 8Seu$psFi4JUmALtu;#Wkz2P4iMfX$Lb zH3!4(S&Qv7$4cT#0*N$_9pd^^QD#=aWRVWx6x`Avdm+tu?ut at hNlKPMwbP~*%4s1i zTD{tXN8S`5e!XZw6q6A3CvRN6nB%`Jk zt4tJ<7yMW_$Np0)gSGbIjpHSkL%d$gC(6eldDZ4@>TNG;>?GUHd(`B5U`LM_({lprx)eHmhw?Q(HCD(&T7la%W`;XeYnzXFGTK)( zry{?80gtbGHfRXvFoBfmL>v3=@;}rC$mT+xq+0mJIB$M&#YbP=l=qI&#|~1fX{;wy zWx}wT{?VIcJ}Z!pd%c3_G796B7}!T2_gYt1ut*86t0)%I>*t6O)r1?8_JhD_UtG*P zEliKmdugg~-6mjk3$t@)r^IBeY>kw^f}1JF;w`}&52vMY&{AQE>V2|Zslx4aU*Kc0 zifXmhY1?EEkw-Kw4^r_*n9U{Z+$h-2!#BfVBV#Vx5Nu1I{dLqR};Sk1_ES~ zJ0C5U!ckK9a*o){`%XAKT1XK`d5Sw&IvTaf`9M#XBcgm$Ts$6VU`EpyqF&^I>+x}o zGdy;FPn%mfk8DjMB9B6&??rX1HKOY239|b{^)^%1ny|LrJ-TdXM zpV6!|B-vq{ysVaIe2T{0eA##26Qv6hWm-gnO}+VSCUp(!6~TCdmm70~itNwQuZSWL z$HDs%_06=#Zd*#*#-gMnoio?|Gj~p$hjsMLCgvN9;dhA7e>7x)#$m_nLx6xV!2YY; zSi#NK)BYiKfdm8e_CC*781(#(@|Q|JXe4|e%3wO5g9>7eiK3LIqJp_M z0>d?~f>uqgr#6ul>2G*u*Wt858Po%l(0R(;i?t zo9NK<(8j{zfqR;oqwVX&6rp+Rl5v at mDG#}ti zXOU%ZV#E^`Jy8?cT(*JYi(&ygl6TqdZF4gzG~#*7Zz*1J!*~&EUJ{*}yYO0Q!duFZ zD7wywe039s=h)JQBn?iqyG#pYUDG+0vw(Lm{hp3I+7# zz at Zl8g^(kvVZLz*rv9RJl at fd!8J>ndhYDr=r|-PmQkyB&u`1%gPXoN_fUT}|f;MyL zOpYtRJw^s2dv|N8T4d-?#e;)ie6cv*dRMp=kGtQR`Pp2&`BkTZUmLz?^gbs0#_wy7x!(80Lx>+J zWV+%Ieu2Kzp;U4Z)PMu_uIb0R&K?Oxr9$QDon6~hlVB5;ca%BXD~mz at Lz;;5rc|Oq zeDSE9txfC$>(TpR_)S;Bt0F?XkI6ML#}rtW_91NEz%-I8ml!ZVveX{|o=xfRsJBwA zinuoBKSbzK1%rK%zfy*Ld$SiNaZn1Ui$4m at K6ryExYR7N5D=^>5v%}!d= zfhQI9Ld(ou2jg!Q2Yj_q0jW|dQk1d*mcAmE{BtDL1?2BOJvJ?KN>@^B(tL~pmP1hT ze_)SJWgom(Q{NbK^R6K@*S+-ZVB%mQrCvb`1QuM#q at u19$&mF)lu
R0-}rn0>bp)|H*T(b98XCH~p_zRjjF{iKdD4nW2TBK~9AeEOu*{28pG_hAg4m z2N at Ixy`RvWZWYSGzqPthXw1==!FRMK7}s?Zmz9_|?BYCWlXIUSn0VN^B at fO@FWWD) z)8S_GT4AsLcr&uo`}xffWQSrFNDHGo)QoT0?#QfHz~ixZ(&uLg76Qjwb3R=%mxfUdL9 zSlDx{dp$XM11*S>F;P)W{Z?h2%)ZdZCqNP%pyoC#IMm9 zt)vPph$#X<*jA7d at DC)ItmZRcysXHZm`!e zZg%+L|IZm-9n&TwoFwBC!d-Sze(Z12cO&vyTo z=sr_sIEDI$9{8p90y$y8)!w#A&Gmxhzla3g+7|o zd61G<-Og}yhXYN_{Auc%j~7H=7`VZ*K1Y0jaK+NBlQp7ON}HiDTE&o?Faj^yEU^Y^ z)=X!D{A}tQ7HjGorD*CK at y_f^ap2-hd?4#PGzhg+9c6S#R at CZ0z%sqp6$PVv=vv+* zMW`E at yVq5kn{>-g5H`X|cb^m`Eho)Y_xh)XsJ26=v}x6TOGl1aXRM3Z$l8X#JsQ)N z&4GbVVeTP(SF00WRVLq2X63cu^GAuscnF0k8}*)?QsozvO+2 at -%qUqas)p{pImS*F z?Un)mgtm1%o%?jW^kdECW^;<#sFjZi4c1`{E{KV*?VnCP2`$s2N!YsoS5nZNJ} zrL)KhhVQW}VSm${&?TA2yB>T|oO_QfJ4q0MHAV%=cyzegJZ zL9z}0$~VjzlVI>&SLA8oQ8gq-_fA-WtZx*%O!$x0yc2I0LH^D$TrDx)HH4n!mL9r- z;)m;`VyqKkk94FxQTU)jDi8_gK%eEq;w`B8>6uD}!As9-8pcZjGGe#MRPCt=B(JPs zf;Pc&^dp|MPwad%G76vEJpF!A*Z4ScKG6ZCHu|hnufSoX7zu4sL}a^Yx<5BF2KnTK zkNP7LDUWkAe?XY=_wD0mNEIMR`K~4KMx at 25no%jKP$?**6S5q?MltKcW&|Ug5*wC*ak-9*yUI4-%Sgnxf;lL`pM({aK7cD_l>s0(0oxp zTCsy443-nky1%G$FbMlxG;7@@_r#Y?s at -Q#?*CUX++$S>Xq5=vz$k zv*Ce4lhLLWdqkA{=Hhv*TFP+eU1_*XDL*b-Z=t7=Q+4QQFW3?wi89d{5}m3`fyD)r zQFTYTQ|@?@^Qk$Ko3i#&iD^dO%;fgLi$Gz0EUoF&Ws)V at X4VcRv&^2{yZU4;u!}l7 z?EtQowz*T9O0W)m2W>t*_%MYUsN4Giceh{GOEu at 6Jy|Z)E8k!j at 8-K=sg<#Dge|yQ zWq_+-LMyNG#tVsRUlxhjkz&*I$UneLHRB^@eO|NOZlu*x*$%Yh{!{g1+{)j=zSJgT z`|WT(S*9(opkIH+`IDlrbzX>=lI*;&WnKU?nU8 z8FQ>2q#Hx8a^1+0DCCawtCVoi#5J1l%+Udve_tY*|6wYS5{#CZ0X|?deF^NUwhKD%lysN09nwLd%F>*IIsufvTek#z#chYhj0k^3MH$SSCBRND9(8V_?>*>

%-L_rHmHp8C&b)Xg~TS4`0p>w zzi;bxd4-QC3B1%>#(3X0Kn`xh?@@2DlznM*a`#+lOzzaC$Fd;pgg>LZzx`M6xG5ft znFRv at F@**Jk^KJz9 at 6$kCazZQX8&0KkC-vZPH{o$FQl~k1Tu?3A)u*=4cb#dJ|>fj zv9Pc<uUW%&?U6-GjOj#h&Rt&tRsS#Ts_M=05)7{aV<5 zn%Obv1+Ch3!jRr1lmJ6y`93aWBGoA|!pZ+lqi~9*wY_yXPR(Wr|E-+s{oBCz?2X|R zhf8dG(H&Omgj!ztt<5<-h9_aB(`K(wqXzSH`B*}1^bww-h!_*ib)HsiXZ8(_&4_Xj zo^R+HXYwQS+A#|(@X;wLCJV7vIP!|Pv(u7H6M*y*fby57^&cU at d3M!S9Z(@G+FSy9 z{VrZN>5O5U4ylj at EdX_D>$)1#^L#76JvMLG0QG$!EZqR>rrU-)-_}8le2}8-IIlcn z(0YnP257~S;P8DnIEz|L#0vqZj|AUHG`HF(Sqkw6z-g~5$WCm371Z;`DlbI1MB!$p zqf)C(JNr0-!+lD%PfwfGdu22wrCn9InoKS$)2+nPqBebvu?uTXpdGAwGmfe{dPQ_} zS_ORm`c`!LdNFPh#;Np-J#WtjTZQgsV|c(gxzm!%=&lh0brJUR*SoM8m3~_MFVb&J zbd}8dNVI0R{n}B)eJtHjiAdQDk<3=?a$nd0WwELp;e0{EqCx+_gmUKfK*WLeBR*W&VtVx7`8nS^N} zHLdt7l*)*@F#};Jq^WT5<{7X#q#oEkNpX`p)=c0_`oF0JS6YkeZwG(Y=X9^_7D&uoi%;hw;Fjh~tzQagpQ){HNUiHiWr~W-UuB(Nijvt0 z6iq>GU*()%nvmHM7tup(UuB)c5 at X7Q$_5wkoN%&}1wPabJ>h6u=~;z?A=+T8!)e)Katm23v5RMt*Kjr}6{}UV47NPWglJpEo*lwZIC5h3J9jADi@!@*V3lE|^laD at oK0N2~_h9V++9^ZHLASArce~Sc+AW}!4&{v=IWsAVZ?C~* z)HkEEnYgf84*wFai?WpUSTCWq*GvZmV7EVmEv(`7CgwK+wyK4!00|XV9S3q2tm(KW zdoA^&(VqIO-B3am>z64d4%i>&v93#5$H%hA7wn>IJeN%af_l5H!RH5gM6`u!M&%!W=*Lc2>eC{#*M;#JB~#FL0hRY1S0KOHIgd34!lUiT*ngY zTox3EadF_#P8o|(q^8tl<HB-r{0sN7|2L@)EBpVDxC at D$lL2Q&5_ec%w_CBM zefez at e;M at 6pc-0R0~t2(9I=SFs(ekXrSWm+-$z%SG(sY1v7lY99VtBSo<8qjcOiU` zfyfeI;C~DsOwQzt_+aoT?u)f)Pm^YjE{(0&BgZmveIRu1;!o+f6F|Mv19J+dkje|H#-zf}>hdb!oDl;i~j zs5l&u|lRKhIr)Xj3>7)|KWlru%-EW=TX9`1?HhGMRX8jZ8uwcj}cGTz#!{Z733ccO5Wyd$?AV?$NkrKZ2$5Y`Cr>BS$RwWOc=>8gbrC5 z868y7+c`WchnehKs$m!u=GD|{00--qX$jN^y&?s{2Z-SKcYdU9$9lvi_1em_?z6YI z&ld|DF!!oWJ-;4+X*W;ba>+Ip;QAmWg!4g~>*eh9c|9 z7u8$T1Q_tJ3LpKO7P`oxI|gPX96beHzx&PkA`64~IFjr)!UkM2QUoGJxUW|=p1hxO zVhJtT#Wv-7g_8TD*ib|yV-rWCnudFWQ2LAPjeW`Tb>>un7&FUK(3qojH z3(FF+XpE5P=txRFpd{N$+7alO4499wl>#ql<5f8Fi8XNrpW(UrjBPi+5N`@~bEJW@ zvr0w#6O)IN+&;OD7So3-*Mx$gleaD#!sB0G2 z)XA;APMban`t5~>(@W0-MsC8ivrqiU&3LFxr(?sJ%KOQ2&W?KUeA8^yoaXvbUXRtS zvZnjHkD_u&m4kIVusxE9MBrvdM&C#>9V%PB0G}Zn#0{Z zQdn!S)%1YhC_wEzB=((u=quxQNH3YySG&Fec8^Vzj4}ObUAw-?b at g0WwCSqIq*qY8 zM+UJ=DNV|d?93$_lZQ!)i7>{BV8Xm-Nrw`t`GenqF at KHBxE@U*eX@=)5F+Q(cZI-> zc-^R;m0;P}J-Q2n^zNz(U=zJ7nF4HRoJUzVFHfn9E$-uRSPl`1_4jE8 z1taIKVNN7P(1Z>CJgAqX&-v0l<6q#??{mqU%(I$10wtC_`n0kNx$zqSAmPDrL3Eg- z7z5(k at hrilyE_Tw5-tYzaP=P?`^>&uqAW-8fH(UDu_}fG*vnE;AMjt>jzV04${Fa& z!|K{hPGkvxmI$82DBmXoF8u3xF9eQX^c6ZlO);|M17jnZVqKhZNA~fHp84jLcNmG( z$;-d%jllQIhIV}etKI9P71j5b(Q24OPtu|rGm#IcYl%0-=bmiNwyQX>Rn2#%R7@@J zr}i at 29)(TT^>>CF*WbNu*-y&jf?R0eg49;ZqM;|ij*r?aAuAs(l>L3D!$mN)m#fXP zD^b@(Mke-FNxr#~D2B5u;!M z>hV0fOV#g?^oJ9yMu(d=)snYlM2x0@{tbs;?M+Zxsfr zujFVhXC&hU5Nsf|Si0mI!oK!%{sg*U8#J#YJiikRB_rZ;3RS|5Jktp$bBWJgzff?# z_n66EN5qr at OcY0rB7c2%$J=AK-9DGT9#XzO>pOx28U*IsP z?k!xTDI7d}FI`Q*#B?d9?>FVjrDV?tcDHyx#shZCYo&}v?AxB3V zhRd^~2`eZ20X&6pX)c;?qmFFs9S|5>=^VZY#Fu9(YIJ<}Zm;)l zE{PcRYms5tvDUXrpck{16V*p0oWH+6foUiQzNk8QzVaJa>B=cL6W}P<~>g^L)AcEIS{*;rzh at d+jOX+8;E;DaRxRHew(Aku*hOz=GlHv`4#@I%Y;yP1ZOqdo{ z=6Qzy0n$;=qoQ;+1*fYCz^vH_w>{F z%P-iEZu;{+;9`%M5{RIMcT|+3x^#i!s||$Ag5#Z?XP(~xJw2LbBw#H|ckrD>^1BxO{w&%EK?4Ty3rPBLw#(9*+qlJ;a;%+>hGn8S1rMiARu5U|NDGu{}WkB zwZ at hvt~yfg6a!3f$h?e+jgAiNx)5xAarJ6Z6Our%3Qa(Xc3nd-JKferNhZA1(wnkR z45GlxA@?UJfr0NVCg000;V$8kletGDnUBZR{w=Y~b$0ga)N%G^@8{=%B1jt;ijaUu}bC_CqnwYhid)NiaYw##RyoHzm`JEP?KHh};E5u_C!EYyNQ_x=k+k`gP;~q<&eXE8xR!dVSz^#ZSqJ^4 z)M-X}nU$%T at lBv}7#LodO9lllw|a$!ncRGmCfCOJ1;`%TI>ou2xOxhp3O8bT97o)C zpdvv-W at l$r;!&=!*heLVq-E%O+(%7D0(2r)f{QD2aH!DE%P^FogG%EAhJtL7K(Glo zzD>5a4e;?Q!ZKW6T68uo%$5KEq95Gj|SU8Gkx7bp2jjvsteetCVj=Q=^vnnvH z;XQ51v=fYYqA1IRN}#_+pNi#J=$Y^%wm0fH>Xyytq;{n|de~V?QSek7EiNNYeZ;59 z5;o(PC4OtlH7OXl%Ency;xr>Jc;NP0TVx2_AC-g9dCPlsyW>_vy-%sqbc&VP?) zJZCSYnxR at 0=+5yH6v=UPq%c^JE2f*V;+0Vs{tPZTEfItHg$8)RNCA-ILxq>+po~6g zlJ-T8;N7)F{IEy*o6YfM8DtYCiJLEbU;&~Auf|Ta7yKF5-qRD`YSEZtk56R|<0sr~ z==l(Zg5XagCHS~|iaQcV7?1A=o5&wg;Dm(hp`)NTcpqo=%=3n%)2m?{9C#N-htX{{ zGn^)HczADwl2$*JPk!3u-*8*wjU21%N_QqYszS|T7-bPO3Zb^7fy;E#I->U)*uE`a z`{TMLy25*`1SO!ECAywNOLqkDUHJXDz>4Jeg1GRA3)LK_?!(!?A+sVsy8~^yzlntM zTNddxoM=x+A+|A#a8GKK3KE~AhuPK{nNKJs!$%&T6`4p_y~$?yxD&FD!r3Bk^ir^+UA1At#i`V>e!M^BMBz9Q0rpPTh+fVac7TxB_>Qg{tbfSZ4 zb6-;i5DK;S1rzJkiMHh7N~He1P`_PLxpkR6DD~_l=eit8>b-g;wGMPg8r=T)<#b7^ z_$Nj at O}a7qJn<(EL;s(?{5t6Cc2Of3kJsIbr#kheuh0qxsOj#5i%nLYZ7>co-j$YL z=$rh|89tP&YfT=(YidH<19|Pwu#ta0pjWR+5p%&mFLx$dz9Qo;V{74l{7`K8^!I`I zAt<(O;_+F<9U at -@^bfSJ?0AoRK{oE6A-d7u>9r|y>aTVJa}d6#l4(<}>P$~}F0iB| zeZQ%|e18XGt*2wH+YRPW`zlFIzC$2)Q=cN<3;ddJpfm%ISndcn8SH5#JkajnF*}c% zVfQ5}F2Mi#M_(R7P~f+vzX9C)-z9|OtzfJ(&3_TL8AlpJiWOsvdY z{%Bc-iBv3jzsl7Tsc>uSPg*UHgkBbnlE7k0Pg#1Io|LOPPZ znkys{So;AC%mWDI`HAjJ-l!rS>$jdZ$V8XVCLL}k9#9 at 1aUXB~1^3rKh#;J^SR)Vu zi+Km6 at R4oh`zhZb2^Dua1h7X?#&J^WNs82?^E}ix)$2=)vyIN`kEYgycVd_EC=X-M zoq!<~_^$Gl(0H+#WbWX(95V;*rZvwBac01JvlWj*b)fM+;SnxChTJl-(01w3t9r-o zw$8qpZ(dFveB%yB<0Rr*QilAjjsF|d$wtr2K!nAkcNUwh#d}p)*K#$1L#8Hb4M$F!`D z=5yJNeJbZ>j;!#dcK*^4GUAG_U|7{Cysvdm|yWJluO zd+Ij+m`ty$K!P!_BorHmq=Y1#*@_F#rSvguG8+2r^%O@&1S4 z1V8?J+4&0|q8lC2jN^M3C5-5mc!woY;{A~0xo-_N#UI1iR$w%HLhisTZqZ-c>8|j5xqYDgTY<$j+a98`CD)N^KKHcJ8S}i?=ey+Q`Nj^SIUzii+A at LK~WM_A$cf0iF zw!2vTU!=WblrCGdCR(*>)hgRwW!tv-mTlX{D%-Yg+qP}ncJF=8`Odv}_Z|I>?jB=~ z9GNroNB)R85bA7$33e~ev>A?x{ zB(Z@?lj(GkM3WZ7BeIi;RXA=@DcYu at kDHxgb%1WR9>x_t#BCezSyl`@dQGueUQ>nM zY3rCJzspdg-{{`xn($=C47Pvg`_Lawg9KteKlh?(%8&9>+%uBd<0c zM&|O8=#?S>(}Vpn52O~ks|ZB&QV6$bFRZ!nva|J5755!G%xRTDL;$JL>f#`V}x$arA7DSyvg7FE)fp~o4Z=*8Wd_)fO6(IwWbb8eA)<~ap{ z`xHPOQ}bR-bp9i4{BZ#0^|$qv#V{GD*~A%=$ZAfG2$N{~qShw+f0bbXB&^1 at XR9pk z$)(X1TEom3P^e6>jTgk7{SE4d5Lo25bvY_>@e=Cv05NK_`8p_JEqt#uyI)Y#&2MpL znLO7VOg2f%?yBj at F`A$CyJ4cHinJzeH7aH4CYAd{+sS-zKIMRprl;|CnI}4(>xXOH8COi zFgtsCZ`oyF;VO*zp^^<@PnKS@?=9}?=+sY7HI2QB{eeW!L?tsAEfO~+w_vt-6`|p0 zsvf?y$}VghuXWJE)|3R5RvgM(JIeaV8^hyMzV8=MuIdMzSZ%QBOQKf6Eo37u;CIMSO;36;FVm%OebEe;=9>O( z@;(-kXRc3F{Y7lPr88rbr$c7?5tye{D5Ts9gmd20vN9ktFcl6AH}}<(?FLH#Zf1_K zK5NXK9~N)~&x(lggnD2Tq3A({3mb4~dxO8`{zJ*~GQ6Q_?k8XDnpuNj@$*n2_4D;B>w4Ks`Cm z;HckEJzkbN-f$+4hn)SiUjt{gO_d7+Hpr+iq5Ox12CQXLUtJ9>i&Yvsc=w{=QRp%^P$MYkGw6A}ZG~}T7 zI^%%?0b#=aUwJ~te?jL>1uP}x at 6DP~5^4k5Bn`1(feKDx3ZCYiKT?-L&pJioqam< zkEXqeWJPq7PK+N;B107s%SIFQ4O>eSQF(fY(q2N0%#_8`YelgddSXQm&is?>EYhV! zsFr_w!DCIQf)iymI69_#KK6FQ*8bOy{9|Snlano8k- at kRLH{757C~qg3pORvr}P}s z{@;;n;fjiaYc&t2^7!SPQ0hxW(hh4=X2v28&|h7Z2^&WFBS625=Kk`J3kzYwnM|MW z$JmGH5vIakb}ofM+81on;|cXyaeDPb9L1$8cGSmfGL=g9K0~{B70Y{7+v}%{u1!kc!*(BZqW(OI4h=>ywQ<=W}pUP{{0&cV6!cmoFq9Bo;%6Nsak-h3yy{S96^ z^=|&#rSk5Up1DU_Jyu}mpc$yij$YQQbZ92n-b?gS3nfZFpMo`Pt?%Z3Cazs3b8-;c zN6Fl{1$sR!xDPM;-5`1`GS7=jK>dh}{DA&(B0dc71-~@wgSE%>4lRC+0G}2lbj_hk z&>F?JC%UjnssuD_3LT4o1DaI`K(GhN>WA9d=5v&bWen8Ij?+qTe3sWR4Urt(8UU%0 z7PGK3g9=tSeBQz21}O~&2eoAxIcz!T91;CJ>?b1i^}_f-;vQex^1w}i6=I#!#oO2E zu`kcn*9d8bw+_f8sGn&YzM4j2lz at KC)+?_#|{S}&0-M3F~%|3QwJF_`dDwE zP{t8r<0?1Z7)0Ozg*)_7Tr6)M#Za=TcO>&Dz3s&@es0YeJ1Ee=<3j^<1N+if%? z5d4(}&Mmq;=&L5!gDYcgTyZ2seEn%l(R`REb>oQqV%0-pY>7;dR;636w_Cn8x at 6xw zKkFlN?G;YoR<_Ro3hfqcvm at FL#0M$vdq?ntvL#J0k4&?}{%C=E`*IbDX z8D3t%c2VTQA&AJG5rVT zPx`Cjq|m;Z2_30hu8ETei0p`=niTy#^3Y!5f+4jlZL9|S!OKtjhpH9Lm0b|WDS_;h8L+HN(V-Ev49w7vIRxoJ+ zR7q}tT34!twc4z!fRT@~%uzQs!F3_%{K#`&c8>C1&vf+L3~UX;oGqM6GURgkq7 at fA zw??NHsdWT6&RmO2V-2G=39Bi4EP7`CD{0O<`mV+_9>u6c at Y3*DsofYkeXGN)^{~(C z3y^Bcwygw at oVKDzk;{!m4$?J#j=3lRdHF}6vCF7pxkHU^a*`gGq;utf!k#K4vw2kj zd{Ch(X66a+bE^F={Hmwq&qBg9fZ;?i{?888+g)Ys<-}*jxA~LcwI7p&dcI%ku5i$9c~jYaVdc$OWDP3=-)8 zqDEk at -D+JO>|_MYcAP_K5wiy+99tY#v8O!}erNVx25zIKNxZM1s!fHKC-A|~R3;iQ zVFF$`^M{#5{8#!Y4I)xZrg$P7&JULmgR^RE-1Pi+hGEIQ5pCan8oLe7xOXKlSt-1b$M}90^~mzt)#_KKE2M29f2+F<7Qv=^Xie80Pf&z1 zC9VrasD$M4-5;MQuI6>c6h8mZ-<`)-cz6D5DS=`AJI=a-ne|_ at jyBf+zirJ`UVV_3 z5x%ReN1<3CYZZRb!$a0ZAp8;(qx(B%K8SAKE|U?Hkl3*THCIJY$tLJtV6|5Ce3^9` zJLBI}0BR6NLfo1D)O~vW>3DQ$t|o5bap=iI_rB%2<#{~$`mpuAqOS?}g)it(WO?>0z>94XK zv8Q1rwzn?TH6L`XUj?(>|D6BAkIZXWizj@$|8t4{j-zAjfRz3tp_?~+_xQsr5~XwM zfFfRp?v*%RhyIm0-a^V7Y0xJBCG%%%-YFxf(*&E3Vka3syS)f|u_0s_Pds}TXa3RT zC*t1zT0~XKVjTrO8@)(|^SR;@nPPYw8+yhFV)x{pEJa{hOeT at Gq1-&PgIHgGsqvvV z8+SaSfSN%XQ&Y5Q8;3ge(ZXFo9A$}RO{@xJyoB0*=OlD$y}EGURcr at fVgmhFYC^8j z?98bGS)d(|v|-*E+{(^9_{)#C49^)op=u{P#$ zlqxX^u;(Tu=9!lr3bt9Ngq31cTzT6)35eLGq|Tb>>Y`nqVOlT2?sjV96IC>&{dVGl zC^v6cA5PO7zP>kURVlx?bx~v*Dp7XpP-SR!D_UvLO_g5j_sU5$T^U7cUQ- at VWi&42 z$wW1qmmrB?Hu5V^5kR?&qo`t$Ium{`AbWaO$ZkYOHk at l{US#xdk|a30S1RNyp?6TG zuMEQ6D-4hxX9nlMWwJLRdU&%SK6OmPPrhto?p>*nPi+iRpI{oAWS9hpuu!pAAOLKi*ygkEKrnP>Y0^`?)F$S zH1GIHK5^8F}IU`fb4Z zW_V#(7d{HJkw8CvfEo{c5vtEWWYvK&sKM|R(rm;PTAb$^%<7|mhk&6l(Mq_lB{hOR z91w72G$$}*HZj8HcMteb8`8O1Ci^1UziuJd3(x+UFf)q|iDC31D4=2>z^%RrId85u z#CuCiat+vk(>z-2Hgh@*i-0`2f#@1#idQpb5TU0c96kV#&qt57gCta(qvrJ_D)=}G zG5sB%#WO;V!t9V&ArFbZ&yg=v1B*#pX^#DVwdG_8&YU>5VLBJ5&veiz% zwkBw>&v1+1u52cgj9BY#T_~&99o<^_wZ=QR&i2W(#i?v_3qle!UNYT#_P%-7Ltv(7 zMlc*a2%ZD9 at F)nGEpiPt$Tap)P<@`%&yt-$n%>I9>-gw58k}`YmqD5-Pf_~D)L5g~ z)SA3rC_46 at BtA)ec-dRi!sS%M^eF)9_n;7`j!ATpqXmSqcI|liZq_~CxE=ZUP{<;B z-r3+D*@gdREw=5KaHYk!L*jROxrZh39BT6d1N;C#D-#fEoli(Ua?-2LV8D%07u{ke ziGVvq_($~;t)~OCK#8vcc7`G(m*dqx%5y08+U39{zQgDvIN(%m{h{75%cyOxvl$_m z-x~|SZ-B^r|Du(TBwz`Kk&O`KtUin_*nWeKOS+TW){W!%<-Bsch18IDWr}5+ at lfCT zTwoJ3Z5`8X{k!AOz>l>m&K(5&I!U1Mq!t)1#bI_bDZ>~zr0BM482Mb<^o7Y3L9m0`(>KD5RSEh8UnE3~oyTsMNO9xX~8?>s3 zpeh37j-@{iLOYfXGHg}njtp({Qzz{!nJiDDr{85jwIpVM{0BeVEAv3cDVM?+XC{K^ z7C%&%nEk38HCH<{ZAJT-BCc3JZ81_*{qw=;3f-eKmNY6U~jw19o(^v0{w8H!`Ieg0_7Y_r^<`+ at YQ3OkkR zhqBvx>V*~wE_YSdA)*EJ__*nm8OfD?6g at bV6zY~e=-Vld!#f?11M|+)WdvBQb1$?} z_Kb^8|AX4gW;?h}er?d|C5Z>l18tH_#H$>O1g~XMV;q!K?50}0_kjhZcN&&P*$Lj- zW{q at 8e%5%s9?-G$@Q^)3<$VVB2T;sPX1{%f44mBCQaT+|PhdP#=;LvkV;fWZ zuV17Y51hk6^L}YG&cdyZBFju0IOMlU(>U#tIO&OQHWasksgzlx9&;^NsgEoECyP6npF3nH z6%Cas+k{Z2x6w-WsI_SQvX!_Lh}UaCK}e^1=z_3kgjo zk-6qHYbJ8EZm*m!B-&pQ`FPCqtZM|lXXd8h;1qyuh(S6Yg;zEZ znGmLb6_-XPP7vi*vZ>54lif))>VziE&X8}!2J0pgq?l!A%cEg5oaCB84H%*0t!5?m84kiI-!VD!%^99kS90iC zsO(;cgzP=j3Kv6HrB(ZqD zZ!4*Zu8ugp94!u{0TS$GWH+p84+^qiL%<>AR+(=8lTn1HyDyW-!J=f$m7+c9GKGC~ z#bD+q&QLJpf_K#IG|kOZh|b{Sx3M=5^L?bG$yRonn-xPneb(z>!UTzRQn5yh));4t zhWhnvm)JPIP5npi(?5#JfhJ?8Hh%#D#UTDWZJPhtX8sHLDqpG~D`9&Zqd6xTAq(}O zl}M4J$th1ZBs8D^(AP;7X5Q;z-M at KLMHE z&r at _%^&nuDyb~Lp&pgxDm#y8L-yiSq3P2jS4nHjD5_{OCRB}*{ky`#d8)`=EfBqc1 z1^)iV*J&LP#Z%fd&`h!`M1-Unwo9z`jLR7={HcrM at l%n8}<_3HNuH%}6e*O^G`lO|u;{zIyfoh8>qGSEsC_CY at mm z>b*b^n`r-Vn;%TtT^6wTPq0nM*IQ!*e}WOWW} zy4n(KNX+E^T#ZFK_4R!S2}sN at Y$sA&pO{nh3Q=n^#uR0ICl=E}Oma#Ix-1D|EI0#I zhP@`mU#h}Ls}~huTIC|jt?0)lEiP|k_J2gZGng2&KPFmmOlQwiqTa1wRXdV0XX&)O z{DB0G0a0fhUJ>>^JW^-;T%OeLHMhb(WF`8L?SE z9nK=Y8vq9Dr!z<4TYTx3UzJ05tG-jBBDaB96O at 7G5h4pIV`^X-JXahFDK%rZU1o8E zNB)Dn>Jeq$V9`m1T$~2lg78d!XZSXEw2?3^$1S2Wm3oq|@%*Dyk6XrCswQ1NR0}}n zaxiZW*PA8iReejUS?s(mfH_MZDypcMLsLXP!xXb_oypQWLVy*4%Q3ez5X&68_$WM& zxV9ctsabejfqd*NZ!?QPzsNQn(?NHV89rO_QoOl+2*+WjmdQXsz^d*gr>&mLGQ4yj zWP;_99ChO$`$!%C8!)E&^fM1rPTkzKFa0B z(bs?VtKzWK>=hw0+EBcKai&lWMlvQ at XH(e$lwpJA8H* zZ at ELDdPKTz<5VW|Fm=}zjgOrdIMvOX?k%kpCB=IlmFUNSe*^+m|FVU|G6eDxSWRFT z!*Yz~SWVh;xJbF17rFoRJewbyY0`thexqtM4AVBzkq&`kz<8K(ni+|(jRe=22ChIG zWmCfpBMAxTjD+mq<{#-kXmM;ST-SK8D52}0F<{{_2zcUYPz2+CBmMYdUxV6yRJE&U z<_=iew=tY2I1s|HkcOS at XX_EVoZ2W$VjmCD4h?QgD8h?yhM!Zvp_fYql(>!q6 zxp+OJJVJi4M+Mv3URY0mf#>y&k1Z8<3s^@=_*Z5SP>?10v%)7zFb6?Kpn)o#f+>YM z%Y!mYZbN6U?w=deMs5kMIXuRgRJGy1fgAP9%JIk}d4RvlZeIqd@(N#N)6}V4u9pw- z#38`B@^Wj;Qz+dMQjM$lJ zDzXtMM;q0C6LBE1z`hY$@qUpG# z3o{7kDXh30`tVD6uSkbE(0IESVpk;dS_EecWiG|8f3t9|>W}J>M7ypyZ9B?Zti2B4i=uAv!HDWtv+d8Ln2+5-2k9w)ccI5kWpoE%O7D+)w=3r~Dj zjghJ5ijZ3XY?ox~c)WZ?;V!Up0Am|U^lJotGTmSb20EJbO_iyGL=)aTB_)kL5fAnek%US++ zjaZ_hJ4Yz}llkxw$_k z-mv|8B=k_?^lgK{nE(`F`#7pDh(XS?quLeTKVZ=~9N$K^_zPk-OAdH8>J{$~{{bcK zL0KAEv-zjNd#2TElWk>lzQJ4w at GEpl7Z+kLl{`C zTa_m@)h$vci27b%AIf2}V>|M_erK?gOcQ==1h%yi4MNmSzM&f3BF)B*EWc;hLtC at z z(Sdp^G(RWz3}QGrmvjSIMby3`S8s>C38sRNwFX2I#7Lh8>yPhwOYcleUkQD}luCf! zeq0>gLXtCoIy^~SRYXAE`FTTl?44&hC8+{uO(L|qkCU-A*R^$7+D`m?OB;;}cebo) zNom_rANfj0hviD)A?-|)`Gdj8oTyW=Ml4%688yS*Bdu7V+yu#uHWh at Rs$^cg{kUgFS1^ zZOOQSC-=@~bi>|8 at 6OCgl;RN1N(awoC? znv;Ka5vEhOE2sL)8Y%v_t&!nh)~IEJ$dAko0;OR)PoVtKw5EU9U)OLu%7QLvDj at La zTXYR2b;8t7wVKI%SA7aeTv4P|L_4bC-L-SN8rpFjg zja*-IGcnW at dCVdKeF~BrU`&%|`}rUg4g8)5 zgxZTj;1?a6RiW!lf;PInfHQ}e&jGBL4_T|^>4*w)!GYJM^C#auzs7w}Ou%5LS5N{g z?s#YIXv3o#bPcT!j#kEeT_Be2ZJ3>(hN(Up? zqK%=ePKy`v?L#ibZ28z3z(`~IPQ94yO}20oa<1T`n}4WsajS_^R4$-DX;tO31f zL6wHj%1hEeMC`D(Vnn9pBo}m-2osCLn18UQQly4n!m_SW5a^gbFJf<3+wPX4cW!SX z)J`FiFNU?6I=L*_75&uMbv-$50VrP2$~#Xj>h>l2H1&B%%AF__V?`?+GpUJAAc`q8 z;rP|P`-?l%40w<^g;VCeh+=*tH-&Cd=^P62nErM93eV0(Po4gpWtGEv-fb7Ip8rbD znN_(v*+UTW+2l!Ei%hXBJBCZ=%m%Q_U!gmRj<*NE#xwBG3nX<7QyRMqP_r9`w9bq0 zqOp3>X4P+aGtKJXEd-k;WGPEV z>LRi*I$xFEH(pj`9vBR%m7X%cQ*TZgm3&b7cn0W(e*PeyVwFW}d$q^6K2`{dP_^0+nAOmf z{HLE at WiH7_&Q0NPH?^l%{^n=AaZ*MFwd(aAv91rB!wD#iBV>l0z>h~x^ROGeQ7>xl(%MdD!`B1&AMkQEIV(7^K?)Z-%+ zVrQ!r{O|2waM-l_mRqx+bDW~#d}h5wPjXU5trIB(QKhgIl%0qi#fnWRZn-bm{*Vs9 z%p~@y(9G~;&(g*cy~xXaTe|y1TocEhuLB^?KSDAzlazqnFlD(?<9Q=VcigR(8py1R zso^?_5xyT1c=GQ;G&0b((%U!klU2eHiY)oHxymNMgUt+ at uF})+QO<%}iEnYCT3~g9X zm#lkJA#-+*UqBW1lWk!z3lkFx`zNL-Lp3uA2R*dw_qqf3pb=6YJ)mVA1JgC zd|yv^>@#_L)G$87ysDTao#7 at 11nJ|(wJB*- at xx)(bM+$k#2AFJO>a`kF6#O{Vw&^u zO&<261%AS at amfaD!Wmd*58Ybh@4O^(B%-VO3_-Rt3|_X`_= zQx)EAnb)mPRf)mDR<2U%KihT9^FC2Jf at fhDPMBL%XVt64IYO z)vGsX!FKgdraDUSuS1YgvpwcEG%k(I{pqo2)FGrAUn|Q%d at 2wt&8OQ}WnrM2 z=dQfK4R=QUSjw=wpju_hG4Y5vw|vFJ;5y-#^qvTNQC?&)A&sszHJwzXFo7E0Q1{7& z18|bg2XZ8X!pKq^!*v=Fb82I7K7I3!$yMc4G?10lGPWgdW=zHWwvfPJ_b&5#-o**Y zhuG6$rVuLr8R!s0=mD%K0>|eTM2o@}KTW~jicSsh<%is(#+GgnX{t>&I2krXKhheW zpI@>9A0Mp(k3Q6~g8$P!Z3td*2FC~GjEtiFIX9|YslVjVd=Xu->Qb<94kz+j^f7(` zDW)m;H&u3`Bh5hS>4QFOCF{)BX+szM^}(2%X}^5KJ-Mf4 at vsA3B;_$c5`;NpdJ&Qb zl_NdEuAY=0L7%}4GCREy`Xj)d%?W)`Glik=*=*C!T^kGSdLB+sq#1c7(wv@~ z5fg8);?`7M3`Lh(@qxiCS&wFEei}w<aLYV=>Sg z!afm^!GjbpvMbI-NNqf z41T^!$@LHY*4{zAsEDrq at GiljiWYhuemE9)p^Yo!t|YheaU?t5Bk6-ZXLkpX%MI0@ zLG|fq_2_Ut%~2^-``V at Z{H6W8n6|O;K9bYe at xidm2<5{MKydgmIE{1r2h`xOZJi&2 z$!{2sv=f)laMP9#Aeq%@h0)O>gy4Fp4Q at ROwn$JTbt+n&^#y6aES^0`RSB0IFJu!c zn4uv$o!+^zwlR7tIl2g_!F2%{CFToZCd}&cxYO-O%vd|71<-w%d{w5PL6j9al|>xO z?O<~g&vzs1QfgH2C|5F3k{nM)NpxE%!tTW4LzaoYOEwIbn}`b{M(5a8m)evK>5nV? zc9;12XNGu>kbUi}r0E!i=XhDT7)iK0(lx=2N4l#4!WOvbyL0-89XqaI(vVe!kJ&dS z*j)_lp?X)G>3x`sVFc`*=`KL(CXQkHkjAbAQA&K^Lt!*2-S2Pcx)#5sOa+V_sY1@? z_|@}apz*E813&WeWoGPV+bTcr$9u^e)_zaYRuxTnQSM(jPO=ZN1ixVJ#&3xZ-SpkE z3bX*#Jt2s6c*O6gm2 zIZP$K$oD3e^pX(7AVf?Tuyd?AY`9f=t_PiK!U$qJeNFDKEj}E1DKU4LXLz*EVtm8= ze*tD+=X+rCUuPSMUqC<#|4V==Z)D-B#M&pBB; z3R^qcyZsj*S8?<2w#naC)t8C(-~+tWP*A=`7v) z at E74g5VJ&Wrm9Q{iSPby%q1(u_ zU9iiM!8FgXu0)TW1`}m2abfGH4*1Z4`(ha*bh!unojt|FS~s6xc~$c}EZ}cep$R++ z>r<7lnd`*q4}-oD#DiVC2+x6tv&QfNVR?Oj)UzZ^KDTz!L`*nuxnM*+uqrf zDRdfRTjkj|`+vMTCryzhnqdU9q}PVEtZUU at KCX?AL$Fktb+4Ot%*2;T>e$gr5vX*; zxeMJdJ2d9`QbYIG>gMU{!6yacZ!px3)hsR}q?FJpezjI6u%@kte^UpEwE&YTpSF+A ziyG<*DFDAIo+R|eV;bcrbkcW?$%4BL$#TR>cbw;Ee}_(`MN2$VFd(j+Fz0ln zNWZ8xygl&mBq~0R;6!*3PkMG#ANY at y-mo08 zj`v^dKm`2X={5bEbwK|wMHvknL;(C3?BO0wxv(YRyi&blgR0P6KY)qkXFSPo at m`Xl zVo;gp^^3uaEUSz7?w;>FxTOKG{d(Rpwstvrbw6q={0v44YKD$77pwY`)h6Q`g3uzXS!47L%CL0Jd+5bg zI%(Mw9RFrZ(Hrf4#(*n(00}M1=G-7hzq7GBD^eCVkNmP0V9J_4pxil{abn3Sy!&wi z)@7|L3tz3dy{xv7qwU)VDCm<4qbJ8w71gCI=&UUxW^7@%NHW3Y1WAd;8~2TK4W?Lj<&)wQW3&{5F8cAqhhz zWuc#xw6($xa9%%)Jsxo?Mm2{;DN at atB=#aIJO}-0IPmE!GY1y%gD7j<2W%Y0`}YGi zU7LhOLc|}Es at XIGL56;+IKJPTJ=l8pgl!9QE|fhdFQ(6-Td}lwp$Bku_mAjWD(_)zl;>pf}K{$wO z;(s~r0#6cBfqGy at gE(Ty+GZ9I=>Z;idEAkp{z<<@Uq`fE2L=LS1^K_UZH9kok^M*N z+UvZ<4iTD}x*-=CP?Ao;|PJp&Bu+L=Lo}+b`4G#xv+~lq-?8=JFP7h4#2c!d4HKw~rtT zOLg!^nqxlo7-|)QpwrYnZaA_^$#TKPF2~^Iwi2i$GBp(vi0(egVEY4$=@R`&`R6}` zI80wLC;k2g2cZA1WK+t_+QP{2?_Bl2RCkDEYz&S575=pNk2XW~)LykK^0j1S1bGdI zwZFSci6r#(OH8TE^0tdE3t%lx(l2TJLT_o!2x3h4{%$;aeUbD_UB55+oz3BD)8Sg` z{rGx%8%X(vC{PbMPAs=%(i0nsTnI2 at Oz%s4No|$1--0$wA!w+AO=mdH=^3rTq9T1R zZ6&(U$sA-T%!2alsRD215g(JwZT-%#Tu47uSY zZ~XoCWqJElam7!)OrxztU_ at k+S%ze#av?rkJPl`I zg`!qpXwFa|3+pacL6rEggmHA|pASb6NHN)pFp)}vqd#u57|=dx(KIveaJErpuX5G_ zCDIuk=Xfxch0`EA75^&Ne8qJ?rNR_bG6s8!WYapX(T8;9P>3DvF$Y*MV~}gKxy3cL zdTpv~Kb_?+-fQhOHF)hS1r|s^FPuA?@9ix+);&Mw4pJPv-E4CuZ+yA!ZC9ORCLyui z4hTg+!ia#c)fs`(S%cY4bNv$xeUS=_o0>A1$%e~Vq51NL!SHE*>UH#}ZqTubTGm_R zI)wvwRYGZ18NIEw^Zf#a28c8|!6S#yN0}|^u?=MaF{?{ecqLnnDL!zb8=2-^|4sU=&LHGGa80B(GZAQvd=XV at q> z0?(6cifYjHM=w at u#iiUdh(x4JaDrky5QXMwlkN>IMB`IF{{SK+OMeSIc{hMY@#$d` zpu*x6 at Y@3)6czJ6AB_UNp!HQ`thkWK&J{XCV3dM?C*5 zja?`b3J3_F at ZWK&{@45Ae_HpTI+W|*ElF+SCW+F45fOibgO8QzA%O!^CkUD1hEow? zi4mYz?isp>kz5gGZo&waFDYAH#w%M6LqRTi`V{HeNr!7jl~z zJJ(fLqyy>HZ*R3SI$Zfo`CPRgXSM5OdA)}217QjYV_5fJ%5>o2?QDUK+k!pWITQ!9 z6K!Y(>2LH;cFKsgL>uu??Rt~)_2fAvp};BkJx{`{b1EOIFgLGHM;T&Ot0p+W%ktSVCHKdUi1*mb(K1WD!Wu?S|XEMt9%SjRMk`gt(tbxRDkWJY0Qq8w|cz_!Bqgk zxz&{lFQZpsSx>NrkoC2 at F|Iw7$AWQ8+z#oJykkJ7asyYK2HLO0?@ z)d}Xd1{_WqI~uHo%m%ySIt{&{xRUQt-l%ll7M6mv$PbzBNm*TM=dFVR$1^6nimNB0 zANhu2D#49n8Eu)x&X8EEWyrx1(8L+?+0953eDJC%iMsRl=T4HClSOOf=DIOjr at xCS zi#%k&YIN8hd9EXeg-?BY?E^v}&uNj17&Nve(3 z&D at 55F@+sDk=75eW-t}EJ9vD4rz@>W8=1?&0Ic5^Htl}#l(PrKRCsuG5%~>-i zv4)M7ucstK6|oWJenKmFq+>po at BTr(l5H{wip at nzRnk?GAw~-pjQ!IzK4L1qy25+N z-+JU+2hB`N*ZX_X^q59En&j!ziajz_n`Ya)j2_8BK|)xn?JqUHPOpcl_J*?=8vhuNLf1Kf3*gG3taJb9rAj)!afZ5uxp7Woe3i-C%DBzNS7MbL`SyZf@^!eAm+&rb z-8T=XDIT8?avh-;hLUj|!-%+OlCGvpc5>;k5zv*6T;}Ai9#KTIqd#TN4;(MZ3UQie z;$HX(@qL=I4gCYuL)m`*w_LJAt#LvsvGi9?Bj|is-ehlbXIx4bNXBMt%asbNx#lPJ zWG1z8jXuP79D;~YU$c=X*mmMAR~PB-JA*fn))3sSUjQD&!oj$F&VGV1Ee7up6oa>4 zNQ8C=*?#d$YR}r~Sci0Vjs4L8rJB;&A&Xi~a=vH$%@(30-6JQR*63 zdnVMJ$$~U{Kz$V at p=Y;XI7|bDV34m0UJ((-3*HsDelR>CIg0A204WZ+^98o|JLIJ!k}VTqi&bpHje*v$os8 zb*{=$_(CX1nA!d_O+nH_Fy%a`RB`5>l>M}(HxBhNAjs9)Wl`!Ip0SWo!AZik;N#Cs z+<1^;0d|6;lj>rA!aHS!w#8gDTHt3Hpwq4X*D96I*@V3D3YD#L5kRmFbxxH^{hGOa zknB557*ycT{V!05Nn;u?2O_ii;GsMRD}ZRznR!BAlQ5245Ob5Gb5pRTgmcKtI$s4t43;=gh*EW zvRqm5TSHA=v}1YL6&}260m)}^2^I6KV)S?Q-mF>u0h`+H*;eJ?2MEqsO!%*MDeUCX z{W at DsYNSPnULz)RGh8Da>W~nbU^Zg1ow0;#g*fe8+&;rE}j?lH8`TYQ0? z4a-xi^)vE&H=5Jc)=`gH5?QoE{r##=2e9o4IrecWqBH9F!vZsx{&v)A=jmVQpy at 5a-Q#Y0@%RWJ-Jkm_I)*4$UEcoJY3994>0I0eoO3X8e at hmqc8u zb5eNtY%T#5v~*E^u)F!*_|)rpufn1LB3m%bmScD}-#w?OHiH=VW6r3&fH)Q{iO^~E zjLxonGRmH)&uT6gX#47RYi!0Ly8GY0Xnlg0nrtOje(@7=qg1Rca-7d+9_g3_=f4* z0rlMIDSepd)}=tLuuE7U#3%8==D=H!wvd(k3RWnNyWd zC^f*przUbF8fKun&ro3&lR_uP%d*7Fs>DN=E!yr!(e1OKc?n})^^sjQ0InL?9Q#VY z!26=Zi<4|2l9mYi@;1krMfZ&( zDrZ9MZI)T}iL?<@&B=d1unZ=z8Ofd#QD5Z`v(VC$U=m7^`idH$fD4qEN%B$RUmtcN zL*;xiS%T!3qD!AYU9;Gx;_HnnOkMtMlTN(_Um#*4W*AlkgvH<#o}* zon*z)1xw4)inO+&Es)^@ z{#j+{)RRIo0kZ-1O2tu);m(M65e$#HC0U+W7HzU9Tqu$!08f{PY>-o|;)&Ymh=<`B zd7+40Uz)@s;%wL*17L@^!6f~`D!RaScYZL*CVg4AM0fcfP1fcWJEb`7Et`}q-OLi9 zk#IsCu{4K3Jw~RAL*3?%N{*E+Lr&bet}Zi^0s_jzzKzYQ3<7L~?#w%~ntQ0&ofc$ z{&=DrageE=USY)@{&Xgx#p+AsURt;Fj&WhHoq85$5QMQe5oW$qDv562rJm;E7zVU& zmHJ5q3a;vig;U}a^I)FPn!eLvzy2RL`BMSm}Cdlhsmd zZ1XtuBD<+pGs&Zt*2E2E-xPl>6y!2)Fqp%=q$VOTNhIshomq)eqq{(2+u<2`A85Fe zZ~l>208^gimpH|^HhKHHqzL(t*b9AlpdSuOvx8D zUD_S2Mxbvgur-yM|7BSrLs7o(YOpTDnN;NKEL0zqstRXbQ*N7#g!X zsXOJ+3g=(YS2VyyOVG6-bJ6(`oi3FnBVf<2ChO>`zpdxkRF0Wxb*Lx4*L2uK at 1omi zi9F6x at N1t9`K0W6eH`EHJ216VqG_5lH3ap$JMqY>Em|1<9AK`XNM+${fUMj!GQ^Xu z^+{}1g9K+#N)q*(BFxCz at hZb=hxKHLh-Y#Tk$mU!FHw&J81km6CD-bPB5KS#xscJ+ zZ>BF0B72cfX_LkZi}uGGb^O05`~PSRQD>(z2T{YunHAMjn}7wgP at tsbje7=_vanPk z*0m$O)8!oLvjH0I;cr<0=`0OTGKTwhKPn}<(LEnxoI}pYA(xkQlW5`9ditT zz`|taFl`*xJP)&qlQa4mZGG7Gt9w~u#}X95WFK+$UwmB|dke7Eg%00UvAC3cEJa6c zP})N)tcqL}xb+7a+*DP6GGutk8vPbiWWwD0rc>gVYL$kCw$#tltfvI`w(xbiZF2k@ zg_meWA5m8O9d?n!88ZxCSeU at sLi9GFwbon?*=Q&+Zdm0~;Fy~QWeeYE&K++Mk+y`i zOyZ=ti>9S563HEI&CH5`&cn99^crS}<)1tpV=#ehX2d8oY|xWYR!Cbjy#&7Rzgq`-AF<)Of&$K; zvwFspr9KaJn-bb%7Cu7;2=-gprVDc{5m6_Tj*&&VNPx4HU$8MtkMa1ezhN>OEa*I{1?bNXeOS>x{!{3qJCEeSFSGtFP`MH~oZyasj{430T=K~_~ zm3xC;kb6OAm5PFvW!WI9%^f;57u$KVZko!$7M}HwKz^8(R%so#I^AVKFe+Mm5B$$p zl;T*|8~9-d&c~=$FloIaSGk>#)(~Zs>TQ&o9h7FT3L;%|WMyo!YMH!h znH_4G2VZ69!^-dvv++y9Hl8X#x|Kif7ka(3uS)P+y_|bFs7+^UzxpbHQ!RqYAQJgi z{qfywB*eXBJZ}HQC4AQieVP&Z!*K3&k&l&DElKzH4;L%IZ0HL(X_w1$`FBHyUUgdO zKlC;}XVotB$D_O|@5ursUlj`_Z8hqS-L&p*2w|YL?s(`{+(Ab5Gu)EQ)9d82D|Ej3 z^}n6&FxtOsKy9k-OdYk}?v(7+s0n-@#SfhBMC&{P^+7Bx@~w2-ZTFPHzX^89IzqVZ ztYrojq7?%IfVxYa;b_}&Sy3N*^4lga$d7YxuzH{WsP3#tL>{6-f`LK*{Uq^!>-5F` zzF66txXPM&{loWbjJtmmNA9XlU{BzS#GrHvl8%l*I7Xq12q`5D;X+iV;|9mUnP_CU zE{c$36<{qKIIQ2kMx)beG!mYwkLV8~hZhJ^1h0 at Jm5j|E>=oHu)L(3|SJ%8hp6&^F z#TP=UhE&*&;X=5DjW!_;6sL>XmDiKrrq at e}G;8yam!VZ at XDDvj^MvCp(wCMgYK>4Y zr>`t4(^7Sc+DWGk`9Zl=_ku}@2Kgw#}WE0OFXttX*%@ldOF$1lk#x(4Br^KG% z*md*MGQ+qDyirSAb{)E?+{f<0jGKge(Svg6nI=NNkVUTq8R2Z9iZbJ0Se8hXYdxqk zOIX)0SuKY)PMuMlN2l54WU*ghJLB6*kV^xTmSKkKT;uEu_hG|)nn8~2dK9s}d4?2- z9h;jM9o;x^T|al*3cJeaFKU$8nW#=CDAeV6<|}cMbSK}cU+_i98xvfCj#Qvn%XN=X z2YuCRL*oR;kE2%5RX^}f(J;>0x&HMQX z)*{PK1)5Rhz;a4n5|h(KY1xgAzD>+(4nXa%hDLdw*|HaGw3E5Ko?ZnFh-J5(IUlvW zFAJb<+Rqc>^A2C>cD at _}27^^(IC7b8c}cd){%YDRv$huG^PfLLv# z8d7F-MSfR!ZzR>~d#k?uLF=H4pbtBLA?@#F^Sc>3f#r^%QfbhX%FVm9fV8kIisjb& zS?Xl%m?JZKLFyHvu at GI9k)I-62{U| z;Hajh9Ny(znJF3xkdH}H%+Lo5 at 8VQpfB1=#bq{(y;4{=+Lc>e|P|{COqyiZ}Rkm9t zVlgt#Y%jo9-iMtXUOeadqrenp(yZd1=f*ulkqMr|p at eCK(`$Fx1N`w7U&~dG8P`ZA zlhlTyJOkOp3DG|P(JJB5n5sto3I at iG^dEQ~4I^7OGYJRh|AW`j_CQxh{b$t7xw%6`*W}&H`hEd0}o$nYNNa5bgSaBQdfO*`J?Rx<%dQ#tvEkonh{3q zRaFOoKRjiR%A0&+IMIaegjQ1Uf)NB3dwT<}k-cqH7Y&5=@(fR-)P8lOmbrpKD)m%) zT0y4W&SW^k5T=&j*jxPQ!1c;mI4C+Y_x=tOcCVKyO9UzWgw@>U0kg0Mgg_ z3eC=+3eWQtOo^#h6c@?K8U{ES(HI6FFVeg6vL?9swNjm}KDD4fG+b+~<@ufdNL?85 zt~I9KqbYyH0cNPEWLhDQv%3$JkVeu*56rbsIgShj>LLat?_DmlSpAW;wg at j~Dy$r$>OaX>HL`buc z8EO-RB^m65d?U5~bO8R|mum5}pV9X#RG=T!Mj}I2TBwOEDpKR=17*ZG$G1q5*pgj-^1FAGYZ2wiVISUE(IpFnqOwPs^A?^k;!e)3pUWqY=}mlgMWOQA zm&6pK{;Z&gcQBQbu0W}%X|*C_E2Uf*kX(4us?BJEQV4wxo~2qJN!;u+ZH(eDNWO)y zh|`HNpUJAG(aoy^D*cj4&lR{s&iwrnAc-a^gsNHf7qa|vC)#G&f z`t8`q1OrlIo>PL|1LKMiqw~G!P^ev=?UqPr?@;_~Xv58o{gE;=ZJsfNX*AQ)yifMC z7w9;TC-&s$*+1!W1UXovkO}jpksd=VUargl@@_}Qu10n{3qL+B}CCSNe(Sz&p<8m at MLz)+TQwH+K#D?bu}rIQ+v&h>6F3fXtA`@7RsXe z at ITYVLoXMy&wIQv$A7!)FJDhac(t$4Y7y6{==lDKe`11`u^~v-fR>>UUzc7|jxX;- zpI7{#oF593JD^kL2B|e1HEQ)0*_A{TXP}Z@<1oKxr~3=b)nbe`fp_4SyyBJk->B86 z at 1${?zk8X#Gl2MO+88`-bI_Y{=s2F#V}+ at w^Y(E!q7;U=$6a&Xm}A8rC=Qj!Wffv% zwa}&@t&FxA3g;5m%UNYHH2|BEa;~GzA_j+SA3J(3h0x$wo#z1^cZi+?I{@XKl`Ge zRmr>Eyy|1=J|pfF%Mk7X-H+(wpjy(a(H_`fV`aq0g7CmOR{gtP;Vn>pcN$L(97~-D zNxfGbLn~zLY~o^&_!VdHyqOZoOdN^*aB-jz8pZPi>VIdQ0!-%udI&Hu44D7FMFjr` z*7+}`Qt`j8UMeGhDCp|wXyg-7VPfRV=rTYtdQy{U3DMGj{8-rTId at h;wDoZEkR2Fi zqM)GY4iscV5tjc;?_*r0^u@^}R+e))CwkouQ>z&#KYIiNAkupi3GLG3<8;BPTJeSO zJk}hsk_0y3d!wMiZ}(Xf}3v4Sw%uz&xoDlq%@Of zj+;@~FwW3irgr#|JZtSOS2@%?QT`b^rXsvaQf+bQxoKoODcou5L^dkWu>>bE;ZP+m z4P}zWGw~4D!m<>yTa9kN^;f~6E5kSkyZUrRYJ3l^L>yffI6!8MsWoLmef`iB$Dtzi z3KGBQh^lXD30&Gm%LH}YB&sF(BvwpSEmPql8AQLxOb=8d!=V4!bqvFwTjQi+9>uiu z^zExe#D`e|r&_5cirVL>wkqxF09)}3y#Z6pb5#xNorHBz(t&ZP6->`)k5rJIL= z9(~579gc$!+aEF%oD4JbvVo3WqMRp at 3$P{7U1W at e^&vzaCWJL=KUg8@{Q6cn>-;>W zTK)3|L#N$lE^YFHhx3Bfk1Jax;!$77bNa~rdbagbu26ZKpns?F93zn*=Q=w==~%zF zDtzpbLEQ8+Ni{RstBq(#kNF1t;nfLy+^MboG(m{yk=Y%V2dGOS`sG(JigdH+CpWD` zxCVN+D_WG?sx=u!C+|}YNqHY%`r)NXossE&8zW at Yz69O>V?&^-OaLd(U-;cZ{|E5< z_iUiL&%Z7*e{M2s9P{)(i(QARJ_-%_ZkvRY1St%$1sdKF&ZlHK72C+KXKYilNT9{w zilGVqARP0w*BmyCDba2Bx$t_MYAZeRcszT2{0S!G$rnymqGm}|o<49uRPFEdGxVKyOEyAEfLv0)_T`K^Caj#*9vp+npDZ=Sv{j+)gh9%bbWqSXlfHM(5c zf1j#bLYete$s#@lBkS1+D7I~y*}xU`-7+`=fJ_g6X*5pdsCU^XQt1Ce*wmZHCw>fM zVTdvX3)ZNoyO_voKXaaw6CcZNlQSb+%`!Y&{7p7nM?tQ!f#E>az?fCZ1b~U-ZMWb} zCe5nsUif}Cm`XWeOg^L9yB%q%)xPXZbt+aiKXIz!mC6SVSif;Knk7cESobfnXOE0K zV=T{ezTht2+}CX|;+GiPyDE9loX(&CSvJ#7`o0SFH~Yevj{rk5shJj-lF|-hLW5-r z2k_4trWW<5XAvAieFBh5YgXuox1&TJ-YunE%-H0IgUr&KX{&}<9y$KFL3yxG?BoK` zfouR11CSpbmDa))*dsdMf+HR!_Ju at dJI&NwagI)0bq74IgTy6Pa8 at Ww?brWqL;*EWI`(M);YpPX2xWNSV&6X34&n*fioFz3KolgThVl8gOlIbv|INvr_s#XoE z$zffIqXUepqBy>i;}((W54u*zM2|#Jl>f{%ik=bo_)#Q2a13Ae+^<>p#$o)^ayg9c zoni#KzJ*Jwfx at heE2OZAV7(A0gHO at UuePvysMIjp4QZ3GQb zpW7h#@+7&I3*MbPX*YW<>_ z^rJt%fPw8ofq at DC-(vCKiXIIsGmrnli^u at sc({J^3d=N7sf+Zv9GMD%>X>bliT| zc5IORI`JXXOIs!x$K1mFT_=t`7+%tt!#kCDBnPV~#tNvt at pDvY7d46z&MB5zdFB{`!{bBU-r+%NtwQ^SB?c!kv#qS3tnU)RL4oko{ zX0n^mW%LFtMV9A&VK}|vN?pcf&Irj4Roa3JZe`lMBhLS`NKvb166cM~ixb=mvffk_Z8yURF6=t~euzuTwbK!c)EK zdaRE4d$_r*Y6>Z72dz~V=wB<+SsdZHtp^1vh78>;g4T*SF#t&x0-;7qct#RPHcRg( zDT<&{9{X$k)fs-b0j_sc*V98{suF56r1&D583)l~4 at exHE~zyVbTX-usA9i5V=qFP zYf at Cgk>p;g80j^b1KuGi&Z1a024dM8=dc5~{Ugy7yWk_~G4`%j=mRu0pojhh;c&V) zlB%GwN}*DGqE$=AA-Kzr9oj^nnJtfm00Po1e$z(zZsFRXEYm_vYsvQl)>C0%K*o#} zXYzL`>Yh(p=U;yPb{i1~`uip}xKMgT^s*albdi$z&iH)NnVRwM at c+Acuj?gp4S)IX zR3rZXWZo=f%>Og=(^Z{U`WyN=5R>bPG3a1G1vM8p71IPA7*~rY6d*DADS|RkrO-;G zl|Pb at cvOeRg9UpD4_YbhEPk+vSeYj_uKw|VJ^y3>F#Y>`4>+BnE-;#M7X^VdIz3u= zz-)q;*o0t|Nk!^0NnfI06?Ph@$YfFt=@}LzbuGlZq*7w8u0l8tt>@7QAolp}sK%oI zmpdA)v^!Hd*@t%!LEg$OmF1CknsT`$_13zs=@ic;kwCYR$4KCw{j&UWnYCmECD#T$ z&RbHZG8W`Vq!G>qF37$~vP$8h9#xdc;nE36EV4~_y2w&{Zf%wnWoxI;DyuVzd`WL6 zWI7&y789Aa^5pfFROlW}(3kXuPjAP*Z(rTM4Ny3{VwRHR5gl3Fc8 at yD0$E_^`B1G9uD+-^eWKfEuq>MxuKU)60q|%yrQr-e>Q#8m?J(?KTQ0qvTJ3fNVYE_*I*!+HB+$U^h zpVl9f_Xua+X4trLi{7=0b;x14 at wY< zV3Ufdeve`?k+Pgd6ZRqLN-=SptK1&7gef(3wgT+%#@q{(-2oO{khHrDYHnCsvP%y7`L zGFqs_so@~~*Uoyk!G_jG%hQ^1ePEmOV9ilwvp&05?n1j=0+YPK^}j0ld%R|#`z72G zi-mi?Nlm>AJDj&*4$@09ABY>{L6QTg_gF)a)&Ha9J+Ok z&5b#H(P#)0tv at M7`Dsc`U+idC6$CdNypLh|>1UkfJ(iy(pu2!qMes08r at QuE02gX8Sxz!p`wTf`eR zLkqGPFc&fCKmY{_4>(q2A^C6kvmP0LsP_vo^-*k! zn5pJkFNwV#7h2H4&jX at pL}*n^;@NoJ-J}GqOut;P1ah55{8MaRJ;8jr~7f7WR;iaR zB);DBvcEcYvbc!lc;LJj&05j2nIoJbTy%X9B9YNSftmO-v2iZ_GSw?LDfIkX(7~{aY0LC;19o at n@ z#B%})jJDX?x@^m0LHIyh;l{C(M6(n?F2yg~3^G8ljeUDwR+w*39&Zh_vPPV7T0P`+ zw*9GnEHRb?1f{a+6{GHJc7B at ibBByq+&b at Ru5ju{P;t40 at -H{$8k~1ye}G|n55I$L zra7`*h at e1wo+Shq`H%P5j|@ZKYq8vXS&z2r_EhX^(CE6x;L=kjL#p at ji+2emS_-J594ECftC;?RKlZB4V{b@^{Dh zyDpoLg##Zpm`^?_+2apTIwBymL%_d-+TS1WsN1LJ>Gonqc|lSF_;!US*1+Ji0GZ^R zi~3k-t_A~Zjk+nReG~R!S73bww*^HhK{#Ik-)njw^@HN{g5wr;E_VdTX}0B`x{@WQ zh|ia(R;b(Ij$ke*C>4kUs$E7%=CFiUu%S}D<_67S}V4TA~-tumF7HW9r?u|)3C3Zwc9h2rgDtR~|5wHl8qcNzb2 at 31A> zP4qAQkf8qux}*OUQvWqTtEugRzKrqFZjqjA#V&=Z3uc5umz7}3mMAZ0XgVk&Wg3JW zHGrHDvs6aPe&;&Q&rif{U_7kd#ak&Vr;$a+7hfS3UPj|J9;}-37P?Q)xT@!W9X0-x zeZgD33K=b3zTm<8_&Vi$$?dV_{fQI+ITJ=pvt~qooTOO~(F_OeBL751puSxZ-lwu% z9$q+-bcCU&G&^8?tF>LtcAFk)&bJjpc|{hGyE~nx&KG0xbc>Pdtud&1&Hmw=1KXXy zoki2Ut4os$x_$Es6lA3Flt2Qpi^uOg}T(?zig zIpig5S-9L5bdE|knB;%>gn1`B6WHM?yk62TPQ8M+q3zbMU8h}bSpu?pTm*{4lFI7~ z%$zJ?ND34c8C-k$?K$g;@@oY^Hrk=jM;A zs`UTHnwUFyj)jz(`6j0uvso at 6I5~RT^>&gpvwrLjTWE%emrdhYlY2WBbnJ7&k*yP% z#B+hZnaynMtg)^)z6!F%<#DV9=Cp?S{8qo>NBBLA#8xDf`p1T=+O%J;R2^}ikVo6& zuHL%VY6YpmdRfL-aV>OrBYV$#=x&z#keCr+`Y4+Fg6b(B81YwNDtyWdfH{C-)P?a14iCn5IgkPafCi_xd*d74Y< z>`Ab5wYkGnj}sXd?Q;E~#PvJb7`iWF^(|mt87r0TdIVozRfgv-#)@8GULN6oXrhMu zv$j!{z{`0&g&vHHDW7||DH=mDymlu?RsE}7xvNNx-+aQyUx+G9(k?(LqY|Xq&)@Pu z)B}(`;7a;gXx#j1z7`hy{a`Wvqb}<`(;v-GmVwC6gYqoY?jB1hI#=1>jG#5Cu%Fnf zd at 0L6x@o>gtcRy46?5wC&ZiiP1?x*@SDXYXTVlC-M|%KL+ZirNPq8v&$MH8(oRI*D z#24Jh`~tK`)s7D15@~$n;6Z30 at ar7m88!BIMQ8h(3}Z0{Qg5 at 2QrhMqwlfxXlIsa1SB6bKRy zGHIs{3Rn8}U1ENp-7=tpNN3#w3Iw374f}J*=4Qb5%IChL!#}lr#X5l7o>}>v!4+9 zn5B at L!U<8kzDij22i6$61#}35Hgig&!QeNgR`x7n1Qd9w(sU+gWaLwJi!+mEGZDDQ zVo-M$RMlkEUGHo0( z$mQ8n*+Sbgb4x0Nw)D?)@6LZT|FBLW7HT9R9pc)Ny+2cP6g9~gHGU#d=O4YCG}PEo zlAnN#loUgjqha3273KT|P4#l_cziMXg#8Q2h*m+B{9TSN5RYgEAKj9lVQ7-=12v}Q zD+uWy1JRd2dplnUFtBJ?Fffk)TYhH!A6a3lo#MI%`tT>Gf(a!vsR_Nf*(T2j5iFaP z=gLx_rRJEZ1dOeaM5#iibWITN at YLIn6_2$j_0!-5ne|t{vhpJy3Is$c&!~N$*y*-M zj}L+F?lHm7?q_%*9K}TJAx>j0Y2sjLYTuAB<0p;?NiB>m6XvQ2BYnU(;}vvK at gWat zz)oN^J&rogI$#uSawJnDiI>G4djYo%BW*p?X4O at fS>C=DH*?Q1%&2^=Zml at g>=(d* zq{S}76cEh0p`y+ia4=bM(Yl_yb81(ebZ$YpWkMW1gMOYhHW&J1 zi#u4N7z0XPU at 03{&<&?Z?}Jjs{DpJb<@uELT#ObcbCu>CkDnA~QsLr+Ue$#^YfOLq z;PDJy7R_k+kh1+?mXtatHw(Qia&^B{ptGOJH5E_*o7GZ{c2Qa$mIx}pi`g(VOEB|i zWke=_Wx`N?Le7cj7hW{SUuA%aifKlI at iwK+&*hRKA7wSVhlQagKW$} zb$FY$b}o-A))h|#f at Q4{x-=3 at 6~=gvYNpq1k<@?2xs;TLgCc{%Ck($2(p^+gMdp*0 ze1vlYPadt2DCV>b7JGmbPw08f;~b+zl$%>gW_RZf;eUeyW*Wj96tpEU;%@c zr^jH-FJr9HM>Nl}TWDPco|B&=m{u+lOH$+G30SiXrF+w)l`~sa9-FIF*c_tcDiC3^Ou$eF?U_TRU z;eO6|T;Z%nxFkr2??ilb4;T=CNQQf^NUD7emx<#FwMwK4{|3&yNp9d1 zIPjDBcwWHL8!QtskGtJ?M77E>Lyw#8F^zUCr%kTLIdH>VtnCivI~^xZs*kUD+u(S3 zIn!(_NkVMek5;eTbpM`Gl{>z8p7`S5HB$5 at 43=lprdI5UK|Hr`*4Sqv34DaSYdP44 zp`3A0LGsz-@(<2Y$!8p|@HgFmQuqKeG!D#n`|JWwybGE0-PSU-nJh~3C+eyqi at Sl3 z7#FV(HgpLwCV=tQofa~M&t&UXg*Il_08pTx*fsx#_dkv#9&Fo;75q(MSHAuSeK^*C z*FyjMkor8dO`5)Nfm)yBAdOw0fRM5+IdcqIOlW!&$If0uPV($I!$oje&nQx+rIPd; z_y^Tqj$L06Qo~wFPRHYx%hbeq*Sy2;9$zS>J{>q}bhR=qr3BC}mwjPbUJ*$|Lr^3f zlq_5-#)c90tw%^2Ju7-v$vopdUa7 at 3YKGr%$zVh4Nm^#Ve_x0E&hxjxgQ)I$U2;?T zmHzK0W%~ufxA;J@%@b!JEZps6UeDxabG==HMa4-vaFJP$_-EKu$Oah%b`#LfrNtg6 zcX(7awkTV_#7>bA%d^Xe3N at yZstq;QQ*^|W;dfrOHoE=O2D|UDS^6aV&E(Ngt}>jj zQA#GMun0xy=0PnsHh2=pVi01X-P}u39`3nqp&@FSq{#A`V#T?FTeW8p`64R+`V~Z) zLdNrLpf#%O$t~%%4NR>{Z*jKqpIF*Nx at 6NNBhUT!vj#(5c|ET*G1+d;z;!Gl>(Dm2bgLS$1hk zq!BY5CBlBL5mZA$i8EzDne|E$n at 5FF=EiLUtr_mK`$FHltatjpQ#qT5Hzr6$>>Rk! zg^wV1`$5Q>d`TpVRW9Q}la-x}AgPfpz%w-`&nCRYV|@2 at p}$|Uu3y0T5|l0dLQse| z!08lgE5A0t77E{_KzLh3-ebE(Y!R%1GY?PLD?t2#0}E`SwEP)6bJ{a=D%r%EUW_2K z1{UFXdjdh$LU#X0V2A at T&lUso(dlqA;RlT(x`Sw(AiOvW#EO!bPMT9_ncG;W%&Zm_ zAN~?CKRUrcO_D=wu5qjIE(C2<){Zy)Z4<@uC3W1b>14bNT(D+h=Q5Qf4&TQ=I7~`d z1j7BV%|}E12R6_4UyD4{?Eckz_P=OPLxhtPxp8QR z$hS#*hz+S78W4MD&NP&J+y2*XhG{$61kSyYhFq6v?r9f;3#)*Smk)?ulH7xYK<*H_ zF|XsYvSB^MMLYuLW9SWfFMr*Ars?=Cl9)cv11}OS4=?Pt?u*xWZ9{d&24BA0tFWIbvzwrkHot79!nk{m zlaG6DwzRG92Nq66Fw=YB(_jMNgAXdpjd?}vBSnGIje5WLpf{Y`mg~2g9$>^i-kRsH zTmL{OQ<HFk;C02tGhB6bFL=m1Q(JGA<(lE7T58{ z!fw_fnc}%ka>$%LQdUK!7Ea9D_W}ll73+MF23FO z at dbX+1UkYpt!I0oS91~;_RRx;Ga>0J6by19$n0b)vAm6eaRO7;on5v5JhI$Es(K9* zp`<*G?~C^DW3!>^W%=nc>t6$W5LkfmD@>@R#9#)*F_vGX$l3+fFawtP-O9BWr&G<% zHi-wGvkX>;v4_}i>zopvnqRP>Cx{XX5#*X6E|(DVgXa#@DbB4ffd1RCAxY)y$r+1J zDEiHOM>V~sEN-UDXH8W*d7(F{%Jpou7fSoAT^97VwFfO8H&J?SlC^8E-lTBqHX#KD z9(R7A8dV&i4ZZr|6;x#vAzKM1qy$n;YpxC;*Or13^lA*AIbpCWPP~}= zmNBk!S&jHqaZP*>eDP$Ng)@H_5;srE7pTNHRsCf~%1`tYclg)`*J6ZMehpUyW*%F1 zdLv9~dP|b(9eL++1bxVcEX4`?+#rTfOYu%p{dP?lcdDeXRb-1oaJ{J6QIro=-=6>Aa zt+Rkts7>d`WB^cI<9`+T7+iJZ}+yZ=|_Q zOugh?`_70<@1IgY|8&20S2%i-K^e|3)cLq*OLCyWg>z{%i?mFay#bKCdKP+;Wkf9P zK_K*B6g;tf0gv_IIGBYdUvnFo#bj7S^Vkj8LB6Ja6X^4N1CvEKllBeQl;&NZ$@IB0nC{Jag4FJo)^q1vUlqcZZhd zHr3^3`Q2y at JAGD8_F?2#23C?FQ?Ou_db*2b`AIi!r<*{&(nG30_5RR49Rb;ppiC4k zlx0uZ)E(Cnk^Bs at 8qbYczICH?DNU9|tTh|@xcSBN5*% zPI%}XH+0i{#+`X#ccp1(?*%l6tD0xtN9Z^|_FY8QOy=4lfCR&si!9D+w$YlzeRTf= z3`q=<)KX!B6c3CXhRZe7?pKA{YaOUV=F$(S)i~LNyJAsStP_#L2-#${?l5!*jLtjD zAmBXNqH17I{dB|v%nSEolfexzi*d)5#AzzbI$)goYtOq~w3k2gA>?|`TwfEqeIGsO zpWi>x0W^a9X^P$1^hH~q0<3KVOCHSdr875KVw^ZwNMzE=nBLX1i+4EX7HCB7z?|Jr z;k6#X@)f(MV7g3-g0Fb9Np(=zh+}q1s!jZ|Lwd37W(KQfXiTjiSXVSddWie4cCi1v z5 at _8MYTd&;uuxD5fv-ypAPG2yAE*AvX?=7QN}CvYV%cFhxAT7dkCta;f_1H z at KzS}@oQ*qKZ*U|E?GuDe?tP#?myUe$5h?9{4Yqr|C8ppu#3Er)E>H=;$B6PrnIYT3a5Tln~hEcn#td7-g8 z^aIRhE_dE#+Us9&WY_!s6yq z2%V=~ex1Z96TLDG!A8aj_;U`k0tk z2P%zjp#wnZj7z$cnT|A_=5TGQ9aEDu9)RbIZ=%knfbn3mxvd3H#+Q!^Sdh?6n|l{- zzivtwu59u2sfI1cQftG8djM0Rn6}b1N<}Uui=IV3SL_!bXh9a=8q_>u^O9XGQk?m{ z;Qj`x4a=tH=&JpwwBtL`7JM(6o-fFr+wHn9-Yw(!x32-QB&172Kh6m1HDJ%+ullWZXn`kpR{+QO7o;* zZm%i4bwsvwd;%-5$;xJfU>4uKq0A#4ntze04R;IAC{6S42qhx(FL%&VY#sl)=GWKO;6O9eb>FIW$$h-d_IrJQru~73X%Zj5H?9x+ z-nxv0^Z0xtG$0DAJmI*LAok5%oDVYrOW6>6Lp5e0wz+5Dy7^RxL$si?`l4J0w1{vZ zmSqv%&b}#qAU44|B5onRsn4XZyNrjLCa2mc3q0l0n at FS8&@b1~Se!vOK1-DzU}}o2 zOm=gTT&FpU?U-ZI>#DgZS*vgT8DxLT!0nZC0bZ($n1KLv99^5Evf-(%<~YsD?5eTH zEyAJE#aLWXvdbCoW|?p?2Lo-ann)i|RhlCE2RsglBlXVXX;qa^RXj|YAyxbe#KYx`pQGA^xNw&cTs7w;>Ot}3(sZ#g{8Wlz01179#kS^(GEhl zG|B2-0O+?&^uI{>=XNhB>sIReWMUEjB69kIe)rU at x>_6&`v0-^PC=S>UAAae+LdOd zZM$3d1(ir^hmGC5DuSa_H zvR@%oW23f{cA6y}3n0G)J{+OSI0w>WKm>BO-G$=)?94nw+}oBN zlQ>EOXBHQ~c^P3r^Gn9>(G#{A0{85;jeN#C!}!* z61jtIMJay}H42*%1zxv`c22taw*^iJih!gu+^7T%k3wh at k6Xz#e8Yeb;Gq~%WqY7g8;ba-er*-PV~zg|UH$Q;{UQpX zIrx+70)i`O12-#p&uqUnfMAc5%Nzc9j5P1HEto7dba*u8`Sl+IBo;`a{7`>)aQu+} zgKqc#mr4IRlu)v=LE=O3Mk7~=9*}>#vZ%uFQ`Yt at Q?6~ESFUTs3ygi(PqIE++plip zjC^E$JN9+T3|IMTBzn(WpQw)Y{5qSs7) z3d(qDLv`aE^TL}gN~IU}kZ>7bLsj81Sl&3O9raLLHkr{RwOs3x8jZ2Q;_}{8Y6pS9 zmkgj>JIXUP7`s>07!EM%wOas|&Ls7nR-DP|E|i<>7Td7)Lze1J-Nj*8X>6CwG>|B; z1m*bt4*E^hyLJAA%EXnFssqSSGN_p&V8J9ZP*t(Hm`)~L9fHDdx&7yGXORF_VJY3C}Y{_Hcr5o+_N^EJ$WRYlpf!LKL<9M>)QmB z81H?kpaai4`{3-zVF$QB)$G&=xq${8Z2F#foIbUY?A+tBD|(r{L{Z*qYfTjw>8gNl z!t9H!@kq_0i1DWE&7X)o%LHC_5)MQnhw;~Xzu|})l?SmHg&Fwn4SzC{ya<6bva_0@ zwX2?ic;+Cm^#ctc`or4D*!o=WMQ80rJGIj7Aqi2mK5xGGg&Bxy_~+p0*Lp_IDw{tc z+;v2QsHML8;O~8(a$wq6S#XBMelb=fJQ~JWmltG^ZYjlkhKdlp)nsW#A at qpyz8HM| zv}iY)dm>SW;&4Bzju%B7*dY$Es`+YeQJZYLmkNhA8xETG`5BLlD86Hn~V#E}iKbL0rIGy(f_Ts3>o> zkeMKl#2zVKx7btRSCmH;wGlDp9IQwD*=n at _Le{#$*7o)l z&&>8!*2l_D&*zWaNE^kI)+#;N9LTc#+;YDD_F(2s#F&nP(p><7m8s!Po2w<|s{9Su z0Lcd2=YkifAqFd+23hhPRGUF;et+)OeX>Om&W^He4nYTnCFa9>wZ%JjG%BcbZ|%~x z%4OPe)xPF|BKKcO^X3^}K|QV)=D`i(Px}g3D&qwUY?>Jh_GUi)4F|JO zP1uAEnG2!>2)(ZTz)mY1m>EhJx7KOd=@JJTCX7P3>ru2*hn4Nq#-CQ-y&R6B05f-~ z2{Tn5^m{=HsCZaiRVlEf4k0d+ccN_Ep3rpKly0L at F2sriIyy#b?vqx*4eJ|Ug?f)=7bys)P-6V9BkU9MqpYu z$~Sh2u0{J&IGXj&Qu`{S*%zHOhuH=$6}h!wLW at jEXla4FTqymo&PI2&aD*->Uc^U0 zF3#C{v!j&~1KR~nxVH%M;eWL&L3bOcV$JWvPM9H_BsU161sqr4ZUNFf^YVPJV5ttd z6Ryh1MV{ra{I8H{2hH471L(=QRxR;DN)XLBa?Ll>m`C(5&L^m>;Ko%8Sw}ItJcUn0 zv;-l at wCl|)CiLK_+YnQ@{Omv5iFav zDw*Jv();|G(D|l^`H)7b<+Q_*+Lv3JSG6*(NIkNM&#nTet>g14Arrm*J_dM$RXqMI zf=Y|B+5-F{9F&k-J6DB-%lQ-8vQVMPVx`FigNI*1#meZu!zEyM;$EL)lV|LgK~ozA zU$tX;(G7ZNUp#@U<%cI+V=8Crvt>*NEvO138d$)?sEB& z(iVkjk*F>sg>BA<`VMKqFt2~22uJ%-*xR`t%&A05;$W5B{osiljV_-_t`sjAk(^?uX6pYIOi?zhTK{%8}j~r{LKh_k< z#NGz+c^Z1b+|F5*DZ;^ZXU|s^DL+i#OqCk>7<`U1CIbzZ_IMlGT75vj$aH_3QkyL& z1RZoRh#;MGeL%mdH8ca>dKq+Zh at c#~2}xpb|lQ ztjmQiZM89cjj@&Xz?8IgHC)*F;A5vd{Ij#&b%CB8h++TDaBQoXXJkf3+bdg*w||C4 zYg9#6!k}ycgBvB at Jc+U9uS8wv3*h7*|#p87H6`jJKtzeey!~n1E-?xKd)ab9q{E zrc$bGu{e+&W-D6}DMzsXVsg?vii|ZwtE!jc^m)+T0 at FD!SJ%T+fid~?8YDkx$iP&+ zOMmw)Iw-M}y%b1X72V41Yntt;=mNMkPoI(dG_|lj(#km8;Q1dEspaC8-m8UVtD$7{ke_Tt$ z4SZwxSc-Yg9WFJR?scuA874ic2cUAK-bNz=jz>HZC`yg4*vytBX`(+C>8SI2?Hg388zDI6IhAIN=GM_upx;uOR3Qz6NDA=D zFELn;ZJgD?ybwR=NjK~Z=GC*9mRmM?q!^L*f@=S+*efOV{QOk>#z?A}SJ*HUX;kat zyd?{-WNOzutM3*oY%phee!ZsqR2A*_gAY4hnMs{ed at w%4xN6-N)0X<;CRIa`SZSp% zO<_fzX#};ZOnQ|BJjhorLt|ib83wY!BFK?#j`reqUF`~4?RwR6M%hv6~Y`mMf zQ{V0U$}T~!$M|UER$sJMp)nA0sFRc0%KDU3Q2WzgL7k_X2AUSaT)o%?;(2%hMY|y+ z&tz&bT1V{M8WFkZA1g#$NV1uxbGCn>kf@&B!Fcg*eI4zyBdE{x(j3fFK^C$R_1$ph?67HJYGr3clS~xb! zW9p{tz9{Kd90hZJN0LM*jaoATA{4r2-K$o9P$bSxj70}=mFEA5+(@H0D2?&VV3VoQ zw~hg0DW2}qFS at mTXSxWnB=ngZJ1O~@cF`uDaT3bHVM=wzl}KNwJHN|qY1H||r{k^Z z_kwZdv-K_g1o%*5QQYk}spNgqlfdzbJiqpwP#@aO{Afc=AS=t5LyOac zMb;V31t=Qu?kGB~7eB3A?Li*{p(VuVklB_Y;J~w>sYxw0Lp;UjMp?jBVVZT6;|Q?@ zEX-=?rd}AP*|(Kvm%ag8a{p)dxhnp9gkNNXB_+cRQYd;stY(A#jx$g6io0A2m0>-L z6|dvTROa#7DScv3b5VvGMW1v4${gdX$gJ)?YfQ9b^yP&DCU5=XROXNOCF9A at 2ay2W z!WwKxR4ubvmUZjdkT#b6W|t>@alMG zG3=Q1+^Lnc(kyN7tXZM!oEbBom>vCz%olP__zLE0S;+Q%DJFQDZTN8;OVCa7#Ebpv2S~+557W%2H^h?+KJ3;$rXh1LXVR+Z at Z3rlHp?ePQ7ymCNkg3^gLtAOe- zvB#;Yh;c&xbBuN+Sx;ckZ8RPy=hqsb8yi at z(- at L!#Ql{FL$Mbrc!`sTtgf*{B at s}$El*P?fbO^S>#GDaSHQGMo~{h$pq4tuP8vK}syy~F+{nM76&wcW=_3Abaa87wVEa{W2E<|Jo?yeH=u0m|7&=L;!%a2AE4rP4pSUUwSUNGcv at 0** zkv5LI9bx4s295xCyp(;J*{YY|I&bVRYncTyGg`1y_;%!ooc?)5&sUvOMCclB(P7+I zi>s2k~CD%X!&%af;x?e zG)_d}zY66dN00d(ZQ%3i=2C9EI8BalgWj|oM@#DZOIh`UpA~;xo{SPu?#OWP7(6BH zyuIMcHrYaxAwN=o0W$_{q2b%eZuOgU> zv!YlaCR2x?=>sfVce1uchD6GY8T2 z;_>dFo@`{)7V|Du)R=VYbO7t;X7cT z_W38nlse}tfbqakBkJ6IB4>yM$Y=&Tl7C`m7USzr4fNTtSd{7(f=}g8d8v__2jUh! z5A(7<+*i3?-w*RY+W;mpEH^x$a^(T%uWt-_6RU-1HX668!XmVIv83U zzG&%wau1-CfiJueE;=8`C0go|y&F zT!3On{TF=}HNx9SK0s?0%TpSW$@ZbDk_pvUUn2&Upd3jrophX7MWGItpV%w0o5rnF z>0 at dA>*&Vh(p~aWUwTadxc?~};dkSzWVTVrQ~fA at P>d`NZ8c^LcVRU?=H?*Aybu_s zekN6T3f~>~Ybsbz+3F8ZOsKZF0pw|KLHz1NP0>9q^mf_4B7}N1bhbsAH8u^)Oe19k z*b|V#_q(|-qL2yCMkDCUg;0cKB-&a5FV(kmy>Ro_PV at dlEWM()T8T%rx7w6`u#dq! zCz#oKl}R at KM^7nM@{&|Tb}-;Oo^(uZ!G9>+YawZL#g(mRw1!Jm9`}0sFxqLxOIevr#u(Ef{UlFVPY8I6yGKk*3 z74!2~3d%hEkKIDH%WM8vPTea-ut}Q%2vJ{WqK)%DzDJr}rhiT>mR_svu*}v^6|1uN z5Uujs#Vf3`-bny-{&Hxg+E9u$pyd!1zY`%?{4L%^nt3aI%{K_WvF%&@H!JXUeK{NIt5Aj%}TB0W)suDfi62^y4`fq z)~u_NC1%E&T at vP%-$TGJ#=(!7VKoD8jo6wtpVaJ9F~6#qVO>bEOiL1OU7bToLu8`y z=iKYMd%J2!B8#b3;;iIb=yDYoxIQ__rR;Xyz*97m=KXi@*|dm3?ASN(SVpvk9nmKe z^i##b#J^Ocv(Q$v#`Z&e*AEOOb}t?py1;{ip<8^L}B8`8#=joMYox9?>H8l$~@pfwc=}{*87krwPq7 zOD)Pxh9}qsueP~RqIZTXNucH?7LK5^M_{roc&($=xwrbSsXP6kh#LN*AFj*R>7_XK zw at POBhayq$&7RkP|6$dl-XVPZsB>~DXkNM2d^547q-%uPApb*oS_`|+%MJIwzS1{k zq<3Qf&mmNLA@}KCk at zhm?nCqOjeL>oZW9#>-FMVBjOZN9()?bj5qpIZSi^k$On6Pw zM|Tp+L(`n#j?#$Ygp)w&q5IJIwO;q{Tyb(&UNa+b~3&YyiJ$c=Bb=?Gq#$~BR{ zawBXhoNm0 at i}8`?vFm&Y?!EzLiQS>YXC`xD?hWAv28g>~(HaSAX~ogEOm8C749(7; z3YT}H!8-~|lSmzRR&PQ?{iRR at Oq|_z zMKfc(4i7+85x|!u5GNono;UPfqOs)w^DGVnZ;eJiV_FDP?q|chdhb6cGI#wo-Pw+x z@{A7{Q?snITwMv%%Th@$)4p-+0k?b=h-rPb!Wl{189_gnoRqKaf16w7biwFDc8AxA zfZpM%2~iNk=A$$df53He( zWI~x2>VQMBDyYiH25kpO(uy&=hf6Qhm6T=|v%7<*SwqX)$eoHL3Qt(@m9V2UDy)>f ze3N@=izO%Jkd*tSaQiJ;f}8vsn^emxG{{I0e&a`aRwX8}-q&0-lQC~(ADCzy_q?Uk zvfiP$#_i;TInuf2pL1zD+Jw!qv at 3VC((Z;V(Asz^FOthqQXw9?mC1zle-yJC-+vl- zD at E2Z)YL^h0F{q|G|pi+B{6`ZocTtjd!RBxO(8+83W^V at GE9>)N}Rgk1>NaiP<)%E at AV+Q5o8zxx1Kcr#0Trlv#Qc4G^+8>ne{D^S9IH@ zz+}(nMw&5X7!pAKiZjbsUvvdJCj#N=OQ^Ro>{S>FW4U>Kvf!oAtlY&n+rClO(kVxg zHK*WxlCIxQp34}vndsGy&@7(q*JoR1i>bp)7#h=W|Hvj3kY?w%#}NiBhlPgb=Ybm2 z3H-3d?4L8%q3 at Hjv7;=( zrEU~M*U0nzj}A}N%gw5x?dU)(ZR05IWNG=IR{u4V z at b3fO94E_5e%OStii1$tHXx{oEW^5efovhhYz7~TNgU8x7VXi2KKn8VqJgGNo=+l} zGc<74wW%Z)2_81r?8odgZl|xG$M1ANFsqRLF=|i_qG6%osO4OH?==T}0AVL!qEU^1cckDK4P9w^W3wp6Fk_rv?!SXd0PQgw7 z=1cNQ6XjUy;nB%;eqq!gM~!QPGWc>5 z;}q7|t-lgw`FaIh1NW=E>9?Mn+pjU6{?uDt&Q)?p z6xL#2idyD#QHFT{-dlV)!E}%LHlW at 6aU9K{a!jxlwI4TfKy&$vl*tSJ_7hg;i!Vq^ z4vkwiK#&{7flt%vXME0{>qT8=F7i)HB&eU>$Etl=PCHVavn%B at fA71IJ?E`1!sGqlg!h4X+g638#`ulcb0P1g54et^?m+f z`rgA;GLiO|J0O3#L;v65&c6 at uC~C+o$|8JCZ;xN0IjhlzvvyWmw%~)&k<;db6EIZ1 z^|oJ!T!~R6CpT)rev2dbk)5JF*~`fWqmTJ(oSz&nIfX*c+*+Mhl6qFxbmv80;ngCqpP4-!K- zJ;O5udu!G?(!{d^%Z(WWoOu0V6aS&@G8p!;_|ytB`B*KQUUchD6DgW#QWiKRS`#W$ zqgIPk)6lh&Wd2!F$p&DU+!?J)&TOT^b!}Y*(=)V!Q?HnwJ(k7tZ1swR4cHBqGV;?a zUm at pnO18f`hZIreB8~>Aeb*46w4?Wq1xX1Qgcctl;?^Pg+*gcXESca|D~A=VDW))wj0LVc#M$@l$%N|LAqyVo5KUJi|> z$km%49?@E;4||O9u)QHP^_jwf!c|y^>^_wHh?SV<`M??~9qIkrv+p&YTExu$!Y&b5 z;oraLeqeCI${P3@&U?GMgfvX6hd`nFT_;H|z$%tqovGMHy#Wzh2p>-(aE(v-5C9j) z5`!{NEb(@Lo66G^lK6#t+JY3Wr|xh7`AauYnR#9UV`wcjbX{6IemEDWEoEuPuZ#W1 z*8?^icEF4X5BjJu2uea~qFDF=MqJ^8mm%qI{EXm2Vwx0xVrh}VpwU|x)F);_JZ{k8 z19|KbBf=hg6jk-=cxQ|k^;amh@>_zBac{iwv5TKb^)rJ^D-4KZSdF9VA<^FRl!jD$ z at Qaz9XNL>V|40%2niEsZe_`GW`d>Bo{sHs*`a#0i6OCjOw*Er{lM1p#B1V at g(4PZ;x*N_n at muDN-TBB{8SN^W>((OqR#- zMh%_LkIFr at AMDiX^tZJ at FsKp5A}Y0kw?cOY(YbR(K#q5TEH`_3H7fr$ zbjThjb+d`;gK7fWYKY^%9>T)yH9o+BY)8?Q?*N+4LOdA5LSl<|ZpW_y4{NL4D#{Y1g`!@)Ffv?ljz*K1# zYTpRYS at EIW_^*a1LxM_| z+9#?KYrR}#`aptj!nqhrXDl^Z!6H1eZ!m--G(1zznRgl=&^^hNM2s-Oi=2k)xOWbV zF9C%Ss3sb$zeZ{UrAMqril^!Yhf;!r49GD>?2E15Bw*dDh`e;m9n%ODZOi=$w3)2x zlsC2!tix^hS4>C}`*OX z-kDQmVY1}f=I<>NI&Dwp94|D>GPUx5wlN0k94SYM#?ug!>GDUp$l=`4NB%mcvBrLz zh at z2CaJ`IdRKaaFKP^vB6 zBdDhYx0N132v&;3FWJK)CBKpWI_dV;Q8Aak2++)ZV-9D$JHOM4D&ODS%DUm3` zmw9z*wF9RqRY-5yPeWSjbQzqwdGjGFk{Ee1w-0u_)CuNOmvkO!IRMNh%9z=RblL}z zZEBTk+;1f}PHTA!D{9$WV8;0+XEI3C{7%wN;|>e7_{HXM;W? z&N;^iEcB6N%Nu7!8vKZ)2pPbTPp!OWwX2|AiWT;kMlahAQ03(!{2o475V3qb{)f2_ zE-d>H_+R}^|GUKf-+}*s#72fv|2}JxrM#tpt%UNuWyyn24MvD`N>;^?!^>|$!$c9@ zs7gFbiBYu_Lef^eL5pqNP&N>-A6fGSxQsNt?Yo`A{3ai9U^$Q98pLvId){=I=I+_y zKHltjKi28_0 at sDo8DR)}-hTnIVDMxMhpHU0O*!`9vW(>G6S3PIIl>@(Nlnq{tgLUu zAxp`^z#Y7i)h#4|TU)fGpqKM1=UxfN(O?bVSl3h2byTrQPv5E=O at Gj!^3XW!Qg=)0 z+3+Qjr2rsf2;yBP%&AQ$;ao+|*W at lVg0mOJtr`<&yo2ADYuWVIg!7!kG^O~7MKIrc z0QX3n9DFOPF-RM^tgnAYR79V7CKh|Iqci^DNK)0t=i55a)|o|l`&@nZQf06;3&_lX zb%nvwVemA~b8t@$8YbV6ktfzbbvU;tDg70vUpNIZD5HRLLO3f!!5+=zoor}c at t%Wc z-X3DNVqIu{_{fX+kVorKoC9#nv at 3-6#8?Up$D?m`fxU4XY1tR~ySfG%o_hTDQn2+o zs6>t0XISO$4YM^)oU51zUvM1Njf>im0)Df{cFPupB6%@g0CubLz;Ac2XS>baZju=D zt*;qamk#ri#N;>f&mI at HT11BjsLVo{GJnu#^ish_Xub5tMc!?WFuc~3&PNhKv+hVL z;+ePyqABPp^t&G31DG0wH=J>X{#Q4V$X`Tn^L}mO2Ecl}hKOkFlA&DF5x~`P-qqN^ zHv2feaqWq!`iumHUfP&57VG!o at hT~VL&w9;P}Ok|?}B%~2|oG at kc^5{ZT~D)2f*Y! znPHS;v&e9?%UZ8qlS_vlRiLma(|q`?ae-v&3i<|~P(|{T;}R*mBC>fwA=U-T+2N=R zNovO=IV*0>by>H*FDHV5I&o at eP;;lkl-Bou{(?1AWDIPpRa~ zC%`7t3?uio))|8${PmCg>f&=~bq at jrGzRlu%~SvX3k<*6e at IM~vX;Y!APV<+%xdz| zqM3k#y6L at K=mi^d5%0!oU@^QO0-03CpEMrI>AljVqDX28My{K2keCmI)E|sR0Lh)y zT at i*&DySj6G<9Y!)#tOTHHVq)u8un$pYJaSUyT=eK6pHn*gi&&oI=|i9p!pg-*WzK zb2KQ=^nMe|-!ghyd}!EQ^82Ht9vKvtP=&DPq8wHf^a>WMRq_kX8O79b8}&4d#T3}q zr+#&1c*$UloWcw9ThRh9AM~C^E!x{#^5+>p)%Is(GcPT1+`G2)52vmALIvhW zXALC6`p~B+Z(2$bcb)Y5vW`SKv%p!Eltvdb;1u^qJiM=t;Ior?%0{h5vrYpJH$gS!g z<#?w%i4XLu>u0H?=vm5u61XaiJhb3~_OtY_ac3<14uLE?mHYY>$u09_+$(MpS2y~2 zJXol~oG}CIXFzbgNc&n|a+rd&_ws4llIIV%Ynu2!3kFxWa#f^_yy7Fwlk?FJSk1qc zp_12No?x8X$dn)N<;KiRrOdRu!F949UrZQdn`N%tpNSgQ|RTl_M at h5n0v%N;A1R^`ddo at +?CG(M!ZXM zd3c($bp!QSCw>a0W?2spRnpw&KxuKTH2gbyZa^KXMcw zp$ilDn0-d>kuiQIdeWyjR3sbu%0K&dU^XDxE>rs^F at Pbi7>?+p>4!fi0w0>8Ik2~^ zkk=NT5ZCcj^5*_i9tlXBO-zIFDiq at j3qi<(I)t|hd%X!|Z>hXTk}`ooFJ*Tq z1qBH7J|bM1PUSZ+ at i0Tj7!d_G*zy;}`)pE$wdQmA>8jfGWO&M|r= z;-5H{L?oJ%5j7p+3ctvu>Pncd6(Xf|bM|4#$DF*(5O^OHHl1 z3P|I0n4ZKu{x>&VPG9Z|ir8CGz8^70mL;{}Sxm$zMu|p>7$^%)AH4u-GF@^fNtZ%6 zO&48r41g<2W2N-*!M$pwniWc~NsnE5*02=K z;6B+g*l>cIbY61A-qnTc%%R5Q!7AL+S#zP*X`o^7IzpEbL!D<}*blIqJ)@B_tn~9& zhzHHajh8ero7?))al2kj zSx%Pz at n9-Ox)mG9WvvhY=f< zr-v+3HTfVVb^a4vjztZZw9kwIRV`#t_lj+t7VAm0Rfe9&7_P*Gvr^;+)1Bk*(cI>f zvGB1mO2-)D*y0e5UaU2zaM&@@QR9i6zVReF(GTATsIi|Y39)(49BQ>IqV=q!wJm`V z2l-f*e<%^$5l5QZ8a5xOxet4!acOq_x$!OeL)5=Q4V&&zsgR5(!+G_uV~wu`mOT?W zjg;(QTA*ZHT}CAWKN>1Gna;16&T)-|vNlUPM<@3AO!4%o42!7XNG$nZ;r=s1eYYJU zd;XTxHLyTHg8$Q!`k&9*sAwo`2%~&0ucEEyYYOCU%F_?7q6o}C7^ehcn3_r=LEA~J zH=@>?3mT3!9WZq^_2kKTO$)rmI*-Dp#7;AvN}8;n#+*G=QU_YWx&lWwigcLt++VI; zS62Fbd)z|!Qh2TeN*BIZG59*P4pnXNZT86{2j7|jO{hY}IGdP z7$bzH(h~l0467ktG8^yoFj|^%t!YKP)aIQX2G1h4SY&*coG2D z1mR(AboOn^qvgc@@Wx^}8ISQ;5*iv*#jguT_g8()UfWAaNqz;pZY at +qmU{@f>0s`@ zI&8pIa#PSqwB@>@(@q(G#V`fMmX53>^n`7J`_1FwX6&I7DpblZX0e%J>l&+A9nT9k zF9^fuFu%EUh;h;lu#`kei>tWGgDgzApNUf4BO?0r581u31j?*60hn9625vg+#wU&A zmdS8i`BJP4op+eiON34_ at _O`2VW{<)VoSAVaO)x5+sfmmN&y9o_h}D!O0gh(z zf*lCe9I0o~ZV!Uzl_c8We9Xu8ZWasL03~HM&5q)V8&`L%pW#V`8)7{oKy+Hf+U^mK z35R at mTVlai_qrBTDeSy7X4!98r&vQmcaRBA37%M`R$+oJy at dOmH-b;IH<9gF^ujK` zUpUVg2n{1Pg<$yXsq at 9Q#l}qdz$!2rbMAiFfrc z@~r|iayP(xj{7}}nA&iZ552U)u3ZzpGpGbzxWt->9p1y=<&9GWH2KLWw5^Pdj&IL~_^o4-eg{P>5r#rC_LxBA}{J_+`JK_D6b zqc>Xsf$;JD z?iKtFzukmavo#fcnay^X={k0s{`-CYe~yAJ_l2-1xDa}xU=2|gWOHfqK(&O`hKnOZ zVDIWq%SAj#V{7ozM~ZjTv#mO9 at a(BP$6}#7q;svu=rN#~cVPPcPF*_}LN{km)4aeB ztB!B^rkDeKAz(Y4Cay7?uQzB}M=xJ-F;_^~3iO^v5cG1T{g5M-MjZOJf{R)37KPZ0 z&;;s_T-XGfr7d=Zx>)djrCO!HymlM4(>VMIy(LdYxx?(eaj({2#F2027^A=V)=T@@ zL0F4gF;P{(o$}m@&S+_>uqbnW4czoQAE__^EoxqB(`XR)6ff25JCD1U2RiX8C>Xg7-$|$%9V|1vE|yn}OiSvne`>ROU`3bFeY_ zl)Ei?7u&vk at Zk&f<-Okdg(XUfBKxPkS%Wq7@~Kk%sX7f|+(Z~Wh+)~*gFVT~gkF&G z{lVpeDq+UbM2YU(5e3p4nJ69waUSnC${^Th^uz&GKUpkQtN7Eppds8IuFeP?FiJ1W zAxycyH?Xrmahl*O0F5~DcVr(xAL`u?^$9?#$}NG32zgCfrN^-Jy1DLpg*LSn&Ai2D ze^9k=ZF#-Rvqqd$x`*WE7EV#Bn}(pk0Q^sX`Rx2${5EhPpj%`hApZYD?EdQ-qpF%M ziV_MpT|(hlp at AaWWB57`OI&y}A(i+3Y3kK0#AMjUCxQF7%cE<0W>?AP1xR~`v9UvD2U zKvOTH5pJ%75o~X$7)GTdv|t@>k~b!~zi^3B3p>dN3MRz>WcxyB?8Q&ytLH)_Pi_o> zBja-ZBWYbZVDR*hg6!~nvh3M|3LkFjeGP}DLk=Hq+Y;c<4T~_6U8R3Wz(T+}>l7Ii zq%4FPscKuPlCdC16v|xreY*isGg;AF?_X{eDu-H!|hRou?3^(jyCL zf_{%}7AF#(A8m%RglY|oK3}AXhDK>Ad2!)sfyaP%qeuOoHW{N>`mNRR>;fTJkGtVp-h}jN1?b+eG^tOJCs9#4W7xC1$Ai zt^?O3#uqt-fjSL^MOjUrnbE3Bj4_FX45^6n>q`G{CN?x+ZDH*O+R!;DM^D9GsG4S} zkS!ini`z{hpAuToU`aZf=E9F at K{_WRchB*~FL(r7z$IK=d8%EMvO1<>>fp#E!s=`Z zZ{$gx)puWnch1;=jZ$%=Nf7kzkH6RAB$|%j!aTLaoQOgDBelrSDSz6f-aaEb4C4rX zy{t%!v%m>!ouV|I-I};nYT7>m9bM`QRs+o>iED-mQyY6WX at soEfCopJtV`juEKgZH z-|#sFtUFm#2C2*7vrOTtHH7V|AjG*Wv-HKt@|EmgKpDN;8jj3XrcZPwf6F3Wb~0=X zc3tXlc@}gdruyX_5o?5^ok&?@EkM zrF>2D+G4v$o!{Pzeu8Q?)<}x~U^ED-|27T}qVeS=$}z-olj8Y70ge6^=|w=Z4jhD(#lT zr+Tr*P73o3vKGUTn1lRosYd(GsnWt&O`@4#YF+-0#gw2-w6nT?d z=Ek~B0+iH6%c5nqlM7aYb6ti7+`Q`4+&R3-fc5oUFqNW_YqvygVK4!jnE>;{Gi?7i z8op2X$2|{Z<0d0f{|cg(2rFA63yTBwf}4FdF>Az_`d;{>m~f at hjji4bW;`{@doaOn^~zH27sI14ngg(k8Hjz zB`Q2emezZ^VzCY=^^BOZM}CCAuCU#($eIv$>xiY)%USGIk~mM8ilJL?a$LkPXg`IE zi6?BBZ0 at BN%!PCIg%~SGa6tZ9lu1L1iJK+8BGHFZS&+*@z&H!GAbmLnwm|p~F&Yws zMy#Thgq>DxviSdE?VaK?i?+4TR4TS at +h)a1Dz^E?HY&Dlzd^;eZQHi3>e{Ez>F&M1 z at 9WdOyKmNSU95|BG5^na#+-AE0f+%XbOL86xSCmu{qvP?3)ZMA*Igj_ArAhBS8IUq z2th3_7Gk2WGb~{MUWI<$J~y0`#0|aIwI26obj$z!-qjQ!(9QPLRvg8X$*3QYDa5nulbq#-mqr|@%82_Vv#(#_tcly5!D^freLK^<#<-_HP z*TmOA5)q&VfOXudSMp!`5r7fp&o<;HvzkP@%$10C^A#!a*P59>*Cg5UVc$4?~p?PZTXyl`sCh1ZR~``BrBT z7F`C;Gf*2akIC?ipK4g)+=IJO`VKU;2GgpGczXw?>ixV;AXas at o_1>mM0N%=k0Oq5 zl*7jU#BHMAC>Z2dV1O--P-ZQUQEm(pn$Iv!tf5o9g}>t|dC_a*R2-VjY&vCR?U;U$ zJ8!JFPAArJegYHe5Jk{_T&uEod#Mu3h)+=7RZDLN>OhXwRDgZQiug23(kuGwu>|_=j5%445qPq2Y*ndhUS{G+q99-fpk+AUf at T?w2k(Y zRT?qoYm0Kb*SualDYXTp{>=F5NXzj9{P at jG#l|?SG-}Y!$VqXh?CWl^SR`^~g}<=Z zRI59jHm;ukYk;k6Y8CzP6#IUXK$p|k3B- ze(dY^yut7A_4dA+3&N0>ILKCI64$Rvp`G{wms?VsEe6A at nZTB&W9*nc3QwWW^qMd# zN6`-OP8OHx6CJLJs=C5PIl_H at fb?v=PFHKa(ny(ok{zy+9J$EQ)qZ|sz^;UjE;j#M7Rt?#Kj>`^hDT)+NJ+*+_Tkceg%w^gzU6q$#Mm at 1t zh&|1*=UI^_sWN at BdocLEebq-Z7uyZtTX1mt2+tXI99I~nbxjt zyi|KC8{055rCabeN$4)@mxArMkx3%NMu3<))-;=GqR7XlOKyv0KJ48kwXm5FKhRKn zwC~|SPJPdamF;guXb5v8d_|RPH^ucLQ{9=9Nu}!e)HRgE z8iB&ulc-E$pP7^9j at QnTs1v*CL{?`97k;!LWicj0wgRQ7kL2 at 0VIDR}Ht7u#E#ps8 ziMeI*iO09ZhMZo_J$=e6N-fleBWVTVmn z4|f71#JYtK>`g033O7VjEm}Q|sM_m at rGG_0%@zgPSsPO+j%JNq`2+5Oe!)*Pj4 at 3@ zJ$N|bm*TXbe9-3WxF`rJXRp*BCR+Cg9Jjm)C^&vZF6|8;Xk*<}noaQ~amh{sbKW(S zqGNOFBHB3dAsRv$(n*67Eo5UPyl1Uk zL-!%ufIT{npW$_-D9^QAk)w(g$*EID%2~lYXRRMFbuDy5Jj at X;w=Ej;>J|us$PE_@ zl95u=u?uzKGY;^%Z&vsv09~S2s~4OSw6ECtfy|w5&adNt=?r%pE7SCk`%OCkZI8tN zwfOvNZ at 6Ub|ClBFXIQz}vrm)b!H2*3CjuINpIygo2W;_jUhmv2Yn7u-A292|8Mbfn+NF z`n|60T0xifdlfZbpNh41i)o}+j(1iy&Q#TweO3s$Gm9I3CeJuZNOkpnCu_hpV3Vy( zoyBHe-=Ng=odn!8aor>=DZ9-;QjPk>#>q{lg}uu(o>JEZ&eq0pIcb{ST-0nDBxKOn ztZ-7vtS}oC(yN5TC*Pcm$0#yZKt$yY0gGi-NBb>kCI*s@!X(#8C0QdYl3Nu;SFsuUiKi!ek(Pg2?F;|ISF zf<{uU{UruotwOik2#2rkfSKq_ at J53ha_Xmv7-B@|*sy!NEW|~tAk*e$g&o3kSHjLQ zRRhEqyRGmRoeC{j z(hmIDp$3It*o>PfmM^h12e0S_Zju5f7>x~RI)lHgjDfIO5O3Isr!_RaVo+54&5W3J zBRuY9pEz%gmZcOyn_q)h~U+c9m`u|MC54$fX6A$0se!_W? zX*O=|4-v1hnyY)cKCf at qd(m~j9apDEBI<4)y(WJ8DbGR{fZ zjv)SDq3`%JkBM9e(!)22EqW5FAA-&hj2Dt3tPQ}kpP=UR*tb&5bnq)YZSdmG67{OX zb!CqH@*F4W}>eH5!MfGtN8krxD)&(_VBP~d7% z3RG}zj1gwr3<(;WKi$+L`E2>nr7ioHG8vV?Y!Ne=O`kx6B5k zsE8=)>aoGRmC&mkYy)GY|v z#FIraXyxe-S}83(4MG$cmlnbW8i0MarXAGU37)s(A>*-d#Y)h3=_84 zu62IU_%MprbwOma(vRqoPU|b~f@;M*9f`FcI&HfoavmH4N?Bdl2P4uP2H!&GUUUZS?eoo at wd;-OBjBfEX5=}b-`2Uzi)8c+EBuO zl3K*Pk3zc+jR&b7G_Jt+x}SPCuLB~%?V0Izod~C7$S}z6z*EG+qn^BcnTX;8)~)wM zVW=R&E0EN2(!%BtpKn&ebe*SEaB32GculVU+`v-G92*> z#4qV~qQQDaDG?Nr*Xd~DIr};*z5f3Ax_TQ#t;UQfG{B!k+EHVsw#ZmBbTBU&e>$87 z&Nbh4q}!f025)%{IbPT5h5q;HyPUd)Nt1Uh#WH&Ii0AOS>NafQFJ3(p%=5p|p_>tF z$TEhqX at 4mP%JnrzCg(O|d&f2#GDgQOd-bFT8k-`4$mmZcCb$IIxPh%_4pcb_Q zsa|sDpIgMpmwS|;FJmb_&Sts0U&AYrSt+Hw`64BM{2 at EYNsueNatLonh&4kr2R|%t z2LLw1RkYQS!f=E)H+l0NBEfqU(2qKiXIXZKm5ue#3-2!sTUBI9cqbl=8!NZ_dBhxe zs{yEhY*Q(Y{Qa^RRn+O5jRDw>h1-aH?{u?b&V7_dmMCDv!fl4qwK7$I=KQ3_CDaUi z&UJ9cyI|S^HGbiIWM*a4c%0xp&XbM8eUTSW#jRe7b!lH-Xc7n!byd4O!AVP86j1!>!gA!L znb2n#`DPgIsUItT)BvPkXP6kU&o=C at mYiKlT0He?oIqGRsGUnp zW5e6ILbI_|-%ZMkW#xBG+d|gRoFN;~7*lN-2s|}9DTk6#X;p~x z$Bl~iii!6O??wyMz0?t?-CNKVp-XdIeA7xb zlkJinWVgdj*^l3-yWz}=h$z8QbNJRtqw-LC(w`I%5Mk9)xr1#88lcD=eGFr!g2qg% zYggJ5Y`A8XjY-mf(oGg=2vnA%N#0MS%!=o&eRfu4dT1~SsGEcranIq1pJrY7>Tiv+ z!4#6o2B=?hO-W%N|CZeWT4{5;Pa8qql|l-aCDD=o(kiE}6FuDy_2mIFDB3|22bIYk zi9hu?7J5M)b`gEV%NoMX at QcSlU6RQ8s6L$*I$#Gb=mBbVg85!c at 1Ur9X&1(7ov%=Z z^^px<{HY#S1&rQ*3S=R>I1?)HkdNq*$J+YH^7-vkG5ads zWKiiaD$sv7i{I^)GoMf at J|V(w1en95Qzug$OQl8Ab;tg`9fU2(L&BgUbSV!&s;zN(GZMveL$8;UI_EOZ!fu zcE{r{&#B~4uj}Yj1P&3*aRS_0x1HI(!pbgQ>guje2z5e-bmybHosFQ1RPD{H at l2$i zMt4kmJVW?WDo7x<49K at k(!@N=s-(>P=J(hU`?eE9_f|)U$7odQA%|Kzq9+4fqIc5# zS-yH0OyY{EKB*B`~G+nfe6x(^5=YA~og8@?B z^zg8MZj&oB)f9m;p$of)XsklkyZJQF?`V$BT;wayI&n8-(91=LV!OZm6fLx#)@3lx z(nxBKoTiUAfMP+kt*xV=G^A%L;gK5EnUj`l>_SO5MRTz($r|PjxM&_Qx`5|zWhA$m zZ#sc8VJ~G?n|bH3EaL#qIkVze!oZL;UQiXQgH3q+Q^s{GMDMVltVX5?(dk~muJGVl zPY;y8(DE6)l7xCO#!{fGe5tXHi?p_B^%~)ogmDdt1wJRuo_`wS0N$B6+nQ30Q;&$7Zss#d9Q3!aUVQV+cS7Y-0{94KX~rJdLM!*cYH}z<9-MYi#T6t z2Z3%AW4sVZd`G;2I1Q~d=88n_NutA{V1 at +6a?#9ostCdREmT*x!J|N at 0^6kQQD?xR zdpZnt#ak7W&T=zTbWHy}(|4iRPzA#}!&#+^(vY2%m$+s89 zoWq|G3Gu^%1zyYC8p!o&#w6ZSSk>t?wIxQmteG%$DkE?VeMU{PmFH_oO9kOJiU1U4 zB}FV at RX~2+``kG2Txl(2V%VooJvTfyTiIHVIainTgjBa#PPM7RY9$!wllX`ay-KBM zOB2EDZ*MW1*YqFA`auzY4_mYz`C%3LqsqA4lxX=j2XzEK;SMcquyJN$(5sc8ai{Gx zyr5S#uN$g;LEB7nKJB*kj8re>lcW0WGv!q9EZF;F>@@dL!LKj!;{$0<@OXN0|M2a% za#fD at f{5+=hR}pIfqt_SB*n(ZZm-zsEB%`NDiC4#GV`iAK$~SZz%_2X#dwNv2W^s4 z$}iw;ZItQ#+CPjFxfu0m`d_SxUi|9oa zy{6%Z(9if37&d01h_oM;-a2C%n9c2zt}+MPFQ^aTD1>l`IH&|4QbW9(rT{}&+M?5m z%WSV}?&paK+t at GPKi>>+xUpGsB6c;wrU&^bLoiti(lAA|;L at S$kUOFb;)TX6Ld?vu zIrd)*H06_J>x=Hu(oN^{q?SEqhg7USvb zS^2cp*dKD09fOr}E;5t~3R`sLo^Oy4sc1ubE3>N9erJKE z20E4 at G*hLUS!^HiFqU!bLN5IhV(=Wq9s;%Mo7vuY(K~E;T~@cHsBg{KqARKoVnMG- z3`t7Qdr60u&akg9z||W4d6^-G?+sO+8|n!y=}_KBE?Q1e>vSHc(tI^MY#r0u!*9Meh)%G{yLkD6Lmas%NFiNJx~nW z`$jPLW-z}N*ZdT=gx6wNC(hUMDBi+B*is0)o8+l5Y>zNP^?DN4MifF at p@aF9fjE{6 zp=*jL=BgOP9wM4pRkxgT(R3_I&aXS%o;skLkKVhh+kbQ=!Xvj+GdLvQ21X+30fx4$ zO!b%!SM|ApMOmQZK`6B*Mtw z?AFfS|BGtu&%gADel!f*2L44c4EEnYUi+Id{|_W8qpD;1$_u-WwmrfY!&p`pgn+>< zH8q&Q1Ci07_uypl7*p*jblX==IdFkr8DGIq5N4jUw`=2i4fELM9XEblU6fv2SA8VZ zaQ(0D-8siT(_T|Ylc9otK-y*O&T&`z~D)M zcviJ}=~(w0Ub>h!o}jjmsiRkSt4Tz-o890WR#XbiBonv25LLa&QZ6rkmKsGi+q9 at _cq<^Ef{gg?PI#Rui4$+ClG*yz-!6kS)F zYF#}|KPkQBQON~Ze030%?hD3`WQztLU{OIH940K=syY zs}fD2%_!3G+y(ZK(tsMESyOZofrIOp_al_axuOVHm&7-g?y0a{1d-dg1o90AGz69C z0o%C}&Ld8%)2*+UNi at wzNw=pz8$l22mKATEd4rgExAswF at wTuj6!J!^1IuZ}K&h;d zaP61g0W>qYjiF{ED%gH2VMU|}E1n#d3H*C at qna3H+z{OF=wib#szirv%zW<~fzAzf znuaq;D5{j`RdW){VBx1u*(HAxxq{*3=f@;czCb!PGSEkcT&STTr==}+^wl0u?y(-yo z8zgEV8ZSeZsT5u at fI37jS6KTQNrvYR#ryHgOHb5Bp(Y!titR> zUHfAIPL)dpgQ4zCJbPtxp54J%ij<2lwsDf%H^Y>-us%`SWOgTpa|Xri>`00xQMz zV4#B}Bos!aV$7Wl6x-wWrXGtRayL9m-=u<7Qgd at 58?S%fJ>Ob&9(}wVi%)L6+;q+a ztK*_5GUf7Slf;b!H>6O#Q40v`uKfFuzW!<@!dcmd-7GS zU#!!}QobLklk>c2`0Wv-qu{szoq>Z`&mDLP0En>Co>pd?nxuGb!kekn*6;)pwA8$@~T&sImDc~3|BcJlQD}#--)-ECs%i6ugx}E z`zq@XFY~^)HU+x{$p8mNN2A at wGz;Dq`}c&?A|UUBeFv~Tv|7Y(Z(x@ zy#Xrv)j=8p9)e4G862sQ^J~n at rbL^<-|2hM;;uo#XHV0%wVx>`f%j=U8p$}kEANBb zNSiK<^sMEI>6a*`+v2PIm<^V92MH|7 z;LP)YqqZo}{(a?EHf*&oa}VqY-Rlma?ULp_U44d1Or?%xF#BX*w1J+JR8S`2ZN(_! z0H=mJq+&!OO66w6-miR9wC$NvB#`(&L}FV;Svl37Oj*NVJ5>yOD6MF}ubHGy$`BTu zf3 at M|RUui1EFt$X*XH^nDF7%q;3$yWV>r3v{zV(=?K@(%E9O&rb*PO zH?B&5qZF0AoO+bD=2hL36&mjk*T^e?qRJ5b at PvN_pJKs--!H at sN&Pv2Xk0EbC+)Di zQO-44gnZ>^cb@$nj?m at fn%SrR4sBA8iF zJ$pw7o>Lv{MZgU|E$Bl&UB8>7kdFhs at i~?$g`s!7G5p5&jc;EocqgVe~IZXbd&0K;{rE)XWAl3{W!tg=pe| zAD2O(5ynha*?LyBgLQ)ulAxJnHglw%^AFNW&t3Dt)NBF{ARuc?YM#R;i=(spLH3&C zD*Iv5B3|uxvIcbUwXvD`QRg2&yR8eI-|qy1pWGn0*d{Nx#5vw+lx{Z%q%%|nti>El6 zPrj30O}>L(oDIfZUV?_*c0Lb{zGpJ;-25`Z@?lhF_6ntkm(Dc z=CaYU+J+bwX5X3|*O=P2kJyuJdDG@?Ob+&&}@nENg ziBpnj{UV?&NOUP*m%%5C8Q;B~l7wzli& zlicc^jP(jD at 5o{FFz7 at i{O_`ZM>5;?w@`vvDaFbHGlo+$;!Igbf7%{+(OKC*HL!iDy}`xc0KiN8%dm#5aAdfm*t#txrv4TovH$R`F at +Xr%PC4sg+ru4|3s z5qr8-FRN9z%%nfO){;tylynw*=#P?jh)z+bU}Xt=YXY*X2Y0uxnHH$iUgr>Z<{pAc z&nF{O9B`S_?TXP^idWsp^064~iR!6h0J~g at 8T?`t*5S{{YMK1`fm$aweLizRoY(Xt zKZGN1*8@>xkq%k267(@mky(<0wXx1*%LBNOqi=B&`f(};(OE+VU0jctTSR85QJmsa z`S6PxX2t8;Cr?7yJt%&LtiwQATe38f(rl6$Yp7B8QEufdru>fM2+**jazn!#Gi(oTBWIU}<4PV5~)q14OXq9z174`VwR7jXVM at A^RV!tC2uvv at iPkU5HG7=ED^aZ@}S zk_t5bh%)qI#yVR69&_&$A`{umjPK1g!HDIG25!tR=1?O+_My~UePacYYy1=E_s&>1 zwJ1P2zSCk0;54_*LN~5qi`^E{%P#a)H6oO-)vcow)us`{^`{WUw|WQhr7%d4`i1q2 zWVagTE2Nv&9qyRyL!?*mmXYUI(I)}Sd1&M9_~MJu_x){@ufm<~7sAeCj&(%v*!`>k zO8c1J^97ByQjOygl2H4h&`g^cWNU!~ojr}!FJ<||AND2>{Z~dgKTSFv7yn2a>&|YJAK1V zk=9MWDqS-hwu<%WqctHE3{xSBHk%LjY5h-Rc%0EZX^8t=UL`1F!>aI4qX!o>^^S4{ zFP~bDDpjS^`jpI<$seXdqv_eQCp#;jw9nTrv>;CNa1bpeQ1|+;eb+S43w|Cq;-j78 zKY`I37_Got)*Fuo_Pl*a#0JMp;%iuCJGdX#MbX@;%h1cxcC2#BqN8dV#SxOxoC<0D zioPKQ`BIN%>3Rf>W}*S7Dj6g=>`E-<6GAjSDQOT^dAo(XiT;JugK$yQ0h7Axn6Nh{ zR{(Cm9bUel#F}VJ2?4goDrJl$5;El5ata-HOniOcm>m>)-YV zfZ3>@KHJ2*$RTVa)up(%9$0HFAa+Ave}_M|vmR-Fc(5Mn!{PlNeoe#2n`zg&^SkM8 z(_q(2o}lY^?S?=0B?pl`vs(P7vgU5nXqPuGl+mQ0Q{Ed#FK$wu_C-zW^{VDZ?qHYK zq8}5;l8p=371pbM%p2U+X~UO3Ow+5AYo;g9%_L#`!1gk2Gl#KYh|*?IHeUCuSxngm z01JfLKl{L7gMyu^*SaCnv`=Xur0EGriw1Y-%j;Ki&8^1hh+Y!#qbr;?wpV+Z_*bHPJ&U=|MfPbaO&y`5r5!~M6OeCt6USL`^ksx)@rEI~ezu2*1 zlx-}&bVpuw=*-@>0>9>o+_tv)=DTgM{~QUh?gnFIf2k at saR5y7Wjw!PA?q2C<8dH+ zT7Y_{gFKob-!{nNhG#Ba_798iQr7cgU=3+)Qft`oau4KA+LuG9I!yI52E3Ybc& z9_ at B6uXqfOyHAt^r;_U`GWY}U-5Y~57c?U6rYn^Gbe>ISdo=IXR8Ktu0~McN%jTH}dbtjZ zmM(#{8$D`{9dZ+yJ~yXYzMT7%{$$sJ(ww>IZy3zPMWMQc_jA%$HDhUe+`H!D0|}+O zb}50=Lv2f%(JO#4{-!uP-yOQZZ8?z>@g-AqCQQd7Rw=qWZgY_RmVBpapmHsi{7k?- zf|u7AY~yh at 8}`ah3ub at oRKPt0&bd?;J{mXy6P=ceIzV;Oa;g_W=iaQeTD8_QdAGN9dcwQK#KiPIn>ZW2DZuEoRX5lqI#2--- zuJb?UE~D87ruXc{(BWOb)WbtezW!y87h95W9v2h at Bo!P4g!BK_Jt~=+yI31KO4-=B zI2#&So2vZd at n5ISjVdyB^FNTjI2`u4*e#*Re|RKGKzaPwEZq|pAy-i>Q-VPe<0i4$ z7<6fT5|4>KLEO`0AmSpL`k)%9K#h>5lZ at xOn7U|Yy`P*|yT5!tW&~-|pf3zthaK6E z32!$=n_+U87M&N3%wM?|5!^Bv;ne;PVJveA8#35M7-25Ogf=T9kQAiyK6dEXL#m%! zl7~$AVhq8w!fQxXKtDQcEHvV|t?Iu|eJHgXhf^9Cl++iUjoBwd7V8>76s};j*p3Sa zE`T#injI9Eu&a2Fs7Rr=W?#4{cwpB;>T$w79UAH^QyaA$4}*nsA8b&XU3G2oP(P&Z zBz7`+#DrKUHL;X)9n2?BLK1mI`pB-d- z at w?{Pk9P9P#Y2HSp0>&7vu-?Hf3MuNNN@*mBF+9JVy8X;X}K-BE)Ja%jc}Fe-t#k; z(hv98!9U;YXxl&k&I=rl*6)-$&`F#mB!P18TPk#!%;bdmv;n^=)sh7e4FHwKW_Q<6 zD(6g-cobLk`b+qobj3 at _Q6sN2E#SNc&`b%z6$kSn0-&=40Sqh!3 zx~Yt!i1ud_T+?4{29I at oj^vOQ`Es0SA`J(d+C1sDxWr|1snN8$o-V^r+E0kFi!Cvk zpRJR9o^a9mO4uR-e8PTuH*5Q~<#_+ at etFpr#L*o`6p3|jBm}9?8jHozFo>D5#RL0U zxTu|R-#;pp1p^D>S%voM<`bp*vOMO at G1RcAuJEdCHN;A571blhP~#W7ExY9tz&p=i z4XAB0Lcyc$nnJ;e^+DcM%qmI?tn9X4;BYA^x78xUF1P<{g;a*oy0wM7+ijMxd-9TO zwB4jrw5rd^(yJ{xQrNjT>G)-=qt`|0WR^EBGHluC7O9sl;hQgM1tgZ^*%`5STZ*(X z`YrbeeKTA^)2(*wm0`JM{k0hfucDxiz+||WNeBtA1889VJURsEqEP0F4lxl`M zC$kiSdY!evu0u0l}MMiB`C9FPbb;=f7snbJsVs<9=g;g z-oT?fN_2str?7Ks=X z{r;`sdqAJWHkDBkKAG(|CFKNZLjPhGi8!U)-S;0P&?3$dP*7Mcq9uE`ig5cZ1MOn? zDHP&8%td2Hiyp%Y at _io!Fj3n`>r=i5&! zR}#`r)fCl6#L>tTr2Rs(@~H;#b4g(RXhlJ#Vu5iKXA%%@ zRMZYa;cesspAXfpnChUt+y9IYErY-}wZHg?Lx6zD{u}rx+Z#GMnf}i;yi#TRA7h-q zQuNhtWNS&(J`{h4K~h1U1wvTQsfCM{D?(k5*UnkR at H%d!KWz$@b}bA*8b>L7DGs#; zl8{(VKkV9?n;*Tqnz_1m`TTi-{sE4N61HmwYG^`!fD*RX1STe|C+ttGHZQliY5+z1 ziXdXLeg++K2(*pByvn1!;JC&q(gbMXaPn*{b$*IsJGed~f5$oq0l;{z?-a%pP1Xa= z;1{|~AK~*8xN2mz;6yB9-n1Tc1J|Q_dt87zt4nd~q|7B1D%b_yTxNo_%I3 zDqnp9rYpPs7hp=0oX;=XRc$f0rA3rWBe?50Oi6((%te0m1HCsbScu;p7uU2GT}#@8 zvTjqhI9vDEMDJ-VT$OWL>C9i8##T)1>#Msiu8ORxtXs$?;Bg)Z#EG)oT6=ixg5cLqB6l_ZlTRARJ?#mCSF!jlPz%RD2dzpj@%?aYut-DMc=ZSEbtYUxfRFNQ`Zq zkLKR!bq=4SGNUDd>fq2ncb?&3H9`Uk|7}CCSKr6p^MdJ{ml6!-NKOv1{4R;q z at 2}m|giPljW+k`0{mn#<1NBZBS8-|Rj=nbRr5H#Jhleu zMR4GFkH|7)n|(0E%ZdZK6<_~yjs<1v$4CVY0+L4n0wVqY)B63d3+h(RxDx1JOP&>E z)mFnRfPw3Y?zvHeT`?oD7nq3;bO!r|0~XL0h<=-6ZY)J66x?{???WVV-i z?)x^X!nczlE8>k zn#j4;V)$J>8KIi at VjPDuBwcvIq+NZ^T{uNYRu!+FP}@D6*r3#WeL34OyX)>rQh&eb z2MP at F#MXLjn@&Ebl_ko)30V2|v` zB9^oT3oOSh1o+EN_GLAH>`PKmmr$7Kn)*1+uvX)lS93{AFPRxZQXG%Kd|NEN1kI4X z33ZBKIA-DLgq>-q1?Mhn*+4uh2a#&5tn2D~u5`tWWz?{ZL7X{fNCm!0W-`-i0gDXf zlpoxsr_7Qoe#PHiVx73Ore0E*Y`+*dK&rn(c+z0wIb&toW1YK==harkOg{3njY4?5 z+_u!)Nrk at myIw^n)P#>ao^v!SnKcLD`sJ3FwfcUe)Pa08J9m-AD!Zm|m7P53H{Dj` zPA*B at m7^&`<9+<7z2|HBplW30Pa$`#r@;@R;2H2#tCh_dwmIQrf;OedO>lWna;3y` z1xghBapGbwZo-0FbCC-F+7SvpbcdU6XU_!$TqkA3ikrPswp26uf-uR2 zyK-jI=Epn>H+P9yTK=W?n~`i2gmK}k%GksjW~B!jr%1~xbr9mctSuGAih#QrR^oD- zcHn$;egCFP&S$eIO?8*A9xA|N-I{TKC})O*_6U2|w{;(yUZPsFL#b!e2Rd|JX5*5+ zWbMwlnk~OpR!@OOgy#1weGKXoQ)WZA84{e8L^M;)K@#&Sou$*Bt#{alRRIqBTMyQw zA88Zg%&D!yw1m~uvv0!i`{A|`0tCfj1q$w%mAIpmWZ39L-|hE#59o5E(uxA z?i(FX|3Go at R2b2|kCb at H7)(KP(1mQKE(_PH+~~^(g_a67Rl6vWu^m~$1 at y5*cLgYiY#khz0L zxw at k7Xa{cxipW&|sl0bkdfK61;J6DfDdP`hN~w*E7|;fgNs}5b>{(urPZGKA;ONL4 zjX+h2Ao6#%fOejcmQ0{vL=9!p8FX3BenTWDTvb1nKh}Nhp@?71%DaAHNHg?JH zl?@XNU(At4*h{6OAPR(L;i_&#RH7loM1IryD z^?G&P(YZT9p7&x~2>td%>1GnD^7*kSl0X1%``KjRWrW1y&m^Lf4p9bZBu%@nT~5B@ zpa?r=zhs~@80`U3MK}!6i3i_k4VsY#_3o%+p%c8bE&zS(6$Et^Tb7!glXaeH6*x^X z8cnv%)|-Z_ZS!@H4C71fqbaq~ER%T!fT3`41&-?C`d^WVVhYBzms?HsP?$4HJ+3Gb z#Hf22eiTLB_DxMVtd)(;_DxZx^j*A0o$ZSei_{6FF_{7vg#_ASztZ)^tvuqs8p$NT z0~^n6NF^$Wvh$hSn9 at eRQ`E&0r}lq!f-R|kJFo98XX9uV08C<%ToML7PrFFs3LpaL z$d)8CDX9-7wd%hE{*(tautkgEOIb05e!8I-0oYRVSxtKcBo$JS*CV`jS=Jumnw%9W zHWfv}g&!Dt&$%_lH~paAyVZ_NUhSjXI1+g%YDaz(Pg1M_1v2!D>L(vY-Q6%d=gZX9 zMNsR>DjK@;5h<-re+FgbTSh7^z6KvcU8uK zmF!|;4KgmXQ at z9wHQd+fggX>r>+e*9DT5VAL1aPFVRnsp7L9+OVRofNU5g}Ly<}TZ zk^2a^GfY29o@^5?zqLd)-GO*7$bq2fEFfP^;s*2jKdbaq?$ky1QLDJpbhdjJ+EYuk zJVp1Ba at w3N`TePY~YvEEg2hRN>Q2A#d% ze*5|$5-=f%^g8t*qzu7_B~)EzQoSJBt1O~_*_w^Z>Op~lB7li5ktH%QRmcmYfm#rO$r@=C z^fB at Er;W;H1yAahMX1UAZoJZJm?>{ulMd6OUW}+*Q*EzyZLaKIYI3c9%6cc at Og!+n zQ~Gj$-t^k;G#A|FzCLuzLfePzPQeKJHRINoIym>5F! zK9EAh at IW3g_hIvnF;}>?9|`OiqY@%SRAB8j=W|a9_wGWP_OKraW!$0i`yiRldEN#0 z4iCkAy6H)E*2xuLoCNq+7c8n3>;fhXu1E%1pnufDzEVeFo) zzrMNAMeI86eFl$E9>xFtpldTaG@#~F@tc1Im!BllHok&0<^2nmow!t7xDTgBtVjIL1`0Izq?iUsuJ%G`Xsc>?jO?(OfWbT+~b)&H6&u zr)%(8tOal_<0>UEl3Be!XobxDZ=AhTurO_tEV|xh+qP}nwr$(CZQHhOzst65^L!IC zbM`)e%-IvOBl at B)yQA~T%IdDFv^pz0y^eK0FU8oju2`%zv!r^A05B7Bq~ho+rbwO3 zYTDL%QpWN_CAX0jCAxnRryR9%TAVMrJ&;4iB at dS&x;-LaOrKXukY*Iw#kSxvTEwgN z_eV7_; zUZsrXs{_Oc5Zqv9Djr{BRU7%3Rp&&Ka&BdEl+PD?cF#W4={3y`Zh#K3 at Q!^XYN8QU zVD-$%6~B}uW|B!0QH#g8 zx=44DQvxS!s;wMEg(+eMvBBfT)gI9v#rnWP%DRGX3s0UuoR>`DM^MR8y>V6A3FWq6 zYZ`1#zuiPVKex`Fr^%EyCTsxyb0Hn2-vYiH1E{3g7$IG)WfxasG;C`_jB>tG(Wag# zPRx`bO+9f$I^M+qF=xm+{vLKA zfpzRH_*@(;s-g`0CFxZLvt~sft{4o%VY at e^EQO9M-K>9V9kA^}gG!?tG@{$3LX~cZ zfTv#XQ!`;rSy>nEK*qH5Fi3qOF=1k=Z)Dh&5Co)XcQUtBL>+0WM8T6_^oit5`Q5f4 zz%-;rtYp(^y=}?!mJo_}NQV2RJoNW26pU~64(dyBsP4`Rrf5iJ99tVqZ`Cb=Q3?=-2#>uGaW_XZa47>W)-} zRPk6+M!v3wAX*bf?JhyfzKRsmzA1F1+l}lt#6x|0NN|6yKFe-vKqxs3SG&>xj~2z8 z9i#^L*eh4L++zGyPh4NsH=n;R+0{cnuIKoz#N(yk at Q&{g+RI){h1T at vec|^Qzjg-+s-Ou at L(x>uH`BqzcUpnRt*2gcSSvLA2 z7-tE6>UcU|HmZITN#aV7l at jOv;YvD0-pIU-XS0<=CDW#i`vlL>DE44Y2J&IP2vI*I zYGN`en at pmGtZDmo16nmB4P+uRKf&fP)7WdSx?xwYB+~7R5}H1cMtj$^t{TOo?ZCmFs4!x^5cT1Z&^G02(nVb>r5Kv-Vb88^OhsdjM zLfS%e(e|m>A@$ZYj@@tt6;xdCnuW+~D-&)Jij at S`j@>dQ^=6nBe#j*UZTmhgqKT#4 z-5DcELsaAn)^5*5&K06>M$$oaH_-R#u6FO{MHMpGluw{SqP|4v1`fHw%Zi$(pRq at 6 z?caE6u(E#!S9qh9z%t$}0BgW at yS^k$wmg&LC7CAbQ_#sO=@o$Kb(E7Ftmeo~3q*kD z2~3G-Pxc at Y26Y+Gz=plCQK9al)yZ+{v!>?(aV{tR;5zRCTIXvJ9H at uH7+ce!e9&Ll zmCUV4mG=1eq9zz2w!>$Qr#m?WIb(oLHmya|_-BipN5?nSFjK`d<(R at o4-K`a4=zw_ zyZ>>Ze{-Y!*$nR+pel9O84MuiaHfED7%9+l5GRKCoi1$U8VRICp|?0bi5*S}CR~D5Ax3;?I|j>S zR(X~zKqI;ooyE00L+j#{HJPi!Tm(BS9Bk5TnB){5cQ$hV{n6o}SDngeHHx8>`UrYO z4;S=s{3H)&!D#|IZva*{eih7e3>q}?*$}~+i362wQrciaMUJx%of5`Q7B`^hv;`-- z2uFJkM)tm+;xACK1yG?V`6BT^WVGB9 at P{{3WB_ztGQ)@Wy*$Ue8Fq2l6Lby!` zm%)5EJk-IdY`8z!g5mJXWs=Iv9F^CW3(`8QSXZ<%cOKb2!oKQ)zSP>BGnfhR`y!>W zXhaoK07ut>K{U!nF{EMCM2Q(q^Z=-lJezG#EA2y-jX(O5;unU26#);mvzU?}g84Z; z!ZHpfGQoDjxzRy+#3}+9pTG>e1BAmt$*{36A@=}qV*{%Eo^;FlK~Kmob;YXmsd*rq zZbo6Xirs5Q`uy~CX8#l+auJM%14YYWGS`36(<}R|E^?fq>{~c6!6jfK!k{waxr+6~ zz-)#A`6CBd`v6~(gMoZ-EEwHqH2A}ZFK~ti{Bpzum at BPnK`J at L9V!_LHJx^joS6;L zoqcaiI4}!`)YR&vV$1m_zQyZ>Vy%YN!0pjtjRqIGEBn0q&yd~tux?*ce3~cppbn6W zNn>0+==Q25HT^3lmUR{y*j?ko at oXG>IayS-)+LegQIjy~j-dN#{srf5WWK)Y^S zdV}>~T at 3`3mmR$NyJel=9=9Ult)PYjU1|7N1uiE(z=J=Pac~FNnsumf0%c4(2mTK# z{L5n!!9}a$dNCw;^@>-BfR((M%(iOGwn at Dg3hC2q zw~D=;S*B4m3?7|>M;Or)i(&c?M9774h@^a?>0fX4^c}r=(Fs!ITQ>zPQ4Pb;7-%fF zOkiVE<=O5IFcD~J1ODSQt;A{!+Kx~TxA2Z(3LM&wT at HC6&MHGBZeb)H{q_?gG~+m; z&-N3~d%j89Ng6?0D#_w3D^Jnl4pjb*hXDd0<2B^BO{LtIzs1#_cVPDp?>li}XV*pR zLr*`zJXHfU at lii)u<&+#DWAI9M=z6kTi`9q7~TAzy4 at rkC_n$Qx%s2Mq1zV%03Zer z0D$FxUK0I#`7@*b>4&U_ at +;fe)zpQ74-8HX0whyBVLOOeUqi|eLJLR4FaVFL1nJy} zkr=YAu>}TySG2ssTiycqF(~GvqM+5%OadWNg$kn8(wp}i&iD3SzRSgwab*PFCG~w~ z#^;rHn)}#un(cMd@%YlG>j%V7_H!e~g!@tiQs!gLLm2rt;y{7n-a~==WbDv=FpkV& zG_LHf8Qp6%&g?!L&+HxqL+{Cmp!aAj?Y=wxGcy0f5~nw`Zgn5aT>yDE*5#-*Zq83{6z)qsCe0-KwMb&A?yUi}%%q$0kOe}j)zVY+Qi{|`!-cs3 zCQ2}Hq3lwVGf|!igNDf9{HDmVGg&g$B4XHBcsNN9T~;b!05jm{4d)72V_7kzu7 z&unwx+6$C$$R`L0afP!UQ-w*>-AgvkaTWOsWkU@*s_r&d%?xw{=ocD_7$yJ z at v1}g2UjVnqoyCXP)l1%5xc;o%jHzbH3Ksl0e$jf(|s{&jM+iE$%1ju4%XHz{?vFH38szldej zHaAwt3( znpUHVPR7$v!!zD4qW0&*&zJ7SapOECr%9f_3V6j at mnoMQ}zvqinQiP)~;V at ZKVIis?;n#`y|-xJ^RQR1V#wa?ln0hwNQQd%tSY z&qD*Y@&_-?jD+%J;X5b4s1D78eqFQeN1~7HbTlaOePp^vSQ`m;`7K3}G6;sGBfd=Q z>A9e4fS+fzxfx1JOtkSUmJ{j=rqQ0wEo at ZzL01oH09WXChz<&ywpaAYr+Kcp8GAp$$SsLo=|N>^U}F=BoYN zDAQssHV+Sc8Ws?4JPD%hD5KML_Bf6Ql7c*J5!XZ-j+Mc`VtkCWFHppwY}v8?jGWR z_`#3hF_0h1LHzZltP7FsHV~@grd^7>R{0ZaiRuO5o_R%Gqh$Ux{2`51lZP zedQPJZc?(ipQxCAE!HQAo9+BN+KAWfF`+6{@m}89p7MNeqhZfa3Z=9LIl#nafv(nw1XD+QzB(jpF^6{n?fnNM*i7M8|3_8Wo_$9NrDbDGA?; z#e7WC;d=d>eg~NiU(3{wh_&Ix{>P^p%`w=GbZT=Q%S2~r120=thTi#4%P9=REgQL& zhHJmb4zJ at kfL9DDOXnO6It`M9+`tytb%!gK3f*sa3{6KC$Lteit=gXFdg>X&XeW$B zB!`{E1qC|7mrSizy}I at x>Z;Na5j``AUQidGGs;xZ0EK%yn+NC)#+&E|T|Z7H(i*=j zJ`!8T+qfwUQc#BttH$8A@|`LrvtO1BDzuYrQO}GG at bFQf&mZ%u7MVJK29RGV5v_0g z9n~HZt!GU})I*`OrdD=yjA^l0mjVj%5o)jp*1e|dqoVSh6;SCD-Y5^g-$rAOF+=ZQ zXz8mS)R)W+Lj)m at aw|#s)wOahnC3PtOjeH$i}VdcFR{n94ym;csH+|*syhY1a+bAT z at kaUYYxX~;R|MSXH9go#(JNzXl??c^^KolWZtG8<)*oHhL+!irZ-fHYm0Q#! zwXo`wk?|?&C0Dp43RdgKtX-a#p4L7Jteg5cmrN2a2*zsq>5lrFTHKyB> z>Gmf|sq-M-0U!ChVcv3teMp%%ep;O%Gx?KH^GO+T^Y{72CtMPU=7wRs$}%l*3)Xog zn|eo2`ejpk03x{~a?Z}3$sHoOgT5YU)OyA$o82SlvLSo(2udJA*wW z*J5P2J~GELc|r$Oqb9bP&3It?C!x{&;%fcyYW-}ter41Arqlek)AVhp`VFS?Nnn&> z-DQ3jkI+uafIsExn`17#6Z#4S z?P4Yk!e-!lPquFeU+Q{qaNb9<7=n_}@dkZTW6X$-gIv%WT#qx``l8f6hE|>c+Z3P3 z#O%n~p*#aM7jk^UU%G(CgssXm?M$W54S%4n#Jr&j;^M{5aUnGyXbQ!rsWM;u>+I}7 zB-Xt0$Flx zfjIa)B*I1*{*H_zN;Ec?BewESM4F_IFkU6^Yfz!Vs`TcQDv0UhK52+fz**;FD&Qf^Vk#ckHqZGDx)&-z5=@zidRM5`gByTok53aF zz#p5%){-t;jPG9J;*I>|r`SVh>WZW_7i&&xsa9^ErcE68t6gVpxz at HA-CEJ}iZT)S z%kj|b4l%%}(???_yt=T!5E)AOMs=igSQZW@^#fcT@{@8m)j99<)5%#?AG5YzN$C61 z^#&Nbev4ix89Q_DqQpfV at GqL7o3p$Z*mAb#DsU~zyee*gD$W)84!qjK4(7cSETw}7 zL>aTa)+4VZF9s(Uc@)z8%?5)u>N2~H9GmlNE*q4;EYyb~p}>il%-u_OkaaB5hXIjn zfJy`b8eBy39or%Z;(D~I_(-ZX{O_zwfD^nE*_jh;?e at N%Fin0ka^EEpNAEb7;&xIC zJu^p822GMW=75#W<3-IJ4&lz3SYlRq1!6*xa}0^81#@uX$Wpubk$m~y1#}>XPq6{3 zw$K*4LiH%5 at qca!pHr&S3&f(QGiZE6$aC-oW$t&$!bR<`#J>Kr?l^>ltl=yI6y46i1QjV^AzTMR zf-V-;#wL#c`Flo74NC?22ev~RTqr=XT%SgyVI~BzeohM>Mx8QI5CvMXiXB1-opYi% z34+G*vc^)YDo)oo0Iv5;b5dm0 at p*lB&rabrBSRL6u^L4Y&v7=x=jHvS?UmOoFRAb6 z{aX$|=#4boRvXd~vH!A&Hb^~zl4z28Y(_WT_Dx3`hg>a&8oYDlpiJD2;8(;TVR1iXc2=m$!eh!nF=Ek zGt2(SA#{|3Br7dCk(LSDK?ReCgAWIfNaeRYQ7xJwv^JhglYL|_XD$_ at lBDA3I75+^ z=JHWdlVoC`I5lA at xtQu}6V)?DrDPmGIt|%HgEaR*nV0SosZyDGlG%Y%LUy<@Ggajn z9mYvBms2H$Nz|G$jS2(XRCW=@<2_ONtjXYDYZuZAD?|)+>_QN`1b(_~n*6Dq%T6pJ ztY3*716s|7M`hB?sOg-A5xy=p_|j$0NoHqHphnR6u13l-Li-t>Xs5J12U-Jn$*gYL zXE&s~An91@*kG at +wAR@?`JQ z3fj(qz%vdtCyZ>L^U|!9fPBv!8$PFitRGHppwkb7z}7%O7#Rh)gLeOi7ujBF*v6Z9 z&j=xJPYEG!A6BSKN>tc8mW!}=PX_s$uyg10w%-RqZ~xEhffWKobQF8o zBerw8L3?h}5Pf}L_+kXy{bx~~r-mlwWW!Wv_WZ+CWP!OyC)UVxWp)Q^5e5^9Zc=R5 zRa5=uGya`q)!k-G_X?@A&W1RpNUcLR>kjME=oO?;_o&W|?$)M`yF7ETNhK?et*?%O zd9A-8c)Iq9vE~{oC7W=edq`&mlKhpRlwAnqb0eU4y{05 at o#Y6{d#QnGl)L-m$yh`$~ReNu9{ zcW3%!bDAX;@5>H4+;Vky8qryanI#)f9K~QazWgt=56d1oro~o}5%Uen1m!c#Qk!UN zKjFL$Gk5SQo4X%D2H0OkFMrQ^6n70&8f%ol3Dt|5LA==j(+MU-$_!|(C$XF_M9hVR zhFX0BYr(Op<8^l;pKbfQ!S(R(>kPO@`qloXuG`Gs(~54;ZF|I^;E8dD%$D>N+$)e= znnAHE at D>`zy7Uv!o5r;p1>nMkTHwk}?I3(zIw!vU1_=G&vTE&k_STObOtGJ47Q!rl zTi=lOy(;h`Zt at chzyv&>o^SIb_Q9SO_>JAePcp_QaIp3BTSE+xYM}UjKHV^QsDxhU zhHeg#z4R5M;qBozqz!Syg_&a&k~YGHynyKpr%PvqOwaQeg4hn&`&)D!vE4I7l{;*} z9F0T5Sf(Gv_-_ncZg{;^;rkxLxPhU$fcV} z!w0FDhbV~4PdR(XNjdR`K0D%RQU*RM^?gvO2Xcl$uxKsp0R4zNBZh9=RU^M;vA@%u z56lTZaf~}1x8w6Fao(SD$Llu6p*MZevtX(N{Tanl=B|g60KwXe*eWZf=L#LVIK$pAO`{ffa`xs+W+5G zmpQ6ZPMgZeKepClt=^l#tPU3btjUR-lS9R&G%+%Q;#r0V#c*XO4N6y03Sz0+8l_6U zAe%pctU7ZUiLlP00WeTMf at mQatkmiNIH=U&KyA5B9eY?J3 z`hV~$(MPl>qW20TMUamarRN`7BT1;K)Fp%lx)ggT-O`k`M>7MdDA^?`dx)}LQL34S zGd-gWdbOLfIznyOq!Wt%5gy{{rR5zRicRYd&o)ZR)?+BoFg+^z;wsUhC0#gT^x1f4 z4h~j5^(r*f2;=ti_0Vn+1_WH`zvq-f-pjQ~j|q(i5i_z*TI^a2;rrt2wdbZPZqOdE z$quhdMKkf;)*Z9kk at gtw6OF-5mKWEp`B_jvBKDqWVU6Qg&u(okmrn2c at j4)#?CLs$ zX^p&L(Jw694ls~2 at NVVv>*sM5ur`NI`#6%yFheM at Hyf}+>sL=s+S|>UuG??JQuWB) z1$T(LWG=MbY+K7X0 ze7GQ@@D_!xQcG2x>-XmKV1m%jE at cGk_S}s4GD!u)-N1Y3Vi|`Z*b4On_mr{@ z-Jy%vS?!g3m}8geiuO7C=D}RCSmRF0^&<{Q9v~{QaQO_?xZxit0z$@!LYG#pi^Z0r zdgJj-(5J9RK?at7&(Ed7pcbz1Y|xR$B?Nwo{}d7XQ;qYf-5gDFN|~2DHu#W8eyboc z0 at Fkf%1iaa3 at j2S1Ln~$x=5An+w(K5q~}@;lDpWUbi^X!xFw75qi0os>!2HWMcb?s z1c{X|;L=&|m_l%8$U{-hxTFv-$PO<|idSgZWICg5qrkd4uf$eqVST_R8#C597{A&~X`hGaGiJ-M9G=F028!bRgoF zk{k#TyV8HDz at 6RdxeAiOpif? zb8!yw?#0Nj1xArG=VIT2dM$>cod-(;4~zy`<_&wy?eE>^ySorNwt z+a at e2`1u#+IE#fV$Nr~q`33&(nsfdS%%NoBXklP&;b~$lYUgP4pPl|Xc8CJVJWc!o z*R3m>6(e<(Dgmt9Pb0zv-E*u13z^7AKK>B4OHUt(RJX42JSBlPNb|zbS%@VRg7yA3&wrg zAc*EB-d=`5U(pOn%1nqmRcvnIMIw*F4JnQ!<<>G{Bcm>ASu+t^Rf-wfv2at&h6;!U z(;yAk at 5t*Q4oE=08_`$rxg!YOh+o`QQaCfIUicvQ7@>ed%j!rXta#&!1RlhqE;KRq zQMwSb)f`*e*PK3)g8x{4Uyg9HPcY|b!-CxAM2Wwr6ni$bHcWLcuSjx?BQHgZro?H+Nc3k?WhW-v#>O0JodZ}Y#N zd3~#qZ~NvdW>yATEbS0hLt`+Un2;+d{gP>%F}7M%E17cY&(EB1H2+=bRTNKptQSzXMULreN0Te&G2P7M zoRXWpib(uy=Is}HfVm~m5M@>R0KCLP%p(XMqCZqV@{VASWTAL(|zCKsz9XI(8gBMgO{Zv9gI at b-~iK&TtK~pS^|+ zT5opmdj`72O*dhB*lNX+xT5cz?`xkn)M^1KOtqmGcG;#eQLoa3^;QI zIKpfURCCX?n(c(C~@cES_VG zT`LhL6x=zGpYx-IUZqSAZ`OOpQiS5F7&67XS!R<37)br{MfZ;@3g}-(MzZ{+>hB_m z6swvh+OhwKEBjiH5^6!Rv$le4FLDJj;?_EA?VaE7+kLM`8#F(eJt%PTl>*+BS?ia^P3BYD-lqS^4_C=D%YH5jgc)Z?HG zjntQc?D`j^|1=0B$rLnyQ>hm`;Uv)Y&Lj3183&JZ z)+S{W2r&*ZD*Dsa=%>^_Mbk1ZZ$B|`vTKseYi&poO5TH^qVwtzPUzw*loCVQ9>Sh4 zGIdTXr;%*yBoei!d5aihB~`~lB&=8#ykX7Tsdr1eF_5`PmMLz%k~wEKKe{B+au%!) z1NqJD7sT1_BiP0#6HbR<2=Fx4|e5oVy4pwyuwNH?e<$^+-Qh=0_4 z`{nIief~E3?7D`C)SgN))>3s&dXn+0ud7fIcOj=#pdXG7gzzB; zrBC-#jMN`HHXt8d2b59M)Gjlkl_O>6=@mzesVeP==7obB78`-5OW9S*aeQ;AQMSds zN3!kE-dNe3MNpW#ah_@*Q48`ED>R8(S+nktcjJ(G<3gRc zy79+YLOgQ#T!%lFlv!>EYdADP+vFO$T9HSn`T^&jZYU3760)cxO+!@ zJVAHzjpX1n>@6A@&>4G<$g;Pe2AEV2I~RuEvx_}A2a;JV*`^baV* zzyJU^{->b)-z~CoR5ooF`Qdq7YgunV&Qhc-3iuOSA$kGanJH~4_3GNRd#o`< zHXULvVt2%){#C&eDHrf at Ioll*=L?B z=1(@e!SzMY8X3~D1?A+DNk65p0 at S(b2qv|M=5;m`>Jg)U!5nuhH&tE+stD)|yO}{@ zEYaX=)>5mOqLOjqP+*^gcuX!-X+^XHtucw7dTb29fIT%Wh4&<$r+I}aHbQZdAI z1(1tyIFuK(iVQALDjlOAxQJW}uWdV~rCpXE8I?A!;Kp;sE@^fLtgCbiHJi0$N7hWc zH%!7 zPBl{{rA$;tAc;qW;KldNQ}8R~xBY?i2+aRNj?5lXd60RlV+fV#-+Vt)D!VD=avQ=q zv1%^DU6}O9OGp_PMcO66Bf2XY!aVVP?-(n6w*%f>qWIgahSMUUyby%`wGoughgO(( zN%JscD0|dN#jMEwFvuX-GjZcAQRG~#V2|Y%%*-3HkYI}I2I8(-Oatbnutc>1wq)uc;!}L=~JE=$C*iFUE>X6!`nR>T zO%j==T{SJEOQUMbl at gkr$iM@^{?-(th9F9>QUBZ)f$jP>#3%S!o#Nde-#f6kqG7Hq z8~jo{?aq3y)7%cHzZqOkudjJ|eE`_{a$dBHhR1AK%gq`nckA zIT9U at Ad^CKpC;OC(S=RN9uLA_b>@=kbd!q^Fvq%Ir!|{IYB8&m}4zYJdab^djUtkrI__m%GZm2W8Sei5^XUlUI~J zT&H{+!`sjbC=SFQrArG-fIa0#2l%l$EO)b_0$-LnfiBB2$PGKfI|D#nF>-a=g`IJJ zQzSmQ<;Ys3Wm1gkpvbm&BnB&O?Y{kF2QmSdFl4Ni4pEiC_={#1XDze~bLaAlB2mzf z>PUYud-Bt#jM>bW$g1Fb?t!WsK4CV{9vs^RcUcI~y2Fey){jTk%y$z$xs7xb+h2GMm`WKaHdn9}WmKh|b_cJA zZH<`rOF&Ed)ImP}#an6jcml-Y9{`&E-)Lgy{}2?(T6TyE at MFJWwi;-ys1^k~l`V$H zq){ywK*bCeme!KjK)^^ontS4HHzn&j(cb@|iH#1}7-u!eDO?uo;a{MCGn)D`IMVd| z`hEfK;N?(;6Xf_s2_PUuFphyK;Ea`x&7mEB$L}0fLM4kX)irk=K1f%`o3XP%7msxG zHk+yg>fEGvoVD{_VV{yPXR5JU_wAUvXT`EOrJRTEzBCJF at UPi0++gngs3i+ALFvoAT4%O#lwP at IC0P_BJ7_BDUIIE5(>XLkubf4Pk`}8A z2dDsf`>Z~1;`c|YzdR4s{pzfMcIjCZ1nB#AHtJe7T5LWT$$P6dceKV@%B#KA-D~I- zWwvju!g7oP!4$3Lzkf at hHWr?v|hnzT?~1Wxgcoc2kH}k`C{g#7YqzP17llc zx%#~jGR2C at iRPU_ZPWPJh7)UptFzp}u9tMWtT=NGUg6sPj-HH_RXD at 4C}{;068ecy zwA`r=A%+yeRYzE~%MQ_P`WUT6>9Pv2Lk98t4u|H46?rEo$p1PENzZzB|NZun)w1Ql z>%4(dvKhkMHe=LrrA|TQA+?J2g&-bb;a|ZT1|-p-_5r0z?IV1l0N2bn%MOJ9jF~bv zqlh1 at 4`+r~mr^ICVLG0Y^;QFlNsSWy<0*2B7^(dc$`KlOitjhee*_^s3bRG*XF8dd z^QJoC7IlSgTb7GpZKJ(RKtZTUk?Je>5%~Vt-o!$Ilr8A7i*cxofc6F~i)pmtz=rPB zj#iG<9!F(dA`xZulpsGSsr~*hvV*jtk1gOI=q7^xceY^v1$6&Q)>Qd-^BvR8#_LAy z!0{0(Lc=Z*Rrou_qX9%j>E&U{2nf1GSH(1Iw{czZCpC-0MDqiz;qm8gyV~{}#DKSDfkMbYT zN+m$P!`I}_+FfhUXy}Y4WjFWq4Xxs1`sC1}B0P_OM+5y%^Sp#?HyPJ=X|Db^9`>n;?Rwe=D<;&H*3il$y|^WlQJ z4k8*K1?4=4VIf<%LXG5B!uHii?gt)A<>0?58^iPpi7JEx5s>RPW{lpKz|cj^U+iv}e@})MKA=l>}wseOy=ZdNC;$i;c=mD~HR? z7$p~+S5UfM6oBWr2v5eWtD9D!J%}8(GIPl1a-18Y-5V{3JRGJ?-)hK`rIJA?l=3)n=&fKSYdFchLGA47h##1T1qQLRGt4=Pn9oV2 z0kT#5r6vc6qV$q4>WjE#V9lq16A}wA5|n?-Q}{re9`y2kL=T8O5ZlYYhzq`jB|k$D zuGvb**_I>wnU6)4x}vFq?NgkSjHjGxruI2|PVIxPPz?)5_OTM}s^!G7iBuH(h44Dd zLpKV(11i3G0@&w8nHhpTsI&R4J!}(74H_amu$qWZ&n4&2V>1FewH at 0fS|ko>*Dbcl zBwqeyo6#(L$37n_0KkR>0086v5a0jNxTy`{t-QRJ=5s-udoR(cecW~U8bXt0lkkZBCx~zq=MN-j5rvU{;K?vThM$2Y9t#e7|lg6fR zrA}p2?t8Z5c6KIfLMj{L?lP=z>-EMp^_S;$%jqU7 at 2{`VuMmKIXr5<(2vj@!yv&G% zwz9iD0quf)0~nP9#4F9QA%u;4YW)TfXYF2LXjBTfehOG$P!&t{OelhS**?XV zdR~mxoifa-=^-b#Oi)>)0dnr_2nH at U(kjz at 6Z4aoKKJ~PsP&{MP*#WeL at 4)Gz5)MG z6AwKGo2fy3UX6BeBmMMWRygTF8ETbbpqcgrlyFA`qsbXt?67NFZb&Zm^chUs{S(w$ z>*qaI?y#z7ZeOmpoT(8HTy8u!^EVwh>VBy9TS432 at gTIrSLUzY&@^{_hM#_*D0>RG z->lFyPkjvC{$bk1yD(h!*fgs*BDm`Q81A-=C at S?>s*d)^Dz1(<1|wINzHi|nEAINx ziOxGsT33&Hq^|T6xem{q&{eNJ=>x%(JcoNHTHCz?QCi!B15+3~0dz$xVZa}K{jB+B zVr&bMxhg>dqDJzwIMJB$&^E&8@>j6U81o1IwDszJ+u($h0(E1n8U!iaWRzR}In-9L zKp9bBg0j-Wo8)Dbegwj$W5-#|dMH(4^ z^1&t*vlMN6qJ*-Dk5iYaf2*p<7}VkAiUN at e=5S5%WcC^~LN)&$B_j^j5Dm_iuL(Yj5=+*UDbtAJ zr-5)p4HlSB<3&d3q(MC31rlvV(-*OmU^QyCIw`bAw5r&;;2SSBx3QupaN-8e$@hBO z>P6MGS!l(Rs^SIRTEaGy zfx-+_j8u3=H7D3xQ!DARWN<&bCNrq}tl=BSJ8Q2fVUT#AY$V1ES2u~*y4foQ7XLeW7Kt4ZV}8m4H8V zK9R9Th(*$jxjx46BKpAMXgahttnlXq*o`&Qx-^fg_x#&AWwRPwjEu(nlc}WL?v}YL z8WqN+H63*JH8bjKUi~;#v`A)W$=I5C9A0dF9=YN!c=@_OJ%70zP8bMyjS{hbIbSHB z5E*jpOPUyyt&66_cUfI?5f^$go2!fgJMtZzm&hJ-7WI30pS7s1qmaO4VQOhi$;nZjD6$DT^s?khg*j z(FO at H^Yjc)U)?rzXWySW#Hji#n27_WWl09%4+mi!)9ogoUp;T3Km&M}xP%=MJ)`uL zdccnAB{sAP{{a4`f^m>v(^1U8 zq!8q9~NkY6M$)eK2rUC!Na6b%_PO}CJWU^^7BH2ECZGqy#W)T8e;1A3V>)S zXVcEJU``Ejcbc!@Q-M3QNKv0OucuNz6#a`h$eS0F-$S6^?0kNb&W>#KhY5bE=mCnO zX>yOw{lG}wE1tShB1~;x1V?v|5cHa}d4Lqguj26f&MY!{F+g~Thf_P!$i*GZx9$+f zolNa^!M-lm?T|NkJxD at 79CN4Wu*W?wcH2G!7EZ7&^wZ at kKJ?FqpG9ybdRCFf9z;$~}U&av0YgL$J|;V$d`Sv$ysb z*`5fDU&+wtT>xy}UJ at s7h@4XKu2r~-aPbIUb$D}gTjH<$J79+7ZT<%Ou7YNNhR{o6 zdk+n|dGRxKVG^MxGB`>?o<)(vJRwfrfLX^IiwK~|k33QfcUa$kM&I(i$5z>p>Dpkt z&B8rMcKKlxyT%xSJG0G_ at 8oAj6(#{R1L^*$41_aYz_ z?pc#_-DN#cZ`Baro)gUO+`Zcy>0tHGL=CIvcrlTW(Yv#nHK~)IR2bBL;UA0*X%@e{ z!o$rwnNDpphE+HCNKctYQti#1_5wz8V)dX{+v)lH*KWyMM+T6x3wG#77jL-T)dm2k zg<~GAF@|nCzTi0KFa9yOdm$;_B}r;kQPL at 2Nv+bKl!93eNHKE3)9(zQBp-Q`h>Y zKz)SL7hHV7S_?jWpvuUbVG-wR0=+mP)Q|nKCjqK2_ at bt*k`CR>w`U3~^h*o4vtG?z#)^S(^h#_ZkiL>&f0C z1Rf+ht0N@%Ny|qxv?SRmELN*^nmQU<8cJdWo+>gv#}}QGBbQZ{mggmwCNMoTwcIEM z2LO9hT_}TWRK9xYPa#6vfa`jAmI3A at zx9!>#+Gfq-chN#H$#?XxDk-3CviQ)mj-VQ zX&JyZQc73JHo4DJkmZ*gzx#(qURh&T+$Zex9ie{ESu~VWm8rCcnz46$_xQ;# zI`^Ep3>+m!ky~m)_(!Kq3wRb={`O{kcvBxYBS+8gXgWmZ^Dm%_4R4Avl_8q;%-(gFN;yhn}JKz{!BK7QbWlN-*SEMlc0O7#A97i+u zkb8_?0v0!6GP?K=JHQ57TEUoaea8(sF#>1d_p%?HGyOn&>d15eoSj+m;ZJ!5&nKQssE$Fvq;gi1fl&qBA1Z*T&;R%UxyS~x~FWtLJYkk3lyE6klKFmobB(+dABM1WDM$O=(x6EFD at HflQKFaaom z)CS4yu~h@#R?R|AwpIGyuVULTSE`nd;Z0l1#o*o^XD*a&T9G!T`D?}h6%uxmg0?|G z`x+SfADZ`uZTRfQ3J9nMY~n^<0wd3m5`cur3G6G$zab;@{%1&x{PiMbIfZD~rj(`C zzc^K;bbq1P&52S+JMu3fp)RSh*V#2}yHW>PSpMIef=r!}IbCkm{$=eDGiq#?iG*G0(_W^6TioR~ z9fvJBY_C24qjm|$=~rC;eeh)xxdt>>QmSk+{coIsS5o64u6U?h&Eat})z?KOqTOt2 z&{rH~pB_VQ{&;S5HEccjet at fq^jjZf(W^kjTO#_xQL^C7OKN*w5DyaK)tY<`HzC=+kMdVdlbWtU37UQ}1ocQxiDae at Oqe}sF7XVSNJp}Ud3HFtY+b14p zBI$=?F0M_sL}XY6!aPinSzL6r zM0@?E_)D<2aOd~*{_kMs at 8srRpyUC(0_-0^lsh$b(7gYLvu_I1EK0IX+qP}1(zb2e zc2?T9ZQHiZ`qQ>um3gagPtX0PA7;L}kNce0SP^UOh`nNP@=k%Lzb^>m4M%$)m&d3- zNM->zy%@D_NVWq*&ylZdl>-+9b)Q(6Be)`#{In-hv5E*Get|n*2<>5C$unl=Hyu^j z_&#)_xKE1IRie#4k;^wauhcxNA^9kn0(9m0 at Up42{BfwP{ydF-zj{xeN{>Hj+X{i1 zrq5ASmTN%u8NY(d;n>N(je(Wz=>pVFMJJ at uZ|$JF3iO?GK1EkfGQ3AFFhB;Ph+_#* z(L|0gTpqHlOR2U!OGbLgpBq`M=N_C^y;$!|@l23jVUXS`Fz;Y*FZ~Jb{)DSzOESbI z)dPB04*Z|cwyeb=Zl18HRgi|p5ZnpekVZ>e!AxG){uxP}t+-LEJ at y%Cr|9ta)|?4l z%Y=OsLTzq#^?jt+ig=(raiQEtB|2xl=#*5w_zg;QbPgp6!bB?;$)PDbg&}e;Fy{fB zJru3ERIcC?H+*18BzH~;1gNgg6G9+%%th|d;+*%eZ8a9C==uE(*TgAJLj*1G5VgN>qEE$k(^0V z+oBY1EXK2JqE6y04?grqET0L}DMzwG0%dIq6YOSCP3@>$ zS4>kA#})_rjGgP5pN4Dx8GHep?@9oj4RBJe$RT?!^$dRQiS3YMeUd{G+ef1~G&5ep zYEQ=JZAb=QAg?!|qr*Q(0f1t(Hhkp-E{a5jHcf at DJ5TsHE;S`k$b<&5k02rCk9! zkPPHiRh32C9Rt3G1eOJ{qjk*s=ZCDDaB2HpM46-}B?*4ZxWt4 at ss1I=EcSlBWhA6fDcj{^Nd=^kn#_-GGrKiSQry at 7}EU!v95olDehH|M&W&0 zn*Or8VYDJGm_!ThyUA5ZBkt0%&qAKeSLTFcs at A)?5b|%W) zh>1UCdBoM(k=4aanF76u0^<{9pEMSSTw;~SZkl#;{5!hZrmTc;n3cY4+#Hr#DBGYmUy*3L0{@6BRQ`& z8KH0eSJ-&*!8a$@v9Yyig{Km z<~$RAl0tPEp{-_-0OXoQ-KVT}a0oGbK&5?2T6*NkxaVRBxJGq^%N_WRsiCW_4%)+Y z2l4lu0MKG_-Dv(fD`R3W)QNs*vI16R)54yK42M+KF4`-1)a<^}@cD`&`k4Ec!c7Bn z0Lg(5Q#`_paX=WNq5W|3Os!z%FZv~b^aS9cX00`wr626_G48O|+{7t9d6W-$7+)c2 zl&=;E*SfI-h1@)Hs7_QXr#yZ%m1;FTGxu-mlKZX7&5m7rO4rR_ zK3_L4wecMK#0eIk#w?kTVrcqswx>CbA$C!pEwApTt;}}dIqO`VQLZ|h42;#g50+#3 z;gA!OTv}BI<`jRkw+kXU+BR9sW at Nh`>)U#+Jv|jmp3S$-%hvpo6 at Gy|*>_{dvg2VG zbI3QXpItzf^>Y-AEvns0ig-T+jI76$l>977QWGVW^&LwuAMPO?I#QZt!WkE_wt(uG zRjTPV;v%d$>DG8kg}W#M(8;wOmJ`r$#2}gv-x)TT^vj5L+c341-Y14kgFe_9bC;cC zYnk;mQHH)Z+Ie9F3s6eceND}Y&vR_VC8DfPdP_A?E_VwtoY!Jiub!_?d-s}k=IZwo=b3W@ZT?$GI5$4vO|qu>2h$FPc^KtP2EKtO{3%j;-yBR5ZXGiNJPGZjm#|LC^N zs{fKlRYKb?r-!Shii#rHC~~$!uFw_JmO>gqsv>LQxcJq=mooTQfwmMW_(l-!RV$EX zRm}6hBm0LajQO3!ov8SWqk|JmztbCT7lvC&}J%e^vB2Z{PDy+Ri?(Ts95#v`WNt8EH z<;+%J^$rqClA;FQE*xkcdzMC*4!4%8>K1%L5WQ8V$wQ~2H??@wM>Y-xr>fGw__g5B zGJvaKH?DlXLGu8cnWQ?QqzB~w_;VNOY+D(vsvdL1II$@5*s-M0sTc#<8G at stY`G=^ z9OSDcMMJc>q&P76?M3=PkS=;LsN$&jM<(b|RH*`&j-7MY at X4ON6f;?7S!q#7txZ%B zP7!gXbfTE8Ld)oZ2!UI?Ak7uV5x!yNTQ`Ox*@`*8{+lfy!K`C|W#rgS2D>feDE^ya z5}~wrVrlHS0^X`U<30L=e1)|ri#I`4#yibk`YM&zeapuqES8MPv^SKP(Z)nCmAz+}(xi6*9wZR@*NjT3<`SFAK%BVSV`X at _Ru!|LVd?uk1jyktIGJG1 zfG}&lEr?1i?+Gq2p?^nX{!dJCU@&i_+I at M)+bmv)2jD==-{zn{dJuqheY`+(guooz zE{^bS{Lg};CFjq?@2V62c=HFIzB7CF6Hy?HLFuwwrr$pd0O>Z;XvpOWb(r7t4p*Hr z5|lTQt84<@1`=bPs3_ett<9^i2Bm64+04C@*1dDqyh~_4uV(Zc&E+5Q)xE=Qi;kcJ zgpb(SH~*|=c?L8r5f1s6&nczPG0U9#)VQxNWU{%{J>+${varQP(B=xRm|3 at T%dgLI z2cgFyIdlC9(eo!s%fHpUuH2_I`Pe+>llwHXL_zj&#Z5HyZt==~obU=p-$8od at l)vZ zRnX}RFlJXAex+^h8u!_{$S%Yd1$dz)?#>M5t at hEq)fk$oLs at V?cB-Vt&-3Jla=YY* zgI9M&_z36&kDMBTGyMGK{C{ZW_={GS6{&C`2p}L0WFR2w{}!#1MlP1ZR{z;E>eaB) z_{SdAF!DgA4kasa)s-q at C1aaQ2xVlUMJh`sD7|pgkibdVELqK(ZIABTX@@h&KO}8= z%Y+MrtIMZzaFb+kYzr<~E+ at G^Ty{Tu=Kb1#ykFi5e1YA;`NJDifI(*=HOplLGl*jo z#}LgR1sT`jZzAbS$j3YgYZ9X|5e|W1h-ePsGkc5BbpdTX&gcWg0uU7>O|yGBYFO7W(UBB{Y0y zS-IgUK!t}_A9s=3mtld2HWG=Ym)9_uS5}mvZsGGw52H|U3bykc67*3HA;=Cc zJ!R~v(SL5mB%#MK7|ia;TfNK-(l}{P_co;H-H+5cpY2ddN$9OfaCS at sAapy*He;M?UePAd#|TN0M(R+(vy>bo&# zT{C0Q=pUmoDVyq8R<P{@R4_5IyzrJ#RdgZG-(1LH{yuM_*^`tcP+qC?MYTktC7TEl}dfDCI>a||a z@(Y^WU+UUF=Z!6bhhO;hy%l=qz+JD6sj8Q2KDXo|r^RY>>Y%3DYsf48CO6q;9#Gy| z2->X_%;#G*sDE|X8+rTs$dfR>yb&jU@B at L< zVmOp2xM3}P2Y68dB+?ML?Pvi!;DYX;E&o{0mw|BHh3&<66A*a-kecH at QMfmrebmZO zD3~kTK=FzpYTw=4Nn3m?kR&n%MKFP6 at Nr)aBFGA{YkE20Nz*wOIVy+SwX8%f40#VS zxA`c9w^uR7p}fSSwQ|8|om-xEI0g(6Y--KLZrSW~w1AUyBrT8njaiPPJ3^kmOwYL~ zyciBA`Gnk-Lb7kViS|f53MS`MgiNyp%M8tsE=GEk)HNhys@&5As6#ox5!VIr&?|RM z7*OBZb>~v3(uX1_;wS6`W#0;MDDkrw?PN!UG1W{W=_-IL$y4&sg#v#$A@!6lX$#^v!ji%B%_^W^UmG zj`Y58Uq$%aAy@?Te<%F%|8$tpy;OZggH-`6j{?-Zw(~}w{%ycfpU0<<<1cHpfC2*I z_;2fwn4P1m*MCyS|GUlC6X5Bsd5O0uuo~2(GGFX-Pl2LWBcL z_F+d&im(Z}nG62R`7UHkB90pHQ((%|!X3C2T-tUicfI#C=QHE|`SVi&2sLA#D7F%= z%!x7h(=$N`g_Zhfg=wBxb(Mi;RI8s;ys?r_T!qJ{nE<4E{<)sMv0ay z$8mVlVaSqp>-*zE8p)n>SRwshU&9sp4djqZx{M3l6}E`YpbMx~r}Jo&NS^3#6U!-R z4M`IF8H9Q!GMF743$AV=-99XyYJh<<7#u#VeyAZmNV!{2X2PxLKthdYAuTpfGc4{} zn%P!bw|$@HHc=t#FnJhSd*^Vfm_#eE$T#f+27&={Akjv8ngh44v%qavUJF^M5Z?CI zW3SbMBeMXaxDi at siq+6#!LoLx>3exwAW2ed0 zE03jO at +zDH_(mHA2sI#zPW+t$zm}vRN@~?5$l-Etmno<64UnW;d|qUmL(=|D-<&(~ zq(l{JCmt$)O5+Z=c=t}ZQo>idkllp+1Cx(=LEyUH7uTLbnLGAJ&$+z_;k&$X+&Y5W z@?pTYiyk(wS*p5XHTEnhIzFmWY1;_Y&QgKcVGr6{nF=do_-7#PnGu%2HL7s|Hg;Hc z`Gg|Olcw1vJ|Si6^cMj8T|P>)XzYd#gJzB-n6F zRHJb|VfO`91tM#W9e8K>y~sY{Yp+dT&a@Qx*yR=FCqv~OmcQq40i#HE zrk2bR5*<4$zyD3Y)hq(}*MR>;Aj*~nJG+4Qe+v$yys5=Yf9 z|I$OG{A|jQQOyymqSY!$R1h#<)euQBIF7_3lmU>|Ym~KyuFch12tq%r-Rt%*)IUez zYk9$KeC6Zwe~P_%Twc3k_bJE-=BdMHZB-$z)M5B7c$HBsBag#GJC*Q*sr=wKS!C+_^Vfbq~o}LzeH2KpR%5Hu zwP=d~hg;g1PmAw=EyG?D_^l(H?q1o%2Vl0f~iKT zBlY!rBR}&bdDM3bYYi^naU= z-ySY{j#+Yr(Ntz}5(2mVr58Nx9{&ueFRllge?umCxV8~-CurF6M^G1H+z`Qv6A0Cz z{7*d at gx_#N--m%mw|kF+CIpFso8Z7H;lvSIBpD)uZ~iTK&L+f at iITWK zg=S>8kgWMvR3 at gz8^i8!Yr*pZzcCp-B7PtelaiY;9l=Lbl)7C=5JYw~yAi|~9J zC>x-Spnp>%1T48d?-djHstzP`#AW5%SaC&%qL%vaTvbR=(@=GO73Y0}eRQ(z?$h&7 zTI!EddU+tt%2_5W@(xpXwR(7>{V+tCJN&S6Krzh}o(=6BFk*4eaEG4RsyMzt;3XN%^sNP*XUFjj2jhS2hvU_7*oz7=eo2MQtLD6uho14N=W-;}4Z?OJ z at hTrd-B9w8o{^G=4y$M;aaSDq=q_q4j8-f3N4_ZbkqIdiwQTsNzWUut;aN$;bp~;p zQ!=d#W`L62(ku|EhdnS)(W5k7&~BaX?mc at xQuN^4i+ZB;cs~M5a^JNP$jo?8$x+uI_s_OH_mekC4IN(Z~h$Z)M7JO$88IECXqC<;deiJW+) znR&T$=AZJ;C);f7Y*e>%uIu`|_Uycz99?h!vi5O#czJ2r+Tqu7CNN7x%m^AMn3C%+*ld?RSik}C;{R8VCkRMCoA4%GJ)1?Y^$MMdc^D{;h at PXku zz4QE^zMnrnS>8`~cfWufVPz!{(_CFmI#Hc!BFxn2Ye6l^JybyGuqB)X(GtRA7EC%%LmYPr?NP9YtmjivQ2z2w7Qz- z_?sVQ*hlqo)NTiAs4^yQew4~CIz?g3Culp{qNI(!_RcgN@|)WawnXFB^qBhGBwK;| z#TqJ1N&Hkf70#NhRXBZEZVtg>bd1K#l)zH at mJMt){{_%%&@3H_G!1a3`%J)Zl3iu3 zg%gUwYm~am5X<&bOJ_iAf31o}qjh%3Mg2M^)rj64omtxvA(1*=Ji_8eC4HD?t)2o^ z(a)eMv|`)zZs!9SITm(r8EOczfe6>lmRullL&JFbunq?t3I2tv61+r=>)l~3h zh*td?GGbtreW5B{;wAW?(~Jlj20tRc^)$&mDQ%wT6C>Ca2UQy;n|gcZL8aWTf1BXq z&YP}X-B}Zu%1g_7*{-9Kr{2aZ@@9?_|z^x5Ykb%cS3!x>2*cV zRmyTLdJLy4ULVNmv^t=J#mq#LMmEOgYh(z54SH*&JnRR~XLn|`!F~s1fKqtEJF6jA zJ)j3_ux}&%h+pVyvZn)3OW>b3rIpO(i&PyuA))G67|wme zb{V2;bk6(*F8xhC3`od1rwG_I`aUImHT9 at kKP%n=ZCVHrrc_mu+lu6`7;J{5sJ4h=+9}?Kpi3Fs70d?QPq+W93Xflpq;ywA zJ?5(i*GnEoFp{w0kZkuvX4{JHbBwpaIU(Ll*GQOfg*1t>aafOZZ3#U8vF8_<4Th-= zbLh&y;K+fMS2`@ZO%@v_4gp94M)e=SF`myJvRe<83E4;Sq=dulp&=gLF3P7sd19cB z%8=E%7t3txh)@k)!=utjZ}F5_IzZ7M{T$&tApMdpAt9q2{}%pDO)>T@>KnX(YSn+x zFB}l%zvWT(hvwZ!&JTk9f!7(YH=9X_wLVa(hVNk3k3!>I*Vm@(F7W$p^6oy_Egmxx zx`!XG7i>QMsN0^iTy&I;8+`Ixir-K)VGgDY_b@;tnm1UybYV$ZA^Gc&c|ZCqmt}U4 z^n#p|Ool7T7;TtMB&bOK^GAu>n`wM6gh>770bBmg9On1^bgOpNO;jR%NAQCpn z5gxOfadm;*Gg*JwX14Z2L{BPQTbgGjtEx^c>pU?{0gPRi^=Up*ChBt<9sxn at XH;d5pMm`Ui0h`HO#9mYHS at JE$UK#T$=^;m+1kinu)I zyK-m8;5EC^_(EzkOjTpuR at a8l&`-%AU^wYDwoX2Wic%EHNmo>6F_jecT`f+ZALtsh zL~*d9RxMr;`UKs`8l)p9 at SU3>G)ZYx<%R&%SS zH2L0Vw8v<>3$wIYYJ!L{;ELNr^)J5I1v(7#(brX(Cr)f9_<8 z*{FQ)rFAX=v%>RW)E%o;+hV>2F)&!&0kV-6m2}Kzf{apKRi<4mrngd<>i57|V0acw z3-Iw_x*Cc0OM@;u3il}fB7)guNUR)r;o zQ(X+&0n7MXM=ES`tk^ih(a4v at jDqnh%iE}I8&XK2ui70A=_ at m6xnr@Td4hTi!+1 at t zShjt;C>uR3p$Tp{ol>s3P_Dk at 5Pi?8rp>Dvo^P^n+N~0lgl!SnKqB0d?I)ERz7)ul zM{#(WCZkjI-Jn7XAG0%18W!JA#(VfLMzV+E_%$TzpsgF2+NkOFLz+5dd at fS#5UiM$ zF at ie~B_|5Xz9EkgpyAU1rpI!oV;tGeD5+UlA()wXQ9se}c;;ZZex#{bJR#$PRUqmUOR00k$g#T-Png~!=dT?LsjzRN+RH}sqrGz4n6 z;)|1iZxDMYI3FZ1B3B at CdYti0Y8+{#|G at _|YtZ2>1~(o|D0G1KLjQk-nf-i*diGz2 z5CI1S#P$CLvwt}|*{S^H3I1t<99n6 at R)u42(zM1g zH?Ym!g-iMS`FGKTu47BsxlX at NVg#n{0o~IO!ULm-fL@>1ozvqS7lpUa{J$)L30g-) zfWX`d`O&z-@(m5vxS~pPC1EVdQww95l-ak;2)vqRjqOYmlhz<&UnUkoK)tc>fEJwk z*WbEQzoz at EqT7Dk7(&i&y)fLYQQJ_}wi`Jk8$*Z9BO0cuy5}ZCXxIeihMZSjJDXPB zV}@_JLAKmpHRtDQrUo6VZuz_cQj)S#0)taHq#5{O~ac|HYcD&Gu7=XFSG_V7nXI4E|u_&{f>DbM{Oe^#MPO1i;{7!e at 7QL;E*m9#nM1 z;GYtIh1lX45yV%*O#J~VLW_Co*7rqta6R_+eJ~h^2MKuwhZ`h!r<9^Pmgr5{t22Sl zz_{B?_2A!n*2C3%Coo1X*|jeD$)ZJ^b{I?!V@`kpxQlPcW{BO%d6JHx(IsgAokez6zIE(5vO38AiW1%Guf at OyB28Sn;ekR5^EI%VaJmy z)kU&z3TP{H^nI>lU&9A>&go_oEWgV7 at pnf0=x-namEbN$V-quCOA9FkWoCVB9;c>N z(~&pA)9_2`+hH0eh#ehK>k8cts6jCo%rsk3&6sJ|jn=)ZVf|X2efM`>OqW~TPZ(?U zH>}nW7y-l?$}1J<_}sqbhbRn}9YO1=89X~f4RLZSR49}zr6#cLu1r`wdB(~T_{lVF zZjQ1l#XJE9*m~vTUBxhc8>)Q_bPMqdu>+vh|6W5NO35fWUOf(~9gf_XKhRbHkpG$RfEdARyUEv|Nh! z*f3$ZC5v~FJ~5O4%FDU(seebsfx3R7*+@=5Lr+$R`;hDun$QM`4F1B3oY_q5%n`)< zA-J9|$r$$y&i+igat~S|2O|gL7e7!IzcD at f;*1u=8+dtENQ6e>L+r*-L{KcC=82Wg zbM_ at RXHH_FS3mSP%UPn;!}lEk#B!qT^l%u*hN@&F-hdJVL_x?3o~5YsEHkW3*v&D(Wuuu)bX z7*Uno*B_5aqA=^gdEnr2piR4YWuKFXVS=em+L1Vs5%EMF(OVm#kVNz{t9U2Cufz^{ zW)u5cv8d`iW at eX^>Hc>J3x#m8WTy+Rr{FQ9H3YS9ME$)IPc%tis)F9f at V_OzWH;e@ zT at WB3TJZnrN=((+%uLwG#mw}do8rWcOk5rQQx>V(DJ(0Z`QPkZSVM{!M%f2Nb-@=7 zNVL%n;*gjdx;94=-j2=Eoo|(1%id|csjw+YvE4(y6~~;qn{8?qHzD%9_B?sbx!BM9 z|M~ht9YAnbqw-7Jl?h0IF&JkZ=Pu|ekhiWOp zA1<@&SW_t2s1$ErpBY;@%tv_TQEnP}eAr*Y({87c+PV1LJu(KB{9TC&y{Fk1;`pZr z^j?h64_CZ>Y>rnyp~!8D$Tgq3U(KQN<9(M2jdqLhPi>SVDmT%|NH%;y6_cB?%(?Ik z8!vS+>g7tUvyR%;_eI54(&v+TP*`cxsgc6aJ|mD%{?rWof&H$D?VZcZ2JZ5ev at iiR zxIWEJtQ2b*@S|tf3F5u%cyP8dp3nWRD;2RxY1QpRw<8}!lp^$%^d4t!qk-fWU0i$} z^zU(DVzxGlPPs-#VM6BVY&FJmg9yVfYPTW$fN9}#_pic~6WsDJhFZG%y5IeBhOrnb zLLlo2r55^8C94aTLMRja94AZ){`^mvmdV7cOJ14s_)XAF*3Wn~UH9mb^GD=L1*f{2 zpD@%t6h|2LNg7ychZr{@v=!pEqm{Z=In%K}I%Ozv97jHL8nCslA(I at c4HCE{E|xR6 zQBP(PlyFzYVn!<^sasI~==m6Fb)$a43t?IE+gBrfcXD>Uf?eg zl9qbP4~DN1`~&)5--m|ItiQ*Kx$v!2XJ3(AUv6DB_XE zZ?C-QXzghtB?oM6xZ!p)gml$K>ZO-hO-b);NSEj}Yi~+Tmja|acME})sn*l^Lo&A_ zaVZ9(ra2G2LQ$lrI#Hw&HrTM*Lx0ulWZOaJ~LSATB`s)rGU zS?e-V&^B|CBI0n7H&|W<-`15E$l|j&%3%(Sd;i^3`NQlN5)^~%qWo at T)A>>Km~mgq zJVuO3nH6_ea{Ek at U_YA^aqVaJ`KEJWK{7#ZOp1nvpTqSft@7xjnI!I+;M$<0ycX4BdXSXSB?lMZt6z9=I3|J zBlcmaY_-Q~2{`43^JvaWlZ1ju>4&kOWF6VsTE7~cl!){%9}X_!etl|l{OEHuo|(QW zj0z{ZPRb{f!*jWjGpkL-e<`Biqf>csDrh at Ban)hOi8ESfGYA=|Ng8Ri4b({)W^}*d zO12qi9WY8RUt2u7PbPMFdsJyoYe=il=gwzOqX{}|KBNl2PV+S}cH+kT$dajIa`kpU zmzN~#1(2GBclDb8&^%(+F9~v5EQ_w58$CS1*_B=tY z;Cgz>F{Y49F)pdFoeLADDfn0qxriW0!+2j&qaiu1jf{?$G?=J}l&A zU7&Amag2zsnlKa|B`)!LW=9Y1kO>_d4$e@&b3 at -9fQ4bGe50UH!y7IMa;SXcV5s)Q zVgdkW2Iobny2Xrdt)_fg{=6oDb7(I4?p z^~GeQe#?u(GgtK`Os5{8m^73)ecP}?kJeOVo*zcU`oiuh85+<+SJ-a}B7`Z?t{Ezz z+Zvgr>JSgWbjP>l%`0^+J+%$icA>sSwzjYzoyZk1XH4g2e*%%oJ6N7nM`c_P336V{ zsUkVqF$a?jVf35TMhIYp0`&d}U)g^3mC|SNYL9>=-Qi1ZZ|p9-{9(g!w$QYHC$mDO zZ8P&qe}WGE5yAuYfh8Q#H(%j_Jh1(Ak2!#p#MYi at n{h&5f39ab at 2s%6l^XlMA%C8VUM4}z}64tI*1@{`(uIQR2 zWg#9JMn712uq}TGtS&K^Ui6-Z{D8;kjXKm##CVm;>1c4=dt`WuR^CFfj?0TUvcE{+ zAaJ9J08;V#yl|lHaD?iWcoVziOkY|U0=u$^;*OC&CdB76Q%0n!c#GR z?TQI&eLJOvQx2uAN8BCDF}*D^ZgX*E0)s at TM^~e3orz|yp!OC z0hq6O9m?r#yL&+Xv_j;%K57LgJuPN;1pTkH+9rK#3H9tpyFsWe5_H#vZcy|-GFJt) z!4#~UVB5D9y8#BNO(F3N#LSUZAQZl`(2=I$a0JDx#?z9 at x`PywUxJcf9k5BA*+iMu zBEpP9h?6|CHQNey+kDC1 at Qasc++OHD{$sd05zwlFBc=-9kzJ4TEBOI~1ixEhWcwj0 zWalZ#5eaG&W8a&U2xq9Z`4(9+bZ`cL$I5=?4*U)t`28ps4BWrX$26ZvcvB%&C3edJ z;kh-WA1L#11FkQWBhwn{2fVdazk0QeGcdo{9;nZ+HV7d9d@(q>-5pu at t|Td*gkZ_4 zAugu0;ypB}UI3_FQA)V6N%XH-#nB5K>-1fv?lGD51cZ5-ZyaN9CKb{HFa}~|SnZST z_uaRo^eU}aft`Vn#WhnwE_~4Bz<3o at 8DLe(9tDRdljpU+L zA0WP~_czBei-IUQS)ezM`6 at 8aqt>TgX0V^QK-$2+Yt!;KpZE|I)N!AR`OjRAGo>09 zeC7I-(j at MOiH7NEnBK^$xNLu?bMx#U&=pWwpx!1hgPpND;5(GR6ZHi>4*a_rW~@S! z?mvuwJpXcErvD9>_>Y^kSXCVb93iwXh(tH1T20y)dq!(a#dVqb!HgDB6qOo86jW4$ zFtZ?=bgiZ3y;KBvg{F+3 z+>uUb6iT8}!_sMcYVbBVbnusOnR_ee3`=F2&An}_4?StLbX#qFQqh+%KN>FjkQ_WU z*e-kaqgcf3ek?(|W2w(B4#P;moky*s!7Z~(M0pr>6aStVbL>6Y1n?d770)qesE;!L z9Nb7&enU_9=nhIqP1M5VtN{43c-6ZIF?r{)r&{EA at Yu&2P1fYzBLZMR$6H^#%5~3v z+=36C2Ap2=ekOA5px1V#$X_7H{k>CU3Qrjl>O)Ugc!1{ zmk|V~Wv&d7R|PkDD|PaemoR1OGF7fg%s!q~m;$JlLQ&0ozrT}uYj@}`(|nnYhxE1| zrrk21XgA0DsE2<#qJukNdo at 2I@9QVvmhfK}&(mFbFeFLV*5e44OHH!EJ<)388?g#y zG{KyesKLF2vUUYBUQJIPX{R~ zLPLY0uq>rOlKp-3(v>oNiLZYf at f+r?JY2#;-h$Fla`1P-YWTKW{#ir$K%Y^ zpRdP5paH5A(gVTCUbz=(yiH>5N$< z^Y#=3B0XFrY6qY(H-Y{uOHD403CnB9VyaH3O)P9B>N26hPMWm&3YvMkx~OF)x-CIp zYr65bRakrF*!D%Kwm|I at OmLQqjH-*yj`N7IA~g(S42hMqoPE9HeA1^#G0n6gP;lQK z*U&U_y_!(kVA!KfoSbx?JoxSwS69J3*D#B`Y!cy{v6AmYrA(!3?@pDxCk{0 at Zkw5N zex1=RR+h?n!(uU}F1Jd}2Lb0FQj+E)X8LfGNqAnBo(9voTnm(BYNX=FIIC{8Y3hEA zuPmLVJJoTrCZ2wY-O9Z;H~3 zrq22&42ZRu`iiUwXW{Y_YtQN7yp~$>&nODvB>f1}(QHLjJPK%3INKL#nwO3iZ{~JE zgC}P>Mcw03FGWI7P!~37P-gOO2=9};j1KsYk_U)l3rehVBBT%e zB_;MnnW39j6zz<(LWi5ITV9mB*lP(Z70Zl5#1Iqa>6eO*(8b<9|E+uCTw$8?4g~}x zO8^AK at V|h}KLOLK1+4*CL;nIZ2NO0ti1m!LvAuwcX4SV2$BNVAWoFawFYiT<0)j)tLZ{;59TL}nszVe-wZwHt#sRw+1fOv<(7pKG97I$^1>oR9LrL)_LSx962;umHXmgz*z{@c z at T_f2yVQl|3mFY;oY!Y498j5EZSbQ%UXg7?q&?tf at z!!vjC3fyZ&Qfy(-bk=Yg4MV zZW_$Xo at u}YP)ML9)^&&M;@h6cuS{)++9+lD#D`1l7KhoMLvT%e5G<+vd?j&N-IAK= z?Bkc~j{U+)U(1tCx(;h4J2u!GJnHLLK3q$v3-c3wY$QoS?pg&yU;a!vd zhz#e!-b6+Hp~|D5yg>JJ56Y=djJ6_a=$LDqHw|ZwJ_kJUnhY+$dwLsC%pZReGi0EC z+Au$jCY9+5AWB4g=t=36L zvjF^1j7#y8jd&h!N`%;Jnt#iZCS;%MVp6%_!qSCOnj%B=f2i^3y66STZERFHIhzg8L{BS_rPc($iE`CA+aixE29fQPK`I~Es-vKRxy0{~>dVzs8 at Pkpv zzM&qG8d$_8{3 at Ifb@Cf&)z}!Jx9Wi&U|&2^6z}v?F7qdWEyp-gejAe5DJtWW_fp%d zx%Sgddb6eaA`6#%InB)UIWf=Wa;#j1&yPGKe45bJVooHTt&cJKkhR$XkJ^}O;n?3= z+=F#DRC72=j$&3M8`AtG181+L?8&kp)fl9A&5eq*Qjt1=AGU4rU4C#TTT zQl?K)lFA+wPfpO)BQrMO%X&gh^_bEb2EEiatMj>6+ybQSbWWPTbI~o@!{7JFEk~k- zX})=V&?86`vR9Y_dQ_05z?{-iyR1G`maW=m55FRbIl46KLGLq)fRdtM> zNr`Iyk#SXWB$Lr4?o=Jq#Ist*cg7ROE_5Gle)DAU4v at 31l=`j`)$y(jD~ox2BEhW; zp0s++;gq8e*dOzrAhE|T(b?@diCNZqhz>2Fqze8^kVdQ%1F{7JLrD^%@OcisSGU-IV^x09uX4?!(7cmKQ#XK(0dKEb+O%x6Q68Ss_y-zP zamB4qzokYQ9CFei7)y at YQ#g$NI+LV3VsI!2n1Ag`Z|K+Loa{- at fBKIv_^1McIj7!w zqu9cvg<$${u+9-_ZbHjQ0-ey4nN($&xo63sWk%WJ at d*AP2PEBFpkv-+bg`n-$0*~_ zoinn0RUJ6Ib;kr$yitCs!A!`DzqLmp14<8ob2RRW7%DuWUaLJbBpk+zX?7w#Dm^)O ziVu1{^P|Qydk6_NSJ)4FO2t(@r@Ic_3Ulo3{0W5boSat&5q(K8rET-Uf6JC6%?|=Zf^CcJLDuc42D*9 z4T1J)OtcT!yvAr>rXN3q^wz-8e=7HZL;1 at X+1Do`6LNQtxv|l at O}Qtb#F=_~=am=4 zdoQK!hH8s;r==+r62G_Vd%XOi*|%?mAP-Q>Ye;(OaGLt$nX!B(B_F5zY*M7^Ul7fI z|4}ifZV0YH>D|5Ub2-2R2<&~@Iq&r_LbYx{{IvS5owXTdwnGSgaY_`cF9QB2TkQC8 zCm+5mQv3`$2WA1m)8}wdKlw#{!A0$ooetN^WQeNP4p_J}ToJME4?|UjB2C6%?o->? zu7sO+Jf)vnfs4Z0R-t1pY0Ifw9z<^-gnNNdG36^w)fuPo(&v^XQTs8C6EeJNtGddf zwqg--xKl_Te8Qqcu`IdgwPnW|A&pZE)pNFBq{IZ9xWPJ4_=OTnpE<&mPh}IA2(+DvMUU+?PF^r}y1i!6_U;qYe#kEJnwNNSz3=2Bgz_7yJ at lYrkMS zfwu`k=x?O}{AqH!w-Ll^)I5Z$dGxb|WcJ|)-z!wM_8%iR2o2TR27-DFSIO87YF-U$ zS`EW&620U<`LIV+Gev^aWjK$G4d$ToQM%*?sjmN)aulBE^&OI>?=OhPyqM_7$-{wndydXwM~ZUBpPxWgfPPn7p^S+R>Hj-4H) zg6-Tn>=Lx96zK-lc6OnaOo0`8R;7~@-%fQKYmbNc$ea)9ia2k^!b79lQmU!^P@>W7dX-y>;?WdS`anUCn5_?d z8*9pv8tgFajP-Q<@{qcD96{oD_E*6O_{58+;Jj7~c|VTOxXScwCzj$0<28T*ZO(sW z^9MmXeles%zjh!os59XCWx?*XrGrZtJwZ5O?33RH}aMj-!UQjfp}rP$H(Yyk)(lzVxsPv|5E8)A}^5nY8k= zWK|tM441_zW6)^fMa&mLuX;;-{Q=mQN at KoP77AJf^d9o{5a9B<^E$(Aaeo^S at CTGA z-W-hC7pKgKJBag63(N=*bKn9%5s`vxC+!IChPjEH#WZr(MAkQm+V5*f9c`#Glp6#E zH((9{*cGGBGwae`{vXobF-)_z*%C}u@=4paZQHggZJU*R(zb2enU%I}XQfqX&U?Dg z>6!0Lcb}_ge(h`j-TRIevEq(c%bj+!`Kolhso8cNL%wv}jZ at c&y{dpa2L3%Q@~XXC zdHI}zaqgY64 at Nwv9HHjTqk+{7FpqvB_uXfh(cpPC5W|`@(PGz288Q)-+g=pPV zq)So*>Y8uI#8b at GyHfbSjsp!Y=C=d0C}X ziD21H&+Ba(ab-!RdNk*?*siiq*;f1#@!yY}Z)R(|hzGtR+YeWXwaCpZ>H-%F#;Jo_n!BrlapJBeA5xcv$y?D zL{wh}3=w1ec;Lor4EH at m@1s;I4PCJ_H#j7(v+oz$D9`HMq1@Ho=5;L9tr)!|maC3t(P(&^g!OUA-FHP$OKTe^YV zBU*bfSnO6a*o25zyQwkg2)|j_T7AB$_w6+8zS>zj?&#%O#l0qB>XCSP=vJ2NZzj7~ zL7LbdB_N#eMzig{$<}UJ%ZbvXc#9~%}*aoMiQ#?c<46)Ch#|26-xgMIE2dP}@alvEXW+kgqb-1MLoOt48w zHP#XCVJRT_g!P#wsF?a}C1DGs at xkW|(EL}>;UQY6y!|(~H8>Cu(f^O2^PePPOEh#n zP}R}C6c)@g&(MtfgYxMu^E>9r)aNo)mZ-F#e`F#JZR$`aS at Ck^jAzQB?dVTp8v4#t z9!uxB(c3S#e1LvYrM+iolv*VTp%8jAykCA^-T1mZDSW>^&-Q^H-IYXQF-TZxDc_+m zRD>V&NXs4iG5Zn$3nLNl5`rd;UC3n+2;u6~nf1_HZH%d?+iUlLL0JG~he_KJ7eEyG z_WF!H&rGSAsa40-8k=@%fzNv5=oOF0#l;M#+2~`mcjzizk$~}eOQ1g7N!xPgL}&3Fz3G93g2dVXTF%fC at abu z;c+luWB&BVe{OC1mz(A3 at q~AQ3Y}VIXi6x!wi=kFW13Iwq$6Jf-S(m3U)xF68rudx z5&!wd4l9?sW0b&k0sF~6RI{+$ini(Yi(Te?Ke;+DY at B>peTv-Uv=T=>Nu+xLuxH1- zG`f(_DRLB at q&%qZ3xv;j*! zn~6t>KUqkyhYw4|C4RJF{r(wyyA<{-(My}4;GLWK2zv+TM^G|Zmf8XiQSWLLx=bul zrjEN#t-T(H_8T7aCCR6Mp7BS_XZnsDg#cC2);HqWrwnav; zrHmRA1i6r=73EB+N*t0mumL}s^}`?JsS9DPf?=%!T&HP`2ZYZ4ZuBfyudy*%Q2)@^=VZ2;=mVWYZ*WDe9(R(S84Hgz>RFn0?HH zXQg|dh!xi41#&l^1Ge>LIvzW|i~aFC9XhaC_Cgc^QStpsg% zIqh#K*Ac-oh}9eXv=vn!foWF1IT--=q+%Yf!9`6>gBnj;eZPZX5=A3|MnV}7s}-N9 zN-`N>s;Hi|O}IMBl~Q(UZG#$3YUCEM$0_Pbg`ONkA}~ zsFj)j;0P-i^!$bo1IA1$d0I%jzftyM$2!4`w|x4SY^>yj-5##Ie7Q|Q&4!4ik0R|7 zex?4_=YP8Tpe=m*wfhgOrojDIV-)}Mukas8YNxs>f#i>13#UgJk0}M#3=c0I4L=6# zC3nw8T2u;7YUX&9d%v=+tyR&!mvUC=ZTVz5UJ0u~9OHxy-Cmv-)S-|G91`sQ=0F2Px>^BEWt%iNo+36)O1&-~2Fq!sI{EDjR2!rj%R>gek{{4o| zEr*t!IO#`YrIqaP*RFK^OsM8byA?;UrdXs*tFwd7gSHj&i?-(?&Y>x!Ka*PP*=koq%xp^U$f4gwT=$s;+&_Rm&6}MR)mz3f#42na)JCXg(@3*CHJ$Z( znSiuO^WZVZLNOOZY$yM at a)T<-F!}xAi|)H3bGGfJXUzG at zWd5{16E=HX4ekHVCP0RPW6Y at NYChS_~Z4gUrA9=_|!iI$@SW;bm( zLvCVnBTs{-5jrCe*YlGO$D~1no~5Qsr?X`*Pp2JA=uLw$a~43!(e0nV?Y|}cNq(=s zPWUvmz~?L&-~5TD?=1fhg}#=yE#^Z*1g`a~-eP z`9$@rDak2t0rrVC9pQ7H4epU_8>3O(k06XVUj6IlwrjGdBlk#*&y`o!~){{V3as&muT;8{tsEWMz5UH)+f`VE{UhO zC?Tji{%uWOuQEPSlu{6;(4%M^OjkUub?y=U6*cDno8;u2uoHli8#DW}LXxz{Ys{v& zi1m!L4cYB5o%G0(`;)M?^h at G$6OA|Eew#47SAwkP7ukv3hN?Tif{%}1obvr`MAmsp zZp-n{EARLxMd?oDq19>Q%lP5;NfHIRkpZm_IUj%S)Zr-*j3&^imT@=ZJM3xlC^x~$ z`K3J18_P&med^e!60UP at qIPOu0IS5!BdBU zycnnHo=-Ey-4<;-G*gxI6eNA$+Xc~5jw2he|o3`fiNJ>Wm|kNO|TVEo at g#{YC{ zHb&jXWl;i+-)59io5Csp0IEaf^>Y+KA)gV2(~e1+i5Vd#hWdeeGm2EHIGQf3RIohn z9&{sPVN|Xx at 4bkpht>{HGZmH3`oYUt607=xstI~NCcTtLQQsS!$MKC|#Nn&l1alJ=2!dd`|{-_6Di z$k|2LRTe8Iz>e!Z`t;dGW`kKVdme8^I2| zYg{Hnz+o=%u)=e4e?WkT{B^=42QkPZX4}&vifhcVTP7NRXv^ag1mS0)sP@=OjYeGd zDB@;C%{4NiyN_r{aJN!#!8kQZFfBj+wzw1l0TiD`3q;|8Z<=no-;ThS^fQdcxqa!@I z3sw%Y8pGO#;rp-u+d{9l7H;lHfhYKcbaU}^%L>Ph)=2NqteFR5TlQSlw_z{5s`GHz z+nd|!W>TFw`EBh2h*DNJU`CRR$N;RDs32YVXkj}cs8d}TR87CooycN5pmn!2QLz?c zdqQ(Nx8R%VZ;4t>?e at _{XO^mATnBMB7K5FKyyWgNxr^b==~0_?W at -`llIv;WEY#dW zEawrY0S^PJvS|ku z)A&2S$_?2vt4zL_cjd4_uvEmlUekr|Xh&itO-$Ket*Z`D3ci0sP~e`BpI=`j(0Y1y z)@uQyD4denJ4cL~cDlT`8|F_-97~&YJTa#~0Txj9rlqkz-g;vfFdYEIGQ7)xly&j! zVeZD9GB0SJfAi#u}~ zRgrOpp$DdzECS6-=&rCsvnRk}t7MaG5(P!;8ZP_thXRRWM**T>s5Tj_!5$1wPfJ!$ zi>~QkDqo at RfB4OmYMv=`pJ^VH)W|KfKtk`|1x`MK=dPVA7kJs#cuVR9c1C?t7l(My zE0>*9msrmkld3`w=|4UY)UHY=jU9ajACX4|i2KfYIx>p%KYnCT{Kzx at K`hb}FiUn` zDkeW|2D1dNp$Mk%7@!K#eNbD*_j5?PyQoQ_<19bqBVs9ulj|>>ah*PSoY9Z`v>f#< zr%@7VD(A6!iSNglFe0z1OfR%{jaVC|L=WJIV+cc?_AaV!y}i}(00z` zlH4g4WF{RmV1Edgs{Ry0PFXo`M#IAIK#u~Wv7*c=HBV$2Zw|mzyY(NwaHcoZf7=UY zSgouEBt z_M6BkF`d#WK`bXke1Kw}s6oh>`A6CwO9buF9yy8xtN~C{s$1rO=8O)7!>?E3zzxMA zzMZ1q4Q3~Kj~;Z$XnO7v85E@>P#QGR#9SObzp5Jhyg|ZFrY29L)OD$vK5H>jpkj&r z&3vMmze*eIXmZiKMu~m8vKHgE#T at 5l&dqIu0gvM%N~Wg}d%4kkT@=hTD3)QCGY4Jg ziN)93*AhbCO-)U|hK3_F4VP+`8cwFb$i_QR*iFGwU9|xNv36Inh>%r|#y1K(=i7AI# zA*!KG)wk9e=h0|1t#TXYxJaflJU+pB+d=7CvlU-~W3>MD>%)36P)pP11gw?UNV$`j zGz&*PK%vdb9=>`6jT-Ms&#yaLjudksR9!>(tcPCeUmhErVC_K zfgPY*Rgsigvfsc}u#}P+sf__Y*oSzck5 zT7!koCn#>*nO-D^%sQDbGZF-c at q3NH2~YE`dZ65z7P at uh&*uIcP-r>_QdtXP4Ywtr zI6}#1X$S9YM)I=O9E5<gqvQV0| zPU0~7hXI{rkAfYv5G2Ac2ZqE(OyDRY at R5{WUU at g%F)^~h&U(Ohscd-=XZla>9 at 37e zF2tH2Y9^j`^XSwDpTBaGSvwTRq$A;FGBIK>%N8Qy*ew$u$siJ7@|G$B*)v*98OW@| z1#!rN7g&VSO)rX_o48Mwow$$BMc&`V(hYSpc?;@GH7H3Y08}(>2hE$f#r9Cj-r0Daohd8}{ipD=QGP2FR+veK*%&^_>5)Ho8K=wXs+@#2%}z!UT`M%2iZxAQoR zof|oo-Z{=Xx}LHBX7f-F-lzJq5Gz|hb$zx+yotdnqxRt15xGro+`@CdZq1!*4ODTa z{rVmU+sS=Nvq2?`@Of$Z(HHrGcDtVY{UaprmK^kxN?ei~psPGl3u+tebJxM2zYZEN zhZ3cnB&v at K*uzD^*&X}Ddy}1u{Xl6p^QaLb0j;8qJ;6ADABoaZKlQ6)wx1xxYTy3>!g60&Fq#k8*iEh@*2 zx^kfb6z#a at Ih~9ubLT+sPi;4ti23zb0gdtye?Hd);EiyY)XNe)p}wq~OllyQzLTBb zs{BRTE;NVyyE}jr<|FI4x=KXeH^@50I(NU!d1z#@hc)^eAj%gj7!mF6nzzj zh0hD^1haB06eYmo9x}GpzeQ;ThAPcPVEDUi62WynRN9qNGp7^$7RPnqF)O!Vxdne` z!@%J(7g(kppQHd{v4 at QjFyKvj+|-r2Z!b`U+uJHlP=BN>F#z*y8^Dr?309NyNaYd> zx6e0Lb3Q<_ew2W;_$*nLsK?13JddqKjkB_y94Bjdw_Umq0p|MiC`&w~fATP7_( zO%PwO%{iq}#9$A$Vz1eiSi)&Jf;LYp$c=C0MgYJZLhPKBI7$ViNz(@c;_fWuj!WC6 zDV)Js!#QG-hQ)cCCT4ogv}OlC(FbP|M-}|brM8q{z%;vEu!+VXbBTV97LOw)V?Y-k zI9eS-Hv(|IhJNXggd>){BYoXu!hFUIb_`?Q3DMT#do1&wAb7Onr~jDtn(=DrgT5vF z*97$}FAhco1_ILcPugHg&-z{LuaA#6cp>;WdDGjuA at C!3K9+=$)CZxxplZ?$LNUG+sc3 zxg#BxhHfsJL)d36be!jEnN%%0*VfJLoa#-|Pnv5lWN at r%KWg!{2QM_3$jjF3e1|UK zy|)31HbN;>) zSGye5Z_?XZACY7?b+3E1Xsi|UIlx&Hv${P;g3;lPOAKV+Y^%WZ64e#5|LdF!d0ZH= za3pIB_0-3`J8aY4>)6m}rH(aVCOi52Aq6oL)Q$BhHySrey;Q-J0CI2+xsKoMeEOGv z4kb;7{Rr*Zi|~wd?DS;k^z9zPsYDQ?9DpfG`=uKr2htRS5N at cw46Tu364>- zf)#*nS^$jFk)lfZ2&^t-ok(Gn>K0tRq}eWp-{YR|o6#-%PUJMT#?Kkv+bV(hwkK?>lP9^(wG9K&W84+Ftgqfcd7lw(1If zH&uPm1=C=UrBMIF at Co*>2QLzefHdTvL-!8&ul$Vvmk00PTSS`weG%3kEX!0nu+Z4A zY7K~jLbjx$n2UnJ*&0oFrPk!60hBzSbB?ariz1E4OM*NP3u} zb*O*U_=O_K4*gRrX73%^fN5(jlh&T$dTO at j3N2)f>MD7~BbUyeH5&8r+`m+%Mnf*Q z;LLxS#3)nGgSBd--*?$rPnVUBa};Tli6- at A#dhZQveEtZK=w*$GCfm$d at 3vR@JO|( zqqFDnUbb<38s#g0&`y-Kt^Eq?AFk^a7+Axkm-I99*xt%K=6T at TNXa$Jh9SW#{t`=K zdU=8(ZANz4ETY7PM4G|pq^b*oNr{cFS7VdWrHjlJJNFOVItN{sOEM$6X at IOWV&e%; z>6l8b?uO`ar9#94m45Mos>WpISCf&tl(^W^X at pVx{K;~EhJL4V%j3X8VlUyK118xC zERjR9D7k|ckXM%5Qu+jAyR6HC3-H`EW#gKb)lFhU^G-oVS(l7(u=GI) z&v-nthnAL-nc8I`y|y1{nX=I|R|&h_d^KAQeAgS>>GfSIhj%wQr_6R0Dd)p?8MFf#1uy->>Xi{tYZaUWj?@lao9H~!)|p9F|_OFS)Dn8W-qh8P;C8q%tW zydxky3*-GAzl*?Wr6vV-D6loU;5o!;P#nkLgo8Rly-TNO!4acq8SNv}9=b_}3eQ_a z#(&EDAj^I&+DDWfKPO%C9pW4`rVLUu5gZn7EHQxS6FJ08E*e2BADiy#>d%3k9RoT3 znrxml_QFt=9LY4^>q^7#6n$z_f8vQzGKj25 at 3S8=BPAq_ at W)$VF*DrUU08zMGRMlSkygbYxRJlZFyf`jewwvCa{V zkxiu3Vn#BTlzPUy0-=r_idjW7tVh7H&`9#PI1Jh0pxJE1n+H;7{AqO_+CP*qnd+or z?{F)X$MsLyY1t0W3*3aVs>5-3Wm;9;t=5DYT>@UB{3kxTe)5+hvf%tT=)XdnTc-db z=|7}z2LS|x?tcqyipJLeJcON{jlBNdojoR1S9MbYZFE*=EVA&wbVDjKfyn$^;;iC zd(9b^)l#$T&pofjEWvBtudg+d!arx9?&tZOn`aE$hjDEi6_Z&#(-sGhIqu$R*BEE|GTEi(ik$ZD8mFfTAhBqMST1nhK$nV%3Ax3 zF*ybjR%>}855H~tbS=YSURR?!GkNyPd~UKvHlQoI+^G6=BL&>edQsB(UHm!$g=Qd81U z1MkW_6huzBFM|7X()-TPy6_Ao-f4f_+xf%?<@Iw(xE;B{5Mj+e@(DW6H?amnzI-I+i+bJ|!Tltpc6YO`Wny^#1C!~%#b z?G4ekgnn-10cAzPWfvVH_&IE35!}j%;86%q`Ey$$awrv+V!kcRQ*i?!X4 at RpAiO7X z!YA(oz^b2`8E;6UBs=ulW=C-fhM3wLZFI7x5FEpX5bpJ$6kZm=l(u^7!3^xmOO>aFET{<~@zD=H;OHPl zWTd5HHJ1iAd)Dh&Qv~#Y%5t8$_3ft`CHP#aKq}5s1~3DBuvoT@;xR za^afsQE4DSWcfly=nk?hDRlPk71O}PU-!aQLU4p1Ac6y!gb%`>5RifI;m zEIJjRU7x2``||og#`e at f@CKd7%TEV#h-UU`^{%BadzT0xkopHfB$z4_pQyr_qiNHX zm at 4*|MMqQ3mmoyB+6wHftVCI5&xRl2l^sX0z$U%Nm$EbEA$L;LMZCxPbkKlQR^ z`7h%F4QrxLxslfDD5_ z%H&5^j;Ev9j+1KM&r+qk`-A9Dk>i1zuozZKdMU)n4)`%As>c-|wH3aK8wsorEk##pn616QN`0qF&9aA zTR&tGt_G4mAa0<7y4%I7@&JJj?Q*mpkM?@~?1`(0#GFLCAUMmAcL3>*G768q_29Vu zZRD97`D|;rGVkBgNs7`kGvtZRjM>#m?o5{hik;t|plvc7zY%FhXDPlM;eNIE8#1b9 zGj(dlY`GmIax{2jg$AOv2G8I_6jPA;hjfPJL)Cq!RT_L6Lho^+A1JE6Xvw~4k#^T5 z{3ZhGdEruH#t_B0*q3z|$K~feah>;Z)9r-{-u|av{^+#sA>}_&Mu-9eBKZF&(*C2l zzv+UzjQx!--AZDG&l{WcA|X<5V>;eI#2h-5W^4v1LUd~RKKrvF+HBcPU{aKY2Y;@R#TqjCis-i}6~$_CzSK}0&5 zXboxa&@&rl2tKpAMcmwXzmwnilgBB4 at WkqS1|Z(Q37f~~?bhFi6?$?-x`64P04CE{ z^+ogj?~{AWEh1~J%*+98hD01DGn<{duHhSM()e6Fn}T9=`->xuLPe6zu08 at T@8hZx zsU?Gwl&88E4C$dW7ZBc*O|N?90(p6D(EvLauPls7l9Q=ot2~Yq`$af7Rq;u7mpANG zJSMwEd=#$4t?W}BCiPsmSy(ZNdzS^PMUK*_jwGOqnxGZ-rK~`eZd0ep{d!+?Jti2A zbR5olcTtyDSnOe|9T#b;0Tq_m)h^o9jI;jH^^8o{q=ihYBu9yRK;cZsS&hnWCYgv5 z0yoww9`y#9-Bjj}B-@<=Uhf%4c#E~xzqQwyURhfTh50*S^vorHq?_wQfu;Q2hf;(tFaC6I5I-(MjzCE(G9dcGH7qmrU5h zEvXi+ at JKN9NwMSp<;WfE&sU|J>y4G9p2b%=JTIkRW}{rKnJq=Ba29f4OF;aS)6~go zvGLc;4mWQcGpE{V?Wm#I=IZjyj1;FLdSl6p%eWp`Tfip4bzxPJ zcX96C>OCNPkFmi80*8YP(m7J~U;iFkOIF7OrsrxQ33-I7U^3styM6Q{Pl^eQqnNVaHdUe z=P&EpjV5zbvQA}D`=7tLwwV&KDq at OvMdVw~+ltR~2$G!HfWp{YpXkltksQTf-=t at 1 zYE)>Q3ZLQb23VE7`hyjrfvNw5wKVxf at +!xjnuOOH at oQv@_`zF$UrWF!~UaI=!z} z3-r>oEDz+-chh_DpofBxEy>Qh0$bKO=vHM8`~L7Lu{`G@#3C$GQ>V(X!Dcw=FqNSj zX$0wQzX|q}KJ~j at iI3c*Lsv=gmAEt1=EfWZ1#~Yp%z>ZpUYGer?Ey6v&G*HhjOzBj zArJx*`~t-7d8sK{VL at B_k^+I|a>f&3m&f^{pk}pJDZ!hxE<~O$@7$gnqZ`L2HP7`N zY4xQH1^XziHTlfY*M=}7yU^DbYV&z%{Z}fET_4btbFGl}X+e{El4x7l8}q7Sh7vE7 zg!{r0?Lk*yNmhM)PsL_law)%`#(r~*qr8ro>=G+&j~M2o8yV6|5#tkeawM)!oTFnmFbH(Sx$_R&Fx!!lh^i0 z8Ij8Vx=ww1)|^A2+HgXzL~SlA+id$1Qr~ZZz%Wo%qWBiZexo$IH&pZd-VxjPLM>JE zR5x?4qiH%%wbYM_wyvg!UN<8f6YD`*qaC;)qFr7ap=XZFEC0PM*_B7*x%--ANy1l- zQU;uhDIrd_kEqV)4 at qlCtF1+$Dkz&@M=4l88|GknnK+J{*pgD7Awq$MfzK>2O5Bne zc$A8Se2BEeLXY91%Vc73FYk9l=U3j at BT<@|huKvo;L0t+nO at cAUXcl&Ov=_sgi0pk zy}2XQRGjgHFG8Eid#!1G8&O)-6omNIo5(3qx%lmHjy97tHsOY_I=>htsHr%DVL7gBLNZf9mX88+QXQ1tTng9Co z)Q5st)T^sJ>&G_p&=yoMi4!DKaaW?|AFAhhjgg{YmzC>wl_1&5(-!)#VKe9<)UM?8 zWBHMT2%Ajq^;cBX$S_y}BMFgMqxRs= zASxg_nb<9jIa)WSD431$Ivf7*_1id7j}9~s>s89n^ebSxGb2y-b$r at i@^MSq_srS_ zp-GL3D6?yO$IhdkBQ)10h2xx9!_{VUvW6(1hXbtQL44r=13@*$d&#j2VLBZ2VG1T1 z8bz(}ufukEWRJ1Ue5?kF#B6R**_qsY%2)6}2Z$d`!X{V;8|Ce?y(GRU8AE=Jh&u7q z;hW;y4-uNms<y*LLy>9iC7WD{p2vkNI|z%2ld!V3ES vpbaKhUEzbbU1KY;0`K3TiN6 zuHJfBRwh)a}V>SB*^epInuBxbNBWZ7P0T~ z(Bp+4 at z?EP+)EM}{qMXxOoFeGRH{RNwUK52%Noc at A8@MX!+{7N#eqM2|jGs;P|rl_stAw_k at p)a1cZJ z`2vkUh2#*mz1#HUTu<*bKJ$Nn*hw$4ka*8s zvZ9Ra)bChkD$6zjP>7WlF(M@@eG2Du>kZ@=rIxB!fH0L^wz;X6-KvUOz;#v0jX_|C z;*C8=O*^r?U6;g^B8Jk*Z^F6 at gEnpG zF{j2YN8b(pfmA7Z?huG^y>JLqxQo0cC1smRJn{`uIqGD(=ud08;2pg)PMny&Im!i- z+;GmK+wCNkn1*bqO at bXIei%{~z=*cW9%ZSiPWL>A+W1*+pVY2bN$$OwWHg``m5`ZT zYRT!OP!{)=YHC_XaI-W964>)t)6%+WG<{jI)A?+jsJwdIu)-u=!{7+^M-w7AiNniW zmrYE`CInjhJiQ7b6jL1C&ik3HI~8>%_FzUB3d_yISc~`QgwXIQy-qImv)Rqz5w8mylpjeI)s@=Z zV3wcMzA>d6uXMX;lnwIs!l4zmZ!ek?5&62hgEVk3Gv{cg!7ufdO{&_xM%u&4GN;M5 zjbOzm+$gT|1?zMFIQA-Q%%-srA>rVqZHLVI0IFq-BpI>aaF{5{& z7s2GCsH6w`jkb9Zz^Uj|G{t$jd=6*zZwETIsI4$iQPdmmX%t?zZ5~fuq(d*dq6$=04BvoRXSu(0W%s7z}PbwFSz1(d1zO?|-f(Z){ojJ+T;+}?7 zhg}B;d9lc6EFqK>A13q6AKK(p&2v$S{(_ at D14i4Oev%>!%_&w$x)YgN?x@{gUIh;I zk*iM$}ze!zYE>n>uTA8-5wyTGr)Bnky}Ky>{#YNbivJp|}i{4gzBDKH^QfSpZj7hO(gC$_kj_n5pvIGieV42i!4(s=hB-t+wnD8tG~rroPeVw?XoQA}8#vu1kRK8Cj_S`D$)0C#j&y^m#_M~vld%m*dtnBAE~kg4$T(9t=zop@$i^MaQ?)9Kutd zLMNwbElNuJLv7qkBQqQX*n&tT!KgG&pi&*`piwaHBf+Th#6hGrj-Z(s_M(Awl==B- zD#xhU6H#$G=+9wZL6TZg2qsy9nwiYTGyfBGQhh6$v#LGj7=Kh39a%}7JdjMIzKm8~ znYxQ1qhc{{XHYc|pPuAb&xtcQkyL`gij zT}xc>W^h}Kkt19}T`wrE@&y`^a1aJP?>D8oFYI%bXF%BOo-jIM0vcbCBzE^A4S`9g zFad!@E2XC=ilTD1JWXtvUI7{2)_JMVp8+#MB(Lpllop*r=_cOLqpkT!V<%E$Es4C` za)eBbl8nNqk;x}l+ihvg!y0-Y9uNBx_bOwtuOsJrrlxsQIyjccPb+4LV^Vt5GQT5Q z{m at H|NlCb!D)NW(Sgzs3bvrKjjb^1ff{j(I8)=F1-z?AeCk%KJ1^P|i)E#1gB;Eb# ztTczx9fyw($-+hF at AO&}98*~XsVFPrU>9s&VQ!yIt&EkT$=PJPZLpzUbf0Ck1^ae= zv%kqprJM!TRt6^&Ap- at veKMplysGc{eCy~xyeLy+(6On1ArR%0FEZWAqgE;&vg@%* z@`^75E6*`LL7*b33D1^Sd&K2rqg-k1)t<~c?k^RkbP15T9&5-+QrFEafoLn#7pY1NnkNCCCz++atMCy6uf~G=T`5x);|H z at Qp~tnd!k^mZH26t#i5tZF9F1TLXIg z68sqz_h9LS1)la~-pc38SiJB1x`j=zaD<+M at 8h(6 at P812w(i9rox8W=jB%a(WnJxl z1t0TLQi1>bC{pIsDj!-kW;>Q~6+qu4IdSP`%0a5 at e9|=a8^l at L)ID-cfLf&`;^&^V z_qD7p%;F*jeu1Gi)G1ul3f??tQm+`U}1OC7-DwNHyJE}v-&jIY=9_)Hm&)d z&eZTeS_^sjekNN>H%b~!#hv5Qw&;kXsw(9&GEZey-Ge<9H)VX1AM7GniS2J9SPyiQ zw-1w&(P-6lCtncOML?$H4)|(Prv}S4G{ymy-9CKzFte3bM$H6sw1uX0xYx)}ixMo| zG~?>y-~MS$DJ=_Y6N~vaV^(Nz*#p&TlO+WYUafyaYXE9bCNncex)#CTMBdp#R>LG) zk;_Zo)uUI`1xgni+O!@@QWwC!;cW*aPPs(qn`hpqRvsVjoGTciCTHW z7Mn$U_0}M8m44v^iyxZtsJ06GL?_px25q)y-sVQz?6-;`CHi=}$lR at dQID)@PL5!I{3i*bUjYrW0 zKeqyK7v-qkv-5FF zBfHeX^ec5ECOG!!QKCNRFyZ>?tAZs+Lrlj at lItyt*?CpmxjmK`{*+$bUo}g}*N3e& zCK%Uchpe^D-{5<81 at HVhjX{-y%ZYZO<>q^D;8OB}mA#y%!?ZMX!ubOOJLjB9hwkd3 z)mq|wY^4Tmot^fVj>v*?hELG95d*~(3Hb;bwKCio7+xTw7YrwkH$9N}1S#c$es#}# zt8kF1cym(-y_e(Q#98^{X2eIOaG>;8-BvlqXx($54Wcerq5GCNz~k_)gl)cXi8t2fDQ$dC<-y&0x at os9C4vUT06?)1c5uGY>UBJ zD2gYV){f2pK!7|-t_E-F1$8o3J}r!C_BLsi8YQa~fvB`#$|Z-%mL&8}B>Y?Lxt%(t zXfxGmE#;0l17sSF$WP3VQh*O-!Y2ynRptmSnuFxP at BR+k(B(T^t%>^B_g$~Zw|!Qg z-Cgg^wuLO?T08bA$EwV$rtNgT>{Z~I?N_#W1-Y10${hcUa-w(YN{n1`7KL-F6y7#; z&s_VQ?vCl4=WpHnx27~-+>)dOq=zE+N~Eo5MIT#T!Sn7Pu|0NerfVFX4*$G=s at auh zb%nJ at b%WdaI>qfNBRavWwp^2?B+MT$(%EO8 z_xo)8#WUn#cfu{td76kOSLN|k)4$TVXj(G3`}?;s69ah~^YkjJ>yF$vBTVDgjXLYv zR(nmZZ}OJY_4Qtvrhn)^--JD~z<&#agMef}f`G98A2}=h52=V8HC+c>akQ at ygUtr* z%wqBadC`KB;@-XLoYYpfi2g{NdNlM37%wVCREs0Ib=h@&%oM0x&jXmd5k?^qFJY1Z z&pq^rU;Tujz1R+mXj!uJ)_=0OT~2s+J1)Q8-W3JGEsJ!8u_w*s`dMWs>8 at Zk99x2H zJO?dTW!sepvcN*su3u&Lrl546k44X3S at 1k>uC_HlUDfwKwvE!yg&qgOc;;O%fkw#_ zYLZ4Ib35mfft=xmfpvV9!f4+25y5S|olV%oyfo5oTttPaV at IN(^Qh at O@#Fmx&9kS& z?D*%+q;us8d-GYQRaYpsu0GzfVdpbUYpQoMR9TC<%7$-UEGy=D*f|eENiCd#Zi4rI zh29>^KTjvyF(E{C)9lPDnM!=o%bAXkU&{gs`8@&tSL;fv?)G)=09Qd+)e3p`Kb42t zE7vf|?<`xZ?<_4|@|KBnbU$eh17&{PFXPDi$WY#x4{s-rkJ;w8J`yFLF;Ohpa>gDP zC1pcw8DLd<4yH*Lj-7tCY_^SnyMGZcCOM{!g7GPIHsZq{_HHbdI$BVwS*$~#TYgRY z_WX6~ME-%;e#m~%8DVVb`xy~9{#O;L)B|*0wdKYbqfJlkHaki+-JLo33`HZRTWcUQ z%FR`;J5+qcuT&%Tw)OY)w=QbzQgH(3BL82_s^7zXh$e5-iqVFyC{)-kTmKhl?-- at o zx?~GyW~FW0wr$(CZC6&M-n4Dowr$(C&AR(^-`m}1e|_)yM*mr3jkW&9jCf`|F=tfp zu|SJG%_+WL9?$Oi-rqEi$!5I76asE=i(rQI+6k$7RcU6#io#;S zHbCpZHZao1b#8ym76Z26n>k`Ue1Y?hU0gNHKzWFOvr}+O5`OV?6RUF=|Ht)6ej%IH zOZ6QZ?Buo~^YuMuCmM at kEu9u+$b at b^vb~>D!^z**pwI2tDUhqt4&2R~F7`r(cWU7Q zS%2EICAz`-ZW*lJr at zB(G6N;;?pis$0Yr*BWW+Rlxz#=}iXMY`*F`}K-L_Q5lP&PV z)Ul1J@*1jg6H}djz}a!_x|&gs#KxV~{8Z(n+6keiz$%$co2D_ at 38jWh<=5Y4JWslV z1p7dMfZW0V^)}3ZL!^jbHPKv6>cZdOg!Q`bQ%*SrmHwTnaV z%nhKViZ!Gr4d8uk-ol^ozsfde0R0u-)2kr|6ooKs at hj13y4beV3g@HtWHK#{WoOdY z<@qItKmd5sNGveAGujB%H8nME1VTA|$&%`v(nx-&Q~o at J8o$i5lJHE^FPBhdtp&a+ z-=yuySc^41*+LDkxm0lD*lh(`IED&yl`6rUarNL^RZ6JLI6}ORUUbVy4EZm at IOUXz zhq_bmeX6Oi)e2k_Lj2gGMR-H+lmamU%|7YJ;33c0B14ua7F92!);hsHAfDvKGhb|2 zNNhW?*2GIcLuaO3Tmu9h3AbXVpN755GC%o}Hn)h2mdHsxcHFe*YnyHKgyXCZz$G6s z$E=le7ag2T*Mq(hUsYT%3CY}#vqUy(3vE1mFlsLUNEFfuO_qMH40O(uz at t$UxTWRE zy(Xw#7w_ezLEJ{pqhFBwsS}hvwcKVq;yIE|hF{lmydHhqrt at ncfKN%~Zm<_58(Z?A z-XDpV#c;PxmmXVlFy0?SQ~hqfmu6FyalH%=++I?r%)r=3|4f&WX^8-OZs4Hf!Ms`` zVy6vG>3|^rjC-J9JKAkOaeIKR;llAW*^VVg-yv+cdDX139d^^lyPIvUwzYzAhh#(T zdIKM3)%s8-_xR8I{DG_0sT0gS0XS)>Pku)BdC_U2bjcBGEU(}WWOb}rV&TtvDLHZj zPXG9vH-ISrFW4j09~6>)QJ*80OJfL{1wZky&IqztTEi~{NzI_>{KMEcOl at W2=&2;a z-NSqYJ08c;A?e=mF!+Vk_z&U-`G*bnP|s5^ePiRn^mBep5BF+OYbA5dnP)`Wm9>Jk zEL0 at +W~uM#RDm}7?qLAr^S)qO+~MUT_E at 34Tfi(t{j_1|*8&%LD;5jF3_)BL at MAb$#@kq;Yv&ST z%wZTZwI*t5HCv-N9W{8mW;*HarfMQCKz4p5=Vnb?P!2ClPix!^oszPKmRg%D=A;U9 za*>8}FhlYWS~IN^@RoO4X^D3kSerAJqRbpA^8}(~4Krn4#n@=g3bmG?j=mP#a9DKJ zu#Jq(B<~%_;ZKfvlT!w0=#Be8${Na+ at mO6q+`VJFYp;N90iLMB(nZ_r(gV4U1_eQFl*e at BFUn-6OX>st$SIkomNJ_8OOo;{4 at _ zDm&>ZEYCq8fWn^#RvtWAc0(L5juJWb3@^ajbOqxf#sdt at ud>OCb9j#@ucPE|Gy?I$ z`g95uAS`4tH5VCUv2zoAuCletX;Vy{8l_rl^{nJgr|gMA60iy at s~ zOH@{XZdja=i_L1K8U7k6Ns@%tAR#+^ia0?Bvk2 at mUEU<*oG+L^2r at BA+y30;{NbZbN)xV|hG6 zYk2~~W{EsXz$iSixO>Vae$pS|q3(TXG5ZiJ%wb4GPa~bHGXPR#bKbCaX*W8xSZVCC zo45TgdDmPa^rD=JvH;>QyX(J*^&tFQ(}wX9TIU~hMk&B5c*0!sXsW*CwPyiyiEq^i zV at WYW-*YtDCoU?hh@?!qKM$N0_%--^BZt3FqR-;AWoRTDsocI_ZE;+l+DXQvtXJxA zlVLTIbl3rPQY%_x-{15oJYy{j(Xc>3-sJ!4g6F?O$G^j&OAEsHACnaVI`y`1xIEL0 zSksP~h7<0YLzc$ExFf%Nu?C~Za$_TWn-NH}+IWVb8o{9HT$Qygr8MapgPN^iSUCZT z(0HylT`${#*X&>29wiN=GWDqQ#}@xsmG#p7_4DR~KId~LLE(ocmAcxlQzTd&_DJAq zuP4}4HsrokCgeVqFJWlOoshl{z+#4ZGsN at N5r_b4zrZs(kAHYzn6sRDB4O6uUCB{1mH^<$l&-yBjA;~dw5_a at D;pUOXw1D$zgBf z^BwQ_x@TZuec8&SDwQ7$#PHQit35YZ&{>o%^skK%* z*)GS at Yb<$fD~0jkdI+ouWqH#AtNGv=Qj|4P$4{QXN|e&mrI7vdEJi55HPu_ZpL!R| z3whWw%(FFV$@YUDK^#z_5n$!*k*#JGP8|kOwc!Mm0U;6OWVaD5y7kNCv0zt><()q1mKkkaGCvVsW*KTt68WQ7HiNQqBV#|IYfZ@?61^VYdYNAbjp z5u0ymz}uVyF=0eUiGs1SKj{`-Yitw*HFQmcMwOCJwA*{Q;4h|GSJy^em!dE1v(qrp z at Po`B#98*wza$V3+50Q+OB%|d at Ig}~FDeMeAXq{)!$VI>qZwXwSDcQvA2X(Ht4|S4 znWv;TG9Wf0fAHd6ju!n;rjap5=c{Bl zdu&>Y0Jq>GuRa=$h{8j|xn`a% z>XfVZguc;2ny<8yR^b{Ey_PBG7IjE#XFT{VwAC1T#v=KPE5CPVk at jm_LMw;xC%PWQ zJ!hNk+wW;FPGOiMqu_At%-+!v*`AY3bW*o_HHxy4JY$|1D+kNMUD z8q26AoZS_Bj1X)NuUYD^-=80!=1i0%cGkx>E;2k@)_|2BIk^IkZfR#z7~o1myqTo( zsI4Qd%{_b#2WQQ+B_ksXyDU?n>Sds65 zy9*w+f>8v6YuV+}M|enT8wnR(71x=La^L)9?5AGG>vHUYAj z<*?Y!gx9L0MAfF{SQhFtFiamdE3u<*JnpTvxu?`Y{8F#{AKED^X8p05^}ZnnMHD(uGn{V}+^C zbKpyoq79Y9Xf&Z2juI>DO=~w%Pea3owJVaTNLL_P6U$s{m7SSTP>phSDb=bKi8f5a zV$8|T5s1A8XrFMuG#uITq3QbtP%~rTfIn6GdTwukz6*9qi at b?YH_4?@ZHL&!5}|Vf zQg(}=kyjPI6Xgzn-_o?oCnE79DT;D!d1xwS5^%&jm8En at s!|eDQlsUCmj6yI4z*S) z2tCV}MrvXm0KTMfAB1i1xZf&I-24H?Q6o=S5JHs}lX63?5jPpjw% zbNO4dG*rx(N#^x8G4>!bxk!U}dRS4bFw(?e8c0gDblqpLp)jH{;q8HzN*!V%Bl zis#Vrbe6`m$MfYWd54PGVlqRF`58kBYOEraBsiS(vbd_sfiJ;P)a at c`k7c;%WElt3 zyv1k-yU&|Xdv$rR%5O;9^mY%1pjZR9%BBKL8C0cVR`XXi at -Eks@_kXPJ$=RAzt_CO%15m^e+qC#)$XETIynsQ=sm5tfU{p@{13R{& z#JrTF-Kja1oRmrgOs!qn+DzH4m6Cns;m6vr%4D_ at R-BzJwCtBNy#<@;lP`CV7OgsU zoS)RRHsYVSa$&B$u_;{I6q*{J?TW>(wtrtQ>r0zzM(B18)wcPQt<|$7uFbBPRx2@) zE4ihMK%E2vV(Q7?bVTso(tfyF42G0K#}d%0jR|#+N at f$nOPibnf73Ikb%2ObMmY_a zIu7^`RMH}|(MENe**Fm?Nm6<|*!8iv#jyu3g*H1Zul(Mstn(D}vodOo#-r7bdUR3qHSTcT1U=xy^~?BD!=&(FM&`dNEY%?ln6h1-}Hy>W~3l1KJ at 67^-AprRHI z)lohz#Sw`fXE%r;a5L(}{DNv+$L=DnErdO+uovACtP3EPWEA0jezGb{9W%SYW$nAT z<(b?zO%jCs!ZkC2oV9twq{hF)q)8}EE at 4zXVNwm5s8zXMF~V@~fSoEX`O&l$xPD-D z=8SC+NpqUD7K$his77dtB=Ur8Nb|FVO`@9-#1dJmlGvr;O7EM*9*Yzy-Zm-5*Dz+d zVu1+{s(8`N^o+fV7 zjfx^yJ3#T$N}MFSV)UlO*#w--t$jnA;PMo5?N8J#)IoI4Ns4;Zh3U6j|`h2*S_oV^zG?Qk2?- z&V&r(jGh9bpWbZY=>woxhO|O0rHuQNWhM;-(|i$nK|~rCFJ=0nEJ~9`svSm?zWcni zv`Y4P*k#SW$u#K*%g&-=!J~qxp&+cARotMY%@Z5ZOB>RADGQQRRKzw0Hxs#R|FTm-SsK(d?O25y8?A zTq!Qgn^gI6(>1L!aAD<+v%Nd-o$dH>T8306mQu&lj61N;#2RS=rB!-|_(>NNX;Rk7 zGF)p5YZ1R->#lxoS!4w})mUHDbOjY8?TBElvoSokPd-PI>JC!X at p{F%PA;nT8z_n+ z?v=v?e9e+x%Ywhmkn7C#2UUO=ERxBD6TE$iBz at jek!L~12b+Rzl&DVv%`@mHK7wBi zM9)@W&w$EM7Ap^dgS(m&QQtTvBp=}Dkpu87yS0;TJTWfSTqzsz+9G-A(Kb4j7o!8{k^(wFjFl;4zMEvY7 zpqnv%BFdCWGkh{X&QrUea~!Snr1?7Bplx=qkX3#>-X_RPKG0-A;)|9;NRYcJUgJX@ zd5O2X88F^daN7vX#$+k&?}!;Rq=54Q307f-pw_vHd-+n~l%-C8Q8Alv(k}u}UmKNgsiF|%We-2T^1KFA7cT;<-I0Y_UAfdbL z(Ge`cI0)tWjX6CZIM$?b4RI%5v#hv at CY5?x>X{-l;%-xi9U_kd*Whd7 zspM`g|E6}JRB>0j)Vk>TY_Cm|)KH-RR at AB}1 at C^C?0R*U(3l`_FYgTQJa(j at E0+7t81Y*Am z8Wk-irh09u at Ibt6vKsHe1EYHXsRmRdb({^fKBcAwq(c%7PsWjOoKdN5$5F8vn(dq; z-WDo-U^5x02XykbSy~d?2CT0VwxdMVTC3&7ntl|WNXwLq+)~02iC6Y9Li#4PHa8&WV zdCU-Q&gXNme#E>2J>@Pv9Y at +^%z+o!!*13EvB69y*$OD_WE{X|k5!5_)9lETg)8tZ z+vCTl9JTTc#-fJED+cZB^n&}sG(PRo#Q?mzF*846Ceytx&HvfTT(dbd*R&FV-QJpZ zby*brU;A?_yvxZ9c@#rx1Tq4*PyWgKXRGFbca^oN`G>f`ih7MXFRZ8K(9Y zo|Hu8vLAP42)zTF+56q2c1iq!(zsQ$9!U)G5_MTfy-TW0fQ!9K69{xx8>p8+wgL7< zUW+hE{&Z!#8!VCXG9ko-Ga%ElQ$c=|>X-E7Ha*2w)AB>vLGmVu0#(S%&SiKE6z?;6 zRFm(G{zg}MYNVY_E)1<~$|XJK<%tnO5K at 4d#~h9M`=yPJ9EK*#4V(GqzPqvE)*!rj`0dx!D>_S z1?xBXpKtZ$FTvDKt@(95B#M5)s$ zDR~0u8``=~S=^7vLzE~&RX--i{dW}Aq!_4#8>o;jrBgaZe-n at n%q2twWE}+E0jQ+vVW>>k;w8tC5rq`Zy>5O566X= zHHQ}diX|PG^$Tyxr^FrZU%26dix8VvqTrI8>cIKj+6Jkyl!n7Esowdm4BFQ21?oP{L)z$(Gj6lO3vQdkFl*QHkH<-$QbtvA zMTFD_qjZ(B%s0rcN7p#SqB}0_H^F5Ycj7NNU2Yek83oUmJ(-!bf$pEL0tp)tOz+~m z1vf13{1o9BoG~ewB}rB^pi?D4E~Zk3B;waXl|Rrt6bIm~gA|hot-=-XOks41KnEU+ zdU{{R;`TW(4ALGu!D`P;@Mt2(p?%_(OVzGweN6dG3s9GHxI}vcDI)y=LJ0iayhJEu z#F6P^Xie^15>dwB4X9kpdl5X{6Y|Fitoa*84;obbA`-I7teF$VfhzA0thIO-+x0S z3<{T(_+N-j{|k}a{}V+1M<1?AUCLoW5%F6;p4{pj9ecjEu at OvIYM#uDCKw2#%Ijjp};Z0=3 at 82MteIbH?{*EZd75q>Nc_kcL;5bSb zPkv0#8(o)MQyp4k8NTExA7b1Myyc!_lB{T-o+>BTL8thmOX)|05tJ8RFEk(WvOc&+ zy&k=qEzY)MC;e-|cCNh7*Jy;=v}I#GQK?Pe0`oqUP0Jy%dZiiCC(kj1NN8i}(3oSM z=f^3t|E%W&si|`(keAN at Q-j=1 zAot=c=;V4;eg2jO{Wp;t4cG^N+hw(`xi@}0Ogfc4nsQCR79L6t(ke1QQO;1RpIIIA z{Rc`M<8M9KHpYeI*kOFAlse))NM|VBxZ3avWN1q0OcB_UZ!;vU=wRAZKn}*lGTBzT z?cF?F!a_+=b$IncDcKRc#&tE$v$qWGsA$X23wHFEZD${t7yxznFd+?eOXcR}CGEhm zLo?IiNXds;xUfcPo$v zq9u6Baf23*enRC58&!915Dx1nawf=x%0%XiPM z7&ejpN;YKXlM=uu#a}534S$8PwSDdKad~}}{k5`#K=7kAbVf{ezdn?^+O(D*0A*`> z3$L>?MI0uFq;ZFzfPMMkhfcC;JkMs{I$ek$3bHero7UI-d#>5s5^rb;RF>^Iu?DT} zeg&AR$wHomol2Tak5l7Eo^9m_7K(r^LT=fut{7ZKZ=l;A4Bh1mn at ek&&! zTt|7m+L<>u-SWL~st!oHHFaVtwwe~zc^5KuXB(>7G)9chOT~NBwuxz_c9I{_wb`0& z$G)i9+%o}*Kh*EFjY}puTad3gs?#7|4T+)n2)1+k>ns-e+>^>uosWa>rfk(>b(%ll zBga{F!+vEZQqGE}$pQ<^63C(XawE|qi@=JV>7t1tmVatb47cQrxNqC|(K{_kK9F*; zWXxR%bC-3R(Vybh)ZXo_X~2^Y!9n{GZQSD4;PQH9rOl_a#O}&Yj`E|y(Vs~&wJ!wg zQnEEn2jm_JgOn(w^Y at z(xu7sG1zBgPF*t!#Yg7yw?LmO(jf+x0MJw4JStsqDiZA&d zTj#WI4o2c&}*m3eQPONY3RdXg=%WH5-6_V%G#eQvOZ906*hA?+5 zSl#^(B4(m^x#GvJ2VvQ_sdg${pX1})Od<$}(f9mhkq$}12?;1c_#}XD^m}y-Z3i>tcFhq35_ at MdbsiNF z;)V) zOC*={yr=*D;{ZbDbBnR-vd!n=ti6Jd&BL`{;e)R8s>)_D^%DE+B=-A#M)<#4+5aQk zh&5t+;(-AHg~R_Vcewvcw)rn!rW!hbB^uOkQwpbpP~FQxayjWAg<&ogD7lI34aj>$$GjbtPJO%aN4e#o<2 at qm)&)OolLC-OcvFwAiWAxTui0Du at akGF1>ivo&Dx) zu57It)y0KgQbT at 8%}1&?ST@$oCsaiTg!^7R4fl+uyuDt(A{o_1h1#kyffBpE&`zp& zynAa3-bbQIa)Tv55i1+0F83llZH06~S#r-;2ek6;H=Z-~QAk&ZLC7 at Tj42-pO&=y# zfJ7K4j0Q2wk}lF&@f5eUDs at Vkw63k(Jk44~kzRc_r<;mkU}vtJ&zJXG%z>hx(uSQOd{_~44QAv6IKDbGk@ z5Y~LH7Ewek2wr56t8)~*-v>*E`1uY=M-Taq`kq+5j=Vo;=(ZR%lV>@KlyJemuxypN zGDQTJMk+bJ%bfagHc^eEFu${4)aL at wrEd}?faHD^gcjst-{gmtWi>%J-a|SOZWc8& zGXt|~>on2$hTKHG$2|-(unNDur+>iDEuDMwacCG{jr*bmhd+S%)r^@>z<~7Fzzz09 z`v<$&p4xu*!-a>=#niqmzP6DSikRS*i ztDnLF!s$Sa=_>`V9FIvf6mK94kO3F!YPi1y*ew<%mz-5d+7&oA{sT(X0bGe1imeZXT#1OgBf? zJxKmLW4i=!ck(`@^PccCE-4F{@`e8L>jeqNuIEaA{*PzG&S#0E#0&Dbn2hoWhysEN zCX|`6f7TEIK_i6z51wNffS`~GQ;beV-NV)hdix~jDPJk>Zl7M`MyS^s at RbC7$9WgN zF)G&f>_|GJpq#YcfkV$8B6V=AXdAz4R`vG~Q*=Y^ zT2?(>CE#Z#BB@)$tp at ziD+x?L#dfG9esX&`A!I&%} z?oiEqjK()4JonCq^!~0D^Jefl>k_Vz6oHNJ#zcMB2wk@!z1zWliGvmXxiVeVH`VpM zI;oV!!yBRMXsbV>w$jg*KH|lFx`O(p;ER6u_nye7Pp4 at IFc6UEU*|lD|4G(WHnKN$ zuoE&dF>`VG&kS6oqW5pz!j>U>opL&~+aChZzy$&Jp0`3RR>IWc2~p(2o;mgu6RZnZ z4LoFf7H_8ef&Z8hYTXFd#uf?Zz1(Esu$a!|@wmAW5cmbWIwX!J#(RG|IG}<+CtOw) z>5SLEak3|v3Hj?V at mVCPoiOrpHl`}7=@ARQYA?4bGIOVi+$~IT7>pqr5=L($CCIxp z@{cRJDp`}R$Q1MOw{b-;V^(loyy3LnE1mW_-tcOA9aj%>Y99!AB!ZR8r_OI zZ8K{^w%se(T#)jmD7ntjHlIm{E)QES2y*7QBD>bRZE(Q>!_2RUBK!AWY|K$YP z|D!5Pxtje~GZIyue`un=+35;XfQp2B)eCjQyMTaigolh;CmB_qfWdP_I#dFz_DRd4 z6~4)`knn!qLcA8>&J^1f&T|{xn$2W4>}20;xX9l>th^8aE#I;FbB;R=*3u>?k*epB z)dAeq4qz9SSiY*Nn|KEn%K;a7o||)g8*8Sa1lVvgFWT^Z z=HR{556HmBXwY-2L>nVF{xDESM-2%IX=FwF08n1Qv-vv4odB2mA;Kv+? zYGEBBj5-)4-8hf;nM7Pisuu=^%K<|Mjp-DdT=NRD;e{3MavU*kBZz(!m{0O>DMr+i z{TCQsScyL-_NSxEI_N2O8x(~%hk)Ns>#S=cUmV(%-D^_XH|oxFv73Q4&LSx-iWPBr zr5b)9bXXI6cTF>{&6%F7i}-jsi`)7+rwuoa4Otd3{6)~o^3Et at kxoM=pvs;d^$}U- z_)g{SJL_AVxVoQWxGy)RdA7=M)C+DfoGe>1v3EE`XOuCp8>l5wBM;&NK;xmsnaB_7 z0w`8v>>#xxl>YNEt~A`fne#@hmhu&Phr`!IZ{_7zbHDn^g3Dx>oGwm3!EqE85n7 zQDWZb;YZ?rE$%Egi`{(pCUX4&u?}3Z)$415C(fkCXNtz)_N}fS_ z6U~Dpx0EA+uEou_g?D0)QEL7z6 at Ie5lDkj7d$ZnXOaVz|>aDm2#D<)!9ArJwE=Ie! zA6;rE3^}QI#!?vLkD7-|d$T}eCm6!NfHL-;E$NeC%qo)Ah^`e at DQ!h^#0F zW=ZMDdc1W$+0--rJofm5CU6=_cocYG at rQE6Dxp8giM!!r`?_Q1p;N$p;n(-i zCyd_}uk2A+l_gFPPo&rKM%Xw~w&8F3=>Ud#%iRfB<5%iHDc0a7GJqY^CI&r1yl3j* z3M^GtMrVO{rcqhh+LrZ5GY@%9{8|%Tx@>}tzFUQbH(;Vm4N!(xU{a<(lSfhnDPi4# zQ(@yuU$vHe!BuYL1slAATN&c#YRwgIa^)--Uy7BySH)zDRv?NZCssCuShK+m#=FHz z+r4$s+}2RhET=ujZYRg4Q*IJ^W5{%khe<#1K?J$-kqIk3P~WP;p|)~#h$zU+c)ZaP57vdNhV zfE{3e>g6)Kv-qhJAQi%!w3m8o{-HClX1mC4A5~q`Rh*j9{2=S*I&dDzi^tr(>>0_Jr|T34})qi93d-KK}y8A8kFsg$nXM>R>cI#5LVjKWQL6*q2uQDI z(i4O7DDec=)pKu?Y+G*hnl*sB=9NkQ0bBJc>=Jq0a3s(-o|KaMic at zInvzn)^@ba^ zW5ok#U^PdA(1dYn4zX&EVYx&)w)zS{@OLp4((VQ|g1U#Ih4rEX=r`nPM0fgz5g@}n zDHA$o at dnM9z99_$f+->$B=#XbL)#(BHNezHQsuuC)27)~2HJ>EBhGX_0*mj#@B5P9 zpMJwP(u6`)%Kr+^>l$*b!8LCaM&C;KT_LyH&qE_zIveX5wn$V=?wF{7w>t&s)Y27l z3+2GM5ARBfeJPK;)9&3Mv5mXW%&o*F=JV&HGWteLTLtpc{>_YsH4Jf{1_O2&&>Q at O z#1DUdCNmbS>?}g{8dP}^S4df)3@;geCr*`akCvEjvG- zq&@!KrYOU|7(XIcCZ^dk8V*-F9#VcUQm$@st(>uP>eD)9u)9 at Y_suAsA=5hZ&B4jN zccD9Q;@lnez)bP at i|{Mt3t0K at 2RG2P&($h$ARtW)ARwCmzbWV6(@T@)g$9ZS;vYRw z^nU12UeO|BF*smQZBhOF)ckqj#^0}&HXXD&nsV+|^@N%>J2x*A$^4BDAN-95iQe)G zA5A;&3Xe0EJRS+Q>|^5Wbw{}F&(m3HJDY7U)04+BJ-^=21bO@(bMcYB8F^R3+l*fs z8Fn)vz%&tSPyK&CfZ#vnVq$>ulJDk25aVOq20;{M@}CKDWh39Ra@Cf?YP=(wXw zM+k3~j{FQ!Bq71jAhfRvdr^;?8QV`yFp~N<94Q^K$whmSw``@C15aJ`h&|6nOzvs}LNh-> zXsLvN*|{yQpW2<7QrS=he_bK&vu7 z%XpCSI%++eWzo>aIDaLpBx-sb7Jm((^b at 6Qu=&yvC-eO9r&eav%@nyrrYC6n)=&i* zxgWpCszX2=+;5k|{qE#(Dv8frycABZON5nt76<*cdR9L(W{PV`$0th7`8N6;a1AP+ z?bkWdPELUoOwD%J5n`y{<*>{+S+7nO7`lVxS`;UcMZzg#Wo`Ghc*zaUq0wdHRP>hG zv5a&(X6*16RC5d8Cspl$zS1-UW5ev7>+s68Y<-)W+@&K z`cgMIdr|IV>v(C?mW6=HUC%D`6nNn`I-AgC-wEObL!g9^yvpN4F~bqp166^NUGc;I3MGhtuig1FT573HZ=zq&qdE%X41UwPL6}|qdxBWvx!E-N z5Pu#EneAv(kdu~9oIy8XC3$}e?6%XQW+j>N<~FN2Jv!d{No{Fc{A64)Zn{XCg+vTw zJiy3rDkncZFD-DqHSVx~VV4}XQP_v8fI-Efoetu`Qi88J;7{1-!5ThnhvlMlA`;!L z-avZJDOrrBVBXkc-jpgM*ytdhXoM35w`4et1G~lV&z!g(*~B$hh}wV3Oon$P at r zWAO{LS;TQvOjzSl3l=;XO(NwFh(a)>ShE|A8~@7OmI*i9>`|;WhAbkvW?*ixGNpMb z8>MsO4&_q at eaXDIJ?}FHQ&1t)qgu6KsI_9soH63=eXiAkvdeSzrm}HCk~h%!Fkn)Y*cf|idoQ5tdhj(RJ za?OF~6VF|V%7k45{Xy%*=jr=}Ruhu)3MPsZ_8!W9we!mG&s9$|o?|fUFFJ||@vl^V z|GeYsZwyq$P60&-(XW}0QWrr;zdQh%l7Y?vf-*nR5E6BvP>Cc6!H-F%BbjW4$9W6n zn?m3e1J3Us95k|F1>Le{5c!Llg@@;3a+0N?$M4T8lpz#@Y^o;X92`$HCwi0Sys=gU zg*NY!F&V&usdD%>GtWh at UD=LNG@79XJ$^H2D-KWYmMxoB+Sp7Klp3Bjj6+o0^x8#8P z^gL>A`GxrmF5r?HQUbM&ICjsJ+G9|mRZnTYE<@SlW;}mFZK$Mo&gREOsggb=BP>~k z5xhslb4DOZIe8USgwlAtW0E-~s$dLMkfeP4{M?<0zTZUz%9+|Y at X<{fwnk=Ir4FKn zKZVRsT!SFkd)NpmjI>9gLDT0Lp~br`M8`fs_FCsd7jm$E-^=uLMMKp#tG>-W+luK6ieFzDX2 zutY|C_yD>{$bd at avNC>WLX^kK${ zfEl?cI(@52ST^(JdPcsXXiKGL`1>Ix3@>KC(& zCwT*&$?99i7AcEwx742-jY?y)0m}2{e#7fpvq1LyJ$-W#)>%}Opx(*LE#Zs^pMN{% zWh{+0u>Sx85{LX(0sn8#{{OzzSH#TL_TNOU{~>Et-%wsqMAZvPF0RVU4cJFpgtimX z4);K;LTl0%qTdfLL7ZM>{71(n{N_7m`ZqWKE3jW6_dy`SchJFho+J`@y1V!D^fb54 zmCN&*RL}R at Cs;2dy0N85a)>T26zs at sm@g~|C&37qZsY+n{lgXwukO(*<;d`AN3o%9 zADn-wNe{J_%ze{uN~p^Py9V{9^SD)+DOv0bzd;}S*0Iij03guCcr&RIOY3SHJ%3%T zmWs7-I}O=1vKDI{Q(2XB{pMZH_3_MR%W+es^yA9M_<;gZPIFBF2fZUdnyWJv9|I!& zx{Pvem#wCAy}DjvGy)2zVzb*+<_d0L%|#z$2}3Lb<&lNACC%P=1l)YCt;i&Lg`~r< zpW9!>)wOv3$n2^pnT at R?K1*A-I1M(9jXL>w33uL7uIR*^vUt8R-vIX)c}N6mw6do@ zi;deMF9}RU^@(NsNIQszht&Mcj2yc>CJCD{d9l-e_{=(+L`n;szWv8>I)KwATvoH) zsso_rMc8%n93P&Ms_29mqJ}FN5^le#?gT*w_M*Beq1E>TEg at C;R&j{cT(yzKRsf+P zb^pzU8sGms14f$)ECy^EOuMpIkrB-w(XKV1#P{1bz_mPa+a~1etuZ4Hm04p|EG9XsYu*Qv)N#GK75tD2mata_tZU-F^Rj>td72v-zUhUR^fV0s+(eEG#=W zMGzBjQ}EEu5h3nuxBG#PEiVR$Z4b%Yn1JktPWTZFI?bOgbn=d^(UhM!ajY`F0lF^y zmRehY=pHz{4R9LGpL*oDOe6VwvSH$GQ(B!eE zXl;G#cU4jHmxE3?gBV2)Opo2A2^x$6vu}@|Pk%OU{#8Wa8b!t1GdE};M2Uzuv6AtW!wY0S+KbI&hUtCgZs5u-DTnu+rsJlFWGMByW zz_rzIR;PO6tJnk_7y)zq%AbRscBTQ>UXk-z7aKPOA?R-KWvZZh&BK#Fe?_XvsH1t+ zVwG;NpgEimpt^wL43OP$f14OZEC8 zNC$Z8DT>+786QERlbI_V3Jwp?gv^5-60T?!G$R+>B-_Bd7Xi4AH0!F!`qnG*F!ap* z)VX25*wX)*Q at BiOXX?iYH{wcnp!Q32Ehq+ks+0h72RAg?wJ*eu2a&Gtr;4W^Ni&$0 z at P#MJuil)E`jj-Sf$@1vqM1$q1F&YBuHF4!obyIA4>wwomAZhC#cxlU^crb>xe+$o z+3qL_^VN@<>C#n`)i4#AArio+*ZWwlt%R9n0(w4J7UTw#{Dex1O7QLO;(iu8H!zW% ze;ihr(F1{BotOZ6(lu at CiZ8s^C?$aJMuJzYb{=X?oV5arZT6a`%l6lHD{%(Q)sd;$JJ7?d)nR zj)9EqCDmf*9B1-|EFX#GwqgmED8z5lR4-sM7BrI|8pUXdvwwWS%+CK54%2PIkMN9! zSYmrvMH8wHBaA8qa8j(eVUALr)h4-q{jGTP{9+=)0R;m3hWb~oi~rw{{oetrZs3BV zhWclVbjrR(2gkAu9gP at VlHG0ryb#F*(#+e!8V&##-c&)1n31faZ`{ZSroW3SwV)K#P-nzgJy13kX&P^!AVs at _m4dkRv^Gd9L74`f4>zYtRI8wdAT{ zXgf!wxN-EJXrA#33)@C at 8n1}yRQnt#Lt&k%CZJ<7RvKJIDhZRA zt79B%7#c9NlJUgs(a8b`1nbDpAlqUZ+_n%8Qh`;D&NwFbz*_7ybE2>~j{+|VToVMK zbaTJ)w(X2hPc;{@_{S!P(H8|Sn%Z5?>S3&*oE9Cl=U}%2WMNg1JcGmeB-gU zS*??=+3}E)6wO9olJu~5B`MPBB~E2x;SOYk;VD$S?n{hys_iusb4A9Ip;TI|(`1h9 zgvW}j<9vr)j1;SQhDAf8f6_Rpz1aco=m$HG?y)iMqGGih?BAG;Iy&j3*G)2r at M!tv z7Lpr~*|B;Z$qWO*E&yINNFpsKgC^NTn4D!yx~J5u(rtU(-a|$BufNz-*sqFJ_9_6U zJ$2DVT1Fy651v9pM6%H3l2zZdS=p%?PRLSu at 7+Q1K?s=0LcXeZMAhZ306HjwvRBL% zEcnMoogoV0a~0dNStWHPq~>zr|HaumhF98c+oDxb1v3 at fwr$(CZ9Az{G-KPg?WE$Q zV%xT at Ti;%5pR?C@?!9}j^JD&af6nJ=z4z8e>tnRg at +SZb@Yu{D`K7^5w^Se?aq!fe z@vtH(8nqZzTUciLUmg5#*f`xJX@{?5rj0!Hjc|Sud0Sg+0gpJ90NO>`+6d* zB(0foQWGUoDqfEQw7LqmmTFNW+YsN4Ig6~!GbFk0uOaN6Y-C4;zYQ52hC(m}#kD!o zSd|*I3UxwMMWlSgW151m*cxDV>3Q* zG&3SUeh#b1tPV`!=IQZ)zdE6vnZuoxz at _KtL6U`tHLtlnb5{zAE?f{az#LyF4R^Z| zjPeZMAO$N;dH3rL55iZ at -w_SF+4H=^-=y((M{gfr=Fp!R?h(x0quM37Pd0j(5iv#Q z%820Zx}Q2*o1)bQm4>*-ZG8p4vb%p%+ at liib?d{igNyIh?-nrZ7Bcb0pZMq}e1$Q2 zXh!R?xRDTnvXGAVb$F3t3ecF*DPR#&7Ir at yA}ir|IqdHcCzI$ZY~4a>UJ2uXpnS{2 za|)I1B{b9YgsbqK-lYj8W6g7qtVtE?jAG-iUh#;0 at qm40;R>kVNE<-VjE-&IMeZ5x zkB#lSKBAYM#${Lz58(a$+w&`I=G`t0e_D+;%$F|=|KnC;XYFER`@iysl~z^ZKccLO zRuNL{r37b}3V|;mDa6EuEHZ*n7V9Ze^dv!dh|A=n_)^Mo63-$&$3mP+kh8LMa_7>% z%Eey9B25Cb4vdXMoL;VvXFm?P+QmLzv$K6c?QvWIeJyxHkV!3fKlykO6vBx7CwHEZ z;daT5H2Nj687dsdF&DYRjBpakS%tkP64SjuQeM4#inZQqX?8+G=rCyK0F}#AQZG?A zIG|Jv!YJ#k(Uf81Q_V-{$=*TAGcE(#bH<~J)IhEMv}y7=*!(IAa6~MiY(NnOOM8ue z+RZdjdp^P0EP+s{B5%QE*)|Qjud~W<%&r2B4K*AqeSmBBu=jqcy(}@yAmxY>RgaY7L7~l!4B)ZlC8_o|f50g{tK&hxZm2 zw5(p3!r?qatOE{SnmK1XsZ8O~66hhN#UClOL1Fa>6M4qT>t*r|Ji z6jDv4Xk|$@zgg0U?=4J1)FO&BlyFPlrjRP*GY?=$h-2ffzIVmiLnV`F_oyJqVc2#F zNZqg-AsQ=-%n^@maVGxeI3PLWkG%r8KwTQi_E&)=wm(#3O)BlGO0u0Ll*J2|)mKO? z^>u;4!a{KZpyJtMu4trzZ&vt4La+rgU?eyIawX0zz~#C#n?#6HtEv(;6%Uut;)rH) zvd{zHnq;Kt?164z$b at qqmmI`2MeV#L;A9A9jWdjEHoX at CZp7jEDv_Naqc37VQ zR+Ua&Z^Wr(WfTRKX0}e<3FG7a%Y~ z9q~PUb7T7M>BL_bUtT?`PXiu#5Wa7joo}B8S+6dT at a6BBSntPr&+z>U-VpUIMmNArz9~NP zS!-QQEaf9`>=gp_iPei;g5IanGFU9`b_@&G&fx6%LS}pe7C^%Z;Vy3wHerG(B>1(y zHv*LLkn~o7)&sv)nONc%eCAg&^1Ux^7TPyI+dpo*KE?Jf<6MKC-QFeJc68VCzJ$}tmaza4Do0lOTs)YVW3^3M&=hpPx-DX%m8Mea3huGXlHq9egDR` zuoLBNG5<()GRXh#y50ZL0!3_{9XjEgn+2j3Th?@enk*K z{yo6|HFpW`h6*+nkyIvySmafe6ZGh*@7q-__M?`Lej%asZS)wTm`VuJMx_49Df=r_w&}YoR$p&HP|^F920~UB%$B+5y6EXs zbLV+xGTk+QVL`|TTBoIDG9V94V*{5fEE5$)Mkz5h!~W>?IC_ALi;`4RrSe0ff9?QN zk^*gNd6AWxV;WX=2H6_;`rNt*(4$lWz!7T(X;L8+nafn3zT(=dJY`Lnmdj;T8WyW& zo!R|52yX{8sNxWdRh? zCNn^@+CNK3^6)skAj;t}K>k|9&Bnnp8{&+0D0`GNYbp4sGog>7N~mCx@}Uf!Wjm%|ppH#IbD< zL{wOUZPTDYHf_#ib8y}->06a4+qo&rxjHtdA%rmU8V5 at FV3SE?uMyEOX|A`nXe(Uj zvHlEi2pnE5iMV~BY~{~r0FRqB8Ze5J3U^kGzo1$$r#w8H_$M(ARbAlGW;nUdu}^^w z;ZOXLiM=Hbb;m1gzdbjw?pTVD*E{P%ez2rzxwc^!e~+KR#NSS+1Ge-+3Hl*pKriF= zy3B6?XMkL$hBtnyPB2=0 at 6NB?j=L%u$D=+yk~In?>g5GbyQWgFv7MoHtxve_$d_n2-hR2uIN8W6=%k}lYuJVDD7_z{^J_3$fs`Jh9L*oR* zHHPA%z5&vf9Ei%x at _Xs)5#0Oyy7$Acaz?-dG#-6$ZQW&&uR{z9r(q#n`5<3#n at 6z0 zcww`K+IxQ>04D at SkKNZeM-+)7Sr**}IQ!}isezuQ<1s6co*4wI_C6n;>_=Df&x~WN z{#Cn;nNx|MMD!%d17Cpi>~X4zGqPuVhWakR=XmIEUPF|%EmUz_%ZGyBuH`6F406@! zSX?usqj-?3%QmioQZ$ z)H>9FKXdJiD8 ziCW__Mt(TxW=5^%W`_V#FF`4)3zLK38XIjSi%iV1kD3_Jx?lq`AR2SbsieJvJKy*c z90OQ%q*f+Ex<}yBAkk(1N~PXyT`U8Huv%+euK$%uo$Te={rPkQ`wJU)FLuZV7L&B! zR#8MHe||1zAOUExHcbzzB%(7wEz|?mp}W}pX7iEcrvYevO2oo2PBZ5cXzoG+7U;t*;*e|giWZXXb`Fh;lh z7Ikj3l1ueLrmt!|Aa6P1jQ8x&(%fSNv3}!&+r-Tk#=eZEM52FJE)SLe&hY5!JES8+ zvUFC###t$9R$t5LB0v%3AZ}3B_+a%KsdG6{rPhp?!Tt>EHq^YUJFGIs1Q2(l zJXHR13;8g&!9uK2#D9G(wH~(Smf&5anGdSNDX6y^wln2w`1|aWaz%6s2Ipf5C6fHJ z(p8lGggmbxKLQ*F{3ziRgVSz|fq%$l4PMesh5AIjmj~q$19c*2h~Ck%k}?ScC|9cX z5CU}ISl`3N!{!(k#gscKI%nq&i+I-XY|bk7RoL#=4S3gt+bmM|fIaPeQs zEoxmL~7xSm`7N3Xhfg(BHy`adbtGiAiARnMtH1Lfl9qk?a!y zp|D8E2pn{aEIQa^(iHD at eN2tqApex?b6#6E!7FRBC z?|(8ZFICJSIE>O3Uwv?+9R2nN_P0A6{(>Q at e^g)$%)fI+`X6xq-x=$w|HxRsh%=5q zZ-SC9F>IVKf=86hsWyin_=1Tgsb!w<(iUj7mS)Y^o(??=_hR=l0OvC3PsDW6Jn`3_ z=(1(mp=#Fll)Bq#<7MmBwat3i7E>6$4zHS6g)u(qr* z>7Ap|7=4X;fn{_DwNJZs#d^{T+1cv;wvRR at xpyt z?y^lh6S7dxnB5wkH8KoVVsEcAUw_JbrEQ at Z`rx0UiuPEaItK at iNV6x8KnoQtt&xt8 z)Y)Efoe!e2WwHQs9qY^HsnSZrYuPXm^2jyy==;W?;zb3;0;bw4g`Rpx&7$Qo_E9Y67+c at s0Jp!##~IvWvW<{FZYp;Pf19phS+BvK ziT%+9SE}E&d%=NzE&)A2XKzSq$BZ{S5%J08Lyu}#O}?S1FyMl+niE4BwS|YS+CFcY z#=5C%<)Bo5UsT(nv`;gw-~gi*SU?4sB at 2%#tFk*V at fIT4I2=}p3|dv;^u|ztKBhlt zNY-rpO+)2l1iYAOH?SKt8vCOQS5Z|jj(J60ib*;}+6>ehJkzlAU$Z98>h*sBenB6NcUcMgS!pj_c*;LGTJg zxW5LIF^Y at dCP5T>PV{iaK`4hX!gCvnY(UEbp9l!Ho^yE|&O;X(gxYu1w^`G}y6qcN zh?ZPKx&cEl{6Y$LUmfG*74jL{e=-L%d`1EMp2J>N^k8p^XW5L8Br)O$rsHhDEs)0+ z$*n*lu>g2KkL6@!+?H?x*C}kZYPm4+8Xt8PtcgpT<#Qopm2Z!^iLFgjdSf7UO#)kMpQ9&PD?Et**d2Rs+w_R1#^n}5cx<+m?ic>nD_^?wpagTH1kk6lDkA_!<8K0ae+4XlCm*H{_k zZ%1QO_%NY(?H48q&NLQWpnSic+?WLj(w;!y6b4`07`{PbXw7!D-%hk2cD-J-cYnS; zf#V0U5s-_M9}P-F^0=4iqdGyyr6k8H;&0dbgHu!XYsOs*4>AVqonzQClk8Fm`7W at Q zqgY9CE!A)zng at FUEGOz(;#pW0_i6hab(^V1{tD{KBCa>oVoo7l?A%M+H5UV~G`~3_ z5wlSIjh?h!$!KhN&N(vRhT*T#-jDHe102{?r4qS#at8W!R9YQW9iZ>{;sCn-G9V4byEg+H zsF8e&A!sm4pcyacB<`{Y=TRCin%qt8eRVcq>y(7+lQ&8&)!5%_-{BRJdirqjqG-#? zKh~8M?ve87yLZHOW1e(nWcw}vmV36OB6gS#95&qSRvr%(3AFx)ue!0bk)@*;+rxxH z*-QCSTeicYJFKpBji`ZfN_m0*o8Bp)FK4C#qjwt^A%jwVrOBRF;BVJ#j*hx2N!X|8 z6~|b@{q55U1fV0 at _iSI$DnB87jPB3y={o=N73Eb~>RuWqzw+uRg+=F(wlU4av1?ru zMtrC`cb_t`j7*)-3wg*nTp1`Fe)2<*w5muESlW1pX|{2?EIUNISvoqbverRte at A z_{b?H$=gq1BA02eI|zHe4%!PlA3G1heoqR4wA^s$@zpp?=(z4mQ}EK-%CtdH>E~T$ zL*A7D_Ln!vK%Q{jG$r|08GUfKLip#D0V1%Eza8{iar@}!{3)Gjh%aBb|F28uKMy(n z3u$HKztVwHT?(5TM-yg~7zQaaO(P#g17-5dStmOwXR#Az%Z~$X<8nk@4!f+Uc}+u at r;l8GD3yl!4BI<@5gU at 3|Dlv}Gj+fsM;k7nI*381VwW5B=f^ z=%gVP8CSFn6JSk#uR|bQ)v7mEVLAtU|KXY*=us_^QtYD&dO=u6x0tRR0ngBr5j%eYr2g6y^DD4uX%q at Z$9QgJa-zZ1nIh9D#!>JGCR z(h{*K+z~|uf~yGoX+u_r-$!Vy45ln1tsf^l3cey at Er4(h$%3$&f|?VyWKh(3>)NBZ zIF?YPMUg0h-8NZIYKZ270BcU at d=`p6&`b!3sYFI*P?<|+`YP;PJtPaBu`b5ZaBZ!9cQbki_MrE<2#n45o^n&(yL9t$!FMwx6fAf`(g0_^j zZ`tB7oyl?>qO+adxL`c#Jb^}N-ZJPLuaE2yagpUh+v>6+P}et3nHr)4QTWoZewCLB z9OQhhFVjX0jl#1QZi&wv2c1ZN&>XfT^#DaeyiIyPzDxI=A4HSD;g{?gQBE797HMc7rjlE0dVH zQ~m=flZ};z-FcZ9e-?3Dkv28yfY~ap;j$e5UKD~?=+h2G3KFrX+>`_EFhbm0EiCbV zix)Crn{%TOSz_lCqG)9p-I0KU-!|@oN4ouuE*{tuRX-Le__i#CVKVVnpX4*t>FmI^ zt`XNV^z{1lYkeOk457$@z|DW+^;}B_(+k|M7U$$R>RjLiH)5tm9bc}TH3vT}96}CaOHT8E21~jQ687I~7=;7JegR5GeiCtLCZxVR9 z-7NtH$Hmt;m_sFMgZbCpe=|93wt$g1pkKZK{@WLu{Y_TetaqJ zJ|ipo&*bmGd;d5*W&5%_95fxK at F6aOZ%7^C8W9{jC=3?wj^2Ze>tK_%itBV9`V- at 8 zJz&~rAf!A=fikVGwbDmlpHZm3J)i5k;b$>GAKqkk?hIVW0ejpaWvoP%L8Yd`Ketev zMw1k(Z%Ubs#cuWYc2OK#!xPY@#=PypK-Fn?mkErsJiU!;h at OT81fR?ikPB|5m0!lx zR$7 at 9<}v;th{4I2REEwmu<+b&2e at WMFT%{ZrM#$u;927Ww*_;UOBWDuN^TSa(o)1O zt2`toKdT%z9Bf2f)Dn2AJ2fcd;||Da;u}INCJS zr`K?-wED3RM1-d)@?aN*owtKRz^S3t5wD at E!G{Sq^fmZ_LscQ_18E`6+^#rS%4S4T zqcIiTT)?||4)eSQOAuCz3tq`+;@49}M;9WID~HLxV!G>29bV^z70>TsOVu5VkPc^M z9L0A=4f!X8#BuIC4h>|;D)ZPU))BuJPq|(jf%&J-z);MbUzwjZZPWHH^%sm;@v}k z{Vj<)N&kb}><{N|1OM`c{r{@y{!^%4{zIr@(NJZklZSkFv7EOdH-R(&Vq029 at l6WmT>z?_C!+{s+8-3k1loCK*%WScE?(vx6h!)>Nk&WD)$@iA)00fhE8(ZI2i_q zm^W7+*lJj*yy>*T;i}h?)p>rVWeIdF7O&pCwfYf^M_=H!R&^QjL;N7fH-;5+{$A9{ zCw`bIA9?b+{b6(gS4GtQwxUfd7BaI*KB_~>jYt8B+gTXiHp7ApHZn5 at uj$!I&6Vu6 z7(6^qd^l0*q1t z7PkE0TtKINFN_AnU&yDrYCCvaMB|k9l;&|l$?f0~tjvU2zQe^5IOPc=AMxeR$_4H_ zI<}Ha&Sdt0bLwh@=@R9}l-~4`)!e)hAmXVgMrC1=5L|Nd_ETM$S zq!u3>m`jhK6kxbm0}UO{AF<%oeavqL##usjqwmA_g)d5 z1d4a5PWTS?TLfRfG{y!Lo#44miQeORto7QkZ1@#UF<;EE`O9PQ6@(%7bF@|Ui0Vp} ztIphG{VRAO7KXXJ{(v_g{NLDM|1aSE&tRtiA{DLw>2F+sgX^(M4CfV%Fe9KM@;&7y zU{xGz&bShOkn))m>N8(|ODPHM?%6cpZdP4RFki0AYCp`l<$lcY^5pyB`}ma~r at 3x; zrw#;s){uoLzaVBFrGTMa|GOHpa?WVU?-B;U>qgVI?bRV*On*2~?u?(vyUoU9{iNv7 zhO^`Lue((OSS(J&#*l4f4$%_F~Y?U#t55A}-^QX_K-B#hW z$loO^LxfR0B1*`&%EGXfEngJ8s^&3rcDQLF)2tX#m8o~yBCr6B`Ed*pc$$R~=>Vf( zWlWdgB0GlVlJ5X1<|fTJX3IPa4Q|K=&&Z8}V5rUT8@}EM+h(+|k|vyx>of`U-!XXR zpe(#nY at qnLx!VaIek zipDHuXv$(?nw-H7f)i8sUaawjo_UjS{|e`C4Fn{Le^j99zq9D}2hRV+->~{41kr!U z+NQ75!X^u%lvlC_#eDHg(nRhjM2mzi1jj7YO}3BFieDeQCgtzu`$X)*8TZ>OZTNnL5cq7qwxzh1$(f`v{vj at mp?JD zd`(!KKb(VKbN1jF_~

k8&SZ8C?(bs(VmzqSqZTf zDZIdnc5$U=zke at 7Ip!iJWmzISBNJlEHTDYn8jqKS$-%;A58}KdZoVwV-LnqK*d&Gc`}^IE>O&Zq*9&Y6 z?)mxZ>Kr=mI*kHp9Cat5xUv}1!Z^Q!qlVGXCxRj%72fKPi at TYXj%+L?3E|*wt%7)% zXkqX0a&zJ_bHU~8jZwt80Yrg6Xw at Cf;D#p8scKL}IMP-X39FcagKq6eOLOV4M2;nE zE?E*?Yf-2|7Bnw=&VYiwQ(x7{zRyRfR0rP^(28oJgpzZ`!Y*epBJj72R+OoQvIbgI z=LCf2;7wGzh6Z`-I;DjTeCMbqXjnw;ZmiJSZR at EjxE8?>W at MwMcV=y+B5y4>&_Rf` z!E0bZmkq8U!`Y1y|CQJo3{8B4!=oP5>{GEA-L{&ujr%CGq{mbssxr|-X02hJgV3ZK zgsgpl!*KhGrZeQY`{xU2rcn;yuUhG}Lt4Q~lfV|naBxVm05dA8WP})^6;O!cytjXJ z!RRujYO!w at 6d@wpLpp%0_m*tCrx9at=QaS6jUpma8je;{#>TKmsStAMV!NlGL|OV| zoF#IEUP3c*rc^Ysp-p{{Ia%-DmuV9vY(fXpSRBJJ>Xk!E)(p6 at qKiKd`{y82jp>mg zF=w>`O$fcq^9p^5Y8r8dpIe!+OR}dx)0{PxV-i)!R+%=Y<2DF%hJ(ObOrlowvX#oq zbr|}jFs9W#-qs2SCGvg6e(vwF4a=`yi#XGwWsx#@BHL7i83qZVK!#Zen(fZBk_&%5 z%u*m&1&$|3kC=~=gNlqHgL?(ig)h*L_1LEI<8Blt1Zp*V_>(f2S^`4bY$^3*#p)ul zgwz-2Ij`+1QlVxl?*(1dN)()s8iBJLj;!hujY`~GR5)_UZjsL;=UAHZ>SjR9e9`W= z at JyNyBZpN;Den}Ko{EuqCyJTI3bt&vK)Z+|&N5)DEF*N$(M|BMt}5;b zkrT-iBR+ at 3LseNPGf!2v&6%!C>U2M}4H=(v6EZM3uj`-1EQ!!&d{yJSd9ybf=`qj~ z%()ss+fYRZZLds#xnu434T<5iuJk4CV}ci}kRr+}RF-V9AyoYmuG}`gRKd)-kG54< zW*yLm&_?SsGQG0+Ru7YTk1CuKfhfyN?_6}09cuCU23w;I)DsdJd@ zf_a&6jt>Cf-G+QI%?^Bnx6n-fz}qF>t8L3j+_7PzV4NO=!%#|0F^mq;c*~8tZVPeI z at P#n$)-Xl)%VD-LW+>{p+|5Vm${50XIQFWUz9H}s4Vmwo!rP at aVAoE#bMqVwaGP8W z=wbFs at eJ_jq&C2RnsNZkk7E>SJ0RvJAF#l30PMvd5PR1Lfw at P9#SL{Ks+qvDWn<(- z$Y6o8Ir9|CHPxDSCmAqCyG`6lzM%+x4qAas{jgzzA1GpmIcSU`k~Fv-*kR at d>?IzM zwnr+UsgsWnHeEn1^p0~x8Z+GpLRHNkj-Py?3^l)c+}UBi9sy$F1tTY`UTLws6uEib zumXwusx~5(8Lsx8q zr)=AWNMs2N$caeaAGZLoK7(CMlR&CE&j#Cjk(Hp*v~IGWL+;@(HI at qAg48cfIw=Es z^$0GfBUY1-R*^ms5JSx|xbSpDnoo3gtfkM8C=naKS>Alfti+tXw)ee9+aYge%|zo@ zSOtSyht9ZfnYpsoj(TQY0FSC=fB3~9T8s0P=ETmCE?J?3!U at 4PxN$@bWNU3vw9@$U zS4iE#S6WP3R+6VYmY;%p&n!G*vpRmZ{wq{xX zbv6aqb?(J-+7&3x>~mXU&pz`x%-4c#RJtoX4L+g+{~F%)8rf6x^zAzJ%J#u$^3Dfi z9l_^<)f_uNtK|Uno1zc;`a``xFtwi(mI&SdyNAF!4h(o!T>g4b^>qB-! za!|TD*}r2ru*rmDBwMdlq;r%>U&N^CdiBqhJmaJCuEwO6U&YD+$3M zaj;RL}>?FT9``W-g?d7J5ywS-hw zUmo&eXmFsh^^CRTjJ6(>mlK9E)WU48oFrB)x7311JeEK=RQmx5f=vUbsp5 zy8I~pFZZ?0$SG)?2^@mWqi;}y9$AiC?&|FZ+Moj=*O z%|S(vf0-+ at iQfp6pfF0; zFRW6UIy%!@X$AH at 2bmj6f0rp1|E;S zswI1h^O#sFgmXzGzJDYie>^(tF5lfAHW%av%V4H_b8Z;KcLez>Y~6GG at Yq_p*H$mlZZX!(RYJyWR; zAJN{sWZ%1B-#wnI_PR1suhTo|Pj?8IWYNn4{r}tN7dxl8|Y+GAXFu%^sJ9(cf z_xJU;Vd!3>q~H~<`+(YV!0=x^Pem{*XW@(Iv?CQ-CWKgZCa8s0I0>JL68s=*v5w&o z#X|K}Z+W)={U^$rzA&?o5j!Kl8WLSt72e+i&z!u9Fj zO#{BM=rBXfVS&1aG)ap*VrmfaL=WG%Bk3%@hat}OyoWOP#d)H7zsWvit{G6)q#d-$ zT)c`V52Ti z;dvu=KCZm`i{|VCQFe1)d=X>)rgviDI at JYi%qZzhdC5qS)41<|y6>>r?T640=ADs- zexUZu*jKpm!0tvWIevZItg7$7EGaB~Fm3-3Z3oQX*i`?~3&_0 at dsyA&flrYOr0IdL zEEy}W at x)P+#%JOFHeH7QsTfxm0q7+m3Q;!>Wz-)2+z_m$3!{&M$urHK>oq!w=AW8c z(`WU${!=)_SutXO903xmFt$tvoDFX zZ;X(f%e16Rx;(H3GSs3{{hQ4*K)61&<{VXE3I2Ow%kY|?V5AQHq5BibJu6VL=dsS} z0q54YyQVK&mAgA1JYX60qm0+I8CU#UY2(N&6B;O at nbo! z4V>oI=F<2;^(f~$z#b~p;~DGAC3YhQTqFej2dvjL-a6KuMO078-yXE`t!2wfZOP&_PlMc=$)M! zj9S#JmAAxDc!8qpsmTQ%0T#uD9vR|BEQIuf2Llp6QI3}x7<(d5Ez1P$s&L_B?K z+6)b%)J-mPQCEQ>iAxZ}SR2YSwT5WK!BaNVs7GlQ+AE0{6{c1bbZ33hc4F?wD6Web z7xYm)z6PR8We~+B<1A zXynOrgn@%5P{Kxf>rYdub)TvrCfZ{uRI}<5%1dJbcPv5t#PT}gX*KRuV_Swo8FBks zax`+XB1HUVpC>@fU9?&IRV>o9Fgy;$YdbFfA9k#|Gy zbV6O?Tc`B~lpT)b>pG3LXvejwi7oseR3iJ#C<^90i+Vig8PY-?*cDc{R8tn;JH at q(C3 zr;UvvK)P(5VUgL&b5Hc@@E+gKp2tkLJ_FYJO?&M5uBjejb#N}L<7MiEsKs2i$WUN5_gd?*8m*IF zoq0;a&Q80sDms?Mm-Z6N2P&8BUmnuop?aL2-Vnu?m>;+x6mJXhza~8t(RrIk45o0N5>7Q_|LXx}@)2SXES*+T~xg zps1`e%&4y?l4!@-H{;E at iRRc6f-)QRKp;4=lq<1oUH8!@muO z)pH15=#gf9 at b4q&d$?vh;e+A%mkBzt!fOw;^_@|z1I{x0l!!Czg_+*`5~mLXF#>W{bMEGKx3`ZxcFLDkADV+OW33jU9^!ael;p41|S=Fw%^z1{g+04q;bQ zxS~@ZITpR7D$7Ju3Kjlz6q<*`duruZ)K`Lv+$+oxO;?mc3d;P>()aWEW6n>neQ4j$ z`!_s*mjiWxXEga8O0<>DK(GawC^IRRGRvtbGp!7nipGirfif(1Yj9R*Dn#4Hr^(D~huU(5;Q(D at mBD z^sA-X at q=-qm^>ub6nUwfNlr9~4bmxnSYTCFDvyWi?(8{oC^`9Um4}B67>Y>gYq(im zcoUO)tLZtkcAArmSN6c_?K+9cX)*kzwC;pvso-oqS-Xx{u*fC at tys;l!r81 zp1^lT_jM+waepqW6Is(ky)Abw9YMxr3 at MU|pH2J~vyQI&eo(Y0LRp3VC_xucwdaH( zU9&zH5fvbz723^ybiyAq%B|W5%m#`KGZ*SP*i8B_#jP2ou=YJ`;8t6ck~^{5yG;t2 zqGqB=Dq$EfiA`z%7s9R(%?!OF-ViKsg1 at Xc)B!79NDzRH4asotems|84e1qYpXC!rR0M%1cW3)D#= z&KYf*4&D}iDX&^AN^%*A9QFBkg%6V#xq9U%DNJ2rFm8Vw9HmI~2S8?K2;kXK(!-b< zTHV#U6`r^28BZtSaTKd;-|H&{GT+%tWQ2V{^Dq9WY?%0QnIS^Nzzm`d>H zKN%w5#3NveD-ZmPnmvQgNub~&KFB#Rc5{fuRK(&|i}vvbU6-6?T=2efx+1=+0(Jf5 zIZPnB6NKy?V167Jv7pcW>uEforCh&?3h|61{yE91tavp&MeQ8gGB}n?D5s(!WzKa{ zAQm+*PWs_GM|USS1b7~U0oh0NFg&Iv8=$Igup&wwC(3^6IVq*3Nps%8l!&JxvM-DEvv)V0?w`Zm{BTnpbY=7Ywpf7rU=lHZK@;s3%aMhII*Z$*4jY!-bJ3mj#YA zZ`n_%p9I!Tz#3tUT%$)aYa9v7Cu)CPU%VLR`x3ah$JcVwS^y^xh1oY`n{y4{Z~?cx zt~*@#8j9vyvQK1bZPEu^Wx5y6%J;5Y4D)k at GC;FNH}4n=u3P-qi^MS^HBIs~()kQT zWz%*55y!MIlYi_ilmN|eG~1v{ITmc4ZDK)svE)P`&@7v#9TDD^p&ls~{=JQB`UmA# z1#z#8Gn_GTuD%3L3O}x9Ux%uANGn8^mfdyMI45vR!cn1YA92-fY?E#5q(Lx%e97~^ zSy9j}n=A{(CU&ncs*><8pI^#n;w`_3;W&hrCD-;fc(M}xl?R-rhHge zdH)K(i-mWa?B@$2?l#+ZD1qm#I2O at je zk_M3Iml!gXt-yNOw)175h)*CCzX<&=P+tUIagn%k{clCQ+i5wnteHVc4qppb*PH3b z?ays6;X$K1QV4paQ5zQ?d z%h;2RSruQ=z~Sni3h8>cSdEWBd%H6^-7N+OGv`@5i_ypvgpXNrbm0Crl}>yv1-tvGvoHDEGo1=d*X&6mwdGBk}h##&45cY*`iK`E*R^pK{n8m zm12dTi@}nj9lWdySSDf;<7I+rRz2B!&p2e zgtUX8ihHmsi*HP&ntEZG3SAA^oGulTkwroG8qT9B^4nP7xH^a_=juM<7_pLa`0L(C zU`!t#9;5xyp~pg#l{k4=x2_(YKdYQ>tzA%7V%08xu!+`P+dVE>XXd-wKow?pfxZum zSYhx^;~Cv1RZ%uPR(E>CKxnsJXuh-$4^}@!`r)@4x8ZE1ti&j=Uy&oloP+DpHDBrW z5yfooAe2&yXsO`W-S(XM8}K?a;A)<+Aau&7YK8IDIhF-cS7B9w;QKAhtO at _1kAQq5HfVqfV+gT+q3aH>5bq)~CTiU< z8h4-p=Jx0em?N?;*&ZtoDM#HGK}XoeEb-nXh~kuUnU(n;Uv*Wi0ZFmC$;ap)!GUwh z>^<4wkpsU%AN67ShOm-gq`1JPvxAvyc&Hxl7rn0s^*8-&f^lF02-fK>>$awge9hWt zl@}5;mXzrWGT9=O*~e63LGIBLyFKqBnX>x>Z#j@?1qyebR{;K2wpj%<^uSeOH9DRZ z*nGa&P}?-P#^S2FUKLRs|Hy9+ at Sb;a3ENJFHYH2Df{c0~gV8DsA7%Cvn@ zVoXHH*g-Wtk_ at G~lT2-4xzxh3*_^cW`8ZOI;=k#k3rOb zMj&I#1v!r;^#fO_ir(OD4&tx~!Kf0Pam59JZ=_?RH{m%To>DJ_c<+=pmAvTrHXP4Y zAG}TD^z4jHkIZpgrI7(uR~5DNBOB8xmYHwp-Gs(Cict at ykZ{yvpuHbsOA{o6_E0C# zbYa3p=c at W4hXp_6v?;jH?L(p8F9zt*hmrwb(Ew9EWZMUHN)h-L&K)#tZoHRicg*GH zlIhjO at c~^z{E`dJQMz%ARx&mxu&aLXfJ_7AG?|~^k(pvHajEu{5zU;0I71fK5u zOUgagq`eOeexLg5{ohDG7k|tJ3xNOtrosNxOri2W4lXvP&h~cyO8)=!VNf%)`4{Rk zCwWV5Spg;VcQ!yynv;scT}TiYtRN6d1X0#w9;OSr&uP`qA3&TtPz%caQ7_=-( z3_71bys6I44$BY>QfO9fi~QbiUCY+b`{yOQzX#2w!XIT}_(-l&#YM&-Z7x`I)pRO5 z>ND8(t@;|OCSvJy;sJsAk$-2ThFkX2LGrl8ju`n}_;pgW`1$ zgU(8Vwv+4mn*i7wtvRAHv-hoPGiboN*(<6?51!PdjyqQPa4H!EBNd&shcz2Ckb4J@ zq8m=Lp~vwu$%>;66q~H!Y1#w6r|rli5yNP&$xLO)@aR~))Gcc~2|gZDr;rQ!Fj{w8 zZD3WOsi?2c=k&2PMqiV;QzKenuoGC6{0a>Q2XJGm8?5#)QDAk30wc+R!*e?20UPzz z5!Hnp_|{kdn{`iY#;ow9F$7a`%Qc1gO(}by at A9>>&)5E|M)dUjy#Ogc=t}AvCea)* z%%@0AV4vhyWwoO8g7P$90m>O~@e}HpMvQ!Oe$jnc$NGqU1V{{7S7Qiszy#8#1Yzr< zb1nNy at 7Tsij3V>uE=re{MRpUjmxS-^$(MPw{0*YA5=X32WlrI%rQ+;B=yr+&)5v?R z(jY7-D at P{c3gR#`q*YQKJM+JrnqK543!gMuJ#?BO?Pq!8K9T-n;t2- zYh2Vf4)5nAbl~a}e~V3Oq||zwaUY&Ngx5xuiVf*hFELr5)iQ%YB3_?AolG+7vMMoG8R zV5>LU)SBJn_);vLmUs}xpf|0DkUp>e(B8iC5~2UJ`E+D zuxfVD73oVj=^E&#oxob|${eLxc9#&UvQfb{)e7d-+cvT3FvcgEG3&}EyY}9YjV at BJ3h{KD^g;!N}v1~4f5LG2Z`MX+KZV6UakYm zho)?|2H)4x)EMz~>eZKSk019mcu%Z)n*>g*){fTzh|7FD23a4MiN$gkxn-pfqmzo_ z#fEVnJ!0Ho at cfcwO+S}ZgbWh__};JPC%eZ zFU3fS4vK_}>~vBYO~cDsNN7JBuaLe*X3iR>4-O_0}g%>Gcg% zCM8(k^U*#gh5`*OH82?yMMT8PfB6NB(nXGPfj|A_T-=C=r)x2V1z+=`Qz(1487f~+ ziG)#SLH}TCa8S8owSlvbL4yLSr)5If)m!r@^4(o>OuL+JXQdJsw(sTq>{i9vLzgnY z)oKl071HPB=JF`#6`Vx0HqH?tqdB;WUMio-lGjjz1|tIHr}0g{=_Mn(GL=UqWE4?7 z?HVjki`91=%eg=@&*gdQoKR9}sEthGz_*so&9o{qYCj2#4SGw7-Fa(_?PdYJTDiC0 zp1)_aE566Z?Hie4*!gLb(Xc^ipAYv#bytru2aFK72Tpyme)-ckvl9r9*To#F at 3zUK0-#-FZ5Ovj>voTUzBrA$1jYCLwz7QO;aELX}pO2gkiSmx`CmsuBjtz z9NZz~VN|>(UmMR6uRox=>tJT}#N{Q^+S-yL&bw%lFHG-*avldcSeKSKIP?fRA$# zPi!gYH#g=LW<_L0NNwLTz)s2LF(HuH;lD~14C6u|slU8{MrfZ{kR%4(IPKed;5<>l zorb?XVd3O=j2P#ZLtBTttF5eB zAkHa$RPoF at I@668{??~8dbVo3K}-zS9P%f0MVud=j_0gSx4x4~XOaz8U5 zVrTac6?z8ppDMAc(?3eFioLS)Kixb3&Baq$`=3aQpVHS<(dIxRchHp7t-v*K2*?T} zsm#QAp+bA%u2jM;%qH%U;l1M^3!n(H9{|7P`)SwsO*Sm^Ca2k4&bC<}u5gH|pNdwL>m~9p{$0u1w));Y^496C=z3NmwrfM~;%Inr-tM^=KD{V=n z-don at E_A4k%BoB_i5n2vxpCIeDMHKbz1KhmiVk((f&NxZF=?sLOzEDv at 7T0pT^P&A z&scE0A)Nxp;kb at VrwvCpxLAs*&HNG#Gl^uCBmiSn!XB$KpM6jl-~A*~eMQ*GnF^qf z*3n=-6hg>7ud0|S0f|r(0a_4|LZ#NL_pygP}yCWbLSOG<=!7WHxo>ocse@$ff7yc|clh zilHYvajS)w$p?+#!1*jCsu@<<=yWYCC5%1?2mPKkQf3y~PLG`Wve@ZebWGb(e$q2lvoiuAxB#YSBs-cUvo$-Y3IYxRjnSvKM1CI_fiiCan|eB!x3 zo65(aMkawTUAp`_QH5C7Tz?G`T!Wf1c$L#z|D;J~HVvB(^FNPd#T;_(IAOy56b-*;OE6-84aGvy#m3GvyVKK#_HoHwbvM3N9!6D?~XfZ)`Ae>2>W^KvD1KXfrN|tGWRZ+uHF!{LPD=#)U_b;O}_m(!*6b z@;pn^db=CTSYk>1JDzv-QOHXwO%*Bi4_g}T=zZnrM&-LpfC&Z*D3f>HTY-OhW1=jk z7?38bh4E;L9B`n0p|HwS-nqD|@q6Azij_>?uH}dCRBGw$R-ZbPTVN at 8x1vh%PqseH zDerUKt?T+H%NdW{<0?Ij4LxNo&*#JFBT

JlK?q)`+G1g>QZyU!s4<-F6 at aVJ-Hx6#=($x5C zuY|{1?9n7a;!mOr%Vn(wBUkxHvsWcP+-^y96 at FCWVK3$VHrtpn)O2f!2``VUTnazC zg1Fo!MEIyeBOYm%Jq57`_pOMD3 zcW{UJB)bl|!kq at F4#dkH7_3{c7==TQ}} z61^)FDO>vx+lI1kEam+w9*@N+(Sw0w*_gM9ak%8#V!_wV=R4JHXRj#E(?0 at zL7-iQQH_2p@h(46P?*`EI zz2`Ae#m%2~@c+8IVha_FNAsD?Z8Vwp-Dcm~_96S*PI%H-7isXKt4AZBkl4?Tx>e9yX`NA_}loUidP{ZWCc*QTEEs8e)X$E7pD z+%9^J3RDv`t33eg9)-HWdgTm|>#RjzKMYamL3gbf-j%Aq>4hlm-lV!dJ82IH;vh at K z=CZ at W5T6x*`h;8;jHJheE33HPe^S~P-$=6*%4C##d)RxFQKlP zb}=MxI5G%jJ}#AZHf*{+f?rJS?R*;B{QDA1TDY~QmyoQl;GwWcv-}H_w9<^?H8gE7 zux&6fp`nu%dBhuvTo|uxA}VKL-uf(Gs+NJVZGA&|T!BQP5JVc1gZ&TD+!5Nk3bqYZ zAny`U9NI*ZO_De@{ViRb at I$g>ZrLxz+=fJMg~M?trH8BQLpP{~J at Bsgs1-!cNPRQe zYzV|@0RR8qou|jmBu)PimNZ}h04)D^-1I-YI!+}2YVZh~+SvTJu2i{}`zI=G>l!>H z#7OW<01>f8mk;er4FXcr7)XT$^fm0a)I}-nYBqC669s>e{Em<%A^mL#{H`F{&DGkr z0J4?e?1tCtWt;i+=IOr>{ndvH3=bM~MBvi2)K;3b`*wh at Q0;Yu_+YngZwaA}*Z#On zQ^tj+Jr+23r8-Lr+fLen6CB4_Pv4zFnE~jZL>{7hZIBbVO!RWO+{rQGJkA-XcMOie z_g0q`V7A&r<+$MzOoX_ivjyKpAD6Wbe?vpZQkKAez$>`08eQ)~agwcS_q!VQ_7C{1 z-F0xOED|xrQYq|%G~ZWa#urm>$CL!wUU^_gQxSNYdH+Ao-Z4nCF54DPyDDwlwr$(C zZTm^vc4cOzZQHhOqmuVM_jKRr^Trp^=j(|5XYIXz&auWEYmT`lnrJp&&0=PteN#~W zkz*ibzoZ$}im}cgh3ns9 z)dsAOgh4qj*Dy*+>}=QxaGJ`cS09af{!Ut}*TI~=wJ{Cc%evJahUMwl8s1}Rr+zm0 zULN#-0W$yNiiqf9qKQcBT^>9P457Jzf>cHnSdU+Zp0(wc8d#$&Pu+Q{?UJahCu22fmd@=uu!VKP{H zgqhJ}6ByCs3bLd}M*T>2MntvB^6Bo`7~Lg0#87jS=IQ7Vtx9i{b1KJV^K9Og6P!{d ziH;;kWZ=KG!ujX-;@nw=2KiS|G+ufyn-9J( z*$W?k-ml057&~DI0u-TNKrBW)n0YYZclq!f+=DuhH!}~Hi$lUcE)zn^flQ*`5D&Pf zhm84={CM_`m7$s8x?Ane<$?sELYd)==Cu|uw3OP*X;avpGP^2{;UdA5)$~}IDyp1! zeniSC(ld at Ov?Ur>dXkr8LbN at Umaj<))26U+sVaF|3sY*S_06I%vC||a8(MgZmoHL2 z<#pm4pYp^sb$N!cyVfb)Ev2klF*RpKkp8NW_tsbYL9~b{RaL27Vf4#PP;#k1~A1MM0zTCNZ?;O6j-O)@U)dXIk2jpHVHvb zoePwMmJIuPP)WIiYd|_S;TeI&d`M5ZLu!DlYN9a>sqLLr-N??UxBGqPSRWsag4U)% zWDn>=_M;&V`W0dtwg+2eBEAHL}$_(>S&n_^P~}80+|88S`UlAF398UVB at 4hV^2w!l&I*P1eSohU}MO-}m85 z&XRFmT(=(Zti`D{`FvbzXeV8LsU-9K_9)+~Iun=<=~*S1bE}wAHCaA3Z?S!D8$o*Y!pJ(uMP&rY zN6S^}5z=6V2XK=S{djYbdi)@QL^LWg;UJ`Oy)K#Qm`mx|b;Sq7H(d9xR|B7Cam<-Z zG`QK2tAT9Jhbhh-PIJ1GnVq~IAeLH{fCz5lQA4??4y|O^U-?$MdcdBW>#^_WNL%UiXg>J8{JPd63OllDY8PTTE?r5LLwFv2(5=rjS}_U54b7lt zf60!ErNvom-f4Uujl`H1fGeMI_00oy>&^y;ES`1pv8xH6|G`6=7C!0-rL3!9s2s|h zR^$CPD!y;dT!UQv(nh9R;3MCx|6rhgg<+wA5ol@%9EFBwbq5s%fv4>eR0fgDn4Bom z!VpR%YoaurAd>>A*Dk4Mzf?9#BLCJ* zEaa5SOV2m(Yvn8?P;YSOejva-6- at F&7BYJsntQQ4JY&%XX7PHS<#gYYRVq`K`H9%1 za;L95F|i+GEE_ at -?Vwn at 4w%dVxZQcqHz~!pfljXogxpd_x&O~7vAhqf&SXZTdLJmt*WV5|pkvCW at xXw9{Qi2y z`yWK_f6>UlScJ5lH&hV5V(ssbSY)@_?_Q*qaFZ&#>Ta28P*}SOmv6XjEuwna ztfJYLmRrjXML8q|LwWYoW2DZ}FzHC{_nB?X~TmH3!4>z5x#J@|gaf5}R- zM%WRlZY$sXiY(W1Juen1=@adLPr)pj4nn at _Os|PN8E2PU>i6xzK at 6>6hzo%!j3bu z+YAsE+03AZz zl*ct3Dh61_B{Ww$BYvT&u*$ri-<&+c&?5{l@?c$BN at +?xk}Ql*SwyDrts8i=XIRV% zs=muPO}ZY^MQw52rvwhL*U~o1>=vI1 zflC at bxH3S7 zs)v=Rjq=E_$!4HHN=k-I$E=;4m%|M;A)lE^4n-g^Kh#Hn!!h|1IE4iJgv=O$vNeGx zWE_P at _>x>byaW~b>D6YANLDL3&MRuijA7h>VJ^Av2;E>4OXoR$z`Qj*yGNW$XBc}= zetM%?4Csp=d=Uqj7BLc^* zBbCSc!iTbqupPb|Y*{7wU00QLy2>nmKN1f6a@@Wwj6g%sh_h-CyolkI*-;jlVH1p>JsP%wP*Unv5 at qk!| zn8LxhVX)FsGC!^9aH7Sx6-UfH|G!;$eV0mAAM#hy+K=|{$^!qN8_)l9*E?V at VSX(q z(r9W?%Yi^73ed3`NXsP`?@TU8PaQ5cP&;8YGYH7vV={3|74q0 z_{A-}j>M2*xEpu|M}GxM-+4Qq)_n^En#1S9_4&Q^G-s-=8^yHIc(%W5wrFj!2qi4J^%O>l%xu(nrlWK;wM&U zgrh2TGh2hz3Jt|qiqi7qifLf^w-|JNm9DO2-L_X}=pWO`-q8>E0cdt)3v=7Ty0L_y zYARCb0^qOn;;xiJ!UB5(7dg&S6PKa%F`V?=qK7rXaMd~%-Uj`Q6BPGm{YtvpC>}_t zlwwH at b^+mmGac3q(?Fw>sqw(|DmemgY)_kE2USoI8=g~(*0zKZ$SjL~kGddBjYu;E z9r|a-z&PcfNh?yvjvJ6!!_;9Vs7sVpzY}WUsYpwHX<1pO8K$T9r--*&+s1P_w_BuCW4kf zH{DA(Zfn&xM5w?`sY|?ery^*nkc;#gjqfLd620L5$sw^vXYU0ZsVI}xV$FjkkVQ9U zMQsGb{`vywvXVAg;2GPeaiCpj(C0Nei at I>G8J)Dt>z!Q5W-GZVy^}a>C-ojIf&ENt z;#TDb@`fIo1{rU2zEHT2<@K?Z;OH4snpSO5=G9Vk=?A1Q{~pij&(2M9P|VM}qzaYlXKT4`;tjIt-j at Yt9%UpOh-kznj=}%{3GmeUu zc2GqjH|-4Fk<`EkqBTaK#N;1TWwIMsVls1#iRRRyHs&8Tkuee)=1988_`qNv<%q^M z-3-Yp^3WdUe(iz-Pa9Y8v_&`m05Co?hQ$`bftE&JO>&Q8pdRB6I39lr^qcNHaQ24L z&9iP?-`OGw(B at AWBY9yBh|PqnInB6d<>*36Q#G9sXL;EAH+F`r1z z$*G>y!3`&s)M2SsWp7s_#bECWv4Gr0?ag_vOS6KLgc3#?HFnP-gf at h#iGdP+o{ffC zL~SkGj!!>Kc=3`J<5=~M5O=+a+d3NJTZ4F}xcf!gw#tt9GhE&5lJH)ICu9iXQ54%Z zxIx}SY8ZG!na4QKbx|T&Hv;mkrXyHmW$n(9!c|cH)%Ay>l#7Q+9!zv1F{2_eBNen} zlC0^No at QCrDA#P}?~APQ^XGA{1(9VH>-y6#0*)OZGU43E*H>@IS;-9HufXE>3EG1& zI9)=|%g at Fkq|%F7*Ztr{hklx6Mw+!UW?fzw} z-^g|TB9}d(&)j&eDQc*5%w=1zWLK|#0V&cNOM7QJ{-n`8OCg+;kJ3m&zAZ8^x*k;o znUjc_)01F-~4smRhHJg6B}ARP&6d=)~-amrwqakYi3nXHumrD^)b(7i1yW* z)>ltP-(5d0HzLI8S-%T8Mzm4BE$S#v_fBeV+Vp&Ttb}(w_i<5mFC4Krt>5O$lK>&; z3wZ<|JYEZrc&m9_F%My>wPJ;2ZElPztR_Dqz`Mo3b_gQvDSdketUi#j at 8}Z%l at Z#7 zAt&)K5iX~~ZFIQVx~Z#23r|%2Egic2gBo=U8Y`!3{wp4Y$9F<99;vxAe1Ma at VelV* zB|FOqEm57U&Pkvp2lK?m|{rztJ-O309Js54#dzKSF~(xw|U`8q!A6sbEnHe4@! zU;iMNimw0^w9i|-P3yRqJtHjkgp$u>esn^+9vMhL8sYZxG at aH#-s;~c7??Cl9IXGP zhL``McFzAbt^fBZ!2h9#b5w2r(!&UT&B=Hxc+DV%z{xFQ=DFr(_HNH7H}*TgCbvQ& zVDA0#4CsLX7W`vTk%YZ at A+S#kxC6RWuua&cGhbkMFdme6Qz*{&Ox!&5cw;~c&06h? zOl9eH>S1IxlLU5HftIIkv+a_Z1`U-NtuE_SMRlpvE(^=i=hRDU?CzvI z{gENk81W2%5hS%bvOQ at 0dk-qZ9O)HDWdXr{W*+p~K7E=+2h8Ca zPTeq>6_v#(kC^Y^bUBxbGBiA{om{XRd?QuY=BXBX)%GCah}a|I1j+5i3)X?A^9^ex z*|+>N;+y*4E0mKF4@$?> z6e9}7%}3#Y`p4}R&>o0MeEe(Cv-Y+% zUnnhrZWPFDCTm)e-7HpEU&n|fMA&aezz%N|(B#%OFM6`OEBW;uoOTQ8F$Swd2 at MaG zOLfN%q$&gw5+C3C%V at f~t9x*_n8#!KH9Nz;JA;|KV~6kKo*Kw`R+uBiTo_}-d4MDQ zWZ-uWyfGYle=DH)FG{C}BL*}g(8Js%*0!SzPmDs9srN_URm`H9bdnh>4r7N1_-_3Y zogN)U5_?dcs at Q6*MD?YuL6yzPr_oB)n at ZQJDqVpxZy@bRq}XssE2U7+_8xm;opg%kFI0Tk+r5d% zfpHdPnaR~4C%(gDTXHdfMqFdK+coXeT;a2&=*t~5kNFtJ`ag_4+HlJVeAgCaOnUQV zZq3?RLn}9oM^p~|2$LSJMkMKIC1l!mm4K?YZgOoAQ(|cz#U|aTunrq?=tc at hAazMS z6U@#T#ANCwA4smKuoUdBP`}*3;Y(&7PgS#5(Zs(Q#?U-MTgKx*}jx+|9 at z6`wde~QBS@!+BtN|>9 zhAmC*lVn|r(O9wa&M_I4Ma})pc0+t)HEF5D at JjlgPN%#}!gV7bHabG%Urn%pKl&0D zv6O{bvHra>fr)3 at r8heXv2y58iL~`VHi$OyEH3?qD`t|TY^_3bQlo-~%Clo0_C&Y{ z-yy#)XR8A$w{cS}%hA+=k^T6%&6Uc)`U{b9h<=U{0S`1LHZnYYXU6Xfw at -1~H?ip= zo?-Cf!0N*}9;+v+09S%X;im5e{3Gu!A*4(LZx{6u_v4Y5>=cq`${QxQmYR$c!J*Uo z1gvJ$1Hb}m${7uXqHwSQW#icjye9~c(+Ry&7(w1>&MeAfj*+qydYp at e}!4aBX;${8n1K zy3bbz2Aj^PZ0+YyiPezHcN9KLX)9%(aS}m(!P2~fS$e=iO?tsjtxyklW7(=)ACgM8 z8&$)(s##MJQ=wJ$QndLI8S4e<6C-g%u}TX4^Ddbjm*&$E7nR}A%9xW-Biv^o!Dj^G z8|=a(d*S1(F-Je57MyBa!TP{#Q|8 at oIgVH8RN;>?j+@`+ZO*;qd|xO!M)Y?-IAV=E z(GTJKJO~D-KDed{UjJ4{k`&SA{IB`v{1E>sZ!`Uaw^eNA7ZgzZt}&ABhJLUF061Ls z^^)reU+X1>03>9>NSe=M^zKJYQtfV*+zI|A(A|UZ!!utL2W=$?YRxq9rCntw+3!3v zZ7;d+FFQ3mKvEt>LV|RGj)$rwiW2#NGMHS_(XQVD>a~UWgAB*`nR=<0s$ni$N6qfL zt+sXgC$iEE7B at E9t=ecWJbR44m*L8)T5!rtp>rmijTa0w`){8N!qQ at lQ~*U*>!m$? zwYeRAA3ni^-A9*6nJQC_L+^GSl$#1WDpQQDOS{#S-@@iP%Y#5+O&1TQ6U83w=+DK@ zKYc-aO`$o)xp6N-2$L#t at 8orE-bzbuZskbv|CnPq<``>QE%I+%lrOhXJ&Bdq3lh4{ z*sN{dv=`TAV<)HGpi at 8sN$-(FZP5C*c#0flm+8AP4)WEEirye2s^|DFSB&u%*t^>f zu;X at cNt_WBC|McJoVACovK_gR%q;t89xr5eHT{^llj&$8{t!0TA8`I{DY2UxhO*4s z*((iR!_o->Ec+O5(Hh0cwad;yzsNB+kBJ9Yt}B>Q;9|>mE-`?*iH at IbtTe@tap4@~ zRBt{EFGLkKWXLU;ga%|b5dS5 at 8lgRLmslVVD>D#K7Z0B%d;U~z&AD5cOIaexJ at L2g;3+Ut=stUGKm1 at f1gG*NZV}Glu|t-P?0Sd;@Z1eX)cllgp)&oc3eCQugu7ZS*8GrgruZntfiVsEHc75Q&~M6nQpK=K1k&FA zzqNvt;^Bsb{T14x|8ZzD|1-2VCx0=5YnDP?gYp;5dfBSQ*_RAEG^ z6m#F|8KoJVE=SWUK2)jaqTUpq+VE9fmoY>@6u}~K;>^uvIR9c%|L at PYANkSjR46D) z7~+beSY9xsG?X5xL@)Iq!hMlJOamGY7JoeJS1{^-#BqNGUbqhW1-IDr<###b>@C?` zzxSJKRA$+YSajHJph0Bdt`wx%!ZI at yqWX2?7YX60PSgd-hQ;*%SVqr+8_VpFw_KNmd_8XZl{v81fcd>FZQIoKLrnh=PXDI83L& zZ;;=S7>;IRb#F_m?k1~U)WdKjVd**C%$s*UVyj{OC%jOcNHrS75o!(0 zZ!w^#JEAOZTjLg25!9R#eHTWOzhb*v9}zJvN4>Ff$k)&&JQh=D&wdo`* zm$I3*jreS#nSR3Od`)|#QFq5_otucm<%N}Jq&*D9&T`a1cmTFj(!V%-US~NIdl~%jbQ`M-xhlxC!HNGY6}x~un8uTQY+WqK zPe6*^7j(g&;Er`Xqwt$?Tu^Alww~1zxgS?%!Mk*X8P?N!76T!1 at B_oxiu4og5{#HX z;bT6$9i>1n?|A6fe0v-uO5Rz-RPG3#l1=O-*l~mQV0u*LY7C}o*CS-n4&$)RxH*6sd47WsQ3-JMs%ko&k&fV@}aab>U}%~BHGvA(nk_|@K+>gARrT* z|3B5oe+lk?RBkli{ZZ6Wzo+dI*S6q7$WZ15phtjqL zupQhJmo#w|sQ61tJNwkOO;lQog{kt=1PTT4sJ2yVRqH*&aVL|L(|l%Z4F$*H-Z$Ca z*DpLbobLRd7dILa=-eMOm>_36uS zLrW?yQmSQ%Qpu^5tg^~X<%3VZ`sSrSj3de$f1j}I at 079loiff2d2E;J(RbD39^sw;6`>s7XnyUZa>7}% z;EnA`PD~?o`fM&Te3atOUPPEN84jfx)Vl0%_hw6$=jB~aVgka5_=s?jDGC}N8KbKq)5*g_{I7k!~LpioI z%^E-Qdg_KyzR at TErDN-Q5@f-x%0D~($nE)W~!2KEi z$7jQWu8Le~T!bi#;J)_v7^SFsW1x%Hl4)~rtvUu)cI-GCV>^ACj21341Fd=46a?<< z5~HqkaTyrR6%Ac5SxWlMON^asYIHiRZQ(}D>VeRuJLUKin17bnzAdzWA2)~=uK}qK27G&cN^w|--lHVOKx>G&qe4F+9>lFDqQ5DVuMbXM z{4IMY at g8G5S`t8-17zOLw{KZ|eocq0$g17R#9wSKx)&}tmKsxe7&>e=9`&v|q~`!1 z$!XVou3x`n3#2#qwJgNXN2E8E+mAuo10*liAvGM>M`h3(=_}NKCqa!Dsrf(>4}#PO zQGOe7)C`&%(}X-Y`#_cd;+ZwJ&(rPA{Z<$88*#SFz{cwK$Wzj{D>LYN+{|RQwscne zT%x}{UCBo)0)MCM+z0n;S^avrBrc)EPBqI4kUd6n=G$0NpQsWbVHcd+;@bb##Wbs_ zw$`=t6svX{a1u3mG&CKT=$aCTIyv#IVBGkGR@<}CRYfatm+02IF75rh6n`g6P!!8m zqrWL=SsUoJHl at 3qVs&T3qPWA%pI?Mn7vr5q4=&9iW>rVqw%T^kw1Pv5g({GxJ}CSQB`>MJCZDX{@Mj@@noZ34Yv-*` z0$O5KXoxt2;jT1?0JSpgSYf&rl#V&AB=O*0QQLMrOL)Kx;b{<|MaGyJY()zg>h6W@ zt1#+bu-t1D>Mp!W$agyI2aOPz{!NH~9mvOC%I}mi7AHjeEE`Ii*ZM4-!OEr*?Mny9BgDF@a&S3IUhtjzE+y-07I!(1P~K!iYTy-a1B9I=O^N>Er^p3~dxk^fcvJ=ulc(Yiw1Ue`F_DT~*qmHBrKbDtYA~aYd2v299;MXCuig$B|7kVV at skJkMtm zd4+&LImTI3{pY%1dRZ&keS+3dkY+e7I&IQnY#Y$^V#AUgNbnf4K#ou<4%U{wdy&x!{dggjatzUXK6^bHK}8JAvrnhjqj8)A8fqyvDg11d-F= zKtMx?|86kvKhi8!J6n4bOEb&=TK!9&m7}KZj;xCEMJCBCi(%2GiV_ckIt?DqiOr*MYkXZk`2>d1|$WV7(!b4|BKEv2>kQ691NT#gqwp2A|mU9ivxXul* zT?iBMGrgDV at ipw%Q=$ddK6$E8R71aLDSl|5o(v+>Mk7u^&gs+^mKCGe3KXkxx3WH- z;R)>GF_ctzlfb)yl7RC0Iny`kfUfS-*q~-iQ`pa9o4N)@irYm=KfyVo)`Sx=EV6mD zA_N0MHqh}$&M)k>&&zyMH?ELz4FzH5HapR!xBQ%kbEcK-B4zU^G|R-~_x28H+wh-@ za(xqb4$91*@v2Uw2J&I0vzF{X=?_3f#aouBsLNBO4D}LZ+s19oT`_*0#|r)EMAenpV-AZYq_W0CUGur7+k&sOXj>gLbFHMv2o|fT zB$NTra-(<~)FZ`X6~j!la;~TJ_4ceN1s#&B zp=G3p3{?BZ&@T at 9y?al)C$1CaOK=NjM-wW$c95Lj+J>y%@wY^JiMP;vDGbv;e8~2I z at uWOZk%{=yZo#{g6%M(aF;W!zLqaY*l>5~^266EV*i8=N5bipyDbARRfQm;tv#RmS zkD1;g$54dnEB&%kl1WQ9GZ}5Rb-;0~KH*rDtjtkMGg za13g at I$z*jhVU!Os-c)^3Xh11YxC~xp?%v}S01L4TV&PS(PEi39j;u6a4g5#WhP<% z5;wqA_~Jy|g4Jq-f}4jt2l9RA4aIo#44r+$e8Y-1WS{b`P4nZw_}UKV%X~Qis)C=l zia5rY`dk}9s3)!jd1uwBK5 zes+VrKC)s%i8w1buuJ0kbbKYed3$4?xrXEwi)iuQ?*$gy)rWpH0{%S_<+t8J) zGDDSUIMKv4(IuPejZM=dP>;+ZS!B+6eD(o-_h$U~g#l59Y zST|~gvdAv8BR4d&kfa^I*FlO at h9f3R#mB8E0E&}a*fB{wQq`0_wniTKB#~_GP7^L@ zFV4Ump7*n1$@Lu#jIYmms`l-`F5ZX(zd{ARUGn`C9=m>(>aMnofUaJQNDF at IJ_K5! zUbDOIE{1a>SG2s%nqi&G_L}P4_3dr%+jjb1cws-ftOqPaf~jv6vyTX!p%txdqxU`E zXw`n|U^jcK?};*Co4xChY`hb%etkl$^2ygLNjKZu_C4bRuK4*7H+Go5p$Rb89 zH>jG!o!=}$IlGqlC9D3}_AFGj9PiW-+dPY at S9w;UZ1;6sf8a5(*cUCyS#ZeY;}GW@ zj4l4HTdXMs<0cXm2Rcim;G1mMDLI`d`;UOq0N=vJC8#W&) zgeVF_Wq|JkYg%PEA0nxQ`GxvMa2k9N1^>1i)%|LYGeZW9o#}Ko3b!`JY2I_=({W<* z{y9 at N10+^QQ2=VZ at 5mnJjWnE)f*@XvOWR6s2m(*SGg$1AgVfM at yNw=Kj!|mtF*s}L zsI1yZ#QxW2u0JiuTw4Zr*IA(5T(}`BT6quE$scARx1{PFw5L_Cz(kc%Z&hXH7CncwvI+FVGXq2k)f(jOhYqlS+)AE-U!+G{Inj! z>$ACw9dn!Zgy) zQA4IWYeCfsT=30gQvPbK-!GGY>u6Jzo?_hDkZg;D$F8gehCS7 zNW18gkQYHRGff*M6MCv#V&F}91ZmdUDGa0P#O#$vbD|ifr_}|RGleUhSA&^oZNGIU)|- zy=lFox5sEj8A)BR1K|^JLL7jp*d1X*@M4+IkRS2qX9Z&F?XUhuSxLA*A*4J?D{1S< zsil~#h2s1d&`}+Wws73>&z0}GMRa;)bl1x6UDk<@CZ_Tr*rESMqACDL0Z`CH zx8!lybF7$Z**UK^HzB?-Hu*bi)JMU;(J1~)7-FQ-1{)Z zqr+*ZJahVwba5cfbMFU>x%QW-6hJtdB+H7i4X5bBeN}jK<*v)&$0bq;9!Ntmr at i(e0w zIF6sLiw*a4pqM13Et}bk7%SQEE$}H9F7Of;bSdpXtDs9Y(Eio-%Q(f*^mk>HHNenuYTvP!K^~rJt8-7-pC381Z08&1Vr|~h^Bw|UNyFqu~kvNX at P}O zfl3HOE1qFD5Tq6Yw6v9IiWLy07z+evo9V`onzt at Xvvetz-ab{I`owX+f%JVWmM|+O zInImX_}=%U{lgF1*riA5D6t2B4s^NS^e=Q1GG81%e~K$3GJj z_d~A54FR3Uqn2x0g#=v?*$J4+PQ%NJ5WDc-6JHZkF$Qx_K9P?4MvqodU!Z|bu$^Xjzd zz~p{4p5|qLt&PcQy!TX1h^Yvorjt0sj!Zo=SC5Jk4De5w#^2J|I at Y0_gLcS+ zIgIfh{t59gyAViAF5mWy-=W)nF1r<)qe|oD$=95YtsjQM&1umxw(ULo&|5}%_4{FE(9du;byz2Q`^vgzpn z|8DS#Lflt^6WTq!URSL|Y1ECa3AatzLt8KHSHP`Yh`cH-j&tbOhB*4$ z6`&G6)R}gDe8p%v{@!y9!GS~tdPWy{J3?0FDwSMs(w9IEMb>AOr9n4&-m*>MG&Yw< zl3anNYCW_#eUX-!Hja`e4=d_v2O2^+1)y6UZ9Op*G^ALj!qv`Zoho$LABnl*?CC{i zCfO4H0kDw at 7VHdaBWS;C3_#X1wQ4CcGS_mq`1ZEqtN{`13~i8kvE|=}-q-Cs8F?4< z34jlNg~EsBcy{P5rnJNy8(kIHdKD39sLK_j7=W5SBidGAo#hD zuvC&up$LrNFe at EwMFMFMEd%8_;pC3&x zr*rBMj2bYb|aH&MS(UG)nnKVZ-O1U}g(H`_VyS8mvz?J|0F0edu0ps^W*=TTyv0y-xQ zHqJ+i(!}}9AH-N-JOcSIz=Lb9EJ`}d2%9EWW^yoCAVINadt~O96z4`@j at KUK)5ggh zkT^HPQa5zTsSl#{MmY3qYLgpkfD4QL&M7+hQ2Oy#5g7;gHH*Zu(SU=kq4|z-q#e at z zEILt-#aIUeTw0oZZygs_^>GlaRU`$r2PevWXfHV{4fJGG+hX=iNVWN&BbWokn5uM2r2 ztG~Ygvo@}4k1dMAYs{@Vvex*gUtnHIStxVWF7;klX3B`()esrmf-q9lz%TW*26en&Q9-oEmC) zcaOJ2r>^^j`V|P@>veU29FNbGLYxRq*A8sJ<(+WnL~v4-eRbWFLa1S!VSXZ-!ysKo zl*n at vQIe|Zt=csyaLXutb(V@%C*x-vGh@)l2*bB*Y4l}8>UvuFX2ejt(z=6iAEof@ zPgnX=tF0JO0W65t71871p^4BPza%5-w>W zF8nUC6c%f^wA8Q-%x4;R3 at L1`!qEoX@6rYuHsZqR=JtB1`{_ at SB9?7 zU>JAgszYPMrzFN#+7gj^#0M7C5KZ2a355|x!{EN#&^?{SyCI!EIsG1Po;_Yek$ZN+ z6J2RY(0%YMO`L~riw5b5vZ+R!$7adm^IVa~t`H3WWC`Nf_4asaO4nRtYG&^Y!p2=* z@;!@ln=t3^Fq2K);gaL#C5L{H-knY|l!rTS9T?~D0j)NGUDsCk|mPmVwG z-hUZvhTEq_d5jEX#$7zWLJTZ@^MbcOlOGX}#d2-B*@yUS_MkJ1UoS5^CczDnQqS}| zfOGSp_T`9#Xo)i6m*QVX-oDG)UP57_$+z{DO*>!bv6e+)ML_aIO>Ol>(0#E>Diqy_ zWo#caqA*&Lmb!b-SIE5MkU2nrXOngaY+J66KywR!uc6cwh{RIql?||uMq1FX*S^Uc zJPprK at QBxKfBewAbKk3FQPvUp+EJ- z84kM*13QYHYdrPwkKegp+X+drU%{A=oow at -Y&!d$9Qb`a+|;}Pe#KRjTOgN1ugfUQ z+%rQ&adC;MCxXa`)cN=3gJzLd*L3a3<_vJ2P^J618 znfYzCOZ{}IH{A&(#xhII;IS(XEM~dcQd^`l3QbXe&<0zMF)>O!$y7yb^*z6V55Z;@ zpsJ#Ga|aC|q0px2+NL7b0OHkYVU4e?NRt!92iW4Vukb at Ys|8e0EgwSkSX5hV2KEAX z+dV4!hSprWZQ8vgvlel2^JmJNwdQrE at R(#LR6U!N1sSpwD<>yC))+XX2u@{OS0*-| zxe8%k#hMfl8aYt|u8=Yj30Z}ZbJF^If0NN*Fu at 6qanVw&9D&=yK5rawZ!3~3=Vr%< zJcO051I6#N3_YZtRdA6DYXmK;^6}F2HP2sKXyb}o&PdC+i%F|*ah^f$IO4Xc>%zuz zrykK=Jhb71fTtw0t!a&A3La;6MTh`62T~pY!E8xi^|v=#!p&9Fj)?8_kgo1jsJ%bc zP%HAE1tbrh=)w(81g=M=?hGPJwsOZyr5u{D82=Az?-VRtwg+qP}nwr$(CZQHi3 zZ`-zQ+k1a~Dyq6~*B{Z*5vT9tiuJM{*2v5`=ExjfWbXi72%p=K-A|v#WEL5`{Uz}e zf`S+K)s7^~PCR!(F at XyO0{Evq6(B8}Y*I2BrrhEWwYt6e>4m1>x_PYTJ-&T5 z-fy7$U4K?`WBl228m at CrJGwNl)hnXg7&BEZ*kucB1n*Hcg}pTii}&TYE9Re`gM at xq z3g#7mc}DZ;7aN3#S*qqGPjij*(k3juBnuh2hD>qfzUME-*dVr$f?mOJ z%m>2n@*Ko0$?JY*&i_LEYF7rg8C(yiZVO0Sfr>I#B(?*H3SS0XNkQnvOjwa6J;NNLvp$el zKQv!&SbfhKhNbD at s`0SYa7xq%f9c_Bgqs8g8R8ZVscMKb43PnwYQS;W^hyt6B{$qE zF{h;W6~AZZmF|v!Le{|2ioLr}ER5qse;VlNBf7kt>Qrqo)CZglxb1hIF(?`t{e zAr(G75|-cxemUm$z^F}~1WKq0;%HZMTnPoggDlDq{9G4CIrnJg5KcQBe{?c_AG**{ z#|@5jl1d+`m*H~VG;IF at RLv3o0BzG-S1ooHQRS|L?B~27I}PsTLC&3c3BudW*IU_; zsjbVKbL*Xu>O(T(_ID1Ad- z=(IJNAgxPd&hTEw%qe8`XWcAK~h= z&mSJi8Qhmu~kui?Y=R#I%0LT zls658B%}3j5b#KsEiF>eD92$dEQtqhM>{!?W6ceCg0)t^(bO~pLX;vw37U*YfJo3p zX`%P^3HrRp9Dl}%pki3wwmIK;`kr!`-^%^_e&G6f(wxT+RePtkJ!qq0^yVBriNo0) zRq5?DJ+=l}1BK*4<6PKP=AC`+b}wZCAM*MmQTMJw7opipuq#nM;|07H9&#Kc4eAy* z6Z0jxp>Wsq)D4+`T}sy)_x83GZyGdr5G3l}wWSQYPCTq=FYT)K>$Y7gIaeOHrl~V? z_k2y6w%xp1^!)c*+ky9-`P8*zXcP2bcu;FPn%0zAG%Q+w>UJJ};;L=zy8FZrx~8q* zzh+}Wt)NWWQmVO_SpKDZ5F}iS6?WG4$)XS`Vu}3jCjc+6#zdMu-qf5U1LflnITXy- za^uK{C=8;kP8hO>DE~N+KMIvsv*qLo`{0iYxT#hIna({4V>Zp0-1j{6+D`>8>P73Q zqYp2SNVx`OFLvAlm}~iBNv1Q-slWj~BZ5zo-)uFtSm zC~#Vq$vC-5Gew2$J4+a1PVv;!Q053^Ibng~p>}#>Oxgy_)aoU~6Y`ny1uE}2wSfHw zg8p-;d243Ooiplu`Z(2KKgV3R+ZfxDchG0j)3O2$T+LLg$FgDmfMn`6xt)t11DHJr z40}T6N~Uu|Smq~iSPhucvhdf;;P{Ku7=xJ at E0;-*MI3i5vO4Y?lvQ%lsrQvsX<}!S zUBb`fYituw>4moh`>WeJ_GfBu>9T|p%Evq=<|)0P{##tfpBy*d at +G9)AA`qn-~^D? zv`2_(7@^4tKXbl$N4!OtUeLM`;4O$IS%>zNugs|q+?m3GC-BDB`n`1C=s)0DV z!zj!n5LSw;6bjQn*X$&abVbR5007)W0{{s9n^pUdjXP;uO4#BEVczqGf;8fQqXh|Zo1voDY at k1+Q+C8s#I{D5=slYc;u>*s&+Vk znW<|@H5?mc3oi=0%fGTO@(}%d-(T2?v`ThBUKYDBZYfmGi|{rj4A!s9Aa+oP&LBU7 z+J>+5F#1r06=AlZZYW&x75_}(3bVg;9AUM+ysUx|yTvQY547pXxA*Yw)I4IW_+yMb zg_(L-$24Ug8vkhPR(pk2rrL}hfs@|Weo85~!?k{W#d~gO=k6Gz(5{2$DC#dXyvwyV z&E at L)?uD2&SfnTFf&>57Q5Wwf9x!3i at itG2$Jt`;5xNlr6T40|btp5quAMk&Q>WcT zxmj$5ldUn-uA_xm61A`57?QDUQx(qw+dT^J2%jFz^D;)MR^j~hFy2V+Px8v)!AhA4AKr?K3*H(2@>U~f&u+GvyD{t9XVRV8uidE5%MhdySFO%u=?@v!i at Y zm4dG#vd?``K-Wq0+{m$hgD)fMt~h+3&ISK5un=W+;%qNH^M5k#z1x; z`wTyPrjIpBd)+zbDm`Y83?h;xsL3cayU!c;5vfDcQx05X=`k~TbiW`oQ4jwn@{;E& zSY&`mf;|`Mn7wwsd=DlX1C-La{F{tXb*DU*VY3jC;#Z`3KF{|uPF50tKl3ZHU?1gg z=3llBIf6N}64!oa)wyS=?!YAZPSQw(X>yx-rPu$-Pnvj&I&h8|w15_b<8r>kH2 at z$ z+!tI(DY>6rpB~-bJQ_&o}$8 z9TYYcOKu`}U(YbU5m7+uAuZrTx??)^H8 at -`4m8*~`%H6fXULpcPj}9WMwN z0DwBe|1J0D|AHEL;#jd z2k2liO|21CTrjOaN!Vc1l6z at N*!**~e!lM*(2Q&Tx$tJ${zoAVagsvaP2-x4DDJ%Ak_%<&Jp{eCe5D}MMv at OZZAE{dn}VeD`=>TZf> z^CWgAyEP$C0Fn?Wm3<2V9 at s+!VUe_|rb=2#6`l2E?Kcl__i%%?oU*I1N-U{jr6l0` zUyQDDQ&l!Ij8}4K>%*>$TFj;-+VQT$Wj> zeP-^H%sx*(cHz8m9+KFHUD3{(D6v{8K_$Hz+Tz#2yIw_Q*iItai7uIlwc#p_M3_ph z>Z&Y4tQ6ZM$7P-FMAY1YYav<1_dJSM0jDO_{DZUsuqt_)REZ*!K3)X at HEA7@PTP>f~0KsfN z|1Q^oIH_&d9-Y?Brk(jBwQ96dXr at 2XpF41H51>F|1`rtls1o|k;DBF_0rI#=4jAGf zIm6sQvj$@Qn$u7jM>9OLPp3rzJoz0VQ$TeFgb`T*t~_u?!u_x`P#uxlFy!tYsf;-v z@=%};ArJ1;wI*L8ZDl1(F*uC%X~4Of%51|%ii?IbuZ)MJz_8ua+Zv8 zckhBqgW`Y18A2#thMs?K2Ju8H at CPVnMlLKt{k(v at lrCVrAzyRyd_9sk5j2BwMH6s` zFn;jbuM_(9o^*GG&CT#XPUKxe#y<&o#XqQ)s4g^QlT;^T^2EYEcj=y#4JKI%g2j<> zO!G!%+$+=1KXLoa;iTB{&B$ynpk)@9h&rF3I2T=)M!Z z0{bn at pm+FWR{TZITl}l=p8me(Ob3@>t6OEDV7UQ+Nsu<+STe=}x`7$njFw6cE|3Hk zbC?~HIBXaH>mg*WSJoKq60)g0t6A|+v*HonGJ*I`i=gc+VH38{^fm1)-|WyV;u%iZ zdQUXtEyF18D2LpE3$pRH;juGkxMSA!g;WD3zOuX*ffMbDb|1vc?R}Y ze at -z^Td?7`)wg+s!Wcq3ri;$j!$gt$mbFx4 zeEMPYtdt^gUbsqByqN1tNZ*Wg5$l$yJ6fwE z6qyus42d=N`jRV5=~9T#iK2X at tvkgF>Y{h7pKEM&N>OboN~@9BoRfSVw{6XC9$=n= zc8?}H_dqmv!1V5|zuDYchNjnax0yd*9?;)g{o7yqI#moqVs32 zmqAvt2I?dzT)*A8DyLoFBz5xw|3dvx`Y}BO^Y`PM=JWz9K{JLqOqiOPo1bNxo0r>Z-|Azl2Lf9U8#v2ydf(03JC1_ojDe4b{_tcLo!OKYW z=j>bhn&mWvGZ|`}=Uv`2uxa_B1^d>4lWjr?Cz8NL6n53NMr=iqM-tr0A!Lo?V==1? zlCv^pg(#&2 at ncz>=qqA_)HR*AIvT;0QnVfppZG))4{h&>$i>f1TyKl$%>>I8i&8Wj zYvyi|cRN*d${GW0>dw70OOX?MY at Y<^r{N6yj5 z{MuEe9Eq>DE(|}dR+ydLnD(r?QZdRA7_(~OO%^P&TH-{#Ev|T*JwH>smqkI at d25(k z>_B)PEd^Z3BM z#;z2VF{J~=I-sX$uI~`O8rg=B(DuHUEaqlFy#?E`G+?;VXU18Cex)>`!?o8%=2-0ulwQGIg2cmV;tQo64qA%Q{+#0;s*sQt8gD8F~^d zdVbCVIsP{^PX6*kA=Ruv<8C;|Q3U*1;22pA? zFuB+lxFo4W_fxtgLcruc_6akXrOaCDcLW(alvLn>!OHGKP2$uv=4eitiA4sp%O#8K zL{?^Gky#b!$Tdn at jq*EZEhuUIX z)3$l**=m=K at nut9?tFHa7f;hRAAq4iR)%eEt}ENKxV%!0nF%u7<&E)J3XIO8N}a<7 z)^y_twcY*4&PUp?yRhaQR9#qvG*@tJ$b?cIekt6s=&s7s6wB6vMbx+nPtNiTDL;ud zSYr4tAuz(Fl-n+Pq(x| zMR8-93I&M_IewPc1kEskB(BEOIcm-$AWD#nX~e6F0Nn)`?aNG at D=yi~FgELIaMu$f zPl{`(P==kRPud8zsmXMlI?ayY$5-mJ=q5Fd5!D<|J-TV_lXJ<(sWGZJ+{SBVjR}pC z9+lL`+Zf%A{`?z=E*MBgx=6*1cI?_xY at ZOJHBQfUaS$3p at uGhknkH^7jc&^s=rW5le|I-xfJ0 z-63mZid&ZoH$r!o+1VrM-|-3sAZ4I&P7o$SI+tBpe8J{W!AIs!u4w}aH^j9tdQp>N z0QSLoC77z9tU6DkNgkB&<#j{fmWN}Pk$f&p-?Qg+wQ{cMUVNmW03R(vQizU+BAi{I z|FC*z_uRt~UF!xK>@ePX5XJer_ at 4$vZZX8Dm-_aqk0bs4DU}tF(L%7Dg7BDE*1CRr zO*zzy4jw~(Mn><=KB98e88T}-j*`e8S_tzS7!U{MP(Vy%BPY_ao{t1A_~u4ml?TYx2^LR>hjMu6oO at m{;%bVyx04{XKM zFFk&Ao(gK5vlh0~7aNc6NN4a}9`(&(me at cg-oa2ct%-V)2HB7uURMudCRJiPa3I5( z1xcL*97yk{h~=R>3=z($AmEcB{zOP)^tw&SkC;Z z?S;QHI5!PMuN-mFeo$Nee>_y8TH03T{_5}vYYzV1=LY6(f}DnMr4` zpJ#A8Q{Wu9vPD%zOOe{P)k?b%elsjBz{0va3ty-DuX6Y2jrZO5wxn4ScSBaI6W-T# z^P790^X%>!+27y0Gku`-0D9_$NPN(TtmS(8vEmM$iNjb_g at -Z}dr3#pD17M$WXj#T zVbvbuTK7^9`KWxUhdz|GlJ`s$esu3Y39H~tN5U7sN?rJpZ^jpXL_7MDS8IabVq9y~ zjbQ8|kJ=Z%aw`7%k^K8*DE=^q@`B%*f+Lp3R?FiQ9u{+yzDn^X%#9u)L4Kf9;>Jgk zyvefIP?wM5;BdFM_$5*+C3tgKrw&wj>_wRxRFwq-#hm2jcG3fZfx*UUr3H!8CB|Wx z!?d7*H`g+h^I}Po#Jo6bvP%r8Hk394#5>jUE*j3D1*V!d;4aC)AJQcO#ECwU(^?>< z>r~|WA&ZUVSyCdS%9Rfth=$CGQcX?E#NN#hGSe*-*N=s#PL@~~8F={2i)6ff{Esa_ zrs+YcLzN|&3(1*`g{DG;=vIjxJ at _BeBx%J;FNI$q{3C|SGo;G}aW%ObNk zui%W=c0EB2^lCiFRA5FE8fFRu$b|eZo8+W*kXqQ+AzHymb$jF(L)&3d-Q5IC03&xVp?Sh)V6#!6Hskvzjshql36`wpBW+32{TRaH3dEtc;*Ni zIHwSrZ5SxWQA{<-zZv{_R~x3chGoO-;^xxh^WYk at i0 zguiNKv5_5ktfM$UU_VW2Ho)z41EWRRT8V5(m6Ca#CvHQV;}LgH$;`+Rqp-ZTJAk{5 zmkMh^BwGynY0}`ag+cPsszjm((e(MU_ z`ez<<3ox*_emc(-7m5{!Sh(5h_3I6^D;y#y2xm^NZIQgOg`WBwoPxx09U6}ud0tVt4-DoDJ2e75YS_H+7o8QLQ{EEYCRa zh^@gF%h|T;Y+bW=dM}5dcQQwTizGuI&MOh5eStkt2)ZB*cM%c5p at R;990hcUNIy<& zS_Q6~2cP$bPcl8v>~3rAvTv!_9aRYPzFbYmyUpf$&lHyO=BJ_d+ at Sb?)w;WR#pRl{D71sxs@;gTMpm#Di|!m6mhXtJ+-?+g zHs;>0E51GYMAMe(gYUEw`P9+`*4K)x%J+du?OV%Pmsh(kuW*UcV%w%L^&zJTbXS42 z2#b87EWpu6zJiSU7Vrip(`{yizNQ4f8XZ7CB-}wiz!b*a3tdw=5z1*NI*aeF%em9s z+Ia at i@-?OrG)hV2yow+C5pfG3<^S*}a0qT>lG3}lLTdAgwa_EnM8i82F5QOGA)Q&7 zXqW%kTup^IhirMZ3>#Q487qx~HwnjI9OtC<Fb1ff* z7#B$K2Aa8UCwpn3mE at tN!}d+#ve9uz^5+0MV7uxYy0*iX=s6bY48dHQRG7PY(V>Rb zkh(quE}a-zCG4olBP-)nFN3UBQMyzj21zK)WNH{*^k9oxZ^gA+~XL>;oNMUZb6*HQuNmpV7eHi`vb|I~SuK*(m#bWnU=Y zOBDFgC at 2Q|so^)A={FVitl<|FPk4!1Gsfm=RKpRmsz(w_J6y|0r;EePBn at eR;7 zQoxtod?CS z`5+$$#WTIF=sV(%l;k!n9)qK}F2}qo)e5q)R$=v*o`BcNMICWgFJa+{VW2TA>weX3 z6ZptDe}rejB?NG0zdjXyj~LN44CwZ0il+^Xzo{Eaxl7`L;9t`(bV=A7J{hnB!9sY3K$6&3hrdlmpg%mN4Xm+pP?!L(E+V zKav3W5Wj%VL>F&O#DN at Gt|;GAvLafJwqhJ4&CMJmsvcpVk-ixQxm<16T?FZ3qM%OZ zJ^OMb^-|?d*3cHX#p(jE^)8bK{W$h5Gc6NVkWD;-E zFHZk4Fojl2K?Y5tT!*z}PnZkzkXK$R#lm#I7RzzC(Nf1!S>iSqwk#4{T*9>{b&?^X zkZE at a|F%yW=KzUUNKvrDcf7{Rp`X^up^JP-^kSb_1h<5hJ=>13)nNL*WMds{C zWUEPO2`J at f!#2sw|3aQteO6AF&ocaUrkU z;?!pgQs0&w71AvwR$;D7+VttQW5w?&R;y%9=W!WcL3 at a$@Gt0tiy at Qs1L8P@^W>J& z{JH$$GkTqr-`Cu1#rV03De>vu5!Scu9)VcT3QPDGyh5C|JNOg|SN!=X18u_C2)3*V zJOaP(ew_D5#Fy82qhAfaqS?A*Pqa1Nx%|(~Lx8g&UH7)(9&9ZbXg!OjYR*j(WEp)v z>L2aHCRg6{ZM~?7Pf%{R7-HO5l!s30Z~NQvK}rKec3aP>+d9FlmxcIH!w7vOcSqod zf94OT$KXq2fC2!h!2tk>{M)lr|HQ5TbX)Drj0ttMC;+j9R<0{yB?%O?8f8Ziw4^;Q zND;L9(L0dubZsz9lm*H2as7hweX#Gxv>gU>%>*<5Li1g46wg+`U&e58#hu;KZOwp_ zq8U2P&2;_?!?^RiKOXbt`9K-MRuH%v2+~9`*R&Smt_ZdA_(AZ~gvJdtuhoW=P|Mke zZ$Sx-XsL}RqD&=6WijcQS{#OG>`Xf*987-Oyu at YGWM$=%h)3qL7M#MY(xP=nr(go5 zh0+8wSz+{YR#%iF(=o)VUKaD}p)W at RN>lXmq-o8Sk)P-0^$ta4SDJe?7NJHbuVH|@ zC+FF88KlarGBj1`p8#_B!wj^TS)79iadY*lkCQuv2+N;HY at a}bBkG=5m34X*R%L1H z?MiGQx~z_q*3|5mEUhS}_Vej#oDa&)?nj*bQqj{_RC77R&!DYC#7R}2cMLygw6Q$b zk~f%E?NFh^UeWa5wg(tK7#Q$M19 at o_NVHZvXPv7g*K#cvS*3*gY#wC;yJn at sZmrbY z*xYtHodjC!z%Y|$1YazsSu#1)OC5pa=~7{njx=ja5|!6hin7kg=;biQ22^CJ$fPvt zOS>~wbj_R^Yp#f(LQE*QmR$E~g^ZxKM5P1$4bXcK4TM`IO8eL?V|XN^rAl zMf2#l50txR5q9<->$J2J?awc<+BYMCn0EzMhB8Y9v;?cbv3ia&AlQ at 4Id%hbuD`mDMOAZT)*ZCN0kyh>0gQ=qTCo61g?!qwj(0xAwb z_7oW)%rWNJO|}J5goTV&1T}MzAE|=YAGm at Zag^@^(NS?k$$`!pBssY^aE>Q%3Cx>R zz~sVOr5+3pnH}@Vw+);UEHqF?KDe-HEh)~(RJTzrpO?2szTQN!IMNt&GMtU3I&##7$S;8hVl++`p^bJUU?%GEmpvY<4 z12LJt!(^gzOL0h!S?tla&{TF%r#cM47>8I?oAgSM&;n8+b0J8WMUYRo4&MrX;`G^~ zODWu!+S6i0(H`|js5%a(zKR+T7jHV#{1INJ*NO0j_&XE&)z}R&>^{y6F*=rjoO&}N zV*1XUluW5cq|}R2tcN~ec+m5VYjWZJEXA)OVWa-F6YzWl2?hKVQn&{j%)xyZb|ASK z+kL+4GA~-S&?-?8v|>pazF at 3KUxN?1Di0ye?`y87rNAr7VKu)G`w~w$jb0-cFS?pozO{gci z{w_Kb#0MF@`Q9CRw|E!w7ak|=cUba*9!ApN8_K?InaKR@&W)* z$?EEZI(|bScO$?yZ93L?laXB>J>nS5_ at Udv+GbA9e;(F7;j at bCM{w;CRL6;C?_MUb zn`3+3>O$iLFk~T^cXe}lQ|^7d-aX%6d-(o9{X9L8Lij#YVXXi)?!xpoAdVE< zfPiel3L$4Uts`ORHXajh`VEHBu-SkVpa$6j{<)V;B`KA9>8vj+n^1sFas}k|m9D}{ zu}vi`74S9uK)*RPlcPw1=8Zz4)uq*0YN{4k>8!FNl8P2166q{E1>K}pHf$)ub&}p2 zgWQ(-Qq)OWviy6V;anRVOn~-!TcseMP)$$w;(>P zVS?})TId!84BJ^(2fLPiBie#_Tf5_S>CMs at 7mDN!xNbY7omEm|!r}^7xVhao!$05T z`fMu8#ipHf#*^AfbSo8tFQ%$1FcbYz!@xKvZQzy at Xl2o`qJ}txZ7w!#Lqi(p(}M%S z3Z-Cy8yV6}Wfg|wlbPUV54^m?h`I(Z%PWJ}_~XRTX#X~2b-AVZAh zf}3$w at cx)kr#JP`Zij%$1)LEKg?R!gtLK8Q<=g73)3Rdx88qH)8PpO#Da9_CKQt(# zWdg66r_8R!z0{Kqc6{B`cfyWFr=6s0D#d1HZkKav?#8CEgzXhlH(k}d;|iW;tRaFK zphg@$pazPBBZ@!>mCx9zfq;|%E1(&)ewPb at ArbX}$d9}y(uip(XLXl=;hgm11)2@?Ao{=?ukS!1h%rV;6+8$0GY^gUjmNq&zvKJc1i6nWSD at WCh%9;|sRPeU zUB_x_EnB<_jOPQ!H`2K^gfGTe7vLIz4Ko2XnbBSM?tT9aJD3PNGIuP*A5NIXg%&e` z1_^Bm7F7%rJ at xpFJgb)`^v!o z0%ZtUp>x9^1T_$$;V>Yz(NGkJL8gkRRz;RL<}MfX^xSzOuih9(MiC^LC(sU1NtSr@ zt_t%Z>qAIGga)DL`}Ht$oCleKL$U#J9-AFAd~Rg-v9iWHpglhD`Eq)?m)>sJr6+sF1(INIsxN7kCh5A2 at 7fb{v`^tuS%)E{WQVLSZqe_Tks0Jvmq0|5Yh zga6x86N1jNh7O{3E>4#Jkv#D~vnOg*ZIzb<5d7-w3rW|39*s~%Yc!yc1W;0;mX%Tp z55tYdF!@8D$wDNN$s`fKRk?usd>y{8(7(W at X#&GaN8Dm2boIFTFK_O#Ec?=}nlbDSv+;|SA` zse*d#G`A+QE3TbW3<-OxZ>pt-m}QSrJJKq>uC>x=}58knCS?h1p|;$0cEgL_h}frr1XIGrpL&lVFIgkj$szN z4ew^9Ju|tqu3IG1`n#(t%@tf>9`)G3M&&S_v&2=mjt!Yd4tF7ENDyV9g6fgkI_kVZ zI8t&goP7=h^Rz3~9LKHmo7BCn3mJnpv?xPui`pY2q+StHXL^dP)F4dTAWoMudc?M6 zRva+u@~5&Zi>Yf{-7K=FGk=baXWVwH+R`rK-bRdyz5$X{qD>$d z{Sky+?%c5z``PAt8(m4k4Cbm9{C0v@{poDF0M4B1Pn*xnIRm z_niRPD8WtBx4OIDFQ46B at 3+sdxwm`(GldAEFiJ)f@MSow=yOgrvZR4q4|gw z%uU0pToeDd2nvSplz_Vmhh%lvbO7ZG$G=ChX)#r$-LBy|CXF8XhAV5FYemFFGtRTM z^)07u^AQUTwcDSg-$8H1Et=oKQ}cUZ-Y|l2O!f$GxyJduD6B&{{70Z_uXwdAuGLw- zot?69C8vKm(n+^G>$y>fs=($nYE0I0ne>@N7+qTN9#b@=K)WqcWxK^ps<(HVsHyS{ zG)7Qesud8`7lJ`S6l>Sq=9PB_mA!1pI_C4AGB|;79aK$lwTZ z5=KF?U!Wc;O%O}7rm;>OnyfiQ7l3cs2#>WfHn9SAT?l zmQKLac~NpmNf6IEn(%N2O3G*VSM60F at ERyi(J0;(mAEv;~cwAR?Z z9yAk{&TX94FkklH$G=zR-;W`#VCEv;`&NuQyA5+C#*Q(-xaIY}_4K at TzUA%q|NeNY z2N-Qc7Q$fPV4yER0E!Rz2~`;0L6GvG5AoJ8i+}5G2>L+S9Rs&{ zSLhc9B7y5=-B2KDCBbGDUAvu?b>6pg;$SYdW>sFCPAXY7<;UWO3(P5^G|Lm_QCv at G zE0x(%S)NX^F}o30U8Ks?uEuuSn2t;1crSZq%@mdwTsR)_a#dxETC9 at F>I>2<>p?Ot zKMPwlucKy#J4R#UqC{?ait at _YzHI zCQ);ZB~vYZ#&l2csE*Kt%e8KzQYTpo+UOyN`?cCh!Ds9cZyO_A> zXgSoVu8=&tdH2#2{$)Z_`+nN*(Ico*9xF^F6jvgq&I7kWWKj6V_A>oi;U}-UFV!fq z>_F#XbK%4%s5WksEZ0<*nKU%jl;9xon~xPDS9q;(qom3SL&n2ywT-Sh`mj?bZkL1< zlb7+Xz$S47c3j(4k~9NQxbAYxB`LVgfRHG2p!pc at jkXwh_F!wf2OOT1-cHUbS>Bah zSlVlcVyYR+n#9n3oqAeT1m#R5<^am|kFs0lI|q0}fHe`_VN!(QI1nG2;s6&m3LrKS zUm#Thl~6F9f$}gK3?ge83+S?_jIs7GOdBZAvBOVF0*4MS<^fQJ^qY6W?1A3lvOQ$| z>)@t#MN1+FuM7t2HP-6 at r-m+)=!ozP{$Pj)R-ER(Rv z;fCPyY|n>kgmW)njv1LjqZSNVvBiE$e{#GzdS9^tl=YeK7 zfl81nse%@?f+iOw4s?3O at N}GAp1gF0Y=kz5AVCBxT7qN8UQ&9`o|Ahf$;B-=dU@=E zFr|sR{Wo6g(bbc|Ray6FPZ*_bL2&I5IKp>Zt{!;EJ-DuqF^pq=S3?{p1~}Y8%ke_X z%RMU6HpwM(kR!;2=MVq7t_ at UfkD(oe*N7Uz$-*Yqz8KAO{}Nl)sCi z#HafaxRmPClZMffFaj^_zW2r)?} zB_tAC=V31rAV7>fAWQ%uA%vn}(i}B0bYr`o1`DEBQ8~6t1?TkutQCS)(vj zjWEW85f)sE;E({G3La9;qDKnN7$)2!^-$0}bfB6A{)h+X^Z)`LxrTSLdhES%EcyW? z at A#mSAP)4QC7 at r>)JT94WcrSmAbx701yQ}2Iv2^>rr= zajW$vc?@eh93$Z(xi{@Xii)mUSW2o~gPXk`oxlc>p`N_*BCG~e7-kdxD_m{?b?tCe z3lJ8u{!Y%idU8|3W$PYraCd`)q<<}WyWU~+Fl#Yi4u-l?&{Km{Qq-PF%+WMT&RhGO zS?tIq>H`>A%Z4R&`A|Id=U7`n+ at 2;gB90`PxC*J%l&EsSq>SQ{&2HQy>8VX$F%@w` zp~tm3z=|Fvy^NG8n#w&W{aV6WjHeK0~}Q#E7EOPF5O=30WfFY&Egs8lw2eQuSm>VfazPSj}iKlL=kOUqTeb~cliPlCwFK1 at tKEzqsJe8M*_55EnPYILlLb9Q=cRVmRALqc zwQA~kAtnhIL`jN>bC$OpnR_PK4o%^Rv*OH6izV9X(+`Rwe6dN&1UYHh zrMQXDs at 2bwlxMfqRkrOx0d8Znv!$S%g)>5zCqbs%XmXT;-Lvy+g3V7v z2s$s-0o}x?X)HV>RbwQp6=}6ld$9LBu^}*=wBpE68DWf+C;W`mW)uyw_dHo)s!Piz zsR4G26vn7LM7L%qmKVuxzz7d7=^jW9aV&{wmJ5^c$RP{<28 z>iz&DJz+Kad`Ba|Yg2h4=cl$s|8SAM^el}~=u6CbFT^QJdtRz<)1q{qW)a86%B~aQ zfQD97#FB>0IHI0_pfAd8lfG^GJo;SjsTGIhw3eW~hlnW26}(pXJH at hfvr+3P;6em_ zMilf^`^Ro6;9MF?tSQgrx~}1Z2&zsX$E5&7gRakPFo6aeTP$3Bkg!(ZEg{A$NbI#H zIb>jsEjQR+{Z3pKeg98LK)`9`62-N3o>iw$noLlI0BWXc;b>0nK5B|nL^%SAe6frV zF7ybyj(}Bj!1AU5$gMbbzu}{t9s(QSb0$C*J)uTGS|#%jt#WPp%ssS%q*!VNn>n=) zB{BM5$-RA{lFt^5Eh*=93Xx2wwrHW*{~+xxgCh-+^;|JCjF_2m#LUdh%*@Pcu{2_4 zmPR9HW at ct)W|r<8pY^@F8@{%W9noJ$)c30^^3A8Jv$8S;Lhz7q?7#{b?U9b520TF= z4SyivnE(Cn9WNlc;b}ET8y7)qq|_2WvVKAc z8`y<9_zboBPKnOngL2D^JxKEhrqNWjY*IM+T|%t6FvdQGR5Gh*)FF6?3Cb0fgxJ z!U4Aaxyp)petCm7*M*fO4fi&3#-?AQGL}TC5N#Ajl{+HyG-;ASAT+7dn?J|#(vZXuE*^cVxAQigq z9#q*3Hb<>fS-KuR;16ZtdDC%9`ap*IGphAorDl&Fq=jaWazjs?ja&xH)CU!d;0qqq zs%Cz6NvP&yoym8}NHEZcU7mlUL+Y4O>h at Bq_8APg?V3OHca8(n^`RMBH(u*EUN4Qq z-6D-w?5AMtN0WGsm2^m7ks^>G2<8DQGt2{0*m(fXE~R?+RBxLAoDM{Ii7|6R)Jdd_(7bNzGMy`F^(qS%1I z0gzK*czbE(8OPoJmLr+*RnRFv>$)c}?OMEtkA)7%&qlTW9;v0<_x9TnH<)3gjp7DZ zu2$jby&Lpx&*E&j6izg^&}yPXDUqyYiNPla-89AGLTDL9bWJ5j1iy+P()rW&5tHX_ z=?&LE>CM5(w>|tO&NO~$XXY-w$|H&iTd-(wy}^V)w^_x7=0a3M&&Scix6e?SVx8nU zT81g|8G3bMdgWxkSZAZ|Ud}=}%hdWLEB2h6epz7|*@+Ui9+6Iy;Lflz*TXL~%2|^3 z=aNw*a|e7|sHI&!&8hxCn&ZsFlmp#8F_#f8$2cbA|Oj=5%LdR zc34r|Em*|)Q;AZpSM(aqA}yr|u^$bZ&L*SjL01Ww*OwP|yL^G) zi0vPpBW0Kw-(rb$S znE>wIgVbqBCBMiw@cbAOw1xl at v3({2&-|p zgaJZPxH)!%UqpD>nOwmHlGFv!3B4&Mzqo|OaYFXkT}rG=*H71e51W87^$nHv)WXW( zBPDtcB!Q0((712dM{@i)na0*4x at r!pp?j;kp_;_kOU#uRf7K*bi=*TpXP-daBzA at 1 zk0-dDWF^9~@qU%e-Bml`5v*^VM>lP96Tcl9D7sf%TRH(}<|MwyER^cn-H>^q%IK++ ziBF?@IX=R(+7PFED-#v+EaE5G9CH<2w9{HB9cU2{)om{*8^5MHb23)+&JEAZ&H-;< zd<#T?)xwZ>Zpc^Kl}?871}(;J&MC4aMA65U=WafxtAoFKaUw*vr# z3b4S#zlc(Y2Lj^zKSPv|rR at KAZmO${ql)R5Vj~eiHv`k4&_FlHwoRpAO%@JbgQqQ+wG4npgUHQTL~AlPig=u$a(rTMoNwyUqgXgDQXa+K5 at nDazcW zZk0wse`|4;s>CrJjlG2>0&L3Y6k|hHcFtnzBIH9X+dXm(P85QZy(G<9MLb!XU3w<$ zGO5He8E$6%L_$@Dn;H^g-+ST=UvXv|FWs(L5f$n)Ex_t%p1tXMKF6|+G$WaCT9Z2i zD#^}@=CH3xZ9}0MUQ3QvlT%4mGR=9Ka{c)sA!Psj-Rw$lmiaMkEjE};P?J%%io?9D zI6*9R)PJ?p>CplYZ69rG7LKlZZG%aJa(yi)PuZOh8gvo&nV{o<)B9kvG>y6%L2Kmq zb*6m=;r8nz>Y at 5CiIowp)rQBQltpQ->9&d=i$P}AgIMzoHj8GuOmC&xvQKjr_A=E; z at WNnWCez{>_%V97M|$YM7VaVxR>9*|qU;LR-c*e at x|M13YU4>~ixR;-3z`KnV}v)2 zP1912m=0n}1(S7`ku7kAQ@@K*UyXQGMZKmTjYwG<&0YEzF)VxNLKsMi4(z`$KAW at - zjOBJ4E_G2R(=3KWS%`?1xWKN%rJ at R72}*uYoO_z%tdztNk5DgmChVP8OLodMYJ)&)q zYM(FN73176sN)~KV|%R1;6(R?N^+EYVnoUThIIJyyT{?fxXXXz{+gmYV3;+K^gSow z{_)qHcDT}>vEUQ7t&t(e6WSdC6#k3IdZ=#KK9Y(KL7YLu7%^qbx^6+t<0+B9G;Xak z^%Kcjb4pGV2vr(fDjcBL?n)50pn?gM=;FgfHM zn~)R2<{g6AL3{YvD~w+`mtQ%xA8LalGk*7V1P$LG0G=PsG1s z5SIe_B2-nP$%iQ<$4GgwQLO5;Ad>}MZAokNnqIDzJlOU3{1yzHp3pc1_RsC!K<3=r z9k at ug6H1C43FebH9AZ5;-;WF^SX51fAm=wU{HPV--YD#HCA1N6UzvHuYmQ9qZ* zRYm*O#WXW;xA1IeKqpus)^$szFGi&K-5?NEOuG*0g6 at Mb?wZcUJ%2I5wu2E9LB3>B zAbSS+vt0inih!|p(5j%s$6}Abl;`>CVx;d+sA+$e_cU+ZHs^DexB1uCaWg*4=)6(V93!d_b}IOBB%qS0px$s|*9!`pIq0(juncBS1cp})8yL!n)`9mWyS0-M5BQck$3CR5a+F2a9S zdji-}F=YD3Zi1vg&Xtd`R>-9KLX6vU487-UQ9t-0ep;@Tu#e5)l*5h0^)p}S?A`6b z-?7Z)8Y+-ykTJ)mk8zk{p_hRts)fUa_FtuNGmho2y at 5IQ7;}KEKYT zh36P at B)i^4WbGf&=HwY})kcg2pkxkuH=imcO-gUhRdeDnoFnzc^YvtX2o476~8s%cBwV+vP`p-SSxX;M+e0p<1<9BHtk~x zJOpZy_?4oH{4ppzbum%w%|;4X-#MzBh at pv0Mw_~z}>dQ!yWIW!+$8podGvDkQ$ z_-d7$GR!UmX<#oTl#J64X|vl`^0=wAMXcgtmvOn=N3;c-l$=g zIP7l4H8u84%EI5G&nfT2sVY5iS6j;0EY%pflT>a{6MZK at jpT~WQy&J3J>>xBDtuC9 zDGda}h+nKle8-wvTF)zhkZG-NOmP{gDGEHt6jTcERu^Z_F~h7{Hh=ZtS1=YGrksM2 z=foSw#IWR;bSTkthbui_mj+Bx!wajnusAo&i?NOCHa{N_s_wT+JWj0+rYo%;7Nd4H z2Gt(^L4g!}6lQ92W+mO!xl(+XITxnbjE#9wP{H3!&}FsmQD!ZzfI6B+I at aV7zsKkF z$EQ}Tu$l7-6w9(8QKZ9;st*37m3^9J5$RLl1623~6|!DaMGys*b)@{H9_C0#Cpkk- zkeg|dwva6E6*%(%GJ~QBZ(<$M{w(rQlAH|^aEdEyc_^IKpJC*`r^MD4-`7`|1C7hC zB|yeUg6%G#>Z)b?J;07Y<(~im^rOXupOh7m-QYa{zz>xz#%vp?a(Bb;Jds3j4lhN= zenC-ShoBB(!32Q|CKc(y6hV;bgE7e{Ed=tNF+kP-!b&Jpjteh~o5lOYTl0AU&LAiV zrKi=>7C+%rsl{E_$c(TZkUrT@;+gr*DVILrEpxXvhD&8U;~QFH9^!pQ{xQxy at B(l6k;3RFj(LqdbnPB^i+el7C?_9y zOYJD48v;GEwIbZ`bEmW?oq8depy*a9G&DE{)|hyuB_Y#cRCYa$qsjN4YP$nFhF9Qy z?Z-HQP2F#Z6jhxSBh5!piw9v3a165SJ|azWSq=gFH%Qgntz0qw0d^tmL?i-GOP$~s zFbQM){D04g=13W_F9ZPs!hi$<68pbEqMD(N>pvfe|Dz5E11?=D9XOR at Z*ycZp*om; zIl71>lqi4F!t}VSa;%R1=q7rvelawmmC?sV9P?BPww4!WgL`XsXL{>#dUpEe`|J6+ zJ5aqwG*N68cF7)Q&jZkvu~;y&Fvu$hCr@~ytsMM4Hold|K;E?zxAAM=VV4UQKziLL z6$gI1E at m;sEiiw2yRJhFG|f=kNGlt z824cNwIa#nqR~qjce=+dB{3CZ%$}RN;Q;3PhOT(I*w1W!p3Z`4%7?Ft8qt{d5cY&@ zxIZ?(Z5DB_*mayTU|pyiPE+KCYKoLs%4pF}OOiN at rp+-gUtSjCd4{H#vJDjGKWo=F z%CYR(n at 45N8oLh+MBA=gwHve6MEj#tP5XZiMi$R;ujDjgJrcS0SPwT8i~l3o9ef9NI+&R at YH z`8j=>k2F;glW=AS53uOmjpA+81cBjjti>#2+h7enHa)uc98+a$iEG1}vgFtZ;ra?t zU at oVI{8hx9KrS_n1h9P9%U{J7f=ZM*C_(6Tnh%3I7-V$yqmo-2MW|fYo7xZr-UD&Sj{QS3yG at Rno)~SEpfEM!q_+r36xxv3WK}wU3 zWhD3j at eVApk!5myfnQByyh==3q*&fioV4b6!a08HI?GOV0-{tw#DCVJS<>pGim{zr zU-k4nT21e4CE)M&gH#v at Mg!EE;CsS`q8YW=_BJ_$8BSp29LVW%k(gSRPa##e zaR(78CrbT>tg_v;y|WEtMg7?@UYGf2-6cfUXk4`+BPnX~4l)=A%+5%5RZ5YH{m+Ow^xsM46H2JtXAQh1yT{;U|7m-Ox!X zbc(56Mao at A`1a6r9je7Tld?RGrfku?HJ<90)sV5qV at A~Uqq)}0g=>c?UL3z&9}ZZs zs_4barl|*{Ok(Q`>N;g#_j`7d&k^NQOYZnPue#IA;n{Dn_tIIPtvWD_SHVi+hc;P{ z9Afk$dg(WX;(;OT2m5#dV+Iy*aS#|ozKB_VnF?^#ck3H@^CV{p*aw4O4p>f~ zC?#9u7Ll2PJfN_WTH+S$A!whn{bH6)xg at 8&d!)dlKD$4-A-IV-0dTy+(=QYnw$xN9V7x4{RO64g-26#d71r{h_fMolUu-QA~3Cc?9KhYbIT6m)m)MK-JRG?U}V4 zIpi#P7X0dACO7B`9B&c)FwU0OihshC{`$8{e`UbYU=@Ey*MA at S|9#>AgYz-bf-rrI zNTS~sjaslvI4wwyrYBe;y`e2PU`+6q(isBU;Jg{Ih&%ZMRCYRC{S&!}{#)mt9v~9P zVNk*%Atwh6jdSgNR(%&P&eYYNG*?{Osdv=S^Hs`A?4c}>n at 4=GOhmtvszYwKH0WM_ zcNo{IRjPdu|DXa6 at wm?V!>+~_V+SP(`9qD1B=$JLA8P#DV>HW>*QatC-VGSyH!z at M zmuTkFajWyEmFT)^ImPyGg<*TS!Pq8mv&J z&B~fT3semN5bXD at G8C;ZiZ|96cCHig9vsU9z+bVbMYIwC`HZARIwe!ZM z3jdJq*O!;zxNA-pZttVI_C#pUoQYM>Y45JAc$LebS9r1{jMGc z{ex77+woLYn?ZFnAJx#HYAO#UQIZ^`8&`DM7eJ6b^-D^mnU8j_yGp~&gC%$rwU(o3 zuRA(VVFBK@@{KPzzrt)pB}|U$jWGJAhg@$$J1Be z=8ZFWx5AAy`sYh>kUq^zOi(Ij4-#j>=t*mBQp)tXCwRB12D>LwB1hu5S;F&aJ>(tg zTB{|U>Op$9vBv(G%L)Q{Xq9f0teG>ouiA?GxLX~iM|%D|nHQz<2-zc#aJ9C%5`zqy za;Qnh`Ko~}C)@0;iQbr&b#R%{)Hyf+f7M56e8OxV5(Sz!_qYI#Zi*u(Irl)S60Zgh zug;VIc8KwAZeBmst8c{PO${sXt=3S?B1G)@vF&9pR`ih zl8dG+-P#CA%UZXRcC*Lq_N9|HT7G*FXU0yO);m-2%JI*y!jTcX>BMqQ%|~J!*f+435|I1AZ2p9_>LK-Tbf at udpwURy{Qm%st+qXVM!}ONTv{LO**-!b#_1 z<&hf1rbu+gs#2JUKR%5YW^XMP at 3c07dZ|*Q+IXah!orq(b79UUZ9~%uY+{`SJTl*d*vimaruJs znm7}H&)?2(LF(pN-3qlErI*^+p8IyKeADgV2PrPYQQ;+Aa~0o)SV=5`ye#Zjn0Txg z>$XcCd2({FsxnAakxlj6s at 3eFYA-X%dZe0vF_#XcPn(ph*WMayQ>oXDm2`ltr|02M zW!J!bNL!~?(tfk;97q2gC0G1zw#!R0{FX74t&9$DysUDVy$5}IKqXIqlj+;FUTn9@ zYUv+EeHFOczLH-G+^`MIyz%q*UROMHMq at N0XUyIy8jB$!!>d2MQPJCmt_<}ruu@#z zqC}FlpJDsY1r>GX#8oxo!Av4Fl^OAi at a)i&&KG7JrX0q7=DUHtl2k7sPmY zUW`K$!5IS&WQ$Yr4CP`yf&F5R)dhei(GuJbP^a=G$YH?xMCsifmHBH53fuy{BS>uV z?9jlmL)v6I&9ubjIYHyURI?^R;&>gltosfm!`#$VGjFsdFwt0l#^g^LQ%pHzUviKH zvG2+O%-;RjR}$F`Mf_~Z-tMrxhov3;Ov4t{$Me=b?@au`@r7ICf$Om0n>XZTHpg~%pxqs261`mba|n?7kjGGWm3^ae|uhF`Lb-$ZHOYX);8Y9W&QS>X2w>@oY`e7gTY6M67Q?l0qfW_MJ%x at fL1Y*~=+Ifrid4!q%DHxM(aflzV_pNr zj^R%*-3GHt`9#oZEaFIb*l-d39>7YyMx(?tPRx6Zi$8C7cW+B~;8lN=Vp|>ai5KOA zGftqLxU>b(xlr&5(pto1zAh#dyyTAXQV9D22tftkZn at 8~RnTJ8uX#5zUWwb*b7s at DkHt#04Ds6utbH42{r_ at _Z*dNXk9 zEz$EtyCjf}8&Jr)El}$1ZsgxDWZ0d;t2~1K;mJI6$&BL%h5KimxVazBNYD4p_?=G$ zv2suZqRt*5bi4Z~a)^9^kl=E0uwlo(bA6s8f%9_#^0Vv19>&`yv4FQSOwgL{x at QUC zbIXz3AHe6gSoptO at JnV7@=^a37jnDc=g*$zqgE6fILdmG|dV{xxF{) zq5w}o#uQ-$GruBt+lcmc_3@#j$-R4xm9cmB2m5L7MPo9zEdMv)lY`o7D|TNHS2a+i zRg0TeO}ZWAv~Dq;?(|~CcC!Yoq0UsY)a2|Bjc%ZKGGKG6*{0oejAydR){$9u_2j at E zu6cJP_Cj#87`OyJkV>5kV7FAfkKN>|vW1NFKA}-Z*IcNb-Dc-ziuNT>*kq|8W-d*b zHM#^&Ox8{XPEG?LtK595bwPMEPRvP<+$5}$bLx7Zk~qc*eiWniTtgl)p^ke*<+VRk zqq$ygjEBF07LixM0#OH55A7|L8O-6h8>nfQiMPP6_<&$q&0`fze_d4!!cF;+qLxT% z+h6gFqCXCXkz#RP>NgTX@^~bCx^@J;Z3YPhIULuD72VCZL%(`S(N@^7tHg)efpVd` z2#|vXaV~rjDm at 2jMJ^(#lsJt6xNH^+1#aN{emc~qsa<9KG?QG4PAPV8LrCVt&U9iC zxTDiY?4MfhnEKh(S=M3Zo(apL4++zeU*ZWrK^WpmM$8cE*%5U9&?%+uS?y3%_s}6H zpHshstLqm#!oqL>AImh|8ia$}s0Xz5a1t`N49Rcgl6Jo_hE?#4VP?cnNbe`&M0B at k zAO5{zF6{^r6?Mm~7R~NOnX9NN-6A?g8RZY#j77Jg7CVw~Vr~gx;u%NlJ~Y+$=eGWW zWN*;Aa^g;<*o)d9du~5ixX!xg@=0gYjO;h63PWY`P^bnywZnVt&woF)rV zU>Ia(9ry%^>70-2xR9iqkSBVxJtXF#Mp at L%?>%&gL)ZxucLo!z8azmOKd|0o7}8(L zH at WZhFu9wtcI+5#?MCgl&RV34Kh2y+Dm)?2IYJdu1WU^~>NZ8NReX`S55UF2)VVW{ z&$3Qjsv?u5{Lcq}1=!XwZ?08u)VF=&0FZQ$th=Kc1}~ez9- at rjEv|Am at rMmmjhG-? zhZ37+VMepVBsb0nhJdL#)Azq6m+GXU&0hb-f!tplaQ&BXAY*T5{x2-}M_a)CxEGRh zR#_qFlAt2V^2-n#xMFxx_!c)9Io;A2RCZC222J@%we!t7YjI?T8n` z?ky6r<^ujc?}Uak=UE?QVayc=DLB>HRHK#1U3%dTovKT;ia~gQ$zW3kS$i?o zk6@)H+AB2KN!QkKhpK{gx<<=&*~ChdCYva(`2#O)I;=leH*C*&S07Z9)cq~vc)~2_ z8;?E&niJ9k{|pwEIMN<_?D0vR#s}t=ml!^p9p}HKqLXKX*s6E zx%-t}NWdo1l1D#Mq^lN>JK$A at bj>&^g}aDkq6)%xV%KiC$gsmy!(G!KT-5PGUUPVzVIgpiUv at 6NmKOKEkdU!yH3P zpi=>KN!jJr^Qq(12=CB^E;FjZWtVw|SdmE!Ev@!_1+AvABkgnfr?y<^el_blnV4&R zt3RuF;>XQ!ifYQfbtzyHy}U)}Hc?0LGBh5L*VJW(;=S}|Fq`Y9;M5l5#+{1j2Q_(w zQR6U2j+}sZICXsrGPra@!-lZD7$xFsw5P6e4C;2AK6>@`CP~8&>Y_}EWaLB)({rMJ z6El`Pn|fh;;PD60jG}hFP^39xPnY|7k0?Gs^C-eD at laWDbb>j6hx#%4&Eg82c={kg z(@MOk9w5Cyy#+EM$wjVo9^5SwqG#Z>3pU#~fhHE~Clvh|Js_j>4u7lP<|BC)$ZO_ at eTDX$7I%<9_j?O?sPJ!y$U=G-XQ_Lxdz!Gn)}R0)W3@& zyQAs*T$!R-2 at k_#Q0S>Nhq(kR{M-o;BB{ZKQUib<-^3$!$#SBp{u-nE2wfodrNHDy zAiW(UTjWha!&`CX%q<9RjYUE>zpa(`3C0v at B_q9so&u+7-=RB8Am>pk$RLpT`So44 z_X1YQwn zISj1$``=be76b^~+u at gw37*UcCB_QN`6$fJG z*6gNXgls at IJu#L3dc at 6g{QKkOS>F$|1|+=~JxSxYIb&=LZBCyV1gFkqf=8-oI!4n< z+mKpl)j4ei)k58YXWZaBtzA*gq!-I8dQjNDTY~- zZWGUH%2eCtES$6em3E4YRLN1>96F_nOM79HZM&^h@PcRg+b~11|bvS9Y_Usaurp6M<92RtK3XPbaQ(hPH zj&+DjM#E8Gc>^kcp6*t|hD2`}z{$4jL5`t2H1#HPT8W&VE7Zm>;)YSuVlEL<`l^&3 zDsihSoVmtHUZKp9FjkpKtIEbBJge`syzpzf)$I0+er;{ut#MJK_wi3jk!4R;)0yz@ zV#M(=t2TOF_oq2#!)oODZ+9b at HY|jn%Is??N3M8hJy#Kmu*1zBbQh6^m9F2vu=II$ z^_$yc>Dl4=&`^;hrL&Uy{sd)mRPPA?nCB?nA=6Q~LC#UXVWOvg2^n<$c%#y0vDq{_ zXR!$J!X*PA*HFxJS|Fw`nL%s$*!C_JfW*uCkVMX at iDVTqaA7=-v~9FR at QJ_~9Gikz zchMB))~l>r&{AQ$bj!>sJoO3SUgMLdk7t6;N7g}WD|7)lmg^7>O!6PJ%7x|0-o|!9 zE|1uMSS>;#wP0q&d1IEjr}W`PJ;QLwG14RD257!94tWF|j3$bc(MeDo6A(LYBc_vZ z?r|eB$}2&G)a>-b=BTIXRb1VisF at U@WBXXmXJ{VFsj)s|@o7SbR(Rlo%twD36 zbqx1NI*Jp=PJy}^iWIqOWPHX}-P3A)4HX}uo2w3+r7RC7DRS~v;_QfJ|9HgRBBc at Q zp{5V(u at C(mf9c`Pie={JnCp=tU_}i;S=du3tM!LW9-@|I3GiBqBWRHN04I|zrpKik zn{L%-^1COR;t}uxG4~%j04<_mJj7Xj_YGI<=G33p{DLsQrR%JECEXt4?xI(+{DLJs z at msisEBOZdS3;=y7hn*900Cuy0|7DoR|xTs-9?hN{X8Su at b?v+b_x^b{!+|3<;+#e z52C;k6-#UI3Kd`@i)*_YX8DL16!(t1_#Nm0P=Wx&P!35NF4JU-(cn0S)ce5gty?d7r=QS2CFrbU)SdN*MqeOfa!XqhSl;3Oc z+z2B!{-X&q#aYBupW1Q_ZqRE#Eq`H_0IXk1pZeAd6JF#a2T>?P^U^vuY?vqI)PqNp znS$AHlt z^Sw(VL91Sp;`yk|O>Q((qEV^**jZ9`%1Q26vVvvWw<}E{E+>b%ljl at jh=`88%!1Wv zl)3J(%HBY~T)79`ie~kIT&>(y4520RXI)ea;QS!D4`&rd(ocLBR?{uEYG16xEiqhs zKHMnBgPXiUqvwsaAc=x6E&?9Sk^6kJSGSJs at hZMEcMw*Ic8*({e3QB=xmIL}s6G1Z zpRy}i{;KV`aIgB$-_ge3hx&i4HbY|zQw9e^V{1cmQ#wmKGyDG(nyf4 at BCsHm@AS(d52`qfiNcgYRt2W73q0NTCYk?+L5XFDin0Wwjf0)~a1PCQkP zWk1LzYB>qn#=P6{8zfhvfVr+lwer at P&M;tjiA!FOI};Y}$bMRM?wV3PNpUQv-Y4s} zPg5I{rB%*TJoJ_%@Q+iuOqMj-=d+fvH#D)dGZ+4k!9UJ^lrQBL1kiXv&wr?? zDBQv#%SH=DvwkH{lD7cY8^%QJeC6T|DP>KuUZUON`4IcR0P!W=x-c~wR{kQ-_CCtl zaz5TToz~y>2l5D|0LF*VfWM*a$>^~u>g=h1+^yw_&yQz=*^Y~Aywk>+*9OVXRxVa1 z;Le2fpk?eP5LbI6o(FM0hxFFQfh3vxq48L#Dz4?b6b543XKM`R<(eJ1oQ{hlOLmyR z=tR%VWs=4*K8Ps=2qvZS8TF!2{(;Yie$tiaa6M<*W>P zWO#jvi-96lWXCc%=|dW7+k&C|?ha&aouTVGA*rl`iT1tPc?kzigU9|?&zV0Sibi`6 zcHnW${s!k_1ts(%!`u&~v|W~{AK#sBQO%IHdjVyG8 at NYUlX?9Us%9ea3_Dt&_gpOO zQ%o4OD!Z8j%?|B-;|qLIS36fGonh}f+|l?By1;&*|EdYD()~z>zuZNI00JWUpJ?Kr z#h|jTger)1Ndz5;j>ZrW5RMT77Lu%kJ{=C z)qGOKSfqYWxzJ-T%BV=8DpYnp3nlW61DSm{%8&RkBr`OQy>gFrl~L{M}5i3UB641wM=_2 ziU$&n*Mlj<3*y2Ee`nJM2hlo at wIztF9LadI5TlMTEGF!}>X7cHOw*2^6+QTXpCYQ* zy= z_!+K&_~;$OHMtKS2n)&YXgp-hFboyCtQ+P#DGu5%x<9Jzng?OcpxCk|CL~sT?}3Ru|r5!pL9o6Mf--&HX%QK2nLFmS_e{-RVMVy zqqG2*%BQ2EYY?G&-2aJ}5jZL%OI~c}Qi${8&qkhhoJ~)hGo=cz*Fy1dm4A at 8`k7Sc zvnjdk+^mqd*LLT1r}y>s*Oo8CS9kRyV!jf^!1!7%v508>;H?H!lbo(FpM=}KXtx_EA^A0AasdyxQx)>gQ-D-ZZs zNRY;8g^Ex6y4&EMOrrwhxiWMPwk}=Tc+Mf$mr2;MSKrj^*l$(lQ8xA8Lj7J3WaG6R zhA=rfzxaba!Oz0mCA{06QjBvdQ+`a`{nn_lB#(E7?VF0K8*Jh)_Y$ovFd$TSkX|KQ z)~%bQEhk$Z{UMTXVJ5CI<Rj9yfvJ9I zzqO at eXxmw@XCM%)!8C3(dQfgTkKFVe8zeF6Q~~Bh{7Fa&N$@)<{2YCf8M(&B*`||{ zdJx-LWst*BIvFNY&8^s3eK2xltxt1Ij!x$%>{e|r=h}``w&!NUAA at i3iZBE^dsSLu zFRdie(T9mU=;8c?bYPfHaj!pSqQ1=Df2`Jhn9+ouH?XR0IHh6SN+59(7R)TgeTJ%1 zV2>=LpJA^w@``$5!vXikROAZXhyMT)lcrCqxoNzac*3-`y;EPS`FdG9q)8-vk zdwBHNXM)AyFAQhL3*toiqtK!#;>in|_~_v6F+EW29dCSHytPi32;pe+@(gEt4AUU~ z^vpRd_WWFd(CZt&Q#iGQvyp2eq&9PFv-zQ8K6_Vwnl}+ at O))0Dm at ukaUUIzB?o4u9 zbQ6izK&n=rcyf2kYoRgK>SMJQSyOqmfDX<*hZ+MpGA?5K?Vne!D$0>?I!@HdPJb<1 z1wAC=o!;K!++^B^>5f~^V-zJdSR_GWD2wY<7xN04VeG`flLUH8@&f}sOUnLgGa^h@ z&YqorQveOxj%E&JL(}QvahT8l;(0iUpL&CX^chqNQ3dO`bHbOhd__E0K-pfTe52vhG(NzRE9 at oix!4)tU6fZZOALt# zImu+AsKNc6iDX4klnL(v7a*jpov(`+%J$Gb!(~0Qz-V!;oP^jE;6|9_4#3zPcn{0( zcn18yuypOh($di{b8c9ComV&xb~U4an|N5PWuHfdFFZzw$z`9JKZcA&QB9oC|V`5`z8Jw7$*ldK|n!;x2<3x at v>&Nlr5XD4!HN{p&+qGJ!IfB=S z07-&5hyaO#F^T{Qh8%oX5q&%G{>R6V=lIw?g6;|PGS)9FR{8^XmSmmNS<)0vDRGj% zk+Set#t>ss2 at Ar~(yVJc_|P?c7_%0C(y?QRo8#T|M at c$Cfm}<(#|&b)JaZ7}gZLy% zAEt!5B!3^JMBFdF0S<|{gd8K%BI}}S1KOhV4UfC~J-2m;5-?NHuRO>%`Mw8?qno&a z=2S+^2i1_#RdRyufEv$^01W6`#krqHmua*CU#GXLG;a)J4rX|p5tneE_$bgr`E_-P zg7tM#$n^;(Ex&pCG$dQYHt9-B%itTpOP9s4uf4#BKhK?mh7wUg*I|5_G6qq+{<+fR ze=G*)93GQMe;0!@SRf##|H)#YWNK^gW at sa4?_z0YX>90XY5$KvQnH$^GMYFVZ@=F} zU95gto<%s*0Bw7ZLC`Fe5z;K7K1_=u3TkG)u9%zoQo3eA^((k%^ebrBi$Mi(hDLH) zsmh^vv6KC at i9>3wNM+Vlm+y6J={4`>IRE$87i56)%{@nSsGEynJioN(hJfa2&w$Jc5cSlD*q0q1t{(Ef?0Zo`HKAHd3S=ouk{4cFk z#Gft`8>l#azhO#^rm8m*)ffx%eP{o05LhwVz7!F z(^Us}2x*rZc%E8`&9YulD{3B~IDl#Ufs7`SxD?NX_j^?(Bd~dQx;4;uxk+X5q#=7! z1M&QOKidx at PtgiX)jJw!Qix;wl~bP8{Vn50L>6Ms+RF0}ad1RUVyMuzoOk-S-b*4* z6Z(kioN&H<`kJV~{O|r?u*AFpnSA-vIMftjqS}b!q{spg33z)o}cli0Vt%K^bEi@`|dn+Jbj7Mt>Vjpq)%YzeVkc?r0UX zKivXqvSB1?r`$KY1&IR&=(HPk6*zPinwPc9+lE`$A=vs#=EJs-r8MoUX!EY-UEO3P zcNXDq!Prt*0!fpxRS6FSFVusYN7k1kQLJ!eQ1BIq*u3?g_md^Z=^m~rN+osg}Ij~$b)S<>bqQlVKs zp{~wdsQMsOX?OvejJ{clB0(8``GrofnE2;!qDehmf_)Fb{rV=%Pg at Bl+H-^XG@%1f zHgK2u1-GGF%T5Z#@)(OzMS?lXihc>#e%G#id-#+nzl02RmY*o>rVh(9$>{U-am3)J zQGG>T%%|C^VNFxIiJc(TvSiWCoFX$>oiLmk;@cl_Fa4WL($zG% zgmX0 at ITw9p57*alBA;XD_0l|}%`k36lP=A%HHrF*yMOtI^v=;7m`7!jbRH#8J!)V;yA!R{~E9Ke=GFlpY&fLZWSNgIN-NA?PC}Q zgQh4*&KHuU((-)MQ(YdlxxxbXo40WpC5 z|E5m|AS6<~`{5GzgS=l&xcWC_M~a2s7Zx4~YN$Y44I1UM6+ zijOtQF%3$SLpmFXYlt=4MU`o|6UL_x{ia0eJh~09W}ZEJ#GQo zI8()r^=w7OGB2XI0@=2xRD!$J%8v{X#j?H8a7|{Kc7G~*X-iob zHYn2A4VPiiPaJ at b!MI}SW43kws~xf=EevJ<+QIn0Vh84b*g^5X+d&IiRADw)+(;k> zU8chT3c5F>$P1~zcU_51Vg8ETwm0`~Z*(A-U`HIwoCeZ}$0cFY_uftK=<;Iud6**L zM{FdcVq>kjac;f?>ImT_^8)r3i at p>4fzwg!9LKNvsTxkRnl~$I%rQN}!B66h at RxXb zA)|_%J5P=y$Gm%V%i?=NLm**G%Hr^MB6$=+nf`m#gQ=v9&^|Ius?)cPT-awp5v$RD zK7G=Htt&<}eGg_02tVo)IJ3f6kp&4lBmE7CHgQv3$9&zy&cFxZfLLafA^Ji z3ZVC(B_~G*@bC#uYje;$_s$Nm zv-dd%a9j91in#*oy2F#lmKd{+-PjK>`6>e?+?Np3oE40QB5)<~MS4ty0I8ohk^5_` z33nVU1lDj56{@|!h6G87d21#d{#R-NWW+9cVAMcIiXDMS at h9GcYc~>{B>bRhcsXeJ z!vce0d9%jM5S$XXlTfV^4`nqB(6Fw&{oHZ8_$q2)Qn{Q!ub?v@ z|Ka;)XE7wUtRm-gJm{BrME}H4b{vbCNhtlXvFW| zn$U`Z*LYbk)8s0j_|LSGh9z{_vBt~ACJdl`1Wop>dd3^8lb6hY at +`6N$O!5GX;9ey zMNlq-{xB`+OQInErUENTnYOfgD4*eQN;D*IUqa*b3cQfZNeSosv1PZErn;}|gjrxq zoHRMUseyd(&w#$PFVN;mIcuP-$53eVqA@%R%J>33AZ11e!G*ZBE(OwRReH3ESiF*LqB3-w8?R)%rkqpVNLZ}ve) zJUyN-d3Y7?sMPvOCZ6V|woGO;nf(fx>71;yzwmhdCsf+OUts^oQDOf_R3v-eqmtH7 zF=t`@>!`~xMzv49OQ`@|GEnG7uOXz#x-~z>2s5_+H6ByW at 1wxaXjD@}Bp|Pm-XE+C zv}e3Ly*@xr_6x#7&C;EyFBntlLa~VdgO!$>34X)J(}oXLxPWgV+9 at +nkhb5F|3*JiVUTfO-BwGRTWPN7p#|`zin?zktQ4XbLMwk>#Ifv)tb7G1n zyZMFhe+ce+Xt(8kOr20_b3yd?mJAjg>BT{45I^v%-aFln6TU;dOH@&>$1M5a>MP^H z)x$9dd$`a$r|2VD)X6$JFEBiSQBb4&Nq(r-TA3BI^%}YY$9 at UZo#W1Xg7B|V;Y$7j zP=Npg`@4!YOwe0%tf at e?jnQamR; z$3)D}@8buD4+N6QU8Hlx9|*#e6NrMce?Xa$?2!%XzY&7ViHu5N!9Qbww~>4zlMZz2NhSlHTYdQubFV;ZN+UEaNo*sQ=$4skWy?SZ+)S-{>Ei^Q at +E}x!SbXr=Me^! zqS6zKWn<%D;X>^xwu1Hn&u{s&G}o>=UWJoi&h)gF)j)_+6WbO=L$=HGh=HEO9HERJ zj8=$wsoP6(OOe8DEv5u><{~h&G>ly3`wjDZF&gD*HWkIsG6NL}aQ3%#sirBn5Os%4 zi{fc6V?kqk-ZKSs9C-7WpSjX;Ys)n`i5lOAbLd!Gl^kV$tdbQNWy*-#jwU+nsCT}Q zV7d2$;~D*OIyGsrY1Ay|OzSZ+G>+4vu2Dg?t*SE#geYP$O%Ud1$U^)Xq!NwV&Waqe z)rgCGY0)Y{6MNQ>miY2h{}(SSr&px8Lvm%K&bs+RsmD$|9?etZv3utsPo@<6AcDrw zZ$kNY+h-Gres*- at -(8i8vi|DJgL?aEs8;TX=n`efc4OUtHQv+L$k8!? zQID&;iWns#DuT4(H|(LUIJ3|en9 at 07$7xc=jnG*Wl)*Mn;a z5cs^tiHLr(3PJO?w0L;&GiP*#z}^Q#E}P~R2bj>EWS8JAxTNNACj+Lc00dMtd!(|M zhc at 4jvrov8Ruqf=vwh-(wK05s_jaw}Q~doACn?HEiwynG$xOATGkodCTb_h*qIZ6i zJ<6CfTbTI~MjuIAyIhz`aZ3>Uok&-^+*XmfljqvRJvl31&;yZ{3Y6k6(O+}*2$c4o z7YeVg6!`eZ2sZ)Ihu^$l_9CrmYEZ#`c&vCPpI z12nnz<}S-fMJ-9iS4>nh9HigAFU98b#HePxlbW^Xx3`xqgq^R~_fOD2Kh4olZ8zww zDQ|9CL*b2?(;0O2#0DE9(L=v!_tIOl+$sS{ltfwE&qYnJ?jjEdSje2rKvL_MTj zYykqzAJ>hkOd%2)Ir!QQ!64pB8>H_HVhUM|)qNr=%BH2KBkLQChxlnKYUKcwrxFaZ z=nnhIIrXNpSV)b at Pxn2t66^)GTaz~mMKjRmJoPRTbAAo9)p{>*vKR1YK*aQ%2I((Ey>u14 z^OngytPA}+aC at PK<%RA3Ke6{X^dt1OL&rmfoDNw6# zQ9k=%zy1JvU~II{U)3>!Npz?4o=owf!N8dQN9y=f8_HU8XoBdkh4ggs392v~2$zb+ zZS-_1$K=SmFcbk{u*j%rUJDF{JVrc*cS1X+DdHii4-mf<`dOC~lnG9p<1)A$@6yjl zoA&>B2OtX!$CVitBKqd4IRustw>pd}n;Qz39l{BM7Frd1RB68IVqztn6oZMbL3TxH zK9qEmCo@(T4^mrn+}WZ!lly at rqIqXW-rB8n9~6J|kk0GQM~**n+q$y2&j)O*n2pyS z_#A*fMbT5qP9|+Kd4wXYFNNu7R5Ia;L!ulxG)uE&DudyGP)mx!%K+3gzN&|wPQRyxxg)9PB$+$H-S)$mvlxsr_fKy at ggw(X-gT zx3#3M138A$SSZWvt2;w#Cmv*Il>ou(XgItU2aP1?FFYzABZu%hW~ip-StP0s(u+Eb z=Eu8Ep12(Dpsv26_8iwo#SzO704hvKl9K znq*S*AdsjZyWrB!Bg9{&x>cmrzwvHl at sR(|W2gVERR27JsibB3hfpab;y{sixsgd> z6-&YSVN$xQ$dkG9wZ--NIni-W;)N&U at hOXXKJnRdetrT!3CS~8do`tUXq(|3&(^uF z?e_*Is at B18E*5%FIdGfLbNnix8*yC+<1 z!be!@uN`TgF$AOE=_Ija+?<0;GvqZmi0{)=?-=Cnsdj`4FHoz*o$9HWY8(3j_W}~e zX^}{ji`^TTKEte at 0J^4(yKk-piJ4kv`da3H%bmCPuf5uGfz%{E^b+1ZfF)KIh*9AS zzNr6VHc?mY_sakh$x^-OVT|>L*ExJglvyy1$p&)?e?>=cmGm)t&IlS^#8tA{`53C8L2-C1tm*^TMZq-|TR+U0eIA3$DFM)UO-i)%|mkI;k=t$j&X1S}m-*rMnu& z at UUE7k*`kOksy6uPE(>PLuUM%DC at 9Wa$Q-v`8A0*LoU`WGoqE%oV#Txu{NPwTq|Ut zFE&B$3ZZT497CVeQKsNQHVt{(%sTOKsc!ekfSd?V4)@q;=)Un+gDw_<*0CpM0Y$o1 z2*VH9t;7z1Xps-^!>$D9Z){c)WOsFpTUf1wkL~#KND5!Flp-=Jk(dB{a1lBi|3n)4 z*P2M>_oN^U1qLSY|LcwaG38_IKql&BWB5luMA`Pg{QBomosyO<>N|QtQcZ!@;SInF z%MW|ohpVlb>WoS2B2A-112^B6*s-C&mJB zRp4-}3ziz022ZKX>zipK6eMEwb8H&O?>)tsc1(XI;fVE#)~OeE#?#`3FUxE;$GbW{ z#D42AP%o!Cbk}y5v3Vwm+U#LctIgj{z^-jcQQA!d)P!;8#3Ys_qO<>)L6!AyvI;9# zPLOC%Uohtb^tUUG7^~w7vMC3q73G#bgxX=<2vY|t)wCSL(a_4K`~)0D)>NJ-(=EBV zJNW9lu!-y*RU3Anjm}ciogEvYf%T|Xy7#X;_UzSK<28*39AaE!3InDbr{G1>6G^m# z9`RCmH(5cFVvG!*IEs3QlNQ}M at 3YqxMLXV*GzcMHLKqd)It{}hXysYi=UQ;t4%E9c zgS_zNzUvQ;%1aD|lC;sj7#9NH)maPiwx{cOqx9$um7}XR$6w zDa6mq#2&R5P&KE7Az~NQWSM!28$DS1EM(GK{2UZ8am4!HJ&;jtP?vs=Z0WDtY<^nQ zTlrF-rv6_qV*Nv~O49|YD(`|7{~rie$;r;n%G}uDzZdMEi<)vec;$dx*Anr*Myl{6 zOlx6j3uz*RSoCLp9g5{|r?PdJXum%m`TGFTB9lID*9i=}IyYGpl~e1-tvc?lbh555 zUhkhzd<7%e3PnV)__;H?T2u0)D!OgvAWgwsZW^ZSXS)?b zj?3R$#=+&P{jqT({Q$0bNi^EeNRPNS+$#-ZY8k@%Pz}QxXu@~mcw#pN&56?%$jHJ? zYu?UtO-`9|qpH6 at 4mF{8Ko&G9A82e9L^O|PQPrc6V;g6#a2R at C*Laq at 9-z#rJz=3GUxYToxLK+~ipQzU(VxQS19nw z^)MlO$<9CuWfw42`}Yp`>O92 at E!t=D at NDexGrpQy5{-f`)nt>Qqt1 zd8gErFwB1Rf*ldsJU5Ekck2;0B|8;ck2Tv7vQA77~0*h{t)_&@Sy28Nvr#$$PcRv(?jr3}J zI|W&)=U^#}_k7=)`~24cyqVV=F}?=?{f|8NZw5fZ=6$VTZuF0z{^?&YP#BTy`GU at e zW|_;pq-mXFHDzl at -u%Zz<0VDdClTcIZ!Pzk zT>GQ=XUEIe at VlTV(FjtoURR7%A;4VT>W2{mrKFI)HRk}%G^Znilbz{Faqp=Kp!RQ~nVva9}U z3?EzdNp_FjQx!j!bLV;|jZ=kl at EOXSy{jO22dTt?~Rd9)Xu at ct;RmV2SWxVATI! zJpO)VwvNlP2y#bl#-K9-H9bP_ZeEUg4VtFHu$tlLjnsU0dt5U`;pf6ZEj7VJPa|r1 zg6Hs!K!*dai}C0!J2eM9jZZZj8;<4JW8-Tn9jt9-0&h>JE at 1N)GAKpW8X_oKz?FV{ zj0zHm1?5X)l~&0EY3>G*6Epg4<3lkqiHUd;}wPsI;CchaV+KLdfUfFVjY9K$5!*S zwIDyMf+dCTmfSiydO6lhTbb+Ylu at 0wQx1ivSgpUNbd)-yBe>2(hh`ZX5Q?g9 at rq1g zBQ4fz*oC2|NOCOTK2b7fB1YL&=7SfXThHHdHz0i2rPD;$uB=D85!R^#wH2M75W at 77 zsT9e;g&Fz<(R8ZHFR*(wo;@-c?$h>GpeAcKlR$dMgQcTea9ggk(jPT$wpCX1RahhP z>5r(`JhBkv8T~+$BhP|$+ruwgo}$k(H%>|L9B#)+useJs*Ygrte0=UaP4VgqVhyGU z#%(-x6}+$Z)BI5DeUiQUx at NgpkMuC!(woKuxK{3A>Xj#VK^QR*5IMATvr^Fx;>2ST;NWu0dYl4+3zm7b80GH-0sXCl*jt`2K+BP58JR8-PGG)O(9xQY|6LO=# znHdV~FnV6BYm6;MuDN at HKv=Z=*J9DbgS-yYv)2^6M%g6#$>7^Dg{Fi(qO+_64?hHV zi}BzD;bYpq7!nU0 at 8aWJwldYeYL@V0isYyL50vJ!)q|$gpr4km84l*%iqH;WCo)DC z6xLi(?SV}t#&+MHSk`i6ppRxqo?EJ0 at 8DT}kUT5Vsq?@%6N7M|;+BBrklRq&xrwl- zoOd+Q9SqSOYck at 6el)w(nyQaqaku!wXqzR8QdXNlL-KoHiS94B_FhBCO(BQqgZQ_1 zu8a=6q8Mc&5(W(CIX}tmKoq*-6Dr2pf5s*ke}>v4tcA2lPw*Fqg?oS at l#BnO$)5wr z5kSbcl@{J72N5H_SbcEEZ@{|YJ~BK=(-tna-l+THO at Q3`r9#jx+%Yx!0!nu;oX#!u zMq#wE`uw(-ZBl#%5>luO=(bWWYob>&jU0Ew+GsS?IU*--^9$ zP*Q*yTaCms_sr*O-Tm$BQ~WQO`@}fJve?6+=oBfdw5Hf_rwaRlIkCG02 at SEew{&>8 z{ApGJ-#Lu=T}>R{*gP>DPT$S=7ah+EO$_;!wH$-y*u1koUXMx}>n9V8vB;DGmfYjv z197{W?^8ds&;~M2V>&_?$%NKQ)LGb`l#Wpuv?W_~ujoyiUDwQtR2}l0hD*)qo;7hx zDfF)vpMXK-NWohEbwBs}67o3oe!i5{QBJie%Zl(Uy!KI-S`3 zr!oH;iMZC{N*G8mux*(C=M}mCT_nt{?W~Od?|5XyOF1qpqYu2zJJXG*#`b?}{LW!6 zteKv#%!aO*s%R&j%FT&%gpA6B1nk@{CY8e082|ZEuS-oIiuF4H6omBiVyz4D)6Wm; zKmG7~xMIKKi%S%L+Q(ZRIA6K`A@;O05zP;62U}%o{{aY9r$HvKY>!9IF;Sah=;%Mj zo0is|KWZY_<#*w at sG;ud+rEwb`ou(-g zU)c6Ju_CR~u#r!WyVK^uW`^a~V1uS|CK*LOO|=Zen#ZI~v}1`w1{-PD&Fl<8$>urn zSj4}h^BC7T&_uPOFyE!cFh%G3&@$2RaULo*@RI$T@=(Q0>1){TV1cuvl6zTyp$zF` zm?h3#>ZZnT0))cf^kqOtm9iG=ky6`-O^tlY>;!xl#m?&A(agC_MA&S-A zlQdBG%a$}|6pdIDvfyInkG_DB`wv9q{-<5pKNqHGhE!J at O^0z+CqF)4V79nG1=*lv ziO}=#sE*{$QE?+S;D@^;v5A^~WXIL$bg!a10wW=jgE#U9j39 zM_|mOU~+d2#nBavy#7(T$wFZ29J$DDGM}tt_{RsRDp>87dELTu4ys9x^q|gmH?7oJ zMWwelio>sZv&X<9e#V#TrjnHB?WkuDzfN-;ISx)$c=)a!8PJ(HwteEO3nkIPM51UW zMp2e=CJ^a&$zWF0Z at V3_4_P^0pgbe7!&7TA>JNLAcSICtL^U^a&`Rsy-#C8aAti}oMN!y)`|=?g59Wjm>jD4q90^=EfB-xRCfP^> zHhB$bli_J%B+$gDehDG*N(z0Ugvmo#cbz|2;LGPkr1dCwH_`hVxbTCZ+ncWQ!d$bb zw5(S-Gp!ZE+P}&SvxCm+U^+)hCsr2|c(hUJm?3F;HqVxSJ5Au}gwAA~}BAtzxUT%W%}dd@>9l`3_o z&yVkU%8Vj#VFz8=;)Wtr$>`Y9 at EGJVeYJy7ro3pGq@P@%T z@&Vm}bT6lRLWoqEu75IuoI@*0um?_S&45rxL^c4Whas8yL^RXdo1z<4Kip0P9kSQ7 zURzhq6mPL+#-z(mS<08q2CFn-&Ujf>!Xd#~5-OK8HHV8DydgBR+*f=_TOR5pa~8m^ zG&oi^SI%2CBkMV>Y{W;ag`?$>hGMEw2ZfiVJgV(5#FhkNmzYU6C&SRtP>svGZZsSU zi!&+H2d^lg!hK8vT*j+G#Z5OJ4J_qgq6379^*;=EV9c6+eV$>7SXf!C>MIs7~8lZ$Bj^qW!hC-Ov>fNVk9gFfEj)hgW<}Mv+b8*(m zft at RJ1OtzPoqQj*TJ-qSBx<#Gx2%>qiBi()v~hUk zfCZ?+dJxt~#8ZFk9zx*UR6-^4jr6{UH1Rf+`nEI4Z5l-qfNx)Ct$Oq!id=|mYqxJC ztO-)6EY6x_xC1%U?R6GmKeQAQVpJ-=z!ADc*`@?uS^)G0*m7DO!cef7yC=@BJ!;H5S^K at sH8@+ME+G^xRNr}vxLHcDi;0}= z$0X8Pcq`ODNiGDxD6;^Y_5f|)C(=GCuw|G=5 at Ug*Sfb9=5N|aG at HEqIWd=;xf9=M6 zQ0!Gh?d*quT_+;dhglDMknO&I5bWm4CkK&UE2`}3!E-8|4c=LL4=1cAU66Vkobkmo z^`R419Fe0|n|g#m;Vm%te}FFYJ45sslv8nQ*qQE9a}lMH8cyH~Y892^LvfU7OmaIt zr=>oO6&_A?b!*Cbnr=_}W>LK3ywMkubgp=>op>72dUnz1=I>tIg-IVeNieB=#XZ?0 z4eo3-R!zCEjK5 at T+l+7OIpy=|W0~cX{!_Hd{rKc_QSxKtArQO>ZJFTb+vV at MxK;BO zy|NR1m?hRWs}##MskYB3?vrtmc!h)^^hBBm`=)3l<(}qFzN&d_aBOq8{NFBcWi0H! zcPezcp#~q&wtP6~)yIjBKLJgN%Rq}A68O&?ezc~Kyq%DDe1WydvK7YL3CXC82p%*U zuuIRHC;djy&8bN8Ygg*_Nzse!m)teX=}9-(n1!9+oqRKcMGcjz&BagN!s9l1SgWEAnJia*f-eswx at kh;-p)^e{hNGh$Wi97*z- zPa-69n;)5}{~Vw{F(MgZO2fi0R5u(Ey%Aw67@q~})Orzgk+abux9V-kzb;MsI^*! zDh&r?8&i=UFL2+i%)=%UGHW^)69E*bPq1^myRf#D&Db{8o ziy at YT_EbiPzHbt6?9y&6C5wG_bmNn1du{2N*SuvoDh&Qs4ndaWHcKq1I~T8`#Kudz z!q`=Vdk-9+u%bvRQRnrxZ9KK=`qLUub!?*dt(Q1HGgXKHtrKuygAQe>SV4}00s5~v zC)7`0kWmKQN{}t0<+SI+L_)04q6i3e_V1FR9oRDPjLc at HA40=P;#CIummAr?cIFdFURCASD-{k9*-`y{yDd5h- z=_kvP;aXzL9WPzz(*jk*P{41M at vnUI19wM^#k+a3OWHw}KpMhYB#(v1B9ZBuZbcfA z?d$yUSE>>uDkow;9fck`qvj%|fvgH%D1Pfu9 at et!3ER zrPQ`%*Q#$0mgM~eHEU$+xNX^g$qU7O}m|eQ!?J-Z^f*qrC zz;*;Uq#twHaIu6qEQbpRV~h-)4>rqj%r~)gRpZ{FH$&pyZfW7NYpOJw4$)^i6kF-) zS%fNfI^>A>>F1*i1Na$2n4~kl at l~vS66tl$6c1S1rvH3Hr(j??OVWVbdHrNJQ-r&L zyR02;Ly>z8=^bRDR$)UiG>P*WB;^?9mV3$C$nU`tDuTc4Nh+fd`iKNNv`?%omi(N& zhh1UDO=}wleX3s4BE0FIEm86F7ma`>-|-N$YLR070%245Bl=f%>3h85 at AznIMjADW zg*w>~+psRR&fH)E1cT~E$(M>oJll9arv8+X;B@*LL{&_qZoXcJcl2`e{^zgP`61Ob z+xlS9OruOolPP`3=0CFpxfFvtnn-&@db|#-Wvr=_gqrNPQHl|-IwBXzF-ujDKk&cLI(-AaUU2{ ze(KMe9PoW$pIMJ~+;XO{Mvb*p2qNvUB0OO|l;M<{_!L6>8-Gb02_^%12?fN=Jt?DW z at FI3~9RqNZoTdcfWgn{Sz^96d-4UOXxPpCkTcJM9GoFa_33y!tW-$;ePYNFhR^c)S zlpW-W3$+CuGt3~{WM`=(efKsy?9%IdGwBl$scTyC?7qS4woAFjdW5q*q}}N-eDp3J zR-<91(HDWS?)@bSD>xeFuABWvq9TgYi;4a;i6cfC*($DUpXues zL1s7t_h}^};h(nAdhLRFSpJs`vi_aH|7e%KGuWsa0+a_=$eB}Q82JTHAEK?CZ-K73 zy*-V%+-Iz|Ods^N=`R=bS(ll)OMDCIg7U%ePXx8l(m)d_tfrmU87Xy+cLP);Wa z5 at 6oNEd9TmLqfq)nWznEzzEME?J)0+q(?$n>&XBkb|%=|c|$VRT1qlw)4xyXGi7flA&eO|Iy*!DAbZ=v9l at 8QPHWph?3owSjQr+;?OW z3wTu#ZelC?PKqOdMmtj!C;qE?Y)%P%H~H;L5<#Rg5ZIanSf7L|th=eyn+(MW=RvK2 zYOUOD(cBa(E8^p#usA`dM=W0o)J_#(lfEaQio-{FXRvm_q;Qx zYPdEMqhEf;ebZRzPW#SaR`D;4_Ss8y?VG61IzH^Brn0S0Dm#1pTUE$H(QMTTB^4Wy zw=?_JMBHWqAnMZ_%ueIdYu#6cqx`U#92O=#?qAhOaml!WLWB at o^U`l%cN z=#&@)^VNKX7(d&1J<=!Qbqbh8M-o3pdLSB&%j{QnQ1B;$FgDrI>i2QpMu(!!Cq8v2 zggJ{^Hv9_ih(xMeyh5GbT2F9pZz7#-7>|1o!_y z5cn~YTjDweJ!?u4#u&El at 6#tH34(z`^ef-}b`1kv9R~?o`&|l{g z>46IP^AhmP-(K~?wkJ7dsR1z(+Z3{C{k_O73_-MgtDHxJ(;I{M&HE^>A8pK8gt1td zI`&XplVv9)qbO~7iBwV->&jj_uZtX2pZ0%c`9M%@@?gN0%S~42WfJ6I*tC$3IyZd<#1y1+Wrpcumi0g+g_pVj?XNxx?cL{U%*fftztk*3X z^)f|DWTm^Ho5v6nme=jV#kzpIZ?HqmZQ3U~@^Z`x^aEF_*p*Q=o$TvmjV^i$qi8|D z?4_&LNo6kE7sPKL_$f!M*U*Uv7YfV(YljX4ae}b2reyC(fBq at zf+Mg z46;>`{P7z~v*61*?<1P{;AkUK6~w4j-V&SC7-%e`+!}Gn3mpu#Y}syqHHBD<7i?Pl z;art)W?p&K*?RmUeEOtfbYWw&J3zh4isW{Q7qvi}aa`z>gsTmRnG8k!Yg?bAyMf$y5K-fY5YN z6LjAz!BvzKO3Bh`tRA8#(t}X%$p=Ce-Po1HsoYo%$u~x*i;-|)GlHUKPn8N1dZ^T+ z0@?)IrGG}s)=s9;7q7RTCw>4VJO#3tG(Wy+Vx47H*}r)dM)O>W%@o>d7gcQoyc`M| zG%n%5W9uMNFjz7$$bm4}Xs(2W@;o|uzhq*!6r+)!@h_9Ud;6O;9J5jM5jev7^bElM z*6H=^-(f=y6!`8L8bH)53PU)p4X-!2N$Qgo7SnI}`c*L9#v#9&$>qaipUESVz;#e;d&S+v;5OWQzzbi_Mn&1uLCc at c-Evpw2He2r2K)z!BQ7mlCUEp0BG zEL;LgicE at 3;C at x@Bm1JnBm2KM>iLmX%Wa&QyXHw4)_ zxc$9`toZx$K#6M#i1O&@;9rp&pmvJ0DRhOIU?hZr!V+i#3SULUO95`#-w_Z(AN4EGOmm4%hPO1SPl z&vAXGf`{TrXjQC;*y7m$WoQRLp2t=NOdu%GS??h|)KLVt`*8T~S67T(f>H?Dnn!V5 z#}~k^f^CeR`cW{8 at K%PIXrMq(2He-(TN()3?=*ciVH%gLD-<4WOP+5{b(UW8W9R3b z&&H;FxzaTLGXhBr5jnAHG1}}xxtFv*u1~C9cO9*cUsi(0&B++;P`EcSn~`-w$4}Yw zuPky;e(}*fSrS~O%9D697-u(MeUM-@*DP|kx{jJ!vwrZNCHE6g@)JD>v!0lbZgf0w zKo?1*KYS9*(7l(+DecM$L{~*9XQmsVPK1NdF#plCS*ZhgolHD`k84`}9Fa3L-KG<= zzUvC`ST@{%6 at G0$#47s5MVXr8_;zPRW%N2DoeQzQEx)WT82gHr%l_pDIsj*x!aRB~ zlgONbZoC?;x at yT#{8^;#1$R1MD at OLU2kRG>VY8%y!f#5UNV|%2EY~_Vo&;XOE%;M3 z9jqc8!;0Pcu4<-l5|NghIF**Vp9<}SuWOhhv9~y+o=zK$KYZqSZCZMrxnU3GNxj88 zi^Y at 3Z760-9prnt0qKNwTq?6eQfZk1v(`*zX6cJ*kihmy#qUpv~!*U<>d zU$y{^=#dkTn^kP6S?gl)TB*0H?MLjliL3w_b=ZKeESkb7TEG)Y)ogQ!lQheT?gop$rT};Ufsx~j={X_bw{D1enWzB7?fVw6DU9K z!)nbV))9&1InUL5<3ywKl at 0s6MU+RPB0 zYZ7{EwJ8y&L?LUq(915(8qw5o$*OLBG-*G>JytZ~!W~e7GSA#2|9deeg~DUIkyqXE zN1_oG!ds4i7 at qS;MGm=#ZfWNOgpAx;@HC`}djta|_s)!j0E7-GZV=T8aS4Y~z&)VC zuY;l$g6B{G!fn+RDb7r3I==zlBR-PgCMI##Ckp>2wwDLA!U(vrEIaTlXt!E;D7KO= zA0p?F#``H~JTD at E7^5bE-;WYF&>X67Byz{&RCkJsS)69)WK~C3l(#j+wasCqmk{Q21mDRB#YqS3-5R6^ zqbQ7NaPF0elcG at _dY03Po0-gGmk58-;6CbOq)G&8Rdz8er&M0y)m()`LQYbqIfMtZ z=qJEQp1n^$(INAb_jjWKyT>4KtxYy>u)nfdI>^uW2b&fDOEy{m&gQb*j6BvGez9c= zh61`s--t*cGd0ZGfe1Rgh6tOGi6`A{Ge(=zwA0br%b#fWs-bQB%US$3j9BN2VCn5e zw6$)$zCCt%%s6*`dR;zl0_(RUN5D^vs$pAVVj!fL7T=7Bs^cDK&cDjM$fXX->{=w> zk1>3VqSCllI0%i^!J=U?W9{-9uXdb6^Q=_W*xB@}J3uqNx7y(Lo`U6jT+y>oSS(|C zhZCl&2YbClmCL^0bT!)`!7qEqF?>*xh;H6~WJS@$gpA8hMnwOmbz4+Woe-<(9Zo{p z!YFva6ECAma|lS91+=#LcQ~)R$QW=aP6}7oG_|*Ej4)%1Z9x`D)`G!z3OZ0--z}k7 zgr9|VlfJD7yu;~SY7DJPqdpiJy*wEcDvg!Dq9c6{==?Emug7~l_dt?e5{^o z1se4r-xO(hhjVN_d8Per>mAODS>cn&IeK)V^3Fg%vn8`VSs4-CK+KL(F~J|F0kVN& zyzO)%$Xqd)Fh}_i7G-jDlqQ;v?CVJyu{93QsAe+J&Du|ZEG{!V{wP0GUIh)gCvTexW))+^;f at O=JgncEz z!xXn;GnzPHu{R$J2<#F7Nyqfaa$%)9?vq=D2~1w at coIoy7m6K@hy=GU9hzqQ^OH`C zWCS%14*zIuhvPXqDJPSUTH%dalQ) z{~@nCXYHxXL7}>9fJ@YhZ=CqekvPFKeo= zlTH6Ts>Wqtp^aIDa~VB>yflL(t?;2-e?rJ|kT7(YwZ at Yo@#}gY)1^ZgcOZ%;dqPtN zjT&|9VJb&8Zk|!sPXf*RLO?7*!TqziGx~lNPBn(?_CF0n_OI4mTD-Hl at xNq~?H_C^ z&8oh$8Io2lid;@~j4!XR0Sog>vT+cYzKAk~Vv at lhyKAD-s`*C-mljK_h2T~se#|j at tbN7y3^A= zQv#!wubjjN)VR-BjKVT6wxEK#E*p}@o1%7kat*9|b0}$?&2vYyD1O(_YNeNxp^||DRpqV<4Ay}xA!_e?Ig_J{eJK#4B z(;J%rV-3ql5OI<4J|lMbFQkv@!MtV|9A&3;cG0pk7~lhg){1^ZA+^}Gpz68uW%dI{ z0#-krZdW9&M4l?*-1^I&h8iBo<0+s)3g at 5=0#>VBg(+T}ARsAEnI||cToHM4JDNUEsi#WQ%g*ff`FgeYm z=`bB;yt{^HFLkbrM4UI{Q$i#-;60_j5l|k8p$g<2r*-$~TVt-;CM0>`X2nOg6lxpv z^l|}c+bA43<#frNz%elh(30#@s&$B;B*PsM)zBVe5`U9N#LgxQc_GZ3^A_YhGOfsy zR**hXb#)Rez>*|o(XFfma#ZcY_befCPT{fiEb-rf$3i`0 at SS{4H~C>0 at -p>FlmV7B zDIi8TlgNeIBDUB@(otY>5uTKhp60PE^tTy_Ke;SB8))QqPey{dA{+HDr``@d*0Ox&*w88&m3_XPhq`2o!_qlV`0jL(bw#eh7 at kb1QPDC9pLO?3u#Dc zuF(jSBna%-HrqIAOv7hd4#mc#F|a_+XLxlnB{$_SRI1zsw2jF1oI`?gu>^Ni{Wu^08S$NN>Sbd)J2jXA$t-1^p>HkZ*XUp7$7AxI9>33DyTAX z+`9Fd!zH-7PT>D=_KxwLwM*V_cWm3XZQFJ_wrzEie{7>;+qP|69ox?7d!E^I_P)>a znX_kJuJv}+?_2e&byZzhY8Z89x-pygTt?3+#|z!8m;m!O?OeSDktkzi8v|X395>%$ z-xMXkk)qJlO5cA3igtp%WK|%rZ%tq%R=lOG?bAAw?UN^w# zp)oH!s{;%r-UAN772a=d1q1;fc8_dZWB|j48rI8!_ysW>mT)0PlcABAo{h6v#cD73aVrUHG4E z^wvZf0S&sBY(bTi6;zI%vO at -5zuFxTnu_VUV3JYzEsG#MnVUsBDUGf3#u%KHH_&op zt7d>;x+e-8W*K*#MZIjEqV0{$h@(8KmCYUzxKP9!;D6?Bz#9X4+w&@s{JwFMcJ=0i z0k0D%g}?ok;dHjDT#qO=-sncM(f$jH(s@{h5bsKaMMRCEhe&)~Q zNv_Sa_RScEF}>3mGyzC$CuH|tDu-NVY%MFj{wx+=$#6urf>})2OtTnMcUYL at da;xQ zAY#3Qonh0?5^ag3tSf9Zc|DavpE7^Z-vH?N!woc|GP1I+m3}p{Gf0fQIj8H;XBWfc zL7!q4=%I1Ga=rMMcwnR(B^}Du at YZaH;t6DZGAm>=`0Z27dWa@`B8W9aDSFFjNqv#W za|>DR(!+T3KXHSNlMhGnVsu-|)1SZRU(o!qd9F|#00*0Pe|h^%9_mvNIZGK(nH}Xm zxA0?S+$qLPxdU?UTjW%tQj4f}7{2_6l7NqpU8l}D!2(&(XEP*Kg7CuD+f`m1O%|!& z4*T%NL+uRkly>Kkb?1~&=bGq`hCe$~_386OIKWw0#TRm>uFQXSg5(qXam8gz9TX$I zperVZxv421>Campuc113GO0*Yqw{^%I$f2m{kf9QDA_Aecq*1NM;?Q=1LC=mpc2<%~?32PCY0cK()5D6PdnD!k1 zkBlpqX?=lz{5;!gQW7PJZK+%kKkirIWoC at 1%&CL(qh57-oOpRTe4qUMxEf#nMx`;{ zHzW$30#F@a*>U;3upR4a$wN_rtfXb7zg=B0fv zH#F!z2u=UlhAk?h3bOgA!Oay9lHPTBzT}D9G-HAe=38T%&-i9lt2ES~D)n+l!_ykZ?!{$v-&KU+ zvvf;q!|!vA+g&>FuRhNbFp5x~um8_u&f|s6rpS+?k{8LlqkmJN01h@?yaMf&ddT{}mE zdGZ+YA+#}>C&N(^d!XkEhG6f=lRiD!N(AI1kyOz9%mR<1Fjtomn*WK#nJ}2c$-zVwf7^?fw0uth>w^JVmG827SYm}aRf4xrl?4e;(YcKGfEX&X1V>sBiP)Z1 at Tyq2wme?;s;=w5TO zYA_<{<8 zd;O%Su|Gr%|L(L$PjEk~|87Pw3EeAMMSwXzZpV(C at nV7uzN;l|mLc3A;-dtEig at k> z!(+Ug$zF^@@j&x=&0xm&M{h-y*BNf=7$D zhU97zSl{>mTFs|-xt(j9Wo0i{p8d87NQkFwMyBK4TXt z*wOv{*A_cs;%}F&2 at 9Ow;j$JVKj0!t4r+oga4wB93_K13{d;j7;Bfi-tCJ2M%X4qZXh^VlVs-m92KqXe?Gf>Ut^-T{yJ4VtEKeK<=CEj!)O=}U%uNu=(D3n%|Jl2w* z$G?V}nqNnWLRYd7szw-(2+|e2_<`kyI(?u0uj;(tXV)_tYy^&E3Si z?M%^><_+uH3D-WDz)|@1a;jWR>N`vgkX#fgMxDO#P^=8^jogkc&EmT z77}Sii^(c3w^fW;WWkA#rot*;ON>ouq+7^Zj8=~4xOf7-(Ax%KO zgUPqOA);$a%PQ~AhJ--43?jkH`g&@uZ at AxzDjhikaPtABF(&9{5BCLZ86;sOI5E?V zFpbf4=F(aWrD$Bx34t+ z-p{CJAWa`D+JA*4rnD6Yodn)!4aYE5iM)e;PYuUzq1+vY>7 at lzVhq!cu4dSyl5?`- z at 0CU6ADmX1Fj5?xzJW&V9*Cgw4c04nhmBsMygPY|tF;s}2ZJ!ErKK$v5mtGN8w|W(S0*;<%Z(cZY{k_Y+frweCL7 zp-#@!2EUOAd%YA3c at WrjtFR?07dEU9B~T`eon$RFaX&G&A%B?B!*mY5MYwYU*t~uv z!eRJH&jjj=kXIlv!ds?!+$inXaagWve-zZ3cjL>&u_#kLG-mCs&&w(CB`l>xs<1Iz zCvVJnX>aPf139y#v3zT)ci>8&V-Z3L*%q~pKx8<1HJhkRJjQc%V!1I^fg)nF=N4sE zp6h5PS==)dj|$Wn!9i#Q?IBHv+k&0!1$(~v*7>s;_IytpR-j=!cNm9jXQoCthMQ$? zMo_L6S(rnRd`j|jWGHX}kIphX?@>b0D{-x%6KJvhrAw9xG>IcHM8fE&)?4T;KPmXM zs=HmUTN?inVxb-AmCw>+ at V>(B>^OSd9)XtBh!NMbiGHFepvA_ z%rRGlQ}ivLI8;xrb~!4ceNGTjS^Y#R?H6G6p%J;}y`0BH-q44kcR6u6q~;2p1rj01 zlGXxbO5RdFHD4HX5U*+ll!DPWkm)X4+Ur}h9=K4tm(}^H49u8 zPISQ1`lX_1(m0$BF^ETle~h^yN$Zl7;F+P|8PUU<#5SNgVpZQA{G*#W&`t5qq0emJ zdoC^ha4Pz2Wyl_Py_3KdoUjXENmpq=P_>T*qz*N5M#1Y&mg`xhaFiw%NDd&IjvN^f zThbXR(A+WmnSq{00}YQ?d}Ww>WoY2N-HCbnWF6g>oZls$;~OQQJ6!nWxZo1xd2~^N zPr6Va#3fhaBE;*4uBaZE{PmXU!YxPW9sGNmP4DxOD;A1_q$B%ugf0wzM(Q5oGVmFJ zGvUU73U)VhvHwS;pLTzhhJLdf>VwC*X8)GPPGgs92VD$+m1PL%?Y-RH2T#_ at JR0<} zTtieEuhPmq0(7lV)%jqy74T8p^W6irmj|vYmm2N3imX%Ebv4Rki7S;^ zO?iX4oj$u4Chd9kv4Nj>>Ibk9UOJLIESkAO_JcE8_%88tNe;d+{w%0H4J8Q1WCXwRN8W^5~O(W-2kMt^CLsiD~1R z6;lN=d2LMI>s`*kH9S|ve57OVL_2NDg$&4Prh+~CQt-IPJ`UM^5aG7RlCGUSh<-UL z_qsGabwGV=#q$2O7C5&o)-czNPh1vE39ZsG7qveOA1HcJSuHkNts5FG+whDRZDl`~ z#QqUKv_-4hrxBDnD<28`sLCWhjQrGYFr~kT3hOP?n~*AX`+Mlcuc at 1F7%~FBW29IliN~y>)sWXc zw(o`25~leR$!OZhp~b3{-5ffe+x2)w4t`5KS5Rk@&9*&)EgDqD36Sc zOy at X?J^dMr4{(!l(iY&VyhNsRemU`Sn0aN^mG<#+bWQCKbm>MMWdRHd%nW9V$pkGF zt{+GEE1QDRnZ`pqGq;(7M6deN*6}N>@dRm3 at 7{WxRJ4-NT|}O{MG>bx8xJ8IYxZjOM7kt zBXrDc$K6C=+$}2MiXNVDl_fJP@)#<<0_@?+SL*_GWKj~@cd8~nOuXkN_bWyX+b{x zh7*^4-fa)u0H2NYWe?K##;T>F&!is&O;%^`1R!8{lX<67qhschejAj2sK}cqg)5!A zsy-Rj5bAnPaa)O6vLkg3y46Cc8vBB)>r4zO!sJXaMv}HHfG)9WnBcD|GR)$eM{M4- zK#PK7Z~=Dq57 at Tj+y!&fnUMl|<&gvQ8hI88LTNh_vD3;QndS5X>{9}|ue`^wqi#Zu z;Xc;-UEF;#q7!_XHpWHU>aARh$N z{K>I|L0JrFpx5)O_{r at w%^v z8F(6#N*EEQ1v}j6M)X-|t*?i!Uy5s3;Z%b19XN%W6s2Ffezv|dj`hAHmzstvn#W>w zgAZA4y1vy50k?UcN)|APY)0XM at JjMxiWjBUy?zd#ZZlU#;o}TYKg2O&1%tWZ#7fX4 z`W_g`gOu{!BL$@+Dd3B>Uh|~M)HHC;M;%6sAI at Yaa-c_Xs+9V%@E!<{BdY*>B&;YDRxP>|;j{je)*9e4JqB!N+J2_R zi}fajGWn;W&5%UZ6YDLWNStz6oU;+e7fKYuT2 at xpUl%5<@b%s2Fv!FKT$3-e=;+bt zR5m4T>5 at q$XZ2Sgh8<3lh5D?kymE4$WtLj5v at U+(iuI{#p)D;yO}IEo#HLxU16+w7IfeTM$mXj9wk*P;RW z_DvH0zu))$PthjlVr~6Tf!3%#?erhx1g^B}E^}mzw&}@wg#HPD7SaaLb3nn6%`Xh{ zQr%|43qeF}anWS1c-&+Aot^+-aJbB8{9~8~=EQ)2lQjPD-O372nwOOGG%n_~&8J77 zx6Z3d*CfBMw>$iA==SvC2vUsJM&f;mK^cq#3TQD>AU7DCc43&Rkj)6?t;s$Y4gV8duaVqij1cx=>`idSw*&+GxOmUIJeHT3dXeLZO|9j zFo6vUn-p7PDVTF_`9pvh<4Q`k&R8uRPL4$8t{oWi at UkiC$=C1f)VBd*Xrp4AUDNig zs@??nqZYDDRws`ADi2zw4ht?tHeRZ1s^70F5a)h#p?A at Fk5QGMS{g+Wt{T1c87Adn zhftZ|(w4L8+Oo(BK@|lVl?`F5_I{FePs>(O>-6FE7pxE2GybNAb;D3x$0w&-j~jgK z1+HRY+Dv8@%C74;$D}J9BA_Zr<+&xOj81Zx)9n<8*Hf{-B875ri!AW at 32i~LMoRkW z5-4IB!fjVS9kmO0*Uh-$(Di^2WH+*u+c^n+514U}K;8tQT}SO at 5d4G{-Az_iJgZDG zN~lO)$C9#X`a$M3U at q2&Sd`Ozc){k8paWT6yt=(~FJV$$vcC7W7ON}uw&rGZdTzHJ z1xk0DMe5-u<6D3wJD&f$VsRPO<9OwyiqL<(XlQ8 zUw&JFkpV|s|D$09or9BHr68t69bu5gbR;8ZmZxzK-3#cE8)zEwJxMIm^t-_>wC(IW zi5%x0J(0dRPPU-=2|SKhbSwl!3y^6kzMX8p#l)(wQdSn^8#SGTpMQh%hVB4c at i*m#HiXCFRy{~67%QO zb%k0du_O4LhgCd8b_9)IM15~Bo6w%7e+zvfP?3o1IrO9e;=OHZ0{PEB=}{ze2`Y zf8&e6`P}BU;MH)zJyie62aD+m(Mkh6%XixHF7MI4he5vw(4i25mQ$i5TZPbDqS at xHz z^pxqZ53)#*izj*~o^rq08;k(&WXO+>Mu+$O>j9nq6FEAAMJ=A~T8XEi-R|k)>cY+~ zVR^cHy93-`F%@2bc;jA}=^JdD%!|Pgd_9P_gCbHR$ai^;c)}go(X&K>vpR~|Bqc)W zB$n*S{6Zs5v}bRCx`>YrR_7X^1nF4HR8 at 8t^n%Vu1eFTXS#2&67pNChGEa(Xx}0jz zr`AM}PQq+&Gp$JS|DOkOrHnGfO8rP at GNU(D7V)b{}W^Rtal}&+;TdpN2DdX;Xb+9dNp?F zbZ>Y;M_eq7tFAiejOKl%3$?A15dRH@$+g0A2c!LfL(x;}uA|MMLmT?JY}Yf)P>2v@ z>!A7BJS)XZ)BikJLGMA>FjeqZW0LLy>80f`wF-)g&EhIJ{0aOt>Y>3qJX{NvK(*wP5XZHlM4l zCC_4*9t&tgT_h?w13`s$d`b!&CLeRFbg9l&TdCGvg?xJdc~0fwz}RvHX|YIHm9K^@ z1tnlA%wylRL^@XlB?-uspDHekFKx z+6cS?+j-#oguo@$6=R%BC3&+oDGs9e|Jv|;iTo}n}kZ-*VmTKE`9?3nV2`MV?s&niawY4+uL z=24x8E4p&NL7fNuF9T1*2_E0J14OgKo3okuea6PKScU^wbHUXJS9%%Y`jkMqL_+)! za=CsB{HMQ(SbtPs1o*GDv>^YsIs3;QaS7wL^8zS69%N{Z0FCQ!Ja92l at CiZCWJ!4&Qw0`M;jGul6agv at i>!qb}yge zPL8o?BF(!%+TN*xKh$B|!yYKj!LRxX{%QJS_;QEhw3lw01*BXIkb z;V at p`C{;JH#gu8m&ors384t3NzJXRy^^ILr9RMW%CiPg==o@~{TGS+&NbYC3$r zRg3K~c8i5-GtGCUc{^iXs*k^|;kUPO#`pdcMxTFbQI>yuvenMk?4Of>`nn^sI0A3E zt}YGqHe<9b5)f1Jfq#pzbv^+$_Xtv5Z7 at twN+ZSrsD*kX`moAvY>KzoCjq>qs!l26g6^-E5BYEEH$34Kcw&kJO9+6PN&c8;vk*Vm zehN{3E{H$l!OF;nCW)p2_IKg!Ycb5TWA zCnEiI@)E8#zR8e|Cx)_KfDSTiDX6G5oW9A>kG`=EIgMS6)m2@$<|j at 72hTBeSe>S8 zxj4EGPS4V!p^P;wzhn&gfp475t3&gaL&k&W^t$w(aC94$7AcvT3 at Sj(G*yhdm@@H} zm!(r?gcm72JF$I;Tdb-UMW|H{5${-(F)>fu4XO~WUi<(-mV9H&%=1~53dR%*gDc>U zm#~dry0$DFDEdVfZ1~r}V^1G$P*@uHBeak@>2fCeh1o$y(!0`; zDz)3J376_u`D=cAdZGFXK&d{X#L6KJAGu$X2X9z?>RI2vBB>G~fY1W}?+x z!%Z12)?mTPvad!|g3Vua)%mIzz|ujqZ0H%GFf8Gf`j`8JoK6>Yic#=)q;ze^x8)Wp z#qHvJbcO!>fhI8k7bkKH at j(WupLjTcK5CT7q|P7Zm8s~)Ctgm_#}5dVmw1hHMv8JO zZAMV)CbWlPY;=dAba}++T_`jP^363t%${>YBNS-+COOAQGss9bx!>T7SU(3O2&^Ql z{tScuP1{oF00|tuh7?X-B=f+Dh3#p&{Z0JW2QrARvw+?JP*i_jr=&pNC)r7hKdx}H z=>|pWE9%@d-5P?rR0La{hErf5&E at QMeZ~<@{H2pl9=)4aHjB6X0enz)m*_z?+w`&) zk2n{PIL@?6yaYF1#DOAD at 4n6Ye#4~lfC=MI>ic}<Ch${J%pqQ at yUVo(?f7QNwtepCD8BvYJ~x~fJO`Rz2*XO+IOARAX2WI= z70*>!on7TeRd!3+Pothg>}R*&C0X=7!#8!)9G5TA`wxE}Y1G;qSZX^9aUW;rmL%Np z&!X4O0L)Vw~#NPw5t>#^8Nw9Q%E=*y5Upfr@(YIpVgKh{%KyCuW`zql8(q#1HiTm1a>= zQ;!ROs$1zluekmvG!ry3GI4VHC#DsuZ7XA|qI}Y|j{<6P=afXgYg=gx)l}SruK|X@ z3Rq)_&?Y##IK~}ewb|Xc-vTM+KY?F&0_j~}_adU1qg}+rhC at ETf8;MXxuq0BDrBU} zJZAAeZCv?ow;owPu5SDBf-*$3f0XQe at Z7c}y_{x0&&T+x+-daWHSoozkis^zZp>a2 z3U4*gT)ttuMljcyI6{0fl!(azdcEGEFC7eSND5LC<%SM;jx-G2wWQ}AWSIY@ z16ZwcncKf1m~;`!1Ap5*EzV{ydyr2q0sg{{MT0nPhJd}A!B at s}?o+UrHU+*F4imta zi(d>;#wc>|HD#7KM}eqYsDp3{mA32)Xd&M%pi at ngzxLK5Z_0M#JM5E-l#$^Zkd?)DIAn-r)jR9pm8;da~$sY!a0+(Ub4 z8Xh>w1YMH{8F33H2IK}-Ws0_mv>63F_}E>1_bV^cX+DG#$y|c$qUlKsRFH#zmh7yV zLt36u9SvzY?+L+MzjRzwf at 83^x&v*%N90hboJG1^Wx{=o$ZN5Y#Q1)wB>seKkyEib z-IiT+gyakE?~3I%=dLaIR9tlup;}LfLIK^;JShC-!&#hjmG!LA(pMGcvF_H4Vs5gI zcA077o^_3)Q at M}{_~Dk>M(UgnJG^8iW+QxzT5PJ}G}kc`uBab`T5pT(yTc^3dkryP z9ud4~nJZC{>lJX3;IX>J!s|4NM7r+k-OrAjaV|#v6eYW#Ys*58*;@rlSL^*Dr{8jB z=%dCYWs9XIz_u1%!rsEMYnKXg?6VUtI}h2xfm>=Z&-Rh`(~&M{iMGG$?5biDowZxx zk^tRE74$T-UhbS2bskMx&`7qW94v`~1MjjNtBUe!Uy{|()p^hjw;k^`JjV2t;AXv9 z(Q6O6mNf7JX+R$v(A--_F`uZKtDloJzZ7WmgZY<;-ysPy3+lunhjZ)*S**-)YYRo0 zq9hG=)ht4ny|$&1xtk3QXfo+wY=|1VBD9E2+(=X{BTKc3(j;xr at KK1{$42b{O47y5 z?@fUb&-Ae6+=~Pw zqralhN3gr9Te-xv?)660CEa~V`MM55Zlt%^Xc_#;8Zr{T7KyAhIqLn=?wWysEfzFZ z6?;)({Ade~U?cA;*BKcoGPq*3-h*6|+oYO=-%xSSEZy3#JNcHSw_7~gSA+hyp#5Ud zv)5SLqMFzKaXqqWFeC7H{&YCSi^0B`J1fH33GcA(7zY=nN8AORz2`_yp-V>!FQ8(# z`~4~1qUxU at NHMV!ejy9Q1^I+`thh)Rhc4eF1wOw2;lzEZyuH!~aQ|rx#;z70P#-l1 zG7 at gDW~Pyf#jjz|y0|6LI_Vvx3uYYRuh}9$y2oyb!!V70jJQ%lL at r7U`0DCCrfMa@ zFgizNrZ3odJ+`!>gMwG-5t#@aL(>#3Q!(Kd$YaJ0rl)a*(szqP191FN6LI}xlSX0x?Y7xJ7Z!g< zMy0yVU)6}?$>9WOhI0U9>P;_U0K$peabPtNISgn6f3t~ z&AaNHlAc*=U6R{;u}HABVj{4}@Vw at iNwmb8@~Ny4af)W8V8Z-T)!0cl!%9{e`(!d+ zEj`SlVYCJ#-2xguv_uoorh~iSqKcKG0HKM|$O39*vPZ*5rfQ{iF7zxJ70^IOmvHMe zifU9+dX$Z+HI;~_Kz3(U9tIVDyWDIpgGLjKZaF82wezK9meljkAc at AYQ`0m%pHMX0 zmgW4*GnzdcG$)L-_NyG=j!4v8bo{@*%15Xr at ix+o^%X at yyRgazH zCwPZKERNusN at Wh`*4 at +ALhZw7GztaUs}2qA&R2iOJ}RIPDOIn zW=RH;CO at RcwKzyDOn|2Qm5Tpq^3$(ye at +u_f#-6WXEFEiMSpVNcSae+^VN^y7d(&! z$vev-S3xb34DoI;qdZHUoeoze_{n#^hBu(sQhxc*AFqBD^f;uMq#eR`4)L#Vp at 07q z0EYbP-0}x$dkFvbUr2Qm1FL^&{!2Syiz0ju%}Lb}ao+$BlaUA at amSx)1R;PEX%9RL z8e?}8AN3MjnGjVIUs1i;uMP%7i=wi_>Fo3bW8>sNAw!kzOvU6Kuj;aCjVh at TaZTJm z$~<}Nxyi?TejYvXf7j`C#c`+ at ss%jAIU5SYWEi&K7Uv=is^KVZgzed)Jms}aBW%S* z;esWTEB*#26Mo|I8*r&Yd&#ss4S@;kD0B2FqQM4Z$Ec!1ZS0hhoR>1mB6N^fW)^L2 z>1USKQly)PxXIfVPtJ7`rYx_AD5T~0R?lE zu51j!dl&*Fj;jv%&fn5M=J$o-i9IeT_L!JvQm%uxi-4-ScbErZi;>|>fGAspCSmp5xO?zZm$~R;&|I8xx_qjOmArZRxWV=ES%uqG zRr8!ZI+!`m`p)%Wjp4q~K6bCZ?9NBDJ`zhIP^`aDV{lRVj09Y}&Crn?7_$Fq^(c5- zt?kff$YE`skD?1Te^v^9b%AZjzqQgT>bui=4d)}qgT_zNCNQb%0k$3 at 91%*U=JSx4 zDyglPA5D7Q^knFE3wn)xjBPry*oZ!(Zd#XLolZBflXDT?KPcC6x9Ty_hshX%V)C9j z0^}J|1o-91V+GWKHjgEDzSA-5c!FIuS!yJO7iGNfN(G;}W~Xse+=e3rQKuPHBrQot zl|y;}sA-YmO_iS}$j|QP-VN%w at 9yODwk%6k>Qo3wy=01 at +@n5)2Yc;-2>-CX=u4+q zWI%FR+7bNKUiqN!4X@#dutNsTOyV`bRMLFTC||yJt~+-hBKLlkIA~sYmso;--VmaC zhJ%1jiaAt5FIPHUw3;PE&;rlQ;(~S?5B$Z4fcY;D9rDd}_u&Wcki%%QEPNJ$i^ShGb~Xdr zXLnNfV3MmnJnj)ZWWaYTHa$jVkTIoLc&$B)cO?1`9oQ|NkJ?pP83Fm977>csa5xXs zKLj2+&{KzxXm3*?C-%qD6?p4Y%dITB2~^hSx@>a`ClfAxHXJv%oFql&@)sVm8(&*y zq_zd(yDIY#Z_GtD*iBZN+4d at 7Jy~u^X!U1lS1qx2 at vY3g(L=%d<5M;*-IQ!py6gz4 zmPhB}_;RdB4^chE4Z7pWYXAvx7(enn{14^Q^+eDA)-yT;r;>a6;{$&~{r9&N{f&eF zmyXf at sp;rO52IvHpyyO*7Mi4xVw2Fy*etBW8^DyLpv8vir|LEUHtg*#da1Xg_iK=$%ra9%2qAV%Ca5?yEpQRg%Ng^vCA$# zSaa1acm>_ADOpr1mMIj>if5f5-KVz}a=*6qmKRyHmX&Lhg42g=0~kfGFQt zhySK};#u6HH}~^-jvmy at iV=n-Mr20^d=c=D{V&wm~O>XVwA0_ zSbu7S5%Ar&3`>K%;#ctRrfZiy#FYsJ67t#EAk^iy+1{E|H%?u!CWSI(K73%6RYn{s zV8Z*u`%Ense?P9VuP5j1>X#-tv=R(4sNmKGtSEQUGT`pXrn0G;C8U>&<(bm~;#`l{ zryqAx-UK{yaI2g}DPe+DBh|pRI)4T*ZoZai2T3ekIj-bI)XxliXtlRwJ@@!E~ z;q6C|BrI7agC}RgnAhkM2uycbYrJ{S+orGjVv*q+Pdrb at T;YK^}68 zX)sm4%rwpkXlM3Ln+aPf)l<2i_hQKszjn^(+m-);{#@qE>^0v9i)jx-D28o>jDSue z2+R(RBrr#affo4aA?#~32Zwx2>m`_^l7c1WA%!G&>@jd8I(aeOkI=86fISAo_SkTK z;@Sw~ngZ7m5rgj%FxNMBI__F{hyS9$`IYhqx76^p0Wb;}w)i)XPMfF$s{w zAim)9<28AZ(%Qq#Sb$(C`*soK^RB5qEljh}Cy+}XhurGww78gl!ViIX-y5UoXANXU zIHVT2U?cE6^1S2vRN}L5G!Z>ye#hV5*28+hELsKI;I9oZ9;LN>I0hxlOvsP7A at A{r z{m}{`1+K18^E#ax&@-P9CD~&N;!X>0%wkxi#OEbk=G7|4yBJqjj3YK8bNbdXr~9N z4us at KkxbPo9iT?wX##~mmR;_xhbVm9CCx=L)Up0S#GWiE6x$f>k zb8AWtl|N{Z=T>Z{ox?m9H|B7CHg{0x8+0ZYX%kjtmo6=|*MwCg5}kjpUR(D$E}mtX z+FeJL|BP!W#KfyrRP(48&0xMPlKTb>Z{1a>orPQ^Om|XrnT(mviLb at VQeV3EUWLWj z@!KH=-R)var+XONwsuXp=+*^r(9tMJj$e90ruV3Iw((=0LJqLsrKel(a)U#a at cpWn zTc`cX32uBz_1B&p5w%`~KE at C?_;_r~bTeo^uOf23?Br^}P+2?$R)hhEocCL=)va!$ zQ076E8pnEE0RxH}q!y<8(JknZ^I5JrBC%ozvw_!A;Gxc}b>*P0?Qom3wOtCG7l6=F zNF|939>9n(BSI%nT*kp@!qj}+9Dc?R8#l~k(q{Qe*8CG|>h~@01Reh*mIr-X8m8x-Lty at nhf{E0n|i at 2d(tU?SJ;8_;h0R%gCT`OnzS!U%s2fLu1hQ-G1 z^mhi47D*aqh{PNLRr{OsJ9z%c*l7FRLyH$Y)R0+ino z7u^#7G$=^*e)=T$5gcVkT0Zb?(eOd+tBvW`r9dMmWoP at CfU=*%ODs6!JFlHmiF3v| z=0J_QYM$2x`$K+z9)i4ERY_%9k>THrtSYqsRYz0xT4; z0G?-e`!unOc=vnaC%RbfGAvvhc5#_t41W(wv<4HB6OJzc8YXcCDMkdxLliUd-LFz} zNL6Aa`h9qMiO4N7&?&&j2z}{vM?L-99~fr2#2{1tDbtMM004OZr}5;!8h6?hL+}f- zeFx<0u2ZX%%^K|qm`kb*%Gmb7x{>l!MuT!>;oFC0oy?w-3V=P&BbXTFwUzJ3z^ zBf$Rx-n^X{)F;HTR*rG=^5UjG+t}%j_4_=F{|6{-D3Sxukk+4Mg_!^AlE+bkf~?M8 zmd^IxFcUuZUEyF*4n at A;jVq!Q2uZ4a3dUHwnh|gSijw7JWolgt5S?vZx`erUDuq>< zABEtUHTqmyb(jI;S{`-cIYXy>m0Fc7QKQn at Nt5!Hxm|&tdYP1N$08~o6=7G2I>Shd ztD9-lD`@?C`O1xwTRt9)jdq&k%=21+b!nSw(o$<%MW(q1u_Jzf`dGk|nmQ+8Coh>c z+bI1(SbF|-ZHGu4g;SvdEkC|RqgX5x`J`v!ymx-xU#m5$&}XQ3RW*@wJmOL0`mXu! zQG9+Unz^bh>nW(p0vlL+g$1gnIlXD at M945r3U7U9&u2vPv`tTRQcMa+Q0j&E(@7+# zs1J)w8I^wLM4d20^I*~{94B_W_Hp{70ff_W`Bw}wGQ(0<+uu2B zx3T%`34r`f^(bGfQJ!#~NgyvQNt_-|q6BO7i*UM*9TY0|BQ?Sd(7F>)*CHbX47P#>8`2SU!i2{?#h0Wb=?bGU_SbF}cBzg+iB}M6p7)EWP^8(I$1u z2hGB$Q`S+lLCO;sucqomzSWrB at QI=*0S@;?TfBsKHXQ7U1 at U*v4)bmBidhb4YBv|& zIapypw-|cFaSIJM at AKB=8t+!bqHEi~3w6d>&B&+Z{k%u~Gc`N>zHd^19q*4h^&>vM z3dhLWuF~|4;8x2$OFXfVF?133Bs{{YLDp{?1EMaX_c{ZuV^VEFNkM>oK0~lz?JPk_ zf4yz>P=H3X^XUy5On07&Ipw_aYgEgWVx8pmlAMA^Ctc9H_z8Y-=EqwL_t|_86Z7&A z>iZgje-w=7{HaM?^T4}V+!JK+zx7$?a>wgDh~wU|~oH2c$0HfoG`9 z7)a(0$~q%$ZQ+!R;g?^uGo22=xf?n+1|XI|BgKj)5Dcj!404X`E|FzHjDk)fW~0h4 zJoer>i8ZIRL^y8ce?llT5)C!@iCj5!;ozj1H4=fYEP7 z0>xSew+Bz{+KAqrmyAxZif=jCA!B5(#6 at uGj9=C?MCrka%*q-D!p{oOzxf(WuK%L) z)XnGm8idY*u1HSOoS!hWWD+dE(j4s zr{#uh5k>1T{Idh*n$6)07ClVHg67MT0;ElTW1rpb+%l8eUyb}as88}HP1`!-WH5vL zlU3W4_6Xk3DgP!|i+pzQJI4hNZ0Yi0dDSFwSZRQj?T0lRHu4B>mmNo4ZLpjJeOA(* z`-Fa$dSJ>Z#=-88cymTF?K$-CL+$SP{h|i{rz0`G!fngI4TKb_%qKAGC0>;3(D12q7V$0pb}1o4Xsy({xyk-V1(jf3206pphlsmC8c z5xxT5-2+=i`H^|UD0s{miCz!Tp?M%0v{0LGRrb`KMfZr9velKQY-ku)*3^xMZXCGc z505tsqp9?iWs?Rom&nB at Y;1_r8!s+}ken#XutJ)T_HdKlNmd5coGgXuiFb;nN%jaY zopj5swRIe>BDUv>H-?zHxD at H6thDl}Z|WY2M)j-~$U(c*kz-T2zu^ErDUo7ou5x;J zm7_~)iyULngASYsRB^qFE(^~u^_qq;9DGR&&42lwnta{Tb;q zn~;!CtG7sFVcaY at AX8dK%smxfFYh`&O%H{2+X8It$ zWTck5s!D4=Jw&~rNjpPP(jko{_G+?B;)%PiUA|nZQ((YjD0}}oHDGe=cZ0HlFgVF5#AfWG4a`6m^4{1yTRkMNB4usXSMHO9qxWQ%UNYUi!$YE)6zPNfwa zwU8onl;Ayt;p#eUcQf9d)r~|oTy=gs5Uc)Xo0|_>FwVZQCYUxv6%eN;40gjx%_{?g|`y at -*BO|5D|+&MG7GE z`w5D~c2ka9swg`J1>=5G^9KYZm+i5&1bUG zH;-R)@p}QH_RLU_YDD)&Js?&Ko8%(I$%1SklwkyG(nri77Gdr?yZT^jD8Ewf7>7<+ zqp_Vy+jUM%L*}yz?295h^l0u`(y=>I)J#mXOPxE2Qcr?7+pviT5j52zGi=mgX5u(G zgxpLC8xv+_kQ0(rS(ix)f<v0tG=0ZV8^gQOO>zhs zN^23X3prH}Ba@?5?W)EqNgtXtPahicBiu(Z8CF#j%5632(>&W%_UVWQJ&0kf;FXs9 zM+?Y8dOld0gJ3s}p}bh37+h{ny57(5Z_`iOR9(&T=vu3gk4uvctNk9Y47_lRR75U` zMD2DCtsJwD?#L4!i{L%8`thVmGBb|L&1O{3QC3})X>I5pN>h?xaKks`AYTlpVdIfp zG~R?Fek>ka>=2^dJ94hw2{SN$#b%aZE;Ge4ywhgzvQ(455Sz0Wk6BfzwV3b!x~NSy zMwIgr!Wzq){s-O7@@4OT=n`4V-alRqm|Xk$!S6Qxi*Cgj>%Ztm&|RVm at 3$@|{EKcI z$-;;O3NvF6BJ at 7kw68KcZ-{0TM3Gv^4c9P36i!>*$czWSOrf_<<_EigPF~}uc|m)g zKIGFPx)P8s=Z7`w#k^M#Un$?vIjj&=Lu~wW01iH~8n5c)op^wCqHx4KU(_U`4#Yx_M>>hwL!^~)g) zFX*79mS_|G-TX1BRp8Ug0dk`|F5h-14-xTs2w>@kCOCE4M#ya=_>C^AP8}HCS>HMe z__#aVDefBSq&N2Lckb-~Vb&2~2uk!y3Fa2U& zDZxK@>mmQ!Wyb&h!2MtHRh9mSFUrr2%&v+6P1&1}fNdlb5fM-^Bw+#q7L1V9fgP7l z2%#xhsj|fH-#-JrdqPO~;n3_CLg;o|ZH|W{!N2_;C;LU&Y#I{MAr9?u2xUku+R%r;Da;DeOvBQBA~SVbF+QNUA9`q#O?8v;Qry~%rWuD; zSyfZ3E5c!d9ScnX({A!xC%QFfN*o%=L*Xdj$}=ukOl_9+}WDYCJ8 z-+&6Qw5SVsIdHA3-kn)?A(V`L&c&k3e8> zA#~Jrbt+L{Je3z!ORaMiR;`jjhZkP1;hzOoXf9C9*_$KnG&a<1lkq+L({4J!+mqK% zY75thQtaWf&p^Um3$3VpB&oS?6MK!fN+b)Q+er$-NFC8m3)0NfZthGC&S2GM7#yz_ zHaC%dXwK};2(f;C1u>qy=4)5^IM+G8jUgmBTA(E#(6~0Q1Mhhlq3MgzEv>GZkh5VonQ6u~t65n}cR~1n|ah at 9E~E;$hA81wGD{ zH$aIW*7K!0An{Zy2#t{2>P{)y!k}3;>OA4qAi5z8{Hh00G8jPN6ZeT~JV-w at Xf$?P zTk5txLMYr&iSbU*rbW1OV2%9T8A7*I_4NP?+fMTJMq#m(VKu+~)HY@(=FXhVDcM3Y z1#O4&*!VY=PSlvy5 at +}~hp_DDq3j93Oy6Cn)Z)Ho^qh at ETrvKB>8_4Vsb}oF<;ADh z)^@Ayjuo8B?!_3B&x^ao9T3VKvh3>+d2=EWk66Np8~uAf2bKXot`Q&rfJ6uY0O9{` z;I%Zja4|LczXjiJ)oZy$0~Eg<-=<9*Ve&j6BA^R4J}4kRTOk-kVGR~2%zJZ6`eF?& z8r%@--878+lMp4Q3SlNS||DNW)u%vKV3gA?}q0qLIUptvt+<%VO(3DF_#SHJ| zuA!1*>ZV!Px?M}y>P=E{qi3;8UXLL(jEU5c9A(G}iOCMZ2DekxNW(MRNO at WqW!RJ1 z28Y6D%Nb|(IWB(>Gig_>_B^nzv9Ixj#mTg>(GH&i6V7gj9kjBLEe$)$#vuqrH>gDr zNYf`^W20^YkGY8P5xh?KH-dHditXcyZ!Hr2;?NBy%=chsfO1y+XeWSHlE#s!@8SW#WxKmwqAdoNyDJjLm7-LyQ9-w%oNtnaF!TvLo>}=!E z!T*0u{%MR?pLr%6v1voyyK;HaEM;-p=jq`37JJ{Dc%?L=?wJq-p{g zx2&HkYnw*!9i(-hG&Y!QqSRZ&yled}WHISg&WOGNS{@B6WHD+KQ zw)NFtrRuP?qNBI=|Ba-oefWxRon>!n-#?BFX)H{SF;;66yNEHi4zaUwtUkl=GF2=y z9+iBYTt^CQIJ0pInJF-RG+)k!y{S3JMr|k}tt;wGSzC>YXf;*z`o3(S>uJA8>Q2xr ze;{BPEHqPkcmK;HeAG;lU|8n(50e`Edyx)T+I)e3nAkx7!-RLoKX990*JDF3IJi0a zON+8s0HqL?nr5kMfCN*Evd0Z|5+vdqLVPT_(d+oyV2}HM7@?hnmF(%&1NL7v*kcvZ^RsLX zAZlE~ARMJsSEz?VN*f5ah~gUK&qmJ5y5+Y30RV78002b)herPI zX-;|G3Rw_^H*wn}!KK-DqeQiEB_o9eR6Q32nTV7i2n-atWj67;ZQYGon=KRVcN|?1 z(dQ2Mi{gHU1WYOr^|Q`-c8k|}w%y(Q&(FsXa38cvWZiuo0CX%z3ug|)5uGUpj563t zzAUqf;f4{#YDejTP+Po$|EHY;)pyhU`YXnjn-39YN at sq8J$a$O%!d(zV#!jpFQO+A zKz0HG~ZLV2wj|YeObfNkx_Z`}i*00ew*yOMtkEG8#S=5wxPOf*! zGLFL)#~9J*ebW9jE&1@>13xUY4NY6FR~0wA`jB(S58F2!40Q*(5T+N$0}6DI7z%BK z^mCxS!SjT=3E$$1Q2a{g2WlY#+8#Q zS0h^tU{j&YwE|Ubj-s+z^Gp4>cNX;7bCOzYMRTdN at RS;pm8o#c{Z9`Aqu?s*oSSRL zo46#|d%TCv=QI>Hhf2|K|tP0P)oY=1{p=M|INNs=Xv-)_KgBGW4HG6st!eMHSW>%g*{uNno>e>p=cNz at X`;Z=-dh=D2y%-5p#xA5u_;7 at Sn^*%;suvEvS8v4uuA-StSK zC50u&fdf-m{dzdr^_{}pzOT!=OK<8p(^2OFRR3LRa>%bg^{evw$%{CD+ at uMVAGK+A z9k%a}#JXCk17(l%y#$N58i2%kUz0Ia=>Q>Uvi6FGMbRw3M7sh*XBp%Jn)2en0 at e<- zl%5)Me3DcGrZLNJy!95R<@WfMC{@Nz&{lO8V}Z46IPIJch at U`FMW!pvJN?EscH$LB z?J?i5T!Bv&7#JcN!FGnz{2gVmJ>YM#)B3yoxz`vR(03uSWF at QjwSi$-SZ%Q0;QpzS zpUt)TqHuPpMJ6Vxn-2a`Li=~&kJS|#ZuY&t_4mQ~nULocO#r?BwxIkOJ*^PC^6bvg z=eEs-Osk!h5Kvdvf`#YN-fLaRw0qMtK`JsbQAp?Au4Y(BQCzlWExHD;HZu{ude`6K z_*S2_-gxFgkXnADyfSkKq3g*YxTRmUZ#5-g*ansiqrkOXR9sK9AQ~onEuM^Y?%Y_@ z*ln9m6~_AOWb}13S?38x1!7g4Du&Ok!>n|uB#GSoO}Xt14%$Qi*flQ3 zkTzQh2u{Iy7=DySo{*R$u><7uoU`u^hK~6R=>Gb~BcjQ0+JSK5gKj?MtP7K-oKDAd zvSffBc!H1NC6fz?(hkRn^r5PAu%qBz;1`B;d~}-iu-W^-?h&ws+{J38aPPKzH}i4`;uFI1#Fzd!Ct(Je_`ziMlu2>1 z>L{t-U*HEU?Zrx{nRiP<%xB~Y!fLD`z$sXPL(C`V#9KQl&c at 97WTey-dk<+Ef>~=2 z(P^ng_SS2HqPfzSzd61B+(W79$NiO zSs{Wn*nHw3SU?m(SWzwzBLRU7Rubr{AXpou2w2eJ9c+VsDVnl+1QCU*z49z~ub0lo z-0N2!)GP8|Z|26v&hY|55BIFADfZo|E_QppY)|~xFZx(MIDk-(2b{J39M*L>aF~}W z*x82cr$?OcFMq!r_q$Wj56^kS&NY15mjvLNs}FLkcjjfik_~FI&q!d~wZ^AAD%M`H z=2h935a8?MxK^2$7GS~mJNCryZGWE^xbH4$+S~cRujMcP(arFRIb+zm4L05Jc9ie0&DR{kwt-IV;;4j3yKO+46 zop+F*?8|=nx!oKC09BY#elUx791KHu86mSQUvN04X(fi~A=iBpgZXrH-ws3D5NTpy z1*Rqo@@NB08ysRS^C=}Z=GdHK-WOg7bTebcqXfJs^YY*ynt4{47ieE z)4G-yb}E-KWmvp2hX&v=qwZqzg{h_}b64H6g>x(sIBA19%~3rXSl?%*y{0%q$N6wc z*uV}_hYT4Od6qCvc at rD~4m=C25z+lIj6)bwxFLvfg=MP_714Pc5<;FRhHM#PQTZ+P zPs}lXBa0xUPm41wWCZom;Vg=j-P{>|6KCc~-!ft)j4}D^C21onRHcfK|6H7nXO0k; zE)u4>#FlBs9ixXMPcN5;PQEZJ`SfB^k*sVBhnPPgn4yNWU^w7J_dUfN{SLQfAX0Wo z$ubXgp)Y!*FJY^=TE>PpKWpTLSeT3TQC^(Om0=9|O;bE-3S!2&ELWVnXpyqWJE$0R zb`SHxndqlBH>>&dVpA~Ww5W03XLg8V#h2=*hJ5y at uom@reh>7~9 at n8KVvD|bNc!YV z`K=>np>Kz!o;H#U!vj5u&UmJ%rPy7!+jVi_sk-l{p{s#=t*)rY$iG$F)KSo7g`x`1 zTvsY~B06b(X=DiItHoe4))XFCDvQqp6Z%0_aaqs|qX7xr+S1X|WhKVJWY5>)k`_Qu z1U*PPPa2;wmQ`^VW`VN1Dppa*3geZWqtsL6quJ}U9oAQX>RPYCp|xqRqw874q{HdN zDX5{Ory3e|U%u}NeQ&zE at s60)r=_9GDK*eyeL6b8`dC>>Rqt-g8DQj4me#AUYgsWKsyW!u5 zG}IEXB}@KWU7vvIL8IdzJ-M96CV3P=thmy2EkJ29I&kbLMq$(clO$q2_&C6bb50X2 zYIO+hGD%G}z{+|NzDgj!5~exGxY(A_MqeJ>Z}>UnHI$XHq2Vc7EyCl867U2cE<)Tq zh>@i*hcr%;K8MB7UCMkHQ&BVIYLX&Wu;0)T>^x9!sYKT>{Iob}jOe8ntw*U;a?q4Q z>5o^zPDh=nhMNB(dW;&cg_8ABZjeGB5xBv=pD~+NWHvyXpL(VV;3E#g9Sa at kFP7fI4yYU~$_ zTVuI?tV^P)3#ys4!6JR_BT6MP9Ck62r74V43A{OpR!N-ndQ!NWpa}1W|B$SbOov;S z%V)GX0yzWH>M;ef$k4}d+&;(RSqY?*0!$S&EpI)u3X6B_~uVX9McsLH@=A8aHh3Oh|RSc4i8Hf!Nh} z_HQDuC2ITa?{3@`09!lkMi%1y1m%9jg+_6hD~8S^KKYw{0#mh2T#p*nRn{*~zP1>r zsh$;rh^a2>w9KhAOwE_Ci?t+HYSHt=P(@9JN|3hG--(u>tmGAmCd|mhuzcTVi(rU0#>3h5$l2a4d1ja$@8`*(VXL+t2>W=mFirg at jJXA6Kq`SSP^CUeh0-IAgAXI z)e_%zJr;QzKc`c{3&Q#r*C8=Ky&%C;-)?-RvX~nu(7)&BGq--Wbvi1Y5fu)eRh$b2 zoUjY+2clXAaxxTIl!i{@aQ4wt5V7xN!24#5!YLv}DsACNxaw at vd4>F7;!R-fNQ|#{ z!2NP^^J4ds59yX at ZrF`BiX>!WA{NkHpat#(SsPnyIJz>%6BX9P&cvufH5fR*oguTz z1JISJa|BTgL+vuNDXyjp at A%<-nfuDyTGlH{z4 at 3Tc(VEK^Y+m)J9tHtec$J~Mb0O! zYh*XItMfj=7?A2qR(z8}BQIk2k*x-yAG z)h& zHcTHcES4V<+KEq=!ZwQq{2y4&CyPJl8X06I9hSno5s|&RCXqL3S`LLW- zUuV!mvbXl$G^#2lq0uYDwJEt8csshx{2esVRg)tJvr}kkc$1%{?)bg<8cY+5$(4NQ zM3XSiO&=hv6a=Muxo=Kq-?NR|nyjsnW2qCi9u{^fnUs&HEC}1p7AeWwGc9;YG>5v3 zjhCUtr^O8oroQO6vA)#1qgTrGQ$G2*UVd-e$iYoSQEtOdKyHUJ#Z}c+_d`OclVx$1 zuu_PAE!X_70AvO3l~p}W^6NmVBXWbvIr82lr}|Kdq^^sek+hr at qLdp+VZ`vt>Ytd@(38!Iy6K*Y>K2z?#@_Wi#a)bX2=-Nwhu(e z;qd!Haoh%+adv`QIecJp9pB)3PVbPvY_L`x4z&)sz}|aP_J;Ru->BJFFjgJkxR+NJ z;uN$<#LlfONg|FCkTEW!E;+lPZygW8u(X!~cyr>Da*s*yID9~E8P7HYFvUp7UE3w) zaef4ypLTbr&`5e6iOo;3*&RJV^^Qioh{pBzRPDBGwydyP9oMY4W}>;HV6)oAc-e1Q zZVpDaM|ii^EVit%UL6np3IWGy7vHTqXsRm9ubIfVNVRZjBSKE|iF-(Fu;3jI1rG`B zcx+fQM$GJZjBNI=NZgp%@mO1&JOBk7O>H>YTQFnOM-I2v?0EXu(``V_N9zyU?@0_f zBce}iurr6EOA(~m{^E{k0$zpzN<-5Jw%<41!#o%Su#OBFEuRHH|6V6P581E;oxRWm zb`8l~SZE9yF+8=B^Rh*BN-?E at sRz{sVsksTUoonUYxdmZfbo1*OSRpDA9~t#{pGgl zvbbW3=65UB6&_2P-Q_`&k`%aUb^UghizuRa;U zwqXn;*0N at bOP&M4w#Tw}WDCQciEfR?W(<;va}a^e&Ks4q!JznCg~HsuzEd%h zX=WYQ2Kcqf^l`q at HhdqUgHmEhRo2HJN`>nsnnf_C6nB`pkJ-Yc!SWR?DGa1MV29MD zC-|k#D}RkhC at 0dns=lqsDn5>%?3i)eQ;k`R9A5D4`^6a|@B_`W=-%b**R+L7_l at 23 z6%B8Ny^~?P{ZHjjElzJ!3>8^%Y7A*FDJd|;v^df)Wl{!WtE}u}w3X)25(|syIAiKa zaq%UexdKpd9`~;pIv5|L{)h85OQ|zOGjGN$XK5GNmOayUix at TW#mp|^4z^_}1Fqw& z95be_ON5J-%FM;whLp;y?`FzWLdEBve!Z1tN1<87 at OVWG;*0X#pVY&lm3!rowqzZ> z5@(Br9cTi_?`FiOT;n9fx>(*!GOoQW+&|607uRVV9^&1+g1hgru?jKqxaEp?)m=!~ zq|7StR1$n|ax;pysZrH;W}pp}tEAyS2f*k|@l8`t=(K)8R57y~s71c^2cP#uzWl)7 zvy73KL}M;WFpIv-g8%^lj14Fr1+B9;FixJ9?%;+SKWs=3k#$vMA%vy0e zC9q9=$3TFY#%6MK=|Ye1mjwv}>9RC!McFbwuS*JY&YuA;<}ZuK_k<5a^N8=yI%*So zP&@VKh20rSfMJy`YQufo+6a{d8OM=m!RHrc6zOeD0Fv!ylHrnI?B}^BS|yf$DqFPJ zSWPKGE5nC|8S at r(BKi-~bD$UR1)$Y7HnN68enT!FxXr+bx*Mz~&_hTA$0%}P+&kza z7G^`jhC*dwM^i+C>Pqf2|3IUEkkmCOwIG$kO6{~$x+>1Q-qjW_QLJ%#uOwlnKfj#9^g&U*Tzq9Dq!Yl>#3_^t0!v?R7)|+tAT{egU4uOGnqM^hbb0) z(6Rs(lNL&qTvNjW*3X77MZv49#^~@#Js9ZZcS?Lqa^bTwBUK9!9eyGze#iiG8Yxy~ zxOp&9*(NQSEF7ZYZ57<1b at VmX0Ru1*M9wt(_v7D<|2;M2$c_T~UJoV>LQxhcX6vE_W&mMLEahgLc{gAeCgeP+)d2c?LT$j=l%ZT9eS`kyZ>9ahz at Y&aQ7Eq+YZJS3~d8yq-uI^9b`vgpX at HU z!w%>V#n~o^8AZ}Agc|W${(zXnijVOW?tEd-#u_&1__=y9WT`Qy>5RtHK_ at ip`ytG2tQ?+=k|;@EjK)mo~YO zzbg|=Bb7l0D|$th@*WN~6uU;`zBG^Vx at Nj z_La>__ul|sucJq=z at FjV+dXednY5t7^44zD2Xogo7+h?Y13w_MWhj%Qq!zJ}5PT42 zL=L*R22>8nBk`|qNIx}!8lYMX{=a3*pZwbK3FSqYZBS{1LYfrs9cN-HxpmK at yNoA`NwT)j6qB8IEYqR73{gg=Eg36D`#jcy z{y?$y-@(H$IZ0a$JQvk`F$u-<7kclIFRP;%wFxRPs${T$gbIRko_g64JHviDobv-C zd8 at +Kkcgx1Z>R~-xwJYn)rA($Qk~O?W^)G=CV;I`x zH=HKkfD at 8@K1hS4K at UF()uAvGG(kp=`O70HAsuI*reLSc@@}E0JbStNc(UK+)MA4} zcse$MCOHOo4v{{~B_)K#TUQu~nMP$@H_hO~%^HJ{;YPw{7oxZs zxN|)mgK=pi&IBYA5@`rA^_NRA2ktZ?VWahszFArFT15{=K0?Xv6K4yd&Q6fC4R-nI zx~$~(FWm|lgy!?yYzH!2>rDXS$~MEg7mk?*_P)ub9>;J8{Keh7%cUU)`ebCatOF(8 zJ(e}|mIW`6`{4n86JD_G3fo%DZMf}8Kw!q6M?W0j5 at CX<36R2vrIr|VEV9TTLtBtyA?wvp#BlkmL=F!pBK39tRtJ?uUENgtmxX#M|bFPn)Uuz zH3RN<0Os&do_lE>dA|VhR8ce7w-P!rV%W9$GVp4&W88C`>Xz7`ePebB4$jjIRZC7m z`4G!OP1*i{!LzD>R_UKCPXA8AKoV70A}o>>3KyI^-3J z;!3^hl at krU`D$1LR_9 zb?lz)rLo881~h(N!|&7wPEYesEanROR6~zR%`>`N+%xQCt6O7WwY}!pM+~l+?`((` ze;v{#Iot5YWXWcq*=AJs-)E?*TqAFdX4`tMO|wdy8M;>77O+V#ZfS^PER=B8I*BkN zGMP}>D)tp7g0UEs04qUywJ{+IBRG_Ni at 3t80YsWuR3q%rd5g7=yfH8doP&e#fczn3 zYbl<3vSDYQND9K&y3e4!&%W6kL(wXHsOsq(lkauHHu=uviMX|6%d4-j?4cvrA&~)g z)-PVH9{qlFpz6E~EUT6fFN&1&AzuJ)ne`ndAMqA<(|Ckd*FC%7!}wPDHN7{8tTsA3 zH+iAPNM1QILV}#z9 at GhQ+hESMMxxFJ#DTNqsp*{1WU;hfOrlNYD%t!xIzjvT^q~$j z;Em*=!e(5`b=Y#Hz_q13rP_HPOd%=%Z9JP#0t at 3)LH17Kpewn#*&CR|D?5j*ZQPSJ zUW1x#<*QDWI8vkCZU>wrs^+N5B`LS!HF7d5$Ic!lPCiF>@tJsXlnbe91$8K`QSp!G zu`8AeR{|xEI0)OZ;?C3;(8(6j;38}}%9r?Rl6~E{yDglIxtqwy>r(VUVU`2iW><^K zYGLhugMZ$5VnwvBYlv48s9X}e)zx}J+P26WP-Nk;JQ}eyVET>2FeAe-hQi6Oza$ax zhAX=CWM`XDs*OhpY=Z;fgdLz2ya-REXsLpESA!0Y!1;L&!o=$<*8iVeVf=y?9 at P17WZ_kS5kKiqFUD!%;$S!o|V`sRR_dQyeCqYj& zD{}x}6Cwv6`+bjEk9|-Frr;l7FN04%+XNX81E4A4s1revq=bY(3FhQ*E*2VABuc)BXf>MW>;+L^6NGjX+9$i)!88NPz`7;! z$(kNW-5EaIz_V9+a&{Eh9+^?VpgjykMM at 4f= zo$tU+To?pl`-shqLdgoWHBw*@Vl2(#WT(@Mk2mv=8D4t58SYU^RKOt884(!9 at fe2( zei$>C$UF9b_J?w*mTO|;y`$^(iL=Obix$U4p%kuRz+i{{R{qX;2 at r}|nUjU`xv^@z z7(uKtnj~|LHKq!{dt*M;rwZ$T!U$&HL)6kAFyy!*!Yt at 3m-d>){bUG!P$!0>pjI6O z^H|JEWrUghkq!TkvyG(UcopJgA`R%707O*kiuWQc%1i_8aNgz$ZBr8&ZN)nXqJG9f z+!x~HQtgFibMk@*8cyQz`V$dueVU>R=*^J_H5R6GJAmYt>Pu)fXGKKk;aq~^o&~lV z^_AOft^PACYIEr$P)^{1GiDr>YqU at u6M!@)9rX4TNN^^a-#f|Wg=67OmeTWr*_vu7 zO~(d9n5`aab7=8#Swof-aA%=?ZX`kYDUeFF0h^+p{616 at +jrFz$1k-*eIQrM25YDO zyFCC6*U*HkJs6-zNN2YCP{7yJ3f4N1h1ZpN13hqPYu0%)df<~+-uo_}d>W>^AgODY zhS9#zTQ<8;t;V0(YkvGOn at 0A3ORv2==6jI!nr{Po*WCxjUwH2*U*3T}uSOokX~MhZ zL}RT0KUhqR#~(Q*>R`P%>jd6R*-QpMsd8>WY9Z~X;Jf!h_oLGp5L%$^rv}K!o!A%y zUMAE2*^HEcU!bVzX+Q4Q^ao~F?%b_L3iQpyc+D-5sa>%!7WgN6ua=VdWk zqhts4^uv~!3E4c`e9e`&wjii2*)RJkiyIt1fe#>tMXBcQWwjM2aHohJoA3b_{ZMqg zv7zpa+afm^DAwpGsADf4P)OZMnf^+gAunS9_&698b&ID7G9+W|^ z|9R#Fo1C5K!2EiC+udo+#5q}`CzkFF(CCJ;ye2`+6(= zGwahl>vNYj>yyI;n-scgfU^tINw*0tYk*FB&&cHhFU0L^Qpcz-3WUN@<}z>cnqzKc zKkgO;M8dOdOA&i7W`p;ff~6?l1*~SA+$;T_*#Yr2H!RH454#@jQ-B5?5t_&d7oq-Z z7qOlN#~q1V)9?c*<%lavc%~z%>e%$%f|g!-pwk-1-lk25RVTgyfotBfr6i|l2p0x0 zD<^IrMWAL8n~OVmZu1=YJG+Nr?Ht at V`$w`B;P8oS^xQQDd9*X6440(F5{VkGRGo*; zbolsOjYs at 48d`uW%cWq~4q9g%pqZdNM$Sr79kb5uR$TJ3a`)3~u^TJulLd#1lQ=Jy znd|(cNTQk$n5#0*-F>2y_ai%94_&2Bij?D&3h#ozR^wCQRIE)4lhJ9k1cj1#MDb9e zYh5l$Qf!J6bdeJHMka*D9I9!UX*NA2$QE4o9xk9`++7j3sVf+fRI(!$kxl)9$wN-WiVQ at +a1+pe;LnOl?$9{nUeFi4!n; zB+)QL8SXKgvu+HMJbcEeyKmUaf89YTA(d#nPJ>pphuApD%=o0iQ_3XeZ;# z8dTP?tyHcUg>}JZ7N|pbIr-k7RpUbk at yXY=jRBMDgm?V z7*oO{7g#dIoQqYR8Lb19Z)=|x*ut;gD}l}*a1 at mBMZI0MHbXT-1mXK>2jedz3*79| zog|`7CuB6?66C?=WdZb3xQHxLhB-~B!YosUVNTUi4q!#*aRE0JlLpW#DG_dER at jmY z3-gK?w-PIFZq+$bM{+Xr$;C$6rN-;|#`k5L1u*Ff(ZyYGur9|_#h-k5FqGQe(i`ni z$>~-QQ>NF_Va9S{2il zVX0f89eFxp4GjC42Dx at XdiY?^n1|69MVfU0akHrv)AfU~|FAwe*9?p5lqP%H-$4&w z_g_z-P3HYNM*^W4vjUwTkU=MO%Lv{b97#Kh*XN=VRpOkl z63g;3)x(#vg*VF?mr^U)pd7~aFMpSE^cNN)caT1~qGoJE8fwmBCCHO=$LBb;_#g9t z0iHUdgk4i0$ma?0KyGK3CeqD$U$8zcS)Y|Bi^?BkXtY6TxjOxb$v1<&&n$`KnX_n4 zr`rS{)Tyfw^(mBZx&!Gp*%`nFOR-5Ec2;ayCI{;-5p|A2H}X z!od#(=n?fl1pd at GRdk-wZK4QIg9*|+XvI)ih3PxkqhDUdoTRS!6i^J-2_!`-E}>gf zp)FD-J;Hf0-wL%n;<-5Nh-W?mHjJktIQ{r9ePRsnBV%0qK#?11uf5|C&7ju-T;3C} z*`(!T6ayzwig5zLA-a&f at Tx9;s!W at dvLT{yE-Vp0K8*$CRoM(^RjzR^ z`7H5K-e8hYY0*|xn(`~A9i|9gBr_Cfc5kYnUw zj>tJ<#ub at y-+HY&$3?kuo~i^R?@0{o(48?zr_m(Eg-b+)wR~gwhh6A#(B3Ye7b(iW z)zHF&EHGv2>w{Jl7W?pz at jRl_s~GPMu-j`;Ac=2Fdnwct4NTooa3FPj|$V^!H9-=nd5EfX1<$ciZd zN1E$+_Nn=^fI!aD9yuUJC3BOJiZF0QdUKQ#bxm at 3!|G0dvqx}JmegV_8R3l9C6%(; z$bQgcwzrx<-G2>i&_-$2(NoZ~iObVLe0Gc>Qn(2T(f+k3)g~C at ju<#`W6U;P8Y zT)#*k7QHp#*usmp(mAxp at k-UcijNTAPP#|!LDsz&7pA$*e8=g52iS`XkKaaln}#0} z-0r9!%LNkbG at o{)WbVVYh~rIfaVo1vxKUeK${qdNHP$$^b$$f}-~`)^bw)Hz-a1^T zdj-?j&l|_+q--F+nYfZ`%gH^QH9qY^zaqKv!G7t%n8HPp;6vOe at e~U|0&d5-!8}L> zcG=_KCv?hy5QG+XA&#!m(3H!a?|_X=z9n6U7MZ8RnkkJ~a>S)*YB*rqGDc?-`hDI( zhVz&0lfxIsFMC#{oj$KE%nq|jG^L at G4=hr at b(BHT^mKJ?VZHgk&>5gQv|GGCMHjlM zrjgAik0&5*G5HeqLI1 zQ=?YN^`qh0!=#QZh`m~ip{`Ww0ucG at p`wB4+)C~2T8o%9q7cVF4zEM?Np)XHwAus8 z9f;?_-_8vTm{ZnwT z0y748C0e0~h>pq=Xhb2On$ah`7QEAbBwsGgQ?x}s*k-$Ll#*d{*Ad(1RS#RdayJgFS2Jv2eNv$f6xnB-96b+JiAv=aok5!~njmYqh`Qro}PT z2fx~BbrAlBryYBfqmy%x;?=@)um}8mZwH34qpgr^8~C;ZcMrCWpx5QrY;R|}y(`MR z>$O4e)o*3N4he5J!r}l1E}T(x7Pen|lF!8xk*BJav7knZYbM~f-y+?V9yK?rqH>p| zJxgDB3%+dV_(}$Ee-LhsY|);+JfLe$T?9sE&)U6(NlCI__X@|jAR#yf?M(}b9nKt% zw;I1oK}y)i0=l9I%d~Es@}=nHJ*5Wugq8u(k{U9QmQOymtm2-HJ&y_;hPRVBi7U}5 zIpb;}L&>i(L&R-i#yGPI@=yTcoyL; zk%3_%r$a6AY3dklGDgj~v%7*74Br?; z^|S;%VVdjNM}CgT*E;L)*Dw3DJY&*?C&of;9O7w}UMimk;Uc_12%8X$M%_Xnk8@%+ z*=(hL9OZU`KtSid8=-h|GkjQk`~cRg(^E-aK=}vRUlqkdA%6I(ZOeTXvS%C*%B|~f zU;@|t at R}RgyWd@~c}}~*r(3Ve1>az|?fzkk+v&z_A23&LKZATXRaQ|uqN+~cSa6DzxN$TSFJ78RFcU8@ z7U(T()8XL$T at w-)8O`0k&(SF1NaaQ_%4W)vHe-fn~OKkzgjd#E{) zaB{*`ERa&Q^QgaZ|K5|(_Qy^A86x}jYMbc{W?5JE${%vqp;D^UE>*fk!GbQ8Mjic| zM(~U#b28$USZ!RcKn`4~RLhw{2=#U at b}AtjA&2wk>plfJ1Xns*zppJKa at g*D)LzOR zr7gPY*-{HK3F9qI=C@}W6>oi9k-p4C3D#lY2eizDB^7yoaS9+%*tcLc#V#JbO&2hQk3*gf%e zN6fjOzZF#10l$0DMd*cLdZS6#4 at wtp+35bZ1w2)&N8xV}<&2ab5s(%Echp-IBGx|c ziwP6CH}1O`BE~iDTL&FkuS}ws8j}!Dqf0^h6tqo)Z43k`NbqwtG`zV8lEw1!5htSG!$Q2K(oh#=Fv9HppTk-tyIIP@~tZ&W2W zCd-W+LGALTPYRb at 93R3-3a`o=Ne27n!e=5qkgB;~a$(7_0nAlA#ceHH;d<)$2X~Y$b*)Ow$%Wy>8o`pFG-_2Nk zD!R`h0C#f|-aquIFx9DtNTiQ0oFhn5_S)`NRBauNY&S45v61`4K|Sz?PJJ^R zWMQxN&3CG?1S4X;TtZ=}3n!OOiK}jJBj^#x3BK znYK#FXh;|t6ZSCx$$bMm8=w>sG=K^A!j3sf-m?_17UVF`?YC21#t+} z20oO>Q}6eD>k)RM)$VqJpH&8Y1fST?AE3bQ*<*@$~dypbF`qk@)uOvO`H zbe0oWQ>v7jAU)C41bs)v at lOvQuQZ~iIL9%l%K`!?c8*at_j$2maJ zOVD~xYYf>3V{p3K&-&OjI;muedlL=#;K3^rNh&t3f)R`h(sX-E#Gm^drs5$xcq6!r zh7tQaz)6FI4M%t>^gACT-A_mFueH;8*=*;5g``P(O+#^k=z*C{&L<8fj361{pG!?u zG*!gehp#Y3zo^#WHfa^Sjh6aM=K?!R at l>mAkf<|)OrXqX{YLx(M%>x79IB%nx%I4S z)nk at f>ucxqX>WQE5XMKT(>L5fnCiu#D?Ta~?m2R49bzZVca at l>>+g873^+yC=3&r7 zz#`n=#TCzd>LKgHm-B;c#~ZunC63<(?|I{AN^l4%)FKSGlYE587$6Klt*_og9N_zA zqC3bo;@;?MdM9;6hS at v@&|X~I)rSd&b^6e51wHe=yZibt;a3nbhBhgaPQ;8z&nql9 z?$JFnViFlAGn}5U$i}ga1nz5_Bp>t~t!xc&?0rsXKZ%NnbMF+y=V;4}OkXFzZ78Zg zzlH at C#7D-5!{QE)t;Dl;5K+{jlXkp(a-U7+hl_lJ!0j=TxP6zi$|2?Tf at 70lrA6xa zB)SW+mkJOOkYKIQ+B~>0S0;|XB{!ahpJo3c4njU`%Jk;w%aZr|BzJT5jZ#eE*!&%9 zIGvT{4lPjSofj}h>PSDX?xP9{p{*Z!bgBOxuqOJs z51lO(K^}8ZUXO4JQ(dNj27D44-NzTw|A4W7lu1)NsR at uI8Q{TRvc|@jE`z#u_ zCvI2WaC$_FxdeEZRLr--Cu3&6UkH84!IgD$3z+A83HR~I3o=__*as|{sYXg9Dy)o% zcTuBd^K{q$8D>N5SZ)GC9Jf`phF7f>aCnShj6KG6F?|R}+!Wt2#;+DlnG2c{>p-wa zD*3(VIxY<37x{8ei#A(V2>$~S+_0_G-xn(S=HbZoL(p*!sir9?O#XvychpBb>L1t{ zfSCpfaKw1&;xg(te*>Tk)D1mY&{<=ibp at gpbnTJCZkHr4r>% z0EQ_8@{{>>PgJ*NYA7IGwPxx+pAOI^5iIYF6}Z9N9a9qLF{+|k5p0@(WKs66>rJ5E z076ab82nAd-zU`&gew`aS1~?Fn?X#V&eyA8mZa*qkA1{p=gNsfRk zfB=8gzbE9w#gG7-8c39bG9J7k1j)rYkIVq=8e|KayB{WmsYOT?unE$$e_Ckc3xbEMzN z!wc#Tz1qGF7ol9>LaF~NZ25803Yqs)(a$5ZMw?A6{_?|E;v?dK<1J*nr&*eZhZES3}!A at KOaltIhFC zYtma6RVDSpB+Gd~^8ve3`S(z9_ERVe04qkSux#r=kt{t+mhz(I^aG7U<3Z?y1{0xi z;X#1K1ylr at a0xJBoq&Z2kujmALBs_$fe!5t_Dh*{LpzEakyJy+gk3iD5?tasUIho< z*F)#G?LDGu-Sj7AL=O%(E%Rpw>+%aTrNe_3NHC>?Lk^M4)N#+3H)|to6*p^ZYSp!@ zGt8)TvB_R9(zU>Hb{nF|=GNHH94IxhtM!H1*p&aiB%@Ou+9)=DN3WJcPLfI62%%dZ z=cqz!TpE at Oz_IdY+es-1)v)ta{W7PnqG-`Wre@(4Ph5uBsxJjhYTASmVMi zvCCQnO8G(E4MX23ub$tm7kNua32Ilfj)K#wW)nv`p^W>YzXDAY{XtQChe#!^yDa>>r%F0QE7CbZZUgSE=+{0Mjb};Q`tkS z2Zim2rxRnxmzODpw+;$H6K*8dq~ao_re^+~j-n!)*wg5ybFDG#k^QY@#Uq6%XQ1#M}(o7^W1wE&W|!Shuu$g$n)Ct6E36DvMLx>;JG%lV=ZeE%HYalf0&X^%uB6PtdjZq?Zji zcjQq1z6o;$(Gi3}RJI4U88}0 at dmwER2F6^N`+#+8Js$iM^cVM}&NH`6UBVk)iEe~I z1zP^^;o^O^{L-VOim^U at vCOA?p*W{6UJqK}oCm)o1)@)?K at 7tJ>L?jw9xCNhO6kg>jnVo1oH4homLtyaWUdW7)^pd zN0a_24O(n`eYbh at NbjiglGWwUe>=5JXlZA}1_cB}fei#C at IO1wDd%8pX8r$v+P_9q z+YwI_ou6NKZjpX7YAn)p3c1xZ9>d3EA`V|Vt$1AJmlt0ny*P=5U2LAj^|UK3KYyAz z3J7#YeR6$Ry at N%futGO@<%6iY3b>%sCy=0;@(855l8`dmr;wAOhoWs-8avLZ>0i6o zJeOPF*X`F6%%6|*OQ4s19W>1QUaHoE3M!pDSG3zPR%9GMp<&2ksC{bz&ouwMXk%P~ zVL`$ZmGt&SNzYp^WWwWMS-o#ly}d(a07!n!f$AIEt*^u|tlpm2w-+k%N+6m`)_-gMMRff`LqSjdB>_%vBtf9^yp zsnbhe)*@w^PPX(ZCJFawJ2w at p2ZY4bMniSFNI0O!R`Lv2aDi7~VN+46A(JHBsrve% zpC-#D?ypX%RYGGXo at r@?-0 at m{i4+p#YW1Jf1WA}u0nWONOl{yzex=eB5ZSm?Gb!Rf zWj2-TjQ#mm*+ at uOf668<+^E$}&rSTIun%*@gqn{3hM1HCuH+!5wNpt56wfD{E6uAo zOUv at Oyf2cBvuU6)Ph at __v&HDNN+VL>jH3_~d_$n=8z3Ml!^SyjOwXyO_y7>l*!ur&Kvjd6Z!(vsyno`@@~a>_e{}JHs2fqDL#dAtvjSQxF#I zAgKCBj(v{ePmoLlUkR2>Ugk8`JlnRKocgL2XPcG~W>OSyrW~dVHvwQUX*{nG7Mo)X z6KqS>e(kNga8B1bM{dvErxph5KI(vG%*34J!B2GkBEk3!!edh)0tBJ at i>u|4jJv~~ zw&Nfw%s!)#ivf<-CQcraw>4LbIKYjm>`%}{bJU>IMU5z}dJ4rPh?@oRHAR*sgF;GU z49^1IvByMTclc8j;Tr*);l^tIonxkos>4D`x}c8RKooqI%|q6ZM!P z`)#TSPi-Nl1&dTl|FraWEMLiO*>9o2sqy8y`=Qvg)NNSfMiVL4Sa4*+!YvQ+>W|Ye;7dZ@#BvqH^D&_{Ji3kD{?_j^Wdicr4uhy2I z8LA?;;x-4<8ykV!riwluu1#%{w}6LoOO61$k$D at 3Z2QcsePJrPh%T;jj5ydF)hE at I zg;fpdOA&9CA$7#Gh4>%uWun8Y%U6Nq at OFaR#IGRn?J88ynqi z$4#Tohn0$VzHE(&Qx&Ke1ZeDOj<4#~uJalb>-*_;r at xkWSYOz`ySVrh2=H-n z at Z<^cQ5_90S`R)M>mI50R8yQH)zRLP3vJzoq&12KDJ2pc^Q+6|IhU^WxMiVx9l&|U zbmPAyXj_ZGT|EZk!@Youz7c=~u7(SSUVm^`5WN~$xC25g&bn;mjhcU$_bt2eA%*Iv8w3kdZ< zI?dlVSTKK;@kpiJ;L>>jUj0_{NNK;k=d8eA>BpD1`t$;Q#$iSpP04Sl`ebvTR4Sfz_m0$;4y1pI$Z^Qd+z_Nu zF%$el6FzMx_ja|+YS<`~E|~E=tR&Aus>OJNQ2%Vim7Ym*)``|}KcSGnOeoxJnVlwG z=FNQSPM+)%)BNn1pNx}pl7}-2m4$Ea(ZaSKas8^hF6G_~Q%({LU7FnyI3MQRxrZPl z2zyRWr}jES(!{H=2nzg!WI2gXI2JT6{yc4LAJY#$VD};Lc;z!_IJK;N1;8D;>xB%7 z$xvcrZ#>??|H^1~>ChJPp3AnnCZoN*fNpj`NN8cy&LrrLxjX5n|D|_vwdMkPpVxoV zj|;e9VZO7L{Iu8P6FJOow~VC9p4dQcY|U;>ZfhOuvbrSt0XKfHvr7As7&*GNO8g15 zf6qTl{Ru^W-<6v9X()1xSu6}?>$nBx;kqn;#d=n0-`pqw@)(U(hCtPb at pM3OXrtqj z53kP8=&D9Rb)JuFx3biavBx~bXBg$xk0A{)9(&bq{%hYo#w`)gbId&|`WJ>{x4%cT z5 at FGQ>O!Qtlwo+Q^Ui=u;ResmMm{6_38R%xorL54qViQ$BM#;$!tRaj`JDYSC$Z97 zf?H{ZWJP^0t-&(EtsWBZifF7hEH-rj!qzAly}pU9jO4VxQ!_*Hj?6m&t6P!CwY|IH!g+}8TlV2 zWS+NFCOL$#<-L7wxcTRN^IYb7`uu+0pov0HmE}xmqM!)IkVa6A<)e)$p5EssP$hU` zxWmdP1Unq;hK`M=SvjJJOn9ys2rY18rj1=o^jEflPa!^eH%Rr$1ldqe*enPq$$rsAJ`9m>@E*!PjZ!w#)$Zbhpi1clYX( zC}yWORcwZ3d?-lITL6hx_O?K%3^zC7JUITKwJOvr1DB$`Pkf)o@&{SPP-;w^t8tgS zRhBJ0Tg3QTl~uc4$7ux!O&U4gZ~&YU&~T^*S~7mv2nGVkh7k4ai>6FxbU{1T#^ zE7GRYjx)wsZSS(Z4rwSL3Kj;pYp*CkokJTgps@;-8LOFPKp>rB^0mYMbK&LyKP073 zcFuy9Ixo|y{abLFWZTp>v*tBBb1Pf?wqPFP^@k9}*Y#fF+`#^KI*mklZ)P<_^Zc3) zw}Ulu3puZx17#=GqWlWR2+rANBA$SR=mRfK@`S0B2^79pdz+OScrQ;#c~(&6>^{dk znn(fP)`0%s7d0<$;@W(Htw&Am0(LREi-1pZq0~@C{92*p*+OYx9l at IqtEpZCcQw!w zFQwc(q7zYQTcBXJyue1FC*ZI%2jHy2%!tsWT_WEa;JoTRES at puqoG_i9)(`8B!Mg5 zzTU?2I#&rUitY zqy|7F+%+LfGYxijV?Lj9R=jlLf9nS^ z^$O104FUw at 1^IvDE|&i)(7O9CcYWVbZR%WL6>tp at Mxc&yPzeqjl9E9%6C*^3+zph~ zcG-_CCf%gN`-|P{p}Lkk~US*Oc*_6Z&59bx7=ZuTksQ?4f^nfx(~$|u^JEhBiM7tsE*zBf960rYPM(7Be3 zE4G_4X_?|nxXEtK5}D4a)~WR18JO4A=_pYt2dp;xzpViKpr|V_P%H}FYpC63uR9 zWnoPiYo0Riaqlp#2-jm+!v2R5#fTonT<>#11qG=d5yJJaBPn|>Sqza&K9&%Du2v4D z8hDh_aqC5Wl%8KG<}mpS1NCatx53w?H}a1vu)laKe-k%>$>~sm*bN6nD>~o z{rP-b*9VLhh$GHPG33b|1vD!*AFA0(9HjY9N;smO6TPTI978QYEx{D~2)G6DpAKQ3 zYCA1Ta7vVY{B)v at SsiSr6VfxDECTWhqi0S&CwJFrn|1?MF<8yyuAn|

|FEIU!9Ow49$x}us2bIYz1`3}NF zRi!$tvm=&Dot%XPeI)&PPu6tM#S;}SQt3KNH5|-_bt|bcufL$E{KV^bC)UngDJ8IFV zf53cw*WK-v|5VEPegzN2^;qEJ=MU| z1+SwWauM{R9sVMK4R)spCLAt+uY?yNXos&$RF+&+NNgs?VZvNrm_*5`%Uq3%R9TK* zOf1B85OtiTZ*M84TA{3C>`YjJp3&7umMejZMwBu|5N&(N9AL9L5wg9e4C7?>@laBE z3N*AhY%7yq7sK=}eyr4(O_pvdeuQo{SsE`V)GQ@==Pu%!@tvhg>pd;xoVcl-yG1=k z+rKhRxa=-ofAwZw!5uNVy1}V2CU>0)^yy6U5kl`6zTU2)iBjt at V9FFfiAzx;DWVdk zc>KIeuX^_8EC(tf`_!gKa|OBW&l^k>MHY2yvkI+A at eru8+&5aFm)2 at vSpw*L!G<%# z7*R82wd$mGN2>LYU62GPS5sHN4?adBU8_l1$Kw7UgW$XZCFo zaos$U*W^(07?B{CAdAM0Tqg3ld{~O2MswNe3l16ec4BSoP8PgbUUoT7ok*Et(Neb| zM`4%VckH+EOUDuwBCy=oaC4jp8+n#3A~Ywjb1w-ECf(B2SIQ|6>&m7=WFZc}knPAF zjwr at pUy76!gAPuii1xe`#ZO+)XHTlfhL&=YNa#hkwzXdt}Iht^SbUc11R() zyy{Gr6cN*VDHFsxKf8KQ%I}3Q)M_tO{>^mTh+GIuWieK*L8-SgEPrj6k<$bO0v5?; z?Ko;N-i`qkp at PS=GRPiHc at kSXm^kcE)PgJu{tx&VN1##dBv-p$bIN8%8jD+wBY?{xaMNz83*V5HFOdz$mJ{=8 zM!~0#Nw1@~q at Fn#b>)eo40$m8rrV;b1O0oCb zM}5X1&;Jw{ZYylPh_(TWsEA5 at R1%93cWKOK!d*J=)z~`{$Fm>GybaNwNcIm`Dz+Tf zUHwKvFtuxr#CYIrdYCaFCv%~isTWNJnGqoVmbx3~YM_>9+6B|Xscz#h8UkA|q3- at p zKbp`q at 6fcI{Iu())0Q~mKwWt at sA2AWThEPoF~$5iVm=IM%DG$0UYk2AhWDBh#YhAn z!@D=$torAA{y!Ff9b!F;+g_7{cw at wQb!^uPrrM5L*~V>9wl@(Nj1G+qLs|~723WcK zo~0}0{9(lQIEz?u=-oZ^QNT`B;iu`=z?@KmYg*xLe-V7X{|L4BL at PX~?4tk$ukIr$ z=n@k;FB!;1oj zPR@=7M$Z5LI5@J(H at 64Tfb7y@s-&-p) zBQpQVm1mvUxzC9cJKB5mKS6w(>4{vc-*!rS9SZa=nk^ zdi~#V`&=~`N#bMoa7|RE%Em?zMshGve6R*-j`!0?%^hiWYd*H34*1ZHPVO;MPqM9OAQT5ASln4^*Z6+t7LXrwSflYVT*}%M5p7j z6E6UYw~=b922AE0M=Je}P^8Smmh1J(06UcFrAxJCXV<|=&bJm*^y6Yi+PU9QE$XlE z4(HYJOc&B;k3L+|BGm?7*le~V%FfybBpKcX{ENz at +jK>0t-0xdG(1~&NQgu>Hmh7! zqEg!>oz^J5rZ*EN?ymtAVh5vXsZgi2#rXs6bRm%$#flf0ql75#S9V61Is z&1!dtfADf^f^)AOh?wObnOZ at ruVgjjz{&}&Ym`l3XbrNzs13Tm=!Mo8LIVJ{=~QkkC<;qASNSU6N^F-_)k=;! zvs-%AV at 7rXV0V&ZRypKJ7jeA2S!tRIni9$8rsNE;%PLKi%lo9febm zhYv3DOlK?kY_n$9T{8Z>do at d7TNAHuWoWTUrds&hBwMm(0(;v`o|TX#ShU`ypgx{Q zwqLw{2aaBnwDg`zyIp3IYhwioWUC&WrRwS?Zr2}hlbW?D5g%5=b?UNRBwS at ea0l(F zJgK>Z+L6aKb<|*2J4NtMfr8H5oNNx}(cojMf9gy-p)7ERHsoIHKIa5*!YG_T3xCnvaa=6FnHcvL;VQq at AvdAIcsm47n$el=`eW4!h(7KWfW7M5b7M*{i;NglKxCPc(Lp13TdP8 z2&fwEZUM+Y_zA})Wel`3FjU|W;P=c)IB>C5%D#ZKFyQ at PPiiC7IbMk*WP9UM3D05H z8xPxqH`DKzfA8)fJW3Tq?Wc<%75XKw6U5StFvx{Ml`sZcFHsX?9d!8JF`2u5=lA(D z-N?^>3u~cj4a9iV-n;Qb)ey`onvoOL?k?qDy`}8jyRO`$L$Zi&IAKG+5ZktYraP{* z#WX~2L9Kz7|egs>Wni- ztM>2R=HHX@{}Zi at 44qBs9Sn`F4b4qyE$z(g{~e at cWo6;}1rU6- at rNS{8<{89Bf^si zNUj#mHfT0=En5floo_%sDC$WOoztJ0u8nhR-$D97{~#EKrwW+cPx2fWFVM_!EBh2A zhfR>UxfDS|KDZY)+uB0nnyxR6d zrfkT9f!9x)SlL!+dS$*!h=5Ig&;Ho1P`6?#-x3jz)kQ{txXA%(o~nN%pxTFLGu#m=@#BQ0} zB@}|<0qAN!UA62bC^iTy6voz&UXf at O@t=il)c!N+Z1z#Re+V`<#pJNKWyh1*T|9_7 z3`Bg^pA_+aqT9}%#aVcnH=Tl2+bpEQH#Raq^UZe8=Co_^y+4z;0&T^?cUuIX1CB*; zRp`-fZ21nB;B{!S%B_JB|GJ_ukoiNG^XG&ZqtfFPu zz- at oj46V^cKC?^AN$>n9-a at 04JMdiG6YsiGCCA@H2r=R`yAbKMTmzqMvQJYAOw?k_L~N;|NFw}=x3^zN;ooJsq*$%Q(+s!y2kd7BhQcP>2Etl> zJg|EUUZ^A at 7=&S2jb@}PZVM4pCqk6RvA9uePV`twM*u zaL)iVQW at DiZ0^r_k^9ro8(UgC$Xb(eL6oJQz8i(8w0&A9yaHMp2;GIVaDU*^nwhN@ zRirlYl(pq;rI&i%O-xvAXQJXTc2o-s^4mp$+u;7N0Y{i^8yuR!LU;0N6}CRwN)0P@ z33j at OWC}NLpDH)R^^m;kWBc+e;RAi at EMWUHd3AWH_3@QR;%5AKG`h836E3VZ2>5wJ zz>7T>*PVL5I-YsW8oDELfOTG?zT2kz!x9iYBECCR2

S0Q71D^d4~t6n3H=y#PdqxcF<>B at u{2At3!D zh_WTpi<>Hk1~y0sMI|9fJ%LK#hmY_fa-Sd$k-Xf-K1Cwh2sq5L(v)nZXNATr@cr7_GSYa7Ds8basXRB53rJn2Fqqxq&j=f$lOgr?bmfu(`p(%_+)iYpok7Zo&% zSLg#hT0T$62JPwbnii5W${NLs*b!tK7;vH7B+G4tyf`yQ)glu=$3CcDm%|>y3VN2^ z{Ilh_o;F)t9FK4Z at 5kPoRGy`}$96M at 2X}n{FA%vm0&W$)t_}TDy{{=GN#wsBRiId> zHOq6|&V^Uv*9Gt6S{?fIi`|oI&*T!%i$$Fezc2Vc{g-^-OI*_=pE(zJWjkh*uFTo1 z-(lo5Z^^1XIwh)098Rft_GSu9aw^-xq+9ZD>&@q;W(t#d)y39A?KMMmJ+_E0k(OLZ z5PYGvLeOakfEDrftzcZiiBz((_9nsZMjXs{rF{tN3JLPYdS&`ynYtt%I|J0*5DDEN zx!0&o6=6{du_(k?4MbfN{4dZm5wS^&y!3kT&O=5$EWPg5&YqulGWi>WyyLjRalLZ{ z&9AGiPp=^_&nJwZ_0;E7pW)8a>X}y-QC*I1O)Cyns at P9``p2IR5p$qAbj-oi_`jo{ z?oW?9!NLPIew9wBUAheY=*D(W<^L9+`u4!9FUQD9PZ-{a^EM80JAi2h9NncyG6dFO4ogy$Ij3ctUU_lP*U1=k+d zwvjDkm#`YD!)`1}md3dt!Nm>NjP#=UTn$VkG>$bo`_+<5#{HAa5%`|PS*V`wO4G5K z+7INs?EaonnPuX~_kSZJy{ykJxWGU_&;R3m=)aK>F;_d|e-M#>&WFa$N(~AijPzF9 zE~r(i-W&?v5d0BDuWf-K5(z0V3jS%IRTq*xZ70K4-IMtfzb_1lJmx#AduodP_te+% zpU)%IK1es62VEQHCXvhvbHHG~3E6QFbw05l@|1~%_ at HV;K64B)txbX?;HmFfO!znX z>u${)o7|yq_Gn;YD-m);6BGC9hK8YWp);WSXn>rqN7PT3g47~FjpME!A=0MPl?EQ> zpx(V>4#F;r={`e^)$dj)aGaOes-06XA6h zk+WB44LYevMYZ&@b^|0q`sZ)1zYle%y% z!E?((#R=GHf;p38lvRB0m0&zS4>GCcxIJWicmnjwFVd)uw6?#rJBqPeFLt|vMV;X4#<^T zApXDFRAY0qsu!#6T|PtKC8x-fkY;e=?#<*M1EHvr#+7A;|bLV{n2KFDY&m`eClf5`Soej zdFHB?Ka3w(X4e%I-9cKETa5U0Km&zqfog;?f48M+JE8#9{m4PS-xrk%Z)`7Lszn?M zk2>81BCE%t{kjb%XI-_Y|FOYd>rF^i8ZUvg(Zad+5(+SdNtaQzS9K;jN~tA8?l at il z$nzZ1({_~=J6%0>cXx>L2~+Ji{;+=l#ROw8hi0SQ#*FsNv&RUt0um`N5gl!r^@TF% zPyqaW2qkPWLW%JFRAm{Z<4H at uWt!V6fjr3t-m2DSJ>jZ~nTUf4I1m2mQedJ@|4u~C z_m(^$(vV0PwJGY$*h>YYPqtnT&Iq$KNcw!0)Wui5+6K#>Y6VCYNhAT(-~TAN&%JgU zss3AO-ZP(R?b(6`BVB#>xPCdwQyN$V#mJ<~InQL)6gbK@>zHoywiy}kq zQDX?+n7q5VO=L`Gl|I-7K*umRt#l at Vr7ynz0nXBu2pkNH0x&G<4^|dE-&Yj1a{c^v zVj(vPYqpKot{&OBm4(VAa40#KU0HAxnnd6?e{Zc}!09xQQV3d#PGsOa#Nk(OsrvOQ z|G1t}U7FmcekNP+7Q3+thlaRV2+LzAEvzUJQwJS&ZQedRFAp!m-OVT)K5jKH8v|A; zjf>l`76?<}L9bbpm|WPr^iaCMZBWk3QmnLTuxY_35N?Q1D{iqJc*h#vC02;_;x7!k z*(R4LCV>)%eOkyVvH;{MaXD*}&{G&vhC?t_7ts at mW5^MdDSJ)S5y2q4v69x?tK4a^ zSrBk+P^jni8NjQjcF~R3PhY_B`LDtm{}>ln+l#Z)e{seQ1PF-y|7BeKhi1mS+$IAG zZ%MvogNqApu&s at 8^bgB~RMkywM0$%PD%XR+iUquF1F*s+v4}}`Si+E at BHunfs|{BQ zB%=f_>4 at 6exLMv+zTWSxj~{cQn}bAp?`8WjQLgx?U9Rx4ku+#;S?FjKal^|>MuE0R=1P~=*o#<@|a4rC3>q`a(_(%3nS zRUv=0C6$R6wI!3uquoi6ho at Nzove$0b??=+%8zY(^Ww(Ji`saR>h9!!67xP;~n^UXPN at D8^ntB{Pt7y(il=!Lz;J(DW7IgyrFaZ-ml;;2O=9E z9)j)~(Ste29Lx-ChDK}n-pDU7jfGodkeVmIOtM{cO|g(^_yzi3JpwC7tnLOB2q+Hb zf0`!ySC9Dn8*(8h@?9cy=)CVeswcoY^h8m?vW2rHM?bB9c2v$jDXQ46ZWpOYV7VP7y zJPZI}*oiu3&D!7XRa0EuyxO8>{Uu*5(>iA689^@tv9~n|^)TFdnj0I2n*ND6YExad zFQ#cYLY0*!XSeCrSSwi0yo>erQ?rx`HB_g$t~RsmHvZFf6ErZdr36f-8zubJzv$;B z;&qhgI4=$%K2L)z8;6}7quMJ+Qb~U}HHerX;POfvm+CX{f}J-^@|e9tJ$P=KT~(QS z;1$Lk3awC at -Nh!gY5-D2M`vs>@g`|fd?Hut#16BPrTl68--~?{Z`}k-BoZx!B1tUz zlg^mB2^tiLJflW<3SI4q)@61ah$uz=IOu>CPJ>!KrRExMimg{jR1;8*fz9X?s2(QK zg6)IiO>()}wd|&MF#$F`j%29w%A1y~%1xsenoWz|&-3_E9E)|RG|8N^E-)SspNN%U z5bzTAd*tKyH6{a|lu=629JhuWOcgmXcA#ogjo+7*o at A+o$@HooTYf#Qahnd_!C5j? z^wk}pd&DA&uTgZhOmYuH%IVQ>_Gp?|mzXPg(_q&qn(#TB+ic##et{?OQ?~t{#0X>@ zbl(3QN}-B}8_lC^8!kV9OU>Id(zOSEOa3EQrd@ zr8h#&MRyPxbnqCVN0p@(+s;$ex#TXGJ>w=67D|L~(_xszr3Z56RsdEDCBD~sWid&H zoq>S9GDc{J!r%Kt#vU{0k0W2yTm_$il)i zWcg2wK1Uw8S^4l2;5V}1id{-Ae%VTzXN*4#5M&%s_jD5fF

wL&P9wurIIdzRO zQT0Di7MLP1BT(ghBV*$(c6(}rpxOIENp(nv7#nhi+d{UJH%`wyEZ}o4nol#=-UD5} z>!mPw5yZqxH;Tj;gLYwkpatJETb>OeoPW+9d#*)ej*7K}CdN0ajEHq{sz2emj6PlPgm&GqTz{ z at dx(XesDAVFI{QhC;ZofTyAE}LPnRhd9s4$~-I6GL5Pqo6yzI8FX}DQ~H%xt(D*?tEyQ?zFMRP-) zyXQK=^BojRC~yz-9}EWcF2c at t5hT<)`Zk2sEG+^^d|Jnaj`JEYdMeV*#_ at mK_M{oWu1Em ztKCbi*u5)okdIn!^>!FAt8V8dm8(O!SEogWh zL|Cup`CqQ;>`o>H-Q#YXU|vs=*XLWm6b5s+UIV8VwVAi9rk%4kyU275TS=-^+La%} z;>5}Xz*ni-TkO;}PR3f5z$vwFf^qjW{>BH1I*TC(GE>vjj54MjE#vDc`BfHT4v;io zv&T}YRUOq4ogFrxJ%IbF2USN at VXB$~X+W0wZjfO(6uT5jz?w%DB)ky%Y(36>(^XM> zS}v&HaC{9n(VskTvaFRes=|fE6~c8UGR#ItpXz;VhrehQ*pZAVt~pG*Wv0;7XO zlkQfzCA%3^vgESBq=ST`HBaVQL;*GIEE~Eoe-6_5|SbT=l)L z`ljv+zxD7^*3E$TOTV;qD at w%QO0>ZOnF)!gJnYBe58t;Vy*ti=_uzWuhmZLY1bZV1 z01R?E3`XiWx6tg%gTXcBK7VV!GM>+nJLImD>(5$GNqGWc at 5C|*`vvI?zR){zq(sV% zA(pwJq7WIVhV+8ZGX_b^grF&pj43ZhC&B0(0!`O9b&|8jY$ztXSmq at ZaoB@07m<5f z$D*SchMBA;EdovA>YoD}k8LY^0%*b8tvr^$N0j=Qu}k=EcPS7c>Kt&HKGv1lOOl^)%4~lWXvG+ELhnSu3 z^$!X(H;~r`mMJ-b_Cv?_oQ=Ch;{9n!YVIFj@}B>@;J+t+1mV+6l>Xvd74-j_`1ucf z`)Bo at nyvGu2!fx<)T>NV9(gY;Chi)W zUX1%9Yp6;p-C38*pT(}Q8);Z_wVW*{(3`bTm88lL_(YKiw_1L7iw;LJba0E#~xqYZ_4TF)>@1meNPRv>3n-WO6 at 2vY_abzqf0 z)p}XEQzb`=3?D<1Uz|>>oZf2|*Q_+vusycmN;}2#b+>KTd)DJs7nxtp#M=r8ea~t( zS`MJWMve5Let7C3=o;n+OVOVd{0;7*KxSuEH5tD9il!eBhIH}S5~|Kz-(&Rf?tAGt z^GrgC%VdvEe!wBeN|Pt3#?)cKw!y-z-q+8=FJf%gGYn%30)*9F&P0ZsD%YE2&csgK zm{)3$CFA`!9908Zbx!T$dTJyfYpWs|b|{4=*{gquR#%>iAwOG~Y at _!Lvo)L5Gb z*~4vm=AqUt=yRXwvEF#>cWNyj!m)1gE=0lM0C43Vd(TT>p8QfjDG0fwBR9zaB+XL| zLpVCN6_i(DliM7B2VwpBe@@4x<--6u?z=P`?m+CW+~JX&t;|KKfB zr01qxjenML#mTuc_^q_TV>+Nmy*^9SVM|6dPOm`f%vklb95;S9WhL>V0z1O~ zjXUB2$EagaS|}(PBcN(O{hpn&eTw}YlT&10)FG#>@7smoGqYvl7>Sndpn7hf&z|$# z_KGzz?iil&j$CPiY28?}e^aWkI*i&Q?7$`OkZP3ejkRDFffw_aeb_1Ty+5&c_yax% z>Pv*fUD4<`=nk$!0ZF%9jq}tES?IbzAKQ_Rr%osuM$swpy;EP<>21OQkKMzoLSoio zY$s at IP<=pXfYXst!o{;=XXh7z2EFSlKKMmk$33z5w3oS>n2nNZ=u!G4XYSx`8u(Z>p3ue`qE@>(d;fB+gqYq z;=8Vqv at t=NeyC0bBcf9|tW!H;pIkGl5Z$s(QcMZ1IVy2}6fIjQmivt?#xdO}lfQW| zLtYVuge`KQp-{rPO zm8kGLUN at O|F1Hm#;R=)}A!PJ*kb at 1Tjo68@zU=UP0q~@9sE9TvO!x4=XZfc_Pd2#& zu(OLfWEn|uFk?faYxoticf9XN07NNC_&I!PYqvmBvosuTG)4s zRrw>L>?{QA$M3DW$DZZ6jy~}TOZsTHdbX{{DWVZs9O_bs#sOew=B6${1^z}3fq>RE; z9H})GpwpSr#1WouG;?GR-@=icoSZ%gQgvN*o4bky&qWEWZ&Y&YAdcH^$eLc;o|i37WB?N{ zUr-kB_KF`KLNN*=vHKD1*T;#cs2c?(~vvFKaX zj%N+G$|!jfWL`4)mX2hqQt|;dSldH*%az3=b}k+_w`iO4h%$!xQrV z#fO>xgLY{DBcA$#14bHH6KE at MCKZ560+p~Rw+$ph0k$Mm5f(guWZ+DsOv-RHQ`#$i zfqtv7)|7Uo^}X*$|NY6h;!Ebz$7Jb(sYd4gbj0oLe{$*j@>!eb2h0%a^s|EjS)AR> z7$epguGLt=-3ae`d^D(u#%&)iwdkS8MI+XT6tK*J;)5`#h2mb=Had5u>cXyTfT6Qm zW##v~;R!Z at yxuC~mG>(0LsyzTlv%pQxue|s9wy2P`8V0|6r1oxqAD6pgzEx|^)m0C z%`I;*%ebrb!3dkX%d203O^PN{fS at Kbq|x|p4YdUG!&~u!I^}h$FctlXt#Uuvt$IeawRNuD;VRFb!)$@dpe`kG7I*H{(^60SvxEiS`aaK%$*FzF z92sI+$WEQB=@!2SM}xi-;<^^ey at 14$j+uEO{oSm48Yo4lEyRE?h09RI#yw-XqVRU1Zpb22Lhz`FPnXFuj%?Lw;_^&~qtgCDy$&1e zpcACKum@^o)vs__Fv$ms)8Q~hpQ2wO)f9LXYa_8iarKqEgnSYE%3yhW&S3hx(r3a3 z#-;6i4BMHu+OgylSuKZYZj at _ufT%48PCEs*Wh=uW3SUO at 85G$XyJ zc0wkMjTISbgtThAtSc;=B_u$)_R-+{k zjD=d}yI37IG~83|6M{K9jKqn}tb8CR at uh=IMpiCi+ueE{b^F- zQHyO%`IcAy+4-3pS}}=mCKPf%VST!HkhP(>a9(k7Xt&&7pW{*d`do6kTqQoE#zPl= zwSevy;%8i1jN8Q=@t{Nr#Zv^jIzyN`L>)6rm`3V!qr!AED!V!uG!3*$8gchG4!3ns zDw;SDwVTOoF>KT&`5{=ub1L2oBvjO7y}F8$506jSct at y`o5Axx`U*dc+nYh zx9memnOvJbD#OV(kt>WGZhql)*`8Y%bU)Z90=ntw1*6s3OJO1jvOpdv(2-OBoU at T% z5eReIpj?YU4;}DW{hfYOuv-t6rz5mFBxkk_F8N>WQXAGNp1ogh?Ei{8vm;EZL=Zqg zxtRZJCj6hcBWvjJ at 4bKSl&r4pj=YNc6-(<~#{znQVJs{xaX`{wf&j;2X*(KYD`P|F z7KwvQL5MjS%u6r}VJY&5O?LAkky`fJa^WEr6vqi<15`+}ve@@h_*=l9Ki~IS%l4U% z87r=6ewZ5GGlSE4hVT7-X6HBG#@oHW|Fbuc?+Zb+?O0enuDQ0wLoq{YUDfX7$88Ek z?vVQWE~TGO48Fel4XhtOZa at 2NH3ZQM8-GvXZU%(btqsQP-YbM&U(|v(W+;OPPycY&axY;~)D~xj8Fli(G}8l(f8srm$ab84uT#q-NIurcNS>BVFa|uQawD_6}{m z{OJP<$vEI17YQ7N^9?vLhcOS?X|=Nc`ew`ia* zp%}2D(ep~RHzt%NV=kAOHF=BI-?ICxQ(PJ6_2uUHN%zL;sC2%yUL{!<5OE(}ac8nx z>dR&^ID>xyWEUG))px!kwRn+iH_q)c8D_z4F5uc=npA^_!tJaNO^Vzqpn=P>FP{jk z=`A0{6$v!eKUc2jA?+W9(Wq)PB#pP8PF0MIVIjr!~;)6SwNThK^WkX|DlS}O-mmidp zk at 4(}f5fqdwW=IAy0YL^A|6cRV~hcliog&pe3T58c?Qp at VKn0#(kg!<^vkBHSGnW# z%}dFdDqSR%)z2r_mHxI!%(CeFiAj{Wv`s?f&7uv?a19q4jDb_1oOxNF+NnC%R^zZfiPDU3Du^p86#ta`nbJ za7D?E>PnEpM8-9)#eT301<0Cpj74^u&TpwLd_L{>)~k+6PV1&u|!q~=eTRO6+ at th+*9EQw-I zy;k_sCCV)|R+gdpmh5bZhZT;K)1Xw at bMw27jKpaT1#7{vnO>IjiGq|TH5=a*L~G5_ z4|DpI1?Tpw9$giOPHR=?UEU_jQy%7G!uu)r+RqX!0sIz2?f~#6N7%)(80(ZBY>U|Q ztg8a=(+kHptD@(UwZAXh$1h-9c}EmtpMN0Ctd;nw*v=`^x(XRGbYOuf|4Y~6H2?L_ zjM-2fNIWq(veS?QEXz&=s3zl at q*r4%R at Adz7?A_&1>K^1;gH3#uTlSr`r}8%ny5IE zlMB6D(r;dtt6!~+Pnh<9_%b{5MhG+4qh}|OedHQWOA#A6^kxc*lZP{)XuugXMucbw z+z{}8wG;a6h<^O&&afmwa|a$Q4wyum<5U;|iI%|F3y%1E8Q`ISXOrQ>IHtVAFq+)S z3YQt#=dKab9foYQzvamsf<~e~UIPbsfEJo;gND|eF>dsZqDLXA*XJ4+rH-5)WiDX!526+`5-loF#SEH8C&CfmV(hWZ zZ%JjJ??EJVi0-0xNd?3HV4vs0jPnf`!CkFS7;n)Xt%l_oaGtId*0X!2MemZC9FD6S z&vNs53Of{1FY8d(d+yYI{XP6*RrlryJ?|fk^huVVBVO7TpjRLCKCI0_Kxd at Y6{C3z zhc?{lq16 at UyzkpZN4MA2Mg-Co7TYahm^DI-5-FEG2ou9`O074i-u0_?7eaCfl1qAG z{k5$1UeVp05YdJoFFw4`G=k%JVuLQtRlL0FTcY$+8BDWw#U{QATBuxpO23Ng_~44y zy-Q~bx7g at QdK%kIb;>Fs1eYu>B|pz$KF{@FS at 2XvR9vmj?+%(VyJ)b1}*cl=gx7HpFCOkMYkG<*Ne!0^13jiQD-qr{dd98*CsmE_x9Ksib#)U$)f%c0T*NRm^tZO5y5FIfvval^u1zt;N$` zi&tAU6S3cxT1LW;D<8aMaoIACtD!C?+P_{e{e96AVX1 at YvlC zJ3`ExH#qyJL|f#y3eM0A3qQa9ThSL!LK-FB-$4BVG z2Sq`v4+ey8z?}!fZo<;<`=XTWv25FrBL9g4_k9{sAHEBhHP==^ci;zeM)J$!xxx^WF0W9+2~5jq>=S5>1zp#TgEG8J3Ix~MQphk}tLnMnD)1@~jjV4=-$5X05*V*W0SK(cx!r-jj z4Rv0X9i$8Sz4X){&AP~Is;R75m}O^PrSlx3$I at Xd-^9XXAd3a12D at -ScR3ZJh_OuG z0M6aOO2>cstg8gCcOq} zr31~9wScym=6pISNVh%Z&t)UvM3tzF((V2va zo+_dw5oMt!|HkjhRhD;7jx@$Q(!~ixnah9#dJN2N6Pbk_v8nQGy-eD!s56*H(luEu4gKlNQ(VU9 za3e??nk>3?l4o=wG+Ib^X&y;~uRg^j$>TqlXREt%Zj!8F8`K=!C1g+ at LVl`)l9}Y= zRvl5Qi*!&ONm++AT(?;jUus(@U%}^poI))e)BqWS!K>w?9ttWjS;=X9k4aguXR|^N zBc+rVB-A at 4nHLb~=hn_+&7TW#1GP~HgP>LMmfBx)0)<=*I( zrE?~=MhYQ5v^2rWR&x7pc at i!S?BwlFw(;P^s*y%?Nt~z`jG~rSt!f|Qbl;+GrIndt zuJik49b%U$4ak#NDHCRt1jz)?j)UpQiqh?3feNf_BC&>URkmq!3!uH)%yXEawk0YC zrxxZZ8podhG4pT6PG at 5}k;huPJ{)~Jn1XzjbMl!kOFAj0G^Z(=2D0d7IOJiqGG^+bj(CL$*_Ujk;Be_Sw6%PG z+KOB|Yd?YufdZp)F;^MlQEIVwaqMTNg4j9I9$)!;k|cYCCKgiNTAM7&}{ zXpFr>BSFnxFy0a8sEkqprFkmv`PM%2yQ!S)W+zFx7SuCnNi zb_Jo)^S>qElr{sNjUtRHZ_=9}UyJi+F# zc0pXt0qjvh%{6*qd~DD>UUdp}pv(L>3*@Xa#(>PZ_>QTa?=iNMGwYg(e#Xwq3^l?9)qG{+JCM7%D!$KCc!xHw~ zyIj1bHvsigA_TQ at j<3 at +Ld`$_mp&Dfj^o^+p7#aQHBo)gv={GpkOCX_{nY?xLV|Xs zST}HOIOA=#i*#AEV+9pp)>Ss8k(?sFIobw)kZj2qyDhTzm`cq30zs6#!{X4-YeV#2 z_JKgnJb# z(h&mQ<#~H(L<^Y`v|l?Si>ws2TpaH4=mr>w*?m;mC?2*?SY25h0$YsSq6GXT35!VW z>tcSeQb3m!{kcR&#&m0DKU*-b^SQ0y%G93b02pqGE4LFGOv|3g^B3W_sTaE1xhNXX z8)|TBFx{uf_l%eQdUs8;w`0!m+|HjYEqPbOEDMpq^=|>Yz6fDOX at d{mB0HtSn2Xeb zJWPX)iTPqM_5?Kq0mduCiq0HXaN;o at IMusloH(9#bwP#GSLp_fBF0ljiVYI?8M$Oc znL*U2(xhiC8JydWAeHC4Q!Yh`E+S9qv#00ZUkO?p1H1}nUWl;ig~nYWF&n9qmMA-z6qeyP0L|Vx_g#d&MWEka(w0^LUBa2 zf+J*++bneu2?4@)t#J#%BQD*6hzMz)l)f8|hv1EUen%3klt6ZO;z7*BnL3tiFkp*& zO&T0MIf_4|xOXHEQ%gW%L)P`kj)(Hh_2U$>JxpM_eNbhAr!|`PSmoK+AyK{eN^x7F z;%tf-><}}CX7R#xoLbz1?WdHK`0&TTR0OQGOw~*qt{yM69!JA)U&83y%uGaj4pkm? zb}xVY!IFz?p5n?$MD!;TDCOJj4Lxmw>B^Q9X61lYwz_HaK^IA)BywprMWf_d4#ldNr^QFXU-HYbsfbz0;GqA`Np*^VPFR9YsH%9D5XmRnAnnE at EDtvb ze_keHizZJh_uOhc-2n6Yvu^QD^81B|Erwiqf`_Zi;ivEe%Sj>R*Hkh&C(Rp$K{bTPIjv1k5JvIz zaixN!j5ZH&xwWY9Hdb0`b8KnzgWU0b_-$!Lk#C}f^IeO}hT#s^&bVREY*a_A!fI!Q zY!rt!_f+W-WovjN?P at c8i-YvLVS5w^%fJN|X187WpT at _=+0d=i8`~jqk7P`-je)FSmH4Hg5S}xY!2Y>lFU2 zk=Bd?n zdf9_aBE*9-kdUeLnYg>91$q$Eg#M6(NkD)xG2RFBPMcxknA*Lh5&Qj#_yO#@M_3LO zWm-W~b*FR`toC|Z$Uk)VFvU?fskF`kU)m|3ci}#B_WCF9+8>Ak;DiKaM=~GWPGYyu z3wHl!sGW2?C}{J}j4=XZC+#pcsF;MS$mVD2rh|G-DBD)j#ZRa!YLC7-LcUro?JX2F zNd}nNv`g4-n at v;Y)28h at +U_xGp2tL42ks;<4%3z8LbvZsPr>;Tx z^hRZ}!fKacMCiGgBF7{XPDX)lfdNOT$VmXE^D4}QaQn&4wCo;3nR6;>wq}w#RS;bR zEhrNXh4P5+BVW(f$L#DH^jZeYIr9b-lpt%w*dhJWs#OBFk8s;SIki?3jSfJ$+@&#d zRN1oj9MVeEF44ul0&)hP=a3^KVq at 49{8Myc(ZuPX`p|8uQN>pKAceJeVqV277Ne&7 zkPDz{H#Ko`jOsIH;$QtS+hRr9&ItcKR;VaBLef6vP|qq0C?7wHARA|c96rEk={bx^ zy;Wtf8Yk^MPabj=X48HqyeC!)1ZTDQKa{;yR9)NBu8r%&-Q8{C?(PuW-Q6Kru!+07 zyK8WFCy?MFxI=Jh?(cZV7UNx#$?=ie~)f2efzBb5GokeqS z>4zHn{RxyLbdTC2G}?s$z5xOBN`+b at Q#^`uYNrN8J8Xt(S9I-Bo2yv&v;_;H#FG*R0`OH_22+LX!D_Q9*c=s4QdA600-s?vT)95+L+ zr^b`FiZ`p;a)nO(78bcOv at PzO at VmWPX z&l)kg?g78V1KPTz{?rBeRVZ_jcd9kYn|)BZgx5kCe#h33vd{ewue6o{lh z-}l6P9~jz`K-KD8p~+^Oi;THP+G)(4j#p_*oH`TlkTl#y>|k8LUu#=PPd1rnRTY2X zN?G|DA?a1bZ=!!#q2I5(_hPm77L4(jD)+#@{{lODRgP0H^;0S7_OvB>ex at KiZ`hVx z!X3g1HI8w3Aw7^iC6FN{9Z&8R6T6HnjzPl0mRm+ttZ-6*gXL^b2{Iy(2trj5q6oj; z_!=IrrVdIoJg;!~JHeg|=i6yxG$bF3_41O?Tu3ns^0V43(9A{1xhmj` zN}IR{60`w6@`R>Hh&^I<6LFLTdv$|Sx@@KsE`s=}#+k5N#u at 8ApK|J>ob}1utr3L6 z$&MwE>m`5F@>=ivZ<6)Ob?37EAz8zpDpcs7k?j9IyQ at 3>ZQdYY4} zz_M*O#)@{9eH?mh&LcLdu at Fs0*{24qsZRlwrjn9*g$A!GocV6 at D^vr(PHoq=n5Nwn zCX;#3sm54NL$uLN|9U)7TenVIhn5E&rCV^qs+fso+zvXi*VLey4720);YLHd0T*$d zLsXKqW>`1wY>m3Z+y=U2vuT~qPMQNh at q@xx9T4zhB8)Ha3141gYG+S6 at ek6nHs}$) zils>-df~44gW`Om?%L0>IyA6cLWRZH?bgb;$D9TIlbTS(XEE_iZ)W)#=Uc7UOe;HE zsW*Z{DdgSdpg0)MMMyTO+*?28Y|u%^9su) zKmdvFdA@!Z0CM+>)c{p4ek$KJ)7QAt9>d5i?`m`Q+jdQ^I56|SfKv~O_G5WvE$8NYE0Kl4pNHz<88o!Q6^5}TI%G$B-{v4Wk7u~; zS(pzdzWpXmLl+)iw*cO$pa+zhX!NRj$Xb+<)o|RZz5a>mw&#pLv7yfL-0t zt3aVFVSQen?-W-@=lUFVS?B<3d&WJSVqigXjA{aXDw=cmP4?}`9P-E{qkt+X5qknCW3X4 at l4hEuz z8DU8#O2ioh>P`dht`ps%^BYMd54Qs$*|bnUt3{H#mpoNWa%5mb#UaP1x<$Fs9Hv zx#d|xphm?1_|(Nc>3jWZ94c3APd6v2*om?7Zbd~vt at t~Zjz$|g;|c&g?A?o6p^!>t z6#DO%HC)QBH~NF#6+|#F+JE%2|Gw>hQ;R?n^Fy)8JXx`!RJUYgt;|#w&S5xyEeZ1} zL4*TBtRxsEj|^aPYKg;5pz;CZ|G at G)64syYFvZPp$?Y}V at APWcQiqEy$9_ikV0X6X z;i1dxVtOw>o#h=07*@{-C at LWfqgrLGrnOV~of$R9Ijo|36$awbRIjm}Zz$W5$2z6w z!tGC>&n|1g0sOR&q8_>%xzu|m;|@JmujSM`JK?;5gSo4mK|v0kL1j28yO;(_u&*k@ zSPZO{-Z5ZpVlvc@#x+#?jgd~YMrrJhQh)W}eF%+euE&_vF16&m_L!<7AXgp&SsZwI ztL^#UX3+uxUY(Cuzor$rLj4*@$|`xbDi7+?U&D2nNyab8K{xz1*it zFk?D<1IOKrGK_5SKr!+9<({=8U=9}f+z&QxpBv`VBGD^{DZzOo&vmEj+AK3qi&oik zz6*j%r!D9hTBox at Swdy$RiiI`U;xLxLU`2A$C%ZnVzcYjmrmM!n at mHGvghoGZcIYRt1M?te<1qOJ!>axC2Nh zPM$JSl_Z0D?UJ6~Hs_Y6n)#EmUy&duT`pKEk^{|1KMN#g`^Akn#sd}Z`vqDNRT?80 zXcNmVaITcr!^3H%op#%zdByC$qPghg*u_5U+88k?>U!A_4)Eg^2LQ$7FDLCJ+oH%( z at M7oGLBO~eoMC2Ja<=K5u~*)r!(k&glLy*p54q$EbYjQTmr%9w&QK at Mn%HMM8xo&E zs&ck`Y@(O`9aL%?9CGGbhv1aD7ByNu-nIImt*-mibTGUbn&NHnYa(-w{1|=Txv^~W z?uV~PqQf_H>N&RB+LBObyngX1o|$;>Yd6ov$ySaLzpCd8P$qMw<$ z=Lj4btE>H7a~?2N-a9_ at 0jq&0*NfIIGX6mUTAS8I>JD^S!(<;VD2bF(Z=4&CDE|$q z)oLwVD{wF{FNptf7FosK#NE=#)#3l*IKe<3LKG9UHR18rFQ at pz7EytSWP8VVHHrZ7 z@@1Hye$+!(`Ul>M!Ha>18tMYdk+h_hCS+qlSf<J91 zn<4Bvb~x$g2y3=2Wj?zhuY6^VpU~W7d=v*U5Ps!86VN3&d)AW&Q`eqiIs83;SS at 6J zhB at W*RE7RhSAs%Np)g4t-4oeP+luGW%Mo;)zYTc#XsB2m(gPX=V~2ekDy?vys4(2%bWXvNK_jR-s!LC+kVm~9Sn=|P$-WGgnkyysD_LVxEi=6$43K*DVd-ZZB z^TcXITSlL3?8M_2Wyan at mI;LXZ>{9udTZSN==2 at xe{5I&TdRMyE7k0jF;r0nzcShD zq=gGe5KmT*V25F08BtL-MFpvIw2`R_Wvri<8Z`N)pF!@%vwaLwn(+Sk1}r zKkSnasknq+x@;aam8GBN{rX;H=i1djui9jr1Y1ahD>Wz0Gq at u zO4-(=D=W8_ZA9b4+D`Qup;k5`Y?%;bXd;+ZSNZA(nkYKv`#j at e*EWCr-KErUyLaAb zU0}siF#H;j?Qu~Xy1qWBcc*`-P9~8&<%9>=e3uqRorOtvTy>Su|He1;tBxkZof{A; zO3314{3C3vA at 9X#O|3!fosAUzJ8#*HJ~L^L`5MyxQWC-EGVNA!+0HoMym)n*yRA^R z0>>YFdHZ at LYie|xUtrT1WIHUzjtLErZaAS~%&#tX4K2ps~0EL@~vk+?owFJVWv3 zTV at TovMdzmmxJ_sSMb$%hSZ|GzVM~e*a1DRL~x(8^*$LS2mLlr at u2pqeA-2R`)o@| zCq>SCd_m3-97HsnAjG$Bc8L3Yyz~wM{36=9*dA3V^;`WF zT1A+`C1OvxL9crOjQ~6#OAf z7sUUV^NCxVxGI{sn_2(=TjFC?6_wXTQ2jCZSy?qP&VyIjOq@!1t|6oof^JM-(|=4XF7eVEe&YrNinqchFSq{ZNf0(3lS}BpI9}C0w#t6eIjW0+P^{8Gl`Iuag zi=rU~Ht>=_$%bT_Xpuxw?^{Uxl=wrH(Vt72?+TVYIRJ=hW3;!eQg)sz7|c#jShkW| z;44*-Kt-A|vTxz1sC{zFJdCqFMjrVZAA*Q?;0vRL at 04BkK7qEO{7jFu?`y$VGbix) zMdDU^Ag zOiKIfckt}GaBtwFr#f7Na$f#Mr>u;r%c4IzcmH#p+5WDx%Z at G;8B%E}NrIFHdI^3z z*_zxqL}ii0_!arO=sEAsmh*9BRd^J;aMejoBx$g?j*VyU&+OdHp68br zlrM_ijj97tNRTXy-Al6!i1kc0==7Jxl#{~fF^-oB#-C5L(Xn4?6Z2_yMas4$P~FTI zvv)y=#LmPpf>v&~Z5gT_lvkt9EpUOUq+ z&i+6iz{f#Wo32~tCs!HYL7Uv!qkI>&_IOL=!E$6w3VNZ!od9kvw10a*+Fa@(9C)vy zwxNBX*fjCK81TZMZa$|nscE9cBOLduh$GUj;L{clneVPGk0hVAIQa#?7CI|VP2Tc> zLZMzfo$gaNv;Xwu_;U}fF^DZNMFQg^%Y}MT|i-~@Jx1KGZ zR+Xn()o5aQ4tIn8ul#LZyJp-Q*65i(O4q#qO=*kFYoGEzN)P>WrP=?Vh<2$(AG9iD zVv^JVtAx1=El5q!E0KdimgIF_&q!@f+?8w-y_GI_Pc-BS`Ye+3q#B`vAqo}lS-Sf4 z`Nq at o{^0%+>kFr!v+7U|B4RyJH|wk(><#iyG}~-?jS;Qj at 4B`aXCfqWgVq(FI(#=S z$L)>W(c?J8i6Tpw*eqT}=b1a{X}ca6c)u;}Q|YRK=66aBZ`31#I3e*wJj zpUchhZ at H)B&O}fJIVTiyaNU`kxY!dFKFbsxrAK`H z8clV@*;$K6uih;PVQwkxG(1$-(&+1c4}@q4)**n7SpxzsP4xLOu&J38&=5{VF-x+c zio2b~fPx;>@SCZmNiR6DRWb1roO?1(l27CUXf6eBn)3>$qGDhJtFh#GzJ)UA6Nyhz z_4tm8mAbSBTm}}4%K7C%C z^g$#^bvKl%!*9yV9L!#=HQCQ;6f5B;rDYk3N%C(}V; z$gqn?WVil57A3aJ**t&4vWIqTDM(~I;Yl3-8Hk%VeX1vG{e-eF2 zPHg=iEu>--t+lX4-#maDOV9l754r-ov8&8(`!o{&Niq)L`mS5}G$3fz$ZRkz9e-T`gu-##rp4GK` zoGa{|aESp&Nt94!?oCz0N>QTtcD{~--{^8?cKZF*!x#1!R^B>op~XC3A%zZk^Ep1$>{assyAseBx?lErw0wvBJsq~wS1Tvd(1K@)SP%1 zMhq5o8+zXBL6oHxB6`l4lBomjkqeQMZ+BAUt2jEqq=_Gn`Npws;dGW`>q6uz{X1w; zJGUIqQr4cY7*`tYi4ox!hXav-rruF3=Fgp#eXdY1(R}g{Ph?9(npVUc3x6WppHPAx zX?MGKTIysaD6A<&aS1L~_>MyrDpP at wu~>2CIX at EaJa7mO(d4As?I(^E978jOkie8$ zQ8 at WW>K}-Ioye|h_yh6Q;+5Plb*r at f2VE(!ERFqN-B65spx#6^mdf^)YY_RCJ4Lr` z<6Z at 6ggapsCf2Ho!K*H==(85tobZZOQ!l1SfYiW4d4t)MDuI+L=RMX#q?)})8f^=Q z12g8Pl^lkH at oT657F&MwnTZJ+49o-YkHzNt_i;mtUKkp<0gh}Fl*jWaXS1h#uQlM}uL^ znEsc!#~c78Cc*NDpBpc|b1&WbH*XfO0g!pxQJj4E{%-r;0EOD&3*JmTFz&qPr=UX9s=Ty_UT z8}76YUs0pBqq4wRR`=7Qi>w_l=Spvn<`FQMTKn}4CY{gKBgdBRv(ES@0neG({T2K!$pxrXWnH#pzQ3|rj0 zsPAx|V!6H|1(?@NC)h&w;exs*SogY2Q=nyv_K)kNLB}~Q?FKg|0KvT&Ekm1C)h)?(v(VViq(?_=u3dHrdvyf-;|PbNFNpW zO6&I$DZ8Bp7Cd?@Vo#{qOmK;Fani7$#M;O)!X(AD?lNEXPsL$Oy2m!1IfmH|@mi8O z*^1FS0xNhsPy2Qozs>!J9f?qh?#2l;CW{t5=~m0E>wA$27R55~Z(1C*m7*bh<9t2J zt4zT7)w`>=dArMZ{EvU-b;#=QxNqLsg+G3V;dzF zB#wpu5j=iikHe?DT_e^rTKknC`c^}|+022#Q8kguX)UG2FEQu|m4#8m;LpsrVy}0L z!l{_Cx1xMlHsw!o!;c6n>FyCG5kE at 0yWH2aahd}1MPfHW=}u*=H!jg+ElG5)$+)70>b8F z&2GutOZ}_mI8XZPiI7XgAKj1oaWn4=m7vg6X*3HNJwmxC>I2KwUl+j3K*qLkTxh|9 z_=Xn6zu!A#y=hpnzlwn+bCp=Yjr0)%|S~-6Jqs~DJ{%Gf)PS+KO|_1Bk4(cEwT>Sz<2!}Ph+I?Rjwxie`Y8jt2pG|Mi3duL zs+OApEm7$^hRm3FNqDxkz{wW#HOp4m5BwE)JSuQ5B7p2ZgL!evz2~$HRZe1a;e~kt z0YSWNoVzs)dy`XIZ&B%y3|@YFcrTWHJlFXfGsQlp($onr#lF$dX;N0kyYd7W at Cm7) z{q1ib+Z>a(kj0_Ez-AEtF?6~A1>MxGzj^{=eaS}Ip{33hl8h}suvsZnzF?_{>f&1~ zA_b+%VF}(dX0xt(He+~k3*H%Bk^CNky&Gr~@_s%e*}s~#)K3pf>E|_}X?_T}c=*}j zcJm+{_zrE1wsnv=a4tZ!!LZCik7r+eXm?+3%K0nOmc5JDXNy!(J6NM}DvgS1VjwVC2YLzR;@>kzj;F0UtUUjnusHVJ^RpGYTEaPOVLQZDw25Gsxzh!o1!{(U at L?$;{ z|6VSpCB|**yAKy?%D;Pc7R?XTN^rEvJ at tzur@78CADC^_dE(e89OLC_{ zIv$wD2)1WOcET6p98)mqr_CCBTTi>RSt-2!9_qbzUg6otD#NvimagGb`YmA2ce`d5 zvv=3E>CD|3C?jKtkw=P9_meC(&{$9ZI(Jd?RBQE{U8&9{uY zmo&4r!Q#cug8+FBcYx?}L-no at vGvO06*KY4Bl-(I@$n;q5xc&iAOR69sqA6=eVWPh z^>_N-!eT;m1>kgkt?OGyS5uzS&^6PxcT=L?hMz7 at K#$#ele7};nd}{*@KYOs&{_Tla&e z&*XQWpU4nOzlcWKD{*y?snFxmKSHiuvzbU|uql8{p*HOive4O|8ph0%iw$48EqI#n2PROMCRsr4eBUSk+7FfNP~26B at -R{W zFCjWac9TTg)}{fSIOo$~hmc}=49Tfi%Ehi)+#TP6awyhrD?9v;BS?ltiNuBx)V4BX z9eCeZ1%WZm&=e%u)r4CzN7`@QS+bQ|g(GyH=9HyklhWF%z4AeVadT{F at N;6)p!kqv zlSdAKaQPrj)YUIX%JwYVVuD-#)-nO%VuOh}EcyCG{~-O>XKV^`*TM)w-a6PfPxgks zuvk)l-ukg%TlEJpV?~oYSJr|3Q&b%wic5 zc-nPyXcF~&N|=GRSP&OtsY4dTpJcz|f|irVvw^6Ep-}KF2oe^#>zmw0``sWoYKt`r z!|bc7^%jpf5Jo~J<#A@(H~;DLPv2y(%a1pde%Xy_ks&-Rog9rT#M#P>Zy|3WRM6 z_buJi$SqdA*pQHUE)Cn?NhVl3kQ$VBxl(%-{iOb5m(+sswTGE8Iw at v zIMpU43Mmp1ruZHh1}BR9U at 6wUV{T}dK7oFvCQcJ^NpN2%#XSx514340;iWd%aAQdD6~-Fzw=kV?xZ)kUY3> zGvC&Ll0d at IcBnb|!l$SLN3tg??S0b}k zTcJc_yx58uiQbVJjkAJjAYhafS#^t)h)NKdifWT4RVDGN`IDy9p at 6@>ps(x!&wCOXh?ko4_=Na zVL8Od;$vhU{N(A}isBF28Ji%htasaHTC>ZK|Bl(gW-ny(KgIbm)IW|{-hUP7De`~K ztc`tSm&oRHI#|olm2}HlW5AyDdRKl~lKK+$%^6H1czslds*bSBbpt^Nfkxfs2%M4_ zB8rD}){k~L#;#PA2UX{1ZZ6S>=e;n+$NSAL%@?YT9|eUeqA(W30Al*HuC&7K&j^TT ztZLc{CbA;y=}L_hkkw42RS*+hZFaB^(CDSMKG|he%jysqoa-8QJxbzFbLK;2bLKP6 zCCyC!*~^LSXf5Y;U{JS;%NhaS6F2L~=k#Z;`7EbybmQ12&b;eZ6AUag*S~G;?4}xZ zH&Z7dxNR%*1mUElP@$$fs{L}Yfg9KL$si3vV<8nU;L-P z)k9sEuElMnmr-n{J(V;T*BHmL;P`fo%e^<#B>0 at 1Kc#)PZmwAsI)Q*y6D4j>+x2kx z+FBaiw!G9BgGE$4?-667F@`yN#1rkt=V&Z7rdR{Fr-W=;)B>@8+8(M`G6cLs%XkaK z-CVo)(IaA(}$1!?BH=b%9fp&R_$QJlO$wbdFm-wV6{L6AkfjZbIo) zM=U^^#|&!0?ZP!Gw?vTLz#utshe`wT&;se#4&>Qi9^YRvIt6>TyyqweavzRKihwjaW%h z0&Bs4BrkbdT4aK)Wi1?MiW`XK#z9jdaKl5C7WuAjV*a1^xBunUXsq?ZfInUZg9Za* z_=jB|;J+3ab$R6_70h?Xa`8h|6BsD8-(doL(8pjxrYh(T91DP^{s!k|y5&sMa-wzQ zM5AJUZe|WNS$*6{M3O6Ryt#9Z`546Tkqx)Y<9KM4cy0N}AaR$Z^Tr?-TL%-8t$HnAn2NVwkkScS9G>!2 zzlu3#C^D>|rr#J_c65#w41a=>`Y}Dp{>?g>eQ&{^1_4VQFN$+3aKVN~tIqaKrJU4` zyw-k6QcD at J>~tNxeB6^}hacdkTZ)1ZY*FjEzG;Q~-L~sTo<)1wGLY-EYa{N5MAoGyF*KHBV}-Vc3lTT2 zl+qD&yoI!YiVGe$p5==z>d@`SE^eBVmWC>kQ{WBn(C1D*^3TzIXU=nFb$40^G1P0> zg+9l~s6?Z_yt^%xM-|`HCKeVG<)~Ddzu2p4n;)0&0FbUp&mG0ZKxYX;K44|aL?Yi% z5}!y5aEm;^OpoGKqD&M*i(;BlSxhj^;AhOD(#GQyPe=v~i)m|aVWM8KT at MUU*1u*r z)I`gy3||n!V{*rsv2Ab4cuye)KVX=fP&Ls&z=j3f6Y<_dQr)vl8VHp!n<3ytByE#3 zQ!PbbWoq9(2wn%2C#7~0miltYX`%0JN~jweJw~08!F;~qmx~-Hi5 at q@*E;rvVRw0D zJQ$x`D)Wh%cg*mUBg`xg{7Og-yu$f!8}GXXV)p*A at gvkfw=wJgwXqt8DC#@)s(EsQ z926wn4rK6NkUcpXiAWVNOhX--*VrXt(Ht*%WQN(1E2YEtmc;vJa3orTJ`HxV*=jN* zt*`&1;GR)0VKAgYuX%BC at y6p}S at 7lV;m{vUl5x0 at JY59v1XbqD9weWkStze4Dycfc z1bRgN`b{dNiwQI at 6-LJAv{t5N8DY*vzv=-~x?_(3`dMWYEq!jO*dFgQL#}A_owdDn z)yL54&!vTLfOC?Ysq4$4>1W zGnMT3s9D-fxqEm>c54-DTX}C3h5AxcP+|EA&)nL2(0b;y&9APw>8DDUWyM8v_-yJn z1f9mK&IHp532QsoHUzdtF3uEZJ#j*KB*6>~7wI8`jYVgY&>w+kqGB#X7AO at 0os_}+Z-QWuVsHm=Mt{hI+%XZ~K_J4OOol6ODp1rMWg%IX*qsVbI5-Mp1?oK9W$0_Z#Av+)KnFn& zL|nu-K_eB|iVI?W{aYAN-p5fE{0Rf>{{_w2{v8HWj*BX&g3FDkl$?|;988K|K0P~c zd at Er>Df~nkAwn-F3b6#uKzK;+;&L|bN&kq{3sxEJsQpEvau}lVz^Ou;R3xP%QbR!} zf!WpSVk48?ig@cFatU at JYeSXc`DiTf?SJI?8< ztBo`#wvZXlDr<%)D<5aY(JVJyvA%A>l+i|ptky(@5I>Dme-sO}E&Ll|tVQg?E~8%q zbleLw415X{28Hct at Z5&|8V%?5X<3Vb? zqZpS2K8)*;XR`kc+W(q3kxcF&p6W$PV at M+UvL-ooM^4UB7>h2NXaabGTc&mm&ii6k z?H2ZsfC&9`Jf#8taq??QDaTf6X|z|=WGm597&sYVnnUECtaxjToV>5vuOn9^VMFz8 zZrd-#Gp~e{9M9>!j9Io(N=C5dj7h8yRkBVhRtC>4zu?T|m-YEe7PW zQm^x at sUP8!YBwqNk>sl8 at 1z3iHDeCCFo~fMr^WMmW=F5A^R%PD>ycr^XJfy6X}q}_ zNdoJ|3rp_9>s%+xS+9fT%S&Ofl;89Hlx)<1nk*R;2ZYn{tZ}mXV&hL2ZE^g3T)1WN z9r-rlMHd|c=l}*Rt+pIc3X&0zd7JsKC2wh-m+}k;&=Lj9?;;vN_3Fa!4RG-$##0F) zy(oyW}+0QemIu?Gz`4ucxwI578w7Ni6 zivh8TK?D1fl_qDrW%rF{XA%_L16X at y(YgdKv%4rvl2{5dWQ+EXKsm#h;ul;~RU>pA zPEx*D6Rk5MdXvcxGDRceR%&rep5au{&1eCJdn{-A5JZ8OfCT%4Iee_eZGgU z-p0#eeZ%t at OSzV15(7;XxyGs6l5N?!o7S$r0NvGf9KdlD#fWFMD%QKap@)rS!_Ml) z=5BBC=t4=E(h%6BrJCG!y1`F-gsjZtoxscvA2}JPP>Qu;i>VGRz;s!?!mzc;riYgy zdyEAG>}!M`b9!q+6T{Dz(3X*;wWakKDL^sKG43rA=}Fsi(m>fOi+{2$lVmLH zaNg`eXIB}Nuz>p(E8we}R~76a^5D(r&op(}4_z~v^Uq9M*mFc0M$NIh>ZYBUNH$%D zi;1mFXiGi*ka!AsGP_Yh0Tv33cQ7&=`EfXnr<-!?9zuy2g^JLc7#Edyx$J^{6nyzY~IMFwyPH|)fSUORM^)Fb9q zt}jAs6)__B~lbl at 3Ss@VK^CJ#iVHGtbDw{lW?JQXfeeS8oeJ-6bCOZ}QKb=X19 zu#lQr;?BJYn^{y9QKG_1ovD-!(WsDJqW|Zc(vB;^f&fj{p~OjFgmsu1X`yyLAJERh zLpjG}+QYUhvyYA8Rpc78a at Gx#Wt=gZuy!mFQz5Vm!_3yL`e0{zr>LaR(}5 at YI|oOJTLJ%*}^6VKlt3v5D3j zdeFrwxmgS&-B;Ob-Deqnh5*~JmJ8U1tDLyZXYIrj3%l+ME>UTT)NTWfi_JymCCzSw zxu|(UR_#M(DU=+hYh~P{^LSg42^p4fmbnn6PIH-Ui7YJB_!r`=c8TQ_hev~1*mZPs z8dme!?2&e)W;nPlF6&$yHB at p`AvsqtxFbhoE+;?pe0^NlKjxL%E5h1zF00tg_QNbasJc`Qa5U_E?CGyNf=4GW(8z%~3hQaSe4QjJlMktX|0g?u$&Az8dEl9~)_j=ep{-eOO- z&RdfCmw7?>m2h9mK>fB(hnEB(NA`E61^W?<-1T`!SaLc=U38aj&yrI>^dO{O?tL)BJ|L_Bxc)jy;=5e542*UN5IZ zc5Cw-q;h>}sBhW0{!2P*{Np=E5(%D3sb`K&dGoV2TFF=q=37?3wpzwa~ zkm4x3~ z<1*&hHFh%x;d3al0p+OmO*%!^Rj3P`9CI>KSfMnZ{EZ6hio$lU at LMv~p=(JzX|DnJ zfpPw?Ve!P9#5h3w+~RNCNQ%dmpErUPUYZ^Ss}`Lh_7}dZ+zQNS?v|<5fr5_1_yp4BQr_ zFa^8XidWFckd(fZ(9!XX8cEow6>yL_I3tGgAv;);o+lSsqeJVQCYsBXohz&#=l{a_ zJt&@O10RG3I((1q{moF|Wg$sRlA8s4eDSl#_p;-Vcr~yu;2xr1`jISz*)IzeB`^30 zP!r4;wRp->{oNt(A~s+Tv)P^`ie)sJQIDxVGaqJm{n#1IYvTko2P{}4jJf;87uL5G zZY{Q^Ij!o>T))zRZi`wEjsm7Q at tDu}^Xe8X926rs*O#nUQRCW*e9JTqmN$Jixqm2n z*@BYX74_ow=YWI^XZ0%jrZSo%^rgbO&4kTAZEG?vnEXeml>-%VJ9|pH(l)|pOZptq zG<$!sRk+2Ob!zB62qgPi at q?x4Im0jf`Z=vPvw4<&PjS{DyBhutt__M(rvke#o)C&- zSr*%Na+1~D4DP^h at w-3ST!yG}swvcdm+BFvNn>*r-8L*~JkPQ(k;E z%l0tvm#>m8`%oH4idt_kHpNQ at m=Q&)|0Gmb4Qk8gwU&oD2C+m308V^gH#5v-F!v}w zKSbpet|O#MZAle+w?n+3e3qp=?bPDtej{ZEm*X3t?#ed51S*XR*H<+-xatkUFD1Uj zYdUt8k>zN}!z9sboJ_Rq;RN(ptOK5gpj@<%Lwh?Xoym!b6J^nh at TzW;;eelIkj>*4 zq9~#uZZ=AQFIE-$=G`;%O8uZ{7EB!$=c&N&~1>Ld<_5%jU>dF<+< zRM?ZDnbI3Af~%;R*hTF)u1Uh<6CyFm*BG}#em5sB!%_rO^~0l1!=sn1)Su8WhR`sc z;EaedZp){hEsvA40j&DS8VSs)MmtAb&p(rXQiV@)n+_>USAKhhIy}zV6+;a~yM#5{ z33>#<_wzRG;y(Ya#0N#l4KVykJEQ&=l at I5?OZ)-HzfQ#4EpbW0H`PU8Ds4$=@yJ0f zCq=IK5=x#xU+N5o75P_pfjN$7RS9}a%_SI8CPj`A)k+9~^;8PARICK{a`tSt+yBOL zSvb)D1=*Ou3vs@&5>!im-4I1vR5YZiq#><1<{-AM^0+V2;$K;;l;IGzoxT05RF at RD zOO&*@jAciAG*oH|=|zbf(ADd{auy!6h~4O(C5Uz&Ieb1*App}LK29ab!pse~Pv@%f z3d!<2Njg;P2M7EimHH};dA3Qo9Ybrkh!Da3Ivc(Q|1yHX_GR?A+PgJtH3I3E2F at 9i z^@n!2p8U at _X{}kQ%TTUQc1 at ijGOh>48RN(%i&Y9VlQFn}SFcd$Y7bK6u-)i_QvoLu z8SYip-)rk2(?H936+bj&3N4{Kb-DvwTLb83IAw at s6f>5ii-{5(PXLcLt1}uEB(y%z zxX9$UhA#Q^N0=7RprX0?FPIBdt}=8`!}|x1*qa}dg{fK513z6>d^l$Sp-%u~mQB at X@VpLh!-;FF9rOqPxZ0QbgzXMSNMvh>g at df-j=oiG6{rd5M95C;E2z_28d~n)R{4}3 at XCelQ z3f&X8s5cvk-634~bIc*X=~!Js at uFu)cA9a;B%Wv3NY0JDH^7g at M?Kndw*AI|@SsA@ z3gIcn;9y`Le-<8&f95#_Cnq}(XLS=(`+rT#rY8O$^MO7L)*DZ= z%9x-eAfe?%Y>-_(OVqY&Lr5arf}Mc3+vjNP?06 at h7eqkraC$>9>(d7%pzi#XBfS!f z&>53ZWq~5`^g8%>SkJs#y{z8?KiiH_u$w6C8(2F2=edE!n7jYC5Q{phzo(IT+bK)F zNQ$jPEqit=#(5tuhh%oV=u(5;$HI0DOOYsq?!%L0V+P)!Tx!ln)ikCYREx~87+HfU^tj2uzkeBzh(ouzZCJ z)EQuV%qY#8DB%Eq5Sp1F-tDZl4hH6)Ky%L76mZ*+>a~A*%=ueE%qU1KBY^=1rb+)l z&Qbq|Oa66|qBf$R`uEI_{0^@JOKR>3N?^hm0Lq67gEUlHg?IoJbu^Tcl8iNKkP^?> zm<@vl1IkE3vTI#4+VN{`yRDz7zlxb!vN7iT#oAh}Lu=<Sd0v zD?5B-OyAZZ%c0-lhFkBA|Hn~n{ z-&*`^SKLbe+oUHoqrXJh%#d5yq9MZ+T!5)MoR)6=6CD2^WA7Z at S+H#jCmp+E{*sPu z+qP}nwr$(CZQHh;j-AfybKiOIjC;QE-FL>QU8Ac0tJ-tVnpJD9y)*_B+zegmAS74P zZu}xu7Qa!Vi!G?8{i#llIv1H!_Wd%Y7uJks29NugScDA~0crguY-%Kv3u-MOjcV|w zXDex={_R#+cv7c}?a+45RCqIc(_o)*=~$V=#TnD4Cw3BHOsQm_%7*UnRK{;zclRZJ zzL}%sFy>YH2~dcl_}qXvFoyUKUWcDfcC5cKVYEYr$Q;VXTvhYtTEj zOKTJm6lxrJNoH2fAj%_q2GPkJa)z)gW>r)E(<6G-BP;B7>GW+ute1&v;0wRuIuJh3 zt&kq>#wE>fQ!On1xTIvzZnzDWH~Q>!4W=epRt at -PgO^5QRXXXhhIU98F2jza#*f{^ zv~c(;lJ(_%4D9nYQ61UZA~Z3oRTRKVn70MvTS`xNEI8;MzgNRydpTcPR7y^+SW|Dx zX(&#{$=6Tzj_P9Ehq|Jyj1=_W#-PHI8^_yuPT|EYe+UAGHWbyB+nohS#I2Ci=f|i9 zt0GRsEcau?j6})g#EdM7wAPMn5l~XDA4OT;4W~Il7-(?t*a|Ab&^O*SXEUQt<=r0JNDBfD!?5_$W6SOl{F_T zC at w83C@`*iCOmYjZKc7yS1iS=BAhj`y(}+T>~JWtF_i-Rd(;C!e{Xd)d=51!O%hNC z>1znn;gnsOSwjmQ2OBF1Wqjp(_%e-+IxK8Vurky!6a-!;$74MGx$UXAh9!2lPaQ at m zhtt|dgk*(KAtH;ArlZ9oL8B*XmPCV1N2VtQ&M=>{zJN}cK#K_i(ZZp|sL3C0Vy3O7 zl4nvFuPLC{ZDU`W$K4v7X8CCoj%O1qR9WbsqSwePG6?66T+fV7T+!8S9dr$LdOAU8 z{P=ZciQQ9pe7fE3 at CSqLYnmRZAShBEdkgV-l%rtCZ1b%-GfuHUwTA%%enes{=;8iy z9K(>a{mJ6sk9(Tjcns}nD%Ki)TzX>aufrlSrZz&1=g_d`T+wt%QY8`}!+@>ocnm}% zdqj(b^Aj_3O;IYoQ>h5-w*kpQgjZ(j1bO2tzBNhM*${LP{9TnT8V? z<5t9Z#UZ69Qdi}vqtx)huLfvEywGms4jm3dy&69}z4vL2ML(?a`P at XK3_?5yjCp!y zD70etict7*$=ofc<74ci6jk`;`=Y@$2t9wK3K3SrKJ*ZsL?yCYT?Y_knngA};A^Mk zmgZp at 0IcAaAT|SoG|ky?!ru(}B^Y5D!3w*BeH;_up_zWyK*gm72}5h(7e%}U>I+sJ zndMO**`_ee2gx;*xISb{N_JCps$+t-htKreZX2HGxD98KKXd(8UF=K*G;A*Zp=2P#cp z>8dCJoM^YWd389ORds5cQV=9aIdlfT(ZMR3`eSr+tHv1QDxFd5wbDj#m-Lw0{ofcS zq;;KU_`DVJq#&IFrkZQXSe+84n(Hl~t>|~xn@(OZ5YAi?qf95O>d3L>P}aIdjc6l` z?{Da&WA^muW}M7!MEwBCSNI5bM$r)kM)KI3q7XrP1C!VF2wRI;gz0J{Hkn%VVIJ(_b&L@=@k_8~D7$ z8By77r*F^fY+5Hc=WY9n2XVme;5J9jkUU`9O=?s}?pG#9KMi0tq5qJhr(}P+rnPhT z8prGCb}xP~Fcufr>+^PRelSq>Z|mY#Z+5 at G6afL3la0;J?smN+p4<8M at ufqC*Xj0gFuN3w+wDZ1;o_40LkK5cYd=J2m1e=- zu)uP>;Dxj!#j2fgzS)S1)&A4w1Ut)i_hY6NayS3OhskMo(Fr>#eg-y+&GBF at 9eFm3 zoj&gnt>>AqU at FpiE8}d#xbSLW3>dckRPslXUC4C^!-k0N at yh!`#PlVbw#Pc%G>j3& zeMyuqOjt+8svZ|!%6(M!>Ex*_>mP!OQ+93zO3H$9_d|5TdPq|>tmyZbyX&{lXk)WQ zM3 at lhVF;bFR#CS*lj%+Yx*W(93mu$L%>V|xVx|X)3Z{<2K{A)6uE{qWZK=h>h6X~E z1L1GBbdN4jZqE2qj5}J{GwQfGPye>{&udhE9f;|fP6GjcFf}jCZ+(2*D;!fsZ-RNj zKN#H{Xviv+ky3k23iK;#%6yMcP{RWQXm_uR`Iq at yML6~EEo3U3PcX8 at gvU# zroKm}I@(un^$>dxEL$ze_P}L+mmU{{(o_$7a?jr$Q?8#FvkNl$n=ZVvYc!9ZON3}b z at 3V1Em*q>ku=f*>pnS6uCvZE!hb?40Sx5P?5wbN`aPZn$kdP@ zZ$Y#uL$EXuAV`DVNA-*Yy$(fXNLru4jezF~mbq5BHl>5C;3?i>Jl2;@#5`!hW`{1X zRZ)41 at XGR(85iI?T-+ws65m1nOMrY zg2*cu&7=5A;{sAObdkX;iK=tFHNGM&s*44iBp+eHL85cKz{T$Xd}*-~W& zWp3MZ=NRAnEw_qYj*%pDr*`~f|o&5}0Zxr09#nrjA$+U^(3|BFa1!O}x4_cW_r9{UHJ4yH(`b6E%B at -8a zNM(yjiWly&d$cxTP=Y7;{t7PpK8NSA_1#LsQ7QaeeSFepuPB^J(xNHRH1oG9r7;-` z-augdJ}X7P^%9`jj2}tj!3%8y59d51%VPB-=1C?DQjC}jff5W|=`pJAa!gDb#Yt{k z2oA|ygB06vm8an#(3}p>Ad_S42RSI{Ovca($>nyG=}x1HbduxrAf*6y0cv5;ZGG|+ zF>)rUQK)>T)YGD*)1TEOb#-%br9;=}qXFQq^%n}<2n3^=dkUhUjqOXM at MT2nANC2- zgfntzaYn&n@@NJT3PI}=1V at P7eCiZMngXV5=ESKnmc4UHHu*_0inB21Oh+*6?o(d< zL)Tp?e0A-`#A+jI0SY1k)xt3i at VEu06xc{DL3o)zwg_l#Y6gB!#U1cNpWmUIa_Z?H zoXE6~?r5P>Nic73k#w|UNs)TAG^}^ACr1SBXJ%SP(5pu1MIA0%fAvTK_b%A97iK8lE>cmK#5Ft zL7 at bYDL?CVH=tuDTLza9hjf+rXcqaXFzt~l6{yEa&3}~s2$hoH;+n2BS}b-8KdE|6 ze{A(dCBHZ&L8>fD+$e`n7cxVMhMJsMJ=j{b!L>~tjWzjT at WEgI0};+&5^Vu*SM16I zJhdGl$kpq~6S|gR>|A~`O{2W6V&%BrP&L{~5Oast94 at XYOB)r=4+Ql!ZT zE!dvQ*NxEOzze()JPxg%eE-uSIdt3`x8LEIj)vqN=~zC07(Broew~ID9p1FLT(Z0|MC=xazzD1gw;4vpwx3Hl z7a;;TGE-gy{cPn zC9XKWTxV^s0m)BXhi5l35|+nwHvz_aWI%@s54Z*?5wh(N#Ze}XIY+4D{>N}OUZQ1h znAb5WnSxJ*@q{Gk&g?j}u1NL0IgO#J$g!Fe%+p$^njtdPShh0?19!I+cb6i!KV9;uNZ{Rk!GsRYNeH()J>Hz3)u( zPFiFHTwiRFDMj+X z#r@(G)IUQ&3E?TAa|+3NR-{t;6Sh2IswVgdemrY3Mp7 at uhBd`xP-c$bMsbG?9E$#M z7gARfpYu>=z*`H15zlT{=s zC7zm=Fq4`Oy#Y+pfJTG%m6DUK_6I98zH%lbJ_>toqi^C4lqoo*q*` z8!S^Jz{r_7%K{UvEHzI|J66FNWI`DaYe}+Rm|C<^!#__WxN_NI=SehUT~*v6>Ml9aL;vB?U)kzYN-jqYQM$#Ap zTtIF3WCod9SyXrW8MY24u}*WjEf(K4KcYX^16ogMeyMCUuNhzSJ}#3%r)W*Gq){gT zr`O#9z+TQSlMgggaz*sOZ<>42wipt!3Jzb(VjJ3!`maJ{;BplgcAUV89X35A0vi*! z_ETmY$&6?gNeexZHi|rO*^+du@%KJ&e^&9(#h0Ucwh%cmTL>zeY~MxeE5KWJ0AjFK zYZ5 at jc|Iv)T9x1G>p`>N2>2qq9Ny5Wy8J69E<;PLN1Qxt7S4#VQBHlZp8HO<&bq?N z?xQ3r#fF!nA7WC;8c=e0W{YXaTRgOrva_D8T`@l0+J-`=PKG ztRv{t>xDlT>Q&5ASgO=@JZ$#qx|z9Kjnj6LbFkwd1u&)Ya4o)+JD!@htiFug?ibnOXC`VjoI6@{7s|zC0VSpJVX_h);0vZysi*IZ8AQuj z_`=hWMpm(%832$qaXB#0I!mC=aOkIB=0{Hy7eEmhisanXrBYfUzoK2{y)b}<=J>yy z+cI>tJ at 2F`_Im|ac7uN}czyzVF!IWzcZODvN?tj4jqe!0nIvQ7txo(luTFMw$CX*+ zfjPckf0cWcBBbf_4R=zFF at Ckx&rC)c{uce5Dx26fn2`&f`G~!xkHVAS$^WCcAKa%s z)<;$0K$t}R8k?%R7-7C7y8p8l=nrGE^7D9u>%}kz3)dn)fPj?2fPl#VhqS+TR_0Dl|1c2z-{iJQoB#WgR(gvKN+vU9 zA*E!lL>gZlL55ATybVeiS^`l)&Q|}h3W?BE+p6@!@E466v`rkenAR;27mC3O6dHw4 zO%QRdsSEEnVFkNZFx2IJuQcz9D5Gti;6j%mJFsCD~;eLs5YLb*cr23ud2Q zQxS^J;(iaUS4efsG5mDT}zATj2%818?56 zd#h-}q4hj{;^zstb0I1s#!5B>uRebU9n{)PIe0T$L*0?waW*r_zt-4dKgp^794{(~ zFkFk7rKlpbS1}|TIVtVq7 at TP0!Zh)=AK=Dq(;?l{;R{dFOhy}w;&s7X7a78tz#a5D z>ap|YtkWKkyKW<#MUu5vmb`KO^hQl-*^|?N&u{Q03h>`#tPAx9F~R5AYfeB at 2%ynQQs>qDE0B4MAQRgF1Q3uu05ykVAqR&s(LudKzt*{ zW!T>(aTcF##klFgfhNmmkW_$@pn$D{utp8kVa_7kOy;mz%4=37mlC70tb0g_ujS?X z$@D^`%vQSKQ;NI7H$HyN#y>@QMdye(pE9aByZ)v`${myaC2JT#wg)&d--6s_s`IPl zGowDhvY*fxaA at lYxJ2G2J*sT>dcwKF5%(|)rcHZut-?`yyjAohg at AH7#1BO zlb|%KrLFLK6%>wCV%maKPH4ltzf=m$n9d8MG^$>ZAR$^TV(f8Jsw*`9_XxJ-X=Sv3 zxav89{f~dH`xhAh2}Pyb|u48O at 1m# z;JmWoZpth`dUSw%Cnbge&6R6Y8Q8gvaxj16bd5njU*7;XB%BK}FG)G=B#_i-*y7o=2t(jOH%gYP}G=zMyR==z6vY9MfhR7jJxuukV?Z}x z at FuSH`4sdG%n=e(>P`85c7A3xL})|L_wn*=~_*k((puz96%~ys5oKGX$~6E%g|XIRXlXLes{42jzzKG}V# zTKe#?I!^9K)NpMkI)%V{a2-d#KT1>*WZeM*B^7QgvS#8X_HLKkZ>hYb5wsKvs~6|k zF*99NvSiUULYG2|wJfwwH-RM^r^fs^RHASgK9EwPfyPSMNPZu$;=DXT*A=b<@*7nA zc$b1xLO}7+fk0D!>W6RZ^b>*X at CrszmHYv$w!88v<>s=qO^*r-bHn3NbU{Hic?rd1 zi9FIceH3S71Q9vH>IY_syr|EQG^4Z52vR}QXj}3U15A^C1*ym|A;)?g5XE!k547~M z5vPN4=AYWcHRZ}Oe;%}GHBl{uC&v?X49;xID at CN6l>|+1(W9&z$8^gG*86k=76Z`T zwH6|=_ at C|>S}8=tM{sb*&-hZKe&J50jUwYIFf6FW#q;+f$QpAE5;T8dJ>BoK3obyd z{R|U~VdBq0Y9C^`z=+G2w(fTxW$*L|!!g~*^H`dD^aU*{hr1%vC|c&FuR7feFjk<7 zK&6s z%?mA3Es|`SybBksdp%lWZF?4X-3PDM5de1HDsmp`Atwyd=}WQ6kF^u%i1y(y#^}>q z{Ed08v$1*zp$B1y$FG4g7I(lNlB!?FL>er(KswcV%7s6>Cn_|oK8C!*7BU-rQXO{+ zX^pqHEjU^edi})%v+BCt^li7SiF4 at UlS|&|ZEzRt<|7OXp*Dc8lh76LTkY>YFLTAk zFk}gf3~3073mP{_CvMY`S<)%!!n~rXUSpVK71c$12ro{PFsh+WlR!i96N63GvCt>q ztJGy}2fXf>%`fbFE!rO27yZR7wJc5EDS-%@VsnheLjUk|lnPhu&%asmC|UZi82^4R ztp6chGyJ=9Sg^WaV?u#GUSolZ6D&{sp~^2tMxju|M;kz3AIx$?VSnrvd98FSmfYqC zQwEBJ&?ks*0uU at jGlFmEO3zOJa&hsM?eY0|1mlBwL5mk21{$S~*#uu`GmI;pkUuPQ zWWsXjX4d9#Zaj*9c%^`EGc{@8dR9Q zJ8C>PBKtZuIFpE0Y_WqFaDC)*F&U^wrt|B+^2mAQtbzO?p5rj9f^1o|G?t8(j(n^x zh$vR+yT_qV_BFwxoai{VuoKzEr2K3D=0c^| zFkse2nUBr# z7sTA-fo@#$*Cmg_Bale<9dMOT)RJdLv0cmv)iIE$TETpj6^O8w-;I(2J&992ouQA& zyKr~Cd(>2?VpuDp0r!qa$lMA=jnExe%>kCe at MussuAwWL=BcBA&(MJR(L7GVw~)hD zSUe6ZbHah;{DiaBoGmzUQoWQ)_?1-?NhoTD_5=o^Lj5%E;2R>9|6qSj0?1Xm6fpFxsFv!%TUZ5Wcy!N}AV zA-gvc9bO#{gV(1 at N8^Qf*bXZrl`Msfp7oLK*yHJQ!#=p0o7)Riws!}sR3&N82?pn? zKvqB`tR4Y}nn}@uX(HREjA7Tih)yF|^OlioXLy#GvLBIyfeGPXIT82xQKGsgUq1*0 z-mSkmP_4Q35Hwo1a>WKxc*@2ti2(``W8KtF8nsey{N7^+)5#z*-6Z`DHCW~b?1NH_ zrDSQ}X}a{WWgX5csP8J|Y=K@(2wr^S1U4wJ*fjjGpGUog-enz6yy(QS#c at zW{uC}B zugzE`nyOhQ7g&$jEyL4bCtgKIC2Q%Yzk at uwb=-5<;&t<`BvvnPK}XcZXB_kt*J$gC zi6;0ocPF*$WEG+`iP-_TTT1Gl`kLvbUR*%F+5|+Fx%}pP^)9Vk+}K*Cj|2lSik*uY zst$7lUheotov+T_!niY at z;*|-rhZfA)rTkLm60|sgA5)(YaS0v(lGZ*P$$MfIslZeRP}DcNv5!h?2K$&f zh$UePh-XFL??j2Hql)C;7!+{c=)cic&Xn>B{oDl_yu1gL{Gm1i@{9gmQncc*b9nrP zDg^j{Mv;vF2dLjN{|Gc};qJV47n7&RBm1GeslZ0 at ifmv2NkRlBWg+(I=xMb zJXi{QSlpv>Obu>5yqN+U=)9SXy)C2oPAj~KKYiR`3S}z!+M+QkL2b49SI$N;uO|PA zAPnG3FzK*y2Q(hLQ;TL0xp1voMet=rYmchTN5CX0t&oT(_u0qlm$jO9RyV6n at 1-R8 zrFa~(4OpjBTJN(SUDh~Jw=2m=?JIF5EByS;AVm^lvX_rujUn=J%r62!)UXC~&&Yq; zK~uN>BU?^d*SnOkk*ivZ6}WTT(L*hES*{0)6JqmM%vtqpV+`^6qOLfo# z3_yp&aO=C9>x1JW&_On*UP+oX1Oba$z$DpVJd&;0u(}b8gl|j|(-sq+SivT^5~|A1 zvyRihlIhQzOd`-q__d;jK3`oA}dS{tixKtDi$tL?!JF zPnD}`EwHMZ at dq4S%rm at 5xabV{abn7|ZURxk);xLOS2v>(h!;Q4y<9^KKCIw2;Sw`_ zz%S0|p5O`2x(oaTY`pyLiYX=2SiAi_45`=wuVSShVZY=YMcA?;dacL+6g$A7QFfrk zNv7CoZoCZve5(Xl84{Z?o6yN#?E20{I!>VD!ebvh3E?eM3Bjy6%6a8J%gr9NxFXTR z7-?i>5n%q2O#W$dz9VJ+|Kmc8*~O;(7rtcwA=5Jbi)pq05jn-}+F9qMK9L%rK=Dgh z@=dKG3?Yv;nuK{dZRs{bFukdAlIq3=s&^D!*Nwg(!}}KEwJ^%HrH&q29f|dPhMm#$ zhP%ge*@~7eogLz|r#(I-k<6TgT942V1~0;A at 0@fqaO?fw5p#>5UJFa1gjB|z z6sxZ|Bje!u_=~w{E0C=<_u^zi_hLZ=@B=DT18LDpSd(xAd`qQ6ZFxuHTECx{J{+SH zZ9GcgArHyD0YW-gU=ez)0Xl0bv)tZo at i2my8xX#UrWMzXO3peHZP++$YN3~UkTHRX zR%}}E!Vm~_*8BN^(p(3Z-6O8`b;4!FP#=DdtZC+pUVf4%Xbi|mAzex}443B at 2IE~1 zzE^j{*Po&SH8LM+ug1C+GF!xI_HkAOQrbPi*rx)Sm1p;9lVj2DHoB46nIj{Q-3$|V zwxD1)Tk;~bX_;Ic%gMBP7Z)3<7`f@#7>6&voFX|fOu2Heoap?;fAO>0B|2kC>u0F8 z_t}4N-Qd=md6%nkgJk2sJdaZmK461G;^|NO1ej-)gj)f^pzF*ZV~vWL)S(#39LzG` zs0ah?$)#I{3t0?MWWO7D(uFcFYD?x}x5NvM=~C<5scy~gcek}+88h~iy$Wy+*uF*u zP%BHmu>U(YZw2hJDgI&;`ae{k{|u-qPW+epJZNJ|Qq1SuBnl>?cK*=~BOo9jPZ0b} zK!&6`X5TWSGJ|DRN?{9zE(b+~>lZ38#Sx++JceWB?&@OlygAtW at U&S<3$)>;B!tTh zf|H5!0&8Ty`%5;vuz&t&&44b(y7mO>SOgh-#c+%_MM6Xt!{JHCP)vIj4<@9zN6EmK z1rWX$%zZ!Bxb*_q#NO~`W*rf9=l6Xw5GOUDsjUto#U;Kwj8fdG8( z^15+)pq00k;>;qP2h9pI-HqaKl2A2Cq3EZP`2#I0=;3S_Lc!+EKz(@zoFHFveQ` zHF65H_>XmTramIi#*UUBDDAH3KTV?4WK(hoo005#{)r3nvlj>TLuW*eoy=2B> z)!M?Sas=;l#bP+25)Nxb6uhW&+GF4 at 9Lw?|j2kG7P7m3^vel(ljB0z|yS`6^J(0_AsE zZzk3!?gD6!Tlp-&4*U`J3V$|^h{=m5K~TAyx;#%^rBD9(eENd$GhMUJ_jhizVly*X z>=)!}sW&dPJcI(_MYm^7#Dhr>O3=4-FpLLZ9tRd=#H+08oULPreHw~w ziZM7(SlF+fQ) zHZBuH%negY_cm^V6$Y2n5EUm_Ba3Chj(^ zQ_5Nu$GD8Dvo+>fDP?J4&lxzjvx_!_qK1#b4Gjfc>dwfqO>wEK4g@~9a zg>bvtq?#)EGt_jJe8oTtrq3^3FKz+8N6DrwNLbF4natI!mN)>4q<%!G(K<5GJ~74| z-7*`J8>`|i-Pw|Kwl7G`zbP+tCG;{?kio0?N}UYBBe2`R7$aNjCCHFZz{DL#x?v(5 z{5M$Da%+cPnNR~&>2H$KnAMV9&|f6n at esr`9*gkyNzCEhndN+X|4sb`zC@&*{KZTE z-y!<{05j71cK at gSPk&dHZAENll<#dXYsg4F&!B#mPKmZqN+{Yn~? zItiOblP0MquIbPHuHG*1dbv&`=@x%04Y~6?!kFh+h1qVXpTC&d4kvdUXGec$dG;ib z`hLA)^!-dBI2&1q3YyUT5?1>#eQRv!^=wPc#KgnJ#(^pmz|K4JGrMg()otQP zg+AGtGDI22#7uHC<|XUwntI};zzi>mW*e$fTk?(hzx63MOv)K)J2<6%2n z<-PWhbOOx=b7gaOQ^-a>T+Yj*L(mCr%^x4=Lx2F?3KQNkDGVy7*z-_RkZoxx-{wZ<+0ej^A0SJg(s%9GhG01Kw2-%SNTaTe1I1J2C4Fm_76hL2#bhCkzpkE?B(#0Z(_eDZvxH z96+YEClfxAcZksz;tp^}VS)s($}PzU^v~5d;&Rv+_-mC&<~0B8by;f1WzAv}#yYjP zFfaUB%j}eWy!0s@@9LaJW?AR7miH$*+5<%=r;|ViL|(W<-%~}OZyA$3M*P>+x+7d>W?k&UhF zr1c!*TEFj-z)F!FryQl5!8vrRT-6ofy%{{bn4#HP6SK*%oQ;N+>NG*CP&;~pfA)#i zEI66c{iR?oHfv5i#n%RB_rPjS1?Da8IKG zlwt372pWC at PolY%<{>Oh-_u%z4{0p{GQ2fQPOSbd>s#NRDGEzZ)f2^1Gf-!bZMldh zm0}H}Y~w3- at m~QrAE-1RaJdc6TgJVIFwYPw>$z%%vP$u?1VR+lO-8!kgmu*sp+>0dsT6ZY%EpV;A&SiumKZ9^DNE*E!g at Yg@))*< z*;o^h+1wSOUMLzrMa!6VRoV9c{mcP8^OSP*w^#djv!(eDNK?_tLEp*P)cv1~8P_iX zLjPCZl{>fARKJ7ka4kjlKSZPk$dNt9k%|reR9p~hRPR at P*aLZ$J5Zv2T8RYF|D*5I z!#g#4y2lu@>d6_G$>m~P~t0&1ezay;pJ_Y*G``F2AqTLW%)15jbQp%(0bIVUa%6UJ% zqInoa$9)@0sh>V at qfFD7dgvaNW!moqa1Dy|espLy(S%HeXhY at 0(9>ih!qF#tsFwm! zy1%ex9#Hcj#AXM`RGz^6_x192#>VCUhbVyr0%HA7*6Y6-<~F9{e|!2)w*LzGl)_O) z`Ez6ZoC-sAEP8R1f|q|KqnYx zd;o-?*+ at 7Y?!ce|Cwa4ed9;|dl11#;Y at z;p)bat!f&zBxh7d-ny@*9 at aD4xv!(liO zNii38pAyg_Eb!_C4H{f(zV&^>b3+P+g$aJL&fHbi9|d*Rhj;OFBkbY?8%8JDlWK(u zJ at w#%9D-(}^zy8eGo2yz>1oJxN!NhD3v+Sl+DYCKCtC~r zMPS)m6rOpz8N*YNimiGOzBZU=<&Ai);1MF(u zRJQ+O`=rNCai81 at Sz3l>OZjd5_FU94&g#njjS1qQs{lr^)_#?8%fq|5V1rt#xe&FhKgI!Y7P=dfx<3mJN}FFP=#8+F9ymG}JU-1_geU06JYwJCk5oF!xo~)Y(_1T` zStzbpbWoijG(MSMu{{3luyWtmLqvA4-ms(JF97<-n?y(g9(?R7?^wn#Z0g)qK&fY5 zZ|?ro&UMz-?woZAAj!P*CEmq_)5NToo++)`HJ1i!zQ6`;3oI7${^8WzwTffTJfx<( zGOx7c$UG)WLNcgXhP~BWh$?=Z$kn%ufU`4$Bnp?U7Obq-oUY__lv!1g;|$I!-*hE3 z%!+=2paFtg902(y3U at IsnDa;;=M5Qmm6VV~vjtHQ{kYmEFW8{!jVD#D4yGFG1(Xnx z)T8`b3|mD|hN~@n2Hx)Q=r#@l^nnZg0gwL-g0&vYHs&Kh`hgj`PRl0614v$ato88o zum=@A*DDvl&B~MWRL!efH5bOPSM)~6>J6?f!cjSPh1;KJ(-ncC7Pu at crdMUx*XH;3 z5>h_2{Mi&SvLlkkg>sInEeaULx=8)mF|jr=(prDUX|}r+L+;qhc^jP^Z98_OD`3sk z0{cBNQrQGcF^REdUm}&*WtmZ8ks--oC!;`OKeRG0CkP*Zd4Yw++wXs=i8F%)qt{C? z<|7FB090Qg2(9Oy>HF?ud|;D5BgoYG+UIN!2*a;s?L({DC4bz4BOFN6)D2zQMYHN< zi{8 at P4w!bK>OQcxnlkP*uVw?zeV7!+2iNUxYNhw85mR!4vBrg`-%I^<#ad#_s2_!ADw5U z5>M4^ADQb#94z*L9y2%Lt}OtKt3NSU{+5X6a`4pc?t!5vFAt#mxW5S96GTh-3Y~Mm zU&+ujaw$9MCen}Vm5tupf3W+wua3E^P=~ksyw3 at 3{-V8d@_}s=TmJY63JyGRWZaE(}cm~Tzz`Nh`5Y?aj9`WDP{7U9g{bHFH*CqgtS%+ zQp#*HCQ3%rn9{On at pFYSXRL^DT#6)pf$%Y7CM_O}x>U44Qo}`{5lPa+MNPnx#9FQJ z-1rijAIVZCfJqj#oq)d#OU}Q!G!M3)xde8AFe)vmq%g!>ZItK{>@t*%jj|tmn(6{c zV+2kycd8Wq at e0!#UzpMQFg++GW4Qs`H&VQ|*(h%1!@@q!<<6RnK{xi>pvp#Ygvb at 5 z5aM#KFLyDO*}h6aX+TXmdW-4lS1Ve4a8l4<{~gQ*F?GVil+h6TPDkEGON2NZMc;i& ze1y?cQ4do3idx at RiHCrMfT%Jbls2RLBEy2mRF}~aEXOJ0;*?s3v5^$Vr5KoiwWFZX zRRb!cxlekJc*@~@Ldt}r6uog8`5+5%w%7=j1qz#O)mh|WM|xArtC-=F+Da1A2LkBj z`VKx-X0_fb at FpQ8jV2lFsob*5r;^+GFEYRmdx at FvRh&qSo4c5$eRUh9n29i_0KIm!AmNNmYf{W<#uiG z0142FvpJvjx)hm9Rjb$$R@}rH?CJTEaUVqh)1J6_te0xR(mW7nnks?G8ZeX5AErbzhBU at l_yh^hdrb zBYO7*VCJ84ZN#&z&rw70;xBr zH<#R9jH`;4?FiyvhSxm}OhpbC3FqZImAyBEW6r!Xug4VtV&A_*a)1qrdyO;CWtI9O zS!fU*S4Nr#d=$j%a+Ubb+!?Xhd<6&W-#NlX-b;pXFP^jn6*IfwcPAgW{W{H+u9!i9 zwfZ2tuN|HbKnwi7M%EId-4uTDNa;pDUcpum;$3J5BW-j;%a+-q?#OkzqQYgqW}6kz zOKW7_5(=_V9g=YQ!5dlk2*NAG*DBuLVQa4H_11UeeneA0A}x@~Kv{#IkAHY)V?$c; zd6$oE8_nuAyDOO at jMyP?tMiZ?6&3;4Hixp*9bP#z&1#EI;-s&1#AIjc#T4e`P0Mxw zZQkj8kYU_50c9cieF#{Zd15uZxVv#%vs&+&Ky+pIyD9_u!gJmQzKEoYD;Z1q|NTSL#EQ|6dAXFf^K-)M3AdbN`T(}=$O z&ELVyPP`v8$MI!2vhYE$CAeicwp#pe9AdvqhYk~4;81~n4_Do;wcW1m%$UNsTv2vd zerug_z*{+^KS at s~><(j at v5AKYhcwwvgz0r3K_M4ILi%V)ldEhL~4jQnKcDWNA`SQz3v_omc zx5jMk7k4&eTL|ZhooPFDBeAL6IGP0~=t@*wabv3;2(-tG&0SKVD^m1Af~4)s*Kwyt z&CACfa6hw1Ybvn at sHz>!QfExyF(^C1SSO at L1Ss|EuN%@agmomWuQF-0Jy%67&hnV2 z-`=SB2onIuW{C{PLYjq48PThH`QHVYJJRJgAl;U3qU=Y9G-AGp3%0vE3bIm>FGbg= z7JHz>_VI-vtMj7p at hgZlr0x^KNMs41WX__MiB0ch)w(FHS7CL9;oLiFKIZ6JuhL>r zpCl67N9Y6e=l%QZ1$^XeQ~!8#-G&#Ip~*2GX$#qZTax}_cg}9C(s{e ziQlzzMxm1x)}wrC1<)%n1*Jc2S4=1*04Sz)wKAPYkvirYRaH*QA*vcrQ-=RTU7-nrr z8i8P%8XesP}GyrAKtK8f8$&Ds6jA^%HNQU&v_CTIJ|o_w*S{1jQeT5isq zizTzgp`LkCWAcK&;)IGZWdYj5il;fh^jhHi&l8Fl-Sp~=Is1M)i2`_R$~fJY%WDKT zxAEueUi`MF^nSa$8Wy_^ z`(}SfxV47Re93BV){Ob&Mck6dd;8z*T7>Y8xw#E^m#}(mS5BIMpZjHP$(b#pZJ5QH zr+Z+q`NEZHvX_eBy at jak4*nl1bAhUD^eA0XVR+ckH-wXR1H^7TtfhTJ*jsAQIs at Wh zwW*nzTV4~=Ihj9LSy+X^Yz-y&e~5!=y5;F%v%d%I^YG#-B;cH at VGJz0_s_Y`vCJXo z-&bF{rnkkdE~cc at 9|>0{C9XHTJx$ro(4zx%fN8}OyIz^nzqz>*w-&!XfwwN+xVbVf z;YcqLWS8-BYIwO6ZP!wlr!c at y43S7`m#{h#sN?35?p`Jtfu z=oGn72DPTs(B at aCe6c2f;{AGws_8<*3U!fULhU)3&uS;}t+;;eeWk at oGfI-<}|<(Y3NKWr&%k}czP7Uuk`L`?9PfYI!# z*)cpvjH1hxQ1_$3?MdY9+9mNklK=)JFw+X8n%=5?jKy$w7PcZa at 0pue4FlzH3(oc3YTz;WQrDq$M zC$nC!4?4d`k@>=<1SE=noU?Cn2!3qD^SM-DF?eq=z1M)HaN25xHMfdh)b111|0I(# zONQ&`Q1EK$uapo~=v{Rt2OXZQHhO+qP|gd8*E>SNFD8_j|2cTR-MlYqs?xW*A zBJG%KO_uAdsVla at munpdHaF8yGz1w5$%I-`VTDy#hfLI3;C&Q`o^lEUua)Jd|JFx$ z6KA3qB#QGQ4`XUvcq>fYfaB at v{B+U0&HkR5`2BVK%nKON9~0Zxp4Uoa2**mafebH< zF5W>(=%>jb;l>-}0CUgq^TyZACfr0`1Qb_7E$${ZAR4_V2U$9Py*}uSZA1U0QZ2ly zGQBZPcyVd4-Zr8o zox?XOfvH at lL|tWa2NYw8x?WBhTPLO3#(vV71U>JgKFESDV>+Q};oYKFZZeIRd)0cB zhLKL$YK>VKN%;@=V-}S!zs6mi3>fh at E^@fGavP>4mAADSBUZ+5on`vHEvS*P!U)Qd zrmPg5S+V3}PgH=|kuiv=FaiV_0^%e{Hxs7U1MV8bkIJ-tib1gK*%|upYEY)Q`qBPI zS%i7q6%5MPRzr4uPvu$J;$8ldIWFB`dL2f6Oe<}JP1mY&jYZ;_p01`goNPtq3$^s) zPZgS>!N85-cX at bg>P^Qn^+&|4A^Vf>$PX)9CkKdzjc^fO{9YUjvf;E at We7Y$qxt4N z1Rte3!}a>RLmkFWie>0J+;LBi~E0gse4?4s?zL znN86GorkU|U9E-IS(juAQCUQ+gkq+q+EbgG6C at 4U=109@$o9C6$xy&iFYLOEPc%$^ zxwR=g4(?ax>5kj9dnTek)U*hGfKhJ091pIIoodB*sSP#rsb7bijjZZa2OLpFzE)9s z at gR(SKp6B}Vu5cN(AbGDvMw6iBZB^r6y-RL8R z^n};nPU_QlBy)o%&+|lI7VmQnux$}2O<*aX($0Y=KQB7|#!iE;j~b7Y8V~Z|7UMDB zI*Fc^t at aTV-e;rOeKt6m`vuQWw?S{*E%T1jqm9nXPZuek?ol0zL1pZD at clp=i~LaW zRGUmSSddp>s(5ICjTfu6J$wN06{!LA28H1e(wpJKIpMiH1!{qT6Nq@&$xHV?vzMO9wiz2B z0KhBYzdesrGB>pRKZP}ca?+B(^a$SO%Qo7}D(B631a5Nh+MYjzZWWLdG(aS;Pg$Bu z+aZZGdvOnY#fXVVubty%mvgtrd}0D$oS&-8yAUg262nIFyP$fgt5(=x5F z(1ZfLL at yk|Ti%a at s;Ua;8sUS;@!T%*YHH*vWA<0#E5FKPXfG552uDN|{jC}^LjFW!3+dm;=ZNRsOE)q>o5=w2*Tw;{NB!PXg87k!1BJ=JtU z&&O5|TV_cT`+O?Nx20i4yo{zGEakU;EGy_P<{?oj%N3dD^CGjg!&nH&I^fw2u#)_~ z$`;4qSP=l5*Em`ti(#s9Sl&;Y%O5Edq|k=uZ at b4^wP6{}6N;61!D-{>r|w>*eyL#j zF-cNrn%x0x#fkzwjS58Bh8dQ0R6U&?oBQeparW5H^vpo+3Q9M}@CjY0MyzO>7aljs zSLnC*#rBbRy~G{R2~*$ZZlmwdH3$rm=o;BugloeeKf_X3^8rdf|3<I}2SN^e5Fk zfB^uY`=6h(oW8k(tGT1Gu)VXni at ueyjp09<-l=H1A}J$($&egy6cPg!qW-X?7WWX3 z&6{gbCX)-p$D>x3OE70(0Unh~m6GU%KI{IiitDz^zuZUAmIST)3C{Bh?DeR=aXgVa zS{Rz-;yjh*`1JMEY-{@V&dd7^wF7ZAn6u-L#xsyeS0(aeSk(Taf7o8DpY-FFT(za@ zH}+?cqy}0!J+j;Zyf*v&rtU5sPk3&+zmp-gAEGYoSIdu~Ni_VV*L=jF(U_TW4`J5K z`DTluAeE&_zbU#5O0~p^G~>#|N0?BQ at reoxW$yW$MB at +|bjzZn1uF*e>mDN$FL!oM z(I9T+O_qkcFdJ3a at s19+FyBnWleFfEvi#JkFqNv)_MI=fpqU7Lj47=C-2<7FLKQT> zdzDx-=VKVf>1B%Yw$6&mBy-Z(dZ+^pLZAm4R)3k%5{3w8f$kFYC+qw&*5U4M^s}ip zaMuG+I};q-2|Rc?YK<@7e!8 at Y%^8*kDRstWhVUpGN0L<+&(d-wcEPSpy_I#D zQvSmNQqCl8)oON;RpsJKD}Sic=SKdAz6(pkt4wT5RDaKv+ux!{6dI zF#4-U9be9g(B-TTeu7!RLv(@z;VEyqL^o*a6bC{2HH^$~xO29P4GhjRT?a01GO-v^ zgva=jR`f$#7$o;(=~3?)@2X--UGbf$r==Qw&{$&DGR!;gZ}SBnCon)Ov>ZJ6ur z)>E4)&L56El*?hMkbOK$(fm+`+QKwzN+Z5;E5mpm%1inn^NS3Co0YBhqQcro%2R}+ zY}PYfWzn+B*?i+Eru?9m*EJ5}ne(+4tWk7#B!gZC+5*IiUY1lTrgpj0(k?;eZhvm6 z&C{Z*;VV}DlZ3jW{7Aw?{KNdytTn;i|Hh>>C8l2 zcRiKKu^%~4kJ=eET|lOtjNfSwJ%w$ymMsU0Y-;MNN*A_|{U*IFYB1G&INWhw8Yc2? zJKc{4hR6wag&GB3Fav~%`(S{Zd#Bv{L?CE at +hvXm7N?lS$Y~_~1fk-7Ljs!4`3Tv8 zZz$ez_P7GGT@{4bQ+~76hah}t+HUOCCmK9nxlgs=kbF1w=gF4u%e{)(`X;gZ64%A? z4%3EtrLUC&AI>Hiu)`(v<|l_O!u7WeKDGRTJpPjaKI=P|%fT5}FM7fIx7`iC-xwjU zpHILEyC0qX8A+7jzy%xqC;?$!sssDWER~_3OiB!iI8 at A``y1^AY~T5iITkTFnL(vy zk at qI6*O4X;p(HDkZJba)0pqQji2=ip%*4@~IJ+5GPY$*g(Rv9kc<)~7fvRa9 zudic0?lF*Edl9HtG`t7MzNb9Q915&qCi8(2O%)-5u8$B>dO`w~5{CK|LK$*-M`4XF z!Wz;~w$`r%-Fa8>ym29sJLXEP&R-9#1J{PvCyWErj!T9Q&7hC5b7SsFbxh!i9awk? zKTg#Px83(p5l|jdp7xOk<*%7k&l{=-Uo&%gCD8hTx-DN(L}g{HeHYy9_ssbVDQn-? zIg(@8G!VX&Ri!1N~7V!C()1;CKH;o8)&@M?P&}4~-0QcFwQmA}^{vS?f{=@0{ufDZX zf4p`A$iL7 z%R$2`MBXE_bW0&gUzS_cqa(tsd>TDh`HaE0e=#4hj^?*zi?TasdFJBpPAno17SSE+ zqK0t at o}+KuKmyyXq;C#1gt9e_>lm&%f?VEn5pBsL&U}sp26LIHQAmzDb{xL8^Ca3! z at roGxYfkVpx+ z4kY~>;-- at YQUER3Qze2f9AaDqj-NT>iHu~rM|J1=Pn(bgV{jc*HUZC&8$`1B-#=|c zBWOn`_#5xg4ekR(@pqR%=!hfsWyDJ4N!abg2jo(hlSq#JtJSoL$jldiE z;D7C6h2qKqYp=izQl^ok&Ry;JnBn3HvPd`ED~*_Z1O78Iv#3>Z1pgq@`VTT0{vVMk zZe(oZWbX90P%1I*KPohWw#}P2UD`wNa`HkH0)Ey&CkF+YQ4FOO5h17P?F}|$Cg87U zwzOOOb&o>x($J;70Ds62)#EM|Src3hX4IQbxgTY?9vxTP@&a7wPxE15g0aYt2nfm# zH}Sg&4o5|i!lYVs+TV5Pu)}Ob*?FDnGNdRE|F9W6$|B_oQmCx-P*E+dqNZ~29IMsX zKw8>u at 4~XvWV7C_{3hQvZ8?Qhb!aEolBGCqc=Pk^G)XBX8 at _MdXKmd?B^Saq6iY57 z`~(g%%3U#stk|wTZ|rIr0)Z z`e1i#Vx*rcQbsZJwc|DSysQ&7PuEU}1{%Q+Y+rEmEe~F^`7sfrzDu)*$JMh4E~n(h zy*Y%woV`>J8AErZ)dFG)ZFh@(3SG~k1`=s%U1||d)8I<=Php2tKqHf zUp`+zHU5trM>Tu>!;HAfT+cOUyMe*UK#g0W3^MJsK#^JW6sIB#(#mJMiF}VYT=DV} zhO(HKPoQI%>BB&YRowDG_ukeEc;TWH>~Z-au_oI=3>-lBWYQhFtL9gw?TWTmn5ad5sh9R{3^lI)9UeIBN3ZbDXabirb1rR?>(09pZqh=*&uc0jW3J%9*t3rSu9z-4wzYAt^ zqCJ?&CeE7~_XD6;$y`N(M+^=J9Z~AXuRHqp>S$Sj=#xP)11CuB^H*mDwx+>$5P at HA zoa;B3nBz38v`OQ4p>|yq4#Vvf5c+myXq(*SWa_UJMhxT?WmUgS94w5LDMjWhT}ciVCbE~(b!So)mRmaGlcyHgA;GE0Ayq{e+}mQUMBQGl z*C6nip?9M{38mow#)69O zj!wqb|J{6rN}94r@(5pW2{xtUgAU2zmY~+*F5#}Ay#Zndb$Sg!&zDbf at T*t!p7OWD zFK3qC2#^#ahD^7j=%&quKcO)8`mZKZ?23Ef{w7YG0{+$oByAY+~4E7}X6Gy>2X6&zGLa69~`~Fs&NU zI#AjLb~}F;4rad!a0H0sK552(g~4PvP>MamB``Xy6pxm-lTk#Sg3}n|*c>;+XcEcQ zkpVC7Q4(;~lp0!21y50U%#`cN45DZmqkT)#LsgZwL}9|Pm+>=NYj*7zPbR0Ct8d&l zc>G91VVJ!LVQ~H^3e#+vj42d3IOiT+_Kbt~j6;o@*3L_@#c2-X%wcHwg^ks}`F+MH z_??XmFPXk^hkljGW)%PIv(UvdJ`?+CgjQkKJ$3Tiy`r;z5|S(<0e4cclXpH)z*paZ z*JTG1<6TW6`8L-;|}$icntDm{}!!ZYT%A2MsAj$dynrssymTp;@#YH>O9l?pK~w zHsotyj4pkktx{ifh;&p8+?ce;+3B*EVov3fC|Evjyy+|CdA}WNc{bY-eR`^iMnC?~|4y*i0sv1`rJ> zWDmZcha}`{AOdR%dPD`WH3R+uaR)K*V#hr#jj-qUPxu$gGWgPQn#0*fuY35Hz01XM z|2C)A4O55QR;Sj5;0gBCW6tfbr!CW`RNC*i2Sys4lYG(-v< z_+6~HOtxqxgn4|e9$}PIgeD0$Fh&O!%z+FnTJa=Ofs|q6*7vY5Qo)tLa{P;AOLVTn zJq-le;2F|L^pm?-<=FU;4k(;HfU0t`5;Zw}vX!I^oNTFrDILyu8QEf#fOysiVs4W& z75pT7>wbz1JUK13sB+D#3>yzE{$cTch7CoiH9~(!C?NY-QcKmj8n-dc2?tM+=`^jl z&UONcxQO7>YG_Gu9kF0g5h5%!GPMfo+en`65iO at kc{t&-WLndux z6{>PhE*4|8HuH@*D|4UB^^LLHaGd9tT`-B#jRJLJ|A$&eh8BFjZPeVhD%Bs#)a{t^ z%p!pTC#y9cMzKEhS=LFE!W+!Y2|Y65w5t2)5ev5E&l>HD2i)SA>}zz(V%IVphiFBS+lL8lzDr0rXr z%`_afs*dxmHuO2_TlZ71AT)pAXtGGnKc^o`9rdDAyb&A(ltEDkySj+nY% zmGZ$hfAe!|=>~4A(6IaVx5U(Q*;_h%rIwFw at 9FnC-HCTceD3K5?AYZm{Y;As5^d?E ztfb4pEp>McuW&!Y*dv{dGSA3QP2UHb^Hwa^jDAByL#VfM?h!{=Mw2iBU#`J8rngHy z*Kp>pfl`#xL=296X#=Cs#)x7B!QfR<%_5ocOf4S0ZGm z_3pC^jy{Z0!{C~mR at ff3Bb6O~v%kb#Hs1v>{i{maR#D8wu?u)~ON~?oXG_9WQOg6j z=e at KSFz!@LZK0b-o$;E&@?8Zc2X z*`RCq-^IeC=a~lEen9mJ|S6S at TQ#w+>S}J9eu-g+3|dfd+T)_o{@1udEU`kYX)Ao$Gv(+ z2ctm5xiRJulWoJGROlihXQ(T5w#wA?{|VuDR^G at tDqu%1kt%i9?Bc~6*c z$yTEwxgkFX_YvarA;kWbiu^5b_G{4oBM9;%s{FX7$SEO;!8QvPwDA=jvoKx`L8 z265lsgGZprC4)fd_tKkLfvvB^Bgtn3(B?T>3cQzy!&)$-rC#}Cpc3-7t}VLeEvf1L zKy{3B-|+B{LVBrs|A$+yFucrc$ClY2AO8{$$u^0N0sM)FzJULi at sNiqDOiE&t`SgZ~&@**P@p?IN15=y@ zFdOldZuO=wCQ=z4pYHaLlWhTT_Iv={H%9hN0Gn%$_L{;y0NFR}Yp)FY2TAUuU_TR9iTJFA$VGrzWJEqYZ7hajTy??^uB%xH_Y8Jnk>ijCL8(kBS~t5w zD4m=S1msaxPBnH%ovrQ>K(!3a5ZG at i6|*j$s%K^?)zT?lXNuX`SBH>jz&!q%9Ix?! za+lz=uyUG4v$k4q3a1Vd{ch}sS)Bh#3nrSN=jNb4hUDC>PI*jdy1>v9y!P;t^5j;} z?uziaBF237ahj5RY(H<#`Ep`-X`>G z7;Keb>;SbGKuL~J(iKq^!Z`dnR{XTAF>rds3#NRCO||01GVN~{JEOC at NW zg8UllPz%F6l`Fh at ibG4fSgr6{<4k)PaaAMC27yAB8Fs_ at t{dQA0CuXC1PcxTFa-|) z!1BKU*neWGQB_kFa~b6ej0kqbFkRCsrWXdSSYQBAIu!d3=DF*klQ-we)r1J05HCE@#k`XJ z{i1VvYkSKy+dJy(E4$kpW at p^3`iFK(Gyw>HDJY6NO1OMVOU0f!N>W%M8HRqj9fo{Q zB3O$&@~&_$n54v=qq0nLz8e^&C&Ey@!Xr5B%P!8zORN?xhMm at 6bbiP#I|{G-Z3j`c zxFWCetzTHS at GNld-XK}j$nCK_R$$276YarqGE~ES5v7C98vRk=_-TSQwCe^#n6SK3 z&3D5Hd!ZlkQ90CVVjgJ{#r$V{k+s at UeP5*=K~ns*BtcS_l at _xC@pOYioax%D(poYs zxmkL~SVUnljZ{V_Qx?v+39a!^5h-#5h$WSOoBH%2;@K6p>qVaF%2tGaBHEoK)RX;{ zhw`?v>6d^il^P5=Gj)fsX%<+Ysze?UGFF!^xw8rtgz5_WZ9sxzExqNDbw6dRl8>9{ z;V$ePqhs=^jhT|b<4oo#JjWnby zcEc$|1{YFOHO3&zG51t-=42?DTC=zKEm)aiD#-&_OR8j~!My=ScKI8rVG at u*#hV_m zLC5f_da6kIpLahe^I)itsS59+;+uuS4&n at pk0SEK5|JnxEgc+peB3Alp at f)CA^Uym zdLCL6g`qf_BypvkZAdX?Uc?*JBru;`NPO&c9Q&CGve__U9 at e*8MYiAeJhzO-G?RZ~ik& zj^bpz$oMqMy7EMZM%Cf*P+0%GNv+GYs05Sd(fl_yW9gnVY^WRh9R%m3!bje2AankC|MzZ#dP9UTYyQm{DLsG3ms8&7 at jE z;W{KnB-2+I%Sc;y?Yc=-mtCcfpSOdX&R&T}3`2wP8 zy4ySD>?E3urD$NU49EMyPS{<2?3m1_B&+5l-)Ymlz3l05rx5NJ#~)D+PqtHqol<)& zXJ?`|xjK-)0%okdDf?Dex3cY$~{j#m1e?W!2HMZyw$UI;0NW9VAH_Y|!<^wZkEOjJx1oNV>6o4Fv;3I`xefJrix`*cN=|TkaQ|Mi*P at cr|&Ikm`jX51a?`VB&qJeocUW{U1} z^1~Zbmd at PS4Z$>)IE(JvFS9 at Xpd`XEC_(B3FDnmO`NKEzegO{3A<406+5v0)fnfhy zyuqpF%b at PdprTtPK+QMUril0oP~H9O3%iHkDG7Lmbdww#h9$`5Fb4h&AhNMuq09gJ z?Twq~!&47v$~_7&<(ip!2eC`HDpW=n7{b2Y) z|MR;X0WN=brLHJE(&jkYl6`=Zt_w>?RDJ=@#8z)Ij_d~ihxbCY3TxgVZ}9wpYm}*b zP~uwxZun8QwX-4!;BiN^&(!ykn%B-!pqiZa3F#Ce7C75j)-8f)=6F(aFVk(AyahO#4=ao# zm+l?k-#j-_!JAiK>A8e*+}!L~F7Ax8rybvRNNvbVVKII>2|}-$zN;qZQaN+7(}KQj zn8drYi$=&Mq+eu35vN7IxY at 7j18q_&cj0CfHK$;w131N}Y;e|4q~-?EALeeGYY86l zop>~qr#c>qpu745q7%B+=JoWzs7jZ?+GTNUjbZ==~vsC zI$6S_FFDTd(fRnL^AP~dOe>_qur9?dY7V6b4x=c8=pH9SeE$4nBv1y<&zJ+KkFUNQ zN%7G)FviSn%fpxz6%&p!@@%%`nI_x^+qJ|>1T2-H zR`Lv8N2YO{kMw}CnP&4*Fw1f$dH)$46o=KMnIHfFFwp<@ZI+0$jiHmd?Vk|r|DvAR zRz(s;{$fct64c`7uMJc>6lGooptLAt4uQhp`#~0J-rK|>{!^`Ob=H|!yHtsKAv|w~$h!@ZEkP5}Yfy?;tAm^$7HmpJGPU>!Wj| z5)UukR~Vd_!^g$V#L}}`9jS~5fmCAqFr>>6*RL)hvuDv at CYBv;{nBA}O)*{pg`(S_ z=mA7-C5Zw^f0zp(m0ou$CYl&r&pIMoMPi5SMK2b!YX2#Kx>sb*UKPjV<-n|b1b3l01Om>yk1iL2jpaCvG zHZ`=Ndy0Ar>KMyBiinai86U~M#eMQJbFInV#InmYVnS0Dsj_hf%KErnjKlV(%a#aF z`8S`~PtDBN at Hd0SIyZcBA)|O1MN1O)DRWUR()}c9Pr<%aw>^OSHHy}h_|x=Y*#zr4 z7Uu%QBKOL`>eCbS+cLWD`x9YCnMN(TIg;zPt|E;HdsU92;=ztiMa6uX0Fz}8-Iy>Q z>z0VQ$R^)OpZzJeLhCep4+^l`LceMyu0cjf)HNkJVO|5JhNrZWmfztNXj!ErhDySK z%ft~_#ezy3Js_PPn3j1tC3`=`CLJRSGpo{6X35Icz)^Iu9WPLBeY7;9 at 0ris$#eHu zuH;OaD3ed{+QRy&-Dr{{{R~m1tBEZ1=gGV}Pg*)KiM1?TB-1v>5!SbwbmT12z^^>* z6t%|gsTGzp$jxm(#KSEmL}TD7MH`3(K^L){6ovxC>;Fip&Y z7aw^;`pf at B(rmOjga))1e>@@YAHrk) ze at Zn~jrA at 6E8YCNut0HLW}Od#J03(zK%xZ|<7zoT2rVo?4(Sjyv`a{s4`Ld#J^*wW zZb-zhTR;HsF&B3xx-3PS%mS0I<*q*?H8YdlvE%-J`56~rsTO&dv;gU(Psne!z?U3& z9?S${Q}~dqTj(W?JUf(9f32 at Hy}gmq{57!dkY%Fne979J!Kx)n9VvNkLq4izF|uUU zK{rcGmLq8c+6WJNl>)!%5=T;?tODzm+H9dfbv8Aix6Tr>or0_IvsiC}S2;Q0(e;5N zZttU2*LP;W5nDI;3QzW=Z6*UEyMLM=?KAzt`JQ!mvPLRAQ6hH$CEp727FgLe0M|{+ zg0esN8!5Hi=QN}BK{RBLUU%n55%#<^R*SFcD0ZP}wwLvQ^5#;H72;=#WM7XLBD5M& z3VtI&!FI~;80g-tnx85feG9x$E*;^K$xjE9oNun^Nz{RkD+j7Eqbi2=A-4>7Pq!X- zP&InoA$U_dNb+C5yArj&;2wU9ec{Y%MhV5v+%BCm9Glz#sz21R&Ug6|iOvXki`i>O zzR~w2f}=;*S)0Ogo5DISLF|j2H$?InR2UEA{;PUJuwXL$&#D&S-}VLjznwPx=i|4I z{HtyTS?G9qt%S09i|@yWTc`~v=(G3>EVVgMW800{f0WH24P at 4%Z5iO)d+=rfJf%>Q z1)}S(Ht at ec(TJKG#n2&=oKL3KunnH;720$ns64tBMt;LqUT}EN2UJFKx1(jE%B&3c zi0B4^Ewe$gh|{PY`it;d zYGDA)@C8uk%|F5vW3E#nZj$|)G1YNvmGS<3I+_x|(@kCo9Uh8IuafU9cgPtD69eb8 zrc`inzz~T=aPo=9e+Ad|wbgrwwk31Gx4|3bO&mFtt|{6-)D0JmUht@)Kjzo|`0pEP z!6p at 6eY!LYGPI;kJmgLz283C9TrmxG`^4!($Y`L+<#6;{U;WKRnW%%^kyCQo+u=*T z5q-)qrH8cKlTxBPVa^#)Nu7!*TJ}skRn%B{%7?--pQW(qcr`j7W+x5j>et-RORV34b1u>}L1EIjF-?D*>&&|(hJ$lZ4azfIh#ftRC zWQ9LJdsA=BWfIdl=&dHo9!fHu7GyZiHb9d at ZMv1qv)jHmrGParupi!Z%2%(kJz&yV zuUM6tU<7DPRmEH_oH-}+8vt|9U5?Cj$`t~)lw!BgC=(xZ8U=8gYlPfWPmt;gem}X^ zlxGiCk9f`MK4HS-fBzV2M?Zo$T at E&>HA&`j~-Du)3Dv90dRF$KhM zY8}!;dx<3TTUQNxsA5d)OJhBkkoU at G%vH72lww z8S<Vp;p({byN=Sj%zf)YN5^;-z2l+8ejV6K8M}hBwkXa*eohghcB at Gc7xM)N zZUS>bCrE*Dcw)bicdTVdcr&x9C#=O7v>S=0peOy|M$z&_ at pas0lJSOu;Lbc{9*fr~ zF3}+&wo8QibBO||Tvo>+sPOrN#YF9(wgOT}1sMt-42IRLYQGGK7d#^+e(`O%3pxJU zg{G1>`(gu1xZ($iQhTRQ=#b;~QiP3dV at _ro@g*xEjW=R8t-fEm&ec=Ry0rF(w zNTm}L0o~K?G|-Zpxm3l$No1F%4lk at k9-9l24T>sRSem(}U21r8XjY zBg<{!|X`1d*ra`Rck{eT~XL1 zZ!wIwOg<)i=nv^Dk=i6KOG!T1(`jyS!O|aC)9G&fS8)101J-Et@;xmQlt^;r-+-v=EnL zZcLj^TCY9B_tcJ{!JJ;{m&y)#ibg++FZWL6X|XDk#xa_VgHg*J#gBza7Ox^G1IpZy zRt+u4-kOy6hIAWa+1W(iMTen+!G}b^p)s7^Ce|2+noNSb`c~*g at A~^+**XT(QfswM zHe)+Kerx%dXWwNooK2JQnR|Xto_EV=YsZ*Jd9V^NwG0 z$M9)H5niVq2$fOF=C)m_ETeoZ-8ngaf at Ry}WoGLZc%bHJ3(aRI9!qP%>iF89a7k<* zWUAlyH`j;;1xAEI7^Ye;@#rMq0T4_Ye1sY4Ub-VnhkG4*-BHB^u=@T zPCANhc at iFEc!0%qUJHB+!Yt=SxByogNm=4PiT1kEmv*cZ^j7oBcK8e315rwA{oax^ z9Ou%Y?K#N|_nkL_a64f0Uu;3ezQK&M3XR7KiDz37wK$KufsW`};$z1(s;ifJLTK9C1=DZKHzK#{quyZqv8R{u#HWL zi`;yB8iY6jp`4b-+lOH=dsn4c(jC?)PaMXQ%yN$HcmFml{KmWddmUY}zZPc~hp0-) zz{XTJ<+#=WhZ5DWV^yvez1c66A4>&g8>4;$oAu1SVcKxfpkSM3wctZyMsm+p1ZV_FxJTJU2Nr)C_~hRE+7d(-KMti}1Y7T?>E&@uZ@^9tFTDaWm> zgZCDfJpz^D>h$5X$a}SPo#Ax%3fV7EOp>%^V$_;ix>&VrwVua7P%Dj%z-#+=9y~yg zeL>-CkwqrKS}8%aK{Rz@@+EAmSQ3wIzv~QDM_+855Y8~CrpZ`qIYB7dw?C2!#=9!$}?S&I&ku*Zw;|D)=`ur zzsHT(OBKHVC2T5kW^4ZaCm*bb$h!!t!}5LI{JK{C$9 at JiDkc(_%3-h$W(irGUK+M0QH~q z+|6S~*xnry>=So&3??^sI;~1xLpTtdBKip_$@!aT5{ouxsB`PGXq8B#$rKN%LnY1M zQ(5APvKEFLTcj1H8{bilYm9`r1QmiaaHQ#-q9`Fr*O&QYB=fF;Cx+DC at e|LAO;%u) z1c!|R at +PnhmH|>^8Z3 at bOqD@C%94txgQ;2gQ>Eh{D~hAD_4 at uKm#y2N9pTOn8#FpV z7S(Y7K~T2|eBppUdY9vbZoCRsDs1$CV1kpWw>VYG=)g5nY946}{!A_HA`mIQ2+B;X z%(@Vv6ujC?RF1>ncsd%wG6rj1wLm-)%C?4T&yTHWJWdZSvZ28!X+mNvL^bZ>G(6Cc z=)@G;2)&zOeS9Z^R;Q<_|0yHDX2JG`kQ_b%eFu}CbQ%F5*jcXzHmSn^!b~hRE|vt1 zp3hd9-<6XTkhyqY?=fps1+qC+7Yf;4E|oGXDZ-{OmPS%k=6Vs(X at krR0*Vbytn$Fj zov~c0#de7-P0708=?bAD{h%5*0IM{5a{x|gwWoIROPuDZ%C87`VCZJE;PGVR5Mm?~& z$2_pOm$BVVWtaVii<-~6Q#ah}N$-PwtMt^}*ve)&1@(tlc8+5X-IX7FO;rW1wIL|)jxy4&*?2GI3wVXB0 zgH^oi4V2`Tr|0ZXOr_`jCnA0+!97Q;EZrTicSO-yRVR?=m=_J1jo>{%FHqWkXk0|# zgnZ*w2?)+{pfs}q&n|)L9GvFF>IP<+ zXdF&@)S0F}WnH*eyqK73@^v7lRJ24Lr$=?0u6d^ly+A}HQVrjY1JT~cu16lIuONvj zZ8RejD%NAYwr!h_>GWHzMMy1g{0vPk5aop-`FKturE`qS+jD8FGKIy+xn_eCY&vz1 z%b6^B+u93ZS}?k at I`qF1f4mE1NRnw+i$=a|IR0MdC)V$v_V!)%%5Adsp at Us_S{t%) z)NS%gk~)HxBE6|q^7i=hG!&}v;z6Dy*2Ai(*UHEFP+TG{#E>jLv*})rQtjo$`T?rwN91SR5~bNo9Rq1z zl1hNk|ADS#6Ox9NS0 at B(MngA55?tV7j$%^eCdLySf=h^R7hwdW8#FKkBu0#v55I$- z`pOuqwNpwEuEn0RIjEp_y-Q*(p{=jh4_n~#FMfFEE`YrE503l);F#_I1;^6H*0$yz z<~FAP`05`hUY9|VN7gPz)mU>t2?c^8GvK6#!PB7#7|;`=14YtIKUr_!E(I at UoSaAy z%KCu&)uSp!B!b&?8pzpwK98dhIyXRnhpA at p^kdZwfFzLW|Us+udjkC|0^%1Vj+j zcyv=GpCB_%o_;;$g5n+HV#?W+aj#RZs%Iq1YUPYi{V`qxsMLBqZmP(>YzF>#}z3s6PNlu*8z1IA z>KU-jnm?=DVvDUiSF)QquPy3j^30nv%Qh6dAOdyjB79qV4ib_NO92~Ak4fdJH$8RM z)7Q^s_F&`34XnQ4Cx--PW7{m-4$m%aoh}WQ> zN(la^crGPh9+vj(7JkA^o%;F!bZ!8`l_wujkQ{FZ7KLss0@(FpvFKN$Ttz!yIHYzD z#xnZ)xx=Rb2kpG?!7vu$SP%@9;39g!f^eu-twDM~CP&AT~Hs}kaHX&9+=eNP% zrS(>u_5QT+=l3OE#aC==5H`AAG1u7C7SmAMz;5xR_lSu8xHN7-C1 at Oi>?u6F6L{Ss z-fUhS*TIOhLIF}lz*!>92WzUslIvjC$Bf)>x3~fI#Z#i~X1u*Wmt^K3I+$mlRfUq9Vw{~C=4}X{L5Z8nL%)FjH7%OxU_dT` zzkS1l`1Xzezex)bcYBM!4O08Rq(`B$l at qcFiZ5%k%p7cGBM>4(rK)&9JQ^wsMPp&% z8kV5N91JJtKC1_8M8 at WnZrL^0>tKMlNXK5G;>WK at -#al5-Ye3mKpWWnv{eqX>FjZ* zY$wOh=euLQZ_;_$!cf&DH}0EgUhT(WwvK|`kN@*OxmFme}K-yZr-OEw|L8J&p;R1HbSK=RfPeDf6 at b^!i2{xM}+`| zXzyaQX`n|-?Vs&&J58 at 9pPweHrM%>we4-2#!Hi!Qp-z~+JvJ_U-}M4WfS2!bMb~r) zPMSxkkWw6;K at mB*Cb)x-1Ab8YddaY}_)NlZ)?g15AY*Q~4~4od671ZAt_B!1(uOzL zZ2YRzQu1#y*XT=Qa#==o&N>U3!{wvbkeI3+XRvx3s34dxrT`7W7xne=LI3#u)lGk|bs3eqW#!3Skj36ls~kwf zY%5-;PO8!9Q%r~kBe9u_CsJJ49$-Y(by%AwV%2XCD>|W>d;ywIv at _}>dG5!Ba+Z|} zx?T#oOg#AmcDT00P at -Rp+-c0`mlei9Yk(LS;B#RZwLjLQI8vMo*`niK6;nv$X8&F?CcMS?HI5}vbZ8;^1=@ce0zcH zq6zu-V2A^miK8o_(VR7blka`&p$GGEv-pUcqSnl{9 at v%#a74SfCEIgs(!%;Qn9YOF z8N$vHD!hXd8$%eC9-3*$(>tv at E2izKg{}eSg8r`Yav-e)Y9;46S1<5So*W`kZ_5G| z1?p_F?IT}5pC{muj+w$H<>={?5yK`k$d9*aMg7J{VluQ+e?`6rk+`uY%MCZ3ib_f6 zj53)+TgKa%G$G0j&&_UM-LwY!=Sili`W5c?@UXt2(C$M)SLw6Fs$J_6a4~1 at +W(w} zIHN^+&K&UT4W(OsR!i+!W{u>)~5Zwp|9mAD81l0jXQcsR})3h48i=st7%@xQyjMDtHi_z5 z%y#`jhXoe}qYMPf==UrMFp}4c-+A14ssNV?U&=6f$1sD at IFxvU-%*X*b;gth5ydYb zgb^h5I&J=}57iiG8C?S5o*NM&cnSDIxwJ`6p3zHRz%sshbKo_~K;NRo8?mu$Lw9})# z4<9|qH|{!jFR7tiT39FF9K5GG{V;ntTbBqH0)&t^uck88MI1>y852R?(!sq+h!Ane z55>5NlqBAYZq5S7=L at _ryt0=B)K_yuF;p|pM8uNa%8q_TpKpGwJ`7n~>Z(bAkMf?j z<2rrb&I?Cu-t6lW=t^G5bGYo)($eJybRtnxtGka}-y=QF2EXai_b=fP+#V4%8fWIq z>3e0vSb$|JuD<~$ z(8KFmM7J5Edg%H-Wz5agbIoZ=hbV1R$&BPymWr2H=UBK@>cTRZHSfPUjCVAyujDnL zIeg0ky=|->@s at poCVd&cPL2a$=;8QktG%+w%GB7py3*afOTmB93$Wmkzr03Tb%1YOijV22 at L!ajW9l}A9 z3n2qPW5`AsvKZ4KnUDp#B?SFcMvG8>n5ou-!g at cF*C z1ZqhPIPmym+)_~Q0st9UP*~wul0f4+CZ*Z;NjlEQmFf4^C z7St at c??!_WILtOGgd+f at aiX4^1NWiQwbO9kfLXQHAV8ww39mreEp!0eNzVE#GY_;K z`k58VXP>=wRFeLv=q?k#Z at ZedvBaE`&e%GE+KBtqXbyZIQP>>HUG4`t0WJ(WMpliV zB=^Y6R2^p`pFwDNgi at X}@o9MPHX=#JT02xx#}ro?E77B$!6jCX<0|MCg({G|jM(1t z^WZP)x3#Wtw*DsovBCfIWgY*fe*f at 3{iD9HlAG5@@!hJ-Ungh$E-Peu4>k>iK#x2iG!cG+%z!V9j`nO-i|k7s=8i%#V8qwp at i? zr(*&!D%)CNRn~Zf0jk9W3uduNuS``=l at zXNkUEJvp_pf$E}|nd(`1Yl)}g3?Y?hsL zy^SLQ#?X;9+Nqs{d8FGcGE-ZA0vFSb5Y{wIU_8l2DdZ;0v;bS2s8&hyqk2B-MA5Fx z#2s(+g1lW)P%Y9>u!&}poHXAC^n5f8RAgI~I%>EC6bYuVz;V5hAW=_}i8&*Ec3ZgL z(>bH#!VT*XKejP1cO_axdJBT>83n3)m>%EaM^Ze;@z%su3227k8*~2e6_|aRO$i+% zU9ZFXjlRlErCQWmJ~QA-4CiB|}iUllHt)-k_Vzq7bP{xu)5+ z_z|G-`F}z9AC;;Gf}9Beh3 at mNez@;g9w|pGAb!I51z(quo$!br6O!y=XLW$b9thQZ zcmD^wvL#0qexF4PqtP=rF21ZK5BIJZf~>020uv7&8!ST)=Bc^F(i zgQnFOH_`h5{zTZ;xnxS)5U(?BqqJf;p2+U(w)1<_zFY3@{`$Uy^=JaKZ-j}xl4!3c z3ZsQ|DKRpBGTan|iwXQJ+~{OgJ*%__>^X{j1qOc3`0BDc9Aj3XK`0DYj%`TJY7yofqQejTQ|uXL*JEkA<$sw zm%@QmZsfrwv*hA at C+LT^mq0e&VnjUT{@5h?a{Zv8Ynpsj5X0e!8apYJ=b*CAG$|m* z at mxwPW?{I at u*6hkb<1yng-z?Xp%xsC3sahTS`Zp9I(b6bCrW{{-IMg*AfSE%R#!m> zuhg=UWULjvT+++ixN_frNoSMiUae3w!}ZYqFr)FFTa9g`cY%BTsHhy}fzpp3n#s_l zgOhl at K;=|{px+pRvHyuqB`amBLzidOa&^(RfQu13Lt zQwW|br)!kKWZh(9W3mE)tuF zp0u!{IPXP~vJBCFBeiQaq?u)yaj8D3dtUyG!3N)qHYLh5E))mXJvow~-`_ll^U){P zBd-zJAF#cze~h3{XE31TWnT$ z^plNV!UjmGMOc?;g+J4?NBxNH{$eU at 7}C%yt<`8CCywXH2vz}Fn=DAAjdc5(VR~_o zK5E=o(I~YyW5B8KVqGiB&f=Bz+$<#*=IGirRv at fK#1%R1_~Z*w at yIMP^Ov6-$vxQ= zj*#V%!o0HOEVI9dVes@?gLYxlP$9xHmvS4{vXEe?5|?{`f9J%(I|EX2uitfVv3GCa z_m&fySns1Jw9;?2Xnnn`eQsgbJRNd)0roTqDeV3oV*5<)>6ac6$soKviWz7IqpZK2 zp5FfL5K_Qj%zwqV^A$;4Typ2jSiy0ummag(H6lrKqDfe6uk;0Zpd03eiB0v}|d zEy0UDuItA-ca`U`=eU;Bb6-H6Q3&fNlaPk8v%eAex)d=&o*9z!R+;#jXoA&BqZHn- z4!-`PV571>mjB=EeoA(x&i`ij(~-kcK;QvB0m at T+uh2uSq$xRljbkpt(3QRqHm4qW zGwIyS+{rCq z8hpTZj at fSd{Z=Cw=&ag5pW``z^eIk9HXwe-3A*_j)os9s at Pi+BZdas0X*EowAyiO> z6?^s{E^Knd at yr>~eh|Bw81xgQj(&lOp}$DAt@{m@{lhH@&*!lavHP?Mtd63fHa5V2 z5QWz$OdqfiPX93m5|o7S8`8?4 at W%v?Ld~&`HE%On_10|nc#SnhWa~v0WkkYQdhrRwa1VEAc!|Q;*eFKH~kG&7V zCZ+~1*8gX8w6c}cyeJ9}_K&>)0(K`lY|aWJAeLEsfw5?2 at r96>8G=KJqfVzo(Q zibKh1yLyfHz(rZ7 at cPd((pOcHG^^RJMfqu+X4O+$!>d%CU(d(e-;#IEo^i&JTOz!$ zruMq{El at FWjntQ}X;hsx at lNh9a{(%~I)mwe3Vw|P<_hSB=njAw5Ko^GEH;phzEXcO zzZSXq3Ys~#ob&IU((o%~@9Ef)%40P*=t81?<=xQkJyj}uZL19YV$6m-r3d#J%N3aM zo8~n8bH{2+6P+z5hq_Jj zn>wj%CD87^O`a|Lfv$ZVSWDT2UBTSF<;t=vHJx=L^(UV4iHxSCdU%g<*z`m(4qH$d zw}~#+S7=u^sZ{!^`VyZ# zG^vXBc_wrkQQc=cljx5$<59+$e-|A;HD_8N3aZ3)T z+#ym8ScKnG9D*xoyS^EQ^}~|i$I`ic3~@!0yOR=;GX}`wAnNwhV44sb_Z1itC?HW_ zY7Dz<5Ijy|SapqS{;s1o47SnwTJJRFmkbNVL$M^0pHg7gQS(xKLmEJVif2{QWQP=(NDovd}uE&G_12vr(8w`!`C!`yKUQV&ZO zY0NER(2N%$QjMvwJaXk>Sr3OYLG*4qU#c|q)Lb`FeS3)&qd)r>zgOGjR-v}f5vWDXb)>c(uA z#mT#aOwAif`t8ACwRUyFt1he(yPJO{!L+JYBg8We!1CPg=6=Q*l(9IryZ at qOQQY>A zNK+G8>AELg_$`eACWI?ww`VTM!8?JZD>!@6z}v`f66MJ;E25EblM#TlT&O)wByl?s zpixbJ1{ivq+djzLok9Y8;lPTI71ZqE?BDRSNVf-B at 8@z>74vspn0+`6G4rRNrk|l?`eydp zeJ^RQF!{`FH0w|=;Pj?%bbSUs7q~yE9R0JUTHJr`OZKowDfYvCa!$fkaeIE>b-9Ph<`WbizlGru*EH{kmBWsz zF1k+L!~8O_?y#_eXaCrGj9k(p;lL*7VwMP7$+bF|gxo-kCv>e66AEaj=#47*(Hlsn zYKUW&wlnm!cCGQ88weWKaV zZCecV*KU01N;AQTzuO7^tK9j=Xv4qej>VtcLE))pqQ9W0PL at FfMXd!j;Ad at w^+%wW z!Ln2&!Qzt%sfA1HBD_cp`r3&>6dy2W_I?z at yz;`$pcOVWi*Md=x at tY%Y<_?JxFGv! zQeY_0P`yuq#yr51%IR4{l72{@Eizk<+(neB%2HvWZWe0#cn7}z#?=l3oJJf1ZfoD9 zcIdkEn%O&If0^jUU9RXr2}7l^PM0RKP3IXc(H}oO8KB}Y(T$jtrW%bB$m-OR-Jb)7@)*k1BIu-ERprrb4?k?(1TC(}vy4gCOk>^Tnys7>;T=Hqri5AKX*lj>16nmw|3HDEI^QBepuh79v zALgYD$_8?{!A}Q9Zsx>+QDi$Rz-8ve>!ul at vmJf9F3ecLa@pFEUz!nZU*E8>grxI@ zH?t{fY$ZJc4mKnbcLI4T3KNJyUy7dN`~49#&Wb$8LUdT!6N*~wGrtA)24*W{#}ZtmMV{w~%f^hIhs at 4T@W z0V;I5%NcPW?>6NQKV#&=Osqg8o&mrfFq{g at fp&l+zo$txx(dwUWw`_a#T&=H6ujs6n$WJwo4?p) zSUGp>8UNG+4}XA=_rHnnf4qs>Im#H=%i8 at N75^UQDjH7MA_$+V at r`vIya>@UI7(=} zVJ<(;`G4wT2g1WdTMr6HhvHV%a>uc0T!iy{O8|eyF5Tmy^MFv<0UoC|U5Gv~d0lkf0zp;znvJKA8D;UauHCr!G zAHBe-(XX{}HEU#UR!mGKEXI!G2Bx82wg7B4HFZ>fX{*h28*5b!Q&;y%=R6TSlZQ at Y zChtyCiJPnunLuv8&k*+gHBxu%`qXa8ZYl4rZHk-A8*bX+A;fd(g z;yNnVrM&1IWn=@{EY`Ku8#68+8nf4{HlBMEhL6N z3TMi4D|eoqbSsl>b4+bHQs`eAuM>#80`3{DyWmpkG7MeAgh*?no?wyQQ9^BIvCid} zSx`j65~VLQzy^hNvrh`8xc#_a0Cl6387RO`RJZl8=$9M^;8})L?J{{+?LmVs%Vw~` z+U=DAFlTr~*VAKRcTX6I+hwv6>RuAzl%~>InjDw$8UMSKU++fE=Gm3dy zA4%y}hA%SBVs#wgWhTVUk$$KEk at pqUa?hLf23q at WcM_)Gc at 6JxLA#I09fai-q|RJ8 z^eJpel}^VeWVb7U-NyNOG|D8B$Z$tgljs)M3{R?N*<$E)KH}E}AG%s9jVJK5iFcdtN_wAESs9gS)R*;-M z3mOq_|2onsVT??H{i8+~Q=Oe}f7FNz at jvdd{vS2^$6dXCTJx$XzI331R^Umc z>@zZP7XB6 at 4o*#sYe1U4W7eu6Zw9~B*MJ^4&?uyJsV>V0**0QVq88?r}ak<;#*pfEj4_AN8O>|;Z257CETk$B_x zW1v8`GYrVb)u0RElm&fY3 at Iep69^>Ok9-5T_tGzj>Z+y7G>*oSH=eoZC}CsMq?`sHeXTb*^y&Cvi#A0 at r2 z%sH8mdBM0j3G5 at 5)WYslc7Ki}M}nbMR-g=Mm=s_3M_6suIHu(W86agy0Wi)U>) z{!Ty~NK{I5QNBVo5Cpn6bYdyjv7o?tu%sya0N3Jcza^oeR5Q7#cqASU*|=aR7nzr&AJlG5Z+X2m=azPIB*UVW8fTU% z!zX~^3D*9bL}-gnD~n%CC#L}t!ghW2R$X56z~NGVpMCA}rpRyvL=?=!7i!z2NJv5u z-&=X4Z z)D{BiI*p`V%T$*)7{d5Csd10E$l#qu4M`_i>QA18i+YAu-X`xaSeSD)_hP|;bemzU z;Ar2g zeMAJ~1`L76eZt at y@#~ z^2KE{M+MhIV(PiJ!*~UKN39Cf5ml_2L^jODC)yLU<_r}P^bX2^GsHz?!1jsQ#dUNH z>L=2nFB~5ww^b1Cv57GW6U}&y{?#SrF8dL$s}f=!**SPJ)wjn$!uK>C at D|WHwtHkY z-XeC_%;SXL?vyi=S?PwKvM|mZX*(DW@?N0(Di- at BRK*FKKAE8ULMXq~ zUP_vd)5Wuj-U2&i(4uRq?}>I8s(x})qclodkfc%f1(SL%u|A9C)3up7cVBDq?vI@%Arggkb z0u4Eec)Q6es8snV+OUg>-psnqR->3S|RUAAg50(rh};D z;%qOO*?T_D^rlYAQT}|~#DQ<-Tl?|*M)>Akkejx+ z(b%}&@f%5$h+3$+-$sW?a>Lbmyn~l(vZspCSx%#9-?He65U?|hKzCAfDa!~`PIItk z6q$^Xr=%Jjk#It)XT7l8(wSF at iAPp0?Z6T)d)I^EV%64fZ$DHwdI-B&Df0%NOFWrQ z+FT4X>A)^9HJwuFS!JoA5_oK`-aN69essMd-A~=_jAGU at 35n}g!*RA5^+kl9-IpWJ zjqu*mrp8!;$eF2an_8uN{9|*LVkh3z%H`7WtIhVy{fy&=2rd)k}o+O37br6E_LBKW#-y9Hm7!P-Jwym9&Y%<2R)0{ylY_tz zI1KWa9ycgm#3YJ6tVvsO<*>3mfAFq+xu+Udo5C(@V8>;vGOB$=1mNIu6z;+olUBi2 z3{`qh1%Uh}U!d(0KR!;e_;ii8o?@-rG!c%c+ at e@@bDJeHj_M-gRi1f9B?6%~FJmUV za6aR!Icu{HyhkPUGgWOB#*7oi^;i*K+0I4%mtoX=|VrlC57NSBV&$eWM=%^qiLaznPPfrE-~|a%vF*z z at VS_txinm1JR#3ebIvz}+8lF%J`2k?gu+KD%d1 at QjFVwCcA;cKKPF}44mCdl0%Fks zQIJ*A1@%x)q`YXvF)}YSjjO!|{5zURF~K3A2g6X$zULoxvxm^+zKHTT z)9+yeq;qM*;?xkn8n1TwRtd(Wj?57k1QO2qTA`9pg>N*Re$bfP0=-WKBdQ~sy%HUQ z6 at wl_LZACBCpYL7;1-i&heC-vbjnE at B^KXPN>GDRC^E(S^?$n+sQwUWY{5dsiQtmY zo(cCV!RMw7?48a6i{sz|IF%E)(3BXc(jHZUOQ#qaL_6+vRN~h)r7(SZiJy-r^BUf+LC_m z71;$Rnnb8{i{(5LS9cK}(PojyDy-C_d{GyEi!*s)ZFzM^O{ zv#hQ5{38V1pP*Rk;}+bBrw at TlDJ#wH;?j(cS4CLjX&*}E?KU~_ZuFcy3}>gkeToK9 z-+Bx8m8u2jma+7(7F`kon!hgWauk1n2W=5PPM??`BfwvBvX{^57CJYoTf41hvP)=l zZ^;GY>z!Tn%pO>D-^uDH at _f0 zOhkL)4qDA9jc at 8uXu}1&d+rXK;$po^>Y^SE5Qv#D at GODrjIKNrspNj*+hO%lc-jEq zy7}vFqdma0b;vJe8#HalmBgJ!Lp1l=(=KmLAwUe}5j~S|+!_UFdcVRm)yz;_F+pE3_3C=;hptlCGURPI0k(1eQ0RA7 zbG7g;RRr&!dD)a5*< zOA>@MZ5ZH!Navy-)j>Bbenoi%z~==+o_A^o zDj4Ivzi@|}oEa{yMix!IH!=i2(&Yv(mN)W>7afgHjCiOtkBH=j!K0n#2Uoz{rikS* z=Byn8l)Uid(!sw?{bJq{&SCu5Qj)RlQ(g8C3mHQFmn?7 zF2Ue*1MPQLXtr7_vaw4S%wJBou`tm^UmNqEV#ch%%0P3&hQri8v81nWV$~riSJq(% zW0UGD#cp!3yCDT`pR~8$YC5BB-aul*&O`5wA!IdD2WaWDr<~#`Hx0}%*{PA|`R5sg z6^d3;XR_$BO2pHyaej9SD8Axf*;kF??7x{A7VMwX36B)eX`tSn$mq~TFK~Pye+G_t z70y6jyOO6m+rI!lIH%jW`Z=KOM(eF2Ax^iw#fq;K%{WN&8EQq^%-VQ(n>@35YMo#{ z)g;qvGBJ^4-AKVCJWA1D3L}$6W3*Qf#uiqYkkzxq)5YNtvvx=Wu%Z(bkVT^RZ8m5X zl}U_j6R at tb4_OYP%G4OI)45Dz%)Aj?nRO>$NX9CnI3+{Bp{!Q>&5nKGABP9Tq*iPX9+R(MGD~}=MgEp%l;)0M?LTI+Vp|iUYKUlS zO$c5fTn^?pUs)?#o*hE}UK^&;zI$TW8>^BHlix!bAnacKp?*uYt-& zPh-?7F1Bhwi#g>Q7A9GaY^6N2nQ*p9q0&1r>wVg!!Vqw#_E0v%r&Fh+ap&CESQsnd zK?1*i2+LW>c%Fs*T5=HNpfElELPRY&QYh^;-|(cse|Jy#0e7)b7Q at h1BTEn5G8ZoRvOid>_N zEfcy%Hu&?U({;?qcm_aXp at Xmh60nOhPU)%Ih>5A!3|81O$qi z81)POUo|Q|mcG*a59-YQXAAECYLt-O|MVR=|MhT5O9 at 2`<~r35i{&lo_U_E7-B%AomN~JE+GlVX5RyxJoi_;TXP&N1IuyAst$w z^=t}L@$^&HRp#Xr{-+nPKAM%s{jMn;^9G|mR}6=8;h`4royUQFJ^1$MOEk{q<4$%a zI?M)Jjk$i9!1kdm2?i9^x_8PS4!~a0w9#7V=KyTEwC~>1-;N4+)rlwj|BYK%gYZ|f z-{x<9z#e0B?RuR8W7~HDkwwHWMk6XV%W%h-vWZ;Zi&!!0ptndx___?+4OuLgg1&;5 zaYRPSkrBw)*T{yfTTH+Q_P*ItIGz(C8qlZcs69i&!2=24si~dm&Re?c_9LRvWMo?{ zx)W3cBKHb=!Hn6qpx&)ceZQ=nhFAO1c|>7aB at LZ+x)KwIy(Uv at 0L}{f;s4e_A-KEk zqC@h^YDl=gVI`MhrB?Cyu_M&#(e6!F!eUahRl5*-CL6iGm3Sm}Zj(_JHTMyR zhY}r7pJN|}85>yD7Pc#xVtTfv%W-DDYs;uj?Zzr#rblu+(fH!l3RL-tQ3zfKk9oh( z9tEl);F$$=FKR*`N(8VEcD(6BTfpUJH504bOLikR4Ln3vD1%`vSZ zsUvwE`vRWU zt at w_U)+-9XdqzQE{YyD~1>NixW4>8xd*xUkft zOdA+K^+n&nS4!Wo5z at 6xIv%-)Sj?OHE2dF>NX5QQLE<_mEbv{`Girm5&H%;paTZ%_ z8a;Z}6W_G`IR!p9kyBn0GCVod7j}8kJMcd4u=qU0&K~Y1=3f(9%?G#_`VVwuK>n8r z{eSV)tJwT)gs3m6zqPtrC`CY2LtbGlI!jU05-UYz5Ro|uGsgC76Xbl2bG_8lVE)HK z_v}|sh-Y+gQ}%wX-dnz>r&*l_AtYJj0e!vK at sv-t$7N@|-`Cx-)HhJ?V!_^kaAfjw z^??+qWYH1F4-7y}#STEdl>!hRphc;ixUY_SmyWTt-$HZ51yu&cin3u6+Wt8eZDAj> zYh7s2d at HkVo6ap4L$f}%?2>X^?k^Q*P+-YSvw4R*Mb9^WW5G*KML%o~NlU%HYKpy&guO`rAPo(?kKd;@AQPVC<3f2D2OkP47X=<TE{>$*pO zG at k``xyS~;j7ZNUAJSBeV5Ckqt~4gwR#(ZlbXR1{a%c5mvvnPwri*MtUxB-gZ1|v& z`5QgB24iaThGyFQCVdynxyxm9R%>H_ieni-wlEA(s&*l+LiwsyUy`)KtcN7wl%C)Zf z9VtM`>TK+S$ZpjxZU+^>3+mF!{U>#Q+IJ)ijA02__#5$FHJD&F**t(0x%o4MS_w|O zQ{xWyQBg}r!<9{OJyYebl{YcK?zCvs{24>7bhq7wJ^k&R%Ag}hQu#g5i98~Tke%3B}N~HBD-tjDL48wA37_JD!h+bXFZFP%MrIJMw0P{ zJFABA3fn(Df>t=vLq4f5g<-hNFqG_&Y>j-u!yfWMj*ui z`pVe}X~*)0)9*(xbZr%i9eDDU0e-!JASVKM49qR_Jle={N+D0XLo^A6ig$Z!CAx@> z^K6!W$}fKS8E^|d`$U-N78(dfn zK`MAau>}VSxnNxvAD|mxh|Y3Gfd$$qLhq66uBwQ+dNH?`4PuwWhQ~jJS2r;lx?mwN z at CHJ?RHV!AQxjt(VFN$BJ}Z`Bbl(vo+`Jb9_e=WWmvo~7(l0DZF!DzJId#@%_{R#W zEkW|M8t0(!ToNi#ZXbY0_%#+WS|$mW at tu=5;jvX}oJ5#>XY~%x*b5mmG2%bZqWhb^ zG;DiV=l}V)^X)&*H2hzE`NvGdNExU;dW7I@^G3~xM+gyZY)`P-9YJmP01P2(38t9_ zys2RDYk9-)oh6Tn=|Hya^AC3*^4OtJBa)zl37>Lj4GkIf!6`c{kCdRrEsF6j z$D@*VY&|1t2&=&;`iUV+#3?{li+J_mm4^}nzc~EVsjFGx(;9N!cZv#U(M;M#Rb0X^ zv9a48%w4U00uXcqB-bE|)Vmppk(r&kRq%iP(Dqs~8bqLP-$MWM4UR&8enjmYZ48|M z at ug7-c2@K9C__2xt}^Q)*vH+R#kRDr7nu>Lo7f^4I%9xS{52OMFT&>2!bx$bA2!9? zBg>Sbp}&EjhwMnQGc17vq{XxE-f20Gvoklmzg`|-_(79!pjzTY;Knr^*-)#@TMBoY z;<+SMlPWA)%6IYllUF^?Wi|}5x*2ph7{L|cymNnxgPF#}1Z(^#9km}Ig9+OQ223z5 zKLOd at W)f;p;xiPK)zM+xMx%!gIWHjZ5?;MD)E$VYyoqt&qkQQ~hq}Q~O+oS&yq?wDqDp_2tnMa(`QqpRMpqghWGg zj;$;>;A_E*e{G2j13#=ZAxVu2Su#6a($$Ef((l}lk^p(T=b4vh=7<6f at ZJ`I>lfL(u~yTlMceK`AJ>1!#N1Fq)^b} zFXk at j0N%cmZ=N3vHwZ$jfPGq$#+odSFQ(CBQub}^ZQu21D!aYERcepY0%+M>jQ~}J z{&Y&g(*QfP+1R_6w{k>31#LJlY`>71Z`!aAnUM; zB)VLRa^8Sn3+K}&4(J+q%o^L+5eMh9R-YWVoIIuudD{Knp2%{5R-*Wp`@=Noj_B$3 zY9JOPc-SZV=e_f8Vi9w_6yWpmylQuTj4|mN$KCY_XNNH9QX5JPXprXI8A4|tE;>!T za@*vSSb(n}_gWSI#n4d7L zNIVP{0>Ygtj-7VN(Vse>Xsc-o)9Ix-MX||%6^*ePY5fRwjT$@zz{AIp83KrbgEFH? z)cWrSLas$cMJl^??Nz1gXfoF^g+z7m5}Qp!L2S(a?#Se!%{cY=A?3s5 zw=0fdiQgrDA>)n`^cQdG)M;JXbbKjr at 0VUyKQqX{RmHD8+e(7Pky5WELv#X!F-~H+ z@}=q<+^O=lNENaGNxRIgc@)_!5tfHcN8!n%35PO*se3S3E_9kt8IvC(FGU(lgZ>yx zjrC-awZWjlXS0^fU!U3qTWSs zq1J!X`7X&Gt|$3S>ic7t;a=()3=VQd)xnv(+JYERmLchCPfBjSmqK>gmwn_yQ$w=)9% z$2%gv#4{Wzh;?O2?f*yGI|f(UXj`M{j_qW{wr$(CZQFJ_wr$&H$9BiI)8W_eKB%+b zQ+MBe?^kQBAM5$|RE;_29FxGRBSd)&wS3iBQJ!KM++3^umY+ivsU(|yP=y`iO|c}K zf&rG4Kf at p)-)_k-NlCE#3XxRnNq6yUJv~nL2S*+`O0PUu(!gAy?TcB2N}bt2E2SLW zUz-w+KI>{bT&sC~Q?-U#Bx;IPCwA7OK at y@Ub&mJ%1pVbfBY}WL{J((#%7BU{d?IaA z#8>#2Or|RA*57(6GSnM>29lPdwqQpsb?IEXg^%*nR?nl_(nq03Rcmzy*Q>8zws|=b zLR9b;QV&y%U!Dhwa!VYhcNLVPLVfFZ1FIHaJic4t!19%%$F1FpG9D;WLJqeri%{-R zbgF9+jI~HIY~ejLiE&A}5PaEAv3xdh%izYNkNO;OkGx&Pt%}cyWCi!b1Wf!ut_kkmWW?zOJ zvPg=wb`Siqz~KUdsWF^b78Df_GH_XGA6C$cAF7$%y3?+(d_d+V0M{|z4(4bL%`vRW zC7vP|t3{iVRYlc#IuuuIlvWkHqa`vMgV=CPTAMQ9Co*WWSgN}FL9N&f7xpWFs-Y_| zRQ{Xd%3IOC5*19HbL`w3V|Vosf at vr`_5Op}WJ{#?<5tFFKUYfBL!=!?kS%`7)xbEH>j!LE2?qDQ9coHqZ&iwm>L!j*|8vvovM zG+U?jZaMDpv1g#b$=%!i%d0w+3!7)Wp-ky`9?#uZ};Xp^M<-Tu43^=(_ z7=0v07C#u71KRe8Q(E7KGQ;)U at dc6e+_NdBA6bl_KH67ss2}1n`s^(Uj6h%Dj;N}+ znCxmu7rnp8E+jQ1MHX_-K;r;R4!Waze?{S^Ay3j-xN2b&Qk6=AJiGY4Rj^UC;X5cT zVur)OI|(gPi9-b`xS!l5ReTAKS#jeZ-y5oRDeXYQ7Q(@lPY+s*6fH^>a9r+8tIws| z;NOg*k__F2TnYi#4EVI(0OKQ0o at 7zcseRx!#X6X1PSjmS$ZL)I#e?QQU)RjdOuH?r z6-i}?dinWAVN~RRb!d$W at 2x7@0ZaG;y&Om{zrYWb2PI3lOLpuRzHn+~oLq9e+}c?8 zdzb;yOx)-sDhbhNPYacONXnWk7OH+(jeiV_HJ!d#_<2|!QijWt(gl=VLXe$;Qio*r zu4eLSnMvFhykc{7q69oCr0CoOS(bw*?N%t$p`lYVimWhH})Y4t7`={Vg2dXov(llyt0>uhcM*_t&lq-qS z9u%&`uVDMaP3u<87tUGXEqw8X;|kxL1!v&ME!F(?uno5AXGdr6 zoWHkAXo`hdIQ|JTfk1(PnEu78OG77TM*|~g31<^W17|x&VkKt-=l?qPp==}fC*1U< zJzuU#a$^NS+%B=kM?vu3Af~2IAc2;mPN4RscWa(bsA16=y-tV^pEG~Ch-J+2vVb9H zsFImpSaABQ8sKH;_xbt?+()TflD`ulLqc7drdnTMgi<+BWdT^Acu_a5vKoWfoQ*?$ z5gttHE2Yd~Al6g)$ptG&wHH6Auk5o8*~;_llpP1G(G=XK5fy}HhT*gx=fyP94ZCsk zLYSbn(DERd8)_iy03BoA>+z%2LBXW7N6kR|GNrQlCtOel7x{{=8g*zgn-97yjzcXK zbM+zgM`QBk4$coYMJFG#+6`OIU0yrS2hn7c^J|Qj`(`2EA(_}WnuSQg6+2XDA2!Td zP}XNS_mjw12jt;n8?m8J3x20$?d>0|7!7IFtHAn=OE6ZUsT(Q(n)E^x;T=pW~yZ z0HmW3*}yOBEhpja=7#hng^&Mm(I$@rNq>To5^#EDsl?VW5`OF34h4y7KmZB z=0DJzvn24qX#7xyCt8MFz0GBrEvFM7<~)@g;)GIf^44x}fGixAl8I#BjEH`3H0Y0v(FDfk9?3TD9nNO=bn5VD znDY-J-$|nJMhRy5LJ!6*sSs?pX4O{;A(x^fPDHPAnzFBtjIfrJSC>ZN3hpV=w*l#; z)j=BgR-fRu{ldVC*iQ4`=7oc^?|xi(&$EUnvtMGRio$=ss*xvn6fJ8e at UM3Ok|!^qs_Baq$9i#Mw_M*Sqdlj1ajeD&K&87`{G_ zc7Kw#E(ER%V`A>ML=s01j0DRHV&{A0N9)z%} zespN^PheIukfw!xFK+ at d%uBcEwof?(v<%QTV$VN`y?}RJyBp9l8}W at yuX_0TKPo_VV``}+M{+xx9bUvC(rYUCEKCz2?F<@TW&u&iQ at k2lKUT{!Qk zRJ>(nxQgTpy6dPz9R(#xc~n=CS7j(LxdCNM{-P=%@}1Zmb<{w&-U<%PI&Y^WSUe~* zYmOT*CA#G3H4<=+>zpnS%d^6udE}1~vh43wGE9}_LF&e{#n(n4;JOM-OQ6whhMOU} z;tUtrrAl<0?T317 at I|6})r9Xc-z^~y>39auQTcl}N5)JS-JUr6 zb}*W$ROhSS*ik8Po&mg22<2V}5_;2X)j4XxTp{*xQ%F%|jBUltfz3>YXd-SyXTM0k zc^8f+%4UOb(ur(vJR%55(Mu?7gGbc??lM3IgMvLq3bk1$jM4j$Wt at QwZsf4uipvW-T&7N5+(14&`Z z2BuoJeZq5c_YfTI99k1HmCT~;5+?Mc=iFhr=2^t}fd10s=bj>qY)Oiz9c$~NbEyxV zD!I?sIZlCX`BEm|MKW|T*W!M$XSFm=y-u0(1PSCTR-G%4X}jzO9A$|nj_C)=&iHBP z-l66K*0YVRi|b?$|C|{4D})F-`D-RhNKYxWkVALNWtvW}g9Xkl$rIM9~6z(H6>4iTM^I<0ae_ zrk7lk8RF;|s3-0NdDlo7S0LUm1lu?CgaO6CJ5c?KEqt5gi`)B4`No^Un;1`la8Jxg z;}|jjmh$isy2=3cocZWC?^4dA{8GKn_2;ZC=9)i&`2{3ZpRcy zdLSZX1Q8M}3CfN;q=?&udpMFpHj(r!LTMT0Kh5^hs6dD6kJa%6Toc>snji4~nI-fz=LS_kfPhe;{^iv( z5nC4$si0q9N)wnkD5ry!)1p(suPAyI6u2CE;7G9=35uXu7v zj2 at q#qTRZ1%=;SBo2C2kKUP1PbMm}c`7F!fW#TIFK&IrFyx?YXy7tLwZ+v^^qx%A( z|4|KM*p}Fbe??js?S@mU{A z_Wc|ScH8nrcJLX-!S?OZW5S#nAdA`(jYDLH;mSfLww0Vu0GdL676*Ly$U;1*Ii)ny9 at p-mVnb}y at YLoo_$Uvoq|#LC>!b) z7DYO<_T>@DjV(GsBwo3n0y$Q|npw3!T#ZTM!{1oLr{iG5B-WVzWTItC2XexqUpfC` z(Me^rT$5WY)@5`$IT~z+MiCNoA7|s9aGSNI`;skM?HA;!O!BlV3D#tI^jq|$ja95c zm&;VgafT~Pt_39I_dr8p!!D98YmF{Tbtl`UTBi-IO`3a~WZ~@?c_PUb&`J9ebexC+ zqCLL1P!Scbtq$Ynrr`-)-uqyJi=>uyg(c#_RiW*tNlv;9*u=AD(>Bp;ug&a6n^C4< z+5sLqx2vOQQ~K6DtrT*4fgwxLLbNt~?s$z7|6`EXU<<}>$M#t%b2^XwtqDwD{ef_` z&JVYTIoXK?s7qO1Km7Ws9?>1wYmO3ibZpsWDQ=nwNGrWR9fNFPzCJwfNbvhA zF{)XK4edr2*UBQ3gxmqvu&n~!?BfOW1EPoX7w<+XYF_kSQIkqPp-4(xA5OV`k|E?e zPe|6mLZ+s3#c0!fffTil1tf~MBtr*^q=3j_Zq7S&y%``yP?tz_>)YN;o`|mq at w-+d zrb2|edAVT6c-9Du_wq=V>SXRhuV^Zy-WVN|j+iCr$9MHOTU8`d&Inv_LY-t{{GUxC z4M_1dWrE(q1w)%-R9Wuc5Iin-Kp)>;`6(r4z}cI(`y18<80Uu>k?M$#Pj+l6Q&d!1 z+*2ZxIs3e_<5sjNQS4O7WqB=Y<+TH%kh7I`L=Gd(UGESsJme1M^hJ<4B*z9Fc_TN{ z$b!Gv3o4`y4*fyz5>8TYARj3_BMo5D$BJ9a#2BCc7RqpqT`}eT`M3DzNBsXrQvVs? z`us=XL$ueNMHBi7h>-TL%18M>Dj&>n%_K5;7Cc$d at H_cK0CxWW!fGES4Xu-&;iZ2KPbEDXee~Cu9fqF%dhuY zk^T7{onzL!mk8t$#KE&0)|1b)7mYasmiVMP3`QY(0ZxGw1Hop&6we%LlWc~0&QIU| z`3;j=AaoD at MDvHh|MK?2Ki=>^3p+|Wb_?_=2(D61ncl!n|uUXod|@0GXAki@<~d{7SAwwfzHXybi+YG-(!+1o$wpO5W;V7r{@ z!={jO*vED)AZH}qbqAoq=#!q4kQ}%UBnXj0hrhuq)%(p#B-<6K!VH%v&o=??v>v|+ zIO6eV*VMA-9H zFiUb5V9BKVbT0Ai5nY99gW8hLRDQ)C5=MoifiRfbhZbAGz${f#_TuT0SIY)ve)Oy~ zMDt*f+s>!)H>~-w1vH+G)-AI%@4r+hWFmX;AWNaTAG>7d$QtQ67pWW@<5{j4Vl4L- z{Tvg&D36yWF88ZVV%?mdE7#kWPtg0mDMwaPU1)Sio_Mxs+wX at E>Se;-Hdx1W&bC~l zIeN4RU^P9YSEilm<>N-`$+u0{D0VQio3yUe9IS*t!9_X2TqP5u%N}**^Ptt}fJ)oo z1%8XS*)DER1J&EbojPOyiYklK=|f6^G)d$VwtUXg8}r#RH5Bu-(8=kzt at 8e_gD5#t-WT9^g-|YN0bpXn%*p9= zr|WhOx1-P3k9{(KG~MXDXjA`kpoQQwER!TJDRbIpxnVOz3xn6W_=%*`(YFa4L6gxZ z;{0E#qPQ^gHIp$SYD`RXEfKRg at f3bNgj83;had=+ZzE&YVo}_wlU=rCtUq3tpPHiq zCCkD(@e?QXi9E>=WcS1HTT1C|R)!8lq%aYUOdlb$FB{t?hF$Lw{L5VJsDxeb?DVq5 z4TX-w%Wxv3il at dcHqkBv6jrNC*7 at AALo66LFilV0_7U+!Tw_STWq(hf`9;@wAToK8 z&aob6deUu0TrSD?WA82jW5V7<&%W9bc(wI|xXXrLdro+5`cXZ>^M1_;4-D``+Ef<~ z6(02>)k1~3Q&vQ?0=#&&HL?q@^Xx=K`@SgOPnZ!HYdj{+)8cbWM*)Y_wc7`Ywd$09 z-T7IRNmCOi$@7JrBka7>>^l+tAVG{dDESi1P)@&QiFBEwyRfwg3QN=0U>PR3Mh5;i zD)BmNCD{501ycXNQNZ+HD43B$VF38xab3WipM4*wn5aNxzacVEk0 at mT2}+Br5+Azg z*K%vokmRIEKgE2H>TG8cjZ2su^V&?&#?cc|wG!Jb< z-}{#Ts*Q2T3OQAL75{>7NHa;#Yv0Z|XzbQ52GMfKkA$gXa`21%eBwR(#LBd!lNGgt z%<*sq-FOF1MF1$j$0~ZVwV51he6rEjveDiAQhp-Mz*J at vJtX?si9^2JzCqo4fiI!F zlNgN+X`qdrcNq_|vGS)J0 at Bw{i0mZp~)vcN}4mhmwtqEH;E<7 zvPL;)XfGl9Syc0_u}u~anMzu0ZcF`y z=Tbn}CP$j7eE*grchDMR5xi at ZSX6wf5tX4cUUe$sk^6}81M=UR&(3QW+y1Z6!2Dlm zkdZ?XK&cvqZxK0|wx^iT7Qza3YzoU;e`_+S{c0F z=1e4?l4U~U2-cZ;CCr*r5w(JAs2$<`MGDI;<$p+ls+X4pxV82#*C6x9HI)428h$k? zWe)pTz5R!4sQKd>GADBWat-gY&-^7<(P?_J5QBR+ at _q!-U%A&s^cpY1_~(h*tAyMi z^z^bO4TVs{bFLz^jHkw*(}43}rDgkya>d^qXlBM;JhSV$AvBg=u5qPz-FIYG at 6fOF zQE6-R|L_ed&TlPhV*VBb=UUjzLooR+Mg(T;qrvWi;#8e)O)2d2JkLit z#~d^5$J%dOe14y>dEupuAlA}z^6|H at tRmErt0@kUT;A^Zds>hd7>YZ}sJGd{9vG5! zzT|?5b@)UWRd^9)5 at Ta&u*)upu_E3x^g44ns?s0rx5jRn1Pa at J7HpoeTu%WDb)Kw2 ziY_{xjcW}ZI-L`BB`jU8`KKOJDLQ!;8&1$~sw=eE0v&75?8=0YK^Mx**#+S$A09Sp z3xFccEr?P>*V=+h+jE%n8B!=DKa=KH?ftFIpT;otGS~i!vgR>XE3cP6okr?!G_PV0 z<>!3#++!AW)oQBwChb#!zs}ihm2}d{)g|vSRjp>u*ttak%bm(DG<$x)F^D*M6a8L4?Jm>Ej(J|^rT6`eXKiR-Fj1O)Bia8| zZ!Umo`5R^@!Jy1UWe6FJzHFa4cXu|r$oY33~Bsr?SV5%v&rg02arFS6U8Q6wL?dc&*o&YU$U|`|rXAS@{ zbztD_6z~ckOesVhm3`|=U>~K$pPE-Ug;pm!oTJ~ZRd~Ae(I)7WOov<@DAht*9w(%T zH}zyC=B()>72?8L_4}I)+&wj+O8jHFd*DDo%>S0<%G&+iZ2wB#|FyHxiYwj-guxXF z-y$=PbO%0sK#jt|5>rqJm=pww5tzIB5XUQs8dTyciPz-?{RaGX0C=(~zYj)8 at 2!xt zn~G{6VlZuWe`{&W>$?5;V(E4J>z5CZJ>0XRxDjm#(hMuIzpTJc}vxh&gn`t4Mx;aVtv`02W(7aUm;JJ*U0@^ z- at RJ8jTU=!nk$b$S2Hg{FQshA at S`!?x>7AJ|5Ug%E3sBVyH^{vVgbDE^@bcqm}AP! zcXV6z%^EDXip+rrso!BmZM6p{>xSVjT34L)lqSo4X*Q#BG73P&9gDV;KUWwu=MoFkgEBX_NJ35yvEjxzPcOBnFJdpw2j zF44Owp^-5g>IP{ipv6Q%RWS==r|eM}ux; zv=^9zYueAh-CBjmdV?W5C>O%#bUczqniR8aGYLAJ3;`qLqV~}_vEVagd9+0g-XiC< z7E5^?qD~z*U{&((SoN{tUm-(Q4a2vvKg7(znBw#s0mjGlvMuqhFa&;Bn>Ji&N}W$7 zh26VlIZ90hrVw*e2s~OZ$Ps&555qU#HTU3&_vi}0zfyo)7=qigexD|c9iZK at 2B~_A zM7+V!Q~;hY^G_WU)QDH?+c=5k*@$xE=v&y(CHS>SJK=0!j)j=M9Yh2q8ui8R6_dXw zX5Omu$@ES1&IG&^1_^~5{6}(LqX)LxA&_0*lgsNgQjQ at LCIe2f-KeG2u~r zqOXH~Ly-c90GbcK%Mw2F{j-t7%lZ&nf&c+kL;kx)E?{f?cOzHbR{Lwf`L8*F7JrIj znqsj${d-{bI+1$$B*mzHev16Lg5qpqBlYQqs7@@o4KloUva>?Eo`-xMF at XncIiE+m zn_7iy>lSDUd3-Nd-_3TXYq#EZH&(yTkMnCF(z;^7VI0&gb at ReGvdb|;1=d{3v1X!B zlJ*vC8S3b0a`pH`FDO+NbMNyCnkvqsu zM%Pr!%*+do=S*_rILYDQ^l`=%<)MQ)73rvNFtQ;b>QtbDnZaM;$ z`=g=za5${|0*{MaULE%%y9X3DQ!m^MldND~m5UyL3$|%&Bam)e zWV5gyOiv$)Rb(h(6c|M>$jTF6Z)L7*m)l}Um6{kxdukjP9ytz;i7nAv0X5mIznY?5 z?VBwC&a;CDfeX_8 at cT#}XaZr0HRD&EbJ at j(?cinq`WN=2rVPHU9{$KK{UD z%mMAM^yoZG8p07O(LVkb&QM;vYx6L1lpl(lrB;`}i&$gj4l_OLmt_Wv5pCWUdJYu{ zV^qqe2b%~mVBdDfZLJ8^K!Y=Zw;*Fll3&KZNe+w*l^Hvbwn!U+(EJn*!`eg;E~JME3Ju`uDJ*oS0wHe?8(v{CeC@!R8VV>vs>Y}P#Mr_yroI0-3cI+SO|Ayym`y=Y=GnOY^3`@E_gct<)M#fy?Dj|zRp45ZY=S1tiUhkx*rDGFZ|nn;Gqeva`>bfn(AcL{B^JHY?HiBv zw|)cfPUp+x6>~dcStL2tA99=jB=p=N3P4+bM}XS!AHm)IzHd;5$#WgghaqbRu%!D{ z3*B78f@&$jj5k{;KerbO{{xCG+%0HQay6(|z^g8dDI!M4`7^La^TlqCI6lu5-As>l zR-RXQP#+mKh-FkK59OWyMg_t=yqL*LzZUbtWRSl2K*pZI`=B%%dukU=gZ%~(Ixq^1 zj3ai#_lx1zZA3KxXFg`h6Y1kgQCG6 zYjxJ&lq9tz|3O_H^5upSb19lICH^6zTFpe3pWrysQYG_0^8n-{o^)+OFDcDPeg#Kn%HSVo2glttoxv|B*mKetYbwll%$xFF7 z3$=lqaKiAsL;a*!vC1(x^B8y-&Td9Y# zP1tj0CQx8!U6qptK`IPp-$^qnQm5BzPD}|W2bSB<0a8CG;SHmf0k_qQO?4`y% zTK5yCdwdbs?`$3e6pub#a)AcJ8KN(dw=f0f_y6yoB0$lr#h at M5_Hv8xF0gHy8y-nhL{wwO8!tfyFbB9Q3gd?GK{18q=2^ zoJdoYHwN%2y0d5x00zg8?6oT~jxy}YEmE?ILXno4A-t>dstj-#nUpY1#VpF(sj^ssMEDAdm{myv)@%fle6oV!^@1VkXnvR_=BSf z=#qoaW2EKeQ(zUKzQXE3Gi^EAcQ3vu4~5B#uOBOb2Q3@=p)<(A?DAFL0Td+ zYLw~A&cR~$TRbc{g&qNazEfL>7#k{Z2`3OfBAzWhuo9k5%7yb5YoH7+x+=h{ieNR) z_FHEWY3S)-5wTxy-&*R^tktDJt;mLn&odW9!(8y@=g5ZPb~DC(BF^D71YXkymJopd>z-Gm_pRRKV%!gb)-ir9PM)d7+o{t9TS+3h^u$dz9Bdz z(9X_ at 0BiGvP^*y%wWpg8w+z#Sbju-jhRs*n+YscQbMQl#l%}np at mbK+p`lN+jw^b% z+bfO>8vO?Tk-nYJD`0nov6wmEmu6SwsBa zr1o}e8C2;~eJU?i;PFE at BoZyv$6UEBp!fMi9n$MX&D^cUfqJev=Gs+!5h)(I#0J0Mt=JAy3V%X0zA|-vdG4#l;L$kE z)g3;EtpimVy$b8_ic~Z4r09&{?oc8?0Tq?;scVRleIqsYN?rBaum+fG*zRJqO*?LD z7b6>10dRlVo*Y)nE-Jut;SwmFQOJ5kx9~&oL+^)qNO+ at sEt<&)PA^0~r14 z*qzsy%l2B_Ig0GQ2xs}Dz$r4Q_L1c*6d;T+9z>z(R1u=)l)7VV%Me3gM4eWIN^W1 z8V)j>7?A&ABB?)d6iaB1^AS*W2}|uBZQ=s`BjV4|G4Fv|En_R~NXXFpQP0o-OTHyI zb#?)`DNfS+>U}Yat2ucSX6+F+=K!s7CK$YAV3$XuNet1LIdDJw zav!tUhvMCmN`fku(5TZV0?XV=f9IZIziV2bdAz}go(o|RofFdZ1fTpg`F1R>+{xR^LuQ#Zu%qfgNX*vo>KKw~nCy3z1 at GV!|7mjr7c89VO~ zr%x^hjJzM%oLI0ko&(a;3uji^5cX=oo5D|Y!cJV_-B1RoV;hebK-z at CQutfnQz3Q_ z)_Ao;Rhd(WNj9l1A|u;^Hw46}*6nyRmLDKzMd36=KluFX4+ozi zj%uQK_lSnI1#bX~p_5&{yoTf1Rp=}OI-f2B&Xp6d_#5KXfVg8ITAaPLhj}5o^eOfa zWeKYRxgS?T{7>K7$D6`_3FvHza3`UWvc zg=8|^qYhn+TE>bN5IMh&Zc4k$O0DC1dKF6fRpgg<3BF#=gjO}p{@Tn}v2bjg0wlpn zKP7!N(f*uu{O9BJeC?Oh4MZRO8=J8$UI^ESBid-7k4!_-_9$+MhURmz&jvX6Fm6~K zEYY*45WbW#Z8;MII2WtUN?#RU#pU3&qi=59q at 9#Ttb at gBGhTq6Ixf4}ss`q~2Z{Zc zC$A#rVX}9gw-%?E?Hc!*W_(~17L~wHI9GttjP8k8<;D%!hT&|{3B97D%aRAN zz2WnZ(-0FC*sv(Qcp^EmMOR|`E88vDOH>v!a8?G>B04qYvUjYS^AJYjQJBL=@%wy| zOhK!PEB1AYj4|qQ{c-`L75;j`=_PoVQxHTQ#-c?n^`qw5Ojw_d>QikLx8L(|a9C|* z&LcIgWM at Fqa3ajaxVm$LaeX1crx25^i4CH`#U+tvbG~k|8<;xz_0zlK$$$ z;MruOH`{~umT=PyXLW!XmErF5kC*^3_x<#E_ETZ7YG&y-a at o*O=Jjeux-dsLwemLF z)9RX{q{(QjK>w{82>SYTA7rvb0s8$IULI26w88)N>&dH?Yls4|!UksNrC{EJEg(U+NEsU=(ipTMN3MlMo&Y^3@ zWH0Qbvq1~&5i4zcsF!j?Q}HeXw=$AP9AxarQd;6kKjr2gk;eJrJ*73!Jvnf9Vd?{l zUSPNO+zJ9ziEy$+{2m~VjV7VBGqbP~a!SzA+dZLy8IHmjOj{m6%I`?$vF1o%Qu4Wl{DDAH}q|M118M5c>%Tf?n!fI~n6y6R5E_K{g`J7}P+Cv0E3s#iq>aUO>@^P6S!_(y?+O zhNaLZw=(y7HT&6kR+DV>lsM2xR_J!eo-c}zoW27M&T$VYe-CpvOZtla?j3!PNCSDN z)z5Ko17~)?^!G`UW8~gtmOp|B_m3dr`}dMLPEHnPwtwAN5_Pn*`QNl6hpmF*d(|^_ z<*JEBt-qmcE=6_GB7Ixj!><5UY+LMKEb>PkT`_8anVH#}qEUPe@#X2g_LHJUla`Ra z_GhG}l`-7*0&=;yboAXIhh&~|xXh+`W;kXzj;9y=df&eFK}c#8F(iwS)tEB;u)_Q` zF0V967;rB6Q4 at -VY1%lpV~Ob`IbE50UF at L5Lro6e%DlN;SGMaDV7!)sh4np~iONw1 zv&ETmq=?4HPZ_^aUj-Xuky~lU{Qj-}on6MU=Tu`}mzihVF?(Z};+uoc&P~zzOMr8r zh{ehzaX~J><)mYke%2?L7El-(C{p4T(j2EL^=MYLid2c4REo7_hv_Dx1M%DoHU)Bj z!y)v8>`PB%QisJ%^|aSff=bFa*oT7sG~JV5MY|``Yt@*jE7hwd{WeQ3(FqSSg$_e_ ztAprHmuol!K}%)^4=o1;V+yClhi4TZc|I*}ztG>G+2NaGVQV1;=Y}W zKa&k4o`+hK|5(egsSG|P#A$;LFylZ?UY~`F>qtSXfBX|JAXFULHIe%Hb4CY)j4X?R zOyiDe at Az7^yyak9jlRE_>sYmq2(E4~izd0d_E&qDIISzXT(6GcsXiIg6ttXFEsbvt zm(P)A*!cSFuOAD{<@+YjxU?N)WZ<>v0 at mveudifr$Zi8Qugu#j_l3NN at -pt`98k76 zc}L=6?%VQqajEWlNBz6kwJ)exCUhBjbP0w_Zopi;1K&7_X>T?0KP%gcj1Yvn*fOX{ zW_$JIFPdFd5ZRslpCFFIU|H%~ZPr{;s>+l-J=UoGIM2Z`2R%pTKh zaDoTjAZK58kji98##R5ItZoB zDAh>?pH6`?v+4U<@DqL0+QwH{_QL~Q72ixJBy0$knMM#-r zEKc_exbM9s15*K)_ofGyl!g?^bk+jgmUs6~K|sYGM`R*=TL$(N(T34vND82IM%+nu zyEZ?Cn$mZ^B4Z_Bf?-D0D=@MI&}x+kQ$PRKAmoxGg7(*4>zRK$MI&MRze-42O4uSO zpPuNhDJI`1LgV=5B?R|$#Yu&`OyU_ekQxyoz#2$z*E=_8g9c%yCpCx2zJlRD!?@EZ zLFrUfy&v_|i+kL?6ehqY?wqgbFB&p|yiTt;d|tiv{CuV#p1*uPX#6D>kxu%lAhAc9 zK_c5~c9(D)CLar+?=jJsH)n4$vU({pNnj at +PukE%Y1UGW?>(_wP5i_Lbztqx-4h9p zoLWh}L-X5JJ_*>)dMq$NM;nBP*>JdKW*d!{t*=&e`sp|4EI7G at d?n=CNLwWb9>-iO z*(dsHn6N3?TaKMJ=o~6(I}p7gJl30J{6YguxP;6kVRS%CCEGrnN@&o|tW0)k?;Au? z7PFKH=w;&`umPR#s0&6XH0x0{Wf`bfi3)V5jrW$Oe2lclPM0YW zy6~ns$WP{5ud|cxx{z~=S-zld&N-4$!F*rHpE#7DXN zSMSb?qD&}Lwq&Og#Rx_Cj10!!P|hF9I$a{Tpp3}1r3-#qhj5;{zPsixTf#GPzQ+~? z31SztktBsvS!M977Nd_we8nw2R(N~|FflZIX4+vwi#!b*=H0;j(}0lwE7&tKCg9 at u zWZEZ09pw4A at UAqFcotgb(I*_-Ig~#Y?G3d1Lha;&?V)}3f~fs^_MQUF34V@=&O&b14>{s($V00E z1>Ue-^pVReuaq|No%om~$V_vcr8^Ivr-U!vtX?7IVAR<_$zGAF zVrEFw_uHz1`A#8X(#s1y&>A-H?_%>@VxI7xG?NpoP5NJ(CF;N->sSa1XSq>p}%CpcbYqE!ZSp=` z_1VpzCSPM|HAykm%7LS zI=7tME&iw_QiS8zsVJ1xmiV3%>cqUYNTe5~>cUC9*{g%zbkE69kSur7!W(6e at +~Ux zhB1IjExV)sh}|lM-dxkox^RHUfV#cFRJENh5=Lj at C}Zj)lnOxG#3QenP9wWO at x(Kj z-l{Rfc2Qx+$+~uWX)Q^`H0*uAybrl at uv}r!v)r$`%BmtlNK?S(QV2AOwLOp=7()&t=6 zIP0}!KYd;bJ61re&SrO7WAh$FL&pYs4vTLL at s_cT?`8SO3TP$vL at 5E+p=Um)gZ?;7 zu86oH$j(+%3kG=Y4(ux)3$1k}nkyMr;W4T`EJ=-)!)DD;JPzxpbqbh8DiR-a+aaj7 zQ*KN4PcWg=vgc(NkK_7I*bTOG!=(r5J%@D88fCy&7IF(4}AnLL)PI4xlh zX|P=g$9R=;O4~|i`r=#1sp=BJnT6=GlKrf6^kLrVR4$?E!i4N#b)<(9n)@|w9i&CA z0gPGki|BAGW)E=koO!1^CK$tzeFtnMW++2}!FO#aA(4>XpL1u at gC+pXnt&^&MQx}? z*o6v6H6chmtFi*ot+-;n7+(J=V?_oWVdTLzA!0^y8Op%h)(ushPE%3PT9p-%$GL+2 z2}Uz^Klx+a#d@=K!F<+|nSi>}67bZ3qL=ll_L0(5Fo&aERd?I8C9_Or{Pbk^h z3`VqCx%o4mtb)f=eICi$Qo{3)19l7FdV-;BKR#ZW1Rr56KS4QByZBQBF98~ouL`f4soQ=T)RCfA}@$%R- zLlzXjX_gf#d%KhZB&QseXom1E>kXO*-qnHnVY4$xdYg- at b{}+t7m3UL`MD&{$S!!Y zIe0RJfGKZ7H&)P*GdGEC={`iKu2cq2DL{yaIpS1_0U0$XaxL%Xz#5M2ZdVlgs8p z$5gNR;-s4{Jz}5i>IEN9tk+7wq+ at oq_tu{+B&&I3v!Wrs#5w0wvh3<{J&pJy(H_&) zr${>u*@DFu^Z(gE;85Q7UDG#qnH%3VUK6Q*hc{UHR-I%tbtcK|Ck7~paj;F_grj&R zHm%yC3YTy*N*VGzAqbr#vCxKQY|?1gfd at gu9Xq0|bRCs at 1*#7{=%DoC{{D*xKD6hwdb;n^PyP})IuqFO`FvD=rqE at g8#&!(Gg)mmUhB`)wd*$ev8xl0osZgn zaoH_>9G1_}BH6 at YIiQiUg3<=bv(K?w%*K*4FbRjcTsqVR2d=uxv%Ft4#{1row&bl1 z0 at j4u79Q8LcwpW#wT-$Qr}pQSU`}zg6fnA`elI$>`Uddkr~Nw*NnY26(=+UWQyY9R zkDJ2?Pl9D8*&6|oqN1w*eNa|<=}=?PP}6{1szjqEcD~dzJ at z#71^|N#26qJj|N4z$_ zV|bT;9rJlZGP%bqy=t*%AK6 at wse4v&|jX+TI*}GG_R93!b$w`EjT-`t?LJpJN1sE{F&g zITksEAe0A7$Rb35kgp}=1;R!i8xo?_;lvvOYfWIO(5M*UHOh!^6W#&;Hj7;^Nj*kV zI?offW)x&+te$149v;7?;Q~iKcx3^wwSg`X74#=)4H}&+!gs`yiY#2Wpfx=hAwsI2 zEC29%X~zD at Os~?R05O3NhK=?Od8J}$KK0^UGEZB@)F!E0kNwVov6O<~oiq+n_1XAMME(NjloZXQBgZ`0_vt6}XW#_^eS z_@@!eF~eMEunFWL#}@H6D*rAgu;e at L+n9laGCVN8D~r^R7G^8c9;9eNq3$sF7-8w; zn(*#_YlT|!y9+G-CprZBk79rS<@Ee-vW5mtI5prtU}CF)Tp={w at E{7w#e$Y%Xx8Py z_B$W~>Fk4n5|*i1pDEwE*F)%EBE&>w#({4K4mAaSW>SX!_7&yPHTIRR33^-P&HB zxDx0;F?A`c($}1^F74CD#j$8Q&{i at C9765~OF{{9SDc)Ir8ZV{4#c+|8*23V$30eD z6Mkt6f?S!!@tkaQ$CRPYX^mTo`Ps*SfVbZqRmaVj>-#78esdy=vue2yC0n%N5xVf)(p9nF=NMKf|68vc^8_ z*DW%#!B83)FSRlHO~qi^eG0cPy1`+9!KvRa)Ls at b!C)(xuTGx_m~R>|T))0r3d^>Y z)T&vIkyC3aPGaH3ccRf4cC!EpMM{Y27 at XYp##=}!4WN*#^U^!VA*!&Wwpi7Ql$hT9w0=UI=#qU0(6B;;z6b0(-W^d~tSFDH&nalI+eQ*m zYfU9h|G!q4r#G9P-jbaYS-W^ zJ%iCgQd66be``uazb4>ZU==cbbqcNn^(K)QhP`0sBB{wf=qWG$W5^o7h3iw?B#*O7 z>CKxZ&jJ;aXrrbaRZv#bb^rH^g^BOE>Wh&TQ~q!~;!9QkdNZns?4+OK_s at A{@)GIb z347Qd{Ycr`I)U48XoA+tY8=*XIeo^aO5P5h!DBaDj+7(o9pwqaG{~!6h0aZc>3L`E zYtV2bJum7>7(hMB%su at 6F1!hUkag^rDqp3kYvdu0p1h at R!iVOUSKOBW_R71V4rFY#z(2%hIz1AK5801aMmndQl?CvX^O#^L6*bZz#_bgfCgpw(=YvI zpEW2dxlXIwdO)kWGET}$|2MAeK7M5GZZ at MX5&D%O)`3fY_4LTH-3)9 at 2WfL^eUS`1 zX^%2`icwXG+KS>rf<0Xhxdl=}FO|*9iJ9d+-Wi;Z%*|Z1)K1pqPY}kG at Ng?!#iXP$ zpOza&E>yJk5gg4V at y8~iYsN^(M1dQEcxx!#K__<+f&X>K61?~-9CU+bR~~d^ru7O1 z3?gJLEtjDw8r$*g?SLpjVLeu0!B3(iEU~@p1e_v!8dbU6G3I?eLXS8Pv$Hh+yb&() zSk|y(w+mI4DRR_Qo|cSs0}Eao-W9f7Rl-yH0L}dz9{P_J9~Zq;+vAUVEv%Twj5#bf z16ABaWi4J(XLCdnoQ-9`vC?2vbX6)dcElN`XZ+&%O}thEN9x8v2HR#ybIROG>RJ<~ z)vqxtuWa at +-qzL)wZ&q_b+{NpWza})A?cFocm1P`xms5T z-4s(GC?%r8E6*#_xa^ANbbj2;3VVSwq8r at 7QJ~uFN%1~t_Ez6d=k38!#L`~8S*5S0 zNILa&;qtnKL$CLqNCJH`zx>B^1P%fOMh at Zd%@B`kW?;b)UQrEnXLKTd?S!~ggFN|m1j}w79`HPfg@*nl?Pos74!6?iPEuGlo(8wR^#E9Y5{;q| zZ<9M99*imug(G0U&{HxVWVZ>@RI)!;o75f#ul+8Ek#mm%dXevR_%%EfGw;F)fqP*O zUf+U$3qahX{Y4wfyHES|H?o)M&ojthf+2xBg~*VG%DLPn`~X*CI){F7X(fJ)gwN7y zdK?}kd;(71HisX2fZTE2KgboW1AY|UgjQZkm4}|<-3+F;akBqK)C4qy<_Q5W_BL*q z((}+SSluNi?=r98yejTIJ|md|B8(dpm7+*=1v4 z;>18V$s`pwNdfn`@%l?mZQ0k#`Z4=jnkvI}J<$Mf$mcj3Jl23=PTpnFwxwC!YDhc; z=>)S%a{`v28KWpjgYRNp-T~R0*;_q~KL3E0jrvdUUz at 2Jci!N?!CWAs^J25wt|k=J zawo?pP`|Q8j=fZKn2u!|1 at Jp%`v|T|E%2YW1$%db*F-31pM)!31lO5RrKey^MnI1N z8Hz971yBT(vzgFjvHUm(l$}s9NvrZijIyyc$DAn$*+yX|HuDN?eLX?Bz^H&poZ{DS ztcH9aC9{R8tRPOjOi}#K-}$)w$G`K!Kt0`od2g{>_7M-%zyiv_zIYit2f=@`iQi5) z?l>|x2wV2zkbJ at U(zNe1ctbuMZJ9Hf?vOP9{;k$r4KMw}l| zNd?Z2yWhQT**e5_*kx|Xy1O_8Zo7%!JZ2Vrq!@0eU!U|7syk2ne3->+_RdQ!1=_?uvGvI<_!62N*AFv?2H$q01_hDDEH>a+mV^ zUMnHoVDxO@^e(Wzg at T4KvmVg0``|5oI#8eLU2_BcqS#pqcH3y$01+dQ-Uax-$tG?~ zT3X?)`XQK@)d>7AC_YyuFBhKJ(7s&yMqUn!t_z)!6y3)bikfnN_2QrOr4o`>zm{*j zyx at _$FzRRmy9Pq1to6oP*T-5hNus{yOu5dwWN at -)*I3rL at A{B4 at nqXJ`RCu7w!Uy@}@3 zk*^#Ou5p2I!6~VCIZhuBp)t<_@>fn23b(H}0cyS_B7g;XV6m^a0BRoPXje7F5&kU< zgGd+lFO at jdYG6Pfa$ya^k1t6G9S`V#H!UiIuOPR81OmcF{EreBDz45}_7*Pxk2bLi z?kT!IhMs!(FqSct<^Xbp$t1C8y-L!`kbK~tC<5?mVOzR>gJhJZ&W4&g4Q}TutKt=D zcPHl6kkoa{-??JB4`9h{_MDxC at mG1C>!!tX)6zWdoWFq`vz^+cj50YD7HfX5U8j7f zUb(N?Cf$#Dd0%*a`dui1pa>-S5adBqEW0;LEW*K2GhgE9U%4oVYP_XGB&fpb0E`h< z=K(u$0R0u5qjEMMx;W~Cu^QCiZ>l0n{#^UtWCy8+QEFO8+;r*|qA#*ojhr+Dr>4Hj z!gog7bJrp$zW02GC||+m>Pd5~)wmmy?TjT_CKsx?si{URMJJzE at Ig_W6c$O=%jtMT7(#-3 z3t)vzD(R%I)rf8M@^`PHY5nPg3cpYaLD0}GLv6JMR(4?d-crn1Zy$VY6! zXb+_cGMA^GgA2$z&f{7Ts*}o6UG|BVq#aZ#Rs7agiyze?607E at ZHpU=X47Mqep&0? zDT-uG4(>slss$DKGwKbs(q!mf^EbyO(TfDDt&2tCHe^cD2$n4y8pp}>3Ow1Or4t>Q z5%n!O>W|*+dM&gpWgFEz+ZSb?^K#&l5d% zzC{Mr9oSqls%k=&)lIfh9^%6EL^x2rv16d)iD>te>89Qn2BkTQ^-s1D8;$A+;CU#;b2y)_E5lqM{1f2c6CXrC;FTWOF_cR*_NF1)M;o2DXUVE#%>&A zO1*0fOb#25Ko3_yi1f(v2$oq>-t<&O_Xm9rH$m(k+W)@U2MldOH81If3EY3s5fNyj76L=N zKKc>oCLBjn7 at hco7n~g8Rm-ff92wLB>Y?Nw`&V zhi|#>Bk+aL4WnFt;Z`eNO)&6 at -I=2(@EbHlTVc}&pdZ*q1&nw$%e;qIFpK&DvY1OT z1Pk_pS77j~8nbfF<1gVH;YdG>t5vcFItm)z8S)R?RjjUiU1LfA4+|w~&ln8OBF!2~ zyDFW$(6ON_KXVONL?$`dxtXn<75Q;3defbl|76=?%}SpFC}a?{ zK at -WD&OnQ0-4=B#g!b{3TGQeZ@=;k=(2DxHz$T4B at B2-q(%YOrs2wVPzuA at +stu6N zdzUP>zOjHlQAyf5#HuIDF4_8R!pSRB$Ypg1;oXVB@$3uXgTN`_zE=;!0lfF$HRK1U zu^GPFiB}v1t_Qww7tfF?Zt=!@p(mA|U`pm&|C6PAN{Dw%(F_#Cd2*GlLC-0>WP^Df z-N|AS`&Jb^heAE!)<<2TQK8*}nKLz81=pU4Yqzu7E`6cz?6{QsIMK4ap$Z=p53}a* zz3f}_0g2vnM47X$X8RrDY6Hbc17n^=iF+IOH3z60JNCm{#z+smjtCgq1$i!43a1d7 z2#b&V5D^aPjX~Y_yW-6m68YX(_3`g0Ceh^3&4f+{rFswZ?{%2To9Eps*MQ!Ud82N- z7>k&%N|od845Wa3q<~_i0OAUPq!|NGg#fbY-ulZQ1k~GFWa9$rAz`&}kk}64?13f2`xES~@#;{Hw|9-%j=FIxd^4 zNPmwwl?tg_x#c#JWfoIM>Sg4VYwMwl3rdK{rIJ|FKtfTqoRTM$Iw zr;^i(WmSq zZ at bCSUD2!PPe$4!a0V9Wy8U=*C+K6Eib$hs*ikSW^{!Bpno5rF4r87wLLBsyo-#rp ztL^KXx{tANT(NsGn+Upm>DK_ zr-In8EAScv6SX=HFavElZJl(7&-8ijG z{zh^m%8Xq at 9aWSJ5G{b^ikoFu~5|_8p{tJ1A8zE5QT&Dnb z11!o#4aW=}t;Oh=NV})ZA_w1K3*~N$SCJ)C-BtXks=XI$;@H|?$uT6Bc9(orNRo@$ zB#ZP%;XaNj-z1*;0^c at vEA6I<(Ay!%p*lbjHVOJ`KABYKE3^lZ!3cEKGamUrUih^=+3}tBG<_L0dR>d z8udFLaL(Pvp;Nv#9x4GO4M~|;Ayl;-w?PD2U%tF&ug)vW53*oHd5dcVp3!SH zJds{FIWgdlNH(MhQ84g_YAXir*z0o6Kw#+am at M((Bu)wwz0g470Ia?FnToZ(7-=-6 zJEu{jRByvno@}XtsOudwhBF z%TqdIPSkPhPw<%0U=RC;qzX3g>w}#D>w&iAMjDg3r06rxkNC5qTd2P_BGIpOmN at 5B zB2}U`F4m9>8l*#aP~WXk$G-?l0+u=YOgwelR4y0FKt1T=-J(}^mI%BTD(r^%0TZjG zw at AIS^O<1UkTrs- at y?t!gfPMszP;21^t at zHPFCr~>G>y%Cq5+0-H*jGkv-wa?x81(K_>;J)N=Aq*u1z; zE1a2Nf=*SXBx zkE>e&6_3lA7ng^Rpd$v6Fvaoq(1R{PlAz#Ds!dy7sSOMZ-%Q3)?b2O|}P;jn=mFB)`>F z%hG-UWBesO+zM33*s*6OblAz7y7Kq!?gq6qniYdk!(^{SXu-2(IigQipC=P3-N9m9 z!*^l8Uh$Eh++2614CY~af~IPEu?uY#)je0p3FatVoX-$ zy7V%ikQj;f9jD61nGPdP);*Vm(0=Qx8mqLx#`|Km;#o5S5^2m8-nJe+)OjQybfU%% z-sEWPOVUHHQ~j#RksT_c{1ufQtOrqf+%golFFNjVmqY!(!Ltl|mo=KV}+oMn)!@vM*(*%`vQq_)}9oLaz`qa_YLBcp7 z-4NtTP(%4k-V8~EF|9F3eII$GG!gLMs4kyuAZgV<(ZfF<)Bmr<`M1;4zdfzqFl!3= zf?zp_v3P?i+mJAGf7OV{NugR+!p5BpfO=9oi8@~Mo}Bh)-M)7S097+8E5bk%aRFp< z9#^=@qgz*SEgW3%*W zGHRfHMZ52~bi0#_$A&x&uFSj%6E-A10vLaAGvvY723j|W!!Pq`I)ihk0$qu*KiZmp zApXzH_b81G{Got=DpCKVX8Zp)^Z&gYH9rmTmeGF@>a at r~iI5V1Guawj8wTnz&HLM0 zQlltN2@``67uO(k4mON4ikMqS853&P*j-OLSO zF6d?d-dW!^!gS|28Vt+ux#fE0?K#c%xw-oM>3oCuP5&h$gd6+mDBLf_OL~aP at 2e~X z&QEr at 2xH1iOAx2}c#jQERR2{Df*v>iRvo0xOHY}XbngXzc?ZtqC2advh~+2MpLUOq zZGfIcQFYJ8dpx*`?hCq$M%+V&m6v*NhrNqDXn~eJ&eF*OhzRzH z7}|kp+I2P<7c$K-&PjJT3d4Qh7M=IzSf}Zyb at o+(SO>)>fEt$vyWSh`Bo0Da4q95V z*$qgQJcEYrNjNWVT;;ZxE@!URlx-zr4U4mM(WX2fiiy{Z%BojfE4facTN7YhLM2E) zYp2skLCmo6reoQ+EM+OhmeLz&sc5Ufz7K1X5+PhE zbJgJ>>9C37NOClZCDqA;!Cz=DBFGS~k~m;eaY)fbIPUoZMV at D$I?0+DHM27dS?yt+r!% zK&FEiTWZAy)kRsbmP>t|AUr}o4m*&KYqcSU+&>lrk at j!w^kNrpQa(0nkA=kQ&`Zi} z2Axz0rDtR>UWAO&B;kyf(#=Qpcow7N#88C>I?zufDJ_N`Txd-&7mcjPQ(hd0GNFfQ zY0S at v5G-g}SS!e$6t`SmvuufG9d5Sb9oEO!tKBYP$znqy&;=u&FNZ578LK)D&9~M` z_D|G8O=N?P{@}Ps$^u`uISPsnX2haSv at C1OIvu+wh6#FA(RgdA!9l%U9aR at ee9DVH zX;Ii`EFH*rhK<%Pll1cW94Q9jF}Y6T<)r*+Z^p8&bz6Q>?q)|nHkEB$kJoaAaI at Hm z^bXV3mnyc}YHm*-a@|9pwKCpNUQ+C*wY7^p*Y~62FmbWbp%Q61K?` zJ%EJK=+QYuv8OC2^#OY8AQ2~DO-81%l6d;tHuj;-AS_g`HLR6wBE^*6 at 2VSo-UcD2 z8~hCpqdDS*UT2&O=_h}K1t3_ACg4fUCPK=kK(W8%VUihqD*xej1yhs#HN2$n))N6A zrbhdlemlkoD_HrMs*O!pv#<^-6_)x&6j9-2!B6N{@`;GKw at YeOAx88r79nE@qF#bUf z8zguFkr2Emp~iH(N#TnApb|=FweXiLsi_e*pzR?yG|9wAPhc2(gtiJsHaszwp3oP> z+9MG^Ei(Am$90FLXf1>fK;MGj(;#zA?K~rc8nrzXeRk&jS9g8zNa_iWDV~X1cW5j7 zR?gYPvyVsK7&V>0V4m53sBDyVqveEIE51?*anS$@BJ!0-r9t at -|QKzgw at EipshsrFM zsGb?=y~5F_Qr&_VHm>J|Vc+iDJmX!+PM1?{e*nr0?FnqW-Od5I`^yK)d&i>fmpiEt zAr}r(1vYt-cRHXJFJ{c%7BHQ~EcCP5OUO?Rc(4pAD_K(+t&(0 at eZ9fcU8DGpQEhMs zWz|pXe-PN{w|>X1=S+{r)1X^QuI_0(R6uKwTpSZLQ z%1tr*##1Yv7O61vgB}0;pHRjk|FgH{AB3$0_8$@U|3)zXDugIn8ri!#*eRQtn>m}= zoBVs=O+`-uM+l7%w2B6;Ut6XZt-b{w>Rf#jk|qQb)tAU$$cu1=DtbL<*sN9Rvo4d> z?jTqoU!d|FU$JmFo<1Xt>vbl_XO at rU^)+vj258eWsn4ZL(ioviO4x?nnS4d=2>YZ; zc|3o_QPDE{kzvcZ?Lu23$HfRT1#sQ2zWUe^`vH35D010B<6UUO zuoR`R5>*R!wBM~PqbZJZ#NgaDRBs6hb}DY}bPoG#NlRUh_*@bw0P#oZvTamtul+C) z9RMC+3da2j76536m5VZ>@TP%V at AU0`ao`Nd4zz7vu3VzD%612cs<@*g3gu&|#jNY%7pSiy3FzdKWlEbu57#m9c)PV{+6d44~+j8XB{NYIw>yAnCCJ zww~0nq>(oaJu%hHjqlP>5J=E~q`WMX4v zVMb?VZ|?BF)?QAI4-xnuc6E8FsAT<2+Z-7#jfC>u7CqU(LF3^wV4(5_?4PVjY8>gs z at W_91-?a at 4Hy@59R!+mpQ9EXwi#-W*jXEqL-DY8W`vJ+FBy6D<&OzlMXYZamN<5Rq zA at 3a8|8?DN`GNl&$t=C at k{ZXN&zUf=G43|uLtRZsEk>=0F; zg%%AVCXw~_lB;@`33ndjmR>hkmFm4vQ+LZ0gzBE)S7cFl>l9=Z-WWX*gt{;3b?Yvw zdDjVVrqROfl+A55+-#)ksh at w(&A|^=`%wD@wl&^q8It&)HQ!{s at 066sWLtN2;ivliX=L7+-0x zp64E~QTwSDc$IIKCfwWoS$E7H#Bl${8ZobmrApyP=#{BeQ8{;yrj`e7P at pWZ}Z;znNY|=l)X?w4W)aX at 0Io`xx^h;D(p6$Vk!Rt5V>nLd^`YGWLUw$U^9e zK`NQ7dcqH3Qurub?lV@$7`dfxqR2}py?RY|O|0KNRUXA69706fNRhD_rcwJS=n6CG ze+%&s`C{h7r}@De1+k#j82O^`Vn4DfTu>;`YQ7qz{)WS5TR%Q^tn?StDD?KbQG5?oTVF%C&g5YSlEX{APtr-ri51qM-J5 zVQ^Lml?KP&OP&&qygr03UbN~5Z1kQmSf7jPhfV3_1zXG6u4A6|bw^|Lr=l&xz(DWd zfVw{CFP#=s{I4)!9-Zqab*!cI3kX*EB#Jq`Xf85;G`(ZCxA8qeR0H zJ1{}LreB)CjX;J6{IYel4Ad8^Q$OqKWF>@9_(*VhNKr^HQkhg%&fl{B}o{2 zNrayIgX*TTt*aa=WaF(zs26wOrU{!4x z7d3*CP+2n)oxc~!y#+nskUSjIIo^a4I-M-g%;JY0W*>q^KU3z zSE6*ruecd-CE^*6T!DjJWKi`>H?N&M(-K=3`I4(a8^-nD!XJk~f$aX3yiF3zu3)KB zIvcy1>oOb}E=HR*{0H-sx%o7U1lh(Lkwzx3k+JlHWF7b~hq!kyp`EO7+p{Z1U&0lF zj@)S}!J6|*xEN+Bn14VNiEwpMLi$y&gS9?{SX!*T!jHuwnHdAtsU8!SQQ$AwiCkUo z at xr7+DI7V`w%hfnPG{tcfEVP{1hM~Z$h5B>YqulH#vBj zuH8xcuwLq(0ctDm2}9}nQb*(0mf at ay2q(B88phdxPI5=ZmB%#+tq3!wxNpZ05exm9 zeCwRCiMOTPPi>su!b}!CjjV0D8Z06cqPXuFC#~?uE0I`ZQX2N8z5>#TCgXrU3~fuR zXG>77wPlPF_?oW`p+9(I#Py9OCD>NWi&n{JuFY2m`#fH_{7DhD1&x*fbLe{@yCSYX z6P^^Fx%c#UAcu>6o!EH at JA-d65T*86|n;fZ7pN{sM8KvDQWK=l9DJ6!62*5b at uMIG#ntnB5D?EXEcqY3SayNvud zk5;Flp$8vwRK6OFqW*Xd03m4hMq z+qr{|bI1v*7|)LC>GuvMA0=NPyJD>{?%C9$b}Bk__N`41L+5RG4##a?z{zy<*Hb4V zKCok@=IL)xlK1j{e at KEMU`TPNxmYI1lRYE>f`d^b9)gyAWXRaPEZR>>0RopjC*J+O z);qgg|1b%Kje9*vx!i_BEB}DFUf(=IfxTG)*F9|BtT at 8`(ZxH|uVe`UllHvFLrnIs z#JIN<_}-Iuhthp6-toBIhbNDBu)Ejj2gK?-FM{s`2?oX?f%~Uf+6PRGzcd1WN8)-P z55;)&jh7i7j|knr76C;Fv?EXg`un3*U&jXQUFM^g)wl2?FQuRk`@8P8E_-%egK-+~ zn*ne420XF%8Mn;vw+Tid?nF?(|I9UvAuDQkc>DR`-{{YNtPlilxCeOtX&1n|LA0J` z#e)mWY^`FdS!c-?=TRLL$QMhaaDRU9*zE4^?y`|@(d&^^=_2Tgok!yj+ z9q^Wn)Nplwc5~3(ym@|lXK!itYJF;Uv%9iIM$!)iQQ$;lS&FZhf*)zlem%<*}>!bMkdBEd-*4b6?yCn+$;H4(d(If)wR_pdALvvE6Ak5Vy zrSGZZ at Oj07_>p%XsGr7~0 at HN_vejl@Uwpt8 at NMmwgtP2rPp=&VoFnOI#zO#~K7^<_u|z+Y~+V8X3+h7dXcus%bxLc^q at kiQ~Q zQx_*!Y*T^10M>rIM!=@d_=lWC<9h$m8WH?fPc+X82Ru2L+9}3hmom_hFLv`V%X`^v z^w8ed|N6d)c8-?74%?=4QZxPKPBSUDXkzCr2~R!*R>QfJZm`Nlg~W60_MCB}BeET_ z6~C;KHe>8jK)^%a0%bk_JF}%$lw1zeoR`byDfzrU=BWJ4G^fP7ngj1V_JSv327{$1 zGUhP#0XqgKB`_P43G(Is4%4#wF;|lovN=aPK0E%Ba4r})meek6K4(mEXpH>D@!`U> z>tiTk8jbW+ekcR&0p;i0dJg|O4lyxuMbDpZAT21i7AN`nS4+msbJcuPR1W4m8*}6v zH-(DhT8yKyY~n_!Q;J-ANUhE1`_bD_GZTbrDGhBJxrK*{tl`bkr3 at UBkmy>mk1mL2J+($Ee4#Pq8q2ByZ1Sh+Pjfq3rbT?R*k8447K&oVg%7U&$R%vIPN^Bm5ljTTlj9{-aq^nf4XWoF^ zDVV$}_e at W9V5-D3z9;I-ob%1jq=5VgF7ysYuOf=iji$t)3&Tpl79I)%!fS0Blr>Bh z$(d5x2BAUohR0vG$4#IYRVAl$m at PPVAWG~!a+ITWl8vb{M11lBky_0T=2(* z*JMgEtesuHRWXYCfYqrZsJl(Lp8#&Y`E9R?){v_;LeCRGjKPv3gI2Ff+Zur$sY#_y zwI+L zQkzm;7*p|@ckG*t%_y}EgrJE($j%<%;P%OsRM9wH+vKmjtVpRZi%xWS? zzN#pI_+WB>&BUUow&c}~&9P!0xF~lm%!xKPO{yqZ`pJOx3eue5rW3d7E)S5E)G9v# z{jjA5Wg>uKH9KZT?@W71A9v_Si(;rhK$LLzxZX?5ky?&G^RtnC at nA3HDCks5&}D8}yMq;MHHgNNu)D^1r+-|QH^K0j9XDx80?iY_x;00Bq!+R2xZ z&AO`5;l0My(LU#hCKmaP0*sm0G>7-wkwWP;Wh+`tD z+YqV(6HSUAsdcp7|Esf$`tzm+54-7rTvT0Hl&as{{sbHm_Nc{k)hmKCjI>VzJf4Ikb5GETj&e_)++z*Zql=}#{lwQG~q-2YKzJq$T zbuk-<&`ZB>s9 at ZK?7M6xgcQ>9iTObir)|d#$rvmZa8Rmr6y3kEqnODP*+qoLcElPz zU=ANWurpJHg4daI;?bX}lIh?F7Tf58<7<+BV$BIO%oYTKLX9Uf4~*7HAbL+J9r+JR zp_JPeG#FJ>*Us$_=PV@@90py0$;p*V7oV*%EYU9y!O6~OLw>vmuO61u3}ZkJ7716H zbtdZ(M&UU0O{|q%3xP!fJF?6=S{uMGuzE*cuq^Q?gLW31nYgIj{9_Kr;#tyRjYbhu z*x&-jf{R!%Av}7dju at Bk?Q34ulFPBh3D9~NJjQTZ^@-C0EIRH&^SB9$wS^rV at Ut3X z#bEVkti`2ZiNPWi#`Lrv{u#O^7G=}?%~&v9z^NSt^&W3`&T3bm^cA}B^B$hK&9#tf zo(b!H+A+fT`Ij_=xBV?ywT2YTaLh15M%z7;8FQW|Z&N=hlSPV71`}U=dcAnzo$>^4 zXv=kYwv3XV8J(w%iGoV~5ve<4pRHDeGegC^T%{;MLxGLQQU9;^$f zlSNyhQK$=y*g}5=P#?v9mNc&fPpfdTN`NAJ(1;ULyLnDH5#}k1QV5Dt zG&2*dS|P+^2rBFlZ#5?DA0gU-_5)U1)Tol_88Ch;mZP(zw(L2L0`$B>HrSZfeVE1E zh;lC^=}ed52`Qx{D1M1(+XBtN>j2_okq)f6a=uM<||&>)q?GTCegQG{oEMBC6*`3g_NZ+~JjB`M|k7^%5S zxj7c-%kvV8VxwmHpz}Q%x?G`lPj<0OS(U2L0I at 7>p0Qs&e^bl>b<9TO4`25YD!ggR zGSo at U#fjE&3fym{rUP5T%(QAgSW&b5;bia;*<6t&x}s^!uHG>RQ*dQn>CV!256RlT zO6t|Vm5w6V4POne^1JD-$1P^l4^M|XVA~|H#7tviCXH at wIbWp3)p8xo*kGy5N7 at rc zjk00e$_XJhWj_X`g*3&OEg9!OC&hnjz_Ola-BN0QVW_uo;Eiubos(!T8|ty at i!2_9 zcrPl8oN}sIX4qh0^1MG|Y*AaSWyzXMPFt%9yI0feCH>mui)^-%)j6?%>-1}zmbGH? zcKMsVxYvQ&zOoM(Rb&Zy07xh;_G at EGPv`EVb+JgX(ME;mEr#a}Q#R2GWtdS}(@rKq zw at 1fzt(r>{z3a>Gor^o|3!$C?H}$XA;L6_ z3JnDGiu at nzrw%Tz|FS-CaCZIQjUO61o at f@>{uDgpwg6~aSm+}`P5EmA5E~hAI7wNM ztSDs+Z#CXVvBwyp7U148$g3*euN}r5d!$oY}*}l8dgdkL@(|PXgk`&KSppGXv9o4hVrg!}6=RJjM*ag8gvwKbI;GmZwG42#=>Ml(rGSxpXzIv8eV6nxlA(zrZH zMZ!*PQ|1LNpmNawu#k)sh-Bbn79fcVZu@=(;S|!(nj5t zA#|md;t&m7%OH7yb_aWooU7chTz3p*7^k)91xy4jUo@X1wlZ(m zb>pd%oXFZ^9fg-?CF(96%1lb*14u=>E08xi(bzfu55B(osSU8}vUqTZ;8q~GdvFPq zQXGQ275C!q5>hBdiN_XJam zd{`W+fnB~EwjGvradk81QftBVB#V>Qm-(cfpQqVNpPN3w*$h}DX_vw>^s^k(0X0>8 zxlX5_BbyI+BSNad4&x>q#YS}LB$KebO_f5SOc8F-X?3|mjqGBR_ZdX{l)eImWu=;& zh26PA_OoqlaBuwRA=RCak7 at 0>lQ-qLE1mC2#Ooc=(!zq)UO6 at 8$ic at es?eAH*Xj)7 zi)_uTu<`ugFfW&waR2hDKHak)<{_IW51N_vrGpr-brwqmW zhIg~^23G*|j&z?Qm9=660#4cX?T5p(u#Q)&HU{r->yIL1i?}6WA1T}hiEssY4*Diu zn(KIx2I4`rY=j-7NI6eUg}X6RgsV(3=s>pXe|hUAYC-QPKT?<@Hl!9s)996UQ6yiGYWw#uxBaezN29$ z;Z>@US?6ETs4<+6$f?`3;4|i?yr2QO71ji&%pZU7*{yvKlg5SSPAU;4hq&(ZQ9r)< zM0K7mVIMb}_OejWTOJ^zgrmshK5)$p!5aS6U#@>?{4~oE0?`l#Hgw6({ramu9#@=x zJHlXQssvqQg$yg!j`aYYN_b7n+g>p+EuhLH(;T`aCC-8zDD~crNm!@Hys$BJ33NR& za7fhY4AUeJEwfQMl1t5{J4h%y7fen4e8dYj=RP^R!r_GSixH@)&FCZfJT at sb_3N(6 zn4P&l_WW8Pi<9?|c!YH~BejyxzJD*?uJ4pVEw&n1n(CBKhB+sEGxuLj+7< zWrYEK<3WDKB0?#TLhL&`-U~^PU%zdZE$_X)1}P>Hl_ z&-rA`vIym2DQp2fp6@@r$q$I*S0r^9tDUoYMQnl$_6nrz;jo at SDoT2ayBm9mw3Kfo9 zqO7WvV6KEO85#3^iN6Ii&%{+Iv*jlZi*G^Jp8~$hyXROAynyd_c_{;dfWWpqCQgmd z{$`SwtlR at v@D`S$?o)URb6|rlKb&SY7`<9j%{1uqhLgZgx6h6;5REm7#hQO2n<#3$ z>)P4lXSI&A^I4I9x;3Q^v)4o`l*;ibQ7xN*-E<5luA3YWx(I8FIrA^dtZl+E*8fN( zQw*861a{%4Cehw4-d!&18S7X)Cw`i-Sd2dctleEM&rDl85x8l`i>jZlaVgnf z0{zxdnVA~SJ716yq{&asy+nuwFFY~A=YyroFtdzT=(oSDgai}a|0U6^ z-f(A|H^Ot3&q(zGXN`hW<-CaUf1qZg{`W1?|H`W at t%m#GV7z$o8vFkxE%iTp+75n- z_VzvwzP=8=FAW at g9PB+c{ue9%L4WD#)FpW|ABk_$rt=>PCx;6J?>7u^`de>vNG$2;nmrz at PHm$F3@ zPvfx1!sCzUpTJmxDOeb^+%y|ckGx-{KNGy(ro#}aYxt7JoM3_h at qS$_RZmYnip#Lh z4NNzgwSz}LrMY at cG)ZZ?C1n4Ka}=@lHs?&HzDwoAYoxPLQS+uCXhLscnEBm4 at w6j@ zH8>*Ef4&h=FoNe`PLTh)$GLC+B($Yrq*U|lt-_~JHq@&1Kw9WUp>)&ES8cI0ONfC&jN1S#jJsh+ z%_D)G*K`B?dbOWeYFG9p%zHFIqTuG&q) zjMb-j!-|em-ts1_4cYC7R`uh2n at F6UeY4!q7xMI7-nm&+A$AO5_sFZc+L|=sr5DBL z_*RQCiIY#hx!1!sj*rJDDBol^Pb>oQ{?XpG#S~>gaRRTzPqejyb|BhS2D!*9br*y@ zw+Ie|ks~V?^)+F=j;7>oLSMH-$mP3*>v76B5E&Bn)InGxMdAirTx;L!$KEh}s%r+q ze*4Dow at vER)t;1RE{_y*eRwu=pG(W_pb!$+(ULcm+P84{eI55@?Q|&0XvDa=-0Tf& zQOj|cXmhn8b)nW at 7{-*Wmn_V>%BXtE>Qh+}J!&t`Aofy;-9-cBa{EdKGfvGcGC2%& zP1U!9=3&I7%=KICdyetB!or!-=#I#8(Imf9 at -fiVa?ne$Eo}|U9bfUB9M5zlCpgMt zu1d`Qy!Xp at yV%J_FRj|1MK7AUE!um$Wm at EaqHXe1BV(M#A2iWx7LHlSo$eDu`U9qX zRm6tVHBGo-QCZb<-0{)+&yr3B?I#=@kjM9RImCq&GhDKh6;7h?L0vrquAW$2qW|xuM{m(G4+3!Px>!>VvX^<`T>0LqFmtr zb?@l^!sma3(gZiuV7E!$>8wyp!UmY5U=%+mh=EH&K&vjOm@$>XjLV$Tok3vpGB-(t zJiFPHdbzb0ir<)=Sb_iTXB>#Osrl`wxJ?nUmW{O1v!AtJf4Nllv) zw<{BYH at n+$#7uO|rN91u&7VHG$QTde7cVF{-$ZBJwh at 3`*TDv*g4#2m`1!M at Fp0Hy zSc!lAS{!EQ=fC!%`55vgk~8Q9$HvyMFeu=HVoAzSZUzi4bQ-#(xva{VcukGt!1pr7 zerGMO0&oE23$%_ivw`e7%hAEM`Sg38(xDXwYzygYA+7#x80$excFS)QA>>WP|?&< z{Go1r_kqAvRpq&dQaYe-m0nd(@IaI6- zFiflMHfYHe{%Bqs5F#CB7j96Nvtab`Zu!H;UlfbHcJ7Kq#b#-qR at TVNWCVOU0%V&8)C_gDz{FYa at Biu~@@XhEn{W+h)m;rpR+bwhC8cf4(pu97k~8m$T{;X}f)Y!ff*Q_e+tp89#ZI(VCJWge1=YxAqaRvDVQR(O&op}Jjoc&cDs z{i|B++t5%;e9Y)~dqLb$XBJS53k$y*{Ifn2uYkr5;m%v-ny&XePWIap?%-q at fiL`~ z#5m_$3CLlKGnb^)fCLK<;RYhBYz(q`%lP6}Wu!|Pe$=U;0ZkEAFlhW=BbEL>f|x_& z=tPbc2+}yL5xz?jTgyXxNa8?w`8p(8Z7_HPaK(qST+B;!b{}dJA9Q at Fj>oZs=Cb0t z*TVjFKgxn~e?#=N369y3(} zQ;I)kYZi>CTL_!=BJ#_-Zau_uH_E`;$HF?CeRVCP%xx)Hqfz#BN1HAb%j$5anxHf9 zR{CB9J0e>yvS+6pR&~Or&j;P7nbCK`w5 at uP2uyla(NnbTS`hlJXW`?Tk>&89VCiJ-!=V{V{&~dU3*m&C7~^ zteepxU;Ho8Vu&xP38fXEup^Srh3`D%?ElDyE^dU}Cx)Jh+>M4Zl_Ei#(;H=fDOql5 zW4cDHFjl3oBMQ$lri5a;de-T=#uO_BSi9CYwnK-8iGhEa}I2*R_ at 6!azw*eg=syb(H3 zUAhDoi5 at rvV||{?P;OAOpd4)Jt#u`$2(=N1P}EEd3nbMFPY)q>cJ<(WhDYNR{4MX%zL=Tph!7COo9J|y6xbP|k*bY7YZ7l1t3fLLF?=A7vCN#% zK6JvC?+XCNOTScO)Q)U%?54BP_RD=2Z#B(>{e)L}zfxMhZliuK75=+8 at UR6t;-i(| z0b#KI(8H%5flK#9 at l8b-&ySdx#SaIkM}U)8YQfgnhay@`%(}S;R}x$*OiqVu40Pud~Mf&j1YW~415)}@gS!hhfm$`1Bk~lgpJB$VwoAG{xs!%46*b?S>SF89x3j=o6O5^Jp% zyH(^orjQi}Sk7UpWrk4Qn=<%RLiCx~K9t6&-K`?^=H zLXUQHP0If7H4Sq%@0 at qpCsF0)_L|?)l8Sv~1wpn14j`|&u?`ChwxeVEBPT6ff%z1U zchU{K_LqmvOPQ(ueH?*m`nG-VFEu_p7y`zV)&AmAJv8U6rtk2k%3o6%mgG$*voj6E z_u4oXI`r{-&9R1|j}TW;3HQ8=5on~ox7qNk;rrI at KBeB06Ao@YHqYYOl+04sGu+Ae zb;NO8 at S_bGUL1rNT;(>DN+!_Min8R<_a6Y!?1N at F9#{2lpw}PU>D(oXZv4Dad!uIW z3^cvBYD at -S#9VzCab$nE!4nDj^bI^bxF4ktlCiL9us0GEZDTEM*9_$S&To*HcdC9{ zKCQcR?BVe3{W{FcnrhZ7ovSWkPcP3eNUg$lS+y<6g;-7e0TWS#q>aF{!!$*uuv0>0 z7#fBK>$ka6zfKC9hWx=?V$^|rM=X?Z$ZLgMh#?74G!HdkHcf0hhVbZuMeRl@$qlf| zns)4;m7Z0 zG`OMrbao8qoV7LaZzdNxy)C#3H8qFbON`S~l05oP+(mOeD)E*f`;*}(k_w{-qj;w; zT%h at C3)B9RU8%_j!L5q$A2ghvO2^p-6RZwQ%p;G!eEc_Jai7YP at bbN>#5qd0iwL4} zws~gX%e%T{$2mx8l~mF2ru3*Ojl1BKt%^p at In_P5Z=hab_qiB+`9mf?KmDy30uAGE zZpHnx+I>uf--nf5eu>rR#OJ|8$5Q`q_&u}}Yn)9r7B_a#x&{0+*r;k+Xkhj{){#C%H at PfP75ST0zJrkFnbs#5NBA${n9{Pb z#<{N8Q~J^2ZN_1K#%j?)=tE at Q;l%8#h>|9hu_@$VvDQ#!%X9)Jo3Y9Sj!ih;6m>C< z^rAPBpH0hq7o=@$n)D%a7-`KU*DEWf3GBU9u_5|k%qv^{IYq0gYS>7g62^F29LN6l zcS`H|ny9{=d_yYk`~~e at _hgK726l)DQ;|PCGh+MlRh~WEOe1Kc#5DSO!Fil7rg91U9MOVUQ z`ujmoV;t2mjs at vP+RAm4fE>IOdX_Ho_JV1M{z7TEeDD!N(_RY`hbLTl^!2~-+R?uj z2C-}L at D+sEt~J<{^qK5 at A%o at F1wxJ z*e(xh9xw}3u(hW$DuhIToSC8jyg$|1Pd(|ns^VGl#8+Fs?kmzU!H0r$>S#Q2rObXMe`DW17ZUfX=J#WEcp}f={0b(I2l=1!Q!v{sZ%F+_ zyuyVE{w4pPzSvMK^a10^h8W}g!)lZmFco5n#jAfOa|2lYUEImi-}HF0Y>T z%d$wGQ(vp=HLJx^DEzx2tU~`|h(%k9pM`(zL1nUO2;76o)Qf;m^362TpA#fm4O3DL z2n|I$R18nVYlsg;5Rj;}=M}VLV>eQjwk3`PF=*{x3znuCOi<65{w`nqwW_jc8=JX> zBBaFWsJr&G9akeiv~6XQCH(Y`k0IfO- at 9Ba)Qi279Ii^7DRMQi3b9%0V!H2EKF`Lu zqX0J=*6s9NaqSP-*P9th at 1h6N5gCn4h4BJTO%Dd2A-N0oRibCNGT}4KPN6ub5?tcn z2-LNHmGp!Y;OvRa20h#0T z2*MbS_564l$fIC(z09oC_|rXhcl%)Cyi#PU*5$I5 at s=RC>xYR$9 at USJ?zP#l&WhF| zszy-lMYYM3A62*$G42E^vIqm?J4;M$S$!x5<~z0=Z*r~8e6FDug-D5+U!gL5`(b#e z%p`g7-I52b#*^ECbrpxYbUH)z0(9a#%;>7S4$ecal&sqiqnxI8X7<$$Nt~C*J!oO0 zHqx5X2`nOAmO+u1qn+w#U6v79$)iMiB~}74wU;ZJu#9Rq_u)5Lb+G^l at ncd;+4yYE?fc{=C z+lfgC{HkhIh`jR`;Q))T^14QfT{P@$?lUj#lP+{>X5M4v^{ivySjIxaa1H*EP;|W> z`^#;SDC>GZmWmMArW$<==^^F|X>K7HI*Wn*7p3`$OJ-le>qe z-{mSe=zdVC=F$6??86dkYh1dWO`H;XdJg~(d!Mnm>OD6R>rVrc{)v>yCcvVG63y%f z;=@SKrs6T<$>%w#4N20fzpp3lr;Sn=msagtg1$^tS2NwHJJ~ES3+^;csd6 z#9%L)RbATML$dR*bK^hR;(y)g ziaF at YR*a~Kd!{IE?_CI$eh8>#lek$xf28|SSMHFVtuxW0N z_4d(YWy^_;$pA`@j73x1>Lyn)qOP(bIcBaZi{Nlb)9F{Ul^f}ehu{1^FbeE>za2YL zN|6Y?(OF4kc6!8+yhfv3dM5CFQ6Zv@!syt&$avqQUiVbr;k1vnpNq~W>|?-$Y=V;6ZKO(ol6TMkVjBci at i?; zduBtN_G3fppyBDyUhkIIvF#p!3V?aljfb?#?+l6B<;TrKyvh>@4|}DNng^c()-pxj zm$717cgO6-@$p4%5L@%VF&FvjFxO|o$0 at 4Gci+S-pZ*FfpXycf^OIhI73@^Uh(Uvx z%f3d#%UCANn!?NxAA0UyeaWriqsnmPYBN$A#%qX}@+N=BnCBnXXes5o9&Zy{wGfSL zI_gkbArSXqQFg8LHpN+7)W~c+^^0$2!!I15 at w1$eT#-|NE6h4~YJoMIK>O_pUreic zu7inY7Ij>j$gV8&DKssKKNDts&1qgM%#F~N&mKq&`Uz`vtqbN0YC4V_yEgc~rhtZW za+c8l5P(1D+%j!)u;BW5K!19bi#g^*$tE7l)HR0 at kh_r5no8Cl^|02sHdn0Rc01l9 zs&5%;5MHJEX^SC-g3kb3*xYnY*QdH>+rpmJj<@A3G(&u(K`APgcqjvgf%xlqi_XwA zH1If_;;7H${)|K)T9u#+u1LaHXd*KyrapRVG(@g0gvW`BE1<$b9pOj7&+qb`(ScW5 ziAUjyM=Z3}vIO3;O6(vArz at xP*Lh-WS*3=?OzZLOM)i>B at fqv`^ivnps<0H(CMRpu z`sX*NLCaMg>K|R?i#wKK2hyj8tr{VG`d{z7C#?5;D?fy#s#ZAu at Swlxs1Ppt;K$fO z_+j$Phw%!l85xpphq}>q(EjH8f1G{%x|uJb0?|48a-T|#KZb;bu%?WTc4YFm1q(S! z+X)Y4D*jrq;inuq$g^XcMQM%9{AMk>5zpFM(3uKUIQMjJzVXP;8!x$y#GN|l&3};1 zZQ6g#9+@{)JB%AaJRH0aU%mkO3#HYmtbM|o$sg`{R)}caKsIdrOoogMgU`pL&r3tP z$))~rK6GylS8ODG4xQ-U<}dHB_(}!%fE{xbRMx7Mi)cGC5x{8G(Q}bi2nZA2J@$I% zJbLYtD?03wH2xVpeR{+d~*L*F_T;P0dz0kE2@~n)Pb?LO$K`{d9ig#Mm z`)F5hFAuJUYl}2gg9){!Cq9c@#~D;E=$2V(YoZ2dTrHz#F44K%-lF5z>dzK9btnYC zSSz2?il~f$&Z3}-zDWQ1<W|Mk> zuhyy_P55y>ws{5OX0*2b=e6hr1_oB1eLt^cX}^6Q4h?h+2nY-a2)GFhI$FQKC8QN~ z)(bd?=Z*>ozWzScU9`3lnDqWgwO989A;1xsYM7+Mc(tc1F;9 zq`v(pjw^y(r(rN;FGyG*BM6Svw72BA!pk)tZdcp$7xv5u%0!yk|K_+N$_*TDhwOz3 zGiBUoAR+d099Oux+QXr0jx4zo!=Z|Mn!;A_`#hwCeJA at BL+<(TUxhu0usr-e7b##L z&VEIgyFUC^aZg(~0)C&5l(&CozhdfTj_m=s1C&YPSqYS(=r)q*05%de)>I{6njp3f zZ?9x5L3AWDt2#h9I=YzE86X`UWz7l&h)2h4u)YJxDN)&I#8!}Gt3k1COk#IQvLR43 z8`ankBt~k^5Fktt&4#u2W$Z9OpTtNpC%KNh_bs5BttP6Dqt_JR%2pFo$KM+aIA(K; ztYhgFjZGu@%;uI_huixZkk8_lUWe724KQPIORFR7Z3e8cxWNQ5Y;a;3NCT7>X>6!t zEl2~D7a44bV`WKilosi1m}2Rb7)v5`R6s0#%vq$;q}%`zQb!g8(pHkU0RLEz*d+jA zEQb<)2~G*M4N$-?itGav~4Q_y3eTl8oNyTPpn;iJ7F8 z%-^FWDZLH*=SYkp<`~{u{Y at kbYUViJ7X8;G3y{?p-pc(hiF7P)Age%c at _sE+3FTFK zZ~T5f(iWvvT5r03chVN+RYq^@Euusj*0b23B3t~4ZLDYUKV`NU6GK?f;(khO$t6nl zgKg336QN2c3cPFqtVSeGtm8^GtN|?ZB*%$si4CN5iCX+ueq|D3RWQMYS3esGOa+X0;oNUW0#gMOUA*fjC(%{`<6hYJ>yv1! zf(bAD`b9`4RKWNbZvDO_6RKe1i_m_25&@NVz=dtUCW(M*JHdrdKMzT*N;}@g+kRJ) zTGe)J(O+zZEkGZIhLcEXE*ei at Q;m3I6KkN*2ae3Em;cIpec{zp-E at wGZ$9|t=&$6UW^gd;WEoQ|)`&J8uRfC at u9TPFC^XHXp3mwY-zYUrrEbRR9 at i)~Ev~-8>YmUj zJ55l|kP)D=jO*f5Zjlk7x=iR2ST37!qq2q6+0VcpmwD4m3d4h zFU~;qNa-uf9K03o$R?JNr_NW-SZ-M^rS1#gW4UHIO=)DBepbg}W=QlSneI_fU}i}6 z15R(MLzo$o{3xcU)CZXvQvB$rFVs1i3lsgwriaxlnG2KsXr~X=otO)g{HUgv)c2VS zQ~VgG at 71Z9EfW1mrw7zOGFv43(M<2E8#7xZ`B6^KsV^{Fr1&vRU#m+nuO<4CPmig$ zFs~*1(M_MK2QsfE`B6`=sb9gVnAc+b1g68(Z`oucQOwiI>cnia(J0WgojQz7HVXA} zT3=n8O*RI_JMF7J!PXIpVx87h7hvm%MsZKOs at Jl0M4>pQ&D1^FI$}`#(;@2TY+;co zmT8DO6I)m`ifh_Q9Um?Sc|bqZEU(SzRC~ZaG%G*P=!86=9YV^BGQ!m!unvvO*E7N) z4;Y8qnydnG?V^{$L!+z$3GLuZydfUe+Sqns zADPQ{JGevSa84F&wNKIQc$Wq{hHztLONJoA9WnTVk|kXb!;U|ELD`Zi2xEs3UdiGa z3uXwi+tJF9Q2k91C-I;+;D9DlD^X at djCluwV@4-7)Z~=u*l6%&j6u5w5C&j(+ z&M3TAp_A;Md#4&+tJq0(FTHaN_f+U4z314;hkGh^Qr?U2tiaC|I?3<(ciQ0lZ2vKU zb8orxm~jpXe{rw4laRrr7LIwZyEB-<1PMpK*Vw7dC{hc at zBk#~&nSX~qus0Se9W*? z3&*-Q+*!!5f`nt-YwfgTtgD6N+*|D2W~@V=U)(G2z%u03o-yzBcP28ZStHW_VqJb5 zvSNuy`%8G)GPKST0sD(_2^*4U`Iq_^|FU+di{)SXU!2RLp$L|LX at 7|?yN3Ri5Gc{4 zPR9#lI)Fw5v)Faw%OZu*9bS%rvZg?GI*8I#<>6ugh&4HuwG0H}PL3}v1A;h`<7~?$ zLHx-HTV?jT*(xS at 4lY>^I at ziwL=Hh&lsZN#Cb$j`SpiuWAaWg!($`A4slr$elv!1v z>e8C{AJQYVAlK5GxF6yp(xBtgnuH&6BiJCi($~sM00-$21Sr4QE%^t{$R5b7*e&S? z<;Xl}rPwXy2gAq>NJJ+_ zhj~O1gi}Tz?E at OI0VR~tNBO)Q(FH-u=wp0%N4!CUWd)HwtRosA&a#4NAMOzsP-R&` zln=*<3CO9eAjXG(BnY%$W*+IoGNKBiE;Enz;TmxOeJnGN@?jq_1R0l^$N2D#_=6V8 zRwI4bMzlZ at WvkIXJR|O)ma^3-AI=dAP+%DnViM^?JkkNWEm?(Kz8HxC5to2dF99QE zAXo`F{StE|6Qo at NPP-%+X#h=>fMJ*DBPk$(lJ?X~ypd{9ZAp9jCH6=@$g`w9?UHDu z4Rl`84!cAfNdPgGgr;8Nj#Pq*N_bW7>38w71av!(#-7jUj zgT?8p3<-IPlsc*gxQ1$mI)(;>h7d6wEd%^HHGdro1L8TzSSf!}E5*_Dm(gPWlvetq z%P%~|-xFKOjz+$me%aRLEPkU>7%NTVk9WlVMPJug)q>F9e^yLqLB#^!-+k6!XF=71 z*gtHRP)97;yNpCy_Ve#`k5%b(+jcb5At^;^QG z^yM^Zx~8aQ759>x;+xWO#ljS6;wEB$tJx==TZrt7YlYbu9bz?E%xj(5J{@9+Ec&(j zY?%&BO&0qaI=ig{gUF&?tITHVXsgL$T^r2K=x9S^F|J?FHt0;K$>Lm_&tBnUhB<{>IgtO(63+3R_oNNbzonc&K~R3LORf{)n at Z`Jk>g|u8n3_bUYy) z7}sxR+jP#=3Sq4;t{G=TbkCJLn6A-gaderK!hqMLvk+Y-t zthTPavPI&9)DiU;tJ3he2eBiGFYBe at 2@kSI#9!n~pJN|Hjs(7Rl|IKm$Q&_!i70)J zdyqJi|MIW&IYAuYE@(=(Oww55+&7u6K$nia3}}Qqmrbgbr76;-h!gR}a1%}aMI&UL2BOWP~{<;<7|%T_fbbLVQTn95c(qjHyO+?_H~Fe7zmZ~QQ|JcTIJ zQpisf$8{H8rf4*r{9O7ixtVtP$l0~{TT(OC^0M=B at wb#_#^ncRx?=Z4aYA>t#zSYi zGWY0au4PB({4)2bX7*(xXR|W*m}b7^0OysmF at +U0cSvL5WPsWVmb-D|+GGG^1;bst zv19T^Z3TxfAsfO|OgZ(+nZeni at l7M%^6N$uXTwJRMp{#bZ*=bBrWoIn=9P{Wk5%(y z#HrmGO_`QEogYh1VF53eqnvR{7*YcO%O%bUB at F2Sn9FcyNC`t)0Ksy-^I!=BEC78u z$(ggHFf{;gxyre+q%b`IdpXzHsiZJ1fN1%b^L|MoEC6je&Y8NzA~gVaxx)EliA8z< z*765u;}VOs0K(-a=Y>8zaVB at PWm)Ij z(zS#D`DF}e;!@ez8^L8ZXIQCh{Eg%?xwCeuY}}3LvWW9Uscgaxcp2YWptK|QMtGUW zxwf<;{ziJ4&e^lHBko3gS;qOiv?Jk0ZW+g!sWdG1MrfJSxu`TOzM16Iw^3lSQ{@rw z)V0xbvQzbu=rp8}X);{p5%<)o(P}bW^^x#2uu*>US>+M`)Uz>S@>%tfIE>`M8YPZm zIZ&QTC=rN~qh~;o9YCF>+L4^ugE`3e;2Vel!+}##3T`3~LG!Q+$4OYl?wW zvVKgmDV;AL^bR!31Y$aQAAAl*%W5M#Ssz{<@RYTb!5~GEa-?Bo5B4aogX&^!RV&Ic zG1T1Df`S!!7$2%>YC+M8I!qRIJtd*AP7+4 at pms1bC84&C8K#dKo0Nd8qlamtzD>5M ztz(Cop-v}TAVpD~7!TrkqP at -}V8YZg`EDpp_(!mlBZYbz$iIX*wn4^I at 8k&6vh;> zl05K<1f at JhtSnFe1VFJ(!Ib1_pMWU4DVVZ6;}a%|d`eqMp5}=Hr9Y*uEYI*nfD)OS zP?D#6qDT2oO(@GVJ)xuUrv#L`fKOy7%_#xpF8U`t6wg$xQWxzLEy{JOR=JDu2^&Q> z<*C#~^F)O*oAOldVt67#$xNLqb^(Hds1HYA3+$)!~TI)aYWKH<-@|kdT~U`GsDB}fqe15#Aot{iG!}< zf632u59bFF#s89?sUOx4{uTdAd1gW|r}hBdfy#pMwgi1pbUR6GAe*3?ZE7ztO$ghL z7a^HS5Fg26s}2;7k1nxw21>_A+1NsX;_)$?w(o#)YE*U_sTG3R2q?ClN$Rd(_8=6^ zPBry|pb^4(5C{`OvtvcPOdSU53mWz0B-e8z-U6%bYNF~n5T-y^yPBAKenc?v*v>7o zo&_PAnkM+!&Mmbb7x5XGZ{wC;kA=tvn%TIe)e|C`fh#s{Fd+;(oKyy(fZjzKJL*&m zp at 6pmXNd%H&8^#(Z)ciRq!p)Kh-032}qdA zp at v_EQ$}q^gfLGH0)_z}ZBG*FE=99#NWZ$ShLFu|5S-dhqu3WV6w$9an)gn)y# z^aAx#y00TOO&H6C<=D zm|#sbKp+1LbIsp!;i_ znE{kw7?OAIeU7FLf7&mCy&pNFHvF((=zGaIJT~7`m(ryeebM(+kQzCeLY3CvqopW) z4Uuz##)IYZYe+Qd zJ?ZAP3$Qg3bg~`qt+5TTnHN0HS<7hdjF33?8+6J7-%WdzUr+wreFkoP(Gg6BQ$)K_xIMI-d&sB6D zSW^$(t`ml$XD71T3`6mq@^8_^vbpid$xUNn$ z7Igsw%Y?3hHL`U#{mb~So;6{0KG2{VbR*L0*tsY}#8LlO>#_d4IKzRX-mf-u^{w at e zc4BpTP`(<*8p|3fsBitA&9%*GN)yxkGZe>~A<>^?z6Y9M&5-O5oZo~(tQnI0Ddwl3 zgVqcw{`B(~P)_T at M1QjRVQ8gwVX{B%{2|oIx-iL~YJLg2Z(W$;&p3Y%rM9+6^e3Gk zfPS>LNcN|h--Q}mTO|2Y&d)&?tSwUf8RoB{64q;p{^avx&=%{pWPiH(Q)r;|T9QBY z{2KJCp2~VH#$RAQ40>xP8+pw@b)AR@>|?W<^SaK#2ee~IO;KGq;sNW}xMsaBeDDF|Si7dH?iulbb8J=f zuMWqC7~#>!7%fW?0=ywx?5po#jFKe_p}28A5n8mXAGC3*!*U}v>&>pGbfYxuo3AHy zBVXxlu4izgUg^83Z&=i{6^QE)y%Amy(^4QkKb_fT^+`K!%T_msPw9!U< zitfO>F*q at -H}11!2q8QXt6%7~qzhp<@vmR#vt$avI3cXBwDF9UWeBl5(W;Xe_)QSv zd%{=O(*GMT#P!6zu4UjiQAo%M&7zF;d143o&G=%Q^?7m!-Obrzi1m3=2ldVG#YgM? zx~oO36V?FSHjK8^wIqw4Pf4=)ZOLnK7Jc9C0_`Rc9 at Y}|W{a|m9gDto`?eE(XMMk^ zL*!4M>WRDMNFJF_V(N)|_=8>Ep|j%zEt} zIm$=TlbQO7ZaMNt-jjyYfbNF%5>JKWdy*))gVbu^&xN_UnoU!_gj9Pd?UJA;Pg94Nn&8tOmm| z9<@$d>ednAIFA-5w{`1-&o3U8PhfTOh-b`4{ga70YTJnPC#;)~i&i!fX-|YVEsN_m z5wItW8`z?}&A-$q{F~avE}MVpPdGP4ixD>e(w>NKx)%R!67fgvcqVfYQsT-vrmmp&+2(LXzBzW9xNqZmI~D6J4JD_KY(n+FV&HJW%iQGw`pu_v7XLxhR8&6WTfb0#<8=6Y;%4iXC zC#pA;mH3tM`h$mv+_af)m#s#xV6R~By$$3*Zo*7LgTQ#W=VmwBYcoUp at 1sE@rgl&S;uQ10m zCABxfX;%c}4U!X^VAvJ|iHE`F&T?=<@+;wo*#a$0~ zecTOjH^iNWyAkem+>LQJ!QB*hGu+K_x4_*JcPrejaks(U7I!<`?Qv(|?tr@^?oPNn zxFy^U+%j$_ZUuKH?kwCYZWnG1w~pJ5 zI~%uw+r(|*_Tcv7&cU6FI}f)HcVFE7aQDYO0QW%LgK!VVJp}hq+{17W$2|h~NZg}v zkH$R)_gLKHaF5450ry1QlWoR0QW-N zi*PT-y#)7C+{6^LU&4JE_Z8e%abLrI9rq2~H*w#>eH-^3+;?%`!+jt31KbaBKf?VO_Y>St zaX-Udi2FJ27r0;Ieueur?l-vK;(mwwJ?;;2yZZ68{QDSp?JgamcSd12i^$0k$9u)@@6w;ta5cpKnth&K&yBfRN&8{=() zw<+Fcc$?#Gfwv{zR(MFNc at ME8rFJN_ZW3WxP(j3f at e-S$I{vF1#9E9j_a2HeLg-iPysG!Ry7FgEtp% z9$p{bzIglL?T>c=-hp at r;T?>32;QN1hv6NLcLd&%ct_zKjdu**v3SSf9glYc-idf8 z;hl_k3f`%Br{SHBcLv^>cxU0Ajdu>-xp?Q{osV|`-i3G<;a!Y(3Eri6m*HKGcLm;+ zcvs%S;oXdP3*N1Gx8dE6cL&~`cz5C5jW-`}0p2}$_u}1$ zcR$_(cn{(|g!eGsBY2PEJ%;x<-V=CF;ys1;G~P3K&*D9Y_dMPUcrW6;g!eMuD|oNs zy at vNX-Wzyt;=P6UHr_jU at 8Z3O_debScpu_@g!eJtCwQOYeTKIX?{mB_ at V>#QO>FXS`qVe#QF@?{~aE at czX63-52dfAIdr`wxE*{$Ttz{2};5 z at rU6rfj=A{{1Nyg at kim0#vg+}7JnRm24BDz at g;m2U%^-LHGCc4z&G(Nd>h}vckw-Z zA3uw~B>qzPOXDwtzbyW8_{-z3fWIRCO86_|x8sk;pMXCRe-i#={3-aW;7`S06 at NAS z)$!NBUlV^V{I&7d!Cx1DJ^c0YH^AQze;WQq_|x$>#@_^gQ~b^FH^<)se at pzW@VCa_ z27g=p?eMq9pMk#v{*L%N;qQ#U3;wS7yW#JSzX$%F_S;_%-}GemDMX{04p#zlGm}--|y7e=hz!{674B@%O{uAO8US1Mv^S zKN$ZI{6p~%!#^DV2>c`QkHSA1{}}vZ at sGnl9{&XV6Y)>NKN`1j%8kN*JvgZK~OKaBqf z{-gMh;XjW51pbrwPvJj}{|x at K_|M@#kN*Pxi})|$zl{G1{;T+};lGam2L7A)Z{fd< z{|^4U`0wGrkN*Mwhxi}ie~kYL{-^k#;V;Dh9RCaaFY&*^{~G at r{BQBU!~Y)t2mBxL zf5QJ6{}=pU at qfer9siHeF@NI!h5tAHKluOR|3`KZ*}-Jn$POVpl}axM$c`mDj%U4iV1WLF})GTC;rl^7G$?1yA|23$!KIKd98JW9>aFrdZX#v4<5wy zU8Zfh<3`gr8a!x;wJWtsYu&+vhAh9rPJ;&xomMZF!oe!F($+m)`BGztT)rA`#4YQE zTy>{hqY}0g=FnDWr5O%hsCP{$*X!kKX+i+I>a_{AQftBv)#A3fR;$#gHG{!fyHHKW z8aboh(JC~#&$UKpuFYIGcu-re5G*#(9v^{Hu_p%QdT$JZ3CEzTQjI|7f4eY{ z)f?qV)|M-VT|#TcuoWz0SfM^Xq_Lq=svLr5p)&%*a)p=?4O&Xa3LTj%HR{2-bA>{s zSgN(!E4AKIvsEcaOBx?b^?qr0qtqMFMWV4G$p^}XgfS*0g=$ZJphB at x??Dg#|GD%aEMtT)o}^0{iYUatjvlgjgr z`m9nar;y7faAYCZDA&`~7IHzfE$Sr}N{v<}nBu^pghFSot2+#+&PsRchk(~;_1hN< zmEKA<*SpvhM-1@#xM0a0rABFhivmuwr`pQ(uQKH3YWm0Uj);-&JD+$2Ni;FU(83mTKii8$2d%Em~Qy3xQ8^mD+&)7+ad% zQ|TVS7*m=XIHXqY50lc|ATpb2P>t&-6-$l9wy&dFDR=e z%v8&z^B9*jE6x5%S4+9(0E^XnIS^I~{U at m_SI+e<@@%FnaAK=e8!$$|YRoFNx~sW< z*2u0>v6AlHxUNbe*!}^o8QT?PbmtnmLTAr_IEq+{JHYG?&Q!41 zrAGVzJzOKZE7f|dzcFwpyMyG>Qy8E-u2Bl&aA5DzjZ$~MUQFYQpnK|)0G4u%C<(@W z>p@@+OgE#NxsFmR?K-wusD#=6X{V_i}Yz;VtK{MFKR64S!HXt|5sW)Z?ssqDqWXMZr z*p}-^(|kvI?R2D9LPvT at bfgziN7$pBD)wJADxqFS$M^_DJu7L4 zN@}7KDppf at H65^;&aRqXLe;cuHSJmryLN?tYH9yks#HsrYN^Fqs2Hq#SgANZqUGM0 z*2^&s=O5DUd`v5?h_>Zs2b)rwwCXD3bB*rc?jK#Lwdab(M$)9xy=nqSR2r3L%I;}Y z7QtEq+j7lxVa at PTZB`;?E4g}G$uwHY^g#B`+w%Ejun0urd}=f+!iODK4nHrN-W3pOI zR*%UV5oybJrY`PGUEG=avorN)XX>)futz1?yENNHAnI9(&v8D at dLbARY-HGLX0Tu3 zRX09FBlEdNaBKBMjp5~bPj7_U@?ELTuGD5%I(An&t*+F1m=p8$v`0PdQBQlsARmM9 zI7A at oT2GDD(I%&eoH4BydAKzY*S1e7}xP*1#4=}OjGNxKKfG6pm2jRf>GV^9q$ z%LsJk63aosm4HerN|mDxY9v=}0#Z&Zv0N|K6VOQ3-rb#oMk4BN7E+KnVRkbfi?Gs2 zw1Pq^2F+?>pxKC*I6Nvz&Q{`>-emg2ds9yjpHrEY80t#~ zY0Ed$ZEmJZZl=p=rn{WprXgs{x6&T1RNhMEt<**ho!D#6is`(BmSg^qLRcxZ6~d1Lg<>+R5VRG-gkK1gULnk5g)~bQ zlC)Jw6Ivn3aD_CnMT{U$BN|*Jg|xnl80A6`hfQ&At-U=LGurd> za&h-CABA8CVj(RDBM|AOC1W8i z86yzxdI&~*diZspo_JS;$At5pI(7Eksl`~f at ZOUbE;w(ItWuwtTdk7F?zm;)?H4bS z)r%8z)!6v3TxU%4Ghg=n9fYvGZT9= z6Fb#JUh7I|!k?YYuUSZFGM{G3Px>_z{Z=yXxhYNNJ1^1eOZc6$V%k+t`pt=GTcI9C zNuw1^FTJ%2>8%yXIx3BX6>V8PEpZCz1y)F}t3rB##UQm5?Q1W(wvd zpf6D#TkkG4a=|07m2?`F>+WuL*IRLGXm}BZzHB5R-$>4CBRQhcg;t4aIpK$gyAhYy zA#E%4r0(xY-QSaXuP1eEPr3~~$(0s at wnA_CXKpGB>+eFC^1_d`ZN;#LDb5Q2q=if| zEnA9d*-}hPn__x~L(o>NCv`+Ijg4X&8^yGcDW;)OOyi)K#z8UN{s=UK2SqX6{t&bk z(2GR7w)t1t4xFLvRw3L3kjX+1G7K2$q;ShoF zo{vCyEk_`nL at E6STuQ$ICm^5n3f35cA%RXfZYfnyzutymc%xF86|<_9d<>%DO6e?1 z(YTcu*4Bnz6k?u%-}%UtqiP zK}8%l^+IQ*(bFhbO0{NtG5%JmvUOGM4;L##vtkug06bP ziHxO{P6*n{Vf|35`#+t3-Xg1Ab6c|~btNMnbnGYd=P#0#yJpXsnu}$h+;vSV8y(6DmD#}s z9Eld*aAYbPn{=Bvbz&tE21VI|0ps;`Ow9GpO=NK~*Dp(oxmdQ~u!VP at HejB!CWbGc zew#s|*Dp&7y?&dCY-}oqSn^g6Ca6?CR0jFnuryBLk$tlC>cij!95TOCr_L>F%||1 zJtz?)X1-pH)kYM;A6gRAg-UB)ghmE;N05ti0~)j9M&O%jY?zLEqbGsoz_-m9cGg?r zS^_w#QY+_L!3`G=G_zjLHTz=8ta@!;Z>bs&OEotum-LQ*p@{~nmFC3E5slKUYAzlr zs5a-u;&`_r)Kje_s4tO at Xx00gLCqWCo>s0ewclGQmf}&{D#bWUMl^74M9VRaqACL6 zUPqFk%#0Xef{#F0eTAT{l3pYsXsdK3<^nn*%-t#Ot`<@pTTLs(N?JU|qTrIQBndpE zZIxPLu$D$+IC(?9|5WRB?7Xx!LJ-!>gf^)b^F6wy&huK*XpNV at 9N& z-V_mt{2pHaZ(RBIac|uG#+7d#5w)WScvm@}o040lW74X*RO!uQ1}F&wl^U^5TP6J_ zQ%NhhN?N8>(r+ at Aw3LfL_(}^wTP6J_Q%O&82u6n$Q}}~_J!%dMGGR!^=7OrI85DYr zAhcsaHKHSOwL-m?@@f$!S8uj*i(n~{){`EMQeR(cz7f$(u34y8EA8Du?Np0J<6_nT z&ahl}M1$PZswA9NL`UU%qaQs}y?9N-^SMT%myc(o#|vl=1l3Zjl?(sjpcbpBu_%=+ z66g_J)MbDV)JT*{1_<=U2Ux7nVj~Rflgw at L;ReoavC#(3?SHLmz}yyJRN{-+XCw20 z%X(6m<>TEPoiEj*e;7&GwN$qeq{oyQhs20{C9sehtt5)|YQ3C>L%!b6?8_x1k+1ia zYKehdwV8y>m|V40Z_gEj&`ZKFXb)&MdrHMtCHz;1*m7TDImiKpG$QlOI2iIl`CP0t z)2)vqY*ZoqfxAB-3UQxIAs7CKMNqsi@=qZiV at x5})m_g=_gu`+M^q~08u at zQ+DbV% z5|vy$sGM@!7iXuf_Ea9*NZE^VhZPbh2G?2mFBJ*1lrqDKrp$N`M at P)QTqB)g?3NM1 zTc?yBkuc at NcX+ygg=AX_^=2vPoG_aSvr+2mKhK3m%B;8Qwd5GjikTF8YNga-yoo~i zuLte*(9g|QBk^#^Tbwm|@n-nDZ#2VFEgd%rkdYmwMsV9F%#L_`0%p3Bj;=&6cr4ZW zV)>|!YCZlxnph=v!-$T0xtw~hBOY*EaQO#0r%(#q5KG2JoB at n+F>a6eu}aKY#2D65 zh*uR zN2+naQ7six&sIx|SjkMQg=G9nZ at rPGmc&oPtMy{yv1*bEsy&55YCpbxMg?!;@E?H^ zZdYQjD;H#>-jo>!N2V({nz`^?^@qr~h&7OtNgC~uB-zrKwTLsUD|Xw6uJE6|QeM1Z zF)Zfl?O`sc6w at 3gM9jr`Vt=zelE#Yt%tgFmy~!p8)n>Ebzg?wd3c*&TnKHtOIEmu$ zzkB+-q-yo_5N9IT9^}7V${H8326AGh(m<9Hv%-_Qn5rJzE44?G#q5SZmP9kE<$@Sl zZjS}AQp_5_8P=VwwYw4odA}pO;}{>_T}i{SJGlk|POIKO$0XwiZ=)at`m;=Tk}11` z7t11(eaX5Txip7#C$(22SMEv2X(Y>T1l3c2>P?m}HcCOh3rT{Yp!^|-}}$Iq0gz) zmBV>Xg{dyA&L|puvWUD|#A%#4nJLvFp7(||XG>h9)_*>at-d_P*6>=14&geHEhY-5%%f|E3G0fbC^{w8Jl*+J*T#ttODDrA{-3u zIeSZrXko+R1fyYgDh`FtjaOWk*fLgUJoGYR0^M?J`<~ z)36R>b$wOTM&G*TYh${~T(D>!J6oulJ7FBv_I+jQc4gL&UH6=sk-Ew{fML_>Kie+c z>1xbbWk>9QWp06d9u?ij{eRG?g;nT&8ES~v72^|-4 at 8$ZHkQD4vJ=U zP`86Jb~`9w%)$@2);QOD?Bl7Kf*RU46uAP8tb1tPY(Z$63=QSx(KI)5IdSX26SodL zar+Dtx6d$f3&In(y#Pi|+#0TCa3*Tv_MRthRd?c6e!-ZvpNU%@1|uhK^vF(q at kVe7!mkN3%K)*JiUiZw3CM zypB>Yae8TC=ZPz8^s!uaS>=o zot-kuXQsd_v&0oZP8P1N-7%7hTaDL at u5`C74 at OSh&f~=GGfvzVFc=U at T@vG%Ti?v8%0Md1lb7&mbpm+a+9j7%yQ z3Q9Y{YH2ceQO{k}bLVO9!p?2`g27Ur7U;C*TFqpdIfUP9Xig at sS0%19C9cD125Y8? z>x-JvwX2Ubv7$~~Uj(BQL|07h`P0;Or_}YG)b$kYg*5}{iaCQ1R;E3pC_#);YU(gdGckiZ7_&?dPNohtQg_%qbr7K$C~Yu0FAhag2Og;d z7%(y&i35toU|lCmT_;OjM@(IBOI>G8P1hV~#(*R^nYvDtx`XUsjMh%wfu+=)WKZ2m zb}$YjQk at y6!BeNxQ>W#@$kai5>JUA37 at s<5PaUFzX<-8r0ioMdtR<(ecY~2Bx^C)D zf28iLN9wjpQg`SBjBX~ot)eNbckKZ`kD39ucrx6N(!~)c2(Y at _nxC zn}tPGd7{(syOl6PT%6U!%X}?gcqy}xjmzG?hVaVAUU)*>x4+x+60UmsCs$tk6ct-C z`BF&pqb~do#YqpdbQmT)L29zGuFrZo*Qs!ElKS^He(B3Jto*E9jxa$PP$?4d5*nuZFXZGd|t0O%z|oUeyi35VKdE(FfS{=FLZOPY5Sw)^jb6w zvC!ewf_bq|yrIQS0nh02i0?0Ucm_I0XZMR=xH8bH*Y}G_Cr68Y1CzH=QZ6XR#9V53$dr7 z%JU@^eHvF0<4+Q%c@}vQZlLPCjpbU)Gw4&V%-n~4)a}JZ&ue?qKPisOWsPU0yUWroE!_z{(7-S3 z{RVCK*!FIqa=n*(qw+L%l~u at EXb}0h&c6D7t>#JJPvkHQlBlJ?(TS89`Zi z(1}=eqNtz*>_RdnO_hd^Pm|&*pAXEm(h#sbYJQZAg<92yRm+aPSL}M zUhfNfIev1#T_i=&T}A(g+}_vZ_9uGf%nwJsV;3(~c`=Ww${)F`(PwGo zx4|r{ibcfT#q+nJ#hxcPS6(`CmY3noGr;?C*~8D^7ha at 168*ff1qMCjB{M60 z#d$cwfFHo>ZsLVZYXVPnD?2l&MP5T~MZ?7udd~|Pmr=H4Z*4@$vQ~@|?)c(&(ecRdw1=bPqqrL{o797lXT_euJ_rjB-Qa4j zTBu8|#f3MzAmGW8XX&;FF&mXlc?R*2?a;^%6GH|2Hut(dHrJ%W_~a|AEh{LOyeu`r z)&NdFYn#}uk3HL<&Bls{FvQL(jd>!$Q%Wy$EZyP%jj?ukfLk8+%{4In>xHp5bhT(Q znE4Yeh<0P1(PqAhF(@L2-!jjhA={$+CY~c!w6UkbM-k7}n!a(`D2jOs%Plb*`8FQ=Th{dK=2`8eiRtta>zl=} zUvh`*&itM{ig*2BhTSZa_n8yV)tk%x(=xmTl{CFQN6!Kz{1XB(O4 zb929ua)uS;1AS43zaqmZwA?e=I$1B(S<3URD)!e4y1D!s+Q1GO~2t%Ap%IX)$OeUtj9%oneXxyLR=huTbM+i_8Uh#QQ{9-7Wk9LZR7S8w;w*8_%NtzLsAf&*El|xG at QfCGcT)Ji+~6O at N6%WDigBs0+Jt?o9|-miW$D<^lhy z+F6Ean#{cE>S}Cr!)ZffhgW8HdzvZP zyV7&&6SYZJb}sW`3zc zY`N&QOV94y!f}_%pWdyf{<_&lio1f!CAZ(7w%MIUWnTG(!>`MdrL63;h&FIC%xmrS zH22mH+E{?`%ouj2`OLSTSc2cJaVJ>vRq-6m&w9=iiyc1{u4iJ~+t1o8LdVILB}@H? zCCM_{Y^1ojY{^|lzWz7NzG>bWhMD8uw0P)OVw)MiO|tzHk~5qHM at L~D-}=q15dO5x z%<}f{Wt^t3R=o9KzumIjh#S+wzO~5gbqI4)V`DOC_fPD{x5cYjvBUF-jNgRQsbB9| zI9oQV+F3aFCuJEdsimEqEb)FCv zJ3ck5CBS%=7RG3(xY$563fquWchQqM;8* z#*OR5ybS}^1l~&JMt+=aQEzu{%Cn1szw9{0O=XO>o}D`lmsaK5I5^ov8L%@gr?}>@ z^uuKSrXPnXJTq-;s+V^Coez6x#)CkvuLSGAOucPBUmEh@^Kw2ib53u%G9BeSwvT&x z9kI^QZQ-G+zK+f_XQpvg>4n9S7m)RIR4s4g9iHlqr{&3nmU)H+yLY`-MyK`%5!}mY zr6mb2-K%AHo#t#U;fES-iR~w?ND{W5Z at tz4Y25cZQrqtK*OgS{{?6#0ZH$-`uJ%=BrDIOyS6`KUwGA-jBvy&#|}5x?SYAG9*|u z at lE6P!iTF3Y?b(%eI;&2WV6WYfbC^_oY*-J`#duIrMxYc?k*c3*x-yKZ$NR#Os^AQ z(QHYIRllN(1HpAsw6s^uygfuM8bp3bR;d*idB?+u^)jrE`vsbZSr(4G?F(WBjvs|A zYxsbjJOZ%0lr0MmD}0xwbENTXqVhTe$aiheHP%CQl538r_WpvTx9G| zuS-~Jy%6_&W`0+Mcqj5rVun|*dDqIRry@%nVelY;hi>1m4%TU1e?GO%l6`2}US85X zT|4u^t=73W%Y7=fjkQNl>#{SBiltTWjj|f&-dZpx&njY+C;kwxrdTjt-Z5g2v#J{U z%4DO&Z4Ca1i?x8F;m?-P=`k+*_O4WM}2i0XC~q6#4^jeQ915z%_}Ysc#lIZvu1h z{hDl(MYGTYGEVy^uNJJ&s?e+T+1%g!-hYr`4#e>ajVcM_C9SwIk0(pV2Hgj2$)J3$L()udqjne&b< z$6Zidq?Nj(zNtIvo4V7xsXOzVx}(0SyR;CDEjy0(X7$1FEVKpJBJBg*sZR1 zv~TIGG&DVKXfHH0&aAsbwapq2!XYMdDm=;b6>#bDGmPLuk&_4|6LyoVoMInfn<_{V4`8GD|pQmtW&(Z-!&JgAu0;Wgo-W-e0+)sA22}!1aF3v&#@*&ARwoS?tlG3VEey at 9x6GuA`!Nl*Im*iwN(Xt-1S}ihwwRk>{gUEc)nv44GB9t-XG^^vPKsz0rY67by{mku-gdBpPXD+G zylM_Jn$UY!CBwa|tZQ5EQVffJXPTo&o9h=d6AVWRQ*5P#wk+LZVf)S|PfW5bUzFHz z(-C!xy%SlsccKw#KGOnl(%G4rEUZUEwk=$Y zYlEn&9V^(lH}$;=cJG8~QA7fFXIz*#HU~x2FX9O%941npyH4tO*p)?tyfnkFJ>p_C zPF+Od!q(@0MMb)}8>PWWy at 3}Y+loPVB;ViFf at wM3-RXeob0?tlq+gh)#aN12?w`)nA z;nNYW7IUt1z>4-eiTY)lPja^UZGvSIR+Uw_8|8EyC6lnOSZG*G+9T_?!j6p{h?q}e zF$j~s(p5DJxqIxB-bUxA8hi3id6~%)rg&bpVgA!ym~K7C6%F&IhF8M at QZ!lFyQ*>M zdeY8LV(V!w9QNz(cZwa~2U#_ka_KJBIcMNJvoT!{7xvV+blV$uXJp%}%_ZQ;L^vB- zeUenRA@{CGs=X^r?sdSb!=`S}g$j8-*&iFty}^EcHL*g)27?p>mcx5C{vG zwN>a_%j>6t4a;y){{w6}6T; z%nr`Pu*0L-$%0z8ccK=asWatXXq`IFx-L$`QpvKfe5-Eh?Fh4WcnS+%;& z;rEHOcIr05&g4Sd>fJEyT2-?G%VB24kKyP{|+sLQry=lsms2zpu0rdZS}9>48qV9L0bV9JOZnA$|%v2H$^#I}ZvfNRA{ zj1^&|EbA=JbNP+yakAd^(R8gl=Fw!EdR;qQTib%OWYHN|9n$WOqk=6a+fP=yj zECkltXsgSmUXqyR=$teoDy1Pc1hK;+f%iD{Jh+HM8k)kM|RZ(Js8Cnn3-t` z2v=E;(lxkPV>YiEH5tWACN_>dyB at N}V~VZui4BI1S)*-K*{Q%9xEkqjcbl_n!Q&Ts zrf%WdyW-3I*9cBUQ6P-bx<}6$n(_qEd>nN&5)@fIqz7S>#nl08_K8h=Fk>rdlGl#7 zoLJZ%ME$YxbZ}sexz#~jkEb>8OBet_g8}Tf8e4t1IvC?#7aQ+5vQ at V}NWx}T(PmfG z4BpK_5=|zN*CH%vT13xYYzq#YZ8Au#(%3MQm=10yF`4D&a&^p(qO1oG&rDn`9m3&Y z8+(ykCAP+FGt_WJm{s^IgW9-f@!r*b4;%0lu(Olb9`i-x at x)@u<09;g9JUXz6mH78 zD5A3N^f)gN*$80%Mt%hSsP45uSJ9 z$VD?tY}2hVUuUE}jFWy;PONjoI-S|8m4cNeo#9b8^N#D at HXKK3-M!gS^xaU=uDUP4 zW1Z^iaGbkR at r%6^&Y^qVaLmqnuCq2wa(#wIcZ{K1H^C`qn;GU at W|*DFR?Q5H(4TA# zi#V-w!-4Y5f->7->}_NVv at zlNl;?+F^ z+#$O|*XIv&3~9=SjVIIHXq2W_294fx*=I%Wa#1)v%SCA#nqQQ4j}0eTp3L%zjd*MC zipiJX1d5s`$*2 zws-M+VW`t0PwO6e+mSJUQyz at BdU+3BACbi(Ju_PJ)Va(~O%IQ(LG59AFmi^qCp>d0 z#-&#)qqwqze|U2aRk1>@kp at dvp3`L82c>1pVwbIh#^#NDPWYcV$FoYk!zOSY<(G* zo_F!sB+Oxx(iUfBSnISkhM}aiix|514U-ZRKD)Nb!BS^ofM2pOAn<0H6I>xMiLm>v zy$omhypLZp#Qn?~F>Jz5r;ZKnip1(9*}K~EIt!DeJFDTkJz-_v7#f?}i7j8Jaaq3) zBfH$TZX9-QbJ(hX^qirC`HB0%aBbPw5~q(CM)H2yY$t3oteo%#r<#bZ2ur~>bsidZ zESm*S1Gy7~b2~BGE-(#b$=(%CbedW6gOEj?qvwQXupi=>>~idc%i4hN2Ao-w6TGgX zvR3ABx at KP2j-_6!B~7nIh8v5H<2+86Nnh86E`93~w!oSgY7I&W(OJpGRek z-{=`^9vy;F#QAEjTR at xj#iECYEms*$I zP3x|4f32Z-ogI5uO?<>naidGonYal{nzLzarw{9CzIRpavim}CcgD5%xZi9Zumc}A z!gQ_f6=~k=Os%lPT2ag<{W_JhS?xQNy1lwp=IVJ?ifxo+ZUeAUSG!EMw7XV*n<-Xw zS-J6i!qiKO{RdxinhEA)^}^3a7N*#@afq at SM&ly3#yP($^Ro7bm5QOA$sNu at eC}h6 z3v^QJpR&EH_O9A5)#h{NNjp`q>$F$MZB=@n+Zk at 1YUU@Ir=T_O)Ev8b7`tlU%%VO% zGZnkG#s=OI^n=p%AT8-)<)xTen>@pTSR0$(?{mr at 8*7o(;cK&u4STz~v(64S!mLX- z1xwi7Dcm}=4r@;X=zH<&DNzm zu4MJ}c`akbxukJ2>|G?``NKM3Rh!})87sA_F~*Ip0LcPov*|U5I3b(Od{Sf5+TMxA zVGLNk%QJIJWQ;y_Zn11pA2MibSAEJrr>R9SINYIxyqMIQDsQ%eIMv2sws`e6Pm^j< zt91CS9mcO#?#}NDZo06+;I;DWACvuo)p{E|N=H$@S@?!qZ{NC{9Ln8x?HWEPQqOd> zW65UJlE!A-%yG3)r>bFQYwyH9$!TT-*vUG(J-dB`J2Y at +*ky9QG)6b~PAm(wnO%!I z6KiH4$`=mfIioHx{Ia97>xOW?um?(Y((Kc7>K3$u&eY=VcD~S=E)yI?G8KRWAp2xz z=&+u&GaK9TP4!BqGo;q7)9wJnrPussP2nIL&bY3^V;2mXIEMPy33kNQyS2W5iL6N zb6k?miozOx1?8e at Yex}VMAgo+M&}h)A+ at 53%e-)racaeqqABWPA1ZPSK&v<@9lC-o zhC_?4g+8I`xmYl!G0T;9yx_} z*Ry$!xUlHS+Vh0tO}y-?O|wH-)wV$}xS9 at Lz`Cj%HeXEY2IE{hhfy4GcIM7bVZRM< z!gK91Io0kur`&t2al#q6%CaT{{RqaOiKh&`UF5Y=f4#=qEBvYk$PnO)rnebMXXbWpIK1sQtIV>2?sb64c+x5DQV_q*-6q&Nu9s=-6zqC5 zPMa$&=nRh6p>h9)%i-P?&arKM$5m(H_GP(x+}W8j#d!@cOKdgQdqf*$#?#=YU#zeN z=`5s@&0pU_Dl at i_in=UW?)eOH9hS)%hjI>+GmbH0o5$9Y-NtE;hPjvaOqkac<}g^N zbO2FS`NV?2CJrI93Ya%NwQ5FLwG?sgt&VKuJZ1(U7L&;W_i9;h`Zs7+nVoRFX at 7RrI-WhIbCr=)DPqU0Rq76^ylziA zFQL2TQFHyZQ+?}nP4nV!PV8*`VRg}rTOvi}j at T#Ot~u%1+uNEM4|aCkFbyBu-M~;D|F$!YaKIMRPycA>}i7!8)kRf3g`yA z6q{XqSy)t%wNvHTtw&;e4IX8PvG3;i>1RB1_?h=sU7_yj(+=6^qc2%aeab;SKOS3I zuW93M6I+m~?>zR`*Tv3(Z=B{G;5n_`bZbT0w1j-)i at RUVVjZ5Zwoce}#MjPIddx*2 zJ#f?_sl=AKwe@>&lHDiCh0RkRtxvoukGdt~q+F~zl-pxH;v;Pyw|ViDkxz11eXO-( zRqZ32Z8N$STl{q_^cQ>ibX*E+uc`F8Gymdd$5YZ;9`D*8znXgDQtzX=QbSzxcJ$2( zcKxZO+U<9jOR7HppZli%z_l0anmPLm=D)wvxHk5X zXwP1)w7 at m@q~r3|n`(wy&KsGj*f8?oh~$`VTG)FX!Gho)I(fP=Iu%C~L(+$G5<*5j z#r{%pbF2)}@9jEaRF>W;Sfa?ASCQv*&Qt73!ja?gLcf|c27+|P-iFEFa;bZz_cMS$ zE5XC##L7x at 9Q7ojh(hJ`d0YyT5iUv z!~H>Z`wwd^GwT(X`g%B zL8-Qx@&cLM{qjBThn3AVbT5o)ycbG}l4;j_6IcFlTJg;%-+70A8V0XDZU46Bz3el; z8e_|G-sp$ZHW!Z^d;6NEmmINb{h_Z*Zr|>ZUwYvE`cO5e3ng-lgMaTjwk7l3LfJ?DKl*zubyXtDh^g(a5RUHC at N}UFWmPUEyWn z7OCZ*Pl|iF-x^<>dNL~9 at _51Hz3Y?@TJOHK!b8G0FYbx$KPrk^-+67%)m49T+VSO{ z_PS=jO9!(&?zdY;%6w)`UD>uT at Aod@G(*qfHy%Gmwv<>HOlqe2)UGdn9sH)(w*wZbkdfOekGthA0A0}1aBJ$4m#+bd6t-|U;?Y`|mNAo$x;=VRgM>xhqw z?lxOEl-LaH at 6|Ul5l{6<9#K@>oLZtF^YyQEq1?_shuqV*s^9E0S`d*WHR7-$ecNM0 zVXxs=yk8C;+VGBbY~NDt^;*Tg{)&;s3Qggb{atwpeu;;Ze{X19C*-oD{a=T?(fE^I zpVvo>nv{oktjk&#nygw9_3!GRt78>>n0b#M_L#J6IVd3UZ>6o?fLPv#nm5-RvsQgk z$~x)wGo2B;OKWPg$%gehd(7^s`iW)Kn%rC7uYWS4`GifJcCX3pr_WuLkF9uX*(ksJ zgMm$$VrIHo+?P=25Y6pB7il$|7f>~Ayxi-Q6F+bx?^@lecGbuYDfTCXEKBk(n+Rx` z+jJgTZWSKNpR4@%_k)TU71Q|oeAm`p{RRfsVec&*vbgIvF!FAuI#=0MkDg!LRp+_v z*Um1jsVvV=z8^O9Mid^nt at rluvBi6jTXQkzKX)=8VXu7Vo{=ffU(ukoGDXKpmv?%5 zuGQy(o$v3a)rYTgbv?#Pw+LH$sySlxeX(a-^Rcj{R>2Q#3k3GhX+2XsTH79{op^bR z_;}Cv8#>;(&hpl)a%YsH!{4OGdn8YX_7<)v)IGd at _qzCfg_XxPI3F{zKV0Hc_i(y< znb*g}ZG0JFCm#ND^?QOwr%%>G#i)kDuc6bYBb)b&dwtt?)8(mNh2x|M!yoJy zrP&H-%W0j6jbKFlcfd7I&hW$1FZZm%TFOoLGGC1KNSI3cg&@A{+`2~K_b-|Tw3MBRh}%cB`@I#ufv`xO=6 z*t)E+{`?^Ksdeg8t%l|^X;PA34GZ6G{}$)bV1Ic1D6=aT@#}{s2ylwx^y8}+? z6&kK3qsiu4i8`^aQk6e`*4prB(0 at mwRihqMcs_g-pLihopOX)i)21&aI-GhqWb)Lh z+onJBOxy=)WpUpX at 0%qoXAC;`YOj@(Qu%vAFzZ{_r_cL6}s}j z_;}=XqSJ1%szrQ<`u|;dyIpwey_at`yJqsu$-0$%TW3Zt({Ov{(FOev)Ne-guGCD) zNLqQa-8Hd>?dj>MDK9YnrTA6dp7x)6i`t{t*!VhgizxlGw?Qp?alf)#+=q6DtXTr% z&DpPf$IbZS%-7oG7bF8HL6_q zL at 2H;Y!~d&tydSR&3F6Q`$jSPx$BdfpidJAehDf|bnMS?9zHc!rg^PXp!MS)J%6RO z2{>wxr8Ccd>1giXRLOWsdu%ZDiTt+rLEk#{qZaPPpD&s@ zsw8T7zxU{EklNxg{Y}xs@(hoAGlY3*ZlIzRD5Cl>;~)1yOm7}+lNjskDtB7 zYD#|Yi@%SDeK{^2_j_w__-fOnR}YGcPrpC3-fQpC%(J3D8wF2CC?@5GuT~w-HIuTk z`TFzr-g-Ba*2Mmx`&y813eyA4E@~Ia#1Bg4}0e~efjv}Y}%0nulighL!Q2m?z?kH z>%(71-rH6 at 4;S!RnQ`d#Wbumvs}pVol}r28DvwKSA9aj7UGDV1`@73!-7IhK&bzp3 zT`lv=_kZJE3SP^;6tDRmFUkmeB4pc9bxPvxnWZUayX&9iiRH4S*QD6iK5IDn(O%@) z at VhLf^!WJLCwcpV^@BBrJ%cm8*GbLnKN7+=-BrIa?^VpZ)RXP`IlBKjWOc67_G;2! zeOxYVso&tgLGPy&Kc9AR2$sm`osd1`_*wf=o=(rIfAsl#nwXW&D#m>|+8I5$iJ?D^ zS9*LF+5Btt=YMgXrvDX&`&3<)5A!rqob)-6>REX7O^saFho5h10(+Z2?Kyki$w{;- z+~aJqSO)w3$!0!t+xMPEdt2NeIiwz1e7S0v$(W7H3eW%`c{e?!EtY?9z{U z*Hlv1G;P at voHz2{39rM8#|}Pv)tt0z&wSOUguQVeuJz|cJ_w9 at U>&5~{Fn6)u};(R zyi(nfxXlYSiJ)tLZVat$URX%R^w-j} zXKR=29kabuIMU!HJzaIE^+?XZ!9KkpuG?$ABpwYmGMzTC>HD?JF+1bOWp=|IpF;+F ztPYpI^p?4zX`s2p-8oQi!~P{Th8Hg`5qZ=wzmq?EOM9mL*9EsylU}{{y~Oj^)`(Mv zdakopY<=CCFA=Z)=+o8hQ6*EupIq0*-zeE~?C_(e!$wwuO_rAFs~R^dsy)`ZVr;LI zX0Z6;lKQ((CBKxfUU={6+bY2?YhQmmd7wO9@#!fm at 0LTPiQLE;OQ(ri|0t}nd-0ZQiN+jL?Hybt z6PAzb9=3MqnpVF37 at H9H;jP~E!YgZ at 4BGB?$iG>&a!&1=@dtbK#vj=z3HjW3>Yx`f zpdMY-^;z(ZY~E at 0;%u*}*8|%h z{g0HJUA!LTbqQZt+r+aTV-muHs{oR zz2tpjpW at RiRhzzP?yNgy at ObpzI>}UD%9XRNm9>$dtcxlKz>= zK54K|zU_J+%cbEsE1-Rq?f>>C zW*)t*pYo(#>zM}AYHV~>LFfa;!aBPJDLalH(Rx(qhGl6QYrPknz}Z1?rpis8G5rLCC{ucbMz9lLt`OiGtxLS4R0 z`=uw*W(ybgEGmjklxUyls9aGw{p#CdCR26Ppjz?K$>^{9GUTGf(%)95Jn<>263dF6 z?rj+IFiZ3P$>m|WK0YtUB0=f1{&OugPqUjD1H*!hvS-D{W+_)Q at BTO&chdgTvuCG{ zb~o{^?^d0=+HsHa567Vem4XebwSrY^&g-a|8z&Ar9dtV2lM?au#6vT+=R?U_ z=Z=lUeD&TLU;X}@MrON)grUS<-7L-Lr(7Ra8oADNXBD2bwy=!Pcz9Y|i}AoLK(GUJM+g`Icz>Vk98c81Cs z`B_XSzi&6)`%5*(yX{`+84gUg4!t`v-ENxE^Wv^U)J2tLS;rfi9=Yi9G*P>FI5~JYd2h1W`Q-3tM@@HV=_tqF z-evaXxYBGr=XsiL2XCGIsQ6qe(uLKp`QU`9YP(5}<;ge;{ldYCkDXo;Evs}Yd!+5x z=hJ57GQYM5>wkB+n+oUm9gB-JV3 at Z%wS<+e(jQ!?R=qGIKUCb}=ZM|yhcVTkDmMQt zWuECaD|ogu<5#TJ*!wWXNQc)vi;+W-76yL(Lw0*lsvYlteyIO>^C#ubPf_A_xu$B& z2Qk&}lrt>7+Z^qd_Sorr*!Mrk>l{hsNM+b$S-5W35f!9G&m^%=GtPN%mUsM)j|> z-|w4w&h|UJ^U$_T%sUdF8}C%Dp|_W3w#NSi)cND3yudSX|_$T-`6XI|vkKh~{=?#*5;)4W>mM$KG?j&yH%aI~!xv6gKoV<+(8u~8Q=^Wt5rP-hGGYq!UZL4~$r^^?5uD8x@`g3Y))r)N$ z^;jjzHPgj)1ML1#iH5>@FP6*!eWSRd&<$=?+)Q$p2Uqf$n0f7g2Lg#2%BqUv*Ex=U at xhky2-G9z+qd^mrkucFr6jx!Zi zZ|^aDG5dBt`(0GM|4`ScHeD*7l^mbA at 0G^9Es-d*#mH#otB|502h9eR3=eIM6F~_Q ziP{@_0{<;fAP3F9qYj(D1YYgY&gYmEr!JB=5|27)%ZWUpiPAGW&qv`w6 at mERW zTgzusicSpI#xPmG&zk#vdz8M<^K97}aig*goby#2CF+w4F0OY`HGH??+qvh3Q|~eg-+0FT&{@9qhe}K5NEc;rnyqeC at diD%NmGj`s7oczZPJ>e4V^8NcxRX1)C7k29&lE`q?w~Jn* z+BIxrK| zbf2_ at w1ArQnD>&jMAk27^F;6Zw+m&SEskY2HtM)t7|R=r)@~Yp5zlZsJ8`N(C35V^ z&Z&g#mWcu at -}1{!wFlkV!M^hBen+=sul0KN-;!dndl~f;RZly6>`pB>(_>{nbF7kwr50{EGrL=fgIM0}S2-5$Za&}Dv|FuS;od8jwHq17NxfIp=sX~F+;FYk*Aq8>Rc;Uw>MVZGv!rUB z^6|(HIXBk#>ctn_8QScvVdsuEJYUi}=k~4teLf_-w%BA%pK?pF)4_y#lMSajv_|~i zN2xp8rOTiC(b2f^fRezujqkcnUH5YNpqQI_ee~^`(%_$3&QZaKL^=#b6V5DCdv$kI z$gh6IXyC(ECCZcmxGbiw at jYqcqt_-GpEXwc7h+nqjtd19U2y)XFk<6vj2+}6hv!3}a= zE&sh6jjmgr;gMIk at QjZ=pOyIIN46SPAHK%6mtP)@w-~-Auu7 at nUEKbtgZCK9_lr_4 z6yARIzjym{4-du^$9DGpkMoJUvu$0$ivO(Q*UC9;I2ZY7r~1h`G9IrBYeWRYZFw5D zDCFt&^+oRgH=(5>^T2tD{r7l^ZcA0Y@`&6&A$8FCeoAg_$kZOU=uQP`ztoEsqaCHD z%iNDvp3ECRSkW6kU)?1u^kaT>hS-ka*{rYCY0kGQ7lmaS#jS3=CHA4sSmV^AJn5qN zH_d_vJMS)iOaJTG>H6mP?mo|i_7f^jx|^&kelB;Fb9$4@|5U#rJN&)Okm4SVUuIv~ z4ch0U7X|QtI?8Q%&|sMaNwqqS|EBJKC-!?B{R>QOOeFDep1NSXn z!bmi1NauaN^QiT;x;e?B=Wg!T|8%CaQym5^?NHS-E$Vy{Y<*HUiWZPNX8N^ zTfc32F)yA)|LSG#%et`W`~sDdEsb-f9B#diGkp56IWbZD;dGyqg5T^ow2S+ii}dzXHVEqlINC^>)lZ-J9^(WC0eqcKYc zdQWtQReXIuN1U%NLPh%d8MRf#5qJD--%Mzxg*r*qi+q>3;xWDJ)9P3Ca%Z3LyJ}q; zO?1%t at P1YE-^#srtY0tg4G^}-346TfXuD}st at V+bpNGm0?>HE{!zuQ)dbSrc(d*i& zpOK9nqjM~(hg|+TS0>h9=alY$dR_dp>h3_ zPA7T4tiJnnzX_T=<3PyfTr>8~rY zyLybW8E>xl?m5}dUFytBhdQgwM)`Z#||bZZT6gy{vv7Fp(>L`(3r?iDeA!z}m^&rMHW# zAGK}wbLGo!?`dz#VhIK|4n+kvj*NV26K3hFYXs_zjJ$7K)v6{MHi`R5m!Wy!g=MWKEkp>)f6}Z$CqQ?^z6)1^U;Rk%Eb at tBrUq zzV##pr3{X&Ew-GTY-n?0owFG{)a0Yj-IffTg(IM-yF4X4Q7ffuzvBaVkF6S_Q;k`>If#Y zBza?oG=%5*MFd at EM&0Rf6n#GtJIBM%p;(wP(zbz-QXI&P;mu>M35*%c6tsI+z1n*z z!?CzxQb)wDxH_TjCQDyB|1vYI?WAA-oQ!Wh+XCwcM;;VAPfk8C7RI$dnN$xenPSS}IB6zrTFY7KUHs;^2VU?pnUlW z-m6}7islZdx6PJi$k=cX_qPSf4)7cD47aqIULEJPI-k$TS=J>UC=$dvctWV0FEBE| zW`T{saB*9btjs*aIVX>tkSgC*JSuC&ryX!^L(YP(xVBDN8Gb|VlP-fMS0m>X at eDs{ zvy`ppWzNYpoDeJ*D(1f`5mX&`PJcqOTq)3g&g9`ipR4xs3b}?Kwkck<;IrqM+&-u* zOOJRbj}JP_G6lvq`sqxFmiGjy1)WgGx+?uh9!!vHu`BytS)!s^`AT3SS)j%WjR zT)&Ymo3pe_xmZQkUZ_xbIHXv6BYWk9Vz~^T|D0i^VrCG_X;56&UcfxCN%EXPS9F`& zrb21f;&Sakx1e(x6T;<8-d5hpk+!q4{tM2 at bR8a?ebtSZ!82LWma&PwdP3r=8y{oV zr1 at aBY^xAkxa(|jYtT8y1m9H|9?sn1k~Zc>w(f-E)gpd2ZMTn-^7W!Fl$Cl zRHcTa=sxc|=jw*JQ$-5G=h?Sj&$Dz7c)j{x*(Y;Wo1_J;7Imo+3l*xdG(H|Et?-2R z%%#^_-{*yv+(}iKRkL1{=Y at I4|7x^CYd2~e-xhvh(ji!*BI+3E8kHmT{eWmTuaI$* z at D1Z8>EHho_2M!Je=W7iLdjjJM#H#i>F at 2Lj^|r0zP8=ywyh)mPPV+ec1>ecj^1}E z-6{H2G{t=Cw?YktjEXeTo>xCO-Hg$yFiBuR;s4=?cz3zLGi9YY| zwF-&zruK+h%=VQGO$jnge7)k1h3t at EjnZ{*#qUwZ`U1b-DkKU`EfTHf_FWyiZ4+~A zNA4X9r6K*AZN~aCzn3c5aZPO(Rpap$3l%?a82>tK6LYg1Pr;49#ee52oVimi|AEif zFmUWGY#)D+h8_$~-t at IB1r^_}IRYmdgf=6Pl$$K4lYyh&bk>Gy!Yg>@Cy@=9IH z5!6)N5fEW=r2~4dM&6w at 06Ivfs7|0W_ zC;vLn)jj!_dG747F`u<(jh)%7{cG$t&pNusZriLAYwV0>d9Sgvm=&<5W#g<%Yy2+r z$nMR*#-qMBKa^+V-uzgefA;1F^X%Wt(&TS@>aEPrl{v9gbfd#irUF-Ghl at f$Wk-)O z*X`0q6Rw0(J!7uKQauwcW@(-=*PYVpD6YT4yrQ`N4jaG9wKZ(~I+tyoNp7>}$iON)R1iwP-FuG2$#3IRVm#*Mi?mkva6rH3(Ox%Z3PFXuii zPJu_o{f%cesIo8dytHMl<-e0Ru~0O?YbZq_V4%ZUforhCL3E?Hy8!>j{0UwD{rMAf z_yh7M6#4JuPiTk+_zd+Z1dMd38FPIvH4)u-W=KUe;LK2rLcnN8hB4Q#(rgp1zEUq^ zuKrRl6Rv?$sxVkOZo)NGDq_qvTqL10!4&yB6XNhyRiB72bZKp-#Di3?xCc0QbFZ_?_(=BvkK`4gLWEQ7; zIYs3DMO#+5TSmx6iJrM&8?R|&Ta31w6lptz?v8Av?NI8FXo at 6x+D@SluF#+g-Ldou z!&+Ffuy|q_!y=3&0*g78DlBX0Lwv-sSYgq|;)Mm@%f|wX8WuM!GFa at fFlhOLFJOdE z{DP#FR8T*JI!U8W&vmLZf`^lMI14W=Cy{@NgdL_bU_pxvzKD!5mcOy!fec0=gD)nt z6^l6*%t6Kk3uY%{hGjDrOj*VV3-XxAVlhvg#vM9`LrIsf?vMK}_F zDi`6bxZ$(y at m-2=O#E-6E&c?XfbIW0#ZOp-5AqMfQ$>6i70jv;t-R250Ap(XlaFXl z06sk!%b!4;e3m?3DZ?ukc!h~qGBDYA{C%t7K`#~wEb&;X|2WK~2wy at 8E*pFHc((}U zT2ZbQXR8%o at lSu$4|q-DA*V|8^?jAhce^%5E%qA5a^FU4(7u_b+$5~ z_D+HW_X9Y?3}bFixBvB7>4CD60yCbT_=w!Z>dV>=$NDAFA_ZOc)I)2opbPTL9Q z^dVKU^vsdUq&8l~^5+U4*ce5N9`^LGr-wZ~>}BG!ZT~FzxMo~6_povxtHHq?=)hdp>GfH#97{A zSmt6`iDe0v4OlR~GYVK1VbR1Qh-D2HNi6zUW?_-TB8p`l7L4``26bi`7F~S!1?p%J zge3|~7#2*|0AI at 1l*%XK8zdTGv7p5cKcby6mcOxVr{ypDE_L|L3~- at D7YitR8OFRE z7nt%b$_vNH at QEvE0;}=DQhNLjyEpK0TPbTEMeM?FbD4H3F|ONm(TA)~{Pdg1c;bz1 zc(x5!6}YOvl`^iBag~azZVb8(%X%!&v7E*-ibV)Z3Y-Mqh{shtuB>rofuAcIMVR<$ z8JI!~3i?G*p8_1r0?e%db1T5yX8sIb8;b}Qocl8}Snvx^@zNI?4Z~;7#)9uTx(Um2 zoP-tlG4Pdb=?^Ev5K~RZ=gMHIM~%oo3r5+Cet*8g9K0%zbR3Q;9F8d*j;R$0UWLU8 z%Tl;NO81S%f^RT`BQb at _Q#dOxLh;}l9^jZv?ZRt+{sbfO;Lp=oJjJP*62jAXG{{C5 zH_WOPO^YxlKfE$y2sj&XF_u4pA$TPcugKsP243;UAuGgWUGW#4jbAzgPu+0khHuTl z-;Y23u-W($3Ha|os~q-Bu!phv;?Vly(E7$;`O}(-9syXcVp)$y66hh1B^zZ1P^J|h z=a2tpaB#5M__i||(Bgm at fUW=HvAGIuiX5YN{C5hF4BJP~TR+k3oV#N5lG<~kWptk{ z{Exsyt0=A%XisH}N}GQwmfl75wl&{FUY48GJ+Z-}=YP?r^UZxPIiHsid~_O*U9d>t zWi3FL9hCJone^#f1b1(wSHh@|TY at PPHK9{1$>;_lCl)WdZpNdmKbJO)R6ge`NuMFDTT%8PbD+NuEbaI zz`axwkSgv+{yew9^I7oXG{V*wmr%L%PoqDNxN#|MjLS`bF1O=y`Jc-_U-!VDOY=vZ zjQeLVe`(uyN8RT5h;!?*lq{FV|Np0N?9^yc>|2GXU%o?%)!o-Q4%}B*+5!i=iuTTx z=TyF0GU+B(T<)K_aw|K&RDHO0O~f^h13!^%AoGZPBoYm>hDbL^BoSUB${_qi-Vxai zvYJR8ku;#1llBNHdXNND(1&76e^dh>U@#5t#v at ly6)__=xDBOED2)A|9Aa z2 at y$3`8Jn`5eT|`AQAzBxpaacg@=d|2)eu_Vh)12)DpRk6hR`6An5XiNEHa?G6I5> zSwzH%GC{UDgjGzd~~UPOrapi2o6X(A(-OBoS;q~N?*fS^k)kwg&8r3VBlI4^1-=u$z% z4g_Ex|9(y1i at UYiJU_U&Wk+=y3`XX1i at Se zK#+p-!T>>+Y9fBc at BBxUceCSL9}l;(B5rcNiKMZ#{SS5*O$sP;DqHtVy0MAq3GQY$ z9(Xd`Djaf?yCt-1NW1*> zqWL9yQI1|*NG~Sv5V=o82}Fm;Dv(ejtBF{GQ0Km9L{dNuh%6;ig%m|18X#1>FO7&J zh#nCg5TvLQ at c==Wd?Gy{3?jTlRFSfrhyW2=bh$@FoJigVA}c_UvWmzy5OjG;BnCvE z$YLVtNLfKd83bMaBVq-jOJqF=QdEdIgP_X`BK07cix3f4q{tJIAkvI3$wah4Fc%dN zq$m at y20@oBBH19AixiQ5q$m;513{N`B3>Yvivb8y)QFq~L6<@z;~<#JY$DQ>GA2ue zkB9-f+$ADHpF3*W%fM6~XL|Tx7^P&xcE{}+~ zfnY9rAV|S^@d81Y0wMz-mD?+;y zw5#}%UR+KuhSG~>SBQubi6Rm&NTiEMGRO)d4?)6-EF)42B245r5eE=?BC$j&ks?MU z6GVu}FCyPSl!)YlAVr$U2nf2ch=>u%mL(EQLx{ML=1i at Sqi1Z;voJbxBy7Utn1HoJhK#(FsWEuor*hGYhcwsI< zM5HLCe?E~AB6{f3P9y>Zb4dcBl>Q||%0SR%h=@4|<`P9D0V#`!q=2By4$5=jKXTv9-gg7Z=hf-WOO z>_9M=7$OBo!FkC5L6=@4Eg+anHV9I1UIswWWtxZ~2<8$=#1|%9l2}V`MurkuL*x(gU;^=Y at 0 zc9~rC;stt9=@q at WmWT-vi_1jT5s3nsMdSvN6p-~qoIsGGOQaTro5&R+jvyLD_7bT^ ziWZSfkl93T6X^lbCgKBv6hk5-MC{Qekcc>uB6T8Lh^QfDEs-z~bh%C>21Jv{5fG&4 z5UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZnK%|#QE4o}Hq78z%m=SS9iUyH* z5Oj$qk`02nxPTxNBti3}h`n at AoAx+D@A2fnCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD z1?MFj1YHt{41i!RXF-sH^D<7vA6#SsK4I4{*8 z=n_W69t3l-B2t7DoR>WoFG}w43lSafFoD#&(Yq* zp7x(R%n;msm2+TEAWNiVL6`rML|IPI@^a38{$a)j+N0aevgMrlbgMwOv2;sM|Djt= zx=oPflmyVfb9p9Zwkni!xHhpvu2JNb?G(9)K$0j$hLiYC;td6ONEneOBHuvNh)jYYg`0=~kv-`0iijAI$191H5?O;3ej?jI z(B&hMXpl8TxB+ zq6LDvR1!Ik6agaEAn5X$NEQg@(g%VRJ|cP`=u$<*69jW2QgB}ELC~e1NFfO3G5~@UoEHWNx>OVKTmFtSsJw$6(t2r_!7{(WX&1T267d)9 z_MZq_$th|5ds2o?WP{)icG-c at VTQ2L4UW6_Jyzt!m7Js%?>OJ-wKH^kekJFS!aL3_ zx^K)NIFth5K#s}m;Z=Zf#?!h4}ugGBF-S_@`6Y`2<9S0 z#1$#>L?nnbp-VCmZ4k^w1q3O|M65y3C5uQl2<9S1q#r3tMD#$=C7p;D2&WiMp>hfoWC~#`k6(*S%SG?tDN}8}!+D(QTORuvmq7^t%^ja6)^3v@! z1&*cMTh0x-T}-z(>6V^;qFW)#4BvR2mBM7>T5%C1UToQ=%Aw`@>9tgVh6Bz at + zTna#tB12>v1YOufgo&KOT!M&5QOb|`L_&z at qDwoG2oTIA34~I9EFn?`f-XZu%t0`h zC?W|+SwtiS1YLd*sRF at VGC`1n^U?!?E|Wx5K`@svBDP4ud5IzN0$sX^q=R5CsUS$f zd8r3Mmr)|FAec)$k!Gaeykvu*OCOPb5X>bH1SvQ#;~?lVLqwX$Z_FixhyhY?ULuK{ zL6=SaQ>?Kl-6fGi|AVEZK6X^lbCgKBv6hk5-MC{Ndkcc>ue03sQ zh^QfDEs-z~bh%C>21Jv{5fG&45UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZn zK%|#Q3%Xn+q78z%m=SS9iUyH*5Oj$qk`02nxPTxNBti3}h`n at AoA zx+D at A2f_IRWD+Utst0-7YI^tUIy^j zg)SjP7$BI71rdLw;Jh$F&?SaQ5eVku27(lvmsSvTi6r6=g1OkQ9A zhLiYC;td6 at QzY^P#OxZU+aJ4>w@#IIhp=lwFV3PD7t)Kdm*~aUL=-_*5qV2wyE&10 zL at Yrr6Zu3W8AOH14-llxA))~iO5{Be2M}cU%iZBrmkT4=mM81Kj5t#%*3O5k} zB74#06%jEaPgfEtC9(!7{6w~apvy-h(I9Jxbb}y;mxwY5y1XN at 8)P++IwEOE5hCIY zf-YZ)dMnRA=n}`IFFX-}yh!zOuQc2`EQUr)tgP_Z2B3U4qOCJbQ_=xC%pi31I zPY}$dnaD4sh!8mof-WsY#y~Ka84yb8<|4vJL z2oTJr69g$dM3g|#^fgcO_?FA#KTCejarxlDr~1?NSC zh!47y5RoP_jJcE%(MJl-ivo=Q58iQp(rahv_WWv&^Zj?6IJ$M9+hDq-r(fyTlWu3zzw-Zd`%7J0%~7UEqk9y& zjv{vuh%lu{O%h3#B!X6RdT$Xa1JNSF*+IJ at w3~z7B-%BkU4DAe+?ZaJqZb#_iwPHq z+$W+0qC;dAhzXI^L at Yt5bMG@EDIf+!mJ+E#iXssW5GvlAM#K?BkBANkQdEg}fS^l0 zksc5R5ndvyNLfxqfQT)++#@1RwQULcr at 0SHpmh@1sMmqH at rAehT+BGQyHDoccqhyl9XB_cxP4CW#a zLMfvwi5P*P%M&7zAehTSB8f;*Afg0Y9Q#6O2i%n zbI}Gt3eJlg2)g7EX$8StM2Pqy1?NSE$PBuq5Mh8|E@~i1!FjOYIMIe}q3=uX` za9$W7!HS&T49!V<|D?B^DLpfGJ>w`5lPJ!pS{y6GzqZSNCPb0bsIEELdhx+qj+Ueu zJGqzW0_BO}C5b_9orZ)6aA(M490mqc|>q(|%2t zzeFfSmQ&=`yA-*aB0oTwlMp0v=p&IZA`L{?MzkwQyPepLq}>VHRlGwlE~ghm=|!{c zL_~>15sAM-q>D&0$OB@#?T1t|-Ngb}eumkuJ)APPhtfFK3)s{lclVIsRhKQNUA_^?0>NA!fgnYKNFxZk zj1ln!!CVrE^dUu at NFE5f^b;8a!CVSJkRn558U$U~M1+ZWVlF{Mq$s6tK9LY2dg#(l zBmx9;Ndlpiz9mG;K+t7~h&c%65=A5dDT|1tfS}6{B2^%mOC|_Xa9(;q&}EW{DhTEh zM#L5=I4?0o^3bK5NID4Sk_v(poR at kKbQvY$3WB-B6KO^Y&Pz53y7Uq02f<>b+=G~F7}ZKx{eY;pz1j&7~!mO{_cQ$xx$oMp=%U+`nNXmbq5 zSAm|%*HUCKMgB{XMoA=eNvx$eBTa~`A##WaM}~IYvAd0S^=Y at 0c9{Y6;stt9=^nkf zmWT-v3sWNNh(v(|61hPn1!O%DClI9Q5~&3_Pvi;_M-UAndx=ydMTn zCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD1?MFj1YHt{41i!R zXF-sH^D<7vA6#SsK4I4{*8=n_W69t3l-B2t7D zoROXZbn%~x=ak#BLn)l}^`2AzN4Z-@ z#}RBv!eVA at vBk_R3oK@4W at w9;%oPY(kuaI>>HyGiK3#7u~H9U%%pX{TVmX=CQGt>Fs^K$}H4 at WHXX`kT%R2dz()E*o!B5MJ2v|O{w8-~-)&^J^`f0%6r{~24;2c|8 z=0`m90<28^6kzZ(@}dGXj!!J|GoC#GR+fGSF!-5yaRI5vCzkmY&(HuXYd>Ka{4B%p z{s$dL%l!6dae$S*pE3-7wjpR-C%BgRW6zWTD`!7x82lVV(6~<0ELg&hH}S08{j_25 za}7b`I!Uw4KYPXoSb6)2!{Fx`M)bdZLYH~Jd58JWd_Gqkyi zatNZt-ZY{GHFZGEXXdv4#!pb=s&^M=;uCk%DC9Gcp!%<&Lr}^GqFw!+e?PLuKRQ+Z zqthj*Q`J8@#r&faFV?1xXn&0W)+QeazG7{9fj|gr6GpV(mIrH70tEb6n^Yj+!`id} zfgsi<4hTRz4G at 5MTp$4P+&}>0p@{Zhf_Mrb0P&bW0OHw!0K_8(0f=V+0uWCS1R$Ot z2tYh=(S9NjPZ$Is9w`VwJYx`mc<3Mi at svRT;<17N#B&4zhzBp)p9A7ag8;;%1p$Z$ z1ObSL2LcdJ8w4O;F9wQ+#SL?CkUAinJ9+1M1(|)4We}zI<7q7v?_=l0%KMTPV3)@X zOMuM2xf|-=8%D6n({{Gg`ubFt6^3{GsU!;tg#ZQy1_#C|rSUDul5foe8VrmX5e$qL zbl240mf6zY-qOaL8FXoDZ^vwB?!qi(@9d)LU~USu0Gc~7nc5gTJEv&qs$yCK{BRN( zv~e54Y1Ws2Xp#P?XvxiQhQ=;IPJk%1YSvGTGb3I5wS`~&R^`@|b0%N5?I3Ka zV>B*@%H4e$_x;r;Oa2h8Qh{p6FYM{2>-yE_`fBI%?S(0_hO$E`{*SVzqFL8hzCQ&%24*ony-AEX z!AJU9Qc=7!O^j#rjOVno$4DdCctH97g3sF}dvgh!ks>de6U4A+xlou)S;3N3v at kzA zgq0NF)GG8~6V^~`1D~1az}{gOa~d0h2!7g`QvE`hI(Utd|5yw)PS?IYWjR}}rk*KB6(JT3l} zf3{!`2^%Zp*n#ALtbI>uMgZ2VS at Fx%!OrBHheTd%Q2O#Mgn?SZQbJILDa=p0J3fSZ zmsNlgYuN!;dQJ-(+p7ahYwm8uUYuy2gg)4*6xBl&^H2_WKb2P)u7)F2z z4kFsb>Oc%@uGVxqE-U$QcvDXEq&FF67QMpJl*=Tef?^h8H!G35qoSk`j7wKAIl`mu z2n#W5R-!7a^t;y4ixfHRZ9pvQZ9-(6YxXc6k^QbbbSIbUa2;!w^f_i7po)Q6I0L>c zw}FS%G8wGxZ_aOaD)8)>fV|rq4Uq*7VVXq#RtI7n82Si@#~damBJRQWlQNZbW{^} zjFQpqyv7Z%e{4wpXfQ39IAcGPW_*c|nUgx4S|h- at 9M z at K`OP+aF7rd)i%)I?MK(#3+qF;Xdci3fVQu+A3YIzjpW}b#8U)lg+Iz|IEEZurD9w z*1G`egW at -DDcm7jCQBfWoYFqNxt-GY#2foU%vJ{oya!|allYRwXp%#1v9}vO8uY|~ zFIQzua_vkm3z~=$bA#RZ>xBKv6zP?MU6VVk-^JGEV{hcB4lrxY at ekyNb4w2KGwDe$ zDBnD2gV(Vy2(B#bbZXruw06tt31xrgO?MJrqp$g1`O4VjJ!_dZZA*-4-q4khGenCq zG7dp5Qu|m_5IW`zRpd(*`J^H!>S>Bbjjf9t(u)KpzjM9J`787qIy}i<`Kyx#B-47& zLnubtLH9IymDEP39fT)}CwsQL6I%e-j+7O6={OXK$=}03u-_dsc*k at XX z?*9q96JU at CKS_5NgMLa4@m{}ZxL(}Vq`*r^vl6f5#2<$ku=(YNXJIKDR6GE`6 zL9I2=kNW>;-#~k22V+xfV at q>Jpq+*NznQnZyeta1Fq-crw^l=w3s`0|Hafkq)Wt-x zTxKp)#u<98#U2<6C4NM?cz2pto)^EpJD4a3nHc(SgsB)T?MZf1?E>Gzzf$l|(HpX# z-z-&5s}WD+$90pka*i6D_s0kv+Xsw39`!ihW4*-jN-lUOM(~)2+6UIhT*tlXs!3>F zOr>4P61A2CN=Z$`K0np1x^`h`I05 zJzF)NbS_ykoRDXYc$K4nQoK)L8yUI`@2UsCMmA&Z%`d2V2m7cF9~IBVXI7X}B%LPNkU^Lf{ zA-JkVW%GH>2ggoTCY-j>@K)JuB?OJB at rob(q^XGC1@&{OdPSR79X{_>D#-Igo;N)y zzx~eA;7?FK^Y7CfAj6L{(Ih{W~+!PjOK@piu#)GBnS$r?F~`T^#j?D(jI)-e2#xiLLG&3->QJ^B9k`SR-zjO9eB z{SJ6cZOr at 8GfMmX_#tG5^l;NT3doIbbKl1LFb0*{=!4`Ej0-M2>7`RSIce8e|oB-fssf?^;{_!9~~1x-{Oa_s2xhhiZPMV?daxN} zVXrCi+q at o{o!bX(N4Quu>oRI0_%~B;a89-EH~UJSHsO_eTlSXsyBrXVJ9dAo98QIE z at 9qdNM5<&Ytr)Rt`o-apeaPyOS zH#~0Ho+K^2U{=y4)Whw*y|!SCND at l8RIPa1f7252v&eD32Tts-q+d#_Fb&N`{>}SA zDd{e|VdYNWoQ9=rL8YL3d9>@jF7}NoP=~184wTh0dmr3 zk6r5n5eCJI`^V2Flmz5HR*5R?F{=6WAGu7Gl-fX4*`@`{h&Sr`I>4I)f}v1=qRZ_G zIWZEhRnD+n+C&snTGOLT_^LNj8X^g+3*5n%K!Vx4lGuCrL@;T-v?lN5eL?8&68%)8 z7U>F1`zpb*?gOR77?%_J>uzao{QluXz-dr+^R&xPux8k=_u!A6acV=n!a}@-F~w4N zg8R=Bw}Zj*dH at +5FVufu;%xsean%jGg>PsASy`B-R#u46G6l(Cv5-799z~TnOkFfuAwwQ^w^#6GIfb3%;=2H4) zOTcNfu{uDMHA#f%&e+7TX+78R{(-nxgFFGE!p at Emozx z12MV}Z~5~2yXt6sDXM~_D3CGI_c5fYS8S_|uq~7-R<%z%ai-V%>=yt`C{L^mVqNg=Pw=Em9%#PgO z5AvTyRJY0{3j+%VR)-1(#`@nA(Z2^q%~xlFCF~E4L`LAxh8Rfrh at 8a&s?j at 9M;V$S zQZ!0OYlnTDPT&#$%H8_5*t&X&`u=Qa%Qp{bD_VIOk-?(bQua$!>9SNSe#iwk7zFl^ zJra|boULYt2{z0Fyd3YV?i0Tg-|Ls3b#}gR`6T`-b72`Y5wx4M*znn at KnW=>Bw2Al zi=2~)AHIaaFMJ+0+E7Ocam;L%=}N198^DR!n>4AA>Regu)8!x8eE1?l_mN9P89!Ib^ z5J|Srahz%UB-sm^{H7w at 5HZDgQez#bQaXnZ|Q=hjWvUAIx~dJ_ob8X zzv9_V*-pEwSd(Pdb7^#9GdM%5*)94h<_#tqiMCj6qpaRtXCK4^hK#Q#^K(ep5n_Sz zvO{iJsb?1j;td70g9!L0q6ciX1$9L!{Psn?ttn?=_OcE~Z#C~7c!Pyf ze5SaEt7 at fM>Bd%(?b2J0N#gkCdHady#nG_XXe70B!Iqw^-^s6Mg>XDjG zJS?&du8T~^3!$2UwtvuH4t?H-tC>QI_f8 at 4C2k;*y>G%pN%@(~)CN&}BnRJDD|Y+s z*F^&#bdfu6>qGVPpS!Dse`|sXd*}~B{=K3 at y*64?J1M1$4t)L!eTld+<{aC=owqW> zn9v?Pf$tZ`Eyh=}R~~!_A06r_KB(SRVWdwfN}fWer<6HYa|V^LsykMgk&&ze+_J=F zPa=x;4b#l*YqceZ5^2|m7jPN-3Xlj*{f1%nzfzy$)!Xt#O63I_0^D`#L>n+A|RR(w|GeZ z4?}*EJaD*=b=YIfgK5)H(n0(H*YL~Kz0VLIi#6X{+h`0OYuN()E3#@TmwGu?no zdBGoHe@){$_z9MYJjosOqEPrFyR)fzWpAJeFp+Qlzc>tHZ=4KF>=&(~0(CUOU|B|Q zy+5v=cxm(V;wX;6^qA&7tfy^3~iu)5B0Y9L at z;NfdZ)MIHNzpZd3j!yUe{ z8A#ApUeXCBza1b(KAFj6oQJJl{V_~Q_ihbu$GSNANewQZ4-g)Wl?T6qRB4V zqmrXUM`fF=e&IwT0z6{^Ijobcbe8%AU->Vw36gqZ2Be!H55vx8?f|tlF?*`6CZ{E* zXzKT+kHWD|nr1_FeIr)6lCm0d3 zn~ag+MSiZ5aVu+EW at GlW*5sQSHa@|Q*aKM2fSmZf_^2&il1_K@&Xb}nJI)Y?zy~OH z&q9o3M-BWNz9*(zf)6(5cbJ^sNT#lc%dTSgef+P7jK^=bFrWIlUBSTdoPtfyasB+w ziDd5>r!-pk7$*{?E1d1B#ZiULFxJ!_5!$#UvB?#9J`ymYIkw0t`CBDC-Lsl?jR65} z>%?cv)IrzB--eZ5r4=f1@;n#I2P()ykDM1rnWK^iTm4t4vVYxd**~z+-)azebiiXV z{!&l;P!+t9?lsWa&+=X9+~7`|)wX^^#`njZ`rBDWew9;kYIW-h$F0B(!Q>vS=Mb at 7 zgy=dRHDz5NUe2($t>b^J^;}X}8Mi3i*N`&XvQ+q-}2VdGTBpO+oxgg5%v!Q!@^zN}sASSAm&aoe40il!<4T^!G9w6H{bTuga~f~WZ9 z$2-YC2i15$Z}t$VMGMN#X#TUHDsA_VNb2g~VDta4l-epxAPlgeWiNgArT>lVQHdL* ziEWP%xLfcZpd%8#SiGqA#)azlgM_ja8;S&RVj6}0r?kvWx?=R=@54gT@>iAeSucdZVdLs-Wo%+&?)-1l z5TdFJD!c#!kR=;TQAP=L`{v4XD&JQ+H^soCNS87CjrKQMkS;SXYk{r#%pa)!;4 at Z% zr$IfhMbVb2^IQc(X&KKw*OM9d`o}XndA(qpzYvKm7DVy}3KohV3A$De+dFVW!CnjFnB zTd^+-=xjkUQ#*eqw-B&1js0xu*Dx}d>Wy}3b7^0cA)_L{EJ-WX{Y7 at 4D5m>qaxL|f z=7`l=WB0eeSC#QtA6qWLsIj;ajoS5kc0=>Nw>ARQbZ$B8NdAP>IMEq`l|AkXVpRw( zMA6oYj5s($D6@^^DQ ztP474-n2}9>9GvTT`g5ER}5Cqm)66R>ysVWzn_OK1{0shaQ&_xd2^()9o zHb9>d)qnO0shB(4yE>VgJO9VxMU2XSRCYwB^G(Q%D=IQShC(t6d%hIPl+&q{B+DQ_ zY&mLPX-wB1$?pC97D#s62YaI&u1y_mL>I|e=Wa1Gnaj(!-BIPdjfL`aGQ{xkVm29?N%( zOV&Pr{eB1|15N4< z{HijKJuYwaDaeJM|70>i(Rq at 2pe;ND@%1U0T2#BsbG{%!fnJ5RDgiH-Fpyx0(?#X{hD8#6pucQw+v6}sU;*IF6_2ZG0R*q(C4^RAM(nT;Jr|7Lf zX(y|KoBGenX_b;i#d9Jbqat5>l7jjPVTwtXHvWR5I5E?)5wGX9`E6rA#;O)wL z^4sZt+H&7H%=7pEMC_xypgH|j9k|h!BqA&fagWg9sM&9+rKB`en7)mv4nZ6~3{bCcs-F9cL{cAsq(Jl2) zjisl^+`(pT at C&qZ8)jYu)26~^#e3ANd2L7k5VhN zkM!~xQIex+Bg~39yf at j@x>g{LYfV)}I$E56*!kHeos%^ZB_AATmfEvs+d~IqyzX|d zR$T4GoCJUT at bhz24qcsOHn8Wiyfc3xP%^JDZ}VGZzZDpy;L!{|rIGem;@$D-8+b0Z z)1+-+8s5ja=(=92E38&NkJUG}y0=09&|)25XM1`?L>p|EV|VA$;a8(h&Rd{s-2ZiW za3qnBr|P^Fp%L%8arakMkxq#bIAFwsu0MeqwHwWS8}SE+CZ*8jD3#Qyp-dxkBp5K5 z0ljkZP z>gzn}6+$pFw*9URLTIG0O=*1z8KkP*bQM5c{1<>>Zk4XKaNOb1As4GhZSRMdqBt=( zjp(Byr@&$9SlC0yrEUpp=)oLf*}w?bpi)ubpuCe;R++$SeorK|$M~#aRnC1gz7)6( zmy^7+=T+?>EvAeFz*2o at _hmWza_X6?+X9zuit|g0%pVEsoB8{F=2{a6%JAA`;1TxA zPMlU3Lt9j&be}hN91|M!0$)K!9H5oAxW8CwF z5XW0!(A%o>6Bc74IMGK#6kV;4bKbWXyaLvqO#WS0<%*D0r3N0|UWwU-55B?I40R+| zT&{yW00yD}O)5InA>a{mG>T*93xP-vf!8YOm#6qhGA7RSWppx>1^+}12{>T#02*g3 z!}+SHC6htg$xpr zZoFQ1l at o)IV3tmAh#Tc26LQv8V6J{odxMD-I;dIOY{YF++rudPZjJX=s)=L=^XIRF?mWvPDnTI7UvVx zkm!ATBB%WngA(E<+(j#;;fg00mh1ft*FfVY&X3Qm&`*eyx-TW%8W`C-^AUN^j>b-E zOYZ#qmxw*!W{H6eir5wZxAb2QXlJhEWDoLOXZ!z1|KlfQ2ESp2epc9;s4_P%rF?Zv zup!*kLC3;E2#`ri=>!5oX~*QGsY+&!2VidshLW(lme#U2p7QS5uSx3c!D?9_Ssxq+ zShP~OlGL%S$?>KKJZP5#PX=gm+f)cRBMbn6Bl1+53c9M#0M>^T7iaCIc2geYB9g*2 z6Iym|Qi{28IL)-C7F-FSO!o~}_nP_jM-psA&4irbS at uKG@YeluIb$7u_MVRcK^Y=1 zr?vi>IMa1ZgF+J(9 at D`jj-Gav(-3F5PYh24Gh+ne+XSXF5GnYU!s`rQJsi3Xgc*E zz`*GLvnf?@wXyl%7bs(tCS)Lm(W<9aF*yYf5TW{wCi{N{QH!$#)}xV?dyD}ws2$DR zCAfaxcJjj$zkvzKTx3A`5bLF1W&W=Hz3u7k?+NYjBL<^Ui_xSe+*M>x3uvwgxAwA) zOzLi7M_DkhqSLa_MxSIo7n81SlaU*4Csw%WD{_31gOA~+D}V_LX$q5o1Q?cp9f!K) zh-6ZEjbEqFl0qjzzl)1#RM0}*;`n_B5C6-n49|;d0eDAOx^n`MmZ#Cr;5Zv|K02;> zYufC^B^O at pl519PK>8zvj9uqe+1xNdSLE59BeaZ}hb*kBMP`j*xFss z$D|O9GG#J7Ltn(!0QY?O(OB*oHQe at h%4B;59?^!2xPFvo!eh*v!PItho~9Gf!Gn4GlDb6+^aRaDU-_Bb_9!m;_ZM z4qIS8Fao|t7gp*Eno(&C8pI+X0snUpwSRz@~Y}O=aD7%?oXzZ zg0pdWb{y*W^)2?9uZ%SkzYBniE(>X1gY&jig at OCMjxoZOHY)_k;N at 3MPXMwF*U<8I zNjmHJ<$0vg#qN_zH?#9n;V-w{8n1tU$YB%X;N~cMh?^PH4aWD at sBg^2_|B<3thRW( zladb}F_9{0!;53h#Mdp35K;dgJr7cDZWLd-f;QzaD9g+$2$ zW4;VAI(;UNXQ87tVqOSi-J%Opfz|4dP#69nvx~43iaU>&h;%}E2(`&D#w&Br>3APQLw;H8FmVH^E|4GgaA-iu`-tI-qB1TjlT#oR z?SkvL$Qlkk-hC=c=PHa(zD!j7dX?RnlPcjSB-(+PCX3Y-jiljoFz%&iaZ7tU4Dkh% zNooOl%;j6<)=9HWgZ1J7If=yZ;Anp67}{`hRDbLohrcv`mFH)1Rq7 zmYuYBa1VR6!%MdTN?On|nzd`8(n2^zKETK{4DK at S^<{K#&j|~jxJiub8vyddJBFBO zaL9{wa}*Z^W4=+HI*@K67tTwyC#N?)xR^=#x5WOxBJJ|pq;U;ISBu!pC{=nVhUr0?f_-eYOO11zL3yCn9!0S7DA+^(?mp+ zs*!~vUX at O0!LGk#EPVe@)zA*SLel!=J)>U zR%Giq(wb{UvEMX{QuI%s+TT|#C?%C?mTmwxg8p2i(<&*-${Gpz;A_vRGAVz`o3`FT zQQ)#POVN{gl5y=mG;%93l&fJIhb`22N`J-${Tbpfg23D+3QRYX6f at +fMAXoR{S;0> zlJ=G7z7o3}l_!OT+PMDrb#tj}X^e40IrG!^Z!>gwrs*ClDmq+4u{JVvHc??%RPDGj z(3#eFG?h*q5QLpwL at rf~JKQ-e; zN at lw*jL>CK?f`6q7E)QxVTKA z)wP*vy(p_NWs>90Zu3tMfdz5rZq>AyB at fj$-GUp4X6hsb-tC?nK at CV-y8z=3Rr*Jd z(j`1HZ{*rD8a(|g{>FxxLEGC3%4F(}^v!70l+Fi_`{=azEM?Np2fUNh4f8gMPd{hy z2Vfa6SCS+KTBrM4q~Et%j#r`!tP18PsXdq&x2A at 0gMo(y8y1Bj`AvwzHLzb=!2~i6 zDNvd;Ib^o+8HT6Np%=WIiZDO0&FW>Smib0QxZ2UQIS)4gr2?XUqKeM*w7%kQS5V9F zUP7%E+T+m6UE2X at EeygTyBZm17)6Fs(7j7A;Jp+!|1HZsbun&lT*7W at c0vs7g z)5K8!50Ch_)bW2=N3*q`SHkjRQbK4(u=_jhqM&x_vbAW>L}8jCjY&nqLSd072YT6+hx5Rq{i@!Xiy(X8SM!8nbe5_W9Z?y^$v>T>)$x z{eqS>90L72C|>%+JwH1IJ#jJvOkat^QV+zKFD#y z>E&gaJwh0J1+4Kzcz#7`-- at CmsKaw&iesE38A6&^(zzcMY$>a+VQErKT;&OvEukH1 z4Y6+Nklc(ItGV=X at eq21K(AoIyR)6acH at Tw_Dw$r_bPH-ahyK+#)W0!DypQ(Z}fk0 z`AeWUuaw=sk|{?C;U0Vdn?Sv(PfP;yO1JFlHHgbs`)$P$d&LE-m}Z|+^tsRv!&!fX zXwzJ)JzE3c@?-jQ{PkcSDQbbXdKs_efhDcktc~_>SVn-qCdaV%AChFulC$qML9Xiu z{Fh0gE)6v85K@@>5lm7s9PeWA1vsOX_o4aSiLo5 at kV-tJ?)VyHsdRi69mN{7xZeDpLKpQR=UP1HKt0VM#xBPHwkPzzo~}sQP{nk|8tLst(}IrzP=;eDoriq+-XvbLU*fc| zN~3iX*s?@fZS1=COJ3>BrSwvkS@ zeI7PujND&Ml4G&~u-KW?TCwValC6_D1w8}^x5n7Zk>nDa2e$hL8s8iCo|${VDGVYq#+RO^Tcs$}!@VPs?eC_{OA4 zjysXG^rNO*@?#Bd)Ed{cLyWSCduTcz`?U0UOiANjgGh?1Rq4saYN0LjZ3cYlK&A6R zks{);$eI(8gbF)CCe#f%N88i2>U!xQTuIpSfKmwN%;5__ZElk+AWUzC3t5oU?8T1W z=FZmT53*bZd2vi^+|oYA@>`%TownaX%V^8F!WbQ&h3o70yCmmYEYXQ#k;Y|Ct=o!0 z=g^a{$Ujk753`p_y3VoQOD3u=>-CE;9HTSB&4=_K*b9JWuDB;Pv$`YcyE}VNjlA=rAtXL!EpIrb;7t+2%EWEPnmei}47s zT*f>vKWWbm_NqJ((3 at oqHYOr3j4_cL5ualsEjwV_UP&0iCemcBHHA39_rOwozgC at L z(!|8i^EAR)-Q9K_tU=yWOh4&lSM^2yZa||g)5BU-**TM)dA~`0*YbK*v0fs>*W>H1 z7LaYl%`C1E-OI>kxScHh!Q-s+sGKE&Stp%;zst7Rj~g!E`)$zWlWl*(>J3wVrX6R{ zZ+xmttiX+|wxeFZ#PLTsUE^ZsJwAJH}>vTj+{shK|_ZU2=B z_bt{VrLO3b^TYV`H_iGYI)yrp{_pe|l3ks|H3T811W`Y}-6*%s>p&~&a?aUtTxP;= zB_y^0>2l^^BXflcECor%m=Bp$#RC*7JmUEr0nDCYUE=n)-*I;l zIwLGS_x^-+SzxT(O*cNDjPjG at R;B)+{Q#Nk}bp6C5q3o(y(ZdG~6yE#7u?q8{zWQD$cDeo20e zQL;;Pib_6%8z1#*F6I(xmmL>SiH1X{yL?HGjZum$o=h+iS7NHwoB(yzQ^Aq)#1h^M zD-$eH-Aj`i$5hEpYy{m%s}VF08>mZ2o{@UaPG%;fd2?AVyHNYfn0SXxYnXH=4;8X= z{F2NRvO`Y0lXyo&yCbPYwOmxpE%F?YOd|b!CPd4scYg$XdVj6(Yi1ULP3jHtpIz0w zY;g1+*{CTp7}&S}wyXXh4y~n*X%ebq4fn2W6`Yj>j0Kk$b%g=aK at v#RE2l#a)GGNffP9hHI2PCbm{EIg at dGH-GWeJs|1_G>}e1Ht^Nu($q{-UhGR z$biG!rqy!xVal=FD|uoe&9`diesZF{1b&C at 1baPl`@QPg+hupS(X_?%l^SbcELJ*X z^oRGfN;z>ek+qGZ-};?G#saW*F{Xpv!fXD)CgTK`{3AO@*@`Zbc_bN<20%N~&=t^> zF{b4rz{Phk{WRHeWwZW!&tcmYVeZJy%q<1Wv?;+%Mlz!zkJ6w7%Z-9tO8Jdj|IQ|l zVE^$gFl%g;@9)e0 at Z#TDcJ}2!`%VPEv+YkOt>6dl0T zB)Lbh8fO0>a93sNK-cav`*CBej1O-?$6#N?YbkHkuqj2_G2Xv(qcO^o9}}Xd*F-dG^EjybK2Ce-CKyu51bakWHc+xfldx>WEmu at 6l(6 z)n{={(=SexD`{V#*JU#&ol*mr>uquZPE*ADL zYPt^14A|z{gXMGdHI*eUPt{g1#_Pyhs`Vv>%Fn~gxzSYZ3k|xP0~2W2Fgn0|EQ-M~!_DT8U#*OWx&b*ZDHtQ82Ee zm>U)9Apju}SkBIdQM;i_J|SZgow%(OarJMHuV(&YkFaL`Qja6xt6}#Ss8+G>(gbyqQPJ+zIJ+)CY%pYV#e&T3VP%2k4*KVL-dQEv?xi?IE~lB3>I`3)u9 z>k&u=I+DnN0)jJ?(}h$<0zGB|J;nk(CIUSc0zF&x#FCD3D+eB9g5}7gAF&rCV;{K} zB%>d+U|&~YeY{gngF1d(1hCwb++U%$M at 96OTlKc@M at dN_5;dohapPUP z<-EAb>jL92*iaGygi6QCF>>hUBpSvy7>>|uX0z#!j6w1uxCfXQHLxs1NYN{KiVl)kAjYien9`yAQ zeHP}o)8%WhawgeaCNo;jX4sLA6(EjQ0Q;1dN$d}5a#=#C_?%a at zd57$yRk=RYdE(! zf4LtIs5ZEcgV7;NBNn2W6QHTa`n%iVRs0bRnS zKeC%k{pKP&ZHqN=^u{MzjbpFJqRb|v;1kTGq-78}k7cYSIw#>0D-9Nf~axB at 2Hz1SASJfE-iL7gDe)<+P`}5_bCUN at Upr= zj*ypU2s^7jd3tlfZAhb6pK0_BPKYJshdRr!y4I7sSZelZSoyp-O-NEfCq1Mma&#hS z at iFp!V`fqKv at 0In5M4&1cmbC&euLE7!z^}xpd^*IhBf};JHp$jZj7nOJT2N43a%Fp zSdLJ3C`GvL9}WwBLMI>D;EE#qTSB5#l1Hjq5E7dnoYMa*ULZskfK()H99|9Z1d@^E zsPje4<)ZVwhO;xYR6`ApTDn{`W2-_?zXy`NOXNLJs}aF at vL{rEq at zcxsHaNp$rR_$ zG3`rX35slgEkTM1r;2SrbH!eB=nXwDc!F^{MKv!^GfvF;{Fj}J#!vovO_1s>|EsEJ z{}0u#*)4p-5;$N`&=W0ESuRzQ0izD+AmE>^#GtLgqJm0kki+UrM^?C_#6^V z_#(xB1OA4N@#Ts~L#;(E)$&R&&--}um!ZGk2ZRxHT-4}6Ee!S($7UF5TBSr!W at JYs zEFCf1VH{)K{59)jYizaY1X4Q at teuO=)h$aC;m4$_2f!B1Vd2k~Rg`gmdU*8}yIHGv z9J^erUY=0gt3Gj8O9!#1h0Z`rmoL4;5wEL7ktnwrSkU%^FR_ic2Ege~O{e8FD;6zw zM4s(+fLq^~OMz at V7Q*h&;5a_*0&GCNbkKup@^=^fDT_ahqNM~REHpVV8T&uvmMJC< z1V!ie=IDus4aA-Z)ZsHYD~pEsC)_7-x5(`#x}t1XZfj^zq|TCh!9UafIu*-6W#tUx zpaX5uVYzl(&8JJ)r5U7EDwkvJy~$jBE#oA^3d>BS!y?Ry#I5*B>kCcPNAQdVt&3D*tYSs*$I`^Ts9EFnFkz;dW{;?<9|eCiI at eLc zGPa(4o2%a7AF-%d0yFbbSzmd3?GpV$gu7JI#K8NfKA#u{goWKfj{3?WTG>O zbXD0_COqgHV}z>4uf|$s5-YsJKG~*Pry<{OjdUwAR%F1{*|{xpVjp^ zu*xC5pjj^)+HSlU%+H--;4aC7ln4x|vlr%c>+a5P^Rkrrd<`HEY zOF$uwZm4cuLQ=CoI4;emp5*oYy#HM7iVQ!sS%pZMQ(ioG`6#`{SQC+P%1T?OseOe< zu_-YkpGaGA5$Zc1%pu0GDbXOn{PcQPc7!ZdAxj5aC1I%{8as3 at HUdjbyvVJ6C&vH2z=W%p?Pvg7^#OZ(p0+8c;`x5Z;Z& z;5en`A#ys4sZs=?WW`bUq{X|!lvE^d{JsRirU5U>c#_4D5~^i0Xli%y50z9%;3>zp z2Uha)qww)(!+w4=f`}VE6{kmR%>^;W*oe?XRX2gzj*@2-A2RXAxu+Ns$+xRLF zeH+NyGm{`zzANDqkMRHHpM2-O)yHU7FZ<`hd6xI(Q}259=7t}Tr(X^b>^fu2c&qP=Gr7T# zCIQot48P=rtsdGDfy+{3S>~jQhGUoypVJ*T%6=#w|g>7YK(xX zUa~)j3Hc>#i_aZ(9?EtPG&WNBe)+dVx~)a?B8OuqGwh`$v at K>Bojm!uZ zs^IQB6H>tH{<*|63{T at NhBlhalxDpFv&|ICT%<24Su1nBt>RwZx#%p7&M?&A`%wpp z`Xb_w^;SnbX6lR)AI~K7;D)KT($$9&!o%>T+IyUfvfd)5kEhA%Mog3!$_G1j$1Rsu4M|C4SlT96(pqrN}Wf7-k{t3X|XNCdzk>eP^g3_wzY1&{_(5g>rU zpmF|CpGneGyP00mfgxd`kDjHlxkWm2IQq1t=n4lWp^4PjaMZ+cIexTQ<_x+nl65;j z%3!ZbChtsnduc_W>Zy;9j%KZA{CwV6gXw*pq343n5qNdKGWF~WgX%pLAp2YG&ic&V zo$!5v_GHHN4(VfhY=Oh~91pJE#n|{D+he?1Lw=OP`+df2ex$MK$jiz~M*a}<|4`3=j)k?|`a3GoLYTPQ*LqEl2!&T3qAZY*9bz<0qXu~GVI<+h*EupLNwGsop0`j6 z1PVL;42C}=BSPeDVMqnrCPpk7YiStF!o)z|wH8Y_7vaJCj?8rRHfR>=ET9XEev`4> z&#t)VCv9RLkSF;<(HV at F-!2HMuUh=xr+%J&3rgjY0;Y1Ls_7a zg~wZzn^)4Yv0?+q=>h}}?cH3wV9?v4ByjWe`M7rIx7X0{;=&P!7#Z!9gAcU4;=-fC zi_w%ZCAW*4QlEl_=jRjgnCdnb;XC1&sHZcp24FhvH+azGGErHN7`9>Q$D){a7Bpf> z))DCfs$yjl6pkiSU0GJVBqfq$79?SvDtSpOS+?IvMT>NEnUFQ9nU5YN%{?>7z{eIu zGCM3H1p?xsO0#jw6~+W?UP}4o at e#Dl%1-R4YzWd~6=eNy=TluKiaeYQ1|tW;;}SO% z#-h-Rx=^?)%C_`#i4nld#k at 4Co?OV5C%nA^CCa4QOp9(>F!!Id&^%`^2i96BdT(@34K9Q^hQLGLej=|UQ8GxrowQ~^be||H>Oh(&mrz9KJI|D}e z!MW3f+9_e!)Q>(Lvf&)9a$ixwQaaaOz>I-e*BiVYboc&J$u3YE>s7z+CdQ0lD3)3X zL%~flb$av3vN3~`po|LVHfsw;R?IT%JnC(u?ZZME&TUAq&S2CUB*KCe4ZHCE zh|2_Cxaule{CG&+Th{=o-CKdvnEd{#jNV>s>^-w;tmy at aDkapPrf=G>&p72Ug2Ra- z7iWS&=I$p)-jn#MxV89tbVMb~1q5GjeA at +q`^Gu9_j=cxXyWCu8Nqzaxe>~2=ZrVu z}2i=Fu4Om zVn>FaX3Lnj&NyLlbzmXO+9(x}nsXtYVq6DdF{g-3lF#6UTG&HeOEb%0q7`r$|NJ^@ z*Q3}7IdeAObr1`oVxCqr4UU#|B6C=6_sO0Jzj&Km2~;`$gDxElo6bFOFO`{ee_OAX zi$Jk8>8_+S{$V8 zvz?^!kPu1Z0DU#$7h&a*(Hy;%NR9qdL`!IS8iI}{xm5;J-MZL^qZrF=kTji1am0$FMWWX>p z%+pZepx->Dn at OMu<*8VJDy1d`mql(qm{-__@%X91=AME9B=^<5Ll=(~+#-8i*8Q!l zk_=h~PZieGMk$|$??d%Bk1ILyN^RPjyBSc2qR{i}FkSzc2iz=la_?e>O5U|>0t34$ zJfyRR-c(oThF$l8fc7kH4v?6^Z%$ob)`)L~&FURyGq|C`AVco(n^Jmh(17OfO~9&EI_ao-Vx*|7#^a%*hs009dY95Hht at 23Nt`oT zMrz5%bz=EvP?h=X%$29hNp?Wt1PL1gk{ztH at hts!Y%f)@I6x#(Es(@6J`~8f#3%u( z7|YLZ;(}K_XA+dy(4xU}+;;`7Ld$K`t{d z(Dnk2 at yv_FRXXBD<`vjBoA)+a7n!D}vs1&P_WFUB)M>crVKix**1dMgV8>SzM^AJE zG9}-P0(atclfbKXo}T3l4lP8oP zGXRu8()DI6`N*gM9;jmIzd5fD>0x;(j?#v+sk?P5PR6WY-EWba%~8hi{F;{b!8Tzu z$58>Ejqt_kvwmqqkiyr6Nnd#e*6uzaJLsl6_plyyfrC55AJjmV%I|TS9Gnrkp^sit z&wT`zOw#xBqN~OUsoDjsmmgl%C(6#)9mq7z_lBL?kKzWWp8mvB-|PRj3Pc{`Dz~rb zfDzt}y1lH0)(c*3DY1J4 at j1{~Dz4IO;Cq9KJ2b+ClqyWIa-novL12~WlLZ2kJR}Mx zdPH_Zpf*5qLJ)+ZbPJjz)!ejf(iUFxYqU0C1%n{BOun5$aD?a1OjHo(fOf8R=COiy zjZP-UXb48i;xKdOz1~3TingJQ^KT=@B&A#-ueV700M4XvvS*5XI(k1~cyv6aiyT}2 zeRQ21LUiDh^kS87bYqfa&t}qKpJ+o{Li9WN%&l at hZW=}T`&zxIr20vRJj#Txf88;c zD}X7xSV;cv^P?WI%<~#A*9$*qk41jF2xV2ODoxQ>aj5*XWHU`_0kxK!u`(I6Eu~_Q z?mMCNMLEJ)r!84?2o;)dudhtmTB+ix{fav8B$CA;Cbw|qH&%tzR!fP*PI8G(F~x;X z(x?;KY%!5;^*{|!)sjVoz7XTDkB%PzLO<*`jwm4>iM2RN#=0_xH;w9{?B`^~QRUEN zhvn9?*NS+|y;9y`B)eJ(cj^Q=9omKH6YvW(qJ^YQ|40P+q%UWbGaf^J?mCG(%^7~} zVws$uVx+U=90t7O+`}R=cJNs*H_tyoE$9vH^SY-ic%myDP*zsDA=gnFN{XjF^hGeCR zWxm&&AHmJmRTDdA-R5_Qo14uA>>Ug3)UQAy-8;3;GaomUQc~zyI%+ch+|LqKA7-SW zcpu^Xd?LQ=5Dop2spls{=O?^OE=ts)834Cr8g~WgEfkU~S}##=9PV=(Zb{uwL88*l z|Dq~+W&QlEE6u)kH0KRU>RVk_;vAWNTf8Jp?e~z3JzCqI zLYmi{&kta at zP@tnHR zY#eumvavpRyEkZzeUFS)i*8=RS=c(H)HbBnb`Z&yJF-PC*_vCSW-A=)imZD1*&t~p zMy&=Mcf;;-_vY-CzH~8LH6+}I`+A{D35Q#kO?kmlr+B*-M_k at 9JL|+T8 at wVpt`SP3 z<+EusDdgUeI;Y~su3Is0KCW{l!wj|4T9+zBg&k{H({<5VzCiKR6J@<+>assfVc%*= zH)eakT1Yn}8VjoX1PXS5zp(X*<tjbFq}GH)d0QpL at j}%y6f? zs4l)O?W%nF9n96&FXLa`G758W#L}IxephZ-yKu=CgesOn7IQK-^PzJ^utnW%@e at Vr#}nfT%;Xo8xf0Z%)G%v2 at Vb<3o2#exRob;~6#u=IVhv{WlxU{5I-! zp-eaH@~LQY#^3+&3uLOr3{Cn13R?xSc26MmvI-ax7usVr)~M zfmpwZq*~Gx3c90JH>fp=x+7sX(&nqXkDFUdF6n1Ba7F8K6b~;cKYN_!=*o)P=Vxf& zEF{NiQ&%51I)=I4T(H`B#Fw*2&25$+*X=U!y8>N(S<~hi0-p4TLZjNhyNF{azBaO& ztX^4y-Y)Ox9Q?_;k7kp$a|!om8}6DR at arK@;%~(y+Z7SFT at 2xt+my zW22y+gkExD-d~rnL*6+ at -BU7jQL95!G%mHK8&yI|YFRZ7e#5oY0-Wm#vi!Dk2&!6P ze86&g7yL6t8~fABQLwrntQUpr)nP*|?_4^2e?9pcNV^!8enQgfdQLVe;UeWS3DT-k z{AqV|L%p_vPE*w$Y|ETElN8an4Ao{$4W;`>;mAt5L$l7gxd%>NC3$>ZTm@$4)IX=j zU;1J;aqwhKP8-K<=25`55!@=z*hKxO8qXpzAp&K|=?E13DQyj#cXVb`sC&z=@>bzB z7Sbj!ij(Q0#SqD#2f9hebH4u*NxrArtZrA{2ByxbE5Sdj{4fQ at 1pLrH|H_1ZPkCK= zU&A~O`^vG3w^j3C_P^bsI9=d|kN*9l0sOy(!&=(Y|F1rb{}y>5T{$3tP`zUD$(xtY z?tsh=XQ#SJ2?5_IL5DEN5IrOl&b+^_;{gCq+6omYkDXadS6TVt#G3;sb9+&Aa1b`9 zvJg6hHiHD#e`=qFgOotpfwX5vt;|i_oI0w4rk3S%Q#6?>QN`0xn;fjg5NW&u^5F4) zrt1?E6-}+&v4HvUG5aThI#OoR$!8Tgv|=67Gs^kKLm7XwCgb-C&Ok~W*`VJMIB zPoea at XvtD>JnT`J$FF3y8z82KjZB1^}LWoT7F_F6!);Nc%Du7m-&lCPawJmckS zLx$%tDXaM6&)!xd;K9syr*rh>`|}P(fN;^m0HlU!sD?<_eK58N)}@FTo9+->BWCRz zgS52)JV$)+Az>WEI9AmkWY*ffNAQ0|W;n!|$n-BV=6{i)`+q{_pF<#R6Q<>W7*Rs( z5i!0|LXZ9)?ZNQK1*t2%B0eJBoWF)`5P7Tz|TXL-9N zd;R%(0e121XxkfiHv+MNGUDQ?#RzO)w2gT-l4?ssF0o5YV00;g#X_FDtyp^%SAVw{ zJQroaEVte=6cGkwufGh-;YsXWgp1=gSYCi8Qq?>)tFdHK7g-vZIUyIt>L8Y{2XXqA z$q9tqM5~O2?5vbd>(bA5*XYlNeg{sb5^Fce$!DqAlMuO&na#XYs>HZ at drs>~Y}rzZSfv;?t{r^C^g;x~Y^Ls#O^ z;re-nR7v~@TjYFDsKkQAM$%6O2tcXj^_g(O0uO}wWyn@)njX|;NLY(*oN9DE%JZwy z5EKr!%E80~hIPv3Y>ibRjR)W^%-jD{9&?@l-{B{;Dj0%sZ{SY0(8 zqC7mp1Mx|el=o=X1{zpS%ej>^%h<)8w~UC9W0&uS)G#d)E5`M3+E`W$`PLHa;iE7! zQS!ci#lg|!Y?;M%cJDd78DzfSN*2>cqK(&i}0moQsq8fRQNRkSr+jJ|nUC_Rc;p^*?H96$x8CCH?SsH{g*slht=m5xyKp}&c z40s2j%ERV0Z+rXSnS!V?jSLJnErr1bo4J=t!oXFgt%RrB#tAMFpE_0<-3At|rHy~eU`l|Ip+hS} zc8-dAB(@)Vh>EwF5!K6h5}tVgrP)xy7(ncs(Z&PzEvX}wgucxQ5^A)Z5 z1>bAxgKiL}BTT-Gu}H48;`PguTz?oyQ|-Fo!7q4}ZjGphwQQ&y=j99JUy0BfUL61W zmjv11|0b~LzliX^XrOBAjwOoX7urUeB`ZZ>t5vi at B^j_L)S^X8(qdq(n8`vY8+~W1 z3ASdkKE1AM^%J at Ch^+sFBdM+Lb&k$EieIw5PD(<$nHmH7eC6S-n;ZSNovN_25@=??L0O zdAjaJdhPbH=|jNvsmNWarB>}ZprJ%;coiO(Nz|t50~Fn^D=7M1Mxgp_Ww0%1-T^e| z$sLv=|Bz_EJE!T8BV_@O9kSFdxV4BiLx73* z6Z!cr+De7w~;;Xem6`&Eh3C2;pxcS#U;oH%83 at cI4d zF=tA}j)h)(+v&h5V^~fXxM?Rkwd&x7BC2}KF~N9Sm>fWBiPu8sGCB zVzbQs1ZFludJQu2_#Ib4XGB6Za0R&!h++o3V;Gov&xfQ-5`1WzzBTIdl2_~hY#D0K z at i2&x!mXe%!V;i21Qq$nt~x?hQ at J+4)s6E4u7XxU#aW4t?C?>%T}UsI*=DR*_#@W~ zrWr>Lnr$N`E`>)b*e$-9x at K-u| z{$1ADKcqv*)y(War6WXn)*f3F<$HwNntPJWHHV{EHc)#4-h6R|7M3o)xI_}$ph}uLwtV(iX4{2t_c3~9xrPS6NfD2&W9CMi6d7G{K6|kOx)6Z^ZiUQ zL)HK$;8{lxu|vMo>h}PhSL+Ui9<+AtPWnZ=-n6AG^kd7_QYyWLo) zmf=1b at f0|#*qXXwzI4tqYMJYn-recAT43eXRQApFi}+FTID+Nu1wu3$YLnzhoeTK1)Mx at MYH&GsWQ5Fjm$Fk^2H^duyspoK;w(6 zIlB;`kr4W-8Ld+=KkksG&D9L|PR$6Y)R1Aw6{GrA=@~B?Attc7Kh0m6CqrZI(B91% z+ZT$ESgV0 at Rp&JA+dE!EEja2H$eb|HUElazS!;3C5rQxo6b1uBqa5Z&aMcX+_Vt&3 zaJ3AMD5Emjqo4tw)FLQjmvg#$9T$Js83u<$wLYHO1S at uRHKOmw#@#<<_zQ*zogkr5 z-T@*cZ&)$)n646eBUHRhF67BR*pBz^D#V?UpG_=9M_xR4R!1 at p}*(wKHY-mgAXnbnj^WruwB zs{0&gN04)MVZ>nV!iaFCcOf*JnRU9e42nkX`>JrCTm*vi+$l>!z^Cu ztLSGJg#%BN>KpW5hb-%ue%e1~`yudu6IvnbYU5)0e>n3>l6K^=#Sun(z4?r7 at DU)` zAV~;IOYY#Y$SGlM-x9!pD2DIIVIQt{#xZZYNdb3;x zx_{v|%=%@vg`{z_%cM+^(rwkS?}<7}rBvf(H~$O_M6Cj64UUN4nR{(x{*i>twU%fq0 zQNU8LwQ32rHh@%?R#^9h3oWrrGzYeT>_L6-v*;}^|0mY41BW;hoxb2F+(eQxL_h8n z#dxe)inmxz77(r|>K;tq{>~>+a_8iXq`wr!0)QDSFt^XbiBBkeRHsCp&Oe$C$)XMs z*&`sqr~VA>74~jbVvJQXzew#ppRXy|nInvQZ2!8Vxr2QHij&K51N6FBy|?QTKU at qh z at DDb4&26_0utQv%w#nN~9 at N$jp-XHG64j#!hE`Pe(7947c$txfAq=7Tn~X3MVKSP~ z(^Rwte_#A!Kh+anbT&wj5RXC3y|R#>ShH*EE~54W=b*o%l^&DffZvK$U=qp3?OU=? zxbH at x)Aa at cR2m(A(M at aag5*M(MDp3DpcKD!ljIw!WzX>vuh|s&ly&2?sVFn1h`p>m zo at i{m!iKDqrBtUV?ZAz4q^iB~Q53vpuQ3^>EmivNtA)>xx5z=56Sr6N_nVB*4`^YA zuqIpJ14Y3M5}N$OO!h|^oij>}l_e0!8nRaRtW+E+ at sPg^40 zUB5uBVptcc;h$ame-#kLsi5_LWbm*26%nF;7oYxLhH~XAx&PQQ*4eJ2QV~!PP^sCX zyOI)qC&Xg_NhVPdvdVsP>V}$*xs|TNKQ^!^O0wMj<18tsWw}wym7ST}`DWdDHhc5! z{b~^%Aj?BT7_`ksquthUOAOK7CX$6_v&CU{z&G?96CQh%2?d5ZN7-+Lx1!s3gWt5= zMw&DUHq!25-xF*zcpnkzdcP=5MQF$* zC2sCf;vn*>=VbhIjmq5)3Ax9FkW^rFY&ffWT%7^n&=SfevMUaaKGo3WUd|DP*}MqD zubnWXbo?|s{7;ueLr*WpP*GAn`S8!-mK6K+pZb(8YBp_No>I7$a>Yu6r{4{sS{)KW zF!`sZTDAoO^ah>S_|yOkap6JToOJk9c6GSD8PV)EaN7>`XdX zH-~h{a%%~vl)vEql{2;N>y~Ih001x`|G%7J`cKaM*KZoIl7MJQlcj-4=$2^VB?MF< zRcllzN#O+(PO}bZuGMBX?n`b#B|c##Xj26CfnOkBb$bD^KzQdUmR1&)^(-{Z$?&+ncWSTMhNZr{I9#m|m$qEJ26L)2 zkivA}FgAZ_Lsu-phG8|`)Z$%(Cv3=!fgsaDOX8mb_rc?J^@!?FgWDdv<4jaAQ)EE6 zj?M^-5sgdf*?h+BI7QjG<`z_N1sZVToV964ApbEGLoQOae^;DDW|+yalvTql<2TwV zIh0f2)xYAM78U_vQoV;bxV-4JlaRZ0hVQ_x7_Pe~NiIpezs#$DYcEu!W{L40D1NbM zX+uG at MG&LYlLJ{}Zm+3`E>TN+_AW?M+%}o?Wstwu5P-S{=Ay%7u-h1bS7Fq($6KnX~{3dr2R}2Ha*vU90`E8edtY2StQhGuJl@$4ARu!h2 zxyuwI3(C2uLIl{HB**gNsYL>2Dtn(xm?m1ea?hBq$}cv&jQITSH=M;+?u<*Gho!ZGm=B&j{f2h!;@3VQeOAZ7TJHWYKWfe_5lR|;F1df zfZ*S<>VLPT>gX&l^PfyJ*qeDk248ZEAsK{{Mo7~TDiRPP1&H*KkhF3zz%!Yp_iM_` zX;sN?c51Y+wlCqfG{k5Hgkzv zI?ZyvY(m5PyMO2c)C(x#q(^~s^oKZ`@FBi^WGoYCy$aOg1?)LV) zHX=_wK(b5ax^v(W8i69Kb1_1ta~7hbJ6W|N)99a0*j!?mk>bW9HKq+(VwB}&uS%bW zx~@6ip5L_I)gzv at PQ1h5u65kk(iugVW~y}`FysgmXLGpG;Qmg}jXR;w%2p`yy>nh1m;IHMkK6g`2_%iWueTP9m`XP> z9kFR+#@XhuI6W;1_lhQO_MXS|MalFXokyYx-Lw{2Hu37roohC_m at _xxWH+quU|)sY zwufoc$9(0Hiaa~w+|HSn^4B(uWny zsM;^Uu at 5P-;_<1t3>2RiV?g}^>XT3cks3I_3b9g|uP!=P`2 at Q3Zed=9Wp&^DZb?$c zwsw41cNgsQSqra4jO}X}jM-w_KeG^PP(N6gs?^4eLGc7CUFGY?+J(`NsKCx%j#q~z zR8CXQyX{z|-1?FJvF1SmqB$y% zo{ELu-{B*jwSjt66%xig(^2l at F)qQfqWV%hDA)cyts~Wb$HMT=(=Dbi-iI6!DsiB?16;^s7b(~{EDh<)B-u%YB}sHmcy_ly4nOJr_>zH6U;LNo zM+Ib4PiIiZ4=%11fb?%aUcsR^A&v0!Bg5I=Yc5Ykw?)l928-}e9MuW^*pItdN|Mee zhAC6I>{gISsihBLqBv?3?IK<(jcQek$7!wZpne8pzUT3nkZNw?OOXm=i?WpKIF{H{ z1j%u1Z*RN-u}ZdVCx@*D>TP3KmLAQL zcH8b7!u at i=U61>Mksy at wBR3LTy271Go?MK(a#o0JPP$xF#o2k~S|et90>O8n*i^{9 znabK)wWG)zbu2V0o(eEW{Ts!C$&=+MvQK~pk+ECY1!OVvmd8*flR5L+c}thY>ww+Olk8uGxX z?k5z)IcYOsAuP9SoPJMJF|akww3DW7zrwtadtF0l9d$#^!HTOBwGE7 zi6^Oss#sP}q$bcBKW}a&CEE at Q!O<1oQO=~mBQ1&89}AUPiqDN$09}GfST7K(WUI8z z8c?jvgi6}b=Gc+!sa+r(7!ILc$2VFmEiNR^LilFV55p=gr;?4tQ~Oh>vg(qylHiaF zr&_dPrBIP1r^75>EL`v6^&4RmvTQiLZs~4awz}1AM33fxHCfc6U2ap6f;He5R^`3- zfZ;Rv!x`PoS@;4z+JWkZbS at k-k#K at yx~gBM0YuD>d}Io7l;N38Nu%HUSYfCyc|v(= zd>OCXk6DHt$60(Z|S~c~{w2(RG(Vr7UPy+-Q_UG+85|3DC83Zj$uZddQpdQ=7a_x~}uR5k#A zrsnw7Y0{VD-Q5NXFXBXO&W!kP2 at aGl}^m at pQW1BuigqCa(_Ao#JR;Q?hz(I ztY5+X+DzZ1h(5m4fbZ+ji%7>(Y at h>_1X4DC-;rnhjw|Yg){4p!UK5Vt-tCG-*9zuaFwb^f~pkJsF-#pagihQ at n0 ze%vwX`HXn^!t$X}|F6|Db5GGFw?n8W#onFflyg_}1*kQj1PZyM4#_K8xi=xi{S(|_ z)JeZhzqT?1W3HE*pOog9nKs<64{fM+6+Gf8O~mtXH>=UfKt!0qC;2G`P)kg)rHOqB zW!Z~mS-RZK4>lF1KkMVG#;00=?Pkq)&_^eR>3iDHgzw2JWJE{JNR~o^3r5yXm)A_S zbi`vDk3Ix7QP_OOaEQA1N?bfRNU$Vs9TUVIug@=IRANLon8;Y(?T zKltw?o8R$#;#Z?u={nB7K2Hm{rM7C^ZVR5x(y*exW!0G5hd8+I?$FjmI?Z!tZ_xdT z=rl4;HN3V2zE!i;micA)i}KBiXTiyMLo$x0PB#yaE+`_OpI|guk&6A!RO{?k+-7Ma zGqvP7l*rFPmnY8*Ne at tNh%Yh&I-cw9K>`7(xIVF-G1!{QiJINB5R$9Y&!FkCD}zpT z1W-_#W&26kO-aIKsj17;rRcFqqdtVinU_5 at xZL=47-O_+z5?VAq)u-YL5%LLQ;&)S zFwUrk=j*$SG$$+HH_YVJwa3~I!Q>o2it_5=DJY`R6K05bxuVJKp7tBDTRR!NnVt(KlvCe%ejb4&v;b$xJ~w=fNpaGB-Ki!MX!* zMiimg at _oq#%+!L4#j$U)9+JcojbZcddAUZd84nZt#l>)Lt-TTu8N1z%@G$Z%50BXr zs&-ztdUW}0r4Hax2cgK43}+)o*UaA at jot}31*BV#jIZF3OLqZhBQ)t- at A-*+SMzE`h}#() zj^M!wzA4_3IW9nmWBg)RnKIVh;Q1 at PGetNwM%Nmv046oK!8T?Lb{OlFb1IF3o&7|{ zu8-0nTP49Bm^!t at GiBt9YdWcbV~msS>%WYmgx`V$I)ubE1sj=8Xmo4urfbi>82V|} z*pMz^f;Kc6Tbg#I+9TI2cGZzzSsiNNdV+Iht_W@;t^w0cQtyp`i;2O`=4dMf^~7(w z9lGH<(l5uB8Yg9~vgo!UElj;oeGkX=%u>!Y~m-at=qop$BACDGoE_ zaFM;N0VT$Miwo at lvY(yKCV9T)@nGxtGPnZCblx(>*K`|@uAAS+9}M7)nOwm1P37=7 ztl&OtT_h5c*U^&&m}#b>B-u218_Hy;K9*{^ce*2miK6f=2kXgdsf-ruNld~y&_{=T z7=T>{@OU6Z?h;Z2gjtRh9Y)5 at cai5q=@JAzIzcJ&;MufP^AQ&A}j4G6ULZV$)X1 z41E)MR9g91um6EhH$w_}_S2QjmLbZ+tnBb at 6~y-Wbj-H7S|;zN at QLnpo|mVL;XuxT zRa+-!TFw0cpxw1cbkJtBQGU-QJ%rg1Z-%LUCaz&d-fHZ_Rk(F7>5FOchz{%5J|Kl; zy$K>m!y3Xs24maUQbEUPEjgymgbF-~V?20B5KpmnPht;aY0jFmL|P`T78ny9+iffI z`Cwoh at 5rCp2R14XQzf_+5}a5PIM$-$-NV0PHmHTwbWWBnN$Co3oRv{cid-9Y1ToD4 zU&cWA!hx?PL;Y-FGhAGNiv0^zbX=`EXU#QT?Gh+wOJQLeMG>LbsFR{W5|aA4-QXv< z);1^OYao~*9O1(P>oSjpc0>8LdFD_Ft7*Pz^Qb44Q&Ghx4CVq(?iTft%{75_)p5 at a zgMWMip42 at t1rIY7*DHL^&S5S#U8Tw52Z#rBWOtSTdiEEj2bs)ZQ$EOS=$l8aq3*;U zrtX51hg$U{2*s}x3-rWtu`FQv at UJn7hn-!~ZYl4yXUdT^HVAO`6C5Uhu;;(bzADK#>s^5^xX5~RwcRI$ zIQBj(Fa02HBQOm?sBRG}Z38;gGXJtb(Lly}&~L(MCxYgI$y<4)RYB~zs&}Op2xS12 z#f|FI0H8F5r!l;ARtQ$c2=&Bx5r^dXTDLaNpsPSf4vE4oON!r-NtelW!)v*vH_2fL zR=W60tH1F9E~ZVQRIMvCZH at e0sGc*ed0^apKu~-_s~>R=cOMu~^?wE3i3$txilC3m z1$O7gEBv5N9>Je=@SGoeIp9O)^sqe&(1s}ykFPEPi?@Z@%Kay?@k0 at c$}#C1g1mMd+7 at g%UGX#FA|^?n10m47FC00|2fcQOTZb zOR!QRKFzvK&0U(xx1P?|v<$SOys!oQj)m*tQ!6;9wBDN07+9J!ziJZlMcZ8z%lwU!uiw8)HfO)<&vhy^H>2maO6zb5 at VOR!#z+F>ohWh}S->zLe2dez$JN|W~nV at T)76B`E`x(hNcPr z>8cabfvcUe$-zyNBsVjD(c>YBE|79zm_heEfaeTpER7Dd&7}jugVJ}lDA}?EDy?li zGW`_w_vvO+gsn9cN at 28{k_i_nC||q@#4v|+OSsfAw##YdRk5O)EnkN1K|E3HCg1Iq zHZr(mj=1wfxOA>$l64>1Jf+I-Tp2%LnMAu_%Z1owT{na5bIu|1{ z%l-U9Hw|Rp2!(#e4Yg?ZMWTm-JLiRiSG at Won~e-zE`V>o)8YhyD*_NoZ at 1+R_kKu- zr{PY5;CfuSd^wB?stMXAxt3#_^Pn-e`loB(9KFK*l1dBo>~IIpWE4x at DtC07RFBB~ z(}0Ljcx at 7mKhVmNPKBNM+K(xP6>8nRFFa^x#f5wv9owd7L3w6rdVon`_wSU+t5GdR z1w9-m=DrS8s+_~Ee6OCqH{0@&&T`2698Pi-HzC#8i&3nK&TPx*@aE}Hhie2|^0nUp z93|ogjgJ^psky;SXOtRbys*^8=DQYWnh?^n{cLBT9Qt06bV+&vdS|NbnqIKa683!u z3t6{;k8E93-N5#eHv^*!-nSKxhBj9dyBs*utN|%%zRYIxXJN{xCmgXO0Az!c=|KmU zs%C at E9Dw8tRL?@Va)oth30oYGES2Mom6VsV9Ih6ulJHj}Myc(Fj;3jk{qz%M(&`FJ zIor~bzQ3P18lyOedV^uks1=IqUYHV(?7pxL2kc0D>aUv#J5vvc^2eysd9h7|MkFhnc{8j6c_-27yRG2`TyhY_n%w6N>p@}ku#W7PQ52F`4=Wm%vy-fXNPw9JqAeb}yi* zB!1z(*dM3_W{W at msi#*Ln3AF4(`^w9?B3r$HV*CVA;E_EoSlTy$rT&N6?SW|!k>zV z{tlxAB;gjTpzqxE{gHB7-kwErMId^8sRH3Cy!NvHn-Y`@vGA04J zLIq?*7HF-mLgvM0Z>^{Gykc07>?OsJR~ zrIQ$rXYgB(gagF2;e_~;Ly`HrE^u)g11lo#t;3ujW z3ERyxNl4$<++G9P%sxd6#+t+`P#KeWKF6nRy>k+vwqRNNOls;%umq44!sJ9^W{OBw z&2;^(VnavN2Sp1%?LF}pcC}Dvi3;GS9X1j_U-B+BF5ycFY^%Y;Gu2ue>= zFH)|(KHn~XeokL`0lff-B3$WEzgGW5=0WEQ(?@UWZ^>UqJs2gYM<3AK2-AnoF5f^K zJ4{SbI`Reu)1eib4J)8ePBa%x1tQ>v)KTQAJFKE2JZ_;yE%@^tCYfj6H1WAQ?5EqC z6-kq2H%6kmE>nva#--z_A8xCgib6F}rL|~PptKmD$JblWFZS#m!CFrLPQO at pwYcd~ zM?=>c;|zYvIlNM5n6~b(SAGC()a!Ug1pz9dM(Awn;+s6NN|53{|+brb%%qw)FH`tqc6*-3m`n$PC%$tMZ%6CBUc zC->#YPX^z*qc%y at NhI_KWQ~ySRGl3k(nlMUqXNmi at yJZ_Yh|c~5{Qn3%v7P8LNoRyR7bWD#3he+spe;pJEz~F&{<6lFCEKtp{EsZl zH`tmlJ1xq!Gi~(Ogv;egp9lS)$~zSv`D`E4NDu at z>2*&a?qY|A&PLn}?xXWZW5H73Hg zXv(ny;706e?FR-`RrY<=8@=P#t_jm?au`FNkklcBBM$k{{92LCrT|8d>RXWM)}}NO zDQeu3v=^=X2y at fAk8%jToVpw26(oHs1!e_Ow!0?QK*$)bW5C?K zJw at Ut4g*}f>n*Lfh|j*>S5a*v2k)zxhX4)(U8?lmR3VaX2_wa*zJB)ziW!aC&&tsHchY|H$1k(1rot#De z2{~+MW!)r+rfXp|z0L8wxqan)-Em~;{d)Y41$a5|232GuKTHbvU1FRCcMt`HH$&kD zNXzi30L!v(42o+uH8mziE=OM(r>RO8+7#f9e)XIc at Hkc{ui_6WDI&uUvN+W>u;p$7 z#bAXYi~)@V^c`Zp28@(pSa{k5N^PTdUzAR{f$XBQ+Td-ih~yQxQbj|+Ws&xwM$cJz zO4ghX%Ub3GqePOzK4#&AbuS&u at b0(oi=m1!a#)<=75B>4K^@zm^kd3 z$6x3tqFt0f7V8-gP at E`!g!Q{=;yFZluJwzB;nHTb#4jhF1jy5gUF$D4Sw-LW23;%L zgtlNJ$ey*VkR2982zOEFdnaS%7l3LKUukuNH+>Fk#U!knjyihe2(pLL=o`NOG+_p- z6j(SHU at TcO=%^wNVoi0G8*t{x-J{WzyJ0yIM;n6<9umQkYQDxq7@{ZM*F?P9sgIz( zbX634-+$Kp+2l1GLO6I779aF0-VMoGvF#H3Y{j+)M#lXuoyS4To| zwY0dYu?YlxlSMDS+fdQ#eSt>*iH%rSQBEp~<1 z7^m>E;T1R=QNgtSJ#2u53;q^H;U9PARj-Ke(l1G*;R)Y!4)%uu=oP06AeViten}yz zFQKe%<97rB41_dbiFl1tq90x$4KtvqG{E(mu$b(^n&|8{wsS0BHgRrjPXCK`rltx) z)sQzB!!r7yHSI8a8^8agh`rO at 8UD37xbelw#Sl-wbC`*mQrS1>k`OH|fBTE^FlkhW z0tCAf!A4I^1WMT!=#_Xqy)=vqWWJB>6JyW~f3}Xu_4gTtF!1aidO25&hSVIm&xG(Q z at mT;wp(*S(VCW6XdlyW#H^${hI{VqPO-v1b*F;l{=+r{`SyQa}%z}mniP~3D9(Z?9 z6~dt+(*sxE>gk;}VQy}YrpkL7hF;0$ulr^tJKMc^mUTjXS~-?qzZZpT at +*Um%+}7# z%up}~o_1x4XsgTfIoBnxY_ykBf@^lgU12*@m7VP`Pg(k^r>yCaqQ>I+hG?Buy^qg! z`sZunDk_UkG0)p%Fm2?5cZjcB%Mxr71K{0oO(myfaJyx2wPkSa$zoaJMUx70OX73s zH0;tu00pcIHqMJRdon%x at S_9Zk2r($<88 at m%~Z%G%XIk%S5Z}8kyXD_Du<$(1e%pZ z9 at xY#Rp;DVfzBgE@#k4(@t-4Vka|MLm^yzZ*Xn{wY$*V4I{*fi0TS5=0XT&c025Ze z67+N|8=iMfai(%lgg{*_vTa4aa(B_a9XT zzE1)wwSiCdc{Q?dQC_XPK0qF135e_?@^U z!ofe2hcNPMcNE=&+|mB?@^6%?w_Io-AX0&bD+ASoDgu48t;1xJXQtQ1Ud$@UK|}oj_$IlTCR#`lIj5#)x5qlp za&LX#KVG{2&FRPwX~{yh)lz3e6wAq?Zh>~A(Pp~OBX}GZ%B)eYr)GusKy(wV1*$_9 zUIdlHnAB2~FwQb4@!ixpZ~U9dIXB_ghC=wZ(;D(T&uuV9){FbvaXiy&czqm<(G&n! zX>n3m20^SLe~QNDsvzwg2Sl*wXue9$l8$2^5e4ZRU5zzTwgY}b3T83nphY*miIBb_ zk1gnJWLQCptQN+4_fGyDGQ%e4tv9_ykxG3q2lH;c|A9CrV*U0a~Jad z19d(vW=dWyjlRd<%b0@;;?FBPw)^NSGZf=?^5L$AHNJg0(^$EGe^QMp&-Da at ZL4WVQtlM=^ZI(8<34j{?gj(s>f@|LiIDe?o}izs_6!8==f)D?9^@ z>J?08am&_fcm&D(5U60YelhtkroSMf&RnnSEdQYbwUp=ox{5`*wK9mVHwUJeW^k*ZA1g*q?;5?NpxsVy_ zPQ_T(^j4{4`?#{o>!xDMUnzROm$b=qUOA)@yN;w|xfY#wPj-0VwVt`{N(x%A82tLz zk`+LhV?*;HMspOdm%@PhIrYs06=pdIBN`3Weye_ at XA@%|>Oky7fX=(_tQTOl_rNe$ z(NF!1cxrL1=sfbRNknN4Iuplw02;5p{i5^d%QP*jFGezd>+VC7)h6*{cPdbBjw#xV zZ#fOEamooVyKZHw!dmO&1_q-+Zwm_mM1I9M8M!gkgM)@)ECpEF0H@%Yt#j%bN!l+1 zJ6!oD8Mr&~B%5HQ%4sDTOhU2!9DNg9`PiMwx>_KftO#bEC{@0j>KVnnc3nE;i z&Tl}JnCHsR4T?bRC4BDqK)hmHfZ2^F;IxOi{)X7iBtsl zx{AUrPfyx^JP%u4M|=oz&|w=5XAyDWzD?Xj^sR()N(9^aunfbsGiNf;6vjPWzqK0w zD2Z8>w<(5dvGgzLuX;9t%3gEwX5BDYqlpFe;ZZTpB~U~L&&ro`_5NYFX>z-puy8+0 zuYultc&YA7-t{&mwdf=OMsL#IJ>{Qn9EeLSWy*-yD#rlbx(F(!u%Bh;x|laiqgC}- zn)yu at ZwtgK!6fg>v(|;xJ^+te#WXvew7QI5yT8!IXa`~o$0zP#6+zWVU*5r;D zPc2?de$aP9t3 at 8bV^_hPF7|N!)iXigga!`9!o(${92i20SyPb5KT1?_^^RrU z=D+DQA&o3u^BEGe z&U4<-HM#sS#-XzYs8+h8d at gVrzu>G+<7ZNV?(CDHgQM8QA-$qlge2Rq#tz1)5*yDT z6Za!jgJNQqmB-gNNENMN at XHQXc+4k%K|U#Hy at WSJi_%B*r1~D?in0NQm!99{0%T&8 zfQ#Nw_3CiDNVQ;VA$L-9QIutzsIXz=mlWI}%)$iR;2c}-&~Co~!|t#_LrV}+O(F^E z1V2xr at BiR%!=yBh?k^5y|6OkJKXUlrk=~ZJNPkJ8A}+L(Wqx(_?MeicQm67eu{5%v z1#vzLqTs=(aXOV?3Qhy(=G*#PAd@^6^ZnoJ&C%o}%$-;{IUP@@+D~~-PHSy>0k{O1 zp at CZ+$MiP)vV~FXSwlf?j>o)q`NsLy`GWP&hh8G|nXo+qzzGI58f|meQcOQhBI^aycXP)>G`fHH87iJ?wGmbS1A^nP=92s&0X= zyGaWB_Gg3Pn0br6RRhVzLwgR#<=$=(Rk_!h at A`%WuQJB;=Yt?4^(|{|3&#`h|P z#FKrh?q#L4MmPpvdJ{zhOb)xww$k}9RLJ64V*VJt5 at svXl&^V{L%cir+ zgr;%`fqpE+o4)(c)Rk4N7mmOH0ML{Co8KM(K;3^Z*ZsHf;$_qyTN6^+bQn&^pkV}v zv}F1!OdturH9j#qJwmg}#BoXVw5g~@KegnQ?v<5|jSlGM6{mQ#%7!!wHO)(nRvMS) z&x&TxWtykn*KYUp^e+GK_p8xVciS7z*R01sr(2FQnX#pRKJN+vE`)Qibgt|TX?d#m zZCJ72szN-s?ezHuPq*go-U+<`b(idP5x3S#_a$w-Fg_#gczX)=0a;HD`B`xX{0XB5 z`Q2T`pm0;*aa{~4z>c?7nYjpiujcQ{uomrve6W*caTo8HS!D)t2)SZvf9+$r3HW#^ z4kp at 6^()$NMVl7wHQI26+K$JbGI#BXBrClXgrshj4NqeBRPS>Ffl8aQ=JwVbPhtYj z6VjO|v!O(O3f#-+(&cmd0YMzGf(iJ)K>>;yE0_8?Dz}OLLSMy%IJXY}vEl9*U&T3^ z7+R^@{dM&u4E)g9eimg5I|O3V`Z4&u(_`00TjuG$i3jHntbbck-E%hLru6zengS^W zan8xYXJLHFvJ02XdItUMPL2ujOkLTax`Grzd@!D^bh<&nFV-7k zj_`X6{S5m3ApAEdOP3&4^au+LRwm4DYIWX6&V-g1(@SXE4H+UmcMZfovuc>Te;l8% zO+$vcpq_?HClJZG{1&RXNCW*Z5eq7bC}&j7;j!v=x&-GxXK5Bqiy27N>2BKdd|b@; z9*u9CIbpFBK^ULz6$6kXMm8}Eln(Kd`SV_MD50E=1IgNhzX4e{E||wuf7)FpJpCCJ z;EOAeKY}5-k5*HUhmtCky65eB`88zmlqE zAh$|rg8Ta`{XD0IeYla}>xwMiYWTY9EA#txd;^CkD)iV&Dw|OY3H$7X>-XSAT_BrI zRN@^DT&Tq#Ly-wis`tLr)CO)>4eNJ=>bM6Cc-e>T-6y1=968D}Ii$ci-`acYiK6Kx z({Xf(NLW=(MfzCU)p!C1a?i`Q at NglI;`7EV>T4Eev|QZ#56;eHo}f_Rmx0oArNei0 z3hze-?RDb at g}JPlMEoT*iIiQk-sY(k$^bWJ7$uoCbV< zVBHp!3qWq?Q1uMfF(zk}+b zrTY}>rB_;l=IdKTf;yj9=GUbv87+#zJ8E$CPx{iQNq{asie>s*3(Vb97U_ at Sg!hTa zy>3DYH+L z)%xqCVV7R1dw^Q(>siUAd8P|IwlX6bI104{HH0W;^#rT_d5-Iq%t at 3_`uHFeV(`Z!`^FHFbzTn-h6Kj+ zVa*2lbQTmy6yYe(!2s(VTY99 at K`--k172olQrSy6`G|3+2#lH;W8fK=6$Nms$|B-W zt5U1NE~T1e+U^($jFbf{>pJA;G^jLbA6TsDf#gV4vs|F7wc;mf at 7DML57UYY_FOcTU|hvZLZD{ zCG~1Cs9iZVM>BGmsu`G_`%0dql+nx~8mlK48G&P|9yk)WYC8Th7uN;Rj!8F2hIkof z at E11BD|0%H#;QD=iw&Q+8`k|BhwIBp+W}IYn`W+@*I&`T_>`?;#g?6pW%6KC3xE%e&=bU z-;Z+TH6gi=X25Mx8LonZ;J=;OCG0_sYX`8krcYJr5o_dsRFT=Q52>7f|M{g)6c2Gz zIY^pSZ8b#@Aah~UawkzvBY`nHv)?$aWi2cT9m~`fI-c4Q zJ2y-ov at 4^!0okq%YK{SP@#*5s{9CKfc~23tarPMyGVdqa8WT-uhHwFnZ#mse)E@*OlB5 zsjG`7C&_h4*KWuQu5hPK$?Bn2e7W4MRDO4jh{ClK6|FtZwCstZ_)kv=5M?`5%Vp{_U(vC~WHwP&Xu#r~I!^yB_5 zlr<5PKMr0imk=m;78DKHp3O%zG%FA5y4_p>*5g)nzLR^vMZZW1O?o$KMW&M#)*CYp? z>jUiZ`8yNJ?g6QDwz&iCLqp|=rhdx;A$c+5&OVqa0xPjT$b&$Q5Wni6Q1JN1~822g_nWX8N*%g?&Q%cCI2p6+j7P3n=^|%CV*akCqS{^8fn0*iw zS at DF-Et{pv94$h+ST2q-mtN6scV)^G52bIR-)KYFtYOv at Sdd6#fRj?>vu~}MkX*f~ z*UcT7R+!l=)5{i>QMY#Y8hYBIs;K$dT~itvl1oji$3%1H_7H>9 at VC;4BjgB2)RgUj zx;OcAi*6sKZ64$*9h7m~*C$@PlC-jIAB?#k9jO!Bv!iB&Rh)45l?yboA}kOVSypj} zo`BQhf!orlp7wN`J4ymF`Ry1XYhVmJb?@?FW?N(JYV|iSuH|jbi%9P4RD}@ zDEXV{nXc0)XC%&h$TUj}r26B%n}fVR1Dy;aP}`2!nTu$oIXOcHQz=7h={#$`cJVP+ zS&Pto&z*3xZR}DwiZ@|v$msG*l7j2G;9GG#y#ZpL!Ur!9ir+=o>P(@pR0%3ipUBAi zP%kX-vuQoM+WZI}>5Y6sBt+ZKgsaa2RjmZOAr6 at 4V?}f{g~lw>NU9o;s*%a+UB#Lj z3T)_rDQ;_yh6tCQlCH2TQBC0}n?k%=Nqn0n{FW)220h1^jUsAaO at uWKXX=9k(})B$ z;^kR}kI9W25mxsH&5adnv|^9^UJ)z0(eRj+OVN(nL+NN0AD_)Z-#ND8TT75w#$%S^JKOn6^HyBDNnn$L}F7 zZcJ*zn_`@xMM)1q52X?}4=zUK94Xz|A~L=M%aXZPjhkTZ at tN)swAs at JBe1M67 zLs425SssPER?56QP|Xgd3JP^eVd*2BFiZo4`hZMCSVa)y(u{MlNzw3NAo)*UGS(kI z8YvWHX{Xy*g;{SL4JPe1(%0_4Rmf(2()0Ryf5Yv8)R4`^j-TD$tp*a$M6i>YQ20Nl zp)nGj1f;3c|1xYt89fG(Iyy{4UQI?nF;tTaL;DW-^}9?Mw9sHRhumqlEeC6g0>&gI zXJhs{>+%#zrx}q7oO!fHDt6cOEUWkC_Y-w{j$@;|x}(MGRWk$kx1`TJ&2Fn at O_pFO zBA5Lo)OvA&?s&3Suab+ymWr2b-KmiOWpazdZy_z&{)^vy1Ue1@?Im|LQ*C0W!yP;* zX?)Y=tP=?+ at Zs;jgiA5odPG6%r!0Ep;?SE#B9^&w-(v9=Q*ahAo=t6%B~9e%lHC|U z#al)9CT)gE%#zMz64O}2jeF%OIiPEf*w+Y>4HNtYE^4-vvI1VWsynMDjAtK#IhUAM z@)=w>@l#!aJU51Du2}T-OTz)_KkIlyDoGdE at K55xA+h8A3`uMJ#o?MNTq~79Th72X zxdiUwJqk6RE&Us5=BC!HcG>*H583kL-gk4zVXPPGG5r-kFKzM!iBLU^4^mi_&oX!n zRtMWDH+9HI5f%A23Elad?C} zvsd+s3($|j?Lj=t4z94cct9Z-oyCQ*zryRX)O$uX7W`Z z6xpL=WSe6iCLzpsQn_l!og=G{=r*vW`n zPomHBRFVu1$g||`l9G$GUv3Dbr^Mo4ZARN+CkUi(@DWnNUeO^%Qe8M-?FG8DCsKD1 zgX>A9rsWE!O-o9HOEGtLTvL1W_G_Kreg|Cho-wj{+OlMO=O_Ae3I+5hZ6dumhWT%b z?ZG*!pKNU#+T+Dt5q$PG7a{+$={_}k0O~Gzd`fI+*fc=|X zEkP?=M`L}1|1NJ2ROBbcjttI*`#V6 zcVX$AF#&#NeS`i2^(vWJx&Z$^i{hjm_4G^q7ZT4zM1<}76(m{U$S-G at XYu?mfdnuka zWQDOZJ=0^AHEbC)(|s`jLZ)v#2i5V?)N5#3KoL_O1SY4`eg#@TbJb+na78DSD+{eT zWX&E^^l(Uz;KY60K~G$TzOKM~DRQ`?m)%g#=v!Ve_bz;i9;Il`d!FcPbL at SYO6H|J zh?;3P?Ez{u1Q at GzJ$mzTV?q)g8wGmzmnn%9|C1oYWk*;_X^8P%8x76T-x$BL9^G?G z7A_ at ytiPLB|0j~qUW>aT>#F3Eta|!3_cS}-^$hK$|@~wILp6Q zT5AwHldeRTw1nPpuO-~}uDb6cY&?Qf-VH at f6vv@X2{fyRSxq{CIcCAV#UgdDrN~FfZ_rL&@7HpjsIw*Rin$ z#srWt6tab3nRdR3BGiP_JA4>2E~%VUmOoO>gJli}f>jPfDH>oR$D3+^v;s})AK{Cl zFEUb)7a-Kq4fdmrDqc!l)M%crL&*oic62T`o^bveh9wYA;HJasL_bW2GFe at YWud^D=%`$;gZenIu=HT$6;D8C zNMi}p&AvTnQhD5ELS6QbWd7l3!cR?IkwWtt!+@{y3^kap)lWqhS)xv5E{-%=LeTHn zfk1LyP+wIkqJe6mNe9-ejtUc)?Wn)zJi7oo3^AOduwFG4eT?BHNq*kmAh1a#PBN`0 zN3%m~b}7IbEdgN+X46?B)mT*SgdMisvdwzdK8;Y5Ya?;THzlH?g{s`RYA!3z93d_t z${OKfsV3~AzlrEx+UzVzStg)aa-vg-DL`u(=^%nm|{owUd# z at DTULvB;i2NIC}mEy+;CBYNU+mW^k05CPZT%b%9L0o|1Cx%YgAZfh)kgPf`IyUy2h z8U`5F*k$IJ)!E+js!L-&K{Z^Obl4?h8oE+r|E7xEq>?1#+psz-XR_8DlpbTZ#vsh? zU3wQbqrO0mL}loJ$)O)e-ce)8)U;%}uz!B6fto5U!Hry7>7t3`;F%>FXXmAA%(B^=9hAqdsc+8Hjdm4lhB}u at o=+XG0%b?W=>BS~S zm$gW4>9um4`a at hROoaqa{n+I^xB6NH7aQ=aMz=!PPif6RXx#i8xrNE&>#h{(4h5jd zN`kGdGtO5729jBMSY&JYA>tMJF&$E^2c^zyz628Qk7Q at EQNosM+Jdu&c%Rq9ywhUe zFVegIU)k_;96cv5_V3*8lZS|1&OofqO`0NoUjc1aR#@zkVlk#0FlNqg at zM-YQsWG*=jfw4lXsWdIBpe_=Le;%S78?gAV^($; z8>GO&PN%tLTIkgbRPV_iuvZc~aRIz`a*Zf&PAjJ$0VZMrgtPz22&(!3W3hUkcfpYu z`D at a4`;Y$&@tpdv70N-)fMw{;%tHu at 9W%2nL2L_Q_EU+N|c_mBh;= zS0yuEq%+c)v88sUMwq3bFoNFHKe?b9w>stHB at P&PZ1>E3c|o^Haz9s46 at ZrfkPrV5 zW5o2gG2^ynT>ka3M+f<@HfMhyv-DpVIR|4y+rL&8Cv#gH$NvsuR>V|A at j*jWfwC|+ zScqGSo)22(v#`wgP?$#uBrxNXcK$F{x7Azpws-j@{YRA7dBb;Zrb)LB*)+rFCidd# zY7!t2ItAl~+jFLU)^Wy>W|H?$&mZVMqAs|@NV=XVd_NLT_o+ilPv3zGcFzjL>wW z<7zjG6I6N2lgktW%jsi>2&BNw5BlL!iiVL2>*oF_?)v;VGM#x6d3FTYb)T0kenD5m z)IK)5+cV9V(hV7F#kihJ9{$zB2o=g+0 at lfl;fyIYnfFdeUp2jr^Y#i$_=)CZ9Z&1krL}IOGHwddU at Lin}nuC3g803#Gj3$k2Aji73_xpAmv4 zLd%Bc5q&E2TzC!Y^`p2Nv5pMe3lBwocLrr`M at ld8$(sHSDpFL;@=I$$gIOcZ$#h8! z`0F1wVhii(1Z9;K8DmA#_sEPA&4R=Mf>XiYFGvrXrYj{iIdjO_#53(VSH{8w{z(P% zR+UnX61T)I2T*o~b}U%d>g*;WDC$QAYa`HbfCT26s2zsn{MMN%b9w_Aa$yG~6)p!c zI6Kh?s1_~Cr*!M7Z4 at X2Ymo+c#5>Hr;tp+#l!azvDw4)2RL{xka_2KprUm3zs+Gml z3f($YI3~d&n at BLWOEOKi8}bSwam at X8qZ60g?xcTi_s#;IFE-4(j1z=g`MKEjH|VDa zPYp_G+PS#Raa$9Q<@I+Kw10&sb!CZRtbRklTkT!T_Yo-CSXeK&_Z<5-Y?p|naQmuP zhnO{d`6PgHFv!PW=e=9g^}CtL{;Icm(2ifBQKd{Nic at aCP(V z+h-qHzyUctY$E1>7#=io>dQ4e5Ij(wfWzm%BpxyAmV|H=Gr(;YMl9D>B|s;AQzZ at syFGZQa8wcRJ(PrYFIU=S?m`T zG$Tj3E}j13;mZ_FE1KGS z8Wn-)k^rhj{P;ixqICjY>6ZD$=xgv`D-}N_IEIsMNMz&_fiCeR+p{d%vqqwOHQ|K^ z&-Flo<_D42TL~h&;y?Mh^_aMlPe}P$!ZjO<|B-zCbJdd zAEokdvJqrg&!hkZ0PyoK^ZWlU8&bA5rhk);|1u~BD_F`d%Axzr*ldf$hesgG at sXyM zDaqXd(GwIdnxBt>p$~#nYd0o4aTi_A#gbmw-Zy5T8^ZAR;Te1F0%4INCBC$0^`tJo zX6g3&Vgsd(N}v_CW$^RX7>h;M!E6>tWhZ$kJfhj7;3NJ_^-*R<98c)*4&1~f*vq7ZUTiHJlXfzd5>N-xn%1t zZakYA&&9PITWk7H{kH2Qjqww;p7v{~mmt2(OW?rWNYN;fyE0Dt*(#%Ip%J6uJZCy#Iy>UV z(3e8X*catbdP_>bu$BmtyOcqM8z!_9YJwB8O1(&xAu#iSbXSP9)+o=$5W&tqw|&%u zztWT9tX+7Wg!1E%pwcg;TOn%aVYtvN8 zf9x3jH!MvN8mRG+008ju|JBjOKVkWwJ0f*RH?3u7p3`X_j|9<$skH==L&Pz)2f}qQ zD!znfwFGXFOpk(ag75 zb7h;VotwJM9C~5loC0xrw#~_mu2FuNY|u}be)!)HGV;1R+m!}KR(WM)H at rE~7p=`S zzQN>Ax8#!}N|(QJj7~TXKe?BXU+?}RUHBmn&mq6}?orE=qLQ;Y1?`%fiF}jF&o%~* zY7}l%^Qx}9V at Kmzl_@qje+;TZkxovo4AwFzMXIS^(5-$7;nSjADMRL5%51shjC4+s zKp()Q%mm#4TTJG_rtCI97J+76=O1SPG-^lR`!x*(_~^yCe4iDB^Af~RMj7JjWZWXC z==SO(ovxx=NzS_4q)k!6+byF|-gRtV{#zTvR^0gGA^KMAIQtZiBgi0g9&?*EX$Kxh z(=s2uruU$RtW}WR`xTEU)_ at w=dIjZh zmf66J|C+!24y%(@lH_!FgGhnhXMGtrUya7gSUpGX>+{w_;;Oi71;u>Gn~H+~#mvbBQvO|lbY at 3zg5^3B zDce!8>emlOejA?0?RgshV^6!UZ4a2l{Gni~_A|a1%D#Tyqe-_BzK?sPzk~`4zoqZ$ zz%-hTK9xiTFE*S=Djc{$ye`Eml_JK%^VO^$mbXK>PUXS71rKhc}agdC1 z{kFGOI-y&Ly~Onl^Sp==bai(SF`(fGrqHTX)S>V%?C9`0JObw--VB^Dz(hpStI~Fu zu)~Gw7s9qYM^>u`jRy4i!=1C!0N?ibT}V{?5Y^HJ)x4Fwn3JpSQUg>K_4M?tKy*Lu zwIclMVdvji14pPnKl<)EW?&8df9tIeB{g{uRTNnI)BIvc2N%Q=90(dnK;3Ptqej6E z0}~C<*VC)BfqNR|2bDvu~MT$d-DFs<)a#)}dYHKwB&u6v1#QYd(z#(VWEB(qXrU(O41 zFFC1ZC3*AAJ$dsSF{%^9?Auvt6_p`6&vjv|9dMzyoxj z;+qQ_0zP?_pj~KqA$q>-E|Z&y0W*9&vDN`hx2PdIr~Yo3;ydC~$s=7y{#^7aNJ6%t z9{{xklr>gl00Jg?)q#(xQprOy$|rND-mcdTqwX$mf?ucf0inC_!NWuT7ywH!`_mFR zFFkKby(YD&-)NL*rDPCNJkBS24MGKOh^A1YB1W$5mIhN4TXw+xYE%f at gfRxSY)UhA zQ~TDJ8NEq9+UIvnu}Ts9JGJ%bNoGr)5?{MX$2drGmc(0_*ic^F$P9|b?qZsoY724^ zldW%+=pVrKdhg;!jA9A#pWANiN4lhPj;zLA51NDo_ z-%A0sKay#_x0EJ4k1}~Q4-u=O;mF at F`X&;w6V?#m>`A^>QDK8Z6ycbnf(ATHp2-xP zEQ_oS=^`=_)z=&3m8h*RLH_(a;XLovNCjDGJDEv!hDu0!^hW4UmmdV7EznmWJCjc5 zg`OiSoXN{?#!JM83m_h^92Ur+w8MU+e&%oq?<$&GW_d2K8ljNKlN1RRu$lKHS`m^R zUYELA0#OK~r0Hz#aE=*ZlNI(~HiOqTU3Uxnb|1uTo%233hgF=b%iBwC3-SVEqC7w8 zJ~?_%_vU>x@#!QRKFB1rf6}R+;1F1 at cb`Fr6QaeU&U$f~p35fxFp=O+HAyFI%L9`b z-o+K7S-o^bd)ks!PIAehrLMQV%+XI=jHkOKVZ)Qf&-UAr zpuF`p1AQ_rDp-_0mPe|{)Bb1*0(OLjoEdDuT&stV2mK&<#N?0xe?**tu9**|0eyge zObzgCyX1c-=nToQd?*Ki61x>*I|t4HWn6h1z22m=in9+yY>|YHtE=hgOPz++sYc{G za7jLus`zdo#nN%^6VWNViQWFjCUYcEyTc__)n`u=e}T}6N#Gooz%b6+22d$T5~g>U zM?YQ^QR at uvFo&+{#>U-*Q*oJZc4{^g;vz{F-(-mups5_8Mpss9ddM<<5 z-v(fxRJ-=yhsVh~=R12!y6ujp!adx}&xVSX?WX40CxM)&_Px;pf7Oni`-T(v;CNWr z75{A$C65qLYoLiZ)R at r!X6YgAI at rFZQe{VF+F_btqP17VMa#Cn=dAGm2z$rqOrLe# zHyzta$2L25(y?vxjcwbuZ98vlyJOo{$2$MH&OGO=dB$FQk5SKu`dW33QT4m-yRPSl z$yld&k&nVhVOl3DsBqDjGoM5iU;Ywet_|7~Oxzvp)%0cY08Cub6Uf?SF8zI#x6=fQ zRvyIFDtPIV*O%sdjaz0<*oSIa=ejnl;vs at 8I(Ztqr|_emUHORdrWPOnqe@~l#e~>9 z+RFvF>?n4vkR4jIUTnEG0xINQfb?#hP59uX;A9HXKD%embw0-#$S22^__r`pp?>^H z5J&A0Y+VrZUYhaW(Cay4tk16Ka?Hrtm$!TCCuVg9cWzcnm1PcR_U9@)1OAqt6-kAUg!IIKc at gQnK+k{h7FayZ za4y5w_q^K{1*U)8?V2d}ZkscEfeVAxs*1HGMtI5eO0hY@=(f%M*keZ$@yIHOd6EcW z!m}#7;K6<5!0*xKZ`u%c>|i+WFu;tE5 at NbwcNntU*Zxw&>&ot#w!MJ=Oz=xKNaZ0q z$@vXpwP)b)v0b*nAY|AEMRWU-T^6gm2R}B`#tX;@?2qyoQQ`KyL_aHsk_XGha9^e* zuxThJM2JEeUBMFV90W+~(C at QdH*Tdq;W%qkRJ4%{=IjMIn}G*mWL(QMEEn2KoUz;*}eRjaRVIXrR=?9s>6;4%8VQh=5z2 ziKEx#S%Avei2_WXxK(>3iB1q!MF~@F*>qPj(1BEUTGpAKu`Fv<{=F^a$%z(!ATA%O zEogg}!IQ8zfd9}o`Lui9>;jou5vOEl?xx^sG~@xwohArz54j78UfDgI|Ia at BI$?=; z2nERuw6zT3g!`1}UtjR)z{xXuk;jMIr}r_k^$GT&m%K;!>Up%F+#*#?9y~ocO31u?|c2C_A8#exeOmBt-Aa@;70xQ~; zP4ZsVFRzQuW1KohjRTCq)}?6q?pSPw1+ttLa)2n`4DOvQXU+F-O>dS$0HNHez&y#e zJjRDlg-9qf<0bo at A*?0KuFCT zCH)1IpNS-Zp_tm7qOm^!hC#PBeH zA8+N;DA`5N-Vq(!(HVRrjHY1Kn>QtI=B2#*%h!Q94Z0XBmW=uyt})bYC at pnmMsAis zYlJ_*`c7Koj>Kq}{N)Sq@``bOte(K-o1?}onv^Q)G6}2b%TLL-5p#d0?9pRmEwRiH zsOJFIU9rOOi-l3NUajvG+nz8yK4nTm3xAr=+q-g(ro4FDfI*OBfNcH))4)eSPl!n3z?)P)CBMT z&aS~H=E`;_=kMMk#4j+HJE*o=fnvq4 at cj=a-C at 7d?hk6E+Y at I(Kf$m7BPGRC;^E%{ zN-}?qhh-?y;kv6e76vY+O;R38^^P{dGn;Y7M#PdqwcKCtL^BhWGZ at Qf1!PpIG+Bu5 zC&|s0Dmd%mAd|686z}JKaWLw!ar1EiaM~_$wewcN?~ec{OW0tlv0i0Lva;pBH!3T} zzukPy;+XWqCAGBT?KUGhXBe at nX*gvNeiwo&3JYR$L!f)%ci_(HhF*^ZHu6}c3X1sk z|Co3<>WmKR6msEDn`?7jk=T+eDsLLCn4%Ilpn{Z9N*W85a2mu4q>d+Ma;B7xk?&4c zD{bC~B`HB2QBzD+l0BM0)v8|n;~|BgQ at 5y`HUFD7MeJNXb*^N>F_PMM9nz<4UTTHb z#<^%-&W(!p%(m;hYMvZM8&oOKli02pmpaRad0IC{TJ8c2z at 77__yo(ssfL#oR&!V% z)@3#)XpV%asmsf?gk~~{K>)xxt*H5yQWV}xeO{F;9BEg|C2q0yNhup!EX(ddVHV+) zR7OsL%dq at a7Gu~z`s^+i*T21O>^y(}M39uE*8EK5nz`Y%3tWC8$S!$$B7o}PCi=4i z5iqla%ueYdyqdEJm#|k1N324r3!iXS+=8qrcOI60Tr3D3mb5Hr!ehZF5}U+e;pd-? z14)S>jcyoWq*53zh3*hxR1|8|6lzozy3dR-jDZt*g%erDiq6A^-pPjU#frXSNmaX` z;4LnE$Cq!qx{Ha>Z-W!a!wUY+1`fpv?q&gfy^Q>k z6uPU2&`*re-)jzi9W>@LZwOtML;#*kGiot<#TS}QYQrZsmo8#F!?nI_Jf2~F(O|lg z-1xgq`l at +1YOwNTaUzv;XY&C#h!H+sNd&E*Szs8C+L&QQh6O1Y~hcrHN zpU=%C*T at 4!%?a}%N2ioC9_OA*{p_KM;7#& z>(aIK0$~KsorMix4ANXml1y+)WldL2l*~I*3u|;cft}~MMT at E{sz{!TK~=fy2T%g9 zFO zC=U-KB~ZOZ!i7zag3S!GuG&9M zWhweu1$mVqjdpOB at HZJ34S90&j)gjLT_u#dS?rogp_ie8oY|S(mS&ZwwB#gov at EG2 zp}ppHWO_OVk}0L_??-ZAJUe^Bd?;%|NNJv}8|e-90&|WNEY5)s3+y5>k9 at P2QYoOg zs-#*mcfLu~b6v?*j&bG`puAeE>~cIE`48fAbuQ}HUkS~fp46LYf0A!y+z+f$w&pDZnGMXnwb<(#FeM4a*=M*wne*?g{R6YyRObPoSfue-1|-vh%7YtCJYQwfP)y zazndAt*_Y;P((&+T{|tau1aeM-8g#~S<4)V-KjN$T~rE!S$lD&7%&*7P23gs!0*ix zyupb&z&sOX4;n9D3r!e$n}Fp*C;+_|=3c(r_nn6SL%K1tL-mw!R*%hbhNYIi z2W($tnoMbd^m1j!c>)M~$W}Bxzr)RxJ6GDAk-$aIS6R|h(dxc=&)lEPSHT#$Tbyj) zc8chRQ#ryIxh?AIXqMfW;WPrB9%k3Cm%N at d;Qr`$F>#JjSli?jaZqU~4A$p at YP@NVn`BPm5xwxWT3A;Se zHX|L30ezBP{c?PwpYFKdrJMD=Y<=??^r4<$_Qo%I1fkPeC at s22S_fKBcJ&K<8H9WH zA%8&SqmEI>3bhbrk6`zFaz;7X28u`D-TE}P9*M`z;b at BzfzIM|p}Z`6<&nf++PvOT z-d0#C;2P(VtfH|dTHQW^Kbp)cgRitcdq?Eq$CEJ{ib=?oksbb;U?{@n%=;I zjb`x<)Suy4%Ny at N;9;WS_=}vrS{lIgLx*UGrbntb&BXk0I4;V4ko?E9TI#aOhUZG=zvMK?BR9kiTWE?P4&B2Z8b9{EU*cTTX%E`=!^nd`nU05lq zd{AXIfqyPt&f}SU(K2_>;lVx|0FmgCQ>)z%gz<25!AzNDjkYu3?k~j~nJLL)CzaZkv6dK2Is?XS0ON#94%g+rd4V^B1fCam z1384=2t%xLHcBF5)YS#_mZHD9ly`;PwIN4qp4KYgtk at uaW}>%oNuw+Ak2lvJ%YC%efUxj}(jRovF1vLhr!O3SoI< zkGhc8H$Qw!r2FlIUIDdwvFI^b})l=1j zA7v6GU*pcf*x$hBALEbs_5qK?vk&539lirj-!M_%)Y4zraqD%|Q*5wT9K}biI(OpL z`%aQGE0R!?6kKVCf{sWt{Y&-E^TBm53lG%hvYaCvC}pEtiB|9NtH7b6EMgMxs7 zga2>aEB^13^FOPG+VW_M$X{}H8>yl+G-|&gwA)1h5D<*WXiC8Kw&r4btid3L4cShU z&M at oN)1rtsZErO+M9A!G}7K3!l?$ zP(v(O*D|4FMZ&LOn_`(_AEQsvwo(7mweE5Rt!lC$K!2VVZdzpvl51di*PFas&uRp~ z4Y|^Sp0Q23 at KU;yA?Ic7phzSS5Q at W(HdTFI=U#D4^QDm#g*MB$jsC at d@(W~oZ|N)U z7dNjxYiX&p{#zrr*07a&{XVacF~)AP(|XxB2tkV5D4&w$oC8r?7=Eo;dwJJ#nNO+> zYfG)6P_PG#L^)K+97~MkX`}t+`zA<}%4HL>M==wytJR1Vht8)N^}>xsoE?*;8U zP^9qbM?_hHY=W$q8gW*nb!Ii{8vL5GNt1~aWnk?M;GqwI_ucpJ`za*NXquTy5Txn_RRpFK&evI$1--f7SG z-8b*utq(`L-%s7p28dtReK~E?GHyKe1kapvfnGV_H%$lc5N$g!*aG%M{)F5OKae>0 zM#U&08^$A`?ns$zFc*aHj|ltT(98&d2Pl+sD1jd at 4PE;2y#6{_N7zG{uS at V`D`s=r zcjcVlXi#p#M$hSed<>;Fa=ZaoLMus#Qa+U+JlXCzJP<1k?O&THD884N3oM}D%CE4| zyUzx8KbB#p2k#N|iyMUgG&yeBzGp7RG#9O{d=)=bJhV=HP3OTs5oUIaBjOM~e;Z%Z zM;(?Rh2FG(pQ4Q()+&>@;d>I#(^WwsUhmuR}Ek5l`>nn9pEv$Yx_jU20wG&o3|G z5G@@eIp>J`1Xff4`4 at 5iF1=X?P`0$4FQ{9=*oey1EV+D|BY_U%Sm8-J6t%I*aEL#f-3~+7z6DnP0k=>kH zl;^phstP!`ld{(u5QZGi)2WmfG7Md at JDp2nVZ>?RHd(Y#H1t$q!wyfv8z+t?CCwf;n09H?^7oU-KH7-98 zx&xyt at PfRJ9%^X7v$=G6F|perg at WTre373xge(8dr=nO~+MTsq9IMn5egO>{DmY#p zqboFT?am1T>b4{BX4jL)w_umZ*J88|{R0OKb{lyi%g7VXPT3$<2neHGZow)$s8Www zh5jLy{aF*Zvxg7SJ4y`U*QW*HH>b&$SWK-A;qehl}zj=LtB<^4myJP5mlJd=*_7h}~&k=c4;>8WNR+;q9Qb`d#g zH~n4 at Y`+5WRK*xQ>s+_SgtDAYXf?zj8PR>FPfWDxfsSIEK|_TYeC~AfTBAfAjwTz4 zEle*F3R?nn)=DJK8Tv6s3{K9Ix3B!vFAaHMcx8mrzUZlUR_&A1c%9`bdP<3gqmO6& ziFv_=NQ&H`dX$}l6_U2wQlUeqq at ju|yD4sDx!?BO@*0+PiA!#2k4K(>2VHwmeN8CwNk-zmBm at r)7{zei84Zc5#EkSyq!P05E?ScW-ge%WE&||u2>rjlq;HP z+-?v2&H%H~{L9fPsvXO{uFagr>*mQmYv85+5@{w8)QsdM)JlT0{_BiTblg6I5zMKenlDnjYT8SC)qik z-#zNbH_^cj%h{3-l~{C_M{)G!so79XeN>JdKH3Z3by2P}=RtHxxLAqX(=Q6fN>{^) z(CPY((?(uU01|Kd56DnOJ)h^NOF$&up3hXGmBNn&<^kh9nkHCU7FfX4So#5x8A;Ll zSb42nm8+qai?fm%VM^yHjsEwc!^Dc>?bYpmEZ)(Q=D$W$<3y4KAh}m`$+dQp{%Bg| zdRp-szsQ>uZ~JjD{fjlJzo}35gJBA}Z^{Em4gcuucDH%Wm+lgANxxq)P;pP70#EE$ z`Qf~5#MlCcG?y9H?g!q~5K_{O@$*;5Pvh`8zi7Z$n at duAs&=ZGT_dkk5?6KIQnVXE zdzmr98}3oZZbUWf5{p at CK2D)OLt?89%a)i`III7{@ubI{K_7!tFK-C}DWAs{{ zqRoEwf#1OU1tI+8gRKxL<534ty-AeaF_idmHVb?R=sd!fY8ol+6ktiSWx5B^=H%Iw zAUX at ES&fnTOsQ3CoDKZnU2`+!UZ at iXoe`8>1VPP{dX__73H%NaNS1SOqYNJ0 zE4&GRqNR3 at 81YK7(&POP=C3-(y-n*HXstboVR;}EU=vs+X&>jw)u%tPn{=(x6}0eD znH3_;`ppL%d&b^I(!?fY;uA1^CG59(LC?~xkGti1qT?TZc%jUz{N5jDd`17 at nEVo0 zQ}KW(JAmZYCYzqKp2wReo3?Q0Nn)iyI~3a-BH|n(WkXx~O;L$)W}iK?Y8_nVZp*DX zbAc(i=C~i7P at L_rZUW}Zl9QL(oy)$~rl;WP`}*rxPg5_ at M%&PBFAzTobA2MJ7pu)P zpwk;Jl4k2djlPRq9*6r0aKtc0+gg{?WXalT8Yv+?TrW*dl_;f1BO4&ijX_WWZ)VRY zO*8B2Z*l3}s|=-noW!`P{|;Y$FRDKtlidLHM5+%F^+uxMd;J^|rZD3Vr3R!y;$Q8MsnV-nt+eqy+hCqB5h+=vbGnm>%&9w4BnEq>p z->K-d680u(kPIFy0knkrtwvT=)rlKs+$*4 zk!1RPwCXL^_IShses)eHQYV+EAJ!s!l;{pQgM3Kx2VsvO-shOF;3doVzJ7v)3O~sm zT_bhlc&_SLsVBRv+S$LTXV!H5SWe`*K>($;Q6TnP|BHJ5e>`3(xa|v#1OhUJ_dkW~|1U)P?}$E47(X_J{?n z&H{$om>jAW$tXz at k$Q*3_1dHki%eUK1#-zWPS=G}+td*U+3$yK^B-h^z4v$5d~Q6? z+23@}@ZMM5jC$Y-HMTAX3s`B#EVdu~xsSVC*-w2jvr-RG^B)CpUOAix{STZMp at ex4 zyALmcP#a9dPA8ki6o3N{iyo?J2ui(M0~ozz-JgJCa-^PMMxHwiq}08*&1?^kAA0>& zLZ1x^b&?ONYj128Um_a43}Ig?q540?{3sSVHoHD&0WY!^UqZ)UN}0X)3K6|eyLPwq zYxk`LANW02Lpxpy5q|N?nP!K_IpW<8a4QH8 at k4 zm0%$XkS}4RNbXK!mMVPcE zNQobS;bPp^CKtJUtNFQw!v%B>gbkz!@BKA6T0Zp`$YqC&CX+v%Q&BfslyH4=i=#ll zpFG}fGtCQJP7KF_$76#K2ua{`G9Yxojs at 8qX$1L2$pWyg(pL##w}rQAn2+7Zez^!IE`FR#kPp@@uz+Cg^%Xcnoc9B4FaXx_t`T_p;#WBm9 zclM=Yo77vsxgR%6t=g^B4li%EO!QT3DU>!E>0(ChWw;2E=&*s?m!s~N08XW$FI2>) zebt;>%7POEH+n2gBh<8un_nAaPJV>Z{>zugnrR6VOW;8SnY=g>E(*86O}i|ym#M84 ztE{MvgA=t}{U8NAaqZlLXAzjr9^?((0|#Z&UMCAd%JgA;G7%6|I-4ycJo+!nCIt3G zhu{TU=VcpHYA${oh7(gys1tp-L$}p=Y$NTKqi-~uG>Tg|O~?Z2zO;7jM#ag|d8ZV} z_s5fh at V+A`77E8c{A$e#eLvf3hiB2*XLoBwO)j z6+K3LK{mP4dYVBfg&-QWa>_#oi~k+u1kD^Pj&{2!I53SrZPK_Chq{99XBNHiMGj2jsaRBp? z8=K_Ft$oC)S{tj^5-v5f*SA at Xd0`17B-f&%u9s3)g?k7DkT~|x{81%N?4U^uF^UXt z)2gjPZ4nw3)V!5yLgnLr+C#(-GjS&+A1+tms8A}?A`i1&Ub6hlshUx{Otq8p+k`nx zqA68ewY`>Rk-NP?NnN#4OP$TJEw!~=+hovFcd5b?n_>R$7eB+a1Ah*bT5^q4jpkf4 zi7l$Pj;X=i)rD30`XB9u z9c^80b+cgHKnv$B+LxB0^8K=S@$zISaNH(P|}E4z(_rM0=`IoVI)FB|+XS3hZ|QI(2B zKClQ3Rjsk!x|nO}q_w0!qz`~q0^BNaEG)x*GU13d~^C at ya-4P^pIQ{8=?;=UY6))2|g>Gl*LRq!W zPnrTtc|&mxcqfbUm=gCDcQ#P?oevzOBkHJArM)-Zs7DvM#zHVx>!PUkW|BVsAxCG^ zuB*6avr-Ai*0X>>2$iPidLx^73-Z_wn0c=(jjx16$+hSWx>Dbutn+jxQ}Ki%$|Ia;0Fu5US at giu+Gno`;Q`gR&* z4PSZ76Rwi0W*9j=el~@-Eq8F(E_>4LChk$~dXofU+??B=B z(8;G`&lzF?cT9-X`#56 at k6{mVr2<&x&pTmzOJ~okr+#j)9v1zq-;za>X*bLn9{0L2>x!M+=WVRMXOC-`co~2mSYMY6y9w`r z3P$~+E?V>7b)U_mdH$1Dgitrx%t}S1`boK#V~;c5;ynw^ht)An)c}?nm!BvQHhV*L zs5emdU{?*Ogd;S(5)lLgo*f!!^nU{5{-hF?T=9!p6PD)i&j>xX+GFMQeKt>m>3AW> z?Ll~>*6q68;p7gr-dT7f9lW6M7qRkMX}My-x%ULKBi+pejg=e;FZM>+TK#cF%)QN6 zcD>a>d7JiW-cD|j)Lhn!X#Mq at tC8yB8HMe$2tvO^jQCBQN3Wy|0$ZX%re5 zGy#VF4)Ly(Quan8<1RKk+HI3FB5TIJl9hAA5~{9#J-LP5wCB&FI>Yf8R_({s-|#(k zenfdLT}#la>Q_f4d<^~teFp7rnx178!CgE>V)g8 at PX^@KpIDkdBPP=#t|yx(tT-d< z7BF{yDLyNX7Ku2mibSl-jm{)tvr3!y2W3wh749R&%cOdd2Fba>Q2X2c zcX^#AV{ z*G%!<1qWL1tJsU2)9$!EvHgJukRttnf*Biz! z8uneA4%5Umqbj%*0icJ-l+EcxaNXa{+ZjBtDK2%e`3Y}9`;l8|#XO0z%k{qTV=k|Jf5QPK%JhT#)@W>79LtsG7S7MO4wYQ-wlkgi zn+p9?7xzbkQk69IxWyxPr>>dYO?r7l$#xyj1#tH3r$v@`?uX{Ckhw|5*$4N5$J{&V zxMPdl19^kJsf2q;>wE6gc(c-lEkioWkzxBvjIq6&3xFkt_qpj}CEIGgx4GKUYAwy5 zic0&i$`SucQK6+hf|ehIY6vgkmP3POaw?xHrM z7ZY)IcbjgiAa>)#w4$7Ge>_!4>li(xyfus zOz>C-pR;7f1+|(}VXg&BkLbA1CS|7g_orn*di&9Eg7zOuH+WuN_=bz|O%k#Cie$C~ zxqSku--?Pi7pUj-7f0lwDE1#nQ1Jicz>recxOFZK z*72_T6t!NnI&gL}uTvx1A_HP#nup~DH0A$lthlAq!kX8Ebd=ufC at c7BZ&x+M&IG at n z83`wE2=EYeI84XJBJaO9su?Zx=`Uhu^F8A^VzDTXy at qy)Cr%UrN}+_Zo-abYsQ;nq|8DpA{D<9xK}i%SqgSXT*#9#e20Mqr6 at LxH_$9x@ z3Yb`%=8XR~C-O<}`~McVPtZ4ip(H(dwDUb at FF4)I>hHvX&>7K3Ip|CqAfsU`t*pw? zq#HTq7-kmq*#{Yh8m1b`^>+nogDQu-S#dOLV_f9d+u>`405O2DY-^9WwL8^gp`^$g z^l-&1*0YaWw++9&ZGFXw6r=eOv1 at PAx1Ms*tTnv|YT$9_fnE5t_G@``BiS6F2asuh zcqi>FORL?k)W%)9LJ7c`H894O0UY%?iIcdCjf86DX%O2&0Oy at 2lQ1vGfmCa%wi*M$ zkWe0)(0FAFJZYNi{oKCOHB}Wlr&ZX07q$tQs*NNK=2LBIr~wO3tcf;fR=gNj#YF>! zAcc at VlvJK-We3jSj-Q1~-9Dp;5ENf|;s#{vXf>aFcZ&r_E?gI at n;-vjd2m+yfEMSX z-Fo_U-N<8k_~m2%*+-&g;$a!9<^2EU@@Un}?OEF?$tW`70v;lMAD?w7dV1g$ie&Z@ z)}8ZoWMmcNy2aY&j~#hDRmYEbz at zCCHAQn$?+$W=7ZI*8hWi{-eqlt2Jd&c$l4Ox& zU22C|SK2L at r1VV3%RbwrT3 at UD1$kHAqj^7gkzdq;{ON!#dB_xly{}0(Cn_<|r!flI z5G%VF(RvHZ?f?dLiX7%15jJmrF=vg_ZY$)G- zQ{kS>6iSOlE at u#ZOVO=a$uq`~_J#1Dq6E{s>>C$b~jn(c|B`Vsq z;mIU8+REAuLNsa{-OjD9Yb}zr`PKFZ#H^+XM$*6Td zpQ%{N?DU|d`;9cIwd};{G<;6_pZwHivz&M6xvoZ_v#WO)P(A0tP_q-`<4TpEnbx^Y z2N!ZL_VWRDW6uwbTo-+C_n)#*h at 8JjFnXvka+_r2ckX*2+!dX6>zm!S9iRXHZ3a_> zD!qJ3b-p3DxDEVxX+&GuD~8zLR>qvN(=_Whjw5K+_&!OiXT|eFz%;k3Z8do8D5Kj~ zf4**L+tG82?a1Ra4|x2+PDtoqLUtH1{Qc)$hYp0N$7YoF68iM&t}Q`_5UxZ?OscQ7 z{dGBjzTc)s7pxx`a4qlps3TC{($wi=Y<2ojDf5;CzBROwgmiWG`Fib+Fgf&p`fmvS}A?PC6m&bxp!Lt z1NHmXd;nV&gp_U3Qe##Y&pIT-=dSGqG-PLT64?CJ(+t56Gwp}BTmyA4CvlDvt#uAt z>#J*QbBh~z+nJfOxy95WTT*Pi^R*o0Kb0F+Z?9T;;r1*KJcSNLEG*pSWL`plqr|vT z_Y|r*lA|XYxTv2LNK&zS^!oI-wi`%U2`X_BO2p4QP&3?vJ6C0F5ZL}|$6*t5&DoKm z1rMSU;G@|qG}EU_kW~Ow*66>Lxxvr*LHlDm7p@#;;v8g7s0{IE#Y{yve~|>Fp4xly z+Q8$EPcITkP=XeOH_)O<;Wl&!unLxed?xsFhZZY~g#D_l$W9sx_d-#$HIVUbQERQj zwxYtDiN2pC%F8(%QJ}&px{zXQttxRPuh`*2jYM!+Fiq4;ncz}xphv}zoA^{$*bD2| zz=;V<8YxF9WAC?L6AG$e2ul5ltl;X2%CRs6X(=t)9Y_?V`#1G%jp9g3n}!=NZAJ^4 zOJK61IALO_e4ZIERawa+{5n)T`c{r~9xoxOH6G(w#Le_q4t&T$NX9gJTdL#{*GW)>`mcx zZ14Qt$_p;OUzDt?xBTeN-i?cOKc$N|Vcprwj{%dmNLxB|!dffSN=Ye}n*Z`$_&4i} zkqz-%4U%FJtrMS~qRIE8TVws=E5%WO2ZgaYFXB93lA{+d#G1;*EZDMf(Ku)3Z7%Yw zSV`;Hp&fm at +kN~5d=`fY_;ymHc6+Y)0s~i|>KKQe3zGLWSpm1NUS z6yxkyHlw(1kDS#;rIw3MGL5R_VGyqpJn}D5-RdklyB$0JqmiPcNY18)k!Juq>)Q-* z89 at ehuXD?(pxNG-soj)PLTz2FRB))55&U)(poyiv#>KhlAZg at 6-9IDJwSa{P;LBCN z<%lX$>n;ctt+u3q4k}1ibi)Ses9 at U4h?wie7=E7>Yb-E5PWCs$%r8E`ETyy6SZb)z z#`?Krb!Bsvd}eJu70$Au!;y6xO`TMVQ2FM)Y9`K|kV9g-#PXB<5LMHRgwvKR<1?f4 zveFYg%w&vF(H6Cecr at nt(4HbI!K(7z?7YVYv&+*%(CSzhvc3SX##|VN-BAUU(pIer z^vXMJQl{^##0kG?%7$UyVH&XGPV(wHrtF%Lja$Mj;IKHX2*>I{E!6%@cDWAD8nsd- ziipPn1x1naWUEY|5k>&?RD;w$`%zx^bE8e_{9RtJvD$m*4Cr2#Z^Hw3(Q;x?^+|IA zpTVD^uE4ozz#ntGkm^Nckrz0qIxc5nGLMljT}e4AYg_g`(^4ztSFHD-#tZY${;l(6 z0)6g5kN at U`eOYdwqzqvWjmz=kv|l{_^+mHS*>TG!1p7dms}d|;d!n+d&ek8nKwbNx zk{`zh*Q+=D%5F5AlhK*lyHYvEhvQ at X=xw z)lg6g%Gu(LGgUV3Z9C4l9jR<;51rtrgz$-0{|e*(On3Zll}9Ht_1gp at 2W%u_%vQ_+ zX{|o(>*gf)x^yxO*|1 at 3_eaRcMD@Yz=QiM4eUu?Y45q{lRWRZYJbZRzWd<4UULa~u zRkIjj>(_(@U18aScT1V!vqi$VS8#gzSI)?Fx%1wqH^a-E`#?0?@0d{@`wZ`yTwR_D)TpzAudCMez zdN)KV3ZL3Oi)70lzVj>`dX=3fCs*K^BrMx&ZVEeSsqgCv8|j5v{Re5%SD at C7MA8b+ z{O-aNo1BcFK<^!9+baJcmJdYLE#3JY+h%y3F<9=&h#nD7Zv at p0%Ddg2?Jer{=%hPx z9dho?F1Q_e8Rt$>cKz+UES6dW2{OD0dm>u0UDo&}{*awnZu|FWD_P$Oy3-_?)0S+S zJ!Y{~Knv=qe7bzotMxda?|1k!>UJg?SE1wSPLEpd$z^6Fn(4`IL!8OOg~)lB$q}x| zDgDfMu*nN{#T}gO>B`}~-M#g8KQFej_Yv^E>q{qhB`hLs$P$x1?s%;$6z(whYWuyk zes}B$`~F!Jdp@@efCrP5`Ym_ySIfMrwB8=~mHio%*XLUF#9^sQPv5#`MV)D2 at pvwF zP>ZR;!zWB9OR;eohO5eR~lIRX0AJ+1~k#&8UGb(I6Y2Gnn2wLL%4n#fsX z;Y^CP(ez1c&gpitgr)8Z&9#c$1GQ*MRfp z&N?;81-EFAjtC&`Cj#2S_Z5A*Zt1V{P~E=l0;?0z79jk&+bzPO#=4;zq@Wh8~auHFS^3P?Fks)bEWwI8T z4mn*Mgc=@+hb^b&79&13PwB at APIZmGxGRsEoVpuZWgbUXurB;{z#Dk!R7R3IgQ~L( zIVAOW%h^7$6_q|3Q at C{Yvm9r3Z4<%!oRNM1l_F6xpQDiXTk{7#oI2ZHdWyP^?r at H_ zc8-jn+eXV at Ch${%>7`}mj0HzX9k5p6FREU&%$ws%&WqhDqs1$sAu z`nq?l%d-HA>2^0Xsf-{J z;W3k}s=sI21Hdd#6z<7_!K{AvJQDof8j!jJ at qP(dX$$m0e17cbPn-T^0=hmUSmR#{ z7;B%`BK7!tXj)_?*A_cxm?!Uh_M-3j)uDg4q4p|9e7B?aN=DQbzj&`~W;^h!(E at ZA z0d6VE^DW|1sVQ9yqLY~3!sF~znm7(zTe8+CZ7YpSTY33F9QBMvv1y-7>*{Nl`HXp- zvuO7)n#o(;iUo``8r`g7v9$Y<7BNd_U0Sw|+5{Zk$+a05-D%fcE9{NeN|*N3`T6q` zjHr82*f=Bl*d{&wKBOTpUOS`;b8oR>JANcf>=}#%Oy0 zrOh2LjIi17bu1;niF44s|GWB~3K#&%|ohW6$b#)j6yb~g5gj)u;5j{oj( zP}O#t|Be2Y3Jz*f-h#=fdN*IWnG9U_{E-kTs%V{4poX8T6z$ALmV?aw1 at awS$A2nK z*fnJ?J}Q^@iT#EAXq{OB5E;cb7`tA3$a(NNxio!!I(VS)msBB*XR0xR{E0DyuA{~j zPP?C=oG_}2k*1&!uLR>tA5F}JDLPdhcmXQ~zc=A+aee@*P2~g`My at X zxgY`F7C=wG+7X57=N!7`(k%Rf3r~_YKlXML0d}k>m3F|Co7QA#Q#oT+bD=vcoII9g z#JRGM>}+Po($um}nD(?zquu^qrL44c#~?(WJdL*JByx`cbj3AqYn!&g>W;8HdArEm zHEdarh-H_>neAwSjFJ#%a_A^srPSi&qhq7c8D7yAlP;tf-3j{F$>;v~Fa7>D{; zcypU7TXkvYfW0Zl)xf=S(cbZw4oU^sEMXrzhr~p4-uVBj$cukt_0B#`C_vwKAVvUrM=Gzos>E z)Ou%I(Y;0S(z4cfFWx*meqUNnUvt70O^H at Pv?k at CxWkbgghX1j2XKKc`B(V><`^Th zuw(bz1GTWJ+iMJP-G&a6+o}y9KQO_&s?0C}CAqCd1{>%W_>!bvE-se>L(DQaI|4Vy zGf&*B+lh`k#5d;$gc8n_63T^2NLhF?$pBt7inClS&>jg$RD_6g{{qE%wa!kVaD4&z z_!mMA3JX+%C%!dt&{o18vM5_p1WEqZ->-_e&v%QE?nodXgk|iATYX5#`2?qhP(;5b~l#gXs~Y!qoP~uV>}$f<528!y9E|{zXSJeQ8LeBbve2kLDY) zXk at 9rrlLZW#x=+u!2+$wN0FG5L7(d7W|Ag8rpgt{GzA_gizmuvWtGmHeb2mkEfH4+ z(1|cVen7hPn1RIFfw)l?a)wolBMpO2gANz3A}72SQb2Nkg54MG0|QW+5yB_*#uIl) zG(UizZO!ylp~1VtC>14r?aJ(Ta2WL0gy-Ny{Pew|ivFMW#Xsr2mUx{!fB*v8MF0Zg z{%_LzZ-bztqk)H at lZ=Iv^Z$f4M_tPvM;+^X#|B;8wy>ep}#SREjLn+AJv_GaLh;N&Tw;c zc>KlW4MboJLU3?Ah>bsQuQ at 0VIw00zO$$vqDhB9(if*JJy#GbCn2QwNWxCEB88+Q$ z#r5p-))np^_cs%1lw5a{#~PK!6th3?xA9yfon5#}No>qB9=d{fHkPvfRk}$Q1a*l; zlXo4HPH|Q%Q`zrGI3 at Yn{*v=)4SEecI_^-8sj<*)rb#jh&z;ukdx?2_og_}z7_ at 99 z+Z6}XDAU+jveB98w3 at _Y4Vcobq{aS&oG)13Iv`8B2Bws==<0N5`2&MeW z)XI1+l8sg8t8-Ul!T at FP?7mFC?|sNT1uZ)(X0yW4Es?SG%z}ikZR8c{Bt8*FD>|FV z#xZ6-kf?)N%HE%OQ$?Z5vMm{N%Vhzi(0Qd6u)PCz8;cgvsyK~O!PskvcL7P^(l6Pb zvhe^Ff;68Sw*G3dK8=Coq_6JFqu}E#M_e0wU-ylt39rHOXt zi?yP;g>82Scfyr3%P823Nn$qL-^yca+9gM)*Gh}B(tx`q2S=T~ar5TxB)ucCy+X9O z`D13yU#nwh_aC@>|4w4uk>SN1Fv01q+ at X1^>hJvkbny-`mmDC?K-qOEMqxj!xba6( zx_KqXCv1-wS6#NEK3KDt9pL2wnEg83wxe30?5wk^Y{4U!3SjKgak#jws-5ay>^AMD z*ZS+l7EDH9SQ_f-EHDVyPgyKyMT{@-vxQ)`lGjhqOXf|bv3RG#bM3~dQtq2Lkd#o^ z3nACvzSM{4nZZT9!{=Xey{lx+AhB-wO0>|{cI+9Ms=i&xJZJ3-;s6x+b4U-eQyX!< zToSnk2_av~LUIIMffJhwa%J%n$|H{?OX88wZf`a+Ws)ii!Jg%$)e&1V4{^&UR1dyy zcMyyDrzvFMw7Qu<7WpL7ZBi-OP-yW$Pinav8!#<<5*2RcxcM%Y85{B!+YUQ1gw{oz zmb4jYC1- at nE7)yg0IN(Q^wqpGd9ueH^H3YvCcLJR45EC#C~t(;nMcrUIIe991E8Fh zvbb~emy76uqJ^EjUTETswh(1bHz?b-3)Ft+30yu$4=0Rjwy+9s2+oj4HHN%2jfGyX zX-SW1i4J$^7)lp{co4fFFR1@!>G+I|JQX$6L7eF_8}QUY;WfcT#ZoCl|OURDP%ts$6p4Q~ja12PM5nu_f}HEMPN zzYOeX8Mu+09~{^(7X$A&eeXQ|Pk;T-c>T{;xWRl6{J-wO?H#C2(}~=g0%mCqBjOzM zPO`O|f3!b?9lw;F!}Eyfe0LP~J2LOIDom at jSac~7( zNIPO&KcK=0(s=qT9Rm^0ty?u$MLN5CEzS%uLsVl>I5;q4l#-0PNz-p?cFqyybS7$+ zzEbF#DQbgm70x-IUEspWCg2&gE>pd`^sBAJSjd?Cqdt30Urj{eD=hb!%KXWLjoVk& ze+S_lnbx4%Ewuhk!h9gVM)4iZn=?AB$4K-|or6ml&UZv at rdP7dEWFg(mbfElX|&7c zn2#Pvk`76IpkOoPJ~XJkxhyEw8&<{Ojh}OegW_~4m+0AJV|m*ww5BInT|M3>h*W1- z^UAY)Ty=*2Q@&g*rrfQWwE2(L8Ph(lk2(h-?!O1fXCtrG|5A*#*3RpSer}NYTtnur zB)ZZY0H;?|&8alpO19W+50)b!OClRfW4VKnu!YJxcWKP1ggwXuebhsp at iQuOhZ}6Z zA#qmy>$4=L`WFRwuVtw}jLKS@?dI=1kbQu*+21V8OZ|h8v2W at zYs!Y`>2@O&s3X5n^?B#ruoe;N4A80W`F1T-^ zS#&^?zpwWT$+OrKeDE-W=-q-jet_w zMrrAV&}mYO1qCUaq-2|or4Uv+(&A!8fH4cHGJBJOTPtfmFO8-OBH9sI9Hm;bp&%6S zMoYMSa at fH~z`>n6Z4NBQWe`)fM^Hh=%1jc>4hSKc%K_#hsyx0J^P`0tKfa02?r!^PKV1dKcHG6J{# zCf=>9QNH%oun(23o6*x-AOeB2L1EfQgVOYaoY{|CFtoT=q<#z!&Vj)+clT!0>DR`{ zx>v=pB9m8YeC0bfHNUC2(K}E(Kb>I?QrauIQfHo2xr?L*nYfGwGSGumlj5#KPjVw; z6<(@>%27^pa-|{*AHyk`v+>%c*WlchD;3Q^vkU#7XMQLp?SaDDe5bPZP&Fa9vzWn|cj0q(C#azrK?T^5Otcg_^r)|4NeJzIhki4sdl;i6W_;qY^| z#e-XO@!7_LDlK9#A>4GBCZ#jIyTeCAl#>38$yyX9!&wEN0qn--d$|#*1QU`~?&; zUJL!A_30hStWWLM=fV8UhMGk}t3#w92J!F(3 at PmYXzcQdIIqd2UsPgPG0&H)2xoMX z+t at aMrbSYHmVF+dq-2w5Z)mV6r1C)x7B0hLt`F$AHg0hd)f8<`7IhJwX^l;p)~THO zXMU%pg)7=qA$Q=$=Yngw5rZ;AIrplfvN^IOu>p4F71MnbKjJ>3f<{gvMYu9}Y?9jU z$O4bhE9 at P46%k_Pqdx;w!;D-^T8MC>qHVKDq>%zT>k6-{;B0p6$CG_aDNm ztDR*GhBf73m%mrm8jr~%N2FEl#pQ5y{CFqzxlEd_WpI`~B&AvQ0Ym8t?Ts8JFQ!RL zupDCY3}=gO*paGV#6(o7_|vgCsncz9y1lfg>mACcy|nbT*UHG1cFaaNhf9khH*W6@ zYM_$cV`|wc$+K6ZbeovRxms8;v!j4(l)2Ee9b&%T at Dvc(m5$ryd1|?&UaBeGQIA$I)RlumGJ z$;cMtb6jW5DY9>xKSTZx;RQ#ePz8p_lsM8ccTipnfW3b6gl{^0B#=kTQp1;r2P|7JkTIs9-c4uP(Y0BFhP|+Zq=%A8+$P13W9w6`reY{R zN)c0dNMg94BhX_nt!$#3cRUcf#T8s7PU3^(@Tm*lmOcJ%Qf~a+Rsg848g4~FZ;9^_ zh|u95>}rXyh`xOx9-ojT8z3Oxk_=GB0M(GAe1NVUvtB#Gg`ZAGC3*0Ogui3JCX_LX z$oC3|zdsOl&cn at 5gfkBaLJMeP7Pm!$0W^~LIZL*nguZAyK8*P#ayT4oBpvY`8QE^)^Js!@fW zNKv=Q6L-u{rRwGIx+7eV(FXQa682z%xh at VtFtyo0dendMO54`Dz>u{e$8Mm;2qa!F zK#$@;k6eD;m$`v9j)FO2f#VS>v3V?w>WJD3l;{PQ>owclFR6Gqer)6 at RdQW#Q at L4Y zB~z2N^^@4$hISLpqR!MR3GKAXTBcBQh*qjhq(SFCyWrm=uUg5D-jA&+sRZ=RukKRK z{QOQo(fmyEefoh>?3V2Ku%j;jQIPDBg#4kY?g(}4OQbc$;YEFFDu22pgQ7leS at irg zPFwUeG$vWBFc)dcS2h=*KI3(Es77+uofi%}%X82PeTkqc&27B+Dy$H#*x}zxeK}q` z1;11~IP|xv>X?mDx6g3=RUp`53ZCM_@&|v0pxPdO;5s0+Dr11ShP>MjTva50+QXP> zGC8$SidsAib!s&3CS-kU2V95nXt_STB2RCJzE%)J9ZXz2DXUx`N`Vcmph7_w4Heq0 zLxn|N77SKhHsk^lOxixge#jtt0dKF|Bl)@G$Z!MJQbhRyd~md!6#~ae8pKF`zdA=Y z#_ at tx?OHMW8r^cCv>~z+=O$w1S!|JYCKp6i{ySs|Hm(`nw*oAx*h!JDM!d!upVb0{ zeQt~1CVO=}d%|pusk8VQW{qi|;{8tg&5taRv at 4mOF3L0%58W3enL=SQv!sKZ{E3jP zUIuYgRiX=bHi`WDw^sA1f*Zm_b5eQM$hpzR;vbTNGNx4|{_86=RpeYD7bgjeVj-fk zY>_Y4nT|in6M0!08N9PHFqO#z$W$>>RKokMNC}PQX|*G7tZouXZ{Tf_8{5`Fn}M*_ z^QbuS!@zgMm7~kVP{bEq2CE97b;A%kgQf)7f-!+*GlWv}RXD|E z%EAV at TVg~VcqI#X5BS)E-V#R1{>yFd8dWXj#owskt+F`S%GDA* zga>eBHuJxrbv0?4)oRq-DVe!_pvh8Q7J?;}#dg0?df)RIrpn9zo{imJ&fbQVn+byh z{@|Gv=UiTQ`0jFbt$TlcTcG@p>Hqs7KrF%A6 zuwvP!TDg+wv|V*t6kDv<*E}W;;%psHim~YIyG;HW6L5+-*&|3Y#XRcosJIU at 3@P}t zofW-rvTY3&+SW3JUy=;{9N1sqH$`XExtz|Ct>Lpn8gpqd&1>pjo|1Pq>AA5~=m at 5+$zad#-r{3K9*R*0c-F9m%<%?jPB+H8^#?^O?E=Lp>woU5T2jkMHj{l z#%2(2h2KaiTXj9Jz2t#ME~+d?}!ekCi)ylEIQAnzg67j+a{wwg(Oy&-+(ixUAP;NC*Aj^d z&+OdB5meBojMvP=w%8i(Qt+;cP^5e#MiTSXzrQ6X7=!h#BRTV4xON|;+dJ(7xcs>Efp_aWAMypw)?_$>NDfTHA&$2(+Rt$iU}ui(2Q#K>vq4I;8Z0W zfiR>WXh(D-EM- at AcQIv`uA-MvbR at 1iG79+eua^?6Bopnh1c;`C1F2kiv3t1f0cuL~28tEoA)m#d{QZPjl{N^==a z)Ae~7GZhx<0b%Yk)TI|d>GdPctw^UBntPI(Amv)Ziflqfvf}{$ydyZ9tVNWZIGa}5 zjcUni#yo%_b4IJ=&wOKKXt;xB(!ny)LULk;699aeJW68&*OeHMC^S zrG40#K1Rjc2^rY}E-8stG7Y#*jLCGxZSZWpA2_E)Qy at 0= z`Ix|ZlhBnc6dLlvXDqFMJm}){j)OC?YSV-rlS^Y%_p>?l`rdI7fr0>oD#O!Z4IOgR z)68^&q$t#81XUSvhKOXYx-^$kyT7b-;!e)!A%R6%#R^rxhNt|F+HtYkSn3X3;SSAU zOhm)J!2o702kvSBeAXxi1vmU8cl9tyRu-Cv_^>hJ%^?VydSLoMn3B2RQM@`3m{)6f z-lGDfkiKT5AtK9MQ2MZ{>Afh8yx at UoL0Imh#ikW1St?dy4?A~!ud~>Ua)#Lh+uvpr zbPWpI2(vOY)~1uiA9fbMF!qH>3lpR+^QdkU^he7=?Coc)`lysd#&uMkga}znt{(n- zhqew96i3KTEn`{=WhPj#oCMi9992gTDf+tAlapYLc(9C(HRhH?flkRJK7<>$YP6KV z)Unc at GkKFxad2kI(3eLTJuWRXmYFCoj-%zN?;|~&QP)iZt}qT(Vlr>L7(@wVv)#RV5I1T3!YY zI;7+)w~vKk7yC1 at odsXNMz?-X=-8r=$giR3^y@58>pq~HiUe4&7KZC|!#)d^`KB`E5iKT876yHA7$N8yB$DOfcZcf6cBLN} zsq&BhP~;KhO`dYUc~5=W#m`bK`AP9}jGeCd-E-+4KXC7q- at ipDK1?7uJ43}7ZBM=^ z>^6VR+pRI}^jzk73@~`hx0SsxxyE>WytpOpUgw?}vAW#2xw!F?zM9P%u?lD&uZ`3G z(qlf=Bl52sf6}_wCT#1f&bvALpuf2EO0!DtMKG+JT>jz!wqw4rH%n}>P9v$FL9u-r zo*z|ggzr%O8~qcQDsHQ_Y-xlsFC`z6jFo|~gqq4pPI z-Pm*{_eQ&yi^Zw;((e^i9~;JjG at jX>DbyJ^Ek1%Is=*$c!+!m*2yO#n9;-ffIy2++ z95W3s(iD>j^EzATSs|@`=yUe%t7S>^%rcABHkquM+(v4bDHYQ9YVv$Or8hVusTyxw zmFVidk6b1PmsYBbxYXz|c?20C!-PzV7*T7BBhRbXo>#ZM55-;}<#2N#HMVg=RFDhZ zq{5ntCjPv at 8AiKgY-3{&;(X~5c3u at Nu7D?L+D20=6`+}G#ILb?RDo%P|{qiB`eY6ylV%9MsP zuENIOMk58vbD~Vv3MzUK0>%T&xOv7TE_mpnp~$X>-uc*Bq^#rdghEUb27%Cir5TCwXuv3A ze10v(ui*U1vQ9$paYKYSNRYxIK; zt88ARCeBmPyDAby&;R8TZ at eId2Q_WvrGLZb9eRRZ^BF0ZiJ}VPyiYr at vmDi%`JmMZ zKUmT=w}iDW%F2PiE&9N at DLUD;B|fBkS at 870Ah_vTfD@_BhEo~ zX at CUVNSRoz(S#|Se9Qi5}F#5 zZ{X0>Y#{fCYe}qBAT1CSCNUST2#=I*46e!Ac6AHNU!hs{wCb_C>z_~Sz0GG_EX1?Q z!_#y2E{{cs^$S6Wed5XbLqA=P(3rt@%Cq~{d*l7W_x3znM-Q?V759ZXGU)5hNPK|A zOPw$K*NE8FFc~2(DxPVi&B=Q#Y7IO at _>dSn{Wkwo8>QeN-Cvm4hHrmx+IxjlM==i9#Q`Uc_2Va)>k+m2ntM?qQz_SUzekAkp6pG~4*L3e$HrAwxxXIyx4F!T#)Weil57dMs2Y#d$n298^R*LqP2#Kimz^h8^kNU-%g&= zL at M+NtEzZ3vN9zqMR5pO4j!RY3?&SKB2+vn!rIa~zl|dcoAiV=XpS{`3|GcKT zWt>Q=9&886b!u$uWK7DH7_HQdC7)s8S%zuZOaXO9@|W~)j{4|0l}rhX>@c+j`#!5l zc4=k;Y0#(&3`+AYhALmt8JJgKW!PR(Xhzwgolfn}-!&#OGq{LY2CVzFZt)NxV?wM1L*SRZu$#yIx zU^^+!peE#;+zx)=%<+MbjPZJ z*d61- at yxP2y%%bwxPv2>lKpcpKN*Ad7X%?Dusy%Aj`nr3H<~HRu(-+gMFwzSeuMO_FpEu+jUg7oHa>vPE=`7QL|_oE0I)VucDN2EWYLG-!?NP^a#>E zcGGbM97~HAhtKiAoR`DzVt^MN4C!113 at fV#{JhM-(AKfWiXk9aD&|#w`kf2&w*KVM zwr_}8MomN{RwrN=P~(R$xVd))wIpkgt6Ty85T_~AR*lZtEY7i>KF4$5GcHS>6M>P< z+KY?MxWtxBi^QH9i!VdgCCMu1%1xmA43E$apH$cjPjzHX1Y7Xc$(T^xBww?4(p-Ta zjZo_X(mv? zlkIj%Jzj;YpKU50>RWOAUF?RuL38I6o`w$n+FQPe-2shVl@)&bK>Y znVK2gWk$GD8FP~A_22l?6>6pze;wGVzbW}L{PWo72LI+E(NuoiE(&_0?LbAF8 at n2E zZrVUk3yvedK)i;TCgjq;r^1T}JvAUe0yZlQ3C5{0r{3>rMw*D5C}%6O?PQ<_rXV*v z?e2YA7sGY#z=y*>_?#MVrbp8g1v%0~bi+0G+xhadWw+hrt>fZ5Lj+{K2bf=MVNK22 zWOHr;+uq-1RB$C+*qQ?0xQlVh^$-a?V5$()Y6vkTy!0 zWLJLriGC`f+hZlfZjJ9X*5%ME^>1ABcLtvGfdjaU^SmDr)C3vSB5DAsAaLg?fe?bA zOS0AMA)yj#3JBwzbbQIDFNt?1AwzHR7TqCbWQv4Sd7Lpb!~~*> z at T0nez|rU)S~Cy;nH at oIC{@(D zC(s7wR=Lq;ualMb_MUohb2~5p8QB%l;E+R4o1sO=nf{i=!U0X|7RL3^Z73t06h_~F zd7ly{k^Yz&a|p={e_%e+1!2BBYlqHQ2j#1*Go;u9va`ht<;&_I?uOxC`=&;TGi@{o z5D+uu|Mlpp;NoZ^W#DS?e{@b&X}e7^#Ba4?k%$6q at rHYQ+~Z?%Pd3Nw5epjCmJ;q3 zTuu1=q2ENPbaZw{aFh%Alq5YbD|&NQ2v@^l;+b5`4Js-pd;;J08s5Hm+N`6&Ia4S!oiN9dZ_2AW{5P}T zFb9{C{>(w_T at A+ky0%Q-i}*Z$tXCT$nAfMRZ9mN|x3>>qZ!!kejyyB{5v(%dX zN8V9FeOJ7t49GSeJ4;e;pvtsnVsidWIFGvx-UlC{Br4%mjh0-25>;x6at_onXXEv^ zC2Z!K`)MiYpwJzdzJX5U8jDCP at n&}ra3eL0p30W5F7=?Ql zcF9T=Qs5@>==f#rpE#^NO_y~arpeci)sW1dggQamEI4NEBuI_IE5CiGFE+BAsg7tr zTaLN!!E`;^_AJz at M&#@`Lg4`v47m{07R>N7D$unrE{BVm<_k&V~C{~(p31J-JVT{0(5#Bv_D54VxG?2Z-f z))^n}73i%}t$9K;{gnykn z1XM2;>lA5xKVsPyhvc|k82K*M39|SxX>jYNF~F01SO9~UVaJv9p+HzlgUxi9dwTF29C1`W5O}NB%|HPO?FCj+vWhF#^~B=5cGS&)TLai(c%_g+ z^Lh%?!fg#JH`%PdIlUxy2|og#->_5WfLXm-3bOC|z98W*kV)9_nplRFSKylfI9}s) z at 8VzIDvzdE^!$}8k(1K$6InP~!&inrP9Ksj?Sd{zDQ3xkUE3|!TjtU#*=89PH7l1t z>YMvuE`k>tygZ<|b(83Zg^33k`A}8X=;#pbs|izJF)+oNI`BgOtXnOlMntLz#VV&IR)(_6_<}?8cEB?f1fBQm2HTZqUtIaSfCfTu^mgNvnt6{|03rCuc6y at WhYQ zf2IpXE)kIqCPNDT5;JM+Xeu5V^g&ve=lRf%Dm7oXek?H{8dM=D at 4fL7FsFOim_&ij zYx_~oz at O3_vpVJH3|dHNxDy)WYFw%I!0RJQH8DPd;<-M9g-vVYp-!&-qYA+suhLSU zjB&5v8EHHXcbE18^epE#+jzP<&c029&Of9IgVk-PKRiIaLR(!Vq#4R&DgoCp^fxqw z+Ll=x`*K)G+%?PZ>XW}aMAlm46 at F9D!uMTYfkke^?G zxv4CUaqyb!M8F4429^~o=x*tuYO5r-BZ1Ec?*yw_y$yQoYO$vp^DtKS7%LkE$6fOfe3 znpx-!R6ucQZHfWYBWC{TlgO~h?dNaEL=DD8ok4fFD|x~IX39zjgA#uIC?lqLAX~hl zY;i{T`4r+vz9j*Pv>nt$cGOrIk}!Uo`E?TI;26^RGt>D*!w}EVEI)cXVgpF+Pw4AQ z9b;~wN4Oij0oiWJDAA5rg@=6iP_f$V`_hkS$`3hzo|wj|ecAyg(Y2z?yj|wXW1mUl zd5HyUOFEG$IX#`}H`u=-&I^kbDg*`uH1>}v#{W-<|2x8JT29KUsNb$m2xSVIv?Ux; zRBW;^!2LLM38bxwnd~i4bS3({lI#Ggaju-CBzVZe!`plY=!rAf!&`sO=naQCh_kab z2)*pPw6nbW+8z`M3uTd!scat&FCQx(FP)ij0>7W`Uweqo4A$=3F$Nf7-R>Y1-Qk8y z0rz&xQRLlJB1}xt9Zc6kTQFcKhVIg^Nrn>c^&pZ6a)uKj78r6&m$7#+nj>Qw=L6ZP ziVsLd_4%2VCg~K>-l>gode_V5;+reIjsy}eZ6UPEJ!p*Bpir-vm%nOTx-ITVscQ-rI^l@$>_ zqULQUtoIyn0o(fYJJ=neH4~7N7!%Re6qUL(- z^^#ko0^tW!r*LPpPuIgWlf#O9hB9K1Zwf6_&Uz8zw6U;&0y(`6ECMSYivjRpvKR~N z^?x^9d;^v;6y_wVGfO=a3T)YFS(jmond~6_XECzWF_wSpE;|JTn^=0<#>-fvGP_51 zBYPnwVnf$DOVUu7tcD)izlAru9&<=j2}ji(bQoK_{eBX0mscPZWjwpS$|{GO4h<^q zG*d<>0*ypRzlXI+BHLbo=B;F~6pdlVUT_&yqKi2X-dBjJu2c>AtAfR1m at cW?Jkj<- z9-Wx6Pm)QSF^cT>J6?4z)RkJH$k+wzv{NP$PGF-&e#x5c&)p;M>>v6mO3oM!j2TMK zs5Ufbqq;vOsNEn^oS3e*$Oil5HH1OcnC*d1V^rxuCj;GqywI at UWeggj^JVJSZ>y%; znq+t^kGLt(*8ZYlow#OSv&SiOGfv at fkE|?dEm-y8vtx zJS~D#!S(0fMMI_H2!}yzhT{r;Pan2sjz~~m>ODCZgMbSS#jN?5ZRMKpFShq9$#>gH z$|y|NSIgGp)?0hxjL4x;a-pOGWADTQk0yNXkDud4vp{ae=EaR?n`$y=@lllVId|i9 zq9+2~)Y;$q@%*B)k7USK4KO_O#Af;MHMa{AU*d`IiJ<1C^nrsvK$qeb3z9|3&@VlgxixHgN*xMOAY`20Z zeKB0MjB>uz*G#Q*ChI9u_s>4hJeM2Qi4B|awTybQss$KoK34v;NpGLb;MwoAgNbh| zm7R{L+pneKH?6_mx#R|9>9Xi%3xf1$V<%`D^}HoK at xRin1O=n7^wdn+x6LQ%_<8AQ zn$ueq=0{ydT`^|hH4<38)NPH(`E{*<^K94- z&NDf;#BS?+RoP6lbpn3>09>Gf`isvRAtb;3jDYqV}yq8fe9tYsbBQ zAsx7jq9=aT@OJc*g2d`@$qggyL0t0NC%GR0 z>%RXL4TKh1KK;V_5O(D{)Z7+>GcO^HG at Hr3$-dz+8%gT>erpEP$8Nzio~leA1OtNt zOH+Y8Y;;FeL3I!v7EMMqRtcOIXCfYH4A)SwR}~B)($rb8W1v+>$BJE<3hUly)iJ6W z#tBt**suz=`Gx44y;ls4D~do5s;jYsYVeV>VA5+j=ZJ+hSCs)KK$I zR`|gARJ-h|aXcpLvplw)I<{$xA;|G-xSE>{+qG}OiW_a3W%oD5C0sB%rhAYF3-~=N z0cerWn%VEjiyn*Y-L=vg#mV-RaCsUkDU}y4d^#o0wd(*)d=Qc#hsf3`FXPbjW?6$Y z4lU!Mjjh at Y*F`I)>~(1`tEb-eTj&pUk at LC1iXH4wO zX`7~Ej^v(07#B1G9?U{YwaTz*kSb?J*(35g!(c8dSmCX_93B%3!=|K)CJ+;TpV1>O z{s|@Kpr{w*!+(ywn8SEJ=7?l`^qcULGZySsBlt7CASj+C3(`&)9k?LZ|B!XnRi87U z_@<11 at gdyLP3jRWS?2jwTx7?WLc5=;AV&py3bbZE7fec5F%dF`WxZx=g*-Wtm4f03 zg&|>z{AeBbiybKkhGJkANivuNfBf>P&kyEuJ4R=Ol*yk at ESaw#_!(9585ZS|OD-wL zh{2nT%utdza*;EL5zQHzDsw!LOM$}F!q|J5Wo&^~7=F5C|u1^M)$bo3J*9jTIl~(@S~cWbL`s{3P@%Y z*1JbE4L>Z9fzb6hil7>_0msDO3!$KA3HcG|>Kszz2Ah4&ZaVGr`EgP2bHAXl1Hv4s z!91WGnu`jd%#qQhe`p*FF2SVLjv$IOV?*^|7}g)$H_5P=y;F+q4=F1cuvANb?hdVD zy8KJcu0jAjmGH=DT^Ii0fQ+FK&j0JRlH%)(xQ`ng{O3?wAzET+?OlYF; zKixj%5)(UBegWBwLP at dBq>cgr%}8Vd9rkl!U5axsomYQ%<^Oj3*8jS>en)ED#x~?a zf~izmZpxTdRi9lRLyV!&4=dG&WIsEq&csiiKT|km`LhL8W{5T!Z;&?hK(!20(T~9< z5=r%)sGWS7CmpKJ(&Va6f%ix0(({yL-*lgF^;2cGq1y~rB}-20qx3h(rjAOg4|&%b zqUvNg1<8ov0 at wmHnYYOLEQw7PYf#^2obGkk8!@mpe0(RgT%CIj(J-bO1FvO|M!k_8 z0L5i$D8}4eLnZ?5dW==`cBzaGPlODE+4b7Wu~Bd{@>5;9>y+*Y&_W;=V1v5$QYayT zfX at D&W8;U$w`!{`++v($6a`OkxDjC_? zOOKx3dcf(;-HCcjj;49MLHAZ3TD^9L+MT_U_m=1%{nPC;V=6uTWlOpC=8wyAX?Nic zw!44am0T at Dkk?yw2*q2mUmB}^=YyBTS#XHNTbbYF(R)q8Y8pmeui<&LmtV2ax8CG2 z$kuc^K`t8wMl&|{Jdmj2?mA&NlOH#*#lst=)=t*3x|#H5DvRgzhR8~vQG&el0{=@Y zFx0u=XHW3o+&+(8!zbVL8y6^>kvmiB;ljWG)1(TG<2LCIr&t=FWd6J2*m!lv9oMBp zE&ys2=}{Q5<^A51(N3y0vx`ckP%K9UxgjmXq`I=aqvHct9=5(3F`aqsQxLr>yZFz3Z-e0+2^B zyyB+ciPwTHIi*>!Iph*bbNI3)!T^qI!M6lsp5Io{P!n0^ioP*nfR05o5%jPlX>Mvb zYNhS{-#Q8IDjS>1FN8{fF31wkYa!XE9ntpM4wT1IbzczGH at d=!n|j$dK37V=cr~S7 z?`bKoX{jz}ng1>KA^lVCdol_J=;^fUG+`J--iuf0y>$HgdIa`&1H)!+W|0kMm-;Rd zR9YgfxBwY<3J!5_AycvnuNL--1PaC!F|>8YqjO^)daOHo+Ql~9PgaklL)uWz0L z8)7d15&F!*;oNuL({g1I9w^ zbsfFLDZJFw0{w+H{?PVe&HW at Cyu6v*{t73fxNu-bx&}+v!+`|94UebDv$UgySsr+$ za4N>)JOgSr?xLfr`!Sn!ex>q`- at 2OQ1*!#DljgrH1${BdS_{H6Wau2?e~j>zdInlB zM5GW!E(7qAEO1i5OAv at d?)$=yA5}dnpK!Wd5iM+r`doU6y;>oq55MIT(l3!mi}Oyg z<;ODJ9%_5yqA^DJN9JQ=Bl8TdXO8cDwO0j at ssc@`k~HfR21Htx6v8lY7y{S!se_(!rd7vSF5U;Q)PH5*LI~X zoEDcjj(n82aAziA3%C8mye=vVen$z+C$-NTYQPiPHphZsAMp155TCbd4jYSF;kij_pjf92q zU6EDB5fm=3u*i>x$@@>CPs-R>`JY0c!|Nn?O at n5y5v$1ym|f_L@`=U;i97k6XYxOV zJ{3bazG=315O$?SOeoe$!BKA at g5(d}=--a`pFFvA3+ljM&-~$Q|M85_U=WmXSXdyS zUzq<5qwjx4h5u#rd3bB9qJ8V0OlMNrw6;o;GyUF>BZmSALAL at Di$lPZnpw$gkPCb= zy2%&iOb at 1{H}@7QMFmA`R5VN~%te1Cqf1ee1(s7PDGceXqoVeM&F{|kRqu8 at FlUr1 zrwU#7-0V2bzRmcaR{Y at MK-2@-c`za9y&R}vo$Rw?*}fEDyN%iZg<$C2 at 6WOIUJSF_ z&qvrD(UB|n>yqb|uk`cU>*wZri-ky=@NPpWY99^q@@Yp13!eYN$9>)lrzN=E7sN$t z4CBRgIy4}daF7WVH|C at tEYi&mbKvN`5GKQ)96o%_#gTsvzxv?+1QJNTqS$^-2*tt! zxeH!Sm%t>68DEiDSlF|R7 at iVwT9P22F2)g9QP{G)jtoBhf-*8EL}o9XzUwC!-HZ;mn0eSxY%)|WN5XB*U2X(V*34$R(QSJ*vV6f&*JJ(=8e=87+252h zw`UnXM7-h%7pt#Y2HwN9V`iDYgB_7^H5k-mY8W(+b1dg;m2JoqBO=m!CA*CsPRcfA z0XGV9 at qT#sU9K^Dtk0{)ksJ;yRy_vKqEYrJO~1T{#h3^}1?*X06ltHs16mrob?c9{ zWBbg8Q`n2&T`cw35qyhm>c~0KV<9<+T{?imdR^ZLbi*Bl7nx>yTbHIZaF=c(VhDNy z{d`-U^*<;(=ip46t=(rb$;7tpJh5%tw(W^06Wh)c+qP}nwlOiz`|h((ec#^aRDJvW z(^dUfSM}ZN?rYVrueETaMDmn`$n4y92zN#59!NPD_A6nu(!1mG zGPR*1_sY0`EP*_Q?7dGk?#YrQucr1%>Xv(^vm{m#L~F(g){`}n#7E9xMAd3+FjYwC zEL4r}AsEN!TUs`sW3VUGdZ-Ofx&O6GovcU%Jfb%82`4)jhk8mE60loP zc?F0pRQ|v%@CK0tT68Op at kp`|6tj9plR%OsiLu0nf|K(?M=e{~O<^&8ebS}s31$}J zCY1IfNZwnK0)AxXyayoAX$>8t|3^UOdL*8h?n3CFWmgR-CJm{CtS(7IN#;zz%PQnX zXMdbUc3P}RhUZ2i7qP12!-OOUw}mu*6Y*@@C`#NG(rJw31Cz#gb3*HrQw=(fiWb|u z_#G;j*%B=DV}L5#ZO}XpwwW0Psj9tq%BuN2&B>^OjqNp?QrtkV0SbKa!Q;q`h_AY- z>1M1Y@#tkCXeS%@j?I8-sb6!1t|7xEtE;*j8L3y)ja&Nm5I;SPsv9962`*d0=-A8s zF*E$nQp4Y{Fs2$Tk~IR5-gvjWA}bw~#IHw1Qi~pa$=ID<*sSK{al^Q{(NaP2b>%O& zsOT-XDEwJsodgsnCqqB at m&P5w(V6J#aoea4G^>%8__Y=o!J}9XsZg}uMiNZ#72CZ} z#2nu^^JfjyoBWYx_dOi0zQq~JD#JrlBj`ZtpU$vuX z_x))Gm%8{-fd4bHyXCfx!0T51F`p{>aUZVZbZGninfsHd?yGcnI zYj&ciTFC^IAwgZ8^pdd5Uo-M(vN8 zfXzMz5-V=8_+(BAoRU--v3I(d&log$TglAvwG1A>B_0m;dIlB^&DJ>g z*+eguXu{rH8tGW6l6Gn(Lp|;dONOMkq~UCuXWFf%1ia`f2Lp8H(M~LDeA)g>FRiLh zr!UuwRP_-vFh&v8n6I0KRz*MJ*@y3JemmkNlVmWCo8UkW&wL4wLl~jgr<+)_Z?=%l zx;8PNU)1jh?f%7}Q$-E^@=A)clvweGPLd;Y$n=haFzT)ISap}3=1$q& z2YYWNLEzQM(@9L<`XMEO at jj-ook9G)=Gjo;jOGr_OfKof0amMm5VLtEKa8598oX(x z-1yl+mjd`0%r8Y9wsE;BiI1|4qQu`zqglt$>#P**ZugMAM~?1H=UO<_gV(HvQn=C2MLk!) zO_Wj1onvrE01KP at OJlAU8v`ixf69n=dRbLxeXznk=PNqcXtEzn zGZraO!P1!w&NVReq8FxBO=zCYrc}VIDT;AoLvTuG{($*J#JllLaBEw6TZW-($64Fd6u at W1Z#0Zh0yAc_{|=yG$Vk-hj;V zj`VN}QAEuOhG5AJC(04+l@ z8FQC($XugffM2EVhCF^9lDSE7l9yUc(?be_4 zv!%=5ia2$Xv-p5Ph`j$)$X0n4PC>)MWH;0xW*?rMjM$`nXk zQMuT0v?}xFS7-dgr$*h_#AhXwE`ocNdmF=CwY0W$hSsQ6xBX?hYBJA!Dz-Ss?4?Hq z^8nKx8}o;hX}hgX+rf05CfmW1e^l};(6A2qrtS2#UsA?1eLpK at jQoHkD`w7DX(y?< zj>mW?l@%kUT4 at D)6VY^=R4Ce7Bej$T^w|9sqp>$(35}v0>gCh1IuVzlW+ at Z;I86sh z3yQ=8@~&=4N4p0Uk2>sR*NsDw9Zw|DL`gor-hng#oHwv|w~}Acw4 at 8_Nn1R*OBX63 zbd8Hp1qk8F5Wk^#htuNcg$jQIj46o(E#}6`lB_c+m)MMQo2c;a?i^An;mZxEipQ)p z3V+M{GOo6?+30{H&k%{jRmupwch{JerB2Q?0!HQ|VHv?!Oe3gjjKzmtB1=|UgKu9I zwI_5pQqmVOv4sWxfT{bg=87w9sq*smv)&-`&8R6~mhgv%M|qZUqAmtT at 7b_HtSVRT zMy2O-m?JOfcobVQax`*yuOSv$qDwUxlFz~iHe_l{vVj-?XJ!A4!8L(4x zTV5dFugLx^r!Z$O^Z}jxm+-YgnMN97ambid^x>x~V88c4(iP|fts;gIyW*802dL5w6 z9eBEiv=k0;as{DSghw{asMF(-=0>|oMEy*hc7jNAgXOIzYJ*l)#Lu!c(h4gI<v6 at XGV7J3>wTGp9xXplMzOP)H7U{S z-8H&42Yi~m*`YbbZ=H&ULlEwu9d|AvzZ9C=;o{!nS+RfOLFlql|B28=4p07cK0WZ! zp!eC;df$zM8iO;B^$X?8?&?UoOszD%U!$Ddm>|NN^-L}K-+OVY4uiLx6xV z{!b}|pq+`6y`{-N8y@~MwNO!1Mo~xoWE(XTZexKQvO>YGC?N`^L7&$Gi~7dG`U4Cq z{L&@a1S(?G&irTp48_|{cF8u9AOCwhL4|#gUg}2BAGd;j+Tv5!;P_*2OWe9 z(E9jmkIowr5yWUM5rS_*<%FWno at yDrZ#!e>sB_AM at t%juC1DVOP66=%^@M}iDzuZ;s|xv$7_fF{7S4VLOW zYnomS?fN|Le3K3o*027iqHY+gLAd-!_bE5(OS6RbdhrJxt~Sfn+4G|&u+o9#^x(xC zHV#I~-=-`Y-Vv2j<;YIrNwk$+#TJ`3srXp6k+$h2on2ShE`5N^>~OB&b-VCq)_JB* z%b|J_RWmOf^4+K;Yd2}@6}Nm#3m5Hyr%dA}nc2v4w2C(4j6a<*gDDqH%FIVHy=OhW zhY at +);Puo;v5Jl`Sm4d7i30~TjJU%&{@m1KEi}6>f1RofGoO)TlamTB!xB at i-U%11 z*qP>#pT4&9B_7n&sp_?UUg8)t%}*E#H6=!n($rVRn%=$|gPJO;2MpAP55EX0mO9nK zaoX~id5|t!wadKQHBzZ~5q)=itA1U~2!gjR3VC?2jljL{_WM+vR^X<!Np7Ced11}GJ+8d(+$ob&fY(EB2-?Mn~`qI`Zw at fRsSc-_Mru|EmE zK^iV0_(Y}PEZal{_6;|b8nDXJNWuLm{4`T3@`*nuY>SWo6^!f=CDEcE_e=c3kYiDB zdagf|RtDl$W&37)GZF#b8TpBg4 at n#oQzhPBJ*qn|oBye!}w+DG at hcv<;d0rfuUbVi6 at gm3cWzr7!|kK{(T z_znVc`U3<+=zse22wNCB{RjAR+-_YAm6t>*Pei$DU&HcU>D~dQ(`vQqk|ilm!!%Q^ z at eCx%I%g(48OstjoP~011j1#R?iCWzWL>oGmRQbjKti$q+*gc`bQCY$0U%&HS1499-3m~T(w&?yZ{1Wwl^UK`-i(k4(^wHTj zjf6I~>at!IEgQA`^^vcZqE~OAud72Ba^IXgS;6>r(~40vY%~O^xXlI1|K^t!<%I$Y zfAh=ifAGszE$247{*HdpVpaa-3O{R1lxiiR{uB*Whmc&3P-r-mXQ_VimVzB?I5h8k z!yndrx3%3BhG557!CunlnCHcrk9mfiY*hHtg>Q`yV_(*$8eHu^Kc#g~einG4p?R|S zT89b~&i*EpER_25=fG28Tq6_~nMlPa!Iu=eC4D%e at fic=9l>b~Z z-J?h70((lO>4NeiaaWrS$^Uy4q&qN{fYAlt=?HPxc!Zd60fj--`4TMHlGKO4F)a(@ zgIhU|KF6d^nI4JrImQ7zCCE*Qib35ns)<(NE;U}nLT3d3Fd9BLvA~p*NdD`$2^$gp z(aF!y6DJNN-#`iCj<5WQtPUSQ&H7t$q@)qZ8 at S>l%~b7ntV#DiwU?i@$?=M?zGRq2 zeCQr_6^RVEu2{HPodNtpm?k!s{w-)73k(up0Pb!<9FyfI=}ZTDBL1{V4AS`QHTc3u z7hH=AC{JOiF}g=KaWrQ-RJcbs8SyQgJ|e>l#Q}j>NI}X>775*#Xz~N>?V58poXA(=GhJ#xei84B^0E>R}uK1cc*1i{rn?|BGHG zscS3XEdPUEiW=FD>)6zQ4Pgev1_s$0Q7|H+3`Qpz$;il at wb*G6U at yhFg}I4Fdf9J~ zcW%?$t+nlk91S8|$wZ|UC0Ocn&kwt;H8A^}JlxF{>zTdAKYYcY6A84yF$0|+fnVNV zPx?RqjQ{j~MfW3V!4pKSM;eGjn74|CNC+wSW+3PVt$^%nDcTjyfT^+s11CsbU@;sn)U1%4G1ve>L9 zvr8$2jjw)Mf?F-6F{52zH`_Sp=>S=!r?Kk6*DSGr-htU5^68&{?D~fxXK;8udcujRw z_-(p5&O+LV2in)0?vD&39UtRSmIH9tPmRdY4&V2N_9jXJ;O7s zA5>i7v3 at f~<}bO}%AuqFM!6d_kuoOMnvT zDB1vBqU|(wI;YpD6CfVH-gcOor_9*tP9PJSX$hQ3zWc&7bB~y}79a0}W2|2m?`^hl zAEeC{_h1(@n8jOb*!-p}dih2ZeA1P6{+82QuOGwZuY6$c))c?XzxwPMyQ^v!hpQ{h zo{Hmjt6XasEOe{>xyiqCeIPCDm-sNiJHzTu_e-~pfICd zt-3h=f$m{H=UA9DM{T!7R42{0yW|>UmMQd`P8Ep6){3Lvv6Wad at 2PSp98Cd*!i0`- zI8NO)%bQ{CLs;7=&m+U9<=k-LX%?3{+HAU|Szs1du^-Ik6Cf*!(doL6cp^ZdqNNNs zd(JdwN_rgNv=xGno0noiUkUzdL6F!gxh6Sl6=?^Z-ao2B_-E-mC4aJ!B{qq7&O0{T zm_38Qv=_BMhs-v1ER9-;L`y!O&TkWybnSQq!uZlRNYeeMTypL!l9uQWhzBQiUl`RF zyuPvZmC|?o$uWY0WRpW*RcUEe=?E5?5wr~S9NjaNt|KBY!%~Sm3dp%`uAj|i^aB)Q z1Y})$ad)?9JpTK9Lg{9FD8DD!zf_!+RqT}v-`FX_VD7CV$kY+Ff*yI0AQ{3|CT6Iy zuWav5^+(UT7oQs{t!#1dNybx$_c>1U^&f>7QeMIPnjQRVmHEZpMc2yeI?F9kn{!L; z1vZ5~uUW%i%feq7B9TfhQ01S)lO+}Xj#NZvb6>;7_NqyctKBs!Xvzm32xbz02e`_bsK4Qb`(G at ygHTPaNVF+1GW6ud>U{(J%R8hqGGci&B?J zS7ubEFUdbYf1q|#S<$^%K|Ck#qQgc+H*5%pjL)kj?`Kv$#Nt2d at PsZtb)!MM#Nq)k zztcK3^at803A~u4zeEo071)~7ehOQZuee^ziqKa&?=kWTFM8YO8xPQdi6+LIvghSN z0rCoi72C!rqs+aBV&C%7?#z(k?Ya81gFg(f)f5MJ zIU at qgEs8st_uV!RMc0TQ{0&4Y5665!5Loyp at MN$+LINiwbeHH%1=l;tw=;5wN0X*x z5C0E<LvuJ{_xzD)dd?C__o9 zfM@{3Ev!E=`TGe{z+&P;$?xhylj>;!h54?XpP;V=H&`3DG{$$bEc!;n!RYuoraWk! z9sWzKA at H;5%Brg7OO#E;>5ml#_Ccfs($T-uKi>7v{ar)}-^lSE$$KGa^hA zh2Fr>Ca5mZj8%iccFLiY&iTnV`?{^^XG%k(#x5~e_nOS1T!E7>Hin1Jo(DP{9c1d;K4x9?CFpJdw=VLW%rc#H>xbgz~49= z!pHF48Qgr%#o+JLqgd!R9>!&AnWbufYN-`F^6G3scxtbmj)17qPvtoo`o at kQf7q|b z<4*vyns0~evdc&>cH4qs>Mj&aVah?;uZ$1;&4}T;7w at V&91YzZ^$OPCsQj(aDl-Z zDS^pxC+tDCr08tT)vG+dDc+lP7WV4I#2rF3JhNR?XtU!m6a6vyxY8uS zB=oakz{qjDhS*WDoi0K;63V~LnVv|(lwbO4j=RfYLuTkm8!cr3MceXXGVFQB(a1|% z6vCX~Dc(rj=q3_{EGS16>EHoSK&EA?SiOtNoQx}%YC9B*6s|!+r92m(R~<5RTEprJ zhqdeQ-;w0ze at BwY82vv$@w6jt|A{0up_nWRB;_{>Y6{Zi!ryJc;IT7>-hxSHYtmvX z(q$IXxrl8YUCtu8Sq;Vs{-%;)D7`air!kVS%qAbov8;cZSQ8dZ2W|UPz at qab#3o}~ zY7{kxaHQ-lQj;=cReWwQ%~p=oXEJhE(z^f!R*CJyg-;_h?%~U3rfZ44!gK48nk%`^2AH|2yrzta2c#Q?=zuZ{A4+U+%-f+Kfg<#x5 zXnxEF at xR=dcMO22m=^Sf57Wd4h_O&tP^WXW+|=p#4u(`3P@~m4Va`gl5N8Hc<$~|O zxk-&xA)p8Ax-W*-!^>?LHHWT;CqMpT2lCR zm#oNH`t)*xzU8)yM^M$6@{d1`4|X(sbkz*8jWMn3-0e%v zE=`P~>HNL*)@M1kDhLrS;bB%~m>6a>+ZE_MlV()%p}1 at XS&l47Sg5APJu45X0m4fX zWi!VRb%`E-WY&7ry;!pkmGr`E{q!r)?oBR|jOd*?4H2~07t23fwqj+Gap;7>H7pk1h;>fOcY5 at -4}#W}U8XhQ1N z=IW-7yA&qr=mYJSFGnW%P4!#Nmu(%m9u?mM{WN3s0lW_R81pya2S{e$Xl??j>um+` zX@{XRJ~TT37k}dCZcLbA&HNS|qnQFKrVhiq2BaF+b-F~;b*7Sf7g>!bqX#|X^qL^* zt-~LJ2d9Y5Pct3P-rP>swv6pL$w|6UgIZw8T5x@XeXv+xF)gm<7=b^vxq`H=Dpw=qu7<`+2m3g;=@}UxU=RT zOg!X=6kDqjI_sA2tzL|_A;P$O+sz~)_Yqhv=U5Co@){VAOm^3Xn41yApDURWACP;3 zMcd!bYO*N_41s(-Gwv#9>LVS;^anHFv)0vw|B7vW9ByvgG{JmNCVFF~#lyO|1*u^@W1Dv&=c+sm17{9pp|8 z0__VI+9|*o!0D>F0Ta#%t|4r}$?krH_y?NH9ijtaOZTDcYcrGk|@5xrbvxdMzU zDi?;A`rmlcA2fVwbjr0YZ(No2l{gE!Dym|7Zu5w7NlVoShT#R4d+`l%FZ#JM4wrQ8 z4j8hr86BT?C2g;@U751c;48$NM9Fd@(mGwwt)BX8zQy>?-V!-uw3XmH+p!*Zzg2+o zRQpi7My|3eqvT*-mE9&4O1tJvEoBKk_FzR=>`iz=qZY7e(Nv;J6imBL`e+(n`)>7b zJSpzllybDYf~I~6OnlNZ7TbDTi7}#n^A2?`G&SZAjJQj%$eWnl_RZMd-{gFX+ZdoGx at ltEMkvTnl&?sjpK`deD%LMP at Dvvv@- z2(#3t+&`bvR9 at q3d$Ks-t0#f-{1E~nZ=*T{f{izL+GR2XluN7MicwEo zow1runX5ucY(FA-_E#&@BCg7=v`szomwK61mqsJM?Cd$hK1*+|>A;BVbDfYItG!MD z-eZ(GmE?myx;J)G^GtDwq6cCz0VLm4pm+%8L2UiJ;kk~Ic7gJ~=h_*=5rN1KXyH>v zBk at FT;A8?ssT+aL+J}l8zw}5zr2luyd3 at qwaR>6_!nJ(MAev_dEOmFRszG%XLiOG9 z7CBz)<5lRC+VXIu0>{YXn3?S!&cc;tcPElAJDMh7qEG^XN%qgEyl}e8i=(%vKuVuz zcrMTwHx?4+`&&3PKB}p0;OWu4ZHH?WnVR6a*+Gh_2ianw7muYw0$#9Pm!(qW%%r+p z*-87$k|7ky)3watM2n~-) zn&B&|6y}=fbs{Ss$;&gDROGPw-Ek(Qe^yS;*#nsE} z$2`2B;s%`XP-?iNj at nHAPFXmc4obf(8dZU+PA?odW6}l_-~{nr7Ku66K&clHjPAqs zW#GidJ?Ow<&bKRCe1Kg}(_x{ZS=?du4`PsRw_cRd7%4Sa!60)OF2||q1dKN&m!#!( zb6Pw!y}D(skN37vcOPX-aak{i{baQc7sLW)Pw)cAm}M}q6YD%CYs&ohWmuLQoPh z56gIR>jh&VG%0&)M}ts=L)tp$Je>y(>@h;#B!G`8LhnpIY6R1hN$IaF0&1L6cg$rL z+U at 4qZ$42MP>iEAFVjEG69RZq18b*HY=H zC)e~1$ns#Q)h`K4*^+Pgqb<0%bGM>;Y38>utZm~TgOjRe6t0}S!Gn(i>vqugYniZ at 04U^p)4fk4V%vpaAzUxenrs<*bSy at jR$!#lMDXgnaZk^A8Y^d)WV=^WuLG)qlE~)YhF*R58D7 z6U-7=4w2XA%E3xf$qTBMeM`!J@;_* z2XHBS=ip(Tm+!ZyU~PNPQGCD*Tmv^Ph0 at Vkm^quTAK&cEr(?dn+aV1g>^yFMY(4B* z0v&YnQ0TcF<|3L27w6y+PLBt{=4?hNx*eSX^NNt zIB|-L3Uy_`u+pMgX`x~#sozBg6*S~IZfku+Gg>mv>=x=ck&b1Av%mZm(zSGy>yuGE zc1LKa_py(4YgQb z{BsI5b+I%xjjoL)p-DuxCYDsV7`kIJ(L;{qxE!JsQy~H4B)^+fWwDI18TS(1AKMB! zu2lI7F1l?tsLlmbwpNlEOPCe->W0CV(W(?}r2SI0?4 at Xb8anh1(VDtC+&xoM{hCNb z7gg?@WXQzPs0T{QtcpyiRaQZ{%2D%Gj6yFGWWy$Gyi+H>L z(DpeQVne!quEFCL={WBf)w$bcs)F?MgQHOaOXxi7r>&~pZ9@=`HR<=_+vt%c$Qq_2 zfF~x}^C95t2?1qGX3^|y(VxGM=j2F8hJhsm2Na=)oB286DJ=8^nv68SL!gofWYv&3 zE5V->2*6tugT`Z1uI-YhQ<(!42pCcGZJsp*mQk9S&{UzebHk`OWmOq&2KF+`bqvp? z!;R79?i at IhInu(1#38_Kv=+m`tDHFzBIFNh=!#ic^H&a)va=HBi}O93Qd2b5IRb`P zc~AC-p(bTeojJd0kH7WaH8xwn#JTbpYA|9zci^m-HwvAGuc%c*sPEcCs$Jr>?I)1T z4uAxi-HcxEB{2(7FDFiD*q-jPhc;IE^1 at a+6c?oSC^S|T$5=u5$Z0OK7&AA`Y)H0a zx6}lSow0IxB+C)AC_Cq}vBac%0m&rtBM9uoF{1b)z7Yjly4B(xI^FwUD~W~ z&$>Z0;`!9G_HBmzV%i~F$e`j8K>mX%_+4x^8gpap*lWzyn+AI`m?zC44u^cB%WwS9YsBYqi(WKPhoqh<zdW3%WI2GCZo66L=@{A+37ZhRNrBypZXlwlz6w%(O z#y;Pp#)!Mr)dpPMC+YUM1}=#4wKP}LOvk#sBI^P|>0JXCfkqaYKflSVQoruTMPnZA z8ty at 9zb9w*Q%)O(&ajAluV at 6#-Vl5G&Vq0J0u)d9_1!eGaC%!t7{_#RTL at -slSiu? zA<<(7>=F1CHk1u at OaJiWD~ah52LgG=BYZD5vzQXzIp(YcMz2_>j%U`qbFNwKNPAr; z$iAC at Z#~rK&rIgo>_>#i7hS)aJ&h3!Ooqgf5^hF-Cs2}L zkWu at SV{-ptd*JC|FXxS;rujwxU+Q5l)JdMD*)Q||hgJlKB1QX4 zD`F`IO(^|CEABEA87mC|f|Dn7K0gn1Jkxh2rri4?qEF9g#yd*1EsGoS+S~rpidI8S zaO}3Hhjof(siSC_ at n&4nmRQ&T>FCPJmW~15E~~^w2)DG1rrK0zn|hvy#605=&(;+T?TO?kF!?*MxO8k{PXfQ zv(u*1L*A5iGvYPM_rJ7ap2y}PXj3>~)pHcF?R$$#5b0l9(TGDOM2(zFert=Vm^$cA zMDU54P83=!P>Akzgt%3LNP9$#88&iWyxs&$8ecdk*3`nOwN)lVA#9zqpRLn0*!k_R z6?xdg_4aZ^L|}QaDhu@%p(Zg|&FU;vnH`?6WY?3F>KH|3Rl`(y>@0sBj0&-dk|uU2 zJ4Ot_Vgy~4g>e#Zs62$?ESD2UQDM3KD#GrS66H5j0S@>@u2WwT<{Lq3G6HW0skvq* zXVkQjgR?waXRy!!!$q*3#Iv4-(I5Qg!M7jg=iT68o_PA>w2J+Is_4>5CE$b?h|?l1 z0*fS)wQP(MvkKW}(1Z>4LM4z-PB27^QmU|saQh7B{@O6q$-QE4uyp|gh~B4$e29r= z)Hc?->*3k54-U|-hDIDE8yH#c*g)Z&pp*{zk#q?@qM7HYk$> zpSyI%3Jw&>eMc;#CnsexOO(Upy_8+N9i8BuXdSeFq=xm48MbIF`yY6{q93=<0Sy)W zNh|Hy+d(gTulN at Hy`c27{^}WnDCp`_89T13RzKMJLq(VkLBj)?!iR{qu z5$&8{NFcOp1!O4j6Vdt<>fVs_y~rC7Ji;pzneTvuYmvlm`bY2j^XrSG*bB-dgI at wq z-u|u5kbVI8i|1d{0F?iaIz#^m+yCQ&xAs;UMEjC|-171GE-j(PV7O|~GkH{-ldRF3 zYGUkSEDo`1pz8%r}u|BT^1f<>=AaCzXe%GrQAbQa| z_@!4d7 at +5kg5Yrr;F-t}-*|3<*}fI(&F^@jv+o)PN4TGT;^H at R*1Y?sE}p+$t9KEt5KKpylQ(IG ziAU-_h5JsLw2{U21(FVGmHU{M7mcdwX7g>7q%3J)ys9;FOC-yFw#5q(5v<7NJe at Y_AZtrzt9rGN_7(vLPG?-erq!XNH^9p<1oF7z`}X?bV*eBNvqbKIn13h3Rz<} zK4IU3loXAMa~#@cOooA%EUDrIn})lnV3%6YBW1Qctjt!uiD3|%)DhHR6(z#;U@}qD zP!O8eyggyMrWieG(F!g6rwC|xY6&ol?RO>q)oz%YY;~F#1nWwMEC7HO;bM_4 zv`yy|zF6`}hU^|>*EsHL at W)d4QU}u47S6VqCV;Ufw85;5aA5%8=TGT zw>vgIlXU(m)JuO$v-Peeh>mW*rFH|qr5Zb62j1Q51v?&rekYnUJ`uZYhZSR;k4rtM zBORml7NBXEjq?fU2jxwgi?^btbay1#KKKc}He0mg^RCy6|1Q`|`N%}OZj;`dm at aA6 zYsic;u?mk+G_ueB18pNv4V>M1kah^OEwIfR1<2ETSg z37Axpi4n+N6Vm7b?(KQ)l;z;$|)rsbXR*Zh0@$Oy~g6zfsqwt_ehC zp3>Fq>5_~zSeua#g`28A=cuai_s`^9T~t(t(v=1aG at 3G`RJ-Nls$r8V_^veUzm6Wa zC_U=VVK#oJAYfEKQB6u{k?aXY>lVo&+EE};s~nW9OEV*qmQwO%+OX*p{iLX zgLd0yps&Zk0-%q)&O9QsTZgS6GO-uBn15!)3NzNW(=?D^qkNHx7DwB4(eY+O{+lU+}CJQW~22vELnSe~49+jD#U!P7y!zGhnha185#)e(GU z|NeCA!DffT_HKkR*wicD$wJ*9aMCZfzQ$}aF8PttUoXBBA1&xK(Szb9GUAZ2&_>Ji z##7cm{%js`kdjQ`i!Il^z_x2JJoV+wIf=eo?U%7ONjZ$JVg$mv63%5K{QbwNBbVQ~ zW3eAv5#W4;=qDm(n81%3s1FAR#DYm5eaYHW6h)6%n~!aU81EkoNd9H>X6;aC`2LB+ zC6 at ke89C9u-%7M?O1``7 at GPibV2buL-`Lrv`XEn*)5rmTGp#V3WU{>RP48`I)K(wD&c);E+DFM-Oua&Tf}? zbGcIoq(%tQ)0`)Dz0Af0Lk#}T95TkLGs(p4- at j`1#w=+$)dBnv@{QG3l%U at 6^RC#^ zG*!exYS}+N0DDRlipra`WOjEh97|)WOwD&ZO+n=c^BQWr0X6m(5^r0c+!rpvW6$<8s(Qa72AfiDc}2#5>9U;c`x=B5g%-+jsRlR0a% zJZ45aPK?wIP?T#Dl1O^d2`9ZddeCUkjWJM(m^2F3A5qLf6Z_qXVay+cBj6eFz`j4^3=^5k&_p0&RqDmnnHvQ;)GWun%7w=xf3OGAliyoN*fDd_igw{vZtl*^@ zWZXcmM~bh4;2Ud)ajoA_x7Q0~tF^^F#+{qA$*nWUkznXz#~AT@~Q>vd_07mq01QL%&B# zmb(z`$dGHpC^*8RbXXjv2^2ivwCId}{`L;)?$@A1;BKLRryu~0RHB&mclB$nD;qUS zS{aWT!1Y9?*A?&aRvO;dpXoOr5a$+ at fJkt(h?X+K+ at 19BZ{8GtyBlarpV7&{v62jy z^D$A4H3w*ET5 at yx5Es?05t7wuXkd+1 at 1g8DWS3VqcHsKUI4WiPS$T#{XI$3VHp5LD z*3B{uOV=EDf5B&i-iMIKs(AyL)D$a518#Ii-t6VYpYQ=`;-cpKMZ2Ps~Wk;%nL}d8F zUFL{%CD+cXVppl-^vmc&Mg}I#VvBKa5wj9Gx0S<5I3^>2ow{uMsV##JmzB9p?xf77^1IPy at Q;g?W|{R1Ad#a1o#E8z2Er452%>ND at Wp#yVC at bwBJE%x-jT=w z{ei2(&meV>kgnh|b2{9CyR`9L*=^F(ieJ%*Coq(07YE!TdSCJ_{{Oosn}=3 at CUoMv zm?SaFl=+kMo0o#rTploXx=V;DBi7vMVO`jT5eR8d5)XOJleBvM^$Dm!_!*6vFaYuh zs`!X3Y=a~D$UIfA?+|x^`?jdAM4U{T*AglXsVt~0F)M>U at tccLnq;3QOFY?(sLwo> z1jy1NlTHtjehpSQ%)I)2;I9>e+UD!O9mD??M|GSayjC7ylx7xWJZ=^t?K*=2CFc|P zw0sVHfM3%dIOHFV-y+oWf_Z$k&{u{2;T6rHC at E-vd>h5D*IN^lgA?*u5%hKoEW81cE-(%ahZQHhO+qP}nwl(j)>7JVInyP+NNu}~XwX?sStgH+X z7r{zT60X$6G)Xp58EknTwus-pu1IUTe$92g^=FqeEIKh>TjqYwoi{CRGQ)YB>3%GI za{SiN`em_B+5PzbI{rBJIBH+d{(c{_0cQ18lN+c-6kxrBU#Fy_OV!XDl0+z{$qU)B zM4`FS2+0Qx51H&>CZZLR_d^UCvlyRLhu$k7SGSEA1&%+Hdd026F}&L$4` zaYxAp-8-POAp<`vi0{hbqdGk8wRwyy=gslzsZBx}#KF!ecVfEaDI;j|Xq{b^UQ3&|yWs%4DT6EYZ?pl#soY1mQGKZ+R?I zBYS?j!mGHcI43uoQNLk7#B?o at 4h1mhm}Hbd0@=2QKH%fdZjD?=+0>yxSKmOjrs`B- zj4ZLN!IDX_;p*O0&XR{G72<$PG}Iw8^gjZ4$6(DKKgj4L$jv3{Fo^4qF|yJ7sOYIN zh3aS?z>G#I6w(MNX|~c*oJ(q at QDvhMSj?$P>}qpb9_ut!Qw$5BNN&D5Y1CG6x}N~L zL1G+MsteU}aYPyS8 at vEbXa}9c9E8CFDKt}as%$3c9jB$9#7-zv)Oje_PMK2fqU$sv zxCEnjC^kZK%=y$`eQ}NFa2#IPb{LNvbJ4~&*K>_(3XVdX^yrW0SRFSTOUXehQr=d7 zt{_!n%yRIb)$*L7Nne2stbASKG8RppFwtKpr#Raf_SrIwS4z_Nbmk991k!r?-W*U5 z_bp5cw-l6;v72y!Awj*!!qauwO2~1=!w%xym+WY^LK}T_AGH5+T%4I1KVhnMbfo{_ z=+v6PQY3Aa2&(joBS9IWOQu<+#^kWvc9KHGZKd8^*0xZGyt at b8E?5O_IMs0=yE?$+ zsmFk!$TE5mhv8u_*eAzbn42_0j}5w~fXN-9!qge=M84WRP6?T+KG;6Y$5&WcW9p%8EsycG1* z%<{e>PE6*)=3X6%wApD(_UY#E>gUGwu7+bdXdg`om})!R)h%L3xQs6WLkcPyfJrJ+ zYveD;4xRk6^!G_4${udKS+xet9 at _h<;i|OzZ^8_Jab`&(^!3PjNghjr1lWS at PUwRm zg-e!M62?UBe9;$Z;M3MV1Yu<8 at h2PMKke7Vb+!GClr%OKUI`S=J;93*U-L>jZVA*D zw*WoDsd|GezF-lKU(Hm0{8Wx(7bGS+b(*r`#Zzrp!G zR8w!2u7lGGyGWibbCPOx`zg3DEXU?1xDnReA7`D}gr7-SntdHp>ga1`+$@mtX at YV| z002P|bg{Pt7PoO2zMfxV{yISc_{Z zKRbhY4p0X!F6CVPe>Jo7e=72Qq70-kJ=kVGLRiP-{8pMw&(sVB3&U68rQHxvSqyb# zeq-t$;II{b!V4#Q>Ho5>yTO(71o0?Y>HI7xqn}eojqYMVUtjBm;SUf72@*yX7KH0v zz4z+RwY}(f{Ud`#tc!@_R9-V_u3hGLu65I_(s*fK2?`C((Y_FoXk1WoYqI1#JI-{9 zOU+-qSZp}@1m}vz$e_=`NRaPN(dX2=1yr$&BJGO0L4Drz_^%yfl9q%EUz~Ju{Sj2c z&NDa{l5)zI9=e1#t_WjvTM$j^_cW>tP@*41oNrok^KWBXhWsYkKFvLTJYRx?SGtuu zFkoX47mw7A(_<3quq8lmLt-y(soZXzR|VXxp at lUu%e{Y9xCp7}`pMNTcU3t5T+@}j zp|~o()_=$kMf5_RJ|Jj{&~b_|JVWqKx*}dM08k_her(D`7-gVpSQyn8aDxV7e5dp- zjyfQ8rz$&?`OHE1u>d|PFYOL+tKihvO3*Lobq?~6b+`wyEo5?G at 0r*kE?d?_6}15$ z_)+mP70(HRA6z5D&2PXKsda18NYKYTNKUwVL;%mQOZ^i6%SYw~-1 z`8v;<9YbSP(2Y3PFYRPkUU6XnVxZb_+(*jE6E~HD{+krTBm2rauUwfBsALFlO5Q-k zPAI}aJYtu!LSf$$!6q)P)X#N!XkGH-9a1pD@<_dNc{rVT8r2$EA2Z~O*ewT`4l&ef zN8i|}PD;_NxI}+y_cyB+lNh8Y9Y6X<9|QF#tXqf<6alL=r~3+v`?i!kBf`{3cEl33 z%ls{pvwGg5qtI=J?u|TplcD^XdFRy9JBqokF<;3GDSQO8`yI2w0{R_OxmQ1D^z--w zkotqo`3{X!vj`95Ntq|;?7thY1;?JmG(!Ub zKZrX|oYdURJWWdAPmuxI9});T1t5OJeDMl9CPysV?5SubHsGyp)5Zgl2;j7`(Xr=(*tgiKH^3clfvwdx~!CeVJ~@?~kX>7=OO9 z_(pKFL*QQ^rilok$Gk`b8q*;57ZD!3mDGGlgB%IGR8krdykKJ?)=vfBG?8?}@(_H< z26rd#;26Caq~dfL?~lPV?vhE~D0 at r}E(fl$5V&J(Cti>cyr6!~4#Z(npG~@ItX48^ zCZ0JsWCfep66+gz%&Afv9Z7%01*LO&j)}MHt61#U#5K-wUA+b-G;%VR;m>d}w;1yH zFPH0 at MyHRssSdAO7ZO`!wxMB;J3DQ-+ggA7V!XjVU2(Cw=W1;a{X_Ih6YaaIF`wKX zePBdlGaFc_FC7_Qa>noFxwy=tOWGCZPZf at Qs4mA`eHZUwxj0}{pGmgwUl>+#BsZ_M zVmi}b!mF5W+-BstR%NCgGFgIPHQNW>UqrfE)BggAg5-sej1RgzpmHr6h98K0fpRR_ z;I~y}XG%HRn$J9tmS12;rz>?l+Tib0x|yT$6(%J(G36W^fm5O5?XS~wXslmZz!(!1 zF)g@=tiXo)k${rrn;MT=>0cTtyeR!nJGzSFB?QwA?4w|^N=j_c6p76a#(%9NRPgJ% zcROM~*^?37J)C~Du?W`yr#5jr$A1Qh;>9zR#etg)U_HV*`VJhglH_diT(4`pXDv0m z7ikJ^_l!rKMs0Sd7s|}!lXWm+tTu9wqBL(xx(#NKnf3mt1Sq{c9?|k3Nw>SuHjY?! zEl=+V817~{kJ7<&EmUu at Omt_h#iI{63USPrWcmsyuy*9MoTUtdVsIL at h0I%m;>Y=Cu9V_22A)9n=1WoeJ4M<@WFoE0U?tgDN+29IvP6Dceg(Pc-Zj(U$L z<|NwW@*$i9&8UeGru$=c0;`{j-KzBOxA(kT9-_?^FS;mTx2vxcCs13NsmW)=DHYx% zWk0+t#~@Rz at OcC&5zk||4eSR{=jNnMKBXj7aYeE-OkOi!iuSdphG=DUapVH{tXD>$ zahKXm)&!lEC3gkW-Z`7m@;g(|6VP#WuTGql4QC+wFK8WL-XASd at LZp6{2->g1b1*M zCuv{vD2%&wtn(zEGp|?a5TkWk&l09Hto3&1+B77HbERr_+iY{5OebNkOyajQFEhy2 z>3|ag-59Z&-#QKP=~FaV{}CPB7>4>QYyS~?bwA#;q+*VufxJ7yLfV5g>}oHKyqmaB zdKGIR7t%XG`jYS?UOV62&LEk&o{3poLNS3Bk`#U`dJpt9Hxyg&#^8fEEPKzS&SQLV zD*yH8cS=fLxpv-hdt|FESq7?dLQX-_k&!o7LbRk;l4+tXjLM zjiw0B{l-uCsN#Sm)40rawoh+02X|yJWjNO at 6_)S(Zw^-~T|rvKyK=DyFj7uw at f3o? z7h1JP<%5rN`Davp9S`rm^y#L!aF-C1d at Q3z%Q1)Z#Y9m-{R2 zTnMJq9;Qm(X}K-d`}e!>ZmlqlXo}K})rkz3DJnHEqNzS_nHVPr=<*4t)js+(k{(sf zA@&HX(|fAs_oQ)iDe6{N&zT8E2gF~S7rjp3$6$XeWv=MQ158<&l z>H$HIL1 at ou=#-%o4BZl1Xglm76t{T9x&Tun0YI)JHWbXd#DWR(i;sXZK=g=;l6=Vd z&KtqHg9b${+RjTJEn2>1yU(sLlsH{WRNvHS0|usPOUa0E>l>V9lm_j*jBpHYUb!iw;iX|sH$ zxL*OJJ`p89$pdR*Kgql!jLOFk=&6M~ClX?t2{fUm8JycG*RfM zRLvx22a&urG{UJa7#~f>YopK68xF1(zQT+1+eduO-D3~OCi5o|ia=@vd%4Lz9 zklEp=Rmx7Fo(fv?AZsTzDozR{q47uMdmZu4npO)#_N5iJ_N2Mjr61E(C&m-DbogN5 zEy^eDb8$MFKJV79u&@}-$H$Cd7L$UEV3xPoS*ofeF)bBkI8_gtoBBQ}cBA{HT%kls zPEZRy#FMjaF+)}EzgoGP7;@e+3Xc!|1cOQ8-?aIz#8ELqc|-_TY5db(c|t?a8zNf8 z+M2|@K!;;VDYJNtJzkr17SBo!6*e3*y#-xf7iv;80*a#-#`aeH?sF|@6>xM1#bXu3 z)uJ&}($(BG6H68eRNcrSg>B2T39E_KM&mCXo~P7unYT~QJty at 8{MtYGtfmR-CXWk3 z+E;VX2E<}hTtYk$O$1A3gKK%w$PK{`kj}Kpeg&c%4^&GGcOXlQ=#p2DO)LN{DBr^{Sj0$ zzM#>9G>!R#ru7!CmXSLypsKj^57xyUEcT$P_0?lJ7L>BBIsF&zQqm6_i#id0DZ)aN z`sFTE)AYg08_XHan|ItZna!zaU2Z6e7k(0d3iQN%lLfk^)5Q(f)dvM$FrOVbV^%-> zkrYjUqC)MO#a1E?4r#oUz*AQ5N3NGxd=H_Lh=+eWhEC_5*t}oSGiLOr&xcCY;pSEu zJ4sw<8$^?f)*zN at s#!JElFbrF=e$6}eUwvu+Es$ig)Ml&6+OWxn?%)&XXK_E%T`U) zjB$q_Ic(==P&_1w2JLHFwMNT41206U-H3LImaGOcm7$j!?;|cacND}(^L?pKy9`_v z%3JR-5>>6ZD1u7}`F9!AHP5JRc*Jrz4lS1!y1YUP8Lv_M1lyndB zS9Frj2zZMg_OS;(zp5bizkPNg_I)7m9r)}iZqT|Je++KEe*F&a|K{g;#pS}m91=_R zrZq&#SP>nDeM~p%YhM5Uw-4t3Q1%KN00961f&l;s|4)^VfUT{SvA)g!te;cfR6tTk z)+XB)C$k1a2qyw0Bsa4$1OV$I77-94L%b)DSSFU0wi>Me5OC&9!lUP7sC}e=92hK9 zmf&DPp7j~=8av~)jw}jWQ4&|!KE1ls at XVF${k`4h^>be`jH at p*fLKK#M&43l2+}-I zR+1mEMq!gviBlfGmO&mg&_ZQE0ilAdfS%v*IJ7tJ?wFugVbi&5S+sw?rrBAUt}wK| zthwQ!4OD5g9<0vrXti|0pnPsIMB$8CWQhJFO*2Ys)wy+myUWlKj55jqvwbt;#bOxG zpT1tUlv~A$uA)H}N83=C$&seh+TAvG4yg9XPx|?yZ9Wcrw9VX(X zh5eayWe-R5)q~bJVPPPz$=gU?wPV?eg^5Mt6mvW0oPiz at z0_>cO~jyV*$BL|t5H~B z>cC~Yj%x>XFuAZUmNgg4y4FpLNFh{b>UkA at Eyy^>#jxBOv{+3vOXWI8`Qv6J1xSV` zHZz#+L!nZg)T?>_X{*IPHqvC2ue6hrkU1)1FnP`ntrGHvVe4In7Biu(cK=Ta@>f-U z2pFbG9jQ)ZkH#SV3?uaOtDnA;97q$n^*Br~Mr4Et&FF z;kz6fmO#NYf7L>BhT4-|hxn(3d(2HX!Cbt6nY+{y7&Mu%}eu(3nf7PjYhgjiT zd2Qbgz7xPXUBX$&1JC$~$T(m4eV;D^0pG!r`q(;85FCD_pPX(V at N~1RO`6a|t77T7 z_fD at Q$p?@GE89J4eCjT^Dm_gblH|T)xKon_U?Ly6c+g1jmXD7woP at eY0@B0Lt=KW* zLo+vzXBcfT(*7>Ic#x}a at _H`b4@!@$D;$Di5CCfkx#R&fmS}|Z9%AN at al)h3gsB2) z5^_OX6cxB4|DxEU6zUit7sDj}C6mtI7!!hrSwdN#1-oGOUvxViD2Z58N3gKtb9W$T zS3RH-UJhJ=A$t at Mynk6Vh5gH-$vGFE{)g>IS42kKHosd$>nD`>9OWQ-RgVsCRk>KN z4)_3=1f*NLkHz;3f~W^If{QZ2o*wIW8W-s> zGG8>IB7q1hDuyyQm!+R^a7cK0BC+1}{8%de!LaW2G-XCi856&B^t#RdwC=Udo-h6N z`6UAAymx`NH)F6Gv`Uh3^h!UCoPj7cWCtP&A(vp3>d|DN-b3g~;+Q^(L=psvWW+tT zm~q%hh;n4G8e$`QQvu#R8NC&{Qv;5DJVf$xXACK|%fWKbpxaHp=fT)by$1 at 3)1a-C zg!VtD at TkLSzM`+g7L;R(gtphDx~yO*PqyA>ls&m2Isk&U6s1mdlQvagq0|81!4q_o zV{aXBXQl2adz1+fbu+FAYC$Y{knZeXVjU$7=wxtYkgTIaBz)sL|h^Y6+>R7u=8{!r3~Bf|K1H%}rp)If&`7J+90V$f~-U zJH_I^f?ZREp&`yBZeghCF~k at _m}?Y+Kj}hpE7HS~UMZ4ya3-<>W#H6emF!>xZZ!HJ zGY{cCqm(V7j&z0z43 at cuOK7cs9Uoz_RsgERh}jbK3T&yaK|;8VK>pi zG1|ZEdAZ|Y`iQbkZebiU4RZuU8{W3Uq2lcwcW=aJ8`PsYpfN4jxCAnDb1-R>)1jpp zbKU^}eQI4=g_^YqRuJ>vW`SD0V3(h_-r`!TxehTO_rbA4U&OR=NxbRThkMnYpsd(k5EXRySaqe8G+%716RC~yf=@a0D|8=@3wAfzMD~em at Hc-5xFmpUNFlSJ@s(Pgj&Ga#uv|L|fjT zY1`Oc at o#G>3ie=J0Fqm@{-X86bbqgmHrI8Mdvs{2Y55K_i0vLCk8#JgCCB3RuC5Aw zc&JfV`5xqsf*pJ)@)b~UcelHYEy2=h>_wCMpW(cGilxOfSDohOD>wDRb%mwwC~NX5 z%U~w3ZPu3$njz1q*&5-U4ll+gveFDV0FqnWZqnVK_5f*;5=b-;m+JzB*tw%D2O5=I z*GEs`zgUe~^%45?Ppp}S(;bD%W6_!|ck*vTrJiYBh>z{nsIv%@^kQQ$!b*pM8`18P z4dYG;Y z+AF!Omr4z(4OqPcvK;VBAv>RUR}QZysuo;ukbMtBgHVuvW3eXxdK%{Xwku4n6l?$Q zbXw-(D1PH;eKL07uxr6(idL(g{R`sphjCNAYMepsin7}ZTh6n? zjO^n#~*&P^z1RM68y99aalpVKVxJ*L}?Yuk21LTVCFTlMbi$>$s6T#wC=*z8w%%I?fkTl;J6Q%`HLpDLGPeGXKX#6URF1i z*OnxB>mvNocz?; zAp!tU{k!z=pBEt7PD-jMKQ=en?TPx}#QKN{QiMwYiQ)o&O at 9;NIfE1m2=oF06I2|T z+OxIN+L26e

8svki7_8DSqZU z)gcvREC-KtoXKjO-P!#|`_%IJ$;F!mT#H%_FcZ*$9t|WP4Fuf67=n-jn?o5Ad~*ZH zox2~$#~mRu_?-vfB?;og88Wp~xbkB4n>}}<4wK-f4N){;rwN%&HKgguJB;LCI+$Y2 z8s at -}1(uJc1GzWmrfBIcIHUkk?qp0)GGDv5T1ksJ1+B^|#9y-AG-;tTK5{UT8C6AD zf=MH*5+Y4!DIu*6iocjFDvhezH)??V;z_aQ=!RS}o2>g&O~<59sm7qUexk?AV`Bn` zc}Q`i1Y_jpxHhJ7(Arwgk*FfmAL1`Wx*b1dlt9rKIO#NUlQyAYK3N}=*$xY5RHMnS zw=gE%LE3aCCfWOE*PbZ(RMuF?KPRs5Z4wP9zBHoW_pmElBM%fW0q@` z(&$%s9j_6I_24*E36W&jb5zU|B(@CcjeWJwBT`IqeW$ThK=?pNK*mBq66S0c zJsG$6a-nd{H6EV?MMRmAj9DASdTFT*v6rRzGLLXZm(eZi9+!k5EzQn>Nu26XWdX>^ zk#)UfbiO^2eH5}AZ&Om72Bg%S81a-=jr(GWG<5=!!y0u6jlo$K+8Q-*fMB{8tNu-W z(CVbE(w#`Y2LE8U`)2)uNw4?TggUg;Rtr-MftO)IYw8*3NY~#{9yrbf6Va_J*nBuH zfiu*>&-toDOM1YSsP)DBY51IBM*{9xsH4{r zp4yb5YWSB!zZf)uH`E at QD=$$% zUAiGA580E_n2|<7nP&8Ohk2WLI@(fDZ<~@R+Xyj3OB`d;O+4eQm#nSp5i>p|t)3%C zE6LNoTMS8sKNpTa2|3NAn|jgx$@sx1i<$1N7;{;zMU|Gt!bLO&@G`2>cDGH#R;o*c zsa}M)Lyf&5-be=Xgp0v^3 at s#j_~OmNM|gJKHYJ-rUK8NhFC>Gu#;eHl*>cL2v5z+>w-qKNd|93|Mbe25ot+)B{pnH$#N{( z{8mMzoaOM&(}up^uME+#-j_le7o69DR2|mB&Rl`r4c7>G2S+kiot~v;Ua$2r96{no zpw1kJ27M(b|^zxMx)7XqONeZ zehlzxJea4-SWHZH`l_5(FU?8s!K>`k_j1SL4?J79$!c5|_b7vlfq5nA25#Denc`vA zC(BfDSDK2o at FTg{lgSdOYU6g;Jh`2@$cenk;abWWIyR~unRSfKKLk`b$STWm`ajIskhMXmnM&{RW6w9b1i8cr!HYr{UheN|-r3M~cM2jdwG#7B2n6W7;Q>FRfO{+vm6gk9 z!Xpdk=>DDWEGF*=Gj at x&=^5HZ!?;R?LVk}Rx1dzBp_E%v$}1Z$JVSPAbRfno&Uppm z#*+86sfePdGL%fM&7WaoTOnFJxel at 1;B97GDPA^r)bzek at m<4v(eB&eq`BH%C|*6c z&@{}R**i19yyQ7Qt=?_crgdwG=LM*JTxIdN2kmYX8SoisytE>t zUS~xPM6ME;FrN1o z at Mwo~Z>J39Vqk&QnCM3-Ca@{M)N9KA(+B at uKPJV(dz4=O at +V&(1OnclJ(vLdX-ey; zN371x3YE$T at Uv1y#|I}_RO3|TB2iVoxwcyQx+~y9Fhg^Ezhw=j%77%2M}5?`Rh!=p zcgf at Z=PP;YD;oD3XYw8n^@J}S;kHidS9oPd|NXnO%u02V8?El}jXs3rsx1oX*Hoxo z(5Nv=BQ|cA5rT{G5Y();KtxUDgi57+sBFjq&vq*|){SkafJEMw%h0yqg?qd+W`j!2 zo8txZ0vWn#<~mGk5!5(Yh&Hc>r>eO at 4n66ztT!MeutDi(i8iYI(S}kppK7yC;9MYj zL0X!}Ovy#Bdtl+HOE4U5!W||z7VEeR32!*f3Xq1LUS`dCDK$=fZtO3_slw zr4~(071*m{SqjaGx71j3mThO{Pw#()wR$_(%q}nhfT at 4Sja$Io$=H$jpX2{ax~ht` zit-b~ynxRz!ia{YInd7vN-&Pfx at 2#a2WU0wKu at Z72qiv<4~j0DL6CvKded#cS at i08 zSyHXY$4uvAw_3qac|KvG`w7+YvGWtv;+cy<4Cs(ihkBaDVVc|B>;3*>_Vbg==L@|D zj4O;F$QuDmEo5eVS2s3 at h(|4|f8c_Q&{bT}=g0sF#R^B|^}-5QOpe_~IZ? zMiV;pKb at n}lWF8=r_l?_-aUW0rVm|mkS~jJa=xX9wOMfzaJ3zy5kOfFqB3C#793KH zlSUvr4$+C}>2q2m*GV>YDACn5{;673_?K!GQzoUBOM5dZ3q=k>iIz;CwNHIKknv&KdPxP(TX$i?`l zCEj(mA%h-7(ZXWKeMUrmK6&_bi%e|**^D at Ld#l7~PTyHHq5Zn;0zf%BK%SX8A at -Wv zstyW@(b*{Yp@#F=oo=Rje5+*Dc$M1dyH6NZ(uLvFy{4n3H$o~?GUX;kvZ$nUX1M=4 zBvf2^&8 at Qv4LjX3n>xh$oIzh>CEK`GV}N9k0?lo&eKfDdkWVJ=({6ZSAHgccX{jss_D&IoZ*W%mOJI=hp2|NlH at g9|Mo(@K85jJ@ zQ^p13v6iJPcK7a1b3(BsQMGr`4rNt|d+83)r&b^OlsRie@{i|bsl_C}wMp5_MX`tr zlm&@4*LTJ$4iT3+W0@#*nh)p8QEK#;<|&WD2QVaqc^hCgBU<`C&Gh^}|llwHR2jpcRu8 z?KteF3d~8GHu)S09V|kiW;NQ~iBYyrp&Ymaw>XQwx3O?fIO2GHHcZ~c-H?ib4IgjH z);c$@IIoIh(@C31yx%07 at s3VDY(fQ6G3Rs;5x-T$yd|e!pc^1$b-4CZMHEB-(H6-m z5PO7;hyTkQryuckAS9PG7luak+%&*+yb@>H&l|=NUhx_OW}z2;#vH!OAv at 3QGjRN{ z_`6JuSfD_~xB(d;sZu1nN9# zby3$R3RU$#`a->*R=p+vMltMxCT<>5N<_&|5d1e4R4moYfEVFLvCnkk!!uOYKx9t{ z^t2Z$xJ_?*SvyAA7V*R<8yN)Dp+#)z3c`+`M>YU3hLBf{FA$7u%WzX-7q1f1;!8y9 zHM?LALrf$3Q}gTx#fA7UOgtF-P{*RLu#xshMO`nJ88mlLg%`Ln*xL=JAPT<}BT0Q(HRE+P6E_^5nYn81v7xI>(T6NRZ2$qPH@?Dalcxb5W_ zns%F$OM at T>o(NWkkR*0h#r^e&`>I?=o$OJNj%|@5ZxA%&;8VMB7xX#r|1DkJ|EF|y z7zyw1cHa#d9)U|^MEK|scK!Q!OP`jI*wGw0Edi;HaAliTAh{xcQhz0H0rZG*oq!TO zP=aG>@dyNGw?g at x@0|BfId7uOHz2_=0}1U5z$t}!{UoAQNJva5I0zn?EQPhiD3OzG zfVJYu2UF9`n|NYMJd+p0<`~X&e7| zPjFM(FvvY8?Sh9uSGah-Bpw*}zWmd~5!KT%qfix(xW{JrXpU)6FQPw2*9qE?Qt at CL z at u0%?1U?Yn!2uMHfag{48>43;eg)es%nlsY!bd9!Ocz2zF&jWTq?pIxaijbA@# zDBm at i#Yh5pEP|Px2N<0vMP%t=ri8@%3Xoc?5X&YJs`D6yM4p3Qbe+H!RP;N?eQWQ#RGheIejntSvZU-5NUoiwjuMN>42Lo` zCYEBcdgT#0c&XJU^~_O}!Z%op?A&5)v~Vo=my9Pj4ZFD43k+ zt5Wg+BTh#+3YzS)%0ZD?@;IxmLuK#XXOT8J at +7L>q=?3JFxsC0{5Yh`c-F(>BO`uX z%|+!yV-sFR_-~C~om^8xiuDn==GMaug;cv6*Fj at ylrxdKOO=*GN!(<*`6%Vup#nov z4KBG^C7oD#@&F3c;ku=|!>~h0wsekmyAVZ0Sr8fZmdMA*2F=0cD80O)cpNXUxFpP@ z$_gv?i4gzqZ`JB0>1O4+ib+YUh;r6~liRSEt_ds;vFL@^G7N=L(V|KD5)(W7m_Y|2 zp5OrkH7-%-A3*_pW?gc$#S?K!0Jw1jUdkxSFkXcg94gzAE9Xih1_s3zZ98bd at MLeQcCiSRrREm_u>y;=^c3p|jyJ_4FGHglK2H zl1w1a^+kJ{D7w9M`kpZ92T#daD)xMo5oQx7FN!F-Ln_FS+npXB&l53p-C;-09JoW` z9#X<@PRZXFrOZXBCWEA at qxORFmMJwIpTTowCU5te zy{TkJtEA8a*OmKhvhL at IZqndKERxZwMhoNI&hFGQLk{IrauU$9{_V%4>ooPov6Ey& znI<<)Ze=WgvVQm%aeBpJD-PR at s<)jtgXpa;MPkQ8XHMm|s_{<@!70>ak^yrxS2Eo~ z#j*r4(pszP6%X$*!b9tBXq at uIfR1u2wfssD*NVqT0oizu95LO%bX`Z*tsk41)pMI( zvr`Zs3b^}6@*kFdG7TU|120Jj<+cwbzTgj1HeRO(jJVLivje6p$UVWclMO#l``ps4 zTZ&K4mRGZwWwVbv{U@>MLG}alp0P!M)tsU9pNS&Q3gM<18tjW$Gor$uFuo7YuZ@?I z5-s0f9OqRRtU>^pe3ViM0%6Hg^vS9x7IDvNa0y+X3D-lPq4tmR^+;f)9p}7QF6lSp zEBo{qT``odrXA%&Mv;027G1;7 zt(m)nf!GlF2Khl6y^{^=Gy6Hzx$9}1poN-vS7u=|c10#N&3Ndj&TfGSiIqc~gnY1n zBx-&{LVxi`e~nOg_P0B`JY!KlXw~0bn z7)uYNo;~r8PTO*lAvi`qeu*uoKwJV61WGvi^NVir9S+gVI{IuCH*=ok$7=1!$t|W+ zOE4Z8y=#si!2;ftnrCMjR1mD=rd(Gr&c`qQ7C at tNV+Ob_U2fuAE?#fqtDEpFd>nwO z_Zs4U at 2V((_%$2xHDwo2YC$Mjrr?7q(&yV~sjysy&r0=7jWL9oH!_LH^< zMHyz=LyUNn>w|S(r5WYMdWpTqrQq)yB6P1k?#ByRlB^a9lzm!VABUXzxPT&@dy at B;+ex{=50< z4B)m at BRoBKMFN=fm!6~#i^Y+0umIyir8rH#x+q~@oDrR^F(OBSIyzfBf0fqE7_i at M zg<9mHBz<)myk2-QEQz|hY<;6%BZjzwTK}HBJR-TJuph_k-_reF%LYbh@(!J92FXwj zMtJa*;T>h`i9?shDjM7rdpvh3O^I@$YuB%5i(^i}WXidXcu_0-x9j5+&6s40tT;44 z+a?CvMTT97*mOf4OP4e$hqB7Z@%N6->#6*VX0#LyK)df0d^DR5%8)=QCv at BBH zPVP{2BSGC{49(%OSR+=tl?cwi|6W2jNd#0AUT}A#H9;{aR at X5~sFVD)SYdVu8fOMi z%%UkzB|G|w#6U8GdvB)ttrN4an4r4 zA@)WoG&^Ym`iZ(Xh+^Zb>@Q*Zh95om1$Ua;jVM7#V&#*bb8pz+lGer4NdOi{B%p-9 zhVJ&eLsEs9Z;gbqC6v-#m+wO^374>f6_3R51%vAn`pz#ucXV=#gO!!#fOb6Iuc1W% zNg+4@{5Dr at n~XCIVS~V6cTF`k+R|(jy}@{8wa1-eK9f~?Cad^pRQ^_9aDDI!J=h-2 zf_eg71sOWM%NnHG!@vpZkUFec=T4_-V!E`lOsQbf9O|r5k0S59CTX0*=$P5R?2BCv zU at wWiwAhR!kwD>I&M-e at Gz zKBiOn&5?Vj!F3+0cP)ffkW~#sa{JoQZt_5 at j+vz-Q1_%rm{I-vfI{$|@#XV~NPPM0 zXVeWS&bHHwZpdE%sJ|iW8{D+I`}>CnOPLlIk}vd1^cI7bp=CDKCl%+;aL)MK2fF>L z4v&b|b3K-dmg{0vIn{eQmLb)9JJvFaXYe_9AHs1#9qY$^0<($D$}+^vt9EfO#LUQ) ze9{vOFu$8+0xYePCYl*TQ)vzhhyneDjaIMb>7^E)UDXf>c)$R5FEs0PCofsc)0 z6Ln$%t;mi#XumZa(n<7I9Hm=7=(+ZzL+Tg+LuS|p_u9C>YV{_4HsspeyGJkp_v#Jw zGn#~}Hy9{&k&iC3uixSk1QW}cH;Vp!XyryojNfC}NoJgta-S4cN}|YZ}lmT?|qaa=)5z|LA{DkPxVqNlu+V4OVBAu$z zHAJ_{*Q$r*jkc1C71SAiH}J&f>Fe) zQF-X-R-H^eC(dbx)Nog7glRzw<#!#hBOYQdl_A#$0;CyZPtRmzq|K*G&R!~EZZ2p? zx?n9#V$kj`+T4a3)I5PB+*bkAU71SAaI_8_LIcHdX+w=1ArV7t`Pef>6 at hPPF0jwC z;T23RL7~X{RD=RhLs$3vLq~9+^jK4kqNSlyVZ6$&(G$r{gQ*BQ8B|uS$~;JY!RpP1 zX^t-DoDe?GNHCox*D*3OnR0@#AtQHaKs9e7KVPA6F$Mm_RMP=qopOYwN-C3D%6Zx` zZzr7wO<)>p(bBVO0MQl~7LSHVAxz3_T9ERo|2AW?C8mpHOEZyX^G8ID5w^-I``gv~1h9tDdrL+qUhhy?5ERZQHiJ%eHOY_v`L+ z?>T4m82$DAvDV65KVxQOL}WzHh>qa5=7ebP)M;#vxITBUwbHIR#!+2F;ch#2QnSIU z7+iKvPsR`u)up9upjV3RyY$t`n3!_9HsN?%bM__ee at 2@qIHZ18y_?4q6LG0zZ}%T6 z)U5orpOqqvWd_t*03&ac5W&ezpDpoCjBE`IYR*)wgZp*%YfEKnSb;9)0fkeUPnB!q zSp+*o$07srU6<@SDv>AOy at nuS+c%m2mT47p63~J!ZIENnQgH^-!>}9b_Ip<)&%G6b z_BE+u_p06U at X{V|fm<+_?cza at Z%*kLu(&lZrn6=hsk!0PbdVKmER=*@j5|%rTbnn~ z+$L0QClt7~vKur6oZJNj;Ez$Y5pYngMiF2$(s)Auk**=v< za?vhFFJKT3W^G?11N^Ym=E9o-7}%>syfJj>0aWx~%7y-$u3IP=vyzQpEzw8+qZUys at h$SFRxAukTm=B$Gk1RUD5w&>bX zA6J}X^gC6nPpc|jOGX%~YXkX*RK?E-vyl#Ealt3&yF(vs-+Bm^lts$(iP>un5ifM3 z=jONULMDS)Twulvq+le^p(_37EREI052t2OG-4j#DqN431>yP}%P?Ile}uUbff)FbL2AuXj0-uOWrT(aa? z8IBF?iQcBe_QiE4n{{4e8!k90bgEA-mDDjo9=I0_mFHuTc1ei~MfZN at HeFBHocjwC{2vb%JroIIz!z z)OhL7CfPK3*nOT3w0YglA=*s*XUyT)2*SY(>w#0vKZb~WPmSnY at F&ZX2yrTM^EmL6 zj5s$3(u)TI{9Zg>%m~8!+*bvG_e83ot}lKykfcd1AK!T0ft9-VSP6kGDU_<;X2N8k z+`S}A at N;PJ%NCvQ0feOTAl&!ooC7z^DFJ+&40C5d!4Y`!E at pJt{SSc%ZLl?_hZ7cQ zzzNY=!@zmj18+m&460sc- at -slvjZElpR8go(tPPsDE|YJ8*A8l9d4^r0pA#O0Z)(! z?S<%K8?R1jgj at 5rH}Yho9%e?{w>%$?aeKGwS5zc{aep$huALlq zz40-O&Dkwt#FqeHon5r6<=_6^84ShErFIia(uwrDH&eK)PcY4Lpw{mD_QEJ`MDfxr}q+9=@`=F7sEl zt!T1AQg=up6Eq_Ov|>yzN)eL)Q}K&eu at C2&U+m1!8WFQkO>RPg4;12jXtwrewV`hx$za at cByfR<4+>AU(Gn|HA;T>hq zc|kdXt at 4UzW2`?W+we at s_X?I%s6VT;eZ;}-o+;|-&*0E<(H_D^wgBgpXt}<|tmDR8 zR_Sl68BLUq3!&D7jls5-W?Ob5$KNb0UT!NH63!?eLN^HnlK8cw4xF@3Ny%6<|l z56CY8_dI$`(gn5&E7QdnlPUZrh1*hL*FHs_yF!eeIB;en&kQ###mQZ#&$R8~i~TLn zKum3OxBJ_wOuNh1-D4eu#YLVJbRg+*SGfLwFJb8 at Kx7M~!q_`R^!RU!qP(c{Uf*BLcb#iYdIA{-5$q)`+0-+Tg at xiw zXqm5|EO}Fxg=)OXF{y@)t^uaA*rVM4|ad;9*cR at Wt)(%Ml2IjiC6$?M6*EH zBJ2PNJ+C&Pv}$o&81)W1RKOE^ipB19QIdz?ES6HSj+t9k&Eb$Wg=k*`Hb|2Svsr;Q zn+u)?y0}xZFt%_#uFG5`Nf;;P9(_}!r_KP6CUJjkAWDi!@bBa!-AG^^Fxv*}^4Xm% z`@3?h+#Ke`Bs6{)%3L9J6<-P0K}wq*IEjxXy3J98;B#eza8C_k+-=mmo}h;|A|ti{ z6o!3JWJ2jzC>?U&sSNrmt3hw*R7Wjg${NX2<7vuQRbh^n`mI?qT{D|OETd^QXus3c zIxrb>IukiS3I=uj6VKb&%pHg}!HOu_ZgPH4zeqPeC=b}u;ac0MDkt3=7kn13c%zG at tu zZLWO-D_Y$qL+oWk_e>2{{b;Cdyp&Rem at 1&k(g`4xLLpO<48k*yYWV?IUvP-1)xELQ zm|{c-uPS)q0+FE)C8iIBZ8uiKKj)De$=?FT3qyIXMWm>{)TmkaZeCey_9plRqFP5) zx(J+M7aDl{8?6mgA}@cx_-40D>;a}pnFkl)qH-qOUDb$QeZkiMnO9w_%67q2_~ddbH>$Y!U2$8l#$siQi&l#YhlCye$ue@=f88iGjMI0N^BD95(T6T9GnJ1a&z z_JPv#g$svLiH!-m{O*y={Aj!zqYPCpNzw~=nk+9HR&x at 3OgG-p5T)@2!ro*CT~$Rx z at 9LvKRQ)$}L3IX+lGfs5{N9JuhaUKT0NFJ&!?hEGJ$(LZ4p!N-d_l_+9wf{z$;uuy zg2C)w<|%7uI^`Twc)OUlDfB*g&7C6%yZ3@~wBYl0U%5A at nq8&aox`4O at s1HL;M}#f z9%OqxYtp7ZUOdWU5w43FcN==2j~VpFe81Wg$YCJl1?_`y_fMC?Vq3(!#c3;VG{QNz z3nr9{kegTlg^~s7IbArn22lkAWd(yra1D0)$r at 8GZbwhS2vJB`k;eE*ue(pwp at Gt?vw`kX(qU(2f|h$zWZsT zL26!at61nfkDQ0Fg0Ybm|7P=Yc8*jGqEqTpQd<$f!%&sLb^Mt>{jG%D3?bX<_*ebK z-sfFrwSc=y^`v-*G+!mPTy<}s8}w7P$KJV_DD9a?G-few46hyive~Xj1=cU5t6a^f zUOHs{g7`Ln*^`p289A&W0u*jhllbzEzY9iKAGYU9c62ms7dv8Z*5@#f_$<}(@e`^Q zIMUGH)Dib%FhpHD<53Vah&@b>9Jk>Sz z1Lqm`S{`GmkLn$3(m1sRYs50gM&9(Ag!M3EcsOF^vB=Wc{qaBlErO*n`6M$31p+$z z$5;ygpA6-{)%u`VO~z$W9qqe at T&E>&5y_YUSeJnM6Lpq$lR!i$V7h_q=ssY>Q#Ffs|Pu at Ap)kRye*<4AV9kALMkfKNoi;aZBtRvLXtg2 z=f!67i9Ez4x at M^4>@m1Pn?b;trTv<(39E;x z&4&J^voht^j;@=f7_`sy&q at r?W^fU{cp9r;HX14mEE+)9{V3B7s3y!_9 zR6l*l1QiXd>|RRwSjN6v{vu$o&^P?-;=gbis33-#Rz5DBDl z5_JbZ<5;~ZG!$t_w(19VZ*FKL2lVF<$*C$YZE)$rj83LOA-jIe5&rETF8}r4v=}&x zw_q6(2x#Kpspl>NftU~E_`E*Tz+e#saGrHR* z)iL6<-zJw45- at rZ&Ubbl)d{#5*;CHTKk}zfRU|5wd?ZH{B8d at G0!Qp3`qL&=whyd7 z0gD-q$$$bf^JejE?4zPB!~Y}j!}Y_p(>^n!@beJ(7YJ@|gL#MG z7eenkhg4JRW(nrAtXUxr>w8Q~nS4^;9NIi=1`~mm0%Nda*=Q zJ4kkuEVq}kZJf6^0)m>uytCGNJ?043Y8sDKdywSpT8kDABUX(~Lf at _FHnlk>o<+W) zxs{IV<)!jCjdo76ZHHFR^|PI#v*;i3JZCQG$>y4bZbj!f-DSELPp5I6_}N%gJ*II} z8x{^uuQg5f2Jk`sIBqGi)rOO4T9}Ocm at DiQIm7itH{;S1hD@&;sLF6frs9&6Xv6Gn}Axb~{+ZBu*F8VEtQMnep_%)^7sbUAq={gRl&&HF6EgBH`8 zeW$fXm^C8Hc^UH3w1 at 5$UdmN5iz at Jq+X-^z`JLVUG4aB}A{t|UHFlVqsYW3T(wN7T zTRNQU0t4#!gtHV_-(xO-{&)i>mR5J*H+3hcMhnb?xs=dfif86rG3DtTm1?ktEWAT$ zLQTv;={ejZDP68U)3Apm8>&0a>euoZwM|-X{>^1up zHG4>9{7k2b;x4a&{o}ClhV9t`7!- at i77O(0tZv(O45`?)mIG`8H|k*zgTQYlYml`> z1)l?Xr|_KBm>9Hci+g7L?$v4&#OvkxQB$m&x!bImlRGE;+&)TlTfLj47=^t>9R9+C z#@DQvS-=}ePuYQtr_f-kn=iP5n&Zxfg9g3|);x1`E%mBX>LttZ1$R#jX1Z_SebU*{ z7Khu^E;9Vif)gm?8P=!>H^N?BK+H(F_GsBG+_HY*(wLNxNs&XNflG*u`D~JG2I7Ny zT+G#*7~tp7sh2nq0>)+W_Ezhd|M1#gPM-Dj!1B*Zp2j%U@^#J+p)3uC$o>tF#5ohl&QkJ!pS77rvxWaKyg7ws z at S1=9ZY9H=!buj6I}ob~$C8n`r(ep(+u;SW#^3Jdcf?)$NXQHw%^V-S(4?)gz<_S^ zl{wBP&mby?P_kx{_GLIS74k4UWX++!&6+vRzKocke=xM&-|3Zr%4o& zhW~?~QpS(a=w0K)LH$ZBt?*O*{I6fRU~fR6C(&G7ezF%y)7|mSxqZaBob}u8G4{Yf z8#ijXn&?ViHYE at -M10zGP5#+RNZNN!*SCnCEKlXO`@Yb9loMXRWZoBvSY$E8f`IrV zw|nFDV=R(ha!;Cg z5Yx95)3+GY_g9M19224;uT1b*FJEJHf_GKRY?V=D?Df>OTf6<9GzE{65I_d1NVKeG zpi%8$jp(F{CkEBEI6LE+jE!F7b#QDR8niys zWW3HNv*l~!XBZSxXIWsJ?*M`CuSnYMp9rR*6>3`OCM>K}DJ2)J2w=6){5yRCM(IXZc3?!{k1 at x_d%8Q!A#bGRrpkdRRKa!#9jfEg8<}Eh~STQV!E6)Y686LJ2$BZ z=T3Gvc&vgRm#%0G&jY~SI3hZF2DVNYStUl$fKLeMlT8cxsf&XBwUSe;5f~P$^j9AW zjvw!kDn;7VRD;4A?zL&knzudI~kLVG&#S51p>;z{5OjI{!`PW zWKADmv}N>f3ZBl!HM%-7TOu+ob+S5H6wq)87~%x5x#&G?95^f3#OX9RTld8+_ylEI zRomg7rs5tM+Li)z?KzCX{fJrhkD8}t?GOL6+UBpPpM{(4bX#Ff(Q(F?oc5PZm!5~V zlg-s`sqG z&G3)yX;Us0uth-Cr@~svAw#2*;-yN^+H^WOYOhuEMA2ofWGEJ}N#oC0_6JKM>$+h; zY;7|$DT8avW{6JUTcz?u^zZ2Bgp;FU4 at xUWQZ5X3SM%ByDLe{(=)|#A5NGg!jpMex(DWPy_hzFf&3D zbQveebR<~JBjMA;885BW6nm^Vs{c(Ep-T zyPAq;6%T&-NddAoQpldxb$)4(PqD<2f<&>tB} zOtit37(*bKb!kE-hvuk4$c;5C3 at g$l5lg4oO~%5s(vdfATss}*iTT#{+Qe{K-ruW4 zdmoSH!W^5R0;W&pN~-*6jfSwz>nE)wltqbA&Q^^sS+Ra4kq zJc>C916O!#hd-v0+RPJMb*|{0lZR)2fm?{-O%Gzz>T~pvHhE}&L6ZXLSUUH4ZRPl` zra>eq&Vv5gsOWk;H>1LV7*qN0hMi$yq#pnYl^pFGmoA6NkFrd*em4lt at x#MYXecus z%cLSE96SOcCC~{&)%px^f4dyEgP*q?VYZ?q8O-m?G|{CtY=+#m<&{*K1Q0d!vG_?b z0E=f{kr?#GDAy^2#>`=+TU$&sb(&1C+=+wbY3(B at Bk!ic9imWbiavWbE9`d(Ueo=1 zZSl+>qWx;0o)F78IZq~_>tAika8H*1_)3Jc2jBw!zX`29=VMcENlRj?Q1 at h6u;meP z?p_-l)wnl@{u7$9AE8l=^m;ev{D?K z{aOt(fMV)Z75&Qf$|=IEGk8AG at DziqeZRxee>s5v)E4>*uKenfvYU?G*_DIueKH~3 zHumD=@%R5k=>2;ODexU806qLmo#|yj8jZD^knE(l-P*$S;=FM#Y+%&iy=GOP)NaL2 zGQH~6FGVHps~#B8;-bgWXwNx=)6D98&Bx!ybXpy>-pHj;YpsC?qJI9d{~ig!=7n(0Nz?Z}->sdbrx*F!tZ?bD8# zY5I%xH1z4410|R5Lv02h-)ju0MboFu_*&I_5*LnK5txIdIWvKTSHZ&HhWx;?Bf>6@ zQ~+a*m3_&a4w_sBJzq?XJ7_qxJUH$OEnw?I4f>P-xv0m+tH`$Q=QEFv#A8ecRb-(Zf9SNw=oF*}gBT zI_Jqo{yiiWd@$lRX!R~sNdh;R93RLso0fKJk~$4rN`aO%>e5jW43!7DHeS0yzAEDh z_3Z*dM6CL_H#LTxaI at Ce%VlMYRvnG at 6@iykdaFOqYv%lKk9ZsMR6q=f(rr zmmdozIiki$0ou$N!pT2xG3ravGoT&FOgvr=PNjHSJlQgE;2ZdcsPnDd)3QY1brsPykBE5#BRiaYB8oP8H zd!Gaup9Sp_JcuoA~SYATADF+jl`Z7ij7Na z)j(@rJo_+PgvxxNz-qR!Z$+h3q9TF zA88x@{wXRm3 at F@9SG};|vPcwGigy~T{MVm|WtMyTCZ$`e&x&MU8b%?}`}Q at c3bNd> z+3M8+y+0S$-(eIix!b45YasW3T?`}{L=pK1(2?8p8qh%Sfp4fCT4~WVJ5EY;I6Nxz z`$(kPME-=4 at m?Y&%nAR|O1KRH0hR)5J87n-AF|p6+~-i&K>zDl8(!%i>z>aDx810F{xLurrw(FPh`Ow7D!(1;$+J#uljOGIQ0PUM0L#ao;(brB@|wk;=ngGiH~x zii>VCGn+y`aB1?^ zQn8#j>}^6sbHFRuneOk?fNzo>xebm`oz-P(wllH)kOfp{)IC3KVqU_NOSEs+R#Inq zzz>kcMqQ at VFN9nVI2|$hew8YK=Qhc;0(yH)C6~e}mw0&3;i3jSrQ_$vA5vC8Stz6~;8MDL93kn2ZcuSR`JOT84~_Bh59= zL?cG!4)_zSmbXuaP?M}oP}T1k at QSn>Q!h;lB1{v0+3s=eJk#CyI at ua~0Ysq~DL9f8 zVU?wVq~a(v48#zjAumRds+uJsBqUAVI%xzKQBP$o4O2r!1qiBid3syW^$IaEnD(5= zbf270P4!gam~{8i@^Jm at j@49QhAqFg#DiZrs942z<=$epLBBYbu-a06*)X`Vc|Su&6PVKRUh$kL)%v6Ws9NW$5e#n7Igt}#@XC;JiMZnqU+!E#?|Gn;bThztSL zsvy-rJKFP^rztGuoYH!)ELE$wTyt+)A0=!^5Y()(Hs|r^0=<_t6t}_~eZa at l%(_H& zf`@GRL8&FeqFpgKoy!)@=%ie`<4=&02MJkuj}=sj7A};LRVK|abL%ad85S|g&zIb# zEeRG5Ah~+lgeOU6>aY!3x68m$whnA-`x>)uZQcM#+;-1A9pHQ9G$|}8k26aQBHD+o zM$TIvHm+>?OPAc*)4$kq9aLe!YFDmm7FlbY=WV8E-L=6iv5-e;O7a7+!8Nd9HcSeP z(EhUG4H$v{Wm9z$8N at OlzG&m9HbUyeg7C)eV_Jw6sFqx8qBrJCkbJheTKQ-DQ$hRB0(yrASVz?vPcaG**A$%|A^)rP`ti&k?mz+o-68 at 3 z@&3Eo`#-<`8)8QtM_di;?-}dj=0mwcPWOFL=Zq40IvHv7R*Ikz<~H{P8crwUR%j_I zPkM(-xnezyPU!N&?=0}-mYIANZtp!6i-mQZ1;LD(d0f;L_>ECNGq!{68;kQ29a z_dgbY6O5_x`vCkWms~$@-#5KA&u=R}t`hr|s!vD$;@BznTLZv at 932w4YrYP}Rr|3=A6HX<@aT3*8 zuhvVgJjdV+M_`NJQX*m3*-qk;l`W0OZx at 1`*8%KcstB5G9~6sO%~A-NN+OyT+0W6S zR*5{l5!lrnR-D0CqBzmL35=~puFH;4DES;V%)Qzy+iIjpI>lk-sW}cf0b&4&$pn*= z;|cZg`zk<5<^%BNHALPP2#(U^2|3qaZV7FXa(x!f#?9_xE(d-7+&rfdvS$2p-YbCT^3R4R^jVr? z5J+)_?5Rwy}U+Bikzw#aey6V$}{qlZF<{sP8tS?mJ)G>mL;cJEJk zbCIw`Jj$a=jRD at mW}`Aqlc%@MbJ?~aYlU$U6=&4&;l8BHeTf$7I{qTQbjW_$*-gJ( z^iy^i#;brrVLUZG?xDuQwz-O8&6eA>=0_XbT8gtVZZrPZ>|?0wBAuLsVW$|}B8FSK zBRn;O74sQPO+8Eh5Qcrvy{xH3x-iu$D^hM|%XvGjdR4r3l|Y+Ta-N^68_<+kyo|J^ zY8g`k$e)T93$rL%b;mLBC1S`I(;d-!?3%$8MevwxbyuZ9L%GfYs*z-&nZ7y`qdJ>% z3tAYzP+Zjei(Ero3)=lYj9#`cB|7}qDf1O#C8D$_rRi61MR9jUu^vvz7&raLIwHPyFg0Mn<|3*U9E<`&eK1hXj<4hWFP#6$X&^YKrl z`N+1wdcZ7k2a%oH+BSI;O=@1bf`}bauV!gkX+;^N4-*x7H?ji^+H_(8(loZg{K|2} zGg+=6-IV1x|$ejYc&zcyemI$-mi1m^JQ0aWE<=Gt#CEdp_}nA0mUGLqLDikwitl|l~3r*;auwVUqa%a z=pVy7aivdbuRJkfza&XN!uQo#k_&4WMyH9AueO3Vq|7ce#UWJn9N{DaqOfXPuwqR$ ztuwj%rd}MMgKP5u{yxSj(^AUSt#Sxi8etzY;mKTY3RL at MRTw`7UB1{``#Z~7OJ$La zCxat?TK at y|UmXYB zhYgADf2LOGKtMGArsMD*WduH&c+2QN at PN+7PFYz`I_SE{GHAL%6cFttK_)PiMrlbn zYUDb$!E2~Qy2dshT%qb(<&D+SSoRSO+Iew1?Ls>zzv}uG{!1B~tIie!8=Kza*yq^w z+U76W*=_(GZi8h|tk2D+4?*uk+lj8e_enY3Z;a3WNF at HV;nG#4fzq{GY{G$8I$Zvf zLFdi$!tRY#M;_d3N5UV-*Vqqli#?%Q#N1I#-qnHQFaFJNP}{c2&`zgV$d`$>*-*xP znafvyMDw)Uz^HxTmWMn at gA}K+(8W6>Tmth!Qrp)E%xO-#gG&CYfxi)VR54?oQT?8q zp|uCNwjY at +=HN+>WDBHD-L&aTB^}D$;u9!&qOvLq?xW4B(hB3A!h&YC{8plm`Ta=YB(~m90=sd#1Fgy^rNWe z526cL9CRkNIo2)FlFhKUQC8*5I)P~CRz$Kj-Egpb7sx~sT#oO~!QQXsdGk9^ci81} za3zBrqCE3KR#qWW>s$GI1U-~i6~VuNHd5f>CXxU6lg#{wixO^0Rj3`y{S5(WEi zJ1J!yDjVgd4S<)vw?`Nh3Dc+1w`#?Ia7>4`)!xD=qWCw!MOnPlZ)3>8{g z at z2-`NA;x^*(=3PRY-4oEbk)?_lg@!7qE zBZuK!k}fjRj0LeIGv^W|aSB7qhsWVBlS;OrLs-zxx2ms}GY&Gi);Ar3O#e36a&zeD9WYk)2sf=}EVFe+ at Lf;1-sc7i%$qVGv(n zU7wk9R*9zKZ&%DgyWX`CG)D!k&G_v{90nRQB zI at NoRSt7(2J=j*P*nR%Lc at ULX!Tvi+m9}%imptZWL&gN=g`&vb&x)@n0BrZNzCKP at lOj2Rn^^6aZ zOej&f+mU9%N1J{ABjS+}>|veVKyb{|26TGpv3GMV^#(<_9YgOVmS4#KS%<6kJ{CF=qf)smBL_cdCM;TXs=bz!H<2eSrXMCh{N2i$y2o zc9nugAchk3M5S1LZg2xTVuT2Owz_JBJ~z?9?S1`bebq+nHcV|#y_}yeE+u`5q}V56 zi6!`=RXG}IZE&o)z{hbJm3{E)~{t%W;*_}l&AHu&L2%&1>GI*rc&KWj% z)3(jo@?t&b9#hwY2$0i_^6H{X3&q%U8*7@{1Eq9tI=pl>uw`o_wzBJNfpM$Ywo}To zOM;FXGA4CqKfrB>`JUQjeZS!Gau^EUmU(xp(H!S~8L?dVTeYS3?MS>BL0Ie)sqzZ8 z?hCQ(6ZQLsCAfwp>>=AHN&i+az#%-WOErP#h~;8W05A$4i+M&tU_{5;7)7z%AQ%48 zjk0$(R=r3q!h%(~{SH>*_CI~CPb^3xPs}AHjWq_Zwz(B%khWh>k5smk_poD-Zf>Vq z=2lvlU`&z0=l#p6WUbiv!sS61sH|qYM&|~h1|u!ijbl5WXA6iO*|{K`2Cm!>>53xv z1SfyYDj%xk3_SMk8tGq7SYSzVag_B71g!}Ix;fl^o?pED0--j58zY1s%awe^1v{Jt zJA?$9qNw>hDB(P&QJ6OJ zYvHdB+R3l^E1$@O*PXJ#Uq}NRNnJnWRX>GLJ#sPLp*k*XX2RfFQ?`!rlh$Rgy5cCN z(wC8K!Tb#u#sp^!4e|5imZGSoiBxAISuWEv&-I~gfi`pfY9j at O5k?*LU}35s zgRskBM9 at M>P;6e-6HMo2)Gm0$M${v1q|g0*_7c;B@;&b5*kE32E~zVcUO1(Q?B=P| zCJK4(GHpt>>BHDOO z%to{|hnfjP at c~DUU4j{!cI|?G1eFMRntTyzjb%Iq{Ndif-O+1qe=H99{bfJ^W!CpH z(XL8k)Dp-UVuSAfYTpY(N#S1R`p{aE#^rJ1!F8zve&_)MWamMZP7Ko*K{hVnH7V~m zGJyy`l_E&SEqiFrB9>nQ3`RPw$!b+_d}O-1uV!E z>HOYiA@$~d%m4Z88}P4-WJV)j?f=Y<|9M#dw@$E|tCj6PV|x=fXJ<2eS4Kx86B{E7 zGkPm~bBF)w4$H|i+k-G8;fd^mpeONy$XZuKD$<}8h!*TLrX(WnaNn;%^@ztq-j-2? zNGi3gVoy(5Kfn9Ef!qcu{VC`x9C#fpHGCcBR!{R!;8L7+q4nvtJe7oLd?A}}>1xcb z#!DsPS8meh4n8_g;j(&1eZmE|=5jur=&RKy<9hMcf5=IQqzw+ftFGy;#lMi<@J%Ri zOOKQyt`q(Gfes$87UoINcBl-I!vlfg`;npU`Gqgi_ja)2y;^5^0bVIoY at w zV9O;}q|(iVF`Z&*%?1yv^^A`dU5D!yVvg_ZbH-F33Z|&aH)0?_8~oDUx*9$i=Yjh> zz#bK3)5-TUo5*?F^Y7*Z${%aFl_*lVzZfFIv3)#I4PiHc&u>9kZ&UUL11n6RZdlA# zyHaTeXF!z|f3XNn&x>XlIc)#k-odt>5az+zM}U-EkKhi;kq&o=^6TaCNIH{R~(9mP@!H_pIuls!_S3BpnvA(_s$MT=il9< z35(z`J*i5~%4-Wx`PM+Uu0G at BsEXfu(ZBvH>QIB#MK%AR&hQWF%>Q?&|G${q{0npT z)WZzGvz*ROB}Q*W>tm&Uu4;w|KB;m}%j$O_E@ z&+0#LAE%!jKYzqB?f}^y_=jNF7qzA5|KXutQQkDOd`VXF?~8k6r+}Nz_oKwd5T6*^ z>d2Djz)+DJyB|9iRtQod{sw3N`cr{L5bdmUKd>$=BX4g7U)#NKnAznnk24!8d at -kb z#pIgx*bJCJgH!M>6mg!k|IccXK~SIf3B*W{yp8k~1%ANRy7 zxhWrjLJ=Hm{C++2iV%v0`5`S(AO|(p`K5zfE6t^pO!6A-SdgUOaWbOG*wqk%;Y#b= zePRr8zvcbRyp~g~$6!#A=j7i~Hkw}=$*#P93y$$=m z#OQ8zn5pXX%0cebneEIzxKxOdy5!9T&8dM5qI!DPFxR+4#DXWlX6*Db2W=O{EAP^5 ziZpzhaV$jlgcj#RG|sn(h)eAD7EK5eR+FsL6+(-`hdib`0=>a1t`X;t&0SZ_hABW8 zSLu6G;lHW;smO;a2oR7N7!VN0zXiUWgR_~Kr&COwvw2*Or!FsJb9Z_`HT$>dSkfZJ_%Jw}$Bg-7GcAXV`$ZRr3c__L>;Z=!?HY(d zy|noKOgn4GotrVjXKOL)@`oS7!R|H&oJwV1(}it5a7Uc4c-9|jHCJnvSYc$LpB2cEI(t;X9f_)!Rck#0^4p>=pG at Xf!oiF~oj48%c?Xo)7=IAOcT zVx}0?IPGI}53qa*YH3H{DF+Ml8vbUT=A36We?Oo&l`WK1!W{DsL!*#N&4?teGq(#0 zKaOG+u6RQq5km2gH_aIM(@GWJgwh$rVvgjnYoL!vBwjs$yhkrfTVIW at P#w|5VJJ-K|W_{v%s0 zqk^V^_RX*;0uY%rL4!j=19S2`{f*-LTYOjo0wRGa?EfL<9fLHBvTf018Bbkc*kcl{kz2F71L1A() znP-CjX|9u{Es2N`Q)92Iw at wlnBs zL8h=39!A*p0jbeH|b`vCS(aUf{ZnSSpj2%&0LsgEQU8mvbN!De$lvd6jyn-LBjzl3kP~5<+3!2%CjMXGhLsS7oOZmGk`U9T5Too!jn{Y9|pFeJBk&QJ+rYK%|K>7vRZ%O z`c+^9D8c?h+ro{+pd3407Bme1CG~rNiAcqBuBx)ve at huOzc>S)f)IwJ$TOlq!Yep$ zq+{YmHm!O at Ev~Vx*BKR;E9P1rb8Tt~EDdoXi_T>JXCar52z%G*-KOi{i0jN%V;Z|H zgW3Rc-r21&1`nA-qzA=~?(U5hK6DW6R(%@aWN9g~js&lr3LP`*{4|=pLO9;iZqem at mvm6JyimD~ZSo;b&pfjTMQ|C2OxA`85MbGZh{50zuRU5W$t* zv7zr~V}AG#R*M%$c8CJP=mN+$eq36oSB0)WWL925*l3B62Wl!Qy3Of4_k zW at J})9dlQB?=(vI+lY5Ye(oMOZ_P}88R_cOBj5&{3T!#=DQH=NG-cFiM;>EEG^njR zcOXY0Lhs~Gjq3$&#JvJdhA3Kh^v6QT0jb+FrBI at bGsfkXKogMLI(9ya;*$+uu}3iG zd71JI<{3!HRO#Ux_xESucaLyXEH?dZGGh0F=-Hh8SlMQlK)_Yd#ZLTtaQu70(8<%> zJBqMqI61bp2Mf~0JDUYV05*1joUIa2ktjBjfpC!Il(@#ESYYY~NH~nQ%AOJ~2kAgu z?;JM&a9`evnLxYElacMM2^L6xvh8_UI|0Pd4;CfYFo2E)f0&XtB_Zr9&uj3%W__UrPmr3zu*udIf7 zYIbdEI7x692z!n7Pj?|smN#|@?GijL#yleQI+Z^u#TZT}i1zUvA?9FI9`a;KQlorL z4`3S at e;@3VytNS^1&S-+-#?;-ag@$*W)5-k_jAH7xI$9RbIfpqVSLD(IY(f3SD?b1J=|Jm~l5R(oB#Ox$AYFX=-EvpgoLlfxn~0C5O<8cdW^euz=eRk7~ zq>y#vtkRo?UXyVR;=T>il2C*UT{3wSi+H=_R#B6Bn^BT>GnhrK;+rIW1!9;ek>DCr zMpm@`;qSOQ?-}74U(@V!h&2Hdb68ucc!T-ZprP2%eF5<|t<47q0uukf2pa#Gi!iaZ zur(7lF|zyLH=vcZ{#H4tU&YGF&D0{ox6l-58$`;eXtep8(m$K9BY0k#w`9k6U6U`s z{@!E+eRnD*y#n!L-^)b|Q?|ysqB#nqX+uI9^Rf4F#&u?zUQf?A5QBdkg|l&fYd93# z3Q_2uCoEp7@&Fv`rt$zSt9033GoTV+0jNf9abLUP7!bGJT4iDCCa;XNkXmrVrR$p9 zXJhx7afRMoLnWJGa+Zam?8E{n-`NwEsQ_*|b at EAWGh=zK)xtM57{k#uJe`^?)GGkQ zi|wYcURM1oUj2`)sP&z_G8>GL3BUB>q^8a-)S7#cj}3^Mb$}w~QWUpJHA#K{ z&gMWJwVr##9eBXrgLq+ry|8E?;l1Mc0#|8J at aA%}O3vTAn=}eZ9gT<73`+0QKKOIr zd3ogXx87XWP7xb&u~lSmPRC^WE(IOKE@%PGrOq2HP80RZRD~TePZkR0%O(GWqv352 zoRxF-7I{Hg6Fe!Z%fQF1#ei%`32jj0kZn%rU_24xN1Q}u+rm7mlq+o z>hnX{J at 3$E^)7C&1C_?s%fqb7u5BBUVUiyKL1c-rf z_qGkR=e&`KkD`-|n(?m6W(;Q06k%BuG>1 at 7wV^VqB=m+YXcZJ7j09smILymGap=d( z6nH at RSF(LJ{_f%UOSX6 at ARvYRn+(m!+{D<$+Qj&OVqH`6|6<+9x6(S at Vw18kszO_+ zD{a^Nd655!uQkGQB$){pR{!`|MjRtaXm#Q at VL z7yt&vraI~vGXSeYV0F9F;Fh%}^LQGN%wASPZ*`uYwty at 2@x&cyJ66g7yF}U`I&_q5 zfR at r`%Z(kzT-rh#!HuOn7xYmrVt=)vDdtc4e9l|xVp>rF8 zh5wF}k**@mcS9rPp4Ps=1BWA;#$PC1wEtdcG33N6W~_>|ZK>*?*Mk*8D10rmVWRIw z!HRFe40{b?cA~)^o=k=aEB9>#bUFw;7fu^aRFGzB*05Cd9#5MfZ^i`sp{3KI)dY>R z<7MGVoPuo7C4OA}nbhv}DpTE27VHyHRedGz=_3cfGVU;^!|3Y1=f62Dm)^4)O{#_F zwLLp|WcdTo(rUD-Tsreb-lC}h()61E%T at w#!HuNR!Yg)64dCJXTAODU)D=NpL8B>c z_0ND^u)$NMQpQzwKphcgF5kx`Q?0c3g2!ismAWivMLD%vPFvG!>#kHG!`!DG z?_7K3+ZLa+Ld)*Fj#X3j4(2pV}f;FCk|ejD8N1p&p`<-kg{Z z$dU+$GjixozOifIG3#ofVARyNNoTmRQm(;b?a77Tm zxM;92McYzAV-bN3>pK9}0)fy_WSg+hBvP|OMw7K08sMg8 at oQMXmMqvca@hx3U%x$6 z2!0=AAIz!w1@{aZJzmh%s=3Br2-&&Gsrcx*Eh)Rq at PB{alK=Mopg3Ti6i-cZ0AzKx!E}BySr1Vmo($ zD4*3qlF=3v6yOhW1RyA=JOsFL*fH_BYhN6T57ZPLX9!H6uMrqJo{{t{38S&U` zRNiRBOr#vxT~4hoUf`LURg^5|EiZoAFCSVO93+e3X2CjI2B06qiqTsDOk)@pL4~AX z{TZ2mHAFR}_Z?>~LbsqVp=H4gm})PjC`+Lj*)i$YSc0zeupk$=WNJnsNAxu}7;aJ8+T_9Iy6lW`8Wz!Lt6}`}E zuGp78+yjg6D~)tf0+_f+XDzg>ZHrihnphVQbBm3bYc1-{yihUQ;rB*=7CA}rE79&m zXG9bJERKYut%_r>#s*k)@Qf07k at DnU!3c}CRmI0;`;cFNX~ePPr`!%_4 at WpjaUu)5 z^zuUiLhVvfEQuJWU0fo_^DCmW7zi*|q at A)1$|vbi(>a`v9^$u3`MN8jcV3v?$9ga{ z=S9+j3`j7`iGEy=79*=ZB1=#!90B;rU3CJ^dCJyNPjEtP_MCpHt*UTZa;av at S=#1L zO(Y(J5rh2-!URVUn`k#xj7qp#E-g5PvZZ8jkn8sWL!XDX=746a?}9*PL$lsf0=wP| z51K*sjt)WYmcJpzXJl!6&#MrfZ;)==HY>lrH2baIi#F$7v}?tad=nL5$5{F^00tW1 z5VlR<<2td-;(w1fFxwCUCX`bnpr3j>)$J{V at zG<3`Dj(&SVVw1tSgYHNcT8KPVb4X zy6m1QY2cH-aX>|G0@&MiWTlrci!FBhW1WPRXf7W&!7Ql4rd~JfAlp}JZ|aSXGcqvbLd1v5bE|( zV$ow#?ZNNZWrR*@0bS75cdHGAmq<9YtpC+Wn7sd18V8U5N*;ayVbZ|8FX^hvBQR^g z$i>*qz>i-PfcW5bb9L!P2<~l1NEuuX7f;$Q_c-e!`Eho7COiZKYk)0sk~99pa)4XE zN8uQ9JNK!SoAb95Vo^Vu0Ks&}nKGfcBn7`P&^{9yw3$6gb6|Qe8}OdZqV2&6TcOQj zu$uxusyTx5|CM*>3w*1!kUNT98>nDw=&!}t z#>kdi__3~YBs at n8g(!B&D~3{z3J#=))iHAIwk!p$GA4eNUy$?%j$?fOy)6l zc%4*{bs)oEq_XXLLoe81U7?)JqGEYo_~BG#Y&+<~chtP#p7rHr zKEYLX8T=AHD}+Sa&G at iOGpGi2Tk%ftuOi%=d}kB|0R$9`{69VC^6w(7@;4!JHgR-x zv3Iuke_QWWs#;E3YG_~0&LkRl5{l%>iX$$YWYN@|vZ(A~S)=vqFUZJhs_E-4ghjn| z-j)-|(+)=k+O6m(VC#B71HCZ%rt2X=5D7p+Sh>u>V)(fXw9GgCuz2Ir+?_YGHM`4#<6xe z@!)EQ>q=8EEZNC1GeI{R-m>dhQ>njH`Am;Wu=@FUPjyZ~6TB)wv*WU-$S^TgW%w`39Ds)Ot zqeL^E+)rdoIG)^Y%woM;5M?Cq*^=n%d7tRM2e4xFsE1iiN9)X_N7`ux0(W;l(Ayh} zF at UB!S@~ifhW7?%F=EauwJfma-6QL(b*xJoJq-4oWqS= z;%H}S&^INe_-3|L$Tgbi0*-qW>8ewvyvVC!BP%I}P};;RUv}sGohe|?#BPRlG%7T9 zD$Lusm~1 at mYvc{By`BEl99$iP*Bj8g at XcIlLrk?=f`jV2k%cFX)Bps7k+1BjNU>{u<|@>|$2o1_ zcN#kki|&rjQlz`eV%;|e4*`?D z)q9~2PC6rSrx*8J-M{I_M^b=a>Z5CRIq~#{R)AmHqmPfqVcZo)q+S5ga-+Wyd>&|^ zHXG{RfDzbe)>d7Zwc>j#VBG_4G_`ecSY1Qh?6vA7mR!2v6<;S2SC6jByjw(#qN*eH zlkgDUX at kk_*f+Xv8&BM=y>(W{a3-QPa+zo~M`QRJQ_7&Dw$tIdw5E)0iVnTou1bGg at d zc`Oe3C^k%+z5T_o at gC{}5p4WoN7;@YW^if7cChzEZ%@ZcWWyYrieCpD=>1N|{0Kqk z!Wkd~^mhJ~I$Ye5d8rbv_XO|SxU24UvF4GgU3I5uWN8&GpkKuv_+DA{by+@? znz8$UkiW9_KB5}&N=GzAX6aAH~4G>syeqw0BfbvxVLK+mb+Xd0^G<9;Z5!K zoe8;A*%GX)2E=8bSlxvSar#98SX3{*M|8%DuRtk`&wC`ftVY~bYRv3s{0iXnx5(VH zyZ$we;H0bA at f&C*9j)o7+f&>H$c=+vq!+<%`GaOL^$xs~Y-tM}t^o@@?S^jo*ms`x=z6e49rWBeXp=&dXxidmC88mN`;4d zbY!cRh)0ed=Onu}^keq`KWwu%bq5O%#am95Kg0pm4`gf!+juNi;)~%mwC+xUFWZ(B z-LirS`{#uhz0V;_Csjy0ZZD5I=*M1-UwoIkCU<%TM+lG~A&nXaW}l%Qx7_rQvp)XgiwuWR}QBW&v;Z>oO`m at h88j=e}FZB%e0{U&cP& zsWipbXdRZ04pu_NU-Lhe-pBG%x-&S)PJ2?0#p|h#e4&9`Wuo28Z<#OpW;nm4*1IJ{ zdx{=wMvqp6KXI}}?Cg&-F!#JkwMHt|)(0vR8=7*ssn;Ys98>I)tc$j+SsAaBRC$H2 zv%zU=-;J#Ncbpy(yuC6ack+e^ur6uuUQlRv$nMaPS>WxRs4Z|;1rDyYeNybM6NVug zU&zZkM;`s=?tJ>c1?EojQfj3Js0~_K4mXH7#9r{TqvB)5kiseI8B^rfEK^lYEQur8 z!x_~|{R*xTM-1%BpK}vS$wL~gJjVEkRL{vI z$9g2P#1+%A3-A=@AEZ7wX4p&FDa8 at K`STr#sQdKV=yo{7G;H-|h9nfvBe~0A_PC-_-tFqFZ;Hf(z`G}RNsig$j%xF#yLuCl?^Gx$>^L|lWNRl3)6KYjF zL$)>JL-uQ{QQa~@y%F&^zVmre>0Gw?&cGFUS3-n1}_{O-nq z`m#Do+wUmDa}c8alZ4=c>}jZn9e0@~pYaC-Uq;NMJGu}XKh(Vt0zI8=xz3;<(kiHE zXO%Zw#Jo0(VUbYDgkf2M#KW1)BcV2SJ}?SwlZfTp=y%X-#J8M!n;?+jXO0vix(Q;a zzq8RCKGby-rZjPo?Ab##S-cxR84cW%9R!?0;f!_m#S7QyQ<)(Hp> zmiDok!Ty6oV9pcE52w;zTx9g*hRG3HfC=msGgA%q8uMYd?#~k_1BY~0V$6zhzWz&z zr}+;-K%3qMF{l_3<`fuZY!xn`RkvCz(HH8+AHdqn*2w9RY7S-dh~IUBcMqkUz7m;#nBhG>UM3bVUH22I9ycq_9wZ9+K76YbLy!3PA z2V(d^J7k3!B(d_B2TXrBHmtE)m^vF+#U_0^q^FKFA zm1XP}1Q2~P3LO&C$r at +xbfEJN1DCzGkVOPlsHqe^%@^N?b>gcsU5sm}?@~DYK?Usv zGG7%!HAX~cl_lo`FOQGc*zI_ at -_M_)34pTu#th)kJ&bSle;_E--;DMHf=AHDVV@|U zC9jE&EKjKckICoHS=HBWynBcj at 8hR8@*Eu!;#q_nv65$GLS;OR?T&-7Yfmv?LV2V~ z?l_O!MCSL=Vv~v!Zf$OZAQsywOa)#{#y}byN|K-(_y|J3CjWqq5z+GYk4FUvP{??= zpoZ2y1Xxes_Vwa0b<(xSzEHaHRJTw6Iu>qi*G&_wAQhrbWMoxjjaP&tvWbkLWUBno zo3gi8RcP-L%W(>+uV_UwG*1p|j|>rg&)p`eV?O{dmiIz~Px4w$2iFi^ybJL~Z8cQG zZgIUsXpsg#TaR|+c1`J~fjv}t9;W*Qvy&tVqa zB+ACp$P|L9(xeYB^u^~>$AB at H1nJIuO)6XI^_J_!y`he1=XGd6srC{XZ0KvM^&(G3 z(jQ=pUOi#O?#>mb% zZu`eNn+0azR;@7=b;On~m8{d^75FZ(%qgGdqEjSPq^R%Y z&Q9ZX8fI?T@$>rx*GHlU#0^RR;N+nuijn+bq6|}5aU?%uz!t&@ew_M#6e#W?YB|KP z_24{WW3}}ZEM+K0-7+M!S4~a_2e_zLp08v`qz37#@PbWK>7vIJ%}@-hDqTSCqqBQ0 z#ImxCdH3Rped1Oyoy>#95?EwQMD8n}8IX at Pt(L1D70)p~68ZHrF|U;jT3B6|C|#&? z<53PvS1n!aBejE1&Bm?6g at k9JRQE>(r4Vr<>5@=WtfC9CQJ9`!;Z8m=iWd2o%z5KG zd(*>}=s@*GBmDJf^FDftL6IQfTwar`6b(4zG{cY}x-0<0xvidne^Hz3>sxVj$%&lz+32`AjYi`72XleHtX!Ih|U^klakE~|R=2VPQE z^lHi`2{_FxXDpTYhGZ)g_kuF-T|H#DYlKF57es~MFRtLJwVBb(p*qohB~<@U;keK6x?;~SsN^Iv z`wWH%%znIh#a5~Hu+)^ME$)^r@~yzsoq>7k4Jiq9`UIN#rZ+LztjDR`kQCmS^dVzh z)`Xw323*?&2T+$-?M69Q9+ZeX}!$M&`#3{_)c` z_6>0Z(#uroD_*aewi%D7%;W9O at 0$@lpy~q;esFs+c>Y6%&{rPm&7^?Zf^M6Se)(N2+N0Ob*D_P^yS= z-U0o_z+jZNZv9qyrw`Mjy?3}6CGUpQh;aa(Z65HL7_l_Qzlc6)3_VUT#>p4 zt;Fly)&4zvLd}`*8BAyyuM#REd{77Ka$DZWV0)23|2X<&b1^~ zet6vO6G?eug&~!;IOo=%xHAZ4&l5cBPwXy>a6J9({s)*$_Q2$Ds5h&ny-H18GStJD1Zhr)L?_d z1Hd%YZU!DQNvd3V at IwoI^-GQi6Yl+m9-n2z-+Wq^RHvGgtI2sS($$~PgldjCvstl7 zOM8U1Jpkeqm?tq^VU>{b78y>W(&3CXipwXcnwN_Yxz|9S7~jL;7%qz zf+?n*CXxe}x4B<(Ov5ZviNK_b<6ff{?hPO0ktGKm98YwVzp}frl6(cgt&~Qs78n|} z at UX$(%4*qFKw$6$!Mp?Qpp43uAlsN^l1Y-2z5}4jv>q0lO&KcwTr-py+8%g$m#H(1 z)A9TGf&8lqyrnxV!v9r)GYB9c$^S?Ngv<>r{$X|hm*@SDq3Zwo^4~?^kc!6NA`tcK z3KgrgV2COr09w6}Hpv1>jf$!W&2Uaw19=;;SB%Fr8LNS~k8n2?1RDF2d;NvD^U#Nh z!pfMBaxy`3^4tPW&hzi}(|3nDQYguD^*P{{&4SDGr^3xPU&= zQyW9NClZIrcD!|Hwzf2lapM`?yJpv`djRV#qMf%U*}B8nF=^CeL(yl3A*|VX$D#G8 zOl07(wP-4}(~z}S{yYheJvrGSB#%^W8Fr#p^8FDrQDI_Vc6w1er2}?A1+*fyy^fy~ zt*^m(AC9Rrk|1QD!1*WRn0!KmS=q4oTKroO{v(aTLa}ihQCZivFjuD&z zHJb2L9q=~W$Uc47uUdH!I!jFygu6q8iE+f_m`OEl5wZS5k8^6i&B8Liyksy z5+$VKIHmRKdIgTZ#YgNIOb9jC+H{5bqHM at Rirprq9``_ZEn8(a8XnASw)AHJIGD^y ztbq>ZJjgbx?0f8*im5-0MysV)3h-Ig!n0>^}&8YKYl|G0P zi*hmc at -||SC}tvNJ( zv^Ag at eU{!N$2STS at f^gs?gEiFf7Mgw^+Ng+BHg5JB3d7zeEtFL%@>wC|}c8M3u3Vf?$$Um(c#4IW7H!tr;|Kl3~!enMJq zjG2ljTbnMdX^1y2qgPeMG^_rK5V0hHRJIIGhsYId8eW#vYD(7B(rRq_TJU?*>yg{Y zb~3A9izT%->~Za}yFSQtn&G|n`jh0B<&G}^_LUqp^pYO~(BadL;8xi at 3dGPeyxF4a zz6d1@**QuFx2CirM4;B@~D)ze3VKRO)fJ}Nd~OYpR7FwD0Uzx*u;GiSfrrP8es!T3!g0)PJkENA(CDgw-HP&h$_yQoM`xGx$Abba&CR4iU} zIy9A~(A at N0vw0(}Vd6qPvt{zgrG3z{DTS>Dz#^q4 at -a29=_*bVY)xj5O{wJ|IWO0- z^SDBieOVdZ&bm}vH1ortf!ekvio3H~Hc-um!xX1 at 8<{avY0&r-G+G5M0hPudJ!(UO zNIEv9V5(BKt7NzlZX(=mjdg=}vNmt4b|F!W9SkK0?O&p~q1A=jaFud+S~vq)!(`CK z7(FVIDOmGUh{u`iwN2&~0Tz_Z34=d3 zGX*S at Z6U2qP)ux{0x#|uEzl2o^@EYe)#!1g7 at XQ#+SSwLD9HVOO$D zl~zfGP>iNjwog2Q)^_sYht+1BlEt8vKwm>Ka0ds`w+XPuHiwTMK-n$a<}V&vwMWT+ zcx%$4M`;ln1tLX=SmoYR<Zp432&u9gcrUiVB>yGct$qO%#oP-mLrEgy!tL}>AXBCBL{bK6i{8}RvUhIY)-8S%{W0p_P7&(?ictZx~q~xUMP6WF^=6c$EuA3BSv63XC&%TU^3gb zT>E}#k>^Uhs6f#4ny19T&(Q8&c)`OoP`9M85PMD7^@jB(o8=WfF=9=A0#oE`;v=+> zeg=43l3A=roPrO;No~Wp7A_r1W1$gOLTD>U=8c1i16x?=L{w4{ zF{GKobVv5U^ftiQf_*2pp{#YyAgW;?p(!e70b4Z$6<`{T1lIETjUDo*F}u6H)P$pn z&(Z;Qxb&Ws0MqjvQMs>P;H{bLHUypxYdP9pd|lhl#$^_~P77Cji92!$NNHy547JEc za&p*ETWabQ*;wEvQ1)E%_p-`Ei5XX&o@~@mc;Tm{^qwklot})>8M%3u2)Cu4d1c;K z!cD)>eZD?FPhY}~?d=nB0Y+M*sz=sR#D)GXkax-6buc z)J?dkG%^l at l=ZO6z9gntpU2^H)R?eZxq~6DZ2mD9V+)WN&83 zg;@96Lu^t*w$7+Z*kei>pgj``l_d|D#rVA>*f5gs_NUOAiw*TsT^`%NP+|4go3K2# z1LhA>uZI2vSOZJXFn}`*s1rI^L-KLnE4;`N*-7!!akB=5%QPxaDM7>~l)&FYp(j2O z`>iTkF{TN3Wze`FI1Y6g7rn>Q;}7EABL0ckqCoeuk8;PX806EY#}`Uijma21Fvox} z2p0+s8)((RjZ4;sKpRT+r(Ko2<%M9E%J8J*!suW?NfAFUw+<10*$mErtQcLIY7HjA zsc#)H;=Hw&t(MNjt#?OPIEov}(8=%%f03t`B!*bX3Nj%;1G|4`w4$#j$uRzduzUAI zn~*r77pzm>eUEpa(@_`xfk+Bgznnvs(;oPKPy#yZxUhZ!Zy1U+JhvdY+GLKkOgfIb zcvp2b>Wbo$quq%j|8uAz+K4T9%zpofNwHHP?3rljQc7YhIiZyTqKe at VjPp*Cd=1yZ z5qWG_c>{SVAMTRH3p08*dSosbH}-PKs^A`1b1EBYdGFwZ&N#H89e2t=N!eLng247JuaL5HBlqMXZTwyX{n(hXRk#7pU^Gaf4<+ujE<6hY?l+yw( z&xq*r?b6fKv!us5tF&gr2>X^{$7#1b%-LqcIRmW7Gt37braUu|-?5^@_ml3~STpy8 zxC!?^eXMW2;R!}xg}h13$fIRvEke~O-Dmpgr{!t70F>F*lQ%C669swloxl1%$i^X? zL-nN~n*}?AMQ_>IBAiYTuk#}89s0KO*RM-Hf5^eZhsD^df8dNjZp+=6 zL46VRK~QSzJ-OQhc56^RX!>>tUpQkhu05Gd&3&w1qn)QzXn( z?875)_X(*wNQk5{Ln&9ewl4{hTS~%~_8CG;FlH8~O{!O>k# z at 2hV9NoJiI;#@J=b86k{s-CA+b;c{1SzvOS>9K8}sO5IhiScgXu`Tw)cN=|$DNPZX z6l!Y0aJeC*J8j@#dU^i0!J&h`VV-ATAfP$$|Fqx4_Fu_u*MF}rXsymyYnP*nprQro z{+`#A2L-FLF;rwlI`mnKHgVvVYVLsi?)BSe4l8}xZMf}wKcau3jx=i?LKOxhu%1tI z%DB$Fo?P?z{2Y=3!b06Z{G~`&#=sI8#28)&IghCp2UUQkQKl^)r^J|Ns5m5omV()D z)z0d^5pw$&utNy30M-#Wr>dJ=i6%M$&)(Jze0+v!Au1b8Tzskd7nzGM2VE<8=58 zUdzNFZgbCL!wFWGrAWdm7Bhiiu{nT&ro%LRoc4-t!vswUo6bm6h?|SWIbTW$)rZQI zMY~T0tpWRweU!n=??@JHG2H<;R7_95nMkU&fe1pEP#lAk%?+>i7 at b$)F7hyt0w&=H zN6zp24EKke;y1Yg!Dm`>x_7r(uYOcIH{6&vsU^e=^Wct-Dje9fm# zL-U5APBYBTzt=zF2bNSQsH~^^Z0Rh)d;4b)W+M7izS(&lg6gdJh~H)8;2oS4ol(}V zRFvQq36zWbhytW>fn|XkC)W>EY|JaNka8Yvojbmaw)Suo9eB)4p6#>OR#S at -ah!Tk zJUJFM9RESEn~;2N<@c-T9I`vzE9eDh0O>kNnN1_;P3ktfo)@$W4xz=#hQqt2S3>hC z21?On)fZn7o8JtfG`@yha{2E&aKaT5)$ZKL0ZghwENq?pmzOeH=8!PiKQ zqY6DQcv?uLamvi%bfd*|-%LV_RO?R;srexKtb5LBRt|U;^%Xhz_`==JoeV-QC{QFZ zU~+Nj1bX0Cm`|X8Ws#7k$8OYL7Ww_hMg#jlZBu0_In-Z>U!EGSs|KjCA#%b<_5}UE z^GiGQW5o^Y!=V7e9FOo*OvcS-3kyPrdV64Vfwvc1FLsfv19z(o^`5C^XJ>Ea-PP4+ z1U)^zAPj*RWYUot3=9VQe2(CETNJtG`#;Fwq|-+G*%)l}hkJzp(rZc8y80)hM=O}~ zQeVaTCuOaQop9$WdE58pV#(BKJA2#MYPOBG*bAN;aG1UNUCD~2r2kk_o-iJ|J$IdY zw#u%RsCu7=Z#s{o%aW%gZ0f>2lMmCkt{$8n!-2DlFFHhue_?~~}?K1&&Ga+7tCAOJ`6{;FpwZbJZc`!6 at s}(r8DA!8h$)93a0ayl! zn{qp#w<&HB>PMI at 49323;Gyvum>qXA=IyKCLsB(3H=a*8dbLAY7bs;^_?F_8bUOQDdwj($5q1G>{^uUq$B at +{;_(?;21C+spQjd_rZ zjOZK+MT%bVJxtx at 9YBa!vo~I>#0Eo0qYSlen;4vtD5rEJ`oI&?Ewd=HJCwkUQoQoi z*YX`ktH>WIicgamEGj!rWlnQrY!g*eBpM{<2MZc*ur5$2DIaF}QLq;H=Ww`3;7~3EqdSRiAmS&cv+lDMlvrSzG;C(?sGq at R=5 zT?8+_pqME6wQOvZeLZCKOPpI#g68Rfr|BKJaw8qH_oh>Ee4Ff4w|mn2?Udb%bsBC$ zVM8-lr7ao2OTZ;Qq#kCikEq#y^H| z*@A8f+8ENhTz=3Ixf_SzR#=JIY}Sjoh<0U&7*L|(IE#6)i?#eVm-svrdx?^bS#@{% z8)u}B;VBag!?)RZk at fk2lXGB~ph_+gv5;?bjH#gNkje69Cx5PpdOmkyKLE`Cl4&cG z(-Wgs`~=y9cwK7{r#i$4aU7L(Gj+TtOw0J(dCTqq+QX(l{Ui=G zW;~0p=ifBa`+k-L>90oq`Tv8Xe@>ZXCHyZO0luRWQZW-!<->m`3o*vFvdB^g#g+n< zSr&=!{S-J_cThc5ou<3XqlyVmgd7Az=oKO~&6;iO6)}<8&f at iH_@2C&(cAF at S{*cn zQ>i at tlWnUFLw2QAdf*=xLZ(T!4%<}l(=izL&Io+jsPx={BtCIMAJG9Y at +lwn8K+nf z`fePZ^w6LzY&^jbVMM3Y<5%xTFV&FBZ&X?gLFCXuwv0v7#iwOZ>!o<-P7WO(L=G!A z?Vp1uvk4~3y^5|_ID=(eftjx+tnQVQ*I57{DV)QI at 0lJ3!S_oIE?-kKK)i&gn>~0n z)_ at 530V@ZywXj80H(@rG!~dCwVdToP5XvlJBPCV8T|oo?nmsG+<(un-i3?Wfqy~tS z48rZ&KlR66cMpQYNwHrOg-ec#sI_6Kvn&9~VbYW)4J`P4Rro3PmC;9tpcH;$c&0;k zFPwU!sDOU^t8JEapmzD}c(W(w0{@;tN+r{54Z1&;Jgj4h)Qmmkt*uok zX0?#39caM8`Q*nL<(r4xYp$AJeoq*6qg7aC3(Mbsa#$tT*O^2qxjl>uct$&-XR+I* zYEoH`8fQx$Yi^P;tJ&jvWS^eg465EotIVE_@}9aS1I85Jf zxGN8#`I2`eNU>o+GVbAMu%4MFAPN+w2bqTo7$t;)Bj>7jt#wJzU2R8oxDi6CSS_jA zH2I>}u9w>^tS at 6zO9)h`S2bJqBwAj&oyR=M<&=EtN$s?`xk-!yTaEI09ZybrP4hZU zr at 5KtbiVcs(Em{PM*wNX^a56o>LN|#!|9!BCH<{+%emAg!^>B*_XK3R3%}H+wAYin z7xCkymHW5X4JqrLNs(L4e21J%k7BsyX3a4E>`g8p1UNM!L`tFTH^xC6){7<3du)s==eaZ{N4s`0K2Gumi0M6nU)%w(}H+XbB7tf+C#wXEDw z)=`&6;IAP{vm7VOsdFkm$Wj1oh{G$9?l4eK+o6|R>=RPAkZL$@kL*CLxUH z*swvnaUnh8HFZcJiB4NA>BM2sVrG#;qoKz zNm)r{WXe9+gpvJ+DbsmQ at B9Ldfc}*+y&HlluT5q$&YJm-ihb-%Wh3->tYl|zTOM$2 z|9(ppRQS<0MXe<^J`?zSeZe2ZdmJS~-JGpTxCOl$0gG|x>iQ{Lm2cqVp!K^N%7Z}7 zINOYlYR>LC&?U=z>LzU0!N?)l5y{na0MVaZWNfsKOd?xyeGISFRDwesy{{%hqE?M^x#mmnq%G;+P3F(OI?6}h5B0b3~V z>rTp0>#3Ca4s|J-=04}p`{2Z--5 at aPFG;e6z-X*2%!F~MSQ(J9LAoT at XbcS%U^JBN zB~h1wjV6C#nsn;YXp~P*q5A6ohqQMJ79~ouK#zUyv2EM7ZQHhO+qP}nwr%qs>%QA> zW?n>h^hET;`>S11Uzw}2R_>j()_Co_%SGib&UVvf4p;|QN~LCpcL%>*@3#(sR8FsM zRA_3|7}T>mg}siF+mNzdCbYYkl-;BRW&$gJ{A=$Q#rjS*Gr zg?bd0vo}zhIr<7ir~_=6GxjJnC+*M)C+5O1kK+A9$#qY;5p1T5_3+B^=LJY(CxHcLKqvUs_$23daWH*ijm!gJ60WJ^*vZn zSF|#HX8nwQ-A0;zo)-x^3%HD9F;2s at a{LRp5h+_(sNVS-iEqil8qgFQ2 at MmbGok>a z-aOB1kk5oL_j(!wm%a#Cpem&~8TMLl=-#=tSC8wBv4UcrujJvgaH(aMB309^jhc-fBwf!A`Gq=gk3FnFAu*b!u zDhlQbdtSJ%RO7|etbrKQQLDzm at rN!p{+;iL{+q$!)2=QOg5&S z3>=#U0~NmRI%!;!R at Lm|*eo6WUihxLpMWyS9T8{2t8S}9MT zQ)e(AE0#qHr$HBs$!}3J4e9;T_kwQrwd|CR_i_levp$3rIUExVIP?lxCvgtTE*Y1B zkzjm3%Q~?Av$Qb2ak%8jd4EQiV2RCDXK!jwmpQ(WcYiQ zgB338r5yU8q|DxvqhkB3zJi%H)}_#4j}<0t3aL*k>I!z)D%`No@&=di zKEcDIi`cjHE&d^A{zL!O`{)#2 at r2i}xTd*tB`vN)3O-a#pouruF+{k!uXg%cL_D3X zoD)&u)L3d7iuNYvFhEYr4eaDjW<|T7$wj2)wz!IcWnmGoadS9%II%fWwxElzhbsU8 z-2mi}eb#!!uGb=nl5N=~f7AM at j_+{ovgOcSqFE5(VY@}r+I7S0(4XTLr3*4n8gCQ- zD49GVi~1uD z7QQ2QeKgD~am_T0OYEwx8#eUl*-c2~9<^RH>??lF7x9hO at Q2`q=mMf|n}pdS5^;lU z(zq|3?1+%uMu85=Fa;YqZ4zq)GXvRX*p|3eO4G2ZTfmxZmUx!Hmd$|;$qmcl74enc z;gkIj@>$-|7y6mr at fX5u-^{xk$DdqmN4AF^;s7w}v9b=CZ*hInRwt|v2Qk}g`cwOB zrsP=DF=5D-)+0{If$eou+wq(2FJFVx(cDS#5z8u5NdLq_ at B>LO&yJE3cW{KqUOF*Q z++L<2Hu#wWP4+8?DhaG^yQaEXFcFH#5|>5G^u0`?avxSPSHO`)N4ktZs%|@-VKZ;b z3>LyYF8+Ilm(|869(GM{Cv*^T{=<}oBx7ylsJ3+;IBH(R&LkbJviU*RP15>&nB>dQ z at o8LFzXJM3;qoJa{2X3j at IKvw`~v=*Ob>1K|0En3;lbc}xdi*_4Nq4alvKIW at F?7X z@%Esw7_q83qfx!vsy^~SOnr*)yfy{m4Pm|m&?dnd)_8|A|Io9Ji>a at C)+^kOtvo8I zJ|l5J^+msIcRT1vMk-heQIxQk(DQ*=?1)+RVzW{S=eTMyIwVaW<$LLx{XRWtYftVY zL6U-VAyNRo#qm#TZbW?+qIRlmGiD^i7*rWkQmqF2{*x0=%R!>!XxTYwiVr%*Wp6Qd z)>#;Wwh}84-JZd{;65LOpTm*QeEoEpv`E{=+l0avykqNyLCY zo}yJLtr4hZ*BVv^R6*vL7*cf^Nr<{BN5M8)vkBd0-nXpg(a)fZCca7bu#(|YcuaSE zCa$xr_udSSY`%ZYyw*q55F?HgJAhYF-pcZexFRYXD<7*=SGAA9+hN?Wx?!kJmM$%3 z#V$2>$l6XJc<$V{_hLaTwP7phr?0nV4&DQ&F(HQ at M4bp7)f8-nnqSWCW_9mSC|00I zDpTk-2cM*&TW;{W0PQtSpqcJ>YQK4IJbKecch0y0Pw*yp#aA&7yJmwy=1^({-htL| zx=}TP3|Vh5z;;=-r+(dn8T|yDFiiIqd#D$7IQ7r4bt617n9~LC-^SXwXGgXWDXDx+UmA=Q}(t>MxZaAYjs%WwK;iDzl=<|yvW6k!ec4bN8n59iQb}(7MA`;v8_mUE|ejmHv}| zL;RZ4&+=YN(pKxD)=99ztUVYCr8DGX%}5QKQ5FhG%)%YN-ob0B!fi|*<5q=^8?(+} z68j`MUKNiq|8AA0WI2?$vw)|`L~@XObO+ixQ=iGxH at 5u_A0!yFDF)L4JqI at R1VeW2 zVVa(*M8+kdhhY8$Ttg$`8rcnJTx4waXtg)+c*O_LA at D?HIEEap$Os_`a6*K9g1$6q zHZ5<>Aw5Wq>K~gnYC at QhTO74NiLtzbYuON%s3 at qg20!GoeJ)uUpF*hgP8VMD9gH{t zd6?(vdDs~ESW`rVL+Hh+*d9T`nRcxiMzLZ7mr-0euQgB;+Y{r_=*UmGN*{LoFW3$z zyLz=j0s#0e0suhwf5G;D!FWf@%^P_w=g;@LhA1X11PEeczi1)_<+z|S)`Vj)KfXMm zgt$1eM+;^|$VzScP6_)6MXZ$}xSRB0>hQ4a5Q(5VTEB$#Sa#jNPR;(|+;>67hMMomC)M5SZZz%JLq`*Ud`uaMdSGEV2BK*pv0*C6 zl6XyWvkG?M`T zw5HsUYeizi29Wo5{$WH&s0SznG>LZfH1T?Xw8k<;)@tctN65$q!C at 0b)x#7Fb&^9z zQY{zM+Wr*6+C+PnT7$F}>roX#T^a$BS|dJ7;p!B9j!5fk7Q)pC_nPp#Bz>0EsCM1J zmUa9Cu$6nq?Z_F8^}w3zMbbmo)oz_(S4d3sZ?J3l2Bl#fL~B6? z;I8$aEFD)%#t zC-J%n{t_Hs*EQM$z~DCO+;})0{c^qB1Fk$6CecB7CH}ZffPW$D8&5$zqF{WcPl0_i zU7tbT7+O9 at wF0F3$G2p&m9Cr8*=cX=>`UpYjL+8P)|J)=X4WPbCju&qSJ04((7=AY zUPa;9fxf at 3Z{H!TT1y3Rq~wz&JR_I45MZ3BwG)(*W!9_LFOSNv+X<5_q=!p@(1{`#Mi%T~ z*4>AzqU|j>-5xjgs%|vRF72-NiabM8>I+xFfd=ZsG$IiPy=ULVQ^w4zEo0ukqcNR)hTvP5I~ioW z)`8#qkFhyKgc09WY^UqEdHtlbYD{f7Un>TNwEr;UP%~kd at MGgZ62Xwtzl$UhU4lSc zQ*K?GM^vFNUZgWBMaZ^Q;uK91nwVjV?s1S5b at f=6h_!#uwRv-x5a{U>BZ`irFGH4e zWivaFd?uM*N at 8YAUgC`v6gJg}Qt=nVPKH;yPo#mt7qm_cgxk#O=F}Rd=~g`%R>d4C z=*!fnc4wLm5`baJcs?$+7mUuznjImGU=<)T>d?)|I|D&LC)x9_$9vjzkSjdP7-!M} zVVv at 0CfFbRf#d4|d5P(CFjapB5eyP=K|dHCd6fOk{+M6zcdL|W@?4D0hQ5J3GjCmN z at VJ>f=BbcmN9p2w^)tGXO3Ek&Co<^u|M}suEs#QQmxUZ5xH&J<^SvV;r0BAJF-Wo7 z$BH?uprbG|%w`oE{atp)@I_l-G;{A&%eRT4h4PZj$t2YynrqHEXd>|;MS2;R+D}Gm zlvn&jdNPirxP+fmw-zZAAoOdcaB0BMS`4>Rvo4s&y5!~U`?E!=#)o{s*8 at s;2?{=`LL;wr$`r_!!LB%KFp at I`DY!$n8NQW^ zd974KMfAj%^<7|i#K6VjAQvUly+ at Lq8Jz)$aEgh3o*!`W?g5woUZ?U<6br*dc}Vt< zsT*udc^1wF8NN32iFlG%Q+qpg-1{OIy at U#C=%BC%Up!E~F(pno1BE4GG#2MMD=0G2 zfgi4tY?lh6G(W{koIp%3&zL2aVo1+NWR2`ffQ=GD6g`)0a59ioM9YUpuJJw5V}L|2h{WW2h84#1&BNgIc9=pg8wTyH~E4OL)Nd2nl=yo8!aJbl at 5vCACFc&SWb<)b#uPY$c={0b$w}7^R zPMMwZ%Ip1#>34Z<+!FAzHz2xyLc?Aw=+R~GYlZ6(Yw^}saPS+Q4)UVidxNcRZkRJIq# z&HHv?yE=59Z$}jmk%H$5QcdKgCTl8R*s2&ZU#{A+P?i@>f)opDLnX;xLq}+{ z_4cx9Tmsc(F`s~fSo*F+NsZPq7mw>I`3PVdUCK;w z70z-YuBQC7q^qZL;zl`xs*rNa`!%1|- z;vg`Q?1V=G$|f)bG}b5;Q%W%aj35E0V)yYdYy&e%nSFr|eAI^s7;%TsjMza)$}TeB zHN(Zh>J!24d|lrBqi}~|#_q_tW@$)CgiV%;MQTjGZ1~lZK9bi(ln8v(M`HIy(W7JQ zOEHYuVQ6F|{g|gdb419RmM*I2=m+G7VJBHxk;W#h8ps#sp(6YkKvl!rEq+WlJyw0Z5ks1HbtzKD1653=_Y_jUJ3lzWQR zX(nIDxJd_I_dc4#M%I@?1R^KE8V^Im?a&4ek|+d%trma_mSras32_mn4%=aFN)7Se zxeCGT=c26MO2b~p-DtXL2e9r+qo4P_2zc=i?7ZYdTKBEtWX502zM{in#@^_72 at eXP zZzf2j>=?TNdkT>*>f|QgFnm%QeD8vR^mMG^S|w{@-amk?V%4^=s0xfqK}3|F#)ad` z*~qYqdeakuL790IZyaCTUEHzq+Q-ny34F2h)FtHD)Q5Vw}iq*^yR*lbSB}Wi*Eu8aY(OVbb8If1u+07&fnVlxjxMgF^83l z#$;Tvh??<-BA{!mAvORD(UIf3 at eN-Ca=OzsViUU3?o$;45*8b^5pAMij at f2Cm7cMS z-50puI|GJhWwBeObIq;wN(kTNzyx*6+ylO$~IUg z-3C2bVZsambuQB8X}%~)q3l>p!Q4JB`O7^JfS+^bu&oB+t-EHz`5QpY^Ca2SS|De6 z<3K!t&|6`bJ}1WoTyaC7lnwYqZfcWqZgJ#r+fZYJp!oBJ;7flaNbM06-PIF3Asl)l z*OFyMUjek#FFc}4+trfefi`pzjyjO;0JKP!W9XYZR_nNzXb-wYkebSIUQ_pp zRL2SG3I{b>DGJKf&}9JIFruHjwXDm0nh5T4QJV_(vaTKdxMlgcE$aPzr;E7&w%0Cu z!^d-gkv#{>#(%&F9YK*^b4cG|`o+O>{NyzGz&ve3Q>X0;=BOiY0gPkjk7YK<(_!5|RLL5z|Wgl-jdO_WEv#}oy(q2ivLyEJPm z)*u&FXgd{tXinDu;0)&Ojoa+CefHKBr$HM`RYWk^J$-*BKBR3ByL%>BzLr3+mKMls z5q^?zM{W~-l4W>uWn at v5A($DkuOGCV3J~}AwR?8UzJonb9;f->5hQRN8Alfq7%r_0 z%}&r`#w#+tIQ4Dy!GqRgrkg(L&p_aq01~bNG%k}sFr8u+N?Z^rce?s!IUR<(cLvB8 zl(&kUwJ%TA+{r<;l*YP}tl at 0i1RD+B_7W6-rmA_MIqd`2$oou8Q1~;C$L~M!N}O z+XKipD(Swe(a{TeG&|hfm2K}Bs)~qQ zfC+*94lG8k7ozYg+kTcqg3I{%XX*hfoqa0ZCAA&Fmjomx)-drt#l|yY zyUt#y^_ms^+_R37{|Q#&@l|3y8BKp<#F5m!4NpJw#Ut#+Bh6xuv=Lpu-X+zT8zd=e zYz%kxX+H`|QT at 39d`J?0yCW*JUKj~aZDcHix~4CfB!X;9G+ at mh3Q96sYL1l#E0kKI zuF6q;wq*3BlW-q;svt%3!>48WvWu3Wwm>?hEdf?!2!}l7bO<8>T4gY|I?Z$tiy-eZ zBxq=_iSfGHeqH!3CgUyD{hD@}C{Z}pf!)3x&8oi79>d2^?8gtT{~7>n=V{&M_94($ zP$&>>>FUMu>X<_LasfF!c0D;fJ32JgTt5_`Y>ktZJ2C{QZRj{>+r@;;IWmN)yEe#- zBW2LkTMw at 4?!YkcspzzVF&keqtO^MI-l-EuTnfuMSF)uwyX4AKJscgSvj>>vhbhD&?A?ZhLsE@{S0$67a14k|7}f={$bk3_iEw)2 z>$slDP;OIz-g^qOOwgRjrWd80RZ|@HN?=m=;UXBopV0He%}g)ni{O~SW#HiIU at tIahhGKur65KcFMdoMBXf)X%(}fG6iskFXWD!3bBXZ_CqT2 z-9~!O1 at x`_0q7BOzl;;%o?6d{!XV^)| z at eS|=#K^AO*u}_pT;A;?nY`=2W4;qog<#-%LfW{YnVMD9wQ#9Ha11dq!wYhmatuL% zdEl7mg~Ay#Fg2;=_jhy64)$K{3~DoNP_=YCs=xx}e!qo2Nhz9lvCQ#L|NtzKRG1_ zopA2;M at NeQR@_n{t7uvSpaIqj401G6n8|ikIS6*puEV+rZjTr8OZ4EbS$<5-f_dY2 z)xIEG8QTux1n!5`S&A^;1%U$cO9CGo5d^N zzi52ucr&uD{au*?{-{?ZNB+-o_Z?UVDB?cSQhU78xvzO;QTll;`>SO!e-jk3$9vbQ>g=T|i?0$R$-ZX2~ zLD|}|wN7OXqtR#`+2VqJw}ormG%|#I%%v^LP0!j$5Otd>h4!`d+2SfE*Pzc|iS~ZC zLg?Q_%Ovoc6t;_S6*A^UNu8*jW7!8U>R$iy$G=mD2a3YqKwSX+r~0}7X3suFQAX}> zqGE1c1Y;eB-f5?xnX#r7SJk3jU zJeFQhTki1c>;Qf>7!lYN=ogH~pU4IBMU6=rphuQC7M;OhZ#gAf?Kyh|W- z^)VT~;}i)op>ilPRkzBOUU2F;C8cgMHx9Jeb!m3x;h1)iBOfV9uSc2G7onzlBKl$T3xc&~jIy zYm=tSOgl{p#AqW>Uul?vGYoILLd=Yz8Kn()&>}WN#6(DGq~!(cdU1ZOZQnX?UrgNF zy1DmdId_L$-6$s792(hP_nRP|7V1 at Rzz}9JUfWQRY4eEvvNZ_nb__xK!`lSs+4Sqc zQ_i^ur5qfqdA+<3?dw3s{QH+w`?lg9S`88eN^)FfFtBn-m4q5fZ>+F9XxN}%0a#|1 zXRuL)%R)9l-akk9>|U|r{qHL3ZACHwN)cmx!Ui4Ulr=B~CjY&!@Y z2SKeO?fG at j_a>ISmM|rnoJdsS@$Y8lx1UwZjp*Z8EjHA`g1)zD>%aWj7UtLYe}NSR z5{h28YyJiK$-t at s*OvrYy0bmVIu|^Fv;QwDUjATojPZX1X$cAd!2f@!zZSM;|JKZ? zMR`gVhyl4rMIS`(Z8fA;JD*f`n-K|72w#$(6o`v$XgzvFR!UOp4U}(0&;9`XO<{Ca zA0S5o-kCu{&hC!mb$j>XYU?*NK=wc`pca at lR(%luih at j@I7p0k%ZW3Nl7yg48j~7i zKn8QvuM*iL!>jU3$Gs=^SMpVG at 4Tk*1Ii2W>A)isl9YbbK<60uX-EJdleOPID3|ne z-L|duR5gR>CSAI1P)ZZ8ObE)3M3roj4H_^y-xwJ_*vM{JQ)o6z$tSyi)_>0xcIq at W zbI7Qt@$EZFA{>j-wTx4&R0cE6 at NNHcch)Rjc5>hfcZFFOxo7v43=MvnARbZ*Ki_;*IgMXS^?M(iG7)RM*KGZnO07)OTPH ze#olK!%?E>IGW18ncxnLbH+u0Q{KyWqV4g`+ at A0S6R-{pBdX006lDvyyJ;N`DLde;0N&4JTw3 z9t_SX$N&f+qH-7{{lG5xA_GKYL-f>OapmRNX&Li#=P_OXcB|0qmIYxDoiYJ}fo-?k`j)}TIUr$W_z;A?MIOS*cIEi5zxTnb3 zQ-X5 at F~7U}`hy0Bys=`~k~p7L`?L~`jK>@&hfusea9 z&)nT}!_eH_6$YlDbP>)Si)*Y#lbdmN80FMNL59=$y*3ze)R=ZCX6}tK590hCFP&R7 zD|iLhC at 1`rsqpw*4ZWQc%cT*3YzR!8gCQYFVbrFIj*b8cNaB0P+ktkD&RU{0C+4R+ z79TQxH=g1aZXtbSS9Ijcpd}_LNhhRPIS!D(f_fTJC!JYeC9)cccP3#h%k1C~rVi#( z1SoG*BKe)Q+fG)p at e$of^o|qOU}97!Y&63~P`qZ}&NDZduYxQ`T1a+To5vDGc<#B+ zWYW!OtY#BPHD|X?C!Sq`)y!m?Z7n)W4Kc-9S+Tr^k9qEmvKKFvnrcKrS3QE+!8pcu zGYGfq)b_Azd#x_na5%^|ndB(bDZeO_^B!|fk=^GgEyiaqIiEQ|tykMxjs{nCT<>#S zBq~80d1;0a+E|u~(2mE{g7quhQ*vb8ekN?Fo6o30#5M)F`3 at ffMMbn!oC$esiSN94|EkBYZsb*x>kzt4cYS9y8E$s;|rQ-J2e_EdX)uHCMZ zJycAkd!*g&2nWUOkTzh4Wd?r$@K7mP#XFP=iWjZ at EHo4FVMiVl!a6R)R&io|H<0RzVX8?P z-N0`@SKy}E&1S3uEQUa*Jldgxu* zSc1k-k4oZ7+ at SoILx{@H75kMYpoI+`biu{Iz9ZR9*vyA;G2O-unt9jGw&7OGX)E`= zpHLK_XRg~kRfRtEV|xnjdd^q4A=-yM*KPPqmxW&V&Fg$G`qt}`ubp*Y9B(DgCfwU6 z at RP##f at VovWv=XP$qM~U;Hk3%#-W!cu>)QVM&29N?JLF?v^zi$GvB%}#vwQ^+`$37 zZRRP+3|6F+xV8xAv(4caL^JT$YyX|`6`uJ}9`9S}z9+qDNp}9nQ)t0*S^@iZ(G;=)x&rYr; zm=nx*icg&;3Bmx at 1mU>xVdEDO#?Sk3y!FuOUini6y(46cEeWy|dS#l)zl17d7$NDW*=P9k7Ogix z-H922`duT8*Asg_RxvRgv;_Yxd|Zn#hzi&$uc?n0$3fXOt56jV>8md!_ASixXOB@{ zx-_-^c~{x)l9CnW)2}%G`a5BBp_OF&aeYnTTuCp%xU$ryr(w1s$(|rrRFyl(RY9n& z+^8u&Ikkx#0_SrWRIjQFm?L2XxS+{nq?POo#Vv!F0QDX at m(&WY06qMRVIDcs>`UI6 zbV$A$j2HvgD*fRM^Vd75%p9lgpup4jznGW}2g~o${bh!6F#jpl{^u{>e}D8;bexur zk$o3;ShwOesc#+^Qh^>DYywKg!xj|>6q{R6i%Xy&GEIkA<7F&)^K%@Wmmg-S?&SUa zIkm^5seiFU#j5=P{)svIO?qM5*~LF4vRmi0d&Yg%eU|<8dvAyj0LDOLz*IY#p)4N~ zO)FvKlaW_`9@~bNqCJ{Q at TCB~Hu4}7ofmOvOi)g#oQ+Pklbwp3-d;yk!5Y;#ozZr@ zonk04K3AjF1 at bc32J1Gx#3T3MVHsL3PVPdMLeDw7(B!y-n!}a%UM9*)3r>5j{`>2~ zW6q6bhY#y5!0H;+eh5+1Y`U-}0tu3cE|igxi;Y{doYiPzzT$3Osq{<=T@!fQ{Sk^m zQ&f8ENsOe}@!QGSZki%q{WIADYe~Rj*WRqfBZ>@1DYjO_Dbp&_$29D71Wc4yw!!X?dgCea~b_SdVJqf}GWyVGwr7#$G77YbJ( zAn~Lp>iojs-ZOj&`O!3IBL$GYa{2NwE5{if)WzDwR&ImO&?~U0pW$cd0Glk=gj at Ml(^?2qmOIjfW8NblYqGWWHD~>P8YH6?#rAf%q)(g|g8GAW=A;2Uner4||BcOgjrz zcvFKQ^Op8dH1+PB$iUPiV%i%*xQBA5QnSPvkC_!oup#@+RvbO(JZV9<@b=_2%CPr~ z{zk(ON(~iU^}$r)o(<5o4xCF!qne+|R9)uf#Qd1)oN_n)<{xud6!@N809_s6$!MhZ zPKQ-wVb+ at 3q@cn0$eeYOgL7yXT$G*jgm^u(JcWfY97a?XZy>c10B#0s6$k9P3U?hC zvf+KBv`7U85cU#7Y%`N>MF%XYrxF2a73m}FE)^B#+s z)f^~S%#jf#n$Id?0(Qs>+U_t&ghGN%@0he=%xz|yO}P&5QnIe|kWE-O+QCKnkQeON z at rkc%;rhEzG2VaI3J8HR)e at -a(LZG^#nMrV4epAHX!|AaPUtppW-M~kTxX}Ii zEwet$!xU;2Vm7T7TW4QJ^cNC5_W+CiM9ey#{>wha9oDCfC%ngA$Yu3eM&OIsa!!A% zLwAVH8=9AUp(y-%lux!(mFx$Hl=O^%Aw-axhgN{sMdKrbVsN%M~)!vdmiH{#&! zJ_d at Bdc$TMa6vaLctTmTWhD)(OSoQWA_4YjRl}W_Adr|5kXbtt8)G0phGdNm*@0r| zY>D)sEObK{rE09g>|xZArjg0e4kp!4X0>=>A{J3)OZb$PFn7QK`UC43>1+>z;g*}Z z?9PcM?NP}sS3LNnxt!XJbrHcn6Y2aJ$Tv{dJxS6HRqx|k!G$%5sz1TA)xsoMBaCP{OJ_cRhbq5lL>Ah#AK$PUE*yeWx#|IOq z1DgS#Rzsc%M~{qE&2px`JmIH;cvHi-xK*R#(w%-}6ZPWZPCTxb8+N3fp=U?@uHCtN zw2X-}sl+c{fi)asFubCxx!g at P-|-LMVYHu|PcmyXzl6a($ioh(2khA+9!;CERgedA z`;K&XN>Xn?rUP!N<#Gg;g_4@}$A1}ZG?6WtTLuCExB&f6_5J>tEuZO8`EBP#?C*?BthsyL@;*H zWAG!Z1huWiupuEOFpSXS^nsEP6&VN7VTov-lHu2e+6kUyFxu#84qAh`U<}GEH8wjZ zFg&5MHd|8}S*p at CE4`S4_vbovU2MV(*2R={hNLfAOVn_}v}`H$z~S3%M(bhNrs#3( zQg7%UB2+@(NWxrH8d|3AM1iI!H)u&h^+3-`)UpbdI2N>$gXo~}Eelb>iW;EKJ)8~Cff>|k)K1dU0OZUX*BuNB z8h4*=@Z+aVF7)L8vh*xd+XW+3W((!A>D)I=ulQ#?!nEjuvrbub at q&4VA(y?mq*RA` z at uV24xC7lsFNvvlMn?1d`0i-mfOM at 0v{yt at VlzcqH0nQ0h-;$_=I;DHxq%d=ES- zGnpm<1xMNE)g9NF^WB}__Y<_g!?vXW*Qks00SOM>QT7LST`07J_Ob(H-7rG| zK~)iGQjI$b2TPV>)7tWVXXq4Xse{NEj46vY%6YGbi;mMu0u!D at 6{h=7pv5Q9X!ez) z-zEbUiUvYByRO8(@K5V|K}H2wYf?dxaaW0SuIh(I0BYZ_;gg(C)ZOyQO63QUuH#IB zl{6qK at S`M;DJnC`Ts24I(51$+)xy*>O_jYg+xQBEW*#;>wZMWQb2BGyGFqWHYN&86 zpqZprD{u};abjqo1&caypc{{^l;10ll}~BNk^E}AP10rhAFUs?Ttx$!G8{*8Q?bm1 zrU@{##FmmcNfny~**j&ufCImqBF((Xva06|;JY|^P_Lf+0HB$nS z0e70IH7a0YVqzd+h!e$BICw2Mo`Wx=bXVGrt8q&2Ais;C2KeD}8SD|un7a-1f7xNW zqxOJ(F!aN6DT3W)rU!GRfU$Fpb;T|)fE}~!8v#IT#3e`>%Ie|a- zDFpLEIQ1(>uwJPipAMvxXf&rX6=tqxv8b8z8sK&!v$ycWT6H(U;+YUdvzrXaqMUbv zP)}r&X`*5};Tjk_P&smYiY=SHmBkLg`WRFT{gh%%XPbK5PaWwugLag<>w6}_L%ZF{ zh$F>h!&_MLR^58f2SUh}$C=VdyHtXBa at ZBNOS06MHF|2u;mAE*Q~3b3F}ozlRMZOp z3OA1wvS!+5MF$e$Fy+VU{>2D+3bqN?P z^LRM|@&~ei?__>8JvI at q9wg?*8)nM*gI29qO!n at Go3~%2`jO5krfvN+@>yPlQdzCM zO1=s0-mtvdA0$!uwx3!JmcB($r=@e$4n1OCHYD at 0pxDb?*3Pc9P+Bh&>TqpwizrUz z3t6D$ip|)<4*-tV`4_I? z at BUN<#Hrw?(RrDwrK+FaIH7;l-o}VPsAvQR06_SAi|7B;82y_Qxt7#FPM9L-qj at rP z+5(nVibWDF1(}&a#Upepn*7Wq5;Bv`tpypeOq@;}uH!9ZIJj;tKT5LSB%D9_eP?lw z-mV?+`NR6yVHhtvJ7%vwe4o8t_V;UdegJO}&oH_}Wf;cy84+0+-mzMjRmGx{q?Dw+ z@}?`pX{4*t+o<9y+IumTKx{RgNX=0-_~sss;!QYjBkYbmo4rV31y4nWJ2#?>ZEidr z2x1Q8Q|~x{MX1ar{qLPuQ=blAYN4;k&*Wu z`OxJcYu71~-8*daOj(0FoR7n*>1>BIv^{nnBDOz~zo?wDexKQ{nSfaJ;t6-QyOT>9 z8P>;vjBGJBPHAKhU1?MsDeOP;skKDJP~RS2QL{FrjF5B_$)|Tuf~JyHJD|)m>fI{w zYLMPSdcXFas^`Da{idSlDn$jYm33wSnQdOqay~GR8`UMhDednto-y!y+qjIW1YhTw zCVy>Q=F)tpBQw?x_>egjIfiQvo2dNg`(;c{1Uu^p}prS68oJl3TQW< zc~wClq`|L+_CV^Ejg{$D#rMj3c4{GKFhH;T{QP;h*cmPIq447;`*jBOneM6a2X>UV z6q at Q&{96OhvRth}j_d|TdS~{?8u7ua+5c0STOVXE{+U1}4*iZ*1(tfhft12tC9;V_ z+km*K*-3k0qH3_?9*#OhPLj~WAVzPkWj za8z$2?ww7p1 at 8!{=1>k}tFRVpK=Ko6E#_(O zpNj!6$;&Y1Uy9xi_O}rHX9tpYj&25y#{W)yTgk%4{_o;{ec*qN*{rOP1dw@>tea#y zTN_#*Y&2t7BnCtfM38`46cGfG6 at h%=Gps{rmS?Ott|@=0K=s}PzOLgC?`}<@EvQ$Q z8|hyeoaQ*Txw!cJd_I5eqp~{9D at +@}UUAl%CJeM-(~#h-xmeRrzlIQ5-$I9S(M;iF zwq9+<(of)YPQrL!#Mf2#{|o-)!mAGF=Oom-+{aeFMO`W$yZ at CMu^mmNWGbcjIReOM0gbhY) zo%`E+7C|2%Fq?BStg^gG`}bWBJ$;;Yd$y6gN1uC*Tso1Z?D(#hV43K$Oo3 at ewyq{QI{b7y!+*Pxpj!QasxLG^HPKv)Ah zUv~D&2v^;~QwcqRObM>2F%}wAKVbhdL1NM6i2N6-fPbMX`2Q2C|ITvSD<#^r2n5o<2^96GE_e9XprW+iLL3AwNY_~W{joD(ggt^k;*oGZeE#GtE ziJ!b1S0F~dLqZj6K!urgDhaj)_hv>U3e{Gk#ArchZ1Id6unYqxq;V at oq&qawJGV)i zuHS^@!F_5^HRS`VIj0ji0eWM zdJ&wQxzQ~Wd3+Cm2%aNC^j5B#Bj6|+7F7F)EF-f1N*XWDM8tzx^b^bqJ;VQT2WiaCbny4CScst}j!_B at rki3ZIkb5RFD(o|B%{eLaCBdT`&^L(mnz zFEhP+VD at dix_`AtO}A{o8r?+FTGY;(TyQ(grC1X{AOSa1aJ9!pL(h!TW(o}>vvaR4 zwkTVRLe}KDb*X1P*O>^^1@*LQL|#faKbyaWteMWw+UxI?j~}4;I7O at vU3zj+1WIiX zyvhI`r_|Rl-4D(tvWB!mUbr56v=gT at Vr1G0uQmUhWCMeMNpBNNNGSfO0b)?}L>|1_h&#Bf|Q z_%EtpjOM-2|G=CeC;))m{}FTlOHuqM04izOAqpV>fVJ)juAy2DNY(U+Q|TXy;?WQ= zun at -tvo7Yt_5LNJ8J*M2Q?;XhB at u0J`ra>M7<0Ekkn{T_J{e4BSx&uo(;Q6yRSF3x zHPYLYMo?R2u8r%%cc^LHWRPX98K_-C$h2`GLT5%X{DyAm<8yD!Pl9{tl=at!@SjEi zg-S_uMu@@;+;pvIHD}eVr|PMhe~El$B|<$1c*EPv zy^WO^(-z^`w01TS|3qXB%)w=jOcjWaq6W>$wXw}B0Jh9x&T zpQT{`6}A8wQ6tYTqYpDFIhfa at m;V7n#MeO8&_01tH}O#``62j<5{(dCTrd3_Mk`NF zi($+^0 at pKy6jGxeeyCHFM8HuUGnX#zp;iS#&amt=*g at Pa{}yTFt^Uvm&=Xl)Mf#00 zC0CF*Ao$Vjl4@?dAW3R{Ml-#{_fw`76|IgqFw^5`y^U`HX4kgun#CROf-Zl*md*^z$?J1iMrl&KD(- z!+ecH`p)%3`hORgxUu_ at I*(4-v)SG5{gl=Dw0WNU*XBjdAsKKcTB`7UDO{M;5G|zR za>kipPkLjuksr~~(X at kOHA>|_c+GhXSW8VbkFrj@;LR29QirqUR4SJ|Vu%viXb1Jo zp(ql?AS at T?m6ZMa>z=J^o%*u*F8YebzV$D&HI{LOKEnqlzKs(`9|hWJ%$sh|XY$I~ z4Y$naSf?NAbewQ*IxSp;n3N4Q#*Z#RoS*scnm$ElxPru_wvA8zkYPNCFxgXlt8&e; zRYlxjn at Cl^n!F!ggL at CJ(cH#`9B$-W|90>{y`ZjyB55=vxy8hgGIu z%eahR5EVL;l}?M8&mOZoRw#B=iCM~mJv at B-C2~}QZ_!qyT$yX#=agH^NxUjU zg`5~bC_7tDPI=A4rLgP>g1`gv_PJlxHV16c3foGJa8anqLp;Az86pE at G;*0jRj<+v zF}ru!0WXzz3b{`TaoH{1Tv1(%Swx}jHN`drj$0_ubbq3PwA|prR1*0ws>p!Fyb~%I zDb}nWh|}L_)zQm6iwbpDhry0PHbV#{jFRfr6uac17I^$9Siq!Gk`f6#sIYtVo<&AL zU#Y}I+6UzXP%$}#xC1NfiKG1El6-W8NZY>AbDvatUGftA(-J_ruoW6$@6e>n0X_3h z;Kc_p(kRZiyi+~$Q_c8HmR`SfF{YpfTiK^#au`cL-Vx0hahkk;o=Ac55=iPuWg+t( z+)>0A!V&~Y^k_4hww at B1p4yt8epyxzm#&9L_BXqn0sfC zb1Om0FMJDkMOt}>n0=EytU!JHTbV0J=p^))$Kxp2zuW&)F?DhIyF|!VvHc at f5&hU} z<#=u7Y^s*iuy+z+aw3V-5uvOEhSg;`%XZjL67Aa0Q>OK+zs3<>sq%Iat|cNG(~1t) zVb~x!SXx=`cxR at ZdcWSE!FQ>wJU8hA_w5G_)b)69Z^BPDIr+0Gpu at Ik zgYpaBOKT@#n{aK|Z9E^odzs?az$0ce)=lB;E6LJ7&_z1bpD?AfXHNn~o12PNz_A)B zBmgt$Se1!j?@o-MzU_5~_mY^QOY6VH76q715Ihl~dB)3Gn~}k$bxF*vD+!2A4;4L} zNF$EXBWS&opsH} zVay(-_GhY$Jlr2Ya*Wk3KF2IBGY=~ww;1PpRufa3vUE?3CkL+&{cHRC#dMt%jFs%p$`GGUxiyb( z*tj`I- at C)iJJY$+Cb^P>YxbMo77s~rk>@*>%?x;g*_j@)6T~FEc!6ArMQdcJ%HG(h z_Nz^#A-CT;+Qm4b{919y_SvS^kBhJjS>WQn8(K>mvi}tFfo&}vN=h&rDyQ0mxE$(v z#rRj42~kn+!u<)(B=A5$T>su_ii^FirLm~J>mR5IIXM}6{`0I>%LZo!jgKUj6P2xj zN;}Gy&JCR`Su`^yWysN{eGYj;^{6Q>p)zyI$*fG4ZuxCayOZhel!5e+ zQFJC*ZlbqZNz^gpi09u6!IyH8du%>6xq;0t&t2nN#4KQ)Ca>8jCY_k1AL~Qgu+NQn z_L(IzD?#qO?NhSr8B!p(_~JR!9U=thwOKjK2*$8(*Pm-_p(P&A%|{Pl4Re-ZWo6AW z+eEUmw4h$rib^jJFM72^qgwTg>9R;QolBpfmS9 at ZSG6oqusf^i9?~nc(CcC(^O9r5 zbG%c at hfC2O^XsQxbM;KVz4=thT9tuylP66H={j04|6O3q$I_zC=fIUXgF+duE5e(e z02me)nZ~|zn`^Z&Il5!zri3@@;W$deZOzN4TQcC8EI2}EW}|X0;R&lI6KAb7oTPgz zL at P~il~J|Ur{(JLb$QGp?xs^yaqW_ob7|UVQ1!uHTYlG1am6=&+DgV8Ns{66?muy* z#d#)ONj~`v)%_c(;Zpm1P3Jj|N9<)umo$|*fy1GZ>!y>QTO`*OZf#o+i at o{Qo%~vY z+{%NGO#QsWmo0rkb3r^-v#)h+1f-+X;I6+CrBNdDTo@$4XJW{dmmyIhb2Va%9DmSU z)(1V8<%W}=0hB1G50+fqad-$=Hvz|6T;v2Vc5(>gS`4elWS=n>^SL1c!*P5_2ILj< zG2H{pfazKd#Q^1I1^gbzLu_!ivyA646%GI4;7^?SnQX=Lb6DHgz9OnoVsLP!&Ue_a z$|7Y_g7 at pYhT~nOs%F-L^>-_I#Simrp at f+F|Dn at Q!~gAbGnaM?2QA*W+zB><|t zhpRIm85 at 3JVe(qoB=h=WHco4~kPb^-J;qlQnn1lR8y@ z-zT({jJ$09RRysdo?LD9ouirBjaMtvC`|Fe*!vjs`!EBu&q!CX8z4 zK|SZh!*>|Jhx$d`NgIMtODxmpH%|r^>1~_=({^+j<2)KQu{#(^T}QgP^DdCp8o?OE zJ}BU5puCg}Oz6!VxB?3ujF5J64z}o%GEYl2L|YU)C?|jKivR zTPUxDZ*F={)lR|2S+)Tip6 at gZYHT8y*Cq(AyDowDpGiPx{Eo!J{Gam}82VV~CTAAajf_z4LKfp`SWn zpF|NK;mLloYYLLPrA1$NUp&724Zt4+b%kT?(*V_arJ1YWR&9|M%r~!aO*yhQXY(^Z z=}0^|vpMyKOEShjn}+68Xx^yT&Ad8l3dpiK2e+u#4HPKmv&dSaZjYeewipHw-5ZDl z44A_Wm<)PH#NR{p-do!UdW{u(%?n>af8WP-5&93jQB at k0LrNNe#0O?U2QoVVB-9l7 zY{*B;803C&W at -e%oOxQwDEbDexk!E+4BAq25r2HDqo9C<#Oyn!ZlMhIZ*RFo{ghtl z&4>0kf9Q^Jdk?y8mAcC%Di&3&6fS3&awd at 9rBb#MZuKI=W|S+J9|xQe^o at VtOv!^T zma?Py>I_}VoYnJ=1BnIY+ax+U-f&vP%t04RGRxD8D%7zSC+H2*mKm#eMjLe*W0H$4 zMIC)pcZ|N}30lAvD0BF^DlYghRLDw z_(_N%yKx^0kaBfQ6Iyq9uQxZWUAM{od}QMAnQ?S)^ESceonh>n zq0?XB6UJB?<}cIJbQ-K(mW$gf)aGA|yVtxdvC}Gu_W2Sf?mG1Dp#dXRu=g=a|0QIe zZe_onDg|teVs!bI_*Vx z!&hVDri^t`8n+fE$yl>@*V|?0$`#!kMD-ys{24Eo7uNR5*J|`eFDOmcaU9*NmzO3m zK^%K!zAa*$)y_~l-O|tutEFb&(|GI)fjqUF>Diicdaf`Rq|hH^mNG)x(kIbET++q~iMcI^5%H0+A-pl1w#=z+Ws>B2t>X(*@+k2O2?V zD7hp(urwh(5S$2|a0#j%$yNNPi9((Wd8k}MrYILFMAoo;*4`)AJ=|#P={FOj(#Rj{ zSPO0yfrsbc#}666l_vfFHsoKvN!Xq9r_2#V00I*FU-IMsN{eCjEvE%_#BJkAH=|1O zS=QuFM8a84`93nmA4U{ZV43k9`TgX@@yaG|i%4V2;;D((P`=4O?+d!A4)pJVUlp at 2 z at yBCrr0S_mx$$e&CEo6Qy&tRYS9bj0p at B34DE3Hwl7gXErTeKo1Pg={^o zJw*3;kmICyiRwl6y^$4Au0=p{$OH`$8Ol1Wsu{!0j$5!Kt;K^_IF;00dn{Y6Hmj)F z;56h at VmbZi*x(AwZ*VKJ zyR~=^T{oDgU^t$ZxMx@}tsP=G&|pc-n4OPKCVKYop1kEKAtSBS+Sim_hn3;7`(@2Y zRy!+No<$Bba=oVr4fnDQbpWdnPIZpi{r89x5aauX*;h&hZXi~G5jEc(kA8bg?Ec5L zTC5)AA7N?NRqG)6PAl&xyX~6OK>1+q`o~sK;#mYhy+eylr3ry4+)Fj++kwS;_YO_alob*K(QwLjH=je5J=$b0DE z6ffGkAow5)I=}fiAWQnr9VB6I`gT3>?O at uikiaUafA6b-EKpk6R>RG<(h&F5sAq32 zZOP5u$N`LF`I1k;bxH03XjG3puamiFI52DtRA&XcaCH+5;|@k){g-S!-1ItFjI@{p zW|9y&XXb`mwb)>Jtv0afco;yg^yrqg%<(iBzFi*^0z;x)AgFYZgKhCmvuX=$C9sk` z_&8?eiQ0rpk7;&p#sTwt+xSL{+1&5>lPEgM4yWI%>klM?VF?p#8PJ at 59zfKgw#%MU z#Vez0vl`cEPAPkO>B)Pb&x)aOyT(}b17ygs%(?-%5n@>UK{(7l@SO5}uW9u8iI9P)P#zdD!Immb!~%CA zm;;eUw18h>T>!LI;^6>P38s(k;j#vof~tWA5Jq&7nkR(R#F3i9Jg^J!3iv~npvT!TCS7$$3olwuTwD2)f{Q_or&cs{ za`5FkI5DR~cA*YFp*8}LQoSTh$_0cI`{%f%U_uqX;ktno?y5S?i~+@>qM$wOd!Qrs zmrLQVI5f3;EJJ7u$36o&c70;bqtmQ5gMp70!P?f1Zr?nmVx+WI0*{>jpdh=*5wi5*|2M-095Lj!?|;Mr#h)Tv_J1|b at ZZ2TgQ>m$nHd$!}H18`IK_>vkB%Xzcboi=HjaO) z-t)=&0OSb88GL{UCOph^2#v%dbythbe`b9=@(4KpJbxlE=mnpofq8Ws_!cp$TJg!KO8&})cR=MC$`*-Z1= zVIm(41z`4l<5!k`o}@%(v`wmQ`C(HP-_gpspHNB|9>T)R zL9H{eOc9U>N-Mbpeyj5aXygJT=(Ct~g3HIKq__^dW&sF3M{nsgqfpH{&cu31CX@;8 zhH|-$JlZPs?I!q4n+OZ at nl;FW_8ftPu z)B7^Ny{04EPdLde?kChSG*55`IQVjPD&Vn;to^bAkBu$t*tbw%`vQxa$a_;B+F-uR4 at Q5ye zk?$em8_C`Ks><>1wGKXbBsI at j5_64wLJxuV0?_4?SdIC at l%j&ir?zx6nnYR#8$DYd2T* z!8|8v3X=*J7I_IJ&~&HUQJA{$SU*DEAaz~O4~@=(8Ql*+Ugt-fw-k$)NhiQ^tg)E? z^m)t9hNn!#a*dBrK-X7Ghl03$1+m4#|M&lnr7osbQk$h(|H__Eqn5 zw+s at JQSOm&6`r`b!TZ|zGkuwNF^guxv0Jd>l?2Joiw$L=POd1PJz=hZpd@l at QYPIjirUHR6(Y`D!h at Ynw~SeA zZJHOk0+OFC=9XOdB|U}xwu-$0-Z zvzU`%1YlgG7uoEnTf!v8UyBG4Y<~+S~YuZoN1Y%!mKp; z&cp_O_s(x;;C at e`7*Ou9d&6rydZSB2$y>PT-s#(zw!_qP<8(S?^_WFrpNZv5!(7DM z$+s{&8#rJnkWYeqQ&$<`(0H<)}ln0D4jx5?A07KPj!#ondGQ$sc=;& zVS;y&&d4|M%E)8#f5b7R!lJ>jsHKjo8A=}BLb?d=<>y^i$d|gZ@)`jRKDOWH9 at 37xBR at -nw8UH2W@r8lxB*NHi=5Kb=J0tV at n5gF64*=6-f!xMp82vK}UhhUy1(oHI{bHRX_6`UKs2nc7P63GcH^ zqv_@|iBaZ-VPUVt$8%2YTTK~%i)AHSt})EHJO!Z3AESIQs=1UUo?WQ^AVhkk~*(etT zBPSVA+mE;p(mm)w8?JachGgdGb_o*|7=|S!*(NCE;H^3HtjoWCaGIftmm7KTH-+hXcjY5 zz|-5rhW^lZY48}ap#DfjVH3Nh*#SZ|ZkAa!VWNRcer>0QETaI|H* zTz7ny98YZB7jmlk3=D9qGZ~dviT at tu#mcahE(w`-Tk|4ypsb#*NfoRB`gHDHvmH zmS7c=2Z(1#5Ee at WZ?_s9BF=Of|1vf1XpQeM72)O)h4W=$MaN^*Vnm0N#V>rbQF`U~ zNTV-|9m+jOs6z%mYaHib8l`DKP0KvfCJ(3F0luX_`3JC&uQYmZ{7UWN6Qt*7sMNcB z?G``!buceNU97sdCq0DZN&JNb>IHL+5vsX?EfBw*c}FDiG?o`<0POvdl$pgH z&ql^4_`h=dt=`ty`wzFV>QMPCG5sAboP4$E(9Ca{9(90-m=Ni5M`{@eFS;# z8D1_HXGum^1e1^5x6M8bh**{;@Tk}w7L#v*z<~GUBaz}wO>bBY_I-iKAvcRz<1*UoW7`e)lj*+B7 zMdY_tC5IwT6#BFf4*L|nAHQfRH=JZrPb_+vGL{pVa1~5iPoTgPZiS^-D}BEK57rDM zx-Lz$r&b*wWAHsBu}eCcDTU?TAZ5-kU`lNw3%3;%Q~0^%qn)_(a&n>Uo42 z*NP``8h(p3)@Gq#GTucUwVd_|(TZi^oV;QC={S{d at h!&~m at M|LtW^^PqM5 at HP++<6LLaCcW zydl-E{>Z488N8Z?+UIsIq18qcLCA9$HO at B!(_hc+bBH?(x6ZTynI7vH^DMhmI9T;)~`^SaWe z36_pe4B}oe?2y+uZ at 8_7>n>g_zdgIE#Igr&nb<8ynFhVfhY6j2 at MR7L-50-*8M1#Z zEm!hdrcpciy>q=nM8IsFD~@PnjlwRV`#xFvDY$Jt=4Fodr*$*v^jJtK^-e7Esx?-q z3yNWF3ob=P0J2P(T&K~S`;?gDK=1WW3)Fj1stQG(P`t!#^1t-EWE!uKu!;0%(tSUA zgC4eqQhz5*@fX;Vf^LrZ74Qy_Z&PHyIyxY3!NDoip;2LLyxM)QCRUTsF2q^YmdF&B z`)QG-fyV{><|?$2o&VO>b=Mr&?Dx`-V18ms|GKkMw-~RuXJm zCnMk#i)c{HKDPpQ3)dLsYYOsfjB&m^`j>dptAb$f#iz at KSje(HCDc>9bsb?I_eizl~gV&}!+B{2{l{e;uCTpjXgC;X at IRJD|O|g1=ybFz(M;F`(ZTm7Z z^p_oeX2y%xo5LscRlf1Qq6!kM#XEjh&IvybukQP?86yXi zfNu-oRxmEuxDUZpv=ZHkcexDcu&z9;%lqYDySl3C99q z#w78irA3FiZ%WXZVQQzshCNvkq8MKGERw=m&@w*ZLI|s>JlWE&0Jpv{Sf^`=Aoldg zGm!FVyQ8~1sc}W|-6eE`d7u zc)x$Xxw$xH8oKTOD0KucmMqK)SGFjEruqYr^X1PjzHaAUS&LSL*SF6sccyfJH^(^fYJ`0WCappLrFCp;u zeBG(qF^OYYY8-hKpsz6Ehbp<(`XYnr7#IMY;6zlJ;RxxY5}SP#n?q?v9n&VpIoFWo!PGa!%KK`EQYodNVG-&J zqtzgQUbG2wm>WIu+;qNC40;Qy6`c0YDUHU5y04Cdb*_Wqwq_|N=mtFWMm>UX(4 z(LwFJPa}_Hjw^Nn5eX9x5?BD5LL}aka%rY2WBn=|E-+j>a`l5TBJmki_TJ!`Bl^S+ z)F%V1ivAbhNz;?(PiOlXzO7Pw0)7xmBmM{g#4sais3DUs#$b4KP#e)+2|#L92}>$^ zye-rby48ddQ^pV^iE48M4_bwJ9y7^7V}LI-8E3V{Qsczs3QMHrUe#c(xsQWx+QEjz zLC@}O-DDS%p1?>lb-JQD>U+L*Y5U+Al$`xZo%w(#KUZ~Rgo5+aww$R^VA{bb**2do0md>SI76Rw~t z9Ehhb-Fm^dN7gAXDuo&SZBvuxy6m3b+0koalUF?JcZBs8c|nurHoB9BRk)L{^AUIn zBbJZvk^)cm^Iu+)hYcug5V@>k{ia{Ry_9vTttc&qT=>limX{1%XwYQf6!B^fsH3PZ zyYYbsr>YLfrKm1KrejwvU}Y79RSX)a(4}ZoyMCG#{Ll!fyhByN4S`&|FfywOe3SrS z5l4jUX?))2Cn_xQ!BiaAl$PlkkY6)b-R}(N(1LQ+39(%yFY3eeq^_3^XXS9%9kvcp z-1dI?<^g9^A_lsIu}n%Ei(v>VsQpNh<-6lE;ZC(W+~9)Tbkw;<5jFH#HHo;4am-Y%}r8--$gK8-F_;CFX~u**r$-j59)WTvA6v{2bIdE&j0oP*NEm{ z`w;(n{)5^YIvOYvxL*(gLCiUyYs6NT6s4yysK?W}iw#Zql5VVz3nf%NI9L*FDB$xz8QjV;m}lZ_HiMsx=i8 at SCaqlk`-+hR*fRTmWXCig>=CdycNPtJJVnfj(2tkqS(>rLJW2kV=x z(3L$GrhaFI!-6k(geVy-yU~ids-KEyab%mUGB((yezANz9xH{joZcm|Bbuys z6j;fm)IjxBu4k=>XBQcG0MHq4K7vPF0E?}B9GsKClIp94ma$jr#u3dcQmCQWR^G)D zc{%DIi7||mayGR{zlYbc6WP?#*h)HBrceDIZQf5{hV!r`eAk$0hzsY)b{f(Qsf*y*~XyJqjP1nOuJ#4!PAA+ zJFF7kcBVVj07A|>)+*ISFUjB4Rhp=#LXp+DBXt6j4Jqft`lUxjapF|4H5xz5T(Zkf zB^hbd5bJ99do(8e1ZS{2+0;b(peNSJ5F*B)Hz%>7{s_qBbI-6lGyNXPnGX#mO6Uc8RLRlxrbU8|J`U{(gJCT8tMHUUe7f1_ z#8~~guxzr4&H7z)-K#fNT0-hv)B-?7M=uV*hob-;x!Zw7xCa@!H?8tfY at yo5)(Ea9 zzjeAKF9R3$1AQy__ac!j7#e^-7UqNNm z-iX<@J&p2usK#Lys*_o(r2GRui~LMHbVuL#dMw;lF5qS8)wa_8*{$?oY^n>WeAG+Y&jEK*TS*jG&LXKLzaSFwq;t`a* zI5hYo(Y^rK#!t$+UjX at H!Aag0(WE at +L}YRF1()TcZ@$=1iQ?Z#R!8XbGh&PwIwL{P zvG;8N1hbyVME$4~*F?KQ!W-BK$geA2vs4X~qLGTu#Vq;q1l5?+aN`C at TI7$C^h6Um z$>3LrMK+1 at HO4%hd(cU~iGr(GuV4#}_j7V6t1k#tw88R72iM4FmWf}tLt~RePy%~| z{Wj1%^HLy1CU5o at d9{vM_9699Yo*q&SoN#{t`{;E^!B#B$loOlc*)j~<>&q9|AucDoda7X%2%{!c2=`p>43f4=?mE~<{g zUu`dWosQxfWg30pDCK%p!y74*5iluPLOC|{aC at _k?BxCnn+BeZQ-+(R$;JqBX9mkj=M>l4%j3r#1`x+?3~`+0Tf1s-(4^Q at -q~(skQSr{GzlJ7 z_z9Rc$suwzAb)-p-FJ^n96X1>N+5!`Jf^kA%P9yp73zg2GN>~+V||@y*g12m6WNW_ zuqwaFhP=BadRdHTSGFDLm3S33q2W!4*}O&d{97zAjg-xR{^U+#HfcOkzuuCzI88vf zF%}BUAjyFEAcD6(2cR>+grr-)3?W_HZj>Ck2djXa4(lO>q4Le8Vlcc`8?}ewpv}wK zG2yz+jg;DX^KGhen6F+(y~xzET04v4*R`a3o|~ zm8(UtQvNZpn!hu6y~gfVk~nQU<$ih;h`3%`8Bg2sKKHTKTdh2FHOVPLesTqbuzNS; zh3zjKNZ8=!uTrtG<#T%_KFKxo`g?rwL at gexS&=ly&jmA!A5w^jX4Wwu5MeAIY+`L6 zSFtZ!V|T{DCW9&CHW5mr&{9d%OIz!0%lA}&@>iNZa=-iyvRg); zRXKkk8wv#kr1&3&>^~c{|3K=Ro24xsh#Hd8T!n3W6YyV* z6oMJKr#R14ZX6k34c6n7$!0BM0}*=-^-GN^M8i>b2cri*Xtwt$C0+-^Z<6tMY+1TI zDRcz5&bn2?tOlhWVpC-2__obbsu7*Va>!E=8i%GU-NG6pA5YVUyqxVCf4+9}X33nx zRwxNTJ+p=t#FVE>hUS`=D5YNYDaBmdDsIk9&SRs6>=tr at lEu1r@KtY*ah7h#=^>=u z_7iDIs;i5nO0a$VYA==wXT*!pR8y;c6~~xNF at Pey;Ifq*#Vk%RUIx_`8SEh5#j|0h zL<;j#jQ>39S1;+JLLI|P&KJUo^zwNq>!2%<&ojYBv!b at ikF`)mYafCH)g8prL2Rf(-IRt*BQ?8?p6MkzsbADA!X$^@ zitL at hBO>`zPS}=H$T_)gPlLS9mYZVYqkIDgNs|&DE`T~;#&KV-3)Bud%(Kt9?3Ukc z3P6Ux6yNr~{mgLkAodqPAL(CsAh=MdAvub;Z0GmCPlSRU)l#v=b?i|YEREwy77rb5 zw3)s+nvfGI5bexUs2YwxV(M}cg4n;u2em2HQQ`~}N(IFnV3Y`kqW3ifCMZ-J{-jWpOSf-09>kiYZOEDBbd-`_ zWKc8MQ*6NjZH3b-%Qoi7HMRrEck;kYG}R%>RG^paC+aAe3ta at MHI;Z|J at 24#;K#yw zZUpD<-|obaV{LEeg8>1>1ODB`-2W37{xPMi?)^vKqkh4Gv1?&?t`&qwMxt7fbxG^w zQ-YPPqFNMc3U1J6T55Kz#dJ0b?(7ui=KEU^%&E-$f;Y$AZ>S$pC{)n-t&u5cFz99_hE;wd<326Kb=x6Y>N zY^qIWCzZ?-?mF6K>8-qj2-~Vdsurz=7r9 zIE8a;Qlm#=s^=&@G*+zbbIqh}Le|!8a3v1$;FjLPF4!!u?RrVNp#?6cu5oyA7Oi1( ziCiYb+Y8<0_DU;lflCpdNb9o8O7dGgCdx+1D5Ed(bbi=cBy at F+eeJ4`l!FFFi7`tV z>>C8b7~62jV|AF8SsoQ3xD)!N&b1m~ZOEvcpq178In`Z7EGc;{6zN?FJ=%tak7g`=sWXFGVV z>Bo at MVoy7x!bzoP(k-fkVwp)h*IQuuRbghkfh1(B*!-}>C|S!$deSyq%Bm}o8(P^` zvIp^6F0P=2UkHe21P51OZA<@l8cF_`Wv{JuX?0DA`i$+yRBnjyh8ndk2iKUMuwjq2 zY7BQ}q}=b0y*>Db&7UmM>L at XowOJx~)A8_nZ1t>P at RheG@jf)GUhiUR9fp%E6*T%& zE!4X-Tt{s*_e;PFRm6O_*s0J&GN%p%%PzNu at wB~7w~-IuMNE2GKl93zlJ9hU)vZ0J z`YcP8jEg={A|97#o(Z(Thk%$g6didy{UvZX?SYqTz6t|o^C$BrZrNqqk{svMQaO}A z6`%gNfY-jhU>pXP4)dK)cdS@J_*F#UY^nBbBxtImETRf1;PaotPA?j8kkUj6VCkX|K7iFl zy;XZ2;(d6NzX*3T$Z at SK@>7tqVkza#;j-M;V67+JKd}?8DyRf>6u#QaKBL%bB9ai at l4{nC|mAzc}6193MfjbpY(X# zB3Ro9R0v8{>w(OHyOrUnltof>!BpuZONyi1CSDX+B{qvOI2?Am?Y9_h35nrz7MgE` z(I@)kFcZS*+(IE1l;n5H#bj%*)b4(e#pr<9D-uc at k$ z=1`xi;hREZ9zG`)aiL0 at gq4u9F}eM%m1KB(gY`q)owk)6Re?;!yj%mli-OfpXM4{r zUwy0TqoDcMJdPTD*KIOU=9Ik_PwJj_mr;7a)wMLYYp8m*XRS>;PU=-Sydh4Aj+)NU zr=?KiH0LI?8J3rVV!Vv4qU-fk{#vGN=|FYf at q%}Sr*h^|^Vw8+ at l0ZB z`md$;hVDbCIWJ5C3>p?d)sn}q>ILqOV+$TO&0xDkO6;hV?tZY}axR$hHhfi6?A`t# z{&M|yF*GfRgJfz~(z+s&kh$6WJOv5ebU#CgU at TNKC|^MJC`Smr at Y)0C^m4W=-dbJC zG+ig|?0flF>L8=>5*6zmOcke1+ zh3afDY#UT4k`YPpe#BBgfBqg&LfjB0eL~E{D(r;9u2Z@|48%)IJM6@%IV-*(5;)u_ zOila}!k>IDg;jb%&O`iFL403`Bt8o9gtYZh`F at n(gk~(vQ!}3RdzMlDQE?pdhbZq% zuP~KsMS`z|w?!gpiR3(O#5Sc=6lt}R)H{*^?4)bt#FU?8AOkbl<}{a++Qw&J8Ts1Rb+xb?J1jQy}R z{P?gC7y}X$On{&uBV_-E30^96CjMH+^r+`G=sRV-Ib7sE5%;W%#)68TUakEM1CYEU zrXjHZ12RoCVPjUf at PrJM!+e?UK zp~E=tX((9IU=v&0gJA^yC6RZJQh8YOCy66N$68fkxQ+mXk at o;+zU*W5~AOnO5L^lk3%7TIx}rJ&e+vQwsZCGYXwt at Bh||F(gzQ`fH7A z4CMd17xRy}rs`y9=WO|ZJc5eVcK#GIh at UM@?nk_N#AV+>s4cvqRwfY8tbkt<1hIW7 z6Q4c!*dOY;Nmlp5nOx?`fPTtJS%`bc2eZG(cA%0`C zPPrs8vgrzIM at C0#p*dq8*XIfKi+CO`XiP~P#;TYC at Xcdu+}iz`KBG?T zm?zTYl%A7p1vx-r_}KQF4Fog!#$)5L$uz9~?uO4o!WQ?nggQ$@6Svn~sfa|}q7!$` zUTmZ(M57#k=y)o&VJ7#>Sj|GvbH3I3(N zWKWvZ#6BKfOtb|iMkla}tAV)5YGjc|G#a~OJ07jyG!Z5nxTheu2>%SbX178#X-2M; zR5%6ExG5IXc!5n+fW)l}^8 at Ip_y#=zrHpMzAf*5HD}OQHdrs^Y$Ft}EA?=-`d+D}q z(X80EZQHhO+csBLl3#4wwv!dE*tTukdEdsl at 9ceFdu^Y4TeWIc^;cD^>T}c>qxab- z%0p~iA0c5jGR_dB6{sdf;u_orER#561XBba1)uymop5KiX7Z%If<=(AS(Ef>R^EHt zsoju>ce7BQae;iEaRXGKET>lO3is})}=1nK+V6hiA9gZ%Y>yZZ4T+XDRCnE5AdnH((#4a@`^ zV(@{32WGMRL$|F3Hb+qOPe|JhXfwd6sAa~THwy+~Cx0M}$Ag^I3jyCCr}iC0FkA^h zDgc1c%&esCgM^sT0?3 zm6I>3H?hb;UL?HbPf7zr7FN69s;du=#4GyxQ&#E~KMliVic)@yW2pRSy{T?t9dMgT zUKdh$5+qNB_0ydV__wx*E}LEn;_P=67M8SZ zYk~~{jDn^CB-fl91IgLgVbeg3E$g#n<;g=QvZO4g5CyHOQ}vU)PX}9Cnx$oCv}p-R zEf?Mj#?|z;e(NqmEIYTmwyPWX-Yp)se!DQI%L- at i^nWaOJ@@oDTnFR^Y`tE`27u=w znGmrW2}&>rgJEh$Rbws~h1MYsn=+HiSu?2<(~(GIM1{eRuZa-JH!@G2I+`V<9_|)=67cco1qB~?LxoI8zT=@*wVh#7-w9UsGQMOgxr&s$Na;Y at UV zrXzVb#Hs5=`lT*&O#OK(k}DQ=sic^Egw>W$JvPg{Txl2jQG>TsXGu|dWe;Z-|0WXL z!!bYINX>0K9C1AFr{1!DA>&jWp*gug#9}kPVF23}#D2*-Nzh!kl&ge43xQ<@;2UX} z!7a}X8inUM){gOO{l;6V{0xtK-JbZF3(+3X?lUf zZFk(+U!Qpl?hI`?XsQbxgFSYSUfMI$6ityn05l3z8UG zO=Dclm)wwGE}d at 47hebXl%=(_0ECLI-yH4L$=Z-KGShH1F&Z7Y at S4?UpHJ|_T#~A} zGp+uj2gz20Sp?-Y>(x0d&##f?&#YUsm8v~UC|V_kmbKP)yKGv#!fkb7SFm$B$)xgU z!Qz&b95>ZAs$d1QTWkHsGmD#ZtDE>esRTbe_x;>OHmkGW*Y at c)t7X3$ zvczuK21ABSOhYTk^fuoSa23zIkN@5(Mim|6yCMgv8%siKo0vW+bbs5G z=bnOnvZtrRCv!-cqc^5MPWBMy;j{V9#pdc3wdkE9uDigo<*GAeLERGF&xX2Wl6AppnUZ z&?*&=%OjLlwWYTJpTF$b>?K~2_+qL{#UJUkNLyE(d6fGHqG~NRPBk!;@{S9vt53-* zCe{kGN(|?VQPkym;F at V5?Km1asNxJ4RL(?F{5dhB?T%1PQkJ2o>aeqQ2%KX71yoSh zOU|#yQJB-cDPP;NE6|qO0q{WP2e=a=#tGNHy%!BLQ*Abp>wo_8!+KvjK?5B!tb at 5- zQKCIOJ#>D<47IM^x^v zIVE-sQ_d~o=_(sE8Y39=PFwHv)Gv(P4^C9%Oeln4kU@*e+=Z25-;+A=JtJXe~>LpW? zaSSXN9{^dB27t^d_dPdK{>6%~-ZiX`PdC;~)=d>Hls!36u`0*Q9vN=^fJ#5PJ(4=W$VLY^JVs3KJ==n++9mtl zewM;im7L8KJX~jw+v+W3>6wXCaSPmaAT|vr?pTg7jV*A+vgaC(fA;X_pq>0p_4;*V zf(DLva?=7U at fflHo)(h9 at slj&XX@!AO{aFP at -yxIGn;je*?~TTBZ126R^?0yv?T(@ zO!s-AoVQW3DxT#n|+2r4o=U=-*@`vX6=1z z?#WUf(T4t_*-(8iP;BIkKXcK6w$wlwwSYz}iXap_5=SY3YT0!A0Xe5kc!S(fus=3R zYW6|Tyerw+qezHpj+qV`nIfQ9?Qhf(&}&TWgv$M;%U63Ijuo$>E5w~_m_lZ)P?eS9 zTSrM8)Q1kBd;>A*Z-_kedsp!FEq77}o at t~zMcDnLn_uAO_ghV`JgRzojt}2JY(L^P z?)1pVb1jegIs*mf$9yn{4WMZg2y%I_ at RU;Buu#r~1ms#&4%?laNc`5f^B8#rX> zmklE6HHsaa(s at bzc&1;#oR?JzJ>}HV_LQVrcziG5FwDHH*$1KIB&!_?^4DLa61v0d zGNGrc3V3?AsU8v3>jRXZ{G`7k8?G_9+A0+VU-+N#cy~am?+e8`b%qd4Mk?%6+mQJ8 z)fY#Yf;6;szVuAHrdsuf-f5Mg9^ReN-+7W!&1f}sMpfg4HX?YaniDwry`RUv|C^45 z?XR at O*ns?(?O!EN at Lwg5-v4k${lB|6d;3s(OE;cKASGip{`8%LsmksoO?2 z5MiU(i3~`?)eDgn?d`krSV6QlPP(H%8d&XV_%iap7e;xs7Pp|o+U=NKZLmD&xExPS ze!P8tLi}W_8bbW at h-puV^kQW at 67Y&Q&g`Ik|(VFz2~-fuJs&8F)1 zvAbqh%Uav*``|hC8tMyu^{RR|$1g1Y7{b=aGd+Wcp^;1ov%}d2xbw_O5=z zHMO!BILUEJdGP2jRpa&AuCK{eKxE}h zzN=yqu5&3n2ywK_^5X4Q#iTcmAv#;bLy=fQk>EAZ&b_P*Rx)W$;D-MK}(Wht~M2B88cp1^8ba zz23B}(`k(HF@}Q!b{j@@Z at zdaCSl;?WB?5d)~1J1*og_oEZ8Bo*>S}^IHRr`(D)>? zO0yC?Qil%jbq`#?q3QKL0Taa#vR at 6-o7d?v)SD2y_!i<26L1i=Z_E=)u<9s$e71A| zm`ts2|BM1`0N^&h&PaBSTL^unsEYShfk{liGd<`&?MI)Uib=~k?G`_d!?{5btanDr z8~AS2h2-D-C+$XO5q;66(iDDV-j(YVgZy at Qc_&+&6Z*-3JE{C2%B z6_;?B?R)~R0k|VAYs1QzG6dTh?SjhU%nJM~%-hJu;@kg%Im}-fy1 at Sp%>T(5Zv0|03=EY1jW{S$P>iC$G~uO@&T8O`CC>XM~}+FM?Oh2Nvn! zo2!k%DR)ogP=!+jKzofpwHW|^AM%8v6hgZ=-L>SFxq8XUob`F~8}waXoS|k0Qv at Me ziqaGCqoIirDyU8Reg=WR#*_1m8-|kU7jItxqlj-^B)Q18Fa6 zd9 at TOmpiec@A2{voA&gQsc!YSIl|Y5)zX$)&`_yr%zedGRu>ZJb{kx@~tb at IUoRQ=Is@#+QKFbvFJvmx$vzC;g z7;}giktmow0WQFPNC^=@CrywXtlL^Ux&pRnpjOH0Zi2R&|;!% zx1d4@)sl32bneF;TaP!lxeV~}_{LjHcDqd7tXXE?vGB+LDU6CAm>grA*=?{9hevkB9Asn*Hd at 5oZQ?2IyF)oy z8H{^VL`d#Bi1xPhAbSRhRo~8pZ4-@!CxC3kk{oZ;tx{mA$+8Y(8{xc-xWkx3S-v9 z3=z{U^kLeiBFfU4<1xn{nDD&>KCK<`#U-Ja7?@)uCkHISZ4^C!ue=g<)QMc^Fm>QH zE?QqgG+>NG_eYXAJ~HSI+HFYnF1FpmUd^$Epdr(AZVv~Iyd#>?iouX3lYsk!{3|*q zQMt58V1R%oaR1{)+W$K`|AEae4J%i*MYJ#ZEyw!=oL at hFAte*4B%~s$3bW=L{>%$R zTrgx^I6dl;xf{XR!x3z%*1puWs1RS%Zcc`u`6UgcBy%okV?$BhqF33k?dI10*3oYr zAlc(`HR)xd9<*p)z2UQk^|ZD9*Y>`#yybHx26Vjdfo3^aN^^tdyVQFOe6xEG-mUl} zHtS(G^3JK%cZ1~kip|jgjM}Lu%d6L8>@!gXVeFCb?w0KJo~V6)SDN?Ntu${$SMm#U zH!*<$+l?mK*$vyP=SD9I8Yhmz*rq{hXb%yA!su|fv at eQJvDkJ(A3v^ti>{Qv`bT3CCd z5YccOl9AlC@|?=WiYfyiKLe2Kmv%*sIjvR1Xj8&4%E$Ly3>S{Z*ZJ6~Tnhf>>3@>$>%SkB2bpY-w`L4%j^Qml5ZgwI+=(b|jh{X-1 zc#^|Qz*11_s3qn8D0fOL1e$ptZ*v$=*U8Zwv!YhoZ;UJ|`Lq^U&JrVWGi5XXi4>7{ zQXNZ#^OZVXjOW}Z*uSdrd{MTNa9g2IgVNl+IcRGMPR1$DyAx&QH56kZO^6fNf1-ab zWw4c)Px(pYR?)QxDjUd`Sn)XFtuqapm0shR#vW_NxqsY9gI&xJfhmmr?nx~r@%lTv zbrmIcebh~fCb=Pf$mK4UR=MLOtYL&WaFr{P&x%K?hpc@`_iSR}!YYei0UVXXBs|-7 z3f4kUcm2Zj7r-0);5S8bcsWzo;ri*zE$or1(H~u9P7bxvD%Xb2@$$}OQmM6w0hLVB zR%vDj92!Gv=g8`+6Qc*>@~ah1 at 7A|TF#}3#9Vu|`>=OkFl3SzSPIH)KBk9Q%Sgkpi zdLmS48YEV+V%3O;Q*>g*(aKMBaGd*Ha z8opfIcV5(o^f56oeVY(&u#*bzZ)Oa(CL2XG#qXP;uPHh$WbE1Bn at R2;-3r at jx5x2P z9iAD-8ZW#iDxT2=!y~&9wTXP8-cTDy2J2jZM?_=Rs-M$TE`aOQZU_*+n6We<-b{^m zvz99Fq#hJ<=oe3az(`&Zkb}ZdIJZ1yttBpCqLI=LeK!k#X5;iyPsWfe$*ZWdmhq?B zQ?=M~Z!YECQ&&!}k1nRMmAj>#_Z*OZT;)&+=BUwsbt7BtXgR&Lh*>Azrt~m4vbr4zSShgU9F+7p+0*YT(1Av{s_Cf#et?2 ziKf*=Y!m$ajhLJCS{YD#0HKgxCFiR at k&e_o{*trm3R*zriE2i%!v%XyH03q(=NPs- zkg(HIoK1UX)S!6^tEx`|h|SrxW=cn=aG8GLjX_8dT}HQTvmM3(%y#IW&pJ at 4EtdQ~=j$Murkyq2u4dT$_Zl(gal4e#e;3o|@`^=Ya z<>6Yfw_SA08*_|z-K<(?qytq~&8e1W5K0+m;Mn9Og%Rk}AIqGdUV at oQ`2#f;a2M+2 z3p^0b`)74fU8wd2(3!Ktn_4DkO)!TwbZcqjT)%~JT-c(MJEBVr2SFcciby)n*PTxS9yS*zn z%kG!ntfQeOutR&6IP0z#DzRsz0id?cYPOMV7rQb}AS^rLwEgaP7HL4lu>J5EJmNhY zpg24sGK)}gq`0~61#k3>@V;EkTD7L71Osf=W8Mub?!eP z!p{)-9$5JvVEGN$>Y3e*>lDD*ka+{n=_p_dYm;ZL^7_Z>D>+a_qhg>`nv%@rj#0k(2oSYnH)G)-A;o?-;0X=)m(2m)q{lR}c z8s13ZI0ZV at WxieB3XQXilNQTC^-dR35I%QoLO(7XR!P2Yl7<`ifY!sWH`+^aRl}QE#JC166U^EzgO{7 z3WO8k(Dy6H{3}rJH5PU`*J_MM^H)!uM32m3z+&E!aSn7eYlEDK)%;~eeVJaf6{Vfn zDy~sBD)iXBz2K4z358-U at f?mTNds>gaf22;I}hi(w!WAhjFPmsdU*&sR5b1c;E1*a z`-UScsAs+*fYI)IG;^rO)99sDd_hun&K$vmPL*>^vLl(=Fv0j-FDWrBOHXG5{K^nT zwzn+ufM_g9NDIGh;7`L2<`l|_jZ^(XbK8Y+#iWLmxn9Hd0?&QpVuQH1 at C`BvuO?-u zCi%zOT1b?dESV at 96p39@yyn%K=FkJSnJcbx`qUDb!H-X${9 at k$_Q at E^t=1B1(Py)9i3^doKH77P) z?-_TNiaR)0XgNZyp(iq-9)U;O=xiLHtyMS{T_`$oEy01Tvk__7D;GQT308pdu?#q% zgtElA>sUbR&T(j0zXEM9S9CXtSv?dpPqhjE7@?zM(xh~HWhJ|slXBDQ9yqc!=5)IJ zNyJ at Bm7Kd%d}&JsyOLog75tIov3gUpo)6BSq at E*JMZO1ULsIJ#j>ha$MiOp>WcfpE ziNaGSE$S2!mTyqx%22TfwtXsSr at 7-!rd_ehoaZwusKkIhqX_}+jpRtfe^ekK8jkGe z(>1_UN~I~IJASZo!;HiC?$Whadw(C)*NBkp_T}B~q at F@9zuAW8?*u_Jk*!I4HOGkV zqShDpSf_`xT@&qaZ00D4wOM26>0;PqgL&!2$p7Ot+cOhp-ws3ELkZC@=aXCY at j~*0 z&V)S%>+WrbwKU!S#T4rK>e*C?i)mj@=B9+~YS8u;$mceQw%n&qk~b>Z7+24jVJUo= zRTDd($lWGvlQs*aqRrqy+!eo=2Wj%x<&t5?eec%P=hO+jKlk`^cIOOt);H?52sMz| z2e}Vuihy8fWzRRzzh>Q$-$EGWf0Lp>{HJ{G|Jy0~S7A!h-*w!>-ykp{m(Y-5#Gbna zEoz$Ma>bH at kWf-V;cBwJIxUIJZP{!cjW5N%GZ+pCLly!_w-YVGm-Hn!&hAqOS=%4S zS&jGS&(8!v5thdC> zGrHwa>?ALcg2&tIlI zC?UHa;PSK_k7Rs)?1Xhh$g|V$FAKpbt51_R(#$Fcxdfd$Scz(q5Sg=G%CV8Rj;|sD8ji zF^LeRAHL;CJX(d at qec;J*O$c@{$nLC$A^ z`H%3gYGr38Yh`EU`d>2`q7~&7fSC~e)J%T}2y%Hp{)E`{L=!F$MS%+!Uy5^VV4c*S zvzxTXxUKcNfp{s5Y7`u3qhz<@zCW7m^z!@m^aFAH^*b~pR1c64KiyiN-O2cXvx!9D zV&H=E#?c>-TJs8bYMDbid5)F9UF>HRExE6WeGEaJ at GRbbWaJMn(q1auuZJxI$V1CI z;<^+^JQ&apZq}edj?AZSTk<=^XW1x;3C14B;SoI$q0 at lJr+rjzPlJ3tNMZ{QMX427zNIrQ-JZt4Lg*Qh z2sE)TB&ZgQVCOPGezm)1iN at SjnfXj6TgB$)V4cC7oF_)W!rF{XX$KnNfsJuAz>1CW zB~enV86mUS;NidH|exQTRz`#w8Gs^r at gMW?N)qwdLK-x1um-);fjP$loi!5TQ!D?Krr-gWvECy*L zCA-2%4R-n9c_ys_kOT}uVTpXQ8e8}3hH-dxTRtz7JV$$2x}9m$@<$tty_7~pD8+2W z<}EYXP3uv*kph)mklVq{-OYE5jj`w64o#iA>Ik?r&RIk=@XFkD0k)>OtU z9tB*DKSfoLB!4{S;|Uy-!~!d0ANfjT{=wTgBx1&bxO2GRK2B9%47pJuj2>iz^Nf!7+VE7BSdfH^1E? zw>b5v@?l`6G_O{PU!+Ium+jAzJc$-0fiS+(I-g&Z5BuDC>Ku-VA3n6USb1u_&M>X% z>4_)uisancjsoOJb)}I|C?R-Fv<`)j7zqNzSMV8L`*fHE%(SeQCw+VkLe-w7fdIa3 z$Ak0eg#%PS{*6WnmO={{lEQUKy#DV9YerG7TD0$KLYlql3Tw#bJ?jDNBvTSHEwxn5 zvLeSidSDXF;`k6h*bu9bT*;Uyd!jB1NtL=tS5F7*0n2zyxMvY2?4i6+WA|8c#Kb&t zDu6D7mAOGgdrKakX$4_80-Rkkbh`JG7GSaDS9SD$eg?tkzlFy>MvnB*zd|D>_K+=Bex at I1oDt-gkYt1oF$Le-~{}*swa561(+Ic^34yUGL-AS+6iGH&5 z85_XW$UT&(5#Jvf_BBCuPfm9gBYyZ9qyaWrI2VG4H{pnf$^0R(iitM$qi!#yzYZ5N z)sRfpzRFBc^VJCzs(2I5pOjY%iA*bATT~2yPuATT*_WsS*c3jEBXHr^skrFg6hQ5! z&uOfJ=v1e%U!b{Y$WSusYQArS131VET z-3zn9q6TjnoJrM`vjB|3FJOu at j7e-FL(S({Y|2GzjCP90Y}sk4>kcD at cvo)SFHtQ) zqptCH6&kmAlbW%tDf^#sxfuo4aGCC7v*!$xvpWzK>_NY>zR+u zRq)0$u+Bo1^IJ+Q%*|~+BVV+BzAIbmPvqmo1Qp}v7^NGXt_k4x3pOIc!eo!@QZo6f z7v!_{za(4F*%>|M4p235;kgPFpL!dg6m(F_IbbI);lDYbPM&PCJ>y;A1fqIdUA7ES znOaRQg3L%j2ERK6705a-rW9no*0$Ve9Ysy**2Aetl?ZvkY6d_DVHPar8AU192yrk; zW3 at uYl6UjkbL?HucrWiUHEi~Cnqi?!K*3miK`6scs-jORIbo~f${NnS;mHu1#S_KV zpYY?8sya(8fZ`)(5ZfkY$(QjK9M_AnP?GXl1or$Zwn4T`u$%w-^_zqIr|$A<_9p)z z2mc0e2RBzSPZKl8|EB&``Ug!oUz=P4Nqkr+4TcPdx<7PG%}@qaaw{ag9ctEqw~Z{J&q_V0QT2Gc9+>`q4#Fch!Dg0`UNk zw~sZ+ic^m_vy~3#f(~c|4wBe7Q$*v87Ad+V#^v at c+qp20EhqygcqPM&+rc6vpbwhPjGvBfANGBT{PhE^L zPuJ}ALEK&Z0;Ui at aujv*)WGBxC`W1P!;- z($Ia!&tHaFT&8R5SKEA3XuBc?Z-Qi03R9ZOQlkmmANY;lQ#J-yP# z_v5R!2u3z~@eCx_?o6s$r8BTvMO0f&LN!nH=_G2pk(O at HusNkZ+m-G8*xa)#ZQkXH z8I7bI;_*?xicPwkmoS$qmV$NN2epEb0lUi`UEj+Uio;r>EntXhVv2$}4Ekx-i!hpDaex7E zS3u+{;X3al%r11)3LYRq7ygyyj|jE7&bmRJFuYZH5NPd$cTMSo;99~p`c z>-e+Bw}H^8!xf3LnawYB(I&B#S;L7SIYo6|_|uY|l-dJXsqc0xc)26&h;cjd1{c4z zJa^`uHO(vz4h#Kfz`w$IwpAHV0}cqtgBS=%@_(dK{{LTIW>C||QFRgTOTMAQ!^5Rf ziZEPv;8z%Of}k(*CaA4vauH$@C?fP(f^JI4r2Ps6LhhqdZnGE-`t2w2Ah4KCU|57U z*q{a)O}FAgg^C6Dd_YzVOLoaN*Yi}5CyWg=#Ky4!5x7QOGki{;J zK!sxmLC*l5f7GAagNtP^&1jy_Hkh7S$5sODCCj#91Oor_VeJhXgWBoO7 zwYt+9daPQpN<8IpeTplw(U7v58%$!kXc-wBU4m?Sy(BHKSMh3s{2+>)xv^K#U=>la zskf01DcOu7yPcG!R~a>SL`bE1i3wAAwYjQ5lje!@dy*@4c3fGFDrLKB9w$!GPoMb5 zw+|B_hZ0gEX&-HKHJ?^D>=>j*_Mo#1&!T2?-sYDK;$2Nid!)24fkp+p_JN#SGzJs9 zp*}KmnKR9vpA<&q^Rr10`Tc~a9+Q*4F+A!zO4|5FPIfLgjt{q52;%W34awEkDRAB= zU*Y+d51zPgmIQUcBr%StRJin6NMojL;&>QuT z3PgpaVNXwK$|W!9~3o ze#EokKBOqpqASS3HMeFm1;(!~N-IQ_s-)X{kA`!`xTOK~;b&%e+O;m|8VD3+v^KQz z=9#dhyNU!L#0(F^Ikj^Se0+y3Rr4-JwwYLLLu8Sv)}6GPX?#dfZJ0(+XNnH2qlYQo z&Y at m&hS8l>VyAz2lQyYtB*78_<1XLY3T~xwZg~-8z3}bL$VtI6pN21kOFdYOPm_O*r&X zFg+FB^oWtP$&`w3&Vfy0=;vk1`LMTUZppXiZrQhHZ!qw#_xRY+C0KvP+&e`Ay12K7 z4cvTx`eE}g+#;!u5D?r?d`kCo^Z((;%iZI{d%sQZ9hG3LjG1=&iPfEZ8PU75wT|j_ z$KWd4?;0os(Yi>MXfB*jihLU!!*HA28w=ma<*KRhm>iE@((>u)x#5JI)EiiK_15)cG=FlM%0BTqM9+p^W9k^)sThQrAmj zEYD*r$Y2TlNEtLApZhJ!xhWnpK$%(kC90&(5W3riTkzgdk!b!RIZu6OX9B~3<4_qw zfwRTYiPUjd=fZ%KTui*^>f;`(h8&(wBURZ(YZHWWqD5Usw=lNVQ$#y{eB{@=h at Uz+ zIMdMW?Dzz`q*vexV^d|5HOuO?7d0d$2aJ(|Cnq;vGMx-fm)ruK3A&6Pnh<@q(6q^W zx=M|rxee%nFw3d&aw6{TbK<5$b7-pJt!V(a@=ze;`kDxk_ z)G_qMzY{8O#wAo9Pejym#o`*v-*Ah6Zy*CeBM3c-x59C^WJLRhAT at IwL#uPlt`1rfc8KOdwV z*k;0InGFUmXdm%G2ObzBx#!ww4TG!PNR6Ep9wzfWKZNS=EWr{@`x$U+D!1W>#eejA zG{1SYIs!6CisSXub?>To$M%N;!@>n~j)26Z at W6P8MzCf0D{PceLC%w<8DvrcK=Ib9w3tqoYH7D zAY&}Akvw|p+L1 at Q{u#P?4 at 1nZ_l0cgaZ6N&t9T^)qcJ+wfXYN9UtKLgaKsxi1qbRX z`H6h=QUocsT06Hyd;=vJT5*yb)kLd(`rsIiF2H6*9X7QSx2I|D<4k|9(9UCOuBjy% zHq`{|8ILp}SLi_Tyz1bMTGvQvv^}FR_gp}=tWF>rfK{(zPDZ20#3DD1H~o4FE8yJR zUn at IRRfX(|V{g8kSE?*tF3WHT2n}y3JpYuYu||l9b{YVesh7_ps)HwU9ztaf9VHuy zIyfpkw_AQ0%R5hU!?Y_b`*gqPz(bAQ9S!qaPRUCl>O0sC^Tb2S-5p1qHT~U&%&|ir zrMiE~x`+sPpvN}D=yy-O*FyiZ;{x}*Ey7YeXb6n(#}BsXJzW&vkj^uX{vA=|(8zn7 zMARqB^E~{6^V5niKDQSSSHlG4sxMJ=O)^-n>DJtOb)<5O+;_PBB@#=faYTyMC2~FJQf^qe0T1*vN zt?Q5BQUAJZTSf+VW?z at Ej$Ej7=MM1ko8}ccrxiBDxH61sIOK9eSb~ zS49ksHQVD(b*|%Sx?@*9g;!+yRMm at L%Z_HAWoT at RSNJ*D3(mvdb_RzUEj^!#T#bIo zgX1^zI&>13Cu%6ch%)-j9S%B|N|5QwZz zhIs=WF;mreaz8Fkes|~ya=7a3h;cQ7-IJbgE!3w(K1Cf6GXRF^7~PZR98*J6I7$UtjTcufbV&R%C6rXG`yD^Sn2=; ze?l}6aRmwI8XOV52b=$cN6TU;9GnS{WRVj^WPvj at y#^Q|62!HvtB*mVhCy-Px?U<8 zVj%Ub3vI<`B}TaY!oB3i0_%uJ5pW!K2OMNiQF$;98>;8Jx9NJj?8v8Y5x)||a|<5y zA_w@^fqkvT+S=Yh^NsAPdLY=*^NoGhJbZ#i*uwDlrGvhS#td>8qz^@ip4 z?JwQ<#dQ_^dNeeh2K~FLNWiev1pbGxehliA9Q%~1cfGAn(;c+FBXuK))-(3xk2zXG zwhpbW2Gj$()w1X-fo5+vyDqiMp38shPbu6G?q`GiRk%U_&qeIQwhksXe;t+F%-sH$ z*^rLQygK5SJnb-Hgxcc=_m;){dYKo zr`53E3BpP2S)C6pPfIak|4m%ud1J?RYlnqK;`i70u>nx(ZDtJZlIuxZW=NoqZ`FPM zABm7yIe!1$eSh#p*cRp&HN#HZ4);3hxG{_zNXv75J!stW)f!(!c8{VSyDLstm(C-t zlKX)NyDvOF>pw2<$%5tPUX#ZC_t-JC32P4<#+WPcr!{DA-L64Ete%9*+UhoFG1Fd z^C&RI?qCN;AwSw}XK6!F1z&N0N(M=%L!BhIrr0`F)H0Xd-p at T!o?6mTEALo;2_6?^ zO%vdj%*iyj)rp4p9ZZ6&l!V4N&#+9{zGm* zXLeHRH%>pR)dK$e`7(HfAAj`Ap-%~ zQ2nP}NI3_4D_4hqvMt40UcS1EZeLqIjh5om4V_UFmi32vk#?(wu~7$lDfP5k;5wT6 zKN<0(518hn_*fd~2!jV#Xo(Pe5ib{3;v|d1Twb(jPIR60c%Ht1sr*IOUBH- zTg!%go-AoG6>Qz?T}|bnmY~He(F1BYH9DWZ_kOmnQ%w&!Ql!`i^2Axs-{Sfu*6b2m z3V{7nbp9n39nOT9%UJ5o1 at sZj4(@c==jH)rEBAZ5aJRw!(=Aig{x at B}lx9(6J~q8@ zQ4Noz#-|6;y+TA=*#VPNQRkG5Du1xW6x*xlQWL(}l9w+{>Xu5L-`w~LMg6Cm#PWxt_HV)G at mJM_h zQmnE?kGogZyQZ=^m*N`U9#M_zxgBI#t7`Qk=FW|5(j2m?4N?)N*ITS|XY)G_yqMuv z&CwZJ^+c@!Ya{)|syYTz8s1VK#8|~0;`V^_G4aMB*;vUN|DXL^M?T*-h zi5y#y1doxgLpSVOh50C5@*&0)FO!{w5_hnVsd{*@b{eQl&^F7H!35AYQz4&jRw{yr z5-dHiX=<*yQxqC?(_BQ9gzDFrbzZ7(*&B!543c%tZduB(Zjnufbo5g#&KO0Lz3w+= zr0G#J|5~+Hb@!fg4-GHeMxlFbns2g9kfv}p_QGU(wa8BumsOBbKDU<~;4!v#vp?Hl zKIqC1E*pF?F(4o!ht~`zW<)Mt)Xi;|y|`_v8eiJiNCt at 3f?CdwJj}OxP=Za?-S4W? z;OOJZ1AGb=xQOXeqU0m1yEZrb35j)knpSpYL&7T1+(jD=8etHc^nqxC-q1{7{t zP{!-~213f_6`gAGL^TS-0}}R*S55~r$+!B}^*{Os1orVzdIpN`%o8!bjrTNOG*DXe zmHHPHwgY89aQ+|G-YU3qZA;U2rkR@>5}cHUi8 z=iI7ux*v9Tbc8|*g&q_k&HtZcNMnAZ{b_3aYHa)Kns6W$AcJ~6< zmSUJGWVhlNeeQZA5r>wfxYb)D5yM{pu-_s3+Z=ej_CyLwIyHfOXxeg-vef8QqSkOonjHsKXPkD8bF;mRGSVA=*tH{|KC zvT>fOoIU;}>b8g!*X~5r^I|bx%6ydSFKgyJQnMH9i6L{Z=r!|P8E4WTv~AXwfPBCZ-=p?JQB$()*>bQ;nNGPtIkZpkG%AZ38W0%3G!%eI>0eUM)my6t*{S zjXalT9HkzvTtmRxVwO=wFOk}cLu|)?(LzzZykeNU5=dc3ztJq--1G_48hw}EF98bc z$jm^D%r at sFi^*XUU04ch*Par=2UP{-3QPeuq&jS8NaymFO=2ZZ<~Ps^ooC48aR&B19AEA5G8s04a^2^01Q+(-);E48 zuo^N99&_}zrG))3d2-26eFD2T7&^KtL&ie$!#&Lvo`)elDty#XOV1ra(-=c{#2 at vt z<*p+{z1X at xN-Zn!xz(b{t<|MWY*&?nm4!Owa-h6#WoTOg0?t%F**3yW%CAP+K0`L7n`dzaeuc!!XxjktKmr4YDTTP;n<$OcT zrKKVBQso3fFuh}SZp+5%+Kuf+hV8{W%LjD2C-Q`#up`{+8ac}+6$(%Oc;P?Z_?*YEwegW za>*`STsDS#n%&fo<@c;?h`z?4QQl6ly&!8>|L+X+#$nb_- zNL}ygiVxpW}-8*HYe(vX%I%=CXvs?yP(9D=RT= z%Jgw#ltwxF2{YYFo#jF at XoN)0O;Kq%jPzRT#&+GQS!l7^?38QuBkyvX-WmtW+^v2N z19erg>hgt``WMmOw^tQtPT`%coYNs^&_RNx}!y|Fbyh$ejDjD(&?i1 zM<12(7tb&M*~nzvH-ZhRk#XvgaqN-thnQqc#ah2`*fa7SRs9j^tFD;T8=#g?Y{R|D z$T%WWk*v*4fx>U{!y`Am1^);t!+L|}%w(!9gMM6Ok_K&dPoGl~-Nj7WwC_mNg$k9Pk~^MCHJZBSDGly~ zVQoK)RxbIHz8w8>%!_sS6Zj)-vqAFHZo<<`=77Kt#otKe8xp2p9vLN{1j{MWRO!|M zs&Hx*HMKJhjWbeuO;<~5!B$c5AvJo9Ok=+!*$e zV$784$yB&eTj*bCdiIj}^h99D1H**S&WD?;!B`(zrdG=4JI^)CXA9gG8bPyO<(|V>YCIhjv$Fbn at LcDYZ_UiP< zWkWC*_Qcp;zvFacEk2QFRID1u`4gXA<%fW*J5zz7yeyp6&NR7Yp0z3LqJ!O^typOgQ}J&8-VrOX6D8e~ z`_~@n*x64)9IeiEO7C3MDHVVC7`ux31P}Vgf{t03x_Ok_Z8LXdmu$i3`L!N3+_=xM3u2IPn); zNyaQh9U1P9Ug(S3Kv($fHF@{%5jcfGwHf?pjNZg(*|0#%ikVlENe8{)$5165)X9r_#yQs8Xq5e|Z3&%M&FlpOz76YE|Y?t7qeH z+w@{9t#mR!qEqsUQ`^JIrcuFk7vB%t!|2A*0N&GAu;&v3L4Kc)D(=x6-pyC+^~2pU zZUHZj57ws9pSdo+QDrDZm7A~bKbyoKNifH!#xg9N~)OzFZCINSt4<6dew|QdLZ8ioJwn64!>ho7mH>D`=gy8RCfn>7 zeq3UdKeR(VI?=TK5^*`Q#&t~PkAgh~Z^xbW!$xmp*AR at n6XM+OAOMu@cIKu`T!q at D z&OYQtSs->ae<}3t#%J-QBRfNGEit?4_t{ZbAxzT-gq{F*Y>ow zB2rBRu-JucrN#K#M^nVRgJ+n=jH(tPJ;X|BT7uOtQ4Qdjz~H>rj#EiQE5)c6fnAAH zyJMT3ne$u84horcK5$#mRG^}4 at s%(RvbU%0tPQ`FOb@!eyDp!Yv(yY=I_2K0<%<{+ z_7+3AvYOXvrt_Wuq?-(2ZZ^X0r)Je0G&mFB}!zV2FIm*M4#KN>u^xFYim zznn;p30^p48m88ThTRB%sg4XD&wyXd5DA|Zn=7AsWmElSNZ*=kcYp1a0p+qce at qC8 z07eQLTxBAG5t^lhbb>nYUAUY$R4gBVfWCbhVOW_L?XU3djH{KY^M1)(QOyqrwu6O6 z=TvYu8|4RFIF(kZx?%!`^~>mxX-*q2zb at a4=a z#*y<8-iIXBOj({U_9GBQ;JDPAvFfLqS|T)Ll}EmKLv}Ho>F=^GyuH=snDme3rpPtNv7%F^+R3o9r6w^J z7R0q%lhW*p%^xff>28) zEOZ!-v5nO;de>bqLTI-a1u^?qff`Y#4QqYYk=XI5topp>-8ANW?o-_t35gboiJWIR zMA;9>2R*`HgY{9=m04bH9J3mY?7vi53Ts_O=&tsBu#_5?#?cqTpvB?DM%1Pz_%n=# zu(=FO=YENdwP(?hW3yRRvmmgG1 at f9it(_kxcd-( zo{p#<2YEkX<0mF?Cp-srtfP;0r$?2cail^}@$}@PGUlOcyurXcOkSJNw)KV?c%1WX zl>3nGGzJ%Kx at 3jvEl@4tZMfoxZhCl&?rOG`A#N+{9}U(&jK(xc0a&_aM at HfqV?=ts z!Y#WcN6>uLrXy|ShfI3jp$t7?3_Ym~J-Hk^Lcec@=nfem{%mU+ZiR at An7CdgyV?k@ z;Jg?m-!XCEzAWaB)^B?vrDKmeh24Sh#MGI at I|bYOK|#hy{1qi`oASjCrg%7gD8&g1 zy at 4Hb#_r#wYpm6BS}n>x*-__Hrs7XLdFi%ZJqzN<@>&1EC5b3{)*ybLgO0Jt>GKr# zi(OEghKc#*NHs-DZ_pCY#Qw}YOCO$WAx7;y*rD~YbGik><=sHupak!3=FW3|$2O1C#Zr8^F zXwG#sm9TY at +`YqBicDv6+~C+bK%Ws3k2GKcH=y$uO^C8{)zGR&D_#TI3hjW;2sJ+- zsL{sRC)FqIF*{dUv59KeGX=%0;f#xH at uZir+~@wRVG%imF7>!B!8l+VMHFk&)F1)p zj^&608NnO}y{)6kp0C0diZvrGupM_Pl+uNdX=+a8(7y&4byoho5rykr>S-wj?#&t$ zoHL$qo#5<)?rS0h=Bqu*ROY{%OPSDM$PnhdQWwYvU9t+28nugJWiDYcaGJ~_ zs~0ABeBhQ(=ukCy)DUfhefPg1mTQ$vmOO-seVOc8BV#R3Wj!Dh-Bfs>ES$#;q>zKl zgi4K-CUfGpW}GWa%q83MBELiYS9uW3u2>BJC65#c5D@;q$Bh0 at I@kZG!~gGI>$$3S z|G_BsPg9S}gIrQ>D5SDZ?FG>g6-BGkj80PhR18)U#2?*Y(7hSkPJL}+`^KDg<`IzM zg(&_lQPh%Tek0q5(27o#?pLz1=s?UTMARner+7~)*{np z_-`JRjK$j at gWZ5|xcAm$Qyo5A?@Kt+7I>RY7W_%O41qsqj=XFJ6-^Rwe#(pYxZein z!bzhXRyZW%(Yyysp&ExIT$r#XYbQUWOu)ZUW_M&=wM+p{+41ZbnvXlodC?H2^}4Qp zZ^2J at TH0~@iZy%6HH(gY{%Ri5L#lE1YunC-zmYnkaxcz8#*YZ5eAM#7RI%*K^oHhQPiL#GCABiBlc zku>?>Ur7|AuydgHqx79prL7D)-{pVd9~4w0Bl{kLR8Kr z<*S}|=ajS!n?bxi+h7=rzv}a`7 at jCib|MR0QhA+5Dopmq5%CjSm!bwaE7c00GLr$# zqaOyf>x^3VnnZm~4TOQk|8{c;SOa6X$yHO zIn-PD;!=b48_?S(nBbYd at Z$KDE-aO(upuBJ{Wf2WFLZ_*+FtPrIOmf~-0G7vOWwBV z6${95Z)Dq1&)ey5PvSmW*1`dAOdCT1K49bDVg9Q=aE_?N2|z(WQXxS=c>izp at eg&V z`TU1E{?Pm3rHCMdePa()r5`OKB7%uPB=~+n3KSj+;EQXa)AtyEnmE*XRbp#EVZQ@? z1;#Xauz#mV+BEfeE at l1Mk@+^gQ at 6Vt@EvQ!8UKR0uuZ8a_WY`LX9ShWX}0eZ3{G~* z1Vsh9F~HDpqfZ1h9t)+bHT%(yancV^dTi&jD&N&QRcc^w>oS^eYKcH68dnu8sB>#; zKsDZ%hQ&becG`jlHi!Kk&3C^PpFB7C)aks8)wBp6sz&ZN)Va$n?XOqk!Q-wWVK#^DKgsXMi2)5}62}W#C5;S}d%E)DjYPC0ZHLbI)>=nk;Bz1no+6G8c?HR@!i3E|{gKjcw~kbkuBukbM;9sVWp38Me%+KLAJ*F3 zS(k+vjbtHbO%0(jy{Djh4dr8K{CUrh9+^tlwZ!qZoUmx^)W9zjl$BAXo49smexA at an-9e*|-GwlD zgQsBtTl%WY0tjHSrFK~f|ITXuU42C7{~k-qx! z#8JI_KIiSy(02?ux_#_vaWzf2Sjx-3IhCCbvBEgisgGcKPQ7cThc7L&R=ySu8XxpJ zA^LRRo7A#rM68t=3JWI4(>MdO;L=Ad^QzA8mVsXm!c at wG4ZJ@dw54`2k|K7MiN|-` zNRmpwvToa0_T45Dq;grmpQal32-DAr8Gt8Wr$G$i;Ia#TOA?*`fg%GcB??cLm?6N# z-n=mhoe-K`oaG601h*<+52*!J=@M46YlpPCIp!%qL=V1~d^qW74 z=b+qxx=_qKQW=^^zBiQuMov;Ywq}_lY}@!Q*orMM`O<-Z^*#rnfNM2N!* z4!qN7ONcTzOHw2L)*|%a-=-x;){=~jzfL`{|L)rH|3!BH5S=EpFWNHx7lqGMBQ^pm zisnE=e?+z%Q((DWFmi;ZhzJ;JPIV zlH_ZXD?2aS8(q)6H`YI2+}A?3 at xcA3y8Uhf{Qn$&hFchT-eUzW!vt$aw}B}|Uxs+n z?vx$?w6;2!BeETvxVprKH$$NI-a&SVcW%()Jt9YIg7;gA)DNFQu92E=)EfjNXtv1x zyEy~9)V5HEemm9`@F_ww?ifTO?g^m3M8ALv`63}!dP)ut(jY(}kAw$X4uyw!f`t!V zBt%Jsyh0JEFjH|5YTSiJH4q_~=u!!gpz&)(7QI>`DePygWh*-IMU>q!-yI&(2mlX~ zVZM(Lkfu4&>GVg{Ry`v3kRN75re&l?nb~eia?@w)1``YtFq?>HfB(b7YQ}Q~gG0({ zVzpJ)bq6(ora;Cny(WD`iZ(}8_0N<+1;+Tr;vH|1H zgW}Dz-P+O3Dg0>W+FsM33eoTA>NDpUN at yl;kxi}LEEA92;}d?qYDF#$9Vr5?KGMNt zav5h;f<~2%uG-lp+!SoKm{DrjyJTtsz)yy60^T}l_w!Crgb5Q4fJ5d| z8k-DpUPWRLem6*Bmsb-Yqb}xmaTYm~A~qvB!4b6DIO--P^KNWna+0 at bR-#L~bjB+;vkDGZh7ujfLBwXw1|^q4h!iitbx at nUqw8p$oMut99IQ9hgil znr%Kyq{6ikt4fBP9{-4`6lb+|OVqbDQbJ?%^9C08srE56H(ecP<~(vVrp9!0|`K32RWm0+| zi1QVV$<|Hf{QOHr5^M*3(FJ{;Gi3qs%&N$&$}WN2zB9EBje7DH(U^5!VHVyb at IKwsk`aR)trc00Jbzce1iho$=<&z`yhj9 z0x`QKQRO#N)OkflzvzRwdxT|mrj!cxdxX)2`h4(#p8u3x_K?kLl}e+#k&*f7Dg7I^ z6z&$alaNvxMx5EQS!-sm>9hx*KdLBB87_uK$^cpuiZjj_PFH{HQ;$^;qu(NSeywCC z8+DT!4_+E^;q~kaBpx*LN^uRRVaYGUaa1KNxObv%=jvBOR5#+?X|ELYM z6_f7mOZ8>2;u0rD!Vmw$wA4LRaI^!1zFEvhFLNrb!ewGd6qayD;sNUW0zLSiHB5Sh zI{U8GwgbQX8>Bn02x3=d$bOlx0c+H%=BuduBA#P8+?O~@ zdApJ$e937_P;{QaYQed}oY(iP$SZvj=pWn`BHkT*qAO*xxUdv$#Wp?8y(3}BQ~c%^ zYM$&`jflB#hSDss;GultP1k4Mjpu*virIR*KK)QH(}J9SWNKRyL-)zCU_c{uxo^eD zK*}zplyro#5+|)FtbYf0dRJa~ClI#bui%LX>pjxI^v>lgCxJv#_=U6UPlxa}NPL4# zcYmN*g>&!H(f-|!*iD!q#w2o0y+e@#W+t9wi%=P{$Uhh%cNEG_6o2J*JHABMfMNIG z1te{J_aGO%E!PWFSFYDaF>=)qyq5gNn9YP%x`BS#~N)u;5qHn2?OLMXjSGjeJ^j-!^N;Eis0TwwuK8-bF2;$XJkDrP*8cn}41l?Inv| ziDF^hE3m1?B^XJ7K6cza0h~e6n7k8~k>|S~J+F$Gyi=Mr?XFfqZ8oMMbe`m)`U}pj z#HHp-xbyf~dQKHgRxe?lhsxyaJ$gl|0u^GkmgBVvvxV30)QeB?_QCh0fPY8DT(IkN zUH_G34nl!|2>d-%jHR=gk*TNNR0jjCtyMu9;=LHnRgYiQna~KqG+UGsT@=Wk?lwW30Gaa?e_3v za5MUfgDx{zm|}4u>IxuF;g1gQOcJ!+U8O#z}ZG z?xQY94!<@do#8vh)NLelD$Qjycny}EHDu2LH+&;$=lzM}UW=~0E5WTR)ui5X==hu& zsqP_}DT at V@4HnlXc=YG|9SIv$W=y+zhy z_|f)>S9|HBQx5$5U~1zrM-=;N4R`Q@{oLp0pMJ{kn-wsOoR!{UQ3^bW6&m-vEc$T8 zs=TrA*Srw at -aTi`A_1I8+hK%a)2 at TKGWL5~#vAI$joXd5N>r62Db09oQt7O;ADueO z4Py^~= zD~=MQka&a#wQ=!W0)UF50VCi9aeZykh*J1;Ly!+10uEeyoVEktA>Kg-&@b`=KR8@; zJb+Y36}@l&6>;@oV8R#IWbC!P1sa}B*LjvrrAQ;UKZ{Jun)3 at q6aUYv zzyMKYm1{M+Tik7i4O=|gh4)auw!a-BhcQN$pw9bdJBmn at BdpF)^|1_$R~81MeQx3h zDl(crFrc68PEHWzyctI at kWJ38+zLuW&IQXFXIOEOZQ-X4qMwUr@{7A0t(R=z$Znp0g5$*ga*4%EiwP6 zaE*CEeIK(PxI4EQqQ&CF;pDDqb%jW#VPZPG!9+mZ@(9%(TV^S=DVpy*zj0=Bh^2LB zNxmcA8GC3-&XK508_B^kC}>}z9w>D0QhW=}@`^(G3gfV6<1P0J!FfxMafh#d$1nSV zR2op5Y at E{DD6UuxTI`q&!!NC5;>jNKg`-bdqtqPDrJxR2nVGj4hJ}98E)?kb^Zj3) zgbCrx0udYp3gxgI6B!oIcA0841~syRxqHSeeqbe*NfeEp`zsyL_9ZXv+p z5_hidycp!rl}ZfW&`4dGS7j)%xT-Yk5_-OH`U<-H?92P=+9I+8FDmwWRL|*3&st3f zVG>V&M^w-M(s-VRzrR?9i|fyFUrYND9j8?lnH6k{`Z!g{ICbAAZbN-ElVr6``Rq39 zv$LwiTtnV at GD#TKk8OUdr ziQBXFN;{v*>YaWVkzv3s-*7`JsG*ZcExcZuSkX0K`suKUs zme{;`C>{o(Y~gA=1vTs9)PQvUy`JS+9742SUAClVQUSlzw5oaH?)`(c+v^ znedb0d*RuhypRI^7TuBLr*Pa7%aNpB$OspjJ)NlvTbInuIhdir2{j4!u}8UWp{=nk z8^@i&(L393AyOX*nmDB`yiP|v-iTrSoZ at negl~kDkr8xpbLD$fZ!1M|GI at P@)$f!j zE{S6(ZX at KjU76#~NBQZ4uEfI6D4opWKj%lte_g*XK+p-^0nQ7_a7J;ziI0c(Jj(t- zf!i5_DP{PnTLvb}zJEUH$wPh}I>a04f$M2NM9~xVc at aOiM5##HldCk|lix90VeJR2 z_qqM9z{uBHcYn5m%P=K%+Fk2-Q6l=?qn?oBYDM_lF@^oGnZ20wDfRdje~!H)uFbC& z)?_{5m))~{>zeIr5!)jB&hP6TaO>1={RtM1?x17(m7hFgvrzXB at I+e1a9#)@@MAeS z$v;?S)*8N}Co}%EU65)1R`ftWr}=@19{uFb{(!smJ at bs6rGW(7PLUipK)$4OAKF-E zjT>uPKw_2kSC$Olusux}3ziRn-^Fj<*5KFJyucInbFE^z%o{Dt2RryD#O58n)fF$y z2Y}Sz#CRhqdTHru8~L(7lCK$VbCpJ3b0p2r&9W8JP>^O6g`tZf5A8&1kG(M; z-w?(+J?7Gpf5nqaj(%YNA^caP9V!Jh!2cDpok4s$x2L^ zk7AAGiY^9I6P7MLb}7V8a?}@x!X$%(ofE at Ochnj{hqi(yg at fD%Z$gukY9E=a$RtnK zdG}4U;9qrlwbVCo?-(qI(ZTQ-iSn)(l7Zu%u1{YIw!@6lE!j`9tH`s#u(HL at J9L~> zqr69~3Qj2uh{&TrAuToQ95SR(UmXK=f$L}HoyE>#Up!FRS>W?92TuU1HNp3AmGPEl zXv7E+LxN(JUXGLTNOr}jQu;P_r#9DCB$24~-O*W_2!n`YYd4F1Ce~uORTY at yjbaqO zT-V3y9G!a}<P4g@!0up*g|S$Rrx8s1{HTWjT2UM*tbIHoMMCt={ZVE5JBUsk!CS!`ppf z2K;FAM)i54ok!9X3 at 6_zLjX^sJyy49K)7lYQ1ev5<>tc-DOK}DU{ZA*T;8~K6ry<> zrL4-dEcwJc4_JX>Xrq6n)tY26wpGbm`Kf95E4L61Mk#MaC*`LEZ9Wou8g+f$VaHpyhh|($cLCL`xmq=Xb>Y5%hn%B4|QXe&A?`W$S#t1 zf at XMkMJn?IPL}#Oyd_B^;L3I41MorWx_FnidWGH0)GRHPHO+zuRhJG?dR7qqoch3LxrR zRup}|SuIB_DQa7`^!(BvyfDY~;Eb}fYhhgZ0<(ArvVMZ9!CL2 at Ke_~{mYv#j1pPoU zhBR-#Ipv=9yY8 at X_&_^McPkQBu~Mw6jDPjVTrI>ba at Ca8V~ zZH_iY^Q!tRm`uwsc}{CLciZvH9~fA*2GIk5#YC2;=%^;f+1NNX%*1G;g0V_A=7x at O z4}%8|3uDjJ{QIGHZ-i^rZ?tC`X;$};)2nhXTV2}2wr8(%;8{hbN}~k36V53WlkQJS zKc??~o)(&SP$`yo)n+G>M=;sZ7WYiF{;F&?D_^!M>o{4NMXOX2bj zz86!KwSgzB_o~Ic-ek_FrHTTcE3ULX4(w4lqe#3L at WI*(z#;h0Js9ncEOr-;bbNr{ z(+YxuT$#jJf!SKKTtKLiLLr0eE}O_=xe1cJ#7Oh7D6t^r7PWxIyrjj*d8~tdM;(lfVg at v86$z08=?*UE4e&jog15zG}QS~&rkG{+%~5{sxXeh`GnlzE8Pp_egrg| zP=zTP6Wclnp>O0j#M5b(;18Imwa|JyOsSWhx81LOeIOyJYfFY3k`-eIeK0{nQhV3t zsGe^rsJJUNxAqdK%KMOmi=(TwoC_e2?T0%DwMH8qQAC?-j#vKD%thw8!Bx>tDm$aK zZajEtbnM-cp#XopC8SY*cYtu>M1vIp1xW;mgopZ#rc zJ~ppBsvlH at 8xEH3(LOl6gD*JG`|#j`maoV!=pRFl{-_?KOpo_U8wvB;;VI at QP4}%s ztD7 at U3dIz9LMH%fljvUUECI&HOVl_)rFuF5Xyg-TwRLBd@=9?TI5DH+MyZ`Cc$k%o zv3sjSTJJm|=o^3KlkwDGck-Kmil=ax-xAM4DcQ)I~_HEtB< z?)Qp=Cw->1zr*JCw$61g7?+fH*z>56p1iZlf4?xl*&{(AS;=cw3vDf(D=Rv^p#<4VX{Pdr8YhfU)j=0b(}#|R!JIHd{*R1Rz|F5#Nm1L5v4kH7*o zFadSu7kjU3$My5OJ~JNIH`=T*P^J{$sFNeu<|)3gMlkW|H8>?pz2K~00f5$@KziaN zJ}kD)^m?-}9Yko5Eg~{d{ESig_GZ8M+t0wuyuxsnRbWDutyCsSl_p}U7NS}`0fnn{ zG4Z7e8^cw0asbi2Po|^{Q#%&daulp^*(i;8aR|vTsMy>-DH`%$4nQocV6#ui^m!q8 z_KoJ48pOne-n>I}K)7WxY}))=#05QLy&Yg_^9zrcL{rI(6OHC3;r*pP1m!`0VibC- z?8j^7%wD?MMDgTAv6V#`XqHt>TI&2jV&Llv^MVl_S$E+eOXtc3({==cjtN)D9TG!} z`ii7n`wKZ9c0gd0T8tLx2-?J{qW~KL0zy8RSCD;FpN7=^DvwWEg9~<@V1MoC+7nz? zJ`v5aSrx+&T-Y at FhT9z*Ydg{sDi_XH3)HqEu7k+eJ^a_#zjfqMu+FSc{SE>G|F_xT z|BHYBvk{=uf3`)(u&i5xiO^n(B2u at Fb}qadR)<2dsf0(dvi9uOUu|^UCin0W{R40i zc*DGfE{dGj2uN|d)*e!((>^5kaA{(F at Y|i9xoW#16a>}m3l6e at Sa5>d^TumxNA5N| zh#UywoL}voOut--J7EwhBqR6Gz?*z%A7#1 at jU?|VO;K5Q?NGDO zoK0z~)|-56ag^1O+Vs$4Xju=Qu$XMM&Vnz&K`3)wrYOj)$h+h2Yd&zd(ozMqc;eQ)z?5hDgF at l)6+G8GfY(qo=G!!ikG5HN-itr{~pHylQaIWgggS*Y|{0{9Izq(Q@ z(eN8J%9wVYwQu!_G&fg2?UfXOA$-5e|+!UOci(m>tWT^#k{b*1U#Y+o6QB zJ$hzt$1IJXa|xwWBuao(?F?1AN2w8x*@s)di%V at Xot@|Zp&xUWq)Ir)&Ma#4!}=N& zpzrE5b4BVb$s<4BM=GjFb~Y-i0uz}`AHm^t%Mk=C>PJPqOuSFRkQl2>hW^fm_ee0t zJPz at O{JwGan~7^d9(?EXJ{4KFUzN(1XR7lZ)fr&R*Nt6+yR`NCZ?z1{M2%cG-#|cq z|CKFp{H?M6Utl~d2YWGR=YOuePF2=(SY$%uzt$+YSd(aD<`Ce(B6TJFM&@~*0cKWE z7zN4kehp5`Ds6kjwfTjikm|Vyd0T|EDm7Ga`D19I=lPC%lymj#>+q5jB>t`-65_hO z{$d~t)`NfRp?-!b8HUu04~-&K+wbhBv7rNYske4X8ZGaU6U7CUAYi0cb>W&>^)p-q zpsf&q2Db=WG1NuJjdGGeI2<|!?<(1vGi9Y0%9(Ve(vg^eYqi at M2Ctfa`Z* z&vP at A6flmlqF6?GroYI-rwjB=RYzx2DiT^ob&gF4WGT|UiRtS-O0kNH#d~BHX;4FA zisqh>-(nc{8LH)Sw{Qua=;+KW;w^@D4j&Fy<7r>#!?+L8Y1Z(3QY!i8nLAyBTzP1& zAoWPcsY7r1bE`iU|BkUFP{O{_R64guP#UE&2tu^qm z`~Hw&5e0Vr>Z0Ium_Rfk+9^fTkvk128R%sD95!%$8CBDqdB|HJ-YkV$LGzap&-8WP zL+*|4bI#|}@81d_$!n^}!-H6=L&ucJA}EJ)8H%@(VlYFeYPP>Izb7K^V~9;JKseV zy5j^I29d^jd`x$;+Q4?pQ`|ec?0#*KosaRB8r@*klFzCc4e{1bh-ULP at L}h)GW=&h zO9q#ux+A%=6b2so`4g*+G(2Q5d!B*nb_PuS_gtn}>ASwk+>DPR3vT0SBp(is$)a!6 zV%z!^!%Sq1l=Xgl&L)g5Y6p0eSf9lil!re7l;Fp6daE%&tC{AiWtdU&Xl+ND+Hno~ z%s0isc9ocgzxbNfp&T at 2ZTM7)XrkfVJ$_ z3&7v at xAV5b;#SK^d+ii8wRiMj`-A!M#kRPpe6#}~{&XF_G$$bK+f`L at qse&P9b8u5 zM0>m)UrhpH6T^+gl~Fc}v|+TS6_Em+8LsNJ=FDg*%W>bs>y$sK_VrjglO#8ABA^4IhO)Riv1iOZf;^Jc4V` zR(Kfd3^by9&wC6!%%{ZnU=}4fvd{P;X4 at wauM`;dg`eAkeu8V81^S6=@)-7pl-K2v zO#JR$RAPZDMzp+okwGam%`1%epH8u*!1)dOuQJ1 at EE&)E%c%+fPq5AZdzt-1Un>6v z?QJuVNmr9D at r?*h6=){wyz4jv1q+b^g(iuNU%WEqoxY~a%q4%VdxS2G6bvL3Ywuz! z9HF3?B6GRncR8KPP3B$Y+zt5d84?$blZId2t~s0)jgrTs>2VvQxcO629Vhrj$j0iK zB(apm%vZw7Y!`WAdxsj>m>xrBWK_`1H+2AHqcp~1Uce&@ijWUe^5O%hb+67iydsh` z7L-k5N)qUDD*T+PjPS!Z9g(#ARNz6<;%fbk8N}B_GY=^oPhzzo&@cD1SbfAR41oix zswoM&uCu3KGzV4?h38RWL_A8#Lfu>blX+a0Xt%0+D>hTCdxo2TX&=R%@HS&6cLITf zzxxNTg|F0^U|`~0d%(@SBMIn=W%S%{2Xv_DmyXfQRvL5qEyWE3p-V)yGN!7wtxw3D zHmSp#&5pOqEuS~4J5yqzjMFg-8QZ_I)B=a$)=`@pkWJ5_Dv$KQQB6Y~2~dU7 at HRyT zs?&gi$2XW`8P#5A$)8HEvhAvKtxTh>T3ZHTgMx<0v-8!<4&VOuwbL2*GSz~EfbheE zfUx}^keNjt+>CAii9k}5aYa?b`YN?!v0 at 1;4pW8|rnOvDg(iy7tbP`1Xi>D1LH1>q zD>a%hEu~0q-7`5?-uBjQe*`BHutuaI*gl`hW!Ua`KAQpcf0;4O0-%MN%#7#q{`vfQ z6R`E?&uJO%YAxtm^lFi1zbYCf^L7N6eB^eM(zSf_DytG-`04O{u%c4$RM7Vpw)|ziq5{J|YdO6IWiqu^C9H9|)aWpPt5Ubs@$5|3pT05N?)GbJ)xV?= zm#Ye#7N*uab!ZZ7pBbnS;>~h=c}}^wCyA)?J$~sx at f{_oWHrR>2;jgIa at Z|ismvwd zUF4mZ%#AO6jW92A#HHV}iW^Cn)drt1Qw~<2O~LQ_8HM=F(9x{9l%=6t4pd7vrSpYp z)hfV1Ubp~gUxby>en;5Ry<5Y#Hi$-ApJOu0Mm33BzieuCU?L+ei9(({1uJ2MCy9t` zTVPc*usN7gLHS^o5H(nyokFf!{|^0Jr<;E5rHy#!?G$Qo6uuVL8gzCGezZ+1C|b~2 z&2)t=%~h$VUcb^SD%tF4rZhW4USuS}K7rcDaBx-|Fpi$lj?)LSRTHJ9Ry>$B3(zDJYqx_wZ7d`7)oHRDz`d9o^#+Cta>ZPB>THCjKve&isHG1GbC9e!MC zUg-C=?=zL9ocdCy253*wz)YGpWKkh0=VGEZ{6epPt}}vJtX7X{M;Q%npG~+k)=RZc z6dfm_fRfTy-0b;@PYi#>i#Y(H zXpi$Q15E1w$J#qadG at 4PqgiQH+O}=mw(VcqMx||MR at yczZQHhuN@u>+Gu`jpf8XhQ zd)Ar{=d2ayTSV;ViM``Q?B~v_$eTN(ZQCENIx8s(L37$%`HY&PtQvK}C;YWS>5;D* z`(T#=%N_+QyHBpG=`ITBqVMDGd@%@OMwCl1^8tXLaxEY+Q#~h2`hamdM4Eg=`Jw_f z%gxuzXBp8TaR#$cle;U`gP3xsjQT9`;~Hv at OK^DbiIq$UOTuL-?2HE0xt)c$jH{3a zO$4<+kf|KuJKsRsxnwtY?)CjVnw$$Qu?p at Ej-sn*b>BCu6?0j8%ZuAKvUIpzOQH5x zOiu39yz21P0^PzjrQn9}A8d#m6<||Wrf|FqPO2kO|Lh zdkL>pi1wKBqWhwIF7bGdwvDbgxhj_Ie`Cq|$tKuIywl3+m$Y4Lh-x_irwDd?+5-ed({2X at rQ#rA)nQU`B*xndZ=NY1;MBc_I*pF zdaz at i74FrMd^?E~P=`<6wt_9BBod;|bc&lu+5X*79fBb2%dGYj>jI9Z5xb}o8#6-r&UlEcvU`H)vp_%pDgPfB?kfIGpxypi_J#jv)f)awsr^&E2Bm-0 zYgjCX3=pO8MHwtab1;4wr2?nQ$QXj~?}8sM#NGT`!G at mgyRz{AC`xj>bs2(1^SUGF zc%8+4{F9TJo8Q;>4Q>Y$PgSwk2Tm6590$+c{lrk%fKah6WmjM at y!oj1Nlm~TA?;i% zkpr+H5K=}(`~^x?(>QCZox9 at 6gFxYOS%;K%ZB at WmJR2VYf1oIlHQ4oCLM?$~^4 at GT z+L`F47=L91UyBDtnI)@8a$tHj$CfVUL4@!*cIX~uUN>w0o=^_i_EGRNYpmXty zM!pDNiuvJ5w{o(!-?c-6G#tn5?duzY#dPk+5+}ys at 2D&@twVugD9S~1B2YCgb)||o zwrG$?x%<3KKh7~_H3W^fB&-tRMdlK&*}{6`D3=68XI*UOYH7J|pVf{D at 75n6zdt8j zY at CIdn>B^MJK>~o&^T$Jx_{{Ni{&zQ#=lFTM{0~G#VDrLS7<(QI_Q}|k0Yy8 z_bk#bG(?{=Iac9CumII`zL-SqnbxI>oS7I+LR|<=j1RW9N23ZgT%6HF7LAv4n>ai{ zM^=)Su8(k7wI()PDRn`-1OF9I3W`LPfq$?R009If^*^%4|G#kh&qEo1H^%?33wBj1 zy2|TfD7 at Gdebp9G0E!oj3X(!rj$Q-_3Fy2Zb(CfPXvlLj0jM=M?uH&n%PP?zqdwL+`XU<@nI{@sCD|BFM;t&QjKxyAI zeda)AuAA7>0L9>%b${21ND~-L at z(6sV+}3^eCdfY at 2y`Nu zAkJ{Mr9eUqSQ=IQ5>2N_M;}e%syuflf;Y!`r?F1~+`%vpZ7}b0pa^{~PYx_IT4C+6 z9QKJv98P|MVYCw6{q|>%;}s8Zj5U-qx~eX;PNloQj at 9LoNh@I4TdE%QaOE=v*E543 z$@QEHZ0tC$Q&&NK1-kW!1*zW&1a+*vr)bQ{Yntxabq7s~9%psosuAt>7nhjI8y1Gk zX}M)^42>7o(d3srU$JoQk#>d<#p_PQW!GP>RRaOw=IJZpp10k;gz*>PiU zyFD&jNZ6l1{UV3Fi;SMg6&lR7wtEoo6b$On!l+tr-}{;_I8uH!LhDegsV!Ixs_9-r zsBOflB at r}VWNCyf#azBrDa2r|FenZdhm&J1qGe+}j}9V4f{S-O&NtKm?VnU!WVTMhHvk17kPZUK5$)|0bNfg%fhek49AhslWX8_B)Hyw~hd z6)j81#xEy4SbVyL&GOstnyw!?Rr5A}yL%3(SS_A^PGEebIrfq#f<)dt$**L5h2BGL zhnuY`6ZTHB=I!2_svG0 at p~`ur1Tj+CH8kAaJMnvyZ-D%T9aneH=N9P0CiI<<>1FxE z?>=F*dJoO&?+7ac%7Iz|5g at CVU$8_ zgLkfB5QS7gW0X0Eb(|gP`0KZ#8pkAZYq+5qhT&q%4Qj=<*f!$eS*%up>3LjWL=c z_qiZomlQ&N=CQ?q`NdC_=v=9xEEM zR(->rhC38_lVVO<7tZKdBT`1a8Lm^TbK(I!HTj*)$BPk391x++I#ru9H99N? zMxw&wW#Cok$<{|!*nWqtH7+>M3q8lP&6OObgEPZ;=O at u0wC_F{f`yv~R${bn;WoZ! z|1ylaqfBZbAEb_Vw5#v*xKLBUl{O at C=kR9 zO2{@~&bqzYrn2s_Vr{K7Q{)%b7G-`FVxbk7GPIr?n{d4;Ge|>&D8d6f)LK9Qe-A!s zcDhKUmSx2Ms0t4Xh>)#o-L!w z1j8iu69(J9NOZoxQlN~8Nla1{bfTHbc;Sqe1TydWq1gR^^Hz9}k<=Aj)6Pfr3WVR`MMa;1W}pm(d$5%Jf$rM$Kr>3UuYtE(`Hj~h<7**^xQ$@?zU&u(C->B&Z?JUE5##zE1kY3lE}uO(srlP-o%yZKZ_G1tNsRYuDrX|S z!sh+Q`3hSNVA*csM47`foDL+j(pNlN2*_F3oqd at fK(rxi4t0z~0@!ZWH?}{%SFHT> z{r*XH-`+xx)L*-&^OZjYS%jG_r=6Nd^*OWDXXb4wsI{kL;b!DZFcDPSFD_E{CFgSK z7F`TR>T*BO`K}L0Z)n?HGf1XWPmWo|(Wo+G_rKbJ<^495;Fet(`e4KBTk!!_=@OJK zFV`So9L&<=wV)Hy2;<17bzFBi{G0m8aa=t%kGApg zP*^|te(`6GLGli4ELVf_k at 7fT#`Vd=LUM+FP at NMh=1 zjt8EM-Nc=;#=~TCc5AHPy~b~7_{3#MSDL*22az{gYxg0t4Z+8siX at qqS2rFDBBCdc_R0x5Xi9|_n3lQC}o9-3sl3) z?+iGVcCEo|Ll}Pk>{%s0YZiQ=agr>ceGuEh3eUmQS-S%{wU<+i5S-n&Ut?CAVtmdG zs0NIK?(Uyd#1MCquHX1brZ;>dzfX+nb6{?9^Gf5L8cM*({cbi?G*KpRf2Dv8HhsYs z9fndCM|CRsNf{$^3zCXg6WG!(J#}D$AXtg*F*gT0pVXD}Gc64PgXd1=k(JkYP0_&; zv*je+ad59(8b at DxAC}VI{~flnL&xPe?RNeKEk}%WwWB5!3HE at k3W`!B6GO2JPb|7~ zM;PehGeDZhLlg+MxniFv6b?1MdgDtje$~VFt2|~q?^lxQATVIRG1f6 zG#irKZg~uQI)7k`^Te$~b}ZW+6%H=lNyy85ds)E`Nz|P48-eueYIkoZbNLJv(gN~o zVgIg(m)$f3iH~t9Gz~n?kC{DxOlD}XQxh<{*oEo%*I6XqY3FEPPUPXU;j-kuHbG7f zrUoH0O6SE|P_DMOO7Gs74EZ9bbgu2n%hG1NdXMZy at YBR`Gh;d73_EP8pKgn7ANM#h_ zc0w-fHAp=fW>RE~366 at U5=O*~2_AY#S3&7OdUYDfd%T+$bc+Qka(QPMDMok!M}SsJ z3xh2=;s2h}gikOOu86+?I~8#x=}NQL%{ouacx*?M(X5b5kT195X9W6 zE0Q{+3-h6h>P!@HwX2DEct|CwQ5^jd(7ZiMtPpwQf*OEE*nxG{At=FOPeg7N=XoCA z1^BVhKVQx$l+z>63c1ZDl4f(%zv_wKWfjJ-OoKnYKj&3Bafa%asu2md_|CHn!f z&m;(;gq=^l??vkkzv5!w^zDiRtqx at sJ_M=H8}gQbrYyoHfuT2jG61Z=F zu=pWU4I5 at LlOCL|M(;Y}6YiRR$u`hv^=z)YO;=9ooqlD<$3Jc2zlrnKiv6KvW1#=8 zxBWkonWTxe>HkY|W&NY>p4D>o`V3lce!jN~Ep4re00}8sh=7n1E8>AqJMKE^db*h# z^lPLyS+Aw{jN2bEKh<2!xRh#J&wRYK!FfD2(RqKr+;R<6z9LN=EsD*SGB;wdIs_fT zmM4yem-!MNjig4KM5{tm$yn&T9vh(wa}H}@A5(;~E7(&YAp+~=BJZ-1qEsc&3d$|j z&U*101LN7Z}?>Q95qafSMp!-zh zzIo0f;y#A`&EwAH at OCFEw5u+3s&Exv*hXoT<56TKktHRHXCAiU(aE=W^T&9K*Babn z(QH1)o5-V(JkE<)8$*a)e`Uc2d=Yx-NNSb3P>bq(FZdBI#|YO5=7G_?&|gg)w7Jl5KQcg{K6ND9A`*5L`6_mx<5 at HDJ@8ylbhQ8Z3)zxEL)InVqx36jg)Cmy zmC|{J8=1C{gebA^7oD&e)n)e=MhQuV$_dC@*!*U^CPj3okus3WO z%m6S6ss9CtGW`=osil`m8wZJ075U0j)HKIRRw4)? zp+?KY5w=>^>vZe00IueOe(}>J8qx5tSFuc604prwF6YE7-lwA}PPe12U;KVPZ*aK* zStv?r?1n~!!ICr?8bZA!4>LW)A3oOkVWuFYAf_Pl7(=S#vCya>@|ZmaxKO?QA3f1T zc#Ibu+1Bf_l$qaJpqh(njSnG$g3&_>(Z{wb#HpNlT^1mp8R4gWV$rEojjCVz)PKP? z?Tyfkm%xtttnR=n$Iw4#w(1`5hHJx*B)SwHgO}KzSb6QpoZU01h$qujDxQTipf#d3 z at hHP`9#8PPUG|{Lz7?X5!BmMl9Mwe$$KteZKd!- at e`E!mT7cJZ|l2E-<#M=3o8M)F{l&$n2vA~-vRf~QO2R7>$A z>)SP?b8wAk^^PksZw%4Pl(V4veKuXu{PV9o$Io{C!>*f1jVG5#0y2$efrY&Iq zt~b&upx5X31vfAt59P5fpJ7Pt=Rs51=%EEe zMFr3tIbge)IH?NCio!)gpFyW!FnyNsR#q}tv(hroya_$vRwr^JRO3B23wK$8We at A> zZ=b{YOgFxZP4C)VWv!z5354mcH+_V{axbPutw9M}>OXJ@=K+4bQ(!o^Ei?XtYm#9N zHsvBOHXrv~NK2^4?8#--N%eY*;ly#YT#X^mGnx at e%C>kbK4vDVP*M_G8iWCFq6MDb z3vI?}XCd=`Y4b2kcm`Q^9GG!^lW+B-@`S#!Z2b|51x-P%u~Z8z+)uS6VIh-+Dm=G@ zYHhJHkP`C7 at EO=F#f{IL(woM^6k)Uy#+nge1OBm{w>>z^_sXKdRln+LUb6_m;U$|y zCK=&`CKXHRK2Y0%iOpk`jLC_uVKsGqUpgf)Lh at rj>dmW6_TYL`=R16q;H&DFaVZ>R z-0a$d)=|$cjuWJQczEW}$y*yh9>Ce;#M0%j)JXD>(@W?Aj&Nq6k8g*PRbx^8uI$%s%TurGOxx6i`k?^QHYZWhY0nPdU5+lr`R2?Qcj$&Sm^`=1=RaN z*{*~tQRPP;&4+>B2Qo7 at lT$)jjHxY>p&cx9xRv4bc^YYEJ`8%R&^GXkM^v`6iBo*m zFz-q1*f!8#VJWJ9^gHbjEJglp%d-CtmP~&&WwOE7;gr{=zEcP;`4n2Vc}wsm#2Jz|f|T7A2JTDAk4cVCaS zqM%S(h!>OWZw-OMl}vKx87kbHKq+3}sv3!k0nMhkQ|Ye^F~>T>c!h6E{3A&rzu&`- zmK$M4eWwg=IkVqJ=j(SKbbOi&IcLK$MEZ3t#SCj5>JA9bCO0uq3wE>6CPF7n!h8+T zU7wa^oNzJh(76YR)$SGBM5HAEt22=1)-ZX_xJKNcb3kv#M5?gOvW%-o;a4N;6<+QyjzFDvxe#n_fLH at dW0>wAO=&jRL#0Pu$O>`}ZCgG3`i?#_ zyp~-H95O4hVB3wBJp0JfVaP!5 at e13(D>@Q~MB5FUx%ptJJ+DeP5iG}+t^PgNX&i~~ z`yxv8;x9e(d<6i%5Ub_;jzH;B#z at YW_g22k$syavd_$W8KWb|U(b=B&umUtLM6R%k zN<4|KE*`6J-g$y?RP_XltQB~jjMyWW05vP0ZUv)fD5H?R9U{B at 8%Nct(J5plhi{O^ zEynG2{GLs|Pa&jtA8x+bKnY{SFNM at zjH@PtGv^noom*rQS1EFdE1ZIwXOIi>Mlz*U zU!uln);xBHLkuxw^=a>u_)GJo8`3*w_lU*2g4Q>8f$Y5zQ8xJ7uqDtB;5!TgI_Y|v z?ERrRNK!oBuYZC(TIcb~-|mMuK>xcgWd9B1{{eU#<#jOxUpVV=NJPB^GQv}7rHzF& zBw;;l8GyUA^nM%~xk5s5G>!g*;>$t2T+(UiXTGn6xfU}m^T)Rj#jLAQDuneygK2j= zyQViDuZqq2?XUM2^dA80^wuy@ClG2frRTmLVPpUeKv8Bt-c^4w za~R-Vwp{b-0A;0>)aaf+SdJ#&q_I4LP1ZG3>~9X9jr|-#sJly7vlhWDgMwR=Qsb$& zc<7;Il|2zE)mkV`{@_EW+BNWjyL$sHY^f%ZcZA{DuzwC4E?Ogm5hzOdVyQvx^cAk_ zI?ANvMNl->O^xnPSW) zMUTnSRxBSat4Uo`=uKDwdtA?$Y&CA#1&E&Y8MF_@`{MUi1dWi^eS*k?_K}@cM^Xix ze-Au?Hu=2(kx8saE#qi5lj4jp?GC%X1dw+llidr_2#G zw0ez|s}#Tu2Olu8uz=FvpV;vzSG9Z_{BVI(sCg%}y$c^?dlQLkRC6v7GM?0l#M(vV zCPGk}f3M`}%(mGJn-1r(8VdIUR(%l=3|vgp5$Fa8Y3C9*%lL-1%MFuy>$=Rq&N3t& z0#l``2^p-t+XaSgN;Q*wj7H`lZifs0yH7|j#{dh|UVHs|&lu+E!BxzTdIwxjvowIp z>sQ4FMhIM at r_R<9oXg;I_*?Yuh2e8AZhsuV=`hoT^QM(^jqkS2&8Z!$k at V^#S1M}A zsI^y4ON;M&0u1fvq*3=QzwA7wZm-JGGF{t<1Y963S;#lunS3?30uMQzqMB_A44;(~ z>;kW}t~`*!d4)LdSl1jPK`e%!>%#K3_??-BB);Nz>P)|Ppd}O445DyqcBvjjM83J_ zSWA$^h4=6gWQMehrNHaA#7*oKq}j)~Voh&|TQalPLF}i36srVvAlCh~^JLW|vO!ut z<(wBrH0CA3$7O7eeK^8SwESbSr)LCn4jaRo)WhR|!kBTi7LWCAZl;BZ zDu41LSXP-95&xSX5lGn|GH#Ow}zvZn!-Ae&}4< zAi0A#UyS^jFW@^KH`32S+r@)U7P7T-z9ZvqFfH;Ezwqqn#EDIO(yA9})>Oa$$B%C2 zKWPMW1fHtqPiy_pL;2sP5eq{n3wnD)V=F^*Q(AznncaUT4Ov-U_-}#;KIi8Oisg$m zO=lu10dXhCbo&>p>&d@(cWWr$f%v6pkQfI$Qa$kR-M6lQhAhA!fmy)Tw6%{Ir<2Y6 zufq3;NqH2^>_RECBy(FRqm?nQRq}`?^B9-nm6uR}3kKJn;vcxjSPzrx_B$Y*^t6nn zs!EnIugex}iDqJL$dIj&C+FrT#NkwM4!+F&r+%qhGKK4iQVv&tgH*Z6f-cX|72Y)N zr`GfRr(XNPeFxqAlRWpK{?+lW|LC=lwVj=f7{J=u)KU3Q>U1_W2benjgS`%_$~vv9 zpzzYC5c@%5L9>yN$O^43OoevOap1$*X2dC=xA+eg%7ijfR9jXUOJiz+_rYR^i28x_ z$AD$pwo5|6_ySS0z2oliL=&$`CN7wQ)9{~mRoq|kUh`}|`M%w!>VGqFAP=B$M4Z at _ zLb)FiulphDp&em>84S6n5#Qo=SXH`L9--?0i8{};nJ>Vj=$q at 8SCZMTDsT5I2CxWI zbP)5S-gcWAbShbPymb+9i6tkxZ8PW8Wxf1x6mykUzwJV0+iwjcAV95|vRldi=(?Uu zu3WuZ<-FN^E=w%iV5)r at vSnMioYB0w#*$gR%TRTN2N67i)TC=s`e_^rhhaCy#A(I&InRyxQ&iFfja6XUu#*fgz=*SbuO+DJnH5riUfs8dZhf?Q^Ie_;|hS_k$a5+(X+&6ez+O-!i zx2*Q9fu;J_(aGhGspR1U#HWAQpU*?}1O$s*8p^U%`On;sHYX^6q*qiH_btYSJn4MUjPhCvlk zeu#obDGuRwsz+mW-xU+bMTUM6ho-+#XeD$}%1;7b%^22It?Mf^n%D=K%&E{m at p^lR z<(s#Y#k*`N>DOV+8Ku=I>*emp6f$XC#uZyURN{u=I&@w*D>@xK+5I-k0bDtVzPLNO%cX0SZ=zHHTqU$?58{mY(?}R$?VE37}@|*~}PJcT6 zZuxR at _4|5hgWuuHCY=q$mfR4j3D9n>A_(V(MnOS3QC1M~OGx^L8OX!}RTpuZiA02b zkF;mJarEhg1mn4lC95nKENQ{qI*Eq;h~%U`sT7^mxSKS&mT~G>2RE3ef0!LKK=MSc zv%Ha#d)7R;QI>J)5%n2`VOmnH8DqSdCT6%<*HnJ0+BBN6zhLe at X?_)Pox#_ at aqkJw zSrA0$kOP!JmseKHNZ%pKdo&-hj`}-AEky%r{hY)y#wV$!lH+^JM3|h?avS+~ z+YIgEC@(6P8sQ-jRAF}tV~s)Ls8S0-HP~3v#z?(GtBK}!%WSU~+#@btrtDJp2u0LM z1=A==jL#Y-(!wD4DzmkeW|cJ))AG_s4JMrR{57?QM*vj1KuxBvs at EyY1$0YQ at J{tX z8DMh;-JH}U`rfHDYk3L_cFuWSKQ|puDA>-y|D5jRRTO7d_l$8<^jcGI^dYVJqP|`j z+xu$8*@yO!in=@9zDg`>RYj+`*7hfzhsq83XOaKNyp!6=sWQkQs=|VZK8%(mpuhr- zQN%(H)v4^(F6 at HvwZa3vuBK4b0^XwKnO|@yvz>ZaPeK{+4%S at DpDGXMf%VD6QB5Je5&8tPOeC84q_Jb0sz4WTgWq<10pl z4t3k3in8tUX}n~zJJ)(2_+B^f1*bYhB~Xi`zCKjtn@{Td4P)irI3h3Jg$|eC6kdFT z_<^ks%&2e at aZ(|{b;(dgiDJdKv)l=ju!tQ`hND?L6q4DTUkl{}`hSfDNc+X6(m%1F z{zqyv{SRZ|AI|wU^79HPzE at jo$z$sXxVd{wF4z*79D?j|=!BX~Bo4Kp9|B{Q1%>pI z%ZMN9z~LCtA=94}`)xMCh^ZFKha2nJPTBVx$Jt(fpRcbV0*KT|dkP6AW~823$P7dV zdI3 at 78%dx%sEj0n4}oZ)G|=vJxf2A{r&s0srTCZ!<)(nC_PpkGtxQ7;t0&fvNTMY_xtOqvGaUXxm}YsI!?yl&V|j$_=@nDIMeN<8cVPXdaF$wDDHa9jJI2ZXM0O&X(2s&%R>YzjaSz5Av zK3(b;G2dGWPF>uY>oCCbfS_#1GhoVIjOl7GI|_v#mzar4!zc|-SXK;c91j{d*xqOq zqmM!O%f%G5!ypa1PAf#Iv|YV~dyB<7@&R-7 at K>|>+m3`)d!b?3ueuKI+>LW*of3JE zbia8IPD!^InMp5 at _+*ylZx}fH>jJ6jIFcI!6drc7+96_}iE at Z9Q72$VIX&y2Y^y=X z(u&?##)95Zh}Ty7(6 at c)ByCf)q_ z67t#wFhYZb`(Yn?I%dd#F>vcM55-v zH(>Pe7+>HHb{v?zq0S*)D{cc%`6VY6IfRamWy#aLvJoYaL&sdv!&@96M6%Fgv+`%~ z3W)Lh)nOHT|1I2;{2lmz&-{bR<5D1uD7*kG<|IizCBbP*=ZJl_l${+?K*`8^oX2|EtMg%e%;(0)Qicn4eUOv;E@#g} z9cGldW8mX{(nb0mCOBDVRGUvFz$kR*L7W%if_4cJ$Cun4k6^@o z{1s~K0MZeXhk61dBAdS8VNAWFYHAj%RG%7;))4untvE`G&mH)$(?C!kJumTR3SuCE zfSCWyX)tvJ7+Qml;9TR8L>y;{riAZ7FlC~g19!x+fT16507l)obwL% zuLsT_lr)9$y{jxCHy;EtKd}eke$J2IYf)R+Xj!2*sx7REg79OcNzT93v*|G^Fx?dR zR{)2TVoLdU{c-}vY+3A}3OrOAuL^BG1_#ckiR)N))IEg6sa)tRUcBiDDWEBroo-4w zwM!-n4d^jgv~6Xwevu-0Grd05s!}kKpn~+lEFTgEsZ1`ft^%E4+I-g(2lppR*w2w> z-*?w*FyYR-Ysj)VngktdDPpd9|Dj@=N}mYJX`4w}qtL$F;jCo|beTgi4p?vM&+ns$Px?w_hcTb!P2Ty?ZbIff}j8 z{-f~~?b;`==^POn)-LGw<_RuIxik5ar`$WLHs;#>CtY)v3w5YBX{v2mj}sokcD7EJ zqds3;3h`!$i_>jadFX`Z&+4qN1-v!IebSknd3jpea~D+5)zMK&|Lwg=S=bWU zHN|HQYbo?d&cef3LvrVp;=h+FYMdL<7IbxA0&*C&8+ch>}Sy%mVSK) z0-L3yJG2EaBE(@2Dy%PS9C at 6*78+q!ZbpGo#KY07Sr9DA81kpCysc2Xwxc+u?a06= zWDcBFad-bj=b$@^CVt8$QucOeMy}tWKC!di0YPdIYHey{Luwvn}|;`5ls5 z`b7TfB99qOUxr2O8(xt(ZXxR)@xvMq!J~#a!{Nq8{n?9~nHNSmdmo^3j#Y at C(1BR? zCzv5<*}Xa#K2ZZy&59%*Meap|RLx(TqA5}D+oBW`t`}Gl;os4yBP^DAg6HFT0zZ<7 zO&)Q-$S39UA2yG;pXH?*i`#{_&93rsYrWlyN`X at 4%-)=z_4Cn|+ zmHZ!MT9#IP4yy#3Z$-YJPc@%wZ8!B8p+}WyfVnm5N~(va3)q$_#*BDWXt1HElo^-# zPTdOu0pANlHg9_37DT`2hEml8Dwjyx$dcE-PLHL?VC`TF%hgIV?4=t__>3jr#hmD} zy#W2Svvth7OUDpEK(VMmKotL0XaBRSlj^5#*y^ZX(XO(^G5c!{#^&iqX(}nm(yntX zRndXVYQ1&1cBGVqQ3rKAw-#biV&TZS){?rpg{C(CNJ~m7DaCS|VMjP{_|F5J-a8!Pg?n1zAmh{f$D-BNws4Z@;t<6osAx2tGGr(S1g&QD1E5-0;(8FnIHdFGm?oo;jo&3G)ophKN!oA7Lv>K$8N|K8mn2S#C zp$AisuJWh#<{Y1H4ZvXA44=dh)$2tWvs`Y_`)|hlMpa|pZQi8EEKW(iR#>b>nL!&x zhUlqMlhUd&PFGCs at -yn+xTX~gW%K`I zJpxZUVJYydV{Lv(ym zW9zf-vFSxYiq2e at iIJ+Ri};cx8fs8UYeFH=cBEDNT11$;B${I*<0)np^OkDrN+>T! z66RIb=*cQllZRY;x2-?!A90SmJTJ<8RNd9~Ob75no<)4Z!kM(`jj??=M5Wo~6;Bk& zoR9d;d=6diuf7Itl;9oU=}oee at s=Lyk0`8Spg2_Uxpl`sC^tJr%YYLa{nsGO?-LsG z(;1Iv^L0&A5hG`!(p!|M3>Dzm)plH%L)Kb!O%ZXGY>MRjm~)RLaZ*ndm#GOuT7&ve z%&-}&cL8EpF$P#J=Dr`SW= zNk4xl3wW*y+TMLa+UosfVqJGJez-?xe#faTSMIn})ecPbu0}ySvg(LSCdP?$9fP0Z z)xMvF#0MkVSK^@8(_3|Exb+$s^kgsHM{`8N6O4?sHJlN&&OyHmQhYMcA!t|c>DchV zW$L(0*}f<#C|aSW7KeW(DgI4&or91ym at N4xR%ZP|5`f0S7S)%esjxT&qRN at Cpgz;r z?Lg*+w)#~eWwE#Z7||x`7UeP2C6$#(ilcI6E5r*;U69YC22r)j`30s;dQ?YlT)9X`PL zjL_Vl!&Y|=iHkeo16j5%ud)W>##e>;YphNgMlpIzt>iNlFkGx2K-}9)Z|A1P`M>Z9 zU&R)S`AZ*YG!L*;UrOst=ApqvduJ>7MU=dhl-xF6iSEizJ@= zgsB+hE&+EP1w8~+%nk3bEo)0Gp$Ry^=$7{V&>(5frzIRKn9%veo`{6iVI7I1&Fbsw z>ALv&hKo9M2Id)6)o3%%dZ=fP!Tye;0_jM^S6C-I30MHxSr7v!_x+OW}8v8;^)z)v{MV zp_z}}ull05G;Q}dmj@*G3~iys*E4T5zS*>td%vg!)Ay62_Ekfh#@&F&p;I_I)BYkT zu#LI8Yic>Iu(BvQx%6rK;d5=j$F!nP)#JL$+%Z%;3kIi#S&Z=ORrgld1cbZ$yUp)2 zWUvc;z5Z|aVoev_>La!kqqYJGJgth&p>m_Z(YTA9F&=J&IYpk2?oEE5it)ROSCIQe8Vto*qS3Y5}vcX z>x3&KzqAH8X=gT~0+YyFX1j*IQtkGE=EX}XlH4db;z=T-Z#g-LMw*N{N0)=g6?mC~c at Nc2H?|{)srciVSya{uvtIKdO%KUk{Hmz}D(N2PZmVT&_<5CFD!6 at JFe8_YP}& zPjoajdL^iklCV)Dx9<1JLR=c=H91LdR&>4}@TNa8C09yq&_6QfYrZ(0=B8_&;DOXR zTRH}PUlliC?k^Q at 4(e`hcv*2?LPedOqWE`X)l=8jV;|86p~ zHQP+pM5_J9ZdIPXS2Rjw!D}LP3w1w`RH9>dD+XCsx~FvFcmAHL!G*p-r>s)a@(GZe z`I&QM%VOqVj)0J4P%V~j at Xb`f2{9QHcbv*H#f3(bt=76NKy{pKiDtRZuq~W++~#7U zwSqgT*8KX-0-)x646=j$*Lmrs1`dpH?IXBIU9O at t?PezPw8KPrWY)_E08c$sZ^|PaLa~@60vt z&ie4Aj+uz$YVG(EFnN2-r;$4^Yg*{Cd$up&O_juhyZ5SwmK~1%?eeU&lyDK?uRD at y9f<1UMp61 zdn%s&E6y%qt8^z_dISIcHWjm*fW=y72)JT{}@_i z`8eg7FMjH!+r04Do4RlePZXWE*ddWJc^MtClJF7(GMWvg83!wCZ=<{43t7LOG`8q& zY;Zl0*`S?We9=W(%qX~3OZGsg at SbRmFduQtIq1G~XD3!-TE~nq=V(``+Irdc0$?k~ z=^WnXRi{%!qO^D3j8u2sLq=L&=xNR&e0!)xxYroCYdf<*!1~c|sGa;JkIv#RQ(1s?!@36U5|=q7kaZBO7Q?jYHTnQ?;sU~mp8MW)IcpQ#h-*C;r{Mw)aP zGnk{7v=BL5p{&LbW1u4UN~Frkc|g>HpO(#FmCtZ~b;s)MMgrCSfq>A!PgGw-DlbKE zNJE+`E?>MblZ3XIf3_?UBi0mNb~EB;5gGD0&9%m#!xKQcjrF=u&vKZ_?^nV{@8cCg zB*p=hYI%(y>k6<}#rmLQf+VRIE%yy%;|p=P>jh^o)0y*lpCI%rZ>39!UmfIih*_+9q&u`1fKz0R&hB(W^28K2`>^oGK#eaA}c z*3H9fOCkho9}Y*=h|7ETiV#D7eE7DU4(E7I!qF;6mma#{c{${6L5Ojp(CAaJGkZC7 zkZ81FpuM`i$9<;%2u*1Osn4hqHyoFKkDE^P`vr5+$?&l6Ieh-;?YV`kMgkd|GBrNX zXB-NWmJ;?ha)b4XDNZ&!kEmmIoT0p1WXE9V0ij5rD!S#Sn5F>ftW$=)rg z0>K2q3fArCUK+s>P2W+&!wyT-GW4cpX{OVxa#XAloA0}E=LXEG>@|~*P1QGKl~&6b zOHI~nvqDj^pAi1WwlxTX3~#fbz_>rJxaKFA4an}hsPyDDu| zle|!H<*)#Q^wn)R2xFaU at anhL%lgLkI|l4!PO!>buKy at hE`W0FGzLW)ebv7Y5`Aj% zd{OSWEP2c_e|6utFB$`JMOhn1d{gkkQObfPJ9xLhk7$7(3PGlvHaF$4|GOk at PwYrf zVWpayUx-NyHOoa!mP(Vgs++U8SIB!tL5&@jlgB<-eZX`}&e`21zn|)nZ at _O5VrKWO zDTK_SOpghrc~qhU zMuDy*2 at lWBz! ztC+ejK=t7yIs at pmA)okFLkall`)FL<_4G=Ipm!Xn22(7Qrhp{$O72EV1!bbVM%@6O z-XLp!Mjur=O1K|5H6?NuW&|a&Fd?_G67eySL&et at lMnNR1B@M`dWxEFIfxuxk-}NT zyqkF~tZ7m*N`TK9gG81fDX;o1Sy6Jz3JK&n>0iTvyz0K0O#OU6`>a#vo_iR_8WG40o3=x zSQfym6hK*OtsOogZRQ7*e_;(tQAr8^?-I5~&Phr6uOD5)-I!Iu@!vTNrZ=)WosPHc zu0F0_&md~_zRg5!gDOOa0&7Hs4%%zLimTwbT*}CMiSzK}@67^vyUPsL0Rcb%%!!Px z;K1u?eD8;18`+L}MnNg<7xCzvEJu&kB7SX~T7lp?Ff|oZ5)^W^SMX)!-RhO}5Fjp?)hq8Sy{)NhHOoK6M zg$cj;xV;RpWNu7mW&#p4Mcni8o3MwnQv0C{Z)-f_*s_bZN)E!$u<Gaw~j3Ry at nYLovhX|1c*Huq#bo?~Qcy!8s_EtF97_-+0N%+S7*~eAe z at Jv=u&bHjY8j~FKgo($0&17A6WLjk(mW#c0M=E|tl_QIx2%N37xy%+06IZQ9p5NdZ zk;0k5(q^0diipU0a1BqEYZ-ApYu2<#ES(ZzDW}LD#gDpTH>uf%+4NaM*le}r2{$dZ z&9z*|n*2ejuW)|Za@{LCY^6h97)}`Ly-{+=%tnd99!iu_rON}gy}W!=d!d)(6%-T} zKWcZR44t(lXl3{HAVPP at X}j7GRL#l)S-1;BEwT`v-V$R#nrha{1M`gK6QUR>&4oLMMPldRwBeo)$MjFgjm!E(o>=408J5v&Xb`9SI2UZ+a6Jmmtpr&q zqv6y8XCeH8%^-yN?-WEb!Y37KJ8~@5PpzSBkLcAWTFRVV@?H6u)ShRx2<(j-JoeR0 zN8-KUQT?^8H?)oYmhmv5XqyBT-j6>Q#RYs!t#!oMG}Y$e*KIX~@p(6m5}Ch|-Qmrq zQ(`E$T5?(N+G8+OJ(KmeF0clXG}o)mpXOL5#xjr22b*F$1nZQ;pH1Rcr1Ow{-Gjg? z3*3spfxT8OHd7ea#f-|7>z7D)T}%!;QwVY6ud&SSs&f%{{M_vwn#H)bE zU!N#Dsm_>syz5SF6S~h>hF}SyOm;^qu8uOcGx>borSETTH~@Yp2EoUE!hsJx at 8e0; zW(+V)VVa;0WsL0;!PI05)*g1J0Yd8E75*VoG2s1mvBk4o9IgcEYTXEkA1>`N^|QlN z^!s?wZuHQc9wWLkl#593hZMw3O;_MT0+E9ENZ`S^n1vL^#tCM5oIT*f)WWEq$?gu# z$}aD^!t$`+*L4#R%rZ(AfmS)u_B5R9miH3UBCnsx* ze5t!y0w zEzvNkk?jEmRh77+XW4i^rey(7{V at i@BCwoM10h%0cR#M*?8_Pt_zEvfdv(pEFXjrj zE^Bec23J)4?5zv!)AZnVr=X00 at xqLXhACL*U_msrF at Wv@fB_>e^=&uUX=zMeU28 zMTe7R471-XCt77;Ds=f`uEG*0^3n}-iWeuJ=Sy30l_kOM;q`s%3{jy(+B!(7rQN3c z at iF)E6hqt@!PX)tbH^op4Rw1btY4{|KX`mYZxp*@#;@5T=FmqQ(k>vx70WiFIbM3V z*6C|EgmX6GkzdEqqp`pePHGPjeFlG?F3;|D^FuL}=qIkCG9G;Wi{gK829mAvB_n04OOe-asr^XE5Jpl3okDh;uly at n=U**hE z&{L)87LDno;xM zURoWVQRMmOjYeb$Deg(0fXo9L=;t3=0&)uRIdXS27Sy3*5nnlsb)h7;}HqXgE+OKbz~Mz^r83FB{5DHz%EOLQtWrD|&S zkb~nw1u;2FCFaa2MJaYEOX8fttQNma at -(1bQsV3JC)7&6Q%07wy&im73N}=*Fr at 9O zG+Uz-z&Y7DD4;niE9h0;_J*GQxHGyxHNudvee8|)nvJvI{p^2V`6f6jmX^O#PmHE&{q=teEpORjtD at +R8Jpv{2jR9`Y8got6uRb+k+GkX z+98LBVQit~p{bX{Q~qp-8CPitF99STAa`ThnSaskYm-*=6R{K96I-(`=!S>s)x; z#Ibw3yP2&#(_TPgppGT(I!!(MPDG4Y?bxDc*KOHM5XIZBQEI`^-ugS09xVfJxsHBk z-2+*_DY1b(d*^AV^Eu;9sq-`3Ws8ovMW4h2Y2Mn{F)1}htXKgF^X|CVHG*bR%)oB2 zZ2*>2CfH24ap^ZJTHi z=~q_t``tYhu$-=UHJAnt?!9e4UAN(`zm)2CU%a|4CBlLRs*@ph7(RIP)+EL8nU4Ah z?LBY1y-s6XeFaN1zSWzNFudrW4y^em=tB|Aj!c34#*X?^yugQZOBK`(4>b4a0?zn- zL4Cd_jMCJIYY}SW10Fdz4)@+$N*$KSAQ|M8<^&b4VA9FCd723AYY4>?zECj_O*2w= zD4G)kU%>Q$;8l4)3rzAm7MH|16nwr$i7t6p)L+sPlG^3vqz$q_Kv>@_pqD?j zBvsb-I at k^BE5#i024}HDfCD;2X%K at B@tTNMT0 at jGgzFc05p?TdMLGoIK>H1f;26Za z3;HuXq6Po3^l>Da^fg!fE+Fj9|WaYD%3UEW1PY;xHG at c1U=8e!+#icJjq1E at 5IIQ37_qi<~fZI9boy6MYZ~Jk8RP at Y`R?Jc}n}_*{+ZmJj3p} zjhzuDHi;6nLH0lUBKO7=Ax=PZ&U23}nkAdfc6N<=SoMfx1SfF6a=@% z(&BCLxnZp5oRd$@erCRV%6YP(hY;XWk;?M#X^=66S&Mp77V!{@nXlz6F0X_K8n}|Ay2qC)8R*|w2um3k867zn zEcK&QxzkmMLR2XkhcrjDi@~S?&m3P#qK&H5vEFN=QoF_SP`K5 zN^}ZV0$Act3*13gt^Gn at Hb!jcI}VMsD~e*d+8h$y($N-J^xbrkI+QCC9YEEkPxH2b zQ(ITZ`Wmv5-Ec{CKIsT!XxOHf!AsD72Jb4mZ+!#ZLoUmaV{Z9l8caMoPDigyS{Ous z7bxWno!bB1M%Lm6CVe0P0NhXk0F?e`8~KmBnaVCsriQkbcIJOOK>pj=|7=TT?V_WK z`h7cXqStAOH_yU`oJCeEXD(H)VpA%s#4Nli7il>Y0 at q@YnYleJ!|ZII0j_{Tp`@a6 zKOkJHK}zuexJZ=SCQuE;N5Kc6EB*7T@$LAgb*M%6Wxn&Vot z&)Ati0W8BeqmXa-sEOwn*9o5K9WgP);}g<3$NUBa-?tti?iey*%=3vvk7N31N~Ui) ze3Wq-N}l19de%F-oh)OP;gdVTp5c=`(XQjM8EP->KsJSpEG0O&cmN!!jYP;=9Xbdu zEu|r2pSZsQYP7M13aO+LM4n1no&3JOk*?ZY3J3}3?=pk;F4E$dWrsIgH7UWFuL5Np zX%c6)8P=*o)K0EA{@*F3^IK(!gsHzH;s8gh& zBH>`dQF>bDXXgroabYGFCMy4R~eM16jf3*WRD4k zX2lpHmg*DKt+s?@Gf at KaqS85B)Y7%qN8eqRmguaN{Hw)QUt`c}Q%H>F*F>GH48ja$ zRY)vrj1G#(1LQCSMt z@^~ecXOtx^30yZGHze;j7ZJH)M`;7zqlOrDiidtpoG*$kWm&Z`w1;*{oGs*tV3eqeq($F78-7k!&%&QZMlHP_27$d35>^4HJPo#5GN}`wo9#XJHqTyF zU_YcsWWU68k`EX%&T-&hOw6>LsOb) zr!JP74G8te3ezf)?ahih?_*+&Ic^7=nR&Dd8S}_PSBziyEHU{3Y&WG5d9C3PThj{PKC1E8%LK*% z9l9Uk!O!N=IUOAkJ9WENuMU% zs43WNh&vzwY})|f7BO&p zuY=ABnOWofO`#Kq$#Gq70RO6`!=4*-q{*VP&m;KmL%t8^k{4hucjmMRRsx|+=*)aR zLh?DDi0x at 8+#YAQ*)ZD>$mzCt>fmru+!%b7Vz}}Z7X39~0J;l>bu`fLe4oIJI_{Wd zeR#lfTu>fF`jGkLkA5|3C-UQb3RCBQVlq`R;#!52a50Wo#Y!1Vy}>wM1`K%C+SuUG)DPy%Pf?fr-&%F;?qUI}j|qpq%0cPo_H zAu{kMjxX*R at + za>4@(*SR-l9^=z0Sbjr4*=RGGi!sI>I=ST6;=DKPM1u-5cv13DDfo&?vq*-h;1DE~ zbSaf+mh8US^(Z(9L+deCzwT;3J;Hr7h))^VJw_dB|FcvDpid_2y)?)t6JVbb at GF;; z5m;He2<$%UYJWY_JtvS~E!e%ABB|C}t`X3cIdy>geQP_2Uv9u2!9Ke+fIq?q=)J7O zJQlDyjKSTe!9GhV97tJDRmpeML#7-@?Wtgego7Dw+!ezRjbo?Uh(ne|^l-H?_t$1+9I^1U((~CRHH?Qd}en?~! zTzR&{ge*LNV|-ph*knXu(~82;=2BPP at gK`+$ugczYuJ{BQS$Q z;+I#dhLMbN;cN5k at 6mYu<4J9l1Al}c`I_Or3bvmvDPw`PbtVb)FEimIGvcWnoj^5R z9s2O9*X5l at bks@`|UI&=>90+YjY&SMw_v${Hb^S=I#=%!TOyBd6Q z5(hEIXw=!R%dt+ieVdV5uvxoe(aug$O_r|0s at Y?<#O;t0cQST6W~d5m at XieA=dD_~ z1^vEML&FmYK9iH1tarzb&CPp5LVxgGYCEd-wDN`t!XNa%W1TzlFi+&aurSA8c!%qM ziFN)R)1+uCFDW35{glIkNTFzJU3A(iQ25MBzG?O#<_j9?XMnfh;X=sXqX} zR?%De-UGiD;=JUD7>Frhj9$3Ro#yQ9+5NdbUAx2Q2b4Lm1d`2=APAfw!{{I$PC;-F z%|J5}i`W1;b&wzNMSY?|Q=wsMsXdHNYe>^$oB+AKvm)`M`i6TpGUxO+`Kc%nUVf-+X zNYUFL83L(l&Ml6bU&sqJc+bQn&~Ue2XSm>&`SF;s3LUB at Odb|zfgl`wKh<%l3jVt` zI$#4$xOiR1_b$2%Yw<;m{t$gj+Z2QB$mN~r)bV9MAgEN5+9_O!>+@#M?qbcFxI;XE z#NU0GHvg`C1lQySeiUL{dCfS?Yoo z`#bD4G$o at Bab^K3Mu1SQZ!QZh!ys(SqLjWe#f( zILao1-Bbi6Ofp)zZtf-8u;dceY*H?MAyt0Ca9^?FFb^d1^8nAz&tT=VJi2#E0}wNr z at 8|+ePX(f+o at xvK-(4+)FGHUX3;^Kaf0SqaTk6Tk#PQ!UQvd$`|4>qDk`5 at QDBs@` zGF-eD`w)cJCPoo5WRnRI2&Rn8gyX}8vg?TFB)KKBW!%rxAjA|_GM#Bq9V(D?;P7dx zY0`-SDJP=xXe5ax30H-go{#AA3J-dGvLE{6=;6ofCLxucqJwG=qymP*&@1Ixk z^|W{&mBIsvpkp9FU$H<%x=6AjJF!TKRG2I at b|s)v>=|j9dn5=krB^RbmaX0}f!R!D zrZ)5 at T`=X!cUUDRcB8ke;4hbPl%Db!(=XYaf!Xb-IW_~GM;6A)Pinkt_8dT3n at up~ zt_pJ}FjXZ?J8oyvJ+Ec$J+)QaSUWr|RdcA~gIb+LXe6c^$-!d^8B1{M~g`(nKtT6q8fLxHiH7+P8g zDh0<9f{w9rj9ZQu7Z_rYv+zV9g2G#JL at Gn!p;^53O(@<+^xGs#x}7}6?dIN%bBE=b zN|>+zI;g8D0BydV?h;hfMDrEnGoA`b9X44$>(C1RwUSN|H58Y-_9QlXKGXFkCr!JO zDaA6^NGfGfz79_r`1;!(%W1kMlRZ3E$0$CP`Gcld{MUdJ%*jp5NuI2v at BnfgA4vm+ z8-*&rG~sM6;qJlnc({tmVs36`Te0mHdwKE}C>8UX^@GhgT^0MVT?_wK?4-g#^r8^j z8I2U-j^i`pTf)0AjLB0~|rRLPv at RQsW~E=f-!!R3Ht} z?seA2v<^g63n9`~#nl*!TcIFsRncIV8 at QKEteS(781~!a%EQ(n7Y!}VU4}phr6SjX z*T86sc#*i+VjjF&D7_#ySM$`5e%N7b#W>mHy8$LSKu`UgG)v3J-jnC@%$Jac2)vaA zAqdvPF16<*-7NfSXfG>zb^HNFe%f{T>Z-}Eb91(*Rvgv9jQ at l zMsZpU`PvGwv@`oy at Ym#W2IOpp`20NL4Zy`u=uloQeQ|I(qUG2H6i+kea$x2;*=Yt# zO*Eu1GGhI#fViV85z&`RE=fb*DpM>Iuex~1MoEa~*&Fi{$hKuI2xv%E9PZo)RR=*1 zYzH+5i$S6tGUoMAZ6c;K`#+~Du%c`5Fm=&WlA!dFo=CIkBj1yp^qc0>LwqHN(<^#Q zrqfeAlah-1XHrSFZ9J0-G<}-1P*X6Y*+fwG$;wRE&ozrWWX4IQXmvBh2 zvrb7j_F2#;(q!J!V}A9L6x+3SWx~CzEE~^*S1R;`AWPJV$xj)jz%Qj0=FyX|H$Q?G at a}&Z)MS?douA z>ao7C%Jp`vwl-$Y2SF1H$dCHqY(`f;qIfR&L;m*@>c~g{dJPZ&Kpyy?O6>d(C)9s5 zIQ>_4^xLd?Cd+jzOT*r_rzJK^WW0 at vh@wa&i1Kgjs2i%!BlufE0Sd||;5Ws?wHa#d zap4m~y8Z0itUDdQpWhdp0sNYeieqIMsm>pV5phs$yf)rz4-2N{d^56%=~{Jf_B*}< zH!>Ju1_h}Mz3E!iw1HM39EJwKAxi3);|C24>Q*mC51D(uAt!n2Y^T&X&zwlol;}b) zeX2}8g1FTJ-m>Cyc#xq>1*!)cX|h3{v*e6~Q3dhgsmR=2((^KA$p`oFM7hDr)g_G( z7ugmla}rh_qMrOp3R2CNac3gs$C{Q+l3!)RTYHtZt((#7r)0<1 at h)aW3+bIff;O3gW5(eR51ZJa`gkelGKpSuuW%9T|4?^dBq?mxYO6P_PD(E6M)2YEL0Ul){ON zN}qIj&QzKhUoSSORQlrKusl9jWL`lu$gD%{;MOc+5TeVBTmJeD>3sgo9d3{tOYgvk z>So}<_7hgy7yu4s|vfQK$MYxe-Q&9&?QI;2M1a0M#O at I$YO zVYyA=d#5n{N&gx)IW=p}5$?c`chK>GF0SCju}J`1nGVyi-RAd?kwXNTGXM#K7? zrY%+|7fSh7vDsy0j7B0e8n^)QCOc|6Z2iV{Fugv}i$WD);XT~yD|=pG)%4-!I6`c7 zf6)h*JhMp?C`U#ruLC25C|%Z^!Z+^O~je&V#(1llU>@05U-?tnUpP$ zUqut^A)YbR#Io>ev-qUIH&cQpyqjvwh~$zbSE7<-SxBmcJDAZx3B#O&J7ZJcpdl_;O{#xzR`Pt1P%b8i4Fk3 z^MB75h3#z}?42!LO#cRD|Dz33nzlOj8tT{&aV*{FQbtFrEhxkKK9RJ+#xQ9cK?#9O zY_NUA{(4<91S1$G5FSuLHQZG%nkU|%lRO{j`JF>i3BFz%S&sfhry%&}n z%*$*t(O1>br!RFJ3kTDBnB6KhGU?T(9{aW`rb<`@f*EZ!%~?{_aNn% z-Mnl09NXo74^>7M&m3LS1clv})p<2)-54t}(xPp)gehoJL4V3xM05co_p!V3_RlAR zj&Zx>_QW?#J-a-~8Gf9~YB6yTqov(g>7Hs??5ZCbXazc(^;t^)hGHmEa|_}!)|Os8 z(FveK{hs9vP)6;l2+M++k5^tQW4Si!lk}E789!Jy35bjSl(n)*W^K5M(rhU?YX#t~ z=WL#$N3UKa#V?SK?CTcRtWcjqN?WST)E?m;u_?8nH5IKk=o>jK)8n}ua(4RqCSe at 7Am|l4kpg`}TCJg9-Edf=n>X~JoD=+#d z>{;j2z3c4IKgomcJ3QsD!Lujbw|Ujo;@0c(pF!@D1BGJl0qn*~Y3%{M>a^*~CN6Aj zz3?#;Qcv{!Mk!RkmbBUI-=^M-VfvV_tbEM#(R{$+4(t7hK6d*UO<-~dEg6cybNgLj zj~Ofsp?8=Z;pVV9{i49l6c`?GPhfS2SsB=1dO{2R=&!JQPBn-sVMb>fz=s(ZmKV1)G4byd_) zkUhmT$`|~^E`Iyp8Xg+*=eqib{Q^SxlcGt9aj at rvI-TX#eLr)3i~i5gFGA`9ACb$& z{Yq9fjF&fKbU0_u+=G3>7>6uE5zbcfha`pW&QyDbvhU?OWRkzb(0ZFCjIxgMO}Coy z^cPQ}lj_wULN^v`UtR3>cjSp1ru z>7HJlmbNp~Gcy48W>dby*9NGTX~tTrmg-;y^+-#SZ1JpIJ1foo*rs%AQp3XzCYwDHXp?$QS_-LDM zYl7OKZL4*l%^ioYzIZ?!ys%&@b>;c)o9CKKVaM|*!7}JZVLiHV0d6 zd^xzCr7jTt_k`_1sFGRum*dlr>*{n7KjCwG`tWsVJ7nJ-dHI%Z+pO zq3)P{k}^-*Xo;00>X^-0?ChW3UUn2hm3^r<)_2IAk~+h=)b{XNYvk{k^(DrX|*<%{v9Q$Hm>EF2%){ zr<5Z-i$pV*ib2=2DS`?HVve+iU zm#Ktwpd=_Lh$s$`B2*kVLr58i*_v=U2p#v+9S)$7Du6`%0DeOF0jGbVAxV&^(s=TI zxc!;Q-q7^_c{7DFfS1GLOp(D at XHuXuz~%;{@-$IoR$!ke$dD)dCU67hCsM(41q(cb z2{zzJgUi<2=O#vs&FSK4Q5y3dlp+yUkMU-T!SGn`6)x}&IU!pb9*p-k;z`sjfj7Je zyXtzN6{_{>Mrg$ovUy(*TlJUVs;`BX{urb8i1q z%z+Zzf$1?9JRW<(PkF-gKr;X_vq5Cqp`YDaXTn@~F_kWU8=~ZT3TJi<^y{+?a+E at l z1Km3hMyMBCW-!pEvkF9;*?HTSN)G~>y2EBbB(H%pdAlDK`mAw)RJWvP%ew?_*XpAe zCfgWMlu2p89dZrrAiJ*?J6y at 5j{nnJyR6Eq(kG^j7)J&DDzEcqamltfn6noeYb~I9 zZWRowp+jT}(hCT)`?OU#riN+JNao1C*AJqKolo#1;WhVE at hyng^$!as=TLJiv3-sy zbYy8!0$k0JjuZGBjq`Os>KYv10c=KOfOQ z1-l%>iy!`Om@!cOR5B#BViQ z`7t1&0Gi-_al{-s13*GTu?&pX*9HUwNQRNHr5!0Qj+;q!ibz|foZXy!6)y_uck`F_uX0#LV7rg~7v zsUCJjAQSC|8T;`-+rJpI?kY|!aDR0GyQ>}2ZPOOJPi%LIp5XD{jz}WjJsk0E(-*%) zO at 4@U>kosA_$UlhB9 at Et5VYYZEd(n&fN3I{o8IOqjb@?4LFKOkmy6&xYr;{P@# zO6K#C!r-Tk$$vO%e$6 at OqdI&d>LoagCh8?QoFeKaI;McCV z#-cKM at MBJ0WvF-dKQ<_#G!@OYP4B4bXCdd{}JbZ!RYMU at p>TmXb^#+9YEV{gTg z%%;uknDzyn%cn>rnP< zDNYP&i+G}=yDQoBBG5x>Xj+j&U0ey+Oeq+#jfQz6E22b+ER~C^_>X~dpY03zG#MPY zZM9`UmF!UrHX+J+6&hv zX_uw0e6oXwQL$22eY}rh98%dygB$$%L`zLuSHwz^!qsWs0-X(IHIYVZ2XdO+)+Ks! ztY`+w>()6<1F at kvimEuG+o4`~nAB$L2Bs?v8rW78L(Ick*#P~A!4 at R5QRGQoB<)D^ zYM_MDvUW5<)Z^M^O#^psjI>0ZgS;P+(QkH0wRTVA(Uu~!r(q86Z6tbHvZ@*ZqWCsS(wRbPfrSO|w!aVPPIkvznc#O~&^PKMpIniJ8QLP7$nA zk7RDa&F!we7^R2J#3^^O>>jl-ZmY~lBDK3{?MfFB(K;_49(b>Op+$!c5EU#dvGM|9 z;UUY4mh$lYD`?;vZMoXthfeO at dr>9Kl3KUAYt3$-Rjc5YS}0nI3rI zs%faW6T+Z3q^QV-SInMOzm8S`jnZ)R2#rd^Sd;rO>BI{9O{Xh8^zU+_+;7J#JxXAOd)vcWTy8IbSpsd`Q zB`G!&*Rk94k>8mzo#5)V-REAfIqKr-EkF7ITRo6M6o=&jw|4pL?}vZrh{MNxW%M)J zFMrJpJUfH}Zr`tn%g25N%|m#Q#_eOexBe8<^RqUf_A}pq at mTD~zZVDIy6*_Qx+e$r zzBdQ{xJL)RIcJy;@4I}>4(vO^2m6lnpOEPb^grU~`nKMu^yIT`u(ALfG*Hyhkx4S8 z?C@}AYnYInwDD%LB)`a2E3z&HgR?XRTMc5=-o>=nGQ(C1xoB?A$8UY>If7? zdNmO4Zv%R0DNMCSMan04m1SqiSF<$Wr$GdV88(RWM|^npdhjgw=+h-~s_kfyT>He@ z%!>?@7G7EZ9RJf|u)5S>^;jOIZr#10z{H0kKL(#wNwy-=$Vp|tv9UA at W+^CW+a|ZH ztDzvCRSKD^B4iq#T|QxEdoDVn&vV9F|ig?20ID)27 at YmHN#g^bNPG*ip z1C36#ByYbQElOCu{LOCuRxjVG34NFg{H?d|=YXpH>s#uQLpzCR at B=Wm?A{jMZR=Sq zH=#m~=9!@hBKbzLFjPzyaorX}8vQ=b&+<|-4m?#*d$+tc*}*$kN$%}1>lKnsUe#!j z<$AY1?pinnSqF8$%YG1D*qzF2>CNCe>)*&<_|DvgsL8U_5clwZtkUMpi&0jTYytQ* zwO?rxyQj~1;xrN~TJ!9=D>VntN(-ASAXxJP at v0tkgYN)U%nta2Da%tYo=_ApO{q<> zsWdIE76Pj|l#c)mfX at oWgr*;fR>n&=Bybn9#IT5;37$JOWngnB4dsuR`epRQWP#UW z`g7BUa>LG!tU{-XPC~abPCRIC%?|AXQ=&gR)(VzJc8(9>7K^4~qZQTJ?e&jBoipkn zE>BGrS%U^4r`RTMGNN!hLVinH2*LG7G;pvmT^=Uo6xbeAq%_x<(ESG7oMjWH{x;2}72vT- zVbp`*7;{P%`600_e+USFi2JM&p*f;^2tsR`9W*qYZp!G5;+R^G(7XtS~)SMAH(j75#yF8L?;O35<=Jhb;wEZl-hu ze@%VyQ`O~o1?IpSV{pwY!~wujblPv8baxIw3Ie!PeU&wD3?> zdzuA#zMs*yY)@?DeyogMJEKcGbz8t>pzEbcTE&auE&#jL{7I|ME=en>xm-l2*=`ff zsrdjfHpj|u2DDopKeT8(MZ%moDjJN`usFw44zqm`I{s+`qE=76ldBw at E1YyyG4`bT zkRud$?Z`uXr!O^1drjkW9<+2JPff0%E4ZRPN%^};PYy3)W}cQTEZoCJ+JQvGt=s`< zr#-##&TJJB`_p)Tg>4F*Qnir`C-W=$4)98^2~L_G4TevsJ3KGXdacj{jgIPh4-5V4 zqFVQbDj`#I1^RIE=zUI>9IRkh{JH5b;)W`mnkv}s{PYfu8#|w81!8t`mOm!-_=pI+ z=m at yG4Acq?Oco0FpVS(Y#l_Y2R zc=WKqKz+f!$(a|ts=8IFwlO1~KDgA%!iSvWvJgiw7(7-1th0<={u^?PJAqXUpyRWC6u_abwg*+D=YsT2+E3aPK|;}!L} zwJ$(}Fuy1kQL%Bj!d@)B^f<^N+_4H;dg-ag&2xsggK>+~R{uhhzAF|5-*78kRs$CbY zk|2VJAZpz%u at s`hKn4OovE)z~GI8vJYeRSOHfyIA|7QYRMkIpdUwgh~(pgYre9T|u zcAe#UpWbGEJv?2p1DMuao{!1Ef!$uUptztIPTER}HDlpfWGp3ymKy4X$2En4!osuC zFa->(|M5kvTk}MTj4(V8jUc*>fSp5B{LB%rgTQ?E+<_FLcf;oHCd2 at v2LGgOzub1O zvBL4{ZJtc1^JHXfunn75o_jeohZzd(OB~@HtOKu)G%q-OGb-Pxh;&F_yNu#&@brxj z&)X)SaJlvx?pA0F4m$w}R7OV&jqPvOQL^|d^{l?wYD9l6sVY|>5%d%vwxtMr6kXJ+ zlvtPLx(RnPA~Gf^n-AQ8tdiZ*<;I>r_15l|^g8o-xU~sU4m~t|)J7P*S}DNXG at 42d z&+B+raaIZlM5MvQ7)}U;l(EuayN5Uet212hH)bhTi6TMAjS at 1>cR{Yq{!wm zTt9caT|)1WaH?gPcApw)@Q|F)qKy)^8+(2Pv7i62rq at 2#a at E`jz2^J_kDXvWAyeBy zC at yK334zIK~OhfI5VQTMV`P9UmBz^=eT!7K1% z`5wE^rTeHDrB at iv&|l#RW0n?|z$8t6{uboIcZFB at l6=@vcxh^ysD{j$5 at CqOj+$OI zhG7RtmGpJ4rqK6L5?%U7p#BZB2Y-%|naYw9s~A+m!sTMOq$5iLhe1ApvnGeAOP@>Z zwu?$aIWlctmyn=AB9pX8k54_Fu&14|^d5ME1><(#ZqXoAuIT-T=b at m`A)*dAWwe^?| zC#RJlLhV<^M26y=0iT~eGv_f96w?w5BTUepvM*UfOUJY``J>Bw!?F1-wbJC0EI6}x zO_QZnTBMF~*jc0-muk~xa>@8kv!!MuUVS}m^_ at B&3L*){*^)WiqczJ+0<{)zx4Se= zC7uT>{!P5yXVJG(S(jsYVZHL0c57pyO;$Tjbob6Sq{Pu)ePhX}+$`1DeTAV$iP_1g zBtA=Lby{|cfzvPipsl5O*4Bqm(Uf9{dCMa_M+(xEC>!PG4pYUG!7i0{s)jpB653hl zxutAQqcg4}%4)B1mqawvW}J at c1G>0ruTeL{u*?wA7Gk{?!Qc`~oZgtvDevWLtxo at I z!k_8EH)4%_2>Lh;q_8ZiYz_G?Y3a(PfEYBgeTh}$}J!)V at smEjq zM_Uw~UuK62t&t=cZtVFtMaB78RMZwm;)BizRTGSFA7b03?+_v?VGOiA>dm={MYTPE zfpC63- zZ*v3WYT8@}@qR)}l%G8P>gWs-#ahlo2w|bQD20vc+bu{vA|za#9zmzUU)bG0}qckkuhWp8H|Kx at _Y!1pXWv#nF2pYLNj^Xax9FWpUz1{d(asI6Krow+?TpL zZi1QO(^``~lA2{{1xCAOL1zxrsE)6n zn6)lHvvkK5;svi#JZelfm?+nn7xP=sxFc;z*0xw}b74~ZGER^?iC|~jR3hB@ z<1!G7U8NbL{a`{O+z^Pfx&Uj-O7rYm4kErXjm7RGJkLq$qD)WM1j7o+m$pgv{4!6D z^W({DL8ZEtiLrBNdw<83s!0KU=DPBv`%h(ACMfNOl&>B;KMClY-3ApSh&EzExSbkp zSYw;YGQH{)+6)6i9LtnTo8HOkY_D3yw|@Q=!-9tcT!OY4g;kXS$CDac>v2EM7?R1 z-6DT&%#_-41Gt(}S-KNym*`zctaKO^20u at KVL^g7EDxNRFsgMmBw_X5TA52LP5N{D z25%u)C%DbgoG6n9&n1e8Q1P_~aNUrYrZdt0$zK;=$;;|2D~|qp9eOhrK+AUw{P?-_ z1JYvhrJ(%5_5qcGTAO)kz6Zv&$}Lm7pEA_JhS;5bZ1SH(ksO~+_FK7f4v85ej2 zh!$+10v4)foFRMVl`;hu at IjobVtS~sA+hNlUMr9k`wVOHq>W>`OT}3{((}fC%a4S* znphpceTqae)`R(uuvBc+dNe%NmkR-c2oQf?XlP=7DCdAOi&F;oPJ8;AQWo1U+2s^6 z*#vm!MM>G{p()7~%7dfTRsRENK_;*)bXP0~qLGlm5q1g&{9V>NyzF0ocF$OeC=URi znKAFk><_4wS<~5z4U8FKhF?zh%&BPi!k~c=ygnwKUAS)`e?M8Zxb&7|f1=ZFkpFhv z%|A}oKc?WtZ_BO!C2aaDk4Tp-*Z4~d+?g7ZO_0sfO)#_>TdAl#0exVydSgN=N=e)a z_xl#KE3+kr=TF{+#)LVj69p7XzNgz~?qNQ@?yrvzupQp!3XPt05D0oam0COF{-NS1 zvH%=RT2<#vN>U at Or;#(eiFuVmHa$if7rICb>q+`gODYH at Nv9EotyNyr+O|=3!L}|H zqu8hrp`05-nQSe7D0i>1rio?c5>qiI)0K;m(Upk!@8Ln>^A7nPNb=%aF7XQ`Kl at h) zCbKqQF%{(qNd{$$DVNpaK6j*#V=>t~l|i}@&vR~_t_F2P_1p$r2)j&$g8HTdR0F=x z=W!&z+HRh at JURW$yX90Cix!p78dp)`U6UdW#z~_nmpsp|{1Dr53Eb_9fUwu?5Thn& z##}nah&Oyas?7;DCuV{Dam-xR&ReIS`&lE1?isLC$a~^r0#Lu1YG6RKuYqj!=E`YX z&p(>#W|DGu=(&ki!`BpZ-JL|JrA|-02^|_6SnWZMx at rO%*C0C24IVBW+ie3ggrF9B;x2+SlOZY~0ptXg2tCX~$my17k{~Zeg zCWc`5f8pTIE9(Ebi1N2&b&{<*jwtHz7s?#XYPEn=8LNhrupf`YoQkdOJOtEt^vDIa zpXdv1t2Co?CgfLkjXtRSem^Sc=kR&Ox8L)4wpKT3C}WYQZx1FWvf7_NuO_m%6S}`% zf6D`L+G8oVQ1A0xjkd%<2)&66K|>2^MH#_~5+wz0mN4NP=?;POp|sTpPLtYm9OY8FtvDzL}M%E>_Vtt$m+tWm;Z1 zinhWsx}xrv>#xN^AIJV-dY-wQ;gLLm&fWmGXlJ5c-fUc!ejiKLmSi5gj#tv-uBLNopla0)t9YlgkH>C9+{zYc9JPksPr;d-uHzD at ZwcA$ZAD6NFjxoMFlEoJ z$*16}&>*{5X|9e_t~%R&eNtR}EPqU?mBZUVDEK{itcN0div^(8W3%bNKhGiJwQAAS zYKvocgwBKP*DTvUZ|5{VYb~n0&$?!Q8&v!YFCgQ9^wke at FCc)K=aWB0hjHR~0JgJ* zt_`=p>MPqdhw(jm4q65rL(zb#Mb8VRwU0ZwI0ZItbCmtuTa!kwx4orwN7{>Yx6EJn zg7O7>TjE8nm)WaCKvdPgI5!vvdQL+v*H~XjS5P=I*dK&PeMTf=_l%)LoYgh832l9e zHjh>d{nvnz3=(O90eA}9cZL#!ZxOKf!n%gRVZu)ZXMWX+K{_7RP)f96(q9StdK-PG zVCxupZoA~x)wP2;rTodQn)I0PyxfLdy>JNhiNM_sTs|L&*ZeSb-i&QGF7u~#(q%3l zcww?!etP_P-mfi!s!fl2hbXSjo)r%?ZVfu$XLmb~551Tc)lah7wz-E;su5|YRkYu5 z%FgP<&f79K-1ZWBa-ZdFDh<4w1$p zrCWD2-%yDr_n^IF!sedbpBaSs3Dfnw;Dmx=@{zquEq;dYQ61@`>c#>c($c19dqy$q zibUt5gXhLev{L3(EdQcHNP2}+!YB||O#4UXMc$pqzt=h#9gIUS^%f}2irA=X>WD-`Oxiz>|IND`Ha06)U8LrB^{eI{Y>54ZkAM+QvG?tDKlgyH((>@Ee zq#92!wXU-%$};9GIxpwcQjsEU`ab&rn9>M6h9l8e*-xdz^ytVkX>UZeS6yL4Kx_m`QArQ)RKnT^!(jg_0=#c_nPUTf6=D at k@buJ%}2gxmy916%wtc&sN-iqs&@IS4FXzyia8za?!Awc2Xn(PZAlj#x!-0b&(QRr42I#{p_J)mRej z?i7`J%F=^2;w?>93`6 at o=OnQZ4VP}nEySC$!cVyGg7!0s}U&8rs;UkTG4QOu)`Af1|(K&qar^auA zqWCYT%4uXL%xQcjAxz$a`eP4h-n8?Wy0Mml at l0^@6-;nSLPONAEC|1u at Cx>kbw6S} znENz9EM=!~4&BC2ZSRP83-%5d0K*F{$Lx+`2AfSt3>AqBfMNq|x0XohjYt_|#Zl@? zxAJ~J7P2C z1%VIKIrMW+8Kny-ccbojx8mPWtUSd-1c6sbk=#Kl2w-_l5ZsDOy;w1w3*=oVYbO+# zyaHldoG+4!njZH^iYM`}@|5R9FVv8~7(1dVK!Qv at ibl|kN_4j at J<)R5yXc{o0B`-FpE+5vu+SMpKuCnDrC!v^4vGgkx$Ohw7~hRb z4~~wT+Nu2aoU(3a&v8+AB6Gu+>@RX(jPNQJl=!FI{g at -IR|c||-W<3QbPfUPoYbV5*N%I9u1H6E6(2?3ymwAPwJlw3htl4RO|nT zV-W?||8O!j`S*OAyoy81ePQApa;@40-|T4cutsbeSsi%)KJ`{0(sf6M=@x zpeTmVZ<|JA*cONtyjQF;XTx})e%3 at r+ulZsSq@h=V2J%n%(v?!F=8(a!DDl$vGzsI z at PmuVFm<*4;!LE`wK{So+Stb>G2PB8T9yVdu(Oned}}w7AcEMw3h8{%)MOXZSHLzm zc79X1Z~Gn==57GrbS7D3MKCkuQw~hhr1f@^3KvY|u!`n~RMl2r+ffXqnU#0J4`Va2 zb_zcTA7qsQFKkyN7CBZYw=ZxZjbruNz_~Q_3g)ILGCD|eq%&b$8weJha1A-cU_E_b z__Vb;{d$TOVC;kjoJG}t^B$34kVPl{?P+vY9I1Ckd=nkl_5vs(3+vXcK}xx zP*)jUz at L$F1ymf${0RAXJoKgQqJseg0r7$Ux8sukCp`Qk(VDO=ha!kN)V)flYY~x1 zrAjH~M@)-h7s)vELQW~tD5)$%DEna7hPM`UDZ|`eu~YE^v~`9ihVs`KvFuef(Wux5 zBe$uE>}&SzG~WBm_v0F%D+7`M7IeHsrrO%XUbqeC+Kb!^gTY>^{<-=6JZMq3^Y6$m zRj;FVxN!Rx^mG0Qn2vCiL0j+u%op&=ny~ctr`2`4BdAN;irA~nsRQN>a_W`%_EQYy_ z2ra2-*eLd`up*3CDL#|bxV=evdg{fsFNp%wG5snwI=OU=Vc}iT{Pox)nvY)xNvxPm zo>WWOE4NXvj}aT2daE-Em-F_|+L7{|5i3Ry zQ;`ZCjI)wqQAAP?v)t9nZLm@%Wh9*tS6rtaCxt39*4rE- at V&qoRt#yk+U$ z7 at Qh*;u^&$;yx_^fldHe78vxI2X(LEU3f7AO4K1b#(T=`!mIns>m6!`&d$@`!39cG z$H}2H5DvlJ9)n$X!^l3E7>}tIUienAF#m$l;Zbfsme2Do$wcE)Op1>m8_vX$5S)>5 zu^L{)iz0qxg1j&Rt{~B{wV=MlgmWpGTWZvV9^I14(xDyaB#yueZ)lF3V{VN7 at pl<< z)#T{930El7+~GOg*m1b?GY2!DT<5K0N*8x(I7ADJl!nm;vo9tH`nMeJxWYiEjLF?-yFk|{aTTWPMB2-OpEVkR)7bd+_CA?L z280l0)-7S&_XGc7)c(X3=ej}rV_!LGcez!&Y4NW^q0V=DcY0}Jv}U+zd1?qb*&QWi z29*gkM5>u{!?aYUJnw at OqGEU8C7rME4fFIv``{t8GwfV&h>XIGd`^3Z4xEZoV00|? zGqTM7*D&+(DL=0u-^?^L+QnM3!`r)oz-aMi<5QS$^ChjT7$yGg5C4sjfG*>%q&ZK2 zFc at lZbXpyf7t1^e>uL#WwSzgD9R5-BNpuvxR1^%eJyxCUP&bNSn)h8K+cjL|6dzjl z0FGmZ&Qjd!6$dr6|9+^}f51!T$G;NSf5MldtTc`y zDlh$g+NnxOQ`4-^_XxW9pLp%m8sQY7P>QkPghdf4CKAQpnPahF_6SC#PQEMzdzC2m z5KdyKI1RN)=XPLOA)l7H zXwIidy@)o62W5HW?gU&Q>;V{{z5Mq%?o@%kx{2L+E4GQ(?NZ|vD%iDvlVx0|luZkl zadKQiVbdD(6Z6MKPE*C%9r%XK6ZC2^$_=E0o-^q0Dx3{>lVCuKgUWk`I)R~7Fm5=3 zdG&1L=&c&TvzCZ=%2)zn-)L4AC{fl5TE%=zUSaYze}~Pns*-Xz)7_fnJkahn-~KFD zO-I6^Oa3M{rds<|u;CP7EpXr5jbTRi3w~u_a;O!m3Y)t1f$8{>_kD?PF`b=4wi_?! z3>xqh)CX=HQ#abuw_>DYY{Oj5{KPb8re^Xd;BHADcV$Va(l_x`(y>lhu^RH3f6egD zR?G-`qvX{nesW?R{$eCgW;P8${}LbmylSr2Ud`Q6_!w1Lu%j46L`I23AVD at q_v(qo#Glx-X^Wpb z(}H~Yc_R?H+kK;nBCCQNb<*IQ2)OFp%aO4OueJhJr&Oy4E0XE*hyI-6K8(U4X|~rat~8h)>(x`xTu!$T&~rNR&J!+Daw^)p;PYZj&7I$eU%5odigA2vpnMyUURy37+Us}v#UKws*bz6!*aF8t?#b8f* zO%zavTJ5Gapg?^ z*!?2tTRg4@=n1~`Fyyg zxmZ=#h0?|?u$x?BlKfo&(?AIDjD`^b1 at iU~VXz6fhCsMoPbvOSRdRlk$2bM({`jQg zV;GYeL3|`J$SgIR%zQ{D=yE3^$;_ at 6d<0Y2YQqcOe{{??PLD_#r~_H z(Uhg+wUq{Re#!o3DZE)bbib#TuHKDHTExj8u}M2laZLHKNQ0#BIHMKa^Bk~Fj&cXlUn$vGCQXu;< zn-q9ju>(D}TM{%<&eDIQL%>*WN0j&mx#sHAZ*>>B(%mmX8<@01ZfQCG77l#{U9-8cU6y0qf6cGDed7T&t76q;jE zCzv7vi$WWb!tp{SwsGNmIA3X3dfZw~IWrgp+D7XiNI)-eIaqxBy!seXLz$K^Xt!mJ zjyK$n>xL^44i>`6f<6#a8obc`685M_x{ji?U$S#<2hKSCNgd+NRJksD{R10Kd#@f2e60AiP9ar z3I9cep&>EU?(Ri24QW#(mpP$=@sW?k_vFB=+`;UadB{2bq_898kl)j0Ss?<&{IR*; zF>$HchkI0K&<|k(iKcSd6iTW_dq3)A4fX>5cN^(R?z=1ev5^b#f2HyIpKT;$>TLLr z;-BL9U#8(TCa9}gdutAT5ontyq|+T_Srn3yLI!gnvcwgVil?+yI<0BF0r{Y~g%95Z z<+7jd?B_k6$V#iZj*$max1e58uC3YmnRgZLg?yuj>J+?2JN+>p$A6EtCYNod*q4)U z$r9O`Tugl5AW^6sjH2wgup%$K`1PX{ei}ekffGD75#v;UL6ZkBf(zzEIU_sif)yPO zmdy|4F4obo*M)Q+h}-#^ic(glnS5!fx81DQdF=N120#RB-h3J?G3m0#v9X~=;(K&nM=!LQlpqoK46DjMN%rkp zw9W{h&r~1OlIh8mCDL6RjUkgOEmpBlzo2aG5;9H-Sc%cJMF;5-1EQ^;6oaaOI^8-} z5L>)Av!~wBMJHvKr at QB#oG4{L_c$kmQC?y;BZgCu^xD>dNhMq6diIKG0rq|MF%zS| z0k5rmnVoj6b1dboSg^S91%fi`x37=>gd?nl=0OU6u_dNc)?DCNij;B|4J&$Zyp}a> z*BdbGqiMjC{Q$_QecbweeFYhau%B4mC%76hy+UziDD)sOi_OeN at go@{X*8A9iqdJj zmaVaPkS^L8)rDcs3kWuvKXwnn-}4XN+eS$Be^$tUti<|1T1d^(=`YKO{cuzj7ns|l{-N?lvt&H;& z4a|Nut;u3y88*rkV&f at j(hbdeq&W~Hmj-D%`75U>PQj01Um?Ud7g$A!gfQFqiUnjb zy*smArzohv9v2W7Fbf|un7sA8d6FHtzr$3Bx#Bti3*idov3{Kr71adjM3%r7{1879~ua0{qJuI47vj=2;K5F@|lc<9D- zsUnT@?^yA932DywMY&ITi~CzaC3YSQU^p0UP^wdc>bfuDn%&$egaV-|7*59-p54RO zo>RZiueXzCu at dV`1QsOTIya)*+$BASbo?V)~F#BLV zw;>JL0%I`Ul?5OPU`__AJiLI at PNf>AVPh(PvQh9Hfi^a{MT=*Lj2UMO+e<8}dZq@{ zP_s?;@|&5U!AGH#SIck)H5%z9%wu1QkVQsT%8nP0b&Y5EaMx(zPRW==3h|g at a>|CG zXfiysII7QHHX09#J8#ySYL7;bd#EW-NS9};P6*aBiZ6r~Cp}9}w^oO_zgFWeoA6?E z$7icEJsDJnUq$9wI-}<}vuM+fh$=PLP-Hj?)r`u=_pt&kC!o$B; zWZt_Yz=T+tvFo&rgfiL0Bb!W%F3xb`){v$;&Z!Nl%tK3pLD_DNI9k*I8BsZ9n_po$ zyqeDQ4CNU&lO+_N3=EKRE|iG`vMko4WxXP;VktUqGTV|qhQSRPdqy}B7K}DC+HNJrsnRq)}JT0OtR*P!BB3#-MGM%Y`71zU87PTz3COnW04xAg4$ zg at ypW@4;Xa)9vEHlRu at Z7avMvH#P0GmYUxc=T%5cH7h0dk80g(&PN6 at 3Quzsj|xpZ zS^8vqoW at P%S$YaCt0@!7Iuy{vk8Kb~&1_~k=rrG*!%32`2rt?wySTb7p6y5xS;Z*G z)op?w&B!=%e*s6WHJjzxcvDmF&Mhb(RVwJsUW?rrtb|KH0#SO6+t$dKN zs{i_Zt<{{b^-MZK<|kMDP9^J(*D$!0OoqKN)XhldcFez!ROy0S5BFnSv<(INH%Ixm zLY&b!UxGF&TB0%EYIZp~q1f9(BLZ8=3uOvBbF%a7>PtYkRkoeH zmeu|FcVpg`!GXK{46JKeZ%C5!KbLk+K?x2skSK^=$brKYSRQa26uUtAkfMW^Kja-; z(elz%1I^V4Mb4xVS1pB22nzbFNm<0wLnALriULQV)4xK4y-QGpzdm z{_5vV at b6!vUBkZFFX9_2(R28+caGJzT+fWB+2$NCpt2Pf8K+m8g3gXua1|DA{9I(4 z8t$fu4i%>1wfcfEtK5-^=f3Qh*W|hwqsv?v2>mcAMqQ2rn(BOLD>(&`go4|Zsp)MQ z4xwW^oPaN;kFK0wXj at g`eb$bw^?f*Qt?~c4U*Rua|3-AhzW8V5`R#w?_5VcYf83g~ zv*RC*H+TO>T3uey3Rn=al5Hr;Bh-!GfQJJBQwb?Z%!%o^f)ROcf_a)1x2YMRKTd=& zQt-WVj|lWOw#yk!)J5H!fWI3^W>$Vic7|l5o4ecH$Y<84zqk at IreIO+y23S$Mp4yEb2P&Yui3=z%$gEVh zMNs>tsurEgKOUv+{oCJn3fgRcG7}UCNEHeQi1xqVDbc?k{;^&E{xzyPia4rIa)*sX zaySxbTzY7;5OSz(9+lhP`f9_il!eb`3$C+haj)&Zr zV)w(tlnESBpq2d8)JB^7Q5Vni)TI8`#~b%g`C1$iAbn5EVp>C;gs9Qo)5n~A6ZeKhp@`_FG+?zfBq$=}YQP$BJ2*a`Q8-BbZIM4- zr-DJd3)b9^Bp|0ROW&>L6ehhK8Qc3=%roU8CMY#Hp?Fc1M}8|dLHC2!=kImvc6GVSVv92v(iR9USVuA+;|hSIIhy)NxMvi$Yp85l}52Tiu> z at 4%(wH5w=C*N6CW<0N6!WK-jy?&9{*vh zRFCpHUh!WtN-N8t#g>&SR1`JC?;4BU2DS-(upCR_#^+{wLgHTn zSwm-Zx-h5)08y zoU_O0nz(zv&>sA*bSn5m)vU?O%Ze>IXK5nRP5Uw9>&kYB at LBUKnifLU?7@)06m^nr zv;2ow;%Bx_YJkx+_dYkV^0m0Yi)_~OXWFpK+Lf20a1q|DnotYa_SH0|qA1GRtcLTU zSq@%$P(4a=9I=~8MYdHzkUex4HH*tc(HCV^37x49>PiD&z9xtdA9 at nwK36}gjjulKNMAJ8I6)=SSF{$1 zjbz`+(6AU7PCuzx*Q8xpLfIM?8HQ5uFIjX9^FQahZHY0Y8&Qx>42B^WFmlSom!)@c z$^|q043~hu4-sjI>EhD?DM~9W3B0+ajpmQW1obBu1)Zw8TTcH{xnvHH-q z1hW7zrYQE^qIv|ysvt&xIxji&A8|p7UNR-KW(Q^CxlMxBTGl6I{=&|ST2^3#pGE)7^>@03UZdv7;ShN_888&zH_Z2s z at FjeJC8FyTJfU!SP{KSXED12e9|B{fpYJwe9Uy{+ePCbl0~0EmiNX at vED|t>N)iKq zE{)j~hreGL%7=7MExjZ|-jj$;Mk0cXPb8vsm|N)ssYHqwS3-15FrlB!dQil0m}eq^ z1oqe-S`>9~aHMFoXCFn~mTwAt0b?WSP$+-a;YR)eRy}1ZMm>`o6##+GVJ99mjUk?>yqZ&yb(FB}jNnJU*o&*9WnkHE)V|Ak1Rq zfxGEgCa at ZjJ7^=~b|_1y=E zAKC%W#fVCxLIU;u?Pbd;rsjvw=i3uV4_h;K>8>9Pge=54-IzsNAdmCSNN;cex-czw zyyZDo{}JI_0^t&uoQS}YNQFQqWKxhj_J#JoY4(+ZfIL;&B~#-%jHt61Y*H6KOmLE) z%APJCR1oKZq0q>gfH)791IeWaxLW0Ra0bAS#J|)-SkMA(Xya>}WQoV?Mlh?JxdV)S z`T}?oBpFb#E?I(^)Og0>NY5s(pXp?8(kmQ at C#L8WtFl7Kbq0F{0W`!Jf?sf-0c;0l zkioCc=@Nz>U-bRZ4k29ZaR5@=$K+|4+XY9Z*=N%E+L4A37gauC$<~nm&eo{sJCHt&3lRRpJo8yR{nT|qeSR9zx`NL*zl1gO) z?ge5OhV5U+dBODazd&PVOzZV>Md){2bG*KtXXibnsgdgB)rs*51fyYh_POrvW82Kn zGLDWj at szAyEp``t?7}9=JKYk{4=kJCvP0)&eB$43q*Fp!H1jQ9sjD1I(uJ2!Nl-DT zueT^qxH;4aT+g>?g%*7w4&LMZ9WuHT#%Q;HAma=AzlRLdze1){dED-=zNdr~l>IqG zt*saV6#&pSJph56>KP9bCC#BC?FkLh%Fp;WtBJ~`j#Tfu~5=s{t_PH73tZTjKqjapByU5 zGoT@{vJ<73nzoV9$5=l&+?)#ueF-bQ^~E|(Hro+RgxC=9t{(qeXbMAob(NHwx&%a2 zCunQ at Ht&Yne|y>wB0=PaP=D<6i^0 at p^}SBc>sBNkPn)Z1i=|**?3$84T)C|8m^fp= zFUS-A%z~q~u6Ks|YPMIja%PvN at fNniR|hrt(l?E=U+WvT at akpsOtG}-Y?Se2aT=wm z>6=X^^KfdtZQ==Oq1zXX#x-Wq^a8bE*c$dC5P^NR7WuR-O at U~gQL((Lm|;ZztNK^; zU52p=AMFkQ)a^O*r>}DjtRB$72m|#2 zU}&WxAQ(g#R}^!5a8BlUf>)#g-yZ*vwiAel0)^`qm3*RzmAg*2>g!ggsg2j)clQ`S zX)BWz2h4FuCstnkH8YZ((2rokjX9EiSnJcASs#EmiZ9q0pBOzSTz|EF?)7C z6r at BTh+>Qd(-wW$D(z4thwT%Kol=#CCEcogCb>6YTA at 3ZYYn1y$I0Cu(g{jKsTaD%tX(S9Vk6uhMuQIkBv7S=e?t9Qir zawm at cEBw{`;JU5n*N>jT?wv6=V0q^N>lg~>fFD}{mdB%&R?q}Y{82HQPbjNWL$Qjs zPapr}a6EIxzCb|#b;$nz76UB*z<{c*GL9;ykDNrkqy}_ijOBvQ3b3pMVPkWtUp{IX z7)Yr~c{A1c5sQtkD{}^1bLW#fU|(ZcP&_MdzY(3DOV525;nrLur$I7SfGc72VA69d z=J+=cx$oEeFf$NFExtI$9TaZA3h;bOd=Ko_*}!_L>OncN6ZY2W0FN0;=x#dkHQ9-? zZohx9s9$NfrD`x4XfRB1dlGf4-Domry>@j%!us4TdwJ4Ehf%c}wX$<+Gwyf}l0?zk zokR^(;PFO2>It1jv`)31t;BV3ouRU0$4+{1rx_rbYdOd;DIN&)0c<#KE7MkmDn9=H z5)`*>;Cp|wH7eLtF|=EhEr~gf93 at 7NOp$eb`H$6B)zf)4qfJJc;7eX3Y25z%;MAik zH7;$gg)lI`SWz;gwV?nA8->-I)Np~6Q?6oiZ!7?$1uIx08mfDAoS|xKHB+C8i){p|J%0O3vMB-l_b&X_VLbfJ|*_)cp8Qf(>tmb9meDi$vTm3qM7 at YG7CJxBcdw5 zAGav%QklB;DU3mnS936J3S-Tx3l^pkf1y(gYYC5E6que_^dDeju6jo at 8bvA-6w`%- z8K_}+m~qBL94v^`ERbUpOxEtp=UzACo)}D8 at Sk$%?K6df?Cf%Vn96{6*X&0LJd>S< z8DO;p`q6)a{GCgb9|7OA|M-(=;QwkU-2crb|MH-2>1^@03wzdIMK1+J-udFFsMG#8 zAHUp)=5Rqob}0<>BB9wJC5N=e6gJXUKb|*zy6~Mogqwna*0RloAW?9$sSR$YqlwNO z{c8fCsoEceA&j_lVR;N0A3!XNvgD98*`XUtiZ+tE9gA?-p(fXU%mulh>H050zxgX%wJ2?ncaijw zuipkL;XK&XScg=P`NB5=PQ(JGr0y?<`k!Pv-N}m}wX^X={i*3bQ5~{G#P3-;(rz)o z8_I9AS?M^axtAxi7#b{#;J1a5qB>t7O?@#3W2E}B2sIaH at 7sUl!@apadKqUfrC^Pu zl0pOoI=Bd;uE!mZVprG)_{;2 at _+MDBX_@Go630SBd7(<=i+q#v@?o$wt^lS~ zGNurvS#*#FC9|0pGBKzXSgB7MoP zT&!Po#Uery;kIpXLVXjF6#5P&NGyqnoM)izJ=*oXB4g79fv~yxseY at fsR_*X(((ch z8Y+%z1*EFers?UfyxHn{yg^M_RW-Q?Lt#Aaz?9Tq5#ZVtNx9ybZnDfSv8M>qh+WOviIQ z5B*AD@*)oB8{eD5`Y{-#^`Q#xn=rk-`2z7-wyTf*c_{|+xj)3!QMlV} zS2;X>=PpX2mvs7d$k1zj=dP=} zXno*d%zbJ%R#b+4h;*0Xme#xC>Rb7v0Oo>h4Qv7{`KlicU0s#v$c(9*Yz0 z5!R7PuAEffL;SAu=u3>Bvjr7b9vP-OVhl9%?C2hkbjH^GmQATpY{yLOgQcAit&x*M z;_X022t!C}>0z%>3)WO$wtj7l?Hi-NS8hNI*NevJ`Fl3CG6t!>^<0S$LMoKG at XZ)Z z{x zu2DNxY{e`Pqs+2+{EnV at LPFcduqaYPLTatyvkf!oCEdHVBS?c(q3ajC7qEwq+xI{E~UT%8DpUF zR;#Qu-epRZj~WGv^1d~}cwRg=t1J}TIzDq!hUuHWp4p9~Wa?zt<(aLV<`DRp!@^tq z@?K-8yH z|I#S!o&ytx4WwwgIB$KfiNCZIc_Fm8%&Z=RpIR-gH+2a;yTw)W(8TyRB_ at aGwp*u? zU!tEc(o)2$Pd>I=#;(I)bs4>nNI3Mv)P6>>SGEcvzD^G!OCR2NvSaMd4 z?e}J85gwuL at O;9_N5n|hhFhbj^~s2IWr1Ldy`qXwRRrc;IzX;XBINsQ1dZS3wzSMd z#M!;DuG)k`!m?q*)Xz?YW5k%9sS4A$&}JuKIn_^DBEnsC!pC1qqq;Y6_CJ4m$kR;- zB+E5eM$0)_;uAcWa%BlRv2ZDq(@!oN=1LcUanTlvV$&{JLeVakij*i(&6nzwKyQ>O zlhV$YN|hX{RLw(cNv7I4ah^6xCEpDNl|@hQ-g9M;^H>>xc`bdL>R^;q?H}G$VCxRsg zFn4T9729iVjy_n(r0X%5C;GW`1+-b#%9SBp9Hj_+of?=(v3O?>_nJ9F_VwkJHtr at 9 z)x42i6C=G3S3A+$B1<(Fkq|;aeB4P*bl}$m>WE9_6V5S~N=*atjC4K0(A5q>Pi_teH?Qs5qlYDmG7!UvlC)s)x}z+7 at h(>i?XyKV09E~GybHie#o_)6qn({hOrF=^|j>MGWmsBLYku`&b<5&Lg3 zuSX$Go}CdsRv9Ut|ptsmGLYt*cO#iV6nAaJTh`H2E{#{#}!AcsNO09qhM+H!gd#C5O_+i!P*X->!mFXgcna|d-cYX>>x1(6izw3_ zb4xgtzx)=sC6Nt&$$_nU$Vex`$_Kq_ at Ny*_0%=%yEItj&mR7nDgRRLh zJfDh&dt{9uP>;_aOcS%WkH&@oVXh$6Z+K1wqgVvP2uPh`_F5{u7+p_6q6W8DsZTGkRauB5cn(`!v(6aQl*s^y%BtQ}gROu{*QU-`4QdK-{nA5*urMwq~J={<^(NH?Jf18|BBfHO$C&~o? zUIj=NzU1_RoZcq^_{DiEVs*w%YKBY#*sBjDEJRVZ0-hZ=XpUpsp|8!Ij+wd$dLT5} zGO~b=(P3~AstwcBnVkuaR+)8JrG=KU zu?St^QY at a^jh(Reqf24MSCG=p5HI+pH9XV9{!*O2wR)n3n7&r*)(`J6G_SNpU$7!T zlJGq%+k*?s9vt5+d5gxxp3u7Ax3QtcgFctUf*o&eCoI_8sFpAgFO&{wsi;@$6*zS! zmLi({f|j&zsnHP&<-$KDzIk^pfWs=obMK=cjTqro_YL1dEy)o+J7&bX%1W(OLCfWR zeV^wpw5g9ClG8&HpW1tw#OZ4tuDyc9c1=`=EpUL8-Is at u6-Gj%knVu$O4Mth=`0)$ zidZ{tRx$GkEDQQX-YOBeZ191c^xWkjM2YTSVFltaftS$4HYSscBMs1`|7Wf zByB`1MOw8N~E;*WS>1TL*k;%d6oecwK zu*$CP-}~)(YJSDKnBB*&DZXl*(cMPQ|G}v-i|0;Tb^YkRORP5;>E>m@#y=b at txZRd@AHei zm8ms;XG_Gp+RTQO#kXD0%xYc}*u%}$B7+mZ{p_>zaQ%8h|IK+Bsmoo>KJ at +Y{^O5k zg?icD60;;$N^O$o>l~P5*s at JUf#2C-Q@?@Tt3G(;52Di5Z-Dtv$c zUO+w1o4s?q#oFn1WmbuYwe=K^y0R2oySMe38}HaJk|Y1jWL#x}p5mrEC+w%MT^;_^ z&$_2x`CaoVXEjsrR}Go9>48$q{O7tghr?E%H<+=(eY2a2%aSf#qpf2Toq`V4)EA_< z&KqRRJN0Gw!iN at j2L*XI$QVyQ!ZBBtk=85RxMzaq$T=1jwi_e2jz3px%v9_Cdg42k zq?iSE{K*y1HukBP6RufS)0W7tpjJOg5M?R+8`2gP#hq!#<%GoXc;Huph3N0pI9?uZ z7sjg3t+{XiYT~U-o$>aw_#a>IonB%and at k>Lq87o;5mt&TB<}&*%&X{>BK6;kwhK>kjN+o-(M<Ehota<#ILPTsKCLAC zhX%MYlQvV<&bMT-$FtGbYiIL3pTGI>RQsGlYmPkAZE>{JNLe%Gj991P^A?}Kdh6Tm zyJmrI{A)GwTWjWhQEF%&xlaE>_BZQ${h#|QZ&$kaNO}3`KA*2eR6Gl+ntmqP;ML9J zwOLQC at _tI&&AZXXY}2i1t08B+;{!R~R_Vo0LX5w+MnqWjSp49_&X_F;yYtQsbmIrS zUF))&n;7_Z;CrhL{E-!hbvbZx4CvJ zM{NuqQGTth_g=$`U7U0?hTlGTJ?5+0S>>hkqvmcMbiM0=<)+pPydPGNi4K#VEZx|A zt24u=cYnR=Tk>k&7K#^lDBL~LV^WT8uJV(JA*)zE$hUBMf=C?i`z2R=IDOAn0`h{b~4+I_Gks{8dmMRaqPy{ zGg?~b7x%1pT5j36BPssTGf%7MwVH3A-}xrDz&bxPqa;99;p&-#>7~>3+?4mOY&`yI zb+6z=E$j0eZ7o0hy%~S|jf9(1lJBYdaa>$Buqaq!(bmqX?0!-st`*tpMVu*sSI z*->>VQ>skN;wtk~j`QY at a=$Bgi+OiXwMVLD8hfbW?!&C1pLC`_P#u%mQ1n{QEQ{?t zTXW=AW38o$J$pHy;*P0Vx at F*r>2tOnc{NGd?M`5{pIgw2Eia7@$L1e9R6JnE<(psC z-5TW1joYa$*U4Wi#qu{xzTOz4+jri#FnOhm18%>tcRB69pinb+Koh_J(rq{T zxXoB|dZcagn%G>+gEwyvOuE at RusD3&icy1YW^8Owt&BHSU1^$~-^#9j&Imp=?CM0$ z_^}_Q`#v7F>F{i~tRVGKDkVPiPBzKx7_G0fbD)~x(zBQQ*_BD`nzO0YJ#C{*k%aI~ z9?j-KAFDwtUXWrihKLvhV?nn>&-`?$7ty zV|)5XAC0M6uM)!f^6p^c;}M+MFJ_&5{K(jDcIk%$n_T=%^Ho=UPU~kiG4si-7tSd! zdtFG8*cq at QcCuN^lAQH at GjrBIG20$9Wlzarr(>S2?(bgfx?Y{IHth773+g{pTPDr- zDmL3%eg9w&)_{Go%IxY*ttZ}&cZ_BUV4{I=Vc!(YaT`ymMEs z7H%DMdY7^65a}ChS3l)kKbCd$@PkP)C&sNE!P;Nu=(zCb={;_}wuZ&usXM6V9&NxG zx4f`oLv~@h-;^}#S|#=Eo$Ci(mx;Kbb}&hQtlTS!Y01@}p7C^x$M`#s at Lbm#nY(h| zs_ee3Nj<{9S{K-t4_VgsVc8tx*sliy8g+D!WJB+j-94&VDnTn6UcFdF|A~l*lK6Uwd-vb6Az{E(D?1qr+?V z=t1kaAkSbJ)3A`=0pEc>niF;BSt#5)7^SpCI{MbMUi-g{we*VgmpY_AW2fUF=^5|x zt~^U0#JPU|$JEy*?@ya6R+&{b28Mq%|7thAF7|Npo-Q6AdpB*dp8fE7;=@(3o^5TP zK8;~qeY|jqORf5 at oN43jy1DIe-Z9{+hv|Pi8)mEYAC$@+SX}Mc_%Un9KE3^?w>KPL zGNZQ31-*G*GbTC&+N4;sCg`5rlGOOMC~>MDbLz+?Pk94dMwLp144dLLe#m*%h|)S9 z_gy!q_};TVHSWqA-NARFtE(xA%q#q*%u`Mxf`yvk?sUVbry z>kRqs56$!zhJTpww7X0HsDaMawS6y|drrSQ>+U_)!>m)UD%?-MowDml^sM6vtNLo% z)a<&O!mT><`e*Te&B~o#M>Y;U{wXSBXUoRk+EndrKc_FI!otF^p)F*iyQOwy<_H??=*gK zaM--5-z?&)%${?m${xSc-|3XZlV^>RA&X_g9GtqWiwihsJ^lQnnd{!2%n4Bpj|)xD z-T!_xyR(sf(aLWl=9Mg2IZAOvicv-uGjq!hz71pWp1akR=dzN%AH1#@wzOiu{>Xa$ zbd{#JZuDlbE|pwm*sC44!7Q&lG~>w<NL z*|}}N++BvQNl{(;tiLE7XgPUMy~eeGm$NjRl=YpClyy3;tI)PS^jq&~v&ZfWX}PMi zYFlgOTG{l$t2gIu+ at 2=?7WWki* z+ at -;zN64JrMz$M2tAtNWus-gT%xb-u)!6?3r4|`EJY)NA`^Jylqv3D0*u!;Q<7j8? zV2AVp2f#l?S&b==Pq%!Rt#d4 at yKJy5x%9=)QiIXGMjHRu{O2|dgE0~e2aJFIPYwLz z;oxgC*u~S)B$^32z6tUFSRea82IGfu`%q#W9>DaT+cJ46)6S>tdZRb!UIkZX z at J%z#6fNiSL#9v8HaWWbL&T;>)y~*>xg$8fSHhH at Y&AdIgSpQDmfH4(AePph$ zEtk2F=#XWweB*{~PDh`{uAZ#^`HRscmxkN+75O1sde~lV9zPn(g(RE|I&7cM|O>Nf0v8+?|@hi-1(wNT-6`8Y`=hD>Ab-$~)Ga!1{ zrpBCdoq7L#8!PjAncDZy(epf$XK(cD$*3q+F62L-OONN>$X<-yHB< zeUGj0f#s$0bJN$DSnXdnHuq+awdR^x;r2OQ?A9`?yRP5g$?t@>QG;=E-O at FTyy{I1 z^?G+h+hr$*Ejzs0W__saw>v at 7N5%}Tm~XEnS>tkO$xqz``+M=X^c)t4X-^S(IoM_JqK3hmNr-?%yC<`OT>=*ThhrT1QMtG8OmpYU|orI*G^1uJBg z?Ho^7tytA;(%n at qKT!W$`rMy0=eC^8s(o`&>+OB_{*n28p9aPFR~>tDV5t`0W0z}I zQjZ~vD-Bd1_xn5}(1r79sd>a}iSLSAU)x4(I5fNRSn04nt0!M{$V_$}f8N at x>po_! zvj4oX#?d#YmmT_8zA!TIx$W1u*Uyt0jRxt(9)J3_Q~L9W`XNT4uGbTT*waSxIxG7% zrb)cf_xd<<_I-`b=3RHaYHDqnIX>C=sG8=>P70^KAM)K)+})|kc=X9Mx$BIi$z}28 zVcag6FTTHiy!?jLyJpRloa?eHem3!gw2cd#f*+`kR!iFN5U_>g(zr^_=KynC%hv;O z+h(W*4&7?B9#+1X-+%jO+24J*}7cbe_{{!#iqRvYF`9LBI z8`f6pyTshD8q{m#x5%xgAvxy^-VIuICht`5;+<`BHzQ81y#Gl#>Cux%ms%#g-8qBN zbxZZkjR)5=d0i_TH!=qn at N$4bfRr?V%GT;t9GVrD?76{@y^IC=kJG) z(3xmE$e9(h{lG2j=Qai=%a)}*`Cv6l`B6d-zVXt}&z(lAj#^hTVV3&Mz>4Oui_0|U zIt84MPte#fUG8m<)<*gG&d)ogk8HZ7sVjfS at XT__+nc{DT`cKy at A=@LXA5WZM#MC4 z8!$U!bi$9}4~IqbU!IAGInw3C+Ns})g8ZxZ_SUiQY7{vASlHbOz1HxSE|QPXcaexI z?eebtqi zWh!4i7;)ss%C55GjL)3iba&D{Kl`+YJC at q+OrNo}YyE$Is`*Rehku;)Qg>q20ty at Y`s(Mr=y8diu2_M!5$T<73FGfZ#)0k-1 at +z zz^h9@A7sg3HgHuqx@)a5lDxE1x$d_szQUthLsWBbH29Up&e{BmeY>iuWrE zy4&}BD81ez^8U~Z;l_-O<3IFEv+A}mhMoJg#$s~aiWVD}!a&WaWd4zl)i3hdI6W8STk8sLu>BJZ=n& z$7i!*ed5Pma~teB$i-v4bDr-zk3nwN9($|Gy|4Ao)JjX!QXaHlS$V&^idMiPJFPTj zU%e(Q9ev0?mMj=z7cy})n(yLk^5b|Lsj>mP}o3;X^1 z*F0=IT^t>Je2qOE{{@>PVCjFrFKkMFEey#1hLX_Vc*YP~O8om5ha!JbL+CH6N#LzP z{{8zF$luo!`uk&W|9%KJDvA}tC)Lpv(wT{`!wiXFk*ahSQrVBIGL0EaE}}0a(m*W2 z=I~iO4l_zfZ5X1aBc!G;iKoV4kynnkkcKa=2AfOz8NxNQ6jvge$&VoYj_yJtg}5Ry zJa#mj&yHusk{Yb=_k6;YisQ4RNWZ7IkjNk at LXnU^+sib}Ckj_jkbH%#rh5p9Y{wP( z_fk9A2Xz(FdVs6-XNTb5F$q at p{)GWi$G}ey!9Rok5#6>>N1Cjg#xO%7nc=L#Y)%-r zeWL+YZZTz~S<5mQS!(SYTYr_cWyq8r5 at Mp*A#DCQUZ@}|F~0iolw+0}z#yK1;@SzR zZ&M;u|E+59D~kh#kJ9eW at UV#oq{%Yv583~vy;l>D_Itk&B|Vl;^MEfA2Z2lz` zYlug}=hT at lRDA)yeWOWx@{_-udpcA&_^MLZBWe;sJ at o^IHd;tkt{<7I3mBAP%f}k{ zaiY1Q>@YU`>GyB(S&rUg()$Az``0a-zpUE+)K~;f&}Uf9{3c*p+8ANaLDYoJ2)=mD zsL1Z%i at 6x#CC1c*&GCgd7X==d1Hx_?;nzc`2 at k~=4$T|lqX>k at V}wVUQxhJBFMKGk zx4JqIF2D${8b(dn0$+GEv)>F at 6=4|R7nan7E%Aj5I?p-^g)=e2!$(jP9*!^E?DHvj zED%n>2rnB&P1p)w_(!>(#6ck3Cf&YK{a3it7>XTa2vHxY?s4jd3()>1jm}dlwp6w8 zmFHf3fBpmLeX1DcZT1wE3BEa^__2BmQ0{_Je&9$^nV at 5re_EPQ1(bJ4p~_udC at K^5 z>@g466OuqZZ(BWIxlN#;! zpWyugUvB#=RQRm4Dz{aZpkx;@t?_Cc#X2JxwAv&GPgMoVi!jPj-V~JyMy=-hQolB^ z>gng*9-IGHxx|-}GQMom&Y+CJV8%S4*1q!oE33dEm5q*$<3n8!W{iPt9GlpGImr%? z{{|Y>1T2q73Xd^-$^;)U at iU`f41yz<7mW|vr#7ZrSMXz1Pqgl96R3jlm1_s-p3eoX znhzW!dm&|;MU<4?*|B^BZ{T_JVp+n!Bp5IF*+pA5L9;yS#9-J85uKNGjEK*BTF at GD z7W6(7Db&e4lSZ9KrIkK#BIDCQ at 7Sc;p26!csd^=K5~;<7NjJ9jhW2dHe$Mb0aU_#6 z0$)02K*^2SppKk at F}n*%>+hf>ZP)$_K~DVW7=9wozrZJ_%J`+d1~#}=4kgR%rb`y2 z;HOO1IHR)55Rk`6qqgXuN0&^+Lc(@UOCAO4_=`L`VASW+<&oOS)4=9MpacwQ3Dgwh z4$=h?^yA8$A$J~te%wQ=J)_`X1n&?{1U|q%Ax-ZdXqa6}=(M@*Bqe|ki;vg?_zgbG zZznsz3>d;-;1D_k@(f#3we~ zchfls13aZr^E+NbnMlRXyF4 at PmI0bBO%5u#kEC8PZ9ma%3Aj_fD^VTFnw4#ENsZ-~IfEvf4Wj$m!jC;RRjE|@PCX at k*Q z25QG2-?ZWYzk8y zlw-UG+HsaQQPsv*o;4&mY6N^xN3#6^mA}f5TgjAxZ)(qmkF&8jAuI#IF6G~!@lhex zPBHlaHB}0AgAzVdM&V0Ke0<|P4A}5!mG*G$ztY^VBBWytg!EmaW1{dGmtU*Os)Noy zOc5ObKK~TSKq`osqCej-O%pzDq=-7cLBK5#LGj`8_^eQh<#FI9-+d06WACp#?SDyE z~!g-8#$MNC3VK^*tRN&)ckj(bl`yHGV!+L%jRBsBSBkqQ$gE8TSXiWJ|$&v z>8$ynH1B2FqtgFUc6FjnNhF-R7AwBJ=nV?C0miqs_7?5<#%dl0HFemLeSY9=Q>^m5Qn zot4ln#0C>FIDf`leA*JB+Y>Q-Ed at Ml;evq$a^RLHe|5 zOM`xGU<+$1Sc%jmI3lPWT4gc|Xr9M-mitDE)cpNi+izD7T8>}_C7clM=PyeA3Q*c= zsArixx&t_Z9(a;@s0_f=RMFX|#$Fs4KIQg;2f4wZMGBPAb>A0Pk(A%+?K2O#na1=O z7#;&UMLz{}PvFov${;sZA|as0v^uOi0KCF@;yfREC4nvTdom>+A^ES>TeW zp`*XqRB>7Oq!-PNTMU4GY?VhR{o*j%B!c~Gsesa(zs|9RCm5^gA`!rc=5ga$p})H> z$&_jE`h%=XB`P?hM9uHiKaxBz}dGKc5$(MZuIY;@hORm>Nmne%QcvF at TxpI6u9L^P8wb?V=as~ zSfYr|vrz?fNT3PGL5puJxbqT#B9u{=$oeQPkYG9&iQ5rldw&YR-NyL3OHNV4{kyjO z{ad`g0cmCt1Iz2dY~iYn&P=0=#HZo2)Rr_ofx8U5Wzhh;Sr_TEY~XT%xZ?}b`-exA zEd+yAfFjy*Ib|IJ;^X{2=UpiQxJV_`UrM at 4A1As8{OrP5;0P>5LIo|}t_u1*k%p=C zCMCoS;1&V**+~fJc1sK#wcZeON7d5<*i0cNvZ&!6H7J2?ge5Irl?UJF!kon?)QV{v zB%5E5$lY5ZITRGbOBpqfAxqzMlu1yP z0Zk_)frac*KrO_oxno3p-i5&lD`voWFHA_y#*bq1 at IjKNw(QjhKbCYuR|>2zv_bfY zveAY^hXV_Fiy0{HN=Z^e;JEC95y)kF3w&PDK^8T=$+FahaW=X{nEQ(EvQFuM`3S=_ zQ|K_0pqyGEd39R=^BrLN3o-jDcbJL&SH%6!pyYkvE$|_`K);(T^dZ)2|1Tec{~1M2 z8WFca=hy*$HBsm at mTUY!dC}k_A?{@7&jYv?G(_vGt%?85$(8CoH-fk#vQU3MIh- at dttC1)XSveEy7i%;FmzgUq1N_!g2#AZU&k%OsG!2+G6W0vdkdi?0bV5}aGhK_0v zp`=gn*&3d67@(sqmqTy$Otz)-+4$;~Jnb|K&=fl{%f#IdG}PgL5U@T2uA1iou03~0j$_p9gR|GcBih6uif_I!&`V>It^nt%D&XJ$(LbTK{DU8 zKm+&2G;qxXI{E~w$|s}WH-oRgDck-`^CPW z`upFOGywe*vgo#q@>FX20>4WH#jsRjK_zH{^Waw|LKOQD8Weo-zCleXA at IhO3_5&I z3#TTIb36-$gBlm}r~L{P6c$#UPE8o+G!6>q*c4~>1H!sM*hNVAR1`JgKgU47X99tV zdV$}tLzsM=a2JR@*Khf-M{o-cvya%js9nI$Hvz5ftzdqeE?Zl at dTLI0Vgi0*yNn)^S% z;zJ7;-mHYq-%Lzd&o1l`lzh0JRC)gh9FgW at u#$`a7g&OpU0~$s{aWXAKR at tsbvYk)~cYJ z%R|?81WPdMjIOkVC)9%#Q1 at FmTTGh3M-o-Ja$g at BNlCRoKPBvbzuWx3;NnyLzo+e- z2FdSI!tOFS6C?uVa`!>L~#MEH)i>M<%Dd{rOg zw$3{x7>xax%Z4f^$y7zJfgaUNl70=8r(l+n-%gP!i`uSk9o4KPL}4~#PmGt9zx%QL9AlpV?45b at 4y=-XQa_B4C^cOFpg|i6l^`vRbq*(BTf?{TJ=YDGv#qSk4gv9Tj&ENcgg*XE8FajPbc-I2 z-1$f>jNbJ9*A+?Ry2f2`I0TylUBArS3#P!w=4fYrTSJS2FCY0SR!RvJf`u`^XN{EP z{~0c*_2;O>fN^U8(HZn-4YJ~wWCY_GqC}k#6Sl1Wf%rjvo&qz%a)P0nYTN2l(SR|Neuh>xB@%sDEw}6V#Zk3Oe!|4H6HJ&w2N3 zrp6~=R*v%M(&UjTJr0#p)qU?*B?(%rQ4 at 7UEG+2JNPGEM#+b2RK*g;ej7~JGM$y9H z%g0%E|KJO+pmajp=8h{R`9Iz%c`+FK^M0-dHeQ5 at 3STsiCWlJnEVggyECa?yNegt( zmG4athp%5fZ$`r!xErd9n%ZS1J$*-JTtYl3Q7FqNf=y7GWtV#8Yr~ZTW=K235&{v98P6O!wKIaG&Wa<1JOqSYoR9U)zn4NXZ at NHNQu3j=6p{E zb}-i%J#cE_Q6l2Y?vlG14Hi|5Ei$N&c{Yh!LH-y5$!s&pe0R1#pmdQ%N0_R`)F{8* zl~|&nd59U}F)|Nv#22m8|3S}9@!g#^ma^ybkzom()hw9 zXUknOfp7+5Cj9kjHaEPAPN>vn38zpYDDkVAWHGS~cieL~oe z58O$Yflp{HFe(HtE~7{moj~mNP$ZE0Dxux`?(PZZT|EVK*gd?Dn*Q%U{Z1=@f8SRS z9FaBV>L}16E|^2G!3U|a2sYfUy`|S?gE^@clc3`8VKU)A*AJ-n=XX<(^Jnr_%w9e)f&sdfye7K8)8(PKbbQiC zTmDEG1_tly2p`+TKBYzSW^zKg(KaC=tk_tQ)Hgq?=fIS|neyo9r1OFnmHY(xJzwcZ z7HGt-O6ctE^I8lH!S0E~CbRjVERz+{{j1T<=B00~j+{4_L9fZ3x5CN4(zBP|p` zeFc3PmtPF at bus!qKhe at BnEj?4dAb~CRH`Xw zpolItU&)FKBrhWG`^7J|aPwRp^?PHK=o9f7|8-8x1E0@$r-Y8AvKq7)?Y)zPlr6^_ zC!+=YUn|rV3e%xO!dI_2 at Z})PE%8NnY{- zgCq=46mDnV(bV+EO`8sWfv;ZE<-yYixT~#=w)6Wj)YL_JY)$XEU*V1a*Rq&pxDz!3 z;rtYm_Hy;DUpbhCJKI=Sid7GL8Xve4;78Ihtw#lY at JU>E`XsVr%Uq4&-|qgpr7k?? zZ}Fs0B415?8RIf{2XOn8bkL@`=|!1EaQb>?`D8;dov2_grk$HaCjEQsSnz62k( z(xAR!qHHieu{i{dx~6Ynod=MH_nCwjnpP2H(zdaDA9g5EIX2dEP;!>ZNl6V at U0&)wL60&LKG}3!dc^puatJSygoAt z*hElIbf;!P3`J>t;U3>p?)?Y8xe-&pZnH!Pdvb}J&9v-@;$1k8E28x~ZVm-mf)nCd zI+^{zx55{Pkj&)^MTpvjhx1tBgwfLnUU#-B1IiMZM2!!U$dsK}9N_sy396W=Doh54 z#$INwegh=YEC!?g0H?Ug-+2|Gep#fEi;PA31NA0qu3z?+qGZAm#e%2 z>am#j5oTsmXhKKe%5aIcg415Ed;RFw%>-fdIIvcPwilBhfiF64bU}(f_+Yr*CH%qF z>nVtme(;B=mlrMqZJ5dX} zxy|j3MrLf?AyN}xQYN@;`!+C8c2h?!_|QQzNxL|{fh{YFJJTkLU;{cduA5dDpxj** zRo-}9l(Nk4*AWR|vyN5bcvP)U0a{5-~K z1vE~p;;UF3^cUniSZ%MKEIj~<$&p7xKns3$2rv3Tw_JKnaxEzNe=6uLnldSw{|y=+ zZ0CGCyitk4V0A|$IaCzH0pnAWla at QdH~Q*j(Ba-)n~Y+|jU!r!o!1NPqzs1pDVWzw z7V45o`hazH6pPR0kf+v%h~Op9UtWMYSu{{YeGf7O668cS#@Uax8w3;0DoCT3m|6|U zE9UpJn9j`Dh(E1PHP$|3)`=m9VR$v>%IuJSVqgi3`iF^pA9!U}Ujd~IA0P&WV2wM8 z_g1$*p!AeSDZ$2KPzVkqRQj at t_kl*LR7S5RJv0 at ALcVike%b#~ATYWGrs&M~%z{1) zpHb#8AZ9-JvA8Qb;;eHaXGF)u at dZ1RLNI2G!JmKS!wQFk4nBBi)~@Fv&}RUn&Lko5 zeBTa%1sg(t9t`znkw!@e{5&}jenp at X`iRe at NgetMR;UPa at R*$L$)MjI*Fa+m3)aW at lAnWLc?$8ngmjb-ey|B;#t?2OK5v<_M+=Ooy1+-DAUxcKciiay z*%$QUaT5sExXoK zd6COxT%Odj4)F+DPC}<&`aJkN8-`by+94jnVSZ&~MiNYUm4j)&>{T7&5#+yEqP}na zB2YdyrhGS6cZi3Rsb1iJ7{yr6$K at T)>JSeni#_BGHTd?(G7ssbJy0oPTd2lxm=pk}xfX7kat!`SB7WG#PCtLoN$uzbe+8Y_C*+wtb_)5p1dX|EFp%?6LAseV&uWzBLTHU z0i`~!6q6dy4iRndLKSY-3je=U2A9;iyKCE6{U=2s{RVJ+eRfc_oY|8SSSj%vg1ROGQ1ZQq=+)N zJ`syap{bVq=yoC!RH-Q#UB(G9SuZ+PP73gR_S6LY_OyOO7e0~2j3hzXomCj|8n-=p z at 5Mqkqez=d zw#|6|!)BkYVCE0OL|or7r3(_64V%juAIFL#41lRxSaPro<{!cWhjt7|;CQ58vS>UA zlgX%~cW4;HI|RhXIrN`DzaOxdrN9Yr5W=aAri~MHNRd@~VUe%O6;P#t at +fkHO-GRg zm726y`vq97FkIEqR=i~2K_ot~Xq?{n2k^08jMIP1l`haOipAu_f#1jYGGin0d5MLO zU1I<%LmgeEX?W7*!TnG2Bh`bAU4j{)bTCLx*g3BErAu>TiMV7THEPlA?_mAZfXM)6 zJ&`U$5`k3$#iiOd2Bw*H-g8F3y&a~n{s|W+}IaX=YC8UiQ|E^ ztyA=^mHQctVz}mo_9DDhK60uUtw(s?HM>GHDFJXEV^U*{4H2v12!h7;``0|X4_d5A z9^Fn>4->2U2urkeM~i_ypuEsV4_WM|(z`(No?-SyTW9-mGYDJTnR&#lwhGe9GgN z@b+dm at q{B%>e5WVW2!`B+<)^jE!_icFed~!ueB1HLx!} z_U at n!AvoJ!Z#{A?7)twMPB^`HQ$oPayuYWMgniO`Rm}=`$MA{*>MM=e zPlJOwRwV?w8y(-|2MRTF2pXPz;Sd!dzN*f=?L#}kSDrAlLQpZ8svvTm9U at d3^5Nw? z`^LH`cnw_z4VS!pkp_t%9I)!^TzGU$o*i>9fhzimd4FKXH8Smg zqQpqld#=i#at+wf({5;rualLe>O3AZQS?>Fvnn at r;3KQ93TQMC?#~X>hY8|6Cd%W<^1R~pzEE`Ljz=oHj*L!gg6m4O7OK9 z`7qGk;#JX(ZS|f^*&#ZHpNItU5eHL2(wG@{9Xo?&snkZ7IbT{S^*vz-aVj|oTl!e? zkP;|Xi~?#0(ci^^i3;?FOx3Xb(__?tV`PO+jkOFp`b>PtkXoJixxm=!RM7=hjJg;Q zQJLig{r14ZDm~DrvZc}0u$LAYvYiCS1;Mj0UOZMTn7C|N5zKft7kBF)(n9O6Ccgx< z78#UQrqcl$j$;OCfp?D^R{>fzhNiC90UC~n25G(Tu6eZ^{PdcE-e|DtPL)PbZ8skr zpY9F{B7-T2d5;bh1jh?(?_L*gjRQ1U4DEq_2WU9%Afz2$&^Bxnd?6kaC6>}hd>TG0 zuB>qTZs6YzlR`(Sq<%D5V9ugo>)%pSPw#S&<%VKq%DqVR<+3OMqb;QOy>qiGdvEy;x2 z{S at -(VyJ)Pj;jq!6dWLf)=})lEl3B at MVQU`F6<6N z at sa1hz1&m^41cXGTBXX-w2{QA&>(8+53ToKKnFHZMo&=($B2o-2lZ9$>{|@Vv)PRyJjLR^t9D~}FATEl)T}X+mNeGr{PmUy9edlJ2iNXiX7 at j_01t`z9 zPU!X0goSiL_ylFwpb6!m)(U0Oh1tYqw1x>XD=@M6d}0BpFH=kc`}kD4#USHkn}1h# z17`hE0UgUdGsNJKch^mGhgZx2HMbq(H?*#$4kNee!UfK&P5=gQLXq|_T~C*RPpG#p zuY&=B(-qKOb7Lc|_9s8nf~bj~xQl&$Z2}_6NVkfIB5$B3Q`@px at XCS$T6sA;=<@Ih zgI2s7-v{RIl}GQuady+SH^KS)?>~w1BR&j#<8}?$U5YB^?Yg}G37BBon6c|FAEpLX zMQ38;Lmk4BS!l9#+zoTksn02+Bb3|;F`)R6hKK5J;Ud6D8r at l6b%r{GptVd~ns-6* zK^SqJBI at D$@n#N2_f0mRqbyFadekzFhy<=aeAY-fg4LyhO#1Iq0$+FW z`lC<&1De3)MQ(F{uN0|EU?kTct$>4ZFU(;4y_!t&_x|}GcMwzyUiKr%IQk~U?GC68 zFDZ1*d-V=227#FrjM at 9@F3`S;IVAaTkB&aUGI!OH{aN7apG%@!0bL%FZjSy^C7h!^ zwY{=00>bW6sPN}HYQhAT&0vQ2fh)}djPTD#)PxB(VA9^2+=7WOUSaaN>pr0-OtAHr zdbP;I69_BGqQXhfsRG37V}tR%Uf!~ zIQPGx at a#LuA9z5x6Q+(YH&YYFx#%T0QEG0BSO|o}FkhV9LQNRwMi&&GqwBg at 7YNHs zqvuGTpD1<^oU2<<*_$&_?-Nz^gg8v02WrFVKFyXw*3!uCgqr6&@qB24MvwL?S z!564XVuCJ8q^T);u~?C8PB{J}6Am1gSvxuL#dGnhMJkHY+?4^Bx!W3t!f0BE|Q{Ia1{MJ zu`Ws0B8aTBwVtm77HuWEs4J&rO%I8$e=GKM_zBR|@oMNM`3whY`Xmoh2-eaUZ<}j_ zPW%Pq?YLPvN6XWHsP9?V~7 z3&N#ynnI8E?|T}=JcTQ~jNdILJUGe+iRO7Rd3-kUIa&Ty-ACI%H;uwPR(lKv%gItqCq}<9;h#ySdr=b1cT?6W4+}-WldB?%M=tQCJG<4w%eud zlRKx^d_Db0AGH8V$WAAfr+uD(3Y2-N6*AWqC7 at t`KkjWV at RW^b(`jkMiEqx z{ikP%sxUrB3Kg|a5-mzF!PooqbKu$WILzxf>ykx_{`=xX`$IegzR!}U9}Cv~T1p7l zy~8qkbuSWC$opXK4|?2CBXs}AGDRc`U-JC}`FoQ<|0-5PN4{I@$s~W-$v9pp3-)D# zlcoLhv-*On(ZVFup0$Nc+-W9XFov^nFBuAAh4xkMYnEs?7~v`Q3yYHot+HJzG*NBDdMj?-~ zwmUnXC at xvBfu9qezZHxCrg|Uq%M&c4opwCg zm at 3)+z at o5r^fAiX1Pkf1C;Re_0PV5zsJ8t{%Gv}=Y4z7lTi=3a9j%0pGj?YvYybX3 zdyFvAIHUR|)(P%2%VM%rrk$mXvIz|(r|A0gRbW{4QOuinTZ?J*;b?9=iyYLaLaWFb zfRSdHsc3e)Vz|CVuQKRzLmy||mGZ>{V z=s4R}PL+zU%!_ZE1b2p-rBO>bSWl)b{MeAF(eULmzf(S-*5WYs_O?L`3cSFW? zI`~X2bX;8bls<)E;99q5$v{wFL72mWu-9aaKVkbsP3)VxGyvWR1uF*RjN|?r5yCDU z!7L5mARuahizO9D;rkSAn8%oIy`!N{Q1KcOW3#8im`yEoRDAWGx;no08tpROQNJE# z5RP0}_m$j#5zZqHPgUDvEJ20Mvgq4xL%!36d2%_vEVx8v5~Xi~M5b+S zWN$!>$J{%<(?*v_0e4vSz~k=#HwTm1e3FC$O&s}&IEynrbs#*mlSd<44oK4_kwvzw zPAe#5ff7~9pd~Vur^_J^IZ>}PPXwcH9Q!BP?!g`VQz3*!WOm+q4I@@CdGK8=;`4yvw at y|+qfe|TT-WQu? zM1vu?NJUbV<;O168Usuo#v?KuNCQLV0#kw4&yUTZlY8|>2mb?usiW|<->H3j$p>R` zpgOvEePuzW?E{|{2mj&7<3CAz-AGI081{~G!{N?t)_rJ z%VRTEq%y(ilh?32)*EOZmP0kC*^AU9n74~lRAzhzHLy|^)%@%vQj=iywPseNX$sKn zDT{g zR=z5O%GWYQ%6oBVvUsFd4`wY23myeWNg1@?p9`fSk1t*wzAIJ|K17Xi@?65Hi`%mK z|5z*e>FK`Qg?8(K)qYn*BhmIxr%c3`UgkLB%3zp=QwE(+(zzm~T{!V99-j at yV8=L4 z2+@<0f-`vU#6zWEIuDRWLk+cfVqowg5u7-kmoV)QW|Q88FB0ri zOc}X1PbB{&Y@?kaXidH}nl{Ak7$sK>K8 at ugcti#Mw`kw*ZsOEZn4#B98J+AaPtXD4 zt2K;sZ?IMFt2p7)L;n=fcLs%T4unU5o z(bh2P`ZjoGB8L*SFLaPdRARY9;y>n^Di1 at q%=|0CNffDLsW^kEnGArUm;Lc(0f1f1!>bsH5WITt)==_E|mA z&aL~EvN*o<7v*m^;p^qem>r at rq^#u3aq at HNNw zMj(8D12TLp;$I#I4V|EaHo_J|>I{7CoW);Xz*idzrO~b5ZG)&a0{Kd}>`b?9tATd3 z3hIG=HKt at hc2L!q>%xiU!}rBS?x!yMWH{(B_^F!&y3zT at TwEZ*z?A-VfRh#|TNUPN z_}8Igq6k1G-xm3T^1!rb!i^MeMFyg(e`ic at v%BD at NfKzXKc$hR1rekYC2EOrN_xRx z;QOvU&{b3aQDmxr&Zr4HU6N)^c4Q}JVcE$? zlsc2gj^%RfBA9H#?VoqKB`YgH3xvv}*IPX&(vf%JfPs%4&q98W4;>$JqXIr{+aEJw zESf?CN^lM{H(5y<*#9{RG-SUxkX)Pt-3&HS+}iD4me+%TW~3wb6b^qX-g(*!|?~@np~iB{fika-B{MK{B(dE=rQU1-}2ABARZjYYdsV zZESl0kYMJvWk$h~+lw2;4q+3YM0e}W`f&hw2wOE!mOEc;7Qx2BHr?~_Jz+){4(3heuWZ)(W?(SvgI8VzexD3 z(t;_U*Mq`LS3{%NG7H5h5cwkPu4BqG4KU`&DWYj?mle~5*@GY0oDjaqoIfKbT;Hz& zy23Cul-X8FlPTB`1aq!PW{wUoXE3lwZFzKj^R=sVz0g#Du z=$62;`yE8$1B*H>P;P;F5aiJ+J^7$RKmy0_L|U93C|hqWv}-Fp>HrQO*0h8ZJqH+M z8YV<--wT>BbE5itS|3 at S178-BMU8&;Yq|`Ag995|sdzw0lR*jGCYl6-dm6p9(`7!w z`<|FMACXr;@*Cp-%ElA$N5D*_1sj1xqQ> zgAt^RdFogyH(i^-kQ$A8<4fh}5%Bd_e17+&2BxHuMa{vcJDEPHnZMf>vA}`g!%Zup z-{J$$j at o@?0{}{4V)^Fk(*P13^aNbFHVmkr!|X+e_MxFpI1hXY9`N80(0`8k`bI-K z`uOTSl&vnp(}rwCbmRGj5e at Y}egdAp=%kKQ38EegNBjpLTs6lm zkoAMaV~U=B;CNc!NiAe0X z6lD$H90=6csG$)qhqlrrkOowkdrFx;0)xh81 at yo#ESDySe7bqDQf*H+P-Q=*QDfM) zS4q(ADw#w^BrI= z5zanDlR)NRX at tJ(3|r`tH0nqmKPnc6O8eA3y)46qyLXuOu{=Q&O0YN7_t05Om?w2L z<{6dur)UzW6zKZ!Q;){zFc|k;&}Ht;LV7rYMY_>bC75`5yDGY1V^-1A7xk>01)!N# zyDYVVdBHlN$t%_FkkLehT?dVrU1R|Y5stYMx9$O%tnfi5`58=pC1YMb^fa*nl#j@# z0l`w%lgW?cF{8-iaPn4vToVbpOCctTsMm8c#y{y32_N(nY|zaeVx|V_sRVNez4jHI zsZ7*yALqvU3GklfGG#Oz+OA0)4n8F_&bA-`Cepy#Sf^GVR~VN`>RDf4`+detUO>{>{91(0@@v zcLl07#AAvWfBj at 1*&hTysYsw*#jvv&KmsEenA18RW}IG&InWrWOP_+zh>7 at CzvS0L zX~OXmLEXq0B1c9zaWtg5ZSeyWN1G;UXQsW##D(7q#@GJj;UK9GddL}R)Mvffk4)Qx zP6#jrrO5T at lMEo=lu^gaZGc!Hd`#Tw(Q5GO&O=o+l(w%48D`wH>EOQviDhwII;b3# z9I#mlm{DiU0Z-;IGG*j-!f1i-!?$OJa0xSNL)@in{*U2Bt)3d_&h?Ms9l+tkM&~da zz5**aj`189j-?4BD9+WFdj~84O+Uo|o!zh5(IepNe>7A1X#-kkgDiT7WV08UJ|-ds zZ*YWw=S9h5&%=}#n8d{)`98Za^bDBy6EG{}u-RgOMCY=G&=G5IjlBr0u@=+8 zmdq8ibi{F1f~i|-(n1}WdI at v>n7=>_An}?2!lXBRzq=pwvq_!N1baOfQ-t9QPg-qR zvKih;#@y`HPNVLCkk{14TV+Qqa5J;Yt|DUyrfi|7Z1H0>AY=2wd=;i-`x`yN!(IAn zx(s~6+4-iux`Os at Q$VLVyS4NP`1+O+XXB0n{QyjE*#jG>>JvQN2<5x2_2THkJkyw` zWDjkjB~N~97^3E`xW6 z(=j*GkM5?0A#`nfMTK at rBup`CvCMOyNr z>Z*?WBR5;J{k?DDP9Iq&76>2Xp0oM^%-D7ulfx+B3PlWYY=~gSni-h})3^4LMcc#j zIxPUc{B7s6OLl{w8X4$nS*MbsJkf`rI(UvHuw7g%pBw%AX9N4V=xCf>Xu-mp zEwNx77{sS4qJyh$n>Z|d%3gKb*O{P1U1ia!LPk=B66N=wh!eF5R*lYUxr0Dye#oJR zK<}g}aqwlsjXt(q2cQ1{leH#9o=g^dDUayR9HcZgGM!+^*f`9Az)~gp6nsXl=5Rll zf5#qk#AvBW#t?J~`a2*Yb>B_*gP$ZMP`7Qg4ow_Er4>)S%Xkb5b4~|c5?FVpN5I!t zcyVi2E9i$ql+b{im>y*M?yLlM2sfO^jEP`}h}weQHp?wFM7llfOSlkc`jA0v6MuIH za{Y*m&`6jX^oOeQ}Oti^0u5zP4Z zGix_iqAyqA5rB4qi5Xdh+qX|Y9vk%J*G_|Q1Y-Xo9V6oN^fc{9js at e24d!)?Xmjd3 zg2820K-5}LjtyGqnDxbi)Pgy2(F6zAP&R%{hRlCJc3x*Rh3>7HU#5fM8YvO zn4;(y=8cKlj%1quq`(v&3IF*Q_*aV{_1Tm7K9Ybs36nzSoQqgg0;B4FNN49WP_jdv z&{1B`T^tU<8lcHLZZ~jfd#a&M`UD>`iU%94_7c2!Y%Y(@PZYEgal8}+**RBg=fmWI zQs^Rc!eqK24{kgQCfLI#9h80UdrJZQsDoBqfInT5GmFTe�Y|X$1z|rxQALEoITA z2>z3N$82E1^+|B*g1I<^WAkdG>EZ|su0P+>;;K4>kvs at p-_&wwA_yk0xwC3BL9h9$ zhE~~^`DB2W!n}}1 z5koeSA^c)tQW0+ZbBW}$|A}o|n~s7pCR!d%+SI&-4B-{U^!(G5oV43A{EgC zs&QwNcf-0pKyl3cB2* zNgB|B+!IA%Pc03$GD&kHY)4uh{YXrZeK&pOen1bY!D-Vb&M)e<0! zR?DTQq|@K8gk*5*!QkH?+M|pJ4v=CO%V&U=Zc#_irehk#f{6-XFqMjShHrS@#yn^> ztw}5(VZTo|IGy4NTKk<6<{IY*@krzj(unm3tfgV3wK_TzlztM6N4!|##wSgNSwYue zu3{LriG`vT$gnRmW8E!aEEyQTIg6nx4wl?+Zk6sATnN0UkzG+-xvcm&!rk{xymS6x^jqL6LTD3_H zHKf~y9fsl~kCbO8-2-Efng%+mE*U6ZS0QT1);5VuJD30fGpe34>wp0f@>KJr7d{2N zi7J@*152 at ZBzuETvlj%M0Ic!KC~Na5 at f!}GH9V_~yF;=)uva+L{-BNcEb?<*E2kTg z>u_JOIAPyWCO&bGM4EIS_^FA3ZV(@IqD&+x%?2-*kxxLserJFlBkyvis!gz;d$MT? zT)KBwKxgvm at np*O?AQ<Ml;!*_QSbw7O(wBd{n at Ct;!~V^29us at Ys(I%ALyz zC*xezIbr~xewc|#J~&_s9gZzKoIIcp}c0<*!a<)c1c&ibu^pf6?+V7Y=I!L zYXS(0iXfl{6VU at 6;N-YFuYeePPmIPAjWO!a7>(F_i3NL)5_>_#-eQS8YSef3?j+up z=h+8+|A_M7C*SYx?C$LB?Cgy7C}zLI)g8u_UZc&zScP4l~oc(aAVV<%lBF_ z4wbcyaKfDo6Guwu5Tx-0L*Sb$_C(!VzonBU9GN%0E0DD($im0)ktLY*dW~8zaFA8r zdMm*n1ct6gJKK>x`j(HZtJVl~7PHi*-Ak(5NhDu?tzK~}2)N6a!M!Qw at A$Z*wJ>z* zw31&*5RSZmzACD~IMoBcBzGFmMM#I8aq%mUQ0RwS8QlNZWD*;;#3PTs0xesOB_}eA zW%7pnrLM4SF1zC9_SVVVEb45%Mv&&Z5!f%F35tjD#e>oUr*U#IMqtSAJDgwy4!YvE z7{AUEvl>#7PPEF&AZRm8nJfh}B|0`AJuq5L6xn?Ci#!6xgW{d~(Je!$1Ow;EBVc5| zShqZK-47_?fg5gFC>F>fpu?xnG#8+Y$=*cnpUaE6;4P6Zwm0d_5^%;>k?o)l%iVF3 zGt1~n5>$&o3#Kkvp%U^zu>gY{l>vq*`mutk*HR1j6FH||LMTInOND^gUs zHMT|ewizh)fk7HqZYm!2t6r}SO`{Uk_T(Z;(50Jrh=PtTpI;M*RuEp;OFn!=mPyS+ z6}r7mi{0pvn=5{9>sgLdc5xOxd^P9R8&s8LMK$(0CE~i zBprCxS2hPjQ1u!P&tHZtWWv00G0WwkGbnC`^hVdg0lxTXyME2ZfKuOx*YfdSk~#f8 zC=?Y at D=l;w7lmZCpn^*yT^^vyj6~_)+!0(1mZc}o(RNpxbuNH^k9e!Sc at +PgP0Tdt z%o&*?yYs}P50_MeY1M>yMO}3)7mo#7ye}s|eOzNCnBm5L__ffOaXcJ!)PGZ!Ohs?< zD?8&?c?s)z$C;V??d1u*GpZ{yj<_fMd?Wu5GrZ at DiQgBWM9G<4akrDQfM4d!wreY% ztBEQS>MP>WN%gjK!N;hyW|ij6b3u!HInJQ#$CyE7pT*xY!%RKoiN{^M+An86;^lMx zE at wa_O1n#B$~aoc$p=4L`zU(sHqLPy)(7PHup)j$>U*SAM0A=Ezq^TJU^b)^7wsWM z{50aXy@;pGqc5)`_y0sk{Qk|an9XAWv^`s532M4q*IgSxA8u0O$oh+%$czo?%=IHJ zQKp at I!t-Ie%!!QL65=;b>30q^Kx_S5Cwxyzzs5-ts}(F}D2rm at GGRgkkkDfXTtY!N zIVl)U(@cj=YlfFsC>FNHJsopz at gdW39q#u(bPm4M(Bj&5xVqPDTu~upX1;C|1#&jP zV0N*C{9fV9gnTP$(pyv9cD+LXM>_qy*4_i0VTP7*!|j5$O1bomiPXF0IaEJ+j1zu# zn&HgDK<}9dVUH)FhJ&b7iVuDb+r*8VkRB*AGe($(ULeQ16YfB7HuM`Gow%$}tjx{k zGkYw9uObD0Klra74L?O?lnRwWuwicBzK8^!?Npv{!Iopf#uMcvR#);4!!_~G^c%pesMLirlz527KT*6DB7t#3^Q<*6E4-p zHJF&OmTO#n zF%$Al*a02VTs~$N%1a;SghMt6WkPn)skQVy9znY9d9>(L=y;wR4tcMM6eMMHN05cP zL%P<2wK^*Rp8y#xr66Nedh1Vg=vEVdtXCZb at JNZb_E>}zG-abjki#E$TagQ$zf~O% zmishH0+JrJl=z{#_5fRgcY80fu9>gdhp=VQBN=G zUMU0CT5cI!nVn2#>s{O1S5{LyxE3rn0^o5+e8LUyEeXn)ABA_-v!R_E%ivONp2~!b z$W$3(R3_MVsVf=bPM>z*-W+7D6SyA;T)2#wMB%3gdGi5x2Z8I6!G+6+NSyH7{3=Ke zTL|3enOwMxc*I>l+)JBB#l6&r3zrd%*m3vsMvXx6nmuvcLJb!#<-Q-`Y9|+aqxTI5 zJ#gH%1}>EA?Da<57uItxGgHnsIBiMCSo44o>urAJcTT|C_z%o`_z@}y>aQY*n zt+h5vgNCx&`geHWD)j- at oset6W)4_7=yyZC4>VV)9_DDxYHjaS z-MyCs+wud-G{n5~K_o*W=1zzJ0(Ax4ApYv0BniX7EFbM3028C5FMf at C={WoBZAmd; z41ALsr at f$Io|yvXYkr>vUuP7!N2XJeBmrYa_Z(6?2%YlA!LI`CFh4#kg-J*3onD;T z45r01!e4Ov0uwP&otnkgl5-Q!^g*WZ_A>a{Hsg{6B;!PQ*kjQs7^*9t_}Mn*3i~*u zQX6vBMnUuhhuogOJ{!8ClP$@BJ^BZ?c+Q1JbhuS%7`Jn?8g;LZiY{go#pE~M=0lH8 zgHyBG#JIm|8U4kw9U$xiC9XO<-{Zok!^Ra{cRCMW8VCH@?icsj9!j;=a^;2+mAr`r zu|^2k{zWi|y~da`_-q#x at R~+Ayr(}X1!qE@(IjMx5$1-DRm}r3y$9aOUmll&5S0Nk z>owNbG%U{8we9ySpp&nZcqbRWC=I9DAXpvbOv0OAP4xmR_K**LCGYV{J|UfB|K;&N zoPn7VKsd-WPG!X`L!-bdr(FN)vbr;2&3Jm?>*gC5Cgd9zxk at 9s>h~0k*svU${27rM zEyt6M|DRY;1e`>;)2xWO2gkzK3I)EY=Xvu`NWh>H%rIlBT204G?h>7? zw^bUkzvJ#ujon6 at kK0)C$Sy*ct=AdV>{n+O9*n4ms#5JBDi8S8DX~ zUPmlzgFGGYqEvUpll6KZa-1M`~ zp4UO#g+u^F&lZwO`9G^!T-+W at GQ!8&R<}LLPpvsf-k3|`Bu!de(4z~D$Hbe=yw5pE z-ux7$Gr-}iv(6?q`sMeXLz_3hKoua%;`7HPQksj7sp>o97ad at Zb;DItR0p2+TiV at S zZORmFx$45&Cg{1k8xc(85i3JVqKej1ym`Z`FVN$f6nDHg at d+F}B^OHK)d40=2wpM( zdUJ$O7Eii!uviLtskA0>lI{bQ+dNR>DL0&C&zBq|(i#botS-*e{0d(e6!_L(w>Jj~ zBhk#p6?GexMFA(oQNmZnw&LIqQ~*H5%&R@><+9~_LF6laaED1|DhDhbv`4$qYJ<&f zZ-06>XR%F+H_2gbz6Q(NZAQe(_Bv%ZB6n&VB_6WbOv_Ke5Xqv9?D<6iyv+r_t4`8$ zgVUjV^*FqvE6hKCBGP8Ci3yEz$s4Ufrm^YbQ?KRTyNzeV*D(d|fe6f#z-I{KhqbQB zS3uHNmAG~2++Q4#j`yv;`()(kicsRFNBsdzyb={+479pSN`Ap=_TJoTo^+bvL8YN# zq+5OdXIA(+py^1^G#OGF8b-R+?td*kww_AUc35d>D9%$vQ)K$Ok^mH1!daLwq7*cA zl8ZNm29ts0k_&zl;x&ecq_a+n!Kd at UT76)VEg^#c9*pH-2-BuXFtqpGa|yYO<`c;Z zmQLUjltF^vub|Ib9W!Fn zC5Wz<+j0Vh6jgV_--d3P$u%ZMqdG&2Z0jh4E?a`kJS(ySIzbf@!_#FBU#}zxnl{d# z(h~?~xZ{ZqUFY)kP^;5NpM6&$b(P_G4bGC+p}_~2We%O(+52s+^~5L3E! z_^~%~IC|pET)u;eh+f^~isVtA|NP9>cA&ba6G?2k?qhl at cN!YF2)-UDaA($o{c>0s19;)1lwN~CMJz0bn_IUJ$bhGVXUu-FWi3dkiz6isAz&DRD7v&K!UMMX))uf{{toCI-xR%YjEQ^2+KcUi=89U*to&&C;w%%gEM{5zL zs1w%ZVe at 1K4DYW*eE9yqSdG at 0jhT!+4MEay at 8 zK>Vr<9wFxU4+9mwN|PS_W64jpA)lw4I}W`183Q;>uNSmwmisRB0GQF at p1pG`xzXIQxO>$AS9L#DmPVyx8vd#_W)FNdbifUS zl?@n}wh17r=wtrTxy7O!tz~ex<<^EGO|_rVbm(0pjkN at TMupz(Ez%wz^FWK41>a16 zlvf#W_YkgJk6;G2CC4U8h$^})(AmPE^*Fr~8XiMDW;28^z|kHMZ!ynVr=hiD=1%wr z0B5-1JL=b=lAv_RTUR#+=>f8U*reAs6M+mjr>CzJVR8m zSqjSjG5j<#vrZ5m;f0?wfRV~)dIy%SKdr6+6Ts6E$2%V`ipTKD?hI=2_rvlE#qAaf zMNK=r&`2>nI@ zaP8JMbHX0=Xch-5V=7E4JNs0)?JdU_gx}cAE2g4pfHoJ%8cp zUw4CH@=0xcq9q!oQR$e2ZjSDavZRGN<9a)Jh=gvHoClvxt-2}^)r at e)RhIV%7Pdxb z6hwSwwc6B*@`9my=8oS#%p1))eZ{u~bdC-_9o7hyjwK(XyNsieWUEY>9G;-y>g%Wf z1>y*H!$tjq4I2Z0NIXbK*dz2SLgQ^wiT1l#$Rs8OluS#iJ_zAGEm^aB-H6Cb~Q zKS+YoxANylKHT^Sro#*34QIpoOvtu6Gt7vtCN(QYcfefVVF}QCM at M|X(w9o0vigr; zO>>++^n}mVgeOd~f&-QjOP4?PR1avYuOn`Qb=k-S{jZvdSbG4fAQKX?LY)4SZcx z;AUdMIU1tgfObrEj$q`-B(bGagsvxa|GqOG_Ph1G1bCE2r!pA>I|=>Nsk#h;L4{XYlL1!%Dke!n;95+9-EFN=X4#;BEtcrHX$UGpn^cJL>j8QtRI zVMLlKe?F58@(OUlOU=)DECHLK&d>^J=yV`UXo&Tfq|uXZ!NTf6sMz#p{H%2BxDCqu z?Y8n9sdm^iUP)kg)f##F)Ly5tm32_13;+F^wSuzFTnPLf8nY2rk;<+?#SZ2FKO01E zPSQM6!|zaO6jxk672V!zbK=Yfp at S+%CDowIS+PmzF{K)&V4Pip0=?d6gXrw7JOf6B zgQc?99ru2 at l$FCyM?VnUbY%ur9sO8A0zDy9XOO3k5TWn={Lx22kmm_?)T=Tdq2(`8 zb%c0ED9i2h1RJ+ZC0reSTZ at Z_4%>B)BBlY#U*v-O<d)PBGRzYwj_l#37jDLED)LvEGvhOsDL2{+c7 zf5yW?M|C`;oY59!$eD-<1;_+0C*$)oZxZv;Ocoyd17%bV+h}>F7ti{EwnN9A#*=&m7q_O#;0%Bc!Rf zsLw_a;CkYr)1wR?I`~6!N{{^h+W0jv1O69)oAgRO2L~OrO#Lm9DIg~Y7d&V6%K;Lg z;X0j0P-$h$>cruHsv+x8>5JdWZXd!+Y5PG^W;=hXRW1z-s at s0}u|n|;Cl?)fg+BM^ zP0)!y2raf`k`%CIV=nO^i#7k&tcxA?1B;6famhEGhlP$BS+h}(Vw5`513$(U&XGWk zEBTS`;|RXj!=)26IH)YHsh-W3v8Wl5=f98iM(gPd*rAxkvp*wkBhV5Fy4#OKiB?K~`uuqK~> z^{B-BGiSWaZSf%qRI8UkwzLMeJba}Xr1iHC9+f!r2q&ZUZ%K(&d05nLGkmK3 at pL~Y z&hRnOkE^RyyI=mUuqGF?4_UdwP6<@U+z;`F$r at 704XJqARSlz8jHGpsKgu_4glmpL5q@xdr`yM6znMA;+ z`^bT3 z513e7)>PwBRr(gf*FXo{AJ^#%S!^XH4HvCPN9E98VEv?f7P#0+fZKtUF%aZc4Ts at o_BQHnpGZL^(&+6E|#g z`f{zU|B5r07MD-AiF<@1_`Fl3(ZA&O-U7{J4lAec;2VhpQS{{qUG^`STZ7W(oa zt|@EMWvf%)a&*vX21f)LLD|lB!41oQr at j*}GtKUc71^m at 1LJx(oblB3cVuM9c0_3kx*ej_>}wcjAjM z8$mVwH+$m+qxEN`5#P84>1`T+e!ij=%xE37E6J`+%@)7cHof_Y-i&i8d5dR3Ge)`M zF&Td?eV@&sv)2hYfBqNHoD)28!}{rpcVVZq{q|j+;Q{pZC{al4$y&ax&ZaZyNp28@ z=hSJl+JN2ua~b?t*m8pm3Ocx|X4jp_s6{S8`(?9xqbzCJ`jKc*X<1365MNQ#U2RaR zMOO!W+kRe98a~GA{HkW}pcI&X8~t$qc$uxGprKz6ru3>aOarnT0kZ39NAmk#d3&^- z-Aq;k6St~SQ`XnsKk;{Hiia!yq;2+rcW4ToZ1lq)4 at 3jm5F+>6+C%)NmotT6Zt75^CX2>-^ht^br5y0kOvZUGwrxkY0OtTpI|_-CCH4 zi#y}K4_$d43ahq$YgW_ka70!4%12SvVO*xT;O?;RE0&UqPNZ)xw zKY$1#@NdJz0b7a6oRRt87Sdj&P19HtI at 6a0Vy#wp-o9zjvl_$(HX!VsSm|^PQwoBY z!gOivg-6R6BY5cE_Jq+HuBa|{K|^()NQZBX=IoGlNB(cj*n2V}jO$Ws at o*p;M%*#) z=*ZP2+qPN4XG>Kr<|wf|=`K`yqHOK^9P#V)(pj4|Kf3uJ5N}I at wL<)RU}Zdt z{cKm*c77)P6_YFbPYN!x;_BL2 at vg{jlq92P)Z>FH29x zkft)Z_HpETS?7dX5o41}O-84R?0)UZG at xor7%a6^rKMu at s>0^$r_ct!${jaY{L at NF zMUVIk*y~fDUK;wVOd3(9$|&_37r_qp_HsN2?Y~T<0F75OVZr9rWm~h-*orEt>5)i? zVb`St->k9~0kxOV&}^9u;c64(BEnLPSATp>J_>nq#$$TN>E#j8@!PF1>_H`lz9Rw_ zM;dwXMG8TL<6ZGXu&0?1UNERtnkZ`NR7CLa%8<46g0%DcaS<>Ectzuj zC$7Ub^u0eG6+9`A2bYdI{N9;esB%v~2fX^ymZ414D6>{8Fe*ytwB54><)az|GXB60 z at cb|)V1impIp`y}ZH?L#MZuJALF6{c8Nq~W4}V1H(irE&xzC4ZhoW>TgxY#NMidf` zpD2GR$^oi{|I*O!#Onrpa>Va`Gg$If%HhwB$A2e9MMrE_YxIc5AYN4Y$X-9WP8CHI zZ|F+z`k||pRu7c at HOa6anXoZtL$=w_xL4zlw+RC6f6X%PM}Ltx`zUmzJrVdk?Pr;c z40pizZTknnBF};K5^qPaX(p4P#NBF1*nmp5z1=hFzp^@bukNV4a?rVEM9Sp+-%7_% z=NZvvTCX-RmG2YgQ at Mqbg8U?;8FlPzzi0LBa?0l(Ct>hniRz(imdoX&Gc0hqr2ZWk z4m;v{>HJF3dCqEbyVC_1{a|({Rm6|&r&dc2M}#duvS24H#;G|nyh-#2$O3c32fpp5 z(lOC_3RAzHuojd{R2BSevblgg2!hcFrb=6NhF~<=4?X at bEJ=1dk@*WUk$i~&zM{RQ z;AKd$?%|woP>$lsPWY+(!an&dbdE244op|V6#kdU6MN_niOuh==U}Ye(DGz*p7%5l zVCY7?1pe?(Nrsa0H%$2DRfE*~Q5kV1zP}7SDg{qR{5(zN^bn!B8T_8!9uk@ zo3~5@>70n$f4W!!1&g+E#0`&+FO|9-^z+iTAD&n8L3asC+(;jPMbd1tJZ@#%P?nr# zlj{YdiKixZ?>pBx at X>9UIKk-i+HEMipVkpynyxoF2rO?Y#ToXE`eNrn=)yiC&CIsH zq!}32s at wO-+spwg*kG3rBj<3;y|gLawdiQfmVdPt)Xas;g@#f&UhYX`Ci{gf9G`ie~ z5=Wk;^~?kkBVzIZA6?VhUl%>DBHs2qZEB`Lr&aeC(!^I0qN!8%o_-M8H_G55+Eq=I zrY(ALiazN3QMvmKAEOdtJCt~Kjj=VvMTFjwh%Hge>+hoc$~$Z~r1rV0mVCgEj$vc|8q^d|M at 2QKSSd_wzl)*46`an zC5l$Z4y|q-X*3+uRT1B=+vlAPb$S%S-jeK(Yve3$Og;R%U$*9L=;qMe>E3~BQOstR n0=IHTHk1RcH|X?&!K4;oY at D1Cf}4|@)8l^}6s;S http://hg.python.org/jython/rev/ee37bd0384c4 changeset: 6354:ee37bd0384c4 parent: 6321:bce3c8cd9f48 parent: 6353:0a6bd576d0b9 user: Frank Wierzbicki date: Tue Mar 13 20:09:07 2012 -0700 summary: Merge from 2.7. files: .classpath | 3 + .hgsub | 2 +- .hgsubstate | 2 +- .idea/libraries/extlibs.xml | 48 ++ CPythonLib.includes | 6 +- Lib/doctest.py | 152 ++++- Lib/test/regrtest.py | 11 +- Lib/test/test_abc.py | 234 ++++++++++ Lib/test/test_atexit.py | 84 +++ Lib/test/test_builtin.py | 6 +- Lib/test/test_pbcvm.py | 5 +- Lib/test/test_support.py | 218 ++++++++- Misc/applypatches.py | 45 + Misc/genpatches.py | 92 +++ b/.idea/libraries/extlibs.xml | 48 ++ b/.idea/libraries/jar.xml | 12 + b/.idea/libraries/svnant_jars.xml | 11 + b/.idea/libraries/test.xml | 14 + build.xml | 41 +- extlibs/asm-3.1.jar | Bin extlibs/asm-4.0.jar | Bin extlibs/asm-commons-3.1.jar | Bin extlibs/asm-commons-4.0.jar | Bin extlibs/asm-util-3.1.jar | Bin extlibs/asm-util-4.0.jar | Bin extlibs/guava-11.0.2.jar | Bin extlibs/guava-r07.jar | Bin src/org/python/compiler/Code.java | 13 +- src/org/python/compiler/CodeCompiler.java | 15 +- src/org/python/compiler/InvokedynamicCodeCompiler.java | 24 + src/org/python/core/AnnotationReader.java | 30 +- src/org/python/core/Options.java | 4 + src/org/python/expose/generate/ExposedFieldFinder.java | 4 +- src/org/python/expose/generate/ExposedMethodFinder.java | 9 +- src/org/python/expose/generate/ExposedTypeProcessor.java | 8 +- src/org/python/expose/generate/RestrictiveAnnotationVisitor.java | 7 +- src/org/python/modules/_hashlib.java | 12 + src/org/python/modules/jffi/AsmClassBuilder.java | 3 +- src/org/python/modules/jffi/SkinnyMethodAdapter.java | 24 +- tests/java/org/python/expose/generate/ExposeMethodFinderTest.java | 6 +- 40 files changed, 1052 insertions(+), 141 deletions(-) diff --git a/.classpath b/.classpath --- a/.classpath +++ b/.classpath @@ -12,6 +12,9 @@ + + + diff --git a/.hgsub b/.hgsub --- a/.hgsub +++ b/.hgsub @@ -1,1 +1,1 @@ -CPythonLib = [svn] https://svn.python.org/projects/python/branches/release26-maint/Lib/ +CPythonLib = [svn] https://svn.python.org/projects/python/branches/release27-maint/Lib/ diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,1 +1,1 @@ -88766 CPythonLib +88741 CPythonLib diff --git a/.idea/libraries/extlibs.xml b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/extlibs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -6,9 +6,12 @@ distutils/** email/** encodings/** +importlib/* logging/* test/** +unittest/** xml/etree/** +json/** # Lib files, in alphabetical order: __future__.py @@ -18,6 +21,7 @@ _threading_local.py aifc.py anydbm.py +argparse.py ast.py atexit.py asynchat.py @@ -148,7 +152,6 @@ trace.py traceback.py tzparse.py -unittest.py urllib2.py urlparse.py user.py @@ -156,6 +159,7 @@ UserList.py UserString.py uuid.py +warnings.py whichdb.py whrandom.py wsgiref.egg-info diff --git a/Lib/doctest.py b/Lib/doctest.py --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -99,6 +99,9 @@ import unittest, difflib, pdb, tempfile import warnings from StringIO import StringIO +from collections import namedtuple + +TestResults = namedtuple('TestResults', 'failed attempted') # There are 4 basic classes: # - Example: a pair, plus an intra-docstring line number. @@ -213,13 +216,21 @@ # get_data() opens files as 'rb', so one must do the equivalent # conversion as universal newlines would do. return file_contents.replace(os.linesep, '\n'), filename - return open(filename).read(), filename + with open(filename) as f: + return f.read(), filename + +# Use sys.stdout encoding for ouput. +_encoding = getattr(sys.__stdout__, 'encoding', None) or 'utf-8' def _indent(s, indent=4): """ - Add the given number of space characters to the beginning every - non-blank line in `s`, and return the result. + Add the given number of space characters to the beginning of + every non-blank line in `s`, and return the result. + If the string `s` is Unicode, it is encoded using the stdout + encoding and the `backslashreplace` error handler. """ + if isinstance(s, unicode): + s = s.encode(_encoding, 'backslashreplace') # This regexp matches the start of non-blank lines: return re.sub('(?m)^(?!$)', indent*' ', s) @@ -253,6 +264,9 @@ StringIO.truncate(self, size) if hasattr(self, "softspace"): del self.softspace + if not self.buf: + # Reset it to an empty string, to make sure it's not unicode. + self.buf = '' # Worst-case linear-time ellipsis matching. def _ellipsis_match(want, got): @@ -322,6 +336,8 @@ self.__out = out self.__debugger_used = False pdb.Pdb.__init__(self, stdout=out) + # still use input() to get user input + self.use_rawinput = 1 def set_trace(self, frame=None): self.__debugger_used = True @@ -817,7 +833,15 @@ # given object's docstring. try: file = inspect.getsourcefile(obj) or inspect.getfile(obj) - source_lines = linecache.getlines(file) + if module is not None: + # Supply the module globals in case the module was + # originally loaded via a PEP 302 loader and + # file is not a valid filesystem path + source_lines = linecache.getlines(file, module.__dict__) + else: + # No access to a loader, so assume it's a normal + # filesystem path + source_lines = linecache.getlines(file) if not source_lines: source_lines = None except TypeError: @@ -833,6 +857,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' # provide a default module name # Recursively expore `obj`, extracting DocTests. tests = [] @@ -851,6 +877,8 @@ """ if module is None: return True + elif inspect.getmodule(object) is not None: + return module is inspect.getmodule(object) elif inspect.isfunction(object): return module.__dict__ is object.func_globals elif inspect.isclass(object): @@ -861,8 +889,6 @@ if not hasattr(object, '__module__'): return False return module.__name__ == object.__module__ - elif inspect.getmodule(object) is not None: - return module is inspect.getmodule(object) elif hasattr(object, '__module__'): return module.__name__ == object.__module__ elif isinstance(object, property): @@ -1036,10 +1062,10 @@ >>> tests.sort(key = lambda test: test.name) >>> for test in tests: ... print test.name, '->', runner.run(test) - _TestClass -> (0, 2) - _TestClass.__init__ -> (0, 2) - _TestClass.get -> (0, 2) - _TestClass.square -> (0, 1) + _TestClass -> TestResults(failed=0, attempted=2) + _TestClass.__init__ -> TestResults(failed=0, attempted=2) + _TestClass.get -> TestResults(failed=0, attempted=2) + _TestClass.square -> TestResults(failed=0, attempted=1) The `summarize` method prints a summary of all the test cases that have been run by the runner, and returns an aggregated `(f, t)` @@ -1054,7 +1080,7 @@ 7 tests in 4 items. 7 passed and 0 failed. Test passed. - (0, 7) + TestResults(failed=0, attempted=7) The aggregated number of tried examples and failed examples is also available via the `tries` and `failures` attributes: @@ -1270,9 +1296,9 @@ # Another chance if they didn't care about the detail. elif self.optionflags & IGNORE_EXCEPTION_DETAIL: - m1 = re.match(r'[^:]*:', example.exc_msg) - m2 = re.match(r'[^:]*:', exc_msg) - if m1 and m2 and check(m1.group(0), m2.group(0), + m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg) + m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg) + if m1 and m2 and check(m1.group(1), m2.group(1), self.optionflags): outcome = SUCCESS @@ -1297,7 +1323,7 @@ # Record and return the number of failures and tries. self.__record_outcome(test, failures, tries) - return failures, tries + return TestResults(failures, tries) def __record_outcome(self, test, f, t): """ @@ -1310,13 +1336,16 @@ self.tries += t __LINECACHE_FILENAME_RE = re.compile(r'[\w\.]+)' + r'(?P.+)' r'\[(?P\d+)\]>$') def __patched_linecache_getlines(self, filename, module_globals=None): m = self.__LINECACHE_FILENAME_RE.match(filename) if m and m.group('name') == self.test.name: example = self.test.examples[int(m.group('examplenum'))] - return example.source.splitlines(True) + source = example.source + if isinstance(source, unicode): + source = source.encode('ascii', 'backslashreplace') + return source.splitlines(True) else: return self.save_linecache_getlines(filename, module_globals) @@ -1365,12 +1394,17 @@ self.save_linecache_getlines = linecache.getlines linecache.getlines = self.__patched_linecache_getlines + # Make sure sys.displayhook just prints the value to stdout + save_displayhook = sys.displayhook + sys.displayhook = sys.__displayhook__ + try: return self.__run(test, compileflags, out) finally: sys.stdout = save_stdout pdb.set_trace = save_set_trace linecache.getlines = self.save_linecache_getlines + sys.displayhook = save_displayhook if clear_globs: test.globs.clear() @@ -1429,7 +1463,7 @@ print "***Test Failed***", totalf, "failures." elif verbose: print "Test passed." - return totalf, totalt + return TestResults(totalf, totalt) #///////////////////////////////////////////////////////////////// # Backward compatibility cruft to maintain doctest.master. @@ -1438,8 +1472,10 @@ d = self._name2ft for name, (f, t) in other._name2ft.items(): if name in d: - print "*** DocTestRunner.merge: '" + name + "' in both" \ - " testers; summing outcomes." + # Don't print here by default, since doing + # so breaks some of the buildbots + #print "*** DocTestRunner.merge: '" + name + "' in both" \ + # " testers; summing outcomes." f2, t2 = d[name] f = f + f2 t = t + t2 @@ -1702,7 +1738,7 @@ ... ''', {}, 'foo', 'foo.py', 0) >>> runner.run(test) - (0, 1) + TestResults(failed=0, attempted=1) >>> test.globs {} @@ -1748,7 +1784,7 @@ Return (#failures, #tests). - See doctest.__doc__ for an overview. + See help(doctest) for an overview. Optional keyword arg "name" gives the name of the module; by default use m.__name__. @@ -1832,7 +1868,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def testfile(filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, @@ -1934,6 +1970,8 @@ globs = globs.copy() if extraglobs is not None: globs.update(extraglobs) + if '__name__' not in globs: + globs['__name__'] = '__main__' if raise_on_error: runner = DebugRunner(verbose=verbose, optionflags=optionflags) @@ -1955,7 +1993,7 @@ else: master.merge(runner) - return runner.failures, runner.tries + return TestResults(runner.failures, runner.tries) def run_docstring_examples(f, globs, verbose=False, name="NoName", compileflags=None, optionflags=0): @@ -2014,7 +2052,7 @@ (f,t) = self.testrunner.run(test) if self.verbose: print f, "of", t, "examples failed in string", name - return (f,t) + return TestResults(f,t) def rundoc(self, object, name=None, module=None): f = t = 0 @@ -2023,19 +2061,19 @@ for test in tests: (f2, t2) = self.testrunner.run(test) (f,t) = (f+f2, t+t2) - return (f,t) + return TestResults(f,t) def rundict(self, d, name, module=None): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__dict__.update(d) if module is None: module = False return self.rundoc(m, name, module) def run__test__(self, d, name): - import new - m = new.module(name) + import types + m = types.ModuleType(name) m.__test__ = d return self.rundoc(m, name) @@ -2218,7 +2256,7 @@ self.setUp() runner = DebugRunner(optionflags=self._dt_optionflags, checker=self._dt_checker, verbose=False) - runner.run(self._dt_test) + runner.run(self._dt_test, clear_globs=False) self.tearDown() def id(self): @@ -2233,6 +2271,19 @@ def shortDescription(self): return "Doctest: " + self._dt_test.name +class SkipDocTestCase(DocTestCase): + def __init__(self): + DocTestCase.__init__(self, None) + + def setUp(self): + self.skipTest("DocTestSuite will not work with -O2 and above") + + def test_skip(self): + pass + + def shortDescription(self): + return "Skipping tests from %s" % module.__name__ + def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, **options): """ @@ -2275,15 +2326,20 @@ module = _normalize_module(module) tests = test_finder.find(module, globs=globs, extraglobs=extraglobs) - if globs is None: - globs = module.__dict__ - if not tests: + + if not tests and sys.flags.optimize >=2: + # Skip doctests when running with -O2 + suite = unittest.TestSuite() + suite.addTest(SkipDocTestCase()) + return suite + elif not tests: # Why do we want to do this? Because it reveals a bug that might # otherwise be hidden. raise ValueError(module, "has no tests") tests.sort() suite = unittest.TestSuite() + for test in tests: if len(test.examples) == 0: continue @@ -2657,9 +2713,31 @@ """, } + def _test(): - r = unittest.TextTestRunner() - r.run(DocTestSuite()) + testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-'] + if not testfiles: + name = os.path.basename(sys.argv[0]) + if '__loader__' in globals(): # python -m + name, _ = os.path.splitext(name) + print("usage: {0} [-v] file ...".format(name)) + return 2 + for filename in testfiles: + if filename.endswith(".py"): + # It is a module -- insert its dir into sys.path and try to + # import it. If it is part of a package, that possibly + # won't work because of package imports. + dirname, filename = os.path.split(filename) + sys.path.insert(0, dirname) + m = __import__(filename[:-3]) + del sys.path[0] + failures, _ = testmod(m) + else: + failures, _ = testfile(filename, module_relative=False) + if failures: + return 1 + return 0 + if __name__ == "__main__": - _test() + sys.exit(_test()) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -133,6 +133,7 @@ import time import traceback import warnings +import unittest # keep a reference to the ascii module to workaround #7140 bug # (see issue #7027) import encodings.ascii @@ -359,7 +360,7 @@ tests = map(removepy, tests) stdtests = STDTESTS[:] - nottests = NOTTESTS[:] + nottests = NOTTESTS.copy() if exclude: for arg in args: if arg in stdtests: @@ -508,11 +509,11 @@ 'test_py3kwarn', ] -NOTTESTS = [ +NOTTESTS = { 'test_support', 'test_future1', 'test_future2', - ] +} def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): """Return a list of all applicable test modules.""" @@ -613,7 +614,7 @@ stdout=stdout.getvalue(), stderr=stderr.getvalue()) return -2 - except (ImportError, test_support.TestSkipped), msg: + except (ImportError, unittest.SkipTest), msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() @@ -1189,7 +1190,7 @@ test_bsddb185 test_bsddb3 test_bz2 - test_cProfile + test_cprofile test_capi test_cd test_cl diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_abc.py @@ -0,0 +1,234 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Unit tests for abc.py.""" + +import unittest, weakref +from test import test_support + +import abc +from inspect import isabstract + + +class TestABC(unittest.TestCase): + + def test_abstractmethod_basics(self): + @abc.abstractmethod + def foo(self): pass + self.assertTrue(foo.__isabstractmethod__) + def bar(self): pass + self.assertFalse(hasattr(bar, "__isabstractmethod__")) + + def test_abstractproperty_basics(self): + @abc.abstractproperty + def foo(self): pass + self.assertTrue(foo.__isabstractmethod__) + def bar(self): pass + self.assertFalse(hasattr(bar, "__isabstractmethod__")) + + class C: + __metaclass__ = abc.ABCMeta + @abc.abstractproperty + def foo(self): return 3 + class D(C): + @property + def foo(self): return super(D, self).foo + self.assertEqual(D().foo, 3) + + def test_abstractmethod_integration(self): + for abstractthing in [abc.abstractmethod, abc.abstractproperty]: + class C: + __metaclass__ = abc.ABCMeta + @abstractthing + def foo(self): pass # abstract + def bar(self): pass # concrete + self.assertEqual(C.__abstractmethods__, set(["foo"])) + self.assertRaises(TypeError, C) # because foo is abstract + self.assertTrue(isabstract(C)) + class D(C): + def bar(self): pass # concrete override of concrete + self.assertEqual(D.__abstractmethods__, set(["foo"])) + self.assertRaises(TypeError, D) # because foo is still abstract + self.assertTrue(isabstract(D)) + class E(D): + def foo(self): pass + self.assertEqual(E.__abstractmethods__, set()) + E() # now foo is concrete, too + self.assertFalse(isabstract(E)) + class F(E): + @abstractthing + def bar(self): pass # abstract override of concrete + self.assertEqual(F.__abstractmethods__, set(["bar"])) + self.assertRaises(TypeError, F) # because bar is abstract now + self.assertTrue(isabstract(F)) + + def test_subclass_oldstyle_class(self): + class A: + __metaclass__ = abc.ABCMeta + class OldstyleClass: + pass + self.assertFalse(issubclass(OldstyleClass, A)) + self.assertFalse(issubclass(A, OldstyleClass)) + + def test_isinstance_class(self): + class A: + __metaclass__ = abc.ABCMeta + class OldstyleClass: + pass + self.assertFalse(isinstance(OldstyleClass, A)) + self.assertTrue(isinstance(OldstyleClass, type(OldstyleClass))) + self.assertFalse(isinstance(A, OldstyleClass)) + # This raises a recursion depth error, but is low-priority: + # self.assertTrue(isinstance(A, abc.ABCMeta)) + + def test_registration_basics(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + pass + b = B() + self.assertFalse(issubclass(B, A)) + self.assertFalse(issubclass(B, (A,))) + self.assertNotIsInstance(b, A) + self.assertNotIsInstance(b, (A,)) + A.register(B) + self.assertTrue(issubclass(B, A)) + self.assertTrue(issubclass(B, (A,))) + self.assertIsInstance(b, A) + self.assertIsInstance(b, (A,)) + class C(B): + pass + c = C() + self.assertTrue(issubclass(C, A)) + self.assertTrue(issubclass(C, (A,))) + self.assertIsInstance(c, A) + self.assertIsInstance(c, (A,)) + + def test_isinstance_invalidation(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + pass + b = B() + self.assertFalse(isinstance(b, A)) + self.assertFalse(isinstance(b, (A,))) + A.register(B) + self.assertTrue(isinstance(b, A)) + self.assertTrue(isinstance(b, (A,))) + + def test_registration_builtins(self): + class A: + __metaclass__ = abc.ABCMeta + A.register(int) + self.assertIsInstance(42, A) + self.assertIsInstance(42, (A,)) + self.assertTrue(issubclass(int, A)) + self.assertTrue(issubclass(int, (A,))) + class B(A): + pass + B.register(basestring) + self.assertIsInstance("", A) + self.assertIsInstance("", (A,)) + self.assertTrue(issubclass(str, A)) + self.assertTrue(issubclass(str, (A,))) + + def test_registration_edge_cases(self): + class A: + __metaclass__ = abc.ABCMeta + A.register(A) # should pass silently + class A1(A): + pass + self.assertRaises(RuntimeError, A1.register, A) # cycles not allowed + class B(object): + pass + A1.register(B) # ok + A1.register(B) # should pass silently + class C(A): + pass + A.register(C) # should pass silently + self.assertRaises(RuntimeError, C.register, A) # cycles not allowed + C.register(B) # ok + + def test_register_non_class(self): + class A(object): + __metaclass__ = abc.ABCMeta + self.assertRaisesRegexp(TypeError, "Can only register classes", + A.register, 4) + + def test_registration_transitiveness(self): + class A: + __metaclass__ = abc.ABCMeta + self.assertTrue(issubclass(A, A)) + self.assertTrue(issubclass(A, (A,))) + class B: + __metaclass__ = abc.ABCMeta + self.assertFalse(issubclass(A, B)) + self.assertFalse(issubclass(A, (B,))) + self.assertFalse(issubclass(B, A)) + self.assertFalse(issubclass(B, (A,))) + class C: + __metaclass__ = abc.ABCMeta + A.register(B) + class B1(B): + pass + self.assertTrue(issubclass(B1, A)) + self.assertTrue(issubclass(B1, (A,))) + class C1(C): + pass + B1.register(C1) + self.assertFalse(issubclass(C, B)) + self.assertFalse(issubclass(C, (B,))) + self.assertFalse(issubclass(C, B1)) + self.assertFalse(issubclass(C, (B1,))) + self.assertTrue(issubclass(C1, A)) + self.assertTrue(issubclass(C1, (A,))) + self.assertTrue(issubclass(C1, B)) + self.assertTrue(issubclass(C1, (B,))) + self.assertTrue(issubclass(C1, B1)) + self.assertTrue(issubclass(C1, (B1,))) + C1.register(int) + class MyInt(int): + pass + self.assertTrue(issubclass(MyInt, A)) + self.assertTrue(issubclass(MyInt, (A,))) + self.assertIsInstance(42, A) + self.assertIsInstance(42, (A,)) + + def test_all_new_methods_are_called(self): + class A: + __metaclass__ = abc.ABCMeta + class B(object): + counter = 0 + def __new__(cls): + B.counter += 1 + return super(B, cls).__new__(cls) + class C(A, B): + pass + self.assertEqual(B.counter, 0) + C() + self.assertEqual(B.counter, 1) + + @test_support.cpython_only + def test_cache_leak(self): + # See issue #2521. + class A(object): + __metaclass__ = abc.ABCMeta + @abc.abstractmethod + def f(self): + pass + class C(A): + def f(self): + A.f(self) + r = weakref.ref(C) + # Trigger cache. + C().f() + del C + test_support.gc_collect() + self.assertEqual(r(), None) + +def test_main(): + test_support.run_unittest(TestABC) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_atexit.py @@ -0,0 +1,84 @@ +import sys +import unittest +import StringIO +import atexit +from test import test_support +if not test_support.is_jython: + from imp import reload + +class TestCase(unittest.TestCase): + def setUp(self): + s = StringIO.StringIO() + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + sys.stdout = sys.stderr = self.subst_io = s + self.save_handlers = atexit._exithandlers + atexit._exithandlers = [] + + def tearDown(self): + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + atexit._exithandlers = self.save_handlers + + def test_args(self): + atexit.register(self.h1) + atexit.register(self.h4) + atexit.register(self.h4, 4, kw="abc") + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), + "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") + + def test_badargs(self): + atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + def test_order(self): + atexit.register(self.h1) + atexit.register(self.h2) + atexit.register(self.h3) + atexit._run_exitfuncs() + self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n") + + if not test_support.is_jython: + def test_sys_override(self): + # be sure a preset sys.exitfunc is handled properly + exfunc = sys.exitfunc + sys.exitfunc = self.h1 + reload(atexit) + try: + atexit.register(self.h2) + atexit._run_exitfuncs() + finally: + sys.exitfunc = exfunc + self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n") + + def test_raise(self): + atexit.register(self.raise1) + atexit.register(self.raise2) + self.assertRaises(TypeError, atexit._run_exitfuncs) + + ### helpers + def h1(self): + print "h1" + + def h2(self): + print "h2" + + def h3(self): + print "h3" + + def h4(self, *args, **kwargs): + print "h4", args, kwargs + + def raise1(self): + raise TypeError + + def raise2(self): + raise SystemError + +def test_main(): + test_support.run_unittest(TestCase) + + +if __name__ == "__main__": + test_main() diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -4,7 +4,7 @@ import unittest import warnings from test.test_support import (fcmp, have_unicode, TESTFN, unlink, - run_unittest, _check_py3k_warnings, check_warnings, + run_unittest, check_py3k_warnings, check_warnings, is_jython) from operator import neg @@ -418,7 +418,7 @@ f.write('z = z+1\n') f.write('z = z*2\n') f.close() - with _check_py3k_warnings(("execfile.. not supported in 3.x", + with check_py3k_warnings(("execfile.. not supported in 3.x", DeprecationWarning)): execfile(TESTFN) @@ -1581,7 +1581,7 @@ self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0) def _run_unittest(*args): - with _check_py3k_warnings( + with check_py3k_warnings( (".+ not supported in 3.x", DeprecationWarning), (".+ is renamed to imp.reload", DeprecationWarning), ("classic int division", DeprecationWarning)): diff --git a/Lib/test/test_pbcvm.py b/Lib/test/test_pbcvm.py --- a/Lib/test/test_pbcvm.py +++ b/Lib/test/test_pbcvm.py @@ -53,8 +53,9 @@ # use subprocess asap 'test_types_pyc', 'test_exceptions_pyc'): - ok = runtest(test, generate=False, verbose=False, quiet=True, testdir=None, - huntrleaks=False, junit_xml=None) + test_times = [] + ok = runtest(test, False, True, test_times) + print "got", ok self.assertTrue(ok > 0) def tearDown(self): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -8,23 +8,28 @@ import socket import sys import os +import platform import shutil import warnings import unittest +import importlib import re -__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", +__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", "get_original_stdout", "unload", "unlink", "rmtree", "forget", "is_resource_enabled", "requires", "find_unused_port", "bind_port", "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", - "findfile", "verify", "vereq", "sortdict", "check_syntax_error", - "open_urlresource", "check_warnings", "_check_py3k_warnings", + "SAVEDCWD", "temp_cwd", "findfile", "sortdict", "check_syntax_error", + "open_urlresource", "check_warnings", "check_py3k_warnings", "CleanImport", "EnvironmentVarGuard", "captured_output", "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", - "threading_cleanup", "reap_children"] + "threading_cleanup", "reap_children", "cpython_only", + "check_impl_detail", "get_attribute", "py3k_bytes", + "import_fresh_module", "threading_cleanup", "reap_children", + "strip_python_stderr"] class Error(Exception): """Base class for regression test exceptions.""" @@ -32,17 +37,7 @@ class TestFailed(Error): """Test failed.""" -class TestSkipped(Error): - """Test skipped. - - This can be raised to indicate that a test was deliberatly - skipped, but not because a feature wasn't available. For - example, if some resource can't be used, such as the network - appears to be unavailable, this should be raised instead of - TestFailed. - """ - -class ResourceDenied(TestSkipped): +class ResourceDenied(unittest.SkipTest): """Test skipped because it requested a disallowed resource. This is raised when a test calls requires() for a resource that @@ -50,19 +45,108 @@ and unexpected skips. """ -def import_module(name, deprecated=False): - """Import the module to be tested, raising TestSkipped if it is not - available.""" - with warnings.catch_warnings(): - if deprecated: + at contextlib.contextmanager +def _ignore_deprecated_imports(ignore=True): + """Context manager to suppress package and module deprecation + warnings when importing them. + + If ignore is False, this context manager has no effect.""" + if ignore: + with warnings.catch_warnings(): warnings.filterwarnings("ignore", ".+ (module|package)", DeprecationWarning) + yield + else: + yield + + +def import_module(name, deprecated=False): + """Import and return the module to be tested, raising SkipTest if + it is not available. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + with _ignore_deprecated_imports(deprecated): try: - module = __import__(name, level=0) + return importlib.import_module(name) + except ImportError, msg: + raise unittest.SkipTest(str(msg)) + + +def _save_and_remove_module(name, orig_modules): + """Helper function to save and remove a module from sys.modules + + Raise ImportError if the module can't be imported.""" + # try to import the module and raise an error if it can't be imported + if name not in sys.modules: + __import__(name) + del sys.modules[name] + for modname in list(sys.modules): + if modname == name or modname.startswith(name + '.'): + orig_modules[modname] = sys.modules[modname] + del sys.modules[modname] + +def _save_and_block_module(name, orig_modules): + """Helper function to save and block a module in sys.modules + + Return True if the module was in sys.modules, False otherwise.""" + saved = True + try: + orig_modules[name] = sys.modules[name] + except KeyError: + saved = False + sys.modules[name] = None + return saved + + +def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): + """Imports and returns a module, deliberately bypassing the sys.modules cache + and importing a fresh copy of the module. Once the import is complete, + the sys.modules cache is restored to its original state. + + Modules named in fresh are also imported anew if needed by the import. + If one of these modules can't be imported, None is returned. + + Importing of modules named in blocked is prevented while the fresh import + takes place. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + # NOTE: test_heapq, test_json, and test_warnings include extra sanity + # checks to make sure that this utility function is working as expected + with _ignore_deprecated_imports(deprecated): + # Keep track of modules saved for later restoration as well + # as those which just need a blocking entry removed + orig_modules = {} + names_to_remove = [] + _save_and_remove_module(name, orig_modules) + try: + for fresh_name in fresh: + _save_and_remove_module(fresh_name, orig_modules) + for blocked_name in blocked: + if not _save_and_block_module(blocked_name, orig_modules): + names_to_remove.append(blocked_name) + fresh_module = importlib.import_module(name) except ImportError: - raise TestSkipped("No module named " + name) - else: - return module + fresh_module = None + finally: + for orig_name, module in orig_modules.items(): + sys.modules[orig_name] = module + for name_to_remove in names_to_remove: + del sys.modules[name_to_remove] + return fresh_module + + +def get_attribute(obj, name): + """Get an attribute, raising SkipTest if AttributeError is raised.""" + try: + attribute = getattr(obj, name) + except AttributeError: + raise unittest.SkipTest("module %s has no attribute %s" % ( + obj.__name__, name)) + else: + return attribute + verbose = 1 # Flag set to 0 by regrtest.py use_resources = None # Flag set to [] by regrtest.py @@ -355,12 +439,14 @@ unlink(TESTFN) del fp -def findfile(file, here=__file__): +def findfile(file, here=__file__, subdir=None): """Try to find a file on sys.path and the working directory. If it is not found the argument passed to the function is returned (this does not necessarily signal failure; could still be the legitimate path).""" if os.path.isabs(file): return file + if subdir is not None: + file = os.path.join(subdir, file) path = sys.path path = [os.path.dirname(here)] + path for dn in path: @@ -531,7 +617,7 @@ @contextlib.contextmanager -def _check_py3k_warnings(*filters, **kwargs): +def check_py3k_warnings(*filters, **kwargs): """Context manager to silence py3k warnings. Accept 2-tuples as positional arguments: @@ -542,7 +628,7 @@ (default False) Without argument, it defaults to: - _check_py3k_warnings(("", DeprecationWarning), quiet=False) + check_py3k_warnings(("", DeprecationWarning), quiet=False) """ if sys.py3kwarning: if not filters: @@ -825,6 +911,57 @@ return result +def _id(obj): + return obj + +def requires_resource(resource): + if is_resource_enabled(resource): + return _id + else: + return unittest.skip("resource {0!r} is not enabled".format(resource)) + +def cpython_only(test): + """ + Decorator for tests only applicable on CPython. + """ + return impl_detail(cpython=True)(test) + +def impl_detail(msg=None, **guards): + if check_impl_detail(**guards): + return _id + if msg is None: + guardnames, default = _parse_guards(guards) + if default: + msg = "implementation detail not available on {0}" + else: + msg = "implementation detail specific to {0}" + guardnames = sorted(guardnames.keys()) + msg = msg.format(' or '.join(guardnames)) + return unittest.skip(msg) + +def _parse_guards(guards): + # Returns a tuple ({platform_name: run_me}, default_value) + if not guards: + return ({'cpython': True}, False) + is_true = guards.values()[0] + assert guards.values() == [is_true] * len(guards) # all True or all False + return (guards, not is_true) + +# Use the following check to guard CPython's implementation-specific tests -- +# or to run them only on the implementation(s) guarded by the arguments. +def check_impl_detail(**guards): + """This function returns True or False depending on the host platform. + Examples: + if check_impl_detail(): # only on CPython (default) + if check_impl_detail(jython=True): # only on Jython + if check_impl_detail(cpython=False): # everywhere except on CPython + """ + guards, default = _parse_guards(guards) + return guards.get(platform.python_implementation().lower(), default) + + + + def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" if not junit_xml_dir: @@ -932,6 +1069,23 @@ count += 1 time.sleep(0.1) +def reap_threads(func): + """Use this function when threads are being used. This will + ensure that the threads are cleaned up even when the test fails. + If threading is unavailable this function does nothing. + """ + if not thread: + return func + + @functools.wraps(func) + def decorator(*args): + key = threading_setup() + try: + return func(*args) + finally: + threading_cleanup(*key) + return decorator + def reap_children(): """Use this function at the end of test_main() whenever sub-processes are started. This will help ensure that no extra children (zombies) @@ -951,3 +1105,13 @@ break except: break + +def strip_python_stderr(stderr): + """Strip the stderr of a Python process from potential debug output + emitted by the interpreter. + + This will typically be run on the result of the communicate() method + of a subprocess.Popen object. + """ + stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip() + return stderr diff --git a/Misc/applypatches.py b/Misc/applypatches.py new file mode 100755 --- /dev/null +++ b/Misc/applypatches.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +""" +This script copies the relevant files from CPythonLib and applies the patches previously +made with genpatches.py. You will probably need to tweak some patches by hand, or delete +them entirely and do the migration for those modules manually. +""" + +import os.path +import sys +import shutil + + +if not os.path.exists('patches'): + print >>sys.stderr, 'Run genpatches.py first.' + sys.exit(1) + +succeeded = [] +failed = [] +for dirpath, dirnames, filenames in os.walk('patches'): + for filename in filenames: + realfilename = filename[:-6] + patchpath = os.path.join(dirpath, filename) + srcpath = os.path.join('CPythonLib', dirpath[8:], realfilename) + dstpath = srcpath.replace('CPythonLib', 'Lib') + print '\nCopying %s -> %s' % (srcpath, dstpath) + sys.stdout.flush() + shutil.copyfile(srcpath, dstpath) + + retcode = os.system('patch -p1 -N <%s' % patchpath) + if retcode != 0: + failed.append(dstpath) + else: + succeeded.append(dstpath) + +if succeeded: + print '\nThe following files were successfully patched:' + for path in succeeded: + for path in succeeded: + print path + +if failed: + print '\nPatching failed for the following files:' + for path in failed: + print path + print '\nYou will need to migrate these modules manually.' diff --git a/Misc/genpatches.py b/Misc/genpatches.py new file mode 100755 --- /dev/null +++ b/Misc/genpatches.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +""" +This script generates patches containing the Jython-specific deviations from the stdlib +modules. It looks for the string "svn.python.org" in the changeset summary and generates +a patch for all the changes made after that in each module. + +The script expects to be run in the jython root directory and there should be a "cpython" +directory in the parent directory. That directory should be a clone of the CPython release +against which the modules in Lib/ have currently been patched. +Only modules that are common to Lib/, CPythonLib/ and ../cpython/Lib will be included in +the patches. +""" +from StringIO import StringIO +import os.path +import subprocess +import sys +import shutil + + +def get_modules(path): + modules = set() + for dirpath, dirnames, filenames in os.walk(path): + for filename in filenames: + if filename.endswith('.py'): + cutoff = len(path) + 1 + fullpath = os.path.join(dirpath[cutoff:], filename) + modules.add(fullpath) + return modules + +if not os.path.exists('CPythonLib'): + print >>sys.stderr, 'You need to run this script from the Jython root directory.' + sys.exit(1) + +if not os.path.exists('../cpython'): + print >>sys.stderr, 'You need to have the CPython clone in ../cpython.' + sys.exit(1) + +jymodules = get_modules(u'Lib') +cpymodules = get_modules(u'CPythonLib') +cpy25modules = get_modules(u'../cpython/Lib') +common_modules = jymodules.intersection(cpy25modules).intersection(cpymodules) + +# Run mercurial to get the changesets where each file was last synced with CPython stdlib +print 'Parsing mercurial logs for the last synchronized changesets' +changesets = {} +for mod in common_modules: + path = 'Lib/' + mod + pipe = subprocess.Popen(['hg', 'log', '-v', path], stdout=subprocess.PIPE) + stdoutdata, stderrdata = pipe.communicate() + if pipe.returncode != 0: + print >>sys.stderr, stderrdata + sys.exit(1) + + buf = StringIO(stdoutdata) + changeset = None + found = False + iterator = iter(list(buf)) + for line in iterator: + if line.startswith('changeset:'): + changeset = line.split(':')[1].strip() + if line.startswith('description:'): + for descline in iterator: + if descline == '\n': + break + if 'svn.python.org' in descline: + found = True + break + if found: + break + + if not found: + print >>sys.stderr,'No sync changeset found for %s' % path + else: + changesets[path] = changeset + +if os.path.exists('patches'): + shutil.rmtree('patches') +os.mkdir('patches') + +print 'Generating patches' +for path, changeset in changesets.iteritems(): + patchname = 'patches/%s.patch' % path[4:] + patch_dir = os.path.dirname(patchname) + if not os.path.exists(patch_dir): + os.makedirs(patch_dir) + + retcode = os.system('hg diff -r {} {} > {}'.format(changeset, path, patchname)) + if retcode != 0: + print >>sys.stderr, "Error creating patch for %s" % path + sys.exit(3) + +print 'All done. You can now run applypatches.py to update and patch the modules.' diff --git a/b/.idea/libraries/extlibs.xml b/b/.idea/libraries/extlibs.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/extlibs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/jar.xml b/b/.idea/libraries/jar.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/jar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/svnant_jars.xml b/b/.idea/libraries/svnant_jars.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/svnant_jars.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/b/.idea/libraries/test.xml b/b/.idea/libraries/test.xml new file mode 100644 --- /dev/null +++ b/b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.xml b/build.xml --- a/build.xml +++ b/build.xml @@ -123,14 +123,21 @@ - - + + - + + + + + + + + @@ -145,8 +152,8 @@ - - + + @@ -186,11 +193,11 @@ - - - + + + - + @@ -219,8 +226,8 @@ - - + + @@ -295,6 +302,7 @@ templates.lazy = '${templates.lazy}' python.lib = '${python.lib}' build.compiler = '${build.compiler}' + jython.use.invokedynamic = '${jython.use.invokedynamic}' jdk.target.version = '${jdk.target.version}' jdk.source.version = '${jdk.source.version}' deprecation = '${deprecation}' @@ -456,7 +464,7 @@ - ======================= @@ -528,7 +536,8 @@ - + + @@ -618,9 +627,9 @@ - - - + + + diff --git a/extlibs/asm-3.1.jar b/extlibs/asm-3.1.jar deleted file mode 100644 Binary file extlibs/asm-3.1.jar has changed diff --git a/extlibs/asm-4.0.jar b/extlibs/asm-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d63075eb7331f7120ef25603a2ade856d12f715 GIT binary patch literal 46018 zc$|d#1B@?B at GXjtZQHhO+twc2w*4F1w(Z$t+qP}((fw}TJIVW>oOf^1-RY`yCzVvM ztm at QKk_81r0|J7A0^$|c7o;PQ>IMJ-0ge7Q|MLRLi>nFKODjk)$_pzA_h~4fH<8S;dq%g6bNlW;spTk#c&SNGwn2 z6N2a9rAck~FZB2MoC^tqGdYG(h#5eFJ02H9Tw76wq25*cAHi=By}@Jx0|6z00s&F~ z7rcYB1*3zpwV8>lhnX>>k&7Lpu)V#5tC6dfgT028iOqORwkb#l;=} z8Mni~*PkyCLwxjLbB#FYF6~q$=4wcPrS|XSr%fwQRo=$j(bC={FaPtw@>tDI-Q}Z%cZgY^->rW0w_XVRarzh;{E^)SgHs2calGkGWzUd7cxrM zGqPe$6IIW{qAZ}H!G!@o)4~zgGQ|*t;kkzO5Rr~Q8^I-$s6t3E+dFa)s~}}!WFlvx zQ(uy=D*u$K_@?N(l*xL;VK-3LHRJnFi5}%tYXs#rI3jw1&7&0b=d;IYUqL@<93Z=_ zUXse#CCpIl!NFFW(&o*J_n$(3Mw9L0cnP;E8ptfbS%={XX zrrez~1bt));FcfSIq&g{Y5g<);1I-2mcsyOi;9Gvq=EVZ{m=YvrJ0byKmY-mApikU z{lDZ_)7i?^?0=o at TCvVWc5-cGD3QS-dfo7Y_4 z8~2RuyzMDTjC=Ud9jmwH#9&A1$XIwaH<7k~6O_nlx5{C{?k1-M&l;4_!)6T~CwZc?<=tcc+b2dWYX9>>`4#Fx52K+RU4~C0}>?@jzYO;r6)y}^=12N!|NraVY5wtUoffT zFuUOfDr^4!BRe{032yKWz8$bPZFJUAlxJC(f(a2f9y-xH_j*qf7f4n5l;;pjZL#Gu z!zRQR9B?>CxO+H}D5NMR=tC&ejwr}-p{X+)j>2=eBqi0sAu)ngOc)e88a8yf4(sv0 z at GP?&=hoRp9JCfXzlCMGO!iaV%R|pse#8KZV-w}Hv=lcmrKMAN-No; zMg#n;9g{K-0g&ubs&pC zBC}3mR`IGD4WG1M`Iup_O#4#*buj77>Ne;HpQgmj;*AKk7^^uPe)o?fmoTq}Edu4} zb%l~rwPAB`Ihw6HtJuOs4#jtfarJ5%Z zGa4%wmIiYQQ;k`Ld4*Ah`oRbeL{@c#ekmbAcC>`8N+W!Hky8S7im;h?N&Pp?3(K2c7A-+j#zi{d!C+Mq at 7p3TlOu4w`i-ki at q%THORla z`uUGDZuGdlb2`l1!{04d0PXFhww}w{oblvMin-H{KEvGMC}LN5Akiwe%?Om~zYr|v zx0(GaHZDN*EwjjwT<@t at S(G at i#cAw%Wa`bQb<@K6AmR0D?R~!8w1TNW$Y& z{tX-c&hp(D!r_u^OHd5P?0{HPYG_NFYLShsQT)&H9H8p)q7S8)u^gL;{gbUHTd_;F zEitNS4lQG{lQR;xM%1vdMER5YZcWQ4{G6q%q-RcKSf6VPv=o`;xgkPmoP0)j} zuj`+))tN{rwRDF6yWysW1Wm8DYk~};ewg|t#-v%Q9wtWRH#5ECH@}1ezpM7ivRT!Q zK~l0~rkVl{4dq3X3UmfdcUsjoWh#ScDS&}CwV-mbK at 2<~S*E>kQ9eCYCZck&;$TXg zW-oElO7w(HUxVhRY?1>$pHU?$agti}1nobMUD>2Nd_KKOVKB>DZOUeOma| z3kCh#ApVf|lNrCvugg-v4p+xDY{KFt>Q4BCL<+m;Pn zjg=Aps6X5ktH)*Sp#?UmXNFkKP^)s1sOJw;*nE#ua-QvaFH$l@ zq6MOM4G{e%nurz2Is2(U$qe+am^F7%Tu^XsLp^E5G<`J+|y z#zv{d9VhjIujvj^O#dXRo}!pyP-{M411cCu*1R{&Oc~G27+qe60}3Mkn%MUT{BL|x zKs9m%0t5v8AEyxipZUbq)!E9}&DHGxLnN^(%Bm>JXg>_FK0zF!0Bcp2DHM#9Nfz)H zu-1$PD+<-o40Ao#2qtg~Z4=MCzV}1X86b|0_jA$u at 6^0zm!KvzW%u{l-Z$Sj-aYQ_ zy#T)*NTyJ-kYhwP$Hq7ZEbp(NXWN14aM(p#UtQLv>Jb7ei$Bvi2)6He8BU^$ zruTeOX3#Mo at 1DX`@&;VKvfuA4|LV2Gz(eG5%D~oJNMLtuaTPJP>z^$vZq1!O`ySCV zQDy6<&1a+SEaF*ZPbZsD(x2|3%js;&FBTc5a!$k-li53O at 1LLEJ8d7IpLCQKfN}sU zfNRc^?>B)knu2Q{APa2~ID-3iRP1x$!Q4W102ILA90$UH20_BXW4a0s{su-cfH7Z> z0zvHD9|dJMiGqx7r{JUAYxPG4Qrd^!N6LUjB1)a3{X-IDQHnQ>n+NZ{hw;vQ$%!TC zue~|U#Hb;8?VL4Jk}e*&C>W>Oyyl(Reo5x8Ol&^F`HnwXFE_8tui|tba!i0UG(-#{ zuMJ*jI7F^<-s7}DUoZq$^ieYqR(tdtD4G0)ns3Ph5pJ5He!Uge-5gO9(=c0%(qP`z zy4GYaoQwq!T;{SfzAC3sd6#BzVDbo!Nsfx3i=DP12DsmSm3C)8TUC+7#91M0;~Z4^ z1{N03Bp=}zl=QeF!F}|&*B6J2fuj<5d1*IDF_AbB{@g#3N|#c10%e{8k+Cm40He?d zE=F=mE4MH_+j!RTNVkS(rqBRRI+pn|6rfee2HO$eaO>gvfd3~#NFB9FLDJypyvaS5J4Q-%_F!FB>7Pa>@Lf!NlXlskIs|po);$G^zoW{3JQ*zYq*n-!35G$ zUIoeI2%GLAPQ;arh02rZ5IJM=WL>H4HaF1;2=eZ$((gm7>V_0uES?ro4_Eg?Lc>xU z*-mnsPz|okzH~Fg7T&)b&@e1;L2`u&8yR!;c1i-0haV$yM%%{om(n&e2*!3+COeaL zNkcLm?S}L$SOG`I32V2yd=^SOmN~@#0o}H9I6db-}M^ zQ19t at rU-aqc^6v?*l22B;b2OMg|SUp>ZNzEC11od%kX2In1vgXne@&9DX|)y$hv_7 zBn%R9K~5)-kZlrmPH#1WSuAmp5xaHEefR1$h{cq#QZ)zBwuCVbaf2MYX`|#S`^6yJ zwg=!GO8!~w^rx~RYR%jeo>`7~)upNf;b*v;gdKwV$`CP^iNduMndHDqYJz}>)sN$k zz;mRlqMbR}mhY%0M(R?YpR=;fn at FPlf+o$D8Q`ox!-B;g9gh at P==%lKI2T>`^;?#| zffayJU3dOEK)#c|&?5N(yux|X>oq=Gx)4q2O$#)M zdB5E73+xBYSCT*GCI1E`EZrUmp+?{hni&1X^S#zI)N6geK2LRGRfc~xzl&~~ECnB4 zpCgesf^AcX#oAJZ|28rQXx%>nwwdWX{}6rsZ(yWakwxeu1Ok$g00JWYKY~&8|3;vS znUU%L`uWuI!F#H$q at MltVtq1yOp^0wxR-)Jfg+ZpfClsJC;K7;Cc}Xu2L`jwCB`O3 zNy?B at vjw!o)z*G1e{Dc?M^;{4YuHtWK}Q$4>#nz12Q1s`R=>`z+Iwu>xOcbNko(N` z-p$Ajf at yhtc%JS0+;X4g`P_D%<$azGw9oQ;;Q(2usw2>00fz<32)P7;>;tVp#_5iZ zjpasy(v9g??}9u;1QlBg(}o;Yf!nQ#+ea?HNc?kOa~p>6`RC5blo5aaGqB_K-CYN8 zAF+?QtpdQ^RNGu$UB!zV^MCv4`hFGHV=w>TQo|;>2rvfHpflYv`X<^< z0H5j$(iNQPPNv_F at a5#WB_;_@(?N}u#Tr9O?U4%8aL-#Wi-j@^fOz#q%%^+Fzxl2= zF3rxU39g+OXKN{+*+8`I!CkK^-GcpkHVq#WKLhTnK5NsgBEWlvtgoRaqm=T5nYMxw z(8*xN(~=uJoG<@rf at hhqC=GxS|1lUq>U|}a$O&08f9Or+1hR~qNiB-u=(ur{)}+ca0Vm$ zXC(eaUMx@;hK->dx)Xb!NI>egz`DyG^)R at O0yuF8h zv4ewsT^LleP$n;Sh-~5Z&e+7z%y8=3%!pFRAY^1`B^Ob)xoo)&Z#fjJySa&#VoPuf zc)13&z3v1mL$)gNLgI88JKvR!8=C$>gUk>z*D}>@j?7?fWb6h~980auuCucGBWgf) zX|u}VFhD+w48Ik at htJ>rNz!;A+~VXU`Fn4u=_>EKc7NN-Ia1^&N)_D!?yZkl8?uTF zaJ|_CPtU%}TPDoT=sLa+(&OrKwz;=)w6 at -Ab)RO zq53sZUCA$Juml%1l6Hub=pSFIVPi!u8a#?YK$3oT|ATy0{SKE>tX~G)3_`j&yWK>= zaS%r&yTiK?p%(98^!jrx0ys?84x4d1JtR%!sq$Vs<1a(HBi_V6jgR9a7m>;FOh`BJ zZvy2vK||Igx+=Eh?bOszRBFLFdE;~=XW$dFkI}Y@{JKqi$lAC6lIgdZy(ilxEim&T z;irUPFK-Kmif~Fs40o}?PuOZA&}Cx5tiFnczmDG at Zj$=qJ at CUldjB(?;cqOQ{c-F4 zMpgspN7y9D zMntt3JIz=5AnyQ%q;s63wb7H%+D1n|z-~bGJ2=CetW9tDp1qoEP{YvS%+J5E znAm7a;(aPMNtS at M%T at 8-h*xy2#$apM;RmR`6$|J&QP1gfuhI(dqG=>{cKnpPan0bL zjrD}f3J>%}(@3ow{kJGrGL%-O%b`CSsg at YRp0Y!w$*BxBh%M47ajhtyph9B^vnuM* zg;%Q(?wY|POWVOCC2aPT{#1D=jY=(8-dtQI<*LlM!WhG*^>(SZXD!v7!hib|+q}Ms zzrJXxlq}PRzrmX#SZ(OSSY72Y8T0fGIMOj^LPJVW!EW?rGj<+K*>jzS*LNH^ar&;n zkL@@P!b@|;bRLx8<~a@}+k0-pm+#!i;O4mvx!AvF;r=YZ|M3{&+;$v=x7fK?w0|$d z{aZT3F;1x at RFELV46INP+OG%V29}1pE>)1*Zw`XbqX)irbq~B=EsCjEF3P!5N8S+8 z&jfer2)c3zW>1Gw_o!5)OzHi;AS+`QZ8yyivCbSR{e29?DM)@1Y10hFJ(6$;7wB+x%?BJ_pG> z+mHaacicfg1aCJkIAZ*`K^A-hvU~6jxrm60R}ZmArr5-S%{|n2$c(xn%u06{V=$%a z@&b(rhoMhb&%DU|2sbc}i+hmi`2%sN^Lu=)f+3H}5B`dUgHOZrdz9(r1G7uNFdly( zah@;Ml*@b3 at s$I~lFfJ{j35bogD`Zk)$@DQ at udTHt*W7`28{?#%V0tBdseO5p}9hl zh(8I90njHrJ<_oEw3dqpYb^v0%1 at m0MMHf;sR(^xv~KU36>A536(78os|Rll!Vv+K zU4s35_&*_H-^e(w?}{kDloiVdeTJn74nwy1KX7(DU*M_Ki|yNX0I`#c~%(AT8*=!n%upU~UaMy2CX2>k;~ zi2kV=>qbF(DpPWQL{Ci$J-K6Y`p1SbWA;dz*M=>|V-t&YTB8votwpQ>M?@`2L$(lO zkRnRQ(9|i)j-ESwkfN71IIPbG->Wu=2TDhFzaQAoD4@)S$Pth}Qyz5MjOepqO$${+ zHm|Vn2gZSVPSg>X!h?hH^z&zZ@|Wvsq3I zy8+`obS1oe}G5s==K zgZ!azoSwSW77PLgSwqDNc4ia72J-9=L=-{8(v$DwGPdfEVA+Ie6U`a*_-q_WR4se}U5UF~GP!2_)961syiX^s#gOFL zU>d~y3J`jM=D at h`Oo|?BeYN=3rCSw+*sCpZ1$O>VYUb8uX-N1T;ICm4c^fWt_k{(g=cR zCU8`o=sTKS(aOd$RfckdP(;P;cn%eEZXK*k^n?hlQ=L=o_QUb$>Qg{CB3tz at 05a3b9u+mNK2gBwf?+1jz0cOS|`u#0_I%aeg7PS z`Rk58IpWOGuw1S|%Q~g2u1`E;aiMU8a1{c*86J!bVwcINWTqOvgop1)ga4*cXocMK2eetXmat^Yf%ml`Q*PKuo0awVhF<0z&;CnTyUz>r%9Idp zNucs{4mP>&^Kd7^j@L zczB{?%apZFQJX|b;0`EEDa5zTLf3`{YRtr@%YSkvUw^Y29)??3jyO z at kj!7w(v;m?S)U}8px|=?18 zUr8Er%n3Jbvu#MuHC*PPUt3jef86UnG{VQ$1HznR at ERRUXxFa8rv5{LUzmCD zLPCwOyJM+hL|BJEntNH$I|W3KXJC%$+30#c`3%E9a|lFuhKh9E<(H0GF at 0>Vk<-J0 zhb`+rwe<`W{>i4lI`5ib(ytDb8`akC(gu at z^wJi}N#Q4$AQr at TXh&NBteD31d}y)_ zT16{dJX%oUfcq9g$|uoB$`dLzBOkQrZ$&F&i+Lk1{Ga4&k8l at Jreiv6U{02wen)~Q z7xo?$>Ua at S=AI`eTKK z?tEd?lOdcQXrR1qA2IIG_Mp#M*5&ejXWA at 9NjyKN(9iV;wrVYL-%9Jn;RG2=c zs7D{jlP(z_PVuKqe%ltuh3N3l{DetRPWVpoC~t)>y%(B@`!y?I`_!uY9%Z;;{`qP4 z=uYvKM at l7WjCHizlaON?Xt6}zeme5E2wsP`KrX{=6o9w7Fko|H~ki)EAy4i#c@ zi#aDu059gZc#%%!;8g7!UkrlaX0aYv6E#kY5x|0tfufK+k!1=DbsI^zs*wo{>c5%P3QA>L)a$*D1kq;qci4B1oHOJB5w2q?tE^rvD#3j#+Lnn zUz;Rl>NfLh-HA~>6r#`a{A^%8!u$~zbZp_j6$o=gFSe-RcSf%tC^#_Bzpfp=2g3)} zQBroJz6TsyFxk?sb(Wj>w^8`^7x-Gqv`K0(haXu==fboI?~d(B9)cbQdiTb91sOzF zW(Z61-DLQ3*MWf;50UV%(dayYZ$j%e%I5UGz(H{Au}| z7Cfb6&N3I01P79NfcM0RuW^&lL`gdR2AvM2%z;k9Rw#cJ?B9PP%`w^*`x>d+|NPe{ z0hHa-FjHoe6K0d~1w3g}Sj{Q|syVON41Q&Jkp9|mzfd33HP8Yk(8nPUSo?FjhGpfL>l~@t$Zs9dSj}?zbFc_Q zh}1ch`#$2+R)xKh6N>$;7b|b2Vh4+qP4wS|&orpK3=ac?F4$1hcAw2&V{t8{NZ55_ z|47o(gEEtWnjVSO-aM6V%{5;$58Rw3Y at Jzj@#mA`nIdFGWsI)#`quSNlgEe} zHrd8{wXoA%*D~M9-2&MUZuhQI)U+r>;kgK`ZV!4 at Q?bv_fa{&98?g#K<&IV79F%L@ zL76zD;&4O z^JxJ+6nCuh+~y at a;luxM$>*MRBe<%LrZU=^$TlP+r`zS*v&)U;Dh&Ajnp&e#YFy30 z%BF<3xipL<4e|>+$d7-3Lrj37MPFPPvoI{aZ;w&rcCSH_i8w|C1N&&3byFBdwQsgw zn3lw?;fISnClx50EFZeLYlFyKmrb`^njVJfw`q9rOcxB*IAydVG|w6_xMl$G%zKCQ zu9?!grl+*VO$$q_I_2;pGrgM}%*_D=w42+3+EBQO(yC0gI-S!Ak526kh&tUCoys%m zYx&?Y#8V at BZG;wkN{D%ed;3#2a74bqRi1w}uPYhRneT>eYbgfG(3#uAwiRePn=V26 z`YITThBVH=cv0sxM=Jg>8jG(2sr$bL4c#Z8>1I#TT`h_-$o1Qa*UT5yV>~y)F7V3f zbfDNh?CNtGKp>j(ldsXG~eqINnP-Vjte~_`DYC-r402_>954|`5?uX*`{Jy z3}ViNlfJWz$MClAW;Eom+VUXjzG|D$+y?i|R`wK*Cw<>R{`sn z3ax(uwY8P2uzU at Z2Q18!cmV^E2LTbkBsk}>JgAdYK~7m;>Xc_)4O{SeNOJ>e}@I%LB% z3gdJw1_68|*~55Az1c0qm$j$`Q9?5dz~EZ#;{2g&N-`E+k)Lt`lL6&2(wUDj5>N0{ zWyjPGHI8XuAGMEZQhB;LJ-j(ZaRI+n6w#C;wgrc7=4Qwi`^(15&7fBt{fS2^-g|-y z>ol}xD5aQ_oiA{NdmiIZz`FY|JB{lVh;PP=IiSvycmdvYU z=yIQanK$HO&!OXp%v;`?rUnj*IIC2`l||lGM-ZN@;5n_pe>LRJv at zgnMN6i87|+s| zpt}TiW0;Fl+aISSFZ7cQI|sGqbV0vh23CDj`1f^h0XiTVM!rqO{vK*{qK)!TdxAw%~eK6h~CPCf)C9cuMGQQil( z<{DbH8CG}Q(Y=w1=_6t=MBRmsqUrKxcc`K4*9^Vlwr>@8|F`b*0Klj}eoCG+?r}O; zL8 at 0ueU>KAIdEZ_4|N`^^Eq%RDc#vlxL zgpsJP>@SH}Gu-hVT&k-IlYKYpD at N#-T=!aGw`*QO<#Wa!aJ=7vQP~_TI^+TqG zSt#s7A>rkeY|DLd5Q-*O1xpT$#){)SaaE+RYcT&qi%Na- at jU&LcJ;Sp%@QO?y|!I- z%T?x0CBdp=kU-pAJj38`r24MgLu1q9o^gfeR53VAbpDWke07TBcFek}?Wns`B5H32 ze8(-0iC`0T9g1&eZ^Xb8mk%CeR(x~)rrL{$!Uq|*M|>lv9ZY@!6NNI~e+S#BQuY?4 z232jR6;-efB#O at Box&y0*Hri^Q&TxUOoC-*ke=?2d!SG9T1=eJjGXx_Jm!O3rC%Wr zP?K{4^&9|h-RnV$a5tD at +i+19^^+>g9!F1xUHmJc0Ubhn>7B{`5H68(JUK04PVovl zNwZuok at 3{KLcQ?m8BdxTv>?UtfZtB$yiCNQC_w1+g;Y<^!LG9yd=nL$e ze`E at FOJE8+r(bN&T_T;-v)mH5$IOaNoVymReG=2198VOc?n{cE)TccYLwTn4c6t3d z7Ocf%ohwua|IfaXABpKkTq;smY4V1;fkp9n6yCn?>&1k zo_;H(@y&Nf^4^f at _f;@=#W1 at nM*QmcGBDK@!JO($m5=;2%SvIld*~~rzw08wcn z<~C4&+Bs*`Sw=U_i)Ja=HfBst+A9x1Y1Jc8CQV#PMpiV;ReZU zjWu5arkYEvfjHO*EU-dtV1BhHMd!Iopddb~YodY0EK^0O;HBY z$m%+;8Pa07!AaBQJ7{!`D77IRbFxfJhnWr!DRL7o?K96i%R<%kW#p(C<|UcFf3p!F znCUhb8xFEc2Hyr6O6Y~GToXPgO7+{>!DYm<0(6-z+v(J&e9b<~D+#@(jeW2|Ft%h& zi++cS4X(ldIbW9a36v~4-Lfp3m|6zd6$`0`rbQ&YyHnoanx)lXDkou1)u*N`p3yu5 zdX|1F#c2y2b_tkrNHnquu6(H8V_I1)wPo%vM$d+}N!#KhWO^PytvhIMjkjGaWkK3d zAIpmkl|H6LmHPSrZa^YrX2}TpvKi9m>nJ>!WQHpsG+LH4M z_^uv`){k6VMfm&L51gT5%&5)fmao^`v=l2($e4kW?qT`hZ#9eS;+hDKNkrKi zn*O)p#<-tC^$1g!CB}(I&J?B7VmW5Z0q%1{ch)9M3fm56{RU1Ads)2ta|PO%aE1nJ zKgNH@!Sn}T)m&?D{u}Xs_WxrTB@^^OfPkLCfq=;V|M&m at hq66aRbLTR8HvArr)}PV zN=e9CkSe-~p8l%cI5vtngH70r=s-BX?WT+&O at E2uy`3qM{9!wXxY45||58V at oo6#>iM3Y2FK7JoikRVD zIk#aqb=?1H+>-m{F>mL}vhD3*!_wOOSIfr^XXmwWgA>176O$|NxkdR>67Ox)QD9wj zR=51AuGziIyN at ub0~+^|3n!zKAH&7<_6gbrH$c{(vkJVPZpz(ttfkfnSLTwcNK`$G zGVUM>(8ol-B1RBph1NLgNE-#Bk$jwrWzSl}x^2`k z)i6-Nl7dYGmpzGN6!i0m%#%izP~HI3L=B~aL7Y=q4_9;y8YQEkC-e#O!%R$o6rt#ITVZDaKWMs6k0YKFh-o6=Q1D5RV&QNx6 at g*29FsZE_1#yHsQ%K zUC at cm2k&!Vsz)+0IwJZ9&i{W?ryLCw{W18 at 3}pU)RHyv^>hfE4VSUv`Rs@^tySqDs zW|GhuaPvq)v%zSrm!T{{#6ZcYgpn%PWwk`eHex3rMs(Do<5yQTYF8?#Xs|{wiMoZ0 z1M3ZMwydjb?d)v)+WxkxS6_V0<@$kf5I_3q`@adYTFmCSoK9!5x;XgreV&l|L|R7I zuK&faKGr? zZDhbOn7*;BR?AAIB(H~g%n4IhcbxT1iAbW#^hyB8YF8di4m{z*nSBh9LDA9j$$4cA zVMp+H1aRX273RxkkKpABX%f;&T^XJnbzGVpiM5Mey<{V-YqPaU6xVm-YU9Z&tPgy7 zIpUP_*E`r24z<+CQ;VDpEBG1=;h=lfD_{bobHPM6FCb6@`Tyrc8Ms7HBo|9z74?Z~fvSZsBD*AUfEt{F>df&}tLj?*H&NS~{{I5(MZ_ zH8oLhQzDz2rm+8lHiG7Ih2*$;k)gzf8OJV2 at leibTJlU~#N>eJT;H)G|;u+d)5ri+-9{W}(l-MAn!z&xKH(G--vWUe4jCJ z>{@ZEdf~0DYAR~#=}F2DvzX51b=VC8J$=MY+ULanBhH3n185D`snPv|oBYvgGF}6| zQl8&wIm?|2J5_zQ46~RVdimJgft{etS;@dgTIAlZ3h*9l)YVZKFI{w=VZCN zc9ga05I}>iHyy+i7CjTY%r3ISyGo-e%bT3D`f{wfP*0TVP>+Tmf?DT{&;JPi+OUU1 zg^)|35de?HVVZ%)@vB(Ja)|^Rt9+j4e6)A)s2bNH=qjSldBytNR_X;bKSLY1D%zQdlA+l+oS at Iv$F{YvMp#5>ws1~&5 at E!( zFcUI%iPs%>0R47J*}8G9YRw&aX>Q(M+Um{%?C9GE~3OaR(Oik z))u0!Y)lRHs(R=U}~7< zGwHwAEzWab855kpHy=+8%T)0rCu+og^$`*iVSz>YtW7(dW z2YGVAW95?7w$0m1-CJFo at A~lu>-jeR4F7wqvpH%oZLd2hk20x_x{;PZS+bjf!dyL% z3!T#>NLJrvXRfB<1iTRUkLUYuq{Gb61`=8PfQEa(i;%dh?& zUNz6l(P9(Lj~2`S+@;opZyTpAY*kyxKc2FT2ySEq~Tw6_%~hW!0KJ>#+oGe^}?x zbwR at EHzohpc@dAZQ at D_eW4B;gE#YCcT)D7=vs1jl5qrCGE)aXWb`Bg%ux!~a!OP|? zQcTJ2EmK_1ez{=TCoyOFj2fG_a$b(}Emuy?2FHZMgslXVfmi{t41{sviXrZ%BT>r} zR-s?cRJ&w_u3x1J%6_pdb>+r`*#OayrsKLPBnmVHObP^HNM?v;$Yw}qh-b*RPt`9b zgj|4i&))A8$kOlHFDC?U$g$7X&({yqe-X$E)EWpO1m at VNuvgZ}V^>lcXyV!x6SsQd zoZ-Yx*MS$!P#zWt0W^05Gr4vllLf(r;0RFw+~2!bSfH?1ikDkgBq4+v==Z|E==M*5 z&y_tRK&X at FJAuZnD|~k8Lg!vzb|#P`w~jPlL9mD~x2_!3?H}`pTNkh+X#r?n4>TQT z$Oi at +XQ4Z-b-QwuLblQIjgl)bk9$!YYHNhjmbj=}ba7fihJt>@&1eik88r{T2&?O5 z88i>S#0k$$DXQyc#O~O at n@g8i`5&bqg}xG2w}0r?eH5zYXG)*&_|;2K`#!+QKlJ#8 zOLz0W$oDAVuK)PU?jhw~%=)jiqB-Y3DI|Kt;Rz0q-3SiQ(Fqbs&4EvShLMzku)wk4 zu|Tn4u^_P!xlovZ9nlOigyQs}xL_OL8t{-na$qe%av&|ihkF at YF>^Mtar#>WuYd#}BMT342 at X(C0 zWb>nO82u=+dY?PFmSlgCEkG}U;R7Xvz>r=RF^wzJ|DtL7RBHO}Ol6vOXhIRt+7|85 zUK at iO#%glSABaWB(t*?f`>xTlB_d{kR)Fcl3n?z8lt1k(11U<&{DCT#1+N7jikzxDQbk^-Ru^H~vYr$khq z4lMFHffXPbf~dT%i`y(nsutiH52=c`zt&);cGrKs0-A|D4;a?8npgNa9>Y=G5si_;f5c7G*fqG zNjSl+`jt2P)s?x^u9|_2r|YYe5ePBWW|S3-BhcoUOmc)_#z^j87}cWmI~m^NzYtlv zyF~frz;|j~xyIm@?H=B8a!SvnJZDbC#LP7p at S4^ya+yQ7sfz=2XHq&?rQ4b6Z70{+ z%WB at qYu>Sj#J%8`aPv$U#RF!{=Q9_2>>~bwUZGT}aG;O7ouo3sb`6({n~V4wV~mX8 zV^|P;N5!e-q&L3UGpuC}bgUa=43B)5X(u(nM*$$GlR7$99G{iytZ?E&=>-`G*x=9n z7q4^q(1)lu+HmU#vg|uvw`EExFr6BQj;(GzmvJ$9Z%TE9M6VE7I at TxPhtTKC9>&3O z*%vlGtrtty&dJPFptBK<#?W69?6bsG9z;j at j}^OGxrha#0s0e#0p-an^CHgsb8~7$ z5sgkx1ZkQi7E062I2f2w#}$H0c%vVEB4<^MANed4pD}TxVmj6$t<2}d^QeqgbXIQi*(;rbLhNT1>4;= z;$-69Vc}Itoy~F{li{=lCTbZZNg0FFr<%R)S9<_H?Mn9Tj&v`-&9Yxc^$uXiw_5s~ zI|3oJoGbT9aqE_-!g=%eT^Hot!zQ1@^I5aI?boGRQQ1>D;mr}jxcDTIOu1T|JC3&~ zf*X`yX0x-qYuBX=rwnZWxt~0K2#yE zjYT(?#GoolX4qM1kBOHtl#rhCzunR9eT3a>B;9hqywc8j at fiY%)w*ACFMo?2&MLs$ zX_G%uM|N_pd^{Fk-_#s5%^fsFdMJDZm3q5beLN_A_B4AD-{#MOwx1kDdXzOU2Zsqb z!gkDMBRQ|iioGzOsW{tasnxZI&z2yG#GZP*% zOXQ{Y6W#&+c3Ta*hXMUGZKND#X9&yJrFns4GNh7Hm$QKuFgzUIToFC?mf$p1W~RsK zSUQ6oB>3oeSXt;d7xP&5Tmx*>taQ7^9O=eK>r^K4EI2A{L=rh}t8#=hC6mrf;(2fj=pjI z=ZK3R6 at YZn9((cfYahX#cHWJ##>{jWNu<5Q)f;?QwRWtgl&7b1vpoAkMs_xh4RQev zzUfECq2vbeHrcGyL at 0*fy$5RPOC{>+mzhFs#coH1q at a@H!oH z&z3!RtK0p@|Ha2UHt7O1>zYs7wzb-}?bWtz+xBYP zwr$(CZQGiCX7)_Pd*bZ*P(Pp|v#!d#@2VWDs-eroxi-La=3x(0ak^ob$_6T(ZA|BE zQ%S1}zutPOcrk8L5r+@`;4()=cvi_A?i|AReR*h%%^gKKn7rN&OmT&YmdjWB`j!3H zi%vSEhkRhCbI|Igf`5v^mwW(nk at mQ!UZ8Uj{)r0H`$3r!a^-+~m)zz4$`P@)-{R25 zw6$pBr1A))8s**p`K+_ at IFGy)Xn$v;6PjpOIjq(f>blM|O!=<9c-Szud$PCy-9ibb zl-E~UuJn^lL)B8OVy*UaE4#jH7C}51O#R8&znTlxQ)@bqb47OabU&aFaZLO$w%8tG zvVA&ayM>i=A8miX@`CM`rDN!?UKCqAGvF z;vjX0Ia5^sby7>i=pMT-mT0wIFKt`{grYe}s;d;-7!V0ffB+0k`$Y^JeA>;O&a za-VOPWa+)U2iqH#+x>M#Em*bjV7%gRwVybQWnUT--v${=lnAneF at CYN+!-Ahep zd-Vrp##fo^b6yc|2jNVoh44y0-8(dzH5&JYXVcA2!9hT7EoKOLHRchiW$pt_gYn=B#hw{$Q&E?{PDQwARw)?fwJnJf zey~2bB%KedUbt%0{da}q4Ij=5cih}F*pz~Ga2bz(Gzt64$GTiz8qPX$(LX~FDMvb#@vMrGN>r2v`=l28gUNTpf8VrW)066=Cs1{%7K^D( zz88a54F*?Nt1Q;H^)y}mnwz>(W#u1YuYr_c<%N&atHKX+7a0C>`>3|)T{_?`BxFz`fZ>ZwW&Tte$HQG`=G3oj?Pvg z(nBg2^Js+Z-{bocd6G)VvTLN;{Wfq_LU$V*N!%y}2;DJj z-})Nes(uygpiTcIG~Hvgj+=!xPc)gFy)}c8>-cjz)O^21r-&TZ4l6s_7}eBz=0ozCB3}iiqs)uL*G&FRDc8u{RL+P` zmh9{!dZ+#4wLQ3do}JiY)%#0$M|7K044g0(`kj~!Cw2vR&)iGG)L*@XCu(COE0J3W z!mkDPVfJJ+YqOv&mUyzoRL60)q7>`Uh^s;eSoHhw(wM;uLtmXE2G0ZwIolH4p>NQY zu_ChyZZADrS-XLdzf0)4J_xDo72RG^c!S$o6vU!46!tZ)OVhZ+mzpOO_Ekf?FQ!zf zW_3>32`&i9m~<`vvG3 at 7LpmH{+o6%MZZ?|QJV6Wg%h)$eYG${OIN9CV-JeHl>9S5s zXzxey1iK5&X#um0*HTLX zsHtCwjx>$^*&!ZJ4}~`#Kdq;mW~gaiH+z-pf=IESg|*(ttdVRRZ-#d*?{RI52?D=h z|0z#S2|Vl-0RVur|5~{JM|o1z*zCW*dD}$sLJtTaiuE%3VHb{wH8m>3yaFPk)gghn zKevscpcsMRJn5+W2SD5 at 92#6q-5=qmjCy)sA^Nb1`ZZ~0LESQwHM&XGKB?wGxsXc~ zTx3Lx9r0EXs)M_9hKMAeLm8|%MHSBj?fzg54+S%%x=})FlpGiv4-|cuL+lFk3qTx^ z^dUOIasWl%>lc>OX(#e>@Pr#=cRGxif at Cej6qe54LHy_LP@PIz%zyv at SK$B28W6KE zu{Qn>Yak?EN^U?NF=VzmNk^D0;5YWjx;G;vz*olsh!6MnBS=0-EBDPRqee~)Ac zks&@^1tT{T{guq|?a zM!_R^LYdOZ6`}(8z?Z>LxzGp|;3-PzPB`4b_+cfa1WH$tMW?e0jW3k0GDnrpkR(P@ z^g|fHVNP(Ky(hnGfU4Rb$ zw?L72t|mHw0s!>T|C37oe+TM6r`KrN;iw?~#9Xggt;*`8qGm}gdKuZFv}#Lbg|e_S z1fwUc5K*Gm9!7W9cjH{S2(^izRlEUp9mkjU+yNA?B$N*rCBA{aa3`j2HsJTT5YN4t z%}i&eyq#jYJYG&~dx0hi5A!xIWlQQWHUj7u9Sm1q~sdkXiZOhp$TC2P2M z`g=AgXKi%YrH7Ybd8<`eJCmJAvVmnL5~|ZJ7fhG35k^tDho_Q~EM3|Q(k)5TKipz} z7Z-35RVH!OY?{4Bx4T!iwRvlXg3gtxh7WT;<>E(U=eYCFGdL*;ODv}6sM8r8D+J6( z<|<1HGA)Xg3w`uex2wvmBFaxFVzAqmo-4A+KtnrpoBHk;Svago*w zX-a~lTXmEtFDLbgmNt+!Z(FJmUbrvfdH;~o)>4~R7c}$~W`Zp*t(b#DSJTk0c#s`o zTmsiT(<(kRK{v5z;sEpMZ1?!t{gm{D9F~f0yQZi2>9U_KJ< z54sT8zTH(I)V|+&A|knC{RvGJ%o>qLq-WF?KnThu8bUPX7`}rR_Cv(b==>KzNLTNg zz7IX95{d*1j$}j|YL4gtp1zNriziC>k9`m3K<4c$Z2*Md)@VK!t84ZSXfT1mscqCg zmuR|f>JDlUdXQ?c6gHQU=gA140D?jp41%yK-9B)o{!L>yTqLHAOc-pA}if_hPWR9rD! zd<)`Dbw~WhEi3NO z%x8RJX)QYtz1zb`u8Cg%U(lTasM054sx4v1d&&|u_`Bom`8U1?CQ|b~YWC{m(lkwj zOf%=EQ$VuA>>mC{0Y1~Yi}9g?9Nq_t2uNnJhjr9DV~+I zY2*6hCJQPzo$v$kA2)PK(!{W%~Rto?Q2akEl!tVXRX$)Yix)u)^N(qST`f)p5z<4 zg~!`GBD(-7cqH4@%7E&rp*}g<7^2L=w*ZcXU!sH0f1?&$JSv{fkzuNs&OWVDsX`T| zk#If4uSL8tw??hza{6zgDCVIWUD-1A#Yp1f%$nHG_}GT)0<_GO2o4IJM;h&{eryv@ zPp)f+A{^CG-DSyq?JhVkUYi=WE+=mZey?a+tmMB6jb}@LfEC(Zq-02VEf!CXILJ3- z2OW^77sc)VO>NHLe8K!Du at KMLF(hCC00$fZ0Pp`yEJp*I|Gqh^)qU)hm(lp`b~kgm;jnE65W?ZTd$OL1B&*LRBCyidykc2+e>3>S&<>9qJ at GrFsi{2fgM3 zew4d%r6i%={Zz3=n?9hn>BsT9;fGeMK(a~Uuhzr`?TR6zvqMVD-3{x|qv#2^xq7s> z3Guo{viUCdwS-MY&upZFyh${CRjS+bc#)%u&B$#PqQd2JA_d6W=GMr5)6Z)P zu;Ymmz!sdysvh?~R$7&sIIGFQiSr5W#3~D`yPKI3B?a*b*Y(P3lHvuWt^8=mXcyFy zPbG%oZJ;!}$ka1R>&g2s=Ij@^nGRJ4-jBibv{R%}UaLU5zC3ohWG6 z5_n}-XVB!Aife)(P%)6W!C>* zT>cn!my00db;KDWm({!f=^zOvI+5mu$|Xgf%1Nk#E}hG_|M(aYEETE#zE`dy-)Ji& zp{h{g=;mlseXPCF-puw7&gf6D7=@Q z(7b`V?bBD&hDFxq9<=OBdhD(2qWfY!b*WEqe0^?x4OcWT4^{z&ORl zcBwm79}KHDZ{@FLb&t-$pbekgge~cFK7sU>pz{!T^}SGWeTaTp z_CNbjfo4#?LU&4mxkz7Gd!&J at kh*Td1U$lbO#QxrAhr_yk)ZS*dj=e50k&%=0r+b- z0UTWdcQAqMknkRaf*YV$q;HJukxWKKs9-)0UOlYJjwPENn$J8csiy__=gt7hO0}DiHcoZ}^L5#(;(We6$ z{s9LHH{hS~DMU6x8)W9Oakr at 6y>a|h8?l>5ix!#H*%>v7%+iw#ZlP$#Y2+vjNiBVt zQPlB_Y3kEy8jRq*_)~c-WuVR>in~#A?P~E0sXg_este*aoctrZSbbVTKM{K(pK&{N z&t?UswRx9DjX^UkRfZu$8Ed$PuXV(RZj8}uHd8WF#$ZF}3@j^yn zH at I0DYmdWPy(qi5)wzJ_q#y=*?)aoJvMh;Ytdhkf!Er`9&Xfsoiy7JdPDV%_R4R&p zw+yHckUfy#5{ER%KTR(?;dysyl!d02;B=@47xv`~hTTE41=v9+NX#H8ckNE8$XH=8 zZ*gM#J{&mF1EEA&ld^P+(qQk#Z7J5OIKu;)A&2<92>6SVmlqVzZynfZmzFGUI(W_1 z)V9(H%oD52W%Mk`&%}&VpBz!4Uot_{1KwCLpt5}oDm`p)Cg4u6b?w6TAkYXn(pc)w zz&knxc`Eh9)>&d=@KjvaScQXkgmC55$!{B3(%6t4aXQS1$}Y*%IKVn?`9F{oSs=+a zPaAe3A$*{#4#SZ18a2^z8*|yhdrxL>QTWK8*!mBxkw at a94-hgs`4_m1CWa(TALy1K z5P1vwOia0~7rLd!UOn;|x0ynG)PIZ`Y9bm3Rf%YYG(EvA z5t~-T5Fj&}Jk}zllAe)VC#sb?ZX=S0CEfy*Zp1GHHt38KpMV#39pBxugP8v*b4PEM zLs_scc>bx1ee at _oi0=WlpBA+gy%5}p4$jQKjQ;JN-7Sr7`+0-)cEkUHTF8z2iFvXk z+BI8NcY)51Q~H)PBaq9c_V%n|L#h?#)ATVpxVLRMW8%j-bp*C`FD*)? zj<)IY?nlqPmwNLz>9y7L)2NGJ@4%rzjMpQnqOMsJheBn?T$apj zw>jsGi!p4UQw~iJ2gg&m;?+JU9O%$6n^O*$T~F=085Z(WP8R0{&okGW=ea^7Mt}AG z<&)(ibCjbF7k at a{i-}q5Mcf6=GCTr^^F}+`G@{Def;F%rqiAK?O&}@ z+t?`c8ySjl!6T0EX}`#T9ig>=rErCqrHG~t6TjQnkTLti2v*{D9}YoURWQ4ljOr9l zn2am0U6&~nf!!5zdOwcb15ZlZ``xguhBlZj3$?7U;UR~&dYcEVEL!L2-Vx*iIit%&`y$sdhw4GGCHjNcy|;vTK_dt4 zxj%+;ve7Ni6y553`pZ9LWn(Vliy4ErwT=tE(#kJKF4$P4)#Zu25-W(Id>F4AmZuAB zJVxHJyMG#a7z{3uuSn6(mvy5ES@<`38W6I|>Iq2O!zRvC&PJ20bp*Bx+bd#6CDG<| zO5>(cnQlacYqCHI|fB-&Ooc`3_eMMoozBO#=Ns2z~ zvkK0%NE^b=DbV-F6QFwL^O^- at CP zkmPs6(`>1oK-`t6C;ji*UBE7w9vLtIKn4l`;Qt?65D5cYW9$EKNaL>Ef;{RE9c_}q z^1z6(@RmN;<^TnSEbd6yG=$_*y16t9pL!k$x+)pNYwKB}+{Zu=*#NRkRL_Sv)@*l( zs17Sz`|kUFwo{K&g75GBIgCFK8z%51S5Og-N+{=cTc=fTQ+3QWTXk5F?xu|@=zAJb zxm~s~JA$igmTpMnvR at sJ=kw9t at 3{Sb+mDoQXUpXh1ll2`u z3l2O;VUUsUDN|;|^|#Ncjl6uJTB*42n1_SD+Xw95MXW8?50}|ayW9CT29M3Kn#Dpc zM}l>kiRLTcNu|Xfp8eLO(rJdNgWvM5l at jrqCM;6-BYiC0v!Nn#P{2_O!qLq+ at 60Y++18B^g zLOWB@`sr3As8e7b!3Pj`vHQ3xp1cYTQPy)`|Gw;nW`!T}t6x#LZlo|up0en5vKAT* ztz`KNY5z1JG at NLG9vi&iFx4U at g|63*Z5_fKpLGkyMVB}!$;I1FTvD39FfVnz z)-UNs>D>7kS6PG37;W7l4$1#B!w%eOA5(w;fW809GJ^k~4Et|M&PPE;3RnS^m)`8; zozX`_NybD&0iuo8oB??Q`n&9ECv2V!r|mS0 z`?beuhap$*mH at yO2etj|$r~Wg`AkXWv~Z<+fXiR_SZ>8LO~E z{kGg6G{tWVJR;k!YI_51?)6+iPY4fs at E+lI-L6ur>L`~H?N}`m>GZp?268yQP)H at 8 zt%O$2aU!ID#eS at g_a`#|3wRL(`OnCo5z+%P7TENE#6yUTNJb0>3~|_ at EQ|x!6az at o zhN1nYX+~*g5)3pV`UY$fP|~91Dh$zo_CdetgCf5A<*H^)b18-I|7`%1Bf%@oZxiMv zVw0l}bu5l-L~6o3R(~GSRX^m%EQZkK;GLqCTi?K)11J|FYt^?&Ws&VHHN<#VMLFm+ z<2Y^Mq*|LGwlu{KpjK0I+=r at 6)HiqyuUwV_Pmh3UTI^pQxo`;A2Miz*&1|adB()v_ zX*t8h{?dS{D;je4H6T+1sU}I>FRu;OlTMmFE4+dKZ<081uMQyy0005;KMDSl&L%eh zFEXV5*U-uzIvXsC!X#q)&4)U|#eIb#cG_b~O(7PALm_tA{1oCQq=+kL6GIk8nyB!R z5N;G!GBVY0nC(xJFUkW>H(Tx`apMf99U61XbpU*>be?e_m-kqHtbbGA$qNP^Q ztr2JA6>yJC1B{?9QY;=Z#e;wGSy~PFn)4>qso^^mRi;kqYX&sZ at W`CK8Q~{NQs?gj zVq9p=E2;(KLY}0isTn5bOs;jc<8$gqE&c|$B{5e_`nc+0$SR|a?bbwsV5JW*7C?fF z&>6eE?3n_Wg6aQ^;)^6sB+)^!F&-|b74l5yHMNwtjU`h+y=9pfnQ8^PjWYJN(F9*gsH9&IlWuwh9)FC?Ir53B z^0kCxLv``^+MHPiYYRhEs4Ll6E;!&@V*oK{kOi9JkfY8`jTZvRF|vFv{d$qUuniFn z*oH0<%NnYu>N@%^^DrQTx+3-?Feo6pPx~yDkC?=*l77pY$QK}A%@o!u5^$15WPe(y zuawt{4`d6%o$;We!90PvSP`LxV&Cx=_4NJtmMGkqE6yO?*KNQfFdYmpl&4hwo)Blz zjHZ3-AyE^LVA2!MaA*!u7!~{jJyb_BiaHdHVwOc^RG8S-uGxiat=hFzb?O0-Kf)v~ zK-}l6IaNOJ&o^p zwlbWfUi#EWo~Sgbi990m9U7Pmcf|nhh-PN8A-#>wyGc|?z8Q!~u!OKeyChIQz+HK9 zlc2#r`3*+tv^wJuYHW=zow(v2|1 at cI2Kk+z2) zsP}PPuFxjZq^&LQe{xCAWl%@bv2ATfGx5dypFb?nCv at +l5_wF9NUgI#F(lrtl zDHnT_pO+PBBMv+qJ!k7--qHQ$|Id^4JDGA#1_l6ZL;X*RptOOZiS>WGOv+M9N at ke8 z at SLfCM5NvYG#8;Qks?`9i)mFSM5h99g&2etu)%~FBLl%S`z8B zm#_k5U7Smqzkzg|=R+0==Je!0dUiRrsrs3ma$bGEbsskQd-=fTqAQVk>R*zAL)Aa$ zx*Vn at j-rLw7!5I;Lab|pO%=6DjOS3 zCWITwg|s&gRu4ZoiQ~_5njffNq@;o#-cs3uE@?fJC!c|UA=$al#X`de0HyiYm{5~ zE2o8}6ewbq82X2USG0P4J;6d8qgruhMkC}bOCbWChMUVKBgA~3M&sSel&r&e1Nowr zUR6jb86TWUBT;&vs)Sk8$bfwFgLYZkJ`%jymWD1PBnmWFfd*TOdF22ZtK>X0KlTZE zmRU+K#k-+|mnM|RBc>-SSf9=a{VJ>5d4*z{^Ki0#ph|Sb11f&nLGisSo%MmF#UK+z zZ#FHm3ns$PMIXwma(B|tTRi1&OS^z*&0KTWO*n?Qo at Qg@BA_ zI97UN#MDO0Vkt%kh8L@|`PtH3alY2zCN{j4yZB%{;DU(x3OWxAJ1Dh(RDN_0QGgmX zQ~>a)fFls>f^-E#IH8Ry1B9!8Lzn?#Zghh<05r6RKsd7k%H0dY>R$*ex%6faOz>%s zOuz`snDx33a`K_R8s-E$2%F2`J#mLM2o^f~%@OL$?`b~~s|zv1RD{`ccgO*bCHAF! zMm$)SYZ<3UAj|AM#?WUUnsHkwA^<5c(W1%vKL!hFVrh2le`G!kfI120u z at d;e`3M32GmO?Y%5B8FPMoRuibssjyhiHqugF3-WTr8fJc|e_}ShL$-Gs?lH`uih1 z#YeJy{OP}GITqa}jRZX(|NPHZrzd*EUB;@!3CsxL-o$L03cAn)H at ww$UcHF3uO?qs zb}Pdn>w at i%)sjVRXzUPeN}(dtyws6#mw*jV8Q;B{eq5UA@?s|kg}J;8|9!66%HlCn zhWOZMC$1U^pV-f#V at II#;~jNG%02`RGx&A`eR)~#*=kCPY>v={NC-T6?bCKL@$lW7C z83xxj22WOxOMcY$r6EYTqaxXTDB1Z=-fN~7hQwU=l}pq@>9O-dr-7~GR1D%4l{K6; z&fM`d`*Yi)*cQpUu+mhQKRW&3>=iWKcft;!a`0cglxv99Bh->*JIr zKK5(MSJ{{mcE{$3FcMuJoysgIu}4SGZ_g}S^78HD=+{{N*328bzbB+0YF*+`)U)?y z>gNiB7tqoPD&@e9hnx*nY0w at X;LTkx;_7%##&lcwHK ztaEGhd8+2U)6t}r8TQSY(WFC{>r at 3xqDJblbwm|V)roae)fA9*vyM1FvboetxCGgK z!4mn2kXI-uS-*hc0^z8an)l2>i4%D>J+3u8s%^g61AG~_&o at CKSop-~pSjh3cc at Md zW9#Z7wy0{_Fz)I96R at TT0$_;$)$26F005-_N5IOMIGfx3r=6djtfRCkh8n6D0M}2G z1|XBq1W>Y!usQT5C}xq7#<9r4Nk(3_-D~W5&+oe=InXfwd-)aG&;TYm9v-&vzB8o*IgzX at U|Ik zDvj|oW46aE&gAG)S%MQhYzM}>R%;Y-7<%(kqcv??ZGuZp%`a^C1^Aa6S+_SP`Ci(z z=P(bI#=WKVM=jD;axm0kpr4oq5}gDSb6+gStsA}%I6oEjy(jHot}7-6v}x9Dr*F|u z*L7hapI8=ZHd=sgU50mbUu|Q;I#jB$+S#-^(BoRnZch^h^Mo}f$Yb`8{=nW2NDY>~L!GYkeyWYNUYS z=9O-AIAlxjs^eu2+kF)aqY9bwcvcyX;Kn at ZJ-$CxRU8nc3stAJMw1wcA+SBO`;cyl z>@?A^k|d4w-h6%?Cj5As5u&G^q-ryNaMKUxCBMs_!E(~6B=avC9Rt7?nOfv7OoCE) z=)|ugbg9qbl;~H>s?zw)3370+v(jZvdYijwzh8}#|6)@VsvSYD8`aq1m|aGP`qGgs z>K=v9M7l^2xqoY)Sq|j at uXx!9W*I74gnR)a*piK&=@Jy1V)M`M}Xwhua#A at W!c at I9&PQptuHVJq} z`T~D4jH4^i578;$K-lnpNS2;i1bX@`!IvCtP=DQ#zr_X^5d2eW%iS=)KczAmbf&)!+kOPLg7NX~M2Ad&A( zkg*eb-g|DNTtLlCgwadEwF%=xanAqt*ClT;p{8uh`LzR8M}=a0Zbr+RBB92??4g|) zqjTd^x;pa4n;Zjqr-LRrjSr8{XPLkIuv(nA at nAri#z&0{wSTpsME>K%nSE82#b?Od zGk#`-uz4{d$9#c#f6YJAhm~a8h5H57v#`0x_JphW6kF3PMO_ZW1ga zWMu3CQ`!QV-0MZlW-ECj(5p6TmP{H!R1o#goJl3+BD(FX#unFQRmR`P&R1XNL2A?^ns3<1p;9H0YcSi z#9erUylt<#+dDfq#V>Z{O%adqI4gwa`r->qw&T>3IXbx%8sDzgpIuZ~BS)dJ`_DEy zhRs%W-Gm(#zAuhk%*a(~xV;QzWNds2dMa8>ZI>e|J~p^cqK=NTQrhS=cvW4Q)CRx; z3rNIidEl*#kB*E~(wiPWE)&m2Ff|x08}baYj^h|DYuJlyA4K{_Ux6 zx7R0NX*gJe0?p^a*f(Y{=V4Pj1S7vh5heM=@4_~Wsedw&6?CP0Y4_P%pEu;ZL*tZ3 z8-;YBm7kXq$JlN4J2B;NCo);@X2IY~?VZx-yfl&IU zkGNVC|M)Y8r2S6sn!4!ojF^&>HD$D^ms3_=B^xu{%<*|+GxIBG=Q#X}uyQpQ-;Q~y zG2udenW*?vr%j__fXc(#?%q&%(uUsf}s?$9ylYgKLkN7RbT(FPl7Gfbt%8WdkaXHjVTp~DV`cnR`zWAq^%;O z;^RJWNJJ0}3rZ zMXUdx6sOL}xuYx(E at SdyDu)b85`T3C8K=>4!)1bt6Y{D`W7mK-gf%x#drOJ0WJ8bT zygI`w-CyNdnI)C{`V at vT@&uz)vMdKCvV+Gp2Vrjd0+i_k3!mX+jd2l^hc;XbQrYo- z2gzf at r`sni+c!=7t+TkwVy}G6mC{4AYfo}bT%Php4`5W=Gh)}c{O9Io;Yt*j$i%@k zj-W+pSvC8PghiSa_mzo^j|!9Vhzyl2gjpq1u{F1uGnsDUfOtne-Zk85HukW8`@9zI zV34|n0qZJ}R>;rPmuo6tjh85qDY9}j7)!IXmh{j?cyXE2`$GnUjrPa@?$>nkW_XQ5 zZSRjh667vel*v?bD|b#XWEYq4=19xbT9W~ntTrvD`2>+|kt)$D_LXsIUl)@C?8CO4 zMMJ^;;qi}fmq;}_sg)%oFa`?=bj#tPj0p`%e9P&p3LHUL1_e)GW14;CVYaf0^4!ca z-SLOVN>%;lQZ*pvtv=l>jU=??vT#$?QdNR|jslMkfoH4(Q9 z6~-yM-TKD&m`^)aY`%J1TtV6Re+0$XBZDMa#z(m-?XxPs%em zNZK`JLkhBpDLIL&^8yn72wS+y{jKJ7u_7nOWH0Yfso$ueQgu3LrbfiF zdr}I>t$A9s=AV9ET=v!6E4}~(M*m(aK#$av0K`D=!QYx!5#3`hpBJt at E{Fb!B4m_Cr3|2sStP#Uy7tpKY4EgRgbtGy|A6P6CK_GvFs(^9flru=H)E=uO~LfSD-ZbEG+LQE+ynl zoZ=g@`x|q_wy2+I1F!{NRu2|TduBsT_5}3r0}3sKLUdC2iLe4e at N5teJJ%a>M(K}- z3Nhp6j-)kotG2GE0o6xIf2 zfYImcYX(618wSpqBpRe`F5 z)nV(?_C*8qAk-o5;QYb;?SQ{<`dR@!aQ57Ncz|7?Hf9MwjDA8NniPn0lzK9WU&MUE zZzUSgHadyiz>o4a+&tjD7D6Ag5^xXIPoOA38$e$%j@$#ZPZXdBP=~%-CY<#^Bt+0h z?PKxJ1X=;v0=Bn`JN0Ji;{==nM*(pl?0NfF0(!vhmEw4bF^w_e@<8)o_XY^%yb<$w z#uhO_F`*dX_YD291P$uxc)l}T9Vkh1A2a;J{uHXD2l$F*g_OmRE#-zbZ zjgzh-lb^g952VR2%4|QKmPh^f3GZ0j*QSx%<@ahXKh at JumR)-1Z=3B~?v9_Dn%M=H z9YbT^|kt7FqZa(DVI{~V3(Ah*P}!Q0Y0)iiC+%$l at u zlGgn+D~8?w>tuAw7wx*$HsGBLICT`^Us_nj_Z4u8&% zIk+gEtx)eQr69F6Odl7s$j!EytAD`g+CQl^@$QBAd2t;n*=Hi(izNyDnY z#gF9{ZaQU%Q at 951kDQ~Q=`hSG;NY8eVqDyPw(T;mdJpsTi*9;KOSszv*Pga3a?DWr z-Qc)(~-2Ub9Q77H`$I-hI_1S?W4%7b+eJ%0jKRJ41uNyjE8HcB7k z_}*T9G|IyRQAe*R5NlgPXtvohVJ(NEafMjgiT4YUUBX>+5W`rxTJ|&YazS75$(FI$$z5DJoUmi?nWVvCKB47Hiu!+KAlc@#Fvq^ZWZL3~U>Qc!hj ziVdm^bZuk|pJ_iiy^zCWo7tEW-Nk>wOK;`o6*)7+OU26S1jJD zb1H*Ro+_FnFs!aoa((PyDppHA4eGyjaB0vsIV#l+V*KC&+tb;_^o~clHY at nCC$Du6 zN?GKBtx{BXK}!3-8{#T)i9U}t!&=LB6Vky*Kdr!81f}S*NU|6X88E}{<1*_af- at xz zwI6SU{S}&&n)a~s1V35j_>y>T)=F7|T?y`*F(u+kM=*Z);$IRt{Rv`q+9Vu3x~d#W zEd#e}&_FY>b)vbBpHz?SZ1o;fIgX3_5?}V|#ZisKr4G^-SsonZXdK|VK@&858uic! zjYlzL<2|!2-t4LyDeZJKC3lr?i6JzHD5{>YzMSBppVoRL*_pz1jw7XcxMC2Tx^D&% zg=M%c>qcv>bAAgUo@>#b54|L at qLwe+$9$L<`%FsFP661bh`ckv8}ZlRht^IYAyRp< z;n#o92NQ$((=3C1WB3Xn+lQx~D-!tZ at 3pLK24QBVo$;-SwGGHg= z4`?l3VGS!w*%Y#MeVG-T(ijog6hxr{W5QN!2uqE7s3ujlcY+vt$??+7yS+G$MZwdt z421h?22nym@$CiLVq<&w_XdnS*HzK0N=-k&Q7sjjl>{J^)!Q}Ci{c^B933q%p6REt z5l$NXeH%hP?iCi=mdm8$u^4TawI*;3dbiq{9HowKioMvWJS<_B78Ew+=^IkVC)$GA zjr^iWrm+65;(t#5SEYh?CXc94#$BA`|nPG;$KCUf4ddLNv%-^9j9Pqqz{ zn$msxjChoBWrAIty2;i}%1 at Z8mHFn~abe&(E00X~RFMsUxe{{C5Btib2 zJnBKea+)>Wff#+YrP!wCsgtl#FU1(ImL`HQH}=z at rkU8;(38leSh0G(OkNRAS^-%I z$R{FB&EH9a5c9n4xRTx0qTt8w at qoGCw)bh=B7GK%IH?j*##;iX5DMBc;Flb&VYg^o zF{S+^$e~ZM7)_kd*yOpQgWPXs8Q0XcptVEEouN+FwfuxVzEX$Gt$&+68E5V>a(?hh zE9~YZiXE>}G?RRvk?L94+IRXmJ8EXzlav}vB~QhM&4w{UQ^s;CyVUvAKkz`sr1vtLfA=bX5wFAb`HzP-&}&#iO zP{PDz6I$DM4`Ji(Nl>jHzE5t6sE$Ek|AdHhaWGrkU)$lRx%>EmTHSn6lIW>wDuH}$ zWJ^*)UOaLA(R1#(`2xAYg@|b7Ow%3S;(j?qJkwov6(}yvTTsg51h;iRpm-S=H4eFD z6E{jPg|-1leFiHQb$*Il0}8*6TZ7+_l%zQ)MXG$+LiVU=d>gR}DLwEu2`M$6vAHmI zT;okIy5+8I^J0xY4LIy!4t;lhmUqBV-hx7N3sfy&5gF|yUjO{Dvh8EMIT)1WpXnvS z8+76|t7cxyYkeGIZ*)t+(O!!PjD^vXXK26c^L at bhiJtwYNY(nVwcS_MJ#q8K%5{Yu z_4cP*qvW|lQ}yVB(wBeb0+PP)$*SLPX^r?yr=O#0DeS1;l5pXl4OC)Q+^*EP(|uWT ztn%n;s52UG#g&CPR+`*rlVb=SbEr_uDSb)Nidhz=9Hn~YR*ih4T>UOk`C7V{;vB0} zVpZ%pOpSm~j;MG5Eq0Dv+kzS)KX4yuoUS%r2jcT(wDj_rgL0imC0`@H3F3W75|YJ_ zgm~Ctlhf50gJ)eJ-1D7aK04w=XBjinNjv;`(68`vtMCd?UcG(mG}lA84sCD+VxkBI*$Zw058Cy3p5hSnE(+TIeDjvH9#k5jRIbQd0wP)Ve&urs!nt~I;;I7rsMRc&O z6W-y3BZ|QzX#3Z7m&3`(eKuSuPqSJnwZD7h1(PF+=&y-)Q!}_&i$;2OB!wbRf z0 at E3r4F%~*%pbLX^kF)IqM+5gHB?l&4Xvi+Tap!J2ee>?T(f!?jQ$d~sy<-_>tbr0 z32Ul660|n5`Oa7AU~TrJr>G3~^tp)NqCnk}^Sss=5AS~5(x9e4xx08mndCI6P!(A- zgq(`UwxFJreD=9yb36|WBEGc`7iuqUfU}D$@jf{qyb5kZ!sGnDq1D9Ew5fU{<-(ti z#6vE1=N`^>U&J%ScwGK=c;jL(h5|RO{A$cYs;F?f?yFs1 zgP)l`4N=S9?nN3ao_nE-8`&nu-L at otH-s_`?F{khc{Id!HPXkZJqYfW@)D0#Omn)U zxMO`ot&)l34NSV@(b9Q+`!`Z|sQUhkOU~wB;!}u`W{i3FlO%P*|pALd-)XK(EhZftz>k&JnF1#Qp!P93J6?#*!VnXWXO zz0QfwK6eu4cr1nV_XyJwj;5}}`gZPd6v_Xqv$KF|<7?MFZK1dnX>fOUcPs8*+}$NW zfKseLf#SuByO!b_0+beahajbRfC9l!&-(7Y{r;TK?s<~zWM-}Tt<1{Wd)}Ryd7k?j z0+SwRH@}HpuB+T7i5s!z6`sbO&ztSl8!jr)_L>$EV~^akc{?DQ*lFrAp_rPlIC1E) zWbC}gPeTBC--RTDmZJD;^3-5wjoT1>h2{6F{PGDqVSyRJ*#1so z-i&E){CK}|LHleY6TYa&Hw*JsOxe;%A z-p!#X$847ZQ6UuZc8i8PLAj*?n#uPaWs14 at CvK#rsM*YdL9BDst6$%B4eo0Dqf%eL zpOUGsD*cgWa1qAMYOh#WVlPv5Ipz8CWWV0Zw9IXsaS1R69vupe%aHTXMi-WtJxjc& zwdFtDI_f)=IgkY9;aYx+ZY_(k>j^KXDR-_1(N z*^kFPL?OGe*(IKBN}GYDf{C{pT`^N^tTocnS)={Rx*oWI(z1;RW8+UT8qP_~SeqNx zx}=c)g^G`Z{pE}ooVk7Sa7hwOK*d-k_tcLrCXnIX3cZOYtAt9%o zzI%@Vkwt}v at nY#?y}jn-d#-NS<>AI$;8yhE9O&#L02Sbv1|)pZW}_$?|ATDL0V)X% zVPPK^?x8CeG2TNa+KcD)NmmY%kXcDBA>S>CZFsg}d-uBzcYYRiN*pL}6V-*`+VGX)B zr^?0XYuGlMXps7d>ryn)J at hGLmCj5Z3;!NfuzGrofGo57z-U8X3ANE*NGwy|c#nd| zDyUfXR!Y;%r<}sJthS`Q)@K4k at lHXL?dq;ISxUc{e9I|EzW6p^=1WFopJT1u;6b{k zSP?T0e@$;+`}ynlf?G)Bqo7_ z-IL;7e$Gy`d)eh_G6RWea0DqiPorQlD(y=WU# zcEa-OKHwe}LJhYHMZx!)`1_G6Q%M~T!=*`!1;|SciS%Bx6|Q6eg3WIe+5V&pNldOI z_#tlx7>nFJgcx at kXb|-7RcNN+iUy}s+sTX>koo;v=cnu<;Td5B+E`I*tDM%I| zSfRXf9ac3f(qJT!8j(`%XKi$>)Eq2Pd0z8-<>wC#=QS$(G*%d} zBasay-Rr&7Qj$nY9Q`5uS-rF;{ahe+31T+QooSqnRmrL;r at Ih^e_wF at B=j2X+LC8M zvdfyJaQngm7JYm-Oia2mN8G4O5u*A)yz|+Am#*BQdslIjAfS!DDUBH0$tRc{d?hUeBi<1V) z81U}3gE0rw7gdpQXmkqFp?Pn>;_yfql7Qc5K at g{)+cV6l`Dyxhsb*(S#X*aFcQ(PC zgkHodt5v~E=GR)kY7RG at hS!s{YF!)?f3yYEVb6k3PY$PD9J2ICeXe-OV^h&?3|UGE zfuk&O at Fe$lg{*6Xt~V44ST`oo$}P{Bj;I};h$$25KRddk*H&}k6hg_KG!M|yVT^j2 zB*R0LkoR1TeV2Em{q44YF*9~5Fh|r)(Jl%eR6d95udL~LswC{n-y+7(E;5*t{5QSN)<(Mm_ANR!!VSJJ82mPAprb#8t2f?`*U z!z)02yWu`pEkqC1PfRnZA31M>C4R8d+W*Lpm1JijO>OCh&$Q|1;`<@*np7LQW^kymeQiii|I^BFwYb|t2n)vOjRw*1VdbwxI zPZ;r|GJnjkvH2C&FrF>-sFkuk5+qA>;L`q5M;(v-E=1KwRVH7gW4U at vhxi7 z>n#Ua2iK5Whd&CyJ0rWq0_IzrOEoaxi#3KLg21zHv!8TmUc3eCr&A9jQt at f#-#W|K zSlR>e$>-&iv|2c%A25Jj3?ld9w!b#XSKPRe`lt8;1pQq$YQKe-3Q=|KnDbsTJ1tyU z0gEuN4tPV}?5(klDf at Ke^bNihm^M8aT)X(${Kn#XWj+LI72_n0mF>IF zI?8>_s(wvg$+F)Rl)ok9M369KhGGbJ{-jg% z at W{7g?zMIH8Y%(;0r5Y(K|tNz%FWuw>u;A%*kt&D at Mnl4?dDY*Lc?u)4eG5zC4avA zX6;8W!kuC0YbSs>PA6H!kTNdEgvP9O5NCOeNfHxtSaBH;cy_UI*m+sdb)1ni(o7Q~ zx)V5>>-7UvI=pqcd6$4iF~RE+9!z<`b>ENU6t4D*%2GDFjJhJ4m|AKYHz+z-mP}Lq z7sGR$XVFp+^9{lc14|SS(g{fnI(eKph=L{lgzS6z0UWDn4+zlmDOci0SrsZ#Y8e%p z2HAL6w5TTK;=5g05w5V0io?|GbnG-S5a)uhk21q_KVIZOwjm(PC-ol;WLfFcaFnCj z3$hI4SsCO z?MIVAFd=G|fcmU?nPr7#*=3bw>1Cy5`DL|bsb$4wxn

sC%7lv9v^`bz*JzIpmc{? zhg64Rhg^qhhfIfZ2lCGj;-GheiImTAWuloRDOPho@{2~kbQV9zep}NYwZMv-yu)rd z|D|q++N3g<^m!x{D6cfgWp+Lx~ z)M$9JmWd~sFFDf9G8>UaMPRMM=?ezi5+A8arJZwoSH_q3MTW$X{&z?U5=!(=08ZI* z2m1XhTdlaVOxx3u_#9Tnc+CQsa~w8 at ZAbIHpXmm`s`>u350P{wyz&&f#=@RrS58 z%0s2OU)^dq&Ul}Y-OItF5|hHqQD&T!9prV at Y%7vHmapx at eal94ua~8gHB_$iKI0&F zF1k~d&oHKmn*OCa5!0^yYWioSHmgoSS<(yG$oK>}$hATRbVClIRf){L%#GSE>ge#>y%vB~^zVm6#S| zKotaAmJzK6+s0K|?0QUqN&!G+wlX2VM;Rp>3!!4Fu{?{ynAUE8H6=@Bb}E6bO?efr z-o#gH6 at Ar;k1Byg1O~l{buohI71VZ(nWV3fvK3-?UpMW-dMGi*Ts!*D#7Lpu^_Q2y zO5m4alP#P`ZWT;5BX8>1)47uQIrJVpRm)$uD)x?E`|}fJ|Jb6wgRQHWiW1_+fAYdR zD6#D?vQ(PT^2Ya2-0-cF^L2<_H_jmzSuPJ>Y3K1h9-ZILLG7F9gnnFgXVt61Z#wl} zbR^kqvQg7UT9aS}=?aDlg|>F^Fp3Jae4cry`{r9gXjmT?xMjM zNWrSEcAZI;VJcaTqWf28pRd=83Ip!RC3YS;b+v3DlNsc|WJkX^y)O}Yi>oU=780({qzO zTzKWj95&CH%Sk~(d0_4b0uUY~Y>MDJ;}ie3Kn{cI7E`WaGHteQJ5MMHyZ$}SmJ-EV zV9iJm at DB9MZS_R^tx^EV7EY|J(MEOl8u1~Z=PN>1S87lv7?XuQXa at sQ#ocdJro;}Gxf^jXc8 z%kc{IuFenaza4O;a}wU+^{p~q{K=LT>$dof_->K-u8sKaTKJIZFk1LfCdf4B!c8(y zwh=Ejnh!!BWLn*&y{39V1#1yYTit#}`hk+N+v9nZkru z?merPy2%zdm^!~BerOC(aT*su55ez}gQLQ#!Rp~=Y`3&~kTzJ at MAdn*o?f?oES z;oT$LVnVUOc?9=3w at 6UzzC6G^%B-8qcEHd5h`F9xoZL5VIHu at k`mMp&y5O5$0kqmM zGo}u5)7PzL0c+pxCXvx<-(trMH-}hvohM$+%KZ?bh~4b6U9<+9zOTk1{Koe3}mE)kCXCPW=B3BQcMej8GLYPu%|PI!9*PKZpv z3&!Z6yft`#$pMvFm%tAuy(NQU{tN+ab#Ci*H8)D={%+jBf%R4t-W-vK9U>2RhXW!K z-h{{jX$H)gK(wG}m?o?koHhOc0Ke)Bp#fpsHiHMjAxt3BTYd0gUkDrMX>PL;ToxDx zQ-tY30iPZyBGe;8C~u`3o5Rfzk8y&z7DHG;Xtz6H%ti{14x&|h(ddhZ7rAdA6k4J$ z>`y9SC_e9hkvyVY}|?KoOAAwx3}h6Np}v4fGOJ15<`tMVLLO zpzc7C(1Sa}xxgap at h~A+Id})m at j@JX|1uDo1Cv1MCcPJdo>!#SZ&&^Yj1?;wg9HU%5#8K?-xvR)YO7A}C=jVo>p*M+?R3-scF1^Qf|uh+ka zyG7K#4CVtx!kpGez|FlJ1YKnNHzCkDa0v6QFgy at k`|4pE?APNIzJ_r8vJ20Y4Fu>= zhP%T1!IwQ8_`x){)KGz52J~*C;857>b at cExG&9EA-*syZYzdl25R80#20jiC(S at 53 zx)s3Mp*i47FbALuTigsD48H6!W!En+6GW3O`9a{==+SgxxBG$P<{8Jl>{;mxRS?=qs&=C*} z3IExhhC2T4|L5l990PPvmM(#Wz*;&;@!AD6lIdcSDU=$=J7h#yj284>{NkrVR(;xN z%|>RE14$Y^o$B)}PN|rfcZ at NDlKhc1Z%AyziV3XWav++)pAzK3*D(X%Ve5Pox@=eM zZW>zOsqMazNC-S?-N_9+>NLBCWMPvdy+Lb|&6H*iMUXeA{(xfrlqWPolBy1O9_0X0 z4n6LnEi|}gmU2~OEyK!8-|hh|>$q0~6aA#v`|f-^ zm%)-3DSiST0xSL zZ?#iH at h5|yE)cw*bZEr#j3qX@!svvlKDj#EMd#q at z7mP0cZzp1%TN#bwhTav?$}0E z`ZYR2nwjUqs~(PAAZTWzEy|y%QgoekB75&5czO7W0Hd3FZGP6>lW{dKq at h9^i&1b) zsFc_@=2y)L{vL}UquV^-Rw5Wpe*0owQ%LSX3tK`dB3AdrdMq=#$7l%<2caGcc%Ej| z`;mm-#qp=~)POl>T}ggiD053SnF-0MaO-*H1DJ73TIf at l$*P_a at v-ItS%X z6)0-sEw=<0YbudSb3m(<{;M`%98okS*xkkZyl4{C8;$~R&eg(>fJ z&c;8i&`L_Hzjz?vFwk>B)urZgAvK`S_pp##A3h31R2~ib_MPZ^(RlwmIbzJg=gBe# z-zEg}cpso(QU);1ga(D at 4^6SH0_$vCdTuw>fzP4em$;Z&rVaAHqXAw+W%Pd5OXm at Q z_26{`u61C$Dwq(GFB9wqQjONSBa(PU4XXdvm(eSCP)(>WHH1HoR8 zYTa9Nx?X?gY-|!;ds=&XgID9yIF$A at KPg*K-ZDGWyQ1shW-G#i-(oU*_XVPW5O*qI zQt&ruughr=ODo5fml1TzI8jUqB72IZ5!1 at tQL~G|{J71%M9i}JIuRC(+EiF}csiBt zOy~3#8E8zziBG%H(!-(%-sa(mD#Enin&FDd!FX4xI>u${t?d{y(fZmo+bOzx zluv5$_z|p%f1SjK6xS_MDl-ZYSrctP4|A4pU7>uf(bYrA!dNTtRWIc=W&`H-m*)%d zo}E(c(*DU(dYWD1lw&eP=xMcEAgL at Q7yL$<@i(8?-Zr7O#cLxI2$dSlXS))3a+H>C zIs>Z^B*Ha}dgrj}AR4`qZbG=;d#_ at 2 zFsU{aG;%6#soZ{)#GACS#s#8a`Cb(=-k* z+ at SAL{E=-PJJpIK2HxU^+K>cX?YPeGiD85+V1Kg!3dJ3)3EmLbhpZoXLGBYjkKx at g zjCM&Lm|TJ=>MbK-_4DE5J*{8?$79N0rLUY$dr)^=5ZR%%k)9p-(+pF9gCO^Kf7%|kS z5J%xQ&vqa?ySjuKl!IoT2o%@zis;auZV~p$^0$=($JT?}_M)5fXW-KwVOhmi&W at xn zNqC#MY>5XC3Zu$jkk{qpQi+*2p>PnOIwa2N`fyxyhE~6LEzne1ZxVfIo8K)pE&$g= z0C9QWJA?)Mw$JvI+MXZwG-bsj%!um>6Nsk@<$Q3q(5|*(Hn9=YonjF$|NgN&f^q+; zt&;bo;+%6?YT!?AyH{h}b%7?H>KV)G^v0T7sU1^uPx>}rGy8rqIA~vpwegqqe&w~o zB8$qF=rpk|*o0T(+?aB%Z at j<-*NWwGC6!^1{Y+C=L^`EA_;UzQatU21d^kQRTsYod zac at _1XL;gSU;T1P{$ju0+qikr zXeB_up3DB;Tq<%T&m8BI`QEo9gpr*Vp+1$YK^0(t8k}22{(F17C)cJ$&YKXYR3o|P z_vy9^^H#0%=@ti#!%3oj4YSYS!J}eki?rIGUzQs$+8VMB8)5w5w at T~paNcX)wlrdP zbwy?icv|w*bPe(INx#R^{!bpId48Ba at j9u+(%zgX(Ez{lx$D|Q&_{|(W(lkx%~M z_^e(zp{o4D+s15&Fq?|rnDv`V|I(pPwRB}s5U$>mr=A!0Mqg=IE1H5y4SgXY!{cxac%CCc%N!6`^CLYP zI}W$A>W8)}e%~~EfM&zF1lsqA^8gQ%nYKo>4qOu>ca9e0YmGR-)~!jV4+EB70M_t$ zUX$`vxGC^3$`k6t5b%XE&Ohj;mz4r0hKB5h^x3=T5=H#0&P=d#phBPWvM&R#_DaEp zwO(KWc`@EhLzZwr#fWREKLu+s%Chdf*D{m7hc;^j7ZJ~?v#XDYXRAGa-m{rS(M-EC zevu`#%uhA%+iN(yj-Qq44eRUc&G6`ar-)4V0-US1E?Hh54c^Fd at UfV-x=sY4oALIX z{|Z+au2&cUYy|`3WHW?b?r(U}W at Z!`0L&;Sz@(Y%;_3xpQgojaUEJzn&4O5tvq98q zz|T`0IXTPkg>PDiAFQ%PfXX%%zqDAjO1b%f at CYC#ksiAE-_dyVquc(N&x7b>W z{$ko^`+Z at 3P7}JG&IX|FjVddxb+m1m4u)lK3_-|SBo!SR$vbaM9;pov at o_)0?B(IxSJon?IL@!eK2vMPR5#E&;-(pHT&;WGSyqlzE945q!=UK*`Qt`RZi>zqAxGELo*-^gQ~ z;~)hC5 at yl!M3Mz9G0Cd898IfJOGWUB3G~4biy&nz)Ev)+6$iz4$g$^vBDDJ7nn^?A z4Zi%)U2bO)p!gAO**%sW}rGUD!T6 zde!B{@$)X6@<&by3B-z;eLBb1t83zdISjWKG3kXAtEVfq!Rof*G_mOi3A(Svk==*W z8LdCyqfJX2qv|m_6KBRD_I(o{=!R5F56HhtQ#;cN9!$9Q-PN>tTe*ESbUJPc&KUc^ z$xb*rdNp&=wErctHEDA$ySlA%gNq__IdkWG}g;<#`j5qVFiAD1!gVzs?y}%W ztY=-cu4xZRd}Iy&4VVopRQniLqigUGo>>q`;g0ftJom_AVYyi)0O+P!dy|&ScNIO< zWOI7()1z}tdqIF_LLu^b6?x;W5ywfNA)sNU&^p!m^2R$ga zmECzScQl}O>7kc>uA94fTXhj1OXux5dnew zKOGJJa+`f>(t_)hB!1+>&}1W(VwNj!N;Ud=c)z=eq*5G3?={%3x){(`z-Z(Gwf%;j-?WDNhp1v{XXL30hOhN at XsJU_|62~zh~$>8=^ zZ|UuC6QQ$!)wW5 at H6G4bPqqhR&XfanvG$u at s`@^SBkvs3cBch~R~T|To8>|BPAAdd z>pWLZX^q}P`(2u>%S;?=tMR+{OjPZC`EarPDK~&ZF>DFQz4;QUJD-yjqP1Vr^v*i- z`F3OV(|QLHomDG{p3Zy>G!oj5Nswc-zcmUM)eq0$30}gFDO2SZE+c_J!_X(}5 at uC|zrP z#f{R6akHEi1IEf1yY5G`{}dx)Zm*R>v(%%+JgV7|9dl+dmorqGtT#ZNLlDDXX#8pU z8ny7t-LtVSnGlT2x|A)QLad^Zar(Ff%{bPnmUA`>Z0`9 at 3}1;bv0?KBZUdSymruOM z0qtjQUAYq{N4E`!SN6#L_?7|_(vAj419jE at HtKNmXM4zwy at A-@o<9)sp#x2McJa-idI~jUZ=bYmFRj)Z;Y!7 zLZJ92=yl=UPQtE~JerYn)#b)6v~!t9(TzZfUTN_TfpNUrh97&L>U(O2;WrndCX2L} z1Ro)FHtC*v&^Lgbv5pT`UzBQWQ&fITyW}o80{shZ1=HeE>e7Z-KFrQ?px4Y?UJ6;1 zFa|2Gpm?5oJCAeKn7Cd>z7^B&)hzKD;>5H=vYD$Et9jFqFZpoJ{Y~VSr>NdBH7gLV z*%R{O;pe5PYM-eaPx(`;2c)%n%qWOe{I;GprH2A;Wz$G}Q$mHHYCB3*J+WW62;?## zW5&@*FXvjFmxi5|{%I{^y5|aqoT(4Scki=1YWQLUOO;BZz_2X=yYMblR76= zARold?uio)_~(~caX7hc!Dycu6r!_xS+9A9ioFb$soV}o)54RDKWWI& zuvL7Jf2v*qnCu=}u1oJbkyCR)1C|YvGt&_moudPx+flA%oEzJ`h8B|U>K1BhTnx;P zp)m=fv*Fg5e1?bOPyI6xd|;W0;)oiTl+2o)p7kEm#dooR8*FCjAEojegZ!bf!K*7y z!a$0j<~^n47v*lxXZ+MHy0)i?h6Sc60y?U;FgG1d(OfSmmNk#}RKHi2?uM7=O6Ezv z5~mghRwlKDG-=wWqMv$lxquV_Lp-dw-Zd$SN^nenA&;RYo?+6gwig;qBn&`j;{NF?K1h106VCmy+^N(>f?uOK=zxSK#_jpA87aTUmKf+1-d)w&!UjAo0%{Zfs z)lGqbpd|mdWRgG1#{Q>i-hW>xKL$RItN%M7$A1=H|CsnVV*HPUx&NcU at yEc&p+JAM zApfr;f*z9|2k`t+^Q-?Xj^}^;zK at b({>WVMKgx}H4165q at JG06|0dSqG3v1)>mQ{W z{X2Ws$E?TJn}2j^{BMmo|Hsep$n^1#zM1}O3&_W$$0m1wL~HqPEbktp9@{znQH0%p zXzuhF`Pk0okLI2JGjo^6#K#vn{Sjf at zrEb)?_vMwjMyLXrvK~nV~@Yqoh`9WJQ9^1cBR&7`jRC(O(!Y_8RsX&8U*6P4t^fc4 diff --git a/extlibs/asm-commons-3.1.jar b/extlibs/asm-commons-3.1.jar deleted file mode 100644 Binary file extlibs/asm-commons-3.1.jar has changed diff --git a/extlibs/asm-commons-4.0.jar b/extlibs/asm-commons-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..8d564b1e029e7b4f5c984c3fa67293ded9962e5b GIT binary patch literal 37774 zc$|E at Q;aT5*91Cv#^xT|wz0>yZQHhO+qS)Do;|j0+r~ccIXO4q&3{qJ>Xl9>t2?Pw zRnm$w-~eRft|nUYt=*NM1@@OhuJJPTVY> zA8v>VIsEna4^XaHBpRhCu}&QjL1O8YaE<{!UZ&gfb{mIC;_A0EJCjW4G;zdwp##M*oN1}A>EH7?n-V4|Vhm2%euV4|uj#$l%_B`bjH~!R6Z{~qQ-Q#MfY4!q zfYARpfrGOJql2-vnTe~1nK7f0iyfnhgPom&y$hp|sk at blnUJZGqpO)SgNdz?i_5Tv zk7MdG#y`Jxjb`89o^*|5D2=e=8N*cc=s+MOn2`vGj4`rR8e>nvc(Pwtg5eo(W5YVe zZ&kfAEikNYiKcL!-B`&wM(s1(>BE5cTK3;w!q1_s1<&{7ORmpt$2wULnHk=8p36+% zsoQMd>DK7$%V&cwm?PXz>EQet`ch+KQ`Kc6w`sfRv}eF%e!qx1Rf`a`4?7obh at 1}l zTV$$=F|$<{PDpS)dRcczJxo>O$U>=)a#~ zg>AWp6nGr=mbG|Plf07?9$HyJqMe+{@usL%2&_2yd3CmQtZmMd=d=}TIza(Q4X>&{ z at DZ?V=}~P{sXpN;m{ko775WS%(g8}?eo7?#W&krT75rPK!~IGzHC6YpuL(O2w5WDl zInffbNU{TA^lFiiumNbo_M+ZeZ1roM8c=MhCV)C5xw8%GCKgwqw# zwS~g@`T~P`suKkS0};FN33suDTF#EpwnxlqmGE& zZNA~BAOGj=miVA at 9`BT6W at l(e>6EACZ(yzQru3rjXSAG$x}#3DAa2V6Hew{8C8}+8!c at h{-11IwfY&)xyX{bB zDSzxmEQ;MCcR4NcRbej4hBt^@Lme1=FJ>!KHf5x*i|{zo#XI!`Lf^pun;9H^C-ix> zaP+TsN0_jBcJb?keNP&qRb at 0nk`M{QViSFSlO_L?@xMXncO4G77t0X2<+T)eCGL60 zn2A$0V0BfnA_->6-`3W!2omBNdRq!HK5?^YL|XeYS=i!A-IUhaL4DTjGUDo#s8Z_{ zvX*nuWp}a`HhPbVX!7vNOWBw$uSINDwoZPt5w4_j+XZO|D+|#ns;I7^aL;b%lqr#F0fO9jeW4>zW&qWqfIP?Q5VDD<+K8pe^y))JSskErwr{lpUp>QQ2k6wx}^v z&XoY(cqk-UK>gmNtK^LF__#Q0Qv3FbkrJPBv!bN8EX}0yuSarT_TFW(opehQHp|hG zD4IN#hO7g7_6vT^%RwF_f%8FcB>UIGqC>?&wSHm2rO}8cBpe09%7?1r3 z3qCD&-H;qlwj!`nJtAnBC%Z{i0)+EI6QM%>Hc=d(o~|!#-p-LZyTk+m^X!f5;dgi0ne+T&QWWo_Sa%4Le)b06%Oe1%fI#9|2pN%R zm}<)Q_e at CK!1#%&gpt)dcb>D43FWyMDFPe+p5*T~@_~M6*K&db^9M)CEz<`>$u0AT zKnWp}cknzC_IKobN^CsyM^gsa2UrOsi}#p}h&h%SwqMvhX>9+*nN2LgvoSKW_$W3% zI~=BR>_V)-=-Fj#{LIidmid#HcmnfBxC?|AR%ke=stGk^PJXHk_oHZDE}amyfoKia zc<_ySDk=$88t6QEsnoK_4$fcTl3c)^cnQPYp2vqC#Mg!;)-W~j7H61sfP zI^}dwFfOIqmNN>|G3OrDKYNrhGM6vh`;bKV6OM~FdT|L}<*`dC_NWkdMk$y1!E at SO z45LujuH+6+)WJey+N+n!4JB;>J at L~oQ^8a&rLRgdb;*aI7+0^NPI!DtW(J8>ZdrW61WJASyHn9Gl at I+>lvAGqU*#@zdbt;9e*g#b^E{MWlb-4Ul^fQW$Plfj(m9 z5D1GQRe>Dn$!wCLG5ICUlAh5{`8|_yFI^L}aOm=>mm#0zfjE5o(6xGWUu^?eX5ru* ze&Ng-A`;3sj14rfq{X-mUx07x{#MnXoH2xnb3NfYxd)f(PsJ;7-ilE^rL1UD9lr6H zWTu=sHuBf4=_*~)z4--4ed??~b6o%DA8Xp5snOLpy#{&k2I-+scT|S4!CjT*>7F~R z!5qM?YM at 62=*#_U!roJ-^=RcoXQykxx{NUZ_N}as;VG!(VL|kG8e*sLA$hb?7fWkH z{P6;eVg0-miP#LY(6u{~A!Ady^wG?UO9KbB#uHKn;Uf%X2+01#PC at sC3(wm~Cl z&FEbZ4c at 5S#rV#}Ll4y#^H=%}deNRo+&&WGr=Q;NZpy?xO`F;Z3q0M{_J(ZHG2lZj*gFaG$ThE_0t0VmmyE!7j+rC$*V&(XigcB5Qj z@>MSISrr3pbon*;hSDoZW%+2ck4eU`a=##ITg_u2C>q7=UMM4w)#75Rl{8wli2>*n zVwtTAUB8@)*Sxi>4+H*JO6|UV^FbhjfItv~fH3~wQp(=Q*2~+>`G3SzohF>8>M({t z%j?a~^aLJQA+toS|f at DDwTF+)Hw;z5AhnaHE=xSdDVs@F;pMBTkCyU!|}UU4{oc&SUD7hZcM6 z7=bk-5|TdE at X(YbLC`d0X)dy-H>gITbVVv2u5eFjEk3s*%Zn{V(p{DOE&DRAorZr| zZMm`oyXoCVJdb!8R#lJHc~zbdwLocSk7 at ttSyW;??H!GSamFp%(U99w+`Ds2(u0D8 zwxr6EC+XJ%PY5yWoUN&>0O&Fk%c=o&rBkja^)YM0Rmf(5#SFKuFQE ziL1pvFX?Fg%$F|y%Y~{#eDn5SJ1cEw$?cSuuc at jIrz`Gz{91hVLe#A)pgb=M at u7ET zg-g!Y{Cw at g@LMH|M=n9ac;rh7mQB_FFJB(#$5VDV=`MOc#Jne4U*zBrIWvEnw$T|1 zDYuM+184W*G3%sqUX(1I@``zC+htQG3bhWQoJaa{fuFdY$~J_I#u7t=1GUbtMc%s| zo#aR?%ZB>*+Tplo&jETn+j={*KX<6AIN92l3Uvm9M2)p(V$0DVD=hq0sl#aJ&8p=+ zyh*aSD6MmATdp)A_wC4Re;37}6i5da at wIaejNwN%G$)_!k7U39h5*ZQW~^=heh##~ z!|PtumWP*zuY_-mgu7f^GFbB06+vuk0{^s`GY_H$^8}Xx5CD_V+R%-iWcO@$aVJDd<)S8IFVSP3NX78NUq8~@B_n^aKU~ac) zIlcK2G<_VoE1P5NwJZ}7&r at dG?1#Q|nkC7M;RJM1dTTz1E$X2-9(@Qiuy;hXmo%bD zSHa`tN|9^A at PWxjj3PhYeO-fkMggN2G54183jnVmddMFY1JBAS%FhBF&%$WT at 6WYv zog(E2PF{3Oewtri!NZI|UlGoNkw8zWz)WqdnnHbnb&u%0i6+zf$d=Uoqz?%Z8AmZ1 z;}>i9DVFJ^#}7{t=U%k;X`Fg7diW9A{l^-gdVXs=-Ys4y^UU{|C6n8^n1B91ky}x1 z&1}V~YfNTC>g|zTd at Em@phD|L$pmorpa}E#sVd5)^oJBVmcr4CBB)MASBuI$SihE! z0zofjv7>&>>^l#2JNS{!wQsK^5IK+3k~8rhYb#SC#k7j7U{do9PC80sbN4hd!iCt@<7w#EiHk~h>n3X zST^JwOrfYcXH*Ys$7Wlh4}eu;DijWL1K>Lb!#ZV_2!oM<5rW>d;s(>`%Jz|^Rwovd zFEYjdX%G&-dQR+nR{UL9JtxDv1~OXX2$NcQ=S8Ky562`GCQ~FCHaYfiy!1(eS1}}> zSvizpm<_8jC!Ay04Xd$mrB?cB#w8wBV^j;f`o|NaKCBq*jp2$IiwKKsO{OtnPbl~s z;*S4~c~Ai+pV%{f?-VdV^hQ5;>*olybs1837l_mjob_!C@%9)34VHlR7rjFZ)`0du z4aqBQLi7K9hdfv#uqM{4H+LIC_k2UriF-r&_MZg=G at yM&?acxlkb9->Fb6jQ0mPmW zdkug9QqPRNTfo1&LH;|yUV#$WOdeQ;6W=}aJ40)~L}jeM{H+F$NJY4r#gAbv9; z_Qma2xMLbL0WhNWirzUB`$7>=dV-c0KW)E(s}2_AXY%|O6!P)BEG|7T;jzH(F zG(UXnccaZS5pD<659^W{e2>;u{4P+pYBrjjIg5 at sCQyjriJt+lCL*H8D>@xTIv5Ar+93j91=G zMLLXls{Ca{>TVaF_h0MY_?IR`LHHXkq9D|12_TY2?uiV3MaA+-CR=Py$O}XI17gyf z5*Fz4B$7tfn~^7pDT&w9dYlkOBOv_B@=EZgX*(s65!BT*oJnGDTT>=hmeK*tbv)m~ z=^`P at 86`Dobr&XXyS)xBjxI{HO`e;#pp&?l#%`u85o at L7qdm$;Xbi+mT_dW2j}PhT z2tvyF;q`JUM2cn;-(h+JHb-=%Slx29QX26}t*MBWLav$8W08cUkF*t3GSe%7-?FM4 zYA+==^})Zk3?OYN9+reKSqN^0?dQ$?J&ZlS-32F{S3On?*F;oDY*daVlzT9Ah$vyc zW5CI{F?rMtT<=$833*BOGr$19;)0h8vor8C%lV`kO(|-Dfr)DpE=iuSCZT~a%~??s z(QYV;|FwB4VJ%li#|;gEewXmU&cX!cx6^~sZWB^lJrWl(DA3uZjAJN$A1ttj=V-Ej zQ#{R5d2d>j`32kg+62LXC$lUaMY53U!yocN4(q|aw=?{RGYUE at pe}Mld-l^(o}87T z8`Y#sj&n+L-$%gsGR?muNyxZ(2w|RUzR8COmk`oLV3K=^yhhLb0hXOE&*oxbzJnbW zzQ}o*+4%O&CbyIc!8DmpXf%bCq-ye*LQR)E-s}P~P&GbtX&Ki3U|gS9;(`Y&27JhWEnkl*`ir-t at bHJ;w-;yh z)ix;m4(N!aKL#f<++U}NOv7+Sn&se}HC}WeEYKT=1osNW*W_FXq5~-TaCW%c+^EXG zG2+u~pPRo?o~GT9+2Ps3BL2D+_fE>>8O at 0h1m@om`@fAAZ`k|WlOn+vaF+*hn?Ea{ zK}JtqVH>I_e%C84-D|mq@<%w$juyV46*bn0HsC$D2v{e|r_Ig3so|q*ustJ%dHzF| zi_yVDL}+9&8WT&9UsPnzE;2pDM1+Bh2yTz2EB8-aRmbG>oOsRVxVz?ZHHn#4<=tE} z_Zz5l*xz66nub-%U&-%|KVPQ&?fM(XNNjgqEN9=_vb!V=wSGkx zDm*;-mZ!8DLG0v`uK~RDZEwT;Nk+Ay)^Vi&a;IKB-f|Y=aUmy0BtQg{Y)QPkr<@i9 zTh3`+5Vw(IF&irvTNswiIB9=*pA9a>O>8H*7V^eB7fZ27j&(}^b<$q&OmIY-$Z^`{ z-VJlkQHn3=lcW#gcqp)yCW*z%d9(XXw4fr{K-Bm6FX7#5Bl3j5*=6$iL3`G;)JoE` zJl~As9|nrathUR{k;>P5t{uO^(2|$pQB+`zsblhE-Ynn^Mr>|`uJ)y<%;yvcauWcIVx at WdTg$WQ{&3IstKc*cr8_ at EPLx+#Ln5Zn^V3Z6ct&^V}kONfOOB3axp8x}98B zFIS(oe10NzzSh%LU6;_Bpu1D|)*9AfcTc^gUSl}y#CuRT at M;z#(~aMr<$ZA at +j$e< zeguu|O~*V7y`QgZ161iUo|fmh9wMcWz*B`z(-j-m%Io9H&e3|YlrL}m^m=+=3ER$3 zp}z8#8Ox`x%^>{UZ=HjA(5^7ntagz52(YHFZ{%OaIax#0(rua~u>n7j`@Z*IYuX6d zCVIr1qoF3>x3fMq-DfYN%$#+ifG|?S%rA$Ul|T*fa3cMD6O9xw%>()BJ1^PAmVCO! z{o)ve_%ec4jA+$;3<%NLu6%dc%hR9!r?w+y`IF;ik#{l>T<4I{7Un7Eyh*c zsCZeQoh|y4dWqr+XY5BDBjOX&S!Q(_;iX=m;%c3?QQJ0KUG`xo!3kG%Sdc;u)GF|6 zvFL}qq|ZuYbvk{$Jx6}45@*lADcEZ{#4As#HjGP{E~M-BLcPs?u2J}Lx(X^mbum8L%5(anPKkzZr9bEB;Q3ywE^hly4w-Y0KF9a*E^`L(iU<0WNg z<)VGP-nRQC)x<-`jsCE{OvNFm%*>=`$@YS`{mIKa=U=cB~ z_^PO_2y#m0T!Tu91SVn*nTsqmqgPGrU_|SsrkCvrXP4WN$yp~ibHx`Q^xp=<#R!j@ znHNgJf5X867n(vKVX!iP9*BA&_G8H~L%cTA9- zns_=8wXSqJeYNYQ3F*6q#|!~;c#%vJjA89p=x`P$NNM_t9eI0Nyu7$-P_QJf3_n3I zKHGdA)U>dm%SH}4fSj4N+~YDX=jOWCrzHsz74EV8m9JPp+5CmDGpvg41!XYaym-8A zXGg3JGb8(Crgfn~V4<()q&00(ZXpL*Mky)CATZihqvbQ4b@5)v+q?dm{<=~4>FxHix_c-#61n>Q&$TH2ZRzSoeHlJ~*@lJv zJ721nEQNl3{HkU=uTQDH>%ie%ii`F0QbZH#vj%dqL at p>@veHS93;RkFD?0oDl-w%aKf%3Mq=6HtKHK|V;o0JF4u8rCzL;xB zhKE3T$~=}w3h>i1BRAqNR^6FX)KOCpuvdA+R)Y_xx at d0RD67nw%*m<#+oNdC{ zPK%60X{@B6Lw6%(JWBv6LW`M3PhDeKtxeKtUX9!wHaTQyFJ@<^W(L$ZP+%t&M7 zsJSu`UUu9jEs;DYil(=mWm($YUQ{cET-#jSYcN(61q#e5QB~PhZBumn8(MvU7A2jd zU0rEcX;8^EZuU%%(_%9;o}e9Tu3wJ4c{Fij%Ei*gkz1Iv-HF!888^|tI$AKsT-KnY z9aFzjGVt+H9fpqIHraswdoQkoybl~4d3{X#MZ(}cd1d-D at N_9+sTT1 zCPvpxbK-Jp633bbV+EGw0O#oMBmy9$NEECpXhmJQr(0MFJsfawy`5KNne6$tffG3j zj%zJ4|6&UDLTu9n!a}cW{}+0H18W{NMoc)UQX+K{Ea at iEgC*M`s!rlpNRTM%sy%GI^g! zypewe9T*w0NyFo0?F_VI*JX;>yfB&nu!m(-uO5>ASwTjWXlf$IlOqG4H>@l|5W$P5 z;D4)R?uaO{F|iTG=p0SHzadH(MeeG17GayiPNz>~m_1<<8%%742tI2eTcw(bUYQ)a zH|3OT^CR*|orJ^Lo?Eh$EJlc+INyUs1kCe{_!qV(Gpbzq7glGh!w-!6T{aBi{}A;2hDc#xc1!FZvrxl}HrNdlZg9vI at V8r9(u<+Bny zskcCc<)D at FtyrUs2OciUlCAu at M^v-9Y%@l+ at Wbo~8F%0Z313Y9BC zKell9QTU(bF+gFDUp772V7SdX+ at 4g z$oyL#T&T9JbIkDhi)f|%-*iRAyg_K at 7Z>WuMc86y8kdKuR`gDCE6o$I1)gMNkwoMR z$|b~uE!osUl(+_7<_r^XQ$uD=L-0{<)*UhzbU#y$HSew zOTH}G>d6hLX0uinT-D~O`BGz+!B6Lr^_4=#m11De$fB=x%PVP(}8; zHAR|}Hq-~*Came&%X?%9GTV2%|9E%fj5TMD8R5vCAfB>kYo*pa9$mbJ!*;``9?s~N zyseaqOSnV*N;Rgzw0|DUFiy~jKQTq4V;+P>6P0spf~jX8jHBpW2fSwO6~g2*4W>|d zP5=~g_OQ|TEP_wv?pV=!4TFEl-O-|b%>V+}nDe3#IENO+Jx8ENWAAEF@>z!-#XZNN z1v!TpWAB<#{H;P?4JQNnE?dBQ2uXQ&}s ztCS;msA;Kx4=ZRTo?hRae51pDulmBH2C&49339X-nP_YA_GrfnrNc>j6}S zxe0=Vxgnp_F{%Y at 7D@(Ri>`wnl6Ml0NZo-4rsAII&s;-RSc;l9|Y;gzOgYf~cXnemLQw)CzAq^%# z6OegE?x6$|qJ4$#RRDVEv6AJ3+W?m^9LTz&j?9DN!7|VcZF`Z`(A6-QXaE>(7-4`N z;J>F1euQ2 at 7KJVbYy&Q#8HnCM2h9LE&*a=rr0{k1bZ=`M(U+# zmwsyIvS*ics*w_;7&gkWwSIRY$_9D>$bjZPNnE`Mf7SeRWkJb2LZw0Byo;hi&Af}! zzaVkW;vbPXdttv4an6#R(s}wyhq*KLCC245)C3;oB;Z>e4GIMvwEDp2!HAP zb!9=t{NtVAiF4{BmB&5mBNrnxgmD+TNjN3!!Fpxf5Xz|`_4@d}$0){)DvPUq+kSAtz3j+U;3Z+k+YL5;=){!^FZD~o??qxuI!6`yO5%@`Lo zqSv$$KTnbWxk at c1Y0mxxKkh%-44PqBDi at R2F2A~*x5jcLbzSWSW-^T(UYZz>#4&lO zL`%*sGk-d{$35Vk*X#}c8F7 at T3v%x64uC&=z4w15qkr}~rNlq`J~jn(oIR>kVoXas zrhzjpo$kPkiy&b=QEylB(>N6GwV81K)j3|VgR0nc6yujC<@Xa$FDS=gm49a6RZziwGFgY|B1hXdY3D%1^xq|MZ9vK+Xb0^cN%=l_ zIprTwNY6>o-h7b6Ws{{9#6CohkwJ0pwK4Qh5u__s8~*GK+~tj?>f184DNe{WxuJf2pE2kHy z7 at Z!0tb~^ZjDPALW|v(!&z%~4Gyg?01$$5#{f!g1Bu6;>UdyF^dHq8F)I7hQwEerl zMiR10Y=9h-D4ueRVs95-1hw934)yrlq!E8Ne6(Pr-Cuk&>f1zUC-AVPci{4R?)>4( z5f-&7IG7var>LGaLjCwu23bKI042M3og2PP-r~&Uf?=p5>xdrcl>?6z$O%P9y%UeV zqwVKyy;ZP)pd#5&UCKk2WMU>Th<$u%Hmb}M;UAx~dIi$JINX2Vb&fHl$Q+FR8O^#L zz`=a=Pi^?=*Dkwx$I#!H7Q=W9d9K7aFt^W^74Ys9SI5-p9eQOxeQOA>dQIF#vjaYB zm*1ymiiVnf;8&&1;N4O at nmdovpQRY+_;VN+MqLZHHq{ZNVgu at gaZ^VtvST*Z0Srw% z;cryK2`?B{R{ya7ruzi4Wzwg)w?7brK zMZTfx)$jWzhqVX;yV&6>w18doaHn(#r!#c9X*e at _T3j`3xtlGHGb at faV?*2$z;_zB z(=E0c<3X*dTT9Pe^!;*H+Yqn;U2R`#J%1$G5#fZ{NCGU<9e6Q}J8Y?SrZN*U8u#6) zMzY3R5|0n`{)%oc^-f8hBe7n+UQ&x~8TKP^YeZ~f+lTv3=8V2N$9jzsAdVTL&Kcvz zIL&vT?Ja|*;?g9+HaX#^duNn94F~q6vh{Xc?+i69XCiK&Eur|)06+X!FZ23Z%|pX! z#kP+XNByB28?Y}7eN{r=arRlnZ!Wqn3k&4O*M!~sE?Co5&Uv0j6=2V4U$ zX14*>TqOhi!xA(P!?Cg8MmIKXPS*D8oj zwQf=j)!hz8_oo82KXC2fxfA|zxKw-}Xy`bXmeD_+VK76%myb#x?LJDbd zdB}Vn7WLQE=AT9=V0XYT21)nSX~}b4Ptd2^)#H_SCK!Z@ddEY>j0w+UROC^ITB<`eFlF0ZIEy*V{}4M=I&&?VUUO~ zUQAKnl@(oV-_`iXfe9AO)rC#%h-FiQpV%<G!%$|}a)r$i+BzQwx?UG<)Z~hQv2BXNITlDVw1t_Sy zhWXH5b%(>tR~hApYsXpjMnk7t4yMihdV;YwU|#N>H^mTst|Kqy)og&~O-efRdoT9c zU#PX<1dSUT3#aJ54vBORr+1>94d2APSd-7VkT}Vv)%o{T<*N?AD-8+PvT$GK__CoL zKT{doBnac2IaP*c;EHlDviEgkoOA-dyCU}l;$~Ir`aUR)oO|cM(r-jAglfijUDW%n z2oD}|3mnmzzp}y=En53mtB$Q+ZIUJx3VA0=2eRo$PJ)N4jmqnqqph`l>ze%9E4xcM zqfWI at +u68h0r$a_E#@%}8&y9)^oGsqht99B2K%qCxY`wO&nnsoH4TyKpI>4r58~VY z9UoR&Ooo;EbiK-KYyg>pp!)KsZJwE1HrYWa`s+g6d)2L3{cL4_RzJ9wNSE{=llXyu z0-l?@2H7!s={Vmry0$9T&e^%*u7yjwjo1hBk4EkrbTN~`yYp8FepSm>ZYMW^NenT& zR(Zjq%}br*(dB}BDmJd!x{w*qU_CRyb?-Hfm|&^kkN-_qm;d$fS|g(6TJXyR>5BDhN*VrDIL;d`&0_rm z$jB0)qhmMgQzl)pMr zCP#oe0J7Iz)`XG$NcKPa6o}my{NZNnE@?*#j5$6 zo5?XNbL0 at 7Nyc=-+Sgi0074z>^yQB%+7KIV(X6?6u4M~ReA6*We6tqHqpfJ_ToiB% zhC2^$=<={9T13N2fWhtHFuCP}{dKOPB`Ll%2@@t+0p1QizomQsO9!o`Ve-_YvG}_i z#&iD9HkY`SM+y$=bIJUyporl5kjB1}-50?m*1>37YDY8oXXwcKt_3N76|tSVlzvms zxkmKq6=bJnOm5Ee2l^)~4E2jo*)oD6h4wVEPZjbl9`M*L47{TS{j*U*M`tGniK~@^{r`S`(1P()RZAD>psA9kflwWiZ^8nF zNdt+7vs_C?CSpd$8A8P at s-#H{mR74&)!YI}lLMrQ!4%pKp$&)Cq2egnc9-c?SZH5k zZ#tE4=G$-PJK6eRS5)-i=l$FI)IY{JD%$mZd_MY|`F~T?fz$k+eji!~|MzQ+D9cXE z78S at Ozb~FY08N(Bf9XdBL_ULaEKz9W^2wUSP0ETL!9{A5U$oz(BtMqhky%lmT-q9R za27JTlvE{#B&^(7)8l0I(@|4umAVk8EO0cYJUCWrbo!hm?WS5(iJBPNEJM3XOvMue zWa!lS4q8KMKIp2t_(;FD=9LCHn;eh*Ay)1k-}ewFE5cEqoA$08Rk%=MWb}6tz1VGV zM24-|Xt>Yy4Wo;-mCc-#grMfN-Vcj9vl${@Ul3vY&n1_9Te>x%*oO%b#Dz2a5PMb{ z{&Yv83gM~texCB;EiR+DF`rzpS)RZ_iwrH<|H~y5&)j{$P*-11 z!~F%qpap86_-C=ooQaVuC}~L zap}FYe8@=k&nDuxBI9LPx{98*mcDuGNj7(xw|MpW`Z5NZ+x9-v-(oo!Jh&f2-B$a9G> z>%<|j42{lO+0%3$e1;S9NR_u}Hg*_ITIE=4EV27bv7ik9$YGae1XosC2y7nhtQUXY}FyYQP;g0nNMaqG-6BEWZB9+ z)B>VMgT3#FZqzdby+DW%TAk5cQpqfzH#DEtbX>HTT{#fcvnqBBMBPVpHEc?jcqA%ZnI?;kz~Yzhe_dqZ zl_#$Xw|!O8+*PD>tjEGAXb_%KT{v at H-|U=hF+r5p7t>lJq at JEXG1Q{XLf={)da97- znnKRLrO*P00XZAY{k8tnIkBNJdZ6W+l9HX*x*%1P+qxlTlk3`%a^tknC*M6Q^~!s$ zM9F_rI-1uCl!G`jKO0J%oJ%X>3|W;EIXCBg$AZNUXNI at H8gwKD(!+PKY>hBQe{@^1 zA-FGI!+S8Hv&I@>P1ePk*zwt*Ri at -fpFwh_B?INmbeWQha*a?W*t6QGm)7Mlj$Bp9 zHF{EtqK#;PY~j}7=UZV8NuzSCRFiV7)T46jOS5tD&2 at c@3#Cs z^|l;h>oF|1FUAN3XbdR`L=6WKNhJQ;m|7HHluta>7;D5W5?U10-9_ zwL6`=uedk2#~5+;1O)F(F{}amY>n&~fdclHf;I}w?^YK#<>0yeV~&yD-RDdm`_LLb z;cX>bVJ1tHaySytbPBIdh!5Npg0o6_hK!7gNSu9R?E1xn>#jllqj!)%v+!HiufTn| z at D42hvAd4-Cz@}B-%rl-QXf$<@-P)K@{5AqXYhKaZ;AV-3_LOotY5Uifi5bkhOWxA ze(*gUyC=QCF}Hc{nSS96kmAImNFywuV>k*tC(G7frsRF|a2+grv(7jpbfD$0;IGjA zU2FlfHw2&s1HeCO{}#*t?;Qt_7yg#zD|7!A`zL6hKl~M2!0?SSJiz>o8aRvf6Sn^g ze!%oCa$f_Uko7BjzXN{2Id zK!jxr?;Z{xE(-}If+ at lg5B;nLdM;vcaxSBY zP$VE66n>TYh*fu%DbWZSXc&%*70!gt1aEf7ye0pBwm|!Ezm=0fZ5dPaYmUee#d&*7 zo}*N&pHFFx=0ahj!X2_8fTx5O%e_>-prcZ4DR*i2U=1;Pua)*!yr6f%A<1aPMVEZW zT_7Py7bwdY4vTh16h&5jsNZ)$q#vj$bt#H7=MnLk`xwF4{(v$(C6Uya*jP>?p@={1 zJNwaVA|sPRCRVM?#8}u&uRXAQCUPNxV zZlG>>FTy*>1IiKWSV1JqyuLZ5q=KYCDY7%|KXLG?z^PEW&?O=D-#0sF!&;LBPm at yG! z!@y1U|7da{mmEI)8$ueHxkpp^u}Cy{PZnOhx_uK>4rTw$5ojRIL`SlIi4ka^U3?xb0d;=9IdETYSaO7*?p?-AspKOLH9pMzK5(xyoa19{SM90=(&c+RO)6SP7O^A at jzMMKr8-xsRU60|xG>y)iWV<2tFMMK#| z9td4lcrseH*GEIq>)h+l{ndzux^@}nt&UPaN7|VEZ=275jfm*iWD17=4s)4!X{OLu z=CG7Vqpyncn}ED_GK;Y^PH7hEQCQDk7X7b)qt&UQz@)}))v`^=>ZB;IoZ`x&R?li; z0X_-}t%y??n4#C at Oi*Q~_>?c6&C-zSEmqKwT0IeaY!>#_utdLvPe`u1%8Mz|u~Mp< z$4=oXW}#-S2Vt}rl+; z{E;c+0LTrqbt8_$#(9%+mnsn?196UXD@^TbGGDUqh5jxp{xj~6nPGr|nf=T>4XLuSEdfosJZ z-bzNBRQs5es at J(+FfaF^R$Be1iSlXSr+ at zd0Y@MY_`)p0gj?x{|r+W~dgFnf;{XN8xPdc{h$w1$#xVs*I<=Xq}V zl-Kg6%Z4Mu20Cvs2ggy&#b+aDb8|;m#>YiLe|gK>U-*3b`M1ed?xaTLnF1E^epnfo zaoC0;NvSaEBWR}_a{ts5=8 at hQR4)l}!S5fCcQ{X7C|VWQFi+w&Uoc#SJsdhmR#dZz zRRcYyQseRlDryd6pvwnWfrTXD;+c>iSkg33ym~o0SrMNdN7aOO3K>R+0N}$F%PcFLZxL?ROq!@b2ZelAP zomJZJ-FLiLi>W~AgjGsO>l}B&gANDku|tO{q6d4$643lhyRrqT6;8?tbCitk)NS&; z)Uz-|i8q&rLhhF0Z|9`uJEfz%e%C{v-|>W?2^V+#Z0J4TWa6kC=52f_mmyPr#g7KN zN~C!{GxX+I9a^`^4Pe1`7n^xLAKe9hg31K!9!nK%tLBb{2MQ-RD`ciAx=GV;Nz<_R zy%JH$Dehf=llbChnn##`g10xuY+6cxwp(Ngc&SzM%ad=XG_z)&$>D}aV57IoW`HHy zSxt$+Vn)TLu0u^V2S-mqzi(a%i{Zw4Kk!PAK9&DZn at vOY@i;-F7JDtPRSo_eO~08l z3qGOVaVdOKONtWsrs(ooKkk}ZM!#1(c5dL^n&qUx47jK*THX;|#r_ zpRAjyY;2J~Duk6f9qaF=%JlO*;XmgYIDViITU~;mI-*0*&^{M!#PT_!NBN2=lAm1n z5y&*Nle?DVNj6s+X0A5csXW{a7 at 9>kghhUoirrwA!-1-nBW5<23O$!c7MH?*brx4i z-H5l-hvsd^0mPzLPMzoTdGEM-uO!c{6s^7qk3$UxW73RG(?Om5>2=$|cHRuH%dYhw1FLAvXPNRu{FGj{z(vQdcXicgL;3sN=m4n>L_xCoZ zicQzia6#F1sNfYtj&zveEtOl- at rs_qV?=3%q}(c6T-7ygB_65^CVDR|64K1 at jh20A zn|Qh^V!@A-*xI6MTDcC^qf8!l!H1XrThP4TDzU|uvXOmi%o;vId3cnF5n?Md*($tQ zTE^Naxj97u(st(*Cxdq=Ii z>7qLXm7dbm9kaU~wT?As&1A${`mCn at Fh}}~wRCsgGO3im$r at J6aqKBU`m8|?Sn_~9 zJgzug`x$=8*MLT~56R#nk%zpAfIaaeBEbJG9Vi2|B4|2b+BJ6Mhy~gqE9^l`o^Afj z at fUA{=NNsPkuF;kTd{^ZAIB-R6dEie zFJox4=~>S<*`-_*lW4)uuYXN%sL4eoIYEJd2BH2jZ5=Rc#I5*1rzWOWojI+6{NYOL}G5p5A^)(sM|Pa#r@$3nH_G$@rQBgdre zkP<`o9UBF%CHrsWn=(26 at iw@eK!((e*1U5W{&$cM=nrD4ImuKZYlV4}(+=-B-`S0` z+%ppYukR;%pxFYNd7KznXq=c)vC}`IysFDHLRO0nuub#S^PRZ09Ab>DlsUUvgSdgc z=MFZ*jnI_T%=AsO#2JzoC!s2<*D<{KhmZ7Rt92Y26K5r|&$obQ z-s6~aOidS8U7PqfDx{s%J^`b4#GLFmE-wUpFa4or-694H4j$OAzamAi?5zppHy^pr zIjy%#ky^J*)hGs zTm)YG^o|E{k|e(=uvm%^Wogn&!+ZlywVM_c(o7$o+%he2*MVA-_Y{?@w^&(qIxsH%Qx;Cu#*;!r)wjA1m4fVi*_q^8%0Dy7xs*sPBdKyDY&*pA8Qo-J9f=LJ zR>_jsdCca?U9-xnW0hM6;v#}+LGGy8iVkXmDuObBr3AGE1q2oQ*^z1<7;qIFfk45P zhqT=Vg&=yUV2~ zwVnPt_RDv`RyVwNm4*a0Vo9XY_z$lU;t4xU$v5KMox+ZgWn60{1Y#s_=uULk)Njjd za|`+XqQyOrk;m0I{*_y*b+^~jws{eEuv&$W>j)~Sy#Z=9izf%v*X^Fx!WbnJGn$Tw zm*S~UwB2Ki#G)x}e^RyWK^8_kL)e*TFs^2=hR+8onMLMIf}Dr4w?;^ph?{QcpHp0N zLD^=!Rjh~I(o9!8ZBh$cq%Cunwp-2h8pQd-WbF}j*GZr`c3g&%nUXh_MOJ>4Rg6`s2T0>}F1GiQU=%93YD=)tQA*3%*XY znYs$Th?2F5gy7o9Et_^bTieuR3j$2_2b7Yiyu?75nkKAp#BB{Blu8R_0J at uAK=6cW z7aeIYDjwl#4k?QF9vGNhMCm;oO|!|zc6eMX z;Tla?Ud-!*D02aQ0^MucWq@;qODcCvqDod3C%28>wHmDJlaFEsg2c|dZ+NU+3H=U%JkCfDlxa))C#g{ zXB<0cqquk7%{(Ut9nvFfbEAy`b|pKDH}lS;t-0PXc(yissOsp3tT97ob-XQit)+BF zLK$?LRFYPl+=7IhW~N>#Gi4I1IKQJaC<4dae2o*NV|QbDmygd$`9Oy!cf{+Atwr6j zRQPIP>BXz{@`Gw;GhMb;`b0T9kN9dKs1ohwe%)@v(Ghgayv|B!Xa$rq-CXTJUeVN9 z8TE{uF4KY4k!vtT^-cLu1}lGp^t#c?s`9+5gfdFI%9kff^eCmUs(JfxsN!(6RI)1E z79%MNcf)8)Z)RV`yMqW1x1yWXaGDb?wtpSg`1E=KHS9!@HLGsuJCcQ6y-A<9#wP+V zmcvq?vA{#rUY?G~;T;797crvJ^oXC^w7A;&TuV<(2snsHacY4T8Zy?_q_ at A>E!fD; z;v(EGQ?n`1?w7bG)t1*U%SMU3TGMlyKP$VTe~y-j8GLO<;xia^Dd!n1;UT~HU6pqR z&!y1Q*;8mfT115AG at p%D6D4y`ojL_W{_%N_;vy6YtTeQy$8&3+6zh__dHaUKnXMEP zL8*GFjY?@3VtNGm=1QqaF~rm}Qg++6hfb)R!P&7IO7YKOt?E zkq~jUay0}C)y|MwjZSNCrVvpHta4K6&S~OX8ea+|42sN1ma5~*ead=MP~OJFds8 at G z+Py$LbFnItdFYSR%$?9QVT-rr at dAq~lOy}96NEIC^FvIYPqaA$io<(zEBpM)t*FpG z9#eBM)$Gw{kd~G|I4p;PP)Wu0^@yuewET!wF;Y(7>{&jFtEy#;lX6{DR%7TitdbN@ zxF(S^+3C)3ViFs7?n`ojK5r6&)Y4|jnxDC5WGs0tb1-sUTGQ4sD^n+z*UVX*mwp at f zr0$BuaO8U4M$%oDEch&HC2h!nnOk7yKyc?V!5^cDN(kWUAImk&@2(p*r}t~tbrFKe zWgnu_IDC=BeD;yz;69PZbJWF8#7KyeS^IyyrArhuwZvMaXml2C$cE~yr6#AWa~O3Q z0$ZM;xtJ6pk5`)(8KcS_UuZSiXNV;*&yIH$dd zNxh_V)Jh|nR?%}{=cFqTIz#su6+{H&GVA$(RdaK=tgkV{YkwLUR=QSK^ zg8159(dzW(zIUg;bqBa>O~Pu8cD*&8yca6>eeWsTGiz*(6X5sD3HTxh2>3#ghT1TD z$L at Ur_)K4^2O9)#`(-eFMsKnRZHL@~*Moe3UjTc?ukZs&Kw0qlm>=K{ydkS%N9M-x zfY&4az!I=G@%Gz~>8N5%9 z)^_NUVQg0}E!w3$V%r|L_s)=e-az03*fV``gv1@`0qPidM(#dZ1OdXc@?Bmn3$53~K90Rk^Mb744g;ywPiWCL6_jb`-z8oPWY(*r$9*rPAc33?5 zbsv`_>+scbReJw at g+miJXHOHQ>4cw46FK^|-3jl1kH>6)?%2i)<3!=D zNkK&Qo=2pNFvj*Sfq{$Y7^pr4SRkqZI}*tuaRg*>P0TT8e7I~&A8X3k#eKeMRJM`G zSv-lW>aWjrMhe5jZk6u3+U^Op3bW|pm(V1SH0-k3uXll{dvA6ZAD#Sig!<;aR`#tu zh>_VyeI5R8Mf~CW)k-`vs3aNU)~}D_<>MiGFV&x87;ZkG!J&X8m4%aP?M8@`IyA6T z9<^w<=HqxidN`jlluHKSMKyh7kvQV5wv&^bj`KElwu##9ky&o#XhNvrXXmLqArL8* z{tjn!ZAXnRfe2BxtV70|&S7v1(SnQQ|S79r=$KE@<3pO6c2 z!MM}G8A|@ch395 zY!$d8Zp?t3d$CR0aC8=96yO77U64`Px52EFbMo-~aGrVlc1~RT<>;jRawiTQ03EKE z9D9>lay-I=JTjPTOOT`rb?{#bVbQ1rF zFwYlbElOCfiZFbUBf^>s{Gk?CP2FE%Qo at GjzQ4gDDI)na-SCU7F4nIwC at Tt@ED0w> zA3DY^)}$Nay(5R)zrvR112j~O_rN1 at kJ2j@LXKLjXz`8Yx?`Jn7G)Q>6IgmmJ7yQQ z3s)1vL|Cd?Knh#HucFFr6 at yW}j>5ZS3$OW at oCGB*kM$5ZOShqk5R^e)a2e8sq)7CE zoH;8ieIWFa<2J4g%!RD(39MA#34n1Twctd*!``PW-4VPyJ>#&99x at v(+<37%Q+YfL zt08vkJnN?(fPSzZ_U(;%6nul%S7xYx4Bn`R_-&0vzItfT;IcN4mXo60jZ(Fzn0KW4 z9q|7m&_c!$2mS#6t3Sn^3Ede12LgJ80Rm$AZ~du^y|JN|;waAl^qm_7L2b zr}Pt1Y%|z-d9EKBQF%~HHq^T&NwPYYamjzYFM1VSA;p?psFs$d{U1kNrDPxd6U==_ z2)!pMcQ^>#Fe83Y@(R8?lp2&=AV@%8KPLl)NxSs$U9T<6TDN9TvNhRvcU0+B=8{Xh zO0#RTb*VU)bk8E~3aDLuOdQ_sD~OANGnO^hWF}^%IqRv*nLQSfhnXW~>sYp~dN5j<;t>A1XKkUA37q=4W+sl({Rp{y5)U=Z(QK)5D z9Fd~atw8R>9qg^;vsL3 at e!*#}g3d9@#veRIxK(p3i|kTSOQd?KY*!!gr2<#QSvC|f zwJ^0u4Xlo(S4b^QXz z73^CE6 z;BiZgks%m!%vr{1#%X4rQpE*K0FQ8B!MH=_0U{t#Of-&hnrRtR2f(~8$RX7?D`=Fi zK~fWniI}KC&=HYALdi at xDF2*jQ>5<%f^~q_$R>P%?{1+Mh9dc_GtiX>VuXfUk#`hd zl9*jjRO$m(r*-pS-#pcB&|?3AwlU>VV2*14LaF9W at i9!K;tA=r&!h)K5-c{avPySg zW_>8#Z9ygGFbB1pTf8o$p!M+pF-7!h%5z3b`4I6Yt#`lW#q(GZeqtG7fx$v1y44TD z!r>k?s)i*az8H7+=jik6jTc9MlzB)xobHGcX_RR;X}vzWOtO4R1EbU~H%>#5=)j)Z zqiA7yp-Oh7yaZ?>i(?^jUS=}7cE3f;>cgs1G9r8Pbfws~c7HC0r8CG+i~V78D^gR8 zp&?SVGEK#EvQ{LH64~$)O3z-Vi2GVL$;<*b=Qu)QO0?NGW?EznME!ozo#kmm)Fqs? zh!-4HV<3-@{3(=`tGt)M`WLf=zjc)dX}k)^L_A`o-k?z&;^q=M+t8H9A#rn~&zEsI zR8DdB^19C>F-mw5AL8fHm_^CXYYQFW$P0dmZ|+T(D6Ap>(2HCj+J=0CZTf+~(J^jw z#(}?q399{{7Om8R%$jCbW*;zrb`{|)nM!EFP6B4Vs6dl-g%LWs1Hn{4XTFs82aED2 z`Yi+Ng02qeU at 4nf$jO9B_>K{Mrbb_q8BN4dK1n7+D?%w4AF2u_;lay!<21p}Ir!Q4 z`E%SQYWPo(qu(0T?z>2cqs}pqA(lHU<~Ix6qQnvg;U?2CM1!aiHmkT1^dGUp9IL;f zCgI2W%s$%S!%-V2eQ4BTo1)aI1b#+&?|00kdXH!ig at klj$F4hrd%XNE^gYC($2md0 zffCms+l9kWh at MWU^iMhQJ=}y4MlQrO%B4L`u z*3rtv4p-O(q_01yP5levUuAKt>C(Z)H)|)WyQyL!t>RD-Bhg~gIdCMbDEyqty(BD;!;fT$pwV+92j zU5HU0!~(qEeX#%V4?%8H2AgQ9!j}22_Z;V)=IuWUcsl3r*8y&T*^3VJE7w3cEP!(W zFw;fkO=L)%7#rqYZNr3XkES4O#f%M~72Ne)-lC2VBMwkLu>EBAavpH*3fMFd{#nl6 zG`Ok>Tss2*o at q3zf@y=$Su2|z*yL~E0Gi~#I^|yTB7_i z355r=sXJ%1b}p3J>`quN6q!?)mWB at GcBIl7opdfwJ+g2soet15dxuB%kuqcZ!P!qy zAj_&lKsrjc4>}*JwlkK_=OQO^HGRhkoZ3?;)Y#BlrmLs$64kGAdP)<#Gqh30E;CzC zTH%()*YUo7un*M2yUDCbmL#i01un46iK@%WQs}I!FqbSh$@05vddgb5jIUa2Z}EQh zzW6Hg8k1HKG1=#b#irCt23)2ZrPfSqN)m5lPQ;7lV*ukq2hv$d{>Vw;PMAEq$ON!h zWCHLcl^+Mb(MZvYA|z4)>3le(dehUeSjBWJ?q@{crmt|AX2XT=oCei(u~lqzj2O_xI}Dt0kNR(CP(Gtlz z-9wPf(wU71+xzuR6dO!qYvhaRg@$n%(Gv(J(@BnL(eF%XlNuz(4bh}bESND&LQJWX zzo#_lj`T38O?U{73^A`vY!V;RqsK_A)8?rPWQDpyV3F_=>J^2`LTI5*2c{Ur2X-tJ z&dF7b(o6RFKvB2jFrn0h6zicXgI3Db=0iH5G8Kmu$_!w6pjHR#^1(=<@Psgf;|yDa z;8uAfslc*0_0Y|z)}b^7*(Xt->+je+CJhYfhnisQ-wg=Pgd+)K&M@>$Jz@@A0qhuX zj5uZ35`}b_sMZw(-#j|SQ5s5jbPm7IPo~B- z+<|a`PqBt2EG_=9g6d#8#mXi7>)3>2+F+AV2yJsV^-NS z{P{?x2e#6Zuiz^gs9xzQ_7G#+7l!x31~uIQ_e8(=Zt`jwg$!{yf-&>Nv7^ETo-}QqSsZW- zf9lw({uBlkcr2B%UDf;{wQ#x`duXJ*@w-xzR9;PWGMS$MZ1Ry~ZAy>5R%ggkK(i()Ve99Rr;pP7XVykoVs_tgHeRQV+y*MkBb!%Co}1?T%EJgpkvY)_(HQ|)ww)uP3fq%qx(Z8=2u>R7?2g9n z8+LWly%!yuUf9Y+Zb1-xOJ5>L2$Y~i;xJ-(Zj at Ycs*u#D-ulG1+v?Fj4}@)LwAZF; zmS=lBA_oItN9FX4|KPW6%189av#QUTAU(9=pNK*P<5#eXXXN~X4k4i5jfFG^9-{--ZO`Ae2z zvS=8fBta at 5s6aSFA~Go|(Ex=)5?cH$)Sxmzh$%#n5h4jSj7_z#`%vrq5D3wg+N-k0 zWV%5rt#3fM!8OzTx}FU zx8Fyz9TGXB+-yx30({yoM(@;~z2y0A_7xI>3o#x#g5v|ZuFeE!7pqD;D`_WzQ4`qh zvu78UOHopHdX~S|rPYi8G7j;$u at Bzb(fLXG(=3U_Kct%7it zOMY1 at x0ApCvgQ^2S*$jo7UUEHYT=l4mb^ScR!inP1+sl@;gpxM^)_Z#dSh^ul@~oPEYB*H6RMFwWW-UoCN# zqiq6(Zf@(u`T-Dq+P}2%MVx%uE`#{;1$C$BvVEtgwOc?|5`CF}{r>d^tU+lQ6+#E8 zO=^>LA01*&dYw?OKF9~z10{6NC;=mlv58teUNJ0!>Zk%Iyl at Q02W0ql5A;A%Yeq6#Z{U1Ot!I)#rPNr*7?Lq2Va_mRFvS^&j00L=_B{cLn8DTd2&j&{j*0tw zM!&bM234E2#F_+}=$T?3 at M(kkX&naF4hX3nM0+COl at _>me+CY93J(evgp65XGsOHu z4%aT*mBz*_ at 8B3I7C$awU8eWv&speNV^x%0l2ao&wM at u=*Zn*fQ!U-Q< zX#OxL3KKbMcTE(AP`XZTt`E5%gm;NiC!A(Vb at sLmmU9%MEocZE2Z+%XvW1p(^Wt9W zXew%}T~?-O$(193R!b3Hx12J;MoI*61&!K}GHf zDfTGZD|APwkL1Qe(!_y}#Q(qn6Yl-P;Gg)F%{)pXQQC>w(XLD)dd0OjC1~5Z1xq at a z{xZ3Q`8K8PgjSHH_G2CV3CIy5mA)xEJl2bJ)o=U4zA^O|^u}Zo;lkz68U45)( zSm>5KdSc~?UVMD9>SpxB**CL!&yzy)PIX^grwt5Laz at cFFku!~{Bsa!bMVQ0tR)1Z zwg0Y=Xwe)=$NCtjp}gmfQf|mm_ZoVFi;Jm#Sn=80WYzPLozfI!;FpqbhTn)>=`!-Q zmQlV|d>-4{>tT)YxSt&G|0|}0C(gN_e*pm@{ex<*{{^Nk?aT%3?Cf0(|DQ3Qn&dm{ zB>|k#JngR1nle|{rB1u0Z at Wd413d#`TN=f z{8C?fUe0dd=mXszPVVp9Prkj7X?Og5{$TY02+reQ;5`q8s3E%C>-;WU3)tp+Xufm1 zkKY7H3D|G8ZFgdV?FDU^ZcL4o3gq|Q{dZekvE*L7=I3pT7Pygt^>HD4E&8NifWK#p zU=H+9x_#Whm85{N3WL;Xm?}zdtFJY9C6B`oyXJ{_e=Hmh zm?=zcjY*{dLm3zhmP|h94_p9I%;w>FIuxy0`B1%sCn_K;P4M}4wx3SpUIorOmiHt6`SN4tbgC^9Yye7&M7K-JR&G+a_~M+*P8uN|(ggq0qi0^XT8rjE<@Go?30G#>KS_JSZi5vbdgf40{vx z!9^ljBzr)Ozz=nc)lXz;D34G`KHK%abj^o$4j-6}05o3ikHCu1#r#vV>g81iy#=2{6rc*sf-*Fpo`xccqqq}3l`iDEUqp!`f zg=WsN3MsQlENY66Y+HEA`}BFl8wvZ4qmN{go0xJ8;Zm;YVx87^#|8 at mqVy_n5~l)Q zIqfw at ttyLT;TBh38tXxa at m3&A24whF5hjCVJC2a7VK|aDmP)KdRqVN@;prXY>}DP1 zXwYU%w}f=djc2F{r^`J at Eixkfr%7jV%8^~puGrd*S?*$7nrJ|qge`|SyZ8bn%8@=5 zBMbCB(^Pxc6|%zAd at h**S3FZ1Nkgc0wnv*avzS at iU3Q2$SXb#HXK^vtaX+Irvhl@TPzyX;dXgJQ$J>(#?@0*P@ zeqqDD}!D_G8F7q_RjmmaxdpLo7+kAoq$_VK&AsrLUBhgepP& z*#pXx(S at Qc+xIsUwD2Udu{hzc$Ezo)lHd8y5nDb1iNvsPTTUBEXu^PKl1iZ zB}=0E0Tca5LD?W`dk}_*BbK~0q0oc at L1#IoZEny#- at jUM+Rt8)@VzrV7p;Ns!BfD> z9*3o!vwQYeAv%>ypL2_sucXH>3Z99?Ax&A~AZA7?O at aw^mtYe<(kg$p73IS^5z}AIya!^a`pleB1};;W|8Y1O{oDZb({CVTs%jFw0vjSUAETQ znM|Af^`I$ITxO+lr&QdAJ%11WuQb at j9p(%9M_Eci{?{}Rvoy6a`4<}GDDO!RDq!%g z(Uw`8W at MIRWJd5e3O*+zN-V&~<3WXZWp$byvN;a at E!KmUD#%~U=cnpam&H#cgLQMe z>vf)WZ=HI5|MLN7fNlxLBM?8SlRP6Q%vL4aVzyVMs at dT3uA;2{C(_Kab%WB38uViUcB908BHaX%ft099qVFdvVnmj;#JG3fKoY6_iH$zJDaZct4duFu5K` zF9`n$NsZxbgo+4;O#~Fd3;`KYL`CHH6%lPUp&%m=8<1aV5p`@WF9LV|4jS-o$}8A5&E at m+z55g zYeBkXi4_}2J}nxEQqZbNYm;C=HMcyLHp-?VNw`g!Z6W=MV*Y~c$Z0g4O|v!~YZNDiA%A)wWWQQBb#`P4 at tJVA)hY?# zV4y!(y;2kg60Oo|nbxu!Ex(kO2AuH;-`e*c{xnKs!Y(m>88DGxutkSpYArCln^C;~ zNI9}hf5xb3v&X~Kh=$7v`7?oHf=7q`qFh!9=ff|YWcFCH6=ZFzYPZ~KsSP_o5RT%b zZxyj!&^%$y32m;=r^iUifwkLouF-AV83Ws)QH@@}-5q^EXk!<8!i5xXWs46rk?vR1 zAG=|2?^1Cz7e0Tosndq!gpAw~)nrn}X-rYE|%jV_& z%%r8y>};~Z-X(SZL%MlWu+y!lS!%28Dk}6U7fg0=PZyfV(C(Z8rKVUnedVU9UyjkD zIpqdJ^n9bI4oU6~qDaXuX4hRz-_a}IEbw%wU-ml-R+-FotX$Fd`VR(|8pl|S_PM)F zl-Xi?5xsi(%%^VfR(rQ5vB|RXx*ajkW+|T+#Q_!+>CgHJu6~UcLMVDO1oyG!`QhVR za|72b$hl^x?i6ZHUCFT??9LOf`5L)Pna8Wn2-R*`#6vO*%Cvfd!b5B15EZyeu}ZP3 ziHeCT43rD;ppcoPLO%K@=RJMT5 zKJPFnV4m!rPbDx(0hF&_8 at P-BRIW(cARX3xo{%A^2e^oX!~yNbn=up<%~{bW#0TZ* zEqa6}ioS>=?1_fY+%aav6^&hE+r%+y1f8bW$dNk|Qpeft#$ZOtNEM=mEV at f#Lw32;mn4OUmHHkIUO*Xm5WXprcM`(h6s%2b*=r1U9#_)U| zhIe$t8~&Svh at 206LWG4A$pdwy3AQ2&=K}?iWn|Rlp#aMX=O~tjZg3%GQ^XrQ{m<%g z8K{=`yD{1C1i)OMW4v3oxjvPI(~52dCG2{w at FtJNq1}Au!D{=|uQkiUOUJ$=#n%q? zZ<#WpvSf^shigbL7S2+S>U5^%{-F(VDA8~ENn3o+y7xAYZZpVx9Q>#2ZD^q)^TV#Y zf)`PXojyb at Wa(eAcv*2vzeko@=uhUxhsbUr>X~mXyl;tmyZ$Iz4Z=7)i}>pF at qh7F zu&4);$!Zm)?W+d~)dR!v{`vDu{bC9v7jATVChj*i){InjPei2n(7&xT5&*V`(f>yX zTYdupasKb9scdO(XXxVU^sk#DTT-l at m&8y2doeq2NQOZXAhs4AEU>NDA_t4qEToWW zncl_>vK_Uy8>&{)c#?7l`YD)&)AJdB1O8F~oJlq&16bqX--f!n%=3I-vyCVI{>)tc z0MQJ{5J3K(Mv-Q3J8oU>T)ehmU1OV`1q(EV(smPX!qWCy`qs9$SiG=|U0^KXu6M0r z%U*#UbD+(NC5bHQ?ALMp_8n>w?5bgQ2DraoWEC^J;#HPZ3IqZiA)nY3{}{RY|1~}@ zUAfXMEwVl5-MCZUwdq#y`B`mkE=5L zYrGAb`tqqN_bAy!8gJ=Vav_&bU559V3+l-x|K>F1Pu2U$a--; z at R8rAcScvE31X*77YQn{39oa|6vb(YtXfp=+_!?~@hxrLD5G zV#^!G*)Tc2)#efr4SY}}XiCh^`)Oys0{wJX!d9T>zRxC5*e}Fg{bn}5EbDexLw6Hk ztSMi~m~E&3!NNb?xgC$>3=KA++ZDhw4zTxeTZE)(Hx2{f>n`s+*>vyql&;MFUMURf7e0l-rqRbm^p%} zWAaWK)$|s7BA%M3L1*d+$8R3-Nf>4Sz&nLC#WiJ`N=>7#S=;b6sbtzQ>lA!KHbtAd zMdPk<+xR8+C#MWif?%#?k!FrI-!X{$sP5uqP;gPWnQH#dH)u3E6a8e84zCB)KXH2n zfm2NULjKp%p-cMCj|B-HL!kx+ROcXFwS8Kq91R! zx9B&zIlKEqz&R{@*3uK6Uzu_i-rwIoRs*v`+Si&D3=aJ7)51H!e9yG8KG4a-A^OM* z$4gj5Qw3mSWLZW6i{+ zIAbnErAT96n2b at 5(TI%Fj?-$x^HYdS%!EmB>3w>!;S=#3NNf&NHU{jCn&C~Bpllw{ z|N7NdKiEJ0{l~(Vf&5S5h_b1ZrJ;?Qsgtv%y`8G0h at gqde@w`@nA-k-K2~YQZb<;) zFB_bzF$^prrGk*L6lHAADvFmNSg{ga0 at WXcauNG1ldSg08-p$aywF~tG`)BUs=$!_ zNnt`WTXlg4NNMgS=FjhFvA+*bPwGI{>jnzbW?2PRZ0>OH*tgN`{0>}>=O4i{$BuCY zW`7 at Aw|G%{Jd_iiK0nVsGE#@z9zTAXb8&HT!sDlBa6Guh1Ic_$Zb1+FArmooBWs6< z=Ptl<(cco55DTWny@{f?`~5fkdROkE96E5J=`*ZO8?L$@lmUls^XM?qUMbzC$y|3| z9u!7x;v~CQ5fq7O4;pX2UZh=&@FP(H$sa_C1P>qKalcu(j~5tJ>;9tc%Kh%E{<2rYfLcnB at l$om9F;s!rwRo34=8SFb=`$Hn6(J(*fW%|o4tULk9-Mrfn zCxoO;aLTArbu||khm|{@{jt5ph^V&hWL60|IyV-p<22*2 zJIkD}(n6;!q8Fyma!Y3H!HY at fz1d8IkKS5M_Tw-Om#`H*s8wIuzu_51ZxyXA6W$${aDOO>PPPm&DB2dp%mLk-6`7n)zomQZYHE-7t}Z4luxzu{ zc3WC*&tS?#Qp;Q{cFF<|gB$hE61xxy at _%(1Oy4iWfkf(&jM(+4-`?6$$%XRz2!?lC z;Kj<@WD2G|*iB%{R$#M?#KdN?QI?0rY!#lRsHrtstZy6BC6;CH at gfpD5+-~$No+$# z76YK=icC6{_X-q{1tUpBz9;6Vs^}0SCa`3K?$F?R#~5q!isJDWRa7(66?jcM9AS>F zFhe?>W3S~L&T#2P>qZP4u<7BH?vxr6s93bW3*H3vZg3jPVtoujo?To+6F>*^V+TjaUBkZ;B}fPxU>) zlQ{hGlxQ~=^=3FSAt$5RVod}=2Glr*t2SKLJwzxx(v3hS58F4+}8I=$*Oe8G=?#H#@TQ2|d8%7h at c{*X195&;-yk z^32>L4Ndvs3}oYrKVb4Jy_Moy`s~KR z2-WHKQEzzkGK6bZI|Dpx41bk1*Sr5JYxw}I*5kZ{^mu-i9>#z9+Yu*uN^>o(}DU#jZaOu*^hq`4a)x7lUYZ8 z+|>=HZj$HObsh9J{X6Mjm{y-*mzyP?FI*5am{sr8a3Nc%G1}EGv!XZ39|D>QijO2C z^npUlMyTZ at oE01)+AWMnmwTf>+F*#49?C90%|xKTyj zAt0a4-%b|y-k7TyYmCT~T zrhpbyv4AzV+>EHM03tL|g8&K%6=8!*mZif<77{vM1g%88Qvw1v2_BRqS;JytI|bJJ zG$(W3k8{SJfA2R?eW*8#G~oSu-1myB7uzkTr}!*%2N%$7*lVQ0y1CRA7Y7e-8kY`x zG`$n`P3#$eoxUUvvxT|e(T7K#dw1RWU=q~aJZ*K8(eHSWh3NqRg5AH6IgVDP!$QWb zgc%9bJ1339Xm(ppfPq$4rs#B}8G`GPR40R3ku(Kpxs}08m1*6KzgkY}p}b&D{u~pW z2xtnvM38^aIT_+w)$!=2*O0-5vKHy?~q%KmjMZ=}C!JY>&Rr z=b{hy@`#G&nfPXi9MorakYKe8D4w+UH;g+b95IRO=7(epfO(p>_XD#8lA?go70}cN z1@%*{^I)wnHvn8s?I at g;F_p(uF}P~0qQKdt+5y_fEa#y4+nTUm2}^H%*EF|z zRqbo$p1j^Epd!hBH+y&DKQ2k`p^PJda6m$27SgORY$a zX^d}Unm_;EgxNfkd4fUHN-PT=g)uz#Fp5dvac}~cLSHt|WgcUm?@S&K^bYGB{>#7_ zqslD2g}rLN)eXT^**DXYI?h^V8~I&y=8q6a=iHqsx{OcUb-$F*0O8Vqpcg)sI7{~`S4Qh)t~Ys z--2tTyN>4CRP at If7(D&k^szVDMx|F(Ie{$zgO`7 at m+?$l1h_>{oI&09xzXr zyJWd#drSyuTTF0yW=V1e{AMLccCh}M zf8CCajm?(L&y6jO_pE^%TO_al{6C9I{{C6A=E{>vpRTCD%4VDw(og8Y1XueS;2=+C`_0dF>S^C$up*}d(UsyJkgQ=@_{FR?%esa zC+Y8mBTMF7dGP7Xq$fP(9iBg3-|(z?!;_QK!z07q^Qz45$H*$oc!c$$SxoiL+E<9K;Qh!4g$5eEey+IJ-nkc zGH01Bxw7$c&cg#s1y()@Ik~7^$>R38Njp@`Hf?wKFD$;~f|raydYwqpwO)rBmxO5J z&Bj&6pVOYb-tIr2v1G&ffKAcoCChT(U#Wlmd7?c3kHP{ir^*lMOG=M?IPh&!$$`l> zpTbz~oIhscbL_FoxgVRq?0J5=;77`omi2y$%M7!(oNVE9Fluw&AF9owN4MPD9N^|MVd1ae zu9DL}UzpkBwr6_y$J9xeSh;#Vt2JBl at 1?K!pRCLC?SEX?!a1JyOQ&?nxJ4GnAD`4W z+iF_rnimmQ3r{!kr6n?^a$gVJSit;QY}ExFokLp+qIYH+ at Z=;Mci`R4_G-uKE4IR~ zZy0HATN`rth}x_hi=JCayqgdbsus!p>as`4loR{i)`ys=6-1pbQu;`1w-WR`_^T_sS*@<9TsdFrAIdjUHzBB##=zm>td-UxY z&*XySk2*YEC%9VZChPIPO;xj>FwNDzAzE64worbSak=d>V8Xe@%)nqwYQlj|pauK- z-v%a|*)uE**$$-}wlpa=81jbgWc%uHL^0 at rQ)|fA6d7%a9Q{qx7yMh}mD?QEsmu;c zG-A&M9G5n<@aLDgeclw0#<7k zM87ufIk?!{ym0BNCt+(BK2y<^^Q*ouTlQc5#Yc at tg|BLS>r7%E&VAc{XSc<(&JV`Z zTlXsP9T8_+dhoWL^Ut5M5@!}xUy!)|`H%NO1M7-y21}+jJdrF4oWAgzT0PIX**~tH zfATf8-J at pz`|mF at T~$@B4)2hVaTM#0-FeROPMG1kMQf6Rj!x+l`XnU6=_;G7 at nS~9 zx at 0M3t2BeCL+mwEHY`fyJ1w#pz|l`!P84XL*)6kT~ceVxF1kHTYdF{d)xZXI6s_oexn9^d2c>&~y6=-0RCC;#XB zZ{*CPzUi;YyPwdzsIomU`j~yh`KXT^0p5&EA`FO#pZjUwi3z|6KL^A>Q8eJ|8sezy z>F1{J>*(j{<{BKL=j(=U!au&78VsBa3_21F47w<~58+KnjwxlC$*5Ba=tkfF at z;ix zkAZw?JJDT{6c`Zgm3 zI2uXprXzGS(O0V at z@>QN*RG?RioUoK0V-1|S!#(?gA_`_@(XBzBI6{DFWt2=Kq1%H#m4E|$bf^If?pBVuTHId$fMmHV38-f65TgmH`pxc1n0YHGQZDe)_(5*mk cDk8wU4ze1K0p6@^AnoEnI2o7=o_2wF0KKg8(f|Me diff --git a/extlibs/asm-util-3.1.jar b/extlibs/asm-util-3.1.jar deleted file mode 100644 Binary file extlibs/asm-util-3.1.jar has changed diff --git a/extlibs/asm-util-4.0.jar b/extlibs/asm-util-4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0e1059583543a10cde82abfcfe3fbde37347c8a7 GIT binary patch literal 36993 zc$}2EV~j3N at GdyE?U^&SZQHhO+jz&eZQHi3GkWKY?K$JKzni=J;lIh|W4^1yPVt7h#Z5lw?v6QIwICP*Z1A zkhDnXg&SeU0Q?o+Ka?*Ki$N`3s at H^wB(?TPyg&u-PD^cldzFMn?FszX&b2JS+}iWY zBGVMSM^|onLTE*CLJ$>>&eXt$hF5fyyJoL8L;<#{x531R)J#A$(^}TN%Uny9VDy;9 z_?SsK%q+3|ab+|;-|L!rQGW2`=4 at 6z&a4Cq$-G1YXQ@;HbRo7ML$wc7`G3T){SQkl z;6LBX{}ZbJ#L3l)$;s5#!pz;v!j#Fx&4J0o-Nv3tL`}iQ(#FKp-h$E0-o(v~@5O0T z5DE%P0LoJm3LmksZmdQ8J8!Jd{TrB4GS}x`xzg6QMrw!PQYCF8W0^4EWE#?Li9-gi zXX at f;sY^i?1|r%Xq^fD_3QHDd8mQ6}D43;IkW+ at N4!eAXbDf)=k)4&6Iy0nB(rxSR zJfiX`nwp29kx&b!CV{(h#3YIjV|V;Xg28>2aKTm`Iv zK}N7MAog2dh{)+t_n%ALeF`2HZtqcDY%8^-{QN6i%=v5SY3b?tpJ;OO|NEFM01fv2 z$pYsN2G4_l2tfmp6q=hII;Cjn!k2eY at bEPWer`MNg|~1d8Xzyac~$)6Sr3l|&>XFR z4;+e}CZlgd!N++=c5S$Z3Z at FUWBdad2&IZf!B|EK$bRdb?y=6uxL8e at 3&o)3){|$? z5BAi26{*sPK4s25b|;Lb@;#_%^%BeK^@J%-?Su-A^ZVi5p5U(Swbzm@#Yy)|)o?pm zg%VM>??G9NxL2cXrzff>-6AznE at iIa&r;8IFvOMgI7a18VlBwa@*c4eRcN6-l5CizuBQKuS zn(3SW+A!!j&I&#yF!AAb9|vacL at RiN%N!_%SZI~CG&v>IlPtI=%m;s;+Rx4Tpe at +G z-?3BdafLn5APET3Df(?|R8r$BLl4nl9lKkQ+yv(_X6?DJdf3BBd_=~r+tkDw>{@8R z-aOLeifVHiD4tdIhv+<1USH&-0+lYXcSOllcduG?LWKZd{YNZfEqNA`E8G}(_*bxr z5oXIO?IzgsQ=F--XeWAT9SMMF=^DBlb*jY_gNsNd6A}fZ%z;{X^V=)_fg4=EGxmJ* zhDIkZYYZm{#)GZfb8CbHg2zjscoec`EEhnx$9oE1?4j*SJi4T6Nwv(B4wfb&CiGU( zH4YhZ-50wSyREe0;GB?nEb~L~w>*1QAd^ECvJ=bYJaM$RS+O=Zo=A=rZT&P3Og!@V z8pTw-l$4a%XR=R&d;Xk at hK`MP`vD1!huM{fGJj_DT!Q9zB z$PA_$A5aqDmqG+{OUzRDGa6wnY9bc4NsQnL$!QPEd8FtDH@?epD9zo0M0o0Czk6}8 zM0owk1*M`}a&to{62!c;yg*V2gWm(DfS>zft>$K>j2yK zsplf=i`)jC+pGH(Kd&ppXL~JD7M!%uAdFnIRF`i+ID9HutVvS_%qzV5LLjCh~dHQ{Ym-! zm!3xaz*K{>+TFN>(}dq|bd*eNq6sxR-p3=*r?IH}G57BaE}1#xM!QanZ`LWoH3h?a z?$?b%{XAdTPrSA(c-LXQc9ffiEbui`FOfdr&{)~_Z~187bEWX~vy*E~CBa6Ox+iPb2V*ZGNt8BL?SeKb)|)BX>J7QW5F9%XrZX at D8r?*vHX z&MomU!u%|E%8qh at B_bH8uX+q>zOY;{>j~3~Xci~?&cpH7X}P?8?KM7Y at wjE>xg_wg z!+yyzxSL67D5Te06~rCX>X})=@z=G%mvzac?|fVp1LnXdijga%W5iqKVEP6#VtE&n=FdY zf at M|=(~?OY%8xY#Kc!YA&H9A~x0Y7sZO_f$L|k8?hCx*+K0DqvLLhQ#m at X+$Tdi<+XXnd};Sp<=i<*%+?wK7|?dgfOf_!We zuV at IbYH1#5IdJs`Kg6%J67`Az*kyzj^SEmA4bEi;Tbm*HznHC_1?M>AWZ?n!GhPH; z+PS7|={2?_J)F2HJ%N9aDwkd-5!BSt at K{hp1613{WgKD>j<#(~q)dZ at 0u0oqa!I at qN)fTiTVdaNOf(kQmZX8X%3a1pF7bBLciSLI~sNvsZ6TlO298v z_Yu07HR;##BJ)hq^3Xt=98wH4li)Zt?~s!WlJdxsQ~MO1-zCnKwsr!zj2T-6mEH87 zxW$3L&wMT%U$cJMH0a at QtV&hYF=rJ%gc7HS1Wq6rfiZInJV9oJFd>Sehz(2k!<)s& zB$%o9NQnmc-RnQ8S`39Ui{=2B at 8P7J*+v3Bo=uy?kIdHCU$XhOmFDA}Pz$O{m;b8} zQZ5azBb;Iy{nCjk6vf2&=PFcu;&^59$r6m_OFYV*@;(-_4O?-j>LuREkxYDXygS0x zi}SeYP- at fVTL=kWPN`D}$=x(P;@gOC0hG at y8t{2{oKvd12%LlsyCzTK~Bg)-NXjOjQI_p%v8#+g^X%|dkFvm-HHT?rB z3VHV(y#HpB?}3$!2X1L7H;83F+Y2ct<(SbL}(>=kCH8vrQ| zAr2V_(0hY7;&?E!__Pq;eA2N4{U%A=m$2y1f&8pM8DSq9YnwP8+L`5MW;7n?lg`F#e~(Q z*N!%Bg`mT%lW*D%O^4@{YU&Q1N3RoYT7`Im(WKE%Hx?YOfviQXGi=Hay+NZV*KRZp zVB|gwwKBM;!S??RS?DtSpPC0Rco!^x^cW%B4c?BuHCWuM#uXYIS2HC;{zBpFj&G<6?`GbG z_kpv^UJOuER~`OTfWUnByC`_wKz^S+o9IQEoSi1>}7o7aw$c zlSG%WCOqA49nxvH4mjR47Wxxf6}dAYmmvbVYrDG&7jz{f`5Mj}Jp_wO57xrbQ!ww$ zvK9!&rKiyL;+&BCeo+sP)vd$T?+}*5Z#c4vZoPQa`rg4Gh$j^LzoJLuE*zo+!$z?t zTS{HzF-lq_>?14Wd;jt;7+st_V;rC@#J-=0V4OLV at Fxu6LWM!Grf~ihLK4F8-j}6? zsx4lWBa9fL3+4fF3CoV6EngHnwBaupJ2umuIRplFcKpQS5B}fPHV>iu_|Ctdm3XR& z${jX at 1||oaCufWsasr`=qOD+z7}5^GiMFL^3>^{+t1k+ihwwz(k{}T;$`mFJ`SHI! ztUP;?4YUMhIvD^nocM;|g>}cihZ{gUB`bwKXR@$dT{zmYhePz|rJ=mp80uW60)X3bYHP6-(${qP1kYn&|a&P?E3UIwf znez$7x433=3C#9?Cm7&2ywTB}Xoz}>76T6dO^H477Yc%jx#$nsCkDhE_4)6(EOh?5 zp(f^;aWXvNM;I4RPt()nq05`}IpOroE9|(T9{lF^a`X#DCO9dTdQYC=4(ipN2yk7F zI|DVFH5t(5EgU*IK5|ncocDT%)9Q{rK=$#d9W&9^`X)~#IvcNgu3>$Rc4JG_K#AvG(V;fFD6exj6ZwGwaeK1&biKnq4=JjK%#Wz6pZWgf$3o-yb$8sc0}R$ zTQtxLHn3rAQT1y#uF&nl4W+aZsZc at oz^&|#`C4`B40EHriHTa?O|Y>E6YjHQ#2 at Z6 zWkgYJD--jSat{5>X|HC=OuV6i{zPl?y;n`f!zIv)*6=V-cB&bT)>R1F0JD2>7rs8` zgRO*D^EmzN*NcdShR^=5DLS(WlPQJsX@|v;S!Ln7qSdDKkD`lbe*6hmB zQBfr=fL-x=SB)L>=dGVSTU`h|yBN*y(T8lgR3U5HEtq&;e}eJqsqp&Oz$5Y-4e##O zwd}ZzIlG}&#aw3ug`zg^HQN!R6u(b~_e&ZNdBpK-gc*z+vW`=Y%;wBxfLN`oO%*BE z!a;7%agc_zM8ky*f7LpxcC#*&TbaSc-*wiXSq}AMWzG}%*^1pq{j!|xG(Le`*BLhp z&J)XI1)Kb*{#2KR-($dwX?LBwOa|yun z?O1nh>@Vo9E$DYhn)7UEGgjLexkvZw%J+soN4au4ML)DcST z83nzv=>8HU)6X6Z1+{oU at e{6}fqwPH6%PLK7V)syQ~4p{x1w{szZkytDWD*CRDbE) z74^@}=1O0Q at Y67gjJeem{Nh8K$)_=s?I&Ou_Iw~xh3g33xm5 at wUae9oDnZxIwxI1U0Mz5XEZo}q6 zYTtG=QEyUui^Q{fhh$q5=1Lpj)x}=w#oMe|&Cyqudh>pamv^$jo9CeEVbHDCFcfVY z#21izAYhUEm&Q(|4{ID-)+}EwuAaebV>J^;^^8u|QAxBx at f481tLZQ&Li1K{ztM%c zamnF%0b|`9AKdHU%9A_e&*Ekq>N@$8LnopD}DImEjSpTQEhY*vgi%XbvPr&)n*!b!(TL1iQ+2*r=NbQISR}$Jg4!l zEZlq3TIH+KKq8f+dJDtPh1RyFdC!q1FXtp?)giQ~{{*U;3dqo}3aX&J7pPkOt|nrI z?59z)Nb5RCa~9Pt_>?CqC^!qCOq5=HikenSDL5O=sZ1-k at KJ77R}}q)DvPDIk^O#u zB0j0!z*oUSX8UDj&8xsF8Kty=Qx+XP&5OK;yaaQCDMgD2<`6C;#$ggsx9jv)Xb6N zRoC=73orIhma>^p9_^;V6aD8IIr~PQ at xL+RMcF^qvO_us7?oU!q;bPq>fW~&qN(E6~6l5LbKhr^Z6^~U;4l7prOa_&` zFGaCEG2 at MqD()xtPg0A~LJ>V_Izy|9X4s6OR-i9oko2~brMB_6yU?(b@;rWO6YP3l zh)~&SCyg!E?<$+9Cp$S^8U4!-Pti at 0wHM;@E1@^BoG8>PJr(kQCT$XB=CC1cdn16d1;=D+ilHW(qght;@3 z$0DO~Q1J&hVVa*bUZ^m*&$1C+jMuo41+^_I49)r`bhujet=5du=T$g4#{TvE$v#OJgX zywd86thc9Ai8sxa_?L+4f2uzD{;f$FglBNq+LDiaX2&_Z*@CRytvU2 at F|)+-S9iOo zNVj!`|7%K7{jc8YFE|K at HVg;| z+yD2JLd at F2%udA7(aGJ!-NwmL#N5Q${r{O+q-z|gp=)9MWI#AY#fmD&Xt;|klLs&V zB++JM6gr?_;>p3kZYsDcgytIL*snY;b^f4V$0iPRu%)|S$~zd%$QynBbN5}aJc2UG zV at E#la=Y~!@LTM*N*Vn3ed7h9br_BU#UB1Ax-Iew5AESO#(<{m`Z{BV=b+kNR&%ym zXSRj#BF)~eU!8%+(;}yx>xfRTg;A}d4X!#)jYcQpLR at MaPmwrXu0Sgxs#D_DZ=&FF z;VS*#lc3c4O0v+N`F+%`!hX~w->pRnTeX$nwdXV~4;vmMG*~I)d=4wUj;3U{rU$}r z<`#^qY)TC-CLNpOG8?>=s at 7Z;O~vH}{Kw={+WDoDbgq~dS)ZB5HrmEt{7z at -fZ{d@ zsWj<-Gue2i^$Zs4Gxb32$oNf84tIe(vn(rZV{KDuHhMO59BryAJYQFdbicl$8XiPc zCxuPNh&z>U_L&&6lA^pg0~hvZ=tVZGor;tU0J=jnVPpza=#amPrg_5el47PP#;x`` znUPcx>*+R%_e7{>7n-&-u2KDzL%>&w0!p zS^{nXwda~EKaV$d_a_2nct+2ADE7ff4P?)b>XqqHe2z+U)u5{NkY#&AN56U5KERFnChN9u>muwOIVT_LDQxp75;AXq|H!NS0tU=U#QP`%ZF zbwfNMv0#}H6A+B>`lwOx zCc*);G{7FC_Kj2)w~)1t&7Rp_@&Q(`vUO7$(*4&&rC%*-qTjhz-mSux)BzMq3866g zQG5)I)0E(1_b(>zNA1}Hm*F{ok57#eYwv||u#3*qs7DC}cOHBKw~2 z*^YDnCa~TN+Z*=8Qf)7C-_-}>&^-3)KRilaTY^VmGcX|bH4?s1*(SBwVt*giBlS-b zK0;p${ZAfgW^!uUL;?X3B?SRt{6FxB*#BaU|3M-7I`IB#CzwK&-P8RtOv+%Oj(Q|8 zvNC!x+^FDHoF%zg z at -J`L;NkAcTWr8u^g`ZBz;M)eHPEGB*vY{q at RTCs zkZ&!mvG`QRcWciXx2vk1#UR;{=z+7VvwDK{n>&b6_{w;}H)^u9_H)@;K1Xe5&rx=k zm)KjM^Iw;%-E5%qh`m*}w#Yadk|;Tpx;%ckQ*SCzHjh+P*j$)xfUlYfFpa+kP$b$X z;76a|dUHBjObk8k)vt)q*>|opf2vu08t~13SFEUKoaw!^Iq$Nn3h3046MfbypenU{P_FW%(z88-7K`HR{VrgeY)p^7DJsqKV|A$!YgRu{_f&2+(UML4 z9m}AQ{zt2wA1r;#ORHFI-Dpjn#t>7s$U-;H!h*M-e~TlHlQPF3;~De9{Phv;c?OTM z5X;J9`~E2nv;Pl3c0_|WIeoOm;+t5ZE5*l;j;C87TRyu7SBYX0&e2f9WI3gxJVYl9 zQ%6B{BbNBOhxNDDb2nx?6-S6NoZCNp;t z=dwQp_Y~opYiFpIuD8|7I^t3~{o&2(Xeg3!yTo%87IwW33}#ufGY|ERW7jFGOGr at F;SrrkQcDwJ;-%eJIIqJ6u;L!kmUSh zjUrGXKT0oh6Ne|0iY#oyzEjflce=~LT{v=<)>=-lC{C48pfk>}BVH+~_o9WFpujGL z;-7Br+eDu{BnswESGW?!$aO*2w$d$&b_}7lxpgljK#fGx-97b@(w3m4?(g_pRY%XM zb{-P?TD7pp=b5l_1Ys$U!|5g4RJEa~OZQ3x+klL4ny6_jLOQJ9437WO#Io+xpDkrKTD)j1#3FPHrQ3TN#V{?jE~Q|w<5X at c)(S3W z5tV7vSQrY%$X$!#%sg?S2}=^W>Tc0C>G|)%piGwEiSdq$X8v;br&hkpW$(LcaF0u3&HkbB zEqkMszq3#6;$vFbY&r7^d|Ni1rwN*REGi^QH?oxW6qKYeUvh z*khC>G21;#{iyb?S2oEQ)V(IktcWSH>*6SgE01EEkB_|6h*Ko-!rRslt!iD-Y$Zi) zMqE!QBClFwR5ArQDXn_I@!GVzbM#5MrtNXenXyYpK=;bULr@ zBLFyuV4sdrJjY5Dsj>Sk zwieQ=<1%4RC!bZ5>9Ec)#*rgXbyCSYBXqdwle%z3QA>tTu%9nvg(ulygrzW9WY7mYD%f;9#5v~MdQZbG^QPL;yPv?YOoSy93tV~ zrX6yy?oy1}S$O9oG-e(mvi7L}$XE%|4+U8Jv;e&p-h~K%r<~;he`lTb0mxI%jR?eP zhl02Oi?<|%zq9uyn4FXOuiS^vdWpwUh5ERt7fELxppMiI2XB~3DmwjT;_ue~P zI|6P$Jh{~dZ4w5DJPb*jXAG~%e1oc8Ga{qu9P|E&0GTz)Y!tCtccQYP1wjnX;GZW% z9EQ!TUo(Qc|LC%${svK}dYI}Q4OeLTQV4*;6a=T!;D(Q<%?s1SEC|P9`U2hQyI0Da zY$_-YGeI9!WctF-#ob_OW3xBk8f)5#jgrIB#c43!nrn(T;S)>5Hb6l0`~;p=eE_lF zOo_kH>~J+%`jQSM5ZdnPuAhe+v+uYN2FLCE at A>qnmS&n#4rKwgIG)UX;U<~Lfr&&= z at x=wjA;rmuv{0t+WUXJ(hmGfE%DAT=K&L9^Ym2Ug!*T>Bv#x?eC_n%LuUI4UPr`p^ zAtSs^DU{tAb>*1UBL9rGSuHO%1s|dje`Rt7AsG!h(~Rl at W&@aGT5)^)pZRP6i3Fz> zS<_8XCXk~R2zofL%=%ZOczGvelQRe&2(h at K2-wW@7TOcezeXhxW^r?HL_E0MNpfpN~nSRVr5`N zw7{KSfC(i!cJ>Bng*-*6gWw2zQ>`p{N zZIuty-T)IK9U at JRc8BYkb!lH55apw;MY2I*HpR3m);SP1_> zG=Lk?$6t=f$))}Qf?s^Qa1xm)^2{6S{`kQ#em8J81Aew1bkX+pf+wqb+C%H~;l&S7 zyx2a0e{U;GB;-nv(VPqJ4umcU{&)H?N|seAa2Y!1yCrw#ubcW^NVQUsvNkzWCa7yb zo9IMYi}vhgT-bKk)g;V}koZ$a0em2;N%BFjlt z2jKGeqxac|GLcdLuQh6kr?;9OkI5moF3Yy!Q=F+^vboA(ZH+96UIOH6BnFFi_8e}~ zuv)bQwiVJst|enl8$beiBOg;G6#B7{BI4Xf$xR3UBaRC5%R>cRbosF&~r;K~Ud26_F%OjIOat4iegO zM|3NTnblINQ24>UIi6{|5B{FCZ5L|^M;4Zv<(2x(c5Ab*%I0^ULoNT@#@Z7{GRJOc zmtadcS0Y at Nf8zOsFgis~vNE>?DI|@khwPhNmi8K~cM(``%bn1uYu4#%i0F}v{RhoX zX5)J1C3TMuYV!&-ePq9aRfgKVu`a0$ueX8baL;xyS3nGm?p88w82@*J%D;1oH#{k) z7!(>-VvW(mmIgnf1?kW9qE&Zc@*il(Nd%PaZ~ltaF9mj%?`f?3%)tcaC~2$y;A#%Y zu4SEKsko^rxs<%JOU<)kaU at 3lmXRk6p^$KYN#Zf1>`%mUq&H at fcW4jMqGAZ(zh3T2 zbE|Y#e&V)Vb*oK#azwp)AL+jiClytSqC1ubRpJJFW^aYe*pBEBhT(4hqMc-2(;q5L zIJh9Rl3PO;TH#hZhA0=#p}cE;vwfSldumU%Jk^_7cVAn`Ws2_OiMF9i9+-ltd|Bn& z!D3YX-TX;h=Tz05KVyNKd-C>7cf9I5TW)XF?>?)NWZ>>1gMYbK{*L+LYBL~dtKY>$ za+7*X*mxm@&c41LAKi6jCCB`F0jsP{Mf0}c4Y?r#4EmofGP?R(q97Ouh#tiMxkZ+= zv9LG)A1!ixs)N$1GREXTuUz*vFkT`|Tx`H^58(h#!7=mfEc#(Ba`OAzhW-T8&6FFY zZ`we31$MTSDLHhZw1?dW at KlD_02g21PriR{3xgMTLPCLHTNA7Ft{`F?jCXAITQ7TE zd+tXQ&ChGl+s+b|Cj+qN=XcQg!s9pCc)6WkiR0DIVyGN at 0_#X6maaekWA7$D;ieoh zrWEQZQs6p(h~)7y+ns;qMJj at 58sr=2wAm!(DpN}Ubfz$B_3+y<0aSqgz1sYJ zhPqVq;y540&Ub14)R|PtD88yBEL{LVpW&4vTQ^Zr0tZD1Cw!;gQOc!$CyDO?pV5emz^o07qw2Q*9X;%wZ;r3H5ZG_a!DnR`2}K<7hK)SXerZ@ zmSSQCT5Focg(LTDu0U5n at Wq8{k$5%~Rz4AtR?ES|F~ZkS_3q`NAu_U1C1jh7Zd3BB zzARjz$t40EG~`I<0%6YKPZ4B&zUDKVv91<(x6 at YHu}I;p^{i?`mOLUxUgOqRSwt*! z#0gQy;wSwN*#AVL`e0g>9ykaH1T+W;%l`q13Ks6xPX7-S$yxq480*!I)bKS31UeDz zwXsEt>Ot#wusFiQ8Mbs8+Tm#Gn_=6OhcO7xJpWSKZ(mRB^{*6U1z*Ht5gXyuyc3^ z3{aeZNmD-)K6F!e_cdFz#n}+*hMX_NOL3q!Uj4f%%Iwq(b~_{tSgre3J4!A+4*3uQ zI?BIu*3|7eg(`DKZPZCLP`EtN|lpPAWcosLoFQEfz1#3Pz0jS4e{Y{8q<0sH{yC5Ih3tWVC>@zAs%Dys@!)c z5IE9mFJ0Vyl0p7;*Va~d)|#Y0^_Z)U=kc!rvO$u+gAiYJ0rcP;ueut at iA`lHiwc!* z at yS7O02+$AQbh%9&-miR0fUN8*vrWA8_DuD|FCx#<;~ry#cLX)09 z&Vq?`yEGjSeY>M475p{wh^8&^sGYvzZd6~D^uJNjvooprCvg~z_$Q6wTThZNC^i30 zao#sY;PQ6&?TR+!$+4^SWlzahq79m|rCS%3jWNt6o5!yq3ef?#iP>4+^ z6&V2+O46(!`|&!y#q@ z!z?;qczAGus{Ky?4x3I3>O3^s!iknpt;PO0f+g^hSamY_x9`lpa&v&PkN+yw6R%CX zg3f}b@$y3tY9c58Qj4NoNK<6Rj7Ru*z#FwDy>xRI14xw#qTh9TBV+kuvLH7-tQw>$ zI6s>^$)1~*c0%y+L at q}VykKC?zK*3*_4hP9y&k)qU!=m1E5{^X=iaMB=)p-juIFM? zXyQtVD|2q4N|COp!FfAYr(dWvJBN78Sr$sd8?o{FVK+56h73{)^-smaV|I>~9qbl$ z8i6To{HhjI2Z$$6{HX69Bs%Ixl&xZY#D9ZJVppRo7F+eke at 8La)Y*{yx2nu-4Xc)JYd}ngtNa6-ryYg< zAns(47kglJ-2hMZd6i>oZNZHhJ=u|x%1uGro<2(0rtLO>W(Vcxi%_EOf)#D4&Ur at n zTQZ|M-9cmiPlywdKL+bsZv3KNS^RUeMu*Fk?+0?~`OK%Y^U2IX-xl6F$q*;3jCJH(-bS?mN z*EvA6#7p1NR#RP(z%4~^5a>S;BF7Zg5c~*F3vVu69M>=aVWJr02bb)W4>B0$DnuNV zoipD^pJawxWyuTb%0MlgX(lpHG37R!R*52TU>89v^CXV$fUZzfRU?XyetnD^VeOUl z76EAqHydS$bz*Ttn!JRr=={XXI(_cAFQz_NXn+2lggzUq>cMhJQ z`FRHg1%~HMb>L!I5BYHI$Br^gx8Pah$?v2r?bx8J`^M__ZjbpK%`XlI{lS6i=;4-A z<{OklmO)gGkL4?wpsvWd)2R*Z&OxTUG0XL+_hluO(q1etKP)5i40#HuUh7 zk-Nu7Bp5%Z>?Wo|GT~^&#O{VatA5fGk;`hXglgn%JFr?ASXbn1N!QU0yHSUs{iX3K z3+hasa+V459^6WvM(`A+9Ou-tJoNUM{<{H@*+fHGxV2Hs%Hj`AHeq4<2izb_-h4BS z9nMLx+0p*Rl^Go}n*5E=siD691c{byyNhr|fwjC3eF62XCT?4NMoA8jMQ4mzl${Yr zLop$PiRInR_3Y12j-%@hA{FW3o{CtS_O4a2!p&8abfo8>0UHEZ2B=hbLdjQ0v%khn zDX(KLJL6^7;U at ED6P0KW|1lBXK_n>S5_J!obKAPFkC3)!^8RAFOItXp%%yDQaUSP( z7E+k?wKm|*z&FtEssq8HyTNl(0Vu#o9HC(h at yO@cFq7qtOdD zn=0cM*KAGF*~3L;^@rH6MM233*kN?7(aK3eGKX0B!^C$FcPxMu{u#>Im4$24jOVk! zsH79r2njSSy^D<3j at OQbjtb?SgpG_`zRgY#omFwuSIkhCc*mxzpd_5Kg7lb=l z3cj38_qO`IrIE14>#>^Yk at E;=u9>DtXefl=zg`;#oJ(LkeO>dVLp2jhks at vjf=gBmt2`GBwl2}=swGzV!*f>7sZDcg3bd!hMDIE(m$|X#w zs^Kgn#!66>Y9DO~{s4h;f<2!s`R$Y+b}D}j+U05a{_C&SKm2_Iv7j9V zPjwq^ME@;i^Qp|$qhZTw+Ygv}5$K72qjSU~In`!oM!%Q9pl_**MO7L@?08XPDt670UoQ{!|W4 z2R2-&0;Yelh8CUy5t!tJm(2hBMe>N)y_;WFv;WrgbGy1l&p_FuFL#e z>YCY5p)zcSUuV_`ExDC8nUc>(S6S!O&sTSi_ElKH?sTQ~}#DU$p at 5 ziAir3Wix;5g`pHRyYxI=dY<-{WT`X5O$A9=(mc79-MyVsS-p(&YM1oEUNz!`G*z{r>ssEkES_-tPiGYddlIA z8WpiYr#AJ%ZL;9lC)|SulgleE=MN`ubqMVAnCsM*iRj}7wF8+i4fHB$0+hTji^=|$ zv&B_TG<;5`L2AO8E54?ozAgzGKMUnUCTHJyl*}*jI1iqT#?_On{Wqdg3z#QbQlIcR z#ISGhZ1^bxR8i5r6ipnQk&ODiK2cbNJ;%8xO!z+WiN6R)?$@!#dYRQk24e~;Exo{2 zHVCLabQ at c)*M~<^OUp;xTKF0Fdv?L~>BX10^l;s+5l%I=Zh)`ss_M*&JaX~x=bDh3 z5C!mFC?rI7#25}|Tji3FhGB9joiHRsUXHDj zVNJvi8|N^n9S-k!s9ts$yC%IbM#LTtX7=;tBCRk%L{hxnl3^mm61-=-VBRqfoF$+p zA{rh!hqMiI)vzJrt4)(p*bcjQJ(QQ7b0U<}3UD5;Pa>?-=H3%=zj(Npox6Ov3aW4e z=!W+tA6960FNYXdK1_%AB^h>LbMJ-tQ$HNUF{k at h0zPmY%)|$zL-HO5HS!pWMS9Bt zAGi&6;s)j-y=8z8+yvio1ACF)3cv^Mf{D3-kw|aJ;DOh{h1|eOq_=+XA7HQ$FHi~T ztrh&|Pw*fw(23U`kPUH)QbnpPR+KRW2WAJuj=ohis at P=^i4VIgZyYt$53w%|6!fk{ zaw=c$HEBk=3vmSt1k*y(t{C+z7LEKHq7;cdq`~Wtf_32xf(Off;hf~|6Fd}Y^C|)s z34?&XXM#rvfC8&^=N2s`WA}}+OdR1QOh{fp9u*}N1gq!u$7onOMAa at DErlQ=n*AJf{20&IlykT#b4lTOm zB8^ZU8l#Upfg6X!P2!P3BkjCjvCjW~MNGK-ngG7=sworEh1$7Sj3DH17fD!owx#gE zSSweznr1b!QSpYR8z*HemdZG{FHnlLFH{ueX2E|?R;<|3)NN$rZ(P~qE&E6hxmRs& zBfwnRQ_ijG;MT3{@O;Gh9LAWwO1>I`-I3h~f)SJ4i-1AH at GH;l&mp0`VT355duI%3 z!T84yb;9~b4kf~Vr423S(a#Ks0CN>L77NJk`%=fZu=DMM`&Xw^AXFisws&Cs_oiQ$ zuTc2pfou>1vOo#21B!bAs^0ki^r1*terX^|hzXdGOUq`{sXz6YN*a5FJFI0+0(LP!8w?5vT-2hWL>NDnb0n1DPOxWPwf) zKZ-zNh#wiC5yX!IP)N~}_%kK7Ke|75s5k$-!VAS4IfM*?h}8N2BIF)}GXn$XYYvJ6IJyhGa_G9#IG{H6`Ao#8)OAT zM#mw&M+GCMyoU*vf)$VinnDm!-#dd%z~+%Sr3|7&6i_(D4AKO%f>pxik>10CS;7iP z08=66QF)Yr)?f=LZv?>$=x-sZec^q5VS7^sB=?_a9 at y_F!SE0PYQqK#LUKT8%4>(5 z&Rl=^Gm-;*kRk}2Q-K7GZMY9!s=~_CC$K{1@;&jpHWePCS8}15YT3gT8C|48yc-WA zk!4UFr#9Sel-t1$HsxewBLIn4#$La_JZv28MgcHPy!}UtcTycp;aD($QcJMH4uyg) zT}1`}|M5K?+y%;vwhCdRNb3V+=m9r}Qld?De&Zw1$Opu%9D%2JB4LE)XZ)z?uzS_m zV9}^ZpnYJ|)xoa;P5FRpa<;dCkW8N&Dp{F!x7^BYhYsmyE%%Vu4%A~a>Ptevtil~R zS2F>&nab)fWi4Bz9PMY8Jt?EInNlTd=(hB&VVX|oARKbtN*`qnqy^iXiY;P>PE(39Jda=!xZlDBn0lB zgTS9QN_=4*Hx{>9brA+8pjJ(w5;F`3%ZAGKjLuS>&bREaV7Ttu%~i1- at Ym?E)-aIR z`xCvZR85y?C1MDbIkkpwwGpiy^S}i&9C1-RRE1adwTm^4zLLz=c_YQx&i_fsGSHE4 zm6+j7jOeTm#!GDXQrq%r9G4sqJXaxxaLm5prJ-%jf2zV-K#Pq`Di3DUh1zfgGcb&o zDxcN1;losdym+I-t%ZwI=l*JVH3=I5y~}D5X!?{HtG?wc=TYDikfPYpXZuve%8jwx zmkK@?bV_FGe`1-SiS~2wxUn{Wg<-%fZ9s*2BZw^CJg4K$K at UrEYj(rD6t1Y7+!(jD zZiR6twLjC{-c-id`}KEanlaDcUWlK_GUb!Xde$O#FX4L4q5ZtAWrZJe9!X5yeW~im z{f1y(#T~vzCtg at iefOgNkL_VG!-maRzRk$F`nnEMvj%YkrWYU^aBLx1nJ%3z%a3 at v zw%Bi&!n|x6ZI?`@sYAvIS4??jLEDEQ=9WtPkfRsfSPAt*wio|Y<$23imcsZ4EkgKe z9NikzJ1NX#um{YU1+O_aUzo)*DT9u~)8_Q5s{pThB4X+j=j%2LZy+HIoWI7IZd6~) zYNa-mRk(R^EEz@>lS}J;l?(Z0TWrr4otm4=Gp>0d*v=!Q$pJZ}K_V0&rdMph%;&=oEhsOllJJSXIA)W)C at XlaC-@6w%N{y2MP|sL^FH z(FxUEY(Z?8VM`k>{&ZE#uD_jTEK}eOPx~8O;m6tBlW9Yg_SGkBYbb7IxMy zyB72{)uGTb+JeS=R?GCNb&Yyi2-|2YyN4q at qo%!$C}z!)S)PUc`yDy{%{DfJX%jSA zI#r>{3%ixnD;V at QjIm*qmfpl at ig1F&9P?u)BCh# zE>}LEG`rfkwnJ+XRDX?f&&~~YsY|6t272zN#-a|@!%)a*0yx#fqx=yx9GWfGLyP>8 zac#l@;~ki9D0O;?sd6YX4-|X|_0}6}R=ndi&g^K%H&JNyTLl3)wa{wh4?$GF2*lzy z;ELVk9G6J~`q_RcFMgZ;^>6PpsB%E)1E#vfuhJ!G#OejQ>V=X==s|rUOeO({zcOPQ z23K>8r1;8C-ahBKB}C0W1+`^WIW8Oeo8jp_w*qjQW>H0dk1bl^W4%|=R!GKH)0O(* zkwRPjF7uDWA^yO_^I5~{kU~N(wH-YIG^8gn!^8a+V>G4rZ5m(&Mxc;I!G#V7a4 z#?-d?e3}p4@=-2y3gy>G8)UUPZc|f-zfaI?my4!QHzVNpTtP(tK;5|0ogSd?c}xrfpKyy=JsTUo^M|pK6nQ#y4Jd%()C>KS?ay=RtCQ{16x1E!l at QhGK7PcfsACDCcHpvB zdt1U3?x2bYYGbXOb=4C7Aatg^(h{j)X&O42KetN4MSHRv3Tan8|8s1vL0sqHN7jjj zJIAoWQ5ejIvDFNM>istox}!MNeI~GW@=SHk{OV5*x|dYbUpNM9 at AIg1TtYVXb>m%c z8aQw2ENts10}Zqy*FXquZ<8BoW+SR~d?!$7A;&qy7Z=?@_4DTHPHPLs4&UovLX{J@ zDv2Q at rA!^BU|!bs5u6BopipQ>j+5+!S=SDayYr#7g&9T|yPj9*kuavX2o<*WiKeMQ3=+W*F)QsY| z_0`k{*MipPbrgIDwGVIFPhaM{es?-RLU~TW%vNhMOKLmAk~b}B594jEu}x0gOQZkz z%9FoVszBG3wAAMdrKb&bo)3WaUy~$K&|D+cBA3*49gsQEmR7X=4M(h)ay at dqkaAJO z>7K3q8Zc9*zg#z8BDw9OqDekZA7tHIo(z;kDs5O~`E}%P_VMacK3gg{=qa!8V!o

)8-cTXOR>L| zIYkOlg*^+6_u0t42T?N8mEX98FGD$`POoZD+mV|?EX#)y$*A!ow91pEntYi5U}gIP z*96bBZTNT_)3-h8T%UBlnPA(*`~#VS)5M5?5ZiL at 3W=-|slkrmk!?gs_3j+&-=OE; zUCX|5OJFbTuyl~PDjvvfsF?QR-_o+;$9CMoeB8wh9oT#@W|d;5lff9txW_eZ=Xlip zP(dcVX4|T|x9hVhMS!y7`jM#7(ueHVbpRSFM8PD5{oWGWVuf5YCTQG{t8U&g1OTdf z-NFU8mJ!RDyE7cFq3(o`HS;VEu*hu_ZPDGq7-Tg;>L)F!5Cx587fMi>WM}G{=Ko&U zbeU6lEKI^vq;FPUqSM<_;RxxFUG*q_Q*O3_sAwxR2lvWZO{6V&5_(PmKYLg<<|6j! z_0nvDzz!f1SRYVg?Fa6r%1%KJ!hhH*(tj$^P=2U;w(8bx90QtNn|8Z};3npTt2dd0 zX6Ag9=zZITi#MeP6KGZ!2;piQ95$RqJ3N9TU`gzl>*x2_K(_VT~~ES17+eH z3?0{WFl(8 at eL1U5ABn6m^D!bk_>Z_>#6JUIqpxII$eyx@;C%X6BynxA;_u{D^qhm_mohCC0DN;?1Fg-_{eeBukzkA9q7cQ&Tu%klA0T4sB2+LX zFjr=YeOzlxPupH?M#~J3viSwYv_o_tYUA!;y`6BSrEjRXMK~M*@+!%eEVCexjkTDQ zx*C?pNb9X3 at 1Q#`sB~_wuGx;EjlQV2HF#3#GfYEP<7~jK>A!5P1}HLJ$;x0l&7h_& zQR=r#yv=iKiTq|mL|;5dXuOnV%_!4np8V at UOS~XwZYqVi_^btQAKsx>r30#vF6dFQ zN(6c%nfXGYkjxc3d%IaGdXz&&Sho&_ASGHe$=S2gl)Bn2UR`rGhcTiG?~I>-(f71L zGzYb|Z^)j2i$F&DREv{t@$gy*w|#R)EUVXO7;i^ zIYlYOs|=CyJ$RIXfVeMxMKYB(i8h7yBajt9B%eIWdiMj2onnTfFtskpOj<)`UAl$B zFv(A*MX}|_Bj(fw#X*vv+~aB}MM09^nQ>trWwt4K8bh_+Z#6-B%vv^|Z0;ck+vMkR z_`U1?ujE^Yb_1!zIR}%Mcdj1XfXnm;zsSbAR=a0a at _6;42=-_8+Q?7b#Q{;<%{w at 8 zrH9YE-q?{p at oy7`roy|TlbV|!@b+!uibXk29 at _*$Q*@+nD3RJpO_M9% z5i}og$btn%mS2b!8 at gnbZ-?CTc422aCkcWC(e1zsVzs3%6Kh9YFr5)9vcc67dEN{=AsFIHqH3? zRUCvPat&)-Zids~S6Zs167?884SCuJY-m&V(C|ndk#||dog}jwaim}|0cVJY7J3(u zoL3ljziFI8>MO|KH7e$jXyKJ-N&T%p!7AR)C7J%}jS9=42NsM=euc}x>ndcOD&X`) zX`JU>Ot!a at e`-WK8yx)_qfF=<|IrCQz+>a*u+C$3D9OVlj+5aE#qq;eP>d!U!h_gV zbilczd1hRu>hw`x{i>QwN&kdB%cr1r$GQ$!XcJZ|KinC+2u?L=0?WLpzkbl!CpYL2 at d!An%;A@=Vd&1Ii zriR?yW(sz#SfTrbw4s!5B2-+~&dn&o4MYc=zF$ z&{a>nr_5iKT*Aab;)la{*O)OCVgfWTcZEe5tC;}IyIeBOCo{P2X& z`TFeeWwYuzUq{W7Ztz#Nw&70|Xw*IYajc#RHkF3JRUaTR`I8^luX4;xxx==f3>s|j zZpYM98OL{C=lOcin_&=TH^|3v;d#TWkTJI=z(>Epwoe2ZYo-F=GYI4?Y~)0=!Ka-tk_^505XDS z`FEST+vASie`F9OU;_$GVXK}H)#%t*38tK$Jpp8?&TO)q%~}Q*)L>T80z+;M zLmw+!tBFERt~8IHYn6s;HHXzAfyPv4pH9}tv~OB(lGZvt8`0eFXG|mK2;i|MO+y?M z;=}7!?>#EI!|zaxb7VFeu+0ItUZ%3 at u5$eNE5H!%K0Lx=5xd|%9K7F2dG(WKFA?A$ z-!02dGu6j`%bz0_(!Wr)@?Mw|= zhRML*7{y1Oo;oXYgwdOiecpW8eBFHV&@^G42v2l=PXr8qqB;AOBhX%mzT$N67Fxy- zC&#<1R)J)GsZ?=mRx`j8w?G zrkVNIHH(~!Q`QM4q*lu7=O^jPC&myx#g at vc?u|91jN%4QDh7z4$S;#Y+{=Pbjf+U& zWv5+PG{@s3qUSWBB+6xFR29&fjP)KvW3<-NggeejACFw;kc#1T3|9Ra;~fe$qxG!y zqV>30dg^NWr^3!BGi#pi0 at cTc6}*CLIi@2V2%Z ze@}^W0#i!A(eg-W(A8isy}Eavn20W3K6+IPP)Wuii6Yml|I)T87Pi*{5HnkmOmLQ5 zn37I1Ec4*0y6xcK(rHA_T`2JaOe|%v4L`>WiXXZ6QT at E$@taF^Ycy^o_y!<1TOLIw zQsfl9+dXuGBJVzzCWaPLDMX-6i3oL^3MY_tCq(^ihUjV3ObMlIFb76oTyH~SYwF|5 zUAh3RwhoY$J*MfB9*SGfXx$$5Y&0B?G at 1bRH$z(8GP##wQP**M1)J~laFE>0pA4$d zhOLQgndvV6^9MiN^OxfWz;)Yh2iIynjda>aGERSL7|?J7G;g{hI?ggGyONb8=`-`` z=$9K~bWIDc89lvbT+>?{|tL~aQWv%K0Qj_z-wJnG4cOgNyilqY0Q~u at 6#R-=wMW^ z;p(hcfa~87(+gb)r^lW5_V~`tWnoPgZqJubZMB}QvS$j))UH~sT}d!ZkkIFP9g8$l z$6n#OjF3yeX#LWwAM>vK697!I!VOk~_)Eru5)6*|<_A%bFvyO|gAqJ}iUSvl7a@<+ zV!Sx)#DPF=yf|VsYDC;NQAAu2GxQ^b8a83 at 3&#(X3+*~47$TGvC&CF~86`RxYzZeW z1O*)3V}b-4c?_tnb7riH0Cz8rz_2OOR1IzrN{sT61eAghrh3C2TBGqp4!{i01nOWI zMBJhGVuou1&mjg#-YAC}OP#XoG7qUCgyV;6+x!ssHz72E?jhV_iNL?+Ae%5fRj6qm zD$H^3xQ>WOf$4FohO=L at z7>NJ1lTJbnoev|eEk6mG0vaCWACVB38Hu;Yd= zM-xEfarArI at d<%}R0D&Z8UE9YiDvkt8q0woe>7&V0K>-*3nTht?dz;Jj!~Szz2n9o zc at G@(k)88zWS#dkx`n|GzJD}Zv?+tzUU}$GmA4H at -i*= zcRD1W4+WE)zdjV*$lxb$s*w-#U#)gKIgBGMZ^w7Uxob)juRRaBddN4|un$`cW`tR= z6(NNb$9yw^>s~v`N(X2k7kInBuCzmh31mh~HH}?su6E?^hu##tXi*Pl*AEV_#>77$ zbPbPexl!-TuN)tq#mV~58GlKS8g?ROt8IA7Vv%O>3}Lmi$`qZ>^1R>Sm}8K|OpC at 2t?IS7UDrwueVo|9{BgN*kN zjHGWE%h?|HL*M122S2J)J~VE6kc`=tN#(ERrqNX^{K z?Z2n68UI at fJId?-4`GLbh*tk!{~GY0{&k^N9{dtoijGRk{}He!2Mxf^)LYnDn%P-e zS=pLco7jRt$l=Ms;latHVE at gSU^UrDi@*f|@e~CCq56Nm!M{`3w%U&MG|}i2q>@Nc zrNBuKQN<7$(UVx3w_y*HJQTF83_?_Gwv;?@SspwZsbb{>F6*vhCMjA?GmYabQ at XzI$A#Ffd>eFhXCQAUue!KprC|sNE}bWgz9R`{~G)D|N)%`l1FrJ4I0* zf<3f&``GTNc0G?qOXU+pd!>jHe^`pnzQdtnX)6{C1vH&s@#7_=P{X;q1c~-?(un7s zR(@l7IW1lu_4H;PR=601a(oN6}tWa{R-t%fqiql+8q(}n+XgurL3PT0T5ECa?#l`A8t8_orAM>rG$X~KCxiVCx;`JxQ zX*j%QhLGA>9|x1U-wYQm5DzDZE?aePz?GQ)9w=MpAE5DvUr`xdEGuy>*0_2|d<9iT z at s*JoLio~YB=)FkqOa7!jiDvX!HY*mq)uYOAx%G+XE&@Lnt2qOXXTk|3dpmUH<;30 zmslc1bDg}!@j_*8H#g3S8A=He%L(JmEQ6+Ov`DmHLnFjc7Mf*oQpnywo%sxxHI}Mz zWiYKgHFFWZC^`@nx*nw(JO`qixsQO>b?}^p!8)JGy+U(q at bS1Lg+ATB^%4T~&qr6| z)0^pVZeqg}XH%uIcB1m7*ZIHD<6D{RpEr|zI<}Zo?m#{OKU|%p*?j5kOYkEO(l%4FQ2&`hisLj?)MJD1_dZm`iKLuu zzn*<@FA_X?qzSPnzS)cmW_4{3nxU(4!OZpQM|vg5Uvk`d;LCGXCR2=FB(Ok5cX zMzKbi3q#kwS9$lnpL!2}X{_#}!;+pZ+R3JS(%>K?MX)IMQT3z`*Z#@?>|tNx5)F>; z8tC{!sV3F;7uWX{&mU|lCz at 1}lWy+d%Tn}yCIdx=eRn;eQloK*aWXp6 at Ss*uGQoOv z#U8|Yu%2sz`aD49=4StknB5 z-pV}nQ}j|70|6qnCUDNCd^h=X$lwzFtGzuU!>3!j>mxt^CU~1OAJHwdMt5yn^6 at I? zgOCva3jcoV_70(~y~sFb9hIkR?4YZn4>YryX+08~IRcwrbL3 at z5hXj4$i!=c&H;gg zW34nSq5DNd*V2|BPMIPW#L~29Ap18T{ssqUGUw4rgyK|$rjVV7TZv0=pMvhGW3{8r zB-+G%2mlABZFQ-Sb#ZxlkqJ at U&ZVflwYYEWpsg8lOwP~#iWc#CFDj+28ZJ{W{;L~7 zN=jEufAAnoQ$F7Ix!c#isLvJAoxPWb&5tkVvizk&L{4lb=WIK|W3+#FN*?rxBLR~p8>X%?9Z-6g|LO+7Yq(*trb6Z;aCXJveOGOgbn*2x(RPTTgE`_(Bx=VB#7g_mbc}ZQOjpDS;vQZLcu0~}l}e6}G#03i3=Pcz zyN4-Z_{qj;PtQLgE at 4*Dtte1PL>ejVT8P};Q3e4CjzymM_$Ri>MoMJ3$S+jZ$SO#9 zvPTALh_Wk_*w}dD|q~~Fm;EMl17W2e7 zzeJV}!7S^4CTp=&PhcX1E&78Q=gU4jv~GnwO*H*z6H1M87EMVSB+0GQtvH71s1QF= z6P5P6YPXVR{~5`mFSVw_i+YEEMB|Xd(azEn+1^po3ULc#UpbRA9q%+uoCxg+WL%V| zkH>Myh$WCrQy88qui3#r3zNTIt63X~*0t(1J5zq1M%X|EPl`~S^G=RaUdqsx~sD^ z7mGq=d)SEqmLYHgB3wdSJ85)P+ at 1>3De*9k+stG*!}G zO42-w1YG)*#828rmaO9Kwh9e7S%#Ci*(uzbHWBy~iA#ztuGFMU>%rEcwpLbxnBUod zDcCd$$<8lR)v6t3p^(MVm)fk-7dg-}D}(UxV5EF8D_uNDV$MSp^Cfab`$RiZD-N2f zeJpI;Z0+Q#0-!T+j2V?_wFCut%s9scDlnHb%X?`F6e2@)7Av$ISz5SoHuzhm(P{f- z-TB+iy{b%gdA54AqX7bQLpQK1r*p+8XIh24qQ)8<^G(a_{rM)Oa_5RaQPLX3Fd)fU zt{q|RQ0{+ER0|w6_^(cWhpc^oq8iVd&{WL&1Fc0`ma^MVD zKN%1TlpC&7W^fM70hNUeXbX0W<&+rI2>%ul^bRRN0{j7r47*8hq&7GLMud8w732u# zr8l_pFJc-REPxbf4myB#UlX(e*-Hy#4sjl;faB6_8iC-~Yf^&sh%=gi^T;!ThumS% z(rRKye9Hh;!nrR4J>UZJL-}n4eL at MC4;muA<$?xs1BszNR)PX??;XLvCW5|k?wf

|1k!DfdyPJ-Kr zjiNn7$E4|l!FmTT_+E!MMu^>eex7MW$B`w6H^E?GlsEEVVN|ck!9v(xIiMiVFyh at v zi; zD0P$r0x%)4bf?H%^&v^_+K6xmE^KwO!F2(fIqD2Zr}$jPh at TK#om*&mB)V|+4jy23 zF0FVxD|3orvfR2*YYy#sS|2P6bC*V4xoha%aA!T*>{~5Rc)QmeJX3Ss)u!Zcdv at q{ z9<4+zybzxf*Pgv`gS%ueQvD at S{*zw{z(ADy3kW}m8dwIZrm(>WhzvBIsj+~euTztO zlPA4vi5FyS-)JS*=1lMC*uG)Q&dtVOH>TL&ojaA2Ge8C{$Bz0+d> zBQyHf3jKp)`$v%|SrR}kuvi!d&*p=c0Wx5o2q-9Yuqc=!7!>G_q9_r{;6D(GZp|Im z*M*x0uphC5fqK`30X)Ivumlo7Ri+oFLWRLAlRMM{-)mC{0=;X0whw=UYti$MbdVBa z7wljeh+POO^ej;$I#83da)<=drj(#U5yoIXuxAK77!EX^>_Iv(P_SCqJkg?P5%zy- zp&nuzCQr5~Uj#Z>5&Iqfy)xEc{KbD1ncN8?xRkp2z?CcdGuRh~K+5Ql;ssO~RMmrU ze>>%e|8WSplgAyn2y5EVvlAlA7tSXm1k0$fR}$ zU^#?1%G?gjdN~w=Hwb&fX6S?`XzTga$Zi!nRjDLQeMRk{b5t%Ez5p^0s){=-heDt1 z3dZ8MLY??%ds`{|DN at QhXB`plk^(aESD^HR&JZ^C`V{{jb#G>2P|A+^AS!XF at 59Y- z$bd)HUzxA)$IhCz$fm)lEr)6x$T9w5++ zU%{7w$uQBMYj!}C^#{aIb+|wIsIMh?c>GgnAq1_Re(czHF!bhVMO9$RF|>NMK3r-K`fXcfpL?2^M(H6o{ZFP0 zG0ThX2UEy#I`!tMbZ*$flfVk~jh=~DOssI9_#4sD6&&CL%qOEs4&Y~5oqTkTv7qp9 zQx2v}X$KQcw6z^w-|%>Go8My`gXe^*qV{BBmmxe0t?EbL9-~iFG($a2KpWtnZ7Q7C zndrZ&FEmYDN4q_-f5qe)_egJ}XWr0Kf-wM)=_Hs?KhBg!HaAPd{`NVi8EE&*!B&3Y z7<=~y2!N at du5^a~Ei0L4C~QabxMhv^lgHCmR>;7(h1R=u%)~tMxd|S at 9BDEkIeHeS zeMvcDI}hL~p8fL{-=y5U)Y}c0fsu|y`mB)^Po7sU0p9|3LuW!xJkapwX?1Q##xch1 z7nbPq3m`YDh0^U7C3)Hp{)-j6)J2#;(*DCi1efv}5SDJ8sCMdM7|}#`%u;>xfp08n zuxB}Ft at E0F$y at +Luq7#jJSZhl&E}L)W8P!rl#N-?ws*7K5c1Cfhn>vPPDS>yCPkYX)C(&9a_xH9Pej?;MAx6TBzjFNm-j zF;I1N{mc19LmMJLCh;KF7tfP(fU|F~|2ERgDc=;mV7v6ATQ)!4EJu&&DGgzOw!emY zQ at 8Y^A2k3Eu)mh(DfQ=*ycd<0dF3KFEmO5OFztYA_?-NKQo)aQOsw={9n~OVl$-Nm z4nx>BEzmR!U)oOs-B9KsSS8>c<{c!u(e~(ymI(LMGrq}?^np{sk8x~);M6mrsWSO3 zg6f~|vRNhI6~-4Oy3yvSmX?U<)R54a`^e{zwbz?F6}I|~KyaY&I)d)x9X3D*E`vvw zaIMoQa&p!^zp;C at 8HKuSCRpzI1;$qFtC0Sy at R*wTyPj$Q`%hrSTVMpS?$_8as5#_2 z(r+cqZ>0y*nE at CHtsWgkzs at nfUEi8d zg^@OfPK1&E6z(CqCVgvvY(6ebtSNuE;La0L&$)K at Uf>i~Co*S4SEb250rwQ2ynYAs zq%RK=OO zuus|8vsWu>3!bxNt1hkco!B0Dmm>w!$JdTCJiP8UVwhHA+7`86h z`9^9ed>TY+=InYfw%Y`q+agU$zEihc6%9V;#OtS*zRAPYvi~M3S-ww&t!%id`*)Ku zEFIdIVFx2#kU4c57+Y%WZDbj~pz&yU{tWpz4yYo3e`!AONPM*46c8JqJcemKTNT$! z=XG7?v at EyQd<{l8fC-p$VvGR6EXzE>C at cFyXK;@fBdSbb7`X at 2Q5$B$`6mnV3ybYf z7~GBH8OP2cOcPXuUoAHfE`Dh{>arO!hURMujrJ@~Pg8F}_Z%ioQ*T1&*nX1x8G^=T zNl5zb_BFG8`#=IA_MU~dk4MjSd0+Ahx*QCsV{>~>lslhHKcGoEbi%(pjy>@Mn8)t0 z*Rrlo?;kH!8ekKDi4N2$r^awsUABom8>R~mUhCKS42Wnus?Ez{RquSI+&&7qUFkvTK+b&EW2I|20@%@5&)2-G at E18uCX%mc at 8+$({w z{Bn(rrY1g0N>_-sefUU{jozmPS=;bh^aUQ532hi_cyDzrD!Rk{DarN7AZjKy%*HY@ zBH;aHQub-3LiCPI2@|hbjYjR&j80o3H-J>c*h62~%O3|qz& z`LPdI6y~qKRn>?e%K%q<4`;@T>PW(iwXA=Fiw{qYLx*1^rt4Lca0#Ugf2WqsboIFb zvFt_s+xkKGC-{6D=C^YD9B-~v@!FQvka(*DHBr!XgymucnP0%ndIbNhX5D^Xi2PyM zd`;oLp7}k%avOK;eXU*;{`L`5L-zm&_xE^JjsZ?In~H^*L0^8dH at DeIuTN{CmJ}cP z&x?F at NB-uWdVbqs-fH?j$He1jeyUfcD6Ki~->t?!CpqAMDlk%)w>3Ir0sSf3z&XFjJUc4% zLb`9-?^Jl^#ih?)ze?XeN$wCbRWO_@;uV*B*i`drk?$ih{WmmN at j^YjrzJF?abwxX z-GXFiT{wLG*3_|df8qMnO;^kC4 at _VdI1%BTy3&vIe%7fx`#LClYWA#&r%1k;tVWJB;dCy4{WLEAZe%-PBe(Wo<4XPAOnDqsI zK0c~tk@{((#UUK}UhX+NM?8j=L?N8gN<3K591uT^|A{m;l=~J*CdkO#NTf??N-EGO zOUGL7V0#$8NR)Rm5M7Fy8%wbEQAZKIR0+X{bd5*lwJJxQ#>`cFfH#*1H+_k0Ubs=lR6Vr%Sx%lkH z65pImnRbLUwd~%z#-j4AkIuY|!;m|#;ZMtfnV(>;JuE@#R>e|aQqY3vY#z5c``UT( z^H00>a<9f?Q^U*Myt$t^gj|w1RPp#NTZ*BWIrdmS`5(9A-Wr*_zvB9-b32eSPR|La z&h!f`nLM?&fPw#ZHqjo?+6)5*0>TgZKWgD>F2<(j|EYy*Si4%gIsV_{Icbjna*W0c zdpy$OV~teIS`;vx^}m%--RQ!P6ZOYJ_Pm<_6#<0&zLJ{`k0*LytI*S+5}{+5wA}6kszeJgI$hT?OK!L7FJ_9H-We1!ilCNJA|9TJtwL8E z!J9E-K3g*H5^i2_iWfVy%uqUwudZjVZDifFD2bTaB+du_rF!MZXO4G at W?FXKmJ<>J zrm0~3y!aQQj3qt~6cY?1=D1=$%zoR at 2$7{*HbR}=#kK6O5m1M21PCJv*@72IrlRP8b=M7_)nTJ}H at bYc?T)1xE(XM7t+I=bvOAq%SC zCD~Ih9!BJx7e{ALVu{VGrSP8lgaq$Vpr0t&LkJQ-l94Gq#;y;20yRFM{%c`D1eW!8 zf`fpl!T*mo)_)Y%fAG=&rKWyreEv(I7fcLes8dQas#B4zeQ{ACMsjH7Sv_@^x zLb3lz%Fu-4VclZ%UHY{>zd9E;`+LHpB2caJwf{N=f{Sz{Zfe&1wa at dm>wK?+zxDg; z^_CfALnW334n`bs91GT3ZQ^Xv+NL|LF8ku+FjTMe^4E=-o*9X`8F;nI`mCdIrolDW z!Y?RvthV8rkkiYm=~BL}aT{!|p at ChWbIP}N at oHc{@sqC0Th>XTq1}Dg#<&lT_I1;Z zJ1=8Jec!bYe4flDOQ5&M6J$eE^5I^ibZyZ)1!CLQmT^Z zu({NYRKEMh{r2?jby#itAlJamq=RwCjF zRW1lgQ99T-_eOMCt9nr(K9qu-f$sI3u{1ks*`I1$$bt!A)eavXzWUYm9Skh{@!KBh zU?#bE9dlA;Ob!FZQ%sJqc>vRu)!$&dPmqL at b`rx|7TZH5%-1Rs at zj z6C8^u_BfWjj<0 at tf=fM*n*9gnkRROt%Q}k)K9P#Gl_B zvVX&5jFRpd<|I)_k&1B1^dq03-zLJ03!Mste8 at PEa4!URbs9|RRVO at Bv0uGSl?$b! z at SQbuxLO>W&CK>qSb=~J{|3d&&KGKT0p!Q3sepYN+NR8v zyv%v8DjaKXU at wTG`9~Mj6zlX$DN8Hj# z-VYK&-I39!W at +Nr2mYu&b}u`tm4A84#0BbbSHp-yO?cPb&-6VuV)^XJ$oBOtkI_0v_iUYnB>Iarary9Ykm8!s$B^Hw_}2OuObx^Cz?x3upqv1Z>x z))nFLOYA>i at T{U|jB at L`K%Dtsu1xyoiDRyA=i at V@@`EO7P7{o)t;05^hELd*&ZI#g?i%*gA|Rq45qeAW+? z3Vgk4=y+Z8Cw!|P_h`cYRn<4YnbZ37%3Yx2G+f~|)B)Pq_0yHI{K*_ga(m?m#>)<5 zLHu at aV`#>EL4j at I`#ujjV&`1EiiY~pPajp=SMP`WE zxvIkzAI*40srfz4GdU at vFPBO+qfM!z7h<64&dvj~-awEmZlFi|8x_me;mV*CNubU} zAY$-C=RKVr%{guvfHXMEHFbhgEr%j-*F#wN*Zfg8pqEy1g}NO82sHrOC+kD z;ewA|w((0XC>TLPF4_iJ2`LDtVh*iHI_L*$Wkq&X&FO)%e;k)$(|MXXt;QO2l}#7? zE1`M%K+`C)v|?9huLV)@N43?ukJkq~YcaQ?ylfjBb84bOw^x~!Nxg6!6XoF<4P4B1 zZMT-XU|k-7=ifqz9j)9i+J6E_6Vm@^V*N**{BINMzXlM^Ef;ht48c%J_`G(|P{d&q zWRk=a8Vb8+n9)s?*h!0KmRM3_3PcM##sq;DXOEV<_x^!X&T84Rnlie^>S?KR7smw- zjcZ)p^vspLjs^X*-#1JbcYy)l=!4*I&5)oXBf(aV-Fn&bX|1Xj^99_ku%_)D)ItG~njUf|~s#pUy{@iBW@~#&d6F6M5e?qcT=fdvb5NP7AWIlFFEp;*MJeKWM*KL&1|2o22xinvbFfH{0N`5lbJ64d8M597{6(D zxL*y29O at 2%*cc63vpy3*gZA8x??+yj)A?=7j{bal)iib|UvG4=SCjdKNSupJ2| zMZRa(Jak2U3a<{Mh4!-I1YjOF+_}^QcMB|i?G$fjWi7keduD#mfx&UKlf9NFAu2w` z-l2_odS%HdW4O+dg=eXQ2PkYpQ at Xc#Lvve^KL!i;QMI*1wunZS03 z!v!xe{NtV1Amx~F0xDR_nK%@MCpc+P#tzd9;R*t3u^Xu}*@R~&LX~Ia9zra~IPH*N z#5)2W0ULK5hYcYUXB?M_UC+34+9}>RiQb&O83yue<12VERagaD5O1M11?aNh4Re0Qc8#Yul)&Q?Pb)RW*EB2`uWd8cWPE8Tq?w&eQ z5`Pv29{?ql5gpG3e0F1{wI`2cw-Ru at cN94XHS z1JVbm=?gXGeO&$cZv1cC_+z9NQjqV!&lqV83J3mIXXhOa*S5!T!AyivW}<{dADs~8 z%_uhvQHG2j1WWW1;u1YEEH^q~BADFdD$!ezM2TKvqKia^=p{xFjB5x&c+H||3#Hc;`eaMqLRT8ma%|gRiA_0e+A~&i2l2 zv0L<4Dw=h&$WHpqj-S%5klbm;7IzlKb8%4eR;<)rT1BJwmAdTO7~fIv$|q7u4J0@@PAD-ab(g5k^LIJ%QBKdxptt*0UKAE`ls?K_ zTDx(0r=ZX+dHP^?my2dGlB~rB#w}LVU>as`F60e~qRKE?-RH*=UF-9_ufmP&Ox%c7 zPaoH97I}VgU8|(u8}u5jt4gcOahd#LE&5DF!9(}$?s)tg1NJVU&b)n1S at A}LO= zD$(dnu?x~yF&>diLS(6p=u6- at gjlqsoWh~pE<%KM0ICy?3_<;t)ImYXj?Nb7`vjJA z5pcC7bOsVz`o=@0PwL0TP*v*2eswMV67x#u at w0-SrdlhN^!oWjiY>vOu*`y+b3&pf zlo03iY`bbdP<^+FWxpLEujE##pJtr1bnl?~SwGhW+dl3A!_pf1fQQz@#nN8wV z>!`$tDRFte+7)i1j~r*3pI?aLi2Dd*A3M?8xmpeM)btk at s}d=cmZ4uVcxm~ak2DSZ zds#Hs&D- at jZ%3<)HOP~4SEJ(VRfMdjTKTiGv{T`v`kCjDgnizM_ZA$pAWOvi&t4Nl zl=awWB<7m&B3`87!(0#1iZPF}w#0?^Nz2_l$ZXRBR%=jTkTZmysA8Sjqc>WT;n5q| zy--rqYt~&(O3QIbuTjzn>c?*N$rY*aj3DH&UB0 at krN<~Eks z`D5H#Yj<;yMIjWDP&a9f=hN^ASx>f0(77t%$>eu7{OqB-|DTg1v;7>(0tQf|qNfqR=p9 z*bsan2X{&){*?p_9LEhqWHY&d!{N&sPZefL;%oXA=o~MLFK9WgLH%l5$xsE0d;Q~t z#Lw+ at +~EP0f#QhVVP?Ti8n{_}6?i%?)lAAqoj7I%s!d=!gBQ499Wh=kmYr15#wF$R zMT|x#I*p5c+(ei$KQU*rQ{RXE9}Hgj)-^+!*D at Cjv~g()B1IMhHHXXo*qb8rx=Cn(@L1ff2rMEk3Z51= zPTiH%oY?gt%BhtuGyVgrfaLxe~}jcAi+pLH7SXpv@`sPcO&F3{jaJ* zoSAc@`>#L)jjaetJx*HqcQy`qctY<%>DK9mJ-SYTBqn6K&%UIWVi;?g0g{h?lj}aI zbu8q~b}R=4CcB_$HsI&-n*>+g?RW_%TW z8Py6Gqi?*^Lh*wdtzX at Iu@P%byOY~;O3e_;Y(B at MZE|RNn&332w?gy~7`PruVEg2I6{c!}0eHrc?=2LCuYN5r%r2)v=SY3WOf^7mPRV zuB={mjL}ehw})kf7I&0~U7|6(MlV}-k1N!N)Vg)T)Vz;`JgGR zmD6`nW%z~vLkgdJEh`U9;O2)AN$elF&%qRtkA!F1VS*DqjQh~i-Inm%nmeq<2B&D* zX{f_QL;w70%F*yJcvOy_0)){vN6DZKb!0IpL$r>znfXPG4v;W<$f<=rdN=>5i2YEz z<9`o3C^O6to8N&@w22PZ=^PCWPMd~CqsqyjA)RN-uY*1!Q|0v8XcvJO1aQUb66U=W$A zm%+ykDFfNS;1pH0p~nqX0olNS236Bx#}01*;lO!2Ro5a$%rp-Rlm%qpdrnN?zDW at ct)W at auivs7Yw)w?tA&GhZs`GNlBfc{-%M3e>SBxFSy4uVFF*vJ#>qO3L&yqIWVA4nA1*!=cG(DuQtr_8ps8Whbj+xYzXn3$F at hpnyKTyXN?|y$H$>Jc{vuh at jh-4jB zr6$QfV#&e-y7}wv?N^5KCNruoy)HeF{QuhqmOr%t>~}G+v10h2BVhj#VPa!rVrld* zfvkTDMEUo?-=|hK*8dXE{-=1Hzl=Aqv9vTYaQqt`)?e!Y2Bt=Tqr&`4l|I1X??hkz zXOWq;qmjKe!17T%mPL5`le^Vdv|12`Fu{LnBw>Pr>yMFoWN=*R{rhn5j1b-<4SX?0x8rMZOlH^h1)>)}m#$ln9Wy8# zDtGwA-s8QlJF^px1`F!a?GYn3I=51y1>*W at 4#JY8Z%nQ(nk(9Dm`$S?Cj+HW?WUi> zxE(*gYvsnQFMg!B;xd|U=R%};HwGpztcQ~R0R8vo|6&4);DG=FNILj7@@w0M8`b)$UvTyy ziN;GvlZQChS8hIbIzMkPc-2hL`z`TSzAqe|bRQF%z5YxGe1XNu3Tt&pc9?$6a+v0D zIjr{fdWPqR?0O^t(qY~6;tmKke;^;6xi)}dLZ7FW=KIld930k?BE8TfSO-C+jUuB- zYxwpJSc_Eyokj4p&eT{%`zD_Nl~)^m8gpPjJnu0MksT=U1k-cSI3C^?FT7GX4Q!nuMxkNyzt=2Q_pIOO=o5*Ozhi>*NR zEQ#G_m`Gld)j))!9O2 at kQA9)O at Nk6VkhG>ro){V>1^U7RMP)>#)z|qg{T-yD@ zj3qzkg4Y-?Q)X}ydY(X5F0KTfL;vJJb#E;~5;f*;4GQ9!<*A)ap*F*oSb|S-08HN(Ro;^867;i0}7GA z)jYjT6mW%g at iS*dpfZ$U at p9Kl|Nd6so%|%Dg4aEFasx&Pmqh5LUCJE&K+z2Kou*eq z{XCb3_LW at Eaj@0T={M>-CfW7*7k|v*RUr4QF z#_37>@zlAf4#d~Di0KQq_*i5OoXK(o^iOf-^eo1x)V!DlOwA6Z^E|ewQ3VTf6UVH| z3o>!qwaiewZp+7T+NMdof+P*WUJ{s^ATPXGqyg*Mj;dU2E!JN!zk|4mwy*+d8pLWU!Q!g=91s=l{0vbfIu?z{E`^pI1p{gCs{i z{%&xfV^7oEq4*OMZnkcdJghWJ5*x#%5i(p#(JoO_xV+6&8ylHImmJT?14dplK#Uj0 z`R3q(sH=l57sM$~zot8Ju>fR!Cgj3&=Lx{^vv*mSF;{C9vGx%z8~ulBa9?xoMEKj-7EEJuu(#r++sfN7wB#cO<3(|NvbN#{Dp#Ln z_y5AQ!3|!mUZCU!YqQQb?y2WW=8ymK^em1-lvNfVrIJI^T(zVuH^|K zSH}}eefMl*O7|q19{W4&t$&q>(D at C!9c|lC at yt)G4^UrRbi9Rg6f{61H>{d;HG(la7*+9hZ2Ka>(ixY+EAlt!}JfOVa=$+1DWsRtR>x zZ^4tzFg~*Mz~=NI=FUDHQQp(2qTJcWJ3!`?ceLKqnZtL=q#5eH(+5<-sU5tk1+dre zkpG^Fn!*~tqJRJa9fAS at 3H@y<`ezCvm9YN(jV-_)pl at lU3b1rC5^*&!vi)Oz at Q>`I zWMP9MfX1Wrv&9okt1N+fsf^oF?TwN*&lD9$A5}}@#m)y>wtgaJ)Ay;lES5a&3G_{2 zhzmBL=;>*j+~ewe)#0l3acUwu`+GNN$*vtp^SmAV~`)wJog^SrMve1M*c(UaSBeq=9eF%ok`cArHija77)%OHQLM6jM}M5k&%EG z#(``}vPp-a$X)$5#c(3cWgQePD at n4S2(MN<+1E{&V`m7^c5(SvR9I|;hCMMBB~h1% zEjF|Ax0AzBSXk7dy=IhTZ*9Z={78=?@g>%BXIT{5nh%Y{M{deK9{Vn(_>1fB4!oxv zo)y7fVtC?Oy|=W+TTT5n_tqs5=ixy(qx_0bQiTmW>?v{rq7FH0zJ_2&>5W>}}y?K~#cFKG{Hn z-a3kGYn%vDq`FB&+7s<~v7i=>R at yt3;|a_Q!A;jxFJQc#*+2T^aCm&Nmcqja))MF0 z%Y7s_o*(h#bH-ze`r8B8xcD>=Y9i1%C(4x)VyCw`pPe)_i3KTZbUq-Q-F*wC4I at mA zB37_&U`fXk8N{=Kb8!vTLJ%?xP_tu(O$<+HxFq=1={vrz=Q2*BYXP*gkiN){(A|DL zX>|D-2-)Jh|EI}c&BNN9FE9|$?QiV(|98j<*z21)+5_y}{&`2-#`5>cfAf~9I4;@G z|C_hL!97mMrl2)=x?-kM3hg!dEKNx2QVq~ zQU)`)C`_h!ST=%>);)mEQl`IzcKD9M>5ml0_B8lngVw{f)^#fJ)Q&sfHCSI=t}f<- z1_ at 5ya3!6+R-s at d;%|}2OMdfJSvC=rn%*=PCzM*=6Oe-qn&iWyT3UPa(+cybQn6_~ zS#}P!j1xH-%^8?!?wHdHQF~)yo>(fNh;q+NnxW_ at 3>jVg5nK+j%)HSZd$XDWzSb38B8nk1R0S!tORQXwKg7xz91{dD_3h+H7lW-VdL=O5QJx?EGo1(uX6N>$1 zh}bY7bP>0vT%1|lf|-~wws7$Wx*ils09Aw+o-VP|)BP6FQis46+pe0zv|KnvT!cu| z-U#wxiKKkd4&^9VQH(qAzYp(Wu-bCO?|xGT|oMn(ZcHi?U74MV^OAx=U4Ec^OU8zMo^H;P{6N16v0WeU{ytk z44?}&)?S=*I^#Y2UP$f?N!lT=%909gHClw0qAu*2#}eUMJzo&paT{P&l@<|FiCt8d zVyJapV^y>vX;*^Dwok6Z)x)a=HBl5|+Ug?;QH_8ByO6w+maK^6KWf|t64J3uB)jKR z+Atcb8iup%<8*D??A44eaus98m=qA{P^{P{R3G7+h)Nj%^=r#%VHBTicuq~p)(kT$ zaLQV2Lrv>iSSuatKS!K>7iCG840;jQaSghWQkV5DjaGsKJ?o;#pj0J26#9A!q99W| zd9kS863Z|+2TrsJsav!;;e<_-T>ZjnB}DN;!Io0 at uG!*i8NUY~-DEi4haRDhH3%p4 z+$|*o$=$3680n+c#Y(AXj0T5owoM-^YkmccWG9cb_{Co at tnvxvWQ zRYt9BvqeXgaH-QSHd#nCbkAy+MY?O02?7ECuKv{^nGpK%WHDWN#$TMMIv#re?uGZb zI<|;Cth~WJQnWgT2u{94`LUNeSX`xx&?%4 at r7ioE|e=+Bx~>rKp-MR!UGv1ja)CFlE7Iw zXmmJ}=E^F)oKU{~4)7lUVb|~hGb2(2Ou}H$3UFiis9%G|ARSGuR7pjkFNU`sWqA;6 zxxJ)&cXc4 at LEu7=GnVi9`C=KvcldGOSL2B5>DuYa?O{!DG7xS}06X6k*3hR)-ODCj?-9_`z zeXq#$B at tM5^F~B!WQ-VFf?hr9fPr}ccF at XR)xjme-k4)oa>g2}br6@`j$Cz&#wEeB6x5 at GOeNaPlyVf;+JKq-iqgtjQ99vg(Y_X_+3A z%2QY>WDJ!p+t=I*bE6F~l-H51m94R~>sO0G>|`b_SX?U{PKXQjGb)HfSe at me3dCHI z9CG>kPMNV6xa-pxBDG|{6lMEk{Hns%=Ih)PqHifb*=CHf>jhLPmLi`Dt-(CJp%SeY z^|Jxb&Yfh^&b}zW{94}SMlE;vsge`k@=@0Tr?O8fk?u1numjhehVwzv^$&C%47qKv z{?tz~smP`w8|YF4j_`2xTxLGW#A0KtoQ}o%mVj{$?x;PD1g1&@ws1D>Tm-I#4vmUE z>i$qjM3qz4Qa_EjxkTkUFE7_=gWQrmogmm~KYK&+C{oA8!w-11CT!-e^A3uq%JDp* z!d7LhS>#SUwJHod|GBs z<%H>tqSkC`u at +qX%y9t(#ZE8 at FD0WZ8$ zc3!pSeowRE0ar$V`IbDc+}`TUx*7L!;~USe_?%lM_d7DmO{bz8;mP0}tLIUJlG_Dn z#QdYsacy+2nMdJt47E2fNlw4A=-zT0fUu!g>^?tiz1Ehb-tV?-dJbOs}VYQp|Nef0c%FNmMw%&ujELW%`NfG`}53I}D61rKGypu~!o2m+Bv#=8Z4 zkCCe)#ch{)9GR;;GtjCxNoT*XRcs2hzG(BChfAxHSuco2YjW}|klETyvff;}oE;wX z`uxn4r8qGhm*K-FbbRdoeD|)ty1My%N6dO3g{%VVLBPA|HQ6B)e#(H#PVRyK9O z-2wGIt_Sve(l+>07#RIi8Dicw8{rT9E~37#WHCEhC}2D5#BU at XPZY=>8h(q{c~D!i zdhl=IP at mMk**xBAe)s1eHYi}*gAh+H$R9#}SG|v^IiCsJ-P_$FDKXpL+mO;Th-6R5 zZz((<)nI(SXRN_J^dt22&UR9iIl({kl79)sM&hi%W(T0Kv*$&~M7F at BuNDS&s!!5a zp4SEGEQKA5sq>_86{6cqT7QUJYfqZJfca(2II(?AP`GttW7y>kxK}AhFlJ#zvg7F+ z3dow0m7(D{P!{DWGBjS;X>H)tnW^Ixyc at Coah@f7ngu$#(_6bk3PO&Q7F6fnm2(W< zwIRdHACP3Y+avI*`RMfG|K(H?KwfN!)D*}mCayd!%+3|7;9>eLaq%Q+wB$rkPN5MP z3_!_M#k`YN6*VQDspw!J%>njZGJX5p6fYWHB%kDws$Nn~be6(Bh?WH6VTp{Aot?EN zxnMIUV-|KTA#KK_u|xEie_IwEC7chpU^6I1VMESQ&nif=wqC-3%oM5vS$^l(jQY3C zaap1P!Jr}*a5|-hhL}nC1!(azarR2XD5`ZLYT2WO21WT{vQ~_* zd#Cr}QU?WdAH}E`u*_DZ-GrKb8B6mwJe*JE?!+4}f)OoZtvQX&oE^sgjw_LugCo)) zONuL{64Ga1iAoWmg;!*Ne55%yNoPWhnG{io&ZGss{}ZdVvnKfm&MCJjFP*fx;c8k( z+SKXZeh87)D*O_PM?yVLBz`1w728-*Z3XWpT#&wOriz0b%-T=&F+CkZx3Ll<4W80N z6XrmYVq}DGDwRr-x)-6-$7ZS~r}RC=G9UpDMsCCb$y%tm;fTW0HW{IVXO%5%t_zUz z8B!KgB at UXLT(L?;6pgGFng~@;CdD)RD-OTzQ>DoXm+jrCr+7aY^J;2M_mSM3+JzDw zDD4;gpVip_g8 at Td6K&936kTOXNxLkE86RFbwC?6uB&k!dsc-#8`t;ik*u))GuYe;t z2&DX5GXxh$byCub9M(>t0Vd?r5wOaQ~K+<*e&HSg4t9g(IhgPJU!x@ zW_pvZpnA96Xacw5Puxh{?6(4DoUv(5J z55~moy_84$zon at -EaC zliJMcEJuZwni~^OpD9}zr$GGlu*%<1YN@$}W( zby`8S3lXx~!2 at QrYY1e2=BAy<1+Rr7eD-Ns=P?;#>!ezIo46hH>u_dk-{kO>-h|CI z(rTjm?xwpnQOuOw0Vlywx)oWI`8C>j(L0kPEKQVf&$~hA5!w0Bntb+2aW_b1%)@+D z10_uY4Py=qPswsMEBvjBgRf_&U{jej9gP=CGEgpi((V_x{O?(UE>lD8E*J{7`ejP#NRmM z8A?BlUVqa at vJ)SA|3<5?9fY_GjEp#z(!*uw%102l!^}NQuV&aXCaSgr(>HZM($v4h zrSq$ph=q59=)Bb5wG`1qN_e&8rn9QRR7jtdjr|)ZtF)|+zD;?K!KQ9yweA9v)57uA z)x?cMlCg88y}P1JHg=(PxPDPywR%}aW$DL*fZ$g;ojG2&+0 z*~(NXMeUHl3b&~f$Dx&*a(O9e9ob0)!3voo{ZmJXk_$L3HtESD*i*DmW?{Vfj!Jkg zFpIvEh+bDKCzK1MVXt;}JR}k_E#qIM=Pk~fG!L~6CR{(vDt4Q#Lb0|b6TWbk&nVdY z-!X-zGRhC%6hWk%R}_?+w9*PakJOofAGm1-c#4Q6 zESWo~U#`&AWnyTSn^0{~B)(Dd*|Z2%+#vX`{WGdj#F^t z*>pr?3Q2e#46qf-FvdcEC3z#;_E_mA>;-Off3`$HuulWq5O@?#;}Y(UjUQNm3-{#Tq|vJB1X#jy$U~}Kt+_V58V at d6I5IM;>)#z*+Tj%9d;SC&tx(x z*4s~ZRV*R8fTRnCC{c;#G(=to9MwBME?k?s=g8L!%m|hh&@O%2escLGgHvw)958RW z6~Ap16qY#m-6H;yr2dL7e##h4>ax^aqg$eGuBZaFVPG(%FIL1<9qfByg at g7IrvY+= z|CrTnuUSgY<7k~r{1R8>Pwd+(hq`;X)#I`Vlu~BNEG7-Z5dAT#DjXWhn%+EHq%xr< z9KBTF4P^jpQz9 at oe02qoD~>%z&$GD(2p7l;)H4dayrKp z-9lwTOL7WJi&o1iGC}5Ka!%o#A8-1)ru3AhV^Uq;WfO){(2ez!{rZnam65e`b1*d) zFfEz`#3Ukhv()JX^AY#P_=?vZwxWvoqS3kdnnU4$fXYfV=KSP_{LhrB~S*5 zB%kvyqSX=L)%k6pGy8eX)kgwW+9wOfCH{c8)56wve?))E49MP1cYj-KKZ=cB5mPC; zzDTso^en&0{7p4K*qX9*a|aKX1XbsN_RUSTfSYZy7AkSH2J%yA*F3>yt}l$Ibie>) zP7Hv>XdmMs(6$zlPc%OleUI}Gw6<%e&P3t=FN0{CA%@Ei`yw~o|51dyf52Celz&4ggS2Ux{!i>&CLtQWVcq(`bWWl(8; zNyYeP5}lhGk3sJ&{WbhmrB1xS!&~cGVFlZ=U9F{i8Z`=R{Vhuh>GW=H<_dl29priP z>K^tehXXG+)nolhxm5G#$jWy8cCVaIM0UXa6V-}eb`T>kq^IkoeT=lVCv53O?xq)N zN1`Zg&I{e$ODjuEG{NCv?d-bg{vnBRogPc;7ISNMdyeVt`pF|yM?WJfc%E6#v+DrE zFHs)H$cFnOVk=-d>Xjq-hfuHD3%rJSGku#L2V~AIi1HEX?iQ#W$j+ynkfZ8uB(pn@ zlhvzEJq=HmLey=O-tcUH@;B~=UCiF->Hf$kvXJfM9gH8o72X8;Pi$Cy)edNJ1)~th zJ}z-&a4#)J9vgK$)~f`~meCFyV0~xKPX=rIJlnze4bLoK at v1okblkh-1Vb<2nl at kV zC?|O!u9*9;Bd~+?3&P{r6qzSOdau^>w3|@wzG*Xp+DBbRL`o+XoH5RqwwEVhm9KCS|El>MJFs6(h^IR+WD!u;>rP*2 zprOzj8#VUBD*xC}yks!F zBRJ~c;nl|Oe{3F%u`E;bvk{!Vo%7578cb)ERn0uQpO+eiunw~Ipllp|p25KDXg)~c z5k`wR353=}9j&n at c^`cXSU7nL*_cGQ{ahZmwE{0d!K(-4O(N~}EIFd5U+POuIMOi* z*bB7pWKFK>~^@z}Mz55y=LH)7x zefjBL3$joOHa#ANa*mH|Pq=Tp94lDYFSzdcUA8 at _*Eej4?DAxv#yv`NHu&LRmuVY$ z9BMY%5V?+jUbSVPd88Fs7H^3`(-Kw$SzR+x&*DN8TEk*AgNLsRVKghIezI2A zdFAG%dhnQxc06Wa+q$uAr*R}DNazP}wpU3ac8y{vP9_!p at hK`Cty3AURDoS8Qxx|c zYTfB*i!)p~NP)X5F#IMqTEjnjU1b!%qp34$YZYqP(k9IOOGWUxD_ekByD|~3of6x5 zF&3`foT5K?luS;E`A0(Bj+tbTiI?oC?S)Ai-14bhPPrlAonHsSZUjCZF<1R>?55#|8EdZS|U3UWk0-}Hb0^YsQ2xh!sFGbfMcMX#sT)`xVovhic{&~+BLYf6C8*ccjm z7LhT}i;=2AKY1=qG2(+JxkQQYzxLQ1))gUHaaV)094=dnr`=vM;y<2W&%XLFXN at 4m zCK3^07E|&Ce}iGZ+ at _zl3Z)FC3~w3!auQ`+jxS`OZi-h%xR{rl)~UZat%|iP(`iyR zHB%IK5EEx!u2QOyDZePQS;}Ns2jFjI7qVRD{F3k-WNpq6^d4p0+_7{Lw5SrtbfHM8_&jl= zA;?*6eg2t04)_DZTSx%qZi8F?i-Bw}dPRt9$u=?pO-q;saT9jaG?#GD0;$s4qFEUn zE(=v3(xg4r@>EID&FvtetfKv+Ap>p`d8?8!^S#+m-ONEh2hmV3LX=9mj4amWln%kq z6eyICShDxgBFcFpLL!EvXyj4ME+Ti~VoLfrnK($@S=?&q6L=!va9uWf1+cHTGb{!! zQoTCF#~sqh at M~9E#i&-_P at bzpK7=E7AnAWVYrhEfo<3i?#$vW zLGO4Y_L>mhKih0Koqe at S{gFnDEJ7P&xU55aLiq1ciz at QPQ2mD53=9Z}=6?zGKQ?wE zm27P0`0>0Du;_H~L&l3H_~x0^df-!)zSo=wD#epYf9Fqns%yY>9-pPRB3f;p6Hc8S zK->;y{-|<<1&*tfx$=7a)q3Rhd3n|S-5ZGYnjI3<2sC_!^%_qLhZYpOQC(O>Lj|9W zO^vl5tXM at vkwqBDw}q-F9jQzf;2wiu1lFdDOonH7S7rCRA0Fa|AjIO8Jm zWebJill9oeZ3bHkL#xYR9F+^nJkuxjSUCXh3uF{`G-U7`f{^Tp>iEs;eb&_ at X?6VS zBTrhvzO19CuDW%Mocp=cJ|rBCs?qt<7ZiJGl8kSyO~-D|tWd`zjjaXmvc+yW3&h>{ z;C*Kb2vs3=F$M`(jnLN)j}dt0Q=@~4S+ft2zWsbK=ofR1M_lHRMkoG9;(Vk#1_YTe zRY7f`$)+hS{$!|b=jN`3F+7sb4GdQhf^FQ4H%QUa9YeTb4x9G$c%z#z{fCt(Bl0N- z!IEsai2Xx!zpyZN at 3716a1Fh*3h5R(zT)$%z}O&VRe3D&@*QQ3*H}#^**CRGh^8ml zI%$+p^}>Lwz_zKIz1&hFxhGff6dZ#`m|sAu-=mb;G)U%(8(@^>3vH0BE3=o<8K9R< zUhM(bCiKx)F7S1};Ga{>eJ_4Mq%0m835x7FKdKF^f=q+?1=m;!$jN1>I~pQP7}!ck}K`L$g(u_#f|V^Ov|JTGrTJ>M>llB-!1#NQ zs3 at Jfq{?8Qb~eAoxS%cDnM{WT5K`8T%CE#}u2}^gs1oFKPH$hNvRBU`J?0+uc6lxeqR0ld)F8-& zWpwn6hv?yzT#C4sX48ft>w()*(X>75OguH=njru`6 at WYmRNg|E6QbzDyaduPLr?5@ z;1sl&+7!HV at _A~ko|>CTi;RtLH;#0uMZ6_`M|XstEfy<2e<<2KUgIJA`An^QQj0zI z6_qcO}~1Df_Nq7 at NU zntux3bSiSbf4^ZZD| zpXuaw1V!*f4d7$-RFj~)w=HC40o2qg%on*tkk(Q4q*@&9aTm%zC=tHg$a8#|`awvF z0L66njV!=NQ|sY!YU;!I at akqcJDV5O)hAfP(3T>YcIl4NK&bl?XJvvUP%`SF48k1Z z6t2)9^zNBuF4skR9rQet0gA0pu!r3W#IVCDANCvl$|aeCOO5DZaLF$ke=dZf}*TDjaP( z8tHPH;mJETZ2F8}ci>RwxlxoJUwv_b!zXho5$zgx3B)kGX=n-J6&B=8tSSZ}dYyLt zCeH)U4s?ymxR%1u5gN<`k9t(Jf(^LFD z0BPE#Rr@*BsKHa*HhJ9dLLT^;%PeG!f~d9dpz*?`o|{vcuMtOpidpiEVfKIp-R7%Z z`9VW zh>B)g+~m9l3FTv&JJ^4xEVE0e3Gz2(QvU&Etp9YUb!${6Bp%r$%Q*VUKt)X`@U?_P z!FG{d;Dize^c-dm5`9eB^HA0R2G70 z at 3*%H{2n2^!K-40ll26pnjO#MDNM*H>rdVMQBEH_ina*LVzWf z{6aBeeIT-h*g3>#Py!KNjfajdoOYqYAm6JvPSrSJq$f`viiomk>8Km31{mxmi+eL& zR60MZi1UC^r$Kpp9_UbeKIDZi!#m-E^-kTh5QxOXubZVa`B|r@@*_n3<%KBHw>r{^ zS7j0_kJ->lX^U3b$!^VF~!+h#{$e^Sv?AeC~B%}u*4-idlM18!OFB at l+(c5kPX=N zCL7XQ(8pn{;~Q!MxmrXuQ!TMm7^F!}S3)F^@4IwF#nqQ$G<1&Od97xqzjx3}xE;-$r4hpl z6WfxW>F|(#rF}FJoxRod+ppf?6k80ECuy}ebowwPH7xhC!tpVUAg&@H$;^aDZ632r{na*FK?-Q+y+^_ at NsUP<9l0^2L$r<}XhGoz+f!NKT5unz2wIvn=yI3MaXf zOjUiyF at Q#G>?1a2W~_NA3fUr(*RXU2aUvI!xHQa~rU>c!bt}9%smf>k%SKlJs>>Al zGT#33K$Hw4EX%Gn7p(53(5^$%d~`lu zfgOiX`I;PP+zIR)Y7v&_J{+XGnigZM6qg^&sYvbLHN65!Z~}$T9PKd6{9-nP{FP0b zTD~;ZTXuFNuFOaB%tU@@Duaw1DmF4~JfW!219P63BSf0yH2=ly5oS?N at B0p8Ox%;7 z6yb-hqiwGOVE0&aLc^bB)_U8RcG)hxz#o2N2z at RrpinQHb+O6!O!nnZ53|&k5hEe} zMymQhK#KkUv?yx_k_4$-{`5Igy3Jd^62(SD^hDx77^+-u8+L2`{fgPD`74mnuyIhr z9xU$hJB6p*@!2;jEkLEj}+0SKm%JMOXcxVvQB`?|l%|8kW1Mk#x8!K^uV- zH2K at w;*&x at 4Jey=T`{w0I&-ersScgUY#3>AH^c;?w&pVcod at N)>uO~Ttx}ir;MU9G zEw9c&xdjWpPyxJ#E7e1_x^fC!1~pMC(d-k=!aZ_g{q%@jo%x=wmT;69tP9{^Lu$}+*wz^Awfb|Z*VbAj=>$y%R)y{?%G|S9(#A+mvYbc+ zEy<))bj8Q3%&QcBE>~fS8j%6~&9&ud^N!44Tzcj22cBEvj}lh$gDvKTWYJ)XEP*u2 zGD2sr^itQj#eVWm#v9(sK1b$+oKD6KB%zF3`HKpSr-bPiwH4}D zCVR_{BjkQ?$y>b8)O#6NN$2Z2YF_s7czXpfTRQB1E87x!5I;24Oi z!ngr^v`$6)H8zZiZ$;!{X-rUX$F#gvH|&&O5!^yft6c52 at GXYW((Xj?V at B=|=voSY z%DjV#DEYo~<|i-3kHm-mh;mn=s+CCj*Rk*f(_W+A7at{1m1M#wXpRWbXqVv z%QTDeoWyUq)s=n4m?Yu#r#^osamUU6V3O`lxrT5NNkb~tB_Lq1mSHuRm{%B6HU~k%YdTIYnlijw at Kp4o5x zj7U~uC8ft+2J2L|*Fue6SfD$*68HHt1t>DND at wEv*XX1VxseIIr}VBbQ;?R;BuL`H zzu*JbNKy}qqFjGWL^|Ht&D8UxGWzTjP?Jq~O~eb!8(NJS$3__-ufhsQIHe1l6sBuh zVPTlx$6op--av`k_3dlcmABwyt=ZdAn>KI$TqQ9y68unI)75IOh%FnxwkPM9x2G6* zP9jJV#}juse-6)(p$M!xOAOP`MEZ!V;qlzfC&=-=2h!LF*=NH1(i0SI0&H#2J6xoN zfURoMMqYO8bk9;T5hJN)39mL<%I+Doylk0$5}8re+C}}@?cB&pZFws;bx at U}GIc;} zIlK4kq_!wbL=D%6HgQqf0gKLNis58 at B21WO#Dj(?$syJ%MGT2nY5!xNGq((`R4HM3~!H6 z9YNAHRPzXp5-sSX(TSy0%aM`ypZw`Y>G3=NZ=PKL1D-hk&$$!^l0|1uqo%prR`mY_#!UFR_M8g=KsEu6v!yakfnlr%ALU-I5 z!RmX-JJN!o8W@}&Bkl6RN0$L4Foj{|(yhDk at Es?@SBVQZdg$RDIy23<*D;VksAUm2n~r_S zj(bIzu@{MaNZBNaeig?Qg-*q&=6WU=wk2?Z(^zE?E4~CBFUPp1E at 2@fJH?W1%5%2r z_7X3|=QN>61-c0dBvfj1=2B9GWC$2M1q`@ozeJD)YS&~CVHAp(JTb?P5{@eq7`GwY zTMOcvH`{V0NVNzl_A_7ZQk!Y??aF6!zA at WtzWr$@;C&1SxaK#AAHPAQ|KBc}GX8(- zrdx9J@@OBInv at BBNX5+FOiqH!LMA+Aif_XND8J9J%f9c{e6PDg(S8cR7F{!%qMoe)Kouy5`T zWR~EhnaHNSoSRF^^Obetct$Hd9mm?NrE&+s-#EOiMyR(ZixEq!DcJ=a(F!>LE_JM^ z(_YtD_S#X02HUqo#rC#tcKO5%jHN5r^dQdHBX!t^M z+QqCHatDbe9xCgd_3H at Zj}}v$+1WDep>}`6W3F%2#h;VApLYUeh;#2b^a8ozLOMCq zHRn>6r4supCzHFhBANM%par`t5h@$t_2e$Gbq_h}r}PW>x5c(uU7Q+}(~Je&!{BSU z2{IflAxtCb0+q7Y#v^0iZTIM)S^cWfEM+jL; z&Ym;4 at dvPTXof8y)|y07nC3wfArTyxLwQk=z^F36cIvp6Vm&2+NC7UU3lv1!Y3>@jAn?6L zH~l5c`IBW$1B-Yf3i&BhS3NiUX3v3WZ1r%W)=7MVb4J?4y*JH7djF0i0u;NY?WlWZ z{Sd(e_-2zeo%y|8Z_5OK;74r!&_=xB+Xu_}N4mO%$Skgkd!1$*EjGpADxtonN?k_y z<76BsNp|!k)D{AvTh7A&^_ ztw{K90`$_%n at 7DqIM}WmCoJbv%32v$0qR!mB-JK7N5sn$3noehf}P%nzbuz2-e764 zT7qFtao|Ti;i(TtKYvelzxmTl z#u6f!-7`2~^BpK^z*&Aw*L#ZM%dC;d{Ov at fw7AX{}u$xn;F$(su{ ziM$`Q at l~Dwd=&x74 at 4L}gf at GaM=ZbAT?6IgE0L+KdK`4E!cU7tKyaR)J&Z4)x!W^c=kH zy#odULikUR{O8+AO5 at h^{AfJ!Ep~Bjlm7BBbaXTFc#x;Ykdi7G=;BEr>B2 at AZAmPq zyRqjIm_N|P(I{bgeWC?7?B;HniTmP?ezrPX{+=1UKRm}SSm~two$8s-r##vhUGc8nbd;e z&YZL2mpP0XqxPwKEkFr^8H(fM8L=mCSs|IP2Wzu!JF{`&*$$~dOQ;#5`uD}3%y8lc z3Bc at kMHNMf9VIeHQUZ_wIaMe{7rN2ZbS9mYsf-n?nHm74!9h4N=RV~i?l4a_8OkG3 z`eQxTQ$mzFC+v50wY^xpvVdXa{`tVu(YsDKZTvAalz{2hOON|86S-u;J9i97!J+_f z8SSGwr$t1>XdEUwry9<+tb}K)BlTay5qaq zPd*uu7a6f~?-jAv%1kcvVO;p=iCLC0=uQIj9-Zsr_ zOj7fNNO{qnx{OxgF|U_3m&?$tQM}*YtOXr{@uHz_G69)nY^W-v_$y$H#N}z9_!POE zA>P=o-&+ks>od+I{aA+r-lT7lkh2E`2GWwi_6B{8NNv0tmUx4;qwrzi3;yvdM0a<1 zgfn+%#Uq+(#wu2mB(%Rh%KNP|7A_ObW}h#0OskAtPyCr}bbZixyjZ*X2l&6DXZ$71 zW8ok46oLE?(DNT%sTd{Q|80yEUa{-2De!@$q^3q|);1=~yjAFj`KKP9gTUP^m^Q#> zOp|`}-OP)Cyze61@~6K_N4qzJA^lE}bvv2fa-QLRIT*RI-}z;;=ZWWjJ1dM9SGs33 zHDJu+c(*vz9)%v{H?AseM!Y9XhKc?`@tN$7w&LjSw|~W?;$ED(MnB-B0B%9R%;9|; z4r%tG6!r3EL7CW>?$m8hTnq0>eC50E(qNpy><@ZrO_#_!w4f4CaVl=M7!wnba+=7= zoC#kdlB|0yt*u=rp;8l{lM!r4WfA9kl%Zmb`v#@V9}hUz%vG3PQktDMnB5>VIgv6X z2&G7_Q&&0%TjyrhjS&s2PS~g zaG85XDjcYH>?p*_ToG0Bv#&JK=m8 at d&@pkzjFULo8Lju}Kk`K-H=$nq4MID*;Nah~R15rvD&>Ivzf98q2OProcFwN0mUiZfuBNX4E*WyMclu9L z{)QZiBC2kgGFKNY9bw at vSxVI3Am&}R0$CKLzIawd;eihqj%1<*tn6H(SM~IA5rR*k zp8*kHg`VElnZK~9*tU;Hm%h)YHC-ziZ?^|q-ar!`*`bkdtcjGxqcmpu#)3n5Slw0q z3V=bzN1okZ=9o2j>EfkGkQ+?7V+s*OO}6a1%AkBl6!gavPhJ&5q7e;O>xKP{dZ$5@ z*NlTz+w at N-R?QRaL25xCu8n&NCe_E9rH#h#&7JN+jsW|Xh??`Zt9;XrDMSllhaJ at 1 znS9$;`j at KMH9O}@nibkQQ&!%(Gl!tf)RRO1+Fz&k;! zdB4o_+1!|fB6F}OCS>2TDwV5Di=_=4e0V4jCLHq@%y4N7p2mkYyuG7(HJ5p!dF#H^R2A3&LVBs z6!Qx(`E=p(a!h at -A#Bls=Is3b8dRSNjeq~s^@!GQoMeD`eKAls2!7q!YL`-*`#8z z;BT?tHF?CP44t9(iFVLpr;~{x_fU>UEK1`T(MmRj%ChBY0kaqR@{fnLBAj$a-BR16 zrR|;GE=fxy?=+P5Nah?BXZG!_0t3ZRFm3LXLg^BxFl7cOALJ%w_e>_E?$m|6D6MGMR9%*ni2a=Eg%c$%Yi3Ls z>l>I9++w+rqB at 1&Sww306#o_9C=Z|#?*Ak|K9K*uAnrd$>Xt4RD)!1Q|Ch5?c|xxL zpJFNu6QcDC>F!Iyo2*Iv6mc1fm9he~# zr at P#Bw)3^i``5!8*e>!2wTVsDYF}+2FW3h(JSMT|9%RoTp{X++c-uaoQ>ch8$EV$_ zwR4^2Ut1$3*A>>w)V&CUANlb=;*VJKY7HnU09caO8jyX1~R>gW|DrofC zw{q>;YE7MU#&a(aSAVnn`jXD_Ym=%PjLK~E at Wc@7)KzQQsKJmW#=aj6p4rrHv*p5V z{l=9h$Qr@!cY^iXP0(-Cn38|oZ0R^up`21inH=>!EdRY3V1BQS1dB*e)(I(R5iX$U zP;Lk!4y#@zHxi#6BSPTFhca-6j1IeY85jT!Q!C9EAc7D>BvVH(5_Mdln_S6EL;{=F z6V#Ei!MC-%47kfWAf{I*n^i)g9*@*zMYkG8xmW;yCIh{GChRCd5u3RZj z z3X!NvCH5{65i&9Zj(JvlgL}f&V~0Q?@&5nre>Yl&7cQ%6OK)S{S zpwu-o-pU}%$ePp}?L$dTgOx68RXp@^v;HkV>avhx_jjOPFIF0jK<$jFSj&nK^WIiH5`mqfU-GdpbH;C=ZiN-Ml_6m4lJmNq6AV4A3>Ndf0I1(S)rnU!p6y$Y|JCqp%5#o z{%@PC3Jc0snbUX*rTK==Am6NIW0lCnR_=P_8|i8#oT}IF at 0wy! zFH%P>dQukB#w?Obu>1U-%IWx?HxgcDKtN^)TeUVLz at V?cFa-BE?P|HU%XS^Cjb-oe zf%Bz97S!qa5~;kCiF&7yU|5)L$k4)~KnYmPZM~Dr18#cFWm!X~5hO#6^~#k9sHGpC z3_gUAF78CRL+T27TIg0-1eINu%aMmx+A*+X`YOPnx9AU|VoNnpTkQFHm02qYG96o$QY}q*-;#a=n$-6cQ?a#BaX9os!0x{t{0L zq&xF`A=~}Pk0t+5rr>$YOp_-qz&nUd^dctvsC0C~w;TDwNt?`&W$6dXBuH`THZ#85 zB?%9CRw4hq at +Q$tF(t_R*yq2{@o!){1NeUc81z2 at AlrY^aoK;9`S at mWI3{9erXuJ2 zpq at g=0lRwpOAC>yC{`$G!N+*HZ>BV+G~%qm7yeZ02sj92zbS at mjxdF^TOr&{PIt3E zm@$7`yu1(qH3Kw-v1U#b1}h_)u%$HE0fze_P+0|=Xi9_Ju%aEFlLnWSDASBPD2W7e zVj%d>TY>@!L%H{xyQ^>^d}V?p_>tkiV3)g-c{brTDfdwU-nrPE-AaFY at tnk^5}|;v zho=8b3d_bVH|x7&N?m*4W;6Z0+^+bTa|Kp^$0}XO2B!c(miB3ch*XB7_SPqh8(Vx< zz1Z+9bY=(LG=F?e!viYC`_t at rprBsK>( zIn!C at 0&pD7?TNcIDA&5Qu9l3NHrEp}gYkDzytrB#{mhkD)v#iuOX{tHpReRF{hI*{mur0x6_4`+MlltBCc=DDqM>Nx4Vizzuvj2?+BM(Qi(J5ZJYcG zU%`ewYlkfptkjAlO?isFNo3z4<4`_8X-wdFhFB(()JbHh3{}4Wg^S(o4y%4+0s&Dd z0Rd6{_i**^pz6|w@=;k@;y;;^(PQ?EN0fjJ7BHDGL54I818NW>AtH?E8!W*iXE1bN zMlm-8sM%U$bW{#CyP#-mx6fj0hZwB47pirvYF!!8xy{ixy8)V)wBDw>Zl-vXr zfcX86yVzfHyr+M%y{Fqwwm&>BW4yaTfMmy+8Fa$FE*mCbZhGS}+z-&GLsfBa10hJL z#Z+-=Ly0>ZFrk at _hd9VrXNn`eRW>L7+!*(~G?rDZE^MqWEKzss4q2;orrveOvUL?< zQe&n;`wNkNjwlf?)2O|2|6}=Pj_bM2 at KK@8YaRpx5Bz!kvbD3+ah%B zp7+J?{4wnN;sALB<}P^(cLq$X`xL65Dom_~iEMwghGskrnYPEdaE-F<9`;XeA1=?_ z82q3Fh0x?hj6e#c?#ijc(GpV?Eg-=g{%i^0XD68_Tg;d|-C-@&sR0`C() z$2Vvp&uGk3y-%XonmrtvNuYYyF@)GVvU)L+F^|w#c7wM6l95hO{wmCH*-xSJnSkMT zkRbF4h?Ms-^bh!nh?Ms2JzY}?RwZqAxx9XrB!y+lV z9N75E_UpPF;6hbCVshLAAj#ZZ#ki3H3dID1)-fWFtDz2r_$vq0 zd~pf at BJ2nXh|{YON#2SFy9kSD4joji at aNEXp=jwy9HG8S1=3`Vpxyf=SE5#S5$}qo zVmj2hjU*86Cyg>e^<{K8 at P6F@%o_&mtq9!$j{fXs1DAXNKlT;EMa&}yV$3WZ?s8DX zaB{H+i=YIT(Cx>%8^kjx_CSC{PqBTivy})X?AV{AY%1#cglhtsf}DMUp325XPdHcV zbI2!g;0TlGQ+kc1wt1m;*AqLXV$T>9siF>)Mbrb?Zk=H)ObK$#C-5R7)EJY64##L4 zMD)0tk;-XV+2bx<(*}y& z*fKoo=32=Va&0zabU(M(%R#hB%#K{vcYZ|(pN6hM{GYj>I*=tk|C93 zL>Z7IZ$K(TwbGR3*c=)I6lHmEw>o%D%PgYt$J{OUw at 5dk4A(4IE1FWK1|;M>?y>?l z4fyGg?z3uTz$rn`#V4H2^i1t?GJ~>cXJC*r?Y7%b0Wh;_7+etGdFyh)Uceh)acOnKPOP8x&z!LXF)CseTCjmCqh^I#R3Mg}~ z01X2_e2-U^MIHAD6nyuC2%*^HDo0442b7vH!(V at 8kY9j7IxJHlStO=a^J^ItDEF4fQQ^=)R{W at lZ3+$ zX65iQ0L at tB8tNLMp-CoZ#&EQeF2jYBh;FR#cT|8*RXQ+rge9_|1FrGOog;YAulJ2H zHFR^tZnuvUfo@*=USoy*^+w3=$HjAQlBQv1Jya=(AN at sMUg5kre-DC#NPy82twnc2uwC@ zYEdJtOt0okc}=Cd67?kE2aDhBN0)0BHd?h#pfrwXaNtG}@k}_}>YFv1pU(||RR7rM z>f6Z_5MecDiN^Bnj;TTQSqx}p_WQR5-5)ONeOWQsX&Y~<=h7NOXAXDg+>&~h?}-th zwY;X|$zOHJ3sVR~%1^{}4j>6%m*Y~T?)sEMsU5qt(UG*M489AY0cp!=x#Y_{>eBX} zjkDURihwV=&C9Ja+h#MQB(t_wvd}`EdaIat)5n0m!9T_{Zf?WqMMc{%!wqQ`r+cybNZ7@# z;g}=-bMW8J4{H at 7!D_h<7KDS712=e|Jmx}-u7Q?fMc4~3rvMJ#si}%OvRv)qVn_IB zE6VPOHSP;ZW%=3%QZG$J6mc}nlAd^;G${s at w>g>a%8et(Kl~eS9|4}mTu|g~uj0WCG8=Qi zv*);GVKe)AtUgFT)%*IZacQitxZh}o?PL9C`6)i at YMy0yjm+eJ3%l^2+#R37K^?0L zx~~Y($S9#tyHVgIypDv6(P}Lgw{)+~;No|ta2N;tY(8K=m3uw6JCIG}?b#59*gU{- zR<8s;ssk&#;BXA2e779m>OmB at u5h`7KY$4w>`y2?mAm9p|3K_d9mUn55^6iyJ4&$1 zLMthv&hkEKnYpxN;^2%maXV?|Y{;Rf;8KqiqhQBW&j{>2G|{3AR)RcBAs}pLQ(R#| zy%&O3MO7)*5|xbnzKcuoj8YjD@}n_3!(5lB^hqb#3I+0$HDjg=#SDtOM4q!$=2GQ* zQoZ5uGAoWCPieT0>>?Gw1S{ML^%C|n)xv{GQ#K&8fQoIL6Ptbn?a+5zW<1<8nU9q- zLuL5a`nw6`=7bw?rE-(5Z2U=fW{#I^rI at y65mjUI+9h+Cj&jBX;UaU3ejyd#y}XV3 zIi-n=yj7eVX;8;tLiX8BD?U4+j7xbi>rmaIb!#Y3F1@{iuAK at wTZ9E1jVi7J6N1I) zf&~rczNd=8;n7NR1;uS<2{~%o{{5AVqM{M?XwSlU%SFEr6ozH1W=0)#OlE^X#X>T9 ziJmID)i|*!6B$yf*pfFTlnqT!MB?OiiftbA!bRox76+P#v&^fD*0nWf z&Xl4qB1ic0h$hLvDNZvcuJZ+U$_x1s--&7^1tSNhnYNWxl$&Wc$nhelcrgy^ zr$!cT1!Lh2+79NT7VpTah^;GM#xrNG9#>-ONA`xf3B>4d;E)w`29wdWuo0fHWVW{7 z0{=mB%$8tx_l&Po4(DMm;Z#Qi?c6d~sD<@ZJMEQ`{<0ZA*|b92;xeu|#KV429cK{} zGLO}R1{@|XOyFGKmra#p49f)%7Mr=O=_L(CZq3Tjd(yBuznwmUb?szB-jXZ$N3QM~ zAN4qo`YE&f%}DkFuKSIAl4fp3{>NWHZ1<7xdRtECpEt|vZ#MuQ`7uV}BWgz!e(G!^ zcwats6fq;bvc1Yj_!(ZDz80&n)JnK_&~SRyUwEU;=NinL!<4_3#0J_wi~-};xm z4jch!Gw?C!Ezv9ER at 5$u1BoJF`fK<2#_Tn$uWP`M--8cIuN at 7S^p7yf?%DGJlR{Yd z;LuvCB830bpbdyju&e_7iKfV;f7Y&9yB}-K5zvELi{PB&Eio?m zlpk&+Qm7!e5eQ;4Q2De%OcQQmp*@LXUeJuPANjSOm0 at V6ad?%%elzPLL6{>nuBAKR z2d?62K*1|GoUP%Q6m#Y#sX(MRT~Z795)AEmE~_eh-`3==Dq{ai0cxdJ({9};YJA#IPQ7+AR^aKcPQKSiZfNqpCOGWHUzf2B?G z#-GS=o^%T>EB48UbgTgd)reE>T*Hk0N*32WB;K=3IT+ihm_L& z2*T8eD_PQwGH(X>=o(kyx>=ADdIU820u+@%kcuBt`BcpjaU4=HB*5aHQ6)2oe at KJ{ zf0g`_rNwG-gK?z&>Nl4(imOP$zK z`z+55uL at o5vLf$D5M~Jtwoq-k)FPbHlgXyiVK8Ed*)xAoSC{)6mSt1C)_v~@8lTU# zu4moA3D-);g){6p`CMDjl>ofu0y3by#HR_f6lQ5TUL1r+zyP0=kV0Z8Y%Gj`=;u!| zB>~Ag0pim^J!-c&)y0PcJ&z#gF=#e|ydVP4lq?_=RYR(@8?Rew55Q(+=KG-b-a(egwz+2q%ZIv z(&FZD)+^bg!?k9~Uvr5`U09rJS*hKBWIFSL^GptSN2axLQd&4uc!xas>F&SC`n86b z>rd7*)U{w$X`LOJK3VB7aBkp7-4P^(zi3%7esKQ~9r_7PvZt`7EZbGs?<#LFzOLgO zQI(+_6oekbR(;f at qqM@QsHMtN1qiXcRp&qrreSweHRz|$<6<0 z&Hsd+!rk_S>^O$RcjD}YaBzAN_5BDB&mw*v?26ZG+wWn9e#Je0$fI(B-^lfK%%|gY z+St|0yg#`~PN7StU?plyY}ZXlNx!W2=D>> zCgV90?pIDr;KWAg_h1$$5!CJ_+(wWcK3o%_gV7X2fztJQB1Z86n}}!)>eYueT?J9T zMYiajpw;V^;aX&t9x_~Y)Lak$;$CR^A+cU`Lmq99K4CkDq`fYca*yD&(Iba7KAdx$ zn2njiY`<$(dIV3rtBg0K6HS93VD3=fOje8R7E6fN`zLni?tkhF{cwHCr;^**MO($@ zrT}sC?1c8)rS%kT=wiH$4n$k=R#faJIa6eZh<{83*cP8AqMaX<`a<5#wqylT8+8K zAbS*nZd3X%ptPTjW!_+yK*uPBh!q41`Z1^6%nENmaiMc~tc*Bdbvi0%B3)QvPhxx5 z?fjOQG|Z!LO_ at ECrL=ry06-Oqp5>8h!3f1i1=Q9`z0k<~oD6ptZLe@{cYhI;Q{!Jt z%ILb0%OLLziT)&F0h81NHsqUkOwu|M4()*J=8Y1#p~|4!l9<)tF1LQY$u0Y93?a#& zIERn~qQ~y?a0g05^_d3m-qS)xM-t=p5xre=M&z%nQSG_}vI^7JF~ih6*rHV+Pb*oh z*&5LOomZC=)kqRHsM0m~X9*94xfz;A0G&SN4HruQM-)spotS6*HLYk=VtMZUrCG-y z4jq(!5;9xc_N)h%wd`wVat+iP_>wU5-ppRoA3zjJgeAd=l4Rx-yseu`OKt(44{1I8 zmnN7UAnp;*oU%R_^!IM3&adt10qZK>&g-Jv_PqX!fWNnydC&|tgJ8|KnQ^lBTS5^A zNJJXZ(x8FfB17%Jo4(WyRf5q}eKfgEwz?{%=%|~oIAE=o7tR>~W`2$Cu7 z1uC4R&q#9*Q);?XgONE|rf#JxLi33NHRMa7JlWT>+i|9Y0Zlp&F4m%` zm`DFA))=p^i#WAp>NhC_jCtd(_Gp00f5jKvaFpJpf at gU}PpiZwugHEKC%N`DB|mD5 zz0*;Asr8zySfyWUfi&uz1kSkPv$ju%4b`eyxHXO88ORRL)4mU}s+Diero#zD;jW=i zjArucr}D~==3bc0fHauLI=(c_lnu7pqc>Sb at Hg3;k)mbY*ftL8M68a#TWC!{VO`;j zeP@~Yx at Bq1&@va^DHrn5T;PQMnP|R9MOt0bU2=dG5+B!1`Lzq&W^sxF!jcn>$_u#;3EN;gkRoh^gk;>a z-~5z!F>)9uFH~`Xbw6TGXZ)MjxPW)-&v8%|KsNiWI%v^yiILQ%cDMPu$CFv7k3^@> zX*WoF9>J#`uVs9H3z0MybQlYQ4>i+><$!}UL8HX2dZGF%SLjOFFwi>_Y&IK~cVSw} z0f%mpJ{dxwC45uCTEciQ*Tk|Q5&!wtf5-cFQU4U;BaBR(7O0iKo$7T{I)AYXwQ_61 zAk~|5(ve-;s$Prpv8gpDtU(Gz4Wg!@8bz!I$fEN?Mivu(gv$fT4eF3Rsyy?IVS^u5 z{i>Y78>b_tcd3)v^8?+DdUe-<`t+J~7NgI at 9Ydv^p~XLk3O(@B5<*XgnPvz-x5*%z zDm55fwWXMg at T3jDn>D|0SlXkq4V3{UNOxeVq~sn_N4RmUNmz$v0pQZNcRw%W14CzX zMNu}84=eaSc1B&ru&u>|`(pSK<4>%iOM zh}DTw8|2;wv$y5qhhTYL at ZoLwih+|U(AZjs{?fGHt+&Y@=^fSD67 at mvxI=dhvd>3( z&E(jlwOPk>{qrvmO#~L}CD4Hb0o5V^0kQsnH&JYDU0wdIiy~|2Kq};F`G0QuFHzTY zKvhNM&8bO}q#zOi4#p#vA)f#O7iAU`G8q#R0EhU6!IeaAd3qMX!YkmQuH(4l_|@>b z3(+D_ECQINe$u9^`g|EFp`Flw>SRxvmYEL#m6*GEy6VVwzVUwPdb{44p$F24dGXZ< z4oB#46o*1LibL=Q%!F|}s#8%rws>q78TBA=d4+IjMe>OZO(Hgel$?$TP|4t;#tBo? z5^N0)4$zD0lwS|!M|%585S|IM;S$MJ{KKbL!`?Uw_sb)Rz$y*7p%x^l%g_1B36_JX zM*arcMg;RM+LGs>gOM3F?kwl1^eZT|My&sx=d#(5_^a*3OeK at mB_piaZ~Jag!wPqG zZncJHX?c_vSQu}aC07;bAqmlHr6V{$}--Zutn>@J5)gH!Uo-dyjuWz!D}VLGb}_gt^j)-oAm73oJFmzrbE7h+)c=Mv2vtWDk^qE)a2pdIe zoc*3qn*B{bx^zfBQ?1I#Js}@vOzJ{GZ;ihIG1NT at S7@MDOB&{}%6~Ruov*V>BLWTl zUBOi_mq|rqE=tWEA3kCN5MfZP=gW$_lvxniO}dbDBe#3^O{#9kIv}YZBb_qdRFnz} z#FlSVAS9dxAIZ>bd&z-xt;uVRAi-}~zMHH&{G at Kc%jCkYn?8UUQI04Ftf6)_GINV1 z%`Q9Osg-k-?(uEb88W4odk72!c}NTmVB_}{VdD=t!o?l50{@`SN{>_L&fb#d&d&yw zsqz%d635~^9A3Y0~zuyqE|RUaQh_Ls_5 zptLkfR(dE8NOqEWbl2?Rbynp&IuUTkd?%MsH1I-Byr8nm+8aBK#WH|NBx%WJnLrK7&AOm3mxz-t=nXbF6+p at -=5uBh0vZuZ4WTl}Tqu zG>Us3)=nAyi7Q4JUXSqcdMZZROkgZ@?3i(xY^A$L!DB28^V*k_mvVVQ(+lV#zC$12 zQ%n_(3ClI4 at N~CYfp{uELo^TQ5#Dr*G at b4Thf+IM@h?opWmhU&oy>-?G2lGcJQ1Jb-yzs<9XS{`Hu`t}ZnUqgm zsUe6tqzIh at hRgxpGmrR3xcg*a#+*}pmlgWG^Z46QgEq>*5b+of*wsSdP-ALo2op zE$fODa_=BeXJhb5g1^*s(@7fghM^vo z7TMvv0*}35<*$Je at 5rjH;n+SyF8ckRH!}=WIId~=qn9lO|WgLQ?*B0TBXhoEIrNpsWR~Niu61#&`SG1j6RdX z6 at gy^vm7+ajDb#OWrm<=&^RATa%Pmp>T4(#$r0Aco;bskTV>xLWHbaUB_{;wVFVF} z6gERMiSGXQX5W=4xL}njtNy<=U*y<9a#q9Li1BLdwD?IcHqRQ+v|8GwJyFcF0AvF) zqeIY?=+)DP%b2yqR6lIicj)pOokJOzmNVKJ*7%WFGZ-vU9JrW$HhLJxd8q~(+7jsd zJHTzX5ns5K)7j!r_;w|nlWUrjyeJYIzOmy-lM}||*3CI1pS*D900USPI78qbKzxsL z+_&VKKJD2K=v`a~6PIEjy~{+tA$_AQ?pswVyZ=?jqUwXTmUUQ_YnHTiSqEkRD%r>e zKnI;Z?(BM?f%q=Shv8iD{$FkmYPHmX`~U$0Vt at hy;{NZKA7xV~OG6t=FH;jSdneof z5SyuKD{HHwe!C%akmBacQbD6M)o2j at Ef%!`=u{pRS}Io-%Sv8cAvW*rj&V+oL6LNy z>)$H5;$AJDRZUaooUh)kVfY0je8W6#a0j4|4hWh}uUqRcYwff&EN_3_%`n6PWe-^a zE6PwfAk|@du*H(nQ!y2(nW3Z)_;BkDTu7O~=~#*bbCT6!Ye?h^XOKI}TG~_Il?I4{ zcm}LOI5ko`9J<*}t=BWh9;LFZq^_7yr6XEw)n{iOJ{MFz+D=eO^jLXc$6QwXx6;ls z9kea=It2xCtppAez){$)z?XuBLO7GvB~p3ottDVpqRkxba=^xqsZlreYPlV%TKgK6 z3ox>5N1~pNuhr_5tEQIt>Dt1OI_pL3(FN{y0#=E)dUp;v)Cs1lFQoj20hOvDZx%U< zboDu~AdeTyq-cN-u=c#wN$~j=;F%LWT8$>l^^6sltGL7Q&J%Ue=`fSIo{f0?A~b7V zLKpOO^(=k0d~^1rsVCd at t|<@M(uD<9J~U>z0}meiG+mnVHw7A9H^|RP_Qjjcnjt>f{AamoIqqv&~X)m-!{;0{%j?k zZVK!~eZS#SN4?p4NKb54vBUBn`3mK-B=*_^aLA!s$N07{`b5}cGfx$bphQ7hWHyJj z!MA_k!EdwO;Sa-VbP{Hw=0uoAXHXi-7#tcT%XUV?kgE~OcE&aIw*4#_&~nF2JTq_L zJdsDhS3>h*O;dezOU126=B$+7q;$f9&eNVF at _D!s>#$xmP1$X7T;5;Ru6d)7z0@^? zsMVYYelpHV*dsMpQQ&p_!P)LM#nMUWMA|4nt;ztuV9TY24W(*Q$aa4*kFtB1g;G|> zi at g(#ya#XyWvIB0mXTCQB^VRr_AhK+l;H2tjx&Xrm-9T|5 z4!9pFUS+Lpp=U1E!xIlpvn^DAe(4SpQn@(zK;8ZPi!P`Nfgcy=pWg+7|EJ#U|H>)< zoj zIiRIz-K4fbU0z-;N~fxo0$PvilfV3OLBUV(1MjCaGug$xMqy|4Xv~+F<9$7ual?7S zZ9Y9Y<^9w82c=i-b0}=)00w&c%@JS!aUg(!>a`&d=Fj3D&7amgRWSXBfv_k&pBx(B zfhha;J1%;v*VI6J=dPPcVUq3iun7<4zJtz_j)&d87Z2wUuYu zUs_feK~*fAg)ECtm{48pI0VZJAU^SZEB4XktSnjNZ-8fCTi%hsP;{sZ$VCMp10#@@ zD+U?eTdEs&1gkC91`aEB_XRB_sO5jn!3F6qCB>Rn^Tnza^YG%0eP{@%`brX at ur;+f zPE4rTXC!0q-Qw5xun-N0*kQQlRp*#Sk~xQ49Er=ZvK*ruV;`G1qg&Y4KH;#g8GW=n>)j!;M#SXBIh#wptY{epdWRnB&VS5Q9;nkwt7!<8ne5m3CC zbgt+|tmKst7WA$LROfV#tzpp$iE=lt0_D1q7^ZhbRHeoQxx_G!z!nZ=jAz2`Wsqv_ zsha4~D-XI3BrP9|K}j_oGl!d=G?ET9IE|y at x2+&W&9Rk}_E3g~b|8ujTwBPjSPamJ zmD1!g%SX<}#ZSzc^e;w>m=WyYN{?ev)Of!)KrMt{1c?n3G9y at 7($!{pwUZ=BWM*2D zqKNEBF};XLB;^!r+t3cLQQTNNg at V_7o!~A-*wn2aeCbr*?@PA_FY7iredsDHkb*3M z?Fp89DP%H~Mj8nL>}%|-%9aEdXAg5&au#wY^uETb(I>(?mqzX7m8ww(3JXyoL0i3I z5(>ar&Tvd-XX8*#jJ3=r-yQOC^8@$TlD<^1kc(iWwC_&Z)EdYLrWp-u$4ZqIKYNoy`DJJz at MfnaZ{hA?@8 zW7g&#?neFNcY%xBI%Wl>3p^-Zr>$!l(PgJo%w=ZxliX)jDR(My=Ej*7ag?n!`y;PV zWI9JjHx&EE?HMwMACjYXO~FmQzX7*sxyAu2%CAg1aoGU3u?P-2Q}_i34_<@S`Jx0UZ` zKDCC(ZPe~?I?MN4I83(s at 7kLD9_ywjNCampq2}iTg(J* zXiZpv{?6a$G*R`5uKGgqGg?(7GY|Oz-Tm{WImF_jHl)lk#n{8qXPJ~DZ5nD|8dO-1 zF at JV-eMNA3dUZ*iH-KiY1Ybv^O0dlAb!wnhro?Bosx2H7dp38sT|8#ZtEjtmCP|^> zEB&SoNnl-lNllfwq(yR4?aNk8MaknboiP^cqE(cTnw1^dG zEy|#ar8RTzr2Sfad~V~;BdWrdqK7h(ylt?=-WL;8+f+UP&M_N~PR&)dd$19(-7>2U zg87A43+K&5?j!Vnl1P)+dpK^{a|)8(6vb4 z8!&N+535NPs>Knz4;Hxd+3TR(!5=(bv2FkNC|C2OB!O^kdm74zi6q= z#Pk0)8BZ70gAo50f!FPK4brLq3%HMP(k;eHp81vL2UNs0Ny9fsO*@hXhds2FgCSg# zayi}ceG=HyNqjZGFWJ9;JfF()eDLzIjcT4ShsKM#5L;u~oi*g*-cA674pDp+LF#~A zp3Od*0Ba4274z|6YmLKRI@)WfZJ&W-G`GLKQb-i_UeMCDx764!b{(N5Dobz9SRke& zq^bIj+dGJzo=6u#aLW#Lh!&kwXf~@lH~W&0ok69psIjEWXkx7W}!)F!`Ck at B`Bx|)x%ya8M zz+>@tRu-)D?CS)k>RUrE2OIBjZ!i;sx<>2U at QL8F=yB?+CNgI^XaIP3|k3;U;QL zN#uSbixit4-1YzfWr1+r$!|EM{J*<3+Q_65nkbHtc_nx+>6g9k)yA|Nq&RV4Elq3& z?Y!r#fz{_6 at FOpfb*3jo>%;C1tfdUBNvkEBmI_UKOG|zWe7G&;K(_{Y9xh5bS&8C} z>HBMK^n-q(Uf(#jOEYB?I#;(o6l;8MDxty6rv;ll!*=nfynM5EEvN_h{4h$+jQQ&| zH?~n>df?fu9PQe&<_^s7(y?AsoU7R*tDaFW>r6*Efz_>Ea%^6LdOAj)4_a2DnAfNB z(k1yJiM}97flmu29p*#LV5lfaUlb`-1;gFmFaaPR14tW(w6q!AZ>g8j7yO#XZQelj zD5;Q?Tgy&q4H#5ZiC;7B3gK2nAKub$z%xV3&#P%deOM6Y)q&3%2~XT_XJ(NRsE+p+ ztjyW)kvCahU9ei88biD*tKFv>1B+6c=O4&?#CY_F&HLn4LuckTXvA-+^$uhO4)c;4 zO5kxUnS38%l`aYxl0ooydj5rEZqj1*l>h?)RYL#)iTw9Sri`Vt3#pQ+o2iqt>3^O4 z594}C@{Bx+BH~C-9i5FfdPP&=uzopOGnl0y>YNtRpoy_4$!On3gKsj~hOddc_MP8- zenk1*E`b1#$L(%kkY9x3wiaYf2j63znG_ktDb?WeRUUCORgPkttgJuR zCCX@~)>F)Cwt5Xb`Y&zPul-#kvln&RdR%q>my0lZC$%F_R!zq at wWbQLBYW4KwjTH| zn2}+iR_hsdVM#%z|2#)pUP#}gNfu2wYP;`?6Bd$ zn8hka1BXy4<-aDDw~_nVfU#NdrB9|vHSMN1-_n-dCx2WNRu}qzP=h;2iSo;pOB9qF zL8htdBpQLLt6E^H-2pXH*N%={V3rQiSw5RhQWr|0WZL=fB3^LWae^icPbNE z0`G at fI>jCH<(a2nIKjHEVUyqymrM9QB7q1+1k>UPWS&dlhkR3ImkQ#LUO)*!CgG39 z+69 at 8G$W1w5qjlq>*o+|z;L2;cSyBST at U6AdnjgL^`sY?rf(7j`3(Q-gE93-;FN^e zUORl}8L8+8smObdu^{N7B|_cn(atmTt<_d_Q)eE+0Q-MsThek$R=N$3EcywHGou8@}A5Ag952c z4DQdrn#)`=yYo=Mfq?dqfPjSle;$K>KLj-zn$D=IsNZ&}XOqQiz%s!RLMzw zkWdy9fwAPI4Z)%+Tr4 at W#br1h-h{ic7mY_jQYi?07Ac~dt?>$W2=Dnr2zPxDet}1v zyzX3$WbhFc<5%7{Z71A2n%8X=n;$1(`aqX`5J)znT!EO(hM8wPS;uRzGxYZcw+<0u zYmhP~ngjbKQv;^k-WlfbGdj7R&`wBycc~eUJz9sQek0&B)IHor2CAcVlF#zka;vjZ zuvoR`3anVHPm`P5cn>cou}-a{`^qTGdylF7&U*MurF>HK1-yqc99`ncDUPwKTeaOg zmhe4Lyt#|LA}L=CDg+X0>JbL!wa=z~lSvv*#4U_?AqFSSpE at CTHZ7S7^EZ0kaw>Zf zH)zGFv9H6T6*w#QLfvI#NqQG_G1>HNI=-TVdh at n(BBeTNOo{qN+ob}{)1nV3tUNtp)Z_-UN=*h;j*`~43ZJQ~$TFoD*Q_!; zZkj5=I~&f64uWJM;0r2znRM1F6AF4>9XqT9H!EkKtLez zFRF$Rs7qa}-T<_6v}`;LtSdq_N4Y|yR+6=eZ8kqyOMT;3m8M)l*@4+QrIq`IdJRfu zb64jsp34HOSoP7U&kbySu~idLs_ at io8ZMN%dCM(VZg20g-Gs~y*{ADM_sqS3grJlq zMduy5UuRDOt^7Gs~Rs1fSFdYh-sO8VDJ6bIs!mx+s at IZ`0MOy{cpf#YgQec0H3&3_1u{s2`0M!Zk z7xrnt{PsXjQgFx|xcHr%S?jDIsKYMIPgaTD)%@>KQpX)Zh%~g zEYEB*$VxWnSEMz#qA8^AapCVL8z_Q!oP*1kB%K={Ys&1aSXW%iugEh|Y+(@f3k&S# zJc0#>T2yRy-axtTt$qclompX8e~B!iac*gCo$Zln2B(<=1Zc0n^=Zq;q|xEGs6wsd z{ugKO7^K_QtcjLw+qP}nwr$(CZQHhO+qPC=RjsPt-|chyp1tph?yv8!H{UTMX3PF?S9moezX;3MSwpSqp*=_8 at Z&sUy>xN*-PGVm#%&f zP;vGd-iWv4$iC1R92fm*_0jv1d;Jkm*`baS6dx!Qc8WmSc9faGILUOAVDsE`Zb?6P z&6!)Krp*?8jJ2cbhw)!?DF)?lM6%NuVr_JP-cX5qS4T8b1~pQ4s3c1l+R=%7cc+cG z2CqbrmmXOznKx8HYHafqncm(I7fqzQi#IoErCbq_s+NU}i8;(+VWPs8r9jLUw|2$; z;0Xo7CbTq0`oC!3U#h4DiaOw zXc9 zgAI%M$8B5&5MAyhnCVKUr&ALAsUr;-R>tbeSqe!7yjpV;gma>JC{PX0g&eE!ywt4JDICN-Av3e8BUzDe{ z?e6ETgj`L at M9I9T(7fmG6O+a?hjuXtu?TNQHpc(r8Aui3{b>iFnpU17^KV(cTiL2B zhNr_2S)RQ4gb%mJggcWvFOuCEN5d`a!e-~tvfF0)l4U_eY?sI&F2i0)H8s)- at oI6C zS@{54^L$7BYF at APP@NS7$tj%VREylssA?30!0SX2yMU^j8SHOFRSxf=Q47UuOaU84{XwBJ8QQX5CDK2H~;|F{|m+VTQ5VcnzsA4 z2*P*CNZN74OA^aqAktRISbCdW0eXe(fNb(wtuvvdau!O34YYVA4X7sA5H^1>_&0D4 zu-!o+xZZ~%j+u#OfH?c{@l#moxcCiH`D;n4aJxPe-!uxydesFu}6py z3blr6!`PqS3_}{{i{vz2gR^Ap+KN15ZYe2w4$qYA@|~N9X6l2?p!w1fDK^uqwC!Yv zLWcUETGH#f!!qYM;@mVCtn9>w7RwbHS=#O{kjX at uH)~2}fgr=0!%RD%kid^4Z6SlA z-7-|>P+_I at Yt^E=n at dq-vpMt|q_aC~IKe-ECI#K+36Q3CyA0D@#e=fiX?8VPTD4@$ zLqCKj>&mFxbQyoKz*e`3=2~8nvgg*TUDFLSWMkq7Ld3dbaq(DScDrgdtf7IoIB5Zv7O#q3b&y8x7v%-j=TTl7sNq1 zQ1rU at 8kik-|BzC=ph2;`o3v+ka{FIw$uL!o}?3sLPcgILb~qT6L+ z+0T{|N2-6hzceT>h5)7% z=7isnzmp%i!YpMVrEalVn&q64epx+{mYg7-=rcYr|A9Y{wGyug=ZP2O3^lx>Z!%HF zvp+=omCkKe#v7fI5HfWkdSyB$`5hFvf(V8U!7KTVav<)hIwz3YjQ8rHyfuEdh&qFG zbQ;%sX+Vp2LoG@Z^fL$Tnpx zv4{tJ!GvegFNE|HAhT1{_`PkCVesEnb)F_jfQuk?#J9-2X<5)EWx$mm0Z-lUdGHPL zAJj`mmm1i!E7fSDhi*}`6+EMyp5Vw&cG>4ffQ1;DU5kgE8Un%Vc3>=ao_XE3%N}Rq zG(&2ucN(e)X>VIJVnES|LcaaOMkEar*7zW3_X`nFnf8x(e9<#9F z!Q~*2j|V7aPaLqF?N9uPLyoJ9PrY3{$a`` zQn*a2jNu(aDZRnq8(ukB_(!SS4CL~g=wDr0YybeX|GsC8RGCm$$Y=HQ{9MBWZVYGxO)qy}y0kYWgSM&jura#;}}K z=;whSEZ)K(X#VoSGgnPG{l$amdlH;}SiQxADsCT`KKkmuMKJgwq2li{u>GY$=zTQ! zeZ=(ps|ViqK8imA;rK)GEF0Tkc<+rBACX}EtA>1EGQs)Q574-1L&JFQr5!&~I)1ct z{fmR}@em8)qWSw#)5TakWy4S&8o~RQ4p3iu7$3nMUy8xUc<;$@fF2^j{Ly0;R;dh+ z=(uXy82+f~{gw~zuz2eSkYHPz$dM-*nWhFI%a+XDq?og(GdRJT#Aa-WvSfMIagQ== zqXov{o%1tiGY(X&iScn{vxg#d^8=}!A%gny_YO44PBhH`+c-PfnZtC>u^lz03_7{y#45$Cin){@t`(Dzp6o)r>jb|txtj9^|v_`N|OXY^K&yGp!%bHC9lME2ja2#-#%PN=b&U?%3;<-<1nX*%0YN zgt=qXDr2(b>baSdLcZ$N<-(Y&vNN8=Ba=5<5`}17Fm3~1+bF}8J})=IfU61g6N)KP zrI-HZuX>2o+JrY&L#76s5f3omx#v?HF`(xf=>h zg)e`Qawu8xz^LIpbkD at STsfn0g!I8UlE#aDeW&s;jX=yLv&Oyx!(wwC&H)VTO4G2h zfo!*MXJE_=9ma}@)(A4={JSGm(sd~=(uFUP$(_^*5 at Zu^R!o_!C}inUhL0)<@pzr| z6AwbHl8FLIWcJH;l0u6PW624*cn!Q?mG=-ii5}m``r1<7TF1qPhQ!I$P`+ad$bnEv zCi^qo0`$6WsfD4_AiOLm6a53<4NDvDV}A=74LMNfJUao24kpgmQN}_|nWnSZjH-Da zWzZ2%)vhKz;m%@i$;I_gK5J{uFHSVYnQ5}3Nu5*^1U+-Hw-A at U2?*69Wz-}bR at ZS&uy9RaEdZOsGCKAqPIl{!AE99DQ5v~(Sz_g9r3_WHEm zat}`Z&FHP~2GXvVf|-d?Q at D#S8f2(Zqcb{kAvPq;iLseHgnSC^=@iac7a?|)nWd&u1B7_n5|XILNEK z_>v`!Z26Mu39JWNYa;{dbVY#lVbrW^HVtTJYZ+z?@YbUST(hWH%dl%>Fu+R*>ly0- z>BHlr!>1SKx`hk}y$lu&nl^2K^e7s9!Lx?9U@!v(VBWB7=w&c#gJ+lytUAHi(^nVV zGrSaXZ9|)KIBlZlqbt3<$r8p=ix?&h{Tl$|6jxN?KoYUe~IXnjUzr6ndTMC9V z?-M>`CVpcv)|an8T8ow+3kuO(EIv9i^OCW-44)>8M0SxrhjA>X*;!BNdp}`TSNRO8 zFPKKEF?2|a6|dQrTGVNO<~dm5D4(3rS`|jaURSY7t;WD!tXP zO4^CK=0IBMms*`dn^-PB+{eLc`wm^OU|( zaiTtU{o9kh)urC&S_CJ0^quR{cfXRndr$Q0o#a!9G at PWxqb+h4I0_wwjzh*EW0A4M zS*A~+OQ*Y2r^g#>!S4n2S9MxCaUL!GW+xx7OOLr}D4cjC;=m^#2{`dc#)D5h6gcUm z=7*BVNGXn-hE7AKA=8oR$aUm8avV61w2XMPqZ|`S!LoyUwHo{O*R`545c9|H9g|LA zm6FUg14tzKC70xrUXn at v{HI7QDRRlF at g(6Gg~p+IU=o-ND)(Omtp<}WjVTmWreB8s zxYyu5Ub#%7KDFO!W$_HGoLg0V7xh|F5WE6uCr^rd4Vqs-0uw*fctc zM*cUU#S{`F87PhtFdU&0_FA~FEes^)-KGDIEAfA*F#l zp?3W2B|+GRZF=y8QSSy|mvb55?}9=fBsHS0PbVGNUk1w!X??)v0=ymM-!*r7cB8Y? zKOIzi at p-)k#O_eh+ at o}Ih|tR?Mk$>f|0${`BA0TcZJAI4dOH?xhAkhJYCKJK=!LpR zBa_SJa5x@~ME-vTWh73`MmfW7788r%X_EN60ThdK at H?RS*n?50Ym^K2V8jmGEex4J z#h668O}>a4ye8Y`Zbo-{;7>N~6_dh-**VE-Pt#wZ8$ty&0>OLOh13q at 9^{5=4*MiC zeTXl8ln=Wwv%ca95%m_Gx>ipZzrVd_lKBnPaLR4pZD!ITH^^!01*Shy(~r7=U+xGR zz3NO{JB?i9mWG1O&Qmnfn1R1(e_spcoTt81Tjj}5s7stsqduWd=(KDiaJ=#%{^)Iv z{cc7eVWG(kdL at 1mS#D9wu>?wHc$2%Jz{FPqEE^^=6JXB<^_?+4ZUMx+p*hm75{vM{qY zpwu?!W}{OES61|@Wb&icDVGUVp=&EZpSGiw9)WEuXdjqXQ1M<6odv|~NIy2YpbE|o zNuGN4Dj?&KPEa at 6HQcGvYA`?6ZE*z8A~W>lywhaUaR;sI26ejx%(6 at AtzJ2(HYx$Jh`C2t&|CDe3 zv}^HZo+C=zt#!gsZU5xaK2zUnoiBQ==>Wanlh%)7t0r*+onpRCpk3BM%{-$T^ub^2 z&1bOPPm)7q9;-ZESWownrV6*K4fqD|QGh)(B#q<_NH(4SoObXxM;?(4>Tvw at l#3*= z!2++Yf}J7Y!2ej_f at oh#UViny?hK%Yjzo9L6G+EB0mC zq1-x_3-+x$e5Ha}MRst)a0fh{Tt)rVrrJh at Y^AXY at vMz-|Fl5t<4GYK>m~C#xkDBG zt=qAhuFs2Ur>^@T58AQauf8J(&Zv6S`EFuy1XX4eg{j&tmg> z?7eXM?GsFEPTf0Nhj|I-3mK4ph3TeZ)dB_mkI*5G*>FFKgw#*E at UB?}O>4XTs{6c*U9wsbyE;Q3%QYoB* zzB~`SV9cjdb&>i{H|}g5#ZlWZjUe*%(Xip*z3 at ysIama38LB;rR)N~@JbjecN|Pue zoHz$_Zn92&t0I4_jGy&N;#=jyzsjs~r6CVfPHju?i`;pW!OeEVk#)H>X-r!Z9FA#=jSF5rFc1J8Ms+eN>r}3 z4l~%og6|XT4L5H+b)6L_=w!(b%t&Oy<9M;KxatfA#Q{ZOqq+P9RL2En7*mc;N>+Z% z2QcMeMMn%^G}Xe0y9tKkmJ{M%e?+o#L*06vn`a%o-WB;CBd~QO(Jey at Fi>)$wGTya23bMDJTP+2F%}e5O0S?AowtYlrP5_PuAE> zsD%6iCpnmq#lO=czLJLIDNo#8q)7Wd%7x@!?1f8qZpYVM`~zOId|t3cC6b^a&4(12 z<`ev|ihVk1Gh`$@B|dP-wh?h)mp8`}Bb~o;2M8O-hu+i^)d+uAu%Ql@e=P^D=o<0FzNsx3QJrq2Y=$gsX! z?{qpAMn)xu;2-ci6w>K*I2?|(KF-{>Ttb&XW_#apI?ui3I^ShJf83Yj0wiZB77%O( z!o^T^L@;6=LkUStW+)&GmI&#Wndl at rY6_)X&KQ(kOI+wq)>_ZEq|{}OuKfApqV8ZP zaiMuCs_Z1qmV~IKF`YokJSB5KCwUpy4k1aKbllS-{kg+o-|S6FG=EJ>Tc30yF-K+b z)oku8{~SyBOhNXivEAM>TVs%_GtX~#$$jWBl~QOfo4ol;wQVBZ|zi&xV{B&m{poOi;#@>o<*KHMJxk$5kJ?$P-u<;x&iL z+vs->txx8LXW2eo at tw=_9!{ZvSDrleswyktZqCd+W6ZX`_ob?tDpGBNwh8pM$FV-- zxMQrm7(+!3FPQ46GQwJ~7}@y%VmXS#;^B~T}gvCn%)NS)>~YZrB;=m-{!ga&5@ zLK at QwN@A7>=4ug7@#A at 69#f~;W{{R(*$Kaef7Itu-5MmQr2|#Vp+&s6oNz-z8$dTf zQfceLFVoI52_Q+ at 2};TN8!xcE1e6l$1iR#!`gYhps{Q)AKI9X_J>GQdZ5Sfdt5#w+5qYCh?6PMD7gtY1sdn24(3dPVNo zh2wchIa@;Ss9kM{h`-TJ#J2WXTZm;_h+SKThn{}UzBc8Zy_QyTp83?a#-Ygh3AQqh z(y=-mkaafX8865^0UZgESvdDvB#g{H3;qfBi_{HUM*5dk at q_%^EkXaqs{XqwZK;aw zzu2|>?B0~rrUC*ZD1suoU<;o#g at Rm}nQ at 7k(h&F)x^KCp?YxuQh!^vZ at E@wNV8xLA z0{EeLZ_6Uhd^Bv9yyt!IIL|rhdH*;jW{9{nXP2k=;uRLBUxiB$M-T!3(;) zXq6s3g->SKX)n at N4IDRE^U()sJ29lV at LRv6n7^W2O&%gzROYi)LaJ1K?(swMZUzT9 zZTxQMo^obF==l^1k;+57_Gx6P!Wb*O0>@Q!J)S at lf8ULYm6<8B85$^wgGGjKoK(Q2 z at 98Btuou%oxK>r?YLn6MKxszDaQiODTY2?wF3%!KsIJ-X3I;2Ua#Us?FEZAsT7l0R zCvWxoQ_=Z0Qkk;>J6^dlt7V)&h*h7tlF?cX3r7;KN6Kl+rSyT~=y;OO2~<3|Xc>dy zw7`JOp2GJ?nvp?7Bi|He>4m7Clfao&;tE^_YQPxT*NMKjYp|PZwcg2G#+5> zqJ?3x>_?1AKx}9TIX_!CZ*GE4JbgO9K(|Nu23h%*@h9%ZF~&#q3}+MG-=e9JX&LG5 zY{20{Z at AV(cZ}#3G|5Hkk?Sabi0W?W{U037W at SbpJb%S+9}xfcT;YFF!oOF9Rb`d` z(mvjLSx9`<5)_2518r$&H37v!wZa1!<3UiEiW(pj0=X;;30z&STIp$y4r4=kSMmevp5So!*Id{MRnWbKvY1R z4)3hu2EI3$Udj!wz`?o5?NHrql-}go-e-EH*-f at t$SChSHcyu-ZKg7S@*8ZdNdyRM z?XI5c at zt{_Pvsc~TLGj3-=3COY)>LYGZ;EfvXK=HxF|4Pt8qY87Gzoh> zQ=(ZRR1Gy|Z2iuEQQ2LQ?mC^~tqDBEvx;LTTF@*fBbVJhD$ziTz;MX|rn$3CvB_*W z%?w>xyL4rDv_F$oHaLBMrRnY>Ue7H8mc*~S!7774-x?oURR#Hd72=#3aD42w611s2 zRbNq8w%Kvj$K}Avbv2u(ByOV}2TG<)4sx`WnOs+iB72%I>>I!e9yRpqe_b8zgz zcVcXXcO-I)qW-JTt)Z&lski;N@}AN(HVHMsDr_c4B8+Lm4;j at -c_hCZW~p at N3*hdt?$nA6%`Wz5(8QUxsL$6Q;y;um2?0Vt>xn4I9Rl1GWxPb5LZp=^ zJYJeSL4GfXK(;XGAH5^1vpJnI@`1Oko$W#v}=k zacV|zrf`U-qxk$OP5Z^kaxw<2yo8}D)g02$iURQ(BLN-W17Rc6a*f_bX at 7+m$& zKM=rwyFuf>80CL7NvFo}!UYK+gzi&B5k;n?p|y1#!iXS486QHT?GTu3O1?ijpy3S& zV}je-=1k6Hr}up1)qesD#4Lp06BB@#-(~OMNLfQvx72;gnXi%9)J}FM?ba=^%WB-| z+I7007MYx10Zut!rF6 zBdenP*kW(6>@)O+$}BQjzOAg_>VagL|YgF67ygFis&oi?wF^vtF2LlmIeM|EHf zDCrGD(5L_s;H}`F`?=bE72sg_DWJ4i^q|TlO2o4XW5*=k`ZX(yOTJo z$H+|yk<&Nfij!8mZU`%)8(=NELSVoMK^BXk at v$;aK z-#hSG%U at vf(&Dro9K*#s+E-;)2GnG6rOpIt0q-WKIwm5(c+q&>>k?p}f5_3jlKdr0 zlFU*QN%H0~!aq^D`-96*LWfL2?5S!7Y@srMBkE68qKLx`?NQuXiP014ew&*7cD zY117P295j}E7(lwPsO3*4GF^v>5_o8Czv9ZUs8obPMW_Jy6fk|Zh_p^#t--OuU^!C zWzUXX1=-+h)TAuW%1K9?H&M}3sZzC@$6wVqb)TVi_~AL{VhK{Yf%jU4yO(E=-xURQ z>U9mJxX^6BI-puty)o&>CGA?VI#Pv%su at c|t3H>gBX6k~%c3n5JFDu^RPdhXg;@kBjqpMaZ}MnZH0xlV2~}TS^~-Vlg09TWn57hx{$GA;Q`Y zD5!JNy6Ag9$b?miuso%f1-l at jkE(&t1%F5Jen7B1k>LFEE_T^w at 2UXdk&P8`RmMh=tAJUvUnIHGTR^`-$rYH;#vIJGfWm zK3DkK*%DFxmoLlpxH8;YNbu_3Gy9g%+X3+es5;?qyW#bBX-tT4;EJGt0xajBpc zCBzamb_vKWO-yHh&zQJXlxI>5r(=hu$A}-otg$=d2ldR6NTmFC-TZgPo31{IzdlM_ zHy?+%h+7kFS4ldF<4}u9%3^*k#;p%(YtnN; zZf>%a6r&pRRtdG`(Q{#JdVy at G$~8bO#B-r8#U!(zX!^@;$?Z6$_$PW~{xLn=PuRKW z9G?bmu`*%IUz|BND$fWDyvBB&Qq?{sqh$wBGk}f9Jav1IvxP5x?Kta&hnHLzly2CZ z68$jz(R>=X1w9Sqd)<^0rp7ZMjk^bDcen^#!{?k(Yy83$a`nEgD9x4xwj+|YBNX;M za?LKigGA{tDWbTz7?ZJIz%=M*GQ%myFT&)xcS)G0mEhi3bMp}mh?GJJG|Hs71x{gH zLRAI2sj^24#JUR2uVi;-BS1{rR;kHXrXxO1zwxW?w5w=k_5^2JA#8b#BbJ$k4Oz8t zf74MaeB6Ri1VML2Vex9*3Typ6t085qH3jtALI?gkze^4X_MddjA|5eVn}1y(%b@>{ zJXHUAS}L2m{39px*UEoFgXk(_o1*ybnIyv+4yzMBX;v;|nIyJU*oG!ZDK{*p6e-w5 z<2RQ;+mUaYvPI+ODAK!(ZR=^!FK}&D*2cxGDMD{0E^7NntbYUj>gkq-n4BuX4eQZA z_nmXjbDqoo`k1fZ28cVHWyo@@0wmv2Y0 at ajZOchihkA~xd~EHe)UdZasc{`*No}=h?67+Lqq%C7 z(9~6zl^LW&RcXSMHH|%b(qu at 3zCt1!9VRDSDBzcziVkjF5aH%hf8Uyl`%{jG$;!&k znMP(&Skfyj at U6i!O<+|zc@))ZR!^UtmsOe-Wtss)-1yGdM|UB59MxvBJl*9E(POBl zy at qPNN&-)ghh-36WP!=%8y2Ur!(0nE${Fuzw)zZJ><}8-$(i+9ekNuuyTs^+?^G;ZfyeP#SWofCxo8=W-#bjRp{<<*V(JO{&w=bTltnc+|S zA;4|R@(q#Ci+FdWY(vNwvk(8mR6N{onnj*XYLE4x0_AJ2R!lq=ybP7pKq(0c&Y{; zR*gO;G*zBjjx|hl>XA;{LH~NFM=wyL3NXeKBDjr<;1+ibah)`2hz%=OvOD2-*g%}O zgY-W>ouLIi*OQ9BjYBqIMK;M%rQEylgiD^2Ri)h1iaBF4uxDkTBsCH`lN~*~-_S at p z-Jy-{=!jZ+U={C7o9UAGdRgFvNLpM$Hp(qb@(Xi!Mc6-c^y=vm%=Ncge&fD70Z!1> z0)*~{b1Ys^Ca3EL#i<6>;AEO)Ee4+|eP at pm#4>*}B=6GwuWA?zB at 33@I$)Kzrn9rlFcF5tAUr}7jc1>k*K$`E2GK)m!kLC$* zi7d~`;#SgKho>?iW^G91b>-b+62xUbQ_6Ly1f!spU2U*NZ3x8L2!OtJ4^%E;#9zK> z%7-)KSI-r?_{aT9wZu|~2?zjy78C$L?B92qDo%!W&Sv&bwx%Y3TmN5Ess9fLT-cAS z&bf)j&Jv0RXZS&hLVIEdQ500EL>dqTX$o{5j`wxf6W}Jc${th+5E42Mz*|JS;7k at s zsRESHuA-0)scR=~L^&Gd{O@;9T&hOA!T&sJM7x06iyaPX6m7H7YcC*d%q z{Wl`*7^I=97PkiBsX5B8&tVmkHewpf`Q5yHDCvh0G{+^vW4g at r&qoT!cVhjsB7A5W zF(KFe$Q%N>KNH?FqkcD57KXCIfT*xocGexiuCQbka at x&kIfr-tq{;x9Zsx_zD1REc z!`c>kN^9ne8QlK#-jK)$6(~`Ox#_L4R8tHeO((N8laTp at g*~1}Ah~vdcmuB zVQI8dxkr at Xu)>;O at a2$RV#YqNsB2l at 4{BB8Cwhwy^PFAQ3+-jsS0w37!%#0YLYORZ z(k$xGI**TanO>phjDs#oywOi2w=8RmpX6>KK2hJoE9`xPeXxNp`U|?~kU(SyT^LVD zrA<-|`bniba9-Cdj4_1})fLJt0nMTs7L=e=B5l6?BOiRG`CWVo3;^H?`EO53|8KPN zKQqGf|FeXuXKrhL{6zqng2g~u+IOr5IGYPBK^tyGHVWns_TGEi8{@v=buVAi7<<1ScoZ{N!_|uZTnn5 zT_#_!aMOlO^d%(x1znv7MB=&^Ff zNCFeL!%tiU*dfU<7zyfhEb?L~YO3EVHzntk7EDW*fk$bs1FNO&R(n=yy=a z7|KQ&QCoJBF7mV0z>yQy-5lp|14^v1fFN8Dlz2nbYA^GEtPEp7aGr`I1Tw5}50_%$ zu`EUulr=|LVL%YnUcj{CriMw<(;Gmj!UekON{+s+Lx#T6>oL>jB3EMjY&*#!I-w}ICq8D=^6`G1Cp5(+%FMLeGL`n0f+u$U5aXuO3C9?@4^}t;sEXbC|FaI7yr{Lr%XK zUS)uooNXG-`1NwXkkRvVf+Bu=Q$8qkX)X_ucw0dnAkbe(QkpMKaqZJ_{BGXuT9|_^WQ>&e_|zH;ipW@ zH;D(|DI7UMfHO!^C30jd3aR2CU`rjcm^#9sO2UvvlXR`B!mN%y>_e|IiA-Zdt}-Fz zxJ6fp!N2X*uay$lN{4`!6(1#fHGXWxd4!os^4f`4*cSG^tM=`qwU{=Z|2jHv7<;Jh ztb}xadX=l`^mq55lf=v>~c6BWwHG!5cr^4 zP_v{m3=H8w=>QRhimDJHK$pWlPwdjVS8G#-^h1>(Kmhjx;D>r#gM?6kLrt at pj}vFM z-`Dp4dHjVP;JpE at FuDrHqXX@L%kH!D(s+BECXmZgY7(Vm at W=H>B)3w6nmIB~j2s0$ z9B4MDN#v5y)YE9TdQTbfQRYBsJgY~c41S$*j$ zKg>OsYlO)z{6X=}k$eQs4HWN7U2x~Y|G2XvNy_F$n%i2o^mMD!y$>f(#zuZ0uNTpy z$ARhG=76y614nhYgmBTt`>fNxFfgE#bPS1b{~)b~VcBHmwADE1)jZ;LkbDBZ)UH)U z6+_CSDJblvVQlA2Ce~GqB2gMKhVJlb=b5h`SJ~b__8rB8KbTic`MXGb|92tJo+R7! z7|c1zB6{X#X6JMFPp`AP+0*)de?J%lJaY&GAM~NKNifD(Fv40Qv>|YI&4$q^8?z_H zp(1`z4S5W%+D+I4=&KORB_nlS!x1I*tEMBtp~6r)5D at 5cgX%CHbVnYyVxM9Xs`hd+ z=CsnBv(}~@B*dMCc$kqojp_i#JXvpdmKKq)zZNr#x1 at kPOB;EC`zFm&iZ$n~0y}kS zkJT-eXRcS6lbPV+8;Z2CZF%!L-Rq-~#F~MJH;1 zp=PDVxmC%kx-^O>8a!H_Cs9678nMbNl)Z#*EZ%qh6fm697N}tyqS{?SSsN;^2mF=a zlpUD5=nZGF_G at aiY=zjngyuTTuxT*qncX+9$*LLWvH~I2`EksZ#yOOiA@p zcE-yPlCrX~mf33Tgpki1v-z&Y-KU`*#k+k8^z&OlM~iNdER>sVj>EG)-ppA~hQ*&6 z`c6EA=>6H=;^4Zba_iob1OL(Q~=-QsryN_7Xm|Kk0YJ$4U8(@4Fx;L6< zQeq&+NPS6)I`peUpjOk|HjV~BC47957NpD(lzd=8kBCK`{GAaVEy;8J@ z_C)Y`mEDv+(04 at 0B&>TSZ8|L@~Z7`UY#R-9Ey70NAnq zl3C$VVna$@d{&8$LH+^djf8$tJM_l+**p#3sK^MSDYL#w>}nl0lUL3lJE|>fgmkC5 z>Qjf|Z;&5+{A7L1bPf41?Wg*RT%WH_IEqw<@E~2$XN(qn1QZ)}jgN_-CJq8I%Q6ws z!L+$)qc%>jMfegqG~#*<|3CnPB#te&T~2H`v64J6?!y|_6p z^N6r~)Rf)pHW_A1_3Y6{Ms^MzlbFF3zbIV=uUieVZat9tZXo-pBmP*>Yy?myX|G#_ z{5q;6mjGOM52(Or1*JUjGBL*Q#zVi1bYmPphH4GT5{H at s-RpR{F#lt;nd};vR%88M zk<5=df#5kgc^f1AI$C}4!|t{f{HxW#*Olhb;@;JPlbq$-qbSPSNAJ(*A3KGwj&rb5 zxmWKAOgzs5-=|#a373M0iQwC0^Ewjx=LzB4Jlqa$xxV2;t8&B?U at A=@$Gt8YoJM7Fcq&@Hb0Hk+PYY*WeIl%7u ze9DvJlo9%l_VdN&k5H`sfcyPk7jXZGmxVC!2KqG+3_3P~5A~iHfX at set!!1I9my== zL{m1BO;ji%B*`Fisc>XPQKVPk(r)os5s=S-gB%lX6e;^s=`y`&L4~=6p~#g|5|Ga% zV;wUtyuI8lITNpWbR+Vz_Y%shEb7OSkSim{Xyb+=+9*e8LoUHCRK zG^vuKHTyc-TAMw*Eu at O5P(xnzb8NPxvd(aZ7Z^}AJ$|Jrjt;bTs{_RnCQ-do z{-m-3k(5d#>Bj at aDa>dl)AncB3C>8Q;Ri+9;(J2$*uMfLJqJ`GJ~VOpW;Yj?={&e zc$w3_ib9hrQtwob)B8&{C`=yTLJx|ql2VT;#Mu+!=G^O-kS05uypkVRWCsho4DxRe zDw&P)H2FD$M*2D%#a0wY^K-_I6^-_$*gfqS=1^O*Y%k$RJt5YT3xeXql0?4TMTMXe zC}qZ9UnxsAU4^Q$2+Z|^)Tt`Os=pJ*x;cr|&2!k5nNBgNZcMIhc_h8&utvv|AI1}c z%fq}`X$^A_!v^P^I)mbL2n$JK;oLQ at xA)}EYk06?A!%%cf6FB%OXbAJo3lpWoM1}X zbX^0JUHn#r!O%4;GP|6vx|Xtfgv>~#w9iakRxzmcw>huV!T3 z6wsrtzbK*2yixV^ttCs#hAbr=d4`LvE1jJBs8k3U>vdZt%P+XJ4eP9?h^$sDRhF#~ zaUhkyff5xnrYR#8#>r|)xsqyA4Xv50YEvOGx}y&&IU%Sr<6%_6Z>7+~jkemoBI`wy zg+5Onqh&dfw6xA?P^a`wRLF2rR`d+r%_OzK=_)%&eA%UsV&(r1)(`jb#axHNi- z`nvsF$Gf0$pk%ZpE(t6F%_9$v78RbFmWqFL7Fw&x^LOGZQJUyZM*6%+qP|X**3du+wO8zm%5D8-#%;awbys=J!{{% zHzH$3yz{>|#xF-cW6UQrIRNtluPlWk(ixmW2nXMBX%ERo*wCTLQ|*B3q at S_R!QOQT ztUYoItXz0`m#}_Qv}p2JK<5uLV!<@>QxJ#5q8vy{M(k4n+e-dJYbO z at W~NOn>W)NAavw~UL(f>_D{ND_ at pBal>zIf+&ACq7i2)Y!G!*GScg*EM-Dd{PmhL8 zGs>bAy$Eu~;TvGxVWc6|4zUXJoE`GxkPziF(w~_Q+vM5e6QOVUBipF|`4NHhJ*|i# za$4PRY<3O8g(x1`H6@=KOP-(zBs-twI0o%1x=M+?!cGZAtx+EW<0hY1y|oUY-_qM- z=IbEGD`My}bZlwB0xO!b$rBW7D>p46h$SJp66>VzvT;YCJUC0Zk*SJ7StuQGS4FzC zZMzghMn%TH4X^7OdSzC)2BC}zzlPq_s7IL3PhVpgO`b}ScXsc+oTpEoXcJE at qvkZ# zov3aDN1jrd>KMv^zFnDla5vZ^{oFm`p)kP}9zD6b;XRBVXUY7t9M_%;33d4>rQT0c zBTo4&PI((GE at z6#+eJ2SYz&UN)TRXm*S*Xa-^yQMTmw}VmJBfKRym;_rX?{x2_tcj zMIMfK6`fEt$vR8Wb-}Ghyf9}rmOwL=cHk=3aFtrR$PMY-faH=z3dyP%&11E?c$*YV z at +!c7)rB-X_H#UK_=3Pm}l411~229Nug()Nj(o2E|BF7702)e zl%qS9Na2Pd2TW#yqV2%blWy at a_Q0X)FRbAkR^bJjvjhU8tI)Un^TyqU8x%j-!Gbiz zHN at D2LE9B?zv|Rd|D6jaYtGJ)Yh%wvXpJ6(r zgTLf-x)pXZx#F{)#i(;{mStZLcTT5~P4|@89lgUUhMT4rGz*Y$4VQOqAhuM>1^n-! z{If>hiraNzFsYH8TIYX1Sfp?sR_BN}g$gPbEvh7w!(W5JuW<_cuAB*Xgxr>*1QKO$ zBTb_f$V_}lv<^`_xCN9RI(RI-YB^Ua33g(Q^CjuqINSQR^|l*G(|>=R*yd*#xw41y zIe|;y~)NmoR6 at auA!SDjyuSwqAlr?t>ye&~3bwZR~<|P>{053F_ z|21Bt+E$b&OWIcUZSH;~ALom_f*CKwI9Dhv`F7 at b!GWy{C(!@%5%N34 at Yxfz_F%Yl z|0D-}Nig(v_ctLyh at yeCyuQ-;rJZ4myhQAz(&1z0$I+zqyS}??%^oU(a5Zwz(Xj6I zNhap12Tf1j`39fC4syy%&Mfil$x#!Zb@?u(i-(@RqeyHO;iQjex1c>G##@d={Si_z z!`D9Wku%Xat><=^W6UnC+Ujv~m`|-y_)vN^VaMyncK4v%EEp!n`v;QmOmK$sBC$B^Xjh{gN1M2_rU1JT`vC at W!?R z4T_$TcL8hKe1&J1RN^Z>R99t0#MQ>6fr0It6gcBf>&?%kfx>O1oDT;cn4VxN2D**9 z$vbrFCD3Q~0k7Qd8w&EMwgvfW7P3fW!7^nLqZnA(7^|=Sw`YpXx(k+1X&_&l6{0xq zJ$F?^;}PJmZ_jzcQsOL3in~RiPrd`sK$LSmMp!Ky4_kLJdB3rEDBDhbTC;ps=HLX% zmcH1e-AQ%@BTOKfn+TJ>n5T at 7rq{JP(&gkpX~~y2S^7L?-C!?4 at Gpf?Z8D)LP^8z1 zj!mueQcJbS`17acro0&%*$k?!dxw^MsHgYrazxChwj;40c>w8MY*$>64ei;b?pVghvCBsqs2B!vzeB*K=8w6e-bY0P-UQ*jPqx*&Yh9cp~Nf+ zlwnfwa)ZymmE at R%KcF4>}CwJ$lbbs51uPtSI3a)AnDU}yls6}zBx!3UE$6!tuHhyCdx1LiyUp1{Xt-y`oPpH z{{Za^_Ft=uxw?wKoNr1O6(6q+HCLj9l#h(dbD{l2RCCLJH0A zQkm#gL2ximBy!jju98MaQ>`dO0Vj*Ivx-tOmZ(tKvv3p!fxdpH8Y)gHnGB8IooYI{ zH$8ZYKhXg4)|4WR3njx?j0ovW8FE6=3KP|*0l>h`$4<+Htrgfog+)fG9du~_I;O;vYec%oH zFkbh+iC=#urwTIugaMO%9$2;oiCHrJlg6LXFz-u(C+O{+C-*A>Y8P!G^s$&O-|em7l0R6#8}M<3tl=0xI9PT+ zM3JDW=%mCds*{-&-_}spOTZLLE at qu(RAH5{- at 695#JF^iW)kHN93fsu-0bV0gC|x| zitfHfWcx={02^1z#GtU+xZtqj=ML+pGa>r?t;@SH6o)ncC&sK`KtNpo;~4*S*3G}h zxkOn{0reXif0K at OxgF zz*_{hYLS-)!xt9TP4VKb)8>9AR;m~B7t*d+6F<=<|+ zWkWV=x0=l3sc7>NGfb_FT~XP5C5=wG!fA)*157z=oAz}mI-Hj-^^cBV)0xCNbc z_iRYNihH78E+F*VNZ_2kJ6KpSHqT|vldL#W7s7BW(0it$i9c>9L4JKuHkBNP at ELQA zDD_hfPW;RWr{zO?sL{NFMxg9xOr-Ia?Je2?XvCk8Ke&xm at b*1f-0J-erU08WtZVRreS`b2 zm at KC);+TQ}0eOG}0e$;FV)9QPtuqUmIKbu)C1$4oS7&jFs?J}$e3t5Urqn7T;e1<) zLYL`h7^cOLk`0b*&_{tn?3GKG!e+?@xV4eJqxlCi_GSph2s~RB{-LH6ZD87P&*)^! zy!TfQtHsGv{x3lwRYkeMVg4>O$hr7Tw%YG0-*B3+r}lfJ8)0{c`3CnmG(!8R$b&R- zrW2~{Z*8yLjVsG2JOwYK9mWxg8ZhNn0bYpv99QGpk+%0$$`y zvZSAjTVo!*MI{1?LI(hJldWVeG3nSVQR#i$U1^!F5M|~ZV1tT!R=2H-RuK-doM at in z=M;NZx#0^N{ADKA7C?jd(H1J at sTYu-mu#&B+Tguf8&VJ3d>Yo54z78O#T=BrZ*JlI*bI5)kYaKq6`(f{uA$jgTV7-wqAB%6593 z8zCpN>7=)Vg!ZAQJI6beSqC-Ov5}agM!ikdy8^S(2n8{+xni~pHG6e-ZMpbuqe#>- z9MX$L7*E;AVJii`d4UHnk+($${P^2072U>6%l}^xX8BKqx8?sr*u2X{M-xy{f-EXl zt*Lzp@@bqn#Fl||p#ZW!&~?T_EfThF?k+P>bPDTn7z;gg8j84Af+-MpD at z?B2pSlj z>wKKUz3V=c*>r#LD?T5{TuElIpT8;PHE}={M?;Z72qzU-_OLg&5_Gm7Zg3AnLrhRn z`nds)O{AcqzpZ^WvgGa@@)1XbML%81aikwl@2lwd!L)3MsLyVfW#5Nex3rb zkBaxkdO4JCV(Q;%8rpM1kU4L+NAV&N_biU+(>BJrQ}c`CGLPdM0cmu*%t9%qOHvZJ znth@`^tbb*MX|oW`Ho1l)~@U!fq;V1fq(@6zhL~2Zneg`GnyIF*Yq_-vP~E%(pY~Y z5U~wMpd=g(83;323>h$S0A5t`bb at R~E_4?v5fw?)K`doD=65I(7*$6wMV|%8Nlf4S zVNCiepBn?Dw>NXQjLR7cYbxc6m)gAR-PMna>-GH49!J9ubniwnGFM{^*rkmL)HBfzH_4 zp#7C%{VJzc1z=&5i_EAjScM(at8%+&Tqjfklf6Z=I<>4dm?C?VOvXu+OUhZtVJ>9f z4x6u`W at n4V@scaU)38#fG(8QSix7r)w%uNbudL0A244#A4ve#@bLt5YN}d-x9ciiT zT-YJJQZ>eRDih~L)sBs*u1Pnc(b>!fZjy*yTzA@(ai4-t(00*_WCu9$)h5KGe?*X9 z3uD*OD=e$c<_HeG3K at X(FU(iTiJEn^4OSn at g7*1va-gVKmW at ZaB|Sy3=t#sF`2N&; z5nD*rtNN8t$!RjM6}ld>`|gCf?U;1MFSpWVt?v4mByh^y_|EI_q!U$%>o;6+e~IjbwueH zvoN-?<8&leCv_E1gC-GWddKzRP92~MUX7Ayx{FjgA3yDk0XYv?&S}d9_J~|nJNgMW at wooMq*R=RIZ2_BN-AamWI>&mJID~?Ga--iCztrUja0mm&cOI z`cyN;tD9>`o|ZllZ&A~FM71Y-EbRsjv(-(iu%cjHM(TW}ew(O$}UM-2ulyQggOCuV3pNp{Q5$ z#Ru51?e(sLtO+agrlL6 zhqwhoN$fQ7 at M^-2qU7Gl5{BoDkG3bigXNWrXp&nU+In5Q;_zApI#JfA6<}%-vK6(| zhtDe#ZD;P*SW_oQa6M0rU0PMQSR|g_8S5|9krg-;yl9s}mmArof3-ymgs&en^)N^- z7f-2-=CzaaJ8I$KSbMo0yGgV)F!SZ$|LH#?4L+oEuk!&-3g)PWN`Wu7rAlc=^Y z{I=R^u{+4`?3pQiMYS*2HDkrlEaTW2&>Al;7<)LdN)%F6+lN`(3-U$2ac4rnPnlq4 z$ji at uL=x5Tz*`aKHc`FmKzI%LJjF6;KJ^{ZRiqe$OW7H(f=NoNp5XgQu*Vq0awuIE zFgPdj8dk4t2E(8MdqlPMSnny(j=kP(dV+z`QyKM4Hm9=dK(< zO>8Xjt4aOe16t27#!$-@(&j`_=4Jw><$!pd-w<&(u{c{Bwk~E15(fTga_(Lx06keV zTq+ at nSSj=*SFJXrGkumP9BN|IQM!X|3xXF#%htCaLFVy=p?Pq=xL5V%F;b$oNG6=R z(oP$bODu>^ib>=)pyjxYgE7$6zcwrF*JR<Ha+AZb7NZskB)c`5lH= z7McWN+tV?W*mymE4fb4*zZX>ugh>Iy_e4X1Cz1B`p1J7{ehs!PJ%oyul1w#BEnU1= z+Xs=`C+`fRvu{}K0Pfc4+}g*j^E1SmeVSktXY=IZ(gA~&(qL2+SX~x2j#4)_CH6$u zh+ZDry5SJvb)#uJ(NNYeDN<@Y(yzaSM^MbQw`QYrm}f&LpW2z?%itJp;YE(;Bdz at w zKX-?uYIm3Q*v28lIe=vPT1m8|-eFJ<%@$5WPlUNEr7jDFz60o8$kMM^_^qkRunRV2 zIMPvdC0~+e?ONHaVK8aq6wPKNSq_kx>R_s}K=Kxv at FC6P-z71|VG at o1X2!>dxnR+N1*gI+)OKTJBnKp8!p_C=NET|`aubgt+kz&_^-#&cJn^e<$ zPBW3z at _BX6nsi79tsp{>w2^d3;D>=t6Kr`V0pO1i!wh|N7>f3Xv0C-A7~ZU{Iy z*@eBAs)brHh-82N+kN1 at qJv^LeALQHh&lRAV0xoqc)kd+yu98+fpjyHmHh4;q$FSnmL=&bXQ;G zY0Z4HQE7GwuBen6Tlyj_uR=O4iP{S(sI1G#X;L(&Ru%6~QGQvCceXz7Mq}gm$Pt1_ zz2W78H(aWk-n!LNRg_j at C61c-L>L`_H>u*TM+0u-t#TNtE+fhA3fo+7-L^%R?yS=o zgKfMKE$F8&+89H(SXoQ!o=o~rddo!z7mvy!4{Gxrg4v;@AMSRbUq$#^6Z%>zWXZ${ zd%WLT@>UVANG-m?%)hmut2Dxc#84#Bx21LSRAk=pk9lebr at iVso=U at IcN}y^FO&78 zd8+Xf{alYypx+hlP-?MJNxE9$bR8$%6dz1UEu6TDZS`s&AjCu-%?Xeox$~Gpx at VOe zA_~JQ?P{km2GbCoGL|3W!w}u-D-56{;kZ#11(5;<58E=snPPgWb2r!Ik~p+hNrd;+ za2*5W{qz;{>oQx at ftNGUly&LMzNBNG%4hs+t{5U{RcK-DmVK5JePUemkHcUzCon&q z{#&l5z{2Z3xV!bUKNWuc^7^co`*=%@>sGnLxM>gS1Ax}mrzr`jAD#l6rmgk3o= zIX?m3`+bZ#aS0Rb$2UW+MO0!oO*kVAcb5o;g+=CN^?i31fs#KWEw?Rx-z1rHNMUUa zoEvb;&&o-C*Hk`(ZVc at h4SQv62CA;t2k%3b>QF17cua3d&zHw=K1 z!DxZIgc1B=DWUgo+IY(M&VC6P2q*~@2#Dc-KA-;4l89B-v;M1vwP at EVrMt;y)#BG; zwQ&rpOWWImX4;?_ at tS~g}9Dx_sy5s90r^)&b4UV9uWve7Rn%_62=yfbfhut at rG0BTIv2p0E)!GdSF at 4#IVxme+^U z6*wE|*Z2`sG5goL*37$;AcbqXR$dXlqP!YKXSzUkoa>dP30O9(a#XL_Ld<42$)3$O zn3a#P&{=TG?}BDZ7Cl3*QJ|PAD=g~!8#R%*W})TP^$Qn%z;6Lo&bOr9J7qFvg at sca z;4O5Ah1u<5Zvx2AT5=C5Vj$0ZZ at c+sO6^phJ(w|(bg!1ofJ^!7L ze|T6mUo>#l&^`&EWwA=>Now30N`kPGN*iigS|h1I=83>ys8cG3jj#+i#${zGny(3- ze0R@#SHW9cfvsk5mkd65-+7nbD3TNU!0K~A?T>rju0O7OcDtV7{Xg#C2!S3Adod^- zl!sjBz>7sa3?rBlF&usb!1>Rv6hNc}8FkQGz;4h+qN?6PZr#;B>c$Qxc=IP zyibop?*t=>I^)s-l~V4KDkCr1OmPq0naX_v6;fB^u&i=(OLgAh(Or(Iy(>0K)rBRQ z$w*x*-D$F)j=AQ4Dk-s*@SiawySY+z>@~<(Kcdme<7vAi7`xK5vzr}R;hwz}##o)W zEC61Sip3~s?E%Lo#bLg!F)>fjQT;2#~aJ7wz8Ea+SpAUqzdqTYlLLH znEqXv?RX&f=xbla23&xiQ!7%*lM5FuTn at jJK%vAn>?W#Mo5vb;(zJX*8w*Fq^uT4r zZ1U*mWVYIGDHIi~$GQ>NbZ|T2#wlXjB5W1Um_Qh;P3gjnbjo|R^;;4x8Fjl^z-x$} zzDVk~4w~)}MTOL}h|El7C)@kc^j|t`C(~Al3rePrUaF_h%$IlR5u1TU8)});0 at KLU z;@v(b9c`g!!Xw^Aw29MZlM`TfV(8mv@&^f-lTOZ*SSW$LHAw>gHqv%9jVm0;bvA1TzQ3M7?K?D+Ss0EU5xO)>E z7<*G3IIk0L(0kM7!hn9av1 at M(0 at XfO2iTJh-P8p9BJ+vYf)?D9I6y74QK3n1$r at Rv z7-SO;;}MI at Aa3&?;0~*znbYg at gcdx+tbNzuiR#KCdk^CdTWKLSDL0T-t6ZCWDrMD{ zKJ;kZZ#P2DJb&Yfi-UiNcR`H%Jvx#^`mqF-5+fZ+f)Kkn99c_fQq|^9@@0k^jUXXo z_Mz%d$rk>S#8N{;iCUUEcBZEhR>>3L5>VM|$_Z-#)2+?{k<& zu)eS$a2oen;tDP02kiOg!VegwiItd at p!elG3W#cJa{ktrGUd=4!Ayv|+({2>8>@>@a6)}Z=gc-b z>nW=txDC6X2{yxWTtaE~3_84;y1b&+$hh`s0$V|Dkc(0{9gm$tHy~D3Oq(Z}E%->1 zvUH#hgwtb3bM5foBac07>`Ll1>}nD45mI=z;^ZNv1+aW-qDS}w>^3k5 at eu+{hsPKfDw?7~x*Q at H33Uh%#2=TA$Rhd>2{&a44DgKYq`;8s=z4thp2iTL;E94nVUf zO@|!wMU3TjzzXJQMlxeSTm?kK6Y4^tpC*4&Kg{np&Hs4 at 7SE1GA2ic=l0wTxZ;YMZ|n}8 zxO0mEQW|xaA214knAQ;p*yD$-D>J$WY1JKCnWtCaG|pa$xPrCxvLoP~MW2lvlWP=! zaVtEkW?Qs9;QF$F8i_FV^yiI&j71n$7RRIJwPayNAuoT4Q5NO at X0?3qvJH@#Yp`i| z1D^h|H*x=HWT5Js0w=eDTgG%XWyPki at I%M4CJsiFw&G##w5);o%RcAthFLEr0~?+{ z$_wvLHN*dZTv_Fe97F-;=4MW2b|z+I>P9xMX8-*C4R0T`9AuIY53 z3}VF%ru`ElG z=6UYcDE6Dm{@AcE`q+0|@e|ZrvUU`npBjVE6xRtPpqW5<@MjZpcLqfTc+J-AYfkhPbfuhSd}SFkTBDGn=`D}?1& zW6n{F(0cm(kvA7h{Mmw6a+=mwacmVL`6M=~`QIoZc)x7!v6#w*JgwNZ at vVw4ifQ%| zA1z!!vx-3%{Gb_-#C`;lvsC6cm|4nM;C8ZsQaRJspR)`8Ehr}Z5)RdWf?^2z?=CU< zm!SMZ?h|yM1 at 2?0)~dJZj{>iPyOU!O;X}FNcrC{>Wl~pz`G`9D z762R!_jLPAe3aDh;CK<%k4AF{3wJKvyQBuc8P@HF?` zzdVIw3#z8vgS*zZ^#v1P5Tfiv^PQ6gpTLFY72~i%9Xn;x;_ZilHNqZ(p9-AQD$fHx zA94~JtZ(eK=-E-3MQ0^JSL at rB9U|6d+kKyaFH3WTx3Jz;V8If zaYku1c@(LOlM7*Kvb2TZ->wM-{(U9M4h{q)01pJj@$bU!O!hCam$G%R`Ns|&4couY zKk~D?Zv=F%QKYN{3HJ$Y7MDa=mdMd63ekkpR0KBn*4wt79hh_4aB#gN7*ri%3XY}w z1z_vw;3|*7A-r4+I&oZ-CAJ9d!- at k&|NxZQGOD{SN zSqSr_6RjVMn;29E3x!HsUn1+KL{g&ry|f%v2pgdlSPnQ{EsLdg9mlZD?<~|+38QH( zMa)%^E&{31sxhQ;8&(GIA4v@=)yR)7D#t;P;}^frC6FyTDq1!b^M at T?x2JhJX?1h1 at -+P zTg9Xm2_WP-I8Ylv-K%V)m)V z#}y2Mh!5FhdGwck!@Isp6o!_Vu0ookGSkR(Q;m!=OnH;`IMc&I3G1TvSOTt*Zw_x1(jfXAG4G*aJm$eEGq`zKUM)@#kB1w%h&nsjKwkPvu>HPqTNR zCHGDqRKy{-*|ryeB&iFi(XFpaB}!Km<3tyKn(Gi2E%ci|-7#Neqp9smke$}K!->KZ zyVRebhJS;EjW?c6+zujpdGq}Q&fnEJDVvwx1%^xVO{j)^fM4WH?1WF;XbDSO>cau4 z=w}C0;qPY;QRXjT53!%m0t&O-lCvQa5K{DsP`^daLm at QjdIsY^P`N~=9rl1bg1>%)w_JZgs>Qq1$SnF^(rws|JIwK^m+4FgY zlsr+sh=AK7pEkmuM~6$^74N-#={d3|{i2 at zMe!r|9bq;-h!Y8}8o~->ZJY+3%&`GM zYO5gEU26O(0dtoZoXm3D&C4_XFr=ufqcZP=DKJ?yGy1%c+kLs>oJNDC?6y*4#cY8p zJujtKjE-q5s+L|exnf{5v&J at QxSs9jGsMxvj8OT^=s2oOkMKtSv;|ISbQnfC%NA+gt`3Q1fCY##QOA<2O_i;R}R`#MA*(N+so;4j|(dA znRi66Pliy)_-X_!NaGWR%#ZJ802C?`66u7ewvDU6MJ%dzmj7wXx%WPo(XsdKZL$tH zrym}jv80bFSr`U0*|di)O$*%_^820>Ox<2oy}sIQ*4k8+2R}GGCaQ-BALdYFMxQc> zMyO{jvH7iQJaLc1;&UIBPS`e$fnLve_70m!qj{^%;6+EyH~ora%ImBeco>Z=22MVw z_+|L2QO4|xi>;q-$$T5#w$AP|ES-8gW*!QJGkllhjBL4X9Y49~qtnN2cscm#qGu+e z#ZUY`RT8~Is5wrmp~+xNr_;Tz)UIo>sxUD5x#b2cacij`16f&5-^-hvZ|qw9jIh>X zpS-Mz^&#-S`Gs at w3Nxu0fycZ9-=5lxG{k zgro~pMSL{3c#ZyVXs2Ob%FW72wum?#v|?}Sa=M?h&yKqm*}!#!GE zstg^;d9n(B*t;CMTV5i{HVBHGvsd~-sC?eg?jzB7_z7WsluKig- at p{AVJQ1xFwW5k zF{*ISYf^loE5mE`)vz0bm|Ygt}C-;PsCOS%921dOqit(3IL4tC}!+tvBjQY}$PdGuxQy+X8qN7Uw z{Rn6xfASdAKMG$P=HFe>`yW|G#oo!q%=G_B^rilXD{u5m#jC(9H9G*kqg)cufrbVQ zs1f=mLSau at z{>wn9AVuqQOpUVFFwm;wK#r17HqO` z^Z$CeMeRdV7goFx%_swwjeg8zVjY+Yn+xJL%7bNPlqCtk1TF^g7~fN{3NtUmY87u~ zg*=yF*KcI!?*(Xc?CNR6qpZS-JHzcXcT8eyvu5 at 0rXaYtr>eQTM7fwwbyuFK%Aopk zp0+%-kccRRHdJ3-IY#4p_Ih~~vr<)s_184lVnpXq%$VIB8+HGYX}P20{A}=6F1aUH zTxOWzRskq*)0M*-0x7CNjkaM4fYVW2 at vvX(aC!?@OwC-$JAhE%te>2*8kW?Sb-Usi z$5V6zoj2iav&d;@4FCr`;KMYi!s$Vqn#xQuj$!iSfz%Pky8Y!$CIfJ!B*w_|u at Qli zK!C8!k!#99(;kU_CjC`xu=**cO~c6f?6Pw!eGdbJZS<$&uRD4c(N7h8h%?&afPD<# zA3+a4V%0t7#CI&7&mgH9b{cN$IWKvE-=se%nv>z@={#60Z>x)fU#Tq^c;?|#dI+}2 zYi|bHDb15tW%O0nyA<-;E`KMUhzPzcF7d;{iEW1uHh z`DS_gBmVWZqyK-S@{;HWTPtmC^e?z znlxH$`Xl7Mm%wSWuziD#WGtFt9rG=&Pweu-S#wuVGe4MIS2fDo4vmvy7#w#vR@$*3 z%pqkz#~3g9ryGpkQWWoe5ZU#dmS7(U!E10z`Vd&w*Wc{YV)h|xCx1%nia!&M;@?lU z|NOG_ALm~n`DSyu<#e)rK!wyPOKan`8Pfa~SA$j)6P7zGP`k#paMZJPOBAHJtrG$v z=DGoWW{v>07^+T&O+d5pba#84&Tiv9tP>RU2d)p6V6f7(?i=~wUTUxlgGAs#;K16F zVc- at 1d4>y#h;0=sC3GSjtGJZhwLNh91Dp8$H zin?&ibc}~rT!`+D^jna|`?Y4^5eo=skz6Pg&E7p zO8Y2*uT6?PMaYe%nCf*lP9gPF0mOUN6Km6}LSe=^s8)dha6%QP~2bOzxo9VCT<=P!+xn?)uw0Q9$C*CH-4JGGAEx=R7bkPwoSeu zTrb!dp+7;v(k0f#$+fq>&`zs-{q0or at SNGgQ4k;?Oh_Ogo_~+Zf4A3**||6Y%>E0X z-2cqVi<@?v;4rE;Fy*u<%34Bwu;^sEa0O$a=|iI>_>)Oj@=e<$KD2V8F%;)bgnzlD z0h3`u*)GSIncP2|Gg-U*KmER-4N;<%hL{;3Ng?1-oibE!=)wR~R2i|~5+}IwCig>w z(qZ(OEyGJ|Fx#i2OGmMjIzaE|*edhPaIFd4!$vi)Z($r)@WQ)fTD2<1M$dHhQ(_8{#IkY8(n3U%ZST7+Y%+dEU4th2HKv((-osr~ zxB>a~$6vFAq=^P5T})^p_-oK#IlAj)F+UuM?lim0wS`sCim+%wFio{0hX_b{KCnB- zPo7-5MI0t!IXx$iBBgbjgnceqiZq&5tYTQ2xJ=UUlxnz+Z+`!(y?lJ#dc5B1rfZ*+ zIY?-QP-#>=7o&V&U*~uji1{V_C at ry|cDFUdkz3f%;V#6T>~$CwRSol0bcR7!=HbiP zK(FL_ at 3WlrGj1X)P6n0d1D(=78m6D4y^RqDrx9yqE>s^L|8yxKq}B+C8oaJz()XPz zW3 at hj6OI%!@{%jns)J599+P8|MN)=~R>D(1E$9dy;1OihiE{OTB63Xe(|XV_R7hGjJ{&JVEI)dEB_3=h%H(YXsH#$@qpC4V7Lf0*AIupLc-)%qk=u1=DV ziu_x{UhVr2m|)tVSAf1y#{B`gz&J7tvmdLVJ$-&+&FEG7klC80R38ovtqv&h2h0rL$Y%xHQ5trqw9<@)Nta3fA1Kd-xA~S{wa>|;QvR((f`f#_^&>d z3hrNhDt)(PEF3z+)sS7o*kUyyY`>YsC~BYNQ3A$;>bx_Px!iw5iVEuS}Aj({q;~ zgTITh_|?pzYBJS=#$B|)tXCHXG752vdz?UQ?8{RmfQm4v-23f$PC at X^f?&h{I2i3EflS+ ztX)CNmeiFgeQmKTi3fOCkYv?pN7-tp^e~Q zLJ5=#F7w;Gm|xh}x;a>b1H%(z^{L%cC5)XL&zVwew!`Hp(iN-~q`jip<`6|nkE9R$ z at N*Rha)rNby+m1BFdXI6QJ%Ril8rCD{cO~3^u!rh?AR at 1YgVddRh`DHwRpD&)YqI)44oT zmZd^oaz-|GIHXgP$Nj>8 at LC$#aisJnC_QDX6=b&(K~DiCJ=X|HOCR7b{S@ z*v?Qc^IpPqQ{M at uw}SiJ-QyR?tX(EaIM~)sbNeM=)-7`d-4eO~H}g;w{fL+UpY{3< z90-W}|9wL8{O1A4e|hkPus&PM=5VUhf9pFYYifBhx)GzXgClG at Yzefgjaz(MaJ zFyQ!1B~we1{6dK}%JFYzw_tn#IU)d-@?{E4nl97Qw{oUnI^oyX zIHY}wC(8}h`Q at _W2cx5=lY(b)pDo!bN}+8DF137oAo5TG1t5F|E4Sh$l+bXuggz2Np)l9O%72#GLzw^3$DsdCwJ_k%tA8M^ zrlYc{j`SH~V-vF|l!XNaJ(t4K3zk#dhSt?QBqT#5)WJpGBOB^_5HXe{feGU&o&SdT z3i-M*lR{x at o;5o4AmQ3c3q9P(pRt4}adLUR{^9mRFW>+38Ljt3Z<4!>+GO%~q5^xBnzN{@4B-JqO`R=m2AfpaCR6k}7`Y|1?3f+x3asBg z(@a)bV~eeJrw{XNN)7jIYO{daY`OnM+B=75+Am$AF`qc;*tV^XZQHhO+vwP~ttWQJ zw%I`^osLfLJ$ui5-#asBzt=hc-hbZLT2;SVRjZ0wqR*x8A+zchevxGNTix>+-1d=9 z?`!l43~kP0S%Z|D03G#jCn!3js%Z5x&8k8N#u=H!8%Zt|7S}0t*Y0V=;vWI%g%uZ7 z{Io{I+w7-xP~VzDB_}H2plU9Rmn(1KTw=Z at Iogj@ATy1)e!CAtc`cMaN3iEiI{TfR zsJq~1l+HHN)B(n+5Gnt(Vww$KB~F9)(BOpUanjn$&OX^&S884Kv1IFVS7*!BRl6dl z)v5~DQFfs=mu1`HBO~rzF-MR)BrQ`U;fS}F1-h}_^s`O&?=4H;~gAW6X`aV z?nryBWfiSIReybhGAi6nw#bl7B#0Uz>jbT~bZx{^nAwwVb*~bIN5J-n_j1#G<3l60nD!QeKJ=7bmYWJ^dS^Y<|$kBBPIjOf|K7 z_LN2bDH9RSOlw6NzPAgLeoWNtaFHX1s;zs!t<^=_Z^LAL(MFU}oKE=}4^jXluBaHS zbjP0<_jcRPI0(QNF}GS`+4j{hh%`lm*;sw)j_+<`ks;{V1H4kYLuUE{atFA+Q^@wp zk1AiJhCDMakj-)@h3PX-l)C4mEVAmNT&I4uBrL8?NVWG!E$P$icf#sqqoO_5ArwRq zbh|_@#A_DzpTa*0B)RACEr^`t)f0&uRB at a3$aLpR zQY?BBG~S?U(DNT?DCNl2hl3>vIZP-S|n$J)$`5OLjh?{%Q#2D#NfNxq}Y1V=6;b6_OGi` z!t0LT$@swuXH+GJl6t9bldk-H_qvzgScdb9Jx-~O8MXN~<-A5i_zr&|6L$6;c8GPK z at Er=}+5U7gWJf#FBEpsnOxO$j;WU|&s_9DpjGECjhq7C!a-{GmMdXkA9F=5%JkdMJ zJLqvFB6>W=FqC=A)!b4H`uJV*D8F`$+F!63d(vAn88vSo z0D684aRdwc(g-{5335aN*^LLrLI7g4tqF3}9K;Pa#24}M0q)Rp|Nd_Eiy*W7sdIa9 zd;Rk`-rkc-Cex!Ie!TN#@inS at oaB!1zeg$CXgVv}Ke;y+;%~_+{~F0mQ~8&Nc+-8| zeNee|C&+lPjYuXAi2 at l_goybITjBYuEB54pd)Yd?)MpwQRx#2CNI>e{v~py6TpUuj z%L#A$t?tQb{jDHK%Y0Mf$OD*j1x91A8XBYQk{lb>mCMblyz#ksUNT_0tr|++pt6q< z4;5OPho1n>BEYt3Bysnt1oN6{=|ZIzS1toy+=iUQ0JVkfRh=FG8N5Mh)u)v7}94 at X| z{b%v>r}`cWJ;YaZ+LK1 at A_sqwiD#Kc(@5yWMA;tS!ifVfX<}!6Sf<>&=y_^L>lwY! zp-VDrQ^bLB@)~FifXuN zzv<9n=#w9_Zg8mCR{H|k`$=4q*47>=83#HB=qB3ICu|TO=8;NbyG=_;VR#UDVrFC- zemXF*{F2o;OhC?%iY%pVc7mbb2ELQoqF^Mmcz$&zFD!OLa&S$6 at yVI@7KYT5nrleR zi9yEe_;uRFgHxXvi?F_7 at NOGREa%|#^z959d!x>B;&82Y*al|S&uAtTt+=gCk-Rg>6Xb?jk=4M(Z!&U*@=t-K6`)M;{8LODO>L=*7ui4MX-L?vk zjE+)_8^v)DR=ayGN at z#i$u at G+|E$c?IsrTdC|hWLv_mKL;W;ZL z1SLMXPAZ*wyGy(jVkKHBZLevcc~Sd8gr8OwbNOc*1epYR?^C%-~(JI6P-Y;86i zDY9qgpF{WKK7yrBd21Xk8?8^QDbH|F<=xxt|P*|GXfe}GpAgc`5F2ykB+Hx~ndc$D!Y^?oU zS>SR`oPOvMb`U%dx1vZ^DXPg6-~V-;)-!SD9qPa1?$_!%Ok~=WHu!fFN)=GL1MK>mY0cWKfHGn;reQm$0=sFmD1;Tv7lU5?h at BVLAs0^5qv!iH(UyZT9tNkA=XlId>;93fCTaSnQ)GV?5c>r zKzdem+JundHXm_nyyg at -Q>DAReOr`J5U;c5&is{}b)exk;4fYH&ji66jXyv9{O^&S z?SK5`Fx7t^V&KotJ{&GBgK&nB#XKsci82_3@)0;X9GSsxoyh-}*vYkf{U`fy&J99L^B9)CJR%yqhT{G9D zl at HI@094|)%N#8tOrbbHN#O6ddX7=d$pYCsw@>oOpOaWI at H7R$v07H+Nqg|KU;BO> zj(n at LgJ)%W^4evzP3mB~eZD5H?UvvB-lb`acW+`30Gmp$5I(C<+d&(4{v8r%B=BXh zfvL`Z?X%pGnxSB4qq=pY)ecTITYYYSaDenm+V%rQ^CB~Wh{MBsbaR$?8SOV(epQng z<}6kgW-c0~Qom|MYOYNe_#ApYomMdoZx^wMrDJ!zRd?U<Pn#3}VA>#zh!hsh_(>F?IXooAiYzlfbPkCHs65F9QwIdcHB+{t! zg`^FTIAFa-%`Dpm7$xdQ5QsBH4XI5F31D6 at 7LtkZ8qZG|4A7KIvgDAY4M=5P3Mz0P zX>kF?`4+T?-FW($CyDtvC%P~$G#3oUr6jELB|4X!k1-c^6S<=>e9}en$(5XNX7UU2FTTHj zNuYl|lQI9#Hi4Rr%Hmga{>}6d(aVg#e$P}_BhhiC?zv&J}x&qE;j-{AQU9H*Vs5dL!I?YGm%4&3O0nJsm^=ECBG+zcAUBe at rtLir30pC2!$xOt; z2bvmdnI4bS^wujhWTLeaWpIdly^85<#MV_`+To#oSz?{=s=A^Q@=5h*@RHo7x&=48 zPqb#WNzgwl@)FG5P7)reZmY8s;Jf^o&ZLw!k|wp?Bm6L82+GLFi_n9Qdb%SNosxRS?>1G3$5UNEExjiH^phlW|T`U-TOgEL0I==8; zS4ZIYabK~ZoLNM4z;-owOcP*1j?;>9c9(16AE8UHg9XvXpGC z`Xz_ptZw79*sy#q&o-suR#CTDkxU6L9nSHxNP9~Dhu;~cYhVqY?<2^*=smpVpOPy- zS0LmOQJD||(J9P!R=C#@W3{5!9}F9;zoMcjGRkEI#gXfl9BI!&@+#z-v>~Bxl(RPk z0FC_iD}KJ5qthUM%P?dh?QjJKA)I??tgo=_mgD6n at fx^&MpBCE648E+s31#*MC>ot zp?A|DCT}|#CCYO#$v#Tm{JAM8^NQO?d3dX_xd>sC-lE>EveJWp1ap`~BzZB at zgC zPdrJq1ROeFyzq!EVbl1d5h6FX7o-uN5>rAs%NJ8R=Fnbnpxo?)ra4v}SJv^(rhM+L zoo1eiqlXT!sUjzR4DV&xN!ON{Ce@`ozfSXY)r&XAr%5#WRa#OO zJgV`B at Zz%(Z#r``t0^Pd$DcZhLf{v;FZl=l;Wv9JDpWS!iJQ)V(`imt!GM5IP(%2i zEO44t1A{7A&V^hgG}q`+IZ#rm61Ge zs!0}Qc3^c~e90>WJow%GP)t`x)>@lootWZDf_Vmor@*a-%&>VDUOfYcfIZAD1+>by z*wXu`E1SF$6!wap*ju+9cHZsllfKgCDK%>((+2|+)2LM&T1tvIFej>Oj!6zH;1jVv zl52r1o!h4*nMK)YVK at eoSSr72gLHX*f;grPfcBG}5?Ia0ADI|q^nL(iS6icsW9L=B zDbwQW0ZzBb>vT5JP)XhGwlI2DZ5YguEU`hn4z6%`tkE#a8S6(;9q9AOsDzj!vqibx z%(EH10xU00+ArL z4v1=Sy#3_6rV86Vb+j{BYRihu#}f~cwNqSCysGm^iyLwf{?@mqkxEr-TdZZuqAD(m%q<)wAWSAwl)K` zX$=2`S8SE)AhVpbUyMFegRPW%q!9VmGn7ArM(Jb#^AY3Qw(|F*7xi8eT=L4IWOD7L z>SXP7K-je%>8`Fy8H-iI{dZh#sJFa7?#2PEB`-F9M3PgKw_j?N32VE!L!`F5bboQCdBCvxR>^QQbazt0=>lqm?%AVJ79!wri`G_u6rBf zcZF<2n%<}e!rkCg0-hHj9pxtm$=j;kh#W880!IXl{s5%5)<|n+nH@(u<7q0J!W|~Q zKMg-=OnfUE4hQUddL$CTbj_siqWZT?AkB)}x6B!{Y*4?{E9j0Bf7K*lar|pQ1oEe0 z29nG!_p3R+G50`W%KLNoPzzVTblV}K`&8WqvJoL&S>8O_NAM2$MRs550Tg0cn~IiS zQxM1}soo(o;zK|ShTXV4Zb3RjW^ILTmoju)ou`EY;nW~ zXTwL)%Hv=3Ys!i;h^Rk>940&n$k+cb5%GUc<^F4^MQ!dM&&-eX^zd-1jp$%OWQ<1o zC1nUDZ4~+fNep}}dx8a2>l`+t1=R?_vCpp-co<0W7N78pJcolJ&`1PJ?NTuGazRBA zSABl3Pd>LkuRAA;x6gziC3jS at BI9r!#0N}eqS{+mqPS%*jxk8>okH@%0P`2;cqETs zjv50!fj)qtEUVPpsY?K*@!gxs%eR~=?W%Nb7Fijs(l~$!lSK^;K+j7}gFtl(azr;B z9>`@q%K>r_ at 6=gMZp zIaZxulFmvdX|z3Kv&vF#Q8qQeUW1GUAu|vC)`}Nx|I1!H&pUW0&{xY3W z^RvyEW7q0}b+TOfl at qn6nc=pSfS&`bWDA3C>#6i1sNYpQyto}A9_*UTOzsVNS5%vg z>8Wr5V{NwVT8yP%;1#Gznk*AWCem>(qeysL2@=>h*lk+fry2%H{pUe(e+kEy=}pc} zRDG>I9>%Uxg?Gop&gXg}{PwQ678t at 8=r>|GQDxqJV}He}^GVXpw2n0-y`jK;QJiDl z+mFlR!}#SOS&2PnGG~%7l}Vy^T0!zmIFI-1HE3~-Pf%7uy=o|Ni{cnZmv z*bo_kD&F}UZj?-xXoAV>M|-r<6;YI-Wb2yl8)L)FT4k)RZN$ab1kK%>h%=O*`m7ls zz{AgE*5-feBoIy}D9H8*Iig(ycwzmkiK#e{(Jx^}B_;6p67a2u zKX$;Lkk2a`b+5o?-kM18d at Rv~anFKzc8Gfx$B;J1oW?e$j36?Sir(|Odi5O~LZ9&Z zt&+vFoltSP-))o7df^zJT-u3>ILi0sT%od(eygcqDJ7_)A97GLIC-~*q5M2^sz#Z! z9;S`0F3GmcGOV-;{$!K- at rwbLpkBstAg#`1A&=EHxSZ;%9(RcSMG-68bJ);QF>6P7 z{9jgxhO6Fq>i?-EfBrowk^SFN;=kHdE!*~5rpFZeUx$l&so>$PmC2YP&_sk%IN0~? zy6~qC8aA)&quv#IGCg7cF;lNJ$~vVj#=$1XYti>I%e~8OQTC7Z$cTm*bFP*h`4WgD zN~Vf9Vew7j&|blW)|xAZR+>gk37vF3nD3l at mb@HDkU-;^r}&!qQ at 4_aalU)q>Je}w z1TMAktMEgfeF~tm6Ibt&sicFK9h`u^i*Dm8uQhD{piXjPRF;Ly`cYr;6LTgaQcfT! zV3c+h<0Jh at h$z_9sg1IptYU+o*#*@{yyGZ`Zy76@)p-VL;k8&d%iaz}{ z+K5wkZ=w-T(jb$IzFz;U#J+AaP~4<^!&04dLaCk?KO=%azXLw%1=_UKgr`jM#=T~> zR-}q at NQF>cHHIOFd5JMtgtF185|NzO;Mu#6UZ1B*T+hu_t8;#@O;5)==+NC=%yX}m zy#~iKbPVbqi`~$0W`HLTD|56byd01MTel1VeCAuX)UoBA(26yFBENn*ahjeGFJI6ol~M0JnOw-bXav}us6?=jd3N+3|Fw$ z2ZTEJ2n>*VfjURD^J8>9;b1z)>5ywOYvdn_;&@?Vw&`}X>-0Cqr6rTrxkFv=&U^50 zjN^G^(fl$+NXcg%agaO;V?wuv%-a7 at 6meuaBBYuqU=~Rd at ZRgym{OJl{$d6h?YP<0 z{)5olzlTtc|4r;(DkZiP?rcd-7G_XvSAA@;l%oaj6$*QQNU17?)hixyAzc7J`JzRCWMJ^!1 zsFn?1-=3AsJ(nSAj$Kx#hv12K$nGv)EKe86+_8L8M}1nzx=)x%0FKp?(MG?e7vq!n zqi6&>-V7GF`us9LYoF3VMhK`e!FjgbEp=*K;yRMhCH!4Rt~4 at WK-*6mX at wLnAR>S| zsEDQE!S}1&k(#Dp$6L*&)rJ?nf at 3Cc=Dkp6Ep7abv|%X;iTF#q&+qJ6;%mwuV*=wG zxdtYdc^>lDqVK}^%I;<706mc®v%t?zEw!f~6;2vc{m-R+ET;N{hZDnM|)rNqHl zC4D1*q16A!sJu!03%+C~^+{~tnY{yL zOMhe3+~YUSvBen0_fZcKy`ZcU1xukbn1J3-D#pQ*V{Z_PwB1A2ct>*qsZp78AUZ!D zeBnIdEY=bwv|~D?FIUC6OHO&TIKl8`)-9Sg3pdJ*7+RIz!;Uyhnmf2XJl-^J?&3Qi(|90$OO`sDCp4MejB?j`&CXeEoaqS zss5l-6$3WuONpr0p4}l`CGA+eZF$k>Qie37DgpAGFS_vxdyryvlG*LmIxDM%h5P%% zYWpn+#}DDK;0WvzrCE|F=`S=@a0F&B{xybjL3M_?!~w&#sJ*0jI~e?ndwqtQRyea? zZ+Yc+QF*?BkF9iXq5aNOv5;h!-F$4vR-altPeT+j9y?e1v0i2s^Zvbnc8lXyJM<_! zey|qNLyjA1Ff_o>8(=uUv)1P5L3iUd6!XP`E1eu*uzM&{-y(L9?90^>Z?)CxmoXaV z{E$fK!uf#`BlNzHzEZ at q63O%~Jb>lHE7I>{rr^ zj;W-VG1JOoWMw-0=bs+iA{z>UV*(Q#dio}odQj!=MNXxN)Vzz%;&sIO+0F at 7HD_6_ zg`?LS;m4k3+q-BVL5nI4h5N91*5gFgLcp?c3(va3KypYOfD20H(FH=)SPKEm(Z{ZC z$?DM`Xx1UhmY)|}y$oHClPWB}2jDI`>l!>pa`wjmlrA9@>7kqR?qYl+f&}_ at qAvG* zi#jmOy)nx|?1oF9nh0K?k6)}d3ZJ(zwIdNnN~~NF2vO at NahGn!GC$8IK};?mha`|~ za>Rc~T#dMpqr)yl6CYQb8?Zi&WX&N(0ZJuaI^;AH$=?OzjwY>u*)ROAbwZ5VqPUbV zFkya{b{9~6WtlEjw-HQy3to~cS&JdN;EIaw)-3xeiuFjK9(*St%|_7>4V_6!tB{H6 zS#o}>F2Y>;@s|$m7TY4D_aB4~{>LTZ|3s*ev5Tv-k%{ZSw=4fc1^cIs*X4g5bhrDH z{E^2#btdsWdbKT4;*emxt#ukGsc69D070Re^DrEv9-Hp;5_KL&_A*DjFT!Y1gP5bM z{#1uotzvn?U~K2JTU*l(<`(X^bG!NdAhLzFh9F+8=(1Q;WlTX*t$YjnB?U&(V=eKN z01 at 7;<}gO!HU_mYLr9`gN7IN$$6|Wj>0^xxAZyE&G at HZ%%eme<3E-v2&`sbKIZCr@ z-k|Pl5E?^}K!S4aDbB2R(<(O1q)`b?UycnSr@&Rx29_Us8r9`W#nGeyx{+&`=DqV% zPs`jhqaWh5#SWtiFfmdOb$Pv_nbgiF0c|cUecI zb_wWfP$J))#>VJ*))4}}qhoGg9`cE$QP1ikZ5Zh(>Oruo){>_sWpy8|_7XY2pHwAg z3jv2*dKwIgZ3aarg%O*1^tC(Ul;Ay>%0e7FKhaclbd^t2qhm|Mykfr(b`1ltq)#`? z;vvJ&A1q8WdmX<4z;6bZ at y_FZ{5mcXT9lg2^BqeRSP&gz4~zW{D7MfDWBwhC^(ZC< zK&+w$C9^U$JuePG1iHf4B|qUrttC^-Uj<=MJ||LreBEtda|%_D!z=6^VPBvxB at Mak z5V}7>nWC?V5wj?O*Qco5`8IMZc||($;~2~39eI&&kPRu*wWLCFME8=V8Q)wG=wSIe zkKIRL62LV)n`dazedV-Fv?bP5y&Zx-_3HVRB}#~|q?hUc`!7S at 7hZGv>`gf;!ZLP6(SPR>v2HI>@DLZH at +u7Z7?;Q~<3ucI}ur#O9(&NFhMv5{>} zz#h#kYgxQZEnF@1n>?*!9tcy~BG#gH+?ntSwR7P>dpA2KHg_Ij>V0tBOyf?R29S5J z`rO#4X{XQwOC*ylt%dW_H{sK(TAw at JhnA?j%w`|G2A~2oXY3J8){dID)Qk`BZ7q`! z{IG&UE;1Q(AX7@%Us%qY8dG*&l;V_q6U5Dkto6G zk|Rp}dGc1{=Tt(=EB`%BiA2-~$InQQnV@}L at QcCGeq=g%b(fq>ODw at +YUgiB*EI!G zvICQ+h?Vj9YVyA7pnci!@bo%ai(_Yx(0XzF at lEo_7|agQ at a*mR0wtzqxNTdWO``tm z%NGvV8Ox*wI34nw(bz~<)B{Zka;{rA+sy%xoBNtjxivZ?c#l4WTS=~n2ND4cC!rxR zflok&WdB at i;ty_ys1CY)xH{>M at JkYV$zNc(sBI?Ik=dyB`!Xo)S!wjnyB8_co1cRu;TenlMxI(H&Nyjin=yr2B7|x${6q`N z?z$85WeBu-d-%q22CI)UvLOa at g}zA+JNDxblbHFw(lZaCQeDoIHxjX at QG!B5LiPH7B+Gm$iXny#{F<*>ncU?M7$+$GOf+A% zEH3|w1 at o?nutS*H>w!SRCO$>Se3S1%d_U|bPh$A0OW*^+5p%%}fu-DEa3V?ffi;w% zABY?Q3toYSxFM9zy}3o?){-~i?Tk;a6XRur-_jOjuC^xWu+*)q_z~Zv_I(5 z6`yfdRXwkEdR}CI)^%O)s5ABB2RA!uV(1lZR~f;p at aUlQD5d`QYj at W!`%e;SP#oxv zO$nG8;%P%diO()>Nx*YMnEnNpKQP#pk2xX?pwMtekd=cUGoflA*1$BFuK3{T_<2sa zJQvwolpZNppr0w4Qef1|6s8v(?-v~OJ|y)BUna*R&ZfRd8O5+66{`FD%?`RN%AP;Y ziRYR|M;X2l?@bv=WRI+H9Qw!!RDZ){P$7Ey_?4F2ivZ5q9KGIP}P1!L^=`mdCF-_?)PU$gE=`mF4F-7U|m(pX7(&O3B~0a2UOUp$+Om2C#U})P*T+vVB;5 at I{&?w%;{f?9;X8(=OdI5*PMaRg#;HQUU(*Vp z!>DomPg+4j{97)*|3g~&cO%Hg1x*dhUq0DB%T&fn2Bu|R-BQM$yk#p}Q=7)}9I}C3 z8qzI=;e27nUX~+`1|}M_=MB^!)ZndvH5kGIPw+feaFDRL&%&cyZlM-N-h4KX|CIao zp{G6ND4{>^1I!R&7wUURJJ{JMh5#Mp9Y4j`Oj^loe*?kL at xol2%FHUF%2dpmFezS^C#i+vsSpKT-nkHvi(`vCzshqR4Rm2&` z$J~{}MDjLSx_Qc_(qeT?Fj`Wz_fid2dhJet>t at apc4{?tbat`w1wasFX at Qh@D;=vS zjt6TD>-mVScTTaitL}shR3YN@$xq{|f=fs>`R^?iHkCQ5Nh%o}Os)mTIp(RW*s}s? zIoS55_)H2sTRD1~&3@~8(76k0YO}b}btpw+ZlosFm at Ls{ScibIBDoL2%{0yQLC#Xf zDL&6=iaCuK?#>>nV^!_*oaKk)th7nEfObs3(P&}qgwC~Dodqs8vjOrLs~h8xiJuGM z>(lUS)l+-RXB-pnpRfnS)=ARjY4?8PWlH3=iCvl9LKh1<8pbk!9W}393CAf4Y}SXF z0d-h$GT)p+r-T@%4UXEhDkxy(=jhEScC@BnF;WQQUT9TZ|^}bt4{rWflR;OpeiJFO)Sh);i{f@e85 z6a*DW?a%W+EcB!R;F}^9zcVoOMaXLC`$w0Dr$o=3YTrqAa{`Q z5g?^x&Y?P at tkkaj%PzY>^;b`Gbu=o~)JrCNd{f}RPmk4A*fhf~Wt%^=Es)vhg;N$Y z-iM)1{r-KOg>3;8Epq>K7?aBXr6i4#IyZInO86%=`Gb(9HjV zrpb2)ljnJl(j%Bz7GZT2iiG?$NO>jk^=t&O5Glf{cb6v|Js#v_I(g7SH!#9qZMj$+ ze+d+tU6e{@MG2>p)K2O7485_4l$r1oWoQ2g?U%LX-5#%mdSU at G)ILhMEVt8TAZa-` zrQ-tG#Q=4d*V$tHBHP0X?4 at I<(^6)L^kN-3oe0O7bwk*8nVUZYo&p)6h$oof`2$%p zdyDs-UrGnp2(1!kbpt8GRV4i8fjEw0F(S=%!DxkA(RN;=e2Mt0(&>(T}gNl(L20^x*LoLcCkLsg_W#^XWss?ChZL({nd>jZgsm at -m?`Ri($mB8&%0|*e1 zdUy~J-v68({+$*6hn at 1jcf?B7^;|YZ(fM)5lCP=UF5BdTIGltxc-&EyByl3Q(X%*^ zuO34nL|)SIN0gN466jc6J@*}cK<~kp$UCF-ci> zw|dF4b9kxlWf~{3bDEGGi-c9uqr{p68UEsWm;RJi#(@u1)u7+}zN*pUU8mXDwp3-N zCZ|`rpRT4dr7faSzxlgM={p`jr;_oRLCcC;xaaqZbB$~rvu*vwNeVGkvFf64B^*thlBTE#^uxBd_=+APa^L@8WM2r!-wMGBW}CS!QtlMp>w7l!`Y^E3rr~=j)msL%y%5w9g|ge zW7XQfDkRQxbUQ6L?ov!6&RWhTi=&efT0JQ6Gk{y4{`=^x7E&ptcg~dL4_S#KW7ERA z^(>Qh0HyB_F=mmDeFBvi>VpH(Bm|&67i2Drw=J%Xb!(M(t#8b19P<7ngb}tW%_IlY zBY6Nt at W6dpU8@JCGp1Zgw^FY=zB^rpKb at S+vrOQUWx8IjZs5=$`!T}ihO?T2%Q863 zRJ?g+-Mx_kcXy$~L)eS`o$^=P{cqkQ8j-K6qgBf-v^@0XS at F(QR()Rwm9|tJQ3;vx z5DXO)M?-_ at C@_3u6-<4r_E>!x4&fnjRKx0w)Wo%fATQxuZK*N`y|C57*H16JA+xde z>*A?B!5`ol_V_}6$7DYWjA(Xp?jteyVaF)m1^rR5P>KG3Ku;a(0-uS6d}{C zJ}l=Uj6P1mpr7`t*bX5jkY`zFZ z3lzd8QvarqI7^U6^y88zjWOn ziKY6o#i9t8`&K9g;hs+;kzPa*Vnp z-ivi;XLE}%UqB>yO_;=+-4yqSF#+vw at _9Q<^tPA at pV3Fk3ca@=6L{sfl;K%K;FIiw zBJjcP7=k(!_AsJz(ZF_#cjZpmI1Q%Tkj*qFWbeu3+K?}SegNNyA4m8C3Mi#WBZMFC zI%oZoh(!Ftn%-byzcGLd4w6#+q_pqE at v4QzJ{a|Pz_Qxb?XYu0^DUsw(uU(Jfx?8)OJ)XMfFQLJy&L;IA7zez$kBOlU at sX{XdH-B- zR}`;}-9*m3cH%<032wX#@(&9MKP1>Y;v-!rfh-ra)cZnlNNe>1b1}bDYImbKQ at rzU zvHjj;r0o(c&V8n#J>SK8&OiFZN(ZKhMOOz9dcLZ?v%FXHGl-olcLYI-e*7hFITFxX zID&(KP{M+Mu>SqHC1d9GU*eUF%Az9rhrN!nB{&QTqk)>D4DB$qfR54trm_L}Vpw;J zJ`+x|eAb2Q^@`vgqvN5lg{v>!7SCaTB4^i9EA5!e0xB+*y6g9Bm$`@TQ(vjuhDU(Lo&wU-A*keeN<|n&}ayB}z+9u`1*&=-=sm1K(n67WD z_#w}3X2ZQE^W5DGIAyfdb3HYvSfI61jYW1 at O=m0{_m)h7@?WYoW!&@{#@JmlI0M72 zo}u?uWvUb9ZR=Wg{eyxGm!YOyZOU5ku7O8T=b!0epK(EBn<;oYKm(FA(kYA-Ne|1~ z#-EkHSHqUR;V^EbSL3RG+n{Tx_4ib1Pj9^p>t>6cUZW5C!Qb{&#|dYf%aE!k!Pr&( za39&4nk(45!@DcWxf~5Gch4Ei*Jh}ZQ$$AUR22eF(GePLq^tft%pRk6t;(2DyeRWf zPI?5xRf4&mB%+!IYMpQV0 at hMVSH&qepA%w~b3`$SG+Pk%XZ^$(1O?~kw&8{=RB#1x z>8`^;UEFsR!n4bQC4JkVZ$~&c?_zguwsI}eh4qd4G~bp5Ne=sng#s9IA2ra+2<6bh zbR^*lBh+!~`Uwl%8jJ)(VfZ5&bC2-J_=^BFN-F1f8pxF)j40kW$J^&-Wp9%bRFjm$ zX>)60U8*yL-Hp&c$PQ4BEuxY_`K(e)n4Tcto?kzpeLo3y1*JaNV@*uS<$pY^^uIqm{vmb#d!fVsGFOzU*=V2|A^Ypw z({?~v8EesCQ)8kvlAtwB%Y5^s=JNfq33fZ!YL?MVm;PBbd#CJo2K`vfGXq}{bR at N( zvyFXnKRwOMdi(MF{g5({tI7V6ghHQ{U_7#$IZ%s};82RueynE~@~FvhIznz_*XVojOyjikk7+}U}+MT1-Ne`nG zf$A!c%C at xq5?16uOffdrSA>WUd1+oyG}}nYj at cbJHwY?pA)cr9VY#Gh8AL64rH4~l@ z4WTWu2)5E|$&GQ(ECfVUCIC>JTYHKiqYD}g>0bj(^MzV~hgF4;GVRlRdTSX;I#Clp zsSBIu!t`8kr2!ixnx7UoU47-}GfczvS%Dq0(p%c6uJPF6YZ%*BWogo4#m#wF4G{P% z#u3Dx%;Nf$_iJqv at ZtKZ^vm<-Jm<7m_d{c1&8oDEwKDH8*OBs%t*%){kN2 at C1-!at z-Mc3bQASXa3#KWf!I$(fy^81*-JE`A%lX6PHv_6H}1zwMX*mKY&7#i5ib9tTykBK z)OforWOz2EhyETj-!&xENA*_;G_GLFT={(^J)S_TUy(71#|U%-m#BnSqxJ1lXiHsY zkMo>-K^SWvf6;^nI+!Zwz(7D`q5sw}-2V&t{_VN2Q}~lg{cm;{XmhiBY^9IHa=S2e zbL(Ny#6m-vh{C0cb|=*(8f~OjQC<}M2SmxNjo+>kSn_nbItO)!vT9DBdidt}PxE}9 zUgw_kLGCr9goA1HpUD6uf|0MDMEXeF1TK6 at 1I)BZFVtgrV|*dL1>dZI%lI>`_~A(h zdF}<32&+uXY6dd;C?2a7mDseQ?D>S at _Gca_lSF%LRcR+e zgmdQA?7|8E!Xp!Vb(Q_im6CVK&Q;PIZne2a?6ZDv7NzEy6lr7$efNH<8x77iEe%{I z8nNr%l=^zhWw at H&>b71t$sxD?ct(ZlsjEtK?>4VO^;Vx9iR*@?{0TNad&1 zSB(anZ1|g~or28Z%&MnfqA*4pr&P|xiPOw0aAqMA4 z;11w=NsnOihSapDjN`aQ9pjEXBh0~!cNB4d573f@$tm{{{XifNSFm6j+h8hn$yA0< z at s8)9W)hq~0Vh)_&ol}*h(r$v>{lyOU~*g{Neso!7mZc$BAZxb$|nXxlwhWe^BLfyLTi0 zU{r)a!0`YbOPUi at j6(@aHcG{WNan5C*6oXoOqcwzj#V%!`yKeN!q`)H{2CLZ*pAxX z)4Z`;kJ--hnUA;k7u>H1XLtB+;*^rqjCld1x0Xd&_BhZR%2=FDdx(Zx|?M+m_eOQq`C at mA3=5w-D5eS zO4-9z#459tzSp`+etQK%@pH(YOr&d at eYJ^ywtqsxfMkIhbGgyBY8FdoSmOWT>>Y!1?Y3>v%xK28?abJ=ZQHhOXU4Yq#^xK_wmp-~nD<-zo_*`=Rrl6i zb*e@^Kc3&MkJd-4-daz)aWd&`_bo2$G`s)Eq7Y%Lp191_Ycz%6H3AW-d|to6NOUS^ zxaFF5zz!e3`2jaO>qw*dM7dmdX8x#afwA3q;jUHOZN*DA!#FBpI>ba&jL7thFSQ|> z?S~gO^j3*c-&qYM3!c5+2)eGBW+xRKaES|-$S_3c{I`T)kWq!mDHh7Md;~G)v;yl_ z9s1HVm;1&1Sy`Xqf)`K&_06!xV~-`HqLC&UrkRtWuGq!R at vp3h&EYR_NGPMal(214l_KB> z$ZreboNK{UdBSLXLpH7ujv=nBB?R|B5BAsNy~hNQ%&ESFkL;|Upa!9pQo5i?&oIUH z8h?vtNUSJ4fm1+xPg&p!v~H8=kOrCh=1O;6x7aMx(&xM(H1yQ1$cHH`quV33J9>N( z;(bqhI+9Otj2(J$Xr6}1vhwos{wlSk%b=Y;_(h!KDB7I|-lM+-%;}P6isEe1Q1`}EW06HzKxXx!TiIY75iB!k2C{BbMR`^h3(u{2 z-c2LP)r4kLxoe;B%A5Ea2dqK;RY#Yj=842LCfTh0T)RmZNS_TRA$R&19-V(V|55?s z2yFb8&Iv|6JFPxd_M4sKYRW#XVuP$+n=0e0({hW>A_@&w!vMJY2|#{6=6#zzuj1=U+dZ3s!5EM6T7gndMc%75+kiEkfc0$!I%+Emx{*Z!M)* zT6eT5GWl=?BORF%m4Bh z*@GhvpH-QffGFbyrhGG<<0&NuuVXPKi=2Q08A4}?n0zyh`?~t&X8_5hPhd(!yrPyR ze8My733s8UP|&=kTYL4IL$tcZMHG@<@-`$`{6;Caym+6m{}akRW{JPqAwfXc5&t7Q z-v0-b{}+%oY&1|UkowQ&tr{!V zvU_&_X!v}uAU=xljTSYZK0M_3Um~8*TJkh?X`wVOljQu}G2gK`$;|Y?`1*KH-vx2q zdq>K0q>%)kBem|!BGG%O6CQ;0wjO=nXRG$W1AGz_|8vCN5N4C`WHR~Su^PKFFv z!qWL^lVFO|-`5!4mku+|9D>^DnbNa`lIz0kWAjb|T~KCax`~h&EgpO??V~UutPw7; zRVJ-eA{x!@&nr5K3gFC}wC#zCPyTA_7m#MMpP(*=Gv&^sH0N+MvYIh#Z^$P4_qx#w zb7-B-H+8O40vH-^HtkG6zkZlVqpl?`HErA;e3YcgR3>9{ucxpsSewgEpLcs8d`?Bg zB3Q{3XHm~}=x5hH$vJoTq6JtL8XoR>Gx;csY*#ki^txkqNmD{BvpSnnETrYA%~nT= zsmzi==DI9Y{^hT0R)l!+j`WG1$%rY{2FUk;4k-C?S7*g=9W*R2GFLa13Dg^qltxQ# z5 at E|(u(DZPQ<1A#k=j&wr-Alx8H<=MUAY>YI;R=WZM!QAV&xPtBb!l_Pvf3Kb6PUI zv0w*?@=R4aTm)Wn56|}<`cnap>__gw9TxyY9+wX{B$ za!ZYQC!w=D6gnXP0To;Ot+#U{9P#Mvhw1Tmju`Oygh_=fMtqe&mCeOww_roPWMa9b zIaSJb9~Kkg(9+Z!tiDxVfX(B%T)Ah~O>$Qi>`r#}y1RbqaBT=!MdJ`B>P>7f+LPIN zC{j6~g)lh8jdDOIb4rOY3i|XA50;*0DL~nUCR>S;dUWkVTljgTdq+PR1}`SnqGRAT z9 at Ib9Iaxnf)bmEVs at Fc3Cz)_z&ZOg5y at db%S5?oM2(VaP=*8Ex;#^O;+?~dmwm9~c zGLsvMQ<9W7zu*E4=jtBwE19X at SFENh7v?h&pGLI7l&ij07Pz;lmD3wq%%_=#e;Y{} zv5(+mtj$#C4TeR7=Bv%hdhVi21h{qbp&C>H;jN5_Mb at UjbH_{aIJoe%u7j7Mycm#T zJSiI5QPEPmWOh`LM_P5#5kKjdL<6jq%Bw5)*@dbZeYe;up07)`jW%8_5yVUcfS5f& z(KgN1{hzFml0TgVNSf6>$pKM7w>#!laf}sA4JjMeWZd3yxvD^05sYtCLG_h!zW`UG!K_Bt-yCxHhkc{J_J!a}zr9&0Kv^vg7Fap9wHl8Wr z7 at 4C@U)FwDSL?P$Uq;&O-7F|Lr?ExCxR2yW(iSWSs&3Y$+iCl&uef!R(5B$N!X$2* z|80nEqwV6=H73CoSmMLs##Zz$fxJznhJ1uJzZ`kP75&ZHI*C108gIlElad3>$Qgys zbQ9 at kg}lSEfJgmx2c7OYLA)bKd95Dku9fyNGfn(#zST260C;>({Ib?eS|Q!*CU7DU z;p~hJ&u+KC*3lqr)oXe!vOxOf18LNzdB*bxZIZfN8U1HUbc+-HMOcxss%|F?U!e(k zt*{ex!<7?9m%>uu+pbf at 2v)A+FnBu~^q-woW1IF?P**lWLsfJ-=TP@!1uHMLN~&yRoOqqDp7JTfp4kbJ2BD7fg~ z`RKnTajk!);D5D}?F?}$T1sipfc{tjx5lwY8C1Fn6|qK#9*RLtGjzP3a7uie3D`#` zt8$k7=kh2Lv9ka&eI$CwDssSf)nCC+8WknihbQ`$wH;p&`ZY~ z9$J5poILwh>pTCn0ehHQ=)t?VAf;$5`74`#^On1AuYCmR*$o?`DEgQ`ZP3E6_FlTB zS(!oYtgxK~uBiLUIFrCp_)S at jI=l5;4NLyC$X=$Utf{IEuiOkecT8<`1y@|>4DlSv zeDPM)s&@uS$2kwi3u6)EnWq|lzYYsNhK$EXei3jHZX?}G8|yVICp~w7v at 18-D7u(j zxVb)nhN{?N@~n&{rw8bn7I2P?+n=-ifIFuedu$&ijP)<0rD-) zsO{lr9A?VBvR`BkbCsyb$MdqVo;$a_${a;14>df7DHOa9Al*a?2nT~xcL+5K56|Hw z1C*DQxP}2it at dPZT6rO)BCE=%^MGFPlkoFlml=)0Kdc+*a)M#tu|YB}xtJJG6~keC8odCmN-%(1R2&(_4wBLQ+&YZZ zxRG=6s2o9XJr-_#4T7vAP^Y4+~a@{FYN3f$D1NUJG8HQthqiKkdc0^w at 2@Ux> zniZ*%8ptfE~^PaB1Yl-F2 z0O|cyErS}ervf1Y6HRht1P+2;A)5Pkk at BgXx*|E{zNY8>tub`+UYs`;`8(8|A{hi{OELA~HAk{?WnS4mnIwL^td`(&3T6)8tH~m{t|9yd at E12%c!VeG-bnySkXfI{w=aHTs&FUmL&fE7c)ld25kQ57 at V=ym~h5x2t|+PFsQ=qF at C$=y$(N!!>T zaQPBcnrkI_77-noxw}_Nk+|U*P_acSr7aiK0;l#GGP~E8$(7^oV{RNIA0LOW*KbCp zI~7-0_=v+|a+Z+K0elargmlv at svP%2y{tN889DGOVQ8N?-o4RgYy2p0qAhr6imr*G zBSILo53>@;b0ah&cT#f9wtRh{R!;1id~{S{u}kDG=4oHk!_0b6F*lIeIjryGHnBT& zBj;P3rq{{4F)6EkA*lg|S6SWQ`g0s&TmS|pp;i-H?Q|eo+-u<&>l8~!x+wFMUKW$f z_&xkun?!r{&-Nq2_9GCEO`8YwmYuefhB;h=L-;t128`bnHbHCD-63|R;}-%LuP*9u znEw+gWUp(>%m3QH`hSj;|0lge?_X|3K9RQV*1G#rsK`idz)~o>@k3!~C~G1TECZ`w zzCESc*p+M(q1=bm2&Nnv8UG8|htd$wc9tSpMXu>{9*@hP4v(3skM6fGuzvO`@*{wD zc!ZCDYYKvJ^XHUEE at A+p*9$UPn$eStr zC5wynKRx)NZ_+#XdnMM}hqxMzh8f*&}r8 z9SxaYYj;Qqk>k!ci_vqXJUyw(OTu z;Yn<*{=BxI=IrwIxwP#DJo$rS4d(=V$3h?vnuX~f3U`tmR)G>yggWbulmvrNgz_jw zklBy5Qy*f81md=~^o-eshd-2cmX5%-mW_ at l8bbZD#tpZ|r2BQq9^xQ=Wd=2k3)!aJ znKk>D7YN|^rB$}0=F%gt=xjyY(43P|#1Qh0%%E<|g(Q`Y_nlUSDS9HADPVTNJ-e1= zH5dO>6C#{X1&16vtYh)3d1$UQm8a{VaYAOqoUf$1X#n&OVB9t?te9qmz zPxBu9bxWN&XF^lAX090X+mm;Gr z{p4vJJ$=2>pK^F$vszHh7(tbA$eV+R?@d%La}(DB6*KZ6c5{Ry3_S5e5kn{=jwNgS ztmz*rFws_3s9H-Nt$3!O5`~dmBuFQz5jf!5-6CUX^^^Jt-F6tw-$BRPZ?beD-7)W3 zNhVi<+)-3P$jX>3b%j3PmI`FLzwK(Z)kM_65=s4*g`l7K4^@WBR#3Ms at dVL!Sj z^cLE4y(PGt_Twxfr4EbR at mb^)g90u8^OShB5Sdax)q^6JR{Mnd(Z?1~!%#gehzSOF z3FvS#L)H=h{x)HYr}`V=jmp6L=z?wvDu+3mKKc+8x58#s!KhBfP=*8HbIM9|FtviQ zcSTT8>BNGuRK*?SlxOf`Frimhs+3mJ0#Q9Grlhm*l=ggjr+Osv36CWvUtUHKA2YB5 zRk%RqDw5PjM58sWLo8}DtkRbCsNZvvO)E#30mCY1NuZ&%FVJY||7I|ES)nE{2L%Cf zg7^W20$fTWFv&o<1Lc1zx_YJ5?QPZM+F2UxK%O!ZJR^-THQikU zojN|Mmj`<6y87fphteh2b-#1&MN95)^d{3R`&pa6S>yzPB(1tAYOdfDbswfV1CE&0?Kji||q*W=+O^4<3mn zvvem=(@7d4!8?LwiXWirFX2O{LNoAh@=6E`?-`T^=={u@{UqyKP>tYDuvX_oWSqN; z32^V#eSKvp#y`f8>IY2D4fI9ie!9-g+S@#4Ci4vzMS8nFk33yIv)tbw z?_Xen)t<(ND7)C4;n`eU!dwwB_BNV~jNyOa=?)Mg(qHbt1a6$IQY{2ZlX7?(=AZNZmHoXmj0VUTw at L3&%{in`Fza-q-^YLNaeN z at sWzl+;M5p5-01bKgdVnK*jE4+$L?(TX`KOmB_PN`O+armDDvm9d5vz=6%e9&V}A? zW_pFKSVhfh)%9)CFriZIvw1*AVO$>V{&r|xgth`xQ^wh^=vU!*_?;98W}cBcx3T(OJRi-P4z(q0=p|1qgo+Z;ESb5qvcc4AGb_tPp?ziTe^|%XA!=Mf_Zq%(> zTI9NDT%vAY`XiKG7kaIIW}$QAC}QG)KIb|U%C4NPr{ZKWh#X9E3=|YJVmpK9rc{)f zJmy>zC16$R)@|XK8?uq~4|f-!)426&P{XOLa09X|&Gh!b7?gCy#20k2C at z29k??Q{l!OLi#?)qy zC|W8hU0_PMTo5ejxJokWGd&~Ip1^&WvxtDV*<8;&dL|YW6dEk)&ad8;QvvW*On2o^D|o=8(K5rUyjC_8VYr5)IsW%<1DV z)I3?uz*)_RW;LwP4UetdsaM^p$4bgzdU{3nY>cvpuZd4#_{t<@t{a(~h*E5~WxOV; z=M^!HPQCJBRT7_hV{+rC4lCwOAIeM+?z!-N924xs- at P7u;2!DkS<;cJXwG)a5=zQB zUp|b^J<8#&=I at 1m>Ezq?Qf3n-O+TBSj}qTJnA6e5{Qbjt$HDIvLmJUm`u5T|n*I{~ zH81fIvX!ZSbD7uHTe#km=k^Ew>7=4RC;41(?wNuzoMDzcpD&0V{80GWV451|~ZeoWc za@?4V>EMINB%i at Egsqg^PV1y^gWq=Y$!Pubv%>6DSV9!{XXuVgzRS$t92akfzVDA0 z=z`c)9A!pkMI(6;A)#R)9C3nbimE0}E4K1}CH_&H8ZSlHcy2Eg)`Q~DrTzgbm4%r2wyv*8}lf_3*ES4qYnRu5iJ(lWr`xC at iG@Gyrc6vy6w|m z<^_Jo87i~h$L at x;!(q}7oTkwjk})IM>S$6`%Rc9#`#Hg0I4OxN^PnfsMgB4m_pLcg z{4+LSPhFrHA3KL|58Wk_d+S&-ouFn*?bk5gI}lo-KYQlZ9=QVRZb4 z0}y}KE#*mqoHRcMIY%Ux>eHG+&LXc42loq-EqsBfxrL9K4avZLkX3?P;6E8(DUE}} z07%-{!)XO~N3gmZC*}OHqU2gW at F2tH*CT=Z8QNhaDN0q_)h_Y1mEmA at q(iX_vkqNj zzMHtFz0|L?6sS)16?~7bl79RF>%1W;5A>^%a0bdZOUg%?5)cV!asaplS=Ndq71N~} zCo|L+N*F(=s1Dqv-~UamM2b{{yZr~M_wfG_DgE!h<`#7u6;ul}e|^bDnZ~6eL0J6@ z2=ri_7Hv93y3ztDQSjI{`AzZ~Q at 1AE_!z*Y!NhrJ|6pQn&uv(DtU zMKr!3L|cgi%~t)lixO^)nooisrRw*pW${CHS=u$zl5V^K2LeT{tL;J~1w6g at X0zFX zF_!j1JbY!QZnDiPv7*6+A2$mjv3g$2OhZt7gQx^%N0n?fc2L$y+5qZ>6Pwn zsDk1KKD`7)aF&%txz)AXYUhG!79JB<)m%2X^`{EbQD5oUrw~i}tZ7Y6t=!ctAk99r zM at 5Prh`ZAEf`M5=3Rqz9L?%@Gm1Pe!+=)){*@`iIhLdisMMiv1BB at o13yCD#ZLGJW z7FIr8!)qVV=wq3%p#4DI7nuojZdKcMb#}i$;GkK{@mF`T?lBNtaOpXZ<-6{7`I4G6 zWvkk1A at y2ZS=1JuJy(qYTC2<1i2AizX}1FDsOdeJGomXYjOg+>;C|^!GiI=|rb=5@ zxD at yiUqTaVX&@Kf+~wq|CA%Xt|6w02R_D)NdULf;pt%X6w=FZIU!h)$rAPTi<%x(% zuB&YMVq4BnR~?bn3LUuJ&9Dy!k$zVgjK3yzVz!bInt&vHw<{ueToX!aytC~wdzeI57iM~Wl* zvE at m;&U$mdVAF2kEi_l%NwcQG&V%+!Knj-xsjvqMZJoY$jd6uP_nftR-Kkl9(VfC>4F6Uy&eOoWIg+ zjO!OcF9yj^q%uF=-rcadD&dK1D_GPW+f%I08&3tFrcG8?l(LC7sy4e}$Pk*WlP=A` zO&9&rkM88_55(Kj at jCs1*vbx$zvog>U(l2_{c*GBALO_ja367bBKE_$x)Ai&Pvp)p zWrRB6-}Qysz417&kQ+zYYoxn_Mz5_vABpSLwRe%(p_M%PCU^oM6O8b^lfxBOw%!|#!$`{B$^5!r3>vazrac&0~s zrbm3H$Im|ImOlb4E%k6^XDX+U3i%u`gTIQk>5IFk6Jh)T zbc>XJWj&eBf$HYOgZw(DfGXplMeI?lo@#X>TID6vXb-u%ccV9{obw-)E0RXMH?-5= zGL_bg&|&qi<9rIgdozIZ^6T#jkW(V9eWhM$KVWIn?3-|DK*THC;G1 z^{?a?xc{in`Jc0QacVX$sAg#XJEqBg*|yZp&83pm=`eQEm14s?RB74;51<>$Xb!d< zHeIaS at Z)8Q-TQiXm=Bn at r3N`pf!r5?+`w4w5Cj9)rMnnz{m}rTyr%3jDb!qdiuXLf z*=w&Ev-ej4LSMK7{6FG~2@<4h!J|c3Ku!Vqs*FgIP?e8+P8kJJM;wLwOO+4Ltm}NE z^L45j!30B;@Mz9aW;I^SVQ*P6Cioaai*;>_Z8+KyQc1(KPh0<~3dt%?N~D_x+sSKm zD0VglD5_8SEwl=(R$CWV79Ojzk;ifHZB+!G at VtyU6^uR$26T at NY1pwJn{v|$nRS8e zmYe2P0)^#^6joUg at D{Ch6Ha9)=D1N!@p2L*MmYAHk$JKlzkJ+bm(a{J6nGt$X zw&Ezoy^-EhgV)X at l}E;QVWtN1+TJmy-woZEVZ!Uo7ZhSMp;N=xu2mPp!-J}kgIY at h zmlFqa!v8v|>CQ1G#NgyfbcNeLShgpWV%`=-r?cV-c15SN=?>yOwyM&zJscGD->|u> z0BJqdhHY^4PfZ;dvrITE4&>k+_U+*RIF3xBImS&&XDc=4fgVGASQV7ZdPJt1nW(r_ zxclk2Us$o&WS^Mvr_WoBxu-+vdw&*B8bBdBWrQyts=kol z|7`Bw6E3(Dn9GsOL}Rsg!i7pUm(3oTsyK`{_xvhN-B#Cb2`2N>(be*msphLKmzai4 z(QN1`7G+E0k$9o{Yre at FpsJv-xJf;kOVFN3mWxgJmp_F~F64E+$$g7}kKlWEj~8Qt z{mnrQ at r$;Y&<+y3_4krQc>xPr7vvoQw2*DNMFzw1`0_w+61XVI& zEz_ at BH})I+d-!>;l4A;C*fX1spt-R;@=yqIF11UPC6LY(?yz5_{cb7r1$FWrVUJpF zWPuPB6X;X}!+S9E)1v72kg8s&Ss&nP_bRMovy4OzUPOci%{bf*2_+y^XTC`9<848L z0-{NS1&wH$7X>`~zt_dpdo3uv-k$WheDaC>x}`ZtwYOp!Ry3QzI*Rnlx`nuLP3ScW z=?iwMv+ at gc`x$moRv;1$eoK!~IfzWuEB@*mLGT)#obsJe%B=+#n{Ke5GSL&^-mPM> zI6f>=__fVg$3TsuhL7Knc3IIL^tcKzauPka(-Ka-&1w&g3*KmnDz)x}SsuL*)=+Y( ze4g0Ozrf at hQ8L!onj3bg2-!tB`J+hOCn5V4_<1jZ=)-Vs(ySND5~_VM0&LcUp|Rvc zDBLw!36@~oGrAdLx-96$8#g(*%yRB5?pVelJ6~fKX~>mNy@^8)Z;2rtazITm-?l_v zT)|UGs2JH2S*opbw9(_-ET8_7)9L)|UKhZ+^sIOp9o-NkKzeUMGs2)6YoJ6M0OWt= z={zRnB>NtMe#IO)+SNCTN0}1QJY{2(ovmF*VVmnRDAI;AiS*YkiqegW{pWO}43F(3 ztVqrK<U2$LX%es+qx>mnz{s&!D!i;tqoNq2aUAB+bR{e>txIn=0#W-)VY`4+2tX z1p-3$|4R%1HyiZmLi?&NFAJQSd$BMifTOgA;)6mbhmIL5q6{Dfi%SYZ8L1dCdr5`M znh#Eeie2`qSGTs*9&B_LVxV(C9Yoi*uC%r{x3s!9v{Y}~JS+6N{PFpF(!=4<8hHQC z^ry#XmhUuRhVOL8UbeeFBv`+DLJ4nA0uqgwzLZ7;_VZy4v3mzDzex5CULPHpzwia< z`UCa^%y_ZChXcOo4+C!dAYKGM1it?M4jrus4H{AmSBsURi&$&a#hx+uLYYi2%hni^%ciZNVFzoEt47Hs8}T at B>4igO6E`^P^Q(jlu}{L&R3~bY zXHWm(wWq1xLsv7^QKxUfk>@TCTy9K$nbmbBU{^5zyACSv*f at 2uCY+f&DDQ^4O at d8e z`uNc>ActPwv1Xh}Z&WT*qhu^Yz7o1;jUW!}TCGw7FD1uP14eK<@l*vXnQ$0$4 at 0I09KH^#vVw}CIk^uEnM z*KidwpTR&&7p*B26rSYUHJeDTK~9l3<^T_l0k}8SMlnHS`Xy1#No^rx)JWv$l~#^c zdK=v)+exiz?TxHe$tyZ=4&*%a`=4AZ>$HA_UmJOf6_f=l3w8linw#fw6)iYI9YWd) z_=|gpZ^bdl&NLPtL`UplovJ7eNmZMW?>x(nJQ_a=Jmj18ebSLhe|7^9kNLGtAJ;p9dKK z7Du~<^s&}(vnREG#78iT$!%wAuCH+TQ(+*hJ9$vF`d-{K-33{Zy3w){z#oOJvwjdO zrbO>5$>(a0k(kq-#n|Dy^P_&2a9fU at Oxsvr-^#k5m=id0ehNv~IG;qYa)2id~Xf zb&F1}u)u*))~Plwpo#9{C3Zp^7QbbiQ5Kfm#432WxS6k}3PGs~6LnrX$pK>p?Sk+& zyrazwMA#y^CM5PprWd5gr`dahbNLePEC+A*GJ#1!n at d$L2zfFL@;Z<`#JPd;{;k}NI|8?gjo$5lvl1l6TSRoAUnMP>QPK1HY>AP zHatkjq~s@(_SH?=o*#7+z!PH}TVklcRr$JXicg?M91_e`B|A7oWXhTpu-$q%6gr&8a75y!|8m)Ha|j`nGDT=Y?FN;T`Dv*e6A`u zk%ZU);!I=Tiwu+&S~8%I_GC~%mD!iOdZQlq?=WJXm!iudtmk~!73@;WztCG%Q-WE- zvvJ?G4+*I(N!pSh&$qH+4rYno%f17)Mrwq{_OTHBYG!gf*uqgEQ6HrG$lFD-pXi%< zlGBGQz9g at e*)GT_NZ+QnkiBU+N}=me*%$mW!mc^U?@|xx`SlTT@8=Eqsm&G)64*LSa5G` zhzpL}r8mNB#`YS>Vw~Y}mFNriJDf-s9)3 at BHYAR#=jThQNc)ZhWpctiW z1mw7`Qh zo4Lm2)y1_*GybI3G$+L9GS6{QM~dH|J+z&%=()N44P(oHZ2sO z&^MT0;fYIvCO`3- at 4lHfr_)cU>#h{cyH>+-W>&%V)|K!erNvE_y^i(Bq6t-()aP^KE^8Bk+WW-x)Tf zy)&*GKxFN|%Fi+Ve&qaq>2<32^c3GAoNys)UeqDVuaL+vqwX!M9y^dbqsOsY>8Kx$ z`qDuew~Bl%~@_FD(lggDhCTO at K>xrHQk<`|c3ZB7}U4Xud;fQip)V`;B(-=P4v zO9mU%{XzFf5q+1^Vu#37o;MJB4S?5bFQ45MeL~)_uD{7Q*1F2WKThB>HZ1$*TLjrE z;>3IlHQhhb-N*_yVij`uq%gFkW%{n3OZWoLL!3<>CGw1Bz1_5hMeCznx?Patm(d!M` zMHdH15O^txY}4Tjaj?m`^1UB4Y8v(CH*Ty{#5=IQ7cZLb^1TS`Rj}Z}nctfiW3U^u zY<|elSJCQ^T!aaF z*_|SZNw|=5x(Mcfz7);}(ugdP$ETj7ww>KVeou*UUaFv}zl-pwCi9u5=CejwBEAv} zNkc2tb1Y0MblV&cL;rl!et~w1h~Gn(W-YM`u#U4J51E>i$!&$VFb(2Uxemn|$jE&{L;lyFZo%1$jK-E9HPx1t~Qwj{VZ zQ^8mdMn$V_$Qx~C@&jgbmm zHKyGVI$oTUdirW1>t!5PiYs5QAN?x@)S&?uJttNL%@ck{bxo{B#2AzI3MDB5)saM4 z59fzeZ;jGg=@s*@L+2>HLICZ$8jSp?7utmra8zICJ_{SAOM3v~3Ma}>+i10MT6g;r z?FrkxXUJZ0E$*rbg zld??u5zThg4aG;$2+_J&BN8!^IEt at iPw%Q4W^>3Lhp(_7Opr~X zu^i1k5Whr%U9 at A?3WcWxP`+*?&7eYSiVdTF4lOQ5ksWrRw=>0>(jb at V>bl{PcAmR@ zhdbq}m;0h+%FPtND^zB4^g><|LXF>Nm9oatOd~^0{F=!W%7q=fS$p?zjs^Ap z{;Bkhz^1&366-u`X}1M1d#rk#wrQ==?k)BEtkRS&kP{rJ*Z^vEaA`>#PPk2PSOleH zr%)PrC><;vuOha at -ac0K_KrBt8VZ!cc0W?=a5EK_3RmXeW6WoNlKScd1YYDqIx9?zt_GX-{Zz^;Qdbdql)s&1FKI z%VC$AzM&%0WUe<>eYBS^F?~XPWNt zdFzr1B&Sy~;^Lb!&%~w~k-zk!p6o`jno!DSPpgyR2&A6I*?nata(R^N7KS?Xq$eud zf;XggOpRd2;08D4s-l<5bF6RtvrNj$Py-V%33 at ex*X)WFn z%ANuIv^;t1kD^wm9vGk@^dun1?53Gbx(%@$rYhHqjQX~(9jAWOsvb>n?HFQy-=Bw` zWsb}Ec#!dHCREF^|2lneHY~;=9XN3DhK3Bs_>uXz4*&SE1!-tr|0!r7cL+3daz3UI8hnAMV;bpI}S3YrZ zYzYWlqWq>2TBs46s1YdKAnTe{l1|;^F^)jFiNnfq2bVju)(^^ArXPJPL;dixKv-A5 zd1dDz#ba{sFC1UK`3x9rm(cADj>}qoj9Psu at DfMCFn2+pCXfes?=On(s;0a`Fd9xc zF>uSHA6RCi56wHbI!m`~FYZMY!%KjnoeT7yWe?HnKNQx=Q*79Ft4BZC<>DzU?>h^} zaf2VTmv*8av3M?bbu{}RcAFafVS60_Uq8C#G@>G=5yg&qZb|jR&^vRAfQ;_N7EmKS zAcu&;m3kWy6joxlCZ4M#ap at mJiBBrTdlpgbIFsnqO${SC%{`wkA&))}AFwZG#^rJa z^4XS`tf~*{e^jas2I?QxWzHwKPJJAqDAwmyv*(V04ts4FtldW*kXgH^yNG*;+`I3Q z3cvIyz4SxJeGE%ZAu_hK_1M5wHmsj~&bZy6%7%yIN);h>rF#~@VSa at e+lJ3qz#9-4 zm&_I1NjPIc4nKS=+*<5Od{GVSU?t1N3YQ)Cok?q3xA?Q at T~z*!PUGMuGdbxZ3+7*UN7uTDIg z68BW;oYOlIg~-(=Kg`*;(Nt3>BKm=mj#5^?`s$4Vl9j*csniez9|@>_P1B~zz#<6A zA=K=`9y(u?EcogxSHTVBXx>rL)G^KDclpLP{}fL>Aqdt+5XKd|)HTs%BO|Y84ScdxWT&rastwh!DoSy-_kL6PL{4aMg|{4TvSWlf}bqt z at rU*MPXT=sElml6P_{clCEyZOgP`@8WY6M_ikR_HC&;8koQDMeIm$>P!i6QIg*^Ds z+vk#i$V8~V!QY(Hu;g at Q)l<6{=lf1PMq~*QjX*{Z6YMY`uXC#x+e2T9ukDUdh6Cd8 zWSASKWo at WE(T!r8S|$J%)q`tL{o|L$8Vv?|FhMF7-}d=~FsYEjnTy+liKptGCLfKj zw`%un#PFlqN5n_K4`p>nXWF28n?r#ZXBn4jgaKj518Rkjiw0+DowPm*@?pV>EO5;P;M>qhlX`Ph}WL7I>c&&b$jY`5RWE3 at 8HRRi7h|xI7a{98iaU& z%ATEj6*7CevY at 5WBJ}Bn(c;f*?={;{dp_H&J!4Ya9ZCy68r^+AK3nlcz$m34Wa%wV z$EebRDNMKQjZ;czt9aPzS{gQH)3#qX5VmqH9pH-fNCz z^|+GpLy3FsSSWaeBElZrD4mPH4J(n^%~}DOfvBiJ^9HDF@*_hTD%-SMfR;0od|Mbi z51-W<9^2qa1v0xt9DpkeiTyARfb9 at E?MZ4Y9S6t+|Mj(?H>)B}mWO}H?PfgZKV*G0E%%Bumlf7l+) zx!ih5Q(hnbKtB00*tdp)PL_zV0x(jLWv8fy63tblE20`hc}~ER9xmPV>{#;Gb&DlG;jE6$nG;Iss4X)_D*4%220v**|w|8wr$(CyKHwCzp`!Hwr$(C&Hj7M{%5XP zGqd;F*BriYo at U(fWMpJK(p2Hc32wT9T!kkRAZK`b3LIg&ez2~5 at Lu5*Sp*79rxv)6 zB`96R7sT^r1h_7L^6O+yRb|dAAMyMev?~z%V5%3u+O at _)mY18$aS*K*i>aRUlf!1Wl`w*tm+mNs5%$+&F5e zTUM?Ua4S|ASt^2A4Vm9FF^b_Q!z^{dP;KlPr{h`^Ax2B$h()>;SKS|gF?Tawxfdd> z)s4#z)sSmV{55unU0TpynD-th)aGzSoW4iJ`CodgfC`ryE|%_fzKj~^WxSv!H&p?) z8aGF_Y}+tB{rchCrKZ6y{FSrK4VPw8XN>fVj4#Vkkro8PFLqooE26x$U8;1UR(#wl_S4Opm-LtyZ4H{Ga&JmOeW0ZG z8gGU~JOF{O>$Z-XFVbhTtLe5&?7eyKXlEKDxjlyLbOn>EEs4M*u_61uoA$&H_zMHPJ=}L9=&!m5o6gYv3v|9-um*-oy$R; zo3$2P*)R;T2Y34zNbHk(q8eI?_$OVZ_u6>TrqKx-NS%zSdPHCXTz~-h2U3z at ZBKwLbw_xK(ESgEGFbYdcM7p3!($e zXi$LEu%0Vxf!Y_7XAQ(Fw5Gx_kvX?fP52c0=|LJh)K<@=ID6KON#Q3b9ZphGy*z1o zV>F;VOHK>pO{P9$8+0PbHiWmmp~TS5K`%9nc~6_dP~ajFP#yM+GhY~3)n{O z>}16klya|d`ZXr!3kjDXh*i}LrnNojFA;58`H`>0&YY4pelqV6twr`YxtoJ_(A&93 zkMG&UGiM4cPUN=PCET6J#t)ws(7h+O5Ar~kQr$Id76vFl_9%WWP`xhz at Lh7yUQDQ7 z%sUxwAT@)P$O?pq8;`t16XkP{>auY6R1x69w1B at SX?Q0fZ<<}vdo4!H0?ud~TcU at KM z&n8W;d_XBz6JempQe6?kD`FL1DX=hlc9f1|i~~hjS;`%4W)zT($ zY{52D4exmU%sQ7h4vns_x!WwRARIV>p}7)Tt&mD*EJ9fxglM=Pgv9XO($j at gU@xKI z*u6e6feM~VSMcOZCxY3jGgG1^xBS*KDA5TvcR169^|Oeu&F0mRa5ObSA0|k zAEuEWTNO$fcaC*^)Q*p*OlayuLJCGMS-oh9`Oc+cAm&Y^FuW!Sy9r{jYV0PSIM~Mz z9Bl7gA$M66dY5ASkE)^`@eX$j0+xPFj6X4TJAL7ycS=+|;O=?7+El~xE39OkzJs^_ zimNurznF4~ntj5+De*pS4-vMFt!|lDE4r|4W40-}xKjO1pm&pdk>%1wvjdOs^2I!t zC8q%+)tXWLGV98ucT;rX>r(Us`KI(`{z<4Aj37X{)KCA_z8hDf7F|wKYR zXBT_hfB*jXck(*_7#VhGWHqO;nfx!To*G29a at ZtN=h at qAyBBj;4J%!*N{_X z at v2?B;VOMhEq&Qmrpl6DgX2?tfVDNj>~xFqXY%nIf<>!OrZ2rpXNj#<`3-h)dW&4b zMYfSn+mw at ATsNEuy*u0#t at 8-k+f+X~gj-ggfW1z2iI%<=i|=;S>41aNRts;zH0*Nn z9u9f}gI4mDRe#w;uG?|g?2#4R8z7EOl=-#&7^@{$2|1piW(Rm13seW{RzgMoo&CDQMu7|+)sSAF*?Zc zrdkLX{?K=&;eu?ZFt-UJP`Q@&`cQ7lmFtYb#cz3lwW1?qGtG?x&6W0+t(5@|5avdW zh|}TX^aq%tr7a%*oc4SkK*~DuI8;(rvUxASqoisn>E3#L$455MP_`Dm5o)xLq(&d! zX1~G2+pXRvVGKBDYxz{R%#y->0JNN;muD=rcQ+5 zj^<{K>ood^o=$C~$V_q9)Fefw$r`)(z zy05%RB{}?+P6W_eO#u(C{QU zW$a;oa9cAA3PUoD2CX%78y{mmJX^#kAR+|xCq>_s%kDuY0{P~r?@CD_A zGBV;~76=O-z}g}C3H%vm8RX+(Kdf(I+FC<3NceX|(It at xx#VKHYk~G;sfteAW_w1g zLG}s9TMplN&i!u6`UMn~e%q8u=a10|ZR(Ruq9(E`<-u#OiJ^iod?e`EeLr#u69GXno|DiP*i4ww2boRYP2cKK&kWvQ<@ z;fkU0*-8=6#&8VD?5{=(%f^zKfTPq)rDAa*gq!iKM)xBWDCwkmuok2b5veK-;r4*4 z874zg^VXp$&??yc7IySDuUvwy(_7&4{dndpxoKOd%K82})&ZI^p$Qk-3^fL>ksN(8 z1d8Z_+A9t!qO{vnn>#Ep?ZzKshRN58tEHy3&Tk_z((8u^Y%D5`w&FA9)KQ%J*>0SU zo>g+z^b_YS-uU4Wpi^;%)4~kLhpRoLh_|v2w-S9nQw)Qch);IKot{l^*_^ONYkqu| zV>El5Tzo2Kx0Y_TImN(Sy8-9RwNQ&cYQ!xiQo2U6fz at +zSZ2b(=$$)V*3`LhsV$MbSE7wg{+iK+Z at OEM`fRRQ74ly8aeQ0Yp>Blt`|ypnAx4c!^9Ab! zRk$OA<975Gyi>vAbe6`&WAP7xO7FOA^;sVMWFyrQc?-Ee9f$U!N(+UJi*14Ha4s0l z1M#2v8(BkYk_cwK04%`XQ?eh$Y%67L(*O}hHN?7&=WT3qga^~m?N7lYwwib{8|FyZ z8?LF$i$`*c^Koyy;&raWD0P?;#IzKLls#1%^#$I6v1D0R6p2KcwWEvg%xbKpA0EZ6 zF}B~a$yc`!8O3M#=NYbv)-&e_5BTwSyFeDYOx z)8tX{1<~b?xH4DWoj!MK{8y9Tl7%z6S3awPQ34)Df1R4fB%`_Nuu#(w%Zbp5T at ZSg zAbdiN3iRsOzgM=~UVHRSe<8Xemu$Gj($~@Z(3VHiH=u4?VjW=hQFcXn9we|rcnz6J z%mhVAg~B?(SXeU4+Y>4g=KrEhdq<(=`ao|dAbAAu&xvCSYFK>sM%Y>CCxm*C;FT+A z?SVRR*zS-Gxur!3`mqg`LqFN*L3W{E*1p2%`BrIxj4_0-IGzx4dnWTM`gSFhkyres z#Fcw%`*4N;e$5 at ua)uw9s#o<{t0Zg75wJX^C49dK61gA5x$mQH4}mhGuJrG-2JoCBGR8e~^ShiuA(b z70lk>2^#SY9jDf}I8R`ofy95L*lsb;J~_y56%wcuTC z*3#^cGq#=t{(L`i__;eGiK7t)*8yV4&;Uq%?~EWGKa5BsLtaH$hZw{DE`-s|*~qLS z$Lr1UCf8Er4gSEVEVpGhV4k!sGw0J`nM$8-V6Ds$Z_d}`)p5ds*E^WP8&H(0zz)A+ z(Eczj5!5;>9_<8CgtklCERNpY at toIz^xP*Hhgw%1O#;-#u)sg-~u0bi)K8LFKK zzrIEK6aZ9sM;lqY>a#|(%2b^COfkyp)LAtQ#a at AmTG5yicGpHgjN!7DbR7z~km4~8 zN>Ld(=pQWwnUi{K&7o%uC!evZX%kLb1I%lfH>KTz>Z at 3tFpsI#%%LzQskOpvtRQwA z&(XIxHK2e7UX#m|Ut!4nkGmNy1r{jN>jF&H%(L#Bu1?V!=M7^c0DT$YdUdq&)HJ at G z6~)!gOViml^%(MNdA*?3ZITL%a0y#}`t0(8TfbQ}-oB_*&3ybB&W_La)%!J=yN5ZL?e=xBcZA{;X8&=G!hcr%&0knZ;ELD6 zzpxkY;w0;EFFc=rC33x4Qsu?!xw?bKf&gg#2N<7qPns7wyVU!vDuJL4 at a;YQmFJE{AJd*K{Oeh`@vFG#BEse}{RnYVI ziVVb*(i4=#d=uvC8qagz>7mfW^>kv&q>P} zZ2X}-1LRFY82aYZ-RB_-5(V!bE8748 at V4Z(JOhDAVU)Ep(x`F}O%&9GVK|*JfX=lR z#oj0awHa~r1dUAY_MmQG4CzJ5%Njd=%PoON(BtNbcv@^FESFafY at aPB7m3WaF(p+J zk||GRFvzC{I42#k?)>@Xj{V7KK5SQo_QxmTKLagz#&6~PFVHOE{-q=Fe+AmVIVk-% ztW~L7Y2d11{h|+&g%;5oSI(8ut_286=)MY#v&r4nK zG}8xG9y)>o_MBp&rexm=U00|&y+&RY z&{b=98fV*Wyk=3;OB$}Wv?us5GU-^s4NJdrP at +vE_rt)n9~8@^DO_?Qolg^#fV8+* z3hhm84w552>pS%JpT|G zBzcrRuRZ+?VH&hPx}C0J`!|)RNHM?RF&M6n!$Y2cNL!sQE(E&`RNp?Z#K+uze9k at 4 zG&px3Lr6Al;=)nX3I#jLZKk70S!so+i;>;;CRg9SQi6BT)EJQ(x(YwV;*S z3FF%H4;lft8$go(wnd2}NhzcJM`TpD_#ASHLb$$HQ}ce>shHQ$^FlQ^Xk$rp#dQdy z>>p&W_T4Lneda3s!I%Ztprk&gpLMvPJ#KS>*!?CfQxqFnV8DuH>Zb94u z8Bqg4V~=Q-9*^&uxh_m(uL;c1nYpQE$0YPS^0|X50p|JM)Y`T zwIVy!A_&Rx7_;=wSyM2<22vtZ?t~swQ5L_XK+v~6{2v5vy9&nmVvG4 zsX4HdEpcxwQRY$H4Ym at K&B2r1ax1o-BJce+ac*=09FC#S(7<0vbzz4 at +?KYorGZe+ zL=C==b)Yjxel at ysmIB*D_)gl++k~773+P1B#dW*xV}rEYu(zLRiQa(QQK@!Uh^6Y8 zpGCX;AD2I!?veD^Y6lY0Ywe*fTTYF4j3W64NIwV`E<@VsQ_BLfiDqw5Q>ErnzjodI z3D;$Tc22f_Xs=Ir!GbfdV2wj=!4@(qWH<~V%x!7bjnt?x&20AnF^^{b#Lyg!Z`l@! zU&b1H++~R*dHyfuxdI2_b?v_(U55RawiN#XQZ+kUds8cODVx;-midu9MY8h-9@*~WnBE&0MA}OAQ zGad8y0`9G(;JPUI#e=%(pA0+KTE5o9PdrX>zDT_pO6j6$(Okv1KxR-o%Gnn7dI!Pm^`lbQbjdzdxg!D~c+r zjf$n>&`-5kq?3=;Y1$)iz=dHiX>#eclJ(O#*hc2?{fCZQbqB7(pNX%*kCsy!;NLwr zSf2u{SJmx&Nq8>4!1B{YfN|5c%vSfBzYpCi_-4ayK~CJ*SoE95-R3;(EOmi at TmUqg4*vWg- zFo&pH1C6SDZA3_!EfL)IqqUC`OZUn8S|>>Ud7XN*lkiphLa*aLZj^yQ+Nvu;E$TlL z(`R4w at yt&N+|wON#I_b?(q$wA!^TV$s20k3k_ at Xj*#IFl?IKp-1kE at dC62j+3yHFe zcyd$JMH($`qYON2Ve|euk9 at zBM~J}^g}0OpKZ6cI&R9x#BcX2I2i%zE>Y6w3WlP|7 z?faT_r)u%+bHV8wE9_JRS3y>IG`2V4&rYy$CPZ~M=Ak2X8fh4sq~~g-Ee^u#%{6Gi zedi3RUzXmur<7PtVb%K@@x>RmY&%N#B?{GKe-!V-RF{W}s5lZ}n%dl@$0;c)1y%2h zOwK{9lWE-Hk)a>7lE!}ZG_b6AI7PeEmW~pS4B1vNI>bb at RT<-0anH94fPvX%*4?;3 zwWLw`^K6lqXvDva=K at RLVy|w1F(C1PGV)nhDbC_^KUjq7poS&0?7yZtp5_?+ITQV8 zJL8lu$O0+-9^D&7N&=knA%dML at a8*vrIJFMxR3!BZx|5a7!QE7!+sS;%nC%mj2&=G zO&p@;HVLGyhe*m_iAZ;g?{X-EI|No6IR%l%{?IbR{z?@MUoIn`lB>bmhXH23#nW2F zkp4zETft}*1l2vo(j5({xH1H|uoCfCig2P-X+X25Ds&A<#-nzMN$$e;XM8|)3p2VV zDjK<$K at v&b#Urfre-#q_T!qyCC{DNGxM;5PqOp$?1>M7}KjE;;TqxNVPQK+Jrct^1 z5up)VvYlJf6e{#6C8Cdv+N9V6mCWBi0=5&PznND;!IsE!oubm>e-cG{qAuj;>YTC`1h<;5c1g>8K*SGk=*)A&b5t}ATGd!TvZY1>D7 zp7#2!&`TEQIhq`CR-)@H}Ha`^*k$hQVjLN|071!3~8?{whA_tk;f)z4qu zE)3$(0iP>!Mmu(Z{~nb1sx!t%bR86~8InJ$QK*Lmv39pA;&pRDe?TNM{*hpe{($?VrlUx6Hz=fuk3YrGmw-><3 z&;}TNuCz73H*z{Oj3$&=CIAG-Kg<%v7J#9XaaPv>Ii!lxaPvXXz;Gj_7Ku|4-&sWc zo3uu%{601$HFIHM!DR-dN^LLiW7~P=e(NUN*$%O1`+ZLW$o7>xK#h~oAAtm}0f#0I z-h?{Mza+_{IuKJoc=z`BD2CJfcfx9v;Ej zf5(+D+&!9QccbK;RTy<*3||;^66O9BRzH#&O9W?yFKjFuEG(8QcM1TgXs7F!Q=Xzu$U$^>iCw{ zc|Yq)Wrvul2v)%k)*cma(>T%=ld(-?XlZ$|uqz1VPhGgq=JW3*)vj=T)|POKETc=w zjkgQk&wUdB_X`2Tb~H5_Nn5duc?j43fiet1K_}T%h*%z~lB) zcUhv)F^Mz+vJovf84761)+pFhJnw5IrnsaL`lzuf(VfCDCMH*0g=)iXno6NFO_u-I zpXd2}d at G1h7|)m7TxFtjED at C8rRcODMY^oMP$j$3Av4w#j at dI}RL*F4(R{1JxJp`& zeYC)@S=g2EtZ~!ifLa%rXM%RhAh%DdI?qx at UMXolA#C8lVywN(ruK�flB9I9;4I zu(i&q8bqvIe$2sGQ&1|ykWZMm0?`UQ4vd-Sks-OYc9VKz9EvGkNkQ{Fq&@RkRx6nV zNsVfJ3B6ho1ba)vFO_93Oxl8XWmpjPL?rh?n{`_A37T4+oUTCDisH=qm=7v{tf6U8 zs|U5%1`G_DcHSa6RR5(m{~^tO_v0fKi#&P at RVp%yE4%Hpln1A`P74C%6VV0D>if&5 z_s{kg#bO?WE2?A)nNjYOAMFYY43h6b@!7QJDqIrb;?Ohhu})+1HKVo3ODaw|{atOt zR=tkun02teMxAu~_?;Lr)2mmo#s`DUy+f?3-ndlCbSy)ivq(jLUWbQ8$E;Gftiee{nqgE19+h~Kp?w5_!Yie2ywc at vwOxz-zyst z@`7YV8c#u=?DJIZ1!%!F$o2_WL)SA^ulxp0v~P6l=-3 zTWVEq^rluJdU6pC8AG%?L7sT*h(Ucz^+vbUyhTP+MR~wqsl7hTRcH`JVuC;qH=koGF?}CRTlh$gvdS}{qVzJVZ^ zh=bd~qiW5cMUtc)$c7Vf!%BVNhcSmD?hiCqa0&uT=b=i+_zDOKhaL*^s07_kx5Y3n zS(0`$X~o)6xjy4!Lui%S($Ih_(LRKHLkgwZ4qEUkXGJ8}-N^aS>Q)qo^DT#D=1d5H ziUF7fL*E%G=LeL$h8AbWiC at Ez{{v7|w9zD>V4g>_TO6cIK74u^D#pp8ui$_chLeh0 zhl8uCAbJ^kew at f7))Y~zZ5LALPbbtq=NYIFUI`vpe6ZoBxWnZ1xDymWH?jk{5GFl~ z#|{P+;ea_x9`zsq)wcSJpbLH&mS?F@#Y*Jil1j^5p at HrADQja4JD!U3;^9#K6OqC_ z+Vn2|$~LVdHQAYIYiOvkvNTm*nJFvZIKDJh*?n;vWqPjMmCq$cZcT#6JH|H#J@{qS zzWcf^_lgsK%FCiQY at 0@MJBXvMF8)uHCwA8E?_llUe}MlvcOn9A4o5(MfJ*-6Pm%vc z?i6yCGjjOnab`tH|K>(F^2Z&~B at qPNb3Qa*b`_#}z+ww%EGUR`7ra(!rEpkIx6NA%a53T;N8&)P!R0 zQ!Xa<+ at w@1$pQVfR4W4sgdBMeBnpAF2k9PDV112_jSM_WDo5 zDQ1_qj$+IiNsoTUc3X|i__y&zciQg5sC1>R{)xRU%N{1O|- zC;<9M at pOIbp0zdG1P6`RQiOpZs*rQB?K>=-PFS?$RdOONv*^8i7|SE3Y(~urHP7Z2 ziV8LaY;>NE*j7~mh>2*SA23`*R%zJG+_?BOq=yP0^gJ>*-Rykzb=3oC4pF9LH|d(& zml188jiksomK8Vq)af?sMDz8EZn(fNe;vDuR6QgzN6(?P6IV_%htt8W`K$Wox(12u z!z6pQ<}#sc!Z=Y{&xNu!2m>ZD<9B(D9E^t2pA*eST-jDBE3G{jiD;&AD!ImzLWJ+= za3<1yuCkP^{#Nnp^r=Cf;INvesr)LPw%$!YmmGcd*Gpl_4qJT;Z_BZu*5%gM at vnd& znz)1-&$L+vW3PT7h+JOk#$?ji42)%e#z3jUZZWn>%(GwvT=Kuv+YLjE0{FRLvNH68 zRMpTRbF-<%a;hn}2C(v43Ru0Ok@^>3O3V at Zlp8{zilULeC5st{ORtC}f_!v~>jdLz zs&}cM4o+xSejre*2>{h7GHj2PDM0y(1?~BwKDdIa*cpwN$WjZ0p-l?+s>Y-#0Sr#x zLC!=_-)up(Y>6s>J>##D_Dws2%LJcT>Y;L0-3RsY@;)q3-}FGamW8A76PCyvfk5_^ zbGg#r;o7t;O|%Q>S}lLDqDad9(7I7cEz^NyjF4f)A>9D_a)coI#rAZ;@Xv7qV_`Y! z4+;dN3-kZK$oT&fC;#5Va%Hz5jl_3RD0QBWvEJyTPpQ}|m6w-z6O at lciKg6*Lk!&0 z90n~Ot;dBB`bSbyvJ+ZBaKFFn#~sj1UUg~{enOC(&Z6eJR!&+L3ky%eVb7nQFCfO4 z at NoRr!hPoZfmubYK6F}gN3|iOaB8BJL1mN)*Sbxl31yU)cujN3CHM(ThZ)0E>YiN& z&+4l*_3A^-WTgk$k!cpVnsoRKZ`+hej6!j6F72{o%rhfNG}(UB7LXx zK}L0U+XK6fHuF~WZgXU2eYc;RO&x3zKYkB}Uj>>+JX$L4<;KMYf*i2{kR|5FQf|=Z|1_UR|i8O;?-< z(t{5A`YBNt)Zxt%GjQ$A&Y-Fpdg|kka4Fu=GEy(Cnh1{dQWJZg(4E*@0f{CJDpE64 z?exE=7|SfOA%-zpaNE4C8Ag+7UGzXE{%3 at Nd{MKMN7tVl|Rc0G` zZnbI=RYkd{fSW}AqBX)k%cRp at hHxgCP*6`i?)B3rF5=9-UhGKeQ7;{z-^guC z!Fxe>zbM{X^|CLkkl(1nmMKonoU`OT9;AXlXw4eLhc~OV#2V5>ac7e~V3fOIH at 7j* z2JV03gMV?#b-GP7{*vvr>Cn}D3%Sv2|*pzGP2yKsrV|c?zb?_#HQ+IdR~YRbS}&x^B{sk`hxo?#+XePck;C%Q88X&jj;I?9 z?NT`Wkdxdpr#MSUnW&BA1D%%V12M4&`9o9?E}=0xKFFA;nl+D#y%;J32EmZy8Tgz2 z$LdZ257L>N*x_#?`gY1fdK7v5ki1KaL4NT>Xkh9K{v-^nAk`0VBq5|$K2a>!->1)9 zaiKrv`>%RJSrU6pP95EzX;6AJRgDT7bE)+;l+R+NiY#y>yyB%pGX1YD6BpsGqW3tf zx}IKR;bfl$Qd63Cf;A<%2vc3XTdwN>*@+k5 at Bn2gkDIP^#2!&Ikgma3vq%vVd z7~GxVf1e(Barjvyw8hel5+j>ArhmIg)hmAR^$_m9$r@<5S~x<$Dq&c->z7n>Q?&WT zeFvoJwEJnEzVgz)-V;B+vlPT`$zA%tj-3Af1 at h1Ft@c_zG59yWtzrMAAM*bg-~YYw zqe at -R9#sO3&tycu!A2H_NO2ti1pEoi>3?grvd9T0EDJ*HxWuoz&KaoHzTM=ug8T_r zsGg+wG5dSAo0Lv6(c+it5>H3Q)cUq2fK}Pt{ASa8x{bx%{Bv)I;|6GQzb;bAhc3N7 zXoDHe#~H~{)pS!xt-liv+CA7)i1kHOC9alo4|pJTicW6nVzZuYK~pEw!qAkUDjjfD z3Q*B_LQv at aVLOzzS3sX0asHx9&TNR&}kedMzW_QQ1!2?ZuDWhQJTGpz~kQ`=YF3FS^ z3#!mqoX3qH;i8Mpp7ulEMx8zZ{}((x;uYRJmc3Jm5x0tWwOu*59$R{F($fi=;-pt` zbitWjt;2U*4_fg2iHr)^m;-5;Q4?Z{%Gm&^)0L{gE%eGjUrN{&T#+H&~mR{lY2155Lujzj`Cw39Iv` zp3wwbhw=k2hcc^PPr}f$uLLz6piN=%roQbk5H+zvFnt zl3l1|G at r1GM(zP3*c%p@>HW;0^negebIzWOvvec(b=w7}*J0_5XC>ONEll`r3{at# z{9R&ts!>=!3Am!KO>x!toc8=euUYWLCt;sHa4FQ6- zvk&tlp11mqv}sFtGXQUD&LGH{4>k=hc1E0pa8rPJ%bVY6h~YShvdz+vfpbn{EDUKg z>JNN0aVLCdaQ;Th=__c6RpBl_f5 at wpFChofAIN`Z#2;)RKXEW1AYl0aod)L$l?LchfnoH4PY&n3T(VCj13RsI^z!cx|s+!t^EH>NMrfk?{KU!Y5u<->> zT_8kD&Mp2>j(o6B)MwB#fv4?twY+To<%9iAM at G+|w<|=ThE;iEq?e&v{~*K!tloWW z(YnMz=5gbu_(AGrQlCUo0e%dGoKPb at I2mKjxLPWs2&3A*zo=+wU7D3OalRt})iIV# zk}WW*0CW|d%Mk>Aj36;s0?aY7>!sU_mz~rWD$jW(Cep2D3okm2PnO%d<`-?NikBa- zjn8P(cruN0E3ti=v^I{H0qs=@N4jg3NFCBRr)zA_Ydes#v0!B7AUI+rQHh!FL|~($M!~Rg+!o+i^eMWf=G^{M)!BMOVN at W; zDlNUaI6`ypgYGx^dBH$ZGgRDOys(OnZXa2EtC3E6X;gzWPh-#wmND$1;49132KdfF zxOR at iXD3>wO0&n*=Fvm at bnd4+bx6E2M$N^~U>?lype;D)CoK$HyRdaAuC&)`SSGaN z8AcRidf9g7#sK$*Ha`C zO;M3=T#rTVZW`L1YnL6EI&_2gZ1>I3ly1Q>*9I%KS6?~S^u`fpy1_B5VNh)QU0*;2 zA295RH8YwiDR1H(7r|JnxO_h*Gr<9}>p(#vN0fMjJ_lXKP36*=ZA44$ZDaq1F;Qtx z;vM^T923QCxAACBJ}mPl_t~1XBKCC1rqOt at jtrbnwLWwOSGxn~RIWZisp!hfO at C!V zPm&6 at TvVXEV97t4T6o+85mIQ1ES6FH3|2sr at PhIyW|ww)&L^9H2N_PN*b at uW(l<^W z(JFctZ$|z)@JqOYl721~ZFv+iRO}Zi81kOSo|>-PFQ~yX7jbA;+FJLa4cwA0=#V?= zs?tf_ZturIOL@~5{bjJto5mIrU}pW$lfaY?Dq5F)u9t at r{)PLnUJwqO62QQFFsU7+{)76 z%I!kUTnt5O97TgSr at w1s4s&crA-hdc^qHXzn2koBG1g9t+wr)k=IHSl at S^9E6(B=2 zw+89 at v0y#)?mCNkYuv{wigurOd8tMhq7`qc#KJhKc(|HESguB1x)l5lp<@*tz$IG` zpkwtSNc<#^6xixhJAY!}cGj`eg^Q=F$OX>bFb{UNqk+RH~gP7j8_M950M6 zSw)zs)z4Zia&9_GWoXk{=G0R#oa@*-Je?AMVIypZ}(@38>l za9UW^7 at R7K(}u6#sX;qt7!x_7(yMUXl$I`hkgf?uNK3HOyC!Rq7!oI?i*3@)vMelh znBcWtvQjQ5o2}M-erIeTp0`)2E&gOzGQ}Fr_{cPB&BgX<&|f=Pj&3hWFl{tU9)(Qe z&2!h_H2ht)ghlQi72a0kdxYn@$4q$v=&S0iUjCW6_`uis6KARVX>gKR^rdZjqFl~y z@(G=MK-8OdrhLkSefnC<&Vr;vWs)9sYUksY(2K|w5l!&(9jN|&+;3SIwG?1{WcmTs%w)j} zT^0q5np8-izslxVL3)dopx#4GLuRv$cQMf&1jr}eHA5$Vdt?}u%fWv*pc1PZEYz85 zB~6ET`2gJug835ZWJ+4CNp+(Ui+oZ;JbnG}4%O{ebHO;Gq8WF}zu;{?b zJbWQU&s=!mKXAMnhl5GVLJKFhm~?l1#5K*4k6NWz}%(4+IY*o?ZPiYta?)s#J%LkewEcFW?|10$M?myQ)4$^xiA;p}wO308kDp>&E=SCXGkOyni8C$sJs(Ay%sVJ}&gB_R zh;%miX981hGJ+hyiDEl9*l9VaH6KAP*3mf9cIG7hJK*sZYR-Ur_4~O_jIX&ghK{nD zD}Ij8fy+gEfRFRrk+T?=TMy5;MbMy(D5R>0?aGRbugYDjVz1AewBX{@tM+(V79-6! z8Wt`~>uW`Wt*zpxla32vWTm1 at gbQ&kA#(JslyvcYNGy;4?+0)S&ps(lr@#b<30QeY zG6d|nLdOjbwBB+Njrc3hvb0!d^wOh=YdHfEU{$wsFA<=Ri6DWY17SIWfkk3t;MN~L z5+g_N+ at ABSIEFP9isRnnU%My*`n0amQYnS*?VB(`lU=NFKF)akE;jetIVR=q?H`b) z_Ihz91t)Lx96sm6rP!|F-r%zPi>MS1 at OS-*S(@JlrefV<_`Hqq6L+%Svl!oH3mUoB zrTN7|L-hbS0_#@)PQb>f3WIs@{4JRG{2s!;xSF%6?0g3)^ zt9t(!a&7gW%HN4PDhq;WBY!s7;pu>lg>C^H`N;u=q2bb1%up^6sk z!hO=8uM4Gk$wE4)ugh9za&4VQYDM-QW*@L2q%(XnGM;ALCWne$07Te!tNw8sOj8ba zOI4oeA4O9u_)NHoZ_Ayy at 6Aw9&8O}CInEwPqdi0MM at y6CCu;ac^YzDVtX$Ex!VS9a z!X3jcAP4T8R?UVTZknc=Q*MCp at SiSGL`)}YU?K)%ZbJ`VwtBBL_p~C#hgzFj2fqTB z(8x_OuzGJBN!%l)!fk7}`lpxulcrZuLb zqgCk}M at M7l6zMBzo6KG9c7!&ZVQH*chK5s6j>A`o1{86hk%V9t=6HSws}vAqy0q%B z8C2TGgMvIHQ7 z`C>jT!Q~gMAR9y~X=C7MhE2xZ5u<$pzH1>3KcJ10QWo_=3~XFJ#PP-I_e^JKl%k){ zj72BS1)G_V-c)hALGpHnd+7o%$?T<)+cY~95bHN}XRRwDS5NtSXlL{ZzDFKA!1&du zIjf*KyFnXy+E6c(fz9Rg$+vj0+O@!0El|KKy4U^r>FY#6$65*5npET&#_=%HVeY~m(GfC|GNsdZ3)RjXS^8%U0{X5KcHWOG%qchs;*t=>K+bga6-DQ+(4pn*HXFEDd#xj1EZ z!x~`m<8CP{H-*>|) z&(*@U3^EoVD2^>*$5*&5m{@7PtG9I3 at UV5;$D0=a=a(Kk`d{>gw&7yhVHc`P;Uh99As~c_bs+d1uL{lD$o%Vy;oMQm at -UPdS+VB%=_g z`N(PD97>&OmjgSMj++F+EWf42CLL~MX%+639%nyxq}Oxpr$<+9{g!R4x6NnQ=^K1dpjeb|Gs0fcj at 8Dp>& zb_X`?9_^NXfiBYoCf1M6Wfl+EaxAC*Klza at EUo?-*q3|85I2Gecl08TXp8{okjd=G zmr^!k=FwQiA$)f1wn{9wrMc_d)(^>DS$ADKwlIyVl at AL7KM^FCuIKh~5?w1oMSFC> zqq@()^s}JG$A at z{g&wTe at g)&)v}yROQCvBnls&8qS*VHV1IZ&RfEF$Ngi+x_!m3H( z0c%S7n?SSs7Jaxow*(BsGBY1Lj4)32GstD%0*_*?(>@B76WoJl=i at B&TDEioFd8#Q z1B2fR)FSJ|9gj8hJFIR-L{bV0wZ}sdd*_EAH+~!x(9YEXX~8$t<~A{s5HZc>uRt)7 zCmvG!L)aI_Z-H=P8-z!zubN~X1-`)p4gx~;r#|!i7d7dR3jNO@ z>VHI0)&H$1e>6u21BB^FBbI3~)=7&nK$9~g@}yg>QKWL^`xWt||I}ohH=3LMOeVo2 z_=r>--$yB)90pLh^Psr&$(#+B=Ps9rvyYG4cPfAS9H|+AAEb)4=$QCSfE@%E3vrPi z1NK0iXoLyQPYm(A at N7QV3sZ6FLe?SksPQyoW6Ee80A;tiS9oQVH at va3m0f0gV#>w$ zUuM`NIEp%Syo$5CxZxJVz|p at vXBUiduJM<))U^5KN6hdu=s|oA`*|WOY+1s7p{5C9 z1zx%=k_k{_)wX)75ya`;9%@10PGciXJ1j_GHUq|9~*;fG$6iZKd&Q!Rr8mFM%rjFdrHJQy^boz=^ zr at rDPfXJ+q^?B)aXmXWY1(C;==A&&A>0afcypYJXR-=g#GzN1^>>7-PyHkvAGjSk zyd62d9S-EsQrq?k-7^+*Ml&5DDMVo%zXERP-V?5hmvd1Zdh#fOV_!$k3uxy+SlU8L z*@GEvS^yHj7zs*a=V-|=ZkD#vQQ}wGIN#h6LoY1zXAE23g*2J3&`g2^1*{Qi?11?> zZU<>J4)vFl(mP1?B7b?<kvzH)F*zXBJm470DcrA}j%&|! zIpHA&;xoLvhskdS!gOJPXgiiQXB~mfn8+^iAuC7lHxJWe)*n9ZVfn*q(wkoi3t86J zDzmGM^$D-`AzMPRgoaWcDsaOeqCCQ04zl#GJb()A#tgp$Z`+)S^_wP`^ByeJwV72+ zuq&_ob=TGE2a#~j$}c0GCihgxNdaTcc#T<>$m{|;aci(Xs5w&XQ|W5zM}0dwuDaoWH=((?^m}v?C-^l`F8I}2?V(`W zuVB~359URy at B=f at JZhC^tCj5Ncgn)8ICJ(O5mZeH0oPrN>3MTm!LAE+KxO#(K|!>o zd5K-4n07g}pGlrRHa?AJyohP1`Bj6FEUr_+nZLhu?aswE-xb6>%AFGwzY)o7Bfg{2 zzep8HO5W{&k{^?gCIG$B%^DH3WY$G#oA<{WN{kO$)r!Wp;y!S}Yi3>i{h2M972B%Z z_L&1t$!~wtbLC;#p{j|OhI5S={b=y(^OQ@{>eA1nzgN~xrLJN;P%r>@h(G6CTo`>u z&|#-E5(MSz1qom9NTcxyw($v!|L`GM at KP#$D^`AXpf1EaW4svrh8wcN8~mzH0-Z?d z3);Uh1J9c}i}LrW?>oBzbJHIbtN*DglK&eh{@1DRKjuCS`#&WH*{|A>ghHAInz}1b z+#Vb?^0HY|HUuX$kf_H`XL51Zu$7&kZa}W z(eQl#x{d_GQ#pd&<9qEH7aSE8MPhDYou*)lh?LmK!X%P<6(+LAMt at JXWhJfU9wi|5 z6TUsayXO3=E!Rr=X&qR?C_TdBFY?`L{TG8C;J0(ENu8=khF8BcF6Od~JufHBIH{3u zmBq8={L1|ThuP0|WjVsC6#FfX){;XAk={my?vX1JG|V&Cw^drP$}>A>z)pnC?Y(Bh z(1t>xrL(h9iG#LAKgS?1^U#1VPKxNzT-TbXQ16FBDmnd&51%u_MNLFov_-v at hT;pdc=e0&Dok4qt at j#7tl_l0rJ?LUyEFN%oS;!aD45Hd(KTvRY$xGm5d`6S?J03O%EasW*XqE2trK)wOq2 zJ}JPN-O2Vy(ueYPIyN|$0QQJ-5X58jJ$V!sg(tS#5r2nq#JQ96QgJU`$FXF!nh449 zad66oPQj6!9${%U@=q}-oyMAHH?hDSj8~Usrx8xzO`&Ibi6vGjbWLj15J#rqshlJX zv~dXyvo=C`7X?xe9i`_5g%Rx09!JcuL^;dHWt}zX2c=Cdvq<=ZwTRQzVJ#yfKl^}P zcq8e*q3iSex0CD+E7Z?=qxV!NqFc>Dj3XlR9Ui~z+6vJoEZOct4D2K8TkXTXaI;(P8#tjx2T$=>sYGZNJ_1H1-5H3 z6spWdkwGb+zn8TIm+|WJanD^;&;1ZYf{W%NOJJK7EWCq>YF0NFr(%1K@#qa3B!&m1D%;SF z{03rWMjd^g5?{=*!V2Irvn#?oDal7yo;ScM-JFm~>z8iVNt?#{go~aF0b{ehX5ibG zs9c-giN>7NUlQYWfzAP{&1|LlkU+CO-%;(?u at tkZrLU1dE=T&cq%-<8SzwYeMj#c&O_LMW-9!TB_BL!SF6yRdFN0h+A%N~n`Y8lD!zqp z-TXN)82sy#u<_TSy6aBm&##d+BMcfHegU&pv14o2 at k;Fc&H5$W-8}^`<3ns;FYwsz zB1SK_Kq4ACtg#$4B0dj-?nEdouDGjRywe`~`gDh|5)j+afP^(MTk4#Qiz zoelXBKq=2S6Ct_s50GKF at E%@k4+h2%td#AMD;|&R;@8wRoQ$B8FQXAyQJ7%%+htB6 zL(XL;j`2B6mq(O$2?U2AKmAFK4kpI{hL+~=>{Idez5sS=~_j9sE_ zGr5Z6xQBwhm!SAXhsYk03vSK=DR>{y at vl+U`VI)D2peCOm*SDNrDA)eN-G*qhD<(e zZ-VP1if#g;{1xd*x2a=XCI`r=h=(co$aXV#Y29#j7ToO6JeLQ~<8cqv;DAejG7gqi z%sVktMiCgZBS&LO$T6dQfpLT%k|*z!HQmB$T>yCSXf~7}AG4exoLx)PHZ+9|X|~kw z7c1#1;vRb_$6%Rk_u1($*IX*aa^HN!TZ*B%;$MT$fAm?C+cZHk&VES^!`C7Wo!%2| zF&rpX<_%LhJ7AO=2bDKNBEa5vAhPJR_5nOSk}f9}QNF!>`CCJ#fB6#(0tBQK=D)tQ z`Og^pPrlkauB)T_Ih+r;?KT>;A at WM%7#!WyFVdk?lcUR8ldvE2s)FGmI|X9!^SB>y zqwVGPP<34gkg(WvK#({3N at Q|Epn`#dg>MCLFFSV at jn4F;QaofOf)oP#|XG# zM4o@@^AIq&AQ)9_#dq48LQ#f$5}CoKy}0=pSHV72gho5%Vqc+ZaZV3jZm?}b9j|$V z*)18UuwKy1e&1Gc0ojBq0IdV|*I(3u6UDvzgPG}%T` znbzDUE3IRCm%CK2Bb}BQmRYzj7ggA(y!K=U@;~&kJRWcCqaw1_S0^si>nkE( zS;H9i!28e=%E0c^Jvyo|r#_s;CdQrE!aM9r6zWYFG z%zeG=6z at y-aribb*7vNypcbQE`eux*UOLn<*ccL#CU>Ud6m3%wsST4fLQ%cmioBe# zdxD_AWo4BsXiV~s>TPg~sa at frwKG>9alaUQLp0 at FPD0&eyWhwCo+3X_d zO`rPDn0jASxnE}X`$n-Jgomv|cx`&K6Pz1|y`753Ol!>F?M~F2u6sEP2%GL6%Ph^j z4R$;>u1Ts`I&_9QbEt3ogl3k at H|BC*kwVC0Y-g-F*BL(#uGOqA8Se>nuT~7QsAJ~X ztTG6N>}(@a`6os1(g#hL`Gp%0qGs{Jir9?&i at W<)EOcSGMYl|D0-k6HA!=-gI+>-y zdis4+zQ;_j4-eDNj69ki(-~_KyAreNuR*=)Alcc0aANkT8X=1ywkuxyD1Bh&Hw>`9 zJqwPE3&h=k6rG6?mP})-n#+;xv3;aFiQ`V2SBtzrlkBJ-(iY8yBM#wIi#*70ENYDC zQSpT-3;0HTuZ}xY`BF~Lk6 z1zCi8(AO+;Y~)uCATKvFfRE-QkGOT z_~3fLE{0Lvw$as|XCGeffG_)$S`Log4l;&amL*cWLP59MXzdvXMCS+OzbZ^WgJ-n! zpPqmo=D&U}=6_L`|42mswS*B^2MhpaNNEe60(6_ui}Ic%=(JHFY~Bm{qq;&e%4XS* z$!Q9O2935Ok$4MPkD`QnjQXDTBL$D5_BO~Dn$c at dT<11Ay)SvJE;}hg!F<#Wm+*pvg2K{Z<4cZ25`UrTT z$Qnhp7DK3SiVUm@#TBD3$y}?l{jSphcTz8sl9Q#O9!;^h^vuf)`$i2_-lTgqw*pQA7 z&mxWV8dcvYuaapIfx79yIm|F%bCU~<_4doEpAtMDpJ!m}5Ah at _cb#Q5(BR63jP`$| zcmomRkSkjsj~x{fc=9KC3%-1?+bpU=#mcqASV_nd-8Z!#RO<-Q`s7^0QT-v`f9%P$ zt4kJrMGdKPN4*ln1DG)4V84XT-ZC!s8zp(9O&eB#frC{fuHI(J2 zg5aXUp8CZ28QczUwXT#A?5%#rNmFLaZ~=aA8`v$^mm^hqJ*IrqjtdV@!*UE`nW`8M{kom$D>l4Tvl2MVXYY3wVWvw)ugiuDhfN&z#G`!Ozzdd1OOyg6 zVye*1Kng7sFNF$buVX!OBIwf~45RU&olmC$e(t+_oKfw4 at a(B0CNDqz+76#LffzI6M z`8Hw!#tBe%0Zjl8ROPh;n42^-oPmNyNa#gsR%y;+>gm;Cde300i;`A}GU<71c at s4^ zJ^F4nb#bw!cP2)Ej9m^-{Jiwu`h4Gd-F)2S>gK=QMNh`61 at vKvT0!m!bn>YGP?;We8z-|`u-G at Y-spPJ zEFdq|@)Q!?{mYA(EIpwLq`XqL{gG|O5l&*V7FT at ioM*_KmE_3ON87RX-Ud>)| z%#s2FUgl3}&m6ni1Wg9vV915$*Cr98Zs0wX1`z^OQ=DTes)jE>G`d(8yI6$-RXI?= zmRxpagW(hsx(X~Jvr(BH7;Gva%Urz{G%d8;cKDD(W8Of53_Gv{L+w)XthY`kY&Z9! zjtH6W7=?79N at g%tO)N9E#v!DmGJ^Te8DeTjEWD$a5mLS7w9M6vH=9vZMY5J$<_Xnr zmiCnrE~OD|@d7`ys2vjlpVTL_y;;H^J&Y3xUS7)YA0aKG^t+rZKaROtkv3*MQzQz*zDr_vB097_91 zL0GV5t3-^O=d)HRo+Of-P{D#eX9~Mc_Lj~YPm*g2(!jL2 zGUIMRX|9C1+D4z^GMuYQQD}h!0vb)(8V-e+9`EL6dmU!9fxI1~ZQ9g1Sjkuj&L#a6 zA4RkWNy|YqN at hk-olu9dZhmLl9(C%}8I}F^1QR3sR2G%H^BdKVWG}TPr`|DPvKe3s zX?aCgJ_mEzE;j4QT`6H|y9H#1%o1DY-`DErk7F4C0x81`#lDN}7-t#Xp24yD^`pmb zf5CAy&go9R=6f at gMCKZA!PSD%X3+t at V8klC1tj?H4%!`Z;y79m4%bEB>|UY3{7AZ{ zdeiAMGJnJPkyuAq6MyaT76kObH(3?3_!aqTj^D3><99d8Jrc|Ppr-Omg-fch+x!jh zGavG6P2#mthja<2xRvzK=T(7tD#sJ$G0w*G+^u5I!FLM6>?u1Os=OTwiRCt7rit4w z+B|-_x}wc&v-iU=*~gMDf1McfPydsxc9lqHl--#42JIrlsVx1G=qcA#?wEvF*EO)9 zplfWY!F|o#t!M^4tWqVOoHpOzE56D-0H1QVlTMyUgRa#!y(bH`mzSeHZs)J$>oFU; z;=ddEvX at G4?fSIjbNF5K91+W)R5SX&FeJ<%Ge`Ommc+_Wvq8Iqt;BczH|&?_O(V zfU?J7_CS5U?~O^0Dq8&IbAmV}E(PNIZ$0=g%|_v1m3_8h)CU(57}tv+qqxpVa^3gs zFpK&>Z1khQ&WPS<8f*g6?=E^IaUBb0K|0}%3{H5EdiMxKdL>q-MEK=c at i^xjf;W+~ zkq1TPQ4CsA%#(+3?L?^ZV&NGLXk0dy^a}?oLM0cRjz^cc{J-*U-|!R?0jb4PqyJ_y#T9S^=FBVQ9!$3~$kstIgEX^~V(va!l>u!_ldTrFeX z*hbN#m#)_~(J6{?uv~N>Q?fj118H5}6NueqvvJ3yeBP at +Yf0!!PCIQrRHut|pD)ej zXFr2Ho{Y-IQl9fBRLhZVSW4MXp07V_?D$6cJ$dG&xlvs%ayqh?Sh!wbC6g*>5{(tw zlo{!ZNHG1Ej45I}))h-i6~-?cGAK%xwMg+vVN~lIp`{qt*wIJ8l#=fCPoxh*;?S+H_$hnF``XXy=7|_H%m&NMR{;&r+NCnpU5p_=_ at i zc`3Sw8GzegmnBYo;w#E+#sDl!ESS>>xusp~GP&ghL37}(*IbDb7#nw0nS at h@zqp78 zOAIzCrEX40To>yEauLR|Ea)*5Uj`Pi_gOMwBbX~=g at Mw&E<_;k`1ndp=4ue+@@F$ud1 at U+WRy3D^s2_!Gxy zZf9y9ycFZ(=Qrij+`tSkB_>X;;LY4Os2S0&h=KF5TC=e{U;vg!2=Z%`u;%&Zfx1dy zt#C)8 at I}FDy9()M(6?)D&4@=Gssj95XDSS;!=G!scooiCvXRVM|(`)=!e<=Zgs#7p4m|jqPxiXYRi$6pH{pY|(6)VhS at s{H-pX%BN zZIG at F8O6aQWs~H*4&OO|OMu8;CTER}ze&%@?`GKlE7xme{~m#)fjfUtY5y8M)Z*a6 zYk0q?U>d>qSvskhy==-G%?49BLdOkeOsi1N@)~myIZF1}O$!d1)g)}1?E!Gjs{4}# z{~OjV=#(S|f}#5QgZ`FX7JBXqE4jXHaPu*4?aLwWyT_oGgw1hlKgh0Vj%^|MYGHv< z+ at sEv%}LLc6FCfr{HCA0u;F1JmlXfna*ha6uyccffL#1HQlG5<@Celml+Z-b1?C-e z))<>GE4PSM^B6{S7X~2u-~tA;XM%y3^A^-_>*N*n&5Iqx+*r3P*?#RE)V4a6ZMwn{q@?c3_cM6m9(`aApQ;nn`6fksLr`~V zYacS3Y=0!akRx#HN$X_sC>&gJvNDhn;?_}XY`P|jiAQM%$24oKol}aYzU+xW3ElMB zfCwmtxlw^EZ2swH2F;^{J9C{V^T^9NkXWnSUg5QdyGB7egq|h>XhT0BcY^F6S2I)lDa|w+%f)cR)$KOr^Imy`Gx%~m4#FziN z)u;Z=#KFbV at teJc`9C(JfA_D8)$RXa6WOoX(P|ydRs&sKxNHS;|Ie>L%z`Q%B_X8z z>bqWTaox833r^;T|MjIc7|ToVU*7f9g8~gCd*{A`rImY5x|Nl~kB^rRaAD9>=K&|J zABSknPE3estK{EC at U)q0t+xe(oO{kEpk_^_u^yj6f7(@_EUk}qmA-t1XZfMzm2Lr! z*{?o&Fy?*Pf}pal+C>-g6K$o-?us(#S(awUVePNb@>PMh8?NSt^GS29v^{r3usvG& zBHRsY3HZsvsjAG6pdABu_1eUVZx(8XoDH8Em=aPsXo4NSzAI|-K$f*=JioH at Y+<|{Va1@@;^?15?g{tZoAJ_ zS=jWWuqWz2DZ`)6o^JiY{S|QB at O6NGBjn3_FBYE+Rgp^zqZVMS6UBe6g;VcJ?78#8^l9t z$R+oC3q(b#w`*uu)MYZUMTlfyw%3!Z?@sELe-T9c-WnYReTGu%q7g++f2a(t z2AM`e+4|S=ak0Hl`ZT!o$L1P!gHq?=i=pdaz<#4u|D_qHB~wVJt*Wf-6iRY(p5_oi zc*!!cKp at sqV_!1(b2<2T+OMi6hG{z-Z}>Gfk`}c(_~iq}e%mIKpLaleE{5vFm3m0~ zltH{4Kc5i=gfH|eNA)!Fjv at I8gc$SsclRwy+-s8*96Y8!PqFY#L2?fF>Jm zpw9&@SppY0c1{d7zXmzu=sXMJL(E=OL{93F^W_R-6_onBtK0Glm+LsP!u!DzV}3Gk zMzfW!S20>oqXZ3Fr6qLt4pcqok8S3tb3DyVIn|)4rQCU5JZr{fF1TV0)?v;GAah5v zm~`yCt7)3IQ-(SHi}pD9bIyW!;7IT$<7jbD+*Rab`vPKrJID&jBSlR)QPCTgWq+8A z?FnGR9oJ_gX#@4LN!*aI(7_N5VccC|w$j;gcyq~#2#I~bNmC4e9G7qxwf{K}8<$ab z{iJk5A>@=PAy5kb3f7Pfjt8cx9?T0W-$pL=Yy&)!`b%%$Q{!L6U ztt7o{rU)BKj@}SbeVjR>Uf8N%$9>o8*`tk z2#Fhr11!pC#wpuPC>Rn0phrgwd(9O!Xa{gfc>JR4i{{LhCfBooxhB=xv^!_M3 zw!r-QL;VaOQ;XVk(Z01Zj~bQ~AZ)687obbzlaW$KpMJsFu7~=OOo<$X)Rp$s6U*w? zkOY{My~|f<+xlr`IpvYwz-HCm{RvVV77elMSwtv_3bU^!ogXLsrC}^n&V&#SR~{i2 z2Q^gxF!;P(3O5D2KyS=qW^1k4iHqWqe}^S174eCLORtM!l3;TJvOyEa^rP$GAcdXZ z1f)MybePEJa6TouF8&1cv2g zJ;RUed=q$b(XEpkj6Z_kK!rU=F^+ku8(r=+-a!k4L&L+tNcXF0!5c5C)PdOtUpz*H zh_bDakb{X7iF{vl=B4c_G7z1`a({ZAyw!kfOA9G1a|o?nbK}r&yqLZ~vP++wUhylf zelv6gin!0Y|PEQKMh9_CmRvZt5>LT?Yj_z4D12MFu!pjI}g|c1nWj z`cuBXEsqCR{=xbfc1c%qmP#}9Y1dzaMKQlU^UZJ*aW&m4cQDG_h}Q>{pB`m7;!34n zOJhwuKvriluPxP3U$bV7Zht&a^#fjT=T0iG_&ONHDASa?;28|5B$96zDJpOc+0s5+ zBL-$hi#F;o3bpb&rHwF<+>$4m-F!KV3b_d?g{c!&c)>>!j-X-Yf1sPWV#g$EiBk*D zg{-30_Wgnp4RM72fk3G^!zPJ_@*a-2e>z5$k=Y{g;EweT>coeF1TCL*6UfDpLXS`8 z8Ufv(N|)8m=uGL&ooGKrqXAJLtl-figc6&PNa5ffWlc5Eie|ZNKD*ao+4?m-lmU-JOuB4pr{$Z*eB_fg6LxKePZs zgMjG#-=W1nNTK;vY2Fy!Z<9rn7fv3z!&xPro3jZ1(%~Bl2 at 8Dqs(!&%n~Ido@>Da~ zP0by6g0(5R->nqR^mTjOQ?@CIqr;p2*AamL%vq3t3GEyX_ianjw zeJxDeCP_)L5d4@|;yr4BqnLu>Y=+60Y1k1~eLC$3lWwl6^0rn}?iAqKsoTbExootE zmkoA#Qzcz<)f#+cYrRe~9Z+XhBYmLUW~SiOb~PR;=lV%m>+`UoA z9Z9kg6VcEJKz1juz{wEvR4kYmpPmrZFo$N!%%rtvDZx3Z at Mm^xx^Y`%FCvNXlhu29ijHK^z1g^m(*r}jOQT_ zmfalG3`QZTV^VV&cc{p)27G>O!`l%!J&__UIIWSYorYl*o`n=!wB2jvI at RQS%;994 zhNc$BrnhhOeAZ6DLIa(o4wwC8X=TM!N-NC{Du7&HxH}m8%kw$u{V>m+4gX|sDg?h3 zHvCFRFkZ`GoDh^PE`QbU9_EkKAmmzkg#{f>Fhk}MD|{CCnon;8>^4-NZyJ0AX}x6B zPc&3ro0Q=F146a)E}LDZ3)BL4H-(x~)R=pna5J*!a+f2FFKTj$ZfQjv!TJh6Seu|y zvNpx2TVt!ItM at G0Bu7v-pjt%h2Q0waBTgG**lmV-p}5_sLBDN#+$|x@;=Ti}*3E5+ zHga{Df3&6b=cLAt7Q+mT3eK71Ij%S)+9&KIUks##G3_{-2eJRslLz_{-$07eZS=D6 z)`?J=!ph`Mtw$Zrhxlfo12^s&E%nc-&F|vbrCLx~kBS=^cX7UuzE$+UMkiQAnUZ?? zXBHuOp9uXcm%5}-t(U+-Knnl7rS*SxFe*O-6DJ`UL9(X6PxhTc8|1w=AduwvcMLz at +MI zx$KU=(jqdHU}g0?i|4n8`ID8{ki0oW;KIf!8{C??GRruF7o5jViZ~!x#^3Go~1Xb0) z%;TnU0Ja!zgUuS5JFaE6OAQ?JmB+RzZEo{}O%N$=OifQ5BC2ljuYTJu&PGk$afVvhI3MKKK6bI-Y&I9 z^hBeZKx6Im_$?{%3QTuiESrmLGxIQeg#D#SO=h77=qx6tgRx|um+9ZI4PAEzvC%}1 zet at W{#;SzyUX3bCYQ=uiUDIW at dNgm-aj0_O4t0izH)j_8hVoK!Wi at uwSx6I}IaO-g z7;#x2q5xLM at 7j_jCw7CU>tD$DY=a`-$07PbyJ4PPb;Z#e7us4CcOaHAI!R&_E5+K6 zLJHHrl*K&5-c&W=Txj1Zu=JlZjyINBO;h>&{_VS(nQ1U$&xD~2M%QS|Sy|pz8m at +E zLsYE8qB7)gmZ;LlIvf!N*CL&MyNO1{G7N$v_9V=n%FW1jcDs{O7f~NoBd*rF%-Yq9 z5mUix$voYF!UW!0?XDo^al^Sm%|91w^g__)bBZQ1a>C!DPH*RE|BOX0)T| zXMLh}iMJmRcbKE29pedX#&_8{MczSBjh~Pc7hn_k%=O|1*t!F^2DJ})p1!@1tlWM1 zf?Y~r?in at n-t}sq)9Gpvcn7BM1*78?;(UyhYLm5JU?@*=fI6`5>Rc3063f7=^tG*u zf;*iWSE1aSoPYqvVf$g#gN##KfW-PK0IpgyNuHhlwVue at gKcOcQtTnl!dIV zw;)p1iI(wh{Yp(LY6PW*!i5UzN}twxpJAu-dJEru_63E2gP@&|$A_Mn-pGB-Q)HOv zk5kn4;{F#YC2>WM(3r=fyxRbo?&W`#k~Wkri(h}rvekbhW&HmkC2aqk(EdG6si=oL z_l0_Sr@&vi4vPZ4Bd-dhR6U*)$@RoV*Aym^GMn6D-{=_rWIJf at uavP89xVfk^P2p$ zgZuQw&vvWF{ogf?TcAZ(lEGo-&?LXGSp1<(ptTPp at rPhl!InfDck=zEzzE?y`;c8@ z*!kK>w`uxaXaA@|r_JI*zkPol`{L%;qZm!K6Zp9plTuAZEjzs?98Oq_21+f3hVly5 zI*xhbKP7lDo+;|=Xo~;{!&``xk!Ue8=;emV!~*f{Fn^3$eFpyCzED%Msz7x~hEYvHC!=j{smI8W;3<*QLxx>StRM6d9Y%tb&<+*Nc0&RR*p{99>AMbX+OowBjUxOr<$zsw`Z3BAm^Ukr z4sBhE#Nw4jY5t&FU+taWd->lzG>%k8>rE at Zb(yH+PqMQv4-bj$JqIIB05nu?afNbv zA8_bh%xrV*3kx!vE!7{@e~<7dUBTPHppv2j;^VLInaJ&o)%q|wAv=<4qdWYy;0p<_ zP%WJ at fyK+1W?`<&K_(YOkSJFfBCQh~S$^I3beED2;h0?zqo zWE&-XX5LC at O;^NNB zAzu$D+nhkLEMXoq*a4nuy#5e?Fg@#=Q*4M&@n%0TO=mjlxe~TeJLNZof8`HR2UKG5 zpO!WS at 4p^K{?GaI&-B8n7QPkECqg at 013j83nka6d4K({IT#~Rtbihm_I~RBnN?^X^ zWUah$Vy7EZqq_ZEJ=C_#7Frv3 at D50lb7k^G z_6BAeDZz=3+m7j1{_fu&7dwuhzL&lroh=yR5Yv#?{D#WcrUHFWDG{kp at Aep5FrtGV zK~IET(@8|^J)v~8)nD>=LPhk4#^s+?;vNibdSb6>e{>Dy3YmQ5mOtqrXI}9p8kyYS zb-eHh`Sr#cm3y*&J$ap57OG7;loy3U#eCKi)r_t&}B zTTy1`$Y2XJ$^+HzWXYqnyGlkDnezSU1rz6PLn=w~*ZboGuFc-}&^q6PT$@RljLj+7 zSrVR|smeSk0=y`fb-o7&6Si!yfp0*RWwJyo-KDpf3vl%@Y76-&=FWS=K6?hn&P`o> zgT>p+gV(X$JznsqhzKc at ob6?(u6(D(lqn9E?eo3Z9b43;)Xt$VS2?^B4`^zvf(U#1 zvRmfqr`%T-mkP4w4$_B)`X+X46SRS)gi{!@pA=89T!JdT%A6H*91bIZ_uDb^XnK0c zrD9+bka${|z5jl;&3b*CUJwz_F~&$~KO2t2)J13UqRW=xtIK2?qK{E;nl+=wCNNww z6;J%geumVZNbxj0^^&EXJ{)Q zLjj-t62df4t&1gBa^uCH-0;;_OTmMOW=BdoMn`-hEdn*BE|s%2%gQ0&s*l&rsub9M z+QRy{wDPFD(S<|CM6&y(C}qq&W`C&*n#R`AB+TK at N80oNqc9=nb1WOmEydCK|&zf1I>5bPfJ?;dioe-yZ&jvt|;L z3b^mYx_4^cH0uUD+EAQ;MCFup^CBb7u9Q=;V8DZmrG`{ErLZv}((-Qtjex_|u5AdETG)-51K*gF0WBKTh%}?pKVn<1p%hFeGwja)ZV!3+;@EGpTQA`cF7R-xXX6rxC?hApCwN95BKqUPu4(2O;7jTzp0c?pfsro$`rh2yq zm9s5M{6#^v%1(9~M*ztRA!Bgf*&XCFA$$_I?zZsw%{l;YV`?qB`t7j6{vavEX-+Ov z`#RwyFxY{f at 2ea`Q>}h(@E*yd;tANe>qNe&ZF1!HOooCfc*elF`db!13T^k2PgE|d z2G at Wk7g;F+7LzIJ&DYqO;pf5m9TA%7X;$yrY`;krxpKupQw-3tcLCFlQQJ~Y7hnt)=evG&yF?Qz^Jw-5sIq3el z@90ZF at jJTlx#5-&mP7dh7NftZ!| zsIn?>tPal_3*$BEyd079`DNlJFJbD-S+4l`rq_dFh(e54_0|ag at nk27o)His* zv#`N)+yJ%4@&~Su%E_--D_; z%uR!suWuQ5v1(a#O>!wds&IFe7SWZ|7N;^J-8b#1?k0cMe#gnABx}^foHad^Ye;9B zOn$yWJb;TY1Nk`uw?fMV13#IBX2dL);nK=)RN47%T9d?NM2>5qW2bIqr>+oRdcHX6 zrrndB>~`-FdZ5sELm6r&=Pfm`S!&J2TXocC+Ww;aJ;fouoc|pu7Dx6c(Ru=GdKD_I z{Zk25I_74Bc%fW!`&rdu{ihpV{hm0VRIC<#M^q2Ste`92vfNd2tktIo|F~&|@XmsxS>2P8z z#ngU_KVQet(A+3M)1 at FayZL-^!ca2XPEVtluD;(=!FnNhGNb=ALxJXS->jgGvb_A1 z@#l$ZV1;ICabX#KEFskzf6f)AgvI+ONrVw4?t7q9&B?ijMwQ*2_F_=MSKbo)_Oxa` z&o%d}#`7XR|5btY$%|FPS%G8*0oGW9 zBQ55y9SkohK3cP=#eDP7(Xs9A6L`H~?uNI?KE|6FNz5b>!fFN98f_Bt>>0jFDx3{f z_N2V_MZK#=4Amu&sRvb7;t+)OWXQ(wa4QH6vkH8yjC+Q~gzx(upk5XJ2H%&ALhoPx_H;YsaTa`m zKV!thf5Sp&`Ffm0{9TLBKAs`G5r#M3W!D^95~es z`f6Q<=ApR%hlT$5mxaEB`VR|T>fbH&v2}80q8I%yR%4e0BmZWhvrj!!{1jm1dkB5t zAy{pVQLhn$KZg4^3!Tl?4TXmBU2iB)h?Zi*N6AF8L8FAiW!IhjFAMz^pbPFZ4dMSm-Xced^e$EpYQv#;t9wWY@ zQ9`-IV7HwNiROaIy25Uv=NZl0Kc=3Y*GBo3xo*(-(~1CoTy4J)cF5lGcnBGl9O3B5 zydR-&_PD4$8++d-z4RPI;6Cyv^W58&-&Wy{u0q<>fR294^KL2E7XfFlJmZi+2Rwlf zbYC2En92Bizyt2+(o%QeVi(ChPfXpBQpwTsApdGg^RYUiM}Dp;$|JQb8?^3xB6B>!`%T&1q3 zgr at S>K-<=AkY7-c2PQjcSSxo8 at aOlB!;Tc3VZXj^6i5kLZTE z7gJ+&=XZF$vUm5|6}L49n-^TAUbAj+lO^km%bWLPG`3Jaa at 5%B!UDq~hU5p3x#9;B z!l69Px5L9N_=^YehUBpmsBBm!viiq+VEczYOG+GGJHg at Uz$usNAi5f>CK0)dFDL8l zmpm6XoOCZe3XrJuO at V67vfY`mR#oYYPv#@#prSuNSR%gsswp}*)BYf9cj0oqVB%GH zTw3KYO>vM8>NZ1$56*SC_ at p7o)Kt|~$QAXdXp zJ;o^x3iBJlm{X`i8`01w`~IG0f%k{)BxbA9+d~Dm$vXSD!EX69iSj;TDhJL^nKP)j!JQu!mY3y2^f(*H*w{?98&?=H9!*nXIEe8i0b+Jz7Ez!g+!S?Q*# zfT1GxMeI3kF`GgS?>IU`fs3 at g5%$kSp(l>;we+K?Ztf42n9II8AA(>Aw*K>*&GzZr zvxau2%pV``@5sWagCL?KBP~p393V`Bh}&qD&ny8-!*wxs{$6+;kIF-qAfP@&WU)_s zE*~oi*V>YXLug-Us&Fzo$;~oJ8f{mW45w71PT=NgD=@{JCYjag3h5ThbuBzGCow0# z6_{sG7$_+Jw8LFEYSV2*)2Xs`TyWK+qf1`!??5P4jdoQlw!DEi!*P+aNE@*Qywqwk zmTD@}9HFOAWJpL%)1?e`^Yya4>P52~*yf)(sVh`9)0wmgNk=AXM8iwU#A7hgH~bPM zSc3sLw{Oht*HxLMon(C)79aN(ewsKO|MH?uRhqLRX-dMSpRva$`X7|NQ;=v;vaVaU zZQHhO+qP}nwr$(CZLX?XWvnvq+P!<6yi& z4tK4;G&N?FZnK5fbHhy=OAJ-OEq}iTMcAmtb7 at mGiOVPjDH}9BB*kjPijAzi3D!oI zWr^9=kPi0j=tpkXxVtSp5N?OAX#IUN%SoJAuq4JX==%D3*1a z3}X6ur_3*&@^k2u_LZj2>bl=t!Zr{BjCU=iYA&S}r?~VtkF4Ezn$4=wx9;qr=DQCP z9nu`Q_7D43oo88#>aRf;%I+VVAVac-X62rAAt9UCo+>xWnoePpXQwcW~m~cq8B) zqu^wma!O%C4)!jcErH_NqNpF!wuhm)4bzGIGw16--X<01jCloatW#{g)!{Pe?4Z7 zpzwG^dy(zR_pVGezFq-t#IHOZ*?NId04~WVl;q#T`TDmfhB55NjTe0oR5j>kvTJ%T+PT^ z#UIPiWH+`DF~&`6RIun! zzse&$vVRanjvNI4FIAbtyqgFVX-oEbCTBC#zK at gH+wbS?9$5fYTGK>9Nt!d9CdTj4 zSd6wA>*j?xHVRBxIF-I#YJux=V z at D;?%M!AOJFaLmE0#y{HI?7*7#9BkCFvO)!-3;N~vVUxi4fuP|zcs_IqrOffX9K$gzZV!GMgF_Q%*3N{d11SX=RmdnuJ(=-}YMT5y(sH3oO zubckMijcUO?pIxV at iAoHIfjs+I9xDS7-RV{=a_5H00-(*ziO+S-?p>sjB!#}X}a at z z!+^qdClxF`W*B`2I#}_?BMWuiD+Oy0(b`Jcv}MjG!3sXs3=3;a!B+0}sa(YveFJ}D z#!V5Km4i4WmL79Tm+2sbYbQ0?@2QC;)TD_sRdT?j6}6_vMeZ2H_g-;HZDFD&7))ky zgRv__q%rqL-&mY+3)y7i7FiuaU3IQOol(}Lb#5B=0=t-O3~~X`9wF{0T5})aBMiwf zdUJ;T+ at YD=;hE8lb```9*)~X-u at ZKpD`kYR at W3UQ5{s!H2wq&$ZO_S(rfBdCsWS(ZXsa*%|C{V73 at 5xVL;!#!MF0TG ze~;|{26|Q-+5pG2m5)4ocT=V;n at w^#WC5Jia&NYn);2j|DGg01IVCA6A!yB(NiyBe z?U+wWxKKp^1q2bH;S~g*M}#)YRw at xqq=q5_UZK;g*Q*o$R=88I9=%un?vuH>`DbSC zX3nM!BL2<&oAc*w?rrYp`-kV}6j>fnfV+=mh at q`n9NfFcAU>5yC#)KTM;rvc4$UDJ zLNBcjRnWw;90I8htr5CAx)5ugb_`EPJ?8At>v at CV;B8bPEPKP48M#AX1iDduAR1(c zNQm?qa$~*;3}lDuV3dev#1=?zs0j>ohi*uzC#4q#l7r^JlxXEBB7hsDM`wikP8X;z zyObN$2VVN?s!@7C5phca%@KzjWQTSLsz+&nm#Ai_ARw8jW-KAV5OM7Y#rdHZNKEAS zSVaIMqSwkyM}W7eM!Y)eFqzJ{(=#N;>{7L;M%YK@{5r~UtA~IHz1}z;IH*rPgs%s0 za+lx$w&+IGI`pgGvtKgA_8qY3<7+_#`!Vg+dN at dr>cBR_sT~}Mv6BeiWjwfXpyUrq z&6v#SqbL;%@~P9-PdSahAnC0hY88E at D-Jx5f;CWc$?gFtTCe!21AybpL%P(8#Bj`ma4otn(8Q z^0P8#9$mnN0yW at +s{0HgGj=fXlMtl7feAba`8%ZIZOqsb+WH$@mTSdEcemSJ z967O7y at 3uDUY-l<@ZQl4b=f*@%4o2nz<`kn{b}$BKhL__U8;@*{Vj at IFYBl!yR0XO z>dW^EE1O%E<$N+=qc}t(s)8HcZYHc#4_uLVw8Zxsha|uAeZw8*v`yDt;~eoB?S2!B zJxFnsXAP`zJj6_qo%@~Q3bC7~$o6wKO=E6W>OReVD%pV%9N?Mrk+G1R``_mZ^>4C> z%QzGw02lT;k+g9l<%vM7ZexmFO>E%A?=WSrD0E56o?&xVD>g~i5hw_^hJ9>EE0gob zYCO&&!;TXduY9a;4AbBw7c+*8swwQsibx|j4p(T}mCv6-ceK4M|8d(^E$MGwo@`h! zCg;i#G?5K9QuK7;V(H>Wf&;BPEzd^ZjB1;e at FI8Zot+!&!p>!(1kb{S>pXFsjx2ST zfty19##pT%l)39oPQJ&`U!ilPjY}b_aUz;$fBbV&8Nnl!7ely{hCjD_%t_LJk>nBa z at T*XOWx(vSP=VvrJl8m7mMvL~)VDwg`qj!7LxOJ3goU4I1Hb9gM!Jm)56*s4o~0&* z8$TO;WSMqT%tkeI=eMnM)s`1hY9++kv94#`_nV<#VIg0+TzuUG#%IcA+;XR4S=@va zpR#z0<(Q*ITGu7KGhPrvWNz+QhhEoGob1k#;AIau}PF8-yhLybG z_iCm*Gk%CeCv95>^|WnV>UKSPbDCjJFZaBUJRi`4Eck$??KGXD1)YvPr)wdBv`v;> zj1wvKlH{tn1|lJh-*a6JOz2H*hmvN_F)1l(RStk=z)2+hKyL95Z`g90s zVA~8eG2~+VyQsfL>Q&cHmJ4Us3_lPok8)QVq^7e9Ub{ltL%;xl!Mw#2KEsemDS@(O zxk))gLpM2-u>+e2Y$npr^X?r=@}KstXSTVX%R`}+UKCo&a57iLWa5}xk~EGMNE~q* z$=7j_O|8wHc~X9h+18?#-b45c9OAA|nQyeM6Cy;pUYKLTw9y$E$l_3Hm!zb at K-8u4aWJCoYd*XyWrjM)x7uGT!YP4-CCextyVnmjB|-* zG_IiQ_st&PMjV{G7Ep1mI#|Pn3!eOI<*j6EMxQG;umNmVeOY?7F3Eq`W at 5g#G9&1I zi#uqeXZ69wq#L-9(G!2@#%m7LbU**ScXRc|<&tZDZ-f?@S^`V(Wnww|iLrf3h at x@H zqD2|CyTv&;9B1B?hT$5R%PcG#Fm}Bh%T-HAF)J$gK>0Y?At$%vQR%t5?d`I4;!;N1 zvV1f!nQge1{GdJje)kDYEeCII7pj*9?=}iN$k-;ygT2>ALEmZPsbVpTO59jj*DJb_ z0L9R^Zi}-nhn)mkc`vUa>Uipj{;5sPL9IF>n)pE at 05@tQ*FN%op~LMhW({Sf{2U7* z%}l(|tpaD;skG*bJxxh0#Kn;<(oDCP-zzH)=GyD<&Sm;SBqBdu-$Av8UF1#qu?~(! zFY9z#@uWgdNjO!*p-Q(v`6B%LwB^KsfcB4 zD{JY~mUc&a+|OyK6H|pwBH=uQVZPnglNqkdFKp$Pmc<3m$>e(i?qGL70I55m9*RNu zgA|Z`v-tEwRLCL(;ol9y_4jMEsUzMMRGajcJk(mI{RM|M_0xi!e8HOwn8ghvpA~k^J&_`vTyhUK2oGj)x(vuQrT* zQM)F`Nu9Q-B<`okJ#_KY?aN?q7Nd~}BDj}fu>VX at zk@Iuuqp0Mp_q&R}d zNqm6hOn-5n+i(LhFvml`mW1pZP%*PQGxNV2=$R!>Kk}slpMSo=E;|wt|B=M~n(TKn z7?s;9DF}w-ryaCEbZ61qq)hy_r_HD`w>hdaNboQ5RIp1pje3 at a+!J80ZBb6|e+2y| zDGZozio4bZ;v+w7uM95cyGRMyA3U?w>Pb5EQ6CcJST~DQg`jrEOd;igPG at SlmDC6} z1?nR>jDGcnJR2koX|}Bp$*|5NBw*QS6s`1wm~}Hj_8&=Z%w~(Co-JLBb1{lluou_R z_2jylhxLz1u1wXmg(j+T+aO;1-3?EjqYsBKR3XVPjtv_=2DCL9$9T!IS`N_bM* zv$xd1304Q;CKLx-+0BjjE;&fftL&(xVBT7se(@C-GrUCL&P+8e+WM<&ILJu*GKS0h zC5`fZRMGFbar&lK!8{F9z6RS?pO^IGR8-kM)3hfz-wS at euoms*bqhz2nxwn5zz~bc z>_=lHv9;`alI$b>YGUk7?K(c|-Dg_cuZ&v2tM8sGBrjUQsEbT`IQ$I^d$!s$mu9*^ zZjwP)>Zm(viX}a1qEj at JTW{I+`B#B*>J1k9IgM=Ri_zTGdPS{d_gTu0A6etH+;ZWA zLK>b~8n|OgU-jPo8eRK(@0eb^)v7K1+z at rpwtVrn%Y%JsQ{bP z9w_1orrZnZ8J(B2KX|{S|IAfeo025?gE5gKnU@{<|U2i6cFL(v!j+7 zDl94$N)E6()fogsfE{st_$)r&`QO)G?{2|H)3G5hejSvk^VJ8anfG~9khj2Gd*G0_ zW*wxc at +x;xvK|yCAuoiuw`xP(uzWdDV=VP#3a*iU+mw#1E63KA#@08@`qY9Cw17qH zD)xafsL0E8<)33dgR7L&@;vN?sk5)<0OzeZ|(N!~4`=znErIwN9mSH&b&_ zy!b=?R#3eD`xBPA9-qw2g~}HAvytBIGlhO~2p@^Kl@@loC5JBv`mx{y9gig~G6Khj zAGb>SlPqJx0cf0b!CUKs7mm8}n%jW; zfakGmOgZ;guRrlNpMiQRHrWakZ;g3i at Wa{0+`W<1O?K-px4 at o%(;FF2t6N=-X2vi at 2lZ|W4#k(xvBmbVhivsg1 z1f#+YSA{8kqsTFadq~c4gY*O9XSFcr*>ms&l$JvhsHmd$!DI&R2fY#Xb2re~1q`FV5Br_9G+#4y*K2CH*Cq{?4AHRQvA!3O}3uqeAmd`zhC)knQ3^ zogC*ZyVw1KMTT2%{Tva6Iwm=OnT2|_?SBsZbSt~jAMztNEC+9Fo;x(>N#@3LeDEw2 zFptdC=sbkR?LRRw_fyjFXI#Z?jrz)lq4C&rV`MH8=IV1WDEEieupiKWsp{k;r73BY zg?T%oCNzy34=Pon=%~nRJnUm_G>nz zb92QPLi7Mtgbsr5mAR;ByZq2=Fc{PX8Xtu0WT|v-rSw}!NoPDdG%Rji1h$LSO3spb zJymKnGZ6Y6yA|^?Nz8PNYe9%lhht~PthN_)!3l(}==_2{D}ErYgkO3R41sHq)H)@ueH9ook5)_3sKKWr3(o>6) ze+`I;JWBP%3iDD{S8AqLV{4`O#7eQrg|ekgZJVhT zYo4Xy#gI!G-IDBXJ?jaVYwI5t8*UNSFA|&L7iqkZrQ-%$k!;6g_~0_D+b>kjAM3i# z)$_D<%IAmKTDkUgU+o+VyN;19sl;3?OV$qn%}Jd)3m=@eWYhF#YBydu;aN1XUO3Uc zePL^~8P24cIWiI5Uw}mV6=X6ryl(@w%yroPzg3{}T80AjYl(_{i zsHNSNADU8 at 0ek35UZkb1DK~{I66YkPsVQL;sT8ovR7zZ;^7N&*r7OagAxlg<5cp3h zgZzgapUveEy$vwY706b~Lsy}w9C3hB>sGhCT3h9%+N+QC|Dui}$@u^P0{}#V0{}4m zN9yQ5wb6gv14H>PYcHHeo6?OXNUt&#greH3pm0(w7{!1P(|4gvZfe*i?basxnFN;* zDIyy)_fNT(=~jVarLpBQKh^1T&ON{7-}eW~7*N8Q?VwKghEmzF7XwOm@*KF2IBo=r zBY)s2O^{1FrW|J(XAXPVP$sMEI;zWx6KHn|<(Atb3g%XtO>~51R8ab4y6il~dAFTZmQ+WL zA?6;-unbp+X7NPWI%S at ww=zS^DU5VYiZu3+<}$m?QOns?kX_wn9N|14GZC{Pz_5kE zdL?93XE&a${|g8s$6Ut9p>|g{5uYc_;p3e*)I<^RIE}E&-b0QrkPN&&$T<|f>LQuI zs(q3Du4|Q?r*C^1+h#<*t~Q_U`eqgUa9fl0rSkHlX+%AisPxMeTq&1hbgU&g*|RL{KHpa;X@#Lgj8mcui$TNBAEPngHw4!sxyXE zEHYSRP)bI3ghJc}<9dv=Mt)u`l~s?1vw!H4V)(S=^u zroOBzw#g+ID8mdlmL)$W=_koiOt|^i&j5}e43frQF+DzfH!<;#n3PRr!KF0}3>9et2pW^-VwjG9;PZ2{ncd z1OT7}>fiSQ{6{qX*WzabhwB=>JUd$?K7)! z0Pj+7*L&_I_jbpbg#Y_2o*$40-WEpu-U;YfL&5-v{naU%K3bBdkfd?uSPBWLJ;?(U zHBvoU!YEaJ%|k6!BfW!|;li(iJ5w6T9ki%=tB<%qMMk+(XSSRlq at XcV!neaMQ-4{haoQPLn%pV3BoqWi30_c6Lvt z9abw-quHvev2=@T|07y4E{n+Y#dNv#g`GwHK+9rErkpr5_l9h9-xhfn0#ScGoRjhT?#s=sq6F)-i|TI4AFf1O zM64>!`Te~<`3z9DNXy!Yur#d!*%C;9 at pc)$0b$ZogWQ^sQPP!hDNrmu^Eg&HI1`G8 z#O0gJZrS80!R;m7T&S}+t7_O-rY?)DwCbkP<*-+Zda&rXr!qr_Qpd{;t>LX=mN9th zcc%z~T$$}YU64rFYRmN&)LiOU357D}nYsfEISL75;X$%FN)Oy+sJ6SXk!&cZj6 at G< z0&F&RsGCDu(Axvu$QP8JczBRFc&U^i8sti!&9Sh7)t}XBB-X&_A5uyr?%^j86TQWy zV~P`16H<$^d)!?|*XC0?Y^~tu95>@+^NKMtZo1?{wc*$vb4eN3DjT1g>d0z5>7u&U zPe8stisBaqGm!l(+<>p5V_?`+nhZYBcGh< zRI?;MOCHF;a*MVg#CM>`otb)s&V9xQ=3P;Tq`G1gV9NuPS=2n at KuI3qW0m!(=7V`l z9&w47P6_TF^yx34du8~XO+fU^;OI98^WW at 2%`ItzocL{5!(*7w>>^%?*Kof)@SS>~ z-+*cr(cdJ03&!zX3GP9M(sZ2pjzq<0SP_oFF;Fc)e-r?-t%7Gm8PFT8$qy1^6|>OI zeuBR7Mlr_|R0E3U$iOp at IRuPAY?7^;|A=`#14OkaBE14Ky%QHDh9?edETya(MS0fc-v(@7T=qAD=+Xi5r<_U!`ocvvpnb9 zT};2P?{DA%I6W(g0SO^dJ1D3JDz>B$o2m^Z!>SE436Qh2{9U!i=>nYSy7>Zp&bT`` zo12fIv^S?=+f3PY+pQsz_7g4>8*LV#=A}m9>d|dKwKB9wyLqP?gM7nf41QX5;%nd+ z8HSk at TJfHnmW!e4hc4L(n at wAX?lE5JI$?!GRptOgW1Gw?y47?{v&*(0rnvcLQcp6E zZd>}OXHkB0KBiDZMyUO2JoM_; zBfimAcp<#SxzU6wb)Bj5j8aLep+xmL{Dej7z~Zvk0Bb at 95I8=xjlYr zVrp;6ye`~&La8(#@XEo0b`z at HFyV5;?!FTiY9bEzc^94`V_d8<*OEJtab+Im`y4|$ zA*pfNox)@8?>7U9c(=)h$9y)`9s`CkRKtuGpu_utr{4@%oz%=+P>xwrI|=GUizt96 z3_C1D`)iL1%P`i)D1oM3KUBNfk_|3ea!KD5M~~8mVGAstq$9tfN&bY+8@$y=_+DIh z3eJOE2YN+nKDeF}M{>?2&%zKwC%7k{%F87Ep{*q;*Ln@(7#>F)g6AEQ at t2mM=p{t*;1m=XL)_^^E&$TGbL7J)| z+-`<%*b`3nkl+^79h=-AOkt9Q`ic(%vLkQ#mwToeh-azuU;qFr2mkRYMFPr zGX7u at Cs-@Z?pmfrkYtTt%+#}1LaxAFk+roaWG~z-z6cRaItf-2V;xh`K6BT{aD_WJ zX)a^nPg~*NyekXh|5zhf4JPVFBkBwEHqaBGq#m(Q)=x};OtV< zoL!@O@`)P=TX{;VQNVof>$Rqm8zd{Io$gXGVc0sh^2D80%ata3m=HL8(UL{S(Uq8& zo@{g-lEqn+z4 at n#dI*IS52eE84_8cNI*9#NOrMDsA(0=wv?%cIg9vl<{^$WW=C(K6NI0rVz5mP8Xl z1>ZVKt}DGmJ=WVt+*u3dJ|*QupkbUgm*fPLY8DzL%8=nTr?r-`R2{gM{6wf+ysTt3 zGUW!_*%^i_s_BfYCm|hFso at Oy;KE7~wW0YKZK5aBlY?Y8 at pS=l&ZtHN%@-oj73M^D z8`k3)^rfDs5x!~z^Ojw%_Ux>J@|Gq?Q0qpyK{1;o50SxQ51AuJQ27A5rDQ0t#?bd2 zCG3 at VHo%6_aul9eYtS~@Hxoy9Gw68=542sVyx~7TpaR_^&`^3K(olM1)GOXYQUV2z zjTc21+C6O~da8F=dg=?|yHH|{a!0VB{f~qZK3V;%P zBcy<_2WZDthgKyPcXWs>0gDd4#gb-8ss*THEo}->yBjRCYYb(lB~@k!i5S8u;8THu z%@MHeH$9*pra}8Y8in9G`YwBy`)*NN_QTvBR&|=zk*;i^9j*!-$?Kkkaqom{X@?X^ z8L&Cx?%P(Pfa++WJJ#GmT?&@r8{+5w=zYQ*9gi3vO at op>5hdRWbsvE# z9@~@*z-F^|LtItF+Qu)8V)2bms-`$=kT&N3SOtxJA zll|hvN#j4})7q!^cRlBoP~E#o#(Fx(Em##~IY5I^=8avZy(!I=G9x2+?~rGy7n7(D zT8QhAj6$gAhP-9aJY-=>9BFQ(Z&*B9JC4ZCipWmz2+c>3o3vN}wSU$Y9wP1+G%%$8 zgmrxLR_r97n&Lg=M(Lpa4bv at s%?3r&BjisrS>_%(_PeBgD}H;|GiL}a5v};f4 at O<2 zI^uNNk#w at I@aMojcC--}zS9|IPd=9Y>t9 at czJLF@@&CK3Gx`r2+SCkfT>n3xlGJ2r zdn84a at gH;w;Ncbmf~ShV~J0o!W*|4d3`kpl;^N^ zPod)lwp(ou>ohl>PTEy%IdzL}Ic=mcO5Jg?Lro&n>{hO3wz#b0^`VT03^w_F3H^1j;Yz|#O;~9J%LOw_k6|Jwi+;PoRi|tuf$+JRqk_te3=b&>1KGN at bi@ooFnJ z#tdYan6kGzWCjX{VD!l__~sf_DbKiIOuorXN|||&$i!hf!{{USfe1Z32KjiQbaRTz z#c8x(`kPFf76W1){8;ncLk>&O|E^^pz!gt!JDuQTiFU?v1AC%(2C&5O&?U4<>~Q20 zAVhx;g~?-pQ62vF{}-)BL5I&T&UIeDo; zb at TlEoUeS|#hm}k>j!aw=cXz`K)vwDD5Nc&NMoQVXqsxMgNRrCO^FwE5XCK73Mw`#b>8JCn52}<3e!@8RU^vTT~x=wx9(8{_G z|ELIb&#R6`X{*<7fo=g%c8nqFw96|-nwCfj_E)x7yB+A-b)sraTWz7OdR7(0dYJl4 zYZZ^hHXS;ei%o-~G!v)ll70HCgq4*?WH7U7Obbq<3=fso-$XGz6%ZF|z&CeIf+m>L zO}aNw+C_0*ne?uD?ibmr%PH5S5e|zi9J?c8UcQy7MEhgyI|Ve#6&-N&U7K3Q5FZM~ zU8d@}MU7Oy5OAyIr*dXi3kubTC1EH#DhY$Np_;J77{#2o-#SLmFbNv%tTRM(hM~$> zW(w2?sf3%H3BnrvC6ye)3;SiKD*=DV4HaOZ(2~q5ENQ+O7JOk_{xF*$i@)KwXPdp5 zp7Z7~(#IJ#0n1ETCE;L&e~wI+LqF_!3&xUC3sbWK9sc6m&}IsX at Dlu`!gt((eg%2} z0%n10^Dq*C at QWtFJi`YtCPB1WAT5M`*)d at 4@E11-9D)glKm_3n;NkdWrmstHrE(RM z!dp$L(Hu?z_X5y+ub{{Xc^d48ZpO*MUJyB?%0{ff+=CLmCiq7rZzZeC;|KfYN|64GY z{_dw3|IG;d-)=nrY=DOAy>i=(($Nw{Kt%8YR8#3$(5eMNDk(r*0^gUrl+()7UD%Q zpwiwE$8bG&Qq#O2G}6X>LE%w(j3Q2Dw;!Qk3RSvh5cFL4Ai at HZETe7v^$>69>NQL- zsW?^bQai1uZqpdAdRehyrn0U(%Lrum8*C5jw0ag3@}Wzsl-aG~l$%2Yt#%tFHPR}) z#?tIP&2n$q&9oLd!%WPRhQE?UrqKbXZtYIpraOTEtDe?Khi#~Kfgwgm+-9<7dG||u zqIp4cB{A$WZbcVnV5jt4ZQ`@pT!|8?uJ3{EG8ZR?@}&FCA|Q@@B%Ep~k!9KU znQ4uqZ^21%k?5R%LCgs<#JE9Em at _5KtWfWh1r^z_$ygmr-#m2Pg=n|fjvwcpOPCo0 z4sZvz$BwnxYc}12Ai9d~au!4psY*Mf7pCp&aLyO+jH+=A*JxOJ(A9fY&(0|(`Ka%a z$EIAh;*Psl8||h*J5=(Xh+>uti|dS|>Zmpp8N(byQJ8c1BF;MPIfD=+*Ow^;9j(J1|3YWJ}c`ZUScnr2!zt?a7b zbb&VwBPaa9e~4U?h6Q`dZ6T5rV at i4hdX7v%00SatqUv|xbb!NQh(Jt=gp)>k{75V& znx@!%cZg-d(uDTw1+6#bE55}b3 at e_)q2f*!=1v#3J|+0#B7 at L1@+){nn9RI_58*c= z`oKM;jpX-_fdI}`3^S%6#0iyahLtR`0*S&3t)t3NG8R0Q>{_QBhutCZ5wdkm*g`3z zY&JBKfG+ts$VRs~S4?lo}y5<*KXSqV#Po8e%4U^#<{E4rKTM*boHqiA_H zzE|K+#WC*g03g=D at LXo+vpwhAPUn~PTYP>%oC8rbN}f3*Y|ma486L*_6_G?jUkY4I z70jejrQkshH-3n)(Jq$}O$+u=_sQ%i8uv at P=xVT+626yMv4uoF;nP-R4|Q}RgNaof zagXt+kG_KJFR$s=+P2HK)CLRdZn!|DB2JwpvlS?5*k5-(2V<--%n zlP1MVB;&H-FS(j1k~N9OR}3f7QCjp%-S0^4C~n)!o=ws!sdL`W&e=LN9>>XsFFF^B zR0|1xB~AOzaa%-)+X=^=0PrQ(2zT13Pn-L~MK0*nC9Vjg8=*E_ybwH8lMAoXJJ}RW zCB=IfeK>hN*;Bh6gKD{5^p=K5r5B zq|d+qobN*2EPv^ry5zqFs?}Y3V<6TpWetF_5$_BE9a3$=UK#97C+AVr)?mXvL8`0;zgV%xFdl4Wv9%On6fsBM5H%M>8kIF=Q~yVok+(jFcoxtLL&p zwrs6rLhU-uSfAadi?B5EX2VPt%rG_Qht#yg->^>=nJ&)IAQ~&OyPC!mrFDtvbxa{_ zwJ%u0JvG@|*=olE%`dCK!92sJ)n!F}$@tou$b#J8;!P37ydtCpK0O)ieQ0dVnYZ{DcOPKAhtySzOIh7%wqvh7AtK!0 zFKiiSo*GeS7SySQ_L^6Z^t2E581kr6`9z-l2{E1gnroIyK`!f~7<<@_4nEg}z~eApdpf$u&U zb^`PcI}rW#1ZUz0ndweApKwcO_C at AHBA;-2F7pgiD4!5izPX=36=ZP;J_KW)AY6Xt zW2{2{ipH at omeMbj(?5nn-}%Xmmo!gb!$}fJE_aM~gS^}kjc`{?ro%b1)uSD%t`BAD zK4%bcs)NBs z*J)b>gV%aG&8Au|DKCuxUJ=MIkt zkX>g$HggCDen6PfhnljAmOGLn at BZff%J0m_zx(?mpZ^=k0Xy7t<`5VY|1?pEIi84* z$^aWbdNod?b>uD*<0fiwe9P!14?~NIi|K~hBErhDmF1Iwff6OZY(gq$+}MlJ566>O0**df~R z?1K~#RMVtuY+tD-ak$Dl5 at sx|O at 11a@w at 8*>fyGFK4#ec!lE08*<*QYFHfNW0xlQ!INt8P zpkeT5;=Sb=M0f4B=4r}`v#G$`O3kl}??qvz>c}uDe{whUGIq;q`kdMsrkr!&OciAO zy71L0u(_omocrcxmQ+Y6Eu2(XcXNhExz8=XNreU5>1CK{UTy)d)J54k&Z4(D7h9&Q zm6vu5wC&(RVLx2bgmoZ|Lahgxf7*@iSWCopB?V z^RM0Hb z4apkf<3E3Pxrp(ZD)`aOcYy9GKEugnTi%|cQ~Iy9Fu*l-d-E_N^Qs=8r+M^m7FCfJh>+ zkepH*Q1ntU>JC})`{S??{gMON70Ofza-TV!{E41GC(Hd~e>EEkZ(=0R$x5C9ohNvO zjzOsnS9pb#j7&}$OH|7zNFFla?ck!M$m$zXa$r+MtY&*eXXIH`7NQ}?Vs`zwRw!20 z at QFQ>&xC6^LGcS4-5WfQmq;b5SV~o~Ag<94+38bcX3}o at noT}cNYpm)KL}kwqJ(u! z9crXLD63A%JJ=(Lp>x$J#c+?`NymIti|oksU=p4MGl+&Vu)eLJoU^E1B*?dvX_UYbt88<{eFCjBidH)3h1knG>J3ZqB5C zlQVCEh1MMV`r92ajo_yL*4!NJDM3&h0WzH47{A=a;pOtKkevFL%XDOVw^7D_t13C@ zzi%VL@;}F<|LlQEv1_MM=!`^1DU_g}3OXXSBxM9a5>`Z(!1u|v8)xF!wQbWj@(+&e z4?#z!|L-fJ9%h=>0kNdnyPSV!-EW+q*Kcq60cs8_A%UkcOA_%18K8(66j>bTh3|ZU zsljZ3t6?^Y>zr;yZd>WGmJS0AG%C3CrtQ4+lp(W6($2PA_YmFkmCYnnOQ?fk!%9C5 zyb8w>b{?@ze0r#K at 0+%(p#AgLQ3;V%=MSsKd at ElNGhpCM!U18{px05q%Z_s62uwJ~ zvX3cAa|ZUVs|4CSx|6lbA;LYoYrR_RIs at e|ZTh?>;yZR>OPbt0xzUeKhOmny+IL|w z%8W5#n9YT+T7SYg(aRM!_bG4Jr?5*bZYIm7gX`pX-ZXxEo8pYQiYRW_uGOD}rKm=b zZ`ECM>2esabV0z|iXZklTsAU!>o2*Dv at dYR-%WKFy;g>3*A?}|yJmF}aXeswtrN8%T)4^b2v zlhhIm!Y5Fs^#!2z6W&L;GK&z+BJdI1zJeWsS0O_3ynDCSsH9!W?Hz^R2fNM?Gu)nx;wfGkT>~8gCrT z<6``fli3;L$t5Q)c5gtai=J4_8bP`-N-BXIicuhz^&dhqQ#$<@%NxD(P#2 at WtkV7m ztg`-JSq;iUk%So>(O4;w{mUwyF(%VrR=Y*Mk?G0y7DisL;+gU^*RTwXC(YdFeE#G* z_hmAh`+t2u0}o*3WiT}42&0W6!W6RrA)5lfIDzc5Hy91DHB2!$PN)X%DfHZr=DBzf zV4zvWtv7Dxt*Z@@H6M4nMZbjXo~d9mWiO=;q75rKGW4#PNZ5OOqxkfY>E2UawS?>+ z(27oo%sO{iIq6?`!juL3ZW;pwKMlEt_SbsUlS63AO`Lj2L6SGP3!_fJ-9AHMmpEj& zcV9$|;j-UZ=FqOey%M$$3s8BdyF(-D(e{!?xpW&2Fyu}cWN=d7SA3|S>Ld-D9h!2xX^jzA8O443`Em`=mTE}(*0q+dj&X%P2za{jO&?dwt?nkY zk2p`dcf9etvCe{@>M-t-qMm&BxensFm-nBf;{1cuhCp$&GRNrw-8^a4 zWI}(xY?r*?=f9*z{&pGOlSGB+uiOqOqdFJLcgOabT3s?7Vt_$)bvM~2iU47dL6w$F z#p893&?uFgQ}WI*cO5n-7I~uIr+n18sXg1v+ zMopGS!1)94r#$R7vlt~CfAcdO{AE7V>G7n+*Q5LHIWi+Rm(rDh(S z;nHl!Y at +o|s7cvUO1=mGp^NC^v5q>`yMJ6a3tX8;AC7sFN@(xwPQi!Nb#)(cYHyaL zf*DSj9DQ739!!1In+cKSB8cnlUCt<&QoAJemVX=^D4pJ`kef75zLj59d{KA3$jFV? zpXcKpHADv=n!3Q2iUKrw{V`lXEXaX7h_rOzT80&m9l>Fk?%XlWnD9qfXTo!TBbyFF6JZVDoQbI*j#fk;3t(Sxdl55k+B|?w zbAqlSB&ne+vDkNHiqcby%KTu54HBGXB1`Qdq0GlwKD-mxtzb?g+n7yHjo2TIDA(0NXTU0|u z<9y2@;l at g?`pOk2ZtF-uK18F+SlLoS(dQ?uy+Tp41LE_f`G5(Q_^+m5GvkLnO|02{ z4;Y3qg*r+i5(7zK1Pyb8MoJzN?n9j7NQ8!uA}}Tk09F#*6;*kb>>y%%CdeRspl2-u zvjktiUHK#9nhYmMfI22mY{Mug+wJAHFhwz`li}j{y8BUx>@Y$bLU{EiCTPa1unc9` zbuk!KR at J&Gb<&p|aLqHR zrxHnTq z4t`O6;e;df!D9Fzs^k!EAzD3p)HY~mJKff#_5g%iFkHue$Ju>;rgf9(cAb-LIqwtS z`$sF1#xD9B8jo`!n4 at r{CaOXMqO=~+`HSX*o+N?0ztiiqWop7+*2901#{Fg+u+h;y at Zaj8w zBKBp`2u9IJYSD;#(TJ?lA&%1F=9ggfy)~-Y)i0zC=>m1I;O=0^Fo92`rp-=Y$RM_? zw+rMAux7u1`%4Fh)GP$=ubS)qhz$YuHkQOBoqjl(WIEbCAplsfQ#p~@utvL at ug2N4E)Nb{)DFfr-}N>NMuu)>~To)}=+^Es^dKn_{@*m9)_B6)40EXPfqyZe z>Oyq%19tkm{_WVfLCz;P)(Xek(dHp|mLS#}*&H;L zG)8ZpYRr|;C5a=zP9NLO;3!r(MbDx0}}z)MzSVkYLXIK6zSEO zR6?kAJG!yF!thHZhYcqmnf*jQh-IA7)mvC8oG&@Q-nyD%`8_o=^YQ-i$m36DOxzX) z#Z0Ubmp1`zCDYJ7Bsi)7R;o9lKpux! zIPw^o#|+{Dm#xPu%1kDyaek838>Tm5LNc^lE{=!03>Hz!XmPl>1sU+|5Qr4?Ax>yO zWf at RbX1<#=D;>G&(qI>1jcbujQ<}HX at 8C?t>5qT_n|p*tQmAgNvd5Ye$vyqj;6R<` zn%Ne)nyw~V&NtYA)9z0iUZv$g)0AcPVWR0ljHN?@6ly1iyX8 zvEr2cJtw3ezNtBhJ)7s=M9qSo at jl(wmbS~}pXHof4|PwoP2o+hM2D`j1F>>@9|i8T zik+UvlN^!bHo))vb$m0DxQZMS9UQgz+JR|ZcBT at GaN|g6 at i^wwYvuj?Rr) zhd1#qd4wTNf!_dBVFy&gCADI7=3>dW at nQ@XHDR0Oh-)~oIR=RaOAI~`9E_5woxR#Z zQ1d#@Fxr3%KXlyzCt$L#qdq3(dRCe(7uPR#T)W$zEDrxb2PQ$+KUw_z-IC_>!n5>? zuDwqOpBPgV){0JT8{9>awNEOy+{{y-U}Q3jTd{MrN&N+i^9~RB&s`%0{=9G5;`xkuw zs!$q_ at EK|3{a)!M0=zrX_7ELIA7+VtrvE5U6}gt$B3&hqF`KX>NaH-66vay3 z3$QEDCE~XLB7ewI_MnG0f+GzSmKzS&Sev*~U#M#t5>rfYD>>7t1=^HRToIPM?kHNA zJR^2ntb+haEq>xduKzCd;T8WCZ2H|To$N6r=efEYaF zT0>6b at 5ij#oLxWPcW}l?RV<{buu*GN=93Pjks#YCBf)_}%5V%a-jq60qRF}D+H{y~ zBHfL}r)HT!wker at cG;RvpiR8s+BVxoIM-iT8PWjH9Yb%cIAm7KEZHDUmK)lX8Jj(` zSIKCVhrE4sDka^edaT~{6FUJR3AXAiXqz=@yu#MYEn)7I>4zGRB4!W47*z8BVx at 7c zlzrqOo=4b&SB$JJQ)sj+yqP(5X4=mVMLH)lX_`#ZbB6T}Q(LPTqR-Y~qIp6{MpTAe zRYP_f(|JfI1s-4rsK3Rxx#DHZlW+3{$J`>J%gWP;EjhfI-qPe<7R*Oh{dId3vo_VQ ztsJe***YZ*L0uLqw9_`6Dk}vH at 9lyjp2BqM%8k_N(f9b8?)QD6SWGo6+`wnE5Plsx zE0-J(VOdt^>Em{|V~U9=+YNZ}Q&!}P#%E)(#erD%D)aLa9geCAZa24UJc!vi^|>G- zh;0Sbp4S(gV*iI6u&2 zIbzUZrYjuOnXbDp8D}i`JY<|xgHUzAA3(cFpcu@{c-X8H6z~Iv*=mD^*ow+;f at 6_? z7D8g%2iI^_qk`6_X?*vmyoSa5ApAIJliM&jSV6oa^(lWK(y+Wh3|Mjl?{x=~JOC1j z3KH7{yNKN%_Q`FL at N5#J1hd#SXkjTqZ;{~<@#K6&34MYQ2a!5JU!bWTVDk4)5x|#) z!#I4jpaV011U?knbkw74>nzA36ZCa!_NoqEBn<}WjwmVx}9nu-i>m5CHsm?``t5uAUwD}~km(a2; zg3 at _Lgze=pIk=sUS&|E{9~5Yb&wE!)s?Je`h(}aIJbg zzSa7HR2_tJs(24E1;ido?9XsUP*S}Z<0 at 7;Yz>#fPT(4qK|h+|!fYwm)$BO|)BYsR zk5^H at 1QNB|rq$e>bw1XdW82uo3RY{S+^EP at FV6G8vSSt;%juX)HJ5DDH(7U at TtH~G z*hJcvlyhtg?e->OiA_n|68}m8Oxmwv-k6Gi)3Rg~p?<2Fi7UfO`OMqgna`%P86}mh zFy&xt%;y5S- at uR%8yxJ;J#)CE<}-u(jDY1kFNl{vJ-<2Qm<2M}*r2vz4>zMpHXbYn zAD76OrdrB3n`z}=Vw?6?nt3mpYi4Y^ggLorFzi8+qQ&mkRVNVUe_tM)-+W?m%$e~_ zDKTw^{qB~NVBm1h1lA}j7+a3%z8H$)0$o5PoAq4sBC-e*i= zwDkr!cJwLfL!vcu8LoUqyW7+$r(B9&h&ubq*Gk-_k~NqVVX>sj+b0YWtKuDAi&+xL zsA^qMqc1(Yn%7<##mkwl3JLvYr{W!HgBJS>PuRowCxkpEy1eQSh+UQ~Za9*`>_(^w zd;UBY^S;Id5uD9s*={l~W(Vs9iWumzVzQX}OF<(X)|&Z}aw~+vfy|)NhB+9n{aNGY zZZmvl2~!7L_&jwgQHPyzDlg`V at ErlAU3*B at H@m7#KX23kiG42B7_`Wboy5d5JY z{0v}iSAvhAh?Sy0DGDSj7COg}m%BuuAFD(Za%{tm0bEC3>+GIrQOEawLR^?q&k at GI z?G5?00h2 at hker6Tcp*2C=UvEEa}|3|A5mdZJRck*El#f(VXNJScgF&ZzGKr6a|F+}W6|gY>kEkoR|6Gp$b(6bV#YTQn0oC_rZN&vO zy-Q{eno{{W5ET)1UF6hQ2-6UB9qJIO(~%`Yr?Uz#{_6+>WquFp at E;HGw`>vFEgAb# z9<#EYZhmLA?)+1Y+5T at e_Cy*f)cuDVCsL;WRpaD;s4?Qk>QwLyBEz-CpNtJ>cxAe^ zl5v;SIyzYB&Q4%rTH;+4ks7N^D#y!=*rIcEhMJke3T-3 at Y{?1dR(zdIn1`8grL?=8 z*<{B05rS}j(I#87<)&(4WzmXtWbkMKz7bcr?L%;Al6gRwiX+gZP2?B92ZZ}4MCk;e zKd^fc>rEOsyvu5ZwzIZEO|A(k)l!pgQf(0SWn-kk8ukr9lR8Vyl!?}Omd8~_pse$) zzljjq;<3ZyhvTp#4ykxTX$FxYpBMXMjF3Bx at ft^LG at r#Kqx0rd81lM3{Zp`jp1 zLKB_y_46D<49*cAkqzFr*@fI0+`!^e1SAPR at mUN8`=lHLSdpf%%pw{gaRJ+X_VIdz zNzS2Ru})Ec&=;_Aka3MS8qjnSaI6?a*gYqV`-)IpyWy7j5cY8J*HLcoLy8`+qfU8G zkne^bhO#Y_>(-4E=Ti*9y at D4dG&u!{@@K|Hakh)iQVE;Rf9)Hja*lVH#Vj{;GV-@< z*nMorr9jG>MD`yof(t+ivAMV4UzlzK_j>;dA&vQs#(!)*`ThR}A?AN`v_39)qT~c9 zte_K1K7?T4qU`frp~yf)qE5yg=i_Ng*XssXk&HDI_ at 2n2XA+!!%y zI!w#0|8yy?kP5;`1`=r5ZF_}6mmwE)W`7{U5?oC)OTL=`W0wx_&|;kO8h6sJ+_|2% zNp6&WFp1-MtSIN6hD>hWgYh#(jNeh%TvnL2H0^GXMz7g=HqeT?Op4k6u*erzr>U4` z!C4Z~QO3*RQTHvF8Y@}0HqR0ha?$0=nNPYagr~{KFj()<)H$4qX|CSGx`*{-D$0Y3 z2*k{xq1+1zE(kOsCG9fCyps^?=d at k)a)p7DsP%9Q#T=Qnj1N`^IGqNVY4G~30AArz zWhU45Vk$B{2K6x|-~VA~Ur`QtgDbZj_^=>RBx~_-9wL6kWSGF>3SC{N5e*LcsR)uF zEb^5W2Qpxz!GR(c+vGRimg)gkC3s}EsJ&~77?Sxxq-F8 at Qr{51Fjnn at bBLHljKNmJ z)xl%=xB6rY3h@${!Uq2$=$q&sUIBl>V0rCb at pmMBPLa9L*f`K!#5=zmA@@V#AuWCz z at P1iBxwm;1hLz1TN9qr_e7m at geRjFN@lku`1c~N-t>ST; zwjVg;(UPe$j8_HXH>7Z z7ql*H8)U>jh$IX^aee~LFQ&F*OEu=OHF6LAuAyijO5*PglK2vAgj)#MgvzA?y!OwHYq34o%0Qs6I3TF zu(c9~GE5fqF|~%}T2?uTyTg#oTq52}T$Ec`033xuAj49Covh|UrYJOLWo at gK2`wMx zB>06WjH(Dmse+ox)071oF!C=l16DR z)BMAcL+gog^QyZayvXAv)i{zIxdHIqmav_g6uFVzzmaWo$xq)_=~(Ep=W_2AS1nga zw0N;x=->_15-*RTjME~vjrNjfsIhDXSOc*ZNB}5*On;-M)>U&)GfCTyf3pWJhT0d7 z{WR4a)K80fa-)T5fK{zCqKWEElI|w9jyV093r`sdOu1T%i#`7Y9Hb`&%2vFZEY=8^ zuKCiab at 2Q`GTYZ)WEkXK6kr_}6cg913$f+aY;)3(9d~rRJcjO^;ixk0E>L_`ERl1* za1g9fazMTM%&}Hb$aXg#LCgHZ at kK4< zho&e5&lk*%3Gk|q5|+}cQG5dqVwdSBSByBY_z*=^!Gv?Ul(alq#N-xtMf)^y##w!J z&CPc7yCqhV&b-E=Zyg?Cg?#NfuS}C*hrD~8x;VV}pB^fJWnWK3K8#S8z*uD7cKBB@ zU(yCchcsX{<`@`=>4XzMm0QDh-<03 at LHW#zk)D-4XcfHwjzq~6bVHE at p z@>r24ApN!#?B2x8YlF1WVj$q$EvO=(7dD&0EX2Z>w)*W?fdwc2dpx0G-Gc79B&Z#EVuIkIIpNj z1hLo(zazHz!1$zhWI at u&nIXbD;&l5Hobj!exDhH17 at kqLDOTe{e4prSy2{KGz at lX-rVY`PF4Y0B58;Ohu8ujTD?BN>J#MH8=hsy z;7!-Xukhv$@?S{@d^gT{{;zuf{Hxy5{~780&l28vu-^}nRL at Yn+9l1I{Wnm z;Ao}{d>CRGd~g=u-8N6lQB=MJ+`~;SWEYfo)Z9djp&0gWD_j!eGe4xz&T?%n at Bx)H z8?B_4TPjOx;NI04+RY5ho3fbxTri`g*6?qD+0J-%OQKP;1uk#l-}TWnq4KPEN0aZ`agI%C7) zB>xuI^D^_oB%i&E4J!pmV at UcNJRW$kpmr*-W{ZkHs|- at 7kq>IT5p)J1sFF@|4B4mU zw&a*<IDsEunu=x+rWH;n41 zuNy(9+l6^Qfr+2*2nU1_7(_XzUt;#D{v_erF--^A{psup9S3Gb3Xve3&Vbmki-dOf z&G3PwAYLAC at 7Cuo-qamrra3c>_{%-huHaZY{uccl)RqEPgcnbx2 at 6p={fc3zr=T?P z<_tA^sUR_KMCQk8l@#n*!8ch*O}&|e7(2WnTvddI(YaXFp9NwR5}h*t<$EK{KMgeo zjAI`#{uMbQ5lBsof90AV{y+A;|GNHPt!|@?ql)TFPo(MC_+uh-xFw9W*yEd$d2tJj zipU&vzAEEJ#j@;Li8RN0oORhU*2huoncrT}%!8=&NcmwD!MkG2sV%!S`?eA!q43SN z)2vU9(+uC~)^zXJ$0voqg*Sl+0sqn2sJLMY%)U{T#2BOlf)&w=152>#R>EDl`%97$ z9u5)sFD!9{TLqY)Q4&Bs?-r4mQ5_ znhYx7UWXbjjcIoU^GnDM2_%;?edV&KPWkdsiOF+`^Q4hlxk#1ld33T$r1$)sOS8VE z7*}_^^t3hs(BDI^QnZAO60mO~%duS1kzRdSqNYTRd~e(@6itY=Pzh0(M2jt^sGi75 zhh>6IJ7w%7Ot*l5RPPE`(4 at 999hS`@FEQ_TqAw{_C`~A>l zOIUHl$DFz4&flOfQX7aMDxD4zkog2gjB+&iFQPkpVz)!Qycrt8)h( zL+&wZb01ri&V%i6L{$S`igTo3tEe=U+o}&b at o8)6Oj|Acj-x4Exo-R at QJH^+cc5=a zC#iCkOpQ=obBlFKyxIL(YtGw#GTBcCTqi+Ntn$R^S!du$_X1#aMcH0*477s{kRvDV zzZ1z6G at KWzbLItomY)d1?|5P(go<+HdH5R_x at Q_2J*X7TiyPVT{z9ew#Krp+UV8T- zMNBZW=oYJS;sNgQjn5keDFI&duDi`Y(w_}Q1uv{)#c*bWaU9!p=$t12Ceu4WCf_hr z;1m1`BUDKPTDPg}2pA}f<|1i`p6#DaisizN;J-3M`75Th5emN$XE{*Ztz_P&plvo<4Ay$Pm+1&4v;?zEqfza z@?5X8TVpf>O?tpW_zTv!Cz?rj*hF`b&6aqWK+AL_T!H+Q{xITrk8!8J%EjDi24-rX zdWQ at p1f{TPWv=(+Owa8h#0WrDbgh4Ej!J`Y^$B;YtD7+KZs6Pq?u{sM|V;+ z&12yfWO~c>Qy_t2ASPd6&WR_-Jw}(uc|Y8Yvw3zJg8U06>&yCAEW0b$yD+-|g#gA~ zPqxP&EhcfRop~*1$2-V#Hd6xqaqLuwj1jDcZTVh at 9cb`#sHs*?X`b16>)@3)b9Ol+ zfg8iF#>k3+w?F^3C5!tj at B#RjIk)~Y=a2u0Isb<+|NMh6Kj~pQ*G&SN@=@uunk0mO zEEsBAg)fZ>$BC;V!W|gFSamozPLkpz2 at Ln<^=@G0D`)>&oq56FIyB-nb89?;C=M`a zi*>sB=y96)xRJd-_3QokwnvT&0mG{>A2jR!&>kWEQUFGyaXg=Dt)2KQIRX>^-dJY@ z7=hq--y9{o^A;UJ?_HU2%wyY=nm at UgP)~=L%SN|KiM=UpGRX$_R^!iZw<+c at u^>%W zNII88M_13qZqzyafi{R1x8htm#c$DnM^|q%$b8>n1?|jmbLQpQah0K#!7c|)Nn^UR zvh5h(b*^P+>S9nZ!F;Td67M8CI#X36E3-i0z>C0H5itIvCPxb{=vNFvHc8D8XLFhp z?0MJW5gm!_V4#um>8~Oh$yCV8Nyal1zOx|26Cr6zTqFwSllQfD!N9y7Hlsk^-K;&2q+ z^R@91E*i67P29y zU#QlCGN=5=p*Mqh)!Y}f*!UBD^!<`}*{xhO?vJ9Jd^$Ey|1o7|QARNvjLziVe9Esp z=~oPkhQ|f+jX<0SS)`pXVXHy+=-ci&w`6Ny%vMAbCdeaASb2NLay_J1vZAE5vVp>d zcZhGx?$IGI-fKL at B>7NvUV?Hy;51?gNIKX)F|Gl*M3EF>G5Ad7xK-F81ub6IV4ppV z_59xcUcuE0*eGL5MQa!$dw=)=%2`E^4-*QL^-~a3Bb+J167rXAXk!&x$re>aiyD0- zlpWS_`@+;Df8JnJeFH=;+=f=p?~(`*My-mLMa zN{})y8p|K84{Q6_g!VC91O1>uy`)9I4UururZ-5 zF;5RP7bd;!#UhROQIeHNQ{Y_MCiGMjQiV(;UY3+ckb;g_hDxbALqJ|7_Cnj%a9>P7 zW5J0S497219oDre=5On8Lxy{+=;JY8OUUoAAMuuYZ(t|_XqILN`Y00a|834s#y`(t z4+a842lKxlJNmzH+<$%f_rJ7NYXAMM28vJ$Eu4rg=ni55`8Q1w1xBQ!3JGEf!!7|@ z18RC(*YYbMvfm(wUmu2E6*3wDZO#YfWDXg4e{+F^Qu_Jz->#~&w3K7l&-(*%4>kuX zUta}a#EflUh|hdrC?V0N84EIEBD0qgM@}X)Y0ODtpf->dya{N=$v~Q6YNA+ef|sS^ z>d2SV2KGC}*rq!G{eKI!4hkcmUX zvI*#z7pAhMZRsZngEGu!XiHrt$M7`?8g()mKe1iDPazNhzr&T?;YZk$=Vx}X%-r!h z;`;9}i8rDSH8oFQWh8Wr-zLM-bfwL!0Tx&(s4PH7-Y}mk&lbFi5IKwbi zr^G6nKjK~XDCrQlU{b~nzZ~9}%lu at C`-WolwPrIjl&O`-#reQ$q-c;A)OIY*O?7pC zYLdXI-+Hl8N*%Sb0aJTv__Flot!wD#+t0bC_rpnEDF%`j)ymTjRUlB!jEZR?hxjWl zG+E3vT5M00w>%80soO$DAt>g`^I(V|bTpLg2_|6|G)&DO3zXyf!C*8YzWvm}5wmgz}%Nd_;J?*Jol*Gz+pFX5ECD5CpT7dbTDqnMJ+ zL}33M)~j%6VNgYQ7(d3CQ|Q at Q6p3POLv`U}m1&YlV&miL*0#7^;LZht;!Ct=zJjC3 zE;SFwzJuLK;nxE7g<}fU0m%aptXOTEBHkL9b76c|l4=a*@>}dhh{%BqB;(w74yP69 ztHUW;St_aJKfBC2{MOQE_ at R9_%wKpCWaSPV0l^a58PH5XBSP8Y$|`L?^)JCVcocjN z27$QCWVYAaWq${-t}tH_*1?DG!(AxV$KE~Kk(>=`OMJTBt#;MMO*CQMn>mkd(mOoU ztE6j4q#_b^AT$w5$@8zK`&8~ksQL|GFl)lctw6D{O2#0hu+&Ll8wxY7w1T~&TW}r1mOCa>w9IK&<1aK1FdSFNNWm{i--nnM(`Y^#Be09i+CiJLL;00 z#50A!1rQoaM7&b`E3Tp5b|}IA;+hlse?M#W{~Oo;^N96Y?jMQQ%2KKHA?Qn%NZ<1H zE%J+DDO=R?z1I|?V2WVKKQ$&aR;}G6-J}Nya>p=b??^1YK?o+?%{J-jsOl{`&u6yN zoo>0 at OmC)gdj)*KBo5j!z``c(h{=tmmtP|-U&GW9l1QRG#eRz^&cjNH zqU}D)wT`72=u5X!oBi1`T)WB<*a{PZfzV!`k;9I9tvM+D?y3wGqC!sZejv-c1IvI@ z>aDYgDHQ+CbF3n%LZ>QiY{jH1EI-|As4tpde$B|$f+r!)5~#07cOIcy9ryI>2^^G? zQzEjstfQJt|5B+bH7Qt2h4wzjHt{vy at IE+5Qj&1Qmxm8H_;s)->-c1jWG&95dTkN` z(?kI2v0J7VkyVl&4A1i$AH$b_4ElvJuql{=-}o-cRrEHKILp`{`p;CTi}g#~F!`X^ zZ2*}yQUDik_*;by!$?Lr+ at PzIsXgbUI=pdE7H6OT)K zzBSk?@kkds;WM1qe5Amfx<#63jZokHTW+`ZdsLD7-zI_b?~%ZN0<{16wR`&?J;Ikx z!+1jGv2vfGVtffJqU6Sgm^5RGn58nm7M!T`$A&e%0nxgND at Rn<^LKl1h4hu$x4s}e zakC33?!%XpD7#Ovo;SU)Q}O`hF+h4B>GPJ;>}$4 at -)YwN`{QnHFBoU&G9h=|(b*9A zXr%}bxXk^G5>dk=3Ov} zV`Fik8Tz9OB%P7wfFy?VDjIzdGab8yMRo(PnUk(N;G5mB^Pm|PG7C^A>ePlu577ZR zvPD!npAf*%6M72#E-ryQ5NwgI8?moc#1$4VDn)B^3NAbvWf9)4#6*(?!KY0q`y6F+ z79zUMblg*+V!QwtFF6PygGzGKqq{$O!}siJ(MyniXMSqTD#Kp1zN$?K* zZMw72ogl0^gzdNyNqxB&R?sb&;}f5*>LVPB;Y>r&8?Qt5$Jmr~u+Mt at G@b<*XM;&L zij+c>860n+FU*j1R8niGcRwY>s{>=Zf&O~uGTM~gq|;Cqxg>RktFuX}<~-|)>50&0 zTA}60tBK)I;2HVJE$3x+4J2`v=e5|OKR65LDo>!cWqO%J2dEM7Xhb zMLvi1dh%L?9r~aVn9s#8>l2m=>T3>KOf5!d;)mVgS28#9!aFTWP^)1QM<a+mTaJ>C6fAL*E@(bZMUN=N~KP2afZBMJF&f6Pl<*A^#!{eSgdN!z$0&I0&NC-UMW z@(MQeaw>86*U|fhYroTMo#-9X`-RbdLDG14dhc5$FI8fsEMSRDsOt_wi=8(Jj}b;- zQ0XT5Qboth2}b$y4NKgU1VlcB at k*0QH9(G61d at +exaW}Q3}5hSeq-1dYQ|S~CMJRK z6W+w5cKWlQ;q8 at 2-cP~?v$Aw#a$hA;yQk!VH>%t;LE6a}YHJyekl-n?DyGCxjq!^d zIe?Ju5Z5zl<=+#H1MG~$$`L?7f~Y`1xc?71>z{T&3(6a173)htdgZ)m5HlzmBFzNF zdR$)y^RZ9A0%w-PhWxF&ObZPJ>5CJysx{V_>gmyo<3&-%G}()&~$q)3XiRPY5P|_ zULpN_7h~=AH{YM|fIh3CxBGv5d7}wlkcPf{9E$V5V+!og=H8!vf4w&IeaD at B`33i$ zkgCUYwb~_dKWqLHP4MkKC3TnS<=OlGJO4Y9-+}!2<1F?kas9^&&F6^mXU#qV|2xXp z{r>LDcZM&MU^BLF3nI|E5$+Ba1F~TSYZSafBoPCZFx#Qa1L9G^xnpoaD(Eb%iU)(9 zOo;+gSiF<5$?hW*6GPU(X at hr1S(TSM#VOKjQL-SgcXoM{-#%;9=!`{DC~!V&M5dO8 z@!#>>rBI|<>s9icy+|{dQBD+|%~{c~5MrS*@#@pk*O1{U5>1u*wk>k<#2vgEGTrz- z_RlB>rH>|Uxv{YTr7}v6tgdt9xUusj*lbYB at D^%xpq_R| z3ba|+vU9I*pfOEPE-ep_txdn?;~iF{f8*joQ%pmW;p0*6pi7gd(v*7RJqxZK`slGGVk{yr*2Z!&L>op4W|%De^}S0Uz2OVE|gpyFP3 zhdHZ?dl0lDMVD-bab7}4wox9H&=CmlCF3`4P$gk%G;?L{MZ)> z?zPF|ap4r2sG;%qYar)Y*5dSJ4$HxmM6u087Zvy1QV5ep{rt*BUT_^B`z_(BZlePw z>Q35j<4)=#*D_kF~u+ at 3V0$dgz>*J?fzXcUU=3Xe-vu7x at 2lH@k&$N^zm1T!`u z3}Zj#nL;**iVj7Ujyr7bf&cc(Mcv@)VILh;Voo;getmjX*1TkFEkA%8LqGzFFJu)f z25~`tx+I8Tm^!g28jl^og&;k#t-?EB(3c(xescV+6=+StP@~$O{XIaFo`I4BvvI8n zppY}WI5fpmr8QL0)sIMQu#iwqOZt`tg$)<6`U_>j1;&XK8=rNNuDn`7T}Gwx(cPI+ zw#ox`Q%-Bgg+|8MAN+U7n+UQyiK~bLs3vP!dJ1=4C$Xd)@J9}z6br+wko+JHEIO%A zfjgrm5QRC2s+;cwzHr}MNv)glIE;ec0vh$GLqCp+zT1*jY}eF}6pP5{27zK=kbHa> zKXO>v;3Qk7b>0K)nVD_ZP2>JA@);=8u$MrOpb5>7N;!9#hqlew87O#2eHP3sdv7myWNb798z3#8CcaTzbRg&`}tEMQ3*uPvuJZ8cn8? zC_C+T0F4y|tK>4cwgvE#Vk6h_F5TjInBB_%f|Ih2Ru9DVPt1krczsoTGc8{o_o0y( zwmChWdW!|>Eat_VDRqJpS)1J@$Q*iyCu!3u zO<`*z_9~E|Hz*YHaKl}dcUIPs1gOJs1D5=7OUI(5aywk^*R}O&6t$=L6hH?m$j&bw z`3I$N+58364P7zxjDj1jMwc?eA!j)+ZK%ShpFVBPja;oJ52pdm#}-|w&Y8a-N5oNr z$l;rkbjd6SbjFS0aYwo#J?G8#EPop9f#5U7{aE+`TL at V*YLrpNWDnrLZcBL at V%{nX zp9IwZT(T^fK@{BaAhKn?1KlbLk0ZJmh6UqbIdTP7vD(L)&ka!vvm#5 at YyGs{6Lqie zyW%yl31e$wSkaQGWxNyHst$JnYB1y&?FkozZz%HbS`@4!($P*{x1~<3451fbXSM{8 zYr)qGHdz=J60wK73R|OV1G=KAXtOs)Aa`Z}w?2A z5G^vN7mA6mP9U!`SB!W3j-R-roq at qtiT$yoizb`*%T|SVWX at 8Y*SXcVxJvm>IBG zt$?9Gau=p#oP?qz(({O+m<(Yai3Ta9mDQI+Nf$f;c)h)m+zYCKEN)Ln>7ay$!49~7fTJ= z**~=VPCzwe4)h~WX1*rvA`o$Wk*#QiG@|631qq?yi+TCx|2Ta^&Cl(zh*R42vMBzn z>Um!D?EB?|SG{Di{0u_fu3B+Rq*cCMek+_NKRXyU_Xo+dGd+jia|VzT1P#O&QLOtE zY`dX|gA=!)3&Oek1hc&r$oKjRLB8!pB6~5s!~`ON9c30n_SS=nhMDO{Q&#zgG^f_l z*4q+d%0 at ReC~TgObN1|Mwv8&#+G~v;?&IAyDnSkoG?;{${YcB*BVrYhl}C`>Rwb0p zFtN!{PdE~NctDY*V}-O+L{OAPuCAL)s(HBU|{gb9{b}s{)d9_>m6n+ zsMI?1-9=>F at k4wcb~!iH4rWqf!E>k=Sht_D2sfor!1G^k+0EDAZ z#0D(qijGT~-zeL6HfW~uXsA=Is7AP`B3x1rXV4?MhV2?R(zm8%r@~5ON$DWi_*jeZ zf#~F(>TB1mrO>n-BeWc9kicG|hqzS2-fcp=b~cC&p;HlxX1E|XE)XZT$IT+c;Sob5 zNqi$yA{<5jW&+bev!2rS<23SoT_Va9?x6~E5LeK)tSHqHyK1{%q0c7$Y^hN|Hd1B3 zNeL!0k3qCpH`?TlnQ8 at _SWEKB2x&`Y9{qr-koWHePeMAv}EIi>BcT{a2N31UQnYEH+_N>zuU*%Le-hbs4)B>WH z4h?rOumJbtqE6zwVYM#9qY)K`0lRLv`g~0QcR4}n7J2b5d6!m7ud|HCOKrT`T2Yf> z)oO*-JGW;iN^Pr)$A+t%vcU{Ywy0|Cps0E+XJJyAzR(-BqY??11)b0vch%~uw8;i# z!97o$kawA5Xn)Akf(neOQpZvImeA8xS{KI)c=?%U~+RahgqCR2| zKahYcHe|bM8WSBRP8l5|{xIdC>IGFx;;XpIug^xiC}ww!bl5n-P*cEk6)Iv>K_|G< zqgHHhsZr0sG1hQh@};~*#}$8acCOKNOX`v_sA>tcbtj_z4RUIAQ=!^!2-XK><@|cB z$WAP at 2cq-Q=4{zbzqbda#5bhjfO{%YjaH0JZ6CjZc=I5v;Q(nf!q&2v;uraXJH1P< z6-$-*e4FaLdt*WWQE)_^ zc#k?-{W>b at ZJzf&ZiO0Tv$j7q*rj%8 z`AE#W at RZAmF&ldMQK|vo$C%=F8&0cXhcoM+XsQ+~qI~1 at 38c)3qJ!`)jwbSSkZ~f* z)T?$-0NI1bX7%LSzYk-|3zZ~Q&M_ at Vp2e1S=qm1f(spJPqR@|JOgAuB?sds~F;G$4 z(XV3>ue5me7khw?VGihVhL`k)u6Lj-xA}_CTwVl29m;crn}~bOE#BNY(qy?c$%cndFk`snR5fAGx!z`0}LHK8qopnps2sCGP(l}{8PmS zP5Dsgj=jeoS81TmI1J)DqmgC{lMC8+sJrfdx#Fen at l=d7+Oz0b=Ly7cy`hxN2}r^} z5eL4NI<$XcSuf>^lzwXRs(;}koaKrueSwNSG8~wGNV}JRqUsja< z4Nk8`Pf|g}Ok#H-b()B|pIJ7eosR#;)~rmQs*82}1rm+)eI6$Jx`_CRKEknwdOClt zOT6U)7F$yQ7`ut)NwBZog|F6StJw8Kqg#qr`w_7^7_l05 at CY+}iIf~3i+ttDYbvgg zizk?TGzpJkp;Vk at URbuS|9^4zj!~Lz+m>k9wrx8i!?x`V+h&Hpux%^Dwv}Pqw(Ymi zJ*TSP-S<_Uy6 at j=ZMF4l^`SZX>|JaUa8dSJO=?BsTu{P7YDG}`*B7TjMaa(??XW9< zulD|t+M=xG`_?pr9@{iL`sbw zqYB_*Vu2{ct^W7rLXWS$K+X7 z+{O*o8{m$-7s<(j{qJIJfQr+Z-{_;%#|oL%)gnNb&bX5jglA zeV?>oZ5B--M5OEOT+K--fmN0sCqL-QO;_|fzqizm6z;3M5HQR+lUDlSJ3W5=?aU)l3DmV`Fu4zrjJ<(b-b4MrecQ<5ZaZ&rp4 z0dt5 at 1sDjN5vkU_EmPAL?mlcojlcW%(sO$aiB~drcKcJiUkKMbCTQ& zh5*!lt=~|%z$NlVWJ6byv9P0AhMu7EU=aK=BKl8w`?ObQeC2+Z4;t>^@>Jb2!HidH(QLkq2o_d(6z?x zKOT#Yts2M^&xH>>pH43MkdE4LVhFbf1 zUEv<*^k1n*sLx$nd~`FuZ47SlDPB^DWpQXeP~PbTImYfIvpQM7hcDUVA84)^`hpBOaf6Ed!H*uXA`K^-OA@Oo%;C#dilvYj>xjmeSvuTnrJ0m6DuhY*tMN0V~t7`H63DqbKM6A0!DF@ zIrvS&DP{oU6b3JfYS7PCZI;CX>Tkj?HWicT%oOV_$3UbX+z*9`%-F}W=YkwzAS=ZEdiBC-$de`nR7QqN1m;@K?SAwK=cOBPt-F*&f9y zB)#n$w3YlLJ_(_;pWu6AYe7+L!rjn35B{Bj_yy#bblVuBEe(yBnC?8C{o{En=j-+T zoD=zSrdg(fp{lKM%7QyCW!CI at K0FPoIvC+4wGj1mee0eiX-)AqzmZS;(h$qSa9)!| z`-%6ifk{=4EtICiOoe4t)te1~; z)~EB%aY`GarL}2vAO9gNS1dCvx7^sq#`k`|u4X9&tk at 0A_@dtSrU^>L7zfu}Vv5}a zsrJ!{MIReqz{%mf--(p%G!sYpmNwfLFe~mh zU7lN4NEXIBB>x5V5tb5A5i8i4M>sFtEs$TTrDc$7_;c`Vr&AEu zW!m!lZ<6(1&ZIcae}U!;^xs)NsMtHXn40_-=tQfm%lH2yPviv_?13|SNXg1FfpPHD zBoD?}L at h(@`j%&wv|lFFi}g%G3iQUZ$m^8(huq9uOl6&BvChw5=T0*MafSH8yRlPQ z)Jhm^9Ypj>-CiX>VxdnkpBld>VV}!5%4K at cq?vi$=E5B2_(izRT zkXdB~UlE(bC!xh*uccQ(|AOkAK8fzmh%Z4?LU-x{jTVSNm?S3kwgcUF1D-o`*nDv- zLky*AhR(e+-QG!>)~6%ufmhC8gac=4r>HH+WBJDFx0ic>PrO`cibYba$wbZU<|YX#XJA^kD*?8~1g!f4hAB-fT2- zYDz=LnJXztD%nA+;rJy)sw(RU{G20*7|i;($^w7d2GLUwwnjx*Wu>Tfi#>zo`@F%` zH6uXUOg&QjrBxIG`LUh=4FWA`l+|y6 zz^2)&axXIn1Z4*39ddMluJ=IfGmX+PV2^Ods_FAWvnTrLu^#N>VAscyLtVK7`~v=; zK at h8e0R!__o1_5t at 6_(3Y;9d#42^6||L00m*wxa;#MJ3;>jD)$`*|ibKK%wjNK7*D zCRP+Y){Gkpa!rwH6i5MGP-wDbCsAAZq9>VrGFP4y(H9CYe83>$js&sY+*P5CNS;{4 z_494p^3(Ls?O#Bxp=zkhbWC(wR7R`)t{Y5sMtc|{KalGV0x0)H#n05M-Xv_64$s6V8sf`R1vId?E+cd)0*O49vzFvL z|fFSS>GY&IKnf${2{|=y(v1fu{@&K!coZfG^CO~S?E-B z+Of(H=M0H=YOx)$#hPPddm{u*E^9t+i|Q_2R$x{zwUcF33HRt{AIzZsIP(z}pQtxb zoQSNOZqcqxPQFz$#JoLfb7p^m^#sb6yZCJZKAu*DncNi#p2j8O6j2GS`9O+`?l~2I zR3M1sdA8lBe{E!h8Nz6S$s}^l^bR_;M>^)ImlJv4DtR}TR+`W=@MA(n4)762qBZdX zvwzQT#Qf~b9c+dt#42u)>O2gq`eUJb$BF^dk@$GHY$P)+ks22fLE72X`BF znr4-~tHk2hyX`ojQDSPM*D*$}Q7wBsUTv$Y+hPPA1ZX~wtEE#?AC9r7ov@~ zaeW3KaM*GgthP at Lrn^ZHOR4MBp%Biph$p}{K8rqOmc49K4*$$5Bs&%(Ct$ zhk0biBfdOJ_rn$4YqfOk>Ir&}@3er|sn*U at YOB>?(k*+*QR{#yrd8$5lAvbaS2Ueq z at bKa z;Xe{&H_*l}QA%?dXY-OhNL%syX}x5{(Bdj-B{!_}Ws!0VHmK|pWirH7uSniMNFLLW zfGM6peSc=s?d4y}r12>|ORSn}(+QP$Ezq(x at V7?{De4b+CiLYJ$Dr@!{k_OK3H=mQ z`fCKWMF#@<@&7Ns{tM-rS`KI<*k9V-QEWWIL}VmL5VByE>L}L1_<|h?L10e72v7-P zf-hKA5S9k+;_2Ds>U)td-Pr>YS1*zdK10=DK^HW*J*~RsD~B4T9|k=?l8;rlgukxR z at h`2+!!;lBu5zxvU%nc=A6ve=-}(LVJ#>aCWMyVdRSnxAa2=(^anhmS(vT~M=?J^0 z1*)KM;-Y)SV-QP8ErtpyOlPuBR<(7HrSgyE8ZbDN_=D5RG at d7 z at F2?ND=s+Hls8bqbYh1YI#$LbFyD@)w6v7Xnk%*WF^YS9h9!xG_11DeOWxX1+e|j7 z#6??X^_EvHFyBlymqV4u+!F3m#y~0to?>_ym2XhnU0d$Bk)M^dLi at L^Hk>s;{&(r3 z$JEmNZHO<4-nDn!g#&p=Vtf8NA6$UNIhRQ7bQTGht4Mo(^Z`p^278HoiDl`pKeFYg zj*D}zEgjg6<_~m13+EpGLfA}jlV>s&tCixAoVvrm17s=8otZuFwRNeX?PTNY+g3aK zucW~+Ug()J8?Y$~Vie|nGvf7HqUC%42bu9n&9qQIR|W>!It?SSkWV at C_b0W z!?o!0SA#a2IVz#Q7f9P1T2R%BOS+8F(FtchPDQdS*G1kF^I0=itL1BO!jotp4`fcf z*R7_~p5_o7TdL-KTKW2Hj5MK+Yp_=MnkadvBcabt%VlZ;Q1aV<3L9510M4S^fiDLxBVldOMVJ#fhcP(H53csG^i{&eekF-3hlDoPf?vcAD zUKcage7MYK(m4#WmKwNcuh`+{)jbF6zgjxm1(B{7ZIX4!KG+%BL7z1}|BNGN$9Y6C z4HjyUg=6YyKa?bcpLn!LqqY3%PPYHiQ7tP0JZ9olThX{P;``+F at fOHybyS(ORC7<+ zmw_U-{v$GwN}HT_G_I_-5Z1n}U5p2&ddLh~f!YH{ApS-LoadGmTwsJ1Cg*U#*+ajN z at kR!^NBPG3L%h%a_38S?8=8^I1DTO}B~l-paUT)ot89l(KmLaDEP$UcXbZWRKHG3R zIgQOqyO~1_T*pX9<+Tu^2k(&ISFI1jMy-~xhQ45olNEqI^h&bp3U0q62ktkl1II%f z26=e6$7^8G0V1SYUA&NJr5;IG-;q)O at w|Kl|{Wv~4`P~D} zYNN9 at aF4}DS;Foe*F%b1(0%s%)Mvw2b}oTfoxtLhr%>CSkU^DyR{a}N&i9m|>%n~C zBFrt6{ucw%MBc7XnaYAQ&LNJRyeXiJ0Q< zYQW{Y_RCavac$-5&if(jtg*#BKeU$p)BIaP~Av)PRs*MT+_Y?cf}S1A5YvK#E=%s!2qr-u)lK2!P?A` z+I*>|n(rh=_%tN0T4xPciS{~W6|cx-mS@|DV*?Kww<)N%7oAkrk32HK$Jm^3B#x>JgJ=LdCv*mp^9nC&p2U|R-3=l7|Y7p*helC zcmHVjDN<8luFsQUC!-;?`@jaX))4reTfevxfFd;PhS4WqLeyt9J8;(Na4pJiM at b1* zn|*Utx>hdCN_-S>jJ^7EhSswc|4l0P%fGg5yJ at wK?NDtNjg2{1FzaZt$ez?JtO25; zyoaKn-Gw74ap(Int1p)L`)|j^av7 at 2EPu799e>S1qW{f0EpBOQ^N;D+#nj1J(*A#y z>|&LF`6x6#^hY#O<$07VAC}n2iWtq6#2d`YMc_2=24J!@Cc6G{Xs0!Wf8LG2-av`)h#MIINs%twRYC^mWiVJBOXgL-*ECLB z-Sl#A-EZPyMErDXS>GBr&Nj4?fLVMFVJ0zh;H?sCtn$E%OfzhlhlR950tBEilm{s$ zDoQ^@okvPKkt?*u=T}FYS~8*eVq4fHNHRUtBow}4#&Kei0SKwgE_m{yatGcX1Q$Ikdg+;}cf^Uv|ihcZnZ$O@|E1{6<&`Kq6O#1p?Sq_ba>N9VB& z)BM8!-HksVIX+XNHzDW)JDJ06s&O|!b{39rIX!?xN#Pl_$`)>G_i zF*k}V_ly|zqUHa77Ie$@8ft=?0(Bs+ORnlLT2eE- E`n4GuBg^e)qC#*XN#teIj zah4rEdx|%Q%Oe6Fl3aFP*4UE-FR5zltp|C|yLnJ=$aSZikDCHdI0^i*DjuJ=gHoIPYz;YnnWf2CGdjspprZNw`XQd at u@UN zoUKs=-v}7SJd3+S>H(VAM&b1 at S$bWWa??Lrg}-4{$D37Np#L)_KLx8rO+bNwVxWM4 zME;wY{0~aM$Uk3O+S~n)8#~47|MYX?=qjS`Q)duU1V(Qx5~QY~IV2&WYW9~t4YJQ4 zM3F@;k;8taeuMOxfy at F%BgD(~x%r2k+q{#dp~+hMRZbS)yRW%IH{azy$o(K;r27&` zh%Yxx{zwFl)>(+*6tV^hh$vk%VATr73ms!XVkaU>)H6!Z*$&|FMpw98Xll=KnNV*#|&7L$#X=vib- z>dp95SSPcphyP4uLddy!*bwJ3YK>)7Go-l4kj8YYScqO{&%jM)7)eUt2>*7!34jao zUeYaf0$0h%XGp%Ywj!Q%^az=(EHF zG9z9`wF=%@PZ)(7I=hu&7p5Pjy^d;^MVqXVl+H*>7z`A}WKfKbwQ)&Gq+e!`yi+*K z at I*KS?N+-VW)9CU&Q3?9zyzyXQ%Kbn?;)O&FBMKXU8Q{$I70Qy$3b9 zL_I;Jip)NTpM|B9nZ+enPSX42_s=;Ra|Z?m66K0v?P)DcI|51 zmMzI;1aYH_s?MAxs0NE6XJolu+*}GnNxVj-m7^k$^6)kx6Ct08|7`EPNi$&D&72eq zLNRQR>FjYJZwm`dwkUX9`M2;VG=NslOf0`0^0oS*ei877-mv&I+V(XI2)g(Mu0I~4 zWq)Jo`N8Y?CC3EIy*jr~v%!AwHn}*Z%bUD_|CEj)=%21d z!7kM&cm+yzb98&Wr#}_Ur1%w}ZZ^u?|L>KEDW;2u&>;?7%_6w4K2M(ZQj`w*+co)>~aW&~C_a|c2lH2)u%Xxa-dCGUH z>vMl~x(7sa0F%Z{X=(?E!9=l73_Z2BdXG<4WkoT55IuSDI&wD%ty*4as08awxV|_6 zpITpLms_NLzJa&Fc*C4a%l=2U(YoUr2IHLhNS$Rp-PT=1lYHqhb_d4x-J%R!x^06k zuKx5PoO$6&3T|exc!Mf2VT0aP24L~PZrSA`dkq4#V~k19^`hE*MSs55ix>ENB#th# z`BV){{+Kjh&z5DdVhTUdE6;B2L%XJ7d=oHZm{!3<-*13~qW#|A`dqw9emUNJ%wL9p zhbjtDWwyRir7hkvF10I+hSzr7sRUkM*hjdr4eH=25EClx!=PLYBBE5+c0(R)}!yzV$%-BFU7IG=R`ew6_e5Uk^E2@@3} zm4H(n`lp-()```L=I~p1*PFaQV-pu}4o#E!VGYpy^~m8^X8mjYut0ps=0~%68i%79 zv4DdGwp)jX?=!&=J at h9SVUiIs9f6n>x3UJ4+eFT8vSLy@!;LBR at ywZ@$`-G{RV6k_ zg=po=_mb?Uo0nbWPiFA-24h)X@(cFP2wWWfeq9(&cAv0IG#nha8QEP at cv>!b{MK0h z(JE#^uvg6isjNB0!BaFlW;{5dnq3b5*_(1K{()n-VqejccMfGf^5`;3SY)GwXgtae z;Dh3BmUN0)EhpDZRNO~Q4pjs3c2tNsecbq~s=7?}sH=is^Q4e6e2Yh06s0AZ+t%^3 z)zb6bJ|TZxYJxs-&pjk at L)ke}PKL6JpJnpn%Ve)tgxWGF_vnda&QlM);&bfcE|7c) zOKS8o&@ri5Z$OA4e1kNS7o!V?{qP$?Q)i_1LUezS6??zqU^3<2I_B!plmu>Gm>~far^uLGaG7Sk94$q7{46O9j9hKE9I!RKGDJ_#u#| zW67}WQexl79_VGIIz!t_Y7d7EqX+(;`w8#GLV7CQ^LJBM at vF1if7s8tga12D|9?#- z|5*|=J4r_YM+j}?8}tuIHMqL9R}<$Nh<3Ab6J`{nI4a2uBt4>BqM2 at Ks~MwNI{PEf zW4 at df&il+m8{zNMbnq(4c`(T|=Od~!1gJl)%l!BW4^y~*$-H0LTi?5JL=Ni*_EZBq#`ypTfloA`99nQhQV zfIn!rlrxFzuCAd0HUm$hv at Y&qwT0EJSn%6>@|lp$YtPZp$%LR->cdb4wUV9_2u`tx z(<}Q(v=L>O_jWQqNpQDDr}W^bVwvei<*AJWT`{j-&;Eig++DWrybJ^Wy7Fi;Jht`p z-y at H>(~r*=h)Rv-$vVY4)-H?~* zPyU?#F;JEupvB2KZw=SswlkI=fCZfPz*{SK<63=D?Ma?_g#XAWa at 6is#HQDRufh6V z*kL5OdVF0hJ&84GOK(LfSH{fS2B!kLNUVWROxgl>PZ}K2@$fbO;Du9G7GOv{)>r2YkXNj=$ttCHdlTj9|q*VEvxPa9%SScatI%+p77 zZAaW9EB`f~)I;JH0X9%7Gx3a>mQHMTlqD4;B1B_WG0o;R0S(BN%n>$z at d>xpGr$$G zDV**ugb^*4erWP;B^-sMijy^fL8RuKS>-xa)6FkaKJiV^6eLgo`r9$6XQyq}$6wH` zg#34Y#Q!_!{x4^Se`wj-t*)qZ2%4xU`G}cjGC@%FAEAX(4CIR&i0`G^EqF>TCp6FR z*x!Nv!;T2pHHv%@HM_Iv^{RF|`!Fm({O?5~cpU2dE*HSY^9Hf70xxmX#i6J2H3NILls zjKvJ^2pK1&#Aoe`&A4wW3|`sXvx$~{s3TMagUtROV8vVndrEj3j?rfHFBY-~*hE07 z`)Q&XFobwPS3!bp;x}o#HnHkn#U+m85Hr0<$OA(mQ6J@>*ZILPUvx7(jt_xP8DROm zv&rbL)1!-P)WvR+OAV)Y*6vQb`ZQC|Q5z?COv$uRv~=aYR|6B_T>E}me~(0 zQy_fZFucJ0WjbOU`OchR+c~~pnkJ-9l0sI1@`gLk3nrV$2 zef|#gc7ljMssKofOw_;yWu=1?yGw_JP^=6 z>%ZIH|CfmRXDChTKzpbzqVv16u-cp534;U+VlWd4vxs1EaH13v=K+GjpdpGgMeZn~ zWX*=PK>B_Uty$^lwAe}Ov`besq9-E>g1cMWT60?Kbd*&sF|1i}>d^8Xck{TXboP3q z?nAyhZTq^vPXGAkd+v0$e+X|u*gyn|Tv0~+0Qn^~)S&ti5%E*y7MJE%MXxh~;*KY{ z{*6EGFNx@$=Ux_%t>_v?<=X at hzZ*en-s^x=%ii%D3GgpfIF;S$hdWFf{aZowPHi~9 zkRGMm43HYyn`fgkfS=;CK=}(M`gh45eBfs+$oFHfjYp#Xmqh>eT`w{Omp?ONLth0< z1EvU{v*NBOuktsiqrJnm&D==VCOcOMj}joGs=CItvj>eOu9wmLtj4TI998F*Hp7Gv zPofsMV at 9?X<$$cy98NS at LV#q#djaU6 z07SC|Qd at NeXVp2-GqSgJBVuZ0BPrS}w+bk3(+f9FAJNQ0w=5+aUf9EX2Zw$jQZyfg z?c`GM7`ow%9w&~iOQc$2iHoRrd at ImgD1JZQ`jOZID-51DL|rL~`;;ObUky}KaXsYt zFW96LaSZ7R43$AyFwf at 6$Z!-o2s#}e{!I5yTMh*{Mwu{7Iu!6b7JfH`uEGmhxFDHu zAv(bD(9Vm8&u;6!qfsk=NbB(4SWCe9EpxTa0xC8{sn)yV1Tr>~Q82}saZ*ZraZLj! z4(=JuUCsQ8WP(kF%>F8Gn$+opImw&JvVRu$NR$(tJhj6jMw-9oc zna5O#B3Y7+8Pm4Q)Q0+Y5Vew%3eSljmg+o7Favf zy)MLYG$CzvRLWqJCf7_wF{0pkEP>ei&4h>`c$vN(*g)P`UfU?;yrgbG9VD7XLm_7+ zIFl9n;w%aJqqP)-d0Y|5ZIYr1QljUi6Q0eS2$P{|jhtAmoOL7|0EHND9wl5f5f~+r z2?07_0_fX`9-HVotav8L^T_EMUJ^`TG%vR#QQO9u1j2pAt0Bif(JHo19=BE9%!naI z*MvPHZs|>4NBQat)WTU%qb*Qn>6xZ zBZ|E#0Y5xP0ejI7nMWyaHdb^VJ&AA%L}l{sxtYuF#RwX)`!dT#%wEf at rxR?DWv|T; zN(PA?^*Z^$`LYKbuxJ{)-ql?TRqCRiXb{O%O-ia$Hr?$*`yCG~`# z4`L=;ZDuf;v3aWypco^8&`482gC9(X60=lTHV-YZVB9PUX%62xJB=yX>stFk+`e6o z_1LB-I3J~Qe-V4yrjt-L8-Ue)TE+nH?ELW9P0}8tvI2+BQ7cXJyR59F01$y%mNsf2 z1w4X=UJb~^dZCk5+oioxLuW9i{Oy2{RnbplF>-AKScN4CSEU=SDd;eIa232)x4T?4 zdQ)?&g5hk?!WxWTQZ;SZML at SJEx<)6zaZm~Fr=)oVHh*H*TlcGuq54CzF(oO?C-iM zf^m;uFkC6@=f_eq6u?u=2UTaaXzaJy+T>%II8)OEJ+8Q6;w at vUfze4@->+wo`Vdq1H_g&(4#N+ zjbJAoUdKF;9JcY=>C*N`f7#Xb!}MzUE!DO%6`EykF=-)V_qbA+xdx+*()~CpaDOTq zHYNzK%<8#|WArv>47xA6=KZQRy=U_|Y3-P!9gIkg;i07%n|rk1?$Rc>({;w?A(uBk z;&1cAb1IJ2)PxUjK&62HajLqMZZ&qI&TFxoU#7AivAasJ8 at q8Im((<~5t2w&HX=+C zm*>axCu{NaQ{!5c}fSFJ;;XZi~RIVrGU_=X3eK33x|K!{{diZ5KTm!pON+%zN z=cTy87o*h>dnFGCrw^J_5d;iwY5;B$!uBPm4QZ*Spi!vVeV6Cg*WtUi&-K*VPe?Tf z;D?=eudiRk3x!GWHw=|MxH?v~pela at h|b(J#`fO(Lz7vb1B{fmA8K}SSQ9k0 at v;%`j4MyZZm<1z0NH; zSnB&mB^{y6m0|Q}L at zV+X(KNavFa!82RU_8j6gbeRxg at Wt7%#^;TH4UmM5quKS_^3 zt=zMB#91#@#wKQzE3>LumB37varm?I)QHs{?W~zGv4tZiVPy=DaR;r5k#@i1KZA3J^Xkh>&opxAZxU6^i|27EwS);+(72>uCGaJ6nleZy<*t!VL(3K z&h0r_I<_^o>T2sU&@-fBq{>8&hYYF87)}mZ2WdJxW3be-QPWbHS}Ln6j?EQS<|P$N zX$euwB-RH~$(WnLE;aYZ-2`dJ#BBXSN{W06pcMca9ICYCI%o0dNo$J!0!8pq_ap>* zre|99#@fK|HoVz at LD7<$or at 3qZukb@SSsocLeny$B at j|iMyY8v- z<|M&M??wrmKn*#}#j-sr))1GVAULX)$(;_HPpdgPMX1T{CAgNJ)v5!pcvNY5pGq$X zxAs!J6}B1I*ME)Ol-1la_S_E%JYM)+b_Z|<>6Ujz#MGLyiH{bq$Q*A z`_6c+C&+%+c(n(#MNT_&+Hn1N7nXv()eJ=4fO2^!QaA`UcGsLUX4ky2uU=qa)yXob zSYuyC^PPods;IGWwPOHezwHa&Wt+4s;?#G`JI at 4*;(98vem+XW at Y8xurFw`mWK3Il z5QzPdN%qpl1C4 at nVjJ<0pBTZ+IaWD}5YrJ-)6L~HvynPU+qQx&du(;-um z-bLLygu!c@;o_aUJ9(z$6+%Oa(LR(XxIoY7$ENVCWeY)@N*mH|({j1a^mSdNIyzI3|N1`fgYQB$- zkQ)1tlzdJ?y^jERox}hiEECb43wDYbW{P8n~<*oW>_K-;3QbdSi(R z3xMhtOLA|>_JZuvCXpY($Iy}hlelBIQ7vj1T~rHkHJYzT*rXA|lINhgmeDd`c9i*E zG>YGhC?18ZFdQL^ho7~w0;%x4(9YEoq90PZDCdHy7FFE z1&RQ at LRC#%_cOY-f!imxPxV?T%@_HIgwl2ewqZub7u(Rw#}gj!;;|B6j~;MOeVUiTx%|(TH_#{^Yc55Kp;aArdAl3TA>?vDb~8%f{S9aOXS=#lO!JBDyD3H?PkeA-JLEL)zF7eb=!`)?OJte>4hVL^a^O#kl})&DQz_WzEv`!5D% zD>FMaJh)eJaT17BoYk##K^amoPDa0oFquA$ZI)WQX;;hzdl(_`E#{3X7z$yp1o5!E zG>#;4SxP6Xx7pEzse8}&%N=~L??yx2mH#dvh>inqW3VKe9=8SiE*^?p!xmYbWrp!A z7JEenu&SL$I?!b4j2>wTCjhV!v$FgRmo8j4X|NbrZIEUyNuM+HOCp$lODTAQ6C~E+ zNBsORDD5Lf at q=5fbr4q1gb;7du8MFX`5zw*ZR#q?;(6 z=g$=~7db(Yu^v^zh0^>8RbcM!ggP5g&XCB=_?}Pc)1$@ zV9!vx at X0s0^L at r)n+RX7A+yguGx*h%`3Mavr at X2?FPdcs@~UX1*cK+le?8NeCbyx&J=c{vB^uM*&p{=?fu=p%NU1$_W#_DQVn`vo0Bm-O6 at 0Z3)Mh>4&Yt zSigS8W&=*n2d9Y&JqwBg?vhQGT4l|s&&3N)g0=b=s5zuZdamEt8 zo*fgfrY=Kvfw1&{d at lST6h-J=sicSW2D7aoK{>Ex+;F8GH$BrRQP#+W?4xoHG8yD}+-lv-PnJvm%_z z+>6>;$sk2&h&4C}W>Mv0J;JFOLe*I0gu=$RFsL^vc{0DCF0CJe+rV#$6#__}pVXO(#J&1( zQha2=vEd(sy)77#7J2VDqOt53h7ai+(S+r at k0@QMntH>^L^V5fQs3UlLo|+xe<$x+ zLb4RqLjIL!asHjB at c${-{tN9|S}wSY*k8l-Y)=*_lrf2GWbjCEf9?v%z;HUzN5J>I zWa=u|xR8eL7ScsC9E+83RN80ek{M>QuZm$eVZkr3yu9X085Ay!y*;S-d{0!o-!|qC zzprJh$yYUOB96QO#F1NM-pc(#ZvK+}eQpBI zTFhJ%pEdu_Lfn(1X5X7Ggx8(Q=mSOPR)%%FnVPx%dI5-kr z;5s7X!TW0}LmQphxlKn6jdR?)rj<5pV>}-O3>RWTkvT1CO)6}Yo(z2TT0Hxu!%l4l(@d<*0$LMq@>AMpZ~+i(7qqD at oi1`m zdOCx6S@?u$a)@xKZYJd?)*ejEj(zPW#q}v2X&E^^fe;ezW`(u~X;UM=UxQn9Bq8wJ-UDv6>rOD)Df7ZBo} zX#&`FYqSY3C>GmAHtCAx$;n)61;qOZM$OoHAJ%RO?k{- at ZAVDqZ+WFAw{n&!|gLOgRoyD)VBRcW?0*VwU4MmeP{)cKw}sx3ejo|3+#2&%?Nd_x zipV{EX$v>M%?dZ{TpeV*>5RdY?F>W5uW3Vv~IP9^%N=n zJ|a_YJmzfAYd|sDqFE_d@#NWWgO&H-NKe0aJK9S+RzQCp_KhsqYFEW<6{*>VWZ%%% zdE8RaxD;C_JhrcC4p!Dhy(}F-WXiCTRM%*{gV{O=PW5URCX+6gW_Yhku6RiI*`kqM zP4&I4lC$Dy-z%0Q54ETS=f->f%|^PVcP>l%+Sw#K6{{5jT`K6$NtxvPD?4cP1*jP& z at nU7uR9!X#)Lvp01e?D5(QHNQ at Sssup1}g}J1dnP-^23EL7l=F6DB(pQDw-)nw#?6 z`6ro9JExKfSD;8M^hX0O&a)1VeSV9Us0GA at bhWTdcNBoNBCIoP_}GFzP{(pZN at 0i7 zV$gmzaGO}j-mEu>;bEqs#ilqm2d4#z4GKCINr1GG{HLJtGrFkvi9389lssi_vhoX~ zLNDP=ga8aQCm3%&SPp)l5^*7X%WS2Pq+aP+qUs3Q;-#o7&XF**zxutx310<&o?v|5NL9KQ5Xd_}A*B;nx`?w9IMaFuaI ztOiu~S>90l&lB?zrcp811w?_ji)S5MGegzed7gv6t}c+Tx+C~hM)l(fx=1*y3!>R5 zM!w4jZ-qQRf~3!Klfb at F&M2h>DT|3p#e!iNsI#WRnaSjE`q4 at TiVQ_S-c&$rB{K$9 z?GsO(2`9}&N9&2TU?7Z}RaUR~240=f-?@_2Zy|o~M1Xy9hI|W=XAr{Hvgn)fSiGLHGkTREq=r8iKoc11iz+|9a?lr$wt+9%9qzUV7cbV*4ccR?0C zKypf!>d0a(Bt9JUX4(jRy6N`0;wsCmYs|GzL at b#CSU{zgs*#0r5i<{<_|hpdbo;)d zvER>8RxH46*!;=4+5D`T~mpugz z;x))O>&O75!N=cxA__P}La0%IfO2_&fY|=qoxr~qZracux{I#-5_1!o*wMFvrg0j? z>qN0+&7zm#;bQAz{7J5yiXQpEZ5PU!Ha24WR_4;5zsR;92C^i at WZ%f z%)|l07<0i4tI~5EmX?_eQaWqFfUo23(h6)(GBYxspS$dC(FV&IYQsG&)Z-pzQdmy z6UDlNL&duNIm%D<#F)8#U&`%ipib26Tv&POycE5dx0+F+bELfTN5kV5AYgYxz}f?- zAw?6hxrql(;Z$u4J5I#ebgU}DF28k4MzcnCPJuH-uE!d%N%Bd0QyoqH&F?CKrjN!C zokIH5Af};bK)jYmh&S4_8Q7i5;ekThgw>DtJt3ws+hBb<6$$h$Z`6Rb$0CDItOOX3 z-heo7P_Ws at PH>our5I!movL(Gusb()%qWaKxpB at pRAl=cc;vr^@YdxD6HXDfF at u2xHg-FW5V1@^4`q zI0z#2^QbF at xfe~QO{gU=^fl$#N^V4`0kTd)11n4B8&-19HXKTLe?!YU?5zXA={Eg5w(R9??p)rwXv`fNWW>S70kB%hp at h~+% z+inONxh8kmlK>Q(_q at k^4u at _utFu~le+$0ij9yaf`{P$D&;q|YlTX3uOy;g2>iJvA z;hx+Vvj4bj@$~4Q(4srpo#K&j7Yv`!^r%GAV at IpOMz?P8P~(e59nE}g=ehSG_edg- z9QL~Ndo8qbplgpX*ZW+6B~RdwZLcSZUum at nEzacq1yqXFa(3%(22PKQ4c&Z}1$W@` zDR;>7sDqgP9U~M$AG`x&EpWCw`q5%?8G=gFPQ;58 zBIbZN8^Of(6D;ZzR5`=828=X`}rL}E3=excG*Zp0AfI8KDLb`!$#lnfW)#4;=#dG=|X)J<>=*R|SfP*F!!pz52Fscrs@ zHf9799UjEe=Sq}B+L(Ib#Dx>h(A%z-Xwr*G7o0jUtnDR@@;G(rwN+(L-#kFD3;vJ* zn;7v}=A-Z0Tk^Ruzxi}$lyv}tBi$}fC#5+7&@mvJ7N^^U)Rl~TP92wlI at E1qo06vN z54fTBqgrq*2x~i548(4^^1&-cY9_&-VfT0SAD}xEhdn_gEmQun**CO&=&`x0RCv}z zDt0 at Qn3Y&($6xgmRV(>S;yHg})|BB??q?f(D2zL|_<6XvQ78BQ)rK1H66w;vyOHncegU$T~qee__Q$W2MIZ z5$H+G at isdqDgw6=;y_{t9lTTN^Ab(LooXYG8cY^V@!{1qR2P%&w3i;C)7G-sb4075 zJ4Fp&E~o88pc9dI|BhYk^357C#c4Kii-T6|dRYiyZq&jnw!8NnUYFNs&i`RJiv?hb72Pw>J_qkZYLuE-`{I%T4(fvYg|3H zqm3riDf$@A5rSNPhXC?<)Vl-(8DYMl6YkfI4X04ZP=R_ZyB!1l0!ksnd`f^*5C@}9 zc8<{A*DA3ysy3JGY-7?ivknuob;h15cbf8c`Vz&VIBbVg7|NZs!)spOE%DDEy88Dh zvN%={t4GcPvQkYMTY4e=_UH|zTGUPW#Zr*0q!Ob0yl)K~KT?Xo7R&Rc##KaO-`!%g zpCH|duCdVha0{0)qCXePP1_$%$f0bB{2xp+rBw?P>ddhOWe1nJrN_isO;l1n3zBu} z$l?^kMb_!e_x`kAK)$M`4z}E0LT;lR{C=emyhfZCibU>CxsIRn2IH*d6BG+{3eHBF z2XK!o>+}Yjre`h7nrf=-nBtse{H#A8ZQk_r^J3Q!m749bB)3{J8I&CAB`vLKx`gqh zSZeznXuLa{u6clGP45}!(|<{Tm(s-1!l=V0osX{=fIlaHm}b*TOf=5Cwc at rg!cbZf z at 8hu4=Flug+hF58ejz#7QE;`(ywU``SVL$$5D$ZAa&jKO`a|>Q0ZCy zzjggi->jnEhNjFfMqiYI?_bh5J(Ey0c01+Lr}vf*zL}+5=Eq55sjvgbgmUOm1UHYO zpWl!O+>M{P+GXX zHa0>?M5lc|PZORCN8*}as3nw2v%^_sgV~b>{kf|j)RoncGzF&8`3MrDnpt)kMcN7b zYspnT_9m at G&O=cIba))ixxZDZ<><@lI6zx zqN=1)6sW35ikp-LktA6nZ$&ey!_CnMV!u?sw*t1!wH~j}0nFa1HoYgJkMERg(VkS< zuDg0IB9tnzdeJa$t!OdDhMHeA?!n>FCTziqfMTV@| z^3Kqd>)VcgxCeEp+v^o(hZua|mg-6|eU#g|m8R at TZgWcN2cZf%kiJ11m(-Wi%9vP| zvzFpVyd{cwYDYx-OMPKmz|va$qGGVOqGl*7bH36Tmhoc at z(%UY2dACzE5>#!A``^p z9Ac9f^<<(}Ebzt-tCtu*K{a^*DJkNzo&o at 5wH%B4PC4uKxb75|<6QX-cKEdLZ<9TB z#5$|Vw(jB`Vpzr<0P)Pk0p~8Q3lJ&o07zBM4b4mF1)Hg*e;Y2F at pDtyNu_gi*zPyJ ze;pPpvmIyIu z3{9DO;2+P#*bXl`;|JrItKHkWg;LX33e;Z!FrKkuJL5)jW5MHWM#rf|UGJc$ zvDk$HYYXnx0^a=_WE-^C^(S3nAZ&kOfwYi%4N2uP@{%R=Ia|;pZodbDK^I(JB%wRNc%_RLYvSy~!Ni0Zluid&`J9p^*JHB-Lq?SxAJC%!G&W$DB9TUK>TQum z at tN-F!*K7SI5PU&Qdk^rOX8JUo6-#hpuo4;RWz;e0yM$qeJVidF)GNhT1ZV1+}ntXs4n~DSP)GlQC z5oP&)5o=BgP}QdRvNK?BLlDZ1ZF9!p4ZS8$tTl;n-{tQPqP`Lgj}O*qC$xKQHeXpj zt!&e;yqtayqFe_L=%V?MfVNCNnH*4`DJKH&WFNVqaV7dUW{*@vP~X)=i8uU%DY0;$ zM8d$!dUibGfw{-lB@=*7PmQy;?zxBH(2mlT1vl;&zvYXN&hi)ZGQ+IF$!ghNnYxCH zM5)J_L^@&l(EObNvxVGTsY z;M`v1Jk3Ll<=Y>Z)1ei^<-w8 at IXebARbgp8)nziLg{D_z at dFK$6ODHGveG-+DXR*1 zl>j6bjGA~k8|Xoezi z2ItscVBKusijOE8psdm?=G;unX~0FA%{(41Tcs!FeEMQ$b5SpRa0{1PKrJ)3ycyRu zM^_ctBePy%xp-8m;;B;qw)^Z0y~BGlrSCeWpNb?8vn|2$LQHqi0btq|TE6LO2TvE+ zUtIbHX{ALNY}5ptP%2+SiGH&wTmrr#dX&H z4;scLs2>y81?%D_lK)8qt(Ob&pFs%pcRF=^VV;r>B#%=sS z+!c#q!AD at h$FYE4j at 6XHU|>UoIaWt}CAw at ZtkxvF{3EOyw@~qix^p$i??@0&=7Hxi z?%r`^;q`hjt9nF6cb6{2+LYUCnul<_T`lcG at X**b`A4es-<%QnLS8%(nhrcdw*31j zxi$04^^8cZ9(pS0Qx9u9Xd^j-gXa&yM*MRQ$PoNDgz%*UJ?_iWpZGF=gzj6i^B~ky z{-Ra$2&l>M3Pi}xF8&1EO8wHf9Ey+($8sO%QOd~;=~dd^!I%~iO}qUyHF{tTVw=X) zt8LoJFNNzh6!Bs5#k>!bE`LRH9}yHC=)?E%H8bH|Qd-x?usNIPupJR&Ce;BsU$|)F zP_&re`C8POl$40WK}XGX;vb3qR#}FSJ;2)5M>E-PM^}2-eL*|rdy1n;7>`-`ild1_ zJz!9H2mra~?vmK<6SdEk+r=0Cz|Z{yev(td^Z}-FE2TWZPypKyy;~ zft&ULIrMVA5JJDhzHz;0I|u$j>7CpoGxE~$z|$jA<9F at +Mc6g=C;$59`IPPpv}?c? z$nY}qVEGlMxfOVFkE(u9Q$YMu2BQyCGVNzCMh zC&&AM8E`qX6Y`*PeM;<(Bygwma#ErfASfw=a8eYHS+M7gmUhV`+?P?B?CT$YFh?~w zcau_H;XZ>v6LMeEdphfj^iWeSqZK6o{c?teONc-pKuaMRxG7Q(CuQiP2vnvtjNv$NU?1t}7Tup{9-e1S=O$RIwMrwDa z&!IL!<#QfY({yVRhQXNDt@$PoXjx|gSJFN4z_ux*n5~bh2aaRM)#%x6UE)l+<76*F zVoo7n*IhL`n$HKXJ+EM&r}fbGo*w>KqA@!61%tf;-(HESxD7_)RbEg`6LFi-_>X2! z$Xl=|p|hzJrQz*7U*%_CMI2lF><<>7PcOVrxX%jhwM24oucDhmd^#1XDxo5snD-F7 zp45mF?wTCJyyx4EnFs)arT`JgjdWu`%GbY?o}8AcWG8-rfGDDafbjm;N>Bf>rQ^S> zLaA-L;;JBL!}&u<%4n^X0<1OhlK9cmMXL}}lM8#y#eK=el@&AoRyqMqQfQ^3-5;)R z#vC73J)$W`_{?+G&AjjRZaEt|G;%#TC_s=L85*8_wkKV$C;KP9v%g_LfU}{!5-;h} zVUxINV#eJh_oP z%dmiCH?ZP0TvbYit*Ts{Dszby14<;0T9jI?f(;>HYy!cktPI;hrZQ$-8~{m{74-Yj zd)}%hH?7~WU0!;Iq_t;@6`Lpem}AJAsVLNf&AF#D3>wg4mLEg at Ay-5&KMgTXTuVnS zBRvwM5J#7fP&2Bc!kW(g=4el|k$sxw1W`)1DYH1slnmuEEhD6=DAl_5 at SJ4KU!N;y zABPip`;kT-oYELmFo{rZE%8mdBQwG>Lk$alyJIwi6EAD$4M1g;!;;z|M at sAaHIlWO zVw4rV<=IC(sD5lNk9)BhV}Da?k~o>+lcGqAaNv>Qe1TBkQ&XcY$hJPB--$;LsiZ at D zUg}?E6OU~tfj{TuL at W6_%Dr+sEylmY;X!ub>Wf6WZmaVDpk8 at oUF&hI8X^|zYCaYx*IRX1Re+Njm zJLY!maqcvaJSA3O+DqP?o$K38$6Bk>=B3TP*4eSF!&Sj`hZMYI;5in4coS%|stqI% zo)F;vi4M_&t%37gl*Yl!v5T>Bb9*#=X at O>*F3l$-+QIf6Jx+8N zJyLiVAAQUV<*$@Haf9 at c0eW@c=dTUQ2I%KnT0{+nMmjl=WtcN=|LOSG#7R~K%CSr{ zyP^>vl3q-gP{Kh}5Krw$M^|ieB+!toMsVD5IZ1`bxiQ-rO+XO=l zsXHtz;V70_Xd=+`{p5yOmu~DwJQ at 9Fm`1Q>Zd$EjNNrTU1B1T4Mtdm+#Sw!H10%9~ zIla$Lj%@}%HVi)e4S23eBWZO0-lm}qt0+ZjWPb^`qWk83G4MRd2 at NZKvwB^f{0U*9 z)g5$Zg0&e=8GRWKWP-cTj?_ at M!?x{}>0q@oAPwzACEQWU11tx%tyO2E zReSYL?FER|>%+kpnrKj&SJH>Xb#I7L_bR|1}I%n`Ux3b6juQsFxJ`u8LZZClE5XIwPJ}4c9-uoPqq#k zRYNtw*YH16S-)A1A9GlaCpR9kw%;x$gd3xgJWpayq;&6Q5g52mV?^$M;(nI7b?XZF zit1rH`c}{Bg&ym9oYFj~Fny?DJg~i;!@l9Yc|d&9eP)?|=@$5w=C(b=;Cc^8NuA~h z-w39fRx20_7eLYWoPkcr0!K1e3Pplc(=Fe>?dD29bDAOGnURV81E}R;qj1W*) zs_I6h=q at l4FbJ30<|kZl at aHN}yV{T^?}Z&p%#R|5Oa2LuSj>QRmbjDJG~@Ze+t##; zaNM%Qw0>c7K2u61N??0-o-i$Aym+MW6i9oWFn)~r0=^_vK%F|JHGV`oZ=7;F2bzqS z;jsDdgpxnZs2uZYOn@%$5qtkxXRBYyd$!HGVl8SbyY=hS0KH98v0(jyQa|`G14QA?z~|n zoHKrKOn?j(7l*9WHVF{ZVa5UiJfzY1{o<`?lUmJKhS$lH)(3|bx;25uEFeZK_|_O| zrm at 1*pb8S^Vfm_q+3MJ1zl8agPW>WF%jbr5gZIlf|xyHsDYor4uL{+=7Nj9;`Cqx zeFJD8`+TtSf+vfhAkB<1C6;M2>Bj92Ib(Bv+E6=MNH)jM5E(x}icI<_eeXya2w(ve zqJgQpN(1EeBC~KA3^lbPt0Orwv0 zn2tPN)!bB0ynGYq?se<|&6+Nf3YUTIFx`wPdfWfhp z47IVUCeD+)R!^N3JM1&T$M80gk}`7hkrcy|)8>hQcWHc%EC2CAE?l-?Y4>A at m1h}m z);J9<5IxDD)?urodpLVTO>O;FBc8m+ at ZNMUfiXz6Oi9uCViO#tDr*~Z1H6u(34~LH z??4G)Xj6pDp5z#x(v&idf_R4Xg5hJjxZ%`PMICm`u027r>;eh)jGDik zpP=DNQm>Cd9b3Evc*fQAz+anA{JtD2L2f8E;(vVMcLG@&Hg)rSled>AMsoC8b%R{kEiq04+u6or%ceHrF`eKpuQsjV{L=nCmniI3a`dTTrql1 z`NtoKIr0%4+nx`^Ru)n|COUd`k|pTF)O6cVn0lIL at Io7Jkf=wrO^{-z4!`UN*#mkDQx&zMv-A?n?Jc>-)~%UL?8z(3kH!(~SBquVuBAqh^-dh{ ze4`t64Q$JKw&W?j2kq874(!x>K!iDX1Lfka0=l>70=YcW%j$xvMjGo|c|$B!0VY;F zoj+bY9gu4#(&>HgPNWK5!K!vMDe!)#ED+$y$SKAaPQ!$Sn&<+X^ zBuVJfnC@%IO|z|2{b?4`4dm>k?Rk8Z`=C#ZFPF*};!F}%Y=tWvieW{$Ur3Ced_)4i zk-FS=BlB?wEWtdA at 6phY4(E-?+*e^6VaIPfHP9I)=P$Zl3;1 at U7U{$!8LVQ$UQ3 zkI}gCVMh(=f!1lFRY!(;jViR~4z2cff5p{7vpT*2-#r8bGwFL57qEv6?U^BJ`nPvX4c zXSSz)CgwIk4^NcuJ#!VEJYl?pt{1dW>#yGY3t8du`#IPJvcuCQ=&b_^vi*5CJEI{Q z07Nf7f>5fKF6}VDHD1}LihEbZND3 zqhkjONZ9ulyCEeda5AXr6xDB0`tF-h|Cx14!w+cJR@^2zc8vuOSMeM9bgO7EKOrWF zzbijs^ccM$pI*5JyDo6A5VTNHuVStppFc at mFdtnySr(x9Qu|9WTRNq1S?g5p!pf#K z!*h7#j{}PF^Rh^?cNd&2Z$~uZucBR8RqhEwff}VJrH9}OSXrYGbyg8P)p%|GzX?`; z0FHw;F0&!tolNEIjW!9qy-J6bkajakwS`y{@a!ChO)vB> zMlje&KQOY~Ug#D5P+fH1l#8KRAmdpINE-#e1`G)WNhNtuVo+^7vLb4~q at cJ2Gz|Z&ToX5X^`#) zziWXtKW_$N{H7o(Xf2GOD%gHi2!o1%S`~qna$>6{67(*GhmHDYn+G2CHiiDPq*~LW z;KYU6cw9xr0Z9vS2?Uxl5(>7;!hgGH!CwyHjA|tI%fxnun<`|~J1P^ZCf3rh+iRm( zGLTxxs5vlN0FC4s=3A5;Yy!spC?xELc%WQ1b?UY*OAV&pW03^u6{$MpO1rZqfrL8>13K${Y%P ziGhoJe3nx(n at 1=w^?-8V0F_2?G;z2rnN8+`)KqBJbMKq#LO{rgSfOop?(_WnjW$dV zfxxYy1wXrQ5MdLIpLj85%LsbQ2u2H0f-VM+kM`{gjLJtg|GUqd-z6QeS}DB;MU=r^ z0Ou0J=0MWnmVm2Bq97*-l-!f3 at Mn=w6aEmU_;G|vOqt4`B4J->UTt8XM5qsu=#LqZ zFF7Ry`JQtO&9(IhT=#0lOA!ZFo%GxZLryP=X!?jm`iPT~!>9S%96z=eX?n%>P!*D< zGkXzl1#hXL1UJ|~Ou?b{?BQke=xyJ>$pmlkivk0~VYuw^2^odK zn22!J2w9~iL~+r7(m9?})7Og_Jw&rb236fvyM2`j1a(7bcUP=O4S2sM8b6r33R=dZ z-%Moo6}FdGXal=7f?LJ)v9`accbs>y!MZXi(ZO`35Ou|xIDj4n74TxE1P0ZV^+ma)523FkL^(R8tb~(}_^<_&p zX at wqqva@I4*jixOS_mwb%Jt+`zevC6=NVS#oO`T`u(mW#Z963^>euD65#5QrfO3R{ zqjk#_PPg+vPg3qL9 at lWa6b+{yXwZWNK*H!4Ux*xB3n!to;og9J ze*2Vr9Ogd{^0lw-z=I!hyr((n`66w46G61~j9dHU!#Dn|>(?~X_ZzEhX!xG%%5>W|c(ToLYPL;5jz)CSTCSeRE{0;_pKjA at _hiD($J9Pg6rP4cE z>47IFKO(bO&MsK at h~)t{r-@E2=_ at 2%Q*$+q=o`CdNNB<2taQSY6x(Y8~ju_YWED$Kb2n!In$S z{gt-W1~qFL8U-^IQ0&Z1&Bxo< z3#^w*S(=k^cQ%OG|78XEgTDNkjNL?;*-Sh~SJW%F>QLO8OPF{QLns6=bNHivQFs09 zu?m+EY-A?8;P2GCA*n9;HDk)Ewqwg7rz8tqA`6K;qC>Y5Cd6sMPl^GkRMN-t4bbZs zR0Q<3_;`N%;zgj~JQRDgg*RBzU;Tn;$+KStINEqhl)TZ0u#0O%hAHm^iI_%FI|QIg zoJv=+wRLEP at QE@Zk_Z$fCu_f)atjAZW@&aOh~@QW?vx6c|9G~{b!!uv`-)V)Zad`L z4Ai}Au;?7_j at kqXucqZ5rOgaU%q-a-OAq{=yxevAd$*k>eR7%6t@?zm(3)1j7KJ*> z5KbAJp=6Crj68rg(!-oa9P3AJ2(ADxEuJ^^x(sj%U{GW}r_xyA|5JE?Y}>CIbRP;Q zA9=&RgxE!}f?x&nG>bdB0`>AQeAZjI1Eenh=u`I}eX{%)$V&dvsW8CQ)WpHW#>nK~ zdj}~_$bvDUcZnGPP$1;%ZM751r+3;LA0#0UpF?IO=T~o~F~X7Jrb|23|6s%N at gp+n zgcn8*5!YsIIX-yEem at yGUjGfE-RlqP33-7hPaJEc=$ZK{L#3Nh-}jczzkATgluKp- znGV-b#WR&ncrr^GYvm}WNZ=OPtI$}!QKpquts>z3C3c1Bn$6^HD!F8=(pDY+qh9GK z`T2cvf1W8fw4ELUG{a7M%{;YQVyv?~w|mA5EN0>puh~IHj7p3Vh^WH|-DhQ;Zb`SjI`JEP2nrv at oMUJdZ~HM~&nE9Q6NhRyIcyr~lOi@!$P3wo7(^5&dt>`cVod zY-251urY}t#2_j}8EPnrv=ybg4fP0SSm0m<(+vm@`d)ERkx2iKgN8{)@|yo_l_4^4KR(68$NjWK^oG&DyeWNBCAqlr85?5$K{b z at JpAmb+72K+#pqKJ at O@vJGoP%_$ZCIo2{)%ijG6!`R2&R&U{ zRPIXCWI}YMf&O$iRQ_)nDj-ssG|$q6HB50K^CMV}#rm8>vwHbf&{Cl!oFghXsyIUl zNA at eE9UdOsX#{7E!9aM6gu_p2D-bCb5_-8E_|8O`i1Re2b5Z3SjspmdZi^A(c!B)S zb89`^#UKC%0zwY)Ut+xbXKw#D+jI&nl#|&czZOr$e`ctvaO%BTf26EOkh# zc-yTH&)FCS^9=SuZ#$|RiIXxMDzkl3v4PpmBLXY2WcMx#h zuLPzBsW_qsQwgD1-^ySfU;E=!zDN;m-XP zP2UzEO;)VoMOrkk>`1{R0kr6OVg32JT!xGeK>%jLjf=8E)k at 6Bp&a5xTPABH+WR;S ziE}?iX*He`6JDKe{`%bb!HzXCVn$P*-+$v-<|?gCZ}WEOLOWh5$0AqCSx8OfF@&$X!u13E0Ftp`3UqE-ImpIOpmPe&Mz{ zbi=!y#@`b00>_;w+6XG|u&Jm3!T7iTWM#2(~Iby1m zrbAkL;_(}CFfXAo-j#S zN(oH>`HNDco?HWA5F1`I6q|Jw1nyTpNu)1E*@ zE-jCG_NSQcLbeX7z%SO0CSVuu=Djy?lV#i2=M`2TRxUr(ND>~%^sAMmF~fdxCmGw+ zWFt&ySjT`K)>?L$7v~;cAw{d*0M8}RUj^IP#vx*zP^iAW$o4$FY#rfpbr`e8UBp3; z3Ag#GNqZVumoA~mSBvAHH1$fE=jtqbpSdt#HrXsyb6v6;#TIC8`V(ikf^B3THyX&; zCR%>DLN1-a*cfio#N$11AVmjcN!QL5Jqpbev%+%F5y=)N>zO7_%H*~tR$#O0-l%79 z?V#Qp%+5-;sXnhJ`9g|}&z%B+EHYf*piA>;7#quX7NYzuf+sJLSU36!@+ALAw`td0Vzw=!gC2(v^; zSxzHzytjA0JcvX&?rQ%7!VZ|bvACxsUw^zjoTvWT3ZdYcS|P3ON-nQK2Z+5NN>KQ;ouZ19CJQ>^*XEx(K~Hl7H<0xYgo-Z%ddNM90>;q-#@xsY zdV?DLokcImW2+#fc>KcH-2&C+f4v`=FG#2xQ)kH^xws^q^Dar>>V))TfB8woY9J}n z29QvajpV1AGUX_z>nlF!3QhlH at eJL{Y4b9ZMMjvfQ8WOn@?+AAHtJ_c36_A5OD5OC z?<3o1uNKSi`Iqdbd-757>z|N#`2z$*;lJrK{}vyW{=JQyfeiuGXmE>{n~8W(DK&uu5ej{cHmT zSNwm!#LMCi_}cQqN5#jW*0x~=l%c%GTz{U*1Utw@=JS^@nYlHKTU+)3t&{@q=}=%c zP2Ci=pxb?V^{vZDcB`F42Db|haz@@ML-OWT0{IDl)Gt%o^zZLr+8 z|5g~>r^6wKk;Cr%C>kkK4M*~7t=fw>KVqb;;n zHTj_%?#{Te9~LhrY~7`LO$aIG&k$&S&~r(o$i`;d!p(5JfB7npi84MTfh%vZ^Pr52 z^wP|D at 9F47n8A!C<+jr=IyNkX#kPQ>o0F#qU-5lc6>(YgdMzlULjyKAsJcm0U$s_fvnZ)Wm#EFMic?F^`J;%KcIWv(w8Hbd{uf3Xj@ z;0*l4Eojr2{xOviW)(?OzqM at VZDqSdx(e%VSt#)Lj`nUz;SKIT8(Sb%QGmfeIf5X< zf3J<~e>Ap#WlmC)4CzjflLf@?`dLRIDzMKX|>1XVQokx?wjbJ at f{PnJ=uYh4;5 zI`B~R-VDzhfg#yK&P z;|;v8m-pkJAnmo-0_a%hbKzD$5?aaml=kk^BWVzzcgtV2(bAX6j30v|IsSUl1hnLZ z&pClRq at obfS5{A?M&;r-8p23(mpugs^7rM)gx0;bP+L7RtW}LXN|eC{RhMvm0uVSzJ-FmxHDoPUtbIq!HB+ zI++Y$&(<(?Zu%n}7%eSQKZus_ZOWnn3i*b&2#oYN?vA1zSM{>*o})Dfs0O3f9**CT zPnH7 at E8)Ka*^_<>5o5|JF_}L>EIJ6MnS1pu>K6Gq6z`U%3vgLPnb?%JEF at OrHk921 zIiTC*QpGp+GfUI_p;^r^;VmFUv(u=;jR>BGy%kZE1P94}AH|xKMFd!WXtE8~_F;J? z5U3y+)={6GsWUITXGaj9H6jLM&J^#MdzAAO6tj$!;iv0x8GEjKBgUIf-mE8vS|%hI zuW$WX?brhHOIHr_CfsCN%(xR2)2b_5W4(4(ADOQSQYig3X)LWKH+_mxc2t$xj1XNF zY!j(B?Hj*Uka;k3(!nA?F-FJttJddu8Xcu!v=jCZvw>jPOO14wl&|u^*g$`$jihnI zX%_q^L*5KZLZQL#1>lg&<>lt0p)uP~srNELvMw=dFqSS1iQm=e}OXMnM9ZuISAEMw!qjwaY z at y2g4mev=OT;E#ordMwjPMurkaHpi32W(T)3k3dHI|and52%I2h#by=uN+N3&07&= z7r1x)_9aBYReCb_ie&|opNos4R_KQv#FTmpH-P+u6>;R7R?zkC3k?}={!R)rxJ-ka zA?$meQk5D~$xBbksrbbx7?Ib{@Ke}hc6(3 at Rm3+sW0vA48hww&ZtUGHgSb&QyCg&u z1kRA&6~s^}G_ltULGW``izr2sgRYi>g;+R0y#}wtoMVmU?p%Ye3TR&O1ouOTgiK%H z744G at 7lG2Fu7FqGUl-nu^`0wZe7yosB+(5q+J-O= zMaX4 at od<+IXqyyWq)mlX#dT2LCk#>rX1?<>=5kbipzv>?+D{Y3OmzXHHRhw_ at ig+; zluV?mt3T2EN=!_EC+~2;zO4S(>zUuh!^{jNpQNu5v%mNv;TV1<$gL3yN;H24S*KB0 z6`ZQYCRo#EWI|^`$4eO1G)j3yUcx`uiAAPkpXhrEWmWZc2sG0q>bxD#94N)Z7;ujwL)7O`8~xbhICeWF z9$`9zq>OXMB5)*l)cL7PqT|<2FR-R783Nsr#Y(s)A$ZRiPZ8-&2nhdw z6S)6xNkNvXjuM^|*{R1s8%AM at QDC zj9BLt(#?{VZRa9R#Sq}P?r)_Y0yBI9h7Y1MNA^7M;XY!P%xB)?PNJE2`>iQ8U!Pl$ zUh?V at ls-5ZX|fc4LKa-pj=2b|#k+WJcP at XHU!^9p172YEw55khoYVQG$&U7!ViE%o z2oYd9^YPAr_w3%j#d(DN`V6-9 z8$9~1!rxR?ib{(zt at EY2@!3Y3`4+ww7uy~-hFF1C5w6CMmAh58QsZg7R0r$c<*9on zCA+Ez0cDCDv#OmiMTPq?v;a4i5fSZq`6YXt2`|iV*3tqbDCdWLCIXt){9QJJn*H)< z6=|44Zn}tQ4#uK=8CuKM;(fZ#s)640;P7Z_Xvep2SE2@@T=uMsC6NZpekzqxqwgpM z8Kl4Ul`G&{Mew?^T)(7dqQUt{W2V8OE;i^J9@|qd2-??mb at blL{F-gtBJOnlFghiv zUh1RONceVhO`2zB1mJ3e{d}6owb-f?^3Knc#u#~83o$6rRM~ChP*?byxhm8YFy`rK zblT2u(9uPVlsIt-Sv{qRDD=TE%o&G7EFHZ$_PSAloA|&8dBb^)7>8sK`>mhzQzFJL zl!bQCjTD$8WXz6&x+1KuPnp#jGfE%~9P_;W9s1X-g`SPw)R?h8jNTt9Rz zL*HSK<)Xvk_u$Fb=*G}j43P+Du2-mDYKGn%gU^8deB=vnsA(uOO!Ypfqz7PVHcG+J zBN-cAH>=UzAzd4K27)tZglV47!Tw7YJGyKe@|X(a`(Jojw?BRY!T$MFKSlfR5mf$9 zQ2Cc%i#0rfqUgMeRueA5wcv%ZkmGv+MtGBJ6fh)xKkN+gB+bEo{0gVV_qQr)hA;fR z`JC14 zhkhrYh}Ug8CaU$IAp2m1^}yvN&P3GUh&f{lCiPZm2!q|Bi2(QR@)y6EscP^2C3Nnn zbQmZuZQ*V5CwxIiSdtKJSFE`GGR&_ zHCUx{tRn1tr}d_#6hkM+J9ui25M#fvFc7?9Z}PgV%+kvK`eU_&O#lU2g;2aWS`(b3YCsi|1) z^hDL{|XkipCwF9siHkKfvM9ui?!lVrNP#j^2n$kZBd#u;K%PSV4S9- zFBb~Z`xw5#zCJNDp-RCJ|4NT9c{FS1 at KY3&oZ6L7O;2W4#<)ef4dSb)Z^CuX&9O at I z?Vz7HG*qA(g- at 4qz&1428mOp$oL3iQU{TqqUyTkf`T8^0m3%Vj76ndg{ahA)CA3?X z1ba=g8^RVfpk8$*Aw*SQnoMJd_P&STL}rQyFvJU??na-iAVIX0;WiOkl;#fBjia=6 zUnhJF;<~WmUgTdu&BJkNc5D&S^mOQ#5V3R-Iak)n_Tbgj$+m&24aUthRZ|Z1Oy_kB z4M~9zihEDNQjlpaX{!z5$~}V!muR7X0F#Yc_=wts%cbkoj?OJhmctWktyBGj9c^9$ zDf)(c3;EAm&=>h?Ghmqmbl{M;xNrDGi>x2 at R@V7 at KB<%D74QW{__6uaoY% zg`~NPJTRe+;2>%deVxI%$ql~0 at DGN(i1&_=^7WN~@uA&vbtB(W*w{mJc%Fp5z_ti` zMcE4D_o9&oGmT9)fZ0U6U~Y%GL6)qD2d5209)YklMm;s%+`+tLSO1{{$SubV?Vsqn zsEiS&NU{Llg`Y-6M3~L}T^L^X*n;Q5LU2DzisDiKXegh+rmNsEy%C1rMUv`Goro4s zc5AK^xKC-HhCQ008Ww-NI-Xj^A`GW+ z&YxHbv(h_haQsQ{C|>yyFRZ<_nEUQ?pw+Eh9*1$+LUn`R&tAY2BZ>T7bY74 zL>4UJwIN**zT}i{2ak-s0U$r9p}nA*feq$w22i96qUWN9`hU3neg)^rDowCNj`B8& zS%nco1E= zySYh=`grA*6FS}CSu#UiOoG1Aw71YZ_D)Y8J*}oaE5%GR(=^DwC}RaIPV(L(ui-0R z_gnDkN_4Hl*D66(EmS^}XOmt-pbBIN*G3Nl7tXcfgOBNxrDn;bpukprFA7%u48T}P)mg?Znk)p5Qly*QdqPl#@|hZ$A2 zvZJSj4j5xp at R@%f&-LxH3od9(?YjPW(~d)^cK^XuTbwYUQ<>Izf34 at bW7N33G{5!3 z-yu5>YnN8|3*Ybq9q}HEv0rZx+qX<{+=mo-0GFH*3~NbAK+HaJPee0gzcERJ3D7ai zijmL=8x`Aw!zIZJ^qqW)S^c8wcyTIviA>ly$30vUzxv2`Akq at NLUS2TSSYw|NVtbaez96d4E_i8KK?-wRSf=9apoHOD!$8N at TxE%HeU&F0;?u8qMhCr1 at q)xL;5+TLInS_5Ck3Eq;(c{I3WgAgOf!J%WP& zvo6u33FoDyg7cljJ|<&x)$XFz;f%EOKRA2mAYYs%UTl5Vwr$(CZQC}_+O}_d?Zdxof&*s1m!_+dJyCRPJY1wf)el_mz!z1tes}58bN1; znfKn?pP!lc8IN9GZq`dTlVYicS!2V-C{-lRcyj1&C z--lLEvtw^e{=|n`yrVw;7hyQFk1MmL-M=xm-?;Rh4>8`zem+t|47!veckk+VC*JV% z)12V^XODjf_v1fD^G!do0uq^E>K&`=C*Ekj$q#8ib7gwS_X(KM_uRe@^FJ@)IKD#z zWZvRo;mzLGVZ}(^A;Q{(O1t>*6et&U3F1jM5$YNZ0!8FWOtJm+F-%WKl{>6qIRaSH zV29eqg$?V?rEb&OAL)gpo!NyuO{4 at 7DR9b7Euw!T_K)HWMK5K;Jgfk8xGUD+^$33*^u(`gwAOY6r$Z;ZhnfJihbN=hhl0>9Ys-mnlW<;ROo1x zonsdR2l_Us_A3ezMLOtHWx+(A@%q~n)`^sr%vL0=^}QdnT|OKn04jfGSb!JzS&^Bh zL%a2HBCLSf3ZI!=PxcI0H!r5gC5bUtI)m>C;W#9S=R>j}#YvpZ*{e5vQE)-5Y`Lp at L_2c zh^>~7(XSEt5M~{*CF(6+&iJmV*Hd^I!_c#Wsv#oLWJZjv+&R;TwM=ADk#)tAw#qOx zk&&~|PDXcgH_TN`ug26Ssr{4 at H*O~>B-bm-Y^{WWU_F9Q$M{08`ac9`cREeQG6UO2 zM|GpeFF&ATo3YTvWLz?(0c^QVEKq3vig{gILW>7Qwz#7Eq`5BkXRo1 at 2)aYSEvBfB zc5m6nh7|ktZy%5+0?5cC`Bv<)ty+xrhWzZ+`c0Mnxk2Y8h2b7R0Sgy9ExD_7MbnG{ zM^@f>*eZkA>o`s|GsxmEtJUTfeiqEA%593>aS$NmnzGSgo at q&*xuhTGWAGBM%1kFE9rp8!hpsdv z*SJGiaL-u6GZC!}%cv_MzeT!8E5i_ZEd?2Mx@!5JM{*@3^!RwoCH zL(^EGK at UVo+C~kOHCn;;f}}|rrPf3(JiIlL1J0qd`>V**L-tK?~ZT|pmly1L+eB&BkPnjEUp`edaWUY(`hPD znA@{tw|tvQ#%g(N+s6(igM!Xu>cMir-9?nQTW%A~L3oM?F~mvRrVh-QT2QtB zdVRq1D-SZ-nw`^x%va4i$Wdphp%?WynzXbJ6m}Cs;>l(3%R|ZBX@`}8sSc<#oUNV1 z#+Ss!6ibK$yv)?mP3O|pni!bZF2DPrDDc!DP}f?6OM}5vqlgMAXBQI!yiWmqE$55b zIvG)qbTbWOA7bMb8r;c2PShpH%^}-DcKMub;}1diZMgLmAk^X7dUrliF_o3mbjwIF zx;4*s1xds`$namfW|{_!XO=Et0p9-eEc!jUhxVM))@)d1G5li{pT!%MDw_)Y8^j0u zR~*p-nOU`!0{E&iojr*U`fMpnZ!*Qy&}`9v@#wAulTx}U?rMJ^HLee^b3JlJCQ4Wx znvVo&G2zLBd|Eh9<%QU(W_}olcVk;3EStR8A0`^v>jfN~FaghLu~L)FtRrinm1>9K zo^fRMs<6Bo`K8i_Rn-k#Myo7q2gOK&8c0c{K|; zB(yYB!1C at +{tg43c8_}lS_RQaesu at oSbVc(!sTF>iXtYiaVlM at -sX#tKcnslYe at Rg zg|WSOMINz*E^%{fhL*O!}$FTwzf|>L}q|< zrzI_>3yhfV&bV>Quz#pOqODb_TGdfz@~@oNAF5l9<1f*6{~YXf^-?3$f|cB#%5x63ud=e;rKjXF`G8+_WFI_kA5$V} zy1c5 at cnB#x-Wt*rhL at Eoaf7`ZTGzC*@L-FT_!cd>ye_uY?&>^Gr-&uZ`D#J?fA at xt zGool5$?Hfzt3!5q+(Z{|+5Z;}I_!93v|JUr5$(vioR`RL!=ND>)%4MWRfNyZntNYB z`lIwa5WmTR{fXS;K>8#XCLlUkN za4`qjq1tm9YxV|{zQrtg5d>YLt9mN* zFYn`o_|jbUk}RF~f- at IVhZD}5D2F>hnpwSNiUM)UM>EPAzAmQZ3X@S zgaAwBE^>zA^Ew+w*qH6t2|JYT?sg!7^jH*@aUSs7Z#%+k}YgpRky<#Q4P~+h-y1~ z at r6#UzFvMYnrrbaEnaX!WVw8sJ$E%+EX!t!xUh4f!PBU=An^X1*in~lAIch%DIssD zuCPsLK8rVybI3_I?L(Ct(uXp1AoZ|MMLV>}Iy+kcJgclIAo0zsfZr{+c`7zBzyS5L zl4OdP8=pSU?vgMo5^P~J$ANN$& zepx}1zjlmejWg5PpNfJLY{Ly{_;?qH)Dr`>%nct_YR$0JfxE>Xs^3cv^FeClX=)be2#kuXl z;g7HN4%;cy(e}29eAoNn<`>x^ZZ=|+C$V4Y11EJ13e~OfVSA-(2P at mny2Hz(^z&ck z*X+Xm4p1*1a)UM%0LQg>Vev}3YcdF{QDA&A+F>)?B*ESnQ()GQ54O@&$p`suRj at 50 z4gw}TIRF$2R11l?SFbsKA+65D0@G2x(ilfqGVfU=`#o96ww7)WpL`%ChNlozw2Dw{$aLj5 z+(6*?QZ_YA|6)(wEwfE%qyyK9ikA1Q#dbTY%<)Ngcmg-*LA7E2eyt at Y5V at cR$jN1Mg843<&5D>Ay}_ z|EmO4^fN2zDIxFnrA{m=mnL%=e!YuM at j~fcH-gAQ?sz z%t38fj|Tce#9>PIc8g>T4=<;9jQoeNSz}6Lny|lXar3))`o1&K44(JDG5+x|rQf26 z)Y)y~(PRK}(MF98^}gjL*sW#d4|M{Ah;-I!A^@DU2}kWUs;-8XB(1W#{Tg%27v at 1% z-5T~k(}+{qXi3=gmSLUi6{)H=GF0bBSTq at CV!P_Ju|FO;LOu%BERt>5S^7#=c at J4e z73%sL7jCK8b*PjPs>`g^omoZJ)2w4>o!YG`HZ9tNC(L4tjmy$XEf#p0u<@%RJ`ZmR z8TX|bZpx18xE;yF_&*8Cm5f_XALmg at a@%y*$=>EW4zx*C)ojZRUhq7sk&?Dy*-p&g zh~fRUqaFr_H6$}NR%oN(oy{*@(~+kKU7)kPvQo3>+#-d1w>GWT_eS3)8HklkQ;=Kh zB`oQ9^Qbv1{YA9R4!vd0k8^OCIU3V&Glw^j@=M&Bj)llSvk7spsuUtonnP*PA zD2?2L4}4Y#zWMyhk4*}E)->O

+-w=k0=O-nk`k96VY*jP}zjJ9tIH;Jm7tn8oV z8WkFMxn_l1ox7&d%Z)Uv+|Ox$b-M>ekZ7{ts%z at 3KLI%xyu8slq$bc&AxSaJXH)VK zJEB;J8436F_IJiwBgA!UlaZOB#3F9lL->GzPGG1YGg90o^XQ3#o*!?c5B0;^FW z*n`FaR0)Q2W(PJ{XJ~Pcs{ySpu2PlNl|E_O?6FZJqjSNO>90!<#d3=~ws#sf^6dm* z3g#iAS1Z}xRo6pDv@%}Ga~Iu{?R|2fY^RFz=}Nx(zV`-a6tm4rDb8B8s}_q^owN9^ z at 5H#D{Y8<}&#f`AFn+aoeqQkl9&CcUYQFVJd}2Q!8AFiE<#*)E<>O5f?1Jv3_o%dq zzF~b1m>=N%`C}X*Skwwh;D1qsUNFMecRizhlWUncW19qDflUt_VWbquGsz$i(mPPk4tSWRC1^yM{RZ_kPKX!g?V8h-JiN zWC%9WFa^TUI|W+1&WMRt24f~fdKS?zeL){2$$S<_byE_Hb4M#Qx!@y6v;Yyr9ziMNaF8>Xx5_ztWC>dYH at JT9Xn<}xFtS}@1!p3 zrJTDVQ6aq6SbbTgt<`i~5R4_5{BHkfg2)cE^ z?g5f-^eIQNw2<5S(%3Po0}LMXw#DLRlkU at d&dsBvfVIXFR+x497I*{J)rt1NKO_+L z9d(`|lv=1NS(ZL$W}i-^<^orgU7HObfV3fZV|OVRodD?EEc)gK6u7~b1+|eY;oFNI zO}%cdx$e)}@uI0{sudbb4nvBgZCPkuOQk>0HN(nFXhrfVJp at LD zdzKt9tzb at I%w at vg{@{=gC%I1%VuZAp>UT07&2SwQrPSa+3_c1kVEXXz0$5p7d&?ZL z(x7`%DM=L4Wx{%AgvMB at voPNWpL(Rn7P7)5zR_Zga_%A_|A+=)^U)_yBOxcHj+;l1 z8V7^pEzUfiseb{iN2g~C0($`UnRUb at S-JrMfi7y4;6jF07n1<0$~RNV*dZg at c-iQ zp8q+9)|}ZP?NDVMu03h*%#YF%cLy8$^zvB?vl2vVoMMbS68UV{nReIsSIq&x7kHV21BC=h2?u z!27at5vU;|=QarXtqz4?w>bW`Ywy>c$i^!Pl>Ze7Pd9zPg6^HlTPBP@{2#|aP=Bia zdfhvlH at Msv9Vq|PAgMbaj8EWiNuTedAb~*x%S$*8+HelNJB_z&uz+&Dp8|%Tl7nwC zf}b+KpF%$esXGG<)xpaMVW3RJAd{g3a&=>uer9E1gX<@v`EXF7h~!q?r~NVnEn*a0 z(;}FQG1ADCg}QNiOF|V(8)`q<;&|o{%5=$4(K4Bmq`o0~vN8za3p44TPD@%@!51-N z=^8rJh|yF|U at JLgxMvzB5EO154!f5&ciY`PgUuTX#T@`m1I1i|Y(-&MtEDF+A`EE} zAhkj;of{E~G>Iv+Pk2#kTHApV5liy_`y zQ5m}dD^C250#!LE62gEpM|N&mZ(dXQ{8ky6(o|0f#<{@>9NYqgW!kNBcWLH?JLS&M zSYU!=PP3~(aiX==QeeYIIUHMwJ9(d0pJ5AswyZ at nXck&Q7yEK(PpPF_gHRYF_lFb%z?v?L^@0a*&tfkT?q zP|Og7ufj0-9JNkPhVC1+e4&+gBPKZx-3-Z(R=l7)g;G0SQ^-3e+g%3Ic2)yWRbqHQdeJIqDH4*5k&rZUIksFoVpV9r31 z6Rj;RF3m+|k!eUCpj$=At`{o~&0*5ffooEmfsH6WUX9OOgPr|{F>}gOEY;_qvm$b5 z&(Nh$cI2AahAY>yOUv*uh7nMeI(mDc-XMrN9`k2VrG)~>T4 zHM(|@xzsE6q=NPA;?sSB{2Z2R`^vhr!gKDm9?Ye)lIg4%E=tO zU(9KrQRpP8vjsd*IC)-k;bt=8d at _#B8 at MMGKj7t#-;??da_SnmkmFvedDi%n>+rSo z?}}1RC3#YRql>O)yvgn>aUt0$=;75;eqWSNhsZeWn=VN*ro>eH+==E$jH6Nt`?3!w z`%Q^vKk%rBKDgdShz$lrV${RAvZ>PKmZGt z=H+h#ARTjM1ry;5)V3@^zGju52W=Va5q2P`)Nj@pFmVu!sR>dZw4r zX03>t85?J%-Xm!mCwr3QVhY(W1fsI2vxFTD{<1ibNS{xU z_|9BO26NU8ihMsdBy&+Q^UKsSIGj|OVKCN|D6mtwTa+BGM2S3l%s53RZOoLaw`h1r z>hBC$Lvu!wH2Gx3j9r6t7|*_bByIXQbbB=RlNwfB9}`wySv(3OZStdJGHf{jyxek^ z#Sykx^x~{|bI<+pj3|zGMJxMoqGn1!K$)a4x`sBQK?ux>yt*O>9g80hK}B4GYPUG$ z0tGB9N+19WXEXKts%rXm%LvL677~*-b$eWpGLOvnP-5rJLPo)9ZYHNZDpUzA`DX z7`_ at 6litGZsH<>7_CpLWWSl`ZyH?f&m8<3LT6(6EpL`-h;hsG<7|4pIq|Rf&$@N(# zhC at Ki=~wKk1EDn`&^6&{`k>WVIY0u at r}EG_33i!`qF&kVgs at wO|7utK!jLOi(~sw4 zaSHji at WG{xpZ|op?JLiHetBf$cbo$o(6AMg<<`FE)Z`N}`?mg#5ro1mp;E#K5d|fbShv=vp$o*$&TR#T z%a>>52p at b&+P=8dJe+<>DHjy$s02Z_afp%9iP=XE-vBDz0InDpB$EfxF?w-+0r2Vy zGa6u&Wj)ZHb)0BHYslQ6Q|D-f6p at X8AI>niT1OB2qL1?D6Mwh`{cXzsjKT22T&I8`rEyM9Tk=jlR zlE5S+-FgyypDXANSI85dLRM!JU}mzkNb_Y}YEbhOo$3!*h^JvAqYu1PjQm{&c3(tF z@$#4Yx?JWuoiO7n^~34f;7LM z<%d=_^ptVL7lLHsQTEvmyFziBLiH7D*-zMwKqI&Hqd{#zTPTLcJ!JQ5yM41G!~PJmqmUa+UQW`W5+_n{gY zAq;M1!?_dzC#wd=PB9wZOa^xBf;}>az316x3`KMxGU32xq at VV64}d*Nhk2omZp|=l zLvpx9kJ^BALQ6|V!!J!Q#nFG}lD#sGyAU+e*67o0&l7pPH z!945#6!IXh$U<{9fS>yUdC~^+W9W_#zBwr{%cCfSP4_VXfOcPHKHX2RPSi zN_l8z2UJT+uQK|n==O*bbllyALd1!hlxk^myXk ztspqfG*+=lH`!;d1us7t6=RvJzU3LGa$#+9?(#|4y0J$TCnF$Q0YSDj2T=}aKF=u& z5pgqp+9J+5QDGN$a0HtoS>pzg;F>~Dk&%+ZuXlr-VFGcxbWIA8M@|cRH9aGR%01KU z1S)@sGkh)&e1>)=sy z??U1(0P}!1poDQYBrDBHfRqE3HGLYZcP4{&nG|K1trcHYTlkr^&!e2gJ at 3Yu<$@vzyr&)zudX}vefP%?qniEJQ zGxWvR-#eLziDv+5n0 at 5_`~vA7B60rpW6FRR7>0kLlt*OA3l$wRg1s^vv!KLOtU5?( zH>`QjoSp+OB+{^^dFU`s0anA8$6?aZ<$gYl-KRW(%0?t&wQeX_djPPop7ZUNCFn$xF_D-ss76 zE+Dj=lSjIYEef>C%x>W7S at AzQzfllWwa-iNhoTx<6DsvT$4)N!I~}Be0s-~I|JQZ? z|I4WsH*)iIH*>Z!HB+&)viqNL?_CvSCDhSba8$DCg+^H_nt+1JkfO|l(2C=sF;w$3 z1sGkY+%L9C;g1y=gy*%V09HOW6}g^Q3AWs>uFkFpk+leF!ENYwrcurKM zM_iW37E!Y_O4gaU2g{0i85I8D!;`-SDMo7AdX zvhAHX-VI7BiB0~{ta6Nf!P-J;pE$l-!jMc=Y7rM^Q=VEeQ5yTNuxiDAIwTd8?TTaE z_z5?$dn&0wkO`Xm={5U36>6{Pq8t5yxsoC3mVS=BU#%hr1p|ihQm$JFUR32-DNk3y{yWn zC at p8{QTbL|lFQ#hn9d1+Ov1Pq{Z$(8ZAPDK!xfeCRh1r%KT5&y;jrP3C?rK5EzbSP zx`-|>-)+<%yX=2qGM-n?{}jIxuv=4qG+Ba?#LFA2aY at Bg5vs3eiqm9_$d@4E85yU zK2hZ-Un|4rj{p0tJ-&GCygR;lZPJTimdE>jY8|}2JU-fScZz<0E&3K{1Y?g#Hze at S zze{|?C{Ya>Fc8r9|7%-}e+jyjtC{ovF82SDZ at 0v4=|M)+(VtA0?TghdL9qTyFQ(wO zR at krtScsr&7*n>C7}`Yo+}o2-ggueSay^dR+pEGaH=Q)!* zlrB%COhTyvRU^vsbh+h zgIPgMHO%n)Ywns*srN%$dK8S9i#me5#u3>`IXHnvue33rQmYexQx=MRjw!c9aS`6* zk;>4Vj8tvvhxk~4Jg3=ok`ZU==ze8OWm--hj7|F+#M at vsO}d8|IUDZM{gAbs$;0*y z?DlRnvGd^s{HwQdm8}487%?zbYM>5eW!$BzwZu0AcD473+DGA zOdSDE&+mauc~A#N7f8Q_3h_#MhAfQ?3(?W%rmu=O!`Pd_A(L5Th3=L|1Te*BJ>#C` z$)qvcp0~Y`Wp=Hz6ccfqK(|vOw#}5TpOKSa906lWZQrkP3@`M!&-)OZPQjC#t!Zxu zZONhvNSEcQ87)aLWF9&liXqBmfwebtTW;-`cC55_0Bal3BaIikds^RGQ1#2zX*I{T z>Cl2`?VHPGgWFVsv(Q_f->6$5DS((r7$!lyQ at - z&Z9fM96ymf6CO@?Z&5Vl%y^J>U8XcoYr8=@JsKhpKH8;L5`%+i&J?WBRAGg@>_<%5 z5{;uT&zxOMWq%-c6o;0wbxP-s2oPVzf-kM=p7M5D)N=~#^5eKta}jUn!L*-XMD9dn zjhuIklO9G?2_Kd at 0i|A{Upqs;plx1C zdf?VLcimJe$}^)5tkFV0MVj?FRMebt0nuWA4sxKy`7{!9Wx2(MT}2g_!~aDs({k$P zV}0XW?B6N1Ka;&8vP^9$4tPQKqRf&CWxy_e5!LmWAJLd&p_)C zy(!2v%Qx|8M+Et)f{f3cv+2-g%-NA1qS!i^)SnQwfq)s;%3dmi at 4lwG)pJ}$xMk0t zR%K%zJAJ)&6O)QgvXgForaM=CqGD8Ar3Ir8({FVn<|vL?{72gRThROfK;#COde_%F@|mcLjHey=L{?l#b_9%w+C>o3r^zab>X zxWsR7#vcw()DteQw)`TWK0^yUqEM?-#0J+@&2aCgPSWc(H$+ryHs^+Rl#Mryzqw7q_F|YeTg9;Lf6X7O at n$RTsHJO2 z+K{$L+!^*bq~WI{eCpot($CK8?WWj^d+F-7$Ns>@xqJHW^p)}WN06|-B)dYkIkt;@ z${g at 3C;X>XEG<@N*YppB2ciH0iT?k9 at c+>l?B9UAM?=a5M-26QBZ*cAp8?R6WhkpI z)>zC*N;)(`3P{}(jRfX_2zR4(OJO?1Vq%#X$m@$dz__DHqV5Y(6|%2{{`C*6JAy(- z{e$bOO5HbDvFbe76a^v-^*+6?&#(Fnov*X2yFi%z5=@kybYat;dZ-Sfh0v42zXryl zh%rD%!I{$H4~%(Yt(3Z{#9ftWBL^Y|VhVqO&wJ5?iD?#@MGqi3aw(w}w-3!_AG)XE za7~ZpQ(eTFyM!11QD!$W zkNj;dm6peJrMo2A+={#ErSCSDWVwSkIAT3j9g1vUWtEa7_&3|2{BNY at m7=c#VkZf3 zS-R)2rMggy>S!}2J4#=Xx0DUm3!bP9D14t#=5{LcHXrtja<6 zhb8HJWrT#ENHP7VC#u1ukEvQzhdzSIrFdh_Gv at U-j zBgiR6sbqpUpT%~A(fNb*8b{4k`9nGlLsW$J2^4(PQMW(5z0450991^@1{l|rvwLMs z)X7inyhq)qATRFq7j76wzmP_+W;2^mcGO!}@x0zc zYX`+eXva)Qe%|iYBEs)Ue at 9kA0+X(tzAbz$Ycp`7{cp?dVE3Xl at m z1G>SD0+a+8Mcx}OUgnV=>`oZ-ZCz2a5f*K-tZ!hP=mT#mN0Qm>*AdQJCh{Ie^P$GY zk9g!0PvN&xBBE2g9N4ClX4$sl^4f0!_C1OaNE|$;*ufPwf>r_0kZY^P*!qxdz4$K; z!7B^jE2*l|kG6T1KQV5*D}+CIgytacmQ7=@z=`MTcL{6*P)gf$Pm=K4!VVG09rfa< z=!x(U+m+vOw<964s`Jvx&2(smH!rWf8Ey**&rM53)nhI{P^Cd{GMks31UtyRq0fop zu-s(9pf|SpLJaagu-=J at u%a>z(BmsujiF at KLbJ-oWWBuSepGLvy#5yB>^+UVIM@@5 zZ9%-{*-59arM!HjL)Aea17A!GIwVK_CU!+TwUFK=^k+z`LbFN>HAq`!E&Xy)Lw;U=`g+1}PjxmOUX}48W+f2jqfOxB4SA zjs9ryiaoK7>ixucfG^IVNlZJt(V8LKVjaK4o3qw{|M+A^EaCeZf&c{M_m9^^_1`Il z|AGA4UcRUrct5?F+gIi+P(-A_!pg#s30Dvx&A6cn$ijW035v+b!L9AKVT{)|ww=G| zta}>Ns#pG6*4p)CRapY414mZ0Z at qOKYPDOm1@xbLqyM~`ySuxytk1N5y-B#6 at BYo* z-M#(Vx$T(_R at ibO`0Zw^0c3N}N6>pahye0N!Cx!TV4sP=A5W0Ye^A1IQo>&&aQ6`5^U#UlTQku6GjjGT^UoLA at 9DQ{ zv1bncdk_8>gzp!H?|V(~@6dopz|UR%&#^%OMjr~Nf-UT4 at ViqOWX92GGXV=f`LDTt zUf>fmGyjuErhwn6O+fDh)Dw~NPz}=RXuqdU-ZkBTaK?4m^9$V#$kSGot+{j5lM`Ku zvEmd)FjE at ps>gRUNmG?o_|*sZZWkBFQADgaM$s9;K8&q(mlqFw=tRtB6IHpfBFn(h zG9^*8#$na=J$aMka3d>ETnB~t at -SE9tbJ`M6J at Ipxh}N-n%aBb&-Ctq`tgbE2X2S^ z{6c_-CBWxxXu1XRGqb#oCqKwVi5wD at y)Iex6fT#bEfZhN4IX!5t2{^1!I}tfhT=<_ zAytE at x0*tC)A+ at FPh#zy z!85A3m>(f-Op;jQxPtps5^qHnhDP69CaGaJf>h6ENB`E=+C at YhkYpXzizcxlejBgj zzI58?Q zG7GuUSG$O64z(bu#9W7noCK$~w$SvS61!FwBaTXARdwWX(f%B=5OUWK7!?57FU*&j zKpeTW0tOgy8ULW0cv2Fl)Rzff*)&MM)iuX6+_53!EgyZ}c=99>UL*DlMAHTB8kaFY zrUbFhX&S?_iF|=1w)Z{V$U{NB3GLd&r($d8 at -%51?&~Mow*y?I8dIGmwA4xZTA zDG}i^a;0FNLac at 5Bw2abG2$%aB~=n?QCm9}@LM9yrzOnEOIqZXYDy?&*e(6jFZQXx zQZ~~HU$&RhE~&!ab)p(2%o5JKQFc{Le>uZs^u$Qc_|cDkK1(KuW<=V#vxNpD{d^60 z5;#!&Vxkl`A2oAe$Rjm??vMm*Boy0^QihdIM+q_!QZ9Nk-<>u z#=ZP#gF`&r4>_?RybCvT1`2lmUJ%ZT&zAhPRLz{2!Q}?%5 at ViJv&Ve?i$-MkYjT!K at T>L#Lz`b+9UQPB79QO0R4Z8v#+5j2q(#Hl9?GZDZW! z^(*tN`lCdW`W3n6*-9E;4R8%HT3v(-wrrE!Tq(D<&Ja0VU9Og!bQeHDhboLp^H|@9 zpK?FNJDpo>nUJz?o%&GOcvKr4Q at e?QeI%2SRb6|X>%Cy-<1%o2%E0b%CM>+X0DErm z#an6%wd;i|9p;N_pPQ?MnYkUA*2;<&SGEeQQqeej_!eZrsyR;Ig at 8wZ@r8GT!#H=v z)7)|s3A^jGG=3OrYK}Cqp3wB}Y9{rlISbrXBRO~dUC%0?-mPj~MA1+xCeX4ax}d`N zq{_Zk?l|EQkdyOR)W3 at sn~7l at SSU)4rRHJ9+p4z0w}Ne->=JG+pnKDsC5)6`;=r4U zdeyHVHmzXqQ?>lA%%mE`!mnQ5;N6-q6QWR;AZrqh*(t+Td&gcpeZ8McqdV2G6FcyE zsX4PQC|7_Zzu7`>p;Oc#zH(%OLFxIM&P;P(90D)1FEbmhHHM9{6El`iPGP8l2VcV?4Fh4}HL-)>=M191c>D#)=gWvR at E>zLyvxm#vk+_Z zc;$L8+9YhndM4VVQz$*(N;{VrWkccV9h&*?OH>{IN>-!RfddPuVx!mc8YYW^$oiE^ za0-|fRRdpUIV#G<{>n4tiB2&uO>^8v%Ta3=erztIAz;cjc>-0ElRdWcDHb6sI at dsP z=)=bK?qn&tx_j at G3)tw*jtSHstr&y)*Qk@}#nx~U_T3eUb1OIDV;v$}A ziTRSfaVm5x1!rOt(Z-(ZxhwH|F8Fyos?Ij^fVjhSNn^Yh3 z`(i*&XRP^)W2eYzBT~APkuGDaP%IuBAxtD^D at 1%AhWAwFLjWls!y z0_$g#C&la9RQe)i-WhifsbaAZ)g1R@!`;VYsm6ngEM^3B3T_hYnZ=XzeVc-|pfjLJ zjqmD{BfF70*e_-ASkbkoCxfrW4TGZ?O|I>EQVauA6!xWT>_ z`xCZ*;G#dgiy^anU+_MqdS7 at 9(&T4x|Hvu8m!Jz{D8qCwID?g_H_Om8NNGpnEl^*j zYyfnip*84tD>kDe`3h-p^q`RX`msF&(04iXzO59TV z<(S1I_dfOHxPCgB;$gQ$0P8Y<^>A;i-y!hEnau=v3#Dt+czy0xkXfAfT4OQhIZ|X>sVj-KGckYeBhZv;t zA|rA|@Gdh-(T^p=UMx=78NI;=9?>qJ^pr8X_gn|BGsO2k7Kv}$+O+-;>^fk-)GZF% zIwe1+JbPf&s$&`LvxP-+Uspcg=#K9<#qVusV|Jsd{22=0dSIhmlR|oP4m|LNZ at r^- zX)OJEkpGrw?EiKJ9ll*g{j;k0X9l5}RRkY9*zh_(KlJVA!7pvuZ8VR_%wClccJ)%wn z_nm|AorCX&`mhu4_a1YRp6Ty|Kr=n0fLi&xpNub<`ea4>zj5|XQKD^2wrH-jZD+2u zZQHhO+qP}nwr$(yO52%lSG77-b at qGj)~Vat{Fwiv_YpCAMD&QmC1UH1vR+WNPk&@C zDy}^YdW6@(_uiz?O_fh()q_?{bPV(}{Y5<83Bi at 4x0*2xXF|XnsBQ&oI5BiWca`Ltv35Jez_u%E3;NYa{VpH*4YXqLh2QT$0R?p)Ka?_O zphr)ev^`b22XVJlfoR^OATY!DJsTB=E1Lais_)%M(BDuCf`|CLJa6)(?~zzVhN(nK zUC~KZ(OEU%oN at UfR{mU_VZGZs-a~p)cVnaayv<$ejW;|h^}%CYvRpEf(b8ykTFz%# z+F5U&b at SF*z=2-zkTxCw;+&)D*0JQiAkuC at aRz8aJ7I)ZapXW12c$-%sux^^Po`=R zsAXLYS>Bkn9uylHJg_?>#~fbCqeOJ6Jp+4RjtOc`cR19(|rDkp~)8-s|zCt}T zeW7G&2%~)cT#_L-(>}7<4kvvQVonPM)3q`gITkuBcSNj4##*3mBM{l8w1&%Mq|ws) z*9RF%e8=+JYF2&ALVYX4^p14wz|%h0{LZJbv^JZ6RBf(hSjy0u|Az9SMWkuPMQ1!Z zN<;WKvFO+bvN8YIyD0duH{Z*1E?{{ z7pSr%yry(b!vPiX``#GaBWFftldR}=TMhRoIUUx+(bg))7l(c at r769`H6|8sWHg7a zwCQn2qnXy=v>P>p9?4niN7pdIWqy=*gN at 79g~rLl(iA<$j&pYi?$$-cd{emBpAg#- z*n)@o##Gc4q1kLBDQ=99ss;xRF9Gz{dAIMsjS`fAEm-#e0s!QI006N4i~8<=_CNf$ zB>~xr+W$5(!@aoeVr~vqppqX3US|EK_9n*&H9cX6kCLu=i^#wB7Y)i~V%V)AalE>j|rmaK&Lvk0p}n;Z1ISlxL&C>t&O?oJHW9{EHD)FJzRA1V5+?Rau4l`BY)yoO{< z;G*a?W>_v`i()(>Qys?|27&oX?9`3Q){JE^wy{F6)*3XsklC;=uEe!flZ at fx_&o2j z0TpYlVs`b%Z258dC6u3nAzqWt?Yni+_FqP1fXg3st2f at RNc(aJO%+VtZj+k|Z zz*@V{?dR>DDhz1>?X%OY&b?S8jq;SW$LHscWBuG70~j8#n8?tRI{3lZ+;PaD at uZY5 zkVc`#kz+COuHgp1k|ry5v#L$ss|>apwWeE z8a0*|0luA;(q)rXFXjeGuJ-(XYAzK|foj1v9~*@T4+-xHJBm~{dEXea!*Vs_7SH!$ z=dbsmfg~m<&%<2D92t*^OD!2shM*OEuHm at -8zXDe;WZ2p`7Hygb;OcAn~B(0oSd16x=d8!IvafMu5oWKWsk}GM|6yd1Ia|ea4 z-#hD-AnhMP-aI^I=M}biz;ZD=qnpdAOLoRi(vQ=d+FgJOw?skEN_V3>DmbKKF6l`Q z3XYr$xBj@~Q9>#e=PG)?{hgf5!0Fdl~3{ z4fYYOI9s8w4W;9zb_0KOSm$)J- z9%YkQ!jZrKdUH6&QhNha&^^oo^j?;zbKD}?lw-M1>&L+~1>VkrLX=wNTXT;J;s|NksEzS=H0Kocx zgV=v;fY6jhl866>wd%ZTNDgTA5G`9nH7du~(U2cXVG5unCgPzvR$H-hoxU!I;K9K2 zdWwC`gBZ~~fV&mNI8Cx%OsUvjv~qQsnR=PdN at wr&@%@3okBw$KNL$R)=Yhpx9jOBl z94-g}zsIyO5VuHC-cqp7B%pYv=It&!fE`pzj;t=Brpko^?LJ`J(rlI9J>?PfX*^+x z>bO|3wuxJ_!|_;Wsf8%KIx6jihXmGX!j`OJpfVNkG<8K!a(0bnjIz~$_1&<#bg&>< zrWaoPz0#ha6|q at 7P+`;v{35mQkp#xxL#LZAqNvs)5Ag_s@`6rCEb0aZjRj;KAqZch z2`<`{pmtZiihN~8qM1*ok*S>iU>Ca5Vq2Q8yj`MtXe^oY5gxN05S5IXf3#$^+M4x_ ziuQ4x69X8*F+x}KJN$z~<&JMy5GU0>m=Js$_`GXKUGYwAlmqu7jX#5fmnkL!anLL6 z6C)~)iedsfUH?M3cps-CJm)}FGh6hj&_D9ZK66!i9<#$IQ7AS*pZHO3F-<%ry|=TO zGya5)hHLRIw^Ju at U))4a6fSR<+1n;5Q$|{?MiHG2?C0nvXqxWJmr`n8yK=sHGC_Pj zn27w5h at L-nj!4`%Y7TDB!7;brL6`16yhp at 7;kz)-br~y*P(77_AbUjJqtt`x6o1uS z3!f;wU4+wtHh~lPV-4)31&YQ2ng+2?yT}wcRZKJxvCl^FY=MMWACCSV267NiC`W#2 zzE;cHUO$4~>nzZB7bKSrG#7j?*-sC3Rr3bAfx0>d zTP7~4Fv+_isbN4?wlC>3>n85%hm*=luVsgs_#d zwXu!Ue@;wRCtt}f${~;Bay~C4LjdXf734{sht%Y~P6!Bq5|JqKK!?9qTd_7C)o5?b zr2a at CB?%!(N8v@?*)rsGqN=gdO{EpLm%g;0zHE8QY<_)yokRH%bBPi9XHp;|C&=ZK z)|C-P1V}7OLTpLwu?TK?ns=-Z17FiYtF*ne5pyjb;|l(XH?}V&f?hqQ8B}PuV14Yc zUIketw^~Dm5xA`=#Up87haG_Ik1R3vsDz%>*j;bO2{9Y5u at BjAFuxNEX$XV+FRgo2(oYME-c1#x-61#h{B1VD8k5d~ImCWiHCTW7sd}4xV_4!E z1gO!t+=ED>(8(fJBv1>DbRq*DT2UiZdYm`bT$87Y;=;aQiq5-0P7Az+-I0NHj at X;Q zX#n2yQVudV|27rXYGcN7usmI*yHLeq*oIxX$9w`57RR|9f1RAjo+g-JOIjcC1^pxz zCs)I!a=i&BcC{sAi~gvEWk<c(FkUdH5W2fDU~D*_u#*mv5TZ3t$ot|32p$lx{(1oa_!ugj{Aktw-RL zUdE7wiILw>X(e7Pp_IPwkDTI;%ZpKNf~6c_614)i>43f$QnBQVZah+ at Q#_n%>( z9C7s_^j8$vL;wI_{@=s?ADwn at irA|N-?*KZRFh%{@OsdQJbXKYW`e^mi2TUd z49avjPZz6S&b_rC-3Og`JU at ti;5!lf6vzg3dX#E5{Q%e2!r(Ch2G9sP7=DwJ#He_t z!AOuQ26FZZq@~E8+#%F#7{fW}*MnbO`)skea&{S{KW4(IFQ@(J-{GNZ&vul!{e_>W z^eNmk4W!6i<$L5HvQSMkf3BUzouUh_Ax1}lQySLC`vJ#n;Zlm}fh-QJG zm9DZTHiDgYS{_PrO7#0%&I~g=R-|k7ag#K;@h*$2%Q!#BdJcLN&q_LV?v zQgmb-&zPHt+lKu7hR0x}8r-IyL#TzMpeKdTsdHq|8C)=x2o~OEucFQ%I!|k8JQDt` z%k&bg?>e4W70m?D$)=X#8i12|u~;#_RFb*!}pj zHtJbzCtb=t5~tj5P4CP~VUYL0q>pSjut`yZ^@&$;S#ho!*2JfHaF~y+IAdf&Atp5p zOB{UwT75B^{{`k8o}`1&DmLM+2!AeP1gQN>-iaB=_HwrUWP^5e;BRDahPdP=RPaSc z;zgr|#PG8O6|H*;TIAD1G_U&+J!8x9IQi*j9ChyEfIbwIrZTqRYD>xFE-wQs2i0n? zm!ELw+^ej)tStTGNm$7o<=+tZ$i;$#BnJ+q3^H%>qb64giOVk-TDO^j6+7d9D10J) z$zNL|e)iP=n4ny$(g)#C1sl}fhbER}s z9=66Fv2 at e!XGi%N#G=><$~TC24&lS$>E>4h|wWc(EH7+tqeZ1smY?&PXU00|hSvmSahGEYfC~cKMGLr2zezCj%3JBCj(6cWY z)vCSON77N~z4o}0_Y&0a-OZUp4#aW6k)&oWuWjj at KEM#nwgFxx`MX9fo4&jvY0c%V>znlU?R~F4ORLqpOvpy`Vp}cQ at _dHe?jw*!^575AZAg^ z8s))g-3wjSfOLWBCps&3E)z~kn|1D01e1EcHN3}qT$UiAJksnPGhY_|+s}w#OURdX z5$%9%zyMcs2+&8g!NwNOCzf|CRTj%dJhu?V(y(8HtM5TH!tc-M3y+LLg$ffXugL3H zpK(y|0qnWN6S9|TAqt|)Uiuf(__LU!mCFuXMdEY`kDw#ci~vNgD4SFM#JGVvS2jOa zb{htg4_8j7%x-p{j at 0`Z+PP#q|05#dL$1JE#e|E_M$g0|gq5iGCf7zNZ({UQm2hBH z{R%bz3Io%ItWWnX?(-MPyRLvFLvzGg at b~KHD^0=>6o(4!8LR|vka(y%pVZnJ>ZCC~ z(yuWg00wzbg(qUmaxq{q^F(dfyx6Q(nc|+}CEWlH*`kf6TL=vZA&W0J!zv1yJoTz1 zH{W^ zAxC3549Ka95yOKgfK)mfN~zpgAG=oLl6fS5SKdRfk{ zjwjtXgVrZKID-cLTYocUK$-c5STSmbymM~Q78L3-++t^Z(8A+sy05rfz6!u3T{)2p zW(f*)@p~UhH$}G25$}lPx`AyDbs95aL*m1NFku(m*Hk6v16;~US5NJ$;8DqE$70SK zRrqcSTUFQmycF#gl`6K1#7gvXWt7U7`CDk`&0GIMnR#92NO%X;HjS6?j;=XBqUfmo zi82dyJlhW_9!CMJJcF at lDY4)UBIF66;1SWN0zFr-r?wfzL7WqV?*qTC(n~0HR?Qo( zyD8BP{-`C1OwVEQ at pVt0a^MLOGz at x}FdtYUElam5t~Jnn?e83& z`FZu$W!{*bC!&$})5Rz5flk;8bU6Z74;!Nc$MH=J3-R8P79)@q*BQM!-z7w1yWF?g zlmzQJ64dVHQ>pKM2V~zG10kHo=*?i?*pJ^szmC^UWPsBWtcTmdN|n)J1iwOYKQBb|nk`vOT?nRhhc2iGH~kE3^n%rYgDh!CjS` z+~=@4vO~fID}qKB%k5vr~Yu%yoM6 z(!3$JYwoYKz1kfL7+K7QK0LO0R2enkO`S_Jp_225VSxy#_=er5w4vQIb|*`wIj|=k z8OHzI*YxA|o9s~H5=6E2Vi{8(DG6|$y7iE=WB2#SJ$V97z7+il at QiCNkdq_p5_f5} z=xL|Ngz$7jdv)HfWu<1#xcBEP6)hG;RYJ$^bHLmaCw1{lAa{7|T$~#Mtz?&Hi3TE;T0=d#T!f_H0TPwCSHvt)OC7a6Lhj~T{41dD#;e2uY){JT$ZOUx)@5p% z@>oN7uO%RwL4U((VSyJWD>p~OkBfJK5r_5tI(y1l4-za#pp5I9p3kHG^$+=N6^F#C zC`!)$=tf>n_!9b#*mnMdvcEx;1^#NP#B55oKbEhBHM>V{rIU6pw~__Z)Z-hvrwDxO z=9T55+Mwm$J47Y3j5DKAa&PO~RYxJt)SUp$twk#&h+;GVv1DQj at GfK8e)I=qvt=FO zq>%eQf{^u73#Q*?ZR$q+U{;nd5!w?o>{-8c8ud)%}*j+%SK at S5#xbxCJT zMr!|3^l%_kH$1t4ObS`cS|Af^JqTHtZ%9;oB*u_lMMG+gSJ7$2D{WX)1=^i2jFXYW z+0|9Qp=xE{4T9gfvcTZr03SthJ&r0-$O%Z})++X(b9L>NxHkNN zfyg?RE8pVixd4g32eVYL1=A$iX|>1U#zK+WOxr&uTantTqYp)s-fFu0#nW_$a3cMv z?m9R^`gvO(t*Mp=Ii=*+j0)sya_E?a#FjiRk{AE=3HVf%j+QpNm#ZQD=2VFwuDl2J z`lI_}nkl3N%tR*h-ASYUm>8q&_{g#jixR9==Gv(xma?^4KKg?Z_xu}4ca9Fr-V{Fr)2p^aF?N4>}@ zcw$0TP(piKn{|ZvQ`83=0objpw{1bi%@^+PC_BJv_KGe7ts at Psc*}6LS}z8RRemUR z4{0BM*x1B!o|6FFBa#%@h{@Z()1TDW9Vkj?@`BSZ(S4*?g*r3(s63#5e&Gf*J9<8$ zh;wU;DEVk_Z&D!EGH#pQ!^Sg%_5=9O93SeP5KsJzV-404l~G19?C^@VH at 82YH@7*@YkPg)VEV9m=R!WE at 7^oO%%zx{csuR+glCB(2~uQ+tn0xt2B~M#uFeOx^UuY>WtKn7 zAOln3vxL`(#Yn{?);^(|G%p*^8V at X2)iYk$XhXz;EaXL8LKWwuL5 at CAg&NF$({}b| zWg6=8+>Vs at MT-cTGG}t at tnPiB0ug%i4_ at QNhn`9!U-P^V^ zNnu>m{mG*>_-W2-C;RR;phqPce-1VqRg_7GuKhI>@E*H}B(Dl~1@$X0WJP_oPPUG32;cu6&eQ(Bcw{8MiKkx8Y|0sFsd* zV-$hVKssuna&A}+O%$)hYh=mhiu9Q8!fD*0jJ-89K1 z!_sfS0m?SyN!2?oE|BP%DNQ$(*~Dkei1zru%fNY;H)j at r004rZ001oiBG3Oz`u(rM z$bT&IZL`13U_lmZe?g5% zZn=I!Zv|-QL;%-eT<;2^zc9Nm+7Opf39Gv9%1!?aWQ(8~2NIFLPjg}Y26Q2|Jqqdv zzyi4Y7)sZMv1jB_8tG|lEUp!cdJlZ(S4^Ow2_rv4;M%=Vb-Pq at 6IGo7El zvsA+X<&l8YKwV@{h8-L@^%=cE*|&k_ak96^yKsMXJ|^&yPR at 0_Q72ZW@yoZ zli~HHi?HN-{u(CZYLU(Z-K7Y1&qbw-EX;5MbCX*rD82!abq+;)bjGpRN4!;S^G ztnMM1$&{AmHzsbH#B}J^t9)sluACfw^B`<`*_RZVQckFp$#UE|kkk at e$VH>+_?AfI zZa;MjUr3{cL2a*5#L`aOlb!R4vF1k<;7 zhH_(sxq9uU%y&tI{K_Tby8T5d#3A2>`B9!2hkvU?*O&1p{+lPo z;9r?2)BhU1|G=)c;-&~PcO>*c10s<17O0pM5C{^;=|Tn|xk`Z(NJ?8IYDSBf=}#%NGT^|v>|5FME+pK zy^0iF8y+Yb0sT3jHOMwoP#WTtLI)?o$_1G?r0^IS?GUaVr(8#Q{MKVRTD4^4BhB82 zxImW5;rnhkW)=@RNoU^MDG^)8X7AQxX18HP$ac(eJ#pZ3^x?D^@h!PKwb7(CuK-OB zp5dw(VXu-y2p46q%0ox0cs1J6+H at 39@EC5C-Sf3kf0@|_Pn=1%rTP$BB`#yN4s5b= zVtU;W%^x at +Z$ji7A}-#I)tKkajs;UaHA<~#?}*x=$2a=yn#4bgPR^r0%TF25oWVrn zM0Tsvxmd|5zfp3inucDKP$r at _D+liI&|(s#r03C`fe%tkc*((_@#ZRo7 at 08xp=$fT z3xWgS%&`$gj4 at a7h2U}dU{}p?ZyKcl$iZO}j!D)*<4Tv6fPcgWETL-Y>>z{lC-djc z$sENfgK=@GM+%$W&7|*B+B}gZ=f}Xeh82rIZ||p$(FEtTKGJ|uD$S?jdZBW|_s;j{ z%zynnV7&ITb=kvyVnZVKTx5oMJ;-OHnhD1$ohY8yF2YCNRcqIYJgyichAv_5W7!&3 zK$oJMxCK7OE?HgK8hvvO+LwkJa*fc_uy4GujgNM!Md-!pJF zq^;)+)s9fUmyvE-QEgTMs~GjP-Wjv)_Kz~f&QnPK`6gq=<{^9k`rB&o=UTEZyuVo9 z1NuMNx&Akn|I$Hbs6QM&}0_S4K}_+%uC< z!>lcORBESxkj=W~MgU41wewyWby~FzOkhuSKJ$?C;>C4Z`1SO$=?ajjHkW6p6&x=F zyvjsGKYr$ch?I742qVIp*cNOq(yBaFmWC2`N;P`_04U+%B#6&((~|;dnnER7qcoYh zpvlT=z2HREF1)xy#~nGF&+wox54; z2BtBeNu{D?x^N%o-e`S0MQSdkg!Gm|HI03S8n3LP#~8~o6J?h%l4rKUeW00#(cF5v z+C#Wq at 6Mu$`GmJ0!l|i1T37~u+e#0|HGb6|7tLvF&>QC~ZP6a0n*&!*XIK!&oF~d* zFQ9MD+$BC`f2gDU=?6|wQaRzb-az>6erkLqhwy}T+fyABsU4 at jFx zQIu($519*jL5oNmm^;XfB8cr1Ey2i-b3Hfg(tzRvDE_z}hzt-9Uh$dXBW!`5#LmwR z_-$wJ`uEZqsZcVvaV`HjgHk}HT(a}ogrXBU)|pC8+o$hmww{cm7kT9q}L(5W at L?D1>CZDC$CJ3rKS zXnA9Of^cw`3y{x6`9={&lp!-Y3A_U2M;07JgsxfrYtj9(Cj3&8TUQ-SQKcRH{3O_E zDNYtf>Zr<~#R<7Ps?j;|hCsQ53_F?)0W(0=gYdtVNR4nvO7VaJ05Bo`byt#q{QbKH zjFYW{xV4?tKNO!`MM{I`gD2*o}(SdS#I8*uNn5t zuZLP)A0RvEo1(eMM4YpJHd>@Esgn87a%6EuOqt at meIm;eX5`m*DNOP#<8x*mlh;=d z&K)s*)YCOPn&?HgT78{CVHhaDtKtYO4r3HZ=&21K^4{x at i<*fhvp$x^zFD zLwAZamud&~WDrQ{s!@$G9yu5^eLdt3Z3sXCL{oZASpJ^3pEOzgV~rr^jas*%+B5>; zv(OYQN)D^Z&N7K_WdnsO at TO??9HbbiD9q}l0u0}FV*jJ2UJ-;&Qykf8Wr<1(wI&tq z1tSyhO^4K~zJ13ksSx4N*Q at g2>fj7=>o&mO)BxmgOb^ASH=azpPth7P;iEAczn{BR z&?BOLQb+W4nhTV36j#ga7RKb;6Lg;D437$sYmTc=XKQux$+kvCV!X=B__g#M3h)&T zgX2XW?nIOs*P3fIZYlk%XV|8URkP~~FY^ccDmik7bZ}(%&2hl!^A3f(h~m7_?Pqk$ z)`kNrCAc70t(p-ydP)zCv*zl^^qMAOW2kce;?HfzM*qFJS;wXcP6ZC^1^dU8jEfh4bO)L22H)$;sNc0fo zfr7N0%2mM?SI%Rb7 zDa$!?###9(YzrSq$l3BPR74DmQ5%Zbj;Jp=#APX?v+&m^)mNF{lOyj}nSRB+UYDY< zx$MF$U(5`NIICG|lWQg%{?wqRSej at HzAsVokiG`vCH}6cf{!1pJCOFhAU1(Fi^Cw) z7?3h~z$hY+B>Zc(%IF`Jj|&xOjsVXrr=^W1hBC>f#%Z1ho`hD2P46-5OT;!1YWLVY zFWu19k&ydB3LrAm9Nb9#>8@{JendnS~NjQMM z_|3sh;}MT6PX5W%M6Gk?G>OIz(Xb>qodp**{&;`p-sfcwM(2)5&r)&=WPL&e?;W8h zGueoH`_$i#Vb>mD>P`*U5Cm)EVob0{IX6Mkrk5-iqHP?Q#+VlAY61ao?zSoo*>*S1+VZqOiil0Eg z02itJKo>rSm6#iyG{-hOq)mrni|F?Ko0|rF3hxxxU$0SdkbhlSX81>lm$d!s3Hr at K zOKL74=qI<+Bpv=>mYrl+AVEf@+I4C_bUSaU at BH%iUTev zAi~nzb%b%(tC4Z%ZdO;f7szbS7!xzXGEAQ|8jZ}HtTdiaSWsConqVGL;S~&8zT0a8 z-jY*rrfvr%0Z(?+`?`nugGK#b+f;9(w1jf$V+;LZHfR(eL`qcRy2X0&flXav+nTC zRFK$fi_juB|JD_Xh9r{ZGNi;(88(c587YP7tGwdf`_)4EHoC9kBw+_9{j@|sbAdtT z{kH&%Dm5g=o1AK{`*11OQsWMDx$G8!YjBeWD at TrnaL1|C_Ag&*B|KZ|+L0U%5bZ%h z_Bx!{wAeP^6KLj3lQvdTq+6#9QBM9`>q3Iye2Uh2YkLoa;pzoFi8P0&#tU0E^A`BL&lR3Z zFijnAbc-V851`6PK+VtHqZ(!$plA=LPN271?2)0AZ4rXcB&v+ at B7FMW?s0Af;N*;7 z007T_rJS7qM-cu)@cjR6ipy5qlmL`R))o~NC6#P!@>CahgQyNYgc)qEv|hE=?2 at Rt;xM9$#4706y$>$MIw&%PSUfEdY3n#oGl5#pGjwSksgo!B?q7B-xGPzAahksq>)}Es zgC{wff%p9C>Gx!-K6l{?#7lQLn3}DpP<@Zi;RBurR;nr+i(lx4)flD_G;YGh7yx-| zObSsoQo|DfV($Qg)CNnD7~da*ny(}TeFr_lk*8wRDF1|3@!&s;FQ8-6C~N|28$_=T z?^_)s87~24NQ{%kR2(8=e<>%lj9)-n8-(ll;OQ8n?GQ_~;V@$o9HXU;Oz)d9AdG{Q zH~w{aM5#8=hWG*e&qsc%5qe1V*S%8%@;`O7|G$s?pB at _7N&hZ{h5SfguF=y#1fx#m z2eTw$OGxo=#g!>2D;2rwZyuq)mbzGYjJ%!3HYkkk&hlX}?EX2ugXYIRmS~7E$U-p)glcQASD-t%3gijxFJJ*yEU;kKD5; z^9cjQ4C=jvKN!hdV_rh$MzW=@uB;Y0?D>a9v!)3nrwCx^bRpKWwPT;|{k>V at y-5sJ?eTS_&V zG`Ms_LI^52Q}bqq zYevZx=p|C`ZqL=B&xdYH_V4jp<8|?DpIgt>hpf{s(bKV?&zob}Ut9jZWNj$BDz`XX z<$A!oR|AT#xUo4W&5c}NK4?CEcn%N0F?g>70&>aRKxgmI*m>T&qH-zD^wSW!`ewhP zGSS-I!!vUoAE0);)%z*kn8gcM-QFcJPLZMaops(&YCknbY>};oEEEojHp{3OhjCX%h)FuC=*Lg*gAgmk7sy at w`$qS&I=~ylpAh{Q!6^dFbYB$ zA|^13%r9(N2&dN7*t>eMaJFQ|5IONLo!d*SA+fV7*GZ-qSffdE3l1h&%bR9+^iN+_ zX4LGTU5CAt#g3QV*$*;oZ6k7sv`&eKNpC!GV411CJ2fY*QZ{Pr6eahNcjl!#Y7FnW z*P%P2K_hlJgY1NN9jY`1XdaSI_=}V=9%F9dRQ8p-6Q7{Vp5;8TLp1CgNgBUIvGPjL zP_Cs^VxX?C@&5UkSgJBG@%={EkGVr&Z$ndAbK)DA4y{PBOnPJ=q#qjr(h#ORuhB`b zquN~78Z@~ixEWu>kft&zsVo^Uc-?{KsBL!%PKvdG*jA%aD`gaLu3E{dvhOB* zh;?+<&GRlor$KfhnIz0;0gY!3lI(Q5&Uywc6fwo8g5`0p3&@_qYJiEj3J=CS`*CHT#8XfjUsuU)3~enz&cB{9tVnHN1i_BL+Nr at km5Utx6%zj9pk3L zEjD#`6bw;hvl|`-?*Iq`ulyC=SN={F{+J0?VomGiSbwrSWzuDM`Sc}~Jz;F_@;pH2 z#6Mz?t?U3vYtKY}SeUB3ZD`uqMylm1B7*R{gfO@%;!rKl&h=y1xCr;`GN!i?3%q2C z&b1np1e_Tq_ka;2x6)3nI+B9;;@SReTbI0~OhSA61<|JcoglQ4W_eMoTuR;O!3 at j( z4@%y3h-)HGkOlE9SVt>&-b!;>t$XqWNO$StyLmx`y3XorM8thH@{m+!hQaZ1;DGRbZsZ__`7MX}~{{y0k%PRL{UA+GkU(Mmt?E(eoK zyNh)Vksc9PQ6OQnG&=G4=`i(4`I$i_M_ZezkZDTCJVW9hByW{{Pum`$E_}lL`929@}NA4 zzU70AWi at f{Y-7Foo2hQ6Hk%L&eM)aI3U*qb5D^h)^n*afA#w%NcU&N}5f>!oX8H5Q zS=nztf4*@PHc#`7=%rrC2X_5Kxib}-c%q!g=DPwv(*{)OkKGMRZ%1b0Sl1N4- at Ki6 zc#l1OGPrj4*FRzYU=XBBjH1>*$E$5a^Pa%+jr7MICI(Po4l2242F zp}7B9Zy7>)#BLAUnI&wcKb5z=p9TLT#5Y|im_`uQfdHW|RL~!$j)_CE{jH4y>-6H* zQL9OF6cdv40{)&;5_f at 6Q!E?dcQ9Wm=4pkpu%uT!!a#~$HvbTXU%G&mGKYpjhesF> z5>6#%6j3YkGd|$!koa?QE5>K3K;@7`66WFtu`22ggHS&i?zwb$Jdc3s++-gpYW~RV z#a*XIGlp at 8+%0)g at VPuUJPhKSb?}u5Lx6>*)%B9L_l_Ffw4(JTU&A4n)G7dgZI#zj9&+PXdYB)ZC7QR(4W z*{sFY~pb zWvs6-Ji$PCeWC;;GFFH1e}I2A6l}LXxa>?Na=$%)O{xN{g?9W(`PB)^MZZT5w0P&~ zjca!W2F+5noyh1jb0r34j#nHH8t5SE7I8tw2fEpt&wNo at J@PAl+LaL8S at L{uz>gbL z^^iKyLX#Xih6qj&8skzPH=&h#_l0Pq>FO;4m3)5wxl+smp`d0smHgrx`thVJfx-Md z{#_xrY}DKs8WjwT6r*1#oLi|QFr(k2W;_PZ%!!Tw9G%B{ zdc}NOYK5Ok^TZGe{iW&mx6jhAPdF?dY3sq>#>$HJxO82-%<9wL79YAqEcft%hy&Vu zO8WA#%UAimz4|yN7nKKPUaTel+=War^ZCIR4z&EdPTHh<=G6gJCIbs3B6pEGIC;l~ zaC+D+y46=n75>6)Y z8G#@J#%fY`i2Ig?Ztl>!c!QL683$NFwgVaws}Qz*)yTUfT at ae&J%Vmn*CnsG`yafc z<$v~Vz;K5wVQ?2L7OoMhW6xEi>ATsN42zY%|7L3^6ph^)_ZQHxLH;LOI{{l~8zUum zyZ^8Pk5;n$_wtL*O0_mQ7OOnEPFy5bYj}j72sm9SfqGiK7@!YD at l?XI_xQ at ptKuh! z4~p238I#wuD8{TNDz at 0c#!(gz_bJyYS81wlZ|@f{UFa|ovebFnNK^zaN+SpKQL#JO zZ^s3$g}LHH-ztLY1BgHccjXN|blS~JmK`;x zEoB^TrwJoP=PKRZRXwA$7T%!jLAe>h-X- at 4|!OpGxQdXh-nho72 at KDr@ zNp5Gf&BE(BV1Qv31bJV-*xIhnX6LcFP at IXLnbaDN4{!9v>9Yq9U5i~c! z1U8-liA&#BHO8jN+du|I>Zh8yCi9Jdo(7z0myK5jCa}H5LA^cellj-N at pDspJjEvR z#jwR63*eU0=e+Ol=VJSN@(!WvXM at mf;-rP at p^xGAOc;G}apt#Yc*qiU5qJX$p*Uzz zwg at e=O7-Cd<+D=wT6o{7ht7bP#>@8=iDGJ!c5TR2A?7dJkdC*4Lp;&VWg5hEPKrW! z2;Ki5(%vyjv$e|>4BNJCn;Euk+j_$h8AgU}+jeBw$gpkO=ySU2>s$BK=yCh2{FxzZ7|N;h>aQv%lGogUr=lZ zq-3jjBWx`Pjxq?jQj0Ui>PkbHH1?HL%!3vEDC}1e1(dp1+zcXJ4*`UCx)ZF`x*8c4 zv+k1_Q{5 at FSVy5{XzsMH>~m4vHCn88_I7WhaE-oaxG`qX1FZO&uBal29g>Axfvd9B z6)WaxUB`FgBB}~aSPunuupR?@Qze!xRmpIrIhEYPXWsprhu#=cCDJi{)i54%?av`b zr!-dYnv`Qyxf2NsK>GSeduX49;>*F~*l94Gt at kWa6TriVMEjdA;x3xp<4~0IjMYCp z at punXwD{Fl^PBh-5dn>K1YVb)t!Unz-4Ug%_kfI7pu|=$4QbW6u9WIhi z88y%jtg~#5o9jV#iCA8<^tVGqhyIol?pY}|;W{Og%aevDDTiYC(7H=b;LEN_%%%GU zcvm|z=mw`RIJ`W2X at BaYY~a$rt{Q)(oWrcIyH_0bSUF<9SBHgKj)ugLN3=y}#h_Q6 zwGp>^DE)C#Ao;9SlWxb2hG~{#qJs;$pJj3e*-uTQIz(5`&Y>pOS7gQ%wKD4)$5XCMeN%M}_kkNq8k#3Rnt z2?$1h`=P+>1@|a12fIu2O9cw_0 at 3oqV{kRMZ9Iom%sE>T8rEUYE at Qrw3_EWsi(FvL zN75zy=rw;*M&w2R#mC<$=5zBX({5eh`hF}qI&jWhfP3O$njx+VHC7C#JpO~~B2jd$ zoroR~&Ag42(Z6l>>?P6#bSNQ2-59LdTXG#QbEkX*Zg-lR zZ;UCVpfvtU%-X2Ro2UC87H;&4nB_R$-Z&qMbU`dPwxRsf-4nvrV>iuPwDxkPa2UpD z{)BIxHjp~+;jFi7XQLM(Vbd`pwc4C!2wYo)44cB-8U4;bRyw4j!X_a at 0|8B900I5@ z|4AnQNgf(H9;nOcU(=Eeww|`wb-*JWhQ>lEz}T30ApI+cD0sGEh9d}4k~}F8-a<=Q zR)geCa+w@*YY$sTAad96!NXE{zo3H`lS*Byn<^_SFGV`n!k+SdPek4kJ35{xPb}%i z=$cM~ES|C&XSTLm9VEU^dawO~3}I^)4MC at ak@~b!a*js0{d`zNV- at NjtWt8I_gIM+ zc5La-ZdZ|VhK{XoJ^3&PF#+$MUx2`3#)b#-B`@Y+#(mn47aGAHjKO6Q%|M5nEzZ^c zR?Tm*uMZCYp24|^4?qZE?cJJZ3Parkeu_TqZs!Yu%r at d4r0|EL;h3m+X7*yD_oS+{ zf at Wwsh9cy=6 at MdTv00;+I?+W1oVJ&E<79Neb+Dhh;pwc?WfF#r)oJ;PNaD!pgM46y zk_k<(QV!+EX>H zdGVG)9YYgv`B7E14M|+}+}|?s(g-P`y*_|z2Gi_)kS~7ogqM)8=q7=L%=86TlQmQ6 zV-zM-ZEM{LtdC2EH*UDB3vh1>i~DyKF8DM>f~8vWZdk at wzlan$(<+*q at r>GxCT8>zu4MN{jC#w(T6%xeR1I423gk zrLN^F?8Q2e?P55j*@qcqNT;saA~F;slSXzaKU3Iqmh8 at hT=fOh=aqx2sg=FD?wOUD z?9%CEZC0%)c^6Z-t<9nzRO at vtk~bDnsz6SXJ&WhuZFNj#IEsiR`tHChUXlCg_1sAv z`XnZ)5lWj>WAbyC8thNN>R~BLpj&eepjoCrk at GR<%|Sq&F&+}bIP|g{=_C`9wG^OA at BlZC+PA+Vgevwt6~e^ea%!*XH0D?2VKc z?s7T!;)%i!=|xw4&Pk36V=jeAifzz7Xi5*Pc6fi z!xO;C4FPXYQmAf(UD8~Q=%eG-ONnu|l)YfJRA3FIMe2WT1a*UC>+hV3G9><)U#d%I zi@}EOtbfjyI%%XUdqMWY8&pv3iir}|RlbE_P}xp0sWBGpoZe}Ogw%SY-cof!5)qy( z#~Kcg6v0xyWkP`6P!o1X(`%A_qequm8CnNOh=E9 zYEE8ue%|wM>YF_LQL?sHo;a%)!Okv`pL4v{WM{6Xl#fos*sjtP>D3{9xaSUlxUz(@ zEnx&__EL74xF%RD6-eD)Kj~cV+ at Ag271n(lKbW zBKEHIvdZxWg>4(bP1Q1Z;@dLV_PNq6fG-uvqTPyZ7u&tpYGRM4Jqtk-Hh zeiBWPh at FEO#TPRWu|CvbS at E)~;so6XU&o=~Xw)0(GeO{!Q<2tjOC4=Fe{RA9)D6Zy z->>Xkghwj>4)bSS&X-1Do8?HEepjHn6E^;yoNE+!Mw7#C004JjuL3{rFxZsw^tw?+ zByD5%LceaA^f`;^B2{-f9^rZjkHHNg;)Wd8mH at C1vI7r80b`iz(qhF*Wp5Y(Ahg?~ z;D|C<*-;&7f>bsd0=@%6Kmvkb5#sH_G^ErhdZp1vYvnrvAwL4C;ie1>dhk)aW8H0Z zNVtRP|FBZSSg*%uH~;H+_&iM~_?O-jQIDS|d0bIS at 4S3;Q_rRU?C34P#1eN=o+Whjgwe9e=ZT^J?6zhs2 zagCR~lvD%ih7ZJsj~U(uxUXX6lF^SLv8P&?$O~j`+>u}#_Z9jE9ta;)+L+lD9j)k> z?cf(d0!%k at hBJ&dK+;mosB5o?L+ at s3LsA*L$0~MjpgFj&-EsY7`KdRB_6(_Hq|6!& zv{saL!y0gJ1H$9D7f%DQoix~alDsR8lC3g_Cxxx7x;R|yYO+$SJ6{YXlsK!}j8cM+ z^C*Bf<1sg>bx`Hu1FVT<7ZEMQU{zW8h0^MmUu?U%zk>VA`02ItvD)vE%h`lj`AXF6 z<_1vjPrNb;f15j=H41IUBrsZO?jUDE>!iyvHTT)k^#}~|n8k4h(PV)Kn$CKWQ;FP$ z5%KQi4~cR!S8EvrgI+iT!IF!y4WZ?!rp+dLO%0SDKWu>|PScl|MAv=-(#iYq^*f{0 zbIv+x>Kw{((4>9P90o)gCZnRr4nDed2k}r=rQxYFWloU;a{w}@Rp$K_xcB-&4)yC) zf~)fMnT77iWmXqp0=xq?JE=O~pgE~7<=iqiuiMc`y7ouh1z&W4b6Ns>WZWH83iW={ z9dwlv!Q*cmk6rLtYs!Ay5O?g5Xt*aA*YV?@V-iNyKlK*0jY_Akn(Lb|_Kd#)N(7~C ze1Ub&NdbIPYWHa13XOqPPH^K~&7G%E^JxOst?Jy8TIp%A8$7X$%E$Qf*|pk5)7aIe z!p9Po93Z{AHawm6tU(nG16>qBZk!s&qm){}VzxSKNc}L&baB^ckyh)m zqv}V3nhLghcY>M&GHovHq2st;Zpq25S=H=Ju*Dy#YjiR<;D0V)K}9`h!vFySq5%K5 zs`dXR;QC(@HmXy9r^3FLoH7YfGE!QECKRkdi>%6b1Gva&DoBWlf9S+hNp5hA(b%q5 zk$V54Vg%v?LhJ`7cG>|3Pz_c|&Et3xB?YnXJM^T#nlEi#3-41}yXaN{R;+s8ZIKv$kr% zews)m<3M<^xuULl-_k!0pduw>QTCKGsyMfUXuWy{8;}*TuE&MvA+fxTAu+Al^=P-g z7g~EpK3Rjta-IPdz>6e6HyRaO(gt%I8cImugR&wbg3m``IYBy1XF at +^kK5de4 at zd3)9< zse<|^C7;aboo@%!NVKl7*`Y1Ir=**HWYvLB0HS+SlA0I#F#~_B;yXb>DHPKJ>$+{a zyy7%G(+|ych|~(R{l>eUJ~MHIZO+rwk at pwNz^6ZtN9fvtCuOUm68 at jT?O#hV|DXOy6ZP>=wx7UgQdab7+Wrpxq0&kdHg=z*qe^TEH z3RzPSc-(zlh6TrOv!)v4B!BcV!FkX8y|2ypc*EuTDA(WLA8v<4;7kI`#R#v at C#@<3 zN&oov7cf};=u)OF{VgeGKa02h&4gUb*4_xcpWg0>HIxJF0}rkjyO*#biAK}-Sb|wH zTsm2!Z8{rPC>_t(>W{_x<^q>)b1pBf$|6fWZB92zQpbaqYBd^XdY#xsdKDo(HaRN` z_-gHBwZQlKPs8IY>s)Io5muQo+>lPRJx}Wxdom5W^>`cFge>o{=oU%Yp?i?Ns%8ps zgkx6~hUIZ^t6FRDAU+8fbtTrjjOzQ&V>su0FbIA+gYe(Y-^7Pf1R#M52mBOvV>)>b zaySh|+=GG}Eih;W>0(-LbUH-ydU9YfoRogG4cQ+b0&(+|GUbatG^~pZY8j|pn+(Zp zwfSQq3}qP!rv`syN{$w6=XwbWN2jYGMaKBqy(-O>vnJ2gvS~b28k-wji}-CaQVN~0 z9%r#N#w?_!JSb9aLi>s-Hbux!U*3*BJ_V7ZJWc`{FD+VNaY~|TiU#cB6Xoi){6qJq z-O{8LyoC7AJM at bE2-gs7uNHGOvp`PsX6sAKWm3^!ZG1zxG<1%7cKSa$3x`};7_H=PUAXtH-wVY&*$4e$z= z0*WIGxk`+oJkeWkV}93j0B9(fi}yenD%yfP)VhLYXc+dDp{|wSJKH8yyJi$?cOoMZ zZ-`;J^GSZ$(3m at l5p7OAlHEM^`HJJnY(09I<}Co^J#y+oajA_b+;r4AF_w=f(8I1i zgrb)zpK1a!vPV;1y!)yezZL~Ws`SWzBHzrw at bn-B1#L(?1Qo`9Ss^0-mTKq`Li_{{ zL)}LtM%hPAEd3dq_aR*aB>#u?2Wb-HpF*FIaA(5Ou~Z@TxyC#0JLqZ3`iS2KP+xm8 zS7yC;)wF8WBLL+>IRXroQkjI<>6oyt9pW(Pb_>{U5Z?M;o8JhnhGCg?24sZU;)vd> z12IVMWii{!;e&#@xi%z&?D!DeiCwfG;T?bLwxDD z_s1nxH4L<37 at OibRSrnbomLgqRT1>|<)!Cdk{uj+dZcb_2FqwHH4H5^9sGoLkvR8- zC7)$hkrg(+$v&*!47)q}(l3-!z8m?$>3Y&>Ry0Px8_jPsc+IWAPkIzjp4wuJa0b|N zLhk;N*vv2tq-XkztLkBafE52nTqSGe;`(3T|C!db)4&x&^P|9BF>M474yGwiNoksr zkpr>;Pb`2ch6mFomqRx=qtF`IGv}o2?0ZTDd?5PGy3m9Z^7%bUcy=|ec9p{PB_^ix zdYI?DZ}2{EeV$)$e*@KpUw@?akD&b2OlA7 at 3y8olk&#fk=~hxSbVdg_eC0?a1(DZh z<#52n?-V*!;5PB0JedEW?W#PyE8GIE at F~zd1XIjs7zv=RQlZwIv`CjJJdG8qt+R|i zp-dloX#1y%Y@$SKX^|`feLhcWd9ff{msZnVj(UyPZF7l6ntcN}i3HbbYW6}cRMk{7 z&N8R3(>_Ht^tQ^ptn*P?xcV^Zr+mg(m6qy5m-76}nwnR;37iT(6}C<_b&HnCD8d*i zAJ8wntSgF}hBdNy-mq*}d*0-UQgu{(4wRtF;;=5nl~}e$c?A;Df_Jzc zYZ+u)kdsIyc>xBz1YB1eGL+(X(+Nd`m2?QR4w)iG_G^yj6lrMO$cI9%D*|e-O{qj+ zaj=m=%U}vWbwz3Ny{B$t{xa3eRJ1~0z6(t)`QP2E&*y%7Yp#J;N?Fui~LUK at M*WNm=YkNl0UO zS+<0K41-{p(cSLqZ6qrl;L_^S2&3OtN3$T9T5_4LynRPTOFw-WUdDyK=bUXhZj?PS z^amN)rOnxaa!K*Xvrmk%ou?>w)`C$p4tKCG{CTVi*N-s$D(=tKkF$hyhD}b)J+tJp zW0==NaGgbJHYexkQH6!`m==ykGPV$uYc4{IsxS*l#Yn+UIEEIE@@!EN6HxfJI(B?nWMd&v6vK$%8_;;By<&xntk*@y{8tXr40WIi*e~y;axv z;uUD0(i_%~g`n(<-zjf(#p-}E?{-^nCh}1I9*>#e)tyW-eD|UIOIhVBAYe9fH)#iDaY at Ej0)L at fqq$e0j^q=Gu472FxP8 zC^_X1q2-Y$_OHL#ad^dd`Gu>S$4cL5kMnJA`b#p02a;kv$$V4=Ds~5zB at L~`QEg?| zjW{a2?p!g;2B?)vTrW~U+dm*Fvk$)E55}q`qE=tBz at Wr*S14z;q}S;Y0YjpBWD$49 zd{d8tOI(rK&Og~Hg4PlU@~h4M|5) z>=rZcCD6FGAo3^SixItmW|WJ!mzTQI=pAJ7oOkVY=XH)tsz>Ls_xIOuE6_$DqdRG! z58~5~E}}-PsL^u)kOYA)_L4VppN{D82#GYwy(!hiuqQUdsH2iQ z>TW$1!F3O_wr+DQBd^D4OJk?~!V{@uPdt8PhIj+AY54&DYuZe4y z&&u9XMC?2{rG at i$d>`Z1psQIQ8FdsXHx}c`X|pC{&dfLy$V4Li$MJy2(YFWZL83~= zxNC?VUXOdCWl1)c>(*SN-G)c2@}Sh*+}qv;%lhGR&TFx^P^XTs8(?hhWMzG1m>7g+ zgJtV%sLe(#*aIH`f!U#Oyo@(bi#fI?tK3Mx^Gi69XZ2ZVH9x00iSZD-;(e+>s}7)L zjz97!t7M`V{X)i2GNqU%pw(g*K~Mc$tCgde2|M3K%Dt3vl1<-leZw=QYroXO4oAuA zM)N33IEUm`1zUO_JJ*%+XExr$c}c9MG2y8t3^3U2l1%#NLTjlgc^^1qZS(2(1K_vC zH3b_8IC0^;g}Mj}>r%}gFLf!+qI5w^uXU|{T;JOn0rlov_P=3P%T%u)sy#7PS^dMwLaji%RTco&eoNdaff5dk!1Iv~_;MK;0#m~C1xdgXWmJvr~VDTG($?whJt-`w2fc z1TF9!(ZfHNP4`Ik!54{_VryiQ_7a41^QYN7+& z>Y3>~V2vYBT{>Zq%;f3bfNPvfn# zPTGu8iPM#IH_+#LxDR>J2DS5}Z*GOsALudy>o}-%n2pV(`b@|ae=*+dpG at _E2*2<< zMf`J!vRUy8NYUI+x$v-~b^8SRwuCq{Z6wZYW+8Y{+HFp>4iXTqwKPly)~ zXRH0f^&d$G7h~fU1^WaZRqzxA2lUR4+jKrb8qZP%?y;S at 0)X*`s&ez&nKoPi>}DCg zJj4DWTmznnW<2-ZgdIhsu5g5fRD!`DNGahN?DY;~iIC~Qjw8_CsS3?A% zRyWV4&yZVDg2t(DsP-!U!o`SXW@?#nP_m z2f7Fxpnh}%ZEl~Vra2g&$ez)-b1aq{x%7qMr2gRn{yB?y6Q)PIj59pE^BZy#$A2#%!p*Pgs!7xqj8$?{+w9kK) z at h#qFWpmOrO;-FYvb1No(dgH4o3dM$GJF zt9#k^KQujff4K7Ug8%{DfCB+Z{(GKP*~s41!A{u3#LUIzzj at heRXqn3VKn{$hGIp! zCYa{xT=Zm+%d;p(B$Pom=9+3NXmMYh6lnR)Z1Q)bi`o;1+rG4yoxiouuR#iCts`IR zy#L-_;g_{B*?Miz0|E%oCSyZWo^|33e1}FurDCQ7b0{_d{8nV9UuO2IS#JyxuGyzy zX`!$BZRz^)dtd#AuL<<@#xEJbUT&(WkT+R(H at E-UbHWkkcuEucpi&&X+|+&zo4eb@ zCF6CU)_WW}r8dKLf`@8~1`TS3Tk>$~b88#Ix~bN>4(Bz02@@JkoxFmW9do1IWujub z=t^(j+D=(`PgN$t!d!*#yy%u4Y6iVcc=+qh2*4sE;XnGL!TNeoYM~z+7z?AbAA_Gj zk#p6G`y_>S9HWgu#8n;%{>%qUma5}Di$xGd?x$<$d7fuE#bYp?3Ib7_v+n?Hf zi))N at RfP|VKO+DW+S9)8TZMkDs(L^XS-z>5QK|)VV?PEecv*2A9spJ-w}!`d+qbiy zS5LU+Uc}m*#p5h8gW}Di%+IOk&sk7XA0UboB}u7h1mOFAW9G~7bqXCUj!^kZ?deT5 zE}LphgDZ}jcZwq5#fNjMv*k#L+!7KeJQd?i9px?VU7T$#8jegXNvL-g`{!RH7R2q+Qi z-x|328=^91p8rL8CR<(RZ|%pgVOpE&MJ{!e)c|8CXc)-`6D at gT0%chglc2f_EK at wD z*g9>*IiAYRg)5qn@}H=XTsI$(+=mIEszYLf#6uCFf{_Il8W<_X1$D)9@(Rxn&yTLp zlV`QP{{A3&K(wJ`HP%=oKj4mUyzrJC`D1XYqy~)fPyr$WDXMfbQ<+YKHz}bkTPbsq zk&$e*(#OqQ@;fD=Ze66s9%`y;wq<}=Bh{6jPMxQa%J-OwxT=ej=Leq&&gzezmQke2 z3^$!;of<NiTdRP14OG?#al zWO*bZWAlI>9K}wiGAItBcGq=!Jm<#(bCCishF(=i%ut6&Q*??Eul13okA<4mxpwCC zYONFFY0b-~z=%e;h|RZCf>4hCG|BQlX8 z97kkS3o5~dkQTB=r|CUMeE#K@;zhgFf6WnR_D~9%;#?{r={kagjZ%8=^zU=76%rkE z+)$&0y8556Z=$}sX<)^4+l?=HHC*EKx2Zh38RS$?rq~W4_pdBer>yi+nPZp4I&x4| zg240mXN(-dlkbO zCFCslZ@#XI{%BzxLw+lE3Z!F9aLu$8Vau74y9_+^8&G6;hPpsb;vj*ugJZoQexs#V zx5f#UYg`bG9%JOTj1X-*JK6%#&laq#id>N9d zSwOZrN~$zwFD^}oOVVE!no)pZn2h* z5jD-_cNg>@nfC*^P_jgChv`l4X_uV)jl_ at p>uZ0Iv_W^ckz0E_{3Kz2XFZd5{J(wNMb at Gu<~`-vA(qCHiZi8KDdt77`c zo{Z|Y&~$PUd7>6`H2THrB)34@&#TEd)v#6OPAVM{}2WwnBnk#7O#e*JoL2 zMyIsN%EFAbmEehV{4y;i8MxM~JJ&tTlK|?Ef}X~bP7vv>hKIYKyTgj*kszYi807SAeb7 zdDgKM+=~rVNiD|J=ZL68KaLV>^v22%dYEL~9=U+lM|=kL`4XWpa}7G0gi+YRW*`F8 zEf@|HZZg6ri!+*HlH&Ao`KcD&#kwrdd9)LS)~7L~5b^hFev6fBq4UPBu at Ta@RP;sD z#Z`TC5D`u)#=;^8tQg at R?KLTj3G#zeIw_YGK1-`Jhm}=0SdFyk^QLA_W*ll3jWoW} zVNf0J;Y(#JF^tQkX#73q8siy$i-yp-whO0RgzAnkjMOJ1V&IgsGMJ^8-iaA#K%FnD z!xk{&H|;_Ww1zNOI}Jarbd!VwVQ0~bnCbQzaNWQS@~BKy`pCN&1{C84%6_&wrIT%Q z&|vF;9LEe6{VsO*TK4NSJat>#6bZbqz7ns*MRt#_EvHH^3 at di7$SC2Jx3-R4dl1#R zbK&*w(FE;p1 at OBDE+@}p@ zwe-G}Dp at COgH0tMj&aifk$6P(}C-PlL4UcscymNVcf_`=smx>-ni4>y-cWE%WyE(TM&Two^* zr=rm at pkjS_RJ`@Khj+-w4Qst1QjZw58(YU$$*^11m|NAfTc|B5R&l(ZAhAr^k(E^n zbL<5%O20vz#_*T;_XjWbzCVgg%j<%MS9vjRKTRFBlcXDI#nUB$U)P39)aO z{;4-vaTpgV{}1uEK9SV&VQ8+LVXR?jF({Q$<9=Gl$S-2K_!-cxQs0ZkZdd~31zMkn z>sKEM*3J_j;KRIeCjol?P`Xde0lB7#%(80(NB`T?9ud|Nc_vct6Ox`MN4nr3pUSFl z-NJ0qI1La7MT7#1Fws2xEpOJi8=a;C`y&ap&$6+}QIjk#sP3pMNV#AQ;16w3B5WW@ z<6+V#qOl at G!xRA)R*qvcS-FK{=Ii?v^x#dg0_L at O9FoqA@QXVWNk8X%z(^+M2}F>6 zspvBRy>x6YDAtJw at 9{vW_Mf3VIdB$>|6g&E)?X(6e~;?^qt5tW2`^hsPi0;aiNBRP zI3=7)Q56hXY5fja38@)<2*ghjjhnYn3Y9`G+vr1ur;y}~>uoQn=VdQSaM;Nq zL3|COI9uL at v(tNKb<^Aa{qp%;0f?dwMHp9E$(3lTI+Mh_plQom0;~1aL|rtr)@6f# zrW*XKZG!MwbOZA?Ab)XdL3$t+OS}=hk;)Uq2zNDYQ#ps$d3DK^+d{jgqeXOjkVb^dq^2BBqA??1fDZG%qPgI} z?GA4y16<5NjqX>k_cT*&hOjd;#$tAs_58W-fMRuYO_DT?SS_dG%8eh{mVS9w=^U09 z2(5XzT55Bn9<^Ny at Y2J$v9%dHJFEVH0J`XS;`1vjLy0+#6 at oBfsHFTl6I!RO68`d@ zT;NS(coNMiT=(rDFlrh?3|_$`)h{!hdbIT>EP2&F(+{XacswNOSY${@Ypvxf6nq~K zawUyu_*W&rC at fE|oIFtoCl$3Nyb!XzN6$ySwlJjnDNjB6iqI)BEFea%9gDptFyo?b zngKG&_2eWKQJTE)fz-tw`*gA1I^yZCUJy~8KdxaN&CY5$9EHjXx!(nmN0SX|ikNJE z=w8{tt*<2L6To~jJ#1pgVc_h#xT$HrseddmPE_r`=} zNcT#{R1R-J!`s(D5a;5Yr3SFV2o-2k)ml;ehhOrCqKP1Wfv`u^wk9J*_Hf&fjw|>x zr_Jw~gipHF)Gf5vnlF!82 at uH7^8jImFO%6swIB?>bDSF9bNDP*2BUCOA4p2e%RD!n z{C}t{rK+Kzv;qSG5rF-lM9u!&$^MtE_nf;00Z=ja?6fqPR zZq2mTdP9>4;%Y`S)fMBFvi9-XrX*|6f*%#NASgMMx_YY);yed60(RcoZyzPnZF<;} z-6M+B2q1LqSXH2I#8~3iEJzl1z100Y4qgY?)zqop at C4E(&six_almlXPDtT5zxS2M zMjN?>Hu^b=`M%-RG*=2 zv%?XRyHG*V(I;00Y_D{iMKtiFRL)jXy=q`_EG_ttP9aQCJy4G-6#r$RWM2Hiur6$LvhbzJcIG8 z*sIy-Z?!a3;DjH*UsSj92|rZhOpTuXCbL|w+j(7Fyxrh;XqP5N_kF<$1YTZF_E|;# z5KJ`nOx+ZtrgPz8u_}^~adKotE0Z+r>I*hQ$6g4RR7Jm9MLF^+%XCg4ahL9r}u;zs5wgo!yFd0J0u*gWwFI{H*B{TK24Hs2bTtHs3g{J#Pg* zbLYRw&5hQaWs3oL%vJ0hIYJ6>RX$XZ8S8XT;H4m!uKvv(-Agr@?y;4V5nlq}4Arsj z3Olr66fz|BjM*C at 5*hL@*rkMbA`;_8%7_TT{2USjDWFw(1bG3*K!la9(&p*yvFxEo z5AcHRuf+WDhqlq$1x`HBM&`vZ>!bl}8NtW6SA*5Ee?SHPY~Gw?)M-yaQ!q-@#-iYN zvv|Ivb;=gEdqOXLgl%w(d8(f16!G6w0L1-ve8wTl5~?>RCj0pB0m8B|F0twx+WDTq zPtU-c8(@07$a+Sy&(13+Ak6}I`bJik2K(?@hz_?1Ght#bg92WBD4i$CSO0MN+Kq=1 zv><=oY{36*M6muZHQqHLv at CF3+%qaRHfp(Rc)7qLE-A(eut>B&qCY}<0sx%Tk+x=Fii-&}YPfE6b%0<)!zz;l2eCE6LcytOnDC{|VI^?ltHx6&ZBidKQc zF1plKS}|d^L6c@^c|qEw at W)`C9^Ga at 4h!8ThVOR#fFiptl^GvIfbqmm#w z`#eHu{)9rXv%BxK0D0ii*NR6s5sF{$(4m&2wc$uVgTA(8U!7rrai4gO`XP&pt>Lx! zV3$4UJ6yYstq~RDR=Uv;d^>6TPnc$odsbA%+#S)KM8UCwHPH6&0Hu9r`&Nuu`6=^< zJ!m`I>?f`X^JH%{@>7=h68gma6EJ9=Kv~aYUd>lZ6oV1=){~q9981VLsuoq*aCB3v zF8)NVARgy75!uN5 at U1cruUFiaR9e^C(vt^n9{v)YQrbZH at l7#-5?{jkjL0X*1da4< zIp$24$s at RX-v%=j{=vfAm$WJpl(%>O0UEK)!D=Jt4H4+fa<+2sK*)^Of5_=Zt1dKA z{RKU?e;;~m{|UV$JBK+%w2^O2ZSA at V$F_)jE1oPq*|TVGaN_hfa?zV9sB0OIfg0+| zIepm|^^BLemwv>ZFqRxxbR#;5wWjBXhpcVx&u#Db^XJ%HpqLvPc=&hh6Drdiuo*Z! zEGm|wgW_-)Mr?$2d!{BxVWyilxg(|GvYSu~{cGivuZU*Ba|24a}Z6c!AF=60e?Z9C(jkPHv-R=wZE{(|2OvBtt*5fm^A6PkB#PC3c?dhJH$8p zZLB>lkOh0*bd2$p)#4|OJ_a2X={_mF+3wOci8%6|U1n~fKi zG!Skl%!-ZSPv~#dsqZzQRoo+}oi$JmA2`OD z%7QGMJ+%07+R;sxV;x}rweUCgzVZeR%^Z#LjCYY3>52?BnUtChNfm6Iv#~jZD%%>w z*CArCoH;G~74^HB210S2CGOJQU%?+U=lPId$P^mNIE1bY`rFtuS3c3TOO0Vajbq)L z<#Dsj8m0Lf5?s?I=l#aw+(N;!g-Uc^Vbs5329KpC={riPAhhu at R#O_NO+dA992fyD zc`P9Zagq>$c;%)Eiu%y%f@CA4B`t59dH3&-j9JOLnrgbV6dMfNqA3NysREa>BrL>o4wz! z`wBq&RLwi=U4&wUM+Ipkkjy^eAy at +aB(y2UZQ+MhQ|bk6v9VfD&=UfSbvQx&I5GnJ zs~w?`T`zp0To{EfAh@TjAE$d+2{_bpe+x*|k;7T#Aq0orwT1KG_F#($__=$2Nw^~iOWJRm=_=WU|WXm#3FMH`cSLHON1ll?;uYEp=RFbRh&M04vK2j8JlK+7g`^ zPHn;6Yol8FKXa{gLv-DFvPKk^c0b#vyW4laL787{kmPz>hTkLN9{xD5(GY9$ze}!= z5n5l0q8(n&A+!ieYy1?up1t7?WLR9rqZ}^1zyY_24L{}KsIFdZZ|oOeD+b~3I7`~7 zVs^MAcFi^SN@}HrBQ0k7Ne!O~qjkWB1*0=+v!c#aUpO1PjBZa-$TViIfKG=&sm1rJ z69n at NNQr8vrXOfaxo)+rl3)rZ2%r;GSQljh=3k*Elt-AuGV+hx0Cwd!D2#YBIR zGj#?MU at L|xT&uM5_>`KR)qd!44b2_jwfkzfB#YYn4Tf_3Uc@%4m#IaS#OIEt`<95Ow*)C%+s4$rTUKNB1<|dXDG6G$IR3`MU(QB* zPWvFMzKS at szroEGJNpe)lW>He at hQ|nfm5nX3W-#{{U-^BTl54GKXb;f`7S5LH$h-)fFFQbLI-6dI>? zQL-lJyG#RARuCeMVm#0U#9x at cSUhHS9Iyshn(luA=213Xa0- at RQr$fz9wu_JOos3} z#DFj(*mqtZnNxWpFtj3H+8Tn7^sN^6=q~V%b^Xbh1hgI63xR at eoKu*6^e2E!t|tKQ zQ at 0Pr$i_cU*Nj{h_gCCZUQtxr zL&Xn-ENE_|U^>iEyM)bhJYi- at W-WwyF^?Dp7tZ6-anIC{JtTfa`THIPw;TA5!&b at B zYez9Z18_1=2+0OGGJ%0s7a&6lAfyr>Z-bly=jw62m*`H%I1Q>%TZrcmCyZ3fi=y;` z>lx8tL9*l1^QO~(jDa2?cxC)8On(Li1SInBF`BT8+`pcGlbe;9%YV>XvHGU-yg1qy zM at p5ZQaC7CQtliZmg5DR{9K8UT|x%~FluIRu<1#*Ee5H03QNKy-1TqN8#vwHaA;Jl zaLat4th$av;IiwGCl6IcT=6DE5H<&T+5GRm+c_ at o#TwtAk08I{mQb(;t0MJYl=>8C zj9<6|$>ia7$mGjkz&(@kU|{57?>~T0G!<`YBVqhhZg at pDI<4BuvB52{4hnP at m$91~ z%$!P1&uS+0LRY0X?T>I;HkmwQI^@<1hS at wfC(vzbj!)cb*I4)q%WF%0!ufVF;3jU4 zu#e`t6>>Gr;-sJ4rkPZk>HP8+tDG#vYST?u_3F<%+ADZN0SLbmG$E*;k8|t!Mv%ra zy-MWm!1K(a#mBCy9FTG at fjjCNk_@z_W)xm`RPfR2OTu3ry$YOVdaIAMbBvCDVo{|0 z3N7}g4|_4^838}RkfGk;u&pF2J25`tYG6u0=#tyCK44g~k9YCgLxeDoGPTDoSaSl*_sB)1coNwcWx_dcY^&*0 z?8Dv=rnHYJeu>stW at N58ZVJmTnspv7ycQ5g8Wyq6s~9(g5?}nO!;FHvH&72abl-y@ zodIzZ9ni{BQCxB)kb$AWsc6gF#fo9QI7LB%$8?e!Fw<44t1<%Dz?S!4999&If=_r`#4FN>@N;Aga?Zv_#8>Vi z-&hbq*_+Dv6=Tl>Ya2P?H{Dz~Rw8TcZvxlf-K!v!4nc_`ZOk3-H~g!^PGrIS5?uWf z-Z3lez at K2slyB?wCu0eM+MH(euc5ew49RBgbDTFQnR=H<` zzRe{1970T!L3>wI$G+TvZ5$$UnV(Y8-Vx7JXpa4}(`#s9BZD3*3Aetu7cvHRvbbMQDl%YdqZQ$oiJ2wrG_ zcOLI8I{NeIX_g2AlPQc at Wk!Xj`VbQJnmRq}B3tr!GT!pi_?7#V<0DP``Ke?c`{u%? zTj*lQ?&4o3?F-%}mxNP)R<2&9G9|dXG#Rcy7Okqm9F1Kk^_b!hf1S0xm)rZ7g=zK;74NWO}HE zhhw?8SK&k)!4gvOa(QxvGwW75Zlq_?|3%t625Itl+k$0Rb=kIUb=kIU*Hc!PpE9~^ z+qP{RUAFD6`M-1K&b{Zo6LHRsiTsrL=@*fiYp=ayueE~vn9nh8YKSjRcqbyHviEbQ z%KqHjR)}_02ZCYjIgBR|70WBL+3edT72~9YS*Z=kbak;WCu%Ulk46|uCz6<^DX01w z7q`Y-4htuK-W!>sTV?=Fy_xno{2EoAyZq at GC&Ebz`s6gIF}*UtGPJq&5*ZTs!VNUaYo zz-sMtMU$f{_T}_xhUMlXh3-KFj*{;Wk_w2bY<;5(fA2`mrK82OH;1%Z%eyP7G_kH< z$eU(1$ryyoL7Xe${IcGIA|L&(LS$PC#<4M05ltjQeXx9m1=X at Qie>$bFfuNWMILky zTB$3#MH5TG!@^6nJw!h!4HvXY&n3pD78FDOX%ZQvO|jd~x(MRffl897c`9ZK+vtg< zIUZpardC1mWFUL)mtbSI2VOAmYXcl4jqFYw{~Lt<2iZ7tL^sF& z?%qCg at Zb}mHmAX)9e}%fUQ?kl(uHd-R`PLbLNE7}YZc{V&ZgmOl)CG29Qt7+cbllp z-VcFV4jH}wJN^{9*UIG6GIs3(LX2+##c8bY==M$-qvx{g5iXT at 5 zQQ`KQ#end~ZUi#iof!<=h*tzOGfGfoVwW7IDI6|S>8oc4w(x0}m2cK at HcC(gj={`r zf)Q{y3MGI*1S3;n-!42$V0f|}!~&d~Noma-k(Lb%kZW8P;h>G3#D;BxhX`wy7OhW&RVPjvzrsFqR4jDO?5G*B zpJwNkkl5rqqf#nLh*~#Zo?({{c?QX$Y(p^C$m2>}|9wWiFZET*=YHB+%1*aHKgW#B zRce}8!c$(!vZ0U(C4ir-wc2J*mDDDXwq$R=0lT=9kCU-YGpC&yXQI(@E&*BO;39J5 z#34!`qYzgafnu&lB{Lj=qxq;zk$<;NArq~cNAaT+rPMuyC(GK&-J;)0mvDum`=3q!8BX z1*cP1ghh?D_GaYi_OyKzQ&DOC6U>85fnqJyat)@2X=7aSks_fZFfpnw^yCougN_Pv z{E#Jj-4sP(i+Z at 3dGSB#n2oDlbhv`~#%$@~mEE{I5gh9=J3|w!xO3Enu#)C>5 at I77 zOK_JnFRT&^qcoX5lmV9J{9z~NT>)4$OzrVdw+YdycahOwYZ!f%tnasV(Z8Z6JP~Ur zJ;5C(JmDQDvHRyi{`_VMN5ToyK8FFCcSXUo*Iy%D4NMXTysZ5dckj|1A-u$}npq`3 z;<8MJ&^T#32djRQ)ArbPzF4BK6(?P4GEV`hTqzKt{;u*`$?>s(&~pB1*tmj0eR#fd zIzd+OM{VDExq);uvwZle)AOY0V at 4n`g}{meXAd at M6s^Lfa@*Rprovs at zL%9{zW4&{ z!Y1{OuLavc7Cv+}OViVje`uo7RF8dq3THDrb-bf02+q#Hz-P}uiLF{b&M8pAFFfXP zTwOHRUr_I`9yIXdOf7)Hb<;Y?^W^;=K*-$0l<$vbB4%5%O)lW~NFTLg7#993ILK)?Ssi4NR|0$3A9r``!A zxnu|LJ4aFAJD(Oocj&-D$iPo`f(3J_Crtrj63k at Ae5H4CM6qW0g7}#qymu`Yx9*-@ z-b`5bO}3KI)d>5<%38cq#J*1tFnV`- at 6r$prPkL$22;Y95~UXk7Cd32*AR+~Tm!OZ z(gl_=wq2*3LBWU~O4KzgKTzb^Ij6{)u+7r?0J{y3kQ2pB$|U;2#gECs#2F2TBxTMh zV`V~EgrsrFNkt9?Z}@6>*#j$WWhyEHIZJ~3B at 6SioXO)c&qsI z<>66!^wl`%&nXSQ0alNs&S={gI!Mlp4nmk?Gmm;1S97SFBuu?u2EY7Es4R=8$8Qjm z(2ZCI%VA`~aPb`Ssz63x^nu-cnrUla9)NdW*aKmn`CQ6Gou74mJg(#%$5TGR5+MXZM7gsUi=g- zNBe`X;U5iR2yf_qd|mWpwI+%=qNEWA)JKOtBiaSv15mx!{$UeuelBHG?vEFd6HKp# z#I3^|>xfUAa10A!VYbRte#hc#q*!i*d$Y<3v at aWz)ZL-9grpb8&a?Z(mAehny{cZ{ zLdlO*oU;DKUa|Cd_|jgCH~X{1s}BLX=>AEO%Gm_tp-rT(-K4M1^p!BbX76*hQdYke zCki7p|34P{ z{Kp={|5}^WZ~m1j>Sw8|Q5DYZhE|G5k+cN*Ew$e?M?U0$d+-n3>qLs?g)%i17ST2& z|2~{?eGPtvV at r}dMObv4x|L+Ply0zDXC1QOU)jF8?tW=%ZGHd0b%#!9J5=#~H6iGN z2aU7hTd7u`Ca5fzcakwbpT+qP4^p>Y!e at K-<9K%f#QV0e(){~9j$*!(#JWK1N=cvd zs16&psg)d>*<_Q^l}D59yZH8 at _%d56`{C;}+Cg6}xi_QQCiy_;k8%t173>sS`9gJm zmS{A6hJ_~cChIx3W@{`u#7WNNlJ1>(`|9GXdq4B)>h(>8mxe++{P+gNku4I at DjWRY zD`xVxl|Oi^fi{HHh}rbz8S`q7qQgtC8*C$OHb7~tLK76Y;^SYP)fwvlRKMh`OtRC7 zN07VJM&20AFnqaMym+KYZ|4n+7B(=NpFzQc3(q$3pYGUHaaZ-4`cl(YsXRe037PBl zocD)RRSw*PdYoK`#asgdSn-s~lnNNC^@xdkG9V at AKGY7z;gwzc>K8-x7CM|5KL_Qw zGⅅhQnek#bi)KI3?>5NRtEcs0GzAUX}st{RD#s8g+=49<FR at X^VAF&Daps;XE8Nr(y1o1=pM7vzOj#EiJv2+nd z+GDCkRC_Si7W#wdtSegHm%eZ+HI+rw!@+FmI#u{uf1(ZieA$*P&#Saaz`^H+^Vuvn zhQ!}lNU!vVA>7g}O1>j)amaBadla#N!1Qe7G3pnMhnY{Ng=F}`kNAhsRHL_ndmPf< zIo?Ry$EcT at frxxN7&y+i)>vL60J{U6#B-%xw_&cI)np at eqUAi8iy zwec|%ocOx~D&$#OjNP{`pLo>1A@>s)zg23G@`F9M|IGTfK7xWntaVOyTubkwZ zM1>Ek>=DT}`M+{~t%n~gUpAY0IQsH&ACe+R9GqCY27+Puh-AG- at rE9)uZJ#cfU&pe zNhkPg`K1J+=4;97k77+y-M62KcN$i#oIrBZ3&Vu^J-fJ<(UazI#`tDt|+O!IBrE;mB4l2MPsAi3nq^r3i!3BSRTh zX#{I&T}5tVSY9Gixua$d-7RBNxi1!R$cyN2ZNP|R?w8cNtXpreTW at ejTn#yFmsl^n zN?oRXe)}{!TDohB3^?@S-gJ36{`t6hIKy-FKbr)pL%(?%h|wB~^ZHE7m5np`MYq=q zY0w6Xb!<$N;&q3rH{^Kar4)eSr4^z6S+-IK)SP&&Pg7jEuaWiY2-#sgXy(mXdB}`g z#q~TtX&vFW8-QctG=;Bam=3mItJrJcFB>}gv^o&I`qb*j)41RCVZXdJp>nrwiyU=8 z+?hPE`Sr-WmW*p~9ZGq*>=c8g<5UgQ^vuVoUAm=3{OFnkYTCBVz|-BH^WW}y_oFv% z&B8#jZ{_VtFu5L3BG%pw*x(<=WpZrohZ<~E>^0*$928&S8k~eyI?*ZCoD6bVc at _e> zyz+Bju5JgQ2*C~3$hi<7O7ehY25SSmh)j0F!iXNMH-+?f`kyd&rma99b_82)U_2Lg z3`O+s98Z5EeBqlYv1lzvZsa&TXNcDJtX|H9aDq!&?0O+m+(P^NIo^Zayx&5%L2WEY~&?+KQf(=3*#(cI_qjCW==JZCY$K?!D*ND1UDQ#t9q z_w7Kxz~cxp>MgkvsYPT=HK}q|0?=d>y zFN79~{MmIZ7)5O7N at AIY1~DI|f7)}1X<`Ckh(;(U%0|OY>tvmVodqCiY75jF!)0HB z9v$WfPCa+_=0Yn_%##C0){z}m5rQ;=gmPQ|>wRX_VEd^VkYKM#jVj|xhQ3^EUH=QF ze;JQ}Me900oQ0W%({6|p8aUXb(jk0zl%_69+%*`uo1!#M&?AN+~tJY@^8?WTAfz6^HWkq21`V?+hSP#S^1Q4 zq**gYW)9|`C7!5H%}nL2bt#lx>OP=(aq1fd6>|Q)61MRRpQx>e7gX-y-^i%36Zv&y zxgr{p(8KNic*b^ea0+R~ZRCR^wX>_-z+&Bru;=uR_Isa15TAl%4CdlA?s~DMVt=`m z%8n|Hgs*@oTA2G83O62ysds}b#@rKl8PoqEx{96oND=$g9jBC*(h_YdhtSg?Vozs z_Bmpv?yiKUH)6#2SfQ=~x@~317z5D at NwZWUQ#C at qsZ|>;sPn=mRID;?q6vZ|qU{sv zdP3}>%?u0-FqI{P3CgXO8osgM3^d`gIQz|wLELm$0DP?sk(G`naq_zL_#I20KMf0T zl^FTv8g=h>eL4&(S|ci+ucSq{{uvnf&^mAR^x`jo628ytd4a^KjG^t3HlIHv4l82} z`WL*cy$I&o7c(NC2>6U=WB0DqGAyaOH*@)BaqQUH;gB(OB3o0KrK;OQrDfBsKJ`6g zg6lEs8FeG{u0^;Fo)5_%Xx;Pm&KWE+1O`E=Zm&MCu}I%AJIluS&*!(Io(f^i(Py_L zo*IMUNd6GH%ghxA+zTh2y9NY3V7+t9C8qd-m8M`+)Fx)CiAer1x$}F3g7-YHrUWnZ z;5{)PZm(=@hNIy8-C=)r;XReYB)#6LuUBv5fnjdGM1QId7+!x7APsh-n>LC`62$F> z#1iE}`+^GA4lW{G;dp9zyU`N5>lg1w?^hD7h1s?|>A$kCj| z9q9885!VdD-yYCUplLe})92~da;LW`D*fP!Iw%kJxL^kTC<9~;TTgKJS>EJFn!RU) zzTckFViF+r^{?+anCFtDzVq9)0beUs9Pm^(A#h%G+i1L0$g0I@*pBsd6A^Wn8ichP1GfIyvG(i|gX$19b$gvLw zw#|33SU?p1{vDr=b|2gsy_=J>b~=>SFJ4>e!1vN6p6-SkB(c03;2hu~K4ioMvAk at o za4!-45k$iTworoyPDWOq^9AN%xekJE{>Kpcz1%z-&d- at vORpc~rQsLdUwFe7&u}Z} zJ7r$=$&po;LJ5&a2A)R~19D8uP5FJ=mOnvSe_c&%VV65%>Xv9l@(~fh%NjtXe$paM z*AphJ!g08rJ?WuWyTobHRnr-0ih&O1(L)`!UPTqgcZuDOLuC)lH zUKnhtjBV&}4Q_BXw`FYEQ#}e0TKB6rN&vA~hev9!*p+C5#jitj7ed;aIASFh1F>R| zaiJ|b`_iZ}U-Aw*Rue6I`<0<;p!p!m{?jgfNA5w_&S`S@%PHiT2>C%bA4N~Ca7W^% zbx|fs0y^fwH!+VRD-b_qG5*5V6O2D at z5z{8ZkCi6Oe`d7?gZ_fROA&!hvv8BUZE3o zfM+88w)Ka*nqL%cgCLa4?m=X at BO2kz9MkQ4mSRAZ)E#M7Ab-fOZ=5-lSYi0?L$a*k zpuiC}rSMx~tD1vd0PFB3Av9L?jPRQ9Xk4y8rT8x#&r>h9HfdIa1POuh!r;StLP6 at a zTa9?*gS^tH|^Yp;B4wZ#xk7qEN+%*<4_lobd|? z9J<5K!LIb^2Tq`7DxO at I$A$*>KV*@)TDeqW*0rt%&Dtn#7KR=$YZY|C)_=s-R+O{Y zpHmkwJqwaq+oytM&DuN8{=#pOV^=i>dL~5F7%r$7AvjCw4J$Yc;fTgQkV~zXTll-$ z8|PrcWG0IKSgvTww7OlNDmK^u&p?@Lx2h6&;x5&y9-M!%T?>%fOKi=Kq?^j#J-xsS zXMEd+5zyPTZoXdrt at _#}{Y60e#8Fao%tv0V*uN#wD{bGQ(G?Uxl at Ib)14SAcU6`W; z`7K7;Wp3t;5}qcrhDADYCryu%btgYONzrCYUeS99fe51qC{0ahbT5^%jA?fH;Y?UF5f3zElmf^mCsG{CN47?TUTLEwe)EZ7>LCAObbrM;7zX}4%PDj zcg^|>Y&F at dXnvA?cM>15K(DeXP~9j7VKdmng$GHo(YT1l+<5&in4??OhNRrzs$CHF zx2#qFkhRiD3h!a-S{0+(hIUTXz$1va**)@dW^=#piT90?#-7n#rlJmJu~8SRD`plC z*pIfEh=?|hYURTs_teJiE2>#;D2l&}b!CH#S~4v8Ss{CZNb>hqVPUIgcDr0~NCZ0d zo%L#HP<|mTIo}Z!^BA2HYb{aRG}6tgOW-!%@MWD@;JuVN1{9*c1QmOTWx+c_XrGuG z1DSKMj{V4=NbaNqpsq0E`id$Jq(pyZ6Jo-8j^Vwm$$t-%wmG2+R2_P2jXyC{42(*< zQy8TIssr$LVQDS&LOeR->vW~sGL57VO3{H#s8FykWkDYSL44)ACHSXJb5af}WGZ-; zavyw>QtKccS(Rh)v{Px5I>-S11*?&*38Yn0!}1FRHRV(ZQ4T=7K*Ra#+YOUUR8LtT zxJw?COFsBR((h#<7GKzzg;+3F5lm!0#Z*)!Eb;SROr9RmaN;AA`@>Z6!&8;$hrhkb zu%Gzd0 at B868*8+<+Mhnf`DvH at W1$-~TD~e;I$=@p5l9~8nQtVM8?I8goyD5xxpD5()y%LMiLju{DP4Y&uU78AcHIX at eB>r=l=M7$b#hFKW4=)Y7UI znmS}Ady5DtW3bm66nq^4turM1o{Uy(b_)Mu{?I}`Si=s&*uyUCYsLf{E4xS8?jaX= z!&WjNwsuprF_@`Ie${i1o?90$Cxl{@xONYpo(C~CyU02_Yb6`#o%4RU$IR-$T+0 zA53x8FBj7)uQGLz=%`T}s8T!gzIHv^==bkrq4`VeJS6n~IY1dXBeKXznm`XumH$>` zm^QN2I7g~^L1|3G^vnA#j?K&A!cQhXTrui z3BRTHt;1sQWKkSuLtG9CUkQ7L?D0xqyhPVQ_%PWd`kgrrp>_!jL!;MW+$n>Edg at Sb zn9;*Eq}fjP1zt`G+$I;S{$_4~f(-<&%9uFWE`A9uwH1j`pmcyPy0bGLD7+llVQUEK zuGf2a9t^Wo1^uA6dmWYWG7GgJ{Pw0VzW{V4hvSQP!*;DKb z`>(5qre{+1bkrw^d$yS2w8fxlFJWp!#``+- zs4b1#MK$y2viV)W0>TgKW-pM!Po~$<2taiN>kGY|3HoXgPpWMpq^kqesUF_xcS*DE zQg)JhRxoXy9i=mp1=@){`OIc1`pFvmzMTGyfLyO3Em#9o3PVaCD>>NYikVS6XZ8!9 z1&Y?|{-x%5#;HT&l=jxHPsoiwb&KP{{xQBCTDBn1t-FIlO{0NvIGy~9`mXy+;IRQT zSgM*<-RKFO2I`#+dT`w(jBhJxtpFamHJUcT ztLrJhY;iaq9F;L;ip7hiSc_0k(G0z9K1(oX1*GPdUJepY(T%T?K|s4l^%d#8Jd|YE zPJx0J;WhIOw7`~1dt+{j`_b>x;mys<0f-a+Rd_IkPHV*un6AxXhS3OXtNFwxVg*>! z(P(4tIqLx}d)|}~=keGp)q!}uvq-w^wv9=>d|O&8GA!`v7(%oSiTzm$H6}PFOLyx@ z5n4&%2@+ll-UJxl|hr5x2g at i~`yTMI$3$pRdlDA0M!)Ic&{=` zHl(ar=T2v4vD8PusZlT%%zb<>)RP5nxn9vFZ at WM|5+UT41?(bcv=}mW_eHC at wv3T% z_Lg~WnFBankNGt*)9?{YT#v;ynFB&xx_b0KC*z?8@!$I9v0uk+!brXUW>GO$^HxU> z0RnOj4+6se-x?|Y%PHkQj}?oP^<6f_(1ANosddUCxK{6w*3|jVSt~L!H2LoG`l&6} zSw-wMvV+XgChpNX+N=%u8$^8!-$8tgyOimBL3p!A$fZ}^wc||Cy{8cq+qul4UnouvWSFWsxK0;%8joUUX`^zW-Yy^#V9eiUTZ`;`LeazBmk&w!LLi$t4ufEByO}RQ35mIn&!@XDk%emo^Q};YxJh}si~ikHnVA%`sJu*UH1WKG&~7 at h9H(Gx%A|=S^PMjx zs=R_dV=;RDt+v(06Imv?CWF=mN5(W at I}`0C%-ZR`YJKYi^o*Dh7vSkcD{Bi>R6|!%Qy#D! z at RPn|jM(PDATs(*;@?o3=xuUe#j2M>pB(}Devknr at czgXhm%#{mGT$H)Dw>ub$@l? z9YOoqDt10=q8dN&OQMo{W+Cma%8NXI55M}@mnqU6^j70$Um%kAXPpPjnr>eAi@<&{ zgqTgx4beg*t0aEEKjoWsf81BZYi(c%IuBT@$g69BB3aZCs4s6{RJUG$Za+o_#(U|A zx(>54^Y|awMl_U5=+OrC+1k; zaN-AW11#`byr(JOsh+DiCxL zU*7QsdzT0nPg=tww=W)?ep^oLU*$a^A0wX`zeSlcdlays^AHj6JbaTa7E+S^M0D#X z`4f#KumR~2#Mp-CT1?9zc*wc^HA_)sxFT9MAAT at _n;P03_VMQv1dnw<^xt!2v?gm$ z6aGOTTtpBMw*MCTsG9#f_-M##ZfYR^W&B0$E-o@&NPZR^pXxOnpR_Q-7;_P_WJC-* zWPM78F;iVBmQqH(Xtw%u&VNC?Gti~u^sM8=byeJ7UeS`Agj^Rw3Tw-U!{geQZHIp< z_xtZNUx2l5<|qi^Z9|1o%u84oyQkOCb!#{mG27Cy4D&GN*d}yBTizS|6 at U8#{)dOp#~J zL7T^kXE~v!Zy01_Zc4-1`~WAN_6b*7AeD)SPoTn8yaz6eVXo!J+*oj|wC_0Z`c&*e zV0vX^A=!PHok7!dmZtNhyOk+Yhnk+z10nc9gc9AlqlJ+GQW28X<1~0n*|vn{sv at 5! zmKF9t8PPA&oc*;%lVM|KPIPUjBKv_scDoL9l#y)3$>CnHE-a20k3 zKK-JkABXz&Z8x*(v!@V8Y~-v+tuE*&8xm;p>)J~kY7|MzRIdGIIH_;T)~t4NqNz{u zXgIUm9T&EtT@)cb2lgS7YaE=W*T(I#Bx}{H29W}x*7g$nNq;Vj!)4NOR!dWXa`)P; zOttGHShsm2^KlrV+!J1u7OqS=ZYWZ57+p}6B{(Beo4(=|+lAI4zhEEf`0W|47tcId zS>sJ<*j$eUI+i`2<}2((WA{E^N?iycM-H2!o>)4Au!LwDRLORJhX-Mw{HpZyr0qwk zGrqM&*o>uggMtsy)q4FMLAc>rQUR9GpF{=XVCk&VMI1wT#{+^szV4`(v2&-(YY|T_ z5f3bZAz5qY;Jp`hUX=cj!PhwOPyB=D!3cI2EJN|82c zy+Zx`Z&anC;9Ugh`W at gcacs;LaW;s+jc{d;0*C;9B6Hr42f=ZRfijH(Wph-youACK zMC4fDZ+U!}w6h at dMFPWKczC&M!knP at 5zsuBwxRKFAPI^@dz66)qfLw{>4Xk!^>sf!1*Nw2PNJdPpcX5kn{twEJZ1UYF?|GJ^rlR{ym_j~xt)0)%Dntk zSFkL!AG}o%ku>yhx4NGWRbfaatM&Yhu?0`RRr&>7<$U~!n9-Iq{q=7IYX>bb^;54mOs8PfP;6 z+-^fAHH|rgrSP|N$|riS1 z*UdjfD{a&Ux6qS1OcJ*z{-FS$aMD;BshOR%Y|>a8i4NdduqTVC$ia?1(lNl&wvMi_ zT320*NyJpjaM*FCcu z)lMneWz&m{KxG4 at Nb$+$*sHqdNTfgD=oF{VYCF}%Ik;|>NZpgDHurdJv2T^nUu-bd zWlt}$YWFs;zToXT;GEtRTV~$C^zcEdH=HDN?nHO3I)b^5>`B~n<>abk7)xE7k at S(F z{nFBHL*PjUj#szzG(0C5Mfre^^q|!qZeMK(F;3*{iKLYHNizvtX%`h*;pzu7?!kI^ zO12G at Yo%NPyhtkoTnGnBX21)3w%FvoY*oZ0T`v)pS>%E3gBHDmKhMM65?ezwN5z_v zL79!Ti^XrPLx4E2+8|9-L!A0L{l#{KR at fPkc+)2 zn at Wjr%(KicbK>52dxP&SpP+oAk~BnQ%gB9-#l?J`BpE0z z_r?aP;U4C>_8$TgXTWV2o&9_g!wf&-*6)vXNv~Fm(2E)lrN;!kH#xr+NsruiLT07_`P+ z%yGkno!UdFru?M#mGZpRIC08Rq7v;X at AC-sT_ijh<}Om`f01k=y$hGT_b+@^P4GWd z9QuW*BBesCgp;QT`AFj%WEU=oF(+%tm^WD{)F|O4p`JU6t6XsPW2(&KcjD!7t3i%~yaCt&@86_5 zg%Y%MhdqCEJ-KjSLAtxeZhDf%irapVIST0!y!>&um&$hRX34e=GhD~mdO4;gqz;)4 z{CDFV|GN#u7)THh0P24wWtMORco+lBtQ{=>4OKMteHLBOzrR)&9P~%{AcbA!3|f#h zO1RzV2HQbn-MZ}6LITb7FTt!;5?q;;gp=TzK0$tg5IJ_u;rZVFOVxaTmqk9kQMA5r zG9Q)w>EbUG#k&5Yke8l*W zi3wXdo3`nF__!(Mgxi;N+$;1sIn{{nPN}p7{o!SG&V40OnPOQ3UX;=x3IiG(&Gtu~Q zWQFGOMMky8(ME_+3x-|y3JCrMOnDtQSG`t78u`#QhPWzigFN;qbQq_w^?iY*aP?_} zK9{sLd5TJ6zkLG-(<+4f?|nZn`I%LF^~qVjzCvNb3l8TJeXZp=c%+PA%@y=@^iw*# z4u;AOH-pw`w?MSungYs;@zk0LIVV}$JjFhQl2c7=Q*SYP>-bM&LWrw)ZcYKmnQ znjKAZ)f(Cs6NR%5PY z3gq{|lr1|m6Ve#0!!oR9_R5P$p6cmEZKCm8|%(@q@;;G$Mw(Mml^B{ecruUWnCV z)ebIF6xT1pTx^%Nk*}&5l*~J0tp|H7n>?;UkX*4%m2&S(8#LA6+uHQ1Rh6J>xivtW z#_KF6TDPz)g>Z-TCDS{xX^ARw at t_ebtdMdZO@ZdeMT3N3DZ;2C?Q(@(bw}&OA0Xhu z-CH>g at 5h6zy=P*5O_&6bcjF`-vd|$V8J^Zq^kdLt8ir4Fa(*+f at jatcR9EAqoRgDl zr7XGkbu5Rog2Vd&Ak7^viu$Kt8J3Efnq;(gkeg;tzl&-QA at PNU(ijX9_T;ucgvOWD z80v&V&#YZG%@m+MfcT4{eoNk$agQ^F9GxX)!~^x3bxwdDHtX`xySN+Y=eBFRUG@!o z57yeEg(dtY0%qn&o;b5tNKY)1&|E6QY0}~0{AT7Or?{fqxl9S)S}`MYC(I;LeY(p?yq_>5VZv zP at g+9@A?8b(b1fdtH8i9R??)Q&@=`q_zJ%k at 4@wsb>Wth2uYt>ffn?Uo<&g3Lj6a{ zQcV2pp4(G;4`yCG74V)VZNqcb1VDEh1>w~LHB(DicbVOpILZS{7qyBlM_1dvr}Ody z=~^=1z+$nu>k)@u+~tJrl0r<4UeRLAX?HUl{`26syJPYv4#IVU{vM9rg_C1D%P-6< z{*J=J^DaIV*7ryMvImC!c}bCvw;i;c?-Q1jUhHOu7og>%IW(Jhn5V~Ab?>1%Enn6L z&Sv&f_dri>yu#lgGt$$KAM)ap?{Aa)Q9|<#S4;suzcMVk;yc#&>CA$GzwF at 3_|TPF z;d@s~cNcgQ_OCz1-3XNFe3Q9o1#zQO)8xX0Xp zjVghHfcymeueSaEC%7w`*!=V0|H&g)mRB4QLeC1lH?9tX`IXZJs*ER)ZX|~QYqMZQ z3j9#vbd&D1odENfWlHnBg?=rJuAPGr=P9It3qpCgWd2X5!Y{X5okp1r4sSsyo7a!b`v(F#((utH)@(bMPr?A$z#I(>`Txd zxFSrg7xY_WX+Y_9hMJB2+n-I;>q+V&{I3|&cp`<^pS(tEKsnoa`!U}dULe9s+40FC zq+P{~NPwG2T@^XnG<`&JMph~1 at G(Lzp)@JZ}oS&qi^1KquF{c!oPcc8l<09g74$M zvjkFaK5nRXzP_HgK^Kybuq_c`*=aizmXaG(U`6B0H2Q68dGZvc4IWFD9CsUc& z;F`Unl!#(>hU64e?rAGpq_d{1CDULXcZmrFTAPX;J!SUh%wQm(t-T!VFokdETpGdk zh1BS&C at V!ZAr^UZfM9U6*qSC~HQBW)nv=VtNKJay@@`Eg&J?qtU{YIpwV}*@eV(Kx z)-pq%3l7Ft!ApmepD$!do2O8I((jBNTHe?Lk`KuRSw?5)kn)FU#+G^<@)ewi>jpWP z at HnDb$s>;_%V&*(O$8$jEfj#JGd*QV&CYC}+km|Wg56X>dv{F|+ZupsJpYZOJuE87 zPIMFE%*>bxbWu_zX7xqx(;YDj?QBs#9>V-#JLN|zG>cjVdaPJt4ogOPs$;vCTJkFaR{f at 9GL8zByXson&c)#cXx%!<-#}d|drofQ)O&Py?B}Jf$$B5p zTYZRL6(Fd->>5Eow5^e95+4a|vN`WGq(3P%A{XARqA at X+7G)<#YKuq%4eGyb##NvhIj(KkA?7;!h=^C^oT zOEE>;D9aiC8-R;NyBH2^-_QqeDUZe3sOK0j-t%b$#62RkiMJF;3?t2MT8R|u2xcZh zW1RcTJIFhb>7V317%mu}ME|KZFS(5hq8;G1!Y~GRjhutb6l;UN#xRDr!^p?;7V|{* z7C$9p5i*JAbWd0lH{seQ01A-rgJqRGSVC~q4RpG`2}sSKxqx*s4M02P2VeiD+Dh{IBGnyPq6Q5E~dD6pwNKjRe*@QK*y)>r3G z-<%38Yiz)qkjs}qsa>6}CO#oyQRlKjyQ(%O*giac+AXUqeXzalox|;0iTGa12rO0U zujTwaAN)NyPxJ=YX3Kpi%r_BG--fYLh&~OD3`D{wGpADq$tf)uOpa;OfMm%s{@RP) zg~suv1`t#@1jPk2+2adP;FCa0jvX4UWjZ5HW|TV&9`m%>3|?2lWEL{^KN5`A!;Rt& zME`;CPX>3L1F>h0V^PZ3hJHEtRbaPtzd8bA`DFV1lLEsJ+24H%*-@ zLKv;)AqmFu&0JyKU4F)zzM_puLpu!&3QvJ1KJgFSakmskxZz)}JE5KPd at e48CsN=K zk!7zMpHbX?)EKmX(HW|h&$PMW;_e|d^=TvA at rZWA)NmDu{>WDmL^h&W*=@@QbQS|T z$^14Lel%|`lrFi_E0;z1eh`93luWKj2JGCapuT9CR5TG2j at 5p zy1w{+(GPwLX!?mar;uUymA;Dnf@;>XnZD%_>^0nN^qE$2YlgKc-xv|O7|muJ+%H(L zm$P=can{SE+LB~wC1{|~PTaO`2*i z8bHRGC0`Hgdn`Y^U*){~+XSeSDzsY*a?{9nl9~XeabjiU#z-+MinaTY1F$2Y5dc%?bqoHo40G7_7e_~JSk++H#kmmQLSO)Bs+0vZ!tU!5?uGG(nZYGR& zPLVQ=We_m1zg|FD_Mf9fW~f3s%(FS(_g|H>^D$ZT_mxlZOppQtXL)3cJx z*YnO-ISZADgdf2-4H^=4x3Kh> zS!ZLrn>F0=2TAMq#ijYDXOCAb4B#_KS15#$r}w~^qHZhQ6%6jOS_8HY#ZMi#;1pq$ zmasjhBI at qg>F{-Q4tvN&A|z+ia<#VGhWlYBb?F!O$J1#N$X4J2?hxG+iA7NzjJ9dUpnB-QgSBnp^6`q{=fK&fTt+uZ=i0{~SQ;*?I%ZA;nH; zCAN}4g}&yJ=%JiH_=RP%WY_% zdC!(FWctn-4(f(npTDD;x~WmIOTG(U*7IBUwLY5Ap45Mjcwt~MR~cyxi$_zZPi zAr3bJD6F%3kZ9(JLVK`jqzY7;RIOX(Qhr~J`-6YTD4=#XP5g4g^lPfsRnaW7#x1tf#GW0 at ZC6r(An#8fUY~rdgwMnNGgo at liY^$%Fwyrtk;lpP=G>f#kVE=(on&#iM*f_rg-MckgXfQLrm>@NOkzLD0s6vdyC z`TB65Pwt}3-}}tFvNLT~n<~+!`PRFRG=!F?L0mOvEekp)~2(H>)H3U;gl8 zt!ySA&Ya|5$*Jv|d^S(-)!o^$mnK7_2$N3|Cn34_#2l;$l$({VM^es-BWhMx1^!S? zx;cpWdh>|I7Ej%4g&NRYT-IJ*+CiE%@qbl|_dnAi~W4+5+cUyC0EM`&iJc zs&?rU;rR~idX-1-47G-RczX)BTfADaX|pYHoMS6HVMUtJ!W at 2Rr_U|Y?H0LmX5ima z<+}E2$^QR*E*i#mZvVq^DO>eF@}N1L_eVlF8I-6)Mfx$M%WT?+i_|cRRf;0}0>#=L z6V$F|c+I<{@wwryJ-JL%ZA?Yv0`Z*1G@*v9RB&$;KGy~j81KHnJY`SJX$ znzL5TTD8`y>EPfudV=;9Q_3tP=9 at ewR&FqS2$C9!0_c&LW at 3ymW5b} zJjx``im_PMKzAK>xDUBKBh)N*|D|P52`cB?%3r#C2mg1S2min6^1s^;{$Ky1qNji+ zgw8i_-({y&oKGB4c!Ikwt?9**`U|81rr}jEs|V?#IBqq^%H4wLoko(8oc|f at U1^A? z1fe;x)QRxXf1=}f!^h+JDKD=VI&Ru0OA|P)nVnWE#rk zWxz}8X^rsgLf$Xn81d0|5DI=g#rlp$U|-1E6kGSIekIZGFJY1vUhiMh6CFdd8aymq zMa3co!nUXxT3m5G#6%F6d1s&EQcPDkrBV_SIMpqf6IfpZmDe0eS_(H`JuGkW1RW{i z>wHFtuKIv*SPVE at A6LhJ3DceHBB^Z;{8VMRMze;`YRbr=>%>RYLszF?4;&f)Ijaic zjYVaxm`$Wp33x$Ne+!%-6VpmQ$)SMPM1ec-St_dzCu=;6oM1k03VItf?dL5;jrZ(qkwR?lq192fD`^ksbg?X`6dCnbZqXt!ZnEIzHQ(g`mak5jeW zE7&}azH+uZoPmem=|Rm}JZf5wwVhYTfATAp8qz#{%a_3@&z5{|5;CGyZR;7N_Yl_o zQ2C>|E+T^qh+(43-)<-SVL(u0K8q~afJm`kDcP^NE zu!I-RDkc3x+5r2|2*@4gHB$-USE8RE+4{9DhD%2C8Z=VqDC!<+toXxJNPPEkD>WRH z*-gsamT`_WvKn??)D^;V>;cNiT*dcr){uM^wP1!)w%q5HrVa9&t!Nl zkKpV2D~~)@I|VK^ck;E3bzKnxH%8e*6iaUVYCMMIK z1IcxPWG^mgfG`OUNzYyUd<=A36w~@dLTCWct}syMq&i^XC_C^Yj1 at jQ7|m00K&l}I zc1^@na{zqGk~5qNA-cr&y&xS?GF3cGDHj-YSxXzsIFzWy-Ju1#$-}JGsChv zEZb`Y&f}>vzJgieEZOu;9#;dpK>IRvuiK at HSNsnSz+AG(x-coS&>Xdy1B1(oCvx)y zL#}9*g@@3=9oxjlP~Jy_WlQv0-+tG&Gs at d0HuvfVYN!@FXm4H2#gygN6H#2;rCFfj z?Zv5+ at Vm@A$QFW{D%{Hxlmg3g22x at posqP+QoZ})dB)U`E+sB414v4DS zJ(M!Pm^SFsU1W`Lf4uaw>=!JmjU+YgZhp)xIZj4IObkWv^f~WMx;45>x120Hvo$Rv z;bHDhE=GDNn=7d!3ApzX#H5!ksw%G^=CD@}VqVI1E)T&EyOpQMKl!Ir5NGt$?IZC< zXwr6-)0Z?(1E*zZD0$fq1)q{|4;Zt{I=?-{ck}GO1yqu~Tgn_eL~#e$2d~xf`W~emT_!SQ zj+XGfzI~kzK6j90Zs(!t+t+!uL0J54q=+UgLP|`jD12Q at iVMLbt5x>J&5EAVISt-# z|LkT8?LPpnsE>2V`st*hY2?U{VtCQonE?E(P0MP-akk<`v+_|#e}QfE_-w*>-Qrgl z<-Mf$lF(ZN$D|LcUXt8oayQsWniE7g?~2j3UZ+jmKWEwLZV}C0m^VcL)njO&)aJ0Tljo z)oYIfa-_NfiEk}k7r5@%W@$kt)bSp7(}mt9FGT^=XGVO3kkH*i7u$pG-Jt-_to>8& z2k&rxUGr)GH2Q$)mJ|Llf*-x*QYqPQjN|e|mCh?|&YDa1VM(LE(@ZZOleW9O)_S?F zw!b?9D4rRf)!qevLj_(}+TuZEs4*mx>t;ORGb{ZkWmMxLo+roj2|xkxP6FV~tt z-sU(`;+fDEF80|LI&!^YDPo#I2(1raY8v_Q%;ZRN?d at wt)0IhGOQGz<$CRk1x_7aT zH#F5&&#=M1RzGe0NA`sL5jxGC8wJ@#5Bw z{jy?u1?O at 5n6IW4rzTI^z|&LD{iJZ~@sk&dEBo%9k#F!rzURsLYCm`X&#`jW=f5aK zj;=^8GB6Mj1gL+PrKDo!Y-MC?K`Fq$;_Z{hzkfs_XJ-O6YoJbokm( zLgHemM_E7y+S5f*Ur5=FDEllqBS|nu=Acw%UF>U|oqOBgH24*{gqL3);?g zkwdISx6&}w&`!z(EM>+X}j&AK(kywV&Fyoz@9Dx*#d?Mu?v6tjwaHm4(;P7h03}6=EKOCJtP#oIb2DI6o zT_o`bKsy4;(MMt?$91SD+m21`P&kW!7P!&S zEcb`h{Z-9iOfsq}^Q%V1DSc)1BsLUNQ$$4SHVz?LBtk#;GU4NPXCU!Spik?hYP8BS zp^C7Ht;I#TpUrM)`n&kLq9oa$kY{zzQH-Bp#2P{^DByl- at EVW=a?tw8z at OA68_|%Q zNX|B~#K>)>v|YT$Hd(YLc8RD1)5iGo=YEqkZ-}gylrh%A*A_m!`01tp5bCDhj>XKq zitrIxN4TX`R*7nxa%yi_}`a!Job{cHRq% zwyTh=3}pv*&(6N0{qx$3C)x$8{QGzN_hb0~vG)G+ft=VFA=rLKWU(*H7Hv38g&kpJ zj<8%Iblr&P+#f^8Ds$j#r~O48*B}Ja*?VI-EEDf9*T;aZc#5CjtztOEg(agLYf`qf z%3zv=m({s_(rOU=^~SPDW!v;SW;7iTI{_gsF)&6Y!ep}0Lsoqj7`)Lg+AVwG4I?l= zihZu!08Wiot|BAcjgE78PP{4aqMDyD6Gt&;yE=aM_0f!mv5W_NM^c<3IpgC062qvu z_;bJw0|F9``|l1I|1|9X7&JiR%?Dir$Dg8WRmz=$6dcr6^2c1UEqh4voUx2B^}$>% zOkZL;CTxieb4VbdxT^_$FSHT}s&=L)!=T+RZ*j-{|8Q}|>?*b_wI z_e|YGPGF#MgFr}qBS&;iH~ZF#HTfJj^IrQaU at ROhbNlswH|yJxG%- at 1jh6(a`PI5CD2cWA at FF-HKk{5}pXn_eST-JkW8Ma;k?*D&*hRr#OH)q3YW%85-KnDx6XGGk zsmy~-2qz&v03*`99&GPYClp;1Y;t2cEXvD|GRw0PJ7i)@jN&(Oj=fZY!c^K{iW2We zT`qgFdz0%)ZBDI;iM at fvk9^6vhp*#)Rpd&^p1~Y07bVK0BLbe5><1xZfug!|!NXaq z01G9B!9Y{)Noth-dURbJwAdP*Y$eLgIhSE#DKqBUZVEc~keoK8< zh=D>1I at w)b_XsAbQ!PuH(pHC5uvq zs_Z1*SBrlx?%DUg^OUO8s$Lv4&J zmD5#8!8qR;qI49U;(m+}N49+E=0p*nP-*||s1>_O zeMRh;!=KE29kvlX4UvL7oTSgVja4&oQ%UQ at fkC|RyDj>t#2@eZYCQ9j_t{9WAeiwYOyP#$JuoulZfkk-#1D0F`n_s(OwBE zD9EUauCwi&Cy;>QDkeUMwnxO2vaw?QDk`u?$9;zY$xa+tiHGyM4e>m!2Aq=G1e6YV z6+M!s?^_+W9F$B}$6LFe)J&yMc(>xYWIfuRbI77uQ3jUJWco at sm0>=jKI#Kp-K9pj z$7;GW*EHR=dxc>fj#2|z?bU`tf!-y%%k9;>9G)@*4q|nL!MIzP0FUe1C>mH$7rr*O zclnbKf;!6;m_1*l0L2>#gn<4$uUPs)9|R at d>RpECs$ZX3QN1>vgkOsFkKCw~sCNqf zjuU at RG&1Jk?6)>lMB;C#k?pM4sX-|&_mj98<0$&tN3gzf-a_p(B0Ar%Go2;b(K+6< zc(PHRqwOtn$M at E0NT>IIK6h7+X}du at 0MGnii=?f)z#5rVM|d{s+pi{&nz^Hv>$~^V z%n%ee>U)2+cQp>;8_2i36omjdvcJzEY1g;S`^omu%HoaoMEYpfK at Re5QhX~*GQb+a zN)=M{UFhuc5%ZqAr4Os!i38P!I7jbqD7 at dwm+`)mF-QeRf1`8^9Ud0TyhR8f>`!T= zi$Az^RIastT+=ittcBU-)1;&T##IKv99XL!J0>oa-RS2maumcr=^S?RDVC#RGTeAT zMafTf_}A{f?qRYPLF|`PQzZ?%$hrj&ZvWW4C?O?-I1?BlA7GUE3T+lwls&>dp5_N!;m^+w*Nsw${60+{dlAs6GjF7k&~VXbOn zJ64fxZ9EawSe}nYJA?{1;0eP>YsqE!gN2f$NCFCOpJ8VQhGd1=pdgVfmUj2qqrOEN z&xkt()`Z(dS9LY)l4e4iZ+W-*rb2z#2fVOW>a|}nr8%FT_L}c3%9OmFc;Z!FgJ2p$ zrQQH=kfh5uv+MeOg9wdbF&RVX&Qs<;V10uW#eUFb2x^}TiaL-Zqtu%1Z^gvcIIn6) zL2^v&h+j+bv_EkYA3%+y;`XJ!z_K^9Y2H^f{9#$JpSLjUlFQR3|9zD^1R5<^*rk|w zxv==;qEa89v8C_}rIBAccM#f4xparUQ(we>BT}i~p*YSk0owOxWTycnzhRT43300# zD3)&{Yn#j(+zS-!wG~wG=4c4kp^6 at T9wN#-I@(JGEq}=@=Swq9yaEe$qsr$mQIuAt zY^tHMMzemTJa at B_#YQIj z`88!$(j20Tz7UMWz2gW$4^7oPU=UjdD(Uv^>C8vdLV=7XGeYlz2mAt!<`pJy(yLpc z1lZa5`uky{OsxD$4FT{5^N%Ef>55^{uIqjQIj8yjztP-qA2ZxucmCeUHOuf; z5pNB~UaKHkDhhI9XKo_0*0`Byjyf>jh#{37S{r#mx8P&mVg>lHX#JU-=~_;}aI)4S zXq^i-d)kWG1ZzZo#GG6uS>PIZHOyI;sG#s&g35?B%VIEmX;mBJVg*cGM%h(O?Ur&B ze_1c=khqImAC`J&xo_{DbZuB_Fqc(?x0hbl8R01L5de>Em$a&A zj`$f+;9L!MzL-{dfm8(PiO41*D3k)dm5f!6 ztA at LqhmRYW{8(=sNOtKFlctCoVr%$NIFzV^#DXQqyl#u>1buAIU{X}0nLiv7 at Zt(` zoFYIBqJZ at 2AzoZ>6Di3>wH^uyebRd#uvk-SV at Sr855@x}1#hPb7%q1|HW$zm&{2F? z3u;mdvM01-YI#WG{`fU~NEI>_0+ila-Rd9yUin7}(+(k at n^V`R_Mz52h<+8u)`z(i zDr^l##_L0f?l_2Pl;OLEM9~Fz+Xtzq>ha6I=i6Hd6}e=c7rC>i at Fz({Hid#N^vbUC zmbu+-&Yib20lSh zSQ#MLp4LcZlWISQ8Ib19bn_2LaLQVsOk at p{HZ#25^dBduj+ft{ezIGWS+39#$MfO8 zaaY3QaS$Wl(22C{@^&iJl5PHO6L+En-6mkCfY(--kDGTAZi%J2EpUcV-4r;&4uFR*X1xM(3RR z4ZoheY*;s1=Ly|kgPFLrtG3yE+q#xnjS)u2X6X%sj|x$b~24BIVj2M`zV1keSxd*3ZvKLatS!*o%Z_E@$qpy%mAW=jvjJN zD@el#Hq~&mQE*5P znkPwZ*XIbi5KtZyaB!a2GRM9|Zc1MxX?C$x_Dg8g+V7mVMpj{@f+t$%V#S4LkqYPt z6ryvsXN67OvW?2M$}!%WOc}8z_TL!~Le_#*M~@bh24bZXW!GuzZ+75ORo|)eT@|I8 z6)KLoS1GZv%g!1tHci0Mhc)D2dQ5aG9Sob#7kku?bzGdpS-Dht*NT9DtPwT6tWvE! zC^VB4ml}g6Q9}YTu$3Ev)WRxwR8&!hGvP|`c8VydA(0;rJIjg5b$uM#VuuQ>SF^pD zB=;Td*0%(RSs!RT?)19Q^4)N6*Q?jor8=iS?v6d at h^qX!1%47%bzkD)hre#DpPQqQO&`qX^mAqsxEo9m;YJ^MC!+8K;vmJR8KCV$?}^7E(yP zH>6X(^pAeKV)E0Hve+i+*0po>R+VRo>~AncA+KQ1N)fBYp!9+z4-?%t6InSKAD{bY zWIz3Q9~;6RaCsMOOgGyc2L{04*!g(x>w(v#xZNpY+^BMpX*@;>m3#}$d%m<-s`HIFdCK8EMhDWcX+ta-7b><1)bxr>9vx;fXf+P;Ub zgFIoA2QdcMnofL?@e_u*@?Fa1P88#^k1>6O>0YT(waqX at DFUT}vjWq3Ypm3ZvlYx8 z3rQkMvXd(Vt>HN!T at j!QJ5VbkB!XykVX?g$uruPp1yUD7<5T-)$2V%nH-sfcevpjd zd^KY3`JTDa+4N6Y00HhI^e}+UER*dQi#^x%7=(t4PT8z=9{HDC{%nU-8IS1-K)v3g zv0*`%j$NvXj_^qzKoF*LZ&`UCp{dz6-;BA72Q9fxTC7M6XX*E?>-{Jo=x#Q5&Z6D^ zi*JJiPLoJe|2L9j#4-Jnl6X$)!jFp`OeR%KUX|)!x+DfUt`X~`S-sV$>Qdb8BJe+> zeMkvsk5y_dlr%qJ{+SL~98(@aFd!iMgdiX^|5G~r2N at 1E-(1j^F+P`;z{bynVbUqV zDF+R8Qma>_L}IVXPe_o;s7Non5JFi47YgWB zyxeZ#GDZz%rtS$(dS~Pbw*g)H89NP2XqiUZK1Y`Tk7=%_>?_}=4Z!QQfdc?4AK^;O z5xxVO{8wFQWYCG+(r;m=Ah~*AJ!#l531?uEvAy(&p9p*}&Th0rWQW7 at 9*<`;q|SAE zx({!R3Q9H5is?g?E_YBx`1B8SPxKYcNM(-16I*jwB|&YQDo?Rb)t0YUaXQ5jLKeu*Y)0i z-U%Sit03a6w=Ni;b}?yA$~etb8$$Ueaf)1?II%v|A>H0nx~hPJ|d z>YWit?>9CPKMEl}VI+cVbA(3Ts=3JV6g>xo{how5%0!n$B}e(ZgE?IhZ at AGcK_25< zae|p|)AMw63+HMTLRN&7!9~JyNP^`c;_^=Fogg*GlmwOBSl6^jWGEACplEL%O}~xFE2WbJGR^CYVTBT5=v9; zyt=Qb&B at EIV{S`00YofpGBIWL340H;)qJ)~9R-X5U<1O4<_7nqhy^90AbQNdg-v&I at fDSjAQOizBK(g*WhIr=BF0YKX5Ei~vGi_>S zY?T|HiLjf}sPSh&6f0ub4HQPeAO?m8Q<*V=Lxm^aRk7!LJevNy7mM-AU7jiH2sY=&YO|d^rx~8m|iF`T at c>^pIHNY0b*T5WSNvn1pt_KZLv(7Z+3n6&VpIXUj8%s6|;(9#`TKB z>eqd-Yj4|c9?`2--p9TXYR&3+j}?M^(8R$Gb!ZrExwnjL)e%&Q18zeP+`B8U6~>|f zWzht%Eji=#J%1POOowHVt#K}G)i12Dwza?$39%!IZXV3AA{r zu1OV!y)?l?Iqt;!GWcT{G2N4y6FA6rZZD-Pgb*A#@k5_5g6v31CzPTk=NnUmK_K<+ zjwbvmr at X=QQ}`_e&($*27>F&&oMFVGBvB0FMwmSJ2SjIAG=PEW+8*Z_fcnMHaQzRn zF2fEwfq|}k*%pzh38{n^%7gmf7Lvafny(_Phy{Wfs3 at Z0KKlz~H;*3rBUIzwWjY2PwC-bML^<8_7sL31MMT7zuzJ76p`I)iV}h|1-`JPt zg3?P=iE;CtQk>0pu0-(HmBP{r%D9(yq2YdWN~HpS#O(=vA6RDm2Ih63_!9xHY~}LT zJ&cMwJQ(U8`S(I`-5}lzGV3*&h32$!E2$OhRhxuJZOM3(n$4!AOD&tb>IcuI$Mz*{ z)57d~UPlpcb*P5xHo-rvT1Sene*D0=MZ9=~EnYB#&0;*9f8>;4a^IU^D3A5s~xLxp{qqZ1dig3;C5ZPSJ#yhN{e5$Ys# zoTQ41<|W_;4!brl^cbkv2}utXima{(w&tNir_xzQprsG=9J7hzT%!nqCNO!F*zq^F0ff|u%JHy4{*Z*OpT)Y!%BBr-QqpjSH z=Zso<^l))4AGs~;%WI&g{X_oK;$0T|M0K>h6Ta6y#{^i%TqMt%R8~Mad@JNUjSlX-O!x zM&)FZcZ71>RncM7^lnu8K}!+|ifp2S5hHe26wh`tLtB?F*w!!o@;H#QVU#})?a5<} z)|}1~Vljy!u+ztKzcbao{-sEU;5}*;@K at RY`JY4|yZ87^*Pz1Jrd9a+4G|1v;sZ`Ih$)-}J=i`@;w1 zZX9A0?qb|-2w<60s^lUGf&Ki?Q!Cq?CUB at ws}k22~8M0`B?I at WXb3g zH~srVNk&dAy|B}9RVlh?4fqoCv+O=T_Q!o~;+B)iQjr9NXT{l3Z)4@!DKBz5eFE-1 zumO4J(K at f{c7kEP`Mi>(ICSfUDdr at A;q{w&YDpo9osi%ypR%XDjAUtzikWl8FhyZ{ zdO|oK(%UygWQg)Uq-*e4kZ?<8+b;?qht at 4-DId0C!J8n-Jg&KMx z3iJ`>`m6}!xM|A=cL(zfDrVee8^xZJ=PZtfx63?UE2#E!YeC at +g0#0QJTd|J7rik< z7q|bJ156`Luq*%Q$_V>Eh;sac1OJ(JtG=y*r-uHS`W{qYDu_c%*BmMi4TD?}1)D5Q z)e8$wN<}wFsMpV~rRknA8P>WVGyMrS#o6o^oJdehZ4F8l*_>NmjR zitE^a`{l9&>+}6BZ5ssMh$d>hefuY-Y^0GkJPU#)&=%dr6S>b99c3fl*^4Mj%yh7R zL2$cK^Gy?;#(0FCI6S<+0k^LRnn0qS{2S^4*MMS;lpa;uVq?hf)>mQS@&44tvSK$N zWoa6F>p~D8bpcTo1_H2FlX}4UP8a6%R7I!1CN!uci9XX at Nn@VXLpC_6mW9r*&emc= z&P}!0l(V%?6<%juNu#B)wV(^CgMdA?bTBRR@ zd;ELFozgHR6&bEYg>!$)3rV at FhD~d==2)C{m3oTjZlU#bbd!zT{USF&v2dEJX-HUV zo+FL6pgLrAFaT}bS~w0a$DzI&rffugRXQw^IKO6K#huCKRy`*iySIdmm=8fb6n~?%d~A7s*Y*g*hzn942P505S!~rJ5?Ajf8>q|PTsByj7Hoax$D)2 zL3WkD;*l9LA#NuU9s-XUb|tyMSaOKRQ)9?Sa$K at NAgGKvigI*@k+k4U*NBug2Qwtr z+g>|63kr1)@^QFnnzc(&Th)C(CbrAUiG%L41PDM(R!qy|iBHADHd3(;E9Bvvh|HT@ zRUEVSUR8!GZK&{qLZwSy=yy+jjV_~Tpr;(0(jIEwjNVk)cdCA&2gfQcb at 64hb|Zu7 z#QMnyXwhG9LZ&5dX69hY+HYvPcECd3nK0kU%XIf&+@JFNqgPL!DeDCS7$Lmc_jK|9p6IA>6YgkS$_GtM>>5QGs z74qbF7`He6r~0Pn- at DXZ-w2ksDlz(ofOzF|RazV5NP9Hi5WTx;&?Sf{1n*l^fvb*7 zKz;n&O)=a+Kg7Nd0~9Tv(ARB0dAc}Anr4 at 3`xNMSe1E&k%bwH$&#bQ=Ns4qt4JLqJ z6cq!fT_5W)Q!LqN(=L)|&^8hF^KLS=f_(mv at 4^bsLVEZbtv- at CTnOLPw=x&-e&a8c zAsf-R_{DfGCfu7=&4<=tkNHWSStfe@^w|OV;rrL>xYxl4w^u&DtlX!Yz~MuNQ>w>_ zGX0_(rEB?HvICLs8 at 5g!L_zZ)d&zjKa478cHC7DlfB$3rT}$$&AT z`&PIuFU7Zd-yapI3I%JlsaEEzj!~<7E1Z!Oo1%@HSADV}eS!oeKf7ztL{T0w-|3rs zvM|&sOoKQ=>ku^yub3*{Av)2zhQY7p>@JY&YSXYe7e=yyYws`IB`pj;Vis+}F~=se z_FKfs3LTTvr}8Xk+)(#5NH2=+r#KP|#n(E-JoMApC_}CfWTZz!(PPRGSZKpBi^88; zcKf_*WcEpb5)W at apExLZ#2*04HAr{0u}2vwSWpkXiL<+?@Tz2jHjm7t%@v>%AUU%g z1~70j-ZdVjxxWeMe%WT;-uVPrC-G#C^;{SX(A%?E`cLD6FqR8`QmaAAD3(}p<^A~i zi_w%+^IQHj?m}c*UKJ_bDsDAa`!|ICpXhQw|0U*LdyXYE@^`|&fq{U~|34>O!pz>x z*~s>P2blh^Ea{V9|0_#uvN)YKjq^j3l~XX$z9VX8S9n|EQmZDZBJA~Bnbe^cP0~9X z=Nl}z=u`-+0io`TDyJY9oQ0xHr at J}29K>0gdcWSgA?u^zTDtxd|+DOHWj>Q;URASsP+o#HA5_!|$!EVmK75#F?bPtm_ z;N2H^%^kJ5iw0guH40VYUJE(*{G<|qqGh at Scf=g;?3R%-VJ!#Ad3T!5Y!N)28l?jt zx+B$k=$$Jj*WR79$_;sVef>TKqJ4)HowV*Tan>zr)DN5*!6HmJrxQRKtU6!YANNYZ z$0le9ggOz}>Q at YhMUjvqqWHrclmD=`$zczh at Gf}6Yb11_c4GXn at dWa_!uCa8Vpsu_ z4u4qe8^czH_hI(xGXA#Z#`5Z8j0 z4#F)afl^r1=z#46ntrKfj_*&1MxC!;v0{ywsgz(lJ20zQ_ddmL2ym4F|DsYE=u90G z;6XqVe*C*d_}@A4e|nDDxT-E?ps=0t3)84Q!h{}=9P_ at ChoEGThO*4w6-}r)&9`yQt#^Qe7$hF z+L$0sVyr(H&UU%vdOQEP at O!k`df#SY0MQKT#n^#rHwc3=^<*RjJ{MHKnyt_ch|r%? z{T^7+0pTE^66AWs*pYZ{fD;%!o+ at JIB_Hs|L2SQP$p|1H*k|Tt`iAB-6HB4TNs1Lf zKVW3E#4vz at bD6eVe$7t~olCvrSPcS(oxIy#kAn)YFn%2aH;rl7^E*BMc*9fw2@*6I1Rne?sH$Uq68Qg;v-6$C~a*)wUv&e zPd#}Cw1o9(&4(H8txmt*tRXQDl2v+cN_lN(i<{QZVzjPcKe-0{g6A=0_7C?_V_ zlGW+j1DlXdQz;itB)HUYRw#;$^%(*HoVzZvbI}!Ote2pOkj7Vh6(dHBu3?gp5m9%3 z(SocXJ2uR?)?e&q$>tPOHB1ORL%(@&1?3Z*aIHH<)SC}H;GxE9S!Qwvu%hVAO1Ls2&G17XLr at Dm z#lspXe1N~gdo)FI{oZ&~FNcAmWSU~7V}=3OM6q&~;%;xSYhX{gyxm4_n) zYesQpKhmL|8 at D}-y1BQH7E?MvyCW|y6ilnDiydc>Z{6)RHKI5yFW$uspw_UpP?yUt zI7{qMcq+4o`3(lp1>t%FA^J`P;e6e at s4mh;J9>qa=AS3Y&%FK2s`PGHikSfai z{bEir at s{!sdx)M&7k|{zG`c&`Vc|x4KSDL|+>1g6q%y~`x|D1%j0m-7_M8}2+j!K| z;-sk{hxLa2Q*K7rb23<4 zl(&4~jG+2A9zl0x3cYdjGP`$&1yzO8C_dCqhw}xz=q*ZOKvN!`0ywA{tEP~c% zH<3^QLk7Ih=pJLo1{tPR0-GIaQ`57-dhI-B#VB$8VZ0o78nknacj!4L+Wz>Pi&KOg z$#Y+NE6cSumga9v>HenC7&h`tKPXh^j`}IB=JqCsxhS((2t?kOF)r{A)S76 zY)|ekk(_1rVbt3;sSs1ChtPlO}907KV z4jH%elnZ9Av#h07R^2gc_Au`u4C*6A9Ciy&T3xf0RZ}#NO&rz_tE*jj=8)oc)x7?8 z5*1TOfK~3z36^^EIWz@#*D|=z;R6l4DF$RCESi?sTJKW#Y}h>h zZbzJpmG(%Nwj%s2Ivwh+K6!gWSQkqMaWAfc at Ha3!r?^Wrhv`pw$5t`G_4^v6m`@ie zoQyol)8 at qYG#5Vz4}KB;@7Z;aNWy0l-^#kd>TTo(wp+m*2}1o4(hyCCsn90}w&{Zl zmp*AX>_kS=x?VxK>K<3)i*^_xR%QkpWMOom8LSz@%{620VD3PxcP}9zky%aXEEt|n z>*IbOE2=5+#4m7T=u7A$uojhD413Q_1xsn>z2$ zQU5#_5HkNfnidsq03iXO^VKSOwZ0HhgO=D}0~E=~nD2KTqC0Q_|3}^jo_dv`W0DI3T+MWJP-4wE%jPQV3h6 z0fFTYF*mVh2mvnB(8?K^UG~k~FqXm`@A_)KZhV&$$t6(E6Sb{8yd!EUf*Hb&OrUKg zlvjhQ3ZGderon2w1I0;dT*nIV8%h&jU~3^nV#)ssRD}C z9 at 2B(bFAKbjH)(9Le_w;pkJI at vro_H@LC|WKcUt`M;p{J-MeOb#i|+gcgy$Hxm#1x z^}=A1m8}dk9Z8Pt&>RoaEUo(24N^^&MwESXsB=`53V4 at NQ;9(_ ztqYJe at 4rAdiyk$YjD?kBPjv+R2>)!c!g))|SQlkt z%Jk=y6?nz>+9v8~1gH{UvNugUhl^lKmGH-C)6K{y9&jvTmsTAQu^~)(+_7&mmt|}i zKdht4?(CJ14jqtLG7dBiCrtaLe8GFy*- zs0b;gdnZuqb)|ocIde3 at CXcshQEy&Jbd24pj%wvR6xP+N>s)iTqqbKhGYeB63nC>mqkq{h zmL8iN^lPG~YEx;dt4M4_i*GVCOGXE_&F-yB_CRt_Q4LM*Cf>T`-WqghvGMQFGA&m1 zLVF0b{-M}WZ|M2$IOMNOH8oOK=+~~B9VT$^E6zC3z)R?%pJHL3R*^SfmT6LVdLEDk)!;b) z4gF;6e=+t>;hlcV)@YKBZQD-Awr$(_#dgvi+qP|69ox2T`}AICecwL&e{t4+p7)}z zYt}nz)R#Gl|d0m2Y_PM`>mJ}{$^KO^fT9h?{o!EPpfunUWZE)&@4t#Fe9i!ul5)3;%g_Od8?22u*xK8- z_)byqLshRM{Qe6Vy at -@>fhDP7AUs32d&3snD^+qZDGz1)q_u8%R3zTMG(x))Tjs#` zZM%JCN^3t!8lj;s^x#)Rd6n2cB`zhTf^kI{DayKelA%l;38B8?EQ~U%{TKfxbwe9uC=HNc-GO&1OLK4K67ipiSK=N4fLA$enRh2aJl z at p8(xPAL<&>>(fSUCs{IzOu7`%XV~JrSQo}!MehowP`-XV z2t}4L_e$=oW?9}F+gs&ldnKKe=}{k*%-iv|kNHykmKm7vx)r=GeMwal8$+khTlxdN z25Y;@JyPqL-8NrDFz)A3{(wY at dB(C%J|0=}4R;X%$8J%nX^tVy(i{%T;;>r%^+fvv zp7}wckNTBbqn~TFxl9OTa+pXqnYVsWxzSA z9o<0kaUBjS4dn)Dqme5N&eGOU7S@~Y&OZdL$g`A-T at WCk7V!VY^@@U_v&Fx~Lls^5 zc>`2msgB7>xfMjzn*h6xTSdj&06OVd5mL<|ViSxFmqQmC*ULGVQ2yTSy(ocI(}n=pP*r^w!Vn{ z{h0Vrh`I$-2GynOa7||GtO;d>Y}OI*^Cs;Te0FVQ at 3DuV1J9A^MQt`Aid(*6w6n$i zdN>q5Fo~=!+53{F at hCNG$yO{HgBDn-2{u~EmzLFr+H}CmgCv(4+=@-nigZn~$^{%- z^mZD-+K9CUut4rW5^3Q;fCzsuSPZy`q_rq&rza0?;M4pnD>G3iSYL$5cx`sbWA~Nk zYL6 at Zvu#%S1tcV}snWf3++pj~FgpSjCZ5UFo6wcRJU5%+qjn7I^~~Qg z;xFI&byPe(#&x8MQd-2Xk2|VxO{nKsK1uc-FtCKu`5{y`I>=7t7)U02VhBae6F&f4 zBo9%0Tq2QiPuU;DS;nh&i1pIum~T+Gs7kJ{sBzN=h>UVfaA5}^qoUN_F>`1egyW4l zkr^gIC9eXlN5ZL)qOz{}@mZyD at H12!`OJJGe}>cl*lZ9%h__3!Wh0OJ`aP5d(4Jwb z^Rm~GOyE6C5PU^7W5l at e zM6xNwvDxLHnFNTb-&hb_N{0-bW zp49d8l!R)nP at tvRK56RbUwQ$IsYNMYFx|8(*y%A*J(em!|UtnDYFpivvq+9%Q==(sPv z7|=o8T11g`-ZXZtH;OlR98^QRMMTC}8bvaG0R2jIXeK*@i8FCC>t0Q>V`6^4Uw)OeJ>c#@QmHxl!z5O2=81eHR;GY#AA zs;t-n_IM{+p7S5X>sM<~)*FLgv zA|W%(Hu#vLI at T1OMma{CNdu@{oB}RrJeI22TPryl~&drvsr#$yKtuS;w!^8#_&CPH+pJb z#(`6t(57)M>^cT7)dWs{0*Kc3|dp*1 at 7W3aQzdZ zR)5+cY3C2DufHe{LTxx0i-j=V9QqZqu*=Xrk~FFM$TH#OKK^JHzZ%#$DcuGIc<+#K zy!>f<;yLEQvhP1aK`s^K2 at wJaNEi(Wi2Q#M3jgLZ>g!H8>R8`Zbb!mpVz{AJ2YNc$ z#icj~Vn7(qYAXjZRB`M0jrw zOM+k>K7qphfFGz>z>cB!I#YMtv9q2Hz?1FtI_381v+a9)a{2wW8w1q5r;c4Mt|uxe zj3NW4Kir6E#$xSXw96sam>;Ss*r4t312<|tp5rqZQwPlyZkdn)lSi;D)KCugo?6cG zq_>Q1Bf_qESNo+o{C&W?Cm7-ekI`Elc3b&2H#|heTmNtAP|$4CzM8K{pJ56XMl{~s zX$UsCsSQsVYMSL=wzHOLnqi!@N;RLwQXF2`c%0d($Yao&yaF+h%5JPUe5A9LCM(Z9 z?#Hn=H0uAw$D;U)(WYwgLvm z&Y~dkBvqzjdaZ+hS~h3YIJ)=4v$F3*}gf!lTh>y%hm+B|DD zeizzBxNNs?7hK{6yWoapz+|>9Rhh{KY=1LP4lY=^fDk_=6y`xlHCE7Qf~$Z6+7a$I z5z047NYV&KR{iJ!;LAuytSro+p-*xH4Fq~>0j8^)N)t05 at oWc0k_9@n3R$GDdgn+& zi;BeI(KOp4(vq}F at s;?vq{t$9Jb at WJp}qkAOYsK4cquemXD#1nv9C~|9ZHPJKx0*l06fkJRDIrP4p177WR!Xn$mb^()P1{r0xcISkT^aZ;>ZkqTdUY#DOGVE1OA`{@xdZ&ZTGh9`# z%2Sc5R~TRAu~a{3k*P9+mJeWzuSUEbY%q?x3h=Zf*)NslKx4PNY95GMJlgL56squt zd#7nOpG+@!%2aJG^&Du%o4%nPCg<=WLXRX1e#rKa_dM6+vovfmr2CeeX9jn%9+K_! z!{K09!B=z88b-JYjV1^;gi)gQE!(0c5wMn8rdM at a57r)TSwh!AImyJEIbWYrjk$1jwXt%a90|};wjn# z;7#vns!3>oyYPe at t9It@i*^?7BkCJ50^yW2ga0(DUDV^i}77) zhs$@%R at B$#M^c$j@$CGH|Dit96~MlfIJ!=!kf1ZlYnnLuz_&cX?b-)zsWd&E`if#4 z&8~(-x09^3&nL&y=|8ZAmScI&cAav}jqRBZSq0GObI3mJRIwJ#)zK2jUig%x0&bc?k=7V} zrC_jtRlq}zbuzT88ezRbmrC!&6m(#<6bq#Rmm>sC{ON+ z at MR+Dm~u3+%@A5LCH%^ZA={c}EQH(>s?Bl6_rq3{{TO{#aD*%nfn*3Rx67|sxGekL zf^S^cDJnQ~Vdm5+529-h49-V~@pyb{ZjpI+!Mu<`dp6vrm9Ex}-Mp`=1Re2QQ@|TI zOqveAvaWRB)mzPSu`a7ZD`L+&*ON`5$sL033bF~aWKbh?u&ly>QF+-&Bl1bLmO}$$ zu@>{X3mQG-rmc5RpOb>a+(MRjg(5h6dFIZ_;!luzZukmw9beAUI2<6;D9v5H(u$Kf zt5RmiFuFvOJEnGoz;uv@{uA%1O67Ah*0Cg#f`r#DzG6CINv18Tp3gYZHtrEC#i2;z z)&&-nOGHN&_*eT_4tWp3Ii&F+9QHtaNJH&P^Y0}Ucdneu*NL?ouv6=ArtqJaG~1$w z9p_XC;~Ow3W!?xqp8Bt+x%ACF;8n-CYj65VKoUOw^at$V=Qsde{&B;}Rd)Nyy!+NC zc~$;3GXI{uDfLxuU+MFnin8KMKY1fo>V}4c%_q|>pRldXCMIY8t0tm61|74LHig4m z`$G(R<<~8mp+^*u#>Smq5vVy2ixLko4V&$ks&8WSuh&wdiyAars=> z9=W*C4m|aSU7+Wy^m^O7x{Nnmsk}9xmgksh;~%?p>zq~yTU$?2GNLvjyY6}-x_rhv zx5TD at _srk%x4uzu-O#h`=yw8tPe$JmJWV~nWcA2z at bw~jhZej at h`Do zs at wm*2S3^&>>jh|ScO0s-AXWG;G9rx5HXT;%%%1yr1o%A{cCUvND|c5IJl@(NAKdt zaaY5JW`v=UK7Um8LI5o_fBa+DjLFlx_cSaJkPk5s5ZQmussGk-G@#sdRMEcd%$S(d zI?0J_(%EbP@!%5Vk_olRY+`ebK|=9H4T)+9*_1 at r+R!ChwcH>+z2Dw&U#k?S at T{oyqlUpc&$5 z=snO27$Yq5kCp3T6GXiWm>o7-I|L&zc>8NFLHC{V9K+jIsArm{|f;_(=K3^CS at To;OeUS&`Z<+aC`S8CsV)X6b?TPUF3WD5Wdk&`e zWgcnxeJ3yN{9ov at 4dCU$Z&7`R`?v3J5I#K8kF$5%%s<_uO?|RUzDJlkdvh>6Ug8ND zARJKjZujK{aRd18$0~e3g2-NJDqh*MJ)*pR9dGeN*MWW?RDIv=yYPQq4*vr6M>6g} z*R~ut$rnqU1Vo{SN z+N_y;{sz{GH$*t9yHO_IbTu&Y8~t1rf|x~l4G<_vnIuwB$9u{e^4Kb{2ph>>K1&p( zl9|)~>)0ZGc(=hu&fj^A_Ds{cZKgKgDR|MnHM~dq~J)-Phcf9y&RwH0b|JwJ??Roz}VREp}}G|j_bv;Ebig##3FFz_UMxNpS~d(r5GP@#%NT`wo*_h4%)vISB&H&5+{N;#iMw5$_jF? zQ*j4sHA(Rp%6(pj3`slY>}b_x!wJKTzly!r6b=iU6(!9?WnELh226(?jp=}1X-0nD zm?;2ao!XC`r@&6*QQ;IWG$hdXTa6MQvT}5{5EqvTaj{t%qPBew9<1FdiAKGKZebs_ zHJ_y>F34-Yz%p@?cB>zJo_!u*_2AA?oVJE-97t_7-Qy9l)G*@mZprH&+I5} z=z61^E0JAmVeD at v-uO7n$XlHN*CJjJT*d at x(jJAiQl<)J}6U&f6TwsK1^kY>ChwV2qt zG#?0fNM+>Z5+PzDGuLcrG~MT}f at fl!j6mSnU2Ll7$`c1?h2L0gI53790W_FC%~X2u zE+lIT*l9$~yDXYd>1f`m3baruxi}#U*wv`UHa=Bn+Jf6)IR$UT-*%F=5YtFn;uv-H zGa7S)#nXE5N;gxG+=w++6GEA^z7gfcO1GmN3t0hLf0C-9>0+Sttyf1J8 at Jth-eK+Kvn7U>)&V-s&~#|APr6v8B~)v1)Ng~uL}@W(y{9L`Eq1qX_9Vdi zA?FjQH)o*yS7~`YbOCDgKWzCac*b?T;OZAwg=n}-Vx+91Dn5qRPW>!BFVdm&Ow&#z z{d<3lg(;#RsWS6%R+>{SmXErLhDp|hJtZE?3*h}6Vi}##bK#e_b08Vjj9r)IXZdQG>A+#f_MrTcaRgqQu0vo3b2 zk)*m<{TTGhUZ at daZngdZWO~pOq=w{dCJznqeH7&(G!Ce9fOkD^jz8FfYhK11PU$n< zL4dyCaPX7x0=o>M9eX)KZ^J84XT~#0&jLH}FQ0x=kOjG11Ac$E;Irqvp9{4JV|0!4 z0m`S^zyv-hH%5`vNtdO=oEAfE9KlL2?-oUKTwpk}B)?v{my*-HXzlPll}q1n%U$3X zx$^59&q_F{(ND&?oabQY69a8UcS(iAZ{J4)bp*>@apAB zHlWB0M~d32{9$bwsV<+OM^Ocd@;g`600W4_V2IH!{P^L?7EBI!g&;u-X9>G8t(=DD zMTcFYGdS-2hxPmyA!l37cFUNysXI>d*W8kzW@!Pxu}B7;Sjkfo5VA_ekI@| z1*)IX&}S-=`B#Xy)ayas(_6fDyq8%@cAU_s at 1!5@&|vQA7Y|s8yPC8^PLR7E`5s}Q zzpxlPg=UXcp at ea$)Pq$+4FXX$BMXp%1V5T*4}ZSkhZ7}X4z41{XTj at mhe>Y)pIfvG zM1-8)NO15pkGVI^11Gpea~jx|Y{92D(9 at gg>ol@Cd5xC!r*!e`u# z5ihA%ij-*tVb4+ at LThf|wh1-s6eR-qh)KNQPHz>@JPIq7AAI0_a)f)P^7O?Yl0OIv z7Gul at 73=IP-9EC!(i}EE=y%+=XgQW-`s=u8q8a}%%5kKBi{tY9$kz{N9GQWa?jLC0K}Aw$Ea z9)g6;`LdfY8 zz8^9EpyO?;@;g;?PTen7ZZ1~ko9)9p-iR~kkZ{&l>d*H!nO5Y?L^ow%*YX^z zB!%G=TD)eE-dpoxuP>D9NPai1p`3G*j|vCbW-fo~oyIc}o(yF?q=W5C>&VqN%zf(W zYH6t_V^j6eObgY1qNEVnTo)9Ko$I`B|FVLkgfQXG-?{EcgL`C5F)37i-FwvK6(&@0 zs|`}$gu0JSFYUT26crKhI>!pS$DmE;VV(%KwP4mQF!diZf{7*P at 9EOp-sNw5RBv|^ zQ4&iY+l6P=47T;N)=kE)gd%A at bO>H#lc>kbx^bKWcF3~O*u5=n)>MF!yJN at YB4$R!L=* zAh_lmI?T79J+hzoGaFvtx3|B6ZlJLlNgY(hK$i1c>34mwh`b4daTL8NcS*1mHxhG4 zDD!CXZAVIf!^FfCl#11nqWEJE(m8bX5l&8GU^w2tYPM$`r8}^f0AO!9b&t*TlxZWh zVNZotOHC_+6&Kx;ZLNakFl6^lxijom3ap|NV4)&1%Jb1n6a1Yl~*_|X; zojm2|v$}(B5%ljQmRCFhf)zZiQx6)u$@P^ctfDn$_hMDmseh6a2g5B@)h~i2qdPiMWliN0iYm3h zY&Bt|!>4L#y7+chT!KgHLxT;y*rzV5%K6J`sJ0gae5c~duUo(@FS7&5u9?pPC+CELi$jK%?8 at Jot&B^gfn=bb_JIjnk>JU1n+crQa zjH27#bXeG`(Jo3UQct(ZNs|e2B^%mciHD#`m2#?pm6b{uAu|ovaVe2hJeKYzF(z7I znEZ;Rnn{GbiialSU_BVk at wCTA)*{I(ZlNklv$oLXyFUZMeo7|K>TKR~n3R}TGQgQ$ zzW|LvnU1Mf*w6 at -RB#QX+&Z0JY{(SZ4iBQ)Xga3FgsnxUid>u6eHSlL_PcDBD2?xK z8UrDJX8)%`%$^)Bx!8WKz_ClYegX5vWm+l6l>eQth4JczLncEr+T!Li*YR?=>^*n; zg}*aBRpVor&Gm?9EU)YIgIEenQcv+&#MN_%4)U!B0!6#%iutOce>Wt`gCg5+q*(=L zcK at suQ33$T)P=2eUYu5d+0*QV)x*FESE^wJru)T8p+({;Gz(%MlU{yDt5wh^Jh?qk zfypj$V5Zxha$q%Ce?{oWX#p&k-4z(33Bqo!u~XoJ#Y0>Y)fUt$UCQD{=>DGFJwJ3TlGbUPC3kd;H+T>f3pqu?c7`0oJ+3V zK&}Vy*KXJw*2givoQ*yTx0|ei!jzmAfY^dKw)~jN1}#34$)DYm4fw)RBw4^e!^e~Ul(Ig zrU>Tf-$eSo3L(Gq(1EXK at NCAje?NB;h72(yAi;e`-Uz%Ce=;JP#~x)W`x8!bqI##p zJn+Xv=&i=gsjdY60 at eo5yvq9>qPgCpaK^t>AA5}@V2($A2MwTDdn|z4QxN_px$80 ztP76hpY2R0F1V;ze~}&!{(pn?f<|_(rvHufYF2jZDu0o_x;n##%y}~_sA at evv8uyf zw?i=9bq0y6S+6;IJ at X*e)A3@&wfPp|1#T5_EP|QSII0BJ8)j5859c6SW1_|3dii z{3Z|NEdpUntwq&$VqqSA4MT~^^Exxt^}cz^>wW z59H- at I^ji|;I3Dp!)8bEv<1{IMoqSKxlhv90wHdSyoA^CHV59lL2vVvFwIJ=K zx%7PIi*Y-6jn>iFPLfVTOq>DEC96mCs_4Ua;u8ehDN1;-(@@!;WEDmmhewgKOXsi@ zBUyb|j)9=hi8Y-Ymak*09pzn1qA32bRi%k;z$AfYsugCA8PnLZqKhT at u!YFTuVt>M zF*fsADw~4ll(yT*!EH7$@(2 at w5(}T-oDz!G+5-%03KWBznH`MyRZhg}6?s}`W!<9d zDvv`l+KXo!naFV14dq>n>ojvea4PF{{~~31Aq+S14*_!cgq%mK4JMYj z?AdH2k0Q?ug-{c>?qBMZ!&h18!k#E_nq`X?>CriyvdDuYl4$MHg{SF9oA7t}vusu$ z at zlX3B90}X%HWz8Q#(MVQ9$j4vCij zf$f}MiV^{A{GudLO|UAsh8(C^zhR|P4LQ2IC`C8qY4S|kqSku0C5bPuv1XQ7EYQwO zXNM`+10pdYUN4&|ikiwcoIGJmPS;H+eDDWq^-WT at o{V9=PMi#D8aiU8jEP4YokCsp ziuEIxRN`z1pGM+5{IZ#y_N9o94L}(7ASGKN9gbyu!(S}f1gW>*DXESR zB!L8<5Tm)6_8)kH_wnbrNr^O!Zy_EcArQM=5QjFDw}Ua|2<4B#2y`z{PbWola*w4s zPQA|7)3hdw*$IO#y_>_bdZ`F at D=}y!-P`^0YQGSGeMXma3Nu^3Hc4Uje9%EZKV}6- z+LZYGWpb*_c`K$kv1mXqctX at Ih96&4J-d(YH*;C>>)A)1oPJkX)f_ZP`dBLwte?C0 zM at +F?4(K$a){X9-d?1e)#$NIiXWjz{POISOL|onR($06wKhOXl&0uR_IuH4^wPCt_ zlplORk}p$l-q#CD8PQpI(QaL1vT~Ki!~KYT1i=1<^05~r62XwEnCAF>s?%Y+VS7G> z`})Ljkk2DI!0CoLW|*cEPcxxeoH<9xpFNk(TSO&GX(S0R&=-c3zkY$0bMNlOB#sPt z$Upm=?!HIaAVDCpELoEjZ1wSx&haIMS>KB`b9< zO+y_EG}u`C4Nr8o#T;tKVzm!VjhQmU&N3#Ro)XH*)3Jl?@Sl?!tc%kI!VPEPZx;L;yN_M0R!WK3y{}bLfsH8F#DDd{Pvn)Io3o zbCIK at A}Gbl^Zi$JWQkkA4Q)V2o0eoYMqV^AMUYl^G3ApA#$uo`VCcd?bUtFk5$31K zaoNpTc%_oIE`1f3x=qb9#N83kE&^NlNIFyLybA?;%|J}*y7pxQx;ow!&VehTs*+ at r zH2yRTnKFrrJQzl}d^+rUML$z^kKCJAkj%-EgP at Sr6z0^E>2#*%_SM&9k!H~3dSNpVn;GT3uu56 at zl4}orzzBAt0};@?17ikn!UE;d zGKax}yWo(}Is>QKSSr#FP^?7n%O{yrX!U+Z<&)Er9sPNaT%lOnse0a*)B_; zcE2U-kP9;94l<-USk;?^<&Q1wo^VabqPbY0 at CbG$O-9MX&i}G<|Cqbc5S|x_mHTfBYF6oX|T^4-dmYDLlQkzpdMDm>xjMzVJNVad(zio>v zdhJweZGf$DJS`2 at K{OniK{E1gIl83MV7#Ku@>snICZ8>1ecj?vuQ$ZG+AW9Yzb8D` z3bky0Su3qKaGZu5h_ at 3Idpz*v>qdk=dY|&@PPh8 at cC`%a^JjIt$%xn at -Dx}{g!1+# zcdXnYj>$YDH*a}`CZ~}#`Vy=xK;0sLB~-pd>^-rI9umOr)ma&*D=@oSn|6?+M^QE{((Y~+Ds9QC9*WVh?*7Zh2*ECykf1Lv?r0vu at _w1PDJ9j z7mCw*7>t|m!0}t_iSo#cboq~qTHhc@>k4+O1`tMtpYa~t4ut*4^-5_-b5*d-N_Ba4 zRQ2gvX$TTQE<}H5jf3~9pYt+_Gp(T)o!_UE7-S2Kq@*Zbzdwg8AJ?H%T^@-Oj>CLbUeH5S(I}wpJCLNQ z%OoVwW{;iFgqiBRaEaE7oeOXU!W?2xT*=jh<_ at G=sIhb?^~Y zY|8V5SGpTv%^A8@)D=3d#}LPfq>gP8JWI$M%X at p&snIDv{>!;(qBrT3ltEg~Rp>Jl z@}_7h0xa9Z5xr=jSnaUNn|ah!?lo;!4y>5wMcUJ;&nMKBis+`%<~g6)Rue=EY2P|Itn0CV)(w_6YK1?Vc-w at + z4|?TNKpTdHrVt0 at 7FtOxH*g2yNZ=l*Ejt>VP?#5l63SLz!*1KF!$`AC_R6ngCY0I7 z4vLffM^px8V>sTB)cKYC=9~j?q0hwB76(QvmBSt>!g4J)qng?!rL~;>6%}KIU9Lrs zHKd!{wV(Xb4Ybqp3Z$c&M3Hdo>)aMksuL}Pw94m;66&~QTkT-jRL?^yny}!P&o%$t zuAs`zoY&0%1=?uc71?|Iw`GxUEkLod?DqTVIoqTx%lK_}ib2iH1IQ%*{I?lyt|BrM zdLO(iD#YopmVyZ3(3NT74%XPq{c{sVd2|xZjiJlDIt(BB^1b}#;a`3+zd!j2PrN|% z at 8$8Gf&3F at p;ufHn(;nWYcKIDW0MR~Sh91ESsM(ui_I(dLU~km(^2_?={^cBie}6$re1RHW$1G9XfN6Ma{k<2MO6ZxHXUzs< z&Cs6^$ZcROw}-n$sJ_A(|rO z=;))BY)pmr_F_0Xv5f^$d;kW1k+{NG6Q?${LFX|Vmws-=+QBY1Smw|Kmun*Q%0)Y0 z1gDoTgt*03E`viGZt?g*ajVH6x__!T+%rp~{lGv#MiRjoJQ z%GmTMNLwZ7>DC2W=~pHg*8uzxu8=&*E2_Z9*Q`G>-0Uasw`K9B8Mk&Ena-b(DX3#K zCZo;7mX)K5OPZBdKK(fPOf#^TgU7_4W+rQ*)&IG$H^msR&dP~LU#t}2%ZeAa7aD^q znyi%I;4%RNcvYQ2y2f0ZQ}&%g8GPh8%`i-oeJWD$sG*d(jqD>xFCQ7`ZiI at mRlQm} zSIIA7HZ at a z=WxUKV5n>=$FjC`yJ)pj_^pSxUGlDY at Gflh<_knRVqX~G*YyEZ%fR0+G%JH{-^`iv zPZd6X=kR>JKD;F^`7lmzNbsi{!_eq6`J0WS+^xdUk8M-(wDG#d8WG;19VTvHx!B1g zT&?2Jzat<_*iW9RmK$iTKfwQI6r{-=8dLwJ7YTpq1<8Mkg8y?_^S8P*MfGKqY><>8 zLKmbA0zsEhmI}|Oq*`PFqYXs&LMivpaJFf&b?v_ at 2J76}-2TlEG at Rz!i^YJK#mMY&eVlomd7tgH_4&TN{RLzXzdaP&3!x}di)q|IicJ at 6>P;ye zlLsmsOocwqbTv2wM-v=SYs$gsoR2JwiH1ePq-MI2aw`BrIxq|;+~nA9v|dg}luVaO zbC#K}t|BL$U9Sg$TQAcv6yol;8({eQ(FcBRi8CxxRGLaU1Ng2Ekef9e}0TF)* zb`mSjp0cee_KOoLFSAVm%IiKoPfkS&Y%v|l3%UKyEbb3#_`!xYET=Sf)72!#q>|?> z3x*5pq~R#b%4xfn^ITha0+OXouCGG1!-iA#N#1&g>g0_=I)ktS*W!SrIU`en|LJ3V?*j+4_8tHW$TC)#ei;fJUKU53Sp3lmS z)cbp*c%TZZP`6CFZHRBZ-(`3LT6fo)EXu+QJb!QOn5$r*^|P=H1qYsYfV3po^}}3A zLX|zWNl9EQu|hR;G>dsHlV~~HR8OVCzNs+g5^L)4s6E{0X{@Ka4IN z(#k{DZ00p!EXwP&Jq2%Pvi~LVrvM#4b!wi3XvW*$K^NTd88T5gte-rB44;wNB|R+IR-q$RA_ z#waqFzfDtObxtb1psJJ&rg_w#ff~e|Jj1m+z_b2jm`$I9N5<%CJ(8 zkQCfUWN%C+Se!{m2rmb89)V)v3J64b2`7#{K?kG!S{j^Jz?WW4%mMA(g=sPjtRK&7 z)=hrTEAsL2ZGFdA__BU)#n+crroMH$`Ok~&j)O-M_s#8J0r%GXnU|D~xKKqUt at OFz zO7cFY{W?FW&ZNM-$$nt=AHw~YF}Q`MKcyOt*_NG2aS;R+0=|Ug?H at gZ4M7ACVpW!d zh`I9%4==?Nzo5XJ?h)h9kB=H*y?e#1Tr0sfuXh zhaLu_Cwva!Fm7`f){$cRUEuu%ZG$m%czK3wwbREpM&{Ju(> zech{#JUzFzcRmLFSum$;qYih^@HOx at Xc^<+0*-#66(NhQ^YxMx>Iqi&Mo-HbezF~L zk^JY%*?sCEtLA9)?DlPU7vq!c{1!>Z9yHO;v^~I&LGFbTDTg$RLE8s6=PfgiD?sxb zKb%@jyTh`@V=0aeYekRvl3TM89(v_7TV1lJTR&Iap={?lr}LaN;cTKk*=OrgV0#Tw zVSe|Id}rNBU{)g4h7cY`Xs3je2#p)}vWw^YocxOCuwDs~R(zssTj%;;*`I<>AuDbT z{E=7R{}`>N8j?4B{7X1Q{^Mx12*AnM(bU;g#LmVLVEf;rvM7S6yz{o}Mfrq;`7glX zqv#+w`ha;*ZI*O!6zTMrA?LJ2q7LRs*XE_1LzFP`x2qVYEr5DaQrq|WzDzo{O zulM)uE6wj?cQq0Cbub<(V&n695Le7Qw6el7CX+6uh`zE at r@q>SSgA}>MeTu-PCVp> zxfx&tZJy+2dC6g&5&V8zl9{;e*>)7 at 9D_o%q at SpMx99a31Aju>qgz!>gC89VVm9^7 zzBcHS=C#_S)S{7p^xN;S(tG5*6RG3%6c^CPR2jFiWSMDLj79H}hXGWVNg9x|Ks)MA zq_bwCH=I_Pb->t`V4tz9x{1830J=~eaVm89)nN~GgX7da(e=uiLQwi`}bV6p23rDVN6WOHLChgq?~wEMR4p&G;4QXiMRLsAm57+ z%o7F&l=oBo4-A33hoT3H1}oU$a*?o~D4R0=5&H at vLTUSggzaimJCpA>SjiME*Vg at c zZtM6SLXD&r$qRUjrYcSy>IONGCUrkiH60N|+v%f0TLmFoIfphtaNp2tWhQL)m^AWy zUGnw&v$j9E@;X)sO;T!O6SzW1XN1ht30 zY4cx+Iq#Wm2VAFt==k;1WbYSEOMLH{%->(n%iBQoyCI-_{aPTywfMt|-r2oBtOssH z{lWE_?qk!$CB1`cR(~Pm*fJ>_6;DJ?OzeYFuNd(LrBO`qLnP5l< ztCeDki6+4;EW&1Ct0qaS8OoI<%dEy9x7sNRc#D>u#G7W+{}wt4N~mZUq|(}CFFOfm zB_qs%M at ZL1LCj(u3v_o^oINDdUQe7<1t=G#kwl0|DlL;L8ydSYS=vyk0;j=aHU!&J zp{>_e(A0}gM6(Zh)Ljl@!{H3fyK{E3m_yBDtj8BIfg%0O((@+1lmJtmqXEsektQcm zx)77uV7e-;CqG9=Sz^ol4e1Bd8edHAY%RYp12h^{twHT6*;FwGZ>qV1`1Ai^?VX}? zYn*i7=#6b>#kOtRPF8H2E6GaU*tTsuE4FRhcCz- at XLt7*{lDlvcAs-Q at 8%d!J at u=q zS+l0gf at 61A)Rwjn({+)4H2?LbAj$+DTet?@`6gHKLyxb6lDPyZ>y?qSS>d=9Uhp;7 zCT*vYQ`5{i%va9=>~t~W9Otj$6KWD!Q8Bg>rf5Rc;5!U8cnQKJ2)3yF(Rr$TCOg!( zZRUYW_tT}k^xZRAqrBa%saRSUgTBLcPb{6kBJ#8Pl~{Mkawr>iSTyKV=V-xVRIIHr zt|t>lY`>hewtYp2c~(w>O4cxWacO~8V`ioB-Z`=Lnt9}?A14U`&F(*-e*2`S)5 at pj z|ZeWQ|)9yT3*4l!`M%jU-ygg2rz4++Wg%inZYLuzxf3 z_qK$2+(m~Scv3>Dieb14653H33?es>)G(WvPy#JTat=bm9PYBil=U#3veRLX9e=0m zrbX=eps=QyEnuZ-28Oi%*fk!dl at qGTOoHRWy6mw{F+0H at c@51K6=Cb{3r4(lGLx8 at _jqG|f5eJ2CKtbg!F}2# zQ^z^=h!K424%Pm!O;is3c(^oW at i-iLog&K>KEv|SJ- zc9(LnK#&yID_qQ-ETd45%w{m=hs-l909z7FGkji*U at S_J*}kgZ-HknC3?=moZ&)h-*#3&13S9(Q@;k)zXr8UR2$v% zrY4tmF8j{0=0Fr{#JQ6DX!mf8ZON8DL$#Eei2kUsSdVR4H?JM~#_w>Y{M6eEz6L;R z*Y5dT=t_cJTD)sWV3FY{;O>;Nl}bA8E^AA4kB=OeGwg?f!R`$X2zn`8Uc)l;m8qH>s|-_G{K*M{=vzqSk>$ zr7nU9k@#&$Ifh(%c|CevlJ`fZ59+m#Xg3yh#&%xhgWAc+;=0 at AB**1?`|IIl#Q{X| zc2*pvb%N^W))3 at 1*Q%@IOrIa9$Il=k1Qk0H&_Aq9`GPFw=v2ApmL$KtuUiKkv&Q}N zbV{)dpp!bi(Z^izX#=a@>~A=pwSICd*QW?84#Ak*tk*&e2KK5Ki)z3`Y8CdWNYjjR~_CekyCJ) zCtFu_xq)$*Hy44BrV|*+i=GOWxOa?;7DC at o`acmwA;H?&VR}J^WF5 zE1r4y;fy&yEI5`eHM3F`C+RYFVmb=1nI}EPy4gHtEAD45u62T>*2Efy-#M^6%iu!e z;#dz9_k2uc`O}Xz**@wQvg~usvCrWz!j`cU{~^N|E2~Gl8CY7?J!L(kRNTrlHf*Lh zb-bNjpkHXGOo8%({ww;zZ8OhduBB}wOXUF1SupNz!jV>02whL2k=%Jw2{!lUn0R%IZ(97brt)N%dPXYnUf&{6cn{TRv^edHiw&3B=>nv8E>6h%c z>GZ1`LBUuMIb-GDz;FoEv_+;6C}z2lJ0(%{SYyvBVqiLU&LGpotOjz;VaX>|ODe&N z at vKV={btn|zoI9+&K$G6@?)_HEB0G~2 at d%Pb$b7g1!r4QUx!1w%KZm=RZ|-n7x?fX zy0y*PwjiU9`pdWG;&wogWqNAMBNlc_!p%LeZz>)|tL*UjGUCt_yOy$bHgSeqOL^9F zSJTi%L^Js&JI2s#x<|yO-U%7>+n)L2FGlImNwcsVFR!yVH5XP7{hpaw^-^Qt_5$C> zkx5PXL?V9W!~I|JauI5?eesd!_NKEg{;`L;a`|)M%vQo}vX+}dNqdlkCO=S at IM}s6 zAWOgI6_9IO6;Lw-XA2C31A}or6ID)9FIG$KIgv4}if9;%EYk8|QLl~Be2{HCdBI|s zHB(Qbq42P|&sx-?<-%yCN+~{9eo2>zqQ&Luw;p;fCU<_Wc`Wj_*@&4Ls2DkCdiVu8 z{J<}Gp=EYYm5A-e*p(bn8h*`Icnlp$^ElKJQ<=6f7tw-!?6x^bKmV>Jv|rj)2gSZu zrtiSd?D<|pn^g+Wnwry||M2EYubMh-f$dNQ3h(zc%$usZz`8semz!>h%V3onM4ctW z at rlp};itpCgz2l|m)D%#1H-vy_ECxTAv_#8`S$TdRJ_)S3-Ge1pe*0q zApPzjIy6LA9FaszXPc4z()^Xzl~rQmsFp;#e#l`I6Opv!BRU7Xrn1Vd1(ZjWgvx!D zx%e&5-tv&?yv;XhW!Qn*YFzR9u}qo0|7bt$Fn*9 z`{h|P3pZOM=l_hd|HrtQ|HG^G9Tu3-`L8MIL1m0W>Ji4NX5D9-M8lveq%CPwiV(@3 ziOD>B<>im5os{+q?)t(1K$9VdLHUCS!a8NQgyjdK6Yl$5X1UBX`+a?l{A1VNrzvqG z);It?+QJwhP7Rh*VOSUgR-P>2^AIdA3?a3A0C=^t|m1^4Pn4^RV2V>5v5p9f!+F>bzoRZpC~rfls)7SpU{%tH`9~0E<2#137*V(kY at OV_^;Y~ zQC6+3hXDaO#sUFh`@h!SzbjAk;urc7j=y8yzdffMeVkDSK8uQwK)ptk)}=38f at _!Uz!M;-i z>_*;mXJaqQt8$1G3Gn^8~hYS1l4Si|Y=@(cr4>Mukje zNEU02RXezIjgpT+)H?pWa&sp|`+0#QU%`r9jz&)@##IXL zv|$*4JgLU^@)V!P0%0ZiAbE6)0X9}&>JpmA)Lwa)-EkDD`5YO0&;|DZ2Q2S{*Tk~j z0_tg5~*0Dnu at 5-v%Tzm52OX}U%6>(;Y*qb`HtGho0HD3_zYqOWJ66e}@ zi~E#2`BTDIhFBj8houSOMx^y)w0IC>rd)zt!G_f8$SSd}v;WCIhtsvnJ&WFl;|{Y^g`cW`x)3qCL3Com((#5<^7=0E-tC%v-aD$1W} zcT`%NMrXxS8uwnR)NQJ}jdL`Xvs6Z>6xJmoxN5{VSmkKFFmRNi^%qvdj$YYi%toTw zr&u>sgLeKr9vP$8xF)k_q=bqXfaS54aFf85++Kjq?j48iszBoANOG} zaxGt3z1j4J*b#WN(JcU%iup=EYz3lRlsFKE&S(N at xf6L*u zIcdF~c3E|yyz6+p2({9rKdm!hQwfEIG{h+^Ir)^8q=<^Ad}*Uz?i3VBh`}zI$gUUF zm`lHe#}z-Raq)tpGcXtf+`OK{**p|HgxFYX+xZ_%^^*Daa#2eQ-l!$Nt)v=*`gwFV zTlRVC4RMN#+i%-o9Gg>}R`~+dO7AvKa0*P{4~yc7FoL(>h;7SW%wIbmx(6n6!VlRY1l%1H zrZbQynzPzt1c{9;_ue^b3}?23I|=dXP#krPC7pEof9y5|i-N1z+H9{vy7E4le4-pW z>}Wt04I32!Te7G325&5h<)IF&QU4L+3vDt=#Q at srX92addkgzMlp zCr`E&)T%!IeSj(kKf`AC>D}%-Uz?C9`*I3Pl at NkP@6Lxg(FO7IxE547HP$Q*{2Ni5 z7mBqbZXYh%#)O>fV%q8LnSGyzNUB_zb#?e59WM9-=u0xp<~iJEgx#xoNN;sc_|>PT zco;zpzq!|pfuNC at vDh>5Mgsp-$nMlbne)_M|MMn797s0<2Nb@)M*veT#RTN+D>sN;_WQt#H-zdq7mK@&0Qwm z#q-Fs<0OVPqwYtWZtC4Z6J_H at Ap_J^SzQ8>85O_eNOXfq(L*=O!&T3lyUdC at v7*n= z8Q-XYKpZ-TUPRLih% zVaiM+iX;@{ize=CCcP=IsU*`ssh0BsE3VN4B^SJxpt-l)%OY)|!JKbuzY7^|JdO)} zZQhqt*^_d~j_5Q;ty7NS1kA?f$jA8wj&g9v`JbpC_8j(GPTNaAKF6bvt&wFaG5_jpEV4V*5)FY#RG zBb9I;3kr{1=={its|r@?t9VXx>0RnDcg*2p)VQ@|Ly8M8ecF;{lTN~^bPN?JwneG9 z5C4SPbKg%j;{iRN!ZKLud5h1b=n>N83A>H^*Ana}j(;S)wMBh)f5vx}( z#Y<{>gjg4~B5eKb%_Da5dBWx$wq7FyA}|CCIH{M=X>FusYvoeY;qbdKH1n7OJ;vSz zSU-}eeI|VPq;KECf}g3s58_;Zvsd_}`1ogQ at 8WkK@<}*>n%G+0VbXO?C1c$|GThzh zOAZZ8>b)ql-jyM1+8I%-O8xbTZz0T=4DsxD;v4Tx$$W39eKrHOzv}XG^8s&Em$($T ziLbX8_fZ(u55C9kDNoJ5kxw+=im!K?7`^Iq;h&eqzQ;%P=U_OK%!@_-qPE9jYak7k7 zs@*Zzy~NL^g-si~`Qh0wa=dfk^5eOTMhmd~;$G(KF?aIt+pYEV70*c1Xe89DxTMEw z+xP6n-`v7*JOCRR;x^x39~z(3WGwmUgcxXF`#A^>ftIJLMp9kI-zU!kue|?_VL0%37X#`M0gGPAor1|E;DeubN`7lOG z?{MB;t0HEG=3-_>?f|~ZL#g|xg9lE0(H8sIgQ>i2kF-vFktbrl>@l at _7f!z5JLq at x z7&CCst!A&h1%LHXcF^vE!)_v91H*_SUgN`vB45M9u*5#q24}=R^#&QmK2-*5)joBE zD?Pd`sZP^7iWo1fWLvQo&{7O&%+OsY(;{20ll7-xIA(IW1k-Vf=W`PFGCJ68+Q=8` z8BG;wln9k)+4ok-6Bv&>O;?aFm`8a{U5#x^KbmtT0X3OLX$)`F1*S6F7%tM{RdX~9cT zX0nYHUc&>3BdBikk5pSH at h`x#anaz0AS?FmF4Mn=r&YEsVHuUNcw8d3O6{n?u zVH;D*Z9Gb}i=t?A(k``{I){F6MDVEd)OKv1vcjcWiuUp6mz)*-&Sy2N)p|DPGxz9Q ziB10W06=jrs3GTerLac$YnQ)92YnUr8}pD}G?!0G_Vn*vn#`g!xAFpZ9QNvP0 zV*Dw-iFUtmJ&UwK&oZMfdPjgoXI(SZ=&P}Lk-n+;FL#kurZ_qsxVf7;!lbvSO6kO>{H=tvshSFDom| z7>=Vk-l4u8uq$rwuNBeLj<|B`x+MBt$HNVSA*Am at D?2Ss&m zXwwy0ZjlK5DjB##QW_N$SiMvZd?Bvf7e}}WsoD3y^^a``iuca`&cZjd=N_p#Wo+Q^ zs=#g#{Yu`>`-lAu`sERR4d$X>+HcY$FdkrF(BkS<&2Q-F`O%QljJ3}!|&a+Dm~A#e{uQ-Fv1xu8$Ux*7T-C-ZT*Uqo?w zt*UgDLsxPi at Z2<`AwU6d#qx6d2_8#|(r=j^yS)p?fWE_7R^s|Tty3#SC!ygFwzBt(JUME6D^2I`Yv`5W8-U{JH9*{KFA?09qxXcA;7L6zS z&LWzRbvCN5Nto^pm$mwcY%`dL74BAPG0;fzZn_uIb(c1+mR2d)O5%eTA7d|PHvC5` zgY)qRd&j3sU5W`>rapDWN;oGE{RanMIrjN%yo;NKA(rsS)212Z&dve9c*nJYBsV+jSKOaa8Be_Dd~k;mUamI< z1^I#yG@%hYs)us*OYd+ZdQU8~$z1GSCmDLBdppo{V7!q4_ywi!sYmE6BeG=2mDD+= z4!Rt|mI!U(P75#%`=GR<&Y`(B at 3(ttsH#oa48qFgi^w;amJtYHL6j(Q&Mwz at fen?M{GS`NnA$kxobp zutxn-0iiqSI#b=d)9+T3SjOc~>1MUu*y7w1cP at +{DuX;9K4dnILr at T={nh5a> zg0L0p-$)Gpg}Fn&-Txd@`go6XTE zR7T<mBNWjlD at 7>2;Nb6e zCbXr+**^8Ix1kbrLA??2YG>s;V&BzV%{vr6T<5udlw7#zTV#Z2xe(^a;xrb&ISw#I zV|BdxSqTJg4e{d;Qn8f5ly;8glkekqK0VD`J7UKYBeH-4VIokE9~mcj19#)dpdPo! z9DAN`VFA2N`W9Z%;Q^gKosOv_FV{I&*95g1%G?Wo9<@HXE;t?hmBo-8vMrs! z3p5MjV=wX7q9uAfPDUT*jC?Mp2Q(ri2v at mTYEMyMoLqI&CouZ7o1-efA9R{83{Gx_ z#eF~jWya&Is^LQn4gymDPtxZ5Zxgn#v5Tv-k%_Ckk)w!_i<#+vByTe2|Lhv7>#HsZ zq4Vpm1A&Vg!b(ag)axlS)W%;_1p(smm}=PDqFOd-Y=OQ^x0~UvdgVE%oAFLq zFQ)e$JAtSaWPEYAal&gV(Q5izRGBs1qTyg%AV6dB#`CufvnBYPQll-Fa#r}7_P28Nk!JO&;#;ewJsb5I zN4L<<@}S=IS^2GOQ!S}hNGGyCldz(m!#W4>;Su)tfZCq%D>JvH9~12n#pS~h)))J{ zOh9n~cn at 8YJ&XA*_|C?9q%GXzu-+t_O?tepY5CNA+H5N_n=*6yKW!ZfActtW^EM^t z-W>E8(iSNbrZ%N*I1^~fc4w3L+}#atB_s0D3ZA>z0{+OLVoefkg{!XuV?x9uM~yQ( z((C|vSfFg6zPsACrN!qf!id`B=GP z5~t7gYCVKvxrZqsxqW#^;KkX%ldEYs!uQCYjFz#~-IqC#q!xD#NY(! ze9r*y1VQcf)2lu}hZp0#B_Z)n!YJY|kcne~A4y-qEgn54jLpi<5X*Ct)%&q%ZNU?Z zhE@%aqI$<_=nzx^7H6`PV{0$aSHzRI&y17rL}~ZLa@@UL6bZdQ)>N=zrEVaLA`vd3 z2ROw9MKVq|hJLKA`ZWELp!-0%C*%<^ZprwFdCt0dI1Z3xWCrDk50)3?gBoy*4-Iv) z{n)HY*kLkmi@|Fmsm7|4OCXPiuYa3r#lA&=iVBT?_{hY*tJV+pO_9(Rv-~3?B{8Jf zaz`ahG(y&}=RUa`lJ>8ydbxvS*1LZ~PaOsXgy(-4djB4H8g~D7O4^^nYpu>!1{S@! z1(n%^6EqXJ+=4Bp3V{HjgI7dvojrA|(BRrQakQ~Z1 zdnP#mRTqZ!lHcc=d&cY9t3C72-?syt0I(jMVeI3h18|H3s+gZ(aQAolL9s>eCIE5_ z7(Lma(nFM5gu?i=umbAwgBCP3d2~~n>J9p;O3HOLKYtSwZ)SEKT{{6+8%Vo8;C0rV z+FDKVdS?89s>uWb!CW zQ!ZwWH#X7V$Xl<%_DP7NuW;N;%+p at zN{RXDaoqPoOtl?nkZUAcoaUN7CjmfN#z2N8 z-#wg?A2ciQxhpFhEp@&OMSp{iw2b48LYA$pHud<@A=gvj)<{)9lbzM)4{S$?wPK?w)`%Ik!NJZimhJpK6U$$=NdP}=JT-t zoY>}1m$E{gP0x6wb1d!y8Z`I=sx6V1z&5OB(z(1z1!S=}*9}M9w~J2&)_#n|p%K5B|DB;-V&sB_p(3ohm$tw0CVLr;WPvtmp=COZil=IiXLCM7;y-_=& zK4Hb$;c<5b6GWBG at PL0uGBG@R6;^j-uD2C>jTOOPf zd*?XQ*ZKYrd7>PrjynqEd`8?So-v0ww%~>GBz*J$jSSrRq0?UxeAwF*R?)UaGnV$p z#9H>x#6ag*l(%R#6uAXf1z at j!m#89roMe1oXHyPu(HwEDUdAA at XNX37>9POFtg0A} zKX;H7VXvAG(-H#(0%&|v8kllI04u>H_JGSEZ9 at A!C8~!rYb^7p4d;0H?oau5G2Nt` z>>ul+Z5k+vH#-ArH>n-PS(nG35=6)HD zI=Mf1#5vaSUL4c=0_!3$GQ=VVXwe-e+xITO0JTmlcFLYmA{}FblIZkSS at ysgdC})n z at bJ#~UyY;{A?n@{0tBSvA0tuzpBc%&K9F`bb2f5yaQ at GwcU4_=bp6m^Jt=!wfJ~-< zt=b?NRiI8arkGU`JGl at XJ*Mx|@i8(3!pr`YeCZc~e*^2+CDcV!HZz~j$VgeC>X&@X z1sN!+$VC`M;=`&%Zuhc)&yCCdVXfp2IQFm(Z_Hly4-!w#Feg1|;*b}Sv|jOMM``w( zP)B^LCB0>)a8E0|nnieCDFmAmCNB%H-Gv+9-<~wk+4VI6uaZmIUf(O45)@0mRg24-nL_Su2ASbzU+RmE}69Bf|pni#m%Jl(Xc(7J*f?Fbq ziWOBbDW43Rqn<>l3|5$8=VbzRVhqKMoQri^nuWjSYD%Z8kgCx*-)(LRm*i at Ozd$vK zS5thuM*^)NE%W1KP2jQLM{(1>xM&}D z>0!owK`}nx6B{FBGAIG_pc|Q^!GI)>z%V7Qz>*Uh5LktX#!W!!s3J*ZFz!Gkm5VKS{qh1r? z_&eZyIYzM?;oNO$HYIhtOPQ*Ca(cpA`4$t-k&ilk({C!qbd1MqD7nPsgbssq8&lXt zJEQfOZy*uYw!WQ=M&0Dl`M~`;q5p1V9 at g?>6Brtb=sTn at k;JG45rm{p%cCyu=o>L( z0;ieB^2_3zL^lO)F%$;T)xCn|U~Q&gd5lvl39sHjkXS4rT}Q6HM0< zgNpPv?n0nz{2AG2m$vBubnega4+|c8C&2{YqCi%Jgq2k|^?LTEi_0Y)vOD^wkJF!6 zt0I}bShJso{Wm^!;23380#(1m*o4L0e|QqjA^`5VUn-lEg4#mA#V`u>cO at Yvpv%21 z;W{!xSDeb=>Fb5meG%6xWf82iXL;Ffn3bi1s1LzzVR1m#%lNPETPD;qsT2m zYna?qn9;qjYbV)I3W|2c)C^>vt`FEg4*CTX7Wx>0^9wH4Hdh^t@}H`YcmueQGr7D; z_eejsem=3v^(xx_I+p$tLH)x*>`xlK^G10BGye*{@Y=X9P^2 zySKdK%bizf*K!MT&&Pp~SHx_ygA%}+NsOWShszByG{e~ZfBN8zk=7h%atEp_voxtA z&r|2?*e7YTC}E^gjL7pQL^n`w at M$H=>@NRttX?L?SdZc1Xn``;ZsHIMsx?;xoc6=woH>0x8hwh{X=a`?}d*18jdJA~4+}yvBR&?5p3^j^ojFl5wd! z1Ut%Sa>j2TiEETx=i-H-P{7Ecv65+~=5Ay8ExahL)P^QQd5c%$44(UC!b5+?S4FKW zJ=MTjMnm7S-DSjF%P)z?G|nv1Y~w at VOxCXdgtrB8uqIO@;`I4T4$_`CCW;FpH5Fjb zH)Bgr7L;gy>lOXchU8IehWx`MXp8{ggHFEkrcz z^GG!6 at R!7;WQMV4;tIs0XGbXfOUkwhs>7aL&6;Wo{v)~x?^EDP`?-brH;hCMF~jW_ z&Lk8i(-f%O19sxp*bnw&Ld`E*h8=JMj8}wkQS2`E93#2iP!q(&9%K%c0{v1%WFH@|>StBQ|GD6vl#kAr3jl_x_A6=#j+O z>pRI=LsX>J#xiYLU>|J^gauSxXmiPs1+-6vkuL|j{mveKP%9nFUR|^^!vsl zf2FlXY?|crKi=T}t1*m2Bn5B&!#&*yARw~;e;LDnUg%NT&_LIR!V8XuhG0Sbfe`%(m1xn&9Fm<&egqchyH>GhkuTLSONaOefY z1ki;j$4VN}9XO>uV-9!*DZbs}wDKPfoFKe{p%Q7l#_jo6f|-IEvOqY`LyD?;>#rvz z092I|S?7nDL at f=*tP`}EOo75L*P|lVT-kFjV^uX4>fF*3Sv7M-70$zQ3a5Z6d_wZ5 zcXjRL#sun4m}9duZ1`kig29N`}=b_VfN%MfG%f& zWd!#)6GkOuZ(`^*IdC_)$67qk^4^xXl>`rNK0+oXr70(Vk$g<)wb2CL`Kw7&OrhLa zVOcIBPB?3sZ7ofy*w=s}mscG+N at HJT_R5}I7f+o1jE1Tz@$})S9jCGa)e}>3q=Qx_ zZ_9=jQ at GoB9B6tDT(MZMPmC3+fDbvTpPCUCO3CLC7tn=w5g;VJRw_ujU; zVm(43nsol*+O?p21O1IjsX at _Ft59a#25|pnWKK zSPtIu0Cu&Qcx1BHaO%gmVzh2bU-N=_$Z#4+4ObMHO`Nmv)nY|O at fF{8F1f7&&JWZ` zIvfoK0a1~bBfMbCVpLLLr-Rxk7gErk6a`p*i%<$h2x7I&0caIq&LnK7U>st;0VgE( zcYQ(zgV at 7>G!ocV^gFNx63F&`1u|?E%7Wi}=gf`cv*#`V99(^kid2jHlp}+g+OBR} z*CzyE>5{9 at AM^7SSx;r8E`GkH$fU8+H(%GhT!C4_uUMp_`;I4nF?m)!0sJ;>h^Mjb zG(*SGmz08c{~7`HYMiNST?FjLbK)LbtSU##tZsHnB>uDbNhw{cwW1SG>hRA9v)imrK&oy5H-D^tT>X zw!+9iJy49TvW!`|2F#t(FRvhkLBjTFepa`|;STEgY!!DSHmnuw2TQe%$FoQnpLrK> zeB)UgrdnRK#ZPIg60)8=x%pD*s9mr|=CnLS%|RA;iHU=AG^)-Or_gB5X8KwJ+s2WLP9j+ERhiai`gTcdO~ z__{4w+$Le=cA?ZE!ML?d?AjWe*Ljs+Xn$FBM;U4#W)WBFj8y6`L27taV1<|37UgP8 zGzDKfD-*c at k7Q+SwEF#W^IJv$DR9tFT>X<>{f_h0cxNB>1F`$kXY;3El9eY2IJ+S(@*-gGqm4 at oVMAy zyEW{kP9et%4Xw(7T^3(*ow0!($X}3+-{1do!Aw+Y+2RZi1jLL01cd8+p$Kd~OxsjpQx(r;H+w0Vo|NzFz at w)Cl~_Z2i_ zDZR+9$gOj0SvAA17=naf=Tl_hl02k0ZTf0mp_;)2Z;Xe54K8>Er at O@5LZzekb90N_ zqLtlaxVopqVB%c<+|Bp0QEodyn%{nK-TfTtnZsHB)b=&m*T8H$Ph?pqC6)TwY)CG`!46;;BbYrSUDRg{8brKr_!Z+z9uX zMMO60{rco9`ec#vN_uWK2OJc-d!eg z<4vGoT)myn;|BX at rzON^(Vrq-%;lKT*!kxJYYR-V(V)*}qY-iLWStxgKeMRqMSDtr z7l2c_c3G)xxL ze2dYrUF~`if&GC{7+BG#+DA2u|u5+ zrm+$`O}!oBg-lxtvv at AI8g3JsIyq+ZR-{gfm4d!3Gkl0li9FI@?(;#njz1 z>(c1s@}*r_M_no^IQr*K*o8OFpR*TT7ZCiLl^gWt{bM<2&7vI(@nrDB4Ybwd>3WIP zi%ldNM_8iH(2rw-SJ(-jZR|k0kzrMy3nzEZN*XB-#+2a%wmsO(1`W%WVgKV1A)P)4 z0LA!k7X+Ic*_P?!c!6BtqfQoNY3b6+3S1KbTwCGtS$~FBL#2P5i>OJVs;gvgyNP+I z>2lmqRlY&WCQA7l^Js~(PN$QYEf52Xywma_h1 at O@t~?b%(o$i<*$W$!pD`5b0G07C z$wgL7_k0|I)BYTK4y_{GB#yU%t_O{OY&Oky=u4#*P*t5yqA_A& zu5cHL<~wX8y^dQ*s=)x`CWO)yw4DWuY8~SQ+{Z{ zQ{v}6vRCo`&1)#Ey!Crk#K~<}FAnMKfhB9v;#DqY7`h8VuQ^{e%&r#}2Rng(z z)4pbf2~&RF9Cwdn296JK&B!cJ at -i`s$-p?-%A#aSgly`D052zN#6@TW4Uc at uoA>-XQl|Rv>B1vU=Uqm-57%%NIYOx628!t4EmjT;dQ9tEg8NU#rl)^d1J+Oji2v-)fRNI at z= zhk`(rVO0rA%?dq8t!Rd~6%2v)jOwv9-HRLgr)Gh~l_9PP)nY)yXrT3G;I3WIs)~hE z2&s%444<-%vqlj}>J^W{%rpJwV5eFE8%Lx&LI#?X#)el5=|q&uPSiXYtBfD3%)=zI z^DGrpA<>>MD at PXsYX`y6%+u;KipPqw*ao%N at Q4H2of-grTCXR3hV^QonIo at LTN5wt2LF!O_Re(wQ zj8o>#3`b6?&)xu6er7(4fS{WFq%jV|Pn>BOjNdl+n|#Zyw+vrw;$T9#Sz7z=hoDq} zeoE#4-bj{xtG|Ap{1!?dOVji+{odEn1|xZ;OmnLDzrir=?ti8^ab zV^=pHG$3m1CN#gd!a9=~{o;eV0eR!_v4B$btj&eFKeQJNVRT|bO!dT;O=2V;S11az z?$G90$AuZs at BIelvay$FE1_;e!bt8biIe1Rgupvi173oMwg1onKA(C~F_ at zVs{TT* zMH}J_+eaByta%G6jDa?$7W~!`$5{t7szmimFyo#?GD}6&3nb8vU9c1o-!=Mv(h&(x zj5wr+?x?VNzgC+UJIx>tmn36ka<_F)jL-+ik=onH19XpV3pDvHo4}EjGZ)10FYbT3 ztb`k=$Ah?uRPV?4-Gy_mtmSXFwy-+aYbFB at E`L=9YttZ3dw4OjG zw{B*oc_k+L$&8^Rw42QAHGEXkiD5!J&n-#Y#%KIm@#~7(17^~)L+bH at F4`SGlJ at 0Z1iD>utci5}~ri$2`(W2Xk>5s=kf!gm#)yDH*Ucz6DGv$AY_HPC*7eH%4 zJF3Z at u@SZ~qQAI~w)wVK;44A>g9Xb^G2TQElT9YHCTi~a3{nMKlTF>~fmwkk*3{vl zFZ(9jdkby2j{V|1jtxB_-<{1=v4KqO>kmm0Hd<_ecE2oyt)u0^IxK-!dX%rSO}%I} z!$O-o=~&53&LgUN?Zyw~hCiowWwQIUg-SS_w&=d&FqwHL8Hxw2(_cJ9gBNd|MrZ;P zm_N{X#XwG&_X5y74aMdWY#Z=o2k2fRTr{^{z5b;K6C4ySc at G8xvJ3b>{_4!Z&HmqO zh3KR$#RVno;oR%OEg1r$2qJWGAtyYMH>NpLAu-g^1OPm#>|umGFAlkWr9RZ~-$CA+ zu00Vnm|?iW)^FwEmn;r_0@=rc($X8R>4)#_m#nLm8;2cGIumtqSO5k~gm%Uht!I at n zXe2B=Ko)hrv}DT+wWtBYYs#7Km#7GfVVSg)UAw#vPK_4g##PJ3Brnqihxjm!{XmmV ziN)OwQ`&uObxiP?%zzyp{fgb%WS-TA+o{<`)gGR%{mPvz*;H!#uZAJt_(&BCtDZA9 z&djNw=^|$ojedz`e9LF+MUxp*6jttoHHbv4h`g16&wOF^;Ml2YClJO)PW=Unnmga4 zK|Xeb4Og9EgRfvunGjJH=L^cN0 at _Ga^Jkb9>&A?w`m({)5{s7fnJ)PeC%=VOy-;7b z`iE*G31O2~n~g3?)A+lsiW_YO+5Tu>;uNy51d-|v{o1}3`fX8lSIhW`QEoXycLnf( zKlcpqr!KMiCYM=ny7nLJeom+eG!k!2MZ~|Wg3EtpB?OrvG-|~&&F|pQhzHZHl(BSx zwLCGjffn+ct=(xydUahLfts0w*A&3R!1BW=h>i8-{Vbp=1Bo5Sd# zML~1 at emc>|z`Y7!}SX2id%~p_+w!u%sQJ zTR-|@plKx2 at M+`^=)FA??Im$?5;L&!F$|SqzfN!WX^yO`wCL}bL=0g(3Lx!+5t2SK zu<-j-jXg0R&Itme!e?b;N1vq=(M=27{gjT#o%Kjxp0tjf`ors-$t!&C{}*ZR6f8`$ zWs5F+%eHOXwr$(CZQHhOe#^FP+s65KoYQ?{ciekBqEAFURAp5}J>(o?B4>{Lg*_SW z3+jmSDn7`19T0qe&lB$%efxqd9t+j- at lX5+UqYG8Q9t$^DmRL3KbMO?fdtD$$S^%G z1xcqOFb(zc6Zufevmp`9gs?$!7JFw86Dy#F`}!|k(*2mm2+*Ja0GhA>04)E%pi#20 z{b$tK&h|gI%Kc}FGDTHO4M`38CsdkI0v$Y%5Jj at 0{HRd0CM~tJIXvG2p(a8(UpMp! zJSYhxJHvmi>u)}t&s-U=^D^(-T&;@2ri$9<2Hx_rk7=lZxF{;`(Nu=h%lpgD?)%Hk z*XJ%C9U%5-5b;Z4_K=D+*<8%*n>`H#1e3&+q3pn^g!U*51e;bu9}O>gO}bdfrt*6q z at s{jAfRiZBe=vxEb9?Jc{8J`TE-?opE^Wk8x(UQdmX?e{Qb+M2__OeZShaQwC7!$l zqSJ6miUdy)wJ!Op9}VEGO*s6MBjTgoC-7FLR2-dlXpY>DOBpjx&0 zr5?dLu03(>#I`_RKg_~-oPy54!cdzf$}cuJx?ZdFfvnUUh&FdaSnY?RI%c2 zv##s3V|Fe)JZB at aT%$%WO3I+cfQG&;rQMS8Pi{f6C(PL-gR1tNsi0!V6 at k{ng#4Sa z%G;dak!7i)Dy>DrtI{f|u{Kg}L21Q(Hl>}ey>K3XY`<83Am|cu(~3DW7 zPY%b16<7RjJHist(B&f1gbhK#ik5Ap*QP>q3rT!J`02U3MrrIZ at maUzqE*viv8)(@ zAgNcuP-vpO3ZvDa5~Qb5=k%bfdyn?0-$N!Px?Nolk)k%;JGa0-kpmBh zt0CeuTw(H$Teo2(YLl^}y<;4uFmHL`b3-f`Bac6$UQZ zqLa?(c^4YZ+f8BgXOvi-(RvBQnVFQ%;2(m$Nl0zeZjHuhy}2pMArsUk8F>2SF>?4J zO-A&(xYDzGaw(U}trR-TDlt3wIjuesYl{?9&M3Hd^1MW5H-z z<(eWaKejl_>V5fzUDR*Es{&l}jz^8F966^=mwRuZ%!BLu;~upJW-fZZDJ0is-3-35 z z9fAR7#}Y8)ox>0$lGj7!Gl7uTH)Gj1PHIn1>qB23Ud$mQ(4oZ@;#^ie?kBX{{+$wh z4|XA2#OowKLKdOrb%dU0=q}Eam3av}9h_B*#@OvFAW6QL=hoT9I+K_|Wo6O`#%BRL}q=s%4StR_g$jS=pWSwkYH93nZP-SN{Vo}bRC!n%d~ ze*f-X^g>TB2LFl2*bx6a_wxUE6+1^~6XSmq+EA5pTNFk9G3HXW9wGu%lmt3XK;D#) z2SO&75E637kWL(dm;A_YG>}moq<=bNgv}lf(6My8HJBls+~u5xsBw&&NFon>B0DR>e8>9eNv8!e0o$h;GdllrBp~Kr${( zZjZ->A!GvU$2X at +5ugPF`u0m<@rJE7S(H3wm*rf<`s54iyaJIDG>{?FXvCb6ne57@ zb<2{zsVr|@e!CfR%8f$9%CAkV=yj?}5`FIOe2d9Vzg^L8F)Np;#hk!pxbmg-j`m5; zC?LK9;*J`MQbVj#f1e6xTNRJ|F%_-lBMiULBW!CX7LJSaYg)|CnsQE at y`ALCN(xVn zT&ilsZ(+{}Lt84-j51fd$8LWjD3xthDrs8&se at siD| zGDluT;0r6$);_izu^==i>}49Rthc3_D?!*+#gx{q$=-9-Sz{uDi1_if=UKb!kaF;s zgJ^h|RkCR6S!5^_7p^MsUPh2ENb%?t$rQ63wic*FC3IXJ87^xIp3OLQl~>VR23pxt zY$~dxT-tEUJT&wmkWv8R4TD3z0Tg~?$^wkV$`Ok+Q&Z7*$$mS6lES^ z7GBF(Gp;u2*Xa#pbU9bC*DGcg+>z|sq&b3{i+yFsyA at cXt{Nwxj(<{@@7U2u48Zjy z*u&k3vHKMe^rYe$NcX9C(&)oH5O&4g1MNt>!^)oCTF at H%CRAh?vM$SlA*3A(%@BJ> zl at R#A*|7{iYp43Tizez6)}+#4nh5p9?D;1yIGN1KztpD=xcMa0`$Ztq97G0Kv`kYtYY+1Q6-hu5{(8NoTX7cOnxnQl5B* zQB=Fx?9^xcl|(X*k&!yVhcFq+72)hOAp)1*14!f|sOmLN7Vu8tVL at NY3=)dS>;Sq-*^Gw<^xtW!*PvzYUalz?gY_tWxV#(hHpzk at e7Fad_B2$oF at x2yq){hVO8lvU6M zP7JrU;1Vso;WS*t4 at y3o1KFpx>F+ph_J9}jZ)o)>5tj^KLKUwNPCyz;oWqQf^b$sp zbQxwkBCk?m1jT&jxwd<0({EfvW!C5uw2rLy at lSv>%)J`?Cz!9u0ZM1yVV at Q8O?;sF zFF%X~oj+Ye4d}THdQxmCg(2r|ymVuo#0VHO6?@O)QWSG}5?k=AP~&1dKa=*F%D_JF zf|d0tAt7A at Q98F8W}=v-B<{Enn!ANfLhL-ID=0#pTYPMqdGv)#RJ_Qi)f!50t`$;a z)yzF}*c8e50(uWv&GG9Wjt88vS&lKbjj>x8!QGw2FAdBhvh^qn{+}CtRX;?@-oCtH z)yDI}D+s|I8zL`)Es^oI#a=dXW#|%|F9N%mH8f%BFo7)=nKX}ip>CPW_iH4kuaRC9 z=>33DD9R5rf(6Fcz{odtdjXNWBg`9jVvgIfLk!6zpBj#>$JkG7hqyx+$8JE6aiQE7 z*y1S4`OTVu?O`36viak|X?awZ!RuW_>>B&UHzn_r<~$>q?xXo#7iInYPriTm3c~zC z)Qf-s01$rw03`l9iAN(BM at JJ|XK at 23^Z)FX5VbI|HvT95a5iyt61TH9Hu;b4P^C%R ze{K6nDs at QAY;Bi^JXXNxp9BhmuM$p?zbH at 1ZXGCqVx1qt=una|jps4#*HfY9r+x$A zg>_r zWDZm!Z2c`>oJjSat7YMAC0Q~(7j9hGF|E{(Z#IASMN(nqoLyEi=bC0V`mL>z0kOGL z+SwAjv|!6LWn+uOpxk9D4Vx-hG3?8W5#ih?7Ku*B%%CQgUAg!XUA;q_8#ZQLaq z6XgU!dsX(_1&vYdX6RztfRVu+BO-^|vieK?a1{LakT$h`>h7r!wp`QN(dP53Cg_t^ z(|xZHHm%?jk9DwKJN*%5HNuacv%om?lu4Uqu*h%9P+dCso8)=g)cvN=yY-rau(4uE z!po{uEgHs>AgnXWpoX1w;2&z&Pxz5^ARE#q9U(IgevIP_%tW7TEi38B? zr!>G>^(Ad1?|j=rQSR=LEBEdDve0##2A}(_)tby? z+&S#ZR>3dGZx~EQxCjmr at 9RrpgsY3BnFKL2z1gemb%y6Pdoknt`}7}MX>yO}rz>4L zG)07ve(mpz4%L8hl91e4ps(9!4eGUv^iF}&W%8Mc*WG4$l_}ca99Y}?0TPP)YvlEg z5!#_5wGxw=%+e2|xl$q|0B-v(s==u`=+be>$Jmq85_)Gtcct5mv#DpOPV2n8(_hj) z3{N#_$-n6O=2_G`y)EOUC2y*)qFK7esH635OKKF!1uTAIG`erAk)AtB!L-Yg at kL!R z-U8>*;>KL=)ol^7>SgWSD$i};V>npLQMzkik$YK9XRC^unmkBbH|ev%pbpLkzF2`F z*XCyNB6!aMT(sdXWzj=0#ALz6>qbRK(|fwPK#<*#N)sSwviPXQ_A~~dq~T)-J1CF! z*Rh<(n%hs=@;04!xC!OFmwvnQdPy^xl+AdsTxxjYOPis at KgC_~`Sr5XvaWV&hh+`z9!$)a+DOGa8GLkTSNjj|zu764? zEIfse at Dol+;n+eG*hMFfq5n#!rqU(H5xK7UB(y>_#VWWwAYXB0<*?K(g2yJ{YYPai zFA(icFqXm>gCxg?SeCaQ+q)^s)e+ecp?edm3LYhXJSLoBq-Y3{6XjrUL7Y$6j4%GM zFX6N=2(sjmM%m1yv3js``Em*X#b$Ads+vR02p-Z@=pUxZVzymk*Xmc`X4#%Fvw5sO zonJfqVru3)P|`qkeulAB`iTBMB2PUK$a}PZ$H6xpIMF;X002J3{}2a^|Iu at 5^RJVG zd}(bOjolVgTa`l~kqJvFNNoUjKLo9?h!b1QEk)wfvaU_KrcB$KyjBzP3jO-(mJy15 z?bGkGet~(<{A2m}dEAf|MpQT0Nt3p`W^*62Pq!WuzrIf4_<+!Zas=sSF3$$DIA;!M zfb9-(fNu>2dD5BbLo9M!(U_+y2fZ*)V9?1e+slb!UYGY1V-b1fEz?+%S*YpHSbBAz zjQ7Ih3;uei`OQEjIBy9`MEXndrR$5UU~e8WLjDmFq}Vm0m&zpz^$R&=T!ua64W`^-w-^KBturzkmJlHD#MsD+hoJjH8{(DRHJyhX*`S=E>}hA zXRPZaKBxIabyIWSD|ZrFs~BVS-`C!}VLTji%SU58^q*gae!Hs at eb_{#e!b{c4To-%GfeI+a%#4 zwI!OR at 4o$$u~(j1k9<-I5x_+%d+2g8^D>!3(Dr*pAKiKxKtQ7$uLTc0TXmGDR7+Il zsdJi2GCAKU)zOB^qBqr3IKaLn*o6q!>Kx_2lw+FQ!zE-q zx8kmj2ZVgdl6g6xrPIkYOOkRj-V+renuVrSrd1jKwINt*&sO+xTQ7o>YbucVk_G}3 ztK?<0*mvb<*&<#kv6{|?*2uNlu{3fw0P#_9S)?}${8S2C7{Lvnr+a>`03-GZ`vHBR z;^`Re+GZ%T=Wct%tA68!J$Bp+>=hm>?{N0 z8$pZc%mmFVJUg=L_q}B71dZA79+K=Q!siu9 at Dh#r$rjzT%P{;Cj**MMO#sOeWnh>p z#^#6~5tO?=;^|N9Qp3dXn*sX!@!T`dBrgv;k@#{&0Igd0$;{}A+>A4F-iCN;KiGi*{!&^@Ri-M{F2KlI}r z1;L$VEQCrSXxJ=pFzsf)&$yWWwe$V~(*HBenvSk8XabCbt}>{OsD|P=-RH7pE{4qp zvxd$Fo+Uq6Lrj{~KArz5tHL-06#%`8K4l1hM=z(JqJ~kep{9J*2yc?N$y^ieAAIYi zw&BF0=cz)=^jvfZZ4;%-VQ)-x1pN{KC(BJ4Ew^x9t1>zpyhSk$_M at rrFqc3`?Cv_O z;c}JvXcVuR_vtO9{aln!P8>v-wEjt2yK+0GZw7~z0IYus>_^F^aw-I zD at 1bh*hmynz?HShb;;yqD=l2zQrU`or?%u8B#d4#C`wq)_DPBG5UE~LZm6MBQfms{ ziHGl~BA=@Og#xsSrozZRdfZ4( z;xIad{2}dp*d9TP&Ex>YfrO?{;*dt*CGRGUJ(58DKzdW4Z-|*1fw83~{Y~mQFNQ|x z$)<=?WE^L}UI`NlTl=+Jc=qiz2A!c=LQ*zy9TML~Nba$K1gIl8sB?1jD57EK%k!!H z9HDU1xc3N|QPL$~?V+Hwcw=q#iR>iuG*`4CaO(h_Il-`fDXVG0o+(=u2uNJv8BB8K z2Sg at uh&+uOFB@$<(b*1b3R5f8#EbvZD(li&TdNy^$1dcgG at US@kxjJT1k53)s7698 zD8enmWl3k-6ZB$=wmoa(e2?1c9%RcD2yL*03$p=|C`o3MkoBQ9w3>hq6+r_9YT<8_ zpYy$8O0sQ8(la;#V4!h?sev$5;tY!X%trjYI%kBJP)wpUM}}Pp^^I#IM=c6#ZBmuw z2tX5>Tzc4zD)u*Z?PQ2Q3JEw%wzzCb#}a*aV#^D?i|O?cKSOG_NbpKz^+(PbdC at eH z*07$I&Y(PY1HF{FvYch1Cs0|?=jrnA?!UtihSX%B>Yp5E9vT3E?|%Y65nE?RkN;d| z$x+i%+Ej)AiSI-sc+L(mAdKIu at 4YCKG4d_T#mi>ul}O-{0?VIDn at 5fpEi~uuL(7r+tRJ z6T&xeyhqa6GAsk at 0|-1H#F4T$X<>puaNg5tR=u4FeJH(fcgh2*(0reKl at T-alLwKe zY}yP{3AIIL>MYQIrWEzsd4)MrWl|C5vq6z#t^A@@RpFXsBWE6ZTGzCl%&nKFVR~;i z^OJHgrQ5VTYxyD95+#`@NA=^;RAIgiMe5MWZhm&0F?a=flXFMW29&}Ky)tDvMN))h zTyd0oM6ThCIVgrTE>8Bk))_jBqMC+AZq*=cA~)DTK-T&2GMA>tnA~-lP!O)m-<}*H z);y~!wFH|9dMsl5tKdOf;xbY}l5d@>c)OTjk|tHF3KSWQaz*iCmj<~!$_z4U`oJVZ z3aM7I+>l%>1vqJIQO?XMxvI6a>``-AV4=b+oK*@aHVH#@Hi9vYy`15#)~Ma8QKqy@ z07BDp-MiNDx7GeoDfFI||9xEf)p)#>WdWmW?WY3O0i5#lv#L|}on*D&SVv@@@q_W>S1pLvQle#5 z)@pcJsWfJpP?%G<23*B*(28b4lXetl))`Zq()Jn*)#1bQyyzAmHRhqaKmi;`j))R5 zh}lb+Dd0n#@flN)@foyN&-`ML#WJY)PXXGh1@%3H4;;)s=`#@wRa>85GWnlj0X2yM zlYpZ-cwb&Hw3;9&=6(?FcCIII^b(c{o4CtPFf7^LfZsoWp^s}qE^GUwSM_1j47Z-j zZdRvcQ%ewmf=FlKz?^559{JwP0d5k!3;10sN#n#$a0&TgkSS(&8D{jUUoZz+!4DLe zPu(K!WG<%dX`bM2 at Q5RGWYMb#;U0ekjg1kNVE!250;;9fBBU40Q=f3t{Q&dfK&y*? zhm1){m;DGE8$J9%93*wQrQdpmd($)YcYme at 4FysH_T7c3eY>A{tsJpWuI7&?fP at ei zL}VZcF)%=MAc%o50CgJZ9`wwxmho4c_lT?!J_Ok!l4a2Bha?m zs1=Rzju#)o9>VA4Plcbc{?mgG at iu3%ItI9vh9(-Ymt~jAnWcFh*qh(7sPyZ zNpx#p?lEoQ(^`0Kk6aE8)Y>WHYLB0JclxILWbSsxv4)Q&9V`&iR2?jk(p(+ZiD{LF zhiPclD7rQFX{2 at im@)X8MdTPOrsvCX?Vzn9f^+5DgDTo7io=4^r7!M>Le<&JM;nOX zFJnlxT5wA}XjU!2nm2Zg$+fY9sOPSzf7t|v^Z*6e@@$h(3K=zq~>jpizY1eM|ye6k7clxc7e z%M}kT)R`Nki32NLh?EvmVLe1=6Vf*Jj|Let^wbkiv_v+B7Ms+uF6Ahtk)CI at aG)s+ zlFgJb6;JeG)!75xug@?{4qmCKL&Gq2VZ|9CfhB56F7wc0 at 1{US%zXa@@{HSyF=?`v zIs)7(CrNw(sTDp0jdxT92j2!8f*3dgpKf|6P8KswG?u1!CG{kdC&91^A8ipDz)tCE z+}BY^ICgm{v7N?ep}4HJQWFCUefWs2MxZpMiXqt%R=$*Q9u0<4UfZ`0I0i8#_zKQ^ zkRCl_8>wUfV*VyaI|vqlHgh2LAR`Q at U^O$WAg99-pnUd~427-0C_{xl7#cqio*sza zDfhL{GLW#l^2fb}9))F`ZmqEm4@=y(-<9vXf#SVtDjbZeoFY!dgF at dypW8o_1SyX9 z=62u#`Y7j*#`4QU6%U1rAzha>AmCXy557;fwmK>#?5P8j^Q`B=W=8W;O59g%WJAS# zj at b?O(kRkN56w_u^#~e+)@g*NoJyyb at JkYOe-P)afH=$cN6A<*twt~VXBrFhrz8T3 zcPZtP9N-VZf0~_WBTh1 at Vvn-D0`L~ zse6Z+Ydj1;TZcRk0edKjA>T39O?uR?R4nK$q at zZw$QJ|Sq(j at EVsvz}>9&CG6OJ?Wv%DcmGheBQ%RZg at u@VQ57Dd4?~RFEmH zy5;u$CI1$#BEwczFIG{yIi?M4Q^M|DDtiXzD!c!c6gzu7cnFvLe###(NFl;jp%5=a ziKU3nuN-6PFZbqgtH2H$agN?mJ(ul-5`(@lMQ2jC<@$RuaXQEsCHfIP0FjckMRmso zkp7-O;o~j7kEPt3z*qV(`c7J!VU(L+j$qS|gK8$*PO!5~ML5 at LJ~1|?yNSif>yO-$ z73RWG2!(V^xjWSsK1sIc<4QA;)Zkd7jXHGPFyolwD`*Ezq-q+?ys_G>!9m8ciZiyyh*b4uRk>9LyIEPMMb*4xSdC^D1L}s at U+z zMCp^YBagoC at Hf2d_Rb8&m;c!J{*LHIa@~GvsOTZ+D}EqMg?GSyKM%6bOUiwl%UQF; z?fjJTTTy!lDNTUk-pUip#Pmi3LX5vPdT5E=wx!9(A}g72XUo=U>H#5O8&!(6Unj7Y z#7WF7?_+j7-*KMuv5w2wc?TfVO<>K0ZB7!Z$B<&Wdf=dhP}%;6}QJg>Q^*y^0kB_X*Q=`r&rk@)Ffu?AsQE2& zildWBsw32oY6DYK_ryv~q#OZ0A*D*P|8x$x62-u=MmK at jZ+c3Fov@TE)VU^upxSw; zXT3nP`%R?jx&?~9MI7oXR-r&druSc^WCI=^PiA&(N7ooeEAhwT0Cbb{wdicxX;D~u za)%zWY7pUzS%|=^mUECnJD8jtgc`fI&m}P=bRw9NY*Fk7#PL>jX3EaL@#f0=i0dei zSF15`Uzeov)v at N3AU$)!W6{6dsokkE#l0iFCyz?YmOLOe=S8nZ;?@E^O28r4FSc}6 zhd`2xqBgzox1}Sue~ipIR%|>j$@IcXpy<8?wCq%%Qa_2viUC z-+jVHFW`#{5Ld{%@a5FF-Y4A+EYKB~<)?Ym;ZZGg>S<&)K?vYE0v zOEIVM-o3FWin(XF_ISftAxDXRl$6{eu{dR89Y*omK}Wu#U(ex&?Vj|AIwpyi30ZY) zY+wwW^p!$K78SLageG1sYv;*abbaE at SkSd3c-IB&xujT^6ao^_v=54OH~?Wm7EV4Z zTLe-GSj4AT0!sEf{t9CykPTI`@vF(}7D?~%N9CB8XGTvB(O`=^Tfy`BzD(POH=n`5 zz&xqr6s8yK6_)W2m2!!37U2(7m3d^oD~9US3f;h~TowK|1CQIRE at bmI@`*<|237z3 zDy+K0zvSjRmETQVDL;cj;CA3F8At^#aijB$nqme}5j7`2uqc(ESE3v54{mZ`GM1Kg z;Fip*e>K>_j#S>jg at Lgmp${fs$o&N`1;U5K78Jw{6A5_*r!2HMt^J$@rFUt{@Nc36 zV6-0bDAfHdyai(fpA>Is#%KjR%wEV7vAw5cq#DQ(WW%GcdlRtT at HTLwVg!j}1jR#r zK1pdlb*7k7s~Eq;oknh(sJL5VWQOblacOI2lJbCadg)$TN?fRm&|Fx^lbYF*? zDct;#0RT)CZV!n^(OEFd$QGkICqnL)&eqmm++4kYciMIvn*vB;p6 z52&HP8u!aeJ+VKeOARx zNJF+oN7vFfIf|N`Q%-RdcJnvuYe#_7UmW(=N}8}K0aSd>s7osUZDjfk+ek at Ukbe0nyv7nN7 at EBXbm#TMDe=P;!bPO75lU4qS07eH>|Bk~(1(4ND<4DU;hQ zCAEsL5S5(Lxr(dvfE${pydqKY9aixjbhNcR0#TE)bBPC1_DYbax{iUVunQ%0W$a5G zB!d>V;}=+Cga-|x+;mR;n!2a+0Zy;b*+?3dz-FSsl`=}!MT**fK;}Eaw>=?FM>v(j zWm-afVH~~!m-Bb5i+1HXKR8@|Vyknv2~|6z5szZ>@4)8X{_NjKTUSD!2)S>JU1yio z;*U0<&8zrK+(gr8z;Cnv at VUAd!Z!=yG)yIrGjnSp8bxM zJ^0l47j#s;-r=?N@#%Eg}l0Amt{Yr6w9*w_A(Ar=B$GZiMpT zZomsX#eye0T5QKF&P5{A>>~ z&P=<)uMafNc)OCXk2a`BHLB!#vC4-2b%j$BA&!4ReE+%lCUT$TZ`uSq_=uAA`T{KS zec{^4-Tk_&+hNORsdWxJA?DxtQ(7b|%SY&(c(-X2-Dlxyt<}y_Nbe#D{_&Qwfw{-mg!s4^PeML`v|O zj=xRqzdSdAsIS2B>eachH&t4dvjc@?=F_p1xW%D3G_#AATHged{6DlE?_SBHyI?z>>fHdBz%)AZxTk)BA?vNT;}~9Ppo&)= zUTr)FmCcPh1urvlWlqn>#C}wq6ek3B3vOe}Q=#nF?8;Gx+md$bFjJ&vhC0t=y|SpzAHV^lA15BDJVZ$9{3}T=$aYv%w|3_ z^rp2D(*TRohsmuIwA=D_Es&WVLVF~Y%dIIf;umvr#s<362Umoe at nQDw1*%HkQsDA#m%R%0tj(IMrL8T57XX^WmN2wB zHdbghH8rjcE48lQyqmw>Y#ych`$)d9Xk+#U0BHM$7_|2Xj2xaF(0R!{RA24LYM}NgwW*h@ zZw at rINtdf&?G8cEY>+pk{WdB4N{rS?U7Ju2OuRI6G=jHGx>w-(u)I`YykzNGA*VKt zU)}(1hp>1z(0jC7G}$*0dr;`{k9x_#uaHS}5Kks_y$8cSkRUClQ_{;6+44Ksv0_zR zhxaq#3NrMVaSoBf(e{-e&ON8jJ)7dp!-}GWrDE;17M7LfYW8eHT+kuo)237Esj;;z zh&CS^;0#JxhXyz2-@pHa`oXeN|cGHs&$D9c{Rm5<7?m=QYCJPY}+X9i3y5&|p~$YRgE z)Yqy`Oe~Z*6(^;+1S)BA(V#6hQdS!qRu|;+17FVQu8X^tt|L#%oB|z|k55fPBQI?$ z7R9M#))W#p4jzx5J!*BaXALtK$5yLJ;xbCGpjOYt3O(dFP-Ro@)uo14Bp`BixDr|c zNk&a;8`caf7|g0`cL!BNEpdGmOUGpz>tmls2SxozS*e)Lt#qc=*5PF&%sdpEMWdU6 z^IQmtIF8yaxshVi_AWgv97`8S5I#xfCL^5Dyfc?m!ihtXIY==BRDK0wJ7|l+NTIom zsTf#I$jg=?gM&g2%p2liY}n>z>+D3X(Htldot?v(H?+8_=?CI0$dHguu$VN&0|3hE z%(SntQebETA=4gRO|IItj(^Iz{^-E+OBVPD=CDTFFZX{ba>a#JHI at O#_!tz4%}LPR zq^$;LfzkXK6jxTKeF+VNoD8~csy|AgM8ewPuu7-HJvVQgOef1&K$3QE2?jJ9;zYjT zh?jxwzyHOnGt1fIo-n;$m{VujblQ8UF*MR^M%0%Ux_+p=8m(2j1r*ht=aE-%MC at l^MT=mukZ~=WBC%d=R?i#BYgN) z4o$mjMB`h$bLuYKM|0O0ta>X!`>U8PZx(f~yLiXxTeHvhRuj6r4+BHG;&tx at V|RcO za!vzkK{Bmt)S465NnC~IH+P5nQ@$@(xc)DZdcTw`zr{P&pW1!A!X>_Yx{whF3m;@z z?&AE3&8i~2fg&ef=op{oNb~^;mnk<_p>?%37PbCL^xH$)YgHzk1R6>j4_3P(h!bkf zfMA4JGEPnC9Fa=jZtOK8*_#M5CBa$(!?OnFO*^%Yy)yZX`BvTzZau6R3#QTx2{PwU z1yVUy!5eYzEgC|S=oAPh6Lvz60arIS?Oq*#zZrz0)lADK4SQ?>QI-rA6IqU$Zo0Y~ z3G5XbIA_fd*-zbDde$yV!`3yJY{fFIBdsGQV4ikiIfNk{V0^>*^r5Ot*Js!bJg7%$WaCm;9Zzi3cDA1F`_aekeLhIV at t5IZV3?mS^q~1H$ZH%2- z at Nt@ox`YvJjor~OdPYmjzzW3}EX#v6_qZqYHfOB8L?6fcx4JYvn$ zt`prFY;+)~>c4cZjFP5Rty6IN8mWkJjc`hrADeW8yQ1ygsI)-d%f#O=wz`{RIx{qp z<&5*1463!*NR&jCy^BW=Y)qGE_oN(GbGK4fhTr7Dd;W6k<#hSkS!mB|@8Z9sf-|Lr z{;|pOx5v27SmvO*H-}`8{rgD3NBh%oJxrX21Z8`qgPFzQ`Eq#1Hn8=}izizTj zV7lO&k2yeQ5cUC=f8yLxfr$MBZ-EA-useMaTv&IizHX->Te2&GxxKW4 zgu_t4ZE~E0e)$lP6HrgFo^1VDO4ZT(4&W!BUeg_50PwPFdQ)32}9O!;cfyUcTH zi(S|ima2JcqApgXJ!xqXj+h~d=^=IUzOM29u2FOCfOp))#n2dr69k`WrB zdK}H!$Z`0d?T|g*!P+#lM>N+g(fDmWvaUepE~U>z%rvDxO(pu~lCrg0NxRzgkVqvE zS{0H*L}kB8CG6!gqIN~R7u%kxWw*?>;2Y~! z;f>(m&b%kab{U?a&E=?ep`Ku_<*Ih69$6h?l3QU27wTaP^{GFexr&g=!WnIfZKmc+ z2MCt!=ppP%)1!=}WoTwql<$!xDJvE0>_O~&h?ba|<}CoS3KSbfIZv1rhmzHTfZi7@ z)hD%CiqH;5jj$;|f at Vl%)MwaT$nczLE3H!frjmw}9U}=&F+`{DvDuu*%_Uk==hhhm z$>XWTg9*e};*BE-#XAYYvyzUqJeP%X8hYX9Q>eMLv0u_HP;fPu1=#s~g1J29n(BLc zXIX8O$nK11sglmoG0z~taxnFw$d0h6H%Xq%QVV^9;kjfa#_+={o at lWquuLPsCA_~c zICtx9Jf8&`7D)on6Z-mQ;$Cq!Hh9N0{n(<^MR+JH+Twm99AX$T3S>K4^f8CBwYd2` zuJ=o}J6l2cNOq_+p3t}^^M27L9}XL*5TZj$#gEK39O8UDLQ*_ZmU2aDmo(aXQ!PWw z9MR#LiWjA7z=k+wXL at W$7J?dbNQrCq8u3F>S$E6p| zEU;moVL`da__?@+oBMMpd2uh6*AyiU0yC{0Wb-vQ-MQ0vq)$ z*?i^Nk#mQl42b7HxZcH8uQwPBg at JkrKLlixuplTNYrO5*ecg8I9bf(Vos3cgh~0Mt zrO3wQM=V46$`HUdL(W!`SGCvWX9v0*#Vhx#AQ580D%nW3nJz~PrG_e|?5yBY36Oce z)kMAkiXgb`MONpj&3ee>;vu-sEJIRfv$d#HP_xlVVV_aU7TI^w?-BcGe0DPO(d|c6n0eVFW8tV)huyMxuxJ-v3M)c54Bv z^rD^hTl at rSi!lBq)L^l}45c2uicngQ)ILExic5O7wi2#{$CPt{Rb}w887Tm|$VaeQ zq|98^$#tml++2r6dtG(KZ)0;THK|10Z7`*l`V~#24#C+|Y&I#5o9<65-8Bh}N&K7T zUyI!)VkMHPvoXgMQ`_?|Fz-pB6+MOx at 0s(OvlJ_<68B#Fw9}#JO0FvwzczkS&ue#c zViuvws{yI^pN|2qqlMCJ2oBGh_dwdqmdq$q)9Sx{CsM-zzqQ&NZFkI-eqyRR!G at YmUz}CPxZr8Xd5 at sG_FsX_IUX+uF5iV1v#9iv`9+LVVC9Vqf8$d6FVsneDs_ixF0yjZPZ>j zdT&Gl0S9C_+`Ywa^l*VqVX5B5VPAeDPIjW%Gr8JU%T*`OR1OEu9Pb5+h1%*kZ~92q zc`(L$Ayw*YTkt04o>`K(v8+C7h?t6;*dDl%a2g98HQN{w7Pw~6Q at pMzcfL#G7~J$Gp-)Mjn}df4aIS~E^qOy-vEKH(^;`8e_sc` zQObG9xVrEv#A{^IhKn(dikKYzj0)k|-5ishl_TzIEKL476Dl#OI2);!aByq<2HUY3 zFQOQcpHy;<^_B|ND3>q)J at 9&v?j-Q4N$PeRt}P?Rvg={hp-R7Xm8deKxGFZmwW^kY za<4|$S|oX~b4lNGo8Dv_!ONLJXkBTyP=!dr`%suu!K(GBoW=Xa)nh?Wz5}vV(JxZ& zuTpPmkhL&-?1ak3ot_^#1)8>a$bS1c8=N6EE2#a=Lk8K&3CFs<=MzTwayUF~o=<-S z`ZZT4cLI~t69A-hY>~dBxZ63xtW#lQ1*-duwQdMc0+7G6&hcr%=Za3IeL0O)a=qoFd9s at fIRj}7Tkzt_ znU7lS?T8yWp%l`)VhD>{RkmQGB-WZLi5y8xPKqm`;RX4y_gW3(?X zu_oG at UpKT&oHuk3H7ShC4Log0o{)kh1Te#;oyb|N{+xihOP+}pCrx0Ai-LZA0BFR&CL7o*bG6WYRY=#Z>C&gMJ-BnnV#c`p$(NKk3{RXipP15c+jDJfEzpiX zYem!u2=fXyaEL>7r)8!sdBva{uFqwGIzRWt{xnF+YURuV=~UR9aqI-4&0|fN!^X6G zEGedR-mkG4nSFapoRBtSQOvdBNScYar!A=P_B(D$wDOFG2Pvosoa|b#_2eitK2pBR zCXTVOrDZc at d|ya>f?YfiS364gb5t&Y$+J}b1;!SlF{vdQpU#NG$?KdJT-p$%F-jpX zQT&xSMg2}c?$DB&%^YOdt-ZsaI{7=i&>7k;lplSZBt1eg69|7GuB`Ea^gx#*8~tsa zskdl~<#qV!wU&x1)Va>4B$Fid)Zt!VI0bukIi&`aUhDDAhV+IG??-YMW`ULWsNG73 z`t+LiuOAS=(t8m5m-ONzH4S^%Nh&9VCkLJj5#S1O-5liqhgEQ1eng;v&k_ljBDuD(xT5bFeVJNjGE+ndB+5#)M zFOQ>kTm(#!l$PT(^0^zgC|!E4D7e4}5<4Sov_(BrGj4kYW-_vksGM_kA_2X?nYM(7 z!Xg?#?vNRpvy^&f`_{|oN*M#J7Lnb{jXw18MgWPsmOS*L6md_e at db(<3cX at E9gzU? z2HFPVhSCOXHbzJwb6A3a4|dPdi?F6ln9J))QO^qRD(?CBIva;#jpd at _;U$oUVxELb zoQoeHqH0{Y>lokO9FGmd+jp at lmr}C}VGjp=AM=F;c7cYT&hOZxyyE<9T-Q<%i at U9W zh7hc*BThvZ=CJ#odb`uHU>_9q+$pG7)teKL^(t6kP6!}b`Gy{ zMbW&(OLsSze-c;?@n;DVSW}3ke>TiZvSPW!{`UiLfb|E%jt4v at GW}Q~0JNCOkH4(GQD}i zuI|nYRyG0SL3l8^m{0Q~>u&os9q+T}0-mI9fz25vc*T}G)zg`@K#$tE;QJc~et&}> zq->#h22kyTl;`M-EMW;|yDvWgz54dpVuM(?`#dAh4XHK#+rrCRJzs#Q`Zxp7%uor` zeN5_5<4C?XiWaycX#Jytee`G^{Wv!55#^@v$nwhe$oTf7vrszRH#(UHuv|F3mL-~5 ztZPvW6ZT*Qss`8O);D&S1|*x-h)6$sj!|4(+WQd|c-61ELZTY>2`wg^FNovM$ha@{ zQOod}rH9Mqqu{}rU76pIpdZd@$_H5jsA{Dq7(%%M+*VoMq0pC*#ANp)PaT|AWu10u zhNRQ90mEQXm3!*U=5%6suB*|MAC3pjEqgrL_#5n;+06m3c&0_QWu?FUVLY{Hx+lv| zsl?U^TzT589hOj+^$gZ!xskb*@n8c+67xgMtx$lqGDhl5oMHy)RypaZPkRF_s}B{- zrUqI;i{M%;N6i4a*!6xh?LInNQbsp?>jSPnZ_LNVjgpq?{mj8=- at nbJau$2>wg>z2 z<>=2R+5cGc{=5hn>DxK|>z?@k-cn|RTBpCMF~)6eEhK`C@=Zlk7s_BAjRZ;D+6--* zK0``v<=lj=J?S)(`DOBjiR%NZdkG5?H?5W+>&Ewq9d~+@<||3ZNNn0cw&#`OH0Lzu zQTE1P6ZH|l(Dy0NhOJX^*@+2=ia@!dOP8niX;Nu0RDP?_6BVI0(S%M+nA1YLb(j#d zmy5Qo2;J*aR+g{H-SP7$64I36fMAd4E5mBK|K^$EH_4DWxuQCGn5=nFOs;|C1t8iF zHf}+Mo4?7l0V*1=(`68e7z{RIbACtt?*-XT3BO|6jj z+R>S+8EjS1K%4r}r!~xF*E|1?N(f;=#OS{aS1>#tSxG8C!d6X-+@!lHr^bb#wN&pL zP3=%c1xx1~7#?!ZFZYZlrg2SQRuy0Wj=E?bY(}a#$Y6(i33qgFEwb)~^%4UIE%d0f z6;r;xag~Fea}%_BC&TnS{Mkq at yZSN~0Cr>t>V0 ze?Xa_d8q7Tp2Sid@<7knaJ*3wN3Y$^hN+7Cs)WV3X4-&>TZoi;(Cgx)m~bZeSO}SL z)>aDfClZB;)%{LS^Pr#y6&L{qXPe-^a9hYEQXA=wxuA87=c1iD2G_c|90Lf)H4+IU zGMHR@)fGKW-nnK+nYRabh z25|rIKST24&el&3B%b!o*GF1rv7*!VV7wQ7)x0e~~V_Pi|c z&iDF$Qs_ouxr$x^X7AN6 at Ytfbwp1_bBMJx0TG;#7b+Ub?#hN)G at h9~?TtbNfVEII5 zP9i3R?nUQ2yNB6%(a`|b-K-Ksoj~jxu7v+D2N4O95cXalLdL-Hy9$&q=TgEez!t$< zH9XP%+mCVK-Y+`e8Wr;+q>ed8H-9I_V8h4PtHzoyIj5M0YCcYuVgD+QS+p|dEeX&V%p>)nkQgM1VTv!YR zlYRE15cw|jF3bDUQ*jy7TrElu*LJ3>p$HuJtVz%>3cBMYrr9oO2)2Q)A~%PlBifZg zw0f3l5;*hvw=HQ$cN(Q=;9tG~kiL9T{U2yAJDBTRnS1=B0w?ca>*oGnL2eQVtE4G{ z_JIN7Cq>~cuJJ7yqwKepMmTy#=+GBZBz%w{jhvKm6uOO#h)2Jk>lj?Til#-bd4io7 z2cGs;_gDyQrU^BZk!)U1{OxSVhmB3&5ASD~9&ID^2EAe|7!&kD#u6mfYQ3)!{x5>P zD9MAT;i-Hu2DG8{Sajy9F3XP2%*=;r=@pt}{gW(=1z6)_03J!BC8mP2^8Nz%IDpV? zT{ff2ay at 7NPR7B0KXrX=Z_?rlhq;bZOJ&6nRWqK3M`F639y45}#JH2zq7zW1e;RazTG&Vb{PSV7LG?fZ?@Kzn|@Z9=o zHg=I0Hi at N0woJ>0S>5;ey|541)eBu?D3VHeNo!3F_UDci?W2eAHXEcPhqXBhPpZS% zUwq6vHYW%|Kqg)3ai-yyJSsT4wWW`*{d1H!R1_F_vK3Rwp%;{FW$79&PXe_RLl%=b zi`&_y?fGS}MlB at 7aGi?>QDd5GoW-kCkFL%c6PtXI;^xXz?Q(A8J0_q4?!u_ z&E7j=FT=VYRaAS(+<^R8id$tZ2rOF(6j!LhuxU4W at F@Uk}ig>Yxsaz~F{7gBDD zchLS6*Jr;papO1GfFllrGBc{S+BR9YqH{;^$Vf5k`73 at o5ratS`LVSX54xdJg-#TF zIZ3H$*fAC#L%w_C8-=Vo0=1B*8#coz1tEnqhcT^n1B_nQ)s!2;U)SGxT_m$d?2{y^u!`4A$p)Q`- z0+BQVp6CLv1Tvi?!SjM at 2+43W1dIe%{P6|RTm at GkwDDX37}M>{-~uvkFC9dEcHK=0 z(+my|h9h>Qx?yEOg4)a*6u-2#e*U6$9s4~Il at Hba!q(LE`7TQu?RGSJ5l|(A?!Eo219!^K1jtyH9 z at C1iQts=TQS=aXZ=l3KOTb^aw2o*GDY6b5yC*fRv at 5uSVrG@qm?gW}x&*p at 3gfdA# z{)`T0W+jF>i;R?E6l7$iXJ^(zjAR1^xt_6}6rCJB16$)4y<}SIDS3A9mf}M{1NDHq zwmN-m(7nTTgD^^PQh>vLm_hE3-$4$Cx+tZbRcN#8ohP*bDGW}sDAs~avM8r4uLued zt}hG at RU~1JTz9ZVo<;GtHHfLavjQ8MJ$@y)dEf5q^sn~ps at 9Lhu<}x?nf-Ouh46Ut zNgR2Y??21}voW^gxPUk#m&*eocVhjBlfHVz1hJdxLih=gE2!^FIH9A+_K_ at Z z^TbVWvajSN`hhm)3zC!2O;junT`Z~*Ml7)aMrN*(D>*}PfDI)vUk&~kMVAHVlsB5_}AJcoBnG! z;!)|$v~Mfkx}QNGh!>odcMFalZ>_${a^37$f*|^kQ|+!>-jADCo{yE!kKNs$U+wU_ z1MLB*`qFzgNJ at mbeVyO7pbPLHRmR)(HSj5Jvgaj2(ASuvu0aV>8BYsHP%od$)puGK-Q)2i<5_P`n{8W zu4{DpijKF>ArMj9wJb0c8N)hg at g+8~IAaOR<~FWSn2t>p_l%3whj29Hj(5CJv_dr` z#*H5oo-oCCSz*(qw*AKB$S!7#tNkghO7 at giKQYkoYh<8KO7R^zAxK0z zlQ at szl>@y`dCOGe7+ZG`n3Zq7vZow1z!ur!)5Hz5WfHB*FwPkJ&>5sL#G4d9^_!UQ7pMolxKr@|6DufoDu_50#uCZ`%DW zJ!Z=4T!kB|BGS@!W5=HToF3!|qOo0BVM#2fQfuA7T>d3#`Xx}M#+lQq6yC+ at os*-2 zq2Rc8|JykQF5IklLKMoNgcA(h#b_qARX7eHYEK4j0qBbskctUdr|mhdpb950GZ7mGQ8Xd}&1~gP)*0%LzHV2$c>s!TuTL z&Cm4EL1t&nCFXlKc|Y4!1$q-oc^HFG3 at pUtAZO)6_VsbHdl`8OW=Z~$Kx-_!)#_(# z&*OqVUwImal27TxR`uDO{aY~9l@>8 at 1f6~(c}{T#bKXJ6!6n@~tscN{%~8d&Nc}*L zJxm>yIY3)j;HXkvhy-lne55wt==ZTyY)8+Di&Jh?X*@}tS9#nVYXZW0NyTh#Ws!ah z%>k#g%4z8do8;aF_;TX?0_}#NJ&g|RsnEGVi{4=|`046?&jGT)%h7*T|K?C?S*E$a zDTQ>C-7S9$(&(Fi>56R`muvMKm+q!Si#|Yih;u0#o%?2Z2mH!agj%Ox#J`jtTvy09 zRx#>o at ys)eBo8}h&3KGj{6!d_p(`BAJ^JPK<{_FC%!gV5$}KO!cqR_T3Cz3YSEHC+ zmafQgsV$`-=GX1q1H3EHtvuB`!J7wCFx^}q)(v>XDvn at zXu5%Be}B!d&?-ORIJUN}#VfJioFwuvSb8=T-9j2l6-2SB1} zOJ$<|p>u)`<-KN%$AGDG1XI*{1BEK*ko?3nzt{m^ny@;ydb(P=x`vvD`a|uxDJK%p zDaFoCC48V7f6)MY>Q$LuMNPcoFxbQJdB&Xo%+HPcwubAF*O(G9F&KYGOQo1+2eD;| zU<t+cF^qxX8Y!3&)I0e(8z3*i+& zaATeO_tB*2jobv2AYZ;bLVfwd_kRrjf1S2U8z{tROYVUd0|VSH`j zp)nRje5<$5fOCeF(zIt4sf?jveh-q4vkO at NeJ1JPx%D z;mUeF6`Y>9l{n>wN(PY1pXNksl=7^2KecH_f|ffz&^jW%#P%kD_CuisXAZUMfUQz2 z%s;lcnLV8e;GtDZZKjO^ZUYPoHigsBNi`EqebaL!Qbw#)G#si~Fp-4Y6s$EIaY at Geibv^DPEbW6X}!2X zG7NbX^}CLDFYQ9cuwBmx+M|=8g9Qt~;7$b&Yf5Suoi#p(!rc!f4x!@^18bItq&C82Y)bLJDmffGExHi3i|Q4hfrw1ggK zf_(^^gp}}4;aUCoT3aaZR8EoQFy8_2o(4n)b;okh0fta+J~KF1``JbCjshxulaJz@;bBPVE{sjjXu1Lf#Q<1NHVyoL&b8D-7nylBIqeSzrZ zA=xbG<(jkFVS8l7Gg722B6ajABK)IY;|b%L2bcwapPW%7zrE%A{_XaDK&evf;~!8` zp#LLK{(It>+`K%R&n3Vz&GA at XSVUL=w;DXL**TihpAar8n&!r^SzEH!GVe at W{7oS> zRqvmmICA6SXfD{WnNOdz9`QVK9%XN>U-9$%f-{7e>Wil)GHeC_5*a{J;S=0-`iP-p zummOgnKsabe0l1t at yx@^)Z5~n@%rZ$CvR|t>?Y|Pg0~{|Z&H#Jv$?r7wn(IC3^7 at l zOE`nw_?aO#c?%}K1dkLO+nY`e;R5aR z^?fFhqEW>#0hi#-CUNm0l-#vxAuBVT=r}4mbor}uoYC* zpVgmb2#~zKISs&Ahc%9!UJPnlizZx^=zd19r6~w3fuq;JW8w33l|?6?Z>atj+*JU< zR!yyCr77g>beyVyJzQ3Vup at Qf!Kx&kt(v zJWE>;5`E5KehZ~ai<%Jd2Pe>zuUh%0P251pE!`A^M!g-s$NP}CX-YbS=9l at 45j}|(Q z=1v2K+>+Cf0B%DTp{_peC+JOb%sPohV^p4fg+VuQGkZB4@@xZT<%*O`FmplycG`LV zMYNYvgk^CZ#L;7N_W+|G2XKqRM6K6aL*XeoZ+}}=lDCm0@%*17#r%Ij>QF>S>nQab zpl{}QB$A;0f(b?&R$EMPFQ#t*tRPHR=1szfA$z at dWhLLGUcys$n)j%6n)C5)>*MME z5a$QhPcTA#tv(}6B6d=lT*$iNNZDrih!CPh)a@=!hLd>v|Yqiexxi*m| zfVT?OY-Xntr-W`Q%=(S3r8)?8B1-BKEUd|;!Pm6etMgM*2!=p5>4f!)U{xynx&cMb zic&P13O&1^g?!_92Dog;MA{2Isr93W;1j#`1vn1^GMEh-j`n^>DxsBM+?iXBJOx8H6~mSwSlB{tzC;>gRc~-ajBR~@%v9(OIe-0vo;I9IWG|F zdH)fiGG+Zg0o_0nE=#M%P`n}Kj|f3~IgVEL$0+ZPSR$3LG+Kywp$bOax1FS_YO{Quj8^o;bO_#?) zz7do8A;oWnUq at TMrZk6%7cd5LWQR$hpd<^48wBc?Ext$U=QYYhJPT&omR$h$F77gp zu3wlW-KMVVRt5HJT}_qknPfa*430U=4R4Dl2Af#rg+ijSihMFPP8nWIV}?|1Y{k&a z;NRa-^O;qaZX1f*gwFEaX!IPgzrHXd0Uvq&wnv z`iuM%;@_bPl0pc|0{!wO{m&QUT=|%poD?AKO?1i zfYw+_9s&gUi2dm=iPS*_s`1KL=8J9%y<(@ahJ at ycJMu%q`S$pmoxPKVCYE|vpyzZe zL7Qt)H~-rW<`1|oAad^u5%~e^s0$7jFVdeF zs6nEO4dca@&_cA9 at rFySEA2*MM3WlPhqTO*uJ$DSN at NX>bNSM6SgMnZoyAhpyNN5I zt#7djhg9?tW=7``3d}z!A>u*9bTd8Ajda&faUfMau?1 at J=zc68e`Q zy@=Ops0GI*ZqPjCu4x;3?P6M2_ofZgiPgC#9jdeOfWa-3JpG#7b!lZS$hR4*HJ!_n zVv#|-j`j62o440r$a1?H^pn#^fMcbHJV<&~>yqu%KSbaTrMs>ZB zJ89t%?Iw$6kFy)_We3^%?2G1Jkz$pCS*HrGd6Y`;%7~XthT>heOS328% z?%Y;{W((Io84hN0eruQkQH1 at GSBu?q}hWa2(#bmflei4KT^#gNn9 z at n)Mtp}v=bUUN=1eutlLIlNMen|Is%#DkfaiJsWX;t6{D#lOR(*ylRr=ChY8z& z`jcSh1@`x`*E<6O({1UYd0eEpHS^E*wAJrL#-bC+BilU<(KLhu=aw|6Y5un2{NIlF z5Y%`B6eZw-HDy=HfE!c at D4a5(5E0Af*6he(Be zusrq)D{?SWsa+UN;rPngGzJmTfDzT2({WZWX@@ASFg at 6P9GJ_v4!JYV_>)q9_js&$ z-Iq&Br}@Twc|K4q#Dl*L6X%>$TrdBlr6PZPoZ$aw?Ef)gPgLK~$=1RBzrEaFJHgOC zwb_;!VJKkye-MPW-KZ3Qi=$Ht(8GYhZlbxlVXD&3YbVt%Ip5?L&k<+2S$(2U1IS(d zssq<)b5Ho?b(g6-4V-?zKUzopVs1so5Ly^K2nJE}Q(vT?N{Gf#YJHkXn(UVRjhG#m zj<#UOv#DW1t9$@y(>KJ1`c1 at WMmNm>w#NfB^vtk?5V8a&h!qZNt zvrsBog$!5D8Oei3%FMvt+Y)i_EBY+aA(Dwz!yWm(3g|?5R(Ua_>V4~P@|(e!26^k% znCbAGzzBom;;bQ9G^Thg7`l=fBIS;FNWroR$u}>1)5Z zs3e}J%XE4S^Xi}&{zP*XUpSs#}J+4BX1~vv%D_>Rz&`E0+lPHweK)ap2N?FcA7xuPz(j+6JSt zA;_FyHZK;hBX=iNEO`$W3MY5))u0atX0>hOf=SnqLt&owxv0lU5T}CvoXJrZ9z+Qe)ceE zKCuD|V!uDkL7vAmR7 at CK1VcVbjDUJqNV-o(iS({YVRGR;e_JJXYY9S9MA}=qjOriIE5Vj0l*^W!gDexpR zMoN3#tWAGT`6Pk<1O79hYb0{&>HNvn%W3GwN&^In-W-cH&1E_})A513dGr0_>=yV% zsU;^6L26hTg|;P+j6FeIPh*%CuNe!)T#QQ~IM3ARnbdcZHf7wu5#uSEW at U92H{hYi zlMWzD!>#yJRT8I9_Xvm1zAd?v$JKGeb)jQw!9QQgB6x&M1|e zPA at t}9I4#gP8$({8nu^WP&bN?Dnwt(M$z-NKiu0X(KKYXE?$=nGeEHeI*sd+>DV$~ z9))R!vES~k%#F~C at RkTo?}-h?v9XQSQw|Q_wu8i+8)tsbhvLD^@$|r~6(VZaC4i5y zp$kPNsTy=jp)0&Y%Scb1sAvUdkNot at UiQ1Q!sbR<)anqfcs2d%87FrEE at 8ZWEoGqR zL}N84_-H`5+>TFiiU|S)g)0>Oyq>)X?EH$Bib!&LMHO!xz(XU>PYH#y||2v1f0i?M}pRiE^;t=khr)}!(KZ{3w@%aS-tXcJ0|$Gx at _%rxYEL{OUdq-+L_i` zwW2(0rL!9d6jOrxR5vDD?g-DpjEG(n at IX}PEC!J{n)jb**GY at 6L`O#JJR*ZDblxy* zAz&`|yBh85TPohK7^?!_mG!S!L`8;G02mn~ID?&-O>z6B_fMU+E^}nrm8EL6S8~|# zZsB4O+9d{PLMS!0dC3eY8Gpv$zCX(_wDo0O#Q3}6G;7AVR1>MGPQ*^h%nizgcxarM z=4RQLOXODxRoE*UzFXm(6VK9eh<-wsR%juU%@*fNRDfpXMI{^)(iVLpSl`7DU^ejJ z5FF1p&At$787~LpthJ~oL|CPA1Z>Szh4Ez;sh~R}yc6Q1f^x{M&>``v9c2<)hra%c)ti6~Qxuu0sk_GbI5rVvCPgb+RFiTf-^Fz!W#EPz$b zmIk?VBmbfjpyzdjXk(DTfXmFkaq9baBJr{%RhQ6mJM#l?kHzP2cW~^Ex+K*9XQ*ZV z7qxN=f2f5xZThK#oEQ;~DI9dDcul7b?D(;2Hw(2oFq{`HRm4rYN!NDM>-LQE0qGql zjG7bWJ1mB}pH_#4q|+v~z}D{g>n at XdyLEEnQ8%X>1kj(w;-tnkG-uXF%G#PK3IlY~ zTC|TMOmZ&5`32y5G0nbFv2oYJsC;IyGoGD7L<2Omf1vi-nGGcwR4Hnp^@8Z$h0e3> zb8k>z_o&=rE5W90Fo6OlIueOm&Tbskk;vKipGYf?Uq$59gp<7_0*;``8%&T0B`*)zpYLIr}@ZEG0 at Pt#P)yjMUF zG3izd$dfe at XJPR8sS=43H=jS$sw2}q%Si)9PFqIp$n}-`dr}5RRhFSujF+iiMr^Da zMW+V9?=o6~po6W5|4{4p{)bwd9G$X?WR&(AURy33=8f$OvbY-DAuH#5fNbGF%}n>> z5qqy$gi8}Y%$~}e&E|S%xSl$+5Er8)CO_V(d2x;(Mq5!)SR0geRst4J?@|vR%4XpE zU5%9E at 4v8R;l)2aSz4NTBh)aS9~vJSI&^Mb2 at aEW z5^<4n+6PpYm+o^Q?=sE?Bm`cd&6ZeZ%I32jOfMXG&PXYm5-)gji0yxcKSS()HY>y^ zih()zL{a&+#vCBjZ#gs6I3eHs0R7t5C^G at MXmQS}v4Yc3*Q{C7JiM}Qczyx+mMMdr zL|C3ilu`U-r8oV(Vl*fE(9`gFOU-9KLSPSGWPw4{Y$3k`FWez1KP4L))EYnv3lTlz z#$p_MN8x=%w5p)hZQ2uUhu!_RBZ^-!$YXu}fGhr=gUj;I6FZZ(sA6cJGIeh3m%o#m z2pPekpsn{vX!5?Ut#J4al>PLQj~h{pNiaU8`Dt2kpFUKgg9Ir%^MT5n3>)`-FY at K; zE;P`MnJptwSlm*~dbw^pgWYzkBW8OY>+}6%5$B5%MX~;Fd6=cSlfDLgRf+yy at Jp-t zo+m0lL*ei2yL=F#?c?8|AEDfQDd?uOFudxcNke0BLtb{e44GOFg=&>RcHx#OcCYw5 zI!L<5ah|({7E+dcnd+f05bY#IP)FW670~f$$(y;S%Ko`~upuiJ-@=}{?1)W+Y%8xr zh-gN|1LI#=@F~YAtY{qAVfuzfoT7W<_kgr40>q9o%H at KhWWV9aFT-?&DGI3 at K>F8b z1KS&a9zGoGTn>TGO(mgdtX)ak{H#AjGpjto?w at 2cG&uI5z%JK;^e^zR{=G&9N{viC z=#tnW56N at 69uqONBxW_yg!$dao3dGF3SIfz027VN!7jcduceO2?^67D$E)8`%#f(c ze8Q?`s9HBe!rVeCR%Ogi7o!73p3YeADhdx4_=~6H_`l0 at otul`i16M03NiR99BVJG z)sBBIdF!GBN$264uq!`aOD;anpgceAD>MX-Rd~{is)|w;%Pq)V&bIp(XMgPa22b2+ z$Rldk9+$C;e-cVnmkQ54D<@VFEF7NaSIU5J4BbK zQ3F7S5ZXTH+RxYA%B`i@?+tL+UKn#P)<$+{F3MXR0Sg~195Jv5>mqyfO(gGt at O%2k zyJ^GJ2GNG)lpFZjeTa0#{^oSW+qpuA2RTI*S);mr)C6t at lgRUdA2%q&=_IUr=WSb3 zZFEBihe^vDmS{$Qf&lyW82%MzVUz5JGKZTogk*%fFiF?9q&(dMcrh&sYH{>iq{yW{X zmT~@ze{5y`e{L&T|GP~4SBo$?Sx2)1Z2{&t5s`&E?|0GJ!PGeh zQ~~~9`NzE-5Ze79LKMc5N<~;Gqvy!J;!LrPup48J!%mOz`tnH=FrWYfEXtsIn;S`ySduK-72{5`brGrKfn;lmfjVJ< zll3>F3<6kk;v_qgW;6a)!X%~j18`&R#!=${LYhHtxl;Wwf$=Z{b at 8Izul-5d_7u2; zuzgB;PjPqd8vPlw at c}8XVujX5ULF=92GY)^vVN+kGXPbt$S^`X8Vj4wDR8lSsvF5L zKjYA(J>_Tm1T$WX2K(WZtAg{%#_xHN#;@>K_Q)5 znWr6;3$EqKhZreZ!j3MBl%X>7wD&vUCDZLoEaGfNy>-+qx=le;tB{OlYD?Fl*c+xA z7eb3}+r%<_!RS0L+I;%r&dl}zRc`i at ljSb$%ThzHkQp6a_zF0By7V)?b(2{;dVfw` zQMh*&=ky;sK#`;ugP-7$#0d8fM++jdzqheJeZMOiwM{$yq|HsSQFgtbkrPV2Y=^R! zf+G6P!o$nlH`T-EiLLO0*xQN5zk_nam_nWbc;O+i*CMB0{@^{iZ;Q7*c4xi?_gkIK z+rjeB5yvpQxt+bet*KhyBlp9}zT$vjJkXEWCky74wvW_HypBTV--;!%t0?2&njz at 5 zo=d-u-R>os9T!-@?AJyd;l0}RCJBS+6xO=&uMQa2NabTLX8ca5L+U|`Ms{I7F~=wD zbmN|y+fM!VH)w*9DpCXfNTT_FE{Saa%w;F#aQ;XlJk3_4WvL-K81^@U83;HdKeEEX zAwohV^{;DSMwG+7SQBJt>J2*NPl=WvVGlD(2};x|A{Is26(8KZs^u>xcI++!NlT*U zz`rE%s`I%s=K1MjI>+ZLL(DxG%|x17C~-gr^xaN!JPn!NUQ^h#wAU2UIQJYh3|v40 z&h!(kO}m!r`9+Vb5h*Z}iV;w;rPO=98%#W?+Sx|^hSzl#Ptv)Y)T+7HRWKxzhkVY> z3c)}Up$Ox%Gu<}5#8sl};LA_N=x<>Ayv{U`S+7#7#yU9cp{ zrkrKnxd&@o6PrlQ6|W3Yw0{^k95r(N=>@oD2xN5iOWW%7NkSiqsvVHlfj&$^nzT0j z74F%Fjx)GuYVxGdnqcd+G>zyFgdC`raEP*=lEUX9&zT;c6QWE89AcQ-P{#_|3uUH5 z8a+=2(>6IJ2)E>)+WY6*U})+ZImw at 9^*{x=AN9PSP|0|;lGKiOsSUYZIxmB9xhdO_ z1GGIeDAe4%ebGH#5NJX2ye2ddh~9`fw at G+vt1METlp$*r&Rd zr!o4O4P-38V{V{leL#l^`kiIWkLC+O-q6dakkZcYCeD#xk|WP2YHo-P`e{=k7c9;- z2Uc+kSJpAk(~vyL2C at Z`?H}%BOH)tOa6mgaL zh=rqa-;$Ul`Dy71g9Iq^3#hhu at 2O1AqX}0!$LH7gD_ at Y*UPTxTy7ZPrVFaM!alZ;_ zYqEcsI_k2_+ej=$+Z?sNwRKu6_SrPHtsj*+sJF-Uoew z-qqQc6P`;Wge-nJ>t>}8EZ`W%okzejYyu0Hj5ggk0~R&Gs!$1yl}^C~$AgwZgfxe& z;kR3TlUmW(fxhNo=erMWjycB2>nunqeP<%;x8$0~IN^eYD)gx|t9-wP`Umfb0fwD at e*1&rf4}<#D_%v=y})dU~gs@ zNb)u+qRXJxNHw$7Mt480Y+qxtztk5BwvkcZXp?I6=mFJ1HFA~uFXy_}NA66gv%-V2 zRslb)^apRJw+j=?&-eNJkF&DJuHUMSZ#|W5EK=>s2o)-gSu0WW%RtC^xX=12>B{G* z9%QL1E`i_&#?D+6iO2bTC!TKE<)v__=C@&U5(Osv1bsde)%Queo3yjQ@@mcZ%uQ-( zL;U6iqUL$PurM}kOTYa2VZ34L*;Xdq#?Q zaj>D&tjG@^i%^LB32~g%?^bJBw+s5cPe-f>A2Q$LjPK2#B{DiAJwb5KpT%mhSzS7tOEK|No;qBEHOU?n{<(KrPhdhLZq0ZM;ve9!LqZ+p8c(x zLTwxS^RFgq(SMFN$3IQ&zwmCd?2%YU;?`0ULM7Li(13}Ofr4ji6z?OAE8>$)4y&)p zj#{$B=D%;`FN&#DW<^m}$=8rp2&Ej at r$uz4I}i*qgjp*-EZ^oHaD0R_9IkvDnzAWjFhS5`z68= z$ZQx=aq?9$nHU6CM=(l`nqTsfG#NsbJGiHr*;!7&L at POxPS`x0==anQ3 zGe&I&P$8Qxt|Lf#wntaHX?vWm_^GZ9WV?x3!szOYzKpS6h~{Mo$Zk6!CE4m{pV`{5CMk}?2!nk>Es z0%sj|WGY+lU6UhD&}Z*4oLd#&y$5zeS)>%009a(?8{oKCeD5ajHYAy!X1tr6mbP96Q8{FYsW0HBETqjd``!Co{qAn at q#zRVKFRSu z9Y^ApMWWtN_(;sGp at Sm9SJuBV#ca6_9u0ktM1lvhb0R=Sz1t9rR&~l1{vC zT&dn7I5%UAJ6jZ?AaSf7J)^Wm#sbIwC&<6UpTK$G z_CMr#IsfmTm-_$Wd3XQmd9nHFjLi|NJP$ld{&-$T7DmF^f$5u+Ss zZ4%t|j?DGb9UJHGPq&9SKfuit0vXEmxcvDhL}!CI!OQ*KgXJYt+OkZnGk(MPk z2~M3}DtbEodLLaHBqN2I;&m$ahAx9G7=KmwRU8CCKT~!K9T1?HC5;=r_%Lby(rA;i zb_&=gY*+&JQuRlS|7x3VQlHs~&|6AD79x2+GKoCT27v$4Zj57H*whL zkMyGrGl)WMQ`{IjOMo=vycjya>u(TN+9N(|OCxn+3tKa8-2T{j#OM1SZ#E+(9E0fv z&$HBbm&O?619O8tdzQywE~g*-K$s6Z-4C{@z5BPWYc=T4!SP!o(9tXe>b&q1eKs1C zx%XWCMS8dLdwv!LR1y_)&I!)&oDI+TPT?r`<6Crv*;0*)u?c672jkxMohgswQHS<^ zuipf~gD_~uQk$_vp`97;4D>WRL%aK2k at eG>yAg&tXP|Cizaf`JJsJN4dn5kBUhQ-m zMvT#oZ{1hdrNsSS9j&BqvYq>}q%9}^g}p1Xd5AWDVQ=4G*t`4}_KuFv*Qz&AXR12} z$y&|-6`Aqhydy3vuW`50P5+8atEj4>KlUgde_^kO8QZ9VQE%Dm$lAR8*Teyf%s+uZFS5AMar$V%^}s|90;rT9{#Xzs*M<{)L at WI z9BlQV!4_PNL^YHbi)@p2Cm^rS;_O2@(v5Q}UBK>E&aEzfyzF=Mh{6%Hp>*pJKskn| z_!aa*_F|&v8jLE#VANfr(!n5hy at qOR4!2E9&FIeee}ix9ppPCZ%Gb!4ek)*Ca;3M| zi}t|=59|EC^|W-Sw4cVi?F)Rp*RMZLL%lCO%d|2tRd7xUbftsmTUX?4uGg=FOB6_|rV at VA=k~JvIUaD4HxLp{ z+c*{N_>A++&lj&_bkXn)U;G$1R6wJ~af!1H{u%m=H$u at TWrONN3}zV z9p+G_Yx$u|*x|m*qi4et^*gyNe5S9QEEne*yHz?&;l6^qC1D65%-{}~WR&^JNt_95 z8L03rn7?uoMs}2d4)BpD`-vDHv)C-=3za1KfXVTM(K#2}$mdG+M}Al}K%$_i(EP#C ztXo3!NCKur0E|R#$e5&LGzcoBq)DXU$q~M;M^Bd1>TazOeQ*FZ_4ABIN_X-- zJ`~^=OeKo+{YfdL+Eb}`;@!_nhpMq}>J4dP#5&H_um%!|`6%7xgVwBqiKj4;`VG{b z`qzP9I!_|uk>|+i7-C0zZiSR$LJ8QzYY;y$!C*OPL4FZ5CP^A))=+vYuOKTnr3;f% z9hwpe$hqwFpaCJo&B4Xci)`f7Vb<<6MZ75IBfR`kGA^^4vp3iZQ}lbGF`H56+(8bu z<1{x1y3yE4rJ7Yw+t`3qslY?57o|;ftt$f~A|h(fBI(;W6pEVNq58;kZYpF6?5!@L zjU>9h8+B~({a*y!%-i4`Fw(XZiW^Ifm2Bc(9?Il8Secl>;nPJY+(b2EH(sE%z7Jdl z9oj}%fPXV}PkO#>>_wZo%)_)I?fMr1haEp*|JC3s+I?R{{a*y!JogU*CjBDdyQJOu zjp%J`V>6 at WDu~Er_jxF$YUv}-hG-YTamm43YZrUkP=|59co7^?#=yMfv=sE|-*+UYR_*yM(G4xa5^(t^*t$OmI{vG{g`mF+bSzn*`~x5U z7{?N)fCBZC`uUtVW8{HLuY7sWjU%3 zW!@;^grE5(^P>L;GH3cf5twl+AHgWtn&Gc$T}B0|GaZZSZXzh!-#XVEn&9TcUTj)b zmTz;5AMt#RNLKl3C(iwoIZFE3_2vU+js#y4Z_xek1l*sd|3$!IPB at HTS&r5#xfWs! zltn!{&XM~h)M1yB%p7ALf`W4l3Ij`wOfCP+Y}cZrR&oCo=dAjf7lBwVT{%-3DhF0 zn?c1*hH5A6TPjoH_KKNQWBNA}Y_RE2y=y zp7)mTPI!Jm%f{=hWc%l>m^_Iw#htPO@*~Ctp3C4-EP0)$ zD`m=YDRM6Yu0LUR6?U$m4%Z^^0J?nn`*|Oa-_9;xu%CMN7~q}`3#q)n^|Eyx6W(1P z*07 at qqnu8<$t9sOld;%5+Sd_B^-*NTiJ_h}HG`}7;g2to576KdZa}L{XP at H?vQ!Zy zIYYVekDrPs1uuT`zTy&Oe*J&)N)9p7`O=sk4E};(^h0^vL$6Wx at Hi1@OI+^XjOjUF zqDMPqDI}TL1=((scnNAG4Z5ECR9gMyVcK)mB>qInis3QKzGslJkW2$%rTW7k{U!Pd zIoZjx?Vp7<{mvL0ao zELt}TV^k3vK0S`Ipx&8tKHCD#hTKH0(JEtETrh)Oj)_!|yb^Qo^ofI&?^uOyTu7ug zIE6T+Iyq4;L~4p1#XkR*@)^J8QfI&THx3&JNZ@}Y|9@&};khfd2hFtcAhdlxKA>e7k%c>htBOIyE-pCpFaZpCL}#T z4_o5*l_I6}_hyosT>_*%fzd at lzieuyjbsZ7(FdtC+)40H9MKD at 3ikdeNG1{^fnkE; zN3B0K5jbf%^q*NG04WRhzCDbG zSf4MHZ{8a&@Fpr^?37)67U~r*A_R#G=KkfW at a;E1?AFzkz$YDei?%d5xmUadS4?`g zk-+SniMozt!5oUPwLJ;rK^Pg*bn^+ZBTWus->wzO`KfZ`BjwNepK2Mn8G+l+7o^2Dph-XqTD`VDW(BzW^EVCk>n9uX01HDrh$5m z)`%P;q<)- at Yzm7%kYv z;=;e4vW#NXVjGu*XRl+dn!w&-te)>JiDAClLgdK6EyD|yc=c5+ at 6yYz|eKt(*X-K;b)Pf`NzouMV(>G){wvOM1Ecn6E3n7i=FVu=S- z<1)K}y#!~OJ*uR5ktCKX at +~CLV at z;f-bNU3u$ec;yoX{_Egk1Cw#DT*Rk37dPMKmP zHQB)dxDAc=OJPS7xiL+s33Oz5RuP*{VOlp9cQn5v+r|_}zZ_BEu2(!a z)g9SM_=yB at -giM(xvl&S8`c3yr|k46`6&ag;TSr&e8!Nq2yaOAW`j4zcEv&OYqArJ zL$~kad`)zfW%}+=NZ))$Ew1(b$DTQgT2D3f`%G(=b?G`Vi(Ki#uF={Pn8}ZANjMz= zd#EpvPE}3XdgioMbtbIIo!>6!%mcRhUi{RdFAI0P9lC~Z`JAcLs>-?o!CZC+gvce@ zBQf*?gRRjSqgDJ6H*V2xp-=E|(g?Xz6}Bw~paBWXEnGHe-2UE*P(kYG=bCkzxbvE*Pfu2pVZ6U_bUpLmJIeOF>`@w= zAWBR?8x^;cW~{BjpVaVD$s8|%lZHB*>P+`yWEX&AN0ZHUrn^0{%gR|!W1zaE ztsFaef at 4QzAiJbZy;s8)+zN8iyWwhtcj~;P;7@z`=r9LV2)zh~7=aNrkq6 z_ipkUa at K~Y1$*kUUhph*Pl zt)#Jo1*~h9!vdshn<+8SYKvh2{WNT#y?9EjNYRzQ{o`pt3pDEyr at -eW6%s||86d=m zP0ygYgOVU+OC_B%>^8E~uw9*zQ`X}S(AL)q)3{xo<)c>+CbhW at VbEfWr;s>*nx2s? zRL?GrZA8I8AiON^HV5(k&O6f#uRC-|?eK?K;=f{$z3#$+DKB_J;49r7tWLUuMVlt_ z0`+zaZT`g|`NY+;ILopr`2;{hyqr}Q>O+F(7Ewvju-&0TUQE`o&zBr2}W64Q~%+&d-YAQYRc9&R!ESr;w at qaz?beW||7)_E~{Lv_E2hud=hn zQwg^&V~g^*{GKimj{;@=vp74U=TT2-aUC+bR2#`LnbTIqy2?vB8?P)#?_g&FE@&fD z&hf{|faRwW1_4KWukdq#tv+|77S-1IXkhZ8sbuKIupmT_o4~%PnFp|CGPk-q3iQjF z{FCuB4aLKTX}V)kdZ;FTP03n0vfUz4Ka$?%%l=%Gu;9BBj$dDZ z^)1CL9i~Ha{&2}o)658Pp0m33u8Hp~SjE0?6o at 9tuf-H4B)I4WsTp2o3^Tgv>ps%b zm-EM;t?R!I{XT8BDtcND=fGJuC--#uoo??awBHm669q>^*3p7m>z1w!Xr>E6<}N`-G8=~-DzmNQ0* zp5Huvt3m%jZWe8-ehIRl#TAjyHb9m6c`?IFQrgwDc;t(RKjqqoT3$KLMLUOGtY5V6 zwM+i5_0*&KhF<{!1oR071jPD(T~GgPtaYeP{$mS-8O&-B0YPO5zkte|F6c;ZCV`0X zpJ*Daeg_6U08_k?d#juFkRFfc^-g!4-%kkM6pyR#SN2Q;?6&JP(sj!#fx_k+?TeRb zkK^9wZ!fpI-G3;H=tuyocR! zZ^Bh|gKuJ9-blGegVS at rzt_(k8ei+2;>W_T3LIYbVm`vQ&`n!_BeX(B53tC zckBb3D1EjiFQ&W-Yh|D`ddw*jN9Kin`{075M?D(7B at m#|D4OYfs!DeGdaqz==y?cb z5nnLy5UJK9$uTX018i4g*S_=2G-Sot?bip+W~#2Ju&;YL_ufm)z`KJ?=NdlgSpD)a z+O+7;gdjo~UA`-vcW2 at rY5%Mk`Ds|{op_fUB2}N-Ah1i$U9I`K7$mK$EKwZ9_1sZM zd3AZADkF12!!)Y)nYoXCK9H(i2GL1d(YR6QH%|Rxj^n&qbnv~UL{UcE;ROjVsrJ6` zB?2{{BhqsAVZB67ewFgmQ$>w!xnm&%{*YpOo;il2`5ZixlFjCRUXBETo&sZ??{vmx z4g7vA@#^~;FYb51R20vzm>VrajPtQTL(;INxvPmXD?U`5u%YP)S#?_7O)g#+*m|Wz zL1yL569oUJQD%>G6Y^Ft_$Q_W1R^m-k zg0LK)m>;{zA((ozQpz8i{n-tS?cXsA^DM@)%SW4$>h$_qvB-zk=gZ+|AOvCSfX`QY>OW zN9KTISi`)xd4fGtU#k&_1jO@$(z81z;@oNUA at h=Mg8nw2bQMnTy!_>-u;BlRpZ;$v z{RfHub2Gd0s@$poO1i8t4qZ at wK5d5*9atNCS(R*{ma0l1N- at F6tC4L)w`QI$d2ZK2 zurCmPkXJeZyWUzbiLd75*u@#A^Vw&v<(It zGfqHIVZ4wJT+4zG^N+ at iOT9VQcZwU~?HOzK*!sYnE2Bq$eY`7}oKz+>shj94vxVvj z25+RN*g;;=3vcBW)|CpcHswvi)lxQWqbDPI_3~Lm3%SD>wPX)Xl$V_5P|8D>-pcU# zD#@SYTyx}5%+`!ZW=cnRi{`M8HbuhYJQxk5|s0Il7takD&c1ql7iez1>?z?A at f|#5Ay83GBMRpg6uE?J46KBE0**?FDxlVrSoj_o9QE zTxMBH6pIedjk#0#A6{!BlYjsqvF0Tb_#`wvrb1w2NSVDqLeU{N2bDsp1Is*srdq?b zM)*nIAfq7Opfh0?iUwNDJu-LD1NE_9N^`oH?pTHO+3zA0Gg`4aZFlYs)Yal+SvTJn(0utbw>W{glxBAGQ#-! zct~K;9H|u$L25M#$Pz{YsZ=6L)xBA^H9-Hkoq65xAHNwzLopm&T)x*loXK at vBe%E% zSAfewXS(;KbLOqn<;KVDCBEOcCzPnXXvN=#Fsfj;&=-RUz3jQ32!cFfVXQUA;@!ev zZLl#;4UKh*w22tG^Np2Bu&Z9(2=v(CO`)wTR at Z2~_fqRNW>|&GQ=R~T>}^#^=Z&HgN?J5y?9Cn2IG%qVTlyoo)URlJ z)Aa`wB;-$G at B=h1CLv=^uWh|AF)2-7Nj;fZHlbhos$()EIz#4l$bnL`SV<)P3iWZ? z#~J=P9q!z5CTAo?RK5p5ziel-+%%)u!x|)T%k+xU2aA(X&)W3)zqq`IM zM=JIXPvn!XCxuEKNWG2%$f`<}AWR{b=<5t)~I6Za^ zL2MG+!J&vdxvsaJ`dtv}Fs+QQ&FQEAcv#<~QDa_J%h+59BrgI7(nqv%BumPNjR*tmq8I=DL at zb> z5$cXRn|8BQR0{@1B#{aSEeHsS64A~b7Eb^LT5-Wi-m>ROKm7yJ8GGP{z)O%BEO`lB z7^`INyJY*}c^4o$&+!g)FJaSh56&b9;f69j*KutfFe|}%8jod#o^e<#;^$vm>-E6e z(*>`ne$}}Z`8}QYP~w4*&VwPzg6ttsBU&IIf^bh*gJ^m1sZY3hcW6jkQ1Apegd0fG zefk?hUYLY(+Zq^pEUK06l`58QPeRNcQt- at Z^chuu at H1jQ{x?W+2m*#5fQD?dtn)d6 z at kz=Gd)D~8_4N;kAIvh+Sp-`@Xu$`N^TbWyI>nqiPxQ}Xww+%gz0%< zi8T?v=;^fP`EiQ?F>K?hQP_gVc?&P=;3?{dX=?BzA71c|`xB*si4IKAB-xevKtNzX3%H~m2V=ne%L0?iP5 zpn+#uG81~>{WJyXj;9C{OZDeRqeq0Kp>B)+GX$WR6{^rG)QX{(#^9{WfoxaVVV%ZV z?e?!BKLH(JGF_kY==PA at REih@86N?-Nf=PjkE&=VdgvB4(=`!N%!`OBQX$D^Ypa^D z#EO6s*9 at 1Xy>XZBoBpz5qTlu?<+edWZbWx3{-7?NN`fuf at v7C3DrB6s2*M)OE1fkTi}5vp^e{B{Kv{(J#hUGqUbA3(o^2A-4*Ex==iXL$-cJ z^i30ZVb+75{~1G!wm*6z4DS+TKAP;NybH#HnTlLmjUvvoxE=sHys9+psmNwMY{uX6 z_5uCShwu9VL$nw$v>amm^t8n at FtGhIqW#x`JBU-a5T12;O^mEP2;I()d|SJEPIst7 ztYx}9cQ7*EnylfZNU1~C*h at s5E%m)JMY2^Am{6!N&_ShYK`JqNA!kAXb6aW zLWQ6vDYwJ9pDDW-O?vS$|GpkOAlO#)zSJ$v96W7KdpOwEQ}%wG_TEYn&xjcmp5)Bi$MW$=(MeGqw)r<37E<8Ex%dh&3)se>e+<`o4nEoZ<3B<;ZU zr(3grnjjc6Y0E15^>1kYVS>Z~{e at BAJ=dp(G{U^#o`X zP!g2&-kK>zDisKg_gBb)u){XrwX?nyd%%M7g+fB7(?LLT0CC)cxXME?9*iJjk0~a# zHZ$KeH+SRtxP4r-2hz4sG2B%{ZK^pj81Lp1_Ee{`e87;pA0YhIQPuX-u#q&uBQX#c zv12d8pXiqM{CX=|oJsdka201b85p*qP>E>ey9W+Ts7(V8Zfoa)FM*DeaK#X4z*YF_ z!8;p2qM|Y;A|>9GmydU_q12-nk&#AuQ{*%D1-Q=h#q9(mBX`6itW1$=`f at JSi%>cP z%^dcwJ0*RJMkn$zZ5k}9WJ$|(yzOzkR5U`d5P*RA|C8gk z?Cs3|yZviOJ7bF?e5kc~X`n at xbNC_)A(7YOh_{1~FbxdU{I-#1Ya~L#3vOT_{HsYZlr%??nw2ob_}pe(QO?lsU?Ja^gn>)uUvDbY zRZS~Wbyr&_snp~ICJUA3P0H*Tn5ZkF#a0r>ZGnX{MIz2ML0;IF%*PD0f at rN01tosB z7cv?PCdkI6fS9RMzsNO~o~kC8O0G?_VyPtXn7}wy5bzs_>D49Y3{#EMv-QM`7E}V6 zg}9ZZr;%oN>S|Un+jE9;=ToyE{hYO3^Mh at T0OD(n!4y?4*90zbv9`TgH+8L*x!0b$ zRQywdj6oyjW^i;tZ_$#HQ^3E5a9V z;p4W!;fIF)2ef5u+h|)}i1G($Xo=TAzKPje)C!V=!X3B4jPE5AlF?Y=^q7d|3B zhbD?T!G#kE?L=!WZV;O20ej1`o7R(3Md))}6X8(sR5wnujnOIRA at 0i0#_u$wA}-iE-y7M!WyswE7B}GSm9RX+m}9!yZCD%o zCUS3;ME8;-k{@KiF>jaSgNGz?4bgEgbtn0lBeDx*;973b at y!S1KKYylo)U#2(w#d( zI5bm$_n?@wo(-y|L{g#zNOp&JhIYwvyEwWReCv&URb_%&#PV8bujivF6CMs zZjkgO!zIeoHqrQU8v=p%VtZlcU at dRu7VMLJn8X7ZtcVdtj$^#oM^rah-v`*gnjf}i z&O-m!Fc=u-%K-mV^Yd`9bTTxu`PV`4s?w?&imuQN7%`+AjuZ?_5?Ob$e{3Ooi0)59 zG7Os$gT>inY4K#_JP|%4l9YfVUx}_9=JWa#x0k8!N8%03;z&IMa%3VkgIwB&wGUda zM#r0SARcWoe4B|af1(ppBiKY!Qg)z&G9B_rh zsg-K;QKc`^W=SohHkD~EenseX^oGr5_01PxBE}u&f&_9jAF& zAPIa->Wq6&ICKL-(P8bHsgX`Jzw0r(Zp?J9`w8yd?pr9PS}Q~@RD5%CE--RvoVC1U zZoA;_)T&8sU7oTPUW14Wm1j|Qwhe0%N)?39(u1udYDmg6 zyxXG_W?VbBUkYb-;PPBpMH2g|beneY*z>Uap=1x6+;-+?l#~|z6g(ndYUX-Iw#pFL zI1DU~4)zYprW(&!x?}t!SE%0tM4PJdTA?3fhKejEu^O#Ik(8#(-G&4u7c?l-^f09q zfr8h&wExo228DVvfrLf}I&H$q%Jw_P_anztka-xB^3W~89~5>NJ*u?;2RKYDaf?aU z7g>&{5IgeCPC`NCc(|T)qEmBiP0mka?| z1t$p#tbur*O6s&^wF5?BYfgN~terw}7w{&Bw07uI<~2gLo>u8IlQrU3vWSn5Wd}dD zCBLNP(EtFa5E)!;lVnf3dq)&lD>Rts3K4w2lOMr@^biXjS%Nqo^ZX_PL)#)V^JzD& z5X_d_ak~TRebg^`Z#}Vw&XvbHQSykfz>qU$4$4634eYp6Tc8WYN zNlg9kiC8kU_dmT0Yj##4H;nC&P*CedEi0s8-ectCxu~mN~ z=6>sHBJMA%=!5znScRLVvCIEq6{m8 at iU=R at ZMHe_VH&4k at nPsvh$mq5Q&N52#)86W zWH-Hg3X$g{4>ZdcY&U3pp<)pO_Gx}kfcQ7+R5;quO|Y?T>c?L*mn&}wP$qz5<5L-zAg z9)#l-Pje@#Q|YxET>5LN3MJyS>PVnwQB27 at CLR}_E32Jn5F7W%D(D-6M;TyI!bA5W zt(9xZ1Adx at O)~c at nI-&;v~QhZv?3zM7F#DEvR2Z9cZZcmI#_0cY0*L8A_lieN*}C=~>jJ6p~*)UbP($m!7(#+slKW;_m(Pt#GG zp>NzodXk~jNH~y!eG#?}o(bQBqhwoKX{-+O-Kl9;Juv&d3eaMYX#LKj=U^kPrp1uv z{!}c^v7W2oTCZDEb>lu&@TRI)#Z-+`QksW>bk6Yj2%mlM`7N1Py((s;I+Fyk{G=ke z^o4mGK=pin7rWX{c4VThAL0Hm53o*!CKbf0fHcqZX}%yo{24h}=T8`^VpqQb>_Cgz z?&#cYRIe+XZuL~_{IGLhdGPUz(GTp|_i>eH2f`se2;sN+Jp;dYw^~g1JX4l6QcEBh#RF3gq4keb#}Fh+x5zO1 z-AbENk6@|vcTx3ugxg at G^zW!dFV?W9Z5##m+bqk-SE(P`k-Wx zK;e}0+@@pDc~4R&7tn%vN2r}BP~2m#1fxl*k{+3U z*Bo=VAWE~UlkuibAeU_9G};bcCn`Y*R=!mU6n;=NoiBqt2B33qdpBqV^8&_3otoL# zSFm$=`8Rni)!SyKKJ#l9i6eq8Snl{On?>@j(Xqk?r!;Kx932!FkMvVw*(tavBE at W5 z0|OlR33Yljx$wzS#6JJ_dgbvf${XG~i4l)o)*c74EafyEnZ3`pTH*#Y?824DLa!nGYK zH1_jYH&8s3_r|?In~0Y}wrGK4^X8L*3|0RigL6A1et%$ZSpVv_YxWPL%)jS)C259kGmI*@dUejhC!r#& z&XfX9=4e-JObM!WENQi=%+VoT%)WGMtC-$vuPZ|Q^VHdom8#jK4YChbnWKtx*>XHv zALN{x!wCZ-1(hTurXFE+ at Gyakl&lIKW>PETsl()MnKu2?toq)|HdvF?epeZ+F89QA ze&(spKAwlsya{KNr8FSkzbfm>D62g(C@(qGeVNdF4i(6#zG%hU1s)aa#sNCnirlx^ zPsI0?M6)3sCkBwuDY$L`1;yZLME7)9bCxjxH?L$JuGWYqPOTe5la!Fo}!=h zqi_$cJXu0%IC6EJS;;8jl3OfnVHL)UF$SmJ#2yZE8tHDx zjFxMoHs(4C&hjQsIKLp;j4bsOhu3kC8-wN{#+%semWDH?CprSyncGwPErG4cJ at 6r$ zAG&%;3D_mlk0MrO^a2Eq;WWp(-t9Q`m-NsW7SY)%SdYLR0~~|&UYL$VgAmX>dAj*g zq+ktyiU}w8q1^ZG-IBZ)+VY4-nd2QY+;Rjj at 8SZ61tIu+az{JlvnnKM-=eFM?5ADm&h_ydV#K+ac`!04~)M9&Lqr= zhlqk{-UBCyFu%re+|C=7KoIAXLNbr}A=sRInFarr_4po_FMgLWZkS1ptV<4z+0-HQ zIR>h(o~iSct8fA=vHW9_zNP*C)-l23~Qf9i)6n$u$ny$LV*B z9GEY!J4UH4&!K?rhD=|d9sKPs$uXgww^m4i?Zy~ldGZrklb)g~`dqdBptn=FLz+CH zP{%Fy3eckPTeW?C_dDZ_~5fKzF z2;IYgAo^*+szv<(Nu-PI1+M6zsN?YyL)bm2z&GWmIY%#jx>VC8+VPkzt(@2aGIGCRl3)p`1B(lFI|_ zF#KZgl6Mq}fJFOJw$7>4R#sYqU*R~u$;rK#Ltf*}yug|4{;GnHeMuCfS`6a`@3t>J zCrVoUZ?=5yUIxGNWy>^(|H*Wwvb~whzjT+z)v;AkKH*Xb31tZh3Jm!3 at r5Aci&b9{ z!wG_r_&~t0w7Y`u5DRh5cE$p~X at 7!#!s#Ay8a42WFRGzet~ERE4n%OXXYO8irZ^6f z5Sl^KYHGHmb# z at U6k@`eIxLURMG+O0zYALTYMR*(@SWwT!T(bk~EVP16|53(%BVjwP#^&YBeZj~NMW z%AvY;6xX8AHn~QSshWaOH;^PH?um~LS)nnrXciof`Zm}5N3s?a534O3fS756q-p3& zR2|M at f}F3#%ro6K_IgCwcxKUZxPCsnIJEluL${tIhZbsJ0*e`4=d=?Ssc2Fc!ZxPd zv|q++rW8=SC9&hp at E+S(U*iue7Z%+^phQ-RiW;}vJb*JV?87C{@P>H_s@>M+T$wLY zXlaKI&lcKi*-5TJ4s~-&%@jnnFaRH7!=NL0^*wMDq(VX--QKQIzYn^e6!%d%IhPPJ zUJP{zvA|HU%4O}!2wO|u4qfl*>d;yz){ftVmP8+*E=MdWk+i0~> zE;AQ8nX2v!?#!#3EP#Bsvp34u^C;*Gsi;hQGjo#;H6$*dEy(9)WRmALJC96GZVDT% z%>um%oqfh(MID@#n<80XGWtxmM$9FecdP?!spQ^2Qm7nRuDaLOLaTB at wPya;r|F)F1J1aQ(Ra1WnN!c0X}(@6On*!#@hRbvVzDXKOV0q z+Bk?Z)cL_YNw2W{HodN^BTJ5Et=xz3*3~AZw6hmG<+4%crCBfbC{>RQ+D2^~bxQy6 zh@%Lp_tt|y{JYT;LX#0k&I02sLfl>F-YB(y!Xc-&%llCUa`I)JW#O>g1IHk*oi#rUVO z1X#i_IC!@o-HbhVAi|+%?q;-OCRHu3_$k|+Q7rkiH(s`ng3-j(@4EVzaI at bB0eeeF z#*oAIQ;ksyH*0)-d;ZPekEK^&w{aqT))e1>&yf-WpI~`+qK?r0dOTOW=YhLnnt_(e z!kR^rZstwfCD3nC$uVlx({n=zwa6{q!)Jad1>TYyjNw%o zq_edYQhMzGDcxAt`)yy_ABtU at r`eA=Iy}Qa)1(JGD~H<9Pe(a*13E;}E|5J#uighk ze&`3iNrO4%gLCc>!FYhF>-OOg06q`3EGbq+2Dvk}0MQQI7Ef-iXWm at M+eV*3FA^WOSLTe{to=EXxo{9 zVrV?5TsmTWUeuA!d)QWfx47x|2DL?~mwyer56h&H==U<%H6vk6`b$+Muz}3(RFX$N zH?uEGD9gNe> zZ?k3*nPuZ~G`I=wK`vmERW$Bt*~JS7mE3&ibLjyagl`Xd(Nu}GcN zwxA?WvLz4>P&5ytk0Hj2ogeKtLq7q8t~fR9(es-z9>4N8^Cv8&VDYDYgk+L#B}Q*C z63`u$^#<$9ci19$A95HXqIgT0pFrI$^bObhd3T7*<*zXfp{x^=2V#h|3l{WKzN?pR zkF*%<(;WYX7`fO5ZXkAiN(%J6)FY^p%&cXSMFOgQq29|9{(zdMZ(F-JIc_bs_Es7ld3Pk59`NoTw>nDhZ4Lu}9xV%T7 zG{pC=ZsODQL()gzkkJ1tjSrYxR|4VxKUELhJnv7(kh=&MJv%1*je<4dy&vk#{?$_q at A#~ zz&Y)IwUfNtOIV{XJJEywkL~2&@vy4(UvCxQm5xgkj|qmP==7jai1(+TQ$xX=9uWpD zWPa&RDWD;ZwX;ff+57&iY3}0kw)Oo=oO44~D!b7Q+?YGA!`uCG+4-U)?d|RU9l~Fe z$4VT>eT6Z&&34LBp7(-0T8<#@&o_V^lb&W;4>N#vs`0J&}*MQyE7qAXG^LBYAxVm+xNp1$WO^;<``FnI>iZKkkB z<@Ma|MC6iZ`Oq<{ou>#*3njFuR=V4x49F2BXRgtT-m^yT4yJPI1gDS>;8D7acVmlbL#B*HlxFqgx$!J1Jxq5 zp`-PB_b4mfipyQ(*pfj7Pw%39CLNnhXuwh at hXTo|lMu9C6I at RWYpezr^T zp{L2jpqF_)rFnzmdFb?zf|cH>0W)u|DhEjs6|a)*xz5zm>DsoaU<@lRpUUR8b*3q0 zOJ8dn!CJ$L^@oKK(}}1r8sd%yRO_fKC^}iLeyj~kcq-GKBK+d%CWy~I;9{W{9pJTD zasYF&QZ#n+{<1L1dX;gT8)+6C6x97 zzW%}oez%B0 at L55S`EdxeiPhuDC8LS%Fn!1qBHb**F at iXvWQq&jEBJ%51tWO7bY zd9Mv{s=BnuLdAAHhf;7rL4H0`b}6_hi{Hk-gnB at 9QD*uB_Xy?&t#T1lw1*mSf<5Z!Z_!VHYLcxXtl{%->?098)ri4NBRJ^ z#XH>JPGx<^X|nzzDMol8Ao>5{py1!Ox1{aA*y at Aq;VHo~uHG_r!4}#_Vet3vjZKLx z7CTAB|Hs)q1!=adZKLikblJ9T+qP}nW|#4nZQHhO+qUiMJ?C8C-uwSntdoC5JTZ>O zQAXTPWL}vg2NIc#(F!uF`Ti#RLbTZ=cct-9aq3mS)!LtR2Eb6nAW2~Wc)9&{1KkpwYJ3l(ZS_WF9tU(Y}2jTuW0 at Sv|JI@U}Z| z)`s;5DHz$Z at e--NVs;W0Gl$s~C9-~{Wo>%?hN)8i=HOCd{82ZXH)b=x<{Yw>t{;LE zKCy}h6&Xx(!ei=YQ`(fGOoLl9F8r6WYc01NTG at ESJF7qX7zL(Q3zgO+d24O-(PMli zs)^9vjZ48!5$4ndSJcCDo_vB&^SQ6R?Om#SVw at JyEk047QGRAvsKWrF*QZ(Si;7rXV}U44o;16V6tf zT?Nl4&l3}B*Se>Vwp-RaL0S1uk6BHCU&S9L6`=XR!?5nRsQM%4D(NQOiOt_FsbgDOh_R4m3 at KAxKus5XmyMu?oF@ zrIPT-&g-Pzs!n at QB|IfD4bJPGcm;oB1BrdwQ0$FyC at OQDn^C&!f zBYaU-MmIpI-1P(bn*F~%`TSiL?m5 at 0iB#Y|U?sq0y+bHBVc(&EzK)dmALd(gv78|6 zu0f{SK8hr~3aFywxuR-53K at 2?L`$=V*@O=^N at iQ<0*9kmF`;xUf;KEZXUU?Z-7xoD zF`Xrc0)dC=ub6$W5{3=kFymY?dyt~|epQFmRMQx&#kJT&cN)EyjvdpZf-5*p z>;aKN*umNnKK|Q*_eu+W_y1mq)JzPl{(}(7#HR%@dy5nnHiZ at aZy`!=_JupMN at biJ z9Q*%;Xz1M``nrO4v+Zvn!g8~Hbl;g|Ka5BvsCB=Y at _G5*zHz(B;Nsx^I?1^C(HZHD zZdQvqjA`qJAL;T}+cIF19>~IXGyrjUfqr+O3;Pi0#2MrQ0@`r2(DIATD;j>5`Kfbp zNx+nvZ03}1fejvJ%p8T$P_9i`7w`AzsJkPB>fDuEPfX+X4-k1UwGpDJ9pac8GbdoA zSI$2aS^m|%qG5`1$4uAsfsQwTGS;;vZH^T!fUedPmKdE{0^L)r+bA>K&X?{eZk#KA zQl3gG0g6*Ceu{d(#dVUA{ndqtVV>#FJa=dt7^PG$t8IDmofOla at A;AoBxlay$Z at tN z0K at f1TQsKD<64v&`4gVHs!o3c(Fi(y3re}yhz{uuyV`!c7_2S11RCFdKL|7{8f|aS z04#e^J2d!d&9R64XUxTb0sb0CE_%8x38m3XH{H3;V3CV zFlALwaKi}5{Hxz4%80C#s-Mtken_mbkT#g897*iA)bvi0WN&uAsuw&0?ii$W=-#HT z&`<^hR||zC+`O&hTqU2l{9p53+N3We at M~}ZGm1)eJXJt43*k1;F~O_^l#*LYTg4pCZ}zMEFf~q^G4{7mG~wOeeaj^6Nz;>4a+Sr31vlCPjtrB{xmuZ zZtg at CoHSXSRVl=sc_~rc8EUUE=;rX8V`akjus5K0z94wJrXVwh_yMxcBC}EEAb5s~ zy{8CAT$*Lt)aM~%xRt1BTO!BL50#^6*nrz+d#T<5`omieuWn-_9W!^`F zbhJ62=sDg}`V)$M4ox4)25~2928M4C!F{S%*gZLIc42%3C~U#c0M at Toej`3N(E35k5b0N=3T%wm zqR||2Tg1e>;^O+5$J0M9`F}zyfzH68FI0EidU&dWF#S~+*F)kpVmpQqYtjO>)i$E2yci1Ws9ZdmOF6*j;Z{R}EX_bhT+ z_7HL{q at p=@wvEFyOIPKM7>HXby+Cp5GCVYS(8SmJ6(L(umWcIQDSE9h

J>Ve?A{I7-RpQiaA zg~&O61A}^9%Q^3upA!-gKUmpsBY-|xlg^vY`vBl}96M_YZKd5Vza`#5jg=ZSw1#-5*J! zs3+)bLm~By{pO^>24YGHYpF0U&kTv!QS5`u#WnV;(_~kD`JE=TOOgh3yLy;^hzRmz zQj_f;B3iOsu&$t4u*Q%kX|Qp$gbrlEaZ$Utv>cf%w-43OW;%V-rPEdr^whI+m~x<5 zw`M|AFY8vSWCK)ya6a at O2`UBWoHok}j%Q{>AD at zvO+PHDt%tjoTN;pE^=DLzs7JRS zSuPWBX(JsXlBMqgE z-c$W8L at e*0{|Hh38~si$cy-3#LZot1dE5+_s`6qXqdZk?%FHZh4IEnbW#^m+wGpwfS7uO=Rb^S2PqkO|+5H^h)rQ2irBOBF|z527=!#?v}&PHyD? zuMjbD|8F6J;j4RLma<~fTuazv`ohq4f)N at eSzbehlGKh|>{^dGx>x?v==e>Xy at C1> zy^ybYvvy1Tj}Q?GIuF at wUK9NzM3T&r*{d?~a4+vM(Gp(zZs$`JLZO8z{|J$*>ib0z zL+<}6L_5w^q#KLD)n`AYQb68_U6GX;ig!`BRdV&I!*xJesHs{*Dg!KxDK7Gt+k?dZ z%+VoADqsuREkvNJ$ZY5LUMKf_bt_c+b`k7-|9?W{r+bPajxG|Z`+dkB7U3O&ARWsR zfR$S4nt0qP^oIhA?aaaRHHg?no*3LIq|%A_6l at X&74>f+0>t$b8`i{;fBt%7iT6$5 zETLfN6nmjy(9z}B^!0OS3(9Z=ZMY}2U0AJ$3)bkoQOFtqYZdx{yr8{Cz%%d(ivgEX ze;8zr#$E%p{7QPWHzCk&gRjgabp?-f&=^=BUm}C+ELmb&xV80}` zhnn-qB&KFx4*d1l)AJs8Q^*^;_iE0wPm^{s&W-jn4q@|fM0}JA_c(Dx1=a`O%Rixg z_6Yt9>3&t5UlnqU^mn&#^JmTIyX{-zJMTcjk7q7R9?oD;z>&#(hOp-aO`(Xn_dJ@> zoBidlsJ9Ov+2sR&M#U79#cFaRliJ8d6O0eyf^SreAp%AK52K;~6R2v}vs9!K)wpqD zcWuoC1?6x_V&DS2-X=-mzu$_u at iX|`;J+rKfBMOPBqE)E5z#_oOnz7xdA^`RE;&Mv zye5J(e}x~obe001_P8d{*{_Ade!Tm?g~NLduMxB~04#{Nf$wq?5iyuQQq z5}R)19hhPTPtZ43rHPE` z%;Zg>68f90;F&Eyq+tME={*%%B at 4@{PS#5Z9v3$1T&Fh^PZLFKboReMqVbz>bm<`JRQ-Afi5jJL{H&mV(un;`Zx>WD5)ZC2xzC+D$}T*xx87xi%;*snKd z-)};w_dbV^GlreyU0Wr!NYie_j6T9>{CFmfV{bQ?th-EN4QjxhJ=bmg=l4F!2bS_s z#?E|5-eigLJUd>Y#7Z%F=g*=NChQxX$k25-bv5G4OF`ncclW5k6LA&k at p&z(6W`Z# zJTZh$yt729AL%e`5E6fC8Z7i0cuMe5rHd+R1kQs9a|RtAiRlvtbqW*y zCZetXA)?~%I%McIau)qo?^0(@O9{8>nIV+-$#Z at 2++f}TW!QR&d(GK!B4aM|YjWk2 z19X^<47xBSzw-!m+1QupVaoXw+#Y6o$q(q{?|@{vFi_DCekX><_rHmVKjRxx#}k6= zDTQ6)?m~d~OAfeuC5EXn?f#ej^2uhX6T2MyI2JJ{X2_@{l4y19h|<@6mE3pE8FEC-*Fk!u*$;HFuhrpcY77j4SSi^4Yj9*FzM5XMG66ZX(V zhoU;@D>)21iQ#QMV`<)HHYs at DHozo$ci0W?o!o9?xrf zetZ4eW$DBlrZFart;KeKjQI#+2ulL5S3g?E#It=c$bxeVSOq6U6V~Bud+SP(h>TAZ)SSHtz at sFEhGNCH3F{e at J(`qeFjKx={C?^v)Ray}% zC!tgwmTPMyxuwRV~r*37UHw+#l1!oRr zI3Y>63N8 at C4POXkbo%*Tjv%kDtGJ+B3|jHVuYk(6^6 at jo^Eku` z7jWJLH_cEwR*5O2LF=5mk>t1TfkyMHwx-Du(hnQlmUrkm`4)o)7=6y=KSdLdXa!}i z1&ISs&(lnnuFRp?Y`GzaD_U`4Ew+}BJNm3#=>yX)_8Yz5m*Y*(6Y8h>7f()mHv1&| zx#u`zXUz)6Qjla!+XiRQV0eQ%5TMW!>`@R9p$y1_JPpx` z#J4;qgP+3uFMDVsVz99j_OD@?%-od(I;XJi$vtJaPyt4HkG%nm`EO$9pYh?Zi;rhW z-zDf_G5s$f{;zcKIryi5SgQW&u*(G?yy!w7a|ehTm$2fUz=^IU{4sM^^72vL*Y*Zn_21iMyE zpaS*r^KT&nP;NrLQvrQFLH#2{7k>*8`c&J;RQ$887-pU-=FYRYQ8iPPJXO?9*zgNo zu0t18)CCRmG1okJ%lzt1oM<~!ls#2cPWbQwaOrSVG&5lpbM}+CQ65v2I91e6_%NQ2 z+JM>uYTe;z20PF;gU_OI13H4x;$}U2j6;9MkQeyZza5vFv&*Zr`fGAB|6eb5{^R{b zs!~b|^2p!wjTHJe2nY(e`MJ$U3J7|$njYjtiY~~-u-AfJi~Qn}>EpL}+HKEdt+5zM z7+H5=udt*mCz(vH+HkmO=^71ZnlcI{sI0>!RzyIV>&n-sTcbjg>MtkN5AJ(=GvLU@ zD^lc{10>?CgOn=nkvNLSHCat-lTw|Ibp27(I}abP?9J0i&9QFpWE at D%9t67%c0 zf}c!GsmCWMCDs)^MO7E-^KQFn9 at Aq`_Uo>GCalcYYwAaf{#=0JRH_PWy|uX&2Yp;N z6XZ`&NKD;apwtC%PVDGO`atTZS+PwntnR7KfWRV|r{=H8*&<90`J$l8-YBMKx(cPo zh;FU=%Ai$AoIRc>m1aHdQeB=^ZWTa60W}t>s*{o0eD$iK91-1l%?@Tfp{=cNd}s2s zwNfSf&i+$n&}s!|ySDM20 at x{W+^G?6qI&ylkksf=XtWel4cYHwzhzlXhKP@^?k!8u z6bhbR`w=es_ at pM~lygd~M&nVq at 3NKlH-FDInt9VedG?LgY6QRZPh+ZywNm|TG-UKM z#fH}Zq2w#A1m&>72AtYQzTz#;ua at NpO1ufOar-nL6H;d%#kbym6WJqK4v!g%#VFHK zDsq7BGyN)%72#Wz>6{+;`14Qz9C2z8y=ue!37OEqpWoTs9!${rm4$nw5zQfW7=J33 zS1_J;&+ifAiZ}xGjy<5jujzb{VSYw!WKP8M4X}YcrxSAHaN7m at 9TW(M(0yuzmz6z8 zu`xig?$Aj04w;=2ZH0&?sYjgxB;t3a=$2ME0vT9wMYi^1det(;{G at KN+rJgd0qU<; z_L90a%DDjeWSV%>gwkpq6VslV4PgV$iK>C<^-~zml#XiKeI3l=tUf|qv6KUEwriJE zgg6-jp?kSQ6(jZC5$6u_U9gnGrTKUR#8?86qSs>crVB*frL|uLL6UMPNw^!){7o#H zNf?kNjEOlg#>brr?+n_t#}PrmNulBp7$x&o`GlBc{aj^*BMzFD at Bg-u6^2MqZ~R}! z`R|Ra{~YHH#lPaLBVi6y)cn_416e_S!?7%k&AduG5#c9J at ELS>uxDu>vw!UPEgbLL zCD|)Jldh at rFx+k6BG`yS4s*zM>GJKY)0$b9kA_#ymiO1w8I+&HCWK($6KmtHXlzIZ zWbtd}zK~`g4JgLXpQfwJ*#R3s{V{958dBqo+}fo1&HLz6SxPFnxU9waO)1P!<2 at E8 zFQ_FZ0xV_=FR0DPQkJSro;Vs%p))i>$`^b~6?G)}Hvq|O${pqmKOedii`3ARD%O-k z62~p3W~~9nT+NMT-SP?TmWK(b8{(d7xF{NNMdPw~)pqe&i9PQ78b4{Aj+G!u>kBb1 z1?p<2D^*-{$RtkU)0CbnEiJrnAhj;dFz;5|3~g66ROlGx3jEecv&xnPv_YCZ3W46S zm&b^jXx;>zI;c%a$y$>E++iqF(y5In_p5sR*3)IfGcS zp$x#8AWh4HU#~ImrUMneA%ibeN&{t^Kxs(;~jKMf(Lf`h&|nb zJ3Sj+037ZHzvEdwrcM6GSsOCxN41m>N_;8OFEuXldID|drRq6Z=S5#XXLyHLD3o_v z1z|B4H;6+KtX`7AQ%k)ejYX~qFKIG!mPmw^Opy{qw<9La<&ZH`{X?R|a(m>pIu3b3 zPu2n40fSJrxjJ7zfM=;M914N*Sd2n^6oCZM3(-M6g`{1%bxVo@#j-p_yDLa})m{3e zJo{3fGjm)TmF_v2{Zd*D0<1DFB8hRlWK9ylJRbZeFFtz^wC#!Qf9II|tz8-MuN)6U z{`a3m{l_G${FCG at G8+jkDtuI7e&L at s5%BWLL7F0oae1fs(sfPt**MBug7Nec7DUpA at YbTM%t2*OS;9QUjv-w z3RU8k(T8Asdts{6B0~V7_gor^CRLO?ba?lG at Q1-{#Uc`FCbhnrT=cjv7a({00!r50N2^2Vcng{~YJiquG`=+u;J_tzI&r7EK=&PQwS#O>G{NintMjZr=`W%0-L zhw;T8yyxfxczS1U>}mu`14vYUK}p4nCkgF3lWs`ttCLzmVTCRrO)*D{j5D3T{IJ0) z2yNZcarOnF=Z1lpi%(adyBNu6_va5}`IuctGp8Hl+OWAN)q_eAX~Aej;d@>N1k4?t zDfGv2^`rHV^ZHOKZL2sps1N(D5Lo(00c|8(Udx>S& zlqp8~iX=a%QT>6v5Skg<5BpKI)%`&k%(Uo(S*80zIUqJn+V>4{_0j4s+we`Nhcg{z zc_cvEB^PMVp{ER`KRQErYOJzXTq0rJel=4c(ZAn^dqdkx{Yio=XoHRaT_jGQbVN(i zBk(|bS#1NnB=N(ssK_9-1hxP)-Wz6sTc)x>q{blG at 3_)-p2kbJm|)VVR?H%JnxMg9 z63NGbzIs+!@AKbs2azL{0#Eki$B at a7A6)ftLwY#2 z1LIES^vtpQkTz1=bSzWb8+8r)M$nE0#|jk?DdeDsciCYwWj6 at SIr|Lq!w?XZkZ_pQ zi59!4c5lnlr*j at fe}0HY#nD8tcld2lG~JW8g}yGD$B-du#~@X*qXz9KGt3H{WSETl(9!*0`MNM?i+O zG(4Hp1EuMksqHtYoHLZ3?Gs=_MjFBG7P>-Xm8;DaZKgJ)$)4>+Zz9F3^$(}gCe`)9 z+Vx2 at Sn6@0w$@CFXgBv at O6Xg?zZkQF4Ur!1-b8`)L5lXq;H9;xV9edsfwxBhomOjA znw1;$DL(9G*l&p~^CI&;_V)u%DfQ%#!-aa;Y9X z#4=53S#>_`lmA0`_$WidG#oV~v~4Mz%EIB^c!)SLdNm$)X^jSYIkq-!1V*2SfMpeQ zvKXO%5%ce2TMV at 77;2PSs{TEFV{4b(YFc$NdxZ`%oH<^N4^qZl5wkrev|q`S(9?S2 z$Yvq5ga}Tw;IvC$C2SyArBxjR1}^yAzwL?H?dt^Ax8`&O64U)hFyw5X0NWz`lYJCpx^9gW-WsvlfXiO3 at dA)?ygJEIKdDCn_x)^ zywm_32ftGx8Z!{0=CEYjaar*zK1gHIja;6GRUWGpdMRP=kVH{i6RUvpd^T*5!yn;F zIU4tzoPr2jn_7YBN=e_`V8~DC4keq at A}9rS{FVs9O|@(OYPSCws-N;MPI3`BrTI62 zh*UZf<;Y77Ww?BL>0j7qXT5|vld)prJ_o3rj<~qHoyE=TS7QYC4Yml|Yp at 9-% z7kDHeV>?P~TkLsg2 at lW4o&`g6+4gwfwCmk*BEccFfDgAn`44^ION zJ=te}&?S9b`rg-ML2^7=!L1J1R!@pRaX#C_b9)Pk3Psv)53|ay3dQk}Wu=!#Yd3>G zJC#(%Lp|!>5}P54GZ6WH{_$rNK;#bs at x(rT3o}eIaE${oEsmnduXU-v0A|m)S>0<>e z0mu1N%yFu;!N^Hqgt1z17I)g%Yc0wLRmLeMZp7V*E;|s5-xtN(pJl({(YBKG%_feYQ>LI0}R93(RpFAYzHTxS=bFq76Whh#2`<68% zG|IP9wg!!Rz$#y*+ds_%JdRG5#s+};2#2kWsteMb9Vh(llbB?JnKCONFL4#cSaOyX z^0G0Z$Vll?GM zRcP=|6c;ao0*T at j8(ghvi^{<}AoCU6W1Xgt;QKY8hqTNtU&W{T>!8357~7pD)JNn4 zR3INSH$r at 0+BsUtOdwuyVoCcH!3H`@H>pysUdBxVPt#~Pz z7*)IHJ+}7B+rAt^(A!_dt0o8(S_EA%J;m_Dv%NqPPTN9znh93Hl5&AMNDuKH*lRKvx9cwxQnziM{RTH~n8dLZrD z7?rfFtBYR4ncrS8)g-(Np`pGjj=E4kSUEUpc9-frK)G38CERWpvK#tf%|^jn-50v! z(()$uwTp-u!t2_XYkqBbjfmRW^U?C|=ll&*v%as?u8*g;y}!`|m;n*Rj(%G;#NW1i z!49V#Kn)DH>zuIe8nO0)ZT}+rK19)5HSD3c_MV*5Q)H_9OrrS~wb{42i&FEpintlv zvAKi0>w-y^{Y)@;0)BZA=WeEo5@}6Wm47Tb(>a at r+Bj;u1O7HSK-phEa>CF} zvFM;qvFTvcPGj{IhKjK7jFMBQM%#%tMEOciaSmdib2Vv$-bk8~6MG;@$84I0gCD!sH8;*cd_KkBzB< z_Ip_LV?BB^Ic%qW^|-}$Qt`ya1?*(DxY`>R?@mn-%@;xwrMv=KxZE7909$0F|MkV9 zj%`?%CAAqM_?`vVridyPWMku%-^3@%TZfN!uer;vcwY=@s$K|>rnaODf&H2F>Cd)Q zP3GJA5AN%#fz$qH*^T3_ftAq8ygxZR_wH}OC^j3Q%gDH=nHxX9{!ka#B$Jg?UzOvz zQcm6M9AQi}WuHWOobQxX z7PpJFVC9(6Oy|e%vG0}Z>>YFRw#m#<9eLM~@J;Kq&jq-8w>bbGqVhl8D5t*1Qn)gT zMlOYtf5hB!<+oaco4f&s zWiY?!cIn8^GgqKg#P)r_ZEiac>Ex2}fZa#3c&iMDTNA|PEfYrQbqH;k2#Y2!6DUoi zX>uGChY}%9r1 at Mn%ML(1|Crf=$jUj`I|jj?E?6Eo;Om*V7I&TKU z5MW-g1G>R9r(1OglmIE45pd#0ZeZ+vGCrEa6}z26cE2kv51JZ^79{m24%C&&ct6zD zH+s!#9kS=qxm at N89gNKG);~-mGg!;KsnxbzyrHwyQqO~8dVC2wrOVN^7$TH$%DFhy zby!T#)XBContJ=(RLQj^;PaF3?Uz8ZX?j={2Shn((2toZan)T;!>Q~^eqgP2N(J|- zIG^-GMjjtxeeN`scgiLgc!(8!R24d~jXhg$m!CiD&3 at 51ytK^oT=6}9;W*1_8F56j z#w{XR=?N8yd|emstaEM(;VgeShZ>db>28X_-GGrpxeW->SVd$PW?b1%c_3cX+#;jc z31}*`(1_DfQksXfV07p2o1$05)!~r3)MM@;Xz4pyi8 at -5wwP`~Bmk`6=tFT`&4u4p zoi_ty at 9V5*ik>^wz07QH2sgeKw^^36d(zmQ4}P}85*qAsA>r;28^28plI^VBeoPD4 z>HQe_D5oD{!-Mic+ojZlxqcS8#gC$JBp&qSCRQ`8(&VbRi&AEjWdElhO-~%;!*k$()F4wC2%jN(yB*G@!8F5jnl= z0O|6cn4NLcz?S-Ak@~u86+RCMGLv~v{^^qJn1JwCG$Eyo_cn)k at r7?x*1drDODVX1>} zFx`Dt2xr`Ie!W(w%;TI)mK9-zok$=OSoP$mL+N4%|LM0)CyV*s5wyXjFuNEfC$C_SzIroik}feZ2wLbtENc|cKHm?W^k zN`VQWN|XXHe21|P;s~GE&&nu at r$+Q2IwhA9E3F0*cwL@%tO`8pi1{4;I^{3gdC5hd zX6UV!Y=wcKf&HjKz>B5`IfdZ67+z2Oo|QV3%IttXv6Zj?$qTgbLVo6q)c(p^(EH+! zy=H4O>Z)X{bZV4yYy_25xo`LqF1%qoyvvc`nkRP0gihEeP3r#Wm_j}}tsClmUl2ue z)8x2>#k&tsoob0{U5}3L#u(ulsAkbptlM8A?D&MyO_5^! zVJF at ZrBSiKSN_3v_HC#52br5*D(D*Zv_%o9DvlZfn z3E~AR2u2Qd9``itO45l(SIe~RxmKB|lmoz=$LmSp=`XMJkAuL>j}~`50ey at r z*bEOlF at Z!bV-ysw=!!;+fzsu0?&mw&%;d|4=Y;8QV!KZ^NJqU9(AMpBvnN$vE1~`d z(l6?A;7u^+uUL0S>{A#38SDKtpxv~_3eoG$X4NVAQS6?ZW|YNGH>8(;0B6K7+_bI` zCW0h=D4rNqsrT9~{lsScOb*{YYc|AAvM$6Nf)V-8p+uIZhKGW~46wvPmNzvt7A_I6 zhA8Q$C~OF37X9Yvkb6NxB0$EJ-0>E{m(CQUR8{&^fcT7`-d!{5VZxTWs z%m7C}oPiyKCInZ%2!xX<0L98fWo(E?Gdl*UzRpCdB9qY+y(`Y>QOvCX9ypRPk`=%( zgpS`YD0BD+x)Ca;7iPv+**IAfJ2R-21divLNU(#lN~ z-C&FPV~hDm`<|3{(ht97_BooLKYk}b`&4m{I1S2kKHQvo%p0YC;(J<;BytRq_|7Dx zY9<$Fzb-TzXllt>XGTFEU^}x+lN4~sIda6CUP at wou)WG2w~3_h5N7>BJNxVrH%+wF zFv8&GEO0)4?Z_^Wn5h$*>T5HhF8B=H1Uhtge#fKgv#Ut_&Pa5^yLbg#PfS*@;k2u~ z9@b03w^I*^E5^3yh;LVNa}**BhJ(>f7V|dEw-BBS ztY6_QyM~9;L at pXieO>(`Z^1sLBoxKsYv&!q_p%efj*;x!y~>kWj8GZ2+ua=Cg)>-< zG_V64p8$vBF7Sm1)*j9XF}d19p%2zYye6+~I=_V at 3=gr=E;)HG!f$}yR;NiIWZl%Ra at OtJg0tlg8IvxGjIMbXTJt71eGjQlj> z;7G3+HC4mkX-&_3bSXT!P_X{Q4vfOGk90s9Mz63(d`dIiEPgTjn$1#fPfAS6%VeG4 zlliNN9Mc7jsiB-juV;x0JPWs5pw4 at 16p~1nD+ZDX*OAzat`p<8#E~+bp|1<$*O^oY z at If;vSd$vZPxVh_*eBuSM;QXvW;(AfvnvTut~)WON at b4)P3>54ab+%*Q&k z+>vkiSi)*4Z0EnMU~13L6k;_y$H$Gu&fcZ6gExQcBkrBad} zvlKPb4k6J+2aGuo3rxasy>iT&{ei|^PmX%`@*#`!rJ(0v`jyzk}1B?D`xFZXRMQ;nPaVw8V!!tBeFC{moRyW7$uDPo@ zv@~1;O6N(IceaQ0f~301%d7QfZDP#L*2PzNJd~^I#|eOYj at 7hCdL1(Zf9iqKq at se{ zIAnDFPH9L_(B?Zzj^GvYA6G(gcUX=fHAtr0_ at G@P0$(=LtiGWdkC)o#Of#=PpiZ+< z+!zh^(H~JsDJXEn3|f^9Fm1j}N3U{2GpDtW5S{GHYY#mLC`72->x6S>_r}v~YO-l0 z8#tUQ6GK|rr>jbYz_rSGgp4^Y-D+~biBnqR7wvJsC^f#aoun2VIY3_A{hmdqN&zhQ z`H4knwE=54DV|?vZMsdQygfCOw^$vwWIcPWItf&lkt+r%JDb5~O&2UjKsLuGAV-W7 zb{wX*A6HxKNimp#-izqe_gKdF53hIL{#L^wkFm=r9O|^Ghkg^Bo9E+=u%TU$^t0!p!N6oFrUb`#~=uCg{7Bth9UEP>A z!<$CePQm6EtSLCNeuQ~9)STLQ6a7l_b?97EiDY;X3D&?jP2C#AZs-6{zwXct7cQ_Se`6?~mDLlK8e>|9%mYR>Jb+9y zvt6%O9JtwtqV6GExlP~+#d1j5(K0>8EJD>_(Kw<-ezV!)B4Q(2X$Moa{l(KVHf>`j z+EI5zlRjYh0lNUgJZr}*j%D7n6{*Q}XKEsQM at 9(V(Y#W8;BvA%JJP^?jQ7`GF#XKDfcEOu0$ zDTin}SzbSO48<`>rfGJhM4{hGwnZl`10#2nUJ+(>YujF0SxnN6D+CG_nIU?#z(b4 at C zbYA6sgSn)2XvnIW2ye>=#nj(w$nsj8MB)T|GOr?RZ at -3-vr3cVa>NAKrH0dR6P52j zFyKP=k>-Rn)h2&oM;8o+511)GU at Uoyvg9aW?%9j6=DGtM%gHz_<}+_Ua6``}^VeN3 z2s{D0l=3L0{3 at turJl(}DE6 at UMhfkGG`OeOF|K=9Ju~4Vztl3-A34Fw)SRgqjj7ki zWSkpJw- zco$8kX?#@%L?auvQX>SKbQsB7&E-I!3%XBozE1u!PLJ4SLpvaMqWG1DW{~Q^fH7;r zzS4PL^P9YG;DaK>uS$V&I-2!Ebtx2*#H&+}eU(EKb$2 z5CLJ^d6s-Zpg!_|GB%h)o?4te=+;oZr&3i=ZVWnKc!TNb-$6AYVL-KIf{(%Z?6w3X6 zV2w#q)*@0H240Buj#m#n3(XKC24l{7!$^>bx_z2qwOuwN)P(80;_k`lCnH;S-q;~^ zMx}aY*Q!G9sYs15HB)UOBi^_ at OyO{rf1sLfO4@$YzwC-V zi0m=yA^u9zSey>ilT8H>Y|n?aK$uaH?8Ef0L5900*f*;XZi}&RkRjZVNPprZ-1y_^ zNe&|Iivvfx!=id%-u+J at p4j4`8?wjD?G&8dEIqoJ|24unINd at lyfhWpA${k5yiEZJ%^gjzV7rlXnujdsfVK z{dI$m)gY!mz^7`6CcJ^$jx$azxrt$c%iJ-oCoexg%N z^6iQ~$R(otNR at s^BNoV+AKX&dV1EOyj?LVsKe6f3^mbL8_}-rF?pUARVvj#7-dMVG zKYHfAUX+{V$Hcn>Rc{IRBjogH`h_c5bLPRp#+phM#B~Gf&d*#QRl at MXy-?aiXS)Kg zslChR)3hxe?6;9_$TQ&vb)z1f|Eb4Tr3eh>nt?IgDF~zWJiLDfG14}avS1?*WvLMn z&gVTs at ML!6DVh5s=rk_uP;o}UguSL{)SlHTq=A8AKx2V*KtfW8xZEb(vH at jjG4_CV zDRy#dH8m56!F9uwKf4urbfC3(%4Ohv)jw(2*4EVfospQrXKWsR#u4AQW!FsrZqG^M zTgbhw at Jo|yjsRkx4}S2E47{B{Gw7iPP!~0tBsH956?0_$yhHTS0MJBlaB>t?CA7Ac z$-XHSl$$0;>&AJwSCy{&=y}jcrM7St_hmEZ0ZIkbcJt?J?>S(mY({PI1TR_4z4E%> z>Ipe{Ny<659;%6H at TQQBwzI>Erc{CLsyw?fYayjsa>502t!yu=f)q&p6DAyeI-i^%<`EjruXlLGq z8zio~L^FO>1&E(z7!i+kU!fB^jbxhzU}h+2-~n0ITXI3DTs3OR;Ouk{nShb4$RY=M zS0qs*b1UIy?hx19leilqn)MWJ;<^@rWZ30n1^D14INb_9YO5axRp48dhL0`3_SvoA zht&fa;?5gNZK_?c%PaHPbH+8T(9f$59LijPRMkyd=P>=bDv==E3c%e8?s8RRSFwV{ z%DRUzE9447b89$Vul)DUk>Z)=B$nzO0^d;+-7>4_yk42tF))(MAlXJ$BAy(V%gLYj zFm2j0l}?@1?SNbM2v3$=eXU&HNByJ6JOOXiuDgMa!3Jzcmv;+>UZ2qAPWaJ at 9{aNT zFB}Hb36Ir7=@O8cA|aeuZ_5^^Mp at DR%h=FO$A+ygzs9Q?>>-=7OtT`Gs{DLUR$_Kf zvGWlJ-cuj3Er0}@zchVOQslbl!l8WV1u at kw)EuU<6?nuFvWd!1c5eU}$ z``(;;E3OrksvmboES3N<_>^1DcgRqI=di%xRK1-G$(xIs&q~3wa}^ zePa{&K;=+SE=f>k1pQ1qI#iWZ?PxnPn$|?^q-Hc#RmJER+pg+`B;&x5y3osu(*MKS zJB4Z5E$f`*{EuW26oDkYf%h~G+qT`J6&2Y+Rn9) zm|(-0fD0)r>AhM^PrZjUZz;>EmYgYB(S|8d#iId~;dnN${piqMc_(O$C_&L2ddyO- zk{G8#8!|;DJ!d2~%vDPOf=UM zA|x)SZP~OgqQ&!XYZ6YOPb|JlUGJ$iITbjSx=X3EBcP}bw%rVdTc)}@VK at He3LR5# zM{4eZJzaN2Am5Y0^O}7yblpEw#oE at _k-5`|W?k)l^Q##ydRf?_0k7o3 at MnwWvmy8< zzwmSC>6dB7xvn+uR%uIY*(LpAOYYgW(x<+P`KYdl+$|VPQe2}#$oWiRZU*1L zQvSH-FJbBmOIAxQZj|aac&8!8MW-qNwRky<)i#zi+*hH#R+14ud*&@SuO+ at ZUTZ9I z+S8KUc+yt*OeHUtRTQIp`4fM;SyyHU-?K4gkZ9LQc%7;!(KbIz3d`$++ at U)nD z|DXNfdRm4t5T|N#O72Yn(K#iKwe5%uwN%ZSWtRD+Nb at 5MR+V}Epx2L74SJ;IoYJUW zP#y6{RhA<=Yxd>2&z~;aB8O&F_$r|aOJ@$fMN2qTx5hgfS=DT^;)t~|*vyW#PI~Qa zvYfSgZF1bT)oY%%OY|PCXR($oWcejpxR8ToS92=v78Q!J$-0^U=Z{SmamWD`HX)v@ z<)0aDoNde>d=VC?kk~G$b3WCG)g)Vvn2<3O7OpzCaF)Is&WYP2dDLh9qvaIS zu_F%yuhrfcO!#^T`FcqCzVJrG z)u+VOErD)*n*8kks0y(Uk2vfZ2XiRi-ZCYBc=^l7pl4xCp=IvzO=a>Zw37KPDC2y~ z&h#$pXnox#EcI{C5DlP>Hf)Zz@}3x$=EurP+hJ2Q%0 at NOMzt{S^~_)u9%2?gWW;`* z(bKb$JXp5M&O~;#IY#`Q9dG=; z&v$S!dn7y!$5j@!jPDeqtRHzVPCt>rXVUcEYy2FY$y7a+WC{N95dGZ at Nh;10J&|CE zf*8FQRPf`=oNO^EaVe=QYyzp&m4zv+1Q#Zkm&DGhaB2~d<5iXOCT42-nI&)Ijmqgi z&ZKqit?XmBj=9;l9sC$)y0KFERDZK3Y`9t+Tw-`)lPeHLCG1WW+aNx8yIc!v|H)!c zZn)CKq7;eGIbop}a)wqTb_PMG?!xn|SZ^{{<0whCn2!p8XDBJQ*L>T3GG=l52p{OeI{z;=G;IvPMJj|fp^F~Szn z>a&ZYAUIY6q#)4ZVb~ON;><1O!Y=%ST9$-N at 8#!*;xO}s(z=pt#-ow at bk-@~ahLhD z%-j9SGd>WNM;ss~^OJ$0vWoMOirkSpd>tl8$p=ae&X$_N9XEau7cdEZtLGu4Wh4r= zh4 at oHQOQF(=JdVaTtlOE!>j$MgH=3ftg15sYy?qFVT%EtZ8ElBJ2Bv<=yaB6JEoGU zsP!U)B?v%{p=R87)S9c->Rtg2g3EU^n19LkQGx+R{HOJk2eMmQNci{V_%ZBUUUMif znB9BU9_D>ZQxGU%Bt)ZV4=$+X;7UP^dc>%`Y2vmxdNm2 zhC=SZCqyNx8JvTQ0~QIIw{&(j1A6$EenOHD13h{Y-?h zYDk#%US$*~`EGUfY5G-nvwR^@V7;^L96ZMoG+W%Oapa)GSu0}o_aPgPbk!PF&@Ek9 zJN!|;BySH9?Z~68<~l-OPv;0 at Fk+12#=eBnFXEsdTv_#RT;cC96W_uF13p=@CS}72 z{c#j!o4J?a0hAqEupKYR4+^5E89OGAhH+cz%bskNR`M-!GZaouPBB$0P0QlOH7w3B zYHxrZrBe*Z$N8S%jruqdpD!fKFDOjAU7lAC#1rnQec)(h+Z at R<=yM`EL~T*cqI9hV zY5n+ at jX|vOvF(!v(=jT>=ko(*2w!(B!;mEa*r0R8M-m5gMcjh)fubT)kzp1X zE!mWeGuiZS*eW)3mn+c-KTStwt5G*u51pY^Or|h;9oVC;9#Bw88(8}oaOr*m0^HKq zqkYTsL1Lr>ob#KKQ}EGJ)gu;A$|A|wdHT>_QeHw+zE_*;NF!NwdMvr{Se5F1C2vU^ z?auq1%kAg~#-Qin$nRUvqD{uF-%9lATsrkMs%jL0puW&a)GvPQGzyz+)Ut(CVh1jN zan(*GqUmzjoqj{4&Ld059Ao)RCqXm0_8vHvr at 3uc*=oowG at YZ;sbyyXsM{(CW9(pg z+e&u1>@3>ClOnWXiW%NmvW79a=7cWw0O5sd$@v(8324=rAXuYKYuAtqR2Rq!?eaKH zN+(g$%k6RAGw|*1TpJU?TVmr>E7mZ^;!r_`UZ6uKq(cdktNIOGCuf2Q(~Eo!IRtye zx~m)7bv9qTMD{+Ves8e}$W1dGVoyMv3D_}-pxa#GD2AnL!(c)6g#9S1J{{5p=(GhY zS3kKhs9rDV{?H};P4U(gui3v?2 at 5Ut^R2dhj&{2}e>g*#pBg1;;7@~M`FX;E=?Mp< zsxZq~fE*{nODu(`y+sB~T;AGTL33>rb~sDi-3kb0A$3XYCuk)4eWj78X|Y)9++7p5 zT@*r^j3OT_2tHvXQ;6zA8J|QCOB8&+L;kx^;zrm`>p+2kxDbGV1pmJY<-cU2e*Vw9 z&EK{SmKhG(QWTch|ZVMX&<`krC= zH_?li48h>LjN8XK{~^q8klT&TL$l09c-K>z=N#{=?%(&^&pcl5$NbO!KkCr6FfK75 z_u3hJII#M?cz%Ns;_TI}Yk?FF9;p83&V~jxdxFz_ at fim``LK`;iv80l{9?Kxm zgE*=M`Y5W>Nm%d}%T=1H(pMCAXzIoFGIi9Xh)YQo7pRfIm_`oUSPe6nNm)e}CQVpz7G_#$s!Oq4Yr?S;5VGV?okVETRwBiC0ZXIDz at w0X10b3xt4}jH zN&2?e*(H0TFwi0VY}FQ)d|ch6Xwj3(kt~Tc3(Jzok{gDPW0ctFtqwFNPP)`sScUmD zRV$0|bV%DxN5Yj|+N(p_#h=8wfjYC`Fcw^JkpSM^Lq*p(hUIQe%v*IJ+%c3hN1ccJVfnRayf;{N$jSs%W0))HYZbhN=L~ml5^%t`^u>hvv-0_9`h_T zbHKP(InGfDi7>c at +XD4PR4A=x(P302 zf<{R^jZrGH)k)(VUQEt at Lm?0Q?O=Y0m$5K3?lbPDvBB1-`=QwA$ zESE06J~9KyV$C`#u~uCGE_IHsOlN~XVRlq{@TAL)>cAY+oB-Gp6Awg3Kq>13T`moD&DJI)qX7Rg7f at FS=W zlTgb*waQd|b_#8FK(EzC+?Hj8Ej6buYrWp4TKq36?{||Zf;)O7GX7EZsnBAQ*dVYqO?yd*L!j^r&E8q_XfkVu}P!)!TVxUe%oNU-mPld|MG)`t-Z z&}2x(Y6q?3kFAZ7^q>AK1MbdHl+IWdZ-T6o0&ZCjIhcs~KlYqv z+=}a{$emt;bb2HYT>@*AD^UyN+IV at 7HatDS&F-^qg>=7ucL4vHN9aWx`K9X}WIM1J z3&>i>YME5Tay;<*69~;V3xr)~2wCGV+UEL=ZdY1X1uQ5m<>BBC;8L z6Q#<|dK2di>UWG3gP_dEC+#{2%`3n?j9_b3@>|b1$;s{GMZS_bCb7qZq8j4c- z`;-3!0t$r$0uuf2mxF)J;P`)&gX+{jO>e?yo)(Rr`B}$ecA;a?m?(w|S=W$bTyCYhAmU*f4RxH_Q$HZ*Ewf@=t?0vs= z(W!601&lFZgP`uf8iuB0EsC%b;vy`=?mOd;o(nYmGtIza;WdW0wXry3yyNfE#KONf z*CFv-ldp9Bh%Trr?|dU`4rO8wZNP-f`T&`8VAPUF&}eJca*idZ8CiOKIpHoU6S`wc zR(H+i_2TfR9 z(Y_Mk_q!L`q7JUeM6BNHv=t{qB52hj#u%3R_cj zf}(`#sYVHD1EV+Y?ueU9Ook|#&aD-0!vh2#aVMM84*yJjiD#E>1Pp!5Xi2N+PeCH= z`YNLrwa7MoYAWS`ip{Jw>eelUqMA2hC0VaZA*v#3ZX)npCJgjeo|GfhC`0j`o^4 at p zb;nssP)-4`WVLonxyj|(gkgK%&e?tvX`|~9MVcmGZ3INexj+<;Y76Sztd|-yjp_`o zqxZre2m>iGsGm$74l-gO3rt#bbcM*5ix+s_B)>2LtKWjjgr|obm}ESP`R}?1^!b!t zbn$EtIGZEV<;^4MDsQ`43#lq(1F-D^_ at 7#V566}zf|RA)rXh-g+-KcZZ2p@<{6u`GAps>!m*o}`jQNQAW zU)mvRU%v{q9HGDtuxLeTTsuGiDhG)}pt z{(=YS at 661q%P17W51acZ-A*g12 at 1_u$+mbuPiA{hcRQQA`G37V;r4>yRfHLk04SJr zPejy2VcH>vjX;ixF=7n at 2`{QJr%+ZCVR#$YVF#9R2axD>uAIPZ^&sqK(*6Z8vC^v6 z%=)cW9b at +4ZS&PGD2U{%8Ja&4%^XVw6f80#$Se9 zX?KexsANsN(+sFI;DE0}A$P1$qn}bZiAcx5<7TW;$ z75tl4KUNqgKL|mSKQ<&ch0Jverg7W9;R3zP2NPX(s*9=|yN4Op)G%P?pedzlX;LIc zS;;DcYV1f(Y%WR9QHAj4lgIpkCk}cD9_F0S3cndR3BO>>N3Y1modz@;b~KOUNiO>1 z>woy$#4(7n0d11b*+o*Me at 4Iooah?iTi_3Qi7tL7ZRE^gCC=^5AcoU>ObUbF`y7$b zEeuiA>*?IGe%xZ+bc6ZQmz#ynBGi!OBve>eKcqs$uPwe1eT+oRR6^o zDTMzK at Bh16{x`_z{skEfKe+}=zCX6Y5SE!}6be#*N#>4lz9d8m8YBV5f;KS1ZlHyx zs59GSKw$(EcZ54MH(YjD+JxHQ?N at 2L4=PIl<^Psmo?R|Hnc$^ zeZ7c0>}w~>bp9IfTRjAJj3Vv~ugv`SjFt*j*21bOY&F+J!D(!OT6SewbB3C68fDVd z<3)yLjcOB3_<4z-aB)F$wTf}Ik<|7EUyF#nOQm5M5Rg0rh){7Qskh*?p>uA_I6TM52y&aE1{Zt9VOuSpv?1IeD zQf~78e}Rmx#TqZ5vCvqLS)8c}9Bn`}RzlXD+;*07Jg1_?ZmYEH0*`h>^}2F3!m7#? zUF`}f at A47Br?g1Ca>>1b1vC-GL z%FDDQ;_Osvtgu>jntz;PjHbzWw9 at 3Ry{9 at mcX)v~CNKsHQt8c!u<;1|fpc0CwRw_w z%csP|CqNYjZ at SSh&J;s15qH0r6&0HgR!_9g#)4T%aAmE)>&#DP9JPSki;KCh!xfAO zu#_)@>HbDE1URo>VpeY^uwT7onCUuBjA^!ZnkFrhQhkvvy|hFzUKGu%WHw? zwXQJt$9l at 6=To~B-H1b{x{(_938nS9W_%?1vl6@^EZ!0wP~jv7=4YH5XQV#t5;y+v zr`Sqw^{F`@xUhHEaR>Z$@LlnLz!`#nvfynLV7ACA1``(*68`%CIw>J!W!P#)4rYiG~Kt?SKJW z#{l`Wpz?+(w34Yofeu za}nvxE^d;T*qS9RyK==T?t$a|PPH#QME)TecA^v!bVeDXJQx8ru<%_xqc(K!WWvlt zNN{ZtI$=sK!GA!;_#cpA3En4prF49^!6#V{MVSG8CwcB$%|&@nH1eO9J4Ei!<+{9G z`18Jo?^HzWNwVAI?72__5 at YIm}<3e|HixArQX+xCL38T^E!>5Fy`UVru9g$tL`a`0B=7?M84G?M2M;zC74 zb44D;?6kw$F?@#lxFXFWE%D(I|6deCM>vOCpkFJUtpk;cZvW50uuUfR|8=iQ$st~zuz5H44tk2S1~A7(f-FceU)rBJTz<+Z3wng6o=5E zx3{PziXkTyKoWp4_F3Yd^}DsK+C}%gOZ(ief)K`o_%iRdzF;pl+JY(y&u2_czaC9a zy7xFcnN9cjbAd7hdH)DTP|pY7>1)CloNTjD8_J4U|4|n9J{SB7Bvzkiq&SoiVG2+P zKwlZksSBBe1oTbv`471!PITEt at _vTzfFDmlf_($xQ#UBro7_Juy2oUusZKm6#xsS; zHR?z(7f?9G_4kKZ{Rl2pPa(9O5|73#Sdt|af0Yyw!jca$V3)@dGS&~}6;-1bRk0dN z+}7!gLU|{e%ig(|RN=6={Ve{Rr*BWTTH2_d;-l$<3DAymhu;tmw~GO4$OFV8JxwaF%O14yrbPlp#k3rQIA z1b5by9DKV_3$Kex#WuXVM9|HISa;KyHiI8yQ!xp1B)l>UHILl|s&Nw|`_nVCtaQZK z8UMo5|$*5m#p!C4t~OE5==BFy9UfOKjFD>6=G+QDa3w=;*m8`F9=nL z*?A8vk-4A_Bv)vSo%`T)gZN%MupIBq3r_BHKgoijZlvzf+eQSoM}7JlX at zzbeh3uy zj>u~XQoF?LXx1HUK29UKkSdm?lP%NI^KHsyaah z@!49n5mkx9h*fEA=Z7bw#*`&QzX~TL7_lt8O|iX-mvZ9NFf*a)c52Ej0D?H`Dmn;)rY4F%81sxWcDa}t z9^!KFKpO39!ppmgq^e2aHGOUg)gXt{=6T|&D(|50c4kJkM>%q zb8c(e&)oa_`9c|B_t5leW!>h(*rVk^Z+7ua3~=JZ9;crfo&m$#-zw4fiap#R9GT|A zBcZ29(DWLKyy`@Geo}#@AwS1&2%-YuizQx8w&EgMeKn at BR{9?ZAtRqJf+$f3sOTsu z*bc&$=!k>n>x9H|aTN1{Q6S9RPr4mX8ALfuGhBu_D*`<#8Wr+FV1zRs9eLA}Btbhf z2g3UdNaDi=P2)!Uf(4a%=mym4MDeZWz>6 at MXe_b3vX&2HvV5VS){GH_Ta`*w6u7x5 z-?=lMTwSiXCFWVcn{2}ZFQ-1=>hNSV>p38qvZnIvNWqME4YGNg$08Hj3^mO&-YCWp z=#Ik-(+i>Kj%iH&V*oNMCu;*}s17stA*^;F9Cp_{>Jjf>QMU zG49k{s2*p?zDXIPQ;fnbC1BpgrzGbEMJmf~u|lrKNgo{DGK^CVWNyAPW?;OUe&Mf at dWz|^^$XUrb(v6y%u61jM7 zPsR}quf0G_gZO2C^tl*`M?q`u6*9+l9iDu=RISXhB_3vJjtwa` z>f$@Ko-i%TA=M#&CE<2bP`IH}P%Upf)4-iY)IgmL7^C)|P%Jm&SU|Uh0%OH4)7D%a z+&QbwPCgziR*P{dfS99V7X$wA#@Zv*eS5$RHu+E0o-Zu^jxemC&C(4b-|}o&96D5xs;j4~--Vz1P>>g=|B-OipRQSVlpTys&~ z-jkh_>1ZiZRklfaG9eNzL9Hth>O at ymh0YKgOi6JYN@aEi``WZVm~9;HKkOU*lxaNB zz`QB6cC=P*Hb0ksUYI~jk~yH;W$5SD6AeYTXy5bJLQ2 at a235y)nG7;AJ!!xmp*~ab=^qQu{6E#X!08Zc5R)PmRU#*XPd~rI!*f{f5RKn58RA1M zDtw|yp|m*GlJ_Yrt225#dXbad7|orRh-r#(ZdJTF*7h~jge;iQS at lBou6)J*CRAnX z)B!s08d8jAx|c^CpgpR9-vA at W?1UXKwusDwKectb8~t<{t8qX)3gredh2cAB%Jr0W^O8ks|9j#?aw=7H|@B*x2}L# z=tdu%6Dp{Jsawa5u at NS;cW^YGzPlQ6joT>Usu)93b at q5_e?QU=_fbK2MUtLArCVCl zZFkI!i3XNb&Wr^>Gji=f^#diyVU^i=(lSCAznhB5n8xk;}6p&TM-4*M2B;tvn#YI+$)GEh{hTiV2;h*RczQ; zokKb5EQrqt;7`_y##Ga*RETubA1ch_pTlxN8jF|~w6Kc(Miy+PK*$j5bD&3rT6f7@ zFsSRh^K_qPDWb^!A0|fswytMy$bztNh+HwH^RBR;L zWxS-9^eeVyPgwL);UPfI_s&q;ecqtMumxMZCz)Uv5SHv zlEL{WmiDRm7kBhRti@S*6=@ zU^T7oR+nF4}|1ySWn=@5&%+rg&QApzkAs=LF5P$VdmZ7f at q)`CL7eEZiVccxih_M& z$@y*}s0>{aXuO=EZIPUVX2=;PNx(S;!nlBbqUkhKGV)|j at 0(w^hfhFSI+5A%Aanug_E2?v zS2Srt<$=5*EN90&iM>|d_X<`H!SjE#{{?)v13P~L0lEH<+W+cKmM*3$7EboA<`(~t zG5E!*vi2J)D7^IdyOWEI3zGBjP{qOdlj2CBYy$a&rV`o^>5yS!L4#MOZ!G)E#^ABK zCvb#cBCkJf8i2w<`hc5zfmP3-5UAODuLU-&xd9|#u7mx4&wAVL+wI3X>(AdGZ`eRH zM%}-NJ?bHF>FZtN?WM6&VhKW}MY{sYv}+rhl?F}!nkUr(YvA!XmQE-Wg{uz<;co_jS_^C|c;1y%45S z;F4(Q-H>Q2yHOM9q$`qmQ7AA9=n3QUrDmpJtjx3j>1lir04ew3R6h8Tm|bd(HA3N* zRTXPFHP5ALe<85=dr-sI4LtpA1Fj)A)Kz}Ady;dQ7bVKx5M$eL{soVm(hrccpvMz2 z5- at 87W1K%!YVP2rzl;r? zyM?}6SkNG^Se2l~=3RFYggDM8%ZN4Ic0u0clo}cBJ-XTFvrp$_E5`SZdI#J&d$q%X zFZtzhVZACJKV at Uy0)O*C%(72 at GCad!{*iDqSu2G47}q)!d at IT#l#EGgjb%DTrWxfP zLl at ndLoR&dE#eNgS- at gfH7MY&XyDW2)8zXrMgLn+`V at h-_yt3d|H7FO7k~as!G(&l z&C3{lh;2s0?a6-LQ^4Q at 0J-m;6wUu-S~MLBD<@D0 at MxPCKjVpSO;s(ak|;V(*!9Ar z4?YLwK||sdqn|d-B6{HLiqh)2`Hu!y!S_}s*vXO;)4DA>d)8L{W&{O=O0-D0Jr3zBfI2QiJwh+oB3W(I5^C0-lf|DH;i2K zse4w+bt}(q-1;pk<_z*wFXx`Q_(!w?DkcPJyZAm4Ep7We>=Oo_sZh<-GGLwHv4`KV&H} zuUH{&bxbNBKXwW~1UTIiTx7GCV=aSbZ`_`*0nr4)xjbW)X~UB8R|0R_9` zMGFbMSHzk9!&Tu7e0xeVRFg0xgG+^6K80YjgS_H*YJ<#g at ZkAb zU#!!1jVtB?d@=`qF^76e9h+aBV(uU-m%ja57#6rgSc!ik{rknhceL9!Td_5WIw6CY z=Ic(iM8T|YK@=C-EP*^5;0?cl|Kp5#JWzl2-yr;_S;X}}vDV6_|24}sJ9*}x?&`?z z0kjrfw6y{Ps4pSECQ%Imk@})=K}c9pI2Kl~%$mfGwoTG?TF5V9JsyjKIE%fxApdA^ zdc83F at rI-paI1`L&-!X53H`4*sBy zCNz{vO at +tksZ~EOq zPvz& z1XC(U$mUKpEaw?JKQ)eUG~VB0t0>B==n4<9X}uQc4NKx`-bI;OdYEzTxKQeyU0itC z;W~qYokFu at 5$ZKLvCriKbAmA#6)^%+sryWUpHlbRk~G{Am)%i%#CBt at J^~U~*`vT1 ziy3C(`<_nWlxr)^u!b6^*lQUUm|4c%N}>}QI&Pb`7YS06wL!(}q`*KTt~mhj?T41x z6Sc+>25+uqF at dBp{*b{9J79FVShk89BmZ>`bf)ZJpUVzGl8ODaYh&TJuxIisuv^q< zDcV^sS;dyv($6ytUS14xd{@%Z7tARpGO980lg~dwU+W?lwd;1f9640?b1m6^QxUMspkV^<#VItsu)OD5@$Dw3A4Z>lJYUoCS?UR1%~tu z^zS0 at o<$Dy_$z{a(Eo`D{)GU}|0RN?ZF?j^gpuFSNkR8iD74EhTGr)v15QoLZ$N~M z7Rp4;@T4SfEm`OrUK^|5fn^RDki8riije5qHrBJP)>i622uh`p;|Eex4`ElQ86AecAFkk_M2#w$(t|# zkkCx9 at c8E9U*E@;XgBjNG`EYo#kZsc({?cpsCkWdr-KQX?RBwZ8nGH?+IL)*oGyDV z6r_txF}5x3)Wo&$V2EY?nhg>_aR6{3|X6Vp>-+4xmrh;|N@!-!Hlmw#3l+(_I~ zw6$0l<&AY^EII(E##&T2UFVw(A7J?Ee{A+AEkf!Pj%$9uP(WR&cztZoQ4?jp|6v|e z0R2~!F38D`MVl*djVG7 at dlOK^YfmNuwouM_)^cRZ0MCT6_;l`sSkMj91e2>dzxI+( zp&Q#L?mw79`Xgoc=w)l96-UbGr?3X$M`b&H!}O9;xnU%^Mn at AEp0~i9PT at G1N79>_ zGBB~o>NOHRzf^NQcGOv^!rPT8_D5CV(=WJRCCYgRv8r z)pYH#MNxPYn;Tm?rvNRGlE?(XP0iU{Zg24{^^lb1!W$fr2*!&&)l=g(ovX0tu0=QU zJDB0Ae7{tbejo*=65YbTFo!Wetu<#Ruc<6gPj)*WZ#W-q>AvQE`@R3{CF+S19&rLL zY%4Tk{Q(M!YJH3_Bo0|+z&pKL!@@6T at bkH-mLgP^(}yUO7L^qB85HnYTYaP>N1$EP z3BC$AXR~3RI1D&GuO~%=Nz!@mXKAsCa)cDHijXuDfDX9RChkd42 z7NFOTX=yV;Z!O9`M?8S^{0W}gGd5(FO)fb at Vj5)RaBi3l?bUeLE zG3gpmX6(bTduzyk`nJjdoqXw2oT0CMG7zJ=!RE7KoMBS&G0MTzK)c=0Slm04_R_QD z0Q38h(X`1|ZO6^RA%A8Cc}{i$|9(k#gq% z^g7bdGcCpU2cDJLOH`dO4%Ve9?DnrxKL>X){Hgot;**E*=N(Fmuxm at V%%gvv>hkg~jBgA*dt_6 at _JYNMye?^PQXz z*~$|*lKGXyP7rixllIk8^;K*q57!bsAE#LZaMjj$If*xHo!n!mjf7q(Z?thHyw;qu z$XM;6SY4Mf)#VgOQ6W6F{8|Zw;fzsGf^@KDl`MR0%j1*PTzr?f9(5*BOmHyeM8S(BdX?1eutk-Kk75m)MdVEdzs8n zLM|?injCPJ6u+V{0tR1)#pU8&;H(bBMUu#QwHm|XmyuL_F&%wDiQlM(A9%>#qlk8m+z>^NoplTA9TkVRw?7(vE}ulRUx&Q{%ZwuQXSIoP2XI<2-6Rw(T74k{5j-ipzbg}@&7$% zU%h5kwf1IF z9kDFF)PXIjwXRiJ?fcyNwc%gDzm((r+y{)^a5Dyfc)z>BY(C96mu^B5p7Mx4*QXZ&|(nY0!$4XR!hs8>yxX=>w?gb+9TR^kbRup&BN$gQ!(t+?* zonnX6bP|pmaUjD*j>1DWkK~gi?~P_6%q8@}VlfQr;u-wX;k?LJ9uTD_G|(a{O<@9( zy)5W!rND10;*(-5Lc=RE18XUGS>%_oL?^W+pye$;B143&Hj7{}O6aWADLyXF2z>^;ofsbj^S- zR=~x414Yo1bah&`l(y4Fgr#N`y5qvParyxc(fMZUw9~lNdb0}w`XAQl&b#x=O;1KM zSNBs)yd)9qde9bjGWJZj at zwk^W>ja6SuYK&J)$3o74qu#PSxY{!<_LZNZJN$5H{mp zr-faoF;m2~voV~&+G@(Ab*!m7Hl5z)fx{>(`YL_rF4J>8;VuWD9Vy;>jSVk~<_ial<~L*JSH1y9^&dQ@`U>W+e1Q%U{apj`IN2Vt=<%~ z%rfHMSJr|V*~SeY=aPA~_1{eEcTwU)5%dgLA3EHpTr^pG+LT) zUT+6mpg-t&%7l?KAno&OPk}GQICB|-Q|}3h)w#@1KK)+5fOzqBo at 7d656&g3UBJd3 z-xj6F6#>7&&0iJ9dGG;3=ZG&5*WiPCCOFR4FZ5H_GuXRpNK-O%hV at oZ+VM2p?< zt(xEKb-jVqt>FtKy&=4tLLIZ8AmA)x`{mzDD40w@!5B&W%}m|{+dv{$uKpMREJoAoPBid;IL7G#)6w0pQfhAfc}#USv+%q9Jiw=gCC zkfm||VG0asBe9o}CoR(6Yj6)t1(GBDlMowp6NT!hEG_h(!7kM(RcV{ANPkvHE%ZcH z at h3rVB-1rzi>2w^Ur#J=P38=FywtQ$30G=1{TOy7xY{SLXd6_ at yE7!?v9(05>v~An= znzn7*wr$(CZQHhO+c<0Q-hJYp9p^@L- at XwURrOLY`Q`uTh^ic8Z1+b#OOr4dx{*LQ zfa&{lI^qkv^hn>=MulHWOU8c=NzNRFj)13 at xlSU|N^J4nwYt~7F(S^tH{lTHHGuxf5s~#A#m9>KmY)i(Ep#h z`2D}dDJm8Um`Z5gFho>T8uRlAG*#3D%eLTVl*&Z#5^bxzzWij19T`(*?N`RE*T8uP zG4tqEjNZ4Pj+t^Mol~zPJ5YufU*qRo6I!gs5Woc zDBruI8~3S#vLfGF+(HM>fVxs!IX3R|8qF<~O4x7+K4;sEvyH*8?~7QDHaBz}IcgkH zwV^6d8xriRhX9d at Rc(~SfC{j%))%6#DvfE&V$rhBDCc|F^LiLdDNRwp&Q^WxUkJls zW!|1mD=Knq2ZR|2(UdmEDf?sI at 8A?Lot|!jNXtsE0xw3-UOxnv-f*AEpFAhkeU9v~ zxvl5`Qsrnu6%}6~A8v|66}%bJF5scY-8h5G?_wEd1`h2?;Z~d?a3e;(JL8GH26_JlnrIxeAbj{W$ zY$CU{6roLD!GrIVOj41QY3hOAJpeuK>s4w>zb3g|#(clI3%vB?Wtj^R`r4;>lk~jM z_1I4?Wko~E+7iz=_CCgmb*q?Go0lFmsD2H<_gc;douDEqANRhSy`h2Si(F*?N%KcqW(D3qK=c* z;W$qZ;-;r^KrH9>h=NC)w*2scmI7-~I28a#-9Bb}7bvi(I)sPtL>n`3CoaB9q5>QN zeXTkS!@L- at IywhM2Q_(&wW7 at 2vfcHrWbXD}ISTxi zxJ1v0?@GoNQ5yIG!QC4I!QEdN7=!FdK$5f12%bYJ8>c`QP7jPxOniuL-F5oZZ+l|Y zHfh_?=55q!_kOI$)}v#7)+D~i0HvI8?lV`Zew}}m_Lffgd&C8>EA8Ra?;QQw*(#uE zSTJb9djURADkAS^mEVL7b#=A$3|A=ePQ2*bM8>j2I6Xk`^sNM~kRXc5sI`5EW5y%n z4ZB6Ry?Od<3zJ7l-Y$w;*64k+kgfm`BFe;c*`FrRv=D=|Ev3-MRO?buWMuf at E6

q!G^egLY{6%*s6ju3hPNDcAlv6zlwqkC~E}r!F6yV_RMLtPIIFet1 zXb8wt7KLtGFP|V^+eDB?JvR$vY~uzpa}44!%jGp%{rZO{fdoCdg!dIUHjSR``!$g* zwh5oel}I}_?7B}ZU;K>>LKru?9K9Pwa<`X+rLnz`HIdOgLK`lzgOy$3ILO?>-h_`k z_#)rDE{8IY!r%95P{~$`s*m_#NP1&~Z(5UZ!bvhZ&^avYY5g9Lok42r$dQ9&(?KFV zL61(r-BMJ--_LvF!To at nuYO6bHF7XlSjS&>fG1{H1TQms*jo=*t-L?JR=0|20-1pvVK-?hYl`JX1Zr{dBQ&&xCsEu$Obnkc{MFF%4n zAh1F-WCG$q06#c7aJn`o~LgPpxq7p;A at JFe=NOoD6|g&?%!%NvIv zT()FDCQ_Z<8Q8Yv7`A7F=&wK?o}-xv8h7!|L0}$-IfMNZtPfz+&v~h*eU&xG=2zws zZRdh*O6$AwSLl>)mW*t;o`d-vhqIsC6Xx$vK6szQTPKVjx*of} zowohR!U59hQKOW(>ds$ZvZ~V_a{Vn$qh*C8&W4@;?k3HhDjL&!ujfP z4qJ^H$`tn58Nr91Ld&g3zuIC)lq*JI+t2vvD at PNy9N|Np!a0TFN+8B_50zh`+i?dJ8_;n2|uq3x82n*cguf_{Dz;239oZ}OIkgN8Ef-7zx)mtSwX z)}{tXoB)FvJ0N5kz=U!SiW2-bhN_Au3ILi281MF?G*z zA4EGAZ_v~KE;sF7njO`l9xXb-95bFZ;VhWfG594tse?Hsle_cl-Mu?bleBbmcd(SJ zQGHUJN)4A%?9}MD at jMkh!!(>C5;8 at Em$4cqUeoi-@{*S7p;M`sSB3sjpfzayu7+Lg9to8ZFh_SKiff6x?@x(St|{Xg>omU zD(utZQadjT5djB_k7g-oYRru0CT6EbX4a-Zy6;$U^~hFa8_RX=Rb^gJ at 5#uS&~A?C zYq^8yZK<`x$;H9TQJBrlS!;`}bp~D=&B#*J&>FKcgzs<`45P2Vp+_&lon0*OO*JRl zx&d{hdT8~l=F)z zbLcb3Z!mZF#%WRLMWZa66clq9-n3ucIE5zZ5Osk@{X5vVLhk~)WzR^pbD)LnC2WcJ3PA=d*nz=j6$>ky6wrpGccW?g)-me9hVe?GIgGuFl%!h*AdwjtN!D}1=2RMyOG|#!uTPSgmK!tvGAJ<4k?jBn zY?=)1aX^JNUN_}m$y4E7ij1ndlB(sGSh%F$j`fpW2?Q&Q{giXm6LRn{5ZDMmURK(e zUR`a3hg_*7vMZC`VsS_ at u6$u{Mj7RuD}2SuM(-N(JwroU8^?^2AUQZ>VXgc_o6#tXmdMId6S}?ywOjE5`U&5P+CVwd`%UbCcQ-w( zn=(vw3);B+y?v!#8i2}4)j-`R?RX$yBASubALCytMt9X at jjlOMlEX7QB!3)v`4}L= zd?p4ETx at ys@^VTfk3L8A$~!dx%!uLT)h+E~NY)(A1oH8lvth1K3BUa`6@=P5R={h{ zFFPLRm2Jt$g`m at O^t4Zo-GoxucvZxfcqVd4l9)ed8ZlIo_(-=NaRZ%JqM*Dsm zT1|ijye%y~SE0ycCzZ7tedy}w)gFFuNh00QbUU$89iIeCXvd at _UC}3Ip~mb1nym?C zMsM%f^(?gYAUdXwwV=(ixVU|4+Tv_PQQd!0t`0oF5J{@GKie>DYh at jjs_W)!f?o_Gfwq#rJM^;0rfB^3fxu?`rhcL#01C=G3T!~GVgGuO#%nx z8d$U`n)%4+5W2iP2lv2UUi4#-qqBK>t85(~0Q)Kxr9~(nlrqcnt;6eiM;$jd?P(temuNntvK12s!>1FMti84Rx_9W||`)rnHH1{it)PkGz&t+&B zMr^5m80ZA*`;fv|r at k!d|MOVfspSq59nWJsP{ba$s=t(@5VW zCPhrSx?oh!r|d`y*2JJTwJBT_IgK*~>cT{OEjz)clG5>d%UOr#-pS2gjd!i71(U1y zMs_rJ;4~KO!H4kl!X>Zb^1yDXktmQrp&+iP>}3+;*6IDWx}vFZG8du$;bvz}ZPl1R z=JeHvaq;GFm%MKc`y9g2l;q7Kl%R0B;%QwvI#te at kS%wJqGVlUq8NwYuH=@CCVLp7 z^ak(NEKZBBVV!VN`bhcSMB#WMn8LsbnD1D}KHuH$8luhYU_Nd}6ki=E5QnYgFBm|=5mJL;=U(6;ZyYxYqKZLtl zB(G at hH=X zY!b?%q!?zd1mhd7N^q{!rU64?FN*vilt5t|A+B@@fYf~7np-ll?Var9QsreF#0 zc;7mS$wosfdlaOfPT|bB)G+8SgOb?i^3h8x=E_8_-5xh=twUR_o3ug$3|6Z z?dcs&!Gq63UWyllTRabY3M{0ZKQ3`(edGAo(nZ4Gfv5i;iO;8a< z0UJ6~aW8xf+n+I*OHrN3N_mfx6dksK>{dZxlK_hB)ua8oSR>lzq%XM19h`dJ96 z`;~2{)}EjK$`CGM+mh>MHYazOqUff&T`=x(lmfg|2&$ilC*C1Pt$dx>tUMd}!dhSZ zURGI=yL6Vvwhh at pe2_X&S^$_s(X}ilvoL?nbB&Do8QeI;v+Qi=ZgpjIFwcT?H**S< zl})m8ptD)TV{sSrkX%ycO|E at YR5Kt3`!!Dz_emlv>+nt_?B>Zz!$#^axaq)s*)h!5 zZ<wJl0ed)LTcqr_J?^DCGk2~AXJoOGK at 6FO-HSj(q zWwo(fv$#35 ziDybP^Em-=<6u%#b_3~$n{nn8 at 0$L!GSREhH9#G%2z8}1Fy>X*?c}U9vjN0o@)hG5 zG{+iA&7Usy+OL6mxk_WfNTEML1l86twFajoW*YWl%YgfwG)#Fbm4x!_sf6I>Pc=g2 zzWTRx1y_Ytr2;c|+S2Cw_T23Hs^h1?{lOel$V%p`GEGBQftA+^cDB6+QB|k;9N!?|n^ue8lvQ6!TC+G$ELkylLd{u>954Npx_1+Qr z(wm*b_`uBbA~PvbtS3TdIK`kNUwaDbX9l8!7*(Yt7f=hz(sHO?b7YD-qX at hK9g3FA z+Z3f#lS9dJ8)W~$aLme`B1d*&6EiV_%qF{{raDi<*u6%^&TE7HMw5WIJ&kbF0xFAe z60(viUy?z)Cv_Jq2OKXRs`ZI%~%zNL>99}`ba$^Jh4dd*8cdbfVF2lAKwD<sDg3hD6PZ2Ae^f4qv#V4-l&%*Mz&TF at rjoMkuoma?q)BMez2bD4n zkQ6+_Fz8-xkRXA8VLTiJLpFfP)+l$yiK%p&xMXDxNdkA at kfKw_b zmU{?!N%=eeICe3o^a-p2U`Rr6S#9|_J`+YB!6zj*e?mxEU_>#L0(pqhfa0{$IBss4 zOZ)|x)E~iXky8DM0Vc0hW}(;Oywh+;>0Qmo=#LDP|0 zntRUUYd3H~(kHrE53_YC<@S{09l>XX6o+`3NTEcq5c at 8FPeB+xr z_?b>=L1{tgpkmaMf)A4dBinSLHHQ7A*PJEN^!Z*+YSA1jd5~q}Be3(4{3?3ORe1SW z2Uv#zu?+kU>n|OHc?LXOf{fTs;(7YYw9Ay_r9 at 905a*rlJ>LTpRGv3Q=AJnOq+VI~ zcw)q&P|0Xu$=oxD9EOg$iCpM>AtFlFzEg{L*KnXGv5K8O at w3P`gV`V?Kn#tR$z at Lhz- zvmN^6*oYUg)~NE92rzTxnfsi99YV>rfL6Fh5ftf!o4ptO7YRZv`Vgj*z*8n<5|(*o z?q&T9B%J*dJTm-LB8U7WHF-M_I2AzWsE%Ha03Qzoxb&p4+AxYUy!<$r^N^|4d7{{ z#9DP7`-cpOG>ze{>EALZ+P?v&x(txUi&)0n#1b8-$B)R#O>jf*8|mey5fp})RJn>Z zi&Nm(adX{X>`Lg(?|sdvDQETDQ{y)Ez4;+WOeRrqc_Y&H3lCA4!>FTEsg3i7Eal9i zSxu$q`pFgS9Y7ws9s0T*lJU;DeQ^CJ`MBcBNEtv%4&6a#<{a#2c3f0RhYw3~f6FV& zHP@%#CmE+#R_2+FtC!2GTS}^v9iL7h-f6M2KTW^nI*_iEQefr*FBv at uo9=ntMJltL zGnGfW%K-~pR;QLMC=GdP`LQb#qU2J`2mrHBz6&XT1sQ)~$VJEppyLLX`Gw*;GoZ<% zqLhRx0Nybf8vl7r=BHW?AkN2WM1S&bG-i5R5-C%joiDcs;c*G%MjN;`793wIB-^lj zeW3n)+jrDOcDE$gM*yMFzzxIp=?==dSW$nnklX3~$xD0%bV)O%+tb!(Xd{C_^|#{F zP6Tr!#rv>|ji4G8(r*KA6J7LsgJLHIw~qr(`^Srz)T5Nb0h~HaY5Z;2Noi;qaQ_?-fsBL3Dg^OvzF3NtR7EKU&9~CzO9f4Gh-i)J;>?gy7G!mpG at c9| zIze1l!ch=yc+~AWei?|%ur8SdqHN%~w}mr+g$l?{aIpv at tKLFPvMc4A7Y0zwFO~KF zQqr9+1T at 0VZ47@Zc62JBS)r+BsHKaASHE{OZz#K5&_lyU(x3~6Mr)pqsG5#A;MmE9 zg#8l}Jei5VE}3mPJlkr7MN~QjdeHF2lkSYNok;Y)G9gj`Prn)pmFjtsFhD#vXvffspD+O0jZNvS^%I z5yr;3+Wya!%5^Qiw(j2%E=o@%ui}xhNmFZV=Ep7}T$NgHGekD+UyD}o3f35~1{0W? zF%NH!mUk3JU|(b9&4~gf6CdhYIn8xPkni%Q*D#^2&;+U4f(dL^(2hSoYNr%vfa`bh z2L+iOQ{s}vPTD{Gur|ChR#D3-F`bCm{G4!hQAAG?ry+_*Ll=lW{Q+4O!Xr at C_WV7Q(ycP|Z91`DOZ_#V`UgPM zVa>q&lKbf@o&-J+2tAKjC}Sz*5C&ylad?G at Y{!C)T`%F$TE^lz|aQy zC&w{{Lwy&MRwkwMP*llqrhY*s=$BF0_M$?^cIrCxn8F7^@iVdH)yy}x0w$W5`3j~& z2fmxRPf*zxbMdp0QNg}uKQ<(C-OLI3PRn`RD2{GD1B-;iW zzZ%QaU5aID5(i^O3w2HCch?H~Z87AfVPD#3=2HXDs(rAgk>C=Kr)&xG0SEM8 z7xv&6atZ;q0f(ZavsSZuVCQCVmfw_7cDY5p8DT`KlWQcZ1(IVn2ubt^Tx7m zdiOmMm5(xz4=2pd5Su? zXy>?c?{ZI0ICg4Aq9Nse4wGpe}KYCqgsq?J%4?@doJx%Tj&F_1i zui$dvasuyi#6Jd!Wk0Ci0krUFjvm<3g**n0Lfh*2bt*FaB_}_u+Q)P=m at KF6Yp>NI zX4^DaaS*t6$Z13%2j;1TBz|iZ1XZIrK at sKD$7%vXfNT+XiM4C6GBC*TS0kyU-M_N~ z=v^pjdj)!CoZO3~s5vO;aIetwZy-9I8KDiSj9$4V*>m;OS$&LG-6d*_ARZlSv!iO8 z?>EMUqffa~_&=F0AP`x^uze3H&!GEF_OzUQ9cqI{dJW?vz# zyW>Dtk^p;z7B at T1fh0e^&LxpD at 77*A?7PhVR1pho%Y8hJnYRrT zGEgBOyz;wN``+CFfGsAx>n%A4s2t@~?eEw}!Dbq<7McX~Fw2x=cX}PRHBnpOoWoBiO2#-r>x-~EG6(>P7jhpvJ3nL{%fClxR=C0ml$m^(Qe8gU)E at uZoE=2 zk@#$n&%(rsx2KcHi%@Az{_FKDy6DIVv at Ey1)48qzNCAHHrq}(!y&tCUPZWt8Whu}e z(+!lxFA_e~)!haKb|Kc+RX9FR+NBxYEyYsI&(k#JN7+m-o`NIfvwh4&I(vL>m@?R?d0+h@&@ea3sOW6B!HI&YR zUf!HyEvOoE`yd;U0k<9bNDXEqIH$MO-0>>SB3)Wu%*5iNw_c{EIEBN-#NMV=fy69(ovfsWV zr91pqEKo-yPDlp-lcRrWpYNS({ReOlS8kg+0@$eil;4Y@{*-_aX=dE_QiJ8~-wQgN zLSt0|0s;Wg{{jGD`!D^eCXzR at vT@e4lr(d2G_p4OSH@$OY at c*LFPv9^C}0_$CMPDW zyIlb&Z1WyJKR;PI*qN8rvawx<#d`mU-RY_Va{!_0650!J1tWo(t5~fj=N^iZR`Le+Ht)U1hVT)~xWPNlF$r1Dv z8e2HBcIE;%zM at GpzqnL?gCSSq zDuILErmmzZ&FVe}rL(OsqNqmG6i|3#?I$*IuQ$Du{-4u&@EDey{dY>?K>n+FAOAV6 z(l(A}#%2cpJP!4*sr^^6G-Hn}+J?HYXdL6&n4;I>2^)E$_}_Ge<(yE0APP|L?Y5m9 zEfW;{8%8V0-fPEvc)xqKjVx85d_?)?Wx&k zZi#f(_MEI&H>=QLTbxg2&jLr)D3K(C4c9hEnzN86kS+2Wh(D#ejT8zy_LaoIr0r+9 zVMvZ3Bht^p^p-izxLV3J#{}n+T%0xUdVF3x&)+O)T#co zw8^hCNj#KuwwW`VS#8vs)1>6d%r?9QWF{wKYr|@pvG+IriU{T2=XME1`u4wYXVB*r zhY_UiVQ?ihtqf|e;vl41OOL&CNFPI0cjaqK;Z!ZxP$F+G>+#$pA82SxT07v#ARRpZ zk+WU1<1bUCX`A1%iDzip3-VUlY*}1##JW#c+~sJet17_G;;`OV25CXRZgh5mdRwqJ zpqnnm95^lewwWXT!NpWyGFlv+osD5)U}CPHtA^eZhq_06yy|zW-#Y9f$snpg9U12F zLnh_s^*}Xxnst{pve=1T?k>>!@PkC6#5p`5pb>Hq6TziXz&?6PC=tpoPwEAD6Oa>1 z;#nQ-nIG*De_J647HE}jX5{067CEqH!|`CH%jdjUNshyPvTJV{PU<{xe%5vR-zBqukQum at mXc?z#D z3Wtbrix(Ww(qt*_be7({n{&TEHWk&u;s|Z(37hpt-pphZP=Jg z;($>OX!f*;At#1A{%^E-s~uE6g?l=r!Aut{=6bCnO>#?r!Xt%PdA7K%BN?r4GXMD~ zv at -A%DQ*~{GIaw{?uT0DyG&6iv`G7-=+bNq(CF5C$BxOEN5Krz6zZKg3Ze%sc<3d( zC^l!ba)}p~x(Quc@&bvO5|VJJr=H{XQL1uguCIU}N_6pv&uY7Hw60EV`gOa?Swdp4 zEcoS4C)dWA?OyE?WRfiKa$mhZg3RUASql6v2GxwS81i!)`h%ks2Ii8;sYHpy#<2dPAgl0EwSVjJ0}P`@@;^bx at So`ZV+tW8-uKyPs zl%b?$#wf$!dG$#!DpZ^NiJwdxbsKA=N8XM5fO^NKNhr$_FI^!=HEA{Jfyds?y@!}& zaRC<1$EJ%DH)+A%C^TActf@!#ZALt(AKr22L1`VAqB&WRlx-y^gggXkW5;LN1a6Q{ zC%ggkQT-UHADOZR)SU at VV{tWNIADMr#SZ+E0^$z5O0{*$XI!@V!(sgqyF9RAH)Veu z1`(W4c3!=`4Wb9sb2vl$qrQ25uk4RS^~7Yp{K5jyXHR at y>*NiFN$Bjv1#%wt5C)fg zq-;{{aaF;=?`M!_jtaW7NIBq0Dyn|)DDW!8dCIVcLEc(aRtE1W|I`Rn9=f{yY3LH~Rlj zU6EyOyQ7rGZAqsq!`&|EtK6`fKR7)}KS{^Kv6J at 6)#b^`2dFQ?^Fb(qf&RiEi$LYM zyS3|BEOjH!Yv4w_$L|ir_iENsrU)&Ng6emF{3UxXJ4T$RK%Wth_*6*=c1`EDn{!WL zjJ?@^qI1u_z4!;Z;!XR-Q5-Vn*nSc=c^qK!AjEa6 at 5SSo{+XTdxO7{!lLOwv3FP2c zMpz8Q6>y;(e08#I#3ea{9r%_1Kxg(B-QGXZQTOMalj`cG z)e)2VigOD*?>+JOJ)<|~C;x%YN;e3HT=>-gFS>(-f1<1UC%XKQS};;3l16dS8lq*B zcZKkGjX~G9qRAO at LPjH`GPC62;l-fqPT at Zye^oa{&=_=?6oefvs_}2C(?X!O`k$a< z`oE+5t2zYAbLjsrI)?wh(H(almBw+&n&bUdUEzPIZsW6T3O6XH2bqw0uYP*OZ&XJS zZGVQ-R8o@^$t&12&s9cIB+5%fv!h+>Uc^0rDq$k{L=-vptr;w&Jjd5hEBJoCOX`w- zRbu>f{-G=kOW>)djfNq at UP$KW_D4MUlc1*}i-4cDMkTP>581sCEswE3y(Kytb`^8= zqOre_Q5ZQiSr=Z~RMIplR$Huc=8^bc=o(KFE6S`TqZt#d_17`0iAWX{VN$TKJ2-OU zh1qO>gU}ISWRrfTAM)XavYT<3o4zESOXwkDQN;Ks_Jd!c_*mY7?w!~S%0{(S-pS$J zmly at VBEp^<{FPnIKV%2Lq)hlP$4tighhtv>B>T z?x>}0nlVCNO~&Wt<}W+Wo(dfNf3XAp2Rnnm?4F-pRw-8}3jc#$_TSBJHg%Q&zbjrf z`y7_++y?&OE#%%)7(I=mKvb%pNtuMk at q~Dtoqrv*93_w0ke1p~R&f3O->PjatPNZ$ z{{{dU0|fwJ{_n&4S7feqWxpVd#8q!uQ%N?+2FMRaZMUgQigd8si_~EzFN74}zd%+< z_9-8E9zHHVg6sFPD-_P9;Bsyjvg1`MeIrhh0EM2en!V=W@{;Xvvqk&!HG}H|NVXRg z3ABjBtiiyy>zyU4M^Oz*AgzZ zW7F;&H<^3`-&(zOiqcZ0(_EEv<$T at BA2jIFgzcrU)C^R(*j{aMj?;oZRC#4jX}t); zgfV($b3Vf)(0d+1-%m7leTOyi*3b6Ydfrp$U*b5 at kn^k_;_NZQ;b;~J-2a3NZ0h!v zGg?y>?R?18{yd?3>gy+rpX;8!s1{DH)M|Y>g}t2!1jcM# z38Bh?nISFMv?mN)HWEMEsa at fIeWXdsw|47s75p{32g&}Hvtvb5wF at H-(Y?E3D%J<< zI;{&qmdzOHkBkMR?g&0THYN9Y(Mk_ur_|T4I at keGZva05figl+O+IS3AC&Mxj^~mr zfR8t4>lNc{L!!gxOmrSnGaBd2_VGjUYdISCY6vzQt*n~601u*Y8`?gv93 z&_Ev}>}V&>GX{usP#UhANCSM!7IR29TN=M9X!nP|5Vtp3kAd1K-sSSPLGJGl4`pa_#=iR^N<$>cpXsRiwB5po==c zDS)1#lR(%~U!d**6AgrGL;`9#@<%Jt#&rB*!ptyRmcf7jK%tq+^(P4!0DuJUzgiK5 zNZQHLQozRAz{%d;$lCFLpQx`=F>_cDM)O{-C&U#8+Y83=D~7xD^_xes70uf-9bLmZ zKKIMFj0~kJipPqdeuTVAN%lTn`3~_mHECU+egu6KaeA*Vv^-RWk}giGbAH)+aeeM` zewgX;`G(%5TE0K+*Ti`!J)RBQU{BwIZ|I=7KAQ9U0LJP)ar5+}eGvQ>_ry8OGvEu# z)0YEQsT-WVvRhfKqHy6_s5=prm zVMc)BnSP3n*1BNwS@;bY(c)1bP$LO+#Q5y7gQ6ouzYUi()nn{QMUzpcfz-rNsAHL; z02l|dMTZO#pZZx4SZTyYk-`ICAre)bOG!|sG=11mXOogZ+-~?iM5OLb^aRv=t9j3b zQ>tlP6ZsWg_~;*+wZzy9+dYToq2t?DlO^kuD-EcH&ElKh4ou61WP#QD1ktvh)Z(~0 zJ_;I`Jr^ht%kuZ(i&mZb`fQCao at Fh?q;DW!3qyipa$usg%!ibva-l~Y;|@GkSkudC zo2^FgsYq4KM=dx4>({O|pV5ZZV5bL9#H-?A2{8*ussFlY==dp+D?Y0|K<6 zZ3_1byUU+!_kdo=Mz7 z_cottse|uXYzUBJ%GikvVUqNE$c7DUltsUi-nAeT`Nn6lwYIic*jwL%yB4(ftX?os zKquLoEo+jTulEOo$(Wv+#%WG*Xk|Jw{d-J>RlCgSwbX-1DB|biYul%FIox=WfWN=cYZFD(1Aq zhrNbUbcg043$q2tle6)^u+nzS1o&{hJYtK_fab at En2aDilFT|~9>4PFq6>IjH?Ic7 zki?wG=?3$={C3w|AWFhC(7qCt`DuziDX1O6tcx%f(&NyuH%VTH$rrm;DP7ecfK;>S}n-@%H0PsIDE z-up;?;y+V1N_;W;e*~U}kEYL49$LeO%G5F4{(4I->5o(w7Osm`IX_jt1hB9nBd>cF zt>l7VmPcIiJ#43H1L}uc0h_B9)0}{(Vdhm>#bBWY;Y|Wi1n0E^%oPVH2g+>*Xx$bb zul&L#CzRX at o#qgrB(4MKj>2wOS`;QP)K-AVA~&P at +)ljKijXwV(2L1pl$<0*y1gOW z-5KFEMF=F}Go|icF05fbv#1(cVI3REtMSQKQqN~6=B8H(H1)<~;z39+sbdfmX2i&a zZ_r?hND*VGo&!)B<)NA|q_WlHi at QcVU?U*_4W~fZKU0})CK;Up9HhfJ1Jf at Ht4~8& znBO%?1l7+h8b|hJe8m0YgmE^!gNeG)o|s2wh(R2UPjXYVg-f8LUyA$qw^UO3n2jhx zAOL^~@c(Mxp?{gZm93MbnYGFP&GnV7Trh-?yn};yPmBEmNx0;ws_KY416ky&f{NE0 z%@%;v5yc~KCK!k}s5&x@%8q+VbsFFM3W{;0%DG0~*Km*SrfGEbP5CHK=w7C?OpLQX zhHpo5dcHw+vC8=bZP`Ov?~-vZIVm9~!Z<}!~yc5y*rL4`uwU3n*7^D73sGzS(1;+s|n68KGr66|=d71j4^_Q#J zG+IuTQa3{_6>~w6s*I+Vr5Q_|pvzwr$CZ&uWuNidLk(D{Psv^;5243 at -M%@Rv8PZa zIXpBvkkz24bIsTiZX4v7pL3{ON%EN?B~n`-z1ydeGrFQqQoy5Y%|U5fE>Uh$kRxYN z8Bi9B&&iUJFxg;sJr^$o3vmC?QF1YVg;F1i>LKa?Iu(vG#$)+PNRX*bqTWKmI1*FH*SyT?YybWNe7 zk5E{_?8IOU)xE4X8zPgTulvLavQZxXc;(gn&Wnt>t%DN6;`+Ej=%d>v1ojshf=$|+ zcVGq(cDzC)ew-vRh&*Pq&TtRyK4>sL&8vKuM8v8X4NgFPhsGPQu?R z34$Rae}V1nc$M_*Wzj+uAo4~N4Ta=FgIZlC3^ucHX;E?8Dui*?XC0M0?1}kYDSL<+ z at p#Vj%{L3xhKpzB~FtjaAxK3ShnIK8 z=jk7HCrH{JntPN^xd1wCO6d+1d4~Wz1C*a%NloasVlg584yhY1{wzs|n z_wzz4+6=^Em(H`pPR-}xj_oee^%3d&#?dZ}0glzFN+FjS4`rfGl3sg2Jryw0XfFZG0opC+*TZ#_FD$(l2j{sx;a zbN~Qk|0NIlm(i$!dt#Y5`PekhM=l#+QwrUo*HE*^t285NIA5-Y?@y`MuV_m|6HUbZ zroUJc)wX~&a#Mlm)XJpEzbr0V^kSu?97{Sp_fkGdBCc at gBh_!Oip0(W$XJ!mx`s54(oN`MwXi0K6 zu2#5T{kyXqOJ0?9Z|O*|+1G{UutsQ;${0j~NRwipxwAfUL>oNiK^K_y$=b3vX>wm3 z9CK?mu!87OY<03y<>8sxS~Z56p!t56BU_ttzui7`&xxR!KIW-9qxskE3JB|_?@C1L z95i;T*dXR+Ei&ufxH0_37F;h3yp6p8sWV-76+))%z|1UdpBT8b*ll5Z=b$i>{o-r(I zi|xXM6fW!6=H-#GZ-y7aHpPB!=m$Ii9}EeCI0YPJ$$~hBo}3E_3MA2i0XlO!8aNSR zoFqjN(c;z~eW1D590TdT)nL9#7->wPfuAi&Rp={BAcjHlpEBW)g1A}?DH1q}s5M!p zDheVby}ssYnxAdiA3t4}TAou_Y_Qjt*WZ2Ld_YhHlcZ{9%$c&F{dJM@{Bx>7wR94Q zr)MyiS65e;Fi<#PPB4zat^pJMjStIQecC=gwIv_CEj=A2F)QG9Z`;@1(kN>>{eY71 z3G056>QckZiI%D3rUd1}=<}*<2ud-8ibD0Rgd+mu at WjD%v^d--Q6~FdbAOOAq9{f_ z6xDI%VCUddzc-P>i4Lj=#|}j$&5CAR8ThoQiUk*y5nBInmKXYiD~S>J(_^q2lDEVH zM$_GzDXWl=4Cj*%@kn;O6y=xCV at nf_S+pYNP1hgC2qrqNt5%A~u2j?6>>SUc at k}6K#~fpd%)n3 zBsDw2Wl&5Zu|p)5&5e?U%+>Q-el$S~YAsL0T=9~bsWbcTLJ)<7@)?n(%eFJ#1&EjP zc+v?oX3H`lL_-HE$l+in&^*a9T}7@~Ga($2INY(%>4y!@CH z>>U`W71_`V7Z+4TEE?F^kmLy;h|}2-rANn0`Vhn^HWf$@n>*SBHM5Wc1ke6<89rtq;%+g9)&5N7haTvti~A2u(xEeqa0DX^NgOpT5gK at 3V=f$Q_qBEA z*pWkec9c*$*^)yLa2RZCn4gZJy_xduL+aH%`pl`{`Fv^`)X>t<06E%^xdXyknl4q3e=j z?zP>*9IR64tNo+o6RaBUBie*59!SCAx+Y83yykkeRGX7bzX%Ca`Sa<>PO(LtaI*>6 z%CpQ_A at I7aU;}0Q2UDQsmWz3b4|I$vlJ%7 at 9!QPP5PV2uy zRGHNl53w>c9KE_lvGBnWCIP_kk^p3!rEPD1ub|ihW7FY#{@4V8kjUx_E>kvMFrM*Y zi#v{Ve?!9Ke9D3DDx_|t8N at GxsIMAm^-~W;JADyS2DwN51*P99rByA*iuF$!p>55EPSZ zR75Crdz4}Y9ytcLo|)vES*PX8>R?PtP!bUwzE{NZkF+AD%c=j91Ymzfkf3h&-`=W( zifYihe~5E at M^c)+#r9MWJ8AR6il0BrNoq`wAaK2io at 2U6W5xc4BEYl?L*UCoRk1;?4CY@($@os zD{_A||Hb<$1Idv(`_(L?nEhn${i`0OO-M0mIF!aJ!sdM`5}(L~BNwWQi~p~7b8|;B zJFZOW%I)zG2D_x-CXyo!h1t7yd?TI6jnHM*7{yU^=^cccE%vtWB}oeTI|YTak}uoP z4!mfsse^Oa>l;z3i;J79vmN;ZznpJ9zU{?jg?9T9?-(@Yq!F9d<)$RU at xtdxw-XK; zsM6ukMBQI2b8(8-#m|dFP7}U&mm=*|)NAOb-8j)+!B$Y_V at 9D#NJlk=U{l}bMDR4K zI!L~I|j#8eMP)0f`{$;%CrL3&9u<^0f(EF`qtMJ at jj<9JHZ~NvOy{kq)Hz1#h zAYk9FWH at 5!r4%CLMgO>4dD<2cJw+=9t?^=QF%TOgG~>@*mO7}o0cJric~ao(;=4}z zgHFp&g2~tJI-ng3>|Htf<@C>=f4;2smsHU&vqx1Yt1mxs1+n^-fVtChwiWM+xX7Du z_8!85=O#N at cBtlRHi^F+%>j}{#8d^0f#^L_f_Y2`Ae`h|ZNANlJP3t5QhBSde8N}k zM9LpTZBSO+#8pHg>>)EaR^J;Y9=PhA|l9t0Bx5c6&ry5xDx z8EID0rS!7LxUyJ#sKpGd?OD&zORY$#9;uNQxfdj3!Q_0aoMIrErTP0Ts&T=aCph6W zyWE9T^TnQ$UV)TG(0t&rw@#Yy0aa2}i|v^xI+lpIchoAlxo;6xEAgoKeSA0pLEi!y zVG8rNbbN9$Rpz`;vWG?~zNm`)z`4|A#5ptTKzYqT&sh6z$ayPM0I;qVF#iXKD~s%mbj2$1lX z{U05mWCGK(SOUIdfepbCdW(t}8H&2 at RJp?{bs_z2t^o_FtZ0g}{R>W1t$T|K$FtD8 zy@|cwv5ud-wm}Aca6x#dwocC4IuhepADNETgXbf^x42l>e?5i!FeC^&Vov8#5baNtWG&gr#Gj<}XMldJ@!U^2!Vn)eL;Zo2;MIaq zWK1s%i4Z!Y*c~2RoOPLDa)OYj=r3Fa8<#=Nv9A^DBFR3~D^4>Nl_VA}zJ{5fMqViTcoV8GdQL&VUf zZZqGbtI)mQ$YJn3gaXq{@uM*=Qk~6r9k^xtrqjvqm zuT$fq-SB|RcHy$cyJK%LF>p?tV-sq5fTCd&zD{?|wqC27x*}IP?dH#`byUvHfWe=( z(kaz`n_bq`9tD>U{wM7#MvE5O0mQx97+Y>x80LYekiv5~T{mERtYR3aMhn>Ht0cz* zZhj;h2EkFHZfScS*awC__3uXoovI);O!wbZA%+EWcJ*8D*(CSjOW*9DW0I(LBQ~Xc zlbhE;Ul`&?+%exHap$8;-M|4hA?_jG9E-~P-VdaTUcey1J;zdO?ih!#bLD;>az0{d z&*|jojO^WYXx|9_i7MU?Q at dH@nKiS&)})*B2C}^CjKbii at OJOz`k()(R|^26PZKb3 zhC)MKFVaxiSyKk!s4)0hWBzk&cm;rUP3O*mukmw1Z}V{j^XKxTI!=N;$_wuHT;9z+ zKPlWK-M=jNf;CU)c7L)1gR0ccraLShI~>(!d%ei)*+0X{_xTenTNiD{%tP2cA`q}E z^zoMBx97pZ3}{iI=Z3uvlp6iMh4U;Icfb&UwHr9e7kT9a3q3K^ALJ^RT z4_APm9c&x`ZzIzUsf9_~yBIL@)bm94C-TMKLFxfb at _fu}gLqK8O6Lt@4VvFT!jjB0e1d>^I1_$VGtF at y}0jufbLLPY{{hWw8wjLXoLrrd0DVq~*88X;?r|C{iE2Cn?=)z`v#@F#HSHkU at cfDF4T4 z;u8P6GuO)GU$UhC+OYdq?Lz+ltl-t_u+zHMY%h-}qlXep&Z=IElFUp_R3u}jpx87k zkKSA_**5kiBorh at E}FmH3}?w*XP6UKDX?G6$Z>g_;oi;2`1(5eU<5+EBLRYL6yh5& z!RBW<4u&!of{XU25>jS>j;3TWX31rFRmr$iXK8Gh$Ty`a$>5l1nR!B?SIIs`SD{aP zVi`2nZiJcdGCPvvm#zhmUNp_ at Fqc>j2`{Lw9Cmx^*2k#@k76D>*c^YXT&5db$XZeI z{ix7F&KMd<_z6r^^(AE#{lR>;hl%Q&w)pg|o!HhhH<5jbff<2tS|l?Gh;qix~!(hG~rr%H97EU(f$0=e|M;r{5@?hd3*@fS7MabdO5v zlC-)1n{GG5O}5ZdHJ>e at U4s^_KEC3C<{AxKEz!?PW=e*AtaBhM1T~8eXEKD3=F054 z!YMieGkCdNZkMUnm?IWyQ!)%b3m6-=XA))5qaW108V2YB>cus*{l?KuE_d50%}*bY z!9;lZB8B?#=lIFIMRxNzz~-U_7M>TaW6bZs5c_%tT;Ogjw3&5_=1)#3#sxwyYQFIJ z;+nb<7lt^S at I_D%a(TjmaZ)Ozks}qoe!aU7*Dncm)a)Vh at D5} zMvpPZ#hpe&wOmY-D}ioTfTp;B3Mv-BksJ=%WDdGj9EsZ%Owjq at ev!yS0rv=kMOnN; z7O!?Uyg+ at 6fEDL8-4o2^_-n%J98sT!WC}y3Ftj at +sfMSQGF{CHmd1RunpN~9fr%v7 zi<-KVK{(<%Sq}nX4>JQEe!%~gYW-HTX|`ZMK=trIK#c!?sPSul)xW0m-8$48N}# zk_F=(_jWRJypA(6J{o>LKTZrpo5Xj?spV6sGmE#Wr4`ww;!i8Nu7=AoO1-mlsgf(a zJM at v`Cgto!=(4b6cwF$VsghgTjqn=-g}fOn+STUiMC`QHRZeJ1!pw~4+-lm-8Emc^ zNbMO#yPRRw4iPmp*kD|4nkp!w-iWYp!KfXnZNcP;#RG-S|;GpA=C9QAF%XZ-VTg~2Fw>V?7E+Iw;pBX7%sN{ zG~0<=`(W7ngS)2r^^mp{{MpsI(irrg5Uz#EYBBd}8Q~1=YGDw2mQv at TYH}PQ{|fAc zQ>3-nJ^H&Rm%A5MI>~B*=O8K_#W24~%_DK5vXuYD<(E_FaB7v^qjs7!&lxTpEkX#X z2|qt!XoGmwgXFIulU&*CU9Y{-2haYQfCeJuRMTTV-gE}wlg5YHbgE3H#y>J!+uYWl zHtr>N{JK0JsR4+wGi-(sYKxk%#ja!hJqxPs&xqWO5y8A8Uzd((Oh;#yE{*)VEA=!Jw8Z0FAz(L2uwo1JFn{TE0>g=!WyhUJg&Q at 5Y?d0Qv1KTrg?2k}=uhssEq)Y%z zlWRxm-^HucT!^mKS{3dI4{U#gF!1-n$y@)W0;q6E)hMzrCe^dGa`#}4FQ-XJDU)aN z5tgc!yafbu;wiz5z=Nf)Nlm|aYW9rRe=DInFTVRNg8%`ELI43V{I`Zn%FfQs)yUY^ z?7yruOi{H{SQ13a-QhjKcOZ!h_aw4<)l5bX^anqo;_X{Xc%TqIqWXe?t*nF5tBZSv%tX~%S z8Uvt at d~Nf`PXUqb)L at g`XQ&SP0t>fVZ{s+g{dA*=C+2ppG`*!cD&do$UgRv}^a*0A zHNsB$SDkK4_q{0SRXfBoc^Y^&lYP`7pXe`mm9sDlt)Q%2Tn z!aZV$q)>#e-r?gJJu`x4At8(q(~bu4mjn&sgH#bY+B&8u^1Db8?k7xa7j6I*wsZBk z%MC6W0?tK&UG#=#&0K-6+M|V_L$MoGEvKnLSfV0y2+9hR+NNlSr7m at Z$N_b=WGKzq zzNRy8o`Ih$$FOW9{in#_uzH{0!ZBk+nyOMty{?IhKI4T6nYh;?{1=Cxb>y|KY>T1x zr4TzQzWSPe6iTbg8r}r~)~vuS`Rd)AN?^(!*zc;g0d%ZDNc7VnXYdNekt|=|LpzL+ z+>`h0Yg^ByH1 at QY%_Y<@h<7gs)Scaj=rB%FIeOm$@4*nBo;MPKE)>%OgF5jKkX%ww z^v6odPy03){<&!XyvL6_T42vLnKl=sY6UD*m`ApFK^u7j;Sz2)sC7oHi2*ab4h%Yxr6)G$88~sN_|3Cr(G5xm$`Hxi^|G4&lp@@vfrYh36J)KTup at 3sn2*;9~j3oYM zEDqD$N=-ks6|__0La{(or;Ws at QUZCAgk{SoNXrqT>msCeDy{Vi1SPwjx6u z_Pcjqlq_L?VtpMJ9F`Vr7PUc^E*ue>-YwHVD_5X70M)^|NBrK+g&e;fmhmLJH9LEb zb`vOGXX%{+0828CU1z16ZKugOPPyJDiBYEa=Hfa1s*C65=5aUtq)QwvT;pJQoKNjy z%8x|u`M0`RuU5HIkF3N?%cDtHr({7!rM~re0|#quPRB7K}j at R zl56R>+%ISL(8*XmnYTN>$nr%AK&b745shpXC9?Y1>F(=n>jEOl4&T{UzM at J__*J5Y8|QEjHwBOL zR5PC~R at -QrDM)An8$Ney-X5!{vj};Fb|0*3Ncu?%(2vYq(s at h4a*G?UI3qW4NMvv7 zeId7tW6y(WFax`-l(kJm=w$v)kBxUb5xRw`)0V1;$t45Pff6^g1*WC1<&Y;_CV;g^ z&(q44eLP)%coZwwq at x+oW6#lhckY$vd%wMcN01I~{HC`86^lF84B2D;KECds`pSKV z9 at Y9lSel(tNH~`wxSF>xuY6vbYoqvxUh-r=bixB35kPMMH(aU2xEU97NDMJ&Ztbuh ze-vfILO+Ab4|HXA*B189#n}q*-6x~Ls$y$O!mDM*H at CiazJVdeBlA3>N=f*L=n9;b zTVjl9$1UC^rLuDRUk?gL{Q%BS6#&V6?H(s=9s3P;24Ea$rD^N)Jv;5>87fV$65^Vy6TU z9DjU%TjAu>2tGTJ_%y_;fY6@#Wq&)FRy}cIP;<6OwwJY_!QVjuFdKrblK~jxDE!iO zgL#GN8Q%XU_X*>xw5OqgfR6BhfSCV#qu}gpi~`r|_b~m^ebfEJ+w;-`xGN>_LK8&IUAT(_ zV(U^F>kR4A8J!1`HZ=#|VNGJaf#37<3;=ood^`IBAtoPS#lc<#^9W$|+47MwBBmXH zg-tROQcgO-#6xjcABYUx0)PmHB|@^H_n3Xz0^cEm8>9js`62n2iH?BT12U+!ILG z?k`nxB^^~wCY0~$R%Mbp)SEGGI^}F$E#fOkOYbP20XPE|30`mdl!<$vK)cjgC^8V> z4Pj!qN%D3B4c^r|+Pq3O!>r6n5X&V=8LCUxONuyhTG<70?+}Fa^QLs-m?1jK)GlS) z^1S#NSazI{Wkqf5>yxoA8&@IC%&0f@%6b&dHtFkDFXXb6N&9QM-9}~~_AYa9qf?>= zo+`8UQ98?4tgC$NK$V>wRp;mW%d$jrPYGkH{TeNlMUQP#y{L_lTUgLs2UCjTrGb7? zP|kB6D++bY(Vi90DZ}0MVdO~(vkwV32?f8AYuV(Df6kHMVZ1Q5*}!|{2g_>n3G0*JBPpRKSeQ36lw$7dF8JNbsij!wq z| z at o3F>#?e+QzR2SD%I{LR8nk;j&3IF at ByliSJEzu;=jAytoRc!*caY(tM~oxL?unOV>t at auZDd3ucSRUT;YcT4Y9Qm|RY%O5Ua6^sVuA*^UrT^HkM*D&!A>uhM8EA!oY$kG-?o_bSS@&gJ8&%p5?kusCj!3FO17ASx3JI#WMq?U|A1=~$fKJ| zh@}}RXYk$Mtio&uGhVkH~)BF;{^aomc_q6})EQP6m{7 zKNiA2)ZpSZ_V?~S18DEyO~!@4m5m{0%lT{Y?_V%WzW`GB0UWoOpK7DKaG!bX-9mL;&<-4qjS)N% zI`DXj_^r_Gdc|ABhw{JQl)GXu6UvVUBP2BKNwXTn^hB;KOPWWfTr)Keo5y7fIm7=p z_{)|jop)OXHJTyZs%lVHb?e`@tjh;vd1SbLSgHAuy at 2`nPF0YH8v9H&q3>ijc;)gRr<~t)GLgS%YorhL(zlMLmB$exU!=u3xSxy>yNPhi z*x@{hT at +g%t}~#*j at TXYO%OcOb8CR=T|>jX$znIN?9O-_MU3SPJFBwMKqP`z%w!i4 zx5K1^TJEnN!KgQos2+H=g*c?$+d<^cx^yac*Y5jJ=T*K{jhI;;S4=*DG^@`vV|?o; zi_=;&quR`k3^(gm9I1Ry$ct<;$6${xjb0w*3L5gSPzxb9+jO^9Vh>vz2)e7S!WEsS z at 8fK@;^RtI>M}H;QY?*uUrt;qvT%B{Y+B}DW>d2S4^jz~*b<;)tC7H`L1)!v%wnEQ z+X5ERx5o)9IWqu^yCgLpIrovpK1>P$NU5rjnD-OTyygE$H zI~N9z_s*~mvn0z9Rn7ncSnl87bH|(|}t;>U= zydzCxfBBI8#Mc20d$mfnhTHOFm6lm>8%@+R}nYE5Vue(f=Ojkn7jZ?90M&t}>)dC5E@ zdn5!<%`(Kj*bzF(lty2R8#p~JqK_g16FR~FbJmg)I`yALb#iYaI}eA(DX8H6TK!aZ zTtB=Rm#oCg3i^z?=g*ofRRJ2|%?ckWXNgs?NNKmjBL|eKj9-0+e(k$3UV6OB*z84_hd-(&0T#>Vgt- z5LpP8K>rXS&7?U8-*KXfQ0^v(fbAUyYaUrgQt#@IF%$76RV!7eOqGFNZJTK(&c3BC z3kq-2WNNcn;wD^0x=n at onEAC~)S^$UMn+%XL{XWNh(Bp%Z)~LlVg-CW@&p3GT9kll>Fw;a7Njr4T9volaW<#i(XcE)*NUi=x8?ZimmsS3P2ZSQ4y(jnPyDNhRvb zk%Pvs>=Iao)TR9Og6Z7a)nfvTOyt at zlx8NN$Ei_GZFfBqX^l0g$%o8_X3)@?b at go= z$hbN`y2#PHJ?rDT>sp1fz4AuMi~Om_;Oyl|d+at^=7YM)Rt5{ar6HoTsGqZ at WBxaa zat9k-6-yC75L3YfaX=&ca0ERiUAJ`QAQI%tIXuAOuKst7?c1b?2oR4sC*Eetx81Ko zP#w}j`G#NY&;~t7RMT*g9ZsyP#t3vhz_gJ-p#VpO0*IHG^?MB61HP_9h!_O?Dx?f) z`Q?RBumm0=a@!nAc9j_8Z4?x8L$OD^6VJ9i{Mjj$cZimL2mu5*3fNWRmlMMzM#>^K~hEgOtf>jJ1MGqufTw{(eCYqq7 zR5{59bMZ_`@k7vZ)Fqx2xYuNIzUd|D9Rk*~%<`~RV7jG$xE`SY=H!~X#VG^OId{U* zf&j4l{>vUz_J4SH=wOie7X%2%68wMS-G3x%WUcIN%uJ+%aKi;tS`ni&X=AnXeDR2&;A1YCEk1Hf+-{}^nBS!gnrH!@1XS6tv2+EQxk^k)6 z%s_fA3F1r50jn&k8-}cOw(eZyo%G{K`+2dwONt>M+bx;JP_8G(Q?m8IgjwSWD*6PJ-NoyVzLL!soVL~lU#yx1td$*w{s3A|fX!@rPzksXY}CZE{Z at P$s}%hw!D#Sbf|?-0&2qBJ}M5 z^BGHdfp}O`mlzOCU^$f_wxl%Z><}`81R6m#;O-Sl(;m{&?%-6v-NWS!G7S^~aqYD| z)+H1rx_2k|A~wPPo&x`7r5zr at XL|1*VITj9I8ye%mRb{d`AKBy-?y)Aye`Q=aK_o0 zqfY$w)G5Fyke-spm}P~M?0-#~?kO#gaGMsYN1 at 31sa4G=9Z8WHf~6Wbe;fQO at Cg7L z^ltwE-x>UWTBs-dkC$;U{m*$(%4RPA_#CqTdP~*I(d<7Q(1*i$CzT0^%vKo+g&7RPLkv2!(>0-#q~nj~5Gq7@ zhk7}CMJ$HMV{@m;m3G**R?Xt;Yrm;tMVyKIWXsM)27g$hc^iK7RfpZC>Y2l++t_-G zm8W(2N$iS4W_Qok-x>Q1lk|xWbmuS&Ra7cw}bHAX#6o|ug%7z|Fv;2N*c3N&N;4PrdoK7~D6v!$_CltT228YhVu!F*`c*s~2W at 6w>OnlYpZ zh5es~F8p7C{r}*&S^dI!Qxxrc#eH8UWr+Dt3w82B at vwSkl;asWvlJe$9Gv)7F$L>a zKT|^&*XD$>L at KNognr;?AVLNU)8K7Z__?F|-;VlOB_(wyx^i+><(7XNwk at aqSn zE~GZGEkPWDlhv?|T%z^Jh8q-~)@lL$=wcF1y*_oQBRe^9&2Y^BfPENopalfb{`57P zEmYaT at G=>PTN||3**1G_`D7YuChAd*m1#W;aU?;MziniIq3>mg^b# z)5EA;gYN3b!>rFK<>Fs at 0Z};ZAtu3wr|+!Cs8|Q)T<|>SZTw}b$^X~L9eZx*F3tsN?Ucq1lr)Yl<`~Yz?bFWZ8nAQ;$hd3W{uz2$6cYLSlz_! z11`+q8EtnR?ag#pTm0WtO*bjFANYU>+5G2`c@;@*Wb?$gX^l=?QM z2+zen5)Nah?daM&GnLQPC>yL#HFMz$&IDH_0H(&eY;4|~tGmbuMhpIiIBO_1%uW at 1 zMFCeEo|Q|68V?TZ>CW10u}b3tu}spPgR`f4g+|Tg;^W?Zd~2gvUZz92+B6lB_P|R^ zwv*2nT$ur!Y0s361B`Z_-%UN}3 z*lQqBV6KTG`?sTuMUH2hhq6$5YN^kr8UF at 7JX`6=88Hm>!BJ at OO^O7>&}DR~whK=g&k z0?GBD6Tbk*3}K)6MPKZMo1|ItSxpt??Fl1L(kB#Kf+ofdVp%{#00YTiN0G1FTn0i~DmbHCQmn^Dtk_2{qDM>2uh9JO0?Y z at w$2WI6nI6enkni|I`?U6jrGDcnPSs3V+< zc^~wLR at gjL7u{KIOpKTj#!Gz6jd&O1{vY&1zt#M?fv#8k=!qhvvRvnGs|>L9d_491 zxn0{EoBs-ij6;AYP|X)bufmfobxzG~7Fn%WEG!c*?%^*?@hpGk*Bug z{iC2|z7SDjK9$X#!St?D-t>S7|(t?RAWJT7mO}Bab-Z#Um at b+w$@;$W$AP>kFgE!9=K!>&~W at xq{HTnI^hy zhY2_??Qe7RT95Ue0Z7nU;@%3(92}gw at l>$%%%t<{V)Qe$v=N%T*1mwZQwwb&Ow`NKds`6?@*wiY7bu!#A?6#77up6 at rtLqyBQbu3--33YivZ8R#%FgG+<-L2W zeoFRlD3kI9onajmbmis`>F{8dyq1W-sAq3c_?h?PxRJ%=P{OWYh at 6{ypSANFYg;wp zAE=wh$_mG0&-54X)!ff1O^!*YywFW$E&JQr9%_+hm+e>`KHAsZ%NptH| z1HDOz=5=Te%r#~k(%ClB(CLJksQld_cj$A%6G4+HrQ4Q0f;dZ4$$fD;F||+kX}v+K z$iS5~uTp8Dg;L34RY;Pm?HWyGE(u6vuO6j)?=OuF6~FB4V^ER*P2o_xNu!KrtM&fO zyw~kxIb%1%M=zgHnLMC5yUmByF at aMZW^{>sZ%zzZrp-)hD-eD(ilZMK5tV28O6^~= ze}bbw!l?SGJcu1r{+bd7%T*0<>XI9-W&eceRlDPb at 5Q|RwHHtGT at 09gjgIQIe$A5o z)?54e9bo;Mmj8qMGtU%i1wWcF_eWS;1Om}&tbgIpXnGhnc21uZe5vWppr`0yk*DmS zR=*FP!>XhF^FJgH5#*;n#P^gQq#8K|m<`MKPrH0Echt^>qPwCc850$pICs5YNuQ`V zAF^Zo7`wftL*QZ#$e(kQHvF<- zdO9faG0?}(;xHclXjFM4V(A9 z%_;Q$Z1ir;o9Q at 2T8ZsbUn`nAb=i7Ur_sqWb1#R)GhnBoWPnt6ZB^DhTi9|;BMfjO zN6{hL?UX<+9?H4}A}wX*N at _VofSgRBE6Qm(FePKq1R}_?a|NJ!!oI*dZ?QLLU{s%@ywY02dFY8P`d$za z`z1%jGxu5Wt*~QO*^CI`IakxdKN)>nbGw-O3w5U;y|6~bv0%QTDdCpMHom@^zh`z- z^;qC{_i}a}!PrB4IBhAb+ViU}xNLb4IBRm;RoMcR*2792apRqp*e>%i(6$A|2=hVY zK3A`NEde`HLlIhV(-0b77W6aCgDry^b8sd-#E2ZvlLa>=4|NyIf^9Y!wchsnO&$C@ zuxQCJeM9vqH{f{S5mQ+q(R at N=Qugdy&0ZKbp9MLe8nAN}u=GV_5Ow1nHeY2za^>fpqA=n%HWSvMchuR~t9SOaEWA-qJI9W7ujN-(dV zC)Eb-P=^>TIMjC(j%PC8xCa&Bb~k+8*uPBcH~3m57dsA8Y_(4?k)2OysSlxlMs~ao zV!xyU4&^xGrsBo&bm25~MlpRig*Dt9c|Du8)-Y-eUDQHH at p*|jvpn|oo*%ZK0b7!} zFSl3S;kN=^d51s$DuN8A9ihy at fPmZ){- at S{F*`?Bum9}bQ*m&1H8cG`qR7SUKO-bN z4O9sdUFb6TI{uYW`omJ=1 at 5?_RDYBVVfU+F*3&x5v>vUxX4}XY4h}m_A2eLT^8q^1C%b? zORD~PvjzQT%i0C`0OC)ovnu_)fTyiVNp}agN}?ByE+mI|ThzK0Mgi@$hx5 zO&g;p)U=p2ANtyT=`h%YpO&+0v)okuL^pTe6rlqSkG2iwrHZlL$5*-#b2PwnROq at 0xLuSJq z6T^I#=<`4h?#pW@=KRyxmmH-#zmJHIq_wtdZQ=ZIYh8}^0zZgh%#6yzMjR_?m8DT& zVhWN=Mn|0+Q(?o{Lj8)9?R{!5Y7kS!h(c|~seVz7LW&BGGlDM at _Zx(tbyXs~k)Cdn z*z8ZoSes+7xV(K-$H10q2r+u2 at 9xtIr!3;;SRdPo+3cZWL4 at 4~hslA8*CdG#VoCNO!a;D0d}cXo at yrJY9Q-cDphspw<9x51EK)?`0= z$Lbu;ynUj-fc7liM&VrrA}<4_R2Fbbh#6HaSC~TZH3D2Fi-IsyoCY^eR%$PDRfn?x z(e4g0EjJM_wDRS13cIxD9;x5SqLPMz-kp!KbFA#lZ6sP*OYO>lDa$bvRSnYI2RT-l z?kKO=WATnY+0mh{I9%joQk?QK6#ibq!EF0EQl(YW-&ttDHo*eo0dm})(LAmduZbHJ ztvXcKu175}4t&lY+ym!Xp3y_Rk9e5IHNf??;Ptgq5zy9 at nqulJ5do&|0d^->D56{Fu-(DTeQcBPzO5Pd|wNYQKItt%+lT0|CvW0|EW||JHW= zucnJk*v-n;^gsTeXx7m2KvhHgmbYY)!UDD`SFYHifsZ6d0}EY(8Bzy1n^sqh-gjk5 z{w-A^PYJa%7f at _tHF@8E)EF;Nar2J)IDE8|amL1MVVz!rxPCGvaN at h$lRY^z`}28A z8mQ!(G6KIPTSRzMa!0VEQI|ddyk$HMNhe_Hlr=0t$A%%pC#FyYLMqqIOP8v(WoFdS zHo7kWD@sVw3MSd$lj~9446Z!?ClR%S9Y96IBiyM+1`* zR%v-8bEA330SF|kb5jy0n0J(WX#R8RbSAT2Ed%yUP>X4TdBFM#`$gDs`sWp`&sOJg zMWFLvdu{aKOI4ZXOaL0ao!fH$Z{dvWF~-g32D8I*oo1UQ&D4UK40EaDI z%5alqIP7U68xV3$rh$E;VVQQfwrv?Clu^%7?VA-XMezuS*(lXV9H z&6|%U3J}yxL`v~TzQOk6m$wp~dpEid+%|oj_L=r=>oC}D>xK3%DjXZ&oCh+W^o|Uu zz%eTZF%9;?e7o!W6df1yjU?j|mw+?5F{lqM5HI?BrL-Wi?$_d(IGE(Z9vGCq`I!cd zN3;?>TB=t~LmF=w&VtOT^r+ll)cV}c5Puz4i^O%KICwdn>hT@;q#-yFjJ$VhcsrP_ zoPV=mIU6f5mx4$P)99jyD{9;d4pVwcwq{llDBa=ZYB0w%L?P>{IE4)}Nz*Xw(L_t3 z$KRF*&8qswF{auOywr$(CZQHhOblJAqUFPkjeeU|lxqF{D>wd@?k&zJ at neqOfF~=Np z0EldGm4;okUnH*T1|xF{)KER7OC&U_fIM#~gXRS6ce^}}WnNox4c4p1*xa?|h_P9D zul!?IsIT9KYuV+;S6;lWxddn;F~Ta9LMSIggl%%!3|-iat_QP|*q*ESS*LPMyhlgb z8XpjmT#JQ$@|WP_q8>|S?dzGmSA4G_20#8Iyg~dMUHoVvtEi10>obTUE`zPxXK?N< z;&xQ5$VQC%(g(ziG|?0O31g0chf_;MPPa_7$h at yX%B*bda3wjv z=*SOl!HyB_4EZyDQFNq at S!DJ|maUl!lS`)>Q6bvhVOZm1M{i=JtNgCl? zp78;QQ1=tBp56C0|FbOn-?LoIr%)M5w=v-njUE<6htOb*0gbL=M;|hdZeK at x7;@uI zzKo(prvZ)r`3c~oX5ErBW+Fd*!`MHU$lOhnSO$z5pkYOqvrd`dTFleOg#4U#O$77u z5k<{tbCG9j4QBoHN9bhg?^)N{!KLgUc;D6Xb<^6-4p$P*<2+PM+*aM3r`bc zQ9DPQe-?(S+BjjUp!nYC=mT3PF_*R!M9?v){-7g{sj$gcCyqfnIwdN z+16vTJDZ5sL_IXiG(F~I!mrSF(?yB+tieF5Ih|C4M6&fTQnSFMQ&g#aVht^b&T188 zNPeeYxM8^*!c3_yofvasQ)PQ=0axf3Zb2TSBi>@?hHgu?2_%`-#m~}ww<1}O zQe^n-Me~j(nLR49k8kmFteje( z$i9HoV5akV^`@cRZFtUjx2}kpJgguU?wsp-eQZIkzV*gSG}|^DC{|xDW;8L!4q>~tV8kKfG at a4j-9@amrMJ^Bq#-m+m4lnKjYiu zzN6weEGh{CWl*14q79`Iov`rsd{FVt-NPA&?xFyhv&W{eX!WIs!d}Ej#;|w?%CMZN zE6eGH@x#qXc^@gp;LbC)SCc75O zhINHPp|_))mwqIXCl{}*sOGu6wm%PR<@ zM?{b}2-7E^^)%+^&&hDIJBG;#VF<=;8b7+A2K9b(%anF^p`I=|MxChKOb|?$9B_8`4prG ziJOtQsP*A9&h!bq$gi5hmkb!FWa8_ELq)U64Ju%Mk~gGETq%$mbV$3NNU0MHd1p^k zmeq at qcqvP$)9fn;AK=mKsq)-JwG6=d^+)Bid-KxNZxn$AX(9+{qPlv4wEzgthd%A} z-aOS_V|T5tbsk8Dr`nHSTWDNA!&L#Y9Kllyk)Juhzb?tM=MzjztX2Fhe=P4U z5Wn^p(`pS2rXnPNdd%{CZ>zh#yl{C~^Flmv>-gA7CFt`TFKUsWzkHsbI-J)oKnq*N zhGRhG`QjJH*2aGd-V&e at zTjj^lN6A3g+xXuC1tJYSgn1|!I*op49IWYASSfJ`&soW z$fFtFL26^k(@BHr?hmrT9=9MsbGGou9o&^477QNIXb-uZy1x}xSKp0awpUku2dAJU zb?)%l2(5SHhkj`Eg~-~tl9KV=Wv|adq0vf!l at 2yH^En8Zj`gre+b!|Trj$XmJgFw( z%{62kHfjjP=l~uK?IpN;6)fd&!$X2QMs z>~^IAR@PdO%&(}Pw^>f-ZW*#Dp;};Hr4fXI8Qbl1+S+A8c4>s^y zXcKLSZ4a~vw1f(Y{L0F>M%e-SJYs{rTOyCRNEV>1s2`cklg zR9-?ssf`>WFx}kg#S99ppr|NVbS`gZbKVp*?kY75JD1-H#-|8+;-^9+OCvTBxhW at s4HkBfGQIbqve@M}ccR7OIotA|hTsVwXfS*G?>aNl@ z&FC;S7^p-FRO5zH=4n}j=AM>FOAeAgLXBOO7804mEV2 at 7=*n)RTL;V}NfLWMOr`jt z6FnfDm^yya*LpK{nlb3SCAR}*Vl7;iUY1f8S;n-(GP2R)PKit%oxvvIrNA*9o|Y(Y zp8kFV-{yLZLR at SeNokO0WomR!=X7od9zd84l%X&XJI-8z=@i3J8K&=22CTSRP+qh= zsldnOr=VAT9qJWuEl562#?uGSX_N9BJ{r__|6#emZ%yMZhD+r2@!srT8?yZ#6Ii+z z at ubfV!L(Q?R5>&>BV!`-;|CbUcUvV7xsSn_WlZ(|5-m-{*3YtcZ zp^&@bG@)rVYi%15U`+4rI$s)(CgRNppCmY>`HWHAtC=RID5PxcW3>fKTWbfmw_cLg zEGy|M8QjIRQN9rDty$NlK#f`2rj at YZ=ooIt7(QHkGaMV2qO?pPbJ%>z#0KtD$d>NU z{mo0b&I+}z*;Dum>vt^a?q$^?T+NjmXbx{$v=4$dhsUHgwZ~w{R>L%`ho5lEFy@(c zq{X0+9Vh;1iut&z6!kc&;_j(|i}sztEKs>IOvKeH`Oufd*%f=#*)#?{fw1O9{c_B+ z#Ma97kXfi0p;U;ZBH)!g2=egtO0ht0`#6wVDA`dpP}Va1&-SIY1)S*u)?hv^1 z`#IG^>Zv*0ov|~s0lQ9eaB+uu_2SW_dlp9xTJMYG8*kk#hN|=XE!>p at itfk<6RVZT z2RkyRM!)=L-0O^Te~{q>9Zn-(BC5tZh?c?l=eBDlbk6I5FXgW^Qsj4h969kypsv#X zbeRY9GZ#wNDVddwk4CP=X)%KnSvW3pM zLJz~~%ZYTYC1l+=?p86FAoF^TtxaBUs8Wrgwq$Lo4p`K?3g-4VX-B1{oGVkR0F2a4 ze(wIPFvZss4`fNB at ME*?n6;~P*~`Lw%W#CKK~QU+;Ml>U9z`K5XUP!(jd9$ESXAPR zeE!S)Q?LsBYcKbFa~VP7Rq=ZGT`x}aIa0TjgEMRf&!;RT1G{C1s~CzveUXPv z3ti>OMNAP-j*+^u^HUN%FtX?u*{x2pZU|)1J!Obw6tPNvzD`KGYUkb7p~ZVFGIyDy z9t{g{l*bn^MV~o^eM%2*kzcYGcJ?YRwZPezL&Gd_J1xV at nf_LN$`%rWFQhqlKtkFG zwWz^Xp!=G#=_%UEjb}?miLwOeDF0j%nWHg^Yy8m7LlM`+Goi|N6f*oeiT%b1&rwjG z(xk}vH7skIQ-{Yw>Z^7&GsH$wZEBlUPny^`3Kp=8EJI{};nffJ&_lv4cK5}ZzJ7L| zZ^FnMbPA>4Ae3?ipTpU5Qe77-=IUYv>Kw^ZnZUALfkn`x4Tvy{Rd+^pp4E%_N}BN!TIoAzgF8~lE7 at r3o4)g|{KX+rF4JygL)5Wj-Vw~* zIAIOM!zy4o8|Rz{kiTEG2~ZF(QVS8=BS+K zsFDI@!@+%W_;OVz1o7(jzrgPmPDzWoI7lh5On1Ph6Wf-9MsaXpgpb%>U8LLArv!Phn zak1{K)1#R5304M>vMG>UFh#yynzc{Q67cUYB-?eLErBtefVale63xG5=XYt}ZqYyO zkfJ69w%5d+w?|`gW}+*khcI}Y6fCLxO|gnO{%%>KCQGqb%VCb-E9&`h#Ahc;S{xC<5V^ya4r}@JXm^m6=D$CdMgPz|v at dd2;zM zgnG1&<TvXVw-riZ?f>hYT}Z&<+-b6v#nOJ0WCN&k~w*k4NDZW}e=~XY*6C z$YDnbhRn05BF&r47CL0mf%>+(=*+Xe=yw5|I`^}rA z1|>?up!&P{Zu0c({r4Sct!JuiydtWSOcrHktajfyjHH>O&{Gs~m)iJ>}#zw~&j&)3n(Wb$An*nN~E=$<4YHL-hYSO|#T@(>{uA!NK!GYu=h_eV4-ayXuE6w)EaJ{dHQ#@;wi zSW52UKH1Q!$O}cc8pyjj67b=nuQXU~kR35bvQr~&a?9OEdkh0fxZNPM_O>=&Z*x#G zUI;8CKZc!eE&kY-eG(517TuC^YA(#V$+&XYPEM8gyM;3y#bd$DdEw020k~{sSlCJk< zug}0xuuydOvncwsHKZjuCT7O;ny2S+?`mA?t~C>0)lk#j5a?fZv>QV)P?DqF;k zQ3tFv%g1}jsLhXgIy!K+4Bh at xNJxX8U%r9^A~o%v!{xm6D45FpF&{0DRPQdEiW;*D zB0}5XLF1HKvi~EmQDo0zjpiICaP3MlK~i~TE$JX|xD2`kNn9-*SUNZ0aqeprk`&8i zO3dhrQS^tBMi<+womJv4yU-!KkxGwy)9;&TS1dDn*}X>#upW<(CHlA+Cmw-48Q9t$ z%c8n_J1Ba$0Xpl}>|IusfMfH+a%Pi3k8_%qtC)tWydLt(899#5N zG%K9ZQs0`O_;@OGc`#bgdk*FLn)AyzI!J4x_!Smx_$Jdfb1*mo1C5bsjuLceF%DHC zl~`T72fDFn8vObzhio7L`f1)ZJ_!A at T&~Rr5sSbt)cVX}Gy|;^ zjsQngV7^uUE>A)TbvCAe*+UTd+w)F409XFB!DjY8FW2L-srY-F>;T_((Gjo?AhejT zQ|@p1*tO~zRbaC4+D-Oo^ir|=YbhkwlbU;+51h#jxd^SUwb-<^S!k=Aramg|sxY;- zO<=fBnQ;4PqQm+$r-EV~2q#w`pR`|_Xno-teyCq+V19WThX-c!0HVA?5*?Ej!_`m* zDLRX|X{BAMrO)ZG%JagoGKfv3k)&v_hDU5mDVJ0gOqW9HcB`1K=QxedzN6Mks5zMh zOtvda#YrNF(LkXGzs46)vxtP)7ixXh3O<1?`^+r9BQ$CwpW;HFOqxn%uc@&H#+CV? z6o#$c@|O?CgrRW at w#Asc#?~6X&0t2YyyN=VcMjPvoO{O{jvRZ(kl|?imboC|qn`+z z4Y7x>K;1#m3m*Sk163Qahy?@ykO=|+!2jRs`yaCYTiu}(v6P92yrYSeiLJAsiMfHR zg`MNS1}o<%>DVpOqwwf<`dWvi4veY=0OD?@|3C=l2n$O)+|@+n7~=w(|y#mlqO`~Ld<8{HqPHBH}uC#;KO%WQnb=ll|E zXd~5YSgsw{e!Y#0^TA}-!VaI&IJ1%rL$a1`B+Pvcbsz8+3`N5sWh_Vt at 9l&S*7Tu2 z4x?Y*T8d)Ow7*DPzWB!T?^7qi2T9$^i8Fp6CB#6c?mDgfXv(}N!Wyv*kucb%$6F~ z^F}39I7TK_!h}Z^eDHB8_$fAAl`v{-&gF5G%-{DVRZefUeVyeWGf&?b&qgwFEx9cm z3y$4N)gH#DKV8;rTcpISn_$u_LwiXo_%Xh)Q)ran(^>SprgR%>C-v3pVqv^swr9SBiU^ z0~y845zQh!M$njUZnsx?FNJ;(_2g^czjJ52HywQOhr0*R|BySzf6cJhQCj3j;gL!r zZAL|a^es>Yq)1leuNJ4GUttub+)Lh{02gdZ)z74th&*`F^1cf}*YkF~8^F*1mgvE@ zDihB!Feme}ySd5rx>@gf{rY{$2EgQwB7|b(P)tu78o|Dht{krrZxW71JqCq_38r++ zbJ#z=5vnw$3N-6z>EYuYB|zCpYIa7W1*d1VR}w8O|P)y)>9Sa0!9DUGj5$rAlnd%dloyfi=>`pO;mqnJzsN+or~D6+glU-n8On|(^iB0qMRrzvP!dv zVvX5TPbpNrG5CXo(}+n}_qUM3Qw6bdtIQsZ&vz-&nVRhoLsqxRrq2*X$ky8KsX-+& z65h>sibFY3n4oD>vL1@`crGzzBkID>^P5N&r|A5B#0AfSX8X*0Lo>iENb at ro+)DJS zcG$W}HEMz8y6dabVZ4jvM5Pv;JghSgcvl at JK+q#@Y z{*;+KH@=+1^ZY=dA;q#N`_Yq}i74zvCq=FcxLr>%O%X-GUhxzZ?5jc&tPQqG*SQM3hmK-`cgSxNQv}bw&JaC}1&lRH)=*0G zoRJqP6qP^!Qt_m-)=InhM at LKlsg9WbrK4RrWC4V)*6T+}tpY;u$QR^zL5kzBTz+U) zLedx&X~{bg*wwBU99_GtOH`73x%&xpUGMvey&ymTi0?#BuO+Zz(qPgqCN{3$KiQg^ zKJPC#-2j}_BZUTXKuF_d^^ue)87UiK<^!)cz9@(EJG-r}FgeETtvVua*KKL^GPexF zt0AM99#U-5_^g(zwlCaBbq4tqZPu>(spT-tB}Tb#{`2vp(pc~p zu|h^oyaoQV@>QnQ3r$=+E7avw8D^cUojwtbd)6?|8O+pa9ysbVCfY2voSOSaxnaV-KpUI=Xh+V} z)YyVoqm8o?i)>dat&A&nR)B3%7 zcFEGfOm2iKM4u2ELe1{HR1bqqwFb+rr?`Y5>VWuplvnzRM5CeAFw_^KVWFU1^gGL at 4p946f9p(td{Ika)i#M0%iIWq%wy>u zx;gZm7zrUF!3K*d&NH4ULiy at 1d1QoZ$(Ln+-d+89(fl6^=AYh8OpE~3AU%SJUo%z> zs22!&B$v?a52(O{Lb7m+a2g9BnFo7XZvQZ(vUZ1a7$!g7>28l6d^rG6M!1;-#^RDb z7s*?zD$HLCZVGB+oWu1NM>>qtZn7HqmS(b?x;`TeM(R|%P=`GYnsaNOVum%U3Lglm zpuiZ7K~9~UnwWub4 at IX?R5^&JQbJ at fRekoaf%?GSM&gi;kfOzqqf2GV6xa1T$4P(r z#|zu7mePMr1n7TiBAEZ>;%z%F$Rm8oN=(TSl`N~)l&e&H7BH`zhbUoG6VA|&wh~F( zu>=zphh}Hy#diD49meRMMWgfj!ymVk35PRfHkmzd+Rfg4{oTpqF{hY5 at I`{c z6Q at BR^Tff1aUz*&_+T8GEcG?j#>li`x2d`5N?oK~X_duHjx=`&1>JUhQJAxFY%^fC zX{0_MWWG`wYB};VR{n at RX7CrN;ed0aYTft9rY6}&(W#*k-aNso(Akf#x3PWG)M at 9n zJ5N3J>QL);J8+ES`f}P~przhFd5VJhZ47PQchdYq1{5_8)@x#gI?uzVJ%n!SP#%1E zf+>I=_IJx*B%Tq3KOqp;HV3R$GdT6+B6K9T0N#<*GN4#%(sC~`3msaLeI zAy=LWUw>~X-o#wk6AFGpVI9^5@U+SI zN>bFcT8h+2UW1od#gLXFSPN$&G}v?&*O?mB)w^`Gt?OV(c;8Lv9Y*n*9|ZCBGFk7S#~DhJHTc8oD2D)g=m*LlR!zj2!3mUK+{r`dympjS zV)YeMSPdA8zs1PT+#0E-{Yk4RU#Qxax?bFrG8#OhUOh|X75}hGQpSklG~l4!ra5 at m z2}gj7PW4_yEp>QHF3z8KKlcf}V6tlQOGpY)2EN5iZDfvKS$Hv(_UAbEO-o6JFvzCF zQGL=d&;rc+A66r|hkpNqRdQEM-ROU?n$K$RRqt83x|^G=`Y@@G6PfKxaQ#HR#3W<~qOdW5VIen;M~JyOW3mQcU)L+P^;{q_B1U|c_3(&s5+AssdqLBc(l{1p61iYcKSMX0Y2kQi3&Zoa5 z$2IzYv19`S09--<0Py|?u>LD4?%Qrd72%t^cb!3YNPMN#qLT*FhCo9~JgEjMIkdRG zfpMH(=G0~32qCVM at d=FdqWBa2T}(B8lzFLw?=~*eb+(nWF`oiT)HBbmw`+F0$Lltu z at 9XPO4gk}eiXeK7i5Z0?`7XnM6KE1C^&S*I7ot48okHLtx)((rwSiFJ=_u1*2(b#u zF!v+HzcZW#5<0gU!aQ7DT>asw3 at 8?(Fr at Nr+n}c$r3yCm1^KgVD0XL=#!SzzAP37e zOn_D^b%%q##a8W>@k%w*m2124I<=zAVxyG?XmKe^Ro0CQcXYIjvGLYH+OQ3#o)GFC>`>5DXmUfqDJ=!={Zt|`c~RDjIaVkQ zCe(hvhLAd}JIWDQ`MQ_~|{kL}ykd;u at r1Vi!br z*nxJ4Z>S$zwOy&&Z4yt|FKcbP0{uSNIb!agZo)f+)3`upI5!LAUZ(9~%~fSFQbv=X ziD2j85SQ3fLJ)P|V>hg!TVxjGv{Vj-S%P%el;U$2!;dThBK|aE$EK6hAg`w~1YD?nyt0*dGhoOx8dyids z)CzCi7aEclkhA4Ze2R*EMf{+kpDyJ3yCcBf;_XtP!S@`z`F at D-5QxYXD4tKknkw){ zytFUvXZw8ru6vj9?t(Hv000)?|EUn+FS-{n{ND!56lLs|=n;Huhe$VRowX)`Hi6Oz zH7OBW(Rme91Su4S$-_i?ypX9Jj$25^wC4R3BKihGkdgi#Gh={@QU(lDp;`a^!9B}l zG#i(<+Y5}bw*z!C5ADD-Y!kXtyR>l4 at W9%H>^o^R;(`gElhP@@P-7Ij*N+ltK#`=0 zBQr{5z;~BGXiCDwp*FT9*_W3XP-XlRAXK)pr5-$TwdDutgdv;kfbjMNHel)p0r6Mh_AyU&^R03{t2F)kTD31?{jHRAYv1iLh#8b#P8%bo!Hg zYGzkNiS%1n*eqT0gRiq-L1NGDLP$Zzns#>r at 99m*OI&wgCC^d^BMZ+U*FL3^GlG83 z{(6ZOghSZ=1j#YX)VDps4P*DqZrRV5xuD_io6n4FOuT9L^Dm=m1;1AYF{XZ0%Mi2z z+`-&9JlndaI((+{tBT=9hm4I^SqSH;~PBOa^N~Alv!ftJoA8Pyr3l6re&Xs4Qtx0($ z@|@m9KUQ at Gmhmp6GZOLkqwGU4o8`v{hc>xZ5%xHSo^X$0n!X(Xb?L9RpDd7hA4ISG zo{xoRVCqP_oxfo%m-Kv>%vT)pGz$dGlj={0S{_B7u&>mP5$863!0+J@)YL$QnIrv@ zc>sW)n7V8`JF=^$`S=ifEmCx?tuZPQV=_Hk?GU zB|z3M=uZ+l8vDl#FgmX+F!|09jkw at FW~Xq*B|R#Iz6D at Hgk~sP-g_`#L3<6pN2Yfy z8EfY_QhoYLujmj+fzdZ3)r9cKcT)4TcL;2*N^;)hDU`cEOL8tV5oJZhEu3!kqJ5XB z$+v`YDwP(Cu_M*e2ccc48 at PL2VgYd*x;sg63|;wY`;WnRvH5HS!}nmm at A_~iFby?9 z(rxeZ$GlC&Vg2O1QKVvq=pnp%y?c#9eL}tx`zHcG|Al}v{PW)s7*}PZUG3HRDEid3 z;5rOf(~L8nEB(Db=@nZzt9Ay6r&`9FWs#{Ps2lMaKS$V!pQ%n7<@)j$C-8z;u!Q2z z^S1*B0O0w*XW(BGv#jJ6^-+9xbk0^#F%Jo)yYqiwmpkpjvLYITQaVXd6Gq{SW4f$3 z+bp;U`vvKJT-n_P at e_&`?l5?@>~O|TjwsYwo at V*Uz^)WUYi!|?vneaDP~$PgxTO*LrNpSPV1;ts%TkW6uw1T@ zx#Kgr?GUuKXwxY5bVGOtJ0KL?8;Bogl}py3 z&*o&cbbf(f{gv~Y!)^)aR15X-sgjIgBw at R2+$79G-WlNQ`(7tH_%!|xMG4`ccZ6pI zE`MbS=g=ny19%ix^w!TrZYNWhcMy;M9J9P4v5EzGzYz}zeEjG=26v8Kmh>I zkN^Ov{!cad&r$(39VKKn3}3hjQz3O2paPMaNRbc#Q7sXYWVCxK!2zfdU-KzajzP&r zDL1ws7dBjrQnp%UY(4dh4xEeF&^hN}Z8_%;a?YjSgHJqWYy|QC;yD97?D)66__H2) z&)GchV~cryp!Pt|MCSeCAh(9hfehL)KO&!nooE6bq|4p)9+F(zW8sB=8{qN|ju|== z1)^<5=VRuTzbKC+L*)R%XihSB at FXwdhH+6Yz;uPZ9_VlEmwLs{p8XCrsT!wePJF5S zIdu$E;5)>;1sKXNc1kQ{KR)RgdKPZ*YhIA|=QSix4w1xRc*?v}Qm0LL2OUf&Q|OSr zGqKSz@?t7W&LJe$2~AR`cC6XfaJxwtHYW~2ake% zjJDtzagT>ATN$#Ds;_LDNdD2vN1IyhEeG`~DfN0r;qmbqiO`T|JWMp&t|BfKiJh%a z;(Kc!K&XzVXH8qvrfxDoPw41K2Vn}$CEEHfivs}%KN{c#rsY_Sg_0XIYlZKwUqM~n z+X46r@VaF zHT)+}F$cqy6QA at o->{p8?C3%pq^G0%CCd*XJ04mVuH>t}FSUl32nwftvk at O!Z8~R> zn3NZciwZ&2f|~7jlX%Q06(0ddUQq{!M{XVsbalE zkwx7C#Y?NDwDj)2gAlHVs;Yg0=S_03pJa{eG!EkleAeC~v zw(yu`rj|uu7d}nvKzzvx(t;!A1!+(HZio(52WIY~LdUIyG{%hvBdb3VD4cen8%N#b zP+zJXvWH7R)lMc^y3Ma==lI5Scq;Z)nk&aG_u5MgHHTneV8Q3;GIdegSf&ZZxcpKQ ztU5DVeg$Q~xZ%Khq*GGEI=x5-!FH;3VnL;^*86i|p*g5AKV!hzQM at OoKZXddj@BT$ z1 at 1qvQkb$gZ8sK5+u5 at x7>+VFh05ipX6$FID@>u14A>VJIZ8RJas|WNL|aeKIBwFH zVJdr^E|l!f$Uya&3;4oYS05`WTyAupZ#77NxA}l>1k1%x4VB5l0Dx~NP4Ot(oXsn zT8UJdc=O at e3m=e6bqJ&m?(B0_!)o$UC8^i2BgyJ#TH5H_%6GnX8{4RH6;$C%`k*d= z51~f;;B$tRb3WlW>Mz(FSr;mJhJMoLh;PQ&*_r`p{L(QL>tp44o)34sx0*o=#|*AD zrB_f`kmj%`X#ByTh$c{m)WJT|BG^?zT#NS6*Mk&jBLG(Y7 at IMWE8$tykQOV^8Y_Wx z>QuePUd9`CbAjOYn05+PhS5l$tTBUxkR+6;#DLPVI|M+MN9F2dQocFOi)J?Q)~J*} zVP+%*)vU}al&1%^)Fw9ND_my|1M|g_$%jNx@&ITjR?`xGxvijHgdNucG@$j{9-zP) zFe~A6=}C2wMXJrLeu4k{cEMU_3xWK{UHgd&0KoX)ZWsUP_WNHw;r^?@tVRt|Yik9S z#}E_Nh=Wu%(8vgTgPBEY+T9|F6`>8|(B04)E9g3%Rbpfs*x0K0UOXs`_Pn=F;+a at y zaogsa77y$B@^7tBR-H%+5c3B>f$-JjJfCx&c72|Ao?mADcE8yChhEZR<&N_AlL&cJ zhRW_Eqj{5t%tD<2&Kbvf+LQTC6H_72?BgpIXM+rKk*OG;>?6s20T at zLm-u z$qD%uo~8c&UCU)x#T{m{I*|n%^3k;V5jb><+PmngF7#fAV7?|+qAOOBNcpHKTSvKS zy?DCjWVK9q$~01W01g}W_NF8rS!+{On3q?dO;zbU`G7XFWWD<R3Z1hjpU1z-ThlO}bC at _~l{zWf3{;rwEf>){M8W;}he3Xq-*Fjj^Zq3kC)JGb-!V z$qZ!Mcn*CB{sXOJLzA&b?=i}!gH}q)A=9{~z>qMq9ou;4)lEb%i28t<3IYDk9aJNw z>#u!ge#>Mc8(1N1ky}m7JnWQXjBAN~EX?RsS7#+a1(}1*YzwD=*=Y6HWBkRrja9#Z zj0-w-7+vh=1iQ^z6&k&eEi6w$$EldDjOy2vOupkL`pKcfy!*h0(4I>R%kdaJx=Km; z1Ww>M}e9MuB0$sT1+=| zk?G9ZK@~JWopDu;vr?HXH(^Zm0zIguS#K=$mr{690mQ?B{9%evU|dT^x_+?Jtj5i4 z7G6S73+enC7tvrkBE>R5$>q<;_sQxFNqZcih^J2POT=+6cAGxO3TPrvi&;eV=4wZ zTP8dk_|}SS73I_SITAji1m-U9s~UkC_r>PZks8g#%Eblfg`!zIsS=8cPNb{84C at c@ z%w!pwvZwTgn?XZ`4J<}Jm&y9xl{>fM>)XvaP4^;jc~UqCxQ?2_Jl>x}f%|K+ at UdAV zR9E5A7`L3LZAi(7Xle;Z`vQ~DouluyTe{DC0B>`FzP&B_0CIO7F}v`;?8b%gw$Jnl z at K25qWgmZ0@U45z(Js$BashBiX6z#`dFuf at eDz;Uj9-vz2Cc(2Y$%CcUh`KNutt}W z$H+tC_k+K}1mwc`hZ5z3@{R<|1due-6!;j%2ThL%3|PV5;rTN+Dvcj-#L9uU>lDC> z-bJ_1>>9lwbntc?+A`;I&2+^3MEhM?d80o?m}8Fi^PFk>w8qAAF*wokXBt27CaT8- zBpnI%FTXf)^P4qA$D7Te)kwv6rNvhnX+ga)yY78NvV@#5CYD=3=FX&_qCg2F=AswA z9E06Dq6SH=?dU at gJrnYHL@@Yq3?xQrI7VNbqf&Q-n*{pVd^noAfaQ=36AK}6-a(}V zmxjS{^MB#af>7;X*S^pK(~sW=!Pa&D__jsCX5AhBo#d|z$1wJ zMd5S}?BcvF3knyrxtgr$1v6$P0JT-?%y$cKHp)W)`FxfmGk9N_2-N1)6m?ue25LKN zx__c*wA!=2c2Ag^%H-9S%cN?F at oeL|-Az`?(fR%Dwq$!?&Vk!ub~!G~>3F-6;2{$m zZ?+!2`7+&@cU5($bG`;#ARC<%gDuHwNzPblzm&N*MVe`Bnc3}iX~CEj`?0o?P*+OS z_vZ^f!iY&)@OPDA7YMtzU&=veNA`%Xif34Qb at B#aw~Al>l2kgoDk&fU1OT87`aecR zoDFP^4IGV?|CTsT{P$JpA0JuR+5T5X(%;*P(>kMc9w4}IGPzK4`btB+>6=1E5YQ4B zWQqqx*rhG#n^{OujDE`XrcYD9?cwiz8+y-~9d?vN`ZFx2{l3ioo#WK&wJEpD=M5r1 z#skU-g^ARLQtZGLq=T}mAgB=@8O?*~hM_nB?WI`Gkjz=iwh)@j=1d(kop74yh%*J# zY}>yL_zVtq%atlC0=wA~L^`C);HpwF_M_$hA?+QUD{I$v?{thA%-FVVbZpzU?Q}R} zvt!$K$LQEe$4)x7)8}1h at 3rf!x4!!JS^JEtG5&)4_l)a$ZgmF@*UvTRpWV1Ew!L4+ zkZj+`UEa4lA_&3Dn6Upu+FS-KKI%cYTy&;wyF8njC=Uc|;K0jDHIE;e?C;;q99^{M zBkor?G`kg*aaGAaBM#1HEsC{L#Y^n(WRPgn3s`Eg5k$WgtRyR&gAF!4%Z(Vc5hmq& z>7x}+E4_rvfaF#PJNYwSheiShy=Hm#>e`Q-Jj(@6iIiivvcpP)F07E>lKYM=>N|Vp zA4+?z308N-neHp1d@#k0Rlrmh3^ zcx>rum#%ju7f8r2THQ}Cu;|1JjR;??!+Yo1{afhM(fAW6NJy*-!V at X30=prtOZ2?M z#a__I+YTt4L1s}dfitVb6`zkui8RFo?x1@@TYzJl(T{iN zEd8LV&)^ceC?jM|BUQkib*fW*9pp6wk{i;{fCuDe(XV3c8a*DUH#P{qrWja7EzNQ& zgqo^$3D`Tr3afW=^&o}XeTi~MQbk_HG`T;MO)B8&qSg0*tA at G3+u7m$D>hmG+occx zAF-+WPYIZ+ru&b|f=`PAdONIWt11qI%EChx?LICNav8h%P#aP_IX^ynyp7KDBy*NW zp%)XCg_97Wz8_}n(`za;t;p-?9XV{jQVYmg0E$rJA;y~o}jv(CeA zHg_^)4mSfdkWal0dcU1qbS}m9n$uoNtvxa=eyr8zg15;vty#D&eecCr91s;L)bf$k zYS7b#OkB}arU<;|6tr%Dsg``F&9hNigiDn*LuD1PJcx9{WJZild#Uy%7K9(f*c$T^ z;NHo$cq3;=AXxDd%m4+|53rfq3Vg%VdaOkwI8q6!lv`|o*O!FOZ01zQ=CvuWvN~Dq zLnPp8kS^DMU>)`iG}JP!kZc9v*EaO_qHCu=Ck^l% z5!!a7F%Sv!h}`07z~=o4`S6G4^hM%)Lrz0BN9y{9#3`=jRyEEOu}wweobPIc=`d69 zmYtPQlS((5AC0rhyT&q_yi8Clo#>ABgl()$#^ET`uf3D{=7n+^KGrndRC256#Zj at N z5t{n<_8Jbr?4c$E7#Jhme>brHU!zgf+|KU5g0V#1{vS1)0j&%@Dsfmq6pX`R at CyuU zI%+GRVU$$KSMXwqANmuegdJOnXBfjoyPkg_h}e~Z at -YDqk~o&}A>b5VMwwYTn>pS` zYdPO9uY|S(z@&_6Vk|Zs$epQTFy*A$@g%^|jO9ofb_3AJu_O`{d3$%jDeAB*!fm{g5q+SJrkLgkc=Tg$Mq`(_%G|6Zd@ zvxGI9I_RXh6E#&?Hib5}KBQ;0 z$@2SA8mwwvHjzzmnxON@)-vY`f)f9%ulfm6ipyWa3c^j7ftNyD|B zRg6-x07v*#JmIQVcECBUiurbVJYniJT&*K6Sj7|TOg>iL?u&yp%UFbAFVaP0oM!w^ zpOYX!t^RVYCLsh(&Tk&!Rls11q>VEZnt??c4uun~Wh9l|z=V at zAYk)7(tDbEuwGIZ zwDk=?r?Y+N!u;-mf7|3_)p5J%f;d at vWUXc-mtJ)X^&mjSk1UaxS#8l0k|3PkLhE(I=v9SWBmV>~Av4ZE63!E`t0MpJg-9l29XsU{qE>_VEaA#n z7Z=*YNY#(+G{^gtE3VN%uCVsu$n}#yu0^?H at O3!7KGGwZK(fdX zPtKuAp^7kY2|v9Da9y=AAI0pSlqw5DEDe)0&P9dN+(Y95J()$-4w9vy{M`1WH$twM z{x*N`EQUrG5)6z60St`y-z4>47Y610b9$;{R{9rGlkys3S_%@_-Qjr|>L?%(aTPu` zRcD<-dvMPp-GNghK;{GDV; zGe5q_72pozY{bmgql<&Lk!p=xVEfdg4iao&MERjtX`xm5vfS_EvG~#L_O5Ej2bqcv zc$zSZ-GFT)JctI>)8v0kxRx4-M<6^Ee+wW>-=sFfIwum% zV0AIgK85^BsY(THal(kJQ&Y$_&ATtKPnnU>Qlk-0g(Gn%UX(=ISV5yx}JvFFr8M3G|^+tB8VZ8=9*SROI4IRtdF)~&6jnPGtbX5*IZ zvLc;u-NenN&04H73fz#&s5enC-{fO+vV*HQCk)C;!opxrjk=L*SST5|2SyM`BtN(u zZ7n0cSWt`sjJ$Sw#&T`h%(r2- at 1$AeSYmSel6Q at L8wr^HNP7b(#a3c7wbdLd9((K} z1xQSs{NjLdve=kaRj94pQPj at VUZe$+4T!1xXxXXtgEwlhSWanVA<_yxPI0?#;lVC| zJ^paYdwm9ywn_1eNb|(-84x8ZNC4|vlqs=*>o2%-{w=Ec{!B0< zFQHN;y9WRq3+)Awybe*8Bj1w+wzsb}f2IhY3j$`Po?01^=e!D}zp)TvA%`uKB%N#~ zP)g4uNegC5&YQknmuwH at Df|Fkae%|Xvf>jD)g#k6Dmx69pmO-w_I{V7a89@#9`K7ppmbPJ>&M7W>jHL3d+g8oeK_R!pq>xg_=S=;+1`yZ$89gVP_wfi zYjdan9`C+~UnS?1vfT(zZ#E2Kv$sya9Xw~6>3zY}vERUb2+xIHkH0}D-*@tSi9?Sn zR3au}B7fW50myaE6Yk1xNDj{Zq545j{yD*D8pFQu497-pX at 7qGx4jp<)YGlAU%ZH`wqdf1V`gRxl<~mLf;qcFDUkK7bl7Ed z`!)tu;(bTwcppTGx{s8X`joo%88AETRCd5b*ZL)ZpFhz#jjFm?p1LqMB6U+SB#s~l zOeCQ!d3%Ru#Uco+NY;vRu~!@eWFn?jyZp;?uLyReA}ZLFWlyf72wJCjKcnMp6w7VcJ;^d~})Bj=ZZtZE|rLgV%4dG`l<63f+q}R?22tWlcv+~AE#j&2L`;4vO>O<>s0Mvg zopNa*mR={5e<1!fKzOWt at t6PdLO-Cvz=Z$J0Qu_`cW`s@{!4|Dv-~q$N>X$c(Ueg} z|CFU)3`618!jl@%-UnAl6l#41lCWs7r?JnqEnG-z>v=eLLA at vlT9F$0T|+#}$@$$B zVIQB at O38A-%llaHvb|+Ze7{U5$`gdh7z%;hn>}zAh=im}ZV#fV*py4UNaHUxZ6_Ec z01aVsEeyEi-)?$KIpGu(iV2&cz>$h>lw51fhk z9>H$5R)TC-F*ge<>)<|?qAqIL<&q1U2+6hK9Xg6CWHPn0w}ih^rzW96NzHqWqn0=# z`d=b6 zsHp+{)s=M7sq>j8zdivu+GI?&RgD$59Yy!o?Kpi2HttjnEK$@t$h|$@UuRj*slzdr z4{r-^qvkIN at qHB5mo6e#42EU}xYd$DP~L17cw=)_YMO2z!vVeD18gXAbhPE=lQ;8J zqdV=?<=}TsT+=d_1XXEpbfbD?d4tD-LMYFM59WVCL&;XL#{Q%X=YCLRoTfaAiTbW- zq5h_Jmc;$j|MZ&8$AIl;rGcJOwR;iqF7SxlZLc{LMM3(czdUpzLi$8frOy=Pgr>pU zlV(fGIih_;5#v-zk4aANQb7da=BWcRhb2%XJZY_*ri5bS8uVEe=HkCA!h86P^#0|CzILmECpgj(JV3I5u`M~(2qc>{sHIV6i!IUq>~o`+zQo^0{zZWk~pv_eklVN*sr z#G);#Qk6@&Lj*vht|AQyG!vCnhghb35Z at _=uGM8SlOY;QRCX8O1iTQW;e-$4ZHKs_ ztL;mB;q7!QU=v!tX`YTwjXLW!wJ7UJVo5ve;7EW at yuk<1d!t3_1O+!nF!J&Ojvw#- zmeZY-PX2WMi^&VvfA7NiZ%qEvpZ$}_b%%7mV0cm);4k=+y&ep4Mjd;g^}^6|b2D9S zbC+3H`LpUfMDKHcWR%QaG^Iq$C;5K%g^Cuvl=VO^kLyb>kE=!6=KI|XLLj#bX>dDA z{-`(*l`+z4_r!oRENv{)g2(lKTorE+{`U at A79NY8cs0{@=7W2f8!E7Fj6pg%U zOhuAj1vLgJ(M_0XG|kPwqIgJ({tTC)BuRzYR9kg9s!@4zJeq<+Yz_`wt}@d`fjI_| z3ms>g&8zgja9}n`gTvgRrMnzEEvG=B2J1k at fK#ovEtN2rS2Ur}l6^sIf|hbHRYFRX zPlV=yk!s at CPt1jTVd3PCFfj+(#0e@&2{_-y$ScMPI)MG)?mgN|1->rFk_tUpT>?dd zdOG`>9!JFas)O&m1i6r+xW6#t<*rjyx;2;FQ*Kbek{V!b5s|k9Ldg7VysRl#r;h=; z&K(wX!%HYlWjW?j!{U00;12f(i)x1x0-KO?Spvo*PM6@=M{tD58Ds^Ks5WyE7kz~$ z1ydE;s^_T}p0T7E8_ZgzGj$P2bZDM98;1lZZ?&%?GeD4y;-o1eqyQ%+J7%ObfPV>> zk&ZGz%<)O`CWwBF{)EFwfcmu$d~o)QEitidi9=vyL6Jfpb11T(?sEIAIv2ywFmrWX z(pf;>ASDdrVBc1Ru7Ip#mP1LmNv-*P;p>=>Y_W~&p{5PPF8#)q@{t9uD{g zWypRGT(jbhL*@}DBP=@ceCz@{KMb;o$>VsWF&*wCw)!6|ur|^OoVLF0baUzveRMb_ zxv^7uR8BPCs&(<4!+6clU7>8$p+p1(r|-JQN*y?y)4iW(i7%@oHjTeq73e9VtvZL- zlv&`_-GNNjneUxd7}^@}9ruHYD#v()c4- zH71yqCtI{gFqve6-Sk4Ct9t0UZg-`O~xCYkBwYBd4Dwc>=aO z(kG at 0ODCOXc(z~PG at j3{w*NrZW99kG1z8jEvg{AiWFH;ld}cok#&h*>hqpaHw#Hjs zUCTchr4dO7Ouppr at _##e@$Q$rr8#2ssvk>XU)Q-M-WR1ydvTr%$wn4F5SSI9hUHeY zV1lDA`W}-eTfF3FFoEzK$(=OkT9us1sFXZmz*|}a&mPB6PG at 7NGd1}{kf%SJ^qL>& z$;y$Z{2-!0W~xdR*=VjI&sfTOXJ)3Sk6F&P2=7C?DG8Ybi>?YPMGaA12pJrz&|Ut4cFWaP} zAmcjSB+VgEbENXl8OaDuH>+B+z(@<#Z_m)$(%Eh7n6D!$s%FGy+XI@)L`mch1}U{y zPxq^2*33^GSa#&whDT+UxJ%2MyS)-<>nv+ZveCtGiX!d;8nC{x(sg*RB`_4guknjE zMo+p=yOOzUCRHqs1<3?MrU8HoGAd93sim8AHl4)BWc^3Q%HPJu!gdQO%NWcx*}ccH z<_{ERO|zyl at TWsFS0ov!TFeDfr|NgjbW~kS#<`A4T2fkBSU${S{^Z16a7KnSc?*Jto1#yoiT<<_Y5$%ydX*#L*!y?@sX9lN#MO%9@{I2SRKM4OwEGBx7 z&bHX135Gx94h7VR6N+uLuV{?L1D`8XDs!mQf(R;wUqU;fZ4;j8WS91>6q7fkxaze+1T~-b*38-GCE2#!Lr!0Ui7HE=V(j4#Xqh z15bq%TdmE2 at f%^j1bi=Ep}0X=w~UtqqTy#i8v?P)XtB#d-y_0}Hj2$2i=b*_w!Lh~ zGHgnDryEjuQPx1fyyqCWORz$kHRJ7X*BzGk5`!ZjQ|GJX?Exa$-vPS>{%u(SBvK~r*j=%k at A;-jK|L17YnN?Ix z5hJF5gr&p4ekWr3o#sSA{24Xl0E5f?9Fpi#r8f-H&p0>L;SQ{er7Pwfylw{^&W{G> zWPN61NKT_gAV6raoD9~a26DhWxZWlNrJfj)9yZn-1spR}0xeiMQByki6Z5-LKtXlm z6gQ9OwA0lLcFn5s(h=qZ!Ddl|WVxqF?Aefb)W~I#F`5k>PjI`4Qr!Smt#MVm0!62B z2tk|CsQjuQpUKoz>0%(oLnZ}>4U|)g)o8VzU}-WgL=J0u0~MqZ17<1#yKwPHZi}-_ zxhN%D1ZCzQPH)_D&%!jNZxS+j3x40e{CG~nJ*R^lT7ivnoMr4y1)dk3Y%KngNXoK8 z8G&s>yST?44Q<}G9$v8?X#=Jftl3+~{gmR1h7Ox>*}z55Q3%JEjIxR09g-#CKyVWC zlyM12p4}$B-!4$_Q#|=rZ(kmJ<5o1ik$ywE6*zoGN%+B&8r^rIoSw4RVTThfC at gw_ z+?-pAfs+rl*oe7F-^21<2sI`Tc4Q`{d)p2r7&FuYUO)|!#7fx6U{zSeryp zwhb+X6ErWS6kJBO_vIIytS%3xjiwHvfisc)UIC(PS6E32;ID6(w*Y2Zve{a at yopS% zqfyodlLPLZ>niR3NuS4_SVfNshe4y&yC40JmOo(s`fEY}dEpH~fq|hR{d+P~)X~n} z-hupYGE-Am6HOESbDG>tiWQtTnApBWLVkdv+=~nd30VTJ6RG9cl57kJNyf>PQ?j$S zx4mj>d9@&V8;C}}(7`OwubSw6q`HT>w_LnrV}pZ}#+pk_b)C+>yXg7h&zJoEaOL<7 zj634$!)nkC>_RH49X${x{o|xhH$bm{i8#0&bI5%IcF%s}V33d03`y#SjpA$h8kpJ! z{H%e_kRFO|!Hscl-sVvVAu$?G9P6`DlorYjW5`VAf=fXNX=5`X%Y)yDQNjqK=v3T^ z3uD<4wht9L8=7pEg^s3a^JE6Jd}l4KhTX5ESZyA at tQ6HwTo?2qX>}1ccH6*Rr)Tjn zGB&^#&{f0SDti{-PMarPp^Z0CZ$F at B<}WdA^S-uu??QzATN073i at in%KxHs%RZc9k zsQXi%o&kL_yH?$r)SD$2Ka$FF4?-aBGZ*#aA+yB7e4;q8EtCxH?zRwrLN}8T&+`dx zKW}*+WOvwP);gVL&aHxxO}&2X2-lh at O+}5x?j)km!udb_*VF`yC|+l3{38 zF9$%@vFs8VdPbNNrQ^WfWW=zBS&OPKu6bDfAr^VhWVWO&pU7Zx?UVXka*&PNrPP*Bv?vu&XYH=#V7>WtJg>tZPYSV zSxkx(+Olyd_VUGxb}E?cqILkwtk at UoJD9_;^p{NG>sTcpm$ZZR8QOZ0WLKB at DzkRN zH{cs~SsK>x8HABaTr at N^=xL{?$nY{a at 3h4U7S0Xm>0SvL>5Q=qlI!t403l3k!TZCH zR=?VZIj#~DLMTX?jDg|g8~yq~S=7Q4bZ5l at Uv9=-{|(Dkm7~~DWM5L z;EO}rVxW{V4#6Qpb4;V%QG;_T9pL(mX)Z9c4aYa(P}G=YU)!p9sN&tBlZu?=#NV2Z;Jo%7C!hpNfXRJ!XAFG)z%WARr5Keguo> zi9Cnp@~_Gk#WSNIk%-ww)&ctj@$-4~TG4i2Uj&3R+ozkzXJ(4GcRNu1!5`7L^0=%n z=;mnEty1-B^zSidMSWTBJ7YAhMrH5nsruc8gg4Qimx)=c3v!JcZ4m=NlB=@OV1sOs zWt{~1%^(KwoM%GT*7x at -{rKo?9VJOnoG6L{G3|YkVZ?q4vyp2|QVVtKLfyD%r~`#T z_?+da-RdF34*CtB$ooJmWB)J_MR$k`sT*KapU47s at Waki!0DwXe^)YM%iK#Ko@>aq zo!sC8eX}-{BdjGsm5UXfma)_`o=3YD+Qw4YJ}dn(;Fwv}B|B-D4HB6kE5_Ve z)XXE)0n5Fuy$XxI7K;CuIXq39)vr=5ljjth?={xq`@R5s?XoePPM6ZDyVOB&Pk&O- zWwz1S*wMFjvWx#^O|*8 z1!dA`bkBXv?mcqY2CW&qqS*sKG5YV`qm534&gwwlfePbo^cnbSSN9xmI-C`|WIy5u z7qbC6WRk*9UKSIFAX6-PV_wdllFEje*corh1G+Tvh7`s at zhvlM6WMru7I(m$+hwse zfeg7>@)xs;{jmj!KVLRVU!22dc|~B8FJu(6152nBQDnYJKI3%^U>Dnla*~?uGa9R# zWZpeR5MtNf#e9t;|7}8=GF0V8wPJE=8mcfia{Yj6`2ucP9mJ-w??)WnNBuG~-652e z>I)5V=>gh~K(QEAikowevMLvz>dNO_&F9oAOC#Opp66&`y$Kyd;?T@`4qBzz+l3yk ztjhqH*hZns8zn7=pDjyFuMp1bBn+bys0XrUJYE1SJ|N`wfDWj*Bpc#3krD4Z7ITum zNujSFo$uR!gD(~vA~4}E_(EX+yFtbOSMdGUsxnVpar6KS2)n?@0`G<8^wp>|lnH3t zGlUFW>4lM5F@(a?Xx at ZGyRP#idQruNPt8cGYv?~AR4?^5_o39S z%4?R#G2s-Z>mOdRUaPO928;tQTJ6~MaE!G1$-5{$=7Y=|e0osQu&PQ#S~Ro(y#SUL z`?dvdG}~rIZ-uf$R{9h?g9#fSgM~y)2HjlQu?K`4WwAIL`sad&Y`>WN#u)%QEc`0pF3?Z%x)9>ls%%ST!u|b?&qXL!Z20UMvBLzW1j#vL zp%tHLpCe8?g{Rhda|n9W@;Q5-mzJ^;f8kjKnT^s0-*AsEPF at R;3<2)CF~Z5d{Eo#2+b~#qoxVBZV!`iI;kAv(am!{<#~UL<2B&!zc;`6 z>)An at I%wt8o>lyc27+euCBKTyi#Ju~bV1|{_&S9ex65AhyO_;NFgfQNAk80~ENc^D zeQ=DBR9_6IGlGR5^rC9y3mOS+WzLMiTla$Ktor^K$i7whVkebUz*Fd(W9QaQbSgcn zTR?4rRRq}H7jY!8d?tvz^}~|x+3VpS>GbL+o?WfO-kzKm68=4h{Ou$01BVLs-AbrT zH9}dzvmX(LDi-q=6dim67CkaZJc<+Llaz4h#W!YusMHG6>H5Z-;~C$fXY>8G?bVNA zu9`*pr_mmV5AnY3#*14(pjySHWD@>9?DY(eyen z%=&_SEbW`QLM7(ya9GUO`iM8yv_eRslm`0!#25 at vuIQ!=HlS!2;zMaAGuPT0YP7L^ z_j_E9X at u9C1z7{N=!u#2vK{n8iM?x^(P=ESOVdv at h8hl*{S z{D5M4D*tBfiG#T&lP>?9Oqvx`)VcQpXOB84$1I&E*jMU;B@{s+j17P(pY_9L`RB&N zJ`N}Cf4CpM-4TcB}CmkcTb56gVqqU3|&X_s6khP3a!&n7Qvhl4NUc*8+h zY1_Tez^H2l*TH};BUun3AX(Te;K|*=lc`O{qr^&iQ-7&- z0%kEbUe at t=IHPVATSl`#a6IJ!dc{M}fCX`L|3zq-TA*GI;>eWo7tcEB;$%ITx+cMjRkq%sYdLP40QPsSujhD}Tez9co5yU~D7VogJ4T>FNKQl(=n_<`m$W^T at pQ=^zkBGe+j~&tynx22 z#?nvYm}Y5?-QX<}?G{>eRDZeca>~P78(J_Q7p*uUv&@%D6ZM(mhKa3$fnd+X&mwoe zIEbg@{VO0wALzF)kYHfs05CAV|0y8aWiW{ z^WS0F{lrtaARGBp7s0wC9El at zwsZroDR+JO1$IkZ_LI)a)l&*x&Sf)Od+q7pHXBf5 zD2o{uR*#T_9YfN{$koiDWs at AK1;z?&i(w*+RXTBSq6^s-W3N$m*6*9T09T at jyUfn6 z;$HwPMJXIlq3(&5y7kvN9!F?vPwG)-1C8Z3dsq7|!FoAFj_pt6aPgX&h| z0+jB;Lem!Snpj%1yJ#x{X5t8VEcYO!Ht6mb0V_NOv;~eBgHXNi_d>qFCm9;60KOZ9tU0QbPJ0GM$$w{RhPre%+(9>IG1&0 at nV!m`k z%Bpmi7(pkyfMQjs^qLxmkb)@%alW875vSh`Iy07{<8HJ6-Y=PsxMagu(%NiYWrbb5 zbv!RO(01~tH%E_F^LPaDYo+yID|JTlA6p at fLQ{jSI6jyh at _c~PWkuJJ32RmxgLVTA zQPc{yJ}W|6;k1>4Px_%s6j917h!Kt at 8?8Xb3-1h-Ge2 at Qg*mV|l;H%`1v}A*n8Fyl zRBY2!cVOXtj1Sdkj%pw&VKe~}52`l at wSjC`f1}jKyV at i&o;7gdSE>`t6^ou1J+{nD z-wAWE0*GqQA9NJh^_N(tM19C&aBs_~YU;3;$=wor`LKwiUdK&!}h#5(I*ZG3~MUAhKFpELMC|^aU|gv zp0Q~Ra>7y!PAA#d2wf4~Uu#U|9zA9VOyE9J_u2R57>6;6M|pig*&C&Z;J}FBAT$yB zfRmcVZ6Q{?s1DZ~O?*PxlEfH{58n}@3973Kth<9kHW>@iCn4=!88#-$|3xq)u;>TJ z;zzVQYaFL2%iT%K-RT!+T+AP*&N~CKdF~8&B~KjO$>Z6vukC=DwzQ6!{rn=|q{#Mr zVT at 3|I+*hH7})D)AcA#wYJ%a$k{8$6E6HW(Ows~?!9hRFAJ9w)t&8`jId<-!DD(|g z7B?kj7i>q4G&c4kat9dZ=TJTX(g!!kr>_Zd1 at V9Ux!T@@ao`}4tKR;K(kq_sgzP`y ziS*_ at a8~$!92aKIA8YB9IE at m1zCwqzw>0TrGz0Ww9b{ZvO=DM;XUifxfZAlC7LCEKd|E8&wY4s^YX!!x^nf} zT5vVOc&ZuktD=s><*f!Eu{k6~$ez$mF#u3A0d~`$dkfR}nY+?P_}FZzYwK zNLXqEe at Tw`|C!{_Ft&3ycl|#l2bwUtKvN2%E at p+&Uy{QnEWij$Nz6{XLBxb!g#I){ zQK2ol(X4CTu1)MSnTfKnA7;PlN8r#OlkTRPP>~OtDVy;G)YqL<(Z?i!N*~mOgfP;-K zoXLTIqV4Loi}s49-_oI8b4 at dSu?6r&67qCDCD5~k-a3dg1F+~NyX}^L4j?SE#h~jY zuTxxV-+sdbjOXI?)&J6^xEZd-w}yEz{=o8&FUFDnHFM_vmT(T*_cfzJwanbwd+-Xh zOs=C5Z&n%Uv|yI=9CYofYwRjH#~p4dRCjORzAr!cUdviGuHsOgW8zw7W0(F^kp-r? z#W==d7{P+h6s%9FdW2|v?p0{=eFLlGFU2tthrU^A86{7*`VYl%pu-D=7iZmtI8osM z_id);#4D78Koon41y)}Y5bw_4-x*cLdz+zt6Jy*QT_0zgQNXsnPhuRAn+F#A>PV*4 z(4X)kBn>*uwJBEJiOlpRUbfFNX1&S6lUUzKPk6G+r+qh~5T#E%Z#`{r05s3K5#;G2 z(IB}4GL0{Z=tcql>+GG)KU zEtp8n6M|APYN`xk!*oFqOJtQ<8E=C1SREt*_+JLyag5fir~+AOeiW7kzsRt^%XM-a z;^;=hAxqnb%PDzJm7w8tVU;0jcwEzouT!D2>B6IRy;6tv17kN{X=WlPJ8?nbkbRP5 zF3q;3xaCm9{yVu!ki4njSEhX=3~*Z3P+2c2G9}oqP~ZUc>}!}a^2*>Z#eao^c4z`@ z{4Y4t|DWLauZ0fl3TVpc`j$Gpaya=S!V&r97(V@&|0f)dWf#&otU1=Ds-!>mke~OW zBdxCcpU)i=o^eL}OUVk99COSpuGZ39{xaUT7o*2aV3-XR1w_^_8m}-km;)xKI0%WvR3lG{2Hjc!q at zLfs5FC{1uXSn~A`tz28_7Ta{smCg zqmHWk^Jk*RS0c`U{wLVXw0!^WIc8*O2d!FB7t(;zQ--Yw??<~mjIaogF|8F?(5b`Y z#^uDh15KAiK#kQR{begYt#>Kily!YE-kqqN!xHQIq5toZCb~MTgAAr;>?o|*fAArn zxaKUjRPLmC at TnC}&!^X{s~~QNyLIa^$;RMnjb*2WvEYEKVK3Y6>!Cg>T78N=R37)` zgtySEc%NlioqsNIv^uH`P^2H>t~U(0cp>D16Fqo`v|9Xz7ZimEy8olhO8=xrb^$Kg zzEQs{pKQ$fnS~}Xfgds9x@?G6n?8;bOV!EX(~JjBpzZmoT)1DM4d#`YeS_C*?Q0#K<+8jZh at QI9Lac0YkLEpUkiDJd`ucQU#I zOi?wZ6x_8+NgUyRK|)doJxS4$Qza4Q7smn3xFzy}xs*a2fq-tl(d$i9Y{%ngfJ#>! z-a+2)Yx%raha at J6&S2d{cayw_^H0qLIVNs_sC>v zsO}x8s~=zgfHCo(Brdb@>NEP!QW4#c8}4Mi=6sjVY(}%!p0MCJp5%Eucf7jF zzN6 at PSP3VBSPg3gn;UR*ph(1^8Iw<4ePe at 1L-@Kax9fA+TW^}OepGIS{G{2k~ z8qOr%xCpcP2N>Yy^9b%m5ze}U5N~jI^0Pdr*zqsqcHfTp*ZWA1%;4 z33R{Gs#iJax&e}-lSw7z;T*@Miv$zohD^Iic8T>EZ(>@gQS}rl%v5_gk+ky;aF)&r z1Kwuj{Lx($=fi?`)pg^S}xgVbwWgEBflT`um{=r7sNh;WX3HS48oQ}s`+8uO)}>k=&F>5>!m zBgg10=USwQgOxmt)h^qOFW@<)_BT*iJ;Ds|Rs6p)Y|!NOX$lM6HkbLZpNh<=M4wcm zDSqTfnchdp)M`+d_Q(4*mH%8>(2SnR^U1OUk at EI6hU42Z%_dzbWgy z=-DdqNjq2Rno1r=A8`I4MyNDB}_y*sd1PjtI6qPK)LBkH>(pK#E#9!yzJ zaKd`T3Q7Q$$u(+lP#B9~W#n7~wS*)Gw7Lb;$TjIH5cHxa`N9aBCyXj+Sm;MPM);6t zC6b`iaZJY!#pp{}OROWoCW?bP=;VmQ0JzG}gyD~r3<#&3eXw#S=#y0)|F1#xn8d^6;;}??Qgdn}Eix2D_Y`+$u3?p)q zc?On+<>AZ1p?)u35#atxPrkx7>T7K_CPzguD!3tAu>#m{zzOCK#g8tNPcM;zW)BVRvBmR1lriYbWJ`G42=EXKDYlfo1ppf zzbihr%y5zb5slKDUzH)KomWI6NX5lbYLu#%mywJ^rCJpz%k>#Nwr#O&pMDLumI*Z< zx2O0hD1Nh-X8z>@eXgq*87xCXlhU`u^5fL z$1m at dIApqUvQga5VpiO9ZIq2M{geARY#^C@`b{Zp)ZYtS@%0)#_vi=*2g|R#uZfk? z>!mQ}*z2=V>KFdK)$tq0-ec=mZ_SNa?`3J+C*+YP_TwfO=ZI7$L5X4}9h1itHu=hzk1>z2)wigbM?eofB#NbGC3xO7Bc|6vV!{cvMU|VB at B=M8-b@ znf?*z%yiRl at ZMd$&+K9frDYEz>V5ZOw_)p*+#+C%>rr%e_KENGGOj3|diReQgDZ z(;Xb^jV;ic3>8sp_<%K?Mwo3Sc%d|W(JZ6_tN9&%j_6CQ<@Divc2AB5Eh!w^ug)|X zNjP8eFFEOy7uE at K< z+dgb4fxCF6h}0k=zy>o!uBPi9vahdI#ou#bMH$udXV56K0XU$RZw(1L&_nQ!<<>s= zRXviwlsOt#Sxm6>Jis5&ig2EuBg4RV9?nMv`2j5A9wtr-sTE+SOt}4qmg{z zj$TmAW=KW#lxKqj`yQbLY~Tfl;Gl>K6h}tk6?V~Z@@Ss{d34X<|BJPE3bK4%{=B=a zRYsR>+qP}nwr$(CZC978x at _CFtKWUjocAAd_SNi(xm)qOTM?Px#FP0+H40x3!@6B5 zUCJp9!!kI?SD1y<*x`9_r7`q3XtlL~Iuq}rT})4Qbd+*CjIN()DDUNKjDCHdjCEF% zpU>m3vig&sRf762z)5URE(f;{Li6&k__HBA*n3vA!+15g;Y9El z)oI8W;EesI{{vYfr#)SZNj1TDpx9^3 at IGF1Vs+;89BnfJWIB;4Q2~z` zjd7g~amKJQo5OlgETC65m)=)n!6n?(G8 at bG*Hcl<6{$@)7pZAZiG at +BK^+DVuFLwV zk|u%H1+P}sVcO>Q8&h(uyT)9ICe7$pk?5v63BrU^N2B; zyhDy(kIqG(fvSKhX^B4i^i28X7oM at AfK%`|fb?3~v&sc{XsA>MN>%0_FEs-4qmI9h z2h3+QVAia%E`=ERuRze7#lw at DX_Jh9%}p0{$2Lk(Bc%&>@b8RBa6-2SE-Z#Uriq!DIGNgF#=nV5L=*9mUvdjs}9oD46s%J;mm7hCw`(QVIn4F+N)ZQ zC at I3wiUTpxLX2VYy}1G472VquSmO>r-&O at 2_74tB^{zD2`-Rvg5)$lz;13YbsSwNP zLc}7V#2AI&Q(2Z;S&g+W8f!wVtqdAX*U(9^REJm+ZCa@;J=fJt7kVQXbj2+6GU%?5 zlb at r&7J5xmo9$W_eAi2vBE#461VEl at Q0hI28$yYpW0n)GQJ*f#_2hbXs`ova74-rr zv0c4RZGDl6rW5}@*$9x-Rh{^&bnpHv#IgOeq5J=OB}m!%*Qm;9pBs+z7AFLGz7SXf z-bHA%#AgSGUwnC#5>l)Fe$tk?X at Ql*ioh-2{V;?K!Y~A$$L${m-t_X5RNHF^(xtF% zuj{uvj7W<5XOZ(#hO4VThuH05FN(Vq#4+!uCKBUuh=`31QJ8l~93`li1X+l)6Ja;Pl)td_BDoGzW0+-EwZeOv~3w zE?EZcR%qfPTQN2kUNsfui*2x>Yr=60dZpCb3RPO28cuT!y!Opf0|*u}KU-1^u8V=V zEUHm5b4 zLqEpVE_DGdYL0WU81Vql9_BD~I49zC&?4 at Dcm1)49C+iIzr&TEz-vAfG;#)|ALz_n zuR9I~k9&0M1Hd+n-?M at L7K7kj4~uKH>J68G?~;sgCnJuP!QsCY`F2b&8kNOOlu~LJ ze&(~UfX%ZV)bqS`KZiWf-Kr1 at 24)XL_YTURO_D+2Y#iQL+xJ=9*JT~JSOS=C`M{ZJ zSN-_L;*??h1Em88UVoV=*a!6A?m@@;+UEaP)y at F>58)sG&i?-U9Zg3ISq;HgPIfHR zxW-%osG`I_5nk{Xq?uG0tk0jATv)NCWh zcWv2h(t_d}kc8o+1U3gN-498;35H&R-2KB0pGpw?Q2U9zX^d0f*bGb9QyHO=B9WHS zy^ljxadM0y%c4X%dTr4!NLXYi8w(bylog{)y@!<_SxOpHm7qyj1VkldR(_)lx|bVO z-BJd*O{*(mz?HG+Of64mp(XahoMun)oPe=_tsoPhWIu zW>8TqRZ5mEoolZ<1R>muf|$7w>~#sZc_Q{^+?n;F*g~cUCM*Qtw)Y zpGAA$a)n-zBnkbVOkycmGR at yLPwDyXRhJ*;Z5*RM%C;3xac$VttH#a*R zDmh*hBZ+S~5P#EM%T?RgqzdDXD;GJc5qkQkzL>qHWC^GVPch%+!BYlIHCnTze0#C_ z*@`g>VRM{4LIC3n9id7CYG*=yG(DOLJ*l362v}x>bf2+RK2bh3f0DkQ=739n4bQUE z7egf-$&zsdF{y!QapbNic$CrgPIyG*6W<6t&G<7MeJ}*x!ZLJRb_&xtl&cpsv;oeg zLM;+ig+Ya_)58rr8arA+tx%C0(Q+lI at CyX2q`l+3 at uz+v2|JGJO-vT#ecKRJUux at H&$FZ8_BP=noyV(9^69u{`7D z1tLs;RbO{uzFFhfVAr+*3;3~wQ at dN?!b_6Zy5|c;QVp+sx zArN!2!6fo^3$od7L^FFHKsR(Z1aOx^k8SwxI70|u+>lAsf#t|{Aa7uux&tqlJcmj+ z1Wa>XaQi!lMN!)?g>`eod3P9y4^HASp--cLjHSZ*<~W}dvarGJzv{A*oEV5 zVR78f&cC^ch{HlO*(#psxqV(t>k+p(pn<&6b$NmD_+a_?f`E8K5pjQk!V?V>wNDhO z?;f-d9;ojnsZ#zVZ-)Xb(81L~E=WjLlb+?F#VEZqxxk%J!~hYWBGJZ+CEO$Q*i2Ha zC=%OQ$t+M5X}FB{GLB$l-p{GAC;nkWE7j6i9aJdXN9E=94`2BRPv?(MO-9QL94ece zp)*X^6O1Mc_a`=e1I%-WnE1lJyjDvIMhDg<#k)z29XM&13KPHUnJ3N0E%G7}7Tamb zcBGc+OoD2xzX!r~Z6^|ERV)Oy!O?X5DK7DGcyv|9W+h{bNYWY_x7jz&W!J!$MPnFT zX#d5OexgBr*EKYG&nt@=lHkNK-jQvrEsI2x%?wR+;+W{fA<=A~=*SgH{+EEdjxsAb zMiVey%QLd;mJwqS(Z<5ic6QI?_I^aMIpXC{gXxuwj42syiY4>)qxgkSekP=pg|kXd z5#1j$Plh^#Fd{Nhotb7kYYG^Qs7r%K{I-ZB2hEAkQE=>I03b- z>%t{?#8YWs{>n4FyH%c8`B6zYeOAir6_rg?p#u-!}dl`3^w^gP1uCg2Pl>Fg6~Ld?-EoR&_qGo zG+0I#IhFM8?p)B_;`hXN%3oE7-GF^!lT-T}ey8@X;>lx|tYqe5q z$YgaMh>PvsUu?;Grs7P0U6<}jPeV$ZK)Z4%G+rfAAPcA3MA0rJgRv#JxKx#^MOk at n zCtEYysfTvq+cT^;Eh)#&%4~>?pJJwJSEM{Np7%fjOfCa$j~^=syrou0E1&?SHchIn zwqvZ2iant at +{V&pajv3OYR`nUPv@?_SE`jE`_65U28^|f+8u;$+V60MN>jY)ohp*m z$8BSH6i<_;cw(I_5!*A^Yut at -vWP|dUOf3Ac2|x}kpxio|0%9jhWYCpSzDEdgPI zExRoRA0Gvmq-145U!A{2o33oH8W7eP1Z7GE$1=V}_TtzE^MF+ at h;@>GyVEs)`*2zp?$HkaXqe59q at FvCg zfr%Qam&goK(5>5UrA`u<^gP;XyXD^b^1dGxYZQt&WwPTsNK!w8_L7}i*8OGd&iYNS2TsjK$XDuA%Nx$1KmpUUmV19CB} zU5db#KzR>D(|3lS@!m&1kIeQGnLs4>Sg8tCF1 at aU9F z;1=XO`TYDt9V7L4A8^8S`?sCwY#;Vn at 4w2kf`14t{qK2$l%yRyq<_JjCKYP2%kXQK z7V$)QX!t1A&h2WtnQJNxear`g>|m^SGmoaR#ftufGBC{f4M50POZ(9Ceu!b1!Iy(s zQm0)`UtUh1n3|gTeSLp}@IxK3?~heg==b+40z+*oD=CaR0y9*X57XeZxoplkq!F}? zmZj66u zU(H^-dfsaF3w{fI9<^@TB;_Mk^Cd_@;z~h{%FgcN2*& z1VEGZB{9%xaM+r4MM~AN&7!aT3Mp82v at NG}GN at LrFKgo1wX!m|*WAmC5LBK9`oMQI z*(ODM^3dAaOQ(;PHM?F at NC7S7C#uU$jA_j`l58wHn_`!d1Lahdn+d{6AD=olQdTtow2Pw zPLZAQ9$y7g2}NN1SiSo%$oPU6Yk5CX1c?&m6re<9N6!ZZOs4dbt)^lgAyCY55h?jB`{zQ%e6$0`^ z({EzwV;D*u#)@n6 at llmH*T>jIy9>HJVkX$??vM+0D=EC+V){DGf?Rjvc zJX5!AXy7 at a&p-}W2N8yG&wuQ3*aSPmt<7Z!!6Vt`#>)R8TKc#KC z_`Y*uY9chM2`Z{GnFF{PYPJ%=0k;+{xw?wI0{=5^=9jey{?0jv){)HUT5~jGgjTFf zmI($=-R85imyjD9=Xt<-l%SW|pp`sbcj|na&$%oHzRuvjb)gGt1Ws615 zt#wTc$SiuE!6lwil2Gm5Cvm^ZG>BY_l&pdr at 8(n8d_U7PNR+|JNyO>}G5wA54Q8s%|Cl zFpu#3?W-XXI~$Hx{u|%aMo6O%nB at jWJI_JtncR`Ma|E5N5cCJLw4jlNgn-ThnuKT+dVuHqlDgUN*@Uk&M6yGidb~F9Nj?_3pe}(IP;Kw zu_0)YJB)d+d6Hs_lyR7ODd{GN$>!*I+8Cyela at Q6UXo2BYX4H;h)Ci!1^x_5iyMU;`1A3%+f}^789d~LHwWF4iNtZ at LVF!HV4$;EX2nY^7<=-njjfM5(N9hd;j3Q)ta4l!Dh2%qNpJ}(Z#;8Y8F} zY8ZysWuk7Tx+5%@b!&NbmRf*rON~w?hJRlR{=KyRY}#P7fulq>Z@bZ%I4qh9flU(pFI5lWl}C`!DK(+>yL08Je^2uQ`Sv?wTG$+&dPj?w}4s6wl_ zGOf6TQ^uEBn?E!gPB2Xy&Oazfb=f#mkDsv%b8a0mDv5%mgnIP}1^HL??w{QGG#hH~ zzyzc+tW!W+Y$lfgQK|Nv3vx^>RZ87U>-iNGYhJ|yH&*Gm!=mnqTk8nJ9Pz*HEsOiL zWyiuf-b;P*g2}f#JxVq>Cn(|P<61EzI=7tG-&F=T3NadmnLmBn%}oUYrekw11B#Ul`KrA+#Pq)y)8 z|LP5SWa%KzF8qTICio6TH=iEG0Mr}2U_2AdZ3YH4*CS{T{K|P0W%kKX=;p+QzZg;X zT=2~uJOQ8Yi1(z at NtjN6=aNU)C8|1949aM+EnxkVaj?h-&n0-fydRMd!S@@m^6L1*Td+4awh?$s; zm+0-$~eeW^~&1O`9t122J> zC}s3SM|*OTM<$I?-*G)@(8{1`3eaQXGnr`<|A53vc|iZSKB&Feg(&@{4}bm&l!E`4 z`tY}vHWeME1$hLXG>-sV99tHdY54M?|#kI`zz0KX4+-^9`Uan<&zuz9g`iWHoPX|rF2(+OLA=QG~ zLoayR1B~Gn+bL8Rc-X_W_HSCFEkcm4$>r&Z2;ER6(^DA84sxSE09#d?yCze60Fbqx z>z%3P9GwYc?3>Hjld_DUPM&Lv*_kpFVjIQ9_mktyM=l&QPnPbAqM at HA7fT>lBte-B zGPX15nk^Gm0OYkq6^Ue;D(hR&4%A6vBlPY=V#iq1TFYlkT`Ej&Z3u*Vimk;Q=0RoS zzN{j!&}j^-l;9T=mn6DnN)g*G3P4z+sss~sW=)hC-71Bp{%H;ij+apxf9NA`#$fN4 z@=$)B^}!LGfoa`X;pAI}ac{iz=mqheDbibqs?K2 at 4mbspkLYmvBfe2C!EPxdK%}q> zuAV^Id978K<`#Aijcs7|x1(XjYoPONrSReYkM(P`iO;)avSwa1);jfzO;nK+hI){F zGj$8tR;(7E2N*EP>B=<{-mkCWmOC^SI1JqIa0z)7T40vT~Lx~X~)VO+TqB6p` zQA)T1yw}!TM-|k@)w#3`0m3wrESMD|8`m zKW4y}jc2!07a4k?SC0Dm=PIt!S#+ePg$&zdZ6NO-2PFAAI)2OLSJ7CdaR?tK2?D>y ztc4o3Oomgb9Tzv^Oux`M at e6cOt)b|aam%JUf2GG-*Z|?eAZi)-H;_lPoBlm{aRAO6 z&^ykcgC>W7Zo)F>SZ+j2A4HUouo!hKR4bGPa*h at xy>&s<9?zj$GKoR(H)?~>x~Tkn zXwqXf5*h)*2S#I2uXs8&GSTJTR066MbiOyRw*fHCUEo~%ab#~qrP`k0 zBI7U$USYipqQjR2w at mBc-pje#-M`(2zF`m?^Zd(Y0Z{)exBXu(`yVG&zK}&0K>04E z*|OER4y^epTp_PntgXDLiqb(YPYWbi$j7|VSOIfIyGBbMw~u at aBEw85EV1ZE${QkQ z$lbJ+s{13#w8 at Es>Exr=>G=2O=hqRHKM-|z`5+D5xx+ at 3!RFqS&h{p9Ma1&2pmhHa zV9{=byMC!Iyn9pSej=a)z_rNNQg!zLzKlhtVRXrnwdy!@x_)`qthABW#J{O-;BhQ^ ziqiLtdX;PZd_r>E6=sAKI&vi`kg!ahqB@*4#8YF56joJ at 4V~0v^ODKghLxq6M1Y=w z${tTubZw*e%3rexYAhzUOiA(ptC#|gTC$_ZNb7QMTPz)IOd-D(lmKmDaXl at H&1X?u zMok)3YY&D_ZZsX;h}cI|eXFES(}~K|9EDa4&7eCL52 at H<6B^VExoSkw<`aw{r<^)g zHQIT_$g=JS_R(yM1?7bV?2Pu}Qs%WyW^vco8(ao08a^B({Tv&mdUxaucgqPIZpFz- zdB%6Nge5Xq5!Mv%2*`Bf@&;4D0qS-MCGavYoJU|MVpP?|p}QpVvAayl8e_^Dz4-dM zIiVG%<9u_a_g->QG3;7DgKinL(Jk#+mZ)Nea!n$2MHufj$sV>QN%LNVKN(W#EP(+g z5EK)nWVn&4AS7a^EeQ%>(2Q!ApZ6)-GS&!5gbWzqV+MjmKSS^S%*-(KEpj*aG4Cj? zApZpMhBd20;ymX~g2!Y#u|GCzQ*vv6%G4kThKF4c0!2uVkcvvBx zPzKr&W?dl2Om}Jixrc|a3a80Fh`YHrgMj at CC&#g5puqku$o?H^|7o(lQv;)QauaCf?nJza8_{_;$PqZ#Z^tSD5gQV0k(LC<+*nVYX~7tPz5F>T!-`+a%N}X8^Qw|Ghs<9doNd z^p`JlLH_t5^^g0*|BAr>^Xu>2*BVt1IZOeRKd>tkovO-_Jkd}2DT9GxcI7oC<`v~N z@=2^;W+61S8m?1~>F+u3VKUtFtY;9XVV3Wv9E5=}#Qfwqe^t4x6;DE5{S6mKP6lw`eA_RFhb#tY1HYPEj4D; zBPp~($9HG0#~~cMEh{v;2W05ot94qCv=Qom at 5-#PUflBrCC|AGOItXW6e@#u8=_lE zE_9mU9-~ANmHER5x{#)R0=cSn&>QL7;d zohiu0cU`w~&l*T!jD#N4S6xbpvGfpQu%VXJSSBA^Z?&%U)-mgJw?*%-Uymved}v@1ziT z&o%N&y~`mMS(ddHt84Aw7%ENq)#cA~ZN_XPSLK59o&rpimAaa0)jCDw1Tm;kyr9I| zgZaS<)zI!l21rUsr3{k at o!s}*9ojAIojAF{fNe>2A=UoQU|4I%b~o%}+!kdy${2!W z9YT!bF4y1j=K}S>+f32U?4qH(Ef_laB@@#+`pO53tAkgKBU_>!>X*H3nQ8~vLa&v_ z#>`G4DuHz^n1jycJ;=1pC=l2AO9Qcv46}xjP at b6Jrz#Gw-rdeXnH8}S2ZcN2wzFTZ zN#!i;yTu;#NIXDMzjON$If5Rz8nW9(io#I#Fb8c4No0{%(MK$L7k*{@=wqy4IPa%o zcFI8K2t9z%2JF!4$L0;9Y|syrlCnU8jWbl)BZEmV({BOR^lrVQ=M!;+*hTdoQMQ at F z#bne7+3aNmon_Xpfm!@Jxe^!|f)F at 576`Mt}-EtG2YaP?*?QA>xcwLWCyvNyl zv~JpPIj!KdpZC8YHl45^Ti51&Lq{X9h&&?nJPi^*AiHddmiq*X at 70ce{H}@&7;P`M*G1vW~{$=*)zL{3ub%PKbiZl_dU}!X at C{@rH1$Cn5{I)Vx6N*DHoRtd z$Mybv-(&f+_dXTi9PnO_aPS4P-;9E3Tla%1LhIfa!KDrDn}DTZ?G830=-nkfQyIQh z;??cB at M+8j>z4vq6l2oE=x}c%1aj~l8 at x8)19~Z%8GSGLRm&}*rNKBtIjy$Iorh7i zO>SXN7>BDlO6Rn3SY&wkvge?|diw3jGp0?9oH{nOMdRj}vzRQ#j31j(v+9|hR3~Rj zn=_)fk5(lo->N8Iv@(5iaIQ ze;T8=a6(Pi^hiKqj$3h$5q?) zkKLw6_lK+~vb5$aE$VZOj16=1yl2+3lR-tXrcGVCRg=#@2G9vJ?0%*HRY#|jVP+Nk zg(|3pfuMR33My)(S8S)DMC5(SYeJ9EFkZoih(#!KnrUVlDCV|?T^eCbWk=;?Y2?e3 z{7Qq0n>wrRCBN^M4dFj$9lNr%7r&mGqMl8%S3%Yb!H$5`ck$rK>XM!Hem)c?6 at m~% zB at 4X*U~(uCKA`IWsA(qpRl)=$W{{PAQWt5}xb#%8;-`bIeS_t}3F at NgCB&Z^?TvBt zw!|}1;_Rq>z9Y05@|NW=?t7{n=ZU5(Rzu8`wS{y=$f&_YP*)s;24qknW at T=+mE4~? z_W=mcKUE(0IKbM_TRZ9%?$B(j+_A)zyMx?RHV16LZYtdMF0s+#;BN~8<50Y-_mRCT z_n91a(PPP9wTFMUSM5rL&K at wtnKp???b2|3O17U3tpEn)0?38zYE)IL2)~D7Cv*DJ z2(+yvNKm{7?JJITbIUtUMogM^^olsQWM#wRAKO$}sJc8 at Rc+|C*ZNTp9YNY%)B<`M zD$yu9ojOUd)SWQ2Twpe|ZG&22&Q+a&k96Bo)xTULqXL}CTBH*Q5!I_?YoDw{XoS96 z1f#NhB%DHd zzZue{cb>bX?!KLECqeqcphoI}hxht%BiDR1-1JyYByy{I8D#DzU2e$ti&?bNweVMj zd7ZH=I_p5mUh9|-ePbt}H&7<|Nvu38QW%f_ZSHRGXJ$7J5N@)s=4BEIA5h{8zUVTM zN at F?E1&KzsDlT>*hRXp`2XPFrUOti#&tMPB7_z3h?iQ at mT6 z0=joDZzB>q2-RIPb&cGU!k!w_D25JKcnO26!2mRs{x}vw~UHCs=INHN2#Eye)4YUj= z5my>PJ~(6_pCs)6q#ss-JEHGN79%;z0d17_STEqdlFzNor$(~K!%i;Yy^7D%724Ly z%qjUP8*Su_#x6eQx?tB0w{B6U5&rCbxTl{J$2kwyJ;npv^+`2m_Vwp)00f89Rp-BA zhB(~+4Uy}=V#fde^w9I~&8xp62ICa*nZ6K33Z-Pqj}HF%AA#|K%jAks1+66l$&<_& z8x%}0J~H4BMgY8XU1%@MwM71*?Vzq#@Sb*=ysFtWYJFS zGh{#8pN8p`r5_X|u%U_oG|_Hv=GaVI=^@i>$Hv-;2K1oW8aQl+ZNY8stJ%44+26uM?+DC%T!nt?e98P8t1sYc6W(s^@%$OXCvFy6Av z7RQ7={xkZ?ff7J*n$ilunBwZmIvoKS$ z7NiCFS z%K41cqvy1fl{HXknBnj3nOsoEBhtshGg?G%dx98r?~1>ypYCK- zqg9%ZOBvyxI~&eQb?0SeHG!XI8j-9@%EWn0b_2S(?9M&_Wo>hlYzN)fdR*Q~@hYM6 zMJcj^7Zo=_kI|pcD~sstO-yt?+{QkHhY@?38(Ot9AE`dxfHGsL;V^uyKi)smL2%-_k6K z?sRCafMM1L)rJFX;7xZD5c*tY@@!#-1iidbf}fqN|M>DYN`SOeW=`BY at QLdDa$@EJ z;+qP{6~6!ZiZs4)+r$;`TS~&0TW01DAjlbT#ia6%#uaWz+V09!HQa=PcI}}YVnJ>+_Lh{5GDH4^NPoXbQAxI8KH-NrzZYM7@` z=>F?(>sY}&E;CG^KYsKB{@J|x|H%3O at ZFp+RZx6s?IvkAf}16xS(aC4Q~9w3D^(zb zi6mHHWh at 2Og==WDaEfWWGEByq`G)m&fAXzjY&c&=>*d_xJxPr^rA>u`B?>+S^t|MH zO+REi%}n0zT=e|`iWiaj#omi_rj(2 at S{cl;d7M}Gc7g?Tfdsm_7Y19af at H5I2*}#B zjqRJY|&D%>`cAgMdDHBaID at e$BNu)We%M(KzvB~ z=#XSkt2l;^!aX$Pb07LHnUkbupaw+!j=6^|GWdyJOBU9uS zKz$Os=RK~B+Eb|x>+2dqaE&=QHHVj=o&8LNdx=wkHvJeFj9vX;JVPcGm*PWGL?z18 zq~axg+z}F6Zo~E%UG-7r+Fx{`WFp>&(SPTED#2Bn8Ct^}y$lYKjcME^Ww)p3yfKs;8bYd;vzVno1ert2NhaH##i;{3q&pzR9+@iJH^4Q7g7V7iXpDcwGz_2^>rH+BKvVpu(UOVqOzn}Bh1<*EY!;^ zSOU+mZ3_##!jk1->^Ry3>!wX^7sO;prOU~a0XXrVGl>1h8am?>_4idyVJ2m#|2ox!Ac9bsolri!gHEx*Ul+V zB-Y}eh%uQwLWyJlbDI^L;R2Eh5d27ncjY&6TC$dhy zlh?tj;INb`u~0kbqNY_%M;noj1JQduDO)@&Djqo~VRSkYa6X(JrA<<$5AlX at dB%U( z5gQ8sRv48&dJ;T4Du9;r^Bq`^^8$K$p;P+hK-mzPIAZP^xCXc;$+;~Ynh_B(j{{r5 z at qrh*;Ph_^=KeOq^}nu3lmDefbpJqy{?i1EQIfG+;79Pu;&ixTXNC<>%=a#3md&>< z5EqZ}tcXNmp$Svwu-_o28XeY9i$$K(3y6>36|?^V6+8jta4be(nlsC40oP)3bLoD3 z<;8Ts=jZngTpxP^ZmK|Upw9t|9JgpC5|$&1WYXeMeGn0=f&(}B>Hh&nP;}dl84)ig zFcx2ja}VV9o^ZnTrzZd>eCbTdMYkocBC80N%S;OQd6+Q1Ml-x?N~64UP(U~k z=J_j(hZ3k7xl2^yl;9=T30!gEj?94oY^vx*RAY8VV^ zjrLeD7`FQI1B}6?riJHM1p~2`u+@>O5Ljx>_81cIk9iZrFu!h|DhTFhqV%u{BJW1-I2** zm&MKu<)@J6Rl+2bPg5i=7VS|MsZ354s>E)$NlZDI&`_Hu4eSewkM{==$5)06XX1lq zxF~Lxa4M(qavNou>1E=&&+Fs!19Fc%L7OKx(KjH80^pvlR6>zO5m$QNtqvh0Tajvq zh7iC at 3Ra$8^d0I0ouiP;C4{RqX3UdM7ynty`KDn+s_0T^8 at 69*=l*A0= zZ%)~e*LHPZjKC;?oi}my_`~0=0B|xnVKFf2CQr>t`0Xz>s~{Xmrspf99Rq5G+&L?dDaIb5Wmt-D+DULbGq%w2a>5ni+2`yEW(k&y zblHZp3>HgcmDN$b)d44p)mDFeh$*zntn2FGV7`_YR}m|Ym9 at e6fHf5(TPiJrfG-C* zq9+|?@SG&0Xc;4XVXSA{p}*d-mqq*|m8mPu5m^^tAy-~HVvv)$QkXjCfArAFzqkO- z!=X)Z!9B&AkdHN{T)8tq$rt}BSp|CkD4PHu?WUgJQFAgxv5V=Pq!953dG%E52x}GU z7 at b!RaeIb%_ANe*ba5p3SGYd?r|3N>MJS!pUsfm{!fQLUw!x(=^y}GB46YNP4kwozM8?#6V@)-=k2(U+j{R2V+dsrulsI6TO zuEFP?&E(EZY+9BjwQ8OVYvu&2^doIr!dllq>R$|QKAK+y{_J$OHQBlCkYZUU?M!!P zyd86W?=U=UAN+Z{6^k%WSv at M_eFtIlJ3N;2JufSxx_dOU{oXI at o8Mu6=X&{5PKfu_ z6!|Ukr?&9VtOj!+JsBt)>SjCh9yr!sMIpy85ZzysF(XdAzLmz5d~7NzfI|eqp((VC|3vZR4_&{ssz zlCtjKZR*B^;V%id;qTOr*>A=dwFFuoLIU8c z+_6aO3mna?i4n)6%K!ocpG&v311%v;JXUV7H9BE_0x;mC$Qi5U3 at B2g_)bEE3BQHa zNvUnG<4DCeL=(po+UG(?=Zt}Klq+p6STb}f#0hbjkTB}!p2Z65&ou?2a9Cl*=0!KA z?;0B1e~SlrUO6-G5fWKbS}7p23sjZL+nbRluKtv`N|I;QP&aaG-{b*glen7LdYMq3 z>@S%_sW||_T}+Drae?q;{&aper-wQ|nW1-&&U&dw9ltWUuo>}%ij%2oUcZvj7+3B! zX8M{|Xe>NkQ#BKck zp~{{bZn7+}a~#N>$J(SB3fke7_yLHGRR4vJj)%jlsK_PY^pT`cju^m*u9bBCI{=-q zutb~4Ku(7@&uX->dpR3KardWHuE2mNcu3H|ok&uIH1Wu=O$Z4qu0(XR4IVEf%?jE~ z^Ce5s&+!pRw3;f&B+y!g*rs~%#RLTq2tnN?oA`~mW|2kXjed7-+XB6u z7JRSnMb6a$O|_xSdn$qFL!hKeYUD#GLI$qH1oAPb)k_^BZCzRlcrr3`&4~?Yd-+A9 zv#BB at 4Dg1GCATu86%5DODDQz8D{UU!2oO9uMyGyp4m{>H`^k|?Dh_Y?+50o{!2o{$ zuLCXw2|W6T(KLzc-^KR(z(b~8F2~g2Jag at c5)!D08Y(}myei2|gc(%35I( zXv-Tgbfm`99b#ezVbqerOfq~O0=U|uyf`VBDOgtz-w#Sf{fXMU%n`N^Nq0b)TUC8l=u}=ID-eETFrnUOGAv)RS#G3I6DeDsmh% zu+^DM88$q)EaOGC_NYG2`u0P%*x!v4E)wP3YVPdOnY~p8qyLlWcKxR1P at I#cvgvH! z#920sxm-AbS*KV zNLibqxZ7+_Aeu~2lq}I>u&mo%t=mElXUQ2BXHQt{#iQ=>iED!hvQ`Jg&BtjvDea2G z_(tKv#~E&nUR>rx#bM_u2*}*b6l>BFgtMo(wSdFeS{Pe_&`9s3LrYRB+$?h7F$W5W zj<>$nlT6HMURyZNJh!REV2gChGipv zeTc5OL(~*snRh|&laJLCj+)bxqZ at gUx*h6)@sZhO?f at Bp7(+Jq@$V*MI4Vpl%#pHf z&YH6gNYJXtqz!`%ymQ3r$<`&{6I&L42=Qi&=^=J^d$Fm{h(~)ptCU1dF z|4eS3dc^dsSuD!19Z~`#KbgPK50E<73BySGF2}xGmr?iP5pANZzk|Jpsb1TbZc~r+ z>sRb%Do at TO?#q{`L~5>aNpuz%H7CF|g-R?1Ey2Kj8T$V?JLm39yX?=WV%)K9+eyW? zZQB*wcWm3Xor>*LQn9UyD#ldz^fSNJ&mS}0v(~k)H?TkZyK(k8`=&{takT+ySBMSV zyz8bJD)XYmtuvAV)KAMh)2N`riQdtVbd$#QN|nP+dNQPOwD`M}SMg$F^yPd=N0el3!2A<~61hRb{w9MTW;AibH^ov-0$t%vH9sin3^ zQK+6mZ&%gd4RW$lv%t= zWxTs@;lH7nzWp={CREipp~7dXe|Zf?3pT z@`!h8i+&fx`Eb7Eex}=ywPLHJ953i{6LwuL^}A2?3Uwv@{qi)2!*gW!p~~|9 at MNIL zCUvENQs2!33-=!V%$|pspKJ~#mHWg~Nrw9XsRJWzEzQ&K+1tgXybf%ce{x)(&{2E*qrfT;=W4>~}o7jTQO02o4DzteOPZuy+ zz6Q%Ad!@fK^K8yNkV-TOMeX+jO>$OL4n_zT8#l-D!c|kO(ATRV^}3w?Ers6bu&%yx zf3k+972wuzywOSpR~6a2L8DKxB&C><`gQpM_G87QQ!%7IB1-iZK)>#snd-oL=LF&1 zq%|ivc6$^Xe>k0L{|Nd>24RYm@!;-_;XzPhNIMG!L4TcYl|tG?R0STVE;Ks3Wi#2H zq8j?Z+IQ}B@}Z^qz-_v5e5(8cYFEs-H}OEOi|{=f?A50Im7m&42P!4FnP7|`Aj2r8 z%fu3Grfie}z7<`9DDg3B=C-`p6!>1Fe!==c5vM>yK#3k#)M$G%qfn6(S4rmq_^u#g z(Uh!bXC}l~TX-iDXn0NyyGumnD)7=uuXdi&`FrB`ZyL38yNXI3o7Kq2c9c(H86SGG zuz1Q*$+WN48<)9Moq$ge=4Z6nA;LY;=LWfiy(k<3GxQ32(bO_STy!W{D=L#l*;GsV#L?{T z>D?K~3Y>TPnm_RCgX6QVo}*?2K8L5DS=+Xo&~y#HnhmNnfyR|Y_CZa;Edx#RqYI2D zr#x|7m4o^g=CzArL3Z;2JIG-a_MxX>hcn{V3d5H%Or8MU8>m~=xA{`hV9*W(L5kaC zOGTo)HOv$ggMr2JqN=XO+N;!BeK`6~yk^JgQS#o_;wn^?_OBJqPb_P7V?oo}wqMW& zLip*-475RdY>KO2gU4TO(s4xssaqZOmIr<-Pngv^<|Ktu3Dx4tXnXud!zfJ-H5gUN z?A_hDfY-8cFtvCTjDVMy#tTFFMSprRg*HQ=A?<^z5SD`CM#W)PutHa`0!q)pZFOT| zd6Sl?sLKk0CXtM>Ee!F&;XArO0{PL10r9O&7>La^nX>L&y zDcs9-&8rUiUn0~@eC}1MQeRIj)af7RXFF1ZUm2yH>YfZ7Kgr)G_O|SN`L4gYqEX^` zW@&n$JJb#Hc*i}nzl%S7FWJ`O at sIQ4xxs8&ZO(YH1gXNE|JAqQb+2KJCoT})i~BBr zpL61locHc~PZ!NIhiKG|``&aYV?=l<^d0kE?F!Zl;pMo{AO!U;xh+xKaC@}-ZFjQy z`_GF{xPPzJ)zFwNZN7kjB!hy0(EML(^?#k5nAzI???OFPQBG!15Gkj|YGI^OP3Joe z^n%DYryFarxd25pdaLpNbq)rr33JRlrQda)*HBMILsHt!Ye8_67v9~R4(0;<+go3D z&=BBP*mnX1*>@_cavh#%1A%7Sv8y3U{icGy!c4Bp at RRQc1smC-xC0x_5Ooi%EuE9c zNVK?|*MvHQnny)BRJ6MUi07Iyveps7V>e|>jfQ%dV8VhPHK#~&Z=aNxFhhP?E9YY3P@ z0UY!#waL70;4&z&%)h^rqH?{I<;e#K!rZDXUmpvK=!&a?;x{md(S}z!uZVWTvJcsW z$8^ts1xdtJln~Au=P;@&U!Uu%EUJufC9H$#uz-5FKg0ZYlZB=?AN2e&ml_lZ2>Jip zWdG{zsp+UJ3Zn7%FD!gRRz-pkEs$;yMstufv0&1N6f=`9L+qt at DhpX9V^1UbU?Y6{ z@{*Z0!|M~nJ6;7bUEm8u&#`daEnm7=)WNSF?+~9(WsLB$?Re$W)XT;uz)C|6!aBJ!%(4!?GuBUSm7}pVzl%T zJyS`>@rX7GXDbG}dmAyuaZI`tc1gOzI#rOdG+jJaZ}ry4X!{ng=gQNy-_;iXe&9AF zph#a0J|VjmG80>@n2JOK8D?UF`qFvSW at 5s3b!@3ve58=7IrJlez0X!j`4SnI`FA6k zeM=`iPt$hoLhGbv`iTfP2y3W4ZFs)#CM_#uN?Mvh_&oP;qjaK}9^q4lH0w`Hl#vBX z67x4g9 at g4w>QRhfX8-0qIq~}{nwK>84s-rEvTfr^ zIj1T&jza~DwgguKS+*>S{Jhyg2GB9YJdstmpvt;OyvaI8Cepd5B)bgPx@J{cE;hInTdTTJibQ zL0n=&_`K!QMI1}+V+k|S5VYO5+}zxCXZhLnyzjjqAobA}PE_rAePDEz>FN#1eN?HT zn)6JlMEjN3nv3yh?X|?@*9Ac8z&KT2^YC68Oc^<0(w)HJd=0&yw{3V^m)d&3l+07t zZ+5dbJnFFoJh?JET&dUxku~-^&aCB-sk30Sd1=(QfEzE9SG#l#YW6cTpk|3?O^OWQ z>`lJmq0^SBy0=62YK6evD`?g0t8)eTMCxPg3tq))t=cbF?bPqnItV>VW=A95KFaxuV7nkpl|^d&Qz+bJZShn z^%bw}Ms0co_dXM7QgFfQOgT*LE+nlN4_`y0oVSTsU}gocZgb8CLjx^-$t+jZOBX()QLa2brIixG81hh$P1493Ee|SLSu2EI|di~T>!IGg;%U9 z$t(^9NQF7`%`wdpk=H*Z+9P>_c&?=LyyxO6Jf{vwT}f&$9TYS7tq+jazU(PWQ7L05 zM-rq=#H#{Ll(Ch*Ct;i}LUN|?L&lgl#}OA{pPLMEfvkVB2BQ^{<(WV;T3WkSexTS4 zF{6B&Afk2pf@&OzRzehZGo7*h?>skOn#lb86M_}NKtNdjJD&gAAfc>egDQmd!O<~E ze$#BhW*3cK#V4mc+!UmM-q1`9z6g#(Et$uWM&8lbk@ADprz$cjbI#4Q;N+!bd!i2Vu}rfiU17~(Y>Q~1?8%9P zXT!Qm0-w*o`Nt<5bArguf!(*`zMy)7Ki(v33h1xHc;97SVzzzbp&T4^2GnbYbzO&| zGFZ3)N2iyS9=myq+nUyYwO|vxE7X+TQ%QAX8-V46dCzTa`C?bk<71pMXel;L)+6u2 zU5^`(ktLKtTlzuryla1iZ$P~s3iLa@{MzBo8w3?{N7yEn;MHgV#bmEuwAY)^B>@g( zAJeCfF{spv^Y at uG#^fmxpf_^s5<~V0rCi9p&?eu}!A7d;48JtJ{B7{PPN3p^r zn{CUj$L2EDJ7EVRBtE`fty{6*1ftwCU&(<6rTeZ3$zoY&Gy-m*frZuLXzJ1TI6GtY z`-k5XRDf7_S|3~NXagqWXu<%k at qMMGzRZqmH}WVT6~&Z+(z1mplQVQX($P~Uof7Q? zMs}|~s13cEhDtgByyb#xN~Z;W+oCrpF+?*5H(Tk~<7*mC>H4 at s`xS8dmhGY)!L at Z- zHuq;1|05tNjr$I8<)vNkt`&4qU!^-BdsyhSI<^jMN~mLJT)@zd`dI@%y2BUOR}=#| zEsI7sx<_kjemuKyq}C>8qk=wZw4`4)-VK~@&IoXp8|1g~NUa}~%4nlE7)W3?MLE2X zFSps0aEvn9L6dxk4J040Ti>t70neG45n#B`bmNESn8{YZ6rSG!f|uAmz009Jd%{p( z>Djbb4O)InYmh;aN5_#VDyRJ@$C^67%0JhPu=UCksX+3Mn{hUh0Hb}l`3 ztQwq{F`I0I7IVi-JG1FPID9=ZDUY!WdmE?K9TLL0)KzaFoGsTJgR_r zL;tmx90 at C5RbE)S2aQnW at rAL{1J;>lIn)Lrj2sVuGPj?aQ`h-Bca>qadJs>))4H)X zKPCS4b1A8wN&n#_KE??hgB%a{@o4U}d>Mx at hx&BbS at p%ZMjG>*u^gj at w2NMgQhVuc z(_81L>`yB#BQq59tc)~aUT$xF-3qfBzu`Ue*XDV2Ds4is^CHUvs>^LrF at Cy5E!UpZ zLo7E(_3>B;nnRKMR at p^V^a4UP4lJeB6RUCX{jvfCLd at b>Rbs z!nX0)J))MRA7El at 1*B5%#Jj7HqfH*MUUs8XcL8)!O)NW;Br%?iq+fKnO`}kgWMvl| zz$(G%zYr#MD*!F`NZD at qr$PL*vxk||>x4b{+ at a>_hwOzD{DFAB0TJ|6#{eT}>+r0n_u^0}p#<9|G>@_$u{ztrJ>-UU+9lfh#~ZD7c(t}c7j1CP~@@jgV`;qkV;qj0? zfW8}%Ii&52xrj$e4%~IDk%xq}l{>aIZPh5iZ}A>tP*cZxo_Zm7EY?E-nPruOS!0wp z>97aXmnWVZ3=8K~JF2?EBNt9Mb-h8VXeeDYB7EbAC5v>#iukL#=|(2qXMM{w62M~% z*G-so3I@({u4gs8KQY4Y2mz&D?ziqlEL+GT-fw-1DN z8REfO>PAhUR5Otx#9_N+)0gnn*p%@Sd4v%BbiaUSNFXv3UAtvy3e8!%Ju;%Ubg}UI zvKF0u4O^zssa9TJ{f&PN6CFP(6UXji-=tcR9Q$JW*@2j;l{uDn7YGmK=wLW$@(zLU zSKLSN?mnuC(^#W!lsXOLx`*?K#%IY>J}OEkEouQ2?cSxj9p5g&%cF>oNmAdQh1c|N z)mGi#9 at x$CUVt-c%_7FHwZkv?|8CyLk8{!9KjxJM`_Ik$*K~)np2817G`>apOJxmF z(KieDi#}taVZ4hH>kI!^Amh(mw#ge^V*Qij}yf^ zCJ%LDkhw&I7W2ljc!T)IyUj=7<2znV6wG at Zvv1Qf>1SO{Hup*1HrzO zS>B#jD1Vu6ZfX>MpYQbF27N$`EJ)}6U{Lp8V8Hq>FIWE8tXaF$ekO`=zK_Uy@|sYk zP+x at _BYFx==r_wXu(p^cE*(2Ja&NuBp+Lf+FJwqTU;+Vzp;%qSVa5f^sTSs=tPWc< zQ+3+{exM#f`l!zB#|43}a2^4N!qx4XuJdNs3higow958!6LY78cc=u1>XnubXPc&$ zwo>$$9D~Y==tu<2Ts-DvSPYLP7_ZN!R104SX>OZeDUQy<%Nn^9a$@l(qrZq6D%d1k zQRSKi at t(i0$QJ%n3#KCGi<40ra+W4L6(W*&j#hg;Y_QLSo-&DCJx{=Qsl|p}QF?F) zR4Bwa5lss_rd4S8F++mCJm-FvEf?gbC-|s*`_OTZYHX#RBFm)QSE~1jb z_b4ziW2s0=8;G4A8_tXi(|p`D-jYBKjGB|c)$nz3j4`^@pUbu^+I+|XWjx$o!C4l6ALJm#xP6z$4WKshvn at 02^Q*0=XJc4Ul$?$|pDhMmF)d0WnT zh{+);h73ugstDhcdFIj(CtRxs_oj{1VHR_L zpuIn~{0JPnbg+CW(QFpOLJu+ at D5DXQPLX9SSfp)UuyI+)!b!YJFJ34GtKP?sJDT1J?G0E~m4k)r(Q5&JQe#%f5J`|I}%o=efv#T#+HPZeL(d!)P*#k6HG^i*62M z>f^86_gN~)9s1j%`KYO0Ir%@H1_$|{dm8&+o~EaQCV|Gs2LJ#_FF+Y0OR at MvR)yTZ zh{YhuiXthSCec7s`{DxK+@~(sGA>K5%T5TdhoNdR&>bCjTWms8$mzOI2mRhc-} z=P^%N&t~zrFx=|%g&eFKWsV~g**;@+7^Ph{L&DG?i{qo-(*nk}00~I1JBSthKCFvkz1aaxBdLi4m*5I7 at -Fc zD!DS`tJzdikB%z8RjTY`kGjdiOf6I79Y&)y5(xq23A8!xgal4mRbq+HAWLVzlHBrr zbI*!Xz0>OLt6IN(P6#r}WOz7t{4TE6fX*ui`Aal$z6m)?KL*o3f*ZXBoeHu-c(Ts% z^D!~L#0!fhn%iQu at KiNJY9sTW3|@4`bAikjEa^VCiS5JAvfvZE)935sywsqWwln3S ztoSr+j_V7&ZU;SG2+x_*bza#8RE-2*#&G(>9;wSlexxr=|-^vv;YS~ zksiLxa<)}Mt48ccg%c>tcTBr5CM<&4o*|}FO_CnL89V4pz=5z~-N&cP;csTcv@>zs zkeb!@3V6!=4)HxSwkW0OIf+ at 7X_i&AH;3k`1>lDJiATiDcSHUyiDLm+x$WSRR`C02 zX4SYt5!~Q{m?E9YA_HfId#>aGb}Bqdd^y*(b8%R674>s4z&rYVYAzhqiE^Zf%c3j` zsINC{RX{aI#1}i*;I(@gI-cPL6*f%NaX)-c6uU2C0E#xDS%|ZrAK3rymiaf%m5G1c z^7g-QOOAhKMyh(wi{fZ}U5!Pe>L^KE?FI6a63Td85e0%{n5D$v%;FnPNbvH$iPOnSMS(Nkvl@%ksRY6kU-vhx1(WqXbrrY8`&C at Vq0gQcj2S zUWdeEmvKj%(8_alyC%WG%=7pLyG3X>_xmu)@W$@iSF<~%J|Z)T2(u{|O5fFaJ~Ek9 zLPdrqti8_TQysuN?R0w$&(c8661;F}bo(v`o;E>~6@6b3jl8{M^8JG zdLgJbQqA=~e^*KV1*uA1y%K$O_IS9Y_tAhGa@&=*dEV9MZCCI=#AM^wRXbYYhGH4QUs4c3HZ>r{Zie9V(V>*<$JF@@V#7qMXz$Nw3rXH!?a~0z zIpR6S_)!8B(g?G(m`EA>n$qicKIaO1mF|`w(!FZj{kPaX2QTNEE*I92nV!xrEr<$TK#1RT9Td)wSXdHZEv(!Reh~Iqx?Z5ym}BQwCQ8tk zFHYD;dHs(?%Y^&^bvs?Gd&hH1Z+$EhjCCP)=|sv#*r9hj zbYXz~iMT&M&pEt>L`ND!>n(??V2d$X=iE{?>Y-O!Bd-3k at F(A1lD@&oi48q&Zf^rpNtX6{6r*CP|t%^gQKCK zpidm7hqE%J(>!U8AGSkvr`s6jgIhddb=n>P5NM{05e|-JAjA|nx?KT8EG(t>tgI3X z9=`8!?+WHkdMVy4 at 2@}09Kz_()*hd5bzbAdX-5*x!J%YEbApx4=ffSv0KX5<*$}El zUL~V6Hgm|9N zhRiK$$q8W6F9`FIc~$iy;BJ)C6(uZi$+Bzgyz$s&T_H#W5YBDiu473bU=Q;(rwhllD=J5qnf1+HxM8OnM>51x=S%B>)rlNea`p-IEv+o-LSoukjHEGnX&|?gJO-)lO zyxaVC+{zhoI$?sUc%$ZqS;UU at nD;)u76w)>DN_xvhB~rA(Lojbwi;C)B!&un@=c7m z5FG^(suKU{RqV^^Rb!={C=j5>yniVH*FHzTXn(I1mLYl{j`XIf7ys` z_pt3RO`k?)Sb4v4nOSk1AIvyB+l}wrOQ!ZJcdY)vhZB>)k1XcU>-ECs zC`zDB?vx&XNIe7QmcMq6%&pcOxj?!)>Ujl5`mFj41)eS(GMmzY9i5gH!W5)V>CNWmwBaJ;FWYF9PyWzv=di z`J|xb;>Bf>7ix3L?3mwrJn9yBZ;yl_f9pnS45^ZoF(+xtP at z)dk6J>$U_bq>*MNTW zVHx-bUGx7!kGcQqMb0Yx^I^lTdKWEA2vsztW}?d=v^SUpM`FWFRo>+IopG~_W|3A_ z^DgqCPtiF2ZjU)pGU-Bnwlkqm()}zm6`YemIk&AW&h6JNABU}9{(0X)(g%HTdK`bV zm<{$fKiK~+L}cagWW|W&pp!ixtJXiF+h}zh9nb?Z7_gfS^+^MKyY!g|!aKuh_8=@A z at AXA_?@7>E04eU>dUY$&qKb6n^I?F^DB(!U2qP|ovk)p5zG=gSno;1y`A-bUQ|0|v)2=|c#Be8%eu z7s5JbzLDU|?it2drvU1#w$3h;hq$kKKrmQ ztx7U|T`R_y4}r67ge?%y?6;SAQ&l6&K+TG=U#AkC%QerWpl)(Os-Csm4#%N|Xu95pVI>pc&o4`?VWh{462{?W`u7}tajvLBt zS(UV14 z1eG4nZlj?-yf74{Rn~>By1=>s*a-op1IV(dLKivylKu=iz^(|s3qci#mfn}QdHPr%vb%t z at S*BQBL=O_`G`hxw1XyVZ&~4QIwzV+|0U!$XvPR`|BFC*5lW{Cz*a z7=}~At2))eAU^u?Uf;wQI8EFUa02~JHQ$l)u2l$*bj^0VP9r2Q5Jc?AQkuH}xbK#M zgUccP>pv?DHDgOq9FChRm`wPmrJ7LALyl4HO`kuC?k^hXu=@1;G{ESBv^9|vudY{22FD0SJ?|-efiItUmy!K?rRfm;d6ZxH<-35UAHnwgma*FjBAt+gDj2dgqXylJj!7v{_|FijlXRy7)A#GEMIogpVN0C=J*8B;Dc$wlZ$ zxcZ~Q45MiM8^Cz_^SFG{Or$(HRAKzHhn z{BqWQ&>GNv?D9Cq at ik7q@2d?Zl}o09;#)Q;*gy|MtF#XWPH3%G zpBlDI at zS~(dzp9{y_!S*hW-xL`;;FMB8uw!D1kj&-GV|6$&taA_B`Xx;QjC#H*4^v z+Jrrr&EC|=XxwrVLt4v`POII at C^Yaf84YkjE at Hk7FYRL7c#P|P)q4(Jd%@GS$+vq7 z547oO#GWU~)`o(=uE^@7~-BxC}fRf<3G-cIE%Z7qJ zCZC~4P^|Yt0M#qs3&Vbus>ql$$_kgGlA|=g at jgY zbOc~GMrY*?W5l$2c1EoE8yb}`sT{9oG31MXfDcMP0M?nR&-N$iOdQr#5}P~gl7eJU z=oG%vY%witoM>-0h zQ0%Y#zB~d_#@Mkam=6>qf2%Yn@&pa17_w1Ux;@PYO3x`H4mSKgtbH?IrhVX>&)7Z?rt zf+kI}4e286RIkyukg$vtnu|Bz72|SS8Tw0v!AAc;ImfY`i_8R~o!lSB0#Q&Tr+0xQ z(>}9+j;{w1Q-=`?4JH{Z0sZIJ^oe?Za+UazU+{8x;v=HcAwwhLs7lfRyOkDC!KC7v z7`cf_{5uze?lyp#fQLwWClbc{4x8MtD_SoOUJ|XA2BK+k$23YL|31_^|Ec~P<%$h{ zRst_g;s>fnR=3+&ott5!DV6?2cXCHl^YUH&kDyornj~rbOBfywQcMNj>b(jm%qD`$ zYdvs+HO=dKAjRO>p|rW?ckNC9ZJJ;yY^?0UvpZ%dCc;Z3{5p-f$ohPCq(o04_EmGwz+dik7ox#Sa&mWMUW`Uj0<{sh$^3HMOj zo$g`wy`F5!I_{0Jd8W8fR&ckMsROj9(ex|E0uKsZYbC?(pUvrXNR zZP#hnn={)WKHFiqDo|Qk>?HX#_y1cpD5l;ob at B(AivI>0_Wv18`A2(hkwI^bq4@`> zUy-t-PH~FpKcR_7^U2 at sZ?np<4U at H)x}tk2@|hDgx$h_3iDTKKmMbzNT$!HP=o68nQ9_7fo2{9wh}s!04cdY_SoWZJ^5tp0kSq=5!vid1o|d#dj6 zf=1XB3}DPS;Z1vlWA$&F-FgFCdPyHc<+*$D;}$U|5I+kQO2bIdFSE=xDm}lf%~FOjKzy- at H3eG)!mWqXAG(?BNMS zwalv4t at Wzw%~&`T8b4gw)#};#*muRkuq(}*s|(g3WSE*$C8ZvxW8ve*hRoOn=!Ysb zO%3k=>^3vzvY6aPD*&T5O^q1avxkAmu at zOcd}Cl_v$^F1w1`T#Dry8bB)>I-GE_ at a zCUGfj2ZYgdC0u9x&rEE!JQaGms~)1Zv=&~GmJ12iM$``W9H9&*fKkkuH9zBtqalmQ zk+Rm})ESAG{S4dK$yfFxk>jq%4Z#@khhV$vOHc%Y-;K>>+B(!DxuuEj at v1o}k5bJ>(=0JTm^VqWKrEAf-|sIZ3VA*5i~N8-Qk8DgCwO!UQbH6s8vhdbb`^@~gC z6PRPfrk7=dbMq3lFfx{?7jtP&z}HY2)xRHvi^y+A*Q}8_lJOf9Mni78LNABU&nkl9 zp!&iZRq#IlzOPE2ua!mUzmf74*b4b}n>8=&M=O>(o|;f2;|C`5aG8IB3A(;xK!qWg ztnSJA1m at Tqq5XkGNrmBLGbfJUccXg|>uZtop|vvlizIFfq6Xz1K})=q{2BeQPEiKv zF99(q1O7~T-DmMV1~y}iko!7P=b+#HB1%$`!XQV&aglW8RQN|bk`R#omWDD(w3TD(4++g=gH)37v}6)Mf8bP^x1jnDT?o&hwlx#U=%-s=OM at S#X^q%9o+N2mha_} zisUu6v!^3 at P>lz=Lr(-|8Gmrb^Pr^ z68niqPlx<8yCv-zRCt)SGk_+Y at cUx#0ey#eI9k9*v3dOC+)BYv#@qNJnTR;8!Fe* ztKmuqn|C?OQiX@*PQq_KZ^8`6r0ygvaQ0WbSd-xs zHNn&CyYMBVNhM{pCTBF3c|s~U^9H5V={Wx~4Cw~3ZvZ#9MSO}jKDTTv> z&D-a{r7%--6iJVN0#YFi2nhH8AL;*xa}^v7EI!P3hJj^FoFvQYQsgWMQDfswQRo^G z6!PITRqIM$y&Xu-&`<`MvXA7CAU`>aOq{F?d4WfrPsR0PhI%owSfP;~hgs(<&lx`N z$2xz%Pq03eTnMJXIH1!PLRwAuzNqLRs4tGZ$w_fRnuA_QLZ*lN4M7T^V at 9Oma<=26 zZUKe4V_RjgZb4Y1CeLFuW3*4vf&SZQa{WxX-nF0kl$otcQoIQ&QovpOBHJ^!#lqjR zzr1KPs?|^rwQF>dVb0WTDA-dXsn#Owh8?))W8bJfQLC;=?iF9Muu&^70$zYVNbD(0@uL;)ygt?dG z_0I;`(Y^27SS)%z`w{n=Fa5T-yg!?CDKAlzkL=crRo*NYwJZ~A at mpbMBM>gnIjz)$ zS%+q3vrv3X!En!@y!P$T4X>4D9NI9P)>>5k4%r-E04qzvgRS?4n^Cwc73?*I9;T9y z(d`VH$vZS#gSC;=y2M?GhB?=#u} zpazxg!Dh<8?r&(Gq=$b#iTAhBxS*+`nR&oW(u7P!Wb5bvb-+}Ik@&t(xj1Ituj$$4 zp9`1DTdi^$1QskZLTn=7(?04uP6TdQcI0SYvQFg$qw0nJ)?Za`@q0>W^AZsE?iCo4 zVobrJXkHvi)kQD5sn>2pJcUFzw>n=1+gv`SuUdp`m);(NdFl3IqR0UUPR>{+jvVN_ z^U8fj12{!4>H1V(E)eD?{O+OYI2Ymp6FI6LP-ahlxpVl^AZWXL9 znr%14$hl>~J;7a~lzt>MyW*S9Me0SH9CC?4kq_}^-=09eKt+6f{7p^D zbqxKku|PniR6sze|1&lD*R%54o`SkdO9B>KeYn6tBvUC+sd%~pK!_kp42*aaazy-4 zfMR0#|Dx=jgEV>CZPD(YcE4 at gw)M8BZClf}ZBE;^ZF}0bHEr9*`F;27eQxaUMx4EG zL`79pRzyYqu~t4$WoVbb^ZjbmU~7NN>H0O>X@>hb%WIqTyYtu=#C#Cd_GI9% z$84nU)57^M|Ao4uvO_O?dmAMohJpX5&LH&jkrC4G)j#>(fc-jL#^EryLYm=Ch2YLL z`K-?ir(NGCV6U&3j{9uLwc0J8ZCZ3{Tlh?|Eim}nW&iz#h2!v$MsGLt)t%hRSAg`z zKSI6z*0PI&uyzQsA?1AYh4_Q%{WUCt&_#s)%5Z9hb&yc`cHg#aM851rl9O$xbo0dm zIN4!mFM=?T69me+6_#r#kn7TSyjC_-{^G%z6~oEg&sgT(2={07W^1osTla;WlWm`z z0od>l#%-OVyU-d1Ae(gA*_7NJf?L5%V zRk7#5>AaH`;nuke6!VV7?O1c#49R8y$`5({t%JK(zV+qQ@$Xdi?uGAMyB9*IL^5r% zitiINuVXI}{iwGG?_0ouwTOQd@?)zIMZRmbSl1I{V#E7MwYl0;-FV!;JRQBU;%fUh zrmm@)5xB^Ng at 6dz4C#pv`}+hLVChpIdM_-p`_(JhyN$bua$hSpdJYW;{it{UDY6=O zcyrVe`SJb%FXU%lXJ~aT`m at CoUY1+?_fn6Gh?VsDx{D1iJhb!!@vR2Ys)3-Q(L&a* zr_CclDkSZoyv0RVVy>0n?=WvsErJpoD1>KAB-sEGVF&HD8N!P at aW3Pzlc-CWI2_Dk zWVSwjsV>;2{M}UvNA?U$%f=OZFQ;P~T*Zc*iuT4t+PthF%iP6S1u>`fidJTFaNK4% z4sr)v05rX;bh9Upr2|Al+mtjrOO{5>n#B!#Q5^MQ-04|oD~0xMNq#i?0{HP(9=v!H zzn{#xcpF`^R0->|^Afw47Z42&V4)je?%%NzD!iK}fC2rxz&bziB%#+LjunSX;#}9( zPNy20+s7~i1N5|e(>A<2>KSiisg!{uq>>RY;`IkWyqZ3DtfKO7K%S+Ljf7EGBqb`* zV(~8v0qtf at -i;6B?>MnS8Ow?tBSf|r6Qh9?cc#&%DH7M8xUkm?%a9gOW%8uZcG|VI zSh9U8n3`cc%8kRwW z7cN6GtYf;r%9iWs3m&1;@NX^dLQ%gHYDx+EU31FAGR{Lxu17icjCt6h2?kur+jSfq?@C at 8DX*{XB;?N<=xCdqO9C#+6@|Qq!{_u!A)tu z)FmvXOUdXfx^D&R^dlumS)6MZI at L^x?K*#@h1b8971)jtA1&Ck zJakow&?<|ImbSMAxD9YgtZ8PZ@&mFBr9PhD3olu~)mMKj5_s1D1(z4st8Od at W46Z|~+ivTZ>*m~odHTQU(B8h#|bG-*Ai zpv`=RfiqXdOEN>~w9aec5G#?!UYnpC`@WwwGenwGm52H+^fO+={}LQJ)0*5eTa24G z!R9Q1J<)U{I6#ukDD6q6+D}`l28_DU*VeVAJBzo3xJ-Bw3Bi=!cDYMwB9j*hdRT+M z+pNPy`RP~ZK5;hfgc$!r%#!E=Fz{rW>2yl(${J%mlLa%oL_^d&hCINWWQ6Sg{(u zLiGS$=xb1A!%TV_WtAd1cJmMI?QswI;x|iuAj&TJJFi=Zu=U+9WIrk%q!<8k zRwDXlin|0}?wZ|2PJo0vm4$u{s8Fo^U6OJM&yMY!Q(^gVqBngd>e$rM6g|h;gm5vv zg^J|>v#wk|z_MN?`B&v9F<`DUbU?A*uyU?DVArsvwTQ-Ro(yFZF7oZk+{ddmScKRn zuENE&<+RGe1XHZ?($EA;Nx`U9JhUK=R|weRVxY at Ka29I|oGpcq9MVl^e=qiE+Pnv@|Vr>}4?uC%4-T- at n%@+*KC582ES z_c9i$K~Bu^ zSONriGgk52Jb+`di~ejY1?)z9){z){NX$`ddHjcdX zZ*WMc9l!ZQ`C3f;^Qva<4-;awz_HGGT at G#4`0VwIyZpt)Q~nUifKS1vmE#sxSrMC8 zV~-#$ajyRBTQ}?65QW9Q$9ks$?=_}c(D%_^q{Ww3RL*kF#A%VmS?zykHhaIsT^pC z4R!=*AcBa&L>B=+A8Tss?Hp}-=2|m#I%lB&em}36i?%3VN1K8`bWbe^%zjzUW2*K^{4JPF;UWokB zGi5JOh&o`T1n#hUO1GMbU&!BsT2CgUHX%@7px+NWPA|s*@vQNiPjZpH1+3e9nx37$ zKYNh`?mxCvZpjgQqH5i5R6lSVi~pE$tw?dKSP^7J-XmccD{RFXk&QQ3;Iy253u>rp zv!lh%qgbg5(c at G{T;BdZ5wDz|NT|3G?1y#Nuc9e{fBiws5{E-mWl8-N1~clnN)|pp z6?Dio5d^m at M^iDRQ*Vz>`@7<;tu?(ocfe1HWRy0#La>QO6V$XQVj-PIPh2Al#$kV6 z1_pPn>HBU6_r z at 0&$uaTsu#G5W at uCqmU=tE<9Q${$;>-XuW8&vFx%7>@N`6p7K>!d1`hq44}t_!jT4 zG{A6}P5dP<8BOm}Gu(svOWnlve&GgXza{+z%U^%(Tt84%)}>?kY-V?tXeswzDI3et zHkep^K|qUV2r`ndLnk9cJv^EHoYL<$@k6G}7xuEa7&8~KxRBFI-PcaVk`o^N^oe-}G`yZBez3BXLskl=U`*ckqG5zu;8pSC^K*<9Vd6KY?!~-Q zggkDPdnDbIVoRN(?wzQzEZGqiTWcJ0v10$M0&qC*EUDdRcNf`Ju$yAz2j;@hDuzS; zObMw~#XW?QsI~Gdhiqkb zpQ1brXORtw)7~1o_T*;9Kl1?Q^1to4=MC@&%gW*l at rtSBTe7N>u0o^_!i1_62x&tV zD1y*8-wc7=Rf6%~h-!AF?YFtCSRVME{hAfOD4 at 1TcxNa)1y$Ox`OpTm&5^KQ1dx0vl+ zy(o!}ncBJ#g{SKsMlXpMX)?uk at 6m!1efNW12=liPS;Os=0=ZQ{z)wBO%MX$GTzak# zy|=}kn0j!7f9XUq8d0{NnAfsSUKDsdrJ0)2r_S9wGF0<_quUo_efrjnAoi*X4;xxK zF#)9-pKa}l at j^*F$3#wgz-~vwF==C at u1v`Adnv=el;aR{Dbf)a61GR at l1>|;xznk2 z;8$ihO~Y%G!}ukrYJw2wCILeu5C-4w#~g%YhqY)OiZj`PlwP88ZZ1 z7Q+3rcP?+?vTLUYV^xpr*z_<*F|cEufP33fx87Y;##ujtbAD^eA>#m7FO zOnxawQvj#Fq%=RFG(Sl at d88wK?bio;}2T zM}JU`Fi$VZ`#)F=eM4ruq|)@I171_29=sz(XIc~1PSXerDB)nOPzH6_|Yvq-4``l*qRy0q^#$&P>JvSRzyLv&hU%>G`W z3pz!bDg2~6<3?cJ at D}A2&*$1LqI97&X1qsFjS{wK*dGl)_7*)xy`)OQXRSp`L006Z zKd?@4K%g6hEgO;If;+~>b8ocYLE%F0fz;>ZzA;VwK}h=G)|<`anI)RFTA@=cVj&G3 zzb`#Ht4FC9F#%H_+l%tk^IUCtQq?XL5<8bHTarb{J4ATyz8<`~v&J36s+v|ygv2d& z;39{I1c=~75ZAzo?AfcOFb5}kQpm0c=2QooVNYE(Al4R_gTqh==E^;ItKyDWlVsJM z<+|HRwbOv!BV{gD41b6VY?{i~eaIJr;e`WpO8oe1t#{#% zcfscF*fSW1_^cRJ9GDQtFQ}-tBAj3;ti(rF-Xp5QQ)4&a=FX at DESaK$-6l2O{w*HN zT8AGc+caAVMUgwJY*D;INwNT3-=-$|Y at csPEXXB#o_Bnnb9_$3Ma0 at +3?@`~0sV4? zaZ^S=>Mu+Y94zytDyJx7@%xG82M|DB=cQ>{k+~rVjTls7h<`svM`&2WOsKKkH1gPX zN?vAiX69l7YsU(~#tPEJ`t895R=Ojk5px}?>OM*&-KY~`TED_$fc}v*xnyX+Zko8j z&#{I_ at H-c#*bX^dlUV(YYtn2?BYBC0U+S!TD~<-ef5u{)r9`UgFg4*2HK_q8*O_jl zgyMRKrJ{ZL$*+v^M0V+WM0O$h5}ozh8vI55lAZQS^h%ppnNfI*t2OOYmnVMf`oQIb zZ&Y_uEz0YOwxvz*WTkk&y4etymt at Xe+}w&BHcBd zIFQ~eHxg)vRN&)wdFplFiu^-t at Q2($KA!z!y6%o2W}33MzSZn>>Li#SW`WY+Oa*lw z=6e+MTN0!v)x80!XA`U~=d%oBk+1#nY1D<#J3a1?@TfldfnVX}(KSoa{0GXXW4Ld- z;LKJ|A!o=$d{J)P18Rb=@Vq=yH^W at +*lJGTALwun7$c+G%Ou4zX3)c at Bf+5V!-4yo zz_Bfj3H{>k?$M=3C0M(1ldZjG_edki1Fi^}t-G#bV?%mIX at Xj$SoK}IKyluwpZ=PN)%zpuP$goHCW)X;$D%D(Iit8eOI%{T2hiR at gM#)?6YDkVz8_AT`I>Rd2cD z1EWDNA0GL(BF6XY2KN#XVE1D5(oRoU(|n2#^r>GOTUShOp29Fl6a3=q?0Pf7Bozk3 z5{klOMMPp(-0)JgkagssYd~7}rGg-(cDBKU!biIq*&p!}e8!^Q1 at QX(hDzp08 at hmu z4t97!6qWsUEOir!7k7iEUghQ2T5Hd7#?J!h!=8aQJPlIqn$}v8?Kk1w7Oo_AH4Bw! zqYg^rA637`9`W^wvo{e!VhR<`UT7xWyy4|s at q$8Pcn at fj=V`pt%toxGrK?tc1+^ro z6egU-6|tz&gstsjlz%nK(Ox<9`!MeI#M*Dmw-FL;q6WX`yFs`9Ko8hx+LA4-o9x(% zO<#UTY2Q-2AOELkQ5R+Ah8K>(9=ePXg)Gyy(w|gxr3VQF6QlcQReh%xqb at +But}2y zzx17%t*ax;v0`f)%%?OGr}RM;3Z~PC!i2AepT;Ex5het$u#}kXP#tB%^N-H$8r!f4 zUEMK181qINm^B>09Y=OlXx~<#KLr50`N9RYNGDGDNk$x35$GsRA-z?~x+$yZ$0}0F21PaMuqsp-P8tI^o$s`(i zlfk0nk_v at M{_ at nxkxZE!lVFO<%hCa7A%Y%Baa-i5K#Djy0h&`p$+x0#G?YnfjU)!h zoN1#S8fkz^#aKRuzqY1%Q~(z%@{f8fd6p5utZ?#%S{0I=WXh#5ortF1BZ~vp&|c#Y(IY_93%*X>u>_NIm!NRu0YU+aI)tbn6Do zLNyHprc}6jGHcNHNf>2H(-c#7DeDY{XeKSQu9=IjxT+&7_5dKmm7d0E8Oy5!1nW!f2vdQ^$NO@`ICM{=9_*E{20d?-G~(%Ug0k z3tSpb_e0~?Du$y&(J;_4-qeVu957#mIVW{RjtP)@y@&BY&zU@=j=RHze$~vp`WQoJ zh~rQr!qZLtvp(I8IU3likJd#VKJ;`FX`_5c10{=lMeaDzoYF;(A~l9a&iJk)w7N9} zCUJV;6hTUtSf2z?n|Y_FKFx4{Igh?-%YV3PiX+gxxr55i5xY4A5U!khd;dQ z`pe*kFNlAneZBv!B(h89!{mind^-9+6u~%*8jr|)MX=)UF-4x%aGoK~%kvH(8Jez$H{n{7I(?Xd_#nc<0 at 2iNh)3o zK!V&;f~MI433 at 5oa8h?2K at Bp)eu)Z?wh&x at l9_gj%9w!`M}|N$h_>}BwKigCw(ggc zjj;e_?b{<18ky8|J&YQd%E~soOMcZne=)DJAZUBhbfb?LW)=fo8Ngzln9;bc@;BQT zzAkKv!;F{Qd0LxEsD at QPelmvFtOwh&m$zciAQ3bu(m8K&Wlb!*cMb_;o8f at Z z1pOYPjSg%~QRIHaxr(Hbk_V#BNEs^NM`@O-F7Qe$@J2(1SUF^`<&~Lq8 at C0xTMwq7 z0jG_C9aX^oK_f1>!oNR()5B_gq%`AWj at RJMjdf2%&aL&VJGR3Yy36Dr)by`27TA8E zA=8va`bt+JnYVb;RhuY=k3Ae~oWuc5PDI)lcJH25=TA`gHiWhi6aUr~D6c|5J&zm-7+^`>8r6X3LybZ}dCZx{A*V+7mhfY> zTcA3Sckmu~+a(BeJD>S?1(WyboFf1z2uM5Vf9GNKpS3{$W$V>MVMA&_5Q%T0D7?B= z>-`9k46);-qFA9wDnC!-)(1DG&ZSX%UiPf at bqDH2ac>b$_?~GpYapF9HFl=e4J4H- zdM?rdrBEJPU8)-iQj$k|Tnm=ehT#fRI{DQ~*sR8h)<=~_m{&5FVlqUn+f!JjqJL=; zO7cwx3z1S?_P1irHQ at Mdo)nLyJ#vX|I&uF_R( z`IE~W;S)}~aOhwR@!nblVPDMkC=xOH!Ki0fd#JzFcd2V5eQx}N$j4#HBfbA78|)>D zOlAxQ0s;^5-xcU7+c`R$7|R;k{~u|vXcZgz1qC$UE3ESl^z>eep1iOh&jrrP-jbnY zp$5OO%o|JyKU`OIrR%LyYe=sIZifa_ccAvo{6fON2i$GTMT!iIG_Tude5O67xm(Qy zeEmKl^CC)V&^Bd>!-a7YsY>z-igxrOcHUvt&`)4#0O>z$kGI2jt>m5Qg5CoS%Wd0q z|2pd~VDO~tuFP$8F+L!d4##P<;!SKDXfQ;TVrm0!Wm`r1O3zbBU7`NA++=jwpt2~t z!P~aBnT`2C4}bDi&VWE(7VksbEgXIJ5Rpku+1qGi^=#Sm={vi+*XGtLMI?5uH2!X~ z1g% zQswYgR9iV8A4fk at _qXRTjkkZ>i5Ip4hhQf^6m1 at dt;)hZcm$`Rt$YV&z&bb&*xg^} zSpQzc`1mbcUbs(VGOAAoME_WB at Y%JAB(`z=?k+>N^47N+k`M?D56topruIfLNTWq7 ztZ_V3NmR&}l${4DGf0oJrki>M|74Rv_6)CLA3On7D!!wvo5vjFpJfQO at T3g;@$r-5 zCe9T$l^Kd#Y0>T17<4t0aLEI5m3J^qDCs{V7obUQ?*n%4Ag0|A&thtyCR-oZLgIi& zlQR&A!7_7*iDddtx2Pn2c%AkUHE3wuFhX)B at pFitZr%e3 at Whqw^Mvxy+SeF{H66m|3}^pq7o27YMXkB9p0LAq6zs7G4N}_{=MV0 zqlDg><-MlR?N#B#NG^!D*@8Re&rqF8x=gJr7RrWgY~XQ53h9&hXU)xemldj#c?V=G z?`GoxKRD`F0J||r(9^g>aI4Mzt^yKDv1wZiJwV^CJ%`cL%bSU=RyjhFA8U1_>5A(g zsOl7ZjK;R{-~9`!+`YI-a4I4i@=C0UUMip%|O9npU z#WzDFKAAO-6amy6ZZe;;&vCZsJN1YSnyE8bTB&{EpQ|5s1T2>_6ZjsXtIY at aPRA~~ z at iD;{T%nf;^dp=9^l?MEuEY>OmfbjRDbG-302R2TFo+K^gJntret7B* zT3(Q7JFd_pNpkKQH{$(O z>dcDmogO#{$X_ at R5a9n5sbUt^|AZ|Q`$X!J&)&=VpAo0Mc(P((B#LItq7^mkC!1)CUfYh3VT8uCa+)T=! z#8Pi2CpDvQgi|BNtGmtQI6Yl;SAKk+Jqv*93?yQqw6O*wSJAZL7H)eDKpV+M@#74S zXb=ulj)rUaV&S$iQV at i#$U@|XyFehXp~TM&8EN;W0_Lg|*|X3?51oDWzvWhNVhk-I zCR|^xLiPTc>n;bV)mKG~vEvYEs8*M)w6|E?>lPOA0$IDKnCdJq9Yfu>%I at BygGgFi z9||Pne{Rv79<|uw?)^nX;PMj7-kr=aenDhZ@@}%Uk`%?flGeZPad`Ty`}LX=8M8 zqB%ytVETClvjA|Dd&tPPGa}8Qb}KeU^%Q|9R9eaom3 at lTl@{#({*y(OobP$wB)+h~ zhhWpX5~;&AZ%( z4`)B4Yz>+*lYQU5KZtK5Y-s+gPT8PTmS~F at 2@$$Wq~1zt#|+SRs)KZN-zW=Uww{~} zC!1nNhTG*1^%FL}N>3{d!x8>U_0yC32^^f zWVRf&N6z-qb^OkR%}XJ(6fPLtZRuKoKk#BqbPJIC3W&$wwOf7^-;(bZ{4kFJtjN!6 z6HC*D;~q>p&1Gc9IY}$MQ$(MP-!=OY*^$^4DrF`(@oY+eI!y<3inFkckddNFh^-R(_-|ZY|5kx5!0UI0_m1E!tJp5_ zn=CC5ai;bTKnHyNn~Z+T9oV`ABnXHW#((Gh@&Arn|52c%VdI3Vissv5w?VgYGq0qg z2Ts={3zx4-lb~@*yV#OHk5U%aA$4a*b1Y^|RZ!egHj!wP1-J_KQo0ki zMw4+FDo>qywx^s->$+67hI&65!;%5&1({RJG=hZ^p`e;d7~TsKGZN$F7BtdCwrXdc zxki9*ht*kNLqTw3OUbbbDL*7;QWOrs3=WJoYqUgbZ3YOlMY=`LOtlGFMj|&Z*po^y z^6b^$=d-)@Ew|UT*lAg at qdlK^q4|qyV?Iy+ at aduV_BOT(25n1WVi7Q~My+v$iz-pU zZBfct9*vG)Mg5eR3~~CTxBP#`d~?Ty^f8aqmxUKrE at P<8Fk^GZaavN;_O--FIpMKG zEodjDLfctp=>KRctsjIAr5S2xWFR|4o32fqZLTL+!f@%kG*yKV!ga;`5-}+>3(^f+ zR&Ue=9kE;@zLpaM2G~FE=DNuOXovlq%E%K{T%y25uTNRTQ*w=K|1PP-DX!23u$@@W zW6YXcl#^$o)7AF5+%=jpTm at ICldmh+JvD!0FCN&8sAMJ+*!3RuuL z2=Zx+8V<@Z(x&{%++t!(D?ycNv$NGok-EIm&9leaXEQA at O8!tRIGh<}Z(q^oGd1U~ zo`*Q1Cf#U{rZpVO28=XxOjodMXeH=-B%aZP4_kKXnx2#_YADiZ6BSj(PwJLCC+exF z>!OqBuhC^^k2h2bTA96C?=hTKm?s|}8~hw}k%G$U0t=cy2igmfDB45-uYpYP1a9?rd=Cu=*<* zCykb+rdo>Z_i`1fzT1OgX4g)u)@zR*N((vGis+DvKB}_rH at o)TmiZ_3L$0yO?vl!) zfH2R0u~gH}^T0QtoKrR~h_}Sn5`x{xh(R5j=>}P<_z=0&bu_YJ} zO;VWQlG^Baz<9DTnZCHO^#Cc!Rzf{o?8J$v#;`IM-JT8h^^Pv`^_V*$;jFrn>eV?a zi0PdOwi&Zpwb~#5fOlSe?BkmRe>K7p797GccL>U#-gNt at -ZcBHn?wR?KSbfZ9RP~) zHTBPEx9z_(anTmHtL-AL_V2*D?B=7;d>C=$C`Dtgv}#GU7s6hyeCeZ5OX|xGuSmJ; zizpa|Wir_*C%rACTvFv=R at Gl)!s{3x3!ndP#NFjcDK!On4&{-wt3YI1jvJzPD-tDs z(+;)NIHETVp~9bt(60A>K`4wUAup~iXs3xuk+X%`3cUmnoZVo3a@>xItRkeC>VWXp zB~~hb6$H?ZNOr_X{`RyjyrSS+!Zgp_U%!k2cQr!%ZP%{{6gtPxY4*8V_tiQ-u+ztBW|SioC+07)Yc}7lY#)jOd5af~pObFHu!R(A zftG%X-1Ap4>JX%MVRW)(&Ng#;Gk|N`32tg3e`^C8P2^j$?+%midn(_J*Ar`oJ0E_; zArL9>r)^-)8CQ1K;(g6x5iL3?_3u5&$=S95HNCv=QkFFG3?~x{si-4J{S0A{=)mB- zx^}?Sg6bSlHeNyMK8kRvkzuORnd{<(mwRfqHtvrwlQSYqcdK_0y&KWYZ}U at vz(GHw zoc6)R;DJH!JfeOc-R0~oE5l%y4xP1iU^O>DpU#A;o;M~1YrtwS&Ze2~fs_Nea%v%K zL4I}qT*Mp;)Uc^H`jRU)mD}7aMgfHWBJ`mxUb6d4YN}JogOdhL67GXKUOK8jIBjf~ zalXuv*19`hxD#F5;t)iMYZa{*ZEKJ%nxu7BhSvMz-_|F at -C~88KtVtP|H-9A|F7{# z%+Arx(9zh!)=bvL+S$U%#F^|rjig1bO>9hTos~_T|0AJR{*RM|ww;$+`FVl<{-eL7 zn5%&|DuL9&6l6nC8#nw-i9Dum!xz)PKGZYJWxQ{oUShrd?cJ)CsEGeEAwC-&Z8^00}|^e`S=nwe5#3u5G#?vL!k$p^sP2iY=9)rA%$p7OypT+1847tPc9TYP1y*tIn zxELy3%d5KpSd;pY(JwBas^b?zubLxlI^k__IXvNO=P?ahwuJsjR~6loiQ znWOyqS<4<<8m`y7hh!1{prXVf@Ll0nCI>_7J8p z{U^?lWJgg_LsLitBelZvGMx!E#0mqRoPZO80LT}}@eL`}b+?lXdq%u9^>4%ur1~iMLO}A(|WEM8!=e zHHeN-Yl)?FkdKtanqYfydJR+8qW)N5U{Il7slvJ{3d|QXRA*cU&pDBpU%cBqU<;4L z1WZt!F~GEWS$jhv^TYB;N%tbRazHsmxrcc%H6KZ0Fm zl=@$1v4!t>5_70${8+e at Bd`MktvtWj~NhP(FP zw7Vdl_L8gVE{rpHm?BI|2F;b&eYwlN zc$Iu$Fnq4+IMZipGSdjK7o&=lxz|#!ckXz82mgugU}1{Cu_QY!5;wJ$%GUu;C!UE_ zG2NEHXVS(qCo9>WlAmfZ=@Unq?Xr at 8tC#y~)#z+pGxjjmR)TPCv1#M(E8j{V8SI>1 z2piK9n`1gUhI0pi`@m{sYjmo$^BitKyCA$T=Q)QV`*Al#jeM4D@>?3)vPZSgej%hh z3i^XL!zk<#Qp;?Jeq({Ful#A{bg|{qjv-Ckpbf%uJ?MeB&L57nPE+52VT>tN`H{)8 z>%K>jXVy7C1(}U{v&;0Qiiwh;>8GcH9uIf(1zo#|)CAf9JHYq4OB2P{>W6dC9~}8n zvQxRKY`~0st17-X?#`cE#Hz#~DNKt&mgG?8 zD60qm7ynQ%ru<#KtVMePEB-)i_{KEFTV;5&8~@N)L%jhoZSCHIh+K;oZanlqvo|<; zD|G=buFg7r8l9;M1B~@Gd+Ip8(c9+kKkjLKD|g*qx*=58=m(D6=-XcoNkSUDBhS9P%=p526hHLWd_3ScQFY2a8Apo1xI6$RYb_# zn$5NC-DQZlaa!IB6_~dQ~~s^{Cez1dLN zDNzOjnwj}u4e|2T?m2d-V&*tEn4Iv!#5DB^(oxw~LJ*Z=m6DLYp{JbZIMcU&s+;1* zGmH~N6D{Bwk8V&1YFvwe*S_o|5a2yhzs}iGe8D838S=Kh?ArV!C4Ozx`4Y0rO{#@? zt>O%)PDo9rV+%OA?2xbEkmVb17jC{6y0~I`3c@$A`c+awPVSn2h`n0~F0w8rlV7wE z*0|%OLUK?R9CvEr5OHLxJ*GC$Fyl((6?0Su3A1(_a{rs#eT7y&#mPc!;r at deR|wnt4|z-Vz at b+6#vVytGN$p at zxn7s1PVBq-4v6elIOD8exZ z3eQg`Fp_2sH{6)mWq6l$ulN6snfcwFAZ|DMyBo|&GD`>HjWt4?TGRu>J?AK`SFu6R z61N-nh&u6sx-CHH?17d`JeLoaW9wa>F9=@I7pz9npFdm(7_xE0R@{5eA6OV at 5V)*n zFNaiBi=S#mSjsN2M8z+JJT$(9^n4-Osz&It3mGd5vHgR4_Wuox%{jyc&8@};Fru}R4ISU zNCQUva$>iGE9lw~o@&Nl)CrO$)Mw07G3A++h&)Z6U(uZv#s?ZMt9o`1>N)E#a> zXvgoBrIaQ>HN9(5;YfuXf<2Bq2n_=QLfUwaOA%|WUm|Ycj}HtR1NR{L?>3pdTLrLa zX^vY#FdJhdWzQ&Z0$uGkJ_Wnv99IHeu)SX(dno9AHAsW_pf<_fHbQI>3=?F`*NBBd zLTgak!HRX at gRV2u=;hIWic0&*b;p`i=W)>;6>S(kr}M-qc#^mLGI9n}MHsDVcKSw^ z!d-!VL)G8ggYj2-4?2CSU)>b#0+QPU218|V*M;8zw}mYsn$S`szJK4ATyp9#YlQ#- zaYY0HVf`Ow8UK6T+Yl z2VgRF4ZWBqp%5TaZC5|cIaYby6S*r8B~bE^R{awFlAzIlo{VX{U`VA=hVb$1koWVM zc4O%F`+k2X1bMqv1cSPf1DkT^3=e7}4ek8ZMj84%Xs-`I3?9dazov}$j~~Qq_+_FO zRBk9VP at teC)!#3|>`erzZ4R7`Ti7wTM_)wLiaFF(L%Kf8QO!f>ye|p-i<)92hvDR8 z>N}j)*gns;YYOkRJgU9NtD(|OUYSS48t>wiF1n)IGzBQ-UdgYsVLdky`};vkDqzPQ zxnR4+dR!`NCn)5^y}o~lvX_1-1V0 at G(4p9h at mS!%gpY-W>gb>(z at Zf@Ini{b at U$3c zYCgfzW0tQ at InyHV0{Dkf3qP*~DdaD#~C1bEeRwU at 2M%=uOs?6P1WpQ6sX+T7( zx(_+%%pk>)?fgs*WYeQEuF1$D20{y(`h;m4bC}I{uvC%G`!9`poQ9Qo3t!OG3z!^j zqR+PskofBdzLR`KK~)0hRZZGMQ;FZ4J4GzAIDP+#p69n2OYc6?Tf&B;6vyvI)Gwo{=_9`U2twxG3B$)8s(wbwV*oF=p)6i z?4KUtl38hel!23=!iU zmc7Grg{qCWG$gwUs)}aVAA+y^at~oO1(<>PviZvw#CslM1 at Bc&E zd$osyTF=v>70%ZJe?d^g{O89-XA<*xQSX(eh;9|wM<}@6(-N3HGj9msd1L%(eW1H1 zuFQ8 at ZpE>rXFk2$hGzf;zAiN!6*FT#eT&`v7WQESrF&`xu6xcw&6Cu$zc#JwHbl*< zYzfoyQE{Sm4{v39rN~*Fy!hEt!PE7J)J%#Z4r(`r#HD;#wNlGnf9TkQzWK!~DojUi z)GkbdMPD$%$ii$`FnF%fFSBA|>Th>*30ejS>!x3V4T>W?JmEq)eug?$23dbN$)ek$ zR;WT0zrn>^N^BqA$VMl#Ws1FWjE-k!7bz9?OU)+&qIH|S|{!p-Z1)?Uiqu%7PDJ(nKQ1uTG+{NjMBnIZ% zCna{nGL)B#RLsaE(7vy(ZTxk`Ev8z17iI({U*=gv*ctiAN)P3f}~ z=`-v1nC^b|DsL-XYv;VhaNqNZycvxu;bxF=(jdPH_r%`7l)D_vFjNH%BXhXRUJQ;=&X)U z5bu`gGw7TZ_uU4|_W`z2965^iIBp34YaCD?T4qK60Rr;+-7jWMz3wQ_A0^Ldtk zf%3i;LRH)gx?S at -ARlCHYz|~&elR?mOux>$&%U2}+ITu<1Ys~(7KTK{cHRpNk<^hX zRL5t~Y|>H7p|#MF-uJ{&w%BBf^P~%8VwvUq)0e|MV$^U%r^eBSJ7;1lx=0p at 1Iihv zkxeSkvIFa5UX2fIFJa~*Mg+ef2SSH15++^YFkRuEWIUQ+F=HpEuk28>`9boOgrLnu z1?bq?Epvq2nb5GGtB0#Rcg1<_QbmmPWF;AfP7 zCb8tZm$OYCN;fTYxoqXq9&UuEp)`!=CK?A{5JjaV$-zHHDC(;+vm0! z_M~@tY2UcRQZpuE;!G$ieY;OOfB at AQT3=H8SH65Pv(wio+PY}cv=+lc+UQIUQ~L=q zL{FQjovi2$suG8h-a%h+*^Xv2yB&Mpqs|-N^7HxxnE@|s6^+sCV*k#bs)!PWmd@$F zlyJU92h2?KM^mj!#p)wd9$nKWDiQ2bhf?IlCu84ivC0pRW(NKJpk(HrY%*^*2=mAP zBzx0rGt2FWBlgh0Pd964exQNQ?@(QijCzXlAD%LL2P$Iy4c5fk5Z6xBYRIcji)uiFM=f>B57jEW!l;NSF%gLSa0TMv=eJ2^8TmLhu+bVp*ozD)M2{ehG`A zFCsM6A1HV@!o^ciZ5TT{=v2d&4uD6+Ce4?IAMC5%f>P|ILVwYAuG3_ at vW>bMT=s}M z|Jx^-y+Y)v?f|xI_g{(Tw2cz+FMk~`$p0D9RNUj{Xw1Qo!s6 zaqX2_D)uUUXb-u52(tPd#EridO#(7BfsB75TTvQJ>GA$m&M;PErJOQN~1j_^e0Ow=Z^AQ7UdEg zLn#3A5WQniy9fzz^x}^&aWY^$BUZT{SJ%GtvQ|!M`-yAFUGkNEy-IOCaoNj{A|HC5va8Vg(lPEzE&d9B;FBMucyTZMKDhxExPLvtr2PxY8Qazd{U; z{K!kc9vK1*%P>C~K5{>zTNW$p{{k$5Xw#ksa>>?i6Rw0X&tn;crv%J04_xqknT<0S z+P6QI%gS&#X>_a9T(rf%6 at f7e5QfA7-F5N8dbCpFj{XRyfmK}?trHYJyiZ8%yC9)s z{N@)T67#@7uqko#$53zTOKLwbTKP*NMgHy}Eq8{Szph>T{j6p at 5-$I;VxZ)AA zL?aY)GZ9>qQe0x&;|^$1dqwRmV(WB|Quoqn$)+iTAr%=~Ci>&K2B>+|4;imGOv%9GDFcTR?GW=Wi z%N3O)SUcGk2N7~#SV%a$QtNOVoP>>#J8@$HqZvNgyttYf+i&tMwwOBXEQ7{01I(Se z$j~|atU}T)Jh^?q(AShr%@lpguMX0PAZ*s$A(#yM{v#%Nfv88+fAe8yFru&fhoQkR zARxm36NWk(+B%uqIokYdYGmTzVq)uTVQBrYZ~s|lSe!EBq^ycI@`n>f^6kx1+TULV zf>;oxE+6*GUt?}vn5aoY_%%Os;~;_m=&~p$qzfpC%$E(}#{aWK&e`7|(409Zf#bUGDZFek&a-(qpFAJKx+~J>i z%uQQQ%olEo-f?#F^PP=v0y8;St%5Ac( z#13735qIIC&;V(LrCn^aN*#-gT3uMO?{1;ZE2ZR1UQgJK+AO-mo;}5bkXgFZuG?(M zVRI!e3oZ at b*rvGdv#A3<)g{$c*9I&lNw9H6ROYtpAiS+AYpx8+Md81sgi^p5i~nd6 zjp`6!jE!1$v$one?86d#I(-N6y(86a#*N4FQ2xM{+Ytd(MYhCYbwmi4nK|SQWTpq& zUDWGdb^6QtscYkmIz2C`$+oUDI>Om!W*i;Bt;wJWxS!NTdUx0#+V&V90?lQ2Ozd{c zP;K$x}?gS%e%%(XV>Bk=rx79i3gY4oE z-nw2?4mov%w&8nEqAjJ^v|f(`m5W>Yq(FSp36Hv07745q3%$Gmj9)CuF1qpuOw7Pg z0~1Iy6^3sV^lSErRo5rG10#w|%AL*g1yAIAhe`NhFYZ}TMX_7N1mnlmJH+ at T`^q4H zgKQ-GGGpFM2yG1&Q at YQ|m>o8i|@$aPXBG)<#H zvz|jHL1c`IgFGjL7{ipKK~xgvdO!|%Jb{@Z zv?tJVX5r!MO*tvoG$5(1;s9-UyPsJRvyCav at XV}?(Zt*4t8U(QUKiEs%4HVj3$Y!a z-qWe_gabz0xnJG>@(pG9&-Tyuyxy78PLS;7>R_}alY2&9gYC0Yd=-{*PcB|7$QVVL zQQNqsi~&x!MGrU5onX`_%&SsQd{O!exhmNY9u5B=z{q-uK4B_;WvhoW9yjjijiQ43H+=3S!$84eV4h6_O8%lXD8CY7jc5 zdIqm=S|$8K#@{Q&$XGN31j&VP#6n|SO}LrF2ifxF+^4kek8lhW_(5rfm`{7{1fv%;|o`G8}tk#YyOS&J8kr_M;wA9!XYeafhS*e0 zgA0t*R&f{XI&%x%RJrvjWKhUeLc@(dgt%clrqXM%St+d9*eo^D;}uzW>{5s!`^Hy> zkKmQ}8l^}mcMl!ZGTw3Bc%^o-x+Vt8Fxb&c4?fEeXENP`$q{}ql|2q2`UV_%y0vDy zcE!#xkwrP=wL7K<_nBh7Q#(>eNmq3ZdxXDAAXYl6^7gA*q!lD=~ z2f9`CpVESnTPY5ny1VLq-iL(nMIiRa(nr?PYMUca)GD%SynC#){3_)X^%8Y0WKqzT zGhph9JSt|$-On{P9cc8BroLSFZwWz{7(#NxEpgQp%r325mBz?y%-1^OQnru8W_zZ78MW2wUN^?pvw;-)i z`z$X|$#cBIMwnQ`@_d#;!M)<(UkLXL!X_ieC8SOK9$Xh$qC at t|uv)P&tFo1w!PDyq z!%SR89!uMVrEAUcf-ijtdn%cOf;dIL=Y5$L`3m8Jja)K`aZA;3EyKpE-9DbfvEshf zgwN<%e7?0)Vb_peC_W$C| zbHSu|Eks)y!d;rcU1SU%=;0vlD&ipTIvUDFTuZ{5!j at wswVi;&Tx`ld#c5iBr|DKH znxqw)Pg-%AExd9JD~NaX^zdjGW|i3Q6th$_RhUjU20;xQ^dVPkbx4&y-9n|l{-O!j zw`#xK)@Hk66J=s;H{4X0ok#jnWWcP^;&bdU@(M)Ns2es=!43C*YPZJWuINIh(oS^$B(t{omcX$2x_U1)w`3Jt4 at A-8Oa5yAK$=QtQ=1dwj9U_2DH}>9Pi?TCFrkM4q- at 8VnS! zulX(-{bNEMy at J4acR-ee*cZAZzL$iA9+jVA4HArmk6SHOEpF)h0I22ogo`*HVWyCw zC^5*g1(6Ky5>4?#UNu6_+_j$Sh3Vgjg`13i-Dsn zct}J9?aJP9CY3i5(e2dH~J=B*|T*< zz#^mb8#PK)Ph1!d381(Rmw|t(pgY7B$-yl+OaRu6G3}SqPLu1dXbdePhEWI7bsE;_hsruUa1@ zpL^hE;Yf3KttA2tpY>kz+nmg=E$(LjTRS^IoPFB>q}})R$Hp6D at q+C&HFMm+)tz&p z at 00_IWwIETtky2?avE;hjZQhx%e_)w z=V5xsnx$tAvdp=bW}wx&Rw_;wCRtS5{GxT(;Xr5LVxg(RW|*-G4r+)cclq08Biv!j zz*0+-xsp$IK at oL>8~q{u^!SvU^i|t8uUa_imGUaSQ)+TA15-9B4I|^OY-8ocr700{ zzZUQOaXI1}0-j5KgrZeXGzTcFqID9k!XRXJDWezFGkiRhX#V3fK-E4w)TMW+OvC2eh8T?~zEO#gFABsb-MHZX?mSxTd? zrK&+h00n8aqLkKZAzDaCESj_qflmE#;Z7ml+A(pLe%H);7wowQe=m-?qX{Jdl<``e z%glAod*XchnxEGPsM5d=3=Ag=Q)DnaOpF}&Fe-`wO$H|gjt0wvGCA^Pr&58Tft0x( zDZFxLBkJC|8ErbLEW;iJO1t@@vhiSwQXy&Bb_ufULNcKl{!wz== zb6(tSJC6QHZvvpb4$`_9brj3WI>+kD!Nx1W5n+wqwO6jA6Zu(4yw}zB(=2HtY0Y$U z_dO0>Wac3_>Mgh}l!*#W%wc(mq6#hVC^Rq~&C0{nU}MO-Mx!IR+vY2v6}bX7B`aH1jBvUz&mL!8UtMEFXb(7F9d9L*u!mqqEVjwU_(AkqWoXZ0+h3R6iz)1 zo>F%m^A4?2(R&0^%+34>pF_S-?eF=eXiBUxih1%hv at ym&5+#z`WqE036qaz}mGidu zBKap$`h;WbB|2sIW|Z{ z)-anRzjkp8*yeLk<12>dTbp$_-&nXdmMg8$b< zo3=W#I?DIyF%t<4V50W`v=R(3R)SZh2#TULilFGjnpQXii7+{HRwl(}bnp7Kw7Fbo|X$s};A}y4P0uKZt*DZQn98V+cX0QP9j^bDHPd?e}(v@%?{(QwJdW;0l7% zi7!S{>vUn2o at 7P17eO5CP}Cjq_H82+-Y3hTAky69vPOxTbfz3tVWp>u^ytUSPTY&u zi{pXyn>?P7>Dxt8L^Obe&~_JKY68wGOHbL7R#JZ_c|j4zXQwx*6uawZ#$*F|@BUD9vxvN}>2am7?-SdC at 4 z%E`yfFOn`ER;P4AMqDow=uSuA?xV=i+S668nI(v~8YQL2syY;Mn89{*O$H9v-HwhN z)t{MDcg6J;zK7^LT5MNm0jzj9%rRXqNkGm)<5nswZB43&Ve!j#zO1|VfPB`d at 8k*41mIuKhG^G9^HKcc= z{1Af}Nr{8Rz%J|uvB8=3=`TXw*$0WRCZ_Up(RNs}$dgr5;%{Wd3PC08QlQ3^?4m`* z at 9&mglUu1En?LZ-EcDDLTv|RpcvUZfTH_i}&K;0jut`Jc_D?1b$8jUaTF%5Z)naRN z4;)}t?LJSJx=e-@(`@!zShnJ=cLhIS0AXfxCinPDWuz1RJRo#Utv~Nn^JV*39pp;bqU!a`3W9J(WE29@(cfgSKasi zCGiWdsxClL{7W{;0>q=E9I-&ZAkZ7{j!w`kF3f7(5!@}i`h1wppdWa;6qtl at en7hg zZzMy!h_L*&rN63899LzM_eBAeFS#dMyk}b~&YE;2uefou85tE&y3afbyV8`I5VX&2LtbI86u3Bmc67XmW==Yx5I7n&pQrg$buR at j7j zMgOd#f37%o)(E>hK#vVPQ+J4>I|ijYX!;tfZs`lwZ71 at W#523dERR4hw31aUQixZC zC~9DSnTHH_ZPWp9+#!d^b{Iu2K`-DHe!={R#MNVSx}n-NisbE at C0F&qbxQt?9j{)D zazudY8zFd5WnZB^y-wUBp51o#fxSrQTI>?Ac;P4Mh{gDjo_bk26+l}cq7vnY=u#66 zmnPiL3$BqghGECt3^=y77!G=}0^Km;^BKlmXcALGHsKxPNTFf+2?aeIfigfs#K%!BNanuzzs=W1P0W#p z)NmvO5k|T{Ik5*8^3oS3Y&i>0wSnx0N2k%cr?8;WbB~|kyhayqGG^wg^wI8=AZQ`s zGFxslcRM z6UF9hiilI2Es9tTuTGl<^F50`jfokQXy&xULQRTIAI-ExcP6HSo?66^7GP$uMx@@( z6{t0 at T}CMvh^*HX#&UtlMx>9ToAa{So6W0c9yZUsEgYHLGHu1OrG^rNtH`LE3{c}C zn(Uby4tENSZKL(J=(yVq(a03E#GIaZXd~ublB8P{X%n5Z#3!?h)kYn@ z`aYH9h0j!y<)j5(S%oU^vH7rcwWS9v;1#l*chcWhcmPp>0y% z;`M-K#hPI+*m+S$uz7JuG^QEk?DGc5^8O at J(#QMQZZ#dJ=>3_qLNO7yuj&N*#X862 zzm?$(uZ65?$bPrMrnecBs#Jh_+6;J;b5Y=m5yU at N)*qa7`-OIB9S3rI;12_sWiNpG zWPxZ;G}swe#m=<|+L0!5f|&$$&w&5HV0>|fFewTGVkgvldK7jJ{-B1dH!~hx2%fFm zL%TlJdg9^Bj?e=k+Y80o&;WFIqk4Zk%2u~0uASVlwPSP- zCd6KV3uV$x`bV at z(E&7f>DEp8qASMWZOBKU)9X#XQN#$DCF at QA`HqNgcbM#f?{gG< zUDP}OeVsJ at RL+(p#V87JM3O3&Fa171-lKr?z%Tz^9PeO|>VTJZh)>& z?t69Motf!7C#GK at z9S^}kcp|~Et=kUOw#5V)BX(;{xb$VoB0&?;KDF}OTMxZYc#d@ zYifr^>*X=P6J4oyH7DN5*$UB7T~RmM0#ZTgAT>$L!H`W|*VoU{uhGV>@Mv9Hdf$&- zZfWx_*=KZ%s1yzq&ULk&Z)200dR*6zaUOOSdgJq02 at V%xsRwMZd6}$l5UtNW;))M* z)w+{Ld#ad}Vh~XNBAB(58q%woGQ-TCIG+eZ!@!+b+?Q?R_FGg0RVPWB0Q^^T9URg4=i!q`+bTV-rj6hAw**)&sag3=by(pC{!A;N;%+Mop~L8IYl5X(Z2>b7hpSP5FE9hIAa!VMvA at I$(KOr& zO+E$}=Rk5{+GzNh%YqcR)Q|g~eI^NkycQix*p0FK=zRkdlP+%2s_L{`O#^3ie-%!) zm12fu_>~>70LyE|p~^tcm~U};uBkd(15IMK3q^HHr4gfBcV{nYv$EMfmPprGu3Lwh zKX5sbX=VX{K;3K;Fw3>yaYMfU*+sO_Rw#xk#Yl}BII+>qu;o}CS~_JL4NnsB_)4SY zYU`3R7T>7i5>t4hph+b~&sS`R at mIuKz^2^5>Bp{3=k2ubWL?U38LHj2xn)^*-q69# zD2|d7#S5Vj4Se!u90?_6hLZ49tW_j=pyo^0Dn$K`Y0oAZqdZ)hvYTZ-$r+7Y8M29e zg!Ed}9BJzaA z#2z<^zT-5zoz;3$=MuC5tb7Zac6I)ak$?V2BV;fUY0!X%IN1;2&pK<}0^iUcU$?(sIbw$6vXCKhw}4=};} zAu56(5(51Ts!1&R at _tYw57;Hh2G+21kUetdsj^XL^i+dfLklzDnsebxz-tPv|miSBYj zHx{EffA|?I^@~Ps6!1LkDSnVPPjKiQBK2- z2-k`TCpz>hx=oDNVn=Efz>B*e#8W)$BDlvw&u*<{Q+WQ12ajx$$*r!v&~J8WxAGF& zUX|QXT6(XQwM}Yl$&|>JLO+vG&qn33160!vSk*-ESs)f*QeqWEm+KMh_WzJl%{Ppw zDy`}qqAC$B*7gYWE7=m at SPY6Mt^XBrTfST71$#A`}Q=Qxy7WK`SAUYCxqZfuih^Z8wrk z9No2{qVg#&-~ZIU-%8`Vh!w74j+_6$n6F^suYkV at nlCuJ*|%-kP^}a)_rBe7zUAzF zbe-)^y0iCvf(d~0MH+I>jWz(qj~fg{4b_oPQ6!INIOT;ua9lbBhDXnM1gXnEULw`! z9UfTXEz8IxZa+9v$uZB-o at mg6Sp{X`@e}1{&mhmRi_10{4lhR12Q(Iss zD762gNN_QZ*IV-vmk!R_sE0#~T-r81UOf!3y8KNW;rfcXLp1!^!Z_Q)@{55~ozD7n zx5!Epi*d{QQH+w?24h&1R(d)~v8+;K<*^Oey7jYUa$uA>kS?b>z&0zoD5_h!y4MBs z+G at DL?Cwpxg>wfj<{}B8u}F(iw?n71AXb at Xsk1F7q~X?2s->>^IT}Z%@u9)+qRlRa zG-O36kVp1RXH~S7Cx at 4XLnx0UO|-R0ZE4Cz$pKh08L)*iw>Y!C{t}yZ%S#e_fi{=O zRfBak$;{f!z0+o$idYE?DX#3H<`S{Fw|JB&JS`>kNmQ0q(lrZJOs3W(#t|`5zLh2d zVTY0E_V${X&KADhnKP{(pD8v8LVAU5gv!M7cyTjJ?iWy{JFbg^&@c`5YOQan^DF51 zT=JZRVqQA?R9jVZa`Y0b%d*%cfim at 0SF|W3?RVGul^Wvc$WHDVRm~*XU{*{WjJilu zo03`6ZUrmXx!R@>oJzx*mQ at 1vDw^x%<-!7uoD$BV%i*<-=`WsKDuGtm2H(5*(z zK`R&Whp-^_2Q=55%svW@$dn*kj*@-bp5lF7Jhy#2Q169W17zwBbZ^w00ZC9!9F>LP zeE1^uK|>rx2b4chyTf0KJ_Y;2J|+7sc#8K7 at WJmH;8drtoFb*EM1XByRUxj<3B^p+ zxD=4Jf~>(+rKa%NSh$EDsh+ibi^mf;&e~Nep%%ZY_>)T)=!F=NYSSVi1OlaeFwQ5`?n!KqH5JoQ)& zq1%$C7~T!+NK2RRWr6fgi)jtQL2Zh`x$iufAU?SRzXc2YKLxOP7sTLM&;V>v3Xs^r zl8hIaW(mmyQHEp=xk_G?E8q>e0vY8ZexsA#+2a at Sd(sirb2TaxfGw{_(iL?+?1t{J z{F;tqeB(I6BhR*35=>mh$Yu%6Kw&rqi~K&4wx>zh%{ZfCUGGA62$B1`NE98SE%8KVq`EetSk+)C>Q5Bj+JnCD;zJKDbIKcacaB|Yr%H>;dUXHX1X@`*MT zVmG(Vl at -j5wpS$AttKK77s-xko^w^UNCTEi{}@7i8$uMvFCD>;>rj}7jF8fMzj#H{ zD6eWj18G#7337!2X6|y>mgawo^VWSQ)LP^g0 at zgf)KRJwN#g!Rg2ojouSD;NHHCr} z$`Coa47!gOpt at qN_9ex1qM7svCqU%@pu{|NfU2$3Aah4qc4<8=9x+)*fzpn zN^Maz6~dA`$d(UDn+HitbnkfCrClXsQJEXG+`QTNZ06RIjEilTjvKG^RoRDMUs(G2 z+csy8wUaA zx{fmwA)HSLw8DLk4Uxb_29c)a)eHo(&K|?V&avD~{`k6UL`NTP(GPK)BeERa<@lgG z-&FiT%|Lv?#ldu8t(WVV~%3-POHz z+k-D!M`|8 at ktmoC;$Nt{fy2J~3I}zj)qNYvRc8>%2Kt>SIO6MqHiPC9T$It#}D`QJ%3&1`(Tz+J=-`^6t}YOIM4{Ny)ne2#7DwkG7bA0(XB1^@)bIxJA}le;xf2_;0vKyW(Bw)>qCOxC z#E>zHYJ~=FKbzM{bYc!s&LkNHNoB+vV|qr7b~uA_iukL7Iy3D4g8|9%rKunQ{q_7S z3M2nF1pU8?hsxUaNPi#4wl-`}S16>i(iQ}*3g!C{2xinsW<3wCednP;=IWYB$kkQ; zNhKo_!~YE!+dt{y2H4618<}l0=We&xdA;$ZzvmCYAwV6^a(j|6b2FkO@<8f-WW zq3={r??c?`b;M(AK#!r;t(6&2T`=FPP{Qbq!4$4ESuot7dDVM_ at 9~%De_cx=w_N## zsi?z)4tvQ{Jy7AmhxiYH<7q$8F+DHSj9s2)y$w at CkRG zuAmd0$wA3Uv!a-{kcAVv(}+ib7s?-VtDDbW+4P=TRgBB)s$(F7_Pl(U5LK9%Uks?1 z%vC;(b3N-m=!iL=9;N)L!2CoLpL%IYw0c$oDfh}4&5I59Fc}WAHO3#M$zrQJ0vo;^41^ZLzXh4U7CzP=3IkJFGE}(F#FAI;s7i9m<}P%qdbj9 zh<1})M0`rlY*zgM8u`dhg8YusexLq*#{ayA?-i{@m;9rKc|v^YNy#25s3 z59Y&zwsL!*)aXx{t$Z5)OmaV>jCnCVe$l;%@C*x=a(1Oqbx_Da?v*ea7t7sY{Wql0 zOKG&&=nj~MUzc2&dEVnGG1<~p7&Q(`@ae5tUNNoC>QbHUYDu;(o$pvBqh-Qcn;ly& zvdWLHyg)HcE_4W~195sIj+4z(6QtdaCt2M2f_lkQMzlPr*s3@)KnCb$N#DKkxh(wENF#u{wnwsvTchk(flY z*Q4fbw+omD3uSRst2(Z2%*^)8&CQPB{dfC-9iZA# zuSL`Z;n0sJ+=WIW`r(yK#?oHF^)jycV(?2-s#uXD1C at epThpSLvenyId z$jma&z`U7|y6iGjrJb(gkQMe*=4j_kpHh;iG1ClBORuL|p-Iq7M$B!Ra_#7{(6lL3 zr)4x(q{=)#quS~+r?ZUj_XC at +XtU`gWl?tK6<^?`civf4SI;CCpwUEgHkX}t#UzzQ zb?MHk*mN5;!Pr)}iH@;k-a__pV-*RZXD#4P-!K|68iDxe_%|w|tI0 zv}>I$4_lV$_imAv7gBL;5$UXHCO2I1ZYnGv&t+Z}J at cQ%pc~qi_b*InYqNERu=WmS zv2*N}dB7#(@8Av?On;85Vfo@?ljhIx3w^v00e=jc`N at tngYl0xAKPg+ zC`-1QlriiZ$SLyij0XC!UHAysuOh_ndm#V#3O6Iex)2GFg9<{^rrdQ||c9 zg`^byX`uM+T z?Ega_%VNi at tgW^CuLgth4G`e}rjMY66crR6TP4yuvh1Xip#Ev(gTed*_ at r`3sM;un z;U>F%xjmlTnZDlso}dk}VSzNKE;Q#FD~%%w_L8Ko2IF^T={38W8F~3RX-q>)V~_Q?Z(1OAVf3n+3z; zyXn)f6{_0l;fuqo4 at c-rsyvtADkg3nxt2=X%Ts~4Vu0>Nfot1saj(nrJasxx zGkwJTvp>DxL}_WCia%$b6XlKvZ@}U>(;e7iM9rw==n2Al<4nW15x7R{n1l3xs`q-C zSiTd7p_o_}S-e>_5HhWxP>`FlQ2sqO2;&9nnCePD&nm$Po70JXH*R{=p-AoSvAq;Q#4(>}!QPo(Bp5S|cCGdcOl^o_asv2&xC5Uu6KEe(9*bn7`zzsK3jzU3X;7rC04ipQsq?sIO zPmP4xC{zn$rk)8p4H1jAM&yjtLn!4KgfnBR-n5Pl5_P#A=qmyx->%ZSiJBy`@;PHF z-txI3Y4Zh?3(}RG8d&?2+&u8f* zFOmZHvDiUN-$)GxrWMS$@ZrgjHdc~|a?Q-TUq+DzL>RFQ6s^x!pT=4weY9B6#Njr$ z7%N)ku$_?wXiQ|(pYCG6!jm56G-S4D!`4KfYYL6 at 8IWXX%n3ZRz%e+wi-Ng=AM*@E z?qtK-FB|=YVya$5fVC_HqCqcoVYraDf-PD!c>^svd?~PSp)PLLVa18pLxj8t7Uh%< zrx)fBeal6!UF4nTMK|GUc{3rxHfJG8Xl|h4L|a6d!hWNFs<~sB5YjTO^x0jBPB?8i zeYN&|uTG~C1HXllXc5+Y5pxGU5FB2|h!jD_!bEADZ5XUBf!vti$he3O55I>|L%QpT zrwR{BOBzGAV;V0UZX`uh<@1qxNx&EDQ*_v*5ef=muK^8?*n!Q&v%z96CWh;(mf^d> zXZNiKeHu%|m}ixGUQ0 at kw_37lS#e}8%tq27H!mOAi>;Sp$-aQni&8*Ct$PgIOS`kI z)sG`%bWs$p8UvonpEE8|)hm{7B4$sS!+dFl!tr{h%=eq=B$og at Y4$N7#-ak{NakGB zuG~ukwP`c=!Pjy-7&A2T-V9qk8{+Mwrr~*ifD=N^$PuU!G>h_~b>qpi)7BJ| zVOnl9%+g6`S^OnjAtU`STNRIXDb(>70T!kRx5;`rz*s5dO5=3FbaL$w*~hJ_(U;d- z6B2=_jXTGq! zM at h);eWo#7@>r&SpPytXMi}=^LZV z7)D-UT&keNz+84OfOkL>33HvQg)vj1HdO+RKKD;9DS at 8csu9nxooOazy`j at 3EL~r- zNZ^)4tc|*AwA%uuy_(}+poMH#lUw_lsKlW!gzP~T4q5RTSF}1nwP?KLKx&fX7pK(f zJ{+s@%_XuN6E#kcJ3_J3PBRD;eiHp3S_%>@SSuonNCnMPyFX&t_nhsA5 z3VQTushr^Rlzhd6K|?z1I^`d%SUn|5qRZxQ`mPM%V0U~VkQjrgdURx~PyGPWTN zmdx~)3H4r=%5<%?LDjAuI;zn&Ggp+!m!uf z{%W;VD^!KX7?4ajAmd55HDD+PFbq at w6oR5lZ^mr#DIi+_Y3U(oSjFj)akcNws}&@q5JjDnb)^xmbku~#2}gG$dTJvSmHSC>cy6fflUlQ z9%QIu6pm;A_B5|$>iDT6uKq?BtB=lWeJ)`=WiJSQ7%G9kKMkcnL94}3FfB=4JDTxDa at O*X?#YhYk{IM_Vy6 z&fWK7bToQzwACfRWvZ3|tf at tEhr?kzx8GrWLsHnQh#PCGa&&|}M=D-6)e~E~10(R)>AA&$n-m^C#+70!(T;-Q zt>j1E-Iig`J4o?l2Sue0M$OeI!r1SI4cgKQSyh9g4C3%D6uSn1-wk0uij`P6Dk6qm zJ3;n0>r9`@%F`4L;0;FsPY;?i;Jyxke5%0!yYTn}Z7EZP3GauQ60$#1aY4q*6cXX* z#$Bd=u-2zI!3+?z(c>=O{kP08g02#0-3CvwY%aKcbf+;m*xPuxz(n~D&+$SJTlH{K z*u5fKM>N#||9ILk^UaH=p%18ls6{W(?FVq+Lkx-P?3;982vImur3hdUL6A;ya)7Kd zw2f_(a+n3go&?brCLxu#IppT(w0CW83An`tC}RaDRVrw8t5?@52zj?MI^eS0R5&OC zwj8iU(_RroHUvNuN#7v2?NGunMbIv?Vt{$Vto&ifqzSq+EoQI;SxF;Sm@|N(S_)${ zAzftPrftGfnAKeuV-|BWwyyBDtm^_fVFEm{A|Y&R=1gJC*bYvj#v~|EyOuR{z$mlB z;d~IYZVRs)K6{zC0;>qYUS$5_pcsB_MjXPcbAf$>Zhj9vrDH#%8{`B&M|Bh6hfs$q z&>b>cuJI$xUNu6&opOS}LV(kVVS%kXgkvPpwI#n0E-NV&N}B34ZZLyjAo{sNJEijJ zKzQo)fj6l$@U^;vCx_kr7Xz%f1nt&@a~>p&cOIhTVRT`Q1&bEuFd>dQIrVDJ&?NMb7z?2osf zBtvutTa_(S=C>*zo4sc&95d4q5K1XlXs#@EMX_2|fc5UNjidtQi at Oha;|s(bz*1#t zpU=T&1N1 at S6Ky;l2-JROiTr6nz#l~*d#)?q7kk)Mte8%k-%jf}Vmj&GXI?k%5tqOz zQ-rDVC0pf7wpyPN_~I;ck~EMa?nbpk)})|;QI4N1^y5##4^{5)HH%Tum^=QXxuL3?K8%}V%exKfZn_?IddqgkXT5pp3~}&u4+>})AFwdS9Q-x+T*u5fySoy^=>s>u zGVm2^DU&>bb&X14R6k_$ngyzjU1e at y9qjG#Ek{nD)%|N*hB)FJV4Hl~wQD_tqBByd z^a*1I7gT<2*F{D9)r`{zvCpK5+rsSltFsq=Al+G$9eT~fpv|m#H+k at r+F`=vj{w?L z{ZQ~w9OU3;u-VfsxcW5XJzkh+I1F{s$tGK2#jCLRpmgqsrsvuN&P3di!mS5h6%PFX z%y={!44&bn#hApVAN;}MD}$K>@FXpf<&66$gDFizNem{DsmhFlef}HB#1h0r1}~c4 zIX34*(U*bQX95GGM7nUS3uud^de%iTn7O#;Cq<|jv+oQ#1n&7pBaQy at HX`yBal{LS zk1WTrA5P&;OHpc%BRvWyd>bEFv|T9Cg~1i0MhhCNMhrW`cMrDJy(^@@u2A{u(jOwN zAtGJjYqfh|58C*v8 z*WyZ($8>{J`Y} z<7siZ9-aK!3BTvT+WjQEV6qE0i}c%o(Is7-#AZb)WV4)c1V2WZK+SD*7bAMsRBfoe zls%=FAchLxx%{I zdr(IzAC4NEW&h6)uepa^C$rks2HmJX#_n1N=BXoU+R9sMh~L4mqp^^nkgNq9$ce8%Fc%e( z?IlqNE0h5vq3DvEkVXFCv`CudY0o8n`Ezd|K9eFmOWZlGrAfWd5-y!yq at by`zvP#w zjGu9 at H~9A2yq>F{#`5|;!3|LLC5VpnP+#uFF!jafVsCI8qtJSXVU(-YI#FYXc<{R_MpH~ZeN;Z(ePao8XT5L79LQ at MZ z2be7xVd-v*gChU{1?g~;-?qvw(yin~3;r^mlxbPn#AC6I zS*_EBMVYgeR>{p~?taKxi=7ob%EJ1P*#Ik;lEG55vt_v;)*L6b z+u2v3CX}IK7Z1=Dw8YkyfsTPLHfwJ055u+CQ1X*FWX_diI4erKZ4qQ1o z29aU+mtoOmW5&3o$CA3pOhaSDW at Voo%!QU8yL*D~e at Mp(s8F{-U~B(!xKq zF%?w_BqULN+~_Fs6hk`U3$WSgi8}K6$*S>M+K+avxJJP?3;F0Pz;(Bl*yOo-=>aX$ z6iY@>DZvMR_6#VpciWB=&QF1 at l^8CE&BdEmLL`A4a!ZaXVV)QTFHm=7R4eMG=+dDF zBYVFzG{fAAVMk(5=T{O(q`5hiX8bA(aE7n at f3MW2sIjVkb%f#0Xp!;M?W~SmfF9zQ zQ5 at cYr8B+kAkq-yR1O?4P8$81MKRCZiZAL4m%fJt$>3=V^yM^6M!h*gkp)9)$&FT#aMAgLyg1h%%}S=5`+u>^?MBWdQ$(>=`uXP*sd$Qm~Je zs|+62gN_;1bV>uJc}$tsf=nNoi2W$Y7ADtHUXp4{W+*xn&&OD`?`0^->6h=Pk`DAQQG7%#Xb{%JcMD z>+Xv{VR<#im6=zz0UsmB>Po67Bu(lkzGOWvK=cH1VFDY^3#I8EJYJULO+T+3cNrAb zPRb7g&uENh?ci54cb1fog%%$MSlsRQV!bC34w_)j)PHZMGlAL+x!-lG@$RM!Wu#p# zl3b{kA|%in at u@=EvkI=(fiEiVibmjt=eUTl&CD2j0e&s^SJweS;8!a!q;%V&DK4T> zq-j1jz at i)Ik@#b3an!rgPOz!!J;X78bQg&EP^OhNWq2-I9&H~#nx5}4!uDj@{KmS; zi_M#rpFwMuB&jSmOwD`Ld)9u-b>kKLk-IjrRKi2{({-q*>vY9Pbe^t=P4f3&CPrbq54 at d4vZpq*Q^n+eE*X_m|Mo6A3A4)dhj)S^9#GP zUY;S+%a_X)>G;Qhlg*d!_Ll}Knge2+b<45#h!~_``j8H~>;>L6SRNTmY~hP~ww70j zJO_ks&W>p|eGx_a8-&Eq1?`kbJp{Suhi>79yH~6ckZi&%ws(E~vC)4#8dKN!rIG^! z0ipi*Plp*L+?@YUUWlbB;9nAh5Jfo|5GF()OI!6z^(sBl;$HKGHXuhofTV8-ZjHbgFKP|hPmBI0N|Mm>OkLv}@4ea{k3c49zhd<7;91hC4 zR^NwJoqfsVYeR)Dx&NE9O|R^!n1zqY*|O$w(%PIQ;7Dm8L3~5Bl0fiTH at i$HK#v|Y zwvx;EVcH;$Dkg-PtL^qnq{mHsOhz7ZG_Fm_oduDzT0UZ#muPM}$;#WH91)YwT;+)% zG)PH*f8T3)o}N0C4{wA%CBi9!XaX?lGMSihyrbLUJc?xQxU#G7c@Eov_6d9ie>Ylfb;r~ zRHd-0g{pht|K8I6f9D{oIGURN-v?2Cnwpt9{+D0oU;68xQ-CE!)NC9c1)a^}l4Lha z7*4Q*L2#%-NmVk^Vj$#(MuRg>jHAg0k}>-FV~ThUAfus5n0P at ++E*ZcXeM7o$t5wG zjThWGyt(O)=ej)s-yiKEG;HPVDj|U@%&U_c7?d}fdbD8JIl9(!%)C=>(PLk_mJ%u-AS<_YUBy z(_wH$a9bNgYs%84+D9%fIqECDdJEoMCmc6sPYuf(lco90RMxMeY+U9kZgtRg0noCcd{l?1j8098{7G)+bKyMHNEtVYJ#9M3}i>^3hH+x)N-KG0zO( zW_QPFcDKjv|}QWvsl;k^>$GYxLzY zU%^3Xs8r~U%aXi$@E9GHPS}CYgroYS>RQbvufmS%TES?mC9lBA6qwS%5iFjg*z3g) z5%OW5g(L4;GnoUYic?ug3CY0ia9*lxnFT5 at v>QI=lS%ws;L8HC(AQ?|16T-|!Gp(^ z71JBK%qezFPw86IO_@@PWv?Ynb!x1B15~^)uciMA524)%|FKw9%+sm_nRlOs8oDgc z%&_K*92v<|Xn*t=uv(UoKv7uv6Gnk{HdbLVtsqKg%_?#35pJR$6 at 7az8NQ{7D#sdM z9|I86DsTg;7y+i_BCGi*d9rq1|A&-?d&O^iWI* z$Z at 2`qTO_#{RWdW7#{>8fptEL3S=priP2vZ#LZ!@-v<@T(YBuX4hVrQ8Ftz*H&RXI z0(|yRr~J>XjX7mA4n(AP^9q)yn3McM#s>Ym8V(dji8Onxx*RmmpCpozhdaPn5_Dy& z(R<7=!FG^@@ox&)6Uo@?WbmD4+MACH8L-OcIFdbjL(CV>6|W^gm1o+ugi`y at zTthS_X}QexpyN)`T0-mta_ADT>$#A<8ex zK$DSyYH^$O>FYp++B|G-&tuJ8UDzDVSDIwAToZ;$h)HquNA{nL{VO z>IebrQ?^HRL2II!+DxpcHVnl-?R<0};5&pi90oX;oVOkLp9^#U)g8)%#xRY6pc7kx-h#oY_yw{n8=;pa%=2o zk)ftxFUn+4O>o9?u(5;PPFvQjY*H;z{0wVRzeb$*i36F}a>}S5VzoFkw%o#peFPx1t(#wKS z`)HLVs_&-bc}LU%XsQtytF$9w%zQ$KK2~mZ>g#1{;0rfry07ZefGL)@QnH^sn<)YZ z{*izoCfhbkt`@qRwVlf74{B-3Dt8!V>fQb<>QV>Y5l}s42QW=EuI+sJ2yC0slJEt3 zEeYQ0OcnFGLtsk#$FuSDNWN{wdop~eU-}cTS|c3p)rZ>N6zdGICVM+ntYWjJp_`2y z9L&)H)>&S)UcY3jTm&(*|VmaB7 zYNyAKM7vj`TC}v{3j^MQ= z%Y{Ion&mjssHHvDUGf+=3w83G));m_*it%NV at a>b^wC(NFX;!&-I6k4Ed%BD at zM#5 z{KS?!CoC*2^Da^+M1AyMkMl$1HHWebzC-f_;Vhrq19IUgt{14Ki$N96j1~9cVf~*8 zv=Kgfap`kzcVLhpUn;7qyPU>LUnQDGQKgD^dD2%DE- zujO<-5pnnU*Q|@UVs}M`7>^OC!+*56SJV<$T at r60#{L<)Ndy&ztM<2Jh(rFb#zR?4 zS5q;7v!loVeRtY!NfMPWiGgB3a4Y1Y0TtRr<}j7qR#Q at n>N?dKDwtSkWXMWihXs^m zO}sT|KZc;bFNgvkJ>th9 at cne0aJIv?jWm*DbA+S$>H98=`D_l>+0dnMZ-3*^n3Ig>6Ue z(;6-dqzR#YgRRHbO6-{nuBNHmmeU3&JW5qoZ?apbyafa^ZN*in;6d+>!%Y1pij{Br zcFByHaRyMP^Kq-QltuN|u(z2S-qN+oEr8DuouCYhJiev778;2zK<9NGUYaeyaquEN zPrFf|+=EH=8;EPd>MvSo|S!5T>+Zn-vZ zya at e{A`<;|7XRl}?+!!3jiNmfk?yCLE8_7|eH4nBE{>~%4B?m9z zlj`znbKkpsPt|Etr4olQ&s3dSc0lg?#TkoI*;ad?fXCq=Gh~ZrD+?uy;GpM>I~*RX zZ!bE=8B66Pk6nC`M*O-^E6<{`fMQA5`m46qiWGOoz zOER^jB_Tw6nBE?#To}+~1XcEClgK1Ggq00em}`_2=@}`JStBetqICA56lodf6mjJ@ zq%v)vLb3}#j%}Clr%i#lEZc}IQ{@(HI4O7QND1Z1fMH%;JVb4vmozrA0)>4=o5^dF zruLZ*x-RC=b_3#M0cE$yJ;UUE=bVWw6lEqR+9f6ioep9fxW>v$L*cU+cS||J!Nwbxzd%irZbS{F+gjh69!a^&* zF~e5y1t;$%0^&Ll8wwKr+ahDQ#|+*-__T!~M|=O!-q04BSLcBO0d>IqCl}klRjRz5 z$-g*UkJ{dUd1$`@$Qq5bbcD=C3(_)6h{aH-^>nBORLKU=kf<%HQ;FN5bXmG)ZcD(< zqxS`0B;My$48IFv(MBQ0B*p|L at 3Utb^BGweupaGi;<5?$UamXbUg8A&-q899 at hdDw z>DV_oGq!9>RkH`8BYDzQ6NYfJ;tt1;=s#v?H1=u)VV_ewbEm3HkW!gt%5SEtvU*A-Ksm)%-vAZ9CjE~IjK#w z7bbE$E+sVeDboV0dFPhOZPFJZzsDN)V@@8xy0YmvTqlw(GgED&z?X{uEYid#yU~=I zw=Z6vL>s$sz0 at GbS0fzT?A9N9mvqzTp!w_+=R9}o5~^`K6uH!6J+i|Naw)1~1)P^| zA4HFhLk*WuO=)%+C1f%w^A{EjFiGREx_;vg%&r1Q7I;p^)yc-mF at j@PY&R-3I at cX4 zX3mh>u8`TWsed8SK827SS|p!T9$*g}DY-p0J{7Z=YPObnEpwAzap at OcH{%0J&uB^~ znlpqO>C`rK;tUWKMtM&~${p zfx7v+{oXsRUGbRr<4(91Vi&QgZNx&CT*(zSc<8IIGID3<_c?M;j8IP8cI*ivuj-?! zNcb`e&Cz?dV>ISCXK~r69iYJGA2El% zv3B<-g3B`&9l*fu9TtJJo(Frs?5{AyLqJ1iMHQ0t)T0R&9Fs~0O>E(Z41l2E9bXd& z)Y5sydck+oUenFcb2b at hjTE;>Xhvl>F?5=wQk`7v!%BML;#R_m8FKmqoVOk{!lsu^ zf7m!cJo>Q2 at -*4y&Q0-LVrEHigK6e4aNs3v at Z7w0Kv-S}-f+%VpWMaLbR{xj=m+#*hU4o>Q5+k%jF0EZ>M5Cv-E z^4#%;98X^n at aH1F+;0Tuk>~mOFI?#>ui?TE3t1Ndy!Eg`w~_T;VOq2zmnH1FtW`at z_eA0%_b?j at bEGW`WS(=xu6EMi!SGk?+eN>j6==@5mruJOrKkNLM28zCJfhjulnSD{CWD&U#zVofpPIKA~4i!f==W;VmG*%l3$|P zzM`Mz<$VPilG0k1VO0~49~K at +i7Hr?ui$)#+Ibpf2z*G0mqeNB-W6D#r$e%!^O_H= znzeew0=4)GzujOO!p5ikP~D}e`5$3a&?3SnM?_8z0~{j|#d%ez at XJ+HNtZT7_d-R0 zUBCzK;bgxc_5xry9{%#CLe*oq_DL}+cT5t)ddQ$61}jMLgyYRQ&2jb5T55B&wIG0!1IfJjNctWfFV2`;r2}QJmg=ws6H@*>Rb&sEa07$`bFkGG z6%i;|aDFf%YM_0R5yBMJ07y9apkKI at Uv?qM_!yIL7;6~4R*YI-!awH{3_}=m{~tg= z`QZO6Cd2Zt7YEh3|32H1tgEFS5?Q{lAb5pf80F3gEJbZKjLItPnMa>wI_|o9HH*#Z z{xrvUe<%m9x9rZC`&ATem#RfWX;~Dus)n&_$<;5uYWSSo1^{Fj0u-`F;KXiDmAV zftuY^Ixy^PCro>B2kQJjkXmY=X=1Io%Nyh2t5fjW0pT?dufwHRKB+V*&2Mp~v_9tBmnLNo& z?Xrg*a2GVSN#Rd7FKkN$U^CfVauv31?=2S%9_FBb^2{V{A2bV_Z6ZRW$ugdkCA!I) z!>y!4GOe+wH{npIyw*dhdNkbh?9JLH8COIc>oS-BOce#;%~iko zl6u!pB>MfHyNdf1PZ!N~r<@7Jxj3D{0{4kPNX7_mQ2EZB-#SQ*(S~;%=h5h=6e)=# z$33n_ohWQxeg%@dT$*odV3G~Zl`-drn=`?=QLj{nF+^W$ z206D3=1 at m$rO>RhGf~VK6)}Udo)e+ zrrBv#zkN(-$Excgpi8G#=Pfb-LDHQ2*Qn5lPMHyWQu+^)3Mkn>VpjHj1XLzlGkRmP zox6ewtF&Kdic`*LkWD{F5jB4fVnzQm|3aeZI4kNemV5tqSZ4hnEbl2SDWZPguv1p4 z`j#sLD*-#$2!|D>`;(%u2|-{JdG*n7loWTdUDpIa{2>WnfMDdu%=?SuGuI?pUs~;_ zf}XOnvyWM>y&k@=x63UzASZXDLIg1stZfdZ{^$Tr6mT0K8mx4dyZ(NW&|NYGPpb@~ zoV;3Q6SY9PfqDJ=VvV>!W)kKRsNOeiO%udQFMwVMqs?Qh|)5U`TSqkwAH_osP+S z at jd(0FiWwn)FzrIaPRIf10oCygZAaQD!${&aIE8Ky8x6rwUUW`D++lCP9)(X65UTv z0XQ}zGghEJ5e&sg5D64JYz3`BbRduDvO4v5ka2Xh`{W`GQPQ+JqpC1P*lD*rh|u zenMT5V-{pl{llKXgS~%;_4sjBWz%0+3qt;{V9oZgZM*7!Usi9T(=D%36kI-}AbbvL zL>-AsjwehA)|iJRI&h#oYBcGxb}a+P{{s02@&oG?ER0xy(En5#x`rVW^WF)m{@N))(zB93+M|l!`RmJok&0s{92j;r at HWbR_DG4;qFAv8%w-Ge z#~2FxfaiYFJ+D&Ivoz(f(NGeA^mtq)gh&?#EX_ztLY{p_uT~dqr0!F|ksm$l7ZzAd zy*LZyh_kHcVT;K*q^^0=RsVwLZ8ul-n+@*H#V>TfDciV@*e at fWD9#kD$d#5WZvM0w zMaI-f)e97`Ieo%a>aP+?kvi;N=S!oN7 at f)|8T^ONc;f8eUxJPo;QY2%Lf2ikkE{7T z%Xhpjtfcqf&0731$C_IV;3v&k1df=|w(lchTg9oW921HHSpsv`%#d!Se>$!z?=DQg zrlz~Byv)C!aMbagvH2dY^$J1BR3ScZljiO)C$sP6vL1d}UB+xw<=Hjhi z^0`wyn`vQ-t}7ND4j|uj;wAj({kr*|%AggN&wgxXya($s-lrdk+;F-ae9lcditP|y zqc=xGb%t>lY!&Y_BsQp)_#EjU$cx at dygeS(V3eum>Sgv57~ELlb? zd!T~p*qg#E2VP>;!ZlRU$@pg0*EMt<+G`wdQVD2rE~?lPzTqn%#xs`07qZc?y^q*u z4^m^11E|CGtQ|QYW-1Vz=7|+b&c8lOlK7BIgW%Ei%l9kAfZe%5y}9BgJWt$HBo(H53|!*y%4MP3K}ziy at hX-Egb18? zCElIUvdC(*on^cPFx5K~Y*tj;VwX)jMs$IwY7Kzk~vuixN+%`hnD;;8gcZ~IN} z*3S2%0f$zCveDRF{9H*1UIsSJTO<5{9R%~{?FPvAP1n&&Z1s;rXqb=`cjeMUgQLuD zSEudoYjk~#Moro8kNv_Yu_07>Ye}P at wZE8bEY^qd;HbKBhjifx3}lAbv6n?a*3%4L zSXu82LgVJ=@1XTe+dZehC1!qW?qbq^5XbUk_}+$b3u*112MU0NqIgz~c=f!MoDiFu zEZ7Bl at Fj375E(ouUn1MekDM#6S@(|b`c>3PW!;{Oy2zyG{GwNqk7zm at TmN%B7sFIj zf?h3Igm<%@x|hUqG2PA}ohW<*Q^Xgo(IHtEm$b|-A3&DW$a_wPA|$B>BQ-Y<$Z;jg zT(P;a4sHyC^b_l1EVYale$KviNL|g;5gFl{p7%BsWrm at QF9F{uEEl(+Y4}4N3^~*C zi9(rT^9v{ejf}0vJAzZH at MCGxnDpTa%IKqFjB}<}?9&&ZWf&$Ysi}AK2%#7!O7R?4 zOGhZw>MI)j1sd}eP4x^j+n~=htqFb10Sw%W58$c~M{%%G%TnPZZWIv4)n3agheup)=3kAsvm%+bTfb zf9HSwsXUC3e;sG)WuSrASzUPEQN1YRoFU8a1|l_I(|fUDxd;`3ICBa=FuHf%FYatX zBF#>&J50Hufz^QYn-bCsSbs$O#vAU;GMDHL6zL at qxzO#_ML2ihlAiqgAInwvYbS}G zzyG7);QuMj^4}VXkcr8^_mC8o8F>^X)Ng<`&sWON5=z)os}W`~EkrTe#CY%|axppD z7{j8a3>mEK+4Kt))03=rhlA0W2++eph&v+LPt9|g at H2Uuka{fgB&Rv9m+Z%!zKl9Q z0Y6~Is1wRs5&{ueWhG*1SO-+2^iepXSc*C0UGL{8@>t5j0$My3_J${3=fJ{EEY(=gQvn>GhK+zlgXW$H*yWQ8kt zHvO5;;aMzb!4KxKdsn^BF`XwYyNX^dy<9GQR-=1$v;|#hKK-1+U2z-b7gl5dlYhZM zpS~|l7G2aVxLz7)2AWB%(EY6(&HeffH+G+0I5;dpPws}AekC%1qTb)+2Nf)ZJ-SF> z7l|QLKo=!NykMeXVWC#)wVA5!Tx5soR%J`l3Avrq)HUQ38Pp5rsk{I~C|I8SpNs(W zU&Yk7ZEVZ1N`4C}HEIo39o=NxMby&~bJZ=U1F zH5v=1`-nk$K7%av4yQs9Pb5ZQJi#}U?%v=pm0l>B~B^LS1wet}Dph52>C0_q3VLm~g*O?meZB`2n~Gn~uc zl4u6|PXXfp5UtqSxtjiaRphA1*dhO|3VK;DDpBzDIoO5ZVoZYZ z!5!!J!E?qnSdkjP(Ha~MIh)P)JBU|(S#R2HtU0{%DS)_Uwio`($LuAuzOUaqY<_f? zl>PCjq>c=6z#C~TN!_$CGI%5|2d6ZwrS@}AK2ctH?KUcG^(Z5 at bG9BJfv68KRlAYe zcnzJjT>ErxuWJZlHiS{Q>jqLr5eRLlhBpVbiiu7fWEDalq?SS_&C_t>erVX&Mf4fk za*$|lrMsEB)$A>?AyQUKZH!5vqMb%}7DD0;-gD|PSl6jmM?u+(+z`C&fNy2|?!MYq z_rg*qUaVugU00nVe at D)HUs_2n$9HTEhV3ZaSu;N*lmsrq^1ff#s$N@;G}elqLP^sw zY#=JZLYg<(YZnC(n>ld2V1H54VtFBHtRn&4xj2a{!woo0jb$R`N_E*Dg&xBTJ^7;r zY0FFu(B~30lka>`!ZCM8_rUto8nr#Kg`=jB9_MW+Q+EOy`{emce*@{c%FDNF4=sq} zQKw*RWm<0SVbg2}nj7}Mwq=Adu`WcxieHOLqqt5mkRO>zwn7XzBU+2dx4aLU&x at pDO3 zniN$4BsfzVn?!(;3TM=8a9uMShujYr9i;fsX;dP*`I+(kfN-Teut8tqTp8ktY8si3 zM>r3A9)(e^0{jV`NvUIBoT&?@^$X+oTKp!a4p;tZJ7e*2JLYqKvrN0}`jE5tx*V*! zum at V%MRo}fE)1vG0vD_=RHGc-^FOxoB=e}fl7G=0_8$*A{2Q8;O`S#TTmb)=6#pka z!)(Kp%7#v?#Of{V(n$FzNT9#Z zqimKzYGjn0x$N*@&{OG(6O^=8 zL}!HY;9#g|Gx7~y{y1UYCrC^(F?(&QMrtz;J+2$Swo#!f^xg0n>v^HutG|OFL0>Gr z(|2`k`+PBC%8Pq<(lMZV^6Al9`6l*q=M$Bg0hu&eaUV;?$AyYTxrWk8xdzToxtbDW z{w;AyRQ|zb0U-tN5CF!r;gwiDS|ZnZb79zcy}rhhf1tQ6xnHhi1ZWi}glHyoW%GX`efnNT8hJ{HXIX!d%)7_r&kk7UlOtHJ1XB64ZeQe7%s z|LdG$GXWASuXhu9+n=!+;fup5lwKveBW#2CVJzk at 7VY>GIGi$PWS&W)8ShCXcr3ll z?9SI5|Ae~60M0ZjhSof$)$|97;Os3`rP$1A{EO^I`TL4IRF zK1v(>IyfZ)B63b9EwJ$q;Y00<+M>;t;!9NhPq1$geecH+3}lRGgujG8`F^_=BsnBenIzt8UzRB3qst2M+W z>|;X|cFZDtkj_hHwxRQo>su4REAC_KG*^Ve7$?`1o2S$+%Ey^9Y8BJbWzKdp;JTx< z3GH{!1>3bc`wP}n=%r)dO?nPI#obXl92z}g2^7Wm&DqyLewn!Jcgrxta2 z?z>HI>tC1yUU&sMX-e51AQccPA`_cA?#&%96K!C{pOkwVpm5YYmJH58ns^oq_X6c0K?(~kL(0cK`CMjN zUl7<9A$oBna2l*RMAs#QX}YkWL}NKnB<_mg8TP8I7C(}r48Erywag)H4)o9=i{V9N znk%A~`DY-gbNcY81sV|0sMLSbApbwn{;w^nHk3E6DVm>MIT0Ck1Aw+G6Tzs6bA60 z9&P=-uwPo4Eg4?qQysDbg?L3qSxjN6*24^a at s;Wc+8(pY1DT?ok_>ivOtvfff25)h z>B at F$4>aA`Uz|y01A0sM*Y3sf9h9MVWrv-;q5|6vIZ(Ud`X*+snSEtO?Jx#nK0o2XZifSi zIr|{#4?nszMt8Qihh}=Vx5sAi0nd(3C>$?Nk3bwB?HhA5gd7NtkBA&1+umVWdI0>? zdn7Po_r&Np>iV2I2-NWV-(8R_nZyTzjQG*PJ_Yi0yQosZM>Pq8_ST9~#O1s88d2;a z-VN#KBA6W6MzUe67#js8_{prGKPGsv2#SPiA{2QsmuQ1 at Y!m#+kB%Tm=mzk#oH+4! z(YbsO8+HZ at XA0jK?W?rr>t}j}UBDaOtO)>Y zT8ue+wy|m_RN7u&W-4g!%`dO)HeeMn^I)I$?4HF*6m~^u<{2M~fcWajMuGbj0O+ub z$Q%RR at P6RSd<$2RqrZe4?er=N(|~>vEIR(mUqQNB>OR05(5R;~8uuIQlT!dkf*w02(wDW#y^11g2x;!OX4sO(x7L6tK}CNjwRE`7FWa zDY!~oXJ5|g;Kr7418J-sXjntHuvR4263fR+o+f1IZ;&9J8-$F{Ne2b zUm+r`nHjEeM?35JnXN-4+ZZIJp<{?tm+)<-sSa{xF4wEk?UAN`c?Ky&YpxB+sb>=n zI&@s3hO8;0)hf8&zmpaoC09Hn-mBcg+{6dmT|PJcrFJqC{wV}RdWQ!UyPtbCAy^fX z{)p&Qk500>VZO?(6Yu04E*jJ$G?_&8>l9hT%7*pA0Y1m$IE at 0_QHjxy>2fj$0dIit ziUh1z(EsShe(mw$GBJEFFFev+*c#;`V%l+p$4v#5h*gZKNU%Zwm!91SdhVEFKOr@= zHBXZ6fE;47;&;o8BneVwBRQ|hSPYd_<0uJN{23Bv)8ljKRuM4WB=G}uXCeAxJMLp9 zPl0pd#+n|rc{J{DF7567RA6fp$Cw9un!S1QE zb}|_XsGYkmqcpF at 8{w-&MNc*Rg!~2;ti^8oi;6>EdMoc5Sy z%XT%AUWQoKpofZ=a};_BtbM|gm6*Z~b$P9Ra#EOT<2V_Y)BzK%g)H;VG)6TC!$fyn zBrXe8tKw47*()jj6q_VY;I*zh2amB`&oCD$KMfJV|XY&k2-_7i8|ZU`^L=tLN4seYoH`-LlqI} z^Z}%yni-hg2hNZzjooSYQk7;)rkcCTJt>>4$}l`1&9G6LWDTMUR(HSOMkoGAxTm<% z9hxz5xNOrBVO&%ELa!Zq5=+tjc+w4qLB;Ro$7CDB2>aQcT$73ssnqUbMZC}gE{11O z=G%-CH-9xBJfEu%piBN;CfhKBu~ka&qqF52N}rNl_RB)q8sCy;(FoPjf zbz)F?Poq20CSGOG{6hLlcZjwc5Jq0F!uXkciw~z>anQyN+_ChP?o~f)py&2)O}yns z*6!iZ_Kr_qUeSd^TuMTJ|Jo|w_%d>o>!tn<5FaqUYmfF*xmS2K59SUVZS-a!4LaHa zh4A&SpT4&#@$<8B=A at r;QwY6>AA}Ce4uu=*>$hh9RvmFW&_(lwFxluk*h8AkLFcCK z9V6Kbb!&u|77^k>V!V6FL8vf(M^O2U$2%l=RY3bA#t+3YC`auZ{73Cx;8kA_1fl$u zX-8V{QdwB5A`vvM+ at 8u?Eo7>_1DBsc2CVY9 at FY-GgH9%dI#mjwnW$PJNu5e2mLmOn z;;bi*a_#t9eYwPMUy(>1lTgx7$tsUsCyi3fjD|3_K|MRrK}|pGh(^<1aXdOC2e(?; z9^QXsRITg)MX&0BMX&Ba#!*!skaiB%-EVj45aXmx?;zi~%yrRN+`xR;=yZnreZOOg z$=WwPwK!ZIzJ!7m+(>F<*G0xWGYk25B6#(b at 1Z4il1L>=4IMWzxsS<1FvKvCt4k!Y z7~?WBsXT at tnPjMxkkqp2tFxWx1rbg`z%Wf+*ONEr^u$n6n_ij|F)uJE%LxQ{`LcXcf}CnXj at T($z*zbb!+&_a z#x5=_q{X?gk;-C0|YK7RB#=`PhUFT0U6duSYK^ryE4N3W7gI78QCPPUW%g%n9v>-_`V zIf%^HAf=WFCn0rjh-*u`Z3gG=kHRSoG$QL=dsx2Xn--j+Oo5Eh5e-U)mrx5k;Xl+D z)O&+t$eKQUH4hKmHQne at kFj#ISZCuNvWg0)(~lKbRQ!3uNu6{vmtB;Cc5=E|JLWaXgQ$qech#OdDcu8aQRg1B@==ZuzdF@#Gk!5k-{4}vbZSUhb?3xOGQ#P|_;+z(j zvzhbhZ2q~7X^||a%Mq5!?2jg#Z{rjTOX9p>r?;S;o_MKFrn|hW5G{z-Xcz*(@?Bd- zs>;RRzlY+8n{s=!QgY1?X7u$RFvTOBX~XzpXqjsT78z!%f0hEK$Cfi7ZZx5DNntc# z0q5Yspt^O(K}^5&fq;;8BwzmapVKcg#vE(M$8RTRKh04-)nBJy80X(n_F%tzNpI?c ztIoBAZ|h3?tc~pHs{M`l6^qi=ma0hd1wUt7Odz+jAcS at i#9kh- at V!&CICOzyS={#s z!F^-E at A?6q4_g;03WM#-`&%yZDd2fOVDgj?F8j~0j8O9==YO9zQ?$*irn%5~2h}n! zR&A9J1@>7I!q2N78U`tDA6DRknkG?@Sw+v65$M$8p at u^zB)NFDbpR_0(ve<;73vag%lxR`yiWpF?)o^lL%3pFCl5ym zN>{tsK(Hz?N0cTY#1dgNd-TQp0BXNs5tAbf20BCTddyG8HK*>7mmabV)wpT!sKJ(J z0Xn}0FtK&(3wreXI|A!&_?o8V`Y_7p8&ayW6Veka>&g<+7ktQog>SqoqKIZ3Y;12y zG$;Be6=E}1(6d(16H()>`&vO92!X6Ki4Isv=E`>I1DO0xCR6u`FqvWV=lqk|LG}us z4c&ux8DGMgKv<}6A=daY{eZ}u=W){(Y>DK?hK15u4I))RsouCel%=0wMVz6cN!ak^ zn!aE~n!j)S?+R~Y$-Nz=Uz24I+>ole5QJa<_G-g5gm8wr)1SF_6*aU?Rs^zL at Mfwv zMI||+tVLFcX2|uezl8b&0t3|U^Dr+0usLBX^R;x|e3_<^U%Xe881lhjkF5ZX&G*4Z zL^A-i8C$rSpL8=zMwxNknFy;EbV_uj5P$G5lmx#VU-^|JMJbeSp{y=NZ>0)$emae& z4Jw~TH^p7>!l(1*vR`aqTP}zlE?M$b8xm2Sl$wvJH-Nwn9yn+4K{{=&~>POpRB)|_6o1utC>iayJ;ZCX3+wTQH5vWG5&`;A!%6b8KqTOxxw`r{~P zzt@|AfEn3%^fZ9PZo@<=7RJE~zo7236kI>4KBEN*B#M0H*=bPGCGRmAJ$P*&+*gn9 zvnP%`lE#1!3+fW}A$ibbLUY`;-GTL3b|f`1dx=8}2LB`63eSm+Td_$(kx at Rok#8=G~!$h at W?NjTp=r(-j( zESYJ1u>IC!F5nkY+)!8d%ncq41cp%w-5vF>3RzRAti}(-#vwclK5tBZ%7zV#!ur2Bd*>iepD#PhG8lw*#ihlv&~1BzA*=dF%q2|9uu z@=}TlOog?fP zN8BL~$JfX~U`V6pVW!IX z7sB5fD5kridgM1O&@=D+N`8L3RJ2UyJjokwi$k~08{*c~oQ#B`?iCQJ;W7*zJ%0QX=EVJZWh9~1g6`KQ{c_%ZY+`-j;e z>RW=qt*&?t9l9$>wML5uaahy^J# zHH4$e{rXXt732ix3h*4SshQdJRtR at APC=J4ygvT9fj(8beth#rpx zrR1>1lXnbhnAKV_21aMi)HSa^ETE at uI4iX5vyH?IdbQ3;D8LF z5(DX4%y7EjW~;9`@g3xIKFI&Nrx1KGDRoA{Xay98AQiD+G_=S<%SD;Vv0*EKty#iuns zjcv}{flapmV}1G&vLT<|EM{aj&kY6-hWo5flK~CwX9;fd{on8!`T~Ung}m at Hps%>f-|prxbuJq1L~LmP7r^4Q~}2=%!{N|y8{0kbj~oYJGn zi~B&P6i at _`V#&9bCrQgx1A)>-id4{osnhrOUbpD@~km+tT1Zxe#PeGq!+J zPLUi2pqg~sYm}*nHMrd-fs%JKNjJ&np_i&`c}xDfw at 8S)i3=Hj$i>v-rR&DXZRSR2 zm`1Jt8E%1et|_(uiBzBsG0?|0^jjZ;nfwr*G|uA}NYbGJAg9U&$*t-P+%i?nTRuIq z`m2!UrXPVY=Y}DoXk3J8>*P&B7Ki7)Hg*Kh(w=8=?#Ui?hazIRz z6P#blqwJN(BqY-AX)Viw5T=XZw`-FPorl at pVXfGAi7Y?OgO4&+eZ}MQTt4?rVpAA2 zum6V6J!;iEZpzGSru5>9Ib1DNoF{#Yu1=`@L5gxNnM|Q0@)(1g`S9f07QI2<^se62 z-lY>qN3U*aOQ6X&D?mL`MZR`Nfj4SP2hs|4H>))zuCg`9>t>fOb<{F(rhmuufY4Us z5C4Bf&w03Nn=&vEkjsCou=)Q%&wmt17bi>FEeN2Dd at qnWAn9NM>(19EBN0eSH_SRp zs+3D9t5DiYE_GbMmM0h$-hnQHAfeNFW5sKbz!)2}x-^3X{e>o(&^Uo&2od}f)+VF07H^kJe|r4HyfYnSTaV3)F4?6a=0 zTp|l=oOhMNmKk97=Hqk1qoZ!z^2lZ4?rbZILi>3vj=g4e6MuKw3~75GMY at GzP+&IC zXHY93|A}6#E- at Ny&c}e}lbIMV`g6*Ml@*3 zK7^D4@}P=bU^NNO;hgOO=B^Le8cz_%-Lo4!&RD{Y5bkkcSbt)1hFmuDIr)CILAh-8 zBPF0X<*6-dF}$N*K44rAfa%x+qhIc&o at ER`$5cu@)t;p5`% zlCGys4tqIXlMwE8sqEFYMn0!I10ZthOK%Yw6PLqrMV_?=kV%Ap-Zw;e1>F9_9LEHc z;==1MNC7DST{Z6i8L0muCRM*sM;1r*`l-m at T-vhzW|cLk9?4kC;O=?v zaJ%keetr0@?*}m(h40I-4I0i_KI9!jve6;6cwZ(* zb+PTvxnDtP5)m;vK65s^WQtTHJXBJ)m at dJZD(`PRR>!Bs#J)ks0W zCErNP-%KNm^w(GTulfjQrr}3Q&eZ&j;c&DxIa3vmuXyp`}tDj9$ z)VHgcwkEBPqKemxoGYDau+iSE-zCQ{wat#Ln)IL17wosDs+oDjKmT^prX)u at QrjZc zm0l+tRc?_W)f^GUasS~pZYU^jWDakiQ*cC}lC%T538|otrqiujZP zW(udi!w`>;B5n1^T6n)*pw0D>FF(0hWs=2`LZY>du96b8F0ODz1!jGLITh-VE&7t9 z8Uc&v62nAwpW9QEyLLafySfliSLYd`gLJ=_d)|4Wc0lSasH>zq5;HJchYo}@rJ83{ z(=#;C%4a~Z83X0MFckit5mer8bGSSh=s27h6up5`zga8oo|8A>zBH8no)y$izHom_ zEAbwk-IIY;bX)Y+fe>m++fh*o-d$kTFX?v%Uxpo$^{Xa_f5t;Zt131=zb zAHQB%l8}L)QYR}W;i2cA49nBA4GWaHqO6j&U4f+TJka#hXQLyW`-ADHOW|Aky%`i< zts?pLv7#iLdY`u8ioJC62v&giT0n>Aq;dD0Q|5MPJf!8Z?Rm_XylIz*sLHGi+)Hki_ zj`!=B&$8k4&ti~0Z{vo1xQ=jA)5tQ=NTR~FR$RmKwZ at V-aRp8D6Y`_U+9S}uuyyN+ zc{S_F`*{6`5TC>qAq1xkhtBXjb|-W2HFYpwHpmri;1ikvjPW1<+jEpm7x at FMDWq1I zvzAq~mer$Her|ICqZWXE7Ufk#+Zxy|ae_ti!)>>;PwWSR;x{pmkXn|@F>x?QrW27( z^Dq|6LJo7f+uyFO)m51j(TF+A;dsA3SrjB7_8WpGmYc at +SFX6OelGnJ2hDKD@~i+t zHLEpJZRD_n)|$-Dvtz4GsW%Xrq;j&MJ2WkatOLL7W+lxSmi9=U~wPQ=Tn4vnh1LKFW1T;ReCg zwc0 at XS#1UjuTl&!OP?+RuklMx at zw}-CgZ}FM_y3LBzD-MW*tX%HhYB7?CR3NHMh|% zcA;#Y%xxUx3&n9%tUTw}O}}A%V2LUVdVQyoAS0)&(_?mh0y<<^gI!6qU4-+O;1>a| z_RN+z%#pAefKP{5oaW?ExWS1i=J31A<8}5j8$^HOB;7T1y#YQT+j4ola;;ftqefj} zYMKS7P>9n=pL)%*Ij~u1Rrg4xA(ZgT)-}M(Th|^18EwYNeeP1fe}b*w1kGf!4 zxtvSsf^?(GuUhT-AF3ksw6aj at zpP#FFZZJUzlJj*r+)~CQWRw6ff-S z4{47KR$hKIPPIB=UVNis>pvCD*E zIND|5D;nUHd6f_~M2g^44F(rK=+d#E1&`nC8 at H32f$(AAkz26c;(;}$TufxQmC}vP|9q?jjhk4!f88zmB;|RG3cn-|+ at O0s%4ncVjMT`|lR03IJ#G z|1|4T-H_W5K;+E|291V6(emsO(mnx})AA&SEEg3eDE@(pQXV&~8B#nPWv$%j#9!1S zpr3D9Tru-mR?*NL0W1_l3`Us?aGlOxYbe~}_w)MzR_N;t6`VAeFk*vHUaJqqp*nwH z2{YrIJi5&$>>$wjNyAhW;~hlUK$4XWXe86o+u7OL-!5r7QZVi$vzf5a$W{0r>659Y z^#*4+t*n{oA|1K+kxNjTO6 at R}9#0*Rb#yD19(HKOO}G0rSkisS+|+IfygHLg0fgg& zZvF{z#)OX5u#*E$wvY4NcZWf969@ z?Q_a&%jKeA`m$K8mlw)ea!I7nQ3pMsXEX9ZhOIt&}^bS0 at Jxz0MHnr)&Vdi&Qr}=;kwzY zj|2;$CGJSW8l4QC4R02}4}^zTG=Y#3_q`6SNl{ERx82C6O|S^+C&?HGLY=Q{c|L*9 zuq%|fnZ)A-5_B=PGJ?g?Et43W zZ7a1H5^y1-Ag*W-$|=vW3fZ?Sk{%h=)1jUhw_2GmTRyPY9Y|8hli4f{@HU5`NSs2f z37!Dp6&|Si1^x4oU}$i*arEzY^9B4bLjOO~yBMWD+XVqcp9>BLLs%DWb79I~#bhp2 z!C>l$5EYAl#=0fru6;EWMu9Irz+2>+@ zA+m^YgUz~w;y*|@eC6O$3DRUbGZiYqtxoZs+=XA1A^(+?5vZDYbL5i){TZ2-1W}T> z$mKz#ns9Ugq9~_wZm`j(i@*)Z!?Nqy8kQQS8w`u>hyE}t76pjoibb0ek2)^=+xVA) z#9<9?Jw50iyAMSPp~1gf1pJ(ZRAKi_Ffp6IJzN-H*D=$WiI<=^M(+Gz%tKu_&)_j# z>0H(nxuzWHPN<7<)%BlqdobR#A3e_>Gt+lim|1`BQQwa0laeSFKtlHT=lD7C_q~~S zkDIN!e)C?YIcX4U#I%zFr-K2G~<=MlkR;Yh at cM74j zK{AqU^m)wrX}0Jm;NyD(JCFzi!zj+deZ$@JxDVTmLAt9^Y46;! zhrBu;ry5&TR`XI8>jvT60aH@@t|%;MpHJ*8WbU8rS4G2HR7R)S^|+Ob8rcn1QE79#=DPEaxsv{fXHY4!x zmbcoig^tZo=xq88U&vKj3JpG*G95L0A>FA{ovhe^WW&>g5o|dFdM$G69n+Y&%-l9} zuvGSA4qF2%lG)qcMa_rKHXRlt!@9+?m14>wRSV1VpBlxc6r7txHf}T%w1}tRtP@#^ zve`8(JTs2KaOl?&Zykb at t~2-8F75F(8QsBEdkM0f!YHzwkv-lm(>o5MW;fNtON6I- zwaMll-Dg!BE6~A(3v^~`RH-*7VWFWcB&ka#8Ush)?>sh{%=}eiM0FqOI(R39EvSlc z8FNy+LNUg9=AK5<4U}kuIxfuse0RRy{Io3rJu_p}01?m|VpsrmSj%HXX>mplPBucV0>NH?% zT)r_oMGl%Hc6V(0Us}ta)NMvR$2UMO;=GmnT&mm^MSA6$DQVKS1TWR`R8&9mi^NEis&aCt0+%Mh9K*x2Ed at kDi?bvWv zIK`CkRlcliHhFI}RNQ4xBkE)Eg}%5fPs9zPw42nndFhrU=$rU#lF!a~6~1;`rA_iZ zTR?IW(vOo4naGK%GGCw;}i{A9B^%Bu+``I zd_c~ULINsBVKG+nBQlGW8e|#y1Ov#+_bIOj%aF*9C{4WC`2>Xrjh*+CUQl9i2wX}X zWn0BsLubS!VQ}AA{DM_1k;1-uS%;d;VPW-zmnk~qHakvRgSY#466CsqR2=PHoG@|O z^O;xQ`C5 at W)~W~dOc(P2p~LBU!sDvMD$oBY8JH93+g*Jk at xLbEJV_dTtVcSec&rmh>>?u!_$v4bpjT+(1l5U8s3u+V>U zzCQ}>adoMOo%eVT!F}UwjMu){i(U`&HeDxDak!Tw8}jM`$+*p(xpPg%;|%D at F#k9? z12R?V8P}O~xkD*&)G-s3Y)6DE+ at Yi{OE&q=u}v?GkN)=W<~GM?3fwH?M&@w z85Gr*Dt_B7$@>TYL)CriB%)2tJL_jvp4-yZ40}+kar-hRZ0u<^QZ;q&wbAV1{*+&b zIWfu47&2QyX+;lS7`G#Q;nBQP?i@%5j0RB3dSU1KbeH4yMbF5n>mJU-s)uI8_uuR&SnJIJP4)hxXi7;$a;E ztuH!7rPFSLbIo>&GKoe-BF1(} zIw%{h%g6__a3%DIa;1NgePZIO*W!6RE2yW>FIKo&S%J=mC0n7=V>*azb78{=) z`2C|4HW_skgXb at Ui~q~u`2U+19L!v-0gjS3HZINpLu(URfIW$fg{_r|@&9g1sPu11 zB%;rek$N{u-;Dd8d((4Md1f7 zJ5#+KmWQ{e58z$U4Z3Ar6&-5^)9vph at 3TZM$_ZRdPlUIZw9FcWYC`T_uM9-s zJHL=>zLMSykSba7JawGYZbBtllGUXaM!BU+xN at I5R*gA6AM6;C(S6!h4a?~6hV36K z-7utfRB-$WMagBc2bmh#?J4yNC_- at VgW*kJg3ma$`_ExlC_q$9w at i$4cvMvsogHuf z>%??;_s)s_os?hTKtLk@^2Es5*{Ya0+E~~EtpB&!saCm?`!@%W1^IVE0xE(Ru)s!9 zozHS at Y{{Uy0z+WgZ~2KL_{-_UD_h~6KDS#`mbvto0f^gzXgAl3l9XYAiMR}}lj|I( z8D3`Y9^da5s9nzHdWl^{aEGeWJC2ws7HC)~(rKPh9o-6KhsH{tmYMk9l%$&#Lmj$v zCJYxgBWzr;3w6PQHCGf&sif<<4g_4?LtB|P?|62a`?&nN`29?nOkwqfttTCU1zem; zZFOdBnWiC#$|mJS>Hu at p^O4RGxTwn5yKWa5hU4_n!^;iQFG zqv35}JT&)TY?pHl?Tiy76P41I?+!|7?jd{%S$3G5=MhG`h3qTM;q3>O0`S at Hk|Dac z*k|1~wFu~i|F#;g<4Ej5IogT1Pb>VuISRv3Ked8(gMf82FK$RG{vGZUTUH!sz at MLt zfDE3DCQj6D4(Sya9=z?t19>T21s}gWs#nM;KS#nAFK1Fd4PKr0&kPVCRBT1`7pAUY zKtO{3GED!E7~S}{lrYC-KD~&t3#hnQN1Bk1eSnxFCb)t?R5of+%y*}iy5Y*R#qqN2 z^+)^*l<$w+c=uh97mC3un<|Y6MAFgw>6goljE0d^zmJb6Tp&Gv)gUD6%vzIv5M(^0 zGM2VO#VCP+^W0g&Ca{$5&t|{=&e05!W?kSTU6)Bn8rL>s2!~lSK-?1;5w-4-;@*7x z#R)8p_|1!duTWgbk2IA=6O>rUMQ){fd-d5q|Gg)<73F{{>LVCaBP at ytLC9eb0f?&ND8A_jO}+$JL#=-kUsV5HG02enT$e~chB_ at hk*L5}Z#i0 at lb zs)`WTkaXwA46Zw69q0QX!W3W|9+e(%S4!S&QEFTuNI6A_0=|!|n}|`v at Vo~8VC!co zJ9tH@{u)MoY}H at wfUcNTFhYA zCM<0YYD~{++jB>_DQLHQ(U(J1vD~&JJZNYRx2lzY{=>Ge9=_(_<1YZc|0bL~|1tpo z9eB$B>l!adRZTB!H7s~T&_b%3N(`ghqgQxgLr(2ca>o#%X+$W?V;C~90Ypu12mM1S z at RsZ22huD%EW?nSB8>Cp$Lz7IL{f}lYV907eW_|Qr3ICtyk*&~TvH4v^-+REfWk41 zHt0 at cRhD5>@(#*!JC3QjE}d~(!d@!fySU_#ZxK2sFieTfRSi^@V24#^e`7|?veZk)n%T7IhBz4R_S7q0PDWSHrx3puKtOQ4@!BA%}LU08{36@ zmBSyx)$!>l=;L*TJk`b*V*SM;Jm+JS+=kQxF^R-?8HUc;Y%PvTYk0r0&dgP=N5l^? zw2o<_ZrVF at 9^6y)GP$(b4id7y!br%iLZ|bKcr$RN$zH)$ph>Bz(Of)yxA1 at w#-OQ& zS!D={3!p6E{>-Xu8k;|q)c~-Vu}m3D_s~pLCaqdy^g`>-I|~d0Cbg=8VDBOgBoT9` zA`KanWyn-%5`Ug{^P*{syN;=QJF!!BB9rePs>0a0zob`f+e>*e5pz07A`U#+4^C9^ zjg*7vwe(wg`j_B)^t|2xfRW{;HuJUFZv9UB88n+9PYZ86tk6p zf@|eGH=}sL<9S9~hd@!NfD_{rSRdwoNt~Q=D*Xb!Q;@pH`cZi|V;-lhp0d at 8r*Z^_ zveRw1L%JHF<>?m`c_Xq9A^1_mzeyivo;+ at KIs&HS*xMnIIx!t8rh8x5D%8gG%7;Zg z({nzJ(DvYkGkGrtZa);FyqvATS<75mYw7P?Ab*%o5TD zCmVt_qwFInZ(pbq1s`UjiGNS3+HtQRp|&$8m at puKsa0YpcfseTjnl{Tcp@(@4=9=t zd5~h?Py+Plpa#&7=rDr4#9lHI8E~kKM0?SG*dTRvHq3o#59K&?nTGs34q2Cl{Co=@ zyOEm*AxY(`=$f>@e|q4SJVhdGAWDl7sawx6pklOEerd>*C0$Y;$zP0BkzIX`#vyFSlB4u9k37SpsaxazMQpxF zQl|v%^rienn?YEPtIbpaNUKs? z946r?)3LqsFb_B>4TE$0?HEVI0xYsPV@A)GVs2i=+7oSqgj8 zVh){dxF0u0=o#_1-{V3UsRTY at sOuhkB<#!Q=DY36)lEH4Bx{uyrf z!n&5*F0#cacr0y7;GME at xAE5iInVQQ;{up20S`66S*14jbyX7=Zgze`w(gOiK7w-kBW^WQE&rwmPA8N~{3XS(juji^9;=pdpD9VHeR zHZs4>?+XWa`a at f*U44tdyQ3ifUVM}6E?_}n2~W4SEHhWPjA7!W7-g1a7U^cA6F%%Ui>y3ko5yN at ma;LYGOp2l+7JG8nb}_hun2C>m)>az*h~f$@ zxWEV~FN_ThCB>Dm{RL1RQLa+VD3WF$kgAYnq$wpd#&DhCrNLaHW_n}09jJLHFLeahv5FLy8 at ngfX@XfckzDq#7 z;CCroNtN;vIe9OGt&Y-bdU2&xp>|YEOt}l(=S%o{A?k(Q9}}9 zD5o?8%__?)F{zGvC)lV4_e;WOQDn%x1^JN2y5U=Y6qIQGbiCQj;5^x6X5Qle_RRs& z=tYJiswdhXl}sNPz&IuiCgcw46gdjPKr?cmM4W$R4AQB|XxCw%YA+d0J}(gzTu9EO z?NK?GjnO96wOjA3pzQc)?IpObbP3v!l?G_QH+Q6Sm!Ysh5o at WyEo~cXOoATHsA2SP z91|wQC94X1Y%f+uy6nm at N2g3-tx#<$<<#lJZrm(^E2_0Ft58TL!wT0mvu>Mn45SzU z&*Q=VVOW!Ob=)MPfeqGptk#4%4ZkVBkQV-w`6!TS9z;~P8QO2Q;3PAn at AEb}JuY~g zzWQ}|Lx@`$z~00az9KVlTp at TYXFM+cL7c{FyLi-f{?mrmcxM){x>-Tp>}2Tk04v#a z7pUDVbzLz|-a@#}EE%{tB&)r22wyxCnG)lhJ|(@_^11N at U18BUDE)4_P(dlLdO}i4 zfBT*=klf3ViWJX)GT;bItx+1qGFo1WjL!!`Y4ZPwI1h7D)2z?d6?dVpc+j9AV z$vJ4nT0AFl^6-ig2`l^v%TE!;9cq)qa2kOBxZyuj927fkMNFW7 at tK;voK&54j)u7m zp%$q5W`%l&pAJ}TLqkDkL5dei-e(Y_z%Qbac8y7- at 0B0Mm9OkGONqa(?2}~KGAb+oC-)|` z((@W+PH*V|mn_02Nn~>vcc;kqvsbss=T>$HiEuNDYl%?f6q&|dqfq;Bh!@{#VkGiV z?&rlBz9084k&pdPeXUWqT|T^4#vrIjW|g>wmUrmvnbv3R;yW#sw|_WtWsP9+;lls{ zIpP8VG5 at Oz=s#qMnic{$N0`3gu5JdJNQtcx*aUs?BK0Ji`A}4d$;1&P!Gr#*@oKoP zuXI$-Z=Ai at pS6 z>kkGQa?!+kmjgvr$Izeb5uy^?@Wpxzi!4Xf~64bfO&a^uq&9vR|bmz{@v2VKn*g;vai`cS@ z8gUyu=%CV5x#I<^v87F%M~3FHDJdV(Cek7zEUCGA>yzUxC$MYCh}ItHr{l$Am7yg{ zLqTyFoTQWny9!?CiDX8b|Z&&Xc z?AobCslo48Fz}P1wL at AAhGdfLlQF;g#F{AzM&M}Yt4EM^x;m>TiB4W~<=QV^ z4fo3N(kx)*n=$659JLM4SXzD6z_zmP{@UxSrlF65d+B1)us>!;(_jf>iur6Ofd$JbUAY- zP>f;FTHDDQT?V!~WQufC(1Jlb^lZ`%?^&CueC+(I=uxCJLA1#@s5VyV6p?`ry3$hl z2y8*V($U8=kH>WSG1&iwMStd+$^wUY at Bb%qzZAnwrIZw5;4a_s0M zSj{W4D|OrxT1FuzZ(06ZnyZXZ->4nRrt{(FTVnmYeY#pYQRkAp+s2u7MPy2(K at A#M zOc=BCQ30_kBt#rhr%+KkJzNuA)nloRJc3iOn1pYKt_iEzp(!${#)WC8$7+!LYB7Vy zrvmr++0P835Jsj-%#$K5E`;0Gk31){`*$hcqRvUbaf0H6hy}Tmh;Fdoet>;NX4FoW zr5_U1t8P?L%IVWOy@|r- at CtXRsm;U^6-rROqb^RT*mkNMlN#m7EdTnIt<3mpTCJ+s zec(xiT0s9&a>Z5}Eg=#2FdOKg1r-r;)`n??N!8J0pde48rlzV&89u$ZW=zd$mT~L| zUP;DMhK98`sR`0{8TG56LD{r zvmshX4ycAmq^&yzGE)u9yT-)A+Cb4MDPvKr*1us#tqC_+%#wIW(P&-QJm#q zM^o<60!`cTv}dFPkj%s^y|g44+;JmlfknYN83BCEJZizTPh_loIy~|tsK2`){Ce?K zKgNRi59skeQ2mte+z`G3{5)?3HwkGvMMph)6duvuPO^jRu%_r at RX(Do6G??9s0NzH zht|m^R7}UE(HlCuo!@=7%S9vQRLSJbh$^fc5)-O*TXf!5Nwsv at k9gf<9&M?5W1}bow$QbI;n`?NYTQtk|Z~-{tcV&}Hmxn3Fs;N-0Bp#9HO$ zN!&6$8w7n+)(EaPM_jXI4c}Ry>pA_ at Xmb@>pTD77|_ z7=9R{vJ^Ap<$r6{cNp#~?G!xOdNrNS=$(I%u0yd|9e#D?v>OrH9K~r%I?$!D{yhMO;3oGL zN7!;dNY>MHh=C)Xpv(krR=A^2Wk%;$PV9_gXl}g1;nt7Dm+Vl|2ZD7lXSqIBxcT|$m at Hj=LtZM|NHv%g zlWaM*vT*;LFrA1hHvz4jN?Jfq+b6+2%E~ix9P*%x#E!n=k19PT?9T`U2)a!{S66K6ZdLxF}^mCP_xm5zDH^moo{U3g713Vy-+PRx?Kf5r(iY;eaZi+E8Vc3Gb#_!wd4+3wg< z=P;gyo)gx)DHH at Yw30qKt`iPul%swoQ+7#qYsLjBWJMyle@^0+)06^ z0%3W+%Nm__hQhE^-r+O6Udzz$x#P4X?v$0FB=;kkgOsFW7vjS4`?)0Vj+bo;I&wD+ z^H!s)2(e?q--VBmslWelS)OO}mC9J9+#6=c?q%UlO8%Bb>WL-<;t>fJ8@>LSyssGg zZKN at Br)@7&LE7JzED`CvZ#=5Tkfbkh_mEz at O*`QC1LWKk^Gk)ohaTJJ1a|Gt at NTwP z-lkD at ycciMvUKG9g{IDs+R6yE(2z(cDndz;`-k=+f9yOj4b6mS?5|+WBFBE=t^3o3 z#rq7&1U+jQN5?Nc%_SjBFQ2onRA*o>eDP|{6b-%_kqm`>9;!N?EF}7bqlr?5{bkJL z)|53Dornz%L;gI`2-E|qWEfI4r3louWcM7JZzpI{+q6GC9Y`$=95K{)KVn}z0Q%LV zf&0#Fekhg0we6?virG6~kW^G5=y8Tqs41fC_7*5#P$tH7>Qd>JsePq1c|{6s)e3|s zZu`QRlC7IcWn~fD_N!<+#$KsO`_!c+Yxk1VN7=_Z(<~jdliCYw)x65C)tXJ(Zl;&_ z>GC)AYhd%2kXMky)P+N~Cg2?%VBAQ4DEJdXRj_%v>C+}#&%CYb-TbldFLe7E at 0@?x z`q*dEzT(spmuar!Q>H2+zjBQkHHmMB&P)}t at 0QNYWDg2oH~W28`i)jv)~+}HRL#ft zKW at U2-*7vVL4km9{&H at n|0~}XwzIJZI0BsQ9RFRqW?^gg9}4PJZS_qRl#y=$T>v7N z#1EKiuyv(lwRx$gahY~9s3sL^y8Q&jy?&d4^Nio$Q zK8Z5vW1!j^GII4Zd|uyAN7;vYe%~K3y>Kj~uzTIX2#RQReEvVIVTnRzp|oEl`ax7) zbX5nNgK at nl>GN(UN{L)Wy~zYBvfd#k4Pz~!FzES><1*$QS#&AE?gRY;B9|G`7wT1h zoDio(E?EL1Si)?U=F__iwVF+_HmuyhAfLftQ)C8Q)AueJx{Aqmzo8`1ScRQZL1l^x zbIe>p2c?hkJmgYXg}2PFR#Ym-Ex9Dc#!Yjw8672Ox*4unShah-GlZ0}O4epoLu{XA zgTQswFXX~LWv$};W5fc)cT6sC^KI<+R8rS7S}}0r*{2GTx)zgyIQ3P{#Dv$Xcu59A z^dwDV9LL;ed6iidkr9a(R4Q5E9%q)0GEEsSYJV|RZlf at 4M5ruZCUr{u&4bVJR`Mf5 zSK1PUWF6U^NAw*K~9u z|7;jKkCbLZ1AjPbiKLFgVT2xDfI at CkCtI@9mML|`jw%C~u3U+UsYouMLbW=yn~pn@ zr{Oiiif^d9v1k+jqMct;hq7B^kO|{#oV$GL{*VI%D6E;EwdZAjku_v(vqctrpuXWY z?AxO!&p4L^Z6(boUKzU7v6mEo at 7-(zZ);7dP+ceF``i>tpf;E+EqP)6KDy{)oOy6T ziNk-)yjz9opkBB7i7}F}F at BCb(sXH_tGssYAAVOTKFsM&w-1Ag^9`VlNHnDa!lba#{a`2lJXbf0d6Pt0sMASUG#H#BmInN7HzU*OT2Tm&RLU! zQFDd0rsWpP6AM4Uv8#L;-zFX2E^@Zps>N!tk7+pr9euJv-94n?Fc>+f-R}IbwvBe$ zs!TqWHVW6XRN=b#L?nMQ4%l}Pax}Xa<4-Im{K5fOmu%Q6stdRe#&L|m^KZqIM*wIN zN0g!`o>Sfk;k-LMvNOM=n=ID5InMMKJYkksY&UxNXXFcW;*foAjajePEz^FhP^y_j zK<;oCt2+q#R+`bqiOR~RGXp!)?c^-(pR$`ze`}`;$0zhbr&s>?@I8v#Y!Y39E6?nw zN8mW7xykkirkZ)(yo+}YE3Vm0n8ss?i9(4anxHCqzzd2J-3(_gF{WwjavuR0ERy4B z#{-guGqc1Gkd;h?##l_0MBUOGqPRT>tk-sw6ak%Q&bJ47VH0;`C>n)wJ6E7$;Cz%R z`uH`_wsuML9D#D6aH}p<^DbPVEh0=C5ByVcd~>q2Pt1rH#cMm*kKnmY7}zSOcAih) zAZHZr=_L{q7-J$qF%cBVHi<5`EP`v$R zyxK$Gn7K9)bvaM;z^v`Bswfr=I=wL$Ixnv7iE_HJMymw)HuI?ah4`T*^?Hnl2Q4Bm zZ=F6~EC at -n6kq&H!>fOk4u(^9`w?yn2eTT>VEQnRbKBya zrWx?_>~4T!>r4v6;b2@~vS6jjl_Z_U6|9 at zV2fjY5n-2dRrWn`5JVhjAbzS^^5Wi> z%^+tSMH!C4nvB=3z&KxqX at w=+o?%&uB8n0*e4)yRDTUaCI%2`(B9^b&xL{HVpHFUK z6hGzQkq5NKXVf$p;KsfLGh6S(rXJ zuemA+WdNRc(3x8^I`AD(-`InGHrWRQf9f_vH%dZ21|+`*N7r_KLq8?9&_+soI6$CA zPJ07Q)Iw2fj8S90W(U{n4LoeVEjs0#SudA#u;zF;=k^>~3*}1=F4K>JtJS5>s63n+ z`T%r6y8j`b&^uhV^!^)i5 at CUWSpTIX9wCeWJmkqyvr@)Z#qec=(nLxP6c`Gmu(1e< zk9V}Nf%>H*B}!)#P@;5Uf*cDtGaayIGx*%szqR at V`J6}KGAdlc9GUq7`Hp_e-l_#1 zb!MCXAC$dglqTJlEu5}orES|*rOis)wrxD=CvDp{D~(FquC(pU`<~OMzwUm=H}2^h zKVs~N5kKO`nhSfcHRn{;*<082UCv#O^JA^Q-y3)@R~1)BJ(dWs-AH{1Z^JVe(9~xR zfL`_6NN#A8qiHXP?s9}V2tm`PVkHvwNie7p;WhYFwhc{Xy at qFUU;ua_}yS`2El($D3UP5aRnV(O1XYb&$tBA}fYs*gya4%fo zf2Z}hGdWgxitQ(~K-1s!+qU8e=Q*FGP+hk5y`H!yP83QURHsTj5ZYOQ&AFVbwa}8g zqZGX*14snrenj*RyLP6*L-G9HDW{k?bF1B?+Mc%^F-XAKQxx*>2vOfSSmxm^@ZoD@ zxhSqL*ABhk+#oP#U4=4kl#{%}B2>$^v^bi at vnIDiqdt(gUtJ9W3< zG at A#jv%%o}pwu;&c;PrdJ#f82&=sX?J>?EsKH{BTjIgCN6ynm{tYS(ow5fsq;ko+( zi*FJ(y*CYfj}^0V+-8Hn9VyP##Or at zvF!`r)MI>`!2h)!Ms?=bHTejV_#+6zuUC8z zlPY3175XFcdd&hoo%!SO8_!gEKvLTYTtl(nz&i_kZEx(%5 zPvXrjGH0q=bVT7EXPB3c at n#uL1*=bN&>>wq>>17tl5mfo?$%+`{7P4ALTMek5UWTo zgqh639rD)3ZimKpx25a&d0gTTRiVZpHyJmEc;uaO^za?CI3WSc1*y01A9g}+`Jz at 1 z)XU$pUbMki8ZwvP{Y_EEPz_z%A*52M0qo-DmYmT-h=($lWl|~h?dZhn$Mvdft)~yw zuNDUp8AfBI`l##@aF+84&)E5dzSKY69r}xx`GRqLPY1(`Za21euo&Z^?0DrnyJthz zGwD2K9K|~}YufSStSXP+L9-L`A~{z)q1bQn;;*BWUFKa~z|D`L_&TPzE2bALfQ#z0 zu3EnOL=W*9pV&S-OO1aeqBDo2kB0=j6Gf_H+l1i)SD4T7vshO4x#KqRE25P2us}@9iRof2?+U z+aD~g*B1HBF+NI0N9S-aGTd?^T#|@-rve(38X2X=(J?!!DIhw4PK2mjO@)7G2SMT% zzQ at K@)9`qz9Q`2YCj- at kSbJW4F{e8HZ!Nu=%J)r<*ZU)@V4+d0ik7Mc?4lQGv2t_v z_E|*>V;1$Ql>K6><|1lGt&~c1rHm4^hi9L5n`1nR!mVWM0S?ii{OxSZ>Xu~N662;n zd)b3VKjKML>?dci2|}G|Z!7SY|438&{i+krk5H2_VQlJVOk&?E!C-^>s;I(N2}nJ5 zNTwIL&c3;XVlZf*EU}(ipMjB_DFSPsiH{M}XDXsuJ7~*Idt{7$*!z at e( zk$$>Eh>au%IAp-{B?JK#xk%!fodu9*x}F5 at 0e(b4_-^imjWya;je9`S8}$A~6}Ryq zqsPo|Aa`b?RR##GeT^nwdK8QJbK*}r`xPnxhIPd?M&KorXjb$wD_2+BbiGG37GUWU zte22*5b)zZk-$L{N{V$$+e5Z3743=~KYCc4b5}F6hBuC+9mJmcix<^x)Tznv<&+AT z-YbMxnmi)ge8GO~k?qhWpRkNn&Ceyq!DF5|tUSl3tMP(nP140y`8YK859R5$ z`RN}_Sbh5fl!o$W$M88ZT at _&tbZf>#MeGZyJMDR=B3x*@(q`bjE3bsKgA1x{Th`{d zU{VE&`*7niWEKMyl6!{*@i#n^j$@A71b#X&gmI|H3wT?EfE__N2-}zlL6L5DiUiyG z*Zt-_>F0&;OQb zR43{FLkI(~4f^|N$*8- at wg`rXx&(6zfoX5Sv~^XN=|e&9I0lFD z9rTlGKi%}FL4;;Rro-X+MAtO8^Aw$cpWoZ}yhsVlB1K7KOtFJa8PbS^+e=zyHF1T! z1i at rtKPtHs0%lRT&QkdLj74O48CT0l%nv=8m0FMSy!6G6#lvCh)?%+GO5;oI6Q-iv z$EnRI%3E#$^BJI=@(Oz}FEFq9!)yKYM0flYN0_qJJe>^-VA1*NSi9_wK9+d+rT85y z0pBp3!JS&Vz77|PWuZ8u!P=?SKCup2%R at t8AG`*4qrAkQah6 zG&pw3`4(|q#JrIz8>&@TDkgrfdwF0P9$Wi*D#C%zSkSXZc_$#v at T~SFx&esTHmh!{ zgZ=ZhhV8yYF}#RL_btc=5EF5*7Dqy_OuQAbn`6}mD;tjc^~>y}WU+O9FI@%G!xlwJ z4Hm)D1jQrI5b+F$z({03)wE${IZoLO?hW4CS;qz-tbsn@*48k0=`0G9Gb_*WulGSK_Z_;2_GOL&YqOu1`J}Z+N7#8DW{yD16N=n%; zJ~fSv{qxtld;LWWuf|Oc!(GiSOTw?enQBDyzy`x#rdsiDbzA;ss>-HLmWDQ#UZy7E z_D;6{+4Q3MPaUG~>mW*6>srlL+O%p|bjnuI zB;w(%1Er{%=wx{0MA~Zpd_5U?Q^~Phpw97cqLBvSeDOomCYlKVhXL00nm83+y|V4V zA59 at gyzn(6xu)UY4?TzCjjqKzS{#Sr#}B06RI*?uk(Ly_7kN#|qNw=wIicou&mFQZ zhI2JT3=0y|g<>oP=CciuUVs<8zMfUzjCC@|Dj~zcV9RJcBv;ZGML{+h@&Ne#iC=s) zu%{s-%)Rr9!t6^^z+drBI#D4e+#r8mePFvlY7J5y(9|!cr#|l%Y=%g8MFcW&IGzv3 zLY7Bq&`h`w+oXxwQhK%7N9spct${+6g=*76`dl(bIk~$$Ya$srMuBI^QL1f`2iIP| zcW|Ddmqj=tc{sT`u}`aR?=b9~@yoJAX@;&Oy96W}s?~mxJiIVALp9u=CulJ%jk7%A zSLrKt9@{vi^lmEJqsriM#_v5b7&4pC8OCgyDDLvW#q8ra{rcNxV6EcU!wobDh$6|q z8)5zbE6FCctQGOivHdWv<_xCWylzG%q at 4{WNzGH-E33dLAJBybcq{cJ$e{PmOg>89FB} zLN$AS+_e97<+*kAv2`_k-T9^G3*Jl6g)NSz53^T^+_YShw!^;r#VdUxH%H%!1kHOl`Rp(Rp)R$VVW^%x-%a z%k~)*Q{c}YI)fkDU at YkhAlKoHn?VnLPYI%0_R9(>72O7l`L-m7g^-y7(d5n&vOZ9D zc=W0GUbv5nD*V3GdC8`hyXXiF!aK^$YHpNvWln&NkH^o;z~cDXLgC8b>tri1KgSUA zrq6^UJ8jCWR9QS|!i7U5R^_*(Rz#pnhs6mhwMbq$Y(MFti+F3Kr$}Gj6>x1w(^p)f z=zhXwZ*)-8DzB#MgyOm4JSiyq0zbJ8?RZ>1f%75QY?w<&Rsrkf=V#Rp at x{yst>rM^ zX$P&rf;eJ%p>hBEuA4vy4N9XYQ|5xQF%JUMB9Cyz)Wt3%ZQRK?ysstQ6>FyUsk&T^ z6Sw$*31nX#dJQ#MN^M+~_sUw*%X{K2wGd zpa$&(Mu3s&XOWw(qSyAEx)An)Nmqwd$~P-KqAxr~_*oijBv0yfh)q1Ww4kz^aWQ5Q zd4uz7CLEmJAuW=NQn3Z5B`A1PktF)8h9xgHiuAv|FwwFpCyEL7pl2_?tzWjg)8E)L zxC@>YDP&KzGURTMI~>ts#i*t)CrLJEq%&9B!PcUFf4?|HL4u$-X*F;V2ES)4zY%2a3T0-DO{Aq+8BrGQbYkiUB$ zMax!0%jGxJxT%GdG`tis>yT}E`{ro!tB9q32M9~e(1m*gM%|<%1Opk!_DlnO*a;X; zsc)M(XuT5Q%Y7QWeeYTpSjl~&?DG}UhPo at d{9giDn zscy=qOUS91SF%`P?dU6Mt$X&rl<2BUk@?fvU_+N`Y8aGC$(5&Au8Y2s%jVMk=xe1@ zLPjN9Bn$m}|IiAFybNwn=FH%^Qrrrf4d?teW%Wq?wt8#BK=wVS^|j#yuY1**N6q1~ zR90CI(>Cxqc0Ylx$BJunyN4SOe z(@?gbw?F&vmnB7|xnqY^`*t5XdDj!`=AW2DpAO%(y%m~ueNGQM8Pp zwPzZ#Is`*KjIk{l_SRX9)#?T%ui%vZ5PrQZCT~2>+Sw at 9a(t#eE?! z#kk>%l7yx$V$(BS6IGbAO%qi(iInxqhHi>~+{7<= zpc13{$i&ow%H?r~Ylk~vK?Fwfu*@Up3`(+zX!B%4Y*Nf}e=SJ?)xjotEz(@W=W-KXB#V)W{`6#PmoE}srWNT_K#P44d85| zONMxk4Mv%Q--M%}WA%jwyCwf*>kTZNQ6Xe*S_AoZ{d8~iNxYCV_kIbw)HxH>n=8(9 zWBMbw!ZHN0SP$s?O#l%KhR;XdMWFcnOue0GGMl~tgAVItU?KtQOD5aeXMHQ)T?p9eDlD40BS#yb;bzBlgX>O z6q*Qa0hZIwg at tK35O}_ at O{*1SckHi3o=UGAS09FEBM}Dajh5BLj3v|MkGpnM|W?x$yhZAm#M< z at j#YDeL+j7yd=ceQu%rBAjTsT*D+XOaOA*;>*SA;vH3fsjRVT5ZId9Ro^ak;%&&H` zdK}XUoEu_wBX%zZAf+0rQ)gz`Y$;Mlh!^SBt~8lxC8Ow$l+S|DdFiK73Z2n9S9P#^ z2l1OU(Eu$`_E>X$Si^@gZOWpjjeDur#&m{jV}pP1^=d73*`#ZQatnbOuhPPLP(w zu61Szm#A8jnw}vEW6d at hBlP4lA3rUdnzb=>4|3 at 3!>{ix>SpL0d(hH1LiU?J?E>ci zex3T8nU{K}vu7Stcppx at eBJqez1W-o_&6Jg1~IykK9$kKXlZZutV54+Moce4>?Fcn>&;xExE9Q^*ygZLAIi9c22IM=6 zU2VyCrm2Rr|F+fARcj-8ggbzW%B(1eah_K~@TKdCdb~0$yJB at 2S99^!nPut1xs1(s zB`aLF${2azUQ{Y&+p0VRRIfCpTNnpRk>Y1^L|ev;SY&YAr!|xzt^3Xa&zgS7Ts5UW zR~|ut4p=E!Epsc}sB~7e-nob?+hk~q56dQWl}IeAdh?1X7mdo{@5A@~ARQViSItH= zom1YBr3z743l>k1FP*_Y+0=z!W2M2yCET7nN8we?%lDGVd{m zvDLUle_1S|QVc07L%jTM1GHB at Flet6B}E5lXZ7$%F;b)>JNg)wm$u)bn8&G93h-M` z^IoCCH%p1MqN@&Cd6FSIc${Ks&eN-;5pSrG6dT-n4rb at Xd81W!dq`TVNYX>`wgkg zWliZQvR8jUFYl6$Krm&K8&i|y!feo!GuBAY#qwPxD?nHsB^N_^jkGMR&7-90>iJEm z0u5=W%W?f(U^0|>iqFJ}oc%n3IXYSs9&m;OY$)*-s#B`oZ*(IS82G0)SBM>opnf#RG~btibCfUVhqoRxgff$ z4rOGsjK%Mj09zD-R7d(u3Y*g*8kCL3X at AglyJ_K>ke;EXTiEkJ5yQI zorN>u_3QI!nGQ$hm4Q8Oa8yI!rLUAyS-t4pWaTtipV(OBCPN#%hg}4!l9Kae+n-g=i#iM~^`m&m>FsSe+R&!WRbWZ-U zcbT3b{Q!x-RI>m7*; zvM13{mAw-okZY8f*AbpSpFJnZu(84?C#$a=%J;;)1v{<0mclL}yi3#KE5W$;mW^tl z&#~zp&)Z}x1fDw`Nr-9nq5xW>p8YDQXf$o&V;7EnN#s{#Wa|BEnD$)k+aBc)#dHed z*dU|@{i#uJh~Y80sLr`1M<2bv^9Ztb}v-xg{XHjcu;NdA83PsFE`QdgXGef1 at a6%a(-j}{`K(@z1r zBQ|SOO4p;2GJ_h(0|8FV2G#HRE=S;xnjncT+BkM_1Uvw>;+Y>(-+~7A+ zZ^~f`Em`@MxYKe!njnsNc3!9@!(~u%I_Pj3neCl=EP zh(4fvTrlmia^w(en5WqBwLfBIlD^Buv^DG1+G)bK`#b(JTFLOoVpjNafPY6OzRsEZ zgW6PyI>#>9bdTLn$wDGIhqEtF9ERSYybsZ at +TR>!j{gp8>X0cp;G&Q8!X=`v5qbH& z8;oN#b!ao-kv(59jV`rE811^@J(G8gR2b56*JCgj-yG_FV@(vevLsypkh#Ji8N+_1 z92rub$I1vDn#XF>!kVe9G>cnKMPS4m2TMqUBKfDDwO^u5ERC2pl4Q;Z3{f2Z=5I{Z zV8K~}o8TZIh%g`^6#w2R|26p+qiU;;s*dD$X*QP7X0Q+!l%u4w&=pR6ubOv59-4qL zn1K|fdX`Xia#4Ak`j{3b8 zEltjV%B>T0=?EhfrkZAp2P)O8c#C;0f2JW&q)Q^fGHj~Z+&1~`KLSqUYgXBGN~z-{ zOT5xBzy&}>r5o&U?K-8Xj-a6EQ`J*$(YUo-ZI@8tjefNIE!)^WUq;~ zn~T(K&Pr)I!!3E6D7S2 at +~?hxcf>Jw8Pt at mlgum1ui7V_IOd9l<6$sT8%P1dUYCf zrvT~e+y))Kzqxf&m%pSYNW|hIKCJ}8gJFibFkumq;FYYFJd3)-)g~? zm;3Q>n7@*JwHVkoaJr2XAo6TjsMcw!38vf~4*7+|zL|MPtl#jo=5eKXfX{u!eeE>+ zspu5UKp2m^YKVGwf8-GP$t+xtr2rzxLvReUG;^HV`|Z9=KEV|nR%H(LWa5YD>*7ktS*V`8GRrt32xvZr|s3TGJ_LK*p8Xu7>6riMNbG2$E72`S!=I zd^IxpHEtL%5X=Ia#WS8te5>ku8M#Eoa)!UpersC<=Ryb3yES4+j3tN;uuJEIJ;8>W>Jn4ws|{z?_jknFwM7)z%|*Cg zl_tJmCkn0veJB+Ij73j>gao}||02#An-C$m<+7wg9Q%NVIdD_}jM)LCCT4B()N8cy zy&Ftk7AF&v2Za6CKLI at -IK~q@=)>H+-;YdZzBpImK(8x1CX9NNh8HnYYyB1+ELN?p+%}q&kYm!Wd~iF zl0S|jV)8?BfNSGTJcqVSGmBj9Wx}&^1ogCX(@Qg~0wroX6bdZ)No+T6)uxMrG3CJ& zTiWDh{2Z-{>mVkVRP)dNcwZ`7x?OpeKPU*j)qyy80Cnu7EZrRzDZ`u47^fU{wfin9 z&KvIanMu`dlA?2c8apX2c!L=;`Y3g$l1r`)OTAFTObSjN?BCdFajMX%>MqMQO!pLk zvxM}At1*fOy2zAEI~A(6_!9BeHC- at G*2yjDQ#z$Uk>X#0ucMBt znc$Z~i50LS2z>JnVzy%b}X+?reBN%;@gy6NY*sgcvGxRvN;;0HE+z zk_Kt{wTm`P at E`i0 at FQQglEKt;IB2DhLS}BZQUl-L&5u}UE}7vew9-qvtF6|NL-PIY zYu7ZCPxILg69yHf*|dR6Zy&Wr1RAEDL`z*amFunGaw22NkykyX at w6vXVE(5qpJkR= z`4SB=dh-SnVOazLR0wer`%2>Be!9mcM at 3<6*3g2)Yl(QP5HdhJk~q9|QKqpTp%>Xm z5HEg8uK+MchX4<`+dn=?5=8ps8R88I2G|8k%jxf6Eup^fgAhHW_vN6+rud4bh%OtA z+(PcYTqow7LMm$^iTe3|63 at oqQK}*I?4sd|65$uo zNL5kSZn4l((Q$q*oiv`T;yTUK`}d2L8`!T$$u3~#5j0$3cU-a?hLHuH8ipBV&XUx~ z6DkLPYq{)?L~wlmE0+X9{jX5T`Y%+fto{dU20T2>0F4YN?5G*E40Kzb5E3c0YMV+R z-!n%#TYkAzEIX^gN$xS?v#_QTB-oEA)7O&5s^=j zXeCu{O7k83#7owg0@&GxS*o+Msowt0Dt+-rafB4m!9P!M+m>r)p|#HZG_g>_c)q~% z#0rmKrOfkLQRIy z%(F0ZNfyG~Qo70hA`ai4Q%xcDRhCRxB6u9*FeQGVX%$Iefh};(#B9G;Eyo0Dl560E z^q*$>S>1x(Jm z7p%^#wtTKGKH?166=nC}!CC^E+uz6u zy{wrd|H2L-)W4&b{wH?CEp1#(olH&s8=sTzKbZsO={xJ_3X=D}MTVoVD`^P%%y3`{ zGg;0NA@>K{&$FbE&+Bd=7JiLk=92w*27muK%-gvxYze*?Hnq|2e93QqnVtRld3T2y zz~05i3?N6HR#Xug6I>M>>V*x~bJn5UFj=AEkbgF}lgKB%@I_X`rLQ$^<*%g=l`|W0 zzMw!1={|}gEgcg1NsrHB(%Mbh$F%97Q;+MK(J!zgCzYc!VD0ER>MK#LY|g>w1_l^w z1;Rrf5EDREUUu|vr|>~T*s1}LTKTBOXjM9b`a^eUg0b5PmBSKd{hQ&iaIW?Ug)p2Xmu-Pl_YYd2_xoBO~-(@(h7#8VueInb6 zNRH-J5;|?)bnimG|D^XN3cy^i at CAQU>3xdF<-vD6hWNf{68qLgdOV?Ba~8_y!k4Nv zJru8Rv*ogkADF$fCmN_Jzl_ z=g#Bb>{KD_#D1EsJf?`{0T0;1s9c{QqjBe!esH&JLNNf<^eQ at rnu{u)o$lpgNh2CB zbUmkLRQC(;jRmEMp#aS@&9la#uO((}M}Ortb!{J9D-yT5z`f at rBDXonC7ute<9}5Qa=ijJZ zN?Gv6G9f at fR^k3#qvZdz>whW_{g-vCZ7budqJ7$>m`G_9%>JOYLR)A(%bwem#VWTL*vj)tJQ at AAV0zG_CdV5|3a?XD9)_NM3voGrqT5VkLqp1che9{ zZyq5PRep3h4^1v{y%KQ9l_h)FIipTLu%oI@?rq)yPBIc_k=7ZQVc2A?0)OMh3Id=l z{Wiw5L@>7R#hQ`Hcwy|<7^h7!YQnjl5q6 at S{aYVFcHh)@dSL?~w}sY`GW(66wxG-+ z+JAWlo~F+N#KPh*$E(#z(C~l-akTf=_y{CQ&V{Y2*cf6v<-WNn`~-Qr^%S|*m|6uh))@}jHGl2!->TW&0%76#Z=>c z`-SUtJ}*D>o4F6SLJl5D at qF%sQMDbDY-_im$8uoaje5rX$ul%}I1SdIn0Oi) zumQS53v at PGgB(M)H~2Znl!B2xQZew9at^uQ!G-OxT?|kT!K>RdPm~2=;mmy8P at P*~ zyepu*SiP at OKcyu0F?+uRi%8PPj^bLuBUjr+?q%{ypOwjg&dJ)a$?&MjgI%dq#NA>_ z*7*sB`5}wK7R^W)r?zvmyhPVh61nPt8 at 1f;%t$8(b8a#h!y>7}{1WeL_}Rt%th?a~ zUkp-FrL(mBCxnlAxdMTHpI9F#PM{xJir1o#?(hVA$x~M9+7;QyWo`x4Yo2qPu=V~0 zx+-L-A*uy!0IbXK-m>E(l4s=EcFF=!s`cXBuMgfLc@*vYX2Krh54Q9xPgcG~vt}f%V&TehL+M+SBN^JZi;K!6wj1e)nP^N02sKOPU}n# zNjyl<1}p+p6Kp*0o7B5xbX`Qa4XR8WNxKO>;;mw(?(!uKxzkkbXgpjho+NsjiW2D5 z3uOC&{-1=3I6F(*Ytovk3b&5Z(xbCWdoS@{Uw7lmAec9%P?}x#yG%a}E}Wn|eJtW1 z<0E3}i&nEnl0q#f($Y*{A|e#%SK9g$Vc+!FneB~)h>E+}7txVa16`VG2I{3yb75A{ zDZ^FD at M~*GGSv7LAkmj$M9^V%%Gf{L+7I67)sv-c-w0rqRVT}2KX+FuJ4>NGwY+&U z(9`J1*8YNqpxQe-xkFhAfAfN6ZAIR0Rfh?7&5PVf_W?x4QTxf zX<2u~IyqJSN(rKbQPFUu_+z!Z^R82NK89Ag(PVnTb=G+&iweleMboq at 7`NiPtf!0`LaW;5vI1BCNpbXL z+dtQUnEmICVJ6^8+0FI$VF>x|=(<14yps=}>dncRlkS;Tq;oyy#>g at hDW3BP1y=5w z96i0Tt_BG;X=hHXQWzYk8uhcia=7LWDVKr;k0@!9;^i=>A4)-3V8J|FvD6`N}>G`B$Vp`;YnEH17i8! z2KRBLKI7~?Y*Br}3#D*8`_ zi!Ymo3B#Sg?Me5h*n8Ihg=}Bw|5YOMKaeftVfinDuVl4NrFAu=Par*=iF{Nrs+H`g z2A+&#Y2>=eY>iCAg(g@|bbZ8?}M zpnhb(vGeHsvb8f8c>eX{{ed%}_F6i4aFa|)LvoJ*V^zoK;)k`WUdrk_hZGJytw-;n z2s(R8ESu~;v$ZR_0>py&Ix{YSHm;I0OTPVpi+-Fcam~>NCB>Aj%c*+)#PhYpv#7B?Rv^2DY~F?nfR at bPv_1YEavD|bXQ~i zS}n_N(hkR-O1CBj5sZG*E?J$kwG2X<(+KJahNo2Yo`?-^eO_+;AgvJjh46WIrjwpv zaIlnxB6^vB)9J(W><^kdM=O=Bw);A$?ihRNvMm-Z1)}6WbrM&MD26%t)NXp at 5ej1+ zg(Da$%9#hXBWxlHwycznnA8wp&^;~juLJ|kd4Pr55tow-wYW1lL9pT%BKkHQTG;5B zLN-+!-wJ*yGkexWYo)-;lR at r`)s8ifn`zz~!4@^Yj|7_YKo at xp{IPWRi%TxQ9|4!b z)ht at K7rIsiH+0chbpAELZvt_*c&e<`&{tm1A;EX_TAG89rZB0;=X@`U91}Y% zJJ#xPr0`2^K(1RqfX1V*HM;>FP*wph9 at 2 zKohD#5;NxGd*mLrfE+gJd{dd4A>!I2LBg*Ga{psW#NTofa>XZ at _K{OhhI7QSGrjCu zCoLfeRde4*tTzN55sg3a7Z3w1ki!9)ZLZLwa6%CJ0hy02ChsO2<;uNqf zmU5TOulC+7P$!yh;VW+Olsp5YZ&~(a=Z>s}4{;iPB53-|tBY_{?8*<$@QB at L0vv|C zeF#uYA)UH5x36NqVU6P%(xH+JD&8!6X5CoF&gzGhav^+vV~$}&euMs>P5>QT0Iu<` z3f%+|1cdqj%?bRAB35178CMMBb8UV}sYY5e`)ukK*TVXo!N2tD%DEhFx#-Zv(A`k8pqGq+oVn1XP^tRl=z0*gT!nj5DLms!=AInWjh-n^YD0`^ zw`^yA8RoyDXJ+-wpPK{R6y5m?O->(+c4t|P*8$!$b28+GWJD52as>CDdJpE#^319Z zSwW^n7FsSgICSHqp5?Oj8jtsupwQmSW~jzmr;s8yI at j~ncCn+a2U2hbB;C^mmjuqR(`e-m zCkxMvqQpvR^QBd<$uEB=o^~^XtYzu0+=O3aRew-kNcW@)D#8$@p at 9FwW; zr1aLEiec2SSaPV&)W#U$v;TzR>4*2$bQJ82uX#1uco*HYX|jy1eREMSeP!MFx$efd z31=|qgLOyUEiD_9N*}d3 at Hl;3oSwHHa{q4AE-J}0`l}M-lm7%fn0At|+>juf!Lugk z4r>p=mmuBcx7`$%O~ZJ<&APnVVq7mPP0nK6urto(P$A8fF(2WaPKR5gcw0( z>vlchh`lR7z$$z{JW{~&ne~&T?w~|B8qe2PKm-=HgZ&iacNP-6Y<9btZ?|(zBI8k) z-n64v=_J_MMFQ+iCvbY z(hyc+Wm6 at 6R+W@GuA;HJ+2|JxaNb5yCrk3Avn&v zl6LI%t=b+r2byJ637=*~$m`oIJXNkBO)g214el(lcUlF zpAgsP0_2+ubtk-@;qP;TI+W#>TXJoW^Pl)+q;b4j$=(4LfziRL*iX+GH)A3$EY}Z) z1wXBeI6c#*<{u=CjrVMu^zx((Ji;S>KlLDM^(un4`on~(!d%h`_4=@PVfI9~P{V4y zWsZw}Dw48v37fQ$un2k)&X%31#`(!Rt at KCyc?<6Wh#v^w!WI~Zc<+Pph(j?LqBg%Q zdy2Fxiyx$L*2QoZI)P@^3gU+=<+yMdfVMuDPD?p{u1VZ>O!C%$kE>QR#qDQ_G+Pb) z-VW34#M<&(J1&VCFF}_}_>OsXAGbenMf?)4kjN35vVu4(Z$=*J-puI+9Bl&1MNyD| ztcNHBUlitfbtmAAY8Jx%Jd$&Iwrplaj$%Ylj29d44uRl0=CUJBQg1Nj45Nt!sy&9T z4L at T8IN7i*u`2V1^Fc^zQ`OuV*?^1qLWPM8sWVck6MbRGATyO9 at ou1?>U{J9+vPWf zpRPbVpqp&b6?mv2GcEh71OD=CC3p_Z?f^Cgi%`3x&hcBMde2H3$8M;L;ZgvZ1#YB# zAgd#*xrAtcCNh114yXM5Ow)*;gFDvD at h7aMF2=MzAS1XN$&I&~Auadk57qAbWntVF z;|3 at fmY9+H<@fRH at 6f=GUkRQFyg zfy(lbqC?7;VpPvHVPOtNa~?RPA%n5q#>z|gT61>HuiDWO+aGx_5QP!{q-d^o|KkC} zozcXa?Rl8Ky1M#t_jF_ra#x1U!SJDnt=)dz&)~eJI ze_8JHCP+xhtwmZ6x(=;k(Fj!@TpeZN!0OWUEzf`s@?(AmFUymkKf0G;0b{Ee7 zTo;!^pJbZ%PATfy5UN4c#_v%^nxrA2MO3CxFU}w?w_mCrdU~_C+(TZ^H_cB z8xzXpYbVnwt|Svtm$CBDm_!gv0EE-|-kUiB86xhAx&>+K;gf%N8Wcz97D;;_zvX~P zobUEZ=5lWU!je?a&K5D z%0-8sp|tkKKZL)ujZAs5Rsw6DpW;5YYbO20n!_`So13lEr2n}7k+O1m z+v;VqRF3%kV*Wpzy;G2GLAEtoyKH=A+qQSvwr$(CZQHhO+tx1I+_(GO^P~Gd^objh z4=XbAVLgnT9685kV>GmBcu8KfM)bdP;yi;)^?3gIiWuyFMC$%O82|5LwUUk1l01s9 zEpig8X)RjYIoGL{i;sg0^_zuBzLOxqlEheloQ3BE)1q*qR*s*@7t)6S1oRJ(U$VRH zhhPpH6p$BU4y0!K74*I>NYAd$Cb4pW;%1GaF$y1{zo ziRs2OF}Mpmo_#1OdH7q at Lj7ElP#eBt>D6#9HeQDW!7aIj3fe4CsHtw2W!NNjb}MH3 zO#MUI#V5Pc$+jnLMcJF9?n$POo9uR5Eh|94JchiWOq&M|R7K+o%=b7_LGYolk_&FFC?u`s$9Y!~skA=QsM;eg80;CK;N3rh2eQ(FE_grI_L-nXP`z3psn-!Mz`A zRZw{rr;Yha5LDbtKHFceQco7LmeiV(6t5VIKBm#p5%=v<1o^VMq!dZVRuoES+CymC zM}SD3{5Vq at _6)s#%ri5}Z?k;Bw-spM$1gQXT|$BZ`B7GasMMxys*%!RleyZZipf`g zx#F*1I}*9~xRaNnC$JY~P8ay6%P|?90njJw*`16EdSzAqStVx2jf at t91<}V=F_UWA zT(=B*eQZwijUT7D%^KfEaat at q9=iiOG+M*F7f8!lf(}Vkn#8kjWzlha{|dxqvr;Eu z5Fj9p|0s<0uRs*EaQ?p^rT$+M4CXpXa2W{|K_L-|fOd>9Givl|7i~~95p-GKpWvv-ZXu{B+6SJr!FiG2{kOIq6Q`M=#o{A25 z5G4$($73fL*r5y|W`#y4Sno|uBD@;X85HK+28t^UKL3IuV-;l|*%nqm9VbUO5hoID z!|MlKx5MGy@!+rHo2<~5Vp at p7uN{>_ zYY$fu`MtrusN%73J?;oLZCRp#QWDL1ssl-YnnO&%KXN{8nKZNNMm3EJ2bx;7;mj(H z(%?%8X at 5!d*ivrZu)kIkg1H8F@%aM*^S at gDswy(-D4+&sF$Gomxp}OrvgY8e1=iDc z8uAnwr+^T?XoCcnfACXEZrwI}A(Tccd~6J#BcK#CMxH;=qixOyAwD$ z at CUxj=t;` zoLO7E+&3WA^Ion+mBZg<%V%)i+p_yi9|hh5JqGEWvGcF_i&;GKgd|Z;CKqo|$CNr{ z-P$$$hSD at 8%Am5NzNPF)Ejs7yOBpwNnU50O(%6qvh+dW+QeX*kWX*L>aUNNp)~T{Z zp5S at JYSl1`bta0pSg*Eix_ZR`3k&FCadP=1I%VG++F84S72>1QkQ^%cg$6g|j3UO2 z8DU}Dk)#wjv~4N1rjZM2DDTr&a>hnqCs^F*qZZ5 at ZcX`;x+RJEB zyPS7k98GI}B@#nWY)o^+c~K<9Op?ED$1mnXW&vp~IQzn`xJ(my?Yqx3@%J$zi`&+m zyAP9e)NDL2UqlDpo@!$iYN{5Ml at Y&q_`W^bp{WAPWwxM<*eh$9TD(_k4}XXFxq+Y0 z4f!bvV-#vN5b+M^T2OpGx07L=PuS~1B$4=O`VfhWTWT at P7_-oY%m;`tXG4f0XG6># z!BCULK;H}@XwUx3=_$7#h`<+Ep*yJjjZ$=Ej)B%UmZa~9L!1!Ko^t5jnEU2WV3%;e zO)d!*nkTbpRP!Q+KEXFFxEsh?(3SjGU{|6J*qlo1Q7|Xs8DFp%Z+jsGI<%XS&qgTf z#Q-#zdfb5ny#{Icm+c!~aSY3moB#NlPQ6~s0Q_q|yjQ*LvE2MdQv3dZpRiT>>cn(h z`0j}L9|+;P#58$V{DvL2ABV$V_vGS-bMYg340Jz}Ik}}?mXhl!3yZ|ZHgfJh<{pW@;YJu+18^dUKxQ_0#jj-;lSseZLtleATTZF<_a at k0~ zmW8ByngqjGzP?->(c8FzPp{x*ALoZlZJ2&`KLplbiQeB_Y0M9D!g zh_Pe}Q6iC9$QxD){`aXk;i6nqwEu`_-NF9TRGj}ZaT2z!CXUV)hSnycF1AL_7IwD( zC$jx7!9w1w;f|I0a at vE%QhCS$2?8>~yF^9Gns8;xkTBsCcjs-Di%AW!R;3C*FaUZ4 z#BcvN!D)^HBB&bWt%sYd*=#3Mx6%L7)Xa}Cg~y8KSuB5$KPt!_c!b3QKEGRrnxqF? zg!-{&cCm+_9FUc{xP(cWdg?|l58!-)%?X6BRP#z zlceF2f_xj<-DtR9Ee=c(VmAUs{hCX%H!m7|@m32(NWzVG%Q232 at 8H>*c|;80-+!5P znUa<4;E?-b_?5;5ZV&{;YQ^J94 at xEaI?dH4y{0JiIJ6&aUvu%0>W^`E at N*>o@@g^t zoL$g37$L`L0=HTDvgN%bOCo0_ z$e6!R>~WO8(tlv4%ZE47apf$m*p(KA!=zF1sfND{yjMgO0?ISMyXFVA at C7$wu37Ss zEyf};pfy6Jku$eYz8`Dm(uo^;dXAl6divdAG^5HVpxjUBVF}oTvXDkL$TZn{XN32m zZtk6p&gXUF)&B~V&0 at P#k*-TRM)Kc_l82tqVr2P+9%l`id zgZ~SG3zq++xg}XQZm8STY*wmhv8Ki#&@_F1I$@duiMHehU|EqZg-q+dzqb{*4gm^IoEFq!@X*6+Z6`dpd;w;INq!0 at 2-fR z@&;7y{RY^-B)v-NyX41sa%aV=a3vn4kADzE7<-c_*{q%BC;81|8ioB)F6kh1WnfmQ zMJBFyG>?{iHOerF^vXpjG{%xnGzL`p->@*UI8+z%U{vy0rEm%c#6(r*{r*vaM=!gK z{WvhEze;GWjVkZ2<>N>wV+t?H0KFY0mqyq!5%0&oh)8&+DRCVlm&vjQwiQT5@;+!w zySRI1^3Xx!_t}cPc+pFN+06=io}9-yX_!`KFf*PpV3Hzs$-jQ$)mmegY6C`x%e@(- zZRP^5-=Ia81LcB2hOE}P5!3(VgM;dRO5-5&V#fR8p4kW(q8{~&daapEb2^wTS}QYY zD(C%%zAu4ff3MN1Z;ha?529e3uU)Lw;jayvRv&{SVvkUN7CvlYZ&P+4k!r!2|!mR0^P*)p5sO5n79KOT-D>Te)UC=K6k>$8R z{f{^k%8mxMPNsH_HvbnttVCJIX-gP|ms-oUx?BQ#5eP2%FnAT;L5ICLV7=I7F|+fX zf`yD<7h?mhma7rPn3MS=WG}%C&;8(+skw#wKEz!S#!U*!M(he at z`gtH%}$lmY;Mn@ zp5Nbla(}=JYPJ|>h=sEIn=!zuy=b4V5~qebeF$9am7}vRKUB`+oxkAF3unc{J$+ae zumy~4v$M>dSp_3)$GZaGVz|dTeOP;w3Z~d4I<~moE7a9g)RiLI(mhHlb5ybG2)89^ zD5hU(i+d4k#Uj(Q+Sc9euh~Ykv%%1!D|ZV;W7l$J+hDYXt3qEhz#ryKUaIf21mAXLOVRO!rB+V^_d at O zjM^LX+UxjZY1i<4yyFP>-;PCq at yOTc+jH#(=~h{L+AT-cAtGdYa7US$3lx0Tj?c*r zpI-(|??zh93&nk+;-J$;DPlD{rM2Vok$Ey4o@>8J*g8xuGLIS-2`y7DE;tT7g>7xl z2v$tzT$)oaHO})yHd;PqrRp%fl_+0sxz?)E$08$P(iI$#?8xuMM^v<>4w+H&jv69q z9I0FvvhSI2TU={;UEui!zTd62N~&!DfhSswXZRASrFahCCA}l0Gene+EC?2 z{RKefz43QGPKynJWtM4eNBk$;BI6-2%CN5B4{37BKJa at hxyW-A2qg?LX6Z8}Q*u#S zfM{v?!Zd57Tms_TJIc!iVk=W<4d{BHUKP-zm?2 at 4{J34yZV9^h4TJXq1~MR)VQga% zruc!r0EZCsFVy|IziVVq;w^vTt)b%X+Z0GY)pxJUzGA4~v8 zUnPp_PO;8_ozK2g(kft&vC7!NBhfor!eTnwM{Xut54SSoo&_?_qrUAQS81^IGrmx( zKtT?8*Etq)g?KvdAKvX&6eo zfm3fM#y=MKhmP61?X%>UFd3tVd!cHmN(oo1FX8*QI~HgP15rd ze3$PnA_Gf33=!{S2Nqw%kezQ4qipU5nRHG?fo69wF1Zuer|Ms)9>+A`NHih$?G+e8 zuvJ-lSUvKQSjbNd0`z~MC^23Jfw#3`>zEHx4c(I{iJ(P$=EEK6Uye4Q$-3)7lfDua z?fYS7o&=4x-p#TCw>owT_Bl!Gf#*yb>F<_2pnVsluHT_`^Y=q^&-$Yz9mqS7H|>)G z(Y*}dd?%vP_Dg8?r>^#=-cBD3zaj(mo)6dVphI0s0 at XYYV7oIhu{~mI56Y(A&C&wb zsN8b`_2@%&M%1hJ*}Las_Kq8NpmpOI9Ce5=q+W)R6>7X{QU&F;j2LMfXaLe=EhK^- zR at POi;vwuJ%_krY@>Do+geY~fc1r-R_eOo964If8ba&h)9vle^s6^BGLj_tcRt)?kI}gY;EK#GPW&RWK+p z0n50sz=T= z8;E4JnBgUZ3NgS0*~jm8u_K2S1Y$r1wQlif(}*n9>#3S(aW4=e$MGzz6$y+9cbwHD zGVh>Bsp&hrl7xdsL-);<=gjRifVcz%DrX0f3j1P#Sz07itI(=3u5;o at 2EMXGs35^` z^OPQ8g=J(}5(};!3HUUl#^>T3wgG`4n`t6$UbJamA5KzuH^Cl8n=GVT#3RBz&~xW%H&AzMeP@$A#@UHj=AOWa_T; zRL*JwHP23_=JglrJ3-A)oZ*xLiCK;dl#J6jS7TN+Lqtc1fQ$GkGVO6#d!y at s}sy1eYt z_NGh&rtCEX+BL at 1_WAxLw0b332h~=k*mq?vjaUS3Ze%r1Ruj9i{5r0Qy<-mz+f_vD zkp&L!yQ{faFQMyEDNZVix|=gTYOcW=tWnVb?Ix2Ebn4>vXy>_i;(Q_qQsx0urt9Ot zh}o(vZ_LK8{aB_03T)g#hgCdL{lG33yg2iLbf6YCzcYAJ0XOH5e at j@(**cH_s2p)#C!=x;84z_rbN(VOe^BmUPy-nB-BeR0=7*_OHg+G#| z=(FJr_~uYI$`G7cff6+atU2aG1^SUq=jvv+sau`j+Z_yb{bUeR5e`xYza1PS{N8@< zT*JIP&zA9E6f!9af^@2!#YG&&SSm{Z2lEqTkx0CU at p1Jm)QJxt^j;k(ujAApk~#18 zS+?lmPOu5q&|}TELOdBvh*RU#=X0>rn4wqAda+Y{KIg=OzLQVA%k0?|wDOj*sCx!T znY|^LH#C^ut)$i$b&eNuMdGOX^(m+2)2&rGxu>g!6{*mUlz5VQmNl}&T at ZrFk7elv zEn!KNVdW>FX)HJ1Ov&8^TDB9}baFHfX1&TyUFyc|B}{|WnVG<`!O~oA98_7wU%90v z at 1_>wEiZ`8kCN#7=1R`dbxIg|RhKTWTON%KT7nM=Ugd zUvOCS2w$ws;z5cgcGjQIwuGJ#nSkVc4)!#(i*Ni!78v6vY2>1Nxk$YxtkFwtVtpa9 z(_qM8LXHlHnMm%#CEx-{r=sWQe!iSrai+ at mk&{xt5qJjn?4pc<41Y*gNtE2HRr;mY zKWeU#u)%%{FQD2;+0CibG|dei0pB9k1X)w$KUVGdOLt at W3NhWIDWc#npL}l1?Roel zK$E3c#VS_#iGs&9oMIZMk`rFYXL-ya{E2P%yqx-?v$FtXN_yI`$La_qB3={~d`-=I znTG7o=fxR+ at Jo{|D!4v%V4r_70RjWnZa6yf0cC at H;OkO zGLHOx0aS>4fzc<#kjy1QnE at fHA0T|wOfltl%$tKet??C3It}G^gqybV)GveYi*WTU4! zLOy1>z(y`2ZVNkB z>IV7Shj_hpKn{ONLmuM}nVOdVyc_H^xRgrSAH4(+vtM3RFzfJy_x=$kY8N`LDxPH| z-t&`G8&|wuTc07j~WfG6P`_dCRxZ9kWvE zw#0QZEPF#!C15M1E4d~`g&j*YG-&%`m)*}f6hb72Ne9U)h`N>1hi-qX2Z!7`s|nDg z8Z8+2L%h at Vv>$N&z$N6$GJvozpo84U;Yiz at +J~{nYX^JG*eCS#Zxq_Ucz^&O at ImDH ztQfKZG>Sr2EJGbc+4u4*fTQ<^u=pmJSeG%nGRF8w^ml;Lm9!@B_DTPx+X6}xf--oE zjQu61a7h>#^8--;S-^Wo5Y69?mnLVXD? za6RwgI+X6|vk#P9v-f%aDXnYQV2*YGbOsK_f&s_NfcBwJ6l{Ry(FRXck61Vl$;g3u zX#Bb{`0#$*X#x6Pb;oLOD%uWQTdW%3VvnjV!$up7X%F{4BGUbPUBub;APx4k1^m>#SCoJb zg8to$<(EN_Hy8Q)n|R`8{1yNctp{FFEGcO0ysh?hSNX4mid2IJy>M}&!Wxdrb! zN&>M&saMGJ=nFO}{)hFE(RH_I|Lz>b+Ys*Jn-G$$go@~POTcQ6yTioRG*bft3(%1j-v~>vb}RjhxQh-+;0A_Wd_B;>z8%n&9;l#KNDjfid!-^D at F724WO}khB5F#P0ZZ56|fb7rxpR0{L;U+z!yze;DHIU(FpTRU%kfdW+>DC#b)IZq)LBIp~$u8oiNg^Mx z(S`{hux~F2gUPNw at T#j4YAVZ6axS132>r^At6gMfDhZbT5&8P8%KC88V-pN8KK4Aa zsQO>U=4cB%kO)X(aGZY-JK}Kb#b*!P(uEF5hL4hyYC%;pgiaf|Iiw5$@MEQdCr9+iQL+Rgwi9lH2*&xoyB`h^NKuQXT-dvNfCVmHsNP_me_I?G2VaL+U0Il$i_bfaKWY>Q_j2ch5V;RTSubxYd3 zEI_eiu#qtdy73|D-+wboL~_*Ez!IA6h}we)zL{14{}RVEUuIzgyDFS4>I=q1l< z0bL1j$Mm&>qPp=Ifvn`4|E#*pMDZc5FcnYwJ{dz8gt`Pdi4qpN(UTUDGD_>Cvq#Ld zj+%CXrl?iLIJXRHs7)dJBpXwibcafy*7Lhak%(w^_a2d|$GF<=57T`Sw z^U``Egn7#;lPqrt< zW;vbh-rTKcq76*ADd{U#zg4*+*cv|68wA7Vvl+(i2eoq74>+?n{s8b=U$jj@=1Xti z;2z{6EEUsV*;$ja)&a4_cD7#6v{93 at zXtPvm-7AQ^8cn8-2H_L;!6-qB`+R`;e@@4 z2XBoJsCs$qvel0=*r(E>b7l8G%!R4+!i#pI_s6^u2{ouRSm#JGhyi`t12!+3VOU|X z&YoZ>{kxpc4qH_0Sdr@`e~jLHnAYUUch7hVyeXrKZC1F$KDbDb;- zG=Pd7VPHa}C4!DF at F#L_fk5bgpJno%$Gkbu4b88d{Mi*)uXjac!wY2Yq_E4j&`QaL z$sczj#JSwC&`g0Fr1Um?G2&EJS0#<>F^i62oyIfct~DSnz>gaf=etULR`2PGD1CA& zwXD`u%}2h>1Eo(f$}>wgvupGyz4fSJ_M~KA`1sJ2SZOd z%c#bw41%MBmIwDpZRU5SjP0^-Ys&DGD|l3OJ)1x|H}KhWcbMw!Gn#L~J^zB|6!b+C z%z5hp8+|*cJUc{0k=f{-^I~QN(izmaL*K!LuCk}@fE5IE6(|1N$HNypw7AQ z38FH(XUU$ujDbKj3+LcQi%Vi|$w+<>Um-lZc}TNLUgP9WeGL!W4VpKLIw(viov%nN z5Ry}mVx}z+GCE@)1r|M9PWbW6CVk!$ZS;74-ysJV-q}^4CpHo62~Qr$wfqY at 7li0K z07icE{WN2#m5w6PuYwX%S%|TW_KY1{U5FJmG%RGmq!ApUB`twfr>6};P*6Sso=w{( zhRdnclUG`ZEQa;2ZGXgb&$5T})9!CaO|;w)(AharqGkTat0KlT@&MM-2-FO&#o^*M zzcp_YbvakYCUCR3Ecnor`MODWGUKZZBXzu0!|w0D6)UGZoZBOSfq=BY{!^br(8*cG z#o6GWZ7)R=Cl~AgO)acZwvqcMweW`Rj4cXQSy&jXqMJfqp&xx0yokSq8Y+tfR8O&! zOHz{loNJlh_qps%LmHAX6o23Dt_@>u$37krsZhcz?=d_3GGm~G4*>|4FlQKU zTRQ(&8^G8Fa+C6)l|aW(A+bHk7HK|-ph|6C*5Fy9o!Y>^KyRYQMaYZT%7&V4PcbqZ zomVVfYn%LzXAC|iLowY6242Wm#!Q{3ifjtz279elFzs_nw&E&e(n0O#o6QCjzm0dz zZAc>2+-?tAh-OHnQgrAUx2e132Gql9hghy at z-CIT0a)!$$ZXhSY~I#dlRNc7!&iaT zqt at DPx+7L?KF}Y+2zCO89-@``6j~sPq8bN}+EPB8vf$4a9({)|<7F^*H-UltpbsX( zoxCWrB2y?Mkr7H9#^z79+^7-K3n(!l7y3CpTC at OfEI3+1ngLe6YT0t_pKGYLf;>_w z6r-QuviBAgbB-z{8z6K+ at ptiq3<~om$4CiE3HE#m%EP6`FM%Z5ohAO&zSaW_QP*L_4I!G=NAS8~$SQITcOhWm1A0fSyHN5flDs1frcXuK zq)=tWY?)Bty%x|~2(uH+>&!0-S#}4jA&6Y%E`TwBT1hSe>7CE~ibQJ+rr z at c$38|64^uZN~{&1?4ZTL?)XKbhAG#J~2LFsf48Pua at Oaxy?m at q?SB?h)rWNOqTVA zwSOT&cp*hTLF8c-F*C<3e*!QQkz8!iU;nz_T)$s-?zg+PWRk!Wo1>4UyS#38oMvyc zoo>H#vi5%7?|=Ebyluwx;6bjR4ls$Ekia#HCG#5Mjj!L1B4WdO$wP2k661+0-twyv>ZLbS7YY+Ql@?LiTFKDOWMgBcecRXOb at +O~6F$Bu z+2&)9Q0<IHWf zk=ieC%+)GW)#wq1Xc4jCi^a|JdRbAa+CQ4IqL1QsTHyFK_oo_`Q3>e~qY|jc1uj$_ zH0g(nu)_Uc&569MDM9O|Zbu|DwlkTi^QrXt=PP%nUIu0gDlf=aw?7(oslFxov~3!Z zSed^w#hOG4Ln0=7GAo6}qR24fW=rrgN>pv(KavX!RP|Er{w#7OK^GPA;D(in?E=nm zKtZAB)cUsvDkPvFQI&vy9RxOzbxGu|ru<^CcueBEWu&$(kQoyZV^T7twF$38v*P-? z+P`%N)*(VyasOyZ#!F$R?iQ1Qv7luxxC|S4)QK44q$BUZVDV9q2<48&sL}Ke7X9Nw zsxB-e-0hFPVU!k*s!ll=#Y$w^FdCyov^!$4sUY$Y77i3hv^h^xn8Uj(lorlajVhm0 zEB|;5SE{qdsx$n_L2Ssp^aX_9>7Y6+cII+qgmh}JI}G*|`4)Wc9T{b-4Y$>j< zr?(%8p%?KEsdBb$O7pK&6K3tc1Z9~?r2}&>>%vG*bZl2kE7Bw?RllSX4Ldm-2sf>- zDh1MueaUJ1Zr4aU1PQc^CVA0KZ zjYnpEX|}@~FT*-$~4tS@?TadB2eED)434DHRY>oE~ilhaZw zHnOuab1E*%u?5H#8hyZ+{5}jXr;`e`Mmrn4(y}g~3PEL)=OACYX~;zXdvG6|`Q?{; z-~E(v#HSL`Zse%AaFQ;g`8|wPLBdDebx-r%s3XePs#9)^BUz-vk{Pt}B-)Rb=eSK$w4gO_{>xG{kHkwpl;ME$EQ~i?O=`cm%^iQRmY+e{4Z_KGem&rn zMvvg!!xLPZ7Z106_z=);EIL3Edfxv5`@PcIJGc6}@jbQj#)jIZjg`>UN^6e+~FkcbUEp|r5C)F8l6Kf z at 8BemY%Fw at 0VbRUw_qxe3=rPn;Mt&fKuKP-peTtGvG7BY^k9o*GeW7ShMC}$AGS_5 z7N7ubov+>35_?Oc*BV0?qwp0%>)5=9tY`3j+a%d!o({>4>MJjM`-M+Azl5vNZr5p76j4V}S1d^iSWEkrM854^Q7HpM1z zYSmvDFWSh`^KNbTduxkqD{Jnd6_?u at pWBAXBPI1O>s2G0qW`5LdU+s2Y>8TpOHW7# zyT`(k)})o!x(q~OkKP#e>Kgm`H_M}7(^SUGm!dPGteMht- at p1)zAfK0{C`A?=%D}U z5z0S&s+|2lDgOU(s{eZ!ZjI88EkFVB2VNe{zD4V6NV8?Lg at 2`%Re_$Rl;46>hk$Z@ z_-T-43aORzim*#+gG85ZMHB{ZnM5Ap6TCyCf0$msYoEz) z!WRXf`#Euv%-aNY{2`Ko2%&N$>DU8^&fHPX%^s*@hA at vskL@9!MMi1G{bP`j#z^;EXJB-3-7-EYZAn66kq+r;`cq%vf5jT9&?Q_33=j}7 z*?;1|{|nasJ9bmIaK|3O^j%vukjO$N&rkPY|LrA+NRBaER_$Bx~$$ zU{4 at zN_3Rhq)_A3jCD+&m)C>_rLYk)$AzHy1r3D=T>?RiIJ+37+dQ|_XS0`)vgTN* zsR$7K=E=>;`L2DvjabO)+WxDtxcCe~F*}%sunbW8p)b zaV5udH4HibiU8UY%T$J-YmC>A_KqtK#urHR~@_2Cz=(bDHTz2kxHzHC7cN_ zeiG)sZeE~9yl|QIm*FwrYUd< z<~6b8`9UnlFbq+Jj2a;!jJlFs)jGlr!zXhAQvwbp$!VlC&S-po^&$)94H_Yg)goLD zEXk8NJGOi^Bm7)pHK%`=E!9|RDUy8l-6B?)6DI2s91$-mMI-NQY3%|F=Cqq9oH-EK zipucGiqaJpN>4y%ARn7)sWl%myok%A+nA7A-UvlWmFt?12&R~W4c=e|=fcuq{M|Hl zJDz;}uYwBSAnI`h{CvXdT8cPBQ7OjeuP8wo49`BixMAsliK4ol3}a^`O*Jz7N8>ck z+XaxyxAFlt8(JCZ#_jWO5N|#8>WKv$?_+V}WDVjt!@~9!8Oorj3Z2tXcRzs%Mf(lP z(oWPYky_(UHx?M{(CK9MxOq?%4WCFl`!HS=BwIc at -rQwar_Ee0rlptrY3n}(wrhu! z4OKh4^7Fy(jjK}%>5LwUcqQ8Nx4IeP*a|foX>0WkuNCh^U>>cr*|}PW*pAuVPPn{d zvIi5LCfG_3<0*j5XR1F%vk~}}Z%Cmz>lKEeUD at u+BS!Aq5%^W^z){LqXfsLfk|P=F z<%i7XE{7JVd;`o>xg&VwFO}}_b5&7M#A2PR$o zCzW8(mGG(8F(fUWvO-a0hd!R8QCPV1g_lDS$?XZ0=~_9L7fDB(o{GCI{Y$^t7gZhZ zY3pV!ig?xr^a7T;{g(Q>aTbol>qzxDs86osz;@Hq^^(X+>#^|I6m8P%jxzvTtr3(w#XGHu`oRA zXUT+|oCGHzooR$w1sRY<|8~eopxic0Er|En!|LHPVH(?ps^zm38v}l{6Rq{B6$_}l zBN9SmQj-KD2HU5uj>UB$8 at Ao58iP7qErKtsha^Y9s|Sn0(Ny5DPQWoKI?D^u_!c_c zCXCYr%jRh3OP&}ZbtyH$6`Of3)qh0N)EZfn&W^--Blyv#KuUw4zzOoE^4|2}F5sD# zg+i-$86V)}h^euJ-gnL>T=7Wpm!awlSBwRT at +PL>9P2}OHR+H9YA7g5V{>Yf20Dht~ zD}z7fPt}Lw$`%Wgx%u6 zy87+cZ$*yKLTnF)s|&Fwo}KkK*Pwh0q@|hFB09h02|Co&4Ak}`ZyJ(nUR3=$npnC& z=ZwFN#DbHU3zb|l@#>2y#_>8>S>OYdFt8mjsvXbLO`OP+B!sk)oPs5Sd#G_i0=x7N zK*}kk1hbJPtK1 at SgA^*;H0cmRu{{wua1a9*(!Oex0)?g-hHKE8jM*%dk<=XBJ0+32 zYmIOmii?xS1*Y;X{e`3yVyau#4wLlVH+o+W?xDwJ%WwCNYb+c#k?W&yZZ2_r&H!4q z2*-*6riX+%(xbbL&R_Im72wNPghN1qduotF;)ZHuGYqTf(>lGO^5xk&+(spIjFRXB zKTF!_Xvm9jy7Wk+==zJ)`e}iG4(^FBj#^^=DxZ&!*y6OAHTJQ7^WmRs at S%S60kMJS zNfS>nHH>UZh at 3Ya8JW~|_kD(h&Lg#vYV5DbB98&vO+GC_c-vf}qPcKGO| z5<>MYaMnf~THzM2a@~0D^2HHz8jv?@0^~fb`^Ko8&HnwClitHkd{Z-%xEF$ah3M#n zDc|u%1R>WvF<`M6ESA0=F}dSg7qoGRH6USBfpiM}3pO#q_?IN(DSQ0BO!=VcqBD}z z{HewVohh_Wz>{wR^`WAqPH0SfwqBj_E!B2pRRh at CKAmT+v9$?_=`Ci}Yv#%k=maYC269Ewc&>OCK=hk%=~-LS z%Uq{8CkApi&BBa4)-7WkPCBHGk=dvYx{jd%JKebKP^0wKlWh0g9g8uxBf^;-eB*Jv z7$=I^cm%WY5LUw>w3?AZA8%!3YuwcU3F%iOduV`+niTsncb$(1EG z>9+Y;DAjv7QP1dFm(oxMJ#fXqz{R+JHbouxs9}@5pG*3ZJHjPc-3{roDEisK*YA+R zaHqdGnKk-+KUp0;cAz>%U4wTxq1fBYMjs`CuV3zwNr`f56r)wcG07`-J(s){J=_LA z_CR7RDvd__$*@3U9M~Y28%8*ga z+!$D3$}c&*!dcKOTW*JV;VbBqB)>yo9Fd at Mwgl>5s%!l=td`AD7rS&$yu_ zCd^fi`(yRd&%f1ZH^guwm_UGlSYZAK`Q-nu(Yjch{CAYEswIc~k9<;AOVe|}5UhJ& zhpuNp at lKK&ngm0r1~h(n?7A^^nhX$4HfrXV>@a)N*n`w*CCwu9 zI-UJ(`X`HX>HPiu^3n~6lO{Ai%HM!3km3(fdki<>Hr&!|58}<^vjF6y_e_|){#o6{ z)+Dt^Eu%CVX%CgMb5G$UaD<9Zk%)@P1Y+vNC^L4t8KfNrstgMjYleWmnaaBMj9uyj zj4`h~nuKKprFL7p*k(Jts||Yf at _H`4ZPZth0CBb8(-R%&H2Rs>(rf35z^O(~@Z7AyqXth3 zW2q_#n8;EL7+AZ%4%pTU2Uy&aIfO?Q#D9J$uHF9boGbh+L|%cKij#Wfm^*EsY#VAx zGKepvZk}#C)3fI!+0G^n+`n-OB}mmA(QQr1eD+^vTtgAxj_AFOxNR*_?95}cO6V%Q zbz@$bw_DiuGj#6G!o|f25W#q%aZNdFvQ3sy`-iH;v4gW zG1}4{H`GB}wrnV}+KABUOlu^Ps+DS2uq>k-5N>#nQryx?%ij=5vL*5*W=EKxjyo30 za+X}5`}vq(gyVzZ^TP=2M53FYi}TD^vv8+Zw}fep=!G}KmTsO&+>{?V_0(f4FuhM- zQWb;t4v06ZIe#CXaxV`6Wir<)t;eaEIS8o<+9+ETyDMkb^XnGWC-g^2sWgLg*q8G# z%0OtCx8qARqK7;Mh%-f`QHuMtK~{}XmfiY&nAIRuiE(ncR94$e61!8+SZ8?8-tGZB z at 7``Gl--ei;`VlbTJ`{;1q-lxxS&Y9~{&_DR|Ufd6!E36;Yb#4&f)Yf8)*?esas*qPu%X z=XgPa_lGf4ZMAd!n1!|Ww at 1)aruDYr18b(+YUji;59`hESO2L{YhJ?#hD^Ct at 9|?M z)LbfaC*h&lDFy`x*o}5Bt}1?xJpIo&8;%;=Hlub8)au)B6lc5|%^C${4XbtgC at 3XZ z&6KNiS{YXqV at L3gr1Zus2_@q)jfUzdUHrJV&!o(zQ=jzig-u at Y>ILaM{SktVtA=3m z2*XqZmvF_UMIB2n*Cs{8E@;D$h&(oE#VsBrYVZwak-n+RmF)5$l?4`@J!J2RIGrL6 zY$pH-yo%J%0!LvoL-6oU28%P>Cc&%tulP(SvL_23qw{5BQ|EnRf+slY%+l{s at g1P} z;*Q@`am^fN=%aU>ZMi6~4eJqr11!}(Tm}&db=p_uG0N2y{=J4*OJvA)A$kop<+Nry z at QMRML{|qClxXtTLR4ou{1%^XHrZ4wyt6RI6kwTrHTD{s7Dvt*g$|4D!A|t&8ktDODhcR!&6dOG?fWo_2nf23 z!9gLFEoZDUZdt8ed_sxTvL9+}RRRmdX0D-Wp`G-FI?0Lag&o8|9pWH^qf!m^B;z|8 z!xkB9GL|sSLsi6zELri2YdkbOf}e$RX2#)8^y~r-73iBmo*uQ=Vf+0|@skt8-7~un zofO`dp6O(77|JERz5b zDw#eYlKZ;VdV8U0D|2nE&HV}@KdrF)iYw=WS2^}^K99&JP-8W%%y)XhUWQV@)K#8q z7Dms%OlWO#VD>W$QbG=wMC#(;&guO1b0dZ%B`-C+cmTQd!v>#ivphbX at hRL;mo(Ou zwkxu~a7M0cE<7U`We6(!g9(oobcGcyp*E!LT<+VQ3u*!q5Rn$CHv!dJ*`1YwU^ZvWa0<{OvbK9)m1HN`iN$f3 at oVF^v)Xgr=@ z42v$stku}J0U~P^7^HZz?yVcN`E#6y at JXHhW!DGfu*F$>)0}4)_s0F)^_X8Jwv*0t zLMJ4p<1bkmJ45I|t1l~A^m*82ZO(!v8U~Y4`DH3!phWo;|M1n0Tt3Y~Or-Bbe5r5F z0EORtOiLmh_v42x8OKz at Zkb%1bnZyIvM0P|cAwMQmU$n>6fQzNF=z at g&3P|(O3{oX zq>tvQjIF^b4sn!4CO=oFQ04b3zqYIBh`mJe&+cfR+%5(PH9&4h#vNE%u at 1fn9$qodSu- at 6|`4 zywS)xDnaN){s74s?8Hw>;7PSSPw22ibI^pT98H7g*o)Q}&o&*s at ZaDVvY!29jB zrmK--Xz7vcwbVM)+o45zZM0~z!X9--EPcdQewU at 4X?smdi?lnuTdv5ojF9K2((0WC z!3Af`jdCr=Xh(>4TVIVjdpyUJkz=;ZGReLk&TBY}7?pN10K0OFlRNO`+fS6JI)%~U zNhZV_IKHkA9I7+lqgsj4iV^9xxf;KvBO|S=RiDGo!`|>7^d`?#R0Z2Gn`U%pbIKmQ zGN-&yJx2%kAm>GJd9g6~!A`C0aw z3Dj6h&}-aUn^W%l=KChs!%R<453oJl4(VKoBl4fR#c<+oNdrt&&?S_01qpo-Otr+v zKTQGemNeMvOt=073Y2OUA&w3y28IR;Nss7KOwreM z!0L#MJQKGZQMQ~H;P%Dl6WOhoWSNGUiK=0)M@*;apK8$CDAcU525YH&!1};UlZG6j zWIYGe%Uq}7(d4`;pZ*|$7(x;Meh0j`SZKBt z=rPEI+4}FX^(r;S%YwynkH%6k&Qs z>DFw_SB0xAFiC*SXRm-YmFjQA97cp2=B|w5J8?4~kGo7LW|U*D?`_BMt#6gE;aeZK zie*8aDHmC-Z at _*s&m{o9KSbGqVqJ|~?IHX+j>ed%?j_`DXXL)dR%NZ?D+9=Mh)n50Ln=FkW zuE~L|5MMk;OEsj5cC#Pu^~6G8ND!ry#e5-+j>IUyb}UMSt#{!(6P3fl*AFImN0YInV@$jSIE3Lj7|b|4Hoh%O20ohUDPUJY1y%Dta)0e~BZ zlh}!&*F&2d6WY!dczui&xmf9;zBiI)VF(wt3Q!Z;I-bhgDKFS zVa8=eCCs+W zNrgzzv4~zksgFDy6w5?GX&2oixw~f1lfMNc%*I%+FnUiz{K$-JhuN%Qitxx46jDK9X0~;0^3SJNlI3_7&>*)%TFu zTfpW%{wFZwwiz?RzyO3fH*r_A;l(eKjQX7xctyK_nqKLNu5Z-rsohAVKfD2Jw{vNW zib_gf{Ek0}<&EDBiX2Jv at e8FSXa z2}2+gZ5y0w9(+!+vR*$=M(BX#ZdZc?Iyk8HM|ydF{<-TF#xem#1yupnVJU zfVV+xTKZ)hjy&bpsp6)bw|$v+Y at emX*eAd~&|hi#!Bx-WS-w1fm$f`6fjD^gbJo^F z7sYZ=frRU~`=Yf&dthwo0VO;wBoCgc#k6!n8s22WOm-hO9=U^P(#4Tv0yPdtquw9c zu*hG!iy3m?cUEy=`MjCg?%F1?m2)b{fHj5qos-ZSTbl#JPp`L>5EbsmxS%ol&+lzG z?uI%@Ej>LWch~arxqBV!@L|SUGJvy&-0k?JGiHNNe$llP_e^=nAS(}H(6cKN1&VV| z5#1bVss0{kO1+>fZ!^rJ&>s=U>_$9^D~8Gw{iQ8CaUTMzXgE$aaS;5tfM3!GA`KA| ztTo8AhBO9LGDFRz3|5L`aGZAgXlogN!s;-`KIDpaRC)-XaMPWP`Q%2?_irtvElJ9W z=I4{lsJi3jtq)wOZ+11M4akjdjMMF?bMkTfX;Lr`EE&q>z+S8E8H*5iFret~YDH+LoIo-xIE zJR^Ta-#z>94(bWhGbr@*KSswsrrT!6*;75=pHB$>n3tyX!Ar~#^(lRz-sydutnR8N zcX30ck+tgFhV?^+nR1u6mkg0)65iPYeBEQS&n*(85{qCE=+VvH`RWx_@%SIr`5cCMO96_F1n zj8a$Q)mz}d1yl_+ekmxzEz!alJ0X?5$^@iYZT1vkjazEfQmCrbSTr)V8ZMjID3#P% zT-gj?>LeFrYnEqv)>~xA$WY8Hv%z68%am^nndsPUSo`33JrghXZ6j??V%o>pvg0}Y zR2y00C~d|YO_5Qys~GR*x1;TmsVZwW9Ba0K+8jO7J9x~`&xCs_|9R5j2JoKFd7V{g ztVb)}gbHeiugC<@R6;PY?{5hvMw>cRKS$XgbIb>yO{Rarck%Ba at rx{gi3UkixAv8l z?Clz#e`UPJHWCGkiqUv0k#LDuREzk`@aCo4s8UPu?n)iG74%OZ5jGdf95leN zpp-{nDOWOU)2f_sE*;@mJ=91DzShuK2|M>IYT88qkXbth*p!PZ>8H(mcyDeMGtGC4 zxHQyUS~%)JX}vNS$2Q{{f`~LIYr={S6`!dJv}IBvD7%{uSZleMNF0$dBKtxvTn6U! zd2ZCH=xDI!RMI3bq7Km8q$>%xbmQ$Q^0Ja|Z?&LH`^2g`C)94=um9vaFODG(qZhHW zT8zg+rY)c)h-6F16M>JEAVZh)ec)`f6OG~uRL^Z-N6L3Y{ zL~337OzfFoW9LX|VFz^b=X((cRBj#hdQ>cm(K4rTJ_u^MbsA|DGTP?O6y#w%8$ zNFSleMXov8 at b$#^x^74e(X-!vSo`xcp{1NJjS;DW-FH%9z;8&C;Or9ieSwbYI{2pCwsOH^%6gs>E0jwJZ5c-XOq?f>O z=OL|v*WMjoiUrQE%=gAOZ)~cUz at ac9+E1a9VXmmj@BfZ=qO7bLRiHpXx-dXMod2_^ z$bY!h{i|8$L at Z)$Vq;?K{9jBNZPXUTQG5a2!GK+CYVwXsauG#g=#KM>YLzOHIp}s1 z2R9!$lR@|S!Nj7RgEhbXTKmtu{ePGZTh44t%s+NDW`R1{nO*zjn3-N at dw<_tumMfD z6C5DYj$;fJBYglSptSo`7>oyJsxWH83CI8!hOGof;A|nOsrFL+6~P;@cU89MwlM?+ zCCwNG9#)}DIJD=adbO&}ZC&Ly*vw8<=E?tQKF5_7)n4lyDnN_T*)P*Fr~_d##oU(7 z#yqmu=vuDcOnIg=vCiV2u^C~KzyPc3xKvTn34ujCC-Fexmt!@|;HnFu%nR_HD at Up6H1-~$b1pEtWLVlE*tGdr<$)qiHRGF>r6n|CvQ`-|zWtCFz)a_F%MZ!}qf z1|=MvwihK4^1~Id;!4(auo+QGJI|}j%uzb;ZmlW7#x{|OlCd!D3UHt2!1 z>;b_rZ4cdUtT>Kw2Pu1b7>ZWhLmRM;)q*+ at fwSf&uTpAKT3Bq`c014Vy at gL>ofRT_ z02pN}cRWQBwpVo*-wU)b$FYhu>SrrIzt!otKXXCNl-+T=^^`WHF}q{A9__rV7?*SwYH9=XI|X&Fa#@97lnDt$;z1 z{Q!jCP(hr~B$w=9&i&EnyZV`%7o3gP*Nb-qAlyq8efvXw{b$O2(zjJ_KEK_m5 zkqOX%0PV^X{7}8`(m-frdaC!O&lD}B-@%8sp0$w at s<4gVQnwFM&kKc8-+gUK={DVr-&!K~IEH3vL zKoGJuB$YX5Yotqi)~oE2VC3G?cX0pg#6gB*?}<9L^AFBTS7aDICj4RzI at ZT(JK8H4 zt;c1VH{d!;6|%@8!X;Gp#~-%w&QTyf{#)zsAj at xn{!-^D8%wE1h&01wO|oPgWrf18 zY1An!=X}s#38r}SQ8`RnxqZB}yVEE3$1GXtd#q(>_O+h;tM6;7boF`)+JmyG{aBbU zz<4E}MBK7XXgPU;^P~(kiwdmcMW0I2Saw)Pf79~*+UK6m`>T?phW!5_q8R at rd#9ze zz>o5UHctu%EUD62 at B?)tP`MYoSv4+l0rRjJ_J%-5DvQ}6p&I at Re*`jH!K at SZKU{xf z%%q at YF7&fW6Ssbw&G_!LnfQHv-TmwZS^g;>zm!isXpR6!m4bDs zw}Z6M+%^%fe(2q|U2?UW!HTH^rNxM9xN!8FVhHkwge|6-s64UCQFC(78Eik9KV;uT zevLSR(Y3*ao8PhrC!}7lp^=2GO#jMj=zty1P&3w;ZWc!#ZrQ+t7gmHW0-x(uM-5 at s(*9+cGY zA+UpFT4VH>+pHQ*OZDu9o~L(ViQGw&` zZ3qAZz(wum2Y`^mqTGp#jP)8(SE at 7E<0>t_e7ZzMr~ul&!=;9P0u1 at 8D3>u9yOu)? z2JhP_UL**H35#o(-=iu-__pa&MUM`KF at 3IIYh`*o9qlHw*Mk&JU`pFDn~G)kM&RMa zI*rn<3Ho5yauUbspX`LC=VdDAiYF2z)+C839;5Y>Y%_=@GBNVdXPtiQ^*Qb^+@`Ar z{RQQ+ti4)A=FAxlF-+`Y5AMQFc=v7ok-@|aY8GPGLymgAye_?6RzZ<2eM5q+Qjc)E zjAu3aguyxp1}sqTa6#FlHyd$Hw8k`n+!CB`F8##Tp`+zQ#z%+ at 0HHxlUT1r6>jQBY zhay3E5 at U%2QKy`~sS;H&0JT7;Vs{XMNZ~yWkD3F*%0AS+6VgJ&^WQA4``{?PmJsYx}0lYp2NX z`(Xng$aP;7C^PQM0{hWl32{%fMWjLaj_0#OPxJ4%}p=dSOc25Tsc(Kvcc&1lyMGhcDfY zwC>>V2i3(sR06F8wn_5yi3F?(#%p*N5%F;2d-V$WqX9ue> zr%@gw>}<2D)5_!UO>sdPt78Ysp8XFZrxjGLYo~zf70rUb#yqH zvXjr>9E;!hP--$2k~y>vJbkf7B{fSaIONbNQ!aZFRTqnd87r&lL`k at 5Ee371L_)KE zwNpAag0PO at SQ_h-l3{+1S*I*s{OKzr)oM}JHPmtq*?AJ1p~{hRd&@#avS5 zT*KU1hwkk!Btgj(+n^veu3k(7mhwk0?unC>?e?%;ADQ+HO6yDp at fc`p3%sh&g?~ts zW3o`j62F+jp=sxGr6q=4tr8T#A%wYu#on9eqUVOUM$CwK2hfQ$8d2%IP_-p*xIqJn zwUZhGy^C=7O&P$3yT=&uMl&DbiPOqx_Hyd_oW<%bD=P)|lTX7O3s&v=mZGdIbN{h;YMx;C60sWew9oNIe6^7lCcG26?obP&=^ zRAgB14^wHyg88k|PTp>>+BxZt}jI+Miw z?8K&7R(eS)g%JH#Udk+Nb5e`wTM__+pl~r4jr7JcLQ%n`kM63}LpIZZZXYBSjJwN# zrO=dzG>}WyiFLlg=_fFyzM`kTvex!v1$h(1w$K$R$EZc#>GwqmZd*DqgUIQ~Ua9g< za3W`96GY5d0UGvfC7qYt_NK0vZR8ZWG|{+eq5|M{ts@!3BV9r11otIo{{B;VNK4uT z0CXU1l9D8KByZ7F4o0!L%uQL%ikh=ws&rO}q{5Ln9#-zt8%O->7xu;~5Q`ZohzK?! zeIdqbXCi2E-9EG z at obg7jH&v7)gsz81=gI8K60yc|FR;!G02A2)}(<-HB%@IXXqB7XNn-qAyEhs(gmK| zP?y%nIn3HNTP at R~-u*7K at HlgF)`Za;U>zzYwJ0xGAVorqRV!X_#~r at ut(Okg;2{GB z9i&@BTr0EsW9^i)2JBf9wN9IqR4RLU*f6_B)k8Bjso$1zxLXyDH97diVNvxHBl@(1 zz-+ at KR?*~!6T*Rdr7TIxa0{v;{I|JpT3_?4ivsBx8~IDK4{y!IboAt&uNAS2~G z20t-Ky-BZnf_|+uvV>TDGMH6=6*Rp)EPG~I)6Htaw0yBHqxElB7+&ZRZ%BxXpwAL& zLK~z~2AZ^5BpwkzQKy#vwnDmqzVn?y+AuQ9gj5*3AADZr7o at q^-QnUJBd=KN_n+W~)Z1>NWsgjo5PXUy# zk`^1Op?MJ9+rU{%tzeotvW+;5DhTp8^}suaHQ9B7jdWADl!=~xvQFYR^Zi)HoGmm& zV$BnS?sTRT?}uy-GvAMo57b`9lm+p;I6y!_z=(yg0?q(R4hA_UId&QSp{~QsaRZI9 z*@9c+ZL8^MmBiSV%E&$UHKw}0I2+FPfnrPGfv}Evz8XeB at jb1OwMrAmz*I?`_r%SW zgWJfu(`bSf<%XjxjT+c{K0`@IzmdB6dWD&5(mDHPk%^oH$jDwZtJe5Zrw{2!C4;nc zD<0*lt6O^wCv)8>qMi5^9#d7)SHJ79(vNJbqvLKD{qz_TuH)xzUJpdSEQB!1!UuY3 zJ=vR9zmx(FMk$|C1ucRKWhv*PVxQE4m5XR}Kg*9;6v!fzjB?u)8>bm6Z)>Cszp|kaxtamotipK#sFroQSO!?qV2OM^rlu&){=^O2d3Ay#=%Oh&yTWu*txd!)=4g zSp5no4_L1ex4Vqf2|Cdu+Hz&~fpu8rt#T?qf4DlO4%D-Fu`bR(iACqZ<7BU9*|72fk zuWCQlP`&^ppaz at r!uyR|?;Zl(&hZWn-OlL_9v#8)t|sbF>({%scdr<4(p@~*D{LlK znj`}h)tg-9fu*oo^qhEXjVYrIvSs0VS-$2P^AsD(ObY^z`2}(D5oXG=GSBcl<`i?x z(^c}XtJJ!p5oX2|OLYd7nFdRCKjdZHDXf$fW1r#HlsSOQvJFN_v1TJX5y3n at TVlMz z0?v{~ux?@rlEMiJp_{C_4 at 7k7Y36dm=edI|f4}I$Y$*tY5md?#b5Vbi-|d!jUc-|m z2UQw at bUCKXg!w$`4Qr$b9S%w>8k-T1SZjwmmZsLRuJSVRLlt;T0^}2KEJ3*Aq at fy~ z{3Nu<=kHVO9)cu(vn@=kyLiNATt5%4AYIXKcU7%(hoM6e5OPW3ZL&#{Y_`B3j?Y0E zkm|SKRhQ=!BnowFvtfEq{3usY1mCO at p$|g$>sdr|O6{oVMA2EtH z(3;;AN_gA2jx(8}pCGYRlco>N*HG$^(UZYYGC7i0UR3DBvk;M at ZX$JOC-;%Yb~ltb zGq1>;lg?)hS?4G(#IP|hd zHf2q@;g z4^cB8%V3bLPI((i+4WA(sH{J4onB-f;w0Y`Dd}*@ZYU^%oV6Z0lqpIum2k?sZGk{f z^Q^{;fYH`uSQ8Wz*<_|xVPa(HNUVKkJ6Ad-3-iz7G)5XU_ at u>_E$FX z&fk^tF5b2B7J?>=)bfwAL-h{5;W$QsZZ^ye^qED)37|a?1Lrdk7C_;fcoFFX|DZfz z14n<|MWj`zrK40qhnim9#*>59Eqv{?5Hc2d;&c-y>w*rsi zA=7Ja42;g%rGC6rgfsg!>P!S&4)3DZDVREpx520Z)Z`Z=Y8^M^@lxu{4GQ~6v*O?_ zm(_2KBaYPxE3%K+()INWLLDD}xGFLD#ct25ck?J!ldOhiELHdQAK$D&7(S4SDQk-~ z{jR`0z;a0YA;;#WMD15sMYFL;@r~Oq1``vmA}|A?Cc;a^Ofpc_C2dx?2s1k6Lcv7x z7P#AdK)JaI3I7>OF!zaD*2|$g`G|_5Cu1)B!@zTcw%hHO;0$L*Pq;4)=4O=V;=Qh5 zV#~ZT9i;_GSr_b?usH;3&#V}UYy4w)cy?=aks%e77JsExQFu=C(+2pXEu?2s4(g*e zT879Gb;a92zJ+q=2`n}EO&CvEpDr~4>85;87nqHCsTrKHb6%o!Q~UAt=#0xz%eD-k zWm?Rggfi3>|0$z4SwB;pnZnN;(JR!K?<|om*d+NE

dk!v!&T?yzWfYBEi4{fC!8M-b7IwI-mV^|)Jb{uHC+`f53e6f&v|LO!b(gWH8qVN{9OR`zj zR8=+I3x3_o+(v51T>H}w2 zPTcfjjlwwcTWD6eQXtRNM2JQrt**cXVE2lIj=60 at g5s7 z%-Ic?P|MG;E0 at jex0sjhx2;ax+5ErxY~oB3B?(2c7L*y&L9TH{tFeZ8`Dmv1zH1 zV{ColwR;kmx)Gb2qPN{$Aztn=cY{RN6w-jZxf!>HJL5pNvHu8e>p`T`ro!LHE!cnL z-=bQt^F~i?pSrT$oy>j0bNWdgd&TTW9bR5i*_loFS%h8}>*loYh5DUPXj-||qTnIU zICrBlJ^lv7eg3Tp!b~5)rUMED#Q9g&W&IyBu7IJFv!j8L^M7PqVkr}k|6(zjtfFJL zV2a|qOa zrnbTe8`y((pHnhA${!uCmJ)gWo!N(WI&R$kYA`XLCJ8!g{0p$ zLl8d%2-(G-Nt at sEP&TCvhTAh at nk)f#fGyXlx&x_zaskfYRufH4rZzF{!_8-hSMqPB zr>`K1?~AGJik8uUOxL*FxjJEAjcaCOa`|elZPnr{4;wMnQCkn%@B?wGDs3C^d^^oO z7A=lw8kFg(tM$FC-st|i;UEwyR`7&}ZHNcy6&tl0*JjOmJti%9l97uX6Hb|hmL(^( zH0AIg{JZ;cz=viSe$D7kCtqBf26N-kG8 at c6Dz7k7>EtLYm|567(r6J54KZiUR4tl+ zeh6ME=Z`km1G+cwn at x-dKa{NX$t2zUWde23(yn{3KEWEj-9=(8&r&&kF2npgAD;n>^8fg-sbwyx!CNnfdPb)Smz*Q5YqVpMrq7-1i=vc_^gx%y*n0>={#4_ z2(7~$zIQcE@~hgu&);vtaW(R!K9p-^&cC%GW#nh9^|xC-VlZSl)E>B0L8BmWxkjCR z5U8AOHBw`Oy-KOHr*S=&EWeFZtqx*#-_38fz#@C|G#nhtC14A%CMq0uZ>OWpH@ z#FpPdwV9lgXF6MWq8B(Dpc563h;tW_3#i|2jmZq>z9f|*-C1}8xX;$`#yHACPPknI z&?T0#bv=XQOU0o-e1RT at c%{1#ly(LV-I>Hg+GH!P9g8uTNp2xU-SY1gydoF^Aia2< z&p~R{6MFuDWt2o^&Q0y9Nuo$9)*=p1+&r`xKns4?udykb3&QB`P)lSP6uih0~ipHG7Jz9^Z)w7{&Rst#p*xo zX)fGw(m5>*H7z43N}dV_T?Y!8N#janu=iQxFhWyGsbLCL;~5(iNA>p5>7_&65}PL< zLA?*e7&eoao2?_Gc!W$FI@lsk*c+C`jnyrE*??#O;&|WCV55E*&}4 zS3E@*dm34I^90(f~?^sjJ zI6uOFak at B3(HDQvKntPcmyY8E-TKj2dVUgLzNL zVhlqIT(;_HpnD5qMV5#T%H5nED` zAEkFU81*P&hoEd3sd0?DOf`2#Ri&8La|omCGT&1QYAj at h;DKmw-K5e6I)gQ`4oj_3 z+=w at a$P~OO_n3@{I|HkNXB>3<(O(n;qXL6T^-zop%q5t6XcabOmz&n0&6G$wgJF3r z8zx}UhhaemBy#)n%h_E=V~?=visdIF3S2qYq)f)IlA%mb^<9+akwHN+aQ_Sq7)4mz znqEAvp>b>+gN1N%dVh#cOOK>Pqlq|H at _BMMY{Q0?a~H)pg$GcK+8bGyw*TI=V?V?m zot4{w{Zwo)PC%#3-v4piUW_I)w}RyZ-r6Yd9n8P?qfhUYD(u7}Iu7oZM|O^q@`6x!mGLg>vX?UuN3boj?3?&w1;lvEAM-!Rvd at 3F5_p~q#5~3kk?$Aq zUtdf=JJ-ff!)<_MOMYqJ8Pu44_o?s#D!B(m7NqU36p~t9+SPy;VC8->EPnCt%jUZW zpS*$Zm0Zb1T=yVDznUcuhFvld1)=B^e$BGexG0YQCYe=Lt`LtDuEe3F#db?>cf1^TrF at aY z;kO(*=tbBavES_lMl at V@$Q>gHPujXWNw+iYNq_p|r`H2aZbSivy5Pv53|q(y3un?c zDSnyLXqq^>-yH$zUbY(_I0BtRA9d-_LBhJZQgC(+1(0?Ly>S>gmK|_c*+DX;ABod$ z!GcH7#N!xbwG1{#NofJuyX$?zXt*j<)n6Ny3{FrZTy6gF)&O1;Vo5jG0YmBBXYbc) zXuE;QH7K!cmnqz9htt9^X4MI0-6+`{7TiMMwuOjXrreprR}??@n5Ykg9+1rczO`LC zX92t0%phT;mKp&KSnrS=PB;VV7piVt5z^mJ zGE=Kt zp;A6mwpn0|81&vtYrfEuHBtfFxK06ha4*^8p|fNOi3-7k!?8I?3E{P{MCmIJ1P at ZW zm+ZCyz^Uis9&71^-Yyl&hNpkiC%uuBI`HCs)eHG_#QKE`+%)B)FwYfIS}+7gQ5qgaBhQ8Ylr$(EWF@&hih3>@B0?8CWf6Q2^ijioEt zJ%CiRID7f;ej4IKMeIRWLpg%^?ow83nwQ$ctytjmg>3qFN-;wr-7#L>XKQYb^r8=9 zZs+cOcmyh4?JCEzThx_}y4Kgbb{l3o#~C~Tg(H}S`8_FHYvpnU&vlB5^biQY9j<>s zgJN3a3pJAP5_wQhn3t{F5#NO>e|ixb)esrcj$_0+o|6OKiAw~TBRepNsD#v0x^L0V z)sViv{^rImjw<>+_!nc&hyLF&=6^;1KU1)(mD5iZ3}0E>%pw>Wm_04mGzyq)61mgul^YeO%pcB2JNqLeEZ4W)n~~mmMfTyG}Tu29d<~6oZ~j+ z*Pm37CD!;Xy1bL~S1;4Nl4~qnU77?(coyCG+b-BEFwe8Uwqq?7~c)?zI(V1Q9ZZfsPBbMcDmqeaZMCBJcf*2=JB1WJY*km6Ta+j at __M0uD zC#*dlJ?k8a4u2CE<3D?or_3ZBKkMG+RqCwWHMCbP-)DN*MAYF1Bm^mA}squ<$yA(Lgb- zMeOEB;Z&U7IG(Lks96B_U>UGdwej1`)q1T>QUtM$63r&h)iLem90SNe+Q<$QX(Jk# zPVPckC{TJ6<_9 at Z@1qlGLll?@x6#2im^=IJ!8gX*!>Ac~5|HG2KOwqP??BOp994#6 zTS*Ua4>2ne3mCM+(|&m75|X76=prt8z`61V%};RQHmywTlqvEgLv1%oY)|Gcfs!Ha ztTxa$Glth2Jaoj7fq*gY`68L)^bZFcP&L%=1z|ovhaJlPv9`Tb^g;Qi8H1y^9yJW$ zRbzU5iky?>5ifLKZ_6G#60V%*5Mn#m-p?xB at M#}1&!tPwB~;}U>{Nb(tKW%d7rv)Z zlnX;2 at zDGovk5c*jg5Xv{1fDCPo at D%8&;lnE(Z}#lCyst%K?l|Vzqn(bTmoGn*$`3 z8zS{_cawgb1WP6!vO`WZSP5M_wb)FYiCYMe{|ecFAbCV2&4UNCi&}hyKeC at yd7+U- z@@0bZO ztzm3$PVhcWD>6~|r#}F|QHr_s^#Zj#Jm>j-;HVhcU%y$b$0yETKfOm+NxeCZm1%D#n6qi6Sl&~l}H37 za_+(mY0oo92L#(ol*1LVxM0t3)O!;O8;46W(kzf!=;iq(VhUQAtwWwtnUpN>Gz4HJ z!RyDmEO&Ty|9-!!DeC!tJ)i?RsOy*ujXgZl#rY(6J-{m2PaBqo{d3^%zsA0XH_Q$SRW?F;9aFJk-^vIKS3^$+t5foF%j|6QL$SeD2GXF>%{aqS=ZX8?=c+{2raaT zj=4xOfjpfxrlZyh`*|eOJq05(Lk~0IO?BmkirL-?Hy|TNuKrgdyJ|3HgKoFEC?Stq zt)tPDRx;N$Xg>CYU+D}TCg2xwKXV9YG*Jhz4aiStLH?p|woWEsG+O}|vRkVgl>Dvm za~i8Qy+|U(COT8)8spwi3p2irev?D&hc6mvb{>}&WbcUpPI6d%JAKGBPk(FHSa&|y z7OGH7>x%QJ75%D}Wwo+)C7Ky=5mhH8Tjn8mlErJr<~&SglMHle8c%sa&Z at 1AI0U9q zvxXfg;0#vL*nI5GP>&Sx=KDpxF&n>CiH$nDfDg~R(~u2Uh8oKkj;jni`9!`PoqDQK zr%lHl+f`@iWVE6+;(`+5HYP$qS;aem40>6Gdq_>0l|W8H!*#roMu(kZK$7JpC9qb- zJIGGOJ5&N(TLdm6f-^YKjMBO7DMC&-2&vERorsV!)6+MV=4_>9j9*bQFp2W7#bxhfTE?u!RvMZLsI@ zaw%hMwhIDo`C7^doYZzj;JRlvfe&)iu#STJ<&Sl3HtvCxje~W-Y>pbY-#G;11+adS zl{6nt;e}nVjmJ+zW$&Fs(gAyZ{l5I>G#sPRoD^O|o0p^-SRP2 at CZ^Lnr5u+>)1dWK z*{jj^eU3$eq0&BKXCx#NfzO}ICb;|B3&9s9H!%v2>*Y7cz}#Sn_&5S`Vq8Qba;?6e z{s3esjys at g=C7jgS-ZGPST=D=f?)dUuC@=Vy3J9lV8Hh<+Me}&zn=|{TwT&B1;^xsp8wq40u*tM>V4-g9t8j1>L=1^J zX#5KN3h8|OG5f2TVC8&HV-4HIkcVSr$eyE`DtS6~wqrkULR)Ttl5XuWD752a8zK}Y zWA$Oxj*JBQVih~fb~7TtQj|Y}kB|oI31j{6hAFhw6#D2WEvhNYDAkqfrV)RpoN$x0 zO`wp~D{8g#y;-P{>YFiq}b`6b*njl&MG6k0gc9{m6;d^#VqsZL-&-GiK2 zdTmZ(d4 z+qR7^ciBdlZQHhO+qT(d+s3b|%YJ*m at 0@t=?6`5yy%8(cjQQt`H6vG!%rQpVig4j} z8zdT6TV8HeJB`Hy3YcgX4S)8YOvUQjxonLSv!{LcFg%oi6l9NIoO~G znY$3vyh41mSibxA$NiTww;i1u3}5&!DrJN=lxWlFx0`i`ENh|d#&%ZhQQO$OBkI^> z_F&rDAjeaWsg0OQcCG%NAvo>!J>J05lUsOoe0~ja|q=vq` z6ZQPcm&L-%BX+4zRf*g&WcdvTBPac4QL?DJINz`&(K$JyfbUIcf&GS1j at Kx|s1ejv z=)Q>DX=8(%YoOg6T-i(d at XLze`N+_;t=OWFy4#bfaA2BsD4y5aK6!nKSapJT)n&gk zqXXNq!Tt;+*=vEs+kZm%=v1 zxmcD(um>@x zJamU>@^%&Y_Y{7*C1UBuXfbmc5&4N-IEuvnDd-&5kk{~Y!CaNnCvL>_#{(^#pcO9< zjgygjyrD^SQ&sPfGY~Ql9;F24r>Cq-j>)DOVl7u!E#S5flv8xczH>A{qyeMhi zr*{e`RzU?q;1X820i(U~8+)uTjkT6*;I>fWGV{RA0bN&Elywv7s4&(cn3&R_wR&_2 z)9Bt6iiV})j<|t!l);_RYuZnNp;IsH%L*?#u-H&Zzo03BPmJBy1?87qoxt0|;Aha- zvE#mQ7`Y at lm;p-U`0sy=FCT`jE>i#p0xCxQzXKuvjsX8Qa=BDqQbYURHrWLO)}&Hu zUMsu-)$FIipu!Leh+Igx)*@^PC9iEDE?D>9cz(ZQeDLaf6*8ld;$1vH{Zh=yO)?%b zh3=FI$?%%xKi%2&$msb}uj^^IZ>U3}qP12b!@FFrRv2~T#E0!Va%pY4Enc2u# z7Ao3)kMP)=$785V4w^tu9^ zC%OXLlHg79VD-PQUMGIgGx}mSMN=;(uTMLlcq(8moCCSuE{9+JZ~>DVT7?DQc%y(Z z;vGq{NHxu-y-O_6Zmd*3h7rl{@XTIdgYoJdt*|ItQ4wiFrIFI93NZBRZ3Rbl?ez>2 z(j0GxE=#oj6m4SW*uIYHl-I7LseEJ!g$IVxvFJX z4Ca#-NMi~@rYQ%?LFw&JL+KqX6wS-3^T1B9$FZA_-nadi|lQ5 at TLUKXA%*q*NekW;~Ux?}*O?LeX0L3rj4vQQ> z87 at F!ff_rPd6Y#G5_~qS$Riyr#OMHrz0o8f7yHEYjNN0vuS{m389Y}M$2U&JD&_{S zV+^S?9O8tBO-2xdxcb43$uT2tN1|qD&1iU_5AW#>>A59_$!Dmuw0mZQdR=5~Z3}yc z@~*3t_K> z*A{c(wA3!n>;ht!h)g{>E16Bgx;DqaD^gTj5Nn<69tc^8yUUAa)0<)_(poRCzc1gc zH+_;@c&(_b5SoBS+Ug6*eS9Im0I-Ngwq2o|@@RCZ%cThS#7(m8Z*A&|czV0qv83vP za~pLjJ;N|z%i0|N^6XZMIag$KR_r#)N_d=b%)P2Mdt*~%)vLwS)rDs1A$^9c2y?lx zT`iY(zd+$KGqc=G2tFP6_zl6mpcz+vb1;r~;^tzE0Pu{}A+jXaP*?9^xF$dA#Hzkb z at zfptUS8%9Njg;eVdJv2DqNYc(YTNCivZ8uSI>1n@}@l8u`FUNz+EnFRopOwqM^P5 zWXG*b$B|o3CUZ*z&0%Cmu%EbohiQ3T7BBkG_c~`h#e`RL5xv~EFKMX*s*3%Hx z{sM%wus}fU{}(Y@($>|)(aGfhlkDM&q4|cAS$EQr`xG&%gwt=35p6DES`P_PCua%^ zLCdN(cS=HZx-?}q at xnf0mgg-Yej&bt$NJvBbO=_C at n*@6hoXr%$(DXLoh>mE|RI0C=DM&bo=|~>|zn+X{%~H&FlNqXd zQftQZRCIs>>ebKGeYTd%WUa_Smq&^8g*D3It)1?o*X$-cTdm+YNXCiYg0S&!lmngQGvFc9cxMr(+PbD_L;_lTx zW`zrKDz%C92o*Mc%xJJW>t&+J$29;f4=l$G0sP& zq!oV*;~%P#M4wNJFS8l5sWo{Qz!)-Dd5?=p{o15l=4|UwTBE}}iFhzn(HWE4Ez2!} zZ0lrA|I&U8l$}S>q+fx9G#Dp}0$at}M at gpo(H_`56eSX)T^TL!Z<#O5ZE;j>c!& z_|>-C{`Mv};*C at saLQ?tlr~KtT7hb9ww9^g;l##pOwjuJX6x>;^X<*x_z8Qd~$ zUz_4K^62WwT8tQk!e^b#I~8lU%0sl?8#HTw{HQ86UwLOU)HZxLlNn=j6hdn%ee(F* zA at 0}Zd{;cTXV$vf-2)v%C~LucOsu0SKf?xc=1lgP70aC<%Y;#JtCWtK*%C!Zd?~<* z<)vS5z#>{7h&mH~4{kNLs4JL!Sue?V_8h#kLNFXCC(-acRUFZ-i0f>gU z-?gBgKYE^Tdw8FQBGAqwk30nn at nXjSBdN`VeGInNtHD=3Mi&rINi zlfNeANZFL|CX5iFE+eOYhjw^kWqXn)GHdQApf|%>bdST6MAq7~=R#u^`R3AmxY5`m zi{!Hn!O0EAQ7SfIl8E`knE1}MOn<1Jc!w*#2Eb=gvcaZKyz>KFNH8&pu(M;E*14_$n?d8Gx3ctdbyQF{gS1Cl at ZAc{p|`<(kS)Uv zo}s7)m3qWh$Cmkk*)d%dvljb77_&4q(Xf}5OAqsc*EO`HG=}(w4qj7Y9 at M>Hz(leG zzIW9WyeqJ0HSk+^7$34(xy!`fKPvfygC#)be+6ex!vDrL{f~41B9J-l^P(Z6=+ zJd!40B}K9ln~MWNIWjU_7f=e=i04Y_L!Du%p|KV2Sv+LJ~S|0Z_aQIzM&vM#fvY}RLuaQ$_G<8Qtm$dtm8c?x}e$}D!QQRU3TOt`j3E> zJSpsq-s0S898GXbKg+m;2^<&@TxCP$0V`%p32O9Ge?`#j^0C3VYFIHr&p2< zWUx?cB2=oFQ=}IrW%3y}t=Kl*+DhVr}!d#y3%~uW+6*fTp)f$Gy6gE=62W(0l*+ zo{e^1ncfZMV8fTg at +eBfYt6j}vPmGx&yKy#;Y)sfa}(Y$mMlwqD|dRfP~)(EFgTn7 z90F4-a*k94^lG at ZHlt)IspeWTN)8t8=E>o9Ii>S^E zPsm9GFe{zq$W`OH&h7!p4XY5^Q~E~UjYEbNG)6Kd&vSz;ZJ;i!lfs~Co zs`cL=gT=~(>fZ)@*B<)Lv6qRG2U?zX9?Nzbz}^Ac!xU7xqS_7wXJx2!)6Svz=8?d3 z4l$1gjdE+f&a&jI^Bt}2Y5Jdlh-8 zt~vK`bxBvxo3(CJm8~0s09bFUBr1wBdFUm>9s;*LWopBBV*YV#qOLcJlZxy|9Znm| zn(I^5!JU=G0M0AVbEqb@)+#j)KO3Moki!pZHFbyB_4~0GYFAe6G3lqQng%?YI%jIV zXl5-IW^zQ;^&BA{3i?)QFjZe@bbzR-G5RqPi0pXJs7hw-h z?U)t2PM8&Yc34aI8wWfOgW?@4yxtz+Dl64uS4)k4O;eQ{L75}9vt7G9Gr#p zm0N9{sslG1-#9 at g|2C`kP!rrWNnmx+GBy4T=7)&Snnko3s^4`s{81okKIi*P`GS^f zA;FQq|jE#i*mQ(;W|>yVF2Avo;r;>JQ$_@@ukP zb!Ktqud#!qsw0ARiNO!MqF-)^mH9M$u9+2sF>)ySB${x`N~b?b=11Fq9`j$aBy~_b z;?bboi&asrcPD*3SaHX?PgOPQXz8RZR@`XlX?92%@^0iHJC6U3=kH>4LriE9n at F)W z8)T4?a%wEnx1h=+-*!7+uNf6E+?S4!N3SqTDP3x)>Pg at Z{_F_W`9-Tn0)xoY0HfL- zUtki^L;Klk z(tsajZitjNcYyTxGzg1e%U*z8USNMj1%kLR7lpr+OOiShf at p9zBpH5fzcR0E-ek zFjoki3Xm$L&@wbt$;sprwMappAK`?w|%oN+#oJhIn58(=wq{|TZ zX_ESpIE?9fs;FzMmQJ>h#o>T`IF?Pyf;WVrQ~pp(98dhATe?7)*aC_~Krrd^_%Y7Z z&$u7BF~P~$OBkA$GGOIB>CL!5U^$GqxkV_s2Vd93``Z?Gg~A>oN**DO6A)7I&-0si z^7$495=p^Fk=vG|=U0bL42u!0g_yg7WSlGd=gbu);Z&d4vFNp;CR$*Nr{opll!#jB z?6T$v8Zw8qTT<6%a>#8QR5w+%j!7oJPE~I)4ejCjA zAK~|>1adxWL at s6nSD-0hr>aO=%ur`acaYq65HWo*Lh&p>L4mn8|dKxGN0kwzXy%Y4>aD?Tw& zx at XpQy3rNu>K?XBb~PO at 6e%zHOgf6TPK$?PFLH8&wrTRXBj)KwXT5C*O8g_+TR-Pp%r<#l_GGE_iNm(9RiKkLB1E%F zmtutx=`I?Feiym3ymZg4VwpL$&~cYq9UijutYyItSpPo^D?J5o8~$$>vc{E~>X5g;uOtasHSrx8v`* zb!PwWSi$bRRO+m;cy~&ANfI#)W7_a at 0Hc#43LS3{dx=|j;Lv;>M~gX%{Gm2OtSYdG z%joFVFOPnDw at n`!Vb6Mt2C0#jZh((vGp4yxQOTWjhb-Pja!J>{=_k-DmBIWjS-Xqm zhm1?p at HfWAd{jTe5Hqg@#~H+^6Po<<8JO%9u6oi*g!HCynqfK${kz91%z>=fa{Xn)UXn~(zHx66_ zhT4UMuy+W+&duiZ6ss%Jq&reQn>vbgQ$-pK3eBjICbm?$Mf|gQXp!(JBfJ%D^XOs{ z1Y$q)p->|cFwvy=KPJ1AgdGw at 9lSny8b|P3MbHu6s7Oj6 at oSFqFF6$y-R45JBa at 6U z^RwK`rWv%fNImhcc%s&}N3P88yKZg0?l*)ZM1_`p+t`?nn;9=f4#!E z)0UlTJnHBr+eFCvv`q8S3?r4JQ(jcC*Huu=Q(9 at Duh0!uP+kl+w7CqIT_?O*x)BMH zci)e#E{Y!BHQ)#-`Tdv49NGCV)=+SKenEWIouzPvwbGRVIv#9_061^0dj{5(m0$mW zDz9+w3mm{eK*1nDKn(xelwHZr?SF)fDu3I*{ZGywqBJEn^aG7w*~;j$N^2k_5Es*> zAgGaKLetvJda;PE?yH?6yuzYmCOBsPp5 zagzWCZh6?W?GJNutU;T{5`IL*UWIaI7>C230I)org2-rl3li+7DBT*py|xLhf_`3R z2079IIn!8N6+(Jkg>_^%HbR+w>-^eU6_C=q1zkR(vBsxSWijVZeY4RkT z2_0(X5fs5bx{9DfjLy9+x>ZwWEPN&V1xLk7fZIQ8ZHpx9gTR4+;8FhD)ad`Twf+Bn zhLV4CpAt`2j(r;(6SQG%VBm>}=CC3P^gW^1gpm~-k_Z;)v$h+%&cU5WXTLzd{qx?0 zoFNp<@IEi%9KC1PWq)#HHKxow at OJ@nPq_h~M|pmJ->CiEeDX$!1mw4}f+Pxy<@uST zAnrJEiqeM6A-Z!5WU0aKB*6@#x=lDQDK9#ua>SWeN;(OvYtZru^Eh z)0s0(4;q~CTFyD at Iai`S>za(qm+%rbXCJXhhj6?$wicBFv-H}mFaMpW{5EP4YUF=TESfhp zm&W(fYxoZn3q%`7 at k6JE7NsvDGnZA1QhQW2NrJ|@*h#l(8pm1G%U(LUSoW+Ux9pbS zJN93!hwPhq@>Z>5t~zS8EOU6bXs|-h%Mo7XNAZ*CtTbCney8Gg-h|K=th2-}yg at p1 z`E4k;1YX11|F9-XQ~d*2qlmC5C9zaX#d>msu=VM{?oP5R8aH9d;JYKkRP~ylmM)xh z at sR`LV&!Xu?p4KTRtK|@tHQ2atak^A{mIh6L`6Qdr>3ZGla(|k7;O5xXZnwj!w&`- zaA&JOhl8i>S*D>n3Iu~|+(iti^2hjl1$aoKG&PyY6%%&E at d4g?F-gz`_g9`)VLMxk zZJ|Zy>$fvgZ`GNhMV5u at av@e;7e&{y3iHy=e#*>NwF}*ry%QcIb8QE;iqhV)9i+nI z+R?Ds6~#s~+^MEZSWgIT@)+v0ky45A8K;9I6=yW&#z^jlRp|s1*KO^cOj9<>zxI8l zwUuqvmA7Re&mnl6 at mpPN-Mqd;^^e~rNv+JN9Xl#-wn0*u1UeVbzgsy)JZG#mRDDHI zjqHi`2yjuEaJF~68L??^f&o}pW*{;?tVh>Z)2e0WD{1G`_+w?Aj36|PmP3v0^Cw&F zfk9lu_DA%razYSA&}?YcdxjuYFe~-B{j7I-`TYXlaszr-%J%T!;L5_u4$?vdnCLPv z4npA$M`+3Mq<*c=%dBu=(`ZBb=^nD2O6?V5GZ}H9lC+i6O>OjY4!U#QY}CtQdOk`V z_zsr~*gaE?P2huABJ9yk4_y|BpUDyWKZdh%5%dLjit;!>mEHvql8TcPPnawkn_0Bp zS?c=r#_0*;qot1}@rWzhaqU$W=1t-b30|5ZV?{Z=#}hb=i$nMVggjBltsXGYch_bG zj?zU5T>3nJ-m!_Uv|E>*Q3o1$?qCovhZnn&FX!(zr|&l32bAWFV$U`MEYQOUai%|l zd)G$KcEdly at r(S3S)ATDMX@=GyA&rp{51lk(Q at PB`%SFJ&?CQ97f!WeuL>BA(9Xm4 zZ91I89m#cgPBjm2cmN%#`t)T2aL54ReB~vjTxBBymM0u$zhTOadS*l~$(s%-o{OJx zML+BYLzd309=5$=UT_PWKNJe7WTYBDZ$?w=s5973=6z-4UlmGIyfUAl&&`vaorXX0 zn)tZ|$aRrdKgrk8x4ZyKiKsP$okt^e at BU#nLRNzP at R@aZw!uW+OF{Nj;kTwxgO-Sc zvw=|3`_iT2345;(PPNlIk(DOHfZx|A`2;) zgCQ-sW4jcu+^TGsM=#)#f at 5vlc)YMGhfcaq-{eZZw+%NP at _Q9O?0N9oqj`b%zU=q- zZXoz- at 3{F8P3UsT`a7PO&tGK5z}~AM^nZ7*1^D9$43&n%gGF% zVrW-NJw^%1q6mit5w_GEVj0}Kf}5U+Tzmgq%2j)6zQXe>pJ{MXDwsJpck%pMVRU(G zk#mvz7J2Mp9jb=~r8B?E at alW!-F<%kYe5kFxL?Nvy0G7fLvP=X>seC|K3)Ti;kPUI z1NXK^A-cU27f||xd4l7?<>P&NE4(o6Q3i?tm;Z#w7edrWdcGY%ia!9z%%q*5Ai!e% zIfM%R)QB$f-HLh#+hW`U4h;;huA~lKNCiHxN0ZEo#IaCRGEFWh7dc-fW3?HFdu1ju zLds&3J~|=9tUHeCwr=NBt}&Ltm9lq3v+bm zA>NqLaNiVUgOFy%m2+|7p)wQc97t%qT293fII7d5kPghllIc zcfoX10+9bYZKKM>lc)4D9%9KXs1}p|X_;nB<$X6EK|Yx`i`>)QUgkr#DK!;aJ=EV8saBUz$_C%m9KjQ^#gl;p at QiUnX81(X1kcz2 z7pK|LY at Mg2dj(T|4__)93M>&uW8ssqk_&tgdlHzT`~g$3=QcUiT}uI7Y-5(zAf{li zp|q$1C%}>s$82>~=pZroc;HA{&zQd0nv+#GGP#D^6{K=p8r7;kSXh_kB5kmij4Pj> zJ~)i-x~9}IVgRyxEZ!G?QJ3J=X(s;YH1#7_X`-IV2$ntLkA?(2)3s at nsrWKnLWVg7 zxJuT15iQ|y56NgY=_%q6Nqe7kUW)UFC at nd#*M^I&!tdR`rn9h5tcoqc34^?qt(z`jptOj8YK zr-_UV+E8Uh$*nfBE{doufh8N9MS2}JhH^?w*_aRVW3)tEaw4fsX!cx--iV5G%#`%Q zRD_7bc63=y>4k%*s+Xz?le%98_Jw%Uj}=G+BXJOLYIp=ZX^T29Rl*l}HO(>KauFq5k zFU=!tpLT1O)TIaMigxee=Gw9&_g;?HeDRbrWy=-0BsqrBSaImrmCA~tO%-lxD>CAA z>~&^gKw!npqwSB?)A6O`YsX(&DbW$^9Dsb=;VS?lKi3`T at cSUoyH$1B4V8}%eOVl1 ze;CUSmrz8RDnV^&SY~mTo`k&Ws3$*IUSB3KAy#ZfPc9J;IbO>c zwcIOPT8KahqmD9fphpqaq{uVb_NihdZ0b$?^!^3IP|TX)NE4i5;2*m3T%tUaSuUR( zX}=`t-MxifnTOVxHVqCA9*!^355BUyTk;qALI%D_AW*T2ETZ|4NPKflx02DP1Gv-> zYsai53f{OxneR#k(L?geM#cu9Uy3QdvKDWlhEMd%BW}sXfcZc|`dxL at S}Jme44w zxG>9EBZKD*zwh6-1GR5?k~fUa%Dyi5%`hRUx&oDt=;otxQ at Qb0F5!HeDF!XFecOo` zjx{GL4yzYxfgAOkEgNPN)+YvpBP5}3$Ak+!hVvVK(lz`L)p$Z9>$45+jAi%(D1S~s zQge at KJz>s~#p|uNs$kIOUT{_S04m#l at n(LCs-HOxpqcpcA1bWZXZCyzZf;FReKsy- z+PYqICezy*BKItVX(A&R!e0PFXxwovLE{I5iGL^_T}xTJ0Z>3d5cvNM^Zl>DMvo?} zI_?z7EJ82x zup!bo2IdGhSmT#i<|SpbRF0_lP1#a-#1fJ`n+205E*IKK;_gbL22dB3Scc$1EmR36 z%|?&2??MLzGjmnQ`SXfSz1_N<^tCcm3L}f<#KXqQpsQ%r3>Xv*YRh1vI>!!ljT&kj zMAZ?oISFVaoLH36LA4>8i;KyMbvANMZcmyQ$BsR|TH$iqiR-<^*}*PM$;st$VoI3q z*U_msJBByY=PAnhy>gs4 at Rld5I4ev}!>BbNL at tTa!Bodg)FvgdHPf8VSsf=yh;&r> zC``om4J at 3yI9cjqrV=t~w at 2-ZB-QlfY3F?#g%(=ydhRVMS?mtj?H?31+gN_~Pr-TR zq)YJFq at r*-hHe?@e>Q)1o*Pevin44e9=hV&4-2~mCzBMTH!LNp@~m82XOJwu(9Fj) zPhNR`@eK7%f?LU=7*WN2FS|=jX0|$0(ewhyH zu>>5RJSDX5d$R8gPjyqngm)H`NUIoat at CL*|C-Lw+D~0jNLC;18Irbo_+wN*J<>|r&nXanvNNiS9aifQcC%M|>$#0frtp?BP73b+|6ZeBROQ(>SweW$&3p}jl zKOM#1Y}1UA+R||~n_L_X=8D^OGnvL|_FHNOJs`WR^Fxgc^E~*t;rP5YW6d(D;@(bR zI>>h-AK?bO8#~bpxm1m{6(wp>?m%@+!Px{eBySFCqF~n~1cR&~dgu=5tK+Pckm2Ek zhm<6~lUaFp6oEbO>zo1 at 9!hh|v1NULv;dV0|wCNo9l8JsG^kLpX^3m;Xu=fTeD=VUZpBc#>vKTe2C-LYqE%WmTT1$&cy$^xHi^ zA-M?=qtZt#kmVg?OA}CT<&ow0Es!OPMStq(M{<_kmWM<0O(N;wC&IO3E~7QmtSUAMD66MkwIvDnml2GLVdd^102aak2B z&?a4JIKR4+`bV=9UWu9@@zl8p<(^fD9a4#A#J+f?N~5B|W%L&m>YcQJ%F8 zvkP+ykerW?>U%ucvCY3ivuHb`&;Y}}mTnn_?f8(<G_ zW*O(MfF85&L5nR4;Wx}h*vt&!*0F|0ckHK;FQ$Fmaj!-2iqx2{8nK>qg$^gC+!rs9 zl;~@iUtWkUEzX0d5`y;0ySat?T;J#mEL`xWF-8>UVvF+eB?cO~U^X1knh&WoP$VeJ zOGMIloUxb(;W9dJO|1PKmj8Tnq+-ef^Zi`PdO$aYpms=a(EJ_f7d+}*yK&gIs6pc? zC}+eIdfgy%7(wzXi6f6bQD(uXOZJV$A<{4{D9rl1xG&?Z?|fMaaV?ev(c6UJMFtUy zSp?U_c6xEiYei_whA31P8#Y03+twyxb`3A>ZkTh-rdmCou=yBq<4>6Nt6U=I=hAp3 z9YI^Qr@!YakJ>eRwPmwCjM`niStxjjThLP%a at I0l4Tp$t&$Ag02pX1LB!?7exk&PeRQEs1L at u8BD^Cu2LNwMgsz#n?@u<*JAs zKpeCSQd^TzOXD|(Ev;%AH;F&*j%C(*q{q;2bS0Sz)>bsmd;AAfcSAmdVpd(UYj at Vg zkuiAf;o1<@-&>bdJ6L@&YCo(shv}=NfN<>tv93z8J``(nfL7ILw^YR1+m>LS6~x+eS_X3lyXe}1X>EG;$4Ok(M_Ex9t;WhQ0j-CNqE8#+ zs3{3{J#xl0a;Ap8kO20#=l##6dp~1e|2M=yOr~5X+rbAUPt*@*(1Ba$8m at fbCVbEUl^B}@K3C-MfS>Z(VfQ7W1_1s*iPWjoZ z*l^_ofpZI(3uLU-shoWs91c3911*D)9!`uGIIA9x+Sn4~hQv$sh&v zmEu5=>4nN3S|N`x4@((ZNxaJEL_IW9GocH0B*zlKIkL$m*D!dRZtz{>;=dpsMPWnL zwT?&iQFmCSAFZdmu6Wy2nt~ubC3C at s{QY(KuXD zSy&g?p^~fB?`TGD6 at T5(v z+z5}cDvYD-iW^n=&0}okFfj3FL;>Kv)pW=Zxh3eqT?RV#E(Luu+6EykBlvmffS`4dw8ER_EYt?@tqhOL0zCp?zf+ zVc%x<>yYv~!uQB*mJoM@m#(m0mv?Jl~_xxxDh zjg51P^3-pOv)m*-fLpMmv~-38-{e`YU)o*4b3idVj6^I$omzg9q3v^;gYepTC&|i^ z3(JyQ(g8oAkJjFVY-5k+a+5u^^wbv_T$P0l%Uy at mgf-lU4X(tW_>&4e at sJ|Fz1)st z4!7n>v|725M!LroZpyn)jq{#q{HcJzTJ&(nBK@*Ij2Ren=&`xI8{J#hyWf+rf{&iJ z8n55aFGq~7NMh#5UYm%*@1uxOb!k~rF*HtrGChP5|ID;~d2NVCYTzK&dbRsX5PZe_ zf*0qAsDA`}jOE^<@4)a|B6Rz#6hV3{32e>z1sz7 at pKP`tzIVlJ0D$}cK at NVR?d^mB z`3uy5{WrDff3{I%EdHK`ZS8Df^KT+rjf#HllfQ77aO^gg5g5aSm z%q^v4saE>iEU+)*w=+!LTE+cR&LE>HzJUCa?`|4_QRh at R*L$31x14T_O#MDS-thZD zm+QDI z6l;afnNa1rUYz-5O^?gYfojz#@()wa(mIcd6j2ZmmOOh;s z^&{BO8Z=Gcj75JftPp2OL~ANY=GdA;s~CAdO`ebk?LGy_h(L<`374GMJ~WCaOte;G zIR{bG-4Yua5mV7cQ!sXa5e&j&?~XHHkMCphK(rd{2?I5F3mQxgxNb6*Zt!$CRM_oi zd%ZvOdH at x2`K?)RKcK at qe+;PSrn*Xd^t$G#Kf({rf{9z!9zrfaYc1SVu^q at 0DbL3u zRDx6(`ZS0sI<-lG?W9_7ijLyghIJ=iH5)OZUzz{vUrWyEe|*wZ+;&J- zZz=)M@~GkByUkv7+ODc$Ec34x)Z1X#@TYvu7 at b#Lhg%VsQo+g~m~8;?O|^MBwN0wj zb}Un>jAdO_iI}u>tgj~97A_z+T63oe_&Z8(cv#N7WSCvH{DKV*=FFtata_{gER6ez zDH|J--7YX{{LncIidniE)4p|PR>!I{<)vB#T+LSOMX;-o2D@}))}20eMI0_%4R`wu zbRlMcsP=>ixYHq0|J2uKkHOVqYanX~0Q_I~VxP&Fp5scnCKn at 5@zIAUxx8GF at qm9V zHy7=M9M5^y1m#eQNHa~ic^jKM;6W;X?Cvnl%1#jhgKB=k?w7aIF1Gvgahe8uf?y^T z)9ELVW3_M&qa>T2y^!;qs!_E?fXv5ZOK&!gEgtpl26gYqy{0_x*+o82Z`H7F07 zBI(8nCF;h20Ml)}vs?ZE6ooMHC46{{On~@~ zI%4*xx7-0N%CE$iNHEAAxdSVd-T0T(VK=f~%za4U;i5)E+>>S?CE?W!>{a6_!&IOu zI at 8KVj$s*T_6OF8ArL4^F!N~KPLruleljbBDoB8Yf4m{fx+#dW_(oD>LX-&{X;A}~ zt5axfOeyn7EPh(e74f>EQIMmSkuC_>;V4$ER)&g;>*Pd9#)JfzMye8Pr!_CdQ_f8Q z=!AoZaI8gRZbXh;9I2Z6mIUWf(PhP8;mtrm?ST90o`O0eP8)yXPnF~8%;Ez5Ib%3{ z8a{b4j+C)=YwP~>;c*yf;FX!m1DVBYU(3YB*{BxMw7SidcWmGEYI$N4cjiK}Tg9$PQJPs9uw1Y}LQGwFXwu){Ts z#CH{)8KCJ#dkWmtFmrIGrl-)r*RY2a*s7{u696MfNL at 4;_HzKn&n*cDukFlKw@?pW z*Nx28AGtvA$~_gIv!&O6qHmVDlKg2EVs_S6b9r#LD&~ti&U{j=)G_))mQ^}bVvQFk zS?uP>lQ+k+ch;I|BvM&Y2>sbeeVRV~TThqMdVSOhFG8DZQbmS=%BT!a_8!J}q&ma_ zfwte1kawc;xC!-jVwvlGqz-&51JxFHoN3GPo%Vitw&!Uw)i9V@;i{0->ddhJXWTu0 z9xH_gvFL}2F1`gLuR3+VH`8#9xPOdT(}8Uuvl5pk%`mT6E&5?Wq|yOJbX*u3W32Ya zfrhEn_7VcyZgG4hj2=9L_)dctyR3gJ%#3_>BhU=yo~T$t6%)LRGOy&-;BOk7Bw4bE z+rZYCWSfH&^8U{8kCa*rbq-?(?RGalhJh+Z^NO at v5tSO!j&A&adIkI-$ZvK=x$}L^h=8V?Y+Zh`=T373ZSlkXi-;Pab z$6u-!@yM0nn*n9MF&yw at 1}X%NmvmVCWXwuYqiyIG3E*1lmTG zX;b3lQ^~MBrlS+g+oj7z&2IxC=S=nOwVGy0dg)=Ryk5gz>m}|PoCVMmjn4W!ZtC`a zjO)+Z5jjVRSc_l}V(f8QpE5BcG!B7w1Q)3k*3hpC!R-X=?;(UwyX6KcA5B<>m6(hMD at heLQZ4JDuL$RhF(o3V{r3;fltktJH1t#;e+~L|Idef=D zNn)TCVe{BcUz26yjxxBYWLWcqPxw z7uSWovWGYvCN}Y>BGaI3L6bi)CGok?vw)Yd8?BUuo{s;Cu?ZWsUuH at PTN-9Qc6Bs_JZ~_q z{7R)ZIiI?vT&gzq(3d3dCE(;jiL;Jj at 8qY6ZR}r5=3l!{MBCbn5^b>e;aymeUuwI| zpjOiB&-SjEZ97K0>c!mS`!lbDHC5;cb{vH5k1d1y_~)RjDzrKqn6 at G{_U?9G_G0L5 z^MrNX2kCwz#D6^ej^0yav+v-AoN9>sA>;E3=-X&Hn!SKU?$D2j%kBbU3^)DXtvBJe z0CrYkyk-8|d*A_{IBl_>+*jZyckE~{w*$wh>5w1zntV(z&i4Uc^($P5q;rrr1q)3z zN?ewg?rStsX6b6xPi!W%P8WBCG4m+?#?)bgIksSG$P`%1`cCf+U z|M&wIhP<7@{FSYB|2 at +5{}821I-58e{FSQxD^p9{{R;yijrB>_ at pH)u4U?=8<`>$i z${9TjaL7WHLM-T$z$4x^+i;F0cIi59V|?a$&tb+0ygou(|=I&dbK=gCHo_ok#1CLcX3gxl9sp at L`Ofg4|iuY=t>R+(9D8Je><(|Qj|Q5BVJ z4Hx`P3GbhBU(7ud at fH#*Pw5aNL2A7LK8L}kg;&nKKU|89$b`4aUlcpOO!*pEmJKEU z_=P$>xlme0Rz@#tVW%0hGL*mzIwvO-tSRcQr;=T#Ds9-4wiG^lau{Iw=I-_IvTpM5 zk;l5Or~(bwFsSb(4stQga01Iv3fXdb1Dkj at YHY z2A~a{CJ at LoJlKzVa(xmwQ{IIO1XwV8V;czMMXu*PV~jX{AFbh=mSNAZJ5b at eiyidj zhW5RrI&0!5WwaL^*2sHyo{~wQQ7Ww-= zsn|){IyoEI8kzj9^ZE~#M~(WWD~dYWmt4Dye*-b5k&#`6;ZY)3OoIiGVnnH=h#_0J ztSA2XPYMLk5MtHcV)?ngYb}mU*P7Zd8^SWgIoCW^RAYZFGKQ7Rrde(;KQ92_YTfMR z9`MT-)E-;@6KklEFi(FZOtJcnIaVH2LxjWM#Tv{WGV8-ZeXs|}do3~k at X$xl;`Gzq zfA#}PUwaUN^K&bXs5kz$B)AUi!=xnB;{PG-Eravunk+$~MUR-7nVFfHC5xGvS+?jA zGcz+YgT>6uXfZQbT6b^v&h#6z{msrsR8>^npEo1V&8*Bk$MUU4JMo4+$W#&QP<=qj zMz%wxw$cqKyJlRB$EZ$2t{0v7y#|Zzq(htSpz_FhKn=E|qee}XLnz at _YjHAQ$aYZ; zcwv)K+VDOefU<&Kh=$2rWZW*tl8uJ=%|V8hjdf}lR`L#TRXonXjXiD+?3km%T-1&^ zV2(1S6&IhOWsjb at 6mM-WRhC%sfsuZhR at aE`D90LVff&g?QLGptu+IkYm|2`waL56- z9C6tbeuqW7 at VUQR zKX4fxj_7)YS7vrh*I9L1r)3aO4si-aZxj`h6Q~VTAxq|LEPJk>Qjw)d`w77 at M>X5l zWLV2H(*~M(?|A0(h?;UO6mQcL)Vkg$MEnW;tY3;+IQ#LK%QI6h*~#hZepR4SDq?U_ zJ==+vANdmtLp5FO_^R at pF)=EP=Ml|QDj4~Sm9k&z*~Vv5w9N+W)E at i2l_pwSS#R01 zGu;>RiHbCK><V$VMzN=Z&A#{=JpEv85Iouz at D1^ed7v3J8B4S-n;*Eg(iw?W;?0_O-sot{ zvZBMxg)1+x>9y?lys#kV}qtv1;o0|AhX_2pJ@>YUZtSCcp3VjX9mQ%b2 zvKO%h7LP%<%CRZ(N`I&fw0NzS#J}Ip zardJ04$e-9bp;OMBR{kilLZ3fJZCkS7 at v)&x?LBx+!E|}OD-8?_na4ZYoYC3ND!GP zb4-f1&h2HbAbDkIElbV4M&pXf>Gx8w91iSoX5wp|-rilmeSE3L4Z|cXGaWzf{rnA$ z at c9o3k+5fSx`w}Bc%UF4{Qt+0_n%B`(fkPgOn{KwS6VbO?_h*UF+dnNQ5+A^w>BZ1 zs(BiDBx<~v0B}dD;DBsUou~W6>Y3Q%O9Vrpaxj&MT$snFGe;K#J?eZ_4P*2)J!3V3 z(KRb3&LzO%!AkqIk|IiT`a7YFrfnPdn`khxk&$mT>^0nk%88z-vrpM5Qipm;+miuODO(R at bd5WCzlET+>E$48cDRj z_`d)E0pa~W-HiVvtknB=&S)FnlifCjFUR%jODfW^A-2;c6aCe&ez8$ zmJm$tgp{Fte at 7Hn1qw%7cYmflHe-H9$!R4^jgf5s2#cxOYoH?8BAITgV-P4{JjKdd zVM)n{zj}nI`q{0pnj28wVs44Qw1m~roU%mkPFHDSDSqZopBQCiN#EMGbor#$Y-PEk z-Z>dpbB?d-_KrZm5!P0v(pk8z9tpH|kI0FW$*oL{6jv_ zTs1TA;Z``B$UzKhG`(1rVtr8-Gp#3v7oM{2f}KJs5$&O#Nl8_eV8k)mVnfKJK~cyv zI;oOYu7ahE;CA<*107Rts(Vmmv(letH6Ci5GUnhE|%~n`nDvKN@ zKt%A&vUc at sOaYGMIE}`*vON=t0f#Q?Jh(l$j`+|jz)&1VGc_le3<~#{vuoJCwOX$d zOVW?kzk at rcAWm>snHTkycUH`;yhvj+V?UQ+jGX5Wr at E5xCgkILT~l^R%4`#iTp8 at j zhwse~asdz}cAQL*IO&gb&YIjB at 2hZd!0&b>rD}BiN{j8zJ_ynYNx%3kG#oLsfD??a z#4d4mz(~{ps#&h>V0~$)KrTn8-iXVPuW>b+Md7l@$ zB4k#I0{R#)ntreAXE%Mnw99Hg!Ti81; z3>C%44%o`@G$1x(psCUsFM{}S!jIwPzwMDJKgs-jrfH+=R~`%_RL~7G7z)k#13l8c zAG3$Wcyo&Oi1P4t_zzaPxWV at zwZEua4EC?mnEyA7 at l(-L>}NvjhBO5$ctI!hB_)n8 zV-rZP3lWoIBYQ#C@@155Omd}P<9TR(-9@~S#Ad{$`F=1kec63^%3ZqlK5~u=qT81b z?t^f_>nN0m;moQQZbY*Sp-ovxoykg*4tpxpK<2bToA^GK1T{>qgdM5GoH#sc^^9t%1FR3<}LM!lkLv1 z?+!e!nZ#&V&?0f&eNNaZq!!10-pir){ZJ?Q1Ep|M}NxjUB#eXRDXn?+bi zD3tNE#C+!W$y?tKs?mPCwD0r9NKT>Vw>pNbe%F*cG2dCZmCB6kRxrqTIZP1!fqX`D zjCj0c%*4yrx3rK$2I#d8uQ^P&-CU>V?+p*OEQD*I;G4Wx${-2uZ=7oe7+(k)ZgXqP zw>hYI-RK`oQO7uXd}@mjHPta%qt?u7Y$-2^6r8mcpAeWM`elcstn~e(T&@U*WAF+M z0wPZU0z&uS?v9$Xnc06W!&QHe{DHQF{z(y=U6(Eth$JTzB|~gW1Zo$Mkc0z%l98H# z1>3SZW-j&3-6CacO-Mwix>>ujta!E6uXTO7r65j8Im&OPXXo1E-Qi)y{hjNXcZdIZ)8+c8`K#L#rcdKTbBMD4g-ie)7+Bi>!X{9-->CbV6)_Ww%Jo#_CoWcw`6~fsVByvZkV(E0WWnLc*~~`eSkOJn6}rV zW#8Es)HAe%+3p%YBul6NyG2&lJ7fqiQnUSXL-!3K^19)LAo9A=Gh+zx`$ybR?DwwW z{Si9<{{2!K|B}3`GUg={$^>s2kBg+h;U3brqV0I6Nl(d|Zq;82#4elj*>dAbbrKbe z&0cM-E|}#EnTrS5q+#05ePLKixg07b1cb~gRtqgx5my>{n+luWwzQWgDXjgTOE;g? z- at 6%2xXt^+v=hzO at uG3JQp|WeM1vM!dESiO3rsd!Mh+yP&{12K@{iGY?D?<6s<9d! zJ?YkJF at n)`MP=wyjH0kj=u4K2$yl7W@}1YGi;NcuBZ>jmN=Q~)RLm%i2Tr8FT>+(l zLP1nYpm)M-rS}ChPGi+fQ&fPQ at uC#`xvA!_y_)T8UcH$?Hygfl?B8rE6(%cz^d588 zo}c(u$+Z<-Zpf-S+ZH31TdvytB**fV%)L%D>6cuh_wbX}jt|hn^JWu`?CcU&3SnwYK^uEk-7>E>em!?1e%cz`GM+5O3oa> z3pDaB;sIid>iB0 at ubwWRTHfob?>Yq&g2ca-Z@|K1$Q#%ZVKB?I6`$_~5~m6b#Kzpc z5Wx?XN4*EL2~1W96w_n&%*h~EyeCZ8^%HO=xyGVc591_J``h!IsNPGnbybBuXTsCs z(JbO4a%nBiFWndH8J8){-lEL7tLP7rn(wHqa!L(`7}3~{Heer6e>lOGL~3%Jd33u5+u7pgdEIvK;|(urejHmd)E#m3lDRFUY zg2W{U$Y at pK9Wzbjrf#6J#F#yB$y*i!u882tkEvIgzFfiIDvY?P6ZO;%RuA14a7s^2 z>EY~JlV{>!`1$wr at o027C8!1GWAft9kNLlbS`^`)mg?K`O9w4u-zo*~>K97kp5pEoAD*(khy`}$tX5`nwhZ8jPW={mt zm92HCvO|pQAF#d4j!;)>x47`VL)TPlrqqdUmI1iVeqhpy&Lh`aAHoCjo`t|mI)Y)S z$fPk&9E821z)CV7u>oEux%s6TzOS-9#TO9VHXTvG4|7_N%9luB at 4f@gXU!hrrXR%D z;tiwuox_J at P&8TL8IFpS4Oaj)`~n at q-cO*%-WJYwkPrK2Xd=$`u-*00ADrz_D7G#_ zL~GA5VZvcj90Id$RXTzLqu54IFv59997L+N@~E3ph2#WF*IC6SSZ%P>inbgD#MNni zUXy4 at wHih{dnR`CHe7x5S}K13_U1_RxcDALfOSQalINQ_V^oO?s#~1V zK}g>*y0l!4Oqop^E+;w%`qAgjRoyq=LS&O+qio-HK~HZPRVrdTD*mth3k7FC9ZH3R zO_E1Cs(8JtNqZVE{dtC4iUvkUuwx6Gogm`z_I(1C+@?h1#^bPU6@ zUFE6z!Opv2G$#%i$ur at aPXr0XZ(ttYH$FqFI^Ff5R<@9SxL&r0U=_cWwtoBbMU8_D z^S4F2Z6O<@Ad#o~v(-9e?z9f%u3z at M*IIO9E`hme#dw%vzYIAN-;s-5v+L+-;GxX?z zlEg`#Vh&(MTO5)tc}8b$m^-TLn0})*uS at 8Seu$psFi4JUmALtu;#Wkz2P4iMfX$Lb zH3!4(S&Qv7$4cT#0*N$_9pd^^QD#=aWRVWx6x`Avdm+tu?ut at hNlKPMwbP~*%4s1i zTD{tXN8S`5e!XZw6q6A3CvRN6nB%`Jk zt4tJ<7yMW_$Np0)gSGbIjpHSkL%d$gC(6eldDZ4@>TNG;>?GUHd(`B5U`LM_({lprx)eHmhw?Q(HCD(&T7la%W`;XeYnzXFGTK)( zry{?80gtbGHfRXvFoBfmL>v3=@;}rC$mT+xq+0mJIB$M&#YbP=l=qI&#|~1fX{;wy zWx}wT{?VIcJ}Z!pd%c3_G796B7}!T2_gYt1ut*86t0)%I>*t6O)r1?8_JhD_UtG*P zEliKmdugg~-6mjk3$t@)r^IBeY>kw^f}1JF;w`}&52vMY&{AQE>V2|Zslx4aU*Kc0 zifXmhY1?EEkw-Kw4^r_*n9U{Z+$h-2!#BfVBV#Vx5Nu1I{dLqR};Sk1_ES~ zJ0C5U!ckK9a*o){`%XAKT1XK`d5Sw&IvTaf`9M#XBcgm$Ts$6VU`EpyqF&^I>+x}o zGdy;FPn%mfk8DjMB9B6&??rX1HKOY239|b{^)^%1ny|LrJ-TdXM zpV6!|B-vq{ysVaIe2T{0eA##26Qv6hWm-gnO}+VSCUp(!6~TCdmm70~itNwQuZSWL z$HDs%_06=#Zd*#*#-gMnoio?|Gj~p$hjsMLCgvN9;dhA7e>7x)#$m_nLx6xV!2YY; zSi#NK)BYiKfdm8e_CC*781(#(@|Q|JXe4|e%3wO5g9>7eiK3LIqJp_M z0>d?~f>uqgr#6ul>2G*u*Wt858Po%l(0R(;i?t zo9NK<(8j{zfqR;oqwVX&6rp+Rl5v at mDG#}ti zXOU%ZV#E^`Jy8?cT(*JYi(&ygl6TqdZF4gzG~#*7Zz*1J!*~&EUJ{*}yYO0Q!duFZ zD7wywe039s=h)JQBn?iqyG#pYUDG+0vw(Lm{hp3I+7# zz at Zl8g^(kvVZLz*rv9RJl at fd!8J>ndhYDr=r|-PmQkyB&u`1%gPXoN_fUT}|f;MyL zOpYtRJw^s2dv|N8T4d-?#e;)ie6cv*dRMp=kGtQR`Pp2&`BkTZUmLz?^gbs0#_wy7x!(80Lx>+J zWV+%Ieu2Kzp;U4Z)PMu_uIb0R&K?Oxr9$QDon6~hlVB5;ca%BXD~mz at Lz;;5rc|Oq zeDSE9txfC$>(TpR_)S;Bt0F?XkI6ML#}rtW_91NEz%-I8ml!ZVveX{|o=xfRsJBwA zinuoBKSbzK1%rK%zfy*Ld$SiNaZn1Ui$4m at K6ryExYR7N5D=^>5v%}!d= zfhQI9Ld(ou2jg!Q2Yj_q0jW|dQk1d*mcAmE{BtDL1?2BOJvJ?KN>@^B(tL~pmP1hT ze_)SJWgom(Q{NbK^R6K@*S+-ZVB%mQrCvb`1QuM#q at u19$&mF)lu
R0-}rn0>bp)|H*T(b98XCH~p_zRjjF{iKdD4nW2TBK~9AeEOu*{28pG_hAg4m z2N at Ixy`RvWZWYSGzqPthXw1==!FRMK7}s?Zmz9_|?BYCWlXIUSn0VN^B at fO@FWWD) z)8S_GT4AsLcr&uo`}xffWQSrFNDHGo)QoT0?#QfHz~ixZ(&uLg76Qjwb3R=%mxfUdL9 zSlDx{dp$XM11*S>F;P)W{Z?h2%)ZdZCqNP%pyoC#IMm9 zt)vPph$#X<*jA7d at DC)ItmZRcysXHZm`!e zZg%+L|IZm-9n&TwoFwBC!d-Sze(Z12cO&vyTo z=sr_sIEDI$9{8p90y$y8)!w#A&Gmxhzla3g+7|o zd61G<-Og}yhXYN_{Auc%j~7H=7`VZ*K1Y0jaK+NBlQp7ON}HiDTE&o?Faj^yEU^Y^ z)=X!D{A}tQ7HjGorD*CK at y_f^ap2-hd?4#PGzhg+9c6S#R at CZ0z%sqp6$PVv=vv+* zMW`E at yVq5kn{>-g5H`X|cb^m`Eho)Y_xh)XsJ26=v}x6TOGl1aXRM3Z$l8X#JsQ)N z&4GbVVeTP(SF00WRVLq2X63cu^GAuscnF0k8}*)?QsozvO+2 at -%qUqas)p{pImS*F z?Un)mgtm1%o%?jW^kdECW^;<#sFjZi4c1`{E{KV*?VnCP2`$s2N!YsoS5nZNJ} zrL)KhhVQW}VSm${&?TA2yB>T|oO_QfJ4q0MHAV%=cyzegJZ zL9z}0$~VjzlVI>&SLA8oQ8gq-_fA-WtZx*%O!$x0yc2I0LH^D$TrDx)HH4n!mL9r- z;)m;`VyqKkk94FxQTU)jDi8_gK%eEq;w`B8>6uD}!As9-8pcZjGGe#MRPCt=B(JPs zf;Pc&^dp|MPwad%G76vEJpF!A*Z4ScKG6ZCHu|hnufSoX7zu4sL}a^Yx<5BF2KnTK zkNP7LDUWkAe?XY=_wD0mNEIMR`K~4KMx at 25no%jKP$?**6S5q?MltKcW&|Ug5*wC*ak-9*yUI4-%Sgnxf;lL`pM({aK7cD_l>s0(0oxp zTCsy443-nky1%G$FbMlxG;7@@_r#Y?s at -Q#?*CUX++$S>Xq5=vz$k zv*Ce4lhLLWdqkA{=Hhv*TFP+eU1_*XDL*b-Z=t7=Q+4QQFW3?wi89d{5}m3`fyD)r zQFTYTQ|@?@^Qk$Ko3i#&iD^dO%;fgLi$Gz0EUoF&Ws)V at X4VcRv&^2{yZU4;u!}l7 z?EtQowz*T9O0W)m2W>t*_%MYUsN4Giceh{GOEu at 6Jy|Z)E8k!j at 8-K=sg<#Dge|yQ zWq_+-LMyNG#tVsRUlxhjkz&*I$UneLHRB^@eO|NOZlu*x*$%Yh{!{g1+{)j=zSJgT z`|WT(S*9(opkIH+`IDlrbzX>=lI*;&WnKU?nU8 z8FQ>2q#Hx8a^1+0DCCawtCVoi#5J1l%+Udve_tY*|6wYS5{#CZ0X|?deF^NUwhKD%lysN09nwLd%F>*IIsufvTek#z#chYhj0k^3MH$SSCBRND9(8V_?>*>

%-L_rHmHp8C&b)Xg~TS4`0p>w zzi;bxd4-QC3B1%>#(3X0Kn`xh?@@2DlznM*a`#+lOzzaC$Fd;pgg>LZzx`M6xG5ft znFRv at F@**Jk^KJz9 at 6$kCazZQX8&0KkC-vZPH{o$FQl~k1Tu?3A)u*=4cb#dJ|>fj zv9Pc<uUW%&?U6-GjOj#h&Rt&tRsS#Ts_M=05)7{aV<5 zn%Obv1+Ch3!jRr1lmJ6y`93aWBGoA|!pZ+lqi~9*wY_yXPR(Wr|E-+s{oBCz?2X|R zhf8dG(H&Omgj!ztt<5<-h9_aB(`K(wqXzSH`B*}1^bww-h!_*ib)HsiXZ8(_&4_Xj zo^R+HXYwQS+A#|(@X;wLCJV7vIP!|Pv(u7H6M*y*fby57^&cU at d3M!S9Z(@G+FSy9 z{VrZN>5O5U4ylj at EdX_D>$)1#^L#76JvMLG0QG$!EZqR>rrU-)-_}8le2}8-IIlcn z(0YnP257~S;P8DnIEz|L#0vqZj|AUHG`HF(Sqkw6z-g~5$WCm371Z;`DlbI1MB!$p zqf)C(JNr0-!+lD%PfwfGdu22wrCn9InoKS$)2+nPqBebvu?uTXpdGAwGmfe{dPQ_} zS_ORm`c`!LdNFPh#;Np-J#WtjTZQgsV|c(gxzm!%=&lh0brJUR*SoM8m3~_MFVb&J zbd}8dNVI0R{n}B)eJtHjiAdQDk<3=?a$nd0WwELp;e0{EqCx+_gmUKfK*WLeBR*W&VtVx7`8nS^N} zHLdt7l*)*@F#};Jq^WT5<{7X#q#oEkNpX`p)=c0_`oF0JS6YkeZwG(Y=X9^_7D&uoi%;hw;Fjh~tzQagpQ){HNUiHiWr~W-UuB(Nijvt0 z6iq>GU*()%nvmHM7tup(UuB)c5 at X7Q$_5wkoN%&}1wPabJ>h6u=~;z?A=+T8!)e)Katm23v5RMt*Kjr}6{}UV47NPWglJpEo*lwZIC5h3J9jADi@!@*V3lE|^laD at oK0N2~_h9V++9^ZHLASArce~Sc+AW}!4&{v=IWsAVZ?C~* z)HkEEnYgf84*wFai?WpUSTCWq*GvZmV7EVmEv(`7CgwK+wyK4!00|XV9S3q2tm(KW zdoA^&(VqIO-B3am>z64d4%i>&v93#5$H%hA7wn>IJeN%af_l5H!RH5gM6`u!M&%!W=*Lc2>eC{#*M;#JB~#FL0hRY1S0KOHIgd34!lUiT*ngY zTox3EadF_#P8o|(q^8tl<HB-r{0sN7|2L@)EBpVDxC at D$lL2Q&5_ec%w_CBM zefez at e;M at 6pc-0R0~t2(9I=SFs(ekXrSWm+-$z%SG(sY1v7lY99VtBSo<8qjcOiU` zfyfeI;C~DsOwQzt_+aoT?u)f)Pm^YjE{(0&BgZmveIRu1;!o+f6F|Mv19J+dkje|H#-zf}>hdb!oDl;i~j zs5l&u|lRKhIr)Xj3>7)|KWlru%-EW=TX9`1?HhGMRX8jZ8uwcj}cGTz#!{Z733ccO5Wyd$?AV?$NkrKZ2$5Y`Cr>BS$RwWOc=>8gbrC5 z868y7+c`WchnehKs$m!u=GD|{00--qX$jN^y&?s{2Z-SKcYdU9$9lvi_1em_?z6YI z&ld|DF!!oWJ-;4+X*W;ba>+Ip;QAmWg!4g~>*eh9c|9 z7u8$T1Q_tJ3LpKO7P`oxI|gPX96beHzx&PkA`64~IFjr)!UkM2QUoGJxUW|=p1hxO zVhJtT#Wv-7g_8TD*ib|yV-rWCnudFWQ2LAPjeW`Tb>>un7&FUK(3qojH z3(FF+XpE5P=txRFpd{N$+7alO4499wl>#ql<5f8Fi8XNrpW(UrjBPi+5N`@~bEJW@ zvr0w#6O)IN+&;OD7So3-*Mx$gleaD#!sB0G2 z)XA;APMban`t5~>(@W0-MsC8ivrqiU&3LFxr(?sJ%KOQ2&W?KUeA8^yoaXvbUXRtS zvZnjHkD_u&m4kIVusxE9MBrvdM&C#>9V%PB0G}Zn#0{Z zQdn!S)%1YhC_wEzB=((u=quxQNH3YySG&Fec8^Vzj4}ObUAw-?b at g0WwCSqIq*qY8 zM+UJ=DNV|d?93$_lZQ!)i7>{BV8Xm-Nrw`t`GenqF at KHBxE@U*eX@=)5F+Q(cZI-> zc-^R;m0;P}J-Q2n^zNz(U=zJ7nF4HRoJUzVFHfn9E$-uRSPl`1_4jE8 z1taIKVNN7P(1Z>CJgAqX&-v0l<6q#??{mqU%(I$10wtC_`n0kNx$zqSAmPDrL3Eg- z7z5(k at hrilyE_Tw5-tYzaP=P?`^>&uqAW-8fH(UDu_}fG*vnE;AMjt>jzV04${Fa& z!|K{hPGkvxmI$82DBmXoF8u3xF9eQX^c6ZlO);|M17jnZVqKhZNA~fHp84jLcNmG( z$;-d%jllQIhIV}etKI9P71j5b(Q24OPtu|rGm#IcYl%0-=bmiNwyQX>Rn2#%R7@@J zr}i at 29)(TT^>>CF*WbNu*-y&jf?R0eg49;ZqM;|ij*r?aAuAs(l>L3D!$mN)m#fXP zD^b@(Mke-FNxr#~D2B5u;!M z>hV0fOV#g?^oJ9yMu(d=)snYlM2x0@{tbs;?M+Zxsfr zujFVhXC&hU5Nsf|Si0mI!oK!%{sg*U8#J#YJiikRB_rZ;3RS|5Jktp$bBWJgzff?# z_n66EN5qr at OcY0rB7c2%$J=AK-9DGT9#XzO>pOx28U*IsP z?k!xTDI7d}FI`Q*#B?d9?>FVjrDV?tcDHyx#shZCYo&}v?AxB3V zhRd^~2`eZ20X&6pX)c;?qmFFs9S|5>=^VZY#Fu9(YIJ<}Zm;)l zE{PcRYms5tvDUXrpck{16V*p0oWH+6foUiQzNk8QzVaJa>B=cL6W}P<~>g^L)AcEIS{*;rzh at d+jOX+8;E;DaRxRHew(Aku*hOz=GlHv`4#@I%Y;yP1ZOqdo{ z=6Qzy0n$;=qoQ;+1*fYCz^vH_w>{F z%P-iEZu;{+;9`%M5{RIMcT|+3x^#i!s||$Ag5#Z?XP(~xJw2LbBw#H|ckrD>^1BxO{w&%EK?4Ty3rPBLw#(9*+qlJ;a;%+>hGn8S1rMiARu5U|NDGu{}WkB zwZ at hvt~yfg6a!3f$h?e+jgAiNx)5xAarJ6Z6Our%3Qa(Xc3nd-JKferNhZA1(wnkR z45GlxA@?UJfr0NVCg000;V$8kletGDnUBZR{w=Y~b$0ga)N%G^@8{=%B1jt;ijaUu}bC_CqnwYhid)NiaYw##RyoHzm`JEP?KHh};E5u_C!EYyNQ_x=k+k`gP;~q<&eXE8xR!dVSz^#ZSqJ^4 z)M-X}nU$%T at lBv}7#LodO9lllw|a$!ncRGmCfCOJ1;`%TI>ou2xOxhp3O8bT97o)C zpdvv-W at l$r;!&=!*heLVq-E%O+(%7D0(2r)f{QD2aH!DE%P^FogG%EAhJtL7K(Glo zzD>5a4e;?Q!ZKW6T68uo%$5KEq95Gj|SU8Gkx7bp2jjvsteetCVj=Q=^vnnvH z;XQ51v=fYYqA1IRN}#_+pNi#J=$Y^%wm0fH>Xyytq;{n|de~V?QSek7EiNNYeZ;59 z5;o(PC4OtlH7OXl%Ency;xr>Jc;NP0TVx2_AC-g9dCPlsyW>_vy-%sqbc&VP?) zJZCSYnxR at 0=+5yH6v=UPq%c^JE2f*V;+0Vs{tPZTEfItHg$8)RNCA-ILxq>+po~6g zlJ-T8;N7)F{IEy*o6YfM8DtYCiJLEbU;&~Auf|Ta7yKF5-qRD`YSEZtk56R|<0sr~ z==l(Zg5XagCHS~|iaQcV7?1A=o5&wg;Dm(hp`)NTcpqo=%=3n%)2m?{9C#N-htX{{ zGn^)HczADwl2$*JPk!3u-*8*wjU21%N_QqYszS|T7-bPO3Zb^7fy;E#I->U)*uE`a z`{TMLy25*`1SO!ECAywNOLqkDUHJXDz>4Jeg1GRA3)LK_?!(!?A+sVsy8~^yzlntM zTNddxoM=x+A+|A#a8GKK3KE~AhuPK{nNKJs!$%&T6`4p_y~$?yxD&FD!r3Bk^ir^+UA1At#i`V>e!M^BMBz9Q0rpPTh+fVac7TxB_>Qg{tbfSZ4 zb6-;i5DK;S1rzJkiMHh7N~He1P`_PLxpkR6DD~_l=eit8>b-g;wGMPg8r=T)<#b7^ z_$Nj at O}a7qJn<(EL;s(?{5t6Cc2Of3kJsIbr#kheuh0qxsOj#5i%nLYZ7>co-j$YL z=$rh|89tP&YfT=(YidH<19|Pwu#ta0pjWR+5p%&mFLx$dz9Qo;V{74l{7`K8^!I`I zAt<(O;_+F<9U at -@^bfSJ?0AoRK{oE6A-d7u>9r|y>aTVJa}d6#l4(<}>P$~}F0iB| zeZQ%|e18XGt*2wH+YRPW`zlFIzC$2)Q=cN<3;ddJpfm%ISndcn8SH5#JkajnF*}c% zVfQ5}F2Mi#M_(R7P~f+vzX9C)-z9|OtzfJ(&3_TL8AlpJiWOsvdY z{%Bc-iBv3jzsl7Tsc>uSPg*UHgkBbnlE7k0Pg#1Io|LOPPZ znkys{So;AC%mWDI`HAjJ-l!rS>$jdZ$V8XVCLL}k9#9 at 1aUXB~1^3rKh#;J^SR)Vu zi+Km6 at R4oh`zhZb2^Dua1h7X?#&J^WNs82?^E}ix)$2=)vyIN`kEYgycVd_EC=X-M zoq!<~_^$Gl(0H+#WbWX(95V;*rZvwBac01JvlWj*b)fM+;SnxChTJl-(01w3t9r-o zw$8qpZ(dFveB%yB<0Rr*QilAjjsF|d$wtr2K!nAkcNUwh#d}p)*K#$1L#8Hb4M$F!`D z=5yJNeJbZ>j;!#dcK*^4GUAG_U|7{Cysvdm|yWJluO zd+Ij+m`ty$K!P!_BorHmq=Y1#*@_F#rSvguG8+2r^%O@&1S4 z1V8?J+4&0|q8lC2jN^M3C5-5mc!woY;{A~0xo-_N#UI1iR$w%HLhisTZqZ-c>8|j5xqYDgTY<$j+a98`CD)N^KKHcJ8S}i?=ey+Q`Nj^SIUzii+A at LK~WM_A$cf0iF zw!2vTU!=WblrCGdCR(*>)hgRwW!tv-mTlX{D%-Yg+qP}ncJF=8`Odv}_Z|I>?jB=~ z9GNroNB)R85bA7$33e~ev>A?x{ zB(Z@?lj(GkM3WZ7BeIi;RXA=@DcYu at kDHxgb%1WR9>x_t#BCezSyl`@dQGueUQ>nM zY3rCJzspdg-{{`xn($=C47Pvg`_Lawg9KteKlh?(%8&9>+%uBd<0c zM&|O8=#?S>(}Vpn52O~ks|ZB&QV6$bFRZ!nva|J5755!G%xRTDL;$JL>f#`V}x$arA7DSyvg7FE)fp~o4Z=*8Wd_)fO6(IwWbb8eA)<~ap{ z`xHPOQ}bR-bp9i4{BZ#0^|$qv#V{GD*~A%=$ZAfG2$N{~qShw+f0bbXB&^1 at XR9pk z$)(X1TEom3P^e6>jTgk7{SE4d5Lo25bvY_>@e=Cv05NK_`8p_JEqt#uyI)Y#&2MpL znLO7VOg2f%?yBj at F`A$CyJ4cHinJzeH7aH4CYAd{+sS-zKIMRprl;|CnI}4(>xXOH8COi zFgtsCZ`oyF;VO*zp^^<@PnKS@?=9}?=+sY7HI2QB{eeW!L?tsAEfO~+w_vt-6`|p0 zsvf?y$}VghuXWJE)|3R5RvgM(JIeaV8^hyMzV8=MuIdMzSZ%QBOQKf6Eo37u;CIMSO;36;FVm%OebEe;=9>O( z@;(-kXRc3F{Y7lPr88rbr$c7?5tye{D5Ts9gmd20vN9ktFcl6AH}}<(?FLH#Zf1_K zK5NXK9~N)~&x(lggnD2Tq3A({3mb4~dxO8`{zJ*~GQ6Q_?k8XDnpuNj@$*n2_4D;B>w4Ks`Cm z;HckEJzkbN-f$+4hn)SiUjt{gO_d7+Hpr+iq5Ox12CQXLUtJ9>i&Yvsc=w{=QRp%^P$MYkGw6A}ZG~}T7 zI^%%?0b#=aUwJ~te?jL>1uP}x at 6DP~5^4k5Bn`1(feKDx3ZCYiKT?-L&pJioqam< zkEXqeWJPq7PK+N;B107s%SIFQ4O>eSQF(fY(q2N0%#_8`YelgddSXQm&is?>EYhV! zsFr_w!DCIQf)iymI69_#KK6FQ*8bOy{9|Snlano8k- at kRLH{757C~qg3pORvr}P}s z{@;;n;fjiaYc&t2^7!SPQ0hxW(hh4=X2v28&|h7Z2^&WFBS625=Kk`J3kzYwnM|MW z$JmGH5vIakb}ofM+81on;|cXyaeDPb9L1$8cGSmfGL=g9K0~{B70Y{7+v}%{u1!kc!*(BZqW(OI4h=>ywQ<=W}pUP{{0&cV6!cmoFq9Bo;%6Nsak-h3yy{S96^ z^=|&#rSk5Up1DU_Jyu}mpc$yij$YQQbZ92n-b?gS3nfZFpMo`Pt?%Z3Cazs3b8-;c zN6Fl{1$sR!xDPM;-5`1`GS7=jK>dh}{DA&(B0dc71-~@wgSE%>4lRC+0G}2lbj_hk z&>F?JC%UjnssuD_3LT4o1DaI`K(GhN>WA9d=5v&bWen8Ij?+qTe3sWR4Urt(8UU%0 z7PGK3g9=tSeBQz21}O~&2eoAxIcz!T91;CJ>?b1i^}_f-;vQex^1w}i6=I#!#oO2E zu`kcn*9d8bw+_f8sGn&YzM4j2lz at KC)+?_#|{S}&0-M3F~%|3QwJF_`dDwE zP{t8r<0?1Z7)0Ozg*)_7Tr6)M#Za=TcO>&Dz3s&@es0YeJ1Ee=<3j^<1N+if%? z5d4(}&Mmq;=&L5!gDYcgTyZ2seEn%l(R`REb>oQqV%0-pY>7;dR;636w_Cn8x at 6xw zKkFlN?G;YoR<_Ro3hfqcvm at FL#0M$vdq?ntvL#J0k4&?}{%C=E`*IbDX z8D3t%c2VTQA&AJG5rVT zPx`Cjq|m;Z2_30hu8ETei0p`=niTy#^3Y!5f+4jlZL9|S!OKtjhpH9Lm0b|WDS_;h8L+HN(V-Ev49w7vIRxoJ+ zR7q}tT34!twc4z!fRT@~%uzQs!F3_%{K#`&c8>C1&vf+L3~UX;oGqM6GURgkq7 at fA zw??NHsdWT6&RmO2V-2G=39Bi4EP7`CD{0O<`mV+_9>u6c at Y3*DsofYkeXGN)^{~(C z3y^Bcwygw at oVKDzk;{!m4$?J#j=3lRdHF}6vCF7pxkHU^a*`gGq;utf!k#K4vw2kj zd{Ch(X66a+bE^F={Hmwq&qBg9fZ;?i{?888+g)Ys<-}*jxA~LcwI7p&dcI%ku5i$9c~jYaVdc$OWDP3=-)8 zqDEk at -D+JO>|_MYcAP_K5wiy+99tY#v8O!}erNVx25zIKNxZM1s!fHKC-A|~R3;iQ zVFF$`^M{#5{8#!Y4I)xZrg$P7&JULmgR^RE-1Pi+hGEIQ5pCan8oLe7xOXKlSt-1b$M}90^~mzt)#_KKE2M29f2+F<7Qv=^Xie80Pf&z1 zC9VrasD$M4-5;MQuI6>c6h8mZ-<`)-cz6D5DS=`AJI=a-ne|_ at jyBf+zirJ`UVV_3 z5x%ReN1<3CYZZRb!$a0ZAp8;(qx(B%K8SAKE|U?Hkl3*THCIJY$tLJtV6|5Ce3^9` zJLBI}0BR6NLfo1D)O~vW>3DQ$t|o5bap=iI_rB%2<#{~$`mpuAqOS?}g)it(WO?>0z>94XK zv8Q1rwzn?TH6L`XUj?(>|D6BAkIZXWizj@$|8t4{j-zAjfRz3tp_?~+_xQsr5~XwM zfFfRp?v*%RhyIm0-a^V7Y0xJBCG%%%-YFxf(*&E3Vka3syS)f|u_0s_Pds}TXa3RT zC*t1zT0~XKVjTrO8@)(|^SR;@nPPYw8+yhFV)x{pEJa{hOeT at Gq1-&PgIHgGsqvvV z8+SaSfSN%XQ&Y5Q8;3ge(ZXFo9A$}RO{@xJyoB0*=OlD$y}EGURcr at fVgmhFYC^8j z?98bGS)d(|v|-*E+{(^9_{)#C49^)op=u{P#$ zlqxX^u;(Tu=9!lr3bt9Ngq31cTzT6)35eLGq|Tb>>Y`nqVOlT2?sjV96IC>&{dVGl zC^v6cA5PO7zP>kURVlx?bx~v*Dp7XpP-SR!D_UvLO_g5j_sU5$T^U7cUQ- at VWi&42 z$wW1qmmrB?Hu5V^5kR?&qo`t$Ium{`AbWaO$ZkYOHk at l{US#xdk|a30S1RNyp?6TG zuMEQ6D-4hxX9nlMWwJLRdU&%SK6OmPPrhto?p>*nPi+iRpI{oAWS9hpuu!pAAOLKi*ygkEKrnP>Y0^`?)F$S zH1GIHK5^8F}IU`fb4Z zW_V#(7d{HJkw8CvfEo{c5vtEWWYvK&sKM|R(rm;PTAb$^%<7|mhk&6l(Mq_lB{hOR z91w72G$$}*HZj8HcMteb8`8O1Ci^1UziuJd3(x+UFf)q|iDC31D4=2>z^%RrId85u z#CuCiat+vk(>z-2Hgh@*i-0`2f#@1#idQpb5TU0c96kV#&qt57gCta(qvrJ_D)=}G zG5sB%#WO;V!t9V&ArFbZ&yg=v1B*#pX^#DVwdG_8&YU>5VLBJ5&veiz% zwkBw>&v1+1u52cgj9BY#T_~&99o<^_wZ=QR&i2W(#i?v_3qle!UNYT#_P%-7Ltv(7 zMlc*a2%ZD9 at F)nGEpiPt$Tap)P<@`%&yt-$n%>I9>-gw58k}`YmqD5-Pf_~D)L5g~ z)SA3rC_46 at BtA)ec-dRi!sS%M^eF)9_n;7`j!ATpqXmSqcI|liZq_~CxE=ZUP{<;B z-r3+D*@gdREw=5KaHYk!L*jROxrZh39BT6d1N;C#D-#fEoli(Ua?-2LV8D%07u{ke ziGVvq_($~;t)~OCK#8vcc7`G(m*dqx%5y08+U39{zQgDvIN(%m{h{75%cyOxvl$_m z-x~|SZ-B^r|Du(TBwz`Kk&O`KtUin_*nWeKOS+TW){W!%<-Bsch18IDWr}5+ at lfCT zTwoJ3Z5`8X{k!AOz>l>m&K(5&I!U1Mq!t)1#bI_bDZ>~zr0BM482Mb<^o7Y3L9m0`(>KD5RSEh8UnE3~oyTsMNO9xX~8?>s3 zpeh37j-@{iLOYfXGHg}njtp({Qzz{!nJiDDr{85jwIpVM{0BeVEAv3cDVM?+XC{K^ z7C%&%nEk38HCH<{ZAJT-BCc3JZ81_*{qw=;3f-eKmNY6U~jw19o(^v0{w8H!`Ieg0_7Y_r^<`+ at YQ3OkkR zhqBvx>V*~wE_YSdA)*EJ__*nm8OfD?6g at bV6zY~e=-Vld!#f?11M|+)WdvBQb1$?} z_Kb^8|AX4gW;?h}er?d|C5Z>l18tH_#H$>O1g~XMV;q!K?50}0_kjhZcN&&P*$Lj- zW{q at 8e%5%s9?-G$@Q^)3<$VVB2T;sPX1{%f44mBCQaT+|PhdP#=;LvkV;fWZ zuV17Y51hk6^L}YG&cdyZBFju0IOMlU(>U#tIO&OQHWasksgzlx9&;^NsgEoECyP6npF3nH z6%Cas+k{Z2x6w-WsI_SQvX!_Lh}UaCK}e^1=z_3kgjo zk-6qHYbJ8EZm*m!B-&pQ`FPCqtZM|lXXd8h;1qyuh(S6Yg;zEZ znGmLb6_-XPP7vi*vZ>54lif))>VziE&X8}!2J0pgq?l!A%cEg5oaCB84H%*0t!5?m84kiI-!VD!%^99kS90iC zsO(;cgzP=j3Kv6HrB(ZqD zZ!4*Zu8ugp94!u{0TS$GWH+p84+^qiL%<>AR+(=8lTn1HyDyW-!J=f$m7+c9GKGC~ z#bD+q&QLJpf_K#IG|kOZh|b{Sx3M=5^L?bG$yRonn-xPneb(z>!UTzRQn5yh));4t zhWhnvm)JPIP5npi(?5#JfhJ?8Hh%#D#UTDWZJPhtX8sHLDqpG~D`9&Zqd6xTAq(}O zl}M4J$th1ZBs8D^(AP;7X5Q;z-M at KLMHE z&r at _%^&nuDyb~Lp&pgxDm#y8L-yiSq3P2jS4nHjD5_{OCRB}*{ky`#d8)`=EfBqc1 z1^)iV*J&LP#Z%fd&`h!`M1-Unwo9z`jLR7={HcrM at l%n8}<_3HNuH%}6e*O^G`lO|u;{zIyfoh8>qGSEsC_CY at mm z>b*b^n`r-Vn;%TtT^6wTPq0nM*IQ!*e}WOWW} zy4n(KNX+E^T#ZFK_4R!S2}sN at Y$sA&pO{nh3Q=n^#uR0ICl=E}Oma#Ix-1D|EI0#I zhP@`mU#h}Ls}~huTIC|jt?0)lEiP|k_J2gZGng2&KPFmmOlQwiqTa1wRXdV0XX&)O z{DB0G0a0fhUJ>>^JW^-;T%OeLHMhb(WF`8L?SE z9nK=Y8vq9Dr!z<4TYTx3UzJ05tG-jBBDaB96O at 7G5h4pIV`^X-JXahFDK%rZU1o8E zNB)Dn>Jeq$V9`m1T$~2lg78d!XZSXEw2?3^$1S2Wm3oq|@%*Dyk6XrCswQ1NR0}}n zaxiZW*PA8iReejUS?s(mfH_MZDypcMLsLXP!xXb_oypQWLVy*4%Q3ez5X&68_$WM& zxV9ctsabejfqd*NZ!?QPzsNQn(?NHV89rO_QoOl+2*+WjmdQXsz^d*gr>&mLGQ4yj zWP;_99ChO$`$!%C8!)E&^fM1rPTkzKFa0B z(bs?VtKzWK>=hw0+EBcKai&lWMlvQ at XH(e$lwpJA8H* zZ at ELDdPKTz<5VW|Fm=}zjgOrdIMvOX?k%kpCB=IlmFUNSe*^+m|FVU|G6eDxSWRFT z!*Yz~SWVh;xJbF17rFoRJewbyY0`thexqtM4AVBzkq&`kz<8K(ni+|(jRe=22ChIG zWmCfpBMAxTjD+mq<{#-kXmM;ST-SK8D52}0F<{{_2zcUYPz2+CBmMYdUxV6yRJE&U z<_=iew=tY2I1s|HkcOS at XX_EVoZ2W$VjmCD4h?QgD8h?yhM!Zvp_fYql(>!q6 zxp+OJJVJi4M+Mv3URY0mf#>y&k1Z8<3s^@=_*Z5SP>?10v%)7zFb6?Kpn)o#f+>YM z%Y!mYZbN6U?w=deMs5kMIXuRgRJGy1fgAP9%JIk}d4RvlZeIqd@(N#N)6}V4u9pw- z#38`B@^Wj;Qz+dMQjM$lJ zDzXtMM;q0C6LBE1z`hY$@qUpG# z3o{7kDXh30`tVD6uSkbE(0IESVpk;dS_EecWiG|8f3t9|>W}J>M7ypyZ9B?Zti2B4i=uAv!HDWtv+d8Ln2+5-2k9w)ccI5kWpoE%O7D+)w=3r~Dj zjghJ5ijZ3XY?ox~c)WZ?;V!Up0Am|U^lJotGTmSb20EJbO_iyGL=)aTB_)kL5fAnek%US++ zjaZ_hJ4Yz}llkxw$_k z-mv|8B=k_?^lgK{nE(`F`#7pDh(XS?quLeTKVZ=~9N$K^_zPk-OAdH8>J{$~{{bcK zL0KAEv-zjNd#2TElWk>lzQJ4w at GEpl7Z+kLl{`C zTa_m@)h$vci27b%AIf2}V>|M_erK?gOcQ==1h%yi4MNmSzM&f3BF)B*EWc;hLtC at z z(Sdp^G(RWz3}QGrmvjSIMby3`S8s>C38sRNwFX2I#7Lh8>yPhwOYcleUkQD}luCf! zeq0>gLXtCoIy^~SRYXAE`FTTl?44&hC8+{uO(L|qkCU-A*R^$7+D`m?OB;;}cebo) zNom_rANfj0hviD)A?-|)`Gdj8oTyW=Ml4%688yS*Bdu7V+yu#uHWh at Rs$^cg{kUgFS1^ zZOOQSC-=@~bi>|8 at 6OCgl;RN1N(awoC? znv;Ka5vEhOE2sL)8Y%v_t&!nh)~IEJ$dAko0;OR)PoVtKw5EU9U)OLu%7QLvDj at La zTXYR2b;8t7wVKI%SA7aeTv4P|L_4bC-L-SN8rpFjg zja*-IGcnW at dCVdKeF~BrU`&%|`}rUg4g8)5 zgxZTj;1?a6RiW!lf;PInfHQ}e&jGBL4_T|^>4*w)!GYJM^C#auzs7w}Ou%5LS5N{g z?s#YIXv3o#bPcT!j#kEeT_Be2ZJ3>(hN(Up? zqK%=ePKy`v?L#ibZ28z3z(`~IPQ94yO}20oa<1T`n}4WsajS_^R4$-DX;tO31f zL6wHj%1hEeMC`D(Vnn9pBo}m-2osCLn18UQQly4n!m_SW5a^gbFJf<3+wPX4cW!SX z)J`FiFNU?6I=L*_75&uMbv-$50VrP2$~#Xj>h>l2H1&B%%AF__V?`?+GpUJAAc`q8 z;rP|P`-?l%40w<^g;VCeh+=*tH-&Cd=^P62nErM93eV0(Po4gpWtGEv-fb7Ip8rbD znN_(v*+UTW+2l!Ei%hXBJBCZ=%m%Q_U!gmRj<*NE#xwBG3nX<7QyRMqP_r9`w9bq0 zqOp3>X4P+aGtKJXEd-k;WGPEV z>LRi*I$xFEH(pj`9vBR%m7X%cQ*TZgm3&b7cn0W(e*PeyVwFW}d$q^6K2`{dP_^0+nAOmf z{HLE at WiH7_&Q0NPH?^l%{^n=AaZ*MFwd(aAv91rB!wD#iBV>l0z>h~x^ROGeQ7>xl(%MdD!`B1&AMkQEIV(7^K?)Z-%+ zVrQ!r{O|2waM-l_mRqx+bDW~#d}h5wPjXU5trIB(QKhgIl%0qi#fnWRZn-bm{*Vs9 z%p~@y(9G~;&(g*cy~xXaTe|y1TocEhuLB^?KSDAzlazqnFlD(?<9Q=VcigR(8py1R zso^?_5xyT1c=GQ;G&0b((%U!klU2eHiY)oHxymNMgUt+ at uF})+QO<%}iEnYCT3~g9X zm#lkJA#-+*UqBW1lWk!z3lkFx`zNL-Lp3uA2R*dw_qqf3pb=6YJ)mVA1JgC zd|yv^>@#_L)G$87ysDTao#7 at 11nJ|(wJB*- at xx)(bM+$k#2AFJO>a`kF6#O{Vw&^u zO&<261%AS at amfaD!Wmd*58Ybh@4O^(B%-VO3_-Rt3|_X`_= zQx)EAnb)mPRf)mDR<2U%KihT9^FC2Jf at fhDPMBL%XVt64IYO z)vGsX!FKgdraDUSuS1YgvpwcEG%k(I{pqo2)FGrAUn|Q%d at 2wt&8OQ}WnrM2 z=dQfK4R=QUSjw=wpju_hG4Y5vw|vFJ;5y-#^qvTNQC?&)A&sszHJwzXFo7E0Q1{7& z18|bg2XZ8X!pKq^!*v=Fb82I7K7I3!$yMc4G?10lGPWgdW=zHWwvfPJ_b&5#-o**Y zhuG6$rVuLr8R!s0=mD%K0>|eTM2o@}KTW~jicSsh<%is(#+GgnX{t>&I2krXKhheW zpI@>9A0Mp(k3Q6~g8$P!Z3td*2FC~GjEtiFIX9|YslVjVd=Xu->Qb<94kz+j^f7(` zDW)m;H&u3`Bh5hS>4QFOCF{)BX+szM^}(2%X}^5KJ-Mf4 at vsA3B;_$c5`;NpdJ&Qb zl_NdEuAY=0L7%}4GCREy`Xj)d%?W)`Glik=*=*C!T^kGSdLB+sq#1c7(wv@~ z5fg8);?`7M3`Lh(@qxiCS&wFEei}w<aLYV=>Sg z!afm^!GjbpvMbI-NNqf z41T^!$@LHY*4{zAsEDrq at GiljiWYhuemE9)p^Yo!t|YheaU?t5Bk6-ZXLkpX%MI0@ zLG|fq_2_Ut%~2^-``V at Z{H6W8n6|O;K9bYe at xidm2<5{MKydgmIE{1r2h`xOZJi&2 z$!{2sv=f)laMP9#Aeq%@h0)O>gy4Fp4Q at ROwn$JTbt+n&^#y6aES^0`RSB0IFJu!c zn4uv$o!+^zwlR7tIl2g_!F2%{CFToZCd}&cxYO-O%vd|71<-w%d{w5PL6j9al|>xO z?O<~g&vzs1QfgH2C|5F3k{nM)NpxE%!tTW4LzaoYOEwIbn}`b{M(5a8m)evK>5nV? zc9;12XNGu>kbUi}r0E!i=XhDT7)iK0(lx=2N4l#4!WOvbyL0-89XqaI(vVe!kJ&dS z*j)_lp?X)G>3x`sVFc`*=`KL(CXQkHkjAbAQA&K^Lt!*2-S2Pcx)#5sOa+V_sY1@? z_|@}apz*E813&WeWoGPV+bTcr$9u^e)_zaYRuxTnQSM(jPO=ZN1ixVJ#&3xZ-SpkE z3bX*#Jt2s6c*O6gm2 zIZP$K$oD3e^pX(7AVf?Tuyd?AY`9f=t_PiK!U$qJeNFDKEj}E1DKU4LXLz*EVtm8= ze*tD+=X+rCUuPSMUqC<#|4V==Z)D-B#M&pBB; z3R^qcyZsj*S8?<2w#naC)t8C(-~+tWP*A=`7v) z at E74g5VJ&Wrm9Q{iSPby%q1(u_ zU9iiM!8FgXu0)TW1`}m2abfGH4*1Z4`(ha*bh!unojt|FS~s6xc~$c}EZ}cep$R++ z>r<7lnd`*q4}-oD#DiVC2+x6tv&QfNVR?Oj)UzZ^KDTz!L`*nuxnM*+uqrf zDRdfRTjkj|`+vMTCryzhnqdU9q}PVEtZUU at KCX?AL$Fktb+4Ot%*2;T>e$gr5vX*; zxeMJdJ2d9`QbYIG>gMU{!6yacZ!px3)hsR}q?FJpezjI6u%@kte^UpEwE&YTpSF+A ziyG<*DFDAIo+R|eV;bcrbkcW?$%4BL$#TR>cbw;Ee}_(`MN2$VFd(j+Fz0ln zNWZ8xygl&mBq~0R;6!*3PkMG#ANY at y-mo08 zj`v^dKm`2X={5bEbwK|wMHvknL;(C3?BO0wxv(YRyi&blgR0P6KY)qkXFSPo at m`Xl zVo;gp^^3uaEUSz7?w;>FxTOKG{d(Rpwstvrbw6q={0v44YKD$77pwY`)h6Q`g3uzXS!47L%CL0Jd+5bg zI%(Mw9RFrZ(Hrf4#(*n(00}M1=G-7hzq7GBD^eCVkNmP0V9J_4pxil{abn3Sy!&wi z)@7|L3tz3dy{xv7qwU)VDCm<4qbJ8w71gCI=&UUxW^7@%NHW3Y1WAd;8~2TK4W?Lj<&)wQW3&{5F8cAqhhz zWuc#xw6($xa9%%)Jsxo?Mm2{;DN at atB=#aIJO}-0IPmE!GY1y%gD7j<2W%Y0`}YGi zU7LhOLc|}Es at XIGL56;+IKJPTJ=l8pgl!9QE|fhdFQ(6-Td}lwp$Bku_mAjWD(_)zl;>pf}K{$wO z;(s~r0#6cBfqGy at gE(Ty+GZ9I=>Z;idEAkp{z<<@Uq`fE2L=LS1^K_UZH9kok^M*N z+UvZ<4iTD}x*-=CP?Ao;|PJp&Bu+L=Lo}+b`4G#xv+~lq-?8=JFP7h4#2c!d4HKw~rtT zOLg!^nqxlo7-|)QpwrYnZaA_^$#TKPF2~^Iwi2i$GBp(vi0(egVEY4$=@R`&`R6}` zI80wLC;k2g2cZA1WK+t_+QP{2?_Bl2RCkDEYz&S575=pNk2XW~)LykK^0j1S1bGdI zwZFSci6r#(OH8TE^0tdE3t%lx(l2TJLT_o!2x3h4{%$;aeUbD_UB55+oz3BD)8Sg` z{rGx%8%X(vC{PbMPAs=%(i0nsTnI2 at Oz%s4No|$1--0$wA!w+AO=mdH=^3rTq9T1R zZ6&(U$sA-T%!2alsRD215g(JwZT-%#Tu47uSY zZ~XoCWqJElam7!)OrxztU_ at k+S%ze#av?rkJPl`I zg`!qpXwFa|3+pacL6rEggmHA|pASb6NHN)pFp)}vqd#u57|=dx(KIveaJErpuX5G_ zCDIuk=Xfxch0`EA75^&Ne8qJ?rNR_bG6s8!WYapX(T8;9P>3DvF$Y*MV~}gKxy3cL zdTpv~Kb_?+-fQhOHF)hS1r|s^FPuA?@9ix+);&Mw4pJPv-E4CuZ+yA!ZC9ORCLyui z4hTg+!ia#c)fs`(S%cY4bNv$xeUS=_o0>A1$%e~Vq51NL!SHE*>UH#}ZqTubTGm_R zI)wvwRYGZ18NIEw^Zf#a28c8|!6S#yN0}|^u?=MaF{?{ecqLnnDL!zb8=2-^|4sU=&LHGGa80B(GZAQvd=XV at q> z0?(6cifYjHM=w at u#iiUdh(x4JaDrky5QXMwlkN>IMB`IF{{SK+OMeSIc{hMY@#$d` zpu*x6 at Y@3)6czJ6AB_UNp!HQ`thkWK&J{XCV3dM?C*5 zja?`b3J3_F at ZWK&{@45Ae_HpTI+W|*ElF+SCW+F45fOibgO8QzA%O!^CkUD1hEow? zi4mYz?isp>kz5gGZo&waFDYAH#w%M6LqRTi`V{HeNr!7jl~z zJJ(fLqyy>HZ*R3SI$Zfo`CPRgXSM5OdA)}217QjYV_5fJ%5>o2?QDUK+k!pWITQ!9 z6K!Y(>2LH;cFKsgL>uu??Rt~)_2fAvp};BkJx{`{b1EOIFgLGHM;T&Ot0p+W%ktSVCHKdUi1*mb(K1WD!Wu?S|XEMt9%SjRMk`gt(tbxRDkWJY0Qq8w|cz_!Bqgk zxz&{lFQZpsSx>NrkoC2 at F|Iw7$AWQ8+z#oJykkJ7asyYK2HLO0?@ z)d}Xd1{_WqI~uHo%m%ySIt{&{xRUQt-l%ll7M6mv$PbzBNm*TM=dFVR$1^6nimNB0 zANhu2D#49n8Eu)x&X8EEWyrx1(8L+?+0953eDJC%iMsRl=T4HClSOOf=DIOjr at xCS zi#%k&YIN8hd9EXeg-?BY?E^v}&uNj17&Nve(3 z&D at 55F@+sDk=75eW-t}EJ9vD4rz@>W8=1?&0Ic5^Htl}#l(PrKRCsuG5%~>-i zv4)M7ucstK6|oWJenKmFq+>po at BTr(l5H{wip at nzRnk?GAw~-pjQ!IzK4L1qy25+N z-+JU+2hB`N*ZX_X^q59En&j!ziajz_n`Ya)j2_8BK|)xn?JqUHPOpcl_J*?=8vhuNLf1Kf3*gG3taJb9rAj)!afZ5uxp7Woe3i-C%DBzNS7MbL`SyZf@^!eAm+&rb z-8T=XDIT8?avh-;hLUj|!-%+OlCGvpc5>;k5zv*6T;}Ai9#KTIqd#TN4;(MZ3UQie z;$HX(@qL=I4gCYuL)m`*w_LJAt#LvsvGi9?Bj|is-ehlbXIx4bNXBMt%asbNx#lPJ zWG1z8jXuP79D;~YU$c=X*mmMAR~PB-JA*fn))3sSUjQD&!oj$F&VGV1Ee7up6oa>4 zNQ8C=*?#d$YR}r~Sci0Vjs4L8rJB;&A&Xi~a=vH$%@(30-6JQR*63 zdnVMJ$$~U{Kz$V at p=Y;XI7|bDV34m0UJ((-3*HsDelR>CIg0A204WZ+^98o|JLIJ!k}VTqi&bpHje*v$os8 zb*{=$_(CX1nA!d_O+nH_Fy%a`RB`5>l>M}(HxBhNAjs9)Wl`!Ip0SWo!AZik;N#Cs z+<1^;0d|6;lj>rA!aHS!w#8gDTHt3Hpwq4X*D96I*@V3D3YD#L5kRmFbxxH^{hGOa zknB557*ycT{V!05Nn;u?2O_ii;GsMRD}ZRznR!BAlQ5245Ob5Gb5pRTgmcKtI$s4t43;=gh*EW zvRqm5TSHA=v}1YL6&}260m)}^2^I6KV)S?Q-mF>u0h`+H*;eJ?2MEqsO!%*MDeUCX z{W at DsYNSPnULz)RGh8Da>W~nbU^Zg1ow0;#g*fe8+&;rE}j?lH8`TYQ0? z4a-xi^)vE&H=5Jc)=`gH5?QoE{r##=2e9o4IrecWqBH9F!vZsx{&v)A=jmVQpy at 5a-Q#Y0@%RWJ-Jkm_I)*4$UEcoJY3994>0I0eoO3X8e at hmqc8u zb5eNtY%T#5v~*E^u)F!*_|)rpufn1LB3m%bmScD}-#w?OHiH=VW6r3&fH)Q{iO^~E zjLxonGRmH)&uT6gX#47RYi!0Ly8GY0Xnlg0nrtOje(@7=qg1Rca-7d+9_g3_=f4* z0rlMIDSepd)}=tLuuE7U#3%8==D=H!wvd(k3RWnNyWd zC^f*przUbF8fKun&ro3&lR_uP%d*7Fs>DN=E!yr!(e1OKc?n})^^sjQ0InL?9Q#VY z!26=Zi<4|2l9mYi@;1krMfZ&( zDrZ9MZI)T}iL?<@&B=d1unZ=z8Ofd#QD5Z`v(VC$U=m7^`idH$fD4qEN%B$RUmtcN zL*;xiS%T!3qD!AYU9;Gx;_HnnOkMtMlTN(_Um#*4W*AlkgvH<#o}* zon*z)1xw4)inO+&Es)^@ z{#j+{)RRIo0kZ-1O2tu);m(M65e$#HC0U+W7HzU9Tqu$!08f{PY>-o|;)&Ymh=<`B zd7+40Uz)@s;%wL*17L@^!6f~`D!RaScYZL*CVg4AM0fcfP1fcWJEb`7Et`}q-OLi9 zk#IsCu{4K3Jw~RAL*3?%N{*E+Lr&bet}Zi^0s_jzzKzYQ3<7L~?#w%~ntQ0&ofc$ z{&=DrageE=USY)@{&Xgx#p+AsURt;Fj&WhHoq85$5QMQe5oW$qDv562rJm;E7zVU& zmHJ5q3a;vig;U}a^I)FPn!eLvzy2RL`BMSm}Cdlhsmd zZ1XtuBD<+pGs&Zt*2E2E-xPl>6y!2)Fqp%=q$VOTNhIshomq)eqq{(2+u<2`A85Fe zZ~l>208^gimpH|^HhKHHqzL(t*b9AlpdSuOvx8D zUD_S2Mxbvgur-yM|7BSrLs7o(YOpTDnN;NKEL0zqstRXbQ*N7#g!X zsXOJ+3g=(YS2VyyOVG6-bJ6(`oi3FnBVf<2ChO>`zpdxkRF0Wxb*Lx4*L2uK at 1omi zi9F6x at N1t9`K0W6eH`EHJ216VqG_5lH3ap$JMqY>Em|1<9AK`XNM+${fUMj!GQ^Xu z^+{}1g9K+#N)q*(BFxCz at hZb=hxKHLh-Y#Tk$mU!FHw&J81km6CD-bPB5KS#xscJ+ zZ>BF0B72cfX_LkZi}uGGb^O05`~PSRQD>(z2T{YunHAMjn}7wgP at tsbje7=_vanPk z*0m$O)8!oLvjH0I;cr<0=`0OTGKTwhKPn}<(LEnxoI}pYA(xkQlW5`9ditT zz`|taFl`*xJP)&qlQa4mZGG7Gt9w~u#}X95WFK+$UwmB|dke7Eg%00UvAC3cEJa6c zP})N)tcqL}xb+7a+*DP6GGutk8vPbiWWwD0rc>gVYL$kCw$#tltfvI`w(xbiZF2k@ zg_meWA5m8O9d?n!88ZxCSeU at sLi9GFwbon?*=Q&+Zdm0~;Fy~QWeeYE&K++Mk+y`i zOyZ=ti>9S563HEI&CH5`&cn99^crS}<)1tpV=#ehX2d8oY|xWYR!Cbjy#&7Rzgq`-AF<)Of&$K; zvwFspr9KaJn-bb%7Cu7;2=-gprVDc{5m6_Tj*&&VNPx4HU$8MtkMa1ezhN>OEa*I{1?bNXeOS>x{!{3qJCEeSFSGtFP`MH~oZyasj{430T=K~_~ zm3xC;kb6OAm5PFvW!WI9%^f;57u$KVZko!$7M}HwKz^8(R%so#I^AVKFe+Mm5B$$p zl;T*|8~9-d&c~=$FloIaSGk>#)(~Zs>TQ&o9h7FT3L;%|WMyo!YMH!h znH_4G2VZ69!^-dvv++y9Hl8X#x|Kif7ka(3uS)P+y_|bFs7+^UzxpbHQ!RqYAQJgi z{qfywB*eXBJZ}HQC4AQieVP&Z!*K3&k&l&DElKzH4;L%IZ0HL(X_w1$`FBHyUUgdO zKlC;}XVotB$D_O|@5ursUlj`_Z8hqS-L&p*2w|YL?s(`{+(Ab5Gu)EQ)9d82D|Ej3 z^}n6&FxtOsKy9k-OdYk}?v(7+s0n-@#SfhBMC&{P^+7Bx@~w2-ZTFPHzX^89IzqVZ ztYrojq7?%IfVxYa;b_}&Sy3N*^4lga$d7YxuzH{WsP3#tL>{6-f`LK*{Uq^!>-5F` zzF66txXPM&{loWbjJtmmNA9XlU{BzS#GrHvl8%l*I7Xq12q`5D;X+iV;|9mUnP_CU zE{c$36<{qKIIQ2kMx)beG!mYwkLV8~hZhJ^1h0 at Jm5j|E>=oHu)L(3|SJ%8hp6&^F z#TP=UhE&*&;X=5DjW!_;6sL>XmDiKrrq at e}G;8yam!VZ at XDDvj^MvCp(wCMgYK>4Y zr>`t4(^7Sc+DWGk`9Zl=_ku}@2Kgw#}WE0OFXttX*%@ldOF$1lk#x(4Br^KG% z*md*MGQ+qDyirSAb{)E?+{f<0jGKge(Svg6nI=NNkVUTq8R2Z9iZbJ0Se8hXYdxqk zOIX)0SuKY)PMuMlN2l54WU*ghJLB6*kV^xTmSKkKT;uEu_hG|)nn8~2dK9s}d4?2- z9h;jM9o;x^T|al*3cJeaFKU$8nW#=CDAeV6<|}cMbSK}cU+_i98xvfCj#Qvn%XN=X z2YuCRL*oR;kE2%5RX^}f(J;>0x&HMQX z)*{PK1)5Rhz;a4n5|h(KY1xgAzD>+(4nXa%hDLdw*|HaGw3E5Ko?ZnFh-J5(IUlvW zFAJb<+Rqc>^A2C>cD at _}27^^(IC7b8c}cd){%YDRv$huG^PfLLv# z8d7F-MSfR!ZzR>~d#k?uLF=H4pbtBLA?@#F^Sc>3f#r^%QfbhX%FVm9fV8kIisjb& zS?Xl%m?JZKLFyHvu at GI9k)I-62{U| z;Hajh9Ny(znJF3xkdH}H%+Lo5 at 8VQpfB1=#bq{(y;4{=+Lc>e|P|{COqyiZ}Rkm9t zVlgt#Y%jo9-iMtXUOeadqrenp(yZd1=f*ulkqMr|p at eCK(`$Fx1N`w7U&~dG8P`ZA zlhlTyJOkOp3DG|P(JJB5n5sto3I at iG^dEQ~4I^7OGYJRh|AW`j_CQxh{b$t7xw%6`*W}&H`hEd0}o$nYNNa5bgSaBQdfO*`J?Rx<%dQ#tvEkonh{3q zRaFOoKRjiR%A0&+IMIaegjQ1Uf)NB3dwT<}k-cqH7Y&5=@(fR-)P8lOmbrpKD)m%) zT0y4W&SW^k5T=&j*jxPQ!1c;mI4C+Y_x=tOcCVKyO9UzWgw@>U0kg0Mgg_ z3eC=+3eWQtOo^#h6c@?K8U{ES(HI6FFVeg6vL?9swNjm}KDD4fG+b+~<@ufdNL?85 zt~I9KqbYyH0cNPEWLhDQv%3$JkVeu*56rbsIgShj>LLat?_DmlSpAW;wg at j~Dy$r$>OaX>HL`buc z8EO-RB^m65d?U5~bO8R|mum5}pV9X#RG=T!Mj}I2TBwOEDpKR=17*ZG$G1q5*pgj-^1FAGYZ2wiVISUE(IpFnqOwPs^A?^k;!e)3pUWqY=}mlgMWOQA zm&6pK{;Z&gcQBQbu0W}%X|*C_E2Uf*kX(4us?BJEQV4wxo~2qJN!;u+ZH(eDNWO)y zh|`HNpUJAG(aoy^D*cj4&lR{s&iwrnAc-a^gsNHf7qa|vC)#G&f z`t8`q1OrlIo>PL|1LKMiqw~G!P^ev=?UqPr?@;_~Xv58o{gE;=ZJsfNX*AQ)yifMC z7w9;TC-&s$*+1!W1UXovkO}jpksd=VUargl@@_}Qu10n{3qL+B}CCSNe(Sz&p<8m at MLz)+TQwH+K#D?bu}rIQ+v&h>6F3fXtA`@7RsXe z at ITYVLoXMy&wIQv$A7!)FJDhac(t$4Y7y6{==lDKe`11`u^~v-fR>>UUzc7|jxX;- zpI7{#oF593JD^kL2B|e1HEQ)0*_A{TXP}Z@<1oKxr~3=b)nbe`fp_4SyyBJk->B86 z at 1${?zk8X#Gl2MO+88`-bI_Y{=s2F#V}+ at w^Y(E!q7;U=$6a&Xm}A8rC=Qj!Wffv% zwa}&@t&FxA3g;5m%UNYHH2|BEa;~GzA_j+SA3J(3h0x$wo#z1^cZi+?I{@XKl`Ge zRmr>Eyy|1=J|pfF%Mk7X-H+(wpjy(a(H_`fV`aq0g7CmOR{gtP;Vn>pcN$L(97~-D zNxfGbLn~zLY~o^&_!VdHyqOZoOdN^*aB-jz8pZPi>VIdQ0!-%udI&Hu44D7FMFjr` z*7+}`Qt`j8UMeGhDCp|wXyg-7VPfRV=rTYtdQy{U3DMGj{8-rTId at h;wDoZEkR2Fi zqM)GY4iscV5tjc;?_*r0^u@^}R+e))CwkouQ>z&#KYIiNAkupi3GLG3<8;BPTJeSO zJk}hsk_0y3d!wMiZ}(Xf}3v4Sw%uz&xoDlq%@Of zj+;@~FwW3irgr#|JZtSOS2@%?QT`b^rXsvaQf+bQxoKoODcou5L^dkWu>>bE;ZP+m z4P}zWGw~4D!m<>yTa9kN^;f~6E5kSkyZUrRYJ3l^L>yffI6!8MsWoLmef`iB$Dtzi z3KGBQh^lXD30&Gm%LH}YB&sF(BvwpSEmPql8AQLxOb=8d!=V4!bqvFwTjQi+9>uiu z^zExe#D`e|r&_5cirVL>wkqxF09)}3y#Z6pb5#xNorHBz(t&ZP6->`)k5rJIL= z9(~579gc$!+aEF%oD4JbvVo3WqMRp at 3$P{7U1W at e^&vzaCWJL=KUg8@{Q6cn>-;>W zTK)3|L#N$lE^YFHhx3Bfk1Jax;!$77bNa~rdbagbu26ZKpns?F93zn*=Q=w==~%zF zDtzpbLEQ8+Ni{RstBq(#kNF1t;nfLy+^MboG(m{yk=Y%V2dGOS`sG(JigdH+CpWD` zxCVN+D_WG?sx=u!C+|}YNqHY%`r)NXossE&8zW at Yz69O>V?&^-OaLd(U-;cZ{|E5< z_iUiL&%Z7*e{M2s9P{)(i(QARJ_-%_ZkvRY1St%$1sdKF&ZlHK72C+KXKYilNT9{w zilGVqARP0w*BmyCDba2Bx$t_MYAZeRcszT2{0S!G$rnymqGm}|o<49uRPFEdGxVKyOEyAEfLv0)_T`K^Caj#*9vp+npDZ=Sv{j+)gh9%bbWqSXlfHM(5c zf1j#bLYete$s#@lBkS1+D7I~y*}xU`-7+`=fJ_g6X*5pdsCU^XQt1Ce*wmZHCw>fM zVTdvX3)ZNoyO_voKXaaw6CcZNlQSb+%`!Y&{7p7nM?tQ!f#E>az?fCZ1b~U-ZMWb} zCe5nsUif}Cm`XWeOg^L9yB%q%)xPXZbt+aiKXIz!mC6SVSif;Knk7cESobfnXOE0K zV=T{ezTht2+}CX|;+GiPyDE9loX(&CSvJ#7`o0SFH~Yevj{rk5shJj-lF|-hLW5-r z2k_4trWW<5XAvAieFBh5YgXuox1&TJ-YunE%-H0IgUr&KX{&}<9y$KFL3yxG?BoK` zfouR11CSpbmDa))*dsdMf+HR!_Ju at dJI&NwagI)0bq74IgTy6Pa8 at Ww?brWqL;*EWI`(M);YpPX2xWNSV&6X34&n*fioFz3KolgThVl8gOlIbv|INvr_s#XoE z$zffIqXUepqBy>i;}((W54u*zM2|#Jl>f{%ik=bo_)#Q2a13Ae+^<>p#$o)^ayg9c zoni#KzJ*Jwfx at heE2OZAV7(A0gHO at UuePvysMIjp4QZ3GQb zpW7h#@+7&I3*MbPX*YW<>_ z^rJt%fPw8ofq at DC-(vCKiXIIsGmrnli^u at sc({J^3d=N7sf+Zv9GMD%>X>bliT| zc5IORI`JXXOIs!x$K1mFT_=t`7+%tt!#kCDBnPV~#tNvt at pDvY7d46z&MB5zdFB{`!{bBU-r+%NtwQ^SB?c!kv#qS3tnU)RL4oko{ zX0n^mW%LFtMV9A&VK}|vN?pcf&Irj4Roa3JZe`lMBhLS`NKvb166cM~ixb=mvffk_Z8yURF6=t~euzuTwbK!c)EK zdaRE4d$_r*Y6>Z72dz~V=wB<+SsdZHtp^1vh78>;g4T*SF#t&x0-;7qct#RPHcRg( zDT<&{9{X$k)fs-b0j_sc*V98{suF56r1&D583)l~4 at exHE~zyVbTX-usA9i5V=qFP zYf at Cgk>p;g80j^b1KuGi&Z1a024dM8=dc5~{Ugy7yWk_~G4`%j=mRu0pojhh;c&V) zlB%GwN}*DGqE$=AA-Kzr9oj^nnJtfm00Po1e$z(zZsFRXEYm_vYsvQl)>C0%K*o#} zXYzL`>Yh(p=U;yPb{i1~`uip}xKMgT^s*albdi$z&iH)NnVRwM at c+Acuj?gp4S)IX zR3rZXWZo=f%>Og=(^Z{U`WyN=5R>bPG3a1G1vM8p71IPA7*~rY6d*DADS|RkrO-;G zl|Pb at cvOeRg9UpD4_YbhEPk+vSeYj_uKw|VJ^y3>F#Y>`4>+BnE-;#M7X^VdIz3u= zz-)q;*o0t|Nk!^0NnfI06?Ph@$YfFt=@}LzbuGlZq*7w8u0l8tt>@7QAolp}sK%oI zmpdA)v^!Hd*@t%!LEg$OmF1CknsT`$_13zs=@ic;kwCYR$4KCw{j&UWnYCmECD#T$ z&RbHZG8W`Vq!G>qF37$~vP$8h9#xdc;nE36EV4~_y2w&{Zf%wnWoxI;DyuVzd`WL6 zWI7&y789Aa^5pfFROlW}(3kXuPjAP*Z(rTM4Ny3{VwRHR5gl3Fc8 at yD0$E_^`B1G9uD+-^eWKfEuq>MxuKU)60q|%yrQr-e>Q#8m?J(?KTQ0qvTJ3fNVYE_*I*!+HB+$U^h zpVl9f_Xua+X4trLi{7=0b;x14 at wY< zV3Ufdeve`?k+Pgd6ZRqLN-=SptK1&7gef(3wgT+%#@q{(-2oO{khHrDYHnCsvP%y7`L zGFqs_so@~~*Uoyk!G_jG%hQ^1ePEmOV9ilwvp&05?n1j=0+YPK^}j0ld%R|#`z72G zi-mi?Nlm>AJDj&*4$@09ABY>{L6QTg_gF)a)&Ha9J+Ok z&5b#H(P#)0tv at M7`Dsc`U+idC6$CdNypLh|>1UkfJ(iy(pu2!qMes08r at QuE02gX8Sxz!p`wTf`eR zLkqGPFc&fCKmY{_4>(q2A^C6kvmP0LsP_vo^-*k! zn5pJkFNwV#7h2H4&jX at pL}*n^;@NoJ-J}GqOut;P1ah55{8MaRJ;8jr~7f7WR;iaR zB);DBvcEcYvbc!lc;LJj&05j2nIoJbTy%X9B9YNSftmO-v2iZ_GSw?LDfIkX(7~{aY0LC;19o at n@ z#B%})jJDX?x@^m0LHIyh;l{C(M6(n?F2yg~3^G8ljeUDwR+w*39&Zh_vPPV7T0P`+ zw*9GnEHRb?1f{a+6{GHJc7B at ibBByq+&b at Ru5ju{P;t40 at -H{$8k~1ye}G|n55I$L zra7`*h at e1wo+Shq`H%P5j|@ZKYq8vXS&z2r_EhX^(CE6x;L=kjL#p at ji+2emS_-J594ECftC;?RKlZB4V{b@^{Dh zyDpoLg##Zpm`^?_+2apTIwBymL%_d-+TS1WsN1LJ>Gonqc|lSF_;!US*1+Ji0GZ^R zi~3k-t_A~Zjk+nReG~R!S73bww*^HhK{#Ik-)njw^@HN{g5wr;E_VdTX}0B`x{@WQ zh|ia(R;b(Ij$ke*C>4kUs$E7%=CFiUu%S}D<_67S}V4TA~-tumF7HW9r?u|)3C3Zwc9h2rgDtR~|5wHl8qcNzb2 at 31A> zP4qAQkf8qux}*OUQvWqTtEugRzKrqFZjqjA#V&=Z3uc5umz7}3mMAZ0XgVk&Wg3JW zHGrHDvs6aPe&;&Q&rif{U_7kd#ak&Vr;$a+7hfS3UPj|J9;}-37P?Q)xT@!W9X0-x zeZgD33K=b3zTm<8_&Vi$$?dV_{fQI+ITJ=pvt~qooTOO~(F_OeBL751puSxZ-lwu% z9$q+-bcCU&G&^8?tF>LtcAFk)&bJjpc|{hGyE~nx&KG0xbc>Pdtud&1&Hmw=1KXXy zoki2Ut4os$x_$Es6lA3Flt2Qpi^uOg}T(?zig zIpig5S-9L5bdE|knB;%>gn1`B6WHM?yk62TPQ8M+q3zbMU8h}bSpu?pTm*{4lFI7~ z%$zJ?ND34c8C-k$?K$g;@@oY^Hrk=jM;A zs`UTHnwUFyj)jz(`6j0uvso at 6I5~RT^>&gpvwrLjTWE%emrdhYlY2WBbnJ7&k*yP% z#B+hZnaynMtg)^)z6!F%<#DV9=Cp?S{8qo>NBBLA#8xDf`p1T=+O%J;R2^}ikVo6& zuHL%VY6YpmdRfL-aV>OrBYV$#=x&z#keCr+`Y4+Fg6b(B81YwNDtyWdfH{C-)P?a14iCn5IgkPafCi_xd*d74Y< z>`Ab5wYkGnj}sXd?Q;E~#PvJb7`iWF^(|mt87r0TdIVozRfgv-#)@8GULN6oXrhMu zv$j!{z{`0&g&vHHDW7||DH=mDymlu?RsE}7xvNNx-+aQyUx+G9(k?(LqY|Xq&)@Pu z)B}(`;7a;gXx#j1z7`hy{a`Wvqb}<`(;v-GmVwC6gYqoY?jB1hI#=1>jG#5Cu%Fnf zd at 0L6x@o>gtcRy46?5wC&ZiiP1?x*@SDXYXTVlC-M|%KL+ZirNPq8v&$MH8(oRI*D z#24Jh`~tK`)s7D15@~$n;6Z30 at ar7m88!BIMQ8h(3}Z0{Qg5 at 2QrhMqwlfxXlIsa1SB6bKRy zGHIs{3Rn8}U1ENp-7=tpNN3#w3Iw374f}J*=4Qb5%IChL!#}lr#X5l7o>}>v!4+9 zn5B at L!U<8kzDij22i6$61#}35Hgig&!QeNgR`x7n1Qd9w(sU+gWaLwJi!+mEGZDDQ zVo-M$RMlkEUGHo0( z$mQ8n*+Sbgb4x0Nw)D?)@6LZT|FBLW7HT9R9pc)Ny+2cP6g9~gHGU#d=O4YCG}PEo zlAnN#loUgjqha3273KT|P4#l_cziMXg#8Q2h*m+B{9TSN5RYgEAKj9lVQ7-=12v}Q zD+uWy1JRd2dplnUFtBJ?Fffk)TYhH!A6a3lo#MI%`tT>Gf(a!vsR_Nf*(T2j5iFaP z=gLx_rRJEZ1dOeaM5#iibWITN at YLIn6_2$j_0!-5ne|t{vhpJy3Is$c&!~N$*y*-M zj}L+F?lHm7?q_%*9K}TJAx>j0Y2sjLYTuAB<0p;?NiB>m6XvQ2BYnU(;}vvK at gWat zz)oN^J&rogI$#uSawJnDiI>G4djYo%BW*p?X4O at fS>C=DH*?Q1%&2^=Zml at g>=(d* zq{S}76cEh0p`y+ia4=bM(Yl_yb81(ebZ$YpWkMW1gMOYhHW&J1 zi#u4N7z0XPU at 03{&<&?Z?}Jjs{DpJb<@uELT#ObcbCu>CkDnA~QsLr+Ue$#^YfOLq z;PDJy7R_k+kh1+?mXtatHw(Qia&^B{ptGOJH5E_*o7GZ{c2Qa$mIx}pi`g(VOEB|i zWke=_Wx`N?Le7cj7hW{SUuA%aifKlI at iwK+&*hRKA7wSVhlQagKW$} zb$FY$b}o-A))h|#f at Q4{x-=3 at 6~=gvYNpq1k<@?2xs;TLgCc{%Ck($2(p^+gMdp*0 ze1vlYPadt2DCV>b7JGmbPw08f;~b+zl$%>gW_RZf;eUeyW*Wj96tpEU;%@c zr^jH-FJr9HM>Nl}TWDPco|B&=m{u+lOH$+G30SiXrF+w)l`~sa9-FIF*c_tcDiC3^Ou$eF?U_TRU z;eO6|T;Z%nxFkr2??ilb4;T=CNQQf^NUD7emx<#FwMwK4{|3&yNp9d1 zIPjDBcwWHL8!QtskGtJ?M77E>Lyw#8F^zUCr%kTLIdH>VtnCivI~^xZs*kUD+u(S3 zIn!(_NkVMek5;eTbpM`Gl{>z8p7`S5HB$5 at 43=lprdI5UK|Hr`*4Sqv34DaSYdP44 zp`3A0LGsz-@(<2Y$!8p|@HgFmQuqKeG!D#n`|JWwybGE0-PSU-nJh~3C+eyqi at Sl3 z7#FV(HgpLwCV=tQofa~M&t&UXg*Il_08pTx*fsx#_dkv#9&Fo;75q(MSHAuSeK^*C z*FyjMkor8dO`5)Nfm)yBAdOw0fRM5+IdcqIOlW!&$If0uPV($I!$oje&nQx+rIPd; z_y^Tqj$L06Qo~wFPRHYx%hbeq*Sy2;9$zS>J{>q}bhR=qr3BC}mwjPbUJ*$|Lr^3f zlq_5-#)c90tw%^2Ju7-v$vopdUa7 at 3YKGr%$zVh4Nm^#Ve_x0E&hxjxgQ)I$U2;?T zmHzK0W%~ufxA;J@%@b!JEZps6UeDxabG==HMa4-vaFJP$_-EKu$Oah%b`#LfrNtg6 zcX(7awkTV_#7>bA%d^Xe3N at yZstq;QQ*^|W;dfrOHoE=O2D|UDS^6aV&E(Ngt}>jj zQA#GMun0xy=0PnsHh2=pVi01X-P}u39`3nqp&@FSq{#A`V#T?FTeW8p`64R+`V~Z) zLdNrLpf#%O$t~%%4NR>{Z*jKqpIF*Nx at 6NNBhUT!vj#(5c|ET*G1+d;z;!Gl>(Dm2bgLS$1hk zq!BY5CBlBL5mZA$i8EzDne|E$n at 5FF=EiLUtr_mK`$FHltatjpQ#qT5Hzr6$>>Rk! zg^wV1`$5Q>d`TpVRW9Q}la-x}AgPfpz%w-`&nCRYV|@2 at p}$|Uu3y0T5|l0dLQse| z!08lgE5A0t77E{_KzLh3-ebE(Y!R%1GY?PLD?t2#0}E`SwEP)6bJ{a=D%r%EUW_2K z1{UFXdjdh$LU#X0V2A at T&lUso(dlqA;RlT(x`Sw(AiOvW#EO!bPMT9_ncG;W%&Zm_ zAN~?CKRUrcO_D=wu5qjIE(C2<){Zy)Z4<@uC3W1b>14bNT(D+h=Q5Qf4&TQ=I7~`d z1j7BV%|}E12R6_4UyD4{?Eckz_P=OPLxhtPxp8QR z$hS#*hz+S78W4MD&NP&J+y2*XhG{$61kSyYhFq6v?r9f;3#)*Smk)?ulH7xYK<*H_ zF|XsYvSB^MMLYuLW9SWfFMr*Ars?=Cl9)cv11}OS4=?Pt?u*xWZ9{d&24BA0tFWIbvzwrkHot79!nk{m zlaG6DwzRG92Nq66Fw=YB(_jMNgAXdpjd?}vBSnGIje5WLpf{Y`mg~2g9$>^i-kRsH zTmL{OQ<HFk;C02tGhB6bFL=m1Q(JGA<(lE7T58{ z!fw_fnc}%ka>$%LQdUK!7Ea9D_W}ll73+MF23FO z at dbX+1UkYpt!I0oS91~;_RRx;Ga>0J6by19$n0b)vAm6eaRO7;on5v5JhI$Es(K9* zp`<*G?~C^DW3!>^W%=nc>t6$W5LkfmD@>@R#9#)*F_vGX$l3+fFawtP-O9BWr&G<% zHi-wGvkX>;v4_}i>zopvnqRP>Cx{XX5#*X6E|(DVgXa#@DbB4ffd1RCAxY)y$r+1J zDEiHOM>V~sEN-UDXH8W*d7(F{%Jpou7fSoAT^97VwFfO8H&J?SlC^8E-lTBqHX#KD z9(R7A8dV&i4ZZr|6;x#vAzKM1qy$n;YpxC;*Or13^lA*AIbpCWPP~}= zmNBk!S&jHqaZP*>eDP$Ng)@H_5;srE7pTNHRsCf~%1`tYclg)`*J6ZMehpUyW*%F1 zdLv9~dP|b(9eL++1bxVcEX4`?+#rTfOYu%p{dP?lcdDeXRb-1oaJ{J6QIro=-=6>Aa zt+Rkts7>d`WB^cI<9`+T7+iJZ}+yZ=|_Q zOugh?`_70<@1IgY|8&20S2%i-K^e|3)cLq*OLCyWg>z{%i?mFay#bKCdKP+;Wkf9P zK_K*B6g;tf0gv_IIGBYdUvnFo#bj7S^Vkj8LB6Ja6X^4N1CvEKllBeQl;&NZ$@IB0nC{Jag4FJo)^q1vUlqcZZhd zHr3^3`Q2y at JAGD8_F?2#23C?FQ?Ou_db*2b`AIi!r<*{&(nG30_5RR49Rb;ppiC4k zlx0uZ)E(Cnk^Bs at 8qbYczICH?DNU9|tTh|@xcSBN5*% zPI%}XH+0i{#+`X#ccp1(?*%l6tD0xtN9Z^|_FY8QOy=4lfCR&si!9D+w$YlzeRTf= z3`q=<)KX!B6c3CXhRZe7?pKA{YaOUV=F$(S)i~LNyJAsStP_#L2-#${?l5!*jLtjD zAmBXNqH17I{dB|v%nSEolfexzi*d)5#AzzbI$)goYtOq~w3k2gA>?|`TwfEqeIGsO zpWi>x0W^a9X^P$1^hH~q0<3KVOCHSdr875KVw^ZwNMzE=nBLX1i+4EX7HCB7z?|Jr z;k6#X@)f(MV7g3-g0Fb9Np(=zh+}q1s!jZ|Lwd37W(KQfXiTjiSXVSddWie4cCi1v z5 at _8MYTd&;uuxD5fv-ypAPG2yAE*AvX?=7QN}CvYV%cFhxAT7dkCta;f_1H z at KzS}@oQ*qKZ*U|E?GuDe?tP#?myUe$5h?9{4Yqr|C8ppu#3Er)E>H=;$B6PrnIYT3a5Tln~hEcn#td7-g8 z^aIRhE_dE#+Us9&WY_!s6yq z2%V=~ex1Z96TLDG!A8aj_;U`k0tk z2P%zjp#wnZj7z$cnT|A_=5TGQ9aEDu9)RbIZ=%knfbn3mxvd3H#+Q!^Sdh?6n|l{- zzivtwu59u2sfI1cQftG8djM0Rn6}b1N<}Uui=IV3SL_!bXh9a=8q_>u^O9XGQk?m{ z;Qj`x4a=tH=&JpwwBtL`7JM(6o-fFr+wHn9-Yw(!x32-QB&172Kh6m1HDJ%+ullWZXn`kpR{+QO7o;* zZm%i4bwsvwd;%-5$;xJfU>4uKq0A#4ntze04R;IAC{6S42qhx(FL%&VY#sl)=GWKO;6O9eb>FIW$$h-d_IrJQru~73X%Zj5H?9x+ z-nxv0^Z0xtG$0DAJmI*LAok5%oDVYrOW6>6Lp5e0wz+5Dy7^RxL$si?`l4J0w1{vZ zmSqv%&b}#qAU44|B5onRsn4XZyNrjLCa2mc3q0l0n at FS8&@b1~Se!vOK1-DzU}}o2 zOm=gTT&FpU?U-ZI>#DgZS*vgT8DxLT!0nZC0bZ($n1KLv99^5Evf-(%<~YsD?5eTH zEyAJE#aLWXvdbCoW|?p?2Lo-ann)i|RhlCE2RsglBlXVXX;qa^RXj|YAyxbe#KYx`pQGA^xNw&cTs7w;>Ot}3(sZ#g{8Wlz01179#kS^(GEhl zG|B2-0O+?&^uI{>=XNhB>sIReWMUEjB69kIe)rU at x>_6&`v0-^PC=S>UAAae+LdOd zZM$3d1(ir^hmGC5DuSa_H zvR@%oW23f{cA6y}3n0G)J{+OSI0w>WKm>BO-G$=)?94nw+}oBN zlQ>EOXBHQ~c^P3r^Gn9>(G#{A0{85;jeN#C!}!* z61jtIMJay}H42*%1zxv`c22taw*^iJih!gu+^7T%k3wh at k6Xz#e8Yeb;Gq~%WqY7g8;ba-er*-PV~zg|UH$Q;{UQpX zIrx+70)i`O12-#p&uqUnfMAc5%Nzc9j5P1HEto7dba*u8`Sl+IBo;`a{7`>)aQu+} zgKqc#mr4IRlu)v=LE=O3Mk7~=9*}>#vZ%uFQ`Yt at Q?6~ESFUTs3ygi(PqIE++plip zjC^E$JN9+T3|IMTBzn(WpQw)Y{5qSs7) z3d(qDLv`aE^TL}gN~IU}kZ>7bLsj81Sl&3O9raLLHkr{RwOs3x8jZ2Q;_}{8Y6pS9 zmkgj>JIXUP7`s>07!EM%wOas|&Ls7nR-DP|E|i<>7Td7)Lze1J-Nj*8X>6CwG>|B; z1m*bt4*E^hyLJAA%EXnFssqSSGN_p&V8J9ZP*t(Hm`)~L9fHDdx&7yGXORF_VJY3C}Y{_Hcr5o+_N^EJ$WRYlpf!LKL<9M>)QmB z81H?kpaai4`{3-zVF$QB)$G&=xq${8Z2F#foIbUY?A+tBD|(r{L{Z*qYfTjw>8gNl z!t9H!@kq_0i1DWE&7X)o%LHC_5)MQnhw;~Xzu|})l?SmHg&Fwn4SzC{ya<6bva_0@ zwX2?ic;+Cm^#ctc`or4D*!o=WMQ80rJGIj7Aqi2mK5xGGg&Bxy_~+p0*Lp_IDw{tc z+;v2QsHML8;O~8(a$wq6S#XBMelb=fJQ~JWmltG^ZYjlkhKdlp)nsW#A at qpyz8HM| zv}iY)dm>SW;&4Bzju%B7*dY$Es`+YeQJZYLmkNhA8xETG`5BLlD86Hn~V#E}iKbL0rIGy(f_Ts3>o> zkeMKl#2zVKx7btRSCmH;wGlDp9IQwD*=n at _Le{#$*7o)l z&&>8!*2l_D&*zWaNE^kI)+#;N9LTc#+;YDD_F(2s#F&nP(p><7m8s!Po2w<|s{9Su z0Lcd2=YkifAqFd+23hhPRGUF;et+)OeX>Om&W^He4nYTnCFa9>wZ%JjG%BcbZ|%~x z%4OPe)xPF|BKKcO^X3^}K|QV)=D`i(Px}g3D&qwUY?>Jh_GUi)4F|JO zP1uAEnG2!>2)(ZTz)mY1m>EhJx7KOd=@JJTCX7P3>ru2*hn4Nq#-CQ-y&R6B05f-~ z2{Tn5^m{=HsCZaiRVlEf4k0d+ccN_Ep3rpKly0L at F2sriIyy#b?vqx*4eJ|Ug?f)=7bys)P-6V9BkU9MqpYu z$~Sh2u0{J&IGXj&Qu`{S*%zHOhuH=$6}h!wLW at jEXla4FTqymo&PI2&aD*->Uc^U0 zF3#C{v!j&~1KR~nxVH%M;eWL&L3bOcV$JWvPM9H_BsU161sqr4ZUNFf^YVPJV5ttd z6Ryh1MV{ra{I8H{2hH471L(=QRxR;DN)XLBa?Ll>m`C(5&L^m>;Ko%8Sw}ItJcUn0 zv;-l at wCl|)CiLK_+YnQ@{Omv5iFav zDw*Jv();|G(D|l^`H)7b<+Q_*+Lv3JSG6*(NIkNM&#nTet>g14Arrm*J_dM$RXqMI zf=Y|B+5-F{9F&k-J6DB-%lQ-8vQVMPVx`FigNI*1#meZu!zEyM;$EL)lV|LgK~ozA zU$tX;(G7ZNUp#@U<%cI+V=8Crvt>*NEvO138d$)?sEB& z(iVkjk*F>sg>BA<`VMKqFt2~22uJ%-*xR`t%&A05;$W5B{osiljV_-_t`sjAk(^?uX6pYIOi?zhTK{%8}j~r{LKh_k< z#NGz+c^Z1b+|F5*DZ;^ZXU|s^DL+i#OqCk>7<`U1CIbzZ_IMlGT75vj$aH_3QkyL& z1RZoRh#;MGeL%mdH8ca>dKq+Zh at c#~2}xpb|lQ ztjmQiZM89cjj@&Xz?8IgHC)*F;A5vd{Ij#&b%CB8h++TDaBQoXXJkf3+bdg*w||C4 zYg9#6!k}ycgBvB at Jc+U9uS8wv3*h7*|#p87H6`jJKtzeey!~n1E-?xKd)ab9q{E zrc$bGu{e+&W-D6}DMzsXVsg?vii|ZwtE!jc^m)+T0 at FD!SJ%T+fid~?8YDkx$iP&+ zOMmw)Iw-M}y%b1X72V41Yntt;=mNMkPoI(dG_|lj(#km8;Q1dEspaC8-m8UVtD$7{ke_Tt$ z4SZwxSc-Yg9WFJR?scuA874ic2cUAK-bNz=jz>HZC`yg4*vytBX`(+C>8SI2?Hg388zDI6IhAIN=GM_upx;uOR3Qz6NDA=D zFELn;ZJgD?ybwR=NjK~Z=GC*9mRmM?q!^L*f@=S+*efOV{QOk>#z?A}SJ*HUX;kat zyd?{-WNOzutM3*oY%phee!ZsqR2A*_gAY4hnMs{ed at w%4xN6-N)0X<;CRIa`SZSp% zO<_fzX#};ZOnQ|BJjhorLt|ib83wY!BFK?#j`reqUF`~4?RwR6M%hv6~Y`mMf zQ{V0U$}T~!$M|UER$sJMp)nA0sFRc0%KDU3Q2WzgL7k_X2AUSaT)o%?;(2%hMY|y+ z&tz&bT1V{M8WFkZA1g#$NV1uxbGCn>kf@&B!Fcg*eI4zyBdE{x(j3fFK^C$R_1$ph?67HJYGr3clS~xb! zW9p{tz9{Kd90hZJN0LM*jaoATA{4r2-K$o9P$bSxj70}=mFEA5+(@H0D2?&VV3VoQ zw~hg0DW2}qFS at mTXSxWnB=ngZJ1O~@cF`uDaT3bHVM=wzl}KNwJHN|qY1H||r{k^Z z_kwZdv-K_g1o%*5QQYk}spNgqlfdzbJiqpwP#@aO{Afc=AS=t5LyOac zMb;V31t=Qu?kGB~7eB3A?Li*{p(VuVklB_Y;J~w>sYxw0Lp;UjMp?jBVVZT6;|Q?@ zEX-=?rd}AP*|(Kvm%ag8a{p)dxhnp9gkNNXB_+cRQYd;stY(A#jx$g6io0A2m0>-L z6|dvTROa#7DScv3b5VvGMW1v4${gdX$gJ)?YfQ9b^yP&DCU5=XROXNOCF9A at 2ay2W z!WwKxR4ubvmUZjdkT#b6W|t>@alMG zG3=Q1+^Lnc(kyN7tXZM!oEbBom>vCz%olP__zLE0S;+Q%DJFQDZTN8;OVCa7#Ebpv2S~+557W%2H^h?+KJ3;$rXh1LXVR+Z at Z3rlHp?ePQ7ymCNkg3^gLtAOe- zvB#;Yh;c&xbBuN+Sx;ckZ8RPy=hqsb8yi at z(- at L!#Ql{FL$Mbrc!`sTtgf*{B at s}$El*P?fbO^S>#GDaSHQGMo~{h$pq4tuP8vK}syy~F+{nM76&wcW=_3Abaa87wVEa{W2E<|Jo?yeH=u0m|7&=L;!%a2AE4rP4pSUUwSUNGcv at 0** zkv5LI9bx4s295xCyp(;J*{YY|I&bVRYncTyGg`1y_;%!ooc?)5&sUvOMCclB(P7+I zi>s2k~CD%X!&%af;x?e zG)_d}zY66dN00d(ZQ%3i=2C9EI8BalgWj|oM@#DZOIh`UpA~;xo{SPu?#OWP7(6BH zyuIMcHrYaxAwN=o0W$_{q2b%eZuOgU> zv!YlaCR2x?=>sfVce1uchD6GY8T2 z;_>dFo@`{)7V|Du)R=VYbO7t;X7cT z_W38nlse}tfbqakBkJ6IB4>yM$Y=&Tl7C`m7USzr4fNTtSd{7(f=}g8d8v__2jUh! z5A(7<+*i3?-w*RY+W;mpEH^x$a^(T%uWt-_6RU-1HX668!XmVIv83U zzG&%wau1-CfiJueE;=8`C0go|y&F zT!3On{TF=}HNx9SK0s?0%TpSW$@ZbDk_pvUUn2&Upd3jrophX7MWGItpV%w0o5rnF z>0 at dA>*&Vh(p~aWUwTadxc?~};dkSzWVTVrQ~fA at P>d`NZ8c^LcVRU?=H?*Aybu_s zekN6T3f~>~Ybsbz+3F8ZOsKZF0pw|KLHz1NP0>9q^mf_4B7}N1bhbsAH8u^)Oe19k z*b|V#_q(|-qL2yCMkDCUg;0cKB-&a5FV(kmy>Ro_PV at dlEWM()T8T%rx7w6`u#dq! zCz#oKl}R at KM^7nM@{&|Tb}-;Oo^(uZ!G9>+YawZL#g(mRw1!Jm9`}0sFxqLxOIevr#u(Ef{UlFVPY8I6yGKk*3 z74!2~3d%hEkKIDH%WM8vPTea-ut}Q%2vJ{WqK)%DzDJr}rhiT>mR_svu*}v^6|1uN z5Uujs#Vf3`-bny-{&Hxg+E9u$pyd!1zY`%?{4L%^nt3aI%{K_WvF%&@H!JXUeK{NIt5Aj%}TB0W)suDfi62^y4`fq z)~u_NC1%E&T at vP%-$TGJ#=(!7VKoD8jo6wtpVaJ9F~6#qVO>bEOiL1OU7bToLu8`y z=iKYMd%J2!B8#b3;;iIb=yDYoxIQ__rR;Xyz*97m=KXi@*|dm3?ASN(SVpvk9nmKe z^i##b#J^Ocv(Q$v#`Z&e*AEOOb}t?py1;{ip<8^L}B8`8#=joMYox9?>H8l$~@pfwc=}{*87krwPq7 zOD)Pxh9}qsueP~RqIZTXNucH?7LK5^M_{roc&($=xwrbSsXP6kh#LN*AFj*R>7_XK zw at POBhayq$&7RkP|6$dl-XVPZsB>~DXkNM2d^547q-%uPApb*oS_`|+%MJIwzS1{k zq<3Qf&mmNLA@}KCk at zhm?nCqOjeL>oZW9#>-FMVBjOZN9()?bj5qpIZSi^k$On6Pw zM|Tp+L(`n#j?#$Ygp)w&q5IJIwO;q{Tyb(&UNa+b~3&YyiJ$c=Bb=?Gq#$~BR{ zawBXhoNm0 at i}8`?vFm&Y?!EzLiQS>YXC`xD?hWAv28g>~(HaSAX~ogEOm8C749(7; z3YT}H!8-~|lSmzRR&PQ?{iRR at Oq|_z zMKfc(4i7+85x|!u5GNono;UPfqOs)w^DGVnZ;eJiV_FDP?q|chdhb6cGI#wo-Pw+x z@{A7{Q?snITwMv%%Th@$)4p-+0k?b=h-rPb!Wl{189_gnoRqKaf16w7biwFDc8AxA zfZpM%2~iNk=A$$df53He( zWI~x2>VQMBDyYiH25kpO(uy&=hf6Qhm6T=|v%7<*SwqX)$eoHL3Qt(@m9V2UDy)>f ze3N@=izO%Jkd*tSaQiJ;f}8vsn^emxG{{I0e&a`aRwX8}-q&0-lQC~(ADCzy_q?Uk zvfiP$#_i;TInuf2pL1zD+Jw!qv at 3VC((Z;V(Asz^FOthqQXw9?mC1zle-yJC-+vl- zD at E2Z)YL^h0F{q|G|pi+B{6`ZocTtjd!RBxO(8+83W^V at GE9>)N}Rgk1>NaiP<)%E at AV+Q5o8zxx1Kcr#0Trlv#Qc4G^+8>ne{D^S9IH@ zz+}(nMw&5X7!pAKiZjbsUvvdJCj#N=OQ^Ro>{S>FW4U>Kvf!oAtlY&n+rClO(kVxg zHK*WxlCIxQp34}vndsGy&@7(q*JoR1i>bp)7#h=W|Hvj3kY?w%#}NiBhlPgb=Ybm2 z3H-3d?4L8%q3 at Hjv7;=( zrEU~M*U0nzj}A}N%gw5x?dU)(ZR05IWNG=IR{u4V z at b3fO94E_5e%OStii1$tHXx{oEW^5efovhhYz7~TNgU8x7VXi2KKn8VqJgGNo=+l} zGc<74wW%Z)2_81r?8odgZl|xG$M1ANFsqRLF=|i_qG6%osO4OH?==T}0AVL!qEU^1cckDK4P9w^W3wp6Fk_rv?!SXd0PQgw7 z=1cNQ6XjUy;nB%;eqq!gM~!QPGWc>5 z;}q7|t-lgw`FaIh1NW=E>9?Mn+pjU6{?uDt&Q)?p z6xL#2idyD#QHFT{-dlV)!E}%LHlW at 6aU9K{a!jxlwI4TfKy&$vl*tSJ_7hg;i!Vq^ z4vkwiK#&{7flt%vXME0{>qT8=F7i)HB&eU>$Etl=PCHVavn%B at fA71IJ?E`1!sGqlg!h4X+g638#`ulcb0P1g54et^?m+f z`rgA;GLiO|J0O3#L;v65&c6 at uC~C+o$|8JCZ;xN0IjhlzvvyWmw%~)&k<;db6EIZ1 z^|oJ!T!~R6CpT)rev2dbk)5JF*~`fWqmTJ(oSz&nIfX*c+*+Mhl6qFxbmv80;ngCqpP4-!K- zJ;O5udu!G?(!{d^%Z(WWoOu0V6aS&@G8p!;_|ytB`B*KQUUchD6DgW#QWiKRS`#W$ zqgIPk)6lh&Wd2!F$p&DU+!?J)&TOT^b!}Y*(=)V!Q?HnwJ(k7tZ1swR4cHBqGV;?a zUm at pnO18f`hZIreB8~>Aeb*46w4?Wq1xX1Qgcctl;?^Pg+*gcXESca|D~A=VDW))wj0LVc#M$@l$%N|LAqyVo5KUJi|> z$km%49?@E;4||O9u)QHP^_jwf!c|y^>^_wHh?SV<`M??~9qIkrv+p&YTExu$!Y&b5 z;oraLeqeCI${P3@&U?GMgfvX6hd`nFT_;H|z$%tqovGMHy#Wzh2p>-(aE(v-5C9j) z5`!{NEb(@Lo66G^lK6#t+JY3Wr|xh7`AauYnR#9UV`wcjbX{6IemEDWEoEuPuZ#W1 z*8?^icEF4X5BjJu2uea~qFDF=MqJ^8mm%qI{EXm2Vwx0xVrh}VpwU|x)F);_JZ{k8 z19|KbBf=hg6jk-=cxQ|k^;amh@>_zBac{iwv5TKb^)rJ^D-4KZSdF9VA<^FRl!jD$ z at Qaz9XNL>V|40%2niEsZe_`GW`d>Bo{sHs*`a#0i6OCjOw*Er{lM1p#B1V at g(4PZ;x*N_n at muDN-TBB{8SN^W>((OqR#- zMh%_LkIFr at AMDiX^tZJ at FsKp5A}Y0kw?cOY(YbR(K#q5TEH`_3H7fr$ zbjThjb+d`;gK7fWYKY^%9>T)yH9o+BY)8?Q?*N+4LOdA5LSl<|ZpW_y4{NL4D#{Y1g`!@)Ffv?ljz*K1# zYTpRYS at EIW_^*a1LxM_| z+9#?KYrR}#`aptj!nqhrXDl^Z!6H1eZ!m--G(1zznRgl=&^^hNM2s-Oi=2k)xOWbV zF9C%Ss3sb$zeZ{UrAMqril^!Yhf;!r49GD>?2E15Bw*dDh`e;m9n%ODZOi=$w3)2x zlsC2!tix^hS4>C}`*OX z-kDQmVY1}f=I<>NI&Dwp94|D>GPUx5wlN0k94SYM#?ug!>GDUp$l=`4NB%mcvBrLz zh at z2CaJ`IdRKaaFKP^vB6 zBdDhYx0N132v&;3FWJK)CBKpWI_dV;Q8Aak2++)ZV-9D$JHOM4D&ODS%DUm3` zmw9z*wF9RqRY-5yPeWSjbQzqwdGjGFk{Ee1w-0u_)CuNOmvkO!IRMNh%9z=RblL}z zZEBTk+;1f}PHTA!D{9$WV8;0+XEI3C{7%wN;|>e7_{HXM;W? z&N;^iEcB6N%Nu7!8vKZ)2pPbTPp!OWwX2|AiWT;kMlahAQ03(!{2o475V3qb{)f2_ zE-d>H_+R}^|GUKf-+}*s#72fv|2}JxrM#tpt%UNuWyyn24MvD`N>;^?!^>|$!$c9@ zs7gFbiBYu_Lef^eL5pqNP&N>-A6fGSxQsNt?Yo`A{3ai9U^$Q98pLvId){=I=I+_y zKHltjKi28_0 at sDo8DR)}-hTnIVDMxMhpHU0O*!`9vW(>G6S3PIIl>@(Nlnq{tgLUu zAxp`^z#Y7i)h#4|TU)fGpqKM1=UxfN(O?bVSl3h2byTrQPv5E=O at Gj!^3XW!Qg=)0 z+3+Qjr2rsf2;yBP%&AQ$;ao+|*W at lVg0mOJtr`<&yo2ADYuWVIg!7!kG^O~7MKIrc z0QX3n9DFOPF-RM^tgnAYR79V7CKh|Iqci^DNK)0t=i55a)|o|l`&@nZQf06;3&_lX zb%nvwVemA~b8t@$8YbV6ktfzbbvU;tDg70vUpNIZD5HRLLO3f!!5+=zoor}c at t%Wc z-X3DNVqIu{_{fX+kVorKoC9#nv at 3-6#8?Up$D?m`fxU4XY1tR~ySfG%o_hTDQn2+o zs6>t0XISO$4YM^)oU51zUvM1Njf>im0)Df{cFPupB6%@g0CubLz;Ac2XS>baZju=D zt*;qamk#ri#N;>f&mI at HT11BjsLVo{GJnu#^ish_Xub5tMc!?WFuc~3&PNhKv+hVL z;+ePyqABPp^t&G31DG0wH=J>X{#Q4V$X`Tn^L}mO2Ecl}hKOkFlA&DF5x~`P-qqN^ zHv2feaqWq!`iumHUfP&57VG!o at hT~VL&w9;P}Ok|?}B%~2|oG at kc^5{ZT~D)2f*Y! znPHS;v&e9?%UZ8qlS_vlRiLma(|q`?ae-v&3i<|~P(|{T;}R*mBC>fwA=U-T+2N=R zNovO=IV*0>by>H*FDHV5I&o at eP;;lkl-Bou{(?1AWDIPpRa~ zC%`7t3?uio))|8${PmCg>f&=~bq at jrGzRlu%~SvX3k<*6e at IM~vX;Y!APV<+%xdz| zqM3k#y6L at K=mi^d5%0!oU@^QO0-03CpEMrI>AljVqDX28My{K2keCmI)E|sR0Lh)y zT at i*&DySj6G<9Y!)#tOTHHVq)u8un$pYJaSUyT=eK6pHn*gi&&oI=|i9p!pg-*WzK zb2KQ=^nMe|-!ghyd}!EQ^82Ht9vKvtP=&DPq8wHf^a>WMRq_kX8O79b8}&4d#T3}q zr+#&1c*$UloWcw9ThRh9AM~C^E!x{#^5+>p)%Is(GcPT1+`G2)52vmALIvhW zXALC6`p~B+Z(2$bcb)Y5vW`SKv%p!Eltvdb;1u^qJiM=t;Ior?%0{h5vrYpJH$gS!g z<#?w%i4XLu>u0H?=vm5u61XaiJhb3~_OtY_ac3<14uLE?mHYY>$u09_+$(MpS2y~2 zJXol~oG}CIXFzbgNc&n|a+rd&_ws4llIIV%Ynu2!3kFxWa#f^_yy7Fwlk?FJSk1qc zp_12No?x8X$dn)N<;KiRrOdRu!F949UrZQdn`N%tpNSgQ|RTl_M at h5n0v%N;A1R^`ddo at +?CG(M!ZXM zd3c($bp!QSCw>a0W?2spRnpw&KxuKTH2gbyZa^KXMcw zp$ilDn0-d>kuiQIdeWyjR3sbu%0K&dU^XDxE>rs^F at Pbi7>?+p>4!fi0w0>8Ik2~^ zkk=NT5ZCcj^5*_i9tlXBO-zIFDiq at j3qi<(I)t|hd%X!|Z>hXTk}`ooFJ*Tq z1qBH7J|bM1PUSZ+ at i0Tj7!d_G*zy;}`)pE$wdQmA>8jfGWO&M|r= z;-5H{L?oJ%5j7p+3ctvu>Pncd6(Xf|bM|4#$DF*(5O^OHHl1 z3P|I0n4ZKu{x>&VPG9Z|ir8CGz8^70mL;{}Sxm$zMu|p>7$^%)AH4u-GF@^fNtZ%6 zO&48r41g<2W2N-*!M$pwniWc~NsnE5*02=K z;6B+g*l>cIbY61A-qnTc%%R5Q!7AL+S#zP*X`o^7IzpEbL!D<}*blIqJ)@B_tn~9& zhzHHajh8ero7?))al2kj zSx%Pz at n9-Ox)mG9WvvhY=f< zr-v+3HTfVVb^a4vjztZZw9kwIRV`#t_lj+t7VAm0Rfe9&7_P*Gvr^;+)1Bk*(cI>f zvGB1mO2-)D*y0e5UaU2zaM&@@QR9i6zVReF(GTATsIi|Y39)(49BQ>IqV=q!wJm`V z2l-f*e<%^$5l5QZ8a5xOxet4!acOq_x$!OeL)5=Q4V&&zsgR5(!+G_uV~wu`mOT?W zjg;(QTA*ZHT}CAWKN>1Gna;16&T)-|vNlUPM<@3AO!4%o42!7XNG$nZ;r=s1eYYJU zd;XTxHLyTHg8$Q!`k&9*sAwo`2%~&0ucEEyYYOCU%F_?7q6o}C7^ehcn3_r=LEA~J zH=@>?3mT3!9WZq^_2kKTO$)rmI*-Dp#7;AvN}8;n#+*G=QU_YWx&lWwigcLt++VI; zS62Fbd)z|!Qh2TeN*BIZG59*P4pnXNZT86{2j7|jO{hY}IGdP z7$bzH(h~l0467ktG8^yoFj|^%t!YKP)aIQX2G1h4SY&*coG2D z1mR(AboOn^qvgc@@Wx^}8ISQ;5*iv*#jguT_g8()UfWAaNqz;pZY at +qmU{@f>0s`@ zI&8pIa#PSqwB@>@(@q(G#V`fMmX53>^n`7J`_1FwX6&I7DpblZX0e%J>l&+A9nT9k zF9^fuFu%EUh;h;lu#`kei>tWGgDgzApNUf4BO?0r581u31j?*60hn9625vg+#wU&A zmdS8i`BJP4op+eiON34_ at _O`2VW{<)VoSAVaO)x5+sfmmN&y9o_h}D!O0gh(z zf*lCe9I0o~ZV!Uzl_c8We9Xu8ZWasL03~HM&5q)V8&`L%pW#V`8)7{oKy+Hf+U^mK z35R at mTVlai_qrBTDeSy7X4!98r&vQmcaRBA37%M`R$+oJy at dOmH-b;IH<9gF^ujK` zUpUVg2n{1Pg<$yXsq at 9Q#l}qdz$!2rbMAiFfrc z@~r|iayP(xj{7}}nA&iZ552U)u3ZzpGpGbzxWt->9p1y=<&9GWH2KLWw5^Pdj&IL~_^o4-eg{P>5r#rC_LxBA}{J_+`JK_D6b zqc>Xsf$;JD z?iKtFzukmavo#fcnay^X={k0s{`-CYe~yAJ_l2-1xDa}xU=2|gWOHfqK(&O`hKnOZ zVDIWq%SAj#V{7ozM~ZjTv#mO9 at a(BP$6}#7q;svu=rN#~cVPPcPF*_}LN{km)4aeB ztB!B^rkDeKAz(Y4Cay7?uQzB}M=xJ-F;_^~3iO^v5cG1T{g5M-MjZOJf{R)37KPZ0 z&;;s_T-XGfr7d=Zx>)djrCO!HymlM4(>VMIy(LdYxx?(eaj({2#F2027^A=V)=T@@ zL0F4gF;P{(o$}m@&S+_>uqbnW4czoQAE__^EoxqB(`XR)6ff25JCD1U2RiX8C>Xg7-$|$%9V|1vE|yn}OiSvne`>ROU`3bFeY_ zl)Ei?7u&vk at Zk&f<-Okdg(XUfBKxPkS%Wq7@~Kk%sX7f|+(Z~Wh+)~*gFVT~gkF&G z{lVpeDq+UbM2YU(5e3p4nJ69waUSnC${^Th^uz&GKUpkQtN7Eppds8IuFeP?FiJ1W zAxycyH?Xrmahl*O0F5~DcVr(xAL`u?^$9?#$}NG32zgCfrN^-Jy1DLpg*LSn&Ai2D ze^9k=ZF#-Rvqqd$x`*WE7EV#Bn}(pk0Q^sX`Rx2${5EhPpj%`hApZYD?EdQ-qpF%M ziV_MpT|(hlp at AaWWB57`OI&y}A(i+3Y3kK0#AMjUCxQF7%cE<0W>?AP1xR~`v9UvD2U zKvOTH5pJ%75o~X$7)GTdv|t@>k~b!~zi^3B3p>dN3MRz>WcxyB?8Q&ytLH)_Pi_o> zBja-ZBWYbZVDR*hg6!~nvh3M|3LkFjeGP}DLk=Hq+Y;c<4T~_6U8R3Wz(T+}>l7Ii zq%4FPscKuPlCdC16v|xreY*isGg;AF?_X{eDu-H!|hRou?3^(jyCL zf_{%}7AF#(A8m%RglY|oK3}AXhDK>Ad2!)sfyaP%qeuOoHW{N>`mNRR>;fTJkGtVp-h}jN1?b+eG^tOJCs9#4W7xC1$Ai zt^?O3#uqt-fjSL^MOjUrnbE3Bj4_FX45^6n>q`G{CN?x+ZDH*O+R!;DM^D9GsG4S} zkS!ini`z{hpAuToU`aZf=E9F at K{_WRchB*~FL(r7z$IK=d8%EMvO1<>>fp#E!s=`Z zZ{$gx)puWnch1;=jZ$%=Nf7kzkH6RAB$|%j!aTLaoQOgDBelrSDSz6f-aaEb4C4rX zy{t%!v%m>!ouV|I-I};nYT7>m9bM`QRs+o>iED-mQyY6WX at soEfCopJtV`juEKgZH z-|#sFtUFm#2C2*7vrOTtHH7V|AjG*Wv-HKt@|EmgKpDN;8jj3XrcZPwf6F3Wb~0=X zc3tXlc@}gdruyX_5o?5^ok&?@EkM zrF>2D+G4v$o!{Pzeu8Q?)<}x~U^ED-|27T}qVeS=$}z-olj8Y70ge6^=|w=Z4jhD(#lT zr+Tr*P73o3vKGUTn1lRosYd(GsnWt&O`@4#YF+-0#gw2-w6nT?d z=Ek~B0+iH6%c5nqlM7aYb6ti7+`Q`4+&R3-fc5oUFqNW_YqvygVK4!jnE>;{Gi?7i z8op2X$2|{Z<0d0f{|cg(2rFA63yTBwf}4FdF>Az_`d;{>m~f at hjji4bW;`{@doaOn^~zH27sI14ngg(k8Hjz zB`Q2emezZ^VzCY=^^BOZM}CCAuCU#($eIv$>xiY)%USGIk~mM8ilJL?a$LkPXg`IE zi6?BBZ0 at BN%!PCIg%~SGa6tZ9lu1L1iJK+8BGHFZS&+*@z&H!GAbmLnwm|p~F&Yws zMy#Thgq>DxviSdE?VaK?i?+4TR4TS at +h)a1Dz^E?HY&Dlzd^;eZQHi3>e{Ez>F&M1 z at 9WdOyKmNSU95|BG5^na#+-AE0f+%XbOL86xSCmu{qvP?3)ZMA*Igj_ArAhBS8IUq z2th3_7Gk2WGb~{MUWI<$J~y0`#0|aIwI26obj$z!-qjQ!(9QPLRvg8X$*3QYDa5nulbq#-mqr|@%82_Vv#(#_tcly5!D^freLK^<#<-_HP z*TmOA5)q&VfOXudSMp!`5r7fp&o<;HvzkP@%$10C^A#!a*P59>*Cg5UVc$4?~p?PZTXyl`sCh1ZR~``BrBT z7F`C;Gf*2akIC?ipK4g)+=IJO`VKU;2GgpGczXw?>ixV;AXas at o_1>mM0N%=k0Oq5 zl*7jU#BHMAC>Z2dV1O--P-ZQUQEm(pn$Iv!tf5o9g}>t|dC_a*R2-VjY&vCR?U;U$ zJ8!JFPAArJegYHe5Jk{_T&uEod#Mu3h)+=7RZDLN>OhXwRDgZQiug23(kuGwu>|_=j5%445qPq2Y*ndhUS{G+q99-fpk+AUf at T?w2k(Y zRT?qoYm0Kb*SualDYXTp{>=F5NXzj9{P at jG#l|?SG-}Y!$VqXh?CWl^SR`^~g}<=Z zRI59jHm;ukYk;k6Y8CzP6#IUXK$p|k3B- ze(dY^yut7A_4dA+3&N0>ILKCI64$Rvp`G{wms?VsEe6A at nZTB&W9*nc3QwWW^qMd# zN6`-OP8OHx6CJLJs=C5PIl_H at fb?v=PFHKa(ny(ok{zy+9J$EQ)qZ|sz^;UjE;j#M7Rt?#Kj>`^hDT)+NJ+*+_Tkceg%w^gzU6q$#Mm at 1t zh&|1*=UI^_sWN at BdocLEebq-Z7uyZtTX1mt2+tXI99I~nbxjt zyi|KC8{055rCabeN$4)@mxArMkx3%NMu3<))-;=GqR7XlOKyv0KJ48kwXm5FKhRKn zwC~|SPJPdamF;guXb5v8d_|RPH^ucLQ{9=9Nu}!e)HRgE z8iB&ulc-E$pP7^9j at QnTs1v*CL{?`97k;!LWicj0wgRQ7kL2 at 0VIDR}Ht7u#E#ps8 ziMeI*iO09ZhMZo_J$=e6N-fleBWVTVmn z4|f71#JYtK>`g033O7VjEm}Q|sM_m at rGG_0%@zgPSsPO+j%JNq`2+5Oe!)*Pj4 at 3@ zJ$N|bm*TXbe9-3WxF`rJXRp*BCR+Cg9Jjm)C^&vZF6|8;Xk*<}noaQ~amh{sbKW(S zqGNOFBHB3dAsRv$(n*67Eo5UPyl1Uk zL-!%ufIT{npW$_-D9^QAk)w(g$*EID%2~lYXRRMFbuDy5Jj at X;w=Ej;>J|us$PE_@ zl95u=u?uzKGY;^%Z&vsv09~S2s~4OSw6ECtfy|w5&adNt=?r%pE7SCk`%OCkZI8tN zwfOvNZ at 6Ub|ClBFXIQz}vrm)b!H2*3CjuINpIygo2W;_jUhmv2Yn7u-A292|8Mbfn+NF z`n|60T0xifdlfZbpNh41i)o}+j(1iy&Q#TweO3s$Gm9I3CeJuZNOkpnCu_hpV3Vy( zoyBHe-=Ng=odn!8aor>=DZ9-;QjPk>#>q{lg}uu(o>JEZ&eq0pIcb{ST-0nDBxKOn ztZ-7vtS}oC(yN5TC*Pcm$0#yZKt$yY0gGi-NBb>kCI*s@!X(#8C0QdYl3Nu;SFsuUiKi!ek(Pg2?F;|ISF zf<{uU{UruotwOik2#2rkfSKq_ at J53ha_Xmv7-B@|*sy!NEW|~tAk*e$g&o3kSHjLQ zRRhEqyRGmRoeC{j z(hmIDp$3It*o>PfmM^h12e0S_Zju5f7>x~RI)lHgjDfIO5O3Isr!_RaVo+54&5W3J zBRuY9pEz%gmZcOyn_q)h~U+c9m`u|MC54$fX6A$0se!_W? zX*O=|4-v1hnyY)cKCf at qd(m~j9apDEBI<4)y(WJ8DbGR{fZ zjv)SDq3`%JkBM9e(!)22EqW5FAA-&hj2Dt3tPQ}kpP=UR*tb&5bnq)YZSdmG67{OX zb!CqH@*F4W}>eH5!MfGtN8krxD)&(_VBP~d7% z3RG}zj1gwr3<(;WKi$+L`E2>nr7ioHG8vV?Y!Ne=O`kx6B5k zsE8=)>aoGRmC&mkYy)GY|v z#FIraXyxe-S}83(4MG$cmlnbW8i0MarXAGU37)s(A>*-d#Y)h3=_84 zu62IU_%MprbwOma(vRqoPU|b~f@;M*9f`FcI&HfoavmH4N?Bdl2P4uP2H!&GUUUZS?eoo at wd;-OBjBfEX5=}b-`2Uzi)8c+EBuO zl3K*Pk3zc+jR&b7G_Jt+x}SPCuLB~%?V0Izod~C7$S}z6z*EG+qn^BcnTX;8)~)wM zVW=R&E0EN2(!%BtpKn&ebe*SEaB32GculVU+`v-G92*> z#4qV~qQQDaDG?Nr*Xd~DIr};*z5f3Ax_TQ#t;UQfG{B!k+EHVsw#ZmBbTBU&e>$87 z&Nbh4q}!f025)%{IbPT5h5q;HyPUd)Nt1Uh#WH&Ii0AOS>NafQFJ3(p%=5p|p_>tF z$TEhqX at 4mP%JnrzCg(O|d&f2#GDgQOd-bFT8k-`4$mmZcCb$IIxPh%_4pcb_Q zsa|sDpIgMpmwS|;FJmb_&Sts0U&AYrSt+Hw`64BM{2 at EYNsueNatLonh&4kr2R|%t z2LLw1RkYQS!f=E)H+l0NBEfqU(2qKiXIXZKm5ue#3-2!sTUBI9cqbl=8!NZ_dBhxe zs{yEhY*Q(Y{Qa^RRn+O5jRDw>h1-aH?{u?b&V7_dmMCDv!fl4qwK7$I=KQ3_CDaUi z&UJ9cyI|S^HGbiIWM*a4c%0xp&XbM8eUTSW#jRe7b!lH-Xc7n!byd4O!AVP86j1!>!gA!L znb2n#`DPgIsUItT)BvPkXP6kU&o=C at mYiKlT0He?oIqGRsGUnp zW5e6ILbI_|-%ZMkW#xBG+d|gRoFN;~7*lN-2s|}9DTk6#X;p~x z$Bl~iii!6O??wyMz0?t?-CNKVp-XdIeA7xb zlkJinWVgdj*^l3-yWz}=h$z8QbNJRtqw-LC(w`I%5Mk9)xr1#88lcD=eGFr!g2qg% zYggJ5Y`A8XjY-mf(oGg=2vnA%N#0MS%!=o&eRfu4dT1~SsGEcranIq1pJrY7>Tiv+ z!4#6o2B=?hO-W%N|CZeWT4{5;Pa8qql|l-aCDD=o(kiE}6FuDy_2mIFDB3|22bIYk zi9hu?7J5M)b`gEV%NoMX at QcSlU6RQ8s6L$*I$#Gb=mBbVg85!c at 1Ur9X&1(7ov%=Z z^^px<{HY#S1&rQ*3S=R>I1?)HkdNq*$J+YH^7-vkG5ads zWKiiaD$sv7i{I^)GoMf at J|V(w1en95Qzug$OQl8Ab;tg`9fU2(L&BgUbSV!&s;zN(GZMveL$8;UI_EOZ!fu zcE{r{&#B~4uj}Yj1P&3*aRS_0x1HI(!pbgQ>guje2z5e-bmybHosFQ1RPD{H at l2$i zMt4kmJVW?WDo7x<49K at k(!@N=s-(>P=J(hU`?eE9_f|)U$7odQA%|Kzq9+4fqIc5# zS-yH0OyY{EKB*B`~G+nfe6x(^5=YA~og8@?B z^zg8MZj&oB)f9m;p$of)XsklkyZJQF?`V$BT;wayI&n8-(91=LV!OZm6fLx#)@3lx z(nxBKoTiUAfMP+kt*xV=G^A%L;gK5EnUj`l>_SO5MRTz($r|PjxM&_Qx`5|zWhA$m zZ#sc8VJ~G?n|bH3EaL#qIkVze!oZL;UQiXQgH3q+Q^s{GMDMVltVX5?(dk~muJGVl zPY;y8(DE6)l7xCO#!{fGe5tXHi?p_B^%~)ogmDdt1wJRuo_`wS0N$B6+nQ30Q;&$7Zss#d9Q3!aUVQV+cS7Y-0{94KX~rJdLM!*cYH}z<9-MYi#T6t z2Z3%AW4sVZd`G;2I1Q~d=88n_NutA{V1 at +6a?#9ostCdREmT*x!J|N at 0^6kQQD?xR zdpZnt#ak7W&T=zTbWHy}(|4iRPzA#}!&#+^(vY2%m$+s89 zoWq|G3Gu^%1zyYC8p!o&#w6ZSSk>t?wIxQmteG%$DkE?VeMU{PmFH_oO9kOJiU1U4 zB}FV at RX~2+``kG2Txl(2V%VooJvTfyTiIHVIainTgjBa#PPM7RY9$!wllX`ay-KBM zOB2EDZ*MW1*YqFA`auzY4_mYz`C%3LqsqA4lxX=j2XzEK;SMcquyJN$(5sc8ai{Gx zyr5S#uN$g;LEB7nKJB*kj8re>lcW0WGv!q9EZF;F>@@dL!LKj!;{$0<@OXN0|M2a% za#fD at f{5+=hR}pIfqt_SB*n(ZZm-zsEB%`NDiC4#GV`iAK$~SZz%_2X#dwNv2W^s4 z$}iw;ZItQ#+CPjFxfu0m`d_SxUi|9oa zy{6%Z(9if37&d01h_oM;-a2C%n9c2zt}+MPFQ^aTD1>l`IH&|4QbW9(rT{}&+M?5m z%WSV}?&paK+t at GPKi>>+xUpGsB6c;wrU&^bLoiti(lAA|;L at S$kUOFb;)TX6Ld?vu zIrd)*H06_J>x=Hu(oN^{q?SEqhg7USvb zS^2cp*dKD09fOr}E;5t~3R`sLo^Oy4sc1ubE3>N9erJKE z20E4 at G*hLUS!^HiFqU!bLN5IhV(=Wq9s;%Mo7vuY(K~E;T~@cHsBg{KqARKoVnMG- z3`t7Qdr60u&akg9z||W4d6^-G?+sO+8|n!y=}_KBE?Q1e>vSHc(tI^MY#r0u!*9Meh)%G{yLkD6Lmas%NFiNJx~nW z`$jPLW-z}N*ZdT=gx6wNC(hUMDBi+B*is0)o8+l5Y>zNP^?DN4MifF at p@aF9fjE{6 zp=*jL=BgOP9wM4pRkxgT(R3_I&aXS%o;skLkKVhh+kbQ=!Xvj+GdLvQ21X+30fx4$ zO!b%!SM|ApMOmQZK`6B*Mtw z?AFfS|BGtu&%gADel!f*2L44c4EEnYUi+Id{|_W8qpD;1$_u-WwmrfY!&p`pgn+>< zH8q&Q1Ci07_uypl7*p*jblX==IdFkr8DGIq5N4jUw`=2i4fELM9XEblU6fv2SA8VZ zaQ(0D-8siT(_T|Ylc9otK-y*O&T&`z~D)M zcviJ}=~(w0Ub>h!o}jjmsiRkSt4Tz-o890WR#XbiBonv25LLa&QZ6rkmKsGi+q9 at _cq<^Ef{gg?PI#Rui4$+ClG*yz-!6kS)F zYF#}|KPkQBQON~Ze030%?hD3`WQztLU{OIH940K=syY zs}fD2%_!3G+y(ZK(tsMESyOZofrIOp_al_axuOVHm&7-g?y0a{1d-dg1o90AGz69C z0o%C}&Ld8%)2*+UNi at wzNw=pz8$l22mKATEd4rgExAswF at wTuj6!J!^1IuZ}K&h;d zaP61g0W>qYjiF{ED%gH2VMU|}E1n#d3H*C at qna3H+z{OF=wib#szirv%zW<~fzAzf znuaq;D5{j`RdW){VBx1u*(HAxxq{*3=f@;czCb!PGSEkcT&STTr==}+^wl0u?y(-yo z8zgEV8ZSeZsT5u at fI37jS6KTQNrvYR#ryHgOHb5Bp(Y!titR> zUHfAIPL)dpgQ4zCJbPtxp54J%ij<2lwsDf%H^Y>-us%`SWOgTpa|Xri>`00xQMz zV4#B}Bos!aV$7Wl6x-wWrXGtRayL9m-=u<7Qgd at 58?S%fJ>Ob&9(}wVi%)L6+;q+a ztK*_5GUf7Slf;b!H>6O#Q40v`uKfFuzW!<@!dcmd-7GS zU#!!}QobLklk>c2`0Wv-qu{szoq>Z`&mDLP0En>Co>pd?nxuGb!kekn*6;)pwA8$@~T&sImDc~3|BcJlQD}#--)-ECs%i6ugx}E z`zq@XFY~^)HU+x{$p8mNN2A at wGz;Dq`}c&?A|UUBeFv~Tv|7Y(Z(x@ zy#Xrv)j=8p9)e4G862sQ^J~n at rbL^<-|2hM;;uo#XHV0%wVx>`f%j=U8p$}kEANBb zNSiK<^sMEI>6a*`+v2PIm<^V92MH|7 z;LP)YqqZo}{(a?EHf*&oa}VqY-Rlma?ULp_U44d1Or?%xF#BX*w1J+JR8S`2ZN(_! z0H=mJq+&!OO66w6-miR9wC$NvB#`(&L}FV;Svl37Oj*NVJ5>yOD6MF}ubHGy$`BTu zf3 at M|RUui1EFt$X*XH^nDF7%q;3$yWV>r3v{zV(=?K@(%E9O&rb*PO zH?B&5qZF0AoO+bD=2hL36&mjk*T^e?qRJ5b at PvN_pJKs--!H at sN&Pv2Xk0EbC+)Di zQO-44gnZ>^cb@$nj?m at fn%SrR4sBA8iF zJ$pw7o>Lv{MZgU|E$Bl&UB8>7kdFhs at i~?$g`s!7G5p5&jc;EocqgVe~IZXbd&0K;{rE)XWAl3{W!tg=pe| zAD2O(5ynha*?LyBgLQ)ulAxJnHglw%^AFNW&t3Dt)NBF{ARuc?YM#R;i=(spLH3&C zD*Iv5B3|uxvIcbUwXvD`QRg2&yR8eI-|qy1pWGn0*d{Nx#5vw+lx{Z%q%%|nti>El6 zPrj30O}>L(oDIfZUV?_*c0Lb{zGpJ;-25`Z@?lhF_6ntkm(Dc z=CaYU+J+bwX5X3|*O=P2kJyuJdDG@?Ob+&&}@nENg ziBpnj{UV?&NOUP*m%%5C8Q;B~l7wzli& zlicc^jP(jD at 5o{FFz7 at i{O_`ZM>5;?w@`vvDaFbHGlo+$;!Igbf7%{+(OKC*HL!iDy}`xc0KiN8%dm#5aAdfm*t#txrv4TovH$R`F at +Xr%PC4sg+ru4|3s z5qr8-FRN9z%%nfO){;tylynw*=#P?jh)z+bU}Xt=YXY*X2Y0uxnHH$iUgr>Z<{pAc z&nF{O9B`S_?TXP^idWsp^064~iR!6h0J~g at 8T?`t*5S{{YMK1`fm$aweLizRoY(Xt zKZGN1*8@>xkq%k267(@mky(<0wXx1*%LBNOqi=B&`f(};(OE+VU0jctTSR85QJmsa z`S6PxX2t8;Cr?7yJt%&LtiwQATe38f(rl6$Yp7B8QEufdru>fM2+**jazn!#Gi(oTBWIU}<4PV5~)q14OXq9z174`VwR7jXVM at A^RV!tC2uvv at iPkU5HG7=ED^aZ@}S zk_t5bh%)qI#yVR69&_&$A`{umjPK1g!HDIG25!tR=1?O+_My~UePacYYy1=E_s&>1 zwJ1P2zSCk0;54_*LN~5qi`^E{%P#a)H6oO-)vcow)us`{^`{WUw|WQhr7%d4`i1q2 zWVagTE2Nv&9qyRyL!?*mmXYUI(I)}Sd1&M9_~MJu_x){@ufm<~7sAeCj&(%v*!`>k zO8c1J^97ByQjOygl2H4h&`g^cWNU!~ojr}!FJ<||AND2>{Z~dgKTSFv7yn2a>&|YJAK1V zk=9MWDqS-hwu<%WqctHE3{xSBHk%LjY5h-Rc%0EZX^8t=UL`1F!>aI4qX!o>^^S4{ zFP~bDDpjS^`jpI<$seXdqv_eQCp#;jw9nTrv>;CNa1bpeQ1|+;eb+S43w|Cq;-j78 zKY`I37_Got)*Fuo_Pl*a#0JMp;%iuCJGdX#MbX@;%h1cxcC2#BqN8dV#SxOxoC<0D zioPKQ`BIN%>3Rf>W}*S7Dj6g=>`E-<6GAjSDQOT^dAo(XiT;JugK$yQ0h7Axn6Nh{ zR{(Cm9bUel#F}VJ2?4goDrJl$5;El5ata-HOniOcm>m>)-YV zfZ3>@KHJ2*$RTVa)up(%9$0HFAa+Ave}_M|vmR-Fc(5Mn!{PlNeoe#2n`zg&^SkM8 z(_q(2o}lY^?S?=0B?pl`vs(P7vgU5nXqPuGl+mQ0Q{Ed#FK$wu_C-zW^{VDZ?qHYK zq8}5;l8p=371pbM%p2U+X~UO3Ow+5AYo;g9%_L#`!1gk2Gl#KYh|*?IHeUCuSxngm z01JfLKl{L7gMyu^*SaCnv`=Xur0EGriw1Y-%j;Ki&8^1hh+Y!#qbr;?wpV+Z_*bHPJ&U=|MfPbaO&y`5r5!~M6OeCt6USL`^ksx)@rEI~ezu2*1 zlx-}&bVpuw=*-@>0>9>o+_tv)=DTgM{~QUh?gnFIf2k at saR5y7Wjw!PA?q2C<8dH+ zT7Y_{gFKob-!{nNhG#Ba_798iQr7cgU=3+)Qft`oau4KA+LuG9I!yI52E3Ybc& z9_ at B6uXqfOyHAt^r;_U`GWY}U-5Y~57c?U6rYn^Gbe>ISdo=IXR8Ktu0~McN%jTH}dbtjZ zmM(#{8$D`{9dZ+yJ~yXYzMT7%{$$sJ(ww>IZy3zPMWMQc_jA%$HDhUe+`H!D0|}+O zb}50=Lv2f%(JO#4{-!uP-yOQZZ8?z>@g-AqCQQd7Rw=qWZgY_RmVBpapmHsi{7k?- zf|u7AY~yh at 8}`ah3ub at oRKPt0&bd?;J{mXy6P=ceIzV;Oa;g_W=iaQeTD8_QdAGN9dcwQK#KiPIn>ZW2DZuEoRX5lqI#2--- zuJb?UE~D87ruXc{(BWOb)WbtezW!y87h95W9v2h at Bo!P4g!BK_Jt~=+yI31KO4-=B zI2#&So2vZd at n5ISjVdyB^FNTjI2`u4*e#*Re|RKGKzaPwEZq|pAy-i>Q-VPe<0i4$ z7<6fT5|4>KLEO`0AmSpL`k)%9K#h>5lZ at xOn7U|Yy`P*|yT5!tW&~-|pf3zthaK6E z32!$=n_+U87M&N3%wM?|5!^Bv;ne;PVJveA8#35M7-25Ogf=T9kQAiyK6dEXL#m%! zl7~$AVhq8w!fQxXKtDQcEHvV|t?Iu|eJHgXhf^9Cl++iUjoBwd7V8>76s};j*p3Sa zE`T#injI9Eu&a2Fs7Rr=W?#4{cwpB;>T$w79UAH^QyaA$4}*nsA8b&XU3G2oP(P&Z zBz7`+#DrKUHL;X)9n2?BLK1mI`pB-d- z at w?{Pk9P9P#Y2HSp0>&7vu-?Hf3MuNNN@*mBF+9JVy8X;X}K-BE)Ja%jc}Fe-t#k; z(hv98!9U;YXxl&k&I=rl*6)-$&`F#mB!P18TPk#!%;bdmv;n^=)sh7e4FHwKW_Q<6 zD(6g-cobLk`b+qobj3 at _Q6sN2E#SNc&`b%z6$kSn0-&=40Sqh!3 zx~Yt!i1ud_T+?4{29I at oj^vOQ`Es0SA`J(d+C1sDxWr|1snN8$o-V^r+E0kFi!Cvk zpRJR9o^a9mO4uR-e8PTuH*5Q~<#_+ at etFpr#L*o`6p3|jBm}9?8jHozFo>D5#RL0U zxTu|R-#;pp1p^D>S%voM<`bp*vOMO at G1RcAuJEdCHN;A571blhP~#W7ExY9tz&p=i z4XAB0Lcyc$nnJ;e^+DcM%qmI?tn9X4;BYA^x78xUF1P<{g;a*oy0wM7+ijMxd-9TO zwB4jrw5rd^(yJ{xQrNjT>G)-=qt`|0WR^EBGHluC7O9sl;hQgM1tgZ^*%`5STZ*(X z`YrbeeKTA^)2(*wm0`JM{k0hfucDxiz+||WNeBtA1889VJURsEqEP0F4lxl`M zC$kiSdY!evu0u0l}MMiB`C9FPbb;=f7snbJsVs<9=g;g z-oT?fN_2str?7Ks=X z{r;`sdqAJWHkDBkKAG(|CFKNZLjPhGi8!U)-S;0P&?3$dP*7Mcq9uE`ig5cZ1MOn? zDHP&8%td2Hiyp%Y at _io!Fj3n`>r=i5&! zR}#`r)fCl6#L>tTr2Rs(@~H;#b4g(RXhlJ#Vu5iKXA%%@ zRMZYa;cesspAXfpnChUt+y9IYErY-}wZHg?Lx6zD{u}rx+Z#GMnf}i;yi#TRA7h-q zQuNhtWNS&(J`{h4K~h1U1wvTQsfCM{D?(k5*UnkR at H%d!KWz$@b}bA*8b>L7DGs#; zl8{(VKkV9?n;*Tqnz_1m`TTi-{sE4N61HmwYG^`!fD*RX1STe|C+ttGHZQliY5+z1 ziXdXLeg++K2(*pByvn1!;JC&q(gbMXaPn*{b$*IsJGed~f5$oq0l;{z?-a%pP1Xa= z;1{|~AK~*8xN2mz;6yB9-n1Tc1J|Q_dt87zt4nd~q|7B1D%b_yTxNo_%I3 zDqnp9rYpPs7hp=0oX;=XRc$f0rA3rWBe?50Oi6((%te0m1HCsbScu;p7uU2GT}#@8 zvTjqhI9vDEMDJ-VT$OWL>C9i8##T)1>#Msiu8ORxtXs$?;Bg)Z#EG)oT6=ixg5cLqB6l_ZlTRARJ?#mCSF!jlPz%RD2dzpj@%?aYut-DMc=ZSEbtYUxfRFNQ`Zq zkLKR!bq=4SGNUDd>fq2ncb?&3H9`Uk|7}CCSKr6p^MdJ{ml6!-NKOv1{4R;q z at 2}m|giPljW+k`0{mn#<1NBZBS8-|Rj=nbRr5H#Jhleu zMR4GFkH|7)n|(0E%ZdZK6<_~yjs<1v$4CVY0+L4n0wVqY)B63d3+h(RxDx1JOP&>E z)mFnRfPw3Y?zvHeT`?oD7nq3;bO!r|0~XL0h<=-6ZY)J66x?{???WVV-i z?)x^X!nczlE8>k zn#j4;V)$J>8KIi at VjPDuBwcvIq+NZ^T{uNYRu!+FP}@D6*r3#WeL34OyX)>rQh&eb z2MP at F#MXLjn@&Ebl_ko)30V2|v` zB9^oT3oOSh1o+EN_GLAH>`PKmmr$7Kn)*1+uvX)lS93{AFPRxZQXG%Kd|NEN1kI4X z33ZBKIA-DLgq>-q1?Mhn*+4uh2a#&5tn2D~u5`tWWz?{ZL7X{fNCm!0W-`-i0gDXf zlpoxsr_7Qoe#PHiVx73Ore0E*Y`+*dK&rn(c+z0wIb&toW1YK==harkOg{3njY4?5 z+_u!)Nrk at myIw^n)P#>ao^v!SnKcLD`sJ3FwfcUe)Pa08J9m-AD!Zm|m7P53H{Dj` zPA*B at m7^&`<9+<7z2|HBplW30Pa$`#r@;@R;2H2#tCh_dwmIQrf;OedO>lWna;3y` z1xghBapGbwZo-0FbCC-F+7SvpbcdU6XU_!$TqkA3ikrPswp26uf-uR2 zyK-jI=Epn>H+P9yTK=W?n~`i2gmK}k%GksjW~B!jr%1~xbr9mctSuGAih#QrR^oD- zcHn$;egCFP&S$eIO?8*A9xA|N-I{TKC})O*_6U2|w{;(yUZPsFL#b!e2Rd|JX5*5+ zWbMwlnk~OpR!@OOgy#1weGKXoQ)WZA84{e8L^M;)K@#&Sou$*Bt#{alRRIqBTMyQw zA88Zg%&D!yw1m~uvv0!i`{A|`0tCfj1q$w%mAIpmWZ39L-|hE#59o5E(uxA z?i(FX|3Go at R2b2|kCb at H7)(KP(1mQKE(_PH+~~^(g_a67Rl6vWu^m~$1 at y5*cLgYiY#khz0L zxw at k7Xa{cxipW&|sl0bkdfK61;J6DfDdP`hN~w*E7|;fgNs}5b>{(urPZGKA;ONL4 zjX+h2Ao6#%fOejcmQ0{vL=9!p8FX3BenTWDTvb1nKh}Nhp@?71%DaAHNHg?JH zl?@XNU(At4*h{6OAPR(L;i_&#RH7loM1IryD z^?G&P(YZT9p7&x~2>td%>1GnD^7*kSl0X1%``KjRWrW1y&m^Lf4p9bZBu%@nT~5B@ zpa?r=zhs~@80`U3MK}!6i3i_k4VsY#_3o%+p%c8bE&zS(6$Et^Tb7!glXaeH6*x^X z8cnv%)|-Z_ZS!@H4C71fqbaq~ER%T!fT3`41&-?C`d^WVVhYBzms?HsP?$4HJ+3Gb z#Hf22eiTLB_DxMVtd)(;_DxZx^j*A0o$ZSei_{6FF_{7vg#_ASztZ)^tvuqs8p$NT z0~^n6NF^$Wvh$hSn9 at eRQ`E&0r}lq!f-R|kJFo98XX9uV08C<%ToML7PrFFs3LpaL z$d)8CDX9-7wd%hE{*(tautkgEOIb05e!8I-0oYRVSxtKcBo$JS*CV`jS=Jumnw%9W zHWfv}g&!Dt&$%_lH~paAyVZ_NUhSjXI1+g%YDaz(Pg1M_1v2!D>L(vY-Q6%d=gZX9 zMNsR>DjK@;5h<-re+FgbTSh7^z6KvcU8uK zmF!|;4KgmXQ at z9wHQd+fggX>r>+e*9DT5VAL1aPFVRnsp7L9+OVRofNU5g}Ly<}TZ zk^2a^GfY29o@^5?zqLd)-GO*7$bq2fEFfP^;s*2jKdbaq?$ky1QLDJpbhdjJ+EYuk zJVp1Ba at w3N`TePY~YvEEg2hRN>Q2A#d% ze*5|$5-=f%^g8t*qzu7_B~)EzQoSJBt1O~_*_w^Z>Op~lB7li5ktH%QRmcmYfm#rO$r@=C z^fB at Er;W;H1yAahMX1UAZoJZJm?>{ulMd6OUW}+*Q*EzyZLaKIYI3c9%6cc at Og!+n zQ~Gj$-t^k;G#A|FzCLuzLfePzPQeKJHRINoIym>5F! zK9EAh at IW3g_hIvnF;}>?9|`OiqY@%SRAB8j=W|a9_wGWP_OKraW!$0i`yiRldEN#0 z4iCkAy6H)E*2xuLoCNq+7c8n3>;fhXu1E%1pnufDzEVeFo) zzrMNAMeI86eFl$E9>xFtpldTaG@#~F@tc1Im!BllHok&0<^2nmow!t7xDTgBtVjIL1`0Izq?iUsuJ%G`Xsc>?jO?(OfWbT+~b)&H6&u zr)%(8tOal_<0>UEl3Be!XobxDZ=AhTurO_tEV|xh+qP}nwr$(CZQHhOzst65^L!IC zbM`)e%-IvOBl at B)yQA~T%IdDFv^pz0y^eK0FU8oju2`%zv!r^A05B7Bq~ho+rbwO3 zYTDL%QpWN_CAX0jCAxnRryR9%TAVMrJ&;4iB at dS&x;-LaOrKXukY*Iw#kSxvTEwgN z_eV7_; zUZsrXs{_Oc5Zqv9Djr{BRU7%3Rp&&Ka&BdEl+PD?cF#W4={3y`Zh#K3 at Q!^XYN8QU zVD-$%6~B}uW|B!0QH#g8 zx=44DQvxS!s;wMEg(+eMvBBfT)gI9v#rnWP%DRGX3s0UuoR>`DM^MR8y>V6A3FWq6 zYZ`1#zuiPVKex`Fr^%EyCTsxyb0Hn2-vYiH1E{3g7$IG)WfxasG;C`_jB>tG(Wag# zPRx`bO+9f$I^M+qF=xm+{vLKA zfpzRH_*@(;s-g`0CFxZLvt~sft{4o%VY at e^EQO9M-K>9V9kA^}gG!?tG@{$3LX~cZ zfTv#XQ!`;rSy>nEK*qH5Fi3qOF=1k=Z)Dh&5Co)XcQUtBL>+0WM8T6_^oit5`Q5f4 zz%-;rtYp(^y=}?!mJo_}NQV2RJoNW26pU~64(dyBsP4`Rrf5iJ99tVqZ`Cb=Q3?=-2#>uGaW_XZa47>W)-} zRPk6+M!v3wAX*bf?JhyfzKRsmzA1F1+l}lt#6x|0NN|6yKFe-vKqxs3SG&>xj~2z8 z9i#^L*eh4L++zGyPh4NsH=n;R+0{cnuIKoz#N(yk at Q&{g+RI){h1T at vec|^Qzjg-+s-Ou at L(x>uH`BqzcUpnRt*2gcSSvLA2 z7-tE6>UcU|HmZITN#aV7l at jOv;YvD0-pIU-XS0<=CDW#i`vlL>DE44Y2J&IP2vI*I zYGN`en at pmGtZDmo16nmB4P+uRKf&fP)7WdSx?xwYB+~7R5}H1cMtj$^t{TOo?ZCmFs4!x^5cT1Z&^G02(nVb>r5Kv-Vb88^OhsdjM zLfS%e(e|m>A@$ZYj@@tt6;xdCnuW+~D-&)Jij at S`j@>dQ^=6nBe#j*UZTmhgqKT#4 z-5DcELsaAn)^5*5&K06>M$$oaH_-R#u6FO{MHMpGluw{SqP|4v1`fHw%Zi$(pRq at 6 z?caE6u(E#!S9qh9z%t$}0BgW at yS^k$wmg&LC7CAbQ_#sO=@o$Kb(E7Ftmeo~3q*kD z2~3G-Pxc at Y26Y+Gz=plCQK9al)yZ+{v!>?(aV{tR;5zRCTIXvJ9H at uH7+ce!e9&Ll zmCUV4mG=1eq9zz2w!>$Qr#m?WIb(oLHmya|_-BipN5?nSFjK`d<(R at o4-K`a4=zw_ zyZ>>Ze{-Y!*$nR+pel9O84MuiaHfED7%9+l5GRKCoi1$U8VRICp|?0bi5*S}CR~D5Ax3;?I|j>S zR(X~zKqI;ooyE00L+j#{HJPi!Tm(BS9Bk5TnB){5cQ$hV{n6o}SDngeHHx8>`UrYO z4;S=s{3H)&!D#|IZva*{eih7e3>q}?*$}~+i362wQrciaMUJx%of5`Q7B`^hv;`-- z2uFJkM)tm+;xACK1yG?V`6BT^WVGB9 at P{{3WB_ztGQ)@Wy*$Ue8Fq2l6Lby!` zm%)5EJk-IdY`8z!g5mJXWs=Iv9F^CW3(`8QSXZ<%cOKb2!oKQ)zSP>BGnfhR`y!>W zXhaoK07ut>K{U!nF{EMCM2Q(q^Z=-lJezG#EA2y-jX(O5;unU26#);mvzU?}g84Z; z!ZHpfGQoDjxzRy+#3}+9pTG>e1BAmt$*{36A@=}qV*{%Eo^;FlK~Kmob;YXmsd*rq zZbo6Xirs5Q`uy~CX8#l+auJM%14YYWGS`36(<}R|E^?fq>{~c6!6jfK!k{waxr+6~ zz-)#A`6CBd`v6~(gMoZ-EEwHqH2A}ZFK~ti{Bpzum at BPnK`J at L9V!_LHJx^joS6;L zoqcaiI4}!`)YR&vV$1m_zQyZ>Vy%YN!0pjtjRqIGEBn0q&yd~tux?*ce3~cppbn6W zNn>0+==Q25HT^3lmUR{y*j?ko at oXG>IayS-)+LegQIjy~j-dN#{srf5WWK)Y^S zdV}>~T at 3`3mmR$NyJel=9=9Ult)PYjU1|7N1uiE(z=J=Pac~FNnsumf0%c4(2mTK# z{L5n!!9}a$dNCw;^@>-BfR((M%(iOGwn at Dg3hC2q zw~D=;S*B4m3?7|>M;Or)i(&c?M9774h@^a?>0fX4^c}r=(Fs!ITQ>zPQ4Pb;7-%fF zOkiVE<=O5IFcD~J1ODSQt;A{!+Kx~TxA2Z(3LM&wT at HC6&MHGBZeb)H{q_?gG~+m; z&-N3~d%j89Ng6?0D#_w3D^Jnl4pjb*hXDd0<2B^BO{LtIzs1#_cVPDp?>li}XV*pR zLr*`zJXHfU at lii)u<&+#DWAI9M=z6kTi`9q7~TAzy4 at rkC_n$Qx%s2Mq1zV%03Zer z0D$FxUK0I#`7@*b>4&U_ at +;fe)zpQ74-8HX0whyBVLOOeUqi|eLJLR4FaVFL1nJy} zkr=YAu>}TySG2ssTiycqF(~GvqM+5%OadWNg$kn8(wp}i&iD3SzRSgwab*PFCG~w~ z#^;rHn)}#un(cMd@%YlG>j%V7_H!e~g!@tiQs!gLLm2rt;y{7n-a~==WbDv=FpkV& zG_LHf8Qp6%&g?!L&+HxqL+{Cmp!aAj?Y=wxGcy0f5~nw`Zgn5aT>yDE*5#-*Zq83{6z)qsCe0-KwMb&A?yUi}%%q$0kOe}j)zVY+Qi{|`!-cs3 zCQ2}Hq3lwVGf|!igNDf9{HDmVGg&g$B4XHBcsNN9T~;b!05jm{4d)72V_7kzu7 z&unwx+6$C$$R`L0afP!UQ-w*>-AgvkaTWOsWkU@*s_r&d%?xw{=ocD_7$yJ z at v1}g2UjVnqoyCXP)l1%5xc;o%jHzbH3Ksl0e$jf(|s{&jM+iE$%1ju4%XHz{?vFH38szldej zHaAwt3( znpUHVPR7$v!!zD4qW0&*&zJ7SapOECr%9f_3V6j at mnoMQ}zvqinQiP)~;V at ZKVIis?;n#`y|-xJ^RQR1V#wa?ln0hwNQQd%tSY z&qD*Y@&_-?jD+%J;X5b4s1D78eqFQeN1~7HbTlaOePp^vSQ`m;`7K3}G6;sGBfd=Q z>A9e4fS+fzxfx1JOtkSUmJ{j=rqQ0wEo at ZzL01oH09WXChz<&ywpaAYr+Kcp8GAp$$SsLo=|N>^U}F=BoYN zDAQssHV+Sc8Ws?4JPD%hD5KML_Bf6Ql7c*J5!XZ-j+Mc`VtkCWFHppwY}v8?jGWR z_`#3hF_0h1LHzZltP7FsHV~@grd^7>R{0ZaiRuO5o_R%Gqh$Ux{2`51lZP zedQPJZc?(ipQxCAE!HQAo9+BN+KAWfF`+6{@m}89p7MNeqhZfa3Z=9LIl#nafv(nw1XD+QzB(jpF^6{n?fnNM*i7M8|3_8Wo_$9NrDbDGA?; z#e7WC;d=d>eg~NiU(3{wh_&Ix{>P^p%`w=GbZT=Q%S2~r120=thTi#4%P9=REgQL& zhHJmb4zJ at kfL9DDOXnO6It`M9+`tytb%!gK3f*sa3{6KC$Lteit=gXFdg>X&XeW$B zB!`{E1qC|7mrSizy}I at x>Z;Na5j``AUQidGGs;xZ0EK%yn+NC)#+&E|T|Z7H(i*=j zJ`!8T+qfwUQc#BttH$8A@|`LrvtO1BDzuYrQO}GG at bFQf&mZ%u7MVJK29RGV5v_0g z9n~HZt!GU})I*`OrdD=yjA^l0mjVj%5o)jp*1e|dqoVSh6;SCD-Y5^g-$rAOF+=ZQ zXz8mS)R)W+Lj)m at aw|#s)wOahnC3PtOjeH$i}VdcFR{n94ym;csH+|*syhY1a+bAT z at kaUYYxX~;R|MSXH9go#(JNzXl??c^^KolWZtG8<)*oHhL+!irZ-fHYm0Q#! zwXo`wk?|?&C0Dp43RdgKtX-a#p4L7Jteg5cmrN2a2*zsq>5lrFTHKyB> z>Gmf|sq-M-0U!ChVcv3teMp%%ep;O%Gx?KH^GO+T^Y{72CtMPU=7wRs$}%l*3)Xog zn|eo2`ejpk03x{~a?Z}3$sHoOgT5YU)OyA$o82SlvLSo(2udJA*wW z*J5P2J~GELc|r$Oqb9bP&3It?C!x{&;%fcyYW-}ter41Arqlek)AVhp`VFS?Nnn&> z-DQ3jkI+uafIsExn`17#6Z#4S z?P4Yk!e-!lPquFeU+Q{qaNb9<7=n_}@dkZTW6X$-gIv%WT#qx``l8f6hE|>c+Z3P3 z#O%n~p*#aM7jk^UU%G(CgssXm?M$W54S%4n#Jr&j;^M{5aUnGyXbQ!rsWM;u>+I}7 zB-Xt0$Flx zfjIa)B*I1*{*H_zN;Ec?BewESM4F_IFkU6^Yfz!Vs`TcQDv0UhK52+fz**;FD&Qf^Vk#ckHqZGDx)&-z5=@zidRM5`gByTok53aF zz#p5%){-t;jPG9J;*I>|r`SVh>WZW_7i&&xsa9^ErcE68t6gVpxz at HA-CEJ}iZT)S z%kj|b4l%%}(???_yt=T!5E)AOMs=igSQZW@^#fcT@{@8m)j99<)5%#?AG5YzN$C61 z^#&Nbev4ix89Q_DqQpfV at GqL7o3p$Z*mAb#DsU~zyee*gD$W)84!qjK4(7cSETw}7 zL>aTa)+4VZF9s(Uc@)z8%?5)u>N2~H9GmlNE*q4;EYyb~p}>il%-u_OkaaB5hXIjn zfJy`b8eBy39or%Z;(D~I_(-ZX{O_zwfD^nE*_jh;?e at N%Fin0ka^EEpNAEb7;&xIC zJu^p822GMW=75#W<3-IJ4&lz3SYlRq1!6*xa}0^81#@uX$Wpubk$m~y1#}>XPq6{3 zw$K*4LiH%5 at qca!pHr&S3&f(QGiZE6$aC-oW$t&$!bR<`#J>Kr?l^>ltl=yI6y46i1QjV^AzTMR zf-V-;#wL#c`Flo74NC?22ev~RTqr=XT%SgyVI~BzeohM>Mx8QI5CvMXiXB1-opYi% z34+G*vc^)YDo)oo0Iv5;b5dm0 at p*lB&rabrBSRL6u^L4Y&v7=x=jHvS?UmOoFRAb6 z{aX$|=#4boRvXd~vH!A&Hb^~zl4z28Y(_WT_Dx3`hg>a&8oYDlpiJD2;8(;TVR1iXc2=m$!eh!nF=Ek zGt2(SA#{|3Br7dCk(LSDK?ReCgAWIfNaeRYQ7xJwv^JhglYL|_XD$_ at lBDA3I75+^ z=JHWdlVoC`I5lA at xtQu}6V)?DrDPmGIt|%HgEaR*nV0SosZyDGlG%Y%LUy<@Ggajn z9mYvBms2H$Nz|G$jS2(XRCW=@<2_ONtjXYDYZuZAD?|)+>_QN`1b(_~n*6Dq%T6pJ ztY3*716s|7M`hB?sOg-A5xy=p_|j$0NoHqHphnR6u13l-Li-t>Xs5J12U-Jn$*gYL zXE&s~An91@*kG at +wAR@?`JQ z3fj(qz%vdtCyZ>L^U|!9fPBv!8$PFitRGHppwkb7z}7%O7#Rh)gLeOi7ujBF*v6Z9 z&j=xJPYEG!A6BSKN>tc8mW!}=PX_s$uyg10w%-RqZ~xEhffWKobQF8o zBerw8L3?h}5Pf}L_+kXy{bx~~r-mlwWW!Wv_WZ+CWP!OyC)UVxWp)Q^5e5^9Zc=R5 zRa5=uGya`q)!k-G_X?@A&W1RpNUcLR>kjME=oO?;_o&W|?$)M`yF7ETNhK?et*?%O zd9A-8c)Iq9vE~{oC7W=edq`&mlKhpRlwAnqb0eU4y{05 at o#Y6{d#QnGl)L-m$yh`$~ReNu9{ zcW3%!bDAX;@5>H4+;Vky8qryanI#)f9K~QazWgt=56d1oro~o}5%Uen1m!c#Qk!UN zKjFL$Gk5SQo4X%D2H0OkFMrQ^6n70&8f%ol3Dt|5LA==j(+MU-$_!|(C$XF_M9hVR zhFX0BYr(Op<8^l;pKbfQ!S(R(>kPO@`qloXuG`Gs(~54;ZF|I^;E8dD%$D>N+$)e= znnAHE at D>`zy7Uv!o5r;p1>nMkTHwk}?I3(zIw!vU1_=G&vTE&k_STObOtGJ47Q!rl zTi=lOy(;h`Zt at chzyv&>o^SIb_Q9SO_>JAePcp_QaIp3BTSE+xYM}UjKHV^QsDxhU zhHeg#z4R5M;qBozqz!Syg_&a&k~YGHynyKpr%PvqOwaQeg4hn&`&)D!vE4I7l{;*} z9F0T5Sf(Gv_-_ncZg{;^;rkxLxPhU$fcV} z!w0FDhbV~4PdR(XNjdR`K0D%RQU*RM^?gvO2Xcl$uxKsp0R4zNBZh9=RU^M;vA@%u z56lTZaf~}1x8w6Fao(SD$Llu6p*MZevtX(N{Tanl=B|g60KwXe*eWZf=L#LVIK$pAO`{ffa`xs+W+5G zmpQ6ZPMgZeKepClt=^l#tPU3btjUR-lS9R&G%+%Q;#r0V#c*XO4N6y03Sz0+8l_6U zAe%pctU7ZUiLlP00WeTMf at mQatkmiNIH=U&KyA5B9eY?J3 z`hV~$(MPl>qW20TMUamarRN`7BT1;K)Fp%lx)ggT-O`k`M>7MdDA^?`dx)}LQL34S zGd-gWdbOLfIznyOq!Wt%5gy{{rR5zRicRYd&o)ZR)?+BoFg+^z;wsUhC0#gT^x1f4 z4h~j5^(r*f2;=ti_0Vn+1_WH`zvq-f-pjQ~j|q(i5i_z*TI^a2;rrt2wdbZPZqOdE z$quhdMKkf;)*Z9kk at gtw6OF-5mKWEp`B_jvBKDqWVU6Qg&u(okmrn2c at j4)#?CLs$ zX^p&L(Jw694ls~2 at NVVv>*sM5ur`NI`#6%yFheM at Hyf}+>sL=s+S|>UuG??JQuWB) z1$T(LWG=MbY+K7X0 ze7GQ@@D_!xQcG2x>-XmKV1m%jE at cGk_S}s4GD!u)-N1Y3Vi|`Z*b4On_mr{@ z-Jy%vS?!g3m}8geiuO7C=D}RCSmRF0^&<{Q9v~{QaQO_?xZxit0z$@!LYG#pi^Z0r zdgJj-(5J9RK?at7&(Ed7pcbz1Y|xR$B?Nwo{}d7XQ;qYf-5gDFN|~2DHu#W8eyboc z0 at Fkf%1iaa3 at j2S1Ln~$x=5An+w(K5q~}@;lDpWUbi^X!xFw75qi0os>!2HWMcb?s z1c{X|;L=&|m_l%8$U{-hxTFv-$PO<|idSgZWICg5qrkd4uf$eqVST_R8#C597{A&~X`hGaGiJ-M9G=F028!bRgoF zk{k#TyV8HDz at 6RdxeAiOpif? zb8!yw?#0Nj1xArG=VIT2dM$>cod-(;4~zy`<_&wy?eE>^ySorNwt z+a at e2`1u#+IE#fV$Nr~q`33&(nsfdS%%NoBXklP&;b~$lYUgP4pPl|Xc8CJVJWc!o z*R3m>6(e<(Dgmt9Pb0zv-E*u13z^7AKK>B4OHUt(RJX42JSBlPNb|zbS%@VRg7yA3&wrg zAc*EB-d=`5U(pOn%1nqmRcvnIMIw*F4JnQ!<<>G{Bcm>ASu+t^Rf-wfv2at&h6;!U z(;yAk at 5t*Q4oE=08_`$rxg!YOh+o`QQaCfIUicvQ7@>ed%j!rXta#&!1RlhqE;KRq zQMwSb)f`*e*PK3)g8x{4Uyg9HPcY|b!-CxAM2Wwr6ni$bHcWLcuSjx?BQHgZro?H+Nc3k?WhW-v#>O0JodZ}Y#N zd3~#qZ~NvdW>yATEbS0hLt`+Un2;+d{gP>%F}7M%E17cY&(EB1H2+=bRTNKptQSzXMULreN0Te&G2P7M zoRXWpib(uy=Is}HfVm~m5M@>R0KCLP%p(XMqCZqV@{VASWTAL(|zCKsz9XI(8gBMgO{Zv9gI at b-~iK&TtK~pS^|+ zT5opmdj`72O*dhB*lNX+xT5cz?`xkn)M^1KOtqmGcG;#eQLoa3^;QI zIKpfURCCX?n(c(C~@cES_VG zT`LhL6x=zGpYx-IUZqSAZ`OOpQiS5F7&67XS!R<37)br{MfZ;@3g}-(MzZ{+>hB_m z6swvh+OhwKEBjiH5^6!Rv$le4FLDJj;?_EA?VaE7+kLM`8#F(eJt%PTl>*+BS?ia^P3BYD-lqS^4_C=D%YH5jgc)Z?HG zjntQc?D`j^|1=0B$rLnyQ>hm`;Uv)Y&Lj3183&JZ z)+S{W2r&*ZD*Dsa=%>^_Mbk1ZZ$B|`vTKseYi&poO5TH^qVwtzPUzw*loCVQ9>Sh4 zGIdTXr;%*yBoei!d5aihB~`~lB&=8#ykX7Tsdr1eF_5`PmMLz%k~wEKKe{B+au%!) z1NqJD7sT1_BiP0#6HbR<2=Fx4|e5oVy4pwyuwNH?e<$^+-Qh=0_4 z`{nIief~E3?7D`C)SgN))>3s&dXn+0ud7fIcOj=#pdXG7gzzB; zrBC-#jMN`HHXt8d2b59M)Gjlkl_O>6=@mzesVeP==7obB78`-5OW9S*aeQ;AQMSds zN3!kE-dNe3MNpW#ah_@*Q48`ED>R8(S+nktcjJ(G<3gRc zy79+YLOgQ#T!%lFlv!>EYdADP+vFO$T9HSn`T^&jZYU3760)cxO+!@ zJVAHzjpX1n>@6A@&>4G<$g;Pe2AEV2I~RuEvx_}A2a;JV*`^baV* zzyJU^{->b)-z~CoR5ooF`Qdq7YgunV&Qhc-3iuOSA$kGanJH~4_3GNRd#o`< zHXULvVt2%){#C&eDHrf at Ioll*=L?B z=1(@e!SzMY8X3~D1?A+DNk65p0 at S(b2qv|M=5;m`>Jg)U!5nuhH&tE+stD)|yO}{@ zEYaX=)>5mOqLOjqP+*^gcuX!-X+^XHtucw7dTb29fIT%Wh4&<$r+I}aHbQZdAI z1(1tyIFuK(iVQALDjlOAxQJW}uWdV~rCpXE8I?A!;Kp;sE@^fLtgCbiHJi0$N7hWc zH%!7 zPBl{{rA$;tAc;qW;KldNQ}8R~xBY?i2+aRNj?5lXd60RlV+fV#-+Vt)D!VD=avQ=q zv1%^DU6}O9OGp_PMcO66Bf2XY!aVVP?-(n6w*%f>qWIgahSMUUyby%`wGoughgO(( zN%JscD0|dN#jMEwFvuX-GjZcAQRG~#V2|Y%%*-3HkYI}I2I8(-Oatbnutc>1wq)uc;!}L=~JE=$C*iFUE>X6!`nR>T zO%j==T{SJEOQUMbl at gkr$iM@^{?-(th9F9>QUBZ)f$jP>#3%S!o#Nde-#f6kqG7Hq z8~jo{?aq3y)7%cHzZqOkudjJ|eE`_{a$dBHhR1AK%gq`nckA zIT9U at Ad^CKpC;OC(S=RN9uLA_b>@=kbd!q^Fvq%Ir!|{IYB8&m}4zYJdab^djUtkrI__m%GZm2W8Sei5^XUlUI~J zT&H{+!`sjbC=SFQrArG-fIa0#2l%l$EO)b_0$-LnfiBB2$PGKfI|D#nF>-a=g`IJJ zQzSmQ<;Ys3Wm1gkpvbm&BnB&O?Y{kF2QmSdFl4Ni4pEiC_={#1XDze~bLaAlB2mzf z>PUYud-Bt#jM>bW$g1Fb?t!WsK4CV{9vs^RcUcI~y2Fey){jTk%y$z$xs7xb+h2GMm`WKaHdn9}WmKh|b_cJA zZH<`rOF&Ed)ImP}#an6jcml-Y9{`&E-)Lgy{}2?(T6TyE at MFJWwi;-ys1^k~l`V$H zq){ywK*bCeme!KjK)^^ontS4HHzn&j(cb@|iH#1}7-u!eDO?uo;a{MCGn)D`IMVd| z`hEfK;N?(;6Xf_s2_PUuFphyK;Ea`x&7mEB$L}0fLM4kX)irk=K1f%`o3XP%7msxG zHk+yg>fEGvoVD{_VV{yPXR5JU_wAUvXT`EOrJRTEzBCJF at UPi0++gngs3i+ALFvoAT4%O#lwP at IC0P_BJ7_BDUIIE5(>XLkubf4Pk`}8A z2dDsf`>Z~1;`c|YzdR4s{pzfMcIjCZ1nB#AHtJe7T5LWT$$P6dceKV@%B#KA-D~I- zWwvju!g7oP!4$3Lzkf at hHWr?v|hnzT?~1Wxgcoc2kH}k`C{g#7YqzP17llc zx%#~jGR2C at iRPU_ZPWPJh7)UptFzp}u9tMWtT=NGUg6sPj-HH_RXD at 4C}{;068ecy zwA`r=A%+yeRYzE~%MQ_P`WUT6>9Pv2Lk98t4u|H46?rEo$p1PENzZzB|NZun)w1Ql z>%4(dvKhkMHe=LrrA|TQA+?J2g&-bb;a|ZT1|-p-_5r0z?IV1l0N2bn%MOJ9jF~bv zqlh1 at 4`+r~mr^ICVLG0Y^;QFlNsSWy<0*2B7^(dc$`KlOitjhee*_^s3bRG*XF8dd z^QJoC7IlSgTb7GpZKJ(RKtZTUk?Je>5%~Vt-o!$Ilr8A7i*cxofc6F~i)pmtz=rPB zj#iG<9!F(dA`xZulpsGSsr~*hvV*jtk1gOI=q7^xceY^v1$6&Q)>Qd-^BvR8#_LAy z!0{0(Lc=Z*Rrou_qX9%j>E&U{2nf1GSH(1Iw{czZCpC-0MDqiz;qm8gyV~{}#DKSDfkMbYT zN+m$P!`I}_+FfhUXy}Y4WjFWq4Xxs1`sC1}B0P_OM+5y%^Sp#?HyPJ=X|Db^9`>n;?Rwe=D<;&H*3il$y|^WlQJ z4k8*K1?4=4VIf<%LXG5B!uHii?gt)A<>0?58^iPpi7JEx5s>RPW{lpKz|cj^U+iv}e@})MKA=l>}wseOy=ZdNC;$i;c=mD~HR? z7$p~+S5UfM6oBWr2v5eWtD9D!J%}8(GIPl1a-18Y-5V{3JRGJ?-)hK`rIJA?l=3)n=&fKSYdFchLGA47h##1T1qQLRGt4=Pn9oV2 z0kT#5r6vc6qV$q4>WjE#V9lq16A}wA5|n?-Q}{re9`y2kL=T8O5ZlYYhzq`jB|k$D zuGvb**_I>wnU6)4x}vFq?NgkSjHjGxruI2|PVIxPPz?)5_OTM}s^!G7iBuH(h44Dd zLpKV(11i3G0@&w8nHhpTsI&R4J!}(74H_amu$qWZ&n4&2V>1FewH at 0fS|ko>*Dbcl zBwqeyo6#(L$37n_0KkR>0086v5a0jNxTy`{t-QRJ=5s-udoR(cecW~U8bXt0lkkZBCx~zq=MN-j5rvU{;K?vThM$2Y9t#e7|lg6fR zrA}p2?t8Z5c6KIfLMj{L?lP=z>-EMp^_S;$%jqU7 at 2{`VuMmKIXr5<(2vj@!yv&G% zwz9iD0quf)0~nP9#4F9QA%u;4YW)TfXYF2LXjBTfehOG$P!&t{OelhS**?XV zdR~mxoifa-=^-b#Oi)>)0dnr_2nH at U(kjz at 6Z4aoKKJ~PsP&{MP*#WeL at 4)Gz5)MG z6AwKGo2fy3UX6BeBmMMWRygTF8ETbbpqcgrlyFA`qsbXt?67NFZb&Zm^chUs{S(w$ z>*qaI?y#z7ZeOmpoT(8HTy8u!^EVwh>VBy9TS432 at gTIrSLUzY&@^{_hM#_*D0>RG z->lFyPkjvC{$bk1yD(h!*fgs*BDm`Q81A-=C at S?>s*d)^Dz1(<1|wINzHi|nEAINx ziOxGsT33&Hq^|T6xem{q&{eNJ=>x%(JcoNHTHCz?QCi!B15+3~0dz$xVZa}K{jB+B zVr&bMxhg>dqDJzwIMJB$&^E&8@>j6U81o1IwDszJ+u($h0(E1n8U!iaWRzR}In-9L zKp9bBg0j-Wo8)Dbegwj$W5-#|dMH(4^ z^1&t*vlMN6qJ*-Dk5iYaf2*p<7}VkAiUN at e=5S5%WcC^~LN)&$B_j^j5Dm_iuL(Yj5=+*UDbtAJ zr-5)p4HlSB<3&d3q(MC31rlvV(-*OmU^QyCIw`bAw5r&;;2SSBx3QupaN-8e$@hBO z>P6MGS!l(Rs^SIRTEaGy zfx-+_j8u3=H7D3xQ!DARWN<&bCNrq}tl=BSJ8Q2fVUT#AY$V1ES2u~*y4foQ7XLeW7Kt4ZV}8m4H8V zK9R9Th(*$jxjx46BKpAMXgahttnlXq*o`&Qx-^fg_x#&AWwRPwjEu(nlc}WL?v}YL z8WqN+H63*JH8bjKUi~;#v`A)W$=I5C9A0dF9=YN!c=@_OJ%70zP8bMyjS{hbIbSHB z5E*jpOPUyyt&66_cUfI?5f^$go2!fgJMtZzm&hJ-7WI30pS7s1qmaO4VQOhi$;nZjD6$DT^s?khg*j z(FO at H^Yjc)U)?rzXWySW#Hji#n27_WWl09%4+mi!)9ogoUp;T3Km&M}xP%=MJ)`uL zdccnAB{sAP{{a4`f^m>v(^1U8 zq!8q9~NkY6M$)eK2rUC!Na6b%_PO}CJWU^^7BH2ECZGqy#W)T8e;1A3V>)S zXVcEJU``Ejcbc!@Q-M3QNKv0OucuNz6#a`h$eS0F-$S6^?0kNb&W>#KhY5bE=mCnO zX>yOw{lG}wE1tShB1~;x1V?v|5cHa}d4Lqguj26f&MY!{F+g~Thf_P!$i*GZx9$+f zolNa^!M-lm?T|NkJxD at 79CN4Wu*W?wcH2G!7EZ7&^wZ at kKJ?FqpG9ybdRCFf9z;$~}U&av0YgL$J|;V$d`Sv$ysb z*`5fDU&+wtT>xy}UJ at s7h@4XKu2r~-aPbIUb$D}gTjH<$J79+7ZT<%Ou7YNNhR{o6 zdk+n|dGRxKVG^MxGB`>?o<)(vJRwfrfLX^IiwK~|k33QfcUa$kM&I(i$5z>p>Dpkt z&B8rMcKKlxyT%xSJG0G_ at 8oAj6(#{R1L^*$41_aYz_ z?pc#_-DN#cZ`Baro)gUO+`Zcy>0tHGL=CIvcrlTW(Yv#nHK~)IR2bBL;UA0*X%@e{ z!o$rwnNDpphE+HCNKctYQti#1_5wz8V)dX{+v)lH*KWyMM+T6x3wG#77jL-T)dm2k zg<~GAF@|nCzTi0KFa9yOdm$;_B}r;kQPL at 2Nv+bKl!93eNHKE3)9(zQBp-Q`h>Y zKz)SL7hHV7S_?jWpvuUbVG-wR0=+mP)Q|nKCjqK2_ at bt*k`CR>w`U3~^h*o4vtG?z#)^S(^h#_ZkiL>&f0C z1Rf+ht0N@%Ny|qxv?SRmELN*^nmQU<8cJdWo+>gv#}}QGBbQZ{mggmwCNMoTwcIEM z2LO9hT_}TWRK9xYPa#6vfa`jAmI3A at zx9!>#+Gfq-chN#H$#?XxDk-3CviQ)mj-VQ zX&JyZQc73JHo4DJkmZ*gzx#(qURh&T+$Zex9ie{ESu~VWm8rCcnz46$_xQ;# zI`^Ep3>+m!ky~m)_(!Kq3wRb={`O{kcvBxYBS+8gXgWmZ^Dm%_4R4Avl_8q;%-(gFN;yhn}JKz{!BK7QbWlN-*SEMlc0O7#A97i+u zkb8_?0v0!6GP?K=JHQ57TEUoaea8(sF#>1d_p%?HGyOn&>d15eoSj+m;ZJ!5&nKQssE$Fvq;gi1fl&qBA1Z*T&;R%UxyS~x~FWtLJYkk3lyE6klKFmobB(+dABM1WDM$O=(x6EFD at HflQKFaaom z)CS4yu~h@#R?R|AwpIGyuVULTSE`nd;Z0l1#o*o^XD*a&T9G!T`D?}h6%uxmg0?|G z`x+SfADZ`uZTRfQ3J9nMY~n^<0wd3m5`cur3G6G$zab;@{%1&x{PiMbIfZD~rj(`C zzc^K;bbq1P&52S+JMu3fp)RSh*V#2}yHW>PSpMIef=r!}IbCkm{$=eDGiq#?iG*G0(_W^6TioR~ z9fvJBY_C24qjm|$=~rC;eeh)xxdt>>QmSk+{coIsS5o64u6U?h&Eat})z?KOqTOt2 z&{rH~pB_VQ{&;S5HEccjet at fq^jjZf(W^kjTO#_xQL^C7OKN*w5DyaK)tY<`HzC=+kMdVdlbWtU37UQ}1ocQxiDae at Oqe}sF7XVSNJp}Ud3HFtY+b14p zBI$=?F0M_sL}XY6!aPinSzL6r zM0@?E_)D<2aOd~*{_kMs at 8srRpyUC(0_-0^lsh$b(7gYLvu_I1EK0IX+qP}1(zb2e zc2?T9ZQHiZ`qQ>um3gagPtX0PA7;L}kNce0SP^UOh`nNP@=k%Lzb^>m4M%$)m&d3- zNM->zy%@D_NVWq*&ylZdl>-+9b)Q(6Be)`#{In-hv5E*Get|n*2<>5C$unl=Hyu^j z_&#)_xKE1IRie#4k;^wauhcxNA^9kn0(9m0 at Up42{BfwP{ydF-zj{xeN{>Hj+X{i1 zrq5ASmTN%u8NY(d;n>N(je(Wz=>pVFMJJ at uZ|$JF3iO?GK1EkfGQ3AFFhB;Ph+_#* z(L|0gTpqHlOR2U!OGbLgpBq`M=N_C^y;$!|@l23jVUXS`Fz;Y*FZ~Jb{)DSzOESbI z)dPB04*Z|cwyeb=Zl18HRgi|p5ZnpekVZ>e!AxG){uxP}t+-LEJ at y%Cr|9ta)|?4l z%Y=OsLTzq#^?jt+ig=(raiQEtB|2xl=#*5w_zg;QbPgp6!bB?;$)PDbg&}e;Fy{fB zJru3ERIcC?H+*18BzH~;1gNgg6G9+%%th|d;+*%eZ8a9C==uE(*TgAJLj*1G5VgN>qEE$k(^0V z+oBY1EXK2JqE6y04?grqET0L}DMzwG0%dIq6YOSCP3@>$ zS4>kA#})_rjGgP5pN4Dx8GHep?@9oj4RBJe$RT?!^$dRQiS3YMeUd{G+ef1~G&5ep zYEQ=JZAb=QAg?!|qr*Q(0f1t(Hhkp-E{a5jHcf at DJ5TsHE;S`k$b<&5k02rCk9! zkPPHiRh32C9Rt3G1eOJ{qjk*s=ZCDDaB2HpM46-}B?*4ZxWt4 at ss1I=EcSlBWhA6fDcj{^Nd=^kn#_-GGrKiSQry at 7}EU!v95olDehH|M&W&0 zn*Or8VYDJGm_!ThyUA5ZBkt0%&qAKeSLTFcs at A)?5b|%W) zh>1UCdBoM(k=4aanF76u0^<{9pEMSSTw;~SZkl#;{5!hZrmTc;n3cY4+#Hr#DBGYmUy*3L0{@6BRQ`& z8KH0eSJ-&*!8a$@v9Yyig{Km z<~$RAl0tPEp{-_-0OXoQ-KVT}a0oGbK&5?2T6*NkxaVRBxJGq^%N_WRsiCW_4%)+Y z2l4lu0MKG_-Dv(fD`R3W)QNs*vI16R)54yK42M+KF4`-1)a<^}@cD`&`k4Ec!c7Bn z0Lg(5Q#`_paX=WNq5W|3Os!z%FZv~b^aS9cX00`wr626_G48O|+{7t9d6W-$7+)c2 zl&=;E*SfI-h1@)Hs7_QXr#yZ%m1;FTGxu-mlKZX7&5m7rO4rR_ zK3_L4wecMK#0eIk#w?kTVrcqswx>CbA$C!pEwApTt;}}dIqO`VQLZ|h42;#g50+#3 z;gA!OTv}BI<`jRkw+kXU+BR9sW at Nh`>)U#+Jv|jmp3S$-%hvpo6 at Gy|*>_{dvg2VG zbI3QXpItzf^>Y-AEvns0ig-T+jI76$l>977QWGVW^&LwuAMPO?I#QZt!WkE_wt(uG zRjTPV;v%d$>DG8kg}W#M(8;wOmJ`r$#2}gv-x)TT^vj5L+c341-Y14kgFe_9bC;cC zYnk;mQHH)Z+Ie9F3s6eceND}Y&vR_VC8DfPdP_A?E_VwtoY!Jiub!_?d-s}k=IZwo=b3W@ZT?$GI5$4vO|qu>2h$FPc^KtP2EKtO{3%j;-yBR5ZXGiNJPGZjm#|LC^N zs{fKlRYKb?r-!Shii#rHC~~$!uFw_JmO>gqsv>LQxcJq=mooTQfwmMW_(l-!RV$EX zRm}6hBm0LajQO3!ov8SWqk|JmztbCT7lvC&}J%e^vB2Z{PDy+Ri?(Ts95#v`WNt8EH z<;+%J^$rqClA;FQE*xkcdzMC*4!4%8>K1%L5WQ8V$wQ~2H??@wM>Y-xr>fGw__g5B zGJvaKH?DlXLGu8cnWQ?QqzB~w_;VNOY+D(vsvdL1II$@5*s-M0sTc#<8G at stY`G=^ z9OSDcMMJc>q&P76?M3=PkS=;LsN$&jM<(b|RH*`&j-7MY at X4ON6f;?7S!q#7txZ%B zP7!gXbfTE8Ld)oZ2!UI?Ak7uV5x!yNTQ`Ox*@`*8{+lfy!K`C|W#rgS2D>feDE^ya z5}~wrVrlHS0^X`U<30L=e1)|ri#I`4#yibk`YM&zeapuqES8MPv^SKP(Z)nCmAz+}(xi6*9wZR@*NjT3<`SFAK%BVSV`X at _Ru!|LVd?uk1jyktIGJG1 zfG}&lEr?1i?+Gq2p?^nX{!dJCU@&i_+I at M)+bmv)2jD==-{zn{dJuqheY`+(guooz zE{^bS{Lg};CFjq?@2V62c=HFIzB7CF6Hy?HLFuwwrr$pd0O>Z;XvpOWb(r7t4p*Hr z5|lTQt84<@1`=bPs3_ett<9^i2Bm64+04C@*1dDqyh~_4uV(Zc&E+5Q)xE=Qi;kcJ zgpb(SH~*|=c?L8r5f1s6&nczPG0U9#)VQxNWU{%{J>+${varQP(B=xRm|3 at T%dgLI z2cgFyIdlC9(eo!s%fHpUuH2_I`Pe+>llwHXL_zj&#Z5HyZt==~obU=p-$8od at l)vZ zRnX}RFlJXAex+^h8u!_{$S%Yd1$dz)?#>M5t at hEq)fk$oLs at V?cB-Vt&-3Jla=YY* zgI9M&_z36&kDMBTGyMGK{C{ZW_={GS6{&C`2p}L0WFR2w{}!#1MlP1ZR{z;E>eaB) z_{SdAF!DgA4kasa)s-q at C1aaQ2xVlUMJh`sD7|pgkibdVELqK(ZIABTX@@h&KO}8= z%Y+MrtIMZzaFb+kYzr<~E+ at G^Ty{Tu=Kb1#ykFi5e1YA;`NJDifI(*=HOplLGl*jo z#}LgR1sT`jZzAbS$j3YgYZ9X|5e|W1h-ePsGkc5BbpdTX&gcWg0uU7>O|yGBYFO7W(UBB{Y0y zS-IgUK!t}_A9s=3mtld2HWG=Ym)9_uS5}mvZsGGw52H|U3bykc67*3HA;=Cc zJ!R~v(SL5mB%#MK7|ia;TfNK-(l}{P_co;H-H+5cpY2ddN$9OfaCS at sAapy*He;M?UePAd#|TN0M(R+(vy>bo&# zT{C0Q=pUmoDVyq8R<P{@R4_5IyzrJ#RdgZG-(1LH{yuM_*^`tcP+qC?MYTktC7TEl}dfDCI>a||a z@(Y^WU+UUF=Z!6bhhO;hy%l=qz+JD6sj8Q2KDXo|r^RY>>Y%3DYsf48CO6q;9#Gy| z2->X_%;#G*sDE|X8+rTs$dfR>yb&jU@B at L< zVmOp2xM3}P2Y68dB+?ML?Pvi!;DYX;E&o{0mw|BHh3&<66A*a-kecH at QMfmrebmZO zD3~kTK=FzpYTw=4Nn3m?kR&n%MKFP6 at Nr)aBFGA{YkE20Nz*wOIVy+SwX8%f40#VS zxA`c9w^uR7p}fSSwQ|8|om-xEI0g(6Y--KLZrSW~w1AUyBrT8njaiPPJ3^kmOwYL~ zyciBA`Gnk-Lb7kViS|f53MS`MgiNyp%M8tsE=GEk)HNhys@&5As6#ox5!VIr&?|RM z7*OBZb>~v3(uX1_;wS6`W#0;MDDkrw?PN!UG1W{W=_-IL$y4&sg#v#$A@!6lX$#^v!ji%B%_^W^UmG zj`Y58Uq$%aAy@?Te<%F%|8$tpy;OZggH-`6j{?-Zw(~}w{%ycfpU0<<<1cHpfC2*I z_;2fwn4P1m*MCyS|GUlC6X5Bsd5O0uuo~2(GGFX-Pl2LWBcL z_F+d&im(Z}nG62R`7UHkB90pHQ((%|!X3C2T-tUicfI#C=QHE|`SVi&2sLA#D7F%= z%!x7h(=$N`g_Zhfg=wBxb(Mi;RI8s;ys?r_T!qJ{nE<4E{<)sMv0ay z$8mVlVaSqp>-*zE8p)n>SRwshU&9sp4djqZx{M3l6}E`YpbMx~r}Jo&NS^3#6U!-R z4M`IF8H9Q!GMF743$AV=-99XyYJh<<7#u#VeyAZmNV!{2X2PxLKthdYAuTpfGc4{} zn%P!bw|$@HHc=t#FnJhSd*^Vfm_#eE$T#f+27&={Akjv8ngh44v%qavUJF^M5Z?CI zW3SbMBeMXaxDi at siq+6#!LoLx>3exwAW2ed0 zE03jO at +zDH_(mHA2sI#zPW+t$zm}vRN@~?5$l-Etmno<64UnW;d|qUmL(=|D-<&(~ zq(l{JCmt$)O5+Z=c=t}ZQo>idkllp+1Cx(=LEyUH7uTLbnLGAJ&$+z_;k&$X+&Y5W z@?pTYiyk(wS*p5XHTEnhIzFmWY1;_Y&QgKcVGr6{nF=do_-7#PnGu%2HL7s|Hg;Hc z`Gg|Olcw1vJ|Si6^cMj8T|P>)XzYd#gJzB-n6F zRHJb|VfO`91tM#W9e8K>y~sY{Yp+dT&a@Qx*yR=FCqv~OmcQq40i#HE zrk2bR5*<4$zyD3Y)hq(}*MR>;Aj*~nJG+4Qe+v$yys5=Yf9 z|I$OG{A|jQQOyymqSY!$R1h#<)euQBIF7_3lmU>|Ym~KyuFch12tq%r-Rt%*)IUez zYk9$KeC6Zwe~P_%Twc3k_bJE-=BdMHZB-$z)M5B7c$HBsBag#GJC*Q*sr=wKS!C+_^Vfbq~o}LzeH2KpR%5Hu zwP=d~hg;g1PmAw=EyG?D_^l(H?q1o%2Vl0f~iKT zBlY!rBR}&bdDM3bYYi^naU= z-ySY{j#+Yr(Ntz}5(2mVr58Nx9{&ueFRllge?umCxV8~-CurF6M^G1H+z`Qv6A0Cz z{7*d at gx_#N--m%mw|kF+CIpFso8Z7H;lvSIBpD)uZ~iTK&L+f at iITWK zg=S>8kgWMvR3 at gz8^i8!Yr*pZzcCp-B7PtelaiY;9l=Lbl)7C=5JYw~yAi|~9J zC>x-Spnp>%1T48d?-djHstzP`#AW5%SaC&%qL%vaTvbR=(@=GO73Y0}eRQ(z?$h&7 zTI!EddU+tt%2_5W@(xpXwR(7>{V+tCJN&S6Krzh}o(=6BFk*4eaEG4RsyMzt;3XN%^sNP*XUFjj2jhS2hvU_7*oz7=eo2MQtLD6uho14N=W-;}4Z?OJ z at hTrd-B9w8o{^G=4y$M;aaSDq=q_q4j8-f3N4_ZbkqIdiwQTsNzWUut;aN$;bp~;p zQ!=d#W`L62(ku|EhdnS)(W5k7&~BaX?mc at xQuN^4i+ZB;cs~M5a^JNP$jo?8$x+uI_s_OH_mekC4IN(Z~h$Z)M7JO$88IECXqC<;deiJW+) znR&T$=AZJ;C);f7Y*e>%uIu`|_Uycz99?h!vi5O#czJ2r+Tqu7CNN7x%m^AMn3C%+*ld?RSik}C;{R8VCkRMCoA4%GJ)1?Y^$MMdc^D{;h at PXku zz4QE^zMnrnS>8`~cfWufVPz!{(_CFmI#Hc!BFxn2Ye6l^JybyGuqB)X(GtRA7EC%%LmYPr?NP9YtmjivQ2z2w7Qz- z_?sVQ*hlqo)NTiAs4^yQew4~CIz?g3Culp{qNI(!_RcgN@|)WawnXFB^qBhGBwK;| z#TqJ1N&Hkf70#NhRXBZEZVtg>bd1K#l)zH at mJMt){{_%%&@3H_G!1a3`%J)Zl3iu3 zg%gUwYm~am5X<&bOJ_iAf31o}qjh%3Mg2M^)rj64omtxvA(1*=Ji_8eC4HD?t)2o^ z(a)eMv|`)zZs!9SITm(r8EOczfe6>lmRullL&JFbunq?t3I2tv61+r=>)l~3h zh*td?GGbtreW5B{;wAW?(~Jlj20tRc^)$&mDQ%wT6C>Ca2UQy;n|gcZL8aWTf1BXq z&YP}X-B}Zu%1g_7*{-9Kr{2aZ@@9?_|z^x5Ykb%cS3!x>2*cV zRmyTLdJLy4ULVNmv^t=J#mq#LMmEOgYh(z54SH*&JnRR~XLn|`!F~s1fKqtEJF6jA zJ)j3_ux}&%h+pVyvZn)3OW>b3rIpO(i&PyuA))G67|wme zb{V2;bk6(*F8xhC3`od1rwG_I`aUImHT9 at kKP%n=ZCVHrrc_mu+lu6`7;J{5sJ4h=+9}?Kpi3Fs70d?QPq+W93Xflpq;ywA zJ?5(i*GnEoFp{w0kZkuvX4{JHbBwpaIU(Ll*GQOfg*1t>aafOZZ3#U8vF8_<4Th-= zbLh&y;K+fMS2`@ZO%@v_4gp94M)e=SF`myJvRe<83E4;Sq=dulp&=gLF3P7sd19cB z%8=E%7t3txh)@k)!=utjZ}F5_IzZ7M{T$&tApMdpAt9q2{}%pDO)>T@>KnX(YSn+x zFB}l%zvWT(hvwZ!&JTk9f!7(YH=9X_wLVa(hVNk3k3!>I*Vm@(F7W$p^6oy_Egmxx zx`!XG7i>QMsN0^iTy&I;8+`Ixir-K)VGgDY_b@;tnm1UybYV$ZA^Gc&c|ZCqmt}U4 z^n#p|Ool7T7;TtMB&bOK^GAu>n`wM6gh>770bBmg9On1^bgOpNO;jR%NAQCpn z5gxOfadm;*Gg*JwX14Z2L{BPQTbgGjtEx^c>pU?{0gPRi^=Up*ChBt<9sxn at XH;d5pMm`Ui0h`HO#9mYHS at JE$UK#T$=^;m+1kinu)I zyK-m8;5EC^_(EzkOjTpuR at a8l&`-%AU^wYDwoX2Wic%EHNmo>6F_jecT`f+ZALtsh zL~*d9RxMr;`UKs`8l)p9 at SU3>G)ZYx<%R&%SS zH2L0Vw8v<>3$wIYYJ!L{;ELNr^)J5I1v(7#(brX(Cr)f9_<8 z*{FQ)rFAX=v%>RW)E%o;+hV>2F)&!&0kV-6m2}Kzf{apKRi<4mrngd<>i57|V0acw z3-Iw_x*Cc0OM@;u3il}fB7)guNUR)r;o zQ(X+&0n7MXM=ES`tk^ih(a4v at jDqnh%iE}I8&XK2ui70A=_ at m6xnr@Td4hTi!+1 at t zShjt;C>uR3p$Tp{ol>s3P_Dk at 5Pi?8rp>Dvo^P^n+N~0lgl!SnKqB0d?I)ERz7)ul zM{#(WCZkjI-Jn7XAG0%18W!JA#(VfLMzV+E_%$TzpsgF2+NkOFLz+5dd at fS#5UiM$ zF at ie~B_|5Xz9EkgpyAU1rpI!oV;tGeD5+UlA()wXQ9se}c;;ZZex#{bJR#$PRUqmUOR00k$g#T-Png~!=dT?LsjzRN+RH}sqrGz4n6 z;)|1iZxDMYI3FZ1B3B at CdYti0Y8+{#|G at _|YtZ2>1~(o|D0G1KLjQk-nf-i*diGz2 z5CI1S#P$CLvwt}|*{S^H3I1t<99n6 at R)u42(zM1g zH?Ym!g-iMS`FGKTu47BsxlX at NVg#n{0o~IO!ULm-fL@>1ozvqS7lpUa{J$)L30g-) zfWX`d`O&z-@(m5vxS~pPC1EVdQww95l-ak;2)vqRjqOYmlhz<&UnUkoK)tc>fEJwk z*WbEQzoz at EqT7Dk7(&i&y)fLYQQJ_}wi`Jk8$*Z9BO0cuy5}ZCXxIeihMZSjJDXPB zV}@_JLAKmpHRtDQrUo6VZuz_cQj)S#0)taHq#5{O~ac|HYcD&Gu7=XFSG_V7nXI4E|u_&{f>DbM{Oe^#MPO1i;{7!e at 7QL;E*m9#nM1 z;GYtIh1lX45yV%*O#J~VLW_Co*7rqta6R_+eJ~h^2MKuwhZ`h!r<9^Pmgr5{t22Sl zz_{B?_2A!n*2C3%Coo1X*|jeD$)ZJ^b{I?!V@`kpxQlPcW{BO%d6JHx(IsgAokez6zIE(5vO38AiW1%Guf at OyB28Sn;ekR5^EI%VaJmy z)kU&z3TP{H^nI>lU&9A>&go_oEWgV7 at pnf0=x-namEbN$V-quCOA9FkWoCVB9;c>N z(~&pA)9_2`+hH0eh#ehK>k8cts6jCo%rsk3&6sJ|jn=)ZVf|X2efM`>OqW~TPZ(?U zH>}nW7y-l?$}1J<_}sqbhbRn}9YO1=89X~f4RLZSR49}zr6#cLu1r`wdB(~T_{lVF zZjQ1l#XJE9*m~vTUBxhc8>)Q_bPMqdu>+vh|6W5NO35fWUOf(~9gf_XKhRbHkpG$RfEdARyUEv|Nh! z*f3$ZC5v~FJ~5O4%FDU(seebsfx3R7*+@=5Lr+$R`;hDun$QM`4F1B3oY_q5%n`)< zA-J9|$r$$y&i+igat~S|2O|gL7e7!IzcD at f;*1u=8+dtENQ6e>L+r*-L{KcC=82Wg zbM_ at RXHH_FS3mSP%UPn;!}lEk#B!qT^l%u*hN@&F-hdJVL_x?3o~5YsEHkW3*v&D(Wuuu)bX z7*Uno*B_5aqA=^gdEnr2piR4YWuKFXVS=em+L1Vs5%EMF(OVm#kVNz{t9U2Cufz^{ zW)u5cv8d`iW at eX^>Hc>J3x#m8WTy+Rr{FQ9H3YS9ME$)IPc%tis)F9f at V_OzWH;e@ zT at WB3TJZnrN=((+%uLwG#mw}do8rWcOk5rQQx>V(DJ(0Z`QPkZSVM{!M%f2Nb-@=7 zNVL%n;*gjdx;94=-j2=Eoo|(1%id|csjw+YvE4(y6~~;qn{8?qHzD%9_B?sbx!BM9 z|M~ht9YAnbqw-7Jl?h0IF&JkZ=Pu|ekhiWOp zA1<@&SW_t2s1$ErpBY;@%tv_TQEnP}eAr*Y({87c+PV1LJu(KB{9TC&y{Fk1;`pZr z^j?h64_CZ>Y>rnyp~!8D$Tgq3U(KQN<9(M2jdqLhPi>SVDmT%|NH%;y6_cB?%(?Ik z8!vS+>g7tUvyR%;_eI54(&v+TP*`cxsgc6aJ|mD%{?rWof&H$D?VZcZ2JZ5ev at iiR zxIWEJtQ2b*@S|tf3F5u%cyP8dp3nWRD;2RxY1QpRw<8}!lp^$%^d4t!qk-fWU0i$} z^zU(DVzxGlPPs-#VM6BVY&FJmg9yVfYPTW$fN9}#_pic~6WsDJhFZG%y5IeBhOrnb zLLlo2r55^8C94aTLMRja94AZ){`^mvmdV7cOJ14s_)XAF*3Wn~UH9mb^GD=L1*f{2 zpD@%t6h|2LNg7ychZr{@v=!pEqm{Z=In%K}I%Ozv97jHL8nCslA(I at c4HCE{E|xR6 zQBP(PlyFzYVn!<^sasI~==m6Fb)$a43t?IE+gBrfcXD>Uf?eg zl9qbP4~DN1`~&)5--m|ItiQ*Kx$v!2XJ3(AUv6DB_XE zZ?C-QXzghtB?oM6xZ!p)gml$K>ZO-hO-b);NSEj}Yi~+Tmja|acME})sn*l^Lo&A_ zaVZ9(ra2G2LQ$lrI#Hw&HrTM*Lx0ulWZOaJ~LSATB`s)rGU zS?e-V&^B|CBI0n7H&|W<-`15E$l|j&%3%(Sd;i^3`NQlN5)^~%qWo at T)A>>Km~mgq zJVuO3nH6_ea{Ek at U_YA^aqVaJ`KEJWK{7#ZOp1nvpTqSft@7xjnI!I+;M$<0ycX4BdXSXSB?lMZt6z9=I3|J zBlcmaY_-Q~2{`43^JvaWlZ1ju>4&kOWF6VsTE7~cl!){%9}X_!etl|l{OEHuo|(QW zj0z{ZPRb{f!*jWjGpkL-e<`Biqf>csDrh at Ban)hOi8ESfGYA=|Ng8Ri4b({)W^}*d zO12qi9WY8RUt2u7PbPMFdsJyoYe=il=gwzOqX{}|KBNl2PV+S}cH+kT$dajIa`kpU zmzN~#1(2GBclDb8&^%(+F9~v5EQ_w58$CS1*_B=tY z;Cgz>F{Y49F)pdFoeLADDfn0qxriW0!+2j&qaiu1jf{?$G?=J}l&A zU7&Amag2zsnlKa|B`)!LW=9Y1kO>_d4$e@&b3 at -9fQ4bGe50UH!y7IMa;SXcV5s)Q zVgdkW2Iobny2Xrdt)_fg{=6oDb7(I4?p z^~GeQe#?u(GgtK`Os5{8m^73)ecP}?kJeOVo*zcU`oiuh85+<+SJ-a}B7`Z?t{Ezz z+Zvgr>JSgWbjP>l%`0^+J+%$icA>sSwzjYzoyZk1XH4g2e*%%oJ6N7nM`c_P336V{ zsUkVqF$a?jVf35TMhIYp0`&d}U)g^3mC|SNYL9>=-Qi1ZZ|p9-{9(g!w$QYHC$mDO zZ8P&qe}WGE5yAuYfh8Q#H(%j_Jh1(Ak2!#p#MYi at n{h&5f39ab at 2s%6l^XlMA%C8VUM4}z}64tI*1@{`(uIQR2 zWg#9JMn712uq}TGtS&K^Ui6-Z{D8;kjXKm##CVm;>1c4=dt`WuR^CFfj?0TUvcE{+ zAaJ9J08;V#yl|lHaD?iWcoVziOkY|U0=u$^;*OC&CdB76Q%0n!c#GR z?TQI&eLJOvQx2uAN8BCDF}*D^ZgX*E0)s at TM^~e3orz|yp!OC z0hq6O9m?r#yL&+Xv_j;%K57LgJuPN;1pTkH+9rK#3H9tpyFsWe5_H#vZcy|-GFJt) z!4#~UVB5D9y8#BNO(F3N#LSUZAQZl`(2=I$a0JDx#?z9 at x`PywUxJcf9k5BA*+iMu zBEpP9h?6|CHQNey+kDC1 at Qasc++OHD{$sd05zwlFBc=-9kzJ4TEBOI~1ixEhWcwj0 zWalZ#5eaG&W8a&U2xq9Z`4(9+bZ`cL$I5=?4*U)t`28ps4BWrX$26ZvcvB%&C3edJ z;kh-WA1L#11FkQWBhwn{2fVdazk0QeGcdo{9;nZ+HV7d9d@(q>-5pu at t|Td*gkZ_4 zAugu0;ypB}UI3_FQA)V6N%XH-#nB5K>-1fv?lGD51cZ5-ZyaN9CKb{HFa}~|SnZST z_uaRo^eU}aft`Vn#WhnwE_~4Bz<3o at 8DLe(9tDRdljpU+L zA0WP~_czBei-IUQS)ezM`6 at 8aqt>TgX0V^QK-$2+Yt!;KpZE|I)N!AR`OjRAGo>09 zeC7I-(j at MOiH7NEnBK^$xNLu?bMx#U&=pWwpx!1hgPpND;5(GR6ZHi>4*a_rW~@S! z?mvuwJpXcErvD9>_>Y^kSXCVb93iwXh(tH1T20y)dq!(a#dVqb!HgDB6qOo86jW4$ zFtZ?=bgiZ3y;KBvg{F+3 z+>uUb6iT8}!_sMcYVbBVbnusOnR_ee3`=F2&An}_4?StLbX#qFQqh+%KN>FjkQ_WU z*e-kaqgcf3ek?(|W2w(B4#P;moky*s!7Z~(M0pr>6aStVbL>6Y1n?d770)qesE;!L z9Nb7&enU_9=nhIqP1M5VtN{43c-6ZIF?r{)r&{EA at Yu&2P1fYzBLZMR$6H^#%5~3v z+=36C2Ap2=ekOA5px1V#$X_7H{k>CU3Qrjl>O)Ugc!1{ zmk|V~Wv&d7R|PkDD|PaemoR1OGF7fg%s!q~m;$JlLQ&0ozrT}uYj@}`(|nnYhxE1| zrrk21XgA0DsE2<#qJukNdo at 2I@9QVvmhfK}&(mFbFeFLV*5e44OHH!EJ<)388?g#y zG{KyesKLF2vUUYBUQJIPX{R~ zLPLY0uq>rOlKp-3(v>oNiLZYf at f+r?JY2#;-h$Fla`1P-YWTKW{#ir$K%Y^ zpRdP5paH5A(gVTCUbz=(yiH>5N$< z^Y#=3B0XFrY6qY(H-Y{uOHD403CnB9VyaH3O)P9B>N26hPMWm&3YvMkx~OF)x-CIp zYr65bRakrF*!D%Kwm|I at OmLQqjH-*yj`N7IA~g(S42hMqoPE9HeA1^#G0n6gP;lQK z*U&U_y_!(kVA!KfoSbx?JoxSwS69J3*D#B`Y!cy{v6AmYrA(!3?@pDxCk{0 at Zkw5N zex1=RR+h?n!(uU}F1Jd}2Lb0FQj+E)X8LfGNqAnBo(9voTnm(BYNX=FIIC{8Y3hEA zuPmLVJJoTrCZ2wY-O9Z;H~3 zrq22&42ZRu`iiUwXW{Y_YtQN7yp~$>&nODvB>f1}(QHLjJPK%3INKL#nwO3iZ{~JE zgC}P>Mcw03FGWI7P!~37P-gOO2=9};j1KsYk_U)l3rehVBBT%e zB_;MnnW39j6zz<(LWi5ITV9mB*lP(Z70Zl5#1Iqa>6eO*(8b<9|E+uCTw$8?4g~}x zO8^AK at V|h}KLOLK1+4*CL;nIZ2NO0ti1m!LvAuwcX4SV2$BNVAWoFawFYiT<0)j)tLZ{;59TL}nszVe-wZwHt#sRw+1fOv<(7pKG97I$^1>oR9LrL)_LSx962;umHXmgz*z{@c z at T_f2yVQl|3mFY;oY!Y498j5EZSbQ%UXg7?q&?tf at z!!vjC3fyZ&Qfy(-bk=Yg4MV zZW_$Xo at u}YP)ML9)^&&M;@h6cuS{)++9+lD#D`1l7KhoMLvT%e5G<+vd?j&N-IAK= z?Bkc~j{U+)U(1tCx(;h4J2u!GJnHLLK3q$v3-c3wY$QoS?pg&yU;a!vd zhz#e!-b6+Hp~|D5yg>JJ56Y=djJ6_a=$LDqHw|ZwJ_kJUnhY+$dwLsC%pZReGi0EC z+Au$jCY9+5AWB4g=t=36L zvjF^1j7#y8jd&h!N`%;Jnt#iZCS;%MVp6%_!qSCOnj%B=f2i^3y66STZERFHIhzg8L{BS_rPc($iE`CA+aixE29fQPK`I~Es-vKRxy0{~>dVzs8 at Pkpv zzM&qG8d$_8{3 at Ifb@Cf&)z}!Jx9Wi&U|&2^6z}v?F7qdWEyp-gejAe5DJtWW_fp%d zx%Sgddb6eaA`6#%InB)UIWf=Wa;#j1&yPGKe45bJVooHTt&cJKkhR$XkJ^}O;n?3= z+=F#DRC72=j$&3M8`AtG181+L?8&kp)fl9A&5eq*Qjt1=AGU4rU4C#TTT zQl?K)lFA+wPfpO)BQrMO%X&gh^_bEb2EEiatMj>6+ybQSbWWPTbI~o@!{7JFEk~k- zX})=V&?86`vR9Y_dQ_05z?{-iyR1G`maW=m55FRbIl46KLGLq)fRdtM> zNr`Iyk#SXWB$Lr4?o=Jq#Ist*cg7ROE_5Gle)DAU4v at 31l=`j`)$y(jD~ox2BEhW; zp0s++;gq8e*dOzrAhE|T(b?@diCNZqhz>2Fqze8^kVdQ%1F{7JLrD^%@OcisSGU-IV^x09uX4?!(7cmKQ#XK(0dKEb+O%x6Q68Ss_y-zP zamB4qzokYQ9CFei7)y at YQ#g$NI+LV3VsI!2n1Ag`Z|K+Loa{- at fBKIv_^1McIj7!w zqu9cvg<$${u+9-_ZbHjQ0-ey4nN($&xo63sWk%WJ at d*AP2PEBFpkv-+bg`n-$0*~_ zoinn0RUJ6Ib;kr$yitCs!A!`DzqLmp14<8ob2RRW7%DuWUaLJbBpk+zX?7w#Dm^)O ziVu1{^P|Qydk6_NSJ)4FO2t(@r@Ic_3Ulo3{0W5boSat&5q(K8rET-Uf6JC6%?|=Zf^CcJLDuc42D*9 z4T1J)OtcT!yvAr>rXN3q^wz-8e=7HZL;1 at X+1Do`6LNQtxv|l at O}Qtb#F=_~=am=4 zdoQK!hH8s;r==+r62G_Vd%XOi*|%?mAP-Q>Ye;(OaGLt$nX!B(B_F5zY*M7^Ul7fI z|4}ifZV0YH>D|5Ub2-2R2<&~@Iq&r_LbYx{{IvS5owXTdwnGSgaY_`cF9QB2TkQC8 zCm+5mQv3`$2WA1m)8}wdKlw#{!A0$ooetN^WQeNP4p_J}ToJME4?|UjB2C6%?o->? zu7sO+Jf)vnfs4Z0R-t1pY0Ifw9z<^-gnNNdG36^w)fuPo(&v^XQTs8C6EeJNtGddf zwqg--xKl_Te8Qqcu`IdgwPnW|A&pZE)pNFBq{IZ9xWPJ4_=OTnpE<&mPh}IA2(+DvMUU+?PF^r}y1i!6_U;qYe#kEJnwNNSz3=2Bgz_7yJ at lYrkMS zfwu`k=x?O}{AqH!w-Ll^)I5Z$dGxb|WcJ|)-z!wM_8%iR2o2TR27-DFSIO87YF-U$ zS`EW&620U<`LIV+Gev^aWjK$G4d$ToQM%*?sjmN)aulBE^&OI>?=OhPyqM_7$-{wndydXwM~ZUBpPxWgfPPn7p^S+R>Hj-4H) zg6-Tn>=Lx96zK-lc6OnaOo0`8R;7~@-%fQKYmbNc$ea)9ia2k^!b79lQmU!^P@>W7dX-y>;?WdS`anUCn5_?d z8*9pv8tgFajP-Q<@{qcD96{oD_E*6O_{58+;Jj7~c|VTOxXScwCzj$0<28T*ZO(sW z^9MmXeles%zjh!os59XCWx?*XrGrZtJwZ5O?33RH}aMj-!UQjfp}rP$H(Yyk)(lzVxsPv|5E8)A}^5nY8k= zWK|tM441_zW6)^fMa&mLuX;;-{Q=mQN at KoP77AJf^d9o{5a9B<^E$(Aaeo^S at CTGA z-W-hC7pKgKJBag63(N=*bKn9%5s`vxC+!IChPjEH#WZr(MAkQm+V5*f9c`#Glp6#E zH((9{*cGGBGwae`{vXobF-)_z*%C}u@=4paZQHggZJU*R(zb2enU%I}XQfqX&U?Dg z>6!0Lcb}_ge(h`j-TRIevEq(c%bj+!`Kolhso8cNL%wv}jZ at c&y{dpa2L3%Q@~XXC zdHI}zaqgY64 at Nwv9HHjTqk+{7FpqvB_uXfh(cpPC5W|`@(PGz288Q)-+g=pPV zq)So*>Y8uI#8b at GyHfbSjsp!Y=C=d0C}X ziD21H&+Ba(ab-!RdNk*?*siiq*;f1#@!yY}Z)R(|hzGtR+YeWXwaCpZ>H-%F#;Jo_n!BrlapJBeA5xcv$y?D zL{wh}3=w1ec;Lor4EH at m@1s;I4PCJ_H#j7(v+oz$D9`HMq1@Ho=5;L9tr)!|maC3t(P(&^g!OUA-FHP$OKTe^YV zBU*bfSnO6a*o25zyQwkg2)|j_T7AB$_w6+8zS>zj?&#%O#l0qB>XCSP=vJ2NZzj7~ zL7LbdB_N#eMzig{$<}UJ%ZbvXc#9~%}*aoMiQ#?c<46)Ch#|26-xgMIE2dP}@alvEXW+kgqb-1MLoOt48w zHP#XCVJRT_g!P#wsF?a}C1DGs at xkW|(EL}>;UQY6y!|(~H8>Cu(f^O2^PePPOEh#n zP}R}C6c)@g&(MtfgYxMu^E>9r)aNo)mZ-F#e`F#JZR$`aS at Ck^jAzQB?dVTp8v4#t z9!uxB(c3S#e1LvYrM+iolv*VTp%8jAykCA^-T1mZDSW>^&-Q^H-IYXQF-TZxDc_+m zRD>V&NXs4iG5Zn$3nLNl5`rd;UC3n+2;u6~nf1_HZH%d?+iUlLL0JG~he_KJ7eEyG z_WF!H&rGSAsa40-8k=@%fzNv5=oOF0#l;M#+2~`mcjzizk$~}eOQ1g7N!xPgL}&3Fz3G93g2dVXTF%fC at abu z;c+luWB&BVe{OC1mz(A3 at q~AQ3Y}VIXi6x!wi=kFW13Iwq$6Jf-S(m3U)xF68rudx z5&!wd4l9?sW0b&k0sF~6RI{+$ini(Yi(Te?Ke;+DY at B>peTv-Uv=T=>Nu+xLuxH1- zG`f(_DRLB at q&%qZ3xv;j*! zn~6t>KUqkyhYw4|C4RJF{r(wyyA<{-(My}4;GLWK2zv+TM^G|Zmf8XiQSWLLx=bul zrjEN#t-T(H_8T7aCCR6Mp7BS_XZnsDg#cC2);HqWrwnav; zrHmRA1i6r=73EB+N*t0mumL}s^}`?JsS9DPf?=%!T&HP`2ZYZ4ZuBfyudy*%Q2)@^=VZ2;=mVWYZ*WDe9(R(S84Hgz>RFn0?HH zXQg|dh!xi41#&l^1Ge>LIvzW|i~aFC9XhaC_Cgc^QStpsg% zIqh#K*Ac-oh}9eXv=vn!foWF1IT--=q+%Yf!9`6>gBnj;eZPZX5=A3|MnV}7s}-N9 zN-`N>s;Hi|O}IMBl~Q(UZG#$3YUCEM$0_Pbg`ONkA}~ zsFj)j;0P-i^!$bo1IA1$d0I%jzftyM$2!4`w|x4SY^>yj-5##Ie7Q|Q&4!4ik0R|7 zex?4_=YP8Tpe=m*wfhgOrojDIV-)}Mukas8YNxs>f#i>13#UgJk0}M#3=c0I4L=6# zC3nw8T2u;7YUX&9d%v=+tyR&!mvUC=ZTVz5UJ0u~9OHxy-Cmv-)S-|G91`sQ=0F2Px>^BEWt%iNo+36)O1&-~2Fq!sI{EDjR2!rj%R>gek{{4o| zEr*t!IO#`YrIqaP*RFK^OsM8byA?;UrdXs*tFwd7gSHj&i?-(?&Y>x!Ka*PP*=koq%xp^U$f4gwT=$s;+&_Rm&6}MR)mz3f#42na)JCXg(@3*CHJ$Z( znSiuO^WZVZLNOOZY$yM at a)T<-F!}xAi|)H3bGGfJXUzG at zWd5{16E=HX4ekHVCP0RPW6Y at NYChS_~Z4gUrA9=_|!iI$@SW;bm( zLvCVnBTs{-5jrCe*YlGO$D~1no~5Qsr?X`*Pp2JA=uLw$a~43!(e0nV?Y|}cNq(=s zPWUvmz~?L&-~5TD?=1fhg}#=yE#^Z*1g`a~-eP z`9$@rDak2t0rrVC9pQ7H4epU_8>3O(k06XVUj6IlwrjGdBlk#*&y`o!~){{V3as&muT;8{tsEWMz5UH)+f`VE{UhO zC?Tji{%uWOuQEPSlu{6;(4%M^OjkUub?y=U6*cDno8;u2uoHli8#DW}LXxz{Ys{v& zi1m!L4cYB5o%G0(`;)M?^h at G$6OA|Eew#47SAwkP7ukv3hN?Tif{%}1obvr`MAmsp zZp-n{EARLxMd?oDq19>Q%lP5;NfHIRkpZm_IUj%S)Zr-*j3&^imT@=ZJM3xlC^x~$ z`K3J18_P&med^e!60UP at qIPOu0IS5!BdBU zycnnHo=-Ey-4<;-G*gxI6eNA$+Xc~5jw2he|o3`fiNJ>Wm|kNO|TVEo at g#{YC{ zHb&jXWl;i+-)59io5Csp0IEaf^>Y+KA)gV2(~e1+i5Vd#hWdeeGm2EHIGQf3RIohn z9&{sPVN|Xx at 4bkpht>{HGZmH3`oYUt607=xstI~NCcTtLQQsS!$MKC|#Nn&l1alJ=2!dd`|{-_6Di z$k|2LRTe8Iz>e!Z`t;dGW`kKVdme8^I2| zYg{Hnz+o=%u)=e4e?WkT{B^=42QkPZX4}&vifhcVTP7NRXv^ag1mS0)sP@=OjYeGd zDB@;C%{4NiyN_r{aJN!#!8kQZFfBj+wzw1l0TiD`3q;|8Z<=no-;ThS^fQdcxqa!@I z3sw%Y8pGO#;rp-u+d{9l7H;lHfhYKcbaU}^%L>Ph)=2NqteFR5TlQSlw_z{5s`GHz z+nd|!W>TFw`EBh2h*DNJU`CRR$N;RDs32YVXkj}cs8d}TR87CooycN5pmn!2QLz?c zdqQ(Nx8R%VZ;4t>?e at _{XO^mATnBMB7K5FKyyWgNxr^b==~0_?W at -`llIv;WEY#dW zEawrY0S^PJvS|ku z)A&2S$_?2vt4zL_cjd4_uvEmlUekr|Xh&itO-$Ket*Z`D3ci0sP~e`BpI=`j(0Y1y z)@uQyD4denJ4cL~cDlT`8|F_-97~&YJTa#~0Txj9rlqkz-g;vfFdYEIGQ7)xly&j! zVeZD9GB0SJfAi#u}~ zRgrOpp$DdzECS6-=&rCsvnRk}t7MaG5(P!;8ZP_thXRRWM**T>s5Tj_!5$1wPfJ!$ zi>~QkDqo at RfB4OmYMv=`pJ^VH)W|KfKtk`|1x`MK=dPVA7kJs#cuVR9c1C?t7l(My zE0>*9msrmkld3`w=|4UY)UHY=jU9ajACX4|i2KfYIx>p%KYnCT{Kzx at K`hb}FiUn` zDkeW|2D1dNp$Mk%7@!K#eNbD*_j5?PyQoQ_<19bqBVs9ulj|>>ah*PSoY9Z`v>f#< zr%@7VD(A6!iSNglFe0z1OfR%{jaVC|L=WJIV+cc?_AaV!y}i}(00z` zlH4g4WF{RmV1Edgs{Ry0PFXo`M#IAIK#u~Wv7*c=HBV$2Zw|mzyY(NwaHcoZf7=UY zSgouEBt z_M6BkF`d#WK`bXke1Kw}s6oh>`A6CwO9buF9yy8xtN~C{s$1rO=8O)7!>?E3zzxMA zzMZ1q4Q3~Kj~;Z$XnO7v85E@>P#QGR#9SObzp5Jhyg|ZFrY29L)OD$vK5H>jpkj&r z&3vMmze*eIXmZiKMu~m8vKHgE#T at 5l&dqIu0gvM%N~Wg}d%4kkT@=hTD3)QCGY4Jg ziN)93*AhbCO-)U|hK3_F4VP+`8cwFb$i_QR*iFGwU9|xNv36Inh>%r|#y1K(=i7AI# zA*!KG)wk9e=h0|1t#TXYxJaflJU+pB+d=7CvlU-~W3>MD>%)36P)pP11gw?UNV$`j zGz&*PK%vdb9=>`6jT-Ms&#yaLjudksR9!>(tcPCeUmhErVC_K zfgPY*Rgsigvfsc}u#}P+sf__Y*oSzck5 zT7!koCn#>*nO-D^%sQDbGZF-c at q3NH2~YE`dZ65z7P at uh&*uIcP-r>_QdtXP4Ywtr zI6}#1X$S9YM)I=O9E5<gqvQV0| zPU0~7hXI{rkAfYv5G2Ac2ZqE(OyDRY at R5{WUU at g%F)^~h&U(Ohscd-=XZla>9 at 37e zF2tH2Y9^j`^XSwDpTBaGSvwTRq$A;FGBIK>%N8Qy*ew$u$siJ7@|G$B*)v*98OW@| z1#!rN7g&VSO)rX_o48Mwow$$BMc&`V(hYSpc?;@GH7H3Y08}(>2hE$f#r9Cj-r0Daohd8}{ipD=QGP2FR+veK*%&^_>5)Ho8K=wXs+@#2%}z!UT`M%2iZxAQoR zof|oo-Z{=Xx}LHBX7f-F-lzJq5Gz|hb$zx+yotdnqxRt15xGro+`@CdZq1!*4ODTa z{rVmU+sS=Nvq2?`@Of$Z(HHrGcDtVY{UaprmK^kxN?ei~psPGl3u+tebJxM2zYZEN zhZ3cnB&v at K*uzD^*&X}Ddy}1u{Xl6p^QaLb0j;8qJ;6ADABoaZKlQ6)wx1xxYTy3>!g60&Fq#k8*iEh@*2 zx^kfb6z#a at Ih~9ubLT+sPi;4ti23zb0gdtye?Hd);EiyY)XNe)p}wq~OllyQzLTBb zs{BRTE;NVyyE}jr<|FI4x=KXeH^@50I(NU!d1z#@hc)^eAj%gj7!mF6nzzj zh0hD^1haB06eYmo9x}GpzeQ;ThAPcPVEDUi62WynRN9qNGp7^$7RPnqF)O!Vxdne` z!@%J(7g(kppQHd{v4 at QjFyKvj+|-r2Z!b`U+uJHlP=BN>F#z*y8^Dr?309NyNaYd> zx6e0Lb3Q<_ew2W;_$*nLsK?13JddqKjkB_y94Bjdw_Umq0p|MiC`&w~fATP7_( zO%PwO%{iq}#9$A$Vz1eiSi)&Jf;LYp$c=C0MgYJZLhPKBI7$ViNz(@c;_fWuj!WC6 zDV)Js!#QG-hQ)cCCT4ogv}OlC(FbP|M-}|brM8q{z%;vEu!+VXbBTV97LOw)V?Y-k zI9eS-Hv(|IhJNXggd>){BYoXu!hFUIb_`?Q3DMT#do1&wAb7Onr~jDtn(=DrgT5vF z*97$}FAhco1_ILcPugHg&-z{LuaA#6cp>;WdDGjuA at C!3K9+=$)CZxxplZ?$LNUG+sc3 zxg#BxhHfsJL)d36be!jEnN%%0*VfJLoa#-|Pnv5lWN at r%KWg!{2QM_3$jjF3e1|UK zy|)31HbN;>) zSGye5Z_?XZACY7?b+3E1Xsi|UIlx&Hv${P;g3;lPOAKV+Y^%WZ64e#5|LdF!d0ZH= za3pIB_0-3`J8aY4>)6m}rH(aVCOi52Aq6oL)Q$BhHySrey;Q-J0CI2+xsKoMeEOGv z4kb;7{Rr*Zi|~wd?DS;k^z9zPsYDQ?9DpfG`=uKr2htRS5N at cw46Tu364>- zf)#*nS^$jFk)lfZ2&^t-ok(Gn>K0tRq}eWp-{YR|o6#-%PUJMT#?Kkv+bV(hwkK?>lP9^(wG9K&W84+Ftgqfcd7lw(1If zH&uPm1=C=UrBMIF at Co*>2QLzefHdTvL-!8&ul$Vvmk00PTSS`weG%3kEX!0nu+Z4A zY7K~jLbjx$n2UnJ*&0oFrPk!60hBzSbB?ariz1E4OM*NP3u} zb*O*U_=O_K4*gRrX73%^fN5(jlh&T$dTO at j3N2)f>MD7~BbUyeH5&8r+`m+%Mnf*Q z;LLxS#3)nGgSBd--*?$rPnVUBa};Tli6- at A#dhZQveEtZK=w*$GCfm$d at 3vR@JO|( zqqFDnUbb<38s#g0&`y-Kt^Eq?AFk^a7+Axkm-I99*xt%K=6T at TNXa$Jh9SW#{t`=K zdU=8(ZANz4ETY7PM4G|pq^b*oNr{cFS7VdWrHjlJJNFOVItN{sOEM$6X at IOWV&e%; z>6l8b?uO`ar9#94m45Mos>WpISCf&tl(^W^X at pVx{K;~EhJL4V%j3X8VlUyK118xC zERjR9D7k|ckXM%5Qu+jAyR6HC3-H`EW#gKb)lFhU^G-oVS(l7(u=GI) z&v-nthnAL-nc8I`y|y1{nX=I|R|&h_d^KAQeAgS>>GfSIhj%wQr_6R0Dd)p?8MFf#1uy->>Xi{tYZaUWj?@lao9H~!)|p9F|_OFS)Dn8W-qh8P;C8q%tW zydxky3*-GAzl*?Wr6vV-D6loU;5o!;P#nkLgo8Rly-TNO!4acq8SNv}9=b_}3eQ_a z#(&EDAj^I&+DDWfKPO%C9pW4`rVLUu5gZn7EHQxS6FJ08E*e2BADiy#>d%3k9RoT3 znrxml_QFt=9LY4^>q^7#6n$z_f8vQzGKj25 at 3S8=BPAq_ at W)$VF*DrUU08zMGRMlSkygbYxRJlZFyf`jewwvCa{V zkxiu3Vn#BTlzPUy0-=r_idjW7tVh7H&`9#PI1Jh0pxJE1n+H;7{AqO_+CP*qnd+or z?{F)X$MsLyY1t0W3*3aVs>5-3Wm;9;t=5DYT>@UB{3kxTe)5+hvf%tT=)XdnTc-db z=|7}z2LS|x?tcqyipJLeJcON{jlBNdojoR1S9MbYZFE*=EVA&wbVDjKfyn$^;;iC zd(9b^)l#$T&pofjEWvBtudg+d!arx9?&tZOn`aE$hjDEi6_Z&#(-sGhIqu$R*BEE|GTEi(ik$ZD8mFfTAhBqMST1nhK$nV%3Ax3 zF*ybjR%>}855H~tbS=YSURR?!GkNyPd~UKvHlQoI+^G6=BL&>edQsB(UHm!$g=Qd81U z1MkW_6huzBFM|7X()-TPy6_Ao-f4f_+xf%?<@Iw(xE;B{5Mj+e@(DW6H?amnzI-I+i+bJ|!Tltpc6YO`Wny^#1C!~%#b z?G4ekgnn-10cAzPWfvVH_&IE35!}j%;86%q`Ey$$awrv+V!kcRQ*i?!X4 at RpAiO7X z!YA(oz^b2`8E;6UBs=ulW=C-fhM3wLZFI7x5FEpX5bpJ$6kZm=l(u^7!3^xmOO>aFET{<~@zD=H;OHPl zWTd5HHJ1iAd)Dh&Qv~#Y%5t8$_3ft`CHP#aKq}5s1~3DBuvoT@;xR za^afsQE4DSWcfly=nk?hDRlPk71O}PU-!aQLU4p1Ac6y!gb%`>5RifI;m zEIJjRU7x2``||og#`e at f@CKd7%TEV#h-UU`^{%BadzT0xkopHfB$z4_pQyr_qiNHX zm at 4*|MMqQ3mmoyB+6wHftVCI5&xRl2l^sX0z$U%Nm$EbEA$L;LMZCxPbkKlQR^ z`7h%F4QrxLxslfDD5_ z%H&5^j;Ev9j+1KM&r+qk`-A9Dk>i1zuozZKdMU)n4)`%As>c-|wH3aK8wsorEk##pn616QN`0qF&9aA zTR&tGt_G4mAa0<7y4%I7@&JJj?Q*mpkM?@~?1`(0#GFLCAUMmAcL3>*G768q_29Vu zZRD97`D|;rGVkBgNs7`kGvtZRjM>#m?o5{hik;t|plvc7zY%FhXDPlM;eNIE8#1b9 zGj(dlY`GmIax{2jg$AOv2G8I_6jPA;hjfPJL)Cq!RT_L6Lho^+A1JE6Xvw~4k#^T5 z{3ZhGdEruH#t_B0*q3z|$K~feah>;Z)9r-{-u|av{^+#sA>}_&Mu-9eBKZF&(*C2l zzv+UzjQx!--AZDG&l{WcA|X<5V>;eI#2h-5W^4v1LUd~RKKrvF+HBcPU{aKY2Y;@R#TqjCis-i}6~$_CzSK}0&5 zXboxa&@&rl2tKpAMcmwXzmwnilgBB4 at WkqS1|Z(Q37f~~?bhFi6?$?-x`64P04CE{ z^+ogj?~{AWEh1~J%*+98hD01DGn<{duHhSM()e6Fn}T9=`->xuLPe6zu08 at T@8hZx zsU?Gwl&88E4C$dW7ZBc*O|N?90(p6D(EvLauPls7l9Q=ot2~Yq`$af7Rq;u7mpANG zJSMwEd=#$4t?W}BCiPsmSy(ZNdzS^PMUK*_jwGOqnxGZ-rK~`eZd0ep{d!+?Jti2A zbR5olcTtyDSnOe|9T#b;0Tq_m)h^o9jI;jH^^8o{q=ihYBu9yRK;cZsS&hnWCYgv5 z0yoww9`y#9-Bjj}B-@<=Uhf%4c#E~xzqQwyURhfTh50*S^vorHq?_wQfu;Q2hf;(tFaC6I5I-(MjzCE(G9dcGH7qmrU5h zEvXi+ at JKN9NwMSp<;WfE&sU|J>y4G9p2b%=JTIkRW}{rKnJq=Ba29f4OF;aS)6~go zvGLc;4mWQcGpE{V?Wm#I=IZjyj1;FLdSl6p%eWp`Tfip4bzxPJ zcX96C>OCNPkFmi80*8YP(m7J~U;iFkOIF7OrsrxQ33-I7U^3styM6Q{Pl^eQqnNVaHdUe z=P&EpjV5zbvQA}D`=7tLwwV&KDq at OvMdVw~+ltR~2$G!HfWp{YpXkltksQTf-=t at 1 zYE)>Q3ZLQb23VE7`hyjrfvNw5wKVxf at +!xjnuOOH at oQv@_`zF$UrWF!~UaI=!z} z3-r>oEDz+-chh_DpofBxEy>Qh0$bKO=vHM8`~L7Lu{`G@#3C$GQ>V(X!Dcw=FqNSj zX$0wQzX|q}KJ~j at iI3c*Lsv=gmAEt1=EfWZ1#~Yp%z>ZpUYGer?Ey6v&G*HhjOzBj zArJx*`~t-7d8sK{VL at B_k^+I|a>f&3m&f^{pk}pJDZ!hxE<~O$@7$gnqZ`L2HP7`N zY4xQH1^XziHTlfY*M=}7yU^DbYV&z%{Z}fET_4btbFGl}X+e{El4x7l8}q7Sh7vE7 zg!{r0?Lk*yNmhM)PsL_law)%`#(r~*qr8ro>=G+&j~M2o8yV6|5#tkeawM)!oTFnmFbH(Sx$_R&Fx!!lh^i0 z8Ij8Vx=ww1)|^A2+HgXzL~SlA+id$1Qr~ZZz%Wo%qWBiZexo$IH&pZd-VxjPLM>JE zR5x?4qiH%%wbYM_wyvg!UN<8f6YD`*qaC;)qFr7ap=XZFEC0PM*_B7*x%--ANy1l- zQU;uhDIrd_kEqV)4 at qlCtF1+$Dkz&@M=4l88|GknnK+J{*pgD7Awq$MfzK>2O5Bne zc$A8Se2BEeLXY91%Vc73FYk9l=U3j at BT<@|huKvo;L0t+nO at cAUXcl&Ov=_sgi0pk zy}2XQRGjgHFG8Eid#!1G8&O)-6omNIo5(3qx%lmHjy97tHsOY_I=>htsHr%DVL7gBLNZf9mX88+QXQ1tTng9Co z)Q5st)T^sJ>&G_p&=yoMi4!DKaaW?|AFAhhjgg{YmzC>wl_1&5(-!)#VKe9<)UM?8 zWBHMT2%Ajq^;cBX$S_y}BMFgMqxRs= zASxg_nb<9jIa)WSD431$Ivf7*_1id7j}9~s>s89n^ebSxGb2y-b$r at i@^MSq_srS_ zp-GL3D6?yO$IhdkBQ)10h2xx9!_{VUvW6(1hXbtQL44r=13@*$d&#j2VLBZ2VG1T1 z8bz(}ufukEWRJ1Ue5?kF#B6R**_qsY%2)6}2Z$d`!X{V;8|Ce?y(GRU8AE=Jh&u7q z;hW;y4-uNms<y*LLy>9iC7WD{p2vkNI|z%2ld!V3ES vpbaKhUEzbbU1KY;0`K3TiN6 zuHJfBRwh)a}V>SB*^epInuBxbNBWZ7P0T~ z(Bp+4 at z?EP+)EM}{qMXxOoFeGRH{RNwUK52%Noc at A8@MX!+{7N#eqM2|jGs;P|rl_stAw_k at p)a1cZJ z`2vkUh2#*mz1#HUTu<*bKJ$Nn*hw$4ka*8s zvZ9Ra)bChkD$6zjP>7WlF(M@@eG2Du>kZ@=rIxB!fH0L^wz;X6-KvUOz;#v0jX_|C z;*C8=O*^r?U6;g^B8Jk*Z^F6 at gEnpG zF{j2YN8b(pfmA7Z?huG^y>JLqxQo0cC1smRJn{`uIqGD(=ud08;2pg)PMny&Im!i- z+;GmK+wCNkn1*bqO at bXIei%{~z=*cW9%ZSiPWL>A+W1*+pVY2bN$$OwWHg``m5`ZT zYRT!OP!{)=YHC_XaI-W964>)t)6%+WG<{jI)A?+jsJwdIu)-u=!{7+^M-w7AiNniW zmrYE`CInjhJiQ7b6jL1C&ik3HI~8>%_FzUB3d_yISc~`QgwXIQy-qImv)Rqz5w8mylpjeI)s@=Z zV3wcMzA>d6uXMX;lnwIs!l4zmZ!ek?5&62hgEVk3Gv{cg!7ufdO{&_xM%u&4GN;M5 zjbOzm+$gT|1?zMFIQA-Q%%-srA>rVqZHLVI0IFq-BpI>aaF{5{& z7s2GCsH6w`jkb9Zz^Uj|G{t$jd=6*zZwETIsI4$iQPdmmX%t?zZ5~fuq(d*dq6$=04BvoRXSu(0W%s7z}PbwFSz1(d1zO?|-f(Z){ojJ+T;+}?7 zhg}B;d9lc6EFqK>A13q6AKK(p&2v$S{(_ at D14i4Oev%>!%_&w$x)YgN?x@{gUIh;I zk*iM$}ze!zYE>n>uTA8-5wyTGr)Bnky}Ky>{#YNbivJp|}i{4gzBDKH^QfSpZj7hO(gC$_kj_n5pvIGieV42i!4(s=hB-t+wnD8tG~rroPeVw?XoQA}8#vu1kRK8Cj_S`D$)0C#j&y^m#_M~vld%m*dtnBAE~kg4$T(9t=zop@$i^MaQ?)9Kutd zLMNwbElNuJLv7qkBQqQX*n&tT!KgG&pi&*`piwaHBf+Th#6hGrj-Z(s_M(Awl==B- zD#xhU6H#$G=+9wZL6TZg2qsy9nwiYTGyfBGQhh6$v#LGj7=Kh39a%}7JdjMIzKm8~ znYxQ1qhc{{XHYc|pPuAb&xtcQkyL`gij zT}xc>W^h}Kkt19}T`wrE@&y`^a1aJP?>D8oFYI%bXF%BOo-jIM0vcbCBzE^A4S`9g zFad!@E2XC=ilTD1JWXtvUI7{2)_JMVp8+#MB(Lpllop*r=_cOLqpkT!V<%E$Es4C` za)eBbl8nNqk;x}l+ihvg!y0-Y9uNBx_bOwtuOsJrrlxsQIyjccPb+4LV^Vt5GQT5Q z{m at H|NlCb!D)NW(Sgzs3bvrKjjb^1ff{j(I8)=F1-z?AeCk%KJ1^P|i)E#1gB;Eb# ztTczx9fyw($-+hF at AO&}98*~XsVFPrU>9s&VQ!yIt&EkT$=PJPZLpzUbf0Ck1^ae= zv%kqprJM!TRt6^&Ap- at veKMplysGc{eCy~xyeLy+(6On1ArR%0FEZWAqgE;&vg@%* z@`^75E6*`LL7*b33D1^Sd&K2rqg-k1)t<~c?k^RkbP15T9&5-+QrFEafoLn#7pY1NnkNCCCz++atMCy6uf~G=T`5x);|H z at Qp~tnd!k^mZH26t#i5tZF9F1TLXIg z68sqz_h9LS1)la~-pc38SiJB1x`j=zaD<+M at 8h(6 at P812w(i9rox8W=jB%a(WnJxl z1t0TLQi1>bC{pIsDj!-kW;>Q~6+qu4IdSP`%0a5 at e9|=a8^l at L)ID-cfLf&`;^&^V z_qD7p%;F*jeu1Gi)G1ul3f??tQm+`U}1OC7-DwNHyJE}v-&jIY=9_)Hm&)d z&eZTeS_^sjekNN>H%b~!#hv5Qw&;kXsw(9&GEZey-Ge<9H)VX1AM7GniS2J9SPyiQ zw-1w&(P-6lCtncOML?$H4)|(Prv}S4G{ymy-9CKzFte3bM$H6sw1uX0xYx)}ixMo| zG~?>y-~MS$DJ=_Y6N~vaV^(Nz*#p&TlO+WYUafyaYXE9bCNncex)#CTMBdp#R>LG) zk;_Zo)uUI`1xgni+O!@@QWwC!;cW*aPPs(qn`hpqRvsVjoGTciCTHW z7Mn$U_0}M8m44v^iyxZtsJ06GL?_px25q)y-sVQz?6-;`CHi=}$lR at dQID)@PL5!I{3i*bUjYrW0 zKeqyK7v-qkv-5FF zBfHeX^ec5ECOG!!QKCNRFyZ>?tAZs+Lrlj at lItyt*?CpmxjmK`{*+$bUo}g}*N3e& zCK%Uchpe^D-{5<81 at HVhjX{-y%ZYZO<>q^D;8OB}mA#y%!?ZMX!ubOOJLjB9hwkd3 z)mq|wY^4Tmot^fVj>v*?hELG95d*~(3Hb;bwKCio7+xTw7YrwkH$9N}1S#c$es#}# zt8kF1cym(-y_e(Q#98^{X2eIOaG>;8-BvlqXx($54Wcerq5GCNz~k_)gl)cXi8t2fDQ$dC<-y&0x at os9C4vUT06?)1c5uGY>UBJ zD2gYV){f2pK!7|-t_E-F1$8o3J}r!C_BLsi8YQa~fvB`#$|Z-%mL&8}B>Y?Lxt%(t zXfxGmE#;0l17sSF$WP3VQh*O-!Y2ynRptmSnuFxP at BR+k(B(T^t%>^B_g$~Zw|!Qg z-Cgg^wuLO?T08bA$EwV$rtNgT>{Z~I?N_#W1-Y10${hcUa-w(YN{n1`7KL-F6y7#; z&s_VQ?vCl4=WpHnx27~-+>)dOq=zE+N~Eo5MIT#T!Sn7Pu|0NerfVFX4*$G=s at auh zb%nJ at b%WdaI>qfNBRavWwp^2?B+MT$(%EO8 z_xo)8#WUn#cfu{td76kOSLN|k)4$TVXj(G3`}?;s69ah~^YkjJ>yF$vBTVDgjXLYv zR(nmZZ}OJY_4Qtvrhn)^--JD~z<&#agMef}f`G98A2}=h52=V8HC+c>akQ at ygUtr* z%wqBadC`KB;@-XLoYYpfi2g{NdNlM37%wVCREs0Ib=h@&%oM0x&jXmd5k?^qFJY1Z z&pq^rU;Tujz1R+mXj!uJ)_=0OT~2s+J1)Q8-W3JGEsJ!8u_w*s`dMWs>8 at Zk99x2H zJO?dTW!sepvcN*su3u&Lrl546k44X3S at 1k>uC_HlUDfwKwvE!yg&qgOc;;O%fkw#_ zYLZ4Ib35mfft=xmfpvV9!f4+25y5S|olV%oyfo5oTttPaV at IN(^Qh at O@#Fmx&9kS& z?D*%+q;us8d-GYQRaYpsu0GzfVdpbUYpQoMR9TC<%7$-UEGy=D*f|eENiCd#Zi4rI zh29>^KTjvyF(E{C)9lPDnM!=o%bAXkU&{gs`8@&tSL;fv?)G)=09Qd+)e3p`Kb42t zE7vf|?<`xZ?<_4|@|KBnbU$eh17&{PFXPDi$WY#x4{s-rkJ;w8J`yFLF;Ohpa>gDP zC1pcw8DLd<4yH*Lj-7tCY_^SnyMGZcCOM{!g7GPIHsZq{_HHbdI$BVwS*$~#TYgRY z_WX6~ME-%;e#m~%8DVVb`xy~9{#O;L)B|*0wdKYbqfJlkHaki+-JLo33`HZRTWcUQ z%FR`;J5+qcuT&%Tw)OY)w=QbzQgH(3BL82_s^7zXh$e5-iqVFyC{)-kTmKhl?-- at o zx?~GyW~FW0wr$(CZC6&M-n4Dowr$(C&AR(^-`m}1e|_)yM*mr3jkW&9jCf`|F=tfp zu|SJG%_+WL9?$Oi-rqEi$!5I76asE=i(rQI+6k$7RcU6#io#;S zHbCpZHZao1b#8ym76Z26n>k`Ue1Y?hU0gNHKzWFOvr}+O5`OV?6RUF=|Ht)6ej%IH zOZ6QZ?Buo~^YuMuCmM at kEu9u+$b at b^vb~>D!^z**pwI2tDUhqt4&2R~F7`r(cWU7Q zS%2EICAz`-ZW*lJr at zB(G6N;;?pis$0Yr*BWW+Rlxz#=}iXMY`*F`}K-L_Q5lP&PV z)Ul1J@*1jg6H}djz}a!_x|&gs#KxV~{8Z(n+6keiz$%$co2D_ at 38jWh<=5Y4JWslV z1p7dMfZW0V^)}3ZL!^jbHPKv6>cZdOg!Q`bQ%*SrmHwTnaV z%nhKViZ!Gr4d8uk-ol^ozsfde0R0u-)2kr|6ooKs at hj13y4beV3g@HtWHK#{WoOdY z<@qItKmd5sNGveAGujB%H8nME1VTA|$&%`v(nx-&Q~o at J8o$i5lJHE^FPBhdtp&a+ z-=yuySc^41*+LDkxm0lD*lh(`IED&yl`6rUarNL^RZ6JLI6}ORUUbVy4EZm at IOUXz zhq_bmeX6Oi)e2k_Lj2gGMR-H+lmamU%|7YJ;33c0B14ua7F92!);hsHAfDvKGhb|2 zNNhW?*2GIcLuaO3Tmu9h3AbXVpN755GC%o}Hn)h2mdHsxcHFe*YnyHKgyXCZz$G6s z$E=le7ag2T*Mq(hUsYT%3CY}#vqUy(3vE1mFlsLUNEFfuO_qMH40O(uz at t$UxTWRE zy(Xw#7w_ezLEJ{pqhFBwsS}hvwcKVq;yIE|hF{lmydHhqrt at ncfKN%~Zm<_58(Z?A z-XDpV#c;PxmmXVlFy0?SQ~hqfmu6FyalH%=++I?r%)r=3|4f&WX^8-OZs4Hf!Ms`` zVy6vG>3|^rjC-J9JKAkOaeIKR;llAW*^VVg-yv+cdDX139d^^lyPIvUwzYzAhh#(T zdIKM3)%s8-_xR8I{DG_0sT0gS0XS)>Pku)BdC_U2bjcBGEU(}WWOb}rV&TtvDLHZj zPXG9vH-ISrFW4j09~6>)QJ*80OJfL{1wZky&IqztTEi~{NzI_>{KMEcOl at W2=&2;a z-NSqYJ08c;A?e=mF!+Vk_z&U-`G*bnP|s5^ePiRn^mBep5BF+OYbA5dnP)`Wm9>Jk zEL0 at +W~uM#RDm}7?qLAr^S)qO+~MUT_E at 34Tfi(t{j_1|*8&%LD;5jF3_)BL at MAb$#@kq;Yv&ST z%wZTZwI*t5HCv-N9W{8mW;*HarfMQCKz4p5=Vnb?P!2ClPix!^oszPKmRg%D=A;U9 za*>8}FhlYWS~IN^@RoO4X^D3kSerAJqRbpA^8}(~4Krn4#n@=g3bmG?j=mP#a9DKJ zu#Jq(B<~%_;ZKfvlT!w0=#Be8${Na+ at mO6q+`VJFYp;N90iLMB(nZ_r(gV4U1_eQFl*e at BFUn-6OX>st$SIkomNJ_8OOo;{4 at _ zDm&>ZEYCq8fWn^#RvtWAc0(L5juJWb3@^ajbOqxf#sdt at ud>OCb9j#@ucPE|Gy?I$ z`g95uAS`4tH5VCUv2zoAuCletX;Vy{8l_rl^{nJgr|gMA60iy at s~ zOH@{XZdja=i_L1K8U7k6Ns@%tAR#+^ia0?Bvk2 at mUEU<*oG+L^2r at BA+y30;{NbZbN)xV|hG6 zYk2~~W{EsXz$iSixO>Vae$pS|q3(TXG5ZiJ%wb4GPa~bHGXPR#bKbCaX*W8xSZVCC zo45TgdDmPa^rD=JvH;>QyX(J*^&tFQ(}wX9TIU~hMk&B5c*0!sXsW*CwPyiyiEq^i zV at WYW-*YtDCoU?hh@?!qKM$N0_%--^BZt3FqR-;AWoRTDsocI_ZE;+l+DXQvtXJxA zlVLTIbl3rPQY%_x-{15oJYy{j(Xc>3-sJ!4g6F?O$G^j&OAEsHACnaVI`y`1xIEL0 zSksP~h7<0YLzc$ExFf%Nu?C~Za$_TWn-NH}+IWVb8o{9HT$Qygr8MapgPN^iSUCZT z(0HylT`${#*X&>29wiN=GWDqQ#}@xsmG#p7_4DR~KId~LLE(ocmAcxlQzTd&_DJAq zuP4}4HsrokCgeVqFJWlOoshl{z+#4ZGsN at N5r_b4zrZs(kAHYzn6sRDB4O6uUCB{1mH^<$l&-yBjA;~dw5_a at D;pUOXw1D$zgBf z^BwQ_x@TZuec8&SDwQ7$#PHQit35YZ&{>o%^skK%* z*)GS at Yb<$fD~0jkdI+ouWqH#AtNGv=Qj|4P$4{QXN|e&mrI7vdEJi55HPu_ZpL!R| z3whWw%(FFV$@YUDK^#z_5n$!*k*#JGP8|kOwc!Mm0U;6OWVaD5y7kNCv0zt><()q1mKkkaGCvVsW*KTt68WQ7HiNQqBV#|IYfZ@?61^VYdYNAbjp z5u0ymz}uVyF=0eUiGs1SKj{`-Yitw*HFQmcMwOCJwA*{Q;4h|GSJy^em!dE1v(qrp z at Po`B#98*wza$V3+50Q+OB%|d at Ig}~FDeMeAXq{)!$VI>qZwXwSDcQvA2X(Ht4|S4 znWv;TG9Wf0fAHd6ju!n;rjap5=c{Bl zdu&>Y0Jq>GuRa=$h{8j|xn`a% z>XfVZguc;2ny<8yR^b{Ey_PBG7IjE#XFT{VwAC1T#v=KPE5CPVk at jm_LMw;xC%PWQ zJ!hNk+wW;FPGOiMqu_At%-+!v*`AY3bW*o_HHxy4JY$|1D+kNMUD z8q26AoZS_Bj1X)NuUYD^-=80!=1i0%cGkx>E;2k@)_|2BIk^IkZfR#z7~o1myqTo( zsI4Qd%{_b#2WQQ+B_ksXyDU?n>Sds65 zy9*w+f>8v6YuV+}M|enT8wnR(71x=La^L)9?5AGG>vHUYAj z<*?Y!gx9L0MAfF{SQhFtFiamdE3u<*JnpTvxu?`Y{8F#{AKED^X8p05^}ZnnMHD(uGn{V}+^C zbKpyoq79Y9Xf&Z2juI>DO=~w%Pea3owJVaTNLL_P6U$s{m7SSTP>phSDb=bKi8f5a zV$8|T5s1A8XrFMuG#uITq3QbtP%~rTfIn6GdTwukz6*9qi at b?YH_4?@ZHL&!5}|Vf zQg(}=kyjPI6Xgzn-_o?oCnE79DT;D!d1xwS5^%&jm8En at s!|eDQlsUCmj6yI4z*S) z2tCV}MrvXm0KTMfAB1i1xZf&I-24H?Q6o=S5JHs}lX63?5jPpjw% zbNO4dG*rx(N#^x8G4>!bxk!U}dRS4bFw(?e8c0gDblqpLp)jH{;q8HzN*!V%Bl zis#Vrbe6`m$MfYWd54PGVlqRF`58kBYOEraBsiS(vbd_sfiJ;P)a at c`k7c;%WElt3 zyv1k-yU&|Xdv$rR%5O;9^mY%1pjZR9%BBKL8C0cVR`XXi at -Eks@_kXPJ$=RAzt_CO%15m^e+qC#)$XETIynsQ=sm5tfU{p@{13R{& z#JrTF-Kja1oRmrgOs!qn+DzH4m6Cns;m6vr%4D_ at R-BzJwCtBNy#<@;lP`CV7OgsU zoS)RRHsYVSa$&B$u_;{I6q*{J?TW>(wtrtQ>r0zzM(B18)wcPQt<|$7uFbBPRx2@) zE4ihMK%E2vV(Q7?bVTso(tfyF42G0K#}d%0jR|#+N at f$nOPibnf73Ikb%2ObMmY_a zIu7^`RMH}|(MENe**Fm?Nm6<|*!8iv#jyu3g*H1Zul(Mstn(D}vodOo#-r7bdUR3qHSTcT1U=xy^~?BD!=&(FM&`dNEY%?ln6h1-}Hy>W~3l1KJ at 67^-AprRHI z)lohz#Sw`fXE%r;a5L(}{DNv+$L=DnErdO+uovACtP3EPWEA0jezGb{9W%SYW$nAT z<(b?zO%jCs!ZkC2oV9twq{hF)q)8}EE at 4zXVNwm5s8zXMF~V@~fSoEX`O&l$xPD-D z=8SC+NpqUD7K$his77dtB=Ur8Nb|FVO`@9-#1dJmlGvr;O7EM*9*Yzy-Zm-5*Dz+d zVu1+{s(8`N^o+fV7 zjfx^yJ3#T$N}MFSV)UlO*#w--t$jnA;PMo5?N8J#)IoI4Ns4;Zh3U6j|`h2*S_oV^zG?Qk2?- z&V&r(jGh9bpWbZY=>woxhO|O0rHuQNWhM;-(|i$nK|~rCFJ=0nEJ~9`svSm?zWcni zv`Y4P*k#SW$u#K*%g&-=!J~qxp&+cARotMY%@Z5ZOB>RADGQQRRKzw0Hxs#R|FTm-SsK(d?O25y8?A zTq!Qgn^gI6(>1L!aAD<+v%Nd-o$dH>T8306mQu&lj61N;#2RS=rB!-|_(>NNX;Rk7 zGF)p5YZ1R->#lxoS!4w})mUHDbOjY8?TBElvoSokPd-PI>JC!X at p{F%PA;nT8z_n+ z?v=v?e9e+x%Ywhmkn7C#2UUO=ERxBD6TE$iBz at jek!L~12b+Rzl&DVv%`@mHK7wBi zM9)@W&w$EM7Ap^dgS(m&QQtTvBp=}Dkpu87yS0;TJTWfSTqzsz+9G-A(Kb4j7o!8{k^(wFjFl;4zMEvY7 zpqnv%BFdCWGkh{X&QrUea~!Snr1?7Bplx=qkX3#>-X_RPKG0-A;)|9;NRYcJUgJX@ zd5O2X88F^daN7vX#$+k&?}!;Rq=54Q307f-pw_vHd-+n~l%-C8Q8Alv(k}u}UmKNgsiF|%We-2T^1KFA7cT;<-I0Y_UAfdbL z(Ge`cI0)tWjX6CZIM$?b4RI%5v#hv at CY5?x>X{-l;%-xi9U_kd*Whd7 zspM`g|E6}JRB>0j)Vk>TY_Cm|)KH-RR at AB}1 at C^C?0R*U(3l`_FYgTQJa(j at E0+7t81Y*Am z8Wk-irh09u at Ibt6vKsHe1EYHXsRmRdb({^fKBcAwq(c%7PsWjOoKdN5$5F8vn(dq; z-WDo-U^5x02XykbSy~d?2CT0VwxdMVTC3&7ntl|WNXwLq+)~02iC6Y9Li#4PHa8&WV zdCU-Q&gXNme#E>2J>@Pv9Y at +^%z+o!!*13EvB69y*$OD_WE{X|k5!5_)9lETg)8tZ z+vCTl9JTTc#-fJED+cZB^n&}sG(PRo#Q?mzF*846Ceytx&HvfTT(dbd*R&FV-QJpZ zby*brU;A?_yvxZ9c@#rx1Tq4*PyWgKXRGFbca^oN`G>f`ih7MXFRZ8K(9Y zo|Hu8vLAP42)zTF+56q2c1iq!(zsQ$9!U)G5_MTfy-TW0fQ!9K69{xx8>p8+wgL7< zUW+hE{&Z!#8!VCXG9ko-Ga%ElQ$c=|>X-E7Ha*2w)AB>vLGmVu0#(S%&SiKE6z?;6 zRFm(G{zg}MYNVY_E)1<~$|XJK<%tnO5K at 4d#~h9M`=yPJ9EK*#4V(GqzPqvE)*!rj`0dx!D>_S z1?xBXpKtZ$FTvDKt@(95B#M5)s$ zDR~0u8``=~S=^7vLzE~&RX--i{dW}Aq!_4#8>o;jrBgaZe-n at n%q2twWE}+E0jQ+vVW>>k;w8tC5rq`Zy>5O566X= zHHQ}diX|PG^$Tyxr^FrZU%26dix8VvqTrI8>cIKj+6Jkyl!n7Esowdm4BFQ21?oP{L)z$(Gj6lO3vQdkFl*QHkH<-$QbtvA zMTFD_qjZ(B%s0rcN7p#SqB}0_H^F5Ycj7NNU2Yek83oUmJ(-!bf$pEL0tp)tOz+~m z1vf13{1o9BoG~ewB}rB^pi?D4E~Zk3B;waXl|Rrt6bIm~gA|hot-=-XOks41KnEU+ zdU{{R;`TW(4ALGu!D`P;@Mt2(p?%_(OVzGweN6dG3s9GHxI}vcDI)y=LJ0iayhJEu z#F6P^Xie^15>dwB4X9kpdl5X{6Y|Fitoa*84;obbA`-I7teF$VfhzA0thIO-+x0S z3<{T(_+N-j{|k}a{}V+1M<1?AUCLoW5%F6;p4{pj9ecjEu at OvIYM#uDCKw2#%Ijjp};Z0=3 at 82MteIbH?{*EZd75q>Nc_kcL;5bSb zPkv0#8(o)MQyp4k8NTExA7b1Myyc!_lB{T-o+>BTL8thmOX)|05tJ8RFEk(WvOc&+ zy&k=qEzY)MC;e-|cCNh7*Jy;=v}I#GQK?Pe0`oqUP0Jy%dZiiCC(kj1NN8i}(3oSM z=f^3t|E%W&si|`(keAN at Q-j=1 zAot=c=;V4;eg2jO{Wp;t4cG^N+hw(`xi@}0Ogfc4nsQCR79L6t(ke1QQO;1RpIIIA z{Rc`M<8M9KHpYeI*kOFAlse))NM|VBxZ3avWN1q0OcB_UZ!;vU=wRAZKn}*lGTBzT z?cF?F!a_+=b$IncDcKRc#&tE$v$qWGsA$X23wHFEZD${t7yxznFd+?eOXcR}CGEhm zLo?IiNXds;xUfcPo$v zq9u6Baf23*enRC58&!915Dx1nawf=x%0%XiPM z7&ejpN;YKXlM=uu#a}534S$8PwSDdKad~}}{k5`#K=7kAbVf{ezdn?^+O(D*0A*`> z3$L>?MI0uFq;ZFzfPMMkhfcC;JkMs{I$ek$3bHero7UI-d#>5s5^rb;RF>^Iu?DT} zeg&AR$wHomol2Tak5l7Eo^9m_7K(r^LT=fut{7ZKZ=l;A4Bh1mn at ek&&! zTt|7m+L<>u-SWL~st!oHHFaVtwwe~zc^5KuXB(>7G)9chOT~NBwuxz_c9I{_wb`0& z$G)i9+%o}*Kh*EFjY}puTad3gs?#7|4T+)n2)1+k>ns-e+>^>uosWa>rfk(>b(%ll zBga{F!+vEZQqGE}$pQ<^63C(XawE|qi@=JV>7t1tmVatb47cQrxNqC|(K{_kK9F*; zWXxR%bC-3R(Vybh)ZXo_X~2^Y!9n{GZQSD4;PQH9rOl_a#O}&Yj`E|y(Vs~&wJ!wg zQnEEn2jm_JgOn(w^Y at z(xu7sG1zBgPF*t!#Yg7yw?LmO(jf+x0MJw4JStsqDiZA&d zTj#WI4o2c&}*m3eQPONY3RdXg=%WH5-6_V%G#eQvOZ906*hA?+5 zSl#^(B4(m^x#GvJ2VvQ_sdg${pX1})Od<$}(f9mhkq$}12?;1c_#}XD^m}y-Z3i>tcFhq35_ at MdbsiNF z;)V) zOC*={yr=*D;{ZbDbBnR-vd!n=ti6Jd&BL`{;e)R8s>)_D^%DE+B=-A#M)<#4+5aQk zh&5t+;(-AHg~R_Vcewvcw)rn!rW!hbB^uOkQwpbpP~FQxayjWAg<&ogD7lI34aj>$$GjbtPJO%aN4e#o<2 at qm)&)OolLC-OcvFwAiWAxTui0Du at akGF1>ivo&Dx) zu57It)y0KgQbT at 8%}1&?ST@$oCsaiTg!^7R4fl+uyuDt(A{o_1h1#kyffBpE&`zp& zynAa3-bbQIa)Tv55i1+0F83llZH06~S#r-;2ek6;H=Z-~QAk&ZLC7 at Tj42-pO&=y# zfJ7K4j0Q2wk}lF&@f5eUDs at Vkw63k(Jk44~kzRc_r<;mkU}vtJ&zJXG%z>hx(uSQOd{_~44QAv6IKDbGk@ z5Y~LH7Ewek2wr56t8)~*-v>*E`1uY=M-Taq`kq+5j=Vo;=(ZR%lV>@KlyJemuxypN zGDQTJMk+bJ%bfagHc^eEFu${4)aL at wrEd}?faHD^gcjst-{gmtWi>%J-a|SOZWc8& zGXt|~>on2$hTKHG$2|-(unNDur+>iDEuDMwacCG{jr*bmhd+S%)r^@>z<~7Fzzz09 z`v<$&p4xu*!-a>=#niqmzP6DSikRS*i ztDnLF!s$Sa=_>`V9FIvf6mK94kO3F!YPi1y*ew<%mz-5d+7&oA{sT(X0bGe1imeZXT#1OgBf? zJxKmLW4i=!ck(`@^PccCE-4F{@`e8L>jeqNuIEaA{*PzG&S#0E#0&Dbn2hoWhysEN zCX|`6f7TEIK_i6z51wNffS`~GQ;beV-NV)hdix~jDPJk>Zl7M`MyS^s at RbC7$9WgN zF)G&f>_|GJpq#YcfkV$8B6V=AXdAz4R`vG~Q*=Y^ zT2?(>CE#Z#BB@)$tp at ziD+x?L#dfG9esX&`A!I&%} z?oiEqjK()4JonCq^!~0D^Jefl>k_Vz6oHNJ#zcMB2wk@!z1zWliGvmXxiVeVH`VpM zI;oV!!yBRMXsbV>w$jg*KH|lFx`O(p;ER6u_nye7Pp4 at IFc6UEU*|lD|4G(WHnKN$ zuoE&dF>`VG&kS6oqW5pz!j>U>opL&~+aChZzy$&Jp0`3RR>IWc2~p(2o;mgu6RZnZ z4LoFf7H_8ef&Z8hYTXFd#uf?Zz1(Esu$a!|@wmAW5cmbWIwX!J#(RG|IG}<+CtOw) z>5SLEak3|v3Hj?V at mVCPoiOrpHl`}7=@ARQYA?4bGIOVi+$~IT7>pqr5=L($CCIxp z@{cRJDp`}R$Q1MOw{b-;V^(loyy3LnE1mW_-tcOA9aj%>Y99!AB!ZR8r_OI zZ8K{^w%se(T#)jmD7ntjHlIm{E)QES2y*7QBD>bRZE(Q>!_2RUBK!AWY|K$YP z|D!5Pxtje~GZIyue`un=+35;XfQp2B)eCjQyMTaigolh;CmB_qfWdP_I#dFz_DRd4 z6~4)`knn!qLcA8>&J^1f&T|{xn$2W4>}20;xX9l>th^8aE#I;FbB;R=*3u>?k*epB z)dAeq4qz9SSiY*Nn|KEn%K;a7o||)g8*8Sa1lVvgFWT^Z z=HR{556HmBXwY-2L>nVF{xDESM-2%IX=FwF08n1Qv-vv4odB2mA;Kv+? zYGEBBj5-)4-8hf;nM7Pisuu=^%K<|Mjp-DdT=NRD;e{3MavU*kBZz(!m{0O>DMr+i z{TCQsScyL-_NSxEI_N2O8x(~%hk)Ns>#S=cUmV(%-D^_XH|oxFv73Q4&LSx-iWPBr zr5b)9bXXI6cTF>{&6%F7i}-jsi`)7+rwuoa4Otd3{6)~o^3Et at kxoM=pvs;d^$}U- z_)g{SJL_AVxVoQWxGy)RdA7=M)C+DfoGe>1v3EE`XOuCp8>l5wBM;&NK;xmsnaB_7 z0w`8v>>#xxl>YNEt~A`fne#@hmhu&Phr`!IZ{_7zbHDn^g3Dx>oGwm3!EqE85n7 zQDWZb;YZ?rE$%Egi`{(pCUX4&u?}3Z)$415C(fkCXNtz)_N}fS_ z6U~Dpx0EA+uEou_g?D0)QEL7z6 at Ie5lDkj7d$ZnXOaVz|>aDm2#D<)!9ArJwE=Ie! zA6;rE3^}QI#!?vLkD7-|d$T}eCm6!NfHL-;E$NeC%qo)Ah^`e at DQ!h^#0F zW=ZMDdc1W$+0--rJofm5CU6=_cocYG at rQE6Dxp8giM!!r`?_Q1p;N$p;n(-i zCyd_}uk2A+l_gFPPo&rKM%Xw~w&8F3=>Ud#%iRfB<5%iHDc0a7GJqY^CI&r1yl3j* z3M^GtMrVO{rcqhh+LrZ5GY@%9{8|%Tx@>}tzFUQbH(;Vm4N!(xU{a<(lSfhnDPi4# zQ(@yuU$vHe!BuYL1slAATN&c#YRwgIa^)--Uy7BySH)zDRv?NZCssCuShK+m#=FHz z+r4$s+}2RhET=ujZYRg4Q*IJ^W5{%khe<#1K?J$-kqIk3P~WP;p|)~#h$zU+c)ZaP57vdNhV zfE{3e>g6)Kv-qhJAQi%!w3m8o{-HClX1mC4A5~q`Rh*j9{2=S*I&dDzi^tr(>>0_Jr|T34})qi93d-KK}y8A8kFsg$nXM>R>cI#5LVjKWQL6*q2uQDI z(i4O7DDec=)pKu?Y+G*hnl*sB=9NkQ0bBJc>=Jq0a3s(-o|KaMic at zInvzn)^@ba^ zW5ok#U^PdA(1dYn4zX&EVYx&)w)zS{@OLp4((VQ|g1U#Ih4rEX=r`nPM0fgz5g@}n zDHA$o at dnM9z99_$f+->$B=#XbL)#(BHNezHQsuuC)27)~2HJ>EBhGX_0*mj#@B5P9 zpMJwP(u6`)%Kr+^>l$*b!8LCaM&C;KT_LyH&qE_zIveX5wn$V=?wF{7w>t&s)Y27l z3+2GM5ARBfeJPK;)9&3Mv5mXW%&o*F=JV&HGWteLTLtpc{>_YsH4Jf{1_O2&&>Q at O z#1DUdCNmbS>?}g{8dP}^S4df)3@;geCr*`akCvEjvG- zq&@!KrYOU|7(XIcCZ^dk8V*-F9#VcUQm$@st(>uP>eD)9u)9 at Y_suAsA=5hZ&B4jN zccD9Q;@lnez)bP at i|{Mt3t0K at 2RG2P&($h$ARtW)ARwCmzbWV6(@T@)g$9ZS;vYRw z^nU12UeO|BF*smQZBhOF)ckqj#^0}&HXXD&nsV+|^@N%>J2x*A$^4BDAN-95iQe)G zA5A;&3Xe0EJRS+Q>|^5Wbw{}F&(m3HJDY7U)04+BJ-^=21bO@(bMcYB8F^R3+l*fs z8Fn)vz%&tSPyK&CfZ#vnVq$>ulJDk25aVOq20;{M@}CKDWh39Ra@Cf?YP=(wXw zM+k3~j{FQ!Bq71jAhfRvdr^;?8QV`yFp~N<94Q^K$whmSw``@C15aJ`h&|6nOzvs}LNh-> zXsLvN*|{yQpW2<7QrS=he_bK&vu7 z%XpCSI%++eWzo>aIDaLpBx-sb7Jm((^b at 6Qu=&yvC-eO9r&eav%@nyrrYC6n)=&i* zxgWpCszX2=+;5k|{qE#(Dv8frycABZON5nt76<*cdR9L(W{PV`$0th7`8N6;a1AP+ z?bkWdPELUoOwD%J5n`y{<*>{+S+7nO7`lVxS`;UcMZzg#Wo`Ghc*zaUq0wdHRP>hG zv5a&(X6*16RC5d8Cspl$zS1-UW5ev7>+s68Y<-)W+@&K z`cgMIdr|IV>v(C?mW6=HUC%D`6nNn`I-AgC-wEObL!g9^yvpN4F~bqp166^NUGc;I3MGhtuig1FT573HZ=zq&qdE%X41UwPL6}|qdxBWvx!E-N z5Pu#EneAv(kdu~9oIy8XC3$}e?6%XQW+j>N<~FN2Jv!d{No{Fc{A64)Zn{XCg+vTw zJiy3rDkncZFD-DqHSVx~VV4}XQP_v8fI-Efoetu`Qi88J;7{1-!5ThnhvlMlA`;!L z-avZJDOrrBVBXkc-jpgM*ytdhXoM35w`4et1G~lV&z!g(*~B$hh}wV3Oon$P at r zWAO{LS;TQvOjzSl3l=;XO(NwFh(a)>ShE|A8~@7OmI*i9>`|;WhAbkvW?*ixGNpMb z8>MsO4&_q at eaXDIJ?}FHQ&1t)qgu6KsI_9soH63=eXiAkvdeSzrm}HCk~h%!Fkn)Y*cf|idoQ5tdhj(RJ za?OF~6VF|V%7k45{Xy%*=jr=}Ruhu)3MPsZ_8!W9we!mG&s9$|o?|fUFFJ||@vl^V z|GeYsZwyq$P60&-(XW}0QWrr;zdQh%l7Y?vf-*nR5E6BvP>Cc6!H-F%BbjW4$9W6n zn?m3e1J3Us95k|F1>Le{5c!Llg@@;3a+0N?$M4T8lpz#@Y^o;X92`$HCwi0Sys=gU zg*NY!F&V&usdD%>GtWh at UD=LNG@79XJ$^H2D-KWYmMxoB+Sp7Klp3Bjj6+o0^x8#8P z^gL>A`GxrmF5r?HQUbM&ICjsJ+G9|mRZnTYE<@SlW;}mFZK$Mo&gREOsggb=BP>~k z5xhslb4DOZIe8USgwlAtW0E-~s$dLMkfeP4{M?<0zTZUz%9+|Y at X<{fwnk=Ir4FKn zKZVRsT!SFkd)NpmjI>9gLDT0Lp~br`M8`fs_FCsd7jm$E-^=uLMMKp#tG>-W+luK6ieFzDX2 zutY|C_yD>{$bd at avNC>WLX^kK${ zfEl?cI(@52ST^(JdPcsXXiKGL`1>Ix3@>KC(& zCwT*&$?99i7AcEwx742-jY?y)0m}2{e#7fpvq1LyJ$-W#)>%}Opx(*LE#Zs^pMN{% zWh{+0u>Sx85{LX(0sn8#{{OzzSH#TL_TNOU{~>Et-%wsqMAZvPF0RVU4cJFpgtimX z4);K;LTl0%qTdfLL7ZM>{71(n{N_7m`ZqWKE3jW6_dy`SchJFho+J`@y1V!D^fb54 zmCN&*RL}R at Cs;2dy0N85a)>T26zs at sm@g~|C&37qZsY+n{lgXwukO(*<;d`AN3o%9 zADn-wNe{J_%ze{uN~p^Py9V{9^SD)+DOv0bzd;}S*0Iij03guCcr&RIOY3SHJ%3%T zmWs7-I}O=1vKDI{Q(2XB{pMZH_3_MR%W+es^yA9M_<;gZPIFBF2fZUdnyWJv9|I!& zx{Pvem#wCAy}DjvGy)2zVzb*+<_d0L%|#z$2}3Lb<&lNACC%P=1l)YCt;i&Lg`~r< zpW9!>)wOv3$n2^pnT at R?K1*A-I1M(9jXL>w33uL7uIR*^vUt8R-vIX)c}N6mw6do@ zi;deMF9}RU^@(NsNIQszht&Mcj2yc>CJCD{d9l-e_{=(+L`n;szWv8>I)KwATvoH) zsso_rMc8%n93P&Ms_29mqJ}FN5^le#?gT*w_M*Beq1E>TEg at C;R&j{cT(yzKRsf+P zb^pzU8sGms14f$)ECy^EOuMpIkrB-w(XKV1#P{1bz_mPa+a~1etuZ4Hm04p|EG9XsYu*Qv)N#GK75tD2mata_tZU-F^Rj>td72v-zUhUR^fV0s+(eEG#=W zMGzBjQ}EEu5h3nuxBG#PEiVR$Z4b%Yn1JktPWTZFI?bOgbn=d^(UhM!ajY`F0lF^y zmRehY=pHz{4R9LGpL*oDOe6VwvSH$GQ(B!eE zXl;G#cU4jHmxE3?gBV2)Opo2A2^x$6vu}@|Pk%OU{#8Wa8b!t1GdE};M2Uzuv6AtW!wY0S+KbI&hUtCgZs5u-DTnu+rsJlFWGMByW zz_rzIR;PO6tJnk_7y)zq%AbRscBTQ>UXk-z7aKPOA?R-KWvZZh&BK#Fe?_XvsH1t+ zVwG;NpgEimpt^wL43OP$f14OZEC8 zNC$Z8DT>+786QERlbI_V3Jwp?gv^5-60T?!G$R+>B-_Bd7Xi4AH0!F!`qnG*F!ap* z)VX25*wX)*Q at BiOXX?iYH{wcnp!Q32Ehq+ks+0h72RAg?wJ*eu2a&Gtr;4W^Ni&$0 z at P#MJuil)E`jj-Sf$@1vqM1$q1F&YBuHF4!obyIA4>wwomAZhC#cxlU^crb>xe+$o z+3qL_^VN@<>C#n`)i4#AArio+*ZWwlt%R9n0(w4J7UTw#{Dex1O7QLO;(iu8H!zW% ze;ihr(F1{BotOZ6(lu at CiZ8s^C?$aJMuJzYb{=X?oV5arZT6a`%l6lHD{%(Q)sd;$JJ7?d)nR zj)9EqCDmf*9B1-|EFX#GwqgmED8z5lR4-sM7BrI|8pUXdvwwWS%+CK54%2PIkMN9! zSYmrvMH8wHBaA8qa8j(eVUALr)h4-q{jGTP{9+=)0R;m3hWb~oi~rw{{oetrZs3BV zhWclVbjrR(2gkAu9gP at VlHG0ryb#F*(#+e!8V&##-c&)1n31faZ`{ZSroW3SwV)K#P-nzgJy13kX&P^!AVs at _m4dkRv^Gd9L74`f4>zYtRI8wdAT{ zXgf!wxN-EJXrA#33)@C at 8n1}yRQnt#Lt&k%CZJ<7RvKJIDhZRA zt79B%7#c9NlJUgs(a8b`1nbDpAlqUZ+_n%8Qh`;D&NwFbz*_7ybE2>~j{+|VToVMK zbaTJ)w(X2hPc;{@_{S!P(H8|Sn%Z5?>S3&*oE9Cl=U}%2WMNg1JcGmeB-gU zS*??=+3}E)6wO9olJu~5B`MPBB~E2x;SOYk;VD$S?n{hys_iusb4A9Ip;TI|(`1h9 zgvW}j<9vr)j1;SQhDAf8f6_Rpz1aco=m$HG?y)iMqGGih?BAG;Iy&j3*G)2r at M!tv z7Lpr~*|B;Z$qWO*E&yINNFpsKgC^NTn4D!yx~J5u(rtU(-a|$BufNz-*sqFJ_9_6U zJ$2DVT1Fy651v9pM6%H3l2zZdS=p%?PRLSu at 7+Q1K?s=0LcXeZMAhZ306HjwvRBL% zEcnMoogoV0a~0dNStWHPq~>zr|HaumhF98c+oDxb1v3 at fwr$(CZ9Az{G-KPg?WE$Q zV%xT at Ti;%5pR?C@?!9}j^JD&af6nJ=z4z8e>tnRg at +SZb@Yu{D`K7^5w^Se?aq!fe z@vtH(8nqZzTUciLUmg5#*f`xJX@{?5rj0!Hjc|Sud0Sg+0gpJ90NO>`+6d* zB(0foQWGUoDqfEQw7LqmmTFNW+YsN4Ig6~!GbFk0uOaN6Y-C4;zYQ52hC(m}#kD!o zSd|*I3UxwMMWlSgW151m*cxDV>3Q* zG&3SUeh#b1tPV`!=IQZ)zdE6vnZuoxz at _KtL6U`tHLtlnb5{zAE?f{az#LyF4R^Z| zjPeZMAO$N;dH3rL55iZ at -w_SF+4H=^-=y((M{gfr=Fp!R?h(x0quM37Pd0j(5iv#Q z%820Zx}Q2*o1)bQm4>*-ZG8p4vb%p%+ at liib?d{igNyIh?-nrZ7Bcb0pZMq}e1$Q2 zXh!R?xRDTnvXGAVb$F3t3ecF*DPR#&7Ir at yA}ir|IqdHcCzI$ZY~4a>UJ2uXpnS{2 za|)I1B{b9YgsbqK-lYj8W6g7qtVtE?jAG-iUh#;0 at qm40;R>kVNE<-VjE-&IMeZ5x zkB#lSKBAYM#${Lz58(a$+w&`I=G`t0e_D+;%$F|=|KnC;XYFER`@iysl~z^ZKccLO zRuNL{r37b}3V|;mDa6EuEHZ*n7V9Ze^dv!dh|A=n_)^Mo63-$&$3mP+kh8LMa_7>% z%Eey9B25Cb4vdXMoL;VvXFm?P+QmLzv$K6c?QvWIeJyxHkV!3fKlykO6vBx7CwHEZ z;daT5H2Nj687dsdF&DYRjBpakS%tkP64SjuQeM4#inZQqX?8+G=rCyK0F}#AQZG?A zIG|Jv!YJ#k(Uf81Q_V-{$=*TAGcE(#bH<~J)IhEMv}y7=*!(IAa6~MiY(NnOOM8ue z+RZdjdp^P0EP+s{B5%QE*)|Qjud~W<%&r2B4K*AqeSmBBu=jqcy(}@yAmxY>RgaY7L7~l!4B)ZlC8_o|f50g{tK&hxZm2 zw5(p3!r?qatOE{SnmK1XsZ8O~66hhN#UClOL1Fa>6M4qT>t*r|Ji z6jDv4Xk|$@zgg0U?=4J1)FO&BlyFPlrjRP*GY?=$h-2ffzIVmiLnV`F_oyJqVc2#F zNZqg-AsQ=-%n^@maVGxeI3PLWkG%r8KwTQi_E&)=wm(#3O)BlGO0u0Ll*J2|)mKO? z^>u;4!a{KZpyJtMu4trzZ&vt4La+rgU?eyIawX0zz~#C#n?#6HtEv(;6%Uut;)rH) zvd{zHnq;Kt?164z$b at qqmmI`2MeV#L;A9A9jWdjEHoX at CZp7jEDv_Naqc37VQ zR+Ua&Z^Wr(WfTRKX0}e<3FG7a%Y~ z9q~PUb7T7M>BL_bUtT?`PXiu#5Wa7joo}B8S+6dT at a6BBSntPr&+z>U-VpUIMmNArz9~NP zS!-QQEaf9`>=gp_iPei;g5IanGFU9`b_@&G&fx6%LS}pe7C^%Z;Vy3wHerG(B>1(y zHv*LLkn~o7)&sv)nONc%eCAg&^1Ux^7TPyI+dpo*KE?Jf<6MKC-QFeJc68VCzJ$}tmaza4Do0lOTs)YVW3^3M&=hpPx-DX%m8Mea3huGXlHq9egDR` zuoLBNG5<()GRXh#y50ZL0!3_{9XjEgn+2j3Th?@enk*K z{yo6|HFpW`h6*+nkyIvySmafe6ZGh*@7q-__M?`Lej%asZS)wTm`VuJMx_49Df=r_w&}YoR$p&HP|^F920~UB%$B+5y6EXs zbLV+xGTk+QVL`|TTBoIDG9V94V*{5fEE5$)Mkz5h!~W>?IC_ALi;`4RrSe0ff9?QN zk^*gNd6AWxV;WX=2H6_;`rNt*(4$lWz!7T(X;L8+nafn3zT(=dJY`Lnmdj;T8WyW& zo!R|52yX{8sNxWdRh? zCNn^@+CNK3^6)skAj;t}K>k|9&Bnnp8{&+0D0`GNYbp4sGog>7N~mCx@}Uf!Wjm%|ppH#IbD< zL{wOUZPTDYHf_#ib8y}->06a4+qo&rxjHtdA%rmU8V5 at FV3SE?uMyEOX|A`nXe(Uj zvHlEi2pnE5iMV~BY~{~r0FRqB8Ze5J3U^kGzo1$$r#w8H_$M(ARbAlGW;nUdu}^^w z;ZOXLiM=Hbb;m1gzdbjw?pTVD*E{P%ez2rzxwc^!e~+KR#NSS+1Ge-+3Hl*pKriF= zy3B6?XMkL$hBtnyPB2=0 at 6NB?j=L%u$D=+yk~In?>g5GbyQWgFv7MoHtxve_$d_n2-hR2uIN8W6=%k}lYuJVDD7_z{^J_3$fs`Jh9L*oR* zHHPA%z5&vf9Ei%x at _Xs)5#0Oyy7$Acaz?-dG#-6$ZQW&&uR{z9r(q#n`5<3#n at 6z0 zcww`K+IxQ>04D at SkKNZeM-+)7Sr**}IQ!}isezuQ<1s6co*4wI_C6n;>_=Df&x~WN z{#Cn;nNx|MMD!%d17Cpi>~X4zGqPuVhWakR=XmIEUPF|%EmUz_%ZGyBuH`6F406@! zSX?usqj-?3%QmioQZ$ z)H>9FKXdJiD8 ziCW__Mt(TxW=5^%W`_V#FF`4)3zLK38XIjSi%iV1kD3_Jx?lq`AR2SbsieJvJKy*c z90OQ%q*f+Ex<}yBAkk(1N~PXyT`U8Huv%+euK$%uo$Te={rPkQ`wJU)FLuZV7L&B! zR#8MHe||1zAOUExHcbzzB%(7wEz|?mp}W}pX7iEcrvYevO2oo2PBZ5cXzoG+7U;t*;*e|giWZXXb`Fh;lh z7Ikj3l1ueLrmt!|Aa6P1jQ8x&(%fSNv3}!&+r-Tk#=eZEM52FJE)SLe&hY5!JES8+ zvUFC###t$9R$t5LB0v%3AZ}3B_+a%KsdG6{rPhp?!Tt>EHq^YUJFGIs1Q2(l zJXHR13;8g&!9uK2#D9G(wH~(Smf&5anGdSNDX6y^wln2w`1|aWaz%6s2Ipf5C6fHJ z(p8lGggmbxKLQ*F{3ziRgVSz|fq%$l4PMesh5AIjmj~q$19c*2h~Ck%k}?ScC|9cX z5CU}ISl`3N!{!(k#gscKI%nq&i+I-XY|bk7RoL#=4S3gt+bmM|fIaPeQs zEoxmL~7xSm`7N3Xhfg(BHy`adbtGiAiARnMtH1Lfl9qk?a!y zp|D8E2pn{aEIQa^(iHD at eN2tqApex?b6#6E!7FRBC z?|(8ZFICJSIE>O3Uwv?+9R2nN_P0A6{(>Q at e^g)$%)fI+`X6xq-x=$w|HxRsh%=5q zZ-SC9F>IVKf=86hsWyin_=1Tgsb!w<(iUj7mS)Y^o(??=_hR=l0OvC3PsDW6Jn`3_ z=(1(mp=#Fll)Bq#<7MmBwat3i7E>6$4zHS6g)u(qr* z>7Ap|7=4X;fn{_DwNJZs#d^{T+1cv;wvRR at xpyt z?y^lh6S7dxnB5wkH8KoVVsEcAUw_JbrEQ at Z`rx0UiuPEaItK at iNV6x8KnoQtt&xt8 z)Y)Efoe!e2WwHQs9qY^HsnSZrYuPXm^2jyy==;W?;zb3;0;bw4g`Rpx&7$Qo_E9Y67+c at s0Jp!##~IvWvW<{FZYp;Pf19phS+BvK ziT%+9SE}E&d%=NzE&)A2XKzSq$BZ{S5%J08Lyu}#O}?S1FyMl+niE4BwS|YS+CFcY z#=5C%<)Bo5UsT(nv`;gw-~gi*SU?4sB at 2%#tFk*V at fIT4I2=}p3|dv;^u|ztKBhlt zNY-rpO+)2l1iYAOH?SKt8vCOQS5Z|jj(J60ib*;}+6>ehJkzlAU$Z98>h*sBenB6NcUcMgS!pj_c*;LGTJg zxW5LIF^Y at dCP5T>PV{iaK`4hX!gCvnY(UEbp9l!Ho^yE|&O;X(gxYu1w^`G}y6qcN zh?ZPKx&cEl{6Y$LUmfG*74jL{e=-L%d`1EMp2J>N^k8p^XW5L8Br)O$rsHhDEs)0+ z$*n*lu>g2KkL6@!+?H?x*C}kZYPm4+8Xt8PtcgpT<#Qopm2Z!^iLFgjdSf7UO#)kMpQ9&PD?Et**d2Rs+w_R1#^n}5cx<+m?ic>nD_^?wpagTH1kk6lDkA_!<8K0ae+4XlCm*H{_k zZ%1QO_%NY(?H48q&NLQWpnSic+?WLj(w;!y6b4`07`{PbXw7!D-%hk2cD-J-cYnS; zf#V0U5s-_M9}P-F^0=4iqdGyyr6k8H;&0dbgHu!XYsOs*4>AVqonzQClk8Fm`7W at Q zqgY9CE!A)zng at FUEGOz(;#pW0_i6hab(^V1{tD{KBCa>oVoo7l?A%M+H5UV~G`~3_ z5wlSIjh?h!$!KhN&N(vRhT*T#-jDHe102{?r4qS#at8W!R9YQW9iZ>{;sCn-G9V4byEg+H zsF8e&A!sm4pcyacB<`{Y=TRCin%qt8eRVcq>y(7+lQ&8&)!5%_-{BRJdirqjqG-#? zKh~8M?ve87yLZHOW1e(nWcw}vmV36OB6gS#95&qSRvr%(3AFx)ue!0bk)@*;+rxxH z*-QCSTeicYJFKpBji`ZfN_m0*o8Bp)FK4C#qjwt^A%jwVrOBRF;BVJ#j*hx2N!X|8 z6~|b@{q55U1fV0 at _iSI$DnB87jPB3y={o=N73Eb~>RuWqzw+uRg+=F(wlU4av1?ru zMtrC`cb_t`j7*)-3wg*nTp1`Fe)2<*w5muESlW1pX|{2?EIUNISvoqbverRte at A z_{b?H$=gq1BA02eI|zHe4%!PlA3G1heoqR4wA^s$@zpp?=(z4mQ}EK-%CtdH>E~T$ zL*A7D_Ln!vK%Q{jG$r|08GUfKLip#D0V1%Eza8{iar@}!{3)Gjh%aBb|F28uKMy(n z3u$HKztVwHT?(5TM-yg~7zQaaO(P#g17-5dStmOwXR#Az%Z~$X<8nk@4!f+Uc}+u at r;l8GD3yl!4BI<@5gU at 3|Dlv}Gj+fsM;k7nI*381VwW5B=f^ z=%gVP8CSFn6JSk#uR|bQ)v7mEVLAtU|KXY*=us_^QtYD&dO=u6x0tRR0ngBr5j%eYr2g6y^DD4uX%q at Z$9QgJa-zZ1nIh9D#!>JGCR z(h{*K+z~|uf~yGoX+u_r-$!Vy45ln1tsf^l3cey at Er4(h$%3$&f|?VyWKh(3>)NBZ zIF?YPMUg0h-8NZIYKZ270BcU at d=`p6&`b!3sYFI*P?<|+`YP;PJtPaBu`b5ZaBZ!9cQbki_MrE<2#n45o^n&(yL9t$!FMwx6fAf`(g0_^j zZ`tB7oyl?>qO+adxL`c#Jb^}N-ZJPLuaE2yagpUh+v>6+P}et3nHr)4QTWoZewCLB z9OQhhFVjX0jl#1QZi&wv2c1ZN&>XfT^#DaeyiIyPzDxI=A4HSD;g{?gQBE797HMc7rjlE0dVH zQ~m=flZ};z-FcZ9e-?3Dkv28yfY~ap;j$e5UKD~?=+h2G3KFrX+>`_EFhbm0EiCbV zix)Crn{%TOSz_lCqG)9p-I0KU-!|@oN4ouuE*{tuRX-Le__i#CVKVVnpX4*t>FmI^ zt`XNV^z{1lYkeOk457$@z|DW+^;}B_(+k|M7U$$R>RjLiH)5tm9bc}TH3vT}96}CaOHT8E21~jQ687I~7=;7JegR5GeiCtLCZxVR9 z-7NtH$Hmt;m_sFMgZbCpe=|93wt$g1pkKZK{@WLu{Y_TetaqJ zJ|ipo&*bmGd;d5*W&5%_95fxK at F6aOZ%7^C8W9{jC=3?wj^2Ze>tK_%itBV9`V- at 8 zJz&~rAf!A=fikVGwbDmlpHZm3J)i5k;b$>GAKqkk?hIVW0ejpaWvoP%L8Yd`Ketev zMw1k(Z%Ubs#cuWYc2OK#!xPY@#=PypK-Fn?mkErsJiU!;h at OT81fR?ikPB|5m0!lx zR$7 at 9<}v;th{4I2REEwmu<+b&2e at WMFT%{ZrM#$u;927Ww*_;UOBWDuN^TSa(o)1O zt2`toKdT%z9Bf2f)Dn2AJ2fcd;||Da;u}INCJS zr`K?-wED3RM1-d)@?aN*owtKRz^S3t5wD at E!G{Sq^fmZ_LscQ_18E`6+^#rS%4S4T zqcIiTT)?||4)eSQOAuCz3tq`+;@49}M;9WID~HLxV!G>29bV^z70>TsOVu5VkPc^M z9L0A=4f!X8#BuIC4h>|;D)ZPU))BuJPq|(jf%&J-z);MbUzwjZZPWHH^%sm;@v}k z{Vj<)N&kb}><{N|1OM`c{r{@y{!^%4{zIr@(NJZklZSkFv7EOdH-R(&Vq029 at l6WmT>z?_C!+{s+8-3k1loCK*%WScE?(vx6h!)>Nk&WD)$@iA)00fhE8(ZI2i_q zm^W7+*lJj*yy>*T;i}h?)p>rVWeIdF7O&pCwfYf^M_=H!R&^QjL;N7fH-;5+{$A9{ zCw`bIA9?b+{b6(gS4GtQwxUfd7BaI*KB_~>jYt8B+gTXiHp7ApHZn5 at uj$!I&6Vu6 z7(6^qd^l0*q1t z7PkE0TtKINFN_AnU&yDrYCCvaMB|k9l;&|l$?f0~tjvU2zQe^5IOPc=AMxeR$_4H_ zI<}Ha&Sdt0bLwh@=@R9}l-~4`)!e)hAmXVgMrC1=5L|Nd_ETM$S zq!u3>m`jhK6kxbm0}UO{AF<%oeavqL##usjqwmA_g)d5 z1d4a5PWTS?TLfRfG{y!Lo#44miQeORto7QkZ1@#UF<;EE`O9PQ6@(%7bF@|Ui0Vp} ztIphG{VRAO7KXXJ{(v_g{NLDM|1aSE&tRtiA{DLw>2F+sgX^(M4CfV%Fe9KM@;&7y zU{xGz&bShOkn))m>N8(|ODPHM?%6cpZdP4RFki0AYCp`l<$lcY^5pyB`}ma~r at 3x; zrw#;s){uoLzaVBFrGTMa|GOHpa?WVU?-B;U>qgVI?bRV*On*2~?u?(vyUoU9{iNv7 zhO^`Lue((OSS(J&#*l4f4$%_F~Y?U#t55A}-^QX_K-B#hW z$loO^LxfR0B1*`&%EGXfEngJ8s^&3rcDQLF)2tX#m8o~yBCr6B`Ed*pc$$R~=>Vf( zWlWdgB0GlVlJ5X1<|fTJX3IPa4Q|K=&&Z8}V5rUT8@}EM+h(+|k|vyx>of`U-!XXR zpe(#nY at qnLx!VaIek zipDHuXv$(?nw-H7f)i8sUaawjo_UjS{|e`C4Fn{Le^j99zq9D}2hRV+->~{41kr!U z+NQ75!X^u%lvlC_#eDHg(nRhjM2mzi1jj7YO}3BFieDeQCgtzu`$X)*8TZ>OZTNnL5cq7qwxzh1$(f`v{vj at mp?JD zd`(!KKb(VKbN1jF_~

k8&SZ8C?(bs(VmzqSqZTf zDZIdnc5$U=zke at 7Ip!iJWmzISBNJlEHTDYn8jqKS$-%;A58}KdZoVwV-LnqK*d&Gc`}^IE>O&Zq*9&Y6 z?)mxZ>Kr=mI*kHp9Cat5xUv}1!Z^Q!qlVGXCxRj%72fKPi at TYXj%+L?3E|*wt%7)% zXkqX0a&zJ_bHU~8jZwt80Yrg6Xw at Cf;D#p8scKL}IMP-X39FcagKq6eOLOV4M2;nE zE?E*?Yf-2|7Bnw=&VYiwQ(x7{zRyRfR0rP^(28oJgpzZ`!Y*epBJj72R+OoQvIbgI z=LCf2;7wGzh6Z`-I;DjTeCMbqXjnw;ZmiJSZR at EjxE8?>W at MwMcV=y+B5y4>&_Rf` z!E0bZmkq8U!`Y1y|CQJo3{8B4!=oP5>{GEA-L{&ujr%CGq{mbssxr|-X02hJgV3ZK zgsgpl!*KhGrZeQY`{xU2rcn;yuUhG}Lt4Q~lfV|naBxVm05dA8WP})^6;O!cytjXJ z!RRujYO!w at 6d@wpLpp%0_m*tCrx9at=QaS6jUpma8je;{#>TKmsStAMV!NlGL|OV| zoF#IEUP3c*rc^Ysp-p{{Ia%-DmuV9vY(fXpSRBJJ>Xk!E)(p6 at qKiKd`{y82jp>mg zF=w>`O$fcq^9p^5Y8r8dpIe!+OR}dx)0{PxV-i)!R+%=Y<2DF%hJ(ObOrlowvX#oq zbr|}jFs9W#-qs2SCGvg6e(vwF4a=`yi#XGwWsx#@BHL7i83qZVK!#Zen(fZBk_&%5 z%u*m&1&$|3kC=~=gNlqHgL?(ig)h*L_1LEI<8Blt1Zp*V_>(f2S^`4bY$^3*#p)ul zgwz-2Ij`+1QlVxl?*(1dN)()s8iBJLj;!hujY`~GR5)_UZjsL;=UAHZ>SjR9e9`W= z at JyNyBZpN;Den}Ko{EuqCyJTI3bt&vK)Z+|&N5)DEF*N$(M|BMt}5;b zkrT-iBR+ at 3LseNPGf!2v&6%!C>U2M}4H=(v6EZM3uj`-1EQ!!&d{yJSd9ybf=`qj~ z%()ss+fYRZZLds#xnu434T<5iuJk4CV}ci}kRr+}RF-V9AyoYmuG}`gRKd)-kG54< zW*yLm&_?SsGQG0+Ru7YTk1CuKfhfyN?_6}09cuCU23w;I)DsdJd@ zf_a&6jt>Cf-G+QI%?^Bnx6n-fz}qF>t8L3j+_7PzV4NO=!%#|0F^mq;c*~8tZVPeI z at P#n$)-Xl)%VD-LW+>{p+|5Vm${50XIQFWUz9H}s4Vmwo!rP at aVAoE#bMqVwaGP8W z=wbFs at eJ_jq&C2RnsNZkk7E>SJ0RvJAF#l30PMvd5PR1Lfw at P9#SL{Ks+qvDWn<(- z$Y6o8Ir9|CHPxDSCmAqCyG`6lzM%+x4qAas{jgzzA1GpmIcSU`k~Fv-*kR at d>?IzM zwnr+UsgsWnHeEn1^p0~x8Z+GpLRHNkj-Py?3^l)c+}UBi9sy$F1tTY`UTLws6uEib zumXwusx~5(8Lsx8q zr)=AWNMs2N$caeaAGZLoK7(CMlR&CE&j#Cjk(Hp*v~IGWL+;@(HI at qAg48cfIw=Es z^$0GfBUY1-R*^ms5JSx|xbSpDnoo3gtfkM8C=naKS>Alfti+tXw)ee9+aYge%|zo@ zSOtSyht9ZfnYpsoj(TQY0FSC=fB3~9T8s0P=ETmCE?J?3!U at 4PxN$@bWNU3vw9@$U zS4iE#S6WP3R+6VYmY;%p&n!G*vpRmZ{wq{xX zbv6aqb?(J-+7&3x>~mXU&pz`x%-4c#RJtoX4L+g+{~F%)8rf6x^zAzJ%J#u$^3Dfi z9l_^<)f_uNtK|Uno1zc;`a``xFtwi(mI&SdyNAF!4h(o!T>g4b^>qB-! za!|TD*}r2ru*rmDBwMdlq;r%>U&N^CdiBqhJmaJCuEwO6U&YD+$3M zaj;RL}>?FT9``W-g?d7J5ywS-hw zUmo&eXmFsh^^CRTjJ6(>mlK9E)WU48oFrB)x7311JeEK=RQmx5f=vUbsp5 zy8I~pFZZ?0$SG)?2^@mWqi;}y9$AiC?&|FZ+Moj=*O z%|S(vf0-+ at iQfp6pfF0; zFRW6UIy%!@X$AH at 2bmj6f0rp1|E;S zswI1h^O#sFgmXzGzJDYie>^(tF5lfAHW%av%V4H_b8Z;KcLez>Y~6GG at Yq_p*H$mlZZX!(RYJyWR; zAJN{sWZ%1B-#wnI_PR1suhTo|Pj?8IWYNn4{r}tN7dxl8|Y+GAXFu%^sJ9(cf z_xJU;Vd!3>q~H~<`+(YV!0=x^Pem{*XW@(Iv?CQ-CWKgZCa8s0I0>JL68s=*v5w&o z#X|K}Z+W)={U^$rzA&?o5j!Kl8WLSt72e+i&z!u9Fj zO#{BM=rBXfVS&1aG)ap*VrmfaL=WG%Bk3%@hat}OyoWOP#d)H7zsWvit{G6)q#d-$ zT)c`V52Ti z;dvu=KCZm`i{|VCQFe1)d=X>)rgviDI at JYi%qZzhdC5qS)41<|y6>>r?T640=ADs- zexUZu*jKpm!0tvWIevZItg7$7EGaB~Fm3-3Z3oQX*i`?~3&_0 at dsyA&flrYOr0IdL zEEy}W at x)P+#%JOFHeH7QsTfxm0q7+m3Q;!>Wz-)2+z_m$3!{&M$urHK>oq!w=AW8c z(`WU${!=)_SutXO903xmFt$tvoDFX zZ;X(f%e16Rx;(H3GSs3{{hQ4*K)61&<{VXE3I2Ow%kY|?V5AQHq5BibJu6VL=dsS} z0q54YyQVK&mAgA1JYX60qm0+I8CU#UY2(N&6B;O at nbo! z4V>oI=F<2;^(f~$z#b~p;~DGAC3YhQTqFej2dvjL-a6KuMO078-yXE`t!2wfZOP&_PlMc=$)M! zj9S#JmAAxDc!8qpsmTQ%0T#uD9vR|BEQIuf2Llp6QI3}x7<(d5Ez1P$s&L_B?K z+6)b%)J-mPQCEQ>iAxZ}SR2YSwT5WK!BaNVs7GlQ+AE0{6{c1bbZ33hc4F?wD6Web z7xYm)z6PR8We~+B<1A zXynOrgn@%5P{Kxf>rYdub)TvrCfZ{uRI}<5%1dJbcPv5t#PT}gX*KRuV_Swo8FBks zax`+XB1HUVpC>@fU9?&IRV>o9Fgy;$YdbFfA9k#|Gy zbV6O?Tc`B~lpT)b>pG3LXvejwi7oseR3iJ#C<^90i+Vig8PY-?*cDc{R8tn;JH at q(C3 zr;UvvK)P(5VUgL&b5Hc@@E+gKp2tkLJ_FYJO?&M5uBjejb#N}L<7MiEsKs2i$WUN5_gd?*8m*IF zoq0;a&Q80sDms?Mm-Z6N2P&8BUmnuop?aL2-Vnu?m>;+x6mJXhza~8t(RrIk45o0N5>7Q_|LXx}@)2SXES*+T~xg zps1`e%&4y?l4!@-H{;E at iRRc6f-)QRKp;4=lq<1oUH8!@muO z)pH15=#gf9 at b4q&d$?vh;e+A%mkBzt!fOw;^_@|z1I{x0l!!Czg_+*`5~mLXF#>W{bMEGKx3`ZxcFLDkADV+OW33jU9^!ael;p41|S=Fw%^z1{g+04q;bQ zxS~@ZITpR7D$7Ju3Kjlz6q<*`duruZ)K`Lv+$+oxO;?mc3d;P>()aWEW6n>neQ4j$ z`!_s*mjiWxXEga8O0<>DK(GawC^IRRGRvtbGp!7nipGirfif(1Yj9R*Dn#4Hr^(D~huU(5;Q(D at mBD z^sA-X at q=-qm^>ub6nUwfNlr9~4bmxnSYTCFDvyWi?(8{oC^`9Um4}B67>Y>gYq(im zcoUO)tLZtkcAArmSN6c_?K+9cX)*kzwC;pvso-oqS-Xx{u*fC at tys;l!r81 zp1^lT_jM+waepqW6Is(ky)Abw9YMxr3 at MU|pH2J~vyQI&eo(Y0LRp3VC_xucwdaH( zU9&zH5fvbz723^ybiyAq%B|W5%m#`KGZ*SP*i8B_#jP2ou=YJ`;8t6ck~^{5yG;t2 zqGqB=Dq$EfiA`z%7s9R(%?!OF-ViKsg1 at Xc)B!79NDzRH4asotems|84e1qYpXC!rR0M%1cW3)D#= z&KYf*4&D}iDX&^AN^%*A9QFBkg%6V#xq9U%DNJ2rFm8Vw9HmI~2S8?K2;kXK(!-b< zTHV#U6`r^28BZtSaTKd;-|H&{GT+%tWQ2V{^Dq9WY?%0QnIS^Nzzm`d>H zKN%w5#3NveD-ZmPnmvQgNub~&KFB#Rc5{fuRK(&|i}vvbU6-6?T=2efx+1=+0(Jf5 zIZPnB6NKy?V167Jv7pcW>uEforCh&?3h|61{yE91tavp&MeQ8gGB}n?D5s(!WzKa{ zAQm+*PWs_GM|USS1b7~U0oh0NFg&Iv8=$Igup&wwC(3^6IVq*3Nps%8l!&JxvM-DEvv)V0?w`Zm{BTnpbY=7Ywpf7rU=lHZK@;s3%aMhII*Z$*4jY!-bJ3mj#YA zZ`n_%p9I!Tz#3tUT%$)aYa9v7Cu)CPU%VLR`x3ah$JcVwS^y^xh1oY`n{y4{Z~?cx zt~*@#8j9vyvQK1bZPEu^Wx5y6%J;5Y4D)k at GC;FNH}4n=u3P-qi^MS^HBIs~()kQT zWz%*55y!MIlYi_ilmN|eG~1v{ITmc4ZDK)svE)P`&@7v#9TDD^p&ls~{=JQB`UmA# z1#z#8Gn_GTuD%3L3O}x9Ux%uANGn8^mfdyMI45vR!cn1YA92-fY?E#5q(Lx%e97~^ zSy9j}n=A{(CU&ncs*><8pI^#n;w`_3;W&hrCD-;fc(M}xl?R-rhHge zdH)K(i-mWa?B@$2?l#+ZD1qm#I2O at je zk_M3Iml!gXt-yNOw)175h)*CCzX<&=P+tUIagn%k{clCQ+i5wnteHVc4qppb*PH3b z?ays6;X$K1QV4paQ5zQ?d z%h;2RSruQ=z~Sni3h8>cSdEWBd%H6^-7N+OGv`@5i_ypvgpXNrbm0Crl}>yv1-tvGvoHDEGo1=d*X&6mwdGBk}h##&45cY*`iK`E*R^pK{n8m zm12dTi@}nj9lWdySSDf;<7I+rRz2B!&p2e zgtUX8ihHmsi*HP&ntEZG3SAA^oGulTkwroG8qT9B^4nP7xH^a_=juM<7_pLa`0L(C zU`!t#9;5xyp~pg#l{k4=x2_(YKdYQ>tzA%7V%08xu!+`P+dVE>XXd-wKow?pfxZum zSYhx^;~Cv1RZ%uPR(E>CKxnsJXuh-$4^}@!`r)@4x8ZE1ti&j=Uy&oloP+DpHDBrW z5yfooAe2&yXsO`W-S(XM8}K?a;A)<+Aau&7YK8IDIhF-cS7B9w;QKAhtO at _1kAQq5HfVqfV+gT+q3aH>5bq)~CTiU< z8h4-p=Jx0em?N?;*&ZtoDM#HGK}XoeEb-nXh~kuUnU(n;Uv*Wi0ZFmC$;ap)!GUwh z>^<4wkpsU%AN67ShOm-gq`1JPvxAvyc&Hxl7rn0s^*8-&f^lF02-fK>>$awge9hWt zl@}5;mXzrWGT9=O*~e63LGIBLyFKqBnX>x>Z#j@?1qyebR{;K2wpj%<^uSeOH9DRZ z*nGa&P}?-P#^S2FUKLRs|Hy9+ at Sb;a3ENJFHYH2Df{c0~gV8DsA7%Cvn@ zVoXHH*g-Wtk_ at G~lT2-4xzxh3*_^cW`8ZOI;=k#k3rOb zMj&I#1v!r;^#fO_ir(OD4&tx~!Kf0Pam59JZ=_?RH{m%To>DJ_c<+=pmAvTrHXP4Y zAG}TD^z4jHkIZpgrI7(uR~5DNBOB8xmYHwp-Gs(Cict at ykZ{yvpuHbsOA{o6_E0C# zbYa3p=c at W4hXp_6v?;jH?L(p8F9zt*hmrwb(Ew9EWZMUHN)h-L&K)#tZoHRicg*GH zlIhjO at c~^z{E`dJQMz%ARx&mxu&aLXfJ_7AG?|~^k(pvHajEu{5zU;0I71fK5u zOUgagq`eOeexLg5{ohDG7k|tJ3xNOtrosNxOri2W4lXvP&h~cyO8)=!VNf%)`4{Rk zCwWV5Spg;VcQ!yynv;scT}TiYtRN6d1X0#w9;OSr&uP`qA3&TtPz%caQ7_=-( z3_71bys6I44$BY>QfO9fi~QbiUCY+b`{yOQzX#2w!XIT}_(-l&#YM&-Z7x`I)pRO5 z>ND8(t@;|OCSvJy;sJsAk$-2ThFkX2LGrl8ju`n}_;pgW`1$ zgU(8Vwv+4mn*i7wtvRAHv-hoPGiboN*(<6?51!PdjyqQPa4H!EBNd&shcz2Ckb4J@ zq8m=Lp~vwu$%>;66q~H!Y1#w6r|rli5yNP&$xLO)@aR~))Gcc~2|gZDr;rQ!Fj{w8 zZD3WOsi?2c=k&2PMqiV;QzKenuoGC6{0a>Q2XJGm8?5#)QDAk30wc+R!*e?20UPzz z5!Hnp_|{kdn{`iY#;ow9F$7a`%Qc1gO(}by at A9>>&)5E|M)dUjy#Ogc=t}AvCea)* z%%@0AV4vhyWwoO8g7P$90m>O~@e}HpMvQ!Oe$jnc$NGqU1V{{7S7Qiszy#8#1Yzr< zb1nNy at 7Tsij3V>uE=re{MRpUjmxS-^$(MPw{0*YA5=X32WlrI%rQ+;B=yr+&)5v?R z(jY7-D at P{c3gR#`q*YQKJM+JrnqK543!gMuJ#?BO?Pq!8K9T-n;t2- zYh2Vf4)5nAbl~a}e~V3Oq||zwaUY&Ngx5xuiVf*hFELr5)iQ%YB3_?AolG+7vMMoG8R zV5>LU)SBJn_);vLmUs}xpf|0DkUp>e(B8iC5~2UJ`E+D zuxfVD73oVj=^E&#oxob|${eLxc9#&UvQfb{)e7d-+cvT3FvcgEG3&}EyY}9YjV at BJ3h{KD^g;!N}v1~4f5LG2Z`MX+KZV6UakYm zho)?|2H)4x)EMz~>eZKSk019mcu%Z)n*>g*){fTzh|7FD23a4MiN$gkxn-pfqmzo_ z#fEVnJ!0Ho at cfcwO+S}ZgbWh__};JPC%eZ zFU3fS4vK_}>~vBYO~cDsNN7JBuaLe*X3iR>4-O_0}g%>Gcg% zCM8(k^U*#gh5`*OH82?yMMT8PfB6NB(nXGPfj|A_T-=C=r)x2V1z+=`Qz(1487f~+ ziG)#SLH}TCa8S8owSlvbL4yLSr)5If)m!r@^4(o>OuL+JXQdJsw(sTq>{i9vLzgnY z)oKl071HPB=JF`#6`Vx0HqH?tqdB;WUMio-lGjjz1|tIHr}0g{=_Mn(GL=UqWE4?7 z?HVjki`91=%eg=@&*gdQoKR9}sEthGz_*so&9o{qYCj2#4SGw7-Fa(_?PdYJTDiC0 zp1)_aE566Z?Hie4*!gLb(Xc^ipAYv#bytru2aFK72Tpyme)-ckvl9r9*To#F at 3zUK0-#-FZ5Ovj>voTUzBrA$1jYCLwz7QO;aELX}pO2gkiSmx`CmsuBjtz z9NZz~VN|>(UmMR6uRox=>tJT}#N{Q^+S-yL&bw%lFHG-*avldcSeKSKIP?fRA$# zPi!gYH#g=LW<_L0NNwLTz)s2LF(HuH;lD~14C6u|slU8{MrfZ{kR%4(IPKed;5<>l zorb?XVd3O=j2P#ZLtBTttF5eB zAkHa$RPoF at I@668{??~8dbVo3K}-zS9P%f0MVud=j_0gSx4x4~XOaz8U5 zVrTac6?z8ppDMAc(?3eFioLS)Kixb3&Baq$`=3aQpVHS<(dIxRchHp7t-v*K2*?T} zsm#QAp+bA%u2jM;%qH%U;l1M^3!n(H9{|7P`)SwsO*Sm^Ca2k4&bC<}u5gH|pNdwL>m~9p{$0u1w));Y^496C=z3NmwrfM~;%Inr-tM^=KD{V=n z-don at E_A4k%BoB_i5n2vxpCIeDMHKbz1KhmiVk((f&NxZF=?sLOzEDv at 7T0pT^P&A z&scE0A)Nxp;kb at VrwvCpxLAs*&HNG#Gl^uCBmiSn!XB$KpM6jl-~A*~eMQ*GnF^qf z*3n=-6hg>7ud0|S0f|r(0a_4|LZ#NL_pygP}yCWbLSOG<=!7WHxo>ocse@$ff7yc|clh zilHYvajS)w$p?+#!1*jCsu@<<=yWYCC5%1?2mPKkQf3y~PLG`Wve@ZebWGb(e$q2lvoiuAxB#YSBs-cUvo$-Y3IYxRjnSvKM1CI_fiiCan|eB!x3 zo65(aMkawTUAp`_QH5C7Tz?G`T!Wf1c$L#z|D;J~HVvB(^FNPd#T;_(IAOy56b-*;OE6-84aGvy#m3GvyVKK#_HoHwbvM3N9!6D?~XfZ)`Ae>2>W^KvD1KXfrN|tGWRZ+uHF!{LPD=#)U_b;O}_m(!*6b z@;pn^db=CTSYk>1JDzv-QOHXwO%*Bi4_g}T=zZnrM&-LpfC&Z*D3f>HTY-OhW1=jk z7?38bh4E;L9B`n0p|HwS-nqD|@q6Azij_>?uH}dCRBGw$R-ZbPTVN at 8x1vh%PqseH zDerUKt?T+H%NdW{<0?Ij4LxNo&*#JFBT

JlK?q)`+G1g>QZyU!s4<-F6 at aVJ-Hx6#=($x5C zuY|{1?9n7a;!mOr%Vn(wBUkxHvsWcP+-^y96 at FCWVK3$VHrtpn)O2f!2``VUTnazC zg1Fo!MEIyeBOYm%Jq57`_pOMD3 zcW{UJB)bl|!kq at F4#dkH7_3{c7==TQ}} z61^)FDO>vx+lI1kEam+w9*@N+(Sw0w*_gM9ak%8#V!_wV=R4JHXRj#E(?0 at zL7-iQQH_2p@h(46P?*`EI zz2`Ae#m%2~@c+8IVha_FNAsD?Z8Vwp-Dcm~_96S*PI%H-7isXKt4AZBkl4?Tx>e9yX`NA_}loUidP{ZWCc*QTEEs8e)X$E7pD z+%9^J3RDv`t33eg9)-HWdgTm|>#RjzKMYamL3gbf-j%Aq>4hlm-lV!dJ82IH;vh at K z=CZ at W5T6x*`h;8;jHJheE33HPe^S~P-$=6*%4C##d)RxFQKlP zb}=MxI5G%jJ}#AZHf*{+f?rJS?R*;B{QDA1TDY~QmyoQl;GwWcv-}H_w9<^?H8gE7 zux&6fp`nu%dBhuvTo|uxA}VKL-uf(Gs+NJVZGA&|T!BQP5JVc1gZ&TD+!5Nk3bqYZ zAny`U9NI*ZO_De@{ViRb at I$g>ZrLxz+=fJMg~M?trH8BQLpP{~J at Bsgs1-!cNPRQe zYzV|@0RR8qou|jmBu)PimNZ}h04)D^-1I-YI!+}2YVZh~+SvTJu2i{}`zI=G>l!>H z#7OW<01>f8mk;er4FXcr7)XT$^fm0a)I}-nYBqC669s>e{Em<%A^mL#{H`F{&DGkr z0J4?e?1tCtWt;i+=IOr>{ndvH3=bM~MBvi2)K;3b`*wh at Q0;Yu_+YngZwaA}*Z#On zQ^tj+Jr+23r8-Lr+fLen6CB4_Pv4zFnE~jZL>{7hZIBbVO!RWO+{rQGJkA-XcMOie z_g0q`V7A&r<+$MzOoX_ivjyKpAD6Wbe?vpZQkKAez$>`08eQ)~agwcS_q!VQ_7C{1 z-F0xOED|xrQYq|%G~ZWa#urm>$CL!wUU^_gQxSNYdH+Ao-Z4nCF54DPyDDwlwr$(C zZTm^vc4cOzZQHhOqmuVM_jKRr^Trp^=j(|5XYIXz&auWEYmT`lnrJp&&0=PteN#~W zkz*ibzoZ$}im}cgh3ns9 z)dsAOgh4qj*Dy*+>}=QxaGJ`cS09af{!Ut}*TI~=wJ{Cc%evJahUMwl8s1}Rr+zm0 zULN#-0W$yNiiqf9qKQcBT^>9P457Jzf>cHnSdU+Zp0(wc8d#$&Pu+Q{?UJahCu22fmd@=uu!VKP{H zgqhJ}6ByCs3bLd}M*T>2MntvB^6Bo`7~Lg0#87jS=IQ7Vtx9i{b1KJV^K9Og6P!{d ziH;;kWZ=KG!ujX-;@nw=2KiS|G+ufyn-9J( z*$W?k-ml057&~DI0u-TNKrBW)n0YYZclq!f+=DuhH!}~Hi$lUcE)zn^flQ*`5D&Pf zhm84={CM_`m7$s8x?Ane<$?sELYd)==Cu|uw3OP*X;avpGP^2{;UdA5)$~}IDyp1! zeniSC(ld at Ov?Ur>dXkr8LbN at Umaj<))26U+sVaF|3sY*S_06I%vC||a8(MgZmoHL2 z<#pm4pYp^sb$N!cyVfb)Ev2klF*RpKkp8NW_tsbYL9~b{RaL27Vf4#PP;#k1~A1MM0zTCNZ?;O6j-O)@U)dXIk2jpHVHvb zoePwMmJIuPP)WIiYd|_S;TeI&d`M5ZLu!DlYN9a>sqLLr-N??UxBGqPSRWsag4U)% zWDn>=_M;&V`W0dtwg+2eBEAHL}$_(>S&n_^P~}80+|88S`UlAF398UVB at 4hV^2w!l&I*P1eSohU}MO-}m85 z&XRFmT(=(Zti`D{`FvbzXeV8LsU-9K_9)+~Iun=<=~*S1bE}wAHCaA3Z?S!D8$o*Y!pJ(uMP&rY zN6S^}5z=6V2XK=S{djYbdi)@QL^LWg;UJ`Oy)K#Qm`mx|b;Sq7H(d9xR|B7Cam<-Z zG`QK2tAT9Jhbhh-PIJ1GnVq~IAeLH{fCz5lQA4??4y|O^U-?$MdcdBW>#^_WNL%UiXg>J8{JPd63OllDY8PTTE?r5LLwFv2(5=rjS}_U54b7lt zf60!ErNvom-f4Uujl`H1fGeMI_00oy>&^y;ES`1pv8xH6|G`6=7C!0-rL3!9s2s|h zR^$CPD!y;dT!UQv(nh9R;3MCx|6rhgg<+wA5ol@%9EFBwbq5s%fv4>eR0fgDn4Bom z!VpR%YoaurAd>>A*Dk4Mzf?9#BLCJ* zEaa5SOV2m(Yvn8?P;YSOejva-6- at F&7BYJsntQQ4JY&%XX7PHS<#gYYRVq`K`H9%1 za;L95F|i+GEE_ at -?Vwn at 4w%dVxZQcqHz~!pfljXogxpd_x&O~7vAhqf&SXZTdLJmt*WV5|pkvCW at xXw9{Qi2y z`yWK_f6>UlScJ5lH&hV5V(ssbSY)@_?_Q*qaFZ&#>Ta28P*}SOmv6XjEuwna ztfJYLmRrjXML8q|LwWYoW2DZ}FzHC{_nB?X~TmH3!4>z5x#J@|gaf5}R- zM%WRlZY$sXiY(W1Juen1=@adLPr)pj4nn at _Os|PN8E2PU>i6xzK at 6>6hzo%!j3bu z+YAsE+03AZz zl*ct3Dh61_B{Ww$BYvT&u*$ri-<&+c&?5{l@?c$BN at +?xk}Ql*SwyDrts8i=XIRV% zs=muPO}ZY^MQw52rvwhL*U~o1>=vI1 zflC at bxH3S7 zs)v=Rjq=E_$!4HHN=k-I$E=;4m%|M;A)lE^4n-g^Kh#Hn!!h|1IE4iJgv=O$vNeGx zWE_P at _>x>byaW~b>D6YANLDL3&MRuijA7h>VJ^Av2;E>4OXoR$z`Qj*yGNW$XBc}= zetM%?4Csp=d=Uqj7BLc^* zBbCSc!iTbqupPb|Y*{7wU00QLy2>nmKN1f6a@@Wwj6g%sh_h-CyolkI*-;jlVH1p>JsP%wP*Unv5 at qk!| zn8LxhVX)FsGC!^9aH7Sx6-UfH|G!;$eV0mAAM#hy+K=|{$^!qN8_)l9*E?V at VSX(q z(r9W?%Yi^73ed3`NXsP`?@TU8PaQ5cP&;8YGYH7vV={3|74q0 z_{A-}j>M2*xEpu|M}GxM-+4Qq)_n^En#1S9_4&Q^G-s-=8^yHIc(%W5wrFj!2qi4J^%O>l%xu(nrlWK;wM&U zgrh2TGh2hz3Jt|qiqi7qifLf^w-|JNm9DO2-L_X}=pWO`-q8>E0cdt)3v=7Ty0L_y zYARCb0^qOn;;xiJ!UB5(7dg&S6PKa%F`V?=qK7rXaMd~%-Uj`Q6BPGm{YtvpC>}_t zlwwH at b^+mmGac3q(?Fw>sqw(|DmemgY)_kE2USoI8=g~(*0zKZ$SjL~kGddBjYu;E z9r|a-z&PcfNh?yvjvJ6!!_;9Vs7sVpzY}WUsYpwHX<1pO8K$T9r--*&+s1P_w_BuCW4kf zH{DA(Zfn&xM5w?`sY|?ery^*nkc;#gjqfLd620L5$sw^vXYU0ZsVI}xV$FjkkVQ9U zMQsGb{`vywvXVAg;2GPeaiCpj(C0Nei at I>G8J)Dt>z!Q5W-GZVy^}a>C-ojIf&ENt z;#TDb@`fIo1{rU2zEHT2<@K?Z;OH4snpSO5=G9Vk=?A1Q{~pij&(2M9P|VM}qzaYlXKT4`;tjIt-j at Yt9%UpOh-kznj=}%{3GmeUu zc2GqjH|-4Fk<`EkqBTaK#N;1TWwIMsVls1#iRRRyHs&8Tkuee)=1988_`qNv<%q^M z-3-Yp^3WdUe(iz-Pa9Y8v_&`m05Co?hQ$`bftE&JO>&Q8pdRB6I39lr^qcNHaQ24L z&9iP?-`OGw(B at AWBY9yBh|PqnInB6d<>*36Q#G9sXL;EAH+F`r1z z$*G>y!3`&s)M2SsWp7s_#bECWv4Gr0?ag_vOS6KLgc3#?HFnP-gf at h#iGdP+o{ffC zL~SkGj!!>Kc=3`J<5=~M5O=+a+d3NJTZ4F}xcf!gw#tt9GhE&5lJH)ICu9iXQ54%Z zxIx}SY8ZG!na4QKbx|T&Hv;mkrXyHmW$n(9!c|cH)%Ay>l#7Q+9!zv1F{2_eBNen} zlC0^No at QCrDA#P}?~APQ^XGA{1(9VH>-y6#0*)OZGU43E*H>@IS;-9HufXE>3EG1& zI9)=|%g at Fkq|%F7*Ztr{hklx6Mw+!UW?fzw} z-^g|TB9}d(&)j&eDQc*5%w=1zWLK|#0V&cNOM7QJ{-n`8OCg+;kJ3m&zAZ8^x*k;o znUjc_)01F-~4smRhHJg6B}ARP&6d=)~-amrwqakYi3nXHumrD^)b(7i1yW* z)>ltP-(5d0HzLI8S-%T8Mzm4BE$S#v_fBeV+Vp&Ttb}(w_i<5mFC4Krt>5O$lK>&; z3wZ<|JYEZrc&m9_F%My>wPJ;2ZElPztR_Dqz`Mo3b_gQvDSdketUi#j at 8}Z%l at Z#7 zAt&)K5iX~~ZFIQVx~Z#23r|%2Egic2gBo=U8Y`!3{wp4Y$9F<99;vxAe1Ma at VelV* zB|FOqEm57U&Pkvp2lK?m|{rztJ-O309Js54#dzKSF~(xw|U`8q!A6sbEnHe4@! zU;iMNimw0^w9i|-P3yRqJtHjkgp$u>esn^+9vMhL8sYZxG at aH#-s;~c7??Cl9IXGP zhL``McFzAbt^fBZ!2h9#b5w2r(!&UT&B=Hxc+DV%z{xFQ=DFr(_HNH7H}*TgCbvQ& zVDA0#4CsLX7W`vTk%YZ at A+S#kxC6RWuua&cGhbkMFdme6Qz*{&Ox!&5cw;~c&06h? zOl9eH>S1IxlLU5HftIIkv+a_Z1`U-NtuE_SMRlpvE(^=i=hRDU?CzvI z{gENk81W2%5hS%bvOQ at 0dk-qZ9O)HDWdXr{W*+p~K7E=+2h8Ca zPTeq>6_v#(kC^Y^bUBxbGBiA{om{XRd?QuY=BXBX)%GCah}a|I1j+5i3)X?A^9^ex z*|+>N;+y*4E0mKF4@$?> z6e9}7%}3#Y`p4}R&>o0MeEe(Cv-Y+% zUnnhrZWPFDCTm)e-7HpEU&n|fMA&aezz%N|(B#%OFM6`OEBW;uoOTQ8F$Swd2 at MaG zOLfN%q$&gw5+C3C%V at f~t9x*_n8#!KH9Nz;JA;|KV~6kKo*Kw`R+uBiTo_}-d4MDQ zWZ-uWyfGYle=DH)FG{C}BL*}g(8Js%*0!SzPmDs9srN_URm`H9bdnh>4r7N1_-_3Y zogN)U5_?dcs at Q6*MD?YuL6yzPr_oB)n at ZQJDqVpxZy@bRq}XssE2U7+_8xm;opg%kFI0Tk+r5d% zfpHdPnaR~4C%(gDTXHdfMqFdK+coXeT;a2&=*t~5kNFtJ`ag_4+HlJVeAgCaOnUQV zZq3?RLn}9oM^p~|2$LSJMkMKIC1l!mm4K?YZgOoAQ(|cz#U|aTunrq?=tc at hAazMS z6U@#T#ANCwA4smKuoUdBP`}*3;Y(&7PgS#5(Zs(Q#?U-MTgKx*}jx+|9 at z6`wde~QBS@!+BtN|>9 zhAmC*lVn|r(O9wa&M_I4Ma})pc0+t)HEF5D at JjlgPN%#}!gV7bHabG%Urn%pKl&0D zv6O{bvHra>fr)3 at r8heXv2y58iL~`VHi$OyEH3?qD`t|TY^_3bQlo-~%Clo0_C&Y{ z-yy#)XR8A$w{cS}%hA+=k^T6%&6Uc)`U{b9h<=U{0S`1LHZnYYXU6Xfw at -1~H?ip= zo?-Cf!0N*}9;+v+09S%X;im5e{3Gu!A*4(LZx{6u_v4Y5>=cq`${QxQmYR$c!J*Uo z1gvJ$1Hb}m${7uXqHwSQW#icjye9~c(+Ry&7(w1>&MeAfj*+qydYp at e}!4aBX;${8n1K zy3bbz2Aj^PZ0+YyiPezHcN9KLX)9%(aS}m(!P2~fS$e=iO?tsjtxyklW7(=)ACgM8 z8&$)(s##MJQ=wJ$QndLI8S4e<6C-g%u}TX4^Ddbjm*&$E7nR}A%9xW-Biv^o!Dj^G z8|=a(d*S1(F-Je57MyBa!TP{#Q|8 at oIgVH8RN;>?j+@`+ZO*;qd|xO!M)Y?-IAV=E z(GTJKJO~D-KDed{UjJ4{k`&SA{IB`v{1E>sZ!`Uaw^eNA7ZgzZt}&ABhJLUF061Ls z^^)reU+X1>03>9>NSe=M^zKJYQtfV*+zI|A(A|UZ!!utL2W=$?YRxq9rCntw+3!3v zZ7;d+FFQ3mKvEt>LV|RGj)$rwiW2#NGMHS_(XQVD>a~UWgAB*`nR=<0s$ni$N6qfL zt+sXgC$iEE7B at E9t=ecWJbR44m*L8)T5!rtp>rmijTa0w`){8N!qQ at lQ~*U*>!m$? zwYeRAA3ni^-A9*6nJQC_L+^GSl$#1WDpQQDOS{#S-@@iP%Y#5+O&1TQ6U83w=+DK@ zKYc-aO`$o)xp6N-2$L#t at 8orE-bzbuZskbv|CnPq<``>QE%I+%lrOhXJ&Bdq3lh4{ z*sN{dv=`TAV<)HGpi at 8sN$-(FZP5C*c#0flm+8AP4)WEEirye2s^|DFSB&u%*t^>f zu;X at cNt_WBC|McJoVACovK_gR%q;t89xr5eHT{^llj&$8{t!0TA8`I{DY2UxhO*4s z*((iR!_o->Ec+O5(Hh0cwad;yzsNB+kBJ9Yt}B>Q;9|>mE-`?*iH at IbtTe@tap4@~ zRBt{EFGLkKWXLU;ga%|b5dS5 at 8lgRLmslVVD>D#K7Z0B%d;U~z&AD5cOIaexJ at L2g;3+Ut=stUGKm1 at f1gG*NZV}Glu|t-P?0Sd;@Z1eX)cllgp)&oc3eCQugu7ZS*8GrgruZntfiVsEHc75Q&~M6nQpK=K1k&FA zzqNvt;^Bsb{T14x|8ZzD|1-2VCx0=5YnDP?gYp;5dfBSQ*_RAEG^ z6m#F|8KoJVE=SWUK2)jaqTUpq+VE9fmoY>@6u}~K;>^uvIR9c%|L at PYANkSjR46D) z7~+beSY9xsG?X5xL@)Iq!hMlJOamGY7JoeJS1{^-#BqNGUbqhW1-IDr<###b>@C?` zzxSJKRA$+YSajHJph0Bdt`wx%!ZI at yqWX2?7YX60PSgd-hQ;*%SVqr+8_VpFw_KNmd_8XZl{v81fcd>FZQIoKLrnh=PXDI83L& zZ;;=S7>;IRb#F_m?k1~U)WdKjVd**C%$s*UVyj{OC%jOcNHrS75o!(0 zZ!w^#JEAOZTjLg25!9R#eHTWOzhb*v9}zJvN4>Ff$k)&&JQh=D&wdo`* zm$I3*jreS#nSR3Od`)|#QFq5_otucm<%N}Jq&*D9&T`a1cmTFj(!V%-US~NIdl~%jbQ`M-xhlxC!HNGY6}x~un8uTQY+WqK zPe6*^7j(g&;Er`Xqwt$?Tu^Alww~1zxgS?%!Mk*X8P?N!76T!1 at B_oxiu4og5{#HX z;bT6$9i>1n?|A6fe0v-uO5Rz-RPG3#l1=O-*l~mQV0u*LY7C}o*CS-n4&$)RxH*6sd47WsQ3-JMs%ko&k&fV@}aab>U}%~BHGvA(nk_|@K+>gARrT* z|3B5oe+lk?RBkli{ZZ6Wzo+dI*S6q7$WZ15phtjqL zupQhJmo#w|sQ61tJNwkOO;lQog{kt=1PTT4sJ2yVRqH*&aVL|L(|l%Z4F$*H-Z$Ca z*DpLbobLRd7dILa=-eMOm>_36uS zLrW?yQmSQ%Qpu^5tg^~X<%3VZ`sSrSj3de$f1j}I at 079loiff2d2E;J(RbD39^sw;6`>s7XnyUZa>7}% z;EnA`PD~?o`fM&Te3atOUPPEN84jfx)Vl0%_hw6$=jB~aVgka5_=s?jDGC}N8KbKq)5*g_{I7k!~LpioI z%^E-Qdg_KyzR at TErDN-Q5@f-x%0D~($nE)W~!2KEi z$7jQWu8Le~T!bi#;J)_v7^SFsW1x%Hl4)~rtvUu)cI-GCV>^ACj21341Fd=46a?<< z5~HqkaTyrR6%Ac5SxWlMON^asYIHiRZQ(}D>VeRuJLUKin17bnzAdzWA2)~=uK}qK27G&cN^w|--lHVOKx>G&qe4F+9>lFDqQ5DVuMbXM z{4IMY at g8G5S`t8-17zOLw{KZ|eocq0$g17R#9wSKx)&}tmKsxe7&>e=9`&v|q~`!1 z$!XVou3x`n3#2#qwJgNXN2E8E+mAuo10*liAvGM>M`h3(=_}NKCqa!Dsrf(>4}#PO zQGOe7)C`&%(}X-Y`#_cd;+ZwJ&(rPA{Z<$88*#SFz{cwK$Wzj{D>LYN+{|RQwscne zT%x}{UCBo)0)MCM+z0n;S^avrBrc)EPBqI4kUd6n=G$0NpQsWbVHcd+;@bb##Wbs_ zw$`=t6svX{a1u3mG&CKT=$aCTIyv#IVBGkGR@<}CRYfatm+02IF75rh6n`g6P!!8m zqrWL=SsUoJHl at 3qVs&T3qPWA%pI?Mn7vr5q4=&9iW>rVqw%T^kw1Pv5g({GxJ}CSQB`>MJCZDX{@Mj@@noZ34Yv-*` z0$O5KXoxt2;jT1?0JSpgSYf&rl#V&AB=O*0QQLMrOL)Kx;b{<|MaGyJY()zg>h6W@ zt1#+bu-t1D>Mp!W$agyI2aOPz{!NH~9mvOC%I}mi7AHjeEE`Ii*ZM4-!OEr*?Mny9BgDF@a&S3IUhtjzE+y-07I!(1P~K!iYTy-a1B9I=O^N>Er^p3~dxk^fcvJ=ulc(Yiw1Ue`F_DT~*qmHBrKbDtYA~aYd2v299;MXCuig$B|7kVV at skJkMtm zd4+&LImTI3{pY%1dRZ&keS+3dkY+e7I&IQnY#Y$^V#AUgNbnf4K#ou<4%U{wdy&x!{dggjatzUXK6^bHK}8JAvrnhjqj8)A8fqyvDg11d-F= zKtMx?|86kvKhi8!J6n4bOEb&=TK!9&m7}KZj;xCEMJCBCi(%2GiV_ckIt?DqiOr*MYkXZk`2>d1|$WV7(!b4|BKEv2>kQ691NT#gqwp2A|mU9ivxXul* zT?iBMGrgDV at ipw%Q=$ddK6$E8R71aLDSl|5o(v+>Mk7u^&gs+^mKCGe3KXkxx3WH- z;R)>GF_ctzlfb)yl7RC0Iny`kfUfS-*q~-iQ`pa9o4N)@irYm=KfyVo)`Sx=EV6mD zA_N0MHqh}$&M)k>&&zyMH?ELz4FzH5HapR!xBQ%kbEcK-B4zU^G|R-~_x28H+wh-@ za(xqb4$91*@v2Uw2J&I0vzF{X=?_3f#aouBsLNBO4D}LZ+s19oT`_*0#|r)EMAenpV-AZYq_W0CUGur7+k&sOXj>gLbFHMv2o|fT zB$NTra-(<~)FZ`X6~j!la;~TJ_4ceN1s#&B zp=G3p3{?BZ&@T at 9y?al)C$1CaOK=NjM-wW$c95Lj+J>y%@wY^JiMP;vDGbv;e8~2I z at uWOZk%{=yZo#{g6%M(aF;W!zLqaY*l>5~^266EV*i8=N5bipyDbARRfQm;tv#RmS zkD1;g$54dnEB&%kl1WQ9GZ}5Rb-;0~KH*rDtjtkMGg za13g at I$z*jhVU!Os-c)^3Xh11YxC~xp?%v}S01L4TV&PS(PEi39j;u6a4g5#WhP<% z5;wqA_~Jy|g4Jq-f}4jt2l9RA4aIo#44r+$e8Y-1WS{b`P4nZw_}UKV%X~Qis)C=l zia5rY`dk}9s3)!jd1uwBK5 zes+VrKC)s%i8w1buuJ0kbbKYed3$4?xrXEwi)iuQ?*$gy)rWpH0{%S_<+t8J) zGDDSUIMKv4(IuPejZM=dP>;+ZS!B+6eD(o-_h$U~g#l59Y zST|~gvdAv8BR4d&kfa^I*FlO at h9f3R#mB8E0E&}a*fB{wQq`0_wniTKB#~_GP7^L@ zFV4Ump7*n1$@Lu#jIYmms`l-`F5ZX(zd{ARUGn`C9=m>(>aMnofUaJQNDF at IJ_K5! zUbDOIE{1a>SG2s%nqi&G_L}P4_3dr%+jjb1cws-ftOqPaf~jv6vyTX!p%txdqxU`E zXw`n|U^jcK?};*Co4xChY`hb%etkl$^2ygLNjKZu_C4bRuK4*7H+Go5p$Rb89 zH>jG!o!=}$IlGqlC9D3}_AFGj9PiW-+dPY at S9w;UZ1;6sf8a5(*cUCyS#ZeY;}GW@ zj4l4HTdXMs<0cXm2Rcim;G1mMDLI`d`;UOq0N=vJC8#W&) zgeVF_Wq|JkYg%PEA0nxQ`GxvMa2k9N1^>1i)%|LYGeZW9o#}Ko3b!`JY2I_=({W<* z{y9 at N10+^QQ2=VZ at 5mnJjWnE)f*@XvOWR6s2m(*SGg$1AgVfM at yNw=Kj!|mtF*s}L zsI1yZ#QxW2u0JiuTw4Zr*IA(5T(}`BT6quE$scARx1{PFw5L_Cz(kc%Z&hXH7CncwvI+FVGXq2k)f(jOhYqlS+)AE-U!+G{Inj! z>$ACw9dn!Zgy) zQA4IWYeCfsT=30gQvPbK-!GGY>u6Jzo?_hDkZg;D$F8gehCS7 zNW18gkQYHRGff*M6MCv#V&F}91ZmdUDGa0P#O#$vbD|ifr_}|RGleUhSA&^oZNGIU)|- zy=lFox5sEj8A)BR1K|^JLL7jp*d1X*@M4+IkRS2qX9Z&F?XUhuSxLA*A*4J?D{1S< zsil~#h2s1d&`}+Wws73>&z0}GMRa;)bl1x6UDk<@CZ_Tr*rESMqACDL0Z`CH zx8!lybF7$Z**UK^HzB?-Hu*bi)JMU;(J1~)7-FQ-1{)Z zqr+*ZJahVwba5cfbMFU>x%QW-6hJtdB+H7i4X5bBeN}jK<*v)&$0bq;9!Ntmr at i(e0w zIF6sLiw*a4pqM13Et}bk7%SQEE$}H9F7Of;bSdpXtDs9Y(Eio-%Q(f*^mk>HHNenuYTvP!K^~rJt8-7-pC381Z08&1Vr|~h^Bw|UNyFqu~kvNX at P}O zfl3HOE1qFD5Tq6Yw6v9IiWLy07z+evo9V`onzt at Xvvetz-ab{I`owX+f%JVWmM|+O zInImX_}=%U{lgF1*riA5D6t2B4s^NS^e=Q1GG81%e~K$3GJj z_d~A54FR3Uqn2x0g#=v?*$J4+PQ%NJ5WDc-6JHZkF$Qx_K9P?4MvqodU!Z|bu$^Xjzd zz~p{4p5|qLt&PcQy!TX1h^Yvorjt0sj!Zo=SC5Jk4De5w#^2J|I at Y0_gLcS+ zIgIfh{t59gyAViAF5mWy-=W)nF1r<)qe|oD$=95YtsjQM&1umxw(ULo&|5}%_4{FE(9du;byz2Q`^vgzpn z|8DS#Lflt^6WTq!URSL|Y1ECa3AatzLt8KHSHP`Yh`cH-j&tbOhB*4$ z6`&G6)R}gDe8p%v{@!y9!GS~tdPWy{J3?0FDwSMs(w9IEMb>AOr9n4&-m*>MG&Yw< zl3anNYCW_#eUX-!Hja`e4=d_v2O2^+1)y6UZ9Op*G^ALj!qv`Zoho$LABnl*?CC{i zCfO4H0kDw at 7VHdaBWS;C3_#X1wQ4CcGS_mq`1ZEqtN{`13~i8kvE|=}-q-Cs8F?4< z34jlNg~EsBcy{P5rnJNy8(kIHdKD39sLK_j7=W5SBidGAo#hD zuvC&up$LrNFe at EwMFMFMEd%8_;pC3&x zr*rBMj2bYb|aH&MS(UG)nnKVZ-O1U}g(H`_VyS8mvz?J|0F0edu0ps^W*=TTyv0y-xQ zHqJ+i(!}}9AH-N-JOcSIz=Lb9EJ`}d2%9EWW^yoCAVINadt~O96z4`@j at KUK)5ggh zkT^HPQa5zTsSl#{MmY3qYLgpkfD4QL&M7+hQ2Oy#5g7;gHH*Zu(SU=kq4|z-q#e at z zEILt-#aIUeTw0oZZygs_^>GlaRU`$r2PevWXfHV{4fJGG+hX=iNVWN&BbWokn5uM2r2 ztG~Ygvo@}4k1dMAYs{@Vvex*gUtnHIStxVWF7;klX3B`()esrmf-q9lz%TW*26en&Q9-oEmC) zcaOJ2r>^^j`V|P@>veU29FNbGLYxRq*A8sJ<(+WnL~v4-eRbWFLa1S!VSXZ-!ysKo zl*n at vQIe|Zt=csyaLXutb(V@%C*x-vGh@)l2*bB*Y4l}8>UvuFX2ejt(z=6iAEof@ zPgnX=tF0JO0W65t71871p^4BPza%5-w>W zF8nUC6c%f^wA8Q-%x4;R3 at L1`!qEoX@6rYuHsZqR=JtB1`{_ at SB9?7 zU>JAgszYPMrzFN#+7gj^#0M7C5KZ2a355|x!{EN#&^?{SyCI!EIsG1Po;_Yek$ZN+ z6J2RY(0%YMO`L~riw5b5vZ+R!$7adm^IVa~t`H3WWC`Nf_4asaO4nRtYG&^Y!p2=* z@;!@ln=t3^Fq2K);gaL#C5L{H-knY|l!rTS9T?~D0j)NGUDsCk|mPmVwG z-hUZvhTEq_d5jEX#$7zWLJTZ@^MbcOlOGX}#d2-B*@yUS_MkJ1UoS5^CczDnQqS}| zfOGSp_T`9#Xo)i6m*QVX-oDG)UP57_$+z{DO*>!bv6e+)ML_aIO>Ol>(0#E>Diqy_ zWo#caqA*&Lmb!b-SIE5MkU2nrXOngaY+J66KywR!uc6cwh{RIql?||uMq1FX*S^Uc zJPprK at QBxKfBewAbKk3FQPvUp+EJ- z84kM*13QYHYdrPwkKegp+X+drU%{A=oow at -Y&!d$9Qb`a+|;}Pe#KRjTOgN1ugfUQ z+%rQ&adC;MCxXa`)cN=3gJzLd*L3a3<_vJ2P^J618 znfYzCOZ{}IH{A&(#xhII;IS(XEM~dcQd^`l3QbXe&<0zMF)>O!$y7yb^*z6V55Z;@ zpsJ#Ga|aC|q0px2+NL7b0OHkYVU4e?NRt!92iW4Vukb at Ys|8e0EgwSkSX5hV2KEAX z+dV4!hSprWZQ8vgvlel2^JmJNwdQrE at R(#LR6U!N1sSpwD<>yC))+XX2u@{OS0*-| zxe8%k#hMfl8aYt|u8=Yj30Z}ZbJF^If0NN*Fu at 6qanVw&9D&=yK5rawZ!3~3=Vr%< zJcO051I6#N3_YZtRdA6DYXmK;^6}F2HP2sKXyb}o&PdC+i%F|*ah^f$IO4Xc>%zuz zrykK=Jhb71fTtw0t!a&A3La;6MTh`62T~pY!E8xi^|v=#!p&9Fj)?8_kgo1jsJ%bc zP%HAE1tbrh=)w(81g=M=?hGPJwsOZyr5u{D82=Az?-VRtwg+qP}nwr$(CZQHi3 zZ`-zQ+k1a~Dyq6~*B{Z*5vT9tiuJM{*2v5`=ExjfWbXi72%p=K-A|v#WEL5`{Uz}e zf`S+K)s7^~PCR!(F at XyO0{Evq6(B8}Y*I2BrrhEWwYt6e>4m1>x_PYTJ-&T5 z-fy7$U4K?`WBl228m at CrJGwNl)hnXg7&BEZ*kucB1n*Hcg}pTii}&TYE9Re`gM at xq z3g#7mc}DZ;7aN3#S*qqGPjij*(k3juBnuh2hD>qfzUME-*dVr$f?mOJ z%m>2n@*Ko0$?JY*&i_LEYF7rg8C(yiZVO0Sfr>I#B(?*H3SS0XNkQnvOjwa6J;NNLvp$el zKQv!&SbfhKhNbD at s`0SYa7xq%f9c_Bgqs8g8R8ZVscMKb43PnwYQS;W^hyt6B{$qE zF{h;W6~AZZmF|v!Le{|2ioLr}ER5qse;VlNBf7kt>Qrqo)CZglxb1hIF(?`t{e zAr(G75|-cxemUm$z^F}~1WKq0;%HZMTnPoggDlDq{9G4CIrnJg5KcQBe{?c_AG**{ z#|@5jl1d+`m*H~VG;IF at RLv3o0BzG-S1ooHQRS|L?B~27I}PsTLC&3c3BudW*IU_; zsjbVKbL*Xu>O(T(_ID1Ad- z=(IJNAgxPd&hTEw%qe8`XWcAK~h= z&mSJi8Qhmu~kui?Y=R#I%0LT zls658B%}3j5b#KsEiF>eD92$dEQtqhM>{!?W6ceCg0)t^(bO~pLX;vw37U*YfJo3p zX`%P^3HrRp9Dl}%pki3wwmIK;`kr!`-^%^_e&G6f(wxT+RePtkJ!qq0^yVBriNo0) zRq5?DJ+=l}1BK*4<6PKP=AC`+b}wZCAM*MmQTMJw7opipuq#nM;|07H9&#Kc4eAy* z6Z0jxp>Wsq)D4+`T}sy)_x83GZyGdr5G3l}wWSQYPCTq=FYT)K>$Y7gIaeOHrl~V? z_k2y6w%xp1^!)c*+ky9-`P8*zXcP2bcu;FPn%0zAG%Q+w>UJJ};;L=zy8FZrx~8q* zzh+}Wt)NWWQmVO_SpKDZ5F}iS6?WG4$)XS`Vu}3jCjc+6#zdMu-qf5U1LflnITXy- za^uK{C=8;kP8hO>DE~N+KMIvsv*qLo`{0iYxT#hIna({4V>Zp0-1j{6+D`>8>P73Q zqYp2SNVx`OFLvAlm}~iBNv1Q-slWj~BZ5zo-)uFtSm zC~#Vq$vC-5Gew2$J4+a1PVv;!Q053^Ibng~p>}#>Oxgy_)aoU~6Y`ny1uE}2wSfHw zg8p-;d243Ooiplu`Z(2KKgV3R+ZfxDchG0j)3O2$T+LLg$FgDmfMn`6xt)t11DHJr z40}T6N~Uu|Smq~iSPhucvhdf;;P{Ku7=xJ at E0;-*MI3i5vO4Y?lvQ%lsrQvsX<}!S zUBb`fYituw>4moh`>WeJ_GfBu>9T|p%Evq=<|)0P{##tfpBy*d at +G9)AA`qn-~^D? zv`2_(7@^4tKXbl$N4!OtUeLM`;4O$IS%>zNugs|q+?m3GC-BDB`n`1C=s)0DV z!zj!n5LSw;6bjQn*X$&abVbR5007)W0{{s9n^pUdjXP;uO4#BEVczqGf;8fQqXh|Zo1voDY at k1+Q+C8s#I{D5=slYc;u>*s&+Vk znW<|@H5?mc3oi=0%fGTO@(}%d-(T2?v`ThBUKYDBZYfmGi|{rj4A!s9Aa+oP&LBU7 z+J>+5F#1r06=AlZZYW&x75_}(3bVg;9AUM+ysUx|yTvQY547pXxA*Yw)I4IW_+yMb zg_(L-$24Ug8vkhPR(pk2rrL}hfs@|Weo85~!?k{W#d~gO=k6Gz(5{2$DC#dXyvwyV z&E at L)?uD2&SfnTFf&>57Q5Wwf9x!3i at itG2$Jt`;5xNlr6T40|btp5quAMk&Q>WcT zxmj$5ldUn-uA_xm61A`57?QDUQx(qw+dT^J2%jFz^D;)MR^j~hFy2V+Px8v)!AhA4AKr?K3*H(2@>U~f&u+GvyD{t9XVRV8uidE5%MhdySFO%u=?@v!i at Y zm4dG#vd?``K-Wq0+{m$hgD)fMt~h+3&ISK5un=W+;%qNH^M5k#z1x; z`wTyPrjIpBd)+zbDm`Y83?h;xsL3cayU!c;5vfDcQx05X=`k~TbiW`oQ4jwn@{;E& zSY&`mf;|`Mn7wwsd=DlX1C-La{F{tXb*DU*VY3jC;#Z`3KF{|uPF50tKl3ZHU?1gg z=3llBIf6N}64!oa)wyS=?!YAZPSQw(X>yx-rPu$-Pnvj&I&h8|w15_b<8r>kH2 at z$ z+!tI(DY>6rpB~-bJQ_&o}$8 z9TYYcOKu`}U(YbU5m7+uAuZrTx??)^H8 at -`4m8*~`%H6fXULpcPj}9WMwN z0DwBe|1J0D|AHEL;#jd z2k2liO|21CTrjOaN!Vc1l6z at N*!**~e!lM*(2Q&Tx$tJ${zoAVagsvaP2-x4DDJ%Ak_%<&Jp{eCe5D}MMv at OZZAE{dn}VeD`=>TZf> z^CWgAyEP$C0Fn?Wm3<2V9 at s+!VUe_|rb=2#6`l2E?Kcl__i%%?oU*I1N-U{jr6l0` zUyQDDQ&l!Ij8}4K>%*>$TFj;-+VQT$Wj> zeP-^H%sx*(cHz8m9+KFHUD3{(D6v{8K_$Hz+Tz#2yIw_Q*iItai7uIlwc#p_M3_ph z>Z&Y4tQ6ZM$7P-FMAY1YYav<1_dJSM0jDO_{DZUsuqt_)REZ*!K3)X at HEA7@PTP>f~0KsfN z|1Q^oIH_&d9-Y?Brk(jBwQ96dXr at 2XpF41H51>F|1`rtls1o|k;DBF_0rI#=4jAGf zIm6sQvj$@Qn$u7jM>9OLPp3rzJoz0VQ$TeFgb`T*t~_u?!u_x`P#uxlFy!tYsf;-v z@=%};ArJ1;wI*L8ZDl1(F*uC%X~4Of%51|%ii?IbuZ)MJz_8ua+Zv8 zckhBqgW`Y18A2#thMs?K2Ju8H at CPVnMlLKt{k(v at lrCVrAzyRyd_9sk5j2BwMH6s` zFn;jbuM_(9o^*GG&CT#XPUKxe#y<&o#XqQ)s4g^QlT;^T^2EYEcj=y#4JKI%g2j<> zO!G!%+$+=1KXLoa;iTB{&B$ynpk)@9h&rF3I2T=)M!Z z0{bn at pm+FWR{TZITl}l=p8me(Ob3@>t6OEDV7UQ+Nsu<+STe=}x`7$njFw6cE|3Hk zbC?~HIBXaH>mg*WSJoKq60)g0t6A|+v*HonGJ*I`i=gc+VH38{^fm1)-|WyV;u%iZ zdQUXtEyF18D2LpE3$pRH;juGkxMSA!g;WD3zOuX*ffMbDb|1vc?R}Y ze at -z^Td?7`)wg+s!Wcq3ri;$j!$gt$mbFx4 zeEMPYtdt^gUbsqByqN1tNZ*Wg5$l$yJ6fwE z6qyus42d=N`jRV5=~9T#iK2X at tvkgF>Y{h7pKEM&N>OboN~@9BoRfSVw{6XC9$=n= zc8?}H_dqmv!1V5|zuDYchNjnax0yd*9?;)g{o7yqI#moqVs32 zmqAvt2I?dzT)*A8DyLoFBz5xw|3dvx`Y}BO^Y`PM=JWz9K{JLqOqiOPo1bNxo0r>Z-|Azl2Lf9U8#v2ydf(03JC1_ojDe4b{_tcLo!OKYW z=j>bhn&mWvGZ|`}=Uv`2uxa_B1^d>4lWjr?Cz8NL6n53NMr=iqM-tr0A!Lo?V==1? zlCv^pg(#&2 at ncz>=qqA_)HR*AIvT;0QnVfppZG))4{h&>$i>f1TyKl$%>>I8i&8Wj zYvyi|cRN*d${GW0>dw70OOX?MY at Y<^r{N6yj5 z{MuEe9Eq>DE(|}dR+ydLnD(r?QZdRA7_(~OO%^P&TH-{#Ev|T*JwH>smqkI at d25(k z>_B)PEd^Z3BM z#;z2VF{J~=I-sX$uI~`O8rg=B(DuHUEaqlFy#?E`G+?;VXU18Cex)>`!?o8%=2-0ulwQGIg2cmV;tQo64qA%Q{+#0;s*sQt8gD8F~^d zdVbCVIsP{^PX6*kA=Ruv<8C;|Q3U*1;22pA? zFuB+lxFo4W_fxtgLcruc_6akXrOaCDcLW(alvLn>!OHGKP2$uv=4eitiA4sp%O#8K zL{?^Gky#b!$Tdn at jq*EZEhuUIX z)3$l**=m=K at nut9?tFHa7f;hRAAq4iR)%eEt}ENKxV%!0nF%u7<&E)J3XIO8N}a<7 z)^y_twcY*4&PUp?yRhaQR9#qvG*@tJ$b?cIekt6s=&s7s6wB6vMbx+nPtNiTDL;ud zSYr4tAuz(Fl-n+Pq(x| zMR8-93I&M_IewPc1kEskB(BEOIcm-$AWD#nX~e6F0Nn)`?aNG at D=yi~FgELIaMu$f zPl{`(P==kRPud8zsmXMlI?ayY$5-mJ=q5Fd5!D<|J-TV_lXJ<(sWGZJ+{SBVjR}pC z9+lL`+Zf%A{`?z=E*MBgx=6*1cI?_xY at ZOJHBQfUaS$3p at uGhknkH^7jc&^s=rW5le|I-xfJ0 z-63mZid&ZoH$r!o+1VrM-|-3sAZ4I&P7o$SI+tBpe8J{W!AIs!u4w}aH^j9tdQp>N z0QSLoC77z9tU6DkNgkB&<#j{fmWN}Pk$f&p-?Qg+wQ{cMUVNmW03R(vQizU+BAi{I z|FC*z_uRt~UF!xK>@ePX5XJer_ at 4$vZZX8Dm-_aqk0bs4DU}tF(L%7Dg7BDE*1CRr zO*zzy4jw~(Mn><=KB98e88T}-j*`e8S_tzS7!U{MP(Vy%BPY_ao{t1A_~u4ml?TYx2^LR>hjMu6oO at m{;%bVyx04{XKM zFFk&Ao(gK5vlh0~7aNc6NN4a}9`(&(me at cg-oa2ct%-V)2HB7uURMudCRJiPa3I5( z1xcL*97yk{h~=R>3=z($AmEcB{zOP)^tw&SkC;Z z?S;QHI5!PMuN-mFeo$Nee>_y8TH03T{_5}vYYzV1=LY6(f}DnMr4` zpJ#A8Q{Wu9vPD%zOOe{P)k?b%elsjBz{0va3ty-DuX6Y2jrZO5wxn4ScSBaI6W-T# z^P790^X%>!+27y0Gku`-0D9_$NPN(TtmS(8vEmM$iNjb_g at -Z}dr3#pD17M$WXj#T zVbvbuTK7^9`KWxUhdz|GlJ`s$esu3Y39H~tN5U7sN?rJpZ^jpXL_7MDS8IabVq9y~ zjbQ8|kJ=Z%aw`7%k^K8*DE=^q@`B%*f+Lp3R?FiQ9u{+yzDn^X%#9u)L4Kf9;>Jgk zyvefIP?wM5;BdFM_$5*+C3tgKrw&wj>_wRxRFwq-#hm2jcG3fZfx*UUr3H!8CB|Wx z!?d7*H`g+h^I}Po#Jo6bvP%r8Hk394#5>jUE*j3D1*V!d;4aC)AJQcO#ECwU(^?>< z>r~|WA&ZUVSyCdS%9Rfth=$CGQcX?E#NN#hGSe*-*N=s#PL@~~8F={2i)6ff{Esa_ zrs+YcLzN|&3(1*`g{DG;=vIjxJ at _BeBx%J;FNI$q{3C|SGo;G}aW%ObNk zui%W=c0EB2^lCiFRA5FE8fFRu$b|eZo8+W*kXqQ+AzHymb$jF(L)&3d-Q5IC03&xVp?Sh)V6#!6Hskvzjshql36`wpBW+32{TRaH3dEtc;*Ni zIHwSrZ5SxWQA{<-zZv{_R~x3chGoO-;^xxh^WYk at i0 zguiNKv5_5ktfM$UU_VW2Ho)z41EWRRT8V5(m6Ca#CvHQV;}LgH$;`+Rqp-ZTJAk{5 zmkMh^BwGynY0}`ag+cPsszjm((e(MU_ z`ez<<3ox*_emc(-7m5{!Sh(5h_3I6^D;y#y2xm^NZIQgOg`WBwoPxx09U6}ud0tVt4-DoDJ2e75YS_H+7o8QLQ{EEYCRa zh^@gF%h|T;Y+bW=dM}5dcQQwTizGuI&MOh5eStkt2)ZB*cM%c5p at R;990hcUNIy<& zS_Q6~2cP$bPcl8v>~3rAvTv!_9aRYPzFbYmyUpf$&lHyO=BJ_d+ at Sb?)w;WR#pRl{D71sxs@;gTMpm#Di|!m6mhXtJ+-?+g zHs;>0E51GYMAMe(gYUEw`P9+`*4K)x%J+du?OV%Pmsh(kuW*UcV%w%L^&zJTbXS42 z2#b87EWpu6zJiSU7Vrip(`{yizNQ4f8XZ7CB-}wiz!b*a3tdw=5z1*NI*aeF%em9s z+Ia at i@-?OrG)hV2yow+C5pfG3<^S*}a0qT>lG3}lLTdAgwa_EnM8i82F5QOGA)Q&7 zXqW%kTup^IhirMZ3>#Q487qx~HwnjI9OtC<Fb1ff* z7#B$K2Aa8UCwpn3mE at tN!}d+#ve9uz^5+0MV7uxYy0*iX=s6bY48dHQRG7PY(V>Rb zkh(quE}a-zCG4olBP-)nFN3UBQMyzj21zK)WNH{*^k9oxZ^gA+~XL>;oNMUZb6*HQuNmpV7eHi`vb|I~SuK*(m#bWnU=Y zOBDFgC at 2Q|so^)A={FVitl<|FPk4!1Gsfm=RKpRmsz(w_J6y|0r;EePBn at eR;7 zQoxtod?CS z`5+$$#WTIF=sV(%l;k!n9)qK}F2}qo)e5q)R$=v*o`BcNMICWgFJa+{VW2TA>weX3 z6ZptDe}rejB?NG0zdjXyj~LN44CwZ0il+^Xzo{Eaxl7`L;9t`(bV=A7J{hnB!9sY3K$6&3hrdlmpg%mN4Xm+pP?!L(E+V zKav3W5Wj%VL>F&O#DN at Gt|;GAvLafJwqhJ4&CMJmsvcpVk-ixQxm<16T?FZ3qM%OZ zJ^OMb^-|?d*3cHX#p(jE^)8bK{W$h5Gc6NVkWD;-E zFHZk4Fojl2K?Y5tT!*z}PnZkzkXK$R#lm#I7RzzC(Nf1!S>iSqwk#4{T*9>{b&?^X zkZE at a|F%yW=KzUUNKvrDcf7{Rp`X^up^JP-^kSb_1h<5hJ=>13)nNL*WMds{C zWUEPO2`J at f!#2sw|3aQteO6AF&ocaUrkU z;?!pgQs0&w71AvwR$;D7+VttQW5w?&R;y%9=W!WcL3 at a$@Gt0tiy at Qs1L8P@^W>J& z{JH$$GkTqr-`Cu1#rV03De>vu5!Scu9)VcT3QPDGyh5C|JNOg|SN!=X18u_C2)3*V zJOaP(ew_D5#Fy82qhAfaqS?A*Pqa1Nx%|(~Lx8g&UH7)(9&9ZbXg!OjYR*j(WEp)v z>L2aHCRg6{ZM~?7Pf%{R7-HO5l!s30Z~NQvK}rKec3aP>+d9FlmxcIH!w7vOcSqod zf94OT$KXq2fC2!h!2tk>{M)lr|HQ5TbX)Drj0ttMC;+j9R<0{yB?%O?8f8Ziw4^;Q zND;L9(L0dubZsz9lm*H2as7hweX#Gxv>gU>%>*<5Li1g46wg+`U&e58#hu;KZOwp_ zq8U2P&2;_?!?^RiKOXbt`9K-MRuH%v2+~9`*R&Smt_ZdA_(AZ~gvJdtuhoW=P|Mke zZ$Sx-XsL}RqD&=6WijcQS{#OG>`Xf*987-Oyu at YGWM$=%h)3qL7M#MY(xP=nr(go5 zh0+8wSz+{YR#%iF(=o)VUKaD}p)W at RN>lXmq-o8Sk)P-0^$ta4SDJe?7NJHbuVH|@ zC+FF88KlarGBj1`p8#_B!wj^TS)79iadY*lkCQuv2+N;HY at a}bBkG=5m34X*R%L1H z?MiGQx~z_q*3|5mEUhS}_Vej#oDa&)?nj*bQqj{_RC77R&!DYC#7R}2cMLygw6Q$b zk~f%E?NFh^UeWa5wg(tK7#Q$M19 at o_NVHZvXPv7g*K#cvS*3*gY#wC;yJn at sZmrbY z*xYtHodjC!z%Y|$1YazsSu#1)OC5pa=~7{njx=ja5|!6hin7kg=;biQ22^CJ$fPvt zOS>~wbj_R^Yp#f(LQE*QmR$E~g^ZxKM5P1$4bXcK4TM`IO8eL?V|XN^rAl zMf2#l50txR5q9<->$J2J?awc<+BYMCn0EzMhB8Y9v;?cbv3ia&AlQ at 4Id%hbuD`mDMOAZT)*ZCN0kyh>0gQ=qTCo61g?!qwj(0xAwb z_7oW)%rWNJO|}J5goTV&1T}MzAE|=YAGm at Zag^@^(NS?k$$`!pBssY^aE>Q%3Cx>R zz~sVOr5+3pnH}@Vw+);UEHqF?KDe-HEh)~(RJTzrpO?2szTQN!IMNt&GMtU3I&##7$S;8hVl++`p^bJUU?%GEmpvY<4 z12LJt!(^gzOL0h!S?tla&{TF%r#cM47>8I?oAgSM&;n8+b0J8WMUYRo4&MrX;`G^~ zODWu!+S6i0(H`|js5%a(zKR+T7jHV#{1INJ*NO0j_&XE&)z}R&>^{y6F*=rjoO&}N zV*1XUluW5cq|}R2tcN~ec+m5VYjWZJEXA)OVWa-F6YzWl2?hKVQn&{j%)xyZb|ASK z+kL+4GA~-S&?-?8v|>pazF at 3KUxN?1Di0ye?`y87rNAr7VKu)G`w~w$jb0-cFS?pozO{gci z{w_Kb#0MF@`Q9CRw|E!w7ak|=cUba*9!ApN8_K?InaKR@&W)* z$?EEZI(|bScO$?yZ93L?laXB>J>nS5_ at Udv+GbA9e;(F7;j at bCM{w;CRL6;C?_MUb zn`3+3>O$iLFk~T^cXe}lQ|^7d-aX%6d-(o9{X9L8Lij#YVXXi)?!xpoAdVE< zfPiel3L$4Uts`ORHXajh`VEHBu-SkVpa$6j{<)V;B`KA9>8vj+n^1sFas}k|m9D}{ zu}vi`74S9uK)*RPlcPw1=8Zz4)uq*0YN{4k>8!FNl8P2166q{E1>K}pHf$)ub&}p2 zgWQ(-Qq)OWviy6V;anRVOn~-!TcseMP)$$w;(>P zVS?})TId!84BJ^(2fLPiBie#_Tf5_S>CMs at 7mDN!xNbY7omEm|!r}^7xVhao!$05T z`fMu8#ipHf#*^AfbSo8tFQ%$1FcbYz!@xKvZQzy at Xl2o`qJ}txZ7w!#Lqi(p(}M%S z3Z-Cy8yV6}Wfg|wlbPUV54^m?h`I(Z%PWJ}_~XRTX#X~2b-AVZAh zf}3$w at cx)kr#JP`Zij%$1)LEKg?R!gtLK8Q<=g73)3Rdx88qH)8PpO#Da9_CKQt(# zWdg66r_8R!z0{Kqc6{B`cfyWFr=6s0D#d1HZkKav?#8CEgzXhlH(k}d;|iW;tRaFK zphg@$pazPBBZ@!>mCx9zfq;|%E1(&)ewPb at ArbX}$d9}y(uip(XLXl=;hgm11)2@?Ao{=?ukS!1h%rV;6+8$0GY^gUjmNq&zvKJc1i6nWSD at WCh%9;|sRPeU zUB_x_EnB<_jOPQ!H`2K^gfGTe7vLIz4Ko2XnbBSM?tT9aJD3PNGIuP*A5NIXg%&e` z1_^Bm7F7%rJ at xpFJgb)`^v!o z0%ZtUp>x9^1T_$$;V>Yz(NGkJL8gkRRz;RL<}MfX^xSzOuih9(MiC^LC(sU1NtSr@ zt_t%Z>qAIGga)DL`}Ht$oCleKL$U#J9-AFAd~Rg-v9iWHpglhD`Eq)?m)>sJr6+sF1(INIsxN7kCh5A2 at 7fb{v`^tuS%)E{WQVLSZqe_Tks0Jvmq0|5Yh zga6x86N1jNh7O{3E>4#Jkv#D~vnOg*ZIzb<5d7-w3rW|39*s~%Yc!yc1W;0;mX%Tp z55tYdF!@8D$wDNN$s`fKRk?usd>y{8(7(W at X#&GaN8Dm2boIFTFK_O#Ec?=}nlbDSv+;|SA` zse*d#G`A+QE3TbW3<-OxZ>pt-m}QSrJJKq>uC>x=}58knCS?h1p|;$0cEgL_h}frr1XIGrpL&lVFIgkj$szN z4ew^9Ju|tqu3IG1`n#(t%@tf>9`)G3M&&S_v&2=mjt!Yd4tF7ENDyV9g6fgkI_kVZ zI8t&goP7=h^Rz3~9LKHmo7BCn3mJnpv?xPui`pY2q+StHXL^dP)F4dTAWoMudc?M6 zRva+u@~5&Zi>Yf{-7K=FGk=baXWVwH+R`rK-bRdyz5$X{qD>$d z{Sky+?%c5z``PAt8(m4k4Cbm9{C0v@{poDF0M4B1Pn*xnIRm z_niRPD8WtBx4OIDFQ46B at 3+sdxwm`(GldAEFiJ)f@MSow=yOgrvZR4q4|gw z%uU0pToeDd2nvSplz_Vmhh%lvbO7ZG$G=ChX)#r$-LBy|CXF8XhAV5FYemFFGtRTM z^)07u^AQUTwcDSg-$8H1Et=oKQ}cUZ-Y|l2O!f$GxyJduD6B&{{70Z_uXwdAuGLw- zot?69C8vKm(n+^G>$y>fs=($nYE0I0ne>@N7+qTN9#b@=K)WqcWxK^ps<(HVsHyS{ zG)7Qesud8`7lJ`S6l>Sq=9PB_mA!1pI_C4AGB|;79aK$lwTZ z5=KF?U!Wc;O%O}7rm;>OnyfiQ7l3cs2#>WfHn9SAT?l zmQKLac~NpmNf6IEn(%N2O3G*VSM60F at ERyi(J0;(mAEv;~cwAR?Z z9yAk{&TX94FkklH$G=zR-;W`#VCEv;`&NuQyA5+C#*Q(-xaIY}_4K at TzUA%q|NeNY z2N-Qc7Q$fPV4yER0E!Rz2~`;0L6GvG5AoJ8i+}5G2>L+S9Rs&{ zSLhc9B7y5=-B2KDCBbGDUAvu?b>6pg;$SYdW>sFCPAXY7<;UWO3(P5^G|Lm_QCv at G zE0x(%S)NX^F}o30U8Ks?uEuuSn2t;1crSZq%@mdwTsR)_a#dxETC9 at F>I>2<>p?Ot zKMPwlucKy#J4R#UqC{?ait at _YzHI zCQ);ZB~vYZ#&l2csE*Kt%e8KzQYTpo+UOyN`?cCh!Ds9cZyO_A> zXgSoVu8=&tdH2#2{$)Z_`+nN*(Ico*9xF^F6jvgq&I7kWWKj6V_A>oi;U}-UFV!fq z>_F#XbK%4%s5WksEZ0<*nKU%jl;9xon~xPDS9q;(qom3SL&n2ywT-Sh`mj?bZkL1< zlb7+Xz$S47c3j(4k~9NQxbAYxB`LVgfRHG2p!pc at jkXwh_F!wf2OOT1-cHUbS>Bah zSlVlcVyYR+n#9n3oqAeT1m#R5<^am|kFs0lI|q0}fHe`_VN!(QI1nG2;s6&m3LrKS zUm#Thl~6F9f$}gK3?ge83+S?_jIs7GOdBZAvBOVF0*4MS<^fQJ^qY6W?1A3lvOQ$| z>)@t#MN1+FuM7t2HP-6 at r-m+)=!ozP{$Pj)R-ER(Rv z;fCPyY|n>kgmW)njv1LjqZSNVvBiE$e{#GzdS9^tl=YeK7 zfl81nse%@?f+iOw4s?3O at N}GAp1gF0Y=kz5AVCBxT7qN8UQ&9`o|Ahf$;B-=dU@=E zFr|sR{Wo6g(bbc|Ray6FPZ*_bL2&I5IKp>Zt{!;EJ-DuqF^pq=S3?{p1~}Y8%ke_X z%RMU6HpwM(kR!;2=MVq7t_ at UfkD(oe*N7Uz$-*Yqz8KAO{}Nl)sCi z#HafaxRmPClZMffFaj^_zW2r)?} zB_tAC=V31rAV7>fAWQ%uA%vn}(i}B0bYr`o1`DEBQ8~6t1?TkutQCS)(vj zjWEW85f)sE;E({G3La9;qDKnN7$)2!^-$0}bfB6A{)h+X^Z)`LxrTSLdhES%EcyW? z at A#mSAP)4QC7 at r>)JT94WcrSmAbx701yQ}2Iv2^>rr= zajW$vc?@eh93$Z(xi{@Xii)mUSW2o~gPXk`oxlc>p`N_*BCG~e7-kdxD_m{?b?tCe z3lJ8u{!Y%idU8|3W$PYraCd`)q<<}WyWU~+Fl#Yi4u-l?&{Km{Qq-PF%+WMT&RhGO zS?tIq>H`>A%Z4R&`A|Id=U7`n+ at 2;gB90`PxC*J%l&EsSq>SQ{&2HQy>8VX$F%@w` zp~tm3z=|Fvy^NG8n#w&W{aV6WjHeK0~}Q#E7EOPF5O=30WfFY&Egs8lw2eQuSm>VfazPSj}iKlL=kOUqTeb~cliPlCwFK1 at tKEzqsJe8M*_55EnPYILlLb9Q=cRVmRALqc zwQA~kAtnhIL`jN>bC$OpnR_PK4o%^Rv*OH6izV9X(+`Rwe6dN&1UYHh zrMQXDs at 2bwlxMfqRkrOx0d8Znv!$S%g)>5zCqbs%XmXT;-Lvy+g3V7v z2s$s-0o}x?X)HV>RbwQp6=}6ld$9LBu^}*=wBpE68DWf+C;W`mW)uyw_dHo)s!Piz zsR4G26vn7LM7L%qmKVuxzz7d7=^jW9aV&{wmJ5^c$RP{<28 z>iz&DJz+Kad`Ba|Yg2h4=cl$s|8SAM^el}~=u6CbFT^QJdtRz<)1q{qW)a86%B~aQ zfQD97#FB>0IHI0_pfAd8lfG^GJo;SjsTGIhw3eW~hlnW26}(pXJH at hfvr+3P;6em_ zMilf^`^Ro6;9MF?tSQgrx~}1Z2&zsX$E5&7gRakPFo6aeTP$3Bkg!(ZEg{A$NbI#H zIb>jsEjQR+{Z3pKeg98LK)`9`62-N3o>iw$noLlI0BWXc;b>0nK5B|nL^%SAe6frV zF7ybyj(}Bj!1AU5$gMbbzu}{t9s(QSb0$C*J)uTGS|#%jt#WPp%ssS%q*!VNn>n=) zB{BM5$-RA{lFt^5Eh*=93Xx2wwrHW*{~+xxgCh-+^;|JCjF_2m#LUdh%*@Pcu{2_4 zmPR9HW at ct)W|r<8pY^@F8@{%W9noJ$)c30^^3A8Jv$8S;Lhz7q?7#{b?U9b520TF= z4SyivnE(Cn9WNlc;b}ET8y7)qq|_2WvVKAc z8`y<9_zboBPKnOngL2D^JxKEhrqNWjY*IM+T|%t6FvdQGR5Gh*)FF6?3Cb0fgxJ z!U4Aaxyp)petCm7*M*fO4fi&3#-?AQGL}TC5N#Ajl{+HyG-;ASAT+7dn?J|#(vZXuE*^cVxAQigq z9#q*3Hb<>fS-KuR;16ZtdDC%9`ap*IGphAorDl&Fq=jaWazjs?ja&xH)CU!d;0qqq zs%Cz6NvP&yoym8}NHEZcU7mlUL+Y4O>h at Bq_8APg?V3OHca8(n^`RMBH(u*EUN4Qq z-6D-w?5AMtN0WGsm2^m7ks^>G2<8DQGt2{0*m(fXE~R?+RBxLAoDM{Ii7|6R)Jdd_(7bNzGMy`F^(qS%1I z0gzK*czbE(8OPoJmLr+*RnRFv>$)c}?OMEtkA)7%&qlTW9;v0<_x9TnH<)3gjp7DZ zu2$jby&Lpx&*E&j6izg^&}yPXDUqyYiNPla-89AGLTDL9bWJ5j1iy+P()rW&5tHX_ z=?&LE>CM5(w>|tO&NO~$XXY-w$|H&iTd-(wy}^V)w^_x7=0a3M&&Scix6e?SVx8nU zT81g|8G3bMdgWxkSZAZ|Ud}=}%hdWLEB2h6epz7|*@+Ui9+6Iy;Lflz*TXL~%2|^3 z=aNw*a|e7|sHI&!&8hxCn&ZsFlmp#8F_#f8$2cbA|Oj=5%LdR zc34r|Em*|)Q;AZpSM(aqA}yr|u^$bZ&L*SjL01Ww*OwP|yL^G) zi0vPpBW0Kw-(rb$S znE>wIgVbqBCBMiw@cbAOw1xl at v3({2&-|p zgaJZPxH)!%UqpD>nOwmHlGFv!3B4&Mzqo|OaYFXkT}rG=*H71e51W87^$nHv)WXW( zBPDtcB!Q0((712dM{@i)na0*4x at r!pp?j;kp_;_kOU#uRf7K*bi=*TpXP-daBzA at 1 zk0-dDWF^9~@qU%e-Bml`5v*^VM>lP96Tcl9D7sf%TRH(}<|MwyER^cn-H>^q%IK++ ziBF?@IX=R(+7PFED-#v+EaE5G9CH<2w9{HB9cU2{)om{*8^5MHb23)+&JEAZ&H-;< zd<#T?)xwZ>Zpc^Kl}?871}(;J&MC4aMA65U=WafxtAoFKaUw*vr# z3b4S#zlc(Y2Lj^zKSPv|rR at KAZmO${ql)R5Vj~eiHv`k4&_FlHwoRpAO%@JbgQqQ+wG4npgUHQTL~AlPig=u$a(rTMoNwyUqgXgDQXa+K5 at nDazcW zZk0wse`|4;s>CrJjlG2>0&L3Y6k|hHcFtnzBIH9X+dXm(P85QZy(G<9MLb!XU3w<$ zGO5He8E$6%L_$@Dn;H^g-+ST=UvXv|FWs(L5f$n)Ex_t%p1tXMKF6|+G$WaCT9Z2i zD#^}@=CH3xZ9}0MUQ3QvlT%4mGR=9Ka{c)sA!Psj-Rw$lmiaMkEjE};P?J%%io?9D zI6*9R)PJ?p>CplYZ69rG7LKlZZG%aJa(yi)PuZOh8gvo&nV{o<)B9kvG>y6%L2Kmq zb*6m=;r8nz>Y at 5CiIowp)rQBQltpQ->9&d=i$P}AgIMzoHj8GuOmC&xvQKjr_A=E; z at WNnWCez{>_%V97M|$YM7VaVxR>9*|qU;LR-c*e at x|M13YU4>~ixR;-3z`KnV}v)2 zP1912m=0n}1(S7`ku7kAQ@@K*UyXQGMZKmTjYwG<&0YEzF)VxNLKsMi4(z`$KAW at - zjOBJ4E_G2R(=3KWS%`?1xWKN%rJ at R72}*uYoO_z%tdztNk5DgmChVP8OLodMYJ)&)q zYM(FN73176sN)~KV|%R1;6(R?N^+EYVnoUThIIJyyT{?fxXXXz{+gmYV3;+K^gSow z{_)qHcDT}>vEUQ7t&t(e6WSdC6#k3IdZ=#KK9Y(KL7YLu7%^qbx^6+t<0+B9G;Xak z^%Kcjb4pGV2vr(fDjcBL?n)50pn?gM=;FgfHM zn~)R2<{g6AL3{YvD~w+`mtQ%xA8LalGk*7V1P$LG0G=PsG1s z5SIe_B2-nP$%iQ<$4GgwQLO5;Ad>}MZAokNnqIDzJlOU3{1yzHp3pc1_RsC!K<3=r z9k at ug6H1C43FebH9AZ5;-;WF^SX51fAm=wU{HPV--YD#HCA1N6UzvHuYmQ9qZ* zRYm*O#WXW;xA1IeKqpus)^$szFGi&K-5?NEOuG*0g6 at Mb?wZcUJ%2I5wu2E9LB3>B zAbSS+vt0inih!|p(5j%s$6}Abl;`>CVx;d+sA+$e_cU+ZHs^DexB1uCaWg*4=)6(V93!d_b}IOBB%qS0px$s|*9!`pIq0(juncBS1cp})8yL!n)`9mWyS0-M5BQck$3CR5a+F2a9S zdji-}F=YD3Zi1vg&Xtd`R>-9KLX6vU487-UQ9t-0ep;@Tu#e5)l*5h0^)p}S?A`6b z-?7Z)8Y+-ykTJ)mk8zk{p_hRts)fUa_FtuNGmho2y at 5IQ7;}KEKYT zh36P at B)i^4WbGf&=HwY})kcg2pkxkuH=imcO-gUhRdeDnoFnzc^YvtX2o476~8s%cBwV+vP`p-SSxX;M+e0p<1<9BHtk~x zJOpZy_?4oH{4ppzbum%w%|;4X-#MzBh at pv0Mw_~z}>dQ!yWIW!+$8podGvDkQ$ z_-d7$GR!UmX<#oTl#J64X|vl`^0=wAMXcgtmvOn=N3;c-l$=g zIP7l4H8u84%EI5G&nfT2sVY5iS6j;0EY%pflT>a{6MZK at jpT~WQy&J3J>>xBDtuC9 zDGda}h+nKle8-wvTF)zhkZG-NOmP{gDGEHt6jTcERu^Z_F~h7{Hh=ZtS1=YGrksM2 z=foSw#IWR;bSTkthbui_mj+Bx!wajnusAo&i?NOCHa{N_s_wT+JWj0+rYo%;7Nd4H z2Gt(^L4g!}6lQ92W+mO!xl(+XITxnbjE#9wP{H3!&}FsmQD!ZzfI6B+I at aV7zsKkF z$EQ}Tu$l7-6w9(8QKZ9;st*37m3^9J5$RLl1623~6|!DaMGys*b)@{H9_C0#Cpkk- zkeg|dwva6E6*%(%GJ~QBZ(<$M{w(rQlAH|^aEdEyc_^IKpJC*`r^MD4-`7`|1C7hC zB|yeUg6%G#>Z)b?J;07Y<(~im^rOXupOh7m-QYa{zz>xz#%vp?a(Bb;Jds3j4lhN= zenC-ShoBB(!32Q|CKc(y6hV;bgE7e{Ed=tNF+kP-!b&Jpjteh~o5lOYTl0AU&LAiV zrKi=>7C+%rsl{E_$c(TZkUrT@;+gr*DVILrEpxXvhD&8U;~QFH9^!pQ{xQxy at B(l6k;3RFj(LqdbnPB^i+el7C?_9y zOYJD48v;GEwIbZ`bEmW?oq8depy*a9G&DE{)|hyuB_Y#cRCYa$qsjN4YP$nFhF9Qy z?Z-HQP2F#Z6jhxSBh5!piw9v3a165SJ|azWSq=gFH%Qgntz0qw0d^tmL?i-GOP$~s zFbQM){D04g=13W_F9ZPs!hi$<68pbEqMD(N>pvfe|Dz5E11?=D9XOR at Z*ycZp*om; zIl71>lqi4F!t}VSa;%R1=q7rvelawmmC?sV9P?BPww4!WgL`XsXL{>#dUpEe`|J6+ zJ5aqwG*N68cF7)Q&jZkvu~;y&Fvu$hCr@~ytsMM4Hold|K;E?zxAAM=VV4UQKziLL z6$gI1E at m;sEiiw2yRJhFG|f=kNGlt z824cNwIa#nqR~qjce=+dB{3CZ%$}RN;Q;3PhOT(I*w1W!p3Z`4%7?Ft8qt{d5cY&@ zxIZ?(Z5DB_*mayTU|pyiPE+KCYKoLs%4pF}OOiN at rp+-gUtSjCd4{H#vJDjGKWo=F z%CYR(n at 45N8oLh+MBA=gwHve6MEj#tP5XZiMi$R;ujDjgJrcS0SPwT8i~l3o9ef9NI+&R at YH z`8j=>k2F;glW=AS53uOmjpA+81cBjjti>#2+h7enHa)uc98+a$iEG1}vgFtZ;ra?t zU at oVI{8hx9KrS_n1h9P9%U{J7f=ZM*C_(6Tnh%3I7-V$yqmo-2MW|fYo7xZr-UD&Sj{QS3yG at Rno)~SEpfEM!q_+r36xxv3WK}wU3 zWhD3j at eVApk!5myfnQByyh==3q*&fioV4b6!a08HI?GOV0-{tw#DCVJS<>pGim{zr zU-k4nT21e4CE)M&gH#v at Mg!EE;CsS`q8YW=_BJ_$8BSp29LVW%k(gSRPa##e zaR(78CrbT>tg_v;y|WEtMg7?@UYGf2-6cfUXk4`+BPnX~4l)=A%+5%5RZ5YH{m+Ow^xsM46H2JtXAQh1yT{;U|7m-Ox!X zbc(56Mao at A`1a6r9je7Tld?RGrfku?HJ<90)sV5qV at A~Uqq)}0g=>c?UL3z&9}ZZs zs_4barl|*{Ok(Q`>N;g#_j`7d&k^NQOYZnPue#IA;n{Dn_tIIPtvWD_SHVi+hc;P{ z9Afk$dg(WX;(;OT2m5#dV+Iy*aS#|ozKB_VnF?^#ck3H@^CV{p*aw4O4p>f~ zC?#9u7Ll2PJfN_WTH+S$A!whn{bH6)xg at 8&d!)dlKD$4-A-IV-0dTy+(=QYnw$xN9V7x4{RO64g-26#d71r{h_fMolUu-QA~3Cc?9KhYbIT6m)m)MK-JRG?U}V4 zIpi#P7X0dACO7B`9B&c)FwU0OihshC{`$8{e`UbYU=@Ey*MA at S|9#>AgYz-bf-rrI zNTS~sjaslvI4wwyrYBe;y`e2PU`+6q(isBU;Jg{Ih&%ZMRCYRC{S&!}{#)mt9v~9P zVNk*%Atwh6jdSgNR(%&P&eYYNG*?{Osdv=S^Hs`A?4c}>n at 4=GOhmtvszYwKH0WM_ zcNo{IRjPdu|DXa6 at wm?V!>+~_V+SP(`9qD1B=$JLA8P#DV>HW>*QatC-VGSyH!z at M zmuTkFajWyEmFT)^ImPyGg<*TS!Pq8mv&J z&B~fT3semN5bXD at G8C;ZiZ|96cCHig9vsU9z+bVbMYIwC`HZARIwe!ZM z3jdJq*O!;zxNA-pZttVI_C#pUoQYM>Y45JAc$LebS9r1{jMGc z{ex77+woLYn?ZFnAJx#HYAO#UQIZ^`8&`DM7eJ6b^-D^mnU8j_yGp~&gC%$rwU(o3 zuRA(VVFBK@@{KPzzrt)pB}|U$jWGJAhg@$$J1Be z=8ZFWx5AAy`sYh>kUq^zOi(Ij4-#j>=t*mBQp)tXCwRB12D>LwB1hu5S;F&aJ>(tg zTB{|U>Op$9vBv(G%L)Q{Xq9f0teG>ouiA?GxLX~iM|%D|nHQz<2-zc#aJ9C%5`zqy za;Qnh`Ko~}C)@0;iQbr&b#R%{)Hyf+f7M56e8OxV5(Sz!_qYI#Zi*u(Irl)S60Zgh zug;VIc8KwAZeBmst8c{PO${sXt=3S?B1G)@vF&9pR`ih zl8dG+-P#CA%UZXRcC*Lq_N9|HT7G*FXU0yO);m-2%JI*y!jTcX>BMqQ%|~J!*f+435|I1AZ2p9_>LK-Tbf at udpwURy{Qm%st+qXVM!}ONTv{LO**-!b#_1 z<&hf1rbu+gs#2JUKR%5YW^XMP at 3c07dZ|*Q+IXah!orq(b79UUZ9~%uY+{`SJTl*d*vimaruJs znm7}H&)?2(LF(pN-3qlErI*^+p8IyKeADgV2PrPYQQ;+Aa~0o)SV=5`ye#Zjn0Txg z>$XcCd2({FsxnAakxlj6s at 3eFYA-X%dZe0vF_#XcPn(ph*WMayQ>oXDm2`ltr|02M zW!J!bNL!~?(tfk;97q2gC0G1zw#!R0{FX74t&9$DysUDVy$5}IKqXIqlj+;FUTn9@ zYUv+EeHFOczLH-G+^`MIyz%q*UROMHMq at N0XUyIy8jB$!!>d2MQPJCmt_<}ruu@#z zqC}FlpJDsY1r>GX#8oxo!Av4Fl^OAi at a)i&&KG7JrX0q7=DUHtl2k7sPmY zUW`K$!5IS&WQ$Yr4CP`yf&F5R)dhei(GuJbP^a=G$YH?xMCsifmHBH53fuy{BS>uV z?9jlmL)v6I&9ubjIYHyURI?^R;&>gltosfm!`#$VGjFsdFwt0l#^g^LQ%pHzUviKH zvG2+O%-;RjR}$F`Mf_~Z-tMrxhov3;Ov4t{$Me=b?@au`@r7ICf$Om0n>XZTHpg~%pxqs261`mba|n?7kjGGWm3^ae|uhF`Lb-$ZHOYX);8Y9W&QS>X2w>@oY`e7gTY6M67Q?l0qfW_MJ%x at fL1Y*~=+Ifrid4!q%DHxM(aflzV_pNr zj^R%*-3GHt`9#oZEaFIb*l-d39>7YyMx(?tPRx6Zi$8C7cW+B~;8lN=Vp|>ai5KOA zGftqLxU>b(xlr&5(pto1zAh#dyyTAXQV9D22tftkZn at 8~RnTJ8uX#5zUWwb*b7s at DkHt#04Ds6utbH42{r_ at _Z*dNXk9 zEz$EtyCjf}8&Jr)El}$1ZsgxDWZ0d;t2~1K;mJI6$&BL%h5KimxVazBNYD4p_?=G$ zv2suZqRt*5bi4Z~a)^9^kl=E0uwlo(bA6s8f%9_#^0Vv19>&`yv4FQSOwgL{x at QUC zbIXz3AHe6gSoptO at JnV7@=^a37jnDc=g*$zqgE6fILdmG|dV{xxF{) zq5w}o#uQ-$GruBt+lcmc_3@#j$-R4xm9cmB2m5L7MPo9zEdMv)lY`o7D|TNHS2a+i zRg0TeO}ZWAv~Dq;?(|~CcC!Yoq0UsY)a2|Bjc%ZKGGKG6*{0oejAydR){$9u_2j at E zu6cJP_Cj#87`OyJkV>5kV7FAfkKN>|vW1NFKA}-Z*IcNb-Dc-ziuNT>*kq|8W-d*b zHM#^&Ox8{XPEG?LtK595bwPMEPRvP<+$5}$bLx7Zk~qc*eiWniTtgl)p^ke*<+VRk zqq$ygjEBF07LixM0#OH55A7|L8O-6h8>nfQiMPP6_<&$q&0`fze_d4!!cF;+qLxT% z+h6gFqCXCXkz#RP>NgTX@^~bCx^@J;Z3YPhIULuD72VCZL%(`S(N@^7tHg)efpVd` z2#|vXaV~rjDm at 2jMJ^(#lsJt6xNH^+1#aN{emc~qsa<9KG?QG4PAPV8LrCVt&U9iC zxTDiY?4MfhnEKh(S=M3Zo(apL4++zeU*ZWrK^WpmM$8cE*%5U9&?%+uS?y3%_s}6H zpHshstLqm#!oqL>AImh|8ia$}s0Xz5a1t`N49Rcgl6Jo_hE?#4VP?cnNbe`&M0B at k zAO5{zF6{^r6?Mm~7R~NOnX9NN-6A?g8RZY#j77Jg7CVw~Vr~gx;u%NlJ~Y+$=eGWW zWN*;Aa^g;<*o)d9du~5ixX!xg@=0gYjO;h63PWY`P^bnywZnVt&woF)rV zU>Ia(9ry%^>70-2xR9iqkSBVxJtXF#Mp at L%?>%&gL)ZxucLo!z8azmOKd|0o7}8(L zH at WZhFu9wtcI+5#?MCgl&RV34Kh2y+Dm)?2IYJdu1WU^~>NZ8NReX`S55UF2)VVW{ z&$3Qjsv?u5{Lcq}1=!XwZ?08u)VF=&0FZQ$th=Kc1}~ez9- at rjEv|Am at rMmmjhG-? zhZ37+VMepVBsb0nhJdL#)Azq6m+GXU&0hb-f!tplaQ&BXAY*T5{x2-}M_a)CxEGRh zR#_qFlAt2V^2-n#xMFxx_!c)9Io;A2RCZC222J@%we!t7YjI?T8n` z?ky6r<^ujc?}Uak=UE?QVayc=DLB>HRHK#1U3%dTovKT;ia~gQ$zW3kS$i?o zk6@)H+AB2KN!QkKhpK{gx<<=&*~ChdCYva(`2#O)I;=leH*C*&S07Z9)cq~vc)~2_ z8;?E&niJ9k{|pwEIMN<_?D0vR#s}t=ml!^p9p}HKqLXKX*s6E zx%-t}NWdo1l1D#Mq^lN>JK$A at bj>&^g}aDkq6)%xV%KiC$gsmy!(G!KT-5PGUUPVzVIgpiUv at 6NmKOKEkdU!yH3P zpi=>KN!jJr^Qq(12=CB^E;FjZWtVw|SdmE!Ev@!_1+AvABkgnfr?y<^el_blnV4&R zt3RuF;>XQ!ifYQfbtzyHy}U)}Hc?0LGBh5L*VJW(;=S}|Fq`Y9;M5l5#+{1j2Q_(w zQR6U2j+}sZICXsrGPra@!-lZD7$xFsw5P6e4C;2AK6>@`CP~8&>Y_}EWaLB)({rMJ z6El`Pn|fh;;PD60jG}hFP^39xPnY|7k0?Gs^C-eD at laWDbb>j6hx#%4&Eg82c={kg z(@MOk9w5Cyy#+EM$wjVo9^5SwqG#Z>3pU#~fhHE~Clvh|Js_j>4u7lP<|BC)$ZO_ at eTDX$7I%<9_j?O?sPJ!y$U=G-XQ_Lxdz!Gn)}R0)W3@& zyQAs*T$!R-2 at k_#Q0S>Nhq(kR{M-o;BB{ZKQUib<-^3$!$#SBp{u-nE2wfodrNHDy zAiW(UTjWha!&`CX%q<9RjYUE>zpa(`3C0v at B_q9so&u+7-=RB8Am>pk$RLpT`So44 z_X1YQwn zISj1$``=be76b^~+u at gw37*UcCB_QN`6$fJG z*6gNXgls at IJu#L3dc at 6g{QKkOS>F$|1|+=~JxSxYIb&=LZBCyV1gFkqf=8-oI!4n< z+mKpl)j4ei)k58YXWZaBtzA*gq!-I8dQjNDTY~- zZWGUH%2eCtES$6em3E4YRLN1>96F_nOM79HZM&^h@PcRg+b~11|bvS9Y_Usaurp6M<92RtK3XPbaQ(hPH zj&+DjM#E8Gc>^kcp6*t|hD2`}z{$4jL5`t2H1#HPT8W&VE7Zm>;)YSuVlEL<`l^&3 zDsihSoVmtHUZKp9FjkpKtIEbBJge`syzpzf)$I0+er;{ut#MJK_wi3jk!4R;)0yz@ zV#M(=t2TOF_oq2#!)oODZ+9b at HY|jn%Is??N3M8hJy#Kmu*1zBbQh6^m9F2vu=II$ z^_$yc>Dl4=&`^;hrL&Uy{sd)mRPPA?nCB?nA=6Q~LC#UXVWOvg2^n<$c%#y0vDq{_ zXR!$J!X*PA*HFxJS|Fw`nL%s$*!C_JfW*uCkVMX at iDVTqaA7=-v~9FR at QJ_~9Gikz zchMB))~l>r&{AQ$bj!>sJoO3SUgMLdk7t6;N7g}WD|7)lmg^7>O!6PJ%7x|0-o|!9 zE|1uMSS>;#wP0q&d1IEjr}W`PJ;QLwG14RD257!94tWF|j3$bc(MeDo6A(LYBc_vZ z?r|eB$}2&G)a>-b=BTIXRb1VisF at U@WBXXmXJ{VFsj)s|@o7SbR(Rlo%twD36 zbqx1NI*Jp=PJy}^iWIqOWPHX}-P3A)4HX}uo2w3+r7RC7DRS~v;_QfJ|9HgRBBc at Q zp{5V(u at C(mf9c`Pie={JnCp=tU_}i;S=du3tM!LW9-@|I3GiBqBWRHN04I|zrpKik zn{L%-^1COR;t}uxG4~%j04<_mJj7Xj_YGI<=G33p{DLsQrR%JECEXt4?xI(+{DLJs z at msisEBOZdS3;=y7hn*900Cuy0|7DoR|xTs-9?hN{X8Su at b?v+b_x^b{!+|3<;+#e z52C;k6-#UI3Kd`@i)*_YX8DL16!(t1_#Nm0P=Wx&P!35NF4JU-(cn0S)ce5gty?d7r=QS2CFrbU)SdN*MqeOfa!XqhSl;3Oc z+z2B!{-X&q#aYBupW1Q_ZqRE#Eq`H_0IXk1pZeAd6JF#a2T>?P^U^vuY?vqI)PqNp znS$AHlt z^Sw(VL91Sp;`yk|O>Q((qEV^**jZ9`%1Q26vVvvWw<}E{E+>b%ljl at jh=`88%!1Wv zl)3J(%HBY~T)79`ie~kIT&>(y4520RXI)ea;QS!D4`&rd(ocLBR?{uEYG16xEiqhs zKHMnBgPXiUqvwsaAc=x6E&?9Sk^6kJSGSJs at hZMEcMw*Ic8*({e3QB=xmIL}s6G1Z zpRy}i{;KV`aIgB$-_ge3hx&i4HbY|zQw9e^V{1cmQ#wmKGyDG(nyf4 at BCsHm@AS(d52`qfiNcgYRt2W73q0NTCYk?+L5XFDin0Wwjf0)~a1PCQkP zWk1LzYB>qn#=P6{8zfhvfVr+lwer at P&M;tjiA!FOI};Y}$bMRM?wV3PNpUQv-Y4s} zPg5I{rB%*TJoJ_%@Q+iuOqMj-=d+fvH#D)dGZ+4k!9UJ^lrQBL1kiXv&wr?? zDBQv#%SH=DvwkH{lD7cY8^%QJeC6T|DP>KuUZUON`4IcR0P!W=x-c~wR{kQ-_CCtl zaz5TToz~y>2l5D|0LF*VfWM*a$>^~u>g=h1+^yw_&yQz=*^Y~Aywk>+*9OVXRxVa1 z;Le2fpk?eP5LbI6o(FM0hxFFQfh3vxq48L#Dz4?b6b543XKM`R<(eJ1oQ{hlOLmyR z=tR%VWs=4*K8Ps=2qvZS8TF!2{(;Yie$tiaa6M<*W>P zWO#jvi-96lWXCc%=|dW7+k&C|?ha&aouTVGA*rl`iT1tPc?kzigU9|?&zV0Sibi`6 zcHnW${s!k_1ts(%!`u&~v|W~{AK#sBQO%IHdjVyG8 at NYUlX?9Us%9ea3_Dt&_gpOO zQ%o4OD!Z8j%?|B-;|qLIS36fGonh}f+|l?By1;&*|EdYD()~z>zuZNI00JWUpJ?Kr z#h|jTger)1Ndz5;j>ZrW5RMT77Lu%kJ{=C z)qGOKSfqYWxzJ-T%BV=8DpYnp3nlW61DSm{%8&RkBr`OQy>gFrl~L{M}5i3UB641wM=_2 ziU$&n*Mlj<3*y2Ee`nJM2hlo at wIztF9LadI5TlMTEGF!}>X7cHOw*2^6+QTXpCYQ* zy= z_!+K&_~;$OHMtKS2n)&YXgp-hFboyCtQ+P#DGu5%x<9Jzng?OcpxCk|CL~sT?}3Ru|r5!pL9o6Mf--&HX%QK2nLFmS_e{-RVMVy zqqG2*%BQ2EYY?G&-2aJ}5jZL%OI~c}Qi${8&qkhhoJ~)hGo=cz*Fy1dm4A at 8`k7Sc zvnjdk+^mqd*LLT1r}y>s*Oo8CS9kRyV!jf^!1!7%v508>;H?H!lbo(FpM=}KXtx_EA^A0AasdyxQx)>gQ-D-ZZs zNRY;8g^Ex6y4&EMOrrwhxiWMPwk}=Tc+Mf$mr2;MSKrj^*l$(lQ8xA8Lj7J3WaG6R zhA=rfzxaba!Oz0mCA{06QjBvdQ+`a`{nn_lB#(E7?VF0K8*Jh)_Y$ovFd$TSkX|KQ z)~%bQEhk$Z{UMTXVJ5CI<Rj9yfvJ9I zzqO at eXxmw@XCM%)!8C3(dQfgTkKFVe8zeF6Q~~Bh{7Fa&N$@)<{2YCf8M(&B*`||{ zdJx-LWst*BIvFNY&8^s3eK2xltxt1Ij!x$%>{e|r=h}``w&!NUAA at i3iZBE^dsSLu zFRdie(T9mU=;8c?bYPfHaj!pSqQ1=Df2`Jhn9+ouH?XR0IHh6SN+59(7R)TgeTJ%1 zV2>=LpJA^w@``$5!vXikROAZXhyMT)lcrCqxoNzac*3-`y;EPS`FdG9q)8-vk zdwBHNXM)AyFAQhL3*toiqtK!#;>in|_~_v6F+EW29dCSHytPi32;pe+@(gEt4AUU~ z^vpRd_WWFd(CZt&Q#iGQvyp2eq&9PFv-zQ8K6_Vwnl}+ at O))0Dm at ukaUUIzB?o4u9 zbQ6izK&n=rcyf2kYoRgK>SMJQSyOqmfDX<*hZ+MpGA?5K?Vne!D$0>?I!@HdPJb<1 z1wAC=o!;K!++^B^>5f~^V-zJdSR_GWD2wY<7xN04VeG`flLUH8@&f}sOUnLgGa^h@ z&YqorQveOxj%E&JL(}QvahT8l;(0iUpL&CX^chqNQ3dO`bHbOhd__E0K-pfTe52vhG(NzRE9 at oix!4)tU6fZZOALt# zImu+AsKNc6iDX4klnL(v7a*jpov(`+%J$Gb!(~0Qz-V!;oP^jE;6|9_4#3zPcn{0( zcn18yuypOh($di{b8c9ComV&xb~U4an|N5PWuHfdFFZzw$z`9JKZcA&QB9oC|V`5`z8Jw7$*ldK|n!;x2<3x at v>&Nlr5XD4!HN{p&+qGJ!IfB=S z07-&5hyaO#F^T{Qh8%oX5q&%G{>R6V=lIw?g6;|PGS)9FR{8^XmSmmNS<)0vDRGj% zk+Set#t>ss2 at Ar~(yVJc_|P?c7_%0C(y?QRo8#T|M at c$Cfm}<(#|&b)JaZ7}gZLy% zAEt!5B!3^JMBFdF0S<|{gd8K%BI}}S1KOhV4UfC~J-2m;5-?NHuRO>%`Mw8?qno&a z=2S+^2i1_#RdRyufEv$^01W6`#krqHmua*CU#GXLG;a)J4rX|p5tneE_$bgr`E_-P zg7tM#$n^;(Ex&pCG$dQYHt9-B%itTpOP9s4uf4#BKhK?mh7wUg*I|5_G6qq+{<+fR ze=G*)93GQMe;0!@SRf##|H)#YWNK^gW at sa4?_z0YX>90XY5$KvQnH$^GMYFVZ@=F} zU95gto<%s*0Bw7ZLC`Fe5z;K7K1_=u3TkG)u9%zoQo3eA^((k%^ebrBi$Mi(hDLH) zsmh^vv6KC at i9>3wNM+Vlm+y6J={4`>IRE$87i56)%{@nSsGEynJioN(hJfa2&w$Jc5cSlD*q0q1t{(Ef?0Zo`HKAHd3S=ouk{4cFk z#Gft`8>l#azhO#^rm8m*)ffx%eP{o05LhwVz7!F z(^Us}2x*rZc%E8`&9YulD{3B~IDl#Ufs7`SxD?NX_j^?(Bd~dQx;4;uxk+X5q#=7! z1M&QOKidx at PtgiX)jJw!Qix;wl~bP8{Vn50L>6Ms+RF0}ad1RUVyMuzoOk-S-b*4* z6Z(kioN&H<`kJV~{O|r?u*AFpnSA-vIMftjqS}b!q{spg33z)o}cli0Vt%K^bEi@`|dn+Jbj7Mt>Vjpq)%YzeVkc?r0UX zKivXqvSB1?r`$KY1&IR&=(HPk6*zPinwPc9+lE`$A=vs#=EJs-r8MoUX!EY-UEO3P zcNXDq!Prt*0!fpxRS6FSFVusYN7k1kQLJ!eQ1BIq*u3?g_md^Z=^m~rN+osg}Ij~$b)S<>bqQlVKs zp{~wdsQMsOX?OvejJ{clB0(8``GrofnE2;!qDehmf_)Fb{rV=%Pg at Bl+H-^XG@%1f zHgK2u1-GGF%T5Z#@)(OzMS?lXihc>#e%G#id-#+nzl02RmY*o>rVh(9$>{U-am3)J zQGG>T%%|C^VNFxIiJc(TvSiWCoFX$>oiLmk;@cl_Fa4WL($zG% zgmX0 at ITw9p57*alBA;XD_0l|}%`k36lP=A%HHrF*yMOtI^v=;7m`7!jbRH#8J!)V;yA!R{~E9Ke=GFlpY&fLZWSNgIN-NA?PC}Q zgQh4*&KHuU((-)MQ(YdlxxxbXo40WpC5 z|E5m|AS6<~`{5GzgS=l&xcWC_M~a2s7Zx4~YN$Y44I1UM6+ zijOtQF%3$SLpmFXYlt=4MU`o|6UL_x{ia0eJh~09W}ZEJ#GQo zI8()r^=w7OGB2XI0@=2xRD!$J%8v{X#j?H8a7|{Kc7G~*X-iob zHYn2A4VPiiPaJ at b!MI}SW43kws~xf=EevJ<+QIn0Vh84b*g^5X+d&IiRADw)+(;k> zU8chT3c5F>$P1~zcU_51Vg8ETwm0`~Z*(A-U`HIwoCeZ}$0cFY_uftK=<;Iud6**L zM{FdcVq>kjac;f?>ImT_^8)r3i at p>4fzwg!9LKNvsTxkRnl~$I%rQN}!B66h at RxXb zA)|_%J5P=y$Gm%V%i?=NLm**G%Hr^MB6$=+nf`m#gQ=v9&^|Ius?)cPT-awp5v$RD zK7G=Htt&<}eGg_02tVo)IJ3f6kp&4lBmE7CHgQv3$9&zy&cFxZfLLafA^Ji z3ZVC(B_~G*@bC#uYje;$_s$Nm zv-dd%a9j91in#*oy2F#lmKd{+-PjK>`6>e?+?Np3oE40QB5)<~MS4ty0I8ohk^5_` z33nVU1lDj56{@|!h6G87d21#d{#R-NWW+9cVAMcIiXDMS at h9GcYc~>{B>bRhcsXeJ z!vce0d9%jM5S$XXlTfV^4`nqB(6Fw&{oHZ8_$q2)Qn{Q!ub?v@ z|Ka;)XE7wUtRm-gJm{BrME}H4b{vbCNhtlXvFW| zn$U`Z*LYbk)8s0j_|LSGh9z{_vBt~ACJdl`1Wop>dd3^8lb6hY at +`6N$O!5GX;9ey zMNlq-{xB`+OQInErUENTnYOfgD4*eQN;D*IUqa*b3cQfZNeSosv1PZErn;}|gjrxq zoHRMUseyd(&w#$PFVN;mIcuP-$53eVqA@%R%J>33AZ11e!G*ZBE(OwRReH3ESiF*LqB3-w8?R)%rkqpVNLZ}ve) zJUyN-d3Y7?sMPvOCZ6V|woGO;nf(fx>71;yzwmhdCsf+OUts^oQDOf_R3v-eqmtH7 zF=t`@>!`~xMzv49OQ`@|GEnG7uOXz#x-~z>2s5_+H6ByW at 1wxaXjD@}Bp|Pm-XE+C zv}e3Ly*@xr_6x#7&C;EyFBntlLa~VdgO!$>34X)J(}oXLxPWgV+9 at +nkhb5F|3*JiVUTfO-BwGRTWPN7p#|`zin?zktQ4XbLMwk>#Ifv)tb7G1n zyZMFhe+ce+Xt(8kOr20_b3yd?mJAjg>BT{45I^v%-aFln6TU;dOH@&>$1M5a>MP^H z)x$9dd$`a$r|2VD)X6$JFEBiSQBb4&Nq(r-TA3BI^%}YY$9 at UZo#W1Xg7B|V;Y$7j zP=Npg`@4!YOwe0%tf at e?jnQamR; z$3)D}@8buD4+N6QU8Hlx9|*#e6NrMce?Xa$?2!%XzY&7ViHu5N!9Qbww~>4zlMZz2NhSlHTYdQubFV;ZN+UEaNo*sQ=$4skWy?SZ+)S-{>Ei^Q at +E}x!SbXr=Me^! zqS6zKWn<%D;X>^xwu1Hn&u{s&G}o>=UWJoi&h)gF)j)_+6WbO=L$=HGh=HEO9HERJ zj8=$wsoP6(OOe8DEv5u><{~h&G>ly3`wjDZF&gD*HWkIsG6NL}aQ3%#sirBn5Os%4 zi{fc6V?kqk-ZKSs9C-7WpSjX;Ys)n`i5lOAbLd!Gl^kV$tdbQNWy*-#jwU+nsCT}Q zV7d2$;~D*OIyGsrY1Ay|OzSZ+G>+4vu2Dg?t*SE#geYP$O%Ud1$U^)Xq!NwV&Waqe z)rgCGY0)Y{6MNQ>miY2h{}(SSr&px8Lvm%K&bs+RsmD$|9?etZv3utsPo@<6AcDrw zZ$kNY+h-Gres*- at -(8i8vi|DJgL?aEs8;TX=n`efc4OUtHQv+L$k8!? zQID&;iWns#DuT4(H|(LUIJ3|en9 at 07$7xc=jnG*Wl)*Mn;a z5cs^tiHLr(3PJO?w0L;&GiP*#z}^Q#E}P~R2bj>EWS8JAxTNNACj+Lc00dMtd!(|M zhc at 4jvrov8Ruqf=vwh-(wK05s_jaw}Q~doACn?HEiwynG$xOATGkodCTb_h*qIZ6i zJ<6CfTbTI~MjuIAyIhz`aZ3>Uok&-^+*XmfljqvRJvl31&;yZ{3Y6k6(O+}*2$c4o z7YeVg6!`eZ2sZ)Ihu^$l_9CrmYEZ#`c&vCPpI z12nnz<}S-fMJ-9iS4>nh9HigAFU98b#HePxlbW^Xx3`xqgq^R~_fOD2Kh4olZ8zww zDQ|9CL*b2?(;0O2#0DE9(L=v!_tIOl+$sS{ltfwE&qYnJ?jjEdSje2rKvL_MTj zYykqzAJ>hkOd%2)Ir!QQ!64pB8>H_HVhUM|)qNr=%BH2KBkLQChxlnKYUKcwrxFaZ z=nnhIIrXNpSV)b at Pxn2t66^)GTaz~mMKjRmJoPRTbAAo9)p{>*vKR1YK*aQ%2I((Ey>u14 z^OngytPA}+aC at PK<%RA3Ke6{X^dt1OL&rmfoDNw6# zQ9k=%zy1JvU~II{U)3>!Npz?4o=owf!N8dQN9y=f8_HU8XoBdkh4ggs392v~2$zb+ zZS-_1$K=SmFcbk{u*j%rUJDF{JVrc*cS1X+DdHii4-mf<`dOC~lnG9p<1)A$@6yjl zoA&>B2OtX!$CVitBKqd4IRustw>pd}n;Qz39l{BM7Frd1RB68IVqztn6oZMbL3TxH zK9qEmCo@(T4^mrn+}WZ!lly at rqIqXW-rB8n9~6J|kk0GQM~**n+q$y2&j)O*n2pyS z_#A*fMbT5qP9|+Kd4wXYFNNu7R5Ia;L!ulxG)uE&DudyGP)mx!%K+3gzN&|wPQRyxxg)9PB$+$H-S)$mvlxsr_fKy at ggw(X-gT zx3#3M138A$SSZWvt2;w#Cmv*Il>ou(XgItU2aP1?FFYzABZu%hW~ip-StP0s(u+Eb z=Eu8Ep12(Dpsv26_8iwo#SzO704hvKl9K znq*S*AdsjZyWrB!Bg9{&x>cmrzwvHl at sR(|W2gVERR27JsibB3hfpab;y{sixsgd> z6-&YSVN$xQ$dkG9wZ--NIni-W;)N&U at hOXXKJnRdetrT!3CS~8do`tUXq(|3&(^uF z?e_*Is at B18E*5%FIdGfLbNnix8*yC+<1 z!be!@uN`TgF$AOE=_Ija+?<0;GvqZmi0{)=?-=Cnsdj`4FHoz*o$9HWY8(3j_W}~e zX^}{ji`^TTKEte at 0J^4(yKk-piJ4kv`da3H%bmCPuf5uGfz%{E^b+1ZfF)KIh*9AS zzNr6VHc?mY_sakh$x^-OVT|>L*ExJglvyy1$p&)?e?>=cmGm)t&IlS^#8tA{`53C8L2-C1tm*^TMZq-|TR+U0eIA3$DFM)UO-i)%|mkI;k=t$j&X1S}m-*rMnu& z at UUE7k*`kOksy6uPE(>PLuUM%DC at 9Wa$Q-v`8A0*LoU`WGoqE%oV#Txu{NPwTq|Ut zFE&B$3ZZT497CVeQKsNQHVt{(%sTOKsc!ekfSd?V4)@q;=)Un+gDw_<*0CpM0Y$o1 z2*VH9t;7z1Xps-^!>$D9Z){c)WOsFpTUf1wkL~#KND5!Flp-=Jk(dB{a1lBi|3n)4 z*P2M>_oN^U1qLSY|LcwaG38_IKql&BWB5luMA`Pg{QBomosyO<>N|QtQcZ!@;SInF z%MW|ohpVlb>WoS2B2A-112^B6*s-C&mJB zRp4-}3ziz022ZKX>zipK6eMEwb8H&O?>)tsc1(XI;fVE#)~OeE#?#`3FUxE;$GbW{ z#D42AP%o!Cbk}y5v3Vwm+U#LctIgj{z^-jcQQA!d)P!;8#3Ys_qO<>)L6!AyvI;9# zPLOC%Uohtb^tUUG7^~w7vMC3q73G#bgxX=<2vY|t)wCSL(a_4K`~)0D)>NJ-(=EBV zJNW9lu!-y*RU3Anjm}ciogEvYf%T|Xy7#X;_UzSK<28*39AaE!3InDbr{G1>6G^m# z9`RCmH(5cFVvG!*IEs3QlNQ}M at 3YqxMLXV*GzcMHLKqd)It{}hXysYi=UQ;t4%E9c zgS_zNzUvQ;%1aD|lC;sj7#9NH)maPiwx{cOqx9$um7}XR$6w zDa6mq#2&R5P&KE7Az~NQWSM!28$DS1EM(GK{2UZ8am4!HJ&;jtP?vs=Z0WDtY<^nQ zTlrF-rv6_qV*Nv~O49|YD(`|7{~rie$;r;n%G}uDzZdMEi<)vec;$dx*Anr*Myl{6 zOlx6j3uz*RSoCLp9g5{|r?PdJXum%m`TGFTB9lID*9i=}IyYGpl~e1-tvc?lbh555 zUhkhzd<7%e3PnV)__;H?T2u0)D!OgvAWgwsZW^ZSXS)?b zj?3R$#=+&P{jqT({Q$0bNi^EeNRPNS+$#-ZY8k@%Pz}QxXu@~mcw#pN&56?%$jHJ? zYu?UtO-`9|qpH6 at 4mF{8Ko&G9A82e9L^O|PQPrc6V;g6#a2R at C*Laq at 9-z#rJz=3GUxYToxLK+~ipQzU(VxQS19nw z^)MlO$<9CuWfw42`}Yp`>O92 at E!t=D at NDexGrpQy5{-f`)nt>Qqt1 zd8gErFwB1Rf*ldsJU5Ekck2;0B|8;ck2Tv7vQA77~0*h{t)_&@Sy28Nvr#$$PcRv(?jr3}J zI|W&)=U^#}_k7=)`~24cyqVV=F}?=?{f|8NZw5fZ=6$VTZuF0z{^?&YP#BTy`GU at e zW|_;pq-mXFHDzl at -u%Zz<0VDdClTcIZ!Pzk zT>GQ=XUEIe at VlTV(FjtoURR7%A;4VT>W2{mrKFI)HRk}%G^Znilbz{Faqp=Kp!RQ~nVva9}U z3?EzdNp_FjQx!j!bLV;|jZ=kl at EOXSy{jO22dTt?~Rd9)Xu at ct;RmV2SWxVATI! zJpO)VwvNlP2y#bl#-K9-H9bP_ZeEUg4VtFHu$tlLjnsU0dt5U`;pf6ZEj7VJPa|r1 zg6Hs!K!*dai}C0!J2eM9jZZZj8;<4JW8-Tn9jt9-0&h>JE at 1N)GAKpW8X_oKz?FV{ zj0zHm1?5X)l~&0EY3>G*6Epg4<3lkqiHUd;}wPsI;CchaV+KLdfUfFVjY9K$5!*S zwIDyMf+dCTmfSiydO6lhTbb+Ylu at 0wQx1ivSgpUNbd)-yBe>2(hh`ZX5Q?g9 at rq1g zBQ4fz*oC2|NOCOTK2b7fB1YL&=7SfXThHHdHz0i2rPD;$uB=D85!R^#wH2M75W at 77 zsT9e;g&Fz<(R8ZHFR*(wo;@-c?$h>GpeAcKlR$dMgQcTea9ggk(jPT$wpCX1RahhP z>5r(`JhBkv8T~+$BhP|$+ruwgo}$k(H%>|L9B#)+useJs*Ygrte0=UaP4VgqVhyGU z#%(-x6}+$Z)BI5DeUiQUx at NgpkMuC!(woKuxK{3A>Xj#VK^QR*5IMATvr^Fx;>2ST;NWu0dYl4+3zm7b80GH-0sXCl*jt`2K+BP58JR8-PGG)O(9xQY|6LO=# znHdV~FnV6BYm6;MuDN at HKv=Z=*J9DbgS-yYv)2^6M%g6#$>7^Dg{Fi(qO+_64?hHV zi}BzD;bYpq7!nU0 at 8aWJwldYeYL@V0isYyL50vJ!)q|$gpr4km84l*%iqH;WCo)DC z6xLi(?SV}t#&+MHSk`i6ppRxqo?EJ0 at 8DT}kUT5Vsq?@%6N7M|;+BBrklRq&xrwl- zoOd+Q9SqSOYck at 6el)w(nyQaqaku!wXqzR8QdXNlL-KoHiS94B_FhBCO(BQqgZQ_1 zu8a=6q8Mc&5(W(CIX}tmKoq*-6Dr2pf5s*ke}>v4tcA2lPw*Fqg?oS at l#BnO$)5wr z5kSbcl@{J72N5H_SbcEEZ@{|YJ~BK=(-tna-l+THO at Q3`r9#jx+%Yx!0!nu;oX#!u zMq#wE`uw(-ZBl#%5>luO=(bWWYob>&jU0Ew+GsS?IU*--^9$ zP*Q*yTaCms_sr*O-Tm$BQ~WQO`@}fJve?6+=oBfdw5Hf_rwaRlIkCG02 at SEew{&>8 z{ApGJ-#Lu=T}>R{*gP>DPT$S=7ah+EO$_;!wH$-y*u1koUXMx}>n9V8vB;DGmfYjv z197{W?^8ds&;~M2V>&_?$%NKQ)LGb`l#Wpuv?W_~ujoyiUDwQtR2}l0hD*)qo;7hx zDfF)vpMXK-NWohEbwBs}67o3oe!i5{QBJie%Zl(Uy!KI-S`3 zr!oH;iMZC{N*G8mux*(C=M}mCT_nt{?W~Od?|5XyOF1qpqYu2zJJXG*#`b?}{LW!6 zteKv#%!aO*s%R&j%FT&%gpA6B1nk@{CY8e082|ZEuS-oIiuF4H6omBiVyz4D)6Wm; zKmG7~xMIKKi%S%L+Q(ZRIA6K`A@;O05zP;62U}%o{{aY9r$HvKY>!9IF;Sah=;%Mj zo0is|KWZY_<#*w at sG;ud+rEwb`ou(-g zU)c6Ju_CR~u#r!WyVK^uW`^a~V1uS|CK*LOO|=Zen#ZI~v}1`w1{-PD&Fl<8$>urn zSj4}h^BC7T&_uPOFyE!cFh%G3&@$2RaULo*@RI$T@=(Q0>1){TV1cuvl6zTyp$zF` zm?h3#>ZZnT0))cf^kqOtm9iG=ky6`-O^tlY>;!xl#m?&A(agC_MA&S-A zlQdBG%a$}|6pdIDvfyInkG_DB`wv9q{-<5pKNqHGhE!J at O^0z+CqF)4V79nG1=*lv ziO}=#sE*{$QE?+S;D@^;v5A^~WXIL$bg!a10wW=jgE#U9j39 zM_|mOU~+d2#nBavy#7(T$wFZ29J$DDGM}tt_{RsRDp>87dELTu4ys9x^q|gmH?7oJ zMWwelio>sZv&X<9e#V#TrjnHB?WkuDzfN-;ISx)$c=)a!8PJ(HwteEO3nkIPM51UW zMp2e=CJ^a&$zWF0Z at V3_4_P^0pgbe7!&7TA>JNLAcSICtL^U^a&`Rsy-#C8aAti}oMN!y)`|=?g59Wjm>jD4q90^=EfB-xRCfP^> zHhB$bli_J%B+$gDehDG*N(z0Ugvmo#cbz|2;LGPkr1dCwH_`hVxbTCZ+ncWQ!d$bb zw5(S-Gp!ZE+P}&SvxCm+U^+)hCsr2|c(hUJm?3F;HqVxSJ5Au}gwAA~}BAtzxUT%W%}dd@>9l`3_o z&yVkU%8Vj#VFz8=;)Wtr$>`Y9 at EGJVeYJy7ro3pGq@P@%T z@&Vm}bT6lRLWoqEu75IuoI@*0um?_S&45rxL^c4Whas8yL^RXdo1z<4Kip0P9kSQ7 zURzhq6mPL+#-z(mS<08q2CFn-&Ujf>!Xd#~5-OK8HHV8DydgBR+*f=_TOR5pa~8m^ zG&oi^SI%2CBkMV>Y{W;ag`?$>hGMEw2ZfiVJgV(5#FhkNmzYU6C&SRtP>svGZZsSU zi!&+H2d^lg!hK8vT*j+G#Z5OJ4J_qgq6379^*;=EV9c6+eV$>7SXf!C>MIs7~8lZ$Bj^qW!hC-Ov>fNVk9gFfEj)hgW<}Mv+b8*(m zft at RJ1OtzPoqQj*TJ-qSBx<#Gx2%>qiBi()v~hUk zfCZ?+dJxt~#8ZFk9zx*UR6-^4jr6{UH1Rf+`nEI4Z5l-qfNx)Ct$Oq!id=|mYqxJC ztO-)6EY6x_xC1%U?R6GmKeQAQVpJ-=z!ADc*`@?uS^)G0*m7DO!cef7yC=@BJ!;H5S^K at sH8@+ME+G^xRNr}vxLHcDi;0}= z$0X8Pcq`ODNiGDxD6;^Y_5f|)C(=GCuw|G=5 at Ug*Sfb9=5N|aG at HEqIWd=;xf9=M6 zQ0!Gh?d*quT_+;dhglDMknO&I5bWm4CkK&UE2`}3!E-8|4c=LL4=1cAU66Vkobkmo z^`R419Fe0|n|g#m;Vm%te}FFYJ45sslv8nQ*qQE9a}lMH8cyH~Y892^LvfU7OmaIt zr=>oO6&_A?b!*Cbnr=_}W>LK3ywMkubgp=>op>72dUnz1=I>tIg-IVeNieB=#XZ?0 z4eo3-R!zCEjK5 at T+l+7OIpy=|W0~cX{!_Hd{rKc_QSxKtArQO>ZJFTb+vV at MxK;BO zy|NR1m?hRWs}##MskYB3?vrtmc!h)^^hBBm`=)3l<(}qFzN&d_aBOq8{NFBcWi0H! zcPezcp#~q&wtP6~)yIjBKLJgN%Rq}A68O&?ezc~Kyq%DDe1WydvK7YL3CXC82p%*U zuuIRHC;djy&8bN8Ygg*_Nzse!m)teX=}9-(n1!9+oqRKcMGcjz&BagN!s9l1SgWEAnJia*f-eswx at kh;-p)^e{hNGh$Wi97*z- zPa-69n;)5}{~Vw{F(MgZO2fi0R5u(Ey%Aw67@q~})Orzgk+abux9V-kzb;MsI^*! zDh&r?8&i=UFL2+i%)=%UGHW^)69E*bPq1^myRf#D&Db{8o ziy at YT_EbiPzHbt6?9y&6C5wG_bmNn1du{2N*SuvoDh&Qs4ndaWHcKq1I~T8`#Kudz z!q`=Vdk-9+u%bvRQRnrxZ9KK=`qLUub!?*dt(Q1HGgXKHtrKuygAQe>SV4}00s5~v zC)7`0kWmKQN{}t0<+SI+L_)04q6i3e_V1FR9oRDPjLc at HA40=P;#CIummAr?cIFdFURCASD-{k9*-`y{yDd5h- z=_kvP;aXzL9WPzz(*jk*P{41M at vnUI19wM^#k+a3OWHw}KpMhYB#(v1B9ZBuZbcfA z?d$yUSE>>uDkow;9fck`qvj%|fvgH%D1Pfu9 at et!3ER zrPQ`%*Q#$0mgM~eHEU$+xNX^g$qU7O}m|eQ!?J-Z^f*qrC zz;*;Uq#twHaIu6qEQbpRV~h-)4>rqj%r~)gRpZ{FH$&pyZfW7NYpOJw4$)^i6kF-) zS%fNfI^>A>>F1*i1Na$2n4~kl at l~vS66tl$6c1S1rvH3Hr(j??OVWVbdHrNJQ-r&L zyR02;Ly>z8=^bRDR$)UiG>P*WB;^?9mV3$C$nU`tDuTc4Nh+fd`iKNNv`?%omi(N& zhh1UDO=}wleX3s4BE0FIEm86F7ma`>-|-N$YLR070%245Bl=f%>3h85 at AznIMjADW zg*w>~+psRR&fH)E1cT~E$(M>oJll9arv8+X;B@*LL{&_qZoXcJcl2`e{^zgP`61Ob z+xlS9OruOolPP`3=0CFpxfFvtnn-&@db|#-Wvr=_gqrNPQHl|-IwBXzF-ujDKk&cLI(-AaUU2{ ze(KMe9PoW$pIMJ~+;XO{Mvb*p2qNvUB0OO|l;M<{_!L6>8-Gb02_^%12?fN=Jt?DW z at FI3~9RqNZoTdcfWgn{Sz^96d-4UOXxPpCkTcJM9GoFa_33y!tW-$;ePYNFhR^c)S zlpW-W3$+CuGt3~{WM`=(efKsy?9%IdGwBl$scTyC?7qS4woAFjdW5q*q}}N-eDp3J zR-<91(HDWS?)@bSD>xeFuABWvq9TgYi;4a;i6cfC*($DUpXues zL1s7t_h}^};h(nAdhLRFSpJs`vi_aH|7e%KGuWsa0+a_=$eB}Q82JTHAEK?CZ-K73 zy*-V%+-Iz|Ods^N=`R=bS(ll)OMDCIg7U%ePXx8l(m)d_tfrmU87Xy+cLP);Wa z5 at 6oNEd9TmLqfq)nWznEzzEME?J)0+q(?$n>&XBkb|%=|c|$VRT1qlw)4xyXGi7flA&eO|Iy*!DAbZ=v9l at 8QPHWph?3owSjQr+;?OW z3wTu#ZelC?PKqOdMmtj!C;qE?Y)%P%H~H;L5<#Rg5ZIanSf7L|th=eyn+(MW=RvK2 zYOUOD(cBa(E8^p#usA`dM=W0o)J_#(lfEaQio-{FXRvm_q;Qx zYPdEMqhEf;ebZRzPW#SaR`D;4_Ss8y?VG61IzH^Brn0S0Dm#1pTUE$H(QMTTB^4Wy zw=?_JMBHWqAnMZ_%ueIdYu#6cqx`U#92O=#?qAhOaml!WLWB at o^U`l%cN z=#&@)^VNKX7(d&1J<=!Qbqbh8M-o3pdLSB&%j{QnQ1B;$FgDrI>i2QpMu(!!Cq8v2 zggJ{^Hv9_ih(xMeyh5GbT2F9pZz7#-7>|1o!_y z5cn~YTjDweJ!?u4#u&El at 6#tH34(z`^ef-}b`1kv9R~?o`&|l{g z>46IP^AhmP-(K~?wkJ7dsR1z(+Z3{C{k_O73_-MgtDHxJ(;I{M&HE^>A8pK8gt1td zI`&XplVv9)qbO~7iBwV->&jj_uZtX2pZ0%c`9M%@@?gN0%S~42WfJ6I*tC$3IyZd<#1y1+Wrpcumi0g+g_pVj?XNxx?cL{U%*fftztk*3X z^)f|DWTm^Ho5v6nme=jV#kzpIZ?HqmZQ3U~@^Z`x^aEF_*p*Q=o$TvmjV^i$qi8|D z?4_&LNo6kE7sPKL_$f!M*U*Uv7YfV(YljX4ae}b2reyC(fBq at zf+Mg z46;>`{P7z~v*61*?<1P{;AkUK6~w4j-V&SC7-%e`+!}Gn3mpu#Y}syqHHBD<7i?Pl z;art)W?p&K*?RmUeEOtfbYWw&J3zh4isW{Q7qvi}aa`z>gsTmRnG8k!Yg?bAyMf$y5K-fY5YN z6LjAz!BvzKO3Bh`tRA8#(t}X%$p=Ce-Po1HsoYo%$u~x*i;-|)GlHUKPn8N1dZ^T+ z0@?)IrGG}s)=s9;7q7RTCw>4VJO#3tG(Wy+Vx47H*}r)dM)O>W%@o>d7gcQoyc`M| zG%n%5W9uMNFjz7$$bm4}Xs(2W@;o|uzhq*!6r+)!@h_9Ud;6O;9J5jM5jev7^bElM z*6H=^-(f=y6!`8L8bH)53PU)p4X-!2N$Qgo7SnI}`c*L9#v#9&$>qaipUESVz;#e;d&S+v;5OWQzzbi_Mn&1uLCc at c-Evpw2He2r2K)z!BQ7mlCUEp0BG zEL;LgicE at 3;C at x@Bm1JnBm2KM>iLmX%Wa&QyXHw4)_ zxc$9`toZx$K#6M#i1O&@;9rp&pmvJ0DRhOIU?hZr!V+i#3SULUO95`#-w_Z(AN4EGOmm4%hPO1SPl z&vAXGf`{TrXjQC;*y7m$WoQRLp2t=NOdu%GS??h|)KLVt`*8T~S67T(f>H?Dnn!V5 z#}~k^f^CeR`cW{8 at K%PIXrMq(2He-(TN()3?=*ciVH%gLD-<4WOP+5{b(UW8W9R3b z&&H;FxzaTLGXhBr5jnAHG1}}xxtFv*u1~C9cO9*cUsi(0&B++;P`EcSn~`-w$4}Yw zuPky;e(}*fSrS~O%9D697-u(MeUM-@*DP|kx{jJ!vwrZNCHE6g@)JD>v!0lbZgf0w zKo?1*KYS9*(7l(+DecM$L{~*9XQmsVPK1NdF#plCS*ZhgolHD`k84`}9Fa3L-KG<= zzUvC`ST@{%6 at G0$#47s5MVXr8_;zPRW%N2DoeQzQEx)WT82gHr%l_pDIsj*x!aRB~ zlgONbZoC?;x at yT#{8^;#1$R1MD at OLU2kRG>VY8%y!f#5UNV|%2EY~_Vo&;XOE%;M3 z9jqc8!;0Pcu4<-l5|NghIF**Vp9<}SuWOhhv9~y+o=zK$KYZqSZCZMrxnU3GNxj88 zi^Y at 3Z760-9prnt0qKNwTq?6eQfZk1v(`*zX6cJ*kihmy#qUpv~!*U<>d zU$y{^=#dkTn^kP6S?gl)TB*0H?MLjliL3w_b=ZKeESkb7TEG)Y)ogQ!lQheT?gop$rT};Ufsx~j={X_bw{D1enWzB7?fVw6DU9K z!)nbV))9&1InUL5<3ywKl at 0s6MU+RPB0 zYZ7{EwJ8y&L?LUq(915(8qw5o$*OLBG-*G>JytZ~!W~e7GSA#2|9deeg~DUIkyqXE zN1_oG!ds4i7 at qS;MGm=#ZfWNOgpAx;@HC`}djta|_s)!j0E7-GZV=T8aS4Y~z&)VC zuY;l$g6B{G!fn+RDb7r3I==zlBR-PgCMI##Ckp>2wwDLA!U(vrEIaTlXt!E;D7KO= zA0p?F#``H~JTD at E7^5bE-;WYF&>X67Byz{&RCkJsS)69)WK~C3l(#j+wasCqmk{Q21mDRB#YqS3-5R6^ zqbQ7NaPF0elcG at _dY03Po0-gGmk58-;6CbOq)G&8Rdz8er&M0y)m()`LQYbqIfMtZ z=qJEQp1n^$(INAb_jjWKyT>4KtxYy>u)nfdI>^uW2b&fDOEy{m&gQb*j6BvGez9c= zh61`s--t*cGd0ZGfe1Rgh6tOGi6`A{Ge(=zwA0br%b#fWs-bQB%US$3j9BN2VCn5e zw6$)$zCCt%%s6*`dR;zl0_(RUN5D^vs$pAVVj!fL7T=7Bs^cDK&cDjM$fXX->{=w> zk1>3VqSCllI0%i^!J=U?W9{-9uXdb6^Q=_W*xB@}J3uqNx7y(Lo`U6jT+y>oSS(|C zhZCl&2YbClmCL^0bT!)`!7qEqF?>*xh;H6~WJS@$gpA8hMnwOmbz4+Woe-<(9Zo{p z!YFva6ECAma|lS91+=#LcQ~)R$QW=aP6}7oG_|*Ej4)%1Z9x`D)`G!z3OZ0--z}k7 zgr9|VlfJD7yu;~SY7DJPqdpiJy*wEcDvg!Dq9c6{==?Emug7~l_dt?e5{^o z1se4r-xO(hhjVN_d8Per>mAODS>cn&IeK)V^3Fg%vn8`VSs4-CK+KL(F~J|F0kVN& zyzO)%$Xqd)Fh}_i7G-jDlqQ;v?CVJyu{93QsAe+J&Du|ZEG{!V{wP0GUIh)gCvTexW))+^;f at O=JgncEz z!xXn;GnzPHu{R$J2<#F7Nyqfaa$%)9?vq=D2~1w at coIoy7m6K@hy=GU9hzqQ^OH`C zWCS%14*zIuhvPXqDJPSUTH%dalQ) z{~@nCXYHxXL7}>9fJ@YhZ=CqekvPFKeo= zlTH6Ts>Wqtp^aIDa~VB>yflL(t?;2-e?rJ|kT7(YwZ at Yo@#}gY)1^ZgcOZ%;dqPtN zjT&|9VJb&8Zk|!sPXf*RLO?7*!TqziGx~lNPBn(?_CF0n_OI4mTD-Hl at xNq~?H_C^ z&8oh$8Io2lid;@~j4!XR0Sog>vT+cYzKAk~Vv at lhyKAD-s`*C-mljK_h2T~se#|j at tbN7y3^A= zQv#!wubjjN)VR-BjKVT6wxEK#E*p}@o1%7kat*9|b0}$?&2vYyD1O(_YNeNxp^||DRpqV<4Ay}xA!_e?Ig_J{eJK#4B z(;J%rV-3ql5OI<4J|lMbFQkv@!MtV|9A&3;cG0pk7~lhg){1^ZA+^}Gpz68uW%dI{ z0#-krZdW9&M4l?*-1^I&h8iBo<0+s)3g at 5=0#>VBg(+T}ARsAEnI||cToHM4JDNUEsi#WQ%g*ff`FgeYm z=`bB;yt{^HFLkbrM4UI{Q$i#-;60_j5l|k8p$g<2r*-$~TVt-;CM0>`X2nOg6lxpv z^l|}c+bA43<#frNz%elh(30#@s&$B;B*PsM)zBVe5`U9N#LgxQc_GZ3^A_YhGOfsy zR**hXb#)Rez>*|o(XFfma#ZcY_befCPT{fiEb-rf$3i`0 at SS{4H~C>0 at -p>FlmV7B zDIi8TlgNeIBDUB@(otY>5uTKhp60PE^tTy_Ke;SB8))QqPey{dA{+HDr``@d*0Ox&*w88&m3_XPhq`2o!_qlV`0jL(bw#eh7 at kb1QPDC9pLO?3u#Dc zuF(jSBna%-HrqIAOv7hd4#mc#F|a_+XLxlnB{$_SRI1zsw2jF1oI`?gu>^Ni{Wu^08S$NN>Sbd)J2jXA$t-1^p>HkZ*XUp7$7AxI9>33DyTAX z+`9Fd!zH-7PT>D=_KxwLwM*V_cWm3XZQFJ_wrzEie{7>;+qP|69ox?7d!E^I_P)>a znX_kJuJv}+?_2e&byZzhY8Z89x-pygTt?3+#|z!8m;m!O?OeSDktkzi8v|X395>%$ z-xMXkk)qJlO5cA3igtp%WK|%rZ%tq%R=lOG?bAAw?UN^w# zp)oH!s{;%r-UAN772a=d1q1;fc8_dZWB|j48rI8!_ysW>mT)0PlcABAo{h6v#cD73aVrUHG4E z^wvZf0S&sBY(bTi6;zI%vO at -5zuFxTnu_VUV3JYzEsG#MnVUsBDUGf3#u%KHH_&op zt7d>;x+e-8W*K*#MZIjEqV0{$h@(8KmCYUzxKP9!;D6?Bz#9X4+w&@s{JwFMcJ=0i z0k0D%g}?ok;dHjDT#qO=-sncM(f$jH(s@{h5bsKaMMRCEhe&)~Q zNv_Sa_RScEF}>3mGyzC$CuH|tDu-NVY%MFj{wx+=$#6urf>})2OtTnMcUYL at da;xQ zAY#3Qonh0?5^ag3tSf9Zc|DavpE7^Z-vH?N!woc|GP1I+m3}p{Gf0fQIj8H;XBWfc zL7!q4=%I1Ga=rMMcwnR(B^}Du at YZaH;t6DZGAm>=`0Z27dWa@`B8W9aDSFFjNqv#W za|>DR(!+T3KXHSNlMhGnVsu-|)1SZRU(o!qd9F|#00*0Pe|h^%9_mvNIZGK(nH}Xm zxA0?S+$qLPxdU?UTjW%tQj4f}7{2_6l7NqpU8l}D!2(&(XEP*Kg7CuD+f`m1O%|!& z4*T%NL+uRkly>Kkb?1~&=bGq`hCe$~_386OIKWw0#TRm>uFQXSg5(qXam8gz9TX$I zperVZxv421>Campuc113GO0*Yqw{^%I$f2m{kf9QDA_Aecq*1NM;?Q=1LC=mpc2<%~?32PCY0cK()5D6PdnD!k1 zkBlpqX?=lz{5;!gQW7PJZK+%kKkirIWoC at 1%&CL(qh57-oOpRTe4qUMxEf#nMx`;{ zHzW$30#F@a*>U;3upR4a$wN_rtfXb7zg=B0fv zH#F!z2u=UlhAk?h3bOgA!Oay9lHPTBzT}D9G-HAe=38T%&-i9lt2ES~D)n+l!_ykZ?!{$v-&KU+ zvvf;q!|!vA+g&>FuRhNbFp5x~um8_u&f|s6rpS+?k{8LlqkmJN01h@?yaMf&ddT{}mE zdGZ+YA+#}>C&N(^d!XkEhG6f=lRiD!N(AI1kyOz9%mR<1Fjtomn*WK#nJ}2c$-zVwf7^?fw0uth>w^JVmG827SYm}aRf4xrl?4e;(YcKGfEX&X1V>sBiP)Z1 at Tyq2wme?;s;=w5TO zYA_<{<8 zd;O%Su|Gr%|L(L$PjEk~|87Pw3EeAMMSwXzZpV(C at nV7uzN;l|mLc3A;-dtEig at k> z!(+Ug$zF^@@j&x=&0xm&M{h-y*BNf=7$D zhU97zSl{>mTFs|-xt(j9Wo0i{p8d87NQkFwMyBK4TXt z*wOv{*A_cs;%}F&2 at 9Ow;j$JVKj0!t4r+oga4wB93_K13{d;j7;Bfi-tCJ2M%X4qZXh^VlVs-m92KqXe?Gf>Ut^-T{yJ4VtEKeK<=CEj!)O=}U%uNu=(D3n%|Jl2w* z$G?V}nqNnWLRYd7szw-(2+|e2_<`kyI(?u0uj;(tXV)_tYy^&E3Si z?M%^><_+uH3D-WDz)|@1a;jWR>N`vgkX#fgMxDO#P^=8^jogkc&EmT z77}Sii^(c3w^fW;WWkA#rot*;ON>ouq+7^Zj8=~4xOf7-(Ax%KO zgUPqOA);$a%PQ~AhJ--43?jkH`g&@uZ at AxzDjhikaPtABF(&9{5BCLZ86;sOI5E?V zFpbf4=F(aWrD$Bx34t+ z-p{CJAWa`D+JA*4rnD6Yodn)!4aYE5iM)e;PYuUzq1+vY>7 at lzVhq!cu4dSyl5?`- z at 0CU6ADmX1Fj5?xzJW&V9*Cgw4c04nhmBsMygPY|tF;s}2ZJ!ErKK$v5mtGN8w|W(S0*;<%Z(cZY{k_Y+frweCL7 zp-#@!2EUOAd%YA3c at WrjtFR?07dEU9B~T`eon$RFaX&G&A%B?B!*mY5MYwYU*t~uv z!eRJH&jjj=kXIlv!ds?!+$inXaagWve-zZ3cjL>&u_#kLG-mCs&&w(CB`l>xs<1Iz zCvVJnX>aPf139y#v3zT)ci>8&V-Z3L*%q~pKx8<1HJhkRJjQc%V!1I^fg)nF=N4sE zp6h5PS==)dj|$Wn!9i#Q?IBHv+k&0!1$(~v*7>s;_IytpR-j=!cNm9jXQoCthMQ$? zMo_L6S(rnRd`j|jWGHX}kIphX?@>b0D{-x%6KJvhrAw9xG>IcHM8fE&)?4T;KPmXM zs=HmUTN?inVxb-AmCw>+ at V>(B>^OSd9)XtBh!NMbiGHFepvA_ z%rRGlQ}ivLI8;xrb~!4ceNGTjS^Y#R?H6G6p%J;}y`0BH-q44kcR6u6q~;2p1rj01 zlGXxbO5RdFHD4HX5U*+ll!DPWkm)X4+Ur}h9=K4tm(}^H49u8 zPISQ1`lX_1(m0$BF^ETle~h^yN$Zl7;F+P|8PUU<#5SNgVpZQA{G*#W&`t5qq0emJ zdoC^ha4Pz2Wyl_Py_3KdoUjXENmpq=P_>T*qz*N5M#1Y&mg`xhaFiw%NDd&IjvN^f zThbXR(A+WmnSq{00}YQ?d}Ww>WoY2N-HCbnWF6g>oZls$;~OQQJ6!nWxZo1xd2~^N zPr6Va#3fhaBE;*4uBaZE{PmXU!YxPW9sGNmP4DxOD;A1_q$B%ugf0wzM(Q5oGVmFJ zGvUU73U)VhvHwS;pLTzhhJLdf>VwC*X8)GPPGgs92VD$+m1PL%?Y-RH2T#_ at JR0<} zTtieEuhPmq0(7lV)%jqy74T8p^W6irmj|vYmm2N3imX%Ebv4Rki7S;^ zO?iX4oj$u4Chd9kv4Nj>>Ibk9UOJLIESkAO_JcE8_%88tNe;d+{w%0H4J8Q1WCXwRN8W^5~O(W-2kMt^CLsiD~1R z6;lN=d2LMI>s`*kH9S|ve57OVL_2NDg$&4Prh+~CQt-IPJ`UM^5aG7RlCGUSh<-UL z_qsGabwGV=#q$2O7C5&o)-czNPh1vE39ZsG7qveOA1HcJSuHkNts5FG+whDRZDl`~ z#QqUKv_-4hrxBDnD<28`sLCWhjQrGYFr~kT3hOP?n~*AX`+Mlcuc at 1F7%~FBW29IliN~y>)sWXc zw(o`25~leR$!OZhp~b3{-5ffe+x2)w4t`5KS5Rk@&9*&)EgDqD36Sc zOy at X?J^dMr4{(!l(iY&VyhNsRemU`Sn0aN^mG<#+bWQCKbm>MMWdRHd%nW9V$pkGF zt{+GEE1QDRnZ`pqGq;(7M6deN*6}N>@dRm3 at 7{WxRJ4-NT|}O{MG>bx8xJ8IYxZjOM7kt zBXrDc$K6C=+$}2MiXNVDl_fJP@)#<<0_@?+SL*_GWKj~@cd8~nOuXkN_bWyX+b{x zh7*^4-fa)u0H2NYWe?K##;T>F&!is&O;%^`1R!8{lX<67qhschejAj2sK}cqg)5!A zsy-Rj5bAnPaa)O6vLkg3y46Cc8vBB)>r4zO!sJXaMv}HHfG)9WnBcD|GR)$eM{M4- zK#PK7Z~=Dq57 at Tj+y!&fnUMl|<&gvQ8hI88LTNh_vD3;QndS5X>{9}|ue`^wqi#Zu z;Xc;-UEF;#q7!_XHpWHU>aARh$N z{K>I|L0JrFpx5)O_{r at w%^v z8F(6#N*EEQ1v}j6M)X-|t*?i!Uy5s3;Z%b19XN%W6s2Ffezv|dj`hAHmzstvn#W>w zgAZA4y1vy50k?UcN)|APY)0XM at JjMxiWjBUy?zd#ZZlU#;o}TYKg2O&1%tWZ#7fX4 z`W_g`gOu{!BL$@+Dd3B>Uh|~M)HHC;M;%6sAI at Yaa-c_Xs+9V%@E!<{BdY*>B&;YDRxP>|;j{je)*9e4JqB!N+J2_R zi}fajGWn;W&5%UZ6YDLWNStz6oU;+e7fKYuT2 at xpUl%5<@b%s2Fv!FKT$3-e=;+bt zR5m4T>5 at q$XZ2Sgh8<3lh5D?kymE4$WtLj5v at U+(iuI{#p)D;yO}IEo#HLxU16+w7IfeTM$mXj9wk*P;RW z_DvH0zu))$PthjlVr~6Tf!3%#?erhx1g^B}E^}mzw&}@wg#HPD7SaaLb3nn6%`Xh{ zQr%|43qeF}anWS1c-&+Aot^+-aJbB8{9~8~=EQ)2lQjPD-O372nwOOGG%n_~&8J77 zx6Z3d*CfBMw>$iA==SvC2vUsJM&f;mK^cq#3TQD>AU7DCc43&Rkj)6?t;s$Y4gV8duaVqij1cx=>`idSw*&+GxOmUIJeHT3dXeLZO|9j zFo6vUn-p7PDVTF_`9pvh<4Q`k&R8uRPL4$8t{oWi at UkiC$=C1f)VBd*Xrp4AUDNig zs@??nqZYDDRws`ADi2zw4ht?tHeRZ1s^70F5a)h#p?A at Fk5QGMS{g+Wt{T1c87Adn zhftZ|(w4L8+Oo(BK@|lVl?`F5_I{FePs>(O>-6FE7pxE2GybNAb;D3x$0w&-j~jgK z1+HRY+Dv8@%C74;$D}J9BA_Zr<+&xOj81Zx)9n<8*Hf{-B875ri!AW at 32i~LMoRkW z5-4IB!fjVS9kmO0*Uh-$(Di^2WH+*u+c^n+514U}K;8tQT}SO at 5d4G{-Az_iJgZDG zN~lO)$C9#X`a$M3U at q2&Sd`Ozc){k8paWT6yt=(~FJV$$vcC7W7ON}uw&rGZdTzHJ z1xk0DMe5-u<6D3wJD&f$VsRPO<9OwyiqL<(XlQ8 zUw&JFkpV|s|D$09or9BHr68t69bu5gbR;8ZmZxzK-3#cE8)zEwJxMIm^t-_>wC(IW zi5%x0J(0dRPPU-=2|SKhbSwl!3y^6kzMX8p#l)(wQdSn^8#SGTpMQh%hVB4c at i*m#HiXCFRy{~67%QO zb%k0du_O4LhgCd8b_9)IM15~Bo6w%7e+zvfP?3o1IrO9e;=OHZ0{PEB=}{ze2`Y zf8&e6`P}BU;MH)zJyie62aD+m(Mkh6%XixHF7MI4he5vw(4i25mQ$i5TZPbDqS at xHz z^pxqZ53)#*izj*~o^rq08;k(&WXO+>Mu+$O>j9nq6FEAAMJ=A~T8XEi-R|k)>cY+~ zVR^cHy93-`F%@2bc;jA}=^JdD%!|Pgd_9P_gCbHR$ai^;c)}go(X&K>vpR~|Bqc)W zB$n*S{6Zs5v}bRCx`>YrR_7X^1nF4HR8 at 8t^n%Vu1eFTXS#2&67pNChGEa(Xx}0jz zr`AM}PQq+&Gp$JS|DOkOrHnGfO8rP at GNU(D7V)b{}W^Rtal}&+;TdpN2DdX;Xb+9dNp?F zbZ>Y;M_eq7tFAiejOKl%3$?A15dRH@$+g0A2c!LfL(x;}uA|MMLmT?JY}Yf)P>2v@ z>!A7BJS)XZ)BikJLGMA>FjeqZW0LLy>80f`wF-)g&EhIJ{0aOt>Y>3qJX{NvK(*wP5XZHlM4l zCC_4*9t&tgT_h?w13`s$d`b!&CLeRFbg9l&TdCGvg?xJdc~0fwz}RvHX|YIHm9K^@ z1tnlA%wylRL^@XlB?-uspDHekFKx z+6cS?+j-#oguo@$6=R%BC3&+oDGs9e|Jv|;iTo}n}kZ-*VmTKE`9?3nV2`MV?s&niawY4+uL z=24x8E4p&NL7fNuF9T1*2_E0J14OgKo3okuea6PKScU^wbHUXJS9%%Y`jkMqL_+)! za=CsB{HMQ(SbtPs1o*GDv>^YsIs3;QaS7wL^8zS69%N{Z0FCQ!Ja92l at CiZCWJ!4&Qw0`M;jGul6agv at i>!qb}yge zPL8o?BF(!%+TN*xKh$B|!yYKj!LRxX{%QJS_;QEhw3lw01*BXIkb z;V at p`C{;JH#gu8m&ors384t3NzJXRy^^ILr9RMW%CiPg==o@~{TGS+&NbYC3$r zRg3K~c8i5-GtGCUc{^iXs*k^|;kUPO#`pdcMxTFbQI>yuvenMk?4Of>`nn^sI0A3E zt}YGqHe<9b5)f1Jfq#pzbv^+$_Xtv5Z7 at twN+ZSrsD*kX`moAvY>KzoCjq>qs!l26g6^-E5BYEEH$34Kcw&kJO9+6PN&c8;vk*Vm zehN{3E{H$l!OF;nCW)p2_IKg!Ycb5TWA zCnEiI@)E8#zR8e|Cx)_KfDSTiDX6G5oW9A>kG`=EIgMS6)m2@$<|j at 72hTBeSe>S8 zxj4EGPS4V!p^P;wzhn&gfp475t3&gaL&k&W^t$w(aC94$7AcvT3 at Sj(G*yhdm@@H} zm!(r?gcm72JF$I;Tdb-UMW|H{5${-(F)>fu4XO~WUi<(-mV9H&%=1~53dR%*gDc>U zm#~dry0$DFDEdVfZ1~r}V^1G$P*@uHBeak@>2fCeh1o$y(!0`; zDz)3J376_u`D=cAdZGFXK&d{X#L6KJAGu$X2X9z?>RI2vBB>G~fY1W}?+x z!%Z12)?mTPvad!|g3Vua)%mIzz|ujqZ0H%GFf8Gf`j`8JoK6>Yic#=)q;ze^x8)Wp z#qHvJbcO!>fhI8k7bkKH at j(WupLjTcK5CT7q|P7Zm8s~)Ctgm_#}5dVmw1hHMv8JO zZAMV)CbWlPY;=dAba}++T_`jP^363t%${>YBNS-+COOAQGss9bx!>T7SU(3O2&^Ql z{tScuP1{oF00|tuh7?X-B=f+Dh3#p&{Z0JW2QrARvw+?JP*i_jr=&pNC)r7hKdx}H z=>|pWE9%@d-5P?rR0La{hErf5&E at QMeZ~<@{H2pl9=)4aHjB6X0enz)m*_z?+w`&) zk2n{PIL@?6yaYF1#DOAD at 4n6Ye#4~lfC=MI>ic}<Ch${J%pqQ at yUVo(?f7QNwtepCD8BvYJ~x~fJO`Rz2*XO+IOARAX2WI= z70*>!on7TeRd!3+Pothg>}R*&C0X=7!#8!)9G5TA`wxE}Y1G;qSZX^9aUW;rmL%Np z&!X4O0L)Vw~#NPw5t>#^8Nw9Q%E=*y5Upfr@(YIpVgKh{%KyCuW`zql8(q#1HiTm1a>= zQ;!ROs$1zluekmvG!ry3GI4VHC#DsuZ7XA|qI}Y|j{<6P=afXgYg=gx)l}SruK|X@ z3Rq)_&?Y##IK~}ewb|Xc-vTM+KY?F&0_j~}_adU1qg}+rhC at ETf8;MXxuq0BDrBU} zJZAAeZCv?ow;owPu5SDBf-*$3f0XQe at Z7c}y_{x0&&T+x+-daWHSoozkis^zZp>a2 z3U4*gT)ttuMljcyI6{0fl!(azdcEGEFC7eSND5LC<%SM;jx-G2wWQ}AWSIY@ z16ZwcncKf1m~;`!1Ap5*EzV{ydyr2q0sg{{MT0nPhJd}A!B at s}?o+UrHU+*F4imta zi(d>;#wc>|HD#7KM}eqYsDp3{mA32)Xd&M%pi at ngzxLK5Z_0M#JM5E-l#$^Zkd?)DIAn-r)jR9pm8;da~$sY!a0+(Ub4 z8Xh>w1YMH{8F33H2IK}-Ws0_mv>63F_}E>1_bV^cX+DG#$y|c$qUlKsRFH#zmh7yV zLt36u9SvzY?+L+MzjRzwf at 83^x&v*%N90hboJG1^Wx{=o$ZN5Y#Q1)wB>seKkyEib z-IiT+gyakE?~3I%=dLaIR9tlup;}LfLIK^;JShC-!&#hjmG!LA(pMGcvF_H4Vs5gI zcA077o^_3)Q at M}{_~Dk>M(UgnJG^8iW+QxzT5PJ}G}kc`uBab`T5pT(yTc^3dkryP z9ud4~nJZC{>lJX3;IX>J!s|4NM7r+k-OrAjaV|#v6eYW#Ys*58*;@rlSL^*Dr{8jB z=%dCYWs9XIz_u1%!rsEMYnKXg?6VUtI}h2xfm>=Z&-Rh`(~&M{iMGG$?5biDowZxx zk^tRE74$T-UhbS2bskMx&`7qW94v`~1MjjNtBUe!Uy{|()p^hjw;k^`JjV2t;AXv9 z(Q6O6mNf7JX+R$v(A--_F`uZKtDloJzZ7WmgZY<;-ysPy3+lunhjZ)*S**-)YYRo0 zq9hG=)ht4ny|$&1xtk3QXfo+wY=|1VBD9E2+(=X{BTKc3(j;xr at KK1{$42b{O47y5 z?@fUb&-Ae6+=~Pw zqralhN3gr9Te-xv?)660CEa~V`MM55Zlt%^Xc_#;8Zr{T7KyAhIqLn=?wWysEfzFZ z6?;)({Ade~U?cA;*BKcoGPq*3-h*6|+oYO=-%xSSEZy3#JNcHSw_7~gSA+hyp#5Ud zv)5SLqMFzKaXqqWFeC7H{&YCSi^0B`J1fH33GcA(7zY=nN8AORz2`_yp-V>!FQ8(# z`~4~1qUxU at NHMV!ejy9Q1^I+`thh)Rhc4eF1wOw2;lzEZyuH!~aQ|rx#;z70P#-l1 zG7 at gDW~Pyf#jjz|y0|6LI_Vvx3uYYRuh}9$y2oyb!!V70jJQ%lL at r7U`0DCCrfMa@ zFgizNrZ3odJ+`!>gMwG-5t#@aL(>#3Q!(Kd$YaJ0rl)a*(szqP191FN6LI}xlSX0x?Y7xJ7Z!g< zMy0yVU)6}?$>9WOhI0U9>P;_U0K$peabPtNISgn6f3t~ z&AaNHlAc*=U6R{;u}HABVj{4}@Vw at iNwmb8@~Ny4af)W8V8Z-T)!0cl!%9{e`(!d+ zEj`SlVYCJ#-2xguv_uoorh~iSqKcKG0HKM|$O39*vPZ*5rfQ{iF7zxJ70^IOmvHMe zifU9+dX$Z+HI;~_Kz3(U9tIVDyWDIpgGLjKZaF82wezK9meljkAc at AYQ`0m%pHMX0 zmgW4*GnzdcG$)L-_NyG=j!4v8bo{@*%15Xr at ix+o^%X at yyRgazH zCwPZKERNusN at Wh`*4 at +ALhZw7GztaUs}2qA&R2iOJ}RIPDOIn zW=RH;CO at RcwKzyDOn|2Qm5Tpq^3$(ye at +u_f#-6WXEFEiMSpVNcSae+^VN^y7d(&! z$vev-S3xb34DoI;qdZHUoeoze_{n#^hBu(sQhxc*AFqBD^f;uMq#eR`4)L#Vp at 07q z0EYbP-0}x$dkFvbUr2Qm1FL^&{!2Syiz0ju%}Lb}ao+$BlaUA at amSx)1R;PEX%9RL z8e?}8AN3MjnGjVIUs1i;uMP%7i=wi_>Fo3bW8>sNAw!kzOvU6Kuj;aCjVh at TaZTJm z$~<}Nxyi?TejYvXf7j`C#c`+ at ss%jAIU5SYWEi&K7Uv=is^KVZgzed)Jms}aBW%S* z;esWTEB*#26Mo|I8*r&Yd&#ss4S@;kD0B2FqQM4Z$Ec!1ZS0hhoR>1mB6N^fW)^L2 z>1USKQly)PxXIfVPtJ7`rYx_AD5T~0R?lE zu51j!dl&*Fj;jv%&fn5M=J$o-i9IeT_L!JvQm%uxi-4-ScbErZi;>|>fGAspCSmp5xO?zZm$~R;&|I8xx_qjOmArZRxWV=ES%uqG zRr8!ZI+!`m`p)%Wjp4q~K6bCZ?9NBDJ`zhIP^`aDV{lRVj09Y}&Crn?7_$Fq^(c5- zt?kff$YE`skD?1Te^v^9b%AZjzqQgT>bui=4d)}qgT_zNCNQb%0k$3 at 91%*U=JSx4 zDyglPA5D7Q^knFE3wn)xjBPry*oZ!(Zd#XLolZBflXDT?KPcC6x9Ty_hshX%V)C9j z0^}J|1o-91V+GWKHjgEDzSA-5c!FIuS!yJO7iGNfN(G;}W~Xse+=e3rQKuPHBrQot zl|y;}sA-YmO_iS}$j|QP-VN%w at 9yODwk%6k>Qo3wy=01 at +@n5)2Yc;-2>-CX=u4+q zWI%FR+7bNKUiqN!4X@#dutNsTOyV`bRMLFTC||yJt~+-hBKLlkIA~sYmso;--VmaC zhJ%1jiaAt5FIPHUw3;PE&;rlQ;(~S?5B$Z4fcY;D9rDd}_u&Wcki%%QEPNJ$i^ShGb~Xdr zXLnNfV3MmnJnj)ZWWaYTHa$jVkTIoLc&$B)cO?1`9oQ|NkJ?pP83Fm977>csa5xXs zKLj2+&{KzxXm3*?C-%qD6?p4Y%dITB2~^hSx@>a`ClfAxHXJv%oFql&@)sVm8(&*y zq_zd(yDIY#Z_GtD*iBZN+4d at 7Jy~u^X!U1lS1qx2 at vY3g(L=%d<5M;*-IQ!py6gz4 zmPhB}_;RdB4^chE4Z7pWYXAvx7(enn{14^Q^+eDA)-yT;r;>a6;{$&~{r9&N{f&eF zmyXf at sp;rO52IvHpyyO*7Mi4xVw2Fy*etBW8^DyLpv8vir|LEUHtg*#da1Xg_iK=$%ra9%2qAV%Ca5?yEpQRg%Ng^vCA$# zSaa1acm>_ADOpr1mMIj>if5f5-KVz}a=*6qmKRyHmX&Lhg42g=0~kfGFQt zhySK};#u6HH}~^-jvmy at iV=n-Mr20^d=c=D{V&wm~O>XVwA0_ zSbu7S5%Ar&3`>K%;#ctRrfZiy#FYsJ67t#EAk^iy+1{E|H%?u!CWSI(K73%6RYn{s zV8Z*u`%Ense?P9VuP5j1>X#-tv=R(4sNmKGtSEQUGT`pXrn0G;C8U>&<(bm~;#`l{ zryqAx-UK{yaI2g}DPe+DBh|pRI)4T*ZoZai2T3ekIj-bI)XxliXtlRwJ@@!E~ z;q6C|BrI7agC}RgnAhkM2uycbYrJ{S+orGjVv*q+Pdrb at T;YK^}68 zX)sm4%rwpkXlM3Ln+aPf)l<2i_hQKszjn^(+m-);{#@qE>^0v9i)jx-D28o>jDSue z2+R(RBrr#affo4aA?#~32Zwx2>m`_^l7c1WA%!G&>@jd8I(aeOkI=86fISAo_SkTK z;@Sw~ngZ7m5rgj%FxNMBI__F{hyS9$`IYhqx76^p0Wb;}w)i)XPMfF$s{w zAim)9<28AZ(%Qq#Sb$(C`*soK^RB5qEljh}Cy+}XhurGww78gl!ViIX-y5UoXANXU zIHVT2U?cE6^1S2vRN}L5G!Z>ye#hV5*28+hELsKI;I9oZ9;LN>I0hxlOvsP7A at A{r z{m}{`1+K18^E#ax&@-P9CD~&N;!X>0%wkxi#OEbk=G7|4yBJqjj3YK8bNbdXr~9N z4us at KkxbPo9iT?wX##~mmR;_xhbVm9CCx=L)Up0S#GWiE6x$f>k zb8AWtl|N{Z=T>Z{ox?m9H|B7CHg{0x8+0ZYX%kjtmo6=|*MwCg5}kjpUR(D$E}mtX z+FeJL|BP!W#KfyrRP(48&0xMPlKTb>Z{1a>orPQ^Om|XrnT(mviLb at VQeV3EUWLWj z@!KH=-R)var+XONwsuXp=+*^r(9tMJj$e90ruV3Iw((=0LJqLsrKel(a)U#a at cpWn zTc`cX32uBz_1B&p5w%`~KE at C?_;_r~bTeo^uOf23?Br^}P+2?$R)hhEocCL=)va!$ zQ076E8pnEE0RxH}q!y<8(JknZ^I5JrBC%ozvw_!A;Gxc}b>*P0?Qom3wOtCG7l6=F zNF|939>9n(BSI%nT*kp@!qj}+9Dc?R8#l~k(q{Qe*8CG|>h~@01Reh*mIr-X8m8x-Lty at nhf{E0n|i at 2d(tU?SJ;8_;h0R%gCT`OnzS!U%s2fLu1hQ-G1 z^mhi47D*aqh{PNLRr{OsJ9z%c*l7FRLyH$Y)R0+ino z7u^#7G$=^*e)=T$5gcVkT0Zb?(eOd+tBvW`r9dMmWoP at CfU=*%ODs6!JFlHmiF3v| z=0J_QYM$2x`$K+z9)i4ERY_%9k>THrtSYqsRYz0xT4; z0G?-e`!unOc=vnaC%RbfGAvvhc5#_t41W(wv<4HB6OJzc8YXcCDMkdxLliUd-LFz} zNL6Aa`h9qMiO4N7&?&&j2z}{vM?L-99~fr2#2{1tDbtMM004OZr}5;!8h6?hL+}f- zeFx<0u2ZX%%^K|qm`kb*%Gmb7x{>l!MuT!>;oFC0oy?w-3V=P&BbXTFwUzJ3z^ zBf$Rx-n^X{)F;HTR*rG=^5UjG+t}%j_4_=F{|6{-D3Sxukk+4Mg_!^AlE+bkf~?M8 zmd^IxFcUuZUEyF*4n at A;jVq!Q2uZ4a3dUHwnh|gSijw7JWolgt5S?vZx`erUDuq>< zABEtUHTqmyb(jI;S{`-cIYXy>m0Fc7QKQn at Nt5!Hxm|&tdYP1N$08~o6=7G2I>Shd ztD9-lD`@?C`O1xwTRt9)jdq&k%=21+b!nSw(o$<%MW(q1u_Jzf`dGk|nmQ+8Coh>c z+bI1(SbF|-ZHGu4g;SvdEkC|RqgX5x`J`v!ymx-xU#m5$&}XQ3RW*@wJmOL0`mXu! zQG9+Unz^bh>nW(p0vlL+g$1gnIlXD at M945r3U7U9&u2vPv`tTRQcMa+Q0j&E(@7+# zs1J)w8I^wLM4d20^I*~{94B_W_Hp{70ff_W`Bw}wGQ(0<+uu2B zx3T%`34r`f^(bGfQJ!#~NgyvQNt_-|q6BO7i*UM*9TY0|BQ?Sd(7F>)*CHbX47P#>8`2SU!i2{?#h0Wb=?bGU_SbF}cBzg+iB}M6p7)EWP^8(I$1u z2hGB$Q`S+lLCO;sucqomzSWrB at QI=*0S@;?TfBsKHXQ7U1 at U*v4)bmBidhb4YBv|& zIapypw-|cFaSIJM at AKB=8t+!bqHEi~3w6d>&B&+Z{k%u~Gc`N>zHd^19q*4h^&>vM z3dhLWuF~|4;8x2$OFXfVF?133Bs{{YLDp{?1EMaX_c{ZuV^VEFNkM>oK0~lz?JPk_ zf4yz>P=H3X^XUy5On07&Ipw_aYgEgWVx8pmlAMA^Ctc9H_z8Y-=EqwL_t|_86Z7&A z>iZgje-w=7{HaM?^T4}V+!JK+zx7$?a>wgDh~wU|~oH2c$0HfoG`9 z7)a(0$~q%$ZQ+!R;g?^uGo22=xf?n+1|XI|BgKj)5Dcj!404X`E|FzHjDk)fW~0h4 zJoer>i8ZIRL^y8ce?llT5)C!@iCj5!;ozj1H4=fYEP7 z0>xSew+Bz{+KAqrmyAxZif=jCA!B5(#6 at uGj9=C?MCrka%*q-D!p{oOzxf(WuK%L) z)XnGm8idY*u1HSOoS!hWWD+dE(j4s zr{#uh5k>1T{Idh*n$6)07ClVHg67MT0;ElTW1rpb+%l8eUyb}as88}HP1`!-WH5vL zlU3W4_6Xk3DgP!|i+pzQJI4hNZ0Yi0dDSFwSZRQj?T0lRHu4B>mmNo4ZLpjJeOA(* z`-Fa$dSJ>Z#=-88cymTF?K$-CL+$SP{h|i{rz0`G!fngI4TKb_%qKAGC0>;3(D12q7V$0pb}1o4Xsy({xyk-V1(jf3206pphlsmC8c z5xxT5-2+=i`H^|UD0s{miCz!Tp?M%0v{0LGRrb`KMfZr9velKQY-ku)*3^xMZXCGc z505tsqp9?iWs?Rom&nB at Y;1_r8!s+}ken#XutJ)T_HdKlNmd5coGgXuiFb;nN%jaY zopj5swRIe>BDUv>H-?zHxD at H6thDl}Z|WY2M)j-~$U(c*kz-T2zu^ErDUo7ou5x;J zm7_~)iyULngASYsRB^qFE(^~u^_qq;9DGR&&42lwnta{Tb;q zn~;!CtG7sFVcaY at AX8dK%smxfFYh`&O%H{2+X8It$ zWTck5s!D4=Jw&~rNjpPP(jko{_G+?B;)%PiUA|nZQ((YjD0}}oHDGe=cZ0HlFgVF5#AfWG4a`6m^4{1yTRkMNB4usXSMHO9qxWQ%UNYUi!$YE)6zPNfwa zwU8onl;Ayt;p#eUcQf9d)r~|oTy=gs5Uc)Xo0|_>FwVZQCYUxv6%eN;40gjx%_{?g|`y at -*BO|5D|+&MG7GE z`w5D~c2ka9swg`J1>=5G^9KYZm+i5&1bUG zH;-R)@p}QH_RLU_YDD)&Js?&Ko8%(I$%1SklwkyG(nri77Gdr?yZT^jD8Ewf7>7<+ zqp_Vy+jUM%L*}yz?295h^l0u`(y=>I)J#mXOPxE2Qcr?7+pviT5j52zGi=mgX5u(G zgxpLC8xv+_kQ0(rS(ix)f<v0tG=0ZV8^gQOO>zhs zN^23X3prH}Ba@?5?W)EqNgtXtPahicBiu(Z8CF#j%5632(>&W%_UVWQJ&0kf;FXs9 zM+?Y8dOld0gJ3s}p}bh37+h{ny57(5Z_`iOR9(&T=vu3gk4uvctNk9Y47_lRR75U` zMD2DCtsJwD?#L4!i{L%8`thVmGBb|L&1O{3QC3})X>I5pN>h?xaKks`AYTlpVdIfp zG~R?Fek>ka>=2^dJ94hw2{SN$#b%aZE;Ge4ywhgzvQ(455Sz0Wk6BfzwV3b!x~NSy zMwIgr!Wzq){s-O7@@4OT=n`4V-alRqm|Xk$!S6Qxi*Cgj>%Ztm&|RVm at 3$@|{EKcI z$-;;O3NvF6BJ at 7kw68KcZ-{0TM3Gv^4c9P36i!>*$czWSOrf_<<_EigPF~}uc|m)g zKIGFPx)P8s=Z7`w#k^M#Un$?vIjj&=Lu~wW01iH~8n5c)op^wCqHx4KU(_U`4#Yx_M>>hwL!^~)g) zFX*79mS_|G-TX1BRp8Ug0dk`|F5h-14-xTs2w>@kCOCE4M#ya=_>C^AP8}HCS>HMe z__#aVDefBSq&N2Lckb-~Vb&2~2uk!y3Fa2U& zDZxK@>mmQ!Wyb&h!2MtHRh9mSFUrr2%&v+6P1&1}fNdlb5fM-^Bw+#q7L1V9fgP7l z2%#xhsj|fH-#-JrdqPO~;n3_CLg;o|ZH|W{!N2_;C;LU&Y#I{MAr9?u2xUku+R%r;Da;DeOvBQBA~SVbF+QNUA9`q#O?8v;Qry~%rWuD; zSyfZ3E5c!d9ScnX({A!xC%QFfN*o%=L*Xdj$}=ukOl_9+}WDYCJ8 z-+&6Qw5SVsIdHA3-kn)?A(V`L&c&k3e8> zA#~Jrbt+L{Je3z!ORaMiR;`jjhZkP1;hzOoXf9C9*_$KnG&a<1lkq+L({4J!+mqK% zY75thQtaWf&p^Um3$3VpB&oS?6MK!fN+b)Q+er$-NFC8m3)0NfZthGC&S2GM7#yz_ zHaC%dXwK};2(f;C1u>qy=4)5^IM+G8jUgmBTA(E#(6~0Q1Mhhlq3MgzEv>GZkh5VonQ6u~t65n}cR~1n|ah at 9E~E;$hA81wGD{ zH$aIW*7K!0An{Zy2#t{2>P{)y!k}3;>OA4qAi5z8{Hh00G8jPN6ZeT~JV-w at Xf$?P zTk5txLMYr&iSbU*rbW1OV2%9T8A7*I_4NP?+fMTJMq#m(VKu+~)HY@(=FXhVDcM3Y z1#O4&*!VY=PSlvy5 at +}~hp_DDq3j93Oy6Cn)Z)Ho^qh at ETrvKB>8_4Vsb}oF<;ADh z)^@Ayjuo8B?!_3B&x^ao9T3VKvh3>+d2=EWk66Np8~uAf2bKXot`Q&rfJ6uY0O9{` z;I%Zja4|LczXjiJ)oZy$0~Eg<-=<9*Ve&j6BA^R4J}4kRTOk-kVGR~2%zJZ6`eF?& z8r%@--878+lMp4Q3SlNS||DNW)u%vKV3gA?}q0qLIUptvt+<%VO(3DF_#SHJ| zuA!1*>ZV!Px?M}y>P=E{qi3;8UXLL(jEU5c9A(G}iOCMZ2DekxNW(MRNO at WqW!RJ1 z28Y6D%Nb|(IWB(>Gig_>_B^nzv9Ixj#mTg>(GH&i6V7gj9kjBLEe$)$#vuqrH>gDr zNYf`^W20^YkGY8P5xh?KH-dHditXcyZ!Hr2;?NBy%=chsfO1y+XeWSHlE#s!@8SW#WxKmwqAdoNyDJjLm7-LyQ9-w%oNtnaF!TvLo>}=!E z!T*0u{%MR?pLr%6v1voyyK;HaEM;-p=jq`37JJ{Dc%?L=?wJq-p{g zx2&HkYnw*!9i(-hG&Y!QqSRZ&yled}WHISg&WOGNS{@B6WHD+KQ zw)NFtrRuP?qNBI=|Ba-oefWxRon>!n-#?BFX)H{SF;;66yNEHi4zaUwtUkl=GF2=y z9+iBYTt^CQIJ0pInJF-RG+)k!y{S3JMr|k}tt;wGSzC>YXf;*z`o3(S>uJA8>Q2xr ze;{BPEHqPkcmK;HeAG;lU|8n(50e`Edyx)T+I)e3nAkx7!-RLoKX990*JDF3IJi0a zON+8s0HqL?nr5kMfCN*Evd0Z|5+vdqLVPT_(d+oyV2}HM7@?hnmF(%&1NL7v*kcvZ^RsLX zAZlE~ARMJsSEz?VN*f5ah~gUK&qmJ5y5+Y30RV78002b)herPI zX-;|G3Rw_^H*wn}!KK-DqeQiEB_o9eR6Q32nTV7i2n-atWj67;ZQYGon=KRVcN|?1 z(dQ2Mi{gHU1WYOr^|Q`-c8k|}w%y(Q&(FsXa38cvWZiuo0CX%z3ug|)5uGUpj563t zzAUqf;f4{#YDejTP+Po$|EHY;)pyhU`YXnjn-39YN at sq8J$a$O%!d(zV#!jpFQO+A zKz0HG~ZLV2wj|YeObfNkx_Z`}i*00ew*yOMtkEG8#S=5wxPOf*! zGLFL)#~9J*ebW9jE&1@>13xUY4NY6FR~0wA`jB(S58F2!40Q*(5T+N$0}6DI7z%BK z^mCxS!SjT=3E$$1Q2a{g2WlY#+8#Q zS0h^tU{j&YwE|Ubj-s+z^Gp4>cNX;7bCOzYMRTdN at RS;pm8o#c{Z9`Aqu?s*oSSRL zo46#|d%TCv=QI>Hhf2|K|tP0P)oY=1{p=M|INNs=Xv-)_KgBGW4HG6st!eMHSW>%g*{uNno>e>p=cNz at X`;Z=-dh=D2y%-5p#xA5u_;7 at Sn^*%;suvEvS8v4uuA-StSK zC50u&fdf-m{dzdr^_{}pzOT!=OK<8p(^2OFRR3LRa>%bg^{evw$%{CD+ at uMVAGK+A z9k%a}#JXCk17(l%y#$N58i2%kUz0Ia=>Q>Uvi6FGMbRw3M7sh*XBp%Jn)2en0 at e<- zl%5)Me3DcGrZLNJy!95R<@WfMC{@Nz&{lO8V}Z46IPIJch at U`FMW!pvJN?EscH$LB z?J?i5T!Bv&7#JcN!FGnz{2gVmJ>YM#)B3yoxz`vR(03uSWF at QjwSi$-SZ%Q0;QpzS zpUt)TqHuPpMJ6Vxn-2a`Li=~&kJS|#ZuY&t_4mQ~nULocO#r?BwxIkOJ*^PC^6bvg z=eEs-Osk!h5Kvdvf`#YN-fLaRw0qMtK`JsbQAp?Au4Y(BQCzlWExHD;HZu{ude`6K z_*S2_-gxFgkXnADyfSkKq3g*YxTRmUZ#5-g*ansiqrkOXR9sK9AQ~onEuM^Y?%Y_@ z*ln9m6~_AOWb}13S?38x1!7g4Du&Ok!>n|uB#GSoO}Xt14%$Qi*flQ3 zkTzQh2u{Iy7=DySo{*R$u><7uoU`u^hK~6R=>Gb~BcjQ0+JSK5gKj?MtP7K-oKDAd zvSffBc!H1NC6fz?(hkRn^r5PAu%qBz;1`B;d~}-iu-W^-?h&ws+{J38aPPKzH}i4`;uFI1#Fzd!Ct(Je_`ziMlu2>1 z>L{t-U*HEU?Zrx{nRiP<%xB~Y!fLD`z$sXPL(C`V#9KQl&c at 97WTey-dk<+Ef>~=2 z(P^ng_SS2HqPfzSzd61B+(W79$NiO zSs{Wn*nHw3SU?m(SWzwzBLRU7Rubr{AXpou2w2eJ9c+VsDVnl+1QCU*z49z~ub0lo z-0N2!)GP8|Z|26v&hY|55BIFADfZo|E_QppY)|~xFZx(MIDk-(2b{J39M*L>aF~}W z*x82cr$?OcFMq!r_q$Wj56^kS&NY15mjvLNs}FLkcjjfik_~FI&q!d~wZ^AAD%M`H z=2h935a8?MxK^2$7GS~mJNCryZGWE^xbH4$+S~cRujMcP(arFRIb+zm4L05Jc9ie0&DR{kwt-IV;;4j3yKO+46 zop+F*?8|=nx!oKC09BY#elUx791KHu86mSQUvN04X(fi~A=iBpgZXrH-ws3D5NTpy z1*Rqo@@NB08ysRS^C=}Z=GdHK-WOg7bTebcqXfJs^YY*ynt4{47ieE z)4G-yb}E-KWmvp2hX&v=qwZqzg{h_}b64H6g>x(sIBA19%~3rXSl?%*y{0%q$N6wc z*uV}_hYT4Od6qCvc at rD~4m=C25z+lIj6)bwxFLvfg=MP_714Pc5<;FRhHM#PQTZ+P zPs}lXBa0xUPm41wWCZom;Vg=j-P{>|6KCc~-!ft)j4}D^C21onRHcfK|6H7nXO0k; zE)u4>#FlBs9ixXMPcN5;PQEZJ`SfB^k*sVBhnPPgn4yNWU^w7J_dUfN{SLQfAX0Wo z$ubXgp)Y!*FJY^=TE>PpKWpTLSeT3TQC^(Om0=9|O;bE-3S!2&ELWVnXpyqWJE$0R zb`SHxndqlBH>>&dVpA~Ww5W03XLg8V#h2=*hJ5y at uom@reh>7~9 at n8KVvD|bNc!YV z`K=>np>Kz!o;H#U!vj5u&UmJ%rPy7!+jVi_sk-l{p{s#=t*)rY$iG$F)KSo7g`x`1 zTvsY~B06b(X=DiItHoe4))XFCDvQqp6Z%0_aaqs|qX7xr+S1X|WhKVJWY5>)k`_Qu z1U*PPPa2;wmQ`^VW`VN1Dppa*3geZWqtsL6quJ}U9oAQX>RPYCp|xqRqw874q{HdN zDX5{Ory3e|U%u}NeQ&zE at s60)r=_9GDK*eyeL6b8`dC>>Rqt-g8DQj4me#AUYgsWKsyW!u5 zG}IEXB}@KWU7vvIL8IdzJ-M96CV3P=thmy2EkJ29I&kbLMq$(clO$q2_&C6bb50X2 zYIO+hGD%G}z{+|NzDgj!5~exGxY(A_MqeJ>Z}>UnHI$XHq2Vc7EyCl867U2cE<)Tq zh>@i*hcr%;K8MB7UCMkHQ&BVIYLX&Wu;0)T>^x9!sYKT>{Iob}jOe8ntw*U;a?q4Q z>5o^zPDh=nhMNB(dW;&cg_8ABZjeGB5xBv=pD~+NWHvyXpL(VV;3E#g9Sa at kFP7fI4yYU~$_ zTVuI?tV^P)3#ys4!6JR_BT6MP9Ck62r74V43A{OpR!N-ndQ!NWpa}1W|B$SbOov;S z%V)GX0yzWH>M;ef$k4}d+&;(RSqY?*0!$S&EpI)u3X6B_~uVX9McsLH@=A8aHh3Oh|RSc4i8Hf!Nh} z_HQDuC2ITa?{3@`09!lkMi%1y1m%9jg+_6hD~8S^KKYw{0#mh2T#p*nRn{*~zP1>r zsh$;rh^a2>w9KhAOwE_Ci?t+HYSHt=P(@9JN|3hG--(u>tmGAmCd|mhuzcTVi(rU0#>3h5$l2a4d1ja$@8`*(VXL+t2>W=mFirg at jJXA6Kq`SSP^CUeh0-IAgAXI z)e_%zJr;QzKc`c{3&Q#r*C8=Ky&%C;-)?-RvX~nu(7)&BGq--Wbvi1Y5fu)eRh$b2 zoUjY+2clXAaxxTIl!i{@aQ4wt5V7xN!24#5!YLv}DsACNxaw at vd4>F7;!R-fNQ|#{ z!2NP^^J4ds59yX at ZrF`BiX>!WA{NkHpat#(SsPnyIJz>%6BX9P&cvufH5fR*oguTz z1JISJa|BTgL+vuNDXyjp at A%<-nfuDyTGlH{z4 at 3Tc(VEK^Y+m)J9tHtec$J~Mb0O! zYh*XItMfj=7?A2qR(z8}BQIk2k*x-yAG z)h& zHcTHcES4V<+KEq=!ZwQq{2y4&CyPJl8X06I9hSno5s|&RCXqL3S`LLW- zUuV!mvbXl$G^#2lq0uYDwJEt8csshx{2esVRg)tJvr}kkc$1%{?)bg<8cY+5$(4NQ zM3XSiO&=hv6a=Muxo=Kq-?NR|nyjsnW2qCi9u{^fnUs&HEC}1p7AeWwGc9;YG>5v3 zjhCUtr^O8oroQO6vA)#1qgTrGQ$G2*UVd-e$iYoSQEtOdKyHUJ#Z}c+_d`OclVx$1 zuu_PAE!X_70AvO3l~p}W^6NmVBXWbvIr82lr}|Kdq^^sek+hr at qLdp+VZ`vt>Ytd@(38!Iy6K*Y>K2z?#@_Wi#a)bX2=-Nwhu(e z;qd!Haoh%+adv`QIecJp9pB)3PVbPvY_L`x4z&)sz}|aP_J;Ru->BJFFjgJkxR+NJ z;uN$<#LlfONg|FCkTEW!E;+lPZygW8u(X!~cyr>Da*s*yID9~E8P7HYFvUp7UE3w) zaef4ypLTbr&`5e6iOo;3*&RJV^^Qioh{pBzRPDBGwydyP9oMY4W}>;HV6)oAc-e1Q zZVpDaM|ii^EVit%UL6np3IWGy7vHTqXsRm9ubIfVNVRZjBSKE|iF-(Fu;3jI1rG`B zcx+fQM$GJZjBNI=NZgp%@mO1&JOBk7O>H>YTQFnOM-I2v?0EXu(``V_N9zyU?@0_f zBce}iurr6EOA(~m{^E{k0$zpzN<-5Jw%<41!#o%Su#OBFEuRHH|6V6P581E;oxRWm zb`8l~SZE9yF+8=B^Rh*BN-?E at sRz{sVsksTUoonUYxdmZfbo1*OSRpDA9~t#{pGgl zvbbW3=65UB6&_2P-Q_`&k`%aUb^UghizuRa;U zwqXn;*0N at bOP&M4w#Tw}WDCQciEfR?W(<;va}a^e&Ks4q!JznCg~HsuzEd%h zX=WYQ2Kcqf^l`q at HhdqUgHmEhRo2HJN`>nsnnf_C6nB`pkJ-Yc!SWR?DGa1MV29MD zC-|k#D}RkhC at 0dns=lqsDn5>%?3i)eQ;k`R9A5D4`^6a|@B_`W=-%b**R+L7_l at 23 z6%B8Ny^~?P{ZHjjElzJ!3>8^%Y7A*FDJd|;v^df)Wl{!WtE}u}w3X)25(|syIAiKa zaq%UexdKpd9`~;pIv5|L{)h85OQ|zOGjGN$XK5GNmOayUix at TW#mp|^4z^_}1Fqw& z95be_ON5J-%FM;whLp;y?`FzWLdEBve!Z1tN1<87 at OVWG;*0X#pVY&lm3!rowqzZ> z5@(Br9cTi_?`FiOT;n9fx>(*!GOoQW+&|607uRVV9^&1+g1hgru?jKqxaEp?)m=!~ zq|7StR1$n|ax;pysZrH;W}pp}tEAyS2f*k|@l8`t=(K)8R57y~s71c^2cP#uzWl)7 zvy73KL}M;WFpIv-g8%^lj14Fr1+B9;FixJ9?%;+SKWs=3k#$vMA%vy0e zC9q9=$3TFY#%6MK=|Ye1mjwv}>9RC!McFbwuS*JY&YuA;<}ZuK_k<5a^N8=yI%*So zP&@VKh20rSfMJy`YQufo+6a{d8OM=m!RHrc6zOeD0Fv!ylHrnI?B}^BS|yf$DqFPJ zSWPKGE5nC|8S at r(BKi-~bD$UR1)$Y7HnN68enT!FxXr+bx*Mz~&_hTA$0%}P+&kza z7G^`jhC*dwM^i+C>Pqf2|3IUEkkmCOwIG$kO6{~$x+>1Q-qjW_QLJ%#uOwlnKfj#9^g&U*Tzq9Dq!Yl>#3_^t0!v?R7)|+tAT{egU4uOGnqM^hbb0) z(6Rs(lNL&qTvNjW*3X77MZv49#^~@#Js9ZZcS?Lqa^bTwBUK9!9eyGze#iiG8Yxy~ zxOp&9*(NQSEF7ZYZ57<1b at VmX0Ru1*M9wt(_v7D<|2;M2$c_T~UJoV>LQxhcX6vE_W&mMLEahgLc{gAeCgeP+)d2c?LT$j=l%ZT9eS`kyZ>9ahz at Y&aQ7Eq+YZJS3~d8yq-uI^9b`vgpX at HU z!w%>V#n~o^8AZ}Agc|W${(zXnijVOW?tEd-#u_&1__=y9WT`Qy>5RtHK_ at ip`ytG2tQ?+=k|;@EjK)mo~YO zzbg|=Bb7l0D|$th@*WN~6uU;`zBG^Vx at Nj z_La>__ul|sucJq=z at FjV+dXednY5t7^44zD2Xogo7+h?Y13w_MWhj%Qq!zJ}5PT42 zL=L*R22>8nBk`|qNIx}!8lYMX{=a3*pZwbK3FSqYZBS{1LYfrs9cN-HxpmK at yNoA`NwT)j6qB8IEYqR73{gg=Eg36D`#jcy z{y?$y-@(H$IZ0a$JQvk`F$u-<7kclIFRP;%wFxRPs${T$gbIRko_g64JHviDobv-C zd8 at +Kkcgx1Z>R~-xwJYn)rA($Qk~O?W^)G=CV;I`x zH=HKkfD at 8@K1hS4K at UF()uAvGG(kp=`O70HAsuI*reLSc@@}E0JbStNc(UK+)MA4} zcse$MCOHOo4v{{~B_)K#TUQu~nMP$@H_hO~%^HJ{;YPw{7oxZs zxN|)mgK=pi&IBYA5@`rA^_NRA2ktZ?VWahszFArFT15{=K0?Xv6K4yd&Q6fC4R-nI zx~$~(FWm|lgy!?yYzH!2>rDXS$~MEg7mk?*_P)ub9>;J8{Keh7%cUU)`ebCatOF(8 zJ(e}|mIW`6`{4n86JD_G3fo%DZMf}8Kw!q6M?W0j5 at CX<36R2vrIr|VEV9TTLtBtyA?wvp#BlkmL=F!pBK39tRtJ?uUENgtmxX#M|bFPn)Uuz zH3RN<0Os&do_lE>dA|VhR8ce7w-P!rV%W9$GVp4&W88C`>Xz7`ePebB4$jjIRZC7m z`4G!OP1*i{!LzD>R_UKCPXA8AKoV70A}o>>3KyI^-3J z;!3^hl at krU`D$1LR_9 zb?lz)rLo881~h(N!|&7wPEYesEanROR6~zR%`>`N+%xQCt6O7WwY}!pM+~l+?`((` ze;v{#Iot5YWXWcq*=AJs-)E?*TqAFdX4`tMO|wdy8M;>77O+V#ZfS^PER=B8I*BkN zGMP}>D)tp7g0UEs04qUywJ{+IBRG_Ni at 3t80YsWuR3q%rd5g7=yfH8doP&e#fczn3 zYbl<3vSDYQND9K&y3e4!&%W6kL(wXHsOsq(lkauHHu=uviMX|6%d4-j?4cvrA&~)g z)-PVH9{qlFpz6E~EUT6fFN&1&AzuJ)ne`ndAMqA<(|Ckd*FC%7!}wPDHN7{8tTsA3 zH+iAPNM1QILV}#z9 at GhQ+hESMMxxFJ#DTNqsp*{1WU;hfOrlNYD%t!xIzjvT^q~$j z;Em*=!e(5`b=Y#Hz_q13rP_HPOd%=%Z9JP#0t at 3)LH17Kpewn#*&CR|D?5j*ZQPSJ zUW1x#<*QDWI8vkCZU>wrs^+N5B`LS!HF7d5$Ic!lPCiF>@tJsXlnbe91$8K`QSp!G zu`8AeR{|xEI0)OZ;?C3;(8(6j;38}}%9r?Rl6~E{yDglIxtqwy>r(VUVU`2iW><^K zYGLhugMZ$5VnwvBYlv48s9X}e)zx}J+P26WP-Nk;JQ}eyVET>2FeAe-hQi6Oza$ax zhAX=CWM`XDs*OhpY=Z;fgdLz2ya-REXsLpESA!0Y!1;L&!o=$<*8iVeVf=y?9 at P17WZ_kS5kKiqFUD!%;$S!o|V`sRR_dQyeCqYj& zD{}x}6Cwv6`+bjEk9|-Frr;l7FN04%+XNX81E4A4s1revq=bY(3FhQ*E*2VABuc)BXf>MW>;+L^6NGjX+9$i)!88NPz`7;! z$(kNW-5EaIz_V9+a&{Eh9+^?VpgjykMM at 4f= zo$tU+To?pl`-shqLdgoWHBw*@Vl2(#WT(@Mk2mv=8D4t58SYU^RKOt884(!9 at fe2( zei$>C$UF9b_J?w*mTO|;y`$^(iL=Obix$U4p%kuRz+i{{R{qX;2 at r}|nUjU`xv^@z z7(uKtnj~|LHKq!{dt*M;rwZ$T!U$&HL)6kAFyy!*!Yt at 3m-d>){bUG!P$!0>pjI6O z^H|JEWrUghkq!TkvyG(UcopJgA`R%707O*kiuWQc%1i_8aNgz$ZBr8&ZN)nXqJG9f z+!x~HQtgFibMk@*8cyQz`V$dueVU>R=*^J_H5R6GJAmYt>Pu)fXGKKk;aq~^o&~lV z^_AOft^PACYIEr$P)^{1GiDr>YqU at u6M!@)9rX4TNN^^a-#f|Wg=67OmeTWr*_vu7 zO~(d9n5`aab7=8#Swof-aA%=?ZX`kYDUeFF0h^+p{616 at +jrFz$1k-*eIQrM25YDO zyFCC6*U*HkJs6-zNN2YCP{7yJ3f4N1h1ZpN13hqPYu0%)df<~+-uo_}d>W>^AgODY zhS9#zTQ<8;t;V0(YkvGOn at 0A3ORv2==6jI!nr{Po*WCxjUwH2*U*3T}uSOokX~MhZ zL}RT0KUhqR#~(Q*>R`P%>jd6R*-QpMsd8>WY9Z~X;Jf!h_oLGp5L%$^rv}K!o!A%y zUMAE2*^HEcU!bVzX+Q4Q^ao~F?%b_L3iQpyc+D-5sa>%!7WgN6ua=VdWk zqhts4^uv~!3E4c`e9e`&wjii2*)RJkiyIt1fe#>tMXBcQWwjM2aHohJoA3b_{ZMqg zv7zpa+afm^DAwpGsADf4P)OZMnf^+gAunS9_&698b&ID7G9+W|^ z|9R#Fo1C5K!2EiC+udo+#5q}`CzkFF(CCJ;ye2`+6(= zGwahl>vNYj>yyI;n-scgfU^tINw*0tYk*FB&&cHhFU0L^Qpcz-3WUN@<}z>cnqzKc zKkgO;M8dOdOA&i7W`p;ff~6?l1*~SA+$;T_*#Yr2H!RH454#@jQ-B5?5t_&d7oq-Z z7qOlN#~q1V)9?c*<%lavc%~z%>e%$%f|g!-pwk-1-lk25RVTgyfotBfr6i|l2p0x0 zD<^IrMWAL8n~OVmZu1=YJG+Nr?Ht at V`$w`B;P8oS^xQQDd9*X6440(F5{VkGRGo*; zbolsOjYs at 48d`uW%cWq~4q9g%pqZdNM$Sr79kb5uR$TJ3a`)3~u^TJulLd#1lQ=Jy znd|(cNTQk$n5#0*-F>2y_ai%94_&2Bij?D&3h#ozR^wCQRIE)4lhJ9k1cj1#MDb9e zYh5l$Qf!J6bdeJHMka*D9I9!UX*NA2$QE4o9xk9`++7j3sVf+fRI(!$kxl)9$wN-WiVQ at +a1+pe;LnOl?$9{nUeFi4!n; zB+)QL8SXKgvu+HMJbcEeyKmUaf89YTA(d#nPJ>pphuApD%=o0iQ_3XeZ;# z8dTP?tyHcUg>}JZ7N|pbIr-k7RpUbk at yXY=jRBMDgm?V z7*oO{7g#dIoQqYR8Lb19Z)=|x*ut;gD}l}*a1 at mBMZI0MHbXT-1mXK>2jedz3*79| zog|`7CuB6?66C?=WdZb3xQHxLhB-~B!YosUVNTUi4q!#*aRE0JlLpW#DG_dER at jmY z3-gK?w-PIFZq+$bM{+Xr$;C$6rN-;|#`k5L1u*Ff(ZyYGur9|_#h-k5FqGQe(i`ni z$>~-QQ>NF_Va9S{2il zVX0f89eFxp4GjC42Dx at XdiY?^n1|69MVfU0akHrv)AfU~|FAwe*9?p5lqP%H-$4&w z_g_z-P3HYNM*^W4vjUwTkU=MO%Lv{b97#Kh*XN=VRpOkl z63g;3)x(#vg*VF?mr^U)pd7~aFMpSE^cNN)caT1~qGoJE8fwmBCCHO=$LBb;_#g9t z0iHUdgk4i0$ma?0KyGK3CeqD$U$8zcS)Y|Bi^?BkXtY6TxjOxb$v1<&&n$`KnX_n4 zr`rS{)Tyfw^(mBZx&!Gp*%`nFOR-5Ec2;ayCI{;-5p|A2H}X z!od#(=n?fl1pd at GRdk-wZK4QIg9*|+XvI)ih3PxkqhDUdoTRS!6i^J-2_!`-E}>gf zp)FD-J;Hf0-wL%n;<-5Nh-W?mHjJktIQ{r9ePRsnBV%0qK#?11uf5|C&7ju-T;3C} z*`(!T6ayzwig5zLA-a&f at Tx9;s!W at dvLT{yE-Vp0K8*$CRoM(^RjzR^ z`7H5K-e8hYY0*|xn(`~A9i|9gBr_Cfc5kYnUw zj>tJ<#ub at y-+HY&$3?kuo~i^R?@0{o(48?zr_m(Eg-b+)wR~gwhh6A#(B3Ye7b(iW z)zHF&EHGv2>w{Jl7W?pz at jRl_s~GPMu-j`;Ac=2Fdnwct4NTooa3FPj|$V^!H9-=nd5EfX1<$ciZd zN1E$+_Nn=^fI!aD9yuUJC3BOJiZF0QdUKQ#bxm at 3!|G0dvqx}JmegV_8R3l9C6%(; z$bQgcwzrx<-G2>i&_-$2(NoZ~iObVLe0Gc>Qn(2T(f+k3)g~C at ju<#`W6U;P8Y zT)#*k7QHp#*usmp(mAxp at k-UcijNTAPP#|!LDsz&7pA$*e8=g52iS`XkKaaln}#0} z-0r9!%LNkbG at o{)WbVVYh~rIfaVo1vxKUeK${qdNHP$$^b$$f}-~`)^bw)Hz-a1^T zdj-?j&l|_+q--F+nYfZ`%gH^QH9qY^zaqKv!G7t%n8HPp;6vOe at e~U|0&d5-!8}L> zcG=_KCv?hy5QG+XA&#!m(3H!a?|_X=z9n6U7MZ8RnkkJ~a>S)*YB*rqGDc?-`hDI( zhVz&0lfxIsFMC#{oj$KE%nq|jG^L at G4=hr at b(BHT^mKJ?VZHgk&>5gQv|GGCMHjlM zrjgAik0&5*G5HeqLI1 zQ=?YN^`qh0!=#QZh`m~ip{`Ww0ucG at p`wB4+)C~2T8o%9q7cVF4zEM?Np)XHwAus8 z9f;?_-_8vTm{ZnwT z0y748C0e0~h>pq=Xhb2On$ah`7QEAbBwsGgQ?x}s*k-$Ll#*d{*Ad(1RS#RdayJgFS2Jv2eNv$f6xnB-96b+JiAv=aok5!~njmYqh`Qro}PT z2fx~BbrAlBryYBfqmy%x;?=@)um}8mZwH34qpgr^8~C;ZcMrCWpx5QrY;R|}y(`MR z>$O4e)o*3N4he5J!r}l1E}T(x7Pen|lF!8xk*BJav7knZYbM~f-y+?V9yK?rqH>p| zJxgDB3%+dV_(}$Ee-LhsY|);+JfLe$T?9sE&)U6(NlCI__X@|jAR#yf?M(}b9nKt% zw;I1oK}y)i0=l9I%d~Es@}=nHJ*5Wugq8u(k{U9QmQOymtm2-HJ&y_;hPRVBi7U}5 zIpb;}L&>i(L&R-i#yGPI@=yTcoyL; zk%3_%r$a6AY3dklGDgj~v%7*74Br?; z^|S;%VVdjNM}CgT*E;L)*Dw3DJY&*?C&of;9O7w}UMimk;Uc_12%8X$M%_Xnk8@%+ z*=(hL9OZU`KtSid8=-h|GkjQk`~cRg(^E-aK=}vRUlqkdA%6I(ZOeTXvS%C*%B|~f zU;@|t at R}RgyWd@~c}}~*r(3Ve1>az|?fzkk+v&z_A23&LKZATXRaQ|uqN+~cSa6DzxN$TSFJ78RFcU8@ z7U(T()8XL$T at w-)8O`0k&(SF1NaaQ_%4W)vHe-fn~OKkzgjd#E{) zaB{*`ERa&Q^QgaZ|K5|(_Qy^A86x}jYMbc{W?5JE${%vqp;D^UE>*fk!GbQ8Mjic| zM(~U#b28$USZ!RcKn`4~RLhw{2=#U at b}AtjA&2wk>plfJ1Xns*zppJKa at g*D)LzOR zr7gPY*-{HK3F9qI=C@}W6>oi9k-p4C3D#lY2eizDB^7yoaS9+%*tcLc#V#JbO&2hQk3*gf%e zN6fjOzZF#10l$0DMd*cLdZS6#4 at wtp+35bZ1w2)&N8xV}<&2ab5s(%Echp-IBGx|c ziwP6CH}1O`BE~iDTL&FkuS}ws8j}!Dqf0^h6tqo)Z43k`NbqwtG`zV8lEw1!5htSG!$Q2K(oh#=Fv9HppTk-tyIIP@~tZ&W2W zCd-W+LGALTPYRb at 93R3-3a`o=Ne27n!e=5qkgB;~a$(7_0nAlA#ceHH;d<)$2X~Y$b*)Ow$%Wy>8o`pFG-_2Nk zD!R`h0C#f|-aquIFx9DtNTiQ0oFhn5_S)`NRBauNY&S45v61`4K|Sz?PJJ^R zWMQxN&3CG?1S4X;TtZ=}3n!OOiK}jJBj^#x3BK znYK#FXh;|t6ZSCx$$bMm8=w>sG=K^A!j3sf-m?_17UVF`?YC21#t+} z20oO>Q}6eD>k)RM)$VqJpH&8Y1fST?AE3bQ*<*@$~dypbF`qk@)uOvO`H zbe0oWQ>v7jAU)C41bs)v at lOvQuQZ~iIL9%l%K`!?c8*at_j$2maJ zOVD~xYYf>3V{p3K&-&OjI;muedlL=#;K3^rNh&t3f)R`h(sX-E#Gm^drs5$xcq6!r zh7tQaz)6FI4M%t>^gACT-A_mFueH;8*=*;5g``P(O+#^k=z*C{&L<8fj361{pG!?u zG*!gehp#Y3zo^#WHfa^Sjh6aM=K?!R at l>mAkf<|)OrXqX{YLx(M%>x79IB%nx%I4S z)nk at f>ucxqX>WQE5XMKT(>L5fnCiu#D?Ta~?m2R49bzZVca at l>>+g873^+yC=3&r7 zz#`n=#TCzd>LKgHm-B;c#~ZunC63<(?|I{AN^l4%)FKSGlYE587$6Klt*_og9N_zA zqC3bo;@;?MdM9;6hS at v@&|X~I)rSd&b^6e51wHe=yZibt;a3nbhBhgaPQ;8z&nql9 z?$JFnViFlAGn}5U$i}ga1nz5_Bp>t~t!xc&?0rsXKZ%NnbMF+y=V;4}OkXFzZ78Zg zzlH at C#7D-5!{QE)t;Dl;5K+{jlXkp(a-U7+hl_lJ!0j=TxP6zi$|2?Tf at 70lrA6xa zB)SW+mkJOOkYKIQ+B~>0S0;|XB{!ahpJo3c4njU`%Jk;w%aZr|BzJT5jZ#eE*!&%9 zIGvT{4lPjSofj}h>PSDX?xP9{p{*Z!bgBOxuqOJs z51lO(K^}8ZUXO4JQ(dNj27D44-NzTw|A4W7lu1)NsR at uI8Q{TRvc|@jE`z#u_ zCvI2WaC$_FxdeEZRLr--Cu3&6UkH84!IgD$3z+A83HR~I3o=__*as|{sYXg9Dy)o% zcTuBd^K{q$8D>N5SZ)GC9Jf`phF7f>aCnShj6KG6F?|R}+!Wt2#;+DlnG2c{>p-wa zD*3(VIxY<37x{8ei#A(V2>$~S+_0_G-xn(S=HbZoL(p*!sir9?O#XvychpBb>L1t{ zfSCpfaKw1&;xg(te*>Tk)D1mY&{<=ibp at gpbnTJCZkHr4r>% z0EQ_8@{{>>PgJ*NYA7IGwPxx+pAOI^5iIYF6}Z9N9a9qLF{+|k5p0@(WKs66>rJ5E z076ab82nAd-zU`&gew`aS1~?Fn?X#V&eyA8mZa*qkA1{p=gNsfRk zfB=8gzbE9w#gG7-8c39bG9J7k1j)rYkIVq=8e|KayB{WmsYOT?unE$$e_Ckc3xbEMzN z!wc#Tz1qGF7ol9>LaF~NZ25803Yqs)(a$5ZMw?A6{_?|E;v?dK<1J*nr&*eZhZES3}!A at KOaltIhFC zYtma6RVDSpB+Gd~^8ve3`S(z9_ERVe04qkSux#r=kt{t+mhz(I^aG7U<3Z?y1{0xi z;X#1K1ylr at a0xJBoq&Z2kujmALBs_$fe!5t_Dh*{LpzEakyJy+gk3iD5?tasUIho< z*F)#G?LDGu-Sj7AL=O%(E%Rpw>+%aTrNe_3NHC>?Lk^M4)N#+3H)|to6*p^ZYSp!@ zGt8)TvB_R9(zU>Hb{nF|=GNHH94IxhtM!H1*p&aiB%@Ou+9)=DN3WJcPLfI62%%dZ z=cqz!TpE at Oz_IdY+es-1)v)ta{W7PnqG-`Wre@(4Ph5uBsxJjhYTASmVMi zvCCQnO8G(E4MX23ub$tm7kNua32Ilfj)K#wW)nv`p^W>YzXDAY{XtQChe#!^yDa>>r%F0QE7CbZZUgSE=+{0Mjb};Q`tkS z2Zim2rxRnxmzODpw+;$H6K*8dq~ao_re^+~j-n!)*wg5ybFDG#k^QY@#Uq6%XQ1#M}(o7^W1wE&W|!Shuu$g$n)Ct6E36DvMLx>;JG%lV=ZeE%HYalf0&X^%uB6PtdjZq?Zji zcjQq1z6o;$(Gi3}RJI4U88}0 at dmwER2F6^N`+#+8Js$iM^cVM}&NH`6UBVk)iEe~I z1zP^^;o^O^{L-VOim^U at vCOA?p*W{6UJqK}oCm)o1)@)?K at 7tJ>L?jw9xCNhO6kg>jnVo1oH4homLtyaWUdW7)^pd zN0a_24O(n`eYbh at NbjiglGWwUe>=5JXlZA}1_cB}fei#C at IO1wDd%8pX8r$v+P_9q z+YwI_ou6NKZjpX7YAn)p3c1xZ9>d3EA`V|Vt$1AJmlt0ny*P=5U2LAj^|UK3KYyAz z3J7#YeR6$Ry at N%futGO@<%6iY3b>%sCy=0;@(855l8`dmr;wAOhoWs-8avLZ>0i6o zJeOPF*X`F6%%6|*OQ4s19W>1QUaHoE3M!pDSG3zPR%9GMp<&2ksC{bz&ouwMXk%P~ zVL`$ZmGt&SNzYp^WWwWMS-o#ly}d(a07!n!f$AIEt*^u|tlpm2w-+k%N+6m`)_-gMMRff`LqSjdB>_%vBtf9^yp zsnbhe)*@w^PPX(ZCJFawJ2w at p2ZY4bMniSFNI0O!R`Lv2aDi7~VN+46A(JHBsrve% zpC-#D?ypX%RYGGXo at r@?-0 at m{i4+p#YW1Jf1WA}u0nWONOl{yzex=eB5ZSm?Gb!Rf zWj2-TjQ#mm*+ at uOf668<+^E$}&rSTIun%*@gqn{3hM1HCuH+!5wNpt56wfD{E6uAo zOUv at Oyf2cBvuU6)Ph at __v&HDNN+VL>jH3_~d_$n=8z3Ml!^SyjOwXyO_y7>l*!ur&Kvjd6Z!(vsyno`@@~a>_e{}JHs2fqDL#dAtvjSQxF#I zAgKCBj(v{ePmoLlUkR2>Ugk8`JlnRKocgL2XPcG~W>OSyrW~dVHvwQUX*{nG7Mo)X z6KqS>e(kNga8B1bM{dvErxph5KI(vG%*34J!B2GkBEk3!!edh)0tBJ at i>u|4jJv~~ zw&Nfw%s!)#ivf<-CQcraw>4LbIKYjm>`%}{bJU>IMU5z}dJ4rPh?@oRHAR*sgF;GU z49^1IvByMTclc8j;Tr*);l^tIonxkos>4D`x}c8RKooqI%|q6ZM!P z`)#TSPi-Nl1&dTl|FraWEMLiO*>9o2sqy8y`=Qvg)NNSfMiVL4Sa4*+!YvQ+>W|Ye;7dZ@#BvqH^D&_{Ji3kD{?_j^Wdicr4uhy2I z8LA?;;x-4<8ykV!riwluu1#%{w}6LoOO61$k$D at 3Z2QcsePJrPh%T;jj5ydF)hE at I zg;fpdOA&9CA$7#Gh4>%uWun8Y%U6Nq at OFaR#IGRn?J88ynqi z$4#Tohn0$VzHE(&Qx&Ke1ZeDOj<4#~uJalb>-*_;r at xkWSYOz`ySVrh2=H-n z at Z<^cQ5_90S`R)M>mI50R8yQH)zRLP3vJzoq&12KDJ2pc^Q+6|IhU^WxMiVx9l&|U zbmPAyXj_ZGT|EZk!@Youz7c=~u7(SSUVm^`5WN~$xC25g&bn;mjhcU$_bt2eA%*Iv8w3kdZ< zI?dlVSTKK;@kpiJ;L>>jUj0_{NNK;k=d8eA>BpD1`t$;Q#$iSpP04Sl`ebvTR4Sfz_m0$;4y1pI$Z^Qd+z_Nu zF%$el6FzMx_ja|+YS<`~E|~E=tR&Aus>OJNQ2%Vim7Ym*)``|}KcSGnOeoxJnVlwG z=FNQSPM+)%)BNn1pNx}pl7}-2m4$Ea(ZaSKas8^hF6G_~Q%({LU7FnyI3MQRxrZPl z2zyRWr}jES(!{H=2nzg!WI2gXI2JT6{yc4LAJY#$VD};Lc;z!_IJK;N1;8D;>xB%7 z$xvcrZ#>??|H^1~>ChJPp3AnnCZoN*fNpj`NN8cy&LrrLxjX5n|D|_vwdMkPpVxoV zj|;e9VZO7L{Iu8P6FJOow~VC9p4dQcY|U;>ZfhOuvbrSt0XKfHvr7As7&*GNO8g15 zf6qTl{Ru^W-<6v9X()1xSu6}?>$nBx;kqn;#d=n0-`pqw@)(U(hCtPb at pM3OXrtqj z53kP8=&D9Rb)JuFx3biavBx~bXBg$xk0A{)9(&bq{%hYo#w`)gbId&|`WJ>{x4%cT z5 at FGQ>O!Qtlwo+Q^Ui=u;ResmMm{6_38R%xorL54qViQ$BM#;$!tRaj`JDYSC$Z97 zf?H{ZWJP^0t-&(EtsWBZifF7hEH-rj!qzAly}pU9jO4VxQ!_*Hj?6m&t6P!CwY|IH!g+}8TlV2 zWS+NFCOL$#<-L7wxcTRN^IYb7`uu+0pov0HmE}xmqM!)IkVa6A<)e)$p5EssP$hU` zxWmdP1Unq;hK`M=SvjJJOn9ys2rY18rj1=o^jEflPa!^eH%Rr$1ldqe*enPq$$rsAJ`9m>@E*!PjZ!w#)$Zbhpi1clYX( zC}yWORcwZ3d?-lITL6hx_O?K%3^zC7JUITKwJOvr1DB$`Pkf)o@&{SPP-;w^t8tgS zRhBJ0Tg3QTl~uc4$7ux!O&U4gZ~&YU&~T^*S~7mv2nGVkh7k4ai>6FxbU{1T#^ zE7GRYjx)wsZSS(Z4rwSL3Kj;pYp*CkokJTgps@;-8LOFPKp>rB^0mYMbK&LyKP073 zcFuy9Ixo|y{abLFWZTp>v*tBBb1Pf?wqPFP^@k9}*Y#fF+`#^KI*mklZ)P<_^Zc3) zw}Ulu3puZx17#=GqWlWR2+rANBA$SR=mRfK@`S0B2^79pdz+OScrQ;#c~(&6>^{dk znn(fP)`0%s7d0<$;@W(Htw&Am0(LREi-1pZq0~@C{92*p*+OYx9l at IqtEpZCcQw!w zFQwc(q7zYQTcBXJyue1FC*ZI%2jHy2%!tsWT_WEa;JoTRES at puqoG_i9)(`8B!Mg5 zzTU?2I#&rUitY zqy|7F+%+LfGYxijV?Lj9R=jlLf9nS^ z^$O104FUw at 1^IvDE|&i)(7O9CcYWVbZR%WL6>tp at Mxc&yPzeqjl9E9%6C*^3+zph~ zcG-_CCf%gN`-|P{p}Lkk~US*Oc*_6Z&59bx7=ZuTksQ?4f^nfx(~$|u^JEhBiM7tsE*zBf960rYPM(7Be3 zE4G_4X_?|nxXEtK5}D4a)~WR18JO4A=_pYt2dp;xzpViKpr|V_P%H}FYpC63uR9 zWnoPiYo0Riaqlp#2-jm+!v2R5#fTonT<>#11qG=d5yJJaBPn|>Sqza&K9&%Du2v4D z8hDh_aqC5Wl%8KG<}mpS1NCatx53w?H}a1vu)laKe-k%>$>~sm*bN6nD>~o z{rP-b*9VLhh$GHPG33b|1vD!*AFA0(9HjY9N;smO6TPTI978QYEx{D~2)G6DpAKQ3 zYCA1Ta7vVY{B)v at SsiSr6VfxDECTWhqi0S&CwJFrn|1?MF<8yyuAn|

|FEIU!9Ow49$x}us2bIYz1`3}NF zRi!$tvm=&Dot%XPeI)&PPu6tM#S;}SQt3KNH5|-_bt|bcufL$E{KV^bC)UngDJ8IFV zf53cw*WK-v|5VEPegzN2^;qEJ=MU| z1+SwWauM{R9sVMK4R)spCLAt+uY?yNXos&$RF+&+NNgs?VZvNrm_*5`%Uq3%R9TK* zOf1B85OtiTZ*M84TA{3C>`YjJp3&7umMejZMwBu|5N&(N9AL9L5wg9e4C7?>@laBE z3N*AhY%7yq7sK=}eyr4(O_pvdeuQo{SsE`V)GQ@==Pu%!@tvhg>pd;xoVcl-yG1=k z+rKhRxa=-ofAwZw!5uNVy1}V2CU>0)^yy6U5kl`6zTU2)iBjt at V9FFfiAzx;DWVdk zc>KIeuX^_8EC(tf`_!gKa|OBW&l^k>MHY2yvkI+A at eru8+&5aFm)2 at vSpw*L!G<%# z7*R82wd$mGN2>LYU62GPS5sHN4?adBU8_l1$Kw7UgW$XZCFo zaos$U*W^(07?B{CAdAM0Tqg3ld{~O2MswNe3l16ec4BSoP8PgbUUoT7ok*Et(Neb| zM`4%VckH+EOUDuwBCy=oaC4jp8+n#3A~Ywjb1w-ECf(B2SIQ|6>&m7=WFZc}knPAF zjwr at pUy76!gAPuii1xe`#ZO+)XHTlfhL&=YNa#hkwzXdt}Iht^SbUc11R() zyy{Gr6cN*VDHFsxKf8KQ%I}3Q)M_tO{>^mTh+GIuWieK*L8-SgEPrj6k<$bO0v5?; z?Ko;N-i`qkp at PS=GRPiHc at kSXm^kcE)PgJu{tx&VN1##dBv-p$bIN8%8jD+wBY?{xaMNz83*V5HFOdz$mJ{=8 zM!~0#Nw1@~q at Fn#b>)eo40$m8rrV;b1O0oCb zM}5X1&;Jw{ZYylPh_(TWsEA5 at R1%93cWKOK!d*J=)z~`{$Fm>GybaNwNcIm`Dz+Tf zUHwKvFtuxr#CYIrdYCaFCv%~isTWNJnGqoVmbx3~YM_>9+6B|Xscz#h8UkA|q3- at p zKbp`q at 6fcI{Iu())0Q~mKwWt at sA2AWThEPoF~$5iVm=IM%DG$0UYk2AhWDBh#YhAn z!@D=$torAA{y!Ff9b!F;+g_7{cw at wQb!^uPrrM5L*~V>9wl@(Nj1G+qLs|~723WcK zo~0}0{9(lQIEz?u=-oZ^QNT`B;iu`=z?@KmYg*xLe-V7X{|L4BL at PX~?4tk$ukIr$ z=n@k;FB!;1oj zPR@=7M$Z5LI5@J(H at 64Tfb7y@s-&-p) zBQpQVm1mvUxzC9cJKB5mKS6w(>4{vc-*!rS9SZa=nk^ zdi~#V`&=~`N#bMoa7|RE%Em?zMshGve6R*-j`!0?%^hiWYd*H34*1ZHPVO;MPqM9OAQT5ASln4^*Z6+t7LXrwSflYVT*}%M5p7j z6E6UYw~=b922AE0M=Je}P^8Smmh1J(06UcFrAxJCXV<|=&bJm*^y6Yi+PU9QE$XlE z4(HYJOc&B;k3L+|BGm?7*le~V%FfybBpKcX{ENz at +jK>0t-0xdG(1~&NQgu>Hmh7! zqEg!>oz^J5rZ*EN?ymtAVh5vXsZgi2#rXs6bRm%$#flf0ql75#S9V61Is z&1!dtfADf^f^)AOh?wObnOZ at ruVgjjz{&}&Ym`l3XbrNzs13Tm=!Mo8LIVJ{=~QkkC<;qASNSU6N^F-_)k=;! zvs-%AV at 7rXV0V&ZRypKJ7jeA2S!tRIni9$8rsNE;%PLKi%lo9febm zhYv3DOlK?kY_n$9T{8Z>do at d7TNAHuWoWTUrds&hBwMm(0(;v`o|TX#ShU`ypgx{Q zwqLw{2aaBnwDg`zyIp3IYhwioWUC&WrRwS?Zr2}hlbW?D5g%5=b?UNRBwS at ea0l(F zJgK>Z+L6aKb<|*2J4NtMfr8H5oNNx}(cojMf9gy-p)7ERHsoIHKIa5*!YG_T3xCnvaa=6FnHcvL;VQq at AvdAIcsm47n$el=`eW4!h(7KWfW7M5b7M*{i;NglKxCPc(Lp13TdP8 z2&fwEZUM+Y_zA})Wel`3FjU|W;P=c)IB>C5%D#ZKFyQ at PPiiC7IbMk*WP9UM3D05H z8xPxqH`DKzfA8)fJW3Tq?Wc<%75XKw6U5StFvx{Ml`sZcFHsX?9d!8JF`2u5=lA(D z-N?^>3u~cj4a9iV-n;Qb)ey`onvoOL?k?qDy`}8jyRO`$L$Zi&IAKG+5ZktYraP{* z#WX~2L9Kz7|egs>Wni- ztM>2R=HHX@{}Zi at 44qBs9Sn`F4b4qyE$z(g{~e at cWo6;}1rU6- at rNS{8<{89Bf^si zNUj#mHfT0=En5floo_%sDC$WOoztJ0u8nhR-$D97{~#EKrwW+cPx2fWFVM_!EBh2A zhfR>UxfDS|KDZY)+uB0nnyxR6d zrfkT9f!9x)SlL!+dS$*!h=5Ig&;Ho1P`6?#-x3jz)kQ{txXA%(o~nN%pxTFLGu#m=@#BQ0} zB@}|<0qAN!UA62bC^iTy6voz&UXf at O@t=il)c!N+Z1z#Re+V`<#pJNKWyh1*T|9_7 z3`Bg^pA_+aqT9}%#aVcnH=Tl2+bpEQH#Raq^UZe8=Co_^y+4z;0&T^?cUuIX1CB*; zRp`-fZ21nB;B{!S%B_JB|GJ_ukoiNG^XG&ZqtfFPu zz- at oj46V^cKC?^AN$>n9-a at 04JMdiG6YsiGCCA@H2r=R`yAbKMTmzqMvQJYAOw?k_L~N;|NFw}=x3^zN;ooJsq*$%Q(+s!y2kd7BhQcP>2Etl> zJg|EUUZ^A at 7=&S2jb@}PZVM4pCqk6RvA9uePV`twM*u zaL)iVQW at DiZ0^r_k^9ro8(UgC$Xb(eL6oJQz8i(8w0&A9yaHMp2;GIVaDU*^nwhN@ zRirlYl(pq;rI&i%O-xvAXQJXTc2o-s^4mp$+u;7N0Y{i^8yuR!LU;0N6}CRwN)0P@ z33j at OWC}NLpDH)R^^m;kWBc+e;RAi at EMWUHd3AWH_3@QR;%5AKG`h836E3VZ2>5wJ zz>7T>*PVL5I-YsW8oDELfOTG?zT2kz!x9iYBECCR2

S0Q71D^d4~t6n3H=y#PdqxcF<>B at u{2At3!D zh_WTpi<>Hk1~y0sMI|9fJ%LK#hmY_fa-Sd$k-Xf-K1Cwh2sq5L(v)nZXNATr@cr7_GSYa7Ds8basXRB53rJn2Fqqxq&j=f$lOgr?bmfu(`p(%_+)iYpok7Zo&% zSLg#hT0T$62JPwbnii5W${NLs*b!tK7;vH7B+G4tyf`yQ)glu=$3CcDm%|>y3VN2^ z{Ilh_o;F)t9FK4Z at 5kPoRGy`}$96M at 2X}n{FA%vm0&W$)t_}TDy{{=GN#wsBRiId> zHOq6|&V^Uv*9Gt6S{?fIi`|oI&*T!%i$$Fezc2Vc{g-^-OI*_=pE(zJWjkh*uFTo1 z-(lo5Z^^1XIwh)098Rft_GSu9aw^-xq+9ZD>&@q;W(t#d)y39A?KMMmJ+_E0k(OLZ z5PYGvLeOakfEDrftzcZiiBz((_9nsZMjXs{rF{tN3JLPYdS&`ynYtt%I|J0*5DDEN zx!0&o6=6{du_(k?4MbfN{4dZm5wS^&y!3kT&O=5$EWPg5&YqulGWi>WyyLjRalLZ{ z&9AGiPp=^_&nJwZ_0;E7pW)8a>X}y-QC*I1O)Cyns at P9``p2IR5p$qAbj-oi_`jo{ z?oW?9!NLPIew9wBUAheY=*D(W<^L9+`u4!9FUQD9PZ-{a^EM80JAi2h9NncyG6dFO4ogy$Ij3ctUU_lP*U1=k+d zwvjDkm#`YD!)`1}md3dt!Nm>NjP#=UTn$VkG>$bo`_+<5#{HAa5%`|PS*V`wO4G5K z+7INs?EaonnPuX~_kSZJy{ykJxWGU_&;R3m=)aK>F;_d|e-M#>&WFa$N(~AijPzF9 zE~r(i-W&?v5d0BDuWf-K5(z0V3jS%IRTq*xZ70K4-IMtfzb_1lJmx#AduodP_te+% zpU)%IK1es62VEQHCXvhvbHHG~3E6QFbw05l@|1~%_ at HV;K64B)txbX?;HmFfO!znX z>u${)o7|yq_Gn;YD-m);6BGC9hK8YWp);WSXn>rqN7PT3g47~FjpME!A=0MPl?EQ> zpx(V>4#F;r={`e^)$dj)aGaOes-06XA6h zk+WB44LYevMYZ&@b^|0q`sZ)1zYle%y% z!E?((#R=GHf;p38lvRB0m0&zS4>GCcxIJWicmnjwFVd)uw6?#rJBqPeFLt|vMV;X4#<^T zApXDFRAY0qsu!#6T|PtKC8x-fkY;e=?#<*M1EHvr#+7A;|bLV{n2KFDY&m`eClf5`Soej zdFHB?Ka3w(X4e%I-9cKETa5U0Km&zqfog;?f48M+JE8#9{m4PS-xrk%Z)`7Lszn?M zk2>81BCE%t{kjb%XI-_Y|FOYd>rF^i8ZUvg(Zad+5(+SdNtaQzS9K;jN~tA8?l at il z$nzZ1({_~=J6%0>cXx>L2~+Ji{;+=l#ROw8hi0SQ#*FsNv&RUt0um`N5gl!r^@TF% zPyqaW2qkPWLW%JFRAm{Z<4H at uWt!V6fjr3t-m2DSJ>jZ~nTUf4I1m2mQedJ@|4u~C z_m(^$(vV0PwJGY$*h>YYPqtnT&Iq$KNcw!0)Wui5+6K#>Y6VCYNhAT(-~TAN&%JgU zss3AO-ZP(R?b(6`BVB#>xPCdwQyN$V#mJ<~InQL)6gbK@>zHoywiy}kq zQDX?+n7q5VO=L`Gl|I-7K*umRt#l at Vr7ynz0nXBu2pkNH0x&G<4^|dE-&Yj1a{c^v zVj(vPYqpKot{&OBm4(VAa40#KU0HAxnnd6?e{Zc}!09xQQV3d#PGsOa#Nk(OsrvOQ z|G1t}U7FmcekNP+7Q3+thlaRV2+LzAEvzUJQwJS&ZQedRFAp!m-OVT)K5jKH8v|A; zjf>l`76?<}L9bbpm|WPr^iaCMZBWk3QmnLTuxY_35N?Q1D{iqJc*h#vC02;_;x7!k z*(R4LCV>)%eOkyVvH;{MaXD*}&{G&vhC?t_7ts at mW5^MdDSJ)S5y2q4v69x?tK4a^ zSrBk+P^jni8NjQjcF~R3PhY_B`LDtm{}>ln+l#Z)e{seQ1PF-y|7BeKhi1mS+$IAG zZ%MvogNqApu&s at 8^bgB~RMkywM0$%PD%XR+iUquF1F*s+v4}}`Si+E at BHunfs|{BQ zB%=f_>4 at 6exLMv+zTWSxj~{cQn}bAp?`8WjQLgx?U9Rx4ku+#;S?FjKal^|>MuE0R=1P~=*o#<@|a4rC3>q`a(_(%3nS zRUv=0C6$R6wI!3uquoi6ho at Nzove$0b??=+%8zY(^Ww(Ji`saR>h9!!67xP;~n^UXPN at D8^ntB{Pt7y(il=!Lz;J(DW7IgyrFaZ-ml;;2O=9E z9)j)~(Ste29Lx-ChDK}n-pDU7jfGodkeVmIOtM{cO|g(^_yzi3JpwC7tnLOB2q+Hb zf0`!ySC9Dn8*(8h@?9cy=)CVeswcoY^h8m?vW2rHM?bB9c2v$jDXQ46ZWpOYV7VP7y zJPZI}*oiu3&D!7XRa0EuyxO8>{Uu*5(>iA689^@tv9~n|^)TFdnj0I2n*ND6YExad zFQ#cYLY0*!XSeCrSSwi0yo>erQ?rx`HB_g$t~RsmHvZFf6ErZdr36f-8zubJzv$;B z;&qhgI4=$%K2L)z8;6}7quMJ+Qb~U}HHerX;POfvm+CX{f}J-^@|e9tJ$P=KT~(QS z;1$Lk3awC at -Nh!gY5-D2M`vs>@g`|fd?Hut#16BPrTl68--~?{Z`}k-BoZx!B1tUz zlg^mB2^tiLJflW<3SI4q)@61ah$uz=IOu>CPJ>!KrRExMimg{jR1;8*fz9X?s2(QK zg6)IiO>()}wd|&MF#$F`j%29w%A1y~%1xsenoWz|&-3_E9E)|RG|8N^E-)SspNN%U z5bzTAd*tKyH6{a|lu=629JhuWOcgmXcA#ogjo+7*o at A+o$@HooTYf#Qahnd_!C5j? z^wk}pd&DA&uTgZhOmYuH%IVQ>_Gp?|mzXPg(_q&qn(#TB+ic##et{?OQ?~t{#0X>@ zbl(3QN}-B}8_lC^8!kV9OU>Id(zOSEOa3EQrd@ zr8h#&MRyPxbnqCVN0p@(+s;$ex#TXGJ>w=67D|L~(_xszr3Z56RsdEDCBD~sWid&H zoq>S9GDc{J!r%Kt#vU{0k0W2yTm_$il)i zWcg2wK1Uw8S^4l2;5V}1id{-Ae%VTzXN*4#5M&%s_jD5fF

wL&P9wurIIdzRO zQT0Di7MLP1BT(ghBV*$(c6(}rpxOIENp(nv7#nhi+d{UJH%`wyEZ}o4nol#=-UD5} z>!mPw5yZqxH;Tj;gLYwkpatJETb>OeoPW+9d#*)ej*7K}CdN0ajEHq{sz2emj6PlPgm&GqTz{ z at dx(XesDAVFI{QhC;ZofTyAE}LPnRhd9s4$~-I6GL5Pqo6yzI8FX}DQ~H%xt(D*?tEyQ?zFMRP-) zyXQK=^BojRC~yz-9}EWcF2c at t5hT<)`Zk2sEG+^^d|Jnaj`JEYdMeV*#_ at mK_M{oWu1Em ztKCbi*u5)okdIn!^>!FAt8V8dm8(O!SEogWh zL|Cup`CqQ;>`o>H-Q#YXU|vs=*XLWm6b5s+UIV8VwVAi9rk%4kyU275TS=-^+La%} z;>5}Xz*ni-TkO;}PR3f5z$vwFf^qjW{>BH1I*TC(GE>vjj54MjE#vDc`BfHT4v;io zv&T}YRUOq4ogFrxJ%IbF2USN at VXB$~X+W0wZjfO(6uT5jz?w%DB)ky%Y(36>(^XM> zS}v&HaC{9n(VskTvaFRes=|fE6~c8UGR#ItpXz;VhrehQ*pZAVt~pG*Wv0;7XO zlkQfzCA%3^vgESBq=ST`HBaVQL;*GIEE~Eoe-6_5|SbT=l)L z`ljv+zxD7^*3E$TOTV;qD at w%QO0>ZOnF)!gJnYBe58t;Vy*ti=_uzWuhmZLY1bZV1 z01R?E3`XiWx6tg%gTXcBK7VV!GM>+nJLImD>(5$GNqGWc at 5C|*`vvI?zR){zq(sV% zA(pwJq7WIVhV+8ZGX_b^grF&pj43ZhC&B0(0!`O9b&|8jY$ztXSmq at ZaoB@07m<5f z$D*SchMBA;EdovA>YoD}k8LY^0%*b8tvr^$N0j=Qu}k=EcPS7c>Kt&HKGv1lOOl^)%4~lWXvG+ELhnSu3 z^$!X(H;~r`mMJ-b_Cv?_oQ=Ch;{9n!YVIFj@}B>@;J+t+1mV+6l>Xvd74-j_`1ucf z`)Bo at nyvGu2!fx<)T>NV9(gY;Chi)W zUX1%9Yp6;p-C38*pT(}Q8);Z_wVW*{(3`bTm88lL_(YKiw_1L7iw;LJba0E#~xqYZ_4TF)>@1meNPRv>3n-WO6 at 2vY_abzqf0 z)p}XEQzb`=3?D<1Uz|>>oZf2|*Q_+vusycmN;}2#b+>KTd)DJs7nxtp#M=r8ea~t( zS`MJWMve5Let7C3=o;n+OVOVd{0;7*KxSuEH5tD9il!eBhIH}S5~|Kz-(&Rf?tAGt z^GrgC%VdvEe!wBeN|Pt3#?)cKw!y-z-q+8=FJf%gGYn%30)*9F&P0ZsD%YE2&csgK zm{)3$CFA`!9908Zbx!T$dTJyfYpWs|b|{4=*{gquR#%>iAwOG~Y at _!Lvo)L5Gb z*~4vm=AqUt=yRXwvEF#>cWNyj!m)1gE=0lM0C43Vd(TT>p8QfjDG0fwBR9zaB+XL| zLpVCN6_i(DliM7B2VwpBe@@4x<--6u?z=P`?m+CW+~JX&t;|KKfB zr01qxjenML#mTuc_^q_TV>+Nmy*^9SVM|6dPOm`f%vklb95;S9WhL>V0z1O~ zjXUB2$EagaS|}(PBcN(O{hpn&eTw}YlT&10)FG#>@7smoGqYvl7>Sndpn7hf&z|$# z_KGzz?iil&j$CPiY28?}e^aWkI*i&Q?7$`OkZP3ejkRDFffw_aeb_1Ty+5&c_yax% z>Pv*fUD4<`=nk$!0ZF%9jq}tES?IbzAKQ_Rr%osuM$swpy;EP<>21OQkKMzoLSoio zY$s at IP<=pXfYXst!o{;=XXh7z2EFSlKKMmk$33z5w3oS>n2nNZ=u!G4XYSx`8u(Z>p3ue`qE@>(d;fB+gqYq z;=8Vqv at t=NeyC0bBcf9|tW!H;pIkGl5Z$s(QcMZ1IVy2}6fIjQmivt?#xdO}lfQW| zLtYVuge`KQp-{rPO zm8kGLUN at O|F1Hm#;R=)}A!PJ*kb at 1Tjo68@zU=UP0q~@9sE9TvO!x4=XZfc_Pd2#& zu(OLfWEn|uFk?faYxoticf9XN07NNC_&I!PYqvmBvosuTG)4s zRrw>L>?{QA$M3DW$DZZ6jy~}TOZsTHdbX{{DWVZs9O_bs#sOew=B6${1^z}3fq>RE; z9H})GpwpSr#1WouG;?GR-@=icoSZ%gQgvN*o4bky&qWEWZ&Y&YAdcH^$eLc;o|i37WB?N{ zUr-kB_KF`KLNN*=vHKD1*T;#cs2c?(~vvFKaX zj%N+G$|!jfWL`4)mX2hqQt|;dSldH*%az3=b}k+_w`iO4h%$!xQrV z#fO>xgLY{DBcA$#14bHH6KE at MCKZ560+p~Rw+$ph0k$Mm5f(guWZ+DsOv-RHQ`#$i zfqtv7)|7Uo^}X*$|NY6h;!Ebz$7Jb(sYd4gbj0oLe{$*j@>!eb2h0%a^s|EjS)AR> z7$epguGLt=-3ae`d^D(u#%&)iwdkS8MI+XT6tK*J;)5`#h2mb=Had5u>cXyTfT6Qm zW##v~;R!Z at yxuC~mG>(0LsyzTlv%pQxue|s9wy2P`8V0|6r1oxqAD6pgzEx|^)m0C z%`I;*%ebrb!3dkX%d203O^PN{fS at Kbq|x|p4YdUG!&~u!I^}h$FctlXt#Uuvt$IeawRNuD;VRFb!)$@dpe`kG7I*H{(^60SvxEiS`aaK%$*FzF z92sI+$WEQB=@!2SM}xi-;<^^ey at 14$j+uEO{oSm48Yo4lEyRE?h09RI#yw-XqVRU1Zpb22Lhz`FPnXFuj%?Lw;_^&~qtgCDy$&1e zpcACKum@^o)vs__Fv$ms)8Q~hpQ2wO)f9LXYa_8iarKqEgnSYE%3yhW&S3hx(r3a3 z#-;6i4BMHu+OgylSuKZYZj at _ufT%48PCEs*Wh=uW3SUO at 85G$XyJ zc0wkMjTISbgtThAtSc;=B_u$)_R-+{k zjD=d}yI37IG~83|6M{K9jKqn}tb8CR at uh=IMpiCi+ueE{b^F- zQHyO%`IcAy+4-3pS}}=mCKPf%VST!HkhP(>a9(k7Xt&&7pW{*d`do6kTqQoE#zPl= zwSevy;%8i1jN8Q=@t{Nr#Zv^jIzyN`L>)6rm`3V!qr!AED!V!uG!3*$8gchG4!3ns zDw;SDwVTOoF>KT&`5{=ub1L2oBvjO7y}F8$506jSct at y`o5Axx`U*dc+nYh zx9memnOvJbD#OV(kt>WGZhql)*`8Y%bU)Z90=ntw1*6s3OJO1jvOpdv(2-OBoU at T% z5eReIpj?YU4;}DW{hfYOuv-t6rz5mFBxkk_F8N>WQXAGNp1ogh?Ei{8vm;EZL=Zqg zxtRZJCj6hcBWvjJ at 4bKSl&r4pj=YNc6-(<~#{znQVJs{xaX`{wf&j;2X*(KYD`P|F z7KwvQL5MjS%u6r}VJY&5O?LAkky`fJa^WEr6vqi<15`+}ve@@h_*=l9Ki~IS%l4U% z87r=6ewZ5GGlSE4hVT7-X6HBG#@oHW|Fbuc?+Zb+?O0enuDQ0wLoq{YUDfX7$88Ek z?vVQWE~TGO48Fel4XhtOZa at 2NH3ZQM8-GvXZU%(btqsQP-YbM&U(|v(W+;OPPycY&axY;~)D~xj8Fli(G}8l(f8srm$ab84uT#q-NIurcNS>BVFa|uQawD_6}{m z{OJP<$vEI17YQ7N^9?vLhcOS?X|=Nc`ew`ia* zp%}2D(ep~RHzt%NV=kAOHF=BI-?ICxQ(PJ6_2uUHN%zL;sC2%yUL{!<5OE(}ac8nx z>dR&^ID>xyWEUG))px!kwRn+iH_q)c8D_z4F5uc=npA^_!tJaNO^Vzqpn=P>FP{jk z=`A0{6$v!eKUc2jA?+W9(Wq)PB#pP8PF0MIVIjr!~;)6SwNThK^WkX|DlS}O-mmidp zk at 4(}f5fqdwW=IAy0YL^A|6cRV~hcliog&pe3T58c?Qp at VKn0#(kg!<^vkBHSGnW# z%}dFdDqSR%)z2r_mHxI!%(CeFiAj{Wv`s?f&7uv?a19q4jDb_1oOxNF+NnC%R^zZfiPDU3Du^p86#ta`nbJ za7D?E>PnEpM8-9)#eT301<0Cpj74^u&TpwLd_L{>)~k+6PV1&u|!q~=eTRO6+ at th+*9EQw-I zy;k_sCCV)|R+gdpmh5bZhZT;K)1Xw at bMw27jKpaT1#7{vnO>IjiGq|TH5=a*L~G5_ z4|DpI1?Tpw9$giOPHR=?UEU_jQy%7G!uu)r+RqX!0sIz2?f~#6N7%)(80(ZBY>U|Q ztg8a=(+kHptD@(UwZAXh$1h-9c}EmtpMN0Ctd;nw*v=`^x(XRGbYOuf|4Y~6H2?L_ zjM-2fNIWq(veS?QEXz&=s3zl at q*r4%R at Adz7?A_&1>K^1;gH3#uTlSr`r}8%ny5IE zlMB6D(r;dtt6!~+Pnh<9_%b{5MhG+4qh}|OedHQWOA#A6^kxc*lZP{)XuugXMucbw z+z{}8wG;a6h<^O&&afmwa|a$Q4wyum<5U;|iI%|F3y%1E8Q`ISXOrQ>IHtVAFq+)S z3YQt#=dKab9foYQzvamsf<~e~UIPbsfEJo;gND|eF>dsZqDLXA*XJ4+rH-5)WiDX!526+`5-loF#SEH8C&CfmV(hWZ zZ%JjJ??EJVi0-0xNd?3HV4vs0jPnf`!CkFS7;n)Xt%l_oaGtId*0X!2MemZC9FD6S z&vNs53Of{1FY8d(d+yYI{XP6*RrlryJ?|fk^huVVBVO7TpjRLCKCI0_Kxd at Y6{C3z zhc?{lq16 at UyzkpZN4MA2Mg-Co7TYahm^DI-5-FEG2ou9`O074i-u0_?7eaCfl1qAG z{k5$1UeVp05YdJoFFw4`G=k%JVuLQtRlL0FTcY$+8BDWw#U{QATBuxpO23Ng_~44y zy-Q~bx7g at QdK%kIb;>Fs1eYu>B|pz$KF{@FS at 2XvR9vmj?+%(VyJ)b1}*cl=gx7HpFCOkMYkG<*Ne!0^13jiQD-qr{dd98*CsmE_x9Ksib#)U$)f%c0T*NRm^tZO5y5FIfvval^u1zt;N$` zi&tAU6S3cxT1LW;D<8aMaoIACtD!C?+P_{e{e96AVX1 at YvlC zJ3`ExH#qyJL|f#y3eM0A3qQa9ThSL!LK-FB-$4BVG z2Sq`v4+ey8z?}!fZo<;<`=XTWv25FrBL9g4_k9{sAHEBhHP==^ci;zeM)J$!xxx^WF0W9+2~5jq>=S5>1zp#TgEG8J3Ix~MQphk}tLnMnD)1@~jjV4=-$5X05*V*W0SK(cx!r-jj z4Rv0X9i$8Sz4X){&AP~Is;R75m}O^PrSlx3$I at Xd-^9XXAd3a12D at -ScR3ZJh_OuG z0M6aOO2>cstg8gCcOq} zr31~9wScym=6pISNVh%Z&t)UvM3tzF((V2va zo+_dw5oMt!|HkjhRhD;7jx@$Q(!~ixnah9#dJN2N6Pbk_v8nQGy-eD!s56*H(luEu4gKlNQ(VU9 za3e??nk>3?l4o=wG+Ib^X&y;~uRg^j$>TqlXREt%Zj!8F8`K=!C1g+ at LVl`)l9}Y= zRvl5Qi*!&ONm++AT(?;jUus(@U%}^poI))e)BqWS!K>w?9ttWjS;=X9k4aguXR|^N zBc+rVB-A at 4nHLb~=hn_+&7TW#1GP~HgP>LMmfBx)0)<=*I( zrE?~=MhYQ5v^2rWR&x7pc at i!S?BwlFw(;P^s*y%?Nt~z`jG~rSt!f|Qbl;+GrIndt zuJik49b%U$4ak#NDHCRt1jz)?j)UpQiqh?3feNf_BC&>URkmq!3!uH)%yXEawk0YC zrxxZZ8podhG4pT6PG at 5}k;huPJ{)~Jn1XzjbMl!kOFAj0G^Z(=2D0d7IOJiqGG^+bj(CL$*_Ujk;Be_Sw6%PG z+KOB|Yd?YufdZp)F;^MlQEIVwaqMTNg4j9I9$)!;k|cYCCKgiNTAM7&}{ zXpFr>BSFnxFy0a8sEkqprFkmv`PM%2yQ!S)W+zFx7SuCnNi zb_Jo)^S>qElr{sNjUtRHZ_=9}UyJi+F# zc0pXt0qjvh%{6*qd~DD>UUdp}pv(L>3*@Xa#(>PZ_>QTa?=iNMGwYg(e#Xwq3^l?9)qG{+JCM7%D!$KCc!xHw~ zyIj1bHvsigA_TQ at j<3 at +Ld`$_mp&Dfj^o^+p7#aQHBo)gv={GpkOCX_{nY?xLV|Xs zST}HOIOA=#i*#AEV+9pp)>Ss8k(?sFIobw)kZj2qyDhTzm`cq30zs6#!{X4-YeV#2 z_JKgnJb# z(h&mQ<#~H(L<^Y`v|l?Si>ws2TpaH4=mr>w*?m;mC?2*?SY25h0$YsSq6GXT35!VW z>tcSeQb3m!{kcR&#&m0DKU*-b^SQ0y%G93b02pqGE4LFGOv|3g^B3W_sTaE1xhNXX z8)|TBFx{uf_l%eQdUs8;w`0!m+|HjYEqPbOEDMpq^=|>Yz6fDOX at d{mB0HtSn2Xeb zJWPX)iTPqM_5?Kq0mduCiq0HXaN;o at IMusloH(9#bwP#GSLp_fBF0ljiVYI?8M$Oc znL*U2(xhiC8JydWAeHC4Q!Yh`E+S9qv#00ZUkO?p1H1}nUWl;ig~nYWF&n9qmMA-z6qeyP0L|Vx_g#d&MWEka(w0^LUBa2 zf+J*++bneu2?4@)t#J#%BQD*6hzMz)l)f8|hv1EUen%3klt6ZO;z7*BnL3tiFkp*& zO&T0MIf_4|xOXHEQ%gW%L)P`kj)(Hh_2U$>JxpM_eNbhAr!|`PSmoK+AyK{eN^x7F z;%tf-><}}CX7R#xoLbz1?WdHK`0&TTR0OQGOw~*qt{yM69!JA)U&83y%uGaj4pkm? zb}xVY!IFz?p5n?$MD!;TDCOJj4Lxmw>B^Q9X61lYwz_HaK^IA)BywprMWf_d4#ldNr^QFXU-HYbsfbz0;GqA`Np*^VPFR9YsH%9D5XmRnAnnE at EDtvb ze_keHizZJh_uOhc-2n6Yvu^QD^81B|Erwiqf`_Zi;ivEe%Sj>R*Hkh&C(Rp$K{bTPIjv1k5JvIz zaixN!j5ZH&xwWY9Hdb0`b8KnzgWU0b_-$!Lk#C}f^IeO}hT#s^&bVREY*a_A!fI!Q zY!rt!_f+W-WovjN?P at c8i-YvLVS5w^%fJN|X187WpT at _=+0d=i8`~jqk7P`-je)FSmH4Hg5S}xY!2Y>lFU2 zk=Bd?n zdf9_aBE*9-kdUeLnYg>91$q$Eg#M6(NkD)xG2RFBPMcxknA*Lh5&Qj#_yO#@M_3LO zWm-W~b*FR`toC|Z$Uk)VFvU?fskF`kU)m|3ci}#B_WCF9+8>Ak;DiKaM=~GWPGYyu z3wHl!sGW2?C}{J}j4=XZC+#pcsF;MS$mVD2rh|G-DBD)j#ZRa!YLC7-LcUro?JX2F zNd}nNv`g4-n at v;Y)28h at +U_xGp2tL42ks;<4%3z8LbvZsPr>;Tx z^hRZ}!fKacMCiGgBF7{XPDX)lfdNOT$VmXE^D4}QaQn&4wCo;3nR6;>wq}w#RS;bR zEhrNXh4P5+BVW(f$L#DH^jZeYIr9b-lpt%w*dhJWs#OBFk8s;SIki?3jSfJ$+@&#d zRN1oj9MVeEF44ul0&)hP=a3^KVq at 49{8Myc(ZuPX`p|8uQN>pKAceJeVqV277Ne&7 zkPDz{H#Ko`jOsIH;$QtS+hRr9&ItcKR;VaBLef6vP|qq0C?7wHARA|c96rEk={bx^ zy;Wtf8Yk^MPabj=X48HqyeC!)1ZTDQKa{;yR9)NBu8r%&-Q8{C?(PuW-Q6Kru!+07 zyK8WFCy?MFxI=Jh?(cZV7UNx#$?=ie~)f2efzBb5GokeqS z>4zHn{RxyLbdTC2G}?s$z5xOBN`+b at Q#^`uYNrN8J8Xt(S9I-Bo2yv&v;_;H#FG*R0`OH_22+LX!D_Q9*c=s4QdA600-s?vT)95+L+ zr^b`FiZ`p;a)nO(78bcOv at PzO at VmWPX z&l)kg?g78V1KPTz{?rBeRVZ_jcd9kYn|)BZgx5kCe#h33vd{ewue6o{lh z-}l6P9~jz`K-KD8p~+^Oi;THP+G)(4j#p_*oH`TlkTl#y>|k8LUu#=PPd1rnRTY2X zN?G|DA?a1bZ=!!#q2I5(_hPm77L4(jD)+#@{{lODRgP0H^;0S7_OvB>ex at KiZ`hVx z!X3g1HI8w3Aw7^iC6FN{9Z&8R6T6HnjzPl0mRm+ttZ-6*gXL^b2{Iy(2trj5q6oj; z_!=IrrVdIoJg;!~JHeg|=i6yxG$bF3_41O?Tu3ns^0V43(9A{1xhmj` zN}IR{60`w6@`R>Hh&^I<6LFLTdv$|Sx@@KsE`s=}#+k5N#u at 8ApK|J>ob}1utr3L6 z$&MwE>m`5F@>=ivZ<6)Ob?37EAz8zpDpcs7k?j9IyQ at 3>ZQdYY4} zz_M*O#)@{9eH?mh&LcLdu at Fs0*{24qsZRlwrjn9*g$A!GocV6 at D^vr(PHoq=n5Nwn zCX;#3sm54NL$uLN|9U)7TenVIhn5E&rCV^qs+fso+zvXi*VLey4720);YLHd0T*$d zLsXKqW>`1wY>m3Z+y=U2vuT~qPMQNh at q@xx9T4zhB8)Ha3141gYG+S6 at ek6nHs}$) zils>-df~44gW`Om?%L0>IyA6cLWRZH?bgb;$D9TIlbTS(XEE_iZ)W)#=Uc7UOe;HE zsW*Z{DdgSdpg0)MMMyTO+*?28Y|u%^9su) zKmdvFdA@!Z0CM+>)c{p4ek$KJ)7QAt9>d5i?`m`Q+jdQ^I56|SfKv~O_G5WvE$8NYE0Kl4pNHz<88o!Q6^5}TI%G$B-{v4Wk7u~; zS(pzdzWpXmLl+)iw*cO$pa+zhX!NRj$Xb+<)o|RZz5a>mw&#pLv7yfL-0t zt3aVFVSQen?-W-@=lUFVS?B<3d&WJSVqigXjA{aXDw=cmP4?}`9P-E{qkt+X5qknCW3X4 at l4hEuz z8DU8#O2ioh>P`dht`ps%^BYMd54Qs$*|bnUt3{H#mpoNWa%5mb#UaP1x<$Fs9Hv zx#d|xphm?1_|(Nc>3jWZ94c3APd6v2*om?7Zbd~vt at t~Zjz$|g;|c&g?A?o6p^!>t z6#DO%HC)QBH~NF#6+|#F+JE%2|Gw>hQ;R?n^Fy)8JXx`!RJUYgt;|#w&S5xyEeZ1} zL4*TBtRxsEj|^aPYKg;5pz;CZ|G at G)64syYFvZPp$?Y}V at APWcQiqEy$9_ikV0X6X z;i1dxVtOw>o#h=07*@{-C at LWfqgrLGrnOV~of$R9Ijo|36$awbRIjm}Zz$W5$2z6w z!tGC>&n|1g0sOR&q8_>%xzu|m;|@JmujSM`JK?;5gSo4mK|v0kL1j28yO;(_u&*k@ zSPZO{-Z5ZpVlvc@#x+#?jgd~YMrrJhQh)W}eF%+euE&_vF16&m_L!<7AXgp&SsZwI ztL^#UX3+uxUY(Cuzor$rLj4*@$|`xbDi7+?U&D2nNyab8K{xz1*it zFk?D<1IOKrGK_5SKr!+9<({=8U=9}f+z&QxpBv`VBGD^{DZzOo&vmEj+AK3qi&oik zz6*j%r!D9hTBox at Swdy$RiiI`U;xLxLU`2A$C%ZnVzcYjmrmM!n at mHGvghoGZcIYRt1M?te<1qOJ!>axC2Nh zPM$JSl_Z0D?UJ6~Hs_Y6n)#EmUy&duT`pKEk^{|1KMN#g`^Akn#sd}Z`vqDNRT?80 zXcNmVaITcr!^3H%op#%zdByC$qPghg*u_5U+88k?>U!A_4)Eg^2LQ$7FDLCJ+oH%( z at M7oGLBO~eoMC2Ja<=K5u~*)r!(k&glLy*p54q$EbYjQTmr%9w&QK at Mn%HMM8xo&E zs&ck`Y@(O`9aL%?9CGGbhv1aD7ByNu-nIImt*-mibTGUbn&NHnYa(-w{1|=Txv^~W z?uV~PqQf_H>N&RB+LBObyngX1o|$;>Yd6ov$ySaLzpCd8P$qMw<$ z=Lj4btE>H7a~?2N-a9_ at 0jq&0*NfIIGX6mUTAS8I>JD^S!(<;VD2bF(Z=4&CDE|$q z)oLwVD{wF{FNptf7FosK#NE=#)#3l*IKe<3LKG9UHR18rFQ at pz7EytSWP8VVHHrZ7 z@@1Hye$+!(`Ul>M!Ha>18tMYdk+h_hCS+qlSf<J91 zn<4Bvb~x$g2y3=2Wj?zhuY6^VpU~W7d=v*U5Ps!86VN3&d)AW&Q`eqiIs83;SS at 6J zhB at W*RE7RhSAs%Np)g4t-4oeP+luGW%Mo;)zYTc#XsB2m(gPX=V~2ekDy?vys4(2%bWXvNK_jR-s!LC+kVm~9Sn=|P$-WGgnkyysD_LVxEi=6$43K*DVd-ZZB z^TcXITSlL3?8M_2Wyan at mI;LXZ>{9udTZSN==2 at xe{5I&TdRMyE7k0jF;r0nzcShD zq=gGe5KmT*V25F08BtL-MFpvIw2`R_Wvri<8Z`N)pF!@%vwaLwn(+Sk1}r zKkSnasknq+x@;aam8GBN{rX;H=i1djui9jr1Y1ahD>Wz0Gq at u zO4-(=D=W8_ZA9b4+D`Qup;k5`Y?%;bXd;+ZSNZA(nkYKv`#j at e*EWCr-KErUyLaAb zU0}siF#H;j?Qu~Xy1qWBcc*`-P9~8&<%9>=e3uqRorOtvTy>Su|He1;tBxkZof{A; zO3314{3C3vA at 9X#O|3!fosAUzJ8#*HJ~L^L`5MyxQWC-EGVNA!+0HoMym)n*yRA^R z0>>YFdHZ at LYie|xUtrT1WIHUzjtLErZaAS~%&#tX4K2ps~0EL@~vk+?owFJVWv3 zTV at TovMdzmmxJ_sSMb$%hSZ|GzVM~e*a1DRL~x(8^*$LS2mLlr at u2pqeA-2R`)o@| zCq>SCd_m3-97HsnAjG$Bc8L3Yyz~wM{36=9*dA3V^;`WF zT1A+`C1OvxL9crOjQ~6#OAf z7sUUV^NCxVxGI{sn_2(=TjFC?6_wXTQ2jCZSy?qP&VyIjOq@!1t|6oof^JM-(|=4XF7eVEe&YrNinqchFSq{ZNf0(3lS}BpI9}C0w#t6eIjW0+P^{8Gl`Iuag zi=rU~Ht>=_$%bT_Xpuxw?^{Uxl=wrH(Vt72?+TVYIRJ=hW3;!eQg)sz7|c#jShkW| z;44*-Kt-A|vTxz1sC{zFJdCqFMjrVZAA*Q?;0vRL at 04BkK7qEO{7jFu?`y$VGbix) zMdDU^Ag zOiKIfckt}GaBtwFr#f7Na$f#Mr>u;r%c4IzcmH#p+5WDx%Z at G;8B%E}NrIFHdI^3z z*_zxqL}ii0_!arO=sEAsmh*9BRd^J;aMejoBx$g?j*VyU&+OdHp68br zlrM_ijj97tNRTXy-Al6!i1kc0==7Jxl#{~fF^-oB#-C5L(Xn4?6Z2_yMas4$P~FTI zvv)y=#LmPpf>v&~Z5gT_lvkt9EpUOUq+ z&i+6iz{f#Wo32~tCs!HYL7Uv!qkI>&_IOL=!E$6w3VNZ!od9kvw10a*+Fa@(9C)vy zwxNBX*fjCK81TZMZa$|nscE9cBOLduh$GUj;L{clneVPGk0hVAIQa#?7CI|VP2Tc> zLZMzfo$gaNv;Xwu_;U}fF^DZNMFQg^%Y}MT|i-~@Jx1KGZ zR+Xn()o5aQ4tIn8ul#LZyJp-Q*65i(O4q#qO=*kFYoGEzN)P>WrP=?Vh<2$(AG9iD zVv^JVtAx1=El5q!E0KdimgIF_&q!@f+?8w-y_GI_Pc-BS`Ye+3q#B`vAqo}lS-Sf4 z`Nq at o{^0%+>kFr!v+7U|B4RyJH|wk(><#iyG}~-?jS;Qj at 4B`aXCfqWgVq(FI(#=S z$L)>W(c?J8i6Tpw*eqT}=b1a{X}ca6c)u;}Q|YRK=66aBZ`31#I3e*wJj zpUchhZ at H)B&O}fJIVTiyaNU`kxY!dFKFbsxrAK`H z8clV@*;$K6uih;PVQwkxG(1$-(&+1c4}@q4)**n7SpxzsP4xLOu&J38&=5{VF-x+c zio2b~fPx;>@SCZmNiR6DRWb1roO?1(l27CUXf6eBn)3>$qGDhJtFh#GzJ)UA6Nyhz z_4tm8mAbSBTm}}4%K7C%C z^g$#^bvKl%!*9yV9L!#=HQCQ;6f5B;rDYk3N%C(}V; z$gqn?WVil57A3aJ**t&4vWIqTDM(~I;Yl3-8Hk%VeX1vG{e-eF2 zPHg=iEu>--t+lX4-#maDOV9l754r-ov8&8(`!o{&Niq)L`mS5}G$3fz$ZRkz9e-T`gu-##rp4GK` zoGa{|aESp&Nt94!?oCz0N>QTtcD{~--{^8?cKZF*!x#1!R^B>op~XC3A%zZk^Ep1$>{assyAseBx?lErw0wvBJsq~wS1Tvd(1K@)SP%1 zMhq5o8+zXBL6oHxB6`l4lBomjkqeQMZ+BAUt2jEqq=_Gn`Npws;dGW`>q6uz{X1w; zJGUIqQr4cY7*`tYi4ox!hXav-rruF3=Fgp#eXdY1(R}g{Ph?9(npVUc3x6WppHPAx zX?MGKTIysaD6A<&aS1L~_>MyrDpP at wu~>2CIX at EaJa7mO(d4As?I(^E978jOkie8$ zQ8 at WW>K}-Ioye|h_yh6Q;+5Plb*r at f2VE(!ERFqN-B65spx#6^mdf^)YY_RCJ4Lr` z<6Z at 6ggapsCf2Ho!K*H==(85tobZZOQ!l1SfYiW4d4t)MDuI+L=RMX#q?)})8f^=Q z12g8Pl^lkH at oT657F&MwnTZJ+49o-YkHzNt_i;mtUKkp<0gh}Fl*jWaXS1h#uQlM}uL^ znEsc!#~c78Cc*NDpBpc|b1&WbH*XfO0g!pxQJj4E{%-r;0EOD&3*JmTFz&qPr=UX9s=Ty_UT z8}76YUs0pBqq4wRR`=7Qi>w_l=Spvn<`FQMTKn}4CY{gKBgdBRv(ES@0neG({T2K!$pxrXWnH#pzQ3|rj0 zsPAx|V!6H|1(?@NC)h&w;exs*SogY2Q=nyv_K)kNLB}~Q?FKg|0KvT&Ekm1C)h)?(v(VViq(?_=u3dHrdvyf-;|PbNFNpW zO6&I$DZ8Bp7Cd?@Vo#{qOmK;Fani7$#M;O)!X(AD?lNEXPsL$Oy2m!1IfmH|@mi8O z*^1FS0xNhsPy2Qozs>!J9f?qh?#2l;CW{t5=~m0E>wA$27R55~Z(1C*m7*bh<9t2J zt4zT7)w`>=dArMZ{EvU-b;#=QxNqLsg+G3V;dzF zB#wpu5j=iikHe?DT_e^rTKknC`c^}|+022#Q8kguX)UG2FEQu|m4#8m;LpsrVy}0L z!l{_Cx1xMlHsw!o!;c6n>FyCG5kE at 0yWH2aahd}1MPfHW=}u*=H!jg+ElG5)$+)70>b8F z&2GutOZ}_mI8XZPiI7XgAKj1oaWn4=m7vg6X*3HNJwmxC>I2KwUl+j3K*qLkTxh|9 z_=Xn6zu!A#y=hpnzlwn+bCp=Yjr0)%|S~-6Jqs~DJ{%Gf)PS+KO|_1Bk4(cEwT>Sz<2!}Ph+I?Rjwxie`Y8jt2pG|Mi3duL zs+OApEm7$^hRm3FNqDxkz{wW#HOp4m5BwE)JSuQ5B7p2ZgL!evz2~$HRZe1a;e~kt z0YSWNoVzs)dy`XIZ&B%y3|@YFcrTWHJlFXfGsQlp($onr#lF$dX;N0kyYd7W at Cm7) z{q1ib+Z>a(kj0_Ez-AEtF?6~A1>MxGzj^{=eaS}Ip{33hl8h}suvsZnzF?_{>f&1~ zA_b+%VF}(dX0xt(He+~k3*H%Bk^CNky&Gr~@_s%e*}s~#)K3pf>E|_}X?_T}c=*}j zcJm+{_zrE1wsnv=a4tZ!!LZCik7r+eXm?+3%K0nOmc5JDXNy!(J6NM}DvgS1VjwVC2YLzR;@>kzj;F0UtUUjnusHVJ^RpGYTEaPOVLQZDw25Gsxzh!o1!{(U at L?$;{ z|6VSpCB|**yAKy?%D;Pc7R?XTN^rEvJ at tzur@78CADC^_dE(e89OLC_{ zIv$wD2)1WOcET6p98)mqr_CCBTTi>RSt-2!9_qbzUg6otD#NvimagGb`YmA2ce`d5 zvv=3E>CD|3C?jKtkw=P9_meC(&{$9ZI(Jd?RBQE{U8&9{uY zmo&4r!Q#cug8+FBcYx?}L-no at vGvO06*KY4Bl-(I@$n;q5xc&iAOR69sqA6=eVWPh z^>_N-!eT;m1>kgkt?OGyS5uzS&^6PxcT=L?hMz7 at K#$#ele7};nd}{*@KYOs&{_Tla&e z&*XQWpU4nOzlcWKD{*y?snFxmKSHiuvzbU|uql8{p*HOive4O|8ph0%iw$48EqI#n2PROMCRsr4eBUSk+7FfNP~26B at -R{W zFCjWac9TTg)}{fSIOo$~hmc}=49Tfi%Ehi)+#TP6awyhrD?9v;BS?ltiNuBx)V4BX z9eCeZ1%WZm&=e%u)r4CzN7`@QS+bQ|g(GyH=9HyklhWF%z4AeVadT{F at N;6)p!kqv zlSdAKaQPrj)YUIX%JwYVVuD-#)-nO%VuOh}EcyCG{~-O>XKV^`*TM)w-a6PfPxgks zuvk)l-ukg%TlEJpV?~oYSJr|3Q&b%wic5 zc-nPyXcF~&N|=GRSP&OtsY4dTpJcz|f|irVvw^6Ep-}KF2oe^#>zmw0``sWoYKt`r z!|bc7^%jpf5Jo~J<#A@(H~;DLPv2y(%a1pde%Xy_ks&-Rog9rT#M#P>Zy|3WRM6 z_buJi$SqdA*pQHUE)Cn?NhVl3kQ$VBxl(%-{iOb5m(+sswTGE8Iw at v zIMpU43Mmp1ruZHh1}BR9U at 6wUV{T}dK7oFvCQcJ^NpN2%#XSx514340;iWd%aAQdD6~-Fzw=kV?xZ)kUY3> zGvC&Ll0d at IcBnb|!l$SLN3tg??S0b}k zTcJc_yx58uiQbVJjkAJjAYhafS#^t)h)NKdifWT4RVDGN`IDy9p at 6@>ps(x!&wCOXh?ko4_=Na zVL8Od;$vhU{N(A}isBF28Ji%htasaHTC>ZK|Bl(gW-ny(KgIbm)IW|{-hUP7De`~K ztc`tSm&oRHI#|olm2}HlW5AyDdRKl~lKK+$%^6H1czslds*bSBbpt^Nfkxfs2%M4_ zB8rD}){k~L#;#PA2UX{1ZZ6S>=e;n+$NSAL%@?YT9|eUeqA(W30Al*HuC&7K&j^TT ztZLc{CbA;y=}L_hkkw42RS*+hZFaB^(CDSMKG|he%jysqoa-8QJxbzFbLK;2bLKP6 zCCyC!*~^LSXf5Y;U{JS;%NhaS6F2L~=k#Z;`7EbybmQ12&b;eZ6AUag*S~G;?4}xZ zH&Z7dxNR%*1mUElP@$$fs{L}Yfg9KL$si3vV<8nU;L-P z)k9sEuElMnmr-n{J(V;T*BHmL;P`fo%e^<#B>0 at 1Kc#)PZmwAsI)Q*y6D4j>+x2kx z+FBaiw!G9BgGE$4?-667F@`yN#1rkt=V&Z7rdR{Fr-W=;)B>@8+8(M`G6cLs%XkaK z-CVo)(IaA(}$1!?BH=b%9fp&R_$QJlO$wbdFm-wV6{L6AkfjZbIo) zM=U^^#|&!0?ZP!Gw?vTLz#utshe`wT&;se#4&>Qi9^YRvIt6>TyyqweavzRKihwjaW%h z0&Bs4BrkbdT4aK)Wi1?MiW`XK#z9jdaKl5C7WuAjV*a1^xBunUXsq?ZfInUZg9Za* z_=jB|;J+3ab$R6_70h?Xa`8h|6BsD8-(doL(8pjxrYh(T91DP^{s!k|y5&sMa-wzQ zM5AJUZe|WNS$*6{M3O6Ryt#9Z`546Tkqx)Y<9KM4cy0N}AaR$Z^Tr?-TL%-8t$HnAn2NVwkkScS9G>!2 zzlu3#C^D>|rr#J_c65#w41a=>`Y}Dp{>?g>eQ&{^1_4VQFN$+3aKVN~tIqaKrJU4` zyw-k6QcD at J>~tNxeB6^}hacdkTZ)1ZY*FjEzG;Q~-L~sTo<)1wGLY-EYa{N5MAoGyF*KHBV}-Vc3lTT2 zl+qD&yoI!YiVGe$p5==z>d@`SE^eBVmWC>kQ{WBn(C1D*^3TzIXU=nFb$40^G1P0> zg+9l~s6?Z_yt^%xM-|`HCKeVG<)~Ddzu2p4n;)0&0FbUp&mG0ZKxYX;K44|aL?Yi% z5}!y5aEm;^OpoGKqD&M*i(;BlSxhj^;AhOD(#GQyPe=v~i)m|aVWM8KT at MUU*1u*r z)I`gy3||n!V{*rsv2Ab4cuye)KVX=fP&Ls&z=j3f6Y<_dQr)vl8VHp!n<3ytByE#3 zQ!PbbWoq9(2wn%2C#7~0miltYX`%0JN~jweJw~08!F;~qmx~-Hi5 at q@*E;rvVRw0D zJQ$x`D)Wh%cg*mUBg`xg{7Og-yu$f!8}GXXV)p*A at gvkfw=wJgwXqt8DC#@)s(EsQ z926wn4rK6NkUcpXiAWVNOhX--*VrXt(Ht*%WQN(1E2YEtmc;vJa3orTJ`HxV*=jN* zt*`&1;GR)0VKAgYuX%BC at y6p}S at 7lV;m{vUl5x0 at JY59v1XbqD9weWkStze4Dycfc z1bRgN`b{dNiwQI at 6-LJAv{t5N8DY*vzv=-~x?_(3`dMWYEq!jO*dFgQL#}A_owdDn z)yL54&!vTLfOC?Ysq4$4>1W zGnMT3s9D-fxqEm>c54-DTX}C3h5AxcP+|EA&)nL2(0b;y&9APw>8DDUWyM8v_-yJn z1f9mK&IHp532QsoHUzdtF3uEZJ#j*KB*6>~7wI8`jYVgY&>w+kqGB#X7AO at 0os_}+Z-QWuVsHm=Mt{hI+%XZ~K_J4OOol6ODp1rMWg%IX*qsVbI5-Mp1?oK9W$0_Z#Av+)KnFn& zL|nu-K_eB|iVI?W{aYAN-p5fE{0Rf>{{_w2{v8HWj*BX&g3FDkl$?|;988K|K0P~c zd at Er>Df~nkAwn-F3b6#uKzK;+;&L|bN&kq{3sxEJsQpEvau}lVz^Ou;R3xP%QbR!} zf!WpSVk48?ig@cFatU at JYeSXc`DiTf?SJI?8< ztBo`#wvZXlDr<%)D<5aY(JVJyvA%A>l+i|ptky(@5I>Dme-sO}E&Ll|tVQg?E~8%q zbleLw415X{28Hct at Z5&|8V%?5X<3Vb? zqZpS2K8)*;XR`kc+W(q3kxcF&p6W$PV at M+UvL-ooM^4UB7>h2NXaabGTc&mm&ii6k z?H2ZsfC&9`Jf#8taq??QDaTf6X|z|=WGm597&sYVnnUECtaxjToV>5vuOn9^VMFz8 zZrd-#Gp~e{9M9>!j9Io(N=C5dj7h8yRkBVhRtC>4zu?T|m-YEe7PW zQm^x at sUP8!YBwqNk>sl8 at 1z3iHDeCCFo~fMr^WMmW=F5A^R%PD>ycr^XJfy6X}q}_ zNdoJ|3rp_9>s%+xS+9fT%S&Ofl;89Hlx)<1nk*R;2ZYn{tZ}mXV&hL2ZE^g3T)1WN z9r-rlMHd|c=l}*Rt+pIc3X&0zd7JsKC2wh-m+}k;&=Lj9?;;vN_3Fa!4RG-$##0F) zy(oyW}+0QemIu?Gz`4ucxwI578w7Ni6 zivh8TK?D1fl_qDrW%rF{XA%_L16X at y(YgdKv%4rvl2{5dWQ+EXKsm#h;ul;~RU>pA zPEx*D6Rk5MdXvcxGDRceR%&rep5au{&1eCJdn{-A5JZ8OfCT%4Iee_eZGgU z-p0#eeZ%t at OSzV15(7;XxyGs6l5N?!o7S$r0NvGf9KdlD#fWFMD%QKap@)rS!_Ml) z=5BBC=t4=E(h%6BrJCG!y1`F-gsjZtoxscvA2}JPP>Qu;i>VGRz;s!?!mzc;riYgy zdyEAG>}!M`b9!q+6T{Dz(3X*;wWakKDL^sKG43rA=}Fsi(m>fOi+{2$lVmLH zaNg`eXIB}Nuz>p(E8we}R~76a^5D(r&op(}4_z~v^Uq9M*mFc0M$NIh>ZYBUNH$%D zi;1mFXiGi*ka!AsGP_Yh0Tv33cQ7&=`EfXnr<-!?9zuy2g^JLc7#Edyx$J^{6nyzY~IMFwyPH|)fSUORM^)Fb9q zt}jAs6)__B~lbl at 3Ss@VK^CJ#iVHGtbDw{lW?JQXfeeS8oeJ-6bCOZ}QKb=X19 zu#lQr;?BJYn^{y9QKG_1ovD-!(WsDJqW|Zc(vB;^f&fj{p~OjFgmsu1X`yyLAJERh zLpjG}+QYUhvyYA8Rpc78a at Gx#Wt=gZuy!mFQz5Vm!_3yL`e0{zr>LaR(}5 at YI|oOJTLJ%*}^6VKlt3v5D3j zdeFrwxmgS&-B;Ob-Deqnh5*~JmJ8U1tDLyZXYIrj3%l+ME>UTT)NTWfi_JymCCzSw zxu|(UR_#M(DU=+hYh~P{^LSg42^p4fmbnn6PIH-Ui7YJB_!r`=c8TQ_hev~1*mZPs z8dme!?2&e)W;nPlF6&$yHB at p`AvsqtxFbhoE+;?pe0^NlKjxL%E5h1zF00tg_QNbasJc`Qa5U_E?CGyNf=4GW(8z%~3hQaSe4QjJlMktX|0g?u$&Az8dEl9~)_j=ep{-eOO- z&RdfCmw7?>m2h9mK>fB(hnEB(NA`E61^W?<-1T`!SaLc=U38aj&yrI>^dO{O?tL)BJ|L_Bxc)jy;=5e542*UN5IZ zc5Cw-q;h>}sBhW0{!2P*{Np=E5(%D3sb`K&dGoV2TFF=q=37?3wpzwa~ zkm4x3~ z<1*&hHFh%x;d3al0p+OmO*%!^Rj3P`9CI>KSfMnZ{EZ6hio$lU at LMv~p=(JzX|DnJ zfpPw?Ve!P9#5h3w+~RNCNQ%dmpErUPUYZ^Ss}`Lh_7}dZ+zQNS?v|<5fr5_1_yp4BQr_ zFa^8XidWFckd(fZ(9!XX8cEow6>yL_I3tGgAv;);o+lSsqeJVQCYsBXohz&#=l{a_ zJt&@O10RG3I((1q{moF|Wg$sRlA8s4eDSl#_p;-Vcr~yu;2xr1`jISz*)IzeB`^30 zP!r4;wRp->{oNt(A~s+Tv)P^`ie)sJQIDxVGaqJm{n#1IYvTko2P{}4jJf;87uL5G zZY{Q^Ij!o>T))zRZi`wEjsm7Q at tDu}^Xe8X926rs*O#nUQRCW*e9JTqmN$Jixqm2n z*@BYX74_ow=YWI^XZ0%jrZSo%^rgbO&4kTAZEG?vnEXeml>-%VJ9|pH(l)|pOZptq zG<$!sRk+2Ob!zB62qgPi at q?x4Im0jf`Z=vPvw4<&PjS{DyBhutt__M(rvke#o)C&- zSr*%Na+1~D4DP^h at w-3ST!yG}swvcdm+BFvNn>*r-8L*~JkPQ(k;E z%l0tvm#>m8`%oH4idt_kHpNQ at m=Q&)|0Gmb4Qk8gwU&oD2C+m308V^gH#5v-F!v}w zKSbpet|O#MZAle+w?n+3e3qp=?bPDtej{ZEm*X3t?#ed51S*XR*H<+-xatkUFD1Uj zYdUt8k>zN}!z9sboJ_Rq;RN(ptOK5gpj@<%Lwh?Xoym!b6J^nh at TzW;;eelIkj>*4 zq9~#uZZ=AQFIE-$=G`;%O8uZ{7EB!$=c&N&~1>Ld<_5%jU>dF<+< zRM?ZDnbI3Af~%;R*hTF)u1Uh<6CyFm*BG}#em5sB!%_rO^~0l1!=sn1)Su8WhR`sc z;EaedZp){hEsvA40j&DS8VSs)MmtAb&p(rXQiV@)n+_>USAKhhIy}zV6+;a~yM#5{ z33>#<_wzRG;y(Ya#0N#l4KVykJEQ&=l at I5?OZ)-HzfQ#4EpbW0H`PU8Ds4$=@yJ0f zCq=IK5=x#xU+N5o75P_pfjN$7RS9}a%_SI8CPj`A)k+9~^;8PARICK{a`tSt+yBOL zSvb)D1=*Ou3vs@&5>!im-4I1vR5YZiq#><1<{-AM^0+V2;$K;;l;IGzoxT05RF at RD zOO&*@jAciAG*oH|=|zbf(ADd{auy!6h~4O(C5Uz&Ieb1*App}LK29ab!pse~Pv@%f z3d!<2Njg;P2M7EimHH};dA3Qo9Ybrkh!Da3Ivc(Q|1yHX_GR?A+PgJtH3I3E2F at 9i z^@n!2p8U at _X{}kQ%TTUQc1 at ijGOh>48RN(%i&Y9VlQFn}SFcd$Y7bK6u-)i_QvoLu z8SYip-)rk2(?H936+bj&3N4{Kb-DvwTLb83IAw at s6f>5ii-{5(PXLcLt1}uEB(y%z zxX9$UhA#Q^N0=7RprX0?FPIBdt}=8`!}|x1*qa}dg{fK513z6>d^l$Sp-%u~mQB at X@VpLh!-;FF9rOqPxZ0QbgzXMSNMvh>g at df-j=oiG6{rd5M95C;E2z_28d~n)R{4}3 at XCelQ z3f&X8s5cvk-634~bIc*X=~!Js at uFu)cA9a;B%Wv3NY0JDH^7g at M?Kndw*AI|@SsA@ z3gIcn;9y`Le-<8&f95#_Cnq}(XLS=(`+rT#rY8O$^MO7L)*DZ= z%9x-eAfe?%Y>-_(OVqY&Lr5arf}Mc3+vjNP?06 at h7eqkraC$>9>(d7%pzi#XBfS!f z&>53ZWq~5`^g8%>SkJs#y{z8?KiiH_u$w6C8(2F2=edE!n7jYC5Q{phzo(IT+bK)F zNQ$jPEqit=#(5tuhh%oV=u(5;$HI0DOOYsq?!%L0V+P)!Tx!ln)ikCYREx~87+HfU^tj2uzkeBzh(ouzZCJ z)EQuV%qY#8DB%Eq5Sp1F-tDZl4hH6)Ky%L76mZ*+>a~A*%=ueE%qU1KBY^=1rb+)l z&Qbq|Oa66|qBf$R`uEI_{0^@JOKR>3N?^hm0Lq67gEUlHg?IoJbu^Tcl8iNKkP^?> zm<@vl1IkE3vTI#4+VN{`yRDz7zlxb!vN7iT#oAh}Lu=<Sd0v zD?5B-OyAZZ%c0-lhFkBA|Hn~n{ z-&*`^SKLbe+oUHoqrXJh%#d5yq9MZ+T!5)MoR)6=6CD2^WA7Z at S+H#jCmp+E{*sPu z+qP}nwr$(CZQHh;j-AfybKiOIjC;QE-FL>QU8Ac0tJ-tVnpJD9y)*_B+zegmAS74P zZu}xu7Qa!Vi!G?8{i#llIv1H!_Wd%Y7uJks29NugScDA~0crguY-%Kv3u-MOjcV|w zXDex={_R#+cv7c}?a+45RCqIc(_o)*=~$V=#TnD4Cw3BHOsQm_%7*UnRK{;zclRZJ zzL}%sFy>YH2~dcl_}qXvFoyUKUWcDfcC5cKVYEYr$Q;VXTvhYtTEj zOKTJm6lxrJNoH2fAj%_q2GPkJa)z)gW>r)E(<6G-BP;B7>GW+ute1&v;0wRuIuJh3 zt&kq>#wE>fQ!On1xTIvzZnzDWH~Q>!4W=epRt at -PgO^5QRXXXhhIU98F2jza#*f{^ zv~c(;lJ(_%4D9nYQ61UZA~Z3oRTRKVn70MvTS`xNEI8;MzgNRydpTcPR7y^+SW|Dx zX(&#{$=6Tzj_P9Ehq|Jyj1=_W#-PHI8^_yuPT|EYe+UAGHWbyB+nohS#I2Ci=f|i9 zt0GRsEcau?j6})g#EdM7wAPMn5l~XDA4OT;4W~Il7-(?t*a|Ab&^O*SXEUQt<=r0JNDBfD!?5_$W6SOl{F_T zC at w83C@`*iCOmYjZKc7yS1iS=BAhj`y(}+T>~JWtF_i-Rd(;C!e{Xd)d=51!O%hNC z>1znn;gnsOSwjmQ2OBF1Wqjp(_%e-+IxK8Vurky!6a-!;$74MGx$UXAh9!2lPaQ at m zhtt|dgk*(KAtH;ArlZ9oL8B*XmPCV1N2VtQ&M=>{zJN}cK#K_i(ZZp|sL3C0Vy3O7 zl4nvFuPLC{ZDU`W$K4v7X8CCoj%O1qR9WbsqSwePG6?66T+fV7T+!8S9dr$LdOAU8 z{P=ZciQQ9pe7fE3 at CSqLYnmRZAShBEdkgV-l%rtCZ1b%-GfuHUwTA%%enes{=;8iy z9K(>a{mJ6sk9(Tjcns}nD%Ki)TzX>aufrlSrZz&1=g_d`T+wt%QY8`}!+@>ocnm}% zdqj(b^Aj_3O;IYoQ>h5-w*kpQgjZ(j1bO2tzBNhM*${LP{9TnT8V? z<5t9Z#UZ69Qdi}vqtx)huLfvEywGms4jm3dy&69}z4vL2ML(?a`P at XK3_?5yjCp!y zD70etict7*$=ofc<74ci6jk`;`=Y@$2t9wK3K3SrKJ*ZsL?yCYT?Y_knngA};A^Mk zmgZp at 0IcAaAT|SoG|ky?!ru(}B^Y5D!3w*BeH;_up_zWyK*gm72}5h(7e%}U>I+sJ zndMO**`_ee2gx;*xISb{N_JCps$+t-htKreZX2HGxD98KKXd(8UF=K*G;A*Zp=2P#cp z>8dCJoM^YWd389ORds5cQV=9aIdlfT(ZMR3`eSr+tHv1QDxFd5wbDj#m-Lw0{ofcS zq;;KU_`DVJq#&IFrkZQXSe+84n(Hl~t>|~xn@(OZ5YAi?qf95O>d3L>P}aIdjc6l` z?{Da&WA^muW}M7!MEwBCSNI5bM$r)kM)KI3q7XrP1C!VF2wRI;gz0J{Hkn%VVIJ(_b&L@=@k_8~D7$ z8By77r*F^fY+5Hc=WY9n2XVme;5J9jkUU`9O=?s}?pG#9KMi0tq5qJhr(}P+rnPhT z8prGCb}xP~Fcufr>+^PRelSq>Z|mY#Z+5 at G6afL3la0;J?smN+p4<8M at ufqC*Xj0gFuN3w+wDZ1;o_40LkK5cYd=J2m1e=- zu)uP>;Dxj!#j2fgzS)S1)&A4w1Ut)i_hY6NayS3OhskMo(Fr>#eg-y+&GBF at 9eFm3 zoj&gnt>>AqU at FpiE8}d#xbSLW3>dckRPslXUC4C^!-k0N at yh!`#PlVbw#Pc%G>j3& zeMyuqOjt+8svZ|!%6(M!>Ex*_>mP!OQ+93zO3H$9_d|5TdPq|>tmyZbyX&{lXk)WQ zM3 at lhVF;bFR#CS*lj%+Yx*W(93mu$L%>V|xVx|X)3Z{<2K{A)6uE{qWZK=h>h6X~E z1L1GBbdN4jZqE2qj5}J{GwQfGPye>{&udhE9f;|fP6GjcFf}jCZ+(2*D;!fsZ-RNj zKN#H{Xviv+ky3k23iK;#%6yMcP{RWQXm_uR`Iq at yML6~EEo3U3PcX8 at gvU# zroKm}I@(un^$>dxEL$ze_P}L+mmU{{(o_$7a?jr$Q?8#FvkNl$n=ZVvYc!9ZON3}b z at 3V1Em*q>ku=f*>pnS6uCvZE!hb?40Sx5P?5wbN`aPZn$kdP@ zZ$Y#uL$EXuAV`DVNA-*Yy$(fXNLru4jezF~mbq5BHl>5C;3?i>Jl2;@#5`!hW`{1X zRZ)41 at XGR(85iI?T-+ws65m1nOMrY zg2*cu&7=5A;{sAObdkX;iK=tFHNGM&s*44iBp+eHL85cKz{T$Xd}*-~W& zWp3MZ=NRAnEw_qYj*%pDr*`~f|o&5}0Zxr09#nrjA$+U^(3|BFa1!O}x4_cW_r9{UHJ4yH(`b6E%B at -8a zNM(yjiWly&d$cxTP=Y7;{t7PpK8NSA_1#LsQ7QaeeSFepuPB^J(xNHRH1oG9r7;-` z-augdJ}X7P^%9`jj2}tj!3%8y59d51%VPB-=1C?DQjC}jff5W|=`pJAa!gDb#Yt{k z2oA|ygB06vm8an#(3}p>Ad_S42RSI{Ovca($>nyG=}x1HbduxrAf*6y0cv5;ZGG|+ zF>)rUQK)>T)YGD*)1TEOb#-%br9;=}qXFQq^%n}<2n3^=dkUhUjqOXM at MT2nANC2- zgfntzaYn&n@@NJT3PI}=1V at P7eCiZMngXV5=ESKnmc4UHHu*_0inB21Oh+*6?o(d< zL)Tp?e0A-`#A+jI0SY1k)xt3i at VEu06xc{DL3o)zwg_l#Y6gB!#U1cNpWmUIa_Z?H zoXE6~?r5P>Nic73k#w|UNs)TAG^}^ACr1SBXJ%SP(5pu1MIA0%fAvTK_b%A97iK8lE>cmK#5Ft zL7 at bYDL?CVH=tuDTLza9hjf+rXcqaXFzt~l6{yEa&3}~s2$hoH;+n2BS}b-8KdE|6 ze{A(dCBHZ&L8>fD+$e`n7cxVMhMJsMJ=j{b!L>~tjWzjT at WEgI0};+&5^Vu*SM16I zJhdGl$kpq~6S|gR>|A~`O{2W6V&%BrP&L{~5Oast94 at XYOB)r=4+Ql!ZT zE!dvQ*NxEOzze()JPxg%eE-uSIdt3`x8LEIj)vqN=~zC07(Broew~ID9p1FLT(Z0|MC=xazzD1gw;4vpwx3Hl z7a;;TGE-gy{cPn zC9XKWTxV^s0m)BXhi5l35|+nwHvz_aWI%@s54Z*?5wh(N#Ze}XIY+4D{>N}OUZQ1h znAb5WnSxJ*@q{Gk&g?j}u1NL0IgO#J$g!Fe%+p$^njtdPShh0?19!I+cb6i!KV9;uNZ{Rk!GsRYNeH()J>Hz3)u( zPFiFHTwiRFDMj+X z#r@(G)IUQ&3E?TAa|+3NR-{t;6Sh2IswVgdemrY3Mp7 at uhBd`xP-c$bMsbG?9E$#M z7gARfpYu>=z*`H15zlT{=s zC7zm=Fq4`Oy#Y+pfJTG%m6DUK_6I98zH%lbJ_>toqi^C4lqoo*q*` z8!S^Jz{r_7%K{UvEHzI|J66FNWI`DaYe}+Rm|C<^!#__WxN_NI=SehUT~*v6>Ml9aL;vB?U)kzYN-jqYQM$#Ap zTtIF3WCod9SyXrW8MY24u}*WjEf(K4KcYX^16ogMeyMCUuNhzSJ}#3%r)W*Gq){gT zr`O#9z+TQSlMgggaz*sOZ<>42wipt!3Jzb(VjJ3!`maJ{;BplgcAUV89X35A0vi*! z_ETmY$&6?gNeexZHi|rO*^+du@%KJ&e^&9(#h0Ucwh%cmTL>zeY~MxeE5KWJ0AjFK zYZ5 at jc|Iv)T9x1G>p`>N2>2qq9Ny5Wy8J69E<;PLN1Qxt7S4#VQBHlZp8HO<&bq?N z?xQ3r#fF!nA7WC;8c=e0W{YXaTRgOrva_D8T`@l0+J-`=PKG ztRv{t>xDlT>Q&5ASgO=@JZ$#qx|z9Kjnj6LbFkwd1u&)Ya4o)+JD!@htiFug?ibnOXC`VjoI6@{7s|zC0VSpJVX_h);0vZysi*IZ8AQuj z_`=hWMpm(%832$qaXB#0I!mC=aOkIB=0{Hy7eEmhisanXrBYfUzoK2{y)b}<=J>yy z+cI>tJ at 2F`_Im|ac7uN}czyzVF!IWzcZODvN?tj4jqe!0nIvQ7txo(luTFMw$CX*+ zfjPckf0cWcBBbf_4R=zFF at Ckx&rC)c{uce5Dx26fn2`&f`G~!xkHVAS$^WCcAKa%s z)<;$0K$t}R8k?%R7-7C7y8p8l=nrGE^7D9u>%}kz3)dn)fPj?2fPl#VhqS+TR_0Dl|1c2z-{iJQoB#WgR(gvKN+vU9 zA*E!lL>gZlL55ATybVeiS^`l)&Q|}h3W?BE+p6@!@E466v`rkenAR;27mC3O6dHw4 zO%QRdsSEEnVFkNZFx2IJuQcz9D5Gti;6j%mJFsCD~;eLs5YLb*cr23ud2Q zQxS^J;(iaUS4efsG5mDT}zATj2%818?56 zd#h-}q4hj{;^zstb0I1s#!5B>uRebU9n{)PIe0T$L*0?waW*r_zt-4dKgp^794{(~ zFkFk7rKlpbS1}|TIVtVq7 at TP0!Zh)=AK=Dq(;?l{;R{dFOhy}w;&s7X7a78tz#a5D z>ap|YtkWKkyKW<#MUu5vmb`KO^hQl-*^|?N&u{Q03h>`#tPAx9F~R5AYfeB at 2%ynQQs>qDE0B4MAQRgF1Q3uu05ykVAqR&s(LudKzt*{ zW!T>(aTcF##klFgfhNmmkW_$@pn$D{utp8kVa_7kOy;mz%4=37mlC70tb0g_ujS?X z$@D^`%vQSKQ;NI7H$HyN#y>@QMdye(pE9aByZ)v`${myaC2JT#wg)&d--6s_s`IPl zGowDhvY*fxaA at lYxJ2G2J*sT>dcwKF5%(|)rcHZut-?`yyjAohg at AH7#1BO zlb|%KrLFLK6%>wCV%maKPH4ltzf=m$n9d8MG^$>ZAR$^TV(f8Jsw*`9_XxJ-X=Sv3 zxav89{f~dH`xhAh2}Pyb|u48O at 1m# z;JmWoZpth`dUSw%Cnbge&6R6Y8Q8gvaxj16bd5njU*7;XB%BK}FG)G=B#_i-*y7o=2t(jOH%gYP}G=zMyR==z6vY9MfhR7jJxuukV?Z}x z at FuSH`4sdG%n=e(>P`85c7A3xL})|L_wn*=~_*k((puz96%~ys5oKGX$~6E%g|XIRXlXLes{42jzzKG}V# zTKe#?I!^9K)NpMkI)%V{a2-d#KT1>*WZeM*B^7QgvS#8X_HLKkZ>hYb5wsKvs~6|k zF*99NvSiUULYG2|wJfwwH-RM^r^fs^RHASgK9EwPfyPSMNPZu$;=DXT*A=b<@*7nA zc$b1xLO}7+fk0D!>W6RZ^b>*X at CrszmHYv$w!88v<>s=qO^*r-bHn3NbU{Hic?rd1 zi9FIceH3S71Q9vH>IY_syr|EQG^4Z52vR}QXj}3U15A^C1*ym|A;)?g5XE!k547~M z5vPN4=AYWcHRZ}Oe;%}GHBl{uC&v?X49;xID at CN6l>|+1(W9&z$8^gG*86k=76Z`T zwH6|=_ at C|>S}8=tM{sb*&-hZKe&J50jUwYIFf6FW#q;+f$QpAE5;T8dJ>BoK3obyd z{R|U~VdBq0Y9C^`z=+G2w(fTxW$*L|!!g~*^H`dD^aU*{hr1%vC|c&FuR7feFjk<7 zK&6s z%?mA3Es|`SybBksdp%lWZF?4X-3PDM5de1HDsmp`Atwyd=}WQ6kF^u%i1y(y#^}>q z{Ed08v$1*zp$B1y$FG4g7I(lNlB!?FL>er(KswcV%7s6>Cn_|oK8C!*7BU-rQXO{+ zX^pqHEjU^edi})%v+BCt^li7SiF4 at UlS|&|ZEzRt<|7OXp*Dc8lh76LTkY>YFLTAk zFk}gf3~3073mP{_CvMY`S<)%!!n~rXUSpVK71c$12ro{PFsh+WlR!i96N63GvCt>q ztJGy}2fXf>%`fbFE!rO27yZR7wJc5EDS-%@VsnheLjUk|lnPhu&%asmC|UZi82^4R ztp6chGyJ=9Sg^WaV?u#GUSolZ6D&{sp~^2tMxju|M;kz3AIx$?VSnrvd98FSmfYqC zQwEBJ&?ks*0uU at jGlFmEO3zOJa&hsM?eY0|1mlBwL5mk21{$S~*#uu`GmI;pkUuPQ zWWsXjX4d9#Zaj*9c%^`EGc{@8dR9Q zJ8C>PBKtZuIFpE0Y_WqFaDC)*F&U^wrt|B+^2mAQtbzO?p5rj9f^1o|G?t8(j(n^x zh$vR+yT_qV_BFwxoai{VuoKzEr2K3D=0c^| zFkse2nUBr# z7sTA-fo@#$*Cmg_Bale<9dMOT)RJdLv0cmv)iIE$TETpj6^O8w-;I(2J&992ouQA& zyKr~Cd(>2?VpuDp0r!qa$lMA=jnExe%>kCe at MussuAwWL=BcBA&(MJR(L7GVw~)hD zSUe6ZbHah;{DiaBoGmzUQoWQ)_?1-?NhoTD_5=o^Lj5%E;2R>9|6qSj0?1Xm6fpFxsFv!%TUZ5Wcy!N}AV zA-gvc9bO#{gV(1 at N8^Qf*bXZrl`Msfp7oLK*yHJQ!#=p0o7)Riws!}sR3&N82?pn? zKvqB`tR4Y}nn}@uX(HREjA7Tih)yF|^OlioXLy#GvLBIyfeGPXIT82xQKGsgUq1*0 z-mSkmP_4Q35Hwo1a>WKxc*@2ti2(``W8KtF8nsey{N7^+)5#z*-6Z`DHCW~b?1NH_ zrDSQ}X}a{WWgX5csP8J|Y=K@(2wr^S1U4wJ*fjjGpGUog-enz6yy(QS#c at zW{uC}B zugzE`nyOhQ7g&$jEyL4bCtgKIC2Q%Yzk at uwb=-5<;&t<`BvvnPK}XcZXB_kt*J$gC zi6;0ocPF*$WEG+`iP-_TTT1Gl`kLvbUR*%F+5|+Fx%}pP^)9Vk+}K*Cj|2lSik*uY zst$7lUheotov+T_!niY at z;*|-rhZfA)rTkLm60|sgA5)(YaS0v(lGZ*P$$MfIslZeRP}DcNv5!h?2K$&f zh$UePh-XFL??j2Hql)C;7!+{c=)cic&Xn>B{oDl_yu1gL{Gm1i@{9gmQncc*b9nrP zDg^j{Mv;vF2dLjN{|Gc};qJV47n7&RBm1GeslZ0 at ifmv2NkRlBWg+(I=xMb zJXi{QSlpv>Obu>5yqN+U=)9SXy)C2oPAj~KKYiR`3S}z!+M+QkL2b49SI$N;uO|PA zAPnG3FzK*y2Q(hLQ;TL0xp1voMet=rYmchTN5CX0t&oT(_u0qlm$jO9RyV6n at 1-R8 zrFa~(4OpjBTJN(SUDh~Jw=2m=?JIF5EByS;AVm^lvX_rujUn=J%r62!)UXC~&&Yq; zK~uN>BU?^d*SnOkk*ivZ6}WTT(L*hES*{0)6JqmM%vtqpV+`^6qOLfo# z3_yp&aO=C9>x1JW&_On*UP+oX1Oba$z$DpVJd&;0u(}b8gl|j|(-sq+SivT^5~|A1 zvyRihlIhQzOd`-q__d;jK3`oA}dS{tixKtDi$tL?!JF zPnD}`EwHMZ at dq4S%rm at 5xabV{abn7|ZURxk);xLOS2v>(h!;Q4y<9^KKCIw2;Sw`_ zz%S0|p5O`2x(oaTY`pyLiYX=2SiAi_45`=wuVSShVZY=YMcA?;dacL+6g$A7QFfrk zNv7CoZoCZve5(Xl84{Z?o6yN#?E20{I!>VD!ebvh3E?eM3Bjy6%6a8J%gr9NxFXTR z7-?i>5n%q2O#W$dz9VJ+|Kmc8*~O;(7rtcwA=5Jbi)pq05jn-}+F9qMK9L%rK=Dgh z@=dKG3?Yv;nuK{dZRs{bFukdAlIq3=s&^D!*Nwg(!}}KEwJ^%HrH&q29f|dPhMm#$ zhP%ge*@~7eogLz|r#(I-k<6TgT942V1~0;A at 0@fqaO?fw5p#>5UJFa1gjB|z z6sxZ|Bje!u_=~w{E0C=<_u^zi_hLZ=@B=DT18LDpSd(xAd`qQ6ZFxuHTECx{J{+SH zZ9GcgArHyD0YW-gU=ez)0Xl0bv)tZo at i2my8xX#UrWMzXO3peHZP++$YN3~UkTHRX zR%}}E!Vm~_*8BN^(p(3Z-6O8`b;4!FP#=DdtZC+pUVf4%Xbi|mAzex}443B at 2IE~1 zzE^j{*Po&SH8LM+ug1C+GF!xI_HkAOQrbPi*rx)Sm1p;9lVj2DHoB46nIj{Q-3$|V zwxD1)Tk;~bX_;Ic%gMBP7Z)3<7`f@#7>6&voFX|fOu2Heoap?;fAO>0B|2kC>u0F8 z_t}4N-Qd=md6%nkgJk2sJdaZmK461G;^|NO1ej-)gj)f^pzF*ZV~vWL)S(#39LzG` zs0ah?$)#I{3t0?MWWO7D(uFcFYD?x}x5NvM=~C<5scy~gcek}+88h~iy$Wy+*uF*u zP%BHmu>U(YZw2hJDgI&;`ae{k{|u-qPW+epJZNJ|Qq1SuBnl>?cK*=~BOo9jPZ0b} zK!&6`X5TWSGJ|DRN?{9zE(b+~>lZ38#Sx++JceWB?&@OlygAtW at U&S<3$)>;B!tTh zf|H5!0&8Ty`%5;vuz&t&&44b(y7mO>SOgh-#c+%_MM6Xt!{JHCP)vIj4<@9zN6EmK z1rWX$%zZ!Bxb*_q#NO~`W*rf9=l6Xw5GOUDsjUto#U;Kwj8fdG8( z^15+)pq00k;>;qP2h9pI-HqaKl2A2Cq3EZP`2#I0=;3S_Lc!+EKz(@zoFHFveQ` zHF65H_>XmTramIi#*UUBDDAH3KTV?4WK(hoo005#{)r3nvlj>TLuW*eoy=2B> z)!M?Sas=;l#bP+25)Nxb6uhW&+GF4 at 9Lw?|j2kG7P7m3^vel(ljB0z|yS`6^J(0_AsE zZzk3!?gD6!Tlp-&4*U`J3V$|^h{=m5K~TAyx;#%^rBD9(eENd$GhMUJ_jhizVly*X z>=)!}sW&dPJcI(_MYm^7#Dhr>O3=4-FpLLZ9tRd=#H+08oULPreHw~w ziZM7(SlF+fQ) zHZBuH%negY_cm^V6$Y2n5EUm_Ba3Chj(^ zQ_5Nu$GD8Dvo+>fDP?J4&lxzjvx_!_qK1#b4Gjfc>dwfqO>wEK4g@~9a zg>bvtq?#)EGt_jJe8oTtrq3^3FKz+8N6DrwNLbF4natI!mN)>4q<%!G(K<5GJ~74| z-7*`J8>`|i-Pw|Kwl7G`zbP+tCG;{?kio0?N}UYBBe2`R7$aNjCCHFZz{DL#x?v(5 z{5M$Da%+cPnNR~&>2H$KnAMV9&|f6n at esr`9*gkyNzCEhndN+X|4sb`zC@&*{KZTE z-y!<{05j71cK at gSPk&dHZAENll<#dXYsg4F&!B#mPKmZqN+{Yn~? zItiOblP0MquIbPHuHG*1dbv&`=@x%04Y~6?!kFh+h1qVXpTC&d4kvdUXGec$dG;ib z`hLA)^!-dBI2&1q3YyUT5?1>#eQRv!^=wPc#KgnJ#(^pmz|K4JGrMg()otQP zg+AGtGDI22#7uHC<|XUwntI};zzi>mW*e$fTk?(hzx63MOv)K)J2<6%2n z<-PWhbOOx=b7gaOQ^-a>T+Yj*L(mCr%^x4=Lx2F?3KQNkDGVy7*z-_RkZoxx-{wZ<+0ej^A0SJg(s%9GhG01Kw2-%SNTaTe1I1J2C4Fm_76hL2#bhCkzpkE?B(#0Z(_eDZvxH z96+YEClfxAcZksz;tp^}VS)s($}PzU^v~5d;&Rv+_-mC&<~0B8by;f1WzAv}#yYjP zFfaUB%j}eWy!0s@@9LaJW?AR7miH$*+5<%=r;|ViL|(W<-%~}OZyA$3M*P>+x+7d>W?k&UhF zr1c!*TEFj-z)F!FryQl5!8vrRT-6ofy%{{bn4#HP6SK*%oQ;N+>NG*CP&;~pfA)#i zEI66c{iR?oHfv5i#n%RB_rPjS1?Da8IKG zlwt372pWC at PolY%<{>Oh-_u%z4{0p{GQ2fQPOSbd>s#NRDGEzZ)f2^1Gf-!bZMldh zm0}H}Y~w3- at m~QrAE-1RaJdc6TgJVIFwYPw>$z%%vP$u?1VR+lO-8!kgmu*sp+>0dsT6ZY%EpV;A&SiumKZ9^DNE*E!g at Yg@))*< z*;o^h+1wSOUMLzrMa!6VRoV9c{mcP8^OSP*w^#djv!(eDNK?_tLEp*P)cv1~8P_iX zLjPCZl{>fARKJ7ka4kjlKSZPk$dNt9k%|reR9p~hRPR at P*aLZ$J5Zv2T8RYF|D*5I z!#g#4y2lu@>d6_G$>m~P~t0&1ezay;pJ_Y*G``F2AqTLW%)15jbQp%(0bIVUa%6UJ% zqInoa$9)@0sh>V at qfFD7dgvaNW!moqa1Dy|espLy(S%HeXhY at 0(9>ih!qF#tsFwm! zy1%ex9#Hcj#AXM`RGz^6_x192#>VCUhbVyr0%HA7*6Y6-<~F9{e|!2)w*LzGl)_O) z`Ez6ZoC-sAEP8R1f|q|KqnYx zd;o-?*+ at 7Y?!ce|Cwa4ed9;|dl11#;Y at z;p)bat!f&zBxh7d-ny@*9 at aD4xv!(liO zNii38pAyg_Eb!_C4H{f(zV&^>b3+P+g$aJL&fHbi9|d*Rhj;OFBkbY?8%8JDlWK(u zJ at w#%9D-(}^zy8eGo2yz>1oJxN!NhD3v+Sl+DYCKCtC~r zMPS)m6rOpz8N*YNimiGOzBZU=<&Ai);1MF(u zRJQ+O`=rNCai81 at Sz3l>OZjd5_FU94&g#njjS1qQs{lr^)_#?8%fq|5V1rt#xe&FhKgI!Y7P=dfx<3mJN}FFP=#8+F9ymG}JU-1_geU06JYwJCk5oF!xo~)Y(_1T` zStzbpbWoijG(MSMu{{3luyWtmLqvA4-ms(JF97<-n?y(g9(?R7?^wn#Z0g)qK&fY5 zZ|?ro&UMz-?woZAAj!P*CEmq_)5NToo++)`HJ1i!zQ6`;3oI7${^8WzwTffTJfx<( zGOx7c$UG)WLNcgXhP~BWh$?=Z$kn%ufU`4$Bnp?U7Obq-oUY__lv!1g;|$I!-*hE3 z%!+=2paFtg902(y3U at IsnDa;;=M5Qmm6VV~vjtHQ{kYmEFW8{!jVD#D4yGFG1(Xnx z)T8`b3|mD|hN~@n2Hx)Q=r#@l^nnZg0gwL-g0&vYHs&Kh`hgj`PRl0614v$ato88o zum=@A*DDvl&B~MWRL!efH5bOPSM)~6>J6?f!cjSPh1;KJ(-ncC7Pu at crdMUx*XH;3 z5>h_2{Mi&SvLlkkg>sInEeaULx=8)mF|jr=(prDUX|}r+L+;qhc^jP^Z98_OD`3sk z0{cBNQrQGcF^REdUm}&*WtmZ8ks--oC!;`OKeRG0CkP*Zd4Yw++wXs=i8F%)qt{C? z<|7FB090Qg2(9Oy>HF?ud|;D5BgoYG+UIN!2*a;s?L({DC4bz4BOFN6)D2zQMYHN< zi{8 at P4w!bK>OQcxnlkP*uVw?zeV7!+2iNUxYNhw85mR!4vBrg`-%I^<#ad#_s2_!ADw5U z5>M4^ADQb#94z*L9y2%Lt}OtKt3NSU{+5X6a`4pc?t!5vFAt#mxW5S96GTh-3Y~Mm zU&+ujaw$9MCen}Vm5tupf3W+wua3E^P=~ksyw3 at 3{-V8d@_}s=TmJY63JyGRWZaE(}cm~Tzz`Nh`5Y?aj9`WDP{7U9g{bHFH*CqgtS%+ zQp#*HCQ3%rn9{On at pFYSXRL^DT#6)pf$%Y7CM_O}x>U44Qo}`{5lPa+MNPnx#9FQJ z-1rijAIVZCfJqj#oq)d#OU}Q!G!M3)xde8AFe)vmq%g!>ZItK{>@t*%jj|tmn(6{c zV+2kycd8Wq at e0!#UzpMQFg++GW4Qs`H&VQ|*(h%1!@@q!<<6RnK{xi>pvp#Ygvb at 5 z5aM#KFLyDO*}h6aX+TXmdW-4lS1Ve4a8l4<{~gQ*F?GVil+h6TPDkEGON2NZMc;i& ze1y?cQ4do3idx at RiHCrMfT%Jbls2RLBEy2mRF}~aEXOJ0;*?s3v5^$Vr5KoiwWFZX zRRb!cxlekJc*@~@Ldt}r6uog8`5+5%w%7=j1qz#O)mh|WM|xArtC-=F+Da1A2LkBj z`VKx-X0_fb at FpQ8jV2lFsob*5r;^+GFEYRmdx at FvRh&qSo4c5$eRUh9n29i_0KIm!AmNNmYf{W<#uiG z0142FvpJvjx)hm9Rjb$$R@}rH?CJTEaUVqh)1J6_te0xR(mW7nnks?G8ZeX5AErbzhBU at l_yh^hdrb zBYO7*VCJ84ZN#&z&rw70;xBr zH<#R9jH`;4?FiyvhSxm}OhpbC3FqZImAyBEW6r!Xug4VtV&A_*a)1qrdyO;CWtI9O zS!fU*S4Nr#d=$j%a+Ubb+!?Xhd<6&W-#NlX-b;pXFP^jn6*IfwcPAgW{W{H+u9!i9 zwfZ2tuN|HbKnwi7M%EId-4uTDNa;pDUcpum;$3J5BW-j;%a+-q?#OkzqQYgqW}6kz zOKW7_5(=_V9g=YQ!5dlk2*NAG*DBuLVQa4H_11UeeneA0A}x@~Kv{#IkAHY)V?$c; zd6$oE8_nuAyDOO at jMyP?tMiZ?6&3;4Hixp*9bP#z&1#EI;-s&1#AIjc#T4e`P0Mxw zZQkj8kYU_50c9cieF#{Zd15uZxVv#%vs&+&Ky+pIyD9_u!gJmQzKEoYD;Z1q|NTSL#EQ|6dAXFf^K-)M3AdbN`T(}=$O z&ELVyPP`v8$MI!2vhYE$CAeicwp#pe9AdvqhYk~4;81~n4_Do;wcW1m%$UNsTv2vd zerug_z*{+^KS at s~><(j at v5AKYhcwwvgz0r3K_M4ILi%V)ldEhL~4jQnKcDWNA`SQz3v_omc zx5jMk7k4&eTL|ZhooPFDBeAL6IGP0~=t@*wabv3;2(-tG&0SKVD^m1Af~4)s*Kwyt z&CACfa6hw1Ybvn at sHz>!QfExyF(^C1SSO at L1Ss|EuN%@agmomWuQF-0Jy%67&hnV2 z-`=SB2onIuW{C{PLYjq48PThH`QHVYJJRJgAl;U3qU=Y9G-AGp3%0vE3bIm>FGbg= z7JHz>_VI-vtMj7p at hgZlr0x^KNMs41WX__MiB0ch)w(FHS7CL9;oLiFKIZ6JuhL>r zpCl67N9Y6e=l%QZ1$^XeQ~!8#-G&#Ip~*2GX$#qZTax}_cg}9C(s{e ziQlzzMxm1x)}wrC1<)%n1*Jc2S4=1*04Sz)wKAPYkvirYRaH*QA*vcrQ-=RTU7-nrr z8i8P%8XesP}GyrAKtK8f8$&Ds6jA^%HNQU&v_CTIJ|o_w*S{1jQeT5isq zizTzgp`LkCWAcK&;)IGZWdYj5il;fh^jhHi&l8Fl-Sp~=Is1M)i2`_R$~fJY%WDKT zxAEueUi`MF^nSa$8Wy_^ z`(}SfxV47Re93BV){Ob&Mck6dd;8z*T7>Y8xw#E^m#}(mS5BIMpZjHP$(b#pZJ5QH zr+Z+q`NEZHvX_eBy at jak4*nl1bAhUD^eA0XVR+ckH-wXR1H^7TtfhTJ*jsAQIs at Wh zwW*nzTV4~=Ihj9LSy+X^Yz-y&e~5!=y5;F%v%d%I^YG#-B;cH at VGJz0_s_Y`vCJXo z-&bF{rnkkdE~cc at 9|>0{C9XHTJx$ro(4zx%fN8}OyIz^nzqz>*w-&!XfwwN+xVbVf z;YcqLWS8-BYIwO6ZP!wlr!c at y43S7`m#{h#sN?35?p`Jtfu z=oGn72DPTs(B at aCe6c2f;{AGws_8<*3U!fULhU)3&uS;}t+;;eeWk at oGfI-<}|<(Y3NKWr&%k}czP7Uuk`L`?9PfYI!# z*)cpvjH1hxQ1_$3?MdY9+9mNklK=)JFw+X8n%=5?jKy$w7PcZa at 0pue4FlzH3(oc3YTz;WQrDq$M zC$nC!4?4d`k@>=<1SE=noU?Cn2!3qD^SM-DF?eq=z1M)HaN25xHMfdh)b111|0I(# zONQ&`Q1EK$uapo~=v{Rt2OXZQHhO+qP|gd8*E>SNFD8_j|2cTR-MlYqs?xW*A zBJG%KO_uAdsVla at munpdHaF8yGz1w5$%I-`VTDy#hfLI3;C&Q`o^lEUua)Jd|JFx$ z6KA3qB#QGQ4`XUvcq>fYfaB at v{B+U0&HkR5`2BVK%nKON9~0Zxp4Uoa2**mafebH< zF5W>(=%>jb;l>-}0CUgq^TyZACfr0`1Qb_7E$${ZAR4_V2U$9Py*}uSZA1U0QZ2ly zGQBZPcyVd4-Zr8o zox?XOfvH at lL|tWa2NYw8x?WBhTPLO3#(vV71U>JgKFESDV>+Q};oYKFZZeIRd)0cB zhLKL$YK>VKN%;@=V-}S!zs6mi3>fh at E^@fGavP>4mAADSBUZ+5on`vHEvS*P!U)Qd zrmPg5S+V3}PgH=|kuiv=FaiV_0^%e{Hxs7U1MV8bkIJ-tib1gK*%|upYEY)Q`qBPI zS%i7q6%5MPRzr4uPvu$J;$8ldIWFB`dL2f6Oe<}JP1mY&jYZ;_p01`goNPtq3$^s) zPZgS>!N85-cX at bg>P^Qn^+&|4A^Vf>$PX)9CkKdzjc^fO{9YUjvf;E at We7Y$qxt4N z1Rte3!}a>RLmkFWie>0J+;LBi~E0gse4?4s?zL znN86GorkU|U9E-IS(juAQCUQ+gkq+q+EbgG6C at 4U=109@$o9C6$xy&iFYLOEPc%$^ zxwR=g4(?ax>5kj9dnTek)U*hGfKhJ091pIIoodB*sSP#rsb7bijjZZa2OLpFzE)9s z at gR(SKp6B}Vu5cN(AbGDvMw6iBZB^r6y-RL8R z^n};nPU_QlBy)o%&+|lI7VmQnux$}2O<*aX($0Y=KQB7|#!iE;j~b7Y8V~Z|7UMDB zI*Fc^t at aTV-e;rOeKt6m`vuQWw?S{*E%T1jqm9nXPZuek?ol0zL1pZD at clp=i~LaW zRGUmSSddp>s(5ICjTfu6J$wN06{!LA28H1e(wpJKIpMiH1!{qT6Nq@&$xHV?vzMO9wiz2B z0KhBYzdesrGB>pRKZP}ca?+B(^a$SO%Qo7}D(B631a5Nh+MYjzZWWLdG(aS;Pg$Bu z+aZZGdvOnY#fXVVubty%mvgtrd}0D$oS&-8yAUg262nIFyP$fgt5(=x5F z(1ZfLL at yk|Ti%a at s;Ua;8sUS;@!T%*YHH*vWA<0#E5FKPXfG552uDN|{jC}^LjFW!3+dm;=ZNRsOE)q>o5=w2*Tw;{NB!PXg87k!1BJ=JtU z&&O5|TV_cT`+O?Nx20i4yo{zGEakU;EGy_P<{?oj%N3dD^CGjg!&nH&I^fw2u#)_~ z$`;4qSP=l5*Em`ti(#s9Sl&;Y%O5Edq|k=uZ at b4^wP6{}6N;61!D-{>r|w>*eyL#j zF-cNrn%x0x#fkzwjS58Bh8dQ0R6U&?oBQeparW5H^vpo+3Q9M}@CjY0MyzO>7aljs zSLnC*#rBbRy~G{R2~*$ZZlmwdH3$rm=o;BugloeeKf_X3^8rdf|3<I}2SN^e5Fk zfB^uY`=6h(oW8k(tGT1Gu)VXni at ueyjp09<-l=H1A}J$($&egy6cPg!qW-X?7WWX3 z&6{gbCX)-p$D>x3OE70(0Unh~m6GU%KI{IiitDz^zuZUAmIST)3C{Bh?DeR=aXgVa zS{Rz-;yjh*`1JMEY-{@V&dd7^wF7ZAn6u-L#xsyeS0(aeSk(Taf7o8DpY-FFT(za@ zH}+?cqy}0!J+j;Zyf*v&rtU5sPk3&+zmp-gAEGYoSIdu~Ni_VV*L=jF(U_TW4`J5K z`DTluAeE&_zbU#5O0~p^G~>#|N0?BQ at reoxW$yW$MB at +|bjzZn1uF*e>mDN$FL!oM z(I9T+O_qkcFdJ3a at s19+FyBnWleFfEvi#JkFqNv)_MI=fpqU7Lj47=C-2<7FLKQT> zdzDx-=VKVf>1B%Yw$6&mBy-Z(dZ+^pLZAm4R)3k%5{3w8f$kFYC+qw&*5U4M^s}ip zaMuG+I};q-2|Rc?YK<@7e!8 at Y%^8*kDRstWhVUpGN0L<+&(d-wcEPSpy_I#D zQvSmNQqCl8)oON;RpsJKD}Sic=SKdAz6(pkt4wT5RDaKv+ux!{6dI zF#4-U9be9g(B-TTeu7!RLv(@z;VEyqL^o*a6bC{2HH^$~xO29P4GhjRT?a01GO-v^ zgva=jR`f$#7$o;(=~3?)@2X--UGbf$r==Qw&{$&DGR!;gZ}SBnCon)Ov>ZJ6ur z)>E4)&L56El*?hMkbOK$(fm+`+QKwzN+Z5;E5mpm%1inn^NS3Co0YBhqQcro%2R}+ zY}PYfWzn+B*?i+Eru?9m*EJ5}ne(+4tWk7#B!gZC+5*IiUY1lTrgpj0(k?;eZhvm6 z&C{Z*;VV}DlZ3jW{7Aw?{KNdytTn;i|Hh>>C8l2 zcRiKKu^%~4kJ=eET|lOtjNfSwJ%w$ymMsU0Y-;MNN*A_|{U*IFYB1G&INWhw8Yc2? zJKc{4hR6wag&GB3Fav~%`(S{Zd#Bv{L?CE at +hvXm7N?lS$Y~_~1fk-7Ljs!4`3Tv8 zZz$ez_P7GGT@{4bQ+~76hah}t+HUOCCmK9nxlgs=kbF1w=gF4u%e{)(`X;gZ64%A? z4%3EtrLUC&AI>Hiu)`(v<|l_O!u7WeKDGRTJpPjaKI=P|%fT5}FM7fIx7`iC-xwjU zpHILEyC0qX8A+7jzy%xqC;?$!sssDWER~_3OiB!iI8 at A``y1^AY~T5iITkTFnL(vy zk at qI6*O4X;p(HDkZJba)0pqQji2=ip%*4@~IJ+5GPY$*g(Rv9kc<)~7fvRa9 zudic0?lF*Edl9HtG`t7MzNb9Q915&qCi8(2O%)-5u8$B>dO`w~5{CK|LK$*-M`4XF z!Wz;~w$`r%-Fa8>ym29sJLXEP&R-9#1J{PvCyWErj!T9Q&7hC5b7SsFbxh!i9awk? zKTg#Px83(p5l|jdp7xOk<*%7k&l{=-Uo&%gCD8hTx-DN(L}g{HeHYy9_ssbVDQn-? zIg(@8G!VX&Ri!1N~7V!C()1;CKH;o8)&@M?P&}4~-0QcFwQmA}^{vS?f{=@0{ufDZX zf4p`A$iL7 z%R$2`MBXE_bW0&gUzS_cqa(tsd>TDh`HaE0e=#4hj^?*zi?TasdFJBpPAno17SSE+ zqK0t at o}+KuKmyyXq;C#1gt9e_>lm&%f?VEn5pBsL&U}sp26LIHQAmzDb{xL8^Ca3! z at roGxYfkVpx+ z4kY~>;-- at YQUER3Qze2f9AaDqj-NT>iHu~rM|J1=Pn(bgV{jc*HUZC&8$`1B-#=|c zBWOn`_#5xg4ekR(@pqR%=!hfsWyDJ4N!abg2jo(hlSq#JtJSoL$jldiE z;D7C6h2qKqYp=izQl^ok&Ry;JnBn3HvPd`ED~*_Z1O78Iv#3>Z1pgq@`VTT0{vVMk zZe(oZWbX90P%1I*KPohWw#}P2UD`wNa`HkH0)Ey&CkF+YQ4FOO5h17P?F}|$Cg87U zwzOOOb&o>x($J;70Ds62)#EM|Src3hX4IQbxgTY?9vxTP@&a7wPxE15g0aYt2nfm# zH}Sg&4o5|i!lYVs+TV5Pu)}Ob*?FDnGNdRE|F9W6$|B_oQmCx-P*E+dqNZ~29IMsX zKw8>u at 4~XvWV7C_{3hQvZ8?Qhb!aEolBGCqc=Pk^G)XBX8 at _MdXKmd?B^Saq6iY57 z`~(g%%3U#stk|wTZ|rIr0)Z z`e1i#Vx*rcQbsZJwc|DSysQ&7PuEU}1{%Q+Y+rEmEe~F^`7sfrzDu)*$JMh4E~n(h zy*Y%woV`>J8AErZ)dFG)ZFh@(3SG~k1`=s%U1||d)8I<=Php2tKqHf zUp`+zHU5trM>Tu>!;HAfT+cOUyMe*UK#g0W3^MJsK#^JW6sIB#(#mJMiF}VYT=DV} zhO(HKPoQI%>BB&YRowDG_ukeEc;TWH>~Z-au_oI=3>-lBWYQhFtL9gw?TWTmn5ad5sh9R{3^lI)9UeIBN3ZbDXabirb1rR?>(09pZqh=*&uc0jW3J%9*t3rSu9z-4wzYAt^ zqCJ?&CeE7~_XD6;$y`N(M+^=J9Z~AXuRHqp>S$Sj=#xP)11CuB^H*mDwx+>$5P at HA zoa;B3nBz38v`OQ4p>|yq4#Vvf5c+myXq(*SWa_UJMhxT?WmUgS94w5LDMjWhT}ciVCbE~(b!So)mRmaGlcyHgA;GE0Ayq{e+}mQUMBQGl z*C6nip?9M{38mow#)69O zj!wqb|J{6rN}94r@(5pW2{xtUgAU2zmY~+*F5#}Ay#Zndb$Sg!&zDbf at T*t!p7OWD zFK3qC2#^#ahD^7j=%&quKcO)8`mZKZ?23Ef{w7YG0{+$oByAY+~4E7}X6Gy>2X6&zGLa69~`~Fs&NU zI#AjLb~}F;4rad!a0H0sK552(g~4PvP>MamB``Xy6pxm-lTk#Sg3}n|*c>;+XcEcQ zkpVC7Q4(;~lp0!21y50U%#`cN45DZmqkT)#LsgZwL}9|Pm+>=NYj*7zPbR0Ct8d&l zc>G91VVJ!LVQ~H^3e#+vj42d3IOiT+_Kbt~j6;o@*3L_@#c2-X%wcHwg^ks}`F+MH z_??XmFPXk^hkljGW)%PIv(UvdJ`?+CgjQkKJ$3Tiy`r;z5|S(<0e4cclXpH)z*paZ z*JTG1<6TW6`8L-;|}$icntDm{}!!ZYT%A2MsAj$dynrssymTp;@#YH>O9l?pK~w zHsotyj4pkktx{ifh;&p8+?ce;+3B*EVov3fC|Evjyy+|CdA}WNc{bY-eR`^iMnC?~|4y*i0sv1`rJ> zWDmZcha}`{AOdR%dPD`WH3R+uaR)K*V#hr#jj-qUPxu$gGWgPQn#0*fuY35Hz01XM z|2C)A4O55QR;Sj5;0gBCW6tfbr!CW`RNC*i2Sys4lYG(-v< z_+6~HOtxqxgn4|e9$}PIgeD0$Fh&O!%z+FnTJa=Ofs|q6*7vY5Qo)tLa{P;AOLVTn zJq-le;2F|L^pm?-<=FU;4k(;HfU0t`5;Zw}vX!I^oNTFrDILyu8QEf#fOysiVs4W& z75pT7>wbz1JUK13sB+D#3>yzE{$cTch7CoiH9~(!C?NY-QcKmj8n-dc2?tM+=`^jl z&UONcxQO7>YG_Gu9kF0g5h5%!GPMfo+en`65iO at kc{t&-WLndux z6{>PhE*4|8HuH@*D|4UB^^LLHaGd9tT`-B#jRJLJ|A$&eh8BFjZPeVhD%Bs#)a{t^ z%p!pTC#y9cMzKEhS=LFE!W+!Y2|Y65w5t2)5ev5E&l>HD2i)SA>}zz(V%IVphiFBS+lL8lzDr0rXr z%`_afs*dxmHuO2_TlZ71AT)pAXtGGnKc^o`9rdDAyb&A(ltEDkySj+nY% zmGZ$hfAe!|=>~4A(6IaVx5U(Q*;_h%rIwFw at 9FnC-HCTceD3K5?AYZm{Y;As5^d?E ztfb4pEp>McuW&!Y*dv{dGSA3QP2UHb^Hwa^jDAByL#VfM?h!{=Mw2iBU#`J8rngHy z*Kp>pfl`#xL=296X#=Cs#)x7B!QfR<%_5ocOf4S0ZGm z_3pC^jy{Z0!{C~mR at ff3Bb6O~v%kb#Hs1v>{i{maR#D8wu?u)~ON~?oXG_9WQOg6j z=e at KSFz!@LZK0b-o$;E&@?8Zc2X z*`RCq-^IeC=a~lEen9mJ|S6S at TQ#w+>S}J9eu-g+3|dfd+T)_o{@1udEU`kYX)Ao$Gv(+ z2ctm5xiRJulWoJGROlihXQ(T5w#wA?{|VuDR^G at tDqu%1kt%i9?Bc~6*c z$yTEwxgkFX_YvarA;kWbiu^5b_G{4oBM9;%s{FX7$SEO;!8QvPwDA=jvoKx`L8 z265lsgGZprC4)fd_tKkLfvvB^Bgtn3(B?T>3cQzy!&)$-rC#}Cpc3-7t}VLeEvf1L zKy{3B-|+B{LVBrs|A$+yFucrc$ClY2AO8{$$u^0N0sM)FzJULi at sNiqDOiE&t`SgZ~&@**P@p?IN15=y@ zFdOldZuO=wCQ=z4pYHaLlWhTT_Iv={H%9hN0Gn%$_L{;y0NFR}Yp)FY2TAUuU_TR9iTJFA$VGrzWJEqYZ7hajTy??^uB%xH_Y8Jnk>ijCL8(kBS~t5w zD4m=S1msaxPBnH%ovrQ>K(!3a5ZG at i6|*j$s%K^?)zT?lXNuX`SBH>jz&!q%9Ix?! za+lz=uyUG4v$k4q3a1Vd{ch}sS)Bh#3nrSN=jNb4hUDC>PI*jdy1>v9y!P;t^5j;} z?uziaBF237ahj5RY(H<#`Ep`-X`>G z7;Keb>;SbGKuL~J(iKq^!Z`dnR{XTAF>rds3#NRCO||01GVN~{JEOC at NW zg8UllPz%F6l`Fh at ibG4fSgr6{<4k)PaaAMC27yAB8Fs_ at t{dQA0CuXC1PcxTFa-|) z!1BKU*neWGQB_kFa~b6ej0kqbFkRCsrWXdSSYQBAIu!d3=DF*klQ-we)r1J05HCE@#k`XJ z{i1VvYkSKy+dJy(E4$kpW at p^3`iFK(Gyw>HDJY6NO1OMVOU0f!N>W%M8HRqj9fo{Q zB3O$&@~&_$n54v=qq0nLz8e^&C&Ey@!Xr5B%P!8zORN?xhMm at 6bbiP#I|{G-Z3j`c zxFWCetzTHS at GNld-XK}j$nCK_R$$276YarqGE~ES5v7C98vRk=_-TSQwCe^#n6SK3 z&3D5Hd!ZlkQ90CVVjgJ{#r$V{k+s at UeP5*=K~ns*BtcS_l at _xC@pOYioax%D(poYs zxmkL~SVUnljZ{V_Qx?v+39a!^5h-#5h$WSOoBH%2;@K6p>qVaF%2tGaBHEoK)RX;{ zhw`?v>6d^il^P5=Gj)fsX%<+Ysze?UGFF!^xw8rtgz5_WZ9sxzExqNDbw6dRl8>9{ z;V$ePqhs=^jhT|b<4oo#JjWnby zcEc$|1{YFOHO3&zG51t-=42?DTC=zKEm)aiD#-&_OR8j~!My=ScKI8rVG at u*#hV_m zLC5f_da6kIpLahe^I)itsS59+;+uuS4&n at pk0SEK5|JnxEgc+peB3Alp at f)CA^Uym zdLCL6g`qf_BypvkZAdX?Uc?*JBru;`NPO&c9Q&CGve__U9 at e*8MYiAeJhzO-G?RZ~ik& zj^bpz$oMqMy7EMZM%Cf*P+0%GNv+GYs05Sd(fl_yW9gnVY^WRh9R%m3!bje2AankC|MzZ#dP9UTYyQm{DLsG3ms8&7 at jE z;W{KnB-2+I%Sc;y?Yc=-mtCcfpSOdX&R&T}3`2wP8 zy4ySD>?E3urD$NU49EMyPS{<2?3m1_B&+5l-)Ymlz3l05rx5NJ#~)D+PqtHqol<)& zXJ?`|xjK-)0%okdDf?Dex3cY$~{j#m1e?W!2HMZyw$UI;0NW9VAH_Y|!<^wZkEOjJx1oNV>6o4Fv;3I`xefJrix`*cN=|TkaQ|Mi*P at cr|&Ikm`jX51a?`VB&qJeocUW{U1} z^1~Zbmd at PS4Z$>)IE(JvFS9 at Xpd`XEC_(B3FDnmO`NKEzegO{3A<406+5v0)fnfhy zyuqpF%b at PdprTtPK+QMUril0oP~H9O3%iHkDG7Lmbdww#h9$`5Fb4h&AhNMuq09gJ z?Twq~!&47v$~_7&<(ip!2eC`HDpW=n7{b2Y) z|MR;X0WN=brLHJE(&jkYl6`=Zt_w>?RDJ=@#8z)Ij_d~ihxbCY3TxgVZ}9wpYm}*b zP~uwxZun8QwX-4!;BiN^&(!ykn%B-!pqiZa3F#Ce7C75j)-8f)=6F(aFVk(AyahO#4=ao# zm+l?k-#j-_!JAiK>A8e*+}!L~F7Ax8rybvRNNvbVVKII>2|}-$zN;qZQaN+7(}KQj zn8drYi$=&Mq+eu35vN7IxY at 7j18q_&cj0CfHK$;w131N}Y;e|4q~-?EALeeGYY86l zop>~qr#c>qpu745q7%B+=JoWzs7jZ?+GTNUjbZ==~vsC zI$6S_FFDTd(fRnL^AP~dOe>_qur9?dY7V6b4x=c8=pH9SeE$4nBv1y<&zJ+KkFUNQ zN%7G)FviSn%fpxz6%&p!@@%%`nI_x^+qJ|>1T2-H zR`Lv8N2YO{kMw}CnP&4*Fw1f$dH)$46o=KMnIHfFFwp<@ZI+0$jiHmd?Vk|r|DvAR zRz(s;{$fct64c`7uMJc>6lGooptLAt4uQhp`#~0J-rK|>{!^`Ob=H|!yHtsKAv|w~$h!@ZEkP5}Yfy?;tAm^$7HmpJGPU>!Wj| z5)UukR~Vd_!^g$V#L}}`9jS~5fmCAqFr>>6*RL)hvuDv at CYBv;{nBA}O)*{pg`(S_ z=mA7-C5Zw^f0zp(m0ou$CYl&r&pIMoMPi5SMK2b!YX2#Kx>sb*UKPjV<-n|b1b3l01Om>yk1iL2jpaCvG zHZ`=Ndy0Ar>KMyBiinai86U~M#eMQJbFInV#InmYVnS0Dsj_hf%KErnjKlV(%a#aF z`8S`~PtDBN at Hd0SIyZcBA)|O1MN1O)DRWUR()}c9Pr<%aw>^OSHHy}h_|x=Y*#zr4 z7Uu%QBKOL`>eCbS+cLWD`x9YCnMN(TIg;zPt|E;HdsU92;=ztiMa6uX0Fz}8-Iy>Q z>z0VQ$R^)OpZzJeLhCep4+^l`LceMyu0cjf)HNkJVO|5JhNrZWmfztNXj!ErhDySK z%ft~_#ezy3Js_PPn3j1tC3`=`CLJRSGpo{6X35Icz)^Iu9WPLBeY7;9 at 0ris$#eHu zuH;OaD3ed{+QRy&-Dr{{{R~m1tBEZ1=gGV}Pg*)KiM1?TB-1v>5!SbwbmT12z^^>* z6t%|gsTGzp$jxm(#KSEmL}TD7MH`3(K^L){6ovxC>;Fip&Y z7aw^;`pf at B(rmOjga))1e>@@YAHrk) ze at Zn~jrA at 6E8YCNut0HLW}Od#J03(zK%xZ|<7zoT2rVo?4(Sjyv`a{s4`Ld#J^*wW zZb-zhTR;HsF&B3xx-3PS%mS0I<*q*?H8YdlvE%-J`56~rsTO&dv;gU(Psne!z?U3& z9?S${Q}~dqTj(W?JUf(9f32 at Hy}gmq{57!dkY%Fne979J!Kx)n9VvNkLq4izF|uUU zK{rcGmLq8c+6WJNl>)!%5=T;?tODzm+H9dfbv8Aix6Tr>or0_IvsiC}S2;Q0(e;5N zZttU2*LP;W5nDI;3QzW=Z6*UEyMLM=?KAzt`JQ!mvPLRAQ6hH$CEp727FgLe0M|{+ zg0esN8!5Hi=QN}BK{RBLUU%n55%#<^R*SFcD0ZP}wwLvQ^5#;H72;=#WM7XLBD5M& z3VtI&!FI~;80g-tnx85feG9x$E*;^K$xjE9oNun^Nz{RkD+j7Eqbi2=A-4>7Pq!X- zP&InoA$U_dNb+C5yArj&;2wU9ec{Y%MhV5v+%BCm9Glz#sz21R&Ug6|iOvXki`i>O zzR~w2f}=;*S)0Ogo5DISLF|j2H$?InR2UEA{;PUJuwXL$&#D&S-}VLjznwPx=i|4I z{HtyTS?G9qt%S09i|@yWTc`~v=(G3>EVVgMW800{f0WH24P at 4%Z5iO)d+=rfJf%>Q z1)}S(Ht at ec(TJKG#n2&=oKL3KunnH;720$ns64tBMt;LqUT}EN2UJFKx1(jE%B&3c zi0B4^Ewe$gh|{PY`it;d zYGDA)@C8uk%|F5vW3E#nZj$|)G1YNvmGS<3I+_x|(@kCo9Uh8IuafU9cgPtD69eb8 zrc`inzz~T=aPo=9e+Ad|wbgrwwk31Gx4|3bO&mFtt|{6-)D0JmUht@)Kjzo|`0pEP z!6p at 6eY!LYGPI;kJmgLz283C9TrmxG`^4!($Y`L+<#6;{U;WKRnW%%^kyCQo+u=*T z5q-)qrH8cKlTxBPVa^#)Nu7!*TJ}skRn%B{%7?--pQW(qcr`j7W+x5j>et-RORV34b1u>}L1EIjF-?D*>&&|(hJ$lZ4azfIh#ftRC zWQ9LJdsA=BWfIdl=&dHo9!fHu7GyZiHb9d at ZMv1qv)jHmrGParupi!Z%2%(kJz&yV zuUM6tU<7DPRmEH_oH-}+8vt|9U5?Cj$`t~)lw!BgC=(xZ8U=8gYlPfWPmt;gem}X^ zlxGiCk9f`MK4HS-fBzV2M?Zo$T at E&>HA&`j~-Du)3Dv90dRF$KhM zY8}!;dx<3TTUQNxsA5d)OJhBkkoU at G%vH72lww z8S<Vp;p({byN=Sj%zf)YN5^;-z2l+8ejV6K8M}hBwkXa*eohghcB at Gc7xM)N zZUS>bCrE*Dcw)bicdTVdcr&x9C#=O7v>S=0peOy|M$z&_ at pas0lJSOu;Lbc{9*fr~ zF3}+&wo8QibBO||Tvo>+sPOrN#YF9(wgOT}1sMt-42IRLYQGGK7d#^+e(`O%3pxJU zg{G1>`(gu1xZ($iQhTRQ=#b;~QiP3dV at _ro@g*xEjW=R8t-fEm&ec=Ry0rF(w zNTm}L0o~K?G|-Zpxm3l$No1F%4lk at k9-9l24T>sRSem(}U21r8XjY zBg<{!|X`1d*ra`Rck{eT~XL1 zZ!wIwOg<)i=nv^Dk=i6KOG!T1(`jyS!O|aC)9G&fS8)101J-Et@;xmQlt^;r-+-v=EnL zZcLj^TCY9B_tcJ{!JJ;{m&y)#ibg++FZWL6X|XDk#xa_VgHg*J#gBza7Ox^G1IpZy zRt+u4-kOy6hIAWa+1W(iMTen+!G}b^p)s7^Ce|2+noNSb`c~*g at A~^+**XT(QfswM zHe)+Kerx%dXWwNooK2JQnR|Xto_EV=YsZ*Jd9V^NwG0 z$M9)H5niVq2$fOF=C)m_ETeoZ-8ngaf at Ry}WoGLZc%bHJ3(aRI9!qP%>iF89a7k<* zWUAlyH`j;;1xAEI7^Ye;@#rMq0T4_Ye1sY4Ub-VnhkG4*-BHB^u=@T zPCANhc at iFEc!0%qUJHB+!Yt=SxByogNm=4PiT1kEmv*cZ^j7oBcK8e315rwA{oax^ z9Ou%Y?K#N|_nkL_a64f0Uu;3ezQK&M3XR7KiDz37wK$KufsW`};$z1(s;ifJLTK9C1=DZKHzK#{quyZqv8R{u#HWL zi`;yB8iY6jp`4b-+lOH=dsn4c(jC?)PaMXQ%yN$HcmFml{KmWddmUY}zZPc~hp0-) zz{XTJ<+#=WhZ5DWV^yvez1c66A4>&g8>4;$oAu1SVcKxfpkSM3wctZyMsm+p1ZV_FxJTJU2Nr)C_~hRE+7d(-KMti}1Y7T?>E&@uZ@^9tFTDaWm> zgZCDfJpz^D>h$5X$a}SPo#Ax%3fV7EOp>%^V$_;ix>&VrwVua7P%Dj%z-#+=9y~yg zeL>-CkwqrKS}8%aK{Rz@@+EAmSQ3wIzv~QDM_+855Y8~CrpZ`qIYB7dw?C2!#=9!$}?S&I&ku*Zw;|D)=`ur zzsHT(OBKHVC2T5kW^4ZaCm*bb$h!!t!}5LI{JK{C$9 at JiDkc(_%3-h$W(irGUK+M0QH~q z+|6S~*xnry>=So&3??^sI;~1xLpTtdBKip_$@!aT5{ouxsB`PGXq8B#$rKN%LnY1M zQ(5APvKEFLTcj1H8{bilYm9`r1QmiaaHQ#-q9`Fr*O&QYB=fF;Cx+DC at e|LAO;%u) z1c!|R at +PnhmH|>^8Z3 at bOqD@C%94txgQ;2gQ>Eh{D~hAD_4 at uKm#y2N9pTOn8#FpV z7S(Y7K~T2|eBppUdY9vbZoCRsDs1$CV1kpWw>VYG=)g5nY946}{!A_HA`mIQ2+B;X z%(@Vv6ujC?RF1>ncsd%wG6rj1wLm-)%C?4T&yTHWJWdZSvZ28!X+mNvL^bZ>G(6Cc z=)@G;2)&zOeS9Z^R;Q<_|0yHDX2JG`kQ_b%eFu}CbQ%F5*jcXzHmSn^!b~hRE|vt1 zp3hd9-<6XTkhyqY?=fps1+qC+7Yf;4E|oGXDZ-{OmPS%k=6Vs(X at krR0*Vbytn$Fj zov~c0#de7-P0708=?bAD{h%5*0IM{5a{x|gwWoIROPuDZ%C87`VCZJE;PGVR5Mm?~& z$2_pOm$BVVWtaVii<-~6Q#ah}N$-PwtMt^}*ve)&1@(tlc8+5X-IX7FO;rW1wIL|)jxy4&*?2GI3wVXB0 zgH^oi4V2`Tr|0ZXOr_`jCnA0+!97Q;EZrTicSO-yRVR?=m=_J1jo>{%FHqWkXk0|# zgnZ*w2?)+{pfs}q&n|)L9GvFF>IP<+ zXdF&@)S0F}WnH*eyqK73@^v7lRJ24Lr$=?0u6d^ly+A}HQVrjY1JT~cu16lIuONvj zZ8RejD%NAYwr!h_>GWHzMMy1g{0vPk5aop-`FKturE`qS+jD8FGKIy+xn_eCY&vz1 z%b6^B+u93ZS}?k at I`qF1f4mE1NRnw+i$=a|IR0MdC)V$v_V!)%%5Adsp at Us_S{t%) z)NS%gk~)HxBE6|q^7i=hG!&}v;z6Dy*2Ai(*UHEFP+TG{#E>jLv*})rQtjo$`T?rwN91SR5~bNo9Rq1z zl1hNk|ADS#6Ox9NS0 at B(MngA55?tV7j$%^eCdLySf=h^R7hwdW8#FKkBu0#v55I$- z`pOuqwNpwEuEn0RIjEp_y-Q*(p{=jh4_n~#FMfFEE`YrE503l);F#_I1;^6H*0$yz z<~FAP`05`hUY9|VN7gPz)mU>t2?c^8GvK6#!PB7#7|;`=14YtIKUr_!E(I at UoSaAy z%KCu&)uSp!B!b&?8pzpwK98dhIyXRnhpA at p^kdZwfFzLW|Us+udjkC|0^%1Vj+j zcyv=GpCB_%o_;;$g5n+HV#?W+aj#RZs%Iq1YUPYi{V`qxsMLBqZmP(>YzF>#}z3s6PNlu*8z1IA z>KU-jnm?=DVvDUiSF)QquPy3j^30nv%Qh6dAOdyjB79qV4ib_NO92~Ak4fdJH$8RM z)7Q^s_F&`34XnQ4Cx--PW7{m-4$m%aoh}WQ> zN(la^crGPh9+vj(7JkA^o%;F!bZ!8`l_wujkQ{FZ7KLss0@(FpvFKN$Ttz!yIHYzD z#xnZ)xx=Rb2kpG?!7vu$SP%@9;39g!f^eu-twDM~CP&AT~Hs}kaHX&9+=eNP% zrS(>u_5QT+=l3OE#aC==5H`AAG1u7C7SmAMz;5xR_lSu8xHN7-C1 at Oi>?u6F6L{Ss z-fUhS*TIOhLIF}lz*!>92WzUslIvjC$Bf)>x3~fI#Z#i~X1u*Wmt^K3I+$mlRfUq9Vw{~C=4}X{L5Z8nL%)FjH7%OxU_dT` zzkS1l`1Xzezex)bcYBM!4O08Rq(`B$l at qcFiZ5%k%p7cGBM>4(rK)&9JQ^wsMPp&% z8kV5N91JJtKC1_8M8 at WnZrL^0>tKMlNXK5G;>WK at -#al5-Ye3mKpWWnv{eqX>FjZ* zY$wOh=euLQZ_;_$!cf&DH}0EgUhT(WwvK|`kN@*OxmFme}K-yZr-OEw|L8J&p;R1HbSK=RfPeDf6 at b^!i2{xM}+`| zXzyaQX`n|-?Vs&&J58 at 9pPweHrM%>we4-2#!Hi!Qp-z~+JvJ_U-}M4WfS2!bMb~r) zPMSxkkWw6;K at mB*Cb)x-1Ab8YddaY}_)NlZ)?g15AY*Q~4~4od671ZAt_B!1(uOzL zZ2YRzQu1#y*XT=Qa#==o&N>U3!{wvbkeI3+XRvx3s34dxrT`7W7xne=LI3#u)lGk|bs3eqW#!3Skj36ls~kwf zY%5-;PO8!9Q%r~kBe9u_CsJJ49$-Y(by%AwV%2XCD>|W>d;ywIv at _}>dG5!Ba+Z|} zx?T#oOg#AmcDT00P at -Rp+-c0`mlei9Yk(LS;B#RZwLjLQI8vMo*`niK6;nv$X8&F?CcMS?HI5}vbZ8;^1=@ce0zcH zq6zu-V2A^miK8o_(VR7blka`&p$GGEv-pUcqSnl{9 at v%#a74SfCEIgs(!%;Qn9YOF z8N$vHD!hXd8$%eC9-3*$(>tv at E2izKg{}eSg8r`Yav-e)Y9;46S1<5So*W`kZ_5G| z1?p_F?IT}5pC{muj+w$H<>={?5yK`k$d9*aMg7J{VluQ+e?`6rk+`uY%MCZ3ib_f6 zj53)+TgKa%G$G0j&&_UM-LwY!=Sili`W5c?@UXt2(C$M)SLw6Fs$J_6a4~1 at +W(w} zIHN^+&K&UT4W(OsR!i+!W{u>)~5Zwp|9mAD81l0jXQcsR})3h48i=st7%@xQyjMDtHi_z5 z%y#`jhXoe}qYMPf==UrMFp}4c-+A14ssNV?U&=6f$1sD at IFxvU-%*X*b;gth5ydYb zgb^h5I&J=}57iiG8C?S5o*NM&cnSDIxwJ`6p3zHRz%sshbKo_~K;NRo8?mu$Lw9})# z4<9|qH|{!jFR7tiT39FF9K5GG{V;ntTbBqH0)&t^uck88MI1>y852R?(!sq+h!Ane z55>5NlqBAYZq5S7=L at _ryt0=B)K_yuF;p|pM8uNa%8q_TpKpGwJ`7n~>Z(bAkMf?j z<2rrb&I?Cu-t6lW=t^G5bGYo)($eJybRtnxtGka}-y=QF2EXai_b=fP+#V4%8fWIq z>3e0vSb$|JuD<~$ z(8KFmM7J5Edg%H-Wz5agbIoZ=hbV1R$&BPymWr2H=UBK@>cTRZHSfPUjCVAyujDnL zIeg0ky=|->@s at poCVd&cPL2a$=;8QktG%+w%GB7py3*afOTmB93$Wmkzr03Tb%1YOijV22 at L!ajW9l}A9 z3n2qPW5`AsvKZ4KnUDp#B?SFcMvG8>n5ou-!g at cF*C z1ZqhPIPmym+)_~Q0st9UP*~wul0f4+CZ*Z;NjlEQmFf4^C z7St at c??!_WILtOGgd+f at aiX4^1NWiQwbO9kfLXQHAV8ww39mreEp!0eNzVE#GY_;K z`k58VXP>=wRFeLv=q?k#Z at ZedvBaE`&e%GE+KBtqXbyZIQP>>HUG4`t0WJ(WMpliV zB=^Y6R2^p`pFwDNgi at X}@o9MPHX=#JT02xx#}ro?E77B$!6jCX<0|MCg({G|jM(1t z^WZP)x3#Wtw*DsovBCfIWgY*fe*f at 3{iD9HlAG5@@!hJ-Ungh$E-Peu4>k>iK#x2iG!cG+%z!V9j`nO-i|k7s=8i%#V8qwp at i? zr(*&!D%)CNRn~Zf0jk9W3uduNuS``=l at zXNkUEJvp_pf$E}|nd(`1Yl)}g3?Y?hsL zy^SLQ#?X;9+Nqs{d8FGcGE-ZA0vFSb5Y{wIU_8l2DdZ;0v;bS2s8&hyqk2B-MA5Fx z#2s(+g1lW)P%Y9>u!&}poHXAC^n5f8RAgI~I%>EC6bYuVz;V5hAW=_}i8&*Ec3ZgL z(>bH#!VT*XKejP1cO_axdJBT>83n3)m>%EaM^Ze;@z%su3227k8*~2e6_|aRO$i+% zU9ZFXjlRlErCQWmJ~QA-4CiB|}iUllHt)-k_Vzq7bP{xu)5+ z_z|G-`F}z9AC;;Gf}9Beh3 at mNez@;g9w|pGAb!I51z(quo$!br6O!y=XLW$b9thQZ zcmD^wvL#0qexF4PqtP=rF21ZK5BIJZf~>020uv7&8!ST)=Bc^F(i zgQnFOH_`h5{zTZ;xnxS)5U(?BqqJf;p2+U(w)1<_zFY3@{`$Uy^=JaKZ-j}xl4!3c z3ZsQ|DKRpBGTan|iwXQJ+~{OgJ*%__>^X{j1qOc3`0BDc9Aj3XK`0DYj%`TJY7yofqQejTQ|uXL*JEkA<$sw zm%@QmZsfrwv*hA at C+LT^mq0e&VnjUT{@5h?a{Zv8Ynpsj5X0e!8apYJ=b*CAG$|m* z at mxwPW?{I at u*6hkb<1yng-z?Xp%xsC3sahTS`Zp9I(b6bCrW{{-IMg*AfSE%R#!m> zuhg=UWULjvT+++ixN_frNoSMiUae3w!}ZYqFr)FFTa9g`cY%BTsHhy}fzpp3n#s_l zgOhl at K;=|{px+pRvHyuqB`amBLzidOa&^(RfQu13Lt zQwW|br)!kKWZh(9W3mE)tuF zp0u!{IPXP~vJBCFBeiQaq?u)yaj8D3dtUyG!3N)qHYLh5E))mXJvow~-`_ll^U){P zBd-zJAF#cze~h3{XE31TWnT$ z^plNV!UjmGMOc?;g+J4?NBxNH{$eU at 7}C%yt<`8CCywXH2vz}Fn=DAAjdc5(VR~_o zK5E=o(I~YyW5B8KVqGiB&f=Bz+$<#*=IGirRv at fK#1%R1_~Z*w at yIMP^Ov6-$vxQ= zj*#V%!o0HOEVI9dVes@?gLYxlP$9xHmvS4{vXEe?5|?{`f9J%(I|EX2uitfVv3GCa z_m&fySns1Jw9;?2Xnnn`eQsgbJRNd)0roTqDeV3oV*5<)>6ac6$soKviWz7IqpZK2 zp5FfL5K_Qj%zwqV^A$;4Typ2jSiy0ummag(H6lrKqDfe6uk;0Zpd03eiB0v}|d zEy0UDuItA-ca`U`=eU;Bb6-H6Q3&fNlaPk8v%eAex)d=&o*9z!R+;#jXoA&BqZHn- z4!-`PV571>mjB=EeoA(x&i`ij(~-kcK;QvB0m at T+uh2uSq$xRljbkpt(3QRqHm4qW zGwIyS+{rCq z8hpTZj at fSd{Z=Cw=&ag5pW``z^eIk9HXwe-3A*_j)os9s at Pi+BZdas0X*EowAyiO> z6?^s{E^Knd at yr>~eh|Bw81xgQj(&lOp}$DAt@{m@{lhH@&*!lavHP?Mtd63fHa5V2 z5QWz$OdqfiPX93m5|o7S8`8?4 at W%v?Ld~&`HE%On_10|nc#SnhWa~v0WkkYQdhrRwa1VEAc!|Q;*eFKH~kG&7V zCZ+~1*8gX8w6c}cyeJ9}_K&>)0(K`lY|aWJAeLEsfw5?2 at r96>8G=KJqfVzo(Q zibKh1yLyfHz(rZ7 at cPd((pOcHG^^RJMfqu+X4O+$!>d%CU(d(e-;#IEo^i&JTOz!$ zruMq{El at FWjntQ}X;hsx at lNh9a{(%~I)mwe3Vw|P<_hSB=njAw5Ko^GEH;phzEXcO zzZSXq3Ys~#ob&IU((o%~@9Ef)%40P*=t81?<=xQkJyj}uZL19YV$6m-r3d#J%N3aM zo8~n8bH{2+6P+z5hq_Jj zn>wj%CD87^O`a|Lfv$ZVSWDT2UBTSF<;t=vHJx=L^(UV4iHxSCdU%g<*z`m(4qH$d zw}~#+S7=u^sZ{!^`VyZ# zG^vXBc_wrkQQc=cljx5$<59+$e-|A;HD_8N3aZ3)T z+#ym8ScKnG9D*xoyS^EQ^}~|i$I`ic3~@!0yOR=;GX}`wAnNwhV44sb_Z1itC?HW_ zY7Dz<5Ijy|SapqS{;s1o47SnwTJJRFmkbNVL$M^0pHg7gQS(xKLmEJVif2{QWQP=(NDovd}uE&G_12vr(8w`!`C!`yKUQV&ZO zY0NER(2N%$QjMvwJaXk>Sr3OYLG*4qU#c|q)Lb`FeS3)&qd)r>zgOGjR-v}f5vWDXb)>c(uA z#mT#aOwAif`t8ACwRUyFt1he(yPJO{!L+JYBg8We!1CPg=6=Q*l(9IryZ at qOQQY>A zNK+G8>AELg_$`eACWI?ww`VTM!8?JZD>!@6z}v`f66MJ;E25EblM#TlT&O)wByl?s zpixbJ1{ivq+djzLok9Y8;lPTI71ZqE?BDRSNVf-B at 8@z>74vspn0+`6G4rRNrk|l?`eydp zeJ^RQF!{`FH0w|=;Pj?%bbSUs7q~yE9R0JUTHJr`OZKowDfYvCa!$fkaeIE>b-9Ph<`WbizlGru*EH{kmBWsz zF1k+L!~8O_?y#_eXaCrGj9k(p;lL*7VwMP7$+bF|gxo-kCv>e66AEaj=#47*(Hlsn zYKUW&wlnm!cCGQ88weWKaV zZCecV*KU01N;AQTzuO7^tK9j=Xv4qej>VtcLE))pqQ9W0PL at FfMXd!j;Ad at w^+%wW z!Ln2&!Qzt%sfA1HBD_cp`r3&>6dy2W_I?z at yz;`$pcOVWi*Md=x at tY%Y<_?JxFGv! zQeY_0P`yuq#yr51%IR4{l72{@Eizk<+(neB%2HvWZWe0#cn7}z#?=l3oJJf1ZfoD9 zcIdkEn%O&If0^jUU9RXr2}7l^PM0RKP3IXc(H}oO8KB}Y(T$jtrW%bB$m-OR-Jb)7@)*k1BIu-ERprrb4?k?(1TC(}vy4gCOk>^Tnys7>;T=Hqri5AKX*lj>16nmw|3HDEI^QBepuh79v zALgYD$_8?{!A}Q9Zsx>+QDi$Rz-8ve>!ul at vmJf9F3ecLa@pFEUz!nZU*E8>grxI@ zH?t{fY$ZJc4mKnbcLI4T3KNJyUy7dN`~49#&Wb$8LUdT!6N*~wGrtA)24*W{#}ZtmMV{w~%f^hIhs at 4T@W z0V;I5%NcPW?>6NQKV#&=Osqg8o&mrfFq{g at fp&l+zo$txx(dwUWw`_a#T&=H6ujs6n$WJwo4?p) zSUGp>8UNG+4}XA=_rHnnf4qs>Im#H=%i8 at N75^UQDjH7MA_$+V at r`vIya>@UI7(=} zVJ<(;`G4wT2g1WdTMr6HhvHV%a>uc0T!iy{O8|eyF5Tmy^MFv<0UoC|U5Gv~d0lkf0zp;znvJKA8D;UauHCr!G zAHBe-(XX{}HEU#UR!mGKEXI!G2Bx82wg7B4HFZ>fX{*h28*5b!Q&;y%=R6TSlZQ at Y zChtyCiJPnunLuv8&k*+gHBxu%`qXa8ZYl4rZHk-A8*bX+A;fd(g z;yNnVrM&1IWn=@{EY`Ku8#68+8nf4{HlBMEhL6N z3TMi4D|eoqbSsl>b4+bHQs`eAuM>#80`3{DyWmpkG7MeAgh*?no?wyQQ9^BIvCid} zSx`j65~VLQzy^hNvrh`8xc#_a0Cl6387RO`RJZl8=$9M^;8})L?J{{+?LmVs%Vw~` z+U=DAFlTr~*VAKRcTX6I+hwv6>RuAzl%~>InjDw$8UMSKU++fE=Gm3dy zA4%y}hA%SBVs#wgWhTVUk$$KEk at pqUa?hLf23q at WcM_)Gc at 6JxLA#I09fai-q|RJ8 z^eJpel}^VeWVb7U-NyNOG|D8B$Z$tgljs)M3{R?N*<$E)KH}E}AG%s9jVJK5iFcdtN_wAESs9gS)R*;-M z3mOq_|2onsVT??H{i8+~Q=Oe}f7FNz at jvdd{vS2^$6dXCTJx$XzI331R^Umc z>@zZP7XB6 at 4o*#sYe1U4W7eu6Zw9~B*MJ^4&?uyJsV>V0**0QVq88?r}ak<;#*pfEj4_AN8O>|;Z257CETk$B_x zW1v8`GYrVb)u0RElm&fY3 at Iep69^>Ok9-5T_tGzj>Z+y7G>*oSH=eoZC}CsMq?`sHeXTb*^y&Cvi#A0 at r2 z%sH8mdBM0j3G5 at 5)WYslc7Ki}M}nbMR-g=Mm=s_3M_6suIHu(W86agy0Wi)U>) z{!Ty~NK{I5QNBVo5Cpn6bYdyjv7o?tu%sya0N3Jcza^oeR5Q7#cqASU*|=aR7nzr&AJlG5Z+X2m=azPIB*UVW8fTU% z!zX~^3D*9bL}-gnD~n%CC#L}t!ghW2R$X56z~NGVpMCA}rpRyvL=?=!7i!z2NJv5u z-&=X4Z z)D{BiI*p`V%T$*)7{d5Csd10E$l#qu4M`_i>QA18i+YAu-X`xaSeSD)_hP|;bemzU z;Ar2g zeMAJ~1`L76eZt at y@#~ z^2KE{M+MhIV(PiJ!*~UKN39Cf5ml_2L^jODC)yLU<_r}P^bX2^GsHz?!1jsQ#dUNH z>L=2nFB~5ww^b1Cv57GW6U}&y{?#SrF8dL$s}f=!**SPJ)wjn$!uK>C at D|WHwtHkY z-XeC_%;SXL?vyi=S?PwKvM|mZX*(DW@?N0(Di- at BRK*FKKAE8ULMXq~ zUP_vd)5Wuj-U2&i(4uRq?}>I8s(x})qclodkfc%f1(SL%u|A9C)3up7cVBDq?vI@%Arggkb z0u4Eec)Q6es8snV+OUg>-psnqR->3S|RUAAg50(rh};D z;%qOO*?T_D^rlYAQT}|~#DQ<-Tl?|*M)>Akkejx+ z(b%}&@f%5$h+3$+-$sW?a>Lbmyn~l(vZspCSx%#9-?He65U?|hKzCAfDa!~`PIItk z6q$^Xr=%Jjk#It)XT7l8(wSF at iAPp0?Z6T)d)I^EV%64fZ$DHwdI-B&Df0%NOFWrQ z+FT4X>A)^9HJwuFS!JoA5_oK`-aN69essMd-A~=_jAGU at 35n}g!*RA5^+kl9-IpWJ zjqu*mrp8!;$eF2an_8uN{9|*LVkh3z%H`7WtIhVy{fy&=2rd)k}o+O37br6E_LBKW#-y9Hm7!P-Jwym9&Y%<2R)0{ylY_tz zI1KWa9ycgm#3YJ6tVvsO<*>3mfAFq+xu+Udo5C(@V8>;vGOB$=1mNIu6z;+olUBi2 z3{`qh1%Uh}U!d(0KR!;e_;ii8o?@-rG!c%c+ at e@@bDJeHj_M-gRi1f9B?6%~FJmUV za6aR!Icu{HyhkPUGgWOB#*7oi^;i*K+0I4%mtoX=|VrlC57NSBV&$eWM=%^qiLaznPPfrE-~|a%vF*z z at VS_txinm1JR#3ebIvz}+8lF%J`2k?gu+KD%d1 at QjFVwCcA;cKKPF}44mCdl0%Fks zQIJ*A1@%x)q`YXvF)}YSjjO!|{5zURF~K3A2g6X$zULoxvxm^+zKHTT z)9+yeq;qM*;?xkn8n1TwRtd(Wj?57k1QO2qTA`9pg>N*Re$bfP0=-WKBdQ~sy%HUQ z6 at wl_LZACBCpYL7;1-i&heC-vbjnE at B^KXPN>GDRC^E(S^?$n+sQwUWY{5dsiQtmY zo(cCV!RMw7?48a6i{sz|IF%E)(3BXc(jHZUOQ#qaL_6+vRN~h)r7(SZiJy-r^BUf+LC_m z71;$Rnnb8{i{(5LS9cK}(PojyDy-C_d{GyEi!*s)ZFzM^O{ zv#hQ5{38V1pP*Rk;}+bBrw at TlDJ#wH;?j(cS4CLjX&*}E?KU~_ZuFcy3}>gkeToK9 z-+Bx8m8u2jma+7(7F`kon!hgWauk1n2W=5PPM??`BfwvBvX{^57CJYoTf41hvP)=l zZ^;GY>z!Tn%pO>D-^uDH at _f0 zOhkL)4qDA9jc at 8uXu}1&d+rXK;$po^>Y^SE5Qv#D at GODrjIKNrspNj*+hO%lc-jEq zy7}vFqdma0b;vJe8#HalmBgJ!Lp1l=(=KmLAwUe}5j~S|+!_UFdcVRm)yz;_F+pE3_3C=;hptlCGURPI0k(1eQ0RA7 zbG7g;RRr&!dD)a5*< zOA>@MZ5ZH!Navy-)j>Bbenoi%z~==+o_A^o zDj4Ivzi@|}oEa{yMix!IH!=i2(&Yv(mN)W>7afgHjCiOtkBH=j!K0n#2Uoz{rikS* z=Byn8l)Uid(!sw?{bJq{&SCu5Qj)RlQ(g8C3mHQFmn?7 zF2Ue*1MPQLXtr7_vaw4S%wJBou`tm^UmNqEV#ch%%0P3&hQri8v81nWV$~riSJq(% zW0UGD#cp!3yCDT`pR~8$YC5BB-aul*&O`5wA!IdD2WaWDr<~#`Hx0}%*{PA|`R5sg z6^d3;XR_$BO2pHyaej9SD8Axf*;kF??7x{A7VMwX36B)eX`tSn$mq~TFK~Pye+G_t z70y6jyOO6m+rI!lIH%jW`Z=KOM(eF2Ax^iw#fq;K%{WN&8EQq^%-VQ(n>@35YMo#{ z)g;qvGBJ^4-AKVCJWA1D3L}$6W3*Qf#uiqYkkzxq)5YNtvvx=Wu%Z(bkVT^RZ8m5X zl}U_j6R at tb4_OYP%G4OI)45Dz%)Aj?nRO>$NX9CnI3+{Bp{!Q>&5nKGABP9Tq*iPX9+R(MGD~}=MgEp%l;)0M?LTI+Vp|iUYKUlS zO$c5fTn^?pUs)?#o*hE}UK^&;zI$TW8>^BHlix!bAnacKp?*uYt-& zPh-?7F1Bhwi#g>Q7A9GaY^6N2nQ*p9q0&1r>wVg!!Vqw#_E0v%r&Fh+ap&CESQsnd zK?1*i2+LW>c%Fs*T5=HNpfElELPRY&QYh^;-|(cse|Jy#0e7)b7Q at h1BTEn5G8ZoRvOid>_N zEfcy%Hu&?U({;?qcm_aXp at Xmh60nOhPU)%Ih>5A!3|81O$qi z81)POUo|Q|mcG*a59-YQXAAECYLt-O|MVR=|MhT5O9 at 2`<~r35i{&lo_U_E7-B%AomN~JE+GlVX5RyxJoi_;TXP&N1IuyAst$w z^=t}L@$^&HRp#Xr{-+nPKAM%s{jMn;^9G|mR}6=8;h`4royUQFJ^1$MOEk{q<4$%a zI?M)Jjk$i9!1kdm2?i9^x_8PS4!~a0w9#7V=KyTEwC~>1-;N4+)rlwj|BYK%gYZ|f z-{x<9z#e0B?RuR8W7~HDkwwHWMk6XV%W%h-vWZ;Zi&!!0ptndx___?+4OuLgg1&;5 zaYRPSkrBw)*T{yfTTH+Q_P*ItIGz(C8qlZcs69i&!2=24si~dm&Re?c_9LRvWMo?{ zx)W3cBKHb=!Hn6qpx&)ceZQ=nhFAO1c|>7aB at LZ+x)KwIy(Uv at 0L}{f;s4e_A-KEk zqC@h^YDl=gVI`MhrB?Cyu_M&#(e6!F!eUahRl5*-CL6iGm3Sm}Zj(_JHTMyR zhY}r7pJN|}85>yD7Pc#xVtTfv%W-DDYs;uj?Zzr#rblu+(fH!l3RL-tQ3zfKk9oh( z9tEl);F$$=FKR*`N(8VEcD(6BTfpUJH504bOLikR4Ln3vD1%`vSZ zsUvwE`vRWU zt at w_U)+-9XdqzQE{YyD~1>NixW4>8xd*xUkft zOdA+K^+n&nS4!Wo5z at 6xIv%-)Sj?OHE2dF>NX5QQLE<_mEbv{`Girm5&H%;paTZ%_ z8a;Z}6W_G`IR!p9kyBn0GCVod7j}8kJMcd4u=qU0&K~Y1=3f(9%?G#_`VVwuK>n8r z{eSV)tJwT)gs3m6zqPtrC`CY2LtbGlI!jU05-UYz5Ro|uGsgC76Xbl2bG_8lVE)HK z_v}|sh-Y+gQ}%wX-dnz>r&*l_AtYJj0e!vK at sv-t$7N@|-`Cx-)HhJ?V!_^kaAfjw z^??+qWYH1F4-7y}#STEdl>!hRphc;ixUY_SmyWTt-$HZ51yu&cin3u6+Wt8eZDAj> zYh7s2d at HkVo6ap4L$f}%?2>X^?k^Q*P+-YSvw4R*Mb9^WW5G*KML%o~NlU%HYKpy&guO`rAPo(?kKd;@AQPVC<3f2D2OkP47X=<TE{>$*pO zG at k``xyS~;j7ZNUAJSBeV5Ckqt~4gwR#(ZlbXR1{a%c5mvvnPwri*MtUxB-gZ1|v& z`5QgB24iaThGyFQCVdynxyxm9R%>H_ieni-wlEA(s&*l+LiwsyUy`)KtcN7wl%C)Zf z9VtM`>TK+S$ZpjxZU+^>3+mF!{U>#Q+IJ)ijA02__#5$FHJD&F**t(0x%o4MS_w|O zQ{xWyQBg}r!<9{OJyYebl{YcK?zCvs{24>7bhq7wJ^k&R%Ag}hQu#g5i98~Tke%3B}N~HBD-tjDL48wA37_JD!h+bXFZFP%MrIJMw0P{ zJFABA3fn(Df>t=vLq4f5g<-hNFqG_&Y>j-u!yfWMj*ui z`pVe}X~*)0)9*(xbZr%i9eDDU0e-!JASVKM49qR_Jle={N+D0XLo^A6ig$Z!CAx@> z^K6!W$}fKS8E^|d`$U-N78(dfn zK`MAau>}VSxnNxvAD|mxh|Y3Gfd$$qLhq66uBwQ+dNH?`4PuwWhQ~jJS2r;lx?mwN z at CHJ?RHV!AQxjt(VFN$BJ}Z`Bbl(vo+`Jb9_e=WWmvo~7(l0DZF!DzJId#@%_{R#W zEkW|M8t0(!ToNi#ZXbY0_%#+WS|$mW at tu=5;jvX}oJ5#>XY~%x*b5mmG2%bZqWhb^ zG;DiV=l}V)^X)&*H2hzE`NvGdNExU;dW7I@^G3~xM+gyZY)`P-9YJmP01P2(38t9_ zys2RDYk9-)oh6Tn=|Hya^AC3*^4OtJBa)zl37>Lj4GkIf!6`c{kCdRrEsF6j z$D@*VY&|1t2&=&;`iUV+#3?{li+J_mm4^}nzc~EVsjFGx(;9N!cZv#U(M;M#Rb0X^ zv9a48%w4U00uXcqB-bE|)Vmppk(r&kRq%iP(Dqs~8bqLP-$MWM4UR&8enjmYZ48|M z at ug7-c2@K9C__2xt}^Q)*vH+R#kRDr7nu>Lo7f^4I%9xS{52OMFT&>2!bx$bA2!9? zBg>Sbp}&EjhwMnQGc17vq{XxE-f20Gvoklmzg`|-_(79!pjzTY;Knr^*-)#@TMBoY z;<+SMlPWA)%6IYllUF^?Wi|}5x*2ph7{L|cymNnxgPF#}1Z(^#9km}Ig9+OQ223z5 zKLOd at W)f;p;xiPK)zM+xMx%!gIWHjZ5?;MD)E$VYyoqt&qkQQ~hq}Q~O+oS&yq?wDqDp_2tnMa(`QqpRMpqghWGg zj;$;>;A_E*e{G2j13#=ZAxVu2Su#6a($$Ef((l}lk^p(T=b4vh=7<6f at ZJ`I>lfL(u~yTlMceK`AJ>1!#N1Fq)^b} zFXk at j0N%cmZ=N3vHwZ$jfPGq$#+odSFQ(CBQub}^ZQu21D!aYERcepY0%+M>jQ~}J z{&Y&g(*QfP+1R_6w{k>31#LJlY`>71Z`!aAnUM; zB)VLRa^8Sn3+K}&4(J+q%o^L+5eMh9R-YWVoIIuudD{Knp2%{5R-*Wp`@=Noj_B$3 zY9JOPc-SZV=e_f8Vi9w_6yWpmylQuTj4|mN$KCY_XNNH9QX5JPXprXI8A4|tE;>!T za@*vSSb(n}_gWSI#n4d7L zNIVP{0>Ygtj-7VN(Vse>Xsc-o)9Ix-MX||%6^*ePY5fRwjT$@zz{AIp83KrbgEFH? z)cWrSLas$cMJl^??Nz1gXfoF^g+z7m5}Qp!L2S(a?#Se!%{cY=A?3s5 zw=0fdiQgrDA>)n`^cQdG)M;JXbbKjr at 0VUyKQqX{RmHD8+e(7Pky5WELv#X!F-~H+ z@}=q<+^O=lNENaGNxRIgc@)_!5tfHcN8!n%35PO*se3S3E_9kt8IvC(FGU(lgZ>yx zjrC-awZWjlXS0^fU!U3qTWSs zq1J!X`7X&Gt|$3S>ic7t;a=()3=VQd)xnv(+JYERmLchCPfBjSmqK>gmwn_yQ$w=)9% z$2%gv#4{Wzh;?O2?f*yGI|f(UXj`M{j_qW{wr$(CZQFJ_wr$&H$9BiI)8W_eKB%+b zQ+MBe?^kQBAM5$|RE;_29FxGRBSd)&wS3iBQJ!KM++3^umY+ivsU(|yP=y`iO|c}K zf&rG4Kf at p)-)_k-NlCE#3XxRnNq6yUJv~nL2S*+`O0PUu(!gAy?TcB2N}bt2E2SLW zUz-w+KI>{bT&sC~Q?-U#Bx;IPCwA7OK at y@Ub&mJ%1pVbfBY}WL{J((#%7BU{d?IaA z#8>#2Or|RA*57(6GSnM>29lPdwqQpsb?IEXg^%*nR?nl_(nq03Rcmzy*Q>8zws|=b zLR9b;QV&y%U!Dhwa!VYhcNLVPLVfFZ1FIHaJic4t!19%%$F1FpG9D;WLJqeri%{-R zbgF9+jI~HIY~ejLiE&A}5PaEAv3xdh%izYNkNO;OkGx&Pt%}cyWCi!b1Wf!ut_kkmWW?zOJ zvPg=wb`Siqz~KUdsWF^b78Df_GH_XGA6C$cAF7$%y3?+(d_d+V0M{|z4(4bL%`vRW zC7vP|t3{iVRYlc#IuuuIlvWkHqa`vMgV=CPTAMQ9Co*WWSgN}FL9N&f7xpWFs-Y_| zRQ{Xd%3IOC5*19HbL`w3V|Vosf at vr`_5Op}WJ{#?<5tFFKUYfBL!=!?kS%`7)xbEH>j!LE2?qDQ9coHqZ&iwm>L!j*|8vvovM zG+U?jZaMDpv1g#b$=%!i%d0w+3!7)Wp-ky`9?#uZ};Xp^M<-Tu43^=(_ z7=0v07C#u71KRe8Q(E7KGQ;)U at dc6e+_NdBA6bl_KH67ss2}1n`s^(Uj6h%Dj;N}+ znCxmu7rnp8E+jQ1MHX_-K;r;R4!Waze?{S^Ay3j-xN2b&Qk6=AJiGY4Rj^UC;X5cT zVur)OI|(gPi9-b`xS!l5ReTAKS#jeZ-y5oRDeXYQ7Q(@lPY+s*6fH^>a9r+8tIws| z;NOg*k__F2TnYi#4EVI(0OKQ0o at 7zcseRx!#X6X1PSjmS$ZL)I#e?QQU)RjdOuH?r z6-i}?dinWAVN~RRb!d$W at 2x7@0ZaG;y&Om{zrYWb2PI3lOLpuRzHn+~oLq9e+}c?8 zdzb;yOx)-sDhbhNPYacONXnWk7OH+(jeiV_HJ!d#_<2|!QijWt(gl=VLXe$;Qio*r zu4eLSnMvFhykc{7q69oCr0CoOS(bw*?N%t$p`lYVimWhH})Y4t7`={Vg2dXov(llyt0>uhcM*_t&lq-qS z9u%&`uVDMaP3u<87tUGXEqw8X;|kxL1!v&ME!F(?uno5AXGdr6 zoWHkAXo`hdIQ|JTfk1(PnEu78OG77TM*|~g31<^W17|x&VkKt-=l?qPp==}fC*1U< zJzuU#a$^NS+%B=kM?vu3Af~2IAc2;mPN4RscWa(bsA16=y-tV^pEG~Ch-J+2vVb9H zsFImpSaABQ8sKH;_xbt?+()TflD`ulLqc7drdnTMgi<+BWdT^Acu_a5vKoWfoQ*?$ z5gttHE2Yd~Al6g)$ptG&wHH6Auk5o8*~;_llpP1G(G=XK5fy}HhT*gx=fyP94ZCsk zLYSbn(DERd8)_iy03BoA>+z%2LBXW7N6kR|GNrQlCtOel7x{{=8g*zgn-97yjzcXK zbM+zgM`QBk4$coYMJFG#+6`OIU0yrS2hn7c^J|Qj`(`2EA(_}WnuSQg6+2XDA2!Td zP}XNS_mjw12jt;n8?m8J3x20$?d>0|7!7IFtHAn=OE6ZUsT(Q(n)E^x;T=pW~yZ z0HmW3*}yOBEhpja=7#hng^&Mm(I$@rNq>To5^#EDsl?VW5`OF34h4y7KmZB z=0DJzvn24qX#7xyCt8MFz0GBrEvFM7<~)@g;)GIf^44x}fGixAl8I#BjEH`3H0Y0v(FDfk9?3TD9nNO=bn5VD znDY-J-$|nJMhRy5LJ!6*sSs?pX4O{;A(x^fPDHPAnzFBtjIfrJSC>ZN3hpV=w*l#; z)j=BgR-fRu{ldVC*iQ4`=7oc^?|xi(&$EUnvtMGRio$=ss*xvn6fJ8e at UM3Ok|!^qs_Baq$9i#Mw_M*Sqdlj1ajeD&K&87`{G_ zc7Kw#E(ER%V`A>ML=s01j0DRHV&{A0N9)z%} zespN^PheIukfw!xFK+ at d%uBcEwof?(v<%QTV$VN`y?}RJyBp9l8}W at yuX_0TKPo_VV``}+M{+xx9bUvC(rYUCEKCz2?F<@TW&u&iQ at k2lKUT{!Qk zRJ>(nxQgTpy6dPz9R(#xc~n=CS7j(LxdCNM{-P=%@}1Zmb<{w&-U<%PI&Y^WSUe~* zYmOT*CA#G3H4<=+>zpnS%d^6udE}1~vh43wGE9}_LF&e{#n(n4;JOM-OQ6whhMOU} z;tUtrrAl<0?T317 at I|6})r9Xc-z^~y>39auQTcl}N5)JS-JUr6 zb}*W$ROhSS*ik8Po&mg22<2V}5_;2X)j4XxTp{*xQ%F%|jBUltfz3>YXd-SyXTM0k zc^8f+%4UOb(ur(vJR%55(Mu?7gGbc??lM3IgMvLq3bk1$jM4j$Wt at QwZsf4uipvW-T&7N5+(14&`Z z2BuoJeZq5c_YfTI99k1HmCT~;5+?Mc=iFhr=2^t}fd10s=bj>qY)Oiz9c$~NbEyxV zD!I?sIZlCX`BEm|MKW|T*W!M$XSFm=y-u0(1PSCTR-G%4X}jzO9A$|nj_C)=&iHBP z-l66K*0YVRi|b?$|C|{4D})F-`D-RhNKYxWkVALNWtvW}g9Xkl$rIM9~6z(H6>4iTM^I<0ae_ zrk7lk8RF;|s3-0NdDlo7S0LUm1lu?CgaO6CJ5c?KEqt5gi`)B4`No^Un;1`la8Jxg z;}|jjmh$isy2=3cocZWC?^4dA{8GKn_2;ZC=9)i&`2{3ZpRcy zdLSZX1Q8M}3CfN;q=?&udpMFpHj(r!LTMT0Kh5^hs6dD6kJa%6Toc>snji4~nI-fz=LS_kfPhe;{^iv( z5nC4$si0q9N)wnkD5ry!)1p(suPAyI6u2CE;7G9=35uXu7v zj2 at q#qTRZ1%=;SBo2C2kKUP1PbMm}c`7F!fW#TIFK&IrFyx?YXy7tLwZ+v^^qx%A( z|4|KM*p}Fbe??js?S@mU{A z_Wc|ScH8nrcJLX-!S?OZW5S#nAdA`(jYDLH;mSfLww0Vu0GdL676*Ly$U;1*Ii)ny9 at p-mVnb}y at YLoo_$Uvoq|#LC>!b) z7DYO<_T>@DjV(GsBwo3n0y$Q|npw3!T#ZTM!{1oLr{iG5B-WVzWTItC2XexqUpfC` z(Me^rT$5WY)@5`$IT~z+MiCNoA7|s9aGSNI`;skM?HA;!O!BlV3D#tI^jq|$ja95c zm&;VgafT~Pt_39I_dr8p!!D98YmF{Tbtl`UTBi-IO`3a~WZ~@?c_PUb&`J9ebexC+ zqCLL1P!Scbtq$Ynrr`-)-uqyJi=>uyg(c#_RiW*tNlv;9*u=AD(>Bp;ug&a6n^C4< z+5sLqx2vOQQ~K6DtrT*4fgwxLLbNt~?s$z7|6`EXU<<}>$M#t%b2^XwtqDwD{ef_` z&JVYTIoXK?s7qO1Km7Ws9?>1wYmO3ibZpsWDQ=nwNGrWR9fNFPzCJwfNbvhA zF{)XK4edr2*UBQ3gxmqvu&n~!?BfOW1EPoX7w<+XYF_kSQIkqPp-4(xA5OV`k|E?e zPe|6mLZ+s3#c0!fffTil1tf~MBtr*^q=3j_Zq7S&y%``yP?tz_>)YN;o`|mq at w-+d zrb2|edAVT6c-9Du_wq=V>SXRhuV^Zy-WVN|j+iCr$9MHOTU8`d&Inv_LY-t{{GUxC z4M_1dWrE(q1w)%-R9Wuc5Iin-Kp)>;`6(r4z}cI(`y18<80Uu>k?M$#Pj+l6Q&d!1 z+*2ZxIs3e_<5sjNQS4O7WqB=Y<+TH%kh7I`L=Gd(UGESsJme1M^hJ<4B*z9Fc_TN{ z$b!Gv3o4`y4*fyz5>8TYARj3_BMo5D$BJ9a#2BCc7RqpqT`}eT`M3DzNBsXrQvVs? z`us=XL$ueNMHBi7h>-TL%18M>Dj&>n%_K5;7Cc$d at H_cK0CxWW!fGES4Xu-&;iZ2KPbEDXee~Cu9fqF%dhuY zk^T7{onzL!mk8t$#KE&0)|1b)7mYasmiVMP3`QY(0ZxGw1Hop&6we%LlWc~0&QIU| z`3;j=AaoD at MDvHh|MK?2Ki=>^3p+|Wb_?_=2(D61ncl!n|uUXod|@0GXAki@<~d{7SAwwfzHXybi+YG-(!+1o$wpO5W;V7r{@ z!={jO*vED)AZH}qbqAoq=#!q4kQ}%UBnXj0hrhuq)%(p#B-<6K!VH%v&o=??v>v|+ zIO6eV*VMA-9H zFiUb5V9BKVbT0Ai5nY99gW8hLRDQ)C5=MoifiRfbhZbAGz${f#_TuT0SIY)ve)Oy~ zMDt*f+s>!)H>~-w1vH+G)-AI%@4r+hWFmX;AWNaTAG>7d$QtQ67pWW@<5{j4Vl4L- z{Tvg&D36yWF88ZVV%?mdE7#kWPtg0mDMwaPU1)Sio_Mxs+wX at E>Se;-Hdx1W&bC~l zIeN4RU^P9YSEilm<>N-`$+u0{D0VQio3yUe9IS*t!9_X2TqP5u%N}**^Ptt}fJ)oo z1%8XS*)DER1J&EbojPOyiYklK=|f6^G)d$VwtUXg8}r#RH5Bu-(8=kzt at 8e_gD5#t-WT9^g-|YN0bpXn%*p9= zr|WhOx1-P3k9{(KG~MXDXjA`kpoQQwER!TJDRbIpxnVOz3xn6W_=%*`(YFa4L6gxZ z;{0E#qPQ^gHIp$SYD`RXEfKRg at f3bNgj83;had=+ZzE&YVo}_wlU=rCtUq3tpPHiq zCCkD(@e?QXi9E>=WcS1HTT1C|R)!8lq%aYUOdlb$FB{t?hF$Lw{L5VJsDxeb?DVq5 z4TX-w%Wxv3il at dcHqkBv6jrNC*7 at AALo66LFilV0_7U+!Tw_STWq(hf`9;@wAToK8 z&aob6deUu0TrSD?WA82jW5V7<&%W9bc(wI|xXXrLdro+5`cXZ>^M1_;4-D``+Ef<~ z6(02>)k1~3Q&vQ?0=#&&HL?q@^Xx=K`@SgOPnZ!HYdj{+)8cbWM*)Y_wc7`Ywd$09 z-T7IRNmCOi$@7JrBka7>>^l+tAVG{dDESi1P)@&QiFBEwyRfwg3QN=0U>PR3Mh5;i zD)BmNCD{501ycXNQNZ+HD43B$VF38xab3WipM4*wn5aNxzacVEk0 at mT2}+Br5+Azg z*K%vokmRIEKgE2H>TG8cjZ2su^V&?&#?cc|wG!Jb< z-}{#Ts*Q2T3OQAL75{>7NHa;#Yv0Z|XzbQ52GMfKkA$gXa`21%eBwR(#LBd!lNGgt z%<*sq-FOF1MF1$j$0~ZVwV51he6rEjveDiAQhp-Mz*J at vJtX?si9^2JzCqo4fiI!F zlNgN+X`qdrcNq_|vGS)J0 at Bw{i0mZp~)vcN}4mhmwtqEH;E<7 zvPL;)XfGl9Syc0_u}u~anMzu0ZcF`y z=Tbn}CP$j7eE*grchDMR5xi at ZSX6wf5tX4cUUe$sk^6}81M=UR&(3QW+y1Z6!2Dlm zkdZ?XK&cvqZxK0|wx^iT7Qza3YzoU;e`_+S{c0F z=1e4?l4U~U2-cZ;CCr*r5w(JAs2$<`MGDI;<$p+ls+X4pxV82#*C6x9HI)428h$k? zWe)pTz5R!4sQKd>GADBWat-gY&-^7<(P?_J5QBR+ at _q!-U%A&s^cpY1_~(h*tAyMi z^z^bO4TVs{bFLz^jHkw*(}43}rDgkya>d^qXlBM;JhSV$AvBg=u5qPz-FIYG at 6fOF zQE6-R|L_ed&TlPhV*VBb=UUjzLooR+Mg(T;qrvWi;#8e)O)2d2JkLit z#~d^5$J%dOe14y>dEupuAlA}z^6|H at tRmErt0@kUT;A^Zds>hd7>YZ}sJGd{9vG5! zzT|?5b@)UWRd^9)5 at Ta&u*)upu_E3x^g44ns?s0rx5jRn1Pa at J7HpoeTu%WDb)Kw2 ziY_{xjcW}ZI-L`BB`jU8`KKOJDLQ!;8&1$~sw=eE0v&75?8=0YK^Mx**#+S$A09Sp z3xFccEr?P>*V=+h+jE%n8B!=DKa=KH?ftFIpT;otGS~i!vgR>XE3cP6okr?!G_PV0 z<>!3#++!AW)oQBwChb#!zs}ihm2}d{)g|vSRjp>u*ttak%bm(DG<$x)F^D*M6a8L4?Jm>Ej(J|^rT6`eXKiR-Fj1O)Bia8| zZ!Umo`5R^@!Jy1UWe6FJzHFa4cXu|r$oY33~Bsr?SV5%v&rg02arFS6U8Q6wL?dc&*o&YU$U|`|rXAS@{ zbztD_6z~ckOesVhm3`|=U>~K$pPE-Ug;pm!oTJ~ZRd~Ae(I)7WOov<@DAht*9w(%T zH}zyC=B()>72?8L_4}I)+&wj+O8jHFd*DDo%>S0<%G&+iZ2wB#|FyHxiYwj-guxXF z-y$=PbO%0sK#jt|5>rqJm=pww5tzIB5XUQs8dTyciPz-?{RaGX0C=(~zYj)8 at 2!xt zn~G{6VlZuWe`{&W>$?5;V(E4J>z5CZJ>0XRxDjm#(hMuIzpTJc}vxh&gn`t4Mx;aVtv`02W(7aUm;JJ*U0@^ z- at RJ8jTU=!nk$b$S2Hg{FQshA at S`!?x>7AJ|5Ug%E3sBVyH^{vVgbDE^@bcqm}AP! zcXV6z%^EDXip+rrso!BmZM6p{>xSVjT34L)lqSo4X*Q#BG73P&9gDV;KUWwu=MoFkgEBX_NJ35yvEjxzPcOBnFJdpw2j zF44Owp^-5g>IP{ipv6Q%RWS==r|eM}ux; zv=^9zYueAh-CBjmdV?W5C>O%#bUczqniR8aGYLAJ3;`qLqV~}_vEVagd9+0g-XiC< z7E5^?qD~z*U{&((SoN{tUm-(Q4a2vvKg7(znBw#s0mjGlvMuqhFa&;Bn>Ji&N}W$7 zh26VlIZ90hrVw*e2s~OZ$Ps&555qU#HTU3&_vi}0zfyo)7=qigexD|c9iZK at 2B~_A zM7+V!Q~;hY^G_WU)QDH?+c=5k*@$xE=v&y(CHS>SJK=0!j)j=M9Yh2q8ui8R6_dXw zX5Omu$@ES1&IG&^1_^~5{6}(LqX)LxA&_0*lgsNgQjQ at LCIe2f-KeG2u~r zqOXH~Ly-c90GbcK%Mw2F{j-t7%lZ&nf&c+kL;kx)E?{f?cOzHbR{Lwf`L8*F7JrIj znqsj${d-{bI+1$$B*mzHev16Lg5qpqBlYQqs7@@o4KloUva>?Eo`-xMF at XncIiE+m zn_7iy>lSDUd3-Nd-_3TXYq#EZH&(yTkMnCF(z;^7VI0&gb at ReGvdb|;1=d{3v1X!B zlJ*vC8S3b0a`pH`FDO+NbMNyCnkvqsu zM%Pr!%*+do=S*_rILYDQ^l`=%<)MQ)73rvNFtQ;b>QtbDnZaM;$ z`=g=za5${|0*{MaULE%%y9X3DQ!m^MldND~m5UyL3$|%&Bam)e zWV5gyOiv$)Rb(h(6c|M>$jTF6Z)L7*m)l}Um6{kxdukjP9ytz;i7nAv0X5mIznY?5 z?VBwC&a;CDfeX_8 at cT#}XaZr0HRD&EbJ at j(?cinq`WN=2rVPHU9{$KK{UD z%mMAM^yoZG8p07O(LVkb&QM;vYx6L1lpl(lrB;`}i&$gj4l_OLmt_Wv5pCWUdJYu{ zV^qqe2b%~mVBdDfZLJ8^K!Y=Zw;*Fll3&KZNe+w*l^Hvbwn!U+(EJn*!`eg;E~JME3Ju`uDJ*oS0wHe?8(v{CeC@!R8VV>vs>Y}P#Mr_yroI0-3cI+SO|Ayym`y=Y=GnOY^3`@E_gct<)M#fy?Dj|zRp45ZY=S1tiUhkx*rDGFZ|nn;Gqeva`>bfn(AcL{B^JHY?HiBv zw|)cfPUp+x6>~dcStL2tA99=jB=p=N3P4+bM}XS!AHm)IzHd;5$#WgghaqbRu%!D{ z3*B78f@&$jj5k{;KerbO{{xCG+%0HQay6(|z^g8dDI!M4`7^La^TlqCI6lu5-As>l zR-RXQP#+mKh-FkK59OWyMg_t=yqL*LzZUbtWRSl2K*pZI`=B%%dukU=gZ%~(Ixq^1 zj3ai#_lx1zZA3KxXFg`h6Y1kgQCG6 zYjxJ&lq9tz|3O_H^5upSb19lICH^6zTFpe3pWrysQYG_0^8n-{o^)+OFDcDPeg#Kn%HSVo2glttoxv|B*mKetYbwll%$xFF7 z3$=lqaKiAsL;a*!vC1(x^B8y-&Td9Y# zP1tj0CQx8!U6qptK`IPp-$^qnQm5BzPD}|W2bSB<0a8CG;SHmf0k_qQO?4`y% zTK5yCdwdbs?`$3e6pub#a)AcJ8KN(dw=f0f_y6yoB0$lr#h at M5_Hv8xF0gHy8y-nhL{wwO8!tfyFbB9Q3gd?GK{18q=2^ zoJdoYHwN%2y0d5x00zg8?6oT~jxy}YEmE?ILXno4A-t>dstj-#nUpY1#VpF(sj^ssMEDAdm{myv)@%fle6oV!^@1VkXnvR_=BSf z=#qoaW2EKeQ(zUKzQXE3Gi^EAcQ3vu4~5B#uOBOb2Q3@=p)<(A?DAFL0Td+ zYLw~A&cR~$TRbc{g&qNazEfL>7#k{Z2`3OfBAzWhuo9k5%7yb5YoH7+x+=h{ieNR) z_FHEWY3S)-5wTxy-&*R^tktDJt;mLn&odW9!(8y@=g5ZPb~DC(BF^D71YXkymJopd>z-Gm_pRRKV%!gb)-ir9PM)d7+o{t9TS+3h^u$dz9Bdz z(9X_ at 0BiGvP^*y%wWpg8w+z#Sbju-jhRs*n+YscQbMQl#l%}np at mbK+p`lN+jw^b% z+bfO>8vO?Tk-nYJD`0nov6wmEmu6SwsBa zr1o}e8C2;~eJU?i;PFE at BoZyv$6UEBp!fMi9n$MX&D^cUfqJev=Gs+!5h)(I#0J0Mt=JAy3V%X0zA|-vdG4#l;L$kE z)g3;EtpimVy$b8_ic~Z4r09&{?oc8?0Tq?;scVRleIqsYN?rBaum+fG*zRJqO*?LD z7b6>10dRlVo*Y)nE-Jut;SwmFQOJ5kx9~&oL+^)qNO+ at sEt<&)PA^0~r14 z*qzsy%l2B_Ig0GQ2xs}Dz$r4Q_L1c*6d;T+9z>z(R1u=)l)7VV%Me3gM4eWIN^W1 z8V)j>7?A&ABB?)d6iaB1^AS*W2}|uBZQ=s`BjV4|G4Fv|En_R~NXXFpQP0o-OTHyI zb#?)`DNfS+>U}Yat2ucSX6+F+=K!s7CK$YAV3$XuNet1LIdDJw zav!tUhvMCmN`fku(5TZV0?XV=f9IZIziV2bdAz}go(o|RofFdZ1fTpg`F1R>+{xR^LuQ#Zu%qfgNX*vo>KKw~nCy3z1 at GV!|7mjr7c89VO~ zr%x^hjJzM%oLI0ko&(a;3uji^5cX=oo5D|Y!cJV_-B1RoV;hebK-z at CQutfnQz3Q_ z)_Ao;Rhd(WNj9l1A|u;^Hw46}*6nyRmLDKzMd36=KluFX4+ozi zj%uQK_lSnI1#bX~p_5&{yoTf1Rp=}OI-f2B&Xp6d_#5KXfVg8ITAaPLhj}5o^eOfa zWeKYRxgS?T{7>K7$D6`_3FvHza3`UWvc zg=8|^qYhn+TE>bN5IMh&Zc4k$O0DC1dKF6fRpgg<3BF#=gjO}p{@Tn}v2bjg0wlpn zKP7!N(f*uu{O9BJeC?Oh4MZRO8=J8$UI^ESBid-7k4!_-_9$+MhURmz&jvX6Fm6~K zEYY*45WbW#Z8;MII2WtUN?#RU#pU3&qi=59q at 9#Ttb at gBGhTq6Ixf4}ss`q~2Z{Zc zC$A#rVX}9gw-%?E?Hc!*W_(~17L~wHI9GttjP8k8<;D%!hT&|{3B97D%aRAN zz2WnZ(-0FC*sv(Qcp^EmMOR|`E88vDOH>v!a8?G>B04qYvUjYS^AJYjQJBL=@%wy| zOhK!PEB1AYj4|qQ{c-`L75;j`=_PoVQxHTQ#-c?n^`qw5Ojw_d>QikLx8L(|a9C|* z&LcIgWM at Fqa3ajaxVm$LaeX1crx25^i4CH`#U+tvbG~k|8<;xz_0zlK$$$ z;MruOH`{~umT=PyXLW!XmErF5kC*^3_x<#E_ETZ7YG&y-a at o*O=Jjeux-dsLwemLF z)9RX{q{(QjK>w{82>SYTA7rvb0s8$IULI26w88)N>&dH?Yls4|!UksNrC{EJEg(U+NEsU=(ipTMN3MlMo&Y^3@ zWH0Qbvq1~&5i4zcsF!j?Q}HeXw=$AP9AxarQd;6kKjr2gk;eJrJ*73!Jvnf9Vd?{l zUSPNO+zJ9ziEy$+{2m~VjV7VBGqbP~a!SzA+dZLy8IHmjOj{m6%I`?$vF1o%Qu4Wl{DDAH}q|M118M5c>%Tf?n!fI~n6y6R5E_K{g`J7}P+Cv0E3s#iq>aUO>@^P6S!_(y?+O zhNaLZw=(y7HT&6kR+DV>lsM2xR_J!eo-c}zoW27M&T$VYe-CpvOZtla?j3!PNCSDN z)z5Ko17~)?^!G`UW8~gtmOp|B_m3dr`}dMLPEHnPwtwAN5_Pn*`QNl6hpmF*d(|^_ z<*JEBt-qmcE=6_GB7Ixj!><5UY+LMKEb>PkT`_8anVH#}qEUPe@#X2g_LHJUla`Ra z_GhG}l`-7*0&=;yboAXIhh&~|xXh+`W;kXzj;9y=df&eFK}c#8F(iwS)tEB;u)_Q` zF0V967;rB6Q4 at -VY1%lpV~Ob`IbE50UF at L5Lro6e%DlN;SGMaDV7!)sh4np~iONw1 zv&ETmq=?4HPZ_^aUj-Xuky~lU{Qj-}on6MU=Tu`}mzihVF?(Z};+uoc&P~zzOMr8r zh{ehzaX~J><)mYke%2?L7El-(C{p4T(j2EL^=MYLid2c4REo7_hv_Dx1M%DoHU)Bj z!y)v8>`PB%QisJ%^|aSff=bFa*oT7sG~JV5MY|``Yt@*jE7hwd{WeQ3(FqSSg$_e_ ztAprHmuol!K}%)^4=o1;V+yClhi4TZc|I*}ztG>G+2NaGVQV1;=Y}W zKa&k4o`+hK|5(egsSG|P#A$;LFylZ?UY~`F>qtSXfBX|JAXFULHIe%Hb4CY)j4X?R zOyiDe at Az7^yyak9jlRE_>sYmq2(E4~izd0d_E&qDIISzXT(6GcsXiIg6ttXFEsbvt zm(P)A*!cSFuOAD{<@+YjxU?N)WZ<>v0 at mveudifr$Zi8Qugu#j_l3NN at -pt`98k76 zc}L=6?%VQqajEWlNBz6kwJ)exCUhBjbP0w_Zopi;1K&7_X>T?0KP%gcj1Yvn*fOX{ zW_$JIFPdFd5ZRslpCFFIU|H%~ZPr{;s>+l-J=UoGIM2Z`2R%pTKh zaDoTjAZK58kji98##R5ItZoB zDAh>?pH6`?v+4U<@DqL0+QwH{_QL~Q72ixJBy0$knMM#-r zEKc_exbM9s15*K)_ofGyl!g?^bk+jgmUs6~K|sYGM`R*=TL$(N(T34vND82IM%+nu zyEZ?Cn$mZ^B4Z_Bf?-D0D=@MI&}x+kQ$PRKAmoxGg7(*4>zRK$MI&MRze-42O4uSO zpPuNhDJI`1LgV=5B?R|$#Yu&`OyU_ekQxyoz#2$z*E=_8g9c%yCpCx2zJlRD!?@EZ zLFrUfy&v_|i+kL?6ehqY?wqgbFB&p|yiTt;d|tiv{CuV#p1*uPX#6D>kxu%lAhAc9 zK_c5~c9(D)CLar+?=jJsH)n4$vU({pNnj at +PukE%Y1UGW?>(_wP5i_Lbztqx-4h9p zoLWh}L-X5JJ_*>)dMq$NM;nBP*>JdKW*d!{t*=&e`sp|4EI7G at d?n=CNLwWb9>-iO z*(dsHn6N3?TaKMJ=o~6(I}p7gJl30J{6YguxP;6kVRS%CCEGrnN@&o|tW0)k?;Au? z7PFKH=w;&`umPR#s0&6XH0x0{Wf`bfi3)V5jrW$Oe2lclPM0YW zy6~ns$WP{5ud|cxx{z~=S-zld&N-4$!F*rHpE#7DXN zSMSb?qD&}Lwq&Og#Rx_Cj10!!P|hF9I$a{Tpp3}1r3-#qhj5;{zPsixTf#GPzQ+~? z31SztktBsvS!M977Nd_we8nw2R(N~|FflZIX4+vwi#!b*=H0;j(}0lwE7&tKCg9 at u zWZEZ09pw4A at UAqFcotgb(I*_-Ig~#Y?G3d1Lha;&?V)}3f~fs^_MQUF34V@=&O&b14>{s($V00E z1>Ue-^pVReuaq|No%om~$V_vcr8^Ivr-U!vtX?7IVAR<_$zGAF zVrEFw_uHz1`A#8X(#s1y&>A-H?_%>@VxI7xG?NpoP5NJ(CF;N->sSa1XSq>p}%CpcbYqE!ZSp=` z_1VpzCSPM|HAykm%7LS zI=7tME&iw_QiS8zsVJ1xmiV3%>cqUYNTe5~>cUC9*{g%zbkE69kSur7!W(6e at +~Ux zhB1IjExV)sh}|lM-dxkox^RHUfV#cFRJENh5=Lj at C}Zj)lnOxG#3QenP9wWO at x(Kj z-l{Rfc2Qx+$+~uWX)Q^`H0*uAybrl at uv}r!v)r$`%BmtlNK?S(QV2AOwLOp=7()&t=6 zIP0}!KYd;bJ61re&SrO7WAh$FL&pYs4vTLL at s_cT?`8SO3TP$vL at 5E+p=Um)gZ?;7 zu86oH$j(+%3kG=Y4(ux)3$1k}nkyMr;W4T`EJ=-)!)DD;JPzxpbqbh8DiR-a+aaj7 zQ*KN4PcWg=vgc(NkK_7I*bTOG!=(r5J%@D88fCy&7IF(4}AnLL)PI4xlh zX|P=g$9R=;O4~|i`r=#1sp=BJnT6=GlKrf6^kLrVR4$?E!i4N#b)<(9n)@|w9i&CA z0gPGki|BAGW)E=koO!1^CK$tzeFtnMW++2}!FO#aA(4>XpL1u at gC+pXnt&^&MQx}? z*o6v6H6chmtFi*ot+-;n7+(J=V?_oWVdTLzA!0^y8Op%h)(ushPE%3PT9p-%$GL+2 z2}Uz^Klx+a#d@=K!F<+|nSi>}67bZ3qL=ll_L0(5Fo&aERd?I8C9_Or{Pbk^h z3`VqCx%o4mtb)f=eICi$Qo{3)19l7FdV-;BKR#ZW1Rr56KS4QByZBQBF98~ouL`f4soQ=T)RCfA}@$%R- zLlzXjX_gf#d%KhZB&QseXom1E>kXO*-qnHnVY4$xdYg- at b{}+t7m3UL`MD&{$S!!Y zIe0RJfGKZ7H&)P*GdGEC={`iKu2cq2DL{yaIpS1_0U0$XaxL%Xz#5M2ZdVlgs8p z$5gNR;-s4{Jz}5i>IEN9tk+7wq+ at oq_tu{+B&&I3v!Wrs#5w0wvh3<{J&pJy(H_&) zr${>u*@DFu^Z(gE;85Q7UDG#qnH%3VUK6Q*hc{UHR-I%tbtcK|Ck7~paj;F_grj&R zHm%yC3YTy*N*VGzAqbr#vCxKQY|?1gfd at gu9Xq0|bRCs at 1*#7{=%DoC{{D*xKD6hwdb;n^PyP})IuqFO`FvD=rqE at g8#&!(Gg)mmUhB`)wd*$ev8xl0osZgn zaoH_>9G1_}BH6 at YIiQiUg3<=bv(K?w%*K*4FbRjcTsqVR2d=uxv%Ft4#{1row&bl1 z0 at j4u79Q8LcwpW#wT-$Qr}pQSU`}zg6fnA`elI$>`Uddkr~Nw*NnY26(=+UWQyY9R zkDJ2?Pl9D8*&6|oqN1w*eNa|<=}=?PP}6{1szjqEcD~dzJ at z#71^|N#26qJj|N4z$_ zV|bT;9rJlZGP%bqy=t*%AK6 at wse4v&|jX+TI*}GG_R93!b$w`EjT-`t?LJpJN1sE{F&g zITksEAe0A7$Rb35kgp}=1;R!i8xo?_;lvvOYfWIO(5M*UHOh!^6W#&;Hj7;^Nj*kV zI?offW)x&+te$149v;7?;Q~iKcx3^wwSg`X74#=)4H}&+!gs`yiY#2Wpfx=hAwsI2 zEC29%X~zD at Os~?R05O3NhK=?Od8J}$KK0^UGEZB@)F!E0kNwVov6O<~oiq+n_1XAMME(NjloZXQBgZ`0_vt6}XW#_^eS z_@@!eF~eMEunFWL#}@H6D*rAgu;e at L+n9laGCVN8D~r^R7G^8c9;9eNq3$sF7-8w; zn(*#_YlT|!y9+G-CprZBk79rS<@Ee-vW5mtI5prtU}CF)Tp={w at E{7w#e$Y%Xx8Py z_B$W~>Fk4n5|*i1pDEwE*F)%EBE&>w#({4K4mAaSW>SX!_7&yPHTIRR33^-P&HB zxDx0;F?A`c($}1^F74CD#j$8Q&{i at C9765~OF{{9SDc)Ir8ZV{4#c+|8*23V$30eD z6Mkt6f?S!!@tkaQ$CRPYX^mTo`Ps*SfVbZqRmaVj>-#78esdy=vue2yC0n%N5xVf)(p9nF=NMKf|68vc^8_ z*DW%#!B83)FSRlHO~qi^eG0cPy1`+9!KvRa)Ls at b!C)(xuTGx_m~R>|T))0r3d^>Y z)T&vIkyC3aPGaH3ccRf4cC!EpMM{Y27 at XYp##=}!4WN*#^U^!VA*!&Wwpi7Ql$hT9w0=UI=#qU0(6B;;z6b0(-W^d~tSFDH&nalI+eQ*m zYfU9h|G!q4r#G9P-jbaYS-W^ zJ%iCgQd66be``uazb4>ZU==cbbqcNn^(K)QhP`0sBB{wf=qWG$W5^o7h3iw?B#*O7 z>CKxZ&jJ;aXrrbaRZv#bb^rH^g^BOE>Wh&TQ~q!~;!9QkdNZns?4+OK_s at A{@)GIb z347Qd{Ycr`I)U48XoA+tY8=*XIeo^aO5P5h!DBaDj+7(o9pwqaG{~!6h0aZc>3L`E zYtV2bJum7>7(hMB%su at 6F1!hUkag^rDqp3kYvdu0p1h at R!iVOUSKOBW_R71V4rFY#z(2%hIz1AK5801aMmndQl?CvX^O#^L6*bZz#_bgfCgpw(=YvI zpEW2dxlXIwdO)kWGET}$|2MAeK7M5GZZ at MX5&D%O)`3fY_4LTH-3)9 at 2WfL^eUS`1 zX^%2`icwXG+KS>rf<0Xhxdl=}FO|*9iJ9d+-Wi;Z%*|Z1)K1pqPY}kG at Ng?!#iXP$ zpOza&E>yJk5gg4V at y8~iYsN^(M1dQEcxx!#K__<+f&X>K61?~-9CU+bR~~d^ru7O1 z3?gJLEtjDw8r$*g?SLpjVLeu0!B3(iEU~@p1e_v!8dbU6G3I?eLXS8Pv$Hh+yb&() zSk|y(w+mI4DRR_Qo|cSs0}Eao-W9f7Rl-yH0L}dz9{P_J9~Zq;+vAUVEv%Twj5#bf z16ABaWi4J(XLCdnoQ-9`vC?2vbX6)dcElN`XZ+&%O}thEN9x8v2HR#ybIROG>RJ<~ z)vqxtuWa at +-qzL)wZ&q_b+{NpWza})A?cFocm1P`xms5T z-4s(GC?%r8E6*#_xa^ANbbj2;3VVSwq8r at 7QJ~uFN%1~t_Ez6d=k38!#L`~8S*5S0 zNILa&;qtnKL$CLqNCJH`zx>B^1P%fOMh at Zd%@B`kW?;b)UQrEnXLKTd?S!~ggFN|m1j}w79`HPfg@*nl?Pos74!6?iPEuGlo(8wR^#E9Y5{;q| zZ<9M99*imug(G0U&{HxVWVZ>@RI)!;o75f#ul+8Ek#mm%dXevR_%%EfGw;F)fqP*O zUf+U$3qahX{Y4wfyHES|H?o)M&ojthf+2xBg~*VG%DLPn`~X*CI){F7X(fJ)gwN7y zdK?}kd;(71HisX2fZTE2KgboW1AY|UgjQZkm4}|<-3+F;akBqK)C4qy<_Q5W_BL*q z((}+SSluNi?=r98yejTIJ|md|B8(dpm7+*=1v4 z;>18V$s`pwNdfn`@%l?mZQ0k#`Z4=jnkvI}J<$Mf$mcj3Jl23=PTpnFwxwC!YDhc; z=>)S%a{`v28KWpjgYRNp-T~R0*;_q~KL3E0jrvdUUz at 2Jci!N?!CWAs^J25wt|k=J zawo?pP`|Q8j=fZKn2u!|1 at Jp%`v|T|E%2YW1$%db*F-31pM)!31lO5RrKey^MnI1N z8Hz971yBT(vzgFjvHUm(l$}s9NvrZijIyyc$DAn$*+yX|HuDN?eLX?Bz^H&poZ{DS ztcH9aC9{R8tRPOjOi}#K-}$)w$G`K!Kt0`od2g{>_7M-%zyiv_zIYit2f=@`iQi5) z?l>|x2wV2zkbJ at U(zNe1ctbuMZJ9Hf?vOP9{;k$r4KMw}l| zNd?Z2yWhQT**e5_*kx|Xy1O_8Zo7%!JZ2Vrq!@0eU!U|7syk2ne3->+_RdQ!1=_?uvGvI<_!62N*AFv?2H$q01_hDDEH>a+mV^ zUMnHoVDxO@^e(Wzg at T4KvmVg0``|5oI#8eLU2_BcqS#pqcH3y$01+dQ-Uax-$tG?~ zT3X?)`XQK@)d>7AC_YyuFBhKJ(7s&yMqUn!t_z)!6y3)bikfnN_2QrOr4o`>zm{*j zyx at _$FzRRmy9Pq1to6oP*T-5hNus{yOu5dwWN at -)*I3rL at A{B4 at nqXJ`RCu7w!Uy@}@3 zk*^#Ou5p2I!6~VCIZhuBp)t<_@>fn23b(H}0cyS_B7g;XV6m^a0BRoPXje7F5&kU< zgGd+lFO at jdYG6Pfa$ya^k1t6G9S`V#H!UiIuOPR81OmcF{EreBDz45}_7*Pxk2bLi z?kT!IhMs!(FqSct<^Xbp$t1C8y-L!`kbK~tC<5?mVOzR>gJhJZ&W4&g4Q}TutKt=D zcPHl6kkoa{-??JB4`9h{_MDxC at mG1C>!!tX)6zWdoWFq`vz^+cj50YD7HfX5U8j7f zUb(N?Cf$#Dd0%*a`dui1pa>-S5adBqEW0;LEW*K2GhgE9U%4oVYP_XGB&fpb0E`h< z=K(u$0R0u5qjEMMx;W~Cu^QCiZ>l0n{#^UtWCy8+QEFO8+;r*|qA#*ojhr+Dr>4Hj z!gog7bJrp$zW02GC||+m>Pd5~)wmmy?TjT_CKsx?si{URMJJzE at Ig_W6c$O=%jtMT7(#-3 z3t)vzD(R%I)rf8M@^`PHY5nPg3cpYaLD0}GLv6JMR(4?d-crn1Zy$VY6! zXb+_cGMA^GgA2$z&f{7Ts*}o6UG|BVq#aZ#Rs7agiyze?607E at ZHpU=X47Mqep&0? zDT-uG4(>slss$DKGwKbs(q!mf^EbyO(TfDDt&2tCHe^cD2$n4y8pp}>3Ow1Or4t>Q z5%n!O>W|*+dM&gpWgFEz+ZSb?^K#&l5d% zzC{Mr9oSqls%k=&)lIfh9^%6EL^x2rv16d)iD>te>89Qn2BkTQ^-s1D8;$A+;CU#;b2y)_E5lqM{1f2c6CXrC;FTWOF_cR*_NF1)M;o2DXUVE#%>&A zO1*0fOb#25Ko3_yi1f(v2$oq>-t<&O_Xm9rH$m(k+W)@U2MldOH81If3EY3s5fNyj76L=N zKKc>oCLBjn7 at hco7n~g8Rm-ff92wLB>Y?Nw`&V zhi|#>Bk+aL4WnFt;Z`eNO)&6 at -I=2(@EbHlTVc}&pdZ*q1&nw$%e;qIFpK&DvY1OT z1Pk_pS77j~8nbfF<1gVH;YdG>t5vcFItm)z8S)R?RjjUiU1LfA4+|w~&ln8OBF!2~ zyDFW$(6ON_KXVONL?$`dxtXn<75Q;3defbl|76=?%}SpFC}a?{ zK at -WD&OnQ0-4=B#g!b{3TGQeZ@=;k=(2DxHz$T4B at B2-q(%YOrs2wVPzuA at +stu6N zdzUP>zOjHlQAyf5#HuIDF4_8R!pSRB$Ypg1;oXVB@$3uXgTN`_zE=;!0lfF$HRK1U zu^GPFiB}v1t_Qww7tfF?Zt=!@p(mA|U`pm&|C6PAN{Dw%(F_#Cd2*GlLC-0>WP^Df z-N|AS`&Jb^heAE!)<<2TQK8*}nKLz81=pU4Yqzu7E`6cz?6{QsIMK4ap$Z=p53}a* zz3f}_0g2vnM47X$X8RrDY6Hbc17n^=iF+IOH3z60JNCm{#z+smjtCgq1$i!43a1d7 z2#b&V5D^aPjX~Y_yW-6m68YX(_3`g0Ceh^3&4f+{rFswZ?{%2To9Eps*MQ!Ud82N- z7>k&%N|od845Wa3q<~_i0OAUPq!|NGg#fbY-ulZQ1k~GFWa9$rAz`&}kk}64?13f2`xES~@#;{Hw|9-%j=FIxd^4 zNPmwwl?tg_x#c#JWfoIM>Sg4VYwMwl3rdK{rIJ|FKtfTqoRTM$Iw zr;^i(WmSq zZ at bCSUD2!PPe$4!a0V9Wy8U=*C+K6Eib$hs*ikSW^{!Bpno5rF4r87wLLBsyo-#rp ztL^KXx{tANT(NsGn+Upm>DK_ zr-In8EAScv6SX=HFavElZJl(7&-8ijG z{zh^m%8Xq at 9aWSJ5G{b^ikoFu~5|_8p{tJ1A8zE5QT&Dnb z11!o#4aW=}t;Oh=NV})ZA_w1K3*~N$SCJ)C-BtXks=XI$;@H|?$uT6Bc9(orNRo@$ zB#ZP%;XaNj-z1*;0^c at vEA6I<(Ay!%p*lbjHVOJ`KABYKE3^lZ!3cEKGamUrUih^=+3}tBG<_L0dR>d z8udFLaL(Pvp;Nv#9x4GO4M~|;Ayl;-w?PD2U%tF&ug)vW53*oHd5dcVp3!SH zJds{FIWgdlNH(MhQ84g_YAXir*z0o6Kw#+am at M((Bu)wwz0g470Ia?FnToZ(7-=-6 zJEu{jRByvno@}XtsOudwhBF z%TqdIPSkPhPw<%0U=RC;qzX3g>w}#D>w&iAMjDg3r06rxkNC5qTd2P_BGIpOmN at 5B zB2}U`F4m9>8l*#aP~WXk$G-?l0+u=YOgwelR4y0FKt1T=-J(}^mI%BTD(r^%0TZjG zw at AIS^O<1UkTrs- at y?t!gfPMszP;21^t at zHPFCr~>G>y%Cq5+0-H*jGkv-wa?x81(K_>;J)N=Aq*u1z; zE1a2Nf=*SXBx zkE>e&6_3lA7ng^Rpd$v6Fvaoq(1R{PlAz#Ds!dy7sSOMZ-%Q3)?b2O|}P;jn=mFB)`>F z%hG-UWBesO+zM33*s*6OblAz7y7Kq!?gq6qniYdk!(^{SXu-2(IigQipC=P3-N9m9 z!*^l8Uh$Eh++2614CY~af~IPEu?uY#)je0p3FatVoX-$ zy7V%ikQj;f9jD61nGPdP);*Vm(0=Qx8mqLx#`|Km;#o5S5^2m8-nJe+)OjQybfU%% z-sEWPOVUHHQ~j#RksT_c{1ufQtOrqf+%golFFNjVmqY!(!Ltl|mo=KV}+oMn)!@vM*(*%`vQq_)}9oLaz`qa_YLBcp7 z-4NtTP(%4k-V8~EF|9F3eII$GG!gLMs4kyuAZgV<(ZfF<)Bmr<`M1;4zdfzqFl!3= zf?zp_v3P?i+mJAGf7OV{NugR+!p5BpfO=9oi8@~Mo}Bh)-M)7S097+8E5bk%aRFp< z9#^=@qgz*SEgW3%*W zGHRfHMZ52~bi0#_$A&x&uFSj%6E-A10vLaAGvvY723j|W!!Pq`I)ihk0$qu*KiZmp zApXzH_b81G{Got=DpCKVX8Zp)^Z&gYH9rmTmeGF@>a at r~iI5V1Guawj8wTnz&HLM0 zQlltN2@``67uO(k4mON4ikMqS853&P*j-OLSO zF6d?d-dW!^!gS|28Vt+ux#fE0?K#c%xw-oM>3oCuP5&h$gd6+mDBLf_OL~aP at 2e~X z&QEr at 2xH1iOAx2}c#jQERR2{Df*v>iRvo0xOHY}XbngXzc?ZtqC2advh~+2MpLUOq zZGfIcQFYJ8dpx*`?hCq$M%+V&m6v*NhrNqDXn~eJ&eF*OhzRzH z7}|kp+I2P<7c$K-&PjJT3d4Qh7M=IzSf}Zyb at o+(SO>)>fEt$vyWSh`Bo0Da4q95V z*$qgQJcEYrNjNWVT;;ZxE@!URlx-zr4U4mM(WX2fiiy{Z%BojfE4facTN7YhLM2E) zYp2skLCmo6reoQ+EM+OhmeLz&sc5Ufz7K1X5+PhE zbJgJ>>9C37NOClZCDqA;!Cz=DBFGS~k~m;eaY)fbIPUoZMV at D$I?0+DHM27dS?yt+r!% zK&FEiTWZAy)kRsbmP>t|AUr}o4m*&KYqcSU+&>lrk at j!w^kNrpQa(0nkA=kQ&`Zi} z2Axz0rDtR>UWAO&B;kyf(#=Qpcow7N#88C>I?zufDJ_N`Txd-&7mcjPQ(hd0GNFfQ zY0S at v5G-g}SS!e$6t`SmvuufG9d5Sb9oEO!tKBYP$znqy&;=u&FNZ578LK)D&9~M` z_D|G8O=N?P{@}Ps$^u`uISPsnX2haSv at C1OIvu+wh6#FA(RgdA!9l%U9aR at ee9DVH zX;Ii`EFH*rhK<%Pll1cW94Q9jF}Y6T<)r*+Z^p8&bz6Q>?q)|nHkEB$kJoaAaI at Hm z^bXV3mnyc}YHm*-a@|9pwKCpNUQ+C*wY7^p*Y~62FmbWbp%Q61K?` zJ%EJK=+QYuv8OC2^#OY8AQ2~DO-81%l6d;tHuj;-AS_g`HLR6wBE^*6 at 2VSo-UcD2 z8~hCpqdDS*UT2&O=_h}K1t3_ACg4fUCPK=kK(W8%VUihqD*xej1yhs#HN2$n))N6A zrbhdlemlkoD_HrMs*O!pv#<^-6_)x&6j9-2!B6N{@`;GKw at YeOAx88r79nE@qF#bUf z8zguFkr2Emp~iH(N#TnApb|=FweXiLsi_e*pzR?yG|9wAPhc2(gtiJsHaszwp3oP> z+9MG^Ei(Am$90FLXf1>fK;MGj(;#zA?K~rc8nrzXeRk&jS9g8zNa_iWDV~X1cW5j7 zR?gYPvyVsK7&V>0V4m53sBDyVqveEIE51?*anS$@BJ!0-r9t at -|QKzgw at EipshsrFM zsGb?=y~5F_Qr&_VHm>J|Vc+iDJmX!+PM1?{e*nr0?FnqW-Od5I`^yK)d&i>fmpiEt zAr}r(1vYt-cRHXJFJ{c%7BHQ~EcCP5OUO?Rc(4pAD_K(+t&(0 at eZ9fcU8DGpQEhMs zWz|pXe-PN{w|>X1=S+{r)1X^QuI_0(R6uKwTpSZLQ z%1tr*##1Yv7O61vgB}0;pHRjk|FgH{AB3$0_8$@U|3)zXDugIn8ri!#*eRQtn>m}= zoBVs=O+`-uM+l7%w2B6;Ut6XZt-b{w>Rf#jk|qQb)tAU$$cu1=DtbL<*sN9Rvo4d> z?jTqoU!d|FU$JmFo<1Xt>vbl_XO at rU^)+vj258eWsn4ZL(ioviO4x?nnS4d=2>YZ; zc|3o_QPDE{kzvcZ?Lu23$HfRT1#sQ2zWUe^`vH35D010B<6UUO zuoR`R5>*R!wBM~PqbZJZ#NgaDRBs6hb}DY}bPoG#NlRUh_*@bw0P#oZvTamtul+C) z9RMC+3da2j76536m5VZ>@TP%V at AU0`ao`Nd4zz7vu3VzD%612cs<@*g3gu&|#jNY%7pSiy3FzdKWlEbu57#m9c)PV{+6d44~+j8XB{NYIw>yAnCCJ zww~0nq>(oaJu%hHjqlP>5J=E~q`WMX4v zVMb?VZ|?BF)?QAI4-xnuc6E8FsAT<2+Z-7#jfC>u7CqU(LF3^wV4(5_?4PVjY8>gs z at W_91-?a at 4Hy@59R!+mpQ9EXwi#-W*jXEqL-DY8W`vJ+FBy6D<&OzlMXYZamN<5Rq zA at 3a8|8?DN`GNl&$t=C at k{ZXN&zUf=G43|uLtRZsEk>=0F; zg%%AVCXw~_lB;@`33ndjmR>hkmFm4vQ+LZ0gzBE)S7cFl>l9=Z-WWX*gt{;3b?Yvw zdDjVVrqROfl+A55+-#)ksh at w(&A|^=`%wD@wl&^q8It&)HQ!{s at 066sWLtN2;ivliX=L7+-0x zp64E~QTwSDc$IIKCfwWoS$E7H#Bl${8ZobmrApyP=#{BeQ8{;yrj`e7P at pWZ}Z;znNY|=l)X?w4W)aX at 0Io`xx^h;D(p6$Vk!Rt5V>nLd^`YGWLUw$U^9e zK`NQ7dcqH3Qurub?lV@$7`dfxqR2}py?RY|O|0KNRUXA69706fNRhD_rcwJS=n6CG ze+%&s`C{h7r}@De1+k#j82O^`Vn4DfTu>;`YQ7qz{)WS5TR%Q^tn?StDD?KbQG5?oTVF%C&g5YSlEX{APtr-ri51qM-J5 zVQ^Lml?KP&OP&&qygr03UbN~5Z1kQmSf7jPhfV3_1zXG6u4A6|bw^|Lr=l&xz(DWd zfVw{CFP#=s{I4)!9-Zqab*!cI3kX*EB#Jq`Xf85;G`(ZCxA8qeR0H zJ1{}LreB)CjX;J6{IYel4Ad8^Q$OqKWF>@9_(*VhNKr^HQkhg%&fl{B}o{2 zNrayIgX*TTt*aa=WaF(zs26wOrU{!4x z7d3*CP+2n)oxc~!y#+nskUSjIIo^a4I-M-g%;JY0W*>q^KU3z zSE6*ruecd-CE^*6T!DjJWKi`>H?N&M(-K=3`I4(a8^-nD!XJk~f$aX3yiF3zu3)KB zIvcy1>oOb}E=HR*{0H-sx%o7U1lh(Lkwzx3k+JlHWF7b~hq!kyp`EO7+p{Z1U&0lF zj@)S}!J6|*xEN+Bn14VNiEwpMLi$y&gS9?{SX!*T!jHuwnHdAtsU8!SQQ$AwiCkUo z at xr7+DI7V`w%hfnPG{tcfEVP{1hM~Z$h5B>YqulH#vBj zuH8xcuwLq(0ctDm2}9}nQb*(0mf at ay2q(B88phdxPI5=ZmB%#+tq3!wxNpZ05exm9 zeCwRCiMOTPPi>su!b}!CjjV0D8Z06cqPXuFC#~?uE0I`ZQX2N8z5>#TCgXrU3~fuR zXG>77wPlPF_?oW`p+9(I#Py9OCD>NWi&n{JuFY2m`#fH_{7DhD1&x*fbLe{@yCSYX z6P^^Fx%c#UAcu>6o!EH at JA-d65T*86|n;fZ7pN{sM8KvDQWK=l9DJ6!62*5b at uMIG#ntnB5D?EXEcqY3SayNvud zk5;Flp$8vwRK6OFqW*Xd03m4hMq z+qr{|bI1v*7|)LC>GuvMA0=NPyJD>{?%C9$b}Bk__N`41L+5RG4##a?z{zy<*Hb4V zKCok@=IL)xlK1j{e at KEMU`TPNxmYI1lRYE>f`d^b9)gyAWXRaPEZR>>0RopjC*J+O z);qgg|1b%Kje9*vx!i_BEB}DFUf(=IfxTG)*F9|BtT at 8`(ZxH|uVe`UllHvFLrnIs z#JIN<_}-Iuhthp6-toBIhbNDBu)Ejj2gK?-FM{s`2?oX?f%~Uf+6PRGzcd1WN8)-P z55;)&jh7i7j|knr76C;Fv?EXg`un3*U&jXQUFM^g)wl2?FQuRk`@8P8E_-%egK-+~ zn*ne420XF%8Mn;vw+Tid?nF?(|I9UvAuDQkc>DR`-{{YNtPlilxCeOtX&1n|LA0J` z#e)mWY^`FdS!c-?=TRLL$QMhaaDRU9*zE4^?y`|@(d&^^=_2Tgok!yj+ z9q^Wn)Nplwc5~3(ym@|lXK!itYJF;Uv%9iIM$!)iQQ$;lS&FZhf*)zlem%<*}>!bMkdBEd-*4b6?yCn+$;H4(d(If)wR_pdALvvE6Ak5Vy zrSGZZ at Oj07_>p%XsGr7~0 at HN_vejl@Uwpt8 at NMmwgtP2rPp=&VoFnOI#zO#~K7^<_u|z+Y~+V8X3+h7dXcus%bxLc^q at kiQ~Q zQx_*!Y*T^10M>rIM!=@d_=lWC<9h$m8WH?fPc+X82Ru2L+9}3hmom_hFLv`V%X`^v z^w8ed|N6d)c8-?74%?=4QZxPKPBSUDXkzCr2~R!*R>QfJZm`Nlg~W60_MCB}BeET_ z6~C;KHe>8jK)^%a0%bk_JF}%$lw1zeoR`byDfzrU=BWJ4G^fP7ngj1V_JSv327{$1 zGUhP#0XqgKB`_P43G(Is4%4#wF;|lovN=aPK0E%Ba4r})meek6K4(mEXpH>D@!`U> z>tiTk8jbW+ekcR&0p;i0dJg|O4lyxuMbDpZAT21i7AN`nS4+msbJcuPR1W4m8*}6v zH-(DhT8yKyY~n_!Q;J-ANUhE1`_bD_GZTbrDGhBJxrK*{tl`bkr3 at UBkmy>mk1mL2J+($Ee4#Pq8q2ByZ1Sh+Pjfq3rbT?R*k8447K&oVg%7U&$R%vIPN^Bm5ljTTlj9{-aq^nf4XWoF^ zDVV$}_e at W9V5-D3z9;I-ob%1jq=5VgF7ysYuOf=iji$t)3&Tpl79I)%!fS0Blr>Bh z$(d5x2BAUohR0vG$4#IYRVAl$m at PPVAWG~!a+ITWl8vb{M11lBky_0T=2(* z*JMgEtesuHRWXYCfYqrZsJl(Lp8#&Y`E9R?){v_;LeCRGjKPv3gI2Ff+Zur$sY#_y zwI+L zQkzm;7*p|@ckG*t%_y}EgrJE($j%<%;P%OsRM9wH+vKmjtVpRZi%xWS? zzN#pI_+WB>&BUUow&c}~&9P!0xF~lm%!xKPO{yqZ`pJOx3eue5rW3d7E)S5E)G9v# z{jjA5Wg>uKH9KZT?@W71A9v_Si(;rhK$LLzxZX?5ky?&G^RtnC at nA3HDCks5&}D8}yMq;MHHgNNu)D^1r+-|QH^K0j9XDx80?iY_x;00Bq!+R2xZ z&AO`5;l0My(LU#hCKmaP0*sm0G>7-wkwWP;Wh+`tD z+YqV(6HSUAsdcp7|Esf$`tzm+54-7rTvT0Hl&as{{sbHm_Nc{k)hmKCjI>VzJf4Ikb5GETj&e_)++z*Zql=}#{lwQG~q-2YKzJq$T zbuk-<&`ZB>s9 at ZK?7M6xgcQ>9iTObir)|d#$rvmZa8Rmr6y3kEqnODP*+qoLcElPz zU=ANWurpJHg4daI;?bX}lIh?F7Tf58<7<+BV$BIO%oYTKLX9Uf4~*7HAbL+J9r+JR zp_JPeG#FJ>*Us$_=PV@@90py0$;p*V7oV*%EYU9y!O6~OLw>vmuO61u3}ZkJ7716H zbtdZ(M&UU0O{|q%3xP!fJF?6=S{uMGuzE*cuq^Q?gLW31nYgIj{9_Kr;#tyRjYbhu z*x&-jf{R!%Av}7dju at Bk?Q34ulFPBh3D9~NJjQTZ^@-C0EIRH&^SB9$wS^rV at Ut3X z#bEVkti`2ZiNPWi#`Lrv{u#O^7G=}?%~&v9z^NSt^&W3`&T3bm^cA}B^B$hK&9#tf zo(b!H+A+fT`Ij_=xBV?ywT2YTaLh15M%z7;8FQW|Z&N=hlSPV71`}U=dcAnzo$>^4 zXv=kYwv3XV8J(w%iGoV~5ve<4pRHDeGegC^T%{;MLxGLQQU9;^$f zlSNyhQK$=y*g}5=P#?v9mNc&fPpfdTN`NAJ(1;ULyLnDH5#}k1QV5Dt zG&2*dS|P+^2rBFlZ#5?DA0gU-_5)U1)Tol_88Ch;mZP(zw(L2L0`$B>HrSZfeVE1E zh;lC^=}ed52`Qx{D1M1(+XBtN>j2_okq)f6a=uM<||&>)q?GTCegQG{oEMBC6*`3g_NZ+~JjB`M|k7^%5S zxj7c-%kvV8VxwmHpz}Q%x?G`lPj<0OS(U2L0I at 7>p0Qs&e^bl>b<9TO4`25YD!ggR zGSo at U#fjE&3fym{rUP5T%(QAgSW&b5;bia;*<6t&x}s^!uHG>RQ*dQn>CV!256RlT zO6t|Vm5w6V4POne^1JD-$1P^l4^M|XVA~|H#7tviCXH at wIbWp3)p8xo*kGy5N7 at rc zjk00e$_XJhWj_X`g*3&OEg9!OC&hnjz_Ola-BN0QVW_uo;Eiubos(!T8|ty at i!2_9 zcrPl8oN}sIX4qh0^1MG|Y*AaSWyzXMPFt%9yI0feCH>mui)^-%)j6?%>-1}zmbGH? zcKMsVxYvQ&zOoM(Rb&Zy07xh;_G at EGPv`EVb+JgX(ME;mEr#a}Q#R2GWtdS}(@rKq zw at 1fzt(r>{z3a>Gor^o|3!$C?H}$XA;L6_ z3JnDGiu at nzrw%Tz|FS-CaCZIQjUO61o at f@>{uDgpwg6~aSm+}`P5EmA5E~hAI7wNM ztSDs+Z#CXVvBwyp7U148$g3*euN}r5d!$oY}*}l8dgdkL@(|PXgk`&KSppGXv9o4hVrg!}6=RJjM*ag8gvwKbI;GmZwG42#=>Ml(rGSxpXzIv8eV6nxlA(zrZH zMZ!*PQ|1LNpmNawu#k)sh-Bbn79fcVZu@=(;S|!(nj5t zA#|md;t&m7%OH7yb_aWooU7chTz3p*7^k)91xy4jUo@X1wlZ(m zb>pd%oXFZ^9fg-?CF(96%1lb*14u=>E08xi(bzfu55B(osSU8}vUqTZ;8q~GdvFPq zQXGQ275C!q5>hBdiN_XJam zd{`W+fnB~EwjGvradk81QftBVB#V>Qm-(cfpQqVNpPN3w*$h}DX_vw>^s^k(0X0>8 zxlX5_BbyI+BSNad4&x>q#YS}LB$KebO_f5SOc8F-X?3|mjqGBR_ZdX{l)eImWu=;& zh26PA_OoqlaBuwRA=RCak7 at 0>lQ-qLE1mC2#Ooc=(!zq)UO6 at 8$ic at es?eAH*Xj)7 zi)_uTu<`ugFfW&waR2hDKHak)<{_IW51N_vrGpr-brwqmW zhIg~^23G*|j&z?Qm9=660#4cX?T5p(u#Q)&HU{r->yIL1i?}6WA1T}hiEssY4*Diu zn(KIx2I4`rY=j-7NI6eUg}X6RgsV(3=s>pXe|hUAYC-QPKT?<@Hl!9s)996UQ6yiGYWw#uxBaezN29$ z;Z>@US?6ETs4<+6$f?`3;4|i?yr2QO71ji&%pZU7*{yvKlg5SSPAU;4hq&(ZQ9r)< zM0K7mVIMb}_OejWTOJ^zgrmshK5)$p!5aS6U#@>?{4~oE0?`l#Hgw6({ramu9#@=x zJHlXQssvqQg$yg!j`aYYN_b7n+g>p+EuhLH(;T`aCC-8zDD~crNm!@Hys$BJ33NR& za7fhY4AUeJEwfQMl1t5{J4h%y7fen4e8dYj=RP^R!r_GSixH@)&FCZfJT at sb_3N(6 zn4P&l_WW8Pi<9?|c!YH~BejyxzJD*?uJ4pVEw&n1n(CBKhB+sEGxuLj+7< zWrYEK<3WDKB0?#TLhL&`-U~^PU%zdZE$_X)1}P>Hl_ z&-rA`vIym2DQp2fp6@@r$q$I*S0r^9tDUoYMQnl$_6nrz;jo at SDoT2ayBm9mw3Kfo9 zqO7WvV6KEO85#3^iN6Ii&%{+Iv*jlZi*G^Jp8~$hyXROAynyd_c_{;dfWWpqCQgmd z{$`SwtlR at v@D`S$?o)URb6|rlKb&SY7`<9j%{1uqhLgZgx6h6;5REm7#hQO2n<#3$ z>)P4lXSI&A^I4I9x;3Q^v)4o`l*;ibQ7xN*-E<5luA3YWx(I8FIrA^dtZl+E*8fN( zQw*861a{%4Cehw4-d!&18S7X)Cw`i-Sd2dctleEM&rDl85x8l`i>jZlaVgnf z0{zxdnVA~SJ716yq{&asy+nuwFFY~A=YyroFtdzT=(oSDgai}a|0U6^ z-f(A|H^Ot3&q(zGXN`hW<-CaUf1qZg{`W1?|H`W at t%m#GV7z$o8vFkxE%iTp+75n- z_VzvwzP=8=FAW at g9PB+c{ue9%L4WD#)FpW|ABk_$rt=>PCx;6J?>7u^`de>vNG$2;nmrz at PHm$F3@ zPvfx1!sCzUpTJmxDOeb^+%y|ckGx-{KNGy(ro#}aYxt7JoM3_h at qS$_RZmYnip#Lh z4NNzgwSz}LrMY at cG)ZZ?C1n4Ka}=@lHs?&HzDwoAYoxPLQS+uCXhLscnEBm4 at w6j@ zH8>*Ef4&h=FoNe`PLTh)$GLC+B($Yrq*U|lt-_~JHq@&1Kw9WUp>)&ES8cI0ONfC&jN1S#jJsh+ z%_D)G*K`B?dbOWeYFG9p%zHFIqTuG&q) zjMb-j!-|em-ts1_4cYC7R`uh2n at F6UeY4!q7xMI7-nm&+A$AO5_sFZc+L|=sr5DBL z_*RQCiIY#hx!1!sj*rJDDBol^Pb>oQ{?XpG#S~>gaRRTzPqejyb|BhS2D!*9br*y@ zw+Ie|ks~V?^)+F=j;7>oLSMH-$mP3*>v76B5E&Bn)InGxMdAirTx;L!$KEh}s%r+q ze*4Dow at vER)t;1RE{_y*eRwu=pG(W_pb!$+(ULcm+P84{eI55@?Q|&0XvDa=-0Tf& zQOj|cXmhn8b)nW at 7{-*Wmn_V>%BXtE>Qh+}J!&t`Aofy;-9-cBa{EdKGfvGcGC2%& zP1U!9=3&I7%=KICdyetB!or!-=#I#8(Imf9 at -fiVa?ne$Eo}|U9bfUB9M5zlCpgMt zu1d`Qy!Xp at yV%J_FRj|1MK7AUE!um$Wm at EaqHXe1BV(M#A2iWx7LHlSo$eDu`U9qX zRm6tVHBGo-QCZb<-0{)+&yr3B?I#=@kjM9RImCq&GhDKh6;7h?L0vrquAW$2qW|xuM{m(G4+3!Px>!>VvX^<`T>0LqFmtr zb?@l^!sma3(gZiuV7E!$>8wyp!UmY5U=%+mh=EH&K&vjOm@$>XjLV$Tok3vpGB-(t zJiFPHdbzb0ir<)=Sb_iTXB>#Osrl`wxJ?nUmW{O1v!AtJf4Nllv) zw<{BYH at n+$#7uO|rN91u&7VHG$QTde7cVF{-$ZBJwh at 3`*TDv*g4#2m`1!M at Fp0Hy zSc!lAS{!EQ=fC!%`55vgk~8Q9$HvyMFeu=HVoAzSZUzi4bQ-#(xva{VcukGt!1pr7 zerGMO0&oE23$%_ivw`e7%hAEM`Sg38(xDXwYzygYA+7#x80$excFS)QA>>WP|?&< z{Go1r_kqAvRpq&dQaYe-m0nd(@IaI6- zFiflMHfYHe{%Bqs5F#CB7j96Nvtab`Zu!H;UlfbHcJ7Kq#b#-qR at TVNWCVOU0%V&8)C_gDz{FYa at Biu~@@XhEn{W+h)m;rpR+bwhC8cf4(pu97k~8m$T{;X}f)Y!ff*Q_e+tp89#ZI(VCJWge1=YxAqaRvDVQR(O&op}Jjoc&cDs z{i|B++t5%;e9Y)~dqLb$XBJS53k$y*{Ifn2uYkr5;m%v-ny&XePWIap?%-q at fiL`~ z#5m_$3CLlKGnb^)fCLK<;RYhBYz(q`%lP6}Wu!|Pe$=U;0ZkEAFlhW=BbEL>f|x_& z=tPbc2+}yL5xz?jTgyXxNa8?w`8p(8Z7_HPaK(qST+B;!b{}dJA9Q at Fj>oZs=Cb0t z*TVjFKgxn~e?#=N369y3(} zQ;I)kYZi>CTL_!=BJ#_-Zau_uH_E`;$HF?CeRVCP%xx)Hqfz#BN1HAb%j$5anxHf9 zR{CB9J0e>yvS+6pR&~Or&j;P7nbCK`w5 at uP2uyla(NnbTS`hlJXW`?Tk>&89VCiJ-!=V{V{&~dU3*m&C7~^ zteepxU;Ho8Vu&xP38fXEup^Srh3`D%?ElDyE^dU}Cx)Jh+>M4Zl_Ei#(;H=fDOql5 zW4cDHFjl3oBMQ$lri5a;de-T=#uO_BSi9CYwnK-8iGhEa}I2*R_ at 6!azw*eg=syb(H3 zUAhDoi5 at rvV||{?P;OAOpd4)Jt#u`$2(=N1P}EEd3nbMFPY)q>cJ<(WhDYNR{4MX%zL=Tph!7COo9J|y6xbP|k*bY7YZ7l1t3fLLF?=A7vCN#% zK6JvC?+XCNOTScO)Q)U%?54BP_RD=2Z#B(>{e)L}zfxMhZliuK75=+8 at UR6t;-i(| z0b#KI(8H%5flK#9 at l8b-&ySdx#SaIkM}U)8YQfgnhay@`%(}S;R}x$*OiqVu40Pud~Mf&j1YW~415)}@gS!hhfm$`1Bk~lgpJB$VwoAG{xs!%46*b?S>SF89x3j=o6O5^Jp% zyH(^orjQi}Sk7UpWrk4Qn=<%RLiCx~K9t6&-K`?^=H zLXUQHP0If7H4Sq%@0 at qpCsF0)_L|?)l8Sv~1wpn14j`|&u?`ChwxeVEBPT6ff%z1U zchU{K_LqmvOPQ(ueH?*m`nG-VFEu_p7y`zV)&AmAJv8U6rtk2k%3o6%mgG$*voj6E z_u4oXI`r{-&9R1|j}TW;3HQ8=5on~ox7qNk;rrI at KBeB06Ao@YHqYYOl+04sGu+Ae zb;NO8 at S_bGUL1rNT;(>DN+!_Min8R<_a6Y!?1N at F9#{2lpw}PU>D(oXZv4Dad!uIW z3^cvBYD at -S#9VzCab$nE!4nDj^bI^bxF4ktlCiL9us0GEZDTEM*9_$S&To*HcdC9{ zKCQcR?BVe3{W{FcnrhZ7ovSWkPcP3eNUg$lS+y<6g;-7e0TWS#q>aF{!!$*uuv0>0 z7#fBK>$ka6zfKC9hWx=?V$^|rM=X?Z$ZLgMh#?74G!HdkHcf0hhVbZuMeRl@$qlf| zns)4;m7Z0 zG`OMrbao8qoV7LaZzdNxy)C#3H8qFbON`S~l05oP+(mOeD)E*f`;*}(k_w{-qj;w; zT%h at C3)B9RU8%_j!L5q$A2ghvO2^p-6RZwQ%p;G!eEc_Jai7YP at bbN>#5qd0iwL4} zws~gX%e%T{$2mx8l~mF2ru3*Ojl1BKt%^p at In_P5Z=hab_qiB+`9mf?KmDy30uAGE zZpHnx+I>uf--nf5eu>rR#OJ|8$5Q`q_&u}}Yn)9r7B_a#x&{0+*r;k+Xkhj{){#C%H at PfP75ST0zJrkFnbs#5NBA${n9{Pb z#<{N8Q~J^2ZN_1K#%j?)=tE at Q;l%8#h>|9hu_@$VvDQ#!%X9)Jo3Y9Sj!ih;6m>C< z^rAPBpH0hq7o=@$n)D%a7-`KU*DEWf3GBU9u_5|k%qv^{IYq0gYS>7g62^F29LN6l zcS`H|ny9{=d_yYk`~~e at _hgK726l)DQ;|PCGh+MlRh~WEOe1Kc#5DSO!Fil7rg91U9MOVUQ z`ujmoV;t2mjs at vP+RAm4fE>IOdX_Ho_JV1M{z7TEeDD!N(_RY`hbLTl^!2~-+R?uj z2C-}L at D+sEt~J<{^qK5 at A%o at F1wxJ z*e(xh9xw}3u(hW$DuhIToSC8jyg$|1Pd(|ns^VGl#8+Fs?kmzU!H0r$>S#Q2rObXMe`DW17ZUfX=J#WEcp}f={0b(I2l=1!Q!v{sZ%F+_ zyuyVE{w4pPzSvMK^a10^h8W}g!)lZmFco5n#jAfOa|2lYUEImi-}HF0Y>T z%d$wGQ(vp=HLJx^DEzx2tU~`|h(%k9pM`(zL1nUO2;76o)Qf;m^362TpA#fm4O3DL z2n|I$R18nVYlsg;5Rj;}=M}VLV>eQjwk3`PF=*{x3znuCOi<65{w`nqwW_jc8=JX> zBBaFWsJr&G9akeiv~6XQCH(Y`k0IfO- at 9Ba)Qi279Ii^7DRMQi3b9%0V!H2EKF`Lu zqX0J=*6s9NaqSP-*P9th at 1h6N5gCn4h4BJTO%Dd2A-N0oRibCNGT}4KPN6ub5?tcn z2-LNHmGp!Y;OvRa20h#0T z2*MbS_564l$fIC(z09oC_|rXhcl%)Cyi#PU*5$I5 at s=RC>xYR$9 at USJ?zP#l&WhF| zszy-lMYYM3A62*$G42E^vIqm?J4;M$S$!x5<~z0=Z*r~8e6FDug-D5+U!gL5`(b#e z%p`g7-I52b#*^ECbrpxYbUH)z0(9a#%;>7S4$ecal&sqiqnxI8X7<$$Nt~C*J!oO0 zHqx5X2`nOAmO+u1qn+w#U6v79$)iMiB~}74wU;ZJu#9Rq_u)5Lb+G^l at ncd;+4yYE?fc{=C z+lfgC{HkhIh`jR`;Q))T^14QfT{P@$?lUj#lP+{>X5M4v^{ivySjIxaa1H*EP;|W> z`^#;SDC>GZmWmMArW$<==^^F|X>K7HI*Wn*7p3`$OJ-le>qe z-{mSe=zdVC=F$6??86dkYh1dWO`H;XdJg~(d!Mnm>OD6R>rVrc{)v>yCcvVG63y%f z;=@SKrs6T<$>%w#4N20fzpp3lr;Sn=msagtg1$^tS2NwHJJ~ES3+^;csd6 z#9%L)RbATML$dR*bK^hR;(y)g ziaF at YR*a~Kd!{IE?_CI$eh8>#lek$xf28|SSMHFVtuxW0N z_4d(YWy^_;$pA`@j73x1>Lyn)qOP(bIcBaZi{Nlb)9F{Ul^f}ehu{1^FbeE>za2YL zN|6Y?(OF4kc6!8+yhfv3dM5CFQ6Zv@!syt&$avqQUiVbr;k1vnpNq~W>|?-$Y=V;6ZKO(ol6TMkVjBci at i?; zduBtN_G3fppyBDyUhkIIvF#p!3V?aljfb?#?+l6B<;TrKyvh>@4|}DNng^c()-pxj zm$717cgO6-@$p4%5L@%VF&FvjFxO|o$0 at 4Gci+S-pZ*FfpXycf^OIhI73@^Uh(Uvx z%f3d#%UCANn!?NxAA0UyeaWriqsnmPYBN$A#%qX}@+N=BnCBnXXes5o9&Zy{wGfSL zI_gkbArSXqQFg8LHpN+7)W~c+^^0$2!!I15 at w1$eT#-|NE6h4~YJoMIK>O_pUreic zu7inY7Ij>j$gV8&DKssKKNDts&1qgM%#F~N&mKq&`Uz`vtqbN0YC4V_yEgc~rhtZW za+c8l5P(1D+%j!)u;BW5K!19bi#g^*$tE7l)HR0 at kh_r5no8Cl^|02sHdn0Rc01l9 zs&5%;5MHJEX^SC-g3kb3*xYnY*QdH>+rpmJj<@A3G(&u(K`APgcqjvgf%xlqi_XwA zH1If_;;7H${)|K)T9u#+u1LaHXd*KyrapRVG(@g0gvW`BE1<$b9pOj7&+qb`(ScW5 ziAUjyM=Z3}vIO3;O6(vArz at xP*Lh-WS*3=?OzZLOM)i>B at fqv`^ivnps<0H(CMRpu z`sX*NLCaMg>K|R?i#wKK2hyj8tr{VG`d{z7C#?5;D?fy#s#ZAu at Swlxs1Ppt;K$fO z_+j$Phw%!l85xpphq}>q(EjH8f1G{%x|uJb0?|48a-T|#KZb;bu%?WTc4YFm1q(S! z+X)Y4D*jrq;inuq$g^XcMQM%9{AMk>5zpFM(3uKUIQMjJzVXP;8!x$y#GN|l&3};1 zZQ6g#9+@{)JB%AaJRH0aU%mkO3#HYmtbM|o$sg`{R)}caKsIdrOoogMgU`pL&r3tP z$))~rK6GylS8ODG4xQ-U<}dHB_(}!%fE{xbRMx7Mi)cGC5x{8G(Q}bi2nZA2J@$I% zJbLYtD?03wH2xVpeR{+d~*L*F_T;P0dz0kE2@~n)Pb?LO$K`{d9ig#Mm z`)F5hFAuJUYl}2gg9){!Cq9c@#~D;E=$2V(YoZ2dTrHz#F44K%-lF5z>dzK9btnYC zSSz2?il~f$&Z3}-zDWQ1<W|Mk> zuhyy_P55y>ws{5OX0*2b=e6hr1_oB1eLt^cX}^6Q4h?h+2nY-a2)GFhI$FQKC8QN~ z)(bd?=Z*>ozWzScU9`3lnDqWgwO989A;1xsYM7+Mc(tc1F;9 zq`v(pjw^y(r(rN;FGyG*BM6Svw72BA!pk)tZdcp$7xv5u%0!yk|K_+N$_*TDhwOz3 zGiBUoAR+d099Oux+QXr0jx4zo!=Z|Mn!;A_`#hwCeJA at BL+<(TUxhu0usr-e7b##L z&VEIgyFUC^aZg(~0)C&5l(&CozhdfTj_m=s1C&YPSqYS(=r)q*05%de)>I{6njp3f zZ?9x5L3AWDt2#h9I=YzE86X`UWz7l&h)2h4u)YJxDN)&I#8!}Gt3k1COk#IQvLR43 z8`ankBt~k^5Fktt&4#u2W$Z9OpTtNpC%KNh_bs5BttP6Dqt_JR%2pFo$KM+aIA(K; ztYhgFjZGu@%;uI_huixZkk8_lUWe724KQPIORFR7Z3e8cxWNQ5Y;a;3NCT7>X>6!t zEl2~D7a44bV`WKilosi1m}2Rb7)v5`R6s0#%vq$;q}%`zQb!g8(pHkU0RLEz*d+jA zEQb<)2~G*M4N$-?itGav~4Q_y3eTl8oNyTPpn;iJ7F8 z%-^FWDZLH*=SYkp<`~{u{Y at kbYUViJ7X8;G3y{?p-pc(hiF7P)Age%c at _sE+3FTFK zZ~T5f(iWvvT5r03chVN+RYq^@Euusj*0b23B3t~4ZLDYUKV`NU6GK?f;(khO$t6nl zgKg336QN2c3cPFqtVSeGtm8^GtN|?ZB*%$si4CN5iCX+ueq|D3RWQMYS3esGOa+X0;oNUW0#gMOUA*fjC(%{`<6hYJ>yv1! zf(bAD`b9`4RKWNbZvDO_6RKe1i_m_25&@NVz=dtUCW(M*JHdrdKMzT*N;}@g+kRJ) zTGe)J(O+zZEkGZIhLcEXE*ei at Q;m3I6KkN*2ae3Em;cIpec{zp-E at wGZ$9|t=&$6UW^gd;WEoQ|)`&J8uRfC at u9TPFC^XHXp3mwY-zYUrrEbRR9 at i)~Ev~-8>YmUj zJ55l|kP)D=jO*f5Zjlk7x=iR2ST37!qq2q6+0VcpmwD4m3d4h zFU~;qNa-uf9K03o$R?JNr_NW-SZ-M^rS1#gW4UHIO=)DBepbg}W=QlSneI_fU}i}6 z15R(MLzo$o{3xcU)CZXvQvB$rFVs1i3lsgwriaxlnG2KsXr~X=otO)g{HUgv)c2VS zQ~VgG at 71Z9EfW1mrw7zOGFv43(M<2E8#7xZ`B6^KsV^{Fr1&vRU#m+nuO<4CPmig$ zFs~*1(M_MK2QsfE`B6`=sb9gVnAc+b1g68(Z`oucQOwiI>cnia(J0WgojQz7HVXA} zT3=n8O*RI_JMF7J!PXIpVx87h7hvm%MsZKOs at Jl0M4>pQ&D1^FI$}`#(;@2TY+;co zmT8DO6I)m`ifh_Q9Um?Sc|bqZEU(SzRC~ZaG%G*P=!86=9YV^BGQ!m!unvvO*E7N) z4;Y8qnydnG?V^{$L!+z$3GLuZydfUe+Sqns zADPQ{JGevSa84F&wNKIQc$Wq{hHztLONJoA9WnTVk|kXb!;U|ELD`Zi2xEs3UdiGa z3uXwi+tJF9Q2k91C-I;+;D9DlD^X at djCluwV@4-7)Z~=u*l6%&j6u5w5C&j(+ z&M3TAp_A;Md#4&+tJq0(FTHaN_f+U4z314;hkGh^Qr?U2tiaC|I?3<(ciQ0lZ2vKU zb8orxm~jpXe{rw4laRrr7LIwZyEB-<1PMpK*Vw7dC{hc at zBk#~&nSX~qus0Se9W*? z3&*-Q+*!!5f`nt-YwfgTtgD6N+*|D2W~@V=U)(G2z%u03o-yzBcP28ZStHW_VqJb5 zvSNuy`%8G)GPKST0sD(_2^*4U`Iq_^|FU+di{)SXU!2RLp$L|LX at 7|?yN3Ri5Gc{4 zPR9#lI)Fw5v)Faw%OZu*9bS%rvZg?GI*8I#<>6ugh&4HuwG0H}PL3}v1A;h`<7~?$ zLHx-HTV?jT*(xS at 4lY>^I at ziwL=Hh&lsZN#Cb$j`SpiuWAaWg!($`A4slr$elv!1v z>e8C{AJQYVAlK5GxF6yp(xBtgnuH&6BiJCi($~sM00-$21Sr4QE%^t{$R5b7*e&S? z<;Xl}rPwXy2gAq>NJJ+_ zhj~O1gi}Tz?E at OI0VR~tNBO)Q(FH-u=wp0%N4!CUWd)HwtRosA&a#4NAMOzsP-R&` zln=*<3CO9eAjXG(BnY%$W*+IoGNKBiE;Enz;TmxOeJnGN@?jq_1R0l^$N2D#_=6V8 zRwI4bMzlZ at WvkIXJR|O)ma^3-AI=dAP+%DnViM^?JkkNWEm?(Kz8HxC5to2dF99QE zAXo`F{StE|6Qo at NPP-%+X#h=>fMJ*DBPk$(lJ?X~ypd{9ZAp9jCH6=@$g`w9?UHDu z4Rl`84!cAfNdPgGgr;8Nj#Pq*N_bW7>38w71av!(#-7jUj zgT?8p3<-IPlsc*gxQ1$mI)(;>h7d6wEd%^HHGdro1L8TzSSf!}E5*_Dm(gPWlvetq z%P%~|-xFKOjz+$me%aRLEPkU>7%NTVk9WlVMPJug)q>F9e^yLqLB#^!-+k6!XF=71 z*gtHRP)97;yNpCy_Ve#`k5%b(+jcb5At^;^QG z^yM^Zx~8aQ759>x;+xWO#ljS6;wEB$tJx==TZrt7YlYbu9bz?E%xj(5J{@9+Ec&(j zY?%&BO&0qaI=ig{gUF&?tITHVXsgL$T^r2K=x9S^F|J?FHt0;K$>Lm_&tBnUhB<{>IgtO(63+3R_oNNbzonc&K~R3LORf{)n at Z`Jk>g|u8n3_bUYy) z7}sxR+jP#=3Sq4;t{G=TbkCJLn6A-gaderK!hqMLvk+Y-t zthTPavPI&9)DiU;tJ3he2eBiGFYBe at 2@kSI#9!n~pJN|Hjs(7Rl|IKm$Q&_!i70)J zdyqJi|MIW&IYAuYE@(=(Oww55+&7u6K$nia3}}Qqmrbgbr76;-h!gR}a1%}aMI&UL2BOWP~{<;<7|%T_fbbLVQTn95c(qjHyO+?_H~Fe7zmZ~QQ|JcTIJ zQpisf$8{H8rf4*r{9O7ixtVtP$l0~{TT(OC^0M=B at wb#_#^ncRx?=Z4aYA>t#zSYi zGWY0au4PB({4)2bX7*(xXR|W*m}b7^0OysmF at +U0cSvL5WPsWVmb-D|+GGG^1;bst zv19T^Z3TxfAsfO|OgZ(+nZeni at l7M%^6N$uXTwJRMp{#bZ*=bBrWoIn=9P{Wk5%(y z#HrmGO_`QEogYh1VF53eqnvR{7*YcO%O%bUB at F2Sn9FcyNC`t)0Ksy-^I!=BEC78u z$(ggHFf{;gxyre+q%b`IdpXzHsiZJ1fN1%b^L|MoEC6je&Y8NzA~gVaxx)EliA8z< z*765u;}VOs0K(-a=Y>8zaVB at PWm)Ij z(zS#D`DF}e;!@ez8^L8ZXIQCh{Eg%?xwCeuY}}3LvWW9Uscgaxcp2YWptK|QMtGUW zxwf<;{ziJ4&e^lHBko3gS;qOiv?Jk0ZW+g!sWdG1MrfJSxu`TOzM16Iw^3lSQ{@rw z)V0xbvQzbu=rp8}X);{p5%<)o(P}bW^^x#2uu*>US>+M`)Uz>S@>%tfIE>`M8YPZm zIZ&QTC=rN~qh~;o9YCF>+L4^ugE`3e;2Vel!+}##3T`3~LG!Q+$4OYl?wW zvVKgmDV;AL^bR!31Y$aQAAAl*%W5M#Ssz{<@RYTb!5~GEa-?Bo5B4aogX&^!RV&Ic zG1T1Df`S!!7$2%>YC+M8I!qRIJtd*AP7+4 at pms1bC84&C8K#dKo0Nd8qlamtzD>5M ztz(Cop-v}TAVpD~7!TrkqP at -}V8YZg`EDpp_(!mlBZYbz$iIX*wn4^I at 8k&6vh;> zl05K<1f at JhtSnFe1VFJ(!Ib1_pMWU4DVVZ6;}a%|d`eqMp5}=Hr9Y*uEYI*nfD)OS zP?D#6qDT2oO(@GVJ)xuUrv#L`fKOy7%_#xpF8U`t6wg$xQWxzLEy{JOR=JDu2^&Q> z<*C#~^F)O*oAOldVt67#$xNLqb^(Hds1HYA3+$)!~TI)aYWKH<-@|kdT~U`GsDB}fqe15#Aot{iG!}< zf632u59bFF#s89?sUOx4{uTdAd1gW|r}hBdfy#pMwgi1pbUR6GAe*3?ZE7ztO$ghL z7a^HS5Fg26s}2;7k1nxw21>_A+1NsX;_)$?w(o#)YE*U_sTG3R2q?ClN$Rd(_8=6^ zPBry|pb^4(5C{`OvtvcPOdSU53mWz0B-e8z-U6%bYNF~n5T-y^yPBAKenc?v*v>7o zo&_PAnkM+!&Mmbb7x5XGZ{wC;kA=tvn%TIe)e|C`fh#s{Fd+;(oKyy(fZjzKJL*&m zp at 6pmXNd%H&8^#(Z)ciRq!p)Kh-032}qdA zp at v_EQ$}q^gfLGH0)_z}ZBG*FE=99#NWZ$ShLFu|5S-dhqu3WV6w$9an)gn)y# z^aAx#y00TOO&H6C<=D zm|#sbKp+1LbIsp!;i_ znE{kw7?OAIeU7FLf7&mCy&pNFHvF((=zGaIJT~7`m(ryeebM(+kQzCeLY3CvqopW) z4Uuz##)IYZYe+Qd zJ?ZAP3$Qg3bg~`qt+5TTnHN0HS<7hdjF33?8+6J7-%WdzUr+wreFkoP(Gg6BQ$)K_xIMI-d&sB6D zSW^$(t`ml$XD71T3`6mq@^8_^vbpid$xUNn$ z7Igsw%Y?3hHL`U#{mb~So;6{0KG2{VbR*L0*tsY}#8LlO>#_d4IKzRX-mf-u^{w at e zc4BpTP`(<*8p|3fsBitA&9%*GN)yxkGZe>~A<>^?z6Y9M&5-O5oZo~(tQnI0Ddwl3 zgVqcw{`B(~P)_T at M1QjRVQ8gwVX{B%{2|oIx-iL~YJLg2Z(W$;&p3Y%rM9+6^e3Gk zfPS>LNcN|h--Q}mTO|2Y&d)&?tSwUf8RoB{64q;p{^avx&=%{pWPiH(Q)r;|T9QBY z{2KJCp2~VH#$RAQ40>xP8+pw@b)AR@>|?W<^SaK#2ee~IO;KGq;sNW}xMsaBeDDF|Si7dH?iulbb8J=f zuMWqC7~#>!7%fW?0=ywx?5po#jFKe_p}28A5n8mXAGC3*!*U}v>&>pGbfYxuo3AHy zBVXxlu4izgUg^83Z&=i{6^QE)y%Amy(^4QkKb_fT^+`K!%T_msPw9!U< zitfO>F*q at -H}11!2q8QXt6%7~qzhp<@vmR#vt$avI3cXBwDF9UWeBl5(W;Xe_)QSv zd%{=O(*GMT#P!6zu4UjiQAo%M&7zF;d143o&G=%Q^?7m!-Obrzi1m3=2ldVG#YgM? zx~oO36V?FSHjK8^wIqw4Pf4=)ZOLnK7Jc9C0_`Rc9 at Y}|W{a|m9gDto`?eE(XMMk^ zL*!4M>WRDMNFJF_V(N)|_=8>Ep|j%zEt} zIm$=TlbQO7ZaMNt-jjyYfbNF%5>JKWdy*))gVbu^&xN_UnoU!_gj9Pd?UJA;Pg94Nn&8tOmm| z9<@$d>ednAIFA-5w{`1-&o3U8PhfTOh-b`4{ga70YTJnPC#;)~i&i!fX-|YVEsN_m z5wItW8`z?}&A-$q{F~avE}MVpPdGP4ixD>e(w>NKx)%R!67fgvcqVfYQsT-vrmmp&+2(LXzBzW9xNqZmI~D6J4JD_KY(n+FV&HJW%iQGw`pu_v7XLxhR8&6WTfb0#<8=6Y;%4iXC zC#pA;mH3tM`h$mv+_af)m#s#xV6R~By$$3*Zo*7LgTQ#W=VmwBYcoUp at 1sE@rgl&S;uQ10m zCABxfX;%c}4U!X^VAvJ|iHE`F&T?=<@+;wo*#a$0~ zecTOjH^iNWyAkem+>LQJ!QB*hGu+K_x4_*JcPrejaks(U7I!<`?Qv(|?tr@^?oPNn zxFy^U+%j$_ZUuKH?kwCYZWnG1w~pJ5 zI~%uw+r(|*_Tcv7&cU6FI}f)HcVFE7aQDYO0QW%LgK!VVJp}hq+{17W$2|h~NZg}v zkH$R)_gLKHaF5450ry1QlWoR0QW-N zi*PT-y#)7C+{6^LU&4JE_Z8e%abLrI9rq2~H*w#>eH-^3+;?%`!+jt31KbaBKf?VO_Y>St zaX-Udi2FJ27r0;Ieueur?l-vK;(mwwJ?;;2yZZ68{QDSp?JgamcSd12i^$0k$9u)@@6w;ta5cpKnth&K&yBfRN&8{=() zw<+Fcc$?#Gfwv{zR(MFNc at ME8rFJN_ZW3WxP(j3f at e-S$I{vF1#9E9j_a2HeLg-iPysG!Ry7FgEtp% z9$p{bzIglL?T>c=-hp at r;T?>32;QN1hv6NLcLd&%ct_zKjdu**v3SSf9glYc-idf8 z;hl_k3f`%Br{SHBcLv^>cxU0Ajdu>-xp?Q{osV|`-i3G<;a!Y(3Eri6m*HKGcLm;+ zcvs%S;oXdP3*N1Gx8dE6cL&~`cz5C5jW-`}0p2}$_u}1$ zcR$_(cn{(|g!eGsBY2PEJ%;x<-V=CF;ys1;G~P3K&*D9Y_dMPUcrW6;g!eMuD|oNs zy at vNX-Wzyt;=P6UHr_jU at 8Z3O_debScpu_@g!eJtCwQOYeTKIX?{mB_ at V>#QO>FXS`qVe#QF@?{~aE at czX63-52dfAIdr`wxE*{$Ttz{2};5 z at rU6rfj=A{{1Nyg at kim0#vg+}7JnRm24BDz at g;m2U%^-LHGCc4z&G(Nd>h}vckw-Z zA3uw~B>qzPOXDwtzbyW8_{-z3fWIRCO86_|x8sk;pMXCRe-i#={3-aW;7`S06 at NAS z)$!NBUlV^V{I&7d!Cx1DJ^c0YH^AQze;WQq_|x$>#@_^gQ~b^FH^<)se at pzW@VCa_ z27g=p?eMq9pMk#v{*L%N;qQ#U3;wS7yW#JSzX$%F_S;_%-}GemDMX{04p#zlGm}--|y7e=hz!{674B@%O{uAO8US1Mv^S zKN$ZI{6p~%!#^DV2>c`QkHSA1{}}vZ at sGnl9{&XV6Y)>NKN`1j%8kN*JvgZK~OKaBqf z{-gMh;XjW51pbrwPvJj}{|x at K_|M@#kN*Pxi})|$zl{G1{;T+};lGam2L7A)Z{fd< z{|^4U`0wGrkN*Mwhxi}ie~kYL{-^k#;V;Dh9RCaaFY&*^{~G at r{BQBU!~Y)t2mBxL zf5QJ6{}=pU at qfer9siHeF@NI!h5tAHKluOR|3`KZ*}-Jn$POVpl}axM$c`mDj%U4iV1WLF})GTC;rl^7G$?1yA|23$!KIKd98JW9>aFrdZX#v4<5wy zU8Zfh<3`gr8a!x;wJWtsYu&+vhAh9rPJ;&xomMZF!oe!F($+m)`BGztT)rA`#4YQE zTy>{hqY}0g=FnDWr5O%hsCP{$*X!kKX+i+I>a_{AQftBv)#A3fR;$#gHG{!fyHHKW z8aboh(JC~#&$UKpuFYIGcu-re5G*#(9v^{Hu_p%QdT$JZ3CEzTQjI|7f4eY{ z)f?qV)|M-VT|#TcuoWz0SfM^Xq_Lq=svLr5p)&%*a)p=?4O&Xa3LTj%HR{2-bA>{s zSgN(!E4AKIvsEcaOBx?b^?qr0qtqMFMWV4G$p^}XgfS*0g=$ZJphB at x??Dg#|GD%aEMtT)o}^0{iYUatjvlgjgr z`m9nar;y7faAYCZDA&`~7IHzfE$Sr}N{v<}nBu^pghFSot2+#+&PsRchk(~;_1hN< zmEKA<*SpvhM-1@#xM0a0rABFhivmuwr`pQ(uQKH3YWm0Uj);-&JD+$2Ni;FU(83mTKii8$2d%Em~Qy3xQ8^mD+&)7+ad% zQ|TVS7*m=XIHXqY50lc|ATpb2P>t&-6-$l9wy&dFDR=e z%v8&z^B9*jE6x5%S4+9(0E^XnIS^I~{U at m_SI+e<@@%FnaAK=e8!$$|YRoFNx~sW< z*2u0>v6AlHxUNbe*!}^o8QT?PbmtnmLTAr_IEq+{JHYG?&Q!41 zrAGVzJzOKZE7f|dzcFwpyMyG>Qy8E-u2Bl&aA5DzjZ$~MUQFYQpnK|)0G4u%C<(@W z>p@@+OgE#NxsFmR?K-wusD#=6X{V_i}Yz;VtK{MFKR64S!HXt|5sW)Z?ssqDqWXMZr z*p}-^(|kvI?R2D9LPvT at bfgziN7$pBD)wJADxqFS$M^_DJu7L4 zN@}7KDppf at H65^;&aRqXLe;cuHSJmryLN?tYH9yks#HsrYN^Fqs2Hq#SgANZqUGM0 z*2^&s=O5DUd`v5?h_>Zs2b)rwwCXD3bB*rc?jK#Lwdab(M$)9xy=nqSR2r3L%I;}Y z7QtEq+j7lxVa at PTZB`;?E4g}G$uwHY^g#B`+w%Ejun0urd}=f+!iODK4nHrN-W3pOI zR*%UV5oybJrY`PGUEG=avorN)XX>)futz1?yENNHAnI9(&v8D at dLbARY-HGLX0Tu3 zRX09FBlEdNaBKBMjp5~bPj7_U@?ELTuGD5%I(An&t*+F1m=p8$v`0PdQBQlsARmM9 zI7A at oT2GDD(I%&eoH4BydAKzY*S1e7}xP*1#4=}OjGNxKKfG6pm2jRf>GV^9q$ z%LsJk63aosm4HerN|mDxY9v=}0#Z&Zv0N|K6VOQ3-rb#oMk4BN7E+KnVRkbfi?Gs2 zw1Pq^2F+?>pxKC*I6Nvz&Q{`>-emg2ds9yjpHrEY80t#~ zY0Ed$ZEmJZZl=p=rn{WprXgs{x6&T1RNhMEt<**ho!D#6is`(BmSg^qLRcxZ6~d1Lg<>+R5VRG-gkK1gULnk5g)~bQ zlC)Jw6Ivn3aD_CnMT{U$BN|*Jg|xnl80A6`hfQ&At-U=LGurd> za&h-CABA8CVj(RDBM|AOC1W8i z86yzxdI&~*diZspo_JS;$At5pI(7Eksl`~f at ZOUbE;w(ItWuwtTdk7F?zm;)?H4bS z)r%8z)!6v3TxU%4Ghg=n9fYvGZT9= z6Fb#JUh7I|!k?YYuUSZFGM{G3Px>_z{Z=yXxhYNNJ1^1eOZc6$V%k+t`pt=GTcI9C zNuw1^FTJ%2>8%yXIx3BX6>V8PEpZCz1y)F}t3rB##UQm5?Q1W(wvd zpf6D#TkkG4a=|07m2?`F>+WuL*IRLGXm}BZzHB5R-$>4CBRQhcg;t4aIpK$gyAhYy zA#E%4r0(xY-QSaXuP1eEPr3~~$(0s at wnA_CXKpGB>+eFC^1_d`ZN;#LDb5Q2q=if| zEnA9d*-}hPn__x~L(o>NCv`+Ijg4X&8^yGcDW;)OOyi)K#z8UN{s=UK2SqX6{t&bk z(2GR7w)t1t4xFLvRw3L3kjX+1G7K2$q;ShoF zo{vCyEk_`nL at E6STuQ$ICm^5n3f35cA%RXfZYfnyzutymc%xF86|<_9d<>%DO6e?1 z(YTcu*4Bnz6k?u%-}%UtqiP zK}8%l^+IQ*(bFhbO0{NtG5%JmvUOGM4;L##vtkug06bP ziHxO{P6*n{Vf|35`#+t3-Xg1Ab6c|~btNMnbnGYd=P#0#yJpXsnu}$h+;vSV8y(6DmD#}s z9Eld*aAYbPn{=Bvbz&tE21VI|0ps;`Ow9GpO=NK~*Dp(oxmdQ~u!VP at HejB!CWbGc zew#s|*Dp&7y?&dCY-}oqSn^g6Ca6?CR0jFnuryBLk$tlC>cij!95TOCr_L>F%||1 zJtz?)X1-pH)kYM;A6gRAg-UB)ghmE;N05ti0~)j9M&O%jY?zLEqbGsoz_-m9cGg?r zS^_w#QY+_L!3`G=G_zjLHTz=8ta@!;Z>bs&OEotum-LQ*p@{~nmFC3E5slKUYAzlr zs5a-u;&`_r)Kje_s4tO at Xx00gLCqWCo>s0ewclGQmf}&{D#bWUMl^74M9VRaqACL6 zUPqFk%#0Xef{#F0eTAT{l3pYsXsdK3<^nn*%-t#Ot`<@pTTLs(N?JU|qTrIQBndpE zZIxPLu$D$+IC(?9|5WRB?7Xx!LJ-!>gf^)b^F6wy&huK*XpNV at 9N& z-V_mt{2pHaZ(RBIac|uG#+7d#5w)WScvm@}o040lW74X*RO!uQ1}F&wl^U^5TP6J_ zQ%NhhN?N8>(r+ at Aw3LfL_(}^wTP6J_Q%O&82u6n$Q}}~_J!%dMGGR!^=7OrI85DYr zAhcsaHKHSOwL-m?@@f$!S8uj*i(n~{){`EMQeR(cz7f$(u34y8EA8Du?Np0J<6_nT z&ahl}M1$PZswA9NL`UU%qaQs}y?9N-^SMT%myc(o#|vl=1l3Zjl?(sjpcbpBu_%=+ z66g_J)MbDV)JT*{1_<=U2Ux7nVj~Rflgw at L;ReoavC#(3?SHLmz}yyJRN{-+XCw20 z%X(6m<>TEPoiEj*e;7&GwN$qeq{oyQhs20{C9sehtt5)|YQ3C>L%!b6?8_x1k+1ia zYKehdwV8y>m|V40Z_gEj&`ZKFXb)&MdrHMtCHz;1*m7TDImiKpG$QlOI2iIl`CP0t z)2)vqY*ZoqfxAB-3UQxIAs7CKMNqsi@=qZiV at x5})m_g=_gu`+M^q~08u at zQ+DbV% z5|vy$sGM@!7iXuf_Ea9*NZE^VhZPbh2G?2mFBJ*1lrqDKrp$N`M at P)QTqB)g?3NM1 zTc?yBkuc at NcX+ygg=AX_^=2vPoG_aSvr+2mKhK3m%B;8Qwd5GjikTF8YNga-yoo~i zuLte*(9g|QBk^#^Tbwm|@n-nDZ#2VFEgd%rkdYmwMsV9F%#L_`0%p3Bj;=&6cr4ZW zV)>|!YCZlxnph=v!-$T0xtw~hBOY*EaQO#0r%(#q5KG2JoB at n+F>a6eu}aKY#2D65 zh*uR zN2+naQ7six&sIx|SjkMQg=G9nZ at rPGmc&oPtMy{yv1*bEsy&55YCpbxMg?!;@E?H^ zZdYQjD;H#>-jo>!N2V({nz`^?^@qr~h&7OtNgC~uB-zrKwTLsUD|Xw6uJE6|QeM1Z zF)Zfl?O`sc6w at 3gM9jr`Vt=zelE#Yt%tgFmy~!p8)n>Ebzg?wd3c*&TnKHtOIEmu$ zzkB+-q-yo_5N9IT9^}7V${H8326AGh(m<9Hv%-_Qn5rJzE44?G#q5SZmP9kE<$@Sl zZjS}AQp_5_8P=VwwYw4odA}pO;}{>_T}i{SJGlk|POIKO$0XwiZ=)at`m;=Tk}11` z7t11(eaX5Txip7#C$(22SMEv2X(Y>T1l3c2>P?m}HcCOh3rT{Yp!^|-}}$Iq0gz) zmBV>Xg{dyA&L|puvWUD|#A%#4nJLvFp7(||XG>h9)_*>at-d_P*6>=14&geHEhY-5%%f|E3G0fbC^{w8Jl*+J*T#ttODDrA{-3u zIeSZrXko+R1fyYgDh`FtjaOWk*fLgUJoGYR0^M?J`<~ z)36R>b$wOTM&G*TYh${~T(D>!J6oulJ7FBv_I+jQc4gL&UH6=sk-Ew{fML_>Kie+c z>1xbbWk>9QWp06d9u?ij{eRG?g;nT&8ES~v72^|-4 at 8$ZHkQD4vJ=U zP`86Jb~`9w%)$@2);QOD?Bl7Kf*RU46uAP8tb1tPY(Z$63=QSx(KI)5IdSX26SodL zar+Dtx6d$f3&In(y#Pi|+#0TCa3*Tv_MRthRd?c6e!-ZvpNU%@1|uhK^vF(q at kVe7!mkN3%K)*JiUiZw3CM zypB>Yae8TC=ZPz8^s!uaS>=o zot-kuXQsd_v&0oZP8P1N-7%7hTaDL at u5`C74 at OSh&f~=GGfvzVFc=U at T@vG%Ti?v8%0Md1lb7&mbpm+a+9j7%yQ z3Q9Y{YH2ceQO{k}bLVO9!p?2`g27Ur7U;C*TFqpdIfUP9Xig at sS0%19C9cD125Y8? z>x-JvwX2Ubv7$~~Uj(BQL|07h`P0;Or_}YG)b$kYg*5}{iaCQ1R;E3pC_#);YU(gdGckiZ7_&?dPNohtQg_%qbr7K$C~Yu0FAhag2Og;d z7%(y&i35toU|lCmT_;OjM@(IBOI>G8P1hV~#(*R^nYvDtx`XUsjMh%wfu+=)WKZ2m zb}$YjQk at y6!BeNxQ>W#@$kai5>JUA37 at s<5PaUFzX<-8r0ioMdtR<(ecY~2Bx^C)D zf28iLN9wjpQg`SBjBX~ot)eNbckKZ`kD39ucrx6N(!~)c2(Y at _nxC zn}tPGd7{(syOl6PT%6U!%X}?gcqy}xjmzG?hVaVAUU)*>x4+x+60UmsCs$tk6ct-C z`BF&pqb~do#YqpdbQmT)L29zGuFrZo*Qs!ElKS^He(B3Jto*E9jxa$PP$?4d5*nuZFXZGd|t0O%z|oUeyi35VKdE(FfS{=FLZOPY5Sw)^jb6w zvC!ewf_bq|yrIQS0nh02i0?0Ucm_I0XZMR=xH8bH*Y}G_Cr68Y1CzH=QZ6XR#9V53$dr7 z%JU@^eHvF0<4+Q%c@}vQZlLPCjpbU)Gw4&V%-n~4)a}JZ&ue?qKPisOWsPU0yUWroE!_z{(7-S3 z{RVCK*!FIqa=n*(qw+L%l~u at EXb}0h&c6D7t>#JJPvkHQlBlJ?(TS89`Zi z(1}=eqNtz*>_RdnO_hd^Pm|&*pAXEm(h#sbYJQZAg<92yRm+aPSL}M zUhfNfIev1#T_i=&T}A(g+}_vZ_9uGf%nwJsV;3(~c`=Ww${)F`(PwGo zx4|r{ibcfT#q+nJ#hxcPS6(`CmY3noGr;?C*~8D^7ha at 168*ff1qMCjB{M60 z#d$cwfFHo>ZsLVZYXVPnD?2l&MP5T~MZ?7udd~|Pmr=H4Z*4@$vQ~@|?)c(&(ecRdw1=bPqqrL{o797lXT_euJ_rjB-Qa4j zTBu8|#f3MzAmGW8XX&;FF&mXlc?R*2?a;^%6GH|2Hut(dHrJ%W_~a|AEh{LOyeu`r z)&NdFYn#}uk3HL<&Bls{FvQL(jd>!$Q%Wy$EZyP%jj?ukfLk8+%{4In>xHp5bhT(Q znE4Yeh<0P1(PqAhF(@L2-!jjhA={$+CY~c!w6UkbM-k7}n!a(`D2jOs%Plb*`8FQ=Th{dK=2`8eiRtta>zl=} zUvh`*&itM{ig*2BhTSZa_n8yV)tk%x(=xmTl{CFQN6!Kz{1XB(O4 zb929ua)uS;1AS43zaqmZwA?e=I$1B(S<3URD)!e4y1D!s+Q1GO~2t%Ap%IX)$OeUtj9%oneXxyLR=huTbM+i_8Uh#QQ{9-7Wk9LZR7S8w;w*8_%NtzLsAf&*El|xG at QfCGcT)Ji+~6O at N6%WDigBs0+Jt?o9|-miW$D<^lhy z+F6Ean#{cE>S}Cr!)ZffhgW8HdzvZP zyV7&&6SYZJb}sW`3zc zY`N&QOV94y!f}_%pWdyf{<_&lio1f!CAZ(7w%MIUWnTG(!>`MdrL63;h&FIC%xmrS zH22mH+E{?`%ouj2`OLSTSc2cJaVJ>vRq-6m&w9=iiyc1{u4iJ~+t1o8LdVILB}@H? zCCM_{Y^1ojY{^|lzWz7NzG>bWhMD8uw0P)OVw)MiO|tzHk~5qHM at L~D-}=q15dO5x z%<}f{Wt^t3R=o9KzumIjh#S+wzO~5gbqI4)V`DOC_fPD{x5cYjvBUF-jNgRQsbB9| zI9oQV+F3aFCuJEdsimEqEb)FCv zJ3ck5CBS%=7RG3(xY$563fquWchQqM;8* z#*OR5ybS}^1l~&JMt+=aQEzu{%Cn1szw9{0O=XO>o}D`lmsaK5I5^ov8L%@gr?}>@ z^uuKSrXPnXJTq-;s+V^Coez6x#)CkvuLSGAOucPBUmEh@^Kw2ib53u%G9BeSwvT&x z9kI^QZQ-G+zK+f_XQpvg>4n9S7m)RIR4s4g9iHlqr{&3nmU)H+yLY`-MyK`%5!}mY zr6mb2-K%AHo#t#U;fES-iR~w?ND{W5Z at tz4Y25cZQrqtK*OgS{{?6#0ZH$-`uJ%=BrDIOyS6`KUwGA-jBvy&#|}5x?SYAG9*|u z at lE6P!iTF3Y?b(%eI;&2WV6WYfbC^_oY*-J`#duIrMxYc?k*c3*x-yKZ$NR#Os^AQ z(QHYIRllN(1HpAsw6s^uygfuM8bp3bR;d*idB?+u^)jrE`vsbZSr(4G?F(WBjvs|A zYxsbjJOZ%0lr0MmD}0xwbENTXqVhTe$aiheHP%CQl538r_WpvTx9G| zuS-~Jy%6_&W`0+Mcqj5rVun|*dDqIRry@%nVelY;hi>1m4%TU1e?GO%l6`2}US85X zT|4u^t=73W%Y7=fjkQNl>#{SBiltTWjj|f&-dZpx&njY+C;kwxrdTjt-Z5g2v#J{U z%4DO&Z4Ca1i?x8F;m?-P=`k+*_O4WM}2i0XC~q6#4^jeQ915z%_}Ysc#lIZvu1h z{hDl(MYGTYGEVy^uNJJ&s?e+T+1%g!-hYr`4#e>ajVcM_C9SwIk0(pV2Hgj2$)J3$L()udqjne&b< z$6Zidq?Nj(zNtIvo4V7xsXOzVx}(0SyR;CDEjy0(X7$1FEVKpJBJBg*sZR1 zv~TIGG&DVKXfHH0&aAsbwapq2!XYMdDm=;b6>#bDGmPLuk&_4|6LyoVoMInfn<_{V4`8GD|pQmtW&(Z-!&JgAu0;Wgo-W-e0+)sA22}!1aF3v&#@*&ARwoS?tlG3VEey at 9x6GuA`!Nl*Im*iwN(Xt-1S}ihwwRk>{gUEc)nv44GB9t-XG^^vPKsz0rY67by{mku-gdBpPXD+G zylM_Jn$UY!CBwa|tZQ5EQVffJXPTo&o9h=d6AVWRQ*5P#wk+LZVf)S|PfW5bUzFHz z(-C!xy%SlsccKw#KGOnl(%G4rEUZUEwk=$Y zYlEn&9V^(lH}$;=cJG8~QA7fFXIz*#HU~x2FX9O%941npyH4tO*p)?tyfnkFJ>p_C zPF+Od!q(@0MMb)}8>PWWy at 3}Y+loPVB;ViFf at wM3-RXeob0?tlq+gh)#aN12?w`)nA z;nNYW7IUt1z>4-eiTY)lPja^UZGvSIR+Uw_8|8EyC6lnOSZG*G+9T_?!j6p{h?q}e zF$j~s(p5DJxqIxB-bUxA8hi3id6~%)rg&bpVgA!ym~K7C6%F&IhF8M at QZ!lFyQ*>M zdeY8LV(V!w9QNz(cZwa~2U#_ka_KJBIcMNJvoT!{7xvV+blV$uXJp%}%_ZQ;L^vB- zeUenRA@{CGs=X^r?sdSb!=`S}g$j8-*&iFty}^EcHL*g)27?p>mcx5C{vG zwN>a_%j>6t4a;y){{w6}6T; z%nr`Pu*0L-$%0z8ccK=asWatXXq`IFx-L$`QpvKfe5-Eh?Fh4WcnS+%;& z;rEHOcIr05&g4Sd>fJEyT2-?G%VB24kKyP{|+sLQry=lsms2zpu0rdZS}9>48qV9L0bV9JOZnA$|%v2H$^#I}ZvfNRA{ zj1^&|EbA=JbNP+yakAd^(R8gl=Fw!EdR;qQTib%OWYHN|9n$WOqk=6a+fP=yj zECkltXsgSmUXqyR=$teoDy1Pc1hK;+f%iD{Jh+HM8k)kM|RZ(Js8Cnn3-t` z2v=E;(lxkPV>YiEH5tWACN_>dyB at N}V~VZui4BI1S)*-K*{Q%9xEkqjcbl_n!Q&Ts zrf%WdyW-3I*9cBUQ6P-bx<}6$n(_qEd>nN&5)@fIqz7S>#nl08_K8h=Fk>rdlGl#7 zoLJZ%ME$YxbZ}sexz#~jkEb>8OBet_g8}Tf8e4t1IvC?#7aQ+5vQ at V}NWx}T(PmfG z4BpK_5=|zN*CH%vT13xYYzq#YZ8Au#(%3MQm=10yF`4D&a&^p(qO1oG&rDn`9m3&Y z8+(ykCAP+FGt_WJm{s^IgW9-f@!r*b4;%0lu(Olb9`i-x at x)@u<09;g9JUXz6mH78 zD5A3N^f)gN*$80%Mt%hSsP45uSJ9 z$VD?tY}2hVUuUE}jFWy;PONjoI-S|8m4cNeo#9b8^N#D at HXKK3-M!gS^xaU=uDUP4 zW1Z^iaGbkR at r%6^&Y^qVaLmqnuCq2wa(#wIcZ{K1H^C`qn;GU at W|*DFR?Q5H(4TA# zi#V-w!-4Y5f->7->}_NVv at zlNl;?+F^ z+#$O|*XIv&3~9=SjVIIHXq2W_294fx*=I%Wa#1)v%SCA#nqQQ4j}0eTp3L%zjd*MC zipiJX1d5s`$*2 zws-M+VW`t0PwO6e+mSJUQyz at BdU+3BACbi(Ju_PJ)Va(~O%IQ(LG59AFmi^qCp>d0 z#-&#)qqwqze|U2aRk1>@kp at dvp3`L82c>1pVwbIh#^#NDPWYcV$FoYk!zOSY<(G* zo_F!sB+Oxx(iUfBSnISkhM}aiix|514U-ZRKD)Nb!BS^ofM2pOAn<0H6I>xMiLm>v zy$omhypLZp#Qn?~F>Jz5r;ZKnip1(9*}K~EIt!DeJFDTkJz-_v7#f?}i7j8Jaaq3) zBfH$TZX9-QbJ(hX^qirC`HB0%aBbPw5~q(CM)H2yY$t3oteo%#r<#bZ2ur~>bsidZ zESm*S1Gy7~b2~BGE-(#b$=(%CbedW6gOEj?qvwQXupi=>>~idc%i4hN2Ao-w6TGgX zvR3ABx at KP2j-_6!B~7nIh8v5H<2+86Nnh86E`93~w!oSgY7I&W(OJpGRek z-{=`^9vy;F#QAEjTR at xj#iECYEms*$I zP3x|4f32Z-ogI5uO?<>naidGonYal{nzLzarw{9CzIRpavim}CcgD5%xZi9Zumc}A z!gQ_f6=~k=Os%lPT2ag<{W_JhS?xQNy1lwp=IVJ?ifxo+ZUeAUSG!EMw7XV*n<-Xw zS-J6i!qiKO{RdxinhEA)^}^3a7N*#@afq at SM&ly3#yP($^Ro7bm5QOA$sNu at eC}h6 z3v^QJpR&EH_O9A5)#h{NNjp`q>$F$MZB=@n+Zk at 1YUU@Ir=T_O)Ev8b7`tlU%%VO% zGZnkG#s=OI^n=p%AT8-)<)xTen>@pTSR0$(?{mr at 8*7o(;cK&u4STz~v(64S!mLX- z1xwi7Dcm}=4r@;X=zH<&DNzm zu4MJ}c`akbxukJ2>|G?``NKM3Rh!})87sA_F~*Ip0LcPov*|U5I3b(Od{Sf5+TMxA zVGLNk%QJIJWQ;y_Zn11pA2MibSAEJrr>R9SINYIxyqMIQDsQ%eIMv2sws`e6Pm^j< zt91CS9mcO#?#}NDZo06+;I;DWACvuo)p{E|N=H$@S@?!qZ{NC{9Ln8x?HWEPQqOd> zW65UJlE!A-%yG3)r>bFQYwyH9$!TT-*vUG(J-dB`J2Y at +*ky9QG)6b~PAm(wnO%!I z6KiH4$`=mfIioHx{Ia97>xOW?um?(Y((Kc7>K3$u&eY=VcD~S=E)yI?G8KRWAp2xz z=&+u&GaK9TP4!BqGo;q7)9wJnrPussP2nIL&bY3^V;2mXIEMPy33kNQyS2W5iL6N zb6k?miozOx1?8e at Yex}VMAgo+M&}h)A+ at 53%e-)racaeqqABWPA1ZPSK&v<@9lC-o zhC_?4g+8I`xmYl!G0T;9yx_} z*Ry$!xUlHS+Vh0tO}y-?O|wH-)wV$}xS9 at Lz`Cj%HeXEY2IE{hhfy4GcIM7bVZRM< z!gK91Io0kur`&t2al#q6%CaT{{RqaOiKh&`UF5Y=f4#=qEBvYk$PnO)rnebMXXbWpIK1sQtIV>2?sb64c+x5DQV_q*-6q&Nu9s=-6zqC5 zPMa$&=nRh6p>h9)%i-P?&arKM$5m(H_GP(x+}W8j#d!@cOKdgQdqf*$#?#=YU#zeN z=`5s@&0pU_Dl at i_in=UW?)eOH9hS)%hjI>+GmbH0o5$9Y-NtE;hPjvaOqkac<}g^N zbO2FS`NV?2CJrI93Ya%NwQ5FLwG?sgt&VKuJZ1(U7L&;W_i9;h`Zs7+nVoRFX at 7RrI-WhIbCr=)DPqU0Rq76^ylziA zFQL2TQFHyZQ+?}nP4nV!PV8*`VRg}rTOvi}j at T#Ot~u%1+uNEM4|aCkFbyBu-M~;D|F$!YaKIMRPycA>}i7!8)kRf3g`yA z6q{XqSy)t%wNvHTtw&;e4IX8PvG3;i>1RB1_?h=sU7_yj(+=6^qc2%aeab;SKOS3I zuW93M6I+m~?>zR`*Tv3(Z=B{G;5n_`bZbT0w1j-)i at RUVVjZ5Zwoce}#MjPIddx*2 zJ#f?_sl=AKwe@>&lHDiCh0RkRtxvoukGdt~q+F~zl-pxH;v;Pyw|ViDkxz11eXO-( zRqZ32Z8N$STl{q_^cQ>ibX*E+uc`F8Gymdd$5YZ;9`D*8znXgDQtzX=QbSzxcJ$2( zcKxZO+U<9jOR7HppZli%z_l0anmPLm=D)wvxHk5X zXwP1)w7 at m@q~r3|n`(wy&KsGj*f8?oh~$`VTG)FX!Gho)I(fP=Iu%C~L(+$G5<*5j z#r{%pbF2)}@9jEaRF>W;Sfa?ASCQv*&Qt73!ja?gLcf|c27+|P-iFEFa;bZz_cMS$ zE5XC##L7x at 9Q7ojh(hJ`d0YyT5iUv z!~H>Z`wwd^GwT(X`g%B zL8-Qx@&cLM{qjBThn3AVbT5o)ycbG}l4;j_6IcFlTJg;%-+70A8V0XDZU46Bz3el; z8e_|G-sp$ZHW!Z^d;6NEmmINb{h_Z*Zr|>ZUwYvE`cO5e3ng-lgMaTjwk7l3LfJ?DKl*zubyXtDh^g(a5RUHC at N}UFWmPUEyWn z7OCZ*Pl|iF-x^<>dNL~9 at _51Hz3Y?@TJOHK!b8G0FYbx$KPrk^-+67%)m49T+VSO{ z_PS=jO9!(&?zdY;%6w)`UD>uT at Aod@G(*qfHy%Gmwv<>HOlqe2)UGdn9sH)(w*wZbkdfOekGthA0A0}1aBJ$4m#+bd6t-|U;?Y`|mNAo$x;=VRgM>xhqw z?lxOEl-LaH at 6|Ul5l{6<9#K@>oLZtF^YyQEq1?_shuqV*s^9E0S`d*WHR7-$ecNM0 zVXxs=yk8C;+VGBbY~NDt^;*Tg{)&;s3Qggb{atwpeu;;Ze{X19C*-oD{a=T?(fE^I zpVvo>nv{oktjk&#nygw9_3!GRt78>>n0b#M_L#J6IVd3UZ>6o?fLPv#nm5-RvsQgk z$~x)wGo2B;OKWPg$%gehd(7^s`iW)Kn%rC7uYWS4`GifJcCX3pr_WuLkF9uX*(ksJ zgMm$$VrIHo+?P=25Y6pB7il$|7f>~Ayxi-Q6F+bx?^@lecGbuYDfTCXEKBk(n+Rx` z+jJgTZWSKNpR4@%_k)TU71Q|oeAm`p{RRfsVec&*vbgIvF!FAuI#=0MkDg!LRp+_v z*Um1jsVvV=z8^O9Mid^nt at rluvBi6jTXQkzKX)=8VXu7Vo{=ffU(ukoGDXKpmv?%5 zuGQy(o$v3a)rYTgbv?#Pw+LH$sySlxeX(a-^Rcj{R>2Q#3k3GhX+2XsTH79{op^bR z_;}Cv8#>;(&hpl)a%YsH!{4OGdn8YX_7<)v)IGd at _qzCfg_XxPI3F{zKV0Hc_i(y< znb*g}ZG0JFCm#ND^?QOwr%%>G#i)kDuc6bYBb)b&dwtt?)8(mNh2x|M!yoJy zrP&H-%W0j6jbKFlcfd7I&hW$1FZZm%TFOoLGGC1KNSI3cg&@A{+`2~K_b-|Tw3MBRh}%cB`@I#ufv`xO=6 z*t)E+{`?^Ksdeg8t%l|^X;PA34GZ6G{}$)bV1Ic1D6=aT@#}{s2ylwx^y8}+? z6&kK3qsiu4i8`^aQk6e`*4prB(0 at mwRihqMcs_g-pLihopOX)i)21&aI-GhqWb)Lh z+onJBOxy=)WpUpX at 0%qoXAC;`YOj@(Qu%vAFzZ{_r_cL6}s}j z_;}=XqSJ1%szrQ<`u|;dyIpwey_at`yJqsu$-0$%TW3Zt({Ov{(FOev)Ne-guGCD) zNLqQa-8Hd>?dj>MDK9YnrTA6dp7x)6i`t{t*!VhgizxlGw?Qp?alf)#+=q6DtXTr% z&DpPf$IbZS%-7oG7bF8HL6_q zL at 2H;Y!~d&tydSR&3F6Q`$jSPx$BdfpidJAehDf|bnMS?9zHc!rg^PXp!MS)J%6RO z2{>wxr8Ccd>1giXRLOWsdu%ZDiTt+rLEk#{qZaPPpD&s@ zsw8T7zxU{EklNxg{Y}xs@(hoAGlY3*ZlIzRD5Cl>;~)1yOm7}+lNjskDtB7 zYD#|Yi@%SDeK{^2_j_w__-fOnR}YGcPrpC3-fQpC%(J3D8wF2CC?@5GuT~w-HIuTk z`TFzr-g-Ba*2Mmx`&y813eyA4E@~Ia#1Bg4}0e~efjv}Y}%0nulighL!Q2m?z?kH z>%(71-rH6 at 4;S!RnQ`d#Wbumvs}pVol}r28DvwKSA9aj7UGDV1`@73!-7IhK&bzp3 zT`lv=_kZJE3SP^;6tDRmFUkmeB4pc9bxPvxnWZUayX&9iiRH4S*QD6iK5IDn(O%@) z at VhLf^!WJLCwcpV^@BBrJ%cm8*GbLnKN7+=-BrIa?^VpZ)RXP`IlBKjWOc67_G;2! zeOxYVso&tgLGPy&Kc9AR2$sm`osd1`_*wf=o=(rIfAsl#nwXW&D#m>|+8I5$iJ?D^ zS9*LF+5Btt=YMgXrvDX&`&3<)5A!rqob)-6>REX7O^saFho5h10(+Z2?Kyki$w{;- z+~aJqSO)w3$!0!t+xMPEdt2NeIiwz1e7S0v$(W7H3eW%`c{e?!EtY?9z{U z*Hlv1G;P at voHz2{39rM8#|}Pv)tt0z&wSOUguQVeuJz|cJ_w9 at U>&5~{Fn6)u};(R zyi(nfxXlYSiJ)tLZVat$URX%R^w-j} zXKR=29kabuIMU!HJzaIE^+?XZ!9KkpuG?$ABpwYmGMzTC>HD?JF+1bOWp=|IpF;+F ztPYpI^p?4zX`s2p-8oQi!~P{Th8Hg`5qZ=wzmq?EOM9mL*9EsylU}{{y~Oj^)`(Mv zdakopY<=CCFA=Z)=+o8hQ6*EupIq0*-zeE~?C_(e!$wwuO_rAFs~R^dsy)`ZVr;LI zX0Z6;lKQ((CBKxfUU={6+bY2?YhQmmd7wO9@#!fm at 0LTPiQLE;OQ(ri|0t}nd-0ZQiN+jL?Hybt z6PAzb9=3MqnpVF37 at H9H;jP~E!YgZ at 4BGB?$iG>&a!&1=@dtbK#vj=z3HjW3>Yx`f zpdMY-^;z(ZY~E at 0;%u*}*8|%h z{g0HJUA!LTbqQZt+r+aTV-muHs{oR zz2tpjpW at RiRhzzP?yNgy at ObpzI>}UD%9XRNm9>$dtcxlKz>= zK54K|zU_J+%cbEsE1-Rq?f>>C zW*)t*pYo(#>zM}AYHV~>LFfa;!aBPJDLalH(Rx(qhGl6QYrPknz}Z1?rpis8G5rLCC{ucbMz9lLt`OiGtxLS4R0 z`=uw*W(ybgEGmjklxUyls9aGw{p#CdCR26Ppjz?K$>^{9GUTGf(%)95Jn<>263dF6 z?rj+IFiZ3P$>m|WK0YtUB0=f1{&OugPqUjD1H*!hvS-D{W+_)Q at BTO&chdgTvuCG{ zb~o{^?^d0=+HsHa567Vem4XebwSrY^&g-a|8z&Ar9dtV2lM?au#6vT+=R?U_ z=Z=lUeD&TLU;X}@MrON)grUS<-7L-Lr(7Ra8oADNXBD2bwy=!Pcz9Y|i}AoLK(GUJM+g`Icz>Vk98c81Cs z`B_XSzi&6)`%5*(yX{`+84gUg4!t`v-ENxE^Wv^U)J2tLS;rfi9=Yi9G*P>FI5~JYd2h1W`Q-3tM@@HV=_tqF z-evaXxYBGr=XsiL2XCGIsQ6qe(uLKp`QU`9YP(5}<;ge;{ldYCkDXo;Evs}Yd!+5x z=hJ57GQYM5>wkB+n+oUm9gB-JV3 at Z%wS<+e(jQ!?R=qGIKUCb}=ZM|yhcVTkDmMQt zWuECaD|ogu<5#TJ*!wWXNQc)vi;+W-76yL(Lw0*lsvYlteyIO>^C#ubPf_A_xu$B& z2Qk&}lrt>7+Z^qd_Sorr*!Mrk>l{hsNM+b$S-5W35f!9G&m^%=GtPN%mUsM)j|> z-|w4w&h|UJ^U$_T%sUdF8}C%Dp|_W3w#NSi)cND3yudSX|_$T-`6XI|vkKh~{=?#*5;)4W>mM$KG?j&yH%aI~!xv6gKoV<+(8u~8Q=^Wt5rP-hGGYq!UZL4~$r^^?5uD8x@`g3Y))r)N$ z^;jjzHPgj)1ML1#iH5>@FP6*!eWSRd&<$=?+)Q$p2Uqf$n0f7g2Lg#2%BqUv*Ex=U at xhky2-G9z+qd^mrkucFr6jx!Zi zZ|^aDG5dBt`(0GM|4`ScHeD*7l^mbA at 0G^9Es-d*#mH#otB|502h9eR3=eIM6F~_Q ziP{@_0{<;fAP3F9qYj(D1YYgY&gYmEr!JB=5|27)%ZWUpiPAGW&qv`w6 at mERW zTgzusicSpI#xPmG&zk#vdz8M<^K97}aig*goby#2CF+w4F0OY`HGH??+qvh3Q|~eg-+0FT&{@9qhe}K5NEc;rnyqeC at diD%NmGj`s7oczZPJ>e4V^8NcxRX1)C7k29&lE`q?w~Jn* z+BIxrK| zbf2_ at w1ArQnD>&jMAk27^F;6Zw+m&SEskY2HtM)t7|R=r)@~Yp5zlZsJ8`N(C35V^ z&Z&g#mWcu at -}1{!wFlkV!M^hBen+=sul0KN-;!dndl~f;RZly6>`pB>(_>{nbF7kwr50{EGrL=fgIM0}S2-5$Za&}Dv|FuS;od8jwHq17NxfIp=sX~F+;FYk*Aq8>Rc;Uw>MVZGv!rUB z^6|(HIXBk#>ctn_8QScvVdsuEJYUi}=k~4teLf_-w%BA%pK?pF)4_y#lMSajv_|~i zN2xp8rOTiC(b2f^fRezujqkcnUH5YNpqQI_ee~^`(%_$3&QZaKL^=#b6V5DCdv$kI z$gh6IXyC(ECCZcmxGbiw at jYqcqt_-GpEXwc7h+nqjtd19U2y)XFk<6vj2+}6hv!3}a= zE&sh6jjmgr;gMIk at QjZ=pOyIIN46SPAHK%6mtP)@w-~-Auu7 at nUEKbtgZCK9_lr_4 z6yARIzjym{4-du^$9DGpkMoJUvu$0$ivO(Q*UC9;I2ZY7r~1h`G9IrBYeWRYZFw5D zDCFt&^+oRgH=(5>^T2tD{r7l^ZcA0Y@`&6&A$8FCeoAg_$kZOU=uQP`ztoEsqaCHD z%iNDvp3ECRSkW6kU)?1u^kaT>hS-ka*{rYCY0kGQ7lmaS#jS3=CHA4sSmV^AJn5qN zH_d_vJMS)iOaJTG>H6mP?mo|i_7f^jx|^&kelB;Fb9$4@|5U#rJN&)Okm4SVUuIv~ z4ch0U7X|QtI?8Q%&|sMaNwqqS|EBJKC-!?B{R>QOOeFDep1NSXn z!bmi1NauaN^QiT;x;e?B=Wg!T|8%CaQym5^?NHS-E$Vy{Y<*HUiWZPNX8N^ zTfc32F)yA)|LSG#%et`W`~sDdEsb-f9B#diGkp56IWbZD;dGyqg5T^ow2S+ii}dzXHVEqlINC^>)lZ-J9^(WC0eqcKYc zdQWtQReXIuN1U%NLPh%d8MRf#5qJD--%Mzxg*r*qi+q>3;xWDJ)9P3Ca%Z3LyJ}q; zO?1%t at P1YE-^#srtY0tg4G^}-346TfXuD}st at V+bpNGm0?>HE{!zuQ)dbSrc(d*i& zpOK9nqjM~(hg|+TS0>h9=alY$dR_dp>h3_ zPA7T4tiJnnzX_T=<3PyfTr>8~rY zyLybW8E>xl?m5}dUFytBhdQgwM)`Z#||bZZT6gy{vv7Fp(>L`(3r?iDeA!z}m^&rMHW# zAGK}wbLGo!?`dz#VhIK|4n+kvj*NV26K3hFYXs_zjJ$7K)v6{MHi`R5m!Wy!g=MWKEkp>)f6}Z$CqQ?^z6)1^U;Rk%Eb at tBrUq zzV##pr3{X&Ew-GTY-n?0owFG{)a0Yj-IffTg(IM-yF4X4Q7ffuzvBaVkF6S_Q;k`>If#Y zBza?oG=%5*MFd at EM&0Rf6n#GtJIBM%p;(wP(zbz-QXI&P;mu>M35*%c6tsI+z1n*z z!?CzxQb)wDxH_TjCQDyB|1vYI?WAA-oQ!Wh+XCwcM;;VAPfk8C7RI$dnN$xenPSS}IB6zrTFY7KUHs;^2VU?pnUlW z-m6}7islZdx6PJi$k=cX_qPSf4)7cD47aqIULEJPI-k$TS=J>UC=$dvctWV0FEBE| zW`T{saB*9btjs*aIVX>tkSgC*JSuC&ryX!^L(YP(xVBDN8Gb|VlP-fMS0m>X at eDs{ zvy`ppWzNYpoDeJ*D(1f`5mX&`PJcqOTq)3g&g9`ipR4xs3b}?Kwkck<;IrqM+&-u* zOOJRbj}JP_G6lvq`sqxFmiGjy1)WgGx+?uh9!!vHu`BytS)!s^`AT3SS)j%WjR zT)&Ymo3pe_xmZQkUZ_xbIHXv6BYWk9Vz~^T|D0i^VrCG_X;56&UcfxCN%EXPS9F`& zrb21f;&Sakx1e(x6T;<8-d5hpk+!q4{tM2 at bR8a?ebtSZ!82LWma&PwdP3r=8y{oV zr1 at aBY^xAkxa(|jYtT8y1m9H|9?sn1k~Zc>w(f-E)gpd2ZMTn-^7W!Fl$Cl zRHcTa=sxc|=jw*JQ$-5G=h?Sj&$Dz7c)j{x*(Y;Wo1_J;7Imo+3l*xdG(H|Et?-2R z%%#^_-{*yv+(}iKRkL1{=Y at I4|7x^CYd2~e-xhvh(ji!*BI+3E8kHmT{eWmTuaI$* z at D1Z8>EHho_2M!Je=W7iLdjjJM#H#i>F at 2Lj^|r0zP8=ywyh)mPPV+ec1>ecj^1}E z-6{H2G{t=Cw?YktjEXeTo>xCO-Hg$yFiBuR;s4=?cz3zLGi9YY| zwF-&zruK+h%=VQGO$jnge7)k1h3t at EjnZ{*#qUwZ`U1b-DkKU`EfTHf_FWyiZ4+~A zNA4X9r6K*AZN~aCzn3c5aZPO(Rpap$3l%?a82>tK6LYg1Pr;49#ee52oVimi|AEif zFmUWGY#)D+h8_$~-t at IB1r^_}IRYmdgf=6Pl$$K4lYyh&bk>Gy!Yg>@Cy@=9IH z5!6)N5fEW=r2~4dM&6w at 06Ivfs7|0W_ zC;vLn)jj!_dG747F`u<(jh)%7{cG$t&pNusZriLAYwV0>d9Sgvm=&<5W#g<%Yy2+r z$nMR*#-qMBKa^+V-uzgefA;1F^X%Wt(&TS@>aEPrl{v9gbfd#irUF-Ghl at f$Wk-)O z*X`0q6Rw0(J!7uKQauwcW@(-=*PYVpD6YT4yrQ`N4jaG9wKZ(~I+tyoNp7>}$iON)R1iwP-FuG2$#3IRVm#*Mi?mkva6rH3(Ox%Z3PFXuii zPJu_o{f%cesIo8dytHMl<-e0Ru~0O?YbZq_V4%ZUforhCL3E?Hy8!>j{0UwD{rMAf z_yh7M6#4JuPiTk+_zd+Z1dMd38FPIvH4)u-W=KUe;LK2rLcnN8hB4Q#(rgp1zEUq^ zuKrRl6Rv?$sxVkOZo)NGDq_qvTqL10!4&yB6XNhyRiB72bZKp-#Di3?xCc0QbFZ_?_(=BvkK`4gLWEQ7; zIYs3DMO#+5TSmx6iJrM&8?R|&Ta31w6lptz?v8Av?NI8FXo at 6x+D@SluF#+g-Ldou z!&+Ffuy|q_!y=3&0*g78DlBX0Lwv-sSYgq|;)Mm@%f|wX8WuM!GFa at fFlhOLFJOdE z{DP#FR8T*JI!U8W&vmLZf`^lMI14W=Cy{@NgdL_bU_pxvzKD!5mcOy!fec0=gD)nt z6^l6*%t6Kk3uY%{hGjDrOj*VV3-XxAVlhvg#vM9`LrIsf?vMK}_F zDi`6bxZ$(y at m-2=O#E-6E&c?XfbIW0#ZOp-5AqMfQ$>6i70jv;t-R250Ap(XlaFXl z06sk!%b!4;e3m?3DZ?ukc!h~qGBDYA{C%t7K`#~wEb&;X|2WK~2wy at 8E*pFHc((}U zT2ZbQXR8%o at lSu$4|q-DA*V|8^?jAhce^%5E%qA5a^FU4(7u_b+$5~ z_D+HW_X9Y?3}bFixBvB7>4CD60yCbT_=w!Z>dV>=$NDAFA_ZOc)I)2opbPTL9Q z^dVKU^vsdUq&8l~^5+U4*ce5N9`^LGr-wZ~>}BG!ZT~FzxMo~6_povxtHHq?=)hdp>GfH#97{A zSmt6`iDe0v4OlR~GYVK1VbR1Qh-D2HNi6zUW?_-TB8p`l7L4``26bi`7F~S!1?p%J zge3|~7#2*|0AI at 1l*%XK8zdTGv7p5cKcby6mcOxVr{ypDE_L|L3~- at D7YitR8OFRE z7nt%b$_vNH at QEvE0;}=DQhNLjyEpK0TPbTEMeM?FbD4H3F|ONm(TA)~{Pdg1c;bz1 zc(x5!6}YOvl`^iBag~azZVb8(%X%!&v7E*-ibV)Z3Y-Mqh{shtuB>rofuAcIMVR<$ z8JI!~3i?G*p8_1r0?e%db1T5yX8sIb8;b}Qocl8}Snvx^@zNI?4Z~;7#)9uTx(Um2 zoP-tlG4Pdb=?^Ev5K~RZ=gMHIM~%oo3r5+Cet*8g9K0%zbR3Q;9F8d*j;R$0UWLU8 z%Tl;NO81S%f^RT`BQb at _Q#dOxLh;}l9^jZv?ZRt+{sbfO;Lp=oJjJP*62jAXG{{C5 zH_WOPO^YxlKfE$y2sj&XF_u4pA$TPcugKsP243;UAuGgWUGW#4jbAzgPu+0khHuTl z-;Y23u-W($3Ha|os~q-Bu!phv;?Vly(E7$;`O}(-9syXcVp)$y66hh1B^zZ1P^J|h z=a2tpaB#5M__i||(Bgm at fUW=HvAGIuiX5YN{C5hF4BJP~TR+k3oV#N5lG<~kWptk{ z{Exsyt0=A%XisH}N}GQwmfl75wl&{FUY48GJ+Z-}=YP?r^UZxPIiHsid~_O*U9d>t zWi3FL9hCJone^#f1b1(wSHh@|TY at PPHK9{1$>;_lCl)WdZpNdmKbJO)R6ge`NuMFDTT%8PbD+NuEbaI zz`axwkSgv+{yew9^I7oXG{V*wmr%L%PoqDNxN#|MjLS`bF1O=y`Jc-_U-!VDOY=vZ zjQeLVe`(uyN8RT5h;!?*lq{FV|Np0N?9^yc>|2GXU%o?%)!o-Q4%}B*+5!i=iuTTx z=TyF0GU+B(T<)K_aw|K&RDHO0O~f^h13!^%AoGZPBoYm>hDbL^BoSUB${_qi-Vxai zvYJR8ku;#1llBNHdXNND(1&76e^dh>U@#5t#v at ly6)__=xDBOED2)A|9Aa z2 at y$3`8Jn`5eT|`AQAzBxpaacg@=d|2)eu_Vh)12)DpRk6hR`6An5XiNEHa?G6I5> zSwzH%GC{UDgjGzd~~UPOrapi2o6X(A(-OBoS;q~N?*fS^k)kwg&8r3VBlI4^1-=u$z% z4g_Ex|9(y1i at UYiJU_U&Wk+=y3`XX1i at Se zK#+p-!T>>+Y9fBc at BBxUceCSL9}l;(B5rcNiKMZ#{SS5*O$sP;DqHtVy0MAq3GQY$ z9(Xd`Djaf?yCt-1NW1*> zqWL9yQI1|*NG~Sv5V=o82}Fm;Dv(ejtBF{GQ0Km9L{dNuh%6;ig%m|18X#1>FO7&J zh#nCg5TvLQ at c==Wd?Gy{3?jTlRFSfrhyW2=bh$@FoJigVA}c_UvWmzy5OjG;BnCvE z$YLVtNLfKd83bMaBVq-jOJqF=QdEdIgP_X`BK07cix3f4q{tJIAkvI3$wah4Fc%dN zq$m at y20@oBBH19AixiQ5q$m;513{N`B3>Yvivb8y)QFq~L6<@z;~<#JY$DQ>GA2ue zkB9-f+$ADHpF3*W%fM6~XL|Tx7^P&xcE{}+~ zfnY9rAV|S^@d81Y0wMz-mD?+;y zw5#}%UR+KuhSG~>SBQubi6Rm&NTiEMGRO)d4?)6-EF)42B245r5eE=?BC$j&ks?MU z6GVu}FCyPSl!)YlAVr$U2nf2ch=>u%mL(EQLx{ML=1i at Sqi1Z;voJbxBy7Utn1HoJhK#(FsWEuor*hGYhcwsI< zM5HLCe?E~AB6{f3P9y>Zb4dcBl>Q||%0SR%h=@4|<`P9D0V#`!q=2By4$5=jKXTv9-gg7Z=hf-WOO z>_9M=7$OBo!FkC5L6=@4Eg+anHV9I1UIswWWtxZ~2<8$=#1|%9l2}V`MurkuL*x(gU;^=Y at 0 zc9~rC;stt9=@q at WmWT-vi_1jT5s3nsMdSvN6p-~qoIsGGOQaTro5&R+jvyLD_7bT^ ziWZSfkl93T6X^lbCgKBv6hk5-MC{Qekcc>uB6T8Lh^QfDEs-z~bh%C>21Jv{5fG&4 z5UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZnK%|#QE4o}Hq78z%m=SS9iUyH* z5Oj$qk`02nxPTxNBti3}h`n at AoAx+D@A2fnCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD z1?MFj1YHt{41i!RXF-sH^D<7vA6#SsK4I4{*8 z=n_W69t3l-B2t7DoR>WoFG}w43lSafFoD#&(Yq* zp7x(R%n;msm2+TEAWNiVL6`rML|IPI@^a38{$a)j+N0aevgMrlbgMwOv2;sM|Djt= zx=oPflmyVfb9p9Zwkni!xHhpvu2JNb?G(9)K$0j$hLiYC;td6ONEneOBHuvNh)jYYg`0=~kv-`0iijAI$191H5?O;3ej?jI z(B&hMXpl8TxB+ zq6LDvR1!Ik6agaEAn5X$NEQg@(g%VRJ|cP`=u$<*69jW2QgB}ELC~e1NFfO3G5~@UoEHWNx>OVKTmFtSsJw$6(t2r_!7{(WX&1T267d)9 z_MZq_$th|5ds2o?WP{)icG-c at VTQ2L4UW6_Jyzt!m7Js%?>OJ-wKH^kekJFS!aL3_ zx^K)NIFth5K#s}m;Z=Zf#?!h4}ugGBF-S_@`6Y`2<9S0 z#1$#>L?nnbp-VCmZ4k^w1q3O|M65y3C5uQl2<9S1q#r3tMD#$=C7p;D2&WiMp>hfoWC~#`k6(*S%SG?tDN}8}!+D(QTORuvmq7^t%^ja6)^3v@! z1&*cMTh0x-T}-z(>6V^;qFW)#4BvR2mBM7>T5%C1UToQ=%Aw`@>9tgVh6Bz at + zTna#tB12>v1YOufgo&KOT!M&5QOb|`L_&z at qDwoG2oTIA34~I9EFn?`f-XZu%t0`h zC?W|+SwtiS1YLd*sRF at VGC`1n^U?!?E|Wx5K`@svBDP4ud5IzN0$sX^q=R5CsUS$f zd8r3Mmr)|FAec)$k!Gaeykvu*OCOPb5X>bH1SvQ#;~?lVLqwX$Z_FixhyhY?ULuK{ zL6=SaQ>?Kl-6fGi|AVEZK6X^lbCgKBv6hk5-MC{Ndkcc>ue03sQ zh^QfDEs-z~bh%C>21Jv{5fG&45UBt`m&-(~K-Ll2MI-|$>xra-pi3N)dJrulr$LZn zK%|#Q3%Xn+q78z%m=SS9iUyH*5Oj$qk`02nxPTxNBti3}h`n at AoA zx+D at A2f_IRWD+Utst0-7YI^tUIy^j zg)SjP7$BI71rdLw;Jh$F&?SaQ5eVku27(lvmsSvTi6r6=g1OkQ9A zhLiYC;td6 at QzY^P#OxZU+aJ4>w@#IIhp=lwFV3PD7t)Kdm*~aUL=-_*5qV2wyE&10 zL at Yrr6Zu3W8AOH14-llxA))~iO5{Be2M}cU%iZBrmkT4=mM81Kj5t#%*3O5k} zB74#06%jEaPgfEtC9(!7{6w~apvy-h(I9Jxbb}y;mxwY5y1XN at 8)P++IwEOE5hCIY zf-YZ)dMnRA=n}`IFFX-}yh!zOuQc2`EQUr)tgP_Z2B3U4qOCJbQ_=xC%pi31I zPY}$dnaD4sh!8mof-WsY#y~Ka84yb8<|4vJL z2oTJr69g$dM3g|#^fgcO_?FA#KTCejarxlDr~1?NSC zh!47y5RoP_jJcE%(MJl-ivo=Q58iQp(rahv_WWv&^Zj?6IJ$M9+hDq-r(fyTlWu3zzw-Zd`%7J0%~7UEqk9y& zjv{vuh%lu{O%h3#B!X6RdT$Xa1JNSF*+IJ at w3~z7B-%BkU4DAe+?ZaJqZb#_iwPHq z+$W+0qC;dAhzXI^L at Yt5bMG@EDIf+!mJ+E#iXssW5GvlAM#K?BkBANkQdEg}fS^l0 zksc5R5ndvyNLfxqfQT)++#@1RwQULcr at 0SHpmh@1sMmqH at rAehT+BGQyHDoccqhyl9XB_cxP4CW#a zLMfvwi5P*P%M&7zAehTSB8f;*Afg0Y9Q#6O2i%n zbI}Gt3eJlg2)g7EX$8StM2Pqy1?NSE$PBuq5Mh8|E@~i1!FjOYIMIe}q3=uX` za9$W7!HS&T49!V<|D?B^DLpfGJ>w`5lPJ!pS{y6GzqZSNCPb0bsIEELdhx+qj+Ueu zJGqzW0_BO}C5b_9orZ)6aA(M490mqc|>q(|%2t zzeFfSmQ&=`yA-*aB0oTwlMp0v=p&IZA`L{?MzkwQyPepLq}>VHRlGwlE~ghm=|!{c zL_~>15sAM-q>D&0$OB@#?T1t|-Ngb}eumkuJ)APPhtfFK3)s{lclVIsRhKQNUA_^?0>NA!fgnYKNFxZk zj1ln!!CVrE^dUu at NFE5f^b;8a!CVSJkRn558U$U~M1+ZWVlF{Mq$s6tK9LY2dg#(l zBmx9;Ndlpiz9mG;K+t7~h&c%65=A5dDT|1tfS}6{B2^%mOC|_Xa9(;q&}EW{DhTEh zM#L5=I4?0o^3bK5NID4Sk_v(poR at kKbQvY$3WB-B6KO^Y&Pz53y7Uq02f<>b+=G~F7}ZKx{eY;pz1j&7~!mO{_cQ$xx$oMp=%U+`nNXmbq5 zSAm|%*HUCKMgB{XMoA=eNvx$eBTa~`A##WaM}~IYvAd0S^=Y at 0c9{Y6;stt9=^nkf zmWT-v3sWNNh(v(|61hPn1!O%DClI9Q5~&3_Pvi;_M-UAndx=ydMTn zCZYy{xojh1j})Aj7!Y*1NhAXVb8!Yi3eHPC2)cw5aRb3ztckQD1?MFj1YHt{41i!R zXF-sH^D<7vA6#SsK4I4{*8=n_W69t3l-B2t7D zoROXZbn%~x=ak#BLn)l}^`2AzN4Z-@ z#}RBv!eVA at vBk_R3oK@4W at w9;%oPY(kuaI>>HyGiK3#7u~H9U%%pX{TVmX=CQGt>Fs^K$}H4 at WHXX`kT%R2dz()E*o!B5MJ2v|O{w8-~-)&^J^`f0%6r{~24;2c|8 z=0`m90<28^6kzZ(@}dGXj!!J|GoC#GR+fGSF!-5yaRI5vCzkmY&(HuXYd>Ka{4B%p z{s$dL%l!6dae$S*pE3-7wjpR-C%BgRW6zWTD`!7x82lVV(6~<0ELg&hH}S08{j_25 za}7b`I!Uw4KYPXoSb6)2!{Fx`M)bdZLYH~Jd58JWd_Gqkyi zatNZt-ZY{GHFZGEXXdv4#!pb=s&^M=;uCk%DC9Gcp!%<&Lr}^GqFw!+e?PLuKRQ+Z zqthj*Q`J8@#r&faFV?1xXn&0W)+QeazG7{9fj|gr6GpV(mIrH70tEb6n^Yj+!`id} zfgsi<4hTRz4G at 5MTp$4P+&}>0p@{Zhf_Mrb0P&bW0OHw!0K_8(0f=V+0uWCS1R$Ot z2tYh=(S9NjPZ$Is9w`VwJYx`mc<3Mi at svRT;<17N#B&4zhzBp)p9A7ag8;;%1p$Z$ z1ObSL2LcdJ8w4O;F9wQ+#SL?CkUAinJ9+1M1(|)4We}zI<7q7v?_=l0%KMTPV3)@X zOMuM2xf|-=8%D6n({{Gg`ubFt6^3{GsU!;tg#ZQy1_#C|rSUDul5foe8VrmX5e$qL zbl240mf6zY-qOaL8FXoDZ^vwB?!qi(@9d)LU~USu0Gc~7nc5gTJEv&qs$yCK{BRN( zv~e54Y1Ws2Xp#P?XvxiQhQ=;IPJk%1YSvGTGb3I5wS`~&R^`@|b0%N5?I3Ka zV>B*@%H4e$_x;r;Oa2h8Qh{p6FYM{2>-yE_`fBI%?S(0_hO$E`{*SVzqFL8hzCQ&%24*ony-AEX z!AJU9Qc=7!O^j#rjOVno$4DdCctH97g3sF}dvgh!ks>de6U4A+xlou)S;3N3v at kzA zgq0NF)GG8~6V^~`1D~1az}{gOa~d0h2!7g`QvE`hI(Utd|5yw)PS?IYWjR}}rk*KB6(JT3l} zf3{!`2^%Zp*n#ALtbI>uMgZ2VS at Fx%!OrBHheTd%Q2O#Mgn?SZQbJILDa=p0J3fSZ zmsNlgYuN!;dQJ-(+p7ahYwm8uUYuy2gg)4*6xBl&^H2_WKb2P)u7)F2z z4kFsb>Oc%@uGVxqE-U$QcvDXEq&FF67QMpJl*=Tef?^h8H!G35qoSk`j7wKAIl`mu z2n#W5R-!7a^t;y4ixfHRZ9pvQZ9-(6YxXc6k^QbbbSIbUa2;!w^f_i7po)Q6I0L>c zw}FS%G8wGxZ_aOaD)8)>fV|rq4Uq*7VVXq#RtI7n82Si@#~damBJRQWlQNZbW{^} zjFQpqyv7Z%e{4wpXfQ39IAcGPW_*c|nUgx4S|h- at 9M z at K`OP+aF7rd)i%)I?MK(#3+qF;Xdci3fVQu+A3YIzjpW}b#8U)lg+Iz|IEEZurD9w z*1G`egW at -DDcm7jCQBfWoYFqNxt-GY#2foU%vJ{oya!|allYRwXp%#1v9}vO8uY|~ zFIQzua_vkm3z~=$bA#RZ>xBKv6zP?MU6VVk-^JGEV{hcB4lrxY at ekyNb4w2KGwDe$ zDBnD2gV(Vy2(B#bbZXruw06tt31xrgO?MJrqp$g1`O4VjJ!_dZZA*-4-q4khGenCq zG7dp5Qu|m_5IW`zRpd(*`J^H!>S>Bbjjf9t(u)KpzjM9J`787qIy}i<`Kyx#B-47& zLnubtLH9IymDEP39fT)}CwsQL6I%e-j+7O6={OXK$=}03u-_dsc*k at XX z?*9q96JU at CKS_5NgMLa4@m{}ZxL(}Vq`*r^vl6f5#2<$ku=(YNXJIKDR6GE`6 zL9I2=kNW>;-#~k22V+xfV at q>Jpq+*NznQnZyeta1Fq-crw^l=w3s`0|Hafkq)Wt-x zTxKp)#u<98#U2<6C4NM?cz2pto)^EpJD4a3nHc(SgsB)T?MZf1?E>Gzzf$l|(HpX# z-z-&5s}WD+$90pka*i6D_s0kv+Xsw39`!ihW4*-jN-lUOM(~)2+6UIhT*tlXs!3>F zOr>4P61A2CN=Z$`K0np1x^`h`I05 zJzF)NbS_ykoRDXYc$K4nQoK)L8yUI`@2UsCMmA&Z%`d2V2m7cF9~IBVXI7X}B%LPNkU^Lf{ zA-JkVW%GH>2ggoTCY-j>@K)JuB?OJB at rob(q^XGC1@&{OdPSR79X{_>D#-Igo;N)y zzx~eA;7?FK^Y7CfAj6L{(Ih{W~+!PjOK@piu#)GBnS$r?F~`T^#j?D(jI)-e2#xiLLG&3->QJ^B9k`SR-zjO9eB z{SJ6cZOr at 8GfMmX_#tG5^l;NT3doIbbKl1LFb0*{=!4`Ej0-M2>7`RSIce8e|oB-fssf?^;{_!9~~1x-{Oa_s2xhhiZPMV?daxN} zVXrCi+q at o{o!bX(N4Quu>oRI0_%~B;a89-EH~UJSHsO_eTlSXsyBrXVJ9dAo98QIE z at 9qdNM5<&Ytr)Rt`o-apeaPyOS zH#~0Ho+K^2U{=y4)Whw*y|!SCND at l8RIPa1f7252v&eD32Tts-q+d#_Fb&N`{>}SA zDd{e|VdYNWoQ9=rL8YL3d9>@jF7}NoP=~184wTh0dmr3 zk6r5n5eCJI`^V2Flmz5HR*5R?F{=6WAGu7Gl-fX4*`@`{h&Sr`I>4I)f}v1=qRZ_G zIWZEhRnD+n+C&snTGOLT_^LNj8X^g+3*5n%K!Vx4lGuCrL@;T-v?lN5eL?8&68%)8 z7U>F1`zpb*?gOR77?%_J>uzao{QluXz-dr+^R&xPux8k=_u!A6acV=n!a}@-F~w4N zg8R=Bw}Zj*dH at +5FVufu;%xsean%jGg>PsASy`B-R#u46G6l(Cv5-799z~TnOkFfuAwwQ^w^#6GIfb3%;=2H4) zOTcNfu{uDMHA#f%&e+7TX+78R{(-nxgFFGE!p at Emozx z12MV}Z~5~2yXt6sDXM~_D3CGI_c5fYS8S_|uq~7-R<%z%ai-V%>=yt`C{L^mVqNg=Pw=Em9%#PgO z5AvTyRJY0{3j+%VR)-1(#`@nA(Z2^q%~xlFCF~E4L`LAxh8Rfrh at 8a&s?j at 9M;V$S zQZ!0OYlnTDPT&#$%H8_5*t&X&`u=Qa%Qp{bD_VIOk-?(bQua$!>9SNSe#iwk7zFl^ zJra|boULYt2{z0Fyd3YV?i0Tg-|Ls3b#}gR`6T`-b72`Y5wx4M*znn at KnW=>Bw2Al zi=2~)AHIaaFMJ+0+E7Ocam;L%=}N198^DR!n>4AA>Regu)8!x8eE1?l_mN9P89!Ib^ z5J|Srahz%UB-sm^{H7w at 5HZDgQez#bQaXnZ|Q=hjWvUAIx~dJ_ob8X zzv9_V*-pEwSd(Pdb7^#9GdM%5*)94h<_#tqiMCj6qpaRtXCK4^hK#Q#^K(ep5n_Sz zvO{iJsb?1j;td70g9!L0q6ciX1$9L!{Psn?ttn?=_OcE~Z#C~7c!Pyf ze5SaEt7 at fM>Bd%(?b2J0N#gkCdHady#nG_XXe70B!Iqw^-^s6Mg>XDjG zJS?&du8T~^3!$2UwtvuH4t?H-tC>QI_f8 at 4C2k;*y>G%pN%@(~)CN&}BnRJDD|Y+s z*F^&#bdfu6>qGVPpS!Dse`|sXd*}~B{=K3 at y*64?J1M1$4t)L!eTld+<{aC=owqW> zn9v?Pf$tZ`Eyh=}R~~!_A06r_KB(SRVWdwfN}fWer<6HYa|V^LsykMgk&&ze+_J=F zPa=x;4b#l*YqceZ5^2|m7jPN-3Xlj*{f1%nzfzy$)!Xt#O63I_0^D`#L>n+A|RR(w|GeZ z4?}*EJaD*=b=YIfgK5)H(n0(H*YL~Kz0VLIi#6X{+h`0OYuN()E3#@TmwGu?no zdBGoHe@){$_z9MYJjosOqEPrFyR)fzWpAJeFp+Qlzc>tHZ=4KF>=&(~0(CUOU|B|Q zy+5v=cxm(V;wX;6^qA&7tfy^3~iu)5B0Y9L at z;NfdZ)MIHNzpZd3j!yUe{ z8A#ApUeXCBza1b(KAFj6oQJJl{V_~Q_ihbu$GSNANewQZ4-g)Wl?T6qRB4V zqmrXUM`fF=e&IwT0z6{^Ijobcbe8%AU->Vw36gqZ2Be!H55vx8?f|tlF?*`6CZ{E* zXzKT+kHWD|nr1_FeIr)6lCm0d3 zn~ag+MSiZ5aVu+EW at GlW*5sQSHa@|Q*aKM2fSmZf_^2&il1_K@&Xb}nJI)Y?zy~OH z&q9o3M-BWNz9*(zf)6(5cbJ^sNT#lc%dTSgef+P7jK^=bFrWIlUBSTdoPtfyasB+w ziDd5>r!-pk7$*{?E1d1B#ZiULFxJ!_5!$#UvB?#9J`ymYIkw0t`CBDC-Lsl?jR65} z>%?cv)IrzB--eZ5r4=f1@;n#I2P()ykDM1rnWK^iTm4t4vVYxd**~z+-)azebiiXV z{!&l;P!+t9?lsWa&+=X9+~7`|)wX^^#`njZ`rBDWew9;kYIW-h$F0B(!Q>vS=Mb at 7 zgy=dRHDz5NUe2($t>b^J^;}X}8Mi3i*N`&XvQ+q-}2VdGTBpO+oxgg5%v!Q!@^zN}sASSAm&aoe40il!<4T^!G9w6H{bTuga~f~WZ9 z$2-YC2i15$Z}t$VMGMN#X#TUHDsA_VNb2g~VDta4l-epxAPlgeWiNgArT>lVQHdL* ziEWP%xLfcZpd%8#SiGqA#)azlgM_ja8;S&RVj6}0r?kvWx?=R=@54gT@>iAeSucdZVdLs-Wo%+&?)-1l z5TdFJD!c#!kR=;TQAP=L`{v4XD&JQ+H^soCNS87CjrKQMkS;SXYk{r#%pa)!;4 at Z% zr$IfhMbVb2^IQc(X&KKw*OM9d`o}XndA(qpzYvKm7DVy}3KohV3A$De+dFVW!CnjFnB zTd^+-=xjkUQ#*eqw-B&1js0xu*Dx}d>Wy}3b7^0cA)_L{EJ-WX{Y7 at 4D5m>qaxL|f z=7`l=WB0eeSC#QtA6qWLsIj;ajoS5kc0=>Nw>ARQbZ$B8NdAP>IMEq`l|AkXVpRw( zMA6oYj5s($D6@^^DQ ztP474-n2}9>9GvTT`g5ER}5Cqm)66R>ysVWzn_OK1{0shaQ&_xd2^()9o zHb9>d)qnO0shB(4yE>VgJO9VxMU2XSRCYwB^G(Q%D=IQShC(t6d%hIPl+&q{B+DQ_ zY&mLPX-wB1$?pC97D#s62YaI&u1y_mL>I|e=Wa1Gnaj(!-BIPdjfL`aGQ{xkVm29?N%( zOV&Pr{eB1|15N4< z{HijKJuYwaDaeJM|70>i(Rq at 2pe;ND@%1U0T2#BsbG{%!fnJ5RDgiH-Fpyx0(?#X{hD8#6pucQw+v6}sU;*IF6_2ZG0R*q(C4^RAM(nT;Jr|7Lf zX(y|KoBGenX_b;i#d9Jbqat5>l7jjPVTwtXHvWR5I5E?)5wGX9`E6rA#;O)wL z^4sZt+H&7H%=7pEMC_xypgH|j9k|h!BqA&fagWg9sM&9+rKB`en7)mv4nZ6~3{bCcs-F9cL{cAsq(Jl2) zjisl^+`(pT at C&qZ8)jYu)26~^#e3ANd2L7k5VhN zkM!~xQIex+Bg~39yf at j@x>g{LYfV)}I$E56*!kHeos%^ZB_AATmfEvs+d~IqyzX|d zR$T4GoCJUT at bhz24qcsOHn8Wiyfc3xP%^JDZ}VGZzZDpy;L!{|rIGem;@$D-8+b0Z z)1+-+8s5ja=(=92E38&NkJUG}y0=09&|)25XM1`?L>p|EV|VA$;a8(h&Rd{s-2ZiW za3qnBr|P^Fp%L%8arakMkxq#bIAFwsu0MeqwHwWS8}SE+CZ*8jD3#Qyp-dxkBp5K5 z0ljkZP z>gzn}6+$pFw*9URLTIG0O=*1z8KkP*bQM5c{1<>>Zk4XKaNOb1As4GhZSRMdqBt=( zjp(Byr@&$9SlC0yrEUpp=)oLf*}w?bpi)ubpuCe;R++$SeorK|$M~#aRnC1gz7)6( zmy^7+=T+?>EvAeFz*2o at _hmWza_X6?+X9zuit|g0%pVEsoB8{F=2{a6%JAA`;1TxA zPMlU3Lt9j&be}hN91|M!0$)K!9H5oAxW8CwF z5XW0!(A%o>6Bc74IMGK#6kV;4bKbWXyaLvqO#WS0<%*D0r3N0|UWwU-55B?I40R+| zT&{yW00yD}O)5InA>a{mG>T*93xP-vf!8YOm#6qhGA7RSWppx>1^+}12{>T#02*g3 z!}+SHC6htg$xpr zZoFQ1l at o)IV3tmAh#Tc26LQv8V6J{odxMD-I;dIOY{YF++rudPZjJX=s)=L=^XIRF?mWvPDnTI7UvVx zkm!ATBB%WngA(E<+(j#;;fg00mh1ft*FfVY&X3Qm&`*eyx-TW%8W`C-^AUN^j>b-E zOYZ#qmxw*!W{H6eir5wZxAb2QXlJhEWDoLOXZ!z1|KlfQ2ESp2epc9;s4_P%rF?Zv zup!*kLC3;E2#`ri=>!5oX~*QGsY+&!2VidshLW(lme#U2p7QS5uSx3c!D?9_Ssxq+ zShP~OlGL%S$?>KKJZP5#PX=gm+f)cRBMbn6Bl1+53c9M#0M>^T7iaCIc2geYB9g*2 z6Iym|Qi{28IL)-C7F-FSO!o~}_nP_jM-psA&4irbS at uKG@YeluIb$7u_MVRcK^Y=1 zr?vi>IMa1ZgF+J(9 at D`jj-Gav(-3F5PYh24Gh+ne+XSXF5GnYU!s`rQJsi3Xgc*E zz`*GLvnf?@wXyl%7bs(tCS)Lm(W<9aF*yYf5TW{wCi{N{QH!$#)}xV?dyD}ws2$DR zCAfaxcJjj$zkvzKTx3A`5bLF1W&W=Hz3u7k?+NYjBL<^Ui_xSe+*M>x3uvwgxAwA) zOzLi7M_DkhqSLa_MxSIo7n81SlaU*4Csw%WD{_31gOA~+D}V_LX$q5o1Q?cp9f!K) zh-6ZEjbEqFl0qjzzl)1#RM0}*;`n_B5C6-n49|;d0eDAOx^n`MmZ#Cr;5Zv|K02;> zYufC^B^O at pl519PK>8zvj9uqe+1xNdSLE59BeaZ}hb*kBMP`j*xFss z$D|O9GG#J7Ltn(!0QY?O(OB*oHQe at h%4B;59?^!2xPFvo!eh*v!PItho~9Gf!Gn4GlDb6+^aRaDU-_Bb_9!m;_ZM z4qIS8Fao|t7gp*Eno(&C8pI+X0snUpwSRz@~Y}O=aD7%?oXzZ zg0pdWb{y*W^)2?9uZ%SkzYBniE(>X1gY&jig at OCMjxoZOHY)_k;N at 3MPXMwF*U<8I zNjmHJ<$0vg#qN_zH?#9n;V-w{8n1tU$YB%X;N~cMh?^PH4aWD at sBg^2_|B<3thRW( zladb}F_9{0!;53h#Mdp35K;dgJr7cDZWLd-f;QzaD9g+$2$ zW4;VAI(;UNXQ87tVqOSi-J%Opfz|4dP#69nvx~43iaU>&h;%}E2(`&D#w&Br>3APQLw;H8FmVH^E|4GgaA-iu`-tI-qB1TjlT#oR z?SkvL$Qlkk-hC=c=PHa(zD!j7dX?RnlPcjSB-(+PCX3Y-jiljoFz%&iaZ7tU4Dkh% zNooOl%;j6<)=9HWgZ1J7If=yZ;Anp67}{`hRDbLohrcv`mFH)1Rq7 zmYuYBa1VR6!%MdTN?On|nzd`8(n2^zKETK{4DK at S^<{K#&j|~jxJiub8vyddJBFBO zaL9{wa}*Z^W4=+HI*@K67tTwyC#N?)xR^=#x5WOxBJJ|pq;U;ISBu!pC{=nVhUr0?f_-eYOO11zL3yCn9!0S7DA+^(?mp+ zs*!~vUX at O0!LGk#EPVe@)zA*SLel!=J)>U zR%Giq(wb{UvEMX{QuI%s+TT|#C?%C?mTmwxg8p2i(<&*-${Gpz;A_vRGAVz`o3`FT zQQ)#POVN{gl5y=mG;%93l&fJIhb`22N`J-${Tbpfg23D+3QRYX6f at +fMAXoR{S;0> zlJ=G7z7o3}l_!OT+PMDrb#tj}X^e40IrG!^Z!>gwrs*ClDmq+4u{JVvHc??%RPDGj z(3#eFG?h*q5QLpwL at rf~JKQ-e; zN at lw*jL>CK?f`6q7E)QxVTKA z)wP*vy(p_NWs>90Zu3tMfdz5rZq>AyB at fj$-GUp4X6hsb-tC?nK at CV-y8z=3Rr*Jd z(j`1HZ{*rD8a(|g{>FxxLEGC3%4F(}^v!70l+Fi_`{=azEM?Np2fUNh4f8gMPd{hy z2Vfa6SCS+KTBrM4q~Et%j#r`!tP18PsXdq&x2A at 0gMo(y8y1Bj`AvwzHLzb=!2~i6 zDNvd;Ib^o+8HT6Np%=WIiZDO0&FW>Smib0QxZ2UQIS)4gr2?XUqKeM*w7%kQS5V9F zUP7%E+T+m6UE2X at EeygTyBZm17)6Fs(7j7A;Jp+!|1HZsbun&lT*7W at c0vs7g z)5K8!50Ch_)bW2=N3*q`SHkjRQbK4(u=_jhqM&x_vbAW>L}8jCjY&nqLSd072YT6+hx5Rq{i@!Xiy(X8SM!8nbe5_W9Z?y^$v>T>)$x z{eqS>90L72C|>%+JwH1IJ#jJvOkat^QV+zKFD#y z>E&gaJwh0J1+4Kzcz#7`-- at CmsKaw&iesE38A6&^(zzcMY$>a+VQErKT;&OvEukH1 z4Y6+Nklc(ItGV=X at eq21K(AoIyR)6acH at Tw_Dw$r_bPH-ahyK+#)W0!DypQ(Z}fk0 z`AeWUuaw=sk|{?C;U0Vdn?Sv(PfP;yO1JFlHHgbs`)$P$d&LE-m}Z|+^tsRv!&!fX zXwzJ)JzE3c@?-jQ{PkcSDQbbXdKs_efhDcktc~_>SVn-qCdaV%AChFulC$qML9Xiu z{Fh0gE)6v85K@@>5lm7s9PeWA1vsOX_o4aSiLo5 at kV-tJ?)VyHsdRi69mN{7xZeDpLKpQR=UP1HKt0VM#xBPHwkPzzo~}sQP{nk|8tLst(}IrzP=;eDoriq+-XvbLU*fc| zN~3iX*s?@fZS1=COJ3>BrSwvkS@ zeI7PujND&Ml4G&~u-KW?TCwValC6_D1w8}^x5n7Zk>nDa2e$hL8s8iCo|${VDGVYq#+RO^Tcs$}!@VPs?eC_{OA4 zjysXG^rNO*@?#Bd)Ed{cLyWSCduTcz`?U0UOiANjgGh?1Rq4saYN0LjZ3cYlK&A6R zks{);$eI(8gbF)CCe#f%N88i2>U!xQTuIpSfKmwN%;5__ZElk+AWUzC3t5oU?8T1W z=FZmT53*bZd2vi^+|oYA@>`%TownaX%V^8F!WbQ&h3o70yCmmYEYXQ#k;Y|Ct=o!0 z=g^a{$Ujk753`p_y3VoQOD3u=>-CE;9HTSB&4=_K*b9JWuDB;Pv$`YcyE}VNjlA=rAtXL!EpIrb;7t+2%EWEPnmei}47s zT*f>vKWWbm_NqJ((3 at oqHYOr3j4_cL5ualsEjwV_UP&0iCemcBHHA39_rOwozgC at L z(!|8i^EAR)-Q9K_tU=yWOh4&lSM^2yZa||g)5BU-**TM)dA~`0*YbK*v0fs>*W>H1 z7LaYl%`C1E-OI>kxScHh!Q-s+sGKE&Stp%;zst7Rj~g!E`)$zWlWl*(>J3wVrX6R{ zZ+xmttiX+|wxeFZ#PLTsUE^ZsJwAJH}>vTj+{shK|_ZU2=B z_bt{VrLO3b^TYV`H_iGYI)yrp{_pe|l3ks|H3T811W`Y}-6*%s>p&~&a?aUtTxP;= zB_y^0>2l^^BXflcECor%m=Bp$#RC*7JmUEr0nDCYUE=n)-*I;l zIwLGS_x^-+SzxT(O*cNDjPjG at R;B)+{Q#Nk}bp6C5q3o(y(ZdG~6yE#7u?q8{zWQD$cDeo20e zQL;;Pib_6%8z1#*F6I(xmmL>SiH1X{yL?HGjZum$o=h+iS7NHwoB(yzQ^Aq)#1h^M zD-$eH-Aj`i$5hEpYy{m%s}VF08>mZ2o{@UaPG%;fd2?AVyHNYfn0SXxYnXH=4;8X= z{F2NRvO`Y0lXyo&yCbPYwOmxpE%F?YOd|b!CPd4scYg$XdVj6(Yi1ULP3jHtpIz0w zY;g1+*{CTp7}&S}wyXXh4y~n*X%ebq4fn2W6`Yj>j0Kk$b%g=aK at v#RE2l#a)GGNffP9hHI2PCbm{EIg at dGH-GWeJs|1_G>}e1Ht^Nu($q{-UhGR z$biG!rqy!xVal=FD|uoe&9`diesZF{1b&C at 1baPl`@QPg+hupS(X_?%l^SbcELJ*X z^oRGfN;z>ek+qGZ-};?G#saW*F{Xpv!fXD)CgTK`{3AO@*@`Zbc_bN<20%N~&=t^> zF{b4rz{Phk{WRHeWwZW!&tcmYVeZJy%q<1Wv?;+%Mlz!zkJ6w7%Z-9tO8Jdj|IQ|l zVE^$gFl%g;@9)e0 at Z#TDcJ}2!`%VPEv+YkOt>6dl0T zB)Lbh8fO0>a93sNK-cav`*CBej1O-?$6#N?YbkHkuqj2_G2Xv(qcO^o9}}Xd*F-dG^EjybK2Ce-CKyu51bakWHc+xfldx>WEmu at 6l(6 z)n{={(=SexD`{V#*JU#&ol*mr>uquZPE*ADL zYPt^14A|z{gXMGdHI*eUPt{g1#_Pyhs`Vv>%Fn~gxzSYZ3k|xP0~2W2Fgn0|EQ-M~!_DT8U#*OWx&b*ZDHtQ82Ee zm>U)9Apju}SkBIdQM;i_J|SZgow%(OarJMHuV(&YkFaL`Qja6xt6}#Ss8+G>(gbyqQPJ+zIJ+)CY%pYV#e&T3VP%2k4*KVL-dQEv?xi?IE~lB3>I`3)u9 z>k&u=I+DnN0)jJ?(}h$<0zGB|J;nk(CIUSc0zF&x#FCD3D+eB9g5}7gAF&rCV;{K} zB%>d+U|&~YeY{gngF1d(1hCwb++U%$M at 96OTlKc@M at dN_5;dohapPUP z<-EAb>jL92*iaGygi6QCF>>hUBpSvy7>>|uX0z#!j6w1uxCfXQHLxs1NYN{KiVl)kAjYien9`yAQ zeHP}o)8%WhawgeaCNo;jX4sLA6(EjQ0Q;1dN$d}5a#=#C_?%a at zd57$yRk=RYdE(! zf4LtIs5ZEcgV7;NBNn2W6QHTa`n%iVRs0bRnS zKeC%k{pKP&ZHqN=^u{MzjbpFJqRb|v;1kTGq-78}k7cYSIw#>0D-9Nf~axB at 2Hz1SASJfE-iL7gDe)<+P`}5_bCUN at Upr= zj*ypU2s^7jd3tlfZAhb6pK0_BPKYJshdRr!y4I7sSZelZSoyp-O-NEfCq1Mma&#hS z at iFp!V`fqKv at 0In5M4&1cmbC&euLE7!z^}xpd^*IhBf};JHp$jZj7nOJT2N43a%Fp zSdLJ3C`GvL9}WwBLMI>D;EE#qTSB5#l1Hjq5E7dnoYMa*ULZskfK()H99|9Z1d@^E zsPje4<)ZVwhO;xYR6`ApTDn{`W2-_?zXy`NOXNLJs}aF at vL{rEq at zcxsHaNp$rR_$ zG3`rX35slgEkTM1r;2SrbH!eB=nXwDc!F^{MKv!^GfvF;{Fj}J#!vovO_1s>|EsEJ z{}0u#*)4p-5;$N`&=W0ESuRzQ0izD+AmE>^#GtLgqJm0kki+UrM^?C_#6^V z_#(xB1OA4N@#Ts~L#;(E)$&R&&--}um!ZGk2ZRxHT-4}6Ee!S($7UF5TBSr!W at JYs zEFCf1VH{)K{59)jYizaY1X4Q at teuO=)h$aC;m4$_2f!B1Vd2k~Rg`gmdU*8}yIHGv z9J^erUY=0gt3Gj8O9!#1h0Z`rmoL4;5wEL7ktnwrSkU%^FR_ic2Ege~O{e8FD;6zw zM4s(+fLq^~OMz at V7Q*h&;5a_*0&GCNbkKup@^=^fDT_ahqNM~REHpVV8T&uvmMJC< z1V!ie=IDus4aA-Z)ZsHYD~pEsC)_7-x5(`#x}t1XZfj^zq|TCh!9UafIu*-6W#tUx zpaX5uVYzl(&8JJ)r5U7EDwkvJy~$jBE#oA^3d>BS!y?Ry#I5*B>kCcPNAQdVt&3D*tYSs*$I`^Ts9EFnFkz;dW{;?<9|eCiI at eLc zGPa(4o2%a7AF-%d0yFbbSzmd3?GpV$gu7JI#K8NfKA#u{goWKfj{3?WTG>O zbXD0_COqgHV}z>4uf|$s5-YsJKG~*Pry<{OjdUwAR%F1{*|{xpVjp^ zu*xC5pjj^)+HSlU%+H--;4aC7ln4x|vlr%c>+a5P^Rkrrd<`HEY zOF$uwZm4cuLQ=CoI4;emp5*oYy#HM7iVQ!sS%pZMQ(ioG`6#`{SQC+P%1T?OseOe< zu_-YkpGaGA5$Zc1%pu0GDbXOn{PcQPc7!ZdAxj5aC1I%{8as3 at HUdjbyvVJ6C&vH2z=W%p?Pvg7^#OZ(p0+8c;`x5Z;Z& z;5en`A#ys4sZs=?WW`bUq{X|!lvE^d{JsRirU5U>c#_4D5~^i0Xli%y50z9%;3>zp z2Uha)qww)(!+w4=f`}VE6{kmR%>^;W*oe?XRX2gzj*@2-A2RXAxu+Ns$+xRLF zeH+NyGm{`zzANDqkMRHHpM2-O)yHU7FZ<`hd6xI(Q}259=7t}Tr(X^b>^fu2c&qP=Gr7T# zCIQot48P=rtsdGDfy+{3S>~jQhGUoypVJ*T%6=#w|g>7YK(xX zUa~)j3Hc>#i_aZ(9?EtPG&WNBe)+dVx~)a?B8OuqGwh`$v at K>Bojm!uZ zs^IQB6H>tH{<*|63{T at NhBlhalxDpFv&|ICT%<24Su1nBt>RwZx#%p7&M?&A`%wpp z`Xb_w^;SnbX6lR)AI~K7;D)KT($$9&!o%>T+IyUfvfd)5kEhA%Mog3!$_G1j$1Rsu4M|C4SlT96(pqrN}Wf7-k{t3X|XNCdzk>eP^g3_wzY1&{_(5g>rU zpmF|CpGneGyP00mfgxd`kDjHlxkWm2IQq1t=n4lWp^4PjaMZ+cIexTQ<_x+nl65;j z%3!ZbChtsnduc_W>Zy;9j%KZA{CwV6gXw*pq343n5qNdKGWF~WgX%pLAp2YG&ic&V zo$!5v_GHHN4(VfhY=Oh~91pJE#n|{D+he?1Lw=OP`+df2ex$MK$jiz~M*a}<|4`3=j)k?|`a3GoLYTPQ*LqEl2!&T3qAZY*9bz<0qXu~GVI<+h*EupLNwGsop0`j6 z1PVL;42C}=BSPeDVMqnrCPpk7YiStF!o)z|wH8Y_7vaJCj?8rRHfR>=ET9XEev`4> z&#t)VCv9RLkSF;<(HV at F-!2HMuUh=xr+%J&3rgjY0;Y1Ls_7a zg~wZzn^)4Yv0?+q=>h}}?cH3wV9?v4ByjWe`M7rIx7X0{;=&P!7#Z!9gAcU4;=-fC zi_w%ZCAW*4QlEl_=jRjgnCdnb;XC1&sHZcp24FhvH+azGGErHN7`9>Q$D){a7Bpf> z))DCfs$yjl6pkiSU0GJVBqfq$79?SvDtSpOS+?IvMT>NEnUFQ9nU5YN%{?>7z{eIu zGCM3H1p?xsO0#jw6~+W?UP}4o at e#Dl%1-R4YzWd~6=eNy=TluKiaeYQ1|tW;;}SO% z#-h-Rx=^?)%C_`#i4nld#k at 4Co?OV5C%nA^CCa4QOp9(>F!!Id&^%`^2i96BdT(@34K9Q^hQLGLej=|UQ8GxrowQ~^be||H>Oh(&mrz9KJI|D}e z!MW3f+9_e!)Q>(Lvf&)9a$ixwQaaaOz>I-e*BiVYboc&J$u3YE>s7z+CdQ0lD3)3X zL%~flb$av3vN3~`po|LVHfsw;R?IT%JnC(u?ZZME&TUAq&S2CUB*KCe4ZHCE zh|2_Cxaule{CG&+Th{=o-CKdvnEd{#jNV>s>^-w;tmy at aDkapPrf=G>&p72Ug2Ra- z7iWS&=I$p)-jn#MxV89tbVMb~1q5GjeA at +q`^Gu9_j=cxXyWCu8Nqzaxe>~2=ZrVu z}2i=Fu4Om zVn>FaX3Lnj&NyLlbzmXO+9(x}nsXtYVq6DdF{g-3lF#6UTG&HeOEb%0q7`r$|NJ^@ z*Q3}7IdeAObr1`oVxCqr4UU#|B6C=6_sO0Jzj&Km2~;`$gDxElo6bFOFO`{ee_OAX zi$Jk8>8_+S{$V8 zvz?^!kPu1Z0DU#$7h&a*(Hy;%NR9qdL`!IS8iI}{xm5;J-MZL^qZrF=kTji1am0$FMWWX>p z%+pZepx->Dn at OMu<*8VJDy1d`mql(qm{-__@%X91=AME9B=^<5Ll=(~+#-8i*8Q!l zk_=h~PZieGMk$|$??d%Bk1ILyN^RPjyBSc2qR{i}FkSzc2iz=la_?e>O5U|>0t34$ zJfyRR-c(oThF$l8fc7kH4v?6^Z%$ob)`)L~&FURyGq|C`AVco(n^Jmh(17OfO~9&EI_ao-Vx*|7#^a%*hs009dY95Hht at 23Nt`oT zMrz5%bz=EvP?h=X%$29hNp?Wt1PL1gk{ztH at hts!Y%f)@I6x#(Es(@6J`~8f#3%u( z7|YLZ;(}K_XA+dy(4xU}+;;`7Ld$K`t{d z(Dnk2 at yv_FRXXBD<`vjBoA)+a7n!D}vs1&P_WFUB)M>crVKix**1dMgV8>SzM^AJE zG9}-P0(atclfbKXo}T3l4lP8oP zGXRu8()DI6`N*gM9;jmIzd5fD>0x;(j?#v+sk?P5PR6WY-EWba%~8hi{F;{b!8Tzu z$58>Ejqt_kvwmqqkiyr6Nnd#e*6uzaJLsl6_plyyfrC55AJjmV%I|TS9Gnrkp^sit z&wT`zOw#xBqN~OUsoDjsmmgl%C(6#)9mq7z_lBL?kKzWWp8mvB-|PRj3Pc{`Dz~rb zfDzt}y1lH0)(c*3DY1J4 at j1{~Dz4IO;Cq9KJ2b+ClqyWIa-novL12~WlLZ2kJR}Mx zdPH_Zpf*5qLJ)+ZbPJjz)!ejf(iUFxYqU0C1%n{BOun5$aD?a1OjHo(fOf8R=COiy zjZP-UXb48i;xKdOz1~3TingJQ^KT=@B&A#-ueV700M4XvvS*5XI(k1~cyv6aiyT}2 zeRQ21LUiDh^kS87bYqfa&t}qKpJ+o{Li9WN%&l at hZW=}T`&zxIr20vRJj#Txf88;c zD}X7xSV;cv^P?WI%<~#A*9$*qk41jF2xV2ODoxQ>aj5*XWHU`_0kxK!u`(I6Eu~_Q z?mMCNMLEJ)r!84?2o;)dudhtmTB+ix{fav8B$CA;Cbw|qH&%tzR!fP*PI8G(F~x;X z(x?;KY%!5;^*{|!)sjVoz7XTDkB%PzLO<*`jwm4>iM2RN#=0_xH;w9{?B`^~QRUEN zhvn9?*NS+|y;9y`B)eJ(cj^Q=9omKH6YvW(qJ^YQ|40P+q%UWbGaf^J?mCG(%^7~} zVws$uVx+U=90t7O+`}R=cJNs*H_tyoE$9vH^SY-ic%myDP*zsDA=gnFN{XjF^hGeCR zWxm&&AHmJmRTDdA-R5_Qo14uA>>Ug3)UQAy-8;3;GaomUQc~zyI%+ch+|LqKA7-SW zcpu^Xd?LQ=5Dop2spls{=O?^OE=ts)834Cr8g~WgEfkU~S}##=9PV=(Zb{uwL88*l z|Dq~+W&QlEE6u)kH0KRU>RVk_;vAWNTf8Jp?e~z3JzCqI zLYmi{&kta at zP@tnHR zY#eumvavpRyEkZzeUFS)i*8=RS=c(H)HbBnb`Z&yJF-PC*_vCSW-A=)imZD1*&t~p zMy&=Mcf;;-_vY-CzH~8LH6+}I`+A{D35Q#kO?kmlr+B*-M_k at 9JL|+T8 at wVpt`SP3 z<+EusDdgUeI;Y~su3Is0KCW{l!wj|4T9+zBg&k{H({<5VzCiKR6J@<+>assfVc%*= zH)eakT1Yn}8VjoX1PXS5zp(X*<tjbFq}GH)d0QpL at j}%y6f? zs4l)O?W%nF9n96&FXLa`G758W#L}IxephZ-yKu=CgesOn7IQK-^PzJ^utnW%@e at Vr#}nfT%;Xo8xf0Z%)G%v2 at Vb<3o2#exRob;~6#u=IVhv{WlxU{5I-! zp-eaH@~LQY#^3+&3uLOr3{Cn13R?xSc26MmvI-ax7usVr)~M zfmpwZq*~Gx3c90JH>fp=x+7sX(&nqXkDFUdF6n1Ba7F8K6b~;cKYN_!=*o)P=Vxf& zEF{NiQ&%51I)=I4T(H`B#Fw*2&25$+*X=U!y8>N(S<~hi0-p4TLZjNhyNF{azBaO& ztX^4y-Y)Ox9Q?_;k7kp$a|!om8}6DR at arK@;%~(y+Z7SFT at 2xt+my zW22y+gkExD-d~rnL*6+ at -BU7jQL95!G%mHK8&yI|YFRZ7e#5oY0-Wm#vi!Dk2&!6P ze86&g7yL6t8~fABQLwrntQUpr)nP*|?_4^2e?9pcNV^!8enQgfdQLVe;UeWS3DT-k z{AqV|L%p_vPE*w$Y|ETElN8an4Ao{$4W;`>;mAt5L$l7gxd%>NC3$>ZTm@$4)IX=j zU;1J;aqwhKP8-K<=25`55!@=z*hKxO8qXpzAp&K|=?E13DQyj#cXVb`sC&z=@>bzB z7Sbj!ij(Q0#SqD#2f9hebH4u*NxrArtZrA{2ByxbE5Sdj{4fQ at 1pLrH|H_1ZPkCK= zU&A~O`^vG3w^j3C_P^bsI9=d|kN*9l0sOy(!&=(Y|F1rb{}y>5T{$3tP`zUD$(xtY z?tsh=XQ#SJ2?5_IL5DEN5IrOl&b+^_;{gCq+6omYkDXadS6TVt#G3;sb9+&Aa1b`9 zvJg6hHiHD#e`=qFgOotpfwX5vt;|i_oI0w4rk3S%Q#6?>QN`0xn;fjg5NW&u^5F4) zrt1?E6-}+&v4HvUG5aThI#OoR$!8Tgv|=67Gs^kKLm7XwCgb-C&Ok~W*`VJMIB zPoea at XvtD>JnT`J$FF3y8z82KjZB1^}LWoT7F_F6!);Nc%Du7m-&lCPawJmckS zLx$%tDXaM6&)!xd;K9syr*rh>`|}P(fN;^m0HlU!sD?<_eK58N)}@FTo9+->BWCRz zgS52)JV$)+Az>WEI9AmkWY*ffNAQ0|W;n!|$n-BV=6{i)`+q{_pF<#R6Q<>W7*Rs( z5i!0|LXZ9)?ZNQK1*t2%B0eJBoWF)`5P7Tz|TXL-9N zd;R%(0e121XxkfiHv+MNGUDQ?#RzO)w2gT-l4?ssF0o5YV00;g#X_FDtyp^%SAVw{ zJQroaEVte=6cGkwufGh-;YsXWgp1=gSYCi8Qq?>)tFdHK7g-vZIUyIt>L8Y{2XXqA z$q9tqM5~O2?5vbd>(bA5*XYlNeg{sb5^Fce$!DqAlMuO&na#XYs>HZ at drs>~Y}rzZSfv;?t{r^C^g;x~Y^Ls#O^ z;re-nR7v~@TjYFDsKkQAM$%6O2tcXj^_g(O0uO}wWyn@)njX|;NLY(*oN9DE%JZwy z5EKr!%E80~hIPv3Y>ibRjR)W^%-jD{9&?@l-{B{;Dj0%sZ{SY0(8 zqC7mp1Mx|el=o=X1{zpS%ej>^%h<)8w~UC9W0&uS)G#d)E5`M3+E`W$`PLHa;iE7! zQS!ci#lg|!Y?;M%cJDd78DzfSN*2>cqK(&i}0moQsq8fRQNRkSr+jJ|nUC_Rc;p^*?H96$x8CCH?SsH{g*slht=m5xyKp}&c z40s2j%ERV0Z+rXSnS!V?jSLJnErr1bo4J=t!oXFgt%RrB#tAMFpE_0<-3At|rHy~eU`l|Ip+hS} zc8-dAB(@)Vh>EwF5!K6h5}tVgrP)xy7(ncs(Z&PzEvX}wgucxQ5^A)Z5 z1>bAxgKiL}BTT-Gu}H48;`PguTz?oyQ|-Fo!7q4}ZjGphwQQ&y=j99JUy0BfUL61W zmjv11|0b~LzliX^XrOBAjwOoX7urUeB`ZZ>t5vi at B^j_L)S^X8(qdq(n8`vY8+~W1 z3ASdkKE1AM^%J at Ch^+sFBdM+Lb&k$EieIw5PD(<$nHmH7eC6S-n;ZSNovN_25@=??L0O zdAjaJdhPbH=|jNvsmNWarB>}ZprJ%;coiO(Nz|t50~Fn^D=7M1Mxgp_Ww0%1-T^e| z$sLv=|Bz_EJE!T8BV_@O9kSFdxV4BiLx73* z6Z!cr+De7w~;;Xem6`&Eh3C2;pxcS#U;oH%83 at cI4d zF=tA}j)h)(+v&h5V^~fXxM?Rkwd&x7BC2}KF~N9Sm>fWBiPu8sGCB zVzbQs1ZFludJQu2_#Ib4XGB6Za0R&!h++o3V;Gov&xfQ-5`1WzzBTIdl2_~hY#D0K z at i2&x!mXe%!V;i21Qq$nt~x?hQ at J+4)s6E4u7XxU#aW4t?C?>%T}UsI*=DR*_#@W~ zrWr>Lnr$N`E`>)b*e$-9x at K-u| z{$1ADKcqv*)y(War6WXn)*f3F<$HwNntPJWHHV{EHc)#4-h6R|7M3o)xI_}$ph}uLwtV(iX4{2t_c3~9xrPS6NfD2&W9CMi6d7G{K6|kOx)6Z^ZiUQ zL)HK$;8{lxu|vMo>h}PhSL+Ui9<+AtPWnZ=-n6AG^kd7_QYyWLo) zmf=1b at f0|#*qXXwzI4tqYMJYn-recAT43eXRQApFi}+FTID+Nu1wu3$YLnzhoeTK1)Mx at MYH&GsWQ5Fjm$Fk^2H^duyspoK;w(6 zIlB;`kr4W-8Ld+=KkksG&D9L|PR$6Y)R1Aw6{GrA=@~B?Attc7Kh0m6CqrZI(B91% z+ZT$ESgV0 at Rp&JA+dE!EEja2H$eb|HUElazS!;3C5rQxo6b1uBqa5Z&aMcX+_Vt&3 zaJ3AMD5Emjqo4tw)FLQjmvg#$9T$Js83u<$wLYHO1S at uRHKOmw#@#<<_zQ*zogkr5 z-T@*cZ&)$)n646eBUHRhF67BR*pBz^D#V?UpG_=9M_xR4R!1 at p}*(wKHY-mgAXnbnj^WruwB zs{0&gN04)MVZ>nV!iaFCcOf*JnRU9e42nkX`>JrCTm*vi+$l>!z^Cu ztLSGJg#%BN>KpW5hb-%ue%e1~`yudu6IvnbYU5)0e>n3>l6K^=#Sun(z4?r7 at DU)` zAV~;IOYY#Y$SGlM-x9!pD2DIIVIQt{#xZZYNdb3;x zx_{v|%=%@vg`{z_%cM+^(rwkS?}<7}rBvf(H~$O_M6Cj64UUN4nR{(x{*i>twU%fq0 zQNU8LwQ32rHh@%?R#^9h3oWrrGzYeT>_L6-v*;}^|0mY41BW;hoxb2F+(eQxL_h8n z#dxe)inmxz77(r|>K;tq{>~>+a_8iXq`wr!0)QDSFt^XbiBBkeRHsCp&Oe$C$)XMs z*&`sqr~VA>74~jbVvJQXzew#ppRXy|nInvQZ2!8Vxr2QHij&K51N6FBy|?QTKU at qh z at DDb4&26_0utQv%w#nN~9 at N$jp-XHG64j#!hE`Pe(7947c$txfAq=7Tn~X3MVKSP~ z(^Rwte_#A!Kh+anbT&wj5RXC3y|R#>ShH*EE~54W=b*o%l^&DffZvK$U=qp3?OU=? zxbH at x)Aa at cR2m(A(M at aag5*M(MDp3DpcKD!ljIw!WzX>vuh|s&ly&2?sVFn1h`p>m zo at i{m!iKDqrBtUV?ZAz4q^iB~Q53vpuQ3^>EmivNtA)>xx5z=56Sr6N_nVB*4`^YA zuqIpJ14Y3M5}N$OO!h|^oij>}l_e0!8nRaRtW+E+ at sPg^40 zUB5uBVptcc;h$ame-#kLsi5_LWbm*26%nF;7oYxLhH~XAx&PQQ*4eJ2QV~!PP^sCX zyOI)qC&Xg_NhVPdvdVsP>V}$*xs|TNKQ^!^O0wMj<18tsWw}wym7ST}`DWdDHhc5! z{b~^%Aj?BT7_`ksquthUOAOK7CX$6_v&CU{z&G?96CQh%2?d5ZN7-+Lx1!s3gWt5= zMw&DUHq!25-xF*zcpnkzdcP=5MQF$* zC2sCf;vn*>=VbhIjmq5)3Ax9FkW^rFY&ffWT%7^n&=SfevMUaaKGo3WUd|DP*}MqD zubnWXbo?|s{7;ueLr*WpP*GAn`S8!-mK6K+pZb(8YBp_No>I7$a>Yu6r{4{sS{)KW zF!`sZTDAoO^ah>S_|yOkap6JToOJk9c6GSD8PV)EaN7>`XdX zH-~h{a%%~vl)vEql{2;N>y~Ih001x`|G%7J`cKaM*KZoIl7MJQlcj-4=$2^VB?MF< zRcllzN#O+(PO}bZuGMBX?n`b#B|c##Xj26CfnOkBb$bD^KzQdUmR1&)^(-{Z$?&+ncWSTMhNZr{I9#m|m$qEJ26L)2 zkivA}FgAZ_Lsu-phG8|`)Z$%(Cv3=!fgsaDOX8mb_rc?J^@!?FgWDdv<4jaAQ)EE6 zj?M^-5sgdf*?h+BI7QjG<`z_N1sZVToV964ApbEGLoQOae^;DDW|+yalvTql<2TwV zIh0f2)xYAM78U_vQoV;bxV-4JlaRZ0hVQ_x7_Pe~NiIpezs#$DYcEu!W{L40D1NbM zX+uG at MG&LYlLJ{}Zm+3`E>TN+_AW?M+%}o?Wstwu5P-S{=Ay%7u-h1bS7Fq($6KnX~{3dr2R}2Ha*vU90`E8edtY2StQhGuJl@$4ARu!h2 zxyuwI3(C2uLIl{HB**gNsYL>2Dtn(xm?m1ea?hBq$}cv&jQITSH=M;+?u<*Gho!ZGm=B&j{f2h!;@3VQeOAZ7TJHWYKWfe_5lR|;F1df zfZ*S<>VLPT>gX&l^PfyJ*qeDk248ZEAsK{{Mo7~TDiRPP1&H*KkhF3zz%!Yp_iM_` zX;sN?c51Y+wlCqfG{k5Hgkzv zI?ZyvY(m5PyMO2c)C(x#q(^~s^oKZ`@FBi^WGoYCy$aOg1?)LV) zHX=_wK(b5ax^v(W8i69Kb1_1ta~7hbJ6W|N)99a0*j!?mk>bW9HKq+(VwB}&uS%bW zx~@6ip5L_I)gzv at PQ1h5u65kk(iugVW~y}`FysgmXLGpG;Qmg}jXR;w%2p`yy>nh1m;IHMkK6g`2_%iWueTP9m`XP> z9kFR+#@XhuI6W;1_lhQO_MXS|MalFXokyYx-Lw{2Hu37roohC_m at _xxWH+quU|)sY zwufoc$9(0Hiaa~w+|HSn^4B(uWny zsM;^Uu at 5P-;_<1t3>2RiV?g}^>XT3cks3I_3b9g|uP!=P`2 at Q3Zed=9Wp&^DZb?$c zwsw41cNgsQSqra4jO}X}jM-w_KeG^PP(N6gs?^4eLGc7CUFGY?+J(`NsKCx%j#q~z zR8CXQyX{z|-1?FJvF1SmqB$y% zo{ELu-{B*jwSjt66%xig(^2l at F)qQfqWV%hDA)cyts~Wb$HMT=(=Dbi-iI6!DsiB?16;^s7b(~{EDh<)B-u%YB}sHmcy_ly4nOJr_>zH6U;LNo zM+Ib4PiIiZ4=%11fb?%aUcsR^A&v0!Bg5I=Yc5Ykw?)l928-}e9MuW^*pItdN|Mee zhAC6I>{gISsihBLqBv?3?IK<(jcQek$7!wZpne8pzUT3nkZNw?OOXm=i?WpKIF{H{ z1j%u1Z*RN-u}ZdVCx@*D>TP3KmLAQL zcH8b7!u at i=U61>Mksy at wBR3LTy271Go?MK(a#o0JPP$xF#o2k~S|et90>O8n*i^{9 znabK)wWG)zbu2V0o(eEW{Ts!C$&=+MvQK~pk+ECY1!OVvmd8*flR5L+c}thY>ww+Olk8uGxX z?k5z)IcYOsAuP9SoPJMJF|akww3DW7zrwtadtF0l9d$#^!HTOBwGE7 zi6^Oss#sP}q$bcBKW}a&CEE at Q!O<1oQO=~mBQ1&89}AUPiqDN$09}GfST7K(WUI8z z8c?jvgi6}b=Gc+!sa+r(7!ILc$2VFmEiNR^LilFV55p=gr;?4tQ~Oh>vg(qylHiaF zr&_dPrBIP1r^75>EL`v6^&4RmvTQiLZs~4awz}1AM33fxHCfc6U2ap6f;He5R^`3- zfZ;Rv!x`PoS@;4z+JWkZbS at k-k#K at yx~gBM0YuD>d}Io7l;N38Nu%HUSYfCyc|v(= zd>OCXk6DHt$60(Z|S~c~{w2(RG(Vr7UPy+-Q_UG+85|3DC83Zj$uZddQpdQ=7a_x~}uR5k#A zrsnw7Y0{VD-Q5NXFXBXO&W!kP2 at aGl}^m at pQW1BuigqCa(_Ao#JR;Q?hz(I ztY5+X+DzZ1h(5m4fbZ+ji%7>(Y at h>_1X4DC-;rnhjw|Yg){4p!UK5Vt-tCG-*9zuaFwb^f~pkJsF-#pagihQ at n0 ze%vwX`HXn^!t$X}|F6|Db5GGFw?n8W#onFflyg_}1*kQj1PZyM4#_K8xi=xi{S(|_ z)JeZhzqT?1W3HE*pOog9nKs<64{fM+6+Gf8O~mtXH>=UfKt!0qC;2G`P)kg)rHOqB zW!Z~mS-RZK4>lF1KkMVG#;00=?Pkq)&_^eR>3iDHgzw2JWJE{JNR~o^3r5yXm)A_S zbi`vDk3Ix7QP_OOaEQA1N?bfRNU$Vs9TUVIug@=IRANLon8;Y(?T zKltw?o8R$#;#Z?u={nB7K2Hm{rM7C^ZVR5x(y*exW!0G5hd8+I?$FjmI?Z!tZ_xdT z=rl4;HN3V2zE!i;micA)i}KBiXTiyMLo$x0PB#yaE+`_OpI|guk&6A!RO{?k+-7Ma zGqvP7l*rFPmnY8*Ne at tNh%Yh&I-cw9K>`7(xIVF-G1!{QiJINB5R$9Y&!FkCD}zpT z1W-_#W&26kO-aIKsj17;rRcFqqdtVinU_5 at xZL=47-O_+z5?VAq)u-YL5%LLQ;&)S zFwUrk=j*$SG$$+HH_YVJwa3~I!Q>o2it_5=DJY`R6K05bxuVJKp7tBDTRR!NnVt(KlvCe%ejb4&v;b$xJ~w=fNpaGB-Ki!MX!* zMiimg at _oq#%+!L4#j$U)9+JcojbZcddAUZd84nZt#l>)Lt-TTu8N1z%@G$Z%50BXr zs&-ztdUW}0r4Hax2cgK43}+)o*UaA at jot}31*BV#jIZF3OLqZhBQ)t- at A-*+SMzE`h}#() zj^M!wzA4_3IW9nmWBg)RnKIVh;Q1 at PGetNwM%Nmv046oK!8T?Lb{OlFb1IF3o&7|{ zu8-0nTP49Bm^!t at GiBt9YdWcbV~msS>%WYmgx`V$I)ubE1sj=8Xmo4urfbi>82V|} z*pMz^f;Kc6Tbg#I+9TI2cGZzzSsiNNdV+Iht_W@;t^w0cQtyp`i;2O`=4dMf^~7(w z9lGH<(l5uB8Yg9~vgo!UElj;oeGkX=%u>!Y~m-at=qop$BACDGoE_ zaFM;N0VT$Miwo at lvY(yKCV9T)@nGxtGPnZCblx(>*K`|@uAAS+9}M7)nOwm1P37=7 ztl&OtT_h5c*U^&&m}#b>B-u218_Hy;K9*{^ce*2miK6f=2kXgdsf-ruNld~y&_{=T z7=T>{@OU6Z?h;Z2gjtRh9Y)5 at cai5q=@JAzIzcJ&;MufP^AQ&A}j4G6ULZV$)X1 z41E)MR9g91um6EhH$w_}_S2QjmLbZ+tnBb at 6~y-Wbj-H7S|;zN at QLnpo|mVL;XuxT zRa+-!TFw0cpxw1cbkJtBQGU-QJ%rg1Z-%LUCaz&d-fHZ_Rk(F7>5FOchz{%5J|Kl; zy$K>m!y3Xs24maUQbEUPEjgymgbF-~V?20B5KpmnPht;aY0jFmL|P`T78ny9+iffI z`Cwoh at 5rCp2R14XQzf_+5}a5PIM$-$-NV0PHmHTwbWWBnN$Co3oRv{cid-9Y1ToD4 zU&cWA!hx?PL;Y-FGhAGNiv0^zbX=`EXU#QT?Gh+wOJQLeMG>LbsFR{W5|aA4-QXv< z);1^OYao~*9O1(P>oSjpc0>8LdFD_Ft7*Pz^Qb44Q&Ghx4CVq(?iTft%{75_)p5 at a zgMWMip42 at t1rIY7*DHL^&S5S#U8Tw52Z#rBWOtSTdiEEj2bs)ZQ$EOS=$l8aq3*;U zrtX51hg$U{2*s}x3-rWtu`FQv at UJn7hn-!~ZYl4yXUdT^HVAO`6C5Uhu;;(bzADK#>s^5^xX5~RwcRI$ zIQBj(Fa02HBQOm?sBRG}Z38;gGXJtb(Lly}&~L(MCxYgI$y<4)RYB~zs&}Op2xS12 z#f|FI0H8F5r!l;ARtQ$c2=&Bx5r^dXTDLaNpsPSf4vE4oON!r-NtelW!)v*vH_2fL zR=W60tH1F9E~ZVQRIMvCZH at e0sGc*ed0^apKu~-_s~>R=cOMu~^?wE3i3$txilC3m z1$O7gEBv5N9>Je=@SGoeIp9O)^sqe&(1s}ykFPEPi?@Z@%Kay?@k0 at c$}#C1g1mMd+7 at g%UGX#FA|^?n10m47FC00|2fcQOTZb zOR!QRKFzvK&0U(xx1P?|v<$SOys!oQj)m*tQ!6;9wBDN07+9J!ziJZlMcZ8z%lwU!uiw8)HfO)<&vhy^H>2maO6zb5 at VOR!#z+F>ohWh}S->zLe2dez$JN|W~nV at T)76B`E`x(hNcPr z>8cabfvcUe$-zyNBsVjD(c>YBE|79zm_heEfaeTpER7Dd&7}jugVJ}lDA}?EDy?li zGW`_w_vvO+gsn9cN at 28{k_i_nC||q@#4v|+OSsfAw##YdRk5O)EnkN1K|E3HCg1Iq zHZr(mj=1wfxOA>$l64>1Jf+I-Tp2%LnMAu_%Z1owT{na5bIu|1{ z%l-U9Hw|Rp2!(#e4Yg?ZMWTm-JLiRiSG at Won~e-zE`V>o)8YhyD*_NoZ at 1+R_kKu- zr{PY5;CfuSd^wB?stMXAxt3#_^Pn-e`loB(9KFK*l1dBo>~IIpWE4x at DtC07RFBB~ z(}0Ljcx at 7mKhVmNPKBNM+K(xP6>8nRFFa^x#f5wv9owd7L3w6rdVon`_wSU+t5GdR z1w9-m=DrS8s+_~Ee6OCqH{0@&&T`2698Pi-HzC#8i&3nK&TPx*@aE}Hhie2|^0nUp z93|ogjgJ^psky;SXOtRbys*^8=DQYWnh?^n{cLBT9Qt06bV+&vdS|NbnqIKa683!u z3t6{;k8E93-N5#eHv^*!-nSKxhBj9dyBs*utN|%%zRYIxXJN{xCmgXO0Az!c=|KmU zs%C at E9Dw8tRL?@Va)oth30oYGES2Mom6VsV9Ih6ulJHj}Myc(Fj;3jk{qz%M(&`FJ zIor~bzQ3P18lyOedV^uks1=IqUYHV(?7pxL2kc0D>aUv#J5vvc^2eysd9h7|MkFhnc{8j6c_-27yRG2`TyhY_n%w6N>p@}ku#W7PQ52F`4=Wm%vy-fXNPw9JqAeb}yi* zB!1z(*dM3_W{W at msi#*Ln3AF4(`^w9?B3r$HV*CVA;E_EoSlTy$rT&N6?SW|!k>zV z{tlxAB;gjTpzqxE{gHB7-kwErMId^8sRH3Cy!NvHn-Y`@vGA04J zLIq?*7HF-mLgvM0Z>^{Gykc07>?OsJR~ zrIQ$rXYgB(gagF2;e_~;Ly`HrE^u)g11lo#t;3ujW z3ERyxNl4$<++G9P%sxd6#+t+`P#KeWKF6nRy>k+vwqRNNOls;%umq44!sJ9^W{OBw z&2;^(VnavN2Sp1%?LF}pcC}Dvi3;GS9X1j_U-B+BF5ycFY^%Y;Gu2ue>= zFH)|(KHn~XeokL`0lff-B3$WEzgGW5=0WEQ(?@UWZ^>UqJs2gYM<3AK2-AnoF5f^K zJ4{SbI`Reu)1eib4J)8ePBa%x1tQ>v)KTQAJFKE2JZ_;yE%@^tCYfj6H1WAQ?5EqC z6-kq2H%6kmE>nva#--z_A8xCgib6F}rL|~PptKmD$JblWFZS#m!CFrLPQO at pwYcd~ zM?=>c;|zYvIlNM5n6~b(SAGC()a!Ug1pz9dM(Awn;+s6NN|53{|+brb%%qw)FH`tqc6*-3m`n$PC%$tMZ%6CBUc zC->#YPX^z*qc%y at NhI_KWQ~ySRGl3k(nlMUqXNmi at yJZ_Yh|c~5{Qn3%v7P8LNoRyR7bWD#3he+spe;pJEz~F&{<6lFCEKtp{EsZl zH`tmlJ1xq!Gi~(Ogv;egp9lS)$~zSv`D`E4NDu at z>2*&a?qY|A&PLn}?xXWZW5H73Hg zXv(ny;706e?FR-`RrY<=8@=P#t_jm?au`FNkklcBBM$k{{92LCrT|8d>RXWM)}}NO zDQeu3v=^=X2y at fAk8%jToVpw26(oHs1!e_Ow!0?QK*$)bW5C?K zJw at Ut4g*}f>n*Lfh|j*>S5a*v2k)zxhX4)(U8?lmR3VaX2_wa*zJB)ziW!aC&&tsHchY|H$1k(1rot#De z2{~+MW!)r+rfXp|z0L8wxqan)-Em~;{d)Y41$a5|232GuKTHbvU1FRCcMt`HH$&kD zNXzi30L!v(42o+uH8mziE=OM(r>RO8+7#f9e)XIc at Hkc{ui_6WDI&uUvN+W>u;p$7 z#bAXYi~)@V^c`Zp28@(pSa{k5N^PTdUzAR{f$XBQ+Td-ih~yQxQbj|+Ws&xwM$cJz zO4ghX%Ub3GqePOzK4#&AbuS&u at b0(oi=m1!a#)<=75B>4K^@zm^kd3 z$6x3tqFt0f7V8-gP at E`!g!Q{=;yFZluJwzB;nHTb#4jhF1jy5gUF$D4Sw-LW23;%L zgtlNJ$ey*VkR2982zOEFdnaS%7l3LKUukuNH+>Fk#U!knjyihe2(pLL=o`NOG+_p- z6j(SHU at TcO=%^wNVoi0G8*t{x-J{WzyJ0yIM;n6<9umQkYQDxq7@{ZM*F?P9sgIz( zbX634-+$Kp+2l1GLO6I779aF0-VMoGvF#H3Y{j+)M#lXuoyS4To| zwY0dYu?YlxlSMDS+fdQ#eSt>*iH%rSQBEp~<1 z7^m>E;T1R=QNgtSJ#2u53;q^H;U9PARj-Ke(l1G*;R)Y!4)%uu=oP06AeViten}yz zFQKe%<97rB41_dbiFl1tq90x$4KtvqG{E(mu$b(^n&|8{wsS0BHgRrjPXCK`rltx) z)sQzB!!r7yHSI8a8^8agh`rO at 8UD37xbelw#Sl-wbC`*mQrS1>k`OH|fBTE^FlkhW z0tCAf!A4I^1WMT!=#_Xqy)=vqWWJB>6JyW~f3}Xu_4gTtF!1aidO25&hSVIm&xG(Q z at mT;wp(*S(VCW6XdlyW#H^${hI{VqPO-v1b*F;l{=+r{`SyQa}%z}mniP~3D9(Z?9 z6~dt+(*sxE>gk;}VQy}YrpkL7hF;0$ulr^tJKMc^mUTjXS~-?qzZZpT at +*Um%+}7# z%up}~o_1x4XsgTfIoBnxY_ykBf@^lgU12*@m7VP`Pg(k^r>yCaqQ>I+hG?Buy^qg! z`sZunDk_UkG0)p%Fm2?5cZjcB%Mxr71K{0oO(myfaJyx2wPkSa$zoaJMUx70OX73s zH0;tu00pcIHqMJRdon%x at S_9Zk2r($<88 at m%~Z%G%XIk%S5Z}8kyXD_Du<$(1e%pZ z9 at xY#Rp;DVfzBgE@#k4(@t-4Vka|MLm^yzZ*Xn{wY$*V4I{*fi0TS5=0XT&c025Ze z67+N|8=iMfai(%lgg{*_vTa4aa(B_a9XT zzE1)wwSiCdc{Q?dQC_XPK0qF135e_?@^U z!ofe2hcNPMcNE=&+|mB?@^6%?w_Io-AX0&bD+ASoDgu48t;1xJXQtQ1Ud$@UK|}oj_$IlTCR#`lIj5#)x5qlp za&LX#KVG{2&FRPwX~{yh)lz3e6wAq?Zh>~A(Pp~OBX}GZ%B)eYr)GusKy(wV1*$_9 zUIdlHnAB2~FwQb4@!ixpZ~U9dIXB_ghC=wZ(;D(T&uuV9){FbvaXiy&czqm<(G&n! zX>n3m20^SLe~QNDsvzwg2Sl*wXue9$l8$2^5e4ZRU5zzTwgY}b3T83nphY*miIBb_ zk1gnJWLQCptQN+4_fGyDGQ%e4tv9_ykxG3q2lH;c|A9CrV*U0a~Jad z19d(vW=dWyjlRd<%b0@;;?FBPw)^NSGZf=?^5L$AHNJg0(^$EGe^QMp&-Da at ZL4WVQtlM=^ZI(8<34j{?gj(s>f@|LiIDe?o}izs_6!8==f)D?9^@ z>J?08am&_fcm&D(5U60YelhtkroSMf&RnnSEdQYbwUp=ox{5`*wK9mVHwUJeW^k*ZA1g*q?;5?NpxsVy_ zPQ_T(^j4{4`?#{o>!xDMUnzROm$b=qUOA)@yN;w|xfY#wPj-0VwVt`{N(x%A82tLz zk`+LhV?*;HMspOdm%@PhIrYs06=pdIBN`3Weye_ at XA@%|>Oky7fX=(_tQTOl_rNe$ z(NF!1cxrL1=sfbRNknN4Iuplw02;5p{i5^d%QP*jFGezd>+VC7)h6*{cPdbBjw#xV zZ#fOEamooVyKZHw!dmO&1_q-+Zwm_mM1I9M8M!gkgM)@)ECpEF0H@%Yt#j%bN!l+1 zJ6!oD8Mr&~B%5HQ%4sDTOhU2!9DNg9`PiMwx>_KftO#bEC{@0j>KVnnc3nE;i z&Tl}JnCHsR4T?bRC4BDqK)hmHfZ2^F;IxOi{)X7iBtsl zx{AUrPfyx^JP%u4M|=oz&|w=5XAyDWzD?Xj^sR()N(9^aunfbsGiNf;6vjPWzqK0w zD2Z8>w<(5dvGgzLuX;9t%3gEwX5BDYqlpFe;ZZTpB~U~L&&ro`_5NYFX>z-puy8+0 zuYultc&YA7-t{&mwdf=OMsL#IJ>{Qn9EeLSWy*-yD#rlbx(F(!u%Bh;x|laiqgC}- zn)yu at ZwtgK!6fg>v(|;xJ^+te#WXvew7QI5yT8!IXa`~o$0zP#6+zWVU*5r;D zPc2?de$aP9t3 at 8bV^_hPF7|N!)iXigga!`9!o(${92i20SyPb5KT1?_^^RrU z=D+DQA&o3u^BEGe z&U4<-HM#sS#-XzYs8+h8d at gVrzu>G+<7ZNV?(CDHgQM8QA-$qlge2Rq#tz1)5*yDT z6Za!jgJNQqmB-gNNENMN at XHQXc+4k%K|U#Hy at WSJi_%B*r1~D?in0NQm!99{0%T&8 zfQ#Nw_3CiDNVQ;VA$L-9QIutzsIXz=mlWI}%)$iR;2c}-&~Co~!|t#_LrV}+O(F^E z1V2xr at BiR%!=yBh?k^5y|6OkJKXUlrk=~ZJNPkJ8A}+L(Wqx(_?MeicQm67eu{5%v z1#vzLqTs=(aXOV?3Qhy(=G*#PAd@^6^ZnoJ&C%o}%$-;{IUP@@+D~~-PHSy>0k{O1 zp at CZ+$MiP)vV~FXSwlf?j>o)q`NsLy`GWP&hh8G|nXo+qzzGI58f|meQcOQhBI^aycXP)>G`fHH87iJ?wGmbS1A^nP=92s&0X= zyGaWB_Gg3Pn0br6RRhVzLwgR#<=$=(Rk_!h at A`%WuQJB;=Yt?4^(|{|3&#`h|P z#FKrh?q#L4MmPpvdJ{zhOb)xww$k}9RLJ64V*VJt5 at svXl&^V{L%cir+ zgr;%`fqpE+o4)(c)Rk4N7mmOH0ML{Co8KM(K;3^Z*ZsHf;$_qyTN6^+bQn&^pkV}v zv}F1!OdturH9j#qJwmg}#BoXVw5g~@KegnQ?v<5|jSlGM6{mQ#%7!!wHO)(nRvMS) z&x&TxWtykn*KYUp^e+GK_p8xVciS7z*R01sr(2FQnX#pRKJN+vE`)Qibgt|TX?d#m zZCJ72szN-s?ezHuPq*go-U+<`b(idP5x3S#_a$w-Fg_#gczX)=0a;HD`B`xX{0XB5 z`Q2T`pm0;*aa{~4z>c?7nYjpiujcQ{uomrve6W*caTo8HS!D)t2)SZvf9+$r3HW#^ z4kp at 6^()$NMVl7wHQI26+K$JbGI#BXBrClXgrshj4NqeBRPS>Ffl8aQ=JwVbPhtYj z6VjO|v!O(O3f#-+(&cmd0YMzGf(iJ)K>>;yE0_8?Dz}OLLSMy%IJXY}vEl9*U&T3^ z7+R^@{dM&u4E)g9eimg5I|O3V`Z4&u(_`00TjuG$i3jHntbbck-E%hLru6zengS^W zan8xYXJLHFvJ02XdItUMPL2ujOkLTax`Grzd@!D^bh<&nFV-7k zj_`X6{S5m3ApAEdOP3&4^au+LRwm4DYIWX6&V-g1(@SXE4H+UmcMZfovuc>Te;l8% zO+$vcpq_?HClJZG{1&RXNCW*Z5eq7bC}&j7;j!v=x&-GxXK5Bqiy27N>2BKdd|b@; z9*u9CIbpFBK^ULz6$6kXMm8}Eln(Kd`SV_MD50E=1IgNhzX4e{E||wuf7)FpJpCCJ z;EOAeKY}5-k5*HUhmtCky65eB`88zmlqE zAh$|rg8Ta`{XD0IeYla}>xwMiYWTY9EA#txd;^CkD)iV&Dw|OY3H$7X>-XSAT_BrI zRN@^DT&Tq#Ly-wis`tLr)CO)>4eNJ=>bM6Cc-e>T-6y1=968D}Ii$ci-`acYiK6Kx z({Xf(NLW=(MfzCU)p!C1a?i`Q at NglI;`7EV>T4Eev|QZ#56;eHo}f_Rmx0oArNei0 z3hze-?RDb at g}JPlMEoT*iIiQk-sY(k$^bWJ7$uoCbV< zVBHp!3qWq?Q1uMfF(zk}+b zrTY}>rB_;l=IdKTf;yj9=GUbv87+#zJ8E$CPx{iQNq{asie>s*3(Vb97U_ at Sg!hTa zy>3DYH+L z)%xqCVV7R1dw^Q(>siUAd8P|IwlX6bI104{HH0W;^#rT_d5-Iq%t at 3_`uHFeV(`Z!`^FHFbzTn-h6Kj+ zVa*2lbQTmy6yYe(!2s(VTY99 at K`--k172olQrSy6`G|3+2#lH;W8fK=6$Nms$|B-W zt5U1NE~T1e+U^($jFbf{>pJA;G^jLbA6TsDf#gV4vs|F7wc;mf at 7DML57UYY_FOcTU|hvZLZD{ zCG~1Cs9iZVM>BGmsu`G_`%0dql+nx~8mlK48G&P|9yk)WYC8Th7uN;Rj!8F2hIkof z at E11BD|0%H#;QD=iw&Q+8`k|BhwIBp+W}IYn`W+@*I&`T_>`?;#g?6pW%6KC3xE%e&=bU z-;Z+TH6gi=X25Mx8LonZ;J=;OCG0_sYX`8krcYJr5o_dsRFT=Q52>7f|M{g)6c2Gz zIY^pSZ8b#@Aah~UawkzvBY`nHv)?$aWi2cT9m~`fI-c4Q zJ2y-ov at 4^!0okq%YK{SP@#*5s{9CKfc~23tarPMyGVdqa8WT-uhHwFnZ#mse)E@*OlB5 zsjG`7C&_h4*KWuQu5hPK$?Bn2e7W4MRDO4jh{ClK6|FtZwCstZ_)kv=5M?`5%Vp{_U(vC~WHwP&Xu#r~I!^yB_5 zlr<5PKMr0imk=m;78DKHp3O%zG%FA5y4_p>*5g)nzLR^vMZZW1O?o$KMW&M#)*CYp? z>jUiZ`8yNJ?g6QDwz&iCLqp|=rhdx;A$c+5&OVqa0xPjT$b&$Q5Wni6Q1JN1~822g_nWX8N*%g?&Q%cCI2p6+j7P3n=^|%CV*akCqS{^8fn0*iw zS at DF-Et{pv94$h+ST2q-mtN6scV)^G52bIR-)KYFtYOv at Sdd6#fRj?>vu~}MkX*f~ z*UcT7R+!l=)5{i>QMY#Y8hYBIs;K$dT~itvl1oji$3%1H_7H>9 at VC;4BjgB2)RgUj zx;OcAi*6sKZ64$*9h7m~*C$@PlC-jIAB?#k9jO!Bv!iB&Rh)45l?yboA}kOVSypj} zo`BQhf!orlp7wN`J4ymF`Ry1XYhVmJb?@?FW?N(JYV|iSuH|jbi%9P4RD}@ zDEXV{nXc0)XC%&h$TUj}r26B%n}fVR1Dy;aP}`2!nTu$oIXOcHQz=7h={#$`cJVP+ zS&Pto&z*3xZR}DwiZ@|v$msG*l7j2G;9GG#y#ZpL!Ur!9ir+=o>P(@pR0%3ipUBAi zP%kX-vuQoM+WZI}>5Y6sBt+ZKgsaa2RjmZOAr6 at 4V?}f{g~lw>NU9o;s*%a+UB#Lj z3T)_rDQ;_yh6tCQlCH2TQBC0}n?k%=Nqn0n{FW)220h1^jUsAaO at uWKXX=9k(})B$ z;^kR}kI9W25mxsH&5adnv|^9^UJ)z0(eRj+OVN(nL+NN0AD_)Z-#ND8TT75w#$%S^JKOn6^HyBDNnn$L}F7 zZcJ*zn_`@xMM)1q52X?}4=zUK94Xz|A~L=M%aXZPjhkTZ at tN)swAs at JBe1M67 zLs425SssPER?56QP|Xgd3JP^eVd*2BFiZo4`hZMCSVa)y(u{MlNzw3NAo)*UGS(kI z8YvWHX{Xy*g;{SL4JPe1(%0_4Rmf(2()0Ryf5Yv8)R4`^j-TD$tp*a$M6i>YQ20Nl zp)nGj1f;3c|1xYt89fG(Iyy{4UQI?nF;tTaL;DW-^}9?Mw9sHRhumqlEeC6g0>&gI zXJhs{>+%#zrx}q7oO!fHDt6cOEUWkC_Y-w{j$@;|x}(MGRWk$kx1`TJ&2Fn at O_pFO zBA5Lo)OvA&?s&3Suab+ymWr2b-KmiOWpazdZy_z&{)^vy1Ue1@?Im|LQ*C0W!yP;* zX?)Y=tP=?+ at Zs;jgiA5odPG6%r!0Ep;?SE#B9^&w-(v9=Q*ahAo=t6%B~9e%lHC|U z#al)9CT)gE%#zMz64O}2jeF%OIiPEf*w+Y>4HNtYE^4-vvI1VWsynMDjAtK#IhUAM z@)=w>@l#!aJU51Du2}T-OTz)_KkIlyDoGdE at K55xA+h8A3`uMJ#o?MNTq~79Th72X zxdiUwJqk6RE&Us5=BC!HcG>*H583kL-gk4zVXPPGG5r-kFKzM!iBLU^4^mi_&oX!n zRtMWDH+9HI5f%A23Elad?C} zvsd+s3($|j?Lj=t4z94cct9Z-oyCQ*zryRX)O$uX7W`Z z6xpL=WSe6iCLzpsQn_l!og=G{=r*vW`n zPomHBRFVu1$g||`l9G$GUv3Dbr^Mo4ZARN+CkUi(@DWnNUeO^%Qe8M-?FG8DCsKD1 zgX>A9rsWE!O-o9HOEGtLTvL1W_G_Kreg|Cho-wj{+OlMO=O_Ae3I+5hZ6dumhWT%b z?ZG*!pKNU#+T+Dt5q$PG7a{+$={_}k0O~Gzd`fI+*fc=|X zEkP?=M`L}1|1NJ2ROBbcjttI*`#V6 zcVX$AF#&#NeS`i2^(vWJx&Z$^i{hjm_4G^q7ZT4zM1<}76(m{U$S-G at XYu?mfdnuka zWQDOZJ=0^AHEbC)(|s`jLZ)v#2i5V?)N5#3KoL_O1SY4`eg#@TbJb+na78DSD+{eT zWX&E^^l(Uz;KY60K~G$TzOKM~DRQ`?m)%g#=v!Ve_bz;i9;Il`d!FcPbL at SYO6H|J zh?;3P?Ez{u1Q at GzJ$mzTV?q)g8wGmzmnn%9|C1oYWk*;_X^8P%8x76T-x$BL9^G?G z7A_ at ytiPLB|0j~qUW>aT>#F3Eta|!3_cS}-^$hK$|@~wILp6Q zT5AwHldeRTw1nPpuO-~}uDb6cY&?Qf-VH at f6vv@X2{fyRSxq{CIcCAV#UgdDrN~FfZ_rL&@7HpjsIw*Rin$ z#srWt6tab3nRdR3BGiP_JA4>2E~%VUmOoO>gJli}f>jPfDH>oR$D3+^v;s})AK{Cl zFEUb)7a-Kq4fdmrDqc!l)M%crL&*oic62T`o^bveh9wYA;HJasL_bW2GFe at YWud^D=%`$;gZenIu=HT$6;D8C zNMi}p&AvTnQhD5ELS6QbWd7l3!cR?IkwWtt!+@{y3^kap)lWqhS)xv5E{-%=LeTHn zfk1LyP+wIkqJe6mNe9-ejtUc)?Wn)zJi7oo3^AOduwFG4eT?BHNq*kmAh1a#PBN`0 zN3%m~b}7IbEdgN+X46?B)mT*SgdMisvdwzdK8;Y5Ya?;THzlH?g{s`RYA!3z93d_t z${OKfsV3~AzlrEx+UzVzStg)aa-vg-DL`u(=^%nm|{owUd# z at DTULvB;i2NIC}mEy+;CBYNU+mW^k05CPZT%b%9L0o|1Cx%YgAZfh)kgPf`IyUy2h z8U`5F*k$IJ)!E+js!L-&K{Z^Obl4?h8oE+r|E7xEq>?1#+psz-XR_8DlpbTZ#vsh? zU3wQbqrO0mL}loJ$)O)e-ce)8)U;%}uz!B6fto5U!Hry7>7t3`;F%>FXXmAA%(B^=9hAqdsc+8Hjdm4lhB}u at o=+XG0%b?W=>BS~S zm$gW4>9um4`a at hROoaqa{n+I^xB6NH7aQ=aMz=!PPif6RXx#i8xrNE&>#h{(4h5jd zN`kGdGtO5729jBMSY&JYA>tMJF&$E^2c^zyz628Qk7Q at EQNosM+Jdu&c%Rq9ywhUe zFVegIU)k_;96cv5_V3*8lZS|1&OofqO`0NoUjc1aR#@zkVlk#0FlNqg at zM-YQsWG*=jfw4lXsWdIBpe_=Le;%S78?gAV^($; z8>GO&PN%tLTIkgbRPV_iuvZc~aRIz`a*Zf&PAjJ$0VZMrgtPz22&(!3W3hUkcfpYu z`D at a4`;Y$&@tpdv70N-)fMw{;%tHu at 9W%2nL2L_Q_EU+N|c_mBh;= zS0yuEq%+c)v88sUMwq3bFoNFHKe?b9w>stHB at P&PZ1>E3c|o^Haz9s46 at ZrfkPrV5 zW5o2gG2^ynT>ka3M+f<@HfMhyv-DpVIR|4y+rL&8Cv#gH$NvsuR>V|A at j*jWfwC|+ zScqGSo)22(v#`wgP?$#uBrxNXcK$F{x7Azpws-j@{YRA7dBb;Zrb)LB*)+rFCidd# zY7!t2ItAl~+jFLU)^Wy>W|H?$&mZVMqAs|@NV=XVd_NLT_o+ilPv3zGcFzjL>wW z<7zjG6I6N2lgktW%jsi>2&BNw5BlL!iiVL2>*oF_?)v;VGM#x6d3FTYb)T0kenD5m z)IK)5+cV9V(hV7F#kihJ9{$zB2o=g+0 at lfl;fyIYnfFdeUp2jr^Y#i$_=)CZ9Z&1krL}IOGHwddU at Lin}nuC3g803#Gj3$k2Aji73_xpAmv4 zLd%Bc5q&E2TzC!Y^`p2Nv5pMe3lBwocLrr`M at ld8$(sHSDpFL;@=I$$gIOcZ$#h8! z`0F1wVhii(1Z9;K8DmA#_sEPA&4R=Mf>XiYFGvrXrYj{iIdjO_#53(VSH{8w{z(P% zR+UnX61T)I2T*o~b}U%d>g*;WDC$QAYa`HbfCT26s2zsn{MMN%b9w_Aa$yG~6)p!c zI6Kh?s1_~Cr*!M7Z4 at X2Ymo+c#5>Hr;tp+#l!azvDw4)2RL{xka_2KprUm3zs+Gml z3f($YI3~d&n at BLWOEOKi8}bSwam at X8qZ60g?xcTi_s#;IFE-4(j1z=g`MKEjH|VDa zPYp_G+PS#Raa$9Q<@I+Kw10&sb!CZRtbRklTkT!T_Yo-CSXeK&_Z<5-Y?p|naQmuP zhnO{d`6PgHFv!PW=e=9g^}CtL{;Icm(2ifBQKd{Nic at aCP(V z+h-qHzyUctY$E1>7#=io>dQ4e5Ij(wfWzm%BpxyAmV|H=Gr(;YMl9D>B|s;AQzZ at syFGZQa8wcRJ(PrYFIU=S?m`T zG$Tj3E}j13;mZ_FE1KGS z8Wn-)k^rhj{P;ixqICjY>6ZD$=xgv`D-}N_IEIsMNMz&_fiCeR+p{d%vqqwOHQ|K^ z&-Flo<_D42TL~h&;y?Mh^_aMlPe}P$!ZjO<|B-zCbJdd zAEokdvJqrg&!hkZ0PyoK^ZWlU8&bA5rhk);|1u~BD_F`d%Axzr*ldf$hesgG at sXyM zDaqXd(GwIdnxBt>p$~#nYd0o4aTi_A#gbmw-Zy5T8^ZAR;Te1F0%4INCBC$0^`tJo zX6g3&Vgsd(N}v_CW$^RX7>h;M!E6>tWhZ$kJfhj7;3NJ_^-*R<98c)*4&1~f*vq7ZUTiHJlXfzd5>N-xn%1t zZakYA&&9PITWk7H{kH2Qjqww;p7v{~mmt2(OW?rWNYN;fyE0Dt*(#%Ip%J6uJZCy#Iy>UV z(3e8X*catbdP_>bu$BmtyOcqM8z!_9YJwB8O1(&xAu#iSbXSP9)+o=$5W&tqw|&%u zztWT9tX+7Wg!1E%pwcg;TOn%aVYtvN8 zf9x3jH!MvN8mRG+008ju|JBjOKVkWwJ0f*RH?3u7p3`X_j|9<$skH==L&Pz)2f}qQ zD!znfwFGXFOpk(ag75 zb7h;VotwJM9C~5loC0xrw#~_mu2FuNY|u}be)!)HGV;1R+m!}KR(WM)H at rE~7p=`S zzQN>Ax8#!}N|(QJj7~TXKe?BXU+?}RUHBmn&mq6}?orE=qLQ;Y1?`%fiF}jF&o%~* zY7}l%^Qx}9V at Kmzl_@qje+;TZkxovo4AwFzMXIS^(5-$7;nSjADMRL5%51shjC4+s zKp()Q%mm#4TTJG_rtCI97J+76=O1SPG-^lR`!x*(_~^yCe4iDB^Af~RMj7JjWZWXC z==SO(ovxx=NzS_4q)k!6+byF|-gRtV{#zTvR^0gGA^KMAIQtZiBgi0g9&?*EX$Kxh z(=s2uruU$RtW}WR`xTEU)_ at w=dIjZh zmf66J|C+!24y%(@lH_!FgGhnhXMGtrUya7gSUpGX>+{w_;;Oi71;u>Gn~H+~#mvbBQvO|lbY at 3zg5^3B zDce!8>emlOejA?0?RgshV^6!UZ4a2l{Gni~_A|a1%D#Tyqe-_BzK?sPzk~`4zoqZ$ zz%-hTK9xiTFE*S=Djc{$ye`Eml_JK%^VO^$mbXK>PUXS71rKhc}agdC1 z{kFGOI-y&Ly~Onl^Sp==bai(SF`(fGrqHTX)S>V%?C9`0JObw--VB^Dz(hpStI~Fu zu)~Gw7s9qYM^>u`jRy4i!=1C!0N?ibT}V{?5Y^HJ)x4Fwn3JpSQUg>K_4M?tKy*Lu zwIclMVdvji14pPnKl<)EW?&8df9tIeB{g{uRTNnI)BIvc2N%Q=90(dnK;3Ptqej6E z0}~C<*VC)BfqNR|2bDvu~MT$d-DFs<)a#)}dYHKwB&u6v1#QYd(z#(VWEB(qXrU(O41 zFFC1ZC3*AAJ$dsSF{%^9?Auvt6_p`6&vjv|9dMzyoxj z;+qQ_0zP?_pj~KqA$q>-E|Z&y0W*9&vDN`hx2PdIr~Yo3;ydC~$s=7y{#^7aNJ6%t z9{{xklr>gl00Jg?)q#(xQprOy$|rND-mcdTqwX$mf?ucf0inC_!NWuT7ywH!`_mFR zFFkKby(YD&-)NL*rDPCNJkBS24MGKOh^A1YB1W$5mIhN4TXw+xYE%f at gfRxSY)UhA zQ~TDJ8NEq9+UIvnu}Ts9JGJ%bNoGr)5?{MX$2drGmc(0_*ic^F$P9|b?qZsoY724^ zldW%+=pVrKdhg;!jA9A#pWANiN4lhPj;zLA51NDo_ z-%A0sKay#_x0EJ4k1}~Q4-u=O;mF at F`X&;w6V?#m>`A^>QDK8Z6ycbnf(ATHp2-xP zEQ_oS=^`=_)z=&3m8h*RLH_(a;XLovNCjDGJDEv!hDu0!^hW4UmmdV7EznmWJCjc5 zg`OiSoXN{?#!JM83m_h^92Ur+w8MU+e&%oq?<$&GW_d2K8ljNKlN1RRu$lKHS`m^R zUYELA0#OK~r0Hz#aE=*ZlNI(~HiOqTU3Uxnb|1uTo%233hgF=b%iBwC3-SVEqC7w8 zJ~?_%_vU>x@#!QRKFB1rf6}R+;1F1 at cb`Fr6QaeU&U$f~p35fxFp=O+HAyFI%L9`b z-o+K7S-o^bd)ks!PIAehrLMQV%+XI=jHkOKVZ)Qf&-UAr zpuF`p1AQ_rDp-_0mPe|{)Bb1*0(OLjoEdDuT&stV2mK&<#N?0xe?**tu9**|0eyge zObzgCyX1c-=nToQd?*Ki61x>*I|t4HWn6h1z22m=in9+yY>|YHtE=hgOPz++sYc{G za7jLus`zdo#nN%^6VWNViQWFjCUYcEyTc__)n`u=e}T}6N#Gooz%b6+22d$T5~g>U zM?YQ^QR at uvFo&+{#>U-*Q*oJZc4{^g;vz{F-(-mups5_8Mpss9ddM<<5 z-v(fxRJ-=yhsVh~=R12!y6ujp!adx}&xVSX?WX40CxM)&_Px;pf7Oni`-T(v;CNWr z75{A$C65qLYoLiZ)R at r!X6YgAI at rFZQe{VF+F_btqP17VMa#Cn=dAGm2z$rqOrLe# zHyzta$2L25(y?vxjcwbuZ98vlyJOo{$2$MH&OGO=dB$FQk5SKu`dW33QT4m-yRPSl z$yld&k&nVhVOl3DsBqDjGoM5iU;Ywet_|7~Oxzvp)%0cY08Cub6Uf?SF8zI#x6=fQ zRvyIFDtPIV*O%sdjaz0<*oSIa=ejnl;vs at 8I(Ztqr|_emUHORdrWPOnqe@~l#e~>9 z+RFvF>?n4vkR4jIUTnEG0xINQfb?#hP59uX;A9HXKD%embw0-#$S22^__r`pp?>^H z5J&A0Y+VrZUYhaW(Cay4tk16Ka?Hrtm$!TCCuVg9cWzcnm1PcR_U9@)1OAqt6-kAUg!IIKc at gQnK+k{h7FayZ za4y5w_q^K{1*U)8?V2d}ZkscEfeVAxs*1HGMtI5eO0hY@=(f%M*keZ$@yIHOd6EcW z!m}#7;K6<5!0*xKZ`u%c>|i+WFu;tE5 at NbwcNntU*Zxw&>&ot#w!MJ=Oz=xKNaZ0q z$@vXpwP)b)v0b*nAY|AEMRWU-T^6gm2R}B`#tX;@?2qyoQQ`KyL_aHsk_XGha9^e* zuxThJM2JEeUBMFV90W+~(C at QdH*Tdq;W%qkRJ4%{=IjMIn}G*mWL(QMEEn2KoUz;*}eRjaRVIXrR=?9s>6;4%8VQh=5z2 ziKEx#S%Avei2_WXxK(>3iB1q!MF~@F*>qPj(1BEUTGpAKu`Fv<{=F^a$%z(!ATA%O zEogg}!IQ8zfd9}o`Lui9>;jou5vOEl?xx^sG~@xwohArz54j78UfDgI|Ia at BI$?=; z2nERuw6zT3g!`1}UtjR)z{xXuk;jMIr}r_k^$GT&m%K;!>Up%F+#*#?9y~ocO31u?|c2C_A8#exeOmBt-Aa@;70xQ~; zP4ZsVFRzQuW1KohjRTCq)}?6q?pSPw1+ttLa)2n`4DOvQXU+F-O>dS$0HNHez&y#e zJjRDlg-9qf<0bo at A*?0KuFCT zCH)1IpNS-Zp_tm7qOm^!hC#PBeH zA8+N;DA`5N-Vq(!(HVRrjHY1Kn>QtI=B2#*%h!Q94Z0XBmW=uyt})bYC at pnmMsAis zYlJ_*`c7Koj>Kq}{N)Sq@``bOte(K-o1?}onv^Q)G6}2b%TLL-5p#d0?9pRmEwRiH zsOJFIU9rOOi-l3NUajvG+nz8yK4nTm3xAr=+q-g(ro4FDfI*OBfNcH))4)eSPl!n3z?)P)CBMT z&aS~H=E`;_=kMMk#4j+HJE*o=fnvq4 at cj=a-C at 7d?hk6E+Y at I(Kf$m7BPGRC;^E%{ zN-}?qhh-?y;kv6e76vY+O;R38^^P{dGn;Y7M#PdqwcKCtL^BhWGZ at Qf1!PpIG+Bu5 zC&|s0Dmd%mAd|686z}JKaWLw!ar1EiaM~_$wewcN?~ec{OW0tlv0i0Lva;pBH!3T} zzukPy;+XWqCAGBT?KUGhXBe at nX*gvNeiwo&3JYR$L!f)%ci_(HhF*^ZHu6}c3X1sk z|Co3<>WmKR6msEDn`?7jk=T+eDsLLCn4%Ilpn{Z9N*W85a2mu4q>d+Ma;B7xk?&4c zD{bC~B`HB2QBzD+l0BM0)v8|n;~|BgQ at 5y`HUFD7MeJNXb*^N>F_PMM9nz<4UTTHb z#<^%-&W(!p%(m;hYMvZM8&oOKli02pmpaRad0IC{TJ8c2z at 77__yo(ssfL#oR&!V% z)@3#)XpV%asmsf?gk~~{K>)xxt*H5yQWV}xeO{F;9BEg|C2q0yNhup!EX(ddVHV+) zR7OsL%dq at a7Gu~z`s^+i*T21O>^y(}M39uE*8EK5nz`Y%3tWC8$S!$$B7o}PCi=4i z5iqla%ueYdyqdEJm#|k1N324r3!iXS+=8qrcOI60Tr3D3mb5Hr!ehZF5}U+e;pd-? z14)S>jcyoWq*53zh3*hxR1|8|6lzozy3dR-jDZt*g%erDiq6A^-pPjU#frXSNmaX` z;4LnE$Cq!qx{Ha>Z-W!a!wUY+1`fpv?q&gfy^Q>k z6uPU2&`*re-)jzi9W>@LZwOtML;#*kGiot<#TS}QYQrZsmo8#F!?nI_Jf2~F(O|lg z-1xgq`l at +1YOwNTaUzv;XY&C#h!H+sNd&E*Szs8C+L&QQh6O1Y~hcrHN zpU=%C*T at 4!%?a}%N2ioC9_OA*{p_KM;7#& z>(aIK0$~KsorMix4ANXml1y+)WldL2l*~I*3u|;cft}~MMT at E{sz{!TK~=fy2T%g9 zFO zC=U-KB~ZOZ!i7zag3S!GuG&9M zWhweu1$mVqjdpOB at HZJ34S90&j)gjLT_u#dS?rogp_ie8oY|S(mS&ZwwB#gov at EG2 zp}ppHWO_OVk}0L_??-ZAJUe^Bd?;%|NNJv}8|e-90&|WNEY5)s3+y5>k9 at P2QYoOg zs-#*mcfLu~b6v?*j&bG`puAeE>~cIE`48fAbuQ}HUkS~fp46LYf0A!y+z+f$w&pDZnGMXnwb<(#FeM4a*=M*wne*?g{R6YyRObPoSfue-1|-vh%7YtCJYQwfP)y zazndAt*_Y;P((&+T{|tau1aeM-8g#~S<4)V-KjN$T~rE!S$lD&7%&*7P23gs!0*ix zyupb&z&sOX4;n9D3r!e$n}Fp*C;+_|=3c(r_nn6SL%K1tL-mw!R*%hbhNYIi z2W($tnoMbd^m1j!c>)M~$W}Bxzr)RxJ6GDAk-$aIS6R|h(dxc=&)lEPSHT#$Tbyj) zc8chRQ#ryIxh?AIXqMfW;WPrB9%k3Cm%N at d;Qr`$F>#JjSli?jaZqU~4A$p at YP@NVn`BPm5xwxWT3A;Se zHX|L30ezBP{c?PwpYFKdrJMD=Y<=??^r4<$_Qo%I1fkPeC at s22S_fKBcJ&K<8H9WH zA%8&SqmEI>3bhbrk6`zFaz;7X28u`D-TE}P9*M`z;b at BzfzIM|p}Z`6<&nf++PvOT z-d0#C;2P(VtfH|dTHQW^Kbp)cgRitcdq?Eq$CEJ{ib=?oksbb;U?{@n%=;I zjb`x<)Suy4%Ny at N;9;WS_=}vrS{lIgLx*UGrbntb&BXk0I4;V4ko?E9TI#aOhUZG=zvMK?BR9kiTWE?P4&B2Z8b9{EU*cTTX%E`=!^nd`nU05lq zd{AXIfqyPt&f}SU(K2_>;lVx|0FmgCQ>)z%gz<25!AzNDjkYu3?k~j~nJLL)CzaZkv6dK2Is?XS0ON#94%g+rd4V^B1fCam z1384=2t%xLHcBF5)YS#_mZHD9ly`;PwIN4qp4KYgtk at uaW}>%oNuw+Ak2lvJ%YC%efUxj}(jRovF1vLhr!O3SoI< zkGhc8H$Qw!r2FlIUIDdwvFI^b})l=1j zA7v6GU*pcf*x$hBALEbs_5qK?vk&539lirj-!M_%)Y4zraqD%|Q*5wT9K}biI(OpL z`%aQGE0R!?6kKVCf{sWt{Y&-E^TBm53lG%hvYaCvC}pEtiB|9NtH7b6EMgMxs7 zga2>aEB^13^FOPG+VW_M$X{}H8>yl+G-|&gwA)1h5D<*WXiC8Kw&r4btid3L4cShU z&M at oN)1rtsZErO+M9A!G}7K3!l?$ zP(v(O*D|4FMZ&LOn_`(_AEQsvwo(7mweE5Rt!lC$K!2VVZdzpvl51di*PFas&uRp~ z4Y|^Sp0Q23 at KU;yA?Ic7phzSS5Q at W(HdTFI=U#D4^QDm#g*MB$jsC at d@(W~oZ|N)U z7dNjxYiX&p{#zrr*07a&{XVacF~)AP(|XxB2tkV5D4&w$oC8r?7=Eo;dwJJ#nNO+> zYfG)6P_PG#L^)K+97~MkX`}t+`zA<}%4HL>M==wytJR1Vht8)N^}>xsoE?*;8U zP^9qbM?_hHY=W$q8gW*nb!Ii{8vL5GNt1~aWnk?M;GqwI_ucpJ`za*NXquTy5Txn_RRpFK&evI$1--f7SG z-8b*utq(`L-%s7p28dtReK~E?GHyKe1kapvfnGV_H%$lc5N$g!*aG%M{)F5OKae>0 zM#U&08^$A`?ns$zFc*aHj|ltT(98&d2Pl+sD1jd at 4PE;2y#6{_N7zG{uS at V`D`s=r zcjcVlXi#p#M$hSed<>;Fa=ZaoLMus#Qa+U+JlXCzJP<1k?O&THD884N3oM}D%CE4| zyUzx8KbB#p2k#N|iyMUgG&yeBzGp7RG#9O{d=)=bJhV=HP3OTs5oUIaBjOM~e;Z%Z zM;(?Rh2FG(pQ4Q()+&>@;d>I#(^WwsUhmuR}Ek5l`>nn9pEv$Yx_jU20wG&o3|G z5G@@eIp>J`1Xff4`4 at 5iF1=X?P`0$4FQ{9=*oey1EV+D|BY_U%Sm8-J6t%I*aEL#f-3~+7z6DnP0k=>kH zl;^phstP!`ld{(u5QZGi)2WmfG7Md at JDp2nVZ>?RHd(Y#H1t$q!wyfv8z+t?CCwf;n09H?^7oU-KH7-98 zx&xyt at PfRJ9%^X7v$=G6F|perg at WTre373xge(8dr=nO~+MTsq9IMn5egO>{DmY#p zqboFT?am1T>b4{BX4jL)w_umZ*J88|{R0OKb{lyi%g7VXPT3$<2neHGZow)$s8Www zh5jLy{aF*Zvxg7SJ4y`U*QW*HH>b&$SWK-A;qehl}zj=LtB<^4myJP5mlJd=*_7h}~&k=c4;>8WNR+;q9Qb`d#g zH~n4 at Y`+5WRK*xQ>s+_SgtDAYXf?zj8PR>FPfWDxfsSIEK|_TYeC~AfTBAfAjwTz4 zEle*F3R?nn)=DJK8Tv6s3{K9Ix3B!vFAaHMcx8mrzUZlUR_&A1c%9`bdP<3gqmO6& ziFv_=NQ&H`dX$}l6_U2wQlUeqq at ju|yD4sDx!?BO@*0+PiA!#2k4K(>2VHwmeN8CwNk-zmBm at r)7{zei84Zc5#EkSyq!P05E?ScW-ge%WE&||u2>rjlq;HP z+-?v2&H%H~{L9fPsvXO{uFagr>*mQmYv85+5@{w8)QsdM)JlT0{_BiTblg6I5zMKenlDnjYT8SC)qik z-#zNbH_^cj%h{3-l~{C_M{)G!so79XeN>JdKH3Z3by2P}=RtHxxLAqX(=Q6fN>{^) z(CPY((?(uU01|Kd56DnOJ)h^NOF$&up3hXGmBNn&<^kh9nkHCU7FfX4So#5x8A;Ll zSb42nm8+qai?fm%VM^yHjsEwc!^Dc>?bYpmEZ)(Q=D$W$<3y4KAh}m`$+dQp{%Bg| zdRp-szsQ>uZ~JjD{fjlJzo}35gJBA}Z^{Em4gcuucDH%Wm+lgANxxq)P;pP70#EE$ z`Qf~5#MlCcG?y9H?g!q~5K_{O@$*;5Pvh`8zi7Z$n at duAs&=ZGT_dkk5?6KIQnVXE zdzmr98}3oZZbUWf5{p at CK2D)OLt?89%a)i`III7{@ubI{K_7!tFK-C}DWAs{{ zqRoEwf#1OU1tI+8gRKxL<534ty-AeaF_idmHVb?R=sd!fY8ol+6ktiSWx5B^=H%Iw zAUX at ES&fnTOsQ3CoDKZnU2`+!UZ at iXoe`8>1VPP{dX__73H%NaNS1SOqYNJ0 zE4&GRqNR3 at 81YK7(&POP=C3-(y-n*HXstboVR;}EU=vs+X&>jw)u%tPn{=(x6}0eD znH3_;`ppL%d&b^I(!?fY;uA1^CG59(LC?~xkGti1qT?TZc%jUz{N5jDd`17 at nEVo0 zQ}KW(JAmZYCYzqKp2wReo3?Q0Nn)iyI~3a-BH|n(WkXx~O;L$)W}iK?Y8_nVZp*DX zbAc(i=C~i7P at L_rZUW}Zl9QL(oy)$~rl;WP`}*rxPg5_ at M%&PBFAzTobA2MJ7pu)P zpwk;Jl4k2djlPRq9*6r0aKtc0+gg{?WXalT8Yv+?TrW*dl_;f1BO4&ijX_WWZ)VRY zO*8B2Z*l3}s|=-noW!`P{|;Y$FRDKtlidLHM5+%F^+uxMd;J^|rZD3Vr3R!y;$Q8MsnV-nt+eqy+hCqB5h+=vbGnm>%&9w4BnEq>p z->K-d680u(kPIFy0knkrtwvT=)rlKs+$*4 zk!1RPwCXL^_IShses)eHQYV+EAJ!s!l;{pQgM3Kx2VsvO-shOF;3doVzJ7v)3O~sm zT_bhlc&_SLsVBRv+S$LTXV!H5SWe`*K>($;Q6TnP|BHJ5e>`3(xa|v#1OhUJ_dkW~|1U)P?}$E47(X_J{?n z&H{$om>jAW$tXz at k$Q*3_1dHki%eUK1#-zWPS=G}+td*U+3$yK^B-h^z4v$5d~Q6? z+23@}@ZMM5jC$Y-HMTAX3s`B#EVdu~xsSVC*-w2jvr-RG^B)CpUOAix{STZMp at ex4 zyALmcP#a9dPA8ki6o3N{iyo?J2ui(M0~ozz-JgJCa-^PMMxHwiq}08*&1?^kAA0>& zLZ1x^b&?ONYj128Um_a43}Ig?q540?{3sSVHoHD&0WY!^UqZ)UN}0X)3K6|eyLPwq zYxk`LANW02Lpxpy5q|N?nP!K_IpW<8a4QH8 at k4 zm0%$XkS}4RNbXK!mMVPcE zNQobS;bPp^CKtJUtNFQw!v%B>gbkz!@BKA6T0Zp`$YqC&CX+v%Q&BfslyH4=i=#ll zpFG}fGtCQJP7KF_$76#K2ua{`G9Yxojs at 8qX$1L2$pWyg(pL##w}rQAn2+7Zez^!IE`FR#kPp@@uz+Cg^%Xcnoc9B4FaXx_t`T_p;#WBm9 zclM=Yo77vsxgR%6t=g^B4li%EO!QT3DU>!E>0(ChWw;2E=&*s?m!s~N08XW$FI2>) zebt;>%7POEH+n2gBh<8un_nAaPJV>Z{>zugnrR6VOW;8SnY=g>E(*86O}i|ym#M84 ztE{MvgA=t}{U8NAaqZlLXAzjr9^?((0|#Z&UMCAd%JgA;G7%6|I-4ycJo+!nCIt3G zhu{TU=VcpHYA${oh7(gys1tp-L$}p=Y$NTKqi-~uG>Tg|O~?Z2zO;7jM#ag|d8ZV} z_s5fh at V+A`77E8c{A$e#eLvf3hiB2*XLoBwO)j z6+K3LK{mP4dYVBfg&-QWa>_#oi~k+u1kD^Pj&{2!I53SrZPK_Chq{99XBNHiMGj2jsaRBp? z8=K_Ft$oC)S{tj^5-v5f*SA at Xd0`17B-f&%u9s3)g?k7DkT~|x{81%N?4U^uF^UXt z)2gjPZ4nw3)V!5yLgnLr+C#(-GjS&+A1+tms8A}?A`i1&Ub6hlshUx{Otq8p+k`nx zqA68ewY`>Rk-NP?NnN#4OP$TJEw!~=+hovFcd5b?n_>R$7eB+a1Ah*bT5^q4jpkf4 zi7l$Pj;X=i)rD30`XB9u z9c^80b+cgHKnv$B+LxB0^8K=S@$zISaNH(P|}E4z(_rM0=`IoVI)FB|+XS3hZ|QI(2B zKClQ3Rjsk!x|nO}q_w0!qz`~q0^BNaEG)x*GU13d~^C at ya-4P^pIQ{8=?;=UY6))2|g>Gl*LRq!W zPnrTtc|&mxcqfbUm=gCDcQ#P?oevzOBkHJArM)-Zs7DvM#zHVx>!PUkW|BVsAxCG^ zuB*6avr-Ai*0X>>2$iPidLx^73-Z_wn0c=(jjx16$+hSWx>Dbutn+jxQ}Ki%$|Ia;0Fu5US at giu+Gno`;Q`gR&* z4PSZ76Rwi0W*9j=el~@-Eq8F(E_>4LChk$~dXofU+??B=B z(8;G`&lzF?cT9-X`#56 at k6{mVr2<&x&pTmzOJ~okr+#j)9v1zq-;za>X*bLn9{0L2>x!M+=WVRMXOC-`co~2mSYMY6y9w`r z3P$~+E?V>7b)U_mdH$1Dgitrx%t}S1`boK#V~;c5;ynw^ht)An)c}?nm!BvQHhV*L zs5emdU{?*Ogd;S(5)lLgo*f!!^nU{5{-hF?T=9!p6PD)i&j>xX+GFMQeKt>m>3AW> z?Ll~>*6q68;p7gr-dT7f9lW6M7qRkMX}My-x%ULKBi+pejg=e;FZM>+TK#cF%)QN6 zcD>a>d7JiW-cD|j)Lhn!X#Mq at tC8yB8HMe$2tvO^jQCBQN3Wy|0$ZX%re5 zGy#VF4)Ly(Quan8<1RKk+HI3FB5TIJl9hAA5~{9#J-LP5wCB&FI>Yf8R_({s-|#(k zenfdLT}#la>Q_f4d<^~teFp7rnx178!CgE>V)g8 at PX^@KpIDkdBPP=#t|yx(tT-d< z7BF{yDLyNX7Ku2mibSl-jm{)tvr3!y2W3wh749R&%cOdd2Fba>Q2X2c zcX^#AV{ z*G%!<1qWL1tJsU2)9$!EvHgJukRttnf*Biz! z8uneA4%5Umqbj%*0icJ-l+EcxaNXa{+ZjBtDK2%e`3Y}9`;l8|#XO0z%k{qTV=k|Jf5QPK%JhT#)@W>79LtsG7S7MO4wYQ-wlkgi zn+p9?7xzbkQk69IxWyxPr>>dYO?r7l$#xyj1#tH3r$v@`?uX{Ckhw|5*$4N5$J{&V zxMPdl19^kJsf2q;>wE6gc(c-lEkioWkzxBvjIq6&3xFkt_qpj}CEIGgx4GKUYAwy5 zic0&i$`SucQK6+hf|ehIY6vgkmP3POaw?xHrM z7ZY)IcbjgiAa>)#w4$7Ge>_!4>li(xyfus zOz>C-pR;7f1+|(}VXg&BkLbA1CS|7g_orn*di&9Eg7zOuH+WuN_=bz|O%k#Cie$C~ zxqSku--?Pi7pUj-7f0lwDE1#nQ1Jicz>recxOFZK z*72_T6t!NnI&gL}uTvx1A_HP#nup~DH0A$lthlAq!kX8Ebd=ufC at c7BZ&x+M&IG at n z83`wE2=EYeI84XJBJaO9su?Zx=`Uhu^F8A^VzDTXy at qy)Cr%UrN}+_Zo-abYsQ;nq|8DpA{D<9xK}i%SqgSXT*#9#e20Mqr6 at LxH_$9x@ z3Yb`%=8XR~C-O<}`~McVPtZ4ip(H(dwDUb at FF4)I>hHvX&>7K3Ip|CqAfsU`t*pw? zq#HTq7-kmq*#{Yh8m1b`^>+nogDQu-S#dOLV_f9d+u>`405O2DY-^9WwL8^gp`^$g z^l-&1*0YaWw++9&ZGFXw6r=eOv1 at PAx1Ms*tTnv|YT$9_fnE5t_G@``BiS6F2asuh zcqi>FORL?k)W%)9LJ7c`H894O0UY%?iIcdCjf86DX%O2&0Oy at 2lQ1vGfmCa%wi*M$ zkWe0)(0FAFJZYNi{oKCOHB}Wlr&ZX07q$tQs*NNK=2LBIr~wO3tcf;fR=gNj#YF>! zAcc at VlvJK-We3jSj-Q1~-9Dp;5ENf|;s#{vXf>aFcZ&r_E?gI at n;-vjd2m+yfEMSX z-Fo_U-N<8k_~m2%*+-&g;$a!9<^2EU@@Un}?OEF?$tW`70v;lMAD?w7dV1g$ie&Z@ z)}8ZoWMmcNy2aY&j~#hDRmYEbz at zCCHAQn$?+$W=7ZI*8hWi{-eqlt2Jd&c$l4Ox& zU22C|SK2L at r1VV3%RbwrT3 at UD1$kHAqj^7gkzdq;{ON!#dB_xly{}0(Cn_<|r!flI z5G%VF(RvHZ?f?dLiX7%15jJmrF=vg_ZY$)G- zQ{kS>6iSOlE at u#ZOVO=a$uq`~_J#1Dq6E{s>>C$b~jn(c|B`Vsq z;mIU8+REAuLNsa{-OjD9Yb}zr`PKFZ#H^+XM$*6Td zpQ%{N?DU|d`;9cIwd};{G<;6_pZwHivz&M6xvoZ_v#WO)P(A0tP_q-`<4TpEnbx^Y z2N!ZL_VWRDW6uwbTo-+C_n)#*h at 8JjFnXvka+_r2ckX*2+!dX6>zm!S9iRXHZ3a_> zD!qJ3b-p3DxDEVxX+&GuD~8zLR>qvN(=_Whjw5K+_&!OiXT|eFz%;k3Z8do8D5Kj~ zf4**L+tG82?a1Ra4|x2+PDtoqLUtH1{Qc)$hYp0N$7YoF68iM&t}Q`_5UxZ?OscQ7 z{dGBjzTc)s7pxx`a4qlps3TC{($wi=Y<2ojDf5;CzBROwgmiWG`Fib+Fgf&p`fmvS}A?PC6m&bxp!Lt z1NHmXd;nV&gp_U3Qe##Y&pIT-=dSGqG-PLT64?CJ(+t56Gwp}BTmyA4CvlDvt#uAt z>#J*QbBh~z+nJfOxy95WTT*Pi^R*o0Kb0F+Z?9T;;r1*KJcSNLEG*pSWL`plqr|vT z_Y|r*lA|XYxTv2LNK&zS^!oI-wi`%U2`X_BO2p4QP&3?vJ6C0F5ZL}|$6*t5&DoKm z1rMSU;G@|qG}EU_kW~Ow*66>Lxxvr*LHlDm7p@#;;v8g7s0{IE#Y{yve~|>Fp4xly z+Q8$EPcITkP=XeOH_)O<;Wl&!unLxed?xsFhZZY~g#D_l$W9sx_d-#$HIVUbQERQj zwxYtDiN2pC%F8(%QJ}&px{zXQttxRPuh`*2jYM!+Fiq4;ncz}xphv}zoA^{$*bD2| zz=;V<8YxF9WAC?L6AG$e2ul5ltl;X2%CRs6X(=t)9Y_?V`#1G%jp9g3n}!=NZAJ^4 zOJK61IALO_e4ZIERawa+{5n)T`c{r~9xoxOH6G(w#Le_q4t&T$NX9gJTdL#{*GW)>`mcx zZ14Qt$_p;OUzDt?xBTeN-i?cOKc$N|Vcprwj{%dmNLxB|!dffSN=Ye}n*Z`$_&4i} zkqz-%4U%FJtrMS~qRIE8TVws=E5%WO2ZgaYFXB93lA{+d#G1;*EZDMf(Ku)3Z7%Yw zSV`;Hp&fm at +kN~5d=`fY_;ymHc6+Y)0s~i|>KKQe3zGLWSpm1NUS z6yxkyHlw(1kDS#;rIw3MGL5R_VGyqpJn}D5-RdklyB$0JqmiPcNY18)k!Juq>)Q-* z89 at ehuXD?(pxNG-soj)PLTz2FRB))55&U)(poyiv#>KhlAZg at 6-9IDJwSa{P;LBCN z<%lX$>n;ctt+u3q4k}1ibi)Ses9 at U4h?wie7=E7>Yb-E5PWCs$%r8E`ETyy6SZb)z z#`?Krb!Bsvd}eJu70$Au!;y6xO`TMVQ2FM)Y9`K|kV9g-#PXB<5LMHRgwvKR<1?f4 zveFYg%w&vF(H6Cecr at nt(4HbI!K(7z?7YVYv&+*%(CSzhvc3SX##|VN-BAUU(pIer z^vXMJQl{^##0kG?%7$UyVH&XGPV(wHrtF%Lja$Mj;IKHX2*>I{E!6%@cDWAD8nsd- ziipPn1x1naWUEY|5k>&?RD;w$`%zx^bE8e_{9RtJvD$m*4Cr2#Z^Hw3(Q;x?^+|IA zpTVD^uE4ozz#ntGkm^Nckrz0qIxc5nGLMljT}e4AYg_g`(^4ztSFHD-#tZY${;l(6 z0)6g5kN at U`eOYdwqzqvWjmz=kv|l{_^+mHS*>TG!1p7dms}d|;d!n+d&ek8nKwbNx zk{`zh*Q+=D%5F5AlhK*lyHYvEhvQ at X=xw z)lg6g%Gu(LGgUV3Z9C4l9jR<;51rtrgz$-0{|e*(On3Zll}9Ht_1gp at 2W%u_%vQ_+ zX{|o(>*gf)x^yxO*|1 at 3_eaRcMD@Yz=QiM4eUu?Y45q{lRWRZYJbZRzWd<4UULa~u zRkIjj>(_(@U18aScT1V!vqi$VS8#gzSI)?Fx%1wqH^a-E`#?0?@0d{@`wZ`yTwR_D)TpzAudCMez zdN)KV3ZL3Oi)70lzVj>`dX=3fCs*K^BrMx&ZVEeSsqgCv8|j5v{Re5%SD at C7MA8b+ z{O-aNo1BcFK<^!9+baJcmJdYLE#3JY+h%y3F<9=&h#nD7Zv at p0%Ddg2?Jer{=%hPx z9dho?F1Q_e8Rt$>cKz+UES6dW2{OD0dm>u0UDo&}{*awnZu|FWD_P$Oy3-_?)0S+S zJ!Y{~Knv=qe7bzotMxda?|1k!>UJg?SE1wSPLEpd$z^6Fn(4`IL!8OOg~)lB$q}x| zDgDfMu*nN{#T}gO>B`}~-M#g8KQFej_Yv^E>q{qhB`hLs$P$x1?s%;$6z(whYWuyk zes}B$`~F!Jdp@@efCrP5`Ym_ySIfMrwB8=~mHio%*XLUF#9^sQPv5#`MV)D2 at pvwF zP>ZR;!zWB9OR;eohO5eR~lIRX0AJ+1~k#&8UGb(I6Y2Gnn2wLL%4n#fsX z;Y^CP(ez1c&gpitgr)8Z&9#c$1GQ*MRfp z&N?;81-EFAjtC&`Cj#2S_Z5A*Zt1V{P~E=l0;?0z79jk&+bzPO#=4;zq@Wh8~auHFS^3P?Fks)bEWwI8T z4mn*Mgc=@+hb^b&79&13PwB at APIZmGxGRsEoVpuZWgbUXurB;{z#Dk!R7R3IgQ~L( zIVAOW%h^7$6_q|3Q at C{Yvm9r3Z4<%!oRNM1l_F6xpQDiXTk{7#oI2ZHdWyP^?r at H_ zc8-jn+eXV at Ch${%>7`}mj0HzX9k5p6FREU&%$ws%&WqhDqs1$sAu z`nq?l%d-HA>2^0Xsf-{J z;W3k}s=sI21Hdd#6z<7_!K{AvJQDof8j!jJ at qP(dX$$m0e17cbPn-T^0=hmUSmR#{ z7;B%`BK7!tXj)_?*A_cxm?!Uh_M-3j)uDg4q4p|9e7B?aN=DQbzj&`~W;^h!(E at ZA z0d6VE^DW|1sVQ9yqLY~3!sF~znm7(zTe8+CZ7YpSTY33F9QBMvv1y-7>*{Nl`HXp- zvuO7)n#o(;iUo``8r`g7v9$Y<7BNd_U0Sw|+5{Zk$+a05-D%fcE9{NeN|*N3`T6q` zjHr82*f=Bl*d{&wKBOTpUOS`;b8oR>JANcf>=}#%Oy0 zrOh2LjIi17bu1;niF44s|GWB~3K#&%|ohW6$b#)j6yb~g5gj)u;5j{oj( zP}O#t|Be2Y3Jz*f-h#=fdN*IWnG9U_{E-kTs%V{4poX8T6z$ALmV?aw1 at awS$A2nK z*fnJ?J}Q^@iT#EAXq{OB5E;cb7`tA3$a(NNxio!!I(VS)msBB*XR0xR{E0DyuA{~j zPP?C=oG_}2k*1&!uLR>tA5F}JDLPdhcmXQ~zc=A+aee@*P2~g`My at X zxgY`F7C=wG+7X57=N!7`(k%Rf3r~_YKlXML0d}k>m3F|Co7QA#Q#oT+bD=vcoII9g z#JRGM>}+Po($um}nD(?zquu^qrL44c#~?(WJdL*JByx`cbj3AqYn!&g>W;8HdArEm zHEdarh-H_>neAwSjFJ#%a_A^srPSi&qhq7c8D7yAlP;tf-3j{F$>;v~Fa7>D{; zcypU7TXkvYfW0Zl)xf=S(cbZw4oU^sEMXrzhr~p4-uVBj$cukt_0B#`C_vwKAVvUrM=Gzos>E z)Ou%I(Y;0S(z4cfFWx*meqUNnUvt70O^H at Pv?k at CxWkbgghX1j2XKKc`B(V><`^Th zuw(bz1GTWJ+iMJP-G&a6+o}y9KQO_&s?0C}CAqCd1{>%W_>!bvE-se>L(DQaI|4Vy zGf&*B+lh`k#5d;$gc8n_63T^2NLhF?$pBt7inClS&>jg$RD_6g{{qE%wa!kVaD4&z z_!mMA3JX+%C%!dt&{o18vM5_p1WEqZ->-_e&v%QE?nodXgk|iATYX5#`2?qhP(;5b~l#gXs~Y!qoP~uV>}$f<528!y9E|{zXSJeQ8LeBbve2kLDY) zXk at 9rrlLZW#x=+u!2+$wN0FG5L7(d7W|Ag8rpgt{GzA_gizmuvWtGmHeb2mkEfH4+ z(1|cVen7hPn1RIFfw)l?a)wolBMpO2gANz3A}72SQb2Nkg54MG0|QW+5yB_*#uIl) zG(UizZO!ylp~1VtC>14r?aJ(Ta2WL0gy-Ny{Pew|ivFMW#Xsr2mUx{!fB*v8MF0Zg z{%_LzZ-bztqk)H at lZ=Iv^Z$f4M_tPvM;+^X#|B;8wy>ep}#SREjLn+AJv_GaLh;N&Tw;c zc>KlW4MboJLU3?Ah>bsQuQ at 0VIw00zO$$vqDhB9(if*JJy#GbCn2QwNWxCEB88+Q$ z#r5p-))np^_cs%1lw5a{#~PK!6th3?xA9yfon5#}No>qB9=d{fHkPvfRk}$Q1a*l; zlXo4HPH|Q%Q`zrGI3 at Yn{*v=)4SEecI_^-8sj<*)rb#jh&z;ukdx?2_og_}z7_ at 99 z+Z6}XDAU+jveB98w3 at _Y4Vcobq{aS&oG)13Iv`8B2Bws==<0N5`2&MeW z)XI1+l8sg8t8-Ul!T at FP?7mFC?|sNT1uZ)(X0yW4Es?SG%z}ikZR8c{Bt8*FD>|FV z#xZ6-kf?)N%HE%OQ$?Z5vMm{N%Vhzi(0Qd6u)PCz8;cgvsyK~O!PskvcL7P^(l6Pb zvhe^Ff;68Sw*G3dK8=Coq_6JFqu}E#M_e0wU-ylt39rHOXt zi?yP;g>82Scfyr3%P823Nn$qL-^yca+9gM)*Gh}B(tx`q2S=T~ar5TxB)ucCy+X9O z`D13yU#nwh_aC@>|4w4uk>SN1Fv01q+ at X1^>hJvkbny-`mmDC?K-qOEMqxj!xba6( zx_KqXCv1-wS6#NEK3KDt9pL2wnEg83wxe30?5wk^Y{4U!3SjKgak#jws-5ay>^AMD z*ZS+l7EDH9SQ_f-EHDVyPgyKyMT{@-vxQ)`lGjhqOXf|bv3RG#bM3~dQtq2Lkd#o^ z3nACvzSM{4nZZT9!{=Xey{lx+AhB-wO0>|{cI+9Ms=i&xJZJ3-;s6x+b4U-eQyX!< zToSnk2_av~LUIIMffJhwa%J%n$|H{?OX88wZf`a+Ws)ii!Jg%$)e&1V4{^&UR1dyy zcMyyDrzvFMw7Qu<7WpL7ZBi-OP-yW$Pinav8!#<<5*2RcxcM%Y85{B!+YUQ1gw{oz zmb4jYC1- at nE7)yg0IN(Q^wqpGd9ueH^H3YvCcLJR45EC#C~t(;nMcrUIIe991E8Fh zvbb~emy76uqJ^EjUTETswh(1bHz?b-3)Ft+30yu$4=0Rjwy+9s2+oj4HHN%2jfGyX zX-SW1i4J$^7)lp{co4fFFR1@!>G+I|JQX$6L7eF_8}QUY;WfcT#ZoCl|OURDP%ts$6p4Q~ja12PM5nu_f}HEMPN zzYOeX8Mu+09~{^(7X$A&eeXQ|Pk;T-c>T{;xWRl6{J-wO?H#C2(}~=g0%mCqBjOzM zPO`O|f3!b?9lw;F!}Eyfe0LP~J2LOIDom at jSac~7( zNIPO&KcK=0(s=qT9Rm^0ty?u$MLN5CEzS%uLsVl>I5;q4l#-0PNz-p?cFqyybS7$+ zzEbF#DQbgm70x-IUEspWCg2&gE>pd`^sBAJSjd?Cqdt30Urj{eD=hb!%KXWLjoVk& ze+S_lnbx4%Ewuhk!h9gVM)4iZn=?AB$4K-|or6ml&UZv at rdP7dEWFg(mbfElX|&7c zn2#Pvk`76IpkOoPJ~XJkxhyEw8&<{Ojh}OegW_~4m+0AJV|m*ww5BInT|M3>h*W1- z^UAY)Ty=*2Q@&g*rrfQWwE2(L8Ph(lk2(h-?!O1fXCtrG|5A*#*3RpSer}NYTtnur zB)ZZY0H;?|&8alpO19W+50)b!OClRfW4VKnu!YJxcWKP1ggwXuebhsp at iQuOhZ}6Z zA#qmy>$4=L`WFRwuVtw}jLKS@?dI=1kbQu*+21V8OZ|h8v2W at zYs!Y`>2@O&s3X5n^?B#ruoe;N4A80W`F1T-^ zS#&^?zpwWT$+OrKeDE-W=-q-jet_w zMrrAV&}mYO1qCUaq-2|or4Uv+(&A!8fH4cHGJBJOTPtfmFO8-OBH9sI9Hm;bp&%6S zMoYMSa at fH~z`>n6Z4NBQWe`)fM^Hh=%1jc>4hSKc%K_#hsyx0J^P`0tKfa02?r!^PKV1dKcHG6J{# zCf=>9QNH%oun(23o6*x-AOeB2L1EfQgVOYaoY{|CFtoT=q<#z!&Vj)+clT!0>DR`{ zx>v=pB9m8YeC0bfHNUC2(K}E(Kb>I?QrauIQfHo2xr?L*nYfGwGSGumlj5#KPjVw; z6<(@>%27^pa-|{*AHyk`v+>%c*WlchD;3Q^vkU#7XMQLp?SaDDe5bPZP&Fa9vzWn|cj0q(C#azrK?T^5Otcg_^r)|4NeJzIhki4sdl;i6W_;qY^| z#e-XO@!7_LDlK9#A>4GBCZ#jIyTeCAl#>38$yyX9!&wEN0qn--d$|#*1QU`~?&; zUJL!A_30hStWWLM=fV8UhMGk}t3#w92J!F(3 at PmYXzcQdIIqd2UsPgPG0&H)2xoMX z+t at aMrbSYHmVF+dq-2w5Z)mV6r1C)x7B0hLt`F$AHg0hd)f8<`7IhJwX^l;p)~THO zXMU%pg)7=qA$Q=$=Yngw5rZ;AIrplfvN^IOu>p4F71MnbKjJ>3f<{gvMYu9}Y?9jU z$O4bhE9 at P46%k_Pqdx;w!;D-^T8MC>qHVKDq>%zT>k6-{;B0p6$CG_aDNm ztDR*GhBf73m%mrm8jr~%N2FEl#pQ5y{CFqzxlEd_WpI`~B&AvQ0Ym8t?Ts8JFQ!RL zupDCY3}=gO*paGV#6(o7_|vgCsncz9y1lfg>mACcy|nbT*UHG1cFaaNhf9khH*W6@ zYM_$cV`|wc$+K6ZbeovRxms8;v!j4(l)2Ee9b&%T at Dvc(m5$ryd1|?&UaBeGQIA$I)RlumGJ z$;cMtb6jW5DY9>xKSTZx;RQ#ePz8p_lsM8ccTipnfW3b6gl{^0B#=kTQp1;r2P|7JkTIs9-c4uP(Y0BFhP|+Zq=%A8+$P13W9w6`reY{R zN)c0dNMg94BhX_nt!$#3cRUcf#T8s7PU3^(@Tm*lmOcJ%Qf~a+Rsg848g4~FZ;9^_ zh|u95>}rXyh`xOx9-ojT8z3Oxk_=GB0M(GAe1NVUvtB#Gg`ZAGC3*0Ogui3JCX_LX z$oC3|zdsOl&cn at 5gfkBaLJMeP7Pm!$0W^~LIZL*nguZAyK8*P#ayT4oBpvY`8QE^)^Js!@fW zNKv=Q6L-u{rRwGIx+7eV(FXQa682z%xh at VtFtyo0dendMO54`Dz>u{e$8Mm;2qa!F zK#$@;k6eD;m$`v9j)FO2f#VS>v3V?w>WJD3l;{PQ>owclFR6Gqer)6 at RdQW#Q at L4Y zB~z2N^^@4$hISLpqR!MR3GKAXTBcBQh*qjhq(SFCyWrm=uUg5D-jA&+sRZ=RukKRK z{QOQo(fmyEefoh>?3V2Ku%j;jQIPDBg#4kY?g(}4OQbc$;YEFFDu22pgQ7leS at irg zPFwUeG$vWBFc)dcS2h=*KI3(Es77+uofi%}%X82PeTkqc&27B+Dy$H#*x}zxeK}q` z1;11~IP|xv>X?mDx6g3=RUp`53ZCM_@&|v0pxPdO;5s0+Dr11ShP>MjTva50+QXP> zGC8$SidsAib!s&3CS-kU2V95nXt_STB2RCJzE%)J9ZXz2DXUx`N`Vcmph7_w4Heq0 zLxn|N77SKhHsk^lOxixge#jtt0dKF|Bl)@G$Z!MJQbhRyd~md!6#~ae8pKF`zdA=Y z#_ at tx?OHMW8r^cCv>~z+=O$w1S!|JYCKp6i{ySs|Hm(`nw*oAx*h!JDM!d!upVb0{ zeQt~1CVO=}d%|pusk8VQW{qi|;{8tg&5taRv at 4mOF3L0%58W3enL=SQv!sKZ{E3jP zUIuYgRiX=bHi`WDw^sA1f*Zm_b5eQM$hpzR;vbTNGNx4|{_86=RpeYD7bgjeVj-fk zY>_Y4nT|in6M0!08N9PHFqO#z$W$>>RKokMNC}PQX|*G7tZouXZ{Tf_8{5`Fn}M*_ z^QbuS!@zgMm7~kVP{bEq2CE97b;A%kgQf)7f-!+*GlWv}RXD|E z%EAV at TVg~VcqI#X5BS)E-V#R1{>yFd8dWXj#owskt+F`S%GDA* zga>eBHuJxrbv0?4)oRq-DVe!_pvh8Q7J?;}#dg0?df)RIrpn9zo{imJ&fbQVn+byh z{@|Gv=UiTQ`0jFbt$TlcTcG@p>Hqs7KrF%A6 zuwvP!TDg+wv|V*t6kDv<*E}W;;%psHim~YIyG;HW6L5+-*&|3Y#XRcosJIU at 3@P}t zofW-rvTY3&+SW3JUy=;{9N1sqH$`XExtz|Ct>Lpn8gpqd&1>pjo|1Pq>AA5~=m at 5+$zad#-r{3K9*R*0c-F9m%<%?jPB+H8^#?^O?E=Lp>woU5T2jkMHj{l z#%2(2h2KaiTXj9Jz2t#ME~+d?}!ekCi)ylEIQAnzg67j+a{wwg(Oy&-+(ixUAP;NC*Aj^d z&+OdB5meBojMvP=w%8i(Qt+;cP^5e#MiTSXzrQ6X7=!h#BRTV4xON|;+dJ(7xcs>Efp_aWAMypw)?_$>NDfTHA&$2(+Rt$iU}ui(2Q#K>vq4I;8Z0W zfiR>WXh(D-EM- at AcQIv`uA-MvbR at 1iG79+eua^?6Bopnh1c;`C1F2kiv3t1f0cuL~28tEoA)m#d{QZPjl{N^==a z)Ae~7GZhx<0b%Yk)TI|d>GdPctw^UBntPI(Amv)Ziflqfvf}{$ydyZ9tVNWZIGa}5 zjcUni#yo%_b4IJ=&wOKKXt;xB(!ny)LULk;699aeJW68&*OeHMC^S zrG40#K1Rjc2^rY}E-8stG7Y#*jLCGxZSZWpA2_E)Qy at 0= z`Ix|ZlhBnc6dLlvXDqFMJm}){j)OC?YSV-rlS^Y%_p>?l`rdI7fr0>oD#O!Z4IOgR z)68^&q$t#81XUSvhKOXYx-^$kyT7b-;!e)!A%R6%#R^rxhNt|F+HtYkSn3X3;SSAU zOhm)J!2o702kvSBeAXxi1vmU8cl9tyRu-Cv_^>hJ%^?VydSLoMn3B2RQM@`3m{)6f z-lGDfkiKT5AtK9MQ2MZ{>Afh8yx at UoL0Imh#ikW1St?dy4?A~!ud~>Ua)#Lh+uvpr zbPWpI2(vOY)~1uiA9fbMF!qH>3lpR+^QdkU^he7=?Coc)`lysd#&uMkga}znt{(n- zhqew96i3KTEn`{=WhPj#oCMi9992gTDf+tAlapYLc(9C(HRhH?flkRJK7<>$YP6KV z)Unc at GkKFxad2kI(3eLTJuWRXmYFCoj-%zN?;|~&QP)iZt}qT(Vlr>L7(@wVv)#RV5I1T3!YY zI;7+)w~vKk7yC1 at odsXNMz?-X=-8r=$giR3^y@58>pq~HiUe4&7KZC|!#)d^`KB`E5iKT876yHA7$N8yB$DOfcZcf6cBLN} zsq&BhP~;KhO`dYUc~5=W#m`bK`AP9}jGeCd-E-+4KXC7q- at ipDK1?7uJ43}7ZBM=^ z>^6VR+pRI}^jzk73@~`hx0SsxxyE>WytpOpUgw?}vAW#2xw!F?zM9P%u?lD&uZ`3G z(qlf=Bl52sf6}_wCT#1f&bvALpuf2EO0!DtMKG+JT>jz!wqw4rH%n}>P9v$FL9u-r zo*z|ggzr%O8~qcQDsHQ_Y-xlsFC`z6jFo|~gqq4pPI z-Pm*{_eQ&yi^Zw;((e^i9~;JjG at jX>DbyJ^Ek1%Is=*$c!+!m*2yO#n9;-ffIy2++ z95W3s(iD>j^EzATSs|@`=yUe%t7S>^%rcABHkquM+(v4bDHYQ9YVv$Or8hVusTyxw zmFVidk6b1PmsYBbxYXz|c?20C!-PzV7*T7BBhRbXo>#ZM55-;}<#2N#HMVg=RFDhZ zq{5ntCjPv at 8AiKgY-3{&;(X~5c3u at Nu7D?L+D20=6`+}G#ILb?RDo%P|{qiB`eY6ylV%9MsP zuENIOMk58vbD~Vv3MzUK0>%T&xOv7TE_mpnp~$X>-uc*Bq^#rdghEUb27%Cir5TCwXuv3A ze10v(ui*U1vQ9$paYKYSNRYxIK; zt88ARCeBmPyDAby&;R8TZ at eId2Q_WvrGLZb9eRRZ^BF0ZiJ}VPyiYr at vmDi%`JmMZ zKUmT=w}iDW%F2PiE&9N at DLUD;B|fBkS at 870Ah_vTfD@_BhEo~ zX at CUVNSRoz(S#|Se9Qi5}F#5 zZ{X0>Y#{fCYe}qBAT1CSCNUST2#=I*46e!Ac6AHNU!hs{wCb_C>z_~Sz0GG_EX1?Q z!_#y2E{{cs^$S6Wed5XbLqA=P(3rt@%Cq~{d*l7W_x3znM-Q?V759ZXGU)5hNPK|A zOPw$K*NE8FFc~2(DxPVi&B=Q#Y7IO at _>dSn{Wkwo8>QeN-Cvm4hHrmx+IxjlM==i9#Q`Uc_2Va)>k+m2ntM?qQz_SUzekAkp6pG~4*L3e$HrAwxxXIyx4F!T#)Weil57dMs2Y#d$n298^R*LqP2#Kimz^h8^kNU-%g&= zL at M+NtEzZ3vN9zqMR5pO4j!RY3?&SKB2+vn!rIa~zl|dcoAiV=XpS{`3|GcKT zWt>Q=9&886b!u$uWK7DH7_HQdC7)s8S%zuZOaXO9@|W~)j{4|0l}rhX>@c+j`#!5l zc4=k;Y0#(&3`+AYhALmt8JJgKW!PR(Xhzwgolfn}-!&#OGq{LY2CVzFZt)NxV?wM1L*SRZu$#yIx zU^^+!peE#;+zx)=%<+MbjPZJ z*d61- at yxP2y%%bwxPv2>lKpcpKN*Ad7X%?Dusy%Aj`nr3H<~HRu(-+gMFwzSeuMO_FpEu+jUg7oHa>vPE=`7QL|_oE0I)VucDN2EWYLG-!?NP^a#>E zcGGbM97~HAhtKiAoR`DzVt^MN4C!113 at fV#{JhM-(AKfWiXk9aD&|#w`kf2&w*KVM zwr_}8MomN{RwrN=P~(R$xVd))wIpkgt6Ty85T_~AR*lZtEY7i>KF4$5GcHS>6M>P< z+KY?MxWtxBi^QH9i!VdgCCMu1%1xmA43E$apH$cjPjzHX1Y7Xc$(T^xBww?4(p-Ta zjZo_X(mv? zlkIj%Jzj;YpKU50>RWOAUF?RuL38I6o`w$n+FQPe-2shVl@)&bK>Y znVK2gWk$GD8FP~A_22l?6>6pze;wGVzbW}L{PWo72LI+E(NuoiE(&_0?LbAF8 at n2E zZrVUk3yvedK)i;TCgjq;r^1T}JvAUe0yZlQ3C5{0r{3>rMw*D5C}%6O?PQ<_rXV*v z?e2YA7sGY#z=y*>_?#MVrbp8g1v%0~bi+0G+xhadWw+hrt>fZ5Lj+{K2bf=MVNK22 zWOHr;+uq-1RB$C+*qQ?0xQlVh^$-a?V5$()Y6vkTy!0 zWLJLriGC`f+hZlfZjJ9X*5%ME^>1ABcLtvGfdjaU^SmDr)C3vSB5DAsAaLg?fe?bA zOS0AMA)yj#3JBwzbbQIDFNt?1AwzHR7TqCbWQv4Sd7Lpb!~~*> z at T0nez|rU)S~Cy;nH at oIC{@(D zC(s7wR=Lq;ualMb_MUohb2~5p8QB%l;E+R4o1sO=nf{i=!U0X|7RL3^Z73t06h_~F zd7ly{k^Yz&a|p={e_%e+1!2BBYlqHQ2j#1*Go;u9va`ht<;&_I?uOxC`=&;TGi@{o z5D+uu|Mlpp;NoZ^W#DS?e{@b&X}e7^#Ba4?k%$6q at rHYQ+~Z?%Pd3Nw5epjCmJ;q3 zTuu1=q2ENPbaZw{aFh%Alq5YbD|&NQ2v@^l;+b5`4Js-pd;;J08s5Hm+N`6&Ia4S!oiN9dZ_2AW{5P}T zFb9{C{>(w_T at A+ky0%Q-i}*Z$tXCT$nAfMRZ9mN|x3>>qZ!!kejyyB{5v(%dX zN8V9FeOJ7t49GSeJ4;e;pvtsnVsidWIFGvx-UlC{Br4%mjh0-25>;x6at_onXXEv^ zC2Z!K`)MiYpwJzdzJX5U8jDCP at n&}ra3eL0p30W5F7=?Ql zcF9T=Qs5@>==f#rpE#^NO_y~arpeci)sW1dggQamEI4NEBuI_IE5CiGFE+BAsg7tr zTaLN!!E`;^_AJz at M&#@`Lg4`v47m{07R>N7D$unrE{BVm<_k&V~C{~(p31J-JVT{0(5#Bv_D54VxG?2Z-f z))^n}73i%}t$9K;{gnykn z1XM2;>lA5xKVsPyhvc|k82K*M39|SxX>jYNF~F01SO9~UVaJv9p+HzlgUxi9dwTF29C1`W5O}NB%|HPO?FCj+vWhF#^~B=5cGS&)TLai(c%_g+ z^Lh%?!fg#JH`%PdIlUxy2|og#->_5WfLXm-3bOC|z98W*kV)9_nplRFSKylfI9}s) z at 8VzIDvzdE^!$}8k(1K$6InP~!&inrP9Ksj?Sd{zDQ3xkUE3|!TjtU#*=89PH7l1t z>YMvuE`k>tygZ<|b(83Zg^33k`A}8X=;#pbs|izJF)+oNI`BgOtXnOlMntLz#VV&IR)(_6_<}?8cEB?f1fBQm2HTZqUtIaSfCfTu^mgNvnt6{|03rCuc6y at WhYQ zf2IpXE)kIqCPNDT5;JM+Xeu5V^g&ve=lRf%Dm7oXek?H{8dM=D at 4fL7FsFOim_&ij zYx_~oz at O3_vpVJH3|dHNxDy)WYFw%I!0RJQH8DPd;<-M9g-vVYp-!&-qYA+suhLSU zjB&5v8EHHXcbE18^epE#+jzP<&c029&Of9IgVk-PKRiIaLR(!Vq#4R&DgoCp^fxqw z+Ll=x`*K)G+%?PZ>XW}aMAlm46 at F9D!uMTYfkke^?G zxv4CUaqyb!M8F4429^~o=x*tuYO5r-BZ1Ec?*yw_y$yQoYO$vp^DtKS7%LkE$6fOfe3 znpx-!R6ucQZHfWYBWC{TlgO~h?dNaEL=DD8ok4fFD|x~IX39zjgA#uIC?lqLAX~hl zY;i{T`4r+vz9j*Pv>nt$cGOrIk}!Uo`E?TI;26^RGt>D*!w}EVEI)cXVgpF+Pw4AQ z9b;~wN4Oij0oiWJDAA5rg@=6iP_f$V`_hkS$`3hzo|wj|ecAyg(Y2z?yj|wXW1mUl zd5HyUOFEG$IX#`}H`u=-&I^kbDg*`uH1>}v#{W-<|2x8JT29KUsNb$m2xSVIv?Ux; zRBW;^!2LLM38bxwnd~i4bS3({lI#Ggaju-CBzVZe!`plY=!rAf!&`sO=naQCh_kab z2)*pPw6nbW+8z`M3uTd!scat&FCQx(FP)ij0>7W`Uweqo4A$=3F$Nf7-R>Y1-Qk8y z0rz&xQRLlJB1}xt9Zc6kTQFcKhVIg^Nrn>c^&pZ6a)uKj78r6&m$7#+nj>Qw=L6ZP ziVsLd_4%2VCg~K>-l>gode_V5;+reIjsy}eZ6UPEJ!p*Bpir-vm%nOTx-ITVscQ-rI^l@$>_ zqULQUtoIyn0o(fYJJ=neH4~7N7!%Re6qUL(- z^^#ko0^tW!r*LPpPuIgWlf#O9hB9K1Zwf6_&Uz8zw6U;&0y(`6ECMSYivjRpvKR~N z^?x^9d;^v;6y_wVGfO=a3T)YFS(jmond~6_XECzWF_wSpE;|JTn^=0<#>-fvGP_51 zBYPnwVnf$DOVUu7tcD)izlAru9&<=j2}ji(bQoK_{eBX0mscPZWjwpS$|{GO4h<^q zG*d<>0*ypRzlXI+BHLbo=B;F~6pdlVUT_&yqKi2X-dBjJu2c>AtAfR1m at cW?Jkj<- z9-Wx6Pm)QSF^cT>J6?4z)RkJH$k+wzv{NP$PGF-&e#x5c&)p;M>>v6mO3oM!j2TMK zs5Ufbqq;vOsNEn^oS3e*$Oil5HH1OcnC*d1V^rxuCj;GqywI at UWeggj^JVJSZ>y%; znq+t^kGLt(*8ZYlow#OSv&SiOGfv at fkE|?dEm-y8vtx zJS~D#!S(0fMMI_H2!}yzhT{r;Pan2sjz~~m>ODCZgMbSS#jN?5ZRMKpFShq9$#>gH z$|y|NSIgGp)?0hxjL4x;a-pOGWADTQk0yNXkDud4vp{ae=EaR?n`$y=@lllVId|i9 zq9+2~)Y;$q@%*B)k7USK4KO_O#Af;MHMa{AU*d`IiJ<1C^nrsvK$qeb3z9|3&@VlgxixHgN*xMOAY`20Z zeKB0MjB>uz*G#Q*ChI9u_s>4hJeM2Qi4B|awTybQss$KoK34v;NpGLb;MwoAgNbh| zm7R{L+pneKH?6_mx#R|9>9Xi%3xf1$V<%`D^}HoK at xRin1O=n7^wdn+x6LQ%_<8AQ zn$ueq=0{ydT`^|hH4<38)NPH(`E{*<^K94- z&NDf;#BS?+RoP6lbpn3>09>Gf`isvRAtb;3jDYqV}yq8fe9tYsbBQ zAsx7jq9=aT@OJc*g2d`@$qggyL0t0NC%GR0 z>%RXL4TKh1KK;V_5O(D{)Z7+>GcO^HG at Hr3$-dz+8%gT>erpEP$8Nzio~leA1OtNt zOH+Y8Y;;FeL3I!v7EMMqRtcOIXCfYH4A)SwR}~B)($rb8W1v+>$BJE<3hUly)iJ6W z#tBt**suz=`Gx44y;ls4D~do5s;jYsYVeV>VA5+j=ZJ+hSCs)KK$I zR`|gARJ-h|aXcpLvplw)I<{$xA;|G-xSE>{+qG}OiW_a3W%oD5C0sB%rhAYF3-~=N z0cerWn%VEjiyn*Y-L=vg#mV-RaCsUkDU}y4d^#o0wd(*)d=Qc#hsf3`FXPbjW?6$Y z4lU!Mjjh at Y*F`I)>~(1`tEb-eTj&pUk at LC1iXH4wO zX`7~Ej^v(07#B1G9?U{YwaTz*kSb?J*(35g!(c8dSmCX_93B%3!=|K)CJ+;TpV1>O z{s|@Kpr{w*!+(ywn8SEJ=7?l`^qcULGZySsBlt7CASj+C3(`&)9k?LZ|B!XnRi87U z_@<11 at gdyLP3jRWS?2jwTx7?WLc5=;AV&py3bbZE7fec5F%dF`WxZx=g*-Wtm4f03 zg&|>z{AeBbiybKkhGJkANivuNfBf>P&kyEuJ4R=Ol*yk at ESaw#_!(9585ZS|OD-wL zh{2nT%utdza*;EL5zQHzDsw!LOM$}F!q|J5Wo&^~7=F5C|u1^M)$bo3J*9jTIl~(@S~cWbL`s{3P@%Y z*1JbE4L>Z9fzb6hil7>_0msDO3!$KA3HcG|>Kszz2Ah4&ZaVGr`EgP2bHAXl1Hv4s z!91WGnu`jd%#qQhe`p*FF2SVLjv$IOV?*^|7}g)$H_5P=y;F+q4=F1cuvANb?hdVD zy8KJcu0jAjmGH=DT^Ii0fQ+FK&j0JRlH%)(xQ`ng{O3?wAzET+?OlYF; zKixj%5)(UBegWBwLP at dBq>cgr%}8Vd9rkl!U5axsomYQ%<^Oj3*8jS>en)ED#x~?a zf~izmZpxTdRi9lRLyV!&4=dG&WIsEq&csiiKT|km`LhL8W{5T!Z;&?hK(!20(T~9< z5=r%)sGWS7CmpKJ(&Va6f%ix0(({yL-*lgF^;2cGq1y~rB}-20qx3h(rjAOg4|&%b zqUvNg1<8ov0 at wmHnYYOLEQw7PYf#^2obGkk8!@mpe0(RgT%CIj(J-bO1FvO|M!k_8 z0L5i$D8}4eLnZ?5dW==`cBzaGPlODE+4b7Wu~Bd{@>5;9>y+*Y&_W;=V1v5$QYayT zfX at D&W8;U$w`!{`++v($6a`OkxDjC_? zOOKx3dcf(;-HCcjj;49MLHAZ3TD^9L+MT_U_m=1%{nPC;V=6uTWlOpC=8wyAX?Nic zw!44am0T at Dkk?yw2*q2mUmB}^=YyBTS#XHNTbbYF(R)q8Y8pmeui<&LmtV2ax8CG2 z$kuc^K`t8wMl&|{Jdmj2?mA&NlOH#*#lst=)=t*3x|#H5DvRgzhR8~vQG&el0{=@Y zFx0u=XHW3o+&+(8!zbVL8y6^>kvmiB;ljWG)1(TG<2LCIr&t=FWd6J2*m!lv9oMBp zE&ys2=}{Q5<^A51(N3y0vx`ckP%K9UxgjmXq`I=aqvHct9=5(3F`aqsQxLr>yZFz3Z-e0+2^B zyyB+ciPwTHIi*>!Iph*bbNI3)!T^qI!M6lsp5Io{P!n0^ioP*nfR05o5%jPlX>Mvb zYNhS{-#Q8IDjS>1FN8{fF31wkYa!XE9ntpM4wT1IbzczGH at d=!n|j$dK37V=cr~S7 z?`bKoX{jz}ng1>KA^lVCdol_J=;^fUG+`J--iuf0y>$HgdIa`&1H)!+W|0kMm-;Rd zR9YgfxBwY<3J!5_AycvnuNL--1PaC!F|>8YqjO^)daOHo+Ql~9PgaklL)uWz0L z8)7d15&F!*;oNuL({g1I9w^ zbsfFLDZJFw0{w+H{?PVe&HW at Cyu6v*{t73fxNu-bx&}+v!+`|94UebDv$UgySsr+$ za4N>)JOgSr?xLfr`!Sn!ex>q`- at 2OQ1*!#DljgrH1${BdS_{H6Wau2?e~j>zdInlB zM5GW!E(7qAEO1i5OAv at d?)$=yA5}dnpK!Wd5iM+r`doU6y;>oq55MIT(l3!mi}Oyg z<;ODJ9%_5yqA^DJN9JQ=Bl8TdXO8cDwO0j at ssc@`k~HfR21Htx6v8lY7y{S!se_(!rd7vSF5U;Q)PH5*LI~X zoEDcjj(n82aAziA3%C8mye=vVen$z+C$-NTYQPiPHphZsAMp155TCbd4jYSF;kij_pjf92q zU6EDB5fm=3u*i>x$@@>CPs-R>`JY0c!|Nn?O at n5y5v$1ym|f_L@`=U;i97k6XYxOV zJ{3bazG=315O$?SOeoe$!BKA at g5(d}=--a`pFFvA3+ljM&-~$Q|M85_U=WmXSXdyS zUzq<5qwjx4h5u#rd3bB9qJ8V0OlMNrw6;o;GyUF>BZmSALAL at Di$lPZnpw$gkPCb= zy2%&iOb at 1{H}@7QMFmA`R5VN~%te1Cqf1ee1(s7PDGceXqoVeM&F{|kRqu8 at FlUr1 zrwU#7-0V2bzRmcaR{Y at MK-2@-c`za9y&R}vo$Rw?*}fEDyN%iZg<$C2 at 6WOIUJSF_ z&qvrD(UB|n>yqb|uk`cU>*wZri-ky=@NPpWY99^q@@Yp13!eYN$9>)lrzN=E7sN$t z4CBRgIy4}daF7WVH|C at tEYi&mbKvN`5GKQ)96o%_#gTsvzxv?+1QJNTqS$^-2*tt! zxeH!Sm%t>68DEiDSlF|R7 at iVwT9P22F2)g9QP{G)jtoBhf-*8EL}o9XzUwC!-HZ;mn0eSxY%)|WN5XB*U2X(V*34$R(QSJ*vV6f&*JJ(=8e=87+252h zw`UnXM7-h%7pt#Y2HwN9V`iDYgB_7^H5k-mY8W(+b1dg;m2JoqBO=m!CA*CsPRcfA z0XGV9 at qT#sU9K^Dtk0{)ksJ;yRy_vKqEYrJO~1T{#h3^}1?*X06ltHs16mrob?c9{ zWBbg8Q`n2&T`cw35qyhm>c~0KV<9<+T{?imdR^ZLbi*Bl7nx>yTbHIZaF=c(VhDNy z{d`-U^*<;(=ip46t=(rb$;7tpJh5%tw(W^06Wh)c+qP}nwlOiz`|h((ec#^aRDJvW z(^dUfSM}ZN?rYVrueETaMDmn`$n4y92zN#59!NPD_A6nu(!1mG zGPR*1_sY0`EP*_Q?7dGk?#YrQucr1%>Xv(^vm{m#L~F(g){`}n#7E9xMAd3+FjYwC zEL4r}AsEN!TUs`sW3VUGdZ-Ofx&O6GovcU%Jfb%82`4)jhk8mE60loP zc?F0pRQ|v%@CK0tT68Op at kp`|6tj9plR%OsiLu0nf|K(?M=e{~O<^&8ebS}s31$}J zCY1IfNZwnK0)AxXyayoAX$>8t|3^UOdL*8h?n3CFWmgR-CJm{CtS(7IN#;zz%PQnX zXMdbUc3P}RhUZ2i7qP12!-OOUw}mu*6Y*@@C`#NG(rJw31Cz#gb3*HrQw=(fiWb|u z_#G;j*%B=DV}L5#ZO}XpwwW0Psj9tq%BuN2&B>^OjqNp?QrtkV0SbKa!Q;q`h_AY- z>1M1Y@#tkCXeS%@j?I8-sb6!1t|7xEtE;*j8L3y)ja&Nm5I;SPsv9962`*d0=-A8s zF*E$nQp4Y{Fs2$Tk~IR5-gvjWA}bw~#IHw1Qi~pa$=ID<*sSK{al^Q{(NaP2b>%O& zsOT-XDEwJsodgsnCqqB at m&P5w(V6J#aoea4G^>%8__Y=o!J}9XsZg}uMiNZ#72CZ} z#2nu^^JfjyoBWYx_dOi0zQq~JD#JrlBj`ZtpU$vuX z_x))Gm%8{-fd4bHyXCfx!0T51F`p{>aUZVZbZGninfsHd?yGcnI zYj&ciTFC^IAwgZ8^pdd5Uo-M(vN8 zfXzMz5-V=8_+(BAoRU--v3I(d&log$TglAvwG1A>B_0m;dIlB^&DJ>g z*+eguXu{rH8tGW6l6Gn(Lp|;dONOMkq~UCuXWFf%1ia`f2Lp8H(M~LDeA)g>FRiLh zr!UuwRP_-vFh&v8n6I0KRz*MJ*@y3JemmkNlVmWCo8UkW&wL4wLl~jgr<+)_Z?=%l zx;8PNU)1jh?f%7}Q$-E^@=A)clvweGPLd;Y$n=haFzT)ISap}3=1$q& z2YYWNLEzQM(@9L<`XMEO at jj-ook9G)=Gjo;jOGr_OfKof0amMm5VLtEKa8598oX(x z-1yl+mjd`0%r8Y9wsE;BiI1|4qQu`zqglt$>#P**ZugMAM~?1H=UO<_gV(HvQn=C2MLk!) zO_Wj1onvrE01KP at OJlAU8v`ixf69n=dRbLxeXznk=PNqcXtEzn zGZraO!P1!w&NVReq8FxBO=zCYrc}VIDT;AoLvTuG{($*J#JllLaBEw6TZW-($64Fd6u at W1Z#0Zh0yAc_{|=yG$Vk-hj;V zj`VN}QAEuOhG5AJC(04+l@ z8FQC($XugffM2EVhCF^9lDSE7l9yUc(?be_4 zv!%=5ia2$Xv-p5Ph`j$)$X0n4PC>)MWH;0xW*?rMjM$`nXk zQMuT0v?}xFS7-dgr$*h_#AhXwE`ocNdmF=CwY0W$hSsQ6xBX?hYBJA!Dz-Ss?4?Hq z^8nKx8}o;hX}hgX+rf05CfmW1e^l};(6A2qrtS2#UsA?1eLpK at jQoHkD`w7DX(y?< zj>mW?l@%kUT4 at D)6VY^=R4Ce7Bej$T^w|9sqp>$(35}v0>gCh1IuVzlW+ at Z;I86sh z3yQ=8@~&=4N4p0Uk2>sR*NsDw9Zw|DL`gor-hng#oHwv|w~}Acw4 at 8_Nn1R*OBX63 zbd8Hp1qk8F5Wk^#htuNcg$jQIj46o(E#}6`lB_c+m)MMQo2c;a?i^An;mZxEipQ)p z3V+M{GOo6?+30{H&k%{jRmupwch{JerB2Q?0!HQ|VHv?!Oe3gjjKzmtB1=|UgKu9I zwI_5pQqmVOv4sWxfT{bg=87w9sq*smv)&-`&8R6~mhgv%M|qZUqAmtT at 7b_HtSVRT zMy2O-m?JOfcobVQax`*yuOSv$qDwUxlFz~iHe_l{vVj-?XJ!A4!8L(4x zTV5dFugLx^r!Z$O^Z}jxm+-YgnMN97ambid^x>x~V88c4(iP|fts;gIyW*802dL5w6 z9eBEiv=k0;as{DSghw{asMF(-=0>|oMEy*hc7jNAgXOIzYJ*l)#Lu!c(h4gI<v6 at XGV7J3>wTGp9xXplMzOP)H7U{S z-8H&42Yi~m*`YbbZ=H&ULlEwu9d|AvzZ9C=;o{!nS+RfOLFlql|B28=4p07cK0WZ! zp!eC;df$zM8iO;B^$X?8?&?UoOszD%U!$Ddm>|NN^-L}K-+OVY4uiLx6xV z{!b}|pq+`6y`{-N8y@~MwNO!1Mo~xoWE(XTZexKQvO>YGC?N`^L7&$Gi~7dG`U4Cq z{L&@a1S(?G&irTp48_|{cF8u9AOCwhL4|#gUg}2BAGd;j+Tv5!;P_*2OWe9 z(E9jmkIowr5yWUM5rS_*<%FWno at yDrZ#!e>sB_AM at t%juC1DVOP66=%^@M}iDzuZ;s|xv$7_fF{7S4VLOW zYnomS?fN|Le3K3o*027iqHY+gLAd-!_bE5(OS6RbdhrJxt~Sfn+4G|&u+o9#^x(xC zHV#I~-=-`Y-Vv2j<;YIrNwk$+#TJ`3srXp6k+$h2on2ShE`5N^>~OB&b-VCq)_JB* z%b|J_RWmOf^4+K;Yd2}@6}Nm#3m5Hyr%dA}nc2v4w2C(4j6a<*gDDqH%FIVHy=OhW zhY at +);Puo;v5Jl`Sm4d7i30~TjJU%&{@m1KEi}6>f1RofGoO)TlamTB!xB at i-U%11 z*qP>#pT4&9B_7n&sp_?UUg8)t%}*E#H6=!n($rVRn%=$|gPJO;2MpAP55EX0mO9nK zaoX~id5|t!wadKQHBzZ~5q)=itA1U~2!gjR3VC?2jljL{_WM+vR^X<!Np7Ced11}GJ+8d(+$ob&fY(EB2-?Mn~`qI`Zw at fRsSc-_Mru|EmE zK^iV0_(Y}PEZal{_6;|b8nDXJNWuLm{4`T3@`*nuY>SWo6^!f=CDEcE_e=c3kYiDB zdagf|RtDl$W&37)GZF#b8TpBg4 at n#oQzhPBJ*qn|oBye!}w+DG at hcv<;d0rfuUbVi6 at gm3cWzr7!|kK{(T z_znVc`U3<+=zse22wNCB{RjAR+-_YAm6t>*Pei$DU&HcU>D~dQ(`vQqk|ilm!!%Q^ z at eCx%I%g(48OstjoP~011j1#R?iCWzWL>oGmRQbjKti$q+*gc`bQCY$0U%&HS1499-3m~T(w&?yZ{1Wwl^UK`-i(k4(^wHTj zjf6I~>at!IEgQA`^^vcZqE~OAud72Ba^IXgS;6>r(~40vY%~O^xXlI1|K^t!<%I$Y zfAh=ifAGszE$247{*HdpVpaa-3O{R1lxiiR{uB*Whmc&3P-r-mXQ_VimVzB?I5h8k z!yndrx3%3BhG557!CunlnCHcrk9mfiY*hHtg>Q`yV_(*$8eHu^Kc#g~einG4p?R|S zT89b~&i*EpER_25=fG28Tq6_~nMlPa!Iu=eC4D%e at fic=9l>b~Z z-J?h70((lO>4NeiaaWrS$^Uy4q&qN{fYAlt=?HPxc!Zd60fj--`4TMHlGKO4F)a(@ zgIhU|KF6d^nI4JrImQ7zCCE*Qib35ns)<(NE;U}nLT3d3Fd9BLvA~p*NdD`$2^$gp z(aF!y6DJNN-#`iCj<5WQtPUSQ&H7t$q@)qZ8 at S>l%~b7ntV#DiwU?i@$?=M?zGRq2 zeCQr_6^RVEu2{HPodNtpm?k!s{w-)73k(up0Pb!<9FyfI=}ZTDBL1{V4AS`QHTc3u z7hH=AC{JOiF}g=KaWrQ-RJcbs8SyQgJ|e>l#Q}j>NI}X>775*#Xz~N>?V58poXA(=GhJ#xei84B^0E>R}uK1cc*1i{rn?|BGHG zscS3XEdPUEiW=FD>)6zQ4Pgev1_s$0Q7|H+3`Qpz$;il at wb*G6U at yhFg}I4Fdf9J~ zcW%?$t+nlk91S8|$wZ|UC0Ocn&kwt;H8A^}JlxF{>zTdAKYYcY6A84yF$0|+fnVNV zPx?RqjQ{j~MfW3V!4pKSM;eGjn74|CNC+wSW+3PVt$^%nDcTjyfT^+s11CsbU@;sn)U1%4G1ve>L9 zvr8$2jjw)Mf?F-6F{52zH`_Sp=>S=!r?Kk6*DSGr-htU5^68&{?D~fxXK;8udcujRw z_-(p5&O+LV2in)0?vD&39UtRSmIH9tPmRdY4&V2N_9jXJ;O7s zA5>i7v3 at f~<}bO}%AuqFM!6d_kuoOMnvT zDB1vBqU|(wI;YpD6CfVH-gcOor_9*tP9PJSX$hQ3zWc&7bB~y}79a0}W2|2m?`^hl zAEeC{_h1(@n8jOb*!-p}dih2ZeA1P6{+82QuOGwZuY6$c))c?XzxwPMyQ^v!hpQ{h zo{Hmjt6XasEOe{>xyiqCeIPCDm-sNiJHzTu_e-~pfICd zt-3h=f$m{H=UA9DM{T!7R42{0yW|>UmMQd`P8Ep6){3Lvv6Wad at 2PSp98Cd*!i0`- zI8NO)%bQ{CLs;7=&m+U9<=k-LX%?3{+HAU|Szs1du^-Ik6Cf*!(doL6cp^ZdqNNNs zd(JdwN_rgNv=xGno0noiUkUzdL6F!gxh6Sl6=?^Z-ao2B_-E-mC4aJ!B{qq7&O0{T zm_38Qv=_BMhs-v1ER9-;L`y!O&TkWybnSQq!uZlRNYeeMTypL!l9uQWhzBQiUl`RF zyuPvZmC|?o$uWY0WRpW*RcUEe=?E5?5wr~S9NjaNt|KBY!%~Sm3dp%`uAj|i^aB)Q z1Y})$ad)?9JpTK9Lg{9FD8DD!zf_!+RqT}v-`FX_VD7CV$kY+Ff*yI0AQ{3|CT6Iy zuWav5^+(UT7oQs{t!#1dNybx$_c>1U^&f>7QeMIPnjQRVmHEZpMc2yeI?F9kn{!L; z1vZ5~uUW%i%feq7B9TfhQ01S)lO+}Xj#NZvb6>;7_NqyctKBs!Xvzm32xbz02e`_bsK4Qb`(G at ygHTPaNVF+1GW6ud>U{(J%R8hqGGci&B?J zS7ubEFUdbYf1q|#S<$^%K|Ck#qQgc+H*5%pjL)kj?`Kv$#Nt2d at PsZtb)!MM#Nq)k zztcK3^at803A~u4zeEo071)~7ehOQZuee^ziqKa&?=kWTFM8YO8xPQdi6+LIvghSN z0rCoi72C!rqs+aBV&C%7?#z(k?Ya81gFg(f)f5MJ zIU at qgEs8st_uV!RMc0TQ{0&4Y5665!5Loyp at MN$+LINiwbeHH%1=l;tw=;5wN0X*x z5C0E<LvuJ{_xzD)dd?C__o9 zfM@{3Ev!E=`TGe{z+&P;$?xhylj>;!h54?XpP;V=H&`3DG{$$bEc!;n!RYuoraWk! z9sWzKA at H;5%Brg7OO#E;>5ml#_Ccfs($T-uKi>7v{ar)}-^lSE$$KGa^hA zh2Fr>Ca5mZj8%iccFLiY&iTnV`?{^^XG%k(#x5~e_nOS1T!E7>Hin1Jo(DP{9c1d;K4x9?CFpJdw=VLW%rc#H>xbgz~49= z!pHF48Qgr%#o+JLqgd!R9>!&AnWbufYN-`F^6G3scxtbmj)17qPvtoo`o at kQf7q|b z<4*vyns0~evdc&>cH4qs>Mj&aVah?;uZ$1;&4}T;7w at V&91YzZ^$OPCsQj(aDl-Z zDS^pxC+tDCr08tT)vG+dDc+lP7WV4I#2rF3JhNR?XtU!m6a6vyxY8uS zB=oakz{qjDhS*WDoi0K;63V~LnVv|(lwbO4j=RfYLuTkm8!cr3MceXXGVFQB(a1|% z6vCX~Dc(rj=q3_{EGS16>EHoSK&EA?SiOtNoQx}%YC9B*6s|!+r92m(R~<5RTEprJ zhqdeQ-;w0ze at BwY82vv$@w6jt|A{0up_nWRB;_{>Y6{Zi!ryJc;IT7>-hxSHYtmvX z(q$IXxrl8YUCtu8Sq;Vs{-%;)D7`air!kVS%qAbov8;cZSQ8dZ2W|UPz at qab#3o}~ zY7{kxaHQ-lQj;=cReWwQ%~p=oXEJhE(z^f!R*CJyg-;_h?%~U3rfZ44!gK48nk%`^2AH|2yrzta2c#Q?=zuZ{A4+U+%-f+Kfg<#x5 zXnxEF at xR=dcMO22m=^Sf57Wd4h_O&tP^WXW+|=p#4u(`3P@~m4Va`gl5N8Hc<$~|O zxk-&xA)p8Ax-W*-!^>?LHHWT;CqMpT2lCR zm#oNH`t)*xzU8)yM^M$6@{d1`4|X(sbkz*8jWMn3-0e%v zE=`P~>HNL*)@M1kDhLrS;bB%~m>6a>+ZE_MlV()%p}1 at XS&l47Sg5APJu45X0m4fX zWi!VRb%`E-WY&7ry;!pkmGr`E{q!r)?oBR|jOd*?4H2~07t23fwqj+Gap;7>H7pk1h;>fOcY5 at -4}#W}U8XhQ1N z=IW-7yA&qr=mYJSFGnW%P4!#Nmu(%m9u?mM{WN3s0lW_R81pya2S{e$Xl??j>um+` zX@{XRJ~TT37k}dCZcLbA&HNS|qnQFKrVhiq2BaF+b-F~;b*7Sf7g>!bqX#|X^qL^* zt-~LJ2d9Y5Pct3P-rP>swv6pL$w|6UgIZw8T5x@XeXv+xF)gm<7=b^vxq`H=Dpw=qu7<`+2m3g;=@}UxU=RT zOg!X=6kDqjI_sA2tzL|_A;P$O+sz~)_Yqhv=U5Co@){VAOm^3Xn41yApDURWACP;3 zMcd!bYO*N_41s(-Gwv#9>LVS;^anHFv)0vw|B7vW9ByvgG{JmNCVFF~#lyO|1*u^@W1Dv&=c+sm17{9pp|8 z0__VI+9|*o!0D>F0Ta#%t|4r}$?krH_y?NH9ijtaOZTDcYcrGk|@5xrbvxdMzU zDi?;A`rmlcA2fVwbjr0YZ(No2l{gE!Dym|7Zu5w7NlVoShT#R4d+`l%FZ#JM4wrQ8 z4j8hr86BT?C2g;@U751c;48$NM9Fd@(mGwwt)BX8zQy>?-V!-uw3XmH+p!*Zzg2+o zRQpi7My|3eqvT*-mE9&4O1tJvEoBKk_FzR=>`iz=qZY7e(Nv;J6imBL`e+(n`)>7b zJSpzllybDYf~I~6OnlNZ7TbDTi7}#n^A2?`G&SZAjJQj%$eWnl_RZMd-{gFX+ZdoGx at ltEMkvTnl&?sjpK`deD%LMP at Dvvv@- z2(#3t+&`bvR9 at q3d$Ks-t0#f-{1E~nZ=*T{f{izL+GR2XluN7MicwEo zow1runX5ucY(FA-_E#&@BCg7=v`szomwK61mqsJM?Cd$hK1*+|>A;BVbDfYItG!MD z-eZ(GmE?myx;J)G^GtDwq6cCz0VLm4pm+%8L2UiJ;kk~Ic7gJ~=h_*=5rN1KXyH>v zBk at FT;A8?ssT+aL+J}l8zw}5zr2luyd3 at qwaR>6_!nJ(MAev_dEOmFRszG%XLiOG9 z7CBz)<5lRC+VXIu0>{YXn3?S!&cc;tcPElAJDMh7qEG^XN%qgEyl}e8i=(%vKuVuz zcrMTwHx?4+`&&3PKB}p0;OWu4ZHH?WnVR6a*+Gh_2ianw7muYw0$#9Pm!(qW%%r+p z*-87$k|7ky)3watM2n~-) zn&B&|6y}=fbs{Ss$;&gDROGPw-Ek(Qe^yS;*#nsE} z$2`2B;s%`XP-?iNj at nHAPFXmc4obf(8dZU+PA?odW6}l_-~{nr7Ku66K&clHjPAqs zW#GidJ?Ow<&bKRCe1Kg}(_x{ZS=?du4`PsRw_cRd7%4Sa!60)OF2||q1dKN&m!#!( zb6Pw!y}D(skN37vcOPX-aak{i{baQc7sLW)Pw)cAm}M}q6YD%CYs&ohWmuLQoPh z56gIR>jh&VG%0&)M}ts=L)tp$Je>y(>@h;#B!G`8LhnpIY6R1hN$IaF0&1L6cg$rL z+U at 4qZ$42MP>iEAFVjEG69RZq18b*HY=H zC)e~1$ns#Q)h`K4*^+Pgqb<0%bGM>;Y38>utZm~TgOjRe6t0}S!Gn(i>vqugYniZ at 04U^p)4fk4V%vpaAzUxenrs<*bSy at jR$!#lMDXgnaZk^A8Y^d)WV=^WuLG)qlE~)YhF*R58D7 z6U-7=4w2XA%E3xf$qTBMeM`!J@;_* z2XHBS=ip(Tm+!ZyU~PNPQGCD*Tmv^Ph0 at Vkm^quTAK&cEr(?dn+aV1g>^yFMY(4B* z0v&YnQ0TcF<|3L27w6y+PLBt{=4?hNx*eSX^NNt zIB|-L3Uy_`u+pMgX`x~#sozBg6*S~IZfku+Gg>mv>=x=ck&b1Av%mZm(zSGy>yuGE zc1LKa_py(4YgQb z{BsI5b+I%xjjoL)p-DuxCYDsV7`kIJ(L;{qxE!JsQy~H4B)^+fWwDI18TS(1AKMB! zu2lI7F1l?tsLlmbwpNlEOPCe->W0CV(W(?}r2SI0?4 at Xb8anh1(VDtC+&xoM{hCNb z7gg?@WXQzPs0T{QtcpyiRaQZ{%2D%Gj6yFGWWy$Gyi+H>L z(DpeQVne!quEFCL={WBf)w$bcs)F?MgQHOaOXxi7r>&~pZ9@=`HR<=_+vt%c$Qq_2 zfF~x}^C95t2?1qGX3^|y(VxGM=j2F8hJhsm2Na=)oB286DJ=8^nv68SL!gofWYv&3 zE5V->2*6tugT`Z1uI-YhQ<(!42pCcGZJsp*mQk9S&{UzebHk`OWmOq&2KF+`bqvp? z!;R79?i at IhInu(1#38_Kv=+m`tDHFzBIFNh=!#ic^H&a)va=HBi}O93Qd2b5IRb`P zc~AC-p(bTeojJd0kH7WaH8xwn#JTbpYA|9zci^m-HwvAGuc%c*sPEcCs$Jr>?I)1T z4uAxi-HcxEB{2(7FDFiD*q-jPhc;IE^1 at a+6c?oSC^S|T$5=u5$Z0OK7&AA`Y)H0a zx6}lSow0IxB+C)AC_Cq}vBac%0m&rtBM9uoF{1b)z7Yjly4B(xI^FwUD~W~ z&$>Z0;`!9G_HBmzV%i~F$e`j8K>mX%_+4x^8gpap*lWzyn+AI`m?zC44u^cB%WwS9YsBYqi(WKPhoqh<zdW3%WI2GCZo66L=@{A+37ZhRNrBypZXlwlz6w%(O z#y;Pp#)!Mr)dpPMC+YUM1}=#4wKP}LOvk#sBI^P|>0JXCfkqaYKflSVQoruTMPnZA z8ty at 9zb9w*Q%)O(&ajAluV at 6#-Vl5G&Vq0J0u)d9_1!eGaC%!t7{_#RTL at -slSiu? zA<<(7>=F1CHk1u at OaJiWD~ah52LgG=BYZD5vzQXzIp(YcMz2_>j%U`qbFNwKNPAr; z$iAC at Z#~rK&rIgo>_>#i7hS)aJ&h3!Ooqgf5^hF-Cs2}L zkWu at SV{-ptd*JC|FXxS;rujwxU+Q5l)JdMD*)Q||hgJlKB1QX4 zD`F`IO(^|CEABEA87mC|f|Dn7K0gn1Jkxh2rri4?qEF9g#yd*1EsGoS+S~rpidI8S zaO}3Hhjof(siSC_ at n&4nmRQ&T>FCPJmW~15E~~^w2)DG1rrK0zn|hvy#605=&(;+T?TO?kF!?*MxO8k{PXfQ zv(u*1L*A5iGvYPM_rJ7ap2y}PXj3>~)pHcF?R$$#5b0l9(TGDOM2(zFert=Vm^$cA zMDU54P83=!P>Akzgt%3LNP9$#88&iWyxs&$8ecdk*3`nOwN)lVA#9zqpRLn0*!k_R z6?xdg_4aZ^L|}QaDhu@%p(Zg|&FU;vnH`?6WY?3F>KH|3Rl`(y>@0sBj0&-dk|uU2 zJ4Ot_Vgy~4g>e#Zs62$?ESD2UQDM3KD#GrS66H5j0S@>@u2WwT<{Lq3G6HW0skvq* zXVkQjgR?waXRy!!!$q*3#Iv4-(I5Qg!M7jg=iT68o_PA>w2J+Is_4>5CE$b?h|?l1 z0*fS)wQP(MvkKW}(1Z>4LM4z-PB27^QmU|saQh7B{@O6q$-QE4uyp|gh~B4$e29r= z)Hc?->*3k54-U|-hDIDE8yH#c*g)Z&pp*{zk#q?@qM7HYk$> zpSyI%3Jw&>eMc;#CnsexOO(Upy_8+N9i8BuXdSeFq=xm48MbIF`yY6{q93=<0Sy)W zNh|Hy+d(gTulN at Hy`c27{^}WnDCp`_89T13RzKMJLq(VkLBj)?!iR{qu z5$&8{NFcOp1!O4j6Vdt<>fVs_y~rC7Ji;pzneTvuYmvlm`bY2j^XrSG*bB-dgI at wq z-u|u5kbVI8i|1d{0F?iaIz#^m+yCQ&xAs;UMEjC|-171GE-j(PV7O|~GkH{-ldRF3 zYGUkSEDo`1pz8%r}u|BT^1f<>=AaCzXe%GrQAbQa| z_@!4d7 at +5kg5Yrr;F-t}-*|3<*}fI(&F^@jv+o)PN4TGT;^H at R*1Y?sE}p+$t9KEt5KKpylQ(IG ziAU-_h5JsLw2{U21(FVGmHU{M7mcdwX7g>7q%3J)ys9;FOC-yFw#5q(5v<7NJe at Y_AZtrzt9rGN_7(vLPG?-erq!XNH^9p<1oF7z`}X?bV*eBNvqbKIn13h3Rz<} zK4IU3loXAMa~#@cOooA%EUDrIn})lnV3%6YBW1Qctjt!uiD3|%)DhHR6(z#;U@}qD zP!O8eyggyMrWieG(F!g6rwC|xY6&ol?RO>q)oz%YY;~F#1nWwMEC7HO;bM_4 zv`yy|zF6`}hU^|>*EsHL at W)d4QU}u47S6VqCV;Ufw85;5aA5%8=TGT zw>vgIlXU(m)JuO$v-Peeh>mW*rFH|qr5Zb62j1Q51v?&rekYnUJ`uZYhZSR;k4rtM zBORml7NBXEjq?fU2jxwgi?^btbay1#KKKc}He0mg^RCy6|1Q`|`N%}OZj;`dm at aA6 zYsic;u?mk+G_ueB18pNv4V>M1kah^OEwIfR1<2ETSg z37Axpi4n+N6Vm7b?(KQ)l;z;$|)rsbXR*Zh0@$Oy~g6zfsqwt_ehC zp3>Fq>5_~zSeua#g`28A=cuai_s`^9T~t(t(v=1aG at 3G`RJ-Nls$r8V_^veUzm6Wa zC_U=VVK#oJAYfEKQB6u{k?aXY>lVo&+EE};s~nW9OEV*qmQwO%+OX*p{iLX zgLd0yps&Zk0-%q)&O9QsTZgS6GO-uBn15!)3NzNW(=?D^qkNHx7DwB4(eY+O{+lU+}CJQW~22vELnSe~49+jD#U!P7y!zGhnha185#)e(GU z|NeCA!DffT_HKkR*wicD$wJ*9aMCZfzQ$}aF8PttUoXBBA1&xK(Szb9GUAZ2&_>Ji z##7cm{%js`kdjQ`i!Il^z_x2JJoV+wIf=eo?U%7ONjZ$JVg$mv63%5K{QbwNBbVQ~ zW3eAv5#W4;=qDm(n81%3s1FAR#DYm5eaYHW6h)6%n~!aU81EkoNd9H>X6;aC`2LB+ zC6 at ke89C9u-%7M?O1``7 at GPibV2buL-`Lrv`XEn*)5rmTGp#V3WU{>RP48`I)K(wD&c);E+DFM-Oua&Tf}? zbGcIoq(%tQ)0`)Dz0Af0Lk#}T95TkLGs(p4- at j`1#w=+$)dBnv@{QG3l%U at 6^RC#^ zG*!exYS}+N0DDRlipra`WOjEh97|)WOwD&ZO+n=c^BQWr0X6m(5^r0c+!rpvW6$<8s(Qa72AfiDc}2#5>9U;c`x=B5g%-+jsRlR0a% zJZ45aPK?wIP?T#Dl1O^d2`9ZddeCUkjWJM(m^2F3A5qLf6Z_qXVay+cBj6eFz`j4^3=^5k&_p0&RqDmnnHvQ;)GWun%7w=xf3OGAliyoN*fDd_igw{vZtl*^@ zWZXcmM~bh4;2Ud)ajoA_x7Q0~tF^^F#+{qA$*nWUkznXz#~AT@~Q>vd_07mq01QL%&B# zmb(z`$dGHpC^*8RbXXjv2^2ivwCId}{`L;)?$@A1;BKLRryu~0RHB&mclB$nD;qUS zS{aWT!1Y9?*A?&aRvO;dpXoOr5a$+ at fJkt(h?X+K+ at 19BZ{8GtyBlarpV7&{v62jy z^D$A4H3w*ET5 at yx5Es?05t7wuXkd+1 at 1g8DWS3VqcHsKUI4WiPS$T#{XI$3VHp5LD z*3B{uOV=EDf5B&i-iMIKs(AyL)D$a518#Ii-t6VYpYQ=`;-cpKMZ2Ps~Wk;%nL}d8F zUFL{%CD+cXVppl-^vmc&Mg}I#VvBKa5wj9Gx0S<5I3^>2ow{uMsV##JmzB9p?xf77^1IPy at Q;g?W|{R1Ad#a1o#E8z2Er452%>ND at Wp#yVC at bwBJE%x-jT=w z{ei2(&meV>kgnh|b2{9CyR`9L*=^F(ieJ%*Coq(07YE!TdSCJ_{{Oosn}=3 at CUoMv zm?SaFl=+kMo0o#rTploXx=V;DBi7vMVO`jT5eR8d5)XOJleBvM^$Dm!_!*6vFaYuh zs`!X3Y=a~D$UIfA?+|x^`?jdAM4U{T*AglXsVt~0F)M>U at tccLnq;3QOFY?(sLwo> z1jy1NlTHtjehpSQ%)I)2;I9>e+UD!O9mD??M|GSayjC7ylx7xWJZ=^t?K*=2CFc|P zw0sVHfM3%dIOHFV-y+oWf_Z$k&{u{2;T6rHC at E-vd>h5D*IN^lgA?*u5%hKoEW81cE-(%ahZQHhO+qP}nwl(j)>7JVInyP+NNu}~XwX?sStgH+X z7r{zT60X$6G)Xp58EknTwus-pu1IUTe$92g^=FqeEIKh>TjqYwoi{CRGQ)YB>3%GI za{SiN`em_B+5PzbI{rBJIBH+d{(c{_0cQ18lN+c-6kxrBU#Fy_OV!XDl0+z{$qU)B zM4`FS2+0Qx51H&>CZZLR_d^UCvlyRLhu$k7SGSEA1&%+Hdd026F}&L$4` zaYxAp-8-POAp<`vi0{hbqdGk8wRwyy=gslzsZBx}#KF!ecVfEaDI;j|Xq{b^UQ3&|yWs%4DT6EYZ?pl#soY1mQGKZ+R?I zBYS?j!mGHcI43uoQNLk7#B?o at 4h1mhm}Hbd0@=2QKH%fdZjD?=+0>yxSKmOjrs`B- zj4ZLN!IDX_;p*O0&XR{G72<$PG}Iw8^gjZ4$6(DKKgj4L$jv3{Fo^4qF|yJ7sOYIN zh3aS?z>G#I6w(MNX|~c*oJ(q at QDvhMSj?$P>}qpb9_ut!Qw$5BNN&D5Y1CG6x}N~L zL1G+MsteU}aYPyS8 at vEbXa}9c9E8CFDKt}as%$3c9jB$9#7-zv)Oje_PMK2fqU$sv zxCEnjC^kZK%=y$`eQ}NFa2#IPb{LNvbJ4~&*K>_(3XVdX^yrW0SRFSTOUXehQr=d7 zt{_!n%yRIb)$*L7Nne2stbASKG8RppFwtKpr#Raf_SrIwS4z_Nbmk991k!r?-W*U5 z_bp5cw-l6;v72y!Awj*!!qauwO2~1=!w%xym+WY^LK}T_AGH5+T%4I1KVhnMbfo{_ z=+v6PQY3Aa2&(joBS9IWOQu<+#^kWvc9KHGZKd8^*0xZGyt at b8E?5O_IMs0=yE?$+ zsmFk!$TE5mhv8u_*eAzbn42_0j}5w~fXN-9!qge=M84WRP6?T+KG;6Y$5&WcW9p%8EsycG1* z%<{e>PE6*)=3X6%wApD(_UY#E>gUGwu7+bdXdg`om})!R)h%L3xQs6WLkcPyfJrJ+ zYveD;4xRk6^!G_4${udKS+xet9 at _h<;i|OzZ^8_Jab`&(^!3PjNghjr1lWS at PUwRm zg-e!M62?UBe9;$Z;M3MV1Yu<8 at h2PMKke7Vb+!GClr%OKUI`S=J;93*U-L>jZVA*D zw*WoDsd|GezF-lKU(Hm0{8Wx(7bGS+b(*r`#Zzrp!G zR8w!2u7lGGyGWibbCPOx`zg3DEXU?1xDnReA7`D}gr7-SntdHp>ga1`+$@mtX at YV| z002P|bg{Pt7PoO2zMfxV{yISc_{Z zKRbhY4p0X!F6CVPe>Jo7e=72Qq70-kJ=kVGLRiP-{8pMw&(sVB3&U68rQHxvSqyb# zeq-t$;II{b!V4#Q>Ho5>yTO(71o0?Y>HI7xqn}eojqYMVUtjBm;SUf72@*yX7KH0v zz4z+RwY}(f{Ud`#tc!@_R9-V_u3hGLu65I_(s*fK2?`C((Y_FoXk1WoYqI1#JI-{9 zOU+-qSZp}@1m}vz$e_=`NRaPN(dX2=1yr$&BJGO0L4Drz_^%yfl9q%EUz~Ju{Sj2c z&NDa{l5)zI9=e1#t_WjvTM$j^_cW>tP@*41oNrok^KWBXhWsYkKFvLTJYRx?SGtuu zFkoX47mw7A(_<3quq8lmLt-y(soZXzR|VXxp at lUu%e{Y9xCp7}`pMNTcU3t5T+@}j zp|~o()_=$kMf5_RJ|Jj{&~b_|JVWqKx*}dM08k_her(D`7-gVpSQyn8aDxV7e5dp- zjyfQ8rz$&?`OHE1u>d|PFYOL+tKihvO3*Lobq?~6b+`wyEo5?G at 0r*kE?d?_6}15$ z_)+mP70(HRA6z5D&2PXKsda18NYKYTNKUwVL;%mQOZ^i6%SYw~-1 z`8v;<9YbSP(2Y3PFYRPkUU6XnVxZb_+(*jE6E~HD{+krTBm2rauUwfBsALFlO5Q-k zPAI}aJYtu!LSf$$!6q)P)X#N!XkGH-9a1pD@<_dNc{rVT8r2$EA2Z~O*ewT`4l&ef zN8i|}PD;_NxI}+y_cyB+lNh8Y9Y6X<9|QF#tXqf<6alL=r~3+v`?i!kBf`{3cEl33 z%ls{pvwGg5qtI=J?u|TplcD^XdFRy9JBqokF<;3GDSQO8`yI2w0{R_OxmQ1D^z--w zkotqo`3{X!vj`95Ntq|;?7thY1;?JmG(!Ub zKZrX|oYdURJWWdAPmuxI9});T1t5OJeDMl9CPysV?5SubHsGyp)5Zgl2;j7`(Xr=(*tgiKH^3clfvwdx~!CeVJ~@?~kX>7=OO9 z_(pKFL*QQ^rilok$Gk`b8q*;57ZD!3mDGGlgB%IGR8krdykKJ?)=vfBG?8?}@(_H< z26rd#;26Caq~dfL?~lPV?vhE~D0 at r}E(fl$5V&J(Cti>cyr6!~4#Z(npG~@ItX48^ zCZ0JsWCfep66+gz%&Afv9Z7%01*LO&j)}MHt61#U#5K-wUA+b-G;%VR;m>d}w;1yH zFPH0 at MyHRssSdAO7ZO`!wxMB;J3DQ-+ggA7V!XjVU2(Cw=W1;a{X_Ih6YaaIF`wKX zePBdlGaFc_FC7_Qa>noFxwy=tOWGCZPZf at Qs4mA`eHZUwxj0}{pGmgwUl>+#BsZ_M zVmi}b!mF5W+-BstR%NCgGFgIPHQNW>UqrfE)BggAg5-sej1RgzpmHr6h98K0fpRR_ z;I~y}XG%HRn$J9tmS12;rz>?l+Tib0x|yT$6(%J(G36W^fm5O5?XS~wXslmZz!(!1 zF)g@=tiXo)k${rrn;MT=>0cTtyeR!nJGzSFB?QwA?4w|^N=j_c6p76a#(%9NRPgJ% zcROM~*^?37J)C~Du?W`yr#5jr$A1Qh;>9zR#etg)U_HV*`VJhglH_diT(4`pXDv0m z7ikJ^_l!rKMs0Sd7s|}!lXWm+tTu9wqBL(xx(#NKnf3mt1Sq{c9?|k3Nw>SuHjY?! zEl=+V817~{kJ7<&EmUu at Omt_h#iI{63USPrWcmsyuy*9MoTUtdVsIL at h0I%m;>Y=Cu9V_22A)9n=1WoeJ4M<@WFoE0U?tgDN+29IvP6Dceg(Pc-Zj(U$L z<|NwW@*$i9&8UeGru$=c0;`{j-KzBOxA(kT9-_?^FS;mTx2vxcCs13NsmW)=DHYx% zWk0+t#~@Rz at OcC&5zk||4eSR{=jNnMKBXj7aYeE-OkOi!iuSdphG=DUapVH{tXD>$ zahKXm)&!lEC3gkW-Z`7m@;g(|6VP#WuTGql4QC+wFK8WL-XASd at LZp6{2->g1b1*M zCuv{vD2%&wtn(zEGp|?a5TkWk&l09Hto3&1+B77HbERr_+iY{5OebNkOyajQFEhy2 z>3|ag-59Z&-#QKP=~FaV{}CPB7>4>QYyS~?bwA#;q+*VufxJ7yLfV5g>}oHKyqmaB zdKGIR7t%XG`jYS?UOV62&LEk&o{3poLNS3Bk`#U`dJpt9Hxyg&#^8fEEPKzS&SQLV zD*yH8cS=fLxpv-hdt|FESq7?dLQX-_k&!o7LbRk;l4+tXjLM zjiw0B{l-uCsN#Sm)40rawoh+02X|yJWjNO at 6_)S(Zw^-~T|rvKyK=DyFj7uw at f3o? z7h1JP<%5rN`Davp9S`rm^y#L!aF-C1d at Q3z%Q1)Z#Y9m-{R2 zTnMJq9;Qm(X}K-d`}e!>ZmlqlXo}K})rkz3DJnHEqNzS_nHVPr=<*4t)js+(k{(sf zA@&HX(|fAs_oQ)iDe6{N&zT8E2gF~S7rjp3$6$XeWv=MQ158<&l z>H$HIL1 at ou=#-%o4BZl1Xglm76t{T9x&Tun0YI)JHWbXd#DWR(i;sXZK=g=;l6=Vd z&KtqHg9b${+RjTJEn2>1yU(sLlsH{WRNvHS0|usPOUa0E>l>V9lm_j*jBpHYUb!iw;iX|sH$ zxL*OJJ`p89$pdR*Kgql!jLOFk=&6M~ClX?t2{fUm8JycG*RfM zRLvx22a&urG{UJa7#~f>YopK68xF1(zQT+1+eduO-D3~OCi5o|ia=@vd%4Lz9 zklEp=Rmx7Fo(fv?AZsTzDozR{q47uMdmZu4npO)#_N5iJ_N2Mjr61E(C&m-DbogN5 zEy^eDb8$MFKJV79u&@}-$H$Cd7L$UEV3xPoS*ofeF)bBkI8_gtoBBQ}cBA{HT%kls zPEZRy#FMjaF+)}EzgoGP7;@e+3Xc!|1cOQ8-?aIz#8ELqc|-_TY5db(c|t?a8zNf8 z+M2|@K!;;VDYJNtJzkr17SBo!6*e3*y#-xf7iv;80*a#-#`aeH?sF|@6>xM1#bXu3 z)uJ&}($(BG6H68eRNcrSg>B2T39E_KM&mCXo~P7unYT~QJty at 8{MtYGtfmR-CXWk3 z+E;VX2E<}hTtYk$O$1A3gKK%w$PK{`kj}Kpeg&c%4^&GGcOXlQ=#p2DO)LN{DBr^{Sj0$ zzM#>9G>!R#ru7!CmXSLypsKj^57xyUEcT$P_0?lJ7L>BBIsF&zQqm6_i#id0DZ)aN z`sFTE)AYg08_XHan|ItZna!zaU2Z6e7k(0d3iQN%lLfk^)5Q(f)dvM$FrOVbV^%-> zkrYjUqC)MO#a1E?4r#oUz*AQ5N3NGxd=H_Lh=+eWhEC_5*t}oSGiLOr&xcCY;pSEu zJ4sw<8$^?f)*zN at s#!JElFbrF=e$6}eUwvu+Es$ig)Ml&6+OWxn?%)&XXK_E%T`U) zjB$q_Ic(==P&_1w2JLHFwMNT41206U-H3LImaGOcm7$j!?;|cacND}(^L?pKy9`_v z%3JR-5>>6ZD1u7}`F9!AHP5JRc*Jrz4lS1!y1YUP8Lv_M1lyndB zS9Frj2zZMg_OS;(zp5bizkPNg_I)7m9r)}iZqT|Je++KEe*F&a|K{g;#pS}m91=_R zrZq&#SP>nDeM~p%YhM5Uw-4t3Q1%KN00961f&l;s|4)^VfUT{SvA)g!te;cfR6tTk z)+XB)C$k1a2qyw0Bsa4$1OV$I77-94L%b)DSSFU0wi>Me5OC&9!lUP7sC}e=92hK9 zmf&DPp7j~=8av~)jw}jWQ4&|!KE1ls at XVF${k`4h^>be`jH at p*fLKK#M&43l2+}-I zR+1mEMq!gviBlfGmO&mg&_ZQE0ilAdfS%v*IJ7tJ?wFugVbi&5S+sw?rrBAUt}wK| zthwQ!4OD5g9<0vrXti|0pnPsIMB$8CWQhJFO*2Ys)wy+myUWlKj55jqvwbt;#bOxG zpT1tUlv~A$uA)H}N83=C$&seh+TAvG4yg9XPx|?yZ9Wcrw9VX(X zh5eayWe-R5)q~bJVPPPz$=gU?wPV?eg^5Mt6mvW0oPiz at z0_>cO~jyV*$BL|t5H~B z>cC~Yj%x>XFuAZUmNgg4y4FpLNFh{b>UkA at Eyy^>#jxBOv{+3vOXWI8`Qv6J1xSV` zHZz#+L!nZg)T?>_X{*IPHqvC2ue6hrkU1)1FnP`ntrGHvVe4In7Biu(cK=Ta@>f-U z2pFbG9jQ)ZkH#SV3?uaOtDnA;97q$n^*Br~Mr4Et&FF z;kz6fmO#NYf7L>BhT4-|hxn(3d(2HX!Cbt6nY+{y7&Mu%}eu(3nf7PjYhgjiT zd2Qbgz7xPXUBX$&1JC$~$T(m4eV;D^0pG!r`q(;85FCD_pPX(V at N~1RO`6a|t77T7 z_fD at Q$p?@GE89J4eCjT^Dm_gblH|T)xKon_U?Ly6c+g1jmXD7woP at eY0@B0Lt=KW* zLo+vzXBcfT(*7>Ic#x}a at _H`b4@!@$D;$Di5CCfkx#R&fmS}|Z9%AN at al)h3gsB2) z5^_OX6cxB4|DxEU6zUit7sDj}C6mtI7!!hrSwdN#1-oGOUvxViD2Z58N3gKtb9W$T zS3RH-UJhJ=A$t at Mynk6Vh5gH-$vGFE{)g>IS42kKHosd$>nD`>9OWQ-RgVsCRk>KN z4)_3=1f*NLkHz;3f~W^If{QZ2o*wIW8W-s> zGG8>IB7q1hDuyyQm!+R^a7cK0BC+1}{8%de!LaW2G-XCi856&B^t#RdwC=Udo-h6N z`6UAAymx`NH)F6Gv`Uh3^h!UCoPj7cWCtP&A(vp3>d|DN-b3g~;+Q^(L=psvWW+tT zm~q%hh;n4G8e$`QQvu#R8NC&{Qv;5DJVf$xXACK|%fWKbpxaHp=fT)by$1 at 3)1a-C zg!VtD at TkLSzM`+g7L;R(gtphDx~yO*PqyA>ls&m2Isk&U6s1mdlQvagq0|81!4q_o zV{aXBXQl2adz1+fbu+FAYC$Y{knZeXVjU$7=wxtYkgTIaBz)sL|h^Y6+>R7u=8{!r3~Bf|K1H%}rp)If&`7J+90V$f~-U zJH_I^f?ZREp&`yBZeghCF~k at _m}?Y+Kj}hpE7HS~UMZ4ya3-<>W#H6emF!>xZZ!HJ zGY{cCqm(V7j&z0z43 at cuOK7cs9Uoz_RsgERh}jbK3T&yaK|;8VK>pi zG1|ZEdAZ|Y`iQbkZebiU4RZuU8{W3Uq2lcwcW=aJ8`PsYpfN4jxCAnDb1-R>)1jpp zbKU^}eQI4=g_^YqRuJ>vW`SD0V3(h_-r`!TxehTO_rbA4U&OR=NxbRThkMnYpsd(k5EXRySaqe8G+%716RC~yf=@a0D|8=@3wAfzMD~em at Hc-5xFmpUNFlSJ@s(Pgj&Ga#uv|L|fjT zY1`Oc at o#G>3ie=J0Fqm@{-X86bbqgmHrI8Mdvs{2Y55K_i0vLCk8#JgCCB3RuC5Aw zc&JfV`5xqsf*pJ)@)b~UcelHYEy2=h>_wCMpW(cGilxOfSDohOD>wDRb%mwwC~NX5 z%U~w3ZPu3$njz1q*&5-U4ll+gveFDV0FqnWZqnVK_5f*;5=b-;m+JzB*tw%D2O5=I z*GEs`zgUe~^%45?Ppp}S(;bD%W6_!|ck*vTrJiYBh>z{nsIv%@^kQQ$!b*pM8`18P z4dYG;Y z+AF!Omr4z(4OqPcvK;VBAv>RUR}QZysuo;ukbMtBgHVuvW3eXxdK%{Xwku4n6l?$Q zbXw-(D1PH;eKL07uxr6(idL(g{R`sphjCNAYMepsin7}ZTh6n? zjO^n#~*&P^z1RM68y99aalpVKVxJ*L}?Yuk21LTVCFTlMbi$>$s6T#wC=*z8w%%I?fkTl;J6Q%`HLpDLGPeGXKX#6URF1i z*OnxB>mvNocz?; zAp!tU{k!z=pBEt7PD-jMKQ=en?TPx}#QKN{QiMwYiQ)o&O at 9;NIfE1m2=oF06I2|T z+OxIN+L26e

8svki7_8DSqZU z)gcvREC-KtoXKjO-P!#|`_%IJ$;F!mT#H%_FcZ*$9t|WP4Fuf67=n-jn?o5Ad~*ZH zox2~$#~mRu_?-vfB?;og88Wp~xbkB4n>}}<4wK-f4N){;rwN%&HKgguJB;LCI+$Y2 z8s at -}1(uJc1GzWmrfBIcIHUkk?qp0)GGDv5T1ksJ1+B^|#9y-AG-;tTK5{UT8C6AD zf=MH*5+Y4!DIu*6iocjFDvhezH)??V;z_aQ=!RS}o2>g&O~<59sm7qUexk?AV`Bn` zc}Q`i1Y_jpxHhJ7(Arwgk*FfmAL1`Wx*b1dlt9rKIO#NUlQyAYK3N}=*$xY5RHMnS zw=gE%LE3aCCfWOE*PbZ(RMuF?KPRs5Z4wP9zBHoW_pmElBM%fW0q@` z(&$%s9j_6I_24*E36W&jb5zU|B(@CcjeWJwBT`IqeW$ThK=?pNK*mBq66S0c zJsG$6a-nd{H6EV?MMRmAj9DASdTFT*v6rRzGLLXZm(eZi9+!k5EzQn>Nu26XWdX>^ zk#)UfbiO^2eH5}AZ&Om72Bg%S81a-=jr(GWG<5=!!y0u6jlo$K+8Q-*fMB{8tNu-W z(CVbE(w#`Y2LE8U`)2)uNw4?TggUg;Rtr-MftO)IYw8*3NY~#{9yrbf6Va_J*nBuH zfiu*>&-toDOM1YSsP)DBY51IBM*{9xsH4{r zp4yb5YWSB!zZf)uH`E at QD=$$% zUAiGA580E_n2|<7nP&8Ohk2WLI@(fDZ<~@R+Xyj3OB`d;O+4eQm#nSp5i>p|t)3%C zE6LNoTMS8sKNpTa2|3NAn|jgx$@sx1i<$1N7;{;zMU|Gt!bLO&@G`2>cDGH#R;o*c zsa}M)Lyf&5-be=Xgp0v^3 at s#j_~OmNM|gJKHYJ-rUK8NhFC>Gu#;eHl*>cL2v5z+>w-qKNd|93|Mbe25ot+)B{pnH$#N{( z{8mMzoaOM&(}up^uME+#-j_le7o69DR2|mB&Rl`r4c7>G2S+kiot~v;Ua$2r96{no zpw1kJ27M(b|^zxMx)7XqONeZ zehlzxJea4-SWHZH`l_5(FU?8s!K>`k_j1SL4?J79$!c5|_b7vlfq5nA25#Denc`vA zC(BfDSDK2o at FTg{lgSdOYU6g;Jh`2@$cenk;abWWIyR~unRSfKKLk`b$STWm`ajIskhMXmnM&{RW6w9b1i8cr!HYr{UheN|-r3M~cM2jdwG#7B2n6W7;Q>FRfO{+vm6gk9 z!Xpdk=>DDWEGF*=Gj at x&=^5HZ!?;R?LVk}Rx1dzBp_E%v$}1Z$JVSPAbRfno&Uppm z#*+86sfePdGL%fM&7WaoTOnFJxel at 1;B97GDPA^r)bzek at m<4v(eB&eq`BH%C|*6c z&@{}R**i19yyQ7Qt=?_crgdwG=LM*JTxIdN2kmYX8SoisytE>t zUS~xPM6ME;FrN1o z at Mwo~Z>J39Vqk&QnCM3-Ca@{M)N9KA(+B at uKPJV(dz4=O at +V&(1OnclJ(vLdX-ey; zN371x3YE$T at Uv1y#|I}_RO3|TB2iVoxwcyQx+~y9Fhg^Ezhw=j%77%2M}5?`Rh!=p zcgf at Z=PP;YD;oD3XYw8n^@J}S;kHidS9oPd|NXnO%u02V8?El}jXs3rsx1oX*Hoxo z(5Nv=BQ|cA5rT{G5Y();KtxUDgi57+sBFjq&vq*|){SkafJEMw%h0yqg?qd+W`j!2 zo8txZ0vWn#<~mGk5!5(Yh&Hc>r>eO at 4n66ztT!MeutDi(i8iYI(S}kppK7yC;9MYj zL0X!}Ovy#Bdtl+HOE4U5!W||z7VEeR32!*f3Xq1LUS`dCDK$=fZtO3_slw zr4~(071*m{SqjaGx71j3mThO{Pw#()wR$_(%q}nhfT at 4Sja$Io$=H$jpX2{ax~ht` zit-b~ynxRz!ia{YInd7vN-&Pfx at 2#a2WU0wKu at Z72qiv<4~j0DL6CvKded#cS at i08 zSyHXY$4uvAw_3qac|KvG`w7+YvGWtv;+cy<4Cs(ihkBaDVVc|B>;3*>_Vbg==L@|D zj4O;F$QuDmEo5eVS2s3 at h(|4|f8c_Q&{bT}=g0sF#R^B|^}-5QOpe_~IZ? zMiV;pKb at n}lWF8=r_l?_-aUW0rVm|mkS~jJa=xX9wOMfzaJ3zy5kOfFqB3C#793KH zlSUvr4$+C}>2q2m*GV>YDACn5{;673_?K!GQzoUBOM5dZ3q=k>iIz;CwNHIKknv&KdPxP(TX$i?`l zCEj(mA%h-7(ZXWKeMUrmK6&_bi%e|**^D at Ld#l7~PTyHHq5Zn;0zf%BK%SX8A at -Wv zstyW@(b*{Yp@#F=oo=Rje5+*Dc$M1dyH6NZ(uLvFy{4n3H$o~?GUX;kvZ$nUX1M=4 zBvf2^&8 at Qv4LjX3n>xh$oIzh>CEK`GV}N9k0?lo&eKfDdkWVJ=({6ZSAHgccX{jss_D&IoZ*W%mOJI=hp2|NlH at g9|Mo(@K85jJ@ zQ^p13v6iJPcK7a1b3(BsQMGr`4rNt|d+83)r&b^OlsRie@{i|bsl_C}wMp5_MX`tr zlm&@4*LTJ$4iT3+W0@#*nh)p8QEK#;<|&WD2QVaqc^hCgBU<`C&Gh^}|llwHR2jpcRu8 z?KteF3d~8GHu)S09V|kiW;NQ~iBYyrp&Ymaw>XQwx3O?fIO2GHHcZ~c-H?ib4IgjH z);c$@IIoIh(@C31yx%07 at s3VDY(fQ6G3Rs;5x-T$yd|e!pc^1$b-4CZMHEB-(H6-m z5PO7;hyTkQryuckAS9PG7luak+%&*+yb@>H&l|=NUhx_OW}z2;#vH!OAv at 3QGjRN{ z_`6JuSfD_~xB(d;sZu1nN9# zby3$R3RU$#`a->*R=p+vMltMxCT<>5N<_&|5d1e4R4moYfEVFLvCnkk!!uOYKx9t{ z^t2Z$xJ_?*SvyAA7V*R<8yN)Dp+#)z3c`+`M>YU3hLBf{FA$7u%WzX-7q1f1;!8y9 zHM?LALrf$3Q}gTx#fA7UOgtF-P{*RLu#xshMO`nJ88mlLg%`Ln*xL=JAPT<}BT0Q(HRE+P6E_^5nYn81v7xI>(T6NRZ2$qPH@?Dalcxb5W_ zns%F$OM at T>o(NWkkR*0h#r^e&`>I?=o$OJNj%|@5ZxA%&;8VMB7xX#r|1DkJ|EF|y z7zyw1cHa#d9)U|^MEK|scK!Q!OP`jI*wGw0Edi;HaAliTAh{xcQhz0H0rZG*oq!TO zP=aG>@dyNGw?g at x@0|BfId7uOHz2_=0}1U5z$t}!{UoAQNJva5I0zn?EQPhiD3OzG zfVJYu2UF9`n|NYMJd+p0<`~X&e7| zPjFM(FvvY8?Sh9uSGah-Bpw*}zWmd~5!KT%qfix(xW{JrXpU)6FQPw2*9qE?Qt at CL z at u0%?1U?Yn!2uMHfag{48>43;eg)es%nlsY!bd9!Ocz2zF&jWTq?pIxaijbA@# zDBm at i#Yh5pEP|Px2N<0vMP%t=ri8@%3Xoc?5X&YJs`D6yM4p3Qbe+H!RP;N?eQWQ#RGheIejntSvZU-5NUoiwjuMN>42Lo` zCYEBcdgT#0c&XJU^~_O}!Z%op?A&5)v~Vo=my9Pj4ZFD43k+ zt5Wg+BTh#+3YzS)%0ZD?@;IxmLuK#XXOT8J at +7L>q=?3JFxsC0{5Yh`c-F(>BO`uX z%|+!yV-sFR_-~C~om^8xiuDn==GMaug;cv6*Fj at ylrxdKOO=*GN!(<*`6%Vup#nov z4KBG^C7oD#@&F3c;ku=|!>~h0wsekmyAVZ0Sr8fZmdMA*2F=0cD80O)cpNXUxFpP@ z$_gv?i4gzqZ`JB0>1O4+ib+YUh;r6~liRSEt_ds;vFL@^G7N=L(V|KD5)(W7m_Y|2 zp5OrkH7-%-A3*_pW?gc$#S?K!0Jw1jUdkxSFkXcg94gzAE9Xih1_s3zZ98bd at MLeQcCiSRrREm_u>y;=^c3p|jyJ_4FGHglK2H zl1w1a^+kJ{D7w9M`kpZ92T#daD)xMo5oQx7FN!F-Ln_FS+npXB&l53p-C;-09JoW` z9#X<@PRZXFrOZXBCWEA at qxORFmMJwIpTTowCU5te zy{TkJtEA8a*OmKhvhL at IZqndKERxZwMhoNI&hFGQLk{IrauU$9{_V%4>ooPov6Ey& znI<<)Ze=WgvVQm%aeBpJD-PR at s<)jtgXpa;MPkQ8XHMm|s_{<@!70>ak^yrxS2Eo~ z#j*r4(pszP6%X$*!b9tBXq at uIfR1u2wfssD*NVqT0oizu95LO%bX`Z*tsk41)pMI( zvr`Zs3b^}6@*kFdG7TU|120Jj<+cwbzTgj1HeRO(jJVLivje6p$UVWclMO#l``ps4 zTZ&K4mRGZwWwVbv{U@>MLG}alp0P!M)tsU9pNS&Q3gM<18tjW$Gor$uFuo7YuZ@?I z5-s0f9OqRRtU>^pe3ViM0%6Hg^vS9x7IDvNa0y+X3D-lPq4tmR^+;f)9p}7QF6lSp zEBo{qT``odrXA%&Mv;027G1;7 zt(m)nf!GlF2Khl6y^{^=Gy6Hzx$9}1poN-vS7u=|c10#N&3Ndj&TfGSiIqc~gnY1n zBx-&{LVxi`e~nOg_P0B`JY!KlXw~0bn z7)uYNo;~r8PTO*lAvi`qeu*uoKwJV61WGvi^NVir9S+gVI{IuCH*=ok$7=1!$t|W+ zOE4Z8y=#si!2;ftnrCMjR1mD=rd(Gr&c`qQ7C at tNV+Ob_U2fuAE?#fqtDEpFd>nwO z_Zs4U at 2V((_%$2xHDwo2YC$Mjrr?7q(&yV~sjysy&r0=7jWL9oH!_LH^< zMHyz=LyUNn>w|S(r5WYMdWpTqrQq)yB6P1k?#ByRlB^a9lzm!VABUXzxPT&@dy at B;+ex{=50< z4B)m at BRoBKMFN=fm!6~#i^Y+0umIyir8rH#x+q~@oDrR^F(OBSIyzfBf0fqE7_i at M zg<9mHBz<)myk2-QEQz|hY<;6%BZjzwTK}HBJR-TJuph_k-_reF%LYbh@(!J92FXwj zMtJa*;T>h`i9?shDjM7rdpvh3O^I@$YuB%5i(^i}WXidXcu_0-x9j5+&6s40tT;44 z+a?CvMTT97*mOf4OP4e$hqB7Z@%N6->#6*VX0#LyK)df0d^DR5%8)=QCv at BBH zPVP{2BSGC{49(%OSR+=tl?cwi|6W2jNd#0AUT}A#H9;{aR at X5~sFVD)SYdVu8fOMi z%%UkzB|G|w#6U8GdvB)ttrN4an4r4 zA@)WoG&^Ym`iZ(Xh+^Zb>@Q*Zh95om1$Ua;jVM7#V&#*bb8pz+lGer4NdOi{B%p-9 zhVJ&eLsEs9Z;gbqC6v-#m+wO^374>f6_3R51%vAn`pz#ucXV=#gO!!#fOb6Iuc1W% zNg+4@{5Dr at n~XCIVS~V6cTF`k+R|(jy}@{8wa1-eK9f~?Cad^pRQ^_9aDDI!J=h-2 zf_eg71sOWM%NnHG!@vpZkUFec=T4_-V!E`lOsQbf9O|r5k0S59CTX0*=$P5R?2BCv zU at wWiwAhR!kwD>I&M-e at Gz zKBiOn&5?Vj!F3+0cP)ffkW~#sa{JoQZt_5 at j+vz-Q1_%rm{I-vfI{$|@#XV~NPPM0 zXVeWS&bHHwZpdE%sJ|iW8{D+I`}>CnOPLlIk}vd1^cI7bp=CDKCl%+;aL)MK2fF>L z4v&b|b3K-dmg{0vIn{eQmLb)9JJvFaXYe_9AHs1#9qY$^0<($D$}+^vt9EfO#LUQ) ze9{vOFu$8+0xYePCYl*TQ)vzhhyneDjaIMb>7^E)UDXf>c)$R5FEs0PCofsc)0 z6Ln$%t;mi#XumZa(n<7I9Hm=7=(+ZzL+Tg+LuS|p_u9C>YV{_4HsspeyGJkp_v#Jw zGn#~}Hy9{&k&iC3uixSk1QW}cH;Vp!XyryojNfC}NoJgta-S4cN}|YZ}lmT?|qaa=)5z|LA{DkPxVqNlu+V4OVBAu$z zHAJ_{*Q$r*jkc1C71SAiH}J&f>Fe) zQF-X-R-H^eC(dbx)Nog7glRzw<#!#hBOYQdl_A#$0;CyZPtRmzq|K*G&R!~EZZ2p? zx?n9#V$kj`+T4a3)I5PB+*bkAU71SAaI_8_LIcHdX+w=1ArV7t`Pef>6 at hPPF0jwC z;T23RL7~X{RD=RhLs$3vLq~9+^jK4kqNSlyVZ6$&(G$r{gQ*BQ8B|uS$~;JY!RpP1 zX^t-DoDe?GNHCox*D*3OnR0@#AtQHaKs9e7KVPA6F$Mm_RMP=qopOYwN-C3D%6Zx` zZzr7wO<)>p(bBVO0MQl~7LSHVAxz3_T9ERo|2AW?C8mpHOEZyX^G8ID5w^-I``gv~1h9tDdrL+qUhhy?5ERZQHiJ%eHOY_v`L+ z?>T4m82$DAvDV65KVxQOL}WzHh>qa5=7ebP)M;#vxITBUwbHIR#!+2F;ch#2QnSIU z7+iKvPsR`u)up9upjV3RyY$t`n3!_9HsN?%bM__ee at 2@qIHZ18y_?4q6LG0zZ}%T6 z)U5orpOqqvWd_t*03&ac5W&ezpDpoCjBE`IYR*)wgZp*%YfEKnSb;9)0fkeUPnB!q zSp+*o$07srU6<@SDv>AOy at nuS+c%m2mT47p63~J!ZIENnQgH^-!>}9b_Ip<)&%G6b z_BE+u_p06U at X{V|fm<+_?cza at Z%*kLu(&lZrn6=hsk!0PbdVKmER=*@j5|%rTbnn~ z+$L0QClt7~vKur6oZJNj;Ez$Y5pYngMiF2$(s)Auk**=v< za?vhFFJKT3W^G?11N^Ym=E9o-7}%>syfJj>0aWx~%7y-$u3IP=vyzQpEzw8+qZUys at h$SFRxAukTm=B$Gk1RUD5w&>bX zA6J}X^gC6nPpc|jOGX%~YXkX*RK?E-vyl#Ealt3&yF(vs-+Bm^lts$(iP>un5ifM3 z=jONULMDS)Twulvq+le^p(_37EREI052t2OG-4j#DqN431>yP}%P?Ile}uUbff)FbL2AuXj0-uOWrT(aa? z8IBF?iQcBe_QiE4n{{4e8!k90bgEA-mDDjo9=I0_mFHuTc1ei~MfZN at HeFBHocjwC{2vb%JroIIz!z z)OhL7CfPK3*nOT3w0YglA=*s*XUyT)2*SY(>w#0vKZb~WPmSnY at F&ZX2yrTM^EmL6 zj5s$3(u)TI{9Zg>%m~8!+*bvG_e83ot}lKykfcd1AK!T0ft9-VSP6kGDU_<;X2N8k z+`S}A at N;PJ%NCvQ0feOTAl&!ooC7z^DFJ+&40C5d!4Y`!E at pJt{SSc%ZLl?_hZ7cQ zzzNY=!@zmj18+m&460sc- at -slvjZElpR8go(tPPsDE|YJ8*A8l9d4^r0pA#O0Z)(! z?S<%K8?R1jgj at 5rH}Yho9%e?{w>%$?aeKGwS5zc{aep$huALlq zz40-O&Dkwt#FqeHon5r6<=_6^84ShErFIia(uwrDH&eK)PcY4Lpw{mD_QEJ`MDfxr}q+9=@`=F7sEl zt!T1AQg=up6Eq_Ov|>yzN)eL)Q}K&eu at C2&U+m1!8WFQkO>RPg4;12jXtwrewV`hx$za at cByfR<4+>AU(Gn|HA;T>hq zc|kdXt at 4UzW2`?W+we at s_X?I%s6VT;eZ;}-o+;|-&*0E<(H_D^wgBgpXt}<|tmDR8 zR_Sl68BLUq3!&D7jls5-W?Ob5$KNb0UT!NH63!?eLN^HnlK8cw4xF@3Ny%6<|l z56CY8_dI$`(gn5&E7QdnlPUZrh1*hL*FHs_yF!eeIB;en&kQ###mQZ#&$R8~i~TLn zKum3OxBJ_wOuNh1-D4eu#YLVJbRg+*SGfLwFJb8 at Kx7M~!q_`R^!RU!qP(c{Uf*BLcb#iYdIA{-5$q)`+0-+Tg at xiw zXqm5|EO}Fxg=)OXF{y@)t^uaA*rVM4|ad;9*cR at Wt)(%Ml2IjiC6$?M6*EH zBJ2PNJ+C&Pv}$o&81)W1RKOE^ipB19QIdz?ES6HSj+t9k&Eb$Wg=k*`Hb|2Svsr;Q zn+u)?y0}xZFt%_#uFG5`Nf;;P9(_}!r_KP6CUJjkAWDi!@bBa!-AG^^Fxv*}^4Xm% z`@3?h+#Ke`Bs6{)%3L9J6<-P0K}wq*IEjxXy3J98;B#eza8C_k+-=mmo}h;|A|ti{ z6o!3JWJ2jzC>?U&sSNrmt3hw*R7Wjg${NX2<7vuQRbh^n`mI?qT{D|OETd^QXus3c zIxrb>IukiS3I=uj6VKb&%pHg}!HOu_ZgPH4zeqPeC=b}u;ac0MDkt3=7kn13c%zG at tu zZLWO-D_Y$qL+oWk_e>2{{b;Cdyp&Rem at 1&k(g`4xLLpO<48k*yYWV?IUvP-1)xELQ zm|{c-uPS)q0+FE)C8iIBZ8uiKKj)De$=?FT3qyIXMWm>{)TmkaZeCey_9plRqFP5) zx(J+M7aDl{8?6mgA}@cx_-40D>;a}pnFkl)qH-qOUDb$QeZkiMnO9w_%67q2_~ddbH>$Y!U2$8l#$siQi&l#YhlCye$ue@=f88iGjMI0N^BD95(T6T9GnJ1a&z z_JPv#g$svLiH!-m{O*y={Aj!zqYPCpNzw~=nk+9HR&x at 3OgG-p5T)@2!ro*CT~$Rx z at 9LvKRQ)$}L3IX+lGfs5{N9JuhaUKT0NFJ&!?hEGJ$(LZ4p!N-d_l_+9wf{z$;uuy zg2C)w<|%7uI^`Twc)OUlDfB*g&7C6%yZ3@~wBYl0U%5A at nq8&aox`4O at s1HL;M}#f z9%OqxYtp7ZUOdWU5w43FcN==2j~VpFe81Wg$YCJl1?_`y_fMC?Vq3(!#c3;VG{QNz z3nr9{kegTlg^~s7IbArn22lkAWd(yra1D0)$r at 8GZbwhS2vJB`k;eE*ue(pwp at Gt?vw`kX(qU(2f|h$zWZsT zL26!at61nfkDQ0Fg0Ybm|7P=Yc8*jGqEqTpQd<$f!%&sLb^Mt>{jG%D3?bX<_*ebK z-sfFrwSc=y^`v-*G+!mPTy<}s8}w7P$KJV_DD9a?G-few46hyive~Xj1=cU5t6a^f zUOHs{g7`Ln*^`p289A&W0u*jhllbzEzY9iKAGYU9c62ms7dv8Z*5@#f_$<}(@e`^Q zIMUGH)Dib%FhpHD<53Vah&@b>9Jk>Sz z1Lqm`S{`GmkLn$3(m1sRYs50gM&9(Ag!M3EcsOF^vB=Wc{qaBlErO*n`6M$31p+$z z$5;ygpA6-{)%u`VO~z$W9qqe at T&E>&5y_YUSeJnM6Lpq$lR!i$V7h_q=ssY>Q#Ffs|Pu at Ap)kRye*<4AV9kALMkfKNoi;aZBtRvLXtg2 z=f!67i9Ez4x at M^4>@m1Pn?b;trTv<(39E;x z&4&J^voht^j;@=f7_`sy&q at r?W^fU{cp9r;HX14mEE+)9{V3B7s3y!_9 zR6l*l1QiXd>|RRwSjN6v{vu$o&^P?-;=gbis33-#Rz5DBDl z5_JbZ<5;~ZG!$t_w(19VZ*FKL2lVF<$*C$YZE)$rj83LOA-jIe5&rETF8}r4v=}&x zw_q6(2x#Kpspl>NftU~E_`E*Tz+e#saGrHR* z)iL6<-zJw45- at rZ&Ubbl)d{#5*;CHTKk}zfRU|5wd?ZH{B8d at G0!Qp3`qL&=whyd7 z0gD-q$$$bf^JejE?4zPB!~Y}j!}Y_p(>^n!@beJ(7YJ@|gL#MG z7eenkhg4JRW(nrAtXUxr>w8Q~nS4^;9NIi=1`~mm0%Nda*=Q zJ4kkuEVq}kZJf6^0)m>uytCGNJ?043Y8sDKdywSpT8kDABUX(~Lf at _FHnlk>o<+W) zxs{IV<)!jCjdo76ZHHFR^|PI#v*;i3JZCQG$>y4bZbj!f-DSELPp5I6_}N%gJ*II} z8x{^uuQg5f2Jk`sIBqGi)rOO4T9}Ocm at DiQIm7itH{;S1hD@&;sLF6frs9&6Xv6Gn}Axb~{+ZBu*F8VEtQMnep_%)^7sbUAq={gRl&&HF6EgBH`8 zeW$fXm^C8Hc^UH3w1 at 5$UdmN5iz at Jq+X-^z`JLVUG4aB}A{t|UHFlVqsYW3T(wN7T zTRNQU0t4#!gtHV_-(xO-{&)i>mR5J*H+3hcMhnb?xs=dfif86rG3DtTm1?ktEWAT$ zLQTv;={ejZDP68U)3Apm8>&0a>euoZwM|-X{>^1up zHG4>9{7k2b;x4a&{o}ClhV9t`7!- at i77O(0tZv(O45`?)mIG`8H|k*zgTQYlYml`> z1)l?Xr|_KBm>9Hci+g7L?$v4&#OvkxQB$m&x!bImlRGE;+&)TlTfLj47=^t>9R9+C z#@DQvS-=}ePuYQtr_f-kn=iP5n&Zxfg9g3|);x1`E%mBX>LttZ1$R#jX1Z_SebU*{ z7Khu^E;9Vif)gm?8P=!>H^N?BK+H(F_GsBG+_HY*(wLNxNs&XNflG*u`D~JG2I7Ny zT+G#*7~tp7sh2nq0>)+W_Ezhd|M1#gPM-Dj!1B*Zp2j%U@^#J+p)3uC$o>tF#5ohl&QkJ!pS77rvxWaKyg7ws z at S1=9ZY9H=!buj6I}ob~$C8n`r(ep(+u;SW#^3Jdcf?)$NXQHw%^V-S(4?)gz<_S^ zl{wBP&mby?P_kx{_GLIS74k4UWX++!&6+vRzKocke=xM&-|3Zr%4o& zhW~?~QpS(a=w0K)LH$ZBt?*O*{I6fRU~fR6C(&G7ezF%y)7|mSxqZaBob}u8G4{Yf z8#ijXn&?ViHYE at -M10zGP5#+RNZNN!*SCnCEKlXO`@Yb9loMXRWZoBvSY$E8f`IrV zw|nFDV=R(ha!;Cg z5Yx95)3+GY_g9M19224;uT1b*FJEJHf_GKRY?V=D?Df>OTf6<9GzE{65I_d1NVKeG zpi%8$jp(F{CkEBEI6LE+jE!F7b#QDR8niys zWW3HNv*l~!XBZSxXIWsJ?*M`CuSnYMp9rR*6>3`OCM>K}DJ2)J2w=6){5yRCM(IXZc3?!{k1 at x_d%8Q!A#bGRrpkdRRKa!#9jfEg8<}Eh~STQV!E6)Y686LJ2$BZ z=T3Gvc&vgRm#%0G&jY~SI3hZF2DVNYStUl$fKLeMlT8cxsf&XBwUSe;5f~P$^j9AW zjvw!kDn;7VRD;4A?zL&knzudI~kLVG&#S51p>;z{5OjI{!`PW zWKADmv}N>f3ZBl!HM%-7TOu+ob+S5H6wq)87~%x5x#&G?95^f3#OX9RTld8+_ylEI zRomg7rs5tM+Li)z?KzCX{fJrhkD8}t?GOL6+UBpPpM{(4bX#Ff(Q(F?oc5PZm!5~V zlg-s`sqG z&G3)yX;Us0uth-Cr@~svAw#2*;-yN^+H^WOYOhuEMA2ofWGEJ}N#oC0_6JKM>$+h; zY;7|$DT8avW{6JUTcz?u^zZ2Bgp;FU4 at xUWQZ5X3SM%ByDLe{(=)|#A5NGg!jpMex(DWPy_hzFf&3D zbQveebR<~JBjMA;885BW6nm^Vs{c(Ep-T zyPAq;6%T&-NddAoQpldxb$)4(PqD<2f<&>tB} zOtit37(*bKb!kE-hvuk4$c;5C3 at g$l5lg4oO~%5s(vdfATss}*iTT#{+Qe{K-ruW4 zdmoSH!W^5R0;W&pN~-*6jfSwz>nE)wltqbA&Q^^sS+Ra4kq zJc>C916O!#hd-v0+RPJMb*|{0lZR)2fm?{-O%Gzz>T~pvHhE}&L6ZXLSUUH4ZRPl` zra>eq&Vv5gsOWk;H>1LV7*qN0hMi$yq#pnYl^pFGmoA6NkFrd*em4lt at x#MYXecus z%cLSE96SOcCC~{&)%px^f4dyEgP*q?VYZ?q8O-m?G|{CtY=+#m<&{*K1Q0d!vG_?b z0E=f{kr?#GDAy^2#>`=+TU$&sb(&1C+=+wbY3(B at Bk!ic9imWbiavWbE9`d(Ueo=1 zZSl+>qWx;0o)F78IZq~_>tAika8H*1_)3Jc2jBw!zX`29=VMcENlRj?Q1 at h6u;meP z?p_-l)wnl@{u7$9AE8l=^m;ev{D?K z{aOt(fMV)Z75&Qf$|=IEGk8AG at DziqeZRxee>s5v)E4>*uKenfvYU?G*_DIueKH~3 zHumD=@%R5k=>2;ODexU806qLmo#|yj8jZD^knE(l-P*$S;=FM#Y+%&iy=GOP)NaL2 zGQH~6FGVHps~#B8;-bgWXwNx=)6D98&Bx!ybXpy>-pHj;YpsC?qJI9d{~ig!=7n(0Nz?Z}->sdbrx*F!tZ?bD8# zY5I%xH1z4410|R5Lv02h-)ju0MboFu_*&I_5*LnK5txIdIWvKTSHZ&HhWx;?Bf>6@ zQ~+a*m3_&a4w_sBJzq?XJ7_qxJUH$OEnw?I4f>P-xv0m+tH`$Q=QEFv#A8ecRb-(Zf9SNw=oF*}gBT zI_Jqo{yiiWd@$lRX!R~sNdh;R93RLso0fKJk~$4rN`aO%>e5jW43!7DHeS0yzAEDh z_3Z*dM6CL_H#LTxaI at Ce%VlMYRvnG at 6@iykdaFOqYv%lKk9ZsMR6q=f(rr zmmdozIiki$0ou$N!pT2xG3ravGoT&FOgvr=PNjHSJlQgE;2ZdcsPnDd)3QY1brsPykBE5#BRiaYB8oP8H zd!Gaup9Sp_JcuoA~SYATADF+jl`Z7ij7Na z)j(@rJo_+PgvxxNz-qR!Z$+h3q9TF zA88x@{wXRm3 at F@9SG};|vPcwGigy~T{MVm|WtMyTCZ$`e&x&MU8b%?}`}Q at c3bNd> z+3M8+y+0S$-(eIix!b45YasW3T?`}{L=pK1(2?8p8qh%Sfp4fCT4~WVJ5EY;I6Nxz z`$(kPME-=4 at m?Y&%nAR|O1KRH0hR)5J87n-AF|p6+~-i&K>zDl8(!%i>z>aDx810F{xLurrw(FPh`Ow7D!(1;$+J#uljOGIQ0PUM0L#ao;(brB@|wk;=ngGiH~x zii>VCGn+y`aB1?^ zQn8#j>}^6sbHFRuneOk?fNzo>xebm`oz-P(wllH)kOfp{)IC3KVqU_NOSEs+R#Inq zzz>kcMqQ at VFN9nVI2|$hew8YK=Qhc;0(yH)C6~e}mw0&3;i3jSrQ_$vA5vC8Stz6~;8MDL93kn2ZcuSR`JOT84~_Bh59= zL?cG!4)_zSmbXuaP?M}oP}T1k at QSn>Q!h;lB1{v0+3s=eJk#CyI at ua~0Ysq~DL9f8 zVU?wVq~a(v48#zjAumRds+uJsBqUAVI%xzKQBP$o4O2r!1qiBid3syW^$IaEnD(5= zbf270P4!gam~{8i@^Jm at j@49QhAqFg#DiZrs942z<=$epLBBYbu-a06*)X`Vc|Su&6PVKRUh$kL)%v6Ws9NW$5e#n7Igt}#@XC;JiMZnqU+!E#?|Gn;bThztSL zsvy-rJKFP^rztGuoYH!)ELE$wTyt+)A0=!^5Y()(Hs|r^0=<_t6t}_~eZa at l%(_H& zf`@GRL8&FeqFpgKoy!)@=%ie`<4=&02MJkuj}=sj7A};LRVK|abL%ad85S|g&zIb# zEeRG5Ah~+lgeOU6>aY!3x68m$whnA-`x>)uZQcM#+;-1A9pHQ9G$|}8k26aQBHD+o zM$TIvHm+>?OPAc*)4$kq9aLe!YFDmm7FlbY=WV8E-L=6iv5-e;O7a7+!8Nd9HcSeP z(EhUG4H$v{Wm9z$8N at OlzG&m9HbUyeg7C)eV_Jw6sFqx8qBrJCkbJheTKQ-DQ$hRB0(yrASVz?vPcaG**A$%|A^)rP`ti&k?mz+o-68 at 3 z@&3Eo`#-<`8)8QtM_di;?-}dj=0mwcPWOFL=Zq40IvHv7R*Ikz<~H{P8crwUR%j_I zPkM(-xnezyPU!N&?=0}-mYIANZtp!6i-mQZ1;LD(d0f;L_>ECNGq!{68;kQ29a z_dgbY6O5_x`vCkWms~$@-#5KA&u=R}t`hr|s!vD$;@BznTLZv at 932w4YrYP}Rr|3=A6HX<@aT3*8 zuhvVgJjdV+M_`NJQX*m3*-qk;l`W0OZx at 1`*8%KcstB5G9~6sO%~A-NN+OyT+0W6S zR*5{l5!lrnR-D0CqBzmL35=~puFH;4DES;V%)Qzy+iIjpI>lk-sW}cf0b&4&$pn*= z;|cZg`zk<5<^%BNHALPP2#(U^2|3qaZV7FXa(x!f#?9_xE(d-7+&rfdvS$2p-YbCT^3R4R^jVr? z5J+)_?5Rwy}U+Bikzw#aey6V$}{qlZF<{sP8tS?mJ)G>mL;cJEJk zbCIw`Jj$a=jRD at mW}`Aqlc%@MbJ?~aYlU$U6=&4&;l8BHeTf$7I{qTQbjW_$*-gJ( z^iy^i#;brrVLUZG?xDuQwz-O8&6eA>=0_XbT8gtVZZrPZ>|?0wBAuLsVW$|}B8FSK zBRn;O74sQPO+8Eh5Qcrvy{xH3x-iu$D^hM|%XvGjdR4r3l|Y+Ta-N^68_<+kyo|J^ zY8g`k$e)T93$rL%b;mLBC1S`I(;d-!?3%$8MevwxbyuZ9L%GfYs*z-&nZ7y`qdJ>% z3tAYzP+Zjei(Ero3)=lYj9#`cB|7}qDf1O#C8D$_rRi61MR9jUu^vvz7&raLIwHPyFg0Mn<|3*U9E<`&eK1hXj<4hWFP#6$X&^YKrl z`N+1wdcZ7k2a%oH+BSI;O=@1bf`}bauV!gkX+;^N4-*x7H?ji^+H_(8(loZg{K|2} zGg+=6-IV1x|$ejYc&zcyemI$-mi1m^JQ0aWE<=Gt#CEdp_}nA0mUGLqLDikwitl|l~3r*;auwVUqa%a z=pVy7aivdbuRJkfza&XN!uQo#k_&4WMyH9AueO3Vq|7ce#UWJn9N{DaqOfXPuwqR$ ztuwj%rd}MMgKP5u{yxSj(^AUSt#Sxi8etzY;mKTY3RL at MRTw`7UB1{``#Z~7OJ$La zCxat?TK at y|UmXYB zhYgADf2LOGKtMGArsMD*WduH&c+2QN at PN+7PFYz`I_SE{GHAL%6cFttK_)PiMrlbn zYUDb$!E2~Qy2dshT%qb(<&D+SSoRSO+Iew1?Ls>zzv}uG{!1B~tIie!8=Kza*yq^w z+U76W*=_(GZi8h|tk2D+4?*uk+lj8e_enY3Z;a3WNF at HV;nG#4fzq{GY{G$8I$Zvf zLFdi$!tRY#M;_d3N5UV-*Vqqli#?%Q#N1I#-qnHQFaFJNP}{c2&`zgV$d`$>*-*xP znafvyMDw)Uz^HxTmWMn at gA}K+(8W6>Tmth!Qrp)E%xO-#gG&CYfxi)VR54?oQT?8q zp|uCNwjY at +=HN+>WDBHD-L&aTB^}D$;u9!&qOvLq?xW4B(hB3A!h&YC{8plm`Ta=YB(~m90=sd#1Fgy^rNWe z526cL9CRkNIo2)FlFhKUQC8*5I)P~CRz$Kj-Egpb7sx~sT#oO~!QQXsdGk9^ci81} za3zBrqCE3KR#qWW>s$GI1U-~i6~VuNHd5f>CXxU6lg#{wixO^0Rj3`y{S5(WEi zJ1J!yDjVgd4S<)vw?`Nh3Dc+1w`#?Ia7>4`)!xD=qWCw!MOnPlZ)3>8{g z at z2-`NA;x^*(=3PRY-4oEbk)?_lg@!7qE zBZuK!k}fjRj0LeIGv^W|aSB7qhsWVBlS;OrLs-zxx2ms}GY&Gi);Ar3O#e36a&zeD9WYk)2sf=}EVFe+ at Lf;1-sc7i%$qVGv(n zU7wk9R*9zKZ&%DgyWX`CG)D!k&G_v{90nRQB zI at NoRSt7(2J=j*P*nR%Lc at ULX!Tvi+m9}%imptZWL&gN=g`&vb&x)@n0BrZNzCKP at lOj2Rn^^6aZ zOej&f+mU9%N1J{ABjS+}>|veVKyb{|26TGpv3GMV^#(<_9YgOVmS4#KS%<6kJ{CF=qf)smBL_cdCM;TXs=bz!H<2eSrXMCh{N2i$y2o zc9nugAchk3M5S1LZg2xTVuT2Owz_JBJ~z?9?S1`bebq+nHcV|#y_}yeE+u`5q}V56 zi6!`=RXG}IZE&o)z{hbJm3{E)~{t%W;*_}l&AHu&L2%&1>GI*rc&KWj% z)3(jo@?t&b9#hwY2$0i_^6H{X3&q%U8*7@{1Eq9tI=pl>uw`o_wzBJNfpM$Ywo}To zOM;FXGA4CqKfrB>`JUQjeZS!Gau^EUmU(xp(H!S~8L?dVTeYS3?MS>BL0Ie)sqzZ8 z?hCQ(6ZQLsCAfwp>>=AHN&i+az#%-WOErP#h~;8W05A$4i+M&tU_{5;7)7z%AQ%48 zjk0$(R=r3q!h%(~{SH>*_CI~CPb^3xPs}AHjWq_Zwz(B%khWh>k5smk_poD-Zf>Vq z=2lvlU`&z0=l#p6WUbiv!sS61sH|qYM&|~h1|u!ijbl5WXA6iO*|{K`2Cm!>>53xv z1SfyYDj%xk3_SMk8tGq7SYSzVag_B71g!}Ix;fl^o?pED0--j58zY1s%awe^1v{Jt zJA?$9qNw>hDB(P&QJ6OJ zYvHdB+R3l^E1$@O*PXJ#Uq}NRNnJnWRX>GLJ#sPLp*k*XX2RfFQ?`!rlh$Rgy5cCN z(wC8K!Tb#u#sp^!4e|5imZGSoiBxAISuWEv&-I~gfi`pfY9j at O5k?*LU}35s zgRskBM9 at M>P;6e-6HMo2)Gm0$M${v1q|g0*_7c;B@;&b5*kE32E~zVcUO1(Q?B=P| zCJK4(GHpt>>BHDOO z%to{|hnfjP at c~DUU4j{!cI|?G1eFMRntTyzjb%Iq{Ndif-O+1qe=H99{bfJ^W!CpH z(XL8k)Dp-UVuSAfYTpY(N#S1R`p{aE#^rJ1!F8zve&_)MWamMZP7Ko*K{hVnH7V~m zGJyy`l_E&SEqiFrB9>nQ3`RPw$!b+_d}O-1uV!E z>HOYiA@$~d%m4Z88}P4-WJV)j?f=Y<|9M#dw@$E|tCj6PV|x=fXJ<2eS4Kx86B{E7 zGkPm~bBF)w4$H|i+k-G8;fd^mpeONy$XZuKD$<}8h!*TLrX(WnaNn;%^@ztq-j-2? zNGi3gVoy(5Kfn9Ef!qcu{VC`x9C#fpHGCcBR!{R!;8L7+q4nvtJe7oLd?A}}>1xcb z#!DsPS8meh4n8_g;j(&1eZmE|=5jur=&RKy<9hMcf5=IQqzw+ftFGy;#lMi<@J%Ri zOOKQyt`q(Gfes$87UoINcBl-I!vlfg`;npU`Gqgi_ja)2y;^5^0bVIoY at w zV9O;}q|(iVF`Z&*%?1yv^^A`dU5D!yVvg_ZbH-F33Z|&aH)0?_8~oDUx*9$i=Yjh> zz#bK3)5-TUo5*?F^Y7*Z${%aFl_*lVzZfFIv3)#I4PiHc&u>9kZ&UUL11n6RZdlA# zyHaTeXF!z|f3XNn&x>XlIc)#k-odt>5az+zM}U-EkKhi;kq&o=^6TaCNIH{R~(9mP@!H_pIuls!_S3BpnvA(_s$MT=il9< z35(z`J*i5~%4-Wx`PM+Uu0G at BsEXfu(ZBvH>QIB#MK%AR&hQWF%>Q?&|G${q{0npT z)WZzGvz*ROB}Q*W>tm&Uu4;w|KB;m}%j$O_E@ z&+0#LAE%!jKYzqB?f}^y_=jNF7qzA5|KXutQQkDOd`VXF?~8k6r+}Nz_oKwd5T6*^ z>d2Djz)+DJyB|9iRtQod{sw3N`cr{L5bdmUKd>$=BX4g7U)#NKnAznnk24!8d at -kb z#pIgx*bJCJgH!M>6mg!k|IccXK~SIf3B*W{yp8k~1%ANRy7 zxhWrjLJ=Hm{C++2iV%v0`5`S(AO|(p`K5zfE6t^pO!6A-SdgUOaWbOG*wqk%;Y#b= zePRr8zvcbRyp~g~$6!#A=j7i~Hkw}=$*#P93y$$=m z#OQ8zn5pXX%0cebneEIzxKxOdy5!9T&8dM5qI!DPFxR+4#DXWlX6*Db2W=O{EAP^5 ziZpzhaV$jlgcj#RG|sn(h)eAD7EK5eR+FsL6+(-`hdib`0=>a1t`X;t&0SZ_hABW8 zSLu6G;lHW;smO;a2oR7N7!VN0zXiUWgR_~Kr&COwvw2*Or!FsJb9Z_`HT$>dSkfZJ_%Jw}$Bg-7GcAXV`$ZRr3c__L>;Z=!?HY(d zy|noKOgn4GotrVjXKOL)@`oS7!R|H&oJwV1(}it5a7Uc4c-9|jHCJnvSYc$LpB2cEI(t;X9f_)!Rck#0^4p>=pG at Xf!oiF~oj48%c?Xo)7=IAOcT zVx}0?IPGI}53qa*YH3H{DF+Ml8vbUT=A36We?Oo&l`WK1!W{DsL!*#N&4?teGq(#0 zKaOG+u6RQq5km2gH_aIM(@GWJgwh$rVvgjnYoL!vBwjs$yhkrfTVIW at P#w|5VJJ-K|W_{v%s0 zqk^V^_RX*;0uY%rL4!j=19S2`{f*-LTYOjo0wRGa?EfL<9fLHBvTf018Bbkc*kcl{kz2F71L1A() znP-CjX|9u{Es2N`Q)92Iw at wlnBs zL8h=39!A*p0jbeH|b`vCS(aUf{ZnSSpj2%&0LsgEQU8mvbN!De$lvd6jyn-LBjzl3kP~5<+3!2%CjMXGhLsS7oOZmGk`U9T5Too!jn{Y9|pFeJBk&QJ+rYK%|K>7vRZ%O z`c+^9D8c?h+ro{+pd3407Bme1CG~rNiAcqBuBx)ve at huOzc>S)f)IwJ$TOlq!Yep$ zq+{YmHm!O at Ev~Vx*BKR;E9P1rb8Tt~EDdoXi_T>JXCar52z%G*-KOi{i0jN%V;Z|H zgW3Rc-r21&1`nA-qzA=~?(U5hK6DW6R(%@aWN9g~js&lr3LP`*{4|=pLO9;iZqem at mvm6JyimD~ZSo;b&pfjTMQ|C2OxA`85MbGZh{50zuRU5W$t* zv7zr~V}AG#R*M%$c8CJP=mN+$eq36oSB0)WWL925*l3B62Wl!Qy3Of4_k zW at J})9dlQB?=(vI+lY5Ye(oMOZ_P}88R_cOBj5&{3T!#=DQH=NG-cFiM;>EEG^njR zcOXY0Lhs~Gjq3$&#JvJdhA3Kh^v6QT0jb+FrBI at bGsfkXKogMLI(9ya;*$+uu}3iG zd71JI<{3!HRO#Ux_xESucaLyXEH?dZGGh0F=-Hh8SlMQlK)_Yd#ZLTtaQu70(8<%> zJBqMqI61bp2Mf~0JDUYV05*1joUIa2ktjBjfpC!Il(@#ESYYY~NH~nQ%AOJ~2kAgu z?;JM&a9`evnLxYElacMM2^L6xvh8_UI|0Pd4;CfYFo2E)f0&XtB_Zr9&uj3%W__UrPmr3zu*udIf7 zYIbdEI7x692z!n7Pj?|smN#|@?GijL#yleQI+Z^u#TZT}i1zUvA?9FI9`a;KQlorL z4`3S at e;@3VytNS^1&S-+-#?;-ag@$*W)5-k_jAH7xI$9RbIfpqVSLD(IY(f3SD?b1J=|Jm~l5R(oB#Ox$AYFX=-EvpgoLlfxn~0C5O<8cdW^euz=eRk7~ zq>y#vtkRo?UXyVR;=T>il2C*UT{3wSi+H=_R#B6Bn^BT>GnhrK;+rIW1!9;ek>DCr zMpm@`;qSOQ?-}74U(@V!h&2Hdb68ucc!T-ZprP2%eF5<|t<47q0uukf2pa#Gi!iaZ zur(7lF|zyLH=vcZ{#H4tU&YGF&D0{ox6l-58$`;eXtep8(m$K9BY0k#w`9k6U6U`s z{@!E+eRnD*y#n!L-^)b|Q?|ysqB#nqX+uI9^Rf4F#&u?zUQf?A5QBdkg|l&fYd93# z3Q_2uCoEp7@&Fv`rt$zSt9033GoTV+0jNf9abLUP7!bGJT4iDCCa;XNkXmrVrR$p9 zXJhx7afRMoLnWJGa+Zam?8E{n-`NwEsQ_*|b at EAWGh=zK)xtM57{k#uJe`^?)GGkQ zi|wYcURM1oUj2`)sP&z_G8>GL3BUB>q^8a-)S7#cj}3^Mb$}w~QWUpJHA#K{ z&gMWJwVr##9eBXrgLq+ry|8E?;l1Mc0#|8J at aA%}O3vTAn=}eZ9gT<73`+0QKKOIr zd3ogXx87XWP7xb&u~lSmPRC^WE(IOKE@%PGrOq2HP80RZRD~TePZkR0%O(GWqv352 zoRxF-7I{Hg6Fe!Z%fQF1#ei%`32jj0kZn%rU_24xN1Q}u+rm7mlq+o z>hnX{J at 3$E^)7C&1C_?s%fqb7u5BBUVUiyKL1c-rf z_qGkR=e&`KkD`-|n(?m6W(;Q06k%BuG>1 at 7wV^VqB=m+YXcZJ7j09smILymGap=d( z6nH at RSF(LJ{_f%UOSX6 at ARvYRn+(m!+{D<$+Qj&OVqH`6|6<+9x6(S at Vw18kszO_+ zD{a^Nd655!uQkGQB$){pR{!`|MjRtaXm#Q at VL z7yt&vraI~vGXSeYV0F9F;Fh%}^LQGN%wASPZ*`uYwty at 2@x&cyJ66g7yF}U`I&_q5 zfR at r`%Z(kzT-rh#!HuOn7xYmrVt=)vDdtc4e9l|xVp>rF8 zh5wF}k**@mcS9rPp4Ps=1BWA;#$PC1wEtdcG33N6W~_>|ZK>*?*Mk*8D10rmVWRIw z!HRFe40{b?cA~)^o=k=aEB9>#bUFw;7fu^aRFGzB*05Cd9#5MfZ^i`sp{3KI)dY>R z<7MGVoPuo7C4OA}nbhv}DpTE27VHyHRedGz=_3cfGVU;^!|3Y1=f62Dm)^4)O{#_F zwLLp|WcdTo(rUD-Tsreb-lC}h()61E%T at w#!HuNR!Yg)64dCJXTAODU)D=NpL8B>c z_0ND^u)$NMQpQzwKphcgF5kx`Q?0c3g2!ismAWivMLD%vPFvG!>#kHG!`!DG z?_7K3+ZLa+Ld)*Fj#X3j4(2pV}f;FCk|ejD8N1p&p`<-kg{Z z$dU+$GjixozOifIG3#ofVARyNNoTmRQm(;b?a77Tm zxM;92McYzAV-bN3>pK9}0)fy_WSg+hBvP|OMw7K08sMg8 at oQMXmMqvca@hx3U%x$6 z2!0=AAIz!w1@{aZJzmh%s=3Br2-&&Gsrcx*Eh)Rq at PB{alK=Mopg3Ti6i-cZ0AzKx!E}BySr1Vmo($ zD4*3qlF=3v6yOhW1RyA=JOsFL*fH_BYhN6T57ZPLX9!H6uMrqJo{{t{38S&U` zRNiRBOr#vxT~4hoUf`LURg^5|EiZoAFCSVO93+e3X2CjI2B06qiqTsDOk)@pL4~AX z{TZ2mHAFR}_Z?>~LbsqVp=H4gm})PjC`+Lj*)i$YSc0zeupk$=WNJnsNAxu}7;aJ8+T_9Iy6lW`8Wz!Lt6}`}E zuGp78+yjg6D~)tf0+_f+XDzg>ZHrihnphVQbBm3bYc1-{yihUQ;rB*=7CA}rE79&m zXG9bJERKYut%_r>#s*k)@Qf07k at DnU!3c}CRmI0;`;cFNX~ePPr`!%_4 at WpjaUu)5 z^zuUiLhVvfEQuJWU0fo_^DCmW7zi*|q at A)1$|vbi(>a`v9^$u3`MN8jcV3v?$9ga{ z=S9+j3`j7`iGEy=79*=ZB1=#!90B;rU3CJ^dCJyNPjEtP_MCpHt*UTZa;av at S=#1L zO(Y(J5rh2-!URVUn`k#xj7qp#E-g5PvZZ8jkn8sWL!XDX=746a?}9*PL$lsf0=wP| z51K*sjt)WYmcJpzXJl!6&#MrfZ;)==HY>lrH2baIi#F$7v}?tad=nL5$5{F^00tW1 z5VlR<<2td-;(w1fFxwCUCX`bnpr3j>)$J{V at zG<3`Dj(&SVVw1tSgYHNcT8KPVb4X zy6m1QY2cH-aX>|G0@&MiWTlrci!FBhW1WPRXf7W&!7Ql4rd~JfAlp}JZ|aSXGcqvbLd1v5bE|( zV$ow#?ZNNZWrR*@0bS75cdHGAmq<9YtpC+Wn7sd18V8U5N*;ayVbZ|8FX^hvBQR^g z$i>*qz>i-PfcW5bb9L!P2<~l1NEuuX7f;$Q_c-e!`Eho7COiZKYk)0sk~99pa)4XE zN8uQ9JNK!SoAb95Vo^Vu0Ks&}nKGfcBn7`P&^{9yw3$6gb6|Qe8}OdZqV2&6TcOQj zu$uxusyTx5|CM*>3w*1!kUNT98>nDw=&!}t z#>kdi__3~YBs at n8g(!B&D~3{z3J#=))iHAIwk!p$GA4eNUy$?%j$?fOy)6l zc%4*{bs)oEq_XXLLoe81U7?)JqGEYo_~BG#Y&+<~chtP#p7rHr zKEYLX8T=AHD}+Sa&G at iOGpGi2Tk%ftuOi%=d}kB|0R$9`{69VC^6w(7@;4!JHgR-x zv3Iuke_QWWs#;E3YG_~0&LkRl5{l%>iX$$YWYN@|vZ(A~S)=vqFUZJhs_E-4ghjn| z-j)-|(+)=k+O6m(VC#B71HCZ%rt2X=5D7p+Sh>u>V)(fXw9GgCuz2Ir+?_YGHM`4#<6xe z@!)EQ>q=8EEZNC1GeI{R-m>dhQ>njH`Am;Wu=@FUPjyZ~6TB)wv*WU-$S^TgW%w`39Ds)Ot zqeL^E+)rdoIG)^Y%woM;5M?Cq*^=n%d7tRM2e4xFsE1iiN9)X_N7`ux0(W;l(Ayh} zF at UB!S@~ifhW7?%F=EauwJfma-6QL(b*xJoJq-4oWqS= z;%H}S&^INe_-3|L$Tgbi0*-qW>8ewvyvVC!BP%I}P};;RUv}sGohe|?#BPRlG%7T9 zD$Lusm~1 at mYvc{By`BEl99$iP*Bj8g at XcIlLrk?=f`jV2k%cFX)Bps7k+1BjNU>{u<|@>|$2o1_ zcN#kki|&rjQlz`eV%;|e4*`?D z)q9~2PC6rSrx*8J-M{I_M^b=a>Z5CRIq~#{R)AmHqmPfqVcZo)q+S5ga-+Wyd>&|^ zHXG{RfDzbe)>d7Zwc>j#VBG_4G_`ecSY1Qh?6vA7mR!2v6<;S2SC6jByjw(#qN*eH zlkgDUX at kk_*f+Xv8&BM=y>(W{a3-QPa+zo~M`QRJQ_7&Dw$tIdw5E)0iVnTou1bGg at d zc`Oe3C^k%+z5T_o at gC{}5p4WoN7;@YW^if7cChzEZ%@ZcWWyYrieCpD=>1N|{0Kqk z!Wkd~^mhJ~I$Ye5d8rbv_XO|SxU24UvF4GgU3I5uWN8&GpkKuv_+DA{by+@? znz8$UkiW9_KB5}&N=GzAX6aAH~4G>syeqw0BfbvxVLK+mb+Xd0^G<9;Z5!K zoe8;A*%GX)2E=8bSlxvSar#98SX3{*M|8%DuRtk`&wC`ftVY~bYRv3s{0iXnx5(VH zyZ$we;H0bA at f&C*9j)o7+f&>H$c=+vq!+<%`GaOL^$xs~Y-tM}t^o@@?S^jo*ms`x=z6e49rWBeXp=&dXxidmC88mN`;4d zbY!cRh)0ed=Onu}^keq`KWwu%bq5O%#am95Kg0pm4`gf!+juNi;)~%mwC+xUFWZ(B z-LirS`{#uhz0V;_Csjy0ZZD5I=*M1-UwoIkCU<%TM+lG~A&nXaW}l%Qx7_rQvp)XgiwuWR}QBW&v;Z>oO`m at h88j=e}FZB%e0{U&cP& zsWipbXdRZ04pu_NU-Lhe-pBG%x-&S)PJ2?0#p|h#e4&9`Wuo28Z<#OpW;nm4*1IJ{ zdx{=wMvqp6KXI}}?Cg&-F!#JkwMHt|)(0vR8=7*ssn;Ys98>I)tc$j+SsAaBRC$H2 zv%zU=-;J#Ncbpy(yuC6ack+e^ur6uuUQlRv$nMaPS>WxRs4Z|;1rDyYeNybM6NVug zU&zZkM;`s=?tJ>c1?EojQfj3Js0~_K4mXH7#9r{TqvB)5kiseI8B^rfEK^lYEQur8 z!x_~|{R*xTM-1%BpK}vS$wL~gJjVEkRL{vI z$9g2P#1+%A3-A=@AEZ7wX4p&FDa8 at K`STr#sQdKV=yo{7G;H-|h9nfvBe~0A_PC-_-tFqFZ;Hf(z`G}RNsig$j%xF#yLuCl?^Gx$>^L|lWNRl3)6KYjF zL$)>JL-uQ{QQa~@y%F&^zVmre>0Gw?&cGFUS3-n1}_{O-nq z`m#Do+wUmDa}c8alZ4=c>}jZn9e0@~pYaC-Uq;NMJGu}XKh(Vt0zI8=xz3;<(kiHE zXO%Zw#Jo0(VUbYDgkf2M#KW1)BcV2SJ}?SwlZfTp=y%X-#J8M!n;?+jXO0vix(Q;a zzq8RCKGby-rZjPo?Ab##S-cxR84cW%9R!?0;f!_m#S7QyQ<)(Hp> zmiDok!Ty6oV9pcE52w;zTx9g*hRG3HfC=msGgA%q8uMYd?#~k_1BY~0V$6zhzWz&z zr}+;-K%3qMF{l_3<`fuZY!xn`RkvCz(HH8+AHdqn*2w9RY7S-dh~IUBcMqkUz7m;#nBhG>UM3bVUH22I9ycq_9wZ9+K76YbLy!3PA z2V(d^J7k3!B(d_B2TXrBHmtE)m^vF+#U_0^q^FKFA zm1XP}1Q2~P3LO&C$r at +xbfEJN1DCzGkVOPlsHqe^%@^N?b>gcsU5sm}?@~DYK?Usv zGG7%!HAX~cl_lo`FOQGc*zI_ at -_M_)34pTu#th)kJ&bSle;_E--;DMHf=AHDVV@|U zC9jE&EKjKckICoHS=HBWynBcj at 8hR8@*Eu!;#q_nv65$GLS;OR?T&-7Yfmv?LV2V~ z?l_O!MCSL=Vv~v!Zf$OZAQsywOa)#{#y}byN|K-(_y|J3CjWqq5z+GYk4FUvP{??= zpoZ2y1Xxes_Vwa0b<(xSzEHaHRJTw6Iu>qi*G&_wAQhrbWMoxjjaP&tvWbkLWUBno zo3gi8RcP-L%W(>+uV_UwG*1p|j|>rg&)p`eV?O{dmiIz~Px4w$2iFi^ybJL~Z8cQG zZgIUsXpsg#TaR|+c1`J~fjv}t9;W*Qvy&tVqa zB+ACp$P|L9(xeYB^u^~>$AB at H1nJIuO)6XI^_J_!y`he1=XGd6srC{XZ0KvM^&(G3 z(jQ=pUOi#O?#>mb% zZu`eNn+0azR;@7=b;On~m8{d^75FZ(%qgGdqEjSPq^R%Y z&Q9ZX8fI?T@$>rx*GHlU#0^RR;N+nuijn+bq6|}5aU?%uz!t&@ew_M#6e#W?YB|KP z_24{WW3}}ZEM+K0-7+M!S4~a_2e_zLp08v`qz37#@PbWK>7vIJ%}@-hDqTSCqqBQ0 z#ImxCdH3Rped1Oyoy>#95?EwQMD8n}8IX at Pt(L1D70)p~68ZHrF|U;jT3B6|C|#&? z<53PvS1n!aBejE1&Bm?6g at k9JRQE>(r4Vr<>5@=WtfC9CQJ9`!;Z8m=iWd2o%z5KG zd(*>}=s@*GBmDJf^FDftL6IQfTwar`6b(4zG{cY}x-0<0xvidne^Hz3>sxVj$%&lz+32`AjYi`72XleHtX!Ih|U^klakE~|R=2VPQE z^lHi`2{_FxXDpTYhGZ)g_kuF-T|H#DYlKF57es~MFRtLJwVBb(p*qohB~<@U;keK6x?;~SsN^Iv z`wWH%%znIh#a5~Hu+)^ME$)^r@~yzsoq>7k4Jiq9`UIN#rZ+LztjDR`kQCmS^dVzh z)`Xw323*?&2T+$-?M69Q9+ZeX}!$M&`#3{_)c` z_6>0Z(#uroD_*aewi%D7%;W9O at 0$@lpy~q;esFs+c>Y6%&{rPm&7^?Zf^M6Se)(N2+N0Ob*D_P^yS= z-U0o_z+jZNZv9qyrw`Mjy?3}6CGUpQh;aa(Z65HL7_l_Qzlc6)3_VUT#>p4 zt;Fly)&4zvLd}`*8BAyyuM#REd{77Ka$DZWV0)23|2X<&b1^~ zet6vO6G?eug&~!;IOo=%xHAZ4&l5cBPwXy>a6J9({s)*$_Q2$Ds5h&ny-H18GStJD1Zhr)L?_d z1Hd%YZU!DQNvd3V at IwoI^-GQi6Yl+m9-n2z-+Wq^RHvGgtI2sS($$~PgldjCvstl7 zOM8U1Jpkeqm?tq^VU>{b78y>W(&3CXipwXcnwN_Yxz|9S7~jL;7%qz zf+?n*CXxe}x4B<(Ov5ZviNK_b<6ff{?hPO0ktGKm98YwVzp}frl6(cgt&~Qs78n|} z at UX$(%4*qFKw$6$!Mp?Qpp43uAlsN^l1Y-2z5}4jv>q0lO&KcwTr-py+8%g$m#H(1 z)A9TGf&8lqyrnxV!v9r)GYB9c$^S?Ngv<>r{$X|hm*@SDq3Zwo^4~?^kc!6NA`tcK z3KgrgV2COr09w6}Hpv1>jf$!W&2Uaw19=;;SB%Fr8LNS~k8n2?1RDF2d;NvD^U#Nh z!pfMBaxy`3^4tPW&hzi}(|3nDQYguD^*P{{&4SDGr^3xPU&= zQyW9NClZIrcD!|Hwzf2lapM`?yJpv`djRV#qMf%U*}B8nF=^CeL(yl3A*|VX$D#G8 zOl07(wP-4}(~z}S{yYheJvrGSB#%^W8Fr#p^8FDrQDI_Vc6w1er2}?A1+*fyy^fy~ zt*^m(AC9Rrk|1QD!1*WRn0!KmS=q4oTKroO{v(aTLa}ihQCZivFjuD&z zHJb2L9q=~W$Uc47uUdH!I!jFygu6q8iE+f_m`OEl5wZS5k8^6i&B8Liyksy z5+$VKIHmRKdIgTZ#YgNIOb9jC+H{5bqHM at Rirprq9``_ZEn8(a8XnASw)AHJIGD^y ztbq>ZJjgbx?0f8*im5-0MysV)3h-Ig!n0>^}&8YKYl|G0P zi*hmc at -||SC}tvNJ( zv^Ag at eU{!N$2STS at f^gs?gEiFf7Mgw^+Ng+BHg5JB3d7zeEtFL%@>wC|}c8M3u3Vf?$$Um(c#4IW7H!tr;|Kl3~!enMJq zjG2ljTbnMdX^1y2qgPeMG^_rK5V0hHRJIIGhsYId8eW#vYD(7B(rRq_TJU?*>yg{Y zb~3A9izT%->~Za}yFSQtn&G|n`jh0B<&G}^_LUqp^pYO~(BadL;8xi at 3dGPeyxF4a zz6d1@**QuFx2CirM4;B@~D)ze3VKRO)fJ}Nd~OYpR7FwD0Uzx*u;GiSfrrP8es!T3!g0)PJkENA(CDgw-HP&h$_yQoM`xGx$Abba&CR4iU} zIy9A~(A at N0vw0(}Vd6qPvt{zgrG3z{DTS>Dz#^q4 at -a29=_*bVY)xj5O{wJ|IWO0- z^SDBieOVdZ&bm}vH1ortf!ekvio3H~Hc-um!xX1 at 8<{avY0&r-G+G5M0hPudJ!(UO zNIEv9V5(BKt7NzlZX(=mjdg=}vNmt4b|F!W9SkK0?O&p~q1A=jaFud+S~vq)!(`CK z7(FVIDOmGUh{u`iwN2&~0Tz_Z34=d3 zGX*S at Z6U2qP)ux{0x#|uEzl2o^@EYe)#!1g7 at XQ#+SSwLD9HVOO$D zl~zfGP>iNjwog2Q)^_sYht+1BlEt8vKwm>Ka0ds`w+XPuHiwTMK-n$a<}V&vwMWT+ zcx%$4M`;ln1tLX=SmoYR<Zp432&u9gcrUiVB>yGct$qO%#oP-mLrEgy!tL}>AXBCBL{bK6i{8}RvUhIY)-8S%{W0p_P7&(?ictZx~q~xUMP6WF^=6c$EuA3BSv63XC&%TU^3gb zT>E}#k>^Uhs6f#4ny19T&(Q8&c)`OoP`9M85PMD7^@jB(o8=WfF=9=A0#oE`;v=+> zeg=43l3A=roPrO;No~Wp7A_r1W1$gOLTD>U=8c1i16x?=L{w4{ zF{GKobVv5U^ftiQf_*2pp{#YyAgW;?p(!e70b4Z$6<`{T1lIETjUDo*F}u6H)P$pn z&(Z;Qxb&Ws0MqjvQMs>P;H{bLHUypxYdP9pd|lhl#$^_~P77Cji92!$NNHy547JEc za&p*ETWabQ*;wEvQ1)E%_p-`Ei5XX&o@~@mc;Tm{^qwklot})>8M%3u2)Cu4d1c;K z!cD)>eZD?FPhY}~?d=nB0Y+M*sz=sR#D)GXkax-6buc z)J?dkG%^l at l=ZO6z9gntpU2^H)R?eZxq~6DZ2mD9V+)WN&83 zg;@96Lu^t*w$7+Z*kei>pgj``l_d|D#rVA>*f5gs_NUOAiw*TsT^`%NP+|4go3K2# z1LhA>uZI2vSOZJXFn}`*s1rI^L-KLnE4;`N*-7!!akB=5%QPxaDM7>~l)&FYp(j2O z`>iTkF{TN3Wze`FI1Y6g7rn>Q;}7EABL0ckqCoeuk8;PX806EY#}`Uijma21Fvox} z2p0+s8)((RjZ4;sKpRT+r(Ko2<%M9E%J8J*!suW?NfAFUw+<10*$mErtQcLIY7HjA zsc#)H;=Hw&t(MNjt#?OPIEov}(8=%%f03t`B!*bX3Nj%;1G|4`w4$#j$uRzduzUAI zn~*r77pzm>eUEpa(@_`xfk+Bgznnvs(;oPKPy#yZxUhZ!Zy1U+JhvdY+GLKkOgfIb zcvp2b>Wbo$quq%j|8uAz+K4T9%zpofNwHHP?3rljQc7YhIiZyTqKe at VjPp*Cd=1yZ z5qWG_c>{SVAMTRH3p08*dSosbH}-PKs^A`1b1EBYdGFwZ&N#H89e2t=N!eLng247JuaL5HBlqMXZTwyX{n(hXRk#7pU^Gaf4<+ujE<6hY?l+yw( z&xq*r?b6fKv!us5tF&gr2>X^{$7#1b%-LqcIRmW7Gt37braUu|-?5^@_ml3~STpy8 zxC!?^eXMW2;R!}xg}h13$fIRvEke~O-Dmpgr{!t70F>F*lQ%C669swloxl1%$i^X? zL-nN~n*}?AMQ_>IBAiYTuk#}89s0KO*RM-Hf5^eZhsD^df8dNjZp+=6 zL46VRK~QSzJ-OQhc56^RX!>>tUpQkhu05Gd&3&w1qn)QzXn( z?875)_X(*wNQk5{Ln&9ewl4{hTS~%~_8CG;FlH8~O{!O>k# z at 2hV9NoJiI;#@J=b86k{s-CA+b;c{1SzvOS>9K8}sO5IhiScgXu`Tw)cN=|$DNPZX z6l!Y0aJeC*J8j@#dU^i0!J&h`VV-ATAfP$$|Fqx4_Fu_u*MF}rXsymyYnP*nprQro z{+`#A2L-FLF;rwlI`mnKHgVvVYVLsi?)BSe4l8}xZMf}wKcau3jx=i?LKOxhu%1tI z%DB$Fo?P?z{2Y=3!b06Z{G~`&#=sI8#28)&IghCp2UUQkQKl^)r^J|Ns5m5omV()D z)z0d^5pw$&utNy30M-#Wr>dJ=i6%M$&)(Jze0+v!Au1b8Tzskd7nzGM2VE<8=58 zUdzNFZgbCL!wFWGrAWdm7Bhiiu{nT&ro%LRoc4-t!vswUo6bm6h?|SWIbTW$)rZQI zMY~T0tpWRweU!n=??@JHG2H<;R7_95nMkU&fe1pEP#lAk%?+>i7 at b$)F7hyt0w&=H zN6zp24EKke;y1Yg!Dm`>x_7r(uYOcIH{6&vsU^e=^Wct-Dje9fm# zL-U5APBYBTzt=zF2bNSQsH~^^Z0Rh)d;4b)W+M7izS(&lg6gdJh~H)8;2oS4ol(}V zRFvQq36zWbhytW>fn|XkC)W>EY|JaNka8Yvojbmaw)Suo9eB)4p6#>OR#S at -ah!Tk zJUJFM9RESEn~;2N<@c-T9I`vzE9eDh0O>kNnN1_;P3ktfo)@$W4xz=#hQqt2S3>hC z21?On)fZn7o8JtfG`@yha{2E&aKaT5)$ZKL0ZghwENq?pmzOeH=8!PiKQ zqY6DQcv?uLamvi%bfd*|-%LV_RO?R;srexKtb5LBRt|U;^%Xhz_`==JoeV-QC{QFZ zU~+Nj1bX0Cm`|X8Ws#7k$8OYL7Ww_hMg#jlZBu0_In-Z>U!EGSs|KjCA#%b<_5}UE z^GiGQW5o^Y!=V7e9FOo*OvcS-3kyPrdV64Vfwvc1FLsfv19z(o^`5C^XJ>Ea-PP4+ z1U)^zAPj*RWYUot3=9VQe2(CETNJtG`#;Fwq|-+G*%)l}hkJzp(rZc8y80)hM=O}~ zQeVaTCuOaQop9$WdE58pV#(BKJA2#MYPOBG*bAN;aG1UNUCD~2r2kk_o-iJ|J$IdY zw#u%RsCu7=Z#s{o%aW%gZ0f>2lMmCkt{$8n!-2DlFFHhue_?~~}?K1&&Ga+7tCAOJ`6{;FpwZbJZc`!6 at s}(r8DA!8h$)93a0ayl! zn{qp#w<&HB>PMI at 49323;Gyvum>qXA=IyKCLsB(3H=a*8dbLAY7bs;^_?F_8bUOQDdwj($5q1G>{^uUq$B at +{;_(?;21C+spQjd_rZ zjOZK+MT%bVJxtx at 9YBa!vo~I>#0Eo0qYSlen;4vtD5rEJ`oI&?Ewd=HJCwkUQoQoi z*YX`ktH>WIicgamEGj!rWlnQrY!g*eBpM{<2MZc*ur5$2DIaF}QLq;H=Ww`3;7~3EqdSRiAmS&cv+lDMlvrSzG;C(?sGq at R=5 zT?8+_pqME6wQOvZeLZCKOPpI#g68Rfr|BKJaw8qH_oh>Ee4Ff4w|mn2?Udb%bsBC$ zVM8-lr7ao2OTZ;Qq#kCikEq#y^H| z*@A8f+8ENhTz=3Ixf_SzR#=JIY}Sjoh<0U&7*L|(IE#6)i?#eVm-svrdx?^bS#@{% z8)u}B;VBag!?)RZk at fk2lXGB~ph_+gv5;?bjH#gNkje69Cx5PpdOmkyKLE`Cl4&cG z(-Wgs`~=y9cwK7{r#i$4aU7L(Gj+TtOw0J(dCTqq+QX(l{Ui=G zW;~0p=ifBa`+k-L>90oq`Tv8Xe@>ZXCHyZO0luRWQZW-!<->m`3o*vFvdB^g#g+n< zSr&=!{S-J_cThc5ou<3XqlyVmgd7Az=oKO~&6;iO6)}<8&f at iH_@2C&(cAF at S{*cn zQ>i at tlWnUFLw2QAdf*=xLZ(T!4%<}l(=izL&Io+jsPx={BtCIMAJG9Y at +lwn8K+nf z`fePZ^w6LzY&^jbVMM3Y<5%xTFV&FBZ&X?gLFCXuwv0v7#iwOZ>!o<-P7WO(L=G!A z?Vp1uvk4~3y^5|_ID=(eftjx+tnQVQ*I57{DV)QI at 0lJ3!S_oIE?-kKK)i&gn>~0n z)_ at 530V@ZywXj80H(@rG!~dCwVdToP5XvlJBPCV8T|oo?nmsG+<(un-i3?Wfqy~tS z48rZ&KlR66cMpQYNwHrOg-ec#sI_6Kvn&9~VbYW)4J`P4Rro3PmC;9tpcH;$c&0;k zFPwU!sDOU^t8JEapmzD}c(W(w0{@;tN+r{54Z1&;Jgj4h)Qmmkt*uok zX0?#39caM8`Q*nL<(r4xYp$AJeoq*6qg7aC3(Mbsa#$tT*O^2qxjl>uct$&-XR+I* zYEoH`8fQx$Yi^P;tJ&jvWS^eg465EotIVE_@}9aS1I85Jf zxGN8#`I2`eNU>o+GVbAMu%4MFAPN+w2bqTo7$t;)Bj>7jt#wJzU2R8oxDi6CSS_jA zH2I>}u9w>^tS at 6zO9)h`S2bJqBwAj&oyR=M<&=EtN$s?`xk-!yTaEI09ZybrP4hZU zr at 5KtbiVcs(Em{PM*wNX^a56o>LN|#!|9!BCH<{+%emAg!^>B*_XK3R3%}H+wAYin z7xCkymHW5X4JqrLNs(L4e21J%k7BsyX3a4E>`g8p1UNM!L`tFTH^xC6){7<3du)s==eaZ{N4s`0K2Gumi0M6nU)%w(}H+XbB7tf+C#wXEDw z)=`&6;IAP{vm7VOsdFkm$Wj1oh{G$9?l4eK+o6|R>=RPAkZL$@kL*CLxUH z*swvnaUnh8HFZcJiB4NA>BM2sVrG#;qoKz zNm)r{WXe9+gpvJ+DbsmQ at B9Ldfc}*+y&HlluT5q$&YJm-ihb-%Wh3->tYl|zTOM$2 z|9(ppRQS<0MXe<^J`?zSeZe2ZdmJS~-JGpTxCOl$0gG|x>iQ{Lm2cqVp!K^N%7Z}7 zINOYlYR>LC&?U=z>LzU0!N?)l5y{na0MVaZWNfsKOd?xyeGISFRDwesy{{%hqE?M^x#mmnq%G;+P3F(OI?6}h5B0b3~V z>rTp0>#3Ca4s|J-=04}p`{2Z--5 at aPFG;e6z-X*2%!F~MSQ(J9LAoT at XbcS%U^JBN zB~h1wjV6C#nsn;YXp~P*q5A6ohqQMJ79~ouK#zUyv2EM7ZQHhO+qP}nwr%qs>%QA> zW?n>h^hET;`>S11Uzw}2R_>j()_Co_%SGib&UVvf4p;|QN~LCpcL%>*@3#(sR8FsM zRA_3|7}T>mg}siF+mNzdCbYYkl-;BRW&$gJ{A=$Q#rjS*Gr zg?bd0vo}zhIr<7ir~_=6GxjJnC+*M)C+5O1kK+A9$#qY;5p1T5_3+B^=LJY(CxHcLKqvUs_$23daWH*ijm!gJ60WJ^*vZn zSF|#HX8nwQ-A0;zo)-x^3%HD9F;2s at a{LRp5h+_(sNVS-iEqil8qgFQ2 at MmbGok>a z-aOB1kk5oL_j(!wm%a#Cpem&~8TMLl=-#=tSC8wBv4UcrujJvgaH(aMB309^jhc-fBwf!A`Gq=gk3FnFAu*b!u zDhlQbdtSJ%RO7|etbrKQQLDzm at rN!p{+;iL{+q$!)2=QOg5&S z3>=#U0~NmRI%!;!R at Lm|*eo6WUihxLpMWyS9T8{2t8S}9MT zQ)e(AE0#qHr$HBs$!}3J4e9;T_kwQrwd|CR_i_levp$3rIUExVIP?lxCvgtTE*Y1B zkzjm3%Q~?Av$Qb2ak%8jd4EQiV2RCDXK!jwmpQ(WcYiQ zgB338r5yU8q|DxvqhkB3zJi%H)}_#4j}<0t3aL*k>I!z)D%`No@&=di zKEcDIi`cjHE&d^A{zL!O`{)#2 at r2i}xTd*tB`vN)3O-a#pouruF+{k!uXg%cL_D3X zoD)&u)L3d7iuNYvFhEYr4eaDjW<|T7$wj2)wz!IcWnmGoadS9%II%fWwxElzhbsU8 z-2mi}eb#!!uGb=nl5N=~f7AM at j_+{ovgOcSqFE5(VY@}r+I7S0(4XTLr3*4n8gCQ- zD49GVi~1uD z7QQ2QeKgD~am_T0OYEwx8#eUl*-c2~9<^RH>??lF7x9hO at Q2`q=mMf|n}pdS5^;lU z(zq|3?1+%uMu85=Fa;YqZ4zq)GXvRX*p|3eO4G2ZTfmxZmUx!Hmd$|;$qmcl74enc z;gkIj@>$-|7y6mr at fX5u-^{xk$DdqmN4AF^;s7w}v9b=CZ*hInRwt|v2Qk}g`cwOB zrsP=DF=5D-)+0{If$eou+wq(2FJFVx(cDS#5z8u5NdLq_ at B>LO&yJE3cW{KqUOF*Q z++L<2Hu#wWP4+8?DhaG^yQaEXFcFH#5|>5G^u0`?avxSPSHO`)N4ktZs%|@-VKZ;b z3>LyYF8+Ilm(|869(GM{Cv*^T{=<}oBx7ylsJ3+;IBH(R&LkbJviU*RP15>&nB>dQ z at o8LFzXJM3;qoJa{2X3j at IKvw`~v=*Ob>1K|0En3;lbc}xdi*_4Nq4alvKIW at F?7X z@%Esw7_q83qfx!vsy^~SOnr*)yfy{m4Pm|m&?dnd)_8|A|Io9Ji>a at C)+^kOtvo8I zJ|l5J^+msIcRT1vMk-heQIxQk(DQ*=?1)+RVzW{S=eTMyIwVaW<$LLx{XRWtYftVY zL6U-VAyNRo#qm#TZbW?+qIRlmGiD^i7*rWkQmqF2{*x0=%R!>!XxTYwiVr%*Wp6Qd z)>#;Wwh}84-JZd{;65LOpTm*QeEoEpv`E{=+l0avykqNyLCY zo}yJLtr4hZ*BVv^R6*vL7*cf^Nr<{BN5M8)vkBd0-nXpg(a)fZCca7bu#(|YcuaSE zCa$xr_udSSY`%ZYyw*q55F?HgJAhYF-pcZexFRYXD<7*=SGAA9+hN?Wx?!kJmM$%3 z#V$2>$l6XJc<$V{_hLaTwP7phr?0nV4&DQ&F(HQ at M4bp7)f8-nnqSWCW_9mSC|00I zDpTk-2cM*&TW;{W0PQtSpqcJ>YQK4IJbKecch0y0Pw*yp#aA&7yJmwy=1^({-htL| zx=}TP3|Vh5z;;=-r+(dn8T|yDFiiIqd#D$7IQ7r4bt617n9~LC-^SXwXGgXWDXDx+UmA=Q}(t>MxZaAYjs%WwK;iDzl=<|yvW6k!ec4bN8n59iQb}(7MA`;v8_mUE|ejmHv}| zL;RZ4&+=YN(pKxD)=99ztUVYCr8DGX%}5QKQ5FhG%)%YN-ob0B!fi|*<5q=^8?(+} z68j`MUKNiq|8AA0WI2?$vw)|`L~@XObO+ixQ=iGxH at 5u_A0!yFDF)L4JqI at R1VeW2 zVVa(*M8+kdhhY8$Ttg$`8rcnJTx4waXtg)+c*O_LA at D?HIEEap$Os_`a6*K9g1$6q zHZ5<>Aw5Wq>K~gnYC at QhTO74NiLtzbYuON%s3 at qg20!GoeJ)uUpF*hgP8VMD9gH{t zd6?(vdDs~ESW`rVL+Hh+*d9T`nRcxiMzLZ7mr-0euQgB;+Y{r_=*UmGN*{LoFW3$z zyLz=j0s#0e0suhwf5G;D!FWf@%^P_w=g;@LhA1X11PEeczi1)_<+z|S)`Vj)KfXMm zgt$1eM+;^|$VzScP6_)6MXZ$}xSRB0>hQ4a5Q(5VTEB$#Sa#jNPR;(|+;>67hMMomC)M5SZZz%JLq`*Ud`uaMdSGEV2BK*pv0*C6 zl6XyWvkG?M`T zw5HsUYeizi29Wo5{$WH&s0SznG>LZfH1T?Xw8k<;)@tctN65$q!C at 0b)x#7Fb&^9z zQY{zM+Wr*6+C+PnT7$F}>roX#T^a$BS|dJ7;p!B9j!5fk7Q)pC_nPp#Bz>0EsCM1J zmUa9Cu$6nq?Z_F8^}w3zMbbmo)oz_(S4d3sZ?J3l2Bl#fL~B6? z;I8$aEFD)%#t zC-J%n{t_Hs*EQM$z~DCO+;})0{c^qB1Fk$6CecB7CH}ZffPW$D8&5$zqF{WcPl0_i zU7tbT7+O9 at wF0F3$G2p&m9Cr8*=cX=>`UpYjL+8P)|J)=X4WPbCju&qSJ04((7=AY zUPa;9fxf at 3Z{H!TT1y3Rq~wz&JR_I45MZ3BwG)(*W!9_LFOSNv+X<5_q=!p@(1{`#Mi%T~ z*4>AzqU|j>-5xjgs%|vRF72-NiabM8>I+xFfd=ZsG$IiPy=ULVQ^w4zEo0ukqcNR)hTvP5I~ioW z)`8#qkFhyKgc09WY^UqEdHtlbYD{f7Un>TNwEr;UP%~kd at MGgZ62Xwtzl$UhU4lSc zQ*K?GM^vFNUZgWBMaZ^Q;uK91nwVjV?s1S5b at f=6h_!#uwRv-x5a{U>BZ`irFGH4e zWivaFd?uM*N at 8YAUgC`v6gJg}Qt=nVPKH;yPo#mt7qm_cgxk#O=F}Rd=~g`%R>d4C z=*!fnc4wLm5`baJcs?$+7mUuznjImGU=<)T>d?)|I|D&LC)x9_$9vjzkSjdP7-!M} zVVv at 0CfFbRf#d4|d5P(CFjapB5eyP=K|dHCd6fOk{+M6zcdL|W@?4D0hQ5J3GjCmN z at VJ>f=BbcmN9p2w^)tGXO3Ek&Co<^u|M}suEs#QQmxUZ5xH&J<^SvV;r0BAJF-Wo7 z$BH?uprbG|%w`oE{atp)@I_l-G;{A&%eRT4h4PZj$t2YynrqHEXd>|;MS2;R+D}Gm zlvn&jdNPirxP+fmw-zZAAoOdcaB0BMS`4>Rvo4s&y5!~U`?E!=#)o{s*8 at s;2?{=`LL;wr$`r_!!LB%KFp at I`DY!$n8NQW^ zd974KMfAj%^<7|i#K6VjAQvUly+ at Lq8Jz)$aEgh3o*!`W?g5woUZ?U<6br*dc}Vt< zsT*udc^1wF8NN32iFlG%Q+qpg-1{OIy at U#C=%BC%Up!E~F(pno1BE4GG#2MMD=0G2 zfgi4tY?lh6G(W{koIp%3&zL2aVo1+NWR2`ffQ=GD6g`)0a59ioM9YUpuJJw5V}L|2h{WW2h84#1&BNgIc9=pg8wTyH~E4OL)Nd2nl=yo8!aJbl at 5vCACFc&SWb<)b#uPY$c={0b$w}7^R zPMMwZ%Ip1#>34Z<+!FAzHz2xyLc?Aw=+R~GYlZ6(Yw^}saPS+Q4)UVidxNcRZkRJIq# z&HHv?yE=59Z$}jmk%H$5QcdKgCTl8R*s2&ZU#{A+P?i@>f)opDLnX;xLq}+{ z_4cx9Tmsc(F`s~fSo*F+NsZPq7mw>I`3PVdUCK;w z70z-YuBQC7q^qZL;zl`xs*rNa`!%1|- z;vg`Q?1V=G$|f)bG}b5;Q%W%aj35E0V)yYdYy&e%nSFr|eAI^s7;%TsjMza)$}TeB zHN(Zh>J!24d|lrBqi}~|#_q_tW@$)CgiV%;MQTjGZ1~lZK9bi(ln8v(M`HIy(W7JQ zOEHYuVQ6F|{g|gdb419RmM*I2=m+G7VJBHxk;W#h8ps#sp(6YkKvl!rEq+WlJyw0Z5ks1HbtzKD1653=_Y_jUJ3lzWQR zX(nIDxJd_I_dc4#M%I@?1R^KE8V^Im?a&4ek|+d%trma_mSras32_mn4%=aFN)7Se zxeCGT=c26MO2b~p-DtXL2e9r+qo4P_2zc=i?7ZYdTKBEtWX502zM{in#@^_72 at eXP zZzf2j>=?TNdkT>*>f|QgFnm%QeD8vR^mMG^S|w{@-amk?V%4^=s0xfqK}3|F#)ad` z*~qYqdeakuL790IZyaCTUEHzq+Q-ny34F2h)FtHD)Q5Vw}iq*^yR*lbSB}Wi*Eu8aY(OVbb8If1u+07&fnVlxjxMgF^83l z#$;Tvh??<-BA{!mAvORD(UIf3 at eN-Ca=OzsViUU3?o$;45*8b^5pAMij at f2Cm7cMS z-50puI|GJhWwBeObIq;wN(kTNzyx*6+ylO$~IUg z-3C2bVZsambuQB8X}%~)q3l>p!Q4JB`O7^JfS+^bu&oB+t-EHz`5QpY^Ca2SS|De6 z<3K!t&|6`bJ}1WoTyaC7lnwYqZfcWqZgJ#r+fZYJp!oBJ;7flaNbM06-PIF3Asl)l z*OFyMUjek#FFc}4+trfefi`pzjyjO;0JKP!W9XYZR_nNzXb-wYkebSIUQ_pp zRL2SG3I{b>DGJKf&}9JIFruHjwXDm0nh5T4QJV_(vaTKdxMlgcE$aPzr;E7&w%0Cu z!^d-gkv#{>#(%&F9YK*^b4cG|`o+O>{NyzGz&ve3Q>X0;=BOiY0gPkjk7YK<(_!5|RLL5z|Wgl-jdO_WEv#}oy(q2ivLyEJPm z)*u&FXgd{tXinDu;0)&Ojoa+CefHKBr$HM`RYWk^J$-*BKBR3ByL%>BzLr3+mKMls z5q^?zM{W~-l4W>uWn at v5A($DkuOGCV3J~}AwR?8UzJonb9;f->5hQRN8Alfq7%r_0 z%}&r`#w#+tIQ4Dy!GqRgrkg(L&p_aq01~bNG%k}sFr8u+N?Z^rce?s!IUR<(cLvB8 zl(&kUwJ%TA+{r<;l*YP}tl at 0i1RD+B_7W6-rmA_MIqd`2$oou8Q1~;C$L~M!N}O z+XKipD(Swe(a{TeG&|hfm2K}Bs)~qQ zfC+*94lG8k7ozYg+kTcqg3I{%XX*hfoqa0ZCAA&Fmjomx)-drt#l|yY zyUt#y^_ms^+_R37{|Q#&@l|3y8BKp<#F5m!4NpJw#Ut#+Bh6xuv=Lpu-X+zT8zd=e zYz%kxX+H`|QT at 39d`J?0yCW*JUKj~aZDcHix~4CfB!X;9G+ at mh3Q96sYL1l#E0kKI zuF6q;wq*3BlW-q;svt%3!>48WvWu3Wwm>?hEdf?!2!}l7bO<8>T4gY|I?Z$tiy-eZ zBxq=_iSfGHeqH!3CgUyD{hD@}C{Z}pf!)3x&8oi79>d2^?8gtT{~7>n=V{&M_94($ zP$&>>>FUMu>X<_LasfF!c0D;fJ32JgTt5_`Y>ktZJ2C{QZRj{>+r@;;IWmN)yEe#- zBW2LkTMw at 4?!YkcspzzVF&keqtO^MI-l-EuTnfuMSF)uwyX4AKJscgSvj>>vhbhD&?A?ZhLsE@{S0$67a14k|7}f={$bk3_iEw)2 z>$slDP;OIz-g^qOOwgRjrWd80RZ|@HN?=m=;UXBopV0He%}g)ni{O~SW#HiIU at tIahhGKur65KcFMdoMBXf)X%(}fG6iskFXWD!3bBXZ_CqT2 z-9~!O1 at x`_0q7BOzl;;%o?6d{!XV^)| z at eS|=#K^AO*u}_pT;A;?nY`=2W4;qog<#-%LfW{YnVMD9wQ#9Ha11dq!wYhmatuL% zdEl7mg~Ay#Fg2;=_jhy64)$K{3~DoNP_=YCs=xx}e!qo2Nhz9lvCQ#L|NtzKRG1_ zopA2;M at NeQR@_n{t7uvSpaIqj401G6n8|ikIS6*puEV+rZjTr8OZ4EbS$<5-f_dY2 z)xIEG8QTux1n!5`S&A^;1%U$cO9CGo5d^N zzi52ucr&uD{au*?{-{?ZNB+-o_Z?UVDB?cSQhU78xvzO;QTll;`>SO!e-jk3$9vbQ>g=T|i?0$R$-ZX2~ zLD|}|wN7OXqtR#`+2VqJw}ormG%|#I%%v^LP0!j$5Otd>h4!`d+2SfE*Pzc|iS~ZC zLg?Q_%Ovoc6t;_S6*A^UNu8*jW7!8U>R$iy$G=mD2a3YqKwSX+r~0}7X3suFQAX}> zqGE1c1Y;eB-f5?xnX#r7SJk3jU zJeFQhTki1c>;Qf>7!lYN=ogH~pU4IBMU6=rphuQC7M;OhZ#gAf?Kyh|W- z^)VT~;}i)op>ilPRkzBOUU2F;C8cgMHx9Jeb!m3x;h1)iBOfV9uSc2G7onzlBKl$T3xc&~jIy zYm=tSOgl{p#AqW>Uul?vGYoILLd=Yz8Kn()&>}WN#6(DGq~!(cdU1ZOZQnX?UrgNF zy1DmdId_L$-6$s792(hP_nRP|7V1 at Rzz}9JUfWQRY4eEvvNZ_nb__xK!`lSs+4Sqc zQ_i^ur5qfqdA+<3?dw3s{QH+w`?lg9S`88eN^)FfFtBn-m4q5fZ>+F9XxN}%0a#|1 zXRuL)%R)9l-akk9>|U|r{qHL3ZACHwN)cmx!Ui4Ulr=B~CjY&!@Y z2SKeO?fG at j_a>ISmM|rnoJdsS@$Y8lx1UwZjp*Z8EjHA`g1)zD>%aWj7UtLYe}NSR z5{h28YyJiK$-t at s*OvrYy0bmVIu|^Fv;QwDUjATojPZX1X$cAd!2f@!zZSM;|JKZ? zMR`gVhyl4rMIS`(Z8fA;JD*f`n-K|72w#$(6o`v$XgzvFR!UOp4U}(0&;9`XO<{Ca zA0S5o-kCu{&hC!mb$j>XYU?*NK=wc`pca at lR(%luih at j@I7p0k%ZW3Nl7yg48j~7i zKn8QvuM*iL!>jU3$Gs=^SMpVG at 4Tk*1Ii2W>A)isl9YbbK<60uX-EJdleOPID3|ne z-L|duR5gR>CSAI1P)ZZ8ObE)3M3roj4H_^y-xwJ_*vM{JQ)o6z$tSyi)_>0xcIq at W zbI7Qt@$EZFA{>j-wTx4&R0cE6 at NNHcch)Rjc5>hfcZFFOxo7v43=MvnARbZ*Ki_;*IgMXS^?M(iG7)RM*KGZnO07)OTPH ze#olK!%?E>IGW18ncxnLbH+u0Q{KyWqV4g`+ at A0S6R-{pBdX006lDvyyJ;N`DLde;0N&4JTw3 z9t_SX$N&f+qH-7{{lG5xA_GKYL-f>OapmRNX&Li#=P_OXcB|0qmIYxDoiYJ}fo-?k`j)}TIUr$W_z;A?MIOS*cIEi5zxTnb3 zQ-X5 at F~7U}`hy0Bys=`~k~p7L`?L~`jK>@&hfusea9 z&)nT}!_eH_6$YlDbP>)Si)*Y#lbdmN80FMNL59=$y*3ze)R=ZCX6}tK590hCFP&R7 zD|iLhC at 1`rsqpw*4ZWQc%cT*3YzR!8gCQYFVbrFIj*b8cNaB0P+ktkD&RU{0C+4R+ z79TQxH=g1aZXtbSS9Ijcpd}_LNhhRPIS!D(f_fTJC!JYeC9)cccP3#h%k1C~rVi#( z1SoG*BKe)Q+fG)p at e$of^o|qOU}97!Y&63~P`qZ}&NDZduYxQ`T1a+To5vDGc<#B+ zWYW!OtY#BPHD|X?C!Sq`)y!m?Z7n)W4Kc-9S+Tr^k9qEmvKKFvnrcKrS3QE+!8pcu zGYGfq)b_Azd#x_na5%^|ndB(bDZeO_^B!|fk=^GgEyiaqIiEQ|tykMxjs{nCT<>#S zBq~80d1;0a+E|u~(2mE{g7quhQ*vb8ekN?Fo6o30#5M)F`3 at ffMMbn!oC$esiSN94|EkBYZsb*x>kzt4cYS9y8E$s;|rQ-J2e_EdX)uHCMZ zJycAkd!*g&2nWUOkTzh4Wd?r$@K7mP#XFP=iWjZ at EHo4FVMiVl!a6R)R&io|H<0RzVX8?P z-N0`@SKy}E&1S3uEQUa*Jldgxu* zSc1k-k4oZ7+ at SoILx{@H75kMYpoI+`biu{Iz9ZR9*vyA;G2O-unt9jGw&7OGX)E`= zpHLK_XRg~kRfRtEV|xnjdd^q4A=-yM*KPPqmxW&V&Fg$G`qt}`ubp*Y9B(DgCfwU6 z at RP##f at VovWv=XP$qM~U;Hk3%#-W!cu>)QVM&29N?JLF?v^zi$GvB%}#vwQ^+`$37 zZRRP+3|6F+xV8xAv(4caL^JT$YyX|`6`uJ}9`9S}z9+qDNp}9nQ)t0*S^@iZ(G;=)x&rYr; zm=nx*icg&;3Bmx at 1mU>xVdEDO#?Sk3y!FuOUini6y(46cEeWy|dS#l)zl17d7$NDW*=P9k7Ogix z-H922`duT8*Asg_RxvRgv;_Yxd|Zn#hzi&$uc?n0$3fXOt56jV>8md!_ASixXOB@{ zx-_-^c~{x)l9CnW)2}%G`a5BBp_OF&aeYnTTuCp%xU$ryr(w1s$(|rrRFyl(RY9n& z+^8u&Ikkx#0_SrWRIjQFm?L2XxS+{nq?POo#Vv!F0QDX at m(&WY06qMRVIDcs>`UI6 zbV$A$j2HvgD*fRM^Vd75%p9lgpup4jznGW}2g~o${bh!6F#jpl{^u{>e}D8;bexur zk$o3;ShwOesc#+^Qh^>DYywKg!xj|>6q{R6i%Xy&GEIkA<7F&)^K%@Wmmg-S?&SUa zIkm^5seiFU#j5=P{)svIO?qM5*~LF4vRmi0d&Yg%eU|<8dvAyj0LDOLz*IY#p)4N~ zO)FvKlaW_`9@~bNqCJ{Q at TCB~Hu4}7ofmOvOi)g#oQ+Pklbwp3-d;yk!5Y;#ozZr@ zonk04K3AjF1 at bc32J1Gx#3T3MVHsL3PVPdMLeDw7(B!y-n!}a%UM9*)3r>5j{`>2~ zW6q6bhY#y5!0H;+eh5+1Y`U-}0tu3cE|igxi;Y{doYiPzzT$3Osq{<=T@!fQ{Sk^m zQ&f8ENsOe}@!QGSZki%q{WIADYe~Rj*WRqfBZ>@1DYjO_Dbp&_$29D71Wc4yw!!X?dgCea~b_SdVJqf}GWyVGwr7#$G77YbJ( zAn~Lp>iojs-ZOj&`O!3IBL$GYa{2NwE5{if)WzDwR&ImO&?~U0pW$cd0Glk=gj at Ml(^?2qmOIjfW8NblYqGWWHD~>P8YH6?#rAf%q)(g|g8GAW=A;2Uner4||BcOgjrz zcvFKQ^Op8dH1+PB$iUPiV%i%*xQBA5QnSPvkC_!oup#@+RvbO(JZV9<@b=_2%CPr~ z{zk(ON(~iU^}$r)o(<5o4xCF!qne+|R9)uf#Qd1)oN_n)<{xud6!@N809_s6$!MhZ zPKQ-wVb+ at 3q@cn0$eeYOgL7yXT$G*jgm^u(JcWfY97a?XZy>c10B#0s6$k9P3U?hC zvf+KBv`7U85cU#7Y%`N>MF%XYrxF2a73m}FE)^B#+s z)f^~S%#jf#n$Id?0(Qs>+U_t&ghGN%@0he=%xz|yO}P&5QnIe|kWE-O+QCKnkQeON z at rkc%;rhEzG2VaI3J8HR)e at -a(LZG^#nMrV4epAHX!|AaPUtppW-M~kTxX}Ii zEwet$!xU;2Vm7T7TW4QJ^cNC5_W+CiM9ey#{>wha9oDCfC%ngA$Yu3eM&OIsa!!A% zLwAVH8=9AUp(y-%lux!(mFx$Hl=O^%Aw-axhgN{sMdKrbVsN%M~)!vdmiH{#&! zJ_d at Bdc$TMa6vaLctTmTWhD)(OSoQWA_4YjRl}W_Adr|5kXbtt8)G0phGdNm*@0r| zY>D)sEObK{rE09g>|xZArjg0e4kp!4X0>=>A{J3)OZb$PFn7QK`UC43>1+>z;g*}Z z?9PcM?NP}sS3LNnxt!XJbrHcn6Y2aJ$Tv{dJxS6HRqx|k!G$%5sz1TA)xsoMBaCP{OJ_cRhbq5lL>Ah#AK$PUE*yeWx#|IOq z1DgS#Rzsc%M~{qE&2px`JmIH;cvHi-xK*R#(w%-}6ZPWZPCTxb8+N3fp=U?@uHCtN zw2X-}sl+c{fi)asFubCxx!g at P-|-LMVYHu|PcmyXzl6a($ioh(2khA+9!;CERgedA z`;K&XN>Xn?rUP!N<#Gg;g_4@}$A1}ZG?6WtTLuCExB&f6_5J>tEuZO8`EBP#?C*?BthsyL@;*H zWAG!Z1huWiupuEOFpSXS^nsEP6&VN7VTov-lHu2e+6kUyFxu#84qAh`U<}GEH8wjZ zFg&5MHd|8}S*p at CE4`S4_vbovU2MV(*2R={hNLfAOVn_}v}`H$z~S3%M(bhNrs#3( zQg7%UB2+@(NWxrH8d|3AM1iI!H)u&h^+3-`)UpbdI2N>$gXo~}Eelb>iW;EKJ)8~Cff>|k)K1dU0OZUX*BuNB z8h4*=@Z+aVF7)L8vh*xd+XW+3W((!A>D)I=ulQ#?!nEjuvrbub at q&4VA(y?mq*RA` z at uV24xC7lsFNvvlMn?1d`0i-mfOM at 0v{yt at VlzcqH0nQ0h-;$_=I;DHxq%d=ES- zGnpm<1xMNE)g9NF^WB}__Y<_g!?vXW*Qks00SOM>QT7LST`07J_Ob(H-7rG| zK~)iGQjI$b2TPV>)7tWVXXq4Xse{NEj46vY%6YGbi;mMu0u!D at 6{h=7pv5Q9X!ez) z-zEbUiUvYByRO8(@K5V|K}H2wYf?dxaaW0SuIh(I0BYZ_;gg(C)ZOyQO63QUuH#IB zl{6qK at S`M;DJnC`Ts24I(51$+)xy*>O_jYg+xQBEW*#;>wZMWQb2BGyGFqWHYN&86 zpqZprD{u};abjqo1&caypc{{^l;10ll}~BNk^E}AP10rhAFUs?Ttx$!G8{*8Q?bm1 zrU@{##FmmcNfny~**j&ufCImqBF((Xva06|;JY|^P_Lf+0HB$nS z0e70IH7a0YVqzd+h!e$BICw2Mo`Wx=bXVGrt8q&2Ais;C2KeD}8SD|un7a-1f7xNW zqxOJ(F!aN6DT3W)rU!GRfU$Fpb;T|)fE}~!8v#IT#3e`>%Ie|a- zDFpLEIQ1(>uwJPipAMvxXf&rX6=tqxv8b8z8sK&!v$ycWT6H(U;+YUdvzrXaqMUbv zP)}r&X`*5};Tjk_P&smYiY=SHmBkLg`WRFT{gh%%XPbK5PaWwugLag<>w6}_L%ZF{ zh$F>h!&_MLR^58f2SUh}$C=VdyHtXBa at ZBNOS06MHF|2u;mAE*Q~3b3F}ozlRMZOp z3OA1wvS!+5MF$e$Fy+VU{>2D+3bqN?P z^LRM|@&~ei?__>8JvI at q9wg?*8)nM*gI29qO!n at Go3~%2`jO5krfvN+@>yPlQdzCM zO1=s0-mtvdA0$!uwx3!JmcB($r=@e$4n1OCHYD at 0pxDb?*3Pc9P+Bh&>TqpwizrUz z3t6D$ip|)<4*-tV`4_I? z at BUN<#Hrw?(RrDwrK+FaIH7;l-o}VPsAvQR06_SAi|7B;82y_Qxt7#FPM9L-qj at rP z+5(nVibWDF1(}&a#Upepn*7Wq5;Bv`tpypeOq@;}uH!9ZIJj;tKT5LSB%D9_eP?lw z-mV?+`NR6yVHhtvJ7%vwe4o8t_V;UdegJO}&oH_}Wf;cy84+0+-mzMjRmGx{q?Dw+ z@}?`pX{4*t+o<9y+IumTKx{RgNX=0-_~sss;!QYjBkYbmo4rV31y4nWJ2#?>ZEidr z2x1Q8Q|~x{MX1ar{qLPuQ=blAYN4;k&*Wu z`OxJcYu71~-8*daOj(0FoR7n*>1>BIv^{nnBDOz~zo?wDexKQ{nSfaJ;t6-QyOT>9 z8P>;vjBGJBPHAKhU1?MsDeOP;skKDJP~RS2QL{FrjF5B_$)|Tuf~JyHJD|)m>fI{w zYLMPSdcXFas^`Da{idSlDn$jYm33wSnQdOqay~GR8`UMhDednto-y!y+qjIW1YhTw zCVy>Q=F)tpBQw?x_>egjIfiQvo2dNg`(;c{1Uu^p}prS68oJl3TQW< zc~wClq`|L+_CV^Ejg{$D#rMj3c4{GKFhH;T{QP;h*cmPIq447;`*jBOneM6a2X>UV z6q at Q&{96OhvRth}j_d|TdS~{?8u7ua+5c0STOVXE{+U1}4*iZ*1(tfhft12tC9;V_ z+km*K*-3k0qH3_?9*#OhPLj~WAVzPkWj za8z$2?ww7p1 at 8!{=1>k}tFRVpK=Ko6E#_(O zpNj!6$;&Y1Uy9xi_O}rHX9tpYj&25y#{W)yTgk%4{_o;{ec*qN*{rOP1dw@>tea#y zTN_#*Y&2t7BnCtfM38`46cGfG6 at h%=Gps{rmS?Ott|@=0K=s}PzOLgC?`}<@EvQ$Q z8|hyeoaQ*Txw!cJd_I5eqp~{9D at +@}UUAl%CJeM-(~#h-xmeRrzlIQ5-$I9S(M;iF zwq9+<(of)YPQrL!#Mf2#{|o-)!mAGF=Oom-+{aeFMO`W$yZ at CMu^mmNWGbcjIReOM0gbhY) zo%`E+7C|2%Fq?BStg^gG`}bWBJ$;;Yd$y6gN1uC*Tso1Z?D(#hV43K$Oo3 at ewyq{QI{b7y!+*Pxpj!QasxLG^HPKv)Ah zUv~D&2v^;~QwcqRObM>2F%}wAKVbhdL1NM6i2N6-fPbMX`2Q2C|ITvSD<#^r2n5o<2^96GE_e9XprW+iLL3AwNY_~W{joD(ggt^k;*oGZeE#GtE ziJ!b1S0F~dLqZj6K!urgDhaj)_hv>U3e{Gk#ArchZ1Id6unYqxq;V at oq&qawJGV)i zuHS^@!F_5^HRS`VIj0ji0eWM zdJ&wQxzQ~Wd3+Cm2%aNC^j5B#Bj6|+7F7F)EF-f1N*XWDM8tzx^b^bqJ;VQT2WiaCbny4CScst}j!_B at rki3ZIkb5RFD(o|B%{eLaCBdT`&^L(mnz zFEhP+VD at dix_`AtO}A{o8r?+FTGY;(TyQ(grC1X{AOSa1aJ9!pL(h!TW(o}>vvaR4 zwkTVRLe}KDb*X1P*O>^^1@*LQL|#faKbyaWteMWw+UxI?j~}4;I7O at vU3zj+1WIiX zyvhI`r_|Rl-4D(tvWB!mUbr56v=gT at Vr1G0uQmUhWCMeMNpBNNNGSfO0b)?}L>|1_h&#Bf|Q z_%EtpjOM-2|G=CeC;))m{}FTlOHuqM04izOAqpV>fVJ)juAy2DNY(U+Q|TXy;?WQ= zun at -tvo7Yt_5LNJ8J*M2Q?;XhB at u0J`ra>M7<0Ekkn{T_J{e4BSx&uo(;Q6yRSF3x zHPYLYMo?R2u8r%%cc^LHWRPX98K_-C$h2`GLT5%X{DyAm<8yD!Pl9{tl=at!@SjEi zg-S_uMu@@;+;pvIHD}eVr|PMhe~El$B|<$1c*EPv zy^WO^(-z^`w01TS|3qXB%)w=jOcjWaq6W>$wXw}B0Jh9x&T zpQT{`6}A8wQ6tYTqYpDFIhfa at m;V7n#MeO8&_01tH}O#``62j<5{(dCTrd3_Mk`NF zi($+^0 at pKy6jGxeeyCHFM8HuUGnX#zp;iS#&amt=*g at Pa{}yTFt^Uvm&=Xl)Mf#00 zC0CF*Ao$Vjl4@?dAW3R{Ml-#{_fw`76|IgqFw^5`y^U`HX4kgun#CROf-Zl*md*^z$?J1iMrl&KD(- z!+ecH`p)%3`hORgxUu_ at I*(4-v)SG5{gl=Dw0WNU*XBjdAsKKcTB`7UDO{M;5G|zR za>kipPkLjuksr~~(X at kOHA>|_c+GhXSW8VbkFrj@;LR29QirqUR4SJ|Vu%viXb1Jo zp(ql?AS at T?m6ZMa>z=J^o%*u*F8YebzV$D&HI{LOKEnqlzKs(`9|hWJ%$sh|XY$I~ z4Y$naSf?NAbewQ*IxSp;n3N4Q#*Z#RoS*scnm$ElxPru_wvA8zkYPNCFxgXlt8&e; zRYlxjn at Cl^n!F!ggL at CJ(cH#`9B$-W|90>{y`ZjyB55=vxy8hgGIu z%eahR5EVL;l}?M8&mOZoRw#B=iCM~mJv at B-C2~}QZ_!qyT$yX#=agH^NxUjU zg`5~bC_7tDPI=A4rLgP>g1`gv_PJlxHV16c3foGJa8anqLp;Az86pE at G;*0jRj<+v zF}ru!0WXzz3b{`TaoH{1Tv1(%Swx}jHN`drj$0_ubbq3PwA|prR1*0ws>p!Fyb~%I zDb}nWh|}L_)zQm6iwbpDhry0PHbV#{jFRfr6uac17I^$9Siq!Gk`f6#sIYtVo<&AL zU#Y}I+6UzXP%$}#xC1NfiKG1El6-W8NZY>AbDvatUGftA(-J_ruoW6$@6e>n0X_3h z;Kc_p(kRZiyi+~$Q_c8HmR`SfF{YpfTiK^#au`cL-Vx0hahkk;o=Ac55=iPuWg+t( z+)>0A!V&~Y^k_4hww at B1p4yt8epyxzm#&9L_BXqn0sfC zb1Om0FMJDkMOt}>n0=EytU!JHTbV0J=p^))$Kxp2zuW&)F?DhIyF|!VvHc at f5&hU} z<#=u7Y^s*iuy+z+aw3V-5uvOEhSg;`%XZjL67Aa0Q>OK+zs3<>sq%Iat|cNG(~1t) zVb~x!SXx=`cxR at ZdcWSE!FQ>wJU8hA_w5G_)b)69Z^BPDIr+0Gpu at Ik zgYpaBOKT@#n{aK|Z9E^odzs?az$0ce)=lB;E6LJ7&_z1bpD?AfXHNn~o12PNz_A)B zBmgt$Se1!j?@o-MzU_5~_mY^QOY6VH76q715Ihl~dB)3Gn~}k$bxF*vD+!2A4;4L} zNF$EXBWS&opsH} zVay(-_GhY$Jlr2Ya*Wk3KF2IBGY=~ww;1PpRufa3vUE?3CkL+&{cHRC#dMt%jFs%p$`GGUxiyb( z*tj`I- at C)iJJY$+Cb^P>YxbMo77s~rk>@*>%?x;g*_j@)6T~FEc!6ArMQdcJ%HG(h z_Nz^#A-CT;+Qm4b{919y_SvS^kBhJjS>WQn8(K>mvi}tFfo&}vN=h&rDyQ0mxE$(v z#rRj42~kn+!u<)(B=A5$T>su_ii^FirLm~J>mR5IIXM}6{`0I>%LZo!jgKUj6P2xj zN;}Gy&JCR`Su`^yWysN{eGYj;^{6Q>p)zyI$*fG4ZuxCayOZhel!5e+ zQFJC*ZlbqZNz^gpi09u6!IyH8du%>6xq;0t&t2nN#4KQ)Ca>8jCY_k1AL~Qgu+NQn z_L(IzD?#qO?NhSr8B!p(_~JR!9U=thwOKjK2*$8(*Pm-_p(P&A%|{Pl4Re-ZWo6AW z+eEUmw4h$rib^jJFM72^qgwTg>9R;QolBpfmS9 at ZSG6oqusf^i9?~nc(CcC(^O9r5 zbG%c at hfC2O^XsQxbM;KVz4=thT9tuylP66H={j04|6O3q$I_zC=fIUXgF+duE5e(e z02me)nZ~|zn`^Z&Il5!zri3@@;W$deZOzN4TQcC8EI2}EW}|X0;R&lI6KAb7oTPgz zL at P~il~J|Ur{(JLb$QGp?xs^yaqW_ob7|UVQ1!uHTYlG1am6=&+DgV8Ns{66?muy* z#d#)ONj~`v)%_c(;Zpm1P3Jj|N9<)umo$|*fy1GZ>!y>QTO`*OZf#o+i at o{Qo%~vY z+{%NGO#QsWmo0rkb3r^-v#)h+1f-+X;I6+CrBNdDTo@$4XJW{dmmyIhb2Va%9DmSU z)(1V8<%W}=0hB1G50+fqad-$=Hvz|6T;v2Vc5(>gS`4elWS=n>^SL1c!*P5_2ILj< zG2H{pfazKd#Q^1I1^gbzLu_!ivyA646%GI4;7^?SnQX=Lb6DHgz9OnoVsLP!&Ue_a z$|7Y_g7 at pYhT~nOs%F-L^>-_I#Simrp at f+F|Dn at Q!~gAbGnaM?2QA*W+zB><|t zhpRIm85 at 3JVe(qoB=h=WHco4~kPb^-J;qlQnn1lR8y@ z-zT({jJ$09RRysdo?LD9ouirBjaMtvC`|Fe*!vjs`!EBu&q!CX8z4 zK|SZh!*>|Jhx$d`NgIMtODxmpH%|r^>1~_=({^+j<2)KQu{#(^T}QgP^DdCp8o?OE zJ}BU5puCg}Oz6!VxB?3ujF5J64z}o%GEYl2L|YU)C?|jKivR zTPUxDZ*F={)lR|2S+)Tip6 at gZYHT8y*Cq(AyDowDpGiPx{Eo!J{Gam}82VV~CTAAajf_z4LKfp`SWn zpF|NK;mLloYYLLPrA1$NUp&724Zt4+b%kT?(*V_arJ1YWR&9|M%r~!aO*yhQXY(^Z z=}0^|vpMyKOEShjn}+68Xx^yT&Ad8l3dpiK2e+u#4HPKmv&dSaZjYeewipHw-5ZDl z44A_Wm<)PH#NR{p-do!UdW{u(%?n>af8WP-5&93jQB at k0LrNNe#0O?U2QoVVB-9l7 zY{*B;803C&W at -e%oOxQwDEbDexk!E+4BAq25r2HDqo9C<#Oyn!ZlMhIZ*RFo{ghtl z&4>0kf9Q^Jdk?y8mAcC%Di&3&6fS3&awd at 9rBb#MZuKI=W|S+J9|xQe^o at VtOv!^T zma?Py>I_}VoYnJ=1BnIY+ax+U-f&vP%t04RGRxD8D%7zSC+H2*mKm#eMjLe*W0H$4 zMIC)pcZ|N}30lAvD0BF^DlYghRLDw z_(_N%yKx^0kaBfQ6Iyq9uQxZWUAM{od}QMAnQ?S)^ESceonh>n zq0?XB6UJB?<}cIJbQ-K(mW$gf)aGA|yVtxdvC}Gu_W2Sf?mG1Dp#dXRu=g=a|0QIe zZe_onDg|teVs!bI_*Vx z!&hVDri^t`8n+fE$yl>@*V|?0$`#!kMD-ys{24Eo7uNR5*J|`eFDOmcaU9*NmzO3m zK^%K!zAa*$)y_~l-O|tutEFb&(|GI)fjqUF>Diicdaf`Rq|hH^mNG)x(kIbET++q~iMcI^5%H0+A-pl1w#=z+Ws>B2t>X(*@+k2O2?V zD7hp(urwh(5S$2|a0#j%$yNNPi9((Wd8k}MrYILFMAoo;*4`)AJ=|#P={FOj(#Rj{ zSPO0yfrsbc#}666l_vfFHsoKvN!Xq9r_2#V00I*FU-IMsN{eCjEvE%_#BJkAH=|1O zS=QuFM8a84`93nmA4U{ZV43k9`TgX@@yaG|i%4V2;;D((P`=4O?+d!A4)pJVUlp at 2 z at yBCrr0S_mx$$e&CEo6Qy&tRYS9bj0p at B34DE3Hwl7gXErTeKo1Pg={^o zJw*3;kmICyiRwl6y^$4Au0=p{$OH`$8Ol1Wsu{!0j$5!Kt;K^_IF;00dn{Y6Hmj)F z;56h at VmbZi*x(AwZ*VKJ zyR~=^T{oDgU^t$ZxMx@}tsP=G&|pc-n4OPKCVKYop1kEKAtSBS+Sim_hn3;7`(@2Y zRy!+No<$Bba=oVr4fnDQbpWdnPIZpi{r89x5aauX*;h&hZXi~G5jEc(kA8bg?Ec5L zTC5)AA7N?NRqG)6PAl&xyX~6OK>1+q`o~sK;#mYhy+eylr3ry4+)Fj++kwS;_YO_alob*K(QwLjH=je5J=$b0DE z6ffGkAow5)I=}fiAWQnr9VB6I`gT3>?O at uikiaUafA6b-EKpk6R>RG<(h&F5sAq32 zZOP5u$N`LF`I1k;bxH03XjG3puamiFI52DtRA&XcaCH+5;|@k){g-S!-1ItFjI@{p zW|9y&XXb`mwb)>Jtv0afco;yg^yrqg%<(iBzFi*^0z;x)AgFYZgKhCmvuX=$C9sk` z_&8?eiQ0rpk7;&p#sTwt+xSL{+1&5>lPEgM4yWI%>klM?VF?p#8PJ at 59zfKgw#%MU z#Vez0vl`cEPAPkO>B)Pb&x)aOyT(}b17ygs%(?-%5n@>UK{(7l@SO5}uW9u8iI9P)P#zdD!Immb!~%CA zm;;eUw18h>T>!LI;^6>P38s(k;j#vof~tWA5Jq&7nkR(R#F3i9Jg^J!3iv~npvT!TCS7$$3olwuTwD2)f{Q_or&cs{ za`5FkI5DR~cA*YFp*8}LQoSTh$_0cI`{%f%U_uqX;ktno?y5S?i~+@>qM$wOd!Qrs zmrLQVI5f3;EJJ7u$36o&c70;bqtmQ5gMp70!P?f1Zr?nmVx+WI0*{>jpdh=*5wi5*|2M-095Lj!?|;Mr#h)Tv_J1|b at ZZ2TgQ>m$nHd$!}H18`IK_>vkB%Xzcboi=HjaO) z-t)=&0OSb88GL{UCOph^2#v%dbythbe`b9=@(4KpJbxlE=mnpofq8Ws_!cp$TJg!KO8&})cR=MC$`*-Z1= zVIm(41z`4l<5!k`o}@%(v`wmQ`C(HP-_gpspHNB|9>T)R zL9H{eOc9U>N-Mbpeyj5aXygJT=(Ct~g3HIKq__^dW&sF3M{nsgqfpH{&cu31CX@;8 zhH|-$JlZPs?I!q4n+OZ at nl;FW_8ftPu z)B7^Ny{04EPdLde?kChSG*55`IQVjPD&Vn;to^bAkBu$t*tbw%`vQxa$a_;B+F-uR4 at Q5ye zk?$em8_C`Ks><>1wGKXbBsI at j5_64wLJxuV0?_4?SdIC at l%j&ir?zx6nnYR#8$DYd2T* z!8|8v3X=*J7I_IJ&~&HUQJA{$SU*DEAaz~O4~@=(8Ql*+Ugt-fw-k$)NhiQ^tg)E? z^m)t9hNn!#a*dBrK-X7Ghl03$1+m4#|M&lnr7osbQk$h(|H__Eqn5 zw+s at JQSOm&6`r`b!TZ|zGkuwNF^guxv0Jd>l?2Joiw$L=POd1PJz=hZpd@l at QYPIjirUHR6(Y`D!h at Ynw~SeA zZJHOk0+OFC=9XOdB|U}xwu-$0-Z zvzU`%1YlgG7uoEnTf!v8UyBG4Y<~+S~YuZoN1Y%!mKp; z&cp_O_s(x;;C at e`7*Ou9d&6rydZSB2$y>PT-s#(zw!_qP<8(S?^_WFrpNZv5!(7DM z$+s{&8#rJnkWYeqQ&$<`(0H<)}ln0D4jx5?A07KPj!#ondGQ$sc=;& zVS;y&&d4|M%E)8#f5b7R!lJ>jsHKjo8A=}BLb?d=<>y^i$d|gZ@)`jRKDOWH9 at 37xBR at -nw8UH2W@r8lxB*NHi=5Kb=J0tV at n5gF64*=6-f!xMp82vK}UhhUy1(oHI{bHRX_6`UKs2nc7P63GcH^ zqv_@|iBaZ-VPUVt$8%2YTTK~%i)AHSt})EHJO!Z3AESIQs=1UUo?WQ^AVhkk~*(etT zBPSVA+mE;p(mm)w8?JachGgdGb_o*|7=|S!*(NCE;H^3HtjoWCaGIftmm7KTH-+hXcjY5 zz|-5rhW^lZY48}ap#DfjVH3Nh*#SZ|ZkAa!VWNRcer>0QETaI|H* zTz7ny98YZB7jmlk3=D9qGZ~dviT at tu#mcahE(w`-Tk|4ypsb#*NfoRB`gHDHvmH zmS7c=2Z(1#5Ee at WZ?_s9BF=Of|1vf1XpQeM72)O)h4W=$MaN^*Vnm0N#V>rbQF`U~ zNTV-|9m+jOs6z%mYaHib8l`DKP0KvfCJ(3F0luX_`3JC&uQYmZ{7UWN6Qt*7sMNcB z?G``!buceNU97sdCq0DZN&JNb>IHL+5vsX?EfBw*c}FDiG?o`<0POvdl$pgH z&ql^4_`h=dt=`ty`wzFV>QMPCG5sAboP4$E(9Ca{9(90-m=Ni5M`{@eFS;# z8D1_HXGum^1e1^5x6M8bh**{;@Tk}w7L#v*z<~GUBaz}wO>bBY_I-iKAvcRz<1*UoW7`e)lj*+B7 zMdY_tC5IwT6#BFf4*L|nAHQfRH=JZrPb_+vGL{pVa1~5iPoTgPZiS^-D}BEK57rDM zx-Lz$r&b*wWAHsBu}eCcDTU?TAZ5-kU`lNw3%3;%Q~0^%qn)_(a&n>Uo42 z*NP``8h(p3)@Gq#GTucUwVd_|(TZi^oV;QC={S{d at h!&~m at M|LtW^^PqM5 at HP++<6LLaCcW zydl-E{>Z488N8Z?+UIsIq18qcLCA9$HO at B!(_hc+bBH?(x6ZTynI7vH^DMhmI9T;)~`^SaWe z36_pe4B}oe?2y+uZ at 8_7>n>g_zdgIE#Igr&nb<8ynFhVfhY6j2 at MR7L-50-*8M1#Z zEm!hdrcpciy>q=nM8IsFD~@PnjlwRV`#xFvDY$Jt=4Fodr*$*v^jJtK^-e7Esx?-q z3yNWF3ob=P0J2P(T&K~S`;?gDK=1WW3)Fj1stQG(P`t!#^1t-EWE!uKu!;0%(tSUA zgC4eqQhz5*@fX;Vf^LrZ74Qy_Z&PHyIyxY3!NDoip;2LLyxM)QCRUTsF2q^YmdF&B z`)QG-fyV{><|?$2o&VO>b=Mr&?Dx`-V18ms|GKkMw-~RuXJm zCnMk#i)c{HKDPpQ3)dLsYYOsfjB&m^`j>dptAb$f#iz at KSje(HCDc>9bsb?I_eizl~gV&}!+B{2{l{e;uCTpjXgC;X at IRJD|O|g1=ybFz(M;F`(ZTm7Z z^p_oeX2y%xo5LscRlf1Qq6!kM#XEjh&IvybukQP?86yXi zfNu-oRxmEuxDUZpv=ZHkcexDcu&z9;%lqYDySl3C99q z#w78irA3FiZ%WXZVQQzshCNvkq8MKGERw=m&@w*ZLI|s>JlWE&0Jpv{Sf^`=Aoldg zGm!FVyQ8~1sc}W|-6eE`d7u zc)x$Xxw$xH8oKTOD0KucmMqK)SGFjEruqYr^X1PjzHaAUS&LSL*SF6sccyfJH^(^fYJ`0WCappLrFCp;u zeBG(qF^OYYY8-hKpsz6Ehbp<(`XYnr7#IMY;6zlJ;RxxY5}SP#n?q?v9n&VpIoFWo!PGa!%KK`EQYodNVG-&J zqtzgQUbG2wm>WIu+;qNC40;Qy6`c0YDUHU5y04Cdb*_Wqwq_|N=mtFWMm>UX(4 z(LwFJPa}_Hjw^Nn5eX9x5?BD5LL}aka%rY2WBn=|E-+j>a`l5TBJmki_TJ!`Bl^S+ z)F%V1ivAbhNz;?(PiOlXzO7Pw0)7xmBmM{g#4sais3DUs#$b4KP#e)+2|#L92}>$^ zye-rby48ddQ^pV^iE48M4_bwJ9y7^7V}LI-8E3V{Qsczs3QMHrUe#c(xsQWx+QEjz zLC@}O-DDS%p1?>lb-JQD>U+L*Y5U+Al$`xZo%w(#KUZ~Rgo5+aww$R^VA{bb**2do0md>SI76Rw~t z9Ehhb-Fm^dN7gAXDuo&SZBvuxy6m3b+0koalUF?JcZBs8c|nurHoB9BRk)L{^AUIn zBbJZvk^)cm^Iu+)hYcug5V@>k{ia{Ry_9vTttc&qT=>limX{1%XwYQf6!B^fsH3PZ zyYYbsr>YLfrKm1KrejwvU}Y79RSX)a(4}ZoyMCG#{Ll!fyhByN4S`&|FfywOe3SrS z5l4jUX?))2Cn_xQ!BiaAl$PlkkY6)b-R}(N(1LQ+39(%yFY3eeq^_3^XXS9%9kvcp z-1dI?<^g9^A_lsIu}n%Ei(v>VsQpNh<-6lE;ZC(W+~9)Tbkw;<5jFH#HHo;4am-Y%}r8--$gK8-F_;CFX~u**r$-j59)WTvA6v{2bIdE&j0oP*NEm{ z`w;(n{)5^YIvOYvxL*(gLCiUyYs6NT6s4yysK?W}iw#Zql5VVz3nf%NI9L*FDB$xz8QjV;m}lZ_HiMsx=i8 at SCaqlk`-+hR*fRTmWXCig>=CdycNPtJJVnfj(2tkqS(>rLJW2kV=x z(3L$GrhaFI!-6k(geVy-yU~ids-KEyab%mUGB((yezANz9xH{joZcm|Bbuys z6j;fm)IjxBu4k=>XBQcG0MHq4K7vPF0E?}B9GsKClIp94ma$jr#u3dcQmCQWR^G)D zc{%DIi7||mayGR{zlYbc6WP?#*h)HBrceDIZQf5{hV!r`eAk$0hzsY)b{f(Qsf*y*~XyJqjP1nOuJ#4!PAA+ zJFF7kcBVVj07A|>)+*ISFUjB4Rhp=#LXp+DBXt6j4Jqft`lUxjapF|4H5xz5T(Zkf zB^hbd5bJ99do(8e1ZS{2+0;b(peNSJ5F*B)Hz%>7{s_qBbI-6lGyNXPnGX#mO6Uc8RLRlxrbU8|J`U{(gJCT8tMHUUe7f1_ z#8~~guxzr4&H7z)-K#fNT0-hv)B-?7M=uV*hob-;x!Zw7xCa@!H?8tfY at yo5)(Ea9 zzjeAKF9R3$1AQy__ac!j7#e^-7UqNNm z-iX<@J&p2usK#Lys*_o(r2GRui~LMHbVuL#dMw;lF5qS8)wa_8*{$?oY^n>WeAG+Y&jEK*TS*jG&LXKLzaSFwq;t`a* zI5hYo(Y^rK#!t$+UjX at H!Aag0(WE at +L}YRF1()TcZ@$=1iQ?Z#R!8XbGh&PwIwL{P zvG;8N1hbyVME$4~*F?KQ!W-BK$geA2vs4X~qLGTu#Vq;q1l5?+aN`C at TI7$C^h6Um z$>3LrMK+1 at HO4%hd(cU~iGr(GuV4#}_j7V6t1k#tw88R72iM4FmWf}tLt~RePy%~| z{Wj1%^HLy1CU5o at d9{vM_9699Yo*q&SoN#{t`{;E^!B#B$loOlc*)j~<>&q9|AucDoda7X%2%{!c2=`p>43f4=?mE~<{g zUu`dWosQxfWg30pDCK%p!y74*5iluPLOC|{aC at _k?BxCnn+BeZQ-+(R$;JqBX9mkj=M>l4%j3r#1`x+?3~`+0Tf1s-(4^Q at -q~(skQSr{GzlJ7 z_z9Rc$suwzAb)-p-FJ^n96X1>N+5!`Jf^kA%P9yp73zg2GN>~+V||@y*g12m6WNW_ zuqwaFhP=BadRdHTSGFDLm3S33q2W!4*}O&d{97zAjg-xR{^U+#HfcOkzuuCzI88vf zF%}BUAjyFEAcD6(2cR>+grr-)3?W_HZj>Ck2djXa4(lO>q4Le8Vlcc`8?}ewpv}wK zG2yz+jg;DX^KGhen6F+(y~xzET04v4*R`a3o|~ zm8(UtQvNZpn!hu6y~gfVk~nQU<$ih;h`3%`8Bg2sKKHTKTdh2FHOVPLesTqbuzNS; zh3zjKNZ8=!uTrtG<#T%_KFKxo`g?rwL at gexS&=ly&jmA!A5w^jX4Wwu5MeAIY+`L6 zSFtZ!V|T{DCW9&CHW5mr&{9d%OIz!0%lA}&@>iNZa=-iyvRg); zRXKkk8wv#kr1&3&>^~c{|3K=Ro24xsh#Hd8T!n3W6YyV* z6oMJKr#R14ZX6k34c6n7$!0BM0}*=-^-GN^M8i>b2cri*Xtwt$C0+-^Z<6tMY+1TI zDRcz5&bn2?tOlhWVpC-2__obbsu7*Va>!E=8i%GU-NG6pA5YVUyqxVCf4+9}X33nx zRwxNTJ+p=t#FVE>hUS`=D5YNYDaBmdDsIk9&SRs6>=tr at lEu1r@KtY*ah7h#=^>=u z_7iDIs;i5nO0a$VYA==wXT*!pR8y;c6~~xNF at Pey;Ifq*#Vk%RUIx_`8SEh5#j|0h zL<;j#jQ>39S1;+JLLI|P&KJUo^zwNq>!2%<&ojYBv!b at ikF`)mYafCH)g8prL2Rf(-IRt*BQ?8?p6MkzsbADA!X$^@ zitL at hBO>`zPS}=H$T_)gPlLS9mYZVYqkIDgNs|&DE`T~;#&KV-3)Bud%(Kt9?3Ukc z3P6Ux6yNr~{mgLkAodqPAL(CsAh=MdAvub;Z0GmCPlSRU)l#v=b?i|YEREwy77rb5 zw3)s+nvfGI5bexUs2YwxV(M}cg4n;u2em2HQQ`~}N(IFnV3Y`kqW3ifCMZ-J{-jWpOSf-09>kiYZOEDBbd-`_ zWKc8MQ*6NjZH3b-%Qoi7HMRrEck;kYG}R%>RG^paC+aAe3ta at MHI;Z|J at 24#;K#yw zZUpD<-|obaV{LEeg8>1>1ODB`-2W37{xPMi?)^vKqkh4Gv1?&?t`&qwMxt7fbxG^w zQ-YPPqFNMc3U1J6T55Kz#dJ0b?(7ui=KEU^%&E-$f;Y$AZ>S$pC{)n-t&u5cFz99_hE;wd<326Kb=x6Y>N zY^qIWCzZ?-?mF6K>8-qj2-~Vdsurz=7r9 zIE8a;Qlm#=s^=&@G*+zbbIqh}Le|!8a3v1$;FjLPF4!!u?RrVNp#?6cu5oyA7Oi1( ziCiYb+Y8<0_DU;lflCpdNb9o8O7dGgCdx+1D5Ed(bbi=cBy at F+eeJ4`l!FFFi7`tV z>>C8b7~62jV|AF8SsoQ3xD)!N&b1m~ZOEvcpq178In`Z7EGc;{6zN?FJ=%tak7g`=sWXFGVV z>Bo at MVoy7x!bzoP(k-fkVwp)h*IQuuRbghkfh1(B*!-}>C|S!$deSyq%Bm}o8(P^` zvIp^6F0P=2UkHe21P51OZA<@l8cF_`Wv{JuX?0DA`i$+yRBnjyh8ndk2iKUMuwjq2 zY7BQ}q}=b0y*>Db&7UmM>L at XowOJx~)A8_nZ1t>P at RheG@jf)GUhiUR9fp%E6*T%& zE!4X-Tt{s*_e;PFRm6O_*s0J&GN%p%%PzNu at wB~7w~-IuMNE2GKl93zlJ9hU)vZ0J z`YcP8jEg={A|97#o(Z(Thk%$g6didy{UvZX?SYqTz6t|o^C$BrZrNqqk{svMQaO}A z6`%gNfY-jhU>pXP4)dK)cdS@J_*F#UY^nBbBxtImETRf1;PaotPA?j8kkUj6VCkX|K7iFl zy;XZ2;(d6NzX*3T$Z at SK@>7tqVkza#;j-M;V67+JKd}?8DyRf>6u#QaKBL%bB9ai at l4{nC|mAzc}6193MfjbpY(X# zB3Ro9R0v8{>w(OHyOrUnltof>!BpuZONyi1CSDX+B{qvOI2?Am?Y9_h35nrz7MgE` z(I@)kFcZS*+(IE1l;n5H#bj%*)b4(e#pr<9D-uc at k$ z=1`xi;hREZ9zG`)aiL0 at gq4u9F}eM%m1KB(gY`q)owk)6Re?;!yj%mli-OfpXM4{r zUwy0TqoDcMJdPTD*KIOU=9Ik_PwJj_mr;7a)wMLYYp8m*XRS>;PU=-Sydh4Aj+)NU zr=?KiH0LI?8J3rVV!Vv4qU-fk{#vGN=|FYf at q%}Sr*h^|^Vw8+ at l0ZB z`md$;hVDbCIWJ5C3>p?d)sn}q>ILqOV+$TO&0xDkO6;hV?tZY}axR$hHhfi6?A`t# z{&M|yF*GfRgJfz~(z+s&kh$6WJOv5ebU#CgU at TNKC|^MJC`Smr at Y)0C^m4W=-dbJC zG+ig|?0flF>L8=>5*6zmOcke1+ zh3afDY#UT4k`YPpe#BBgfBqg&LfjB0eL~E{D(r;9u2Z@|48%)IJM6@%IV-*(5;)u_ zOila}!k>IDg;jb%&O`iFL403`Bt8o9gtYZh`F at n(gk~(vQ!}3RdzMlDQE?pdhbZq% zuP~KsMS`z|w?!gpiR3(O#5Sc=6lt}R)H{*^?4)bt#FU?8AOkbl<}{a++Qw&J8Ts1Rb+xb?J1jQy}R z{P?gC7y}X$On{&uBV_-E30^96CjMH+^r+`G=sRV-Ib7sE5%;W%#)68TUakEM1CYEU zrXjHZ12RoCVPjUf at PrJM!+e?UK zp~E=tX((9IU=v&0gJA^yC6RZJQh8YOCy66N$68fkxQ+mXk at o;+zU*W5~AOnO5L^lk3%7TIx}rJ&e+vQwsZCGYXwt at Bh||F(gzQ`fH7A z4CMd17xRy}rs`y9=WO|ZJc5eVcK#GIh at UM@?nk_N#AV+>s4cvqRwfY8tbkt<1hIW7 z6Q4c!*dOY;Nmlp5nOx?`fPTtJS%`bc2eZG(cA%0`C zPPrs8vgrzIM at C0#p*dq8*XIfKi+CO`XiP~P#;TYC at Xcdu+}iz`KBG?T zm?zTYl%A7p1vx-r_}KQF4Fog!#$)5L$uz9~?uO4o!WQ?nggQ$@6Svn~sfa|}q7!$` zUTmZ(M57#k=y)o&VJ7#>Sj|GvbH3I3(N zWKWvZ#6BKfOtb|iMkla}tAV)5YGjc|G#a~OJ07jyG!Z5nxTheu2>%SbX178#X-2M; zR5%6ExG5IXc!5n+fW)l}^8 at Ip_y#=zrHpMzAf*5HD}OQHdrs^Y$Ft}EA?=-`d+D}q z(X80EZQHhO+csBLl3#4wwv!dE*tTukdEdsl at 9ceFdu^Y4TeWIc^;cD^>T}c>qxab- z%0p~iA0c5jGR_dB6{sdf;u_orER#561XBba1)uymop5KiX7Z%If<=(AS(Ef>R^EHt zsoju>ce7BQae;iEaRXGKET>lO3is})}=1nK+V6hiA9gZ%Y>yZZ4T+XDRCnE5AdnH((#4a@`^ zV(@{32WGMRL$|F3Hb+qOPe|JhXfwd6sAa~THwy+~Cx0M}$Ag^I3jyCCr}iC0FkA^h zDgc1c%&esCgM^sT0?3 zm6I>3H?hb;UL?HbPf7zr7FN69s;du=#4GyxQ&#E~KMliVic)@yW2pRSy{T?t9dMgT zUKdh$5+qNB_0ydV__wx*E}LEn;_P=67M8SZ zYk~~{jDn^CB-fl91IgLgVbeg3E$g#n<;g=QvZO4g5CyHOQ}vU)PX}9Cnx$oCv}p-R zEf?Mj#?|z;e(NqmEIYTmwyPWX-Yp)se!DQI%L- at i^nWaOJ@@oDTnFR^Y`tE`27u=w znGmrW2}&>rgJEh$Rbws~h1MYsn=+HiSu?2<(~(GIM1{eRuZa-JH!@G2I+`V<9_|)=67cco1qB~?LxoI8zT=@*wVh#7-w9UsGQMOgxr&s$Na;Y at UV zrXzVb#Hs5=`lT*&O#OK(k}DQ=sic^Egw>W$JvPg{Txl2jQG>TsXGu|dWe;Z-|0WXL z!!bYINX>0K9C1AFr{1!DA>&jWp*gug#9}kPVF23}#D2*-Nzh!kl&ge43xQ<@;2UX} z!7a}X8inUM){gOO{l;6V{0xtK-JbZF3(+3X?lUf zZFk(+U!Qpl?hI`?XsQbxgFSYSUfMI$6ityn05l3z8UG zO=Dclm)wwGE}d at 47hebXl%=(_0ECLI-yH4L$=Z-KGShH1F&Z7Y at S4?UpHJ|_T#~A} zGp+uj2gz20Sp?-Y>(x0d&##f?&#YUsm8v~UC|V_kmbKP)yKGv#!fkb7SFm$B$)xgU z!Qz&b95>ZAs$d1QTWkHsGmD#ZtDE>esRTbe_x;>OHmkGW*Y at c)t7X3$ zvczuK21ABSOhYTk^fuoSa23zIkN@5(Mim|6yCMgv8%siKo0vW+bbs5G z=bnOnvZtrRCv!-cqc^5MPWBMy;j{V9#pdc3wdkE9uDigo<*GAeLERGF&xX2Wl6AppnUZ z&?*&=%OjLlwWYTJpTF$b>?K~2_+qL{#UJUkNLyE(d6fGHqG~NRPBk!;@{S9vt53-* zCe{kGN(|?VQPkym;F at V5?Km1asNxJ4RL(?F{5dhB?T%1PQkJ2o>aeqQ2%KX71yoSh zOU|#yQJB-cDPP;NE6|qO0q{WP2e=a=#tGNHy%!BLQ*Abp>wo_8!+KvjK?5B!tb at 5- zQKCIOJ#>D<47IM^x^v zIVE-sQ_d~o=_(sE8Y39=PFwHv)Gv(P4^C9%Oeln4kU@*e+=Z25-;+A=JtJXe~>LpW? zaSSXN9{^dB27t^d_dPdK{>6%~-ZiX`PdC;~)=d>Hls!36u`0*Q9vN=^fJ#5PJ(4=W$VLY^JVs3KJ==n++9mtl zewM;im7L8KJX~jw+v+W3>6wXCaSPmaAT|vr?pTg7jV*A+vgaC(fA;X_pq>0p_4;*V zf(DLva?=7U at fflHo)(h9 at slj&XX@!AO{aFP at -yxIGn;je*?~TTBZ126R^?0yv?T(@ zO!s-AoVQW3DxT#n|+2r4o=U=-*@`vX6=1z z?#WUf(T4t_*-(8iP;BIkKXcK6w$wlwwSYz}iXap_5=SY3YT0!A0Xe5kc!S(fus=3R zYW6|Tyerw+qezHpj+qV`nIfQ9?Qhf(&}&TWgv$M;%U63Ijuo$>E5w~_m_lZ)P?eS9 zTSrM8)Q1kBd;>A*Z-_kedsp!FEq77}o at t~zMcDnLn_uAO_ghV`JgRzojt}2JY(L^P z?)1pVb1jegIs*mf$9yn{4WMZg2y%I_ at RU;Buu#r~1ms#&4%?laNc`5f^B8#rX> zmklE6HHsaa(s at bzc&1;#oR?JzJ>}HV_LQVrcziG5FwDHH*$1KIB&!_?^4DLa61v0d zGNGrc3V3?AsU8v3>jRXZ{G`7k8?G_9+A0+VU-+N#cy~am?+e8`b%qd4Mk?%6+mQJ8 z)fY#Yf;6;szVuAHrdsuf-f5Mg9^ReN-+7W!&1f}sMpfg4HX?YaniDwry`RUv|C^45 z?XR at O*ns?(?O!EN at Lwg5-v4k${lB|6d;3s(OE;cKASGip{`8%LsmksoO?2 z5MiU(i3~`?)eDgn?d`krSV6QlPP(H%8d&XV_%iap7e;xs7Pp|o+U=NKZLmD&xExPS ze!P8tLi}W_8bbW at h-puV^kQW at 67Y&Q&g`Ik|(VFz2~-fuJs&8F)1 zvAbqh%Uav*``|hC8tMyu^{RR|$1g1Y7{b=aGd+Wcp^;1ov%}d2xbw_O5=z zHMO!BILUEJdGP2jRpa&AuCK{eKxE}h zzN=yqu5&3n2ywK_^5X4Q#iTcmAv#;bLy=fQk>EAZ&b_P*Rx)W$;D-MK}(Wht~M2B88cp1^8ba zz23B}(`k(HF@}Q!b{j@@Z at zdaCSl;?WB?5d)~1J1*og_oEZ8Bo*>S}^IHRr`(D)>? zO0yC?Qil%jbq`#?q3QKL0Taa#vR at 6-o7d?v)SD2y_!i<26L1i=Z_E=)u<9s$e71A| zm`ts2|BM1`0N^&h&PaBSTL^unsEYShfk{liGd<`&?MI)Uib=~k?G`_d!?{5btanDr z8~AS2h2-D-C+$XO5q;66(iDDV-j(YVgZy at Qc_&+&6Z*-3JE{C2%B z6_;?B?R)~R0k|VAYs1QzG6dTh?SjhU%nJM~%-hJu;@kg%Im}-fy1 at Sp%>T(5Zv0|03=EY1jW{S$P>iC$G~uO@&T8O`CC>XM~}+FM?Oh2Nvn! zo2!k%DR)ogP=!+jKzofpwHW|^AM%8v6hgZ=-L>SFxq8XUob`F~8}waXoS|k0Qv at Me ziqaGCqoIirDyU8Reg=WR#*_1m8-|kU7jItxqlj-^B)Q18Fa6 zd9 at TOmpiec@A2{voA&gQsc!YSIl|Y5)zX$)&`_yr%zedGRu>ZJb{kx@~tb at IUoRQ=Is@#+QKFbvFJvmx$vzC;g z7;}giktmow0WQFPNC^=@CrywXtlL^Ux&pRnpjOH0Zi2R&|;!% zx1d4@)sl32bneF;TaP!lxeV~}_{LjHcDqd7tXXE?vGB+LDU6CAm>grA*=?{9hevkB9Asn*Hd at 5oZQ?2IyF)oy z8H{^VL`d#Bi1xPhAbSRhRo~8pZ4-@!CxC3kk{oZ;tx{mA$+8Y(8{xc-xWkx3S-v9 z3=z{U^kLeiBFfU4<1xn{nDD&>KCK<`#U-Ja7?@)uCkHISZ4^C!ue=g<)QMc^Fm>QH zE?QqgG+>NG_eYXAJ~HSI+HFYnF1FpmUd^$Epdr(AZVv~Iyd#>?iouX3lYsk!{3|*q zQMt58V1R%oaR1{)+W$K`|AEae4J%i*MYJ#ZEyw!=oL at hFAte*4B%~s$3bW=L{>%$R zTrgx^I6dl;xf{XR!x3z%*1puWs1RS%Zcc`u`6UgcBy%okV?$BhqF33k?dI10*3oYr zAlc(`HR)xd9<*p)z2UQk^|ZD9*Y>`#yybHx26Vjdfo3^aN^^tdyVQFOe6xEG-mUl} zHtS(G^3JK%cZ1~kip|jgjM}Lu%d6L8>@!gXVeFCb?w0KJo~V6)SDN?Ntu${$SMm#U zH!*<$+l?mK*$vyP=SD9I8Yhmz*rq{hXb%yA!su|fv at eQJvDkJ(A3v^ti>{Qv`bT3CCd z5YccOl9AlC@|?=WiYfyiKLe2Kmv%*sIjvR1Xj8&4%E$Ly3>S{Z*ZJ6~Tnhf>>3@>$>%SkB2bpY-w`L4%j^Qml5ZgwI+=(b|jh{X-1 zc#^|Qz*11_s3qn8D0fOL1e$ptZ*v$=*U8Zwv!YhoZ;UJ|`Lq^U&JrVWGi5XXi4>7{ zQXNZ#^OZVXjOW}Z*uSdrd{MTNa9g2IgVNl+IcRGMPR1$DyAx&QH56kZO^6fNf1-ab zWw4c)Px(pYR?)QxDjUd`Sn)XFtuqapm0shR#vW_NxqsY9gI&xJfhmmr?nx~r@%lTv zbrmIcebh~fCb=Pf$mK4UR=MLOtYL&WaFr{P&x%K?hpc@`_iSR}!YYei0UVXXBs|-7 z3f4kUcm2Zj7r-0);5S8bcsWzo;ri*zE$or1(H~u9P7bxvD%Xb2@$$}OQmM6w0hLVB zR%vDj92!Gv=g8`+6Qc*>@~ah1 at 7A|TF#}3#9Vu|`>=OkFl3SzSPIH)KBk9Q%Sgkpi zdLmS48YEV+V%3O;Q*>g*(aKMBaGd*Ha z8opfIcV5(o^f56oeVY(&u#*bzZ)Oa(CL2XG#qXP;uPHh$WbE1Bn at R2;-3r at jx5x2P z9iAD-8ZW#iDxT2=!y~&9wTXP8-cTDy2J2jZM?_=Rs-M$TE`aOQZU_*+n6We<-b{^m zvz99Fq#hJ<=oe3az(`&Zkb}ZdIJZ1yttBpCqLI=LeK!k#X5;iyPsWfe$*ZWdmhq?B zQ?=M~Z!YECQ&&!}k1nRMmAj>#_Z*OZT;)&+=BUwsbt7BtXgR&Lh*>Azrt~m4vbr4zSShgU9F+7p+0*YT(1Av{s_Cf#et?2 ziKf*=Y!m$ajhLJCS{YD#0HKgxCFiR at k&e_o{*trm3R*zriE2i%!v%XyH03q(=NPs- zkg(HIoK1UX)S!6^tEx`|h|SrxW=cn=aG8GLjX_8dT}HQTvmM3(%y#IW&pJ at 4EtdQ~=j$Murkyq2u4dT$_Zl(gal4e#e;3o|@`^=Ya z<>6Yfw_SA08*_|z-K<(?qytq~&8e1W5K0+m;Mn9Og%Rk}AIqGdUV at oQ`2#f;a2M+2 z3p^0b`)74fU8wd2(3!Ktn_4DkO)!TwbZcqjT)%~JT-c(MJEBVr2SFcciby)n*PTxS9yS*zn z%kG!ntfQeOutR&6IP0z#DzRsz0id?cYPOMV7rQb}AS^rLwEgaP7HL4lu>J5EJmNhY zpg24sGK)}gq`0~61#k3>@V;EkTD7L71Osf=W8Mub?!eP z!p{)-9$5JvVEGN$>Y3e*>lDD*ka+{n=_p_dYm;ZL^7_Z>D>+a_qhg>`nv%@rj#0k(2oSYnH)G)-A;o?-;0X=)m(2m)q{lR}c z8s13ZI0ZV at WxieB3XQXilNQTC^-dR35I%QoLO(7XR!P2Yl7<`ifY!sWH`+^aRl}QE#JC166U^EzgO{7 z3WO8k(Dy6H{3}rJH5PU`*J_MM^H)!uM32m3z+&E!aSn7eYlEDK)%;~eeVJaf6{Vfn zDy~sBD)iXBz2K4z358-U at f?mTNds>gaf22;I}hi(w!WAhjFPmsdU*&sR5b1c;E1*a z`-UScsAs+*fYI)IG;^rO)99sDd_hun&K$vmPL*>^vLl(=Fv0j-FDWrBOHXG5{K^nT zwzn+ufM_g9NDIGh;7`L2<`l|_jZ^(XbK8Y+#iWLmxn9Hd0?&QpVuQH1 at C`BvuO?-u zCi%zOT1b?dESV at 96p39@yyn%K=FkJSnJcbx`qUDb!H-X${9 at k$_Q at E^t=1B1(Py)9i3^doKH77P) z?-_TNiaR)0XgNZyp(iq-9)U;O=xiLHtyMS{T_`$oEy01Tvk__7D;GQT308pdu?#q% zgtElA>sUbR&T(j0zXEM9S9CXtSv?dpPqhjE7@?zM(xh~HWhJ|slXBDQ9yqc!=5)IJ zNyJ at Bm7Kd%d}&JsyOLog75tIov3gUpo)6BSq at E*JMZO1ULsIJ#j>ha$MiOp>WcfpE ziNaGSE$S2!mTyqx%22TfwtXsSr at 7-!rd_ehoaZwusKkIhqX_}+jpRtfe^ekK8jkGe z(>1_UN~I~IJASZo!;HiC?$Whadw(C)*NBkp_T}B~q at F@9zuAW8?*u_Jk*!I4HOGkV zqShDpSf_`xT@&qaZ00D4wOM26>0;PqgL&!2$p7Ot+cOhp-ws3ELkZC@=aXCY at j~*0 z&V)S%>+WrbwKU!S#T4rK>e*C?i)mj@=B9+~YS8u;$mceQw%n&qk~b>Z7+24jVJUo= zRTDd($lWGvlQs*aqRrqy+!eo=2Wj%x<&t5?eec%P=hO+jKlk`^cIOOt);H?52sMz| z2e}Vuihy8fWzRRzzh>Q$-$EGWf0Lp>{HJ{G|Jy0~S7A!h-*w!>-ykp{m(Y-5#Gbna zEoz$Ma>bH at kWf-V;cBwJIxUIJZP{!cjW5N%GZ+pCLly!_w-YVGm-Hn!&hAqOS=%4S zS&jGS&(8!v5thdC> zGrHwa>?ALcg2&tIlI zC?UHa;PSK_k7Rs)?1Xhh$g|V$FAKpbt51_R(#$Fcxdfd$Scz(q5Sg=G%CV8Rj;|sD8ji zF^LeRAHL;CJX(d at qec;J*O$c@{$nLC$A^ z`H%3gYGr38Yh`EU`d>2`q7~&7fSC~e)J%T}2y%Hp{)E`{L=!F$MS%+!Uy5^VV4c*S zvzxTXxUKcNfp{s5Y7`u3qhz<@zCW7m^z!@m^aFAH^*b~pR1c64KiyiN-O2cXvx!9D zV&H=E#?c>-TJs8bYMDbid5)F9UF>HRExE6WeGEaJ at GRbbWaJMn(q1auuZJxI$V1CI z;<^+^JQ&apZq}edj?AZSTk<=^XW1x;3C14B;SoI$q0 at lJr+rjzPlJ3tNMZ{QMX427zNIrQ-JZt4Lg*Qh z2sE)TB&ZgQVCOPGezm)1iN at SjnfXj6TgB$)V4cC7oF_)W!rF{XX$KnNfsJuAz>1CW zB~enV86mUS;NidH|exQTRz`#w8Gs^r at gMW?N)qwdLK-x1um-);fjP$loi!5TQ!D?Krr-gWvECy*L zCA-2%4R-n9c_ys_kOT}uVTpXQ8e8}3hH-dxTRtz7JV$$2x}9m$@<$tty_7~pD8+2W z<}EYXP3uv*kph)mklVq{-OYE5jj`w64o#iA>Ik?r&RIk=@XFkD0k)>OtU z9tB*DKSfoLB!4{S;|Uy-!~!d0ANfjT{=wTgBx1&bxO2GRK2B9%47pJuj2>iz^Nf!7+VE7BSdfH^1E? zw>b5v@?l`6G_O{PU!+Ium+jAzJc$-0fiS+(I-g&Z5BuDC>Ku-VA3n6USb1u_&M>X% z>4_)uisancjsoOJb)}I|C?R-Fv<`)j7zqNzSMV8L`*fHE%(SeQCw+VkLe-w7fdIa3 z$Ak0eg#%PS{*6WnmO={{lEQUKy#DV9YerG7TD0$KLYlql3Tw#bJ?jDNBvTSHEwxn5 zvLeSidSDXF;`k6h*bu9bT*;Uyd!jB1NtL=tS5F7*0n2zyxMvY2?4i6+WA|8c#Kb&t zDu6D7mAOGgdrKakX$4_80-Rkkbh`JG7GSaDS9SD$eg?tkzlFy>MvnB*zd|D>_K+=Bex at I1oDt-gkYt1oF$Le-~{}*swa561(+Ic^34yUGL-AS+6iGH&5 z85_XW$UT&(5#Jvf_BBCuPfm9gBYyZ9qyaWrI2VG4H{pnf$^0R(iitM$qi!#yzYZ5N z)sRfpzRFBc^VJCzs(2I5pOjY%iA*bATT~2yPuATT*_WsS*c3jEBXHr^skrFg6hQ5! z&uOfJ=v1e%U!b{Y$WSusYQArS131VET z-3zn9q6TjnoJrM`vjB|3FJOu at j7e-FL(S({Y|2GzjCP90Y}sk4>kcD at cvo)SFHtQ) zqptCH6&kmAlbW%tDf^#sxfuo4aGCC7v*!$xvpWzK>_NY>zR+u zRq)0$u+Bo1^IJ+Q%*|~+BVV+BzAIbmPvqmo1Qp}v7^NGXt_k4x3pOIc!eo!@QZo6f z7v!_{za(4F*%>|M4p235;kgPFpL!dg6m(F_IbbI);lDYbPM&PCJ>y;A1fqIdUA7ES znOaRQg3L%j2ERK6705a-rW9no*0$Ve9Ysy**2Aetl?ZvkY6d_DVHPar8AU192yrk; zW3 at uYl6UjkbL?HucrWiUHEi~Cnqi?!K*3miK`6scs-jORIbo~f${NnS;mHu1#S_KV zpYY?8sya(8fZ`)(5ZfkY$(QjK9M_AnP?GXl1or$Zwn4T`u$%w-^_zqIr|$A<_9p)z z2mc0e2RBzSPZKl8|EB&``Ug!oUz=P4Nqkr+4TcPdx<7PG%}@qaaw{ag9ctEqw~Z{J&q_V0QT2Gc9+>`q4#Fch!Dg0`UNk zw~sZ+ic^m_vy~3#f(~c|4wBe7Q$*v87Ad+V#^v at c+qp20EhqygcqPM&+rc6vpbwhPjGvBfANGBT{PhE^L zPuJ}ALEK&Z0;Ui at aujv*)WGBxC`W1P!;- z($Ia!&tHaFT&8R5SKEA3XuBc?Z-Qi03R9ZOQlkmmANY;lQ#J-yP# z_v5R!2u3z~@eCx_?o6s$r8BTvMO0f&LN!nH=_G2pk(O at HusNkZ+m-G8*xa)#ZQkXH z8I7bI;_*?xicPwkmoS$qmV$NN2epEb0lUi`UEj+Uio;r>EntXhVv2$}4Ekx-i!hpDaex7E zS3u+{;X3al%r11)3LYRq7ygyyj|jE7&bmRJFuYZH5NPd$cTMSo;99~p`c z>-e+Bw}H^8!xf3LnawYB(I&B#S;L7SIYo6|_|uY|l-dJXsqc0xc)26&h;cjd1{c4z zJa^`uHO(vz4h#Kfz`w$IwpAHV0}cqtgBS=%@_(dK{{LTIW>C||QFRgTOTMAQ!^5Rf ziZEPv;8z%Of}k(*CaA4vauH$@C?fP(f^JI4r2Ps6LhhqdZnGE-`t2w2Ah4KCU|57U z*q{a)O}FAgg^C6Dd_YzVOLoaN*Yi}5CyWg=#Ky4!5x7QOGki{;J zK!sxmLC*l5f7GAagNtP^&1jy_Hkh7S$5sODCCj#91Oor_VeJhXgWBoO7 zwYt+9daPQpN<8IpeTplw(U7v58%$!kXc-wBU4m?Sy(BHKSMh3s{2+>)xv^K#U=>la zskf01DcOu7yPcG!R~a>SL`bE1i3wAAwYjQ5lje!@dy*@4c3fGFDrLKB9w$!GPoMb5 zw+|B_hZ0gEX&-HKHJ?^D>=>j*_Mo#1&!T2?-sYDK;$2Nid!)24fkp+p_JN#SGzJs9 zp*}KmnKR9vpA<&q^Rr10`Tc~a9+Q*4F+A!zO4|5FPIfLgjt{q52;%W34awEkDRAB= zU*Y+d51zPgmIQUcBr%StRJin6NMojL;&>QuT z3PgpaVNXwK$|W!9~3o ze#EokKBOqpqASS3HMeFm1;(!~N-IQ_s-)X{kA`!`xTOK~;b&%e+O;m|8VD3+v^KQz z=9#dhyNU!L#0(F^Ikj^Se0+y3Rr4-JwwYLLLu8Sv)}6GPX?#dfZJ0(+XNnH2qlYQo z&Y at m&hS8l>VyAz2lQyYtB*78_<1XLY3T~xwZg~-8z3}bL$VtI6pN21kOFdYOPm_O*r&X zFg+FB^oWtP$&`w3&Vfy0=;vk1`LMTUZppXiZrQhHZ!qw#_xRY+C0KvP+&e`Ay12K7 z4cvTx`eE}g+#;!u5D?r?d`kCo^Z((;%iZI{d%sQZ9hG3LjG1=&iPfEZ8PU75wT|j_ z$KWd4?;0os(Yi>MXfB*jihLU!!*HA28w=ma<*KRhm>iE@((>u)x#5JI)EiiK_15)cG=FlM%0BTqM9+p^W9k^)sThQrAmj zEYD*r$Y2TlNEtLApZhJ!xhWnpK$%(kC90&(5W3riTkzgdk!b!RIZu6OX9B~3<4_qw zfwRTYiPUjd=fZ%KTui*^>f;`(h8&(wBURZ(YZHWWqD5Usw=lNVQ$#y{eB{@=h at Uz+ zIMdMW?Dzz`q*vexV^d|5HOuO?7d0d$2aJ(|Cnq;vGMx-fm)ruK3A&6Pnh<@q(6q^W zx=M|rxee%nFw3d&aw6{TbK<5$b7-pJt!V(a@=ze;`kDxk_ z)G_qMzY{8O#wAo9Pejym#o`*v-*Ah6Zy*CeBM3c-x59C^WJLRhAT at IwL#uPlt`1rfc8KOdwV z*k;0InGFUmXdm%G2ObzBx#!ww4TG!PNR6Ep9wzfWKZNS=EWr{@`x$U+D!1W>#eejA zG{1SYIs!6CisSXub?>To$M%N;!@>n~j)26Z at W6P8MzCf0D{PceLC%w<8DvrcK=Ib9w3tqoYH7D zAY&}Akvw|p+L1 at Q{u#P?4 at 1nZ_l0cgaZ6N&t9T^)qcJ+wfXYN9UtKLgaKsxi1qbRX z`H6h=QUocsT06Hyd;=vJT5*yb)kLd(`rsIiF2H6*9X7QSx2I|D<4k|9(9UCOuBjy% zHq`{|8ILp}SLi_Tyz1bMTGvQvv^}FR_gp}=tWF>rfK{(zPDZ20#3DD1H~o4FE8yJR zUn at IRRfX(|V{g8kSE?*tF3WHT2n}y3JpYuYu||l9b{YVesh7_ps)HwU9ztaf9VHuy zIyfpkw_AQ0%R5hU!?Y_b`*gqPz(bAQ9S!qaPRUCl>O0sC^Tb2S-5p1qHT~U&%&|ir zrMiE~x`+sPpvN}D=yy-O*FyiZ;{x}*Ey7YeXb6n(#}BsXJzW&vkj^uX{vA=|(8zn7 zMARqB^E~{6^V5niKDQSSSHlG4sxMJ=O)^-n>DJtOb)<5O+;_PBB@#=faYTyMC2~FJQf^qe0T1*vN zt?Q5BQUAJZTSf+VW?z at Ej$Ej7=MM1ko8}ccrxiBDxH61sIOK9eSb~ zS49ksHQVD(b*|%Sx?@*9g;!+yRMm at L%Z_HAWoT at RSNJ*D3(mvdb_RzUEj^!#T#bIo zgX1^zI&>13Cu%6ch%)-j9S%B|N|5QwZz zhIs=WF;mreaz8Fkes|~ya=7a3h;cQ7-IJbgE!3w(K1Cf6GXRF^7~PZR98*J6I7$UtjTcufbV&R%C6rXG`yD^Sn2=; ze?l}6aRmwI8XOV52b=$cN6TU;9GnS{WRVj^WPvj at y#^Q|62!HvtB*mVhCy-Px?U<8 zVj%Ub3vI<`B}TaY!oB3i0_%uJ5pW!K2OMNiQF$;98>;8Jx9NJj?8v8Y5x)||a|<5y zA_w@^fqkvT+S=Yh^NsAPdLY=*^NoGhJbZ#i*uwDlrGvhS#td>8qz^@ip4 z?JwQ<#dQ_^dNeeh2K~FLNWiev1pbGxehliA9Q%~1cfGAn(;c+FBXuK))-(3xk2zXG zwhpbW2Gj$()w1X-fo5+vyDqiMp38shPbu6G?q`GiRk%U_&qeIQwhksXe;t+F%-sH$ z*^rLQygK5SJnb-Hgxcc=_m;){dYKo zr`53E3BpP2S)C6pPfIak|4m%ud1J?RYlnqK;`i70u>nx(ZDtJZlIuxZW=NoqZ`FPM zABm7yIe!1$eSh#p*cRp&HN#HZ4);3hxG{_zNXv75J!stW)f!(!c8{VSyDLstm(C-t zlKX)NyDvOF>pw2<$%5tPUX#ZC_t-JC32P4<#+WPcr!{DA-L64Ete%9*+UhoFG1Fd z^C&RI?qCN;AwSw}XK6!F1z&N0N(M=%L!BhIrr0`F)H0Xd-p at T!o?6mTEALo;2_6?^ zO%vdj%*iyj)rp4p9ZZ6&l!V4N&#+9{zGm* zXLeHRH%>pR)dK$e`7(HfAAj`Ap-%~ zQ2nP}NI3_4D_4hqvMt40UcS1EZeLqIjh5om4V_UFmi32vk#?(wu~7$lDfP5k;5wT6 zKN<0(518hn_*fd~2!jV#Xo(Pe5ib{3;v|d1Twb(jPIR60c%Ht1sr*IOUBH- zTg!%go-AoG6>Qz?T}|bnmY~He(F1BYH9DWZ_kOmnQ%w&!Ql!`i^2Axs-{Sfu*6b2m z3V{7nbp9n39nOT9%UJ5o1 at sZj4(@c==jH)rEBAZ5aJRw!(=Aig{x at B}lx9(6J~q8@ zQ4Noz#-|6;y+TA=*#VPNQRkG5Du1xW6x*xlQWL(}l9w+{>Xu5L-`w~LMg6Cm#PWxt_HV)G at mJM_h zQmnE?kGogZyQZ=^m*N`U9#M_zxgBI#t7`Qk=FW|5(j2m?4N?)N*ITS|XY)G_yqMuv z&CwZJ^+c@!Ya{)|syYTz8s1VK#8|~0;`V^_G4aMB*;vUN|DXL^M?T*-h zi5y#y1doxgLpSVOh50C5@*&0)FO!{w5_hnVsd{*@b{eQl&^F7H!35AYQz4&jRw{yr z5-dHiX=<*yQxqC?(_BQ9gzDFrbzZ7(*&B!543c%tZduB(Zjnufbo5g#&KO0Lz3w+= zr0G#J|5~+Hb@!fg4-GHeMxlFbns2g9kfv}p_QGU(wa8BumsOBbKDU<~;4!v#vp?Hl zKIqC1E*pF?F(4o!ht~`zW<)Mt)Xi;|y|`_v8eiJiNCt at 3f?CdwJj}OxP=Za?-S4W? z;OOJZ1AGb=xQOXeqU0m1yEZrb35j)knpSpYL&7T1+(jD=8etHc^nqxC-q1{7{t zP{!-~213f_6`gAGL^TS-0}}R*S55~r$+!B}^*{Os1orVzdIpN`%o8!bjrTNOG*DXe zmHHPHwgY89aQ+|G-YU3qZA;U2rkR@>5}cHUi8 z=iI7ux*v9Tbc8|*g&q_k&HtZcNMnAZ{b_3aYHa)Kns6W$AcJ~6< zmSUJGWVhlNeeQZA5r>wfxYb)D5yM{pu-_s3+Z=ej_CyLwIyHfOXxeg-vef8QqSkOonjHsKXPkD8bF;mRGSVA=*tH{|KC zvT>fOoIU;}>b8g!*X~5r^I|bx%6ydSFKgyJQnMH9i6L{Z=r!|P8E4WTv~AXwfPBCZ-=p?JQB$()*>bQ;nNGPtIkZpkG%AZ38W0%3G!%eI>0eUM)my6t*{S zjXalT9HkzvTtmRxVwO=wFOk}cLu|)?(LzzZykeNU5=dc3ztJq--1G_48hw}EF98bc z$jm^D%r at sFi^*XUU04ch*Par=2UP{-3QPeuq&jS8NaymFO=2ZZ<~Ps^ooC48aR&B19AEA5G8s04a^2^01Q+(-);E48 zuo^N99&_}zrG))3d2-26eFD2T7&^KtL&ie$!#&Lvo`)elDty#XOV1ra(-=c{#2 at vt z<*p+{z1X at xN-Zn!xz(b{t<|MWY*&?nm4!Owa-h6#WoTOg0?t%F**3yW%CAP+K0`L7n`dzaeuc!!XxjktKmr4YDTTP;n<$OcT zrKKVBQso3fFuh}SZp+5%+Kuf+hV8{W%LjD2C-Q`#up`{+8ac}+6$(%Oc;P?Z_?*YEwegW za>*`STsDS#n%&fo<@c;?h`z?4QQl6ly&!8>|L+X+#$nb_- zNL}ygiVxpW}-8*HYe(vX%I%=CXvs?yP(9D=RT= z%Jgw#ltwxF2{YYFo#jF at XoN)0O;Kq%jPzRT#&+GQS!l7^?38QuBkyvX-WmtW+^v2N z19erg>hgt``WMmOw^tQtPT`%coYNs^&_RNx}!y|Fbyh$ejDjD(&?i1 zM<12(7tb&M*~nzvH-ZhRk#XvgaqN-thnQqc#ah2`*fa7SRs9j^tFD;T8=#g?Y{R|D z$T%WWk*v*4fx>U{!y`Am1^);t!+L|}%w(!9gMM6Ok_K&dPoGl~-Nj7WwC_mNg$k9Pk~^MCHJZBSDGly~ zVQoK)RxbIHz8w8>%!_sS6Zj)-vqAFHZo<<`=77Kt#otKe8xp2p9vLN{1j{MWRO!|M zs&Hx*HMKJhjWbeuO;<~5!B$c5AvJo9Ok=+!*$e zV$784$yB&eTj*bCdiIj}^h99D1H**S&WD?;!B`(zrdG=4JI^)CXA9gG8bPyO<(|V>YCIhjv$Fbn at LcDYZ_UiP< zWkWC*_Qcp;zvFacEk2QFRID1u`4gXA<%fW*J5zz7yeyp6&NR7Yp0z3LqJ!O^typOgQ}J&8-VrOX6D8e~ z`_~@n*x64)9IeiEO7C3MDHVVC7`ux31P}Vgf{t03x_Ok_Z8LXdmu$i3`L!N3+_=xM3u2IPn); zNyaQh9U1P9Ug(S3Kv($fHF@{%5jcfGwHf?pjNZg(*|0#%ikVlENe8{)$5165)X9r_#yQs8Xq5e|Z3&%M&FlpOz76YE|Y?t7qeH z+w@{9t#mR!qEqsUQ`^JIrcuFk7vB%t!|2A*0N&GAu;&v3L4Kc)D(=x6-pyC+^~2pU zZUHZj57ws9pSdo+QDrDZm7A~bKbyoKNifH!#xg9N~)OzFZCINSt4<6dew|QdLZ8ioJwn64!>ho7mH>D`=gy8RCfn>7 zeq3UdKeR(VI?=TK5^*`Q#&t~PkAgh~Z^xbW!$xmp*AR at n6XM+OAOMu@cIKu`T!q at D z&OYQtSs->ae<}3t#%J-QBRfNGEit?4_t{ZbAxzT-gq{F*Y>ow zB2rBRu-JucrN#K#M^nVRgJ+n=jH(tPJ;X|BT7uOtQ4Qdjz~H>rj#EiQE5)c6fnAAH zyJMT3ne$u84horcK5$#mRG^}4 at s%(RvbU%0tPQ`FOb@!eyDp!Yv(yY=I_2K0<%<{+ z_7+3AvYOXvrt_Wuq?-(2ZZ^X0r)Je0G&mFB}!zV2FIm*M4#KN>u^xFYim zznn;p30^p48m88ThTRB%sg4XD&wyXd5DA|Zn=7AsWmElSNZ*=kcYp1a0p+qce at qC8 z07eQLTxBAG5t^lhbb>nYUAUY$R4gBVfWCbhVOW_L?XU3djH{KY^M1)(QOyqrwu6O6 z=TvYu8|4RFIF(kZx?%!`^~>mxX-*q2zb at a4=a z#*y<8-iIXBOj({U_9GBQ;JDPAvFfLqS|T)Ll}EmKLv}Ho>F=^GyuH=snDme3rpPtNv7%F^+R3o9r6w^J z7R0q%lhW*p%^xff>28) zEOZ!-v5nO;de>bqLTI-a1u^?qff`Y#4QqYYk=XI5topp>-8ANW?o-_t35gboiJWIR zMA;9>2R*`HgY{9=m04bH9J3mY?7vi53Ts_O=&tsBu#_5?#?cqTpvB?DM%1Pz_%n=# zu(=FO=YENdwP(?hW3yRRvmmgG1 at f9it(_kxcd-( zo{p#<2YEkX<0mF?Cp-srtfP;0r$?2cail^}@$}@PGUlOcyurXcOkSJNw)KV?c%1WX zl>3nGGzJ%Kx at 3jvEl@4tZMfoxZhCl&?rOG`A#N+{9}U(&jK(xc0a&_aM at HfqV?=ts z!Y#WcN6>uLrXy|ShfI3jp$t7?3_Ym~J-Hk^Lcec@=nfem{%mU+ZiR at An7CdgyV?k@ z;Jg?m-!XCEzAWaB)^B?vrDKmeh24Sh#MGI at I|bYOK|#hy{1qi`oASjCrg%7gD8&g1 zy at 4Hb#_r#wYpm6BS}n>x*-__Hrs7XLdFi%ZJqzN<@>&1EC5b3{)*ybLgO0Jt>GKr# zi(OEghKc#*NHs-DZ_pCY#Qw}YOCO$WAx7;y*rD~YbGik><=sHupak!3=FW3|$2O1C#Zr8^F zXwG#sm9TY at +`YqBicDv6+~C+bK%Ws3k2GKcH=y$uO^C8{)zGR&D_#TI3hjW;2sJ+- zsL{sRC)FqIF*{dUv59KeGX=%0;f#xH at uZir+~@wRVG%imF7>!B!8l+VMHFk&)F1)p zj^&608NnO}y{)6kp0C0diZvrGupM_Pl+uNdX=+a8(7y&4byoho5rykr>S-wj?#&t$ zoHL$qo#5<)?rS0h=Bqu*ROY{%OPSDM$PnhdQWwYvU9t+28nugJWiDYcaGJ~_ zs~0ABeBhQ(=ukCy)DUfhefPg1mTQ$vmOO-seVOc8BV#R3Wj!Dh-Bfs>ES$#;q>zKl zgi4K-CUfGpW}GWa%q83MBELiYS9uW3u2>BJC65#c5D@;q$Bh0 at I@kZG!~gGI>$$3S z|G_BsPg9S}gIrQ>D5SDZ?FG>g6-BGkj80PhR18)U#2?*Y(7hSkPJL}+`^KDg<`IzM zg(&_lQPh%Tek0q5(27o#?pLz1=s?UTMARner+7~)*{np z_-`JRjK$j at gWZ5|xcAm$Qyo5A?@Kt+7I>RY7W_%O41qsqj=XFJ6-^Rwe#(pYxZein z!bzhXRyZW%(Yyysp&ExIT$r#XYbQUWOu)ZUW_M&=wM+p{+41ZbnvXlodC?H2^}4Qp zZ^2J at TH0~@iZy%6HH(gY{%Ri5L#lE1YunC-zmYnkaxcz8#*YZ5eAM#7RI%*K^oHhQPiL#GCABiBlc zku>?>Ur7|AuydgHqx79prL7D)-{pVd9~4w0Bl{kLR8Kr z<*S}|=ajS!n?bxi+h7=rzv}a`7 at jCib|MR0QhA+5Dopmq5%CjSm!bwaE7c00GLr$# zqaOyf>x^3VnnZm~4TOQk|8{c;SOa6X$yHO zIn-PD;!=b48_?S(nBbYd at Z$KDE-aO(upuBJ{Wf2WFLZ_*+FtPrIOmf~-0G7vOWwBV z6${95Z)Dq1&)ey5PvSmW*1`dAOdCT1K49bDVg9Q=aE_?N2|z(WQXxS=c>izp at eg&V z`TU1E{?Pm3rHCMdePa()r5`OKB7%uPB=~+n3KSj+;EQXa)AtyEnmE*XRbp#EVZQ@? z1;#Xauz#mV+BEfeE at l1Mk@+^gQ at 6Vt@EvQ!8UKR0uuZ8a_WY`LX9ShWX}0eZ3{G~* z1Vsh9F~HDpqfZ1h9t)+bHT%(yancV^dTi&jD&N&QRcc^w>oS^eYKcH68dnu8sB>#; zKsDZ%hQ&becG`jlHi!Kk&3C^PpFB7C)aks8)wBp6sz&ZN)Va$n?XOqk!Q-wWVK#^DKgsXMi2)5}62}W#C5;S}d%E)DjYPC0ZHLbI)>=nk;Bz1no+6G8c?HR@!i3E|{gKjcw~kbkuBukbM;9sVWp38Me%+KLAJ*F3 zS(k+vjbtHbO%0(jy{Djh4dr8K{CUrh9+^tlwZ!qZoUmx^)W9zjl$BAXo49smexA at an-9e*|-GwlD zgQsBtTl%WY0tjHSrFK~f|ITXuU42C7{~k-qx! z#8JI_KIiSy(02?ux_#_vaWzf2Sjx-3IhCCbvBEgisgGcKPQ7cThc7L&R=ySu8XxpJ zA^LRRo7A#rM68t=3JWI4(>MdO;L=Ad^QzA8mVsXm!c at wG4ZJ@dw54`2k|K7MiN|-` zNRmpwvToa0_T45Dq;grmpQal32-DAr8Gt8Wr$G$i;Ia#TOA?*`fg%GcB??cLm?6N# z-n=mhoe-K`oaG601h*<+52*!J=@M46YlpPCIp!%qL=V1~d^qW74 z=b+qxx=_qKQW=^^zBiQuMov;Ywq}_lY}@!Q*orMM`O<-Z^*#rnfNM2N!* z4!qN7ONcTzOHw2L)*|%a-=-x;){=~jzfL`{|L)rH|3!BH5S=EpFWNHx7lqGMBQ^pm zisnE=e?+z%Q((DWFmi;ZhzJ;JPIV zlH_ZXD?2aS8(q)6H`YI2+}A?3 at xcA3y8Uhf{Qn$&hFchT-eUzW!vt$aw}B}|Uxs+n z?vx$?w6;2!BeETvxVprKH$$NI-a&SVcW%()Jt9YIg7;gA)DNFQu92E=)EfjNXtv1x zyEy~9)V5HEemm9`@F_ww?ifTO?g^m3M8ALv`63}!dP)ut(jY(}kAw$X4uyw!f`t!V zBt%Jsyh0JEFjH|5YTSiJH4q_~=u!!gpz&)(7QI>`DePygWh*-IMU>q!-yI&(2mlX~ zVZM(Lkfu4&>GVg{Ry`v3kRN75re&l?nb~eia?@w)1``YtFq?>HfB(b7YQ}Q~gG0({ zVzpJ)bq6(ora;Cny(WD`iZ(}8_0N<+1;+Tr;vH|1H zgW}Dz-P+O3Dg0>W+FsM33eoTA>NDpUN at yl;kxi}LEEA92;}d?qYDF#$9Vr5?KGMNt zav5h;f<~2%uG-lp+!SoKm{DrjyJTtsz)yy60^T}l_w!Crgb5Q4fJ5d| z8k-DpUPWRLem6*Bmsb-Yqb}xmaTYm~A~qvB!4b6DIO--P^KNWna+0 at bR-#L~bjB+;vkDGZh7ujfLBwXw1|^q4h!iitbx at nUqw8p$oMut99IQ9hgil znr%Kyq{6ikt4fBP9{-4`6lb+|OVqbDQbJ?%^9C08srE56H(ecP<~(vVrp9!0|`K32RWm0+| zi1QVV$<|Hf{QOHr5^M*3(FJ{;Gi3qs%&N$&$}WN2zB9EBje7DH(U^5!VHVyb at IKwsk`aR)trc00Jbzce1iho$=<&z`yhj9 z0x`QKQRO#N)OkflzvzRwdxT|mrj!cxdxX)2`h4(#p8u3x_K?kLl}e+#k&*f7Dg7I^ z6z&$alaNvxMx5EQS!-sm>9hx*KdLBB87_uK$^cpuiZjj_PFH{HQ;$^;qu(NSeywCC z8+DT!4_+E^;q~kaBpx*LN^uRRVaYGUaa1KNxObv%=jvBOR5#+?X|ELYM z6_f7mOZ8>2;u0rD!Vmw$wA4LRaI^!1zFEvhFLNrb!ewGd6qayD;sNUW0zLSiHB5Sh zI{U8GwgbQX8>Bn02x3=d$bOlx0c+H%=BuduBA#P8+?O~@ zdApJ$e937_P;{QaYQed}oY(iP$SZvj=pWn`BHkT*qAO*xxUdv$#Wp?8y(3}BQ~c%^ zYM$&`jflB#hSDss;GultP1k4Mjpu*virIR*KK)QH(}J9SWNKRyL-)zCU_c{uxo^eD zK*}zplyro#5+|)FtbYf0dRJa~ClI#bui%LX>pjxI^v>lgCxJv#_=U6UPlxa}NPL4# zcYmN*g>&!H(f-|!*iD!q#w2o0y+e@#W+t9wi%=P{$Uhh%cNEG_6o2J*JHABMfMNIG z1te{J_aGO%E!PWFSFYDaF>=)qyq5gNn9YP%x`BS#~N)u;5qHn2?OLMXjSGjeJ^j-!^N;Eis0TwwuK8-bF2;$XJkDrP*8cn}41l?Inv| ziDF^hE3m1?B^XJ7K6cza0h~e6n7k8~k>|S~J+F$Gyi=Mr?XFfqZ8oMMbe`m)`U}pj z#HHp-xbyf~dQKHgRxe?lhsxyaJ$gl|0u^GkmgBVvvxV30)QeB?_QCh0fPY8DT(IkN zUH_G34nl!|2>d-%jHR=gk*TNNR0jjCtyMu9;=LHnRgYiQna~KqG+UGsT@=Wk?lwW30Gaa?e_3v za5MUfgDx{zm|}4u>IxuF;g1gQOcJ!+U8O#z}ZG z?xQY94!<@do#8vh)NLelD$Qjycny}EHDu2LH+&;$=lzM}UW=~0E5WTR)ui5X==hu& zsqP_}DT at V@4HnlXc=YG|9SIv$W=y+zhy z_|f)>S9|HBQx5$5U~1zrM-=;N4R`Q@{oLp0pMJ{kn-wsOoR!{UQ3^bW6&m-vEc$T8 zs=TrA*Srw at -aTi`A_1I8+hK%a)2 at TKGWL5~#vAI$joXd5N>r62Db09oQt7O;ADueO z4Py^~= zD~=MQka&a#wQ=!W0)UF50VCi9aeZykh*J1;Ly!+10uEeyoVEktA>Kg-&@b`=KR8@; zJb+Y36}@l&6>;@oV8R#IWbC!P1sa}B*LjvrrAQ;UKZ{Jun)3 at q6aUYv zzyMKYm1{M+Tik7i4O=|gh4)auw!a-BhcQN$pw9bdJBmn at BdpF)^|1_$R~81MeQx3h zDl(crFrc68PEHWzyctI at kWJ38+zLuW&IQXFXIOEOZQ-X4qMwUr@{7A0t(R=z$Znp0g5$*ga*4%EiwP6 zaE*CEeIK(PxI4EQqQ&CF;pDDqb%jW#VPZPG!9+mZ@(9%(TV^S=DVpy*zj0=Bh^2LB zNxmcA8GC3-&XK508_B^kC}>}z9w>D0QhW=}@`^(G3gfV6<1P0J!FfxMafh#d$1nSV zR2op5Y at E{DD6UuxTI`q&!!NC5;>jNKg`-bdqtqPDrJxR2nVGj4hJ}98E)?kb^Zj3) zgbCrx0udYp3gxgI6B!oIcA0841~syRxqHSeeqbe*NfeEp`zsyL_9ZXv+p z5_hidycp!rl}ZfW&`4dGS7j)%xT-Yk5_-OH`U<-H?92P=+9I+8FDmwWRL|*3&st3f zVG>V&M^w-M(s-VRzrR?9i|fyFUrYND9j8?lnH6k{`Z!g{ICbAAZbN-ElVr6``Rq39 zv$LwiTtnV at GD#TKk8OUdr ziQBXFN;{v*>YaWVkzv3s-*7`JsG*ZcExcZuSkX0K`suKUs zme{;`C>{o(Y~gA=1vTs9)PQvUy`JS+9742SUAClVQUSlzw5oaH?)`(c+v^ znedb0d*RuhypRI^7TuBLr*Pa7%aNpB$OspjJ)NlvTbInuIhdir2{j4!u}8UWp{=nk z8^@i&(L393AyOX*nmDB`yiP|v-iTrSoZ at negl~kDkr8xpbLD$fZ!1M|GI at P@)$f!j zE{S6(ZX at KjU76#~NBQZ4uEfI6D4opWKj%lte_g*XK+p-^0nQ7_a7J;ziI0c(Jj(t- zf!i5_DP{PnTLvb}zJEUH$wPh}I>a04f$M2NM9~xVc at aOiM5##HldCk|lix90VeJR2 z_qqM9z{uBHcYn5m%P=K%+Fk2-Q6l=?qn?oBYDM_lF@^oGnZ20wDfRdje~!H)uFbC& z)?_{5m))~{>zeIr5!)jB&hP6TaO>1={RtM1?x17(m7hFgvrzXB at I+e1a9#)@@MAeS z$v;?S)*8N}Co}%EU65)1R`ftWr}=@19{uFb{(!smJ at bs6rGW(7PLUipK)$4OAKF-E zjT>uPKw_2kSC$Olusux}3ziRn-^Fj<*5KFJyucInbFE^z%o{Dt2RryD#O58n)fF$y z2Y}Sz#CRhqdTHru8~L(7lCK$VbCpJ3b0p2r&9W8JP>^O6g`tZf5A8&1kG(M; z-w?(+J?7Gpf5nqaj(%YNA^caP9V!Jh!2cDpok4s$x2L^ zk7AAGiY^9I6P7MLb}7V8a?}@x!X$%(ofE at Ochnj{hqi(yg at fD%Z$gukY9E=a$RtnK zdG}4U;9qrlwbVCo?-(qI(ZTQ-iSn)(l7Zu%u1{YIw!@6lE!j`9tH`s#u(HL at J9L~> zqr69~3Qj2uh{&TrAuToQ95SR(UmXK=f$L}HoyE>#Up!FRS>W?92TuU1HNp3AmGPEl zXv7E+LxN(JUXGLTNOr}jQu;P_r#9DCB$24~-O*W_2!n`YYd4F1Ce~uORTY at yjbaqO zT-V3y9G!a}<P4g@!0up*g|S$Rrx8s1{HTWjT2UM*tbIHoMMCt={ZVE5JBUsk!CS!`ppf z2K;FAM)i54ok!9X3 at 6_zLjX^sJyy49K)7lYQ1ev5<>tc-DOK}DU{ZA*T;8~K6ry<> zrL4-dEcwJc4_JX>Xrq6n)tY26wpGbm`Kf95E4L61Mk#MaC*`LEZ9Wou8g+f$VaHpyhh|($cLCL`xmq=Xb>Y5%hn%B4|QXe&A?`W$S#t1 zf at XMkMJn?IPL}#Oyd_B^;L3I41MorWx_FnidWGH0)GRHPHO+zuRhJG?dR7qqoch3LxrR zRup}|SuIB_DQa7`^!(BvyfDY~;Eb}fYhhgZ0<(ArvVMZ9!CL2 at Ke_~{mYv#j1pPoU zhBR-#Ipv=9yY8 at X_&_^McPkQBu~Mw6jDPjVTrI>ba at Ca8V~ zZH_iY^Q!tRm`uwsc}{CLciZvH9~fA*2GIk5#YC2;=%^;f+1NNX%*1G;g0V_A=7x at O z4}%8|3uDjJ{QIGHZ-i^rZ?tC`X;$};)2nhXTV2}2wr8(%;8{hbN}~k36V53WlkQJS zKc??~o)(&SP$`yo)n+G>M=;sZ7WYiF{;F&?D_^!M>o{4NMXOX2bj zz86!KwSgzB_o~Ic-ek_FrHTTcE3ULX4(w4lqe#3L at WI*(z#;h0Js9ncEOr-;bbNr{ z(+YxuT$#jJf!SKKTtKLiLLr0eE}O_=xe1cJ#7Oh7D6t^r7PWxIyrjj*d8~tdM;(lfVg at v86$z08=?*UE4e&jog15zG}QS~&rkG{+%~5{sxXeh`GnlzE8Pp_egrg| zP=zTP6Wclnp>O0j#M5b(;18Imwa|JyOsSWhx81LOeIOyJYfFY3k`-eIeK0{nQhV3t zsGe^rsJJUNxAqdK%KMOmi=(TwoC_e2?T0%DwMH8qQAC?-j#vKD%thw8!Bx>tDm$aK zZajEtbnM-cp#XopC8SY*cYtu>M1vIp1xW;mgopZ#rc zJ~ppBsvlH at 8xEH3(LOl6gD*JG`|#j`maoV!=pRFl{-_?KOpo_U8wvB;;VI at QP4}%s ztD7 at U3dIz9LMH%fljvUUECI&HOVl_)rFuF5Xyg-TwRLBd@=9?TI5DH+MyZ`Cc$k%o zv3sjSTJJm|=o^3KlkwDGck-Kmil=ax-xAM4DcQ)I~_HEtB< z?)Qp=Cw->1zr*JCw$61g7?+fH*z>56p1iZlf4?xl*&{(AS;=cw3vDf(D=Rv^p#<4VX{Pdr8YhfU)j=0b(}#|R!JIHd{*R1Rz|F5#Nm1L5v4kH7*o zFadSu7kjU3$My5OJ~JNIH`=T*P^J{$sFNeu<|)3gMlkW|H8>?pz2K~00f5$@KziaN zJ}kD)^m?-}9Yko5Eg~{d{ESig_GZ8M+t0wuyuxsnRbWDutyCsSl_p}U7NS}`0fnn{ zG4Z7e8^cw0asbi2Po|^{Q#%&daulp^*(i;8aR|vTsMy>-DH`%$4nQocV6#ui^m!q8 z_KoJ48pOne-n>I}K)7WxY}))=#05QLy&Yg_^9zrcL{rI(6OHC3;r*pP1m!`0VibC- z?8j^7%wD?MMDgTAv6V#`XqHt>TI&2jV&Llv^MVl_S$E+eOXtc3({==cjtN)D9TG!} z`ii7n`wKZ9c0gd0T8tLx2-?J{qW~KL0zy8RSCD;FpN7=^DvwWEg9~<@V1MoC+7nz? zJ`v5aSrx+&T-Y at FhT9z*Ydg{sDi_XH3)HqEu7k+eJ^a_#zjfqMu+FSc{SE>G|F_xT z|BHYBvk{=uf3`)(u&i5xiO^n(B2u at Fb}qadR)<2dsf0(dvi9uOUu|^UCin0W{R40i zc*DGfE{dGj2uN|d)*e!((>^5kaA{(F at Y|i9xoW#16a>}m3l6e at Sa5>d^TumxNA5N| zh#UywoL}voOut--J7EwhBqR6Gz?*z%A7#1 at jU?|VO;K5Q?NGDO zoK0z~)|-56ag^1O+Vs$4Xju=Qu$XMM&Vnz&K`3)wrYOj)$h+h2Yd&zd(ozMqc;eQ)z?5hDgF at l)6+G8GfY(qo=G!!ikG5HN-itr{~pHylQaIWgggS*Y|{0{9Izq(Q@ z(eN8J%9wVYwQu!_G&fg2?UfXOA$-5e|+!UOci(m>tWT^#k{b*1U#Y+o6QB zJ$hzt$1IJXa|xwWBuao(?F?1AN2w8x*@s)di%V at Xot@|Zp&xUWq)Ir)&Ma#4!}=N& zpzrE5b4BVb$s<4BM=GjFb~Y-i0uz}`AHm^t%Mk=C>PJPqOuSFRkQl2>hW^fm_ee0t zJPz at O{JwGan~7^d9(?EXJ{4KFUzN(1XR7lZ)fr&R*Nt6+yR`NCZ?z1{M2%cG-#|cq z|CKFp{H?M6Utl~d2YWGR=YOuePF2=(SY$%uzt$+YSd(aD<`Ce(B6TJFM&@~*0cKWE z7zN4kehp5`Ds6kjwfTjikm|Vyd0T|EDm7Ga`D19I=lPC%lymj#>+q5jB>t`-65_hO z{$d~t)`NfRp?-!b8HUu04~-&K+wbhBv7rNYske4X8ZGaU6U7CUAYi0cb>W&>^)p-q zpsf&q2Db=WG1NuJjdGGeI2<|!?<(1vGi9Y0%9(Ve(vg^eYqi at M2Ctfa`Z* z&vP at A6flmlqF6?GroYI-rwjB=RYzx2DiT^ob&gF4WGT|UiRtS-O0kNH#d~BHX;4FA zisqh>-(nc{8LH)Sw{Qua=;+KW;w^@D4j&Fy<7r>#!?+L8Y1Z(3QY!i8nLAyBTzP1& zAoWPcsY7r1bE`iU|BkUFP{O{_R64guP#UE&2tu^qm z`~Hw&5e0Vr>Z0Ium_Rfk+9^fTkvk128R%sD95!%$8CBDqdB|HJ-YkV$LGzap&-8WP zL+*|4bI#|}@81d_$!n^}!-H6=L&ucJA}EJ)8H%@(VlYFeYPP>Izb7K^V~9;JKseV zy5j^I29d^jd`x$;+Q4?pQ`|ec?0#*KosaRB8r@*klFzCc4e{1bh-ULP at L}h)GW=&h zO9q#ux+A%=6b2so`4g*+G(2Q5d!B*nb_PuS_gtn}>ASwk+>DPR3vT0SBp(is$)a!6 zV%z!^!%Sq1l=Xgl&L)g5Y6p0eSf9lil!re7l;Fp6daE%&tC{AiWtdU&Xl+ND+Hno~ z%s0isc9ocgzxbNfp&T at 2ZTM7)XrkfVJ$_ z3&7v at xAV5b;#SK^d+ii8wRiMj`-A!M#kRPpe6#}~{&XF_G$$bK+f`L at qse&P9b8u5 zM0>m)UrhpH6T^+gl~Fc}v|+TS6_Em+8LsNJ=FDg*%W>bs>y$sK_VrjglO#8ABA^4IhO)Riv1iOZf;^Jc4V` zR(Kfd3^by9&wC6!%%{ZnU=}4fvd{P;X4 at wauM`;dg`eAkeu8V81^S6=@)-7pl-K2v zO#JR$RAPZDMzp+okwGam%`1%epH8u*!1)dOuQJ1 at EE&)E%c%+fPq5AZdzt-1Un>6v z?QJuVNmr9D at r?*h6=){wyz4jv1q+b^g(iuNU%WEqoxY~a%q4%VdxS2G6bvL3Ywuz! z9HF3?B6GRncR8KPP3B$Y+zt5d84?$blZId2t~s0)jgrTs>2VvQxcO629Vhrj$j0iK zB(apm%vZw7Y!`WAdxsj>m>xrBWK_`1H+2AHqcp~1Uce&@ijWUe^5O%hb+67iydsh` z7L-k5N)qUDD*T+PjPS!Z9g(#ARNz6<;%fbk8N}B_GY=^oPhzzo&@cD1SbfAR41oix zswoM&uCu3KGzV4?h38RWL_A8#Lfu>blX+a0Xt%0+D>hTCdxo2TX&=R%@HS&6cLITf zzxxNTg|F0^U|`~0d%(@SBMIn=W%S%{2Xv_DmyXfQRvL5qEyWE3p-V)yGN!7wtxw3D zHmSp#&5pOqEuS~4J5yqzjMFg-8QZ_I)B=a$)=`@pkWJ5_Dv$KQQB6Y~2~dU7 at HRyT zs?&gi$2XW`8P#5A$)8HEvhAvKtxTh>T3ZHTgMx<0v-8!<4&VOuwbL2*GSz~EfbheE zfUx}^keNjt+>CAii9k}5aYa?b`YN?!v0 at 1;4pW8|rnOvDg(iy7tbP`1Xi>D1LH1>q zD>a%hEu~0q-7`5?-uBjQe*`BHutuaI*gl`hW!Ua`KAQpcf0;4O0-%MN%#7#q{`vfQ z6R`E?&uJO%YAxtm^lFi1zbYCf^L7N6eB^eM(zSf_DytG-`04O{u%c4$RM7Vpw)|ziq5{J|YdO6IWiqu^C9H9|)aWpPt5Ubs@$5|3pT05N?)GbJ)xV?= zm#Ye#7N*uab!ZZ7pBbnS;>~h=c}}^wCyA)?J$~sx at f{_oWHrR>2;jgIa at Z|ismvwd zUF4mZ%#AO6jW92A#HHV}iW^Cn)drt1Qw~<2O~LQ_8HM=F(9x{9l%=6t4pd7vrSpYp z)hfV1Ubp~gUxby>en;5Ry<5Y#Hi$-ApJOu0Mm33BzieuCU?L+ei9(({1uJ2MCy9t` zTVPc*usN7gLHS^o5H(nyokFf!{|^0Jr<;E5rHy#!?G$Qo6uuVL8gzCGezZ+1C|b~2 z&2)t=%~h$VUcb^SD%tF4rZhW4USuS}K7rcDaBx-|Fpi$lj?)LSRTHJ9Ry>$B3(zDJYqx_wZ7d`7)oHRDz`d9o^#+Cta>ZPB>THCjKve&isHG1GbC9e!MC zUg-C=?=zL9ocdCy253*wz)YGpWKkh0=VGEZ{6epPt}}vJtX7X{M;Q%npG~+k)=RZc z6dfm_fRfTy-0b;@PYi#>i#Y(H zXpi$Q15E1w$J#qadG at 4PqgiQH+O}=mw(VcqMx||MR at yczZQHhuN@u>+Gu`jpf8XhQ zd)Ar{=d2ayTSV;ViM``Q?B~v_$eTN(ZQCENIx8s(L37$%`HY&PtQvK}C;YWS>5;D* z`(T#=%N_+QyHBpG=`ITBqVMDGd@%@OMwCl1^8tXLaxEY+Q#~h2`hamdM4Eg=`Jw_f z%gxuzXBp8TaR#$cle;U`gP3xsjQT9`;~Hv at OK^DbiIq$UOTuL-?2HE0xt)c$jH{3a zO$4<+kf|KuJKsRsxnwtY?)CjVnw$$Qu?p at Ej-sn*b>BCu6?0j8%ZuAKvUIpzOQH5x zOiu39yz21P0^PzjrQn9}A8d#m6<||Wrf|FqPO2kO|Lh zdkL>pi1wKBqWhwIF7bGdwvDbgxhj_Ie`Cq|$tKuIywl3+m$Y4Lh-x_irwDd?+5-ed({2X at rQ#rA)nQU`B*xndZ=NY1;MBc_I*pF zdaz at i74FrMd^?E~P=`<6wt_9BBod;|bc&lu+5X*79fBb2%dGYj>jI9Z5xb}o8#6-r&UlEcvU`H)vp_%pDgPfB?kfIGpxypi_J#jv)f)awsr^&E2Bm-0 zYgjCX3=pO8MHwtab1;4wr2?nQ$QXj~?}8sM#NGT`!G at mgyRz{AC`xj>bs2(1^SUGF zc%8+4{F9TJo8Q;>4Q>Y$PgSwk2Tm6590$+c{lrk%fKah6WmjM at y!oj1Nlm~TA?;i% zkpr+H5K=}(`~^x?(>QCZox9 at 6gFxYOS%;K%ZB at WmJR2VYf1oIlHQ4oCLM?$~^4 at GT z+L`F47=L91UyBDtnI)@8a$tHj$CfVUL4@!*cIX~uUN>w0o=^_i_EGRNYpmXty zM!pDNiuvJ5w{o(!-?c-6G#tn5?duzY#dPk+5+}ys at 2D&@twVugD9S~1B2YCgb)||o zwrG$?x%<3KKh7~_H3W^fB&-tRMdlK&*}{6`D3=68XI*UOYH7J|pVf{D at 75n6zdt8j zY at CIdn>B^MJK>~o&^T$Jx_{{Ni{&zQ#=lFTM{0~G#VDrLS7<(QI_Q}|k0Yy8 z_bk#bG(?{=Iac9CumII`zL-SqnbxI>oS7I+LR|<=j1RW9N23ZgT%6HF7LAv4n>ai{ zM^=)Su8(k7wI()PDRn`-1OF9I3W`LPfq$?R009If^*^%4|G#kh&qEo1H^%?33wBj1 zy2|TfD7 at Gdebp9G0E!oj3X(!rj$Q-_3Fy2Zb(CfPXvlLj0jM=M?uH&n%PP?zqdwL+`XU<@nI{@sCD|BFM;t&QjKxyAI zeda)AuAA7>0L9>%b${21ND~-L at z(6sV+}3^eCdfY at 2y`Nu zAkJ{Mr9eUqSQ=IQ5>2N_M;}e%syuflf;Y!`r?F1~+`%vpZ7}b0pa^{~PYx_IT4C+6 z9QKJv98P|MVYCw6{q|>%;}s8Zj5U-qx~eX;PNloQj at 9LoNh@I4TdE%QaOE=v*E543 z$@QEHZ0tC$Q&&NK1-kW!1*zW&1a+*vr)bQ{Yntxabq7s~9%psosuAt>7nhjI8y1Gk zX}M)^42>7o(d3srU$JoQk#>d<#p_PQW!GP>RRaOw=IJZpp10k;gz*>PiU zyFD&jNZ6l1{UV3Fi;SMg6&lR7wtEoo6b$On!l+tr-}{;_I8uH!LhDegsV!Ixs_9-r zsBOflB at r}VWNCyf#azBrDa2r|FenZdhm&J1qGe+}j}9V4f{S-O&NtKm?VnU!WVTMhHvk17kPZUK5$)|0bNfg%fhek49AhslWX8_B)Hyw~hd z6)j81#xEy4SbVyL&GOstnyw!?Rr5A}yL%3(SS_A^PGEebIrfq#f<)dt$**L5h2BGL zhnuY`6ZTHB=I!2_svG0 at p~`ur1Tj+CH8kAaJMnvyZ-D%T9aneH=N9P0CiI<<>1FxE z?>=F*dJoO&?+7ac%7Iz|5g at CVU$8_ zgLkfB5QS7gW0X0Eb(|gP`0KZ#8pkAZYq+5qhT&q%4Qj=<*f!$eS*%up>3LjWL=c z_qiZomlQ&N=CQ?q`NdC_=v=9xEEM zR(->rhC38_lVVO<7tZKdBT`1a8Lm^TbK(I!HTj*)$BPk391x++I#ru9H99N? zMxw&wW#Cok$<{|!*nWqtH7+>M3q8lP&6OObgEPZ;=O at u0wC_F{f`yv~R${bn;WoZ! z|1ylaqfBZbAEb_Vw5#v*xKLBUl{O at C=kR9 zO2{@~&bqzYrn2s_Vr{K7Q{)%b7G-`FVxbk7GPIr?n{d4;Ge|>&D8d6f)LK9Qe-A!s zcDhKUmSx2Ms0t4Xh>)#o-L!w z1j8iu69(J9NOZoxQlN~8Nla1{bfTHbc;Sqe1TydWq1gR^^Hz9}k<=Aj)6Pfr3WVR`MMa;1W}pm(d$5%Jf$rM$Kr>3UuYtE(`Hj~h<7**^xQ$@?zU&u(C->B&Z?JUE5##zE1kY3lE}uO(srlP-o%yZKZ_G1tNsRYuDrX|S z!sh+Q`3hSNVA*csM47`foDL+j(pNlN2*_F3oqd at fK(rxi4t0z~0@!ZWH?}{%SFHT> z{r*XH-`+xx)L*-&^OZjYS%jG_r=6Nd^*OWDXXb4wsI{kL;b!DZFcDPSFD_E{CFgSK z7F`TR>T*BO`K}L0Z)n?HGf1XWPmWo|(Wo+G_rKbJ<^495;Fet(`e4KBTk!!_=@OJK zFV`So9L&<=wV)Hy2;<17bzFBi{G0m8aa=t%kGApg zP*^|te(`6GLGli4ELVf_k at 7fT#`Vd=LUM+FP at NMh=1 zjt8EM-Nc=;#=~TCc5AHPy~b~7_{3#MSDL*22az{gYxg0t4Z+8siX at qqS2rFDBBCdc_R0x5Xi9|_n3lQC}o9-3sl3) z?+iGVcCEo|Ll}Pk>{%s0YZiQ=agr>ceGuEh3eUmQS-S%{wU<+i5S-n&Ut?CAVtmdG zs0NIK?(Uyd#1MCquHX1brZ;>dzfX+nb6{?9^Gf5L8cM*({cbi?G*KpRf2Dv8HhsYs z9fndCM|CRsNf{$^3zCXg6WG!(J#}D$AXtg*F*gT0pVXD}Gc64PgXd1=k(JkYP0_&; zv*je+ad59(8b at DxAC}VI{~flnL&xPe?RNeKEk}%WwWB5!3HE at k3W`!B6GO2JPb|7~ zM;PehGeDZhLlg+MxniFv6b?1MdgDtje$~VFt2|~q?^lxQATVIRG1f6 zG#irKZg~uQI)7k`^Te$~b}ZW+6%H=lNyy85ds)E`Nz|P48-eueYIkoZbNLJv(gN~o zVgIg(m)$f3iH~t9Gz~n?kC{DxOlD}XQxh<{*oEo%*I6XqY3FEPPUPXU;j-kuHbG7f zrUoH0O6SE|P_DMOO7Gs74EZ9bbgu2n%hG1NdXMZy at YBR`Gh;d73_EP8pKgn7ANM#h_ zc0w-fHAp=fW>RE~366 at U5=O*~2_AY#S3&7OdUYDfd%T+$bc+Qka(QPMDMok!M}SsJ z3xh2=;s2h}gikOOu86+?I~8#x=}NQL%{ouacx*?M(X5b5kT195X9W6 zE0Q{+3-h6h>P!@HwX2DEct|CwQ5^jd(7ZiMtPpwQf*OEE*nxG{At=FOPeg7N=XoCA z1^BVhKVQx$l+z>63c1ZDl4f(%zv_wKWfjJ-OoKnYKj&3Bafa%asu2md_|CHn!f z&m;(;gq=^l??vkkzv5!w^zDiRtqx at sJ_M=H8}gQbrYyoHfuT2jG61Z=F zu=pWU4I5 at LlOCL|M(;Y}6YiRR$u`hv^=z)YO;=9ooqlD<$3Jc2zlrnKiv6KvW1#=8 zxBWkonWTxe>HkY|W&NY>p4D>o`V3lce!jN~Ep4re00}8sh=7n1E8>AqJMKE^db*h# z^lPLyS+Aw{jN2bEKh<2!xRh#J&wRYK!FfD2(RqKr+;R<6z9LN=EsD*SGB;wdIs_fT zmM4yem-!MNjig4KM5{tm$yn&T9vh(wa}H}@A5(;~E7(&YAp+~=BJZ-1qEsc&3d$|j z&U*101LN7Z}?>Q95qafSMp!-zh zzIo0f;y#A`&EwAH at OCFEw5u+3s&Exv*hXoT<56TKktHRHXCAiU(aE=W^T&9K*Babn z(QH1)o5-V(JkE<)8$*a)e`Uc2d=Yx-NNSb3P>bq(FZdBI#|YO5=7G_?&|gg)w7Jl5KQcg{K6ND9A`*5L`6_mx<5 at HDJ@8ylbhQ8Z3)zxEL)InVqx36jg)Cmy zmC|{J8=1C{gebA^7oD&e)n)e=MhQuV$_dC@*!*U^CPj3okus3WO z%m6S6ss9CtGW`=osil`m8wZJ075U0j)HKIRRw4)? zp+?KY5w=>^>vZe00IueOe(}>J8qx5tSFuc604prwF6YE7-lwA}PPe12U;KVPZ*aK* zStv?r?1n~!!ICr?8bZA!4>LW)A3oOkVWuFYAf_Pl7(=S#vCya>@|ZmaxKO?QA3f1T zc#Ibu+1Bf_l$qaJpqh(njSnG$g3&_>(Z{wb#HpNlT^1mp8R4gWV$rEojjCVz)PKP? z?Tyfkm%xtttnR=n$Iw4#w(1`5hHJx*B)SwHgO}KzSb6QpoZU01h$qujDxQTipf#d3 z at hHP`9#8PPUG|{Lz7?X5!BmMl9Mwe$$KteZKd!- at e`E!mT7cJZ|l2E-<#M=3o8M)F{l&$n2vA~-vRf~QO2R7>$A z>)SP?b8wAk^^PksZw%4Pl(V4veKuXu{PV9o$Io{C!>*f1jVG5#0y2$efrY&Iq zt~b&upx5X31vfAt59P5fpJ7Pt=Rs51=%EEe zMFr3tIbge)IH?NCio!)gpFyW!FnyNsR#q}tv(hroya_$vRwr^JRO3B23wK$8We at A> zZ=b{YOgFxZP4C)VWv!z5354mcH+_V{axbPutw9M}>OXJ@=K+4bQ(!o^Ei?XtYm#9N zHsvBOHXrv~NK2^4?8#--N%eY*;ly#YT#X^mGnx at e%C>kbK4vDVP*M_G8iWCFq6MDb z3vI?}XCd=`Y4b2kcm`Q^9GG!^lW+B-@`S#!Z2b|51x-P%u~Z8z+)uS6VIh-+Dm=G@ zYHhJHkP`C7 at EO=F#f{IL(woM^6k)Uy#+nge1OBm{w>>z^_sXKdRln+LUb6_m;U$|y zCK=&`CKXHRK2Y0%iOpk`jLC_uVKsGqUpgf)Lh at rj>dmW6_TYL`=R16q;H&DFaVZ>R z-0a$d)=|$cjuWJQczEW}$y*yh9>Ce;#M0%j)JXD>(@W?Aj&Nq6k8g*PRbx^8uI$%s%TurGOxx6i`k?^QHYZWhY0nPdU5+lr`R2?Qcj$&Sm^`=1=RaN z*{*~tQRPP;&4+>B2Qo7 at lT$)jjHxY>p&cx9xRv4bc^YYEJ`8%R&^GXkM^v`6iBo*m zFz-q1*f!8#VJWJ9^gHbjEJglp%d-CtmP~&&WwOE7;gr{=zEcP;`4n2Vc}wsm#2Jz|f|T7A2JTDAk4cVCaS zqM%S(h!>OWZw-OMl}vKx87kbHKq+3}sv3!k0nMhkQ|Ye^F~>T>c!h6E{3A&rzu&`- zmK$M4eWwg=IkVqJ=j(SKbbOi&IcLK$MEZ3t#SCj5>JA9bCO0uq3wE>6CPF7n!h8+T zU7wa^oNzJh(76YR)$SGBM5HAEt22=1)-ZX_xJKNcb3kv#M5?gOvW%-o;a4N;6<+QyjzFDvxe#n_fLH at dW0>wAO=&jRL#0Pu$O>`}ZCgG3`i?#_ zyp~-H95O4hVB3wBJp0JfVaP!5 at e13(D>@Q~MB5FUx%ptJJ+DeP5iG}+t^PgNX&i~~ z`yxv8;x9e(d<6i%5Ub_;jzH;B#z at YW_g22k$syavd_$W8KWb|U(b=B&umUtLM6R%k zN<4|KE*`6J-g$y?RP_XltQB~jjMyWW05vP0ZUv)fD5H?R9U{B at 8%Nct(J5plhi{O^ zEynG2{GLs|Pa&jtA8x+bKnY{SFNM at zjH@PtGv^noom*rQS1EFdE1ZIwXOIi>Mlz*U zU!uln);xBHLkuxw^=a>u_)GJo8`3*w_lU*2g4Q>8f$Y5zQ8xJ7uqDtB;5!TgI_Y|v z?ERrRNK!oBuYZC(TIcb~-|mMuK>xcgWd9B1{{eU#<#jOxUpVV=NJPB^GQv}7rHzF& zBw;;l8GyUA^nM%~xk5s5G>!g*;>$t2T+(UiXTGn6xfU}m^T)Rj#jLAQDuneygK2j= zyQViDuZqq2?XUM2^dA80^wuy@ClG2frRTmLVPpUeKv8Bt-c^4w za~R-Vwp{b-0A;0>)aaf+SdJ#&q_I4LP1ZG3>~9X9jr|-#sJly7vlhWDgMwR=Qsb$& zc<7;Il|2zE)mkV`{@_EW+BNWjyL$sHY^f%ZcZA{DuzwC4E?Ogm5hzOdVyQvx^cAk_ zI?ANvMNl->O^xnPSW) zMUTnSRxBSat4Uo`=uKDwdtA?$Y&CA#1&E&Y8MF_@`{MUi1dWi^eS*k?_K}@cM^Xix ze-Au?Hu=2(kx8saE#qi5lj4jp?GC%X1dw+llidr_2#G zw0ez|s}#Tu2Olu8uz=FvpV;vzSG9Z_{BVI(sCg%}y$c^?dlQLkRC6v7GM?0l#M(vV zCPGk}f3M`}%(mGJn-1r(8VdIUR(%l=3|vgp5$Fa8Y3C9*%lL-1%MFuy>$=Rq&N3t& z0#l``2^p-t+XaSgN;Q*wj7H`lZifs0yH7|j#{dh|UVHs|&lu+E!BxzTdIwxjvowIp z>sQ4FMhIM at r_R<9oXg;I_*?Yuh2e8AZhsuV=`hoT^QM(^jqkS2&8Z!$k at V^#S1M}A zsI^y4ON;M&0u1fvq*3=QzwA7wZm-JGGF{t<1Y963S;#lunS3?30uMQzqMB_A44;(~ z>;kW}t~`*!d4)LdSl1jPK`e%!>%#K3_??-BB);Nz>P)|Ppd}O445DyqcBvjjM83J_ zSWA$^h4=6gWQMehrNHaA#7*oKq}j)~Voh&|TQalPLF}i36srVvAlCh~^JLW|vO!ut z<(wBrH0CA3$7O7eeK^8SwESbSr)LCn4jaRo)WhR|!kBTi7LWCAZl;BZ zDu41LSXP-95&xSX5lGn|GH#Ow}zvZn!-Ae&}4< zAi0A#UyS^jFW@^KH`32S+r@)U7P7T-z9ZvqFfH;Ezwqqn#EDIO(yA9})>Oa$$B%C2 zKWPMW1fHtqPiy_pL;2sP5eq{n3wnD)V=F^*Q(AznncaUT4Ov-U_-}#;KIi8Oisg$m zO=lu10dXhCbo&>p>&d@(cWWr$f%v6pkQfI$Qa$kR-M6lQhAhA!fmy)Tw6%{Ir<2Y6 zufq3;NqH2^>_RECBy(FRqm?nQRq}`?^B9-nm6uR}3kKJn;vcxjSPzrx_B$Y*^t6nn zs!EnIugex}iDqJL$dIj&C+FrT#NkwM4!+F&r+%qhGKK4iQVv&tgH*Z6f-cX|72Y)N zr`GfRr(XNPeFxqAlRWpK{?+lW|LC=lwVj=f7{J=u)KU3Q>U1_W2benjgS`%_$~vv9 zpzzYC5c@%5L9>yN$O^43OoevOap1$*X2dC=xA+eg%7ijfR9jXUOJiz+_rYR^i28x_ z$AD$pwo5|6_ySS0z2oliL=&$`CN7wQ)9{~mRoq|kUh`}|`M%w!>VGqFAP=B$M4Z at _ zLb)FiulphDp&em>84S6n5#Qo=SXH`L9--?0i8{};nJ>Vj=$q at 8SCZMTDsT5I2CxWI zbP)5S-gcWAbShbPymb+9i6tkxZ8PW8Wxf1x6mykUzwJV0+iwjcAV95|vRldi=(?Uu zu3WuZ<-FN^E=w%iV5)r at vSnMioYB0w#*$gR%TRTN2N67i)TC=s`e_^rhhaCy#A(I&InRyxQ&iFfja6XUu#*fgz=*SbuO+DJnH5riUfs8dZhf?Q^Ie_;|hS_k$a5+(X+&6ez+O-!i zx2*Q9fu;J_(aGhGspR1U#HWAQpU*?}1O$s*8p^U%`On;sHYX^6q*qiH_btYSJn4MUjPhCvlk zeu#obDGuRwsz+mW-xU+bMTUM6ho-+#XeD$}%1;7b%^22It?Mf^n%D=K%&E{m at p^lR z<(s#Y#k*`N>DOV+8Ku=I>*emp6f$XC#uZyURN{u=I&@w*D>@xK+5I-k0bDtVzPLNO%cX0SZ=zHHTqU$?58{mY(?}R$?VE37}@|*~}PJcT6 zZuxR at _4|5hgWuuHCY=q$mfR4j3D9n>A_(V(MnOS3QC1M~OGx^L8OX!}RTpuZiA02b zkF;mJarEhg1mn4lC95nKENQ{qI*Eq;h~%U`sT7^mxSKS&mT~G>2RE3ef0!LKK=MSc zv%Ha#d)7R;QI>J)5%n2`VOmnH8DqSdCT6%<*HnJ0+BBN6zhLe at X?_)Pox#_ at aqkJw zSrA0$kOP!JmseKHNZ%pKdo&-hj`}-AEky%r{hY)y#wV$!lH+^JM3|h?avS+~ z+YIgEC@(6P8sQ-jRAF}tV~s)Ls8S0-HP~3v#z?(GtBK}!%WSU~+#@btrtDJp2u0LM z1=A==jL#Y-(!wD4DzmkeW|cJ))AG_s4JMrR{57?QM*vj1KuxBvs at EyY1$0YQ at J{tX z8DMh;-JH}U`rfHDYk3L_cFuWSKQ|puDA>-y|D5jRRTO7d_l$8<^jcGI^dYVJqP|`j z+xu$8*@yO!in=@9zDg`>RYj+`*7hfzhsq83XOaKNyp!6=sWQkQs=|VZK8%(mpuhr- zQN%(H)v4^(F6 at HvwZa3vuBK4b0^XwKnO|@yvz>ZaPeK{+4%S at DpDGXMf%VD6QB5Je5&8tPOeC84q_Jb0sz4WTgWq<10pl z4t3k3in8tUX}n~zJJ)(2_+B^f1*bYhB~Xi`zCKjtn@{Td4P)irI3h3Jg$|eC6kdFT z_<^ks%&2e at aZ(|{b;(dgiDJdKv)l=ju!tQ`hND?L6q4DTUkl{}`hSfDNc+X6(m%1F z{zqyv{SRZ|AI|wU^79HPzE at jo$z$sXxVd{wF4z*79D?j|=!BX~Bo4Kp9|B{Q1%>pI z%ZMN9z~LCtA=94}`)xMCh^ZFKha2nJPTBVx$Jt(fpRcbV0*KT|dkP6AW~823$P7dV zdI3 at 78%dx%sEj0n4}oZ)G|=vJxf2A{r&s0srTCZ!<)(nC_PpkGtxQ7;t0&fvNTMY_xtOqvGaUXxm}YsI!?yl&V|j$_=@nDIMeN<8cVPXdaF$wDDHa9jJI2ZXM0O&X(2s&%R>YzjaSz5Av zK3(b;G2dGWPF>uY>oCCbfS_#1GhoVIjOl7GI|_v#mzar4!zc|-SXK;c91j{d*xqOq zqmM!O%f%G5!ypa1PAf#Iv|YV~dyB<7@&R-7 at K>|>+m3`)d!b?3ueuKI+>LW*of3JE zbia8IPD!^InMp5 at _+*ylZx}fH>jJ6jIFcI!6drc7+96_}iE at Z9Q72$VIX&y2Y^y=X z(u&?##)95Zh}Ty7(6 at c)ByCf)q_ z67t#wFhYZb`(Yn?I%dd#F>vcM55-v zH(>Pe7+>HHb{v?zq0S*)D{cc%`6VY6IfRamWy#aLvJoYaL&sdv!&@96M6%Fgv+`%~ z3W)Lh)nOHT|1I2;{2lmz&-{bR<5D1uD7*kG<|IizCBbP*=ZJl_l${+?K*`8^oX2|EtMg%e%;(0)Qicn4eUOv;E@#g} z9cGldW8mX{(nb0mCOBDVRGUvFz$kR*L7W%if_4cJ$Cun4k6^@o z{1s~K0MZeXhk61dBAdS8VNAWFYHAj%RG%7;))4untvE`G&mH)$(?C!kJumTR3SuCE zfSCWyX)tvJ7+Qml;9TR8L>y;{riAZ7FlC~g19!x+fT16507l)obwL% zuLsT_lr)9$y{jxCHy;EtKd}eke$J2IYf)R+Xj!2*sx7REg79OcNzT93v*|G^Fx?dR zR{)2TVoLdU{c-}vY+3A}3OrOAuL^BG1_#ckiR)N))IEg6sa)tRUcBiDDWEBroo-4w zwM!-n4d^jgv~6Xwevu-0Grd05s!}kKpn~+lEFTgEsZ1`ft^%E4+I-g(2lppR*w2w> z-*?w*FyYR-Ysj)VngktdDPpd9|Dj@=N}mYJX`4w}qtL$F;jCo|beTgi4p?vM&+ns$Px?w_hcTb!P2Ty?ZbIff}j8 z{-f~~?b;`==^POn)-LGw<_RuIxik5ar`$WLHs;#>CtY)v3w5YBX{v2mj}sokcD7EJ zqds3;3h`!$i_>jadFX`Z&+4qN1-v!IebSknd3jpea~D+5)zMK&|Lwg=S=bWU zHN|HQYbo?d&cef3LvrVp;=h+FYMdL<7IbxA0&*C&8+ch>}Sy%mVSK) z0-L3yJG2EaBE(@2Dy%PS9C at 6*78+q!ZbpGo#KY07Sr9DA81kpCysc2Xwxc+u?a06= zWDcBFad-bj=b$@^CVt8$QucOeMy}tWKC!di0YPdIYHey{Luwvn}|;`5ls5 z`b7TfB99qOUxr2O8(xt(ZXxR)@xvMq!J~#a!{Nq8{n?9~nHNSmdmo^3j#Y at C(1BR? zCzv5<*}Xa#K2ZZy&59%*Meap|RLx(TqA5}D+oBW`t`}Gl;os4yBP^DAg6HFT0zZ<7 zO&)Q-$S39UA2yG;pXH?*i`#{_&93rsYrWlyN`X at 4%-)=z_4Cn|+ zmHZ!MT9#IP4yy#3Z$-YJPc@%wZ8!B8p+}WyfVnm5N~(va3)q$_#*BDWXt1HElo^-# zPTdOu0pANlHg9_37DT`2hEml8Dwjyx$dcE-PLHL?VC`TF%hgIV?4=t__>3jr#hmD} zy#W2Svvth7OUDpEK(VMmKotL0XaBRSlj^5#*y^ZX(XO(^G5c!{#^&iqX(}nm(yntX zRndXVYQ1&1cBGVqQ3rKAw-#biV&TZS){?rpg{C(CNJ~m7DaCS|VMjP{_|F5J-a8!Pg?n1zAmh{f$D-BNws4Z@;t<6osAx2tGGr(S1g&QD1E5-0;(8FnIHdFGm?oo;jo&3G)ophKN!oA7Lv>K$8N|K8mn2S#C zp$AisuJWh#<{Y1H4ZvXA44=dh)$2tWvs`Y_`)|hlMpa|pZQi8EEKW(iR#>b>nL!&x zhUlqMlhUd&PFGCs at -yn+xTX~gW%K`I zJpxZUVJYydV{Lv(ym zW9zf-vFSxYiq2e at iIJ+Ri};cx8fs8UYeFH=cBEDNT11$;B${I*<0)np^OkDrN+>T! z66RIb=*cQllZRY;x2-?!A90SmJTJ<8RNd9~Ob75no<)4Z!kM(`jj??=M5Wo~6;Bk& zoR9d;d=6diuf7Itl;9oU=}oee at s=Lyk0`8Spg2_Uxpl`sC^tJr%YYLa{nsGO?-LsG z(;1Iv^L0&A5hG`!(p!|M3>Dzm)plH%L)Kb!O%ZXGY>MRjm~)RLaZ*ndm#GOuT7&ve z%&-}&cL8EpF$P#J=Dr`SW= zNk4xl3wW*y+TMLa+UosfVqJGJez-?xe#faTSMIn})ecPbu0}ySvg(LSCdP?$9fP0Z z)xMvF#0MkVSK^@8(_3|Exb+$s^kgsHM{`8N6O4?sHJlN&&OyHmQhYMcA!t|c>DchV zW$L(0*}f<#C|aSW7KeW(DgI4&or91ym at N4xR%ZP|5`f0S7S)%esjxT&qRN at Cpgz;r z?Lg*+w)#~eWwE#Z7||x`7UeP2C6$#(ilcI6E5r*;U69YC22r)j`30s;dQ?YlT)9X`PL zjL_Vl!&Y|=iHkeo16j5%ud)W>##e>;YphNgMlpIzt>iNlFkGx2K-}9)Z|A1P`M>Z9 zU&R)S`AZ*YG!L*;UrOst=ApqvduJ>7MU=dhl-xF6iSEizJ@= zgsB+hE&+EP1w8~+%nk3bEo)0Gp$Ry^=$7{V&>(5frzIRKn9%veo`{6iVI7I1&Fbsw z>ALv&hKo9M2Id)6)o3%%dZ=fP!Tye;0_jM^S6C-I30MHxSr7v!_x+OW}8v8;^)z)v{MV zp_z}}ull05G;Q}dmj@*G3~iys*E4T5zS*>td%vg!)Ay62_Ekfh#@&F&p;I_I)BYkT zu#LI8Yic>Iu(BvQx%6rK;d5=j$F!nP)#JL$+%Z%;3kIi#S&Z=ORrgld1cbZ$yUp)2 zWUvc;z5Z|aVoev_>La!kqqYJGJgth&p>m_Z(YTA9F&=J&IYpk2?oEE5it)ROSCIQe8Vto*qS3Y5}vcX z>x3&KzqAH8X=gT~0+YyFX1j*IQtkGE=EX}XlH4db;z=T-Z#g-LMw*N{N0)=g6?mC~c at Nc2H?|{)srciVSya{uvtIKdO%KUk{Hmz}D(N2PZmVT&_<5CFD!6 at JFe8_YP}& zPjoajdL^iklCV)Dx9<1JLR=c=H91LdR&>4}@TNa8C09yq&_6QfYrZ(0=B8_&;DOXR zTRH}PUlliC?k^Q at 4(e`hcv*2?LPedOqWE`X)l=8jV;|86p~ zHQP+pM5_J9ZdIPXS2Rjw!D}LP3w1w`RH9>dD+XCsx~FvFcmAHL!G*p-r>s)a@(GZe z`I&QM%VOqVj)0J4P%V~j at Xb`f2{9QHcbv*H#f3(bt=76NKy{pKiDtRZuq~W++~#7U zwSqgT*8KX-0-)x646=j$*Lmrs1`dpH?IXBIU9O at t?PezPw8KPrWY)_E08c$sZ^|PaLa~@60vt z&ie4Aj+uz$YVG(EFnN2-r;$4^Yg*{Cd$up&O_juhyZ5SwmK~1%?eeU&lyDK?uRD at y9f<1UMp61 zdn%s&E6y%qt8^z_dISIcHWjm*fW=y72)JT{}@_i z`8eg7FMjH!+r04Do4RlePZXWE*ddWJc^MtClJF7(GMWvg83!wCZ=<{43t7LOG`8q& zY;Zl0*`S?We9=W(%qX~3OZGsg at SbRmFduQtIq1G~XD3!-TE~nq=V(``+Irdc0$?k~ z=^WnXRi{%!qO^D3j8u2sLq=L&=xNR&e0!)xxYroCYdf<*!1~c|sGa;JkIv#RQ(1s?!@36U5|=q7kaZBO7Q?jYHTnQ?;sU~mp8MW)IcpQ#h-*C;r{Mw)aP zGnk{7v=BL5p{&LbW1u4UN~Frkc|g>HpO(#FmCtZ~b;s)MMgrCSfq>A!PgGw-DlbKE zNJE+`E?>MblZ3XIf3_?UBi0mNb~EB;5gGD0&9%m#!xKQcjrF=u&vKZ_?^nV{@8cCg zB*p=hYI%(y>k6<}#rmLQf+VRIE%yy%;|p=P>jh^o)0y*lpCI%rZ>39!UmfIih*_+9q&u`1fKz0R&hB(W^28K2`>^oGK#eaA}c z*3H9fOCkho9}Y*=h|7ETiV#D7eE7DU4(E7I!qF;6mma#{c{${6L5Ojp(CAaJGkZC7 zkZ81FpuM`i$9<;%2u*1Osn4hqHyoFKkDE^P`vr5+$?&l6Ieh-;?YV`kMgkd|GBrNX zXB-NWmJ;?ha)b4XDNZ&!kEmmIoT0p1WXE9V0ij5rD!S#Sn5F>ftW$=)rg z0>K2q3fArCUK+s>P2W+&!wyT-GW4cpX{OVxa#XAloA0}E=LXEG>@|~*P1QGKl~&6b zOHI~nvqDj^pAi1WwlxTX3~#fbz_>rJxaKFA4an}hsPyDDu| zle|!H<*)#Q^wn)R2xFaU at anhL%lgLkI|l4!PO!>buKy at hE`W0FGzLW)ebv7Y5`Aj% zd{OSWEP2c_e|6utFB$`JMOhn1d{gkkQObfPJ9xLhk7$7(3PGlvHaF$4|GOk at PwYrf zVWpayUx-NyHOoa!mP(Vgs++U8SIB!tL5&@jlgB<-eZX`}&e`21zn|)nZ at _O5VrKWO zDTK_SOpghrc~qhU zMuDy*2 at lWBz! ztC+ejK=t7yIs at pmA)okFLkall`)FL<_4G=Ipm!Xn22(7Qrhp{$O72EV1!bbVM%@6O z-XLp!Mjur=O1K|5H6?NuW&|a&Fd?_G67eySL&et at lMnNR1B@M`dWxEFIfxuxk-}NT zyqkF~tZ7m*N`TK9gG81fDX;o1Sy6Jz3JK&n>0iTvyz0K0O#OU6`>a#vo_iR_8WG40o3=x zSQfym6hK*OtsOogZRQ7*e_;(tQAr8^?-I5~&Phr6uOD5)-I!Iu@!vTNrZ=)WosPHc zu0F0_&md~_zRg5!gDOOa0&7Hs4%%zLimTwbT*}CMiSzK}@67^vyUPsL0Rcb%%!!Px z;K1u?eD8;18`+L}MnNg<7xCzvEJu&kB7SX~T7lp?Ff|oZ5)^W^SMX)!-RhO}5Fjp?)hq8Sy{)NhHOoK6M zg$cj;xV;RpWNu7mW&#p4Mcni8o3MwnQv0C{Z)-f_*s_bZN)E!$u<Gaw~j3Ry at nYLovhX|1c*Huq#bo?~Qcy!8s_EtF97_-+0N%+S7*~eAe z at Jv=u&bHjY8j~FKgo($0&17A6WLjk(mW#c0M=E|tl_QIx2%N37xy%+06IZQ9p5NdZ zk;0k5(q^0diipU0a1BqEYZ-ApYu2<#ES(ZzDW}LD#gDpTH>uf%+4NaM*le}r2{$dZ z&9z*|n*2ejuW)|Za@{LCY^6h97)}`Ly-{+=%tnd99!iu_rON}gy}W!=d!d)(6%-T} zKWcZR44t(lXl3{HAVPP at X}j7GRL#l)S-1;BEwT`v-V$R#nrha{1M`gK6QUR>&4oLMMPldRwBeo)$MjFgjm!E(o>=408J5v&Xb`9SI2UZ+a6Jmmtpr&q zqv6y8XCeH8%^-yN?-WEb!Y37KJ8~@5PpzSBkLcAWTFRVV@?H6u)ShRx2<(j-JoeR0 zN8-KUQT?^8H?)oYmhmv5XqyBT-j6>Q#RYs!t#!oMG}Y$e*KIX~@p(6m5}Ch|-Qmrq zQ(`E$T5?(N+G8+OJ(KmeF0clXG}o)mpXOL5#xjr22b*F$1nZQ;pH1Rcr1Ow{-Gjg? z3*3spfxT8OHd7ea#f-|7>z7D)T}%!;QwVY6ud&SSs&f%{{M_vwn#H)bE zU!N#Dsm_>syz5SF6S~h>hF}SyOm;^qu8uOcGx>borSETTH~@Yp2EoUE!hsJx at 8e0; zW(+V)VVa;0WsL0;!PI05)*g1J0Yd8E75*VoG2s1mvBk4o9IgcEYTXEkA1>`N^|QlN z^!s?wZuHQc9wWLkl#593hZMw3O;_MT0+E9ENZ`S^n1vL^#tCM5oIT*f)WWEq$?gu# z$}aD^!t$`+*L4#R%rZ(AfmS)u_B5R9miH3UBCnsx* ze5t!y0w zEzvNkk?jEmRh77+XW4i^rey(7{V at i@BCwoM10h%0cR#M*?8_Pt_zEvfdv(pEFXjrj zE^Bec23J)4?5zv!)AZnVr=X00 at xqLXhACL*U_msrF at Wv@fB_>e^=&uUX=zMeU28 zMTe7R471-XCt77;Ds=f`uEG*0^3n}-iWeuJ=Sy30l_kOM;q`s%3{jy(+B!(7rQN3c z at iF)E6hqt@!PX)tbH^op4Rw1btY4{|KX`mYZxp*@#;@5T=FmqQ(k>vx70WiFIbM3V z*6C|EgmX6GkzdEqqp`pePHGPjeFlG?F3;|D^FuL}=qIkCG9G;Wi{gK829mAvB_n04OOe-asr^XE5Jpl3okDh;uly at n=U**hE z&{L)87LDno;xM zURoWVQRMmOjYeb$Deg(0fXo9L=;t3=0&)uRIdXS27Sy3*5nnlsb)h7;}HqXgE+OKbz~Mz^r83FB{5DHz%EOLQtWrD|&S zkb~nw1u;2FCFaa2MJaYEOX8fttQNma at -(1bQsV3JC)7&6Q%07wy&im73N}=*Fr at 9O zG+Uz-z&Y7DD4;niE9h0;_J*GQxHGyxHNudvee8|)nvJvI{p^2V`6f6jmX^O#PmHE&{q=teEpORjtD at +R8Jpv{2jR9`Y8got6uRb+k+GkX z+98LBVQit~p{bX{Q~qp-8CPitF99STAa`ThnSaskYm-*=6R{K96I-(`=!S>s)x; z#Ibw3yP2&#(_TPgppGT(I!!(MPDG4Y?bxDc*KOHM5XIZBQEI`^-ugS09xVfJxsHBk z-2+*_DY1b(d*^AV^Eu;9sq-`3Ws8ovMW4h2Y2Mn{F)1}htXKgF^X|CVHG*bR%)oB2 zZ2*>2CfH24ap^ZJTHi z=~q_t``tYhu$-=UHJAnt?!9e4UAN(`zm)2CU%a|4CBlLRs*@ph7(RIP)+EL8nU4Ah z?LBY1y-s6XeFaN1zSWzNFudrW4y^em=tB|Aj!c34#*X?^yugQZOBK`(4>b4a0?zn- zL4Cd_jMCJIYY}SW10Fdz4)@+$N*$KSAQ|M8<^&b4VA9FCd723AYY4>?zECj_O*2w= zD4G)kU%>Q$;8l4)3rzAm7MH|16nwr$i7t6p)L+sPlG^3vqz$q_Kv>@_pqD?j zBvsb-I at k^BE5#i024}HDfCD;2X%K at B@tTNMT0 at jGgzFc05p?TdMLGoIK>H1f;26Za z3;HuXq6Po3^l>Da^fg!fE+Fj9|WaYD%3UEW1PY;xHG at c1U=8e!+#icJjq1E at 5IIQ37_qi<~fZI9boy6MYZ~Jk8RP at Y`R?Jc}n}_*{+ZmJj3p} zjhzuDHi;6nLH0lUBKO7=Ax=PZ&U23}nkAdfc6N<=SoMfx1SfF6a=@% z(&BCLxnZp5oRd$@erCRV%6YP(hY;XWk;?M#X^=66S&Mp77V!{@nXlz6F0X_K8n}|Ay2qC)8R*|w2um3k867zn zEcK&QxzkmMLR2XkhcrjDi@~S?&m3P#qK&H5vEFN=QoF_SP`K5 zN^}ZV0$Act3*13gt^Gn at Hb!jcI}VMsD~e*d+8h$y($N-J^xbrkI+QCC9YEEkPxH2b zQ(ITZ`Wmv5-Ec{CKIsT!XxOHf!AsD72Jb4mZ+!#ZLoUmaV{Z9l8caMoPDigyS{Ous z7bxWno!bB1M%Lm6CVe0P0NhXk0F?e`8~KmBnaVCsriQkbcIJOOK>pj=|7=TT?V_WK z`h7cXqStAOH_yU`oJCeEXD(H)VpA%s#4Nli7il>Y0 at q@YnYleJ!|ZII0j_{Tp`@a6 zKOkJHK}zuexJZ=SCQuE;N5Kc6EB*7T@$LAgb*M%6Wxn&Vot z&)Ati0W8BeqmXa-sEOwn*9o5K9WgP);}g<3$NUBa-?tti?iey*%=3vvk7N31N~Ui) ze3Wq-N}l19de%F-oh)OP;gdVTp5c=`(XQjM8EP->KsJSpEG0O&cmN!!jYP;=9Xbdu zEu|r2pSZsQYP7M13aO+LM4n1no&3JOk*?ZY3J3}3?=pk;F4E$dWrsIgH7UWFuL5Np zX%c6)8P=*o)K0EA{@*F3^IK(!gsHzH;s8gh& zBH>`dQF>bDXXgroabYGFCMy4R~eM16jf3*WRD4k zX2lpHmg*DKt+s?@Gf at KaqS85B)Y7%qN8eqRmguaN{Hw)QUt`c}Q%H>F*F>GH48ja$ zRY)vrj1G#(1LQCSMt z@^~ecXOtx^30yZGHze;j7ZJH)M`;7zqlOrDiidtpoG*$kWm&Z`w1;*{oGs*tV3eqeq($F78-7k!&%&QZMlHP_27$d35>^4HJPo#5GN}`wo9#XJHqTyF zU_YcsWWU68k`EX%&T-&hOw6>LsOb) zr!JP74G8te3ezf)?ahih?_*+&Ic^7=nR&Dd8S}_PSBziyEHU{3Y&WG5d9C3PThj{PKC1E8%LK*% z9l9Uk!O!N=IUOAkJ9WENuMU% zs43WNh&vzwY})|f7BO&p zuY=ABnOWofO`#Kq$#Gq70RO6`!=4*-q{*VP&m;KmL%t8^k{4hucjmMRRsx|+=*)aR zLh?DDi0x at 8+#YAQ*)ZD>$mzCt>fmru+!%b7Vz}}Z7X39~0J;l>bu`fLe4oIJI_{Wd zeR#lfTu>fF`jGkLkA5|3C-UQb3RCBQVlq`R;#!52a50Wo#Y!1Vy}>wM1`K%C+SuUG)DPy%Pf?fr-&%F;?qUI}j|qpq%0cPo_H zAu{kMjxX*R at + za>4@(*SR-l9^=z0Sbjr4*=RGGi!sI>I=ST6;=DKPM1u-5cv13DDfo&?vq*-h;1DE~ zbSaf+mh8US^(Z(9L+deCzwT;3J;Hr7h))^VJw_dB|FcvDpid_2y)?)t6JVbb at GF;; z5m;He2<$%UYJWY_JtvS~E!e%ABB|C}t`X3cIdy>geQP_2Uv9u2!9Ke+fIq?q=)J7O zJQlDyjKSTe!9GhV97tJDRmpeML#7-@?Wtgego7Dw+!ezRjbo?Uh(ne|^l-H?_t$1+9I^1U((~CRHH?Qd}en?~! zTzR&{ge*LNV|-ph*knXu(~82;=2BPP at gK`+$ugczYuJ{BQS$Q z;+I#dhLMbN;cN5k at 6mYu<4J9l1Al}c`I_Or3bvmvDPw`PbtVb)FEimIGvcWnoj^5R z9s2O9*X5l at bks@`|UI&=>90+YjY&SMw_v${Hb^S=I#=%!TOyBd6Q z5(hEIXw=!R%dt+ieVdV5uvxoe(aug$O_r|0s at Y?<#O;t0cQST6W~d5m at XieA=dD_~ z1^vEML&FmYK9iH1tarzb&CPp5LVxgGYCEd-wDN`t!XNa%W1TzlFi+&aurSA8c!%qM ziFN)R)1+uCFDW35{glIkNTFzJU3A(iQ25MBzG?O#<_j9?XMnfh;X=sXqX} zR?%De-UGiD;=JUD7>Frhj9$3Ro#yQ9+5NdbUAx2Q2b4Lm1d`2=APAfw!{{I$PC;-F z%|J5}i`W1;b&wzNMSY?|Q=wsMsXdHNYe>^$oB+AKvm)`M`i6TpGUxO+`Kc%nUVf-+X zNYUFL83L(l&Ml6bU&sqJc+bQn&~Ue2XSm>&`SF;s3LUB at Odb|zfgl`wKh<%l3jVt` zI$#4$xOiR1_b$2%Yw<;m{t$gj+Z2QB$mN~r)bV9MAgEN5+9_O!>+@#M?qbcFxI;XE z#NU0GHvg`C1lQySeiUL{dCfS?Yoo z`#bD4G$o at Bab^K3Mu1SQZ!QZh!ys(SqLjWe#f( zILao1-Bbi6Ofp)zZtf-8u;dceY*H?MAyt0Ca9^?FFb^d1^8nAz&tT=VJi2#E0}wNr z at 8|+ePX(f+o at xvK-(4+)FGHUX3;^Kaf0SqaTk6Tk#PQ!UQvd$`|4>qDk`5 at QDBs@` zGF-eD`w)cJCPoo5WRnRI2&Rn8gyX}8vg?TFB)KKBW!%rxAjA|_GM#Bq9V(D?;P7dx zY0`-SDJP=xXe5ax30H-go{#AA3J-dGvLE{6=;6ofCLxucqJwG=qymP*&@1Ixk z^|W{&mBIsvpkp9FU$H<%x=6AjJF!TKRG2I at b|s)v>=|j9dn5=krB^RbmaX0}f!R!D zrZ)5 at T`=X!cUUDRcB8ke;4hbPl%Db!(=XYaf!Xb-IW_~GM;6A)Pinkt_8dT3n at up~ zt_pJ}FjXZ?J8oyvJ+Ec$J+)QaSUWr|RdcA~gIb+LXe6c^$-!d^8B1{M~g`(nKtT6q8fLxHiH7+P8g zDh0<9f{w9rj9ZQu7Z_rYv+zV9g2G#JL at Gn!p;^53O(@<+^xGs#x}7}6?dIN%bBE=b zN|>+zI;g8D0BydV?h;hfMDrEnGoA`b9X44$>(C1RwUSN|H58Y-_9QlXKGXFkCr!JO zDaA6^NGfGfz79_r`1;!(%W1kMlRZ3E$0$CP`Gcld{MUdJ%*jp5NuI2v at BnfgA4vm+ z8-*&rG~sM6;qJlnc({tmVs36`Te0mHdwKE}C>8UX^@GhgT^0MVT?_wK?4-g#^r8^j z8I2U-j^i`pTf)0AjLB0~|rRLPv at RQsW~E=f-!!R3Ht} z?seA2v<^g63n9`~#nl*!TcIFsRncIV8 at QKEteS(781~!a%EQ(n7Y!}VU4}phr6SjX z*T86sc#*i+VjjF&D7_#ySM$`5e%N7b#W>mHy8$LSKu`UgG)v3J-jnC@%$Jac2)vaA zAqdvPF16<*-7NfSXfG>zb^HNFe%f{T>Z-}Eb91(*Rvgv9jQ at l zMsZpU`PvGwv@`oy at Ym#W2IOpp`20NL4Zy`u=uloQeQ|I(qUG2H6i+kea$x2;*=Yt# zO*Eu1GGhI#fViV85z&`RE=fb*DpM>Iuex~1MoEa~*&Fi{$hKuI2xv%E9PZo)RR=*1 zYzH+5i$S6tGUoMAZ6c;K`#+~Du%c`5Fm=&WlA!dFo=CIkBj1yp^qc0>LwqHN(<^#Q zrqfeAlah-1XHrSFZ9J0-G<}-1P*X6Y*+fwG$;wRE&ozrWWX4IQXmvBh2 zvrb7j_F2#;(q!J!V}A9L6x+3SWx~CzEE~^*S1R;`AWPJV$xj)jz%Qj0=FyX|H$Q?G at a}&Z)MS?douA z>ao7C%Jp`vwl-$Y2SF1H$dCHqY(`f;qIfR&L;m*@>c~g{dJPZ&Kpyy?O6>d(C)9s5 zIQ>_4^xLd?Cd+jzOT*r_rzJK^WW0 at vh@wa&i1Kgjs2i%!BlufE0Sd||;5Ws?wHa#d zap4m~y8Z0itUDdQpWhdp0sNYeieqIMsm>pV5phs$yf)rz4-2N{d^56%=~{Jf_B*}< zH!>Ju1_h}Mz3E!iw1HM39EJwKAxi3);|C24>Q*mC51D(uAt!n2Y^T&X&zwlol;}b) zeX2}8g1FTJ-m>Cyc#xq>1*!)cX|h3{v*e6~Q3dhgsmR=2((^KA$p`oFM7hDr)g_G( z7ugmla}rh_qMrOp3R2CNac3gs$C{Q+l3!)RTYHtZt((#7r)0<1 at h)aW3+bIff;O3gW5(eR51ZJa`gkelGKpSuuW%9T|4?^dBq?mxYO6P_PD(E6M)2YEL0Ul){ON zN}qIj&QzKhUoSSORQlrKusl9jWL`lu$gD%{;MOc+5TeVBTmJeD>3sgo9d3{tOYgvk z>So}<_7hgy7yu4s|vfQK$MYxe-Q&9&?QI;2M1a0M#O at I$YO zVYyA=d#5n{N&gx)IW=p}5$?c`chK>GF0SCju}J`1nGVyi-RAd?kwXNTGXM#K7? zrY%+|7fSh7vDsy0j7B0e8n^)QCOc|6Z2iV{Fugv}i$WD);XT~yD|=pG)%4-!I6`c7 zf6)h*JhMp?C`U#ruLC25C|%Z^!Z+^O~je&V#(1llU>@05U-?tnUpP$ zUqut^A)YbR#Io>ev-qUIH&cQpyqjvwh~$zbSE7<-SxBmcJDAZx3B#O&J7ZJcpdl_;O{#xzR`Pt1P%b8i4Fk3 z^MB75h3#z}?42!LO#cRD|Dz33nzlOj8tT{&aV*{FQbtFrEhxkKK9RJ+#xQ9cK?#9O zY_NUA{(4<91S1$G5FSuLHQZG%nkU|%lRO{j`JF>i3BFz%S&sfhry%&}n z%*$*t(O1>br!RFJ3kTDBnB6KhGU?T(9{aW`rb<`@f*EZ!%~?{_aNn% z-Mnl09NXo74^>7M&m3LS1clv})p<2)-54t}(xPp)gehoJL4V3xM05co_p!V3_RlAR zj&Zx>_QW?#J-a-~8Gf9~YB6yTqov(g>7Hs??5ZCbXazc(^;t^)hGHmEa|_}!)|Os8 z(FveK{hs9vP)6;l2+M++k5^tQW4Si!lk}E789!Jy35bjSl(n)*W^K5M(rhU?YX#t~ z=WL#$N3UKa#V?SK?CTcRtWcjqN?WST)E?m;u_?8nH5IKk=o>jK)8n}ua(4RqCSe at 7Am|l4kpg`}TCJg9-Edf=n>X~JoD=+#d z>{;j2z3c4IKgomcJ3QsD!Lujbw|Ujo;@0c(pF!@D1BGJl0qn*~Y3%{M>a^*~CN6Aj zz3?#;Qcv{!Mk!RkmbBUI-=^M-VfvV_tbEM#(R{$+4(t7hK6d*UO<-~dEg6cybNgLj zj~Ofsp?8=Z;pVV9{i49l6c`?GPhfS2SsB=1dO{2R=&!JQPBn-sVMb>fz=s(ZmKV1)G4byd_) zkUhmT$`|~^E`Iyp8Xg+*=eqib{Q^SxlcGt9aj at rvI-TX#eLr)3i~i5gFGA`9ACb$& z{Yq9fjF&fKbU0_u+=G3>7>6uE5zbcfha`pW&QyDbvhU?OWRkzb(0ZFCjIxgMO}Coy z^cPQ}lj_wULN^v`UtR3>cjSp1ru z>7HJlmbNp~Gcy48W>dby*9NGTX~tTrmg-;y^+-#SZ1JpIJ1foo*rs%AQp3XzCYwDHXp?$QS_-LDM zYl7OKZL4*l%^ioYzIZ?!ys%&@b>;c)o9CKKVaM|*!7}JZVLiHV0d6 zd^xzCr7jTt_k`_1sFGRum*dlr>*{n7KjCwG`tWsVJ7nJ-dHI%Z+pO zq3)P{k}^-*Xo;00>X^-0?ChW3UUn2hm3^r<)_2IAk~+h=)b{XNYvk{k^(DrX|*<%{v9Q$Hm>EF2%){ zr<5Z-i$pV*ib2=2DS`?HVve+iU zm#Ktwpd=_Lh$s$`B2*kVLr58i*_v=U2p#v+9S)$7Du6`%0DeOF0jGbVAxV&^(s=TI zxc!;Q-q7^_c{7DFfS1GLOp(D at XHuXuz~%;{@-$IoR$!ke$dD)dCU67hCsM(41q(cb z2{zzJgUi<2=O#vs&FSK4Q5y3dlp+yUkMU-T!SGn`6)x}&IU!pb9*p-k;z`sjfj7Je zyXtzN6{_{>Mrg$ovUy(*TlJUVs;`BX{urb8i1q z%z+Zzf$1?9JRW<(PkF-gKr;X_vq5Cqp`YDaXTn@~F_kWU8=~ZT3TJi<^y{+?a+E at l z1Km3hMyMBCW-!pEvkF9;*?HTSN)G~>y2EBbB(H%pdAlDK`mAw)RJWvP%ew?_*XpAe zCfgWMlu2p89dZrrAiJ*?J6y at 5j{nnJyR6Eq(kG^j7)J&DDzEcqamltfn6noeYb~I9 zZWRowp+jT}(hCT)`?OU#riN+JNao1C*AJqKolo#1;WhVE at hyng^$!as=TLJiv3-sy zbYy8!0$k0JjuZGBjq`Os>KYv10c=KOfOQ z1-l%>iy!`Om@!cOR5B#BViQ z`7t1&0Gi-_al{-s13*GTu?&pX*9HUwNQRNHr5!0Qj+;q!ibz|foZXy!6)y_uck`F_uX0#LV7rg~7v zsUCJjAQSC|8T;`-+rJpI?kY|!aDR0GyQ>}2ZPOOJPi%LIp5XD{jz}WjJsk0E(-*%) zO at 4@U>kosA_$UlhB9 at Et5VYYZEd(n&fN3I{o8IOqjb@?4LFKOkmy6&xYr;{P@# zO6K#C!r-Tk$$vO%e$6 at OqdI&d>LoagCh8?QoFeKaI;McCV z#-cKM at MBJ0WvF-dKQ<_#G!@OYP4B4bXCdd{}JbZ!RYMU at p>TmXb^#+9YEV{gTg z%%;uknDzyn%cn>rnP< zDNYP&i+G}=yDQoBBG5x>Xj+j&U0ey+Oeq+#jfQz6E22b+ER~C^_>X~dpY03zG#MPY zZM9`UmF!UrHX+J+6&hv zX_uw0e6oXwQL$22eY}rh98%dygB$$%L`zLuSHwz^!qsWs0-X(IHIYVZ2XdO+)+Ks! ztY`+w>()6<1F at kvimEuG+o4`~nAB$L2Bs?v8rW78L(Ick*#P~A!4 at R5QRGQoB<)D^ zYM_MDvUW5<)Z^M^O#^psjI>0ZgS;P+(QkH0wRTVA(Uu~!r(q86Z6tbHvZ@*ZqWCsS(wRbPfrSO|w!aVPPIkvznc#O~&^PKMpIniJ8QLP7$nA zk7RDa&F!we7^R2J#3^^O>>jl-ZmY~lBDK3{?MfFB(K;_49(b>Op+$!c5EU#dvGM|9 z;UUY4mh$lYD`?;vZMoXthfeO at dr>9Kl3KUAYt3$-Rjc5YS}0nI3rI zs%faW6T+Z3q^QV-SInMOzm8S`jnZ)R2#rd^Sd;rO>BI{9O{Xh8^zU+_+;7J#JxXAOd)vcWTy8IbSpsd`Q zB`G!&*Rk94k>8mzo#5)V-REAfIqKr-EkF7ITRo6M6o=&jw|4pL?}vZrh{MNxW%M)J zFMrJpJUfH}Zr`tn%g25N%|m#Q#_eOexBe8<^RqUf_A}pq at mTD~zZVDIy6*_Qx+e$r zzBdQ{xJL)RIcJy;@4I}>4(vO^2m6lnpOEPb^grU~`nKMu^yIT`u(ALfG*Hyhkx4S8 z?C@}AYnYInwDD%LB)`a2E3z&HgR?XRTMc5=-o>=nGQ(C1xoB?A$8UY>If7? zdNmO4Zv%R0DNMCSMan04m1SqiSF<$Wr$GdV88(RWM|^npdhjgw=+h-~s_kfyT>He@ z%!>?@7G7EZ9RJf|u)5S>^;jOIZr#10z{H0kKL(#wNwy-=$Vp|tv9UA at W+^CW+a|ZH ztDzvCRSKD^B4iq#T|QxEdoDVn&vV9F|ig?20ID)27 at YmHN#g^bNPG*ip z1C36#ByYbQElOCu{LOCuRxjVG34NFg{H?d|=YXpH>s#uQLpzCR at B=Wm?A{jMZR=Sq zH=#m~=9!@hBKbzLFjPzyaorX}8vQ=b&+<|-4m?#*d$+tc*}*$kN$%}1>lKnsUe#!j z<$AY1?pinnSqF8$%YG1D*qzF2>CNCe>)*&<_|DvgsL8U_5clwZtkUMpi&0jTYytQ* zwO?rxyQj~1;xrN~TJ!9=D>VntN(-ASAXxJP at v0tkgYN)U%nta2Da%tYo=_ApO{q<> zsWdIE76Pj|l#c)mfX at oWgr*;fR>n&=Bybn9#IT5;37$JOWngnB4dsuR`epRQWP#UW z`g7BUa>LG!tU{-XPC~abPCRIC%?|AXQ=&gR)(VzJc8(9>7K^4~qZQTJ?e&jBoipkn zE>BGrS%U^4r`RTMGNN!hLVinH2*LG7G;pvmT^=Uo6xbeAq%_x<(ESG7oMjWH{x;2}72vT- zVbp`*7;{P%`600_e+USFi2JM&p*f;^2tsR`9W*qYZp!G5;+R^G(7XtS~)SMAH(j75#yF8L?;O35<=Jhb;wEZl-hu ze@%VyQ`O~o1?IpSV{pwY!~wujblPv8baxIw3Ie!PeU&wD3?> zdzuA#zMs*yY)@?DeyogMJEKcGbz8t>pzEbcTE&auE&#jL{7I|ME=en>xm-l2*=`ff zsrdjfHpj|u2DDopKeT8(MZ%moDjJN`usFw44zqm`I{s+`qE=76ldBw at E1YyyG4`bT zkRud$?Z`uXr!O^1drjkW9<+2JPff0%E4ZRPN%^};PYy3)W}cQTEZoCJ+JQvGt=s`< zr#-##&TJJB`_p)Tg>4F*Qnir`C-W=$4)98^2~L_G4TevsJ3KGXdacj{jgIPh4-5V4 zqFVQbDj`#I1^RIE=zUI>9IRkh{JH5b;)W`mnkv}s{PYfu8#|w81!8t`mOm!-_=pI+ z=m at yG4Acq?Oco0FpVS(Y#l_Y2R zc=WKqKz+f!$(a|ts=8IFwlO1~KDgA%!iSvWvJgiw7(7-1th0<={u^?PJAqXUpyRWC6u_abwg*+D=YsT2+E3aPK|;}!L} zwJ$(}Fuy1kQL%Bj!d@)B^f<^N+_4H;dg-ag&2xsggK>+~R{uhhzAF|5-*78kRs$CbY zk|2VJAZpz%u at s`hKn4OovE)z~GI8vJYeRSOHfyIA|7QYRMkIpdUwgh~(pgYre9T|u zcAe#UpWbGEJv?2p1DMuao{!1Ef!$uUptztIPTER}HDlpfWGp3ymKy4X$2En4!osuC zFa->(|M5kvTk}MTj4(V8jUc*>fSp5B{LB%rgTQ?E+<_FLcf;oHCd2 at v2LGgOzub1O zvBL4{ZJtc1^JHXfunn75o_jeohZzd(OB~@HtOKu)G%q-OGb-Pxh;&F_yNu#&@brxj z&)X)SaJlvx?pA0F4m$w}R7OV&jqPvOQL^|d^{l?wYD9l6sVY|>5%d%vwxtMr6kXJ+ zlvtPLx(RnPA~Gf^n-AQ8tdiZ*<;I>r_15l|^g8o-xU~sU4m~t|)J7P*S}DNXG at 42d z&+B+raaIZlM5MvQ7)}U;l(EuayN5Uet212hH)bhTi6TMAjS at 1>cR{Yq{!wm zTt9caT|)1WaH?gPcApw)@Q|F)qKy)^8+(2Pv7i62rq at 2#a at E`jz2^J_kDXvWAyeBy zC at yK334zIK~OhfI5VQTMV`P9UmBz^=eT!7K1% z`5wE^rTeHDrB at iv&|l#RW0n?|z$8t6{uboIcZFB at l6=@vcxh^ysD{j$5 at CqOj+$OI zhG7RtmGpJ4rqK6L5?%U7p#BZB2Y-%|naYw9s~A+m!sTMOq$5iLhe1ApvnGeAOP@>Z zwu?$aIWlctmyn=AB9pX8k54_Fu&14|^d5ME1><(#ZqXoAuIT-T=b at m`A)*dAWwe^?| zC#RJlLhV<^M26y=0iT~eGv_f96w?w5BTUepvM*UfOUJY``J>Bw!?F1-wbJC0EI6}x zO_QZnTBMF~*jc0-muk~xa>@8kv!!MuUVS}m^_ at B&3L*){*^)WiqczJ+0<{)zx4Se= zC7uT>{!P5yXVJG(S(jsYVZHL0c57pyO;$Tjbob6Sq{Pu)ePhX}+$`1DeTAV$iP_1g zBtA=Lby{|cfzvPipsl5O*4Bqm(Uf9{dCMa_M+(xEC>!PG4pYUG!7i0{s)jpB653hl zxutAQqcg4}%4)B1mqawvW}J at c1G>0ruTeL{u*?wA7Gk{?!Qc`~oZgtvDevWLtxo at I z!k_8EH)4%_2>Lh;q_8ZiYz_G?Y3a(PfEYBgeTh}$}J!)V at smEjq zM_Uw~UuK62t&t=cZtVFtMaB78RMZwm;)BizRTGSFA7b03?+_v?VGOiA>dm={MYTPE zfpC63- zZ*v3WYT8@}@qR)}l%G8P>gWs-#ahlo2w|bQD20vc+bu{vA|za#9zmzUU)bG0}qckkuhWp8H|Kx at _Y!1pXWv#nF2pYLNj^Xax9FWpUz1{d(asI6Krow+?TpL zZi1QO(^``~lA2{{1xCAOL1zxrsE)6n zn6)lHvvkK5;svi#JZelfm?+nn7xP=sxFc;z*0xw}b74~ZGER^?iC|~jR3hB@ z<1!G7U8NbL{a`{O+z^Pfx&Uj-O7rYm4kErXjm7RGJkLq$qD)WM1j7o+m$pgv{4!6D z^W({DL8ZEtiLrBNdw<83s!0KU=DPBv`%h(ACMfNOl&>B;KMClY-3ApSh&EzExSbkp zSYw;YGQH{)+6)6i9LtnTo8HOkY_D3yw|@Q=!-9tcT!OY4g;kXS$CDac>v2EM7?R1 z-6DT&%#_-41Gt(}S-KNym*`zctaKO^20u at KVL^g7EDxNRFsgMmBw_X5TA52LP5N{D z25%u)C%DbgoG6n9&n1e8Q1P_~aNUrYrZdt0$zK;=$;;|2D~|qp9eOhrK+AUw{P?-_ z1JYvhrJ(%5_5qcGTAO)kz6Zv&$}Lm7pEA_JhS;5bZ1SH(ksO~+_FK7f4v85ej2 zh!$+10v4)foFRMVl`;hu at IjobVtS~sA+hNlUMr9k`wVOHq>W>`OT}3{((}fC%a4S* znphpceTqae)`R(uuvBc+dNe%NmkR-c2oQf?XlP=7DCdAOi&F;oPJ8;AQWo1U+2s^6 z*#vm!MM>G{p()7~%7dfTRsRENK_;*)bXP0~qLGlm5q1g&{9V>NyzF0ocF$OeC=URi znKAFk><_4wS<~5z4U8FKhF?zh%&BPi!k~c=ygnwKUAS)`e?M8Zxb&7|f1=ZFkpFhv z%|A}oKc?WtZ_BO!C2aaDk4Tp-*Z4~d+?g7ZO_0sfO)#_>TdAl#0exVydSgN=N=e)a z_xl#KE3+kr=TF{+#)LVj69p7XzNgz~?qNQ@?yrvzupQp!3XPt05D0oam0COF{-NS1 zvH%=RT2<#vN>U at Or;#(eiFuVmHa$if7rICb>q+`gODYH at Nv9EotyNyr+O|=3!L}|H zqu8hrp`05-nQSe7D0i>1rio?c5>qiI)0K;m(Upk!@8Ln>^A7nPNb=%aF7XQ`Kl at h) zCbKqQF%{(qNd{$$DVNpaK6j*#V=>t~l|i}@&vR~_t_F2P_1p$r2)j&$g8HTdR0F=x z=W!&z+HRh at JURW$yX90Cix!p78dp)`U6UdW#z~_nmpsp|{1Dr53Eb_9fUwu?5Thn& z##}nah&Oyas?7;DCuV{Dam-xR&ReIS`&lE1?isLC$a~^r0#Lu1YG6RKuYqj!=E`YX z&p(>#W|DGu=(&ki!`BpZ-JL|JrA|-02^|_6SnWZMx at rO%*C0C24IVBW+ie3ggrF9B;x2+SlOZY~0ptXg2tCX~$my17k{~Zeg zCWc`5f8pTIE9(Ebi1N2&b&{<*jwtHz7s?#XYPEn=8LNhrupf`YoQkdOJOtEt^vDIa zpXdv1t2Co?CgfLkjXtRSem^Sc=kR&Ox8L)4wpKT3C}WYQZx1FWvf7_NuO_m%6S}`% zf6D`L+G8oVQ1A0xjkd%<2)&66K|>2^MH#_~5+wz0mN4NP=?;POp|sTpPLtYm9OY8FtvDzL}M%E>_Vtt$m+tWm;Z1 zinhWsx}xrv>#xN^AIJV-dY-wQ;gLLm&fWmGXlJ5c-fUc!ejiKLmSi5gj#tv-uBLNopla0)t9YlgkH>C9+{zYc9JPksPr;d-uHzD at ZwcA$ZAD6NFjxoMFlEoJ z$*16}&>*{5X|9e_t~%R&eNtR}EPqU?mBZUVDEK{itcN0div^(8W3%bNKhGiJwQAAS zYKvocgwBKP*DTvUZ|5{VYb~n0&$?!Q8&v!YFCgQ9^wke at FCc)K=aWB0hjHR~0JgJ* zt_`=p>MPqdhw(jm4q65rL(zb#Mb8VRwU0ZwI0ZItbCmtuTa!kwx4orwN7{>Yx6EJn zg7O7>TjE8nm)WaCKvdPgI5!vvdQL+v*H~XjS5P=I*dK&PeMTf=_l%)LoYgh832l9e zHjh>d{nvnz3=(O90eA}9cZL#!ZxOKf!n%gRVZu)ZXMWX+K{_7RP)f96(q9StdK-PG zVCxupZoA~x)wP2;rTodQn)I0PyxfLdy>JNhiNM_sTs|L&*ZeSb-i&QGF7u~#(q%3l zcww?!etP_P-mfi!s!fl2hbXSjo)r%?ZVfu$XLmb~551Tc)lah7wz-E;su5|YRkYu5 z%FgP<&f79K-1ZWBa-ZdFDh<4w1$p zrCWD2-%yDr_n^IF!sedbpBaSs3Dfnw;Dmx=@{zquEq;dYQ61@`>c#>c($c19dqy$q zibUt5gXhLev{L3(EdQcHNP2}+!YB||O#4UXMc$pqzt=h#9gIUS^%f}2irA=X>WD-`Oxiz>|IND`Ha06)U8LrB^{eI{Y>54ZkAM+QvG?tDKlgyH((>@Ee zq#92!wXU-%$};9GIxpwcQjsEU`ab&rn9>M6h9l8e*-xdz^ytVkX>UZeS6yL4Kx_m`QArQ)RKnT^!(jg_0=#c_nPUTf6=D at k@buJ%}2gxmy916%wtc&sN-iqs&@IS4FXzyia8za?!Awc2Xn(PZAlj#x!-0b&(QRr42I#{p_J)mRej z?i7`J%F=^2;w?>93`6 at o=OnQZ4VP}nEySC$!cVyGg7!0s}U&8rs;UkTG4QOu)`Af1|(K&qar^auA zqWCYT%4uXL%xQcjAxz$a`eP4h-n8?Wy0Mml at l0^@6-;nSLPONAEC|1u at Cx>kbw6S} znENz9EM=!~4&BC2ZSRP83-%5d0K*F{$Lx+`2AfSt3>AqBfMNq|x0XohjYt_|#Zl@? zxAJ~J7P2C z1%VIKIrMW+8Kny-ccbojx8mPWtUSd-1c6sbk=#Kl2w-_l5ZsDOy;w1w3*=oVYbO+# zyaHldoG+4!njZH^iYM`}@|5R9FVv8~7(1dVK!Qv at ibl|kN_4j at J<)R5yXc{o0B`-FpE+5vu+SMpKuCnDrC!v^4vGgkx$Ohw7~hRb z4~~wT+Nu2aoU(3a&v8+AB6Gu+>@RX(jPNQJl=!FI{g at -IR|c||-W<3QbPfUPoYbV5*N%I9u1H6E6(2?3ymwAPwJlw3htl4RO|nT zV-W?||8O!j`S*OAyoy81ePQApa;@40-|T4cutsbeSsi%)KJ`{0(sf6M=@x zpeTmVZ<|JA*cONtyjQF;XTx})e%3 at r+ulZsSq@h=V2J%n%(v?!F=8(a!DDl$vGzsI z at PmuVFm<*4;!LE`wK{So+Stb>G2PB8T9yVdu(Oned}}w7AcEMw3h8{%)MOXZSHLzm zc79X1Z~Gn==57GrbS7D3MKCkuQw~hhr1f@^3KvY|u!`n~RMl2r+ffXqnU#0J4`Va2 zb_zcTA7qsQFKkyN7CBZYw=ZxZjbruNz_~Q_3g)ILGCD|eq%&b$8weJha1A-cU_E_b z__Vb;{d$TOVC;kjoJG}t^B$34kVPl{?P+vY9I1Ckd=nkl_5vs(3+vXcK}xx zP*)jUz at L$F1ymf${0RAXJoKgQqJseg0r7$Ux8sukCp`Qk(VDO=ha!kN)V)flYY~x1 zrAjH~M@)-h7s)vELQW~tD5)$%DEna7hPM`UDZ|`eu~YE^v~`9ihVs`KvFuef(Wux5 zBe$uE>}&SzG~WBm_v0F%D+7`M7IeHsrrO%XUbqeC+Kb!^gTY>^{<-=6JZMq3^Y6$m zRj;FVxN!Rx^mG0Qn2vCiL0j+u%op&=ny~ctr`2`4BdAN;irA~nsRQN>a_W`%_EQYy_ z2ra2-*eLd`up*3CDL#|bxV=evdg{fsFNp%wG5snwI=OU=Vc}iT{Pox)nvY)xNvxPm zo>WWOE4NXvj}aT2daE-Em-F_|+L7{|5i3Ry zQ;`ZCjI)wqQAAP?v)t9nZLm@%Wh9*tS6rtaCxt39*4rE- at V&qoRt#yk+U$ z7 at Qh*;u^&$;yx_^fldHe78vxI2X(LEU3f7AO4K1b#(T=`!mIns>m6!`&d$@`!39cG z$H}2H5DvlJ9)n$X!^l3E7>}tIUienAF#m$l;Zbfsme2Do$wcE)Op1>m8_vX$5S)>5 zu^L{)iz0qxg1j&Rt{~B{wV=MlgmWpGTWZvV9^I14(xDyaB#yueZ)lF3V{VN7 at pl<< z)#T{930El7+~GOg*m1b?GY2!DT<5K0N*8x(I7ADJl!nm;vo9tH`nMeJxWYiEjLF?-yFk|{aTTWPMB2-OpEVkR)7bd+_CA?L z280l0)-7S&_XGc7)c(X3=ej}rV_!LGcez!&Y4NW^q0V=DcY0}Jv}U+zd1?qb*&QWi z29*gkM5>u{!?aYUJnw at OqGEU8C7rME4fFIv``{t8GwfV&h>XIGd`^3Z4xEZoV00|? zGqTM7*D&+(DL=0u-^?^L+QnM3!`r)oz-aMi<5QS$^ChjT7$yGg5C4sjfG*>%q&ZK2 zFc at lZbXpyf7t1^e>uL#WwSzgD9R5-BNpuvxR1^%eJyxCUP&bNSn)h8K+cjL|6dzjl z0FGmZ&Qjd!6$dr6|9+^}f51!T$G;NSf5MldtTc`y zDlh$g+NnxOQ`4-^_XxW9pLp%m8sQY7P>QkPghdf4CKAQpnPahF_6SC#PQEMzdzC2m z5KdyKI1RN)=XPLOA)l7H zXwIidy@)o62W5HW?gU&Q>;V{{z5Mq%?o@%kx{2L+E4GQ(?NZ|vD%iDvlVx0|luZkl zadKQiVbdD(6Z6MKPE*C%9r%XK6ZC2^$_=E0o-^q0Dx3{>lVCuKgUWk`I)R~7Fm5=3 zdG&1L=&c&TvzCZ=%2)zn-)L4AC{fl5TE%=zUSaYze}~Pns*-Xz)7_fnJkahn-~KFD zO-I6^Oa3M{rds<|u;CP7EpXr5jbTRi3w~u_a;O!m3Y)t1f$8{>_kD?PF`b=4wi_?! z3>xqh)CX=HQ#abuw_>DYY{Oj5{KPb8re^Xd;BHADcV$Va(l_x`(y>lhu^RH3f6egD zR?G-`qvX{nesW?R{$eCgW;P8${}LbmylSr2Ud`Q6_!w1Lu%j46L`I23AVD at q_v(qo#Glx-X^Wpb z(}H~Yc_R?H+kK;nBCCQNb<*IQ2)OFp%aO4OueJhJr&Oy4E0XE*hyI-6K8(U4X|~rat~8h)>(x`xTu!$T&~rNR&J!+Daw^)p;PYZj&7I$eU%5odigA2vpnMyUURy37+Us}v#UKws*bz6!*aF8t?#b8f* zO%zavTJ5Gapg?^ z*!?2tTRg4@=n1~`Fyyg zxmZ=#h0?|?u$x?BlKfo&(?AIDjD`^b1 at iU~VXz6fhCsMoPbvOSRdRlk$2bM({`jQg zV;GYeL3|`J$SgIR%zQ{D=yE3^$;_ at 6d<0Y2YQqcOe{{??PLD_#r~_H z(Uhg+wUq{Re#!o3DZE)bbib#TuHKDHTExj8u}M2laZLHKNQ0#BIHMKa^Bk~Fj&cXlUn$vGCQXu;< zn-q9ju>(D}TM{%<&eDIQL%>*WN0j&mx#sHAZ*>>B(%mmX8<@01ZfQCG77l#{U9-8cU6y0qf6cGDed7T&t76q;jE zCzv7vi$WWb!tp{SwsGNmIA3X3dfZw~IWrgp+D7XiNI)-eIaqxBy!seXLz$K^Xt!mJ zjyK$n>xL^44i>`6f<6#a8obc`685M_x{ji?U$S#<2hKSCNgd+NRJksD{R10Kd#@f2e60AiP9ar z3I9cep&>EU?(Ri24QW#(mpP$=@sW?k_vFB=+`;UadB{2bq_898kl)j0Ss?<&{IR*; zF>$HchkI0K&<|k(iKcSd6iTW_dq3)A4fX>5cN^(R?z=1ev5^b#f2HyIpKT;$>TLLr z;-BL9U#8(TCa9}gdutAT5ontyq|+T_Srn3yLI!gnvcwgVil?+yI<0BF0r{Y~g%95Z z<+7jd?B_k6$V#iZj*$max1e58uC3YmnRgZLg?yuj>J+?2JN+>p$A6EtCYNod*q4)U z$r9O`Tugl5AW^6sjH2wgup%$K`1PX{ei}ekffGD75#v;UL6ZkBf(zzEIU_sif)yPO zmdy|4F4obo*M)Q+h}-#^ic(glnS5!fx81DQdF=N120#RB-h3J?G3m0#v9X~=;(K&nM=!LQlpqoK46DjMN%rkp zw9W{h&r~1OlIh8mCDL6RjUkgOEmpBlzo2aG5;9H-Sc%cJMF;5-1EQ^;6oaaOI^8-} z5L>)Av!~wBMJHvKr at QB#oG4{L_c$kmQC?y;BZgCu^xD>dNhMq6diIKG0rq|MF%zS| z0k5rmnVoj6b1dboSg^S91%fi`x37=>gd?nl=0OU6u_dNc)?DCNij;B|4J&$Zyp}a> z*BdbGqiMjC{Q$_QecbweeFYhau%B4mC%76hy+UziDD)sOi_OeN at go@{X*8A9iqdJj zmaVaPkS^L8)rDcs3kWuvKXwnn-}4XN+eS$Be^$tUti<|1T1d^(=`YKO{cuzj7ns|l{-N?lvt&H;& z4a|Nut;u3y88*rkV&f at j(hbdeq&W~Hmj-D%`75U>PQj01Um?Ud7g$A!gfQFqiUnjb zy*smArzohv9v2W7Fbf|un7sA8d6FHtzr$3Bx#Bti3*idov3{Kr71adjM3%r7{1879~ua0{qJuI47vj=2;K5F@|lc<9D- zsUnT@?^yA932DywMY&ITi~CzaC3YSQU^p0UP^wdc>bfuDn%&$egaV-|7*59-p54RO zo>RZiueXzCu at dV`1QsOTIya)*+$BASbo?V)~F#BLV zw;>JL0%I`Ul?5OPU`__AJiLI at PNf>AVPh(PvQh9Hfi^a{MT=*Lj2UMO+e<8}dZq@{ zP_s?;@|&5U!AGH#SIck)H5%z9%wu1QkVQsT%8nP0b&Y5EaMx(zPRW==3h|g at a>|CG zXfiysII7QHHX09#J8#ySYL7;bd#EW-NS9};P6*aBiZ6r~Cp}9}w^oO_zgFWeoA6?E z$7icEJsDJnUq$9wI-}<}vuM+fh$=PLP-Hj?)r`u=_pt&kC!o$B; zWZt_Yz=T+tvFo&rgfiL0Bb!W%F3xb`){v$;&Z!Nl%tK3pLD_DNI9k*I8BsZ9n_po$ zyqeDQ4CNU&lO+_N3=EKRE|iG`vMko4WxXP;VktUqGTV|qhQSRPdqy}B7K}DC+HNJrsnRq)}JT0OtR*P!BB3#-MGM%Y`71zU87PTz3COnW04xAg4$ zg at ypW@4;Xa)9vEHlRu at Z7avMvH#P0GmYUxc=T%5cH7h0dk80g(&PN6 at 3Quzsj|xpZ zS^8vqoW at P%S$YaCt0@!7Iuy{vk8Kb~&1_~k=rrG*!%32`2rt?wySTb7p6y5xS;Z*G z)op?w&B!=%e*s6WHJjzxcvDmF&Mhb(RVwJsUW?rrtb|KH0#SO6+t$dKN zs{i_Zt<{{b^-MZK<|kMDP9^J(*D$!0OoqKN)XhldcFez!ROy0S5BFnSv<(INH%Ixm zLY&b!UxGF&TB0%EYIZp~q1f9(BLZ8=3uOvBbF%a7>PtYkRkoeH zmeu|FcVpg`!GXK{46JKeZ%C5!KbLk+K?x2skSK^=$brKYSRQa26uUtAkfMW^Kja-; z(elz%1I^V4Mb4xVS1pB22nzbFNm<0wLnALriULQV)4xK4y-QGpzdm z{_5vV at b6!vUBkZFFX9_2(R28+caGJzT+fWB+2$NCpt2Pf8K+m8g3gXua1|DA{9I(4 z8t$fu4i%>1wfcfEtK5-^=f3Qh*W|hwqsv?v2>mcAMqQ2rn(BOLD>(&`go4|Zsp)MQ z4xwW^oPaN;kFK0wXj at g`eb$bw^?f*Qt?~c4U*Rua|3-AhzW8V5`R#w?_5VcYf83g~ zv*RC*H+TO>T3uey3Rn=al5Hr;Bh-!GfQJJBQwb?Z%!%o^f)ROcf_a)1x2YMRKTd=& zQt-WVj|lWOw#yk!)J5H!fWI3^W>$Vic7|l5o4ecH$Y<84zqk at IreIO+y23S$Mp4yEb2P&Yui3=z%$gEVh zMNs>tsurEgKOUv+{oCJn3fgRcG7}UCNEHeQi1xqVDbc?k{;^&E{xzyPia4rIa)*sX zaySxbTzY7;5OSz(9+lhP`f9_il!eb`3$C+haj)&Zr zV)w(tlnESBpq2d8)JB^7Q5Vni)TI8`#~b%g`C1$iAbn5EVp>C;gs9Qo)5n~A6ZeKhp@`_FG+?zfBq$=}YQP$BJ2*a`Q8-BbZIM4- zr-DJd3)b9^Bp|0ROW&>L6ehhK8Qc3=%roU8CMY#Hp?Fc1M}8|dLHC2!=kImvc6GVSVv92v(iR9USVuA+;|hSIIhy)NxMvi$Yp85l}52Tiu> z at 4%(wH5w=C*N6CW<0N6!WK-jy?&9{*vh zRFCpHUh!WtN-N8t#g>&SR1`JC?;4BU2DS-(upCR_#^+{wLgHTn zSwm-Zx-h5)08y zoU_O0nz(zv&>sA*bSn5m)vU?O%Ze>IXK5nRP5Uw9>&kYB at LBUKnifLU?7@)06m^nr zv;2ow;%Bx_YJkx+_dYkV^0m0Yi)_~OXWFpK+Lf20a1q|DnotYa_SH0|qA1GRtcLTU zSq@%$P(4a=9I=~8MYdHzkUex4HH*tc(HCV^37x49>PiD&z9xtdA9 at nwK36}gjjulKNMAJ8I6)=SSF{$1 zjbz`+(6AU7PCuzx*Q8xpLfIM?8HQ5uFIjX9^FQahZHY0Y8&Qx>42B^WFmlSom!)@c z$^|q043~hu4-sjI>EhD?DM~9W3B0+ajpmQW1obBu1)Zw8TTcH{xnvHH-q z1hW7zrYQE^qIv|ysvt&xIxji&A8|p7UNR-KW(Q^CxlMxBTGl6I{=&|ST2^3#pGE)7^>@03UZdv7;ShN_888&zH_Z2s z at FjeJC8FyTJfU!SP{KSXED12e9|B{fpYJwe9Uy{+ePCbl0~0EmiNX at vED|t>N)iKq zE{)j~hreGL%7=7MExjZ|-jj$;Mk0cXPb8vsm|N)ssYHqwS3-15FrlB!dQil0m}eq^ z1oqe-S`>9~aHMFoXCFn~mTwAt0b?WSP$+-a;YR)eRy}1ZMm>`o6##+GVJ99mjUk?>yqZ&yb(FB}jNnJU*o&*9WnkHE)V|Ak1Rq zfxGEgCa at ZjJ7^=~b|_1y=E zAKC%W#fVCxLIU;u?Pbd;rsjvw=i3uV4_h;K>8>9Pge=54-IzsNAdmCSNN;cex-czw zyyZDo{}JI_0^t&uoQS}YNQFQqWKxhj_J#JoY4(+ZfIL;&B~#-%jHt61Y*H6KOmLE) z%APJCR1oKZq0q>gfH)791IeWaxLW0Ra0bAS#J|)-SkMA(Xya>}WQoV?Mlh?JxdV)S z`T}?oBpFb#E?I(^)Og0>NY5s(pXp?8(kmQ at C#L8WtFl7Kbq0F{0W`!Jf?sf-0c;0l zkioCc=@Nz>U-bRZ4k29ZaR5@=$K+|4+XY9Z*=N%E+L4A37gauC$<~nm&eo{sJCHt&3lRRpJo8yR{nT|qeSR9zx`NL*zl1gO) z?ge5OhV5U+dBODazd&PVOzZV>Md){2bG*KtXXibnsgdgB)rs*51fyYh_POrvW82Kn zGLDWj at szAyEp``t?7}9=JKYk{4=kJCvP0)&eB$43q*Fp!H1jQ9sjD1I(uJ2!Nl-DT zueT^qxH;4aT+g>?g%*7w4&LMZ9WuHT#%Q;HAma=AzlRLdze1){dED-=zNdr~l>IqG zt*saV6#&pSJph56>KP9bCC#BC?FkLh%Fp;WtBJ~`j#Tfu~5=s{t_PH73tZTjKqjapByU5 zGoT@{vJ<73nzoV9$5=l&+?)#ueF-bQ^~E|(Hro+RgxC=9t{(qeXbMAob(NHwx&%a2 zCunQ at Ht&Yne|y>wB0=PaP=D<6i^0 at p^}SBc>sBNkPn)Z1i=|**?3$84T)C|8m^fp= zFUS-A%z~q~u6Ks|YPMIja%PvN at fNniR|hrt(l?E=U+WvT at akpsOtG}-Y?Se2aT=wm z>6=X^^KfdtZQ==Oq1zXX#x-Wq^a8bE*c$dC5P^NR7WuR-O at U~gQL((Lm|;ZztNK^; zU52p=AMFkQ)a^O*r>}DjtRB$72m|#2 zU}&WxAQ(g#R}^!5a8BlUf>)#g-yZ*vwiAel0)^`qm3*RzmAg*2>g!ggsg2j)clQ`S zX)BWz2h4FuCstnkH8YZ((2rokjX9EiSnJcASs#EmiZ9q0pBOzSTz|EF?)7C z6r at BTh+>Qd(-wW$D(z4thwT%Kol=#CCEcogCb>6YTA at 3ZYYn1y$I0Cu(g{jKsTaD%tX(S9Vk6uhMuQIkBv7S=e?t9Qir zawm at cEBw{`;JU5n*N>jT?wv6=V0q^N>lg~>fFD}{mdB%&R?q}Y{82HQPbjNWL$Qjs zPapr}a6EIxzCb|#b;$nz76UB*z<{c*GL9;ykDNrkqy}_ijOBvQ3b3pMVPkWtUp{IX z7)Yr~c{A1c5sQtkD{}^1bLW#fU|(ZcP&_MdzY(3DOV525;nrLur$I7SfGc72VA69d z=J+=cx$oEeFf$NFExtI$9TaZA3h;bOd=Ko_*}!_L>OncN6ZY2W0FN0;=x#dkHQ9-? zZohx9s9$NfrD`x4XfRB1dlGf4-Domry>@j%!us4TdwJ4Ehf%c}wX$<+Gwyf}l0?zk zokR^(;PFO2>It1jv`)31t;BV3ouRU0$4+{1rx_rbYdOd;DIN&)0c<#KE7MkmDn9=H z5)`*>;Cp|wH7eLtF|=EhEr~gf93 at 7NOp$eb`H$6B)zf)4qfJJc;7eX3Y25z%;MAik zH7;$gg)lI`SWz;gwV?nA8->-I)Np~6Q?6oiZ!7?$1uIx08mfDAoS|xKHB+C8i){p|J%0O3vMB-l_b&X_VLbfJ|*_)cp8Qf(>tmb9meDi$vTm3qM7 at YG7CJxBcdw5 zAGav%QklB;DU3mnS936J3S-Tx3l^pkf1y(gYYC5E6que_^dDeju6jo at 8bvA-6w`%- z8K_}+m~qBL94v^`ERbUpOxEtp=UzACo)}D8 at Sk$%?K6df?Cf%Vn96{6*X&0LJd>S< z8DO;p`q6)a{GCgb9|7OA|M-(=;QwkU-2crb|MH-2>1^@03wzdIMK1+J-udFFsMG#8 zAHUp)=5Rqob}0<>BB9wJC5N=e6gJXUKb|*zy6~Mogqwna*0RloAW?9$sSR$YqlwNO z{c8fCsoEceA&j_lVR;N0A3!XNvgD98*`XUtiZ+tE9gA?-p(fXU%mulh>H050zxgX%wJ2?ncaijw zuipkL;XK&XScg=P`NB5=PQ(JGr0y?<`k!Pv-N}m}wX^X={i*3bQ5~{G#P3-;(rz)o z8_I9AS?M^axtAxi7#b{#;J1a5qB>t7O?@#3W2E}B2sIaH at 7sUl!@apadKqUfrC^Pu zl0pOoI=Bd;uE!mZVprG)_{;2 at _+MDBX_@Go630SBd7(<=i+q#v@?o$wt^lS~ zGNurvS#*#FC9|0pGBKzXSgB7MoP zT&!Po#Uery;kIpXLVXjF6#5P&NGyqnoM)izJ=*oXB4g79fv~yxseY at fsR_*X(((ch z8Y+%z1*EFers?UfyxHn{yg^M_RW-Q?Lt#Aaz?9Tq5#ZVtNx9ybZnDfSv8M>qh+WOviIQ z5B*AD@*)oB8{eD5`Y{-#^`Q#xn=rk-`2z7-wyTf*c_{|+xj)3!QMlV} zS2;X>=PpX2mvs7d$k1zj=dP=} zXno*d%zbJ%R#b+4h;*0Xme#xC>Rb7v0Oo>h4Qv7{`KlicU0s#v$c(9*Yz0 z5!R7PuAEffL;SAu=u3>Bvjr7b9vP-OVhl9%?C2hkbjH^GmQATpY{yLOgQcAit&x*M z;_X022t!C}>0z%>3)WO$wtj7l?Hi-NS8hNI*NevJ`Fl3CG6t!>^<0S$LMoKG at XZ)Z z{x zu2DNxY{e`Pqs+2+{EnV at LPFcduqaYPLTatyvkf!oCEdHVBS?c(q3ajC7qEwq+xI{E~UT%8DpUF zR;#Qu-epRZj~WGv^1d~}cwRg=t1J}TIzDq!hUuHWp4p9~Wa?zt<(aLV<`DRp!@^tq z@?K-8yH z|I#S!o&ytx4WwwgIB$KfiNCZIc_Fm8%&Z=RpIR-gH+2a;yTw)W(8TyRB_ at aGwp*u? zU!tEc(o)2$Pd>I=#;(I)bs4>nNI3Mv)P6>>SGEcvzD^G!OCR2NvSaMd4 z?e}J85gwuL at O;9_N5n|hhFhbj^~s2IWr1Ldy`qXwRRrc;IzX;XBINsQ1dZS3wzSMd z#M!;DuG)k`!m?q*)Xz?YW5k%9sS4A$&}JuKIn_^DBEnsC!pC1qqq;Y6_CJ4m$kR;- zB+E5eM$0)_;uAcWa%BlRv2ZDq(@!oN=1LcUanTlvV$&{JLeVakij*i(&6nzwKyQ>O zlhV$YN|hX{RLw(cNv7I4ah^6xCEpDNl|@hQ-g9M;^H>>xc`bdL>R^;q?H}G$VCxRsg zFn4T9729iVjy_n(r0X%5C;GW`1+-b#%9SBp9Hj_+of?=(v3O?>_nJ9F_VwkJHtr at 9 z)x42i6C=G3S3A+$B1<(Fkq|;aeB4P*bl}$m>WE9_6V5S~N=*atjC4K0(A5q>Pi_teH?Qs5qlYDmG7!UvlC)s)x}z+7 at h(>i?XyKV09E~GybHie#o_)6qn({hOrF=^|j>MGWmsBLYku`&b<5&Lg3 zuSX$Go}CdsRv9Ut|ptsmGLYt*cO#iV6nAaJTh`H2E{#{#}!AcsNO09qhM+H!gd#C5O_+i!P*X->!mFXgcna|d-cYX>>x1(6izw3_ zb4xgtzx)=sC6Nt&$$_nU$Vex`$_Kq_ at Ny*_0%=%yEItj&mR7nDgRRLh zJfDh&dt{9uP>;_aOcS%WkH&@oVXh$6Z+K1wqgVvP2uPh`_F5{u7+p_6q6W8DsZTGkRauB5cn(`!v(6aQl*s^y%BtQ}gROu{*QU-`4QdK-{nA5*urMwq~J={<^(NH?Jf18|BBfHO$C&~o? zUIj=NzU1_RoZcq^_{DiEVs*w%YKBY#*sBjDEJRVZ0-hZ=XpUpsp|8!Ij+wd$dLT5} zGO~b=(P3~AstwcBnVkuaR+)8JrG=KU zu?St^QY at a^jh(Reqf24MSCG=p5HI+pH9XV9{!*O2wR)n3n7&r*)(`J6G_SNpU$7!T zlJGq%+k*?s9vt5+d5gxxp3u7Ax3QtcgFctUf*o&eCoI_8sFpAgFO&{wsi;@$6*zS! zmLi({f|j&zsnHP&<-$KDzIk^pfWs=obMK=cjTqro_YL1dEy)o+J7&bX%1W(OLCfWR zeV^wpw5g9ClG8&HpW1tw#OZ4tuDyc9c1=`=EpUL8-Is at u6-Gj%knVu$O4Mth=`0)$ zidZ{tRx$GkEDQQX-YOBeZ191c^xWkjM2YTSVFltaftS$4HYSscBMs1`|7Wf zByB`1MOw8N~E;*WS>1TL*k;%d6oecwK zu*$CP-}~)(YJSDKnBB*&DZXl*(cMPQ|G}v-i|0;Tb^YkRORP5;>E>m@#y=b at txZRd@AHei zm8ms;XG_Gp+RTQO#kXD0%xYc}*u%}$B7+mZ{p_>zaQ%8h|IK+Bsmoo>KJ at +Y{^O5k zg?icD60;;$N^O$o>l~P5*s at JUf#2C-Q@?@Tt3G(;52Di5Z-Dtv$c zUO+w1o4s?q#oFn1WmbuYwe=K^y0R2oySMe38}HaJk|Y1jWL#x}p5mrEC+w%MT^;_^ z&$_2x`CaoVXEjsrR}Go9>48$q{O7tghr?E%H<+=(eY2a2%aSf#qpf2Toq`V4)EA_< z&KqRRJN0Gw!iN at j2L*XI$QVyQ!ZBBtk=85RxMzaq$T=1jwi_e2jz3px%v9_Cdg42k zq?iSE{K*y1HukBP6RufS)0W7tpjJOg5M?R+8`2gP#hq!#<%GoXc;Huph3N0pI9?uZ z7sjg3t+{XiYT~U-o$>aw_#a>IonB%and at k>Lq87o;5mt&TB<}&*%&X{>BK6;kwhK>kjN+o-(M<Ehota<#ILPTsKCLAC zhX%MYlQvV<&bMT-$FtGbYiIL3pTGI>RQsGlYmPkAZE>{JNLe%Gj991P^A?}Kdh6Tm zyJmrI{A)GwTWjWhQEF%&xlaE>_BZQ${h#|QZ&$kaNO}3`KA*2eR6Gl+ntmqP;ML9J zwOLQC at _tI&&AZXXY}2i1t08B+;{!R~R_Vo0LX5w+MnqWjSp49_&X_F;yYtQsbmIrS zUF))&n;7_Z;CrhL{E-!hbvbZx4CvJ zM{NuqQGTth_g=$`U7U0?hTlGTJ?5+0S>>hkqvmcMbiM0=<)+pPydPGNi4K#VEZx|A zt24u=cYnR=Tk>k&7K#^lDBL~LV^WT8uJV(JA*)zE$hUBMf=C?i`z2R=IDOAn0`h{b~4+I_Gks{8dmMRaqPy{ zGg?~b7x%1pT5j36BPssTGf%7MwVH3A-}xrDz&bxPqa;99;p&-#>7~>3+?4mOY&`yI zb+6z=E$j0eZ7o0hy%~S|jf9(1lJBYdaa>$Buqaq!(bmqX?0!-st`*tpMVu*sSI z*->>VQ>skN;wtk~j`QY at a=$Bgi+OiXwMVLD8hfbW?!&C1pLC`_P#u%mQ1n{QEQ{?t zTXW=AW38o$J$pHy;*P0Vx at F*r>2tOnc{NGd?M`5{pIgw2Eia7@$L1e9R6JnE<(psC z-5TW1joYa$*U4Wi#qu{xzTOz4+jri#FnOhm18%>tcRB69pinb+Koh_J(rq{T zxXoB|dZcagn%G>+gEwyvOuE at RusD3&icy1YW^8Owt&BHSU1^$~-^#9j&Imp=?CM0$ z_^}_Q`#v7F>F{i~tRVGKDkVPiPBzKx7_G0fbD)~x(zBQQ*_BD`nzO0YJ#C{*k%aI~ z9?j-KAFDwtUXWrihKLvhV?nn>&-`?$7ty zV|)5XAC0M6uM)!f^6p^c;}M+MFJ_&5{K(jDcIk%$n_T=%^Ho=UPU~kiG4si-7tSd! zdtFG8*cq at QcCuN^lAQH at GjrBIG20$9Wlzarr(>S2?(bgfx?Y{IHth773+g{pTPDr- zDmL3%eg9w&)_{Go%IxY*ttZ}&cZ_BUV4{I=Vc!(YaT`ymMEs z7H%DMdY7^65a}ChS3l)kKbCd$@PkP)C&sNE!P;Nu=(zCb={;_}wuZ&usXM6V9&NxG zx4f`oLv~@h-;^}#S|#=Eo$Ci(mx;Kbb}&hQtlTS!Y01@}p7C^x$M`#s at Lbm#nY(h| zs_ee3Nj<{9S{K-t4_VgsVc8tx*sliy8g+D!WJB+j-94&VDnTn6UcFdF|A~l*lK6Uwd-vb6Az{E(D?1qr+?V z=t1kaAkSbJ)3A`=0pEc>niF;BSt#5)7^SpCI{MbMUi-g{we*VgmpY_AW2fUF=^5|x zt~^U0#JPU|$JEy*?@ya6R+&{b28Mq%|7thAF7|Npo-Q6AdpB*dp8fE7;=@(3o^5TP zK8;~qeY|jqORf5 at oN43jy1DIe-Z9{+hv|Pi8)mEYAC$@+SX}Mc_%Un9KE3^?w>KPL zGNZQ31-*G*GbTC&+N4;sCg`5rlGOOMC~>MDbLz+?Pk94dMwLp144dLLe#m*%h|)S9 z_gy!q_};TVHSWqA-NARFtE(xA%q#q*%u`Mxf`yvk?sUVbry z>kRqs56$!zhJTpww7X0HsDaMawS6y|drrSQ>+U_)!>m)UD%?-MowDml^sM6vtNLo% z)a<&O!mT><`e*Te&B~o#M>Y;U{wXSBXUoRk+EndrKc_FI!otF^p)F*iyQOwy<_H??=*gK zaM--5-z?&)%${?m${xSc-|3XZlV^>RA&X_g9GtqWiwihsJ^lQnnd{!2%n4Bpj|)xD z-T!_xyR(sf(aLWl=9Mg2IZAOvicv-uGjq!hz71pWp1akR=dzN%AH1#@wzOiu{>Xa$ zbd{#JZuDlbE|pwm*sC44!7Q&lG~>w<NL z*|}}N++BvQNl{(;tiLE7XgPUMy~eeGm$NjRl=YpClyy3;tI)PS^jq&~v&ZfWX}PMi zYFlgOTG{l$t2gIu+ at 2=?7WWki* z+ at -;zN64JrMz$M2tAtNWus-gT%xb-u)!6?3r4|`EJY)NA`^Jylqv3D0*u!;Q<7j8? zV2AVp2f#l?S&b==Pq%!Rt#d4 at yKJy5x%9=)QiIXGMjHRu{O2|dgE0~e2aJFIPYwLz z;oxgC*u~S)B$^32z6tUFSRea82IGfu`%q#W9>DaT+cJ46)6S>tdZRb!UIkZX z at J%z#6fNiSL#9v8HaWWbL&T;>)y~*>xg$8fSHhH at Y&AdIgSpQDmfH4(AePph$ zEtk2F=#XWweB*{~PDh`{uAZ#^`HRscmxkN+75O1sde~lV9zPn(g(RE|I&7cM|O>Nf0v8+?|@hi-1(wNT-6`8Y`=hD>Ab-$~)Ga!1{ zrpBCdoq7L#8!PjAncDZy(epf$XK(cD$*3q+F62L-OONN>$X<-yHB< zeUGj0f#s$0bJN$DSnXdnHuq+awdR^x;r2OQ?A9`?yRP5g$?t@>QG;=E-O at FTyy{I1 z^?G+h+hr$*Ejzs0W__saw>v at 7N5%}Tm~XEnS>tkO$xqz``+M=X^c)t4X-^S(IoM_JqK3hmNr-?%yC<`OT>=*ThhrT1QMtG8OmpYU|orI*G^1uJBg z?Ho^7tytA;(%n at qKT!W$`rMy0=eC^8s(o`&>+OB_{*n28p9aPFR~>tDV5t`0W0z}I zQjZ~vD-Bd1_xn5}(1r79sd>a}iSLSAU)x4(I5fNRSn04nt0!M{$V_$}f8N at x>po_! zvj4oX#?d#YmmT_8zA!TIx$W1u*Uyt0jRxt(9)J3_Q~L9W`XNT4uGbTT*waSxIxG7% zrb)cf_xd<<_I-`b=3RHaYHDqnIX>C=sG8=>P70^KAM)K)+})|kc=X9Mx$BIi$z}28 zVcag6FTTHiy!?jLyJpRloa?eHem3!gw2cd#f*+`kR!iFN5U_>g(zr^_=KynC%hv;O z+h(W*4&7?B9#+1X-+%jO+24J*}7cbe_{{!#iqRvYF`9LBI z8`f6pyTshD8q{m#x5%xgAvxy^-VIuICht`5;+<`BHzQ81y#Gl#>Cux%ms%#g-8qBN zbxZZkjR)5=d0i_TH!=qn at N$4bfRr?V%GT;t9GVrD?76{@y^IC=kJG) z(3xmE$e9(h{lG2j=Qai=%a)}*`Cv6l`B6d-zVXt}&z(lAj#^hTVV3&Mz>4Oui_0|U zIt84MPte#fUG8m<)<*gG&d)ogk8HZ7sVjfS at XT__+nc{DT`cKy at A=@LXA5WZM#MC4 z8!$U!bi$9}4~IqbU!IAGInw3C+Ns})g8ZxZ_SUiQY7{vASlHbOz1HxSE|QPXcaexI z?eebtqi zWh!4i7;)ss%C55GjL)3iba&D{Kl`+YJC at q+OrNo}YyE$Is`*Rehku;)Qg>q20ty at Y`s(Mr=y8diu2_M!5$T<73FGfZ#)0k-1 at +z zz^h9@A7sg3HgHuqx@)a5lDxE1x$d_szQUthLsWBbH29Up&e{BmeY>iuWrE zy4&}BD81ez^8U~Z;l_-O<3IFEv+A}mhMoJg#$s~aiWVD}!a&WaWd4zl)i3hdI6W8STk8sLu>BJZ=n& z$7i!*ed5Pma~teB$i-v4bDr-zk3nwN9($|Gy|4Ao)JjX!QXaHlS$V&^idMiPJFPTj zU%e(Q9ev0?mMj=z7cy})n(yLk^5b|Lsj>mP}o3;X^1 z*F0=IT^t>Je2qOE{{@>PVCjFrFKkMFEey#1hLX_Vc*YP~O8om5ha!JbL+CH6N#LzP z{{8zF$luo!`uk&W|9%KJDvA}tC)Lpv(wT{`!wiXFk*ahSQrVBIGL0EaE}}0a(m*W2 z=I~iO4l_zfZ5X1aBc!G;iKoV4kynnkkcKa=2AfOz8NxNQ6jvge$&VoYj_yJtg}5Ry zJa#mj&yHusk{Yb=_k6;YisQ4RNWZ7IkjNk at LXnU^+sib}Ckj_jkbH%#rh5p9Y{wP( z_fk9A2Xz(FdVs6-XNTb5F$q at p{)GWi$G}ey!9Rok5#6>>N1Cjg#xO%7nc=L#Y)%-r zeWL+YZZTz~S<5mQS!(SYTYr_cWyq8r5 at Mp*A#DCQUZ@}|F~0iolw+0}z#yK1;@SzR zZ&M;u|E+59D~kh#kJ9eW at UV#oq{%Yv583~vy;l>D_Itk&B|Vl;^MEfA2Z2lz` zYlug}=hT at lRDA)yeWOWx@{_-udpcA&_^MLZBWe;sJ at o^IHd;tkt{<7I3mBAP%f}k{ zaiY1Q>@YU`>GyB(S&rUg()$Az``0a-zpUE+)K~;f&}Uf9{3c*p+8ANaLDYoJ2)=mD zsL1Z%i at 6x#CC1c*&GCgd7X==d1Hx_?;nzc`2 at k~=4$T|lqX>k at V}wVUQxhJBFMKGk zx4JqIF2D${8b(dn0$+GEv)>F at 6=4|R7nan7E%Aj5I?p-^g)=e2!$(jP9*!^E?DHvj zED%n>2rnB&P1p)w_(!>(#6ck3Cf&YK{a3it7>XTa2vHxY?s4jd3()>1jm}dlwp6w8 zmFHf3fBpmLeX1DcZT1wE3BEa^__2BmQ0{_Je&9$^nV at 5re_EPQ1(bJ4p~_udC at K^5 z>@g466OuqZZ(BWIxlN#;! zpWyugUvB#=RQRm4Dz{aZpkx;@t?_Cc#X2JxwAv&GPgMoVi!jPj-V~JyMy=-hQolB^ z>gng*9-IGHxx|-}GQMom&Y+CJV8%S4*1q!oE33dEm5q*$<3n8!W{iPt9GlpGImr%? z{{|Y>1T2q73Xd^-$^;)U at iU`f41yz<7mW|vr#7ZrSMXz1Pqgl96R3jlm1_s-p3eoX znhzW!dm&|;MU<4?*|B^BZ{T_JVp+n!Bp5IF*+pA5L9;yS#9-J85uKNGjEK*BTF at GD z7W6(7Db&e4lSZ9KrIkK#BIDCQ at 7Sc;p26!csd^=K5~;<7NjJ9jhW2dHe$Mb0aU_#6 z0$)02K*^2SppKk at F}n*%>+hf>ZP)$_K~DVW7=9wozrZJ_%J`+d1~#}=4kgR%rb`y2 z;HOO1IHR)55Rk`6qqgXuN0&^+Lc(@UOCAO4_=`L`VASW+<&oOS)4=9MpacwQ3Dgwh z4$=h?^yA8$A$J~te%wQ=J)_`X1n&?{1U|q%Ax-ZdXqa6}=(M@*Bqe|ki;vg?_zgbG zZznsz3>d;-;1D_k@(f#3we~ zchfls13aZr^E+NbnMlRXyF4 at PmI0bBO%5u#kEC8PZ9ma%3Aj_fD^VTFnw4#ENsZ-~IfEvf4Wj$m!jC;RRjE|@PCX at k*Q z25QG2-?ZWYzk8y zlw-UG+HsaQQPsv*o;4&mY6N^xN3#6^mA}f5TgjAxZ)(qmkF&8jAuI#IF6G~!@lhex zPBHlaHB}0AgAzVdM&V0Ke0<|P4A}5!mG*G$ztY^VBBWytg!EmaW1{dGmtU*Os)Noy zOc5ObKK~TSKq`osqCej-O%pzDq=-7cLBK5#LGj`8_^eQh<#FI9-+d06WACp#?SDyE z~!g-8#$MNC3VK^*tRN&)ckj(bl`yHGV!+L%jRBsBSBkqQ$gE8TSXiWJ|$&v z>8$ynH1B2FqtgFUc6FjnNhF-R7AwBJ=nV?C0miqs_7?5<#%dl0HFemLeSY9=Q>^m5Qn zot4ln#0C>FIDf`leA*JB+Y>Q-Ed at Ml;evq$a^RLHe|5 zOM`xGU<+$1Sc%jmI3lPWT4gc|Xr9M-mitDE)cpNi+izD7T8>}_C7clM=PyeA3Q*c= zsArixx&t_Z9(a;@s0_f=RMFX|#$Fs4KIQg;2f4wZMGBPAb>A0Pk(A%+?K2O#na1=O z7#;&UMLz{}PvFov${;sZA|as0v^uOi0KCF@;yfREC4nvTdom>+A^ES>TeW zp`*XqRB>7Oq!-PNTMU4GY?VhR{o*j%B!c~Gsesa(zs|9RCm5^gA`!rc=5ga$p})H> z$&_jE`h%=XB`P?hM9uHiKaxBz}dGKc5$(MZuIY;@hORm>Nmne%QcvF at TxpI6u9L^P8wb?V=as~ zSfYr|vrz?fNT3PGL5puJxbqT#B9u{=$oeQPkYG9&iQ5rldw&YR-NyL3OHNV4{kyjO z{ad`g0cmCt1Iz2dY~iYn&P=0=#HZo2)Rr_ofx8U5Wzhh;Sr_TEY~XT%xZ?}b`-exA zEd+yAfFjy*Ib|IJ;^X{2=UpiQxJV_`UrM at 4A1As8{OrP5;0P>5LIo|}t_u1*k%p=C zCMCoS;1&V**+~fJc1sK#wcZeON7d5<*i0cNvZ&!6H7J2?ge5Irl?UJF!kon?)QV{v zB%5E5$lY5ZITRGbOBpqfAxqzMlu1yP z0Zk_)frac*KrO_oxno3p-i5&lD`voWFHA_y#*bq1 at IjKNw(QjhKbCYuR|>2zv_bfY zveAY^hXV_Fiy0{HN=Z^e;JEC95y)kF3w&PDK^8T=$+FahaW=X{nEQ(EvQFuM`3S=_ zQ|K_0pqyGEd39R=^BrLN3o-jDcbJL&SH%6!pyYkvE$|_`K);(T^dZ)2|1Tec{~1M2 z8WFca=hy*$HBsm at mTUY!dC}k_A?{@7&jYv?G(_vGt%?85$(8CoH-fk#vQU3MIh- at dttC1)XSveEy7i%;FmzgUq1N_!g2#AZU&k%OsG!2+G6W0vdkdi?0bV5}aGhK_0v zp`=gn*&3d67@(sqmqTy$Otz)-+4$;~Jnb|K&=fl{%f#IdG}PgL5U@T2uA1iou03~0j$_p9gR|GcBih6uif_I!&`V>It^nt%D&XJ$(LbTK{DU8 zKm+&2G;qxXI{E~w$|s}WH-oRgDck-`^CPW z`upFOGywe*vgo#q@>FX20>4WH#jsRjK_zH{^Waw|LKOQD8Weo-zCleXA at IhO3_5&I z3#TTIb36-$gBlm}r~L{P6c$#UPE8o+G!6>q*c4~>1H!sM*hNVAR1`JgKgU47X99tV zdV$}tLzsM=a2JR@*Khf-M{o-cvya%js9nI$Hvz5ftzdqeE?Zl at dTLI0Vgi0*yNn)^S% z;zJ7;-mHYq-%Lzd&o1l`lzh0JRC)gh9FgW at u#$`a7g&OpU0~$s{aWXAKR at tsbvYk)~cYJ z%R|?81WPdMjIOkVC)9%#Q1 at FmTTGh3M-o-Ja$g at BNlCRoKPBvbzuWx3;NnyLzo+e- z2FdSI!tOFS6C?uVa`!>L~#MEH)i>M<%Dd{rOg zw$3{x7>xax%Z4f^$y7zJfgaUNl70=8r(l+n-%gP!i`uSk9o4KPL}4~#PmGt9zx%QL9AlpV?45b at 4y=-XQa_B4C^cOFpg|i6l^`vRbq*(BTf?{TJ=YDGv#qSk4gv9Tj&ENcgg*XE8FajPbc-I2 z-1$f>jNbJ9*A+?Ry2f2`I0TylUBArS3#P!w=4fYrTSJS2FCY0SR!RvJf`u`^XN{EP z{~0c*_2;O>fN^U8(HZn-4YJ~wWCY_GqC}k#6Sl1Wf%rjvo&qz%a)P0nYTN2l(SR|Neuh>xB@%sDEw}6V#Zk3Oe!|4H6HJ&w2N3 zrp6~=R*v%M(&UjTJr0#p)qU?*B?(%rQ4 at 7UEG+2JNPGEM#+b2RK*g;ej7~JGM$y9H z%g0%E|KJO+pmajp=8h{R`9Iz%c`+FK^M0-dHeQ5 at 3STsiCWlJnEVggyECa?yNegt( zmG4athp%5fZ$`r!xErd9n%ZS1J$*-JTtYl3Q7FqNf=y7GWtV#8Yr~ZTW=K235&{v98P6O!wKIaG&Wa<1JOqSYoR9U)zn4NXZ at NHNQu3j=6p{E zb}-i%J#cE_Q6l2Y?vlG14Hi|5Ei$N&c{Yh!LH-y5$!s&pe0R1#pmdQ%N0_R`)F{8* zl~|&nd59U}F)|Nv#22m8|3S}9@!g#^ma^ybkzom()hw9 zXUknOfp7+5Cj9kjHaEPAPN>vn38zpYDDkVAWHGS~cieL~oe z58O$Yflp{HFe(HtE~7{moj~mNP$ZE0Dxux`?(PZZT|EVK*gd?Dn*Q%U{Z1=@f8SRS z9FaBV>L}16E|^2G!3U|a2sYfUy`|S?gE^@clc3`8VKU)A*AJ-n=XX<(^Jnr_%w9e)f&sdfye7K8)8(PKbbQiC zTmDEG1_tly2p`+TKBYzSW^zKg(KaC=tk_tQ)Hgq?=fIS|neyo9r1OFnmHY(xJzwcZ z7HGt-O6ctE^I8lH!S0E~CbRjVERz+{{j1T<=B00~j+{4_L9fZ3x5CN4(zBP|p` zeFc3PmtPF at bus!qKhe at BnEj?4dAb~CRH`Xw zpolItU&)FKBrhWG`^7J|aPwRp^?PHK=o9f7|8-8x1E0@$r-Y8AvKq7)?Y)zPlr6^_ zC!+=YUn|rV3e%xO!dI_2 at Z})PE%8NnY{- zgCq=46mDnV(bV+EO`8sWfv;ZE<-yYixT~#=w)6Wj)YL_JY)$XEU*V1a*Rq&pxDz!3 z;rtYm_Hy;DUpbhCJKI=Sid7GL8Xve4;78Ihtw#lY at JU>E`XsVr%Uq4&-|qgpr7k?? zZ}Fs0B415?8RIf{2XOn8bkL@`=|!1EaQb>?`D8;dov2_grk$HaCjEQsSnz62k( z(xAR!qHHieu{i{dx~6Ynod=MH_nCwjnpP2H(zdaDA9g5EIX2dEP;!>ZNl6V at U0&)wL60&LKG}3!dc^puatJSygoAt z*hElIbf;!P3`J>t;U3>p?)?Y8xe-&pZnH!Pdvb}J&9v-@;$1k8E28x~ZVm-mf)nCd zI+^{zx55{Pkj&)^MTpvjhx1tBgwfLnUU#-B1IiMZM2!!U$dsK}9N_sy396W=Doh54 z#$INwegh=YEC!?g0H?Ug-+2|Gep#fEi;PA31NA0qu3z?+qGZAm#e%2 z>am#j5oTsmXhKKe%5aIcg415Ed;RFw%>-fdIIvcPwilBhfiF64bU}(f_+Yr*CH%qF z>nVtme(;B=mlrMqZJ5dX} zxy|j3MrLf?AyN}xQYN@;`!+C8c2h?!_|QQzNxL|{fh{YFJJTkLU;{cduA5dDpxj** zRo-}9l(Nk4*AWR|vyN5bcvP)U0a{5-~K z1vE~p;;UF3^cUniSZ%MKEIj~<$&p7xKns3$2rv3Tw_JKnaxEzNe=6uLnldSw{|y=+ zZ0CGCyitk4V0A|$IaCzH0pnAWla at QdH~Q*j(Ba-)n~Y+|jU!r!o!1NPqzs1pDVWzw z7V45o`hazH6pPR0kf+v%h~Op9UtWMYSu{{YeGf7O668cS#@Uax8w3;0DoCT3m|6|U zE9UpJn9j`Dh(E1PHP$|3)`=m9VR$v>%IuJSVqgi3`iF^pA9!U}Ujd~IA0P&WV2wM8 z_g1$*p!AeSDZ$2KPzVkqRQj at t_kl*LR7S5RJv0 at ALcVike%b#~ATYWGrs&M~%z{1) zpHb#8AZ9-JvA8Qb;;eHaXGF)u at dZ1RLNI2G!JmKS!wQFk4nBBi)~@Fv&}RUn&Lko5 zeBTa%1sg(t9t`znkw!@e{5&}jenp at X`iRe at NgetMR;UPa at R*$L$)MjI*Fa+m3)aW at lAnWLc?$8ngmjb-ey|B;#t?2OK5v<_M+=Ooy1+-DAUxcKciiay z*%$QUaT5sExXoK zd6COxT%Odj4)F+DPC}<&`aJkN8-`by+94jnVSZ&~MiNYUm4j)&>{T7&5#+yEqP}na zB2YdyrhGS6cZi3Rsb1iJ7{yr6$K at T)>JSeni#_BGHTd?(G7ssbJy0oPTd2lxm=pk}xfX7kat!`SB7WG#PCtLoN$uzbe+8Y_C*+wtb_)5p1dX|EFp%?6LAseV&uWzBLTHU z0i`~!6q6dy4iRndLKSY-3je=U2A9;iyKCE6{U=2s{RVJ+eRfc_oY|8SSSj%vg1ROGQ1ZQq=+)N zJ`syap{bVq=yoC!RH-Q#UB(G9SuZ+PP73gR_S6LY_OyOO7e0~2j3hzXomCj|8n-=p z at 5Mqkqez=d zw#|6|!)BkYVCE0OL|or7r3(_64V%juAIFL#41lRxSaPro<{!cWhjt7|;CQ58vS>UA zlgX%~cW4;HI|RhXIrN`DzaOxdrN9Yr5W=aAri~MHNRd@~VUe%O6;P#t at +fkHO-GRg zm726y`vq97FkIEqR=i~2K_ot~Xq?{n2k^08jMIP1l`haOipAu_f#1jYGGin0d5MLO zU1I<%LmgeEX?W7*!TnG2Bh`bAU4j{)bTCLx*g3BErAu>TiMV7THEPlA?_mAZfXM)6 zJ&`U$5`k3$#iiOd2Bw*H-g8F3y&a~n{s|W+}IaX=YC8UiQ|E^ ztyA=^mHQctVz}mo_9DDhK60uUtw(s?HM>GHDFJXEV^U*{4H2v12!h7;``0|X4_d5A z9^Fn>4->2U2urkeM~i_ypuEsV4_WM|(z`(No?-SyTW9-mGYDJTnR&#lwhGe9GgN z@b+dm at q{B%>e5WVW2!`B+<)^jE!_icFed~!ueB1HLx!} z_U at n!AvoJ!Z#{A?7)twMPB^`HQ$oPayuYWMgniO`Rm}=`$MA{*>MM=e zPlJOwRwV?w8y(-|2MRTF2pXPz;Sd!dzN*f=?L#}kSDrAlLQpZ8svvTm9U at d3^5Nw? z`^LH`cnw_z4VS!pkp_t%9I)!^TzGU$o*i>9fhzimd4FKXH8Smg zqQpqld#=i#at+wf({5;rualLe>O3AZQS?>Fvnn at r;3KQ93TQMC?#~X>hY8|6Cd%W<^1R~pzEE`Ljz=oHj*L!gg6m4O7OK9 z`7qGk;#JX(ZS|f^*&#ZHpNItU5eHL2(wG@{9Xo?&snkZ7IbT{S^*vz-aVj|oTl!e? zkP;|Xi~?#0(ci^^i3;?FOx3Xb(__?tV`PO+jkOFp`b>PtkXoJixxm=!RM7=hjJg;Q zQJLig{r14ZDm~DrvZc}0u$LAYvYiCS1;Mj0UOZMTn7C|N5zKft7kBF)(n9O6Ccgx< z78#UQrqcl$j$;OCfp?D^R{>fzhNiC90UC~n25G(Tu6eZ^{PdcE-e|DtPL)PbZ8skr zpY9F{B7-T2d5;bh1jh?(?_L*gjRQ1U4DEq_2WU9%Afz2$&^Bxnd?6kaC6>}hd>TG0 zuB>qTZs6YzlR`(Sq<%D5V9ugo>)%pSPw#S&<%VKq%DqVR<+3OMqb;QOy>qiGdvEy;x2 z{S at -(VyJ)Pj;jq!6dWLf)=})lEl3B at MVQU`F6<6N z at sa1hz1&m^41cXGTBXX-w2{QA&>(8+53ToKKnFHZMo&=($B2o-2lZ9$>{|@Vv)PRyJjLR^t9D~}FATEl)T}X+mNeGr{PmUy9edlJ2iNXiX7 at j_01t`z9 zPU!X0goSiL_ylFwpb6!m)(U0Oh1tYqw1x>XD=@M6d}0BpFH=kc`}kD4#USHkn}1h# z17`hE0UgUdGsNJKch^mGhgZx2HMbq(H?*#$4kNee!UfK&P5=gQLXq|_T~C*RPpG#p zuY&=B(-qKOb7Lc|_9s8nf~bj~xQl&$Z2}_6NVkfIB5$B3Q`@px at XCS$T6sA;=<@Ih zgI2s7-v{RIl}GQuady+SH^KS)?>~w1BR&j#<8}?$U5YB^?Yg}G37BBon6c|FAEpLX zMQ38;Lmk4BS!l9#+zoTksn02+Bb3|;F`)R6hKK5J;Ud6D8r at l6b%r{GptVd~ns-6* zK^SqJBI at D$@n#N2_f0mRqbyFadekzFhy<=aeAY-fg4LyhO#1Iq0$+FW z`lC<&1De3)MQ(F{uN0|EU?kTct$>4ZFU(;4y_!t&_x|}GcMwzyUiKr%IQk~U?GC68 zFDZ1*d-V=227#FrjM at 9@F3`S;IVAaTkB&aUGI!OH{aN7apG%@!0bL%FZjSy^C7h!^ zwY{=00>bW6sPN}HYQhAT&0vQ2fh)}djPTD#)PxB(VA9^2+=7WOUSaaN>pr0-OtAHr zdbP;I69_BGqQXhfsRG37V}tR%Uf!~ zIQPGx at a#LuA9z5x6Q+(YH&YYFx#%T0QEG0BSO|o}FkhV9LQNRwMi&&GqwBg at 7YNHs zqvuGTpD1<^oU2<<*_$&_?-Nz^gg8v02WrFVKFyXw*3!uCgqr6&@qB24MvwL?S z!564XVuCJ8q^T);u~?C8PB{J}6Am1gSvxuL#dGnhMJkHY+?4^Bx!W3t!f0BE|Q{Ia1{MJ zu`Ws0B8aTBwVtm77HuWEs4J&rO%I8$e=GKM_zBR|@oMNM`3whY`Xmoh2-eaUZ<}j_ zPW%Pq?YLPvN6XWHsP9?V~7 z3&N#ynnI8E?|T}=JcTQ~jNdILJUGe+iRO7Rd3-kUIa&Ty-ACI%H;uwPR(lKv%gItqCq}<9;h#ySdr=b1cT?6W4+}-WldB?%M=tQCJG<4w%eud zlRKx^d_Db0AGH8V$WAAfr+uD(3Y2-N6*AWqC7 at t`KkjWV at RW^b(`jkMiEqx z{ikP%sxUrB3Kg|a5-mzF!PooqbKu$WILzxf>ykx_{`=xX`$IegzR!}U9}Cv~T1p7l zy~8qkbuSWC$opXK4|?2CBXs}AGDRc`U-JC}`FoQ<|0-5PN4{I@$s~W-$v9pp3-)D# zlcoLhv-*On(ZVFup0$Nc+-W9XFov^nFBuAAh4xkMYnEs?7~v`Q3yYHot+HJzG*NBDdMj?-~ zwmUnXC at xvBfu9qezZHxCrg|Uq%M&c4opwCg zm at 3)+z at o5r^fAiX1Pkf1C;Re_0PV5zsJ8t{%Gv}=Y4z7lTi=3a9j%0pGj?YvYybX3 zdyFvAIHUR|)(P%2%VM%rrk$mXvIz|(r|A0gRbW{4QOuinTZ?J*;b?9=iyYLaLaWFb zfRSdHsc3e)Vz|CVuQKRzLmy||mGZ>{V z=s4R}PL+zU%!_ZE1b2p-rBO>bSWl)b{MeAF(eULmzf(S-*5WYs_O?L`3cSFW? zI`~X2bX;8bls<)E;99q5$v{wFL72mWu-9aaKVkbsP3)VxGyvWR1uF*RjN|?r5yCDU z!7L5mARuahizO9D;rkSAn8%oIy`!N{Q1KcOW3#8im`yEoRDAWGx;no08tpROQNJE# z5RP0}_m$j#5zZqHPgUDvEJ20Mvgq4xL%!36d2%_vEVx8v5~Xi~M5b+S zWN$!>$J{%<(?*v_0e4vSz~k=#HwTm1e3FC$O&s}&IEynrbs#*mlSd<44oK4_kwvzw zPAe#5ff7~9pd~Vur^_J^IZ>}PPXwcH9Q!BP?!g`VQz3*!WOm+q4I@@CdGK8=;`4yvw at y|+qfe|TT-WQu? zM1vu?NJUbV<;O168Usuo#v?KuNCQLV0#kw4&yUTZlY8|>2mb?usiW|<->H3j$p>R` zpgOvEePuzW?E{|{2mj&7<3CAz-AGI081{~G!{N?t)_rJ z%VRTEq%y(ilh?32)*EOZmP0kC*^AU9n74~lRAzhzHLy|^)%@%vQj=iywPseNX$sKn zDT{g zR=z5O%GWYQ%6oBVvUsFd4`wY23myeWNg1@?p9`fSk1t*wzAIJ|K17Xi@?65Hi`%mK z|5z*e>FK`Qg?8(K)qYn*BhmIxr%c3`UgkLB%3zp=QwE(+(zzm~T{!V99-j at yV8=L4 z2+@<0f-`vU#6zWEIuDRWLk+cfVqowg5u7-kmoV)QW|Q88FB0ri zOc}X1PbB{&Y@?kaXidH}nl{Ak7$sK>K8 at ugcti#Mw`kw*ZsOEZn4#B98J+AaPtXD4 zt2K;sZ?IMFt2p7)L;n=fcLs%T4unU5o z(bh2P`ZjoGB8L*SFLaPdRARY9;y>n^Di1 at q%=|0CNffDLsW^kEnGArUm;Lc(0f1f1!>bsH5WITt)==_E|mA z&aL~EvN*o<7v*m^;p^qem>r at rq^#u3aq at HNNw zMj(8D12TLp;$I#I4V|EaHo_J|>I{7CoW);Xz*idzrO~b5ZG)&a0{Kd}>`b?9tATd3 z3hIG=HKt at hc2L!q>%xiU!}rBS?x!yMWH{(B_^F!&y3zT at TwEZ*z?A-VfRh#|TNUPN z_}8Igq6k1G-xm3T^1!rb!i^MeMFyg(e`ic at v%BD at NfKzXKc$hR1rekYC2EOrN_xRx z;QOvU&{b3aQDmxr&Zr4HU6N)^c4Q}JVcE$? zlsc2gj^%RfBA9H#?VoqKB`YgH3xvv}*IPX&(vf%JfPs%4&q98W4;>$JqXIr{+aEJw zESf?CN^lM{H(5y<*#9{RG-SUxkX)Pt-3&HS+}iD4me+%TW~3wb6b^qX-g(*!|?~@np~iB{fika-B{MK{B(dE=rQU1-}2ABARZjYYdsV zZESl0kYMJvWk$h~+lw2;4q+3YM0e}W`f&hw2wOE!mOEc;7Qx2BHr?~_Jz+){4(3heuWZ)(W?(SvgI8VzexD3 z(t;_U*Mq`LS3{%NG7H5h5cwkPu4BqG4KU`&DWYj?mle~5*@GY0oDjaqoIfKbT;Hz& zy23Cul-X8FlPTB`1aq!PW{wUoXE3lwZFzKj^R=sVz0g#Du z=$62;`yE8$1B*H>P;P;F5aiJ+J^7$RKmy0_L|U93C|hqWv}-Fp>HrQO*0h8ZJqH+M z8YV<--wT>BbE5itS|3 at S178-BMU8&;Yq|`Ag995|sdzw0lR*jGCYl6-dm6p9(`7!w z`<|FMACXr;@*Cp-%ElA$N5D*_1sj1xqQ> zgAt^RdFogyH(i^-kQ$A8<4fh}5%Bd_e17+&2BxHuMa{vcJDEPHnZMf>vA}`g!%Zup z-{J$$j at o@?0{}{4V)^Fk(*P13^aNbFHVmkr!|X+e_MxFpI1hXY9`N80(0`8k`bI-K z`uOTSl&vnp(}rwCbmRGj5e at Y}egdAp=%kKQ38EegNBjpLTs6lm zkoAMaV~U=B;CNc!NiAe0X z6lD$H90=6csG$)qhqlrrkOowkdrFx;0)xh81 at yo#ESDySe7bqDQf*H+P-Q=*QDfM) zS4q(ADw#w^BrI= z5zanDlR)NRX at tJ(3|r`tH0nqmKPnc6O8eA3y)46qyLXuOu{=Q&O0YN7_t05Om?w2L z<{6dur)UzW6zKZ!Q;){zFc|k;&}Ht;LV7rYMY_>bC75`5yDGY1V^-1A7xk>01)!N# zyDYVVdBHlN$t%_FkkLehT?dVrU1R|Y5stYMx9$O%tnfi5`58=pC1YMb^fa*nl#j@# z0l`w%lgW?cF{8-iaPn4vToVbpOCctTsMm8c#y{y32_N(nY|zaeVx|V_sRVNez4jHI zsZ7*yALqvU3GklfGG#Oz+OA0)4n8F_&bA-`Cepy#Sf^GVR~VN`>RDf4`+detUO>{>{91(0@@v zcLl07#AAvWfBj at 1*&hTysYsw*#jvv&KmsEenA18RW}IG&InWrWOP_+zh>7 at CzvS0L zX~OXmLEXq0B1c9zaWtg5ZSeyWN1G;UXQsW##D(7q#@GJj;UK9GddL}R)Mvffk4)Qx zP6#jrrO5T at lMEo=lu^gaZGc!Hd`#Tw(Q5GO&O=o+l(w%48D`wH>EOQviDhwII;b3# z9I#mlm{DiU0Z-;IGG*j-!f1i-!?$OJa0xSNL)@in{*U2Bt)3d_&h?Ms9l+tkM&~da zz5**aj`189j-?4BD9+WFdj~84O+Uo|o!zh5(IepNe>7A1X#-kkgDiT7WV08UJ|-ds zZ*YWw=S9h5&%=}#n8d{)`98Za^bDBy6EG{}u-RgOMCY=G&=G5IjlBr0u@=+8 zmdq8ibi{F1f~i|-(n1}WdI at v>n7=>_An}?2!lXBRzq=pwvq_!N1baOfQ-t9QPg-qR zvKih;#@y`HPNVLCkk{14TV+Qqa5J;Yt|DUyrfi|7Z1H0>AY=2wd=;i-`x`yN!(IAn zx(s~6+4-iux`Os at Q$VLVyS4NP`1+O+XXB0n{QyjE*#jG>>JvQN2<5x2_2THkJkyw` zWDjkjB~N~97^3E`xW6 z(=j*GkM5?0A#`nfMTK at rBup`CvCMOyNr z>Z*?WBR5;J{k?DDP9Iq&76>2Xp0oM^%-D7ulfx+B3PlWYY=~gSni-h})3^4LMcc#j zIxPUc{B7s6OLl{w8X4$nS*MbsJkf`rI(UvHuw7g%pBw%AX9N4V=xCf>Xu-mp zEwNx77{sS4qJyh$n>Z|d%3gKb*O{P1U1ia!LPk=B66N=wh!eF5R*lYUxr0Dye#oJR zK<}g}aqwlsjXt(q2cQ1{leH#9o=g^dDUayR9HcZgGM!+^*f`9Az)~gp6nsXl=5Rll zf5#qk#AvBW#t?J~`a2*Yb>B_*gP$ZMP`7Qg4ow_Er4>)S%Xkb5b4~|c5?FVpN5I!t zcyVi2E9i$ql+b{im>y*M?yLlM2sfO^jEP`}h}weQHp?wFM7llfOSlkc`jA0v6MuIH za{Y*m&`6jX^oOeQ}Oti^0u5zP4Z zGix_iqAyqA5rB4qi5Xdh+qX|Y9vk%J*G_|Q1Y-Xo9V6oN^fc{9js at e24d!)?Xmjd3 zg2820K-5}LjtyGqnDxbi)Pgy2(F6zAP&R%{hRlCJc3x*Rh3>7HU#5fM8YvO zn4;(y=8cKlj%1quq`(v&3IF*Q_*aV{_1Tm7K9Ybs36nzSoQqgg0;B4FNN49WP_jdv z&{1B`T^tU<8lcHLZZ~jfd#a&M`UD>`iU%94_7c2!Y%Y(@PZYEgal8}+**RBg=fmWI zQs^Rc!eqK24{kgQCfLI#9h80UdrJZQsDoBqfInT5GmFTe�Y|X$1z|rxQALEoITA z2>z3N$82E1^+|B*g1I<^WAkdG>EZ|su0P+>;;K4>kvs at p-_&wwA_yk0xwC3BL9h9$ zhE~~^`DB2W!n}}1 z5koeSA^c)tQW0+ZbBW}$|A}o|n~s7pCR!d%+SI&-4B-{U^!(G5oV43A{EgC zs&QwNcf-0pKyl3cB2* zNgB|B+!IA%Pc03$GD&kHY)4uh{YXrZeK&pOen1bY!D-Vb&M)e<0! zR?DTQq|@K8gk*5*!QkH?+M|pJ4v=CO%V&U=Zc#_irehk#f{6-XFqMjShHrS@#yn^> ztw}5(VZTo|IGy4NTKk<6<{IY*@krzj(unm3tfgV3wK_TzlztM6N4!|##wSgNSwYue zu3{LriG`vT$gnRmW8E!aEEyQTIg6nx4wl?+Zk6sATnN0UkzG+-xvcm&!rk{xymS6x^jqL6LTD3_H zHKf~y9fsl~kCbO8-2-Efng%+mE*U6ZS0QT1);5VuJD30fGpe34>wp0f@>KJr7d{2N zi7J@*152 at ZBzuETvlj%M0Ic!KC~Na5 at f!}GH9V_~yF;=)uva+L{-BNcEb?<*E2kTg z>u_JOIAPyWCO&bGM4EIS_^FA3ZV(@IqD&+x%?2-*kxxLserJFlBkyvis!gz;d$MT? zT)KBwKxgvm at np*O?AQ<Ml;!*_QSbw7O(wBd{n at Ct;!~V^29us at Ys(I%ALyz zC*xezIbr~xewc|#J~&_s9gZzKoIIcp}c0<*!a<)c1c&ibu^pf6?+V7Y=I!L zYXS(0iXfl{6VU at 6;N-YFuYeePPmIPAjWO!a7>(F_i3NL)5_>_#-eQS8YSef3?j+up z=h+8+|A_M7C*SYx?C$LB?Cgy7C}zLI)g8u_UZc&zScP4l~oc(aAVV<%lBF_ z4wbcyaKfDo6Guwu5Tx-0L*Sb$_C(!VzonBU9GN%0E0DD($im0)ktLY*dW~8zaFA8r zdMm*n1ct6gJKK>x`j(HZtJVl~7PHi*-Ak(5NhDu?tzK~}2)N6a!M!Qw at A$Z*wJ>z* zw31&*5RSZmzACD~IMoBcBzGFmMM#I8aq%mUQ0RwS8QlNZWD*;;#3PTs0xesOB_}eA zW%7pnrLM4SF1zC9_SVVVEb45%Mv&&Z5!f%F35tjD#e>oUr*U#IMqtSAJDgwy4!YvE z7{AUEvl>#7PPEF&AZRm8nJfh}B|0`AJuq5L6xn?Ci#!6xgW{d~(Je!$1Ow;EBVc5| zShqZK-47_?fg5gFC>F>fpu?xnG#8+Y$=*cnpUaE6;4P6Zwm0d_5^%;>k?o)l%iVF3 zGt1~n5>$&o3#Kkvp%U^zu>gY{l>vq*`mutk*HR1j6FH||LMTInOND^gUs zHMT|ewizh)fk7HqZYm!2t6r}SO`{Uk_T(Z;(50Jrh=PtTpI;M*RuEp;OFn!=mPyS+ z6}r7mi{0pvn=5{9>sgLdc5xOxd^P9R8&s8LMK$(0CE~i zBprCxS2hPjQ1u!P&tHZtWWv00G0WwkGbnC`^hVdg0lxTXyME2ZfKuOx*YfdSk~#f8 zC=?Y at D=l;w7lmZCpn^*yT^^vyj6~_)+!0(1mZc}o(RNpxbuNH^k9e!Sc at +PgP0Tdt z%o&*?yYs}P50_MeY1M>yMO}3)7mo#7ye}s|eOzNCnBm5L__ffOaXcJ!)PGZ!Ohs?< zD?8&?c?s)z$C;V??d1u*GpZ{yj<_fMd?Wu5GrZ at DiQgBWM9G<4akrDQfM4d!wreY% ztBEQS>MP>WN%gjK!N;hyW|ij6b3u!HInJQ#$CyE7pT*xY!%RKoiN{^M+An86;^lMx zE at wa_O1n#B$~aoc$p=4L`zU(sHqLPy)(7PHup)j$>U*SAM0A=Ezq^TJU^b)^7wsWM z{50aXy@;pGqc5)`_y0sk{Qk|an9XAWv^`s532M4q*IgSxA8u0O$oh+%$czo?%=IHJ zQKp at I!t-Ie%!!QL65=;b>30q^Kx_S5Cwxyzzs5-ts}(F}D2rm at GGRgkkkDfXTtY!N zIVl)U(@cj=YlfFsC>FNHJsopz at gdW39q#u(bPm4M(Bj&5xVqPDTu~upX1;C|1#&jP zV0N*C{9fV9gnTP$(pyv9cD+LXM>_qy*4_i0VTP7*!|j5$O1bomiPXF0IaEJ+j1zu# zn&HgDK<}9dVUH)FhJ&b7iVuDb+r*8VkRB*AGe($(ULeQ16YfB7HuM`Gow%$}tjx{k zGkYw9uObD0Klra74L?O?lnRwWuwicBzK8^!?Npv{!Iopf#uMcvR#);4!!_~G^c%pesMLirlz527KT*6DB7t#3^Q<*6E4-p zHJF&OmTO#n zF%$Al*a02VTs~$N%1a;SghMt6WkPn)skQVy9znY9d9>(L=y;wR4tcMM6eMMHN05cP zL%P<2wK^*Rp8y#xr66Nedh1Vg=vEVdtXCZb at JNZb_E>}zG-abjki#E$TagQ$zf~O% zmishH0+JrJl=z{#_5fRgcY80fu9>gdhp=VQBN=G zUMU0CT5cI!nVn2#>s{O1S5{LyxE3rn0^o5+e8LUyEeXn)ABA_-v!R_E%ivONp2~!b z$W$3(R3_MVsVf=bPM>z*-W+7D6SyA;T)2#wMB%3gdGi5x2Z8I6!G+6+NSyH7{3=Ke zTL|3enOwMxc*I>l+)JBB#l6&r3zrd%*m3vsMvXx6nmuvcLJb!#<-Q-`Y9|+aqxTI5 zJ#gH%1}>EA?Da<57uItxGgHnsIBiMCSo44o>urAJcTT|C_z%o`_z@}y>aQY*n zt+h5vgNCx&`geHWD)j- at oset6W)4_7=yyZC4>VV)9_DDxYHjaS z-MyCs+wud-G{n5~K_o*W=1zzJ0(Ax4ApYv0BniX7EFbM3028C5FMf at C={WoBZAmd; z41ALsr at f$Io|yvXYkr>vUuP7!N2XJeBmrYa_Z(6?2%YlA!LI`CFh4#kg-J*3onD;T z45r01!e4Ov0uwP&otnkgl5-Q!^g*WZ_A>a{Hsg{6B;!PQ*kjQs7^*9t_}Mn*3i~*u zQX6vBMnUuhhuogOJ{!8ClP$@BJ^BZ?c+Q1JbhuS%7`Jn?8g;LZiY{go#pE~M=0lH8 zgHyBG#JIm|8U4kw9U$xiC9XO<-{Zok!^Ra{cRCMW8VCH@?icsj9!j;=a^;2+mAr`r zu|^2k{zWi|y~da`_-q#x at R~+Ayr(}X1!qE@(IjMx5$1-DRm}r3y$9aOUmll&5S0Nk z>owNbG%U{8we9ySpp&nZcqbRWC=I9DAXpvbOv0OAP4xmR_K**LCGYV{J|UfB|K;&N zoPn7VKsd-WPG!X`L!-bdr(FN)vbr;2&3Jm?>*gC5Cgd9zxk at 9s>h~0k*svU${27rM zEyt6M|DRY;1e`>;)2xWO2gkzK3I)EY=Xvu`NWh>H%rIlBT204G?h>7? zw^bUkzvJ#ujon6 at kK0)C$Sy*ct=AdV>{n+O9*n4ms#5JBDi8S8DX~ zUPmlzgFGGYqEvUpll6KZa-1M`~ zp4UO#g+u^F&lZwO`9G^!T-+W at GQ!8&R<}LLPpvsf-k3|`Bu!de(4z~D$Hbe=yw5pE z-ux7$Gr-}iv(6?q`sMeXLz_3hKoua%;`7HPQksj7sp>o97ad at Zb;DItR0p2+TiV at S zZORmFx$45&Cg{1k8xc(85i3JVqKej1ym`Z`FVN$f6nDHg at d+F}B^OHK)d40=2wpM( zdUJ$O7Eii!uviLtskA0>lI{bQ+dNR>DL0&C&zBq|(i#botS-*e{0d(e6!_L(w>Jj~ zBhk#p6?GexMFA(oQNmZnw&LIqQ~*H5%&R@><+9~_LF6laaED1|DhDhbv`4$qYJ<&f zZ-06>XR%F+H_2gbz6Q(NZAQe(_Bv%ZB6n&VB_6WbOv_Ke5Xqv9?D<6iyv+r_t4`8$ zgVUjV^*FqvE6hKCBGP8Ci3yEz$s4Ufrm^YbQ?KRTyNzeV*D(d|fe6f#z-I{KhqbQB zS3uHNmAG~2++Q4#j`yv;`()(kicsRFNBsdzyb={+479pSN`Ap=_TJoTo^+bvL8YN# zq+5OdXIA(+py^1^G#OGF8b-R+?td*kww_AUc35d>D9%$vQ)K$Ok^mH1!daLwq7*cA zl8ZNm29ts0k_&zl;x&ecq_a+n!Kd at UT76)VEg^#c9*pH-2-BuXFtqpGa|yYO<`c;Z zmQLUjltF^vub|Ib9W!Fn zC5Wz<+j0Vh6jgV_--d3P$u%ZMqdG&2Z0jh4E?a`kJS(ySIzbf@!_#FBU#}zxnl{d# z(h~?~xZ{ZqUFY)kP^;5NpM6&$b(P_G4bGC+p}_~2We%O(+52s+^~5L3E! z_^~%~IC|pET)u;eh+f^~isVtA|NP9>cA&ba6G?2k?qhl at cN!YF2)-UDaA($o{c>0s19;)1lwN~CMJz0bn_IUJ$bhGVXUu-FWi3dkiz6isAz&DRD7v&K!UMMX))uf{{toCI-xR%YjEQ^2+KcUi=89U*to&&C;w%%gEM{5zL zs1w%ZVe at 1K4DYW*eE9yqSdG at 0jhT!+4MEay at 8 zK>Vr<9wFxU4+9mwN|PS_W64jpA)lw4I}W`183Q;>uNSmwmisRB0GQF at p1pG`xzXIQxO>$AS9L#DmPVyx8vd#_W)FNdbifUS zl?@n}wh17r=wtrTxy7O!tz~ex<<^EGO|_rVbm(0pjkN at TMupz(Ez%wz^FWK41>a16 zlvf#W_YkgJk6;G2CC4U8h$^})(AmPE^*Fr~8XiMDW;28^z|kHMZ!ynVr=hiD=1%wr z0B5-1JL=b=lAv_RTUR#+=>f8U*reAs6M+mjr>CzJVR8m zSqjSjG5j<#vrZ5m;f0?wfRV~)dIy%SKdr6+6Ts6E$2%V`ipTKD?hI=2_rvlE#qAaf zMNK=r&`2>nI@ zaP8JMbHX0=Xch-5V=7E4JNs0)?JdU_gx}cAE2g4pfHoJ%8cp zUw4CH@=0xcq9q!oQR$e2ZjSDavZRGN<9a)Jh=gvHoClvxt-2}^)r at e)RhIV%7Pdxb z6hwSwwc6B*@`9my=8oS#%p1))eZ{u~bdC-_9o7hyjwK(XyNsieWUEY>9G;-y>g%Wf z1>y*H!$tjq4I2Z0NIXbK*dz2SLgQ^wiT1l#$Rs8OluS#iJ_zAGEm^aB-H6Cb~Q zKS+YoxANylKHT^Sro#*34QIpoOvtu6Gt7vtCN(QYcfefVVF}QCM at M|X(w9o0vigr; zO>>++^n}mVgeOd~f&-QjOP4?PR1avYuOn`Qb=k-S{jZvdSbG4fAQKX?LY)4SZcx z;AUdMIU1tgfObrEj$q`-B(bGagsvxa|GqOG_Ph1G1bCE2r!pA>I|=>Nsk#h;L4{XYlL1!%Dke!n;95+9-EFN=X4#;BEtcrHX$UGpn^cJL>j8QtRI zVMLlKe?F58@(OUlOU=)DECHLK&d>^J=yV`UXo&Tfq|uXZ!NTf6sMz#p{H%2BxDCqu z?Y8n9sdm^iUP)kg)f##F)Ly5tm32_13;+F^wSuzFTnPLf8nY2rk;<+?#SZ2FKO01E zPSQM6!|zaO6jxk672V!zbK=Yfp at S+%CDowIS+PmzF{K)&V4Pip0=?d6gXrw7JOf6B zgQc?99ru2 at l$FCyM?VnUbY%ur9sO8A0zDy9XOO3k5TWn={Lx22kmm_?)T=Tdq2(`8 zb%c0ED9i2h1RJ+ZC0reSTZ at Z_4%>B)BBlY#U*v-O<d)PBGRzYwj_l#37jDLED)LvEGvhOsDL2{+c7 zf5yW?M|C`;oY59!$eD-<1;_+0C*$)oZxZv;Ocoyd17%bV+h}>F7ti{EwnN9A#*=&m7q_O#;0%Bc!Rf zsLw_a;CkYr)1wR?I`~6!N{{^h+W0jv1O69)oAgRO2L~OrO#Lm9DIg~Y7d&V6%K;Lg z;X0j0P-$h$>cruHsv+x8>5JdWZXd!+Y5PG^W;=hXRW1z-s at s0}u|n|;Cl?)fg+BM^ zP0)!y2raf`k`%CIV=nO^i#7k&tcxA?1B;6famhEGhlP$BS+h}(Vw5`513$(U&XGWk zEBTS`;|RXj!=)26IH)YHsh-W3v8Wl5=f98iM(gPd*rAxkvp*wkBhV5Fy4#OKiB?K~`uuqK~> z^{B-BGiSWaZSf%qRI8UkwzLMeJba}Xr1iHC9+f!r2q&ZUZ%K(&d05nLGkmK3 at pL~Y z&hRnOkE^RyyI=mUuqGF?4_UdwP6<@U+z;`F$r at 704XJqARSlz8jHGpsKgu_4glmpL5q@xdr`yM6znMA;+ z`^bT3 z513e7)>PwBRr(gf*FXo{AJ^#%S!^XH4HvCPN9E98VEv?f7P#0+fZKtUF%aZc4Ts at o_BQHnpGZL^(&+6E|#g z`f{zU|B5r07MD-AiF<@1_`Fl3(ZA&O-U7{J4lAec;2VhpQS{{qUG^`STZ7W(oa zt|@EMWvf%)a&*vX21f)LLD|lB!41oQr at j*}GtKUc71^m at 1LJx(oblB3cVuM9c0_3kx*ej_>}wcjAjM z8$mVwH+$m+qxEN`5#P84>1`T+e!ij=%xE37E6J`+%@)7cHof_Y-i&i8d5dR3Ge)`M zF&Td?eV@&sv)2hYfBqNHoD)28!}{rpcVVZq{q|j+;Q{pZC{al4$y&ax&ZaZyNp28@ z=hSJl+JN2ua~b?t*m8pm3Ocx|X4jp_s6{S8`(?9xqbzCJ`jKc*X<1365MNQ#U2RaR zMOO!W+kRe98a~GA{HkW}pcI&X8~t$qc$uxGprKz6ru3>aOarnT0kZ39NAmk#d3&^- z-Aq;k6St~SQ`XnsKk;{Hiia!yq;2+rcW4ToZ1lq)4 at 3jm5F+>6+C%)NmotT6Zt75^CX2>-^ht^br5y0kOvZUGwrxkY0OtTpI|_-CCH4 zi#y}K4_$d43ahq$YgW_ka70!4%12SvVO*xT;O?;RE0&UqPNZ)xw zKY$1#@NdJz0b7a6oRRt87Sdj&P19HtI at 6a0Vy#wp-o9zjvl_$(HX!VsSm|^PQwoBY z!gOivg-6R6BY5cE_Jq+HuBa|{K|^()NQZBX=IoGlNB(cj*n2V}jO$Ws at o*p;M%*#) z=*ZP2+qPN4XG>Kr<|wf|=`K`yqHOK^9P#V)(pj4|Kf3uJ5N}I at wL<)RU}Zdt z{cKm*c77)P6_YFbPYN!x;_BL2 at vg{jlq92P)Z>FH29x zkft)Z_HpETS?7dX5o41}O-84R?0)UZG at xor7%a6^rKMu at s>0^$r_ct!${jaY{L at NF zMUVIk*y~fDUK;wVOd3(9$|&_37r_qp_HsN2?Y~T<0F75OVZr9rWm~h-*orEt>5)i? zVb`St->k9~0kxOV&}^9u;c64(BEnLPSATp>J_>nq#$$TN>E#j8@!PF1>_H`lz9Rw_ zM;dwXMG8TL<6ZGXu&0?1UNERtnkZ`NR7CLa%8<46g0%DcaS<>Ectzuj zC$7Ub^u0eG6+9`A2bYdI{N9;esB%v~2fX^ymZ414D6>{8Fe*ytwB54><)az|GXB60 z at cb|)V1impIp`y}ZH?L#MZuJALF6{c8Nq~W4}V1H(irE&xzC4ZhoW>TgxY#NMidf` zpD2GR$^oi{|I*O!#Onrpa>Va`Gg$If%HhwB$A2e9MMrE_YxIc5AYN4Y$X-9WP8CHI zZ|F+z`k||pRu7c at HOa6anXoZtL$=w_xL4zlw+RC6f6X%PM}Ltx`zUmzJrVdk?Pr;c z40pizZTknnBF};K5^qPaX(p4P#NBF1*nmp5z1=hFzp^@bukNV4a?rVEM9Sp+-%7_% z=NZvvTCX-RmG2YgQ at Mqbg8U?;8FlPzzi0LBa?0l(Ct>hniRz(imdoX&Gc0hqr2ZWk z4m;v{>HJF3dCqEbyVC_1{a|({Rm6|&r&dc2M}#duvS24H#;G|nyh-#2$O3c32fpp5 z(lOC_3RAzHuojd{R2BSevblgg2!hcFrb=6NhF~<=4?X at bEJ=1dk@*WUk$i~&zM{RQ z;AKd$?%|woP>$lsPWY+(!an&dbdE244op|V6#kdU6MN_niOuh==U}Ye(DGz*p7%5l zVCY7?1pe?(Nrsa0H%$2DRfE*~Q5kV1zP}7SDg{qR{5(zN^bn!B8T_8!9uk@ zo3~5@>70n$f4W!!1&g+E#0`&+FO|9-^z+iTAD&n8L3asC+(;jPMbd1tJZ@#%P?nr# zlj{YdiKixZ?>pBx at X>9UIKk-i+HEMipVkpynyxoF2rO?Y#ToXE`eNrn=)yiC&CIsH zq!}32s at wO-+spwg*kG3rBj<3;y|gLawdiQfmVdPt)Xas;g@#f&UhYX`Ci{gf9G`ie~ z5=Wk;^~?kkBVzIZA6?VhUl%>DBHs2qZEB`Lr&aeC(!^I0qN!8%o_-M8H_G55+Eq=I zrY(ALiazN3QMvmKAEOdtJCt~Kjj=VvMTFjwh%Hge>+hoc$~$Z~r1rV0mVCgEj$vc|8q^d|M at 2QKSSd_wzl)*46`an zC5l$Z4y|q-X*3+uRT1B=+vlAPb$S%S-jeK(Yve3$Og;R%U$*9L=;qMe>E3~BQOstR n0=IHTHk1RcH|X?&!K4;oY at D1Cf}4|@)8l^}6s;S bod = new ArrayList(); - bod.add(new Return(node, node.getInternalBody())); + bod.add(new LambdaSyntheticReturn(node, node.getInternalBody())); mod retSuite = new Suite(node, bod); setline(node); diff --git a/src/org/python/compiler/InvokedynamicCodeCompiler.java b/src/org/python/compiler/InvokedynamicCodeCompiler.java new file mode 100644 --- /dev/null +++ b/src/org/python/compiler/InvokedynamicCodeCompiler.java @@ -0,0 +1,24 @@ +package org.python.compiler; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.invoke.MutableCallSite; + +/** + * + * @author shashank + */ +public class InvokedynamicCodeCompiler extends CodeCompiler { + + public InvokedynamicCodeCompiler(Module module, boolean print_results) { + super(module, print_results); + } + + // just use indy functions to make sure the build process is proper. + public void foo(){ + Class mhClazz = MethodHandles.class; + MethodType target = null; + new MutableCallSite(target); + } + +} diff --git a/src/org/python/core/AnnotationReader.java b/src/org/python/core/AnnotationReader.java --- a/src/org/python/core/AnnotationReader.java +++ b/src/org/python/core/AnnotationReader.java @@ -8,7 +8,8 @@ import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; -import org.objectweb.asm.commons.EmptyVisitor; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Opcodes; /** * This class reads a classfile from a byte array and pulls out the value of the class annotation @@ -19,7 +20,7 @@ * cost too much, we will want to implement a special purpose ClassReader that only reads out the * APIVersion annotation I think. */ -public class AnnotationReader extends EmptyVisitor { +public class AnnotationReader extends ClassVisitor { private boolean nextVisitIsVersion = false; private boolean nextVisitIsMTime = false; @@ -32,6 +33,7 @@ * @throws IOException - if the classfile is malformed. */ public AnnotationReader(byte[] data) throws IOException { + super(Opcodes.ASM4); ClassReader r; try { r = new ClassReader(data); @@ -43,21 +45,23 @@ } r.accept(this, 0); } - + + @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { nextVisitIsVersion = desc.equals("Lorg/python/compiler/APIVersion;"); nextVisitIsMTime = desc.equals("Lorg/python/compiler/MTime;"); - return this; - } + return new AnnotationVisitor(Opcodes.ASM4) { - public void visit(String name, Object value) { - if (nextVisitIsVersion) { - version = (Integer)value; - nextVisitIsVersion = false; - } else if (nextVisitIsMTime) { - mtime = (Long)value; - nextVisitIsVersion = false; - } + public void visit(String name, Object value) { + if (nextVisitIsVersion) { + version = (Integer)value; + nextVisitIsVersion = false; + } else if (nextVisitIsMTime) { + mtime = (Long)value; + nextVisitIsVersion = false; + } + } + }; } public int getVersion() { diff --git a/src/org/python/core/Options.java b/src/org/python/core/Options.java --- a/src/org/python/core/Options.java +++ b/src/org/python/core/Options.java @@ -85,6 +85,10 @@ //XXX: place holder public static int bytes_warning = 0; + // Corresponds to -O (Python bytecode optimization), -OO (remove docstrings) + // flags in CPython; it's not clear how Jython should expose its optimization, + // but this is user visible as of 2.7. + public static int optimize = 0; /** * Enable division warning. The value maps to the registry values of diff --git a/src/org/python/expose/generate/ExposedFieldFinder.java b/src/org/python/expose/generate/ExposedFieldFinder.java --- a/src/org/python/expose/generate/ExposedFieldFinder.java +++ b/src/org/python/expose/generate/ExposedFieldFinder.java @@ -3,8 +3,9 @@ import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Opcodes; -public abstract class ExposedFieldFinder implements FieldVisitor, PyTypes { +public abstract class ExposedFieldFinder extends FieldVisitor implements PyTypes { private String fieldName; @@ -13,6 +14,7 @@ private String doc; public ExposedFieldFinder(String name, FieldVisitor delegate) { + super(Opcodes.ASM4); fieldName = name; this.delegate = delegate; } diff --git a/src/org/python/expose/generate/ExposedMethodFinder.java b/src/org/python/expose/generate/ExposedMethodFinder.java --- a/src/org/python/expose/generate/ExposedMethodFinder.java +++ b/src/org/python/expose/generate/ExposedMethodFinder.java @@ -4,7 +4,6 @@ import org.python.expose.MethodType; import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -15,7 +14,7 @@ * annotation is visited, calls handleResult with the exposer constructed with that annotation. Only * one of the handleResult methods will be called, if any. */ -public abstract class ExposedMethodFinder extends MethodAdapter implements PyTypes, Opcodes { +public abstract class ExposedMethodFinder extends MethodVisitor implements PyTypes, Opcodes { private Exposer newExp; @@ -36,7 +35,7 @@ String desc, String[] exceptions, MethodVisitor delegate) { - super(delegate); + super(Opcodes.ASM4, delegate); this.typeName = typeName; this.onType = onType; this.access = access; @@ -136,6 +135,10 @@ class ExposedMethodVisitor extends RestrictiveAnnotationVisitor { + public ExposedMethodVisitor() { + super(); + } + @Override public void visit(String name, Object value) { if (name.equals("doc")) { diff --git a/src/org/python/expose/generate/ExposedTypeProcessor.java b/src/org/python/expose/generate/ExposedTypeProcessor.java --- a/src/org/python/expose/generate/ExposedTypeProcessor.java +++ b/src/org/python/expose/generate/ExposedTypeProcessor.java @@ -8,12 +8,10 @@ import org.python.expose.ExposedType; import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -105,7 +103,7 @@ /** * The actual visitor that runs over the bytecode and figures out what to expose. */ - private final class TypeProcessor extends ClassAdapter { + private final class TypeProcessor extends ClassVisitor { private Type baseType = OBJECT; @@ -116,7 +114,7 @@ private boolean generatedStaticBlock; private TypeProcessor(ClassVisitor cv) { - super(cv); + super(Opcodes.ASM4, cv); } @Override @@ -227,7 +225,7 @@ desc, signature, exceptions); - return new MethodAdapter(passthroughVisitor) { + return new MethodVisitor(Opcodes.ASM4, passthroughVisitor) { @Override public void visitCode() { diff --git a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java --- a/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java +++ b/src/org/python/expose/generate/RestrictiveAnnotationVisitor.java @@ -1,12 +1,17 @@ package org.python.expose.generate; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Opcodes; /** * An Annotation visitor that throws an IllegalArgumentException if it visits anything other than * visitEnd. Should be subclasses by something interested in only certain events. */ -public class RestrictiveAnnotationVisitor implements AnnotationVisitor { +public class RestrictiveAnnotationVisitor extends AnnotationVisitor { + + public RestrictiveAnnotationVisitor() { + super(Opcodes.ASM4); + } public AnnotationVisitor visitAnnotation(String name, String desc) { throw new IllegalArgumentException("Unknown annotation field '" + name + "'"); diff --git a/src/org/python/modules/_hashlib.java b/src/org/python/modules/_hashlib.java --- a/src/org/python/modules/_hashlib.java +++ b/src/org/python/modules/_hashlib.java @@ -30,6 +30,7 @@ /** A mapping of Python algorithm names to MessageDigest names. */ private static final Map algorithmMap = new HashMap() {{ put("sha1", "sha-1"); + put("sha224", "sha-224"); put("sha256", "sha-256"); put("sha384", "sha-384"); put("sha512", "sha-512"); @@ -75,6 +76,16 @@ return new$("sha1", obj); } + public static PyObject openssl_sha224() { + return openssl_sha224(null); + } + + public static PyObject openssl_sha224(PyObject obj) { + //FIXME: WRONG! + return new$("sha256", obj); + //return new$("sha224", obj); + } + public static PyObject openssl_sha256() { return openssl_sha256(null); } @@ -118,6 +129,7 @@ private static final Map blockSizes = new HashMap() {{ put("md5", 64); put("sha-1", 64); + put("sha-224", 64); put("sha-256", 64); put("sha-384", 128); put("sha-512", 128); diff --git a/src/org/python/modules/jffi/AsmClassBuilder.java b/src/org/python/modules/jffi/AsmClassBuilder.java --- a/src/org/python/modules/jffi/AsmClassBuilder.java +++ b/src/org/python/modules/jffi/AsmClassBuilder.java @@ -3,7 +3,6 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.commons.EmptyVisitor; import java.io.PrintWriter; import java.lang.reflect.Constructor; @@ -143,7 +142,7 @@ Constructor c = tmvClass.getDeclaredConstructor(PrintWriter.class); return c.newInstance(out); } catch (Throwable t) { - return new EmptyVisitor(); + return null; } } diff --git a/src/org/python/modules/jffi/SkinnyMethodAdapter.java b/src/org/python/modules/jffi/SkinnyMethodAdapter.java --- a/src/org/python/modules/jffi/SkinnyMethodAdapter.java +++ b/src/org/python/modules/jffi/SkinnyMethodAdapter.java @@ -10,11 +10,12 @@ package org.python.modules.jffi; import org.objectweb.asm.*; +import org.objectweb.asm.util.Printer; +import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceMethodVisitor; import java.io.PrintStream; import java.io.PrintWriter; -import java.util.Map; import static org.python.modules.jffi.CodegenUtils.*; @@ -22,33 +23,28 @@ * * @author headius */ -public class SkinnyMethodAdapter implements MethodVisitor, Opcodes { +public class SkinnyMethodAdapter extends MethodVisitor implements Opcodes { private final static boolean DEBUG = Boolean.getBoolean("jython.compile.dump"); private MethodVisitor method; + private Printer printer; private String name; private ClassVisitor cv; - /** Creates a new instance of SkinnyMethodAdapter */ - public SkinnyMethodAdapter(MethodVisitor method) { - setMethodVisitor(method); - } - public SkinnyMethodAdapter(ClassVisitor cv, int flags, String name, String signature, String something, String[] exceptions) { + super(ASM4); setMethodVisitor(cv.visitMethod(flags, name, signature, something, exceptions)); this.cv = cv; this.name = name; } - public SkinnyMethodAdapter() { - } - public MethodVisitor getMethodVisitor() { return method; } public void setMethodVisitor(MethodVisitor mv) { if (DEBUG) { - this.method = new TraceMethodVisitor(mv); + this.printer = new Textifier(); + this.method = new TraceMethodVisitor(mv, printer); } else { this.method = mv; } @@ -530,7 +526,7 @@ } else { pw.write("*** Dumping ***\n"); } - ((TraceMethodVisitor)getMethodVisitor()).print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(1, 1); @@ -865,7 +861,7 @@ } public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, - Label[] arg3) { + Label... arg3) { getMethodVisitor().visitTableSwitchInsn(arg0, arg1, arg2, arg3); } @@ -895,7 +891,7 @@ if (DEBUG) { PrintWriter pw = new PrintWriter(System.out); pw.write("*** Dumping ***\n"); - ((TraceMethodVisitor)getMethodVisitor()).print(pw); + printer.print(pw); pw.flush(); } getMethodVisitor().visitMaxs(arg0, arg1); diff --git a/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java b/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java --- a/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java +++ b/tests/java/org/python/expose/generate/ExposeMethodFinderTest.java @@ -3,11 +3,9 @@ import junit.framework.TestCase; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import org.objectweb.asm.commons.EmptyVisitor; -import org.python.expose.ExposedMethod; -import org.python.expose.ExposedNew; public class ExposeMethodFinderTest extends TestCase implements Opcodes, PyTypes { @@ -18,7 +16,7 @@ methodName, descriptor, null, - new EmptyVisitor()) { + new MethodVisitor(Opcodes.ASM4) {}) { @Override public void handleResult(InstanceMethodExposer exposer) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 18:33:20 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 18:33:20 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Beginning_of_memoryview_supp?= =?utf8?q?ort?= Message-ID: http://hg.python.org/jython/rev/4411db4dd246 changeset: 6355:4411db4dd246 parent: 6353:0a6bd576d0b9 user: Jim Baker date: Tue Mar 13 21:54:28 2012 -0700 summary: Beginning of memoryview support files: CoreExposed.includes | 1 + src/org/python/core/MemoryView.java | 12 + src/org/python/core/MemoryViewProtocol.java | 6 + src/org/python/core/PyMemoryView.java | 61 ++++++++++ src/org/python/core/PyString.java | 30 ++++- src/org/python/core/__builtin__.java | 1 + 6 files changed, 109 insertions(+), 2 deletions(-) diff --git a/CoreExposed.includes b/CoreExposed.includes --- a/CoreExposed.includes +++ b/CoreExposed.includes @@ -26,6 +26,7 @@ org/python/core/PyInteger.class org/python/core/PyList.class org/python/core/PyLong.class +org/python/core/PyMemoryView.class org/python/core/PyMethod.class org/python/core/PyMethodDescr.class org/python/core/PyModule.class diff --git a/src/org/python/core/MemoryView.java b/src/org/python/core/MemoryView.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/MemoryView.java @@ -0,0 +1,12 @@ +package org.python.core; + +public interface MemoryView { + // readonly attributes XXX just the boring stuff so far + + public String get_format(); + public int get_itemsize(); + public PyTuple get_shape(); + public int get_ndim(); + public PyTuple get_strides(); + public boolean get_readonly(); +} diff --git a/src/org/python/core/MemoryViewProtocol.java b/src/org/python/core/MemoryViewProtocol.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/MemoryViewProtocol.java @@ -0,0 +1,6 @@ +package org.python.core; + +public interface MemoryViewProtocol { + + public MemoryView getMemoryView(); +} diff --git a/src/org/python/core/PyMemoryView.java b/src/org/python/core/PyMemoryView.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/PyMemoryView.java @@ -0,0 +1,61 @@ +package org.python.core; + +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedType; + + at ExposedType(name = "memoryview", base = PyObject.class, isBaseType = false) +public class PyMemoryView extends PyObject { + + public static final PyType TYPE = PyType.fromClass(PyMemoryView.class); + + MemoryView backing; + + public PyMemoryView(MemoryViewProtocol obj) { + backing = obj.getMemoryView(); + } + + @ExposedNew + static PyObject memoryview_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, + String[] keywords) { + PyObject obj = args[0]; + if (obj instanceof MemoryViewProtocol) { + return new PyMemoryView((MemoryViewProtocol)obj); + } + else throw Py.TypeError("cannot make memory view because object does not have the buffer interface"); + } + + @ExposedGet(name = "format") + public String get_format() { + return backing.get_format(); + } + + @ExposedGet(name = "itemsize") + public int get_itemsize() { + return backing.get_itemsize(); + } + + @ExposedGet(name = "shape") + public PyTuple get_shape() { + return backing.get_shape(); + } + + @ExposedGet(name = "ndim") + public int get_ndim() { + return backing.get_ndim(); + } + + @ExposedGet(name = "strides") + public PyTuple get_strides() { + return backing.get_strides(); + } + + @ExposedGet(name = "readonly") + public boolean get_readonly() { + return backing.get_readonly(); + } + +} + + diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java --- a/src/org/python/core/PyString.java +++ b/src/org/python/core/PyString.java @@ -18,7 +18,7 @@ * A builtin python string. */ @ExposedType(name = "str", doc = BuiltinDocs.str_doc) -public class PyString extends PyBaseString +public class PyString extends PyBaseString implements MemoryViewProtocol { public static final PyType TYPE = PyType.fromClass(PyString.class); protected String string; // cannot make final because of Python intern support @@ -90,7 +90,31 @@ } return codePoints; } - + + public MemoryView getMemoryView() { + return new MemoryView() { + // beginning of support + public String get_format() { + return "B"; + } + public int get_itemsize() { + return 2; + } + public PyTuple get_shape() { + return new PyTuple(Py.newInteger(getString().length())); + } + public int get_ndim() { + return 1; + } + public PyTuple get_strides() { + return new PyTuple(Py.newInteger(1)); + } + public boolean get_readonly() { + return true; + } + }; + } + public String substring(int start, int end) { return getString().substring(start, end); } @@ -100,6 +124,8 @@ return str___str__(); } + public + @ExposedMethod(doc = BuiltinDocs.str___str___doc) final PyString str___str__() { if (getClass() == PyString.class) { diff --git a/src/org/python/core/__builtin__.java b/src/org/python/core/__builtin__.java --- a/src/org/python/core/__builtin__.java +++ b/src/org/python/core/__builtin__.java @@ -306,6 +306,7 @@ dict.__setitem__("True", Py.True); dict.__setitem__("False", Py.False); dict.__setitem__("bytes", PyString.TYPE); + dict.__setitem__("memoryview", PyMemoryView.TYPE); // Work in debug mode by default // Hopefully add -O option in the future to change this -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 18:33:20 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 18:33:20 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Move_memoryview_support_from_sandbox_=28which_is_now_reti?= =?utf8?q?red=29?= Message-ID: http://hg.python.org/jython/rev/e553ba3b064e changeset: 6356:e553ba3b064e parent: 6354:ee37bd0384c4 parent: 6355:4411db4dd246 user: Jim Baker date: Wed Mar 14 10:33:09 2012 -0700 summary: Move memoryview support from sandbox (which is now retired) files: CoreExposed.includes | 1 + src/org/python/core/MemoryView.java | 12 + src/org/python/core/MemoryViewProtocol.java | 6 + src/org/python/core/PyMemoryView.java | 61 ++++++++++ src/org/python/core/PyString.java | 30 ++++- src/org/python/core/__builtin__.java | 1 + 6 files changed, 109 insertions(+), 2 deletions(-) diff --git a/CoreExposed.includes b/CoreExposed.includes --- a/CoreExposed.includes +++ b/CoreExposed.includes @@ -26,6 +26,7 @@ org/python/core/PyInteger.class org/python/core/PyList.class org/python/core/PyLong.class +org/python/core/PyMemoryView.class org/python/core/PyMethod.class org/python/core/PyMethodDescr.class org/python/core/PyModule.class diff --git a/src/org/python/core/MemoryView.java b/src/org/python/core/MemoryView.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/MemoryView.java @@ -0,0 +1,12 @@ +package org.python.core; + +public interface MemoryView { + // readonly attributes XXX just the boring stuff so far + + public String get_format(); + public int get_itemsize(); + public PyTuple get_shape(); + public int get_ndim(); + public PyTuple get_strides(); + public boolean get_readonly(); +} diff --git a/src/org/python/core/MemoryViewProtocol.java b/src/org/python/core/MemoryViewProtocol.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/MemoryViewProtocol.java @@ -0,0 +1,6 @@ +package org.python.core; + +public interface MemoryViewProtocol { + + public MemoryView getMemoryView(); +} diff --git a/src/org/python/core/PyMemoryView.java b/src/org/python/core/PyMemoryView.java new file mode 100644 --- /dev/null +++ b/src/org/python/core/PyMemoryView.java @@ -0,0 +1,61 @@ +package org.python.core; + +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedType; + + at ExposedType(name = "memoryview", base = PyObject.class, isBaseType = false) +public class PyMemoryView extends PyObject { + + public static final PyType TYPE = PyType.fromClass(PyMemoryView.class); + + MemoryView backing; + + public PyMemoryView(MemoryViewProtocol obj) { + backing = obj.getMemoryView(); + } + + @ExposedNew + static PyObject memoryview_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, + String[] keywords) { + PyObject obj = args[0]; + if (obj instanceof MemoryViewProtocol) { + return new PyMemoryView((MemoryViewProtocol)obj); + } + else throw Py.TypeError("cannot make memory view because object does not have the buffer interface"); + } + + @ExposedGet(name = "format") + public String get_format() { + return backing.get_format(); + } + + @ExposedGet(name = "itemsize") + public int get_itemsize() { + return backing.get_itemsize(); + } + + @ExposedGet(name = "shape") + public PyTuple get_shape() { + return backing.get_shape(); + } + + @ExposedGet(name = "ndim") + public int get_ndim() { + return backing.get_ndim(); + } + + @ExposedGet(name = "strides") + public PyTuple get_strides() { + return backing.get_strides(); + } + + @ExposedGet(name = "readonly") + public boolean get_readonly() { + return backing.get_readonly(); + } + +} + + diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java --- a/src/org/python/core/PyString.java +++ b/src/org/python/core/PyString.java @@ -18,7 +18,7 @@ * A builtin python string. */ @ExposedType(name = "str", doc = BuiltinDocs.str_doc) -public class PyString extends PyBaseString +public class PyString extends PyBaseString implements MemoryViewProtocol { public static final PyType TYPE = PyType.fromClass(PyString.class); protected String string; // cannot make final because of Python intern support @@ -90,7 +90,31 @@ } return codePoints; } - + + public MemoryView getMemoryView() { + return new MemoryView() { + // beginning of support + public String get_format() { + return "B"; + } + public int get_itemsize() { + return 2; + } + public PyTuple get_shape() { + return new PyTuple(Py.newInteger(getString().length())); + } + public int get_ndim() { + return 1; + } + public PyTuple get_strides() { + return new PyTuple(Py.newInteger(1)); + } + public boolean get_readonly() { + return true; + } + }; + } + public String substring(int start, int end) { return getString().substring(start, end); } @@ -100,6 +124,8 @@ return str___str__(); } + public + @ExposedMethod(doc = BuiltinDocs.str___str___doc) final PyString str___str__() { if (getClass() == PyString.class) { diff --git a/src/org/python/core/__builtin__.java b/src/org/python/core/__builtin__.java --- a/src/org/python/core/__builtin__.java +++ b/src/org/python/core/__builtin__.java @@ -306,6 +306,7 @@ dict.__setitem__("True", Py.True); dict.__setitem__("False", Py.False); dict.__setitem__("bytes", PyString.TYPE); + dict.__setitem__("memoryview", PyMemoryView.TYPE); // Work in debug mode by default // Hopefully add -O option in the future to change this -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 18:58:37 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 18:58:37 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_IntelliJ_project_file?= Message-ID: http://hg.python.org/jython/rev/d6e314e5ea02 changeset: 6358:d6e314e5ea02 user: Jim Baker date: Wed Mar 14 10:58:29 2012 -0700 summary: Add IntelliJ project file files: .idea/misc.xml | 213 +++++++++++++- .idea/workspace.xml | 106 ++++++- Jython27.iml | 22 + src/org/python/modules/itertools.java | 3 + 4 files changed, 334 insertions(+), 10 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,216 @@ - + + + + + + + + + + + + + + + + + + http://www.w3.org/1999/xhtml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + 1.7 + + + + + + + + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -56,11 +56,36 @@ + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + - - - - - + - - @@ -347,5 +426,14 @@ + + + + + + + + + diff --git a/Jython27.iml b/Jython27.iml new file mode 100644 --- /dev/null +++ b/Jython27.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/org/python/modules/itertools.java b/src/org/python/modules/itertools.java --- a/src/org/python/modules/itertools.java +++ b/src/org/python/modules/itertools.java @@ -704,4 +704,7 @@ return tee(iterable, 2); } + + + } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 19:09:53 2012 From: jython-checkins at python.org (alex.gronholm) Date: Wed, 14 Mar 2012 19:09:53 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fixed_output_of_successful_p?= =?utf8?q?atches_in_applypatches=2Epy?= Message-ID: http://hg.python.org/jython/rev/c2184b0d2778 changeset: 6359:c2184b0d2778 user: Alex Gr?nholm date: Wed Mar 14 11:07:24 2012 -0700 summary: Fixed output of successful patches in applypatches.py files: .hgsubstate | 2 +- Misc/applypatches.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,1 +1,1 @@ -88741 CPythonLib +88850 CPythonLib diff --git a/Misc/applypatches.py b/Misc/applypatches.py --- a/Misc/applypatches.py +++ b/Misc/applypatches.py @@ -34,12 +34,11 @@ if succeeded: print '\nThe following files were successfully patched:' - for path in succeeded: - for path in succeeded: - print path + for path in sorted(succeeded): + print path if failed: print '\nPatching failed for the following files:' - for path in failed: + for path in sorted(failed): print path print '\nYou will need to migrate these modules manually.' -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 18:52:31 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 18:52:31 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Another_attempt_at_intellij_?= =?utf8?q?setup?= Message-ID: http://hg.python.org/jython/rev/fbd962f48284 changeset: 6357:fbd962f48284 user: Jim Baker date: Wed Mar 14 10:52:25 2012 -0700 summary: Another attempt at intellij setup files: .idea/.name | 1 + .idea/compiler.xml | 21 + .idea/copyright/profiles_settings.xml | 5 + .idea/encodings.xml | 5 + .idea/libraries/extlibs2.xml | 48 + .idea/libraries/jar.xml | 12 + .idea/libraries/svnant_jars.xml | 11 + .idea/libraries/test.xml | 14 + .idea/misc.xml | 5 + .idea/modules.xml | 9 + .idea/scopes/scope_settings.xml | 5 + .idea/uiDesigner.xml | 125 ++++ .idea/vcs.xml | 7 + .idea/workspace.xml | 351 ++++++++++++++ 14 files changed, 619 insertions(+), 0 deletions(-) diff --git a/.idea/.name b/.idea/.name new file mode 100644 --- /dev/null +++ b/.idea/.name @@ -0,0 +1,1 @@ +jython27 \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/libraries/extlibs2.xml b/.idea/libraries/extlibs2.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/extlibs2.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/jar.xml b/.idea/libraries/jar.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/jar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/svnant_jars.xml b/.idea/libraries/svnant_jars.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/svnant_jars.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml new file mode 100644 --- /dev/null +++ b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + 1331746882626 + 1331746882626 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 19:28:53 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 19:28:53 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_trunk?= Message-ID: http://hg.python.org/jython/rev/55230545a960 changeset: 6361:55230545a960 parent: 6360:b4b0aa148654 parent: 6359:c2184b0d2778 user: Jim Baker date: Wed Mar 14 11:28:45 2012 -0700 summary: Merged trunk files: .hgsubstate | 2 +- Misc/applypatches.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,1 +1,1 @@ -88741 CPythonLib +88850 CPythonLib diff --git a/Misc/applypatches.py b/Misc/applypatches.py --- a/Misc/applypatches.py +++ b/Misc/applypatches.py @@ -34,12 +34,11 @@ if succeeded: print '\nThe following files were successfully patched:' - for path in succeeded: - for path in succeeded: - print path + for path in sorted(succeeded): + print path if failed: print '\nPatching failed for the following files:' - for path in failed: + for path in sorted(failed): print path print '\nYou will need to migrate these modules manually.' -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 14 19:28:53 2012 From: jython-checkins at python.org (jim.baker) Date: Wed, 14 Mar 2012 19:28:53 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_ContextManager_=5F=5Fent?= =?utf8?q?er=5F=5F/=5F=5Fexit=5F=5F_methods_to_PyLock?= Message-ID: http://hg.python.org/jython/rev/b4b0aa148654 changeset: 6360:b4b0aa148654 parent: 6358:d6e314e5ea02 user: Jim Baker date: Wed Mar 14 11:28:08 2012 -0700 summary: Add ContextManager __enter__/__exit__ methods to PyLock files: .idea/misc.xml | 66 --- .idea/workspace.xml | 173 +++++++++- src/org/python/modules/thread/PyLock.java | 17 +- 3 files changed, 183 insertions(+), 73 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -146,71 +146,5 @@ 5050 - - - - - - - - - - - - - - - - - - - - - 1.7 - - - - - - - - - - - - - - diff --git a/.idea/workspace.xml b/.idea/workspace.xml --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -18,6 +18,21 @@ + + + + - + - + + + + + + + + + + @@ -83,6 +107,7 @@ @@ -199,13 +224,40 @@

  *   public MatchObject search(PyObject[] args, String[] kws) {
@@ -51,12 +51,12 @@
     }
 
     /**
-     * Create an ArgParser with one method argument
+     * Create an ArgParser for a one-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The expected argument in the method definition.
+     * @param p0 The expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0) {
         this(funcname, args, kws);
@@ -65,13 +65,13 @@
     }
 
     /**
-     * Create an ArgParser with two method argument
+     * Create an ArgParser for a two-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The first expected argument in the method definition.
-     * @param p1 The second expected argument in the method definition.
+     * @param p0 The first expected argument in the function definition.
+     * @param p1 The second expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0,
             String p1) {
@@ -81,14 +81,14 @@
     }
 
     /**
-     * Create an ArgParser with three method argument
+     * Create an ArgParser for a three-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The first expected argument in the method definition.
-     * @param p1 The second expected argument in the method definition.
-     * @param p2 The third expected argument in the method definition.
+     * @param p0 The first expected argument in the function definition.
+     * @param p1 The second expected argument in the function definition.
+     * @param p2 The third expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0,
             String p1, String p2) {
@@ -98,12 +98,12 @@
     }
 
     /**
-     * Create an ArgParser with three method argument
+     * Create an ArgParser for a multi-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param paramnames The list of expected argument in the method definition.
+     * @param paramnames The list of expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws,
             String[] paramnames) {

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 20:46:20 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 20:46:20 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Ignore/remove_IntelliJ_IDEA_?=
	=?utf8?q?workspace_file=2E?=
Message-ID: 

http://hg.python.org/jython/rev/1d90814af86a
changeset:   6366:1d90814af86a
user:        Nicholas Riley 
date:        Wed Mar 14 15:33:26 2012 -0400
summary:
  Ignore/remove IntelliJ IDEA workspace file.

files:
  .hgignore           |    1 +
  .idea/workspace.xml |  604 --------------------------------
  2 files changed, 1 insertions(+), 604 deletions(-)


diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -11,6 +11,7 @@
 *.ipr
 *.iml
 *.iws
+.idea/workspace.xml
 
 .AppleDouble
 .DS_Store
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,604 +0,0 @@
-
-
-  
-    
-    
-    
-    
-  
-  
-    
-  
-    
-  
-  
-    
-      
-        
-    
-    
-      
-        
-      
-        
-    
-    
-    
-  
-  
-    
-  
-  
-    
-      
-        
-          
-            
-              
-            
-          
-        
-      
-      
-        
-          
-            
-              
-            
-          
-        
-      
-    
-  
-  
-    
-      
-    
-  
-  
-    
-  
-    
-  
-  
-    
-  
-    
-    
-    
-    
-    
-    
-    
-    
-  
-  
-    
-  
-    
-      
-      
-      
-      
-      
-      
-      
-      
-      
-    
-    
-      
-        
-          
-            
-              
-          
-        
-      
-      
-        
-      
-      
-        
-        
-        
-          
-            
-              
-            
-              
-          
-          
-            
-              
-            
-              
-            
-              
-          
-          
-            
-              
-            
-              
-            
-              
-            
-              
-          
-          
-            
-              
-            
-              
-            
-              
-            
-              
-            
-              
-          
-          
-            
-              
-            
-              
-            
-              
-            
-              
-            
-              
-            
-              
-          
-        
-      
-    
-  
-  
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-  
-  
-    
-      
-      
-    
-      
-    
-      
-      
-    
-      
-      
-      
-    
-      
-    
-      
-      
-      
-      
-      
-        
-    
-    
-    
-      localhost
-      5050
-    
-  
-  
-  
-    
-  
-    
-      
-      1331746882626
-      1331746882626
-    
-    
-  
-  
-    
-    
-    
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      
-    
-  
-  
-    
-  
-    
-    
-  
-    
-  
-  
-    
-      
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-      
-    
-  
-  
-    
-      
-        
-          
-          
-            
-          
-        
-      
-      
-        
-          No facets are configured
-          
-            
-          
-        
-      
-      
-        
-          
-            
-          
-        
-      
-      
-        
-          1.7
-          
-            
-          
-        
-      
-      
-        
-          Jython27
-          
-            
-          
-        
-      
-      
-        
-          1.7
-          
-            
-          
-        
-      
-      
-        
-          extlibs
-          
-            
-          
-        
-      
-    
-  
-
-

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 20:46:20 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 20:46:20 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_IntelliJ_IDEA_version?=
 =?utf8?q?_control_setup_for_Mercurial=2E?=
Message-ID: 

http://hg.python.org/jython/rev/d9ebb708fad6
changeset:   6367:d9ebb708fad6
user:        Nicholas Riley 
date:        Wed Mar 14 15:34:11 2012 -0400
summary:
  Update IntelliJ IDEA version control setup for Mercurial.

files:
  .idea/vcs.xml |  2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)


diff --git a/.idea/vcs.xml b/.idea/vcs.xml
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,7 +1,7 @@
 
 
   
-    
+    
   
 
 

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 20:46:20 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 20:46:20 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Ignore/remove_IntelliJ_IDEA_?=
	=?utf8?q?misc=2Exml_file=2E?=
Message-ID: 

http://hg.python.org/jython/rev/6efcd823e3b9
changeset:   6368:6efcd823e3b9
user:        Nicholas Riley 
date:        Wed Mar 14 15:35:32 2012 -0400
summary:
  Ignore/remove IntelliJ IDEA misc.xml file.

files:
  .hgignore      |    1 +
  .idea/misc.xml |  150 -------------------------------------
  2 files changed, 1 insertions(+), 150 deletions(-)


diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -11,6 +11,7 @@
 *.ipr
 *.iml
 *.iws
+.idea/misc.xml
 .idea/workspace.xml
 
 .AppleDouble
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-  
-    
-  
-  
-    
-  
-  
-    
-    
-    
-    
-    
-    
-    
-    
-  
-  
-    http://www.w3.org/1999/xhtml
-  
-  
-    
-  
-  
-    
-      
-      
-    
-      
-    
-      
-      
-    
-      
-      
-      
-    
-      
-    
-      
-      
-      
-      
-      
-        
-    
-    
-    
-      localhost
-      5050
-    
-  
-
-

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 20:46:20 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 20:46:20 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Use_Python_2=2E7_version_of_?=
 =?utf8?q?test=5Fstr=2C_not_Python_2=2E6_version=2E?=
Message-ID: 

http://hg.python.org/jython/rev/d0632fda273b
changeset:   6369:d0632fda273b
user:        Nicholas Riley 
date:        Wed Mar 14 15:36:01 2012 -0400
summary:
  Use Python 2.7 version of test_str, not Python 2.6 version.

files:
  Lib/test/test_str.py |  382 -------------------------------
  1 files changed, 0 insertions(+), 382 deletions(-)


diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py
deleted file mode 100644
--- a/Lib/test/test_str.py
+++ /dev/null
@@ -1,382 +0,0 @@
-
-import struct
-import sys
-from test import test_support, string_tests
-
-
-class StrTest(
-    string_tests.CommonTest,
-    string_tests.MixinStrUnicodeUserStringTest,
-    string_tests.MixinStrUserStringTest,
-    string_tests.MixinStrUnicodeTest,
-    ):
-
-    type2test = str
-
-    # We don't need to propagate to str
-    def fixtype(self, obj):
-        return obj
-
-    def test_basic_creation(self):
-        self.assertEqual(str(''), '')
-        self.assertEqual(str(0), '0')
-        self.assertEqual(str(0L), '0')
-        self.assertEqual(str(()), '()')
-        self.assertEqual(str([]), '[]')
-        self.assertEqual(str({}), '{}')
-        a = []
-        a.append(a)
-        self.assertEqual(str(a), '[[...]]')
-        a = {}
-        a[0] = a
-        self.assertEqual(str(a), '{0: {...}}')
-
-    def test_formatting(self):
-        string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
-        self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
-
-    def test_conversion(self):
-        # Make sure __str__() behaves properly
-        class Foo0:
-            def __unicode__(self):
-                return u"foo"
-
-        class Foo1:
-            def __str__(self):
-                return "foo"
-
-        class Foo2(object):
-            def __str__(self):
-                return "foo"
-
-        class Foo3(object):
-            def __str__(self):
-                return u"foo"
-
-        class Foo4(unicode):
-            def __str__(self):
-                return u"foo"
-
-        class Foo5(str):
-            def __str__(self):
-                return u"foo"
-
-        class Foo6(str):
-            def __str__(self):
-                return "foos"
-
-            def __unicode__(self):
-                return u"foou"
-
-        class Foo7(unicode):
-            def __str__(self):
-                return "foos"
-            def __unicode__(self):
-                return u"foou"
-
-        class Foo8(str):
-            def __new__(cls, content=""):
-                return str.__new__(cls, 2*content)
-            def __str__(self):
-                return self
-
-        class Foo9(str):
-            def __str__(self):
-                return "string"
-            def __unicode__(self):
-                return "not unicode"
-
-        self.assert_(str(Foo0()).startswith("<")) # this is different from __unicode__
-        self.assertEqual(str(Foo1()), "foo")
-        self.assertEqual(str(Foo2()), "foo")
-        self.assertEqual(str(Foo3()), "foo")
-        self.assertEqual(str(Foo4("bar")), "foo")
-        self.assertEqual(str(Foo5("bar")), "foo")
-        self.assertEqual(str(Foo6("bar")), "foos")
-        self.assertEqual(str(Foo7("bar")), "foos")
-        self.assertEqual(str(Foo8("foo")), "foofoo")
-        self.assertEqual(str(Foo9("foo")), "string")
-        self.assertEqual(unicode(Foo9("foo")), u"not unicode")
-
-    def test_expandtabs_overflows_gracefully(self):
-        # This test only affects 32-bit platforms because expandtabs can only take
-        # an int as the max value, not a 64-bit C long.  If expandtabs is changed
-        # to take a 64-bit long, this test should apply to all platforms.
-
-        # Jython uses a different algorithm for which overflows cannot occur;
-        # but memory exhaustion of course can. So not applicable.
-        if sys.maxint > (1 << 32) or test_support.is_jython or struct.calcsize('P') != 4:
-            return
-        self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxint)
-
-    def test__format__(self):
-        def test(value, format, expected):
-            # test both with and without the trailing 's'
-            self.assertEqual(value.__format__(format), expected)
-            self.assertEqual(value.__format__(format + 's'), expected)
-
-        test('', '', '')
-        test('abc', '', 'abc')
-        test('abc', '.3', 'abc')
-        test('ab', '.3', 'ab')
-        test('abcdef', '.3', 'abc')
-        test('abcdef', '.0', '')
-        test('abc', '3.3', 'abc')
-        test('abc', '2.3', 'abc')
-        test('abc', '2.2', 'ab')
-        test('abc', '3.2', 'ab ')
-        test('result', 'x<0', 'result')
-        test('result', 'x<5', 'result')
-        test('result', 'x<6', 'result')
-        test('result', 'x<7', 'resultx')
-        test('result', 'x<8', 'resultxx')
-        test('result', ' <7', 'result ')
-        test('result', '<7', 'result ')
-        test('result', '>7', ' result')
-        test('result', '>8', '  result')
-        test('result', '^8', ' result ')
-        test('result', '^9', ' result  ')
-        test('result', '^10', '  result  ')
-        test('a', '10000', 'a' + ' ' * 9999)
-        test('', '10000', ' ' * 10000)
-        test('', '10000000', ' ' * 10000000)
-
-    def test_format(self):
-        self.assertEqual(''.format(), '')
-        self.assertEqual('a'.format(), 'a')
-        self.assertEqual('ab'.format(), 'ab')
-        self.assertEqual('a{{'.format(), 'a{')
-        self.assertEqual('a}}'.format(), 'a}')
-        self.assertEqual('{{b'.format(), '{b')
-        self.assertEqual('}}b'.format(), '}b')
-        self.assertEqual('a{{b'.format(), 'a{b')
-
-        # examples from the PEP:
-        import datetime
-        self.assertEqual("My name is {0}".format('Fred'), "My name is Fred")
-        self.assertEqual("My name is {0[name]}".format(dict(name='Fred')),
-                         "My name is Fred")
-        self.assertEqual("My name is {0} :-{{}}".format('Fred'),
-                         "My name is Fred :-{}")
-
-        d = datetime.date(2007, 8, 18)
-        self.assertEqual("The year is {0.year}".format(d),
-                         "The year is 2007")
-
-        # classes we'll use for testing
-        class C:
-            def __init__(self, x=100):
-                self._x = x
-            def __format__(self, spec):
-                return spec
-
-        class D:
-            def __init__(self, x):
-                self.x = x
-            def __format__(self, spec):
-                return str(self.x)
-
-        # class with __str__, but no __format__
-        class E:
-            def __init__(self, x):
-                self.x = x
-            def __str__(self):
-                return 'E(' + self.x + ')'
-
-        # class with __repr__, but no __format__ or __str__
-        class F:
-            def __init__(self, x):
-                self.x = x
-            def __repr__(self):
-                return 'F(' + self.x + ')'
-
-        # class with __format__ that forwards to string, for some format_spec's
-        class G:
-            def __init__(self, x):
-                self.x = x
-            def __str__(self):
-                return "string is " + self.x
-            def __format__(self, format_spec):
-                if format_spec == 'd':
-                    return 'G(' + self.x + ')'
-                return object.__format__(self, format_spec)
-
-        # class that returns a bad type from __format__
-        class H:
-            def __format__(self, format_spec):
-                return 1.0
-
-        class I(datetime.date):
-            def __format__(self, format_spec):
-                return self.strftime(format_spec)
-
-        class J(int):
-            def __format__(self, format_spec):
-                return int.__format__(self * 2, format_spec)
-
-
-        self.assertEqual(''.format(), '')
-        self.assertEqual('abc'.format(), 'abc')
-        self.assertEqual('{0}'.format('abc'), 'abc')
-        self.assertEqual('{0:}'.format('abc'), 'abc')
-        self.assertEqual('X{0}'.format('abc'), 'Xabc')
-        self.assertEqual('{0}X'.format('abc'), 'abcX')
-        self.assertEqual('X{0}Y'.format('abc'), 'XabcY')
-        self.assertEqual('{1}'.format(1, 'abc'), 'abc')
-        self.assertEqual('X{1}'.format(1, 'abc'), 'Xabc')
-        self.assertEqual('{1}X'.format(1, 'abc'), 'abcX')
-        self.assertEqual('X{1}Y'.format(1, 'abc'), 'XabcY')
-        self.assertEqual('{0}'.format(-15), '-15')
-        self.assertEqual('{0}{1}'.format(-15, 'abc'), '-15abc')
-        self.assertEqual('{0}X{1}'.format(-15, 'abc'), '-15Xabc')
-        self.assertEqual('{{'.format(), '{')
-        self.assertEqual('}}'.format(), '}')
-        self.assertEqual('{{}}'.format(), '{}')
-        self.assertEqual('{{x}}'.format(), '{x}')
-        self.assertEqual('{{{0}}}'.format(123), '{123}')
-        self.assertEqual('{{{{0}}}}'.format(), '{{0}}')
-        self.assertEqual('}}{{'.format(), '}{')
-        self.assertEqual('}}x{{'.format(), '}x{')
-
-        # weird field names
-        self.assertEqual("{0[foo-bar]}".format({'foo-bar':'baz'}), 'baz')
-        self.assertEqual("{0[foo bar]}".format({'foo bar':'baz'}), 'baz')
-        self.assertEqual("{0[ ]}".format({' ':3}), '3')
-
-        self.assertEqual('{foo._x}'.format(foo=C(20)), '20')
-        self.assertEqual('{1}{0}'.format(D(10), D(20)), '2010')
-        self.assertEqual('{0._x.x}'.format(C(D('abc'))), 'abc')
-        self.assertEqual('{0[0]}'.format(['abc', 'def']), 'abc')
-        self.assertEqual('{0[1]}'.format(['abc', 'def']), 'def')
-        self.assertEqual('{0[1][0]}'.format(['abc', ['def']]), 'def')
-        self.assertEqual('{0[1][0].x}'.format(['abc', [D('def')]]), 'def')
-
-        # strings
-        self.assertEqual('{0:.3s}'.format('abc'), 'abc')
-        self.assertEqual('{0:.3s}'.format('ab'), 'ab')
-        self.assertEqual('{0:.3s}'.format('abcdef'), 'abc')
-        self.assertEqual('{0:.0s}'.format('abcdef'), '')
-        self.assertEqual('{0:3.3s}'.format('abc'), 'abc')
-        self.assertEqual('{0:2.3s}'.format('abc'), 'abc')
-        self.assertEqual('{0:2.2s}'.format('abc'), 'ab')
-        self.assertEqual('{0:3.2s}'.format('abc'), 'ab ')
-        self.assertEqual('{0:x<0s}'.format('result'), 'result')
-        self.assertEqual('{0:x<5s}'.format('result'), 'result')
-        self.assertEqual('{0:x<6s}'.format('result'), 'result')
-        self.assertEqual('{0:x<7s}'.format('result'), 'resultx')
-        self.assertEqual('{0:x<8s}'.format('result'), 'resultxx')
-        self.assertEqual('{0: <7s}'.format('result'), 'result ')
-        self.assertEqual('{0:<7s}'.format('result'), 'result ')
-        self.assertEqual('{0:>7s}'.format('result'), ' result')
-        self.assertEqual('{0:>8s}'.format('result'), '  result')
-        self.assertEqual('{0:^8s}'.format('result'), ' result ')
-        self.assertEqual('{0:^9s}'.format('result'), ' result  ')
-        self.assertEqual('{0:^10s}'.format('result'), '  result  ')
-        self.assertEqual('{0:10000}'.format('a'), 'a' + ' ' * 9999)
-        self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
-        self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
-
-        # format specifiers for user defined type
-        self.assertEqual('{0:abc}'.format(C()), 'abc')
-
-        # !r and !s coersions
-        self.assertEqual('{0!s}'.format('Hello'), 'Hello')
-        self.assertEqual('{0!s:}'.format('Hello'), 'Hello')
-        self.assertEqual('{0!s:15}'.format('Hello'), 'Hello          ')
-        self.assertEqual('{0!s:15s}'.format('Hello'), 'Hello          ')
-        self.assertEqual('{0!r}'.format('Hello'), "'Hello'")
-        self.assertEqual('{0!r:}'.format('Hello'), "'Hello'")
-        self.assertEqual('{0!r}'.format(F('Hello')), 'F(Hello)')
-
-        # test fallback to object.__format__
-        self.assertEqual('{0}'.format({}), '{}')
-        self.assertEqual('{0}'.format([]), '[]')
-        self.assertEqual('{0}'.format([1]), '[1]')
-        self.assertEqual('{0}'.format(E('data')), 'E(data)')
-        self.assertEqual('{0:^10}'.format(E('data')), ' E(data)  ')
-        self.assertEqual('{0:^10s}'.format(E('data')), ' E(data)  ')
-        self.assertEqual('{0:d}'.format(G('data')), 'G(data)')
-        self.assertEqual('{0:>15s}'.format(G('data')), ' string is data')
-        self.assertEqual('{0!s}'.format(G('data')), 'string is data')
-
-        self.assertEqual("{0:date: %Y-%m-%d}".format(I(year=2007,
-                                                       month=8,
-                                                       day=27)),
-                         "date: 2007-08-27")
-
-        # test deriving from a builtin type and overriding __format__
-        self.assertEqual("{0}".format(J(10)), "20")
-
-
-        # string format specifiers
-        self.assertEqual('{0:}'.format('a'), 'a')
-
-        # computed format specifiers
-        self.assertEqual("{0:.{1}}".format('hello world', 5), 'hello')
-        self.assertEqual("{0:.{1}s}".format('hello world', 5), 'hello')
-        self.assertEqual("{0:.{precision}s}".format('hello world', precision=5), 'hello')
-        self.assertEqual("{0:{width}.{precision}s}".format('hello world', width=10, precision=5), 'hello     ')
-        self.assertEqual("{0:{width}.{precision}s}".format('hello world', width='10', precision='5'), 'hello     ')
-
-        # test various errors
-        self.assertRaises(ValueError, '{'.format)
-        self.assertRaises(ValueError, '}'.format)
-        self.assertRaises(ValueError, 'a{'.format)
-        self.assertRaises(ValueError, 'a}'.format)
-        self.assertRaises(ValueError, '{a'.format)
-        self.assertRaises(ValueError, '}a'.format)
-        self.assertRaises(IndexError, '{0}'.format)
-        self.assertRaises(IndexError, '{1}'.format, 'abc')
-        self.assertRaises(KeyError,   '{x}'.format)
-        self.assertRaises(ValueError, "}{".format)
-        self.assertRaises(ValueError, "{".format)
-        self.assertRaises(ValueError, "}".format)
-        self.assertRaises(ValueError, "abc{0:{}".format)
-        self.assertRaises(ValueError, "{0".format)
-        self.assertRaises(IndexError, "{0.}".format)
-        self.assertRaises(ValueError, "{0.}".format, 0)
-        self.assertRaises(IndexError, "{0[}".format)
-        self.assertRaises(ValueError, "{0[}".format, [])
-        self.assertRaises(KeyError,   "{0]}".format)
-        self.assertRaises(ValueError, "{0.[]}".format, 0)
-        self.assertRaises(ValueError, "{0..foo}".format, 0)
-        self.assertRaises(ValueError, "{0[0}".format, 0)
-        self.assertRaises(ValueError, "{0[0:foo}".format, 0)
-        self.assertRaises(KeyError,   "{c]}".format)
-        self.assertRaises(ValueError, "{{ {{{0}}".format, 0)
-        self.assertRaises(ValueError, "{0}}".format, 0)
-        self.assertRaises(KeyError,   "{foo}".format, bar=3)
-        self.assertRaises(ValueError, "{0!x}".format, 3)
-        self.assertRaises(ValueError, "{0!}".format, 0)
-        self.assertRaises(ValueError, "{0!rs}".format, 0)
-        self.assertRaises(ValueError, "{!}".format)
-        self.assertRaises(ValueError, "{:}".format)
-        self.assertRaises(ValueError, "{:s}".format)
-        self.assertRaises(ValueError, "{}".format)
-
-        # issue 6089
-        self.assertRaises(ValueError, "{0[0]x}".format, [None])
-        self.assertRaises(ValueError, "{0[0](10)}".format, [None])
-
-        # can't have a replacement on the field name portion
-        self.assertRaises(TypeError, '{0[{1}]}'.format, 'abcdefg', 4)
-
-        # exceed maximum recursion depth
-        self.assertRaises(ValueError, "{0:{1:{2}}}".format, 'abc', 's', '')
-        self.assertRaises(ValueError, "{0:{1:{2:{3:{4:{5:{6}}}}}}}".format,
-                          0, 1, 2, 3, 4, 5, 6, 7)
-
-        # string format spec errors
-        self.assertRaises(ValueError, "{0:-s}".format, '')
-        self.assertRaises(ValueError, format, "", "-")
-        self.assertRaises(ValueError, "{0:=s}".format, '')
-
-    def test_buffer_is_readonly(self):
-        self.assertRaises(TypeError, sys.stdin.readinto, b"")
-
-
-def test_main():
-    test_support.run_unittest(StrTest)
-
-if __name__ == "__main__":
-    test_main()

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 20:46:20 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 20:46:20 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Ignore_some_Emacs_temporary_?=
	=?utf8?q?files=2E?=
Message-ID: 

http://hg.python.org/jython/rev/090015ce9ed9
changeset:   6370:090015ce9ed9
user:        Nicholas Riley 
date:        Wed Mar 14 15:43:16 2012 -0400
summary:
  Ignore some Emacs temporary files.

files:
  .hgignore |  1 +
  1 files changed, 1 insertions(+), 0 deletions(-)


diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -6,6 +6,7 @@
 *.orig
 *.rej
 *.swp
+\#*
 *~
 # IntelliJ files
 *.ipr

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 21:41:16 2012
From: jython-checkins at python.org (nicholas.riley)
Date: Wed, 14 Mar 2012 21:41:16 +0100
Subject: [Jython-checkins] =?utf8?b?anl0aG9uOiBzdHJ1Y3QuY2FsY3NpemUoJ1An?=
 =?utf8?q?=29=2C_a_commonly_used_method_of_testing_whether_Python_is?=
Message-ID: 

http://hg.python.org/jython/rev/fb93b3a083a9
changeset:   6371:fb93b3a083a9
user:        Nicholas Riley 
date:        Wed Mar 14 16:40:08 2012 -0400
summary:
  struct.calcsize('P'), a commonly used method of testing whether Python is running 32- or 64-bit.

files:
  src/org/python/modules/struct.java |  20 ++++++++++++++++++
  1 files changed, 20 insertions(+), 0 deletions(-)


diff --git a/src/org/python/modules/struct.java b/src/org/python/modules/struct.java
--- a/src/org/python/modules/struct.java
+++ b/src/org/python/modules/struct.java
@@ -562,7 +562,26 @@
             return Py.newInteger(buf.readByte());
         }
     }
+    
+    static class PointerFormatDef extends FormatDef {
+        FormatDef init(char name) {
+            String dataModel = System.getProperty("sun.arch.data.model");
+            if (dataModel == null)
+                throw Py.NotImplementedError("Can't determine if JVM is 32- or 64-bit");
+            int length = dataModel.equals("64") ? 8 : 4;
+            super.init(name, length, length);
+            return this;
+        }
+        
+        void pack(ByteStream buf, PyObject value) {
+            throw Py.NotImplementedError("Pointer packing/unpacking not implemented in Jython");
+        }
 
+        Object unpack(ByteStream buf) {
+            throw Py.NotImplementedError("Pointer packing/unpacking not implemented in Jython");
+        }
+    }
+    
     static class LEShortFormatDef extends FormatDef {
         void pack(ByteStream buf, PyObject value) {
             int v = get_int(value);
@@ -876,6 +895,7 @@
         new BEUnsignedLongFormatDef()   .init('Q', 8, 8),
         new BEFloatFormatDef()          .init('f', 4, 4),
         new BEDoubleFormatDef()         .init('d', 8, 8),
+        new PointerFormatDef()          .init('P')
     };
 
 

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 22:04:39 2012
From: jython-checkins at python.org (jim.baker)
Date: Wed, 14 Mar 2012 22:04:39 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_itertools=2Ecompress?=
Message-ID: 

http://hg.python.org/jython/rev/f777b02ce694
changeset:   6373:f777b02ce694
parent:      6361:55230545a960
user:        Jim Baker 
date:        Wed Mar 14 14:03:09 2012 -0700
summary:
  Add itertools.compress

files:
  .idea/workspace.xml                   |  135 +++-------
  src/org/python/modules/itertools.java |  163 ++++++++++++-
  2 files changed, 192 insertions(+), 106 deletions(-)


diff --git a/.idea/workspace.xml b/.idea/workspace.xml
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -73,19 +73,31 @@
   
   
     
-      
+      
         
           
-            
+            
+              
+                
+                
+              
+            
+          
+        
+      
+      
+        
+          
+            
               
             
           
         
       
-      
-        
+      
+        
           
-            
+            
               
             
           
@@ -106,8 +118,8 @@
   
     
   
@@ -170,86 +182,6 @@
               
+       '''
+
+__UNDEF__ = []                          # a special sentinel object
+def small(text): return '' + text + ''
+def strong(text): return '' + text + ''
+def grey(text): return '' + text + ''
+
+def lookup(name, frame, locals):
+    """Find the value for a given name in the given environment."""
+    if name in locals:
+        return 'local', locals[name]
+    if name in frame.f_globals:
+        return 'global', frame.f_globals[name]
+    return None, __UNDEF__
+
+def scanvars(reader, frame, locals):
+    """Scan one logical line of Python and look up values of variables used."""
+    import tokenize, keyword
+    vars, lasttoken, parent, prefix = [], None, None, ''
+    for ttype, token, start, end, line in tokenize.generate_tokens(reader):
+        if ttype == tokenize.NEWLINE: break
+        if ttype == tokenize.NAME and token not in keyword.kwlist:
+            if lasttoken == '.':
+                if parent is not __UNDEF__:
+                    value = getattr(parent, token, __UNDEF__)
+                    vars.append((prefix + token, prefix, value))
+            else:
+                where, value = lookup(token, frame, locals)
+                vars.append((token, where, value))
+        elif token == '.':
+            prefix += lasttoken + '.'
+            parent = value
+        else:
+            parent, prefix = None, ''
+        lasttoken = token
+    return vars
+
+def html((etype, evalue, etb), context=5):
+    """Return a nice HTML document describing a given traceback."""
+    import os, types, time, traceback, linecache, inspect, pydoc
+
+    if type(etype) is types.ClassType:
+        etype = etype.__name__
+    pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable
+    date = time.ctime(time.time())
+    head = '' + pydoc.html.heading(
+        '%s' % str(etype),
+        '#ffffff', '#6622aa', pyver + '
' + date) + ''' +

A problem occurred in a Python script. Here is the sequence of +function calls leading up to the error, in the order they occurred.''' + + indent = '' + small(' ' * 5) + ' ' + frames = [] + records = inspect.getinnerframes(etb, context) + for frame, file, lnum, func, lines, index in records: + file = file and os.path.abspath(file) or '?' + link = '%s' % (file, pydoc.html.escape(file)) + args, varargs, varkw, locals = inspect.getargvalues(frame) + call = '' + if func != '?': + call = 'in ' + strong(func) + \ + inspect.formatargvalues(args, varargs, varkw, locals, + formatvalue=lambda value: '=' + pydoc.html.repr(value)) + + highlight = {} + def reader(lnum=[lnum]): + highlight[lnum[0]] = 1 + try: return linecache.getline(file, lnum[0]) + finally: lnum[0] += 1 + vars = scanvars(reader, frame, locals) + + rows = ['%s%s %s' % + (' ', link, call)] + if index is not None: + i = lnum - index + for line in lines: + num = small(' ' * (5-len(str(i))) + str(i)) + ' ' + line = '%s%s' % (num, pydoc.html.preformat(line)) + if i in highlight: + rows.append('%s' % line) + else: + rows.append('%s' % grey(line)) + i += 1 + + done, dump = {}, [] + for name, where, value in vars: + if name in done: continue + done[name] = 1 + if value is not __UNDEF__: + if where == 'global': name = 'global ' + strong(name) + elif where == 'local': name = strong(name) + else: name = where + strong(name.split('.')[-1]) + dump.append('%s = %s' % (name, pydoc.html.repr(value))) + else: + dump.append(name + ' undefined') + + rows.append('%s' % small(grey(', '.join(dump)))) + frames.append('''

+ +%s
''' % '\n'.join(rows)) + + exception = ['

%s: %s' % (strong(str(etype)), str(evalue))] + if type(evalue) is types.InstanceType: + for name in dir(evalue): + value = pydoc.html.repr(getattr(evalue, name)) + exception.append('\n
%s%s =\n%s' % (indent, name, value)) + + import traceback + return head + ''.join(frames) + ''.join(exception) + ''' + + + +''' % ''.join(traceback.format_exception(etype, evalue, etb)) + +class Hook: + """A hook to replace sys.excepthook that shows tracebacks in HTML.""" + + def __init__(self, display=1, logdir=None, context=5, file=None): + self.display = display # send tracebacks to browser if true + self.logdir = logdir # log tracebacks to files if not None + self.context = context # number of source code lines per frame + self.file = file or sys.stdout # place to send the output + + def __call__(self, etype, evalue, etb): + self.handle((etype, evalue, etb)) + + def handle(self, info=None): + info = info or sys.exc_info() + self.file.write(reset()) + + try: + text, doc = 0, html(info, self.context) + except: # just in case something goes wrong + import traceback + text, doc = 1, ''.join(traceback.format_exception(*info)) + + if self.display: + if text: + doc = doc.replace('&', '&').replace('<', '<') + self.file.write('

' + doc + '
\n') + else: + self.file.write(doc + '\n') + else: + self.file.write('

A problem occurred in a Python script.\n') + + if self.logdir is not None: + import os, tempfile + name = tempfile.mktemp(['.html', '.txt'][text]) + path = os.path.join(self.logdir, os.path.basename(name)) + try: + file = open(path, 'w') + file.write(doc) + file.close() + msg = '

%s contains the description of this error.' % path + except: + msg = '

Tried to save traceback to %s, but failed.' % path + self.file.write(msg + '\n') + try: + self.file.flush() + except: pass + +handler = Hook().handle +def enable(display=1, logdir=None, context=5): + """Install an exception handler that formats tracebacks as HTML. + + The optional argument 'display' can be set to 0 to suppress sending the + traceback to the browser, and 'logdir' can be set to a directory to cause + tracebacks to be written to files there.""" + sys.excepthook = Hook(display, logdir, context) diff --git a/lib-python/2.2/chunk.py b/lib-python/2.2/chunk.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/chunk.py @@ -0,0 +1,167 @@ +"""Simple class to read IFF chunks. + +An IFF chunk (used in formats such as AIFF, TIFF, RMFF (RealMedia File +Format)) has the following structure: + ++----------------+ +| ID (4 bytes) | ++----------------+ +| size (4 bytes) | ++----------------+ +| data | +| ... | ++----------------+ + +The ID is a 4-byte string which identifies the type of chunk. + +The size field (a 32-bit value, encoded using big-endian byte order) +gives the size of the whole chunk, including the 8-byte header. + +Usually an IFF-type file consists of one or more chunks. The proposed +usage of the Chunk class defined here is to instantiate an instance at +the start of each chunk and read from the instance until it reaches +the end, after which a new instance can be instantiated. At the end +of the file, creating a new instance will fail with a EOFError +exception. + +Usage: +while 1: + try: + chunk = Chunk(file) + except EOFError: + break + chunktype = chunk.getname() + while 1: + data = chunk.read(nbytes) + if not data: + pass + # do something with data + +The interface is file-like. The implemented methods are: +read, close, seek, tell, isatty. +Extra methods are: skip() (called by close, skips to the end of the chunk), +getname() (returns the name (ID) of the chunk) + +The __init__ method has one required argument, a file-like object +(including a chunk instance), and one optional argument, a flag which +specifies whether or not chunks are aligned on 2-byte boundaries. The +default is 1, i.e. aligned. +""" + +class Chunk: + def __init__(self, file, align = 1, bigendian = 1, inclheader = 0): + import struct + self.closed = 0 + self.align = align # whether to align to word (2-byte) boundaries + if bigendian: + strflag = '>' + else: + strflag = '<' + self.file = file + self.chunkname = file.read(4) + if len(self.chunkname) < 4: + raise EOFError + try: + self.chunksize = struct.unpack(strflag+'l', file.read(4))[0] + except struct.error: + raise EOFError + if inclheader: + self.chunksize = self.chunksize - 8 # subtract header + self.size_read = 0 + try: + self.offset = self.file.tell() + except (AttributeError, IOError): + self.seekable = 0 + else: + self.seekable = 1 + + def getname(self): + """Return the name (ID) of the current chunk.""" + return self.chunkname + + def getsize(self): + """Return the size of the current chunk.""" + return self.chunksize + + def close(self): + if not self.closed: + self.skip() + self.closed = 1 + + def isatty(self): + if self.closed: + raise ValueError, "I/O operation on closed file" + return 0 + + def seek(self, pos, whence = 0): + """Seek to specified position into the chunk. + Default position is 0 (start of chunk). + If the file is not seekable, this will result in an error. + """ + + if self.closed: + raise ValueError, "I/O operation on closed file" + if not self.seekable: + raise IOError, "cannot seek" + if whence == 1: + pos = pos + self.size_read + elif whence == 2: + pos = pos + self.chunksize + if pos < 0 or pos > self.chunksize: + raise RuntimeError + self.file.seek(self.offset + pos, 0) + self.size_read = pos + + def tell(self): + if self.closed: + raise ValueError, "I/O operation on closed file" + return self.size_read + + def read(self, size = -1): + """Read at most size bytes from the chunk. + If size is omitted or negative, read until the end + of the chunk. + """ + + if self.closed: + raise ValueError, "I/O operation on closed file" + if self.size_read >= self.chunksize: + return '' + if size < 0: + size = self.chunksize - self.size_read + if size > self.chunksize - self.size_read: + size = self.chunksize - self.size_read + data = self.file.read(size) + self.size_read = self.size_read + len(data) + if self.size_read == self.chunksize and \ + self.align and \ + (self.chunksize & 1): + dummy = self.file.read(1) + self.size_read = self.size_read + len(dummy) + return data + + def skip(self): + """Skip the rest of the chunk. + If you are not interested in the contents of the chunk, + this method should be called so that the file points to + the start of the next chunk. + """ + + if self.closed: + raise ValueError, "I/O operation on closed file" + if self.seekable: + try: + n = self.chunksize - self.size_read + # maybe fix alignment + if self.align and (self.chunksize & 1): + n = n + 1 + self.file.seek(n, 1) + self.size_read = self.size_read + n + return + except IOError: + pass + while self.size_read < self.chunksize: + n = min(8192, self.chunksize - self.size_read) + dummy = self.read(n) + if not dummy: + raise EOFError diff --git a/lib-python/2.2/cmd.py b/lib-python/2.2/cmd.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/cmd.py @@ -0,0 +1,336 @@ +"""A generic class to build line-oriented command interpreters. + +Interpreters constructed with this class obey the following conventions: + +1. End of file on input is processed as the command 'EOF'. +2. A command is parsed out of each line by collecting the prefix composed + of characters in the identchars member. +3. A command `foo' is dispatched to a method 'do_foo()'; the do_ method + is passed a single argument consisting of the remainder of the line. +4. Typing an empty line repeats the last command. (Actually, it calls the + method `emptyline', which may be overridden in a subclass.) +5. There is a predefined `help' method. Given an argument `topic', it + calls the command `help_topic'. With no arguments, it lists all topics + with defined help_ functions, broken into up to three topics; documented + commands, miscellaneous help topics, and undocumented commands. +6. The command '?' is a synonym for `help'. The command '!' is a synonym + for `shell', if a do_shell method exists. +7. If completion is enabled, completing commands will be done automatically, + and completing of commands args is done by calling complete_foo() with + arguments text, line, begidx, endidx. text is string we are matching + against, all returned matches must begin with it. line is the current + input line (lstripped), begidx and endidx are the beginning and end + indexes of the text being matched, which could be used to provide + different completion depending upon which position the argument is in. + +The `default' method may be overridden to intercept commands for which there +is no do_ method. + +The `completedefault' method may be overridden to intercept completions for +commands that have no complete_ method. + +The data member `self.ruler' sets the character used to draw separator lines +in the help messages. If empty, no ruler line is drawn. It defaults to "=". + +If the value of `self.intro' is nonempty when the cmdloop method is called, +it is printed out on interpreter startup. This value may be overridden +via an optional argument to the cmdloop() method. + +The data members `self.doc_header', `self.misc_header', and +`self.undoc_header' set the headers used for the help function's +listings of documented functions, miscellaneous topics, and undocumented +functions respectively. + +These interpreters use raw_input; thus, if the readline module is loaded, +they automatically support Emacs-like command history and editing features. +""" + +import string, sys + +__all__ = ["Cmd"] + +PROMPT = '(Cmd) ' +IDENTCHARS = string.ascii_letters + string.digits + '_' + +class Cmd: + """A simple framework for writing line-oriented command interpreters. + + These are often useful for test harnesses, administrative tools, and + prototypes that will later be wrapped in a more sophisticated interface. + + A Cmd instance or subclass instance is a line-oriented interpreter + framework. There is no good reason to instantiate Cmd itself; rather, + it's useful as a superclass of an interpreter class you define yourself + in order to inherit Cmd's methods and encapsulate action methods. + + """ + prompt = PROMPT + identchars = IDENTCHARS + ruler = '=' + lastcmd = '' + intro = None + doc_leader = "" + doc_header = "Documented commands (type help ):" + misc_header = "Miscellaneous help topics:" + undoc_header = "Undocumented commands:" + nohelp = "*** No help on %s" + use_rawinput = 1 + + def __init__(self, completekey='tab'): + """Instantiate a line-oriented interpreter framework. + + The optional argument is the readline name of a completion key; + it defaults to the Tab key. If completekey is not None and the + readline module is available, command completion is done + automatically. + + """ + self.cmdqueue = [] + self.completekey = completekey + + def cmdloop(self, intro=None): + """Repeatedly issue a prompt, accept input, parse an initial prefix + off the received input, and dispatch to action methods, passing them + the remainder of the line as argument. + + """ + + self.preloop() + if intro is not None: + self.intro = intro + if self.intro: + print self.intro + stop = None + while not stop: + if self.cmdqueue: + line = self.cmdqueue[0] + del self.cmdqueue[0] + else: + if self.use_rawinput: + try: + line = raw_input(self.prompt) + except EOFError: + line = 'EOF' + else: + sys.stdout.write(self.prompt) + sys.stdout.flush() + line = sys.stdin.readline() + if not len(line): + line = 'EOF' + else: + line = line[:-1] # chop \n + line = self.precmd(line) + stop = self.onecmd(line) + stop = self.postcmd(stop, line) + self.postloop() + + def precmd(self, line): + """Hook method executed just before the command line is + interpreted, but after the input prompt is generated and issued. + + """ + return line + + def postcmd(self, stop, line): + """Hook method executed just after a command dispatch is finished.""" + return stop + + def preloop(self): + """Hook method executed once when the cmdloop() method is called.""" + if self.completekey: + try: + import readline + self.old_completer = readline.get_completer() + readline.set_completer(self.complete) + readline.parse_and_bind(self.completekey+": complete") + except ImportError: + pass + + def postloop(self): + """Hook method executed once when the cmdloop() method is about to + return. + + """ + if self.completekey: + try: + import readline + readline.set_completer(self.old_completer) + except ImportError: + pass + + def parseline(self, line): + line = line.strip() + if not line: + return None, None, line + elif line[0] == '?': + line = 'help ' + line[1:] + elif line[0] == '!': + if hasattr(self, 'do_shell'): + line = 'shell ' + line[1:] + else: + return None, None, line + i, n = 0, len(line) + while i < n and line[i] in self.identchars: i = i+1 + cmd, arg = line[:i], line[i:].strip() + return cmd, arg, line + + def onecmd(self, line): + """Interpret the argument as though it had been typed in response + to the prompt. + + This may be overridden, but should not normally need to be; + see the precmd() and postcmd() methods for useful execution hooks. + The return value is a flag indicating whether interpretation of + commands by the interpreter should stop. + + """ + cmd, arg, line = self.parseline(line) + if not line: + return self.emptyline() + if cmd is None: + return self.default(line) + self.lastcmd = line + if cmd == '': + return self.default(line) + else: + try: + func = getattr(self, 'do_' + cmd) + except AttributeError: + return self.default(line) + return func(arg) + + def emptyline(self): + """Called when an empty line is entered in response to the prompt. + + If this method is not overridden, it repeats the last nonempty + command entered. + + """ + if self.lastcmd: + return self.onecmd(self.lastcmd) + + def default(self, line): + """Called on an input line when the command prefix is not recognized. + + If this method is not overridden, it prints an error message and + returns. + + """ + print '*** Unknown syntax:', line + + def completedefault(self, *ignored): + """Method called to complete an input line when no command-specific + complete_*() method is available. + + By default, it returns an empty list. + + """ + return [] + + def completenames(self, text, *ignored): + dotext = 'do_'+text + return [a[3:] for a in self.get_names() if a.startswith(dotext)] + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + If a command has not been entered, then complete against command list. + Otherwise try to call complete_ to get list of completions. + """ + if state == 0: + import readline + origline = readline.get_line_buffer() + line = origline.lstrip() + stripped = len(origline) - len(line) + begidx = readline.get_begidx() - stripped + endidx = readline.get_endidx() - stripped + if begidx>0: + cmd, args, foo = self.parseline(line) + if cmd == '': + compfunc = self.completedefault + else: + try: + compfunc = getattr(self, 'complete_' + cmd) + except AttributeError: + compfunc = self.completedefault + else: + compfunc = self.completenames + self.completion_matches = compfunc(text, line, begidx, endidx) + try: + return self.completion_matches[state] + except IndexError: + return None + + def get_names(self): + # Inheritance says we have to look in class and + # base classes; order is not important. + names = [] + classes = [self.__class__] + while classes: + aclass = classes[0] + if aclass.__bases__: + classes = classes + list(aclass.__bases__) + names = names + dir(aclass) + del classes[0] + return names + + def complete_help(self, *args): + return self.completenames(*args) + + def do_help(self, arg): + if arg: + # XXX check arg syntax + try: + func = getattr(self, 'help_' + arg) + except: + try: + doc=getattr(self, 'do_' + arg).__doc__ + if doc: + print doc + return + except: + pass + print self.nohelp % (arg,) + return + func() + else: + names = self.get_names() + cmds_doc = [] + cmds_undoc = [] + help = {} + for name in names: + if name[:5] == 'help_': + help[name[5:]]=1 + names.sort() + # There can be duplicates if routines overridden + prevname = '' + for name in names: + if name[:3] == 'do_': + if name == prevname: + continue + prevname = name + cmd=name[3:] + if help.has_key(cmd): + cmds_doc.append(cmd) + del help[cmd] + elif getattr(self, name).__doc__: + cmds_doc.append(cmd) + else: + cmds_undoc.append(cmd) + print self.doc_leader + self.print_topics(self.doc_header, cmds_doc, 15,80) + self.print_topics(self.misc_header, help.keys(),15,80) + self.print_topics(self.undoc_header, cmds_undoc, 15,80) + + def print_topics(self, header, cmds, cmdlen, maxcol): + if cmds: + print header + if self.ruler: + print self.ruler * len(header) + (cmds_per_line,junk)=divmod(maxcol,cmdlen) + col=cmds_per_line + for cmd in cmds: + if col==0: print + print (("%-"+`cmdlen`+"s") % cmd), + col = (col+1) % cmds_per_line + print "\n" diff --git a/lib-python/2.2/code.py b/lib-python/2.2/code.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/code.py @@ -0,0 +1,311 @@ +"""Utilities needed to emulate Python's interactive interpreter. + +""" + +# Inspired by similar code by Jeff Epler and Fredrik Lundh. + + +import sys +import traceback +from codeop import CommandCompiler, compile_command + +__all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", + "compile_command"] + +def softspace(file, newvalue): + oldvalue = 0 + try: + oldvalue = file.softspace + except AttributeError: + pass + try: + file.softspace = newvalue + except (AttributeError, TypeError): + # "attribute-less object" or "read-only attributes" + pass + return oldvalue + +class InteractiveInterpreter: + """Base class for InteractiveConsole. + + This class deals with parsing and interpreter state (the user's + namespace); it doesn't deal with input buffering or prompting or + input file naming (the filename is always passed in explicitly). + + """ + + def __init__(self, locals=None): + """Constructor. + + The optional 'locals' argument specifies the dictionary in + which code will be executed; it defaults to a newly created + dictionary with key "__name__" set to "__console__" and key + "__doc__" set to None. + + """ + if locals is None: + locals = {"__name__": "__console__", "__doc__": None} + self.locals = locals + self.compile = CommandCompiler() + + def runsource(self, source, filename="", symbol="single"): + """Compile and run some source in the interpreter. + + Arguments are as for compile_command(). + + One several things can happen: + + 1) The input is incorrect; compile_command() raised an + exception (SyntaxError or OverflowError). A syntax traceback + will be printed by calling the showsyntaxerror() method. + + 2) The input is incomplete, and more input is required; + compile_command() returned None. Nothing happens. + + 3) The input is complete; compile_command() returned a code + object. The code is executed by calling self.runcode() (which + also handles run-time exceptions, except for SystemExit). + + The return value is 1 in case 2, 0 in the other cases (unless + an exception is raised). The return value can be used to + decide whether to use sys.ps1 or sys.ps2 to prompt the next + line. + + """ + try: + code = self.compile(source, filename, symbol) + except (OverflowError, SyntaxError, ValueError): + # Case 1 + self.showsyntaxerror(filename) + return 0 + + if code is None: + # Case 2 + return 1 + + # Case 3 + self.runcode(code) + return 0 + + def runcode(self, code): + """Execute a code object. + + When an exception occurs, self.showtraceback() is called to + display a traceback. All exceptions are caught except + SystemExit, which is reraised. + + A note about KeyboardInterrupt: this exception may occur + elsewhere in this code, and may not always be caught. The + caller should be prepared to deal with it. + + """ + try: + exec code in self.locals + except SystemExit: + raise + except: + self.showtraceback() + else: + if softspace(sys.stdout, 0): + print + + def showsyntaxerror(self, filename=None): + """Display the syntax error that just occurred. + + This doesn't display a stack trace because there isn't one. + + If a filename is given, it is stuffed in the exception instead + of what was there before (because Python's parser always uses + "" when reading from a string). + + The output is written by self.write(), below. + + """ + type, value, sys.last_traceback = sys.exc_info() + sys.last_type = type + sys.last_value = value + if filename and type is SyntaxError: + # Work hard to stuff the correct filename in the exception + try: + msg, (dummy_filename, lineno, offset, line) = value + except: + # Not the format we expect; leave it alone + pass + else: + # Stuff in the right filename + try: + # Assume SyntaxError is a class exception + value = SyntaxError(msg, (filename, lineno, offset, line)) + except: + # If that failed, assume SyntaxError is a string + value = msg, (filename, lineno, offset, line) + sys.last_value = value + list = traceback.format_exception_only(type, value) + map(self.write, list) + + def showtraceback(self): + """Display the exception that just occurred. + + We remove the first stack item because it is our own code. + + The output is written by self.write(), below. + + """ + try: + type, value, tb = sys.exc_info() + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + tblist = traceback.extract_tb(tb) + del tblist[:1] + list = traceback.format_list(tblist) + if list: + list.insert(0, "Traceback (most recent call last):\n") + list[len(list):] = traceback.format_exception_only(type, value) + finally: + tblist = tb = None + map(self.write, list) + + def write(self, data): + """Write a string. + + The base implementation writes to sys.stderr; a subclass may + replace this with a different implementation. + + """ + sys.stderr.write(data) + + +class InteractiveConsole(InteractiveInterpreter): + """Closely emulate the behavior of the interactive Python interpreter. + + This class builds on InteractiveInterpreter and adds prompting + using the familiar sys.ps1 and sys.ps2, and input buffering. + + """ + + def __init__(self, locals=None, filename=""): + """Constructor. + + The optional locals argument will be passed to the + InteractiveInterpreter base class. + + The optional filename argument should specify the (file)name + of the input stream; it will show up in tracebacks. + + """ + InteractiveInterpreter.__init__(self, locals) + self.filename = filename + self.resetbuffer() + + def resetbuffer(self): + """Reset the input buffer.""" + self.buffer = [] + + def interact(self, banner=None): + """Closely emulate the interactive Python console. + + The optional banner argument specify the banner to print + before the first interaction; by default it prints a banner + similar to the one printed by the real Python interpreter, + followed by the current class name in parentheses (so as not + to confuse this with the real interpreter -- since it's so + close!). + + """ + try: + sys.ps1 + except AttributeError: + sys.ps1 = ">>> " + try: + sys.ps2 + except AttributeError: + sys.ps2 = "... " + cprt = 'Type "copyright", "credits" or "license" for more information.' + if banner is None: + self.write("Python %s on %s\n%s\n(%s)\n" % + (sys.version, sys.platform, cprt, + self.__class__.__name__)) + else: + self.write("%s\n" % str(banner)) + more = 0 + while 1: + try: + if more: + prompt = sys.ps2 + else: + prompt = sys.ps1 + try: + line = self.raw_input(prompt) + except EOFError: + self.write("\n") + break + else: + more = self.push(line) + except KeyboardInterrupt: + self.write("\nKeyboardInterrupt\n") + self.resetbuffer() + more = 0 + + def push(self, line): + """Push a line to the interpreter. + + The line should not have a trailing newline; it may have + internal newlines. The line is appended to a buffer and the + interpreter's runsource() method is called with the + concatenated contents of the buffer as source. If this + indicates that the command was executed or invalid, the buffer + is reset; otherwise, the command is incomplete, and the buffer + is left as it was after the line was appended. The return + value is 1 if more input is required, 0 if the line was dealt + with in some way (this is the same as runsource()). + + """ + self.buffer.append(line) + source = "\n".join(self.buffer) + more = self.runsource(source, self.filename) + if not more: + self.resetbuffer() + return more + + def raw_input(self, prompt=""): + """Write a prompt and read a line. + + The returned line does not include the trailing newline. + When the user enters the EOF key sequence, EOFError is raised. + + The base implementation uses the built-in function + raw_input(); a subclass may replace this with a different + implementation. + + """ + return raw_input(prompt) + + +def interact(banner=None, readfunc=None, local=None): + """Closely emulate the interactive Python interpreter. + + This is a backwards compatible interface to the InteractiveConsole + class. When readfunc is not specified, it attempts to import the + readline module to enable GNU readline if it is available. + + Arguments (all optional, all default to None): + + banner -- passed to InteractiveConsole.interact() + readfunc -- if not None, replaces InteractiveConsole.raw_input() + local -- passed to InteractiveInterpreter.__init__() + + """ + console = InteractiveConsole(local) + if readfunc is not None: + console.raw_input = readfunc + else: + try: + import readline + except: + pass + console.interact(banner) + + +if __name__ == '__main__': + interact() diff --git a/lib-python/2.2/codecs.py b/lib-python/2.2/codecs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/codecs.py @@ -0,0 +1,636 @@ +""" codecs -- Python Codec Registry, API and helpers. + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import struct, __builtin__ + +### Registry and builtin stateless codec functions + +try: + from _codecs import * +except ImportError, why: + raise SystemError,\ + 'Failed to load the builtin codecs: %s' % why + +__all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", + "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE"] + +### Constants + +# +# Byte Order Mark (BOM) and its possible values (BOM_BE, BOM_LE) +# +BOM = struct.pack('=H', 0xFEFF) +# +BOM_BE = BOM32_BE = '\376\377' +# corresponds to Unicode U+FEFF in UTF-16 on big endian +# platforms == ZERO WIDTH NO-BREAK SPACE +BOM_LE = BOM32_LE = '\377\376' +# corresponds to Unicode U+FFFE in UTF-16 on little endian +# platforms == defined as being an illegal Unicode character + +# +# 64-bit Byte Order Marks +# +BOM64_BE = '\000\000\376\377' +# corresponds to Unicode U+0000FEFF in UCS-4 +BOM64_LE = '\377\376\000\000' +# corresponds to Unicode U+0000FFFE in UCS-4 + + +### Codec base classes (defining the API) + +class Codec: + + """ Defines the interface for stateless encoders/decoders. + + The .encode()/.decode() methods may implement different error + handling schemes by providing the errors argument. These + string values are defined: + + 'strict' - raise a ValueError error (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace' - replace with a suitable replacement character; + Python will use the official U+FFFD REPLACEMENT + CHARACTER for the builtin Unicode codecs. + + """ + def encode(self, input, errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamCodec for codecs which have to keep state in order to + make encoding/decoding efficient. + + The encoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + + def decode(self, input, errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamCodec for codecs which have to keep state in order to + make encoding/decoding efficient. + + The decoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + +# +# The StreamWriter and StreamReader class provide generic working +# interfaces which can be used to implement new encoding submodules +# very easily. See encodings/utf_8.py for an example on how this is +# done. +# + +class StreamWriter(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamWriter instance. + + stream must be a file-like object open for writing + (binary) data. + + The StreamWriter may implement different error handling + schemes by providing the errors keyword argument. These + parameters are defined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + + """ + self.stream = stream + self.errors = errors + + def write(self, object): + + """ Writes the object's contents encoded to self.stream. + """ + data, consumed = self.encode(object, self.errors) + self.stream.write(data) + + def writelines(self, list): + + """ Writes the concatenated list of strings to the stream + using .write(). + """ + self.write(''.join(list)) + + def reset(self): + + """ Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the + output is put into a clean state, that allows appending + of new fresh data without having to rescan the whole + stream to recover state. + + """ + pass + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + +### + +class StreamReader(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamReader instance. + + stream must be a file-like object open for reading + (binary) data. + + The StreamReader may implement different error handling + schemes by providing the errors keyword argument. These + parameters are defined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character; + + """ + self.stream = stream + self.errors = errors + + def read(self, size=-1): + + """ Decodes data from the stream self.stream and returns the + resulting object. + + size indicates the approximate maximum number of bytes to + read from the stream for decoding purposes. The decoder + can modify this setting as appropriate. The default value + -1 indicates to read and decode as much as possible. size + is intended to prevent having to decode huge files in one + step. + + The method should use a greedy read strategy meaning that + it should read as much data as is allowed within the + definition of the encoding and the given size, e.g. if + optional encoding endings or state markers are available + on the stream, these should be read too. + + """ + # Unsliced reading: + if size < 0: + return self.decode(self.stream.read(), self.errors)[0] + + # Sliced reading: + read = self.stream.read + decode = self.decode + data = read(size) + i = 0 + while 1: + try: + object, decodedbytes = decode(data, self.errors) + except ValueError, why: + # This method is slow but should work under pretty much + # all conditions; at most 10 tries are made + i = i + 1 + newdata = read(1) + if not newdata or i > 10: + raise + data = data + newdata + else: + return object + + def readline(self, size=None): + + """ Read one line from the input stream and return the + decoded data. + + Note: Unlike the .readlines() method, this method inherits + the line breaking knowledge from the underlying stream's + .readline() method -- there is currently no support for + line breaking using the codec decoder due to lack of line + buffering. Sublcasses should however, if possible, try to + implement this method using their own knowledge of line + breaking. + + size, if given, is passed as size argument to the stream's + .readline() method. + + """ + if size is None: + line = self.stream.readline() + else: + line = self.stream.readline(size) + return self.decode(line, self.errors)[0] + + + def readlines(self, sizehint=None): + + """ Read all lines available on the input stream + and return them as list of lines. + + Line breaks are implemented using the codec's decoder + method and are included in the list entries. + + sizehint, if given, is passed as size argument to the + stream's .read() method. + + """ + if sizehint is None: + data = self.stream.read() + else: + data = self.stream.read(sizehint) + return self.decode(data, self.errors)[0].splitlines(1) + + def reset(self): + + """ Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. + This method is primarily intended to be able to recover + from decoding errors. + + """ + pass + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + +### + +class StreamReaderWriter: + + """ StreamReaderWriter instances allow wrapping streams which + work in both read and write modes. + + The design is such that one can use the factory functions + returned by the codec.lookup() function to construct the + instance. + + """ + # Optional attributes set by the file wrappers below + encoding = 'unknown' + + def __init__(self, stream, Reader, Writer, errors='strict'): + + """ Creates a StreamReaderWriter instance. + + stream must be a Stream-like object. + + Reader, Writer must be factory functions or classes + providing the StreamReader, StreamWriter interface resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + return self.reader.read(size) + + def readline(self, size=None): + + return self.reader.readline(size) + + def readlines(self, sizehint=None): + + return self.reader.readlines(sizehint) + + def write(self, data): + + return self.writer.write(data) + + def writelines(self, list): + + return self.writer.writelines(list) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + +### + +class StreamRecoder: + + """ StreamRecoder instances provide a frontend - backend + view of encoding data. + + They use the complete set of APIs returned by the + codecs.lookup() function to implement their task. + + Data written to the stream is first decoded into an + intermediate format (which is dependent on the given codec + combination) and then written to the stream using an instance + of the provided Writer class. + + In the other direction, data is read from the stream using a + Reader instance and then return encoded data to the caller. + + """ + # Optional attributes set by the file wrappers below + data_encoding = 'unknown' + file_encoding = 'unknown' + + def __init__(self, stream, encode, decode, Reader, Writer, + errors='strict'): + + """ Creates a StreamRecoder instance which implements a two-way + conversion: encode and decode work on the frontend (the + input to .read() and output of .write()) while + Reader and Writer work on the backend (reading and + writing to the stream). + + You can use these objects to do transparent direct + recodings from e.g. latin-1 to utf-8 and back. + + stream must be a file-like object. + + encode, decode must adhere to the Codec interface, Reader, + Writer must be factory functions or classes providing the + StreamReader, StreamWriter interface resp. + + encode and decode are needed for the frontend translation, + Reader and Writer for the backend translation. Unicode is + used as intermediate encoding. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.encode = encode + self.decode = decode + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + data = self.reader.read(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readline(self, size=None): + + if size is None: + data = self.reader.readline() + else: + data = self.reader.readline(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readlines(self, sizehint=None): + + if sizehint is None: + data = self.reader.read() + else: + data = self.reader.read(sizehint) + data, bytesencoded = self.encode(data, self.errors) + return data.splitlines(1) + + def write(self, data): + + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def writelines(self, list): + + data = ''.join(list) + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + +### Shortcuts + +def open(filename, mode='rb', encoding=None, errors='strict', buffering=1): + + """ Open an encoded file using the given mode and return + a wrapped version providing transparent encoding/decoding. + + Note: The wrapped version will only accept the object format + defined by the codecs, i.e. Unicode objects for most builtin + codecs. Output is also codec dependent and will usually by + Unicode as well. + + Files are always opened in binary mode, even if no binary mode + was specified. Thisis done to avoid data loss due to encodings + using 8-bit values. The default file mode is 'rb' meaning to + open the file in binary read mode. + + encoding specifies the encoding which is to be used for the + the file. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + buffering has the same meaning as for the builtin open() API. + It defaults to line buffered. + + The returned wrapped file object provides an extra attribute + .encoding which allows querying the used encoding. This + attribute is only available if an encoding was specified as + parameter. + + """ + if encoding is not None and \ + 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' + file = __builtin__.open(filename, mode, buffering) + if encoding is None: + return file + (e, d, sr, sw) = lookup(encoding) + srw = StreamReaderWriter(file, sr, sw, errors) + # Add attributes to simplify introspection + srw.encoding = encoding + return srw + +def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): + + """ Return a wrapped version of file which provides transparent + encoding translation. + + Strings written to the wrapped file are interpreted according + to the given data_encoding and then written to the original + file as string using file_encoding. The intermediate encoding + will usually be Unicode but depends on the specified codecs. + + Strings are read from the file using file_encoding and then + passed back to the caller as string using data_encoding. + + If file_encoding is not given, it defaults to data_encoding. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + The returned wrapped file object provides two extra attributes + .data_encoding and .file_encoding which reflect the given + parameters of the same name. The attributes can be used for + introspection by Python programs. + + """ + if file_encoding is None: + file_encoding = data_encoding + encode, decode = lookup(data_encoding)[:2] + Reader, Writer = lookup(file_encoding)[2:] + sr = StreamRecoder(file, + encode, decode, Reader, Writer, + errors) + # Add attributes to simplify introspection + sr.data_encoding = data_encoding + sr.file_encoding = file_encoding + return sr + +### Helpers for codec lookup + +def getencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its encoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding)[0] + +def getdecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its decoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding)[1] + +def getreader(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamReader class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding)[2] + +def getwriter(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamWriter class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding)[3] + +### Helpers for charmap-based codecs + +def make_identity_dict(rng): + + """ make_identity_dict(rng) -> dict + + Return a dictionary where elements of the rng sequence are + mapped to themselves. + + """ + res = {} + for i in rng: + res[i]=i + return res + +def make_encoding_map(decoding_map): + + """ Creates an encoding map from a decoding map. + + If a target mapping in the decoding map occurrs multiple + times, then that target is mapped to None (undefined mapping), + causing an exception when encountered by the charmap codec + during translation. + + One example where this happens is cp875.py which decodes + multiple character to \u001a. + + """ + m = {} + for k,v in decoding_map.items(): + if not m.has_key(v): + m[v] = k + else: + m[v] = None + return m + +# Tell modulefinder that using codecs probably needs the encodings +# package +_false = 0 +if _false: + import encodings + +### Tests + +if __name__ == '__main__': + + import sys + + # Make stdout translate Latin-1 output into UTF-8 output + sys.stdout = EncodedFile(sys.stdout, 'latin-1', 'utf-8') + + # Have stdin translate Latin-1 input into UTF-8 input + sys.stdin = EncodedFile(sys.stdin, 'utf-8', 'latin-1') diff --git a/lib-python/2.2/codeop.py b/lib-python/2.2/codeop.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/codeop.py @@ -0,0 +1,171 @@ +r"""Utilities to compile possibly incomplete Python source code. + +This module provides two interfaces, broadly similar to the builtin +function compile(), that take progam text, a filename and a 'mode' +and: + +- Return a code object if the command is complete and valid +- Return None if the command is incomplete +- Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + +Approach: + +First, check if the source consists entirely of blank lines and +comments; if so, replace it with 'pass', because the built-in +parser doesn't always do the right thing for these. + +Compile three times: as is, with \n, and with \n\n appended. If it +compiles as is, it's complete. If it compiles with one \n appended, +we expect more. If it doesn't compile either way, we compare the +error we get when compiling with \n or \n\n appended. If the errors +are the same, the code is broken. But if the errors are different, we +expect more. Not intuitive; not even guaranteed to hold in future +releases; but this matches the compiler's behavior from Python 1.4 +through 2.2, at least. + +Caveat: + +It is possible (but not likely) that the parser stops parsing with a +successful outcome before reaching the end of the source; in this +case, trailing symbols may be ignored instead of causing an error. +For example, a backslash followed by two newlines may be followed by +arbitrary garbage. This will be fixed once the API for the parser is +better. + +The two interfaces are: + +compile_command(source, filename, symbol): + + Compiles a single command in the manner described above. + +CommandCompiler(): + + Instances of this class have __call__ methods identical in + signature to compile_command; the difference is that if the + instance compiles program text containing a __future__ statement, + the instance 'remembers' and compiles all subsequent program texts + with the statement in force. + +The module also provides another class: + +Compile(): + + Instances of this class act like the built-in function compile, + but with 'memory' in the sense described above. +""" + +import __future__ + +_features = [getattr(__future__, fname) + for fname in __future__.all_feature_names] + +__all__ = ["compile_command", "Compile", "CommandCompiler"] + +def _maybe_compile(compiler, source, filename, symbol): + # Check for source consisting of only blank lines and comments + for line in source.split("\n"): + line = line.strip() + if line and line[0] != '#': + break # Leave it alone + else: + if symbol != "eval": + source = "pass" # Replace it with a 'pass' statement + + err = err1 = err2 = None + code = code1 = code2 = None + + try: + code = compiler(source, filename, symbol) + except SyntaxError, err: + pass + + try: + code1 = compiler(source + "\n", filename, symbol) + except SyntaxError, err1: + pass + + try: + code2 = compiler(source + "\n\n", filename, symbol) + except SyntaxError, err2: + pass + + if code: + return code + try: + e1 = err1.__dict__ + except AttributeError: + e1 = err1 + try: + e2 = err2.__dict__ + except AttributeError: + e2 = err2 + if not code1 and e1 == e2: + raise SyntaxError, err1 + +def compile_command(source, filename="", symbol="single"): + r"""Compile a command and determine whether it is incomplete. + + Arguments: + + source -- the source string; may contain \n characters + filename -- optional filename from which source was read; default + "" + symbol -- optional grammar start symbol; "single" (default) or "eval" + + Return value / exceptions raised: + + - Return a code object if the command is complete and valid + - Return None if the command is incomplete + - Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + """ + return _maybe_compile(compile, source, filename, symbol) + +class Compile: + """Instances of this class behave much like the built-in compile + function, but if one is used to compile text containing a future + statement, it "remembers" and compiles all subsequent program texts + with the statement in force.""" + def __init__(self): + self.flags = 0 + + def __call__(self, source, filename, symbol): + codeob = compile(source, filename, symbol, self.flags, 1) + for feature in _features: + if codeob.co_flags & feature.compiler_flag: + self.flags |= feature.compiler_flag + return codeob + +class CommandCompiler: + """Instances of this class have __call__ methods identical in + signature to compile_command; the difference is that if the + instance compiles program text containing a __future__ statement, + the instance 'remembers' and compiles all subsequent program texts + with the statement in force.""" + + def __init__(self,): + self.compiler = Compile() + + def __call__(self, source, filename="", symbol="single"): + r"""Compile a command and determine whether it is incomplete. + + Arguments: + + source -- the source string; may contain \n characters + filename -- optional filename from which source was read; + default "" + symbol -- optional grammar start symbol; "single" (default) or + "eval" + + Return value / exceptions raised: + + - Return a code object if the command is complete and valid + - Return None if the command is incomplete + - Raise SyntaxError, ValueError or OverflowError if the command is a + syntax error (OverflowError and ValueError can be produced by + malformed literals). + """ + return _maybe_compile(self.compiler, source, filename, symbol) diff --git a/lib-python/2.2/colorsys.py b/lib-python/2.2/colorsys.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/colorsys.py @@ -0,0 +1,123 @@ +"""Conversion functions between RGB and other color systems. + +This modules provides two functions for each color system ABC: + + rgb_to_abc(r, g, b) --> a, b, c + abc_to_rgb(a, b, c) --> r, g, b + +All inputs and outputs are triples of floats in the range [0.0...1.0]. +Inputs outside this range may cause exceptions or invalid outputs. + +Supported color systems: +RGB: Red, Green, Blue components +YIQ: used by composite video signals +HLS: Hue, Luminance, Saturation +HSV: Hue, Saturation, Value +""" +# References: +# XXX Where's the literature? + +__all__ = ["rgb_to_yiq","yiq_to_rgb","rgb_to_hls","hls_to_rgb", + "rgb_to_hsv","hsv_to_rgb"] + +# Some floating point constants + +ONE_THIRD = 1.0/3.0 +ONE_SIXTH = 1.0/6.0 +TWO_THIRD = 2.0/3.0 + + +# YIQ: used by composite video signals (linear combinations of RGB) +# Y: perceived grey level (0.0 == black, 1.0 == white) +# I, Q: color components + +def rgb_to_yiq(r, g, b): + y = 0.30*r + 0.59*g + 0.11*b + i = 0.60*r - 0.28*g - 0.32*b + q = 0.21*r - 0.52*g + 0.31*b + return (y, i, q) + +def yiq_to_rgb(y, i, q): + r = y + 0.948262*i + 0.624013*q + g = y - 0.276066*i - 0.639810*q + b = y - 1.105450*i + 1.729860*q + if r < 0.0: r = 0.0 + if g < 0.0: g = 0.0 + if b < 0.0: b = 0.0 + if r > 1.0: r = 1.0 + if g > 1.0: g = 1.0 + if b > 1.0: b = 1.0 + return (r, g, b) + + +# HLS: Hue, Luminance, S??? +# H: position in the spectrum +# L: ??? +# S: ??? + +def rgb_to_hls(r, g, b): + maxc = max(r, g, b) + minc = min(r, g, b) + # XXX Can optimize (maxc+minc) and (maxc-minc) + l = (minc+maxc)/2.0 + if minc == maxc: return 0.0, l, 0.0 + if l <= 0.5: s = (maxc-minc) / (maxc+minc) + else: s = (maxc-minc) / (2.0-maxc-minc) + rc = (maxc-r) / (maxc-minc) + gc = (maxc-g) / (maxc-minc) + bc = (maxc-b) / (maxc-minc) + if r == maxc: h = bc-gc + elif g == maxc: h = 2.0+rc-bc + else: h = 4.0+gc-rc + h = (h/6.0) % 1.0 + return h, l, s + +def hls_to_rgb(h, l, s): + if s == 0.0: return l, l, l + if l <= 0.5: m2 = l * (1.0+s) + else: m2 = l+s-(l*s) + m1 = 2.0*l - m2 + return (_v(m1, m2, h+ONE_THIRD), _v(m1, m2, h), _v(m1, m2, h-ONE_THIRD)) + +def _v(m1, m2, hue): + hue = hue % 1.0 + if hue < ONE_SIXTH: return m1 + (m2-m1)*hue*6.0 + if hue < 0.5: return m2 + if hue < TWO_THIRD: return m1 + (m2-m1)*(TWO_THIRD-hue)*6.0 + return m1 + + +# HSV: Hue, Saturation, Value(?) +# H: position in the spectrum +# S: ??? +# V: ??? + +def rgb_to_hsv(r, g, b): + maxc = max(r, g, b) + minc = min(r, g, b) + v = maxc + if minc == maxc: return 0.0, 0.0, v + s = (maxc-minc) / maxc + rc = (maxc-r) / (maxc-minc) + gc = (maxc-g) / (maxc-minc) + bc = (maxc-b) / (maxc-minc) + if r == maxc: h = bc-gc + elif g == maxc: h = 2.0+rc-bc + else: h = 4.0+gc-rc + h = (h/6.0) % 1.0 + return h, s, v + +def hsv_to_rgb(h, s, v): + if s == 0.0: return v, v, v + i = int(h*6.0) # XXX assume int() truncates! + f = (h*6.0) - i + p = v*(1.0 - s) + q = v*(1.0 - s*f) + t = v*(1.0 - s*(1.0-f)) + if i%6 == 0: return v, t, p + if i == 1: return q, v, p + if i == 2: return p, v, t + if i == 3: return p, q, v + if i == 4: return t, p, v + if i == 5: return v, p, q + # Cannot get here diff --git a/lib-python/2.2/commands.py b/lib-python/2.2/commands.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/commands.py @@ -0,0 +1,84 @@ +"""Execute shell commands via os.popen() and return status, output. + +Interface summary: + + import commands + + outtext = commands.getoutput(cmd) + (exitstatus, outtext) = commands.getstatusoutput(cmd) + outtext = commands.getstatus(file) # returns output of "ls -ld file" + +A trailing newline is removed from the output string. + +Encapsulates the basic operation: + + pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') + text = pipe.read() + sts = pipe.close() + + [Note: it would be nice to add functions to interpret the exit status.] +""" + +__all__ = ["getstatusoutput","getoutput","getstatus"] + +# Module 'commands' +# +# Various tools for executing commands and looking at their output and status. +# +# NB This only works (and is only relevant) for UNIX. + + +# Get 'ls -l' status for an object into a string +# +def getstatus(file): + """Return output of "ls -ld " in a string.""" + return getoutput('ls -ld' + mkarg(file)) + + +# Get the output from a shell command into a string. +# The exit status is ignored; a trailing newline is stripped. +# Assume the command will work with '{ ... ; } 2>&1' around it.. +# +def getoutput(cmd): + """Return output (stdout or stderr) of executing cmd in a shell.""" + return getstatusoutput(cmd)[1] + + +# Ditto but preserving the exit status. +# Returns a pair (sts, output) +# +def getstatusoutput(cmd): + """Return (status, output) of executing cmd in a shell.""" + import os + pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') + text = pipe.read() + sts = pipe.close() + if sts is None: sts = 0 + if text[-1:] == '\n': text = text[:-1] + return sts, text + + +# Make command argument from directory and pathname (prefix space, add quotes). +# +def mk2arg(head, x): + import os + return mkarg(os.path.join(head, x)) + + +# Make a shell command argument from a string. +# Return a string beginning with a space followed by a shell-quoted +# version of the argument. +# Two strategies: enclose in single quotes if it contains none; +# otherwise, enclose in double quotes and prefix quotable characters +# with backslash. +# +def mkarg(x): + if '\'' not in x: + return ' \'' + x + '\'' + s = ' "' + for c in x: + if c in '\\$"`': + s = s + '\\' + s = s + c + s = s + '"' + return s diff --git a/lib-python/2.2/compileall.py b/lib-python/2.2/compileall.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compileall.py @@ -0,0 +1,148 @@ +"""Module/script to "compile" all .py files to .pyc (or .pyo) file. + +When called as a script with arguments, this compiles the directories +given as arguments recursively; the -l option prevents it from +recursing into directories. + +Without arguments, if compiles all modules on sys.path, without +recursing into subdirectories. (Even though it should do so for +packages -- for now, you'll have to deal with packages separately.) + +See module py_compile for details of the actual byte-compilation. + +""" + +import os +import stat +import sys +import py_compile + +__all__ = ["compile_dir","compile_path"] + +def compile_dir(dir, maxlevels=10, ddir=None, force=0, rx=None): + """Byte-compile all modules in the given directory tree. + + Arguments (only dir is required): + + dir: the directory to byte-compile + maxlevels: maximum recursion level (default 10) + ddir: if given, purported directory name (this is the + directory name that will show up in error messages) + force: if 1, force compilation, even if timestamps are up-to-date + + """ + print 'Listing', dir, '...' + try: + names = os.listdir(dir) + except os.error: + print "Can't list", dir + names = [] + names.sort() + success = 1 + for name in names: + fullname = os.path.join(dir, name) + if ddir: + dfile = os.path.join(ddir, name) + else: + dfile = None + if rx: + mo = rx.search(fullname) + if mo: + continue + if os.path.isfile(fullname): + head, tail = name[:-3], name[-3:] + if tail == '.py': + cfile = fullname + (__debug__ and 'c' or 'o') + ftime = os.stat(fullname)[stat.ST_MTIME] + try: ctime = os.stat(cfile)[stat.ST_MTIME] + except os.error: ctime = 0 + if (ctime > ftime) and not force: continue + print 'Compiling', fullname, '...' + try: + ok = py_compile.compile(fullname, None, dfile) + except KeyboardInterrupt: + raise KeyboardInterrupt + except: + # XXX py_compile catches SyntaxErrors + if type(sys.exc_type) == type(''): + exc_type_name = sys.exc_type + else: exc_type_name = sys.exc_type.__name__ + print 'Sorry:', exc_type_name + ':', + print sys.exc_value + success = 0 + else: + if ok == 0: + success = 0 + elif maxlevels > 0 and \ + name != os.curdir and name != os.pardir and \ + os.path.isdir(fullname) and \ + not os.path.islink(fullname): + if not compile_dir(fullname, maxlevels - 1, dfile, force, rx): + success = 0 + return success + +def compile_path(skip_curdir=1, maxlevels=0, force=0): + """Byte-compile all module on sys.path. + + Arguments (all optional): + + skip_curdir: if true, skip current directory (default true) + maxlevels: max recursion level (default 0) + force: as for compile_dir() (default 0) + + """ + success = 1 + for dir in sys.path: + if (not dir or dir == os.curdir) and skip_curdir: + print 'Skipping current directory' + else: + success = success and compile_dir(dir, maxlevels, None, force) + return success + +def main(): + """Script main program.""" + import getopt + try: + opts, args = getopt.getopt(sys.argv[1:], 'lfd:x:') + except getopt.error, msg: + print msg + print "usage: python compileall.py [-l] [-f] [-d destdir] " \ + "[-s regexp] [directory ...]" + print "-l: don't recurse down" + print "-f: force rebuild even if timestamps are up-to-date" + print "-d destdir: purported directory name for error messages" + print " if no directory arguments, -l sys.path is assumed" + print "-x regexp: skip files matching the regular expression regexp" + print " the regexp is search for in the full path of the file" + sys.exit(2) + maxlevels = 10 + ddir = None + force = 0 + rx = None + for o, a in opts: + if o == '-l': maxlevels = 0 + if o == '-d': ddir = a + if o == '-f': force = 1 + if o == '-x': + import re + rx = re.compile(a) + if ddir: + if len(args) != 1: + print "-d destdir require exactly one directory argument" + sys.exit(2) + success = 1 + try: + if args: + for dir in args: + if not compile_dir(dir, maxlevels, ddir, force, rx): + success = 0 + else: + success = compile_path() + except KeyboardInterrupt: + print "\n[interrupt]" + success = 0 + return success + +if __name__ == '__main__': + exit_status = not main() + sys.exit(exit_status) diff --git a/lib-python/2.2/compiler/__init__.py b/lib-python/2.2/compiler/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/__init__.py @@ -0,0 +1,26 @@ +"""Package for parsing and compiling Python source code + +There are several functions defined at the top level that are imported +from modules contained in the package. + +parse(buf, mode="exec") -> AST + Converts a string containing Python source code to an abstract + syntax tree (AST). The AST is defined in compiler.ast. + +parseFile(path) -> AST + The same as parse(open(path)) + +walk(ast, visitor, verbose=None) + Does a pre-order walk over the ast using the visitor instance. + See compiler.visitor for details. + +compile(source, filename, mode, flags=None, dont_inherit=None) + Returns a code object. A replacement for the builtin compile() function. + +compileFile(filename) + Generates a .pyc file by compiling filename. +""" + +from transformer import parse, parseFile +from visitor import walk +from pycodegen import compile, compileFile diff --git a/lib-python/2.2/compiler/ast.py b/lib-python/2.2/compiler/ast.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/ast.py @@ -0,0 +1,1241 @@ +"""Python abstract syntax node definitions + +This file is automatically generated. +""" +from types import TupleType, ListType +from consts import CO_VARARGS, CO_VARKEYWORDS + +def flatten(list): + l = [] + for elt in list: + t = type(elt) + if t is TupleType or t is ListType: + for elt2 in flatten(elt): + l.append(elt2) + else: + l.append(elt) + return l + +def flatten_nodes(list): + return [n for n in flatten(list) if isinstance(n, Node)] + +def asList(nodes): + l = [] + for item in nodes: + if hasattr(item, "asList"): + l.append(item.asList()) + else: + t = type(item) + if t is TupleType or t is ListType: + l.append(tuple(asList(item))) + else: + l.append(item) + return l + +nodes = {} + +class Node: # an abstract base class + lineno = None # provide a lineno for nodes that don't have one + def getType(self): + pass # implemented by subclass + def getChildren(self): + pass # implemented by subclasses + def asList(self): + return tuple(asList(self.getChildren())) + def getChildNodes(self): + pass # implemented by subclasses + +class EmptyNode(Node): + pass + +class Slice(Node): + nodes["slice"] = "Slice" + def __init__(self, expr, flags, lower, upper): + self.expr = expr + self.flags = flags + self.lower = lower + self.upper = upper + + def getChildren(self): + children = [] + children.append(self.expr) + children.append(self.flags) + children.append(self.lower) + children.append(self.upper) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.expr) + if self.lower is not None: nodes.append(self.lower) + if self.upper is not None: nodes.append(self.upper) + return tuple(nodes) + + def __repr__(self): + return "Slice(%s, %s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.lower), repr(self.upper)) + +class Const(Node): + nodes["const"] = "Const" + def __init__(self, value): + self.value = value + + def getChildren(self): + return self.value, + + def getChildNodes(self): + return () + + def __repr__(self): + return "Const(%s)" % (repr(self.value),) + +class Raise(Node): + nodes["raise"] = "Raise" + def __init__(self, expr1, expr2, expr3): + self.expr1 = expr1 + self.expr2 = expr2 + self.expr3 = expr3 + + def getChildren(self): + children = [] + children.append(self.expr1) + children.append(self.expr2) + children.append(self.expr3) + return tuple(children) + + def getChildNodes(self): + nodes = [] + if self.expr1 is not None: nodes.append(self.expr1) + if self.expr2 is not None: nodes.append(self.expr2) + if self.expr3 is not None: nodes.append(self.expr3) + return tuple(nodes) + + def __repr__(self): + return "Raise(%s, %s, %s)" % (repr(self.expr1), repr(self.expr2), repr(self.expr3)) + +class For(Node): + nodes["for"] = "For" + def __init__(self, assign, list, body, else_): + self.assign = assign + self.list = list + self.body = body + self.else_ = else_ + + def getChildren(self): + children = [] + children.append(self.assign) + children.append(self.list) + children.append(self.body) + children.append(self.else_) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.assign) + nodes.append(self.list) + nodes.append(self.body) + if self.else_ is not None: nodes.append(self.else_) + return tuple(nodes) + + def __repr__(self): + return "For(%s, %s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.body), repr(self.else_)) + +class AssTuple(Node): + nodes["asstuple"] = "AssTuple" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "AssTuple(%s)" % (repr(self.nodes),) + +class Mul(Node): + nodes["mul"] = "Mul" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Mul((%s, %s))" % (repr(self.left), repr(self.right)) + +class Invert(Node): + nodes["invert"] = "Invert" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Invert(%s)" % (repr(self.expr),) + +class RightShift(Node): + nodes["rightshift"] = "RightShift" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "RightShift((%s, %s))" % (repr(self.left), repr(self.right)) + +class AssList(Node): + nodes["asslist"] = "AssList" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "AssList(%s)" % (repr(self.nodes),) + +class From(Node): + nodes["from"] = "From" + def __init__(self, modname, names): + self.modname = modname + self.names = names + + def getChildren(self): + return self.modname, self.names + + def getChildNodes(self): + return () + + def __repr__(self): + return "From(%s, %s)" % (repr(self.modname), repr(self.names)) + +class Getattr(Node): + nodes["getattr"] = "Getattr" + def __init__(self, expr, attrname): + self.expr = expr + self.attrname = attrname + + def getChildren(self): + return self.expr, self.attrname + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Getattr(%s, %s)" % (repr(self.expr), repr(self.attrname)) + +class Dict(Node): + nodes["dict"] = "Dict" + def __init__(self, items): + self.items = items + + def getChildren(self): + children = [] + children.extend(flatten(self.items)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.items)) + return tuple(nodes) + + def __repr__(self): + return "Dict(%s)" % (repr(self.items),) + +class Module(Node): + nodes["module"] = "Module" + def __init__(self, doc, node): + self.doc = doc + self.node = node + + def getChildren(self): + return self.doc, self.node + + def getChildNodes(self): + return self.node, + + def __repr__(self): + return "Module(%s, %s)" % (repr(self.doc), repr(self.node)) + +class Expression(Node): + # Expression is an artifical node class to support "eval" + nodes["expression"] = "Expression" + def __init__(self, node): + self.node = node + + def getChildren(self): + return self.node, + + def getChildNodes(self): + return self.node, + + def __repr__(self): + return "Expression(%s)" % (repr(self.node)) + +class UnaryAdd(Node): + nodes["unaryadd"] = "UnaryAdd" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "UnaryAdd(%s)" % (repr(self.expr),) + +class Ellipsis(Node): + nodes["ellipsis"] = "Ellipsis" + def __init__(self, ): + pass + + def getChildren(self): + return () + + def getChildNodes(self): + return () + + def __repr__(self): + return "Ellipsis()" + +class Print(Node): + nodes["print"] = "Print" + def __init__(self, nodes, dest): + self.nodes = nodes + self.dest = dest + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + children.append(self.dest) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + if self.dest is not None: nodes.append(self.dest) + return tuple(nodes) + + def __repr__(self): + return "Print(%s, %s)" % (repr(self.nodes), repr(self.dest)) + +class Import(Node): + nodes["import"] = "Import" + def __init__(self, names): + self.names = names + + def getChildren(self): + return self.names, + + def getChildNodes(self): + return () + + def __repr__(self): + return "Import(%s)" % (repr(self.names),) + +class Subscript(Node): + nodes["subscript"] = "Subscript" + def __init__(self, expr, flags, subs): + self.expr = expr + self.flags = flags + self.subs = subs + + def getChildren(self): + children = [] + children.append(self.expr) + children.append(self.flags) + children.extend(flatten(self.subs)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.expr) + nodes.extend(flatten_nodes(self.subs)) + return tuple(nodes) + + def __repr__(self): + return "Subscript(%s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.subs)) + +class TryExcept(Node): + nodes["tryexcept"] = "TryExcept" + def __init__(self, body, handlers, else_): + self.body = body + self.handlers = handlers + self.else_ = else_ + + def getChildren(self): + children = [] + children.append(self.body) + children.extend(flatten(self.handlers)) + children.append(self.else_) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.body) + nodes.extend(flatten_nodes(self.handlers)) + if self.else_ is not None: nodes.append(self.else_) + return tuple(nodes) + + def __repr__(self): + return "TryExcept(%s, %s, %s)" % (repr(self.body), repr(self.handlers), repr(self.else_)) + +class Or(Node): + nodes["or"] = "Or" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Or(%s)" % (repr(self.nodes),) + +class Name(Node): + nodes["name"] = "Name" + def __init__(self, name): + self.name = name + + def getChildren(self): + return self.name, + + def getChildNodes(self): + return () + + def __repr__(self): + return "Name(%s)" % (repr(self.name),) + +class Function(Node): + nodes["function"] = "Function" + def __init__(self, name, argnames, defaults, flags, doc, code): + self.name = name + self.argnames = argnames + self.defaults = defaults + self.flags = flags + self.doc = doc + self.code = code + self.varargs = self.kwargs = None + if flags & CO_VARARGS: + self.varargs = 1 + if flags & CO_VARKEYWORDS: + self.kwargs = 1 + + + + def getChildren(self): + children = [] + children.append(self.name) + children.append(self.argnames) + children.extend(flatten(self.defaults)) + children.append(self.flags) + children.append(self.doc) + children.append(self.code) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.defaults)) + nodes.append(self.code) + return tuple(nodes) + + def __repr__(self): + return "Function(%s, %s, %s, %s, %s, %s)" % (repr(self.name), repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.doc), repr(self.code)) + +class Assert(Node): + nodes["assert"] = "Assert" + def __init__(self, test, fail): + self.test = test + self.fail = fail + + def getChildren(self): + children = [] + children.append(self.test) + children.append(self.fail) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.test) + if self.fail is not None: nodes.append(self.fail) + return tuple(nodes) + + def __repr__(self): + return "Assert(%s, %s)" % (repr(self.test), repr(self.fail)) + +class Return(Node): + nodes["return"] = "Return" + def __init__(self, value): + self.value = value + + def getChildren(self): + return self.value, + + def getChildNodes(self): + return self.value, + + def __repr__(self): + return "Return(%s)" % (repr(self.value),) + +class Power(Node): + nodes["power"] = "Power" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Power((%s, %s))" % (repr(self.left), repr(self.right)) + +class Exec(Node): + nodes["exec"] = "Exec" + def __init__(self, expr, locals, globals): + self.expr = expr + self.locals = locals + self.globals = globals + + def getChildren(self): + children = [] + children.append(self.expr) + children.append(self.locals) + children.append(self.globals) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.expr) + if self.locals is not None: nodes.append(self.locals) + if self.globals is not None: nodes.append(self.globals) + return tuple(nodes) + + def __repr__(self): + return "Exec(%s, %s, %s)" % (repr(self.expr), repr(self.locals), repr(self.globals)) + +class Stmt(Node): + nodes["stmt"] = "Stmt" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Stmt(%s)" % (repr(self.nodes),) + +class Sliceobj(Node): + nodes["sliceobj"] = "Sliceobj" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Sliceobj(%s)" % (repr(self.nodes),) + +class Break(Node): + nodes["break"] = "Break" + def __init__(self, ): + pass + + def getChildren(self): + return () + + def getChildNodes(self): + return () + + def __repr__(self): + return "Break()" + +class Bitand(Node): + nodes["bitand"] = "Bitand" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Bitand(%s)" % (repr(self.nodes),) + +class FloorDiv(Node): + nodes["floordiv"] = "FloorDiv" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "FloorDiv((%s, %s))" % (repr(self.left), repr(self.right)) + +class TryFinally(Node): + nodes["tryfinally"] = "TryFinally" + def __init__(self, body, final): + self.body = body + self.final = final + + def getChildren(self): + return self.body, self.final + + def getChildNodes(self): + return self.body, self.final + + def __repr__(self): + return "TryFinally(%s, %s)" % (repr(self.body), repr(self.final)) + +class Not(Node): + nodes["not"] = "Not" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Not(%s)" % (repr(self.expr),) + +class Class(Node): + nodes["class"] = "Class" + def __init__(self, name, bases, doc, code): + self.name = name + self.bases = bases + self.doc = doc + self.code = code + + def getChildren(self): + children = [] + children.append(self.name) + children.extend(flatten(self.bases)) + children.append(self.doc) + children.append(self.code) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.bases)) + nodes.append(self.code) + return tuple(nodes) + + def __repr__(self): + return "Class(%s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code)) + +class Mod(Node): + nodes["mod"] = "Mod" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Mod((%s, %s))" % (repr(self.left), repr(self.right)) + +class Printnl(Node): + nodes["printnl"] = "Printnl" + def __init__(self, nodes, dest): + self.nodes = nodes + self.dest = dest + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + children.append(self.dest) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + if self.dest is not None: nodes.append(self.dest) + return tuple(nodes) + + def __repr__(self): + return "Printnl(%s, %s)" % (repr(self.nodes), repr(self.dest)) + +class Tuple(Node): + nodes["tuple"] = "Tuple" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Tuple(%s)" % (repr(self.nodes),) + +class AssAttr(Node): + nodes["assattr"] = "AssAttr" + def __init__(self, expr, attrname, flags): + self.expr = expr + self.attrname = attrname + self.flags = flags + + def getChildren(self): + return self.expr, self.attrname, self.flags + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "AssAttr(%s, %s, %s)" % (repr(self.expr), repr(self.attrname), repr(self.flags)) + +class Keyword(Node): + nodes["keyword"] = "Keyword" + def __init__(self, name, expr): + self.name = name + self.expr = expr + + def getChildren(self): + return self.name, self.expr + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Keyword(%s, %s)" % (repr(self.name), repr(self.expr)) + +class AugAssign(Node): + nodes["augassign"] = "AugAssign" + def __init__(self, node, op, expr): + self.node = node + self.op = op + self.expr = expr + + def getChildren(self): + return self.node, self.op, self.expr + + def getChildNodes(self): + return self.node, self.expr + + def __repr__(self): + return "AugAssign(%s, %s, %s)" % (repr(self.node), repr(self.op), repr(self.expr)) + +class List(Node): + nodes["list"] = "List" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "List(%s)" % (repr(self.nodes),) + +class Yield(Node): + nodes["yield"] = "Yield" + def __init__(self, value): + self.value = value + + def getChildren(self): + return self.value, + + def getChildNodes(self): + return self.value, + + def __repr__(self): + return "Yield(%s)" % (repr(self.value),) + +class LeftShift(Node): + nodes["leftshift"] = "LeftShift" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "LeftShift((%s, %s))" % (repr(self.left), repr(self.right)) + +class AssName(Node): + nodes["assname"] = "AssName" + def __init__(self, name, flags): + self.name = name + self.flags = flags + + def getChildren(self): + return self.name, self.flags + + def getChildNodes(self): + return () + + def __repr__(self): + return "AssName(%s, %s)" % (repr(self.name), repr(self.flags)) + +class While(Node): + nodes["while"] = "While" + def __init__(self, test, body, else_): + self.test = test + self.body = body + self.else_ = else_ + + def getChildren(self): + children = [] + children.append(self.test) + children.append(self.body) + children.append(self.else_) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.test) + nodes.append(self.body) + if self.else_ is not None: nodes.append(self.else_) + return tuple(nodes) + + def __repr__(self): + return "While(%s, %s, %s)" % (repr(self.test), repr(self.body), repr(self.else_)) + +class Continue(Node): + nodes["continue"] = "Continue" + def __init__(self, ): + pass + + def getChildren(self): + return () + + def getChildNodes(self): + return () + + def __repr__(self): + return "Continue()" + +class Backquote(Node): + nodes["backquote"] = "Backquote" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Backquote(%s)" % (repr(self.expr),) + +class Discard(Node): + nodes["discard"] = "Discard" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "Discard(%s)" % (repr(self.expr),) + +class Div(Node): + nodes["div"] = "Div" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Div((%s, %s))" % (repr(self.left), repr(self.right)) + +class Assign(Node): + nodes["assign"] = "Assign" + def __init__(self, nodes, expr): + self.nodes = nodes + self.expr = expr + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + children.append(self.expr) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + nodes.append(self.expr) + return tuple(nodes) + + def __repr__(self): + return "Assign(%s, %s)" % (repr(self.nodes), repr(self.expr)) + +class Lambda(Node): + nodes["lambda"] = "Lambda" + def __init__(self, argnames, defaults, flags, code): + self.argnames = argnames + self.defaults = defaults + self.flags = flags + self.code = code + self.varargs = self.kwargs = None + if flags & CO_VARARGS: + self.varargs = 1 + if flags & CO_VARKEYWORDS: + self.kwargs = 1 + + + def getChildren(self): + children = [] + children.append(self.argnames) + children.extend(flatten(self.defaults)) + children.append(self.flags) + children.append(self.code) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.defaults)) + nodes.append(self.code) + return tuple(nodes) + + def __repr__(self): + return "Lambda(%s, %s, %s, %s)" % (repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.code)) + +class And(Node): + nodes["and"] = "And" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "And(%s)" % (repr(self.nodes),) + +class Compare(Node): + nodes["compare"] = "Compare" + def __init__(self, expr, ops): + self.expr = expr + self.ops = ops + + def getChildren(self): + children = [] + children.append(self.expr) + children.extend(flatten(self.ops)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.expr) + nodes.extend(flatten_nodes(self.ops)) + return tuple(nodes) + + def __repr__(self): + return "Compare(%s, %s)" % (repr(self.expr), repr(self.ops)) + +class Bitor(Node): + nodes["bitor"] = "Bitor" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Bitor(%s)" % (repr(self.nodes),) + +class Bitxor(Node): + nodes["bitxor"] = "Bitxor" + def __init__(self, nodes): + self.nodes = nodes + + def getChildren(self): + children = [] + children.extend(flatten(self.nodes)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.nodes)) + return tuple(nodes) + + def __repr__(self): + return "Bitxor(%s)" % (repr(self.nodes),) + +class CallFunc(Node): + nodes["callfunc"] = "CallFunc" + def __init__(self, node, args, star_args = None, dstar_args = None): + self.node = node + self.args = args + self.star_args = star_args + self.dstar_args = dstar_args + + def getChildren(self): + children = [] + children.append(self.node) + children.extend(flatten(self.args)) + children.append(self.star_args) + children.append(self.dstar_args) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.node) + nodes.extend(flatten_nodes(self.args)) + if self.star_args is not None: nodes.append(self.star_args) + if self.dstar_args is not None: nodes.append(self.dstar_args) + return tuple(nodes) + + def __repr__(self): + return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args)) + +class Global(Node): + nodes["global"] = "Global" + def __init__(self, names): + self.names = names + + def getChildren(self): + return self.names, + + def getChildNodes(self): + return () + + def __repr__(self): + return "Global(%s)" % (repr(self.names),) + +class Add(Node): + nodes["add"] = "Add" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Add((%s, %s))" % (repr(self.left), repr(self.right)) + +class ListCompIf(Node): + nodes["listcompif"] = "ListCompIf" + def __init__(self, test): + self.test = test + + def getChildren(self): + return self.test, + + def getChildNodes(self): + return self.test, + + def __repr__(self): + return "ListCompIf(%s)" % (repr(self.test),) + +class Sub(Node): + nodes["sub"] = "Sub" + def __init__(self, (left, right)): + self.left = left + self.right = right + + def getChildren(self): + return self.left, self.right + + def getChildNodes(self): + return self.left, self.right + + def __repr__(self): + return "Sub((%s, %s))" % (repr(self.left), repr(self.right)) + +class Pass(Node): + nodes["pass"] = "Pass" + def __init__(self, ): + pass + + def getChildren(self): + return () + + def getChildNodes(self): + return () + + def __repr__(self): + return "Pass()" + +class UnarySub(Node): + nodes["unarysub"] = "UnarySub" + def __init__(self, expr): + self.expr = expr + + def getChildren(self): + return self.expr, + + def getChildNodes(self): + return self.expr, + + def __repr__(self): + return "UnarySub(%s)" % (repr(self.expr),) + +class If(Node): + nodes["if"] = "If" + def __init__(self, tests, else_): + self.tests = tests + self.else_ = else_ + + def getChildren(self): + children = [] + children.extend(flatten(self.tests)) + children.append(self.else_) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.extend(flatten_nodes(self.tests)) + if self.else_ is not None: nodes.append(self.else_) + return tuple(nodes) + + def __repr__(self): + return "If(%s, %s)" % (repr(self.tests), repr(self.else_)) + +class ListComp(Node): + nodes["listcomp"] = "ListComp" + def __init__(self, expr, quals): + self.expr = expr + self.quals = quals + + def getChildren(self): + children = [] + children.append(self.expr) + children.extend(flatten(self.quals)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.expr) + nodes.extend(flatten_nodes(self.quals)) + return tuple(nodes) + + def __repr__(self): + return "ListComp(%s, %s)" % (repr(self.expr), repr(self.quals)) + +class ListCompFor(Node): + nodes["listcompfor"] = "ListCompFor" + def __init__(self, assign, list, ifs): + self.assign = assign + self.list = list + self.ifs = ifs + + def getChildren(self): + children = [] + children.append(self.assign) + children.append(self.list) + children.extend(flatten(self.ifs)) + return tuple(children) + + def getChildNodes(self): + nodes = [] + nodes.append(self.assign) + nodes.append(self.list) + nodes.extend(flatten_nodes(self.ifs)) + return tuple(nodes) + + def __repr__(self): + return "ListCompFor(%s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.ifs)) + +klasses = globals() +for k in nodes.keys(): + nodes[k] = klasses[nodes[k]] diff --git a/lib-python/2.2/compiler/consts.py b/lib-python/2.2/compiler/consts.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/consts.py @@ -0,0 +1,19 @@ +# operation flags +OP_ASSIGN = 'OP_ASSIGN' +OP_DELETE = 'OP_DELETE' +OP_APPLY = 'OP_APPLY' + +SC_LOCAL = 1 +SC_GLOBAL = 2 +SC_FREE = 3 +SC_CELL = 4 +SC_UNKNOWN = 5 + +CO_OPTIMIZED = 0x0001 +CO_NEWLOCALS = 0x0002 +CO_VARARGS = 0x0004 +CO_VARKEYWORDS = 0x0008 +CO_NESTED = 0x0010 +CO_GENERATOR = 0x0020 +CO_GENERATOR_ALLOWED = 0x1000 +CO_FUTURE_DIVISION = 0x2000 diff --git a/lib-python/2.2/compiler/future.py b/lib-python/2.2/compiler/future.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/future.py @@ -0,0 +1,72 @@ +"""Parser for future statements + +""" + +from compiler import ast, walk + +def is_future(stmt): + """Return true if statement is a well-formed future statement""" + if not isinstance(stmt, ast.From): + return 0 + if stmt.modname == "__future__": + return 1 + else: + return 0 + +class FutureParser: + + features = ("nested_scopes", "generators", "division") + + def __init__(self): + self.found = {} # set + + def visitModule(self, node): + stmt = node.node + for s in stmt.nodes: + if not self.check_stmt(s): + break + + def check_stmt(self, stmt): + if is_future(stmt): + for name, asname in stmt.names: + if name in self.features: + self.found[name] = 1 + else: + raise SyntaxError, \ + "future feature %s is not defined" % name + stmt.valid_future = 1 + return 1 + return 0 + + def get_features(self): + """Return list of features enabled by future statements""" + return self.found.keys() + +class BadFutureParser: + """Check for invalid future statements""" + + def visitFrom(self, node): + if hasattr(node, 'valid_future'): + return + if node.modname != "__future__": + return + raise SyntaxError, "invalid future statement" + +def find_futures(node): + p1 = FutureParser() + p2 = BadFutureParser() + walk(node, p1) + walk(node, p2) + return p1.get_features() + +if __name__ == "__main__": + import sys + from compiler import parseFile, walk + + for file in sys.argv[1:]: + print file + tree = parseFile(file) + v = FutureParser() + walk(tree, v) + print v.found + print diff --git a/lib-python/2.2/compiler/misc.py b/lib-python/2.2/compiler/misc.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/misc.py @@ -0,0 +1,74 @@ +import types + +def flatten(tup): + elts = [] + for elt in tup: + if type(elt) == types.TupleType: + elts = elts + flatten(elt) + else: + elts.append(elt) + return elts + +class Set: + def __init__(self): + self.elts = {} + def __len__(self): + return len(self.elts) + def __contains__(self, elt): + return self.elts.has_key(elt) + def add(self, elt): + self.elts[elt] = elt + def elements(self): + return self.elts.keys() + def has_elt(self, elt): + return self.elts.has_key(elt) + def remove(self, elt): + del self.elts[elt] + def copy(self): + c = Set() + c.elts.update(self.elts) + return c + +class Stack: + def __init__(self): + self.stack = [] + self.pop = self.stack.pop + def __len__(self): + return len(self.stack) + def push(self, elt): + self.stack.append(elt) + def top(self): + return self.stack[-1] + def __getitem__(self, index): # needed by visitContinue() + return self.stack[index] + +MANGLE_LEN = 256 # magic constant from compile.c + +def mangle(name, klass): + if not name.startswith('__'): + return name + if len(name) + 2 >= MANGLE_LEN: + return name + if name.endswith('__'): + return name + try: + i = 0 + while klass[i] == '_': + i = i + 1 + except IndexError: + return name + klass = klass[i:] + + tlen = len(klass) + len(name) + if tlen > MANGLE_LEN: + klass = klass[:MANGLE_LEN-tlen] + + return "_%s%s" % (klass, name) + +def set_filename(filename, tree): + """Set the filename attribute to filename on every node in tree""" + worklist = [tree] + while worklist: + node = worklist.pop(0) + node.filename = filename + worklist.extend(node.getChildNodes()) diff --git a/lib-python/2.2/compiler/pyassem.py b/lib-python/2.2/compiler/pyassem.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/pyassem.py @@ -0,0 +1,824 @@ +"""A flow graph representation for Python bytecode""" + +import dis +import new +import string +import sys +import types + +from compiler import misc +from compiler.consts import CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, \ + CO_VARKEYWORDS + +def xxx_sort(l): + l = l[:] + def sorter(a, b): + return cmp(a.bid, b.bid) + l.sort(sorter) + return l + +class FlowGraph: + def __init__(self): + self.current = self.entry = Block() + self.exit = Block("exit") + self.blocks = misc.Set() + self.blocks.add(self.entry) + self.blocks.add(self.exit) + + def startBlock(self, block): + if self._debug: + if self.current: + print "end", repr(self.current) + print " next", self.current.next + print " ", self.current.get_children() + print repr(block) + self.current = block + + def nextBlock(self, block=None): + # XXX think we need to specify when there is implicit transfer + # from one block to the next. might be better to represent this + # with explicit JUMP_ABSOLUTE instructions that are optimized + # out when they are unnecessary. + # + # I think this strategy works: each block has a child + # designated as "next" which is returned as the last of the + # children. because the nodes in a graph are emitted in + # reverse post order, the "next" block will always be emitted + # immediately after its parent. + # Worry: maintaining this invariant could be tricky + if block is None: + block = self.newBlock() + + # Note: If the current block ends with an unconditional + # control transfer, then it is incorrect to add an implicit + # transfer to the block graph. The current code requires + # these edges to get the blocks emitted in the right order, + # however. :-( If a client needs to remove these edges, call + # pruneEdges(). + + self.current.addNext(block) + self.startBlock(block) + + def newBlock(self): + b = Block() + self.blocks.add(b) + return b + + def startExitBlock(self): + self.startBlock(self.exit) + + _debug = 0 + + def _enable_debug(self): + self._debug = 1 + + def _disable_debug(self): + self._debug = 0 + + def emit(self, *inst): + if self._debug: + print "\t", inst + if inst[0] == 'RETURN_VALUE': + self.current.addOutEdge(self.exit) + if len(inst) == 2 and isinstance(inst[1], Block): + self.current.addOutEdge(inst[1]) + self.current.emit(inst) + + def getBlocksInOrder(self): + """Return the blocks in reverse postorder + + i.e. each node appears before all of its successors + """ + # XXX make sure every node that doesn't have an explicit next + # is set so that next points to exit + for b in self.blocks.elements(): + if b is self.exit: + continue + if not b.next: + b.addNext(self.exit) + order = dfs_postorder(self.entry, {}) + order.reverse() + self.fixupOrder(order, self.exit) + # hack alert + if not self.exit in order: + order.append(self.exit) + + return order + + def fixupOrder(self, blocks, default_next): + """Fixup bad order introduced by DFS.""" + + # XXX This is a total mess. There must be a better way to get + # the code blocks in the right order. + + self.fixupOrderHonorNext(blocks, default_next) + self.fixupOrderForward(blocks, default_next) + + def fixupOrderHonorNext(self, blocks, default_next): + """Fix one problem with DFS. + + The DFS uses child block, but doesn't know about the special + "next" block. As a result, the DFS can order blocks so that a + block isn't next to the right block for implicit control + transfers. + """ + index = {} + for i in range(len(blocks)): + index[blocks[i]] = i + + for i in range(0, len(blocks) - 1): + b = blocks[i] + n = blocks[i + 1] + if not b.next or b.next[0] == default_next or b.next[0] == n: + continue + # The blocks are in the wrong order. Find the chain of + # blocks to insert where they belong. + cur = b + chain = [] + elt = cur + while elt.next and elt.next[0] != default_next: + chain.append(elt.next[0]) + elt = elt.next[0] + # Now remove the blocks in the chain from the current + # block list, so that they can be re-inserted. + l = [] + for b in chain: + assert index[b] > i + l.append((index[b], b)) + l.sort() + l.reverse() + for j, b in l: + del blocks[index[b]] + # Insert the chain in the proper location + blocks[i:i + 1] = [cur] + chain + # Finally, re-compute the block indexes + for i in range(len(blocks)): + index[blocks[i]] = i + + def fixupOrderForward(self, blocks, default_next): + """Make sure all JUMP_FORWARDs jump forward""" + index = {} + chains = [] + cur = [] + for b in blocks: + index[b] = len(chains) + cur.append(b) + if b.next and b.next[0] == default_next: + chains.append(cur) + cur = [] + chains.append(cur) + + while 1: + constraints = [] + + for i in range(len(chains)): + l = chains[i] + for b in l: + for c in b.get_children(): + if index[c] < i: + forward_p = 0 + for inst in b.insts: + if inst[0] == 'JUMP_FORWARD': + if inst[1] == c: + forward_p = 1 + if not forward_p: + continue + constraints.append((index[c], i)) + + if not constraints: + break + + # XXX just do one for now + # do swaps to get things in the right order + goes_before, a_chain = constraints[0] + assert a_chain > goes_before + c = chains[a_chain] + chains.remove(c) + chains.insert(goes_before, c) + + del blocks[:] + for c in chains: + for b in c: + blocks.append(b) + + def getBlocks(self): + return self.blocks.elements() + + def getRoot(self): + """Return nodes appropriate for use with dominator""" + return self.entry + + def getContainedGraphs(self): + l = [] + for b in self.getBlocks(): + l.extend(b.getContainedGraphs()) + return l + +def dfs_postorder(b, seen): + """Depth-first search of tree rooted at b, return in postorder""" + order = [] + seen[b] = b + for c in b.get_children(): + if seen.has_key(c): + continue + order = order + dfs_postorder(c, seen) + order.append(b) + return order + +class Block: + _count = 0 + + def __init__(self, label=''): + self.insts = [] + self.inEdges = misc.Set() + self.outEdges = misc.Set() + self.label = label + self.bid = Block._count + self.next = [] + Block._count = Block._count + 1 + + def __repr__(self): + if self.label: + return "" % (self.label, self.bid) + else: + return "" % (self.bid) + + def __str__(self): + insts = map(str, self.insts) + return "" % (self.label, self.bid, + string.join(insts, '\n')) + + def emit(self, inst): + op = inst[0] + if op[:4] == 'JUMP': + self.outEdges.add(inst[1]) + self.insts.append(inst) + + def getInstructions(self): + return self.insts + + def addInEdge(self, block): + self.inEdges.add(block) + + def addOutEdge(self, block): + self.outEdges.add(block) + + def addNext(self, block): + self.next.append(block) + assert len(self.next) == 1, map(str, self.next) + + _uncond_transfer = ('RETURN_VALUE', 'RAISE_VARARGS', + 'JUMP_ABSOLUTE', 'JUMP_FORWARD', 'CONTINUE_LOOP') + + def pruneNext(self): + """Remove bogus edge for unconditional transfers + + Each block has a next edge that accounts for implicit control + transfers, e.g. from a JUMP_IF_FALSE to the block that will be + executed if the test is true. + + These edges must remain for the current assembler code to + work. If they are removed, the dfs_postorder gets things in + weird orders. However, they shouldn't be there for other + purposes, e.g. conversion to SSA form. This method will + remove the next edge when it follows an unconditional control + transfer. + """ + try: + op, arg = self.insts[-1] + except (IndexError, ValueError): + return + if op in self._uncond_transfer: + self.next = [] + + def get_children(self): + if self.next and self.next[0] in self.outEdges: + self.outEdges.remove(self.next[0]) + return self.outEdges.elements() + self.next + + def getContainedGraphs(self): + """Return all graphs contained within this block. + + For example, a MAKE_FUNCTION block will contain a reference to + the graph for the function body. + """ + contained = [] + for inst in self.insts: + if len(inst) == 1: + continue + op = inst[1] + if hasattr(op, 'graph'): + contained.append(op.graph) + return contained + +# flags for code objects + +# the FlowGraph is transformed in place; it exists in one of these states +RAW = "RAW" +FLAT = "FLAT" +CONV = "CONV" +DONE = "DONE" + +class PyFlowGraph(FlowGraph): + super_init = FlowGraph.__init__ + + def __init__(self, name, filename, args=(), optimized=0, klass=None): + self.super_init() + self.name = name + self.filename = filename + self.docstring = None + self.args = args # XXX + self.argcount = getArgCount(args) + self.klass = klass + if optimized: + self.flags = CO_OPTIMIZED | CO_NEWLOCALS + else: + self.flags = 0 + self.consts = [] + self.names = [] + # Free variables found by the symbol table scan, including + # variables used only in nested scopes, are included here. + self.freevars = [] + self.cellvars = [] + # The closure list is used to track the order of cell + # variables and free variables in the resulting code object. + # The offsets used by LOAD_CLOSURE/LOAD_DEREF refer to both + # kinds of variables. + self.closure = [] + self.varnames = list(args) or [] + for i in range(len(self.varnames)): + var = self.varnames[i] + if isinstance(var, TupleArg): + self.varnames[i] = var.getName() + self.stage = RAW + + def setDocstring(self, doc): + self.docstring = doc + + def setFlag(self, flag): + self.flags = self.flags | flag + if flag == CO_VARARGS: + self.argcount = self.argcount - 1 + + def checkFlag(self, flag): + if self.flags & flag: + return 1 + + def setFreeVars(self, names): + self.freevars = list(names) + + def setCellVars(self, names): + self.cellvars = names + + def getCode(self): + """Get a Python code object""" + if self.stage == RAW: + self.computeStackDepth() + self.flattenGraph() + if self.stage == FLAT: + self.convertArgs() + if self.stage == CONV: + self.makeByteCode() + if self.stage == DONE: + return self.newCodeObject() + raise RuntimeError, "inconsistent PyFlowGraph state" + + def dump(self, io=None): + if io: + save = sys.stdout + sys.stdout = io + pc = 0 + for t in self.insts: + opname = t[0] + if opname == "SET_LINENO": + print + if len(t) == 1: + print "\t", "%3d" % pc, opname + pc = pc + 1 + else: + print "\t", "%3d" % pc, opname, t[1] + pc = pc + 3 + if io: + sys.stdout = save + + def computeStackDepth(self): + """Compute the max stack depth. + + Approach is to compute the stack effect of each basic block. + Then find the path through the code with the largest total + effect. + """ + depth = {} + exit = None + for b in self.getBlocks(): + depth[b] = findDepth(b.getInstructions()) + + seen = {} + + def max_depth(b, d): + if seen.has_key(b): + return d + seen[b] = 1 + d = d + depth[b] + children = b.get_children() + if children: + return max([max_depth(c, d) for c in children]) + else: + if not b.label == "exit": + return max_depth(self.exit, d) + else: + return d + + self.stacksize = max_depth(self.entry, 0) + + def flattenGraph(self): + """Arrange the blocks in order and resolve jumps""" + assert self.stage == RAW + self.insts = insts = [] + pc = 0 + begin = {} + end = {} + for b in self.getBlocksInOrder(): + begin[b] = pc + for inst in b.getInstructions(): + insts.append(inst) + if len(inst) == 1: + pc = pc + 1 + else: + # arg takes 2 bytes + pc = pc + 3 + end[b] = pc + pc = 0 + for i in range(len(insts)): + inst = insts[i] + if len(inst) == 1: + pc = pc + 1 + else: + pc = pc + 3 + opname = inst[0] + if self.hasjrel.has_elt(opname): + oparg = inst[1] + offset = begin[oparg] - pc + insts[i] = opname, offset + elif self.hasjabs.has_elt(opname): + insts[i] = opname, begin[inst[1]] + self.stage = FLAT + + hasjrel = misc.Set() + for i in dis.hasjrel: + hasjrel.add(dis.opname[i]) + hasjabs = misc.Set() + for i in dis.hasjabs: + hasjabs.add(dis.opname[i]) + + def convertArgs(self): + """Convert arguments from symbolic to concrete form""" + assert self.stage == FLAT + self.consts.insert(0, self.docstring) + self.sort_cellvars() + for i in range(len(self.insts)): + t = self.insts[i] + if len(t) == 2: + opname, oparg = t + conv = self._converters.get(opname, None) + if conv: + self.insts[i] = opname, conv(self, oparg) + self.stage = CONV + + def sort_cellvars(self): + """Sort cellvars in the order of varnames and prune from freevars. + """ + cells = {} + for name in self.cellvars: + cells[name] = 1 + self.cellvars = [name for name in self.varnames + if cells.has_key(name)] + for name in self.cellvars: + del cells[name] + self.cellvars = self.cellvars + cells.keys() + self.closure = self.cellvars + self.freevars + + def _lookupName(self, name, list): + """Return index of name in list, appending if necessary + + This routine uses a list instead of a dictionary, because a + dictionary can't store two different keys if the keys have the + same value but different types, e.g. 2 and 2L. The compiler + must treat these two separately, so it does an explicit type + comparison before comparing the values. + """ + t = type(name) + for i in range(len(list)): + if t == type(list[i]) and list[i] == name: + return i + end = len(list) + list.append(name) + return end + + _converters = {} + def _convert_LOAD_CONST(self, arg): + if hasattr(arg, 'getCode'): + arg = arg.getCode() + return self._lookupName(arg, self.consts) + + def _convert_LOAD_FAST(self, arg): + self._lookupName(arg, self.names) + return self._lookupName(arg, self.varnames) + _convert_STORE_FAST = _convert_LOAD_FAST + _convert_DELETE_FAST = _convert_LOAD_FAST + + def _convert_LOAD_NAME(self, arg): + if self.klass is None: + self._lookupName(arg, self.varnames) + return self._lookupName(arg, self.names) + + def _convert_NAME(self, arg): + if self.klass is None: + self._lookupName(arg, self.varnames) + return self._lookupName(arg, self.names) + _convert_STORE_NAME = _convert_NAME + _convert_DELETE_NAME = _convert_NAME + _convert_IMPORT_NAME = _convert_NAME + _convert_IMPORT_FROM = _convert_NAME + _convert_STORE_ATTR = _convert_NAME + _convert_LOAD_ATTR = _convert_NAME + _convert_DELETE_ATTR = _convert_NAME + _convert_LOAD_GLOBAL = _convert_NAME + _convert_STORE_GLOBAL = _convert_NAME + _convert_DELETE_GLOBAL = _convert_NAME + + def _convert_DEREF(self, arg): + self._lookupName(arg, self.names) + self._lookupName(arg, self.varnames) + return self._lookupName(arg, self.closure) + _convert_LOAD_DEREF = _convert_DEREF + _convert_STORE_DEREF = _convert_DEREF + + def _convert_LOAD_CLOSURE(self, arg): + self._lookupName(arg, self.varnames) + return self._lookupName(arg, self.closure) + + _cmp = list(dis.cmp_op) + def _convert_COMPARE_OP(self, arg): + return self._cmp.index(arg) + + # similarly for other opcodes... + + for name, obj in locals().items(): + if name[:9] == "_convert_": + opname = name[9:] + _converters[opname] = obj + del name, obj, opname + + def makeByteCode(self): + assert self.stage == CONV + self.lnotab = lnotab = LineAddrTable() + for t in self.insts: + opname = t[0] + if len(t) == 1: + lnotab.addCode(self.opnum[opname]) + else: + oparg = t[1] + if opname == "SET_LINENO": + lnotab.nextLine(oparg) + hi, lo = twobyte(oparg) + try: + lnotab.addCode(self.opnum[opname], lo, hi) + except ValueError: + print opname, oparg + print self.opnum[opname], lo, hi + raise + self.stage = DONE + + opnum = {} + for num in range(len(dis.opname)): + opnum[dis.opname[num]] = num + del num + + def newCodeObject(self): + assert self.stage == DONE + if (self.flags & CO_NEWLOCALS) == 0: + nlocals = 0 + else: + nlocals = len(self.varnames) + argcount = self.argcount + if self.flags & CO_VARKEYWORDS: + argcount = argcount - 1 + return new.code(argcount, nlocals, self.stacksize, self.flags, + self.lnotab.getCode(), self.getConsts(), + tuple(self.names), tuple(self.varnames), + self.filename, self.name, self.lnotab.firstline, + self.lnotab.getTable(), tuple(self.freevars), + tuple(self.cellvars)) + + def getConsts(self): + """Return a tuple for the const slot of the code object + + Must convert references to code (MAKE_FUNCTION) to code + objects recursively. + """ + l = [] + for elt in self.consts: + if isinstance(elt, PyFlowGraph): + elt = elt.getCode() + l.append(elt) + return tuple(l) + +def isJump(opname): + if opname[:4] == 'JUMP': + return 1 + +class TupleArg: + """Helper for marking func defs with nested tuples in arglist""" + def __init__(self, count, names): + self.count = count + self.names = names + def __repr__(self): + return "TupleArg(%s, %s)" % (self.count, self.names) + def getName(self): + return ".%d" % self.count + +def getArgCount(args): + argcount = len(args) + if args: + for arg in args: + if isinstance(arg, TupleArg): + numNames = len(misc.flatten(arg.names)) + argcount = argcount - numNames + return argcount + +def twobyte(val): + """Convert an int argument into high and low bytes""" + assert type(val) == types.IntType + return divmod(val, 256) + +class LineAddrTable: + """lnotab + + This class builds the lnotab, which is documented in compile.c. + Here's a brief recap: + + For each SET_LINENO instruction after the first one, two bytes are + added to lnotab. (In some cases, multiple two-byte entries are + added.) The first byte is the distance in bytes between the + instruction for the last SET_LINENO and the current SET_LINENO. + The second byte is offset in line numbers. If either offset is + greater than 255, multiple two-byte entries are added -- see + compile.c for the delicate details. + """ + + def __init__(self): + self.code = [] + self.codeOffset = 0 + self.firstline = 0 + self.lastline = 0 + self.lastoff = 0 + self.lnotab = [] + + def addCode(self, *args): + for arg in args: + self.code.append(chr(arg)) + self.codeOffset = self.codeOffset + len(args) + + def nextLine(self, lineno): + if self.firstline == 0: + self.firstline = lineno + self.lastline = lineno + else: + # compute deltas + addr = self.codeOffset - self.lastoff + line = lineno - self.lastline + # Python assumes that lineno always increases with + # increasing bytecode address (lnotab is unsigned char). + # Depending on when SET_LINENO instructions are emitted + # this is not always true. Consider the code: + # a = (1, + # b) + # In the bytecode stream, the assignment to "a" occurs + # after the loading of "b". This works with the C Python + # compiler because it only generates a SET_LINENO instruction + # for the assignment. + if line > 0: + push = self.lnotab.append + while addr > 255: + push(255); push(0) + addr -= 255 + while line > 255: + push(addr); push(255) + line -= 255 + addr = 0 + if addr > 0 or line > 0: + push(addr); push(line) + self.lastline = lineno + self.lastoff = self.codeOffset + + def getCode(self): + return string.join(self.code, '') + + def getTable(self): + return string.join(map(chr, self.lnotab), '') + +class StackDepthTracker: + # XXX 1. need to keep track of stack depth on jumps + # XXX 2. at least partly as a result, this code is broken + + def findDepth(self, insts, debug=0): + depth = 0 + maxDepth = 0 + for i in insts: + opname = i[0] + if debug: + print i, + delta = self.effect.get(opname, None) + if delta is not None: + depth = depth + delta + else: + # now check patterns + for pat, pat_delta in self.patterns: + if opname[:len(pat)] == pat: + delta = pat_delta + depth = depth + delta + break + # if we still haven't found a match + if delta is None: + meth = getattr(self, opname, None) + if meth is not None: + depth = depth + meth(i[1]) + if depth > maxDepth: + maxDepth = depth + if debug: + print depth, maxDepth + return maxDepth + + effect = { + 'POP_TOP': -1, + 'DUP_TOP': 1, + 'SLICE+1': -1, + 'SLICE+2': -1, + 'SLICE+3': -2, + 'STORE_SLICE+0': -1, + 'STORE_SLICE+1': -2, + 'STORE_SLICE+2': -2, + 'STORE_SLICE+3': -3, + 'DELETE_SLICE+0': -1, + 'DELETE_SLICE+1': -2, + 'DELETE_SLICE+2': -2, + 'DELETE_SLICE+3': -3, + 'STORE_SUBSCR': -3, + 'DELETE_SUBSCR': -2, + # PRINT_EXPR? + 'PRINT_ITEM': -1, + 'RETURN_VALUE': -1, + 'EXEC_STMT': -3, + 'BUILD_CLASS': -2, + 'STORE_NAME': -1, + 'STORE_ATTR': -2, + 'DELETE_ATTR': -1, + 'STORE_GLOBAL': -1, + 'BUILD_MAP': 1, + 'COMPARE_OP': -1, + 'STORE_FAST': -1, + 'IMPORT_STAR': -1, + 'IMPORT_NAME': 0, + 'IMPORT_FROM': 1, + 'LOAD_ATTR': 0, # unlike other loads + # close enough... + 'SETUP_EXCEPT': 3, + 'SETUP_FINALLY': 3, + 'FOR_ITER': 1, + } + # use pattern match + patterns = [ + ('BINARY_', -1), + ('LOAD_', 1), + ] + + def UNPACK_SEQUENCE(self, count): + return count-1 + def BUILD_TUPLE(self, count): + return -count+1 + def BUILD_LIST(self, count): + return -count+1 + def CALL_FUNCTION(self, argc): + hi, lo = divmod(argc, 256) + return -(lo + hi * 2) + def CALL_FUNCTION_VAR(self, argc): + return self.CALL_FUNCTION(argc)-1 + def CALL_FUNCTION_KW(self, argc): + return self.CALL_FUNCTION(argc)-1 + def CALL_FUNCTION_VAR_KW(self, argc): + return self.CALL_FUNCTION(argc)-2 + def MAKE_FUNCTION(self, argc): + return -argc + def MAKE_CLOSURE(self, argc): + # XXX need to account for free variables too! + return -argc + def BUILD_SLICE(self, argc): + if argc == 2: + return -1 + elif argc == 3: + return -2 + def DUP_TOPX(self, argc): + return argc + +findDepth = StackDepthTracker().findDepth diff --git a/lib-python/2.2/compiler/pycodegen.py b/lib-python/2.2/compiler/pycodegen.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/pycodegen.py @@ -0,0 +1,1388 @@ +import imp +import os +import marshal +import stat +import string +import struct +import sys +import types +from cStringIO import StringIO + +from compiler import ast, parse, walk, syntax +from compiler import pyassem, misc, future, symbols +from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL +from compiler.consts import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,\ + CO_NESTED, CO_GENERATOR, CO_GENERATOR_ALLOWED, CO_FUTURE_DIVISION +from compiler.pyassem import TupleArg + +# Do we have Python 1.x or Python 2.x? +try: + VERSION = sys.version_info[0] +except AttributeError: + VERSION = 1 + +callfunc_opcode_info = { + # (Have *args, Have **args) : opcode + (0,0) : "CALL_FUNCTION", + (1,0) : "CALL_FUNCTION_VAR", + (0,1) : "CALL_FUNCTION_KW", + (1,1) : "CALL_FUNCTION_VAR_KW", +} + +LOOP = 1 +EXCEPT = 2 +TRY_FINALLY = 3 +END_FINALLY = 4 + +# XXX this doesn't seem to be used +class BlockStack(misc.Stack): + __super_init = misc.Stack.__init__ + + def __init__(self): + self.__super_init(self) + self.loop = None + +def compileFile(filename, display=0): + f = open(filename) + buf = f.read() + f.close() + mod = Module(buf, filename) + try: + mod.compile(display) + except SyntaxError, err: + raise + else: + f = open(filename + "c", "wb") + mod.dump(f) + f.close() + +def compile(source, filename, mode, flags=None, dont_inherit=None): + """Replacement for builtin compile() function""" + if flags is not None or dont_inherit is not None: + raise RuntimeError, "not implemented yet" + + if mode == "single": + gen = Interactive(source, filename) + elif mode == "exec": + gen = Module(source, filename) + elif mode == "eval": + gen = Expression(source, filename) + else: + raise ValueError("compile() 3rd arg must be 'exec' or " + "'eval' or 'single'") + gen.compile() + return gen.code + +class AbstractCompileMode: + + mode = None # defined by subclass + + def __init__(self, source, filename): + self.source = source + self.filename = filename + self.code = None + + def _get_tree(self): + tree = parse(self.source, self.mode) + misc.set_filename(self.filename, tree) + syntax.check(tree) + return tree + + def compile(self): + pass # implemented by subclass + + def getCode(self): + return self.code + +class Expression(AbstractCompileMode): + + mode = "eval" + + def compile(self): + tree = self._get_tree() + gen = ExpressionCodeGenerator(tree) + self.code = gen.getCode() + +class Interactive(AbstractCompileMode): + + mode = "single" + + def compile(self): + tree = self._get_tree() + gen = InteractiveCodeGenerator(tree) + self.code = gen.getCode() + +class Module(AbstractCompileMode): + + mode = "exec" + + def compile(self, display=0): + tree = self._get_tree() + gen = ModuleCodeGenerator(tree) + if display: + import pprint + print pprint.pprint(tree) + self.code = gen.getCode() + + def dump(self, f): + f.write(self.getPycHeader()) + marshal.dump(self.code, f) + + MAGIC = imp.get_magic() + + def getPycHeader(self): + # compile.c uses marshal to write a long directly, with + # calling the interface that would also generate a 1-byte code + # to indicate the type of the value. simplest way to get the + # same effect is to call marshal and then skip the code. + mtime = os.stat(self.filename)[stat.ST_MTIME] + mtime = struct.pack(' 0: + top = top - 1 + kind, loop_block = self.setups[top] + if kind == LOOP: + break + if kind != LOOP: + raise SyntaxError, "'continue' outside loop (%s, %d)" % \ + (node.filename, node.lineno) + self.emit('CONTINUE_LOOP', loop_block) + self.nextBlock() + elif kind == END_FINALLY: + msg = "'continue' not allowed inside 'finally' clause (%s, %d)" + raise SyntaxError, msg % (node.filename, node.lineno) + + def visitTest(self, node, jump): + end = self.newBlock() + for child in node.nodes[:-1]: + self.visit(child) + self.emit(jump, end) + self.nextBlock() + self.emit('POP_TOP') + self.visit(node.nodes[-1]) + self.nextBlock(end) + + def visitAnd(self, node): + self.visitTest(node, 'JUMP_IF_FALSE') + + def visitOr(self, node): + self.visitTest(node, 'JUMP_IF_TRUE') + + def visitCompare(self, node): + self.visit(node.expr) + cleanup = self.newBlock() + for op, code in node.ops[:-1]: + self.visit(code) + self.emit('DUP_TOP') + self.emit('ROT_THREE') + self.emit('COMPARE_OP', op) + self.emit('JUMP_IF_FALSE', cleanup) + self.nextBlock() + self.emit('POP_TOP') + # now do the last comparison + if node.ops: + op, code = node.ops[-1] + self.visit(code) + self.emit('COMPARE_OP', op) + if len(node.ops) > 1: + end = self.newBlock() + self.emit('JUMP_FORWARD', end) + self.startBlock(cleanup) + self.emit('ROT_TWO') + self.emit('POP_TOP') + self.nextBlock(end) + + # list comprehensions + __list_count = 0 + + def visitListComp(self, node): + self.set_lineno(node) + # setup list + append = "$append%d" % self.__list_count + self.__list_count = self.__list_count + 1 + self.emit('BUILD_LIST', 0) + self.emit('DUP_TOP') + self.emit('LOAD_ATTR', 'append') + self._implicitNameOp('STORE', append) + + stack = [] + for i, for_ in zip(range(len(node.quals)), node.quals): + start, anchor = self.visit(for_) + cont = None + for if_ in for_.ifs: + if cont is None: + cont = self.newBlock() + self.visit(if_, cont) + stack.insert(0, (start, cont, anchor)) + + self._implicitNameOp('LOAD', append) + self.visit(node.expr) + self.emit('CALL_FUNCTION', 1) + self.emit('POP_TOP') + + for start, cont, anchor in stack: + if cont: + skip_one = self.newBlock() + self.emit('JUMP_FORWARD', skip_one) + self.startBlock(cont) + self.emit('POP_TOP') + self.nextBlock(skip_one) + self.emit('JUMP_ABSOLUTE', start) + self.startBlock(anchor) + self._implicitNameOp('DELETE', append) + + self.__list_count = self.__list_count - 1 + + def visitListCompFor(self, node): + start = self.newBlock() + anchor = self.newBlock() + + self.visit(node.list) + self.emit('GET_ITER') + self.nextBlock(start) + self.emit('SET_LINENO', node.lineno) + self.emit('FOR_ITER', anchor) + self.nextBlock() + self.visit(node.assign) + return start, anchor + + def visitListCompIf(self, node, branch): + self.set_lineno(node, force=1) + self.visit(node.test) + self.emit('JUMP_IF_FALSE', branch) + self.newBlock() + self.emit('POP_TOP') + + # exception related + + def visitAssert(self, node): + # XXX would be interesting to implement this via a + # transformation of the AST before this stage + end = self.newBlock() + self.set_lineno(node) + # XXX __debug__ and AssertionError appear to be special cases + # -- they are always loaded as globals even if there are local + # names. I guess this is a sort of renaming op. + self.emit('LOAD_GLOBAL', '__debug__') + self.emit('JUMP_IF_FALSE', end) + self.nextBlock() + self.emit('POP_TOP') + self.visit(node.test) + self.emit('JUMP_IF_TRUE', end) + self.nextBlock() + self.emit('POP_TOP') + self.emit('LOAD_GLOBAL', 'AssertionError') + if node.fail: + self.visit(node.fail) + self.emit('RAISE_VARARGS', 2) + else: + self.emit('RAISE_VARARGS', 1) + self.nextBlock(end) + self.emit('POP_TOP') + + def visitRaise(self, node): + self.set_lineno(node) + n = 0 + if node.expr1: + self.visit(node.expr1) + n = n + 1 + if node.expr2: + self.visit(node.expr2) + n = n + 1 + if node.expr3: + self.visit(node.expr3) + n = n + 1 + self.emit('RAISE_VARARGS', n) + + def visitTryExcept(self, node): + body = self.newBlock() + handlers = self.newBlock() + end = self.newBlock() + if node.else_: + lElse = self.newBlock() + else: + lElse = end + self.set_lineno(node) + self.emit('SETUP_EXCEPT', handlers) + self.nextBlock(body) + self.setups.push((EXCEPT, body)) + self.visit(node.body) + self.emit('POP_BLOCK') + self.setups.pop() + self.emit('JUMP_FORWARD', lElse) + self.startBlock(handlers) + + last = len(node.handlers) - 1 + for i in range(len(node.handlers)): + expr, target, body = node.handlers[i] + self.set_lineno(expr) + if expr: + self.emit('DUP_TOP') + self.visit(expr) + self.emit('COMPARE_OP', 'exception match') + next = self.newBlock() + self.emit('JUMP_IF_FALSE', next) + self.nextBlock() + self.emit('POP_TOP') + self.emit('POP_TOP') + if target: + self.visit(target) + else: + self.emit('POP_TOP') + self.emit('POP_TOP') + self.visit(body) + self.emit('JUMP_FORWARD', end) + if expr: + self.nextBlock(next) + else: + self.nextBlock() + if expr: # XXX + self.emit('POP_TOP') + self.emit('END_FINALLY') + if node.else_: + self.nextBlock(lElse) + self.visit(node.else_) + self.nextBlock(end) + + def visitTryFinally(self, node): + body = self.newBlock() + final = self.newBlock() + self.set_lineno(node) + self.emit('SETUP_FINALLY', final) + self.nextBlock(body) + self.setups.push((TRY_FINALLY, body)) + self.visit(node.body) + self.emit('POP_BLOCK') + self.setups.pop() + self.emit('LOAD_CONST', None) + self.nextBlock(final) + self.setups.push((END_FINALLY, final)) + self.visit(node.final) + self.emit('END_FINALLY') + self.setups.pop() + + # misc + + def visitDiscard(self, node): + self.set_lineno(node) + self.visit(node.expr) + self.emit('POP_TOP') + + def visitConst(self, node): + self.emit('LOAD_CONST', node.value) + + def visitKeyword(self, node): + self.emit('LOAD_CONST', node.name) + self.visit(node.expr) + + def visitGlobal(self, node): + # no code to generate + pass + + def visitName(self, node): + self.set_lineno(node) + self.loadName(node.name) + + def visitPass(self, node): + self.set_lineno(node) + + def visitImport(self, node): + self.set_lineno(node) + for name, alias in node.names: + if VERSION > 1: + self.emit('LOAD_CONST', None) + self.emit('IMPORT_NAME', name) + mod = string.split(name, ".")[0] + self.storeName(alias or mod) + + def visitFrom(self, node): + self.set_lineno(node) + fromlist = map(lambda (name, alias): name, node.names) + if VERSION > 1: + self.emit('LOAD_CONST', tuple(fromlist)) + self.emit('IMPORT_NAME', node.modname) + for name, alias in node.names: + if VERSION > 1: + if name == '*': + self.namespace = 0 + self.emit('IMPORT_STAR') + # There can only be one name w/ from ... import * + assert len(node.names) == 1 + return + else: + self.emit('IMPORT_FROM', name) + self._resolveDots(name) + self.storeName(alias or name) + else: + self.emit('IMPORT_FROM', name) + self.emit('POP_TOP') + + def _resolveDots(self, name): + elts = string.split(name, ".") + if len(elts) == 1: + return + for elt in elts[1:]: + self.emit('LOAD_ATTR', elt) + + def visitGetattr(self, node): + self.visit(node.expr) + self.emit('LOAD_ATTR', self.mangle(node.attrname)) + + # next five implement assignments + + def visitAssign(self, node): + self.set_lineno(node) + self.visit(node.expr) + dups = len(node.nodes) - 1 + for i in range(len(node.nodes)): + elt = node.nodes[i] + if i < dups: + self.emit('DUP_TOP') + if isinstance(elt, ast.Node): + self.visit(elt) + + def visitAssName(self, node): + if node.flags == 'OP_ASSIGN': + self.storeName(node.name) + elif node.flags == 'OP_DELETE': + self.set_lineno(node) + self.delName(node.name) + else: + print "oops", node.flags + + def visitAssAttr(self, node): + self.visit(node.expr) + if node.flags == 'OP_ASSIGN': + self.emit('STORE_ATTR', self.mangle(node.attrname)) + elif node.flags == 'OP_DELETE': + self.emit('DELETE_ATTR', self.mangle(node.attrname)) + else: + print "warning: unexpected flags:", node.flags + print node + + def _visitAssSequence(self, node, op='UNPACK_SEQUENCE'): + if findOp(node) != 'OP_DELETE': + self.emit(op, len(node.nodes)) + for child in node.nodes: + self.visit(child) + + if VERSION > 1: + visitAssTuple = _visitAssSequence + visitAssList = _visitAssSequence + else: + def visitAssTuple(self, node): + self._visitAssSequence(node, 'UNPACK_TUPLE') + + def visitAssList(self, node): + self._visitAssSequence(node, 'UNPACK_LIST') + + # augmented assignment + + def visitAugAssign(self, node): + self.set_lineno(node) + aug_node = wrap_aug(node.node) + self.visit(aug_node, "load") + self.visit(node.expr) + self.emit(self._augmented_opcode[node.op]) + self.visit(aug_node, "store") + + _augmented_opcode = { + '+=' : 'INPLACE_ADD', + '-=' : 'INPLACE_SUBTRACT', + '*=' : 'INPLACE_MULTIPLY', + '/=' : 'INPLACE_DIVIDE', + '//=': 'INPLACE_FLOOR_DIVIDE', + '%=' : 'INPLACE_MODULO', + '**=': 'INPLACE_POWER', + '>>=': 'INPLACE_RSHIFT', + '<<=': 'INPLACE_LSHIFT', + '&=' : 'INPLACE_AND', + '^=' : 'INPLACE_XOR', + '|=' : 'INPLACE_OR', + } + + def visitAugName(self, node, mode): + if mode == "load": + self.loadName(node.name) + elif mode == "store": + self.storeName(node.name) + + def visitAugGetattr(self, node, mode): + if mode == "load": + self.visit(node.expr) + self.emit('DUP_TOP') + self.emit('LOAD_ATTR', self.mangle(node.attrname)) + elif mode == "store": + self.emit('ROT_TWO') + self.emit('STORE_ATTR', self.mangle(node.attrname)) + + def visitAugSlice(self, node, mode): + if mode == "load": + self.visitSlice(node, 1) + elif mode == "store": + slice = 0 + if node.lower: + slice = slice | 1 + if node.upper: + slice = slice | 2 + if slice == 0: + self.emit('ROT_TWO') + elif slice == 3: + self.emit('ROT_FOUR') + else: + self.emit('ROT_THREE') + self.emit('STORE_SLICE+%d' % slice) + + def visitAugSubscript(self, node, mode): + if len(node.subs) > 1: + raise SyntaxError, "augmented assignment to tuple is not possible" + if mode == "load": + self.visitSubscript(node, 1) + elif mode == "store": + self.emit('ROT_THREE') + self.emit('STORE_SUBSCR') + + def visitExec(self, node): + self.visit(node.expr) + if node.locals is None: + self.emit('LOAD_CONST', None) + else: + self.visit(node.locals) + if node.globals is None: + self.emit('DUP_TOP') + else: + self.visit(node.globals) + self.emit('EXEC_STMT') + + def visitCallFunc(self, node): + pos = 0 + kw = 0 + self.set_lineno(node) + self.visit(node.node) + for arg in node.args: + self.visit(arg) + if isinstance(arg, ast.Keyword): + kw = kw + 1 + else: + pos = pos + 1 + if node.star_args is not None: + self.visit(node.star_args) + if node.dstar_args is not None: + self.visit(node.dstar_args) + have_star = node.star_args is not None + have_dstar = node.dstar_args is not None + opcode = callfunc_opcode_info[have_star, have_dstar] + self.emit(opcode, kw << 8 | pos) + + def visitPrint(self, node, newline=0): + self.set_lineno(node) + if node.dest: + self.visit(node.dest) + for child in node.nodes: + if node.dest: + self.emit('DUP_TOP') + self.visit(child) + if node.dest: + self.emit('ROT_TWO') + self.emit('PRINT_ITEM_TO') + else: + self.emit('PRINT_ITEM') + if node.dest and not newline: + self.emit('POP_TOP') + + def visitPrintnl(self, node): + self.visitPrint(node, newline=1) + if node.dest: + self.emit('PRINT_NEWLINE_TO') + else: + self.emit('PRINT_NEWLINE') + + def visitReturn(self, node): + self.set_lineno(node) + self.visit(node.value) + self.emit('RETURN_VALUE') + + def visitYield(self, node): + self.set_lineno(node) + self.visit(node.value) + self.emit('YIELD_STMT') + + # slice and subscript stuff + + def visitSlice(self, node, aug_flag=None): + # aug_flag is used by visitAugSlice + self.visit(node.expr) + slice = 0 + if node.lower: + self.visit(node.lower) + slice = slice | 1 + if node.upper: + self.visit(node.upper) + slice = slice | 2 + if aug_flag: + if slice == 0: + self.emit('DUP_TOP') + elif slice == 3: + self.emit('DUP_TOPX', 3) + else: + self.emit('DUP_TOPX', 2) + if node.flags == 'OP_APPLY': + self.emit('SLICE+%d' % slice) + elif node.flags == 'OP_ASSIGN': + self.emit('STORE_SLICE+%d' % slice) + elif node.flags == 'OP_DELETE': + self.emit('DELETE_SLICE+%d' % slice) + else: + print "weird slice", node.flags + raise + + def visitSubscript(self, node, aug_flag=None): + self.visit(node.expr) + for sub in node.subs: + self.visit(sub) + if aug_flag: + self.emit('DUP_TOPX', 2) + if len(node.subs) > 1: + self.emit('BUILD_TUPLE', len(node.subs)) + if node.flags == 'OP_APPLY': + self.emit('BINARY_SUBSCR') + elif node.flags == 'OP_ASSIGN': + self.emit('STORE_SUBSCR') + elif node.flags == 'OP_DELETE': + self.emit('DELETE_SUBSCR') + + # binary ops + + def binaryOp(self, node, op): + self.visit(node.left) + self.visit(node.right) + self.emit(op) + + def visitAdd(self, node): + return self.binaryOp(node, 'BINARY_ADD') + + def visitSub(self, node): + return self.binaryOp(node, 'BINARY_SUBTRACT') + + def visitMul(self, node): + return self.binaryOp(node, 'BINARY_MULTIPLY') + + def visitDiv(self, node): + return self.binaryOp(node, self._div_op) + + def visitFloorDiv(self, node): + return self.binaryOp(node, 'BINARY_FLOOR_DIVIDE') + + def visitMod(self, node): + return self.binaryOp(node, 'BINARY_MODULO') + + def visitPower(self, node): + return self.binaryOp(node, 'BINARY_POWER') + + def visitLeftShift(self, node): + return self.binaryOp(node, 'BINARY_LSHIFT') + + def visitRightShift(self, node): + return self.binaryOp(node, 'BINARY_RSHIFT') + + # unary ops + + def unaryOp(self, node, op): + self.visit(node.expr) + self.emit(op) + + def visitInvert(self, node): + return self.unaryOp(node, 'UNARY_INVERT') + + def visitUnarySub(self, node): + return self.unaryOp(node, 'UNARY_NEGATIVE') + + def visitUnaryAdd(self, node): + return self.unaryOp(node, 'UNARY_POSITIVE') + + def visitUnaryInvert(self, node): + return self.unaryOp(node, 'UNARY_INVERT') + + def visitNot(self, node): + return self.unaryOp(node, 'UNARY_NOT') + + def visitBackquote(self, node): + return self.unaryOp(node, 'UNARY_CONVERT') + + # bit ops + + def bitOp(self, nodes, op): + self.visit(nodes[0]) + for node in nodes[1:]: + self.visit(node) + self.emit(op) + + def visitBitand(self, node): + return self.bitOp(node.nodes, 'BINARY_AND') + + def visitBitor(self, node): + return self.bitOp(node.nodes, 'BINARY_OR') + + def visitBitxor(self, node): + return self.bitOp(node.nodes, 'BINARY_XOR') + + # object constructors + + def visitEllipsis(self, node): + self.emit('LOAD_CONST', Ellipsis) + + def visitTuple(self, node): + self.set_lineno(node) + for elt in node.nodes: + self.visit(elt) + self.emit('BUILD_TUPLE', len(node.nodes)) + + def visitList(self, node): + self.set_lineno(node) + for elt in node.nodes: + self.visit(elt) + self.emit('BUILD_LIST', len(node.nodes)) + + def visitSliceobj(self, node): + for child in node.nodes: + self.visit(child) + self.emit('BUILD_SLICE', len(node.nodes)) + + def visitDict(self, node): + lineno = getattr(node, 'lineno', None) + if lineno: + self.emit('SET_LINENO', lineno) + self.emit('BUILD_MAP', 0) + for k, v in node.items: + lineno2 = getattr(node, 'lineno', None) + if lineno2 is not None and lineno != lineno2: + self.emit('SET_LINENO', lineno2) + lineno = lineno2 + self.emit('DUP_TOP') + self.visit(v) + self.emit('ROT_TWO') + self.visit(k) + self.emit('STORE_SUBSCR') + +class NestedScopeMixin: + """Defines initClass() for nested scoping (Python 2.2-compatible)""" + def initClass(self): + self.__class__.NameFinder = LocalNameFinder + self.__class__.FunctionGen = FunctionCodeGenerator + self.__class__.ClassGen = ClassCodeGenerator + +class ModuleCodeGenerator(NestedScopeMixin, CodeGenerator): + __super_init = CodeGenerator.__init__ + + scopes = None + + def __init__(self, tree): + self.graph = pyassem.PyFlowGraph("", tree.filename) + self.futures = future.find_futures(tree) + self.__super_init() + walk(tree, self) + + def get_module(self): + return self + +class ExpressionCodeGenerator(NestedScopeMixin, CodeGenerator): + __super_init = CodeGenerator.__init__ + + scopes = None + futures = () + + def __init__(self, tree): + self.graph = pyassem.PyFlowGraph("", tree.filename) + self.__super_init() + walk(tree, self) + + def get_module(self): + return self + +class InteractiveCodeGenerator(NestedScopeMixin, CodeGenerator): + + __super_init = CodeGenerator.__init__ + + scopes = None + futures = () + + def __init__(self, tree): + self.graph = pyassem.PyFlowGraph("", tree.filename) + self.__super_init() + self.set_lineno(tree) + walk(tree, self) + self.emit('RETURN_VALUE') + + def get_module(self): + return self + + def visitDiscard(self, node): + # XXX Discard means it's an expression. Perhaps this is a bad + # name. + self.visit(node.expr) + self.emit('PRINT_EXPR') + +class AbstractFunctionCode: + optimized = 1 + lambdaCount = 0 + + def __init__(self, func, scopes, isLambda, class_name, mod): + self.class_name = class_name + self.module = mod + if isLambda: + klass = FunctionCodeGenerator + name = "" % klass.lambdaCount + klass.lambdaCount = klass.lambdaCount + 1 + else: + name = func.name + args, hasTupleArg = generateArgList(func.argnames) + self.graph = pyassem.PyFlowGraph(name, func.filename, args, + optimized=1) + self.isLambda = isLambda + self.super_init() + + if not isLambda and func.doc: + self.setDocstring(func.doc) + + lnf = walk(func.code, self.NameFinder(args), verbose=0) + self.locals.push(lnf.getLocals()) + if func.varargs: + self.graph.setFlag(CO_VARARGS) + if func.kwargs: + self.graph.setFlag(CO_VARKEYWORDS) + self.set_lineno(func) + if hasTupleArg: + self.generateArgUnpack(func.argnames) + + def get_module(self): + return self.module + + def finish(self): + self.graph.startExitBlock() + if not self.isLambda: + self.emit('LOAD_CONST', None) + self.emit('RETURN_VALUE') + + def generateArgUnpack(self, args): + for i in range(len(args)): + arg = args[i] + if type(arg) == types.TupleType: + self.emit('LOAD_FAST', '.%d' % (i * 2)) + self.unpackSequence(arg) + + def unpackSequence(self, tup): + if VERSION > 1: + self.emit('UNPACK_SEQUENCE', len(tup)) + else: + self.emit('UNPACK_TUPLE', len(tup)) + for elt in tup: + if type(elt) == types.TupleType: + self.unpackSequence(elt) + else: + self._nameOp('STORE', elt) + + unpackTuple = unpackSequence + +class FunctionCodeGenerator(NestedScopeMixin, AbstractFunctionCode, + CodeGenerator): + super_init = CodeGenerator.__init__ # call be other init + scopes = None + + __super_init = AbstractFunctionCode.__init__ + + def __init__(self, func, scopes, isLambda, class_name, mod): + self.scopes = scopes + self.scope = scopes[func] + self.__super_init(func, scopes, isLambda, class_name, mod) + self.graph.setFreeVars(self.scope.get_free_vars()) + self.graph.setCellVars(self.scope.get_cell_vars()) + if self.graph.checkFlag(CO_GENERATOR_ALLOWED): + if self.scope.generator is not None: + self.graph.setFlag(CO_GENERATOR) + +class AbstractClassCode: + + def __init__(self, klass, scopes, module): + self.class_name = klass.name + self.module = module + self.graph = pyassem.PyFlowGraph(klass.name, klass.filename, + optimized=0, klass=1) + self.super_init() + lnf = walk(klass.code, self.NameFinder(), verbose=0) + self.locals.push(lnf.getLocals()) + self.graph.setFlag(CO_NEWLOCALS) + if klass.doc: + self.setDocstring(klass.doc) + + def get_module(self): + return self.module + + def finish(self): + self.graph.startExitBlock() + self.emit('LOAD_LOCALS') + self.emit('RETURN_VALUE') + +class ClassCodeGenerator(NestedScopeMixin, AbstractClassCode, CodeGenerator): + super_init = CodeGenerator.__init__ + scopes = None + + __super_init = AbstractClassCode.__init__ + + def __init__(self, klass, scopes, module): + self.scopes = scopes + self.scope = scopes[klass] + self.__super_init(klass, scopes, module) + self.graph.setFreeVars(self.scope.get_free_vars()) + self.graph.setCellVars(self.scope.get_cell_vars()) + self.set_lineno(klass) + if klass.doc: + self.emit("LOAD_CONST", klass.doc) + self.storeName("__doc__") + +def generateArgList(arglist): + """Generate an arg list marking TupleArgs""" + args = [] + extra = [] + count = 0 + for i in range(len(arglist)): + elt = arglist[i] + if type(elt) == types.StringType: + args.append(elt) + elif type(elt) == types.TupleType: + args.append(TupleArg(i * 2, elt)) + extra.extend(misc.flatten(elt)) + count = count + 1 + else: + raise ValueError, "unexpect argument type:", elt + return args + extra, count + +def findOp(node): + """Find the op (DELETE, LOAD, STORE) in an AssTuple tree""" + v = OpFinder() + walk(node, v, verbose=0) + return v.op + +class OpFinder: + def __init__(self): + self.op = None + def visitAssName(self, node): + if self.op is None: + self.op = node.flags + elif self.op != node.flags: + raise ValueError, "mixed ops in stmt" + visitAssAttr = visitAssName + visitSubscript = visitAssName + +class Delegator: + """Base class to support delegation for augmented assignment nodes + + To generator code for augmented assignments, we use the following + wrapper classes. In visitAugAssign, the left-hand expression node + is visited twice. The first time the visit uses the normal method + for that node . The second time the visit uses a different method + that generates the appropriate code to perform the assignment. + These delegator classes wrap the original AST nodes in order to + support the variant visit methods. + """ + def __init__(self, obj): + self.obj = obj + + def __getattr__(self, attr): + return getattr(self.obj, attr) + +class AugGetattr(Delegator): + pass + +class AugName(Delegator): + pass + +class AugSlice(Delegator): + pass + +class AugSubscript(Delegator): + pass + +wrapper = { + ast.Getattr: AugGetattr, + ast.Name: AugName, + ast.Slice: AugSlice, + ast.Subscript: AugSubscript, + } + +def wrap_aug(node): + return wrapper[node.__class__](node) + +if __name__ == "__main__": + import sys + + for file in sys.argv[1:]: + compileFile(file) diff --git a/lib-python/2.2/compiler/symbols.py b/lib-python/2.2/compiler/symbols.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/symbols.py @@ -0,0 +1,419 @@ +"""Module symbol-table generator""" + +from compiler import ast +from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL, SC_UNKNOWN +from compiler.misc import mangle +import types + + +import sys + +MANGLE_LEN = 256 + +class Scope: + # XXX how much information do I need about each name? + def __init__(self, name, module, klass=None): + self.name = name + self.module = module + self.defs = {} + self.uses = {} + self.globals = {} + self.params = {} + self.frees = {} + self.cells = {} + self.children = [] + # nested is true if the class could contain free variables, + # i.e. if it is nested within another function. + self.nested = None + self.generator = None + self.klass = None + if klass is not None: + for i in range(len(klass)): + if klass[i] != '_': + self.klass = klass[i:] + break + + def __repr__(self): + return "<%s: %s>" % (self.__class__.__name__, self.name) + + def mangle(self, name): + if self.klass is None: + return name + return mangle(name, self.klass) + + def add_def(self, name): + self.defs[self.mangle(name)] = 1 + + def add_use(self, name): + self.uses[self.mangle(name)] = 1 + + def add_global(self, name): + name = self.mangle(name) + if self.uses.has_key(name) or self.defs.has_key(name): + pass # XXX warn about global following def/use + if self.params.has_key(name): + raise SyntaxError, "%s in %s is global and parameter" % \ + (name, self.name) + self.globals[name] = 1 + self.module.add_def(name) + + def add_param(self, name): + name = self.mangle(name) + self.defs[name] = 1 + self.params[name] = 1 + + def get_names(self): + d = {} + d.update(self.defs) + d.update(self.uses) + d.update(self.globals) + return d.keys() + + def add_child(self, child): + self.children.append(child) + + def get_children(self): + return self.children + + def DEBUG(self): + print >> sys.stderr, self.name, self.nested and "nested" or "" + print >> sys.stderr, "\tglobals: ", self.globals + print >> sys.stderr, "\tcells: ", self.cells + print >> sys.stderr, "\tdefs: ", self.defs + print >> sys.stderr, "\tuses: ", self.uses + print >> sys.stderr, "\tfrees:", self.frees + + def check_name(self, name): + """Return scope of name. + + The scope of a name could be LOCAL, GLOBAL, FREE, or CELL. + """ + if self.globals.has_key(name): + return SC_GLOBAL + if self.cells.has_key(name): + return SC_CELL + if self.defs.has_key(name): + return SC_LOCAL + if self.nested and (self.frees.has_key(name) or + self.uses.has_key(name)): + return SC_FREE + if self.nested: + return SC_UNKNOWN + else: + return SC_GLOBAL + + def get_free_vars(self): + if not self.nested: + return () + free = {} + free.update(self.frees) + for name in self.uses.keys(): + if not (self.defs.has_key(name) or + self.globals.has_key(name)): + free[name] = 1 + return free.keys() + + def handle_children(self): + for child in self.children: + frees = child.get_free_vars() + globals = self.add_frees(frees) + for name in globals: + child.force_global(name) + + def force_global(self, name): + """Force name to be global in scope. + + Some child of the current node had a free reference to name. + When the child was processed, it was labelled a free + variable. Now that all its enclosing scope have been + processed, the name is known to be a global or builtin. So + walk back down the child chain and set the name to be global + rather than free. + + Be careful to stop if a child does not think the name is + free. + """ + self.globals[name] = 1 + if self.frees.has_key(name): + del self.frees[name] + for child in self.children: + if child.check_name(name) == SC_FREE: + child.force_global(name) + + def add_frees(self, names): + """Process list of free vars from nested scope. + + Returns a list of names that are either 1) declared global in the + parent or 2) undefined in a top-level parent. In either case, + the nested scope should treat them as globals. + """ + child_globals = [] + for name in names: + sc = self.check_name(name) + if self.nested: + if sc == SC_UNKNOWN or sc == SC_FREE \ + or isinstance(self, ClassScope): + self.frees[name] = 1 + elif sc == SC_GLOBAL: + child_globals.append(name) + elif isinstance(self, FunctionScope) and sc == SC_LOCAL: + self.cells[name] = 1 + elif sc != SC_CELL: + child_globals.append(name) + else: + if sc == SC_LOCAL: + self.cells[name] = 1 + elif sc != SC_CELL: + child_globals.append(name) + return child_globals + + def get_cell_vars(self): + return self.cells.keys() + +class ModuleScope(Scope): + __super_init = Scope.__init__ + + def __init__(self): + self.__super_init("global", self) + +class FunctionScope(Scope): + pass + +class LambdaScope(FunctionScope): + __super_init = Scope.__init__ + + __counter = 1 + + def __init__(self, module, klass=None): + i = self.__counter + self.__counter += 1 + self.__super_init("lambda.%d" % i, module, klass) + +class ClassScope(Scope): + __super_init = Scope.__init__ + + def __init__(self, name, module): + self.__super_init(name, module, name) + +class SymbolVisitor: + def __init__(self): + self.scopes = {} + self.klass = None + + # node that define new scopes + + def visitModule(self, node): + scope = self.module = self.scopes[node] = ModuleScope() + self.visit(node.node, scope) + + visitExpression = visitModule + + def visitFunction(self, node, parent): + parent.add_def(node.name) + for n in node.defaults: + self.visit(n, parent) + scope = FunctionScope(node.name, self.module, self.klass) + if parent.nested or isinstance(parent, FunctionScope): + scope.nested = 1 + self.scopes[node] = scope + self._do_args(scope, node.argnames) + self.visit(node.code, scope) + self.handle_free_vars(scope, parent) + + def visitLambda(self, node, parent): + for n in node.defaults: + self.visit(n, parent) + scope = LambdaScope(self.module, self.klass) + if parent.nested or isinstance(parent, FunctionScope): + scope.nested = 1 + self.scopes[node] = scope + self._do_args(scope, node.argnames) + self.visit(node.code, scope) + self.handle_free_vars(scope, parent) + + def _do_args(self, scope, args): + for name in args: + if type(name) == types.TupleType: + self._do_args(scope, name) + else: + scope.add_param(name) + + def handle_free_vars(self, scope, parent): + parent.add_child(scope) + scope.handle_children() + + def visitClass(self, node, parent): + parent.add_def(node.name) + for n in node.bases: + self.visit(n, parent) + scope = ClassScope(node.name, self.module) + if parent.nested or isinstance(parent, FunctionScope): + scope.nested = 1 + if node.doc is not None: + scope.add_def('__doc__') + self.scopes[node] = scope + prev = self.klass + self.klass = node.name + self.visit(node.code, scope) + self.klass = prev + self.handle_free_vars(scope, parent) + + # name can be a def or a use + + # XXX a few calls and nodes expect a third "assign" arg that is + # true if the name is being used as an assignment. only + # expressions contained within statements may have the assign arg. + + def visitName(self, node, scope, assign=0): + if assign: + scope.add_def(node.name) + else: + scope.add_use(node.name) + + # operations that bind new names + + def visitFor(self, node, scope): + self.visit(node.assign, scope, 1) + self.visit(node.list, scope) + self.visit(node.body, scope) + if node.else_: + self.visit(node.else_, scope) + + def visitFrom(self, node, scope): + for name, asname in node.names: + if name == "*": + continue + scope.add_def(asname or name) + + def visitImport(self, node, scope): + for name, asname in node.names: + i = name.find(".") + if i > -1: + name = name[:i] + scope.add_def(asname or name) + + def visitGlobal(self, node, scope): + for name in node.names: + scope.add_global(name) + + def visitAssign(self, node, scope): + """Propagate assignment flag down to child nodes. + + The Assign node doesn't itself contains the variables being + assigned to. Instead, the children in node.nodes are visited + with the assign flag set to true. When the names occur in + those nodes, they are marked as defs. + + Some names that occur in an assignment target are not bound by + the assignment, e.g. a name occurring inside a slice. The + visitor handles these nodes specially; they do not propagate + the assign flag to their children. + """ + for n in node.nodes: + self.visit(n, scope, 1) + self.visit(node.expr, scope) + + def visitAssName(self, node, scope, assign=1): + scope.add_def(node.name) + + def visitAssAttr(self, node, scope, assign=0): + self.visit(node.expr, scope, 0) + + def visitSubscript(self, node, scope, assign=0): + self.visit(node.expr, scope, 0) + for n in node.subs: + self.visit(n, scope, 0) + + def visitSlice(self, node, scope, assign=0): + self.visit(node.expr, scope, 0) + if node.lower: + self.visit(node.lower, scope, 0) + if node.upper: + self.visit(node.upper, scope, 0) + + def visitAugAssign(self, node, scope): + # If the LHS is a name, then this counts as assignment. + # Otherwise, it's just use. + self.visit(node.node, scope) + if isinstance(node.node, ast.Name): + self.visit(node.node, scope, 1) # XXX worry about this + self.visit(node.expr, scope) + + # prune if statements if tests are false + + _const_types = types.StringType, types.IntType, types.FloatType + + def visitIf(self, node, scope): + for test, body in node.tests: + if isinstance(test, ast.Const): + if type(test.value) in self._const_types: + if not test.value: + continue + self.visit(test, scope) + self.visit(body, scope) + if node.else_: + self.visit(node.else_, scope) + + # a yield statement signals a generator + + def visitYield(self, node, scope): + scope.generator = 1 + self.visit(node.value, scope) + +def sort(l): + l = l[:] + l.sort() + return l + +def list_eq(l1, l2): + return sort(l1) == sort(l2) + +if __name__ == "__main__": + import sys + from compiler import parseFile, walk + import symtable + + def get_names(syms): + return [s for s in [s.get_name() for s in syms.get_symbols()] + if not (s.startswith('_[') or s.startswith('.'))] + + for file in sys.argv[1:]: + print file + f = open(file) + buf = f.read() + f.close() + syms = symtable.symtable(buf, file, "exec") + mod_names = get_names(syms) + tree = parseFile(file) + s = SymbolVisitor() + walk(tree, s) + + # compare module-level symbols + names2 = s.scopes[tree].get_names() + + if not list_eq(mod_names, names2): + print + print "oops", file + print sort(mod_names) + print sort(names2) + sys.exit(-1) + + d = {} + d.update(s.scopes) + del d[tree] + scopes = d.values() + del d + + for s in syms.get_symbols(): + if s.is_namespace(): + l = [sc for sc in scopes + if sc.name == s.get_name()] + if len(l) > 1: + print "skipping", s.get_name() + else: + if not list_eq(get_names(s.get_namespace()), + l[0].get_names()): + print s.get_name() + print sort(get_names(s.get_namespace())) + print sort(l[0].get_names()) + sys.exit(-1) diff --git a/lib-python/2.2/compiler/syntax.py b/lib-python/2.2/compiler/syntax.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/syntax.py @@ -0,0 +1,46 @@ +"""Check for errs in the AST. + +The Python parser does not catch all syntax errors. Others, like +assignments with invalid targets, are caught in the code generation +phase. + +The compiler package catches some errors in the transformer module. +But it seems clearer to write checkers that use the AST to detect +errors. +""" + +from compiler import ast, walk + +def check(tree, multi=None): + v = SyntaxErrorChecker(multi) + walk(tree, v) + return v.errors + +class SyntaxErrorChecker: + """A visitor to find syntax errors in the AST.""" + + def __init__(self, multi=None): + """Create new visitor object. + + If optional argument multi is not None, then print messages + for each error rather than raising a SyntaxError for the + first. + """ + self.multi = multi + self.errors = 0 + + def error(self, node, msg): + self.errors = self.errors + 1 + if self.multi is not None: + print "%s:%s: %s" % (node.filename, node.lineno, msg) + else: + raise SyntaxError, "%s (%s:%s)" % (msg, node.filename, node.lineno) + + def visitAssign(self, node): + # the transformer module handles many of these + for target in node.nodes: + pass +## if isinstance(target, ast.AssList): +## if target.lineno is None: +## target.lineno = node.lineno +## self.error(target, "can't assign to list comprehension") diff --git a/lib-python/2.2/compiler/transformer.py b/lib-python/2.2/compiler/transformer.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/transformer.py @@ -0,0 +1,1359 @@ +"""Parse tree transformation module. + +Transforms Python source code into an abstract syntax tree (AST) +defined in the ast module. + +The simplest ways to invoke this module are via parse and parseFile. +parse(buf) -> AST +parseFile(path) -> AST +""" + +# Original version written by Greg Stein (gstein at lyra.org) +# and Bill Tutt (rassilon at lima.mudlib.org) +# February 1997. +# +# Modifications and improvements for Python 2.0 by Jeremy Hylton and +# Mark Hammond + +# Portions of this file are: +# Copyright (C) 1997-1998 Greg Stein. All Rights Reserved. +# +# This module is provided under a BSD-ish license. See +# http://www.opensource.org/licenses/bsd-license.html +# and replace OWNER, ORGANIZATION, and YEAR as appropriate. + +from ast import * +import parser +# Care must be taken to use only symbols and tokens defined in Python +# 1.5.2 for code branches executed in 1.5.2 +import symbol +import token +import string +import sys + +error = 'walker.error' + +from consts import CO_VARARGS, CO_VARKEYWORDS +from consts import OP_ASSIGN, OP_DELETE, OP_APPLY + +def parseFile(path): + f = open(path) + src = f.read() + f.close() + return parse(src) + +def parse(buf, mode="exec"): + if mode == "exec" or mode == "single": + return Transformer().parsesuite(buf) + elif mode == "eval": + return Transformer().parseexpr(buf) + else: + raise ValueError("compile() arg 3 must be" + " 'exec' or 'eval' or 'single'") + +def asList(nodes): + l = [] + for item in nodes: + if hasattr(item, "asList"): + l.append(item.asList()) + else: + if type(item) is type( (None, None) ): + l.append(tuple(asList(item))) + elif type(item) is type( [] ): + l.append(asList(item)) + else: + l.append(item) + return l + +def Node(*args): + kind = args[0] + if nodes.has_key(kind): + try: + return apply(nodes[kind], args[1:]) + except TypeError: + print nodes[kind], len(args), args + raise + else: + raise error, "Can't find appropriate Node type: %s" % str(args) + #return apply(ast.Node, args) + +class Transformer: + """Utility object for transforming Python parse trees. + + Exposes the following methods: + tree = transform(ast_tree) + tree = parsesuite(text) + tree = parseexpr(text) + tree = parsefile(fileob | filename) + """ + + def __init__(self): + self._dispatch = {} + for value, name in symbol.sym_name.items(): + if hasattr(self, name): + self._dispatch[value] = getattr(self, name) + self._dispatch[token.NEWLINE] = self.com_NEWLINE + self._atom_dispatch = {token.LPAR: self.atom_lpar, + token.LSQB: self.atom_lsqb, + token.LBRACE: self.atom_lbrace, + token.BACKQUOTE: self.atom_backquote, + token.NUMBER: self.atom_number, + token.STRING: self.atom_string, + token.NAME: self.atom_name, + } + + def transform(self, tree): + """Transform an AST into a modified parse tree.""" + if type(tree) != type(()) and type(tree) != type([]): + tree = parser.ast2tuple(tree, line_info=1) + return self.compile_node(tree) + + def parsesuite(self, text): + """Return a modified parse tree for the given suite text.""" + # Hack for handling non-native line endings on non-DOS like OSs. + text = string.replace(text, '\x0d', '') + return self.transform(parser.suite(text)) + + def parseexpr(self, text): + """Return a modified parse tree for the given expression text.""" + return self.transform(parser.expr(text)) + + def parsefile(self, file): + """Return a modified parse tree for the contents of the given file.""" + if type(file) == type(''): + file = open(file) + return self.parsesuite(file.read()) + + # -------------------------------------------------------------- + # + # PRIVATE METHODS + # + + def compile_node(self, node): + ### emit a line-number node? + n = node[0] + if n == symbol.single_input: + return self.single_input(node[1:]) + if n == symbol.file_input: + return self.file_input(node[1:]) + if n == symbol.eval_input: + return self.eval_input(node[1:]) + if n == symbol.lambdef: + return self.lambdef(node[1:]) + if n == symbol.funcdef: + return self.funcdef(node[1:]) + if n == symbol.classdef: + return self.classdef(node[1:]) + + raise error, ('unexpected node type', n) + + def single_input(self, node): + ### do we want to do anything about being "interactive" ? + + # NEWLINE | simple_stmt | compound_stmt NEWLINE + n = node[0][0] + if n != token.NEWLINE: + return self.com_stmt(node[0]) + + return Pass() + + def file_input(self, nodelist): + doc = self.get_docstring(nodelist, symbol.file_input) + if doc is not None: + i = 1 + else: + i = 0 + stmts = [] + for node in nodelist[i:]: + if node[0] != token.ENDMARKER and node[0] != token.NEWLINE: + self.com_append_stmt(stmts, node) + return Module(doc, Stmt(stmts)) + + def eval_input(self, nodelist): + # from the built-in function input() + ### is this sufficient? + return Expression(self.com_node(nodelist[0])) + + def funcdef(self, nodelist): + # funcdef: 'def' NAME parameters ':' suite + # parameters: '(' [varargslist] ')' + + lineno = nodelist[1][2] + name = nodelist[1][1] + args = nodelist[2][2] + + if args[0] == symbol.varargslist: + names, defaults, flags = self.com_arglist(args[1:]) + else: + names = defaults = () + flags = 0 + doc = self.get_docstring(nodelist[4]) + + # code for function + code = self.com_node(nodelist[4]) + + if doc is not None: + assert isinstance(code, Stmt) + assert isinstance(code.nodes[0], Discard) + del code.nodes[0] + n = Function(name, names, defaults, flags, doc, code) + n.lineno = lineno + return n + + def lambdef(self, nodelist): + # lambdef: 'lambda' [varargslist] ':' test + if nodelist[2][0] == symbol.varargslist: + names, defaults, flags = self.com_arglist(nodelist[2][1:]) + else: + names = defaults = () + flags = 0 + + # code for lambda + code = self.com_node(nodelist[-1]) + + n = Lambda(names, defaults, flags, code) + n.lineno = nodelist[1][2] + return n + + def classdef(self, nodelist): + # classdef: 'class' NAME ['(' testlist ')'] ':' suite + + name = nodelist[1][1] + doc = self.get_docstring(nodelist[-1]) + if nodelist[2][0] == token.COLON: + bases = [] + else: + bases = self.com_bases(nodelist[3]) + + # code for class + code = self.com_node(nodelist[-1]) + + if doc is not None: + assert isinstance(code, Stmt) + assert isinstance(code.nodes[0], Discard) + del code.nodes[0] + + n = Class(name, bases, doc, code) + n.lineno = nodelist[1][2] + return n + + def stmt(self, nodelist): + return self.com_stmt(nodelist[0]) + + small_stmt = stmt + flow_stmt = stmt + compound_stmt = stmt + + def simple_stmt(self, nodelist): + # small_stmt (';' small_stmt)* [';'] NEWLINE + stmts = [] + for i in range(0, len(nodelist), 2): + self.com_append_stmt(stmts, nodelist[i]) + return Stmt(stmts) + + def parameters(self, nodelist): + raise error + + def varargslist(self, nodelist): + raise error + + def fpdef(self, nodelist): + raise error + + def fplist(self, nodelist): + raise error + + def dotted_name(self, nodelist): + raise error + + def comp_op(self, nodelist): + raise error + + def trailer(self, nodelist): + raise error + + def sliceop(self, nodelist): + raise error + + def argument(self, nodelist): + raise error + + # -------------------------------------------------------------- + # + # STATEMENT NODES (invoked by com_node()) + # + + def expr_stmt(self, nodelist): + # augassign testlist | testlist ('=' testlist)* + en = nodelist[-1] + exprNode = self.lookup_node(en)(en[1:]) + if len(nodelist) == 1: + n = Discard(exprNode) + n.lineno = exprNode.lineno + return n + if nodelist[1][0] == token.EQUAL: + nodes = [] + for i in range(0, len(nodelist) - 2, 2): + nodes.append(self.com_assign(nodelist[i], OP_ASSIGN)) + n = Assign(nodes, exprNode) + n.lineno = nodelist[1][2] + else: + lval = self.com_augassign(nodelist[0]) + op = self.com_augassign_op(nodelist[1]) + n = AugAssign(lval, op[1], exprNode) + n.lineno = op[2] + return n + + def print_stmt(self, nodelist): + # print ([ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ]) + items = [] + if len(nodelist) == 1: + start = 1 + dest = None + elif nodelist[1][0] == token.RIGHTSHIFT: + assert len(nodelist) == 3 \ + or nodelist[3][0] == token.COMMA + dest = self.com_node(nodelist[2]) + start = 4 + else: + dest = None + start = 1 + for i in range(start, len(nodelist), 2): + items.append(self.com_node(nodelist[i])) + if nodelist[-1][0] == token.COMMA: + n = Print(items, dest) + n.lineno = nodelist[0][2] + return n + n = Printnl(items, dest) + n.lineno = nodelist[0][2] + return n + + def del_stmt(self, nodelist): + return self.com_assign(nodelist[1], OP_DELETE) + + def pass_stmt(self, nodelist): + n = Pass() + n.lineno = nodelist[0][2] + return n + + def break_stmt(self, nodelist): + n = Break() + n.lineno = nodelist[0][2] + return n + + def continue_stmt(self, nodelist): + n = Continue() + n.lineno = nodelist[0][2] + return n + + def return_stmt(self, nodelist): + # return: [testlist] + if len(nodelist) < 2: + n = Return(Const(None)) + n.lineno = nodelist[0][2] + return n + n = Return(self.com_node(nodelist[1])) + n.lineno = nodelist[0][2] + return n + + def yield_stmt(self, nodelist): + n = Yield(self.com_node(nodelist[1])) + n.lineno = nodelist[0][2] + return n + + def raise_stmt(self, nodelist): + # raise: [test [',' test [',' test]]] + if len(nodelist) > 5: + expr3 = self.com_node(nodelist[5]) + else: + expr3 = None + if len(nodelist) > 3: + expr2 = self.com_node(nodelist[3]) + else: + expr2 = None + if len(nodelist) > 1: + expr1 = self.com_node(nodelist[1]) + else: + expr1 = None + n = Raise(expr1, expr2, expr3) + n.lineno = nodelist[0][2] + return n + + def import_stmt(self, nodelist): + # import_stmt: 'import' dotted_as_name (',' dotted_as_name)* | + # from: 'from' dotted_name 'import' + # ('*' | import_as_name (',' import_as_name)*) + if nodelist[0][1] == 'from': + names = [] + if nodelist[3][0] == token.NAME: + for i in range(3, len(nodelist), 2): + names.append((nodelist[i][1], None)) + else: + for i in range(3, len(nodelist), 2): + names.append(self.com_import_as_name(nodelist[i])) + n = From(self.com_dotted_name(nodelist[1]), names) + n.lineno = nodelist[0][2] + return n + + if nodelist[1][0] == symbol.dotted_name: + names = [(self.com_dotted_name(nodelist[1][1:]), None)] + else: + names = [] + for i in range(1, len(nodelist), 2): + names.append(self.com_dotted_as_name(nodelist[i])) + n = Import(names) + n.lineno = nodelist[0][2] + return n + + def global_stmt(self, nodelist): + # global: NAME (',' NAME)* + names = [] + for i in range(1, len(nodelist), 2): + names.append(nodelist[i][1]) + n = Global(names) + n.lineno = nodelist[0][2] + return n + + def exec_stmt(self, nodelist): + # exec_stmt: 'exec' expr ['in' expr [',' expr]] + expr1 = self.com_node(nodelist[1]) + if len(nodelist) >= 4: + expr2 = self.com_node(nodelist[3]) + if len(nodelist) >= 6: + expr3 = self.com_node(nodelist[5]) + else: + expr3 = None + else: + expr2 = expr3 = None + + n = Exec(expr1, expr2, expr3) + n.lineno = nodelist[0][2] + return n + + def assert_stmt(self, nodelist): + # 'assert': test, [',' test] + expr1 = self.com_node(nodelist[1]) + if (len(nodelist) == 4): + expr2 = self.com_node(nodelist[3]) + else: + expr2 = None + n = Assert(expr1, expr2) + n.lineno = nodelist[0][2] + return n + + def if_stmt(self, nodelist): + # if: test ':' suite ('elif' test ':' suite)* ['else' ':' suite] + tests = [] + for i in range(0, len(nodelist) - 3, 4): + testNode = self.com_node(nodelist[i + 1]) + suiteNode = self.com_node(nodelist[i + 3]) + tests.append((testNode, suiteNode)) + + if len(nodelist) % 4 == 3: + elseNode = self.com_node(nodelist[-1]) +## elseNode.lineno = nodelist[-1][1][2] + else: + elseNode = None + n = If(tests, elseNode) + n.lineno = nodelist[0][2] + return n + + def while_stmt(self, nodelist): + # 'while' test ':' suite ['else' ':' suite] + + testNode = self.com_node(nodelist[1]) + bodyNode = self.com_node(nodelist[3]) + + if len(nodelist) > 4: + elseNode = self.com_node(nodelist[6]) + else: + elseNode = None + + n = While(testNode, bodyNode, elseNode) + n.lineno = nodelist[0][2] + return n + + def for_stmt(self, nodelist): + # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] + + assignNode = self.com_assign(nodelist[1], OP_ASSIGN) + listNode = self.com_node(nodelist[3]) + bodyNode = self.com_node(nodelist[5]) + + if len(nodelist) > 8: + elseNode = self.com_node(nodelist[8]) + else: + elseNode = None + + n = For(assignNode, listNode, bodyNode, elseNode) + n.lineno = nodelist[0][2] + return n + + def try_stmt(self, nodelist): + # 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] + # | 'try' ':' suite 'finally' ':' suite + if nodelist[3][0] != symbol.except_clause: + return self.com_try_finally(nodelist) + + return self.com_try_except(nodelist) + + def suite(self, nodelist): + # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT + if len(nodelist) == 1: + return self.com_stmt(nodelist[0]) + + stmts = [] + for node in nodelist: + if node[0] == symbol.stmt: + self.com_append_stmt(stmts, node) + return Stmt(stmts) + + # -------------------------------------------------------------- + # + # EXPRESSION NODES (invoked by com_node()) + # + + def testlist(self, nodelist): + # testlist: expr (',' expr)* [','] + # testlist_safe: test [(',' test)+ [',']] + # exprlist: expr (',' expr)* [','] + return self.com_binary(Tuple, nodelist) + + testlist_safe = testlist # XXX + exprlist = testlist + + def test(self, nodelist): + # and_test ('or' and_test)* | lambdef + if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef: + return self.lambdef(nodelist[0]) + return self.com_binary(Or, nodelist) + + def and_test(self, nodelist): + # not_test ('and' not_test)* + return self.com_binary(And, nodelist) + + def not_test(self, nodelist): + # 'not' not_test | comparison + result = self.com_node(nodelist[-1]) + if len(nodelist) == 2: + n = Not(result) + n.lineno = nodelist[0][2] + return n + return result + + def comparison(self, nodelist): + # comparison: expr (comp_op expr)* + node = self.com_node(nodelist[0]) + if len(nodelist) == 1: + return node + + results = [] + for i in range(2, len(nodelist), 2): + nl = nodelist[i-1] + + # comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '==' + # | 'in' | 'not' 'in' | 'is' | 'is' 'not' + n = nl[1] + if n[0] == token.NAME: + type = n[1] + if len(nl) == 3: + if type == 'not': + type = 'not in' + else: + type = 'is not' + else: + type = _cmp_types[n[0]] + + lineno = nl[1][2] + results.append((type, self.com_node(nodelist[i]))) + + # we need a special "compare" node so that we can distinguish + # 3 < x < 5 from (3 < x) < 5 + # the two have very different semantics and results (note that the + # latter form is always true) + + n = Compare(node, results) + n.lineno = lineno + return n + + def expr(self, nodelist): + # xor_expr ('|' xor_expr)* + return self.com_binary(Bitor, nodelist) + + def xor_expr(self, nodelist): + # xor_expr ('^' xor_expr)* + return self.com_binary(Bitxor, nodelist) + + def and_expr(self, nodelist): + # xor_expr ('&' xor_expr)* + return self.com_binary(Bitand, nodelist) + + def shift_expr(self, nodelist): + # shift_expr ('<<'|'>>' shift_expr)* + node = self.com_node(nodelist[0]) + for i in range(2, len(nodelist), 2): + right = self.com_node(nodelist[i]) + if nodelist[i-1][0] == token.LEFTSHIFT: + node = LeftShift([node, right]) + node.lineno = nodelist[1][2] + elif nodelist[i-1][0] == token.RIGHTSHIFT: + node = RightShift([node, right]) + node.lineno = nodelist[1][2] + else: + raise ValueError, "unexpected token: %s" % nodelist[i-1][0] + return node + + def arith_expr(self, nodelist): + node = self.com_node(nodelist[0]) + for i in range(2, len(nodelist), 2): + right = self.com_node(nodelist[i]) + if nodelist[i-1][0] == token.PLUS: + node = Add([node, right]) + node.lineno = nodelist[1][2] + elif nodelist[i-1][0] == token.MINUS: + node = Sub([node, right]) + node.lineno = nodelist[1][2] + else: + raise ValueError, "unexpected token: %s" % nodelist[i-1][0] + return node + + def term(self, nodelist): + node = self.com_node(nodelist[0]) + for i in range(2, len(nodelist), 2): + right = self.com_node(nodelist[i]) + t = nodelist[i-1][0] + if t == token.STAR: + node = Mul([node, right]) + elif t == token.SLASH: + node = Div([node, right]) + elif t == token.PERCENT: + node = Mod([node, right]) + elif t == token.DOUBLESLASH: + node = FloorDiv([node, right]) + else: + raise ValueError, "unexpected token: %s" % t + node.lineno = nodelist[1][2] + return node + + def factor(self, nodelist): + elt = nodelist[0] + t = elt[0] + node = self.com_node(nodelist[-1]) + if t == token.PLUS: + node = UnaryAdd(node) + node.lineno = elt[2] + elif t == token.MINUS: + node = UnarySub(node) + node.lineno = elt[2] + elif t == token.TILDE: + node = Invert(node) + node.lineno = elt[2] + return node + + def power(self, nodelist): + # power: atom trailer* ('**' factor)* + node = self.com_node(nodelist[0]) + for i in range(1, len(nodelist)): + elt = nodelist[i] + if elt[0] == token.DOUBLESTAR: + n = Power([node, self.com_node(nodelist[i+1])]) + n.lineno = elt[2] + return n + + node = self.com_apply_trailer(node, elt) + + return node + + def atom(self, nodelist): + n = self._atom_dispatch[nodelist[0][0]](nodelist) + n.lineno = nodelist[0][2] + return n + + def atom_lpar(self, nodelist): + if nodelist[1][0] == token.RPAR: + n = Tuple(()) + n.lineno = nodelist[0][2] + return n + return self.com_node(nodelist[1]) + + def atom_lsqb(self, nodelist): + if nodelist[1][0] == token.RSQB: + n = List(()) + n.lineno = nodelist[0][2] + return n + return self.com_list_constructor(nodelist[1]) + + def atom_lbrace(self, nodelist): + if nodelist[1][0] == token.RBRACE: + return Dict(()) + return self.com_dictmaker(nodelist[1]) + + def atom_backquote(self, nodelist): + n = Backquote(self.com_node(nodelist[1])) + n.lineno = nodelist[0][2] + return n + + def atom_number(self, nodelist): + ### need to verify this matches compile.c + k = eval(nodelist[0][1]) + n = Const(k) + n.lineno = nodelist[0][2] + return n + + def atom_string(self, nodelist): + ### need to verify this matches compile.c + k = '' + for node in nodelist: + k = k + eval(node[1]) + n = Const(k) + n.lineno = nodelist[0][2] + return n + + def atom_name(self, nodelist): + ### any processing to do? + n = Name(nodelist[0][1]) + n.lineno = nodelist[0][2] + return n + + # -------------------------------------------------------------- + # + # INTERNAL PARSING UTILITIES + # + + # The use of com_node() introduces a lot of extra stack frames, + # enough to cause a stack overflow compiling test.test_parser with + # the standard interpreter recursionlimit. The com_node() is a + # convenience function that hides the dispatch details, but comes + # at a very high cost. It is more efficient to dispatch directly + # in the callers. In these cases, use lookup_node() and call the + # dispatched node directly. + + def lookup_node(self, node): + return self._dispatch[node[0]] + + def com_node(self, node): + # Note: compile.c has handling in com_node for del_stmt, pass_stmt, + # break_stmt, stmt, small_stmt, flow_stmt, simple_stmt, + # and compound_stmt. + # We'll just dispatch them. + return self._dispatch[node[0]](node[1:]) + + def com_NEWLINE(self, *args): + # A ';' at the end of a line can make a NEWLINE token appear + # here, Render it harmless. (genc discards ('discard', + # ('const', xxxx)) Nodes) + return Discard(Const(None)) + + def com_arglist(self, nodelist): + # varargslist: + # (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) + # | fpdef ['=' test] (',' fpdef ['=' test])* [','] + # fpdef: NAME | '(' fplist ')' + # fplist: fpdef (',' fpdef)* [','] + names = [] + defaults = [] + flags = 0 + + i = 0 + while i < len(nodelist): + node = nodelist[i] + if node[0] == token.STAR or node[0] == token.DOUBLESTAR: + if node[0] == token.STAR: + node = nodelist[i+1] + if node[0] == token.NAME: + names.append(node[1]) + flags = flags | CO_VARARGS + i = i + 3 + + if i < len(nodelist): + # should be DOUBLESTAR + t = nodelist[i][0] + if t == token.DOUBLESTAR: + node = nodelist[i+1] + else: + raise ValueError, "unexpected token: %s" % t + names.append(node[1]) + flags = flags | CO_VARKEYWORDS + + break + + # fpdef: NAME | '(' fplist ')' + names.append(self.com_fpdef(node)) + + i = i + 1 + if i >= len(nodelist): + break + + if nodelist[i][0] == token.EQUAL: + defaults.append(self.com_node(nodelist[i + 1])) + i = i + 2 + elif len(defaults): + # Treat "(a=1, b)" as "(a=1, b=None)" + defaults.append(Const(None)) + + i = i + 1 + + return names, defaults, flags + + def com_fpdef(self, node): + # fpdef: NAME | '(' fplist ')' + if node[1][0] == token.LPAR: + return self.com_fplist(node[2]) + return node[1][1] + + def com_fplist(self, node): + # fplist: fpdef (',' fpdef)* [','] + if len(node) == 2: + return self.com_fpdef(node[1]) + list = [] + for i in range(1, len(node), 2): + list.append(self.com_fpdef(node[i])) + return tuple(list) + + def com_dotted_name(self, node): + # String together the dotted names and return the string + name = "" + for n in node: + if type(n) == type(()) and n[0] == 1: + name = name + n[1] + '.' + return name[:-1] + + def com_dotted_as_name(self, node): + dot = self.com_dotted_name(node[1]) + if len(node) <= 2: + return dot, None + if node[0] == symbol.dotted_name: + pass + else: + assert node[2][1] == 'as' + assert node[3][0] == token.NAME + return dot, node[3][1] + + def com_import_as_name(self, node): + if node[0] == token.STAR: + return '*', None + assert node[0] == symbol.import_as_name + node = node[1:] + if len(node) == 1: + assert node[0][0] == token.NAME + return node[0][1], None + + assert node[1][1] == 'as', node + assert node[2][0] == token.NAME + return node[0][1], node[2][1] + + def com_bases(self, node): + bases = [] + for i in range(1, len(node), 2): + bases.append(self.com_node(node[i])) + return bases + + def com_try_finally(self, nodelist): + # try_fin_stmt: "try" ":" suite "finally" ":" suite + n = TryFinally(self.com_node(nodelist[2]), + self.com_node(nodelist[5])) + n.lineno = nodelist[0][2] + return n + + def com_try_except(self, nodelist): + # try_except: 'try' ':' suite (except_clause ':' suite)* ['else' suite] + #tryexcept: [TryNode, [except_clauses], elseNode)] + stmt = self.com_node(nodelist[2]) + clauses = [] + elseNode = None + for i in range(3, len(nodelist), 3): + node = nodelist[i] + if node[0] == symbol.except_clause: + # except_clause: 'except' [expr [',' expr]] */ + if len(node) > 2: + expr1 = self.com_node(node[2]) + if len(node) > 4: + expr2 = self.com_assign(node[4], OP_ASSIGN) + else: + expr2 = None + else: + expr1 = expr2 = None + clauses.append((expr1, expr2, self.com_node(nodelist[i+2]))) + + if node[0] == token.NAME: + elseNode = self.com_node(nodelist[i+2]) + n = TryExcept(self.com_node(nodelist[2]), clauses, elseNode) + n.lineno = nodelist[0][2] + return n + + def com_augassign_op(self, node): + assert node[0] == symbol.augassign + return node[1] + + def com_augassign(self, node): + """Return node suitable for lvalue of augmented assignment + + Names, slices, and attributes are the only allowable nodes. + """ + l = self.com_node(node) + if l.__class__ in (Name, Slice, Subscript, Getattr): + return l + raise SyntaxError, "can't assign to %s" % l.__class__.__name__ + + def com_assign(self, node, assigning): + # return a node suitable for use as an "lvalue" + # loop to avoid trivial recursion + while 1: + t = node[0] + if t == symbol.exprlist or t == symbol.testlist: + if len(node) > 2: + return self.com_assign_tuple(node, assigning) + node = node[1] + elif t in _assign_types: + if len(node) > 2: + raise SyntaxError, "can't assign to operator" + node = node[1] + elif t == symbol.power: + if node[1][0] != symbol.atom: + raise SyntaxError, "can't assign to operator" + if len(node) > 2: + primary = self.com_node(node[1]) + for i in range(2, len(node)-1): + ch = node[i] + if ch[0] == token.DOUBLESTAR: + raise SyntaxError, "can't assign to operator" + primary = self.com_apply_trailer(primary, ch) + return self.com_assign_trailer(primary, node[-1], + assigning) + node = node[1] + elif t == symbol.atom: + t = node[1][0] + if t == token.LPAR: + node = node[2] + if node[0] == token.RPAR: + raise SyntaxError, "can't assign to ()" + elif t == token.LSQB: + node = node[2] + if node[0] == token.RSQB: + raise SyntaxError, "can't assign to []" + return self.com_assign_list(node, assigning) + elif t == token.NAME: + return self.com_assign_name(node[1], assigning) + else: + raise SyntaxError, "can't assign to literal" + else: + raise SyntaxError, "bad assignment" + + def com_assign_tuple(self, node, assigning): + assigns = [] + for i in range(1, len(node), 2): + assigns.append(self.com_assign(node[i], assigning)) + return AssTuple(assigns) + + def com_assign_list(self, node, assigning): + assigns = [] + for i in range(1, len(node), 2): + if i + 1 < len(node): + if node[i + 1][0] == symbol.list_for: + raise SyntaxError, "can't assign to list comprehension" + assert node[i + 1][0] == token.COMMA, node[i + 1] + assigns.append(self.com_assign(node[i], assigning)) + return AssList(assigns) + + def com_assign_name(self, node, assigning): + n = AssName(node[1], assigning) + n.lineno = node[2] + return n + + def com_assign_trailer(self, primary, node, assigning): + t = node[1][0] + if t == token.DOT: + return self.com_assign_attr(primary, node[2], assigning) + if t == token.LSQB: + return self.com_subscriptlist(primary, node[2], assigning) + if t == token.LPAR: + raise SyntaxError, "can't assign to function call" + raise SyntaxError, "unknown trailer type: %s" % t + + def com_assign_attr(self, primary, node, assigning): + return AssAttr(primary, node[1], assigning) + + def com_binary(self, constructor, nodelist): + "Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])." + l = len(nodelist) + if l == 1: + n = nodelist[0] + return self.lookup_node(n)(n[1:]) + items = [] + for i in range(0, l, 2): + n = nodelist[i] + items.append(self.lookup_node(n)(n[1:])) + return constructor(items) + + def com_stmt(self, node): + result = self.lookup_node(node)(node[1:]) + assert result is not None + if isinstance(result, Stmt): + return result + return Stmt([result]) + + def com_append_stmt(self, stmts, node): + result = self.com_node(node) + assert result is not None + if isinstance(result, Stmt): + stmts.extend(result.nodes) + else: + stmts.append(result) + + if hasattr(symbol, 'list_for'): + def com_list_constructor(self, nodelist): + # listmaker: test ( list_for | (',' test)* [','] ) + values = [] + for i in range(1, len(nodelist)): + if nodelist[i][0] == symbol.list_for: + assert len(nodelist[i:]) == 1 + return self.com_list_comprehension(values[0], + nodelist[i]) + elif nodelist[i][0] == token.COMMA: + continue + values.append(self.com_node(nodelist[i])) + return List(values) + + def com_list_comprehension(self, expr, node): + # list_iter: list_for | list_if + # list_for: 'for' exprlist 'in' testlist [list_iter] + # list_if: 'if' test [list_iter] + + # XXX should raise SyntaxError for assignment + + lineno = node[1][2] + fors = [] + while node: + t = node[1][1] + if t == 'for': + assignNode = self.com_assign(node[2], OP_ASSIGN) + listNode = self.com_node(node[4]) + newfor = ListCompFor(assignNode, listNode, []) + newfor.lineno = node[1][2] + fors.append(newfor) + if len(node) == 5: + node = None + else: + node = self.com_list_iter(node[5]) + elif t == 'if': + test = self.com_node(node[2]) + newif = ListCompIf(test) + newif.lineno = node[1][2] + newfor.ifs.append(newif) + if len(node) == 3: + node = None + else: + node = self.com_list_iter(node[3]) + else: + raise SyntaxError, \ + ("unexpected list comprehension element: %s %d" + % (node, lineno)) + n = ListComp(expr, fors) + n.lineno = lineno + return n + + def com_list_iter(self, node): + assert node[0] == symbol.list_iter + return node[1] + else: + def com_list_constructor(self, nodelist): + values = [] + for i in range(1, len(nodelist), 2): + values.append(self.com_node(nodelist[i])) + return List(values) + + def com_dictmaker(self, nodelist): + # dictmaker: test ':' test (',' test ':' value)* [','] + items = [] + for i in range(1, len(nodelist), 4): + items.append((self.com_node(nodelist[i]), + self.com_node(nodelist[i+2]))) + return Dict(items) + + def com_apply_trailer(self, primaryNode, nodelist): + t = nodelist[1][0] + if t == token.LPAR: + return self.com_call_function(primaryNode, nodelist[2]) + if t == token.DOT: + return self.com_select_member(primaryNode, nodelist[2]) + if t == token.LSQB: + return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY) + + raise SyntaxError, 'unknown node type: %s' % t + + def com_select_member(self, primaryNode, nodelist): + if nodelist[0] != token.NAME: + raise SyntaxError, "member must be a name" + n = Getattr(primaryNode, nodelist[1]) + n.lineno = nodelist[2] + return n + + def com_call_function(self, primaryNode, nodelist): + if nodelist[0] == token.RPAR: + return CallFunc(primaryNode, []) + args = [] + kw = 0 + len_nodelist = len(nodelist) + for i in range(1, len_nodelist, 2): + node = nodelist[i] + if node[0] == token.STAR or node[0] == token.DOUBLESTAR: + break + kw, result = self.com_argument(node, kw) + args.append(result) + else: + # No broken by star arg, so skip the last one we processed. + i = i + 1 + if i < len_nodelist and nodelist[i][0] == token.COMMA: + # need to accept an application that looks like "f(a, b,)" + i = i + 1 + star_node = dstar_node = None + while i < len_nodelist: + tok = nodelist[i] + ch = nodelist[i+1] + i = i + 3 + if tok[0]==token.STAR: + if star_node is not None: + raise SyntaxError, 'already have the varargs indentifier' + star_node = self.com_node(ch) + elif tok[0]==token.DOUBLESTAR: + if dstar_node is not None: + raise SyntaxError, 'already have the kwargs indentifier' + dstar_node = self.com_node(ch) + else: + raise SyntaxError, 'unknown node type: %s' % tok + + return CallFunc(primaryNode, args, star_node, dstar_node) + + def com_argument(self, nodelist, kw): + if len(nodelist) == 2: + if kw: + raise SyntaxError, "non-keyword arg after keyword arg" + return 0, self.com_node(nodelist[1]) + result = self.com_node(nodelist[3]) + n = nodelist[1] + while len(n) == 2 and n[0] != token.NAME: + n = n[1] + if n[0] != token.NAME: + raise SyntaxError, "keyword can't be an expression (%s)"%n[0] + node = Keyword(n[1], result) + node.lineno = n[2] + return 1, node + + def com_subscriptlist(self, primary, nodelist, assigning): + # slicing: simple_slicing | extended_slicing + # simple_slicing: primary "[" short_slice "]" + # extended_slicing: primary "[" slice_list "]" + # slice_list: slice_item ("," slice_item)* [","] + + # backwards compat slice for '[i:j]' + if len(nodelist) == 2: + sub = nodelist[1] + if (sub[1][0] == token.COLON or \ + (len(sub) > 2 and sub[2][0] == token.COLON)) and \ + sub[-1][0] != symbol.sliceop: + return self.com_slice(primary, sub, assigning) + + subscripts = [] + for i in range(1, len(nodelist), 2): + subscripts.append(self.com_subscript(nodelist[i])) + + return Subscript(primary, assigning, subscripts) + + def com_subscript(self, node): + # slice_item: expression | proper_slice | ellipsis + ch = node[1] + t = ch[0] + if t == token.DOT and node[2][0] == token.DOT: + return Ellipsis() + if t == token.COLON or len(node) > 2: + return self.com_sliceobj(node) + return self.com_node(ch) + + def com_sliceobj(self, node): + # proper_slice: short_slice | long_slice + # short_slice: [lower_bound] ":" [upper_bound] + # long_slice: short_slice ":" [stride] + # lower_bound: expression + # upper_bound: expression + # stride: expression + # + # Note: a stride may be further slicing... + + items = [] + + if node[1][0] == token.COLON: + items.append(Const(None)) + i = 2 + else: + items.append(self.com_node(node[1])) + # i == 2 is a COLON + i = 3 + + if i < len(node) and node[i][0] == symbol.test: + items.append(self.com_node(node[i])) + i = i + 1 + else: + items.append(Const(None)) + + # a short_slice has been built. look for long_slice now by looking + # for strides... + for j in range(i, len(node)): + ch = node[j] + if len(ch) == 2: + items.append(Const(None)) + else: + items.append(self.com_node(ch[2])) + + return Sliceobj(items) + + def com_slice(self, primary, node, assigning): + # short_slice: [lower_bound] ":" [upper_bound] + lower = upper = None + if len(node) == 3: + if node[1][0] == token.COLON: + upper = self.com_node(node[2]) + else: + lower = self.com_node(node[1]) + elif len(node) == 4: + lower = self.com_node(node[1]) + upper = self.com_node(node[3]) + return Slice(primary, assigning, lower, upper) + + def get_docstring(self, node, n=None): + if n is None: + n = node[0] + node = node[1:] + if n == symbol.suite: + if len(node) == 1: + return self.get_docstring(node[0]) + for sub in node: + if sub[0] == symbol.stmt: + return self.get_docstring(sub) + return None + if n == symbol.file_input: + for sub in node: + if sub[0] == symbol.stmt: + return self.get_docstring(sub) + return None + if n == symbol.atom: + if node[0][0] == token.STRING: + s = '' + for t in node: + s = s + eval(t[1]) + return s + return None + if n == symbol.stmt or n == symbol.simple_stmt \ + or n == symbol.small_stmt: + return self.get_docstring(node[0]) + if n in _doc_nodes and len(node) == 1: + return self.get_docstring(node[0]) + return None + + +_doc_nodes = [ + symbol.expr_stmt, + symbol.testlist, + symbol.testlist_safe, + symbol.test, + symbol.and_test, + symbol.not_test, + symbol.comparison, + symbol.expr, + symbol.xor_expr, + symbol.and_expr, + symbol.shift_expr, + symbol.arith_expr, + symbol.term, + symbol.factor, + symbol.power, + ] + +# comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '==' +# | 'in' | 'not' 'in' | 'is' | 'is' 'not' +_cmp_types = { + token.LESS : '<', + token.GREATER : '>', + token.EQEQUAL : '==', + token.EQUAL : '==', + token.LESSEQUAL : '<=', + token.GREATEREQUAL : '>=', + token.NOTEQUAL : '!=', + } + +_legal_node_types = [ + symbol.funcdef, + symbol.classdef, + symbol.stmt, + symbol.small_stmt, + symbol.flow_stmt, + symbol.simple_stmt, + symbol.compound_stmt, + symbol.expr_stmt, + symbol.print_stmt, + symbol.del_stmt, + symbol.pass_stmt, + symbol.break_stmt, + symbol.continue_stmt, + symbol.return_stmt, + symbol.raise_stmt, + symbol.import_stmt, + symbol.global_stmt, + symbol.exec_stmt, + symbol.assert_stmt, + symbol.if_stmt, + symbol.while_stmt, + symbol.for_stmt, + symbol.try_stmt, + symbol.suite, + symbol.testlist, + symbol.testlist_safe, + symbol.test, + symbol.and_test, + symbol.not_test, + symbol.comparison, + symbol.exprlist, + symbol.expr, + symbol.xor_expr, + symbol.and_expr, + symbol.shift_expr, + symbol.arith_expr, + symbol.term, + symbol.factor, + symbol.power, + symbol.atom, + ] + +if hasattr(symbol, 'yield_stmt'): + _legal_node_types.append(symbol.yield_stmt) + +_assign_types = [ + symbol.test, + symbol.and_test, + symbol.not_test, + symbol.comparison, + symbol.expr, + symbol.xor_expr, + symbol.and_expr, + symbol.shift_expr, + symbol.arith_expr, + symbol.term, + symbol.factor, + ] + +import types +_names = {} +for k, v in symbol.sym_name.items(): + _names[k] = v +for k, v in token.tok_name.items(): + _names[k] = v + +def debug_tree(tree): + l = [] + for elt in tree: + if type(elt) == types.IntType: + l.append(_names.get(elt, elt)) + elif type(elt) == types.StringType: + l.append(elt) + else: + l.append(debug_tree(elt)) + return l diff --git a/lib-python/2.2/compiler/visitor.py b/lib-python/2.2/compiler/visitor.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/compiler/visitor.py @@ -0,0 +1,121 @@ +from compiler import ast + +# XXX should probably rename ASTVisitor to ASTWalker +# XXX can it be made even more generic? + +class ASTVisitor: + """Performs a depth-first walk of the AST + + The ASTVisitor will walk the AST, performing either a preorder or + postorder traversal depending on which method is called. + + methods: + preorder(tree, visitor) + postorder(tree, visitor) + tree: an instance of ast.Node + visitor: an instance with visitXXX methods + + The ASTVisitor is responsible for walking over the tree in the + correct order. For each node, it checks the visitor argument for + a method named 'visitNodeType' where NodeType is the name of the + node's class, e.g. Class. If the method exists, it is called + with the node as its sole argument. + + The visitor method for a particular node type can control how + child nodes are visited during a preorder walk. (It can't control + the order during a postorder walk, because it is called _after_ + the walk has occurred.) The ASTVisitor modifies the visitor + argument by adding a visit method to the visitor; this method can + be used to visit a particular child node. If the visitor method + returns a true value, the ASTVisitor will not traverse the child + nodes. + + XXX The interface for controlling the preorder walk needs to be + re-considered. The current interface is convenient for visitors + that mostly let the ASTVisitor do everything. For something like + a code generator, where you want to walk to occur in a specific + order, it's a pain to add "return 1" to the end of each method. + """ + + VERBOSE = 0 + + def __init__(self): + self.node = None + self._cache = {} + + def default(self, node, *args): + for child in node.getChildNodes(): + self.dispatch(child, *args) + + def dispatch(self, node, *args): + self.node = node + klass = node.__class__ + meth = self._cache.get(klass, None) + if meth is None: + className = klass.__name__ + meth = getattr(self.visitor, 'visit' + className, self.default) + self._cache[klass] = meth +## if self.VERBOSE > 0: +## className = klass.__name__ +## if self.VERBOSE == 1: +## if meth == 0: +## print "dispatch", className +## else: +## print "dispatch", className, (meth and meth.__name__ or '') + return meth(node, *args) + + def preorder(self, tree, visitor, *args): + """Do preorder walk of tree using visitor""" + self.visitor = visitor + visitor.visit = self.dispatch + self.dispatch(tree, *args) # XXX *args make sense? + +class ExampleASTVisitor(ASTVisitor): + """Prints examples of the nodes that aren't visited + + This visitor-driver is only useful for development, when it's + helpful to develop a visitor incremently, and get feedback on what + you still have to do. + """ + examples = {} + + def dispatch(self, node, *args): + self.node = node + meth = self._cache.get(node.__class__, None) + className = node.__class__.__name__ + if meth is None: + meth = getattr(self.visitor, 'visit' + className, 0) + self._cache[node.__class__] = meth + if self.VERBOSE > 1: + print "dispatch", className, (meth and meth.__name__ or '') + if meth: + meth(node, *args) + elif self.VERBOSE > 0: + klass = node.__class__ + if not self.examples.has_key(klass): + self.examples[klass] = klass + print + print self.visitor + print klass + for attr in dir(node): + if attr[0] != '_': + print "\t", "%-12.12s" % attr, getattr(node, attr) + print + return self.default(node, *args) + +# XXX this is an API change + +_walker = ASTVisitor +def walk(tree, visitor, walker=None, verbose=None): + if walker is None: + walker = _walker() + if verbose is not None: + walker.VERBOSE = verbose + walker.preorder(tree, visitor) + return walker.visitor + +def dumpNode(node): + print node.__class__ + for attr in dir(node): + if attr[0] != '_': + print "\t", "%-10.10s" % attr, getattr(node, attr) diff --git a/lib-python/2.2/copy.py b/lib-python/2.2/copy.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/copy.py @@ -0,0 +1,381 @@ +"""Generic (shallow and deep) copying operations. + +Interface summary: + + import copy + + x = copy.copy(y) # make a shallow copy of y + x = copy.deepcopy(y) # make a deep copy of y + +For module specific errors, copy.error is raised. + +The difference between shallow and deep copying is only relevant for +compound objects (objects that contain other objects, like lists or +class instances). + +- A shallow copy constructs a new compound object and then (to the + extent possible) inserts *the same objects* into in that the + original contains. + +- A deep copy constructs a new compound object and then, recursively, + inserts *copies* into it of the objects found in the original. + +Two problems often exist with deep copy operations that don't exist +with shallow copy operations: + + a) recursive objects (compound objects that, directly or indirectly, + contain a reference to themselves) may cause a recursive loop + + b) because deep copy copies *everything* it may copy too much, e.g. + administrative data structures that should be shared even between + copies + +Python's deep copy operation avoids these problems by: + + a) keeping a table of objects already copied during the current + copying pass + + b) letting user-defined classes override the copying operation or the + set of components copied + +This version does not copy types like module, class, function, method, +nor stack trace, stack frame, nor file, socket, window, nor array, nor +any similar types. + +Classes can use the same interfaces to control copying that they use +to control pickling: they can define methods called __getinitargs__(), +__getstate__() and __setstate__(). See the documentation for module +"pickle" for information on these methods. +""" + +# XXX need to support copy_reg here too... + +import types + +class Error(Exception): + pass +error = Error # backward compatibility + +try: + from org.python.core import PyStringMap +except ImportError: + PyStringMap = None + +__all__ = ["Error", "error", "copy", "deepcopy"] + +def copy(x): + """Shallow copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + try: + copierfunction = _copy_dispatch[type(x)] + except KeyError: + try: + copier = x.__copy__ + except AttributeError: + try: + reductor = x.__reduce__ + except AttributeError: + raise error, \ + "un(shallow)copyable object of type %s" % type(x) + else: + y = _reconstruct(x, reductor(), 0) + else: + y = copier() + else: + y = copierfunction(x) + return y + +_copy_dispatch = d = {} + +def _copy_atomic(x): + return x +d[types.NoneType] = _copy_atomic +d[types.IntType] = _copy_atomic +d[types.LongType] = _copy_atomic +d[types.FloatType] = _copy_atomic +try: + d[types.ComplexType] = _copy_atomic +except AttributeError: + pass +d[types.StringType] = _copy_atomic +try: + d[types.UnicodeType] = _copy_atomic +except AttributeError: + pass +try: + d[types.CodeType] = _copy_atomic +except AttributeError: + pass +d[types.TypeType] = _copy_atomic +d[types.XRangeType] = _copy_atomic +d[types.ClassType] = _copy_atomic +d[types.BuiltinFunctionType] = _copy_atomic + +def _copy_list(x): + return x[:] +d[types.ListType] = _copy_list + +def _copy_tuple(x): + return x[:] +d[types.TupleType] = _copy_tuple + +def _copy_dict(x): + return x.copy() +d[types.DictionaryType] = _copy_dict +if PyStringMap is not None: + d[PyStringMap] = _copy_dict + +def _copy_inst(x): + if hasattr(x, '__copy__'): + return x.__copy__() + if hasattr(x, '__getinitargs__'): + args = x.__getinitargs__() + y = apply(x.__class__, args) + else: + y = _EmptyClass() + y.__class__ = x.__class__ + if hasattr(x, '__getstate__'): + state = x.__getstate__() + else: + state = x.__dict__ + if hasattr(y, '__setstate__'): + y.__setstate__(state) + else: + y.__dict__.update(state) + return y +d[types.InstanceType] = _copy_inst + +del d + +def deepcopy(x, memo = None): + """Deep copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + if memo is None: + memo = {} + d = id(x) + if memo.has_key(d): + return memo[d] + try: + copierfunction = _deepcopy_dispatch[type(x)] + except KeyError: + try: + issc = issubclass(type(x), type) + except TypeError: + issc = 0 + if issc: + y = _deepcopy_dispatch[type](x, memo) + else: + try: + copier = x.__deepcopy__ + except AttributeError: + try: + reductor = x.__reduce__ + except AttributeError: + raise error, \ + "un-deep-copyable object of type %s" % type(x) + else: + y = _reconstruct(x, reductor(), 1, memo) + else: + y = copier(memo) + else: + y = copierfunction(x, memo) + memo[d] = y + _keep_alive(x, memo) # Make sure x lives at least as long as d + return y + +_deepcopy_dispatch = d = {} + +def _deepcopy_atomic(x, memo): + return x +d[types.NoneType] = _deepcopy_atomic +d[types.IntType] = _deepcopy_atomic +d[types.LongType] = _deepcopy_atomic +d[types.FloatType] = _deepcopy_atomic +try: + d[types.ComplexType] = _deepcopy_atomic +except AttributeError: + pass +d[types.StringType] = _deepcopy_atomic +try: + d[types.UnicodeType] = _deepcopy_atomic +except AttributeError: + pass +try: + d[types.CodeType] = _deepcopy_atomic +except AttributeError: + pass +d[types.TypeType] = _deepcopy_atomic +d[types.XRangeType] = _deepcopy_atomic +d[types.ClassType] = _deepcopy_atomic +d[types.BuiltinFunctionType] = _deepcopy_atomic + +def _deepcopy_list(x, memo): + y = [] + memo[id(x)] = y + for a in x: + y.append(deepcopy(a, memo)) + return y +d[types.ListType] = _deepcopy_list + +def _deepcopy_tuple(x, memo): + y = [] + for a in x: + y.append(deepcopy(a, memo)) + d = id(x) + try: + return memo[d] + except KeyError: + pass + for i in range(len(x)): + if x[i] is not y[i]: + y = tuple(y) + break + else: + y = x + memo[d] = y + return y +d[types.TupleType] = _deepcopy_tuple + +def _deepcopy_dict(x, memo): + y = {} + memo[id(x)] = y + for key in x.keys(): + y[deepcopy(key, memo)] = deepcopy(x[key], memo) + return y +d[types.DictionaryType] = _deepcopy_dict +if PyStringMap is not None: + d[PyStringMap] = _deepcopy_dict + +def _keep_alive(x, memo): + """Keeps a reference to the object x in the memo. + + Because we remember objects by their id, we have + to assure that possibly temporary objects are kept + alive by referencing them. + We store a reference at the id of the memo, which should + normally not be used unless someone tries to deepcopy + the memo itself... + """ + try: + memo[id(memo)].append(x) + except KeyError: + # aha, this is the first one :-) + memo[id(memo)]=[x] + +def _deepcopy_inst(x, memo): + if hasattr(x, '__deepcopy__'): + return x.__deepcopy__(memo) + if hasattr(x, '__getinitargs__'): + args = x.__getinitargs__() + args = deepcopy(args, memo) + y = apply(x.__class__, args) + else: + y = _EmptyClass() + y.__class__ = x.__class__ + memo[id(x)] = y + if hasattr(x, '__getstate__'): + state = x.__getstate__() + else: + state = x.__dict__ + state = deepcopy(state, memo) + if hasattr(y, '__setstate__'): + y.__setstate__(state) + else: + y.__dict__.update(state) + return y +d[types.InstanceType] = _deepcopy_inst + +def _reconstruct(x, info, deep, memo=None): + if isinstance(info, str): + return x + assert isinstance(info, tuple) + if memo is None: + memo = {} + n = len(info) + assert n in (2, 3) + callable, args = info[:2] + if n > 2: + state = info[2] + else: + state = {} + if deep: + args = deepcopy(args, memo) + y = callable(*args) + if state: + if deep: + state = deepcopy(state, memo) + if hasattr(y, '__setstate__'): + y.__setstate__(state) + else: + y.__dict__.update(state) + return y + +del d + +del types + +# Helper for instance creation without calling __init__ +class _EmptyClass: + pass + +def _test(): + l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'], + {'abc': 'ABC'}, (), [], {}] + l1 = copy(l) + print l1==l + l1 = map(copy, l) + print l1==l + l1 = deepcopy(l) + print l1==l + class C: + def __init__(self, arg=None): + self.a = 1 + self.arg = arg + if __name__ == '__main__': + import sys + file = sys.argv[0] + else: + file = __file__ + self.fp = open(file) + self.fp.close() + def __getstate__(self): + return {'a': self.a, 'arg': self.arg} + def __setstate__(self, state): + for key in state.keys(): + setattr(self, key, state[key]) + def __deepcopy__(self, memo = None): + new = self.__class__(deepcopy(self.arg, memo)) + new.a = self.a + return new + c = C('argument sketch') + l.append(c) + l2 = copy(l) + print l == l2 + print l + print l2 + l2 = deepcopy(l) + print l == l2 + print l + print l2 + l.append({l[1]: l, 'xyz': l[2]}) + l3 = copy(l) + import repr + print map(repr.repr, l) + print map(repr.repr, l1) + print map(repr.repr, l2) + print map(repr.repr, l3) + l3 = deepcopy(l) + import repr + print map(repr.repr, l) + print map(repr.repr, l1) + print map(repr.repr, l2) + print map(repr.repr, l3) + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/copy_reg.py b/lib-python/2.2/copy_reg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/copy_reg.py @@ -0,0 +1,78 @@ +"""Helper to provide extensibility for pickle/cPickle. + +This is only useful to add pickle support for extension types defined in +C, not for instances of user-defined classes. +""" + +from types import ClassType as _ClassType + +__all__ = ["pickle","constructor"] + +dispatch_table = {} +safe_constructors = {} + +def pickle(ob_type, pickle_function, constructor_ob=None): + if type(ob_type) is _ClassType: + raise TypeError("copy_reg is not intended for use with classes") + + if not callable(pickle_function): + raise TypeError("reduction functions must be callable") + dispatch_table[ob_type] = pickle_function + + if constructor_ob is not None: + constructor(constructor_ob) + +def constructor(object): + if not callable(object): + raise TypeError("constructors must be callable") + safe_constructors[object] = 1 + +# Example: provide pickling support for complex numbers. + +try: + complex +except NameError: + pass +else: + + def pickle_complex(c): + return complex, (c.real, c.imag) + + pickle(complex, pickle_complex, complex) + +# Support for picking new-style objects + +def _reconstructor(cls, base, state): + obj = base.__new__(cls, state) + base.__init__(obj, state) + return obj +_reconstructor.__safe_for_unpickling__ = 1 + +_HEAPTYPE = 1<<9 + +def _reduce(self): + for base in self.__class__.__mro__: + if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: + break + else: + base = object # not really reachable + if base is object: + state = None + else: + if base is self.__class__: + raise TypeError, "can't pickle %s objects" % base.__name__ + state = base(self) + args = (self.__class__, base, state) + try: + getstate = self.__getstate__ + except AttributeError: + try: + dict = self.__dict__ + except AttributeError: + dict = None + else: + dict = getstate() + if dict: + return _reconstructor, args, dict + else: + return _reconstructor, args diff --git a/lib-python/2.2/curses/__init__.py b/lib-python/2.2/curses/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/__init__.py @@ -0,0 +1,54 @@ +"""curses + +The main package for curses support for Python. Normally used by importing +the package, and perhaps a particular module inside it. + + import curses + from curses import textpad + curses.initwin() + ... + +""" + +__revision__ = "$Id$" + +from _curses import * +from curses.wrapper import wrapper + +# Some constants, most notably the ACS_* ones, are only added to the C +# _curses module's dictionary after initscr() is called. (Some +# versions of SGI's curses don't define values for those constants +# until initscr() has been called.) This wrapper function calls the +# underlying C initscr(), and then copies the constants from the +# _curses module to the curses package's dictionary. Don't do 'from +# curses import *' if you'll be needing the ACS_* constants. + +def initscr(): + import _curses, curses + stdscr = _curses.initscr() + for key, value in _curses.__dict__.items(): + if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'): + setattr(curses, key, value) + + return stdscr + +# This is a similar wrapper for start_color(), which adds the COLORS and +# COLOR_PAIRS variables which are only available after start_color() is +# called. + +def start_color(): + import _curses, curses + retval = _curses.start_color() + if hasattr(_curses, 'COLORS'): + curses.COLORS = _curses.COLORS + if hasattr(_curses, 'COLOR_PAIRS'): + curses.COLOR_PAIRS = _curses.COLOR_PAIRS + return retval + +# Import Python has_key() implementation if _curses doesn't contain has_key() + +try: + has_key +except NameError: + from has_key import has_key + diff --git a/lib-python/2.2/curses/ascii.py b/lib-python/2.2/curses/ascii.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/ascii.py @@ -0,0 +1,100 @@ +"""Constants and membership tests for ASCII characters""" + +NUL = 0x00 # ^@ +SOH = 0x01 # ^A +STX = 0x02 # ^B +ETX = 0x03 # ^C +EOT = 0x04 # ^D +ENQ = 0x05 # ^E +ACK = 0x06 # ^F +BEL = 0x07 # ^G +BS = 0x08 # ^H +TAB = 0x09 # ^I +HT = 0x09 # ^I +LF = 0x0a # ^J +NL = 0x0a # ^J +VT = 0x0b # ^K +FF = 0x0c # ^L +CR = 0x0d # ^M +SO = 0x0e # ^N +SI = 0x0f # ^O +DLE = 0x10 # ^P +DC1 = 0x11 # ^Q +DC2 = 0x12 # ^R +DC3 = 0x13 # ^S +DC4 = 0x14 # ^T +NAK = 0x15 # ^U +SYN = 0x16 # ^V +ETB = 0x17 # ^W +CAN = 0x18 # ^X +EM = 0x19 # ^Y +SUB = 0x1a # ^Z +ESC = 0x1b # ^[ +FS = 0x1c # ^\ +GS = 0x1d # ^] +RS = 0x1e # ^^ +US = 0x1f # ^_ +SP = 0x20 # space +DEL = 0x7f # delete + +controlnames = [ +"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", +"BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", +"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", +"CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", +"SP" +] + +def _ctoi(c): + if type(c) == type(""): + return ord(c) + else: + return c + +def isalnum(c): return isalpha(c) or isdigit(c) +def isalpha(c): return isupper(c) or islower(c) +def isascii(c): return _ctoi(c) <= 127 # ? +def isblank(c): return _ctoi(c) in (8,32) +def iscntrl(c): return _ctoi(c) <= 31 +def isdigit(c): return _ctoi(c) >= 48 and _ctoi(c) <= 57 +def isgraph(c): return _ctoi(c) >= 33 and _ctoi(c) <= 126 +def islower(c): return _ctoi(c) >= 97 and _ctoi(c) <= 122 +def isprint(c): return _ctoi(c) >= 32 and _ctoi(c) <= 126 +def ispunct(c): return _ctoi(c) != 32 and not isalnum(c) +def isspace(c): return _ctoi(c) in (9, 10, 11, 12, 13, 32) +def isupper(c): return _ctoi(c) >= 65 and _ctoi(c) <= 90 +def isxdigit(c): return isdigit(c) or \ + (_ctoi(c) >= 65 and _ctoi(c) <= 70) or (_ctoi(c) >= 97 and _ctoi(c) <= 102) +def isctrl(c): return _ctoi(c) < 32 +def ismeta(c): return _ctoi(c) > 127 + +def ascii(c): + if type(c) == type(""): + return chr(_ctoi(c) & 0x7f) + else: + return _ctoi(c) & 0x7f + +def ctrl(c): + if type(c) == type(""): + return chr(_ctoi(c) & 0x1f) + else: + return _ctoi(c) & 0x1f + +def alt(c): + if type(c) == type(""): + return chr(_ctoi(c) | 0x80) + else: + return _ctoi(c) | 0x80 + +def unctrl(c): + bits = _ctoi(c) + if bits == 0x7f: + rep = "^?" + elif bits & 0x20: + rep = chr((bits & 0x7f) | 0x20) + else: + rep = "^" + chr(((bits & 0x7f) | 0x20) + 0x20) + if bits & 0x80: + return "!" + rep + return rep + diff --git a/lib-python/2.2/curses/has_key.py b/lib-python/2.2/curses/has_key.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/has_key.py @@ -0,0 +1,189 @@ + +# +# Emulation of has_key() function for platforms that don't use ncurses +# + +import _curses + +# Table mapping curses keys to the terminfo capability name + +_capability_names = { + _curses.KEY_A1: 'ka1', + _curses.KEY_A3: 'ka3', + _curses.KEY_B2: 'kb2', + _curses.KEY_BACKSPACE: 'kbs', + _curses.KEY_BEG: 'kbeg', + _curses.KEY_BTAB: 'kcbt', + _curses.KEY_C1: 'kc1', + _curses.KEY_C3: 'kc3', + _curses.KEY_CANCEL: 'kcan', + _curses.KEY_CATAB: 'ktbc', + _curses.KEY_CLEAR: 'kclr', + _curses.KEY_CLOSE: 'kclo', + _curses.KEY_COMMAND: 'kcmd', + _curses.KEY_COPY: 'kcpy', + _curses.KEY_CREATE: 'kcrt', + _curses.KEY_CTAB: 'kctab', + _curses.KEY_DC: 'kdch1', + _curses.KEY_DL: 'kdl1', + _curses.KEY_DOWN: 'kcud1', + _curses.KEY_EIC: 'krmir', + _curses.KEY_END: 'kend', + _curses.KEY_ENTER: 'kent', + _curses.KEY_EOL: 'kel', + _curses.KEY_EOS: 'ked', + _curses.KEY_EXIT: 'kext', + _curses.KEY_F0: 'kf0', + _curses.KEY_F1: 'kf1', + _curses.KEY_F10: 'kf10', + _curses.KEY_F11: 'kf11', + _curses.KEY_F12: 'kf12', + _curses.KEY_F13: 'kf13', + _curses.KEY_F14: 'kf14', + _curses.KEY_F15: 'kf15', + _curses.KEY_F16: 'kf16', + _curses.KEY_F17: 'kf17', + _curses.KEY_F18: 'kf18', + _curses.KEY_F19: 'kf19', + _curses.KEY_F2: 'kf2', + _curses.KEY_F20: 'kf20', + _curses.KEY_F21: 'kf21', + _curses.KEY_F22: 'kf22', + _curses.KEY_F23: 'kf23', + _curses.KEY_F24: 'kf24', + _curses.KEY_F25: 'kf25', + _curses.KEY_F26: 'kf26', + _curses.KEY_F27: 'kf27', + _curses.KEY_F28: 'kf28', + _curses.KEY_F29: 'kf29', + _curses.KEY_F3: 'kf3', + _curses.KEY_F30: 'kf30', + _curses.KEY_F31: 'kf31', + _curses.KEY_F32: 'kf32', + _curses.KEY_F33: 'kf33', + _curses.KEY_F34: 'kf34', + _curses.KEY_F35: 'kf35', + _curses.KEY_F36: 'kf36', + _curses.KEY_F37: 'kf37', + _curses.KEY_F38: 'kf38', + _curses.KEY_F39: 'kf39', + _curses.KEY_F4: 'kf4', + _curses.KEY_F40: 'kf40', + _curses.KEY_F41: 'kf41', + _curses.KEY_F42: 'kf42', + _curses.KEY_F43: 'kf43', + _curses.KEY_F44: 'kf44', + _curses.KEY_F45: 'kf45', + _curses.KEY_F46: 'kf46', + _curses.KEY_F47: 'kf47', + _curses.KEY_F48: 'kf48', + _curses.KEY_F49: 'kf49', + _curses.KEY_F5: 'kf5', + _curses.KEY_F50: 'kf50', + _curses.KEY_F51: 'kf51', + _curses.KEY_F52: 'kf52', + _curses.KEY_F53: 'kf53', + _curses.KEY_F54: 'kf54', + _curses.KEY_F55: 'kf55', + _curses.KEY_F56: 'kf56', + _curses.KEY_F57: 'kf57', + _curses.KEY_F58: 'kf58', + _curses.KEY_F59: 'kf59', + _curses.KEY_F6: 'kf6', + _curses.KEY_F60: 'kf60', + _curses.KEY_F61: 'kf61', + _curses.KEY_F62: 'kf62', + _curses.KEY_F63: 'kf63', + _curses.KEY_F7: 'kf7', + _curses.KEY_F8: 'kf8', + _curses.KEY_F9: 'kf9', + _curses.KEY_FIND: 'kfnd', + _curses.KEY_HELP: 'khlp', + _curses.KEY_HOME: 'khome', + _curses.KEY_IC: 'kich1', + _curses.KEY_IL: 'kil1', + _curses.KEY_LEFT: 'kcub1', + _curses.KEY_LL: 'kll', + _curses.KEY_MARK: 'kmrk', + _curses.KEY_MESSAGE: 'kmsg', + _curses.KEY_MOVE: 'kmov', + _curses.KEY_NEXT: 'knxt', + _curses.KEY_NPAGE: 'knp', + _curses.KEY_OPEN: 'kopn', + _curses.KEY_OPTIONS: 'kopt', + _curses.KEY_PPAGE: 'kpp', + _curses.KEY_PREVIOUS: 'kprv', + _curses.KEY_PRINT: 'kprt', + _curses.KEY_REDO: 'krdo', + _curses.KEY_REFERENCE: 'kref', + _curses.KEY_REFRESH: 'krfr', + _curses.KEY_REPLACE: 'krpl', + _curses.KEY_RESTART: 'krst', + _curses.KEY_RESUME: 'kres', + _curses.KEY_RIGHT: 'kcuf1', + _curses.KEY_SAVE: 'ksav', + _curses.KEY_SBEG: 'kBEG', + _curses.KEY_SCANCEL: 'kCAN', + _curses.KEY_SCOMMAND: 'kCMD', + _curses.KEY_SCOPY: 'kCPY', + _curses.KEY_SCREATE: 'kCRT', + _curses.KEY_SDC: 'kDC', + _curses.KEY_SDL: 'kDL', + _curses.KEY_SELECT: 'kslt', + _curses.KEY_SEND: 'kEND', + _curses.KEY_SEOL: 'kEOL', + _curses.KEY_SEXIT: 'kEXT', + _curses.KEY_SF: 'kind', + _curses.KEY_SFIND: 'kFND', + _curses.KEY_SHELP: 'kHLP', + _curses.KEY_SHOME: 'kHOM', + _curses.KEY_SIC: 'kIC', + _curses.KEY_SLEFT: 'kLFT', + _curses.KEY_SMESSAGE: 'kMSG', + _curses.KEY_SMOVE: 'kMOV', + _curses.KEY_SNEXT: 'kNXT', + _curses.KEY_SOPTIONS: 'kOPT', + _curses.KEY_SPREVIOUS: 'kPRV', + _curses.KEY_SPRINT: 'kPRT', + _curses.KEY_SR: 'kri', + _curses.KEY_SREDO: 'kRDO', + _curses.KEY_SREPLACE: 'kRPL', + _curses.KEY_SRIGHT: 'kRIT', + _curses.KEY_SRSUME: 'kRES', + _curses.KEY_SSAVE: 'kSAV', + _curses.KEY_SSUSPEND: 'kSPD', + _curses.KEY_STAB: 'khts', + _curses.KEY_SUNDO: 'kUND', + _curses.KEY_SUSPEND: 'kspd', + _curses.KEY_UNDO: 'kund', + _curses.KEY_UP: 'kcuu1' + } + +def has_key(ch): + if type(ch) == type( '' ): ch = ord(ch) + + # Figure out the correct capability name for the keycode. + capability_name = _capability_names[ch] + + #Check the current terminal description for that capability; + #if present, return true, else return false. + if _curses.tigetstr( capability_name ): return 1 + else: return 0 + +if __name__ == '__main__': + # Compare the output of this implementation and the ncurses has_key, + # on platforms where has_key is already available + try: + L = [] + _curses.initscr() + for key in _capability_names.keys(): + system = _curses.has_key(key) + python = has_key(key) + if system != python: + L.append( 'Mismatch for key %s, system=%i, Python=%i' + % (_curses.keyname( key ), system, python) ) + finally: + _curses.endwin() + for i in L: print i + + diff --git a/lib-python/2.2/curses/panel.py b/lib-python/2.2/curses/panel.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/panel.py @@ -0,0 +1,9 @@ +"""curses.panel + +Module for using panels with curses. +""" + +__revision__ = "$Id$" + +from _curses_panel import * + diff --git a/lib-python/2.2/curses/textpad.py b/lib-python/2.2/curses/textpad.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/textpad.py @@ -0,0 +1,167 @@ +"""Simple textbox editing widget with Emacs-like keybindings.""" + +import sys, curses, ascii + +def rectangle(win, uly, ulx, lry, lrx): + "Draw a rectangle." + win.vline(uly+1, ulx, curses.ACS_VLINE, lry - uly - 1) + win.hline(uly, ulx+1, curses.ACS_HLINE, lrx - ulx - 1) + win.hline(lry, ulx+1, curses.ACS_HLINE, lrx - ulx - 1) + win.vline(uly+1, lrx, curses.ACS_VLINE, lry - uly - 1) + win.addch(uly, ulx, curses.ACS_ULCORNER) + win.addch(uly, lrx, curses.ACS_URCORNER) + win.addch(lry, lrx, curses.ACS_LRCORNER) + win.addch(lry, ulx, curses.ACS_LLCORNER) + +class Textbox: + """Editing widget using the interior of a window object. + Supports the following Emacs-like key bindings: + + Ctrl-A Go to left edge of window. + Ctrl-B Cursor left, wrapping to previous line if appropriate. + Ctrl-D Delete character under cursor. + Ctrl-E Go to right edge (stripspaces off) or end of line (stripspaces on). + Ctrl-F Cursor right, wrapping to next line when appropriate. + Ctrl-G Terminate, returning the window contents. + Ctrl-H Delete character backward. + Ctrl-J Terminate if the window is 1 line, otherwise insert newline. + Ctrl-K If line is blank, delete it, otherwise clear to end of line. + Ctrl-L Refresh screen. + Ctrl-N Cursor down; move down one line. + Ctrl-O Insert a blank line at cursor location. + Ctrl-P Cursor up; move up one line. + + Move operations do nothing if the cursor is at an edge where the movement + is not possible. The following synonyms are supported where possible: + + KEY_LEFT = Ctrl-B, KEY_RIGHT = Ctrl-F, KEY_UP = Ctrl-P, KEY_DOWN = Ctrl-N + KEY_BACKSPACE = Ctrl-h + """ + def __init__(self, win): + self.win = win + (self.maxy, self.maxx) = win.getmaxyx() + self.maxy = self.maxy - 1 + self.maxx = self.maxx - 1 + self.stripspaces = 1 + self.lastcmd = None + win.keypad(1) + + def _end_of_line(self, y): + "Go to the location of the first blank on the given line." + last = self.maxx + while 1: + if ascii.ascii(self.win.inch(y, last)) != ascii.SP: + last = last + 1 + break + elif last == 0: + break + last = last - 1 + return last + + def do_command(self, ch): + "Process a single editing command." + (y, x) = self.win.getyx() + self.lastcmd = ch + if ascii.isprint(ch): + if y < self.maxy or x < self.maxx: + # The try-catch ignores the error we trigger from some curses + # versions by trying to write into the lowest-rightmost spot + # in the window. + try: + self.win.addch(ch) + except curses.error: + pass + elif ch == ascii.SOH: # ^a + self.win.move(y, 0) + elif ch in (ascii.STX,curses.KEY_LEFT, ascii.BS,curses.KEY_BACKSPACE): + if x > 0: + self.win.move(y, x-1) + elif y == 0: + pass + elif self.stripspaces: + self.win.move(y-1, self._end_of_line(y-1)) + else: + self.win.move(y-1, self.maxx) + if ch in (ascii.BS, curses.KEY_BACKSPACE): + self.win.delch() + elif ch == ascii.EOT: # ^d + self.win.delch() + elif ch == ascii.ENQ: # ^e + if self.stripspaces: + self.win.move(y, self._end_of_line(y)) + else: + self.win.move(y, self.maxx) + elif ch in (ascii.ACK, curses.KEY_RIGHT): # ^f + if x < self.maxx: + self.win.move(y, x+1) + elif y == self.maxy: + pass + else: + self.win.move(y+1, 0) + elif ch == ascii.BEL: # ^g + return 0 + elif ch == ascii.NL: # ^j + if self.maxy == 0: + return 0 + elif y < self.maxy: + self.win.move(y+1, 0) + elif ch == ascii.VT: # ^k + if x == 0 and self._end_of_line(y) == 0: + self.win.deleteln() + else: + self.win.clrtoeol() + elif ch == ascii.FF: # ^l + self.win.refresh() + elif ch in (ascii.SO, curses.KEY_DOWN): # ^n + if y < self.maxy: + self.win.move(y+1, x) + if x > self._end_of_line(y+1): + self.win.move(y+1, self._end_of_line(y+1)) + elif ch == ascii.SI: # ^o + self.win.insertln() + elif ch in (ascii.DLE, curses.KEY_UP): # ^p + if y > 0: + self.win.move(y-1, x) + if x > self._end_of_line(y-1): + self.win.move(y-1, self._end_of_line(y-1)) + return 1 + + def gather(self): + "Collect and return the contents of the window." + result = "" + for y in range(self.maxy+1): + self.win.move(y, 0) + stop = self._end_of_line(y) + #sys.stderr.write("y=%d, _end_of_line(y)=%d\n" % (y, stop)) + if stop == 0 and self.stripspaces: + continue + for x in range(self.maxx+1): + if self.stripspaces and x == stop: + break + result = result + chr(ascii.ascii(self.win.inch(y, x))) + if self.maxy > 0: + result = result + "\n" + return result + + def edit(self, validate=None): + "Edit in the widget window and collect the results." + while 1: + ch = self.win.getch() + if validate: + ch = validate(ch) + if not ch: + continue + if not self.do_command(ch): + break + self.win.refresh() + return self.gather() + +if __name__ == '__main__': + def test_editbox(stdscr): + win = curses.newwin(4, 9, 15, 20) + rectangle(stdscr, 14, 19, 19, 29) + stdscr.refresh() + return Textbox(win).edit() + + str = curses.wrapper(test_editbox) + print str diff --git a/lib-python/2.2/curses/wrapper.py b/lib-python/2.2/curses/wrapper.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/curses/wrapper.py @@ -0,0 +1,63 @@ +"""curses.wrapper + +Contains one function, wrapper(), which runs another function which +should be the rest of your curses-based application. If the +application raises an exception, wrapper() will restore the terminal +to a sane state so you can read the resulting traceback. + +""" + +import sys, curses + +def wrapper(func, *rest): + """Wrapper function that initializes curses and calls another function, + restoring normal keyboard/screen behavior on error. + The callable object 'func' is then passed the main window 'stdscr' + as its first argument, followed by any other arguments passed to + wrapper(). + """ + + res = None + try: + # Initialize curses + stdscr=curses.initscr() + + # Turn off echoing of keys, and enter cbreak mode, + # where no buffering is performed on keyboard input + curses.noecho() + curses.cbreak() + + # In keypad mode, escape sequences for special keys + # (like the cursor keys) will be interpreted and + # a special value like curses.KEY_LEFT will be returned + stdscr.keypad(1) + + # Start color, too. Harmless if the terminal doesn't have + # color; user can test with has_color() later on. The try/catch + # works around a minor bit of over-conscientiousness in the curses + # module -- the error return from C start_color() is ignorable. + try: + curses.start_color() + except: + pass + + res = apply(func, (stdscr,) + rest) + except: + # In the event of an error, restore the terminal + # to a sane state. + stdscr.keypad(0) + curses.echo() + curses.nocbreak() + curses.endwin() + + # Pass the exception upwards + (exc_type, exc_value, exc_traceback) = sys.exc_info() + raise exc_type, exc_value, exc_traceback + else: + # Set everything back to normal + stdscr.keypad(0) + curses.echo() + curses.nocbreak() + curses.endwin() # Terminate curses + + return res diff --git a/lib-python/2.2/dbhash.py b/lib-python/2.2/dbhash.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/dbhash.py @@ -0,0 +1,16 @@ +"""Provide a (g)dbm-compatible interface to bsdhash.hashopen.""" + +import sys +try: + import bsddb +except ImportError: + # prevent a second import of this module from spuriously succeeding + del sys.modules[__name__] + raise + +__all__ = ["error","open"] + +error = bsddb.error # Exported for anydbm + +def open(file, flag = 'r', mode=0666): + return bsddb.hashopen(file, flag, mode) diff --git a/lib-python/2.2/difflib.py b/lib-python/2.2/difflib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/difflib.py @@ -0,0 +1,1088 @@ +#! /usr/bin/env python + +from __future__ import generators + +""" +Module difflib -- helpers for computing deltas between objects. + +Function get_close_matches(word, possibilities, n=3, cutoff=0.6): + Use SequenceMatcher to return list of the best "good enough" matches. + +Function ndiff(a, b): + Return a delta: the difference between `a` and `b` (lists of strings). + +Function restore(delta, which): + Return one of the two sequences that generated an ndiff delta. + +Class SequenceMatcher: + A flexible class for comparing pairs of sequences of any type. + +Class Differ: + For producing human-readable deltas from sequences of lines of text. +""" + +__all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher', + 'Differ', 'IS_CHARACTER_JUNK', 'IS_LINE_JUNK'] + +def _calculate_ratio(matches, length): + if length: + return 2.0 * matches / length + return 1.0 + +class SequenceMatcher: + + """ + SequenceMatcher is a flexible class for comparing pairs of sequences of + any type, so long as the sequence elements are hashable. The basic + algorithm predates, and is a little fancier than, an algorithm + published in the late 1980's by Ratcliff and Obershelp under the + hyperbolic name "gestalt pattern matching". The basic idea is to find + the longest contiguous matching subsequence that contains no "junk" + elements (R-O doesn't address junk). The same idea is then applied + recursively to the pieces of the sequences to the left and to the right + of the matching subsequence. This does not yield minimal edit + sequences, but does tend to yield matches that "look right" to people. + + SequenceMatcher tries to compute a "human-friendly diff" between two + sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the + longest *contiguous* & junk-free matching subsequence. That's what + catches peoples' eyes. The Windows(tm) windiff has another interesting + notion, pairing up elements that appear uniquely in each sequence. + That, and the method here, appear to yield more intuitive difference + reports than does diff. This method appears to be the least vulnerable + to synching up on blocks of "junk lines", though (like blank lines in + ordinary text files, or maybe "

" lines in HTML files). That may be + because this is the only method of the 3 that has a *concept* of + "junk" . + + Example, comparing two strings, and considering blanks to be "junk": + + >>> s = SequenceMatcher(lambda x: x == " ", + ... "private Thread currentThread;", + ... "private volatile Thread currentThread;") + >>> + + .ratio() returns a float in [0, 1], measuring the "similarity" of the + sequences. As a rule of thumb, a .ratio() value over 0.6 means the + sequences are close matches: + + >>> print round(s.ratio(), 3) + 0.866 + >>> + + If you're only interested in where the sequences match, + .get_matching_blocks() is handy: + + >>> for block in s.get_matching_blocks(): + ... print "a[%d] and b[%d] match for %d elements" % block + a[0] and b[0] match for 8 elements + a[8] and b[17] match for 6 elements + a[14] and b[23] match for 15 elements + a[29] and b[38] match for 0 elements + + Note that the last tuple returned by .get_matching_blocks() is always a + dummy, (len(a), len(b), 0), and this is the only case in which the last + tuple element (number of elements matched) is 0. + + If you want to know how to change the first sequence into the second, + use .get_opcodes(): + + >>> for opcode in s.get_opcodes(): + ... print "%6s a[%d:%d] b[%d:%d]" % opcode + equal a[0:8] b[0:8] + insert a[8:8] b[8:17] + equal a[8:14] b[17:23] + equal a[14:29] b[23:38] + + See the Differ class for a fancy human-friendly file differencer, which + uses SequenceMatcher both to compare sequences of lines, and to compare + sequences of characters within similar (near-matching) lines. + + See also function get_close_matches() in this module, which shows how + simple code building on SequenceMatcher can be used to do useful work. + + Timing: Basic R-O is cubic time worst case and quadratic time expected + case. SequenceMatcher is quadratic time for the worst case and has + expected-case behavior dependent in a complicated way on how many + elements the sequences have in common; best case time is linear. + + Methods: + + __init__(isjunk=None, a='', b='') + Construct a SequenceMatcher. + + set_seqs(a, b) + Set the two sequences to be compared. + + set_seq1(a) + Set the first sequence to be compared. + + set_seq2(b) + Set the second sequence to be compared. + + find_longest_match(alo, ahi, blo, bhi) + Find longest matching block in a[alo:ahi] and b[blo:bhi]. + + get_matching_blocks() + Return list of triples describing matching subsequences. + + get_opcodes() + Return list of 5-tuples describing how to turn a into b. + + ratio() + Return a measure of the sequences' similarity (float in [0,1]). + + quick_ratio() + Return an upper bound on .ratio() relatively quickly. + + real_quick_ratio() + Return an upper bound on ratio() very quickly. + """ + + def __init__(self, isjunk=None, a='', b=''): + """Construct a SequenceMatcher. + + Optional arg isjunk is None (the default), or a one-argument + function that takes a sequence element and returns true iff the + element is junk. None is equivalent to passing "lambda x: 0", i.e. + no elements are considered to be junk. For example, pass + lambda x: x in " \\t" + if you're comparing lines as sequences of characters, and don't + want to synch up on blanks or hard tabs. + + Optional arg a is the first of two sequences to be compared. By + default, an empty string. The elements of a must be hashable. See + also .set_seqs() and .set_seq1(). + + Optional arg b is the second of two sequences to be compared. By + default, an empty string. The elements of b must be hashable. See + also .set_seqs() and .set_seq2(). + """ + + # Members: + # a + # first sequence + # b + # second sequence; differences are computed as "what do + # we need to do to 'a' to change it into 'b'?" + # b2j + # for x in b, b2j[x] is a list of the indices (into b) + # at which x appears; junk elements do not appear + # b2jhas + # b2j.has_key + # fullbcount + # for x in b, fullbcount[x] == the number of times x + # appears in b; only materialized if really needed (used + # only for computing quick_ratio()) + # matching_blocks + # a list of (i, j, k) triples, where a[i:i+k] == b[j:j+k]; + # ascending & non-overlapping in i and in j; terminated by + # a dummy (len(a), len(b), 0) sentinel + # opcodes + # a list of (tag, i1, i2, j1, j2) tuples, where tag is + # one of + # 'replace' a[i1:i2] should be replaced by b[j1:j2] + # 'delete' a[i1:i2] should be deleted + # 'insert' b[j1:j2] should be inserted + # 'equal' a[i1:i2] == b[j1:j2] + # isjunk + # a user-supplied function taking a sequence element and + # returning true iff the element is "junk" -- this has + # subtle but helpful effects on the algorithm, which I'll + # get around to writing up someday <0.9 wink>. + # DON'T USE! Only __chain_b uses this. Use isbjunk. + # isbjunk + # for x in b, isbjunk(x) == isjunk(x) but much faster; + # it's really the has_key method of a hidden dict. + # DOES NOT WORK for x in a! + + self.isjunk = isjunk + self.a = self.b = None + self.set_seqs(a, b) + + def set_seqs(self, a, b): + """Set the two sequences to be compared. + + >>> s = SequenceMatcher() + >>> s.set_seqs("abcd", "bcde") + >>> s.ratio() + 0.75 + """ + + self.set_seq1(a) + self.set_seq2(b) + + def set_seq1(self, a): + """Set the first sequence to be compared. + + The second sequence to be compared is not changed. + + >>> s = SequenceMatcher(None, "abcd", "bcde") + >>> s.ratio() + 0.75 + >>> s.set_seq1("bcde") + >>> s.ratio() + 1.0 + >>> + + SequenceMatcher computes and caches detailed information about the + second sequence, so if you want to compare one sequence S against + many sequences, use .set_seq2(S) once and call .set_seq1(x) + repeatedly for each of the other sequences. + + See also set_seqs() and set_seq2(). + """ + + if a is self.a: + return + self.a = a + self.matching_blocks = self.opcodes = None + + def set_seq2(self, b): + """Set the second sequence to be compared. + + The first sequence to be compared is not changed. + + >>> s = SequenceMatcher(None, "abcd", "bcde") + >>> s.ratio() + 0.75 + >>> s.set_seq2("abcd") + >>> s.ratio() + 1.0 + >>> + + SequenceMatcher computes and caches detailed information about the + second sequence, so if you want to compare one sequence S against + many sequences, use .set_seq2(S) once and call .set_seq1(x) + repeatedly for each of the other sequences. + + See also set_seqs() and set_seq1(). + """ + + if b is self.b: + return + self.b = b + self.matching_blocks = self.opcodes = None + self.fullbcount = None + self.__chain_b() + + # For each element x in b, set b2j[x] to a list of the indices in + # b where x appears; the indices are in increasing order; note that + # the number of times x appears in b is len(b2j[x]) ... + # when self.isjunk is defined, junk elements don't show up in this + # map at all, which stops the central find_longest_match method + # from starting any matching block at a junk element ... + # also creates the fast isbjunk function ... + # note that this is only called when b changes; so for cross-product + # kinds of matches, it's best to call set_seq2 once, then set_seq1 + # repeatedly + + def __chain_b(self): + # Because isjunk is a user-defined (not C) function, and we test + # for junk a LOT, it's important to minimize the number of calls. + # Before the tricks described here, __chain_b was by far the most + # time-consuming routine in the whole module! If anyone sees + # Jim Roskind, thank him again for profile.py -- I never would + # have guessed that. + # The first trick is to build b2j ignoring the possibility + # of junk. I.e., we don't call isjunk at all yet. Throwing + # out the junk later is much cheaper than building b2j "right" + # from the start. + b = self.b + self.b2j = b2j = {} + self.b2jhas = b2jhas = b2j.has_key + for i in xrange(len(b)): + elt = b[i] + if b2jhas(elt): + b2j[elt].append(i) + else: + b2j[elt] = [i] + + # Now b2j.keys() contains elements uniquely, and especially when + # the sequence is a string, that's usually a good deal smaller + # than len(string). The difference is the number of isjunk calls + # saved. + isjunk, junkdict = self.isjunk, {} + if isjunk: + for elt in b2j.keys(): + if isjunk(elt): + junkdict[elt] = 1 # value irrelevant; it's a set + del b2j[elt] + + # Now for x in b, isjunk(x) == junkdict.has_key(x), but the + # latter is much faster. Note too that while there may be a + # lot of junk in the sequence, the number of *unique* junk + # elements is probably small. So the memory burden of keeping + # this dict alive is likely trivial compared to the size of b2j. + self.isbjunk = junkdict.has_key + + def find_longest_match(self, alo, ahi, blo, bhi): + """Find longest matching block in a[alo:ahi] and b[blo:bhi]. + + If isjunk is not defined: + + Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where + alo <= i <= i+k <= ahi + blo <= j <= j+k <= bhi + and for all (i',j',k') meeting those conditions, + k >= k' + i <= i' + and if i == i', j <= j' + + In other words, of all maximal matching blocks, return one that + starts earliest in a, and of all those maximal matching blocks that + start earliest in a, return the one that starts earliest in b. + + >>> s = SequenceMatcher(None, " abcd", "abcd abcd") + >>> s.find_longest_match(0, 5, 0, 9) + (0, 4, 5) + + If isjunk is defined, first the longest matching block is + determined as above, but with the additional restriction that no + junk element appears in the block. Then that block is extended as + far as possible by matching (only) junk elements on both sides. So + the resulting block never matches on junk except as identical junk + happens to be adjacent to an "interesting" match. + + Here's the same example as before, but considering blanks to be + junk. That prevents " abcd" from matching the " abcd" at the tail + end of the second sequence directly. Instead only the "abcd" can + match, and matches the leftmost "abcd" in the second sequence: + + >>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd") + >>> s.find_longest_match(0, 5, 0, 9) + (1, 0, 4) + + If no blocks match, return (alo, blo, 0). + + >>> s = SequenceMatcher(None, "ab", "c") + >>> s.find_longest_match(0, 2, 0, 1) + (0, 0, 0) + """ + + # CAUTION: stripping common prefix or suffix would be incorrect. + # E.g., + # ab + # acab + # Longest matching block is "ab", but if common prefix is + # stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + # strip, so ends up claiming that ab is changed to acab by + # inserting "ca" in the middle. That's minimal but unintuitive: + # "it's obvious" that someone inserted "ac" at the front. + # Windiff ends up at the same place as diff, but by pairing up + # the unique 'b's and then matching the first two 'a's. + + a, b, b2j, isbjunk = self.a, self.b, self.b2j, self.isbjunk + besti, bestj, bestsize = alo, blo, 0 + # find longest junk-free match + # during an iteration of the loop, j2len[j] = length of longest + # junk-free match ending with a[i-1] and b[j] + j2len = {} + nothing = [] + for i in xrange(alo, ahi): + # look at all instances of a[i] in b; note that because + # b2j has no junk keys, the loop is skipped if a[i] is junk + j2lenget = j2len.get + newj2len = {} + for j in b2j.get(a[i], nothing): + # a[i] matches b[j] + if j < blo: + continue + if j >= bhi: + break + k = newj2len[j] = j2lenget(j-1, 0) + 1 + if k > bestsize: + besti, bestj, bestsize = i-k+1, j-k+1, k + j2len = newj2len + + # Now that we have a wholly interesting match (albeit possibly + # empty!), we may as well suck up the matching junk on each + # side of it too. Can't think of a good reason not to, and it + # saves post-processing the (possibly considerable) expense of + # figuring out what to do with it. In the case of an empty + # interesting match, this is clearly the right thing to do, + # because no other kind of match is possible in the regions. + while besti > alo and bestj > blo and \ + isbjunk(b[bestj-1]) and \ + a[besti-1] == b[bestj-1]: + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + while besti+bestsize < ahi and bestj+bestsize < bhi and \ + isbjunk(b[bestj+bestsize]) and \ + a[besti+bestsize] == b[bestj+bestsize]: + bestsize = bestsize + 1 + + return besti, bestj, bestsize + + def get_matching_blocks(self): + """Return list of triples describing matching subsequences. + + Each triple is of the form (i, j, n), and means that + a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in + i and in j. + + The last triple is a dummy, (len(a), len(b), 0), and is the only + triple with n==0. + + >>> s = SequenceMatcher(None, "abxcd", "abcd") + >>> s.get_matching_blocks() + [(0, 0, 2), (3, 2, 2), (5, 4, 0)] + """ + + if self.matching_blocks is not None: + return self.matching_blocks + self.matching_blocks = [] + la, lb = len(self.a), len(self.b) + self.__helper(0, la, 0, lb, self.matching_blocks) + self.matching_blocks.append( (la, lb, 0) ) + return self.matching_blocks + + # builds list of matching blocks covering a[alo:ahi] and + # b[blo:bhi], appending them in increasing order to answer + + def __helper(self, alo, ahi, blo, bhi, answer): + i, j, k = x = self.find_longest_match(alo, ahi, blo, bhi) + # a[alo:i] vs b[blo:j] unknown + # a[i:i+k] same as b[j:j+k] + # a[i+k:ahi] vs b[j+k:bhi] unknown + if k: + if alo < i and blo < j: + self.__helper(alo, i, blo, j, answer) + answer.append(x) + if i+k < ahi and j+k < bhi: + self.__helper(i+k, ahi, j+k, bhi, answer) + + def get_opcodes(self): + """Return list of 5-tuples describing how to turn a into b. + + Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple + has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the + tuple preceding it, and likewise for j1 == the previous j2. + + The tags are strings, with these meanings: + + 'replace': a[i1:i2] should be replaced by b[j1:j2] + 'delete': a[i1:i2] should be deleted. + Note that j1==j2 in this case. + 'insert': b[j1:j2] should be inserted at a[i1:i1]. + Note that i1==i2 in this case. + 'equal': a[i1:i2] == b[j1:j2] + + >>> a = "qabxcd" + >>> b = "abycdf" + >>> s = SequenceMatcher(None, a, b) + >>> for tag, i1, i2, j1, j2 in s.get_opcodes(): + ... print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % + ... (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2])) + delete a[0:1] (q) b[0:0] () + equal a[1:3] (ab) b[0:2] (ab) + replace a[3:4] (x) b[2:3] (y) + equal a[4:6] (cd) b[3:5] (cd) + insert a[6:6] () b[5:6] (f) + """ + + if self.opcodes is not None: + return self.opcodes + i = j = 0 + self.opcodes = answer = [] + for ai, bj, size in self.get_matching_blocks(): + # invariant: we've pumped out correct diffs to change + # a[:i] into b[:j], and the next matching block is + # a[ai:ai+size] == b[bj:bj+size]. So we need to pump + # out a diff to change a[i:ai] into b[j:bj], pump out + # the matching block, and move (i,j) beyond the match + tag = '' + if i < ai and j < bj: + tag = 'replace' + elif i < ai: + tag = 'delete' + elif j < bj: + tag = 'insert' + if tag: + answer.append( (tag, i, ai, j, bj) ) + i, j = ai+size, bj+size + # the list of matching blocks is terminated by a + # sentinel with size 0 + if size: + answer.append( ('equal', ai, i, bj, j) ) + return answer + + def ratio(self): + """Return a measure of the sequences' similarity (float in [0,1]). + + Where T is the total number of elements in both sequences, and + M is the number of matches, this is 2,0*M / T. + Note that this is 1 if the sequences are identical, and 0 if + they have nothing in common. + + .ratio() is expensive to compute if you haven't already computed + .get_matching_blocks() or .get_opcodes(), in which case you may + want to try .quick_ratio() or .real_quick_ratio() first to get an + upper bound. + + >>> s = SequenceMatcher(None, "abcd", "bcde") + >>> s.ratio() + 0.75 + >>> s.quick_ratio() + 0.75 + >>> s.real_quick_ratio() + 1.0 + """ + + matches = reduce(lambda sum, triple: sum + triple[-1], + self.get_matching_blocks(), 0) + return _calculate_ratio(matches, len(self.a) + len(self.b)) + + def quick_ratio(self): + """Return an upper bound on ratio() relatively quickly. + + This isn't defined beyond that it is an upper bound on .ratio(), and + is faster to compute. + """ + + # viewing a and b as multisets, set matches to the cardinality + # of their intersection; this counts the number of matches + # without regard to order, so is clearly an upper bound + if self.fullbcount is None: + self.fullbcount = fullbcount = {} + for elt in self.b: + fullbcount[elt] = fullbcount.get(elt, 0) + 1 + fullbcount = self.fullbcount + # avail[x] is the number of times x appears in 'b' less the + # number of times we've seen it in 'a' so far ... kinda + avail = {} + availhas, matches = avail.has_key, 0 + for elt in self.a: + if availhas(elt): + numb = avail[elt] + else: + numb = fullbcount.get(elt, 0) + avail[elt] = numb - 1 + if numb > 0: + matches = matches + 1 + return _calculate_ratio(matches, len(self.a) + len(self.b)) + + def real_quick_ratio(self): + """Return an upper bound on ratio() very quickly. + + This isn't defined beyond that it is an upper bound on .ratio(), and + is faster to compute than either .ratio() or .quick_ratio(). + """ + + la, lb = len(self.a), len(self.b) + # can't have more matches than the number of elements in the + # shorter sequence + return _calculate_ratio(min(la, lb), la + lb) + +def get_close_matches(word, possibilities, n=3, cutoff=0.6): + """Use SequenceMatcher to return list of the best "good enough" matches. + + word is a sequence for which close matches are desired (typically a + string). + + possibilities is a list of sequences against which to match word + (typically a list of strings). + + Optional arg n (default 3) is the maximum number of close matches to + return. n must be > 0. + + Optional arg cutoff (default 0.6) is a float in [0, 1]. Possibilities + that don't score at least that similar to word are ignored. + + The best (no more than n) matches among the possibilities are returned + in a list, sorted by similarity score, most similar first. + + >>> get_close_matches("appel", ["ape", "apple", "peach", "puppy"]) + ['apple', 'ape'] + >>> import keyword as _keyword + >>> get_close_matches("wheel", _keyword.kwlist) + ['while'] + >>> get_close_matches("apple", _keyword.kwlist) + [] + >>> get_close_matches("accept", _keyword.kwlist) + ['except'] + """ + + if not n > 0: + raise ValueError("n must be > 0: " + `n`) + if not 0.0 <= cutoff <= 1.0: + raise ValueError("cutoff must be in [0.0, 1.0]: " + `cutoff`) + result = [] + s = SequenceMatcher() + s.set_seq2(word) + for x in possibilities: + s.set_seq1(x) + if s.real_quick_ratio() >= cutoff and \ + s.quick_ratio() >= cutoff and \ + s.ratio() >= cutoff: + result.append((s.ratio(), x)) + # Sort by score. + result.sort() + # Retain only the best n. + result = result[-n:] + # Move best-scorer to head of list. + result.reverse() + # Strip scores. + return [x for score, x in result] + + +def _count_leading(line, ch): + """ + Return number of `ch` characters at the start of `line`. + + Example: + + >>> _count_leading(' abc', ' ') + 3 + """ + + i, n = 0, len(line) + while i < n and line[i] == ch: + i += 1 + return i + +class Differ: + r""" + Differ is a class for comparing sequences of lines of text, and + producing human-readable differences or deltas. Differ uses + SequenceMatcher both to compare sequences of lines, and to compare + sequences of characters within similar (near-matching) lines. + + Each line of a Differ delta begins with a two-letter code: + + '- ' line unique to sequence 1 + '+ ' line unique to sequence 2 + ' ' line common to both sequences + '? ' line not present in either input sequence + + Lines beginning with '? ' attempt to guide the eye to intraline + differences, and were not present in either input sequence. These lines + can be confusing if the sequences contain tab characters. + + Note that Differ makes no claim to produce a *minimal* diff. To the + contrary, minimal diffs are often counter-intuitive, because they synch + up anywhere possible, sometimes accidental matches 100 pages apart. + Restricting synch points to contiguous matches preserves some notion of + locality, at the occasional cost of producing a longer diff. + + Example: Comparing two texts. + + First we set up the texts, sequences of individual single-line strings + ending with newlines (such sequences can also be obtained from the + `readlines()` method of file-like objects): + + >>> text1 = ''' 1. Beautiful is better than ugly. + ... 2. Explicit is better than implicit. + ... 3. Simple is better than complex. + ... 4. Complex is better than complicated. + ... '''.splitlines(1) + >>> len(text1) + 4 + >>> text1[0][-1] + '\n' + >>> text2 = ''' 1. Beautiful is better than ugly. + ... 3. Simple is better than complex. + ... 4. Complicated is better than complex. + ... 5. Flat is better than nested. + ... '''.splitlines(1) + + Next we instantiate a Differ object: + + >>> d = Differ() + + Note that when instantiating a Differ object we may pass functions to + filter out line and character 'junk'. See Differ.__init__ for details. + + Finally, we compare the two: + + >>> result = list(d.compare(text1, text2)) + + 'result' is a list of strings, so let's pretty-print it: + + >>> from pprint import pprint as _pprint + >>> _pprint(result) + [' 1. Beautiful is better than ugly.\n', + '- 2. Explicit is better than implicit.\n', + '- 3. Simple is better than complex.\n', + '+ 3. Simple is better than complex.\n', + '? ++\n', + '- 4. Complex is better than complicated.\n', + '? ^ ---- ^\n', + '+ 4. Complicated is better than complex.\n', + '? ++++ ^ ^\n', + '+ 5. Flat is better than nested.\n'] + + As a single multi-line string it looks like this: + + >>> print ''.join(result), + 1. Beautiful is better than ugly. + - 2. Explicit is better than implicit. + - 3. Simple is better than complex. + + 3. Simple is better than complex. + ? ++ + - 4. Complex is better than complicated. + ? ^ ---- ^ + + 4. Complicated is better than complex. + ? ++++ ^ ^ + + 5. Flat is better than nested. + + Methods: + + __init__(linejunk=None, charjunk=None) + Construct a text differencer, with optional filters. + + compare(a, b) + Compare two sequences of lines; generate the resulting delta. + """ + + def __init__(self, linejunk=None, charjunk=None): + """ + Construct a text differencer, with optional filters. + + The two optional keyword parameters are for filter functions: + + - `linejunk`: A function that should accept a single string argument, + and return true iff the string is junk. The module-level function + `IS_LINE_JUNK` may be used to filter out lines without visible + characters, except for at most one splat ('#'). + + - `charjunk`: A function that should accept a string of length 1. The + module-level function `IS_CHARACTER_JUNK` may be used to filter out + whitespace characters (a blank or tab; **note**: bad idea to include + newline in this!). + """ + + self.linejunk = linejunk + self.charjunk = charjunk + + def compare(self, a, b): + r""" + Compare two sequences of lines; generate the resulting delta. + + Each sequence must contain individual single-line strings ending with + newlines. Such sequences can be obtained from the `readlines()` method + of file-like objects. The delta generated also consists of newline- + terminated strings, ready to be printed as-is via the writeline() + method of a file-like object. + + Example: + + >>> print ''.join(Differ().compare('one\ntwo\nthree\n'.splitlines(1), + ... 'ore\ntree\nemu\n'.splitlines(1))), + - one + ? ^ + + ore + ? ^ + - two + - three + ? - + + tree + + emu + """ + + cruncher = SequenceMatcher(self.linejunk, a, b) + for tag, alo, ahi, blo, bhi in cruncher.get_opcodes(): + if tag == 'replace': + g = self._fancy_replace(a, alo, ahi, b, blo, bhi) + elif tag == 'delete': + g = self._dump('-', a, alo, ahi) + elif tag == 'insert': + g = self._dump('+', b, blo, bhi) + elif tag == 'equal': + g = self._dump(' ', a, alo, ahi) + else: + raise ValueError, 'unknown tag ' + `tag` + + for line in g: + yield line + + def _dump(self, tag, x, lo, hi): + """Generate comparison results for a same-tagged range.""" + for i in xrange(lo, hi): + yield '%s %s' % (tag, x[i]) + + def _plain_replace(self, a, alo, ahi, b, blo, bhi): + assert alo < ahi and blo < bhi + # dump the shorter block first -- reduces the burden on short-term + # memory if the blocks are of very different sizes + if bhi - blo < ahi - alo: + first = self._dump('+', b, blo, bhi) + second = self._dump('-', a, alo, ahi) + else: + first = self._dump('-', a, alo, ahi) + second = self._dump('+', b, blo, bhi) + + for g in first, second: + for line in g: + yield line + + def _fancy_replace(self, a, alo, ahi, b, blo, bhi): + r""" + When replacing one block of lines with another, search the blocks + for *similar* lines; the best-matching pair (if any) is used as a + synch point, and intraline difference marking is done on the + similar pair. Lots of work, but often worth it. + + Example: + + >>> d = Differ() + >>> d._fancy_replace(['abcDefghiJkl\n'], 0, 1, ['abcdefGhijkl\n'], 0, 1) + >>> print ''.join(d.results), + - abcDefghiJkl + ? ^ ^ ^ + + abcdefGhijkl + ? ^ ^ ^ + """ + + # don't synch up unless the lines have a similarity score of at + # least cutoff; best_ratio tracks the best score seen so far + best_ratio, cutoff = 0.74, 0.75 + cruncher = SequenceMatcher(self.charjunk) + eqi, eqj = None, None # 1st indices of equal lines (if any) + + # search for the pair that matches best without being identical + # (identical lines must be junk lines, & we don't want to synch up + # on junk -- unless we have to) + for j in xrange(blo, bhi): + bj = b[j] + cruncher.set_seq2(bj) + for i in xrange(alo, ahi): + ai = a[i] + if ai == bj: + if eqi is None: + eqi, eqj = i, j + continue + cruncher.set_seq1(ai) + # computing similarity is expensive, so use the quick + # upper bounds first -- have seen this speed up messy + # compares by a factor of 3. + # note that ratio() is only expensive to compute the first + # time it's called on a sequence pair; the expensive part + # of the computation is cached by cruncher + if cruncher.real_quick_ratio() > best_ratio and \ + cruncher.quick_ratio() > best_ratio and \ + cruncher.ratio() > best_ratio: + best_ratio, best_i, best_j = cruncher.ratio(), i, j + if best_ratio < cutoff: + # no non-identical "pretty close" pair + if eqi is None: + # no identical pair either -- treat it as a straight replace + for line in self._plain_replace(a, alo, ahi, b, blo, bhi): + yield line + return + # no close pair, but an identical pair -- synch up on that + best_i, best_j, best_ratio = eqi, eqj, 1.0 + else: + # there's a close pair, so forget the identical pair (if any) + eqi = None + + # a[best_i] very similar to b[best_j]; eqi is None iff they're not + # identical + + # pump out diffs from before the synch point + for line in self._fancy_helper(a, alo, best_i, b, blo, best_j): + yield line + + # do intraline marking on the synch pair + aelt, belt = a[best_i], b[best_j] + if eqi is None: + # pump out a '-', '?', '+', '?' quad for the synched lines + atags = btags = "" + cruncher.set_seqs(aelt, belt) + for tag, ai1, ai2, bj1, bj2 in cruncher.get_opcodes(): + la, lb = ai2 - ai1, bj2 - bj1 + if tag == 'replace': + atags += '^' * la + btags += '^' * lb + elif tag == 'delete': + atags += '-' * la + elif tag == 'insert': + btags += '+' * lb + elif tag == 'equal': + atags += ' ' * la + btags += ' ' * lb + else: + raise ValueError, 'unknown tag ' + `tag` + for line in self._qformat(aelt, belt, atags, btags): + yield line + else: + # the synch pair is identical + yield ' ' + aelt + + # pump out diffs from after the synch point + for line in self._fancy_helper(a, best_i+1, ahi, b, best_j+1, bhi): + yield line + + def _fancy_helper(self, a, alo, ahi, b, blo, bhi): + g = [] + if alo < ahi: + if blo < bhi: + g = self._fancy_replace(a, alo, ahi, b, blo, bhi) + else: + g = self._dump('-', a, alo, ahi) + elif blo < bhi: + g = self._dump('+', b, blo, bhi) + + for line in g: + yield line + + def _qformat(self, aline, bline, atags, btags): + r""" + Format "?" output and deal with leading tabs. + + Example: + + >>> d = Differ() + >>> d._qformat('\tabcDefghiJkl\n', '\t\tabcdefGhijkl\n', + ... ' ^ ^ ^ ', '+ ^ ^ ^ ') + >>> for line in d.results: print repr(line) + ... + '- \tabcDefghiJkl\n' + '? \t ^ ^ ^\n' + '+ \t\tabcdefGhijkl\n' + '? \t ^ ^ ^\n' + """ + + # Can hurt, but will probably help most of the time. + common = min(_count_leading(aline, "\t"), + _count_leading(bline, "\t")) + common = min(common, _count_leading(atags[:common], " ")) + atags = atags[common:].rstrip() + btags = btags[common:].rstrip() + + yield "- " + aline + if atags: + yield "? %s%s\n" % ("\t" * common, atags) + + yield "+ " + bline + if btags: + yield "? %s%s\n" % ("\t" * common, btags) + +# With respect to junk, an earlier version of ndiff simply refused to +# *start* a match with a junk element. The result was cases like this: +# before: private Thread currentThread; +# after: private volatile Thread currentThread; +# If you consider whitespace to be junk, the longest contiguous match +# not starting with junk is "e Thread currentThread". So ndiff reported +# that "e volatil" was inserted between the 't' and the 'e' in "private". +# While an accurate view, to people that's absurd. The current version +# looks for matching blocks that are entirely junk-free, then extends the +# longest one of those as far as possible but only with matching junk. +# So now "currentThread" is matched, then extended to suck up the +# preceding blank; then "private" is matched, and extended to suck up the +# following blank; then "Thread" is matched; and finally ndiff reports +# that "volatile " was inserted before "Thread". The only quibble +# remaining is that perhaps it was really the case that " volatile" +# was inserted after "private". I can live with that . + +import re + +def IS_LINE_JUNK(line, pat=re.compile(r"\s*#?\s*$").match): + r""" + Return 1 for ignorable line: iff `line` is blank or contains a single '#'. + + Examples: + + >>> IS_LINE_JUNK('\n') + 1 + >>> IS_LINE_JUNK(' # \n') + 1 + >>> IS_LINE_JUNK('hello\n') + 0 + """ + + return pat(line) is not None + +def IS_CHARACTER_JUNK(ch, ws=" \t"): + r""" + Return 1 for ignorable character: iff `ch` is a space or tab. + + Examples: + + >>> IS_CHARACTER_JUNK(' ') + 1 + >>> IS_CHARACTER_JUNK('\t') + 1 + >>> IS_CHARACTER_JUNK('\n') + 0 + >>> IS_CHARACTER_JUNK('x') + 0 + """ + + return ch in ws + +del re + +def ndiff(a, b, linejunk=IS_LINE_JUNK, charjunk=IS_CHARACTER_JUNK): + r""" + Compare `a` and `b` (lists of strings); return a `Differ`-style delta. + + Optional keyword parameters `linejunk` and `charjunk` are for filter + functions (or None): + + - linejunk: A function that should accept a single string argument, and + return true iff the string is junk. The default is module-level function + IS_LINE_JUNK, which filters out lines without visible characters, except + for at most one splat ('#'). + + - charjunk: A function that should accept a string of length 1. The + default is module-level function IS_CHARACTER_JUNK, which filters out + whitespace characters (a blank or tab; note: bad idea to include newline + in this!). + + Tools/scripts/ndiff.py is a command-line front-end to this function. + + Example: + + >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1), + ... 'ore\ntree\nemu\n'.splitlines(1)) + >>> print ''.join(diff), + - one + ? ^ + + ore + ? ^ + - two + - three + ? - + + tree + + emu + """ + return Differ(linejunk, charjunk).compare(a, b) + +def restore(delta, which): + r""" + Generate one of the two sequences that generated a delta. + + Given a `delta` produced by `Differ.compare()` or `ndiff()`, extract + lines originating from file 1 or 2 (parameter `which`), stripping off line + prefixes. + + Examples: + + >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1), + ... 'ore\ntree\nemu\n'.splitlines(1)) + >>> diff = list(diff) + >>> print ''.join(restore(diff, 1)), + one + two + three + >>> print ''.join(restore(diff, 2)), + ore + tree + emu + """ + try: + tag = {1: "- ", 2: "+ "}[int(which)] + except KeyError: + raise ValueError, ('unknown delta choice (must be 1 or 2): %r' + % which) + prefixes = (" ", tag) + for line in delta: + if line[:2] in prefixes: + yield line[2:] + +def _test(): + import doctest, difflib + return doctest.testmod(difflib) + +if __name__ == "__main__": + _test() diff --git a/lib-python/2.2/dircache.py b/lib-python/2.2/dircache.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/dircache.py @@ -0,0 +1,44 @@ +"""Read and cache directory listings. + +The listdir() routine returns a sorted list of the files in a directory, +using a cache to avoid reading the directory more often than necessary. +The annotate() routine appends slashes to directories.""" + +import os + +__all__ = ["listdir", "opendir", "annotate", "reset"] + +cache = {} + +def reset(): + """Reset the cache completely.""" + global cache + cache = {} + +def listdir(path): + """List directory contents, using cache.""" + try: + cached_mtime, list = cache[path] + del cache[path] + except KeyError: + cached_mtime, list = -1, [] + try: + mtime = os.stat(path)[8] + except os.error: + return [] + if mtime != cached_mtime: + try: + list = os.listdir(path) + except os.error: + return [] + list.sort() + cache[path] = mtime, list + return list + +opendir = listdir # XXX backward compatibility + +def annotate(head, list): + """Add '/' suffixes to directories.""" + for i in range(len(list)): + if os.path.isdir(os.path.join(head, list[i])): + list[i] = list[i] + '/' diff --git a/lib-python/2.2/dis.py b/lib-python/2.2/dis.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/dis.py @@ -0,0 +1,327 @@ +"""Disassembler of Python byte code into mnemonics.""" + +import sys +import types + +__all__ = ["dis","disassemble","distb","disco","opname","cmp_op", + "hasconst","hasname","hasjrel","hasjabs","haslocal", + "hascompare", "hasfree"] + +def dis(x=None): + """Disassemble classes, methods, functions, or code. + + With no argument, disassemble the last traceback. + + """ + if not x: + distb() + return + if type(x) is types.InstanceType: + x = x.__class__ + if hasattr(x, 'im_func'): + x = x.im_func + if hasattr(x, 'func_code'): + x = x.func_code + if hasattr(x, '__dict__'): + items = x.__dict__.items() + items.sort() + for name, x1 in items: + if type(x1) in (types.MethodType, + types.FunctionType, + types.CodeType): + print "Disassembly of %s:" % name + try: + dis(x1) + except TypeError, msg: + print "Sorry:", msg + print + elif hasattr(x, 'co_code'): + disassemble(x) + else: + raise TypeError, \ + "don't know how to disassemble %s objects" % \ + type(x).__name__ + +def distb(tb=None): + """Disassemble a traceback (default: last traceback).""" + if not tb: + try: + tb = sys.last_traceback + except AttributeError: + raise RuntimeError, "no last traceback to disassemble" + while tb.tb_next: tb = tb.tb_next + disassemble(tb.tb_frame.f_code, tb.tb_lasti) + +def disassemble(co, lasti=-1): + """Disassemble a code object.""" + code = co.co_code + labels = findlabels(code) + n = len(code) + i = 0 + extended_arg = 0 + free = None + while i < n: + c = code[i] + op = ord(c) + if op == SET_LINENO and i > 0: print # Extra blank line + if i == lasti: print '-->', + else: print ' ', + if i in labels: print '>>', + else: print ' ', + print `i`.rjust(4), + print opname[op].ljust(20), + i = i+1 + if op >= HAVE_ARGUMENT: + oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg + extended_arg = 0 + i = i+2 + if op == EXTENDED_ARG: + extended_arg = oparg*65536L + print `oparg`.rjust(5), + if op in hasconst: + print '(' + `co.co_consts[oparg]` + ')', + elif op in hasname: + print '(' + co.co_names[oparg] + ')', + elif op in hasjrel: + print '(to ' + `i + oparg` + ')', + elif op in haslocal: + print '(' + co.co_varnames[oparg] + ')', + elif op in hascompare: + print '(' + cmp_op[oparg] + ')', + elif op in hasfree: + if free is None: + free = co.co_cellvars + co.co_freevars + print '(' + free[oparg] + ')', + print + +disco = disassemble # XXX For backwards compatibility + +def findlabels(code): + """Detect all offsets in a byte code which are jump targets. + + Return the list of offsets. + + """ + labels = [] + n = len(code) + i = 0 + while i < n: + c = code[i] + op = ord(c) + i = i+1 + if op >= HAVE_ARGUMENT: + oparg = ord(code[i]) + ord(code[i+1])*256 + i = i+2 + label = -1 + if op in hasjrel: + label = i+oparg + elif op in hasjabs: + label = oparg + if label >= 0: + if label not in labels: + labels.append(label) + return labels + +cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', + 'is not', 'exception match', 'BAD') + +hasconst = [] +hasname = [] +hasjrel = [] +hasjabs = [] +haslocal = [] +hascompare = [] +hasfree = [] + +opname = [''] * 256 +for op in range(256): opname[op] = '<' + `op` + '>' + +def def_op(name, op): + opname[op] = name + +def name_op(name, op): + opname[op] = name + hasname.append(op) + +def jrel_op(name, op): + opname[op] = name + hasjrel.append(op) + +def jabs_op(name, op): + opname[op] = name + hasjabs.append(op) + +# Instruction opcodes for compiled code + +def_op('STOP_CODE', 0) +def_op('POP_TOP', 1) +def_op('ROT_TWO', 2) +def_op('ROT_THREE', 3) +def_op('DUP_TOP', 4) +def_op('ROT_FOUR', 5) + +def_op('UNARY_POSITIVE', 10) +def_op('UNARY_NEGATIVE', 11) +def_op('UNARY_NOT', 12) +def_op('UNARY_CONVERT', 13) + +def_op('UNARY_INVERT', 15) + +def_op('BINARY_POWER', 19) + +def_op('BINARY_MULTIPLY', 20) +def_op('BINARY_DIVIDE', 21) +def_op('BINARY_MODULO', 22) +def_op('BINARY_ADD', 23) +def_op('BINARY_SUBTRACT', 24) +def_op('BINARY_SUBSCR', 25) +def_op('BINARY_FLOOR_DIVIDE', 26) +def_op('BINARY_TRUE_DIVIDE', 27) +def_op('INPLACE_FLOOR_DIVIDE', 28) +def_op('INPLACE_TRUE_DIVIDE', 29) + +def_op('SLICE+0', 30) +def_op('SLICE+1', 31) +def_op('SLICE+2', 32) +def_op('SLICE+3', 33) + +def_op('STORE_SLICE+0', 40) +def_op('STORE_SLICE+1', 41) +def_op('STORE_SLICE+2', 42) +def_op('STORE_SLICE+3', 43) + +def_op('DELETE_SLICE+0', 50) +def_op('DELETE_SLICE+1', 51) +def_op('DELETE_SLICE+2', 52) +def_op('DELETE_SLICE+3', 53) + +def_op('INPLACE_ADD', 55) +def_op('INPLACE_SUBTRACT', 56) +def_op('INPLACE_MULTIPLY', 57) +def_op('INPLACE_DIVIDE', 58) +def_op('INPLACE_MODULO', 59) +def_op('STORE_SUBSCR', 60) +def_op('DELETE_SUBSCR', 61) + +def_op('BINARY_LSHIFT', 62) +def_op('BINARY_RSHIFT', 63) +def_op('BINARY_AND', 64) +def_op('BINARY_XOR', 65) +def_op('BINARY_OR', 66) +def_op('INPLACE_POWER', 67) +def_op('GET_ITER', 68) + +def_op('PRINT_EXPR', 70) +def_op('PRINT_ITEM', 71) +def_op('PRINT_NEWLINE', 72) +def_op('PRINT_ITEM_TO', 73) +def_op('PRINT_NEWLINE_TO', 74) +def_op('INPLACE_LSHIFT', 75) +def_op('INPLACE_RSHIFT', 76) +def_op('INPLACE_AND', 77) +def_op('INPLACE_XOR', 78) +def_op('INPLACE_OR', 79) +def_op('BREAK_LOOP', 80) + +def_op('LOAD_LOCALS', 82) +def_op('RETURN_VALUE', 83) +def_op('IMPORT_STAR', 84) +def_op('EXEC_STMT', 85) +def_op('YIELD_STMT', 86) + +def_op('POP_BLOCK', 87) +def_op('END_FINALLY', 88) +def_op('BUILD_CLASS', 89) + +HAVE_ARGUMENT = 90 # Opcodes from here have an argument: + +name_op('STORE_NAME', 90) # Index in name list +name_op('DELETE_NAME', 91) # "" +def_op('UNPACK_SEQUENCE', 92) # Number of tuple items +jrel_op('FOR_ITER', 93) + +name_op('STORE_ATTR', 95) # Index in name list +name_op('DELETE_ATTR', 96) # "" +name_op('STORE_GLOBAL', 97) # "" +name_op('DELETE_GLOBAL', 98) # "" +def_op('DUP_TOPX', 99) # number of items to duplicate +def_op('LOAD_CONST', 100) # Index in const list +hasconst.append(100) +name_op('LOAD_NAME', 101) # Index in name list +def_op('BUILD_TUPLE', 102) # Number of tuple items +def_op('BUILD_LIST', 103) # Number of list items +def_op('BUILD_MAP', 104) # Always zero for now +name_op('LOAD_ATTR', 105) # Index in name list +def_op('COMPARE_OP', 106) # Comparison operator +hascompare.append(106) +name_op('IMPORT_NAME', 107) # Index in name list +name_op('IMPORT_FROM', 108) # Index in name list + +jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip +jrel_op('JUMP_IF_FALSE', 111) # "" +jrel_op('JUMP_IF_TRUE', 112) # "" +jabs_op('JUMP_ABSOLUTE', 113) # Target byte offset from beginning of code +jrel_op('FOR_LOOP', 114) # Number of bytes to skip + +name_op('LOAD_GLOBAL', 116) # Index in name list + +jabs_op('CONTINUE_LOOP', 119) # Target address +jrel_op('SETUP_LOOP', 120) # Distance to target address +jrel_op('SETUP_EXCEPT', 121) # "" +jrel_op('SETUP_FINALLY', 122) # "" + +def_op('LOAD_FAST', 124) # Local variable number +haslocal.append(124) +def_op('STORE_FAST', 125) # Local variable number +haslocal.append(125) +def_op('DELETE_FAST', 126) # Local variable number +haslocal.append(126) + +def_op('SET_LINENO', 127) # Current line number +SET_LINENO = 127 + +def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) +def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8) +def_op('MAKE_FUNCTION', 132) # Number of args with default values +def_op('BUILD_SLICE', 133) # Number of items + +def_op('MAKE_CLOSURE', 134) +def_op('LOAD_CLOSURE', 135) +hasfree.append(135) +def_op('LOAD_DEREF', 136) +hasfree.append(136) +def_op('STORE_DEREF', 137) +hasfree.append(137) + +def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) + +def_op('EXTENDED_ARG', 143) +EXTENDED_ARG = 143 + +def _test(): + """Simple test program to disassemble a file.""" + if sys.argv[1:]: + if sys.argv[2:]: + sys.stderr.write("usage: python dis.py [-|file]\n") + sys.exit(2) + fn = sys.argv[1] + if not fn or fn == "-": + fn = None + else: + fn = None + if not fn: + f = sys.stdin + else: + f = open(fn) + source = f.read() + if fn: + f.close() + else: + fn = "" + code = compile(source, fn, "exec") + dis(code) + +if __name__ == "__main__": + _test() diff --git a/lib-python/2.2/distutils/README b/lib-python/2.2/distutils/README new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/README @@ -0,0 +1,18 @@ +This directory contains only a subset of the Distutils, specifically the +Python modules in the 'distutils' and 'distutils.command' packages. +Technically, this is all you need to distribute and install Python modules +using the Distutils. Most people will want some documentation and other +help, though. Currently, everything can be found at the Distutils web page: + + http://www.python.org/sigs/distutils-sig/ + +From there you can access the latest documentation, or download a standalone +Distutils release that includes all the code in this directory, plus +documentation, test scripts, examples, etc. + +The Distutils documentation isn't yet part of the standard Python +documentation set, but will be soon. + + Greg Ward (gward at python.net) + +$Id$ diff --git a/lib-python/2.2/distutils/__init__.py b/lib-python/2.2/distutils/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/__init__.py @@ -0,0 +1,13 @@ +"""distutils + +The main package for the Python Module Distribution Utilities. Normally +used from a setup script as + + from distutils.core import setup + + setup (...) +""" + +__revision__ = "$Id$" + +__version__ = "1.0.3" diff --git a/lib-python/2.2/distutils/archive_util.py b/lib-python/2.2/distutils/archive_util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/archive_util.py @@ -0,0 +1,173 @@ +"""distutils.archive_util + +Utility functions for creating archive files (tarballs, zip files, +that sort of thing).""" + +# created 2000/04/03, Greg Ward (extracted from util.py) + +__revision__ = "$Id$" + +import os +from distutils.errors import DistutilsExecError +from distutils.spawn import spawn +from distutils.dir_util import mkpath + +def make_tarball (base_name, base_dir, compress="gzip", + verbose=0, dry_run=0): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. 'compress' must be "gzip" (the default), "compress", + "bzip2", or None. Both "tar" and the compression utility named by + 'compress' must be on the default program search path, so this is + probably Unix-specific. The output tar file will be named 'base_dir' + + ".tar", possibly plus the appropriate compression extension (".gz", + ".bz2" or ".Z"). Return the output filename. + """ + # XXX GNU tar 1.13 has a nifty option to add a prefix directory. + # It's pretty new, though, so we certainly can't require it -- + # but it would be nice to take advantage of it to skip the + # "create a tree of hardlinks" step! (Would also be nice to + # detect GNU tar to use its 'z' option and save a step.) + + compress_ext = { 'gzip': ".gz", + 'bzip2': '.bz2', + 'compress': ".Z" } + + # flags for compression program, each element of list will be an argument + compress_flags = {'gzip': ["-f9"], + 'compress': ["-f"], + 'bzip2': ['-f9']} + + if compress is not None and compress not in compress_ext.keys(): + raise ValueError, \ + "bad value for 'compress': must be None, 'gzip', or 'compress'" + + archive_name = base_name + ".tar" + mkpath(os.path.dirname(archive_name), verbose=verbose, dry_run=dry_run) + cmd = ["tar", "-cf", archive_name, base_dir] + spawn(cmd, verbose=verbose, dry_run=dry_run) + + if compress: + spawn([compress] + compress_flags[compress] + [archive_name], + verbose=verbose, dry_run=dry_run) + return archive_name + compress_ext[compress] + else: + return archive_name + +# make_tarball () + + +def make_zipfile (base_name, base_dir, verbose=0, dry_run=0): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the InfoZIP + "zip" utility (if installed and found on the default search path) or + the "zipfile" Python module (if available). If neither tool is + available, raises DistutilsExecError. Returns the name of the output + zip file. + """ + # This initially assumed the Unix 'zip' utility -- but + # apparently InfoZIP's zip.exe works the same under Windows, so + # no changes needed! + + zip_filename = base_name + ".zip" + mkpath(os.path.dirname(zip_filename), verbose=verbose, dry_run=dry_run) + try: + spawn(["zip", "-rq", zip_filename, base_dir], + verbose=verbose, dry_run=dry_run) + except DistutilsExecError: + + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed" -- shouldn't try + # again in the latter case. (I think fixing this will + # require some cooperation from the spawn module -- perhaps + # a utility function to search the path, so we can fallback + # on zipfile.py without the failed spawn.) + try: + import zipfile + except ImportError: + raise DistutilsExecError, \ + ("unable to create zip file '%s': " + + "could neither find a standalone zip utility nor " + + "import the 'zipfile' module") % zip_filename + + if verbose: + print "creating '%s' and adding '%s' to it" % \ + (zip_filename, base_dir) + + def visit (z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + z.write(path, path) + + if not dry_run: + z = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + os.path.walk(base_dir, visit, z) + z.close() + + return zip_filename + +# make_zipfile () + + +ARCHIVE_FORMATS = { + 'gztar': (make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'ztar': (make_tarball, [('compress', 'compress')], "compressed tar file"), + 'tar': (make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (make_zipfile, [],"ZIP file") + } + +def check_archive_formats (formats): + for format in formats: + if not ARCHIVE_FORMATS.has_key(format): + return format + else: + return None + +def make_archive (base_name, format, + root_dir=None, base_dir=None, + verbose=0, dry_run=0): + """Create an archive file (eg. zip or tar). 'base_name' is the name + of the file to create, minus any format-specific extension; 'format' + is the archive format: one of "zip", "tar", "ztar", or "gztar". + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if verbose: + print "changing into '%s'" % root_dir + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = { 'verbose': verbose, + 'dry_run': dry_run } + + try: + format_info = ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError, "unknown archive format '%s'" % format + + func = format_info[0] + for (arg,val) in format_info[1]: + kwargs[arg] = val + filename = apply(func, (base_name, base_dir), kwargs) + + if root_dir is not None: + if verbose: + print "changing back to '%s'" % save_cwd + os.chdir(save_cwd) + + return filename + +# make_archive () diff --git a/lib-python/2.2/distutils/bcppcompiler.py b/lib-python/2.2/distutils/bcppcompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/bcppcompiler.py @@ -0,0 +1,409 @@ +"""distutils.bcppcompiler + +Contains BorlandCCompiler, an implementation of the abstract CCompiler class +for the Borland C++ compiler. +""" + +# This implementation by Lyle Johnson, based on the original msvccompiler.py +# module and using the directions originally published by Gordon Williams. + +# XXX looks like there's a LOT of overlap between these two classes: +# someone should sit down and factor out the common code as +# WindowsCCompiler! --GPW + +__revision__ = "$Id$" + + +import sys, os +from distutils.errors import \ + DistutilsExecError, DistutilsPlatformError, \ + CompileError, LibError, LinkError, UnknownFileError +from distutils.ccompiler import \ + CCompiler, gen_preprocess_options, gen_lib_options +from distutils.file_util import write_file +from distutils.dep_util import newer + +class BCPPCompiler(CCompiler) : + """Concrete class that implements an interface to the Borland C/C++ + compiler, as defined by the CCompiler abstract class. + """ + + compiler_type = 'bcpp' + + # Just set this so CCompiler's constructor doesn't barf. We currently + # don't use the 'set_executables()' bureaucracy provided by CCompiler, + # as it really isn't necessary for this sort of single-compiler class. + # Would be nice to have a consistent interface with UnixCCompiler, + # though, so it's worth thinking about. + executables = {} + + # Private class data (need to distinguish C from C++ source for compiler) + _c_extensions = ['.c'] + _cpp_extensions = ['.cc', '.cpp', '.cxx'] + + # Needed for the filename generation methods provided by the + # base class, CCompiler. + src_extensions = _c_extensions + _cpp_extensions + obj_extension = '.obj' + static_lib_extension = '.lib' + shared_lib_extension = '.dll' + static_lib_format = shared_lib_format = '%s%s' + exe_extension = '.exe' + + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + CCompiler.__init__ (self, verbose, dry_run, force) + + # These executables are assumed to all be in the path. + # Borland doesn't seem to use any special registry settings to + # indicate their installation locations. + + self.cc = "bcc32.exe" + self.linker = "ilink32.exe" + self.lib = "tlib.exe" + + self.preprocess_options = None + self.compile_options = ['/tWM', '/O2', '/q', '/g0'] + self.compile_options_debug = ['/tWM', '/Od', '/q', '/g0'] + + self.ldflags_shared = ['/Tpd', '/Gn', '/q', '/x'] + self.ldflags_shared_debug = ['/Tpd', '/Gn', '/q', '/x'] + self.ldflags_static = [] + self.ldflags_exe = ['/Gn', '/q', '/x'] + self.ldflags_exe_debug = ['/Gn', '/q', '/x','/r'] + + + # -- Worker methods ------------------------------------------------ + + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (output_dir, macros, include_dirs) = \ + self._fix_compile_args (output_dir, macros, include_dirs) + (objects, skip_sources) = self._prep_compile (sources, output_dir) + + if extra_postargs is None: + extra_postargs = [] + + pp_opts = gen_preprocess_options (macros, include_dirs) + compile_opts = extra_preargs or [] + compile_opts.append ('-c') + if debug: + compile_opts.extend (self.compile_options_debug) + else: + compile_opts.extend (self.compile_options) + + for i in range (len (sources)): + src = sources[i] ; obj = objects[i] + ext = (os.path.splitext (src))[1] + + if skip_sources[src]: + self.announce ("skipping %s (%s up-to-date)" % (src, obj)) + else: + src = os.path.normpath(src) + obj = os.path.normpath(obj) + self.mkpath(os.path.dirname(obj)) + + if ext == '.res': + # This is already a binary file -- skip it. + continue # the 'for' loop + if ext == '.rc': + # This needs to be compiled to a .res file -- do it now. + try: + self.spawn (["brcc32", "-fo", obj, src]) + except DistutilsExecError, msg: + raise CompileError, msg + continue # the 'for' loop + + # The next two are both for the real compiler. + if ext in self._c_extensions: + input_opt = "" + elif ext in self._cpp_extensions: + input_opt = "-P" + else: + # Unknown file type -- no extra options. The compiler + # will probably fail, but let it just in case this is a + # file the compiler recognizes even if we don't. + input_opt = "" + + output_opt = "-o" + obj + + # Compiler command line syntax is: "bcc32 [options] file(s)". + # Note that the source file names must appear at the end of + # the command line. + try: + self.spawn ([self.cc] + compile_opts + pp_opts + + [input_opt, output_opt] + + extra_postargs + [src]) + except DistutilsExecError, msg: + raise CompileError, msg + + return objects + + # compile () + + + def create_static_lib (self, + objects, + output_libname, + output_dir=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (objects, output_dir) = self._fix_object_args (objects, output_dir) + output_filename = \ + self.library_filename (output_libname, output_dir=output_dir) + + if self._need_link (objects, output_filename): + lib_args = [output_filename, '/u'] + objects + if debug: + pass # XXX what goes here? + if extra_preargs: + lib_args[:0] = extra_preargs + if extra_postargs: + lib_args.extend (extra_postargs) + try: + self.spawn ([self.lib] + lib_args) + except DistutilsExecError, msg: + raise LibError, msg + else: + self.announce ("skipping %s (up-to-date)" % output_filename) + + # create_static_lib () + + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + + # XXX this ignores 'build_temp'! should follow the lead of + # msvccompiler.py + + (objects, output_dir) = self._fix_object_args (objects, output_dir) + (libraries, library_dirs, runtime_library_dirs) = \ + self._fix_lib_args (libraries, library_dirs, runtime_library_dirs) + + if runtime_library_dirs: + self.warn ("I don't know what to do with 'runtime_library_dirs': " + + str (runtime_library_dirs)) + + if output_dir is not None: + output_filename = os.path.join (output_dir, output_filename) + + if self._need_link (objects, output_filename): + + # Figure out linker args based on type of target. + if target_desc == CCompiler.EXECUTABLE: + startup_obj = 'c0w32' + if debug: + ld_args = self.ldflags_exe_debug[:] + else: + ld_args = self.ldflags_exe[:] + else: + startup_obj = 'c0d32' + if debug: + ld_args = self.ldflags_shared_debug[:] + else: + ld_args = self.ldflags_shared[:] + + + # Create a temporary exports file for use by the linker + if export_symbols is None: + def_file = '' + else: + head, tail = os.path.split (output_filename) + modname, ext = os.path.splitext (tail) + temp_dir = os.path.dirname(objects[0]) # preserve tree structure + def_file = os.path.join (temp_dir, '%s.def' % modname) + contents = ['EXPORTS'] + for sym in (export_symbols or []): + contents.append(' %s=_%s' % (sym, sym)) + self.execute(write_file, (def_file, contents), + "writing %s" % def_file) + + # Borland C++ has problems with '/' in paths + objects2 = map(os.path.normpath, objects) + # split objects in .obj and .res files + # Borland C++ needs them at different positions in the command line + objects = [startup_obj] + resources = [] + for file in objects2: + (base, ext) = os.path.splitext(os.path.normcase(file)) + if ext == '.res': + resources.append(file) + else: + objects.append(file) + + + for l in library_dirs: + ld_args.append("/L%s" % os.path.normpath(l)) + ld_args.append("/L.") # we sometimes use relative paths + + # list of object files + ld_args.extend(objects) + + # XXX the command-line syntax for Borland C++ is a bit wonky; + # certain filenames are jammed together in one big string, but + # comma-delimited. This doesn't mesh too well with the + # Unix-centric attitude (with a DOS/Windows quoting hack) of + # 'spawn()', so constructing the argument list is a bit + # awkward. Note that doing the obvious thing and jamming all + # the filenames and commas into one argument would be wrong, + # because 'spawn()' would quote any filenames with spaces in + # them. Arghghh!. Apparently it works fine as coded... + + # name of dll/exe file + ld_args.extend([',',output_filename]) + # no map file and start libraries + ld_args.append(',,') + + for lib in libraries: + # see if we find it and if there is a bcpp specific lib + # (xxx_bcpp.lib) + libfile = self.find_library_file(library_dirs, lib, debug) + if libfile is None: + ld_args.append(lib) + # probably a BCPP internal library -- don't warn + # self.warn('library %s not found.' % lib) + else: + # full name which prefers bcpp_xxx.lib over xxx.lib + ld_args.append(libfile) + + # some default libraries + ld_args.append ('import32') + ld_args.append ('cw32mt') + + # def file for export symbols + ld_args.extend([',',def_file]) + # add resource files + ld_args.append(',') + ld_args.extend(resources) + + + if extra_preargs: + ld_args[:0] = extra_preargs + if extra_postargs: + ld_args.extend(extra_postargs) + + self.mkpath (os.path.dirname (output_filename)) + try: + self.spawn ([self.linker] + ld_args) + except DistutilsExecError, msg: + raise LinkError, msg + + else: + self.announce ("skipping %s (up-to-date)" % output_filename) + + # link () + + # -- Miscellaneous methods ----------------------------------------- + + + def find_library_file (self, dirs, lib, debug=0): + # List of effective library names to try, in order of preference: + # xxx_bcpp.lib is better than xxx.lib + # and xxx_d.lib is better than xxx.lib if debug is set + # + # The "_bcpp" suffix is to handle a Python installation for people + # with multiple compilers (primarily Distutils hackers, I suspect + # ;-). The idea is they'd have one static library for each + # compiler they care about, since (almost?) every Windows compiler + # seems to have a different format for static libraries. + if debug: + dlib = (lib + "_d") + try_names = (dlib + "_bcpp", lib + "_bcpp", dlib, lib) + else: + try_names = (lib + "_bcpp", lib) + + for dir in dirs: + for name in try_names: + libfile = os.path.join(dir, self.library_filename(name)) + if os.path.exists(libfile): + return libfile + else: + # Oops, didn't find it in *any* of 'dirs' + return None + + # overwrite the one from CCompiler to support rc and res-files + def object_filenames (self, + source_filenames, + strip_dir=0, + output_dir=''): + if output_dir is None: output_dir = '' + obj_names = [] + for src_name in source_filenames: + # use normcase to make sure '.rc' is really '.rc' and not '.RC' + (base, ext) = os.path.splitext (os.path.normcase(src_name)) + if ext not in (self.src_extensions + ['.rc','.res']): + raise UnknownFileError, \ + "unknown file type '%s' (from '%s')" % \ + (ext, src_name) + if strip_dir: + base = os.path.basename (base) + if ext == '.res': + # these can go unchanged + obj_names.append (os.path.join (output_dir, base + ext)) + elif ext == '.rc': + # these need to be compiled to .res-files + obj_names.append (os.path.join (output_dir, base + '.res')) + else: + obj_names.append (os.path.join (output_dir, + base + self.obj_extension)) + return obj_names + + # object_filenames () + + def preprocess (self, + source, + output_file=None, + macros=None, + include_dirs=None, + extra_preargs=None, + extra_postargs=None): + + (_, macros, include_dirs) = \ + self._fix_compile_args(None, macros, include_dirs) + pp_opts = gen_preprocess_options(macros, include_dirs) + pp_args = ['cpp32.exe'] + pp_opts + if output_file is not None: + pp_args.append('-o' + output_file) + if extra_preargs: + pp_args[:0] = extra_preargs + if extra_postargs: + pp_args.extend(extra_postargs) + pp_args.append(source) + + # We need to preprocess: either we're being forced to, or the + # source file is newer than the target (or the target doesn't + # exist). + if self.force or output_file is None or newer(source, output_file): + if output_file: + self.mkpath(os.path.dirname(output_file)) + try: + self.spawn(pp_args) + except DistutilsExecError, msg: + print msg + raise CompileError, msg + + # preprocess() diff --git a/lib-python/2.2/distutils/ccompiler.py b/lib-python/2.2/distutils/ccompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/ccompiler.py @@ -0,0 +1,1046 @@ +"""distutils.ccompiler + +Contains CCompiler, an abstract base class that defines the interface +for the Distutils compiler abstraction model.""" + +# created 1999/07/05, Greg Ward + +__revision__ = "$Id$" + +import sys, os, re +from types import * +from copy import copy +from distutils.errors import * +from distutils.spawn import spawn +from distutils.file_util import move_file +from distutils.dir_util import mkpath +from distutils.dep_util import newer_pairwise, newer_group +from distutils.util import split_quoted, execute + + +class CCompiler: + """Abstract base class to define the interface that must be implemented + by real compiler classes. Also has some utility methods used by + several compiler classes. + + The basic idea behind a compiler abstraction class is that each + instance can be used for all the compile/link steps in building a + single project. Thus, attributes common to all of those compile and + link steps -- include directories, macros to define, libraries to link + against, etc. -- are attributes of the compiler instance. To allow for + variability in how individual files are treated, most of those + attributes may be varied on a per-compilation or per-link basis. + """ + + # 'compiler_type' is a class attribute that identifies this class. It + # keeps code that wants to know what kind of compiler it's dealing with + # from having to import all possible compiler classes just to do an + # 'isinstance'. In concrete CCompiler subclasses, 'compiler_type' + # should really, really be one of the keys of the 'compiler_class' + # dictionary (see below -- used by the 'new_compiler()' factory + # function) -- authors of new compiler interface classes are + # responsible for updating 'compiler_class'! + compiler_type = None + + # XXX things not handled by this compiler abstraction model: + # * client can't provide additional options for a compiler, + # e.g. warning, optimization, debugging flags. Perhaps this + # should be the domain of concrete compiler abstraction classes + # (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base + # class should have methods for the common ones. + # * can't completely override the include or library searchg + # path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2". + # I'm not sure how widely supported this is even by Unix + # compilers, much less on other platforms. And I'm even less + # sure how useful it is; maybe for cross-compiling, but + # support for that is a ways off. (And anyways, cross + # compilers probably have a dedicated binary with the + # right paths compiled in. I hope.) + # * can't do really freaky things with the library list/library + # dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against + # different versions of libfoo.a in different locations. I + # think this is useless without the ability to null out the + # library search path anyways. + + + # Subclasses that rely on the standard filename generation methods + # implemented below should override these; see the comment near + # those methods ('object_filenames()' et. al.) for details: + src_extensions = None # list of strings + obj_extension = None # string + static_lib_extension = None + shared_lib_extension = None # string + static_lib_format = None # format string + shared_lib_format = None # prob. same as static_lib_format + exe_extension = None # string + + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + self.verbose = verbose + self.dry_run = dry_run + self.force = force + + # 'output_dir': a common output directory for object, library, + # shared object, and shared library files + self.output_dir = None + + # 'macros': a list of macro definitions (or undefinitions). A + # macro definition is a 2-tuple (name, value), where the value is + # either a string or None (no explicit value). A macro + # undefinition is a 1-tuple (name,). + self.macros = [] + + # 'include_dirs': a list of directories to search for include files + self.include_dirs = [] + + # 'libraries': a list of libraries to include in any link + # (library names, not filenames: eg. "foo" not "libfoo.a") + self.libraries = [] + + # 'library_dirs': a list of directories to search for libraries + self.library_dirs = [] + + # 'runtime_library_dirs': a list of directories to search for + # shared libraries/objects at runtime + self.runtime_library_dirs = [] + + # 'objects': a list of object files (or similar, such as explicitly + # named library files) to include on any link + self.objects = [] + + for key in self.executables.keys(): + self.set_executable(key, self.executables[key]) + + # __init__ () + + + def set_executables (self, **args): + + """Define the executables (and options for them) that will be run + to perform the various stages of compilation. The exact set of + executables that may be specified here depends on the compiler + class (via the 'executables' class attribute), but most will have: + compiler the C/C++ compiler + linker_so linker used to create shared objects and libraries + linker_exe linker used to create binary executables + archiver static library creator + + On platforms with a command-line (Unix, DOS/Windows), each of these + is a string that will be split into executable name and (optional) + list of arguments. (Splitting the string is done similarly to how + Unix shells operate: words are delimited by spaces, but quotes and + backslashes can override this. See + 'distutils.util.split_quoted()'.) + """ + + # Note that some CCompiler implementation classes will define class + # attributes 'cpp', 'cc', etc. with hard-coded executable names; + # this is appropriate when a compiler class is for exactly one + # compiler/OS combination (eg. MSVCCompiler). Other compiler + # classes (UnixCCompiler, in particular) are driven by information + # discovered at run-time, since there are many different ways to do + # basically the same things with Unix C compilers. + + for key in args.keys(): + if not self.executables.has_key(key): + raise ValueError, \ + "unknown executable '%s' for class %s" % \ + (key, self.__class__.__name__) + self.set_executable(key, args[key]) + + # set_executables () + + def set_executable(self, key, value): + if type(value) is StringType: + setattr(self, key, split_quoted(value)) + else: + setattr(self, key, value) + + + + def _find_macro (self, name): + i = 0 + for defn in self.macros: + if defn[0] == name: + return i + i = i + 1 + + return None + + + def _check_macro_definitions (self, definitions): + """Ensures that every element of 'definitions' is a valid macro + definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do + nothing if all definitions are OK, raise TypeError otherwise. + """ + for defn in definitions: + if not (type (defn) is TupleType and + (len (defn) == 1 or + (len (defn) == 2 and + (type (defn[1]) is StringType or defn[1] is None))) and + type (defn[0]) is StringType): + raise TypeError, \ + ("invalid macro definition '%s': " % defn) + \ + "must be tuple (string,), (string, string), or " + \ + "(string, None)" + + + # -- Bookkeeping methods ------------------------------------------- + + def define_macro (self, name, value=None): + """Define a preprocessor macro for all compilations driven by this + compiler object. The optional parameter 'value' should be a + string; if it is not supplied, then the macro will be defined + without an explicit value and the exact outcome depends on the + compiler used (XXX true? does ANSI say anything about this?) + """ + # Delete from the list of macro definitions/undefinitions if + # already there (so that this one will take precedence). + i = self._find_macro (name) + if i is not None: + del self.macros[i] + + defn = (name, value) + self.macros.append (defn) + + + def undefine_macro (self, name): + """Undefine a preprocessor macro for all compilations driven by + this compiler object. If the same macro is defined by + 'define_macro()' and undefined by 'undefine_macro()' the last call + takes precedence (including multiple redefinitions or + undefinitions). If the macro is redefined/undefined on a + per-compilation basis (ie. in the call to 'compile()'), then that + takes precedence. + """ + # Delete from the list of macro definitions/undefinitions if + # already there (so that this one will take precedence). + i = self._find_macro (name) + if i is not None: + del self.macros[i] + + undefn = (name,) + self.macros.append (undefn) + + + def add_include_dir (self, dir): + """Add 'dir' to the list of directories that will be searched for + header files. The compiler is instructed to search directories in + the order in which they are supplied by successive calls to + 'add_include_dir()'. + """ + self.include_dirs.append (dir) + + def set_include_dirs (self, dirs): + """Set the list of directories that will be searched to 'dirs' (a + list of strings). Overrides any preceding calls to + 'add_include_dir()'; subsequence calls to 'add_include_dir()' add + to the list passed to 'set_include_dirs()'. This does not affect + any list of standard include directories that the compiler may + search by default. + """ + self.include_dirs = copy (dirs) + + + def add_library (self, libname): + """Add 'libname' to the list of libraries that will be included in + all links driven by this compiler object. Note that 'libname' + should *not* be the name of a file containing a library, but the + name of the library itself: the actual filename will be inferred by + the linker, the compiler, or the compiler class (depending on the + platform). + + The linker will be instructed to link against libraries in the + order they were supplied to 'add_library()' and/or + 'set_libraries()'. It is perfectly valid to duplicate library + names; the linker will be instructed to link against libraries as + many times as they are mentioned. + """ + self.libraries.append (libname) + + def set_libraries (self, libnames): + """Set the list of libraries to be included in all links driven by + this compiler object to 'libnames' (a list of strings). This does + not affect any standard system libraries that the linker may + include by default. + """ + self.libraries = copy (libnames) + + + def add_library_dir (self, dir): + """Add 'dir' to the list of directories that will be searched for + libraries specified to 'add_library()' and 'set_libraries()'. The + linker will be instructed to search for libraries in the order they + are supplied to 'add_library_dir()' and/or 'set_library_dirs()'. + """ + self.library_dirs.append (dir) + + def set_library_dirs (self, dirs): + """Set the list of library search directories to 'dirs' (a list of + strings). This does not affect any standard library search path + that the linker may search by default. + """ + self.library_dirs = copy (dirs) + + + def add_runtime_library_dir (self, dir): + """Add 'dir' to the list of directories that will be searched for + shared libraries at runtime. + """ + self.runtime_library_dirs.append (dir) + + def set_runtime_library_dirs (self, dirs): + """Set the list of directories to search for shared libraries at + runtime to 'dirs' (a list of strings). This does not affect any + standard search path that the runtime linker may search by + default. + """ + self.runtime_library_dirs = copy (dirs) + + + def add_link_object (self, object): + """Add 'object' to the list of object files (or analogues, such as + explicitly named library files or the output of "resource + compilers") to be included in every link driven by this compiler + object. + """ + self.objects.append (object) + + def set_link_objects (self, objects): + """Set the list of object files (or analogues) to be included in + every link to 'objects'. This does not affect any standard object + files that the linker may include by default (such as system + libraries). + """ + self.objects = copy (objects) + + + # -- Priviate utility methods -------------------------------------- + # (here for the convenience of subclasses) + + def _fix_compile_args (self, output_dir, macros, include_dirs): + """Typecheck and fix-up some of the arguments to the 'compile()' + method, and return fixed-up values. Specifically: if 'output_dir' + is None, replaces it with 'self.output_dir'; ensures that 'macros' + is a list, and augments it with 'self.macros'; ensures that + 'include_dirs' is a list, and augments it with 'self.include_dirs'. + Guarantees that the returned values are of the correct type, + i.e. for 'output_dir' either string or None, and for 'macros' and + 'include_dirs' either list or None. + """ + if output_dir is None: + output_dir = self.output_dir + elif type (output_dir) is not StringType: + raise TypeError, "'output_dir' must be a string or None" + + if macros is None: + macros = self.macros + elif type (macros) is ListType: + macros = macros + (self.macros or []) + else: + raise TypeError, \ + "'macros' (if supplied) must be a list of tuples" + + if include_dirs is None: + include_dirs = self.include_dirs + elif type (include_dirs) in (ListType, TupleType): + include_dirs = list (include_dirs) + (self.include_dirs or []) + else: + raise TypeError, \ + "'include_dirs' (if supplied) must be a list of strings" + + return (output_dir, macros, include_dirs) + + # _fix_compile_args () + + + def _prep_compile (self, sources, output_dir): + """Determine the list of object files corresponding to 'sources', + and figure out which ones really need to be recompiled. Return a + list of all object files and a dictionary telling which source + files can be skipped. + """ + # Get the list of expected output (object) files + objects = self.object_filenames (sources, + strip_dir=1, + output_dir=output_dir) + + if self.force: + skip_source = {} # rebuild everything + for source in sources: + skip_source[source] = 0 + else: + # Figure out which source files we have to recompile according + # to a simplistic check -- we just compare the source and + # object file, no deep dependency checking involving header + # files. + skip_source = {} # rebuild everything + for source in sources: # no wait, rebuild nothing + skip_source[source] = 1 + + (n_sources, n_objects) = newer_pairwise (sources, objects) + for source in n_sources: # no really, only rebuild what's + skip_source[source] = 0 # out-of-date + + return (objects, skip_source) + + # _prep_compile () + + + def _fix_object_args (self, objects, output_dir): + """Typecheck and fix up some arguments supplied to various methods. + Specifically: ensure that 'objects' is a list; if output_dir is + None, replace with self.output_dir. Return fixed versions of + 'objects' and 'output_dir'. + """ + if type (objects) not in (ListType, TupleType): + raise TypeError, \ + "'objects' must be a list or tuple of strings" + objects = list (objects) + + if output_dir is None: + output_dir = self.output_dir + elif type (output_dir) is not StringType: + raise TypeError, "'output_dir' must be a string or None" + + return (objects, output_dir) + + + def _fix_lib_args (self, libraries, library_dirs, runtime_library_dirs): + """Typecheck and fix up some of the arguments supplied to the + 'link_*' methods. Specifically: ensure that all arguments are + lists, and augment them with their permanent versions + (eg. 'self.libraries' augments 'libraries'). Return a tuple with + fixed versions of all arguments. + """ + if libraries is None: + libraries = self.libraries + elif type (libraries) in (ListType, TupleType): + libraries = list (libraries) + (self.libraries or []) + else: + raise TypeError, \ + "'libraries' (if supplied) must be a list of strings" + + if library_dirs is None: + library_dirs = self.library_dirs + elif type (library_dirs) in (ListType, TupleType): + library_dirs = list (library_dirs) + (self.library_dirs or []) + else: + raise TypeError, \ + "'library_dirs' (if supplied) must be a list of strings" + + if runtime_library_dirs is None: + runtime_library_dirs = self.runtime_library_dirs + elif type (runtime_library_dirs) in (ListType, TupleType): + runtime_library_dirs = (list (runtime_library_dirs) + + (self.runtime_library_dirs or [])) + else: + raise TypeError, \ + "'runtime_library_dirs' (if supplied) " + \ + "must be a list of strings" + + return (libraries, library_dirs, runtime_library_dirs) + + # _fix_lib_args () + + + def _need_link (self, objects, output_file): + """Return true if we need to relink the files listed in 'objects' + to recreate 'output_file'. + """ + if self.force: + return 1 + else: + if self.dry_run: + newer = newer_group (objects, output_file, missing='newer') + else: + newer = newer_group (objects, output_file) + return newer + + # _need_link () + + + # -- Worker methods ------------------------------------------------ + # (must be implemented by subclasses) + + def preprocess (self, + source, + output_file=None, + macros=None, + include_dirs=None, + extra_preargs=None, + extra_postargs=None): + """Preprocess a single C/C++ source file, named in 'source'. + Output will be written to file named 'output_file', or stdout if + 'output_file' not supplied. 'macros' is a list of macro + definitions as for 'compile()', which will augment the macros set + with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a + list of directory names that will be added to the default list. + + Raises PreprocessError on failure. + """ + pass + + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + """Compile one or more source files. 'sources' must be a list of + filenames, most likely C/C++ files, but in reality anything that + can be handled by a particular compiler and compiler class + (eg. MSVCCompiler can handle resource files in 'sources'). Return + a list of object filenames, one per source filename in 'sources'. + Depending on the implementation, not all source files will + necessarily be compiled, but all corresponding object filenames + will be returned. + + If 'output_dir' is given, object files will be put under it, while + retaining their original path component. That is, "foo/bar.c" + normally compiles to "foo/bar.o" (for a Unix implementation); if + 'output_dir' is "build", then it would compile to + "build/foo/bar.o". + + 'macros', if given, must be a list of macro definitions. A macro + definition is either a (name, value) 2-tuple or a (name,) 1-tuple. + The former defines a macro; if the value is None, the macro is + defined without an explicit value. The 1-tuple case undefines a + macro. Later definitions/redefinitions/ undefinitions take + precedence. + + 'include_dirs', if given, must be a list of strings, the + directories to add to the default include file search path for this + compilation only. + + 'debug' is a boolean; if true, the compiler will be instructed to + output debug symbols in (or alongside) the object file(s). + + 'extra_preargs' and 'extra_postargs' are implementation- dependent. + On platforms that have the notion of a command-line (e.g. Unix, + DOS/Windows), they are most likely lists of strings: extra + command-line arguments to prepand/append to the compiler command + line. On other platforms, consult the implementation class + documentation. In any event, they are intended as an escape hatch + for those occasions when the abstract compiler framework doesn't + cut the mustard. + + Raises CompileError on failure. + """ + pass + + + def create_static_lib (self, + objects, + output_libname, + output_dir=None, + debug=0): + """Link a bunch of stuff together to create a static library file. + The "bunch of stuff" consists of the list of object files supplied + as 'objects', the extra object files supplied to + 'add_link_object()' and/or 'set_link_objects()', the libraries + supplied to 'add_library()' and/or 'set_libraries()', and the + libraries supplied as 'libraries' (if any). + + 'output_libname' should be a library name, not a filename; the + filename will be inferred from the library name. 'output_dir' is + the directory where the library file will be put. + + 'debug' is a boolean; if true, debugging information will be + included in the library (note that on most platforms, it is the + compile step where this matters: the 'debug' flag is included here + just for consistency). + + Raises LibError on failure. + """ + pass + + + # values for target_desc parameter in link() + SHARED_OBJECT = "shared_object" + SHARED_LIBRARY = "shared_library" + EXECUTABLE = "executable" + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + """Link a bunch of stuff together to create an executable or + shared library file. + + The "bunch of stuff" consists of the list of object files supplied + as 'objects'. 'output_filename' should be a filename. If + 'output_dir' is supplied, 'output_filename' is relative to it + (i.e. 'output_filename' can provide directory components if + needed). + + 'libraries' is a list of libraries to link against. These are + library names, not filenames, since they're translated into + filenames in a platform-specific way (eg. "foo" becomes "libfoo.a" + on Unix and "foo.lib" on DOS/Windows). However, they can include a + directory component, which means the linker will look in that + specific directory rather than searching all the normal locations. + + 'library_dirs', if supplied, should be a list of directories to + search for libraries that were specified as bare library names + (ie. no directory component). These are on top of the system + default and those supplied to 'add_library_dir()' and/or + 'set_library_dirs()'. 'runtime_library_dirs' is a list of + directories that will be embedded into the shared library and used + to search for other shared libraries that *it* depends on at + run-time. (This may only be relevant on Unix.) + + 'export_symbols' is a list of symbols that the shared library will + export. (This appears to be relevant only on Windows.) + + 'debug' is as for 'compile()' and 'create_static_lib()', with the + slight distinction that it actually matters on most platforms (as + opposed to 'create_static_lib()', which includes a 'debug' flag + mostly for form's sake). + + 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except + of course that they supply command-line arguments for the + particular linker being used). + + Raises LinkError on failure. + """ + raise NotImplementedError + + + # Old 'link_*()' methods, rewritten to use the new 'link()' method. + + def link_shared_lib (self, + objects, + output_libname, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + self.link(CCompiler.SHARED_LIBRARY, objects, + self.library_filename(output_libname, lib_type='shared'), + output_dir, + libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, + extra_preargs, extra_postargs, build_temp) + + + def link_shared_object (self, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + self.link(CCompiler.SHARED_OBJECT, objects, + output_filename, output_dir, + libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, + extra_preargs, extra_postargs, build_temp) + + + def link_executable (self, + objects, + output_progname, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + self.link(CCompiler.EXECUTABLE, objects, + self.executable_filename(output_progname), output_dir, + libraries, library_dirs, runtime_library_dirs, None, + debug, extra_preargs, extra_postargs, None) + + + # -- Miscellaneous methods ----------------------------------------- + # These are all used by the 'gen_lib_options() function; there is + # no appropriate default implementation so subclasses should + # implement all of these. + + def library_dir_option (self, dir): + """Return the compiler option to add 'dir' to the list of + directories searched for libraries. + """ + raise NotImplementedError + + def runtime_library_dir_option (self, dir): + """Return the compiler option to add 'dir' to the list of + directories searched for runtime libraries. + """ + raise NotImplementedError + + def library_option (self, lib): + """Return the compiler option to add 'dir' to the list of libraries + linked into the shared library or executable. + """ + raise NotImplementedError + + def find_library_file (self, dirs, lib, debug=0): + """Search the specified list of directories for a static or shared + library file 'lib' and return the full path to that file. If + 'debug' true, look for a debugging version (if that makes sense on + the current platform). Return None if 'lib' wasn't found in any of + the specified directories. + """ + raise NotImplementedError + + + # -- Filename generation methods ----------------------------------- + + # The default implementation of the filename generating methods are + # prejudiced towards the Unix/DOS/Windows view of the world: + # * object files are named by replacing the source file extension + # (eg. .c/.cpp -> .o/.obj) + # * library files (shared or static) are named by plugging the + # library name and extension into a format string, eg. + # "lib%s.%s" % (lib_name, ".a") for Unix static libraries + # * executables are named by appending an extension (possibly + # empty) to the program name: eg. progname + ".exe" for + # Windows + # + # To reduce redundant code, these methods expect to find + # several attributes in the current object (presumably defined + # as class attributes): + # * src_extensions - + # list of C/C++ source file extensions, eg. ['.c', '.cpp'] + # * obj_extension - + # object file extension, eg. '.o' or '.obj' + # * static_lib_extension - + # extension for static library files, eg. '.a' or '.lib' + # * shared_lib_extension - + # extension for shared library/object files, eg. '.so', '.dll' + # * static_lib_format - + # format string for generating static library filenames, + # eg. 'lib%s.%s' or '%s.%s' + # * shared_lib_format + # format string for generating shared library filenames + # (probably same as static_lib_format, since the extension + # is one of the intended parameters to the format string) + # * exe_extension - + # extension for executable files, eg. '' or '.exe' + + def object_filenames (self, + source_filenames, + strip_dir=0, + output_dir=''): + if output_dir is None: output_dir = '' + obj_names = [] + for src_name in source_filenames: + (base, ext) = os.path.splitext (src_name) + if ext not in self.src_extensions: + raise UnknownFileError, \ + "unknown file type '%s' (from '%s')" % \ + (ext, src_name) + if strip_dir: + base = os.path.basename (base) + obj_names.append (os.path.join (output_dir, + base + self.obj_extension)) + return obj_names + + # object_filenames () + + + def shared_object_filename (self, + basename, + strip_dir=0, + output_dir=''): + if output_dir is None: output_dir = '' + if strip_dir: + basename = os.path.basename (basename) + return os.path.join (output_dir, basename + self.shared_lib_extension) + + def executable_filename (self, + basename, + strip_dir=0, + output_dir=''): + if output_dir is None: output_dir = '' + if strip_dir: + basename = os.path.basename (basename) + return os.path.join(output_dir, basename + (self.exe_extension or '')) + + def library_filename (self, + libname, + lib_type='static', # or 'shared' + strip_dir=0, + output_dir=''): + + if output_dir is None: output_dir = '' + if lib_type not in ("static","shared","dylib"): + raise ValueError, "'lib_type' must be \"static\", \"shared\" or \"dylib\"" + fmt = getattr (self, lib_type + "_lib_format") + ext = getattr (self, lib_type + "_lib_extension") + + (dir, base) = os.path.split (libname) + filename = fmt % (base, ext) + if strip_dir: + dir = '' + + return os.path.join (output_dir, dir, filename) + + + # -- Utility methods ----------------------------------------------- + + def announce (self, msg, level=1): + if self.verbose >= level: + print msg + + def debug_print (self, msg): + from distutils.core import DEBUG + if DEBUG: + print msg + + def warn (self, msg): + sys.stderr.write ("warning: %s\n" % msg) + + def execute (self, func, args, msg=None, level=1): + execute(func, args, msg, self.verbose >= level, self.dry_run) + + def spawn (self, cmd): + spawn (cmd, verbose=self.verbose, dry_run=self.dry_run) + + def move_file (self, src, dst): + return move_file (src, dst, verbose=self.verbose, dry_run=self.dry_run) + + def mkpath (self, name, mode=0777): + mkpath (name, mode, self.verbose, self.dry_run) + + +# class CCompiler + + +# Map a sys.platform/os.name ('posix', 'nt') to the default compiler +# type for that platform. Keys are interpreted as re match +# patterns. Order is important; platform mappings are preferred over +# OS names. +_default_compilers = ( + + # Platform string mappings + + # on a cygwin built python we can use gcc like an ordinary UNIXish + # compiler + ('cygwin.*', 'unix'), + + # OS name mappings + ('posix', 'unix'), + ('nt', 'msvc'), + ('mac', 'mwerks'), + + ) + +def get_default_compiler(osname=None, platform=None): + + """ Determine the default compiler to use for the given platform. + + osname should be one of the standard Python OS names (i.e. the + ones returned by os.name) and platform the common value + returned by sys.platform for the platform in question. + + The default values are os.name and sys.platform in case the + parameters are not given. + + """ + if osname is None: + osname = os.name + if platform is None: + platform = sys.platform + for pattern, compiler in _default_compilers: + if re.match(pattern, platform) is not None or \ + re.match(pattern, osname) is not None: + return compiler + # Default to Unix compiler + return 'unix' + +# Map compiler types to (module_name, class_name) pairs -- ie. where to +# find the code that implements an interface to this compiler. (The module +# is assumed to be in the 'distutils' package.) +compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler', + "standard UNIX-style compiler"), + 'msvc': ('msvccompiler', 'MSVCCompiler', + "Microsoft Visual C++"), + 'cygwin': ('cygwinccompiler', 'CygwinCCompiler', + "Cygwin port of GNU C Compiler for Win32"), + 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler', + "Mingw32 port of GNU C Compiler for Win32"), + 'bcpp': ('bcppcompiler', 'BCPPCompiler', + "Borland C++ Compiler"), + 'mwerks': ('mwerkscompiler', 'MWerksCompiler', + "MetroWerks CodeWarrior"), + } + +def show_compilers(): + """Print list of available compilers (used by the "--help-compiler" + options to "build", "build_ext", "build_clib"). + """ + # XXX this "knows" that the compiler option it's describing is + # "--compiler", which just happens to be the case for the three + # commands that use it. + from distutils.fancy_getopt import FancyGetopt + compilers = [] + for compiler in compiler_class.keys(): + compilers.append(("compiler="+compiler, None, + compiler_class[compiler][2])) + compilers.sort() + pretty_printer = FancyGetopt(compilers) + pretty_printer.print_help("List of available compilers:") + + +def new_compiler (plat=None, + compiler=None, + verbose=0, + dry_run=0, + force=0): + """Generate an instance of some CCompiler subclass for the supplied + platform/compiler combination. 'plat' defaults to 'os.name' + (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler + for that platform. Currently only 'posix' and 'nt' are supported, and + the default compilers are "traditional Unix interface" (UnixCCompiler + class) and Visual C++ (MSVCCompiler class). Note that it's perfectly + possible to ask for a Unix compiler object under Windows, and a + Microsoft compiler object under Unix -- if you supply a value for + 'compiler', 'plat' is ignored. + """ + if plat is None: + plat = os.name + + try: + if compiler is None: + compiler = get_default_compiler(plat) + + (module_name, class_name, long_description) = compiler_class[compiler] + except KeyError: + msg = "don't know how to compile C/C++ code on platform '%s'" % plat + if compiler is not None: + msg = msg + " with '%s' compiler" % compiler + raise DistutilsPlatformError, msg + + try: + module_name = "distutils." + module_name + __import__ (module_name) + module = sys.modules[module_name] + klass = vars(module)[class_name] + except ImportError: + raise DistutilsModuleError, \ + "can't compile C/C++ code: unable to load module '%s'" % \ + module_name + except KeyError: + raise DistutilsModuleError, \ + ("can't compile C/C++ code: unable to find class '%s' " + + "in module '%s'") % (class_name, module_name) + + return klass (verbose, dry_run, force) + + +def gen_preprocess_options (macros, include_dirs): + """Generate C pre-processor options (-D, -U, -I) as used by at least + two types of compilers: the typical Unix compiler and Visual C++. + 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,) + means undefine (-U) macro 'name', and (name,value) means define (-D) + macro 'name' to 'value'. 'include_dirs' is just a list of directory + names to be added to the header file search path (-I). Returns a list + of command-line options suitable for either Unix compilers or Visual + C++. + """ + # XXX it would be nice (mainly aesthetic, and so we don't generate + # stupid-looking command lines) to go over 'macros' and eliminate + # redundant definitions/undefinitions (ie. ensure that only the + # latest mention of a particular macro winds up on the command + # line). I don't think it's essential, though, since most (all?) + # Unix C compilers only pay attention to the latest -D or -U + # mention of a macro on their command line. Similar situation for + # 'include_dirs'. I'm punting on both for now. Anyways, weeding out + # redundancies like this should probably be the province of + # CCompiler, since the data structures used are inherited from it + # and therefore common to all CCompiler classes. + + pp_opts = [] + for macro in macros: + + if not (type (macro) is TupleType and + 1 <= len (macro) <= 2): + raise TypeError, \ + ("bad macro definition '%s': " + + "each element of 'macros' list must be a 1- or 2-tuple") % \ + macro + + if len (macro) == 1: # undefine this macro + pp_opts.append ("-U%s" % macro[0]) + elif len (macro) == 2: + if macro[1] is None: # define with no explicit value + pp_opts.append ("-D%s" % macro[0]) + else: + # XXX *don't* need to be clever about quoting the + # macro value here, because we're going to avoid the + # shell at all costs when we spawn the command! + pp_opts.append ("-D%s=%s" % macro) + + for dir in include_dirs: + pp_opts.append ("-I%s" % dir) + + return pp_opts + +# gen_preprocess_options () + + +def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries): + """Generate linker options for searching library directories and + linking with specific libraries. 'libraries' and 'library_dirs' are, + respectively, lists of library names (not filenames!) and search + directories. Returns a list of command-line options suitable for use + with some compiler (depending on the two format strings passed in). + """ + lib_opts = [] + + for dir in library_dirs: + lib_opts.append (compiler.library_dir_option (dir)) + + for dir in runtime_library_dirs: + lib_opts.append (compiler.runtime_library_dir_option (dir)) + + # XXX it's important that we *not* remove redundant library mentions! + # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to + # resolve all symbols. I just hope we never have to say "-lfoo obj.o + # -lbar" to get things to work -- that's certainly a possibility, but a + # pretty nasty way to arrange your C code. + + for lib in libraries: + (lib_dir, lib_name) = os.path.split (lib) + if lib_dir: + lib_file = compiler.find_library_file ([lib_dir], lib_name) + if lib_file: + lib_opts.append (lib_file) + else: + compiler.warn ("no library file corresponding to " + "'%s' found (skipping)" % lib) + else: + lib_opts.append (compiler.library_option (lib)) + + return lib_opts + +# gen_lib_options () diff --git a/lib-python/2.2/distutils/cmd.py b/lib-python/2.2/distutils/cmd.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/cmd.py @@ -0,0 +1,486 @@ +"""distutils.cmd + +Provides the Command class, the base class for the command classes +in the distutils.command package. +""" + +# created 2000/04/03, Greg Ward +# (extricated from core.py; actually dates back to the beginning) + +__revision__ = "$Id$" + +import sys, os, string, re +from types import * +from distutils.errors import * +from distutils import util, dir_util, file_util, archive_util, dep_util + + +class Command: + """Abstract base class for defining command classes, the "worker bees" + of the Distutils. A useful analogy for command classes is to think of + them as subroutines with local variables called "options". The options + are "declared" in 'initialize_options()' and "defined" (given their + final values, aka "finalized") in 'finalize_options()', both of which + must be defined by every command class. The distinction between the + two is necessary because option values might come from the outside + world (command line, config file, ...), and any options dependent on + other options must be computed *after* these outside influences have + been processed -- hence 'finalize_options()'. The "body" of the + subroutine, where it does all its work based on the values of its + options, is the 'run()' method, which must also be implemented by every + command class. + """ + + # 'sub_commands' formalizes the notion of a "family" of commands, + # eg. "install" as the parent with sub-commands "install_lib", + # "install_headers", etc. The parent of a family of commands + # defines 'sub_commands' as a class attribute; it's a list of + # (command_name : string, predicate : unbound_method | string | None) + # tuples, where 'predicate' is a method of the parent command that + # determines whether the corresponding command is applicable in the + # current situation. (Eg. we "install_headers" is only applicable if + # we have any C header files to install.) If 'predicate' is None, + # that command is always applicable. + # + # 'sub_commands' is usually defined at the *end* of a class, because + # predicates can be unbound methods, so they must already have been + # defined. The canonical example is the "install" command. + sub_commands = [] + + + # -- Creation/initialization methods ------------------------------- + + def __init__ (self, dist): + """Create and initialize a new Command object. Most importantly, + invokes the 'initialize_options()' method, which is the real + initializer and depends on the actual command being + instantiated. + """ + # late import because of mutual dependence between these classes + from distutils.dist import Distribution + + if not isinstance(dist, Distribution): + raise TypeError, "dist must be a Distribution instance" + if self.__class__ is Command: + raise RuntimeError, "Command is an abstract class" + + self.distribution = dist + self.initialize_options() + + # Per-command versions of the global flags, so that the user can + # customize Distutils' behaviour command-by-command and let some + # commands fallback on the Distribution's behaviour. None means + # "not defined, check self.distribution's copy", while 0 or 1 mean + # false and true (duh). Note that this means figuring out the real + # value of each flag is a touch complicated -- hence "self.verbose" + # (etc.) will be handled by __getattr__, below. + self._verbose = None + self._dry_run = None + + # Some commands define a 'self.force' option to ignore file + # timestamps, but methods defined *here* assume that + # 'self.force' exists for all commands. So define it here + # just to be safe. + self.force = None + + # The 'help' flag is just used for command-line parsing, so + # none of that complicated bureaucracy is needed. + self.help = 0 + + # 'finalized' records whether or not 'finalize_options()' has been + # called. 'finalize_options()' itself should not pay attention to + # this flag: it is the business of 'ensure_finalized()', which + # always calls 'finalize_options()', to respect/update it. + self.finalized = 0 + + # __init__ () + + + def __getattr__ (self, attr): + if attr in ('verbose', 'dry_run'): + myval = getattr(self, "_" + attr) + if myval is None: + return getattr(self.distribution, attr) + else: + return myval + else: + raise AttributeError, attr + + + def ensure_finalized (self): + if not self.finalized: + self.finalize_options() + self.finalized = 1 + + + # Subclasses must define: + # initialize_options() + # provide default values for all options; may be customized by + # setup script, by options from config file(s), or by command-line + # options + # finalize_options() + # decide on the final values for all options; this is called + # after all possible intervention from the outside world + # (command-line, option file, etc.) has been processed + # run() + # run the command: do whatever it is we're here to do, + # controlled by the command's various option values + + def initialize_options (self): + """Set default values for all the options that this command + supports. Note that these defaults may be overridden by other + commands, by the setup script, by config files, or by the + command-line. Thus, this is not the place to code dependencies + between options; generally, 'initialize_options()' implementations + are just a bunch of "self.foo = None" assignments. + + This method must be implemented by all command classes. + """ + raise RuntimeError, \ + "abstract method -- subclass %s must override" % self.__class__ + + def finalize_options (self): + """Set final values for all the options that this command supports. + This is always called as late as possible, ie. after any option + assignments from the command-line or from other commands have been + done. Thus, this is the place to to code option dependencies: if + 'foo' depends on 'bar', then it is safe to set 'foo' from 'bar' as + long as 'foo' still has the same value it was assigned in + 'initialize_options()'. + + This method must be implemented by all command classes. + """ + raise RuntimeError, \ + "abstract method -- subclass %s must override" % self.__class__ + + + def dump_options (self, header=None, indent=""): + from distutils.fancy_getopt import longopt_xlate + if header is None: + header = "command options for '%s':" % self.get_command_name() + print indent + header + indent = indent + " " + for (option, _, _) in self.user_options: + option = string.translate(option, longopt_xlate) + if option[-1] == "=": + option = option[:-1] + value = getattr(self, option) + print indent + "%s = %s" % (option, value) + + + def run (self): + """A command's raison d'etre: carry out the action it exists to + perform, controlled by the options initialized in + 'initialize_options()', customized by other commands, the setup + script, the command-line, and config files, and finalized in + 'finalize_options()'. All terminal output and filesystem + interaction should be done by 'run()'. + + This method must be implemented by all command classes. + """ + + raise RuntimeError, \ + "abstract method -- subclass %s must override" % self.__class__ + + def announce (self, msg, level=1): + """If the current verbosity level is of greater than or equal to + 'level' print 'msg' to stdout. + """ + if self.verbose >= level: + print msg + sys.stdout.flush() + + def debug_print (self, msg): + """Print 'msg' to stdout if the global DEBUG (taken from the + DISTUTILS_DEBUG environment variable) flag is true. + """ + from distutils.core import DEBUG + if DEBUG: + print msg + sys.stdout.flush() + + + + # -- Option validation methods ------------------------------------- + # (these are very handy in writing the 'finalize_options()' method) + # + # NB. the general philosophy here is to ensure that a particular option + # value meets certain type and value constraints. If not, we try to + # force it into conformance (eg. if we expect a list but have a string, + # split the string on comma and/or whitespace). If we can't force the + # option into conformance, raise DistutilsOptionError. Thus, command + # classes need do nothing more than (eg.) + # self.ensure_string_list('foo') + # and they can be guaranteed that thereafter, self.foo will be + # a list of strings. + + def _ensure_stringlike (self, option, what, default=None): + val = getattr(self, option) + if val is None: + setattr(self, option, default) + return default + elif type(val) is not StringType: + raise DistutilsOptionError, \ + "'%s' must be a %s (got `%s`)" % (option, what, val) + return val + + def ensure_string (self, option, default=None): + """Ensure that 'option' is a string; if not defined, set it to + 'default'. + """ + self._ensure_stringlike(option, "string", default) + + def ensure_string_list (self, option): + """Ensure that 'option' is a list of strings. If 'option' is + currently a string, we split it either on /,\s*/ or /\s+/, so + "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become + ["foo", "bar", "baz"]. + """ + val = getattr(self, option) + if val is None: + return + elif type(val) is StringType: + setattr(self, option, re.split(r',\s*|\s+', val)) + else: + if type(val) is ListType: + types = map(type, val) + ok = (types == [StringType] * len(val)) + else: + ok = 0 + + if not ok: + raise DistutilsOptionError, \ + "'%s' must be a list of strings (got %s)" % \ + (option, `val`) + + def _ensure_tested_string (self, option, tester, + what, error_fmt, default=None): + val = self._ensure_stringlike(option, what, default) + if val is not None and not tester(val): + raise DistutilsOptionError, \ + ("error in '%s' option: " + error_fmt) % (option, val) + + def ensure_filename (self, option): + """Ensure that 'option' is the name of an existing file.""" + self._ensure_tested_string(option, os.path.isfile, + "filename", + "'%s' does not exist or is not a file") + + def ensure_dirname (self, option): + self._ensure_tested_string(option, os.path.isdir, + "directory name", + "'%s' does not exist or is not a directory") + + + # -- Convenience methods for commands ------------------------------ + + def get_command_name (self): + if hasattr(self, 'command_name'): + return self.command_name + else: + return self.__class__.__name__ + + + def set_undefined_options (self, src_cmd, *option_pairs): + """Set the values of any "undefined" options from corresponding + option values in some other command object. "Undefined" here means + "is None", which is the convention used to indicate that an option + has not been changed between 'initialize_options()' and + 'finalize_options()'. Usually called from 'finalize_options()' for + options that depend on some other command rather than another + option of the same command. 'src_cmd' is the other command from + which option values will be taken (a command object will be created + for it if necessary); the remaining arguments are + '(src_option,dst_option)' tuples which mean "take the value of + 'src_option' in the 'src_cmd' command object, and copy it to + 'dst_option' in the current command object". + """ + + # Option_pairs: list of (src_option, dst_option) tuples + + src_cmd_obj = self.distribution.get_command_obj(src_cmd) + src_cmd_obj.ensure_finalized() + for (src_option, dst_option) in option_pairs: + if getattr(self, dst_option) is None: + setattr(self, dst_option, + getattr(src_cmd_obj, src_option)) + + + def get_finalized_command (self, command, create=1): + """Wrapper around Distribution's 'get_command_obj()' method: find + (create if necessary and 'create' is true) the command object for + 'command', call its 'ensure_finalized()' method, and return the + finalized command object. + """ + cmd_obj = self.distribution.get_command_obj(command, create) + cmd_obj.ensure_finalized() + return cmd_obj + + # XXX rename to 'get_reinitialized_command()'? (should do the + # same in dist.py, if so) + def reinitialize_command (self, command, reinit_subcommands=0): + return self.distribution.reinitialize_command( + command, reinit_subcommands) + + def run_command (self, command): + """Run some other command: uses the 'run_command()' method of + Distribution, which creates and finalizes the command object if + necessary and then invokes its 'run()' method. + """ + self.distribution.run_command(command) + + + def get_sub_commands (self): + """Determine the sub-commands that are relevant in the current + distribution (ie., that need to be run). This is based on the + 'sub_commands' class attribute: each tuple in that list may include + a method that we call to determine if the subcommand needs to be + run for the current distribution. Return a list of command names. + """ + commands = [] + for (cmd_name, method) in self.sub_commands: + if method is None or method(self): + commands.append(cmd_name) + return commands + + + # -- External world manipulation ----------------------------------- + + def warn (self, msg): + sys.stderr.write("warning: %s: %s\n" % + (self.get_command_name(), msg)) + + + def execute (self, func, args, msg=None, level=1): + util.execute(func, args, msg, self.verbose >= level, self.dry_run) + + + def mkpath (self, name, mode=0777): + dir_util.mkpath(name, mode, + self.verbose, self.dry_run) + + + def copy_file (self, infile, outfile, + preserve_mode=1, preserve_times=1, link=None, level=1): + """Copy a file respecting verbose, dry-run and force flags. (The + former two default to whatever is in the Distribution object, and + the latter defaults to false for commands that don't define it.)""" + + return file_util.copy_file( + infile, outfile, + preserve_mode, preserve_times, + not self.force, + link, + self.verbose >= level, + self.dry_run) + + + def copy_tree (self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, + level=1): + """Copy an entire directory tree respecting verbose, dry-run, + and force flags. + """ + return dir_util.copy_tree( + infile, outfile, + preserve_mode,preserve_times,preserve_symlinks, + not self.force, + self.verbose >= level, + self.dry_run) + + + def move_file (self, src, dst, level=1): + """Move a file respecting verbose and dry-run flags.""" + return file_util.move_file(src, dst, + self.verbose >= level, + self.dry_run) + + + def spawn (self, cmd, search_path=1, level=1): + """Spawn an external command respecting verbose and dry-run flags.""" + from distutils.spawn import spawn + spawn(cmd, search_path, + self.verbose >= level, + self.dry_run) + + + def make_archive (self, base_name, format, + root_dir=None, base_dir=None): + return archive_util.make_archive( + base_name, format, root_dir, base_dir, + self.verbose, self.dry_run) + + + def make_file (self, infiles, outfile, func, args, + exec_msg=None, skip_msg=None, level=1): + """Special case of 'execute()' for operations that process one or + more input files and generate one output file. Works just like + 'execute()', except the operation is skipped and a different + message printed if 'outfile' already exists and is newer than all + files listed in 'infiles'. If the command defined 'self.force', + and it is true, then the command is unconditionally run -- does no + timestamp checks. + """ + if exec_msg is None: + exec_msg = "generating %s from %s" % \ + (outfile, string.join(infiles, ', ')) + if skip_msg is None: + skip_msg = "skipping %s (inputs unchanged)" % outfile + + + # Allow 'infiles' to be a single string + if type(infiles) is StringType: + infiles = (infiles,) + elif type(infiles) not in (ListType, TupleType): + raise TypeError, \ + "'infiles' must be a string, or a list or tuple of strings" + + # If 'outfile' must be regenerated (either because it doesn't + # exist, is out-of-date, or the 'force' flag is true) then + # perform the action that presumably regenerates it + if self.force or dep_util.newer_group (infiles, outfile): + self.execute(func, args, exec_msg, level) + + # Otherwise, print the "skip" message + else: + self.announce(skip_msg, level) + + # make_file () + +# class Command + + +# XXX 'install_misc' class not currently used -- it was the base class for +# both 'install_scripts' and 'install_data', but they outgrew it. It might +# still be useful for 'install_headers', though, so I'm keeping it around +# for the time being. + +class install_misc (Command): + """Common base class for installing some files in a subdirectory. + Currently used by install_data and install_scripts. + """ + + user_options = [('install-dir=', 'd', "directory to install the files to")] + + def initialize_options (self): + self.install_dir = None + self.outfiles = [] + + def _install_dir_from (self, dirname): + self.set_undefined_options('install', (dirname, 'install_dir')) + + def _copy_files (self, filelist): + self.outfiles = [] + if not filelist: + return + self.mkpath(self.install_dir) + for f in filelist: + self.copy_file(f, self.install_dir) + self.outfiles.append(os.path.join(self.install_dir, f)) + + def get_outputs (self): + return self.outfiles + + +if __name__ == "__main__": + print "ok" diff --git a/lib-python/2.2/distutils/command/__init__.py b/lib-python/2.2/distutils/command/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/__init__.py @@ -0,0 +1,24 @@ +"""distutils.command + +Package containing implementation of all the standard Distutils +commands.""" + +__revision__ = "$Id$" + +__all__ = ['build', + 'build_py', + 'build_ext', + 'build_clib', + 'build_scripts', + 'clean', + 'install', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + 'sdist', + 'bdist', + 'bdist_dumb', + 'bdist_rpm', + 'bdist_wininst', + ] diff --git a/lib-python/2.2/distutils/command/bdist.py b/lib-python/2.2/distutils/command/bdist.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/bdist.py @@ -0,0 +1,139 @@ +"""distutils.command.bdist + +Implements the Distutils 'bdist' command (create a built [binary] +distribution).""" + +# created 2000/03/29, Greg Ward + +__revision__ = "$Id$" + +import os, string +from types import * +from distutils.core import Command +from distutils.errors import * +from distutils.util import get_platform + + +def show_formats (): + """Print list of available formats (arguments to "--format" option). + """ + from distutils.fancy_getopt import FancyGetopt + formats=[] + for format in bdist.format_commands: + formats.append(("formats=" + format, None, + bdist.format_command[format][1])) + pretty_printer = FancyGetopt(formats) + pretty_printer.print_help("List of available distribution formats:") + + +class bdist (Command): + + description = "create a built (binary) distribution" + + user_options = [('bdist-base=', 'b', + "temporary directory for creating built distributions"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), + ('formats=', None, + "formats for distribution (comma-separated list)"), + ('dist-dir=', 'd', + "directory to put final built distributions in " + "[default: dist]"), + ] + + help_options = [ + ('help-formats', None, + "lists available distribution formats", show_formats), + ] + + # The following commands do not take a format option from bdist + no_format_option = ('bdist_rpm',) + + # This won't do in reality: will need to distinguish RPM-ish Linux, + # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS. + default_format = { 'posix': 'gztar', + 'nt': 'zip', } + + # Establish the preferred order (for the --help-formats option). + format_commands = ['rpm', 'gztar', 'bztar', 'ztar', 'tar', + 'wininst', 'zip'] + + # And the real information. + format_command = { 'rpm': ('bdist_rpm', "RPM distribution"), + 'gztar': ('bdist_dumb', "gzip'ed tar file"), + 'bztar': ('bdist_dumb', "bzip2'ed tar file"), + 'ztar': ('bdist_dumb', "compressed tar file"), + 'tar': ('bdist_dumb', "tar file"), + 'wininst': ('bdist_wininst', + "Windows executable installer"), + 'zip': ('bdist_dumb', "ZIP file"), + } + + + def initialize_options (self): + self.bdist_base = None + self.plat_name = None + self.formats = None + self.dist_dir = None + + # initialize_options() + + + def finalize_options (self): + # have to finalize 'plat_name' before 'bdist_base' + if self.plat_name is None: + self.plat_name = get_platform() + + # 'bdist_base' -- parent of per-built-distribution-format + # temporary directories (eg. we'll probably have + # "build/bdist./dumb", "build/bdist./rpm", etc.) + if self.bdist_base is None: + build_base = self.get_finalized_command('build').build_base + self.bdist_base = os.path.join(build_base, + 'bdist.' + self.plat_name) + + self.ensure_string_list('formats') + if self.formats is None: + try: + self.formats = [self.default_format[os.name]] + except KeyError: + raise DistutilsPlatformError, \ + "don't know how to create built distributions " + \ + "on platform %s" % os.name + + if self.dist_dir is None: + self.dist_dir = "dist" + + # finalize_options() + + + def run (self): + + # Figure out which sub-commands we need to run. + commands = [] + for format in self.formats: + try: + commands.append(self.format_command[format][0]) + except KeyError: + raise DistutilsOptionError, "invalid format '%s'" % format + + # Reinitialize and run each command. + for i in range(len(self.formats)): + cmd_name = commands[i] + sub_cmd = self.reinitialize_command(cmd_name) + if cmd_name not in self.no_format_option: + sub_cmd.format = self.formats[i] + + print ("bdist.run: format=%s, command=%s, rest=%s" % + (self.formats[i], cmd_name, commands[i+1:])) + + # If we're going to need to run this command again, tell it to + # keep its temporary files around so subsequent runs go faster. + if cmd_name in commands[i+1:]: + sub_cmd.keep_temp = 1 + self.run_command(cmd_name) + + # run() + +# class bdist diff --git a/lib-python/2.2/distutils/command/bdist_dumb.py b/lib-python/2.2/distutils/command/bdist_dumb.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/bdist_dumb.py @@ -0,0 +1,96 @@ +"""distutils.command.bdist_dumb + +Implements the Distutils 'bdist_dumb' command (create a "dumb" built +distribution -- i.e., just an archive to be unpacked under $prefix or +$exec_prefix).""" + +# created 2000/03/29, Greg Ward + +__revision__ = "$Id$" + +import os +from distutils.core import Command +from distutils.util import get_platform +from distutils.dir_util import create_tree, remove_tree +from distutils.errors import * + +class bdist_dumb (Command): + + description = "create a \"dumb\" built distribution" + + user_options = [('bdist-dir=', 'd', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), + ('format=', 'f', + "archive format to create (tar, ztar, gztar, zip)"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ] + + boolean_options = ['keep-temp'] + + default_format = { 'posix': 'gztar', + 'nt': 'zip', } + + + def initialize_options (self): + self.bdist_dir = None + self.plat_name = None + self.format = None + self.keep_temp = 0 + self.dist_dir = None + + # initialize_options() + + + def finalize_options (self): + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'dumb') + + if self.format is None: + try: + self.format = self.default_format[os.name] + except KeyError: + raise DistutilsPlatformError, \ + ("don't know how to create dumb built distributions " + + "on platform %s") % os.name + + self.set_undefined_options('bdist', + ('dist_dir', 'dist_dir'), + ('plat_name', 'plat_name')) + + # finalize_options() + + + def run (self): + + self.run_command('build') + + install = self.reinitialize_command('install', reinit_subcommands=1) + install.root = self.bdist_dir + install.warn_dir = 0 + + self.announce("installing to %s" % self.bdist_dir) + self.run_command('install') + + # And make an archive relative to the root of the + # pseudo-installation tree. + archive_basename = "%s.%s" % (self.distribution.get_fullname(), + self.plat_name) + self.make_archive(os.path.join(self.dist_dir, archive_basename), + self.format, + root_dir=self.bdist_dir) + + if not self.keep_temp: + remove_tree(self.bdist_dir, self.verbose, self.dry_run) + + # run() + +# class bdist_dumb diff --git a/lib-python/2.2/distutils/command/bdist_rpm.py b/lib-python/2.2/distutils/command/bdist_rpm.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/bdist_rpm.py @@ -0,0 +1,488 @@ +"""distutils.command.bdist_rpm + +Implements the Distutils 'bdist_rpm' command (create RPM source and binary +distributions).""" + +# created 2000/04/25, by Harry Henry Gebel + +__revision__ = "$Id$" + +import sys, os, string +import glob +from types import * +from distutils.core import Command, DEBUG +from distutils.util import get_platform +from distutils.file_util import write_file +from distutils.errors import * + +class bdist_rpm (Command): + + description = "create an RPM distribution" + + user_options = [ + ('bdist-base=', None, + "base directory for creating built distributions"), + ('rpm-base=', None, + "base directory for creating RPMs (defaults to \"rpm\" under " + "--bdist-base; must be specified for RPM 2)"), + ('dist-dir=', 'd', + "directory to put final RPM files in " + "(and .spec files if --spec-only)"), + ('python=', None, + "path to Python interpreter to hard-code in the .spec file " + "(default: \"python\")"), + ('fix-python', None, + "hard-code the exact path to the current Python interpreter in " + "the .spec file"), + ('spec-only', None, + "only regenerate spec file"), + ('source-only', None, + "only generate source RPM"), + ('binary-only', None, + "only generate binary RPM"), + ('use-bzip2', None, + "use bzip2 instead of gzip to create source distribution"), + + # More meta-data: too RPM-specific to put in the setup script, + # but needs to go in the .spec file -- so we make these options + # to "bdist_rpm". The idea is that packagers would put this + # info in setup.cfg, although they are of course free to + # supply it on the command line. + ('distribution-name=', None, + "name of the (Linux) distribution to which this " + "RPM applies (*not* the name of the module distribution!)"), + ('group=', None, + "package classification [default: \"Development/Libraries\"]"), + ('release=', None, + "RPM release number"), + ('serial=', None, + "RPM serial number"), + ('vendor=', None, + "RPM \"vendor\" (eg. \"Joe Blow \") " + "[default: maintainer or author from setup script]"), + ('packager=', None, + "RPM packager (eg. \"Jane Doe \")" + "[default: vendor]"), + ('doc-files=', None, + "list of documentation files (space or comma-separated)"), + ('changelog=', None, + "RPM changelog"), + ('icon=', None, + "name of icon file"), + ('provides=', None, + "capabilities provided by this package"), + ('requires=', None, + "capabilities required by this package"), + ('conflicts=', None, + "capabilities which conflict with this package"), + ('build-requires=', None, + "capabilities required to build this package"), + ('obsoletes=', None, + "capabilities made obsolete by this package"), + + # Actions to take when building RPM + ('keep-temp', 'k', + "don't clean up RPM build directory"), + ('no-keep-temp', None, + "clean up RPM build directory [default]"), + ('use-rpm-opt-flags', None, + "compile with RPM_OPT_FLAGS when building from source RPM"), + ('no-rpm-opt-flags', None, + "do not pass any RPM CFLAGS to compiler"), + ('rpm3-mode', None, + "RPM 3 compatibility mode (default)"), + ('rpm2-mode', None, + "RPM 2 compatibility mode"), + ] + + boolean_options = ['keep-temp', 'use-rpm-opt-flags', 'rpm3-mode'] + + negative_opt = {'no-keep-temp': 'keep-temp', + 'no-rpm-opt-flags': 'use-rpm-opt-flags', + 'rpm2-mode': 'rpm3-mode'} + + + def initialize_options (self): + self.bdist_base = None + self.rpm_base = None + self.dist_dir = None + self.python = None + self.fix_python = None + self.spec_only = None + self.binary_only = None + self.source_only = None + self.use_bzip2 = None + + self.distribution_name = None + self.group = None + self.release = None + self.serial = None + self.vendor = None + self.packager = None + self.doc_files = None + self.changelog = None + self.icon = None + + self.prep_script = None + self.build_script = None + self.install_script = None + self.clean_script = None + self.pre_install = None + self.post_install = None + self.pre_uninstall = None + self.post_uninstall = None + self.prep = None + self.provides = None + self.requires = None + self.conflicts = None + self.build_requires = None + self.obsoletes = None + + self.keep_temp = 0 + self.use_rpm_opt_flags = 1 + self.rpm3_mode = 1 + + # initialize_options() + + + def finalize_options (self): + self.set_undefined_options('bdist', ('bdist_base', 'bdist_base')) + if self.rpm_base is None: + if not self.rpm3_mode: + raise DistutilsOptionError, \ + "you must specify --rpm-base in RPM 2 mode" + self.rpm_base = os.path.join(self.bdist_base, "rpm") + + if self.python is None: + if self.fix_python: + self.python = sys.executable + else: + self.python = "python" + elif self.fix_python: + raise DistutilsOptionError, \ + "--python and --fix-python are mutually exclusive options" + + if os.name != 'posix': + raise DistutilsPlatformError, \ + ("don't know how to create RPM " + "distributions on platform %s" % os.name) + if self.binary_only and self.source_only: + raise DistutilsOptionError, \ + "cannot supply both '--source-only' and '--binary-only'" + + # don't pass CFLAGS to pure python distributions + if not self.distribution.has_ext_modules(): + self.use_rpm_opt_flags = 0 + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + self.finalize_package_data() + + # finalize_options() + + def finalize_package_data (self): + self.ensure_string('group', "Development/Libraries") + self.ensure_string('vendor', + "%s <%s>" % (self.distribution.get_contact(), + self.distribution.get_contact_email())) + self.ensure_string('packager') + self.ensure_string_list('doc_files') + if type(self.doc_files) is ListType: + for readme in ('README', 'README.txt'): + if os.path.exists(readme) and readme not in self.doc_files: + self.doc_files.append(readme) + + self.ensure_string('release', "1") + self.ensure_string('serial') # should it be an int? + + self.ensure_string('distribution_name') + + self.ensure_string('changelog') + # Format changelog correctly + self.changelog = self._format_changelog(self.changelog) + + self.ensure_filename('icon') + + self.ensure_filename('prep_script') + self.ensure_filename('build_script') + self.ensure_filename('install_script') + self.ensure_filename('clean_script') + self.ensure_filename('pre_install') + self.ensure_filename('post_install') + self.ensure_filename('pre_uninstall') + self.ensure_filename('post_uninstall') + + # XXX don't forget we punted on summaries and descriptions -- they + # should be handled here eventually! + + # Now *this* is some meta-data that belongs in the setup script... + self.ensure_string_list('provides') + self.ensure_string_list('requires') + self.ensure_string_list('conflicts') + self.ensure_string_list('build_requires') + self.ensure_string_list('obsoletes') + + # finalize_package_data () + + + def run (self): + + if DEBUG: + print "before _get_package_data():" + print "vendor =", self.vendor + print "packager =", self.packager + print "doc_files =", self.doc_files + print "changelog =", self.changelog + + # make directories + if self.spec_only: + spec_dir = self.dist_dir + self.mkpath(spec_dir) + else: + rpm_dir = {} + for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'): + rpm_dir[d] = os.path.join(self.rpm_base, d) + self.mkpath(rpm_dir[d]) + spec_dir = rpm_dir['SPECS'] + + # Spec file goes into 'dist_dir' if '--spec-only specified', + # build/rpm. otherwise. + spec_path = os.path.join(spec_dir, + "%s.spec" % self.distribution.get_name()) + self.execute(write_file, + (spec_path, + self._make_spec_file()), + "writing '%s'" % spec_path) + + if self.spec_only: # stop if requested + return + + # Make a source distribution and copy to SOURCES directory with + # optional icon. + sdist = self.reinitialize_command('sdist') + if self.use_bzip2: + sdist.formats = ['bztar'] + else: + sdist.formats = ['gztar'] + self.run_command('sdist') + + source = sdist.get_archive_files()[0] + source_dir = rpm_dir['SOURCES'] + self.copy_file(source, source_dir) + + if self.icon: + if os.path.exists(self.icon): + self.copy_file(self.icon, source_dir) + else: + raise DistutilsFileError, \ + "icon file '%s' does not exist" % self.icon + + + # build package + self.announce('building RPMs') + rpm_cmd = ['rpm'] + if os.path.exists('/usr/bin/rpmbuild') or \ + os.path.exists('/bin/rpmbuild'): + rpm_cmd = ['rpmbuild'] + if self.source_only: # what kind of RPMs? + rpm_cmd.append('-bs') + elif self.binary_only: + rpm_cmd.append('-bb') + else: + rpm_cmd.append('-ba') + if self.rpm3_mode: + rpm_cmd.extend(['--define', + '_topdir %s/%s' % (os.getcwd(), self.rpm_base),]) + if not self.keep_temp: + rpm_cmd.append('--clean') + rpm_cmd.append(spec_path) + self.spawn(rpm_cmd) + + # XXX this is a nasty hack -- we really should have a proper way to + # find out the names of the RPM files created; also, this assumes + # that RPM creates exactly one source and one binary RPM. + if not self.dry_run: + if not self.binary_only: + srpms = glob.glob(os.path.join(rpm_dir['SRPMS'], "*.rpm")) + assert len(srpms) == 1, \ + "unexpected number of SRPM files found: %s" % srpms + self.move_file(srpms[0], self.dist_dir) + + if not self.source_only: + rpms = glob.glob(os.path.join(rpm_dir['RPMS'], "*/*.rpm")) + assert len(rpms) == 1, \ + "unexpected number of RPM files found: %s" % rpms + self.move_file(rpms[0], self.dist_dir) + + # run() + + + def _make_spec_file(self): + """Generate the text of an RPM spec file and return it as a + list of strings (one per line). + """ + # definitions and headers + spec_file = [ + '%define name ' + self.distribution.get_name(), + '%define version ' + self.distribution.get_version(), + '%define release ' + self.release, + '', + 'Summary: ' + self.distribution.get_description(), + ] + + # put locale summaries into spec file + # XXX not supported for now (hard to put a dictionary + # in a config file -- arg!) + #for locale in self.summaries.keys(): + # spec_file.append('Summary(%s): %s' % (locale, + # self.summaries[locale])) + + spec_file.extend([ + 'Name: %{name}', + 'Version: %{version}', + 'Release: %{release}',]) + + # XXX yuck! this filename is available from the "sdist" command, + # but only after it has run: and we create the spec file before + # running "sdist", in case of --spec-only. + if self.use_bzip2: + spec_file.append('Source0: %{name}-%{version}.tar.bz2') + else: + spec_file.append('Source0: %{name}-%{version}.tar.gz') + + spec_file.extend([ + 'Copyright: ' + self.distribution.get_license(), + 'Group: ' + self.group, + 'BuildRoot: %{_tmppath}/%{name}-buildroot', + 'Prefix: %{_prefix}', ]) + + # noarch if no extension modules + if not self.distribution.has_ext_modules(): + spec_file.append('BuildArchitectures: noarch') + + for field in ('Vendor', + 'Packager', + 'Provides', + 'Requires', + 'Conflicts', + 'Obsoletes', + ): + val = getattr(self, string.lower(field)) + if type(val) is ListType: + spec_file.append('%s: %s' % (field, string.join(val))) + elif val is not None: + spec_file.append('%s: %s' % (field, val)) + + + if self.distribution.get_url() != 'UNKNOWN': + spec_file.append('Url: ' + self.distribution.get_url()) + + if self.distribution_name: + spec_file.append('Distribution: ' + self.distribution_name) + + if self.build_requires: + spec_file.append('BuildRequires: ' + + string.join(self.build_requires)) + + if self.icon: + spec_file.append('Icon: ' + os.path.basename(self.icon)) + + spec_file.extend([ + '', + '%description', + self.distribution.get_long_description() + ]) + + # put locale descriptions into spec file + # XXX again, suppressed because config file syntax doesn't + # easily support this ;-( + #for locale in self.descriptions.keys(): + # spec_file.extend([ + # '', + # '%description -l ' + locale, + # self.descriptions[locale], + # ]) + + # rpm scripts + # figure out default build script + def_build = "%s setup.py build" % self.python + if self.use_rpm_opt_flags: + def_build = 'env CFLAGS="$RPM_OPT_FLAGS" ' + def_build + + # insert contents of files + + # XXX this is kind of misleading: user-supplied options are files + # that we open and interpolate into the spec file, but the defaults + # are just text that we drop in as-is. Hmmm. + + script_options = [ + ('prep', 'prep_script', "%setup"), + ('build', 'build_script', def_build), + ('install', 'install_script', + ("%s setup.py install " + "--root=$RPM_BUILD_ROOT " + "--record=INSTALLED_FILES") % self.python), + ('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"), + ('pre', 'pre_install', None), + ('post', 'post_install', None), + ('preun', 'pre_uninstall', None), + ('postun', 'post_uninstall', None), + ] + + for (rpm_opt, attr, default) in script_options: + # Insert contents of file referred to, if no file is refered to + # use 'default' as contents of script + val = getattr(self, attr) + if val or default: + spec_file.extend([ + '', + '%' + rpm_opt,]) + if val: + spec_file.extend(string.split(open(val, 'r').read(), '\n')) + else: + spec_file.append(default) + + + # files section + spec_file.extend([ + '', + '%files -f INSTALLED_FILES', + '%defattr(-,root,root)', + ]) + + if self.doc_files: + spec_file.append('%doc ' + string.join(self.doc_files)) + + if self.changelog: + spec_file.extend([ + '', + '%changelog',]) + spec_file.extend(self.changelog) + + return spec_file + + # _make_spec_file () + + def _format_changelog(self, changelog): + """Format the changelog correctly and convert it to a list of strings + """ + if not changelog: + return changelog + new_changelog = [] + for line in string.split(string.strip(changelog), '\n'): + line = string.strip(line) + if line[0] == '*': + new_changelog.extend(['', line]) + elif line[0] == '-': + new_changelog.append(line) + else: + new_changelog.append(' ' + line) + + # strip trailing newline inserted by first changelog entry + if not new_changelog[0]: + del new_changelog[0] + + return new_changelog + + # _format_changelog() + +# class bdist_rpm diff --git a/lib-python/2.2/distutils/command/bdist_wininst.py b/lib-python/2.2/distutils/command/bdist_wininst.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/bdist_wininst.py @@ -0,0 +1,570 @@ +"""distutils.command.bdist_wininst + +Implements the Distutils 'bdist_wininst' command: create a windows installer +exe-program.""" + +# created 2000/06/02, Thomas Heller + +__revision__ = "$Id$" + +import sys, os, string +from distutils.core import Command +from distutils.util import get_platform +from distutils.dir_util import create_tree, remove_tree +from distutils.errors import * + +class bdist_wininst (Command): + + description = "create an executable installer for MS Windows" + + user_options = [('bdist-dir=', None, + "temporary directory for creating the distribution"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('target-version=', 'v', + "require a specific python version" + + " on the target system"), + ('no-target-compile', 'c', + "do not compile .py to .pyc on the target system"), + ('no-target-optimize', 'o', + "do not compile .py to .pyo (optimized)" + "on the target system"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('bitmap=', 'b', + "bitmap to use for the installer instead of python-powered logo"), + ('title=', 't', + "title to display on the installer background instead of default"), + ] + + boolean_options = ['keep-temp', 'no-target-compile', 'no-target-optimize', + 'skip-build'] + + def initialize_options (self): + self.bdist_dir = None + self.keep_temp = 0 + self.no_target_compile = 0 + self.no_target_optimize = 0 + self.target_version = None + self.dist_dir = None + self.bitmap = None + self.title = None + + # initialize_options() + + + def finalize_options (self): + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'wininst') + if not self.target_version: + self.target_version = "" + if self.distribution.has_ext_modules(): + short_version = sys.version[:3] + if self.target_version and self.target_version != short_version: + raise DistutilsOptionError, \ + "target version can only be" + short_version + self.target_version = short_version + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + # finalize_options() + + + def run (self): + if (sys.platform != "win32" and + (self.distribution.has_ext_modules() or + self.distribution.has_c_libraries())): + raise DistutilsPlatformError \ + ("distribution contains extensions and/or C libraries; " + "must be compiled on a Windows 32 platform") + + self.run_command('build') + + install = self.reinitialize_command('install', reinit_subcommands=1) + install.root = self.bdist_dir + install.warn_dir = 0 + + install_lib = self.reinitialize_command('install_lib') + # we do not want to include pyc or pyo files + install_lib.compile = 0 + install_lib.optimize = 0 + + # Use a custom scheme for the zip-file, because we have to decide + # at installation time which scheme to use. + for key in ('purelib', 'platlib', 'headers', 'scripts', 'data'): + value = string.upper(key) + if key == 'headers': + value = value + '/Include/$dist_name' + setattr(install, + 'install_' + key, + value) + + self.announce("installing to %s" % self.bdist_dir) + install.ensure_finalized() + + # avoid warning of 'install_lib' about installing + # into a directory not in sys.path + sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB')) + + install.run() + + del sys.path[0] + + # And make an archive relative to the root of the + # pseudo-installation tree. + from tempfile import mktemp + archive_basename = mktemp() + fullname = self.distribution.get_fullname() + arcname = self.make_archive(archive_basename, "zip", + root_dir=self.bdist_dir) + # create an exe containing the zip-file + self.create_exe(arcname, fullname, self.bitmap) + # remove the zip-file again + self.announce("removing temporary file '%s'" % arcname) + os.remove(arcname) + + if not self.keep_temp: + remove_tree(self.bdist_dir, self.verbose, self.dry_run) + + # run() + + def get_inidata (self): + # Return data describing the installation. + + lines = [] + metadata = self.distribution.metadata + + # Write the [metadata] section. Values are written with + # repr()[1:-1], so they do not contain unprintable characters, and + # are not surrounded by quote chars. + lines.append("[metadata]") + + # 'info' will be displayed in the installer's dialog box, + # describing the items to be installed. + info = (metadata.long_description or '') + '\n' + + for name in ["author", "author_email", "description", "maintainer", + "maintainer_email", "name", "url", "version"]: + data = getattr(metadata, name, "") + if data: + info = info + ("\n %s: %s" % \ + (string.capitalize(name), data)) + lines.append("%s=%s" % (name, repr(data)[1:-1])) + + # The [setup] section contains entries controlling + # the installer runtime. + lines.append("\n[Setup]") + lines.append("info=%s" % repr(info)[1:-1]) + lines.append("target_compile=%d" % (not self.no_target_compile)) + lines.append("target_optimize=%d" % (not self.no_target_optimize)) + if self.target_version: + lines.append("target_version=%s" % self.target_version) + + title = self.title or self.distribution.get_fullname() + lines.append("title=%s" % repr(title)[1:-1]) + import time + import distutils + build_info = "Build %s with distutils-%s" % \ + (time.ctime(time.time()), distutils.__version__) + lines.append("build_info=%s" % build_info) + return string.join(lines, "\n") + + # get_inidata() + + def create_exe (self, arcname, fullname, bitmap=None): + import struct + + self.mkpath(self.dist_dir) + + cfgdata = self.get_inidata() + + if self.target_version: + # if we create an installer for a specific python version, + # it's better to include this in the name + installer_name = os.path.join(self.dist_dir, + "%s.win32-py%s.exe" % + (fullname, self.target_version)) + else: + installer_name = os.path.join(self.dist_dir, + "%s.win32.exe" % fullname) + self.announce("creating %s" % installer_name) + + if bitmap: + bitmapdata = open(bitmap, "rb").read() + bitmaplen = len(bitmapdata) + else: + bitmaplen = 0 + + file = open(installer_name, "wb") + file.write(self.get_exe_bytes()) + if bitmap: + file.write(bitmapdata) + + file.write(cfgdata) + header = struct.pack("' under the base build directory. We only use one of + # them for a given distribution, though -- + if self.build_purelib is None: + self.build_purelib = os.path.join(self.build_base, 'lib') + if self.build_platlib is None: + self.build_platlib = os.path.join(self.build_base, + 'lib' + plat_specifier) + + # 'build_lib' is the actual directory that we will use for this + # particular module distribution -- if user didn't supply it, pick + # one of 'build_purelib' or 'build_platlib'. + if self.build_lib is None: + if self.distribution.ext_modules: + self.build_lib = self.build_platlib + else: + self.build_lib = self.build_purelib + + # 'build_temp' -- temporary directory for compiler turds, + # "build/temp." + if self.build_temp is None: + self.build_temp = os.path.join(self.build_base, + 'temp' + plat_specifier) + if self.build_scripts is None: + self.build_scripts = os.path.join(self.build_base, + 'scripts-' + sys.version[0:3]) + + # finalize_options () + + + def run (self): + + # Run all relevant sub-commands. This will be some subset of: + # - build_py - pure Python modules + # - build_clib - standalone C libraries + # - build_ext - Python extensions + # - build_scripts - (Python) scripts + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + + # -- Predicates for the sub-command list --------------------------- + + def has_pure_modules (self): + return self.distribution.has_pure_modules() + + def has_c_libraries (self): + return self.distribution.has_c_libraries() + + def has_ext_modules (self): + return self.distribution.has_ext_modules() + + def has_scripts (self): + return self.distribution.has_scripts() + + + sub_commands = [('build_py', has_pure_modules), + ('build_clib', has_c_libraries), + ('build_ext', has_ext_modules), + ('build_scripts', has_scripts), + ] + +# class build diff --git a/lib-python/2.2/distutils/command/build_clib.py b/lib-python/2.2/distutils/command/build_clib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/build_clib.py @@ -0,0 +1,240 @@ +"""distutils.command.build_clib + +Implements the Distutils 'build_clib' command, to build a C/C++ library +that is included in the module distribution and needed by an extension +module.""" + +# created (an empty husk) 1999/12/18, Greg Ward +# fleshed out 2000/02/03-04 + +__revision__ = "$Id$" + + +# XXX this module has *lots* of code ripped-off quite transparently from +# build_ext.py -- not surprisingly really, as the work required to build +# a static library from a collection of C source files is not really all +# that different from what's required to build a shared object file from +# a collection of C source files. Nevertheless, I haven't done the +# necessary refactoring to account for the overlap in code between the +# two modules, mainly because a number of subtle details changed in the +# cut 'n paste. Sigh. + +import os, string +from types import * +from distutils.core import Command +from distutils.errors import * +from distutils.sysconfig import customize_compiler + + +def show_compilers (): + from distutils.ccompiler import show_compilers + show_compilers() + + +class build_clib (Command): + + description = "build C/C++ libraries used by Python extensions" + + user_options = [ + ('build-clib', 'b', + "directory to build C/C++ libraries to"), + ('build-temp', 't', + "directory to put temporary build by-products"), + ('debug', 'g', + "compile with debugging information"), + ('force', 'f', + "forcibly build everything (ignore file timestamps)"), + ('compiler=', 'c', + "specify the compiler type"), + ] + + boolean_options = ['debug', 'force'] + + help_options = [ + ('help-compiler', None, + "list available compilers", show_compilers), + ] + + def initialize_options (self): + self.build_clib = None + self.build_temp = None + + # List of libraries to build + self.libraries = None + + # Compilation options for all libraries + self.include_dirs = None + self.define = None + self.undef = None + self.debug = None + self.force = 0 + self.compiler = None + + # initialize_options() + + + def finalize_options (self): + + # This might be confusing: both build-clib and build-temp default + # to build-temp as defined by the "build" command. This is because + # I think that C libraries are really just temporary build + # by-products, at least from the point of view of building Python + # extensions -- but I want to keep my options open. + self.set_undefined_options('build', + ('build_temp', 'build_clib'), + ('build_temp', 'build_temp'), + ('compiler', 'compiler'), + ('debug', 'debug'), + ('force', 'force')) + + self.libraries = self.distribution.libraries + if self.libraries: + self.check_library_list(self.libraries) + + if self.include_dirs is None: + self.include_dirs = self.distribution.include_dirs or [] + if type(self.include_dirs) is StringType: + self.include_dirs = string.split(self.include_dirs, + os.pathsep) + + # XXX same as for build_ext -- what about 'self.define' and + # 'self.undef' ? + + # finalize_options() + + + def run (self): + + if not self.libraries: + return + + # Yech -- this is cut 'n pasted from build_ext.py! + from distutils.ccompiler import new_compiler + self.compiler = new_compiler(compiler=self.compiler, + verbose=self.verbose, + dry_run=self.dry_run, + force=self.force) + customize_compiler(self.compiler) + + if self.include_dirs is not None: + self.compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name,value) in self.define: + self.compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + self.compiler.undefine_macro(macro) + + self.build_libraries(self.libraries) + + # run() + + + def check_library_list (self, libraries): + """Ensure that the list of libraries (presumably provided as a + command option 'libraries') is valid, i.e. it is a list of + 2-tuples, where the tuples are (library_name, build_info_dict). + Raise DistutilsSetupError if the structure is invalid anywhere; + just returns otherwise.""" + + # Yechh, blecch, ackk: this is ripped straight out of build_ext.py, + # with only names changed to protect the innocent! + + if type(libraries) is not ListType: + raise DistutilsSetupError, \ + "'libraries' option must be a list of tuples" + + for lib in libraries: + if type(lib) is not TupleType and len(lib) != 2: + raise DistutilsSetupError, \ + "each element of 'libraries' must a 2-tuple" + + if type(lib[0]) is not StringType: + raise DistutilsSetupError, \ + "first element of each tuple in 'libraries' " + \ + "must be a string (the library name)" + if '/' in lib[0] or (os.sep != '/' and os.sep in lib[0]): + raise DistutilsSetupError, \ + ("bad library name '%s': " + + "may not contain directory separators") % \ + lib[0] + + if type(lib[1]) is not DictionaryType: + raise DistutilsSetupError, \ + "second element of each tuple in 'libraries' " + \ + "must be a dictionary (build info)" + # for lib + + # check_library_list () + + + def get_library_names (self): + # Assume the library list is valid -- 'check_library_list()' is + # called from 'finalize_options()', so it should be! + + if not self.libraries: + return None + + lib_names = [] + for (lib_name, build_info) in self.libraries: + lib_names.append(lib_name) + return lib_names + + # get_library_names () + + + def get_source_files (self): + self.check_library_list(self.libraries) + filenames = [] + for (lib_name, build_info) in self.libraries: + sources = build_info.get('sources') + if (sources is None or + type(sources) not in (ListType, TupleType) ): + raise DistutilsSetupError, \ + ("in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + "a list of source filenames") % lib_name + + filenames.extend(sources) + + return filenames + # get_source_files () + + + def build_libraries (self, libraries): + + for (lib_name, build_info) in libraries: + sources = build_info.get('sources') + if sources is None or type(sources) not in (ListType, TupleType): + raise DistutilsSetupError, \ + ("in 'libraries' option (library '%s'), " + + "'sources' must be present and must be " + + "a list of source filenames") % lib_name + sources = list(sources) + + self.announce("building '%s' library" % lib_name) + + # First, compile the source code to object files in the library + # directory. (This should probably change to putting object + # files in a temporary build directory.) + macros = build_info.get('macros') + include_dirs = build_info.get('include_dirs') + objects = self.compiler.compile(sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=include_dirs, + debug=self.debug) + + # Now "link" the object files together into a static library. + # (On Unix at least, this isn't really linking -- it just + # builds an archive. Whatever.) + self.compiler.create_static_lib(objects, lib_name, + output_dir=self.build_clib, + debug=self.debug) + + # for libraries + + # build_libraries () + +# class build_lib diff --git a/lib-python/2.2/distutils/command/build_ext.py b/lib-python/2.2/distutils/command/build_ext.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/build_ext.py @@ -0,0 +1,630 @@ +"""distutils.command.build_ext + +Implements the Distutils 'build_ext' command, for building extension +modules (currently limited to C extensions, should accommodate C++ +extensions ASAP).""" + +# created 1999/08/09, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string, re +from types import * +from distutils.core import Command +from distutils.errors import * +from distutils.sysconfig import customize_compiler +from distutils.dep_util import newer_group +from distutils.extension import Extension + +# An extension name is just a dot-separated list of Python NAMEs (ie. +# the same as a fully-qualified module name). +extension_name_re = re.compile \ + (r'^[a-zA-Z_][a-zA-Z_0-9]*(\.[a-zA-Z_][a-zA-Z_0-9]*)*$') + + +def show_compilers (): + from distutils.ccompiler import show_compilers + show_compilers() + + +class build_ext (Command): + + description = "build C/C++ extensions (compile/link to build directory)" + + # XXX thoughts on how to deal with complex command-line options like + # these, i.e. how to make it so fancy_getopt can suck them off the + # command line and make it look like setup.py defined the appropriate + # lists of tuples of what-have-you. + # - each command needs a callback to process its command-line options + # - Command.__init__() needs access to its share of the whole + # command line (must ultimately come from + # Distribution.parse_command_line()) + # - it then calls the current command class' option-parsing + # callback to deal with weird options like -D, which have to + # parse the option text and churn out some custom data + # structure + # - that data structure (in this case, a list of 2-tuples) + # will then be present in the command object by the time + # we get to finalize_options() (i.e. the constructor + # takes care of both command-line and client options + # in between initialize_options() and finalize_options()) + + sep_by = " (separated by '%s')" % os.pathsep + user_options = [ + ('build-lib=', 'b', + "directory for compiled extension modules"), + ('build-temp=', 't', + "directory for temporary files (build by-products)"), + ('inplace', 'i', + "ignore build-lib and put compiled extensions into the source " + + "directory alongside your pure Python modules"), + ('include-dirs=', 'I', + "list of directories to search for header files" + sep_by), + ('define=', 'D', + "C preprocessor macros to define"), + ('undef=', 'U', + "C preprocessor macros to undefine"), + ('libraries=', 'l', + "external C libraries to link with"), + ('library-dirs=', 'L', + "directories to search for external C libraries" + sep_by), + ('rpath=', 'R', + "directories to search for shared C libraries at runtime"), + ('link-objects=', 'O', + "extra explicit link objects to include in the link"), + ('debug', 'g', + "compile/link with debugging information"), + ('force', 'f', + "forcibly build everything (ignore file timestamps)"), + ('compiler=', 'c', + "specify the compiler type"), + ('swig-cpp', None, + "make SWIG create C++ files (default is C)"), + ] + + boolean_options = ['inplace', 'debug', 'force', 'swig-cpp'] + + help_options = [ + ('help-compiler', None, + "list available compilers", show_compilers), + ] + + def initialize_options (self): + self.extensions = None + self.build_lib = None + self.build_temp = None + self.inplace = 0 + self.package = None + + self.include_dirs = None + self.define = None + self.undef = None + self.libraries = None + self.library_dirs = None + self.rpath = None + self.link_objects = None + self.debug = None + self.force = None + self.compiler = None + self.swig_cpp = None + + + def finalize_options (self): + from distutils import sysconfig + + self.set_undefined_options('build', + ('build_lib', 'build_lib'), + ('build_temp', 'build_temp'), + ('compiler', 'compiler'), + ('debug', 'debug'), + ('force', 'force')) + + if self.package is None: + self.package = self.distribution.ext_package + + self.extensions = self.distribution.ext_modules + + + # Make sure Python's include directories (for Python.h, pyconfig.h, + # etc.) are in the include search path. + py_include = sysconfig.get_python_inc() + plat_py_include = sysconfig.get_python_inc(plat_specific=1) + if self.include_dirs is None: + self.include_dirs = self.distribution.include_dirs or [] + if type(self.include_dirs) is StringType: + self.include_dirs = string.split(self.include_dirs, os.pathsep) + + # Put the Python "system" include dir at the end, so that + # any local include dirs take precedence. + self.include_dirs.append(py_include) + if plat_py_include != py_include: + self.include_dirs.append(plat_py_include) + + if type(self.libraries) is StringType: + self.libraries = [self.libraries] + + # Life is easier if we're not forever checking for None, so + # simplify these options to empty lists if unset + if self.libraries is None: + self.libraries = [] + if self.library_dirs is None: + self.library_dirs = [] + elif type(self.library_dirs) is StringType: + self.library_dirs = string.split(self.library_dirs, os.pathsep) + + if self.rpath is None: + self.rpath = [] + elif type(self.rpath) is StringType: + self.rpath = string.split(self.rpath, os.pathsep) + + # for extensions under windows use different directories + # for Release and Debug builds. + # also Python's library directory must be appended to library_dirs + if os.name == 'nt': + self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs')) + if self.debug: + self.build_temp = os.path.join(self.build_temp, "Debug") + else: + self.build_temp = os.path.join(self.build_temp, "Release") + + # for extensions under Cygwin Python's library directory must be + # appended to library_dirs + if sys.platform[:6] == 'cygwin': + if string.find(sys.executable, sys.exec_prefix) != -1: + # building third party extensions + self.library_dirs.append(os.path.join(sys.prefix, "lib", "python" + sys.version[:3], "config")) + else: + # building python standard extensions + self.library_dirs.append('.') + + # The argument parsing will result in self.define being a string, but + # it has to be a list of 2-tuples. All the preprocessor symbols + # specified by the 'define' option will be set to '1'. Multiple + # symbols can be separated with commas. + + if self.define: + defines = string.split(self.define, ',') + self.define = map(lambda symbol: (symbol, '1'), defines) + + # The option for macros to undefine is also a string from the + # option parsing, but has to be a list. Multiple symbols can also + # be separated with commas here. + if self.undef: + self.undef = string.split(self.undef, ',') + + # finalize_options () + + + def run (self): + + from distutils.ccompiler import new_compiler + + # 'self.extensions', as supplied by setup.py, is a list of + # Extension instances. See the documentation for Extension (in + # distutils.extension) for details. + # + # For backwards compatibility with Distutils 0.8.2 and earlier, we + # also allow the 'extensions' list to be a list of tuples: + # (ext_name, build_info) + # where build_info is a dictionary containing everything that + # Extension instances do except the name, with a few things being + # differently named. We convert these 2-tuples to Extension + # instances as needed. + + if not self.extensions: + return + + # If we were asked to build any C/C++ libraries, make sure that the + # directory where we put them is in the library search path for + # linking extensions. + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.libraries.extend(build_clib.get_library_names() or []) + self.library_dirs.append(build_clib.build_clib) + + # Setup the CCompiler object that we'll use to do all the + # compiling and linking + self.compiler = new_compiler(compiler=self.compiler, + verbose=self.verbose, + dry_run=self.dry_run, + force=self.force) + customize_compiler(self.compiler) + + # And make sure that any compile/link-related options (which might + # come from the command-line or from the setup script) are set in + # that CCompiler object -- that way, they automatically apply to + # all compiling and linking done here. + if self.include_dirs is not None: + self.compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name,value) in self.define: + self.compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + self.compiler.undefine_macro(macro) + if self.libraries is not None: + self.compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + self.compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + self.compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + self.compiler.set_link_objects(self.link_objects) + + # Now actually compile and link everything. + self.build_extensions() + + # run () + + + def check_extensions_list (self, extensions): + """Ensure that the list of extensions (presumably provided as a + command option 'extensions') is valid, i.e. it is a list of + Extension objects. We also support the old-style list of 2-tuples, + where the tuples are (ext_name, build_info), which are converted to + Extension instances here. + + Raise DistutilsSetupError if the structure is invalid anywhere; + just returns otherwise. + """ + if type(extensions) is not ListType: + raise DistutilsSetupError, \ + "'ext_modules' option must be a list of Extension instances" + + for i in range(len(extensions)): + ext = extensions[i] + if isinstance(ext, Extension): + continue # OK! (assume type-checking done + # by Extension constructor) + + (ext_name, build_info) = ext + self.warn(("old-style (ext_name, build_info) tuple found in " + "ext_modules for extension '%s'" + "-- please convert to Extension instance" % ext_name)) + if type(ext) is not TupleType and len(ext) != 2: + raise DistutilsSetupError, \ + ("each element of 'ext_modules' option must be an " + "Extension instance or 2-tuple") + + if not (type(ext_name) is StringType and + extension_name_re.match(ext_name)): + raise DistutilsSetupError, \ + ("first element of each tuple in 'ext_modules' " + "must be the extension name (a string)") + + if type(build_info) is not DictionaryType: + raise DistutilsSetupError, \ + ("second element of each tuple in 'ext_modules' " + "must be a dictionary (build info)") + + # OK, the (ext_name, build_info) dict is type-safe: convert it + # to an Extension instance. + ext = Extension(ext_name, build_info['sources']) + + # Easy stuff: one-to-one mapping from dict elements to + # instance attributes. + for key in ('include_dirs', + 'library_dirs', + 'libraries', + 'extra_objects', + 'extra_compile_args', + 'extra_link_args'): + val = build_info.get(key) + if val is not None: + setattr(ext, key, val) + + # Medium-easy stuff: same syntax/semantics, different names. + ext.runtime_library_dirs = build_info.get('rpath') + if build_info.has_key('def_file'): + self.warn("'def_file' element of build info dict " + "no longer supported") + + # Non-trivial stuff: 'macros' split into 'define_macros' + # and 'undef_macros'. + macros = build_info.get('macros') + if macros: + ext.define_macros = [] + ext.undef_macros = [] + for macro in macros: + if not (type(macro) is TupleType and + 1 <= len(macro) <= 2): + raise DistutilsSetupError, \ + ("'macros' element of build info dict " + "must be 1- or 2-tuple") + if len(macro) == 1: + ext.undef_macros.append(macro[0]) + elif len(macro) == 2: + ext.define_macros.append(macro) + + extensions[i] = ext + + # for extensions + + # check_extensions_list () + + + def get_source_files (self): + self.check_extensions_list(self.extensions) + filenames = [] + + # Wouldn't it be neat if we knew the names of header files too... + for ext in self.extensions: + filenames.extend(ext.sources) + + return filenames + + + def get_outputs (self): + + # Sanity check the 'extensions' list -- can't assume this is being + # done in the same run as a 'build_extensions()' call (in fact, we + # can probably assume that it *isn't*!). + self.check_extensions_list(self.extensions) + + # And build the list of output (built) filenames. Note that this + # ignores the 'inplace' flag, and assumes everything goes in the + # "build" tree. + outputs = [] + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + outputs.append(os.path.join(self.build_lib, + self.get_ext_filename(fullname))) + return outputs + + # get_outputs () + + def build_extensions(self): + + # First, sanity-check the 'extensions' list + self.check_extensions_list(self.extensions) + + for ext in self.extensions: + self.build_extension(ext) + + def build_extension(self, ext): + + sources = ext.sources + if sources is None or type(sources) not in (ListType, TupleType): + raise DistutilsSetupError, \ + ("in 'ext_modules' option (extension '%s'), " + + "'sources' must be present and must be " + + "a list of source filenames") % ext.name + sources = list(sources) + + fullname = self.get_ext_fullname(ext.name) + if self.inplace: + # ignore build-lib -- put the compiled extension into + # the source tree along with pure Python modules + + modpath = string.split(fullname, '.') + package = string.join(modpath[0:-1], '.') + base = modpath[-1] + + build_py = self.get_finalized_command('build_py') + package_dir = build_py.get_package_dir(package) + ext_filename = os.path.join(package_dir, + self.get_ext_filename(base)) + else: + ext_filename = os.path.join(self.build_lib, + self.get_ext_filename(fullname)) + + if not (self.force or newer_group(sources, ext_filename, 'newer')): + self.announce("skipping '%s' extension (up-to-date)" % + ext.name) + return + else: + self.announce("building '%s' extension" % ext.name) + + # First, scan the sources for SWIG definition files (.i), run + # SWIG on 'em to create .c files, and modify the sources list + # accordingly. + sources = self.swig_sources(sources) + + # Next, compile the source code to object files. + + # XXX not honouring 'define_macros' or 'undef_macros' -- the + # CCompiler API needs to change to accommodate this, and I + # want to do one thing at a time! + + # Two possible sources for extra compiler arguments: + # - 'extra_compile_args' in Extension object + # - CFLAGS environment variable (not particularly + # elegant, but people seem to expect it and I + # guess it's useful) + # The environment variable should take precedence, and + # any sensible compiler will give precedence to later + # command line args. Hence we combine them in order: + extra_args = ext.extra_compile_args or [] + + macros = ext.define_macros[:] + for undef in ext.undef_macros: + macros.append((undef,)) + + # XXX and if we support CFLAGS, why not CC (compiler + # executable), CPPFLAGS (pre-processor options), and LDFLAGS + # (linker options) too? + # XXX should we use shlex to properly parse CFLAGS? + + if os.environ.has_key('CFLAGS'): + extra_args.extend(string.split(os.environ['CFLAGS'])) + + objects = self.compiler.compile(sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=ext.include_dirs, + debug=self.debug, + extra_postargs=extra_args) + + # XXX -- this is a Vile HACK! + # + # The setup.py script for Python on Unix needs to be able to + # get this list so it can perform all the clean up needed to + # avoid keeping object files around when cleaning out a failed + # build of an extension module. Since Distutils does not + # track dependencies, we have to get rid of intermediates to + # ensure all the intermediates will be properly re-built. + # + self._built_objects = objects[:] + + # Now link the object files together into a "shared object" -- + # of course, first we have to figure out all the other things + # that go into the mix. + if ext.extra_objects: + objects.extend(ext.extra_objects) + extra_args = ext.extra_link_args or [] + + + self.compiler.link_shared_object( + objects, ext_filename, + libraries=self.get_libraries(ext), + library_dirs=ext.library_dirs, + runtime_library_dirs=ext.runtime_library_dirs, + extra_postargs=extra_args, + export_symbols=self.get_export_symbols(ext), + debug=self.debug, + build_temp=self.build_temp) + + + def swig_sources (self, sources): + + """Walk the list of source files in 'sources', looking for SWIG + interface (.i) files. Run SWIG on all that are found, and + return a modified 'sources' list with SWIG source files replaced + by the generated C (or C++) files. + """ + + new_sources = [] + swig_sources = [] + swig_targets = {} + + # XXX this drops generated C/C++ files into the source tree, which + # is fine for developers who want to distribute the generated + # source -- but there should be an option to put SWIG output in + # the temp dir. + + if self.swig_cpp: + target_ext = '.cpp' + else: + target_ext = '.c' + + for source in sources: + (base, ext) = os.path.splitext(source) + if ext == ".i": # SWIG interface file + new_sources.append(base + target_ext) + swig_sources.append(source) + swig_targets[source] = new_sources[-1] + else: + new_sources.append(source) + + if not swig_sources: + return new_sources + + swig = self.find_swig() + swig_cmd = [swig, "-python", "-dnone", "-ISWIG"] + if self.swig_cpp: + swig_cmd.append("-c++") + + for source in swig_sources: + target = swig_targets[source] + self.announce("swigging %s to %s" % (source, target)) + self.spawn(swig_cmd + ["-o", target, source]) + + return new_sources + + # swig_sources () + + def find_swig (self): + """Return the name of the SWIG executable. On Unix, this is + just "swig" -- it should be in the PATH. Tries a bit harder on + Windows. + """ + + if os.name == "posix": + return "swig" + elif os.name == "nt": + + # Look for SWIG in its standard installation directory on + # Windows (or so I presume!). If we find it there, great; + # if not, act like Unix and assume it's in the PATH. + for vers in ("1.3", "1.2", "1.1"): + fn = os.path.join("c:\\swig%s" % vers, "swig.exe") + if os.path.isfile(fn): + return fn + else: + return "swig.exe" + + else: + raise DistutilsPlatformError, \ + ("I don't know how to find (much less run) SWIG " + "on platform '%s'") % os.name + + # find_swig () + + # -- Name generators ----------------------------------------------- + # (extension names, filenames, whatever) + + def get_ext_fullname (self, ext_name): + if self.package is None: + return ext_name + else: + return self.package + '.' + ext_name + + def get_ext_filename (self, ext_name): + r"""Convert the name of an extension (eg. "foo.bar") into the name + of the file from which it will be loaded (eg. "foo/bar.so", or + "foo\bar.pyd"). + """ + + from distutils.sysconfig import get_config_var + ext_path = string.split(ext_name, '.') + # extensions in debug_mode are named 'module_d.pyd' under windows + so_ext = get_config_var('SO') + if os.name == 'nt' and self.debug: + return apply(os.path.join, ext_path) + '_d' + so_ext + return apply(os.path.join, ext_path) + so_ext + + def get_export_symbols (self, ext): + """Return the list of symbols that a shared extension has to + export. This either uses 'ext.export_symbols' or, if it's not + provided, "init" + module_name. Only relevant on Windows, where + the .pyd file (DLL) must export the module "init" function. + """ + + initfunc_name = "init" + string.split(ext.name,'.')[-1] + if initfunc_name not in ext.export_symbols: + ext.export_symbols.append(initfunc_name) + return ext.export_symbols + + def get_libraries (self, ext): + """Return the list of libraries to link against when building a + shared extension. On most platforms, this is just 'ext.libraries'; + on Windows, we add the Python library (eg. python20.dll). + """ + # The python library is always needed on Windows. For MSVC, this + # is redundant, since the library is mentioned in a pragma in + # pyconfig.h that MSVC groks. The other Windows compilers all seem + # to need it mentioned explicitly, though, so that's what we do. + # Append '_d' to the python import library on debug builds. + from distutils.msvccompiler import MSVCCompiler + if sys.platform == "win32" and \ + not isinstance(self.compiler, MSVCCompiler): + template = "python%d%d" + if self.debug: + template = template + '_d' + pythonlib = (template % + (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) + # don't extend ext.libraries, it may be shared with other + # extensions, it is a reference to the original list + return ext.libraries + [pythonlib] + elif sys.platform[:6] == "cygwin": + template = "python%d.%d" + pythonlib = (template % + (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) + # don't extend ext.libraries, it may be shared with other + # extensions, it is a reference to the original list + return ext.libraries + [pythonlib] + else: + return ext.libraries + +# class build_ext diff --git a/lib-python/2.2/distutils/command/build_py.py b/lib-python/2.2/distutils/command/build_py.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/build_py.py @@ -0,0 +1,401 @@ +"""distutils.command.build_py + +Implements the Distutils 'build_py' command.""" + +# created 1999/03/08, Greg Ward + +__revision__ = "$Id$" + +import sys, string, os +from types import * +from glob import glob + +from distutils.core import Command +from distutils.errors import * +from distutils.util import convert_path + + +class build_py (Command): + + description = "\"build\" pure Python modules (copy to build directory)" + + user_options = [ + ('build-lib=', 'd', "directory to \"build\" (copy) to"), + ('compile', 'c', "compile .py to .pyc"), + ('no-compile', None, "don't compile .py files [default]"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('force', 'f', "forcibly build everything (ignore file timestamps)"), + ] + + boolean_options = ['compile', 'force'] + negative_opt = {'no-compile' : 'compile'} + + + def initialize_options (self): + self.build_lib = None + self.py_modules = None + self.package = None + self.package_dir = None + self.compile = 0 + self.optimize = 0 + self.force = None + + def finalize_options (self): + self.set_undefined_options('build', + ('build_lib', 'build_lib'), + ('force', 'force')) + + # Get the distribution options that are aliases for build_py + # options -- list of packages and list of modules. + self.packages = self.distribution.packages + self.py_modules = self.distribution.py_modules + self.package_dir = {} + if self.distribution.package_dir: + for name, path in self.distribution.package_dir.items(): + self.package_dir[name] = convert_path(path) + + # Ick, copied straight from install_lib.py (fancy_getopt needs a + # type system! Hell, *everything* needs a type system!!!) + if type(self.optimize) is not IntType: + try: + self.optimize = int(self.optimize) + assert 0 <= self.optimize <= 2 + except (ValueError, AssertionError): + raise DistutilsOptionError, "optimize must be 0, 1, or 2" + + def run (self): + + # XXX copy_file by default preserves atime and mtime. IMHO this is + # the right thing to do, but perhaps it should be an option -- in + # particular, a site administrator might want installed files to + # reflect the time of installation rather than the last + # modification time before the installed release. + + # XXX copy_file by default preserves mode, which appears to be the + # wrong thing to do: if a file is read-only in the working + # directory, we want it to be installed read/write so that the next + # installation of the same module distribution can overwrite it + # without problems. (This might be a Unix-specific issue.) Thus + # we turn off 'preserve_mode' when copying to the build directory, + # since the build directory is supposed to be exactly what the + # installation will look like (ie. we preserve mode when + # installing). + + # Two options control which modules will be installed: 'packages' + # and 'py_modules'. The former lets us work with whole packages, not + # specifying individual modules at all; the latter is for + # specifying modules one-at-a-time. Currently they are mutually + # exclusive: you can define one or the other (or neither), but not + # both. It remains to be seen how limiting this is. + + # Dispose of the two "unusual" cases first: no pure Python modules + # at all (no problem, just return silently), and over-specified + # 'packages' and 'py_modules' options. + + if not self.py_modules and not self.packages: + return + if self.py_modules and self.packages: + raise DistutilsOptionError, \ + "build_py: supplying both 'packages' and 'py_modules' " + \ + "options is not allowed" + + # Now we're down to two cases: 'py_modules' only and 'packages' only. + if self.py_modules: + self.build_modules() + else: + self.build_packages() + + self.byte_compile(self.get_outputs(include_bytecode=0)) + + # run () + + + def get_package_dir (self, package): + """Return the directory, relative to the top of the source + distribution, where package 'package' should be found + (at least according to the 'package_dir' option, if any).""" + + path = string.split(package, '.') + + if not self.package_dir: + if path: + return apply(os.path.join, path) + else: + return '' + else: + tail = [] + while path: + try: + pdir = self.package_dir[string.join(path, '.')] + except KeyError: + tail.insert(0, path[-1]) + del path[-1] + else: + tail.insert(0, pdir) + return apply(os.path.join, tail) + else: + # Oops, got all the way through 'path' without finding a + # match in package_dir. If package_dir defines a directory + # for the root (nameless) package, then fallback on it; + # otherwise, we might as well have not consulted + # package_dir at all, as we just use the directory implied + # by 'tail' (which should be the same as the original value + # of 'path' at this point). + pdir = self.package_dir.get('') + if pdir is not None: + tail.insert(0, pdir) + + if tail: + return apply(os.path.join, tail) + else: + return '' + + # get_package_dir () + + + def check_package (self, package, package_dir): + + # Empty dir name means current directory, which we can probably + # assume exists. Also, os.path.exists and isdir don't know about + # my "empty string means current dir" convention, so we have to + # circumvent them. + if package_dir != "": + if not os.path.exists(package_dir): + raise DistutilsFileError, \ + "package directory '%s' does not exist" % package_dir + if not os.path.isdir(package_dir): + raise DistutilsFileError, \ + ("supposed package directory '%s' exists, " + + "but is not a directory") % package_dir + + # Require __init__.py for all but the "root package" + if package: + init_py = os.path.join(package_dir, "__init__.py") + if os.path.isfile(init_py): + return init_py + else: + self.warn(("package init file '%s' not found " + + "(or not a regular file)") % init_py) + + # Either not in a package at all (__init__.py not expected), or + # __init__.py doesn't exist -- so don't return the filename. + return + + # check_package () + + + def check_module (self, module, module_file): + if not os.path.isfile(module_file): + self.warn("file %s (for module %s) not found" % + (module_file, module)) + return 0 + else: + return 1 + + # check_module () + + + def find_package_modules (self, package, package_dir): + self.check_package(package, package_dir) + module_files = glob(os.path.join(package_dir, "*.py")) + modules = [] + setup_script = os.path.abspath(self.distribution.script_name) + + for f in module_files: + abs_f = os.path.abspath(f) + if abs_f != setup_script: + module = os.path.splitext(os.path.basename(f))[0] + modules.append((package, module, f)) + else: + self.debug_print("excluding %s" % setup_script) + return modules + + + def find_modules (self): + """Finds individually-specified Python modules, ie. those listed by + module name in 'self.py_modules'. Returns a list of tuples (package, + module_base, filename): 'package' is a tuple of the path through + package-space to the module; 'module_base' is the bare (no + packages, no dots) module name, and 'filename' is the path to the + ".py" file (relative to the distribution root) that implements the + module. + """ + + # Map package names to tuples of useful info about the package: + # (package_dir, checked) + # package_dir - the directory where we'll find source files for + # this package + # checked - true if we have checked that the package directory + # is valid (exists, contains __init__.py, ... ?) + packages = {} + + # List of (package, module, filename) tuples to return + modules = [] + + # We treat modules-in-packages almost the same as toplevel modules, + # just the "package" for a toplevel is empty (either an empty + # string or empty list, depending on context). Differences: + # - don't check for __init__.py in directory for empty package + + for module in self.py_modules: + path = string.split(module, '.') + package = string.join(path[0:-1], '.') + module_base = path[-1] + + try: + (package_dir, checked) = packages[package] + except KeyError: + package_dir = self.get_package_dir(package) + checked = 0 + + if not checked: + init_py = self.check_package(package, package_dir) + packages[package] = (package_dir, 1) + if init_py: + modules.append((package, "__init__", init_py)) + + # XXX perhaps we should also check for just .pyc files + # (so greedy closed-source bastards can distribute Python + # modules too) + module_file = os.path.join(package_dir, module_base + ".py") + if not self.check_module(module, module_file): + continue + + modules.append((package, module_base, module_file)) + + return modules + + # find_modules () + + + def find_all_modules (self): + """Compute the list of all modules that will be built, whether + they are specified one-module-at-a-time ('self.py_modules') or + by whole packages ('self.packages'). Return a list of tuples + (package, module, module_file), just like 'find_modules()' and + 'find_package_modules()' do.""" + + if self.py_modules: + modules = self.find_modules() + else: + modules = [] + for package in self.packages: + package_dir = self.get_package_dir(package) + m = self.find_package_modules(package, package_dir) + modules.extend(m) + + return modules + + # find_all_modules () + + + def get_source_files (self): + + modules = self.find_all_modules() + filenames = [] + for module in modules: + filenames.append(module[-1]) + + return filenames + + + def get_module_outfile (self, build_dir, package, module): + outfile_path = [build_dir] + list(package) + [module + ".py"] + return apply(os.path.join, outfile_path) + + + def get_outputs (self, include_bytecode=1): + modules = self.find_all_modules() + outputs = [] + for (package, module, module_file) in modules: + package = string.split(package, '.') + filename = self.get_module_outfile(self.build_lib, package, module) + outputs.append(filename) + if include_bytecode: + if self.compile: + outputs.append(filename + "c") + if self.optimize > 0: + outputs.append(filename + "o") + + return outputs + + + def build_module (self, module, module_file, package): + if type(package) is StringType: + package = string.split(package, '.') + elif type(package) not in (ListType, TupleType): + raise TypeError, \ + "'package' must be a string (dot-separated), list, or tuple" + + # Now put the module source file into the "build" area -- this is + # easy, we just copy it somewhere under self.build_lib (the build + # directory for Python source). + outfile = self.get_module_outfile(self.build_lib, package, module) + dir = os.path.dirname(outfile) + self.mkpath(dir) + return self.copy_file(module_file, outfile, preserve_mode=0) + + + def build_modules (self): + + modules = self.find_modules() + for (package, module, module_file) in modules: + + # Now "build" the module -- ie. copy the source file to + # self.build_lib (the build directory for Python source). + # (Actually, it gets copied to the directory for this package + # under self.build_lib.) + self.build_module(module, module_file, package) + + # build_modules () + + + def build_packages (self): + + for package in self.packages: + + # Get list of (package, module, module_file) tuples based on + # scanning the package directory. 'package' is only included + # in the tuple so that 'find_modules()' and + # 'find_package_tuples()' have a consistent interface; it's + # ignored here (apart from a sanity check). Also, 'module' is + # the *unqualified* module name (ie. no dots, no package -- we + # already know its package!), and 'module_file' is the path to + # the .py file, relative to the current directory + # (ie. including 'package_dir'). + package_dir = self.get_package_dir(package) + modules = self.find_package_modules(package, package_dir) + + # Now loop over the modules we found, "building" each one (just + # copy it to self.build_lib). + for (package_, module, module_file) in modules: + assert package == package_ + self.build_module(module, module_file, package) + + # build_packages () + + + def byte_compile (self, files): + from distutils.util import byte_compile + prefix = self.build_lib + if prefix[-1] != os.sep: + prefix = prefix + os.sep + + # XXX this code is essentially the same as the 'byte_compile() + # method of the "install_lib" command, except for the determination + # of the 'prefix' string. Hmmm. + + if self.compile: + byte_compile(files, optimize=0, + force=self.force, + prefix=prefix, + verbose=self.verbose, dry_run=self.dry_run) + if self.optimize > 0: + byte_compile(files, optimize=self.optimize, + force=self.force, + prefix=prefix, + verbose=self.verbose, dry_run=self.dry_run) + +# class build_py diff --git a/lib-python/2.2/distutils/command/build_scripts.py b/lib-python/2.2/distutils/command/build_scripts.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/build_scripts.py @@ -0,0 +1,110 @@ +"""distutils.command.build_scripts + +Implements the Distutils 'build_scripts' command.""" + +# created 2000/05/23, Bastian Kleineidam + +__revision__ = "$Id$" + +import sys, os, re +from distutils import sysconfig +from distutils.core import Command +from distutils.dep_util import newer +from distutils.util import convert_path + +# check if Python is called on the first line with this expression +first_line_re = re.compile(r'^#!.*python(\s+.*)?$') + +class build_scripts (Command): + + description = "\"build\" scripts (copy and fixup #! line)" + + user_options = [ + ('build-dir=', 'd', "directory to \"build\" (copy) to"), + ('force', 'f', "forcibly build everything (ignore file timestamps"), + ] + + boolean_options = ['force'] + + + def initialize_options (self): + self.build_dir = None + self.scripts = None + self.force = None + self.outfiles = None + + def finalize_options (self): + self.set_undefined_options('build', + ('build_scripts', 'build_dir'), + ('force', 'force')) + self.scripts = self.distribution.scripts + + + def run (self): + if not self.scripts: + return + self.copy_scripts() + + + def copy_scripts (self): + """Copy each script listed in 'self.scripts'; if it's marked as a + Python script in the Unix way (first line matches 'first_line_re', + ie. starts with "\#!" and contains "python"), then adjust the first + line to refer to the current Python interpreter as we copy. + """ + self.mkpath(self.build_dir) + for script in self.scripts: + adjust = 0 + script = convert_path(script) + outfile = os.path.join(self.build_dir, os.path.basename(script)) + + if not self.force and not newer(script, outfile): + self.announce("not copying %s (up-to-date)" % script) + continue + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, "r") + except IOError: + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: + self.warn("%s is an empty file (skipping)" % script) + continue + + match = first_line_re.match(first_line) + if match: + adjust = 1 + post_interp = match.group(1) or '' + + if adjust: + self.announce("copying and adjusting %s -> %s" % + (script, self.build_dir)) + if not self.dry_run: + outf = open(outfile, "w") + if not sysconfig.python_build: + outf.write("#!%s%s\n" % + (os.path.normpath(sys.executable), + post_interp)) + else: + outf.write("#!%s%s" % + (os.path.join( + sysconfig.get_config_var("BINDIR"), + "python" + sysconfig.get_config_var("EXE")), + post_interp)) + outf.writelines(f.readlines()) + outf.close() + if f: + f.close() + else: + f.close() + self.copy_file(script, outfile) + + # copy_scripts () + +# class build_scripts diff --git a/lib-python/2.2/distutils/command/clean.py b/lib-python/2.2/distutils/command/clean.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/clean.py @@ -0,0 +1,79 @@ +"""distutils.command.clean + +Implements the Distutils 'clean' command.""" + +# contributed by Bastian Kleineidam , added 2000-03-18 + +__revision__ = "$Id$" + +import os +from distutils.core import Command +from distutils.dir_util import remove_tree + +class clean (Command): + + description = "clean up output of 'build' command" + user_options = [ + ('build-base=', 'b', + "base build directory (default: 'build.build-base')"), + ('build-lib=', None, + "build directory for all modules (default: 'build.build-lib')"), + ('build-temp=', 't', + "temporary build directory (default: 'build.build-temp')"), + ('build-scripts=', None, + "build directory for scripts (default: 'build.build-scripts')"), + ('bdist-base=', None, + "temporary directory for built distributions"), + ('all', 'a', + "remove all build output, not just temporary by-products") + ] + + boolean_options = ['all'] + + def initialize_options(self): + self.build_base = None + self.build_lib = None + self.build_temp = None + self.build_scripts = None + self.bdist_base = None + self.all = None + + def finalize_options(self): + self.set_undefined_options('build', + ('build_base', 'build_base'), + ('build_lib', 'build_lib'), + ('build_scripts', 'build_scripts'), + ('build_temp', 'build_temp')) + self.set_undefined_options('bdist', + ('bdist_base', 'bdist_base')) + + def run(self): + # remove the build/temp. directory (unless it's already + # gone) + if os.path.exists(self.build_temp): + remove_tree(self.build_temp, self.verbose, self.dry_run) + else: + self.warn("'%s' does not exist -- can't clean it" % + self.build_temp) + + if self.all: + # remove build directories + for directory in (self.build_lib, + self.bdist_base, + self.build_scripts): + if os.path.exists(directory): + remove_tree(directory, self.verbose, self.dry_run) + else: + self.warn("'%s' does not exist -- can't clean it" % + directory) + + # just for the heck of it, try to remove the base build directory: + # we might have emptied it right now, but if not we don't care + if not self.dry_run: + try: + os.rmdir(self.build_base) + self.announce("removing '%s'" % self.build_base) + except OSError: + pass + +# class clean diff --git a/lib-python/2.2/distutils/command/command_template b/lib-python/2.2/distutils/command/command_template new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/command_template @@ -0,0 +1,45 @@ +"""distutils.command.x + +Implements the Distutils 'x' command. +""" + +# created 2000/mm/dd, John Doe + +__revision__ = "$Id$" + +from distutils.core import Command + + +class x (Command): + + # Brief (40-50 characters) description of the command + description = "" + + # List of option tuples: long name, short name (None if no short + # name), and help string. + user_options = [('', '', + ""), + ] + + + def initialize_options (self): + self. = None + self. = None + self. = None + + # initialize_options() + + + def finalize_options (self): + if self.x is None: + self.x = + + # finalize_options() + + + def run (self): + + + # run() + +# class x diff --git a/lib-python/2.2/distutils/command/config.py b/lib-python/2.2/distutils/command/config.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/config.py @@ -0,0 +1,366 @@ +"""distutils.command.config + +Implements the Distutils 'config' command, a (mostly) empty command class +that exists mainly to be sub-classed by specific module distributions and +applications. The idea is that while every "config" command is different, +at least they're all named the same, and users always see "config" in the +list of standard commands. Also, this is a good place to put common +configure-like tasks: "try to compile this C code", or "figure out where +this header file lives". +""" + +# created 2000/05/29, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string, re +from types import * +from distutils.core import Command +from distutils.errors import DistutilsExecError + + +LANG_EXT = {'c': '.c', + 'c++': '.cxx'} + +class config (Command): + + description = "prepare to build" + + user_options = [ + ('compiler=', None, + "specify the compiler type"), + ('cc=', None, + "specify the compiler executable"), + ('include-dirs=', 'I', + "list of directories to search for header files"), + ('define=', 'D', + "C preprocessor macros to define"), + ('undef=', 'U', + "C preprocessor macros to undefine"), + ('libraries=', 'l', + "external C libraries to link with"), + ('library-dirs=', 'L', + "directories to search for external C libraries"), + + ('noisy', None, + "show every action (compile, link, run, ...) taken"), + ('dump-source', None, + "dump generated source files before attempting to compile them"), + ] + + + # The three standard command methods: since the "config" command + # does nothing by default, these are empty. + + def initialize_options (self): + self.compiler = None + self.cc = None + self.include_dirs = None + #self.define = None + #self.undef = None + self.libraries = None + self.library_dirs = None + + # maximal output for now + self.noisy = 1 + self.dump_source = 1 + + # list of temporary files generated along-the-way that we have + # to clean at some point + self.temp_files = [] + + def finalize_options (self): + if self.include_dirs is None: + self.include_dirs = self.distribution.include_dirs or [] + elif type(self.include_dirs) is StringType: + self.include_dirs = string.split(self.include_dirs, os.pathsep) + + if self.libraries is None: + self.libraries = [] + elif type(self.libraries) is StringType: + self.libraries = [self.libraries] + + if self.library_dirs is None: + self.library_dirs = [] + elif type(self.library_dirs) is StringType: + self.library_dirs = string.split(self.library_dirs, os.pathsep) + + + def run (self): + pass + + + # Utility methods for actual "config" commands. The interfaces are + # loosely based on Autoconf macros of similar names. Sub-classes + # may use these freely. + + def _check_compiler (self): + """Check that 'self.compiler' really is a CCompiler object; + if not, make it one. + """ + # We do this late, and only on-demand, because this is an expensive + # import. + from distutils.ccompiler import CCompiler, new_compiler + if not isinstance(self.compiler, CCompiler): + self.compiler = new_compiler(compiler=self.compiler, + verbose=self.noisy, + dry_run=self.dry_run, + force=1) + if self.include_dirs: + self.compiler.set_include_dirs(self.include_dirs) + if self.libraries: + self.compiler.set_libraries(self.libraries) + if self.library_dirs: + self.compiler.set_library_dirs(self.library_dirs) + + + def _gen_temp_sourcefile (self, body, headers, lang): + filename = "_configtest" + LANG_EXT[lang] + file = open(filename, "w") + if headers: + for header in headers: + file.write("#include <%s>\n" % header) + file.write("\n") + file.write(body) + if body[-1] != "\n": + file.write("\n") + file.close() + return filename + + def _preprocess (self, body, headers, include_dirs, lang): + src = self._gen_temp_sourcefile(body, headers, lang) + out = "_configtest.i" + self.temp_files.extend([src, out]) + self.compiler.preprocess(src, out, include_dirs=include_dirs) + return (src, out) + + def _compile (self, body, headers, include_dirs, lang): + src = self._gen_temp_sourcefile(body, headers, lang) + if self.dump_source: + dump_file(src, "compiling '%s':" % src) + (obj,) = self.compiler.object_filenames([src]) + self.temp_files.extend([src, obj]) + self.compiler.compile([src], include_dirs=include_dirs) + return (src, obj) + + def _link (self, body, + headers, include_dirs, + libraries, library_dirs, lang): + (src, obj) = self._compile(body, headers, include_dirs, lang) + prog = os.path.splitext(os.path.basename(src))[0] + self.compiler.link_executable([obj], prog, + libraries=libraries, + library_dirs=library_dirs) + + prog = prog + self.compiler.exe_extension + self.temp_files.append(prog) + + return (src, obj, prog) + + def _clean (self, *filenames): + if not filenames: + filenames = self.temp_files + self.temp_files = [] + self.announce("removing: " + string.join(filenames)) + for filename in filenames: + try: + os.remove(filename) + except OSError: + pass + + + # XXX these ignore the dry-run flag: what to do, what to do? even if + # you want a dry-run build, you still need some sort of configuration + # info. My inclination is to make it up to the real config command to + # consult 'dry_run', and assume a default (minimal) configuration if + # true. The problem with trying to do it here is that you'd have to + # return either true or false from all the 'try' methods, neither of + # which is correct. + + # XXX need access to the header search path and maybe default macros. + + def try_cpp (self, body=None, headers=None, include_dirs=None, lang="c"): + """Construct a source file from 'body' (a string containing lines + of C/C++ code) and 'headers' (a list of header files to include) + and run it through the preprocessor. Return true if the + preprocessor succeeded, false if there were any errors. + ('body' probably isn't of much use, but what the heck.) + """ + from distutils.ccompiler import CompileError + self._check_compiler() + ok = 1 + try: + self._preprocess(body, headers, include_dirs, lang) + except CompileError: + ok = 0 + + self._clean() + return ok + + def search_cpp (self, pattern, body=None, + headers=None, include_dirs=None, lang="c"): + """Construct a source file (just like 'try_cpp()'), run it through + the preprocessor, and return true if any line of the output matches + 'pattern'. 'pattern' should either be a compiled regex object or a + string containing a regex. If both 'body' and 'headers' are None, + preprocesses an empty file -- which can be useful to determine the + symbols the preprocessor and compiler set by default. + """ + + self._check_compiler() + (src, out) = self._preprocess(body, headers, include_dirs, lang) + + if type(pattern) is StringType: + pattern = re.compile(pattern) + + file = open(out) + match = 0 + while 1: + line = file.readline() + if line == '': + break + if pattern.search(line): + match = 1 + break + + file.close() + self._clean() + return match + + def try_compile (self, body, headers=None, include_dirs=None, lang="c"): + """Try to compile a source file built from 'body' and 'headers'. + Return true on success, false otherwise. + """ + from distutils.ccompiler import CompileError + self._check_compiler() + try: + self._compile(body, headers, include_dirs, lang) + ok = 1 + except CompileError: + ok = 0 + + self.announce(ok and "success!" or "failure.") + self._clean() + return ok + + def try_link (self, body, + headers=None, include_dirs=None, + libraries=None, library_dirs=None, + lang="c"): + """Try to compile and link a source file, built from 'body' and + 'headers', to executable form. Return true on success, false + otherwise. + """ + from distutils.ccompiler import CompileError, LinkError + self._check_compiler() + try: + self._link(body, headers, include_dirs, + libraries, library_dirs, lang) + ok = 1 + except (CompileError, LinkError): + ok = 0 + + self.announce(ok and "success!" or "failure.") + self._clean() + return ok + + def try_run (self, body, + headers=None, include_dirs=None, + libraries=None, library_dirs=None, + lang="c"): + """Try to compile, link to an executable, and run a program + built from 'body' and 'headers'. Return true on success, false + otherwise. + """ + from distutils.ccompiler import CompileError, LinkError + self._check_compiler() + try: + src, obj, exe = self._link(body, headers, include_dirs, + libraries, library_dirs, lang) + self.spawn([exe]) + ok = 1 + except (CompileError, LinkError, DistutilsExecError): + ok = 0 + + self.announce(ok and "success!" or "failure.") + self._clean() + return ok + + + # -- High-level methods -------------------------------------------- + # (these are the ones that are actually likely to be useful + # when implementing a real-world config command!) + + def check_func (self, func, + headers=None, include_dirs=None, + libraries=None, library_dirs=None, + decl=0, call=0): + + """Determine if function 'func' is available by constructing a + source file that refers to 'func', and compiles and links it. + If everything succeeds, returns true; otherwise returns false. + + The constructed source file starts out by including the header + files listed in 'headers'. If 'decl' is true, it then declares + 'func' (as "int func()"); you probably shouldn't supply 'headers' + and set 'decl' true in the same call, or you might get errors about + a conflicting declarations for 'func'. Finally, the constructed + 'main()' function either references 'func' or (if 'call' is true) + calls it. 'libraries' and 'library_dirs' are used when + linking. + """ + + self._check_compiler() + body = [] + if decl: + body.append("int %s ();" % func) + body.append("int main () {") + if call: + body.append(" %s();" % func) + else: + body.append(" %s;" % func) + body.append("}") + body = string.join(body, "\n") + "\n" + + return self.try_link(body, headers, include_dirs, + libraries, library_dirs) + + # check_func () + + def check_lib (self, library, library_dirs=None, + headers=None, include_dirs=None, other_libraries=[]): + """Determine if 'library' is available to be linked against, + without actually checking that any particular symbols are provided + by it. 'headers' will be used in constructing the source file to + be compiled, but the only effect of this is to check if all the + header files listed are available. Any libraries listed in + 'other_libraries' will be included in the link, in case 'library' + has symbols that depend on other libraries. + """ + self._check_compiler() + return self.try_link("int main (void) { }", + headers, include_dirs, + [library]+other_libraries, library_dirs) + + def check_header (self, header, include_dirs=None, + library_dirs=None, lang="c"): + """Determine if the system header file named by 'header_file' + exists and can be found by the preprocessor; return true if so, + false otherwise. + """ + return self.try_cpp(body="/* No body */", headers=[header], + include_dirs=include_dirs) + + +# class config + + +def dump_file (filename, head=None): + if head is None: + print filename + ":" + else: + print head + + file = open(filename) + sys.stdout.write(file.read()) + file.close() diff --git a/lib-python/2.2/distutils/command/install.py b/lib-python/2.2/distutils/command/install.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/install.py @@ -0,0 +1,598 @@ +"""distutils.command.install + +Implements the Distutils 'install' command.""" + +# created 1999/03/13, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string +from types import * +from distutils.core import Command, DEBUG +from distutils.sysconfig import get_config_vars +from distutils.errors import DistutilsPlatformError +from distutils.file_util import write_file +from distutils.util import convert_path, subst_vars, change_root +from distutils.errors import DistutilsOptionError +from glob import glob + +if sys.version < "2.2": + WINDOWS_SCHEME = { + 'purelib': '$base', + 'platlib': '$base', + 'headers': '$base/Include/$dist_name', + 'scripts': '$base/Scripts', + 'data' : '$base', + } +else: + WINDOWS_SCHEME = { + 'purelib': '$base/Lib/site-packages', + 'platlib': '$base/Lib/site-packages', + 'headers': '$base/Include/$dist_name', + 'scripts': '$base/Scripts', + 'data' : '$base', + } + +INSTALL_SCHEMES = { + 'unix_prefix': { + 'purelib': '$base/lib/python$py_version_short/site-packages', + 'platlib': '$platbase/lib/python$py_version_short/site-packages', + 'headers': '$base/include/python$py_version_short/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', + }, + 'unix_home': { + 'purelib': '$base/lib/python', + 'platlib': '$base/lib/python', + 'headers': '$base/include/python/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', + }, + 'nt': WINDOWS_SCHEME, + 'mac': { + 'purelib': '$base/Lib/site-packages', + 'platlib': '$base/Lib/site-packages', + 'headers': '$base/Include/$dist_name', + 'scripts': '$base/Scripts', + 'data' : '$base', + }, + 'java': { + 'purelib': '$base/Lib', + 'platlib': '$base/Lib', + 'headers': '$base/Include/$dist_name', + 'scripts': '$base/Scripts', + 'data' : '$base', + }, + } + +# The keys to an installation scheme; if any new types of files are to be +# installed, be sure to add an entry to every installation scheme above, +# and to SCHEME_KEYS here. +SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data') + + +class install (Command): + + description = "install everything from build directory" + + user_options = [ + # Select installation scheme and set base director(y|ies) + ('prefix=', None, + "installation prefix"), + ('exec-prefix=', None, + "(Unix only) prefix for platform-specific files"), + ('home=', None, + "(Unix only) home directory to install under"), + + # Or, just set the base director(y|ies) + ('install-base=', None, + "base installation directory (instead of --prefix or --home)"), + ('install-platbase=', None, + "base installation directory for platform-specific files " + + "(instead of --exec-prefix or --home)"), + ('root=', None, + "install everything relative to this alternate root directory"), + + # Or, explicitly set the installation scheme + ('install-purelib=', None, + "installation directory for pure Python module distributions"), + ('install-platlib=', None, + "installation directory for non-pure module distributions"), + ('install-lib=', None, + "installation directory for all module distributions " + + "(overrides --install-purelib and --install-platlib)"), + + ('install-headers=', None, + "installation directory for C/C++ headers"), + ('install-scripts=', None, + "installation directory for Python scripts"), + ('install-data=', None, + "installation directory for data files"), + + # Byte-compilation options -- see install_lib.py for details, as + # these are duplicated from there (but only install_lib does + # anything with them). + ('compile', 'c', "compile .py to .pyc [default]"), + ('no-compile', None, "don't compile .py files"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + + # Miscellaneous control options + ('force', 'f', + "force installation (overwrite any existing files)"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + + # Where to install documentation (eventually!) + #('doc-format=', None, "format of documentation to generate"), + #('install-man=', None, "directory for Unix man pages"), + #('install-html=', None, "directory for HTML documentation"), + #('install-info=', None, "directory for GNU info files"), + + ('record=', None, + "filename in which to record list of installed files"), + ] + + boolean_options = ['compile', 'force', 'skip-build'] + negative_opt = {'no-compile' : 'compile'} + + + def initialize_options (self): + + # High-level options: these select both an installation base + # and scheme. + self.prefix = None + self.exec_prefix = None + self.home = None + + # These select only the installation base; it's up to the user to + # specify the installation scheme (currently, that means supplying + # the --install-{platlib,purelib,scripts,data} options). + self.install_base = None + self.install_platbase = None + self.root = None + + # These options are the actual installation directories; if not + # supplied by the user, they are filled in using the installation + # scheme implied by prefix/exec-prefix/home and the contents of + # that installation scheme. + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + + self.compile = None + self.optimize = None + + # These two are for putting non-packagized distributions into their + # own directory and creating a .pth file if it makes sense. + # 'extra_path' comes from the setup file; 'install_path_file' can + # be turned off if it makes no sense to install a .pth file. (But + # better to install it uselessly than to guess wrong and not + # install it when it's necessary and would be used!) Currently, + # 'install_path_file' is always true unless some outsider meddles + # with it. + self.extra_path = None + self.install_path_file = 1 + + # 'force' forces installation, even if target files are not + # out-of-date. 'skip_build' skips running the "build" command, + # handy if you know it's not necessary. 'warn_dir' (which is *not* + # a user option, it's just there so the bdist_* commands can turn + # it off) determines whether we warn about installing to a + # directory not in sys.path. + self.force = 0 + self.skip_build = 0 + self.warn_dir = 1 + + # These are only here as a conduit from the 'build' command to the + # 'install_*' commands that do the real work. ('build_base' isn't + # actually used anywhere, but it might be useful in future.) They + # are not user options, because if the user told the install + # command where the build directory is, that wouldn't affect the + # build command. + self.build_base = None + self.build_lib = None + + # Not defined yet because we don't know anything about + # documentation yet. + #self.install_man = None + #self.install_html = None + #self.install_info = None + + self.record = None + + + # -- Option finalizing methods ------------------------------------- + # (This is rather more involved than for most commands, + # because this is where the policy for installing third- + # party Python modules on various platforms given a wide + # array of user input is decided. Yes, it's quite complex!) + + def finalize_options (self): + + # This method (and its pliant slaves, like 'finalize_unix()', + # 'finalize_other()', and 'select_scheme()') is where the default + # installation directories for modules, extension modules, and + # anything else we care to install from a Python module + # distribution. Thus, this code makes a pretty important policy + # statement about how third-party stuff is added to a Python + # installation! Note that the actual work of installation is done + # by the relatively simple 'install_*' commands; they just take + # their orders from the installation directory options determined + # here. + + # Check for errors/inconsistencies in the options; first, stuff + # that's wrong on any platform. + + if ((self.prefix or self.exec_prefix or self.home) and + (self.install_base or self.install_platbase)): + raise DistutilsOptionError, \ + ("must supply either prefix/exec-prefix/home or " + + "install-base/install-platbase -- not both") + + # Next, stuff that's wrong (or dubious) only on certain platforms. + if os.name == 'posix': + if self.home and (self.prefix or self.exec_prefix): + raise DistutilsOptionError, \ + ("must supply either home or prefix/exec-prefix -- " + + "not both") + else: + if self.exec_prefix: + self.warn("exec-prefix option ignored on this platform") + self.exec_prefix = None + if self.home: + self.warn("home option ignored on this platform") + self.home = None + + # Now the interesting logic -- so interesting that we farm it out + # to other methods. The goal of these methods is to set the final + # values for the install_{lib,scripts,data,...} options, using as + # input a heady brew of prefix, exec_prefix, home, install_base, + # install_platbase, user-supplied versions of + # install_{purelib,platlib,lib,scripts,data,...}, and the + # INSTALL_SCHEME dictionary above. Phew! + + self.dump_dirs("pre-finalize_{unix,other}") + + if os.name == 'posix': + self.finalize_unix() + else: + self.finalize_other() + + self.dump_dirs("post-finalize_{unix,other}()") + + # Expand configuration variables, tilde, etc. in self.install_base + # and self.install_platbase -- that way, we can use $base or + # $platbase in the other installation directories and not worry + # about needing recursive variable expansion (shudder). + + py_version = (string.split(sys.version))[0] + (prefix, exec_prefix) = get_config_vars('prefix', 'exec_prefix') + self.config_vars = {'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + } + self.expand_basedirs() + + self.dump_dirs("post-expand_basedirs()") + + # Now define config vars for the base directories so we can expand + # everything else. + self.config_vars['base'] = self.install_base + self.config_vars['platbase'] = self.install_platbase + + if DEBUG: + from pprint import pprint + print "config vars:" + pprint(self.config_vars) + + # Expand "~" and configuration variables in the installation + # directories. + self.expand_dirs() + + self.dump_dirs("post-expand_dirs()") + + # Pick the actual directory to install all modules to: either + # install_purelib or install_platlib, depending on whether this + # module distribution is pure or not. Of course, if the user + # already specified install_lib, use their selection. + if self.install_lib is None: + if self.distribution.ext_modules: # has extensions: non-pure + self.install_lib = self.install_platlib + else: + self.install_lib = self.install_purelib + + + # Convert directories from Unix /-separated syntax to the local + # convention. + self.convert_paths('lib', 'purelib', 'platlib', + 'scripts', 'data', 'headers') + + # Well, we're not actually fully completely finalized yet: we still + # have to deal with 'extra_path', which is the hack for allowing + # non-packagized module distributions (hello, Numerical Python!) to + # get their own directories. + self.handle_extra_path() + self.install_libbase = self.install_lib # needed for .pth file + self.install_lib = os.path.join(self.install_lib, self.extra_dirs) + + # If a new root directory was supplied, make all the installation + # dirs relative to it. + if self.root is not None: + self.change_roots('libbase', 'lib', 'purelib', 'platlib', + 'scripts', 'data', 'headers') + + self.dump_dirs("after prepending root") + + # Find out the build directories, ie. where to install from. + self.set_undefined_options('build', + ('build_base', 'build_base'), + ('build_lib', 'build_lib')) + + # Punt on doc directories for now -- after all, we're punting on + # documentation completely! + + # finalize_options () + + + def dump_dirs (self, msg): + if DEBUG: + from distutils.fancy_getopt import longopt_xlate + print msg + ":" + for opt in self.user_options: + opt_name = opt[0] + if opt_name[-1] == "=": + opt_name = opt_name[0:-1] + opt_name = string.translate(opt_name, longopt_xlate) + val = getattr(self, opt_name) + print " %s: %s" % (opt_name, val) + + + def finalize_unix (self): + + if self.install_base is not None or self.install_platbase is not None: + if ((self.install_lib is None and + self.install_purelib is None and + self.install_platlib is None) or + self.install_headers is None or + self.install_scripts is None or + self.install_data is None): + raise DistutilsOptionError, \ + "install-base or install-platbase supplied, but " + \ + "installation scheme is incomplete" + return + + if self.home is not None: + self.install_base = self.install_platbase = self.home + self.select_scheme("unix_home") + else: + if self.prefix is None: + if self.exec_prefix is not None: + raise DistutilsOptionError, \ + "must not supply exec-prefix without prefix" + + self.prefix = os.path.normpath(sys.prefix) + self.exec_prefix = os.path.normpath(sys.exec_prefix) + + else: + if self.exec_prefix is None: + self.exec_prefix = self.prefix + + self.install_base = self.prefix + self.install_platbase = self.exec_prefix + self.select_scheme("unix_prefix") + + # finalize_unix () + + + def finalize_other (self): # Windows and Mac OS for now + + if self.prefix is None: + self.prefix = os.path.normpath(sys.prefix) + + self.install_base = self.install_platbase = self.prefix + try: + self.select_scheme(os.name) + except KeyError: + raise DistutilsPlatformError, \ + "I don't know how to install stuff on '%s'" % os.name + + # finalize_other () + + + def select_scheme (self, name): + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + + def _expand_attrs (self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + + def expand_basedirs (self): + self._expand_attrs(['install_base', + 'install_platbase', + 'root']) + + def expand_dirs (self): + self._expand_attrs(['install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data',]) + + + def convert_paths (self, *names): + for name in names: + attr = "install_" + name + setattr(self, attr, convert_path(getattr(self, attr))) + + + def handle_extra_path (self): + + if self.extra_path is None: + self.extra_path = self.distribution.extra_path + + if self.extra_path is not None: + if type(self.extra_path) is StringType: + self.extra_path = string.split(self.extra_path, ',') + + if len(self.extra_path) == 1: + path_file = extra_dirs = self.extra_path[0] + elif len(self.extra_path) == 2: + (path_file, extra_dirs) = self.extra_path + else: + raise DistutilsOptionError, \ + "'extra_path' option must be a list, tuple, or " + \ + "comma-separated string with 1 or 2 elements" + + # convert to local form in case Unix notation used (as it + # should be in setup scripts) + extra_dirs = convert_path(extra_dirs) + + else: + path_file = None + extra_dirs = '' + + # XXX should we warn if path_file and not extra_dirs? (in which + # case the path file would be harmless but pointless) + self.path_file = path_file + self.extra_dirs = extra_dirs + + # handle_extra_path () + + + def change_roots (self, *names): + for name in names: + attr = "install_" + name + setattr(self, attr, change_root(self.root, getattr(self, attr))) + + + # -- Command execution methods ------------------------------------- + + def run (self): + + # Obviously have to build before we can install + if not self.skip_build: + self.run_command('build') + + # Run all sub-commands (at least those that need to be run) + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + if self.path_file: + self.create_path_file() + + # write list of installed files, if requested. + if self.record: + outputs = self.get_outputs() + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in xrange(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + self.execute(write_file, + (self.record, outputs), + "writing list of installed files to '%s'" % + self.record) + + sys_path = map(os.path.normpath, sys.path) + sys_path = map(os.path.normcase, sys_path) + install_lib = os.path.normcase(os.path.normpath(self.install_lib)) + if (self.warn_dir and + not (self.path_file and self.install_path_file) and + install_lib not in sys_path): + self.warn(("modules installed to '%s', which is not in " + + "Python's module search path (sys.path) -- " + + "you'll have to change the search path yourself") % + self.install_lib) + + # run () + + def create_path_file (self): + filename = os.path.join(self.install_libbase, + self.path_file + ".pth") + if self.install_path_file: + self.execute(write_file, + (filename, [self.extra_dirs]), + "creating %s" % filename) + else: + self.warn("path file '%s' not created" % filename) + + + # -- Reporting methods --------------------------------------------- + + def get_outputs (self): + # Assemble the outputs of all the sub-commands. + outputs = [] + for cmd_name in self.get_sub_commands(): + cmd = self.get_finalized_command(cmd_name) + # Add the contents of cmd.get_outputs(), ensuring + # that outputs doesn't contain duplicate entries + for filename in cmd.get_outputs(): + if filename not in outputs: + outputs.append(filename) + + if self.path_file and self.install_path_file: + outputs.append(os.path.join(self.install_libbase, + self.path_file + ".pth")) + + return outputs + + def get_inputs (self): + # XXX gee, this looks familiar ;-( + inputs = [] + for cmd_name in self.get_sub_commands(): + cmd = self.get_finalized_command(cmd_name) + inputs.extend(cmd.get_inputs()) + + return inputs + + + # -- Predicates for sub-command list ------------------------------- + + def has_lib (self): + """Return true if the current distribution has any Python + modules to install.""" + return (self.distribution.has_pure_modules() or + self.distribution.has_ext_modules()) + + def has_headers (self): + return self.distribution.has_headers() + + def has_scripts (self): + return self.distribution.has_scripts() + + def has_data (self): + return self.distribution.has_data_files() + + + # 'sub_commands': a list of commands this command might have to run to + # get its work done. See cmd.py for more info. + sub_commands = [('install_lib', has_lib), + ('install_headers', has_headers), + ('install_scripts', has_scripts), + ('install_data', has_data), + ] + +# class install diff --git a/lib-python/2.2/distutils/command/install_data.py b/lib-python/2.2/distutils/command/install_data.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/install_data.py @@ -0,0 +1,83 @@ +"""distutils.command.install_data + +Implements the Distutils 'install_data' command, for installing +platform-independent data files.""" + +# contributed by Bastian Kleineidam + +__revision__ = "$Id$" + +import os +from types import StringType +from distutils.core import Command +from distutils.util import change_root, convert_path + +class install_data (Command): + + description = "install data files" + + user_options = [ + ('install-dir=', 'd', + "base directory for installing data files " + "(default: installation base dir)"), + ('root=', None, + "install everything relative to this alternate root directory"), + ('force', 'f', "force installation (overwrite existing files)"), + ] + + boolean_options = ['force'] + + def initialize_options (self): + self.install_dir = None + self.outfiles = [] + self.root = None + self.force = 0 + + self.data_files = self.distribution.data_files + self.warn_dir = 1 + + def finalize_options (self): + self.set_undefined_options('install', + ('install_data', 'install_dir'), + ('root', 'root'), + ('force', 'force'), + ) + + def run (self): + self.mkpath(self.install_dir) + for f in self.data_files: + if type(f) == StringType: + # it's a simple file, so copy it + f = convert_path(f) + if self.warn_dir: + self.warn("setup script did not provide a directory for " + "'%s' -- installing right in '%s'" % + (f, self.install_dir)) + (out, _) = self.copy_file(f, self.install_dir) + self.outfiles.append(out) + else: + # it's a tuple with path to install to and a list of files + dir = convert_path(f[0]) + if not os.path.isabs(dir): + dir = os.path.join(self.install_dir, dir) + elif self.root: + dir = change_root(self.root, dir) + self.mkpath(dir) + + if f[1] == []: + # If there are no files listed, the user must be + # trying to create an empty directory, so add the + # directory to the list of output files. + self.outfiles.append(dir) + else: + # Copy files, adding them to the list of output files. + for data in f[1]: + data = convert_path(data) + (out, _) = self.copy_file(data, dir) + self.outfiles.append(out) + + def get_inputs (self): + return self.data_files or [] + + def get_outputs (self): + return self.outfiles diff --git a/lib-python/2.2/distutils/command/install_headers.py b/lib-python/2.2/distutils/command/install_headers.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/install_headers.py @@ -0,0 +1,53 @@ +"""distutils.command.install_headers + +Implements the Distutils 'install_headers' command, to install C/C++ header +files to the Python include directory.""" + +# created 2000/05/26, Greg Ward + +__revision__ = "$Id$" + +import os +from distutils.core import Command + + +class install_headers (Command): + + description = "install C/C++ header files" + + user_options = [('install-dir=', 'd', + "directory to install header files to"), + ('force', 'f', + "force installation (overwrite existing files)"), + ] + + boolean_options = ['force'] + + def initialize_options (self): + self.install_dir = None + self.force = 0 + self.outfiles = [] + + def finalize_options (self): + self.set_undefined_options('install', + ('install_headers', 'install_dir'), + ('force', 'force')) + + + def run (self): + headers = self.distribution.headers + if not headers: + return + + self.mkpath(self.install_dir) + for header in headers: + (out, _) = self.copy_file(header, self.install_dir) + self.outfiles.append(out) + + def get_inputs (self): + return self.distribution.headers or [] + + def get_outputs (self): + return self.outfiles + +# class install_headers diff --git a/lib-python/2.2/distutils/command/install_lib.py b/lib-python/2.2/distutils/command/install_lib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/install_lib.py @@ -0,0 +1,213 @@ +# created 1999/03/13, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string +from types import IntType +from distutils.core import Command +from distutils.errors import DistutilsOptionError +from distutils.dir_util import copy_tree + +class install_lib (Command): + + description = "install all Python modules (extensions and pure Python)" + + # The byte-compilation options are a tad confusing. Here are the + # possible scenarios: + # 1) no compilation at all (--no-compile --no-optimize) + # 2) compile .pyc only (--compile --no-optimize; default) + # 3) compile .pyc and "level 1" .pyo (--compile --optimize) + # 4) compile "level 1" .pyo only (--no-compile --optimize) + # 5) compile .pyc and "level 2" .pyo (--compile --optimize-more) + # 6) compile "level 2" .pyo only (--no-compile --optimize-more) + # + # The UI for this is two option, 'compile' and 'optimize'. + # 'compile' is strictly boolean, and only decides whether to + # generate .pyc files. 'optimize' is three-way (0, 1, or 2), and + # decides both whether to generate .pyo files and what level of + # optimization to use. + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ('build-dir=','b', "build directory (where to install from)"), + ('force', 'f', "force installation (overwrite existing files)"), + ('compile', 'c', "compile .py to .pyc [default]"), + ('no-compile', None, "don't compile .py files"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('skip-build', None, "skip the build steps"), + ] + + boolean_options = ['force', 'compile', 'skip-build'] + negative_opt = {'no-compile' : 'compile'} + + + def initialize_options (self): + # let the 'install' command dictate our installation directory + self.install_dir = None + self.build_dir = None + self.force = 0 + self.compile = None + self.optimize = None + self.skip_build = None + + def finalize_options (self): + + # Get all the information we need to install pure Python modules + # from the umbrella 'install' command -- build (source) directory, + # install (target) directory, and whether to compile .py files. + self.set_undefined_options('install', + ('build_lib', 'build_dir'), + ('install_lib', 'install_dir'), + ('force', 'force'), + ('compile', 'compile'), + ('optimize', 'optimize'), + ('skip_build', 'skip_build'), + ) + + if self.compile is None: + self.compile = 1 + if self.optimize is None: + self.optimize = 0 + + if type(self.optimize) is not IntType: + try: + self.optimize = int(self.optimize) + assert 0 <= self.optimize <= 2 + except (ValueError, AssertionError): + raise DistutilsOptionError, "optimize must be 0, 1, or 2" + + def run (self): + + # Make sure we have built everything we need first + self.build() + + # Install everything: simply dump the entire contents of the build + # directory to the installation directory (that's the beauty of + # having a build directory!) + outfiles = self.install() + + # (Optionally) compile .py to .pyc + if outfiles is not None and self.distribution.has_pure_modules(): + self.byte_compile(outfiles) + + # run () + + + # -- Top-level worker functions ------------------------------------ + # (called from 'run()') + + def build (self): + if not self.skip_build: + if self.distribution.has_pure_modules(): + self.run_command('build_py') + if self.distribution.has_ext_modules(): + self.run_command('build_ext') + + def install (self): + if os.path.isdir(self.build_dir): + outfiles = self.copy_tree(self.build_dir, self.install_dir) + else: + self.warn("'%s' does not exist -- no Python modules to install" % + self.build_dir) + return + return outfiles + + def byte_compile (self, files): + from distutils.util import byte_compile + + # Get the "--root" directory supplied to the "install" command, + # and use it as a prefix to strip off the purported filename + # encoded in bytecode files. This is far from complete, but it + # should at least generate usable bytecode in RPM distributions. + install_root = self.get_finalized_command('install').root + + if self.compile: + byte_compile(files, optimize=0, + force=self.force, + prefix=install_root, + verbose=self.verbose, dry_run=self.dry_run) + if self.optimize > 0: + byte_compile(files, optimize=self.optimize, + force=self.force, + prefix=install_root, + verbose=self.verbose, dry_run=self.dry_run) + + + # -- Utility methods ----------------------------------------------- + + def _mutate_outputs (self, has_any, build_cmd, cmd_option, output_dir): + + if not has_any: + return [] + + build_cmd = self.get_finalized_command(build_cmd) + build_files = build_cmd.get_outputs() + build_dir = getattr(build_cmd, cmd_option) + + prefix_len = len(build_dir) + len(os.sep) + outputs = [] + for file in build_files: + outputs.append(os.path.join(output_dir, file[prefix_len:])) + + return outputs + + # _mutate_outputs () + + def _bytecode_filenames (self, py_filenames): + bytecode_files = [] + for py_file in py_filenames: + if self.compile: + bytecode_files.append(py_file + "c") + if self.optimize > 0: + bytecode_files.append(py_file + "o") + + return bytecode_files + + + # -- External interface -------------------------------------------- + # (called by outsiders) + + def get_outputs (self): + """Return the list of files that would be installed if this command + were actually run. Not affected by the "dry-run" flag or whether + modules have actually been built yet. + """ + pure_outputs = \ + self._mutate_outputs(self.distribution.has_pure_modules(), + 'build_py', 'build_lib', + self.install_dir) + if self.compile: + bytecode_outputs = self._bytecode_filenames(pure_outputs) + else: + bytecode_outputs = [] + + ext_outputs = \ + self._mutate_outputs(self.distribution.has_ext_modules(), + 'build_ext', 'build_lib', + self.install_dir) + + return pure_outputs + bytecode_outputs + ext_outputs + + # get_outputs () + + def get_inputs (self): + """Get the list of files that are input to this command, ie. the + files that get installed as they are named in the build tree. + The files in this list correspond one-to-one to the output + filenames returned by 'get_outputs()'. + """ + inputs = [] + + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + inputs.extend(build_py.get_outputs()) + + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + inputs.extend(build_ext.get_outputs()) + + return inputs + +# class install_lib diff --git a/lib-python/2.2/distutils/command/install_scripts.py b/lib-python/2.2/distutils/command/install_scripts.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/install_scripts.py @@ -0,0 +1,63 @@ +"""distutils.command.install_scripts + +Implements the Distutils 'install_scripts' command, for installing +Python scripts.""" + +# contributed by Bastian Kleineidam + +__revision__ = "$Id$" + +import os +from distutils.core import Command +from stat import ST_MODE + +class install_scripts (Command): + + description = "install scripts (Python or otherwise)" + + user_options = [ + ('install-dir=', 'd', "directory to install scripts to"), + ('build-dir=','b', "build directory (where to install from)"), + ('force', 'f', "force installation (overwrite existing files)"), + ('skip-build', None, "skip the build steps"), + ] + + boolean_options = ['force', 'skip-build'] + + + def initialize_options (self): + self.install_dir = None + self.force = 0 + self.build_dir = None + self.skip_build = None + + def finalize_options (self): + self.set_undefined_options('build', ('build_scripts', 'build_dir')) + self.set_undefined_options('install', + ('install_scripts', 'install_dir'), + ('force', 'force'), + ('skip_build', 'skip_build'), + ) + + def run (self): + if not self.skip_build: + self.run_command('build_scripts') + self.outfiles = self.copy_tree(self.build_dir, self.install_dir) + if os.name == 'posix': + # Set the executable bits (owner, group, and world) on + # all the scripts we just installed. + for file in self.get_outputs(): + if self.dry_run: + self.announce("changing mode of %s" % file) + else: + mode = ((os.stat(file)[ST_MODE]) | 0555) & 07777 + self.announce("changing mode of %s to %o" % (file, mode)) + os.chmod(file, mode) + + def get_inputs (self): + return self.distribution.scripts or [] + + def get_outputs(self): + return self.outfiles or [] + +# class install_scripts diff --git a/lib-python/2.2/distutils/command/sdist.py b/lib-python/2.2/distutils/command/sdist.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/command/sdist.py @@ -0,0 +1,475 @@ +"""distutils.command.sdist + +Implements the Distutils 'sdist' command (create a source distribution).""" + +# created 1999/09/22, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string +from types import * +from glob import glob +from distutils.core import Command +from distutils import dir_util, dep_util, file_util, archive_util +from distutils.text_file import TextFile +from distutils.errors import * +from distutils.filelist import FileList + + +def show_formats (): + """Print all possible values for the 'formats' option (used by + the "--help-formats" command-line option). + """ + from distutils.fancy_getopt import FancyGetopt + from distutils.archive_util import ARCHIVE_FORMATS + formats=[] + for format in ARCHIVE_FORMATS.keys(): + formats.append(("formats=" + format, None, + ARCHIVE_FORMATS[format][2])) + formats.sort() + pretty_printer = FancyGetopt(formats) + pretty_printer.print_help( + "List of available source distribution formats:") + +class sdist (Command): + + description = "create a source distribution (tarball, zip file, etc.)" + + user_options = [ + ('template=', 't', + "name of manifest template file [default: MANIFEST.in]"), + ('manifest=', 'm', + "name of manifest file [default: MANIFEST]"), + ('use-defaults', None, + "include the default file set in the manifest " + "[default; disable with --no-defaults]"), + ('no-defaults', None, + "don't include the default file set"), + ('prune', None, + "specifically exclude files/directories that should not be " + "distributed (build tree, RCS/CVS dirs, etc.) " + "[default; disable with --no-prune]"), + ('no-prune', None, + "don't automatically exclude anything"), + ('manifest-only', 'o', + "just regenerate the manifest and then stop " + "(implies --force-manifest)"), + ('force-manifest', 'f', + "forcibly regenerate the manifest and carry on as usual"), + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + boolean_options = ['use-defaults', 'prune', + 'manifest-only', 'force-manifest', + 'keep-temp'] + + help_options = [ + ('help-formats', None, + "list available distribution formats", show_formats), + ] + + negative_opt = {'no-defaults': 'use-defaults', + 'no-prune': 'prune' } + + default_format = { 'posix': 'gztar', + 'nt': 'zip' } + + def initialize_options (self): + # 'template' and 'manifest' are, respectively, the names of + # the manifest template and manifest file. + self.template = None + self.manifest = None + + # 'use_defaults': if true, we will include the default file set + # in the manifest + self.use_defaults = 1 + self.prune = 1 + + self.manifest_only = 0 + self.force_manifest = 0 + + self.formats = None + self.keep_temp = 0 + self.dist_dir = None + + self.archive_files = None + + + def finalize_options (self): + if self.manifest is None: + self.manifest = "MANIFEST" + if self.template is None: + self.template = "MANIFEST.in" + + self.ensure_string_list('formats') + if self.formats is None: + try: + self.formats = [self.default_format[os.name]] + except KeyError: + raise DistutilsPlatformError, \ + "don't know how to create source distributions " + \ + "on platform %s" % os.name + + bad_format = archive_util.check_archive_formats(self.formats) + if bad_format: + raise DistutilsOptionError, \ + "unknown archive format '%s'" % bad_format + + if self.dist_dir is None: + self.dist_dir = "dist" + + + def run (self): + + # 'filelist' contains the list of files that will make up the + # manifest + self.filelist = FileList() + + # Ensure that all required meta-data is given; warn if not (but + # don't die, it's not *that* serious!) + self.check_metadata() + + # Do whatever it takes to get the list of files to process + # (process the manifest template, read an existing manifest, + # whatever). File list is accumulated in 'self.filelist'. + self.get_file_list() + + # If user just wanted us to regenerate the manifest, stop now. + if self.manifest_only: + return + + # Otherwise, go ahead and create the source distribution tarball, + # or zipfile, or whatever. + self.make_distribution() + + + def check_metadata (self): + """Ensure that all required elements of meta-data (name, version, + URL, (author and author_email) or (maintainer and + maintainer_email)) are supplied by the Distribution object; warn if + any are missing. + """ + metadata = self.distribution.metadata + + missing = [] + for attr in ('name', 'version', 'url'): + if not (hasattr(metadata, attr) and getattr(metadata, attr)): + missing.append(attr) + + if missing: + self.warn("missing required meta-data: " + + string.join(missing, ", ")) + + if metadata.author: + if not metadata.author_email: + self.warn("missing meta-data: if 'author' supplied, " + + "'author_email' must be supplied too") + elif metadata.maintainer: + if not metadata.maintainer_email: + self.warn("missing meta-data: if 'maintainer' supplied, " + + "'maintainer_email' must be supplied too") + else: + self.warn("missing meta-data: either (author and author_email) " + + "or (maintainer and maintainer_email) " + + "must be supplied") + + # check_metadata () + + + def get_file_list (self): + """Figure out the list of files to include in the source + distribution, and put it in 'self.filelist'. This might involve + reading the manifest template (and writing the manifest), or just + reading the manifest, or just using the default file set -- it all + depends on the user's options and the state of the filesystem. + """ + + # If we have a manifest template, see if it's newer than the + # manifest; if so, we'll regenerate the manifest. + template_exists = os.path.isfile(self.template) + if template_exists: + template_newer = dep_util.newer(self.template, self.manifest) + + # The contents of the manifest file almost certainly depend on the + # setup script as well as the manifest template -- so if the setup + # script is newer than the manifest, we'll regenerate the manifest + # from the template. (Well, not quite: if we already have a + # manifest, but there's no template -- which will happen if the + # developer elects to generate a manifest some other way -- then we + # can't regenerate the manifest, so we don't.) + self.debug_print("checking if %s newer than %s" % + (self.distribution.script_name, self.manifest)) + setup_newer = dep_util.newer(self.distribution.script_name, + self.manifest) + + # cases: + # 1) no manifest, template exists: generate manifest + # (covered by 2a: no manifest == template newer) + # 2) manifest & template exist: + # 2a) template or setup script newer than manifest: + # regenerate manifest + # 2b) manifest newer than both: + # do nothing (unless --force or --manifest-only) + # 3) manifest exists, no template: + # do nothing (unless --force or --manifest-only) + # 4) no manifest, no template: generate w/ warning ("defaults only") + + manifest_outofdate = (template_exists and + (template_newer or setup_newer)) + force_regen = self.force_manifest or self.manifest_only + manifest_exists = os.path.isfile(self.manifest) + neither_exists = (not template_exists and not manifest_exists) + + # Regenerate the manifest if necessary (or if explicitly told to) + if manifest_outofdate or neither_exists or force_regen: + if not template_exists: + self.warn(("manifest template '%s' does not exist " + + "(using default file list)") % + self.template) + + self.filelist.findall() + + # Add default file set to 'files' + if self.use_defaults: + self.add_defaults() + + # Read manifest template if it exists + if template_exists: + self.read_template() + + # Prune away any directories that don't belong in the source + # distribution + if self.prune: + self.prune_file_list() + + # File list now complete -- sort it so that higher-level files + # come first + self.filelist.sort() + + # Remove duplicates from the file list + self.filelist.remove_duplicates() + + # And write complete file list (including default file set) to + # the manifest. + self.write_manifest() + + # Don't regenerate the manifest, just read it in. + else: + self.read_manifest() + + # get_file_list () + + + def add_defaults (self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + + standards = [('README', 'README.txt'), self.distribution.script_name] + for fn in standards: + if type(fn) is TupleType: + alts = fn + got_it = 0 + for fn in alts: + if os.path.exists(fn): + got_it = 1 + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + string.join(alts, ', ')) + else: + if os.path.exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + if files: + self.filelist.extend(files) + + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + # add_defaults () + + + def read_template (self): + + """Read and parse the manifest template file named by + 'self.template' (usually "MANIFEST.in"). The parsing and + processing is done by 'self.filelist', which updates itself + accordingly. + """ + self.announce("reading manifest template '%s'" % self.template) + template = TextFile(self.template, + strip_comments=1, + skip_blanks=1, + join_lines=1, + lstrip_ws=1, + rstrip_ws=1, + collapse_join=1) + + while 1: + line = template.readline() + if line is None: # end of file + break + + try: + self.filelist.process_template_line(line) + except DistutilsTemplateError, msg: + self.warn("%s, line %d: %s" % (template.filename, + template.current_line, + msg)) + + # read_template () + + + def prune_file_list (self): + """Prune off branches that might slip into the file list as created + by 'read_template()', but really don't belong there: + * the build tree (typically "build") + * the release tree itself (only an issue if we ran "sdist" + previously with --keep-temp, or it aborted) + * any RCS or CVS directories + """ + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + + self.filelist.exclude_pattern(None, prefix=build.build_base) + self.filelist.exclude_pattern(None, prefix=base_dir) + self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1) + + + def write_manifest (self): + """Write the file list in 'self.filelist' (presumably as filled in + by 'add_defaults()' and 'read_template()') to the manifest file + named by 'self.manifest'. + """ + self.execute(file_util.write_file, + (self.manifest, self.filelist.files), + "writing manifest file '%s'" % self.manifest) + + # write_manifest () + + + def read_manifest (self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + self.announce("reading manifest file '%s'" % self.manifest) + manifest = open(self.manifest) + while 1: + line = manifest.readline() + if line == '': # end of file + break + if line[-1] == '\n': + line = line[0:-1] + self.filelist.append(line) + + # read_manifest () + + + def make_release_tree (self, base_dir, files): + """Create the directory tree that will become the source + distribution archive. All directories implied by the filenames in + 'files' are created under 'base_dir', and then we hard link or copy + (if hard linking is unavailable) those files into place. + Essentially, this duplicates the developer's source tree, but in a + directory named after the distribution, containing only the files + to be distributed. + """ + # Create all the directories under 'base_dir' necessary to + # put 'files' there; the 'mkpath()' is just so we don't die + # if the manifest happens to be empty. + self.mkpath(base_dir) + dir_util.create_tree(base_dir, files, + verbose=self.verbose, dry_run=self.dry_run) + + # And walk over the list of files, either making a hard link (if + # os.link exists) to each one that doesn't already exist in its + # corresponding location under 'base_dir', or copying each file + # that's out-of-date in 'base_dir'. (Usually, all files will be + # out-of-date, because by default we blow away 'base_dir' when + # we're done making the distribution archives.) + + if hasattr(os, 'link'): # can make hard links on this system + link = 'hard' + msg = "making hard links in %s..." % base_dir + else: # nope, have to copy + link = None + msg = "copying files to %s..." % base_dir + + if not files: + self.warn("no files to distribute -- empty manifest?") + else: + self.announce(msg) + for file in files: + if not os.path.isfile(file): + self.warn("'%s' not a regular file -- skipping" % file) + else: + dest = os.path.join(base_dir, file) + self.copy_file(file, dest, link=link) + + self.distribution.metadata.write_pkg_info(base_dir) + + # make_release_tree () + + def make_distribution (self): + """Create the source distribution(s). First, we create the release + tree with 'make_release_tree()'; then, we create all required + archive files (according to 'self.formats') from the release tree. + Finally, we clean up by blowing away the release tree (unless + 'self.keep_temp' is true). The list of archive files created is + stored so it can be retrieved later by 'get_archive_files()'. + """ + # Don't warn about missing meta-data here -- should be (and is!) + # done elsewhere. + base_dir = self.distribution.get_fullname() + base_name = os.path.join(self.dist_dir, base_dir) + + self.make_release_tree(base_dir, self.filelist.files) + archive_files = [] # remember names of files we create + for fmt in self.formats: + file = self.make_archive(base_name, fmt, base_dir=base_dir) + archive_files.append(file) + + self.archive_files = archive_files + + if not self.keep_temp: + dir_util.remove_tree(base_dir, self.verbose, self.dry_run) + + def get_archive_files (self): + """Return the list of archive files created when the command + was run, or None if the command hasn't run yet. + """ + return self.archive_files + +# class sdist diff --git a/lib-python/2.2/distutils/core.py b/lib-python/2.2/distutils/core.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/core.py @@ -0,0 +1,231 @@ +"""distutils.core + +The only module that needs to be imported to use the Distutils; provides +the 'setup' function (which is to be called from the setup script). Also +indirectly provides the Distribution and Command classes, although they are +really defined in distutils.dist and distutils.cmd. +""" + +# created 1999/03/01, Greg Ward + +__revision__ = "$Id$" + +import sys, os +from types import * +from distutils.errors import * +from distutils.util import grok_environment_error + +# Mainly import these so setup scripts can "from distutils.core import" them. +from distutils.dist import Distribution +from distutils.cmd import Command +from distutils.extension import Extension + + +# This is a barebones help message generated displayed when the user +# runs the setup script with no arguments at all. More useful help +# is generated with various --help options: global help, list commands, +# and per-command help. +USAGE = """\ +usage: %(script)s [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] + or: %(script)s --help [cmd1 cmd2 ...] + or: %(script)s --help-commands + or: %(script)s cmd --help +""" + + +# If DISTUTILS_DEBUG is anything other than the empty string, we run in +# debug mode. +DEBUG = os.environ.get('DISTUTILS_DEBUG') + +def gen_usage (script_name): + script = os.path.basename(script_name) + return USAGE % vars() + + +# Some mild magic to control the behaviour of 'setup()' from 'run_setup()'. +_setup_stop_after = None +_setup_distribution = None + + +def setup (**attrs): + """The gateway to the Distutils: do everything your setup script needs + to do, in a highly flexible and user-driven way. Briefly: create a + Distribution instance; find and parse config files; parse the command + line; run each Distutils command found there, customized by the options + supplied to 'setup()' (as keyword arguments), in config files, and on + the command line. + + The Distribution instance might be an instance of a class supplied via + the 'distclass' keyword argument to 'setup'; if no such class is + supplied, then the Distribution class (in dist.py) is instantiated. + All other arguments to 'setup' (except for 'cmdclass') are used to set + attributes of the Distribution instance. + + The 'cmdclass' argument, if supplied, is a dictionary mapping command + names to command classes. Each command encountered on the command line + will be turned into a command class, which is in turn instantiated; any + class found in 'cmdclass' is used in place of the default, which is + (for command 'foo_bar') class 'foo_bar' in module + 'distutils.command.foo_bar'. The command class must provide a + 'user_options' attribute which is a list of option specifiers for + 'distutils.fancy_getopt'. Any command-line options between the current + and the next command are used to set attributes of the current command + object. + + When the entire command-line has been successfully parsed, calls the + 'run()' method on each command object in turn. This method will be + driven entirely by the Distribution object (which each command object + has a reference to, thanks to its constructor), and the + command-specific options that became attributes of each command + object. + """ + + global _setup_stop_after, _setup_distribution + + # Determine the distribution class -- either caller-supplied or + # our Distribution (see below). + klass = attrs.get('distclass') + if klass: + del attrs['distclass'] + else: + klass = Distribution + + if not attrs.has_key('script_name'): + attrs['script_name'] = sys.argv[0] + if not attrs.has_key('script_args'): + attrs['script_args'] = sys.argv[1:] + + # Create the Distribution instance, using the remaining arguments + # (ie. everything except distclass) to initialize it + try: + _setup_distribution = dist = klass(attrs) + except DistutilsSetupError, msg: + raise SystemExit, "error in setup script: %s" % msg + + if _setup_stop_after == "init": + return dist + + # Find and parse the config file(s): they will override options from + # the setup script, but be overridden by the command line. + dist.parse_config_files() + + if DEBUG: + print "options (after parsing config files):" + dist.dump_option_dicts() + + if _setup_stop_after == "config": + return dist + + # Parse the command line; any command-line errors are the end user's + # fault, so turn them into SystemExit to suppress tracebacks. + try: + ok = dist.parse_command_line() + except DistutilsArgError, msg: + script = os.path.basename(dist.script_name) + raise SystemExit, \ + gen_usage(dist.script_name) + "\nerror: %s" % msg + + if DEBUG: + print "options (after parsing command line):" + dist.dump_option_dicts() + + if _setup_stop_after == "commandline": + return dist + + # And finally, run all the commands found on the command line. + if ok: + try: + dist.run_commands() + except KeyboardInterrupt: + raise SystemExit, "interrupted" + except (IOError, os.error), exc: + error = grok_environment_error(exc) + + if DEBUG: + sys.stderr.write(error + "\n") + raise + else: + raise SystemExit, error + + except (DistutilsExecError, + DistutilsFileError, + DistutilsOptionError, + CCompilerError), msg: + if DEBUG: + raise + else: + raise SystemExit, "error: " + str(msg) + + return dist + +# setup () + + +def run_setup (script_name, script_args=None, stop_after="run"): + """Run a setup script in a somewhat controlled environment, and + return the Distribution instance that drives things. This is useful + if you need to find out the distribution meta-data (passed as + keyword args from 'script' to 'setup()', or the contents of the + config files or command-line. + + 'script_name' is a file that will be run with 'execfile()'; + 'sys.argv[0]' will be replaced with 'script' for the duration of the + call. 'script_args' is a list of strings; if supplied, + 'sys.argv[1:]' will be replaced by 'script_args' for the duration of + the call. + + 'stop_after' tells 'setup()' when to stop processing; possible + values: + init + stop after the Distribution instance has been created and + populated with the keyword arguments to 'setup()' + config + stop after config files have been parsed (and their data + stored in the Distribution instance) + commandline + stop after the command-line ('sys.argv[1:]' or 'script_args') + have been parsed (and the data stored in the Distribution) + run [default] + stop after all commands have been run (the same as if 'setup()' + had been called in the usual way + + Returns the Distribution instance, which provides all information + used to drive the Distutils. + """ + if stop_after not in ('init', 'config', 'commandline', 'run'): + raise ValueError, "invalid value for 'stop_after': %s" % `stop_after` + + global _setup_stop_after, _setup_distribution + _setup_stop_after = stop_after + + save_argv = sys.argv + g = {} + l = {} + try: + try: + sys.argv[0] = script_name + if script_args is not None: + sys.argv[1:] = script_args + execfile(script_name, g, l) + finally: + sys.argv = save_argv + _setup_stop_after = None + except SystemExit: + # Hmm, should we do something if exiting with a non-zero code + # (ie. error)? + pass + except: + raise + + if _setup_distribution is None: + raise RuntimeError, \ + ("'distutils.core.setup()' was never called -- " + "perhaps '%s' is not a Distutils setup script?") % \ + script_name + + # I wonder if the setup script's namespace -- g and l -- would be of + # any interest to callers? + #print "_setup_distribution:", _setup_distribution + return _setup_distribution + +# run_setup () diff --git a/lib-python/2.2/distutils/cygwinccompiler.py b/lib-python/2.2/distutils/cygwinccompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/cygwinccompiler.py @@ -0,0 +1,441 @@ +"""distutils.cygwinccompiler + +Provides the CygwinCCompiler class, a subclass of UnixCCompiler that +handles the Cygwin port of the GNU C compiler to Windows. It also contains +the Mingw32CCompiler class which handles the mingw32 port of GCC (same as +cygwin in no-cygwin mode). +""" + +# problems: +# +# * if you use a msvc compiled python version (1.5.2) +# 1. you have to insert a __GNUC__ section in its config.h +# 2. you have to generate a import library for its dll +# - create a def-file for python??.dll +# - create a import library using +# dlltool --dllname python15.dll --def python15.def \ +# --output-lib libpython15.a +# +# see also http://starship.python.net/crew/kernr/mingw32/Notes.html +# +# * We put export_symbols in a def-file, and don't use +# --export-all-symbols because it doesn't worked reliable in some +# tested configurations. And because other windows compilers also +# need their symbols specified this no serious problem. +# +# tested configurations: +# +# * cygwin gcc 2.91.57/ld 2.9.4/dllwrap 0.2.4 works +# (after patching python's config.h and for C++ some other include files) +# see also http://starship.python.net/crew/kernr/mingw32/Notes.html +# * mingw32 gcc 2.95.2/ld 2.9.4/dllwrap 0.2.4 works +# (ld doesn't support -shared, so we use dllwrap) +# * cygwin gcc 2.95.2/ld 2.10.90/dllwrap 2.10.90 works now +# - its dllwrap doesn't work, there is a bug in binutils 2.10.90 +# see also http://sources.redhat.com/ml/cygwin/2000-06/msg01274.html +# - using gcc -mdll instead dllwrap doesn't work without -static because +# it tries to link against dlls instead their import libraries. (If +# it finds the dll first.) +# By specifying -static we force ld to link against the import libraries, +# this is windows standard and there are normally not the necessary symbols +# in the dlls. +# *** only the version of June 2000 shows these problems + +# created 2000/05/05, Rene Liebscher + +__revision__ = "$Id$" + +import os,sys,copy +from distutils.ccompiler import gen_preprocess_options, gen_lib_options +from distutils.unixccompiler import UnixCCompiler +from distutils.file_util import write_file +from distutils.errors import DistutilsExecError, CompileError, UnknownFileError + +class CygwinCCompiler (UnixCCompiler): + + compiler_type = 'cygwin' + obj_extension = ".o" + static_lib_extension = ".a" + shared_lib_extension = ".dll" + static_lib_format = "lib%s%s" + shared_lib_format = "%s%s" + exe_extension = ".exe" + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + UnixCCompiler.__init__ (self, verbose, dry_run, force) + + (status, details) = check_config_h() + self.debug_print("Python's GCC status: %s (details: %s)" % + (status, details)) + if status is not CONFIG_H_OK: + self.warn( + "Python's pyconfig.h doesn't seem to support your compiler. " + + ("Reason: %s." % details) + + "Compiling may fail because of undefined preprocessor macros.") + + (self.gcc_version, self.ld_version, self.dllwrap_version) = \ + get_versions() + self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" % + (self.gcc_version, + self.ld_version, + self.dllwrap_version) ) + + # ld_version >= "2.10.90" should also be able to use + # gcc -mdll instead of dllwrap + # Older dllwraps had own version numbers, newer ones use the + # same as the rest of binutils ( also ld ) + # dllwrap 2.10.90 is buggy + if self.ld_version >= "2.10.90": + self.linker_dll = "gcc" + else: + self.linker_dll = "dllwrap" + + # Hard-code GCC because that's what this is all about. + # XXX optimization, warnings etc. should be customizable. + self.set_executables(compiler='gcc -mcygwin -O -Wall', + compiler_so='gcc -mcygwin -mdll -O -Wall', + linker_exe='gcc -mcygwin', + linker_so=('%s -mcygwin -mdll -static' % + self.linker_dll)) + + # cygwin and mingw32 need different sets of libraries + if self.gcc_version == "2.91.57": + # cygwin shouldn't need msvcrt, but without the dlls will crash + # (gcc version 2.91.57) -- perhaps something about initialization + self.dll_libraries=["msvcrt"] + self.warn( + "Consider upgrading to a newer version of gcc") + else: + self.dll_libraries=[] + + # __init__ () + + # not much different of the compile method in UnixCCompiler, + # but we have to insert some lines in the middle of it, so + # we put here a adapted version of it. + # (If we would call compile() in the base class, it would do some + # initializations a second time, this is why all is done here.) + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (output_dir, macros, include_dirs) = \ + self._fix_compile_args (output_dir, macros, include_dirs) + (objects, skip_sources) = self._prep_compile (sources, output_dir) + + # Figure out the options for the compiler command line. + pp_opts = gen_preprocess_options (macros, include_dirs) + cc_args = pp_opts + ['-c'] + if debug: + cc_args[:0] = ['-g'] + if extra_preargs: + cc_args[:0] = extra_preargs + if extra_postargs is None: + extra_postargs = [] + + # Compile all source files that weren't eliminated by + # '_prep_compile()'. + for i in range (len (sources)): + src = sources[i] ; obj = objects[i] + ext = (os.path.splitext (src))[1] + if skip_sources[src]: + self.announce ("skipping %s (%s up-to-date)" % (src, obj)) + else: + self.mkpath (os.path.dirname (obj)) + if ext == '.rc' or ext == '.res': + # gcc needs '.res' and '.rc' compiled to object files !!! + try: + self.spawn (["windres","-i",src,"-o",obj]) + except DistutilsExecError, msg: + raise CompileError, msg + else: # for other files use the C-compiler + try: + self.spawn (self.compiler_so + cc_args + + [src, '-o', obj] + + extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + + # Return *all* object filenames, not just the ones we just built. + return objects + + # compile () + + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + + # use separate copies, so we can modify the lists + extra_preargs = copy.copy(extra_preargs or []) + libraries = copy.copy(libraries or []) + objects = copy.copy(objects or []) + + # Additional libraries + libraries.extend(self.dll_libraries) + + # handle export symbols by creating a def-file + # with executables this only works with gcc/ld as linker + if ((export_symbols is not None) and + (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")): + # (The linker doesn't do anything if output is up-to-date. + # So it would probably better to check if we really need this, + # but for this we had to insert some unchanged parts of + # UnixCCompiler, and this is not what we want.) + + # we want to put some files in the same directory as the + # object files are, build_temp doesn't help much + # where are the object files + temp_dir = os.path.dirname(objects[0]) + # name of dll to give the helper files the same base name + (dll_name, dll_extension) = os.path.splitext( + os.path.basename(output_filename)) + + # generate the filenames for these files + def_file = os.path.join(temp_dir, dll_name + ".def") + exp_file = os.path.join(temp_dir, dll_name + ".exp") + lib_file = os.path.join(temp_dir, 'lib' + dll_name + ".a") + + # Generate .def file + contents = [ + "LIBRARY %s" % os.path.basename(output_filename), + "EXPORTS"] + for sym in export_symbols: + contents.append(sym) + self.execute(write_file, (def_file, contents), + "writing %s" % def_file) + + # next add options for def-file and to creating import libraries + + # dllwrap uses different options than gcc/ld + if self.linker_dll == "dllwrap": + extra_preargs.extend([#"--output-exp",exp_file, + "--output-lib",lib_file, + ]) + # for dllwrap we have to use a special option + extra_preargs.extend(["--def", def_file]) + # we use gcc/ld here and can be sure ld is >= 2.9.10 + else: + # doesn't work: bfd_close build\...\libfoo.a: Invalid operation + #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file]) + # for gcc/ld the def-file is specified as any other object files + objects.append(def_file) + + #end: if ((export_symbols is not None) and + # (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")): + + # who wants symbols and a many times larger output file + # should explicitly switch the debug mode on + # otherwise we let dllwrap/ld strip the output file + # (On my machine: 10KB < stripped_file < ??100KB + # unstripped_file = stripped_file + XXX KB + # ( XXX=254 for a typical python extension)) + if not debug: + extra_preargs.append("-s") + + UnixCCompiler.link(self, + target_desc, + objects, + output_filename, + output_dir, + libraries, + library_dirs, + runtime_library_dirs, + None, # export_symbols, we do this in our def-file + debug, + extra_preargs, + extra_postargs, + build_temp) + + # link () + + # -- Miscellaneous methods ----------------------------------------- + + # overwrite the one from CCompiler to support rc and res-files + def object_filenames (self, + source_filenames, + strip_dir=0, + output_dir=''): + if output_dir is None: output_dir = '' + obj_names = [] + for src_name in source_filenames: + # use normcase to make sure '.rc' is really '.rc' and not '.RC' + (base, ext) = os.path.splitext (os.path.normcase(src_name)) + if ext not in (self.src_extensions + ['.rc','.res']): + raise UnknownFileError, \ + "unknown file type '%s' (from '%s')" % \ + (ext, src_name) + if strip_dir: + base = os.path.basename (base) + if ext == '.res' or ext == '.rc': + # these need to be compiled to object files + obj_names.append (os.path.join (output_dir, + base + ext + self.obj_extension)) + else: + obj_names.append (os.path.join (output_dir, + base + self.obj_extension)) + return obj_names + + # object_filenames () + +# class CygwinCCompiler + + +# the same as cygwin plus some additional parameters +class Mingw32CCompiler (CygwinCCompiler): + + compiler_type = 'mingw32' + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + CygwinCCompiler.__init__ (self, verbose, dry_run, force) + + # A real mingw32 doesn't need to specify a different entry point, + # but cygwin 2.91.57 in no-cygwin-mode needs it. + if self.gcc_version <= "2.91.57": + entry_point = '--entry _DllMain at 12' + else: + entry_point = '' + + self.set_executables(compiler='gcc -mno-cygwin -O -Wall', + compiler_so='gcc -mno-cygwin -mdll -O -Wall', + linker_exe='gcc -mno-cygwin', + linker_so='%s -mno-cygwin -mdll -static %s' + % (self.linker_dll, entry_point)) + # Maybe we should also append -mthreads, but then the finished + # dlls need another dll (mingwm10.dll see Mingw32 docs) + # (-mthreads: Support thread-safe exception handling on `Mingw32') + + # no additional libraries needed + self.dll_libraries=[] + + # __init__ () + +# class Mingw32CCompiler + +# Because these compilers aren't configured in Python's pyconfig.h file by +# default, we should at least warn the user if he is using a unmodified +# version. + +CONFIG_H_OK = "ok" +CONFIG_H_NOTOK = "not ok" +CONFIG_H_UNCERTAIN = "uncertain" + +def check_config_h(): + + """Check if the current Python installation (specifically, pyconfig.h) + appears amenable to building extensions with GCC. Returns a tuple + (status, details), where 'status' is one of the following constants: + CONFIG_H_OK + all is well, go ahead and compile + CONFIG_H_NOTOK + doesn't look good + CONFIG_H_UNCERTAIN + not sure -- unable to read pyconfig.h + 'details' is a human-readable string explaining the situation. + + Note there are two ways to conclude "OK": either 'sys.version' contains + the string "GCC" (implying that this Python was built with GCC), or the + installed "pyconfig.h" contains the string "__GNUC__". + """ + + # XXX since this function also checks sys.version, it's not strictly a + # "pyconfig.h" check -- should probably be renamed... + + from distutils import sysconfig + import string + # if sys.version contains GCC then python was compiled with + # GCC, and the pyconfig.h file should be OK + if string.find(sys.version,"GCC") >= 0: + return (CONFIG_H_OK, "sys.version mentions 'GCC'") + + fn = sysconfig.get_config_h_filename() + try: + # It would probably better to read single lines to search. + # But we do this only once, and it is fast enough + f = open(fn) + s = f.read() + f.close() + + except IOError, exc: + # if we can't read this file, we cannot say it is wrong + # the compiler will complain later about this file as missing + return (CONFIG_H_UNCERTAIN, + "couldn't read '%s': %s" % (fn, exc.strerror)) + + else: + # "pyconfig.h" contains an "#ifdef __GNUC__" or something similar + if string.find(s,"__GNUC__") >= 0: + return (CONFIG_H_OK, "'%s' mentions '__GNUC__'" % fn) + else: + return (CONFIG_H_NOTOK, "'%s' does not mention '__GNUC__'" % fn) + + + +def get_versions(): + """ Try to find out the versions of gcc, ld and dllwrap. + If not possible it returns None for it. + """ + from distutils.version import StrictVersion + from distutils.spawn import find_executable + import re + + gcc_exe = find_executable('gcc') + if gcc_exe: + out = os.popen(gcc_exe + ' -dumpversion','r') + out_string = out.read() + out.close() + result = re.search('(\d+\.\d+\.\d+)',out_string) + if result: + gcc_version = StrictVersion(result.group(1)) + else: + gcc_version = None + else: + gcc_version = None + ld_exe = find_executable('ld') + if ld_exe: + out = os.popen(ld_exe + ' -v','r') + out_string = out.read() + out.close() + result = re.search('(\d+\.\d+\.\d+)',out_string) + if result: + ld_version = StrictVersion(result.group(1)) + else: + ld_version = None + else: + ld_version = None + dllwrap_exe = find_executable('dllwrap') + if dllwrap_exe: + out = os.popen(dllwrap_exe + ' --version','r') + out_string = out.read() + out.close() + result = re.search(' (\d+\.\d+\.\d+)',out_string) + if result: + dllwrap_version = StrictVersion(result.group(1)) + else: + dllwrap_version = None + else: + dllwrap_version = None + return (gcc_version, ld_version, dllwrap_version) diff --git a/lib-python/2.2/distutils/dep_util.py b/lib-python/2.2/distutils/dep_util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/dep_util.py @@ -0,0 +1,115 @@ +"""distutils.dep_util + +Utility functions for simple, timestamp-based dependency of files +and groups of files; also, function based entirely on such +timestamp dependency analysis.""" + +# created 2000/04/03, Greg Ward (extracted from util.py) + +__revision__ = "$Id$" + +import os +from distutils.errors import DistutilsFileError + + +def newer (source, target): + """Return true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. Return false if + both exist and 'target' is the same age or younger than 'source'. + Raise DistutilsFileError if 'source' does not exist. + """ + if not os.path.exists(source): + raise DistutilsFileError, "file '%s' does not exist" % source + if not os.path.exists(target): + return 1 + + from stat import ST_MTIME + mtime1 = os.stat(source)[ST_MTIME] + mtime2 = os.stat(target)[ST_MTIME] + + return mtime1 > mtime2 + +# newer () + + +def newer_pairwise (sources, targets): + """Walk two filename lists in parallel, testing if each source is newer + than its corresponding target. Return a pair of lists (sources, + targets) where source is newer than target, according to the semantics + of 'newer()'. + """ + if len(sources) != len(targets): + raise ValueError, "'sources' and 'targets' must be same length" + + # build a pair of lists (sources, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources)): + if newer(sources[i], targets[i]): + n_sources.append(sources[i]) + n_targets.append(targets[i]) + + return (n_sources, n_targets) + +# newer_pairwise () + + +def newer_group (sources, target, missing='error'): + """Return true if 'target' is out-of-date with respect to any file + listed in 'sources'. In other words, if 'target' exists and is newer + than every file in 'sources', return false; otherwise return true. + 'missing' controls what we do when a source file is missing; the + default ("error") is to blow up with an OSError from inside 'stat()'; + if it is "ignore", we silently drop any missing source files; if it is + "newer", any missing source files make us assume that 'target' is + out-of-date (this is handy in "dry-run" mode: it'll make you pretend to + carry out commands that wouldn't work because inputs are missing, but + that doesn't matter because you're not actually going to run the + commands). + """ + # If the target doesn't even exist, then it's definitely out-of-date. + if not os.path.exists(target): + return 1 + + # Otherwise we have to find out the hard way: if *any* source file + # is more recent than 'target', then 'target' is out-of-date and + # we can immediately return true. If we fall through to the end + # of the loop, then 'target' is up-to-date and we return false. + from stat import ST_MTIME + target_mtime = os.stat(target)[ST_MTIME] + for source in sources: + if not os.path.exists(source): + if missing == 'error': # blow up when we stat() the file + pass + elif missing == 'ignore': # missing source dropped from + continue # target's dependency list + elif missing == 'newer': # missing source means target is + return 1 # out-of-date + + source_mtime = os.stat(source)[ST_MTIME] + if source_mtime > target_mtime: + return 1 + else: + return 0 + +# newer_group () + + +# XXX this isn't used anywhere, and worse, it has the same name as a method +# in Command with subtly different semantics. (This one just has one +# source -> one dest; that one has many sources -> one dest.) Nuke it? +def make_file (src, dst, func, args, + verbose=0, update_message=None, noupdate_message=None): + """Makes 'dst' from 'src' (both filenames) by calling 'func' with + 'args', but only if it needs to: i.e. if 'dst' does not exist or 'src' + is newer than 'dst'. + """ + if newer(src, dst): + if verbose and update_message: + print update_message + apply(func, args) + else: + if verbose and noupdate_message: + print noupdate_message + +# make_file () diff --git a/lib-python/2.2/distutils/dir_util.py b/lib-python/2.2/distutils/dir_util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/dir_util.py @@ -0,0 +1,219 @@ +"""distutils.dir_util + +Utility functions for manipulating directories and directory trees.""" + +# created 2000/04/03, Greg Ward (extracted from util.py) + +__revision__ = "$Id$" + +import os +from types import * +from distutils.errors import DistutilsFileError, DistutilsInternalError + + +# cache for by mkpath() -- in addition to cheapening redundant calls, +# eliminates redundant "creating /foo/bar/baz" messages in dry-run mode +_path_created = {} + +# I don't use os.makedirs because a) it's new to Python 1.5.2, and +# b) it blows up if the directory already exists (I want to silently +# succeed in that case). +def mkpath (name, mode=0777, verbose=0, dry_run=0): + """Create a directory and any missing ancestor directories. If the + directory already exists (or if 'name' is the empty string, which + means the current directory, which of course exists), then do + nothing. Raise DistutilsFileError if unable to create some + directory along the way (eg. some sub-path exists, but is a file + rather than a directory). If 'verbose' is true, print a one-line + summary of each mkdir to stdout. Return the list of directories + actually created.""" + + global _path_created + + # Detect a common bug -- name is None + if type(name) is not StringType: + raise DistutilsInternalError, \ + "mkpath: 'name' must be a string (got %s)" % `name` + + # XXX what's the better way to handle verbosity? print as we create + # each directory in the path (the current behaviour), or only announce + # the creation of the whole path? (quite easy to do the latter since + # we're not using a recursive algorithm) + + name = os.path.normpath(name) + created_dirs = [] + if os.path.isdir(name) or name == '': + return created_dirs + if _path_created.get(os.path.abspath(name)): + return created_dirs + + (head, tail) = os.path.split(name) + tails = [tail] # stack of lone dirs to create + + while head and tail and not os.path.isdir(head): + #print "splitting '%s': " % head, + (head, tail) = os.path.split(head) + #print "to ('%s','%s')" % (head, tail) + tails.insert(0, tail) # push next higher dir onto stack + + #print "stack of tails:", tails + + # now 'head' contains the deepest directory that already exists + # (that is, the child of 'head' in 'name' is the highest directory + # that does *not* exist) + for d in tails: + #print "head = %s, d = %s: " % (head, d), + head = os.path.join(head, d) + abs_head = os.path.abspath(head) + + if _path_created.get(abs_head): + continue + + if verbose: + print "creating", head + + if not dry_run: + try: + os.mkdir(head) + created_dirs.append(head) + except OSError, exc: + raise DistutilsFileError, \ + "could not create '%s': %s" % (head, exc[-1]) + + _path_created[abs_head] = 1 + return created_dirs + +# mkpath () + + +def create_tree (base_dir, files, mode=0777, verbose=0, dry_run=0): + + """Create all the empty directories under 'base_dir' needed to + put 'files' there. 'base_dir' is just the a name of a directory + which doesn't necessarily exist yet; 'files' is a list of filenames + to be interpreted relative to 'base_dir'. 'base_dir' + the + directory portion of every file in 'files' will be created if it + doesn't already exist. 'mode', 'verbose' and 'dry_run' flags are as + for 'mkpath()'.""" + + # First get the list of directories to create + need_dir = {} + for file in files: + need_dir[os.path.join(base_dir, os.path.dirname(file))] = 1 + need_dirs = need_dir.keys() + need_dirs.sort() + + # Now create them + for dir in need_dirs: + mkpath(dir, mode, verbose, dry_run) + +# create_tree () + + +def copy_tree (src, dst, + preserve_mode=1, + preserve_times=1, + preserve_symlinks=0, + update=0, + verbose=0, + dry_run=0): + + """Copy an entire directory tree 'src' to a new location 'dst'. Both + 'src' and 'dst' must be directory names. If 'src' is not a + directory, raise DistutilsFileError. If 'dst' does not exist, it is + created with 'mkpath()'. The end result of the copy is that every + file in 'src' is copied to 'dst', and directories under 'src' are + recursively copied to 'dst'. Return the list of files that were + copied or might have been copied, using their output name. The + return value is unaffected by 'update' or 'dry_run': it is simply + the list of all files under 'src', with the names changed to be + under 'dst'. + + 'preserve_mode' and 'preserve_times' are the same as for + 'copy_file'; note that they only apply to regular files, not to + directories. If 'preserve_symlinks' is true, symlinks will be + copied as symlinks (on platforms that support them!); otherwise + (the default), the destination of the symlink will be copied. + 'update' and 'verbose' are the same as for 'copy_file'.""" + + from distutils.file_util import copy_file + + if not dry_run and not os.path.isdir(src): + raise DistutilsFileError, \ + "cannot copy tree '%s': not a directory" % src + try: + names = os.listdir(src) + except os.error, (errno, errstr): + if dry_run: + names = [] + else: + raise DistutilsFileError, \ + "error listing files in '%s': %s" % (src, errstr) + + if not dry_run: + mkpath(dst, verbose=verbose) + + outputs = [] + + for n in names: + src_name = os.path.join(src, n) + dst_name = os.path.join(dst, n) + + if preserve_symlinks and os.path.islink(src_name): + link_dest = os.readlink(src_name) + if verbose: + print "linking %s -> %s" % (dst_name, link_dest) + if not dry_run: + os.symlink(link_dest, dst_name) + outputs.append(dst_name) + + elif os.path.isdir(src_name): + outputs.extend( + copy_tree(src_name, dst_name, + preserve_mode, preserve_times, preserve_symlinks, + update, verbose, dry_run)) + else: + copy_file(src_name, dst_name, + preserve_mode, preserve_times, + update, None, verbose, dry_run) + outputs.append(dst_name) + + return outputs + +# copy_tree () + +# Helper for remove_tree() +def _build_cmdtuple(path, cmdtuples): + for f in os.listdir(path): + real_f = os.path.join(path,f) + if os.path.isdir(real_f) and not os.path.islink(real_f): + _build_cmdtuple(real_f, cmdtuples) + else: + cmdtuples.append((os.remove, real_f)) + cmdtuples.append((os.rmdir, path)) + + +def remove_tree (directory, verbose=0, dry_run=0): + """Recursively remove an entire directory tree. Any errors are ignored + (apart from being reported to stdout if 'verbose' is true). + """ + from distutils.util import grok_environment_error + global _path_created + + if verbose: + print "removing '%s' (and everything under it)" % directory + if dry_run: + return + cmdtuples = [] + _build_cmdtuple(directory, cmdtuples) + for cmd in cmdtuples: + try: + apply(cmd[0], (cmd[1],)) + # remove dir from cache if it's already there + abspath = os.path.abspath(cmd[1]) + if _path_created.has_key(abspath): + del _path_created[abspath] + except (IOError, OSError), exc: + if verbose: + print grok_environment_error( + exc, "error removing %s: " % directory) diff --git a/lib-python/2.2/distutils/dist.py b/lib-python/2.2/distutils/dist.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/dist.py @@ -0,0 +1,1086 @@ +"""distutils.dist + +Provides the Distribution class, which represents the module distribution +being built/installed/distributed. +""" + +# created 2000/04/03, Greg Ward +# (extricated from core.py; actually dates back to the beginning) + +__revision__ = "$Id$" + +import sys, os, string, re +from types import * +from copy import copy + +try: + import warnings +except: + warnings = None + +from distutils.errors import * +from distutils.fancy_getopt import FancyGetopt, translate_longopt +from distutils.util import check_environ, strtobool, rfc822_escape + + +# Regex to define acceptable Distutils command names. This is not *quite* +# the same as a Python NAME -- I don't allow leading underscores. The fact +# that they're very similar is no coincidence; the default naming scheme is +# to look for a Python module named after the command. +command_re = re.compile (r'^[a-zA-Z]([a-zA-Z0-9_]*)$') + + +class Distribution: + """The core of the Distutils. Most of the work hiding behind 'setup' + is really done within a Distribution instance, which farms the work out + to the Distutils commands specified on the command line. + + Setup scripts will almost never instantiate Distribution directly, + unless the 'setup()' function is totally inadequate to their needs. + However, it is conceivable that a setup script might wish to subclass + Distribution for some specialized purpose, and then pass the subclass + to 'setup()' as the 'distclass' keyword argument. If so, it is + necessary to respect the expectations that 'setup' has of Distribution. + See the code for 'setup()', in core.py, for details. + """ + + + # 'global_options' describes the command-line options that may be + # supplied to the setup script prior to any actual commands. + # Eg. "./setup.py -n" or "./setup.py --quiet" both take advantage of + # these global options. This list should be kept to a bare minimum, + # since every global option is also valid as a command option -- and we + # don't want to pollute the commands with too many options that they + # have minimal control over. + global_options = [('verbose', 'v', "run verbosely (default)"), + ('quiet', 'q', "run quietly (turns verbosity off)"), + ('dry-run', 'n', "don't actually do anything"), + ('help', 'h', "show detailed help message"), + ] + + # options that are not propagated to the commands + display_options = [ + ('help-commands', None, + "list all available commands"), + ('name', None, + "print package name"), + ('version', 'V', + "print package version"), + ('fullname', None, + "print -"), + ('author', None, + "print the author's name"), + ('author-email', None, + "print the author's email address"), + ('maintainer', None, + "print the maintainer's name"), + ('maintainer-email', None, + "print the maintainer's email address"), + ('contact', None, + "print the maintainer's name if known, else the author's"), + ('contact-email', None, + "print the maintainer's email address if known, else the author's"), + ('url', None, + "print the URL for this package"), + ('license', None, + "print the license of the package"), + ('licence', None, + "alias for --license"), + ('description', None, + "print the package description"), + ('long-description', None, + "print the long package description"), + ('platforms', None, + "print the list of platforms"), + ('keywords', None, + "print the list of keywords"), + ] + display_option_names = map(lambda x: translate_longopt(x[0]), + display_options) + + # negative options are options that exclude other options + negative_opt = {'quiet': 'verbose'} + + + # -- Creation/initialization methods ------------------------------- + + def __init__ (self, attrs=None): + """Construct a new Distribution instance: initialize all the + attributes of a Distribution, and then use 'attrs' (a dictionary + mapping attribute names to values) to assign some of those + attributes their "real" values. (Any attributes not mentioned in + 'attrs' will be assigned to some null value: 0, None, an empty list + or dictionary, etc.) Most importantly, initialize the + 'command_obj' attribute to the empty dictionary; this will be + filled in with real command objects by 'parse_command_line()'. + """ + + # Default values for our command-line options + self.verbose = 1 + self.dry_run = 0 + self.help = 0 + for attr in self.display_option_names: + setattr(self, attr, 0) + + # Store the distribution meta-data (name, version, author, and so + # forth) in a separate object -- we're getting to have enough + # information here (and enough command-line options) that it's + # worth it. Also delegate 'get_XXX()' methods to the 'metadata' + # object in a sneaky and underhanded (but efficient!) way. + self.metadata = DistributionMetadata() + for basename in self.metadata._METHOD_BASENAMES: + method_name = "get_" + basename + if hasattr(self.metadata, method_name): + setattr(self, method_name, getattr(self.metadata, method_name)) + + # 'cmdclass' maps command names to class objects, so we + # can 1) quickly figure out which class to instantiate when + # we need to create a new command object, and 2) have a way + # for the setup script to override command classes + self.cmdclass = {} + + # 'script_name' and 'script_args' are usually set to sys.argv[0] + # and sys.argv[1:], but they can be overridden when the caller is + # not necessarily a setup script run from the command-line. + self.script_name = None + self.script_args = None + + # 'command_options' is where we store command options between + # parsing them (from config files, the command-line, etc.) and when + # they are actually needed -- ie. when the command in question is + # instantiated. It is a dictionary of dictionaries of 2-tuples: + # command_options = { command_name : { option : (source, value) } } + self.command_options = {} + + # These options are really the business of various commands, rather + # than of the Distribution itself. We provide aliases for them in + # Distribution as a convenience to the developer. + self.packages = None + self.package_dir = None + self.py_modules = None + self.libraries = None + self.headers = None + self.ext_modules = None + self.ext_package = None + self.include_dirs = None + self.extra_path = None + self.scripts = None + self.data_files = None + + # And now initialize bookkeeping stuff that can't be supplied by + # the caller at all. 'command_obj' maps command names to + # Command instances -- that's how we enforce that every command + # class is a singleton. + self.command_obj = {} + + # 'have_run' maps command names to boolean values; it keeps track + # of whether we have actually run a particular command, to make it + # cheap to "run" a command whenever we think we might need to -- if + # it's already been done, no need for expensive filesystem + # operations, we just check the 'have_run' dictionary and carry on. + # It's only safe to query 'have_run' for a command class that has + # been instantiated -- a false value will be inserted when the + # command object is created, and replaced with a true value when + # the command is successfully run. Thus it's probably best to use + # '.get()' rather than a straight lookup. + self.have_run = {} + + # Now we'll use the attrs dictionary (ultimately, keyword args from + # the setup script) to possibly override any or all of these + # distribution options. + + if attrs: + + # Pull out the set of command options and work on them + # specifically. Note that this order guarantees that aliased + # command options will override any supplied redundantly + # through the general options dictionary. + options = attrs.get('options') + if options: + del attrs['options'] + for (command, cmd_options) in options.items(): + opt_dict = self.get_option_dict(command) + for (opt, val) in cmd_options.items(): + opt_dict[opt] = ("setup script", val) + + # Now work on the rest of the attributes. Any attribute that's + # not already defined is invalid! + for (key,val) in attrs.items(): + if hasattr(self.metadata, key): + setattr(self.metadata, key, val) + elif hasattr(self, key): + setattr(self, key, val) + else: + msg = "Unknown distribution option: %s" % repr(key) + if warnings is not None: + warnings.warn(msg) + else: + sys.stderr.write(msg + "\n") + + self.finalize_options() + + # __init__ () + + + def get_option_dict (self, command): + """Get the option dictionary for a given command. If that + command's option dictionary hasn't been created yet, then create it + and return the new dictionary; otherwise, return the existing + option dictionary. + """ + + dict = self.command_options.get(command) + if dict is None: + dict = self.command_options[command] = {} + return dict + + + def dump_option_dicts (self, header=None, commands=None, indent=""): + from pprint import pformat + + if commands is None: # dump all command option dicts + commands = self.command_options.keys() + commands.sort() + + if header is not None: + print indent + header + indent = indent + " " + + if not commands: + print indent + "no commands known yet" + return + + for cmd_name in commands: + opt_dict = self.command_options.get(cmd_name) + if opt_dict is None: + print indent + "no option dict for '%s' command" % cmd_name + else: + print indent + "option dict for '%s' command:" % cmd_name + out = pformat(opt_dict) + for line in string.split(out, "\n"): + print indent + " " + line + + # dump_option_dicts () + + + + # -- Config file finding/parsing methods --------------------------- + + def find_config_files (self): + """Find as many configuration files as should be processed for this + platform, and return a list of filenames in the order in which they + should be parsed. The filenames returned are guaranteed to exist + (modulo nasty race conditions). + + There are three possible config files: distutils.cfg in the + Distutils installation directory (ie. where the top-level + Distutils __inst__.py file lives), a file in the user's home + directory named .pydistutils.cfg on Unix and pydistutils.cfg + on Windows/Mac, and setup.cfg in the current directory. + """ + files = [] + check_environ() + + # Where to look for the system-wide Distutils config file + sys_dir = os.path.dirname(sys.modules['distutils'].__file__) + + # Look for the system config file + sys_file = os.path.join(sys_dir, "distutils.cfg") + if os.path.isfile(sys_file): + files.append(sys_file) + + # What to call the per-user config file + if os.name == 'posix': + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + + # And look for the user config file + if os.environ.has_key('HOME'): + user_file = os.path.join(os.environ.get('HOME'), user_filename) + if os.path.isfile(user_file): + files.append(user_file) + + # All platforms support local setup.cfg + local_file = "setup.cfg" + if os.path.isfile(local_file): + files.append(local_file) + + return files + + # find_config_files () + + + def parse_config_files (self, filenames=None): + + from ConfigParser import ConfigParser + from distutils.core import DEBUG + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: print "Distribution.parse_config_files():" + + parser = ConfigParser() + for filename in filenames: + if DEBUG: print " reading", filename + parser.read(filename) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__': + val = parser.get(section,opt) + opt = string.replace(opt, '-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) -- gag, + # retch, puke -- another good reason for a distutils- + # specific config parser (sigh...) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if self.command_options.has_key('global'): + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + except ValueError, msg: + raise DistutilsOptionError, msg + + # parse_config_files () + + + # -- Command-line parsing methods ---------------------------------- + + def parse_command_line (self): + """Parse the setup script's command line, taken from the + 'script_args' instance attribute (which defaults to 'sys.argv[1:]' + -- see 'setup()' in core.py). This list is first processed for + "global options" -- options that set attributes of the Distribution + instance. Then, it is alternately scanned for Distutils commands + and options for that command. Each new command terminates the + options for the previous command. The allowed options for a + command are determined by the 'user_options' attribute of the + command class -- thus, we have to be able to load command classes + in order to parse the command line. Any error in that 'options' + attribute raises DistutilsGetoptError; any error on the + command-line raises DistutilsArgError. If no Distutils commands + were found on the command line, raises DistutilsArgError. Return + true if command-line was successfully parsed and we should carry + on with executing commands; false if no errors but we shouldn't + execute commands (currently, this only happens if user asks for + help). + """ + # + # We now have enough information to show the Macintosh dialog + # that allows the user to interactively specify the "command line". + # + if sys.platform == 'mac': + import EasyDialogs + cmdlist = self.get_command_list() + self.script_args = EasyDialogs.GetArgv( + self.global_options + self.display_options, cmdlist) + + # We have to parse the command line a bit at a time -- global + # options, then the first command, then its options, and so on -- + # because each command will be handled by a different class, and + # the options that are valid for a particular class aren't known + # until we have loaded the command class, which doesn't happen + # until we know what the command is. + + self.commands = [] + parser = FancyGetopt(self.global_options + self.display_options) + parser.set_negative_aliases(self.negative_opt) + parser.set_aliases({'licence': 'license'}) + args = parser.getopt(args=self.script_args, object=self) + option_order = parser.get_option_order() + + # for display options we return immediately + if self.handle_display_options(option_order): + return + + while args: + args = self._parse_command_opts(parser, args) + if args is None: # user asked for help (and got it) + return + + # Handle the cases of --help as a "global" option, ie. + # "setup.py --help" and "setup.py --help command ...". For the + # former, we show global options (--verbose, --dry-run, etc.) + # and display-only options (--name, --version, etc.); for the + # latter, we omit the display-only options and show help for + # each command listed on the command line. + if self.help: + self._show_help(parser, + display_options=len(self.commands) == 0, + commands=self.commands) + return + + # Oops, no commands found -- an end-user error + if not self.commands: + raise DistutilsArgError, "no commands supplied" + + # All is well: return true + return 1 + + # parse_command_line() + + def _parse_command_opts (self, parser, args): + """Parse the command-line options for a single command. + 'parser' must be a FancyGetopt instance; 'args' must be the list + of arguments, starting with the current command (whose options + we are about to parse). Returns a new version of 'args' with + the next command at the front of the list; will be the empty + list if there are no more commands on the command line. Returns + None if the user asked for help on this command. + """ + # late import because of mutual dependence between these modules + from distutils.cmd import Command + + # Pull the current command from the head of the command line + command = args[0] + if not command_re.match(command): + raise SystemExit, "invalid command name '%s'" % command + self.commands.append(command) + + # Dig up the command class that implements this command, so we + # 1) know that it's a valid command, and 2) know which options + # it takes. + try: + cmd_class = self.get_command_class(command) + except DistutilsModuleError, msg: + raise DistutilsArgError, msg + + # Require that the command class be derived from Command -- want + # to be sure that the basic "command" interface is implemented. + if not issubclass(cmd_class, Command): + raise DistutilsClassError, \ + "command class %s must subclass Command" % cmd_class + + # Also make sure that the command object provides a list of its + # known options. + if not (hasattr(cmd_class, 'user_options') and + type(cmd_class.user_options) is ListType): + raise DistutilsClassError, \ + ("command class %s must provide " + + "'user_options' attribute (a list of tuples)") % \ + cmd_class + + # If the command class has a list of negative alias options, + # merge it in with the global negative aliases. + negative_opt = self.negative_opt + if hasattr(cmd_class, 'negative_opt'): + negative_opt = copy(negative_opt) + negative_opt.update(cmd_class.negative_opt) + + # Check for help_options in command class. They have a different + # format (tuple of four) so we need to preprocess them here. + if (hasattr(cmd_class, 'help_options') and + type(cmd_class.help_options) is ListType): + help_options = fix_help_options(cmd_class.help_options) + else: + help_options = [] + + + # All commands support the global options too, just by adding + # in 'global_options'. + parser.set_option_table(self.global_options + + cmd_class.user_options + + help_options) + parser.set_negative_aliases(negative_opt) + (args, opts) = parser.getopt(args[1:]) + if hasattr(opts, 'help') and opts.help: + self._show_help(parser, display_options=0, commands=[cmd_class]) + return + + if (hasattr(cmd_class, 'help_options') and + type(cmd_class.help_options) is ListType): + help_option_found=0 + for (help_option, short, desc, func) in cmd_class.help_options: + if hasattr(opts, parser.get_attr_name(help_option)): + help_option_found=1 + #print "showing help for option %s of command %s" % \ + # (help_option[0],cmd_class) + + if callable(func): + func() + else: + raise DistutilsClassError( + "invalid help function %s for help option '%s': " + "must be a callable object (function, etc.)" + % (`func`, help_option)) + + if help_option_found: + return + + # Put the options from the command-line into their official + # holding pen, the 'command_options' dictionary. + opt_dict = self.get_option_dict(command) + for (name, value) in vars(opts).items(): + opt_dict[name] = ("command line", value) + + return args + + # _parse_command_opts () + + + def finalize_options (self): + """Set final values for all the options on the Distribution + instance, analogous to the .finalize_options() method of Command + objects. + """ + + keywords = self.metadata.keywords + if keywords is not None: + if type(keywords) is StringType: + keywordlist = string.split(keywords, ',') + self.metadata.keywords = map(string.strip, keywordlist) + + platforms = self.metadata.platforms + if platforms is not None: + if type(platforms) is StringType: + platformlist = string.split(platforms, ',') + self.metadata.platforms = map(string.strip, platformlist) + + def _show_help (self, + parser, + global_options=1, + display_options=1, + commands=[]): + """Show help for the setup script command-line in the form of + several lists of command-line options. 'parser' should be a + FancyGetopt instance; do not expect it to be returned in the + same state, as its option table will be reset to make it + generate the correct help text. + + If 'global_options' is true, lists the global options: + --verbose, --dry-run, etc. If 'display_options' is true, lists + the "display-only" options: --name, --version, etc. Finally, + lists per-command help for every command name or command class + in 'commands'. + """ + # late import because of mutual dependence between these modules + from distutils.core import gen_usage + from distutils.cmd import Command + + if global_options: + parser.set_option_table(self.global_options) + parser.print_help("Global options:") + print + + if display_options: + parser.set_option_table(self.display_options) + parser.print_help( + "Information display options (just display " + + "information, ignore any commands)") + print + + for command in self.commands: + if type(command) is ClassType and issubclass(command, Command): + klass = command + else: + klass = self.get_command_class(command) + if (hasattr(klass, 'help_options') and + type(klass.help_options) is ListType): + parser.set_option_table(klass.user_options + + fix_help_options(klass.help_options)) + else: + parser.set_option_table(klass.user_options) + parser.print_help("Options for '%s' command:" % klass.__name__) + print + + print gen_usage(self.script_name) + return + + # _show_help () + + + def handle_display_options (self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + from distutils.core import gen_usage + + # User just wants a list of commands -- we'll print it out and stop + # processing now (ie. if they ran "setup --help-commands foo bar", + # we ignore "foo bar"). + if self.help_commands: + self.print_commands() + print + print gen_usage(self.script_name) + return 1 + + # If user supplied any of the "display metadata" options, then + # display that metadata in the order in which the user supplied the + # metadata options. + any_display_options = 0 + is_display_option = {} + for option in self.display_options: + is_display_option[option[0]] = 1 + + for (opt, val) in option_order: + if val and is_display_option.get(opt): + opt = translate_longopt(opt) + value = getattr(self.metadata, "get_"+opt)() + if opt in ['keywords', 'platforms']: + print string.join(value, ',') + else: + print value + any_display_options = 1 + + return any_display_options + + # handle_display_options() + + def print_command_list (self, commands, header, max_length): + """Print a subset of the list of all commands -- used by + 'print_commands()'. + """ + + print header + ":" + + for cmd in commands: + klass = self.cmdclass.get(cmd) + if not klass: + klass = self.get_command_class(cmd) + try: + description = klass.description + except AttributeError: + description = "(no description available)" + + print " %-*s %s" % (max_length, cmd, description) + + # print_command_list () + + + def print_commands (self): + """Print out a help message listing all available commands with a + description of each. The list is divided into "standard commands" + (listed in distutils.command.__all__) and "extra commands" + (mentioned in self.cmdclass, but not a standard command). The + descriptions come from the command class attribute + 'description'. + """ + + import distutils.command + std_commands = distutils.command.__all__ + is_std = {} + for cmd in std_commands: + is_std[cmd] = 1 + + extra_commands = [] + for cmd in self.cmdclass.keys(): + if not is_std.get(cmd): + extra_commands.append(cmd) + + max_length = 0 + for cmd in (std_commands + extra_commands): + if len(cmd) > max_length: + max_length = len(cmd) + + self.print_command_list(std_commands, + "Standard commands", + max_length) + if extra_commands: + print + self.print_command_list(extra_commands, + "Extra commands", + max_length) + + # print_commands () + + def get_command_list (self): + """Get a list of (command, description) tuples. + The list is divided into "standard commands" (listed in + distutils.command.__all__) and "extra commands" (mentioned in + self.cmdclass, but not a standard command). The descriptions come + from the command class attribute 'description'. + """ + # Currently this is only used on Mac OS, for the Mac-only GUI + # Distutils interface (by Jack Jansen) + + import distutils.command + std_commands = distutils.command.__all__ + is_std = {} + for cmd in std_commands: + is_std[cmd] = 1 + + extra_commands = [] + for cmd in self.cmdclass.keys(): + if not is_std.get(cmd): + extra_commands.append(cmd) + + rv = [] + for cmd in (std_commands + extra_commands): + klass = self.cmdclass.get(cmd) + if not klass: + klass = self.get_command_class(cmd) + try: + description = klass.description + except AttributeError: + description = "(no description available)" + rv.append((cmd, description)) + return rv + + # -- Command class/object methods ---------------------------------- + + def get_command_class (self, command): + """Return the class that implements the Distutils command named by + 'command'. First we check the 'cmdclass' dictionary; if the + command is mentioned there, we fetch the class object from the + dictionary and return it. Otherwise we load the command module + ("distutils.command." + command) and fetch the command class from + the module. The loaded class is also stored in 'cmdclass' + to speed future calls to 'get_command_class()'. + + Raises DistutilsModuleError if the expected module could not be + found, or if that module does not define the expected class. + """ + klass = self.cmdclass.get(command) + if klass: + return klass + + module_name = 'distutils.command.' + command + klass_name = command + + try: + __import__ (module_name) + module = sys.modules[module_name] + except ImportError: + raise DistutilsModuleError, \ + "invalid command '%s' (no module named '%s')" % \ + (command, module_name) + + try: + klass = getattr(module, klass_name) + except AttributeError: + raise DistutilsModuleError, \ + "invalid command '%s' (no class '%s' in module '%s')" \ + % (command, klass_name, module_name) + + self.cmdclass[command] = klass + return klass + + # get_command_class () + + def get_command_obj (self, command, create=1): + """Return the command object for 'command'. Normally this object + is cached on a previous call to 'get_command_obj()'; if no command + object for 'command' is in the cache, then we either create and + return it (if 'create' is true) or return None. + """ + from distutils.core import DEBUG + cmd_obj = self.command_obj.get(command) + if not cmd_obj and create: + if DEBUG: + print "Distribution.get_command_obj(): " \ + "creating '%s' command object" % command + + klass = self.get_command_class(command) + cmd_obj = self.command_obj[command] = klass(self) + self.have_run[command] = 0 + + # Set any options that were supplied in config files + # or on the command line. (NB. support for error + # reporting is lame here: any errors aren't reported + # until 'finalize_options()' is called, which means + # we won't report the source of the error.) + options = self.command_options.get(command) + if options: + self._set_command_options(cmd_obj, options) + + return cmd_obj + + def _set_command_options (self, command_obj, option_dict=None): + """Set the options for 'command_obj' from 'option_dict'. Basically + this means copying elements of a dictionary ('option_dict') to + attributes of an instance ('command'). + + 'command_obj' must be a Command instance. If 'option_dict' is not + supplied, uses the standard option dictionary for this command + (from 'self.command_options'). + """ + from distutils.core import DEBUG + + command_name = command_obj.get_command_name() + if option_dict is None: + option_dict = self.get_option_dict(command_name) + + if DEBUG: print " setting options for '%s' command:" % command_name + for (option, (source, value)) in option_dict.items(): + if DEBUG: print " %s = %s (from %s)" % (option, value, source) + try: + bool_opts = map(translate_longopt, command_obj.boolean_options) + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + is_string = type(value) is StringType + if neg_opt.has_key(option) and is_string: + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts and is_string: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError, \ + ("error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError, msg: + raise DistutilsOptionError, msg + + def reinitialize_command (self, command, reinit_subcommands=0): + """Reinitializes a command to the state it was in when first + returned by 'get_command_obj()': ie., initialized but not yet + finalized. This provides the opportunity to sneak option + values in programmatically, overriding or supplementing + user-supplied values from the config files and command line. + You'll have to re-finalize the command object (by calling + 'finalize_options()' or 'ensure_finalized()') before using it for + real. + + 'command' should be a command name (string) or command object. If + 'reinit_subcommands' is true, also reinitializes the command's + sub-commands, as declared by the 'sub_commands' class attribute (if + it has one). See the "install" command for an example. Only + reinitializes the sub-commands that actually matter, ie. those + whose test predicates return true. + + Returns the reinitialized command object. + """ + from distutils.cmd import Command + if not isinstance(command, Command): + command_name = command + command = self.get_command_obj(command_name) + else: + command_name = command.get_command_name() + + if not command.finalized: + return command + command.initialize_options() + command.finalized = 0 + self.have_run[command_name] = 0 + self._set_command_options(command) + + if reinit_subcommands: + for sub in command.get_sub_commands(): + self.reinitialize_command(sub, reinit_subcommands) + + return command + + + # -- Methods that operate on the Distribution ---------------------- + + def announce (self, msg, level=1): + """Print 'msg' if 'level' is greater than or equal to the verbosity + level recorded in the 'verbose' attribute (which, currently, can be + only 0 or 1). + """ + if self.verbose >= level: + print msg + + + def run_commands (self): + """Run each command that was seen on the setup script command line. + Uses the list of commands found and cache of command objects + created by 'get_command_obj()'. + """ + for cmd in self.commands: + self.run_command(cmd) + + + # -- Methods that operate on its Commands -------------------------- + + def run_command (self, command): + """Do whatever it takes to run a command (including nothing at all, + if the command has already been run). Specifically: if we have + already created and run the command named by 'command', return + silently without doing anything. If the command named by 'command' + doesn't even have a command object yet, create one. Then invoke + 'run()' on that command object (or an existing one). + """ + # Already been here, done that? then return silently. + if self.have_run.get(command): + return + + self.announce("running " + command) + cmd_obj = self.get_command_obj(command) + cmd_obj.ensure_finalized() + cmd_obj.run() + self.have_run[command] = 1 + + + # -- Distribution query methods ------------------------------------ + + def has_pure_modules (self): + return len(self.packages or self.py_modules or []) > 0 + + def has_ext_modules (self): + return self.ext_modules and len(self.ext_modules) > 0 + + def has_c_libraries (self): + return self.libraries and len(self.libraries) > 0 + + def has_modules (self): + return self.has_pure_modules() or self.has_ext_modules() + + def has_headers (self): + return self.headers and len(self.headers) > 0 + + def has_scripts (self): + return self.scripts and len(self.scripts) > 0 + + def has_data_files (self): + return self.data_files and len(self.data_files) > 0 + + def is_pure (self): + return (self.has_pure_modules() and + not self.has_ext_modules() and + not self.has_c_libraries()) + + # -- Metadata query methods ---------------------------------------- + + # If you're looking for 'get_name()', 'get_version()', and so forth, + # they are defined in a sneaky way: the constructor binds self.get_XXX + # to self.metadata.get_XXX. The actual code is in the + # DistributionMetadata class, below. + +# class Distribution + + +class DistributionMetadata: + """Dummy class to hold the distribution meta-data: name, version, + author, and so forth. + """ + + _METHOD_BASENAMES = ("name", "version", "author", "author_email", + "maintainer", "maintainer_email", "url", + "license", "description", "long_description", + "keywords", "platforms", "fullname", "contact", + "contact_email", "licence") + + def __init__ (self): + self.name = None + self.version = None + self.author = None + self.author_email = None + self.maintainer = None + self.maintainer_email = None + self.url = None + self.license = None + self.description = None + self.long_description = None + self.keywords = None + self.platforms = None + + def write_pkg_info (self, base_dir): + """Write the PKG-INFO file into the release tree. + """ + + pkg_info = open( os.path.join(base_dir, 'PKG-INFO'), 'w') + + pkg_info.write('Metadata-Version: 1.0\n') + pkg_info.write('Name: %s\n' % self.get_name() ) + pkg_info.write('Version: %s\n' % self.get_version() ) + pkg_info.write('Summary: %s\n' % self.get_description() ) + pkg_info.write('Home-page: %s\n' % self.get_url() ) + pkg_info.write('Author: %s\n' % self.get_contact() ) + pkg_info.write('Author-email: %s\n' % self.get_contact_email() ) + pkg_info.write('License: %s\n' % self.get_license() ) + + long_desc = rfc822_escape( self.get_long_description() ) + pkg_info.write('Description: %s\n' % long_desc) + + keywords = string.join( self.get_keywords(), ',') + if keywords: + pkg_info.write('Keywords: %s\n' % keywords ) + + for platform in self.get_platforms(): + pkg_info.write('Platform: %s\n' % platform ) + + pkg_info.close() + + # write_pkg_info () + + # -- Metadata query methods ---------------------------------------- + + def get_name (self): + return self.name or "UNKNOWN" + + def get_version(self): + return self.version or "0.0.0" + + def get_fullname (self): + return "%s-%s" % (self.get_name(), self.get_version()) + + def get_author(self): + return self.author or "UNKNOWN" + + def get_author_email(self): + return self.author_email or "UNKNOWN" + + def get_maintainer(self): + return self.maintainer or "UNKNOWN" + + def get_maintainer_email(self): + return self.maintainer_email or "UNKNOWN" + + def get_contact(self): + return (self.maintainer or + self.author or + "UNKNOWN") + + def get_contact_email(self): + return (self.maintainer_email or + self.author_email or + "UNKNOWN") + + def get_url(self): + return self.url or "UNKNOWN" + + def get_license(self): + return self.license or "UNKNOWN" + get_licence = get_license + + def get_description(self): + return self.description or "UNKNOWN" + + def get_long_description(self): + return self.long_description or "UNKNOWN" + + def get_keywords(self): + return self.keywords or [] + + def get_platforms(self): + return self.platforms or ["UNKNOWN"] + +# class DistributionMetadata + + +def fix_help_options (options): + """Convert a 4-tuple 'help_options' list as found in various command + classes to the 3-tuple form required by FancyGetopt. + """ + new_options = [] + for help_tuple in options: + new_options.append(help_tuple[0:3]) + return new_options + + +if __name__ == "__main__": + dist = Distribution() + print "ok" diff --git a/lib-python/2.2/distutils/errors.py b/lib-python/2.2/distutils/errors.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/errors.py @@ -0,0 +1,99 @@ +"""distutils.errors + +Provides exceptions used by the Distutils modules. Note that Distutils +modules may raise standard exceptions; in particular, SystemExit is +usually raised for errors that are obviously the end-user's fault +(eg. bad command-line arguments). + +This module safe to use in "from ... import *" mode; it only exports +symbols whose names start with "Distutils" and end with "Error".""" + +# created 1999/03/03, Greg Ward + +__revision__ = "$Id$" + +class DistutilsError (Exception): + """The root of all Distutils evil.""" + pass + +class DistutilsModuleError (DistutilsError): + """Unable to load an expected module, or to find an expected class + within some module (in particular, command modules and classes).""" + pass + +class DistutilsClassError (DistutilsError): + """Some command class (or possibly distribution class, if anyone + feels a need to subclass Distribution) is found not to be holding + up its end of the bargain, ie. implementing some part of the + "command "interface.""" + pass + +class DistutilsGetoptError (DistutilsError): + """The option table provided to 'fancy_getopt()' is bogus.""" + pass + +class DistutilsArgError (DistutilsError): + """Raised by fancy_getopt in response to getopt.error -- ie. an + error in the command line usage.""" + pass + +class DistutilsFileError (DistutilsError): + """Any problems in the filesystem: expected file not found, etc. + Typically this is for problems that we detect before IOError or + OSError could be raised.""" + pass + +class DistutilsOptionError (DistutilsError): + """Syntactic/semantic errors in command options, such as use of + mutually conflicting options, or inconsistent options, + badly-spelled values, etc. No distinction is made between option + values originating in the setup script, the command line, config + files, or what-have-you -- but if we *know* something originated in + the setup script, we'll raise DistutilsSetupError instead.""" + pass + +class DistutilsSetupError (DistutilsError): + """For errors that can be definitely blamed on the setup script, + such as invalid keyword arguments to 'setup()'.""" + pass + +class DistutilsPlatformError (DistutilsError): + """We don't know how to do something on the current platform (but + we do know how to do it on some platform) -- eg. trying to compile + C files on a platform not supported by a CCompiler subclass.""" + pass + +class DistutilsExecError (DistutilsError): + """Any problems executing an external program (such as the C + compiler, when compiling C files).""" + pass + +class DistutilsInternalError (DistutilsError): + """Internal inconsistencies or impossibilities (obviously, this + should never be seen if the code is working!).""" + pass + +class DistutilsTemplateError (DistutilsError): + """Syntax error in a file list template.""" + + +# Exception classes used by the CCompiler implementation classes +class CCompilerError (Exception): + """Some compile/link operation failed.""" + +class PreprocessError (CCompilerError): + """Failure to preprocess one or more C/C++ files.""" + +class CompileError (CCompilerError): + """Failure to compile one or more C/C++ source files.""" + +class LibError (CCompilerError): + """Failure to create a static library from one or more C/C++ object + files.""" + +class LinkError (CCompilerError): + """Failure to link one or more C/C++ object files into an executable + or shared library file.""" + +class UnknownFileError (CCompilerError): + """Attempt to process an unknown file type.""" diff --git a/lib-python/2.2/distutils/extension.py b/lib-python/2.2/distutils/extension.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/extension.py @@ -0,0 +1,231 @@ +"""distutils.extension + +Provides the Extension class, used to describe C/C++ extension +modules in setup scripts.""" + +# created 2000/05/30, Greg Ward + +__revision__ = "$Id$" + +import os, string, sys +from types import * + +try: + import warnings +except ImportError: + warnings = None + +# This class is really only used by the "build_ext" command, so it might +# make sense to put it in distutils.command.build_ext. However, that +# module is already big enough, and I want to make this class a bit more +# complex to simplify some common cases ("foo" module in "foo.c") and do +# better error-checking ("foo.c" actually exists). +# +# Also, putting this in build_ext.py means every setup script would have to +# import that large-ish module (indirectly, through distutils.core) in +# order to do anything. + +class Extension: + """Just a collection of attributes that describes an extension + module and everything needed to build it (hopefully in a portable + way, but there are hooks that let you be as unportable as you need). + + Instance attributes: + name : string + the full name of the extension, including any packages -- ie. + *not* a filename or pathname, but Python dotted name + sources : [string] + list of source filenames, relative to the distribution root + (where the setup script lives), in Unix form (slash-separated) + for portability. Source files may be C, C++, SWIG (.i), + platform-specific resource files, or whatever else is recognized + by the "build_ext" command as source for a Python extension. + include_dirs : [string] + list of directories to search for C/C++ header files (in Unix + form for portability) + define_macros : [(name : string, value : string|None)] + list of macros to define; each macro is defined using a 2-tuple, + where 'value' is either the string to define it to or None to + define it without a particular value (equivalent of "#define + FOO" in source or -DFOO on Unix C compiler command line) + undef_macros : [string] + list of macros to undefine explicitly + library_dirs : [string] + list of directories to search for C/C++ libraries at link time + libraries : [string] + list of library names (not filenames or paths) to link against + runtime_library_dirs : [string] + list of directories to search for C/C++ libraries at run time + (for shared extensions, this is when the extension is loaded) + extra_objects : [string] + list of extra files to link with (eg. object files not implied + by 'sources', static library that must be explicitly specified, + binary resource files, etc.) + extra_compile_args : [string] + any extra platform- and compiler-specific information to use + when compiling the source files in 'sources'. For platforms and + compilers where "command line" makes sense, this is typically a + list of command-line arguments, but for other platforms it could + be anything. + extra_link_args : [string] + any extra platform- and compiler-specific information to use + when linking object files together to create the extension (or + to create a new static Python interpreter). Similar + interpretation as for 'extra_compile_args'. + export_symbols : [string] + list of symbols to be exported from a shared extension. Not + used on all platforms, and not generally necessary for Python + extensions, which typically export exactly one symbol: "init" + + extension_name. + """ + + def __init__ (self, name, sources, + include_dirs=None, + define_macros=None, + undef_macros=None, + library_dirs=None, + libraries=None, + runtime_library_dirs=None, + extra_objects=None, + extra_compile_args=None, + extra_link_args=None, + export_symbols=None, + **kw # To catch unknown keywords + ): + + assert type(name) is StringType, "'name' must be a string" + assert (type(sources) is ListType and + map(type, sources) == [StringType]*len(sources)), \ + "'sources' must be a list of strings" + + self.name = name + self.sources = sources + self.include_dirs = include_dirs or [] + self.define_macros = define_macros or [] + self.undef_macros = undef_macros or [] + self.library_dirs = library_dirs or [] + self.libraries = libraries or [] + self.runtime_library_dirs = runtime_library_dirs or [] + self.extra_objects = extra_objects or [] + self.extra_compile_args = extra_compile_args or [] + self.extra_link_args = extra_link_args or [] + self.export_symbols = export_symbols or [] + + # If there are unknown keyword options, warn about them + if len(kw): + L = kw.keys() ; L.sort() + L = map(repr, L) + msg = "Unknown Extension options: " + string.join(L, ', ') + if warnings is not None: + warnings.warn(msg) + else: + sys.stderr.write(msg + '\n') +# class Extension + + +def read_setup_file (filename): + from distutils.sysconfig import \ + parse_makefile, expand_makefile_vars, _variable_rx + from distutils.text_file import TextFile + from distutils.util import split_quoted + + # First pass over the file to gather "VAR = VALUE" assignments. + vars = parse_makefile(filename) + + # Second pass to gobble up the real content: lines of the form + # ... [ ...] [ ...] [ ...] + file = TextFile(filename, + strip_comments=1, skip_blanks=1, join_lines=1, + lstrip_ws=1, rstrip_ws=1) + extensions = [] + + while 1: + line = file.readline() + if line is None: # eof + break + if _variable_rx.match(line): # VAR=VALUE, handled in first pass + continue + + if line[0] == line[-1] == "*": + file.warn("'%s' lines not handled yet" % line) + continue + + #print "original line: " + line + line = expand_makefile_vars(line, vars) + words = split_quoted(line) + #print "expanded line: " + line + + # NB. this parses a slightly different syntax than the old + # makesetup script: here, there must be exactly one extension per + # line, and it must be the first word of the line. I have no idea + # why the old syntax supported multiple extensions per line, as + # they all wind up being the same. + + module = words[0] + ext = Extension(module, []) + append_next_word = None + + for word in words[1:]: + if append_next_word is not None: + append_next_word.append(word) + append_next_word = None + continue + + suffix = os.path.splitext(word)[1] + switch = word[0:2] ; value = word[2:] + + if suffix in (".c", ".cc", ".cpp", ".cxx", ".c++", ".m", ".mm"): + # hmm, should we do something about C vs. C++ sources? + # or leave it up to the CCompiler implementation to + # worry about? + ext.sources.append(word) + elif switch == "-I": + ext.include_dirs.append(value) + elif switch == "-D": + equals = string.find(value, "=") + if equals == -1: # bare "-DFOO" -- no value + ext.define_macros.append((value, None)) + else: # "-DFOO=blah" + ext.define_macros.append((value[0:equals], + value[equals+2:])) + elif switch == "-U": + ext.undef_macros.append(value) + elif switch == "-C": # only here 'cause makesetup has it! + ext.extra_compile_args.append(word) + elif switch == "-l": + ext.libraries.append(value) + elif switch == "-L": + ext.library_dirs.append(value) + elif switch == "-R": + ext.runtime_library_dirs.append(value) + elif word == "-rpath": + append_next_word = ext.runtime_library_dirs + elif word == "-Xlinker": + append_next_word = ext.extra_link_args + elif switch == "-u": + ext.extra_link_args.append(word) + if not value: + append_next_word = ext.extra_link_args + elif suffix in (".a", ".so", ".sl", ".o"): + # NB. a really faithful emulation of makesetup would + # append a .o file to extra_objects only if it + # had a slash in it; otherwise, it would s/.o/.c/ + # and append it to sources. Hmmmm. + ext.extra_objects.append(word) + else: + file.warn("unrecognized argument '%s'" % word) + + extensions.append(ext) + + #print "module:", module + #print "source files:", source_files + #print "cpp args:", cpp_args + #print "lib args:", library_args + + #extensions[module] = { 'sources': source_files, + # 'cpp_args': cpp_args, + # 'lib_args': library_args } + + return extensions + +# read_setup_file () diff --git a/lib-python/2.2/distutils/fancy_getopt.py b/lib-python/2.2/distutils/fancy_getopt.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/fancy_getopt.py @@ -0,0 +1,504 @@ +"""distutils.fancy_getopt + +Wrapper around the standard getopt module that provides the following +additional features: + * short and long options are tied together + * options have help strings, so fancy_getopt could potentially + create a complete usage summary + * options set attributes of a passed-in object +""" + +# created 1999/03/03, Greg Ward + +__revision__ = "$Id$" + +import sys, string, re +from types import * +import getopt +from distutils.errors import * + +# Much like command_re in distutils.core, this is close to but not quite +# the same as a Python NAME -- except, in the spirit of most GNU +# utilities, we use '-' in place of '_'. (The spirit of LISP lives on!) +# The similarities to NAME are again not a coincidence... +longopt_pat = r'[a-zA-Z](?:[a-zA-Z0-9-]*)' +longopt_re = re.compile(r'^%s$' % longopt_pat) + +# For recognizing "negative alias" options, eg. "quiet=!verbose" +neg_alias_re = re.compile("^(%s)=!(%s)$" % (longopt_pat, longopt_pat)) + +# This is used to translate long options to legitimate Python identifiers +# (for use as attributes of some object). +longopt_xlate = string.maketrans('-', '_') + +# This records (option, value) pairs in the order seen on the command line; +# it's close to what getopt.getopt() returns, but with short options +# expanded. (Ugh, this module should be OO-ified.) +_option_order = None + + +class FancyGetopt: + """Wrapper around the standard 'getopt()' module that provides some + handy extra functionality: + * short and long options are tied together + * options have help strings, and help text can be assembled + from them + * options set attributes of a passed-in object + * boolean options can have "negative aliases" -- eg. if + --quiet is the "negative alias" of --verbose, then "--quiet" + on the command line sets 'verbose' to false + """ + + def __init__ (self, option_table=None): + + # The option table is (currently) a list of 3-tuples: + # (long_option, short_option, help_string) + # if an option takes an argument, its long_option should have '=' + # appended; short_option should just be a single character, no ':' + # in any case. If a long_option doesn't have a corresponding + # short_option, short_option should be None. All option tuples + # must have long options. + self.option_table = option_table + + # 'option_index' maps long option names to entries in the option + # table (ie. those 3-tuples). + self.option_index = {} + if self.option_table: + self._build_index() + + # 'alias' records (duh) alias options; {'foo': 'bar'} means + # --foo is an alias for --bar + self.alias = {} + + # 'negative_alias' keeps track of options that are the boolean + # opposite of some other option + self.negative_alias = {} + + # These keep track of the information in the option table. We + # don't actually populate these structures until we're ready to + # parse the command-line, since the 'option_table' passed in here + # isn't necessarily the final word. + self.short_opts = [] + self.long_opts = [] + self.short2long = {} + self.attr_name = {} + self.takes_arg = {} + + # And 'option_order' is filled up in 'getopt()'; it records the + # original order of options (and their values) on the command-line, + # but expands short options, converts aliases, etc. + self.option_order = [] + + # __init__ () + + + def _build_index (self): + self.option_index.clear() + for option in self.option_table: + self.option_index[option[0]] = option + + def set_option_table (self, option_table): + self.option_table = option_table + self._build_index() + + def add_option (self, long_option, short_option=None, help_string=None): + if self.option_index.has_key(long_option): + raise DistutilsGetoptError, \ + "option conflict: already an option '%s'" % long_option + else: + option = (long_option, short_option, help_string) + self.option_table.append(option) + self.option_index[long_option] = option + + + def has_option (self, long_option): + """Return true if the option table for this parser has an + option with long name 'long_option'.""" + return self.option_index.has_key(long_option) + + def get_attr_name (self, long_option): + """Translate long option name 'long_option' to the form it + has as an attribute of some object: ie., translate hyphens + to underscores.""" + return string.translate(long_option, longopt_xlate) + + + def _check_alias_dict (self, aliases, what): + assert type(aliases) is DictionaryType + for (alias, opt) in aliases.items(): + if not self.option_index.has_key(alias): + raise DistutilsGetoptError, \ + ("invalid %s '%s': " + "option '%s' not defined") % (what, alias, alias) + if not self.option_index.has_key(opt): + raise DistutilsGetoptError, \ + ("invalid %s '%s': " + "aliased option '%s' not defined") % (what, alias, opt) + + def set_aliases (self, alias): + """Set the aliases for this option parser.""" + self._check_alias_dict(alias, "alias") + self.alias = alias + + def set_negative_aliases (self, negative_alias): + """Set the negative aliases for this option parser. + 'negative_alias' should be a dictionary mapping option names to + option names, both the key and value must already be defined + in the option table.""" + self._check_alias_dict(negative_alias, "negative alias") + self.negative_alias = negative_alias + + + def _grok_option_table (self): + """Populate the various data structures that keep tabs on the + option table. Called by 'getopt()' before it can do anything + worthwhile. + """ + self.long_opts = [] + self.short_opts = [] + self.short2long.clear() + + for option in self.option_table: + try: + (long, short, help) = option + except ValueError: + raise DistutilsGetoptError, \ + "invalid option tuple " + str(option) + + # Type- and value-check the option names + if type(long) is not StringType or len(long) < 2: + raise DistutilsGetoptError, \ + ("invalid long option '%s': " + "must be a string of length >= 2") % long + + if (not ((short is None) or + (type(short) is StringType and len(short) == 1))): + raise DistutilsGetoptError, \ + ("invalid short option '%s': " + "must a single character or None") % short + + self.long_opts.append(long) + + if long[-1] == '=': # option takes an argument? + if short: short = short + ':' + long = long[0:-1] + self.takes_arg[long] = 1 + else: + + # Is option is a "negative alias" for some other option (eg. + # "quiet" == "!verbose")? + alias_to = self.negative_alias.get(long) + if alias_to is not None: + if self.takes_arg[alias_to]: + raise DistutilsGetoptError, \ + ("invalid negative alias '%s': " + "aliased option '%s' takes a value") % \ + (long, alias_to) + + self.long_opts[-1] = long # XXX redundant?! + self.takes_arg[long] = 0 + + else: + self.takes_arg[long] = 0 + + # If this is an alias option, make sure its "takes arg" flag is + # the same as the option it's aliased to. + alias_to = self.alias.get(long) + if alias_to is not None: + if self.takes_arg[long] != self.takes_arg[alias_to]: + raise DistutilsGetoptError, \ + ("invalid alias '%s': inconsistent with " + "aliased option '%s' (one of them takes a value, " + "the other doesn't") % (long, alias_to) + + + # Now enforce some bondage on the long option name, so we can + # later translate it to an attribute name on some object. Have + # to do this a bit late to make sure we've removed any trailing + # '='. + if not longopt_re.match(long): + raise DistutilsGetoptError, \ + ("invalid long option name '%s' " + + "(must be letters, numbers, hyphens only") % long + + self.attr_name[long] = self.get_attr_name(long) + if short: + self.short_opts.append(short) + self.short2long[short[0]] = long + + # for option_table + + # _grok_option_table() + + + def getopt (self, args=None, object=None): + """Parse the command-line options in 'args' and store the results + as attributes of 'object'. If 'args' is None or not supplied, uses + 'sys.argv[1:]'. If 'object' is None or not supplied, creates a new + OptionDummy object, stores option values there, and returns a tuple + (args, object). If 'object' is supplied, it is modified in place + and 'getopt()' just returns 'args'; in both cases, the returned + 'args' is a modified copy of the passed-in 'args' list, which is + left untouched. + """ + if args is None: + args = sys.argv[1:] + if object is None: + object = OptionDummy() + created_object = 1 + else: + created_object = 0 + + self._grok_option_table() + + short_opts = string.join(self.short_opts) + try: + (opts, args) = getopt.getopt(args, short_opts, self.long_opts) + except getopt.error, msg: + raise DistutilsArgError, msg + + for (opt, val) in opts: + if len(opt) == 2 and opt[0] == '-': # it's a short option + opt = self.short2long[opt[1]] + + elif len(opt) > 2 and opt[0:2] == '--': + opt = opt[2:] + + else: + raise DistutilsInternalError, \ + "this can't happen: bad option string '%s'" % opt + + alias = self.alias.get(opt) + if alias: + opt = alias + + if not self.takes_arg[opt]: # boolean option? + if val != '': # shouldn't have a value! + raise DistutilsInternalError, \ + "this can't happen: bad option value '%s'" % val + + alias = self.negative_alias.get(opt) + if alias: + opt = alias + val = 0 + else: + val = 1 + + attr = self.attr_name[opt] + setattr(object, attr, val) + self.option_order.append((opt, val)) + + # for opts + + if created_object: + return (args, object) + else: + return args + + # getopt() + + + def get_option_order (self): + """Returns the list of (option, value) tuples processed by the + previous run of 'getopt()'. Raises RuntimeError if + 'getopt()' hasn't been called yet. + """ + if self.option_order is None: + raise RuntimeError, "'getopt()' hasn't been called yet" + else: + return self.option_order + + + def generate_help (self, header=None): + """Generate help text (a list of strings, one per suggested line of + output) from the option table for this FancyGetopt object. + """ + # Blithely assume the option table is good: probably wouldn't call + # 'generate_help()' unless you've already called 'getopt()'. + + # First pass: determine maximum length of long option names + max_opt = 0 + for option in self.option_table: + long = option[0] + short = option[1] + l = len(long) + if long[-1] == '=': + l = l - 1 + if short is not None: + l = l + 5 # " (-x)" where short == 'x' + if l > max_opt: + max_opt = l + + opt_width = max_opt + 2 + 2 + 2 # room for indent + dashes + gutter + + # Typical help block looks like this: + # --foo controls foonabulation + # Help block for longest option looks like this: + # --flimflam set the flim-flam level + # and with wrapped text: + # --flimflam set the flim-flam level (must be between + # 0 and 100, except on Tuesdays) + # Options with short names will have the short name shown (but + # it doesn't contribute to max_opt): + # --foo (-f) controls foonabulation + # If adding the short option would make the left column too wide, + # we push the explanation off to the next line + # --flimflam (-l) + # set the flim-flam level + # Important parameters: + # - 2 spaces before option block start lines + # - 2 dashes for each long option name + # - min. 2 spaces between option and explanation (gutter) + # - 5 characters (incl. space) for short option name + + # Now generate lines of help text. (If 80 columns were good enough + # for Jesus, then 78 columns are good enough for me!) + line_width = 78 + text_width = line_width - opt_width + big_indent = ' ' * opt_width + if header: + lines = [header] + else: + lines = ['Option summary:'] + + for (long,short,help) in self.option_table: + + text = wrap_text(help, text_width) + if long[-1] == '=': + long = long[0:-1] + + # Case 1: no short option at all (makes life easy) + if short is None: + if text: + lines.append(" --%-*s %s" % (max_opt, long, text[0])) + else: + lines.append(" --%-*s " % (max_opt, long)) + + # Case 2: we have a short option, so we have to include it + # just after the long option + else: + opt_names = "%s (-%s)" % (long, short) + if text: + lines.append(" --%-*s %s" % + (max_opt, opt_names, text[0])) + else: + lines.append(" --%-*s" % opt_names) + + for l in text[1:]: + lines.append(big_indent + l) + + # for self.option_table + + return lines + + # generate_help () + + def print_help (self, header=None, file=None): + if file is None: + file = sys.stdout + for line in self.generate_help(header): + file.write(line + "\n") + +# class FancyGetopt + + +def fancy_getopt (options, negative_opt, object, args): + parser = FancyGetopt(options) + parser.set_negative_aliases(negative_opt) + return parser.getopt(args, object) + + +WS_TRANS = string.maketrans(string.whitespace, ' ' * len(string.whitespace)) + +def wrap_text (text, width): + """wrap_text(text : string, width : int) -> [string] + + Split 'text' into multiple lines of no more than 'width' characters + each, and return the list of strings that results. + """ + + if text is None: + return [] + if len(text) <= width: + return [text] + + text = string.expandtabs(text) + text = string.translate(text, WS_TRANS) + chunks = re.split(r'( +|-+)', text) + chunks = filter(None, chunks) # ' - ' results in empty strings + lines = [] + + while chunks: + + cur_line = [] # list of chunks (to-be-joined) + cur_len = 0 # length of current line + + while chunks: + l = len(chunks[0]) + if cur_len + l <= width: # can squeeze (at least) this chunk in + cur_line.append(chunks[0]) + del chunks[0] + cur_len = cur_len + l + else: # this line is full + # drop last chunk if all space + if cur_line and cur_line[-1][0] == ' ': + del cur_line[-1] + break + + if chunks: # any chunks left to process? + + # if the current line is still empty, then we had a single + # chunk that's too big too fit on a line -- so we break + # down and break it up at the line width + if cur_len == 0: + cur_line.append(chunks[0][0:width]) + chunks[0] = chunks[0][width:] + + # all-whitespace chunks at the end of a line can be discarded + # (and we know from the re.split above that if a chunk has + # *any* whitespace, it is *all* whitespace) + if chunks[0][0] == ' ': + del chunks[0] + + # and store this line in the list-of-all-lines -- as a single + # string, of course! + lines.append(string.join(cur_line, '')) + + # while chunks + + return lines + +# wrap_text () + + +def translate_longopt (opt): + """Convert a long option name to a valid Python identifier by + changing "-" to "_". + """ + return string.translate(opt, longopt_xlate) + + +class OptionDummy: + """Dummy class just used as a place to hold command-line option + values as instance attributes.""" + + def __init__ (self, options=[]): + """Create a new OptionDummy instance. The attributes listed in + 'options' will be initialized to None.""" + for opt in options: + setattr(self, opt, None) + +# class OptionDummy + + +if __name__ == "__main__": + text = """\ +Tra-la-la, supercalifragilisticexpialidocious. +How *do* you spell that odd word, anyways? +(Someone ask Mary -- she'll know [or she'll +say, "How should I know?"].)""" + + for w in (10, 20, 30, 40): + print "width: %d" % w + print string.join(wrap_text(text, w), "\n") + print diff --git a/lib-python/2.2/distutils/file_util.py b/lib-python/2.2/distutils/file_util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/file_util.py @@ -0,0 +1,258 @@ +"""distutils.file_util + +Utility functions for operating on single files. +""" + +# created 2000/04/03, Greg Ward (extracted from util.py) + +__revision__ = "$Id$" + +import os +from distutils.errors import DistutilsFileError + + +# for generating verbose output in 'copy_file()' +_copy_action = { None: 'copying', + 'hard': 'hard linking', + 'sym': 'symbolically linking' } + + +def _copy_file_contents (src, dst, buffer_size=16*1024): + """Copy the file 'src' to 'dst'; both must be filenames. Any error + opening either file, reading from 'src', or writing to 'dst', raises + DistutilsFileError. Data is read/written in chunks of 'buffer_size' + bytes (default 16k). No attempt is made to handle anything apart from + regular files. + """ + # Stolen from shutil module in the standard library, but with + # custom error-handling added. + + fsrc = None + fdst = None + try: + try: + fsrc = open(src, 'rb') + except os.error, (errno, errstr): + raise DistutilsFileError, \ + "could not open '%s': %s" % (src, errstr) + + if os.path.exists(dst): + try: + os.unlink(dst) + except os.error, (errno, errstr): + raise DistutilsFileError, \ + "could not delete '%s': %s" % (dst, errstr) + + try: + fdst = open(dst, 'wb') + except os.error, (errno, errstr): + raise DistutilsFileError, \ + "could not create '%s': %s" % (dst, errstr) + + while 1: + try: + buf = fsrc.read(buffer_size) + except os.error, (errno, errstr): + raise DistutilsFileError, \ + "could not read from '%s': %s" % (src, errstr) + + if not buf: + break + + try: + fdst.write(buf) + except os.error, (errno, errstr): + raise DistutilsFileError, \ + "could not write to '%s': %s" % (dst, errstr) + + finally: + if fdst: + fdst.close() + if fsrc: + fsrc.close() + +# _copy_file_contents() + + +def copy_file (src, dst, + preserve_mode=1, + preserve_times=1, + update=0, + link=None, + verbose=0, + dry_run=0): + + """Copy a file 'src' to 'dst'. If 'dst' is a directory, then 'src' is + copied there with the same name; otherwise, it must be a filename. (If + the file exists, it will be ruthlessly clobbered.) If 'preserve_mode' + is true (the default), the file's mode (type and permission bits, or + whatever is analogous on the current platform) is copied. If + 'preserve_times' is true (the default), the last-modified and + last-access times are copied as well. If 'update' is true, 'src' will + only be copied if 'dst' does not exist, or if 'dst' does exist but is + older than 'src'. If 'verbose' is true, then a one-line summary of the + copy will be printed to stdout. + + 'link' allows you to make hard links (os.link) or symbolic links + (os.symlink) instead of copying: set it to "hard" or "sym"; if it is + None (the default), files are copied. Don't set 'link' on systems that + don't support it: 'copy_file()' doesn't check if hard or symbolic + linking is available. + + Under Mac OS, uses the native file copy function in macostools; on + other systems, uses '_copy_file_contents()' to copy file contents. + + Return a tuple (dest_name, copied): 'dest_name' is the actual name of + the output file, and 'copied' is true if the file was copied (or would + have been copied, if 'dry_run' true). + """ + # XXX if the destination file already exists, we clobber it if + # copying, but blow up if linking. Hmmm. And I don't know what + # macostools.copyfile() does. Should definitely be consistent, and + # should probably blow up if destination exists and we would be + # changing it (ie. it's not already a hard/soft link to src OR + # (not update) and (src newer than dst). + + from distutils.dep_util import newer + from stat import ST_ATIME, ST_MTIME, ST_MODE, S_IMODE + + if not os.path.isfile(src): + raise DistutilsFileError, \ + "can't copy '%s': doesn't exist or not a regular file" % src + + if os.path.isdir(dst): + dir = dst + dst = os.path.join(dst, os.path.basename(src)) + else: + dir = os.path.dirname(dst) + + if update and not newer(src, dst): + if verbose: + print "not copying %s (output up-to-date)" % src + return (dst, 0) + + try: + action = _copy_action[link] + except KeyError: + raise ValueError, \ + "invalid value '%s' for 'link' argument" % link + if verbose: + if os.path.basename(dst) == os.path.basename(src): + print "%s %s -> %s" % (action, src, dir) + else: + print "%s %s -> %s" % (action, src, dst) + + if dry_run: + return (dst, 1) + + # On Mac OS, use the native file copy routine + if os.name == 'mac': + import macostools + try: + macostools.copy(src, dst, 0, preserve_times) + except os.error, exc: + raise DistutilsFileError, \ + "could not copy '%s' to '%s': %s" % (src, dst, exc[-1]) + + # If linking (hard or symbolic), use the appropriate system call + # (Unix only, of course, but that's the caller's responsibility) + elif link == 'hard': + if not (os.path.exists(dst) and os.path.samefile(src, dst)): + os.link(src, dst) + elif link == 'sym': + if not (os.path.exists(dst) and os.path.samefile(src, dst)): + os.symlink(src, dst) + + # Otherwise (non-Mac, not linking), copy the file contents and + # (optionally) copy the times and mode. + else: + _copy_file_contents(src, dst) + if preserve_mode or preserve_times: + st = os.stat(src) + + # According to David Ascher , utime() should be done + # before chmod() (at least under NT). + if preserve_times: + os.utime(dst, (st[ST_ATIME], st[ST_MTIME])) + if preserve_mode: + os.chmod(dst, S_IMODE(st[ST_MODE])) + + return (dst, 1) + +# copy_file () + + +# XXX I suspect this is Unix-specific -- need porting help! +def move_file (src, dst, + verbose=0, + dry_run=0): + + """Move a file 'src' to 'dst'. If 'dst' is a directory, the file will + be moved into it with the same name; otherwise, 'src' is just renamed + to 'dst'. Return the new full name of the file. + + Handles cross-device moves on Unix using 'copy_file()'. What about + other systems??? + """ + from os.path import exists, isfile, isdir, basename, dirname + import errno + + if verbose: + print "moving %s -> %s" % (src, dst) + + if dry_run: + return dst + + if not isfile(src): + raise DistutilsFileError, \ + "can't move '%s': not a regular file" % src + + if isdir(dst): + dst = os.path.join(dst, basename(src)) + elif exists(dst): + raise DistutilsFileError, \ + "can't move '%s': destination '%s' already exists" % \ + (src, dst) + + if not isdir(dirname(dst)): + raise DistutilsFileError, \ + "can't move '%s': destination '%s' not a valid path" % \ + (src, dst) + + copy_it = 0 + try: + os.rename(src, dst) + except os.error, (num, msg): + if num == errno.EXDEV: + copy_it = 1 + else: + raise DistutilsFileError, \ + "couldn't move '%s' to '%s': %s" % (src, dst, msg) + + if copy_it: + copy_file(src, dst) + try: + os.unlink(src) + except os.error, (num, msg): + try: + os.unlink(dst) + except os.error: + pass + raise DistutilsFileError, \ + ("couldn't move '%s' to '%s' by copy/delete: " + + "delete '%s' failed: %s") % \ + (src, dst, src, msg) + + return dst + +# move_file () + + +def write_file (filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + f = open(filename, "w") + for line in contents: + f.write(line + "\n") + f.close() diff --git a/lib-python/2.2/distutils/filelist.py b/lib-python/2.2/distutils/filelist.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/filelist.py @@ -0,0 +1,367 @@ +"""distutils.filelist + +Provides the FileList class, used for poking about the filesystem +and building lists of files. +""" + +# created 2000/07/17, Rene Liebscher (as template.py) +# most parts taken from commands/sdist.py +# renamed 2000/07/29 (to filelist.py) and officially added to +# the Distutils source, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string, re +import fnmatch +from types import * +from glob import glob +from distutils.util import convert_path +from distutils.errors import DistutilsTemplateError, DistutilsInternalError + +class FileList: + + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + + Instance attributes: + dir + directory from which files will be taken -- only used if + 'allfiles' not supplied to constructor + files + list of filenames currently being built/filtered/manipulated + allfiles + complete list of files under consideration (ie. without any + filtering applied) + """ + + def __init__(self, + warn=None, + debug_print=None): + # use standard warning and debug functions if no other given + self.warn = warn or self.__warn + self.debug_print = debug_print or self.__debug_print + + self.allfiles = None + self.files = [] + + + def set_allfiles (self, allfiles): + self.allfiles = allfiles + + def findall (self, dir=os.curdir): + self.allfiles = findall(dir) + + + # -- Fallback warning/debug functions ------------------------------ + + def __warn (self, msg): + sys.stderr.write("warning: %s\n" % msg) + + def __debug_print (self, msg): + """Print 'msg' to stdout if the global DEBUG (taken from the + DISTUTILS_DEBUG environment variable) flag is true. + """ + from distutils.core import DEBUG + if DEBUG: + print msg + + + # -- List-like methods --------------------------------------------- + + def append (self, item): + self.files.append(item) + + def extend (self, items): + self.files.extend(items) + + def sort (self): + # Not a strict lexical sort! + sortable_files = map(os.path.split, self.files) + sortable_files.sort() + self.files = [] + for sort_tuple in sortable_files: + self.files.append(apply(os.path.join, sort_tuple)) + + + # -- Other miscellaneous utility methods --------------------------- + + def remove_duplicates (self): + # Assumes list has been sorted! + for i in range(len(self.files)-1, 0, -1): + if self.files[i] == self.files[i-1]: + del self.files[i] + + + # -- "File template" methods --------------------------------------- + + def _parse_template_line (self, line): + words = string.split(line) + action = words[0] + + patterns = dir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistutilsTemplateError, \ + "'%s' expects ..." % action + + patterns = map(convert_path, words[1:]) + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistutilsTemplateError, \ + "'%s' expects

..." % action + + dir = convert_path(words[1]) + patterns = map(convert_path, words[2:]) + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistutilsTemplateError, \ + "'%s' expects a single " % action + + dir_pattern = convert_path(words[1]) + + else: + raise DistutilsTemplateError, "unknown action '%s'" % action + + return (action, patterns, dir, dir_pattern) + + # _parse_template_line () + + + def process_template_line (self, line): + + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + string.join(patterns)) + for pattern in patterns: + if not self.include_pattern(pattern, anchor=1): + self.warn("no files found matching '%s'" % pattern) + + elif action == 'exclude': + self.debug_print("exclude " + string.join(patterns)) + for pattern in patterns: + if not self.exclude_pattern(pattern, anchor=1): + self.warn( + "no previously-included files found matching '%s'"% + pattern) + + elif action == 'global-include': + self.debug_print("global-include " + string.join(patterns)) + for pattern in patterns: + if not self.include_pattern(pattern, anchor=0): + self.warn(("no files found matching '%s' " + + "anywhere in distribution") % + pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + string.join(patterns)) + for pattern in patterns: + if not self.exclude_pattern(pattern, anchor=0): + self.warn(("no previously-included files matching '%s' " + + "found anywhere in distribution") % + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, string.join(patterns))) + for pattern in patterns: + if not self.include_pattern(pattern, prefix=dir): + self.warn(("no files found matching '%s' " + + "under directory '%s'") % + (pattern, dir)) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, string.join(patterns))) + for pattern in patterns: + if not self.exclude_pattern(pattern, prefix=dir): + self.warn(("no previously-included files matching '%s' " + + "found under directory '%s'") % + (pattern, dir)) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.include_pattern(None, prefix=dir_pattern): + self.warn("no directories found matching '%s'" % dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.exclude_pattern(None, prefix=dir_pattern): + self.warn(("no previously-included directories found " + + "matching '%s'") % + dir_pattern) + else: + raise DistutilsInternalError, \ + "this cannot happen: invalid action '%s'" % action + + # process_template_line () + + + # -- Filtering/selection methods ----------------------------------- + + def include_pattern (self, pattern, + anchor=1, prefix=None, is_regex=0): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. Patterns + are not quite the same as implemented by the 'fnmatch' module: '*' + and '?' match non-special characters, where "special" is platform- + dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return 1 if files are found. + """ + files_found = 0 + pattern_re = translate_pattern(pattern, anchor, prefix, is_regex) + self.debug_print("include_pattern: applying regex r'%s'" % + pattern_re.pattern) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.debug_print(" adding " + name) + self.files.append(name) + files_found = 1 + + return files_found + + # include_pattern () + + + def exclude_pattern (self, pattern, + anchor=1, prefix=None, is_regex=0): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. Other parameters are the same as for + 'include_pattern()', above. + The list 'self.files' is modified in place. + Return 1 if files are found. + """ + files_found = 0 + pattern_re = translate_pattern(pattern, anchor, prefix, is_regex) + self.debug_print("exclude_pattern: applying regex r'%s'" % + pattern_re.pattern) + for i in range(len(self.files)-1, -1, -1): + if pattern_re.search(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + files_found = 1 + + return files_found + + # exclude_pattern () + +# class FileList + + +# ---------------------------------------------------------------------- +# Utility functions + +def findall (dir = os.curdir): + """Find all files under 'dir' and return the list of full filenames + (relative to 'dir'). + """ + from stat import ST_MODE, S_ISREG, S_ISDIR, S_ISLNK + + list = [] + stack = [dir] + pop = stack.pop + push = stack.append + + while stack: + dir = pop() + names = os.listdir(dir) + + for name in names: + if dir != os.curdir: # avoid the dreaded "./" syndrome + fullname = os.path.join(dir, name) + else: + fullname = name + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat[ST_MODE] + if S_ISREG(mode): + list.append(fullname) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + return list + + +def glob_to_re (pattern): + """Translate a shell-like glob pattern to a regular expression; return + a string containing the regex. Differs from 'fnmatch.translate()' in + that '*' does not match "special characters" (which are + platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters. + # XXX currently the "special characters" are just slash -- i.e. this is + # Unix-only. + pattern_re = re.sub(r'(^|[^\\])\.', r'\1[^/]', pattern_re) + return pattern_re + +# glob_to_re () + + +def translate_pattern (pattern, anchor=1, prefix=None, is_regex=0): + """Translate a shell-like wildcard pattern to a compiled regular + expression. Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if type(pattern) is StringType: + return re.compile(pattern) + else: + return pattern + + if pattern: + pattern_re = glob_to_re(pattern) + else: + pattern_re = '' + + if prefix is not None: + prefix_re = (glob_to_re(prefix))[0:-1] # ditch trailing $ + pattern_re = "^" + os.path.join(prefix_re, ".*" + pattern_re) + else: # no prefix -- respect anchor flag + if anchor: + pattern_re = "^" + pattern_re + + return re.compile(pattern_re) + +# translate_pattern () diff --git a/lib-python/2.2/distutils/msvccompiler.py b/lib-python/2.2/distutils/msvccompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/msvccompiler.py @@ -0,0 +1,515 @@ +"""distutils.msvccompiler + +Contains MSVCCompiler, an implementation of the abstract CCompiler class +for the Microsoft Visual Studio.""" + + +# created 1999/08/19, Perry Stoll +# hacked by Robin Becker and Thomas Heller to do a better job of +# finding DevStudio (through the registry) + +__revision__ = "$Id$" + +import sys, os, string +from types import * +from distutils.errors import \ + DistutilsExecError, DistutilsPlatformError, \ + CompileError, LibError, LinkError +from distutils.ccompiler import \ + CCompiler, gen_preprocess_options, gen_lib_options + +_can_read_reg = 0 +try: + import _winreg + + _can_read_reg = 1 + hkey_mod = _winreg + + RegOpenKeyEx = _winreg.OpenKeyEx + RegEnumKey = _winreg.EnumKey + RegEnumValue = _winreg.EnumValue + RegError = _winreg.error + +except ImportError: + try: + import win32api + import win32con + _can_read_reg = 1 + hkey_mod = win32con + + RegOpenKeyEx = win32api.RegOpenKeyEx + RegEnumKey = win32api.RegEnumKey + RegEnumValue = win32api.RegEnumValue + RegError = win32api.error + + except ImportError: + pass + +if _can_read_reg: + HKEY_CLASSES_ROOT = hkey_mod.HKEY_CLASSES_ROOT + HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE + HKEY_CURRENT_USER = hkey_mod.HKEY_CURRENT_USER + HKEY_USERS = hkey_mod.HKEY_USERS + + + +def get_devstudio_versions (): + """Get list of devstudio versions from the Windows registry. Return a + list of strings containing version numbers; the list will be + empty if we were unable to access the registry (eg. couldn't import + a registry-access module) or the appropriate registry keys weren't + found.""" + + if not _can_read_reg: + return [] + + K = 'Software\\Microsoft\\Devstudio' + L = [] + for base in (HKEY_CLASSES_ROOT, + HKEY_LOCAL_MACHINE, + HKEY_CURRENT_USER, + HKEY_USERS): + try: + k = RegOpenKeyEx(base,K) + i = 0 + while 1: + try: + p = RegEnumKey(k,i) + if p[0] in '123456789' and p not in L: + L.append(p) + except RegError: + break + i = i + 1 + except RegError: + pass + L.sort() + L.reverse() + return L + +# get_devstudio_versions () + + +def get_msvc_paths (path, version='6.0', platform='x86'): + """Get a list of devstudio directories (include, lib or path). Return + a list of strings; will be empty list if unable to access the + registry or appropriate registry keys not found.""" + + if not _can_read_reg: + return [] + + L = [] + if path=='lib': + path= 'Library' + path = string.upper(path + ' Dirs') + K = ('Software\\Microsoft\\Devstudio\\%s\\' + + 'Build System\\Components\\Platforms\\Win32 (%s)\\Directories') % \ + (version,platform) + for base in (HKEY_CLASSES_ROOT, + HKEY_LOCAL_MACHINE, + HKEY_CURRENT_USER, + HKEY_USERS): + try: + k = RegOpenKeyEx(base,K) + i = 0 + while 1: + try: + (p,v,t) = RegEnumValue(k,i) + if string.upper(p) == path: + V = string.split(v,';') + for v in V: + if hasattr(v, "encode"): + try: + v = v.encode("mbcs") + except UnicodeError: + pass + if v == '' or v in L: continue + L.append(v) + break + i = i + 1 + except RegError: + break + except RegError: + pass + return L + +# get_msvc_paths() + + +def find_exe (exe, version_number): + """Try to find an MSVC executable program 'exe' (from version + 'version_number' of MSVC) in several places: first, one of the MSVC + program search paths from the registry; next, the directories in the + PATH environment variable. If any of those work, return an absolute + path that is known to exist. If none of them work, just return the + original program name, 'exe'.""" + + for p in get_msvc_paths ('path', version_number): + fn = os.path.join (os.path.abspath(p), exe) + if os.path.isfile(fn): + return fn + + # didn't find it; try existing path + for p in string.split (os.environ['Path'],';'): + fn = os.path.join(os.path.abspath(p),exe) + if os.path.isfile(fn): + return fn + + return exe # last desperate hope + + +def set_path_env_var (name, version_number): + """Set environment variable 'name' to an MSVC path type value obtained + from 'get_msvc_paths()'. This is equivalent to a SET command prior + to execution of spawned commands.""" + + p = get_msvc_paths (name, version_number) + if p: + os.environ[name] = string.join (p,';') + + +class MSVCCompiler (CCompiler) : + """Concrete class that implements an interface to Microsoft Visual C++, + as defined by the CCompiler abstract class.""" + + compiler_type = 'msvc' + + # Just set this so CCompiler's constructor doesn't barf. We currently + # don't use the 'set_executables()' bureaucracy provided by CCompiler, + # as it really isn't necessary for this sort of single-compiler class. + # Would be nice to have a consistent interface with UnixCCompiler, + # though, so it's worth thinking about. + executables = {} + + # Private class data (need to distinguish C from C++ source for compiler) + _c_extensions = ['.c'] + _cpp_extensions = ['.cc', '.cpp', '.cxx'] + _rc_extensions = ['.rc'] + _mc_extensions = ['.mc'] + + # Needed for the filename generation methods provided by the + # base class, CCompiler. + src_extensions = (_c_extensions + _cpp_extensions + + _rc_extensions + _mc_extensions) + res_extension = '.res' + obj_extension = '.obj' + static_lib_extension = '.lib' + shared_lib_extension = '.dll' + static_lib_format = shared_lib_format = '%s%s' + exe_extension = '.exe' + + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + CCompiler.__init__ (self, verbose, dry_run, force) + versions = get_devstudio_versions () + + if versions: + version = versions[0] # highest version + + self.cc = find_exe("cl.exe", version) + self.linker = find_exe("link.exe", version) + self.lib = find_exe("lib.exe", version) + self.rc = find_exe("rc.exe", version) # resource compiler + self.mc = find_exe("mc.exe", version) # message compiler + set_path_env_var ('lib', version) + set_path_env_var ('include', version) + path=get_msvc_paths('path', version) + try: + for p in string.split(os.environ['path'],';'): + path.append(p) + except KeyError: + pass + os.environ['path'] = string.join(path,';') + else: + # devstudio not found in the registry + self.cc = "cl.exe" + self.linker = "link.exe" + self.lib = "lib.exe" + self.rc = "rc.exe" + self.mc = "mc.exe" + + self.preprocess_options = None + self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ] + self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX', + '/Z7', '/D_DEBUG'] + + self.ldflags_shared = ['/DLL', '/nologo', '/INCREMENTAL:NO'] + self.ldflags_shared_debug = [ + '/DLL', '/nologo', '/INCREMENTAL:no', '/pdb:None', '/DEBUG' + ] + self.ldflags_static = [ '/nologo'] + + + # -- Worker methods ------------------------------------------------ + + def object_filenames (self, + source_filenames, + strip_dir=0, + output_dir=''): + # Copied from ccompiler.py, extended to return .res as 'object'-file + # for .rc input file + if output_dir is None: output_dir = '' + obj_names = [] + for src_name in source_filenames: + (base, ext) = os.path.splitext (src_name) + if ext not in self.src_extensions: + # Better to raise an exception instead of silently continuing + # and later complain about sources and targets having + # different lengths + raise CompileError ("Don't know how to compile %s" % src_name) + if strip_dir: + base = os.path.basename (base) + if ext in self._rc_extensions: + obj_names.append (os.path.join (output_dir, + base + self.res_extension)) + elif ext in self._mc_extensions: + obj_names.append (os.path.join (output_dir, + base + self.res_extension)) + else: + obj_names.append (os.path.join (output_dir, + base + self.obj_extension)) + return obj_names + + # object_filenames () + + + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (output_dir, macros, include_dirs) = \ + self._fix_compile_args (output_dir, macros, include_dirs) + (objects, skip_sources) = self._prep_compile (sources, output_dir) + + if extra_postargs is None: + extra_postargs = [] + + pp_opts = gen_preprocess_options (macros, include_dirs) + compile_opts = extra_preargs or [] + compile_opts.append ('/c') + if debug: + compile_opts.extend (self.compile_options_debug) + else: + compile_opts.extend (self.compile_options) + + for i in range (len (sources)): + src = sources[i] ; obj = objects[i] + ext = (os.path.splitext (src))[1] + + if skip_sources[src]: + self.announce ("skipping %s (%s up-to-date)" % (src, obj)) + else: + self.mkpath (os.path.dirname (obj)) + + if ext in self._c_extensions: + input_opt = "/Tc" + src + elif ext in self._cpp_extensions: + input_opt = "/Tp" + src + elif ext in self._rc_extensions: + # compile .RC to .RES file + input_opt = src + output_opt = "/fo" + obj + try: + self.spawn ([self.rc] + + [output_opt] + [input_opt]) + except DistutilsExecError, msg: + raise CompileError, msg + continue + elif ext in self._mc_extensions: + + # Compile .MC to .RC file to .RES file. + # * '-h dir' specifies the directory for the + # generated include file + # * '-r dir' specifies the target directory of the + # generated RC file and the binary message resource + # it includes + # + # For now (since there are no options to change this), + # we use the source-directory for the include file and + # the build directory for the RC file and message + # resources. This works at least for win32all. + + h_dir = os.path.dirname (src) + rc_dir = os.path.dirname (obj) + try: + # first compile .MC to .RC and .H file + self.spawn ([self.mc] + + ['-h', h_dir, '-r', rc_dir] + [src]) + base, _ = os.path.splitext (os.path.basename (src)) + rc_file = os.path.join (rc_dir, base + '.rc') + # then compile .RC to .RES file + self.spawn ([self.rc] + + ["/fo" + obj] + [rc_file]) + + except DistutilsExecError, msg: + raise CompileError, msg + continue + else: + # how to handle this file? + raise CompileError ( + "Don't know how to compile %s to %s" % \ + (src, obj)) + + output_opt = "/Fo" + obj + try: + self.spawn ([self.cc] + compile_opts + pp_opts + + [input_opt, output_opt] + + extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + + return objects + + # compile () + + + def create_static_lib (self, + objects, + output_libname, + output_dir=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (objects, output_dir) = self._fix_object_args (objects, output_dir) + output_filename = \ + self.library_filename (output_libname, output_dir=output_dir) + + if self._need_link (objects, output_filename): + lib_args = objects + ['/OUT:' + output_filename] + if debug: + pass # XXX what goes here? + if extra_preargs: + lib_args[:0] = extra_preargs + if extra_postargs: + lib_args.extend (extra_postargs) + try: + self.spawn ([self.lib] + lib_args) + except DistutilsExecError, msg: + raise LibError, msg + + else: + self.announce ("skipping %s (up-to-date)" % output_filename) + + # create_static_lib () + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + + (objects, output_dir) = self._fix_object_args (objects, output_dir) + (libraries, library_dirs, runtime_library_dirs) = \ + self._fix_lib_args (libraries, library_dirs, runtime_library_dirs) + + if runtime_library_dirs: + self.warn ("I don't know what to do with 'runtime_library_dirs': " + + str (runtime_library_dirs)) + + lib_opts = gen_lib_options (self, + library_dirs, runtime_library_dirs, + libraries) + if output_dir is not None: + output_filename = os.path.join (output_dir, output_filename) + + if self._need_link (objects, output_filename): + + if target_desc == CCompiler.EXECUTABLE: + if debug: + ldflags = self.ldflags_shared_debug[1:] + else: + ldflags = self.ldflags_shared[1:] + else: + if debug: + ldflags = self.ldflags_shared_debug + else: + ldflags = self.ldflags_shared + + export_opts = [] + for sym in (export_symbols or []): + export_opts.append("/EXPORT:" + sym) + + ld_args = (ldflags + lib_opts + export_opts + + objects + ['/OUT:' + output_filename]) + + # The MSVC linker generates .lib and .exp files, which cannot be + # suppressed by any linker switches. The .lib files may even be + # needed! Make sure they are generated in the temporary build + # directory. Since they have different names for debug and release + # builds, they can go into the same directory. + if export_symbols is not None: + (dll_name, dll_ext) = os.path.splitext( + os.path.basename(output_filename)) + implib_file = os.path.join( + os.path.dirname(objects[0]), + self.library_filename(dll_name)) + ld_args.append ('/IMPLIB:' + implib_file) + + if extra_preargs: + ld_args[:0] = extra_preargs + if extra_postargs: + ld_args.extend(extra_postargs) + + self.mkpath (os.path.dirname (output_filename)) + try: + self.spawn ([self.linker] + ld_args) + except DistutilsExecError, msg: + raise LinkError, msg + + else: + self.announce ("skipping %s (up-to-date)" % output_filename) + + # link () + + + # -- Miscellaneous methods ----------------------------------------- + # These are all used by the 'gen_lib_options() function, in + # ccompiler.py. + + def library_dir_option (self, dir): + return "/LIBPATH:" + dir + + def runtime_library_dir_option (self, dir): + raise DistutilsPlatformError, \ + "don't know how to set runtime library search path for MSVC++" + + def library_option (self, lib): + return self.library_filename (lib) + + + def find_library_file (self, dirs, lib, debug=0): + # Prefer a debugging library if found (and requested), but deal + # with it if we don't have one. + if debug: + try_names = [lib + "_d", lib] + else: + try_names = [lib] + for dir in dirs: + for name in try_names: + libfile = os.path.join(dir, self.library_filename (name)) + if os.path.exists(libfile): + return libfile + else: + # Oops, didn't find it in *any* of 'dirs' + return None + + # find_library_file () + +# class MSVCCompiler diff --git a/lib-python/2.2/distutils/mwerkscompiler.py b/lib-python/2.2/distutils/mwerkscompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/mwerkscompiler.py @@ -0,0 +1,217 @@ +"""distutils.mwerkscompiler + +Contains MWerksCompiler, an implementation of the abstract CCompiler class +for MetroWerks CodeWarrior on the Macintosh. Needs work to support CW on +Windows.""" + +import sys, os, string +from types import * +from distutils.errors import \ + DistutilsExecError, DistutilsPlatformError, \ + CompileError, LibError, LinkError +from distutils.ccompiler import \ + CCompiler, gen_preprocess_options, gen_lib_options +import distutils.util +import distutils.dir_util +import mkcwproject + +class MWerksCompiler (CCompiler) : + """Concrete class that implements an interface to MetroWerks CodeWarrior, + as defined by the CCompiler abstract class.""" + + compiler_type = 'mwerks' + + # Just set this so CCompiler's constructor doesn't barf. We currently + # don't use the 'set_executables()' bureaucracy provided by CCompiler, + # as it really isn't necessary for this sort of single-compiler class. + # Would be nice to have a consistent interface with UnixCCompiler, + # though, so it's worth thinking about. + executables = {} + + # Private class data (need to distinguish C from C++ source for compiler) + _c_extensions = ['.c'] + _cpp_extensions = ['.cc', '.cpp', '.cxx'] + _rc_extensions = ['.r'] + _exp_extension = '.exp' + + # Needed for the filename generation methods provided by the + # base class, CCompiler. + src_extensions = (_c_extensions + _cpp_extensions + + _rc_extensions) + res_extension = '.rsrc' + obj_extension = '.obj' # Not used, really + static_lib_extension = '.lib' + shared_lib_extension = '.slb' + static_lib_format = shared_lib_format = '%s%s' + exe_extension = '' + + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + + CCompiler.__init__ (self, verbose, dry_run, force) + + + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + (output_dir, macros, include_dirs) = \ + self._fix_compile_args (output_dir, macros, include_dirs) + self.__sources = sources + self.__macros = macros + self.__include_dirs = include_dirs + # Don't need extra_preargs and extra_postargs for CW + return [] + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + # First fixup. + (objects, output_dir) = self._fix_object_args (objects, output_dir) + (libraries, library_dirs, runtime_library_dirs) = \ + self._fix_lib_args (libraries, library_dirs, runtime_library_dirs) + + # First examine a couple of options for things that aren't implemented yet + if not target_desc in (self.SHARED_LIBRARY, self.SHARED_OBJECT): + raise DistutilsPlatformError, 'Can only make SHARED_LIBRARY or SHARED_OBJECT targets on the Mac' + if runtime_library_dirs: + raise DistutilsPlatformError, 'Runtime library dirs not implemented yet' + if extra_preargs or extra_postargs: + raise DistutilsPlatformError, 'Runtime library dirs not implemented yet' + if len(export_symbols) != 1: + raise DistutilsPlatformError, 'Need exactly one export symbol' + # Next there are various things for which we need absolute pathnames. + # This is because we (usually) create the project in a subdirectory of + # where we are now, and keeping the paths relative is too much work right + # now. + sources = map(self._filename_to_abs, self.__sources) + include_dirs = map(self._filename_to_abs, self.__include_dirs) + if objects: + objects = map(self._filename_to_abs, objects) + else: + objects = [] + if build_temp: + build_temp = self._filename_to_abs(build_temp) + else: + build_temp = os.curdir() + if output_dir: + output_filename = os.path.join(output_dir, output_filename) + # The output filename needs special handling: splitting it into dir and + # filename part. Actually I'm not sure this is really needed, but it + # can't hurt. + output_filename = self._filename_to_abs(output_filename) + output_dir, output_filename = os.path.split(output_filename) + # Now we need the short names of a couple of things for putting them + # into the project. + if output_filename[-8:] == '.ppc.slb': + basename = output_filename[:-8] + elif output_filename[-11:] == '.carbon.slb': + basename = output_filename[:-11] + else: + basename = os.path.strip(output_filename)[0] + projectname = basename + '.mcp' + targetname = basename + xmlname = basename + '.xml' + exportname = basename + '.mcp.exp' + prefixname = 'mwerks_%s_config.h'%basename + # Create the directories we need + distutils.dir_util.mkpath(build_temp, self.verbose, self.dry_run) + distutils.dir_util.mkpath(output_dir, self.verbose, self.dry_run) + # And on to filling in the parameters for the project builder + settings = {} + settings['mac_exportname'] = exportname + settings['mac_outputdir'] = output_dir + settings['mac_dllname'] = output_filename + settings['mac_targetname'] = targetname + settings['sysprefix'] = sys.prefix + settings['mac_sysprefixtype'] = 'Absolute' + sourcefilenames = [] + sourcefiledirs = [] + for filename in sources + objects: + dirname, filename = os.path.split(filename) + sourcefilenames.append(filename) + if not dirname in sourcefiledirs: + sourcefiledirs.append(dirname) + settings['sources'] = sourcefilenames + settings['libraries'] = libraries + settings['extrasearchdirs'] = sourcefiledirs + include_dirs + library_dirs + if self.dry_run: + print 'CALLING LINKER IN', os.getcwd() + for key, value in settings.items(): + print '%20.20s %s'%(key, value) + return + # Build the export file + exportfilename = os.path.join(build_temp, exportname) + if self.verbose: + print '\tCreate export file', exportfilename + fp = open(exportfilename, 'w') + fp.write('%s\n'%export_symbols[0]) + fp.close() + # Generate the prefix file, if needed, and put it in the settings + if self.__macros: + prefixfilename = os.path.join(os.getcwd(), os.path.join(build_temp, prefixname)) + fp = open(prefixfilename, 'w') + fp.write('#include "mwerks_plugin_config.h"\n') + for name, value in self.__macros: + if value is None: + fp.write('#define %s\n'%name) + else: + fp.write('#define %s %s\n'%(name, value)) + fp.close() + settings['prefixname'] = prefixname + + # Build the XML file. We need the full pathname (only lateron, really) + # because we pass this pathname to CodeWarrior in an AppleEvent, and CW + # doesn't have a clue about our working directory. + xmlfilename = os.path.join(os.getcwd(), os.path.join(build_temp, xmlname)) + if self.verbose: + print '\tCreate XML file', xmlfilename + xmlbuilder = mkcwproject.cwxmlgen.ProjectBuilder(settings) + xmlbuilder.generate() + xmldata = settings['tmp_projectxmldata'] + fp = open(xmlfilename, 'w') + fp.write(xmldata) + fp.close() + # Generate the project. Again a full pathname. + projectfilename = os.path.join(os.getcwd(), os.path.join(build_temp, projectname)) + if self.verbose: + print '\tCreate project file', projectfilename + mkcwproject.makeproject(xmlfilename, projectfilename) + # And build it + if self.verbose: + print '\tBuild project' + mkcwproject.buildproject(projectfilename) + + def _filename_to_abs(self, filename): + # Some filenames seem to be unix-like. Convert to Mac names. +## if '/' in filename and ':' in filename: +## raise DistutilsPlatformError, 'Filename may be Unix or Mac style: %s'%filename +## if '/' in filename: +## filename = macurl2path(filename) + filename = distutils.util.convert_path(filename) + if not os.path.isabs(filename): + curdir = os.getcwd() + filename = os.path.join(curdir, filename) + # Finally remove .. components + components = string.split(filename, ':') + for i in range(1, len(components)): + if components[i] == '..': + components[i] = '' + return string.join(components, ':') diff --git a/lib-python/2.2/distutils/spawn.py b/lib-python/2.2/distutils/spawn.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/spawn.py @@ -0,0 +1,169 @@ +"""distutils.spawn + +Provides the 'spawn()' function, a front-end to various platform- +specific functions for launching another program in a sub-process. +Also provides the 'find_executable()' to search the path for a given +executable name. +""" + +# created 1999/07/24, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string +from distutils.errors import * + + +def spawn (cmd, + search_path=1, + verbose=0, + dry_run=0): + + """Run another program, specified as a command list 'cmd', in a new + process. 'cmd' is just the argument list for the new process, ie. + cmd[0] is the program to run and cmd[1:] are the rest of its arguments. + There is no way to run a program with a name different from that of its + executable. + + If 'search_path' is true (the default), the system's executable search + path will be used to find the program; otherwise, cmd[0] must be the + exact path to the executable. If 'verbose' is true, a one-line summary + of the command will be printed before it is run. If 'dry_run' is true, + the command will not actually be run. + + Raise DistutilsExecError if running the program fails in any way; just + return on success. + """ + if os.name == 'posix': + _spawn_posix(cmd, search_path, verbose, dry_run) + elif os.name == 'nt': + _spawn_nt(cmd, search_path, verbose, dry_run) + else: + raise DistutilsPlatformError, \ + "don't know how to spawn programs on platform '%s'" % os.name + +# spawn () + + +def _nt_quote_args (args): + """Quote command-line arguments for DOS/Windows conventions: just + wraps every argument which contains blanks in double quotes, and + returns a new argument list. + """ + + # XXX this doesn't seem very robust to me -- but if the Windows guys + # say it'll work, I guess I'll have to accept it. (What if an arg + # contains quotes? What other magic characters, other than spaces, + # have to be escaped? Is there an escaping mechanism other than + # quoting?) + + for i in range(len(args)): + if string.find(args[i], ' ') != -1: + args[i] = '"%s"' % args[i] + return args + +def _spawn_nt (cmd, + search_path=1, + verbose=0, + dry_run=0): + + executable = cmd[0] + cmd = _nt_quote_args(cmd) + if search_path: + # either we find one or it stays the same + executable = find_executable(executable) or executable + if verbose: + print string.join([executable] + cmd[1:], ' ') + if not dry_run: + # spawn for NT requires a full path to the .exe + try: + rc = os.spawnv(os.P_WAIT, executable, cmd) + except OSError, exc: + # this seems to happen when the command isn't found + raise DistutilsExecError, \ + "command '%s' failed: %s" % (cmd[0], exc[-1]) + if rc != 0: + # and this reflects the command running but failing + raise DistutilsExecError, \ + "command '%s' failed with exit status %d" % (cmd[0], rc) + + +def _spawn_posix (cmd, + search_path=1, + verbose=0, + dry_run=0): + + if verbose: + print string.join(cmd, ' ') + if dry_run: + return + exec_fn = search_path and os.execvp or os.execv + + pid = os.fork() + + if pid == 0: # in the child + try: + #print "cmd[0] =", cmd[0] + #print "cmd =", cmd + exec_fn(cmd[0], cmd) + except OSError, e: + sys.stderr.write("unable to execute %s: %s\n" % + (cmd[0], e.strerror)) + os._exit(1) + + sys.stderr.write("unable to execute %s for unknown reasons" % cmd[0]) + os._exit(1) + + + else: # in the parent + # Loop until the child either exits or is terminated by a signal + # (ie. keep waiting if it's merely stopped) + while 1: + (pid, status) = os.waitpid(pid, 0) + if os.WIFSIGNALED(status): + raise DistutilsExecError, \ + "command '%s' terminated by signal %d" % \ + (cmd[0], os.WTERMSIG(status)) + + elif os.WIFEXITED(status): + exit_status = os.WEXITSTATUS(status) + if exit_status == 0: + return # hey, it succeeded! + else: + raise DistutilsExecError, \ + "command '%s' failed with exit status %d" % \ + (cmd[0], exit_status) + + elif os.WIFSTOPPED(status): + continue + + else: + raise DistutilsExecError, \ + "unknown error executing '%s': termination status %d" % \ + (cmd[0], status) +# _spawn_posix () + + +def find_executable(executable, path=None): + """Try to find 'executable' in the directories listed in 'path' (a + string listing directories separated by 'os.pathsep'; defaults to + os.environ['PATH']). Returns the complete filename or None if not + found. + """ + if path is None: + path = os.environ['PATH'] + paths = string.split(path, os.pathsep) + (base, ext) = os.path.splitext(executable) + if (sys.platform == 'win32') and (ext != '.exe'): + executable = executable + '.exe' + if not os.path.isfile(executable): + for p in paths: + f = os.path.join(p, executable) + if os.path.isfile(f): + # the file exists, we have a shot at spawn working + return f + return None + else: + return executable + +# find_executable() diff --git a/lib-python/2.2/distutils/sysconfig.py b/lib-python/2.2/distutils/sysconfig.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/sysconfig.py @@ -0,0 +1,445 @@ +"""Provide access to Python's configuration information. The specific +configuration variables available depend heavily on the platform and +configuration. The values may be retrieved using +get_config_var(name), and the list of variables is available via +get_config_vars().keys(). Additional convenience functions are also +available. + +Written by: Fred L. Drake, Jr. +Email: +Initial date: 17-Dec-1998 +""" + +__revision__ = "$Id$" + +import os +import re +import string +import sys + +from errors import DistutilsPlatformError + +# These are needed in a couple of spots, so just compute them once. +PREFIX = os.path.normpath(sys.prefix) +EXEC_PREFIX = os.path.normpath(sys.exec_prefix) + +# python_build: (Boolean) if true, we're either building Python or +# building an extension with an un-installed Python, so we use +# different (hard-wired) directories. + +argv0_path = os.path.dirname(os.path.abspath(sys.executable)) +landmark = os.path.join(argv0_path, "Modules", "Setup") + +python_build = os.path.isfile(landmark) + +del argv0_path, landmark + +# set_python_build() was present in 2.2 and 2.2.1; it's not needed +# any more, but so 3rd party build scripts don't break, we leave +# a do-nothing version: +def set_python_build(): + pass + +def get_python_inc(plat_specific=0, prefix=None): + """Return the directory containing installed Python header files. + + If 'plat_specific' is false (the default), this is the path to the + non-platform-specific header files, i.e. Python.h and so on; + otherwise, this is the path to platform-specific header files + (namely pyconfig.h). + + If 'prefix' is supplied, use it instead of sys.prefix or + sys.exec_prefix -- i.e., ignore 'plat_specific'. + """ + if prefix is None: + prefix = plat_specific and EXEC_PREFIX or PREFIX + if os.name == "posix": + if python_build: + base = os.path.dirname(os.path.abspath(sys.executable)) + if plat_specific: + inc_dir = base + else: + inc_dir = os.path.join(base, "Include") + if not os.path.exists(inc_dir): + inc_dir = os.path.join(os.path.dirname(base), "Include") + return inc_dir + return os.path.join(prefix, "include", "python" + sys.version[:3]) + elif os.name == "nt": + return os.path.join(prefix, "include") + elif os.name == "mac": + return os.path.join(prefix, "Include") + else: + raise DistutilsPlatformError( + "I don't know where Python installs its C header files " + "on platform '%s'" % os.name) + + +def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + """Return the directory containing the Python library (standard or + site additions). + + If 'plat_specific' is true, return the directory containing + platform-specific modules, i.e. any module from a non-pure-Python + module distribution; otherwise, return the platform-shared library + directory. If 'standard_lib' is true, return the directory + containing standard Python library modules; otherwise, return the + directory for site-specific modules. + + If 'prefix' is supplied, use it instead of sys.prefix or + sys.exec_prefix -- i.e., ignore 'plat_specific'. + """ + if prefix is None: + prefix = plat_specific and EXEC_PREFIX or PREFIX + + if os.name == "posix": + libpython = os.path.join(prefix, + "lib", "python" + sys.version[:3]) + if standard_lib: + return libpython + else: + return os.path.join(libpython, "site-packages") + + elif os.name == "nt": + if standard_lib: + return os.path.join(prefix, "Lib") + else: + if sys.version < "2.2": + return prefix + else: + return os.path.join(PREFIX, "Lib", "site-packages") + + elif os.name == "mac": + if plat_specific: + if standard_lib: + return os.path.join(prefix, "Lib", "lib-dynload") + else: + return os.path.join(prefix, "Lib", "site-packages") + else: + if standard_lib: + return os.path.join(prefix, "Lib") + else: + return os.path.join(prefix, "Lib", "site-packages") + elif os.name == "java": + if standard_lib: + return os.path.join(prefix, "Lib") + else: + return os.path.join(prefix, "Lib", "site-packages") + else: + raise DistutilsPlatformError( + "I don't know where Python installs its library " + "on platform '%s'" % os.name) + + +def customize_compiler(compiler): + """Do any platform-specific customization of a CCompiler instance. + + Mainly needed on Unix, so we can plug in the information that + varies across Unices and is stored in Python's Makefile. + """ + if compiler.compiler_type == "unix": + (cc, opt, ccshared, ldshared, so_ext) = \ + get_config_vars('CC', 'OPT', 'CCSHARED', 'LDSHARED', 'SO') + + cc_cmd = cc + ' ' + opt + compiler.set_executables( + preprocessor=cc + " -E", # not always! + compiler=cc_cmd, + compiler_so=cc_cmd + ' ' + ccshared, + linker_so=ldshared, + linker_exe=cc) + + compiler.shared_lib_extension = so_ext + + +def get_config_h_filename(): + """Return full pathname of installed pyconfig.h file.""" + if python_build: + inc_dir = os.curdir + else: + inc_dir = get_python_inc(plat_specific=1) + if sys.version < '2.2': + config_h = 'config.h' + else: + # The name of the config.h file changed in 2.2 + config_h = 'pyconfig.h' + return os.path.join(inc_dir, config_h) + + +def get_makefile_filename(): + """Return full pathname of installed Makefile from the Python build.""" + if python_build: + return os.path.join(os.path.dirname(sys.executable), "Makefile") + lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + return os.path.join(lib_dir, "config", "Makefile") + + +def parse_config_h(fp, g=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if g is None: + g = {} + define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n") + # + while 1: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: v = string.atoi(v) + except ValueError: pass + g[n] = v + else: + m = undef_rx.match(line) + if m: + g[m.group(1)] = 0 + return g + + +# Regexes needed for parsing Makefile (and similar syntaxes, +# like old-style Setup files). +_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") +_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") +_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + +def parse_makefile(fn, g=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + from distutils.text_file import TextFile + fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1) + + if g is None: + g = {} + done = {} + notdone = {} + + while 1: + line = fp.readline() + if line is None: # eof + break + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = string.strip(v) + if "$" in v: + notdone[n] = v + else: + try: v = string.atoi(v) + except ValueError: pass + done[n] = v + + # do variable interpolation here + while notdone: + for name in notdone.keys(): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m: + n = m.group(1) + if done.has_key(n): + after = value[m.end():] + value = value[:m.start()] + str(done[n]) + after + if "$" in after: + notdone[name] = value + else: + try: value = string.atoi(value) + except ValueError: + done[name] = string.strip(value) + else: + done[name] = value + del notdone[name] + elif notdone.has_key(n): + # get it on a subsequent round + pass + else: + done[n] = "" + after = value[m.end():] + value = value[:m.start()] + after + if "$" in after: + notdone[name] = value + else: + try: value = string.atoi(value) + except ValueError: + done[name] = string.strip(value) + else: + done[name] = value + del notdone[name] + else: + # bogus variable reference; just drop it since we can't deal + del notdone[name] + + fp.close() + + # save the results in the global dictionary + g.update(done) + return g + + +def expand_makefile_vars(s, vars): + """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in + 'string' according to 'vars' (a dictionary mapping variable names to + values). Variables not present in 'vars' are silently expanded to the + empty string. The variable values in 'vars' should not contain further + variable expansions; if 'vars' is the output of 'parse_makefile()', + you're fine. Returns a variable-expanded version of 's'. + """ + + # This algorithm does multiple expansion, so if vars['foo'] contains + # "${bar}", it will expand ${foo} to ${bar}, and then expand + # ${bar}... and so forth. This is fine as long as 'vars' comes from + # 'parse_makefile()', which takes care of such expansions eagerly, + # according to make's variable expansion semantics. + + while 1: + m = _findvar1_rx.search(s) or _findvar2_rx.search(s) + if m: + name = m.group(1) + (beg, end) = m.span() + s = s[0:beg] + vars.get(m.group(1)) + s[end:] + else: + break + return s + + +_config_vars = None + +def _init_posix(): + """Initialize the module as appropriate for POSIX systems.""" + g = {} + # load the installed Makefile: + try: + filename = get_makefile_filename() + parse_makefile(filename, g) + except IOError, msg: + my_msg = "invalid Python installation: unable to open %s" % filename + if hasattr(msg, "strerror"): + my_msg = my_msg + " (%s)" % msg.strerror + + raise DistutilsPlatformError(my_msg) + + + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if python_build: + g['LDSHARED'] = g['BLDSHARED'] + + elif sys.version < '2.1': + # The following two branches are for 1.5.2 compatibility. + if sys.platform == 'aix4': # what about AIX 3.x ? + # Linker script is in the config directory, not in Modules as the + # Makefile says. + python_lib = get_python_lib(standard_lib=1) + ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix') + python_exp = os.path.join(python_lib, 'config', 'python.exp') + + g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp) + + elif sys.platform == 'beos': + # Linker script is in the config directory. In the Makefile it is + # relative to the srcdir, which after installation no longer makes + # sense. + python_lib = get_python_lib(standard_lib=1) + linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0]) + linkerscript = os.path.join(python_lib, 'config', linkerscript_name) + + # XXX this isn't the right place to do this: adding the Python + # library to the link, if needed, should be in the "build_ext" + # command. (It's also needed for non-MS compilers on Windows, and + # it's taken care of for them by the 'build_ext.get_libraries()' + # method.) + g['LDSHARED'] = ("%s -L%s/lib -lpython%s" % + (linkerscript, PREFIX, sys.version[0:3])) + + global _config_vars + _config_vars = g + + +def _init_nt(): + """Initialize the module as appropriate for NT""" + g = {} + # set basic install directories + g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1) + g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1) + + # XXX hmmm.. a normal install puts include files here + g['INCLUDEPY'] = get_python_inc(plat_specific=0) + + g['SO'] = '.pyd' + g['EXE'] = ".exe" + + global _config_vars + _config_vars = g + + +def _init_mac(): + """Initialize the module as appropriate for Macintosh systems""" + g = {} + # set basic install directories + g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1) + g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1) + + # XXX hmmm.. a normal install puts include files here + g['INCLUDEPY'] = get_python_inc(plat_specific=0) + + import MacOS + if not hasattr(MacOS, 'runtimemodel'): + g['SO'] = '.ppc.slb' + else: + g['SO'] = '.%s.slb' % MacOS.runtimemodel + + # XXX are these used anywhere? + g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib") + g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib") + + global _config_vars + _config_vars = g + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. Generally this includes + everything needed to build extensions and install both pure modules and + extensions. On Unix, this means every variable defined in Python's + installed Makefile; on Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _config_vars + if _config_vars is None: + func = globals().get("_init_" + os.name) + if func: + func() + else: + _config_vars = {} + + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # Distutils. + _config_vars['prefix'] = PREFIX + _config_vars['exec_prefix'] = EXEC_PREFIX + + if args: + vals = [] + for name in args: + vals.append(_config_vars.get(name)) + return vals + else: + return _config_vars + +def get_config_var(name): + """Return the value of a single variable using the dictionary + returned by 'get_config_vars()'. Equivalent to + get_config_vars().get(name) + """ + return get_config_vars().get(name) diff --git a/lib-python/2.2/distutils/text_file.py b/lib-python/2.2/distutils/text_file.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/text_file.py @@ -0,0 +1,384 @@ +"""text_file + +provides the TextFile class, which gives an interface to text files +that (optionally) takes care of stripping comments, ignoring blank +lines, and joining lines with backslashes.""" + +# created 1999/01/12, Greg Ward + +__revision__ = "$Id$" + +from types import * +import sys, os, string + + +class TextFile: + + """Provides a file-like object that takes care of all the things you + commonly want to do when processing a text file that has some + line-by-line syntax: strip comments (as long as "#" is your + comment character), skip blank lines, join adjacent lines by + escaping the newline (ie. backslash at end of line), strip + leading and/or trailing whitespace. All of these are optional + and independently controllable. + + Provides a 'warn()' method so you can generate warning messages that + report physical line number, even if the logical line in question + spans multiple physical lines. Also provides 'unreadline()' for + implementing line-at-a-time lookahead. + + Constructor is called as: + + TextFile (filename=None, file=None, **options) + + It bombs (RuntimeError) if both 'filename' and 'file' are None; + 'filename' should be a string, and 'file' a file object (or + something that provides 'readline()' and 'close()' methods). It is + recommended that you supply at least 'filename', so that TextFile + can include it in warning messages. If 'file' is not supplied, + TextFile creates its own using the 'open()' builtin. + + The options are all boolean, and affect the value returned by + 'readline()': + strip_comments [default: true] + strip from "#" to end-of-line, as well as any whitespace + leading up to the "#" -- unless it is escaped by a backslash + lstrip_ws [default: false] + strip leading whitespace from each line before returning it + rstrip_ws [default: true] + strip trailing whitespace (including line terminator!) from + each line before returning it + skip_blanks [default: true} + skip lines that are empty *after* stripping comments and + whitespace. (If both lstrip_ws and rstrip_ws are false, + then some lines may consist of solely whitespace: these will + *not* be skipped, even if 'skip_blanks' is true.) + join_lines [default: false] + if a backslash is the last non-newline character on a line + after stripping comments and whitespace, join the following line + to it to form one "logical line"; if N consecutive lines end + with a backslash, then N+1 physical lines will be joined to + form one logical line. + collapse_join [default: false] + strip leading whitespace from lines that are joined to their + predecessor; only matters if (join_lines and not lstrip_ws) + + Note that since 'rstrip_ws' can strip the trailing newline, the + semantics of 'readline()' must differ from those of the builtin file + object's 'readline()' method! In particular, 'readline()' returns + None for end-of-file: an empty string might just be a blank line (or + an all-whitespace line), if 'rstrip_ws' is true but 'skip_blanks' is + not.""" + + default_options = { 'strip_comments': 1, + 'skip_blanks': 1, + 'lstrip_ws': 0, + 'rstrip_ws': 1, + 'join_lines': 0, + 'collapse_join': 0, + } + + def __init__ (self, filename=None, file=None, **options): + """Construct a new TextFile object. At least one of 'filename' + (a string) and 'file' (a file-like object) must be supplied. + They keyword argument options are described above and affect + the values returned by 'readline()'.""" + + if filename is None and file is None: + raise RuntimeError, \ + "you must supply either or both of 'filename' and 'file'" + + # set values for all options -- either from client option hash + # or fallback to default_options + for opt in self.default_options.keys(): + if options.has_key (opt): + setattr (self, opt, options[opt]) + + else: + setattr (self, opt, self.default_options[opt]) + + # sanity check client option hash + for opt in options.keys(): + if not self.default_options.has_key (opt): + raise KeyError, "invalid TextFile option '%s'" % opt + + if file is None: + self.open (filename) + else: + self.filename = filename + self.file = file + self.current_line = 0 # assuming that file is at BOF! + + # 'linebuf' is a stack of lines that will be emptied before we + # actually read from the file; it's only populated by an + # 'unreadline()' operation + self.linebuf = [] + + + def open (self, filename): + """Open a new file named 'filename'. This overrides both the + 'filename' and 'file' arguments to the constructor.""" + + self.filename = filename + self.file = open (self.filename, 'r') + self.current_line = 0 + + + def close (self): + """Close the current file and forget everything we know about it + (filename, current line number).""" + + self.file.close () + self.file = None + self.filename = None + self.current_line = None + + + def gen_error (self, msg, line=None): + outmsg = [] + if line is None: + line = self.current_line + outmsg.append(self.filename + ", ") + if type (line) in (ListType, TupleType): + outmsg.append("lines %d-%d: " % tuple (line)) + else: + outmsg.append("line %d: " % line) + outmsg.append(str(msg)) + return string.join(outmsg, "") + + + def error (self, msg, line=None): + raise ValueError, "error: " + self.gen_error(msg, line) + + def warn (self, msg, line=None): + """Print (to stderr) a warning message tied to the current logical + line in the current file. If the current logical line in the + file spans multiple physical lines, the warning refers to the + whole range, eg. "lines 3-5". If 'line' supplied, it overrides + the current line number; it may be a list or tuple to indicate a + range of physical lines, or an integer for a single physical + line.""" + sys.stderr.write("warning: " + self.gen_error(msg, line) + "\n") + + + def readline (self): + """Read and return a single logical line from the current file (or + from an internal buffer if lines have previously been "unread" + with 'unreadline()'). If the 'join_lines' option is true, this + may involve reading multiple physical lines concatenated into a + single string. Updates the current line number, so calling + 'warn()' after 'readline()' emits a warning about the physical + line(s) just read. Returns None on end-of-file, since the empty + string can occur if 'rstrip_ws' is true but 'strip_blanks' is + not.""" + + # If any "unread" lines waiting in 'linebuf', return the top + # one. (We don't actually buffer read-ahead data -- lines only + # get put in 'linebuf' if the client explicitly does an + # 'unreadline()'. + if self.linebuf: + line = self.linebuf[-1] + del self.linebuf[-1] + return line + + buildup_line = '' + + while 1: + # read the line, make it None if EOF + line = self.file.readline() + if line == '': line = None + + if self.strip_comments and line: + + # Look for the first "#" in the line. If none, never + # mind. If we find one and it's the first character, or + # is not preceded by "\", then it starts a comment -- + # strip the comment, strip whitespace before it, and + # carry on. Otherwise, it's just an escaped "#", so + # unescape it (and any other escaped "#"'s that might be + # lurking in there) and otherwise leave the line alone. + + pos = string.find (line, "#") + if pos == -1: # no "#" -- no comments + pass + + # It's definitely a comment -- either "#" is the first + # character, or it's elsewhere and unescaped. + elif pos == 0 or line[pos-1] != "\\": + # Have to preserve the trailing newline, because it's + # the job of a later step (rstrip_ws) to remove it -- + # and if rstrip_ws is false, we'd better preserve it! + # (NB. this means that if the final line is all comment + # and has no trailing newline, we will think that it's + # EOF; I think that's OK.) + eol = (line[-1] == '\n') and '\n' or '' + line = line[0:pos] + eol + + # If all that's left is whitespace, then skip line + # *now*, before we try to join it to 'buildup_line' -- + # that way constructs like + # hello \\ + # # comment that should be ignored + # there + # result in "hello there". + if string.strip(line) == "": + continue + + else: # it's an escaped "#" + line = string.replace (line, "\\#", "#") + + + # did previous line end with a backslash? then accumulate + if self.join_lines and buildup_line: + # oops: end of file + if line is None: + self.warn ("continuation line immediately precedes " + "end-of-file") + return buildup_line + + if self.collapse_join: + line = string.lstrip (line) + line = buildup_line + line + + # careful: pay attention to line number when incrementing it + if type (self.current_line) is ListType: + self.current_line[1] = self.current_line[1] + 1 + else: + self.current_line = [self.current_line, + self.current_line+1] + # just an ordinary line, read it as usual + else: + if line is None: # eof + return None + + # still have to be careful about incrementing the line number! + if type (self.current_line) is ListType: + self.current_line = self.current_line[1] + 1 + else: + self.current_line = self.current_line + 1 + + + # strip whitespace however the client wants (leading and + # trailing, or one or the other, or neither) + if self.lstrip_ws and self.rstrip_ws: + line = string.strip (line) + elif self.lstrip_ws: + line = string.lstrip (line) + elif self.rstrip_ws: + line = string.rstrip (line) + + # blank line (whether we rstrip'ed or not)? skip to next line + # if appropriate + if (line == '' or line == '\n') and self.skip_blanks: + continue + + if self.join_lines: + if line[-1] == '\\': + buildup_line = line[:-1] + continue + + if line[-2:] == '\\\n': + buildup_line = line[0:-2] + '\n' + continue + + # well, I guess there's some actual content there: return it + return line + + # readline () + + + def readlines (self): + """Read and return the list of all logical lines remaining in the + current file.""" + + lines = [] + while 1: + line = self.readline() + if line is None: + return lines + lines.append (line) + + + def unreadline (self, line): + """Push 'line' (a string) onto an internal buffer that will be + checked by future 'readline()' calls. Handy for implementing + a parser with line-at-a-time lookahead.""" + + self.linebuf.append (line) + + +if __name__ == "__main__": + test_data = """# test file + +line 3 \\ +# intervening comment + continues on next line +""" + # result 1: no fancy options + result1 = map (lambda x: x + "\n", string.split (test_data, "\n")[0:-1]) + + # result 2: just strip comments + result2 = ["\n", + "line 3 \\\n", + " continues on next line\n"] + + # result 3: just strip blank lines + result3 = ["# test file\n", + "line 3 \\\n", + "# intervening comment\n", + " continues on next line\n"] + + # result 4: default, strip comments, blank lines, and trailing whitespace + result4 = ["line 3 \\", + " continues on next line"] + + # result 5: strip comments and blanks, plus join lines (but don't + # "collapse" joined lines + result5 = ["line 3 continues on next line"] + + # result 6: strip comments and blanks, plus join lines (and + # "collapse" joined lines + result6 = ["line 3 continues on next line"] + + def test_input (count, description, file, expected_result): + result = file.readlines () + # result = string.join (result, '') + if result == expected_result: + print "ok %d (%s)" % (count, description) + else: + print "not ok %d (%s):" % (count, description) + print "** expected:" + print expected_result + print "** received:" + print result + + + filename = "test.txt" + out_file = open (filename, "w") + out_file.write (test_data) + out_file.close () + + in_file = TextFile (filename, strip_comments=0, skip_blanks=0, + lstrip_ws=0, rstrip_ws=0) + test_input (1, "no processing", in_file, result1) + + in_file = TextFile (filename, strip_comments=1, skip_blanks=0, + lstrip_ws=0, rstrip_ws=0) + test_input (2, "strip comments", in_file, result2) + + in_file = TextFile (filename, strip_comments=0, skip_blanks=1, + lstrip_ws=0, rstrip_ws=0) + test_input (3, "strip blanks", in_file, result3) + + in_file = TextFile (filename) + test_input (4, "default processing", in_file, result4) + + in_file = TextFile (filename, strip_comments=1, skip_blanks=1, + join_lines=1, rstrip_ws=1) + test_input (5, "join lines without collapsing", in_file, result5) + + in_file = TextFile (filename, strip_comments=1, skip_blanks=1, + join_lines=1, rstrip_ws=1, collapse_join=1) + test_input (6, "join lines with collapsing", in_file, result6) + + os.remove (filename) diff --git a/lib-python/2.2/distutils/unixccompiler.py b/lib-python/2.2/distutils/unixccompiler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/unixccompiler.py @@ -0,0 +1,308 @@ +"""distutils.unixccompiler + +Contains the UnixCCompiler class, a subclass of CCompiler that handles +the "typical" Unix-style command-line C compiler: + * macros defined with -Dname[=value] + * macros undefined with -Uname + * include search directories specified with -Idir + * libraries specified with -lllib + * library search directories specified with -Ldir + * compile handled by 'cc' (or similar) executable with -c option: + compiles .c to .o + * link static library handled by 'ar' command (possibly with 'ranlib') + * link shared library handled by 'cc -shared' +""" + +# created 1999/07/05, Greg Ward + +__revision__ = "$Id$" + +import string, re, os, sys +from types import * +from copy import copy +from distutils import sysconfig +from distutils.dep_util import newer +from distutils.ccompiler import \ + CCompiler, gen_preprocess_options, gen_lib_options +from distutils.errors import \ + DistutilsExecError, CompileError, LibError, LinkError + +# XXX Things not currently handled: +# * optimization/debug/warning flags; we just use whatever's in Python's +# Makefile and live with it. Is this adequate? If not, we might +# have to have a bunch of subclasses GNUCCompiler, SGICCompiler, +# SunCCompiler, and I suspect down that road lies madness. +# * even if we don't know a warning flag from an optimization flag, +# we need some way for outsiders to feed preprocessor/compiler/linker +# flags in to us -- eg. a sysadmin might want to mandate certain flags +# via a site config file, or a user might want to set something for +# compiling this module distribution only via the setup.py command +# line, whatever. As long as these options come from something on the +# current system, they can be as system-dependent as they like, and we +# should just happily stuff them into the preprocessor/compiler/linker +# options and carry on. + + +class UnixCCompiler (CCompiler): + + compiler_type = 'unix' + + # These are used by CCompiler in two places: the constructor sets + # instance attributes 'preprocessor', 'compiler', etc. from them, and + # 'set_executable()' allows any of these to be set. The defaults here + # are pretty generic; they will probably have to be set by an outsider + # (eg. using information discovered by the sysconfig about building + # Python extensions). + executables = {'preprocessor' : None, + 'compiler' : ["cc"], + 'compiler_so' : ["cc"], + 'linker_so' : ["cc", "-shared"], + 'linker_exe' : ["cc"], + 'archiver' : ["ar", "-cr"], + 'ranlib' : None, + } + + if sys.platform[:6] == "darwin": + executables['ranlib'] = ["ranlib"] + + # Needed for the filename generation methods provided by the base + # class, CCompiler. NB. whoever instantiates/uses a particular + # UnixCCompiler instance should set 'shared_lib_ext' -- we set a + # reasonable common default here, but it's not necessarily used on all + # Unices! + + src_extensions = [".c",".C",".cc",".cxx",".cpp",".m"] + obj_extension = ".o" + static_lib_extension = ".a" + shared_lib_extension = ".so" + dylib_lib_extension = ".dylib" + static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s" + + + + def __init__ (self, + verbose=0, + dry_run=0, + force=0): + CCompiler.__init__ (self, verbose, dry_run, force) + + + def preprocess (self, + source, + output_file=None, + macros=None, + include_dirs=None, + extra_preargs=None, + extra_postargs=None): + + (_, macros, include_dirs) = \ + self._fix_compile_args(None, macros, include_dirs) + pp_opts = gen_preprocess_options(macros, include_dirs) + pp_args = self.preprocessor + pp_opts + if output_file: + pp_args.extend(['-o', output_file]) + if extra_preargs: + pp_args[:0] = extra_preargs + if extra_postargs: + pp_args.extend(extra_postargs) + + # We need to preprocess: either we're being forced to, or we're + # generating output to stdout, or there's a target output file and + # the source file is newer than the target (or the target doesn't + # exist). + if self.force or output_file is None or newer(source, output_file): + if output_file: + self.mkpath(os.path.dirname(output_file)) + try: + self.spawn(pp_args) + except DistutilsExecError, msg: + raise CompileError, msg + + + def compile (self, + sources, + output_dir=None, + macros=None, + include_dirs=None, + debug=0, + extra_preargs=None, + extra_postargs=None): + + (output_dir, macros, include_dirs) = \ + self._fix_compile_args(output_dir, macros, include_dirs) + (objects, skip_sources) = self._prep_compile(sources, output_dir) + + # Figure out the options for the compiler command line. + pp_opts = gen_preprocess_options(macros, include_dirs) + cc_args = pp_opts + ['-c'] + if debug: + cc_args[:0] = ['-g'] + if extra_preargs: + cc_args[:0] = extra_preargs + if extra_postargs is None: + extra_postargs = [] + + # Compile all source files that weren't eliminated by + # '_prep_compile()'. + for i in range(len(sources)): + src = sources[i] ; obj = objects[i] + if skip_sources[src]: + self.announce("skipping %s (%s up-to-date)" % (src, obj)) + else: + self.mkpath(os.path.dirname(obj)) + try: + self.spawn(self.compiler_so + cc_args + + [src, '-o', obj] + + extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + + # Return *all* object filenames, not just the ones we just built. + return objects + + # compile () + + + def create_static_lib (self, + objects, + output_libname, + output_dir=None, + debug=0): + + (objects, output_dir) = self._fix_object_args(objects, output_dir) + + output_filename = \ + self.library_filename(output_libname, output_dir=output_dir) + + if self._need_link(objects, output_filename): + self.mkpath(os.path.dirname(output_filename)) + self.spawn(self.archiver + + [output_filename] + + objects + self.objects) + + # Not many Unices required ranlib anymore -- SunOS 4.x is, I + # think the only major Unix that does. Maybe we need some + # platform intelligence here to skip ranlib if it's not + # needed -- or maybe Python's configure script took care of + # it for us, hence the check for leading colon. + if self.ranlib: + try: + self.spawn(self.ranlib + [output_filename]) + except DistutilsExecError, msg: + raise LibError, msg + else: + self.announce("skipping %s (up-to-date)" % output_filename) + + # create_static_lib () + + + def link (self, + target_desc, + objects, + output_filename, + output_dir=None, + libraries=None, + library_dirs=None, + runtime_library_dirs=None, + export_symbols=None, + debug=0, + extra_preargs=None, + extra_postargs=None, + build_temp=None): + + (objects, output_dir) = self._fix_object_args(objects, output_dir) + (libraries, library_dirs, runtime_library_dirs) = \ + self._fix_lib_args(libraries, library_dirs, runtime_library_dirs) + + lib_opts = gen_lib_options(self, + library_dirs, runtime_library_dirs, + libraries) + if type(output_dir) not in (StringType, NoneType): + raise TypeError, "'output_dir' must be a string or None" + if output_dir is not None: + output_filename = os.path.join(output_dir, output_filename) + + if self._need_link(objects, output_filename): + ld_args = (objects + self.objects + + lib_opts + ['-o', output_filename]) + if debug: + ld_args[:0] = ['-g'] + if extra_preargs: + ld_args[:0] = extra_preargs + if extra_postargs: + ld_args.extend(extra_postargs) + self.mkpath(os.path.dirname(output_filename)) + try: + if target_desc == CCompiler.EXECUTABLE: + self.spawn(self.linker_exe + ld_args) + else: + self.spawn(self.linker_so + ld_args) + except DistutilsExecError, msg: + raise LinkError, msg + else: + self.announce("skipping %s (up-to-date)" % output_filename) + + # link () + + + # -- Miscellaneous methods ----------------------------------------- + # These are all used by the 'gen_lib_options() function, in + # ccompiler.py. + + def library_dir_option (self, dir): + return "-L" + dir + + def runtime_library_dir_option (self, dir): + # XXX Hackish, at the very least. See Python bug #445902: + # http://sourceforge.net/tracker/index.php + # ?func=detail&aid=445902&group_id=5470&atid=105470 + # Linkers on different platforms need different options to + # specify that directories need to be added to the list of + # directories searched for dependencies when a dynamic library + # is sought. GCC has to be told to pass the -R option through + # to the linker, whereas other compilers just know this. + # Other compilers may need something slightly different. At + # this time, there's no way to determine this information from + # the configuration data stored in the Python installation, so + # we use this hack. + compiler = os.path.basename(sysconfig.get_config_var("CC")) + if sys.platform[:6] == "darwin": + # MacOSX's linker doesn't understand the -R flag at all + return "-L" + dir + if compiler == "gcc" or compiler == "g++": + return "-Wl,-R" + dir + else: + return "-R" + dir + + def library_option (self, lib): + return "-l" + lib + + + def find_library_file (self, dirs, lib, debug=0): + + for dir in dirs: + shared = os.path.join( + dir, self.library_filename(lib, lib_type='shared')) + dylib = os.path.join( + dir, self.library_filename(lib, lib_type='dylib')) + static = os.path.join( + dir, self.library_filename(lib, lib_type='static')) + + # We're second-guessing the linker here, with not much hard + # data to go on: GCC seems to prefer the shared library, so I'm + # assuming that *all* Unix C compilers do. And of course I'm + # ignoring even GCC's "-static" option. So sue me. + if os.path.exists(dylib): + return dylib + elif os.path.exists(shared): + return shared + elif os.path.exists(static): + return static + + else: + # Oops, didn't find it in *any* of 'dirs' + return None + + # find_library_file () + +# class UnixCCompiler diff --git a/lib-python/2.2/distutils/util.py b/lib-python/2.2/distutils/util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/util.py @@ -0,0 +1,458 @@ +"""distutils.util + +Miscellaneous utility functions -- anything that doesn't fit into +one of the other *util.py modules. +""" + +# created 1999/03/08, Greg Ward + +__revision__ = "$Id$" + +import sys, os, string, re +from distutils.errors import DistutilsPlatformError +from distutils.dep_util import newer +from distutils.spawn import spawn + + +def get_platform (): + """Return a string that identifies the current platform. This is used + mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + For non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + + (osname, host, release, version, machine) = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = string.lower(osname) + osname = string.replace(osname, '/', '') + machine = string.replace(machine, ' ', '_') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile (r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + + return "%s-%s-%s" % (osname, release, machine) + +# get_platform () + + +def convert_path (pathname): + """Return 'pathname' as a name that will work on the native filesystem, + i.e. split it on '/' and put it back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError, "path '%s' cannot be absolute" % pathname + if pathname[-1] == '/': + raise ValueError, "path '%s' cannot end with '/'" % pathname + + paths = string.split(pathname, '/') + while '.' in paths: + paths.remove('.') + if not paths: + return os.curdir + return apply(os.path.join, paths) + +# convert_path () + + +def change_root (new_root, pathname): + """Return 'pathname' with 'new_root' prepended. If 'pathname' is + relative, this is equivalent to "os.path.join(new_root,pathname)". + Otherwise, it requires making 'pathname' relative and then joining the + two, which is tricky on DOS/Windows and Mac OS. + """ + if os.name == 'posix': + if not os.path.isabs(pathname): + return os.path.join(new_root, pathname) + else: + return os.path.join(new_root, pathname[1:]) + + elif os.name == 'nt': + (drive, path) = os.path.splitdrive(pathname) + if path[0] == '\\': + path = path[1:] + return os.path.join(new_root, path) + + elif os.name == 'mac': + if not os.path.isabs(pathname): + return os.path.join(new_root, pathname) + else: + # Chop off volume name from start of path + elements = string.split(pathname, ":", 1) + pathname = ":" + elements[1] + return os.path.join(new_root, pathname) + + else: + raise DistutilsPlatformError, \ + "nothing known about platform '%s'" % os.name + + +_environ_checked = 0 +def check_environ (): + """Ensure that 'os.environ' has all the environment variables we + guarantee that users can use in config files, command-line options, + etc. Currently this includes: + HOME - user's home directory (Unix only) + PLAT - description of the current platform, including hardware + and OS (see 'get_platform()') + """ + global _environ_checked + if _environ_checked: + return + + if os.name == 'posix' and not os.environ.has_key('HOME'): + import pwd + os.environ['HOME'] = pwd.getpwuid(os.getuid())[5] + + if not os.environ.has_key('PLAT'): + os.environ['PLAT'] = get_platform() + + _environ_checked = 1 + + +def subst_vars (s, local_vars): + """Perform shell/Perl-style variable substitution on 'string'. Every + occurrence of '$' followed by a name is considered a variable, and + variable is substituted by the value found in the 'local_vars' + dictionary, or in 'os.environ' if it's not in 'local_vars'. + 'os.environ' is first checked/augmented to guarantee that it contains + certain values: see 'check_environ()'. Raise ValueError for any + variables not found in either 'local_vars' or 'os.environ'. + """ + check_environ() + def _subst (match, local_vars=local_vars): + var_name = match.group(1) + if local_vars.has_key(var_name): + return str(local_vars[var_name]) + else: + return os.environ[var_name] + + try: + return re.sub(r'\$([a-zA-Z_][a-zA-Z_0-9]*)', _subst, s) + except KeyError, var: + raise ValueError, "invalid variable '$%s'" % var + +# subst_vars () + + +def grok_environment_error (exc, prefix="error: "): + """Generate a useful error message from an EnvironmentError (IOError or + OSError) exception object. Handles Python 1.5.1 and 1.5.2 styles, and + does what it can to deal with exception objects that don't have a + filename (which happens when the error is due to a two-file operation, + such as 'rename()' or 'link()'. Returns the error message as a string + prefixed with 'prefix'. + """ + # check for Python 1.5.2-style {IO,OS}Error exception objects + if hasattr(exc, 'filename') and hasattr(exc, 'strerror'): + if exc.filename: + error = prefix + "%s: %s" % (exc.filename, exc.strerror) + else: + # two-argument functions in posix module don't + # include the filename in the exception object! + error = prefix + "%s" % exc.strerror + else: + error = prefix + str(exc[-1]) + + return error + + +# Needed by 'split_quoted()' +_wordchars_re = re.compile(r'[^\\\'\"%s ]*' % string.whitespace) +_squote_re = re.compile(r"'(?:[^'\\]|\\.)*'") +_dquote_re = re.compile(r'"(?:[^"\\]|\\.)*"') + +def split_quoted (s): + """Split a string up according to Unix shell-like rules for quotes and + backslashes. In short: words are delimited by spaces, as long as those + spaces are not escaped by a backslash, or inside a quoted string. + Single and double quotes are equivalent, and the quote characters can + be backslash-escaped. The backslash is stripped from any two-character + escape sequence, leaving only the escaped character. The quote + characters are stripped from any quoted string. Returns a list of + words. + """ + + # This is a nice algorithm for splitting up a single string, since it + # doesn't require character-by-character examination. It was a little + # bit of a brain-bender to get it working right, though... + + s = string.strip(s) + words = [] + pos = 0 + + while s: + m = _wordchars_re.match(s, pos) + end = m.end() + if end == len(s): + words.append(s[:end]) + break + + if s[end] in string.whitespace: # unescaped, unquoted whitespace: now + words.append(s[:end]) # we definitely have a word delimiter + s = string.lstrip(s[end:]) + pos = 0 + + elif s[end] == '\\': # preserve whatever is being escaped; + # will become part of the current word + s = s[:end] + s[end+1:] + pos = end+1 + + else: + if s[end] == "'": # slurp singly-quoted string + m = _squote_re.match(s, end) + elif s[end] == '"': # slurp doubly-quoted string + m = _dquote_re.match(s, end) + else: + raise RuntimeError, \ + "this can't happen (bad char '%c')" % s[end] + + if m is None: + raise ValueError, \ + "bad string (mismatched %s quotes?)" % s[end] + + (beg, end) = m.span() + s = s[:beg] + s[beg+1:end-1] + s[end:] + pos = m.end() - 2 + + if pos >= len(s): + words.append(s) + break + + return words + +# split_quoted () + + +def execute (func, args, msg=None, verbose=0, dry_run=0): + """Perform some action that affects the outside world (eg. by writing + to the filesystem). Such actions are special because they are disabled + by the 'dry_run' flag, and announce themselves if 'verbose' is true. + This method takes care of all that bureaucracy for you; all you have to + do is supply the function to call and an argument tuple for it (to + embody the "external action" being performed), and an optional message + to print. + """ + # Generate a message if we weren't passed one + if msg is None: + msg = "%s%s" % (func.__name__, `args`) + if msg[-2:] == ',)': # correct for singleton tuple + msg = msg[0:-2] + ')' + + # Print it if verbosity level is high enough + if verbose: + print msg + + # And do it, as long as we're not in dry-run mode + if not dry_run: + apply(func, args) + +# execute() + + +def strtobool (val): + """Convert a string representation of truth to true (1) or false (0). + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + """ + val = string.lower(val) + if val in ('y', 'yes', 't', 'true', 'on', '1'): + return 1 + elif val in ('n', 'no', 'f', 'false', 'off', '0'): + return 0 + else: + raise ValueError, "invalid truth value %s" % `val` + + +def byte_compile (py_files, + optimize=0, force=0, + prefix=None, base_dir=None, + verbose=1, dry_run=0, + direct=None): + """Byte-compile a collection of Python source files to either .pyc + or .pyo files in the same directory. 'py_files' is a list of files + to compile; any files that don't end in ".py" are silently skipped. + 'optimize' must be one of the following: + 0 - don't optimize (generate .pyc) + 1 - normal optimization (like "python -O") + 2 - extra optimization (like "python -OO") + If 'force' is true, all files are recompiled regardless of + timestamps. + + The source filename encoded in each bytecode file defaults to the + filenames listed in 'py_files'; you can modify these with 'prefix' and + 'basedir'. 'prefix' is a string that will be stripped off of each + source filename, and 'base_dir' is a directory name that will be + prepended (after 'prefix' is stripped). You can supply either or both + (or neither) of 'prefix' and 'base_dir', as you wish. + + If 'verbose' is true, prints out a report of each file. If 'dry_run' + is true, doesn't actually do anything that would affect the filesystem. + + Byte-compilation is either done directly in this interpreter process + with the standard py_compile module, or indirectly by writing a + temporary script and executing it. Normally, you should let + 'byte_compile()' figure out to use direct compilation or not (see + the source for details). The 'direct' flag is used by the script + generated in indirect mode; unless you know what you're doing, leave + it set to None. + """ + + # First, if the caller didn't force us into direct or indirect mode, + # figure out which mode we should be in. We take a conservative + # approach: choose direct mode *only* if the current interpreter is + # in debug mode and optimize is 0. If we're not in debug mode (-O + # or -OO), we don't know which level of optimization this + # interpreter is running with, so we can't do direct + # byte-compilation and be certain that it's the right thing. Thus, + # always compile indirectly if the current interpreter is in either + # optimize mode, or if either optimization level was requested by + # the caller. + if direct is None: + direct = (__debug__ and optimize == 0) + + # "Indirect" byte-compilation: write a temporary script and then + # run it with the appropriate flags. + if not direct: + from tempfile import mktemp + script_name = mktemp(".py") + if verbose: + print "writing byte-compilation script '%s'" % script_name + if not dry_run: + script = open(script_name, "w") + + script.write("""\ +from distutils.util import byte_compile +files = [ +""") + + # XXX would be nice to write absolute filenames, just for + # safety's sake (script should be more robust in the face of + # chdir'ing before running it). But this requires abspath'ing + # 'prefix' as well, and that breaks the hack in build_lib's + # 'byte_compile()' method that carefully tacks on a trailing + # slash (os.sep really) to make sure the prefix here is "just + # right". This whole prefix business is rather delicate -- the + # problem is that it's really a directory, but I'm treating it + # as a dumb string, so trailing slashes and so forth matter. + + #py_files = map(os.path.abspath, py_files) + #if prefix: + # prefix = os.path.abspath(prefix) + + script.write(string.join(map(repr, py_files), ",\n") + "]\n") + script.write(""" +byte_compile(files, optimize=%s, force=%s, + prefix=%s, base_dir=%s, + verbose=%s, dry_run=0, + direct=1) +""" % (`optimize`, `force`, `prefix`, `base_dir`, `verbose`)) + + script.close() + + cmd = [sys.executable, script_name] + if optimize == 1: + cmd.insert(1, "-O") + elif optimize == 2: + cmd.insert(1, "-OO") + spawn(cmd, verbose=verbose, dry_run=dry_run) + execute(os.remove, (script_name,), "removing %s" % script_name, + verbose=verbose, dry_run=dry_run) + + # "Direct" byte-compilation: use the py_compile module to compile + # right here, right now. Note that the script generated in indirect + # mode simply calls 'byte_compile()' in direct mode, a weird sort of + # cross-process recursion. Hey, it works! + else: + from py_compile import compile + + for file in py_files: + if file[-3:] != ".py": + # This lets us be lazy and not filter filenames in + # the "install_lib" command. + continue + + # Terminology from the py_compile module: + # cfile - byte-compiled file + # dfile - purported source filename (same as 'file' by default) + cfile = file + (__debug__ and "c" or "o") + dfile = file + if prefix: + if file[:len(prefix)] != prefix: + raise ValueError, \ + ("invalid prefix: filename %s doesn't start with %s" + % (`file`, `prefix`)) + dfile = dfile[len(prefix):] + if base_dir: + dfile = os.path.join(base_dir, dfile) + + cfile_base = os.path.basename(cfile) + if direct: + if force or newer(file, cfile): + if verbose: + print "byte-compiling %s to %s" % (file, cfile_base) + if not dry_run: + compile(file, cfile, dfile) + else: + if verbose: + print "skipping byte-compilation of %s to %s" % \ + (file, cfile_base) + +# byte_compile () + +def rfc822_escape (header): + """Return a version of the string escaped for inclusion in an + RFC-822 header, by ensuring there are 8 spaces space after each newline. + """ + lines = string.split(header, '\n') + lines = map(string.strip, lines) + header = string.join(lines, '\n' + 8*' ') + return header diff --git a/lib-python/2.2/distutils/version.py b/lib-python/2.2/distutils/version.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/distutils/version.py @@ -0,0 +1,301 @@ +# +# distutils/version.py +# +# Implements multiple version numbering conventions for the +# Python Module Distribution Utilities. +# +# written by Greg Ward, 1998/12/17 +# +# $Id$ +# + +"""Provides classes to represent module version numbers (one class for +each style of version numbering). There are currently two such classes +implemented: StrictVersion and LooseVersion. + +Every version number class implements the following interface: + * the 'parse' method takes a string and parses it to some internal + representation; if the string is an invalid version number, + 'parse' raises a ValueError exception + * the class constructor takes an optional string argument which, + if supplied, is passed to 'parse' + * __str__ reconstructs the string that was passed to 'parse' (or + an equivalent string -- ie. one that will generate an equivalent + version number instance) + * __repr__ generates Python code to recreate the version number instance + * __cmp__ compares the current instance with either another instance + of the same class or a string (which will be parsed to an instance + of the same class, thus must follow the same rules) +""" + +import string, re +from types import StringType + +class Version: + """Abstract base class for version numbering classes. Just provides + constructor (__init__) and reproducer (__repr__), because those + seem to be the same for all version numbering classes. + """ + + def __init__ (self, vstring=None): + if vstring: + self.parse(vstring) + + def __repr__ (self): + return "%s ('%s')" % (self.__class__.__name__, str(self)) + + +# Interface for version-number classes -- must be implemented +# by the following classes (the concrete ones -- Version should +# be treated as an abstract class). +# __init__ (string) - create and take same action as 'parse' +# (string parameter is optional) +# parse (string) - convert a string representation to whatever +# internal representation is appropriate for +# this style of version numbering +# __str__ (self) - convert back to a string; should be very similar +# (if not identical to) the string supplied to parse +# __repr__ (self) - generate Python code to recreate +# the instance +# __cmp__ (self, other) - compare two version numbers ('other' may +# be an unparsed version string, or another +# instance of your version class) + + +class StrictVersion (Version): + + """Version numbering for anal retentives and software idealists. + Implements the standard interface for version number classes as + described above. A version number consists of two or three + dot-separated numeric components, with an optional "pre-release" tag + on the end. The pre-release tag consists of the letter 'a' or 'b' + followed by a number. If the numeric components of two version + numbers are equal, then one with a pre-release tag will always + be deemed earlier (lesser) than one without. + + The following are valid version numbers (shown in the order that + would be obtained by sorting according to the supplied cmp function): + + 0.4 0.4.0 (these two are equivalent) + 0.4.1 + 0.5a1 + 0.5b3 + 0.5 + 0.9.6 + 1.0 + 1.0.4a3 + 1.0.4b1 + 1.0.4 + + The following are examples of invalid version numbers: + + 1 + 2.7.2.2 + 1.3.a4 + 1.3pl1 + 1.3c4 + + The rationale for this version numbering system will be explained + in the distutils documentation. + """ + + version_re = re.compile(r'^(\d+) \. (\d+) (\. (\d+))? ([ab](\d+))?$', + re.VERBOSE) + + + def parse (self, vstring): + match = self.version_re.match(vstring) + if not match: + raise ValueError, "invalid version number '%s'" % vstring + + (major, minor, patch, prerelease, prerelease_num) = \ + match.group(1, 2, 4, 5, 6) + + if patch: + self.version = tuple(map(string.atoi, [major, minor, patch])) + else: + self.version = tuple(map(string.atoi, [major, minor]) + [0]) + + if prerelease: + self.prerelease = (prerelease[0], string.atoi(prerelease_num)) + else: + self.prerelease = None + + + def __str__ (self): + + if self.version[2] == 0: + vstring = string.join(map(str, self.version[0:2]), '.') + else: + vstring = string.join(map(str, self.version), '.') + + if self.prerelease: + vstring = vstring + self.prerelease[0] + str(self.prerelease[1]) + + return vstring + + + def __cmp__ (self, other): + if isinstance(other, StringType): + other = StrictVersion(other) + + compare = cmp(self.version, other.version) + if (compare == 0): # have to compare prerelease + + # case 1: neither has prerelease; they're equal + # case 2: self has prerelease, other doesn't; other is greater + # case 3: self doesn't have prerelease, other does: self is greater + # case 4: both have prerelease: must compare them! + + if (not self.prerelease and not other.prerelease): + return 0 + elif (self.prerelease and not other.prerelease): + return -1 + elif (not self.prerelease and other.prerelease): + return 1 + elif (self.prerelease and other.prerelease): + return cmp(self.prerelease, other.prerelease) + + else: # numeric versions don't match -- + return compare # prerelease stuff doesn't matter + + +# end class StrictVersion + + +# The rules according to Greg Stein: +# 1) a version number has 1 or more numbers separate by a period or by +# sequences of letters. If only periods, then these are compared +# left-to-right to determine an ordering. +# 2) sequences of letters are part of the tuple for comparison and are +# compared lexicographically +# 3) recognize the numeric components may have leading zeroes +# +# The LooseVersion class below implements these rules: a version number +# string is split up into a tuple of integer and string components, and +# comparison is a simple tuple comparison. This means that version +# numbers behave in a predictable and obvious way, but a way that might +# not necessarily be how people *want* version numbers to behave. There +# wouldn't be a problem if people could stick to purely numeric version +# numbers: just split on period and compare the numbers as tuples. +# However, people insist on putting letters into their version numbers; +# the most common purpose seems to be: +# - indicating a "pre-release" version +# ('alpha', 'beta', 'a', 'b', 'pre', 'p') +# - indicating a post-release patch ('p', 'pl', 'patch') +# but of course this can't cover all version number schemes, and there's +# no way to know what a programmer means without asking him. +# +# The problem is what to do with letters (and other non-numeric +# characters) in a version number. The current implementation does the +# obvious and predictable thing: keep them as strings and compare +# lexically within a tuple comparison. This has the desired effect if +# an appended letter sequence implies something "post-release": +# eg. "0.99" < "0.99pl14" < "1.0", and "5.001" < "5.001m" < "5.002". +# +# However, if letters in a version number imply a pre-release version, +# the "obvious" thing isn't correct. Eg. you would expect that +# "1.5.1" < "1.5.2a2" < "1.5.2", but under the tuple/lexical comparison +# implemented here, this just isn't so. +# +# Two possible solutions come to mind. The first is to tie the +# comparison algorithm to a particular set of semantic rules, as has +# been done in the StrictVersion class above. This works great as long +# as everyone can go along with bondage and discipline. Hopefully a +# (large) subset of Python module programmers will agree that the +# particular flavour of bondage and discipline provided by StrictVersion +# provides enough benefit to be worth using, and will submit their +# version numbering scheme to its domination. The free-thinking +# anarchists in the lot will never give in, though, and something needs +# to be done to accommodate them. +# +# Perhaps a "moderately strict" version class could be implemented that +# lets almost anything slide (syntactically), and makes some heuristic +# assumptions about non-digits in version number strings. This could +# sink into special-case-hell, though; if I was as talented and +# idiosyncratic as Larry Wall, I'd go ahead and implement a class that +# somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is +# just as happy dealing with things like "2g6" and "1.13++". I don't +# think I'm smart enough to do it right though. +# +# In any case, I've coded the test suite for this module (see +# ../test/test_version.py) specifically to fail on things like comparing +# "1.2a2" and "1.2". That's not because the *code* is doing anything +# wrong, it's because the simple, obvious design doesn't match my +# complicated, hairy expectations for real-world version numbers. It +# would be a snap to fix the test suite to say, "Yep, LooseVersion does +# the Right Thing" (ie. the code matches the conception). But I'd rather +# have a conception that matches common notions about version numbers. + +class LooseVersion (Version): + + """Version numbering for anarchists and software realists. + Implements the standard interface for version number classes as + described above. A version number consists of a series of numbers, + separated by either periods or strings of letters. When comparing + version numbers, the numeric components will be compared + numerically, and the alphabetic components lexically. The following + are all valid version numbers, in no particular order: + + 1.5.1 + 1.5.2b2 + 161 + 3.10a + 8.02 + 3.4j + 1996.07.12 + 3.2.pl0 + 3.1.1.6 + 2g6 + 11g + 0.960923 + 2.2beta29 + 1.13++ + 5.5.kw + 2.0b1pl0 + + In fact, there is no such thing as an invalid version number under + this scheme; the rules for comparison are simple and predictable, + but may not always give the results you want (for some definition + of "want"). + """ + + component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE) + + def __init__ (self, vstring=None): + if vstring: + self.parse(vstring) + + + def parse (self, vstring): + # I've given up on thinking I can reconstruct the version string + # from the parsed tuple -- so I just store the string here for + # use by __str__ + self.vstring = vstring + components = filter(lambda x: x and x != '.', + self.component_re.split(vstring)) + for i in range(len(components)): + try: + components[i] = int(components[i]) + except ValueError: + pass + + self.version = components + + + def __str__ (self): + return self.vstring + + + def __repr__ (self): + return "LooseVersion ('%s')" % str(self) + + + def __cmp__ (self, other): + if isinstance(other, StringType): + other = LooseVersion(other) + + return cmp(self.version, other.version) + + +# end class LooseVersion diff --git a/lib-python/2.2/doctest.py b/lib-python/2.2/doctest.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/doctest.py @@ -0,0 +1,1173 @@ +# Module doctest. +# Released to the public domain 16-Jan-2001, +# by Tim Peters (tim.one at home.com). + +# Provided as-is; use at your own risk; no warranty; no promises; enjoy! + +"""Module doctest -- a framework for running examples in docstrings. + +NORMAL USAGE + +In normal use, end each module M with: + +def _test(): + import doctest, M # replace M with your module's name + return doctest.testmod(M) # ditto + +if __name__ == "__main__": + _test() + +Then running the module as a script will cause the examples in the +docstrings to get executed and verified: + +python M.py + +This won't display anything unless an example fails, in which case the +failing example(s) and the cause(s) of the failure(s) are printed to stdout +(why not stderr? because stderr is a lame hack <0.2 wink>), and the final +line of output is "Test failed.". + +Run it with the -v switch instead: + +python M.py -v + +and a detailed report of all examples tried is printed to stdout, along +with assorted summaries at the end. + +You can force verbose mode by passing "verbose=1" to testmod, or prohibit +it by passing "verbose=0". In either of those cases, sys.argv is not +examined by testmod. + +In any case, testmod returns a 2-tuple of ints (f, t), where f is the +number of docstring examples that failed and t is the total number of +docstring examples attempted. + + +WHICH DOCSTRINGS ARE EXAMINED? + ++ M.__doc__. + ++ f.__doc__ for all functions f in M.__dict__.values(), except those + with private names and those defined in other modules. + ++ C.__doc__ for all classes C in M.__dict__.values(), except those with + private names and those defined in other modules. + ++ If M.__test__ exists and "is true", it must be a dict, and + each entry maps a (string) name to a function object, class object, or + string. Function and class object docstrings found from M.__test__ + are searched even if the name is private, and strings are searched + directly as if they were docstrings. In output, a key K in M.__test__ + appears with name + .__test__.K + +Any classes found are recursively searched similarly, to test docstrings in +their contained methods and nested classes. Private names reached from M's +globals are skipped, but all names reached from M.__test__ are searched. + +By default, a name is considered to be private if it begins with an +underscore (like "_my_func") but doesn't both begin and end with (at least) +two underscores (like "__init__"). You can change the default by passing +your own "isprivate" function to testmod. + +If you want to test docstrings in objects with private names too, stuff +them into an M.__test__ dict, or see ADVANCED USAGE below (e.g., pass your +own isprivate function to Tester's constructor, or call the rundoc method +of a Tester instance). + +WHAT'S THE EXECUTION CONTEXT? + +By default, each time testmod finds a docstring to test, it uses a *copy* +of M's globals (so that running tests on a module doesn't change the +module's real globals, and so that one test in M can't leave behind crumbs +that accidentally allow another test to work). This means examples can +freely use any names defined at top-level in M. It also means that sloppy +imports (see above) can cause examples in external docstrings to use +globals inappropriate for them. + +You can force use of your own dict as the execution context by passing +"globs=your_dict" to testmod instead. Presumably this would be a copy of +M.__dict__ merged with the globals from other imported modules. + + +WHAT IF I WANT TO TEST A WHOLE PACKAGE? + +Piece o' cake, provided the modules do their testing from docstrings. +Here's the test.py I use for the world's most elaborate Rational/ +floating-base-conversion pkg (which I'll distribute some day): + +from Rational import Cvt +from Rational import Format +from Rational import machprec +from Rational import Rat +from Rational import Round +from Rational import utils + +modules = (Cvt, + Format, + machprec, + Rat, + Round, + utils) + +def _test(): + import doctest + import sys + verbose = "-v" in sys.argv + for mod in modules: + doctest.testmod(mod, verbose=verbose, report=0) + doctest.master.summarize() + +if __name__ == "__main__": + _test() + +IOW, it just runs testmod on all the pkg modules. testmod remembers the +names and outcomes (# of failures, # of tries) for each item it's seen, and +passing "report=0" prevents it from printing a summary in verbose mode. +Instead, the summary is delayed until all modules have been tested, and +then "doctest.master.summarize()" forces the summary at the end. + +So this is very nice in practice: each module can be tested individually +with almost no work beyond writing up docstring examples, and collections +of modules can be tested too as a unit with no more work than the above. + + +WHAT ABOUT EXCEPTIONS? + +No problem, as long as the only output generated by the example is the +traceback itself. For example: + + >>> [1, 2, 3].remove(42) + Traceback (most recent call last): + File "", line 1, in ? + ValueError: list.remove(x): x not in list + >>> + +Note that only the exception type and value are compared (specifically, +only the last line in the traceback). + + +ADVANCED USAGE + +doctest.testmod() captures the testing policy I find most useful most +often. You may want other policies. + +testmod() actually creates a local instance of class doctest.Tester, runs +appropriate methods of that class, and merges the results into global +Tester instance doctest.master. + +You can create your own instances of doctest.Tester, and so build your own +policies, or even run methods of doctest.master directly. See +doctest.Tester.__doc__ for details. + + +SO WHAT DOES A DOCSTRING EXAMPLE LOOK LIKE ALREADY!? + +Oh ya. It's easy! In most cases a copy-and-paste of an interactive +console session works fine -- just make sure the leading whitespace is +rigidly consistent (you can mix tabs and spaces if you're too lazy to do it +right, but doctest is not in the business of guessing what you think a tab +means). + + >>> # comments are ignored + >>> x = 12 + >>> x + 12 + >>> if x == 13: + ... print "yes" + ... else: + ... print "no" + ... print "NO" + ... print "NO!!!" + ... + no + NO + NO!!! + >>> + +Any expected output must immediately follow the final ">>>" or "..." line +containing the code, and the expected output (if any) extends to the next +">>>" or all-whitespace line. That's it. + +Bummers: + ++ Expected output cannot contain an all-whitespace line, since such a line + is taken to signal the end of expected output. + ++ Output to stdout is captured, but not output to stderr (exception + tracebacks are captured via a different means). + ++ If you continue a line via backslashing in an interactive session, or for + any other reason use a backslash, you need to double the backslash in the + docstring version. This is simply because you're in a string, and so the + backslash must be escaped for it to survive intact. Like: + +>>> if "yes" == \\ +... "y" + \\ +... "es": # in the source code you'll see the doubled backslashes +... print 'yes' +yes + +The starting column doesn't matter: + +>>> assert "Easy!" + >>> import math + >>> math.floor(1.9) + 1.0 + +and as many leading whitespace characters are stripped from the expected +output as appeared in the initial ">>>" line that triggered it. + +If you execute this very file, the examples above will be found and +executed, leading to this output in verbose mode: + +Running doctest.__doc__ +Trying: [1, 2, 3].remove(42) +Expecting: +Traceback (most recent call last): + File "", line 1, in ? +ValueError: list.remove(x): x not in list +ok +Trying: x = 12 +Expecting: nothing +ok +Trying: x +Expecting: 12 +ok +Trying: +if x == 13: + print "yes" +else: + print "no" + print "NO" + print "NO!!!" +Expecting: +no +NO +NO!!! +ok +... and a bunch more like that, with this summary at the end: + +5 items had no tests: + doctest.Tester.__init__ + doctest.Tester.run__test__ + doctest.Tester.summarize + doctest.run_docstring_examples + doctest.testmod +12 items passed all tests: + 8 tests in doctest + 6 tests in doctest.Tester + 10 tests in doctest.Tester.merge + 14 tests in doctest.Tester.rundict + 3 tests in doctest.Tester.rundoc + 3 tests in doctest.Tester.runstring + 2 tests in doctest.__test__._TestClass + 2 tests in doctest.__test__._TestClass.__init__ + 2 tests in doctest.__test__._TestClass.get + 1 tests in doctest.__test__._TestClass.square + 2 tests in doctest.__test__.string + 7 tests in doctest.is_private +60 tests in 17 items. +60 passed and 0 failed. +Test passed. +""" + +__all__ = [ + 'testmod', + 'run_docstring_examples', + 'is_private', + 'Tester', +] + +import __future__ + +import re +PS1 = ">>>" +PS2 = "..." +_isPS1 = re.compile(r"(\s*)" + re.escape(PS1)).match +_isPS2 = re.compile(r"(\s*)" + re.escape(PS2)).match +_isEmpty = re.compile(r"\s*$").match +_isComment = re.compile(r"\s*#").match +del re + +from types import StringTypes as _StringTypes + +from inspect import isclass as _isclass +from inspect import isfunction as _isfunction +from inspect import ismodule as _ismodule +from inspect import classify_class_attrs as _classify_class_attrs + +# Extract interactive examples from a string. Return a list of triples, +# (source, outcome, lineno). "source" is the source code, and ends +# with a newline iff the source spans more than one line. "outcome" is +# the expected output if any, else an empty string. When not empty, +# outcome always ends with a newline. "lineno" is the line number, +# 0-based wrt the start of the string, of the first source line. + +def _extract_examples(s): + isPS1, isPS2 = _isPS1, _isPS2 + isEmpty, isComment = _isEmpty, _isComment + examples = [] + lines = s.split("\n") + i, n = 0, len(lines) + while i < n: + line = lines[i] + i = i + 1 + m = isPS1(line) + if m is None: + continue + j = m.end(0) # beyond the prompt + if isEmpty(line, j) or isComment(line, j): + # a bare prompt or comment -- not interesting + continue + lineno = i - 1 + if line[j] != " ": + raise ValueError("line " + `lineno` + " of docstring lacks " + "blank after " + PS1 + ": " + line) + j = j + 1 + blanks = m.group(1) + nblanks = len(blanks) + # suck up this and following PS2 lines + source = [] + while 1: + source.append(line[j:]) + line = lines[i] + m = isPS2(line) + if m: + if m.group(1) != blanks: + raise ValueError("inconsistent leading whitespace " + "in line " + `i` + " of docstring: " + line) + i = i + 1 + else: + break + if len(source) == 1: + source = source[0] + else: + # get rid of useless null line from trailing empty "..." + if source[-1] == "": + del source[-1] + source = "\n".join(source) + "\n" + # suck up response + if isPS1(line) or isEmpty(line): + expect = "" + else: + expect = [] + while 1: + if line[:nblanks] != blanks: + raise ValueError("inconsistent leading whitespace " + "in line " + `i` + " of docstring: " + line) + expect.append(line[nblanks:]) + i = i + 1 + line = lines[i] + if isPS1(line) or isEmpty(line): + break + expect = "\n".join(expect) + "\n" + examples.append( (source, expect, lineno) ) + return examples + +# Capture stdout when running examples. + +class _SpoofOut: + def __init__(self): + self.clear() + def write(self, s): + self.buf.append(s) + def get(self): + guts = "".join(self.buf) + # If anything at all was written, make sure there's a trailing + # newline. There's no way for the expected output to indicate + # that a trailing newline is missing. + if guts and not guts.endswith("\n"): + guts = guts + "\n" + # Prevent softspace from screwing up the next test case, in + # case they used print with a trailing comma in an example. + if hasattr(self, "softspace"): + del self.softspace + return guts + def clear(self): + self.buf = [] + if hasattr(self, "softspace"): + del self.softspace + def flush(self): + # JPython calls flush + pass + +# Display some tag-and-msg pairs nicely, keeping the tag and its msg +# on the same line when that makes sense. + +def _tag_out(printer, *tag_msg_pairs): + for tag, msg in tag_msg_pairs: + printer(tag + ":") + msg_has_nl = msg[-1:] == "\n" + msg_has_two_nl = msg_has_nl and \ + msg.find("\n") < len(msg) - 1 + if len(tag) + len(msg) < 76 and not msg_has_two_nl: + printer(" ") + else: + printer("\n") + printer(msg) + if not msg_has_nl: + printer("\n") + +# Run list of examples, in context globs. "out" can be used to display +# stuff to "the real" stdout, and fakeout is an instance of _SpoofOut +# that captures the examples' std output. Return (#failures, #tries). + +def _run_examples_inner(out, fakeout, examples, globs, verbose, name, + compileflags): + import sys, traceback + OK, BOOM, FAIL = range(3) + NADA = "nothing" + stderr = _SpoofOut() + failures = 0 + for source, want, lineno in examples: + if verbose: + _tag_out(out, ("Trying", source), + ("Expecting", want or NADA)) + fakeout.clear() + try: + exec compile(source, "", "single", + compileflags, 1) in globs + got = fakeout.get() + state = OK + except: + # See whether the exception was expected. + if want.find("Traceback (innermost last):\n") == 0 or \ + want.find("Traceback (most recent call last):\n") == 0: + # Only compare exception type and value - the rest of + # the traceback isn't necessary. + want = want.split('\n')[-2] + '\n' + exc_type, exc_val = sys.exc_info()[:2] + got = traceback.format_exception_only(exc_type, exc_val)[-1] + state = OK + else: + # unexpected exception + stderr.clear() + traceback.print_exc(file=stderr) + state = BOOM + + if state == OK: + if got == want: + if verbose: + out("ok\n") + continue + state = FAIL + + assert state in (FAIL, BOOM) + failures = failures + 1 + out("*" * 65 + "\n") + _tag_out(out, ("Failure in example", source)) + out("from line #" + `lineno` + " of " + name + "\n") + if state == FAIL: + _tag_out(out, ("Expected", want or NADA), ("Got", got)) + else: + assert state == BOOM + _tag_out(out, ("Exception raised", stderr.get())) + + return failures, len(examples) + +# Get the future-flags associated with the future features that have been +# imported into globs. + +def _extract_future_flags(globs): + flags = 0 + for fname in __future__.all_feature_names: + feature = globs.get(fname, None) + if feature is getattr(__future__, fname): + flags |= feature.compiler_flag + return flags + +# Run list of examples, in a shallow copy of context (dict) globs. +# Return (#failures, #tries). + +def _run_examples(examples, globs, verbose, name, compileflags): + import sys + saveout = sys.stdout + globs = globs.copy() + try: + sys.stdout = fakeout = _SpoofOut() + x = _run_examples_inner(saveout.write, fakeout, examples, + globs, verbose, name, compileflags) + finally: + sys.stdout = saveout + # While Python gc can clean up most cycles on its own, it doesn't + # chase frame objects. This is especially irksome when running + # generator tests that raise exceptions, because a named generator- + # iterator gets an entry in globs, and the generator-iterator + # object's frame's traceback info points back to globs. This is + # easy to break just by clearing the namespace. This can also + # help to break other kinds of cycles, and even for cycles that + # gc can break itself it's better to break them ASAP. + globs.clear() + return x + +def run_docstring_examples(f, globs, verbose=0, name="NoName", + compileflags=None): + """f, globs, verbose=0, name="NoName" -> run examples from f.__doc__. + + Use (a shallow copy of) dict globs as the globals for execution. + Return (#failures, #tries). + + If optional arg verbose is true, print stuff even if there are no + failures. + Use string name in failure msgs. + """ + + try: + doc = f.__doc__ + if not doc: + # docstring empty or None + return 0, 0 + # just in case CT invents a doc object that has to be forced + # to look like a string <0.9 wink> + doc = str(doc) + except: + return 0, 0 + + e = _extract_examples(doc) + if not e: + return 0, 0 + if compileflags is None: + compileflags = _extract_future_flags(globs) + return _run_examples(e, globs, verbose, name, compileflags) + +def is_private(prefix, base): + """prefix, base -> true iff name prefix + "." + base is "private". + + Prefix may be an empty string, and base does not contain a period. + Prefix is ignored (although functions you write conforming to this + protocol may make use of it). + Return true iff base begins with an (at least one) underscore, but + does not both begin and end with (at least) two underscores. + + >>> is_private("a.b", "my_func") + 0 + >>> is_private("____", "_my_func") + 1 + >>> is_private("someclass", "__init__") + 0 + >>> is_private("sometypo", "__init_") + 1 + >>> is_private("x.y.z", "_") + 1 + >>> is_private("_x.y.z", "__") + 0 + >>> is_private("", "") # senseless but consistent + 0 + """ + + return base[:1] == "_" and not base[:2] == "__" == base[-2:] + +# Determine if a class of function was defined in the given module. + +def _from_module(module, object): + if _isfunction(object): + return module.__dict__ is object.func_globals + if _isclass(object): + return module.__name__ == object.__module__ + raise ValueError("object must be a class or function") + +class Tester: + """Class Tester -- runs docstring examples and accumulates stats. + +In normal use, function doctest.testmod() hides all this from you, +so use that if you can. Create your own instances of Tester to do +fancier things. + +Methods: + runstring(s, name) + Search string s for examples to run; use name for logging. + Return (#failures, #tries). + + rundoc(object, name=None) + Search object.__doc__ for examples to run; use name (or + object.__name__) for logging. Return (#failures, #tries). + + rundict(d, name, module=None) + Search for examples in docstrings in all of d.values(); use name + for logging. Exclude functions and classes not defined in module + if specified. Return (#failures, #tries). + + run__test__(d, name) + Treat dict d like module.__test__. Return (#failures, #tries). + + summarize(verbose=None) + Display summary of testing results, to stdout. Return + (#failures, #tries). + + merge(other) + Merge in the test results from Tester instance "other". + +>>> from doctest import Tester +>>> t = Tester(globs={'x': 42}, verbose=0) +>>> t.runstring(r''' +... >>> x = x * 2 +... >>> print x +... 42 +... ''', 'XYZ') +***************************************************************** +Failure in example: print x +from line #2 of XYZ +Expected: 42 +Got: 84 +(1, 2) +>>> t.runstring(">>> x = x * 2\\n>>> print x\\n84\\n", 'example2') +(0, 2) +>>> t.summarize() +***************************************************************** +1 items had failures: + 1 of 2 in XYZ +***Test Failed*** 1 failures. +(1, 4) +>>> t.summarize(verbose=1) +1 items passed all tests: + 2 tests in example2 +***************************************************************** +1 items had failures: + 1 of 2 in XYZ +4 tests in 2 items. +3 passed and 1 failed. +***Test Failed*** 1 failures. +(1, 4) +>>> +""" + + def __init__(self, mod=None, globs=None, verbose=None, + isprivate=None): + """mod=None, globs=None, verbose=None, isprivate=None + +See doctest.__doc__ for an overview. + +Optional keyword arg "mod" is a module, whose globals are used for +executing examples. If not specified, globs must be specified. + +Optional keyword arg "globs" gives a dict to be used as the globals +when executing examples; if not specified, use the globals from +module mod. + +In either case, a copy of the dict is used for each docstring +examined. + +Optional keyword arg "verbose" prints lots of stuff if true, only +failures if false; by default, it's true iff "-v" is in sys.argv. + +Optional keyword arg "isprivate" specifies a function used to determine +whether a name is private. The default function is doctest.is_private; +see its docs for details. +""" + + if mod is None and globs is None: + raise TypeError("Tester.__init__: must specify mod or globs") + if mod is not None and not _ismodule(mod): + raise TypeError("Tester.__init__: mod must be a module; " + + `mod`) + if globs is None: + globs = mod.__dict__ + self.globs = globs + + if verbose is None: + import sys + verbose = "-v" in sys.argv + self.verbose = verbose + + if isprivate is None: + isprivate = is_private + self.isprivate = isprivate + + self.name2ft = {} # map name to (#failures, #trials) pair + + self.compileflags = _extract_future_flags(globs) + + def runstring(self, s, name): + """ + s, name -> search string s for examples to run, logging as name. + + Use string name as the key for logging the outcome. + Return (#failures, #examples). + + >>> t = Tester(globs={}, verbose=1) + >>> test = r''' + ... # just an example + ... >>> x = 1 + 2 + ... >>> x + ... 3 + ... ''' + >>> t.runstring(test, "Example") + Running string Example + Trying: x = 1 + 2 + Expecting: nothing + ok + Trying: x + Expecting: 3 + ok + 0 of 2 examples failed in string Example + (0, 2) + """ + + if self.verbose: + print "Running string", name + f = t = 0 + e = _extract_examples(s) + if e: + f, t = _run_examples(e, self.globs, self.verbose, name, + self.compileflags) + if self.verbose: + print f, "of", t, "examples failed in string", name + self.__record_outcome(name, f, t) + return f, t + + def rundoc(self, object, name=None): + """ + object, name=None -> search object.__doc__ for examples to run. + + Use optional string name as the key for logging the outcome; + by default use object.__name__. + Return (#failures, #examples). + If object is a class object, search recursively for method + docstrings too. + object.__doc__ is examined regardless of name, but if object is + a class, whether private names reached from object are searched + depends on the constructor's "isprivate" argument. + + >>> t = Tester(globs={}, verbose=0) + >>> def _f(): + ... '''Trivial docstring example. + ... >>> assert 2 == 2 + ... ''' + ... return 32 + ... + >>> t.rundoc(_f) # expect 0 failures in 1 example + (0, 1) + """ + + if name is None: + try: + name = object.__name__ + except AttributeError: + raise ValueError("Tester.rundoc: name must be given " + "when object.__name__ doesn't exist; " + `object`) + if self.verbose: + print "Running", name + ".__doc__" + f, t = run_docstring_examples(object, self.globs, self.verbose, name, + self.compileflags) + if self.verbose: + print f, "of", t, "examples failed in", name + ".__doc__" + self.__record_outcome(name, f, t) + if _isclass(object): + # In 2.2, class and static methods complicate life. Build + # a dict "that works", by hook or by crook. + d = {} + for tag, kind, homecls, value in _classify_class_attrs(object): + + if homecls is not object: + # Only look at names defined immediately by the class. + continue + + elif self.isprivate(name, tag): + continue + + elif kind == "method": + # value is already a function + d[tag] = value + + elif kind == "static method": + # value isn't a function, but getattr reveals one + d[tag] = getattr(object, tag) + + elif kind == "class method": + # Hmm. A classmethod object doesn't seem to reveal + # enough. But getattr turns it into a bound method, + # and from there .im_func retrieves the underlying + # function. + d[tag] = getattr(object, tag).im_func + + elif kind == "property": + # The methods implementing the property have their + # own docstrings -- but the property may have one too. + if value.__doc__ is not None: + d[tag] = str(value.__doc__) + + elif kind == "data": + # Grab nested classes. + if _isclass(value): + d[tag] = value + + else: + raise ValueError("teach doctest about %r" % kind) + + f2, t2 = self.run__test__(d, name) + f += f2 + t += t2 + + return f, t + + def rundict(self, d, name, module=None): + """ + d, name, module=None -> search for docstring examples in d.values(). + + For k, v in d.items() such that v is a function or class, + do self.rundoc(v, name + "." + k). Whether this includes + objects with private names depends on the constructor's + "isprivate" argument. If module is specified, functions and + classes that are not defined in module are excluded. + Return aggregate (#failures, #examples). + + Build and populate two modules with sample functions to test that + exclusion of external functions and classes works. + + >>> import new + >>> m1 = new.module('_m1') + >>> m2 = new.module('_m2') + >>> test_data = \""" + ... def _f(): + ... '''>>> assert 1 == 1 + ... ''' + ... def g(): + ... '''>>> assert 2 != 1 + ... ''' + ... class H: + ... '''>>> assert 2 > 1 + ... ''' + ... def bar(self): + ... '''>>> assert 1 < 2 + ... ''' + ... \""" + >>> exec test_data in m1.__dict__ + >>> exec test_data in m2.__dict__ + >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H}) + + Tests that objects outside m1 are excluded: + + >>> t = Tester(globs={}, verbose=0) + >>> t.rundict(m1.__dict__, "rundict_test", m1) # _f, f2 and g2 and h2 skipped + (0, 3) + + Again, but with a custom isprivate function allowing _f: + + >>> t = Tester(globs={}, verbose=0, isprivate=lambda x,y: 0) + >>> t.rundict(m1.__dict__, "rundict_test_pvt", m1) # Only f2, g2 and h2 skipped + (0, 4) + + And once more, not excluding stuff outside m1: + + >>> t = Tester(globs={}, verbose=0, isprivate=lambda x,y: 0) + >>> t.rundict(m1.__dict__, "rundict_test_pvt") # None are skipped. + (0, 8) + + The exclusion of objects from outside the designated module is + meant to be invoked automagically by testmod. + + >>> testmod(m1) + (0, 3) + + """ + + if not hasattr(d, "items"): + raise TypeError("Tester.rundict: d must support .items(); " + + `d`) + f = t = 0 + # Run the tests by alpha order of names, for consistency in + # verbose-mode output. + names = d.keys() + names.sort() + for thisname in names: + value = d[thisname] + if _isfunction(value) or _isclass(value): + if module and not _from_module(module, value): + continue + f2, t2 = self.__runone(value, name + "." + thisname) + f = f + f2 + t = t + t2 + return f, t + + def run__test__(self, d, name): + """d, name -> Treat dict d like module.__test__. + + Return (#failures, #tries). + See testmod.__doc__ for details. + """ + + failures = tries = 0 + prefix = name + "." + savepvt = self.isprivate + try: + self.isprivate = lambda *args: 0 + # Run the tests by alpha order of names, for consistency in + # verbose-mode output. + keys = d.keys() + keys.sort() + for k in keys: + v = d[k] + thisname = prefix + k + if type(v) in _StringTypes: + f, t = self.runstring(v, thisname) + elif _isfunction(v) or _isclass(v): + f, t = self.rundoc(v, thisname) + else: + raise TypeError("Tester.run__test__: values in " + "dict must be strings, functions " + "or classes; " + `v`) + failures = failures + f + tries = tries + t + finally: + self.isprivate = savepvt + return failures, tries + + def summarize(self, verbose=None): + """ + verbose=None -> summarize results, return (#failures, #tests). + + Print summary of test results to stdout. + Optional arg 'verbose' controls how wordy this is. By + default, use the verbose setting established by the + constructor. + """ + + if verbose is None: + verbose = self.verbose + notests = [] + passed = [] + failed = [] + totalt = totalf = 0 + for x in self.name2ft.items(): + name, (f, t) = x + assert f <= t + totalt = totalt + t + totalf = totalf + f + if t == 0: + notests.append(name) + elif f == 0: + passed.append( (name, t) ) + else: + failed.append(x) + if verbose: + if notests: + print len(notests), "items had no tests:" + notests.sort() + for thing in notests: + print " ", thing + if passed: + print len(passed), "items passed all tests:" + passed.sort() + for thing, count in passed: + print " %3d tests in %s" % (count, thing) + if failed: + print "*" * 65 + print len(failed), "items had failures:" + failed.sort() + for thing, (f, t) in failed: + print " %3d of %3d in %s" % (f, t, thing) + if verbose: + print totalt, "tests in", len(self.name2ft), "items." + print totalt - totalf, "passed and", totalf, "failed." + if totalf: + print "***Test Failed***", totalf, "failures." + elif verbose: + print "Test passed." + return totalf, totalt + + def merge(self, other): + """ + other -> merge in test results from the other Tester instance. + + If self and other both have a test result for something + with the same name, the (#failures, #tests) results are + summed, and a warning is printed to stdout. + + >>> from doctest import Tester + >>> t1 = Tester(globs={}, verbose=0) + >>> t1.runstring(''' + ... >>> x = 12 + ... >>> print x + ... 12 + ... ''', "t1example") + (0, 2) + >>> + >>> t2 = Tester(globs={}, verbose=0) + >>> t2.runstring(''' + ... >>> x = 13 + ... >>> print x + ... 13 + ... ''', "t2example") + (0, 2) + >>> common = ">>> assert 1 + 2 == 3\\n" + >>> t1.runstring(common, "common") + (0, 1) + >>> t2.runstring(common, "common") + (0, 1) + >>> t1.merge(t2) + *** Tester.merge: 'common' in both testers; summing outcomes. + >>> t1.summarize(1) + 3 items passed all tests: + 2 tests in common + 2 tests in t1example + 2 tests in t2example + 6 tests in 3 items. + 6 passed and 0 failed. + Test passed. + (0, 6) + >>> + """ + + d = self.name2ft + for name, (f, t) in other.name2ft.items(): + if d.has_key(name): + print "*** Tester.merge: '" + name + "' in both" \ + " testers; summing outcomes." + f2, t2 = d[name] + f = f + f2 + t = t + t2 + d[name] = f, t + + def __record_outcome(self, name, f, t): + if self.name2ft.has_key(name): + print "*** Warning: '" + name + "' was tested before;", \ + "summing outcomes." + f2, t2 = self.name2ft[name] + f = f + f2 + t = t + t2 + self.name2ft[name] = f, t + + def __runone(self, target, name): + if "." in name: + i = name.rindex(".") + prefix, base = name[:i], name[i+1:] + else: + prefix, base = "", base + if self.isprivate(prefix, base): + return 0, 0 + return self.rundoc(target, name) + +master = None + +def testmod(m, name=None, globs=None, verbose=None, isprivate=None, + report=1): + """m, name=None, globs=None, verbose=None, isprivate=None, report=1 + + Test examples in docstrings in functions and classes reachable from + module m, starting with m.__doc__. Private names are skipped. + + Also test examples reachable from dict m.__test__ if it exists and is + not None. m.__dict__ maps names to functions, classes and strings; + function and class docstrings are tested even if the name is private; + strings are tested directly, as if they were docstrings. + + Return (#failures, #tests). + + See doctest.__doc__ for an overview. + + Optional keyword arg "name" gives the name of the module; by default + use m.__name__. + + Optional keyword arg "globs" gives a dict to be used as the globals + when executing examples; by default, use m.__dict__. A copy of this + dict is actually used for each docstring, so that each docstring's + examples start with a clean slate. + + Optional keyword arg "verbose" prints lots of stuff if true, prints + only failures if false; by default, it's true iff "-v" is in sys.argv. + + Optional keyword arg "isprivate" specifies a function used to + determine whether a name is private. The default function is + doctest.is_private; see its docs for details. + + Optional keyword arg "report" prints a summary at the end when true, + else prints nothing at the end. In verbose mode, the summary is + detailed, else very brief (in fact, empty if all tests passed). + + Advanced tomfoolery: testmod runs methods of a local instance of + class doctest.Tester, then merges the results into (or creates) + global Tester instance doctest.master. Methods of doctest.master + can be called directly too, if you want to do something unusual. + Passing report=0 to testmod is especially useful then, to delay + displaying a summary. Invoke doctest.master.summarize(verbose) + when you're done fiddling. + """ + + global master + + if not _ismodule(m): + raise TypeError("testmod: module required; " + `m`) + if name is None: + name = m.__name__ + tester = Tester(m, globs=globs, verbose=verbose, isprivate=isprivate) + failures, tries = tester.rundoc(m, name) + f, t = tester.rundict(m.__dict__, name, m) + failures = failures + f + tries = tries + t + if hasattr(m, "__test__"): + testdict = m.__test__ + if testdict: + if not hasattr(testdict, "items"): + raise TypeError("testmod: module.__test__ must support " + ".items(); " + `testdict`) + f, t = tester.run__test__(testdict, name + ".__test__") + failures = failures + f + tries = tries + t + if report: + tester.summarize() + if master is None: + master = tester + else: + master.merge(tester) + return failures, tries + +class _TestClass: + """ + A pointless class, for sanity-checking of docstring testing. + + Methods: + square() + get() + + >>> _TestClass(13).get() + _TestClass(-12).get() + 1 + >>> hex(_TestClass(13).square().get()) + '0xa9' + """ + + def __init__(self, val): + """val -> _TestClass object with associated value val. + + >>> t = _TestClass(123) + >>> print t.get() + 123 + """ + + self.val = val + + def square(self): + """square() -> square TestClass's associated value + + >>> _TestClass(13).square().get() + 169 + """ + + self.val = self.val ** 2 + return self + + def get(self): + """get() -> return TestClass's associated value. + + >>> x = _TestClass(-42) + >>> print x.get() + -42 + """ + + return self.val + +__test__ = {"_TestClass": _TestClass, + "string": r""" + Example of a string object, searched as-is. + >>> x = 1; y = 2 + >>> x + y, x * y + (3, 2) + """ + } + +def _test(): + import doctest + return doctest.testmod(doctest) + +if __name__ == "__main__": + _test() diff --git a/lib-python/2.2/dospath.py b/lib-python/2.2/dospath.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/dospath.py @@ -0,0 +1,341 @@ +"""Common operations on DOS pathnames.""" + +import os +import stat + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","islink","exists","isdir","isfile","ismount", + "walk","expanduser","expandvars","normpath","abspath","realpath"] + +def normcase(s): + """Normalize the case of a pathname. + On MS-DOS it maps the pathname to lowercase, turns slashes into + backslashes. + Other normalizations (such as optimizing '../' away) are not allowed + (this is done by normpath). + Previously, this version mapped invalid consecutive characters to a + single '_', but this has been removed. This functionality should + possibly be added as a new function.""" + + return s.replace("/", "\\").lower() + + +def isabs(s): + """Return whether a path is absolute. + Trivial in Posix, harder on the Mac or MS-DOS. + For DOS it is absolute if it starts with a slash or backslash (current + volume), or if a pathname after the volume letter and colon starts with + a slash or backslash.""" + + s = splitdrive(s)[1] + return s != '' and s[:1] in '/\\' + + +def join(a, *p): + """Join two (or more) paths.""" + + path = a + for b in p: + if isabs(b): + path = b + elif path == '' or path[-1:] in '/\\:': + path = path + b + else: + path = path + "\\" + b + return path + + +def splitdrive(p): + """Split a path into a drive specification (a drive letter followed + by a colon) and path specification. + It is always true that drivespec + pathspec == p.""" + + if p[1:2] == ':': + return p[0:2], p[2:] + return '', p + + +def split(p): + """Split a path into head (everything up to the last '/') and tail + (the rest). After the trailing '/' is stripped, the invariant + join(head, tail) == p holds. + The resulting head won't end in '/' unless it is the root.""" + + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in '/\\': + i = i - 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head2 = head + while head2 and head2[-1] in '/\\': + head2 = head2[:-1] + head = head2 or head + return d + head, tail + + +def splitext(p): + """Split a path into root and extension. + The extension is everything starting at the first dot in the last + pathname component; the root is everything before that. + It is always true that root + ext == p.""" + + root, ext = '', '' + for c in p: + if c in '/\\': + root, ext = root + ext + c, '' + elif c == '.' or ext: + ext = ext + c + else: + root = root + c + return root, ext + + +def basename(p): + """Return the tail (basename) part of a path.""" + + return split(p)[1] + + +def dirname(p): + """Return the head (dirname) part of a path.""" + + return split(p)[0] + + +def commonprefix(m): + """Return the longest prefix of all list elements.""" + + if not m: return '' + prefix = m[0] + for item in m: + for i in range(len(prefix)): + if prefix[:i+1] != item[:i+1]: + prefix = prefix[:i] + if i == 0: return '' + break + return prefix + + +# Get size, mtime, atime of files. + +def getsize(filename): + """Return the size of a file, reported by os.stat().""" + st = os.stat(filename) + return st[stat.ST_SIZE] + +def getmtime(filename): + """Return the last modification time of a file, reported by os.stat().""" + st = os.stat(filename) + return st[stat.ST_MTIME] + +def getatime(filename): + """Return the last access time of a file, reported by os.stat().""" + st = os.stat(filename) + return st[stat.ST_ATIME] + + +def islink(path): + """Is a path a symbolic link? + This will always return false on systems where posix.lstat doesn't exist.""" + + return 0 + + +def exists(path): + """Does a path exist? + This is false for dangling symbolic links.""" + + try: + st = os.stat(path) + except os.error: + return 0 + return 1 + + +def isdir(path): + """Is a path a dos directory?""" + + try: + st = os.stat(path) + except os.error: + return 0 + return stat.S_ISDIR(st[stat.ST_MODE]) + + +def isfile(path): + """Is a path a regular file?""" + + try: + st = os.stat(path) + except os.error: + return 0 + return stat.S_ISREG(st[stat.ST_MODE]) + + +def ismount(path): + """Is a path a mount point?""" + # XXX This degenerates in: 'is this the root?' on DOS + + return isabs(splitdrive(path)[1]) + + +def walk(top, func, arg): + """Directory tree walk with callback function. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), call func(arg, dirname, fnames). + dirname is the name of the directory, and fnames a list of the names of + the files and subdirectories in dirname (excluding '.' and '..'). func + may modify the fnames list in-place (e.g. via del or slice assignment), + and walk will only recurse into the subdirectories whose names remain in + fnames; this can be used to implement a filter, or to impose a specific + order of visiting. No semantics are defined for, or required of, arg, + beyond that arg is always passed to func. It can be used, e.g., to pass + a filename pattern, or a mutable object designed to accumulate + statistics. Passing None for arg is common.""" + + try: + names = os.listdir(top) + except os.error: + return + func(arg, top, names) + exceptions = ('.', '..') + for name in names: + if name not in exceptions: + name = join(top, name) + if isdir(name): + walk(name, func, arg) + + +def expanduser(path): + """Expand paths beginning with '~' or '~user'. + '~' means $HOME; '~user' means that user's home directory. + If the path doesn't begin with '~', or if the user or $HOME is unknown, + the path is returned unchanged (leaving error reporting to whatever + function is called with the expanded path as argument). + See also module 'glob' for expansion of *, ? and [...] in pathnames. + (A function should also be defined to do full *sh-style environment + variable expansion.)""" + + if path[:1] != '~': + return path + i, n = 1, len(path) + while i < n and path[i] not in '/\\': + i = i+1 + if i == 1: + if not os.environ.has_key('HOME'): + return path + userhome = os.environ['HOME'] + else: + return path + return userhome + path[i:] + + +def expandvars(path): + """Expand paths containing shell variable substitutions. + The following rules apply: + - no expansion within single quotes + - no escape character, except for '$$' which is translated into '$' + - ${varname} is accepted. + - varnames can be made out of letters, digits and the character '_'""" + # XXX With COMMAND.COM you can use any characters in a variable name, + # XXX except '^|<>='. + + if '$' not in path: + return path + import string + varchars = string.ascii_letters + string.digits + "_-" + res = '' + index = 0 + pathlen = len(path) + while index < pathlen: + c = path[index] + if c == '\'': # no expansion within single quotes + path = path[index + 1:] + pathlen = len(path) + try: + index = path.index('\'') + res = res + '\'' + path[:index + 1] + except ValueError: + res = res + path + index = pathlen -1 + elif c == '$': # variable or '$$' + if path[index + 1:index + 2] == '$': + res = res + c + index = index + 1 + elif path[index + 1:index + 2] == '{': + path = path[index+2:] + pathlen = len(path) + try: + index = path.index('}') + var = path[:index] + if os.environ.has_key(var): + res = res + os.environ[var] + except ValueError: + res = res + path + index = pathlen - 1 + else: + var = '' + index = index + 1 + c = path[index:index + 1] + while c != '' and c in varchars: + var = var + c + index = index + 1 + c = path[index:index + 1] + if os.environ.has_key(var): + res = res + os.environ[var] + if c != '': + res = res + c + else: + res = res + c + index = index + 1 + return res + + +def normpath(path): + """Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. + Also, components of the path are silently truncated to 8+3 notation.""" + + path = path.replace("/", "\\") + prefix, path = splitdrive(path) + while path[:1] == "\\": + prefix = prefix + "\\" + path = path[1:] + comps = path.split("\\") + i = 0 + while i < len(comps): + if comps[i] == '.': + del comps[i] + elif comps[i] == '..' and i > 0 and \ + comps[i-1] not in ('', '..'): + del comps[i-1:i+1] + i = i - 1 + elif comps[i] == '' and i > 0 and comps[i-1] != '': + del comps[i] + elif '.' in comps[i]: + comp = comps[i].split('.') + comps[i] = comp[0][:8] + '.' + comp[1][:3] + i = i + 1 + elif len(comps[i]) > 8: + comps[i] = comps[i][:8] + i = i + 1 + else: + i = i + 1 + # If the path is now empty, substitute '.' + if not prefix and not comps: + comps.append('.') + return prefix + "\\".join(comps) + + + +def abspath(path): + """Return an absolute path.""" + if not isabs(path): + path = join(os.getcwd(), path) + return normpath(path) + +# realpath is a no-op on systems without islink support +realpath = abspath diff --git a/lib-python/2.2/dumbdbm.py b/lib-python/2.2/dumbdbm.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/dumbdbm.py @@ -0,0 +1,170 @@ +"""A dumb and slow but simple dbm clone. + +For database spam, spam.dir contains the index (a text file), +spam.bak *may* contain a backup of the index (also a text file), +while spam.dat contains the data (a binary file). + +XXX TO DO: + +- seems to contain a bug when updating... + +- reclaim free space (currently, space once occupied by deleted or expanded +items is never reused) + +- support concurrent access (currently, if two processes take turns making +updates, they can mess up the index) + +- support efficient access to large databases (currently, the whole index +is read when the database is opened, and some updates rewrite the whole index) + +- support opening for read-only (flag = 'm') + +""" + +import os as _os +import __builtin__ + +_open = __builtin__.open + +_BLOCKSIZE = 512 + +error = IOError # For anydbm + +class _Database: + + def __init__(self, file, mode): + self._mode = mode + self._dirfile = file + _os.extsep + 'dir' + self._datfile = file + _os.extsep + 'dat' + self._bakfile = file + _os.extsep + 'bak' + # Mod by Jack: create data file if needed + try: + f = _open(self._datfile, 'r') + except IOError: + f = _open(self._datfile, 'w', self._mode) + f.close() + self._update() + + def _update(self): + self._index = {} + try: + f = _open(self._dirfile) + except IOError: + pass + else: + while 1: + line = f.readline().rstrip() + if not line: break + key, (pos, siz) = eval(line) + self._index[key] = (pos, siz) + f.close() + + def _commit(self): + try: _os.unlink(self._bakfile) + except _os.error: pass + try: _os.rename(self._dirfile, self._bakfile) + except _os.error: pass + f = _open(self._dirfile, 'w', self._mode) + for key, (pos, siz) in self._index.items(): + f.write("%s, (%s, %s)\n" % (`key`, `pos`, `siz`)) + f.close() + + def __getitem__(self, key): + pos, siz = self._index[key] # may raise KeyError + f = _open(self._datfile, 'rb') + f.seek(pos) + dat = f.read(siz) + f.close() + return dat + + def _addval(self, val): + f = _open(self._datfile, 'rb+') + f.seek(0, 2) + pos = int(f.tell()) +## Does not work under MW compiler +## pos = ((pos + _BLOCKSIZE - 1) / _BLOCKSIZE) * _BLOCKSIZE +## f.seek(pos) + npos = ((pos + _BLOCKSIZE - 1) // _BLOCKSIZE) * _BLOCKSIZE + f.write('\0'*(npos-pos)) + pos = npos + + f.write(val) + f.close() + return (pos, len(val)) + + def _setval(self, pos, val): + f = _open(self._datfile, 'rb+') + f.seek(pos) + f.write(val) + f.close() + return (pos, len(val)) + + def _addkey(self, key, (pos, siz)): + self._index[key] = (pos, siz) + f = _open(self._dirfile, 'a', self._mode) + f.write("%s, (%s, %s)\n" % (`key`, `pos`, `siz`)) + f.close() + + def __setitem__(self, key, val): + if not type(key) == type('') == type(val): + raise TypeError, "keys and values must be strings" + if not self._index.has_key(key): + (pos, siz) = self._addval(val) + self._addkey(key, (pos, siz)) + else: + pos, siz = self._index[key] + oldblocks = (siz + _BLOCKSIZE - 1) / _BLOCKSIZE + newblocks = (len(val) + _BLOCKSIZE - 1) / _BLOCKSIZE + if newblocks <= oldblocks: + pos, siz = self._setval(pos, val) + self._index[key] = pos, siz + else: + pos, siz = self._addval(val) + self._index[key] = pos, siz + + def __delitem__(self, key): + del self._index[key] + self._commit() + + def keys(self): + return self._index.keys() + + def has_key(self, key): + return self._index.has_key(key) + + def __contains__(self, key): + return self._index.has_key(key) + + def iterkeys(self): + return self._index.iterkeys() + __iter__ = iterkeys + + def __len__(self): + return len(self._index) + + def close(self): + self._commit() + self._index = None + self._datfile = self._dirfile = self._bakfile = None + + def __del__(self): + if self._index is not None: + self._commit() + + + +def open(file, flag=None, mode=0666): + """Open the database file, filename, and return corresponding object. + + The flag argument, used to control how the database is opened in the + other DBM implementations, is ignored in the dumbdbm module; the + database is always opened for update, and will be created if it does + not exist. + + The optional mode argument is the UNIX mode of the file, used only when + the database has to be created. It defaults to octal code 0666 (and + will be modified by the prevailing umask). + + """ + # flag, mode arguments are currently ignored + return _Database(file, mode) diff --git a/lib-python/2.2/email/Charset.py b/lib-python/2.2/email/Charset.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Charset.py @@ -0,0 +1,393 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: che at debian.org (Ben Gertzfield), barry at zope.com (Barry Warsaw) + +from types import UnicodeType +from email.Encoders import encode_7or8bit +import email.base64MIME +import email.quopriMIME + +def _isunicode(s): + return isinstance(s, UnicodeType) + +# Python 2.2.1 and beyond has these symbols +try: + True, False +except NameError: + True = 1 + False = 0 + + + +# Flags for types of header encodings +QP = 1 # Quoted-Printable +BASE64 = 2 # Base64 +SHORTEST = 3 # the shorter of QP and base64, but only for headers + +# In "=?charset?q?hello_world?=", the =?, ?q?, and ?= add up to 7 +MISC_LEN = 7 + +DEFAULT_CHARSET = 'us-ascii' + + + +# Defaults +CHARSETS = { + # input header enc body enc output conv + 'iso-8859-1': (QP, QP, None), + 'iso-8859-2': (QP, QP, None), + 'iso-8859-3': (QP, QP, None), + 'iso-8859-4': (QP, QP, None), + # iso-8859-5 is Cyrillic, and not especially used + # iso-8859-6 is Arabic, also not particularly used + # iso-8859-7 is Greek, QP will not make it readable + # iso-8859-8 is Hebrew, QP will not make it readable + 'iso-8859-9': (QP, QP, None), + 'iso-8859-10': (QP, QP, None), + # iso-8859-11 is Thai, QP will not make it readable + 'iso-8859-13': (QP, QP, None), + 'iso-8859-14': (QP, QP, None), + 'iso-8859-15': (QP, QP, None), + 'windows-1252':(QP, QP, None), + 'viscii': (QP, QP, None), + 'us-ascii': (None, None, None), + 'big5': (BASE64, BASE64, None), + 'gb2312': (BASE64, BASE64, None), + 'euc-jp': (BASE64, None, 'iso-2022-jp'), + 'shift_jis': (BASE64, None, 'iso-2022-jp'), + 'iso-2022-jp': (BASE64, None, None), + 'koi8-r': (BASE64, BASE64, None), + 'utf-8': (SHORTEST, BASE64, 'utf-8'), + # We're making this one up to represent raw unencoded 8-bit + '8bit': (None, BASE64, 'utf-8'), + } + +# Aliases for other commonly-used names for character sets. Map +# them to the real ones used in email. +ALIASES = { + 'latin_1': 'iso-8859-1', + 'latin-1': 'iso-8859-1', + 'latin_2': 'iso-8859-2', + 'latin-2': 'iso-8859-2', + 'latin_3': 'iso-8859-3', + 'latin-3': 'iso-8859-3', + 'latin_4': 'iso-8859-4', + 'latin-4': 'iso-8859-4', + 'latin_5': 'iso-8859-9', + 'latin-5': 'iso-8859-9', + 'latin_6': 'iso-8859-10', + 'latin-6': 'iso-8859-10', + 'latin_7': 'iso-8859-13', + 'latin-7': 'iso-8859-13', + 'latin_8': 'iso-8859-14', + 'latin-8': 'iso-8859-14', + 'latin_9': 'iso-8859-15', + 'latin-9': 'iso-8859-15', + 'cp949': 'ks_c_5601-1987', + 'euc_jp': 'euc-jp', + 'euc_kr': 'euc-kr', + 'ascii': 'us-ascii', + } + +# Map charsets to their Unicode codec strings. Note that Python doesn't come +# with any Asian codecs by default. Here's where to get them: +# +# Japanese -- http://www.asahi-net.or.jp/~rd6t-kjym/python +# Korean -- http://sf.net/projects/koco +# Chinese -- http://sf.net/projects/python-codecs +# +# Note that these codecs have their own lifecycle and may be in varying states +# of stability and useability. + +CODEC_MAP = { + 'euc-jp': 'japanese.euc-jp', + 'iso-2022-jp': 'japanese.iso-2022-jp', + 'shift_jis': 'japanese.shift_jis', + 'euc-kr': 'korean.euc-kr', + 'ks_c_5601-1987': 'korean.cp949', + 'iso-2022-kr': 'korean.iso-2022-kr', + 'johab': 'korean.johab', + 'gb2132': 'eucgb2312_cn', + 'big5': 'big5_tw', + 'utf-8': 'utf-8', + # Hack: We don't want *any* conversion for stuff marked us-ascii, as all + # sorts of garbage might be sent to us in the guise of 7-bit us-ascii. + # Let that stuff pass through without conversion to/from Unicode. + 'us-ascii': None, + } + + + +# Convenience functions for extending the above mappings +def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): + """Add character set properties to the global registry. + + charset is the input character set, and must be the canonical name of a + character set. + + Optional header_enc and body_enc is either Charset.QP for + quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for + the shortest of qp or base64 encoding, or None for no encoding. SHORTEST + is only valid for header_enc. It describes how message headers and + message bodies in the input charset are to be encoded. Default is no + encoding. + + Optional output_charset is the character set that the output should be + in. Conversions will proceed from input charset, to Unicode, to the + output charset when the method Charset.convert() is called. The default + is to output in the same character set as the input. + + Both input_charset and output_charset must have Unicode codec entries in + the module's charset-to-codec mapping; use add_codec(charset, codecname) + to add codecs the module does not know about. See the codecs module's + documentation for more information. + """ + if body_enc == SHORTEST: + raise ValueError, 'SHORTEST not allowed for body_enc' + CHARSETS[charset] = (header_enc, body_enc, output_charset) + + +def add_alias(alias, canonical): + """Add a character set alias. + + alias is the alias name, e.g. latin-1 + canonical is the character set's canonical name, e.g. iso-8859-1 + """ + ALIASES[alias] = canonical + + +def add_codec(charset, codecname): + """Add a codec that map characters in the given charset to/from Unicode. + + charset is the canonical name of a character set. codecname is the name + of a Python codec, as appropriate for the second argument to the unicode() + built-in, or to the encode() method of a Unicode string. + """ + CODEC_MAP[charset] = codecname + + + +class Charset: + """Map character sets to their email properties. + + This class provides information about the requirements imposed on email + for a specific character set. It also provides convenience routines for + converting between character sets, given the availability of the + applicable codecs. Given a character set, it will do its best to provide + information on how to use that character set in an email in an + RFC-compliant way. + + Certain character sets must be encoded with quoted-printable or base64 + when used in email headers or bodies. Certain character sets must be + converted outright, and are not allowed in email. Instances of this + module expose the following information about a character set: + + input_charset: The initial character set specified. Common aliases + are converted to their `official' email names (e.g. latin_1 + is converted to iso-8859-1). Defaults to 7-bit us-ascii. + + header_encoding: If the character set must be encoded before it can be + used in an email header, this attribute will be set to + Charset.QP (for quoted-printable), Charset.BASE64 (for + base64 encoding), or Charset.SHORTEST for the shortest of + QP or BASE64 encoding. Otherwise, it will be None. + + body_encoding: Same as header_encoding, but describes the encoding for the + mail message's body, which indeed may be different than the + header encoding. Charset.SHORTEST is not allowed for + body_encoding. + + output_charset: Some character sets must be converted before the can be + used in email headers or bodies. If the input_charset is + one of them, this attribute will contain the name of the + charset output will be converted to. Otherwise, it will + be None. + + input_codec: The name of the Python codec used to convert the + input_charset to Unicode. If no conversion codec is + necessary, this attribute will be None. + + output_codec: The name of the Python codec used to convert Unicode + to the output_charset. If no conversion codec is necessary, + this attribute will have the same value as the input_codec. + """ + def __init__(self, input_charset=DEFAULT_CHARSET): + # RFC 2046, $4.1.2 says charsets are not case sensitive + input_charset = input_charset.lower() + # Set the input charset after filtering through the aliases + self.input_charset = ALIASES.get(input_charset, input_charset) + # We can try to guess which encoding and conversion to use by the + # charset_map dictionary. Try that first, but let the user override + # it. + henc, benc, conv = CHARSETS.get(self.input_charset, + (SHORTEST, BASE64, None)) + # Set the attributes, allowing the arguments to override the default. + self.header_encoding = henc + self.body_encoding = benc + self.output_charset = ALIASES.get(conv, conv) + # Now set the codecs. If one isn't defined for input_charset, + # guess and try a Unicode codec with the same name as input_codec. + self.input_codec = CODEC_MAP.get(self.input_charset, + self.input_charset) + self.output_codec = CODEC_MAP.get(self.output_charset, + self.input_codec) + + def __str__(self): + return self.input_charset.lower() + + __repr__ = __str__ + + def __eq__(self, other): + return str(self) == str(other).lower() + + def __ne__(self, other): + return not self.__eq__(other) + + def get_body_encoding(self): + """Return the content-transfer-encoding used for body encoding. + + This is either the string `quoted-printable' or `base64' depending on + the encoding used, or it is a function in which case you should call + the function with a single argument, the Message object being + encoded. The function should then set the Content-Transfer-Encoding + header itself to whatever is appropriate. + + Returns "quoted-printable" if self.body_encoding is QP. + Returns "base64" if self.body_encoding is BASE64. + Returns "7bit" otherwise. + """ + assert self.body_encoding <> SHORTEST + if self.body_encoding == QP: + return 'quoted-printable' + elif self.body_encoding == BASE64: + return 'base64' + else: + return encode_7or8bit + + def convert(self, s): + """Convert a string from the input_codec to the output_codec.""" + if self.input_codec <> self.output_codec: + return unicode(s, self.input_codec).encode(self.output_codec) + else: + return s + + def to_splittable(self, s): + """Convert a possibly multibyte string to a safely splittable format. + + Uses the input_codec to try and convert the string to Unicode, so it + can be safely split on character boundaries (even for multibyte + characters). + + Returns the string as-is if it isn't known how to convert it to + Unicode with the input_charset. + + Characters that could not be converted to Unicode will be replaced + with the Unicode replacement character U+FFFD. + """ + if _isunicode(s) or self.input_codec is None: + return s + try: + return unicode(s, self.input_codec, 'replace') + except LookupError: + # Input codec not installed on system, so return the original + # string unchanged. + return s + + def from_splittable(self, ustr, to_output=True): + """Convert a splittable string back into an encoded string. + + Uses the proper codec to try and convert the string from Unicode back + into an encoded format. Return the string as-is if it is not Unicode, + or if it could not be converted from Unicode. + + Characters that could not be converted from Unicode will be replaced + with an appropriate character (usually '?'). + + If to_output is True (the default), uses output_codec to convert to an + encoded format. If to_output is False, uses input_codec. + """ + if to_output: + codec = self.output_codec + else: + codec = self.input_codec + if not _isunicode(ustr) or codec is None: + return ustr + try: + return ustr.encode(codec, 'replace') + except LookupError: + # Output codec not installed + return ustr + + def get_output_charset(self): + """Return the output character set. + + This is self.output_charset if that is not None, otherwise it is + self.input_charset. + """ + return self.output_charset or self.input_charset + + def encoded_header_len(self, s): + """Return the length of the encoded header string.""" + cset = self.get_output_charset() + # The len(s) of a 7bit encoding is len(s) + if self.header_encoding == BASE64: + return email.base64MIME.base64_len(s) + len(cset) + MISC_LEN + elif self.header_encoding == QP: + return email.quopriMIME.header_quopri_len(s) + len(cset) + MISC_LEN + elif self.header_encoding == SHORTEST: + lenb64 = email.base64MIME.base64_len(s) + lenqp = email.quopriMIME.header_quopri_len(s) + return min(lenb64, lenqp) + len(cset) + MISC_LEN + else: + return len(s) + + def header_encode(self, s, convert=False): + """Header-encode a string, optionally converting it to output_charset. + + If convert is True, the string will be converted from the input + charset to the output charset automatically. This is not useful for + multibyte character sets, which have line length issues (multibyte + characters must be split on a character, not a byte boundary); use the + high-level Header class to deal with these issues. convert defaults + to False. + + The type of encoding (base64 or quoted-printable) will be based on + self.header_encoding. + """ + cset = self.get_output_charset() + if convert: + s = self.convert(s) + # 7bit/8bit encodings return the string unchanged (modulo conversions) + if self.header_encoding == BASE64: + return email.base64MIME.header_encode(s, cset) + elif self.header_encoding == QP: + return email.quopriMIME.header_encode(s, cset, maxlinelen=None) + elif self.header_encoding == SHORTEST: + lenb64 = email.base64MIME.base64_len(s) + lenqp = email.quopriMIME.header_quopri_len(s) + if lenb64 < lenqp: + return email.base64MIME.header_encode(s, cset) + else: + return email.quopriMIME.header_encode(s, cset, maxlinelen=None) + else: + return s + + def body_encode(self, s, convert=True): + """Body-encode a string and convert it to output_charset. + + If convert is True (the default), the string will be converted from + the input charset to output charset automatically. Unlike + header_encode(), there are no issues with byte boundaries and + multibyte charsets in email bodies, so this is usually pretty safe. + + The type of encoding (base64 or quoted-printable) will be based on + self.body_encoding. + """ + if convert: + s = self.convert(s) + # 7bit/8bit encodings return the string unchanged (module conversions) + if self.body_encoding is BASE64: + return email.base64MIME.body_encode(s) + elif self.body_encoding is QP: + return email.quopriMIME.body_encode(s) + else: + return s diff --git a/lib-python/2.2/email/Encoders.py b/lib-python/2.2/email/Encoders.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Encoders.py @@ -0,0 +1,94 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Module containing encoding functions for Image.Image and Text.Text. +""" + +import base64 + + + +# Helpers +try: + from quopri import encodestring as _encodestring + + def _qencode(s): + enc = _encodestring(s, quotetabs=1) + # Must encode spaces, which quopri.encodestring() doesn't do + return enc.replace(' ', '=20') +except ImportError: + # Python 2.1 doesn't have quopri.encodestring() + from cStringIO import StringIO + import quopri as _quopri + + def _qencode(s): + if not s: + return s + hasnewline = (s[-1] == '\n') + infp = StringIO(s) + outfp = StringIO() + _quopri.encode(infp, outfp, quotetabs=1) + # Python 2.x's encode() doesn't encode spaces even when quotetabs==1 + value = outfp.getvalue().replace(' ', '=20') + if not hasnewline and value[-1] == '\n': + return value[:-1] + return value + + +def _bencode(s): + # We can't quite use base64.encodestring() since it tacks on a "courtesy + # newline". Blech! + if not s: + return s + hasnewline = (s[-1] == '\n') + value = base64.encodestring(s) + if not hasnewline and value[-1] == '\n': + return value[:-1] + return value + + + +def encode_base64(msg): + """Encode the message's payload in Base64. + + Also, add an appropriate Content-Transfer-Encoding header. + """ + orig = msg.get_payload() + encdata = _bencode(orig) + msg.set_payload(encdata) + msg['Content-Transfer-Encoding'] = 'base64' + + + +def encode_quopri(msg): + """Encode the message's payload in quoted-printable. + + Also, add an appropriate Content-Transfer-Encoding header. + """ + orig = msg.get_payload() + encdata = _qencode(orig) + msg.set_payload(encdata) + msg['Content-Transfer-Encoding'] = 'quoted-printable' + + + +def encode_7or8bit(msg): + """Set the Content-Transfer-Encoding header to 7bit or 8bit.""" + orig = msg.get_payload() + if orig is None: + # There's no payload. For backwards compatibility we use 7bit + msg['Content-Transfer-Encoding'] = '7bit' + return + # We play a trick to make this go fast. If encoding to ASCII succeeds, we + # know the data must be 7bit, otherwise treat it as 8bit. + try: + orig.encode('ascii') + except UnicodeError: + msg['Content-Transfer-Encoding'] = '8bit' + else: + msg['Content-Transfer-Encoding'] = '7bit' + + + +def encode_noop(msg): + """Do nothing.""" diff --git a/lib-python/2.2/email/Errors.py b/lib-python/2.2/email/Errors.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Errors.py @@ -0,0 +1,26 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""email package exception classes. +""" + + + +class MessageError(Exception): + """Base class for errors in the email package.""" + + +class MessageParseError(MessageError): + """Base class for message parsing errors.""" + + +class HeaderParseError(MessageParseError): + """Error while parsing headers.""" + + +class BoundaryError(MessageParseError): + """Couldn't find terminating boundary.""" + + +class MultipartConversionError(MessageError, TypeError): + """Conversion to a multipart is prohibited.""" diff --git a/lib-python/2.2/email/Generator.py b/lib-python/2.2/email/Generator.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Generator.py @@ -0,0 +1,378 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Classes to generate plain text from a message object tree. +""" + +import re +import sys +import time +import locale +import random + +from types import ListType, StringType +from cStringIO import StringIO + +from email.Header import Header +from email.Parser import NLCRE + +try: + from email._compat22 import _isstring +except SyntaxError: + from email._compat21 import _isstring + +try: + True, False +except NameError: + True = 1 + False = 0 + +EMPTYSTRING = '' +SEMISPACE = '; ' +BAR = '|' +UNDERSCORE = '_' +NL = '\n' +NLTAB = '\n\t' +SEMINLTAB = ';\n\t' +SPACE8 = ' ' * 8 + +fcre = re.compile(r'^From ', re.MULTILINE) + +def _is8bitstring(s): + if isinstance(s, StringType): + try: + unicode(s, 'us-ascii') + except UnicodeError: + return True + return False + + + +class Generator: + """Generates output from a Message object tree. + + This basic generator writes the message to the given file object as plain + text. + """ + # + # Public interface + # + + def __init__(self, outfp, mangle_from_=True, maxheaderlen=78): + """Create the generator for message flattening. + + outfp is the output file-like object for writing the message to. It + must have a write() method. + + Optional mangle_from_ is a flag that, when True (the default), escapes + From_ lines in the body of the message by putting a `>' in front of + them. + + Optional maxheaderlen specifies the longest length for a non-continued + header. When a header line is longer (in characters, with tabs + expanded to 8 spaces), than maxheaderlen, the header will be broken on + semicolons and continued as per RFC 2822. If no semicolon is found, + then the header is left alone. Set to zero to disable wrapping + headers. Default is 78, as recommended (but not required by RFC + 2822. + """ + self._fp = outfp + self._mangle_from_ = mangle_from_ + self.__maxheaderlen = maxheaderlen + + def write(self, s): + # Just delegate to the file object + self._fp.write(s) + + def flatten(self, msg, unixfrom=False): + """Print the message object tree rooted at msg to the output file + specified when the Generator instance was created. + + unixfrom is a flag that forces the printing of a Unix From_ delimiter + before the first object in the message tree. If the original message + has no From_ delimiter, a `standard' one is crafted. By default, this + is False to inhibit the printing of any From_ delimiter. + + Note that for subobjects, no From_ line is printed. + """ + if unixfrom: + ufrom = msg.get_unixfrom() + if not ufrom: + ufrom = 'From nobody ' + time.ctime(time.time()) + print >> self._fp, ufrom + self._write(msg) + + # For backwards compatibility, but this is slower + __call__ = flatten + + def clone(self, fp): + """Clone this generator with the exact same options.""" + return self.__class__(fp, self._mangle_from_, self.__maxheaderlen) + + # + # Protected interface - undocumented ;/ + # + + def _write(self, msg): + # We can't write the headers yet because of the following scenario: + # say a multipart message includes the boundary string somewhere in + # its body. We'd have to calculate the new boundary /before/ we write + # the headers so that we can write the correct Content-Type: + # parameter. + # + # The way we do this, so as to make the _handle_*() methods simpler, + # is to cache any subpart writes into a StringIO. The we write the + # headers and the StringIO contents. That way, subpart handlers can + # Do The Right Thing, and can still modify the Content-Type: header if + # necessary. + oldfp = self._fp + try: + self._fp = sfp = StringIO() + self._dispatch(msg) + finally: + self._fp = oldfp + # Write the headers. First we see if the message object wants to + # handle that itself. If not, we'll do it generically. + meth = getattr(msg, '_write_headers', None) + if meth is None: + self._write_headers(msg) + else: + meth(self) + self._fp.write(sfp.getvalue()) + + def _dispatch(self, msg): + # Get the Content-Type: for the message, then try to dispatch to + # self._handle__(). If there's no handler for the + # full MIME type, then dispatch to self._handle_(). If + # that's missing too, then dispatch to self._writeBody(). + main = msg.get_content_maintype() + sub = msg.get_content_subtype() + specific = UNDERSCORE.join((main, sub)).replace('-', '_') + meth = getattr(self, '_handle_' + specific, None) + if meth is None: + generic = main.replace('-', '_') + meth = getattr(self, '_handle_' + generic, None) + if meth is None: + meth = self._writeBody + meth(msg) + + # + # Default handlers + # + + def _write_headers(self, msg): + for h, v in msg.items(): + print >> self._fp, '%s:' % h, + if self.__maxheaderlen == 0: + # Explicit no-wrapping + print >> self._fp, v + elif isinstance(v, Header): + # Header instances know what to do + print >> self._fp, v.encode() + elif _is8bitstring(v): + # If we have raw 8bit data in a byte string, we have no idea + # what the encoding is. There is no safe way to split this + # string. If it's ascii-subset, then we could do a normal + # ascii split, but if it's multibyte then we could break the + # string. There's no way to know so the least harm seems to + # be to not split the string and risk it being too long. + print >> self._fp, v + else: + # Header's got lots of smarts, so use it. + print >> self._fp, Header( + v, maxlinelen=self.__maxheaderlen, + header_name=h, continuation_ws='\t').encode() + # A blank line always separates headers from body + print >> self._fp + + # + # Handlers for writing types and subtypes + # + + def _handle_text(self, msg): + payload = msg.get_payload() + if payload is None: + return + cset = msg.get_charset() + if cset is not None: + payload = cset.body_encode(payload) + if not _isstring(payload): + raise TypeError, 'string payload expected: %s' % type(payload) + if self._mangle_from_: + payload = fcre.sub('>From ', payload) + self._fp.write(payload) + + # Default body handler + _writeBody = _handle_text + + def _handle_multipart(self, msg): + # The trick here is to write out each part separately, merge them all + # together, and then make sure that the boundary we've chosen isn't + # present in the payload. + msgtexts = [] + subparts = msg.get_payload() + if subparts is None: + # Nothing has ever been attached + boundary = msg.get_boundary(failobj=_make_boundary()) + print >> self._fp, '--' + boundary + print >> self._fp, '\n' + print >> self._fp, '--' + boundary + '--' + return + elif _isstring(subparts): + # e.g. a non-strict parse of a message with no starting boundary. + self._fp.write(subparts) + return + elif not isinstance(subparts, ListType): + # Scalar payload + subparts = [subparts] + for part in subparts: + s = StringIO() + g = self.clone(s) + g.flatten(part, unixfrom=False) + msgtexts.append(s.getvalue()) + # Now make sure the boundary we've selected doesn't appear in any of + # the message texts. + alltext = NL.join(msgtexts) + # BAW: What about boundaries that are wrapped in double-quotes? + boundary = msg.get_boundary(failobj=_make_boundary(alltext)) + # If we had to calculate a new boundary because the body text + # contained that string, set the new boundary. We don't do it + # unconditionally because, while set_boundary() preserves order, it + # doesn't preserve newlines/continuations in headers. This is no big + # deal in practice, but turns out to be inconvenient for the unittest + # suite. + if msg.get_boundary() <> boundary: + msg.set_boundary(boundary) + # Write out any preamble + if msg.preamble is not None: + self._fp.write(msg.preamble) + # If preamble is the empty string, the length of the split will be + # 1, but the last element will be the empty string. If it's + # anything else but does not end in a line separator, the length + # will be > 1 and not end in an empty string. We need to + # guarantee a newline after the preamble, but don't add too many. + plines = NLCRE.split(msg.preamble) + if plines <> [''] and plines[-1] <> '': + self._fp.write('\n') + # First boundary is a bit different; it doesn't have a leading extra + # newline. + print >> self._fp, '--' + boundary + # Join and write the individual parts + joiner = '\n--' + boundary + '\n' + self._fp.write(joiner.join(msgtexts)) + print >> self._fp, '\n--' + boundary + '--', + # Write out any epilogue + if msg.epilogue is not None: + if not msg.epilogue.startswith('\n'): + print >> self._fp + self._fp.write(msg.epilogue) + + def _handle_message_delivery_status(self, msg): + # We can't just write the headers directly to self's file object + # because this will leave an extra newline between the last header + # block and the boundary. Sigh. + blocks = [] + for part in msg.get_payload(): + s = StringIO() + g = self.clone(s) + g.flatten(part, unixfrom=False) + text = s.getvalue() + lines = text.split('\n') + # Strip off the unnecessary trailing empty line + if lines and lines[-1] == '': + blocks.append(NL.join(lines[:-1])) + else: + blocks.append(text) + # Now join all the blocks with an empty line. This has the lovely + # effect of separating each block with an empty line, but not adding + # an extra one after the last one. + self._fp.write(NL.join(blocks)) + + def _handle_message(self, msg): + s = StringIO() + g = self.clone(s) + # The payload of a message/rfc822 part should be a multipart sequence + # of length 1. The zeroth element of the list should be the Message + # object for the subpart. Extract that object, stringify it, and + # write it out. + g.flatten(msg.get_payload(0), unixfrom=False) + self._fp.write(s.getvalue()) + + + +class DecodedGenerator(Generator): + """Generator a text representation of a message. + + Like the Generator base class, except that non-text parts are substituted + with a format string representing the part. + """ + def __init__(self, outfp, mangle_from_=True, maxheaderlen=78, fmt=None): + """Like Generator.__init__() except that an additional optional + argument is allowed. + + Walks through all subparts of a message. If the subpart is of main + type `text', then it prints the decoded payload of the subpart. + + Otherwise, fmt is a format string that is used instead of the message + payload. fmt is expanded with the following keywords (in + %(keyword)s format): + + type : Full MIME type of the non-text part + maintype : Main MIME type of the non-text part + subtype : Sub-MIME type of the non-text part + filename : Filename of the non-text part + description: Description associated with the non-text part + encoding : Content transfer encoding of the non-text part + + The default value for fmt is None, meaning + + [Non-text (%(type)s) part of message omitted, filename %(filename)s] + """ + Generator.__init__(self, outfp, mangle_from_, maxheaderlen) + if fmt is None: + fmt = ('[Non-text (%(type)s) part of message omitted, ' + 'filename %(filename)s]') + self._fmt = fmt + + def _dispatch(self, msg): + for part in msg.walk(): + maintype = part.get_main_type('text') + if maintype == 'text': + print >> self, part.get_payload(decode=True) + elif maintype == 'multipart': + # Just skip this + pass + else: + print >> self, self._fmt % { + 'type' : part.get_type('[no MIME type]'), + 'maintype' : part.get_main_type('[no main MIME type]'), + 'subtype' : part.get_subtype('[no sub-MIME type]'), + 'filename' : part.get_filename('[no filename]'), + 'description': part.get('Content-Description', + '[no description]'), + 'encoding' : part.get('Content-Transfer-Encoding', + '[no encoding]'), + } + + + +# Helper +_width = len(repr(sys.maxint-1)) +_fmt = '%%0%dd' % _width + +def _make_boundary(text=None): + # Craft a random boundary. If text is given, ensure that the chosen + # boundary doesn't appear in the text. + token = random.randint(0, sys.maxint-1) + boundary = ('=' * 15) + (_fmt % token) + '==' + if text is None: + return boundary + b = boundary + counter = 0 + while True: + cre = re.compile('^--' + re.escape(b) + '(--)?$', re.MULTILINE) + if not cre.search(text): + break + b = boundary + '.' + str(counter) + counter += 1 + return b diff --git a/lib-python/2.2/email/Header.py b/lib-python/2.2/email/Header.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Header.py @@ -0,0 +1,515 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: che at debian.org (Ben Gertzfield), barry at zope.com (Barry Warsaw) + +"""Header encoding and decoding functionality.""" + +import re +import binascii +from types import StringType, UnicodeType + +import email.quopriMIME +import email.base64MIME +from email.Errors import HeaderParseError +from email.Charset import Charset + +try: + from email._compat22 import _floordiv +except SyntaxError: + # Python 2.1 spells integer division differently + from email._compat21 import _floordiv + +try: + True, False +except NameError: + True = 1 + False = 0 + +CRLFSPACE = '\r\n ' +CRLF = '\r\n' +NL = '\n' +SPACE = ' ' +USPACE = u' ' +SPACE8 = ' ' * 8 +EMPTYSTRING = '' +UEMPTYSTRING = u'' + +MAXLINELEN = 76 + +ENCODE = 1 +DECODE = 2 + +USASCII = Charset('us-ascii') +UTF8 = Charset('utf-8') + +# Match encoded-word strings in the form =?charset?q?Hello_World?= +ecre = re.compile(r''' + =\? # literal =? + (?P[^?]*?) # non-greedy up to the next ? is the charset + \? # literal ? + (?P[qb]) # either a "q" or a "b", case insensitive + \? # literal ? + (?P.*?) # non-greedy up to the next ?= is the encoded string + \?= # literal ?= + ''', re.VERBOSE | re.IGNORECASE) + +pcre = re.compile('([,;])') + +# Field name regexp, including trailing colon, but not separating whitespace, +# according to RFC 2822. Character range is from tilde to exclamation mark. +# For use with .match() +fcre = re.compile(r'[\041-\176]+:$') + + + +# Helpers +_max_append = email.quopriMIME._max_append + + + +def decode_header(header): + """Decode a message header value without converting charset. + + Returns a list of (decoded_string, charset) pairs containing each of the + decoded parts of the header. Charset is None for non-encoded parts of the + header, otherwise a lower-case string containing the name of the character + set specified in the encoded string. + + An email.Errors.HeaderParseError may be raised when certain decoding error + occurs (e.g. a base64 decoding exception). + """ + # If no encoding, just return the header + header = str(header) + if not ecre.search(header): + return [(header, None)] + decoded = [] + dec = '' + for line in header.splitlines(): + # This line might not have an encoding in it + if not ecre.search(line): + decoded.append((line, None)) + continue + parts = ecre.split(line) + while parts: + unenc = parts.pop(0).strip() + if unenc: + # Should we continue a long line? + if decoded and decoded[-1][1] is None: + decoded[-1] = (decoded[-1][0] + SPACE + unenc, None) + else: + decoded.append((unenc, None)) + if parts: + charset, encoding = [s.lower() for s in parts[0:2]] + encoded = parts[2] + dec = None + if encoding == 'q': + dec = email.quopriMIME.header_decode(encoded) + elif encoding == 'b': + try: + dec = email.base64MIME.decode(encoded) + except binascii.Error: + # Turn this into a higher level exception. BAW: Right + # now we throw the lower level exception away but + # when/if we get exception chaining, we'll preserve it. + raise HeaderParseError + if dec is None: + dec = encoded + + if decoded and decoded[-1][1] == charset: + decoded[-1] = (decoded[-1][0] + dec, decoded[-1][1]) + else: + decoded.append((dec, charset)) + del parts[0:3] + return decoded + + + +def make_header(decoded_seq, maxlinelen=None, header_name=None, + continuation_ws=' '): + """Create a Header from a sequence of pairs as returned by decode_header() + + decode_header() takes a header value string and returns a sequence of + pairs of the format (decoded_string, charset) where charset is the string + name of the character set. + + This function takes one of those sequence of pairs and returns a Header + instance. Optional maxlinelen, header_name, and continuation_ws are as in + the Header constructor. + """ + h = Header(maxlinelen=maxlinelen, header_name=header_name, + continuation_ws=continuation_ws) + for s, charset in decoded_seq: + # None means us-ascii but we can simply pass it on to h.append() + if charset is not None and not isinstance(charset, Charset): + charset = Charset(charset) + h.append(s, charset) + return h + + + +class Header: + def __init__(self, s=None, charset=None, + maxlinelen=None, header_name=None, + continuation_ws=' ', errors='strict'): + """Create a MIME-compliant header that can contain many character sets. + + Optional s is the initial header value. If None, the initial header + value is not set. You can later append to the header with .append() + method calls. s may be a byte string or a Unicode string, but see the + .append() documentation for semantics. + + Optional charset serves two purposes: it has the same meaning as the + charset argument to the .append() method. It also sets the default + character set for all subsequent .append() calls that omit the charset + argument. If charset is not provided in the constructor, the us-ascii + charset is used both as s's initial charset and as the default for + subsequent .append() calls. + + The maximum line length can be specified explicit via maxlinelen. For + splitting the first line to a shorter value (to account for the field + header which isn't included in s, e.g. `Subject') pass in the name of + the field in header_name. The default maxlinelen is 76. + + continuation_ws must be RFC 2822 compliant folding whitespace (usually + either a space or a hard tab) which will be prepended to continuation + lines. + + errors is passed through to the .append() call. + """ + if charset is None: + charset = USASCII + if not isinstance(charset, Charset): + charset = Charset(charset) + self._charset = charset + self._continuation_ws = continuation_ws + cws_expanded_len = len(continuation_ws.replace('\t', SPACE8)) + # BAW: I believe `chunks' and `maxlinelen' should be non-public. + self._chunks = [] + if s is not None: + self.append(s, charset, errors) + if maxlinelen is None: + maxlinelen = MAXLINELEN + if header_name is None: + # We don't know anything about the field header so the first line + # is the same length as subsequent lines. + self._firstlinelen = maxlinelen + else: + # The first line should be shorter to take into account the field + # header. Also subtract off 2 extra for the colon and space. + self._firstlinelen = maxlinelen - len(header_name) - 2 + # Second and subsequent lines should subtract off the length in + # columns of the continuation whitespace prefix. + self._maxlinelen = maxlinelen - cws_expanded_len + + def __str__(self): + """A synonym for self.encode().""" + return self.encode() + + def __unicode__(self): + """Helper for the built-in unicode function.""" + uchunks = [] + lastcs = None + for s, charset in self._chunks: + # We must preserve spaces between encoded and non-encoded word + # boundaries, which means for us we need to add a space when we go + # from a charset to None/us-ascii, or from None/us-ascii to a + # charset. Only do this for the second and subsequent chunks. + nextcs = charset + if uchunks: + if lastcs not in (None, 'us-ascii'): + if nextcs in (None, 'us-ascii'): + uchunks.append(USPACE) + nextcs = None + elif nextcs not in (None, 'us-ascii'): + uchunks.append(USPACE) + lastcs = nextcs + uchunks.append(unicode(s, str(charset))) + return UEMPTYSTRING.join(uchunks) + + # Rich comparison operators for equality only. BAW: does it make sense to + # have or explicitly disable <, <=, >, >= operators? + def __eq__(self, other): + # other may be a Header or a string. Both are fine so coerce + # ourselves to a string, swap the args and do another comparison. + return other == self.encode() + + def __ne__(self, other): + return not self == other + + def append(self, s, charset=None, errors='strict'): + """Append a string to the MIME header. + + Optional charset, if given, should be a Charset instance or the name + of a character set (which will be converted to a Charset instance). A + value of None (the default) means that the charset given in the + constructor is used. + + s may be a byte string or a Unicode string. If it is a byte string + (i.e. isinstance(s, StringType) is true), then charset is the encoding + of that byte string, and a UnicodeError will be raised if the string + cannot be decoded with that charset. If s is a Unicode string, then + charset is a hint specifying the character set of the characters in + the string. In this case, when producing an RFC 2822 compliant header + using RFC 2047 rules, the Unicode string will be encoded using the + following charsets in order: us-ascii, the charset hint, utf-8. The + first character set not to provoke a UnicodeError is used. + + Optional `errors' is passed as the third argument to any unicode() or + ustr.encode() call. + """ + if charset is None: + charset = self._charset + elif not isinstance(charset, Charset): + charset = Charset(charset) + # If the charset is our faux 8bit charset, leave the string unchanged + if charset <> '8bit': + # We need to test that the string can be converted to unicode and + # back to a byte string, given the input and output codecs of the + # charset. + if isinstance(s, StringType): + # Possibly raise UnicodeError if the byte string can't be + # converted to a unicode with the input codec of the charset. + incodec = charset.input_codec or 'us-ascii' + ustr = unicode(s, incodec, errors) + # Now make sure that the unicode could be converted back to a + # byte string with the output codec, which may be different + # than the iput coded. Still, use the original byte string. + outcodec = charset.output_codec or 'us-ascii' + ustr.encode(outcodec, errors) + elif isinstance(s, UnicodeType): + # Now we have to be sure the unicode string can be converted + # to a byte string with a reasonable output codec. We want to + # use the byte string in the chunk. + for charset in USASCII, charset, UTF8: + try: + outcodec = charset.output_codec or 'us-ascii' + s = s.encode(outcodec, errors) + break + except UnicodeError: + pass + else: + assert False, 'utf-8 conversion failed' + self._chunks.append((s, charset)) + + def _split(self, s, charset, maxlinelen, splitchars): + # Split up a header safely for use with encode_chunks. + splittable = charset.to_splittable(s) + encoded = charset.from_splittable(splittable, True) + elen = charset.encoded_header_len(encoded) + # If the line's encoded length first, just return it + if elen <= maxlinelen: + return [(encoded, charset)] + # If we have undetermined raw 8bit characters sitting in a byte + # string, we really don't know what the right thing to do is. We + # can't really split it because it might be multibyte data which we + # could break if we split it between pairs. The least harm seems to + # be to not split the header at all, but that means they could go out + # longer than maxlinelen. + if charset == '8bit': + return [(s, charset)] + # BAW: I'm not sure what the right test here is. What we're trying to + # do is be faithful to RFC 2822's recommendation that ($2.2.3): + # + # "Note: Though structured field bodies are defined in such a way that + # folding can take place between many of the lexical tokens (and even + # within some of the lexical tokens), folding SHOULD be limited to + # placing the CRLF at higher-level syntactic breaks." + # + # For now, I can only imagine doing this when the charset is us-ascii, + # although it's possible that other charsets may also benefit from the + # higher-level syntactic breaks. + elif charset == 'us-ascii': + return self._split_ascii(s, charset, maxlinelen, splitchars) + # BAW: should we use encoded? + elif elen == len(s): + # We can split on _maxlinelen boundaries because we know that the + # encoding won't change the size of the string + splitpnt = maxlinelen + first = charset.from_splittable(splittable[:splitpnt], False) + last = charset.from_splittable(splittable[splitpnt:], False) + else: + # Binary search for split point + first, last = _binsplit(splittable, charset, maxlinelen) + # first is of the proper length so just wrap it in the appropriate + # chrome. last must be recursively split. + fsplittable = charset.to_splittable(first) + fencoded = charset.from_splittable(fsplittable, True) + chunk = [(fencoded, charset)] + return chunk + self._split(last, charset, self._maxlinelen, splitchars) + + def _split_ascii(self, s, charset, firstlen, splitchars): + chunks = _split_ascii(s, firstlen, self._maxlinelen, + self._continuation_ws, splitchars) + return zip(chunks, [charset]*len(chunks)) + + def _encode_chunks(self, newchunks, maxlinelen): + # MIME-encode a header with many different charsets and/or encodings. + # + # Given a list of pairs (string, charset), return a MIME-encoded + # string suitable for use in a header field. Each pair may have + # different charsets and/or encodings, and the resulting header will + # accurately reflect each setting. + # + # Each encoding can be email.Utils.QP (quoted-printable, for + # ASCII-like character sets like iso-8859-1), email.Utils.BASE64 + # (Base64, for non-ASCII like character sets like KOI8-R and + # iso-2022-jp), or None (no encoding). + # + # Each pair will be represented on a separate line; the resulting + # string will be in the format: + # + # =?charset1?q?Mar=EDa_Gonz=E1lez_Alonso?=\n + # =?charset2?b?SvxyZ2VuIEL2aW5n?=" + chunks = [] + for header, charset in newchunks: + if not header: + continue + if charset is None or charset.header_encoding is None: + s = header + else: + s = charset.header_encode(header) + # Don't add more folding whitespace than necessary + if chunks and chunks[-1].endswith(' '): + extra = '' + else: + extra = ' ' + _max_append(chunks, s, maxlinelen, extra) + joiner = NL + self._continuation_ws + return joiner.join(chunks) + + def encode(self, splitchars=';, '): + """Encode a message header into an RFC-compliant format. + + There are many issues involved in converting a given string for use in + an email header. Only certain character sets are readable in most + email clients, and as header strings can only contain a subset of + 7-bit ASCII, care must be taken to properly convert and encode (with + Base64 or quoted-printable) header strings. In addition, there is a + 75-character length limit on any given encoded header field, so + line-wrapping must be performed, even with double-byte character sets. + + This method will do its best to convert the string to the correct + character set used in email, and encode and line wrap it safely with + the appropriate scheme for that character set. + + If the given charset is not known or an error occurs during + conversion, this function will return the header untouched. + + Optional splitchars is a string containing characters to split long + ASCII lines on, in rough support of RFC 2822's `highest level + syntactic breaks'. This doesn't affect RFC 2047 encoded lines. + """ + newchunks = [] + maxlinelen = self._firstlinelen + lastlen = 0 + for s, charset in self._chunks: + # The first bit of the next chunk should be just long enough to + # fill the next line. Don't forget the space separating the + # encoded words. + targetlen = maxlinelen - lastlen - 1 + if targetlen < charset.encoded_header_len(''): + # Stick it on the next line + targetlen = maxlinelen + newchunks += self._split(s, charset, targetlen, splitchars) + lastchunk, lastcharset = newchunks[-1] + lastlen = lastcharset.encoded_header_len(lastchunk) + return self._encode_chunks(newchunks, maxlinelen) + + + +def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars): + lines = [] + maxlen = firstlen + for line in s.splitlines(): + # Ignore any leading whitespace (i.e. continuation whitespace) already + # on the line, since we'll be adding our own. + line = line.lstrip() + if len(line) < maxlen: + lines.append(line) + maxlen = restlen + continue + # Attempt to split the line at the highest-level syntactic break + # possible. Note that we don't have a lot of smarts about field + # syntax; we just try to break on semi-colons, then commas, then + # whitespace. + for ch in splitchars: + if line.find(ch) >= 0: + break + else: + # There's nothing useful to split the line on, not even spaces, so + # just append this line unchanged + lines.append(line) + maxlen = restlen + continue + # Now split the line on the character plus trailing whitespace + cre = re.compile(r'%s\s*' % ch) + if ch in ';,': + eol = ch + else: + eol = '' + joiner = eol + ' ' + joinlen = len(joiner) + wslen = len(continuation_ws.replace('\t', SPACE8)) + this = [] + linelen = 0 + for part in cre.split(line): + curlen = linelen + max(0, len(this)-1) * joinlen + partlen = len(part) + onfirstline = not lines + # We don't want to split after the field name, if we're on the + # first line and the field name is present in the header string. + if ch == ' ' and onfirstline and \ + len(this) == 1 and fcre.match(this[0]): + this.append(part) + linelen += partlen + elif curlen + partlen > maxlen: + if this: + lines.append(joiner.join(this) + eol) + # If this part is longer than maxlen and we aren't already + # splitting on whitespace, try to recursively split this line + # on whitespace. + if partlen > maxlen and ch <> ' ': + subl = _split_ascii(part, maxlen, restlen, + continuation_ws, ' ') + lines.extend(subl[:-1]) + this = [subl[-1]] + else: + this = [part] + linelen = wslen + len(this[-1]) + maxlen = restlen + else: + this.append(part) + linelen += partlen + # Put any left over parts on a line by themselves + if this: + lines.append(joiner.join(this)) + return lines + + + +def _binsplit(splittable, charset, maxlinelen): + i = 0 + j = len(splittable) + while i < j: + # Invariants: + # 1. splittable[:k] fits for all k <= i (note that we *assume*, + # at the start, that splittable[:0] fits). + # 2. splittable[:k] does not fit for any k > j (at the start, + # this means we shouldn't look at any k > len(splittable)). + # 3. We don't know about splittable[:k] for k in i+1..j. + # 4. We want to set i to the largest k that fits, with i <= k <= j. + # + m = (i+j+1) >> 1 # ceiling((i+j)/2); i < m <= j + chunk = charset.from_splittable(splittable[:m], True) + chunklen = charset.encoded_header_len(chunk) + if chunklen <= maxlinelen: + # m is acceptable, so is a new lower bound. + i = m + else: + # m is not acceptable, so final i must be < m. + j = m - 1 + # i == j. Invariant #1 implies that splittable[:i] fits, and + # invariant #2 implies that splittable[:i+1] does not fit, so i + # is what we're looking for. + first = charset.from_splittable(splittable[:i], False) + last = charset.from_splittable(splittable[i:], False) + return first, last diff --git a/lib-python/2.2/email/Iterators.py b/lib-python/2.2/email/Iterators.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Iterators.py @@ -0,0 +1,25 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Various types of useful iterators and generators. +""" + +import sys + +try: + from email._compat22 import body_line_iterator, typed_subpart_iterator +except SyntaxError: + # Python 2.1 doesn't have generators + from email._compat21 import body_line_iterator, typed_subpart_iterator + + + +def _structure(msg, fp=None, level=0): + """A handy debugging aid""" + if fp is None: + fp = sys.stdout + tab = ' ' * (level * 4) + print >> fp, tab + msg.get_content_type() + if msg.is_multipart(): + for subpart in msg.get_payload(): + _structure(subpart, fp, level+1) diff --git a/lib-python/2.2/email/MIMEAudio.py b/lib-python/2.2/email/MIMEAudio.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEAudio.py @@ -0,0 +1,71 @@ +# Author: Anthony Baxter + +"""Class representing audio/* type MIME documents. +""" + +import sndhdr +from cStringIO import StringIO + +from email import Errors +from email import Encoders +from email.MIMENonMultipart import MIMENonMultipart + + + +_sndhdr_MIMEmap = {'au' : 'basic', + 'wav' :'x-wav', + 'aiff':'x-aiff', + 'aifc':'x-aiff', + } + +# There are others in sndhdr that don't have MIME types. :( +# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma?? +def _whatsnd(data): + """Try to identify a sound file type. + + sndhdr.what() has a pretty cruddy interface, unfortunately. This is why + we re-do it here. It would be easier to reverse engineer the Unix 'file' + command and use the standard 'magic' file, as shipped with a modern Unix. + """ + hdr = data[:512] + fakefile = StringIO(hdr) + for testfn in sndhdr.tests: + res = testfn(hdr, fakefile) + if res is not None: + return _sndhdr_MIMEmap.get(res[0]) + return None + + + +class MIMEAudio(MIMENonMultipart): + """Class for generating audio/* MIME documents.""" + + def __init__(self, _audiodata, _subtype=None, + _encoder=Encoders.encode_base64, **_params): + """Create an audio/* type MIME document. + + _audiodata is a string containing the raw audio data. If this data + can be decoded by the standard Python `sndhdr' module, then the + subtype will be automatically included in the Content-Type header. + Otherwise, you can specify the specific audio subtype via the + _subtype parameter. If _subtype is not given, and no subtype can be + guessed, a TypeError is raised. + + _encoder is a function which will perform the actual encoding for + transport of the image data. It takes one argument, which is this + Image instance. It should use get_payload() and set_payload() to + change the payload to the encoded form. It should also add any + Content-Transfer-Encoding or other headers to the message as + necessary. The default encoding is Base64. + + Any additional keyword arguments are passed to the base class + constructor, which turns them into parameters on the Content-Type + header. + """ + if _subtype is None: + _subtype = _whatsnd(_audiodata) + if _subtype is None: + raise TypeError, 'Could not find audio MIME subtype' + MIMENonMultipart.__init__(self, 'audio', _subtype, **_params) + self.set_payload(_audiodata) + _encoder(self) diff --git a/lib-python/2.2/email/MIMEBase.py b/lib-python/2.2/email/MIMEBase.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEBase.py @@ -0,0 +1,24 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Base class for MIME specializations. +""" + +from email import Message + + + +class MIMEBase(Message.Message): + """Base class for MIME specializations.""" + + def __init__(self, _maintype, _subtype, **_params): + """This constructor adds a Content-Type: and a MIME-Version: header. + + The Content-Type: header is taken from the _maintype and _subtype + arguments. Additional parameters for this header are taken from the + keyword arguments. + """ + Message.Message.__init__(self) + ctype = '%s/%s' % (_maintype, _subtype) + self.add_header('Content-Type', ctype, **_params) + self['MIME-Version'] = '1.0' diff --git a/lib-python/2.2/email/MIMEImage.py b/lib-python/2.2/email/MIMEImage.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEImage.py @@ -0,0 +1,45 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Class representing image/* type MIME documents. +""" + +import imghdr + +from email import Errors +from email import Encoders +from email.MIMENonMultipart import MIMENonMultipart + + + +class MIMEImage(MIMENonMultipart): + """Class for generating image/* type MIME documents.""" + + def __init__(self, _imagedata, _subtype=None, + _encoder=Encoders.encode_base64, **_params): + """Create an image/* type MIME document. + + _imagedata is a string containing the raw image data. If this data + can be decoded by the standard Python `imghdr' module, then the + subtype will be automatically included in the Content-Type header. + Otherwise, you can specify the specific image subtype via the _subtype + parameter. + + _encoder is a function which will perform the actual encoding for + transport of the image data. It takes one argument, which is this + Image instance. It should use get_payload() and set_payload() to + change the payload to the encoded form. It should also add any + Content-Transfer-Encoding or other headers to the message as + necessary. The default encoding is Base64. + + Any additional keyword arguments are passed to the base class + constructor, which turns them into parameters on the Content-Type + header. + """ + if _subtype is None: + _subtype = imghdr.what(None, _imagedata) + if _subtype is None: + raise TypeError, 'Could not guess image MIME subtype' + MIMENonMultipart.__init__(self, 'image', _subtype, **_params) + self.set_payload(_imagedata) + _encoder(self) diff --git a/lib-python/2.2/email/MIMEMessage.py b/lib-python/2.2/email/MIMEMessage.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEMessage.py @@ -0,0 +1,32 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Class representing message/* MIME documents. +""" + +from email import Message +from email.MIMENonMultipart import MIMENonMultipart + + + +class MIMEMessage(MIMENonMultipart): + """Class representing message/* MIME documents.""" + + def __init__(self, _msg, _subtype='rfc822'): + """Create a message/* type MIME document. + + _msg is a message object and must be an instance of Message, or a + derived class of Message, otherwise a TypeError is raised. + + Optional _subtype defines the subtype of the contained message. The + default is "rfc822" (this is defined by the MIME standard, even though + the term "rfc822" is technically outdated by RFC 2822). + """ + MIMENonMultipart.__init__(self, 'message', _subtype) + if not isinstance(_msg, Message.Message): + raise TypeError, 'Argument is not an instance of Message' + # It's convenient to use this base class method. We need to do it + # this way or we'll get an exception + Message.Message.attach(self, _msg) + # And be sure our default type is set correctly + self.set_default_type('message/rfc822') diff --git a/lib-python/2.2/email/MIMEMultipart.py b/lib-python/2.2/email/MIMEMultipart.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEMultipart.py @@ -0,0 +1,37 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Base class for MIME multipart/* type messages. +""" + +from email import MIMEBase + + + +class MIMEMultipart(MIMEBase.MIMEBase): + """Base class for MIME multipart/* type messages.""" + + def __init__(self, _subtype='mixed', boundary=None, *_subparts, **_params): + """Creates a multipart/* type message. + + By default, creates a multipart/mixed message, with proper + Content-Type and MIME-Version headers. + + _subtype is the subtype of the multipart content type, defaulting to + `mixed'. + + boundary is the multipart boundary string. By default it is + calculated as needed. + + _subparts is a sequence of initial subparts for the payload. It + must be possible to convert this sequence to a list. You can always + attach new subparts to the message by using the attach() method. + + Additional parameters for the Content-Type header are taken from the + keyword arguments (or passed into the _params argument). + """ + MIMEBase.MIMEBase.__init__(self, 'multipart', _subtype, **_params) + if _subparts: + self.attach(*list(_subparts)) + if boundary: + self.set_boundary(boundary) diff --git a/lib-python/2.2/email/MIMENonMultipart.py b/lib-python/2.2/email/MIMENonMultipart.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMENonMultipart.py @@ -0,0 +1,24 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Base class for MIME type messages that are not multipart. +""" + +from email import Errors +from email import MIMEBase + + + +class MIMENonMultipart(MIMEBase.MIMEBase): + """Base class for MIME multipart/* type messages.""" + + __pychecker__ = 'unusednames=payload' + + def attach(self, payload): + # The public API prohibits attaching multiple subparts to MIMEBase + # derived subtypes since none of them are, by definition, of content + # type multipart/* + raise Errors.MultipartConversionError( + 'Cannot attach additional subparts to non-multipart/*') + + del __pychecker__ diff --git a/lib-python/2.2/email/MIMEText.py b/lib-python/2.2/email/MIMEText.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/MIMEText.py @@ -0,0 +1,45 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Class representing text/* type MIME documents. +""" + +import warnings +from email.MIMENonMultipart import MIMENonMultipart +from email.Encoders import encode_7or8bit + + + +class MIMEText(MIMENonMultipart): + """Class for generating text/* type MIME documents.""" + + def __init__(self, _text, _subtype='plain', _charset='us-ascii', + _encoder=None): + """Create a text/* type MIME document. + + _text is the string for this message object. + + _subtype is the MIME sub content type, defaulting to "plain". + + _charset is the character set parameter added to the Content-Type + header. This defaults to "us-ascii". Note that as a side-effect, the + Content-Transfer-Encoding header will also be set. + + The use of the _encoder is deprecated. The encoding of the payload, + and the setting of the character set parameter now happens implicitly + based on the _charset argument. If _encoder is supplied, then a + DeprecationWarning is used, and the _encoder functionality may + override any header settings indicated by _charset. This is probably + not what you want. + """ + MIMENonMultipart.__init__(self, 'text', _subtype, + **{'charset': _charset}) + self.set_payload(_text, _charset) + if _encoder is not None: + warnings.warn('_encoder argument is obsolete.', + DeprecationWarning, 2) + # Because set_payload() with a _charset will set its own + # Content-Transfer-Encoding header, we need to delete the + # existing one or will end up with two of them. :( + del self['content-transfer-encoding'] + _encoder(self) diff --git a/lib-python/2.2/email/Message.py b/lib-python/2.2/email/Message.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Message.py @@ -0,0 +1,837 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Basic message object for the email package object model. +""" + +import re +import uu +import binascii +import warnings +from cStringIO import StringIO +from types import ListType, TupleType, StringType + +# Intrapackage imports +from email import Utils +from email import Errors +from email import Charset + +SEMISPACE = '; ' + +try: + True, False +except NameError: + True = 1 + False = 0 + +# Regular expression used to split header parameters. BAW: this may be too +# simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches +# most headers found in the wild. We may eventually need a full fledged +# parser eventually. +paramre = re.compile(r'\s*;\s*') +# Regular expression that matches `special' characters in parameters, the +# existance of which force quoting of the parameter value. +tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') + + + +# Helper functions +def _formatparam(param, value=None, quote=True): + """Convenience function to format and return a key=value pair. + + This will quote the value if needed or if quote is true. + """ + if value is not None and len(value) > 0: + # TupleType is used for RFC 2231 encoded parameter values where items + # are (charset, language, value). charset is a string, not a Charset + # instance. + if isinstance(value, TupleType): + # Encode as per RFC 2231 + param += '*' + value = Utils.encode_rfc2231(value[2], value[0], value[1]) + # BAW: Please check this. I think that if quote is set it should + # force quoting even if not necessary. + if quote or tspecials.search(value): + return '%s="%s"' % (param, Utils.quote(value)) + else: + return '%s=%s' % (param, value) + else: + return param + +def _parseparam(s): + plist = [] + while s[:1] == ';': + s = s[1:] + end = s.find(';') + while end > 0 and s.count('"', 0, end) % 2: + end = s.find(';', end + 1) + if end < 0: + end = len(s) + f = s[:end] + if '=' in f: + i = f.index('=') + f = f[:i].strip().lower() + '=' + f[i+1:].strip() + plist.append(f.strip()) + s = s[end:] + return plist + + +def _unquotevalue(value): + if isinstance(value, TupleType): + return value[0], value[1], Utils.unquote(value[2]) + else: + return Utils.unquote(value) + + + +class Message: + """Basic message object. + + A message object is defined as something that has a bunch of RFC 2822 + headers and a payload. It may optionally have an envelope header + (a.k.a. Unix-From or From_ header). If the message is a container (i.e. a + multipart or a message/rfc822), then the payload is a list of Message + objects, otherwise it is a string. + + Message objects implement part of the `mapping' interface, which assumes + there is exactly one occurrance of the header per message. Some headers + do in fact appear multiple times (e.g. Received) and for those headers, + you must use the explicit API to set or get all the headers. Not all of + the mapping methods are implemented. + """ + def __init__(self): + self._headers = [] + self._unixfrom = None + self._payload = None + self._charset = None + # Defaults for multipart messages + self.preamble = self.epilogue = None + # Default content type + self._default_type = 'text/plain' + + def __str__(self): + """Return the entire formatted message as a string. + This includes the headers, body, and envelope header. + """ + return self.as_string(unixfrom=True) + + def as_string(self, unixfrom=False): + """Return the entire formatted message as a string. + Optional `unixfrom' when True, means include the Unix From_ envelope + header. + + This is a convenience method and may not generate the message exactly + as you intend. For more flexibility, use the flatten() method of a + Generator instance. + """ + from email.Generator import Generator + fp = StringIO() + g = Generator(fp) + g.flatten(self, unixfrom=unixfrom) + return fp.getvalue() + + def is_multipart(self): + """Return True if the message consists of multiple parts.""" + if isinstance(self._payload, ListType): + return True + return False + + # + # Unix From_ line + # + def set_unixfrom(self, unixfrom): + self._unixfrom = unixfrom + + def get_unixfrom(self): + return self._unixfrom + + # + # Payload manipulation. + # + def add_payload(self, payload): + """Add the given payload to the current payload. + + If the current payload is empty, then the current payload will be made + a scalar, set to the given value. + + Note: This method is deprecated. Use .attach() instead. + """ + warnings.warn('add_payload() is deprecated, use attach() instead.', + DeprecationWarning, 2) + if self._payload is None: + self._payload = payload + elif isinstance(self._payload, ListType): + self._payload.append(payload) + elif self.get_main_type() not in (None, 'multipart'): + raise Errors.MultipartConversionError( + 'Message main content type must be "multipart" or missing') + else: + self._payload = [self._payload, payload] + + def attach(self, payload): + """Add the given payload to the current payload. + + The current payload will always be a list of objects after this method + is called. If you want to set the payload to a scalar object, use + set_payload() instead. + """ + if self._payload is None: + self._payload = [payload] + else: + self._payload.append(payload) + + def get_payload(self, i=None, decode=False): + """Return a reference to the payload. + + The payload will either be a list object or a string. If you mutate + the list object, you modify the message's payload in place. Optional + i returns that index into the payload. + + Optional decode is a flag indicating whether the payload should be + decoded or not, according to the Content-Transfer-Encoding header + (default is False). + + When True and the message is not a multipart, the payload will be + decoded if this header's value is `quoted-printable' or `base64'. If + some other encoding is used, or the header is missing, or if the + payload has bogus data (i.e. bogus base64 or uuencoded data), the + payload is returned as-is. + + If the message is a multipart and the decode flag is True, then None + is returned. + """ + if i is None: + payload = self._payload + elif not isinstance(self._payload, ListType): + raise TypeError, i + else: + payload = self._payload[i] + if decode: + if self.is_multipart(): + return None + cte = self.get('content-transfer-encoding', '').lower() + if cte == 'quoted-printable': + return Utils._qdecode(payload) + elif cte == 'base64': + try: + return Utils._bdecode(payload) + except binascii.Error: + # Incorrect padding + return payload + elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): + sfp = StringIO() + try: + uu.decode(StringIO(payload+'\n'), sfp) + payload = sfp.getvalue() + except uu.Error: + # Some decoding problem + return payload + # Everything else, including encodings with 8bit or 7bit are returned + # unchanged. + return payload + + def set_payload(self, payload, charset=None): + """Set the payload to the given value. + + Optional charset sets the message's default character set. See + set_charset() for details. + """ + self._payload = payload + if charset is not None: + self.set_charset(charset) + + def set_charset(self, charset): + """Set the charset of the payload to a given character set. + + charset can be a Charset instance, a string naming a character set, or + None. If it is a string it will be converted to a Charset instance. + If charset is None, the charset parameter will be removed from the + Content-Type field. Anything else will generate a TypeError. + + The message will be assumed to be of type text/* encoded with + charset.input_charset. It will be converted to charset.output_charset + and encoded properly, if needed, when generating the plain text + representation of the message. MIME headers (MIME-Version, + Content-Type, Content-Transfer-Encoding) will be added as needed. + + """ + if charset is None: + self.del_param('charset') + self._charset = None + return + if isinstance(charset, StringType): + charset = Charset.Charset(charset) + if not isinstance(charset, Charset.Charset): + raise TypeError, charset + # BAW: should we accept strings that can serve as arguments to the + # Charset constructor? + self._charset = charset + if not self.has_key('MIME-Version'): + self.add_header('MIME-Version', '1.0') + if not self.has_key('Content-Type'): + self.add_header('Content-Type', 'text/plain', + charset=charset.get_output_charset()) + else: + self.set_param('charset', charset.get_output_charset()) + if not self.has_key('Content-Transfer-Encoding'): + cte = charset.get_body_encoding() + if callable(cte): + cte(self) + else: + self.add_header('Content-Transfer-Encoding', cte) + + def get_charset(self): + """Return the Charset instance associated with the message's payload. + """ + return self._charset + + # + # MAPPING INTERFACE (partial) + # + def __len__(self): + """Return the total number of headers, including duplicates.""" + return len(self._headers) + + def __getitem__(self, name): + """Get a header value. + + Return None if the header is missing instead of raising an exception. + + Note that if the header appeared multiple times, exactly which + occurrance gets returned is undefined. Use getall() to get all + the values matching a header field name. + """ + return self.get(name) + + def __setitem__(self, name, val): + """Set the value of a header. + + Note: this does not overwrite an existing header with the same field + name. Use __delitem__() first to delete any existing headers. + """ + self._headers.append((name, val)) + + def __delitem__(self, name): + """Delete all occurrences of a header, if present. + + Does not raise an exception if the header is missing. + """ + name = name.lower() + newheaders = [] + for k, v in self._headers: + if k.lower() <> name: + newheaders.append((k, v)) + self._headers = newheaders + + def __contains__(self, name): + return name.lower() in [k.lower() for k, v in self._headers] + + def has_key(self, name): + """Return true if the message contains the header.""" + missing = [] + return self.get(name, missing) is not missing + + def keys(self): + """Return a list of all the message's header field names. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return [k for k, v in self._headers] + + def values(self): + """Return a list of all the message's header values. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return [v for k, v in self._headers] + + def items(self): + """Get all the message's header fields and values. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return self._headers[:] + + def get(self, name, failobj=None): + """Get a header value. + + Like __getitem__() but return failobj instead of None when the field + is missing. + """ + name = name.lower() + for k, v in self._headers: + if k.lower() == name: + return v + return failobj + + # + # Additional useful stuff + # + + def get_all(self, name, failobj=None): + """Return a list of all the values for the named field. + + These will be sorted in the order they appeared in the original + message, and may contain duplicates. Any fields deleted and + re-inserted are always appended to the header list. + + If no such fields exist, failobj is returned (defaults to None). + """ + values = [] + name = name.lower() + for k, v in self._headers: + if k.lower() == name: + values.append(v) + if not values: + return failobj + return values + + def add_header(self, _name, _value, **_params): + """Extended header setting. + + name is the header field to add. keyword arguments can be used to set + additional parameters for the header field, with underscores converted + to dashes. Normally the parameter will be added as key="value" unless + value is None, in which case only the key will be added. + + Example: + + msg.add_header('content-disposition', 'attachment', filename='bud.gif') + """ + parts = [] + for k, v in _params.items(): + if v is None: + parts.append(k.replace('_', '-')) + else: + parts.append(_formatparam(k.replace('_', '-'), v)) + if _value is not None: + parts.insert(0, _value) + self._headers.append((_name, SEMISPACE.join(parts))) + + def replace_header(self, _name, _value): + """Replace a header. + + Replace the first matching header found in the message, retaining + header order and case. If no matching header was found, a KeyError is + raised. + """ + _name = _name.lower() + for i, (k, v) in zip(range(len(self._headers)), self._headers): + if k.lower() == _name: + self._headers[i] = (k, _value) + break + else: + raise KeyError, _name + + # + # These methods are silently deprecated in favor of get_content_type() and + # friends (see below). They will be noisily deprecated in email 3.0. + # + + def get_type(self, failobj=None): + """Returns the message's content type. + + The returned string is coerced to lowercase and returned as a single + string of the form `maintype/subtype'. If there was no Content-Type + header in the message, failobj is returned (defaults to None). + """ + missing = [] + value = self.get('content-type', missing) + if value is missing: + return failobj + return paramre.split(value)[0].lower().strip() + + def get_main_type(self, failobj=None): + """Return the message's main content type if present.""" + missing = [] + ctype = self.get_type(missing) + if ctype is missing: + return failobj + if ctype.count('/') <> 1: + return failobj + return ctype.split('/')[0] + + def get_subtype(self, failobj=None): + """Return the message's content subtype if present.""" + missing = [] + ctype = self.get_type(missing) + if ctype is missing: + return failobj + if ctype.count('/') <> 1: + return failobj + return ctype.split('/')[1] + + # + # Use these three methods instead of the three above. + # + + def get_content_type(self): + """Return the message's content type. + + The returned string is coerced to lower case of the form + `maintype/subtype'. If there was no Content-Type header in the + message, the default type as given by get_default_type() will be + returned. Since according to RFC 2045, messages always have a default + type this will always return a value. + + RFC 2045 defines a message's default type to be text/plain unless it + appears inside a multipart/digest container, in which case it would be + message/rfc822. + """ + missing = [] + value = self.get('content-type', missing) + if value is missing: + # This should have no parameters + return self.get_default_type() + ctype = paramre.split(value)[0].lower().strip() + # RFC 2045, section 5.2 says if its invalid, use text/plain + if ctype.count('/') <> 1: + return 'text/plain' + return ctype + + def get_content_maintype(self): + """Return the message's main content type. + + This is the `maintype' part of the string returned by + get_content_type(). + """ + ctype = self.get_content_type() + return ctype.split('/')[0] + + def get_content_subtype(self): + """Returns the message's sub-content type. + + This is the `subtype' part of the string returned by + get_content_type(). + """ + ctype = self.get_content_type() + return ctype.split('/')[1] + + def get_default_type(self): + """Return the `default' content type. + + Most messages have a default content type of text/plain, except for + messages that are subparts of multipart/digest containers. Such + subparts have a default content type of message/rfc822. + """ + return self._default_type + + def set_default_type(self, ctype): + """Set the `default' content type. + + ctype should be either "text/plain" or "message/rfc822", although this + is not enforced. The default content type is not stored in the + Content-Type header. + """ + self._default_type = ctype + + def _get_params_preserve(self, failobj, header): + # Like get_params() but preserves the quoting of values. BAW: + # should this be part of the public interface? + missing = [] + value = self.get(header, missing) + if value is missing: + return failobj + params = [] + for p in _parseparam(';' + value): + try: + name, val = p.split('=', 1) + name = name.strip() + val = val.strip() + except ValueError: + # Must have been a bare attribute + name = p.strip() + val = '' + params.append((name, val)) + params = Utils.decode_params(params) + return params + + def get_params(self, failobj=None, header='content-type', unquote=True): + """Return the message's Content-Type parameters, as a list. + + The elements of the returned list are 2-tuples of key/value pairs, as + split on the `=' sign. The left hand side of the `=' is the key, + while the right hand side is the value. If there is no `=' sign in + the parameter the value is the empty string. The value is as + described in the get_param() method. + + Optional failobj is the object to return if there is no Content-Type + header. Optional header is the header to search instead of + Content-Type. If unquote is True, the value is unquoted. + """ + missing = [] + params = self._get_params_preserve(missing, header) + if params is missing: + return failobj + if unquote: + return [(k, _unquotevalue(v)) for k, v in params] + else: + return params + + def get_param(self, param, failobj=None, header='content-type', + unquote=True): + """Return the parameter value if found in the Content-Type header. + + Optional failobj is the object to return if there is no Content-Type + header, or the Content-Type header has no such parameter. Optional + header is the header to search instead of Content-Type. + + Parameter keys are always compared case insensitively. The return + value can either be a string, or a 3-tuple if the parameter was RFC + 2231 encoded. When it's a 3-tuple, the elements of the value are of + the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and + LANGUAGE can be None, in which case you should consider VALUE to be + encoded in the us-ascii charset. You can usually ignore LANGUAGE. + + Your application should be prepared to deal with 3-tuple return + values, and can convert the parameter to a Unicode string like so: + + param = msg.get_param('foo') + if isinstance(param, tuple): + param = unicode(param[2], param[0] or 'us-ascii') + + In any case, the parameter value (either the returned string, or the + VALUE item in the 3-tuple) is always unquoted, unless unquote is set + to False. + """ + if not self.has_key(header): + return failobj + for k, v in self._get_params_preserve(failobj, header): + if k.lower() == param.lower(): + if unquote: + return _unquotevalue(v) + else: + return v + return failobj + + def set_param(self, param, value, header='Content-Type', requote=True, + charset=None, language=''): + """Set a parameter in the Content-Type header. + + If the parameter already exists in the header, its value will be + replaced with the new value. + + If header is Content-Type and has not yet been defined for this + message, it will be set to "text/plain" and the new parameter and + value will be appended as per RFC 2045. + + An alternate header can specified in the header argument, and all + parameters will be quoted as necessary unless requote is False. + + If charset is specified, the parameter will be encoded according to RFC + 2231. Optional language specifies the RFC 2231 language, defaulting + to the empty string. Both charset and language should be strings. + """ + if not isinstance(value, TupleType) and charset: + value = (charset, language, value) + + if not self.has_key(header) and header.lower() == 'content-type': + ctype = 'text/plain' + else: + ctype = self.get(header) + if not self.get_param(param, header=header): + if not ctype: + ctype = _formatparam(param, value, requote) + else: + ctype = SEMISPACE.join( + [ctype, _formatparam(param, value, requote)]) + else: + ctype = '' + for old_param, old_value in self.get_params(header=header, + unquote=requote): + append_param = '' + if old_param.lower() == param.lower(): + append_param = _formatparam(param, value, requote) + else: + append_param = _formatparam(old_param, old_value, requote) + if not ctype: + ctype = append_param + else: + ctype = SEMISPACE.join([ctype, append_param]) + if ctype <> self.get(header): + del self[header] + self[header] = ctype + + def del_param(self, param, header='content-type', requote=True): + """Remove the given parameter completely from the Content-Type header. + + The header will be re-written in place without the parameter or its + value. All values will be quoted as necessary unless requote is + False. Optional header specifies an alternative to the Content-Type + header. + """ + if not self.has_key(header): + return + new_ctype = '' + for p, v in self.get_params(header, unquote=requote): + if p.lower() <> param.lower(): + if not new_ctype: + new_ctype = _formatparam(p, v, requote) + else: + new_ctype = SEMISPACE.join([new_ctype, + _formatparam(p, v, requote)]) + if new_ctype <> self.get(header): + del self[header] + self[header] = new_ctype + + def set_type(self, type, header='Content-Type', requote=True): + """Set the main type and subtype for the Content-Type header. + + type must be a string in the form "maintype/subtype", otherwise a + ValueError is raised. + + This method replaces the Content-Type header, keeping all the + parameters in place. If requote is False, this leaves the existing + header's quoting as is. Otherwise, the parameters will be quoted (the + default). + + An alternative header can be specified in the header argument. When + the Content-Type header is set, we'll always also add a MIME-Version + header. + """ + # BAW: should we be strict? + if not type.count('/') == 1: + raise ValueError + # Set the Content-Type, you get a MIME-Version + if header.lower() == 'content-type': + del self['mime-version'] + self['MIME-Version'] = '1.0' + if not self.has_key(header): + self[header] = type + return + params = self.get_params(header, unquote=requote) + del self[header] + self[header] = type + # Skip the first param; it's the old type. + for p, v in params[1:]: + self.set_param(p, v, header, requote) + + def get_filename(self, failobj=None): + """Return the filename associated with the payload if present. + + The filename is extracted from the Content-Disposition header's + `filename' parameter, and it is unquoted. + """ + missing = [] + filename = self.get_param('filename', missing, 'content-disposition') + if filename is missing: + return failobj + if isinstance(filename, TupleType): + # It's an RFC 2231 encoded parameter + newvalue = _unquotevalue(filename) + return unicode(newvalue[2], newvalue[0] or 'us-ascii') + else: + newvalue = _unquotevalue(filename.strip()) + return newvalue + + def get_boundary(self, failobj=None): + """Return the boundary associated with the payload if present. + + The boundary is extracted from the Content-Type header's `boundary' + parameter, and it is unquoted. + """ + missing = [] + boundary = self.get_param('boundary', missing) + if boundary is missing: + return failobj + if isinstance(boundary, TupleType): + # RFC 2231 encoded, so decode. It better end up as ascii + charset = boundary[0] or 'us-ascii' + return unicode(boundary[2], charset).encode('us-ascii') + return _unquotevalue(boundary.strip()) + + def set_boundary(self, boundary): + """Set the boundary parameter in Content-Type to 'boundary'. + + This is subtly different than deleting the Content-Type header and + adding a new one with a new boundary parameter via add_header(). The + main difference is that using the set_boundary() method preserves the + order of the Content-Type header in the original message. + + HeaderParseError is raised if the message has no Content-Type header. + """ + missing = [] + params = self._get_params_preserve(missing, 'content-type') + if params is missing: + # There was no Content-Type header, and we don't know what type + # to set it to, so raise an exception. + raise Errors.HeaderParseError, 'No Content-Type header found' + newparams = [] + foundp = False + for pk, pv in params: + if pk.lower() == 'boundary': + newparams.append(('boundary', '"%s"' % boundary)) + foundp = True + else: + newparams.append((pk, pv)) + if not foundp: + # The original Content-Type header had no boundary attribute. + # Tack one one the end. BAW: should we raise an exception + # instead??? + newparams.append(('boundary', '"%s"' % boundary)) + # Replace the existing Content-Type header with the new value + newheaders = [] + for h, v in self._headers: + if h.lower() == 'content-type': + parts = [] + for k, v in newparams: + if v == '': + parts.append(k) + else: + parts.append('%s=%s' % (k, v)) + newheaders.append((h, SEMISPACE.join(parts))) + + else: + newheaders.append((h, v)) + self._headers = newheaders + + try: + from email._compat22 import walk + except SyntaxError: + # Must be using Python 2.1 + from email._compat21 import walk + + def get_content_charset(self, failobj=None): + """Return the charset parameter of the Content-Type header. + + The returned string is always coerced to lower case. If there is no + Content-Type header, or if that header has no charset parameter, + failobj is returned. + """ + missing = [] + charset = self.get_param('charset', missing) + if charset is missing: + return failobj + if isinstance(charset, TupleType): + # RFC 2231 encoded, so decode it, and it better end up as ascii. + pcharset = charset[0] or 'us-ascii' + charset = unicode(charset[2], pcharset).encode('us-ascii') + # RFC 2046, $4.1.2 says charsets are not case sensitive + return charset.lower() + + def get_charsets(self, failobj=None): + """Return a list containing the charset(s) used in this message. + + The returned list of items describes the Content-Type headers' + charset parameter for this message and all the subparts in its + payload. + + Each item will either be a string (the value of the charset parameter + in the Content-Type header of that part) or the value of the + 'failobj' parameter (defaults to None), if the part does not have a + main MIME type of "text", or the charset is not defined. + + The list will contain one string for each part of the message, plus + one for the container message (i.e. self), so that a non-multipart + message will still return a list of length 1. + """ + return [part.get_content_charset(failobj) for part in self.walk()] diff --git a/lib-python/2.2/email/Parser.py b/lib-python/2.2/email/Parser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Parser.py @@ -0,0 +1,292 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""A parser of RFC 2822 and MIME email messages. +""" + +import re +from cStringIO import StringIO +from types import ListType + +from email import Errors +from email import Message + +EMPTYSTRING = '' +NL = '\n' + +try: + True, False +except NameError: + True = 1 + False = 0 + +NLCRE = re.compile('\r\n|\r|\n') + + + +class Parser: + def __init__(self, _class=Message.Message, strict=False): + """Parser of RFC 2822 and MIME email messages. + + Creates an in-memory object tree representing the email message, which + can then be manipulated and turned over to a Generator to return the + textual representation of the message. + + The string must be formatted as a block of RFC 2822 headers and header + continuation lines, optionally preceeded by a `Unix-from' header. The + header block is terminated either by the end of the string or by a + blank line. + + _class is the class to instantiate for new message objects when they + must be created. This class must have a constructor that can take + zero arguments. Default is Message.Message. + + Optional strict tells the parser to be strictly RFC compliant or to be + more forgiving in parsing of ill-formatted MIME documents. When + non-strict mode is used, the parser will try to make up for missing or + erroneous boundaries and other peculiarities seen in the wild. + Default is non-strict parsing. + """ + self._class = _class + self._strict = strict + + def parse(self, fp, headersonly=False): + """Create a message structure from the data in a file. + + Reads all the data from the file and returns the root of the message + structure. Optional headersonly is a flag specifying whether to stop + parsing after reading the headers or not. The default is False, + meaning it parses the entire contents of the file. + """ + root = self._class() + firstbodyline = self._parseheaders(root, fp) + if not headersonly: + self._parsebody(root, fp, firstbodyline) + return root + + def parsestr(self, text, headersonly=False): + """Create a message structure from a string. + + Returns the root of the message structure. Optional headersonly is a + flag specifying whether to stop parsing after reading the headers or + not. The default is False, meaning it parses the entire contents of + the file. + """ + return self.parse(StringIO(text), headersonly=headersonly) + + def _parseheaders(self, container, fp): + # Parse the headers, returning a list of header/value pairs. None as + # the header means the Unix-From header. + lastheader = '' + lastvalue = [] + lineno = 0 + firstbodyline = None + while True: + # Don't strip the line before we test for the end condition, + # because whitespace-only header lines are RFC compliant + # continuation lines. + line = fp.readline() + if not line: + break + line = line.splitlines()[0] + if not line: + break + # Ignore the trailing newline + lineno += 1 + # Check for initial Unix From_ line + if line.startswith('From '): + if lineno == 1: + container.set_unixfrom(line) + continue + elif self._strict: + raise Errors.HeaderParseError( + 'Unix-from in headers after first rfc822 header') + else: + # ignore the wierdly placed From_ line + # XXX: maybe set unixfrom anyway? or only if not already? + continue + # Header continuation line + if line[0] in ' \t': + if not lastheader: + raise Errors.HeaderParseError( + 'Continuation line seen before first header') + lastvalue.append(line) + continue + # Normal, non-continuation header. BAW: this should check to make + # sure it's a legal header, e.g. doesn't contain spaces. Also, we + # should expose the header matching algorithm in the API, and + # allow for a non-strict parsing mode (that ignores the line + # instead of raising the exception). + i = line.find(':') + if i < 0: + if self._strict: + raise Errors.HeaderParseError( + "Not a header, not a continuation: ``%s''" % line) + elif lineno == 1 and line.startswith('--'): + # allow through duplicate boundary tags. + continue + else: + # There was no separating blank line as mandated by RFC + # 2822, but we're in non-strict mode. So just offer up + # this current line as the first body line. + firstbodyline = line + break + if lastheader: + container[lastheader] = NL.join(lastvalue) + lastheader = line[:i] + lastvalue = [line[i+1:].lstrip()] + # Make sure we retain the last header + if lastheader: + container[lastheader] = NL.join(lastvalue) + return firstbodyline + + def _parsebody(self, container, fp, firstbodyline=None): + # Parse the body, but first split the payload on the content-type + # boundary if present. + boundary = container.get_boundary() + isdigest = (container.get_content_type() == 'multipart/digest') + # If there's a boundary, split the payload text into its constituent + # parts and parse each separately. Otherwise, just parse the rest of + # the body as a single message. Note: any exceptions raised in the + # recursive parse need to have their line numbers coerced. + if boundary: + preamble = epilogue = None + # Split into subparts. The first boundary we're looking for won't + # always have a leading newline since we're at the start of the + # body text, and there's not always a preamble before the first + # boundary. + separator = '--' + boundary + payload = fp.read() + if firstbodyline is not None: + payload = firstbodyline + '\n' + payload + # We use an RE here because boundaries can have trailing + # whitespace. + mo = re.search( + r'(?P' + re.escape(separator) + r')(?P[ \t]*)', + payload) + if not mo: + if self._strict: + raise Errors.BoundaryError( + "Couldn't find starting boundary: %s" % boundary) + container.set_payload(payload) + return + start = mo.start() + if start > 0: + # there's some pre-MIME boundary preamble + preamble = payload[0:start] + # Find out what kind of line endings we're using + start += len(mo.group('sep')) + len(mo.group('ws')) + mo = NLCRE.search(payload, start) + if mo: + start += len(mo.group(0)) + # We create a compiled regexp first because we need to be able to + # specify the start position, and the module function doesn't + # support this signature. :( + cre = re.compile('(?P\r\n|\r|\n)' + + re.escape(separator) + '--') + mo = cre.search(payload, start) + if mo: + terminator = mo.start() + linesep = mo.group('sep') + if mo.end() < len(payload): + # There's some post-MIME boundary epilogue + epilogue = payload[mo.end():] + elif self._strict: + raise Errors.BoundaryError( + "Couldn't find terminating boundary: %s" % boundary) + else: + # Handle the case of no trailing boundary. Check that it ends + # in a blank line. Some cases (spamspamspam) don't even have + # that! + mo = re.search('(?P\r\n|\r|\n){2}$', payload) + if not mo: + mo = re.search('(?P\r\n|\r|\n)$', payload) + if not mo: + raise Errors.BoundaryError( + 'No terminating boundary and no trailing empty line') + linesep = mo.group('sep') + terminator = len(payload) + # We split the textual payload on the boundary separator, which + # includes the trailing newline. If the container is a + # multipart/digest then the subparts are by default message/rfc822 + # instead of text/plain. In that case, they'll have a optional + # block of MIME headers, then an empty line followed by the + # message headers. + parts = re.split( + linesep + re.escape(separator) + r'[ \t]*' + linesep, + payload[start:terminator]) + for part in parts: + if isdigest: + if part.startswith(linesep): + # There's no header block so create an empty message + # object as the container, and lop off the newline so + # we can parse the sub-subobject + msgobj = self._class() + part = part[len(linesep):] + else: + parthdrs, part = part.split(linesep+linesep, 1) + # msgobj in this case is the "message/rfc822" container + msgobj = self.parsestr(parthdrs, headersonly=1) + # while submsgobj is the message itself + msgobj.set_default_type('message/rfc822') + maintype = msgobj.get_content_maintype() + if maintype in ('message', 'multipart'): + submsgobj = self.parsestr(part) + msgobj.attach(submsgobj) + else: + msgobj.set_payload(part) + else: + msgobj = self.parsestr(part) + container.preamble = preamble + container.epilogue = epilogue + container.attach(msgobj) + elif container.get_main_type() == 'multipart': + # Very bad. A message is a multipart with no boundary! + raise Errors.BoundaryError( + 'multipart message with no defined boundary') + elif container.get_type() == 'message/delivery-status': + # This special kind of type contains blocks of headers separated + # by a blank line. We'll represent each header block as a + # separate Message object + blocks = [] + while True: + blockmsg = self._class() + self._parseheaders(blockmsg, fp) + if not len(blockmsg): + # No more header blocks left + break + blocks.append(blockmsg) + container.set_payload(blocks) + elif container.get_main_type() == 'message': + # Create a container for the payload, but watch out for there not + # being any headers left + try: + msg = self.parse(fp) + except Errors.HeaderParseError: + msg = self._class() + self._parsebody(msg, fp) + container.attach(msg) + else: + text = fp.read() + if firstbodyline is not None: + text = firstbodyline + '\n' + text + container.set_payload(text) + + + +class HeaderParser(Parser): + """A subclass of Parser, this one only meaningfully parses message headers. + + This class can be used if all you're interested in is the headers of a + message. While it consumes the message body, it does not parse it, but + simply makes it available as a string payload. + + Parsing with this subclass can be considerably faster if all you're + interested in is the message headers. + """ + def _parsebody(self, container, fp, firstbodyline=None): + # Consume but do not parse, the body + text = fp.read() + if firstbodyline is not None: + text = firstbodyline + '\n' + text + container.set_payload(text) diff --git a/lib-python/2.2/email/Utils.py b/lib-python/2.2/email/Utils.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/Utils.py @@ -0,0 +1,340 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""Miscellaneous utilities. +""" + +import time +import socket +import re +import random +import os +import warnings +from cStringIO import StringIO +from types import ListType + +from email._parseaddr import quote +from email._parseaddr import AddressList as _AddressList +from email._parseaddr import mktime_tz + +# We need wormarounds for bugs in these methods in older Pythons (see below) +from email._parseaddr import parsedate as _parsedate +from email._parseaddr import parsedate_tz as _parsedate_tz + +try: + True, False +except NameError: + True = 1 + False = 0 + +try: + from quopri import decodestring as _qdecode +except ImportError: + # Python 2.1 doesn't have quopri.decodestring() + def _qdecode(s): + import quopri as _quopri + + if not s: + return s + infp = StringIO(s) + outfp = StringIO() + _quopri.decode(infp, outfp) + value = outfp.getvalue() + if not s.endswith('\n') and value.endswith('\n'): + return value[:-1] + return value + +import base64 + +# Intrapackage imports +from email.Encoders import _bencode, _qencode + +COMMASPACE = ', ' +EMPTYSTRING = '' +UEMPTYSTRING = u'' +CRLF = '\r\n' + +specialsre = re.compile(r'[][\\()<>@,:;".]') +escapesre = re.compile(r'[][\\()"]') + + + +# Helpers + +def _identity(s): + return s + + +def _bdecode(s): + # We can't quite use base64.encodestring() since it tacks on a "courtesy + # newline". Blech! + if not s: + return s + value = base64.decodestring(s) + if not s.endswith('\n') and value.endswith('\n'): + return value[:-1] + return value + + + +def fix_eols(s): + """Replace all line-ending characters with \r\n.""" + # Fix newlines with no preceding carriage return + s = re.sub(r'(?', name) + return '%s%s%s <%s>' % (quotes, name, quotes, address) + return address + +# For backwards compatibility +def dump_address_pair(pair): + warnings.warn('Use email.Utils.formataddr() instead', + DeprecationWarning, 2) + return formataddr(pair) + + + +def getaddresses(fieldvalues): + """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" + all = COMMASPACE.join(fieldvalues) + a = _AddressList(all) + return a.addresslist + + + +ecre = re.compile(r''' + =\? # literal =? + (?P[^?]*?) # non-greedy up to the next ? is the charset + \? # literal ? + (?P[qb]) # either a "q" or a "b", case insensitive + \? # literal ? + (?P.*?) # non-greedy up to the next ?= is the atom + \?= # literal ?= + ''', re.VERBOSE | re.IGNORECASE) + + +def decode(s): + """Return a decoded string according to RFC 2047, as a unicode string. + + NOTE: This function is deprecated. Use Header.decode_header() instead. + """ + warnings.warn('Use Header.decode_header() instead.', DeprecationWarning, 2) + # Intra-package import here to avoid circular import problems. + from email.Header import decode_header + L = decode_header(s) + if not isinstance(L, ListType): + # s wasn't decoded + return s + + rtn = [] + for atom, charset in L: + if charset is None: + rtn.append(atom) + else: + # Convert the string to Unicode using the given encoding. Leave + # Unicode conversion errors to strict. + rtn.append(unicode(atom, charset)) + # Now that we've decoded everything, we just need to join all the parts + # together into the final string. + return UEMPTYSTRING.join(rtn) + + + +def encode(s, charset='iso-8859-1', encoding='q'): + """Encode a string according to RFC 2047.""" + warnings.warn('Use Header.Header.encode() instead.', DeprecationWarning, 2) + encoding = encoding.lower() + if encoding == 'q': + estr = _qencode(s) + elif encoding == 'b': + estr = _bencode(s) + else: + raise ValueError, 'Illegal encoding code: ' + encoding + return '=?%s?%s?%s?=' % (charset.lower(), encoding, estr) + + + +def formatdate(timeval=None, localtime=False): + """Returns a date string as specified by RFC 2822, e.g.: + + Fri, 09 Nov 2001 01:08:47 -0000 + + Optional timeval if given is a floating point time value as accepted by + gmtime() and localtime(), otherwise the current time is used. + + Optional localtime is a flag that when True, interprets timeval, and + returns a date relative to the local timezone instead of UTC, properly + taking daylight savings time into account. + """ + # Note: we cannot use strftime() because that honors the locale and RFC + # 2822 requires that day and month names be the English abbreviations. + if timeval is None: + timeval = time.time() + if localtime: + now = time.localtime(timeval) + # Calculate timezone offset, based on whether the local zone has + # daylight savings time, and whether DST is in effect. + if time.daylight and now[-1]: + offset = time.altzone + else: + offset = time.timezone + hours, minutes = divmod(abs(offset), 3600) + # Remember offset is in seconds west of UTC, but the timezone is in + # minutes east of UTC, so the signs differ. + if offset > 0: + sign = '-' + else: + sign = '+' + zone = '%s%02d%02d' % (sign, hours, minutes / 60) + else: + now = time.gmtime(timeval) + # Timezone offset is always -0000 + zone = '-0000' + return '%s, %02d %s %04d %02d:%02d:%02d %s' % ( + ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][now[6]], + now[2], + ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][now[1] - 1], + now[0], now[3], now[4], now[5], + zone) + + + +def make_msgid(idstring=None): + """Returns a string suitable for RFC 2822 compliant Message-ID, e.g: + + <20020201195627.33539.96671 at nightshade.la.mastaler.com> + + Optional idstring if given is a string used to strengthen the + uniqueness of the message id. + """ + timeval = time.time() + utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval)) + pid = os.getpid() + randint = random.randrange(100000) + if idstring is None: + idstring = '' + else: + idstring = '.' + idstring + idhost = socket.getfqdn() + msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost) + return msgid + + + +# These functions are in the standalone mimelib version only because they've +# subsequently been fixed in the latest Python versions. We use this to worm +# around broken older Pythons. +def parsedate(data): + if not data: + return None + return _parsedate(data) + + +def parsedate_tz(data): + if not data: + return None + return _parsedate_tz(data) + + +def parseaddr(addr): + addrs = _AddressList(addr).addresslist + if not addrs: + return '', '' + return addrs[0] + + +# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3. +def unquote(str): + """Remove quotes from a string.""" + if len(str) > 1: + if str.startswith('"') and str.endswith('"'): + return str[1:-1].replace('\\\\', '\\').replace('\\"', '"') + if str.startswith('<') and str.endswith('>'): + return str[1:-1] + return str + + + +# RFC2231-related functions - parameter encoding and decoding +def decode_rfc2231(s): + """Decode string according to RFC 2231""" + import urllib + parts = s.split("'", 2) + if len(parts) == 1: + return None, None, urllib.unquote(s) + charset, language, s = parts + return charset, language, urllib.unquote(s) + + +def encode_rfc2231(s, charset=None, language=None): + """Encode string according to RFC 2231. + + If neither charset nor language is given, then s is returned as-is. If + charset is given but not language, the string is encoded using the empty + string for language. + """ + import urllib + s = urllib.quote(s, safe='') + if charset is None and language is None: + return s + if language is None: + language = '' + return "%s'%s'%s" % (charset, language, s) + + +rfc2231_continuation = re.compile(r'^(?P\w+)\*((?P[0-9]+)\*?)?$') + +def decode_params(params): + """Decode parameters list according to RFC 2231. + + params is a sequence of 2-tuples containing (content type, string value). + """ + new_params = [] + # maps parameter's name to a list of continuations + rfc2231_params = {} + # params is a sequence of 2-tuples containing (content_type, string value) + name, value = params[0] + new_params.append((name, value)) + # Cycle through each of the rest of the parameters. + for name, value in params[1:]: + value = unquote(value) + mo = rfc2231_continuation.match(name) + if mo: + name, num = mo.group('name', 'num') + if num is not None: + num = int(num) + rfc2231_param1 = rfc2231_params.setdefault(name, []) + rfc2231_param1.append((num, value)) + else: + new_params.append((name, '"%s"' % quote(value))) + if rfc2231_params: + for name, continuations in rfc2231_params.items(): + value = [] + # Sort by number + continuations.sort() + # And now append all values in num order + for num, continuation in continuations: + value.append(continuation) + charset, language, value = decode_rfc2231(EMPTYSTRING.join(value)) + new_params.append( + (name, (charset, language, '"%s"' % quote(value)))) + return new_params diff --git a/lib-python/2.2/email/__init__.py b/lib-python/2.2/email/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/__init__.py @@ -0,0 +1,72 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) + +"""A package for parsing, handling, and generating email messages. +""" + +__version__ = '2.5.4' + +__all__ = [ + 'base64MIME', + 'Charset', + 'Encoders', + 'Errors', + 'Generator', + 'Header', + 'Iterators', + 'Message', + 'MIMEAudio', + 'MIMEBase', + 'MIMEImage', + 'MIMEMessage', + 'MIMEMultipart', + 'MIMENonMultipart', + 'MIMEText', + 'Parser', + 'quopriMIME', + 'Utils', + 'message_from_string', + 'message_from_file', + ] + +try: + True, False +except NameError: + True = 1 + False = 0 + + + +# Some convenience routines. Don't import Parser and Message as side-effects +# of importing email since those cascadingly import most of the rest of the +# email package. +def message_from_string(s, _class=None, strict=False): + """Parse a string into a Message object model. + + Optional _class and strict are passed to the Parser constructor. + """ + from email.Parser import Parser + if _class is None: + from email.Message import Message + _class = Message + return Parser(_class, strict=strict).parsestr(s) + +def message_from_file(fp, _class=None, strict=False): + """Read a file and parse its contents into a Message object model. + + Optional _class and strict are passed to the Parser constructor. + """ + from email.Parser import Parser + if _class is None: + from email.Message import Message + _class = Message + return Parser(_class, strict=strict).parse(fp) + + + +# Patch encodings.aliases to recognize 'ansi_x3.4_1968' which isn't a standard +# alias in Python 2.1.3, but is used by the email package test suite. +from encodings.aliases import aliases # The aliases dictionary +if not aliases.has_key('ansi_x3.4_1968'): + aliases['ansi_x3.4_1968'] = 'ascii' +del aliases # Not needed any more diff --git a/lib-python/2.2/email/_compat21.py b/lib-python/2.2/email/_compat21.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/_compat21.py @@ -0,0 +1,69 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: barry at zope.com + +"""Module containing compatibility functions for Python 2.1. +""" + +from cStringIO import StringIO +from types import StringType, UnicodeType + +False = 0 +True = 1 + + + +# This function will become a method of the Message class +def walk(self): + """Walk over the message tree, yielding each subpart. + + The walk is performed in depth-first order. This method is a + generator. + """ + parts = [] + parts.append(self) + if self.is_multipart(): + for subpart in self.get_payload(): + parts.extend(subpart.walk()) + return parts + + +# Python 2.2 spells floor division // +def _floordiv(i, j): + """Do a floor division, i/j.""" + return i / j + + +def _isstring(obj): + return isinstance(obj, StringType) or isinstance(obj, UnicodeType) + + + +# These two functions are imported into the Iterators.py interface module. +# The Python 2.2 version uses generators for efficiency. +def body_line_iterator(msg, decode=False): + """Iterate over the parts, returning string payloads line-by-line. + + Optional decode (default False) is passed through to .get_payload(). + """ + lines = [] + for subpart in msg.walk(): + payload = subpart.get_payload(decode=decode) + if _isstring(payload): + for line in StringIO(payload).readlines(): + lines.append(line) + return lines + + +def typed_subpart_iterator(msg, maintype='text', subtype=None): + """Iterate over the subparts with a given MIME type. + + Use `maintype' as the main MIME type to match against; this defaults to + "text". Optional `subtype' is the MIME subtype to match against; if + omitted, only the main type is matched. + """ + parts = [] + for subpart in msg.walk(): + if subpart.get_content_maintype() == maintype: + if subtype is None or subpart.get_content_subtype() == subtype: + parts.append(subpart) + return parts diff --git a/lib-python/2.2/email/_compat22.py b/lib-python/2.2/email/_compat22.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/_compat22.py @@ -0,0 +1,70 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: barry at zope.com + +"""Module containing compatibility functions for Python 2.2. +""" + +from __future__ import generators +from __future__ import division +from cStringIO import StringIO +from types import StringTypes + +# Python 2.2.x where x < 1 lacks True/False +try: + True, False +except NameError: + True = 1 + False = 0 + + + +# This function will become a method of the Message class +def walk(self): + """Walk over the message tree, yielding each subpart. + + The walk is performed in depth-first order. This method is a + generator. + """ + yield self + if self.is_multipart(): + for subpart in self.get_payload(): + for subsubpart in subpart.walk(): + yield subsubpart + + +# Python 2.2 spells floor division // +def _floordiv(i, j): + """Do a floor division, i/j.""" + return i // j + + +def _isstring(obj): + return isinstance(obj, StringTypes) + + + +# These two functions are imported into the Iterators.py interface module. +# The Python 2.2 version uses generators for efficiency. +def body_line_iterator(msg, decode=False): + """Iterate over the parts, returning string payloads line-by-line. + + Optional decode (default False) is passed through to .get_payload(). + """ + for subpart in msg.walk(): + payload = subpart.get_payload(decode=decode) + if _isstring(payload): + for line in StringIO(payload): + yield line + + +def typed_subpart_iterator(msg, maintype='text', subtype=None): + """Iterate over the subparts with a given MIME type. + + Use `maintype' as the main MIME type to match against; this defaults to + "text". Optional `subtype' is the MIME subtype to match against; if + omitted, only the main type is matched. + """ + for subpart in msg.walk(): + if subpart.get_content_maintype() == maintype: + if subtype is None or subpart.get_content_subtype() == subtype: + yield subpart diff --git a/lib-python/2.2/email/_parseaddr.py b/lib-python/2.2/email/_parseaddr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/_parseaddr.py @@ -0,0 +1,480 @@ +# Copyright (C) 2002 Python Software Foundation + +"""Email address parsing code. + +Lifted directly from rfc822.py. This should eventually be rewritten. +""" + +import time +from types import TupleType + +try: + True, False +except NameError: + True = 1 + False = 0 + +SPACE = ' ' +EMPTYSTRING = '' +COMMASPACE = ', ' + +# Parse a date field +_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', + 'aug', 'sep', 'oct', 'nov', 'dec', + 'january', 'february', 'march', 'april', 'may', 'june', 'july', + 'august', 'september', 'october', 'november', 'december'] + +_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] + +# The timezone table does not include the military time zones defined +# in RFC822, other than Z. According to RFC1123, the description in +# RFC822 gets the signs wrong, so we can't rely on any such time +# zones. RFC1123 recommends that numeric timezone indicators be used +# instead of timezone names. + +_timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0, + 'AST': -400, 'ADT': -300, # Atlantic (used in Canada) + 'EST': -500, 'EDT': -400, # Eastern + 'CST': -600, 'CDT': -500, # Central + 'MST': -700, 'MDT': -600, # Mountain + 'PST': -800, 'PDT': -700 # Pacific + } + + +def parsedate_tz(data): + """Convert a date string to a time tuple. + + Accounts for military timezones. + """ + data = data.split() + # The FWS after the comma after the day-of-week is optional, so search and + # adjust for this. + if data[0].endswith(',') or data[0].lower() in _daynames: + # There's a dayname here. Skip it + del data[0] + else: + i = data[0].rfind(',') + if i >= 0: + data[0] = data[0][i+1:] + if len(data) == 3: # RFC 850 date, deprecated + stuff = data[0].split('-') + if len(stuff) == 3: + data = stuff + data[1:] + if len(data) == 4: + s = data[3] + i = s.find('+') + if i > 0: + data[3:] = [s[:i], s[i+1:]] + else: + data.append('') # Dummy tz + if len(data) < 5: + return None + data = data[:5] + [dd, mm, yy, tm, tz] = data + mm = mm.lower() + if mm not in _monthnames: + dd, mm = mm, dd.lower() + if mm not in _monthnames: + return None + mm = _monthnames.index(mm) + 1 + if mm > 12: + mm -= 12 + if dd[-1] == ',': + dd = dd[:-1] + i = yy.find(':') + if i > 0: + yy, tm = tm, yy + if yy[-1] == ',': + yy = yy[:-1] + if not yy[0].isdigit(): + yy, tz = tz, yy + if tm[-1] == ',': + tm = tm[:-1] + tm = tm.split(':') + if len(tm) == 2: + [thh, tmm] = tm + tss = '0' + elif len(tm) == 3: + [thh, tmm, tss] = tm + else: + return None + try: + yy = int(yy) + dd = int(dd) + thh = int(thh) + tmm = int(tmm) + tss = int(tss) + except ValueError: + return None + tzoffset = None + tz = tz.upper() + if _timezones.has_key(tz): + tzoffset = _timezones[tz] + else: + try: + tzoffset = int(tz) + except ValueError: + pass + # Convert a timezone offset into seconds ; -0500 -> -18000 + if tzoffset: + if tzoffset < 0: + tzsign = -1 + tzoffset = -tzoffset + else: + tzsign = 1 + tzoffset = tzsign * ( (tzoffset/100)*3600 + (tzoffset % 100)*60) + tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0, tzoffset) + return tuple + + +def parsedate(data): + """Convert a time string to a time tuple.""" + t = parsedate_tz(data) + if isinstance(t, TupleType): + return t[:9] + else: + return t + + +def mktime_tz(data): + """Turn a 10-tuple as returned by parsedate_tz() into a UTC timestamp.""" + if data[9] is None: + # No zone info, so localtime is better assumption than GMT + return time.mktime(data[:8] + (-1,)) + else: + t = time.mktime(data[:8] + (0,)) + return t - data[9] - time.timezone + + +def quote(str): + """Add quotes around a string.""" + return str.replace('\\', '\\\\').replace('"', '\\"') + + +class AddrlistClass: + """Address parser class by Ben Escoto. + + To understand what this class does, it helps to have a copy of RFC 2822 in + front of you. + + Note: this class interface is deprecated and may be removed in the future. + Use rfc822.AddressList instead. + """ + + def __init__(self, field): + """Initialize a new instance. + + `field' is an unparsed address header field, containing + one or more addresses. + """ + self.specials = '()<>@,:;.\"[]' + self.pos = 0 + self.LWS = ' \t' + self.CR = '\r\n' + self.atomends = self.specials + self.LWS + self.CR + # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it + # is obsolete syntax. RFC 2822 requires that we recognize obsolete + # syntax, so allow dots in phrases. + self.phraseends = self.atomends.replace('.', '') + self.field = field + self.commentlist = [] + + def gotonext(self): + """Parse up to the start of the next address.""" + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS + '\n\r': + self.pos += 1 + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + else: + break + + def getaddrlist(self): + """Parse all addresses. + + Returns a list containing all of the addresses. + """ + result = [] + while self.pos < len(self.field): + ad = self.getaddress() + if ad: + result += ad + else: + result.append(('', '')) + return result + + def getaddress(self): + """Parse the next address.""" + self.commentlist = [] + self.gotonext() + + oldpos = self.pos + oldcl = self.commentlist + plist = self.getphraselist() + + self.gotonext() + returnlist = [] + + if self.pos >= len(self.field): + # Bad email address technically, no domain. + if plist: + returnlist = [(SPACE.join(self.commentlist), plist[0])] + + elif self.field[self.pos] in '.@': + # email address is just an addrspec + # this isn't very efficient since we start over + self.pos = oldpos + self.commentlist = oldcl + addrspec = self.getaddrspec() + returnlist = [(SPACE.join(self.commentlist), addrspec)] + + elif self.field[self.pos] == ':': + # address is a group + returnlist = [] + + fieldlen = len(self.field) + self.pos += 1 + while self.pos < len(self.field): + self.gotonext() + if self.pos < fieldlen and self.field[self.pos] == ';': + self.pos += 1 + break + returnlist = returnlist + self.getaddress() + + elif self.field[self.pos] == '<': + # Address is a phrase then a route addr + routeaddr = self.getrouteaddr() + + if self.commentlist: + returnlist = [(SPACE.join(plist) + ' (' + + ' '.join(self.commentlist) + ')', routeaddr)] + else: + returnlist = [(SPACE.join(plist), routeaddr)] + + else: + if plist: + returnlist = [(SPACE.join(self.commentlist), plist[0])] + elif self.field[self.pos] in self.specials: + self.pos += 1 + + self.gotonext() + if self.pos < len(self.field) and self.field[self.pos] == ',': + self.pos += 1 + return returnlist + + def getrouteaddr(self): + """Parse a route address (Return-path value). + + This method just skips all the route stuff and returns the addrspec. + """ + if self.field[self.pos] != '<': + return + + expectroute = False + self.pos += 1 + self.gotonext() + adlist = '' + while self.pos < len(self.field): + if expectroute: + self.getdomain() + expectroute = False + elif self.field[self.pos] == '>': + self.pos += 1 + break + elif self.field[self.pos] == '@': + self.pos += 1 + expectroute = True + elif self.field[self.pos] == ':': + self.pos += 1 + else: + adlist = self.getaddrspec() + self.pos += 1 + break + self.gotonext() + + return adlist + + def getaddrspec(self): + """Parse an RFC 2822 addr-spec.""" + aslist = [] + + self.gotonext() + while self.pos < len(self.field): + if self.field[self.pos] == '.': + aslist.append('.') + self.pos += 1 + elif self.field[self.pos] == '"': + aslist.append('"%s"' % self.getquote()) + elif self.field[self.pos] in self.atomends: + break + else: + aslist.append(self.getatom()) + self.gotonext() + + if self.pos >= len(self.field) or self.field[self.pos] != '@': + return EMPTYSTRING.join(aslist) + + aslist.append('@') + self.pos += 1 + self.gotonext() + return EMPTYSTRING.join(aslist) + self.getdomain() + + def getdomain(self): + """Get the complete domain name from an address.""" + sdlist = [] + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS: + self.pos += 1 + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + elif self.field[self.pos] == '[': + sdlist.append(self.getdomainliteral()) + elif self.field[self.pos] == '.': + self.pos += 1 + sdlist.append('.') + elif self.field[self.pos] in self.atomends: + break + else: + sdlist.append(self.getatom()) + return EMPTYSTRING.join(sdlist) + + def getdelimited(self, beginchar, endchars, allowcomments=True): + """Parse a header fragment delimited by special characters. + + `beginchar' is the start character for the fragment. + If self is not looking at an instance of `beginchar' then + getdelimited returns the empty string. + + `endchars' is a sequence of allowable end-delimiting characters. + Parsing stops when one of these is encountered. + + If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed + within the parsed fragment. + """ + if self.field[self.pos] != beginchar: + return '' + + slist = [''] + quote = False + self.pos += 1 + while self.pos < len(self.field): + if quote: + slist.append(self.field[self.pos]) + quote = False + elif self.field[self.pos] in endchars: + self.pos += 1 + break + elif allowcomments and self.field[self.pos] == '(': + slist.append(self.getcomment()) + elif self.field[self.pos] == '\\': + quote = True + else: + slist.append(self.field[self.pos]) + self.pos += 1 + + return EMPTYSTRING.join(slist) + + def getquote(self): + """Get a quote-delimited fragment from self's field.""" + return self.getdelimited('"', '"\r', False) + + def getcomment(self): + """Get a parenthesis-delimited fragment from self's field.""" + return self.getdelimited('(', ')\r', True) + + def getdomainliteral(self): + """Parse an RFC 2822 domain-literal.""" + return '[%s]' % self.getdelimited('[', ']\r', False) + + def getatom(self, atomends=None): + """Parse an RFC 2822 atom. + + Optional atomends specifies a different set of end token delimiters + (the default is to use self.atomends). This is used e.g. in + getphraselist() since phrase endings must not include the `.' (which + is legal in phrases).""" + atomlist = [''] + if atomends is None: + atomends = self.atomends + + while self.pos < len(self.field): + if self.field[self.pos] in atomends: + break + else: + atomlist.append(self.field[self.pos]) + self.pos += 1 + + return EMPTYSTRING.join(atomlist) + + def getphraselist(self): + """Parse a sequence of RFC 2822 phrases. + + A phrase is a sequence of words, which are in turn either RFC 2822 + atoms or quoted-strings. Phrases are canonicalized by squeezing all + runs of continuous whitespace into one space. + """ + plist = [] + + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS: + self.pos += 1 + elif self.field[self.pos] == '"': + plist.append(self.getquote()) + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + elif self.field[self.pos] in self.phraseends: + break + else: + plist.append(self.getatom(self.phraseends)) + + return plist + +class AddressList(AddrlistClass): + """An AddressList encapsulates a list of parsed RFC 2822 addresses.""" + def __init__(self, field): + AddrlistClass.__init__(self, field) + if field: + self.addresslist = self.getaddrlist() + else: + self.addresslist = [] + + def __len__(self): + return len(self.addresslist) + + def __str__(self): + return COMMASPACE.join(map(dump_address_pair, self.addresslist)) + + def __add__(self, other): + # Set union + newaddr = AddressList(None) + newaddr.addresslist = self.addresslist[:] + for x in other.addresslist: + if not x in self.addresslist: + newaddr.addresslist.append(x) + return newaddr + + def __iadd__(self, other): + # Set union, in-place + for x in other.addresslist: + if not x in self.addresslist: + self.addresslist.append(x) + return self + + def __sub__(self, other): + # Set difference + newaddr = AddressList(None) + for x in self.addresslist: + if not x in other.addresslist: + newaddr.addresslist.append(x) + return newaddr + + def __isub__(self, other): + # Set difference, in-place + for x in other.addresslist: + if x in self.addresslist: + self.addresslist.remove(x) + return self + + def __getitem__(self, index): + # Make indexing, slices, and 'in' work + return self.addresslist[index] diff --git a/lib-python/2.2/email/base64MIME.py b/lib-python/2.2/email/base64MIME.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/base64MIME.py @@ -0,0 +1,184 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: che at debian.org (Ben Gertzfield) + +"""Base64 content transfer encoding per RFCs 2045-2047. + +This module handles the content transfer encoding method defined in RFC 2045 +to encode arbitrary 8-bit data using the three 8-bit bytes in four 7-bit +characters encoding known as Base64. + +It is used in the MIME standards for email to attach images, audio, and text +using some 8-bit character sets to messages. + +This module provides an interface to encode and decode both headers and bodies +with Base64 encoding. + +RFC 2045 defines a method for including character set information in an +`encoded-word' in a header. This method is commonly used for 8-bit real names +in To:, From:, Cc:, etc. fields, as well as Subject: lines. + +This module does not do the line wrapping or end-of-line character conversion +necessary for proper internationalized headers; it only does dumb encoding and +decoding. To deal with the various line wrapping issues, use the email.Header +module. +""" + +import re +from binascii import b2a_base64, a2b_base64 +from email.Utils import fix_eols + +try: + from email._compat22 import _floordiv +except SyntaxError: + # Python 2.1 spells integer division differently + from email._compat21 import _floordiv + + +CRLF = '\r\n' +NL = '\n' +EMPTYSTRING = '' + +# See also Charset.py +MISC_LEN = 7 + +try: + True, False +except NameError: + True = 1 + False = 0 + + + +# Helpers +def base64_len(s): + """Return the length of s when it is encoded with base64.""" + groups_of_3, leftover = divmod(len(s), 3) + # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in. + # Thanks, Tim! + n = groups_of_3 * 4 + if leftover: + n += 4 + return n + + + +def header_encode(header, charset='iso-8859-1', keep_eols=False, + maxlinelen=76, eol=NL): + """Encode a single header line with Base64 encoding in a given charset. + + Defined in RFC 2045, this Base64 encoding is identical to normal Base64 + encoding, except that each line must be intelligently wrapped (respecting + the Base64 encoding), and subsequent lines must start with a space. + + charset names the character set to use to encode the header. It defaults + to iso-8859-1. + + End-of-line characters (\\r, \\n, \\r\\n) will be automatically converted + to the canonical email line separator \\r\\n unless the keep_eols + parameter is True (the default is False). + + Each line of the header will be terminated in the value of eol, which + defaults to "\\n". Set this to "\\r\\n" if you are using the result of + this function directly in email. + + The resulting string will be in the form: + + "=?charset?b?WW/5ciBtYXp66XLrIHf8eiBhIGhhbXBzdGHuciBBIFlv+XIgbWF6euly?=\\n + =?charset?b?6yB3/HogYSBoYW1wc3Rh7nIgQkMgWW/5ciBtYXp66XLrIHf8eiBhIGhh?=" + + with each line wrapped at, at most, maxlinelen characters (defaults to 76 + characters). + """ + # Return empty headers unchanged + if not header: + return header + + if not keep_eols: + header = fix_eols(header) + + # Base64 encode each line, in encoded chunks no greater than maxlinelen in + # length, after the RFC chrome is added in. + base64ed = [] + max_encoded = maxlinelen - len(charset) - MISC_LEN + max_unencoded = _floordiv(max_encoded * 3, 4) + + for i in range(0, len(header), max_unencoded): + base64ed.append(b2a_base64(header[i:i+max_unencoded])) + + # Now add the RFC chrome to each encoded chunk + lines = [] + for line in base64ed: + # Ignore the last character of each line if it is a newline + if line.endswith(NL): + line = line[:-1] + # Add the chrome + lines.append('=?%s?b?%s?=' % (charset, line)) + # Glue the lines together and return it. BAW: should we be able to + # specify the leading whitespace in the joiner? + joiner = eol + ' ' + return joiner.join(lines) + + + +def encode(s, binary=True, maxlinelen=76, eol=NL): + """Encode a string with base64. + + Each line will be wrapped at, at most, maxlinelen characters (defaults to + 76 characters). + + If binary is False, end-of-line characters will be converted to the + canonical email end-of-line sequence \\r\\n. Otherwise they will be left + verbatim (this is the default). + + Each line of encoded text will end with eol, which defaults to "\\n". Set + this to "\r\n" if you will be using the result of this function directly + in an email. + """ + if not s: + return s + + if not binary: + s = fix_eols(s) + + encvec = [] + max_unencoded = _floordiv(maxlinelen * 3, 4) + for i in range(0, len(s), max_unencoded): + # BAW: should encode() inherit b2a_base64()'s dubious behavior in + # adding a newline to the encoded string? + enc = b2a_base64(s[i:i + max_unencoded]) + if enc.endswith(NL) and eol <> NL: + enc = enc[:-1] + eol + encvec.append(enc) + return EMPTYSTRING.join(encvec) + + +# For convenience and backwards compatibility w/ standard base64 module +body_encode = encode +encodestring = encode + + + +def decode(s, convert_eols=None): + """Decode a raw base64 string. + + If convert_eols is set to a string value, all canonical email linefeeds, + e.g. "\\r\\n", in the decoded text will be converted to the value of + convert_eols. os.linesep is a good choice for convert_eols if you are + decoding a text attachment. + + This function does not parse a full MIME header value encoded with + base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high + level email.Header class for that functionality. + """ + if not s: + return s + + dec = a2b_base64(s) + if convert_eols: + return dec.replace(CRLF, convert_eols) + return dec + + +# For convenience and backwards compatibility w/ standard base64 module +body_decode = decode +decodestring = decode diff --git a/lib-python/2.2/email/quopriMIME.py b/lib-python/2.2/email/quopriMIME.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/quopriMIME.py @@ -0,0 +1,323 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# Author: che at debian.org (Ben Gertzfield) + +"""Quoted-printable content transfer encoding per RFCs 2045-2047. + +This module handles the content transfer encoding method defined in RFC 2045 +to encode US ASCII-like 8-bit data called `quoted-printable'. It is used to +safely encode text that is in a character set similar to the 7-bit US ASCII +character set, but that includes some 8-bit characters that are normally not +allowed in email bodies or headers. + +Quoted-printable is very space-inefficient for encoding binary files; use the +email.base64MIME module for that instead. + +This module provides an interface to encode and decode both headers and bodies +with quoted-printable encoding. + +RFC 2045 defines a method for including character set information in an +`encoded-word' in a header. This method is commonly used for 8-bit real names +in To:/From:/Cc: etc. fields, as well as Subject: lines. + +This module does not do the line wrapping or end-of-line character +conversion necessary for proper internationalized headers; it only +does dumb encoding and decoding. To deal with the various line +wrapping issues, use the email.Header module. +""" + +import re +from string import hexdigits +from email.Utils import fix_eols + +CRLF = '\r\n' +NL = '\n' + +# See also Charset.py +MISC_LEN = 7 + +hqre = re.compile(r'[^-a-zA-Z0-9!*+/ ]') +bqre = re.compile(r'[^ !-<>-~\t]') + +try: + True, False +except NameError: + True = 1 + False = 0 + + + +# Helpers +def header_quopri_check(c): + """Return True if the character should be escaped with header quopri.""" + return hqre.match(c) and True + + +def body_quopri_check(c): + """Return True if the character should be escaped with body quopri.""" + return bqre.match(c) and True + + +def header_quopri_len(s): + """Return the length of str when it is encoded with header quopri.""" + count = 0 + for c in s: + if hqre.match(c): + count += 3 + else: + count += 1 + return count + + +def body_quopri_len(str): + """Return the length of str when it is encoded with body quopri.""" + count = 0 + for c in str: + if bqre.match(c): + count += 3 + else: + count += 1 + return count + + +def _max_append(L, s, maxlen, extra=''): + if not L: + L.append(s.lstrip()) + elif len(L[-1]) + len(s) <= maxlen: + L[-1] += extra + s + else: + L.append(s.lstrip()) + + +def unquote(s): + """Turn a string in the form =AB to the ASCII character with value 0xab""" + return chr(int(s[1:3], 16)) + + +def quote(c): + return "=%02X" % ord(c) + + + +def header_encode(header, charset="iso-8859-1", keep_eols=False, + maxlinelen=76, eol=NL): + """Encode a single header line with quoted-printable (like) encoding. + + Defined in RFC 2045, this `Q' encoding is similar to quoted-printable, but + used specifically for email header fields to allow charsets with mostly 7 + bit characters (and some 8 bit) to remain more or less readable in non-RFC + 2045 aware mail clients. + + charset names the character set to use to encode the header. It defaults + to iso-8859-1. + + The resulting string will be in the form: + + "=?charset?q?I_f=E2rt_in_your_g=E8n=E8ral_dire=E7tion?\\n + =?charset?q?Silly_=C8nglish_Kn=EEghts?=" + + with each line wrapped safely at, at most, maxlinelen characters (defaults + to 76 characters). If maxlinelen is None, the entire string is encoded in + one chunk with no splitting. + + End-of-line characters (\\r, \\n, \\r\\n) will be automatically converted + to the canonical email line separator \\r\\n unless the keep_eols + parameter is True (the default is False). + + Each line of the header will be terminated in the value of eol, which + defaults to "\\n". Set this to "\\r\\n" if you are using the result of + this function directly in email. + """ + # Return empty headers unchanged + if not header: + return header + + if not keep_eols: + header = fix_eols(header) + + # Quopri encode each line, in encoded chunks no greater than maxlinelen in + # length, after the RFC chrome is added in. + quoted = [] + if maxlinelen is None: + # An obnoxiously large number that's good enough + max_encoded = 100000 + else: + max_encoded = maxlinelen - len(charset) - MISC_LEN - 1 + + for c in header: + # Space may be represented as _ instead of =20 for readability + if c == ' ': + _max_append(quoted, '_', max_encoded) + # These characters can be included verbatim + elif not hqre.match(c): + _max_append(quoted, c, max_encoded) + # Otherwise, replace with hex value like =E2 + else: + _max_append(quoted, "=%02X" % ord(c), max_encoded) + + # Now add the RFC chrome to each encoded chunk and glue the chunks + # together. BAW: should we be able to specify the leading whitespace in + # the joiner? + joiner = eol + ' ' + return joiner.join(['=?%s?q?%s?=' % (charset, line) for line in quoted]) + + + +def encode(body, binary=False, maxlinelen=76, eol=NL): + """Encode with quoted-printable, wrapping at maxlinelen characters. + + If binary is False (the default), end-of-line characters will be converted + to the canonical email end-of-line sequence \\r\\n. Otherwise they will + be left verbatim. + + Each line of encoded text will end with eol, which defaults to "\\n". Set + this to "\\r\\n" if you will be using the result of this function directly + in an email. + + Each line will be wrapped at, at most, maxlinelen characters (defaults to + 76 characters). Long lines will have the `soft linefeed' quoted-printable + character "=" appended to them, so the decoded text will be identical to + the original text. + """ + if not body: + return body + + if not binary: + body = fix_eols(body) + + # BAW: We're accumulating the body text by string concatenation. That + # can't be very efficient, but I don't have time now to rewrite it. It + # just feels like this algorithm could be more efficient. + encoded_body = '' + lineno = -1 + # Preserve line endings here so we can check later to see an eol needs to + # be added to the output later. + lines = body.splitlines(1) + for line in lines: + # But strip off line-endings for processing this line. + if line.endswith(CRLF): + line = line[:-2] + elif line[-1] in CRLF: + line = line[:-1] + + lineno += 1 + encoded_line = '' + prev = None + linelen = len(line) + # Now we need to examine every character to see if it needs to be + # quopri encoded. BAW: again, string concatenation is inefficient. + for j in range(linelen): + c = line[j] + prev = c + if bqre.match(c): + c = quote(c) + elif j+1 == linelen: + # Check for whitespace at end of line; special case + if c not in ' \t': + encoded_line += c + prev = c + continue + # Check to see to see if the line has reached its maximum length + if len(encoded_line) + len(c) >= maxlinelen: + encoded_body += encoded_line + '=' + eol + encoded_line = '' + encoded_line += c + # Now at end of line.. + if prev and prev in ' \t': + # Special case for whitespace at end of file + if lineno + 1 == len(lines): + prev = quote(prev) + if len(encoded_line) + len(prev) > maxlinelen: + encoded_body += encoded_line + '=' + eol + prev + else: + encoded_body += encoded_line + prev + # Just normal whitespace at end of line + else: + encoded_body += encoded_line + prev + '=' + eol + encoded_line = '' + # Now look at the line we just finished and it has a line ending, we + # need to add eol to the end of the line. + if lines[lineno].endswith(CRLF) or lines[lineno][-1] in CRLF: + encoded_body += encoded_line + eol + else: + encoded_body += encoded_line + encoded_line = '' + return encoded_body + + +# For convenience and backwards compatibility w/ standard base64 module +body_encode = encode +encodestring = encode + + + +# BAW: I'm not sure if the intent was for the signature of this function to be +# the same as base64MIME.decode() or not... +def decode(encoded, eol=NL): + """Decode a quoted-printable string. + + Lines are separated with eol, which defaults to \\n. + """ + if not encoded: + return encoded + # BAW: see comment in encode() above. Again, we're building up the + # decoded string with string concatenation, which could be done much more + # efficiently. + decoded = '' + + for line in encoded.splitlines(): + line = line.rstrip() + if not line: + decoded += eol + continue + + i = 0 + n = len(line) + while i < n: + c = line[i] + if c <> '=': + decoded += c + i += 1 + # Otherwise, c == "=". Are we at the end of the line? If so, add + # a soft line break. + elif i+1 == n: + i += 1 + continue + # Decode if in form =AB + elif i+2 < n and line[i+1] in hexdigits and line[i+2] in hexdigits: + decoded += unquote(line[i:i+3]) + i += 3 + # Otherwise, not in form =AB, pass literally + else: + decoded += c + i += 1 + + if i == n: + decoded += eol + # Special case if original string did not end with eol + if not encoded.endswith(eol) and decoded.endswith(eol): + decoded = decoded[:-1] + return decoded + + +# For convenience and backwards compatibility w/ standard base64 module +body_decode = decode +decodestring = decode + + + +def _unquote_match(match): + """Turn a match in the form =AB to the ASCII character with value 0xab""" + s = match.group(0) + return unquote(s) + + +# Header decoding is done a bit differently +def header_decode(s): + """Decode a string encoded with RFC 2045 MIME header `Q' encoding. + + This function does not parse a full MIME header value encoded with + quoted-printable (like =?iso-8895-1?q?Hello_World?=) -- please use + the high level email.Header class for that functionality. + """ + s = s.replace('_', ' ') + return re.sub(r'=\w{2}', _unquote_match, s) diff --git a/lib-python/2.2/email/test/__init__.py b/lib-python/2.2/email/test/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/__init__.py @@ -0,0 +1,2 @@ +# Copyright (C) 2002 Python Software Foundation +# Author: barry at zope.com (Barry Warsaw) diff --git a/lib-python/2.2/email/test/data/PyBanner048.gif b/lib-python/2.2/email/test/data/PyBanner048.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a5c87f647fbf33e5b46103119c9fd42afbe9e5d GIT binary patch literal 954 zc${&By7x8j z{~uUT;GrYce_~0|$((r{tZl_!y0Q#RM^`;uQ6(RHpD7?imZ|-N_{uUC7WQk3?{;NH zGBwmSM64;~s?+3SXG-Nyu3{`#=d5DO(qd+qsKHY;ql=l7x86TUlZ}C6Vbu~P?#atE z!mD*BPwkz#Y9{O4c}n3W8Y~Pf8hs4Am3i417pt>w-Kbi1Ms*cq6L0#=1@(C;T5FqB zI`?aIZdcj6`MlEcyPC%tUL`!Oy6(*WPKk$;osA=QZI3!%)vK*u3l>dh6n=W+r`7Uw z87|f;mIVuzy^!H%3ug*Ry3lZtiKX(3gJD90!wDVbQ~xb(3ZIH_hKecjIdrrNEMq*+ zw2q_9fVDYU$~z!BlZkPe2`868z>JleY9_Cwc0?5}jhn}yqqg&PsRyI=95n_eg{;)6 zUEV25u at h%3nrgtVIQJB900ZOA{Gyhb0w)(u-^0G>fNh4rBnQ=ooY0O-yFUwdHXcyA zcQ9fSL*pbiE|%fBFT}IRa?h1uSC4v4gI;fuEi5h!m!cM^#(GWk z)Zh>@cyMCD9RtCd at Fy#;tZHd4VqVvKa97jak0*L2zVCdJ5Y(_=Q)s7-#`Zma8C79D zo;Ht8`8 at AtY}j?kT1V}M at K+x0X?v|380XI|kgij|@Ti-SU1381e@~x>;pe#a#%!0U zXwY=(GJ4Nj6vE9Z<1CQzTvD~cRgFbh!Lm9)<52PQi2^*0N<0}(#WyA{yw8=v$ncnh z+d+JqmhwJ{=D_5=P12nQ8`P(o{r5R^k3)Fb0*4reni+>CorqY};~^rp-QCqN<%yI2 z*O?PMZ25C$KIG7ORpFGNZL#5oqLzx1{A}5?6FH@{b6!U9EDAX8v_MD4Qm%i7#Dfb- zsdf$w5#n=CsHs&-%;03a{`Ya%Vl9osnUM at JSCTmYaBgm3`mo}MbD!^1!{bb=HZ5YG ztMBtklXLq~s~K|E)2dc3vF%_z&XjSEA)ROPgFE&BHUVGZpCVa=fskIb!Cda_v18P?Z4q^wuX2!-68G}?6Ux#wIny6}JfpZ~|- z{`R-(-~Q%Y!vFuv-~Lwl-yi;eI9xZ+^E65F+;tq+fp-}kId$M&o~CIAuUzUw-HZTfnVVx`P)wp|5qsl_ z7sSL;T7$OK=Q+t#B|#7d-9bmtG{ZJ^Qxhe)lcq_g4Wo(?404zSDRrGNikE2^22o0F zUFdcDg8`>18X?Hg6|UFo_Ii?TrQUopoBGQjiu^G57UTJ3G+#t%W>c8DG)bK-#Ay-{ zLNkKWEVXmjG&HH-=AcDzE6ql{B8&V$MTAa$I6UZtZW@@z;c_~=_cE+XjaI+Q>n=^B zFf}Z(J7|i%J`9bKIEJmLy}l`GS>P|P?w1QMHk|~MbeZ~NKgbhDRt(*8qd1%{!X$A; zlNiViGrWkQn>nxMrj>hk~4ow_rwr;zYVH!MVND`qboqJ%ynAfrG#EUST zgApT1u}wSn7U6Ij#W__i8`-HJh07$zSdoZ)bGI at +IdK) zUKTlyC}P=g;vgH&63?Zwd;q4^yDB)$-vg5$d?`Dx7r=mtJI|`QJ#V80uDk(@d zLf>DUUC)R2KF)$H84ahyZ#VPFI0h3zX6PsWWC2F6i;^O9mP?#C#fT`~cDGyW>)_{+ z1Fal1+I*vD!RSY}tV`We6{bj*ILXy`S?-q`?N(JmI?hv5wZ(qBIcN_|1KQ>y$CR5r zzTZc#4K6@%YRJk!7EQ;EgNYYHllzL60hT+<@F)T&xt)yX60J|?be)Y at i8wj6cc+CB2!n3b*4w4N~692WuoOU8IB0n zajS1xb~;;l^N3>85~zZ5GRENdff`diO>+x|#-)ymQ!r9W;xtIC7(fY1QFs44h2EZ4(K(nihO1CLcM(+`$BwZptCnE$!a!94F$~kS4P6DWFflfCQ;=nOfL&)f at sk+K zoYaz38j|^ zzd`; z)Hm@!ZC1^;PTkOqHA!tMoNAE~UdFB~I5plCqhPuuw}1qKB3d}T59iY~(Q&Vn^EjT& z$UU@)M|DTU6Z;+orbtV&%u#2U24mZo^+C&(0IqN1NowS69jj?_=cP9|QWdF9y3UN= zz=-r|N!5GAy-(6R+mj`sZ4Z)pI1GbOp$)|x;B*?$33io+CK^JzbW at n|zS>gcULK6I zFiAO7N0OjKUV;`W)~iU;JMPS<3nyr%bs{O+JaV!$;BYA$p!yikgc)|5by?AB?qZ?` z%CwxW$4!6h4&65H%(U4tWvv#(x9yR5yJ>Ij at 7xylQ(L%qxJu=qefj*|A}Y;{;5lD^ zTl~25&M%3Vq*kmPUMGe3OQkffBpa2B-4eflq-_NK(Tghoy0Z7nZ#}JGTyyIh_p0~d z`P<&6rr#8c%5U0L^@I1Um`>D}iuCIF*Xr-i)8fh5R&l2MmWp#XTX&<&jmqHFLdZUM zpBB at ORBg6@D;=+WI)1h>OXzm}aP98P^Ue0jUbFUjU42f(SI$l;jio0NF7w zM_aXbyZK<_Xut_)C;9fNRN46Y&L%I@(YpHnJKnh at Tb)MfIOB5FU)uM{*Jk`-haJ!^7x6=Hjdt3)}G7j;cNP}u;xB1j&2Tu*nC?4^XuZ- zW9OO{W(zcKo_^ak$$zP;I;AJ6T=&e7XSY5nNS?xWf)o6`36bZy)CufxIPPIz2IpGK3;j+$?^ z{WqW7e{PevH-)Jfh}#h=nm+&aaQlTwhsP~DebM(jn#`AfTm1TBOyAD7Jb%l~x|iij z@$;YE?ZVC8_vdMbQ>8jFUT&HHap?WsnY{DY_;>MOr+V;YtMSL~`QJ-}*YCH31)pwJ zzjETEoma=xf4kjzHC(Gr<7 at uud$YJ!ieG(CA77*&`xW;~NqwGvfBLBS$LFKR#f{f{ zefjp9uC0Gci@#L}JX at Q-J}Ir0_udEV=BXDotTXkWg`NN0 zzx+F0d%xeb&*b5H`CNbUy!`R~;q&$9Cw~mf*JIRPpDcDBbcmFon`SgA>Q at bbqwdGcUuYG)X`gDC` z_~vL^OU=VAZqQq|%kSPDKH?tjzKz;D-;ORG4KxUO#p6HDH at 4S~-;CF+e6;_htcio_ z&ha0&<(F$W?=Cj-bLZqqoA#UH#;3QJPt?apyLm at Gx<6cNO$HSh?srGO-u>h7JwM$( zKE8iixh|G!o$qgNp6kEdzMC``+4a%dRv?;%t>~49%1_ANX(^)Q!;5Ewtics}|L at J& zqs8WzgTYnHKi_#yzHbYS at _$|Kt=Z4gx9huIVOM*CjX~QiyxTq8xcz(fA-s1Av%4p} zfQ-hI{(lCaUKU?|Jf0k_JA0*aGkd9RzxZ?azPkR8^v`cs&c at C0Go4m~t>=^1qgeQN z{^08^t(V`f*E_{BU+lj6e6(Z#divqZ#q{xe^cXd_`;UI*es7;YdAxOeW8ZI>e{46@ zp6Q6oS8xBEw*Ps2a5-$PeVc6F$LOy7%hs#S<9~m=@%qmd^ zU80es*8T8tuhsjzb4iajcg*q5`gXBX_-EynH(OhKq)$#JmGURG^Ih|&`nvxcKHGjQ z-hJOo%EIq*&95lMj<);uC|vueaya}m-1I*5dbWSv-D=JdGeKixi&rgIgb8dF@|GfQN-ddjS z{(hMG at 5cDMFm$!j;pe@%_`hDxjnmSLwWPN7{PCklkDd*`Ue+G{Qc0$7ov!kQ+GxP* zt?v81*Ne+v&W at zt8m=xJTWa}nuz#VH{@c-%T$!nX{X!krSo!yP^A9Y{W zO3l~%yJqiKE<5=cy1}=zNy)}(_2tQ*pYFB452~#%)$*o0Hj7&@#4Ymb;Ip{>WGBBr zlFNj~^tn)xdzJUQZ)V0n%OQCubw&Bm-fXQudsf!}>twgJRwzymkCyyw=r1;;N~ON} zY4?rC|Fh!eZ;Zg4?B4h2=Ch45eYO8l+jw4?e*d(v$D^a^POnhdDtvo=a^C*6)TSSz z#GD+QjQE|MVqN+D&(A^q*P at wxNGTfMrkkzev+WZ7?RwXGx>>t;$Pn=J1 at 5?jppIoy`l9hvbFc})Vn!5vpO5kN>%C4PhXwFuSLb$ zGbx!|nbk&Nv&08~9Df1d-1fz6s6#|{f`J<_ at lj>aCCp0l-lK;vNihc z=o8)E*ts$G18tIx!eV`MqbR1YPQIWQo7?ehZG9^KeR_*8(df==RM&PY?d_q+0T z>4hCmzm1boa$hdJESD?w+P3)_QH6)An=6bEvHP1fp50w{Ntff at Hh;JOr#C39@#4kt>CB6LuHP&-tLpUa{`*Dmr10gPQm11G1k$pJ)GO at NFwd#jQXJZR#nNZyX{e|fVI&>-tHwhHUp`tke2k-ha~t8{vOI#Ee~-W`-nTU*lb?dfS;EIjSq zobTN^IloY?PPwqd`|nP^E_yqU`_9qcWvt0)qDhrk+!>mA zt6V6k0Zf3uz4MrNPxfvtfio^Oy#|5Dy8h$KY4&WZ)IYvCo;CH}c#^@`ReH&%y-$nU z`kJU6os7)BVjY`lrBp6kcYhomx=(jD`op`^WnGv33#+ at cS!&YVy-!|!{V~s-o-I&M zvyLTH*e;ay>pzYU^B0Ae&B@|)(Zu|1YWLT-3Z2EDC%bWV>yfOSA1zH)$^y0fVrR4F z?0)((R at Wc5>&K at TQ{BM}xBsHJUcvhxzTA-QM~%|y;kS{A at Y3wRD8c7@A3tA#i`Gil z``>PI>?G1)v$WkvK7aanLAHLa)-S&toG)mOy3Ln`?S}vU>z7+~``7Yd{ONE!m13?` z-71v2!?y>Yr~Qpz%hK at U!E`*BNktgB3V-~^m)&J&?P=M%{Ic(jx$&U5T`X4AZ*RWr zdG)pDWpcT at ACCFqpuAHoROI6~U%tkrXTaO1Uk%Lap-rgw*7k?b=Mc|u2%)TBu zx9w#Uz^_!~79UQ&ME$~}YI}ZovRrg9>Gz(O3q5P^!}}Y%@Jo4Xc6WG(v*uMrFYJ`I z_|g0OFL|%{E8n~PeCyLr=5hK~xmYt#|JXgwD;rz2 at o4YP4jShUaJO2q<9_|}{yr=} z=E_Gf$(A$tW-cqGLV1vUzWFe>%a7E`$@iP3X&Gm>S1y$b0@*wNJVDJzYVq=FHdEP& zpj0Yu^ZL=@?p;=S(%rgWcr(F9=XO>u?G$+V`qRP5qP(@WGf&U<3H$bWqsZsrKhz z&UV9o?Xk#*r^_Tm;f;fK%H^VnPQHA)NJ`HtJJa;$##mUx$m!R%%Ux-7aI(7)>R^16 z<7kni=+1Gvjb2$qlh0Sz>Wl5|_TA*@Ru9x at VF~3zrPj;u_IB^m;-*-=9^YNdo;C-C z-fq-;-16{bcPUq&D81>4KhudmcU-PoEp`U}{^%&Hbf3yNJdRUa#)~|aTfM4a-+#V2 zb<3Tn3dt^AOXH1@;$E{>@0pXm`;(+9tO>SzlG=Jlj~ozxTGv-Ov}9|vXPvot|5}?e4=zf2bkmi^Zn(3e~Pr(w`Hs$6v{n3`EYS=mH2JzZh01(t~|L8?P77K)J3zs*{QKDZ4o*>$lRRH zZ>D)0X0#$kC(*T0tUnV5(KpZ2Jn!VT$VoeKSkywfexl z|9)_~unL>Cst>SN)Z3ot=sVCjbNc=L$?2jZcFDK#RlpN2P1NqQ7cX`iTCnfK$higo z{$lrj7R2|*xBg&zYr87ZvA*n<+b?u3yo_ho+&dknS*O|7^84d2Clj+&Xz^Z(^g2?O z6Gz>ybans!_#;eo%icEfY-ngCJUuua8~s|l*Au(N-iw#(YmHiVJ3aPJ&kv3+gI;5x zc$brdC=xfDG+G$Gy?VDJVs?3Pi z+b*{h)v{-~CT*9?WmVItZb$L;B9|q@$ zzNK1L5T=PmT;gGHnU08Pyd2)l7g)EEKMzBjM)^3^xUy)FJd3VIUc~i#1IxB-1?6;< z8C*p|Gz^1pcPwVeI(2MQQVE$-v9ev`O=Rd-*~IU;UBe}rYgu`Go5^Lc7*RFkiM)uo zWlJ^fEO+fBm<3s{*;Z{gLo at f%vuK&`sy0Hhn+4;zKWJ%j9J%RaI1R*3tt at bwqT+0M z>ltE8p?Q+I*ZKDwGN~IfazRuF;bNL~dmWj&OB!4s9e)Q)={mZt^P1u$X1%mk=?SKe z at 27_+^BaxgAWnT_u^5fxUaQv8MP0HcBj7?>tIG3=YUuHNytKJ$d!R_NoQ=<~r$po% znyedozPPD>^?5-I$KP(}d9zpHTJ2uT^+)$y zT)l$CbWTU($uz*-Zn-9Qb%gxoGBvo4(RQ((y5V9 at Rk_9~eU;}-mr|YUgA3qHBU!wl zSmqSj&_zzv5z(PxSW1bA4L3=^9ym2Osik4pMY-+rZ at 9tm`k-zO$y at CJdJaMXXBjYXWzpSMV44ERvNOm94`&zE=old3H at 6+!93X<3;*Q&LiFrOS=FLAd~=R2IH2Uo+f-Kdmn-GOMT z-uc&OgmW=j|z%W{aNYq!zq9mzS# zN?qMmlk3qq8}OV&C`JlCy#GGx==E-%=ccJd^DvUSoUA#-P-emO=&YB0rn9&061ZZO!VEB=i)Cmkk at 4)<8dA98Q{gNy at _z5ye|9rkbkD$U>GT zM at e`?x>{A9rJgIQneY3Cq_uU!qKY!MhD!xTSD4!=X=`>gUpiv1B3dL+`ACe0u_D*{ zfsr6yw_|_i2>p&0`+?FZ8^QVMvRT|2c$0gh*S4-MzPrs*S at CWsq+046o_@Hm6xW65 z at G@7M+2#2+y-=!U=f`)#c42(^@lvU6_l=W#n)I#9`OI!t`Xs)O`Pz2n;_Tb9{j at AB z_vQen`N`>0+ITUTeLHmuFACR3Cuw!9YF`}2y=`%L@*Nj;ww$Z)w|wDw`S$BoQhnUf zPfloeU74I5(Pn8|363XH`FTZqd-6?uT1vlOdG+Vw)zOh(UoUmN!+T?Uvpjoy5m$a4 zEWUo at S}&8&_eaKhZD55*eyv=r&)!_*?MK4(*HM|@3O`Iw++wH2g-5sDVx=;DeW4B> zDTjym>ryp*x17WUq2I{9-3U9?B7JqNb{_Lb$Mm@@Ctns$D071%y}l%c`i}hSKHT4?(^JWU}lloF^-RO;w^9HJ9Slp7!=w!#t%{s`Ig|Xeu}8^tmHCaO3o(Rq<5QuSM5!CX1LWXf6y%nSv{B2hWe&GIlp$7YdS8Q^RwNV?2~$-i*fT#&CB_pFE19O zu>U0N7xKx$SC>o%<%*mL;<+gnmS2ATKJ at L%)7x%ga`N at e4X1^jo`gkwF0^-M$G;qZ zv!&9 at tL@Us;n_{NuwGWAHX?M$_qQfr|MB%ulzZ!wo$A+v>G9A}*Q8!6qWQfbZ|ZM; zxqOEQbel at 0gZ<^nwbELz7^P+6jMY}9__|#EJ$xB*TWIIvb98djCdG~@M1gy&H-wGx z{y*OD?HEd@$H{+&NB5&nz165&VW7^0dZGMkr}Z{kyXUu!-teP*a3 at I>siH-(K9B45 zZTsCXpWg5EPkW_-ax{zf(l)9zE5skrZ+cTKci%j^e)qh6AgyQF at YdLK22rQZ*@>D@ zI~}Psc=PDw-G=hHy=mq1JL3Z)exuv8Q!%(xM7O&AN9)Bap>!0k(LlJdjwZFSQcM)r zw3b>&Zf~ECetA86ay(qaz8uBJ!~Sivp_ehJnMlawPW#Oh=k2=oS$a7NdS3QD@2Os(R?vj z7>$`YpmL-OcE3LR{O|9N9-SUO702E7#pGu2RVvI%O{|(zH8#2Go9B%;&p0SP3`*oC z8!MB+U@;IgA+Z#r+rB*i<@d>>{j10Bu-V at C7tT??INoWy20zrXrZwOE8ohrMe`#%; zhK1?5;D^(qlGWXy9cq26(*FJN{N3aD&z-F+GNUpzZId~9D73-9&8!CgZRx70z}bbMV>-oEU- zEq1?>wd;Im`L!3`n=VbFcAzIbDmhbNCFX+i(oaSwnW zcZ{pP?8 at RaFozztWt9_hq*Fv>@Y3ZHlc9zn;CZ>8r at 4kSUAA2dXsBh|K(i@|Bg>?w ziLs3>4OuuhB`wtjMbUB at tQyf7Hgc?)*g}|ECMLF_0J-B7lqpUa+ca}A5Nd21k!xTV zBep5WuxyC3W}Z`s(wM-<1koH37h{V$I-w?U9g?!`QAwN=$3&(s8>VIu2MT1aYh%#6 zh*F$HDKLaIM>r)G2n`3Zy;BZEbj)_4xNOgriyhVigbW9}#57FPurM?f!zq%(KRAQ1 zLhOiAMGy(os4VT); zb#iJYo?*Mxg7MT4g6ebICWPkDMcak`P at o`A4%9ET4a)dDadT*IiuJ_H6 at YW3pfop8 zMxiY(GN3Ck!Wps?tT}P&BuS2v$TU*K8_t6E)Mc)-9bHJx9Hd*scG$KqQ_%?2Mq=Mf z97@@qFH>WCObF3+OW|xsks%@^Hi!+FL?WBH#crZ2D)iscbwjlD(8Mw(Mr6R4i!f6v zf^On0^-z#xw&_?n#SW*ay2|saYr!;29E?t|+r at Mo$#IefxpS2W*;waDv&*TDZCgaNEZuPpBQ*_ at x?Yy# z5lpZptGeVW9CSX5$t*Foh!~dZN`1b|Co|KHh#5q&8>7riO&c6S6D`b#Gh;qUiOp*e za8qmtA$6!BIksvcN!K8ZTe_7a%MWv+NeY-*o=4Hr4}sn%{xr%GFi{I7mK{b}?!YwU z7Sj9Jz$8H=2Y*y$qzSSlNUEsyx`w10G`9w9n;W+Cg_HYP5Q9mgG$F38V+(B4)NJIW zFzI0JF2N2+J}2_0!{y8)Bqh;2g8A^>bRGg}O=mt+0&FXxYGuTU!G%BzD^%l<&=p!; zp`$8&NfMA~XtH7`k}%+TL6SI)?}KvDx*Xqb54!N7EC{MB%A%qIWS9o{yQ!+GpsR{X zG(y175dcc+rnyU#G!CNB3l<9y74zw6GMh{$!|`Z7pZVTo?%mxFZ-;mAdp#TvC!@(? zGV^8&VBo$F<+41ZZbrdzK^N#S%21mHASQ at Hf6#CD+O2M@(P}iB&04DlFIufmtJmpv zoA9#DiGnl`1n2}e5Cuh+;1}AdseoXHZ39LS>Ja8h1QVDonD!{iqBIMWaOwMtz+VRN zcez;3rqjuII+ at QG^W}2s!%1)IEtcNG^F1%}{J;xCC>%m(vm{}gKHZ$D4h9 at -d!=D$ znxd?#h96ZCMUcciw2T*d_L?2=hJCVnEr_Bhfue>o8gyHQ_F5)D6u2%l+i?inK+5)% z(iOxq(9G$NBVYZ(=@m{sTKwPtPekr|MBt9kA8j*ro{dl55Md%*A#U^~59Gp9?N_lIi#CvB8qSZIn z%WaNBqwjQci!-^t5KpoSuc at _;ovIz#8QoU7a7=q0eVJo=Gu4}b8afWoj&G#sX5{MD z;%@0(olbJcOM)bg?oalE$=!{o>;AXl at ceWP9u1n(o4eWQ#1EHqAnx>b>IF-xsu1s} zWA)4CVWg?4R^Dn)W=M3+=C;A{hAy@?c7!9`E^C7qJKQyu%2+5CWWER9P}nM~M<6KG z{!ZDtG=;J;s8wQ(Gc~PT?YYT8L+x1-NA4$vAS9+izp1WA6j^o_hsRCiFHLuOHgxQp z+huwcn#pjMC)l69)#l;#Qi+Bq8ORNfgm;#GyGQ|dgQL?v_L6~|-^{VOj6^vn{oEsb zzonvsoD*WLD4?k&h;yYP`&@%)e6`my-Tju>v$<{EoDLLu-fZhmy-Q at F*{iC?mv&$D zq%G5!v~_dV?pUOw0io&itMc%uG#G}ZO5z7<7DjC at F~o4 at Vu|nL%UzDU9#@*n;nJQ3 zk!nTM&hHZd87cpGXX1mnfTv?RS_}cNW6O+YOPWcNzZ*;5v0ca}85u7946#IFmPRR+ z`O%Fc-Yo}JBiG{C4GCw+0t8#^AgQCxvyMB`+bvt{-IE{~JDED* zchVzVeX&0$;!ENhXPD6?{aPUwG0bELxI-V zE9YabsOhRI1AKwI%7A8oWC{S8Br6g?8k}NSr81lY@(9PudG!bXHCNlzE!#pCuoi#} zAb2cZL408E;D<#G$IY`8nzX{4{3raxDFda|zaLNpSFsi|3;-|!9D0BwV0z99Au!uj zzk*5tC59V}o-vNb!arhr-JwBj|GZ)SYx5WdHmrvOK3#3AXV3;e?3ZoKe}Fl-6Eu~w zefc)4j>X><3_=NeRmy%i1$et^5If5{NGZcv2B36>!3?9x>eq1}o*rO*AuD8M1y(&< zUHyRI?3F`U>)4#E2<{4tSD?7M{GmBe{Xiz$+B4bjF*p2}TA}MPPz3YYJo1 at XBR<$yOEuMuXXAeXzwmPGB}5Tx4;WxDJK*2cM=e zIgFO)ls&A#9yG`@u+fCN*iG0|2=E5}z^x$mQVg|PK>5L at kwGlNh8Wa_Z9!qv08 at m2 zrmmZYVyHF?2rx;8Z8*rl>?LM%suRO8v4cT{e=wV4%;W{Ddu9Bq+c7UJJ2C5E&zIOM4`Y8}09G>xM0dqf zpxmnT%4gW)DHf}g8LvYU at E@G8T4C(r65uyFQ()8yNQUhQM5>9?7>tG00^VzyB+NV* zE|i$MqSyds8Bi-^vIk#)w1>dlRWnvJeqcEMB6Jzi1EXiMbvYf|L~}wz>-7~km`9cb zu%&8n4!i#SG|DX?1sXRHs5c9+1Z+`a)C*M5V(vi;v&2$(l`bY;ssk_69{7nx{UD{_ z)s7}gcsU$v|u9$^2C{VYX+kupNvP5CyaF1y at ke-r!jd!!gQ2CDfKPlXciLRq$~Nf*k&!GU zG&lyU1=oTB2G~Ma*P&}Vbdd!_$H~wN5x}>=moba&EYw(lnU3YM5CdSbN?Hhxu{dn5AYg#gYtS0TP;dquip>NAx>cZs zv4iX3s+GiI0SeBz*rWiztPhk~2YbSeJqHJ{VHz3)a}1G!J!faK(C9FfWvL$qfG#T! z$juOty at If47=XDDCmwpsazJP`(#!}fli``mf;$*Bi-HJ0XcU`888&JTW>Fp}6?@bS zMgb zaXdUL`Lo{t{`mj*=4TD~FQ!Qz$~ojmADn-=TMV(cT~2^5?A| zbnuTyE?4yLFMjsl{d*W{^7B)6gC7&K>hLNKyFX9=7>l3HbAFE0>d{d9$7KFc#6PO~ z>- at izBY!pbr;29G at _})>|I+*a9=cTl>!E26Metvf at S{S51q+Cl2DeFQVnLb*wQ6IB>sF6*|NwhB+Al&K;)8j0+xwD z`{F^f=OnXPYUrS&81Mm{I}ep_B9fn#U}8vso;6jOIDM+>3VRQ$+uS4f{Bt|w at q zna*dl-E0|4XF&ja6B6m&0Z;N^cAc5Mu7+bLfEoeWvDh3KBz8|{*`UgsQwrkGwNf{i z8UrbH+}qnk?KDwHlML7tO#-dc;h@~`TdcRMBnlwVI4SXCtx at ZfB)dP)|MQK{O0u5CE;Fp<1bkSsEVRo6Uk8+{Cu2TBbA22IaEorvC9*Ef+O! znCgy!4QHH5t(r=*=;}Cc)!WO3Zz7slP7r8tTZ20DvpZaF3cl}}B+G43QJT~f6+{-{ z_0VkalIH;%&lV(299LG(@>MbQb6e?#SX=YH;> zW$wr=ofQ}(q7suaa}zqOGREjGkQLM16wJ)9 z9FXoBb|I!gU{z#Amh*dJL?qJ&C^CTUW>g{6k}YT*=sZE5OsO$)96`)tIf>?uhI6c# z88z5by#l at riFu1vQ4cddoJWS7=DOg9j*N)h9+30MFwbDvQH;CZBoXw$k-5}Ig6oQP z9#6)y{aqGC;83zRPx>^rL?uoPEqC~aV#JqvK21fzff;gUu>zd~Lr5VUQl%pbXgWvk zjig&(7sv;vBC)Cf8HZqOa05)RZ)dfzN9y za5o?~EZeNokrCfSI7gZ);Vh(V7a=uO2(B=&nt~=ancQh1^juZh^X7hJQQJ_Es;HWx z>h4^OuM-?3hAsfT#LF-?*(M-EQdLQo?U=~(8zl*;pomlv9S>AtZb<-tk|8UqGgZ^u zg*J__rdU+cLl-n9QsDNIsw=Xy5b1S7f{3zJ4pqy6;edabtZkMiFC1ktBVnATik<5c zn4!kf&^EAa;4&ynGSEywr&plOzB*v_9KGzIRXV+SZ|W~3AWV*`wcEa((l^aJ%tk)fJ0wH&r=C+C>~K5M`= z#AZ*7XBLy*80kRwp)f=>&_}M8>aOJ)>{(-rWd(o^1I4#86P*4b+Oh5+#yZ*74fc~F zJ7 at WW+yeFu)Ev41JGEh)bxG4iL32GRzKTek+LGothUq1SovVUu z2%Mzf=bCq7n^__ at mCzCMvz(8DF5q{6VBl;lgcq3^MRHrQHQ5~n5WuW~ zT*Z14DP7%CWp|oFn73qvL=FUJ9fPd}*91z2K$VI}q7z#u at 7%jm5Fv>$Op{cvdYQSi^OyjXc0|Z2uEfuA) zAG3^@WiZ!aNft0?dzDTEGiF}`!q$Kui1ZKEh*=U2G`?vt>}Lx%EdRF>BCBl7sw$S5 z1a9TBZxvyy#_R%?-C=na at J{BYKlmlVE6)Ew%2yN>+YclR{p5M8q$(i_Zh~V at Woq zvf(b!R%HD}%UKSAu&idDWe>||582y?0b at hUGEMBZHY4_IR`7#lTaCH>url?KE_?XK zmxtsp{)_qVR_2@`Yx3cC(66E zejHpaL#U?T><&y*R(0F|Zfj1OyFz(Dm-pk5H_doX5E0g(%gHH4YJ{;^Y?!e(oy0T3 zb^DwGyaM9Kc|y4{iL`pt@`BsZbezfkfxx~*0?=?2pxzQCa;>CfbT}PPGJ)ecURNzJ zrHcuX$626Mn|kUFXLlYIxL&uf$QsQ2H{Tq1c_$hFS*9``Oe{r*wfz zEz=~Ea5{HXAn?2*vBcwSL^R)>;(A9jK&DK_f#X7S&{Qx)lwML|MM0v}6w^r3G>8c? zL|Ib|7=9~DZ8f(2T$CZS`EJJ6S`ka=vG at fs#WhkR&MhEadB`##m;#>$wALZIDiFqW zq9v|jXE at FBgk^ddr~;D#%at{VMu?>h8C%XWmPKS~B}->Mq)L+RnzjX0h1zaL;e5uj z at hr$VlEEDTY#_RWb0j(-4)eK>X^!1P#?QaySp8KZCsY{(D at mct;-4(D&w<#e=%wR6AOn-9|mD ziFw%$*mrrzvd;C|UFY`tY>De`4+~c6Ez$_7y1{k2vg4hfh8B-Rtt41=fl zV{h)7)Z}@7;6`z9y1-?x;S2_H;NjSkuj at cdLfCrzXZY>3$=q?v` z%ey6jwT5`rjR?8DQg)oSUTbyI)LF!VELtiOg%l|GhtQ~;InIC&{iS;C<3UdxG+I3* z8rcWAqYkN}3PU=}j&BSg|5A at v^}d!KcFG{JE1m9=GpDB`A$I^DZATUt- at nSj)G;cu zV6?2^TzfE<`>@=F4MzyNoBRVia`l4(&3GPk

!nE!EGC^1CA0W zVeFyMh+HD&sv#MI!FD}@$}wG*9aw-!Us_8XJ4-dSFeqK5EVVlkYUECU at -$4inF z2WA at Qj*)0o0rWA6?ylDQ7#difn^Lw^?J%NG%#?Fg25u_D5KuNI1~rlC5HP8m=s8|&0 zHU;dFU_PW!bcvQxN6tWBfh;mXYeL)u)L123p$QOOGC&ppr$nWzl{w3#2xU43-H_PG zp$-%RJ;HJ(P>TV;#kO`5ro-3^{O}cXWJP2ch9aFwQcO}eN#Z!qEyCC_V at nozwxX&g z$@OEQ5 ziA;_0IMb9QJIxG1Opfp6x|9a4so^Y2Q>1nJ3gbja!%?BfB_Xk-a2BZ+c9iZw1MnhU zbT|~N4LcoYZ7sWXkm2S5-%@9zrP-r$@6`thME2z6f(iMGDH(glSy|xHwEXz%q=I+UJZc25AeAhjlOU?{h)4om zq>iiEF^D7x=ImywtbxN>E<`Z}`?D}NUA99IOfO5Yr7CRWhAa!ZrLWebKpS`qFG)!j zgb`hlWJ~UJL>+>Y3Q-5=X`Ux}>c-wYfezCwPQepxtSUSwYG{>Oz?f!f0__g{#d4+9 zfC%V4Eq+n{vbTUm{ z1qX5L>I%|L34#u<>87kBCK*zH4t4o{=wRMpJ6yn=^BfqdVp%y+*(Np3$eGge$BPW} zz|$b8DZpTe)YsUe8$@=teUJDdWl!AMLb-3anI(%r$FZcEEJ*<>5rn6NoH&V>m%c04 zbm%LfS)74hmE4Ra!GXQ2;y||D)D7-jSE(DTZ3gKiv2{_$U at SC(&}~W_r+~H7TTsyr zL9qZTqUqAMWCeT&YG8s=mqkqnzA#Fl-nIz at +m1(9voM9m8aPi92Q+iP-RTRm9bYF% z)$|OokN809veacOuTc_)K?2n&ydas*oUn|QE%XFE16`Z_e@&b*jvFxyMUS+A5d=nH z7??r at 3sow0fVpIv6kE7(<=HWzT2+XYk^{Ue*gXFJ?STlgE|ykBh@?B|GKa z=C^c>6octQX3t-08g#Z>Zp#+h08SVTwE<1f>NWr^oizT5_4FQ4TxWP)ZT(ozo(%SI z#{3Q!x(05x9*b&%lhi=VMmxf&^ySd^0g!ci8dDjW#l93AQ_k7XF at dWr)re~Qy{lkW zKd-0^1$zqQB>Z zhO$Qpa?kbcV=g%kXu@~OBeggN4t|kdFFu)UatNgZ-R?EHfhj(WyRGy3GYH-uA2_0r zmju1XUa400XS21mNQx*lVxA(GwsT1UTb0f~-Af-XG^Lnijno$z5p(ub z0;$m~giY3x3ZbPw*B6PSi at m6vdt~j^_VI$VwyfA0(%pLp1Nq9dV3t;MMlRSe=E2}p z7zRG at X-nj4`vfl*rI6$kX1%W*C{b57mR>E;&qG%OQF`GguM4*YfpS4`?5i^*e#-T2 zoL5K6SSX7*bj;((dGi$?FSPSywW071WqatZeQ*32+^C>~M;vQ!Fq;JwP{mUI%z57- zE)gDPEFOyz*j?6T%d#hh`aa(8Htad4FubXv8);SBCwSs2ebM{?CA5(Z!4dE5_7kJX zrOBLZQ?=?;0<@l#!74G9JGCS_k-BDU at mJ072P`NyuTS|_y0OY{-oI7_UZFU|S6RMS XY at 3gEoUH7s+P27(s +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/email/test/data/msg_02.txt b/lib-python/2.2/email/test/data/msg_02.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_02.txt @@ -0,0 +1,135 @@ +MIME-version: 1.0 +From: ppp-request at zzz.org +Sender: ppp-admin at zzz.org +To: ppp at zzz.org +Subject: Ppp digest, Vol 1 #2 - 5 msgs +Date: Fri, 20 Apr 2001 20:18:00 -0400 (EDT) +X-Mailer: Mailman v2.0.4 +X-Mailman-Version: 2.0.4 +Content-Type: multipart/mixed; boundary="192.168.1.2.889.32614.987812255.500.21814" + +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Masthead (Ppp digest, Vol 1 #2) + +Send Ppp mailing list submissions to + ppp at zzz.org + +To subscribe or unsubscribe via the World Wide Web, visit + http://www.zzz.org/mailman/listinfo/ppp +or, via email, send a message with subject or body 'help' to + ppp-request at zzz.org + +You can reach the person managing the list at + ppp-admin at zzz.org + +When replying, please edit your Subject line so it is more specific +than "Re: Contents of Ppp digest..." + + +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Today's Topics (5 msgs) + +Today's Topics: + + 1. testing #1 (Barry A. Warsaw) + 2. testing #2 (Barry A. Warsaw) + 3. testing #3 (Barry A. Warsaw) + 4. testing #4 (Barry A. Warsaw) + 5. testing #5 (Barry A. Warsaw) + +--192.168.1.2.889.32614.987812255.500.21814 +Content-Type: multipart/digest; boundary="__--__--" + +--__--__-- + +Message: 1 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Date: Fri, 20 Apr 2001 20:16:13 -0400 +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #1 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 2 +Date: Fri, 20 Apr 2001 20:16:21 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Precedence: bulk + + +hello + + +--__--__-- + +Message: 3 +Date: Fri, 20 Apr 2001 20:16:25 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #3 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 4 +Date: Fri, 20 Apr 2001 20:16:28 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #4 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 5 +Date: Fri, 20 Apr 2001 20:16:32 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #5 +Precedence: bulk + + +hello + + + + +--__--__---- +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Digest Footer + +_______________________________________________ +Ppp mailing list +Ppp at zzz.org +http://www.zzz.org/mailman/listinfo/ppp + + +--192.168.1.2.889.32614.987812255.500.21814-- + +End of Ppp Digest + diff --git a/lib-python/2.2/email/test/data/msg_03.txt b/lib-python/2.2/email/test/data/msg_03.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_03.txt @@ -0,0 +1,16 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/email/test/data/msg_04.txt b/lib-python/2.2/email/test/data/msg_04.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_04.txt @@ -0,0 +1,37 @@ +Return-Path: +Delivered-To: barry at python.org +Received: by mail.python.org (Postfix, from userid 889) + id C2BF0D37C6; Tue, 11 Sep 2001 00:05:05 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="h90VIIIKmx" +Content-Transfer-Encoding: 7bit +Message-ID: <15261.36209.358846.118674 at anthem.python.org> +From: barry at python.org (Barry A. Warsaw) +To: barry at python.org +Subject: a simple multipart +Date: Tue, 11 Sep 2001 00:05:05 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Make a door into a window + + +--h90VIIIKmx +Content-Type: text/plain +Content-Disposition: inline; + filename="msg.txt" +Content-Transfer-Encoding: 7bit + +a simple kind of mirror +to reflect upon our own + +--h90VIIIKmx +Content-Type: text/plain +Content-Disposition: inline; + filename="msg.txt" +Content-Transfer-Encoding: 7bit + +a simple kind of mirror +to reflect upon our own + +--h90VIIIKmx-- + diff --git a/lib-python/2.2/email/test/data/msg_05.txt b/lib-python/2.2/email/test/data/msg_05.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_05.txt @@ -0,0 +1,28 @@ +From: foo +Subject: bar +To: baz +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="D1690A7AC1.996856090/mail.example.com" +Message-Id: <20010803162810.0CA8AA7ACC at mail.example.com> + +This is a MIME-encapsulated message. + +--D1690A7AC1.996856090/mail.example.com +Content-Type: text/plain + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com +Content-Type: message/rfc822 + +From: nobody at python.org + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com-- + diff --git a/lib-python/2.2/email/test/data/msg_06.txt b/lib-python/2.2/email/test/data/msg_06.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_06.txt @@ -0,0 +1,33 @@ +Return-Path: +Delivered-To: barry at python.org +MIME-Version: 1.0 +Content-Type: message/rfc822 +Content-Description: forwarded message +Content-Transfer-Encoding: 7bit +Message-ID: <15265.9482.641338.555352 at python.org> +From: barry at zope.com (Barry A. Warsaw) +Sender: barry at python.org +To: barry at python.org +Subject: forwarded message from Barry A. Warsaw +Date: Thu, 13 Sep 2001 17:28:42 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Be dirty +X-Url: http://barry.wooz.org + +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Return-Path: +Delivered-To: barry at python.org +Message-ID: <15265.9468.713530.98441 at python.org> +From: barry at zope.com (Barry A. Warsaw) +Sender: barry at python.org +To: barry at python.org +Subject: testing +Date: Thu, 13 Sep 2001 17:28:28 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Spectrum analysis +X-Url: http://barry.wooz.org + + diff --git a/lib-python/2.2/email/test/data/msg_07.txt b/lib-python/2.2/email/test/data/msg_07.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_07.txt @@ -0,0 +1,83 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + +Hi there, + +This is the dingus fish. + +--BOUNDARY +Content-Type: image/gif; name="dingusfish.gif" +Content-Transfer-Encoding: base64 +content-disposition: attachment; filename="dingusfish.gif" + +R0lGODdhAAEAAfAAAP///wAAACwAAAAAAAEAAQAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm6sq2 +7gvH8kzX9o3n+s73/g8MCofEovGITGICTKbyCV0FDNOo9SqpQqpOrJfXzTQj2vD3TGtqL+NtGQ2f +qTXmxzuOd7WXdcc9DyjU53ewFni4s0fGhdiYaEhGBelICTNoV1j5NUnFcrmUqemjNifJVWpaOqaI +oFq3SspZsSraE7sHq3jr1MZqWvi662vxV4tD+pvKW6aLDOCLyur8PDwbanyDeq0N3DctbQYeLDvR +RY6t95m6UB0d3mwIrV7e2VGNvjjffukeJp4w7F65KecGFsTHQGAygOrgrWs1jt28Rc88KESYcGLA +/obvTkH6p+CinWJiJmIMqXGQwH/y4qk0SYjgQTczT3ajKZGfuI0uJ4kkVI/DT5s3/ejkxI0aT4Y+ +YTYgWbImUaXk9nlLmnSh1qJiJFl0OpUqRK4oOy7NyRQtHWofhoYVxkwWXKUSn0YsS+fUV6lhqfYb +6ayd3Z5qQdG1B7bvQzaJjwUV2lixMUZ7JVsOlfjWVr/3NB/uFvnySBN6Dcb6rGwaRM3wsormw5cC +M9NxWy/bWdufudCvy8bOAjXjVVwta/uO21sE5RHBCzNFXtgq9ORtH4eYjVP4Yryo026nvkFmCeyA +B29efV6ravCMK5JwWd5897Qrx7ll38o6iHDZ/rXPR//feevhF4l7wjUGX3xq1eeRfM4RSJGBIV1D +z1gKPkfWag3mVBVvva1RlX5bAJTPR/2YqNtw/FkIYYEi/pIZiAdpcxpoHtmnYYoZtvhUftzdx5ZX +JSKDW405zkGcZzzGZ6KEv4FI224oDmijlEf+xp6MJK5ojY/ASeVUR+wsKRuJ+XFZ5o7ZeEime8t1 +ouUsU6YjF5ZtUihhkGfCdFQLWQFJ3UXxmElfhQnR+eCdcDbkFZp6vTRmj56ApCihn5QGpaToNZmR +n3NVSpZcQpZ2KEONusaiCsKAug0wkQbJSFO+PTSjneGxOuFjPlUk3ovWvdIerjUg9ZGIOtGq/qeX +eCYrrCX+1UPsgTKGGRSbzd5q156d/gpfbJxe66eD5iQKrXj7RGgruGxs62qebBHUKS32CKluCiqZ +qh+pmehmEb71noAUoe5e9Zm17S7773V10pjrtG4CmuurCV/n6zLK5turWNhqOvFXbjhZrMD0YhKe +wR0zOyuvsh6MWrGoIuzvyWu5y1WIFAqmJselypxXh6dKLNOKEB98L88bS2rkNqqlKzCNJp9c0G0j +Gzh0iRrCbHSXmPR643QS+4rWhgFmnSbSuXCjS0xAOWkU2UdLqyuUNfHSFdUouy3bm5i5GnDM3tG8 +doJ4r5tqu3pPbRSVfvs8uJzeNXhp3n4j/tZ42SwH7eaWUUOjc3qFV9453UHTXZfcLH+OeNs5g36x +lBnHvTm7EbMbLeuaLncao8vWCXimfo1o+843Ak6y4ChNeGntvAYvfLK4ezmoyNIbNCLTCXO9ZV3A +E8/s88RczPzDwI4Ob7XZyl7+9Miban29h+tJZPrE21wgvBphDfrrfPdCTPKJD/y98L1rZwHcV6Jq +Zab0metpuNIX/qAFPoz171WUaUb4HAhBSzHuHfjzHb3kha/2Cctis/ORArVHNYfFyYRH2pYIRzic +isVOfPWD1b6mRTqpCRBozzof6UZVvFXRxWIr3GGrEviGYgyPMfahheiSaLs/9QeFu7oZ/ndSY8DD +ya9x+uPed+7mxN2IzIISBOMLFYWVqC3Pew1T2nFuuCiwZS5/v6II10i4t1OJcUH2U9zxKodHsGGv +Oa+zkvNUYUOa/TCCRutF9MzDwdlUMJADTCGSbDQ5OV4PTamDoPEi6Ecc/RF5RWwkcdSXvSOaDWSn +I9LlvubFTQpuc6JKXLcKeb+xdbKRBnwREemXyjg6ME65aJiOuBgrktzykfPLJBKR9ClMavJ62/Ff +BlNIyod9yX9wcSXexnXFpvkrbXk64xsx5Db7wXKP5fSgsvwIMM/9631VLBfkmtbHRXpqmtei52hG +pUwSlo+BASQoeILDOBgREECxBBh5/iYmNsQ9dIv5+OI++QkqdsJPc3uykz5fkM+OraeekcQF7X4n +B5S67za5U967PmooGQhUXfF7afXyCD7ONdRe17QogYjVx38uLwtrS6nhTnm15LQUnu9E2uK6CNI/ +1HOABj0ESwOjut4FEpFQpdNAm4K2LHnDWHNcmKB2ioKBogysVZtMO2nSxUdZ8Yk2kJc7URioLVI0 +YgmtIwZj4LoeKemgnOnbUdGnzZ4Oa6scqiolBGqS6RgWNLu0RMhcaE6rhhU4hiuqFXPAG8fGwTPW +FKeLMtdVmXLSs5YJGF/YeVm7rREMlY3UYE+yCxbaMXX8y15m5zVHq6GOKDMynzII/jdUHdyVqIy0 +ifX2+r/EgtZcvRzSb72gU9ui87M2VecjKildW/aFqaYhKoryUjfB/g4qtyVuc60xFDGmCxwjW+qu +zjuwl2GkOWn66+3QiiEctvd04OVvcCVzjgT7lrkvjVGKKHmmlDUKowSeikb5kK/mJReuWOxONx+s +ULsl+Lqb0CVn0SrVyJ6wt4t6yTeSCafhPhAf0OXn6L60UMxiLolFAtmN35S2Ob1lZpQ1r/n0Qb5D +oQ1zJiRVDgF8N3Q8TYfbi3DyWCy3lT1nxyBs6FT3S2GOzWRlxwKvlRP0RPJA9SjxEy0UoEnkA+M4 +cnzLMJrBGWLFEaaUb5lvpqbq/loOaU5+DFuHPxo82/OZuM8FXG3oVNZhtWpMpb/0Xu5m/LfLhHZQ +7yuVI0MqZ7NE43imC8jH3IwGZlbPm0xkJYs7+2U48hXTsFSMqgGDvai0kLxyynKNT/waj+q1c1tz +GjOpPBgdCSq3UKZxCSsqFIY+O6JbAWGWcV1pwqLyj5sGqCF1xb1F3varUWqrJv6cN3PrUXzijtfZ +FshpBL3Xwr4GIPvU2N8EjrJgS1zl21rbXQMXeXc5jjFyrhpCzijSv/RQtyPSzHCFMhlME95fHglt +pRsX+dfSQjUeHAlpWzJ5iOo79Ldnaxai6bXTcGO3fp07ri7HLEmXXPlYi8bv/qVxvNcdra6m7Rlb +6JBTb5fd66VhFRjGArh2n7R1rDW4P5NOT9K0I183T2scYkeZ3q/VFyLb09U9ajzXBS8Kgkhc4mBS +kYY9cy3Vy9lUnuNJH8HGIclUilwnBtjUOH0gteGOZ4c/XNrhXLSYDyxfnD8z1pDy7rYRvDolhnbe +UMzxCZUs40s6s7UIvBnLgc0+vKuOkIXeOrDymlp+Zxra4MZLBbVrqD/jTJ597pDmnw5c4+DbyB88 +9Cg9DodYcSuMZT/114pptqc/EuTjRPvH/z5slzI3tluOEBBLqOXLOX+0I5929tO97wkvl/atCz+y +xJrdwteW2FNW/NSmBP+f/maYtVs/bYyBC7Ox3jsYZHL05CIrBa/nS+b3bHfiYm4Ueil1YZZSgAUI +fFZ1dxUmeA2oQRQ3RuGXNGLFV9/XbGFGPV6kfzk1TBBCd+izc7q1H+OHMJwmaBX2IQNYVAKHYepV +SSGCe6CnbYHHETKGNe43EDvFgZr0gB/nVHPHZ80VV1ojOiI3XDvYIkl4ayo4bxQIgrFXWTvBI0nH +VElWMuw2aLUWCRHHf8ymVCHjFlJnOSojfevCYyyyZDH0IcvHhrsnQ5O1OsWzONuVVKIxSxiFZ/tR +fKDAf6xFTnw4O9Qig2VCfW2hJQrmMOuHW0W3dLQmCMO2ccdUd/xyfflH/olTiHZVdGwb8nIwRzSE +J15jFlOJuBZBZ4CiyHyd2IFylFlB+HgHhYabhWOGwYO1ZH/Og1dtQlFMk352CGRSIFTapnWQEUtN +l4zv8S0aaCFDyGCBqDUxZYpxGHX01y/JuH1xhn7TOCnNCI4eKDs5WGX4R425F4vF1o3BJ4vO0otq +I3rimI7jJY1jISqnBxknCIvruF83mF5wN4X7qGLIhR8A2Vg0yFERSIXn9Vv3GHy3Vj/WIkKddlYi +yIMv2I/VMjTLpW7pt05SWIZR0RPyxpB4SIUM9lBPGBl0GC7oSEEwRYLe4pJpZY2P0zbI1n+Oc44w +qY3PUnmF0ixjVpDD/mJ9wpOBGTVgXlaCaZiPcIWK5NiKBIiPdGaQ0TWGvAiG7nMchdZb7Vgf8zNi +MuMyzRdy/lePe9iC4TRx7WhhOQI/QiSVNAmAa2lT/piFbuh7ofJoYSZzrSZ1bvmWw3eN2nKUPVky +uPN5/VRfohRd0VYZoqhKIlU6TXYhJxmPUIloAwc1bPmHEpaZYZORHNlXUJM07hATwHR8MJYqkwWR +WaIezFhxSFlc8/Fq82hEnpeRozg3ULhhr9lAGtVEkCg5ZNRuuVleBPaZadhG0ZgkyPmDOTOKzViM +YgOcpukKqQcbjAWS0IleQ2ROjdh6A+md1qWdBRSX7iSYgFRTtRmBpJioieXJiHfJiMGIR9fJOn8I +MSfXYhspn4ooSa2mSAj4n+8Bmg03fBJZoPOJgsVZRxu1oOMRPXYYjdqjihFaEoZpXBREanuJoRI6 +cibFinq4ngUKh/wQd/H5ofYCZ0HJXR62opZFaAT0iFIZo4DIiUojkjeqKiuoZirKo5Y1a7AWckGa +BkuYoD5lpDK6eUs6CkDqpETwl1EqpfhJpVeKpVl6EgUAADs= + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_08.txt b/lib-python/2.2/email/test/data/msg_08.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_08.txt @@ -0,0 +1,24 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-2" + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_09.txt b/lib-python/2.2/email/test/data/msg_09.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_09.txt @@ -0,0 +1,24 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: text/plain + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_10.txt b/lib-python/2.2/email/test/data/msg_10.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_10.txt @@ -0,0 +1,32 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +This is a 7bit encoded message. + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" +Content-Transfer-Encoding: Quoted-Printable + +=A1This is a Quoted Printable encoded message! + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-1" +Content-Transfer-Encoding: Base64 + +VGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2Uu + + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-1" + +This has no Content-Transfer-Encoding: header. + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_11.txt b/lib-python/2.2/email/test/data/msg_11.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_11.txt @@ -0,0 +1,7 @@ +Content-Type: message/rfc822 +MIME-Version: 1.0 +Subject: The enclosing message + +Subject: An enclosed message + +Here is the body of the message. diff --git a/lib-python/2.2/email/test/data/msg_12.txt b/lib-python/2.2/email/test/data/msg_12.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_12.txt @@ -0,0 +1,36 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: multipart/mixed; boundary="ANOTHER" + +--ANOTHER +Content-Type: text/plain; charset="iso-8859-2" + + +--ANOTHER +Content-Type: text/plain; charset="iso-8859-3" + +--ANOTHER-- + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_13.txt b/lib-python/2.2/email/test/data/msg_13.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_13.txt @@ -0,0 +1,94 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="OUTER" + +--OUTER +Content-Type: text/plain; charset="us-ascii" + +A text/plain part + +--OUTER +Content-Type: multipart/mixed; boundary=BOUNDARY + + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + +Hi there, + +This is the dingus fish. + +--BOUNDARY +Content-Type: image/gif; name="dingusfish.gif" +Content-Transfer-Encoding: base64 +content-disposition: attachment; filename="dingusfish.gif" + +R0lGODdhAAEAAfAAAP///wAAACwAAAAAAAEAAQAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm6sq2 +7gvH8kzX9o3n+s73/g8MCofEovGITGICTKbyCV0FDNOo9SqpQqpOrJfXzTQj2vD3TGtqL+NtGQ2f +qTXmxzuOd7WXdcc9DyjU53ewFni4s0fGhdiYaEhGBelICTNoV1j5NUnFcrmUqemjNifJVWpaOqaI +oFq3SspZsSraE7sHq3jr1MZqWvi662vxV4tD+pvKW6aLDOCLyur8PDwbanyDeq0N3DctbQYeLDvR +RY6t95m6UB0d3mwIrV7e2VGNvjjffukeJp4w7F65KecGFsTHQGAygOrgrWs1jt28Rc88KESYcGLA +/obvTkH6p+CinWJiJmIMqXGQwH/y4qk0SYjgQTczT3ajKZGfuI0uJ4kkVI/DT5s3/ejkxI0aT4Y+ +YTYgWbImUaXk9nlLmnSh1qJiJFl0OpUqRK4oOy7NyRQtHWofhoYVxkwWXKUSn0YsS+fUV6lhqfYb +6ayd3Z5qQdG1B7bvQzaJjwUV2lixMUZ7JVsOlfjWVr/3NB/uFvnySBN6Dcb6rGwaRM3wsormw5cC +M9NxWy/bWdufudCvy8bOAjXjVVwta/uO21sE5RHBCzNFXtgq9ORtH4eYjVP4Yryo026nvkFmCeyA +B29efV6ravCMK5JwWd5897Qrx7ll38o6iHDZ/rXPR//feevhF4l7wjUGX3xq1eeRfM4RSJGBIV1D +z1gKPkfWag3mVBVvva1RlX5bAJTPR/2YqNtw/FkIYYEi/pIZiAdpcxpoHtmnYYoZtvhUftzdx5ZX +JSKDW405zkGcZzzGZ6KEv4FI224oDmijlEf+xp6MJK5ojY/ASeVUR+wsKRuJ+XFZ5o7ZeEime8t1 +ouUsU6YjF5ZtUihhkGfCdFQLWQFJ3UXxmElfhQnR+eCdcDbkFZp6vTRmj56ApCihn5QGpaToNZmR +n3NVSpZcQpZ2KEONusaiCsKAug0wkQbJSFO+PTSjneGxOuFjPlUk3ovWvdIerjUg9ZGIOtGq/qeX +eCYrrCX+1UPsgTKGGRSbzd5q156d/gpfbJxe66eD5iQKrXj7RGgruGxs62qebBHUKS32CKluCiqZ +qh+pmehmEb71noAUoe5e9Zm17S7773V10pjrtG4CmuurCV/n6zLK5turWNhqOvFXbjhZrMD0YhKe +wR0zOyuvsh6MWrGoIuzvyWu5y1WIFAqmJselypxXh6dKLNOKEB98L88bS2rkNqqlKzCNJp9c0G0j +Gzh0iRrCbHSXmPR643QS+4rWhgFmnSbSuXCjS0xAOWkU2UdLqyuUNfHSFdUouy3bm5i5GnDM3tG8 +doJ4r5tqu3pPbRSVfvs8uJzeNXhp3n4j/tZ42SwH7eaWUUOjc3qFV9453UHTXZfcLH+OeNs5g36x +lBnHvTm7EbMbLeuaLncao8vWCXimfo1o+843Ak6y4ChNeGntvAYvfLK4ezmoyNIbNCLTCXO9ZV3A +E8/s88RczPzDwI4Ob7XZyl7+9Miban29h+tJZPrE21wgvBphDfrrfPdCTPKJD/y98L1rZwHcV6Jq +Zab0metpuNIX/qAFPoz171WUaUb4HAhBSzHuHfjzHb3kha/2Cctis/ORArVHNYfFyYRH2pYIRzic +isVOfPWD1b6mRTqpCRBozzof6UZVvFXRxWIr3GGrEviGYgyPMfahheiSaLs/9QeFu7oZ/ndSY8DD +ya9x+uPed+7mxN2IzIISBOMLFYWVqC3Pew1T2nFuuCiwZS5/v6II10i4t1OJcUH2U9zxKodHsGGv +Oa+zkvNUYUOa/TCCRutF9MzDwdlUMJADTCGSbDQ5OV4PTamDoPEi6Ecc/RF5RWwkcdSXvSOaDWSn +I9LlvubFTQpuc6JKXLcKeb+xdbKRBnwREemXyjg6ME65aJiOuBgrktzykfPLJBKR9ClMavJ62/Ff +BlNIyod9yX9wcSXexnXFpvkrbXk64xsx5Db7wXKP5fSgsvwIMM/9631VLBfkmtbHRXpqmtei52hG +pUwSlo+BASQoeILDOBgREECxBBh5/iYmNsQ9dIv5+OI++QkqdsJPc3uykz5fkM+OraeekcQF7X4n +B5S67za5U967PmooGQhUXfF7afXyCD7ONdRe17QogYjVx38uLwtrS6nhTnm15LQUnu9E2uK6CNI/ +1HOABj0ESwOjut4FEpFQpdNAm4K2LHnDWHNcmKB2ioKBogysVZtMO2nSxUdZ8Yk2kJc7URioLVI0 +YgmtIwZj4LoeKemgnOnbUdGnzZ4Oa6scqiolBGqS6RgWNLu0RMhcaE6rhhU4hiuqFXPAG8fGwTPW +FKeLMtdVmXLSs5YJGF/YeVm7rREMlY3UYE+yCxbaMXX8y15m5zVHq6GOKDMynzII/jdUHdyVqIy0 +ifX2+r/EgtZcvRzSb72gU9ui87M2VecjKildW/aFqaYhKoryUjfB/g4qtyVuc60xFDGmCxwjW+qu +zjuwl2GkOWn66+3QiiEctvd04OVvcCVzjgT7lrkvjVGKKHmmlDUKowSeikb5kK/mJReuWOxONx+s +ULsl+Lqb0CVn0SrVyJ6wt4t6yTeSCafhPhAf0OXn6L60UMxiLolFAtmN35S2Ob1lZpQ1r/n0Qb5D +oQ1zJiRVDgF8N3Q8TYfbi3DyWCy3lT1nxyBs6FT3S2GOzWRlxwKvlRP0RPJA9SjxEy0UoEnkA+M4 +cnzLMJrBGWLFEaaUb5lvpqbq/loOaU5+DFuHPxo82/OZuM8FXG3oVNZhtWpMpb/0Xu5m/LfLhHZQ +7yuVI0MqZ7NE43imC8jH3IwGZlbPm0xkJYs7+2U48hXTsFSMqgGDvai0kLxyynKNT/waj+q1c1tz +GjOpPBgdCSq3UKZxCSsqFIY+O6JbAWGWcV1pwqLyj5sGqCF1xb1F3varUWqrJv6cN3PrUXzijtfZ +FshpBL3Xwr4GIPvU2N8EjrJgS1zl21rbXQMXeXc5jjFyrhpCzijSv/RQtyPSzHCFMhlME95fHglt +pRsX+dfSQjUeHAlpWzJ5iOo79Ldnaxai6bXTcGO3fp07ri7HLEmXXPlYi8bv/qVxvNcdra6m7Rlb +6JBTb5fd66VhFRjGArh2n7R1rDW4P5NOT9K0I183T2scYkeZ3q/VFyLb09U9ajzXBS8Kgkhc4mBS +kYY9cy3Vy9lUnuNJH8HGIclUilwnBtjUOH0gteGOZ4c/XNrhXLSYDyxfnD8z1pDy7rYRvDolhnbe +UMzxCZUs40s6s7UIvBnLgc0+vKuOkIXeOrDymlp+Zxra4MZLBbVrqD/jTJ597pDmnw5c4+DbyB88 +9Cg9DodYcSuMZT/114pptqc/EuTjRPvH/z5slzI3tluOEBBLqOXLOX+0I5929tO97wkvl/atCz+y +xJrdwteW2FNW/NSmBP+f/maYtVs/bYyBC7Ox3jsYZHL05CIrBa/nS+b3bHfiYm4Ueil1YZZSgAUI +fFZ1dxUmeA2oQRQ3RuGXNGLFV9/XbGFGPV6kfzk1TBBCd+izc7q1H+OHMJwmaBX2IQNYVAKHYepV +SSGCe6CnbYHHETKGNe43EDvFgZr0gB/nVHPHZ80VV1ojOiI3XDvYIkl4ayo4bxQIgrFXWTvBI0nH +VElWMuw2aLUWCRHHf8ymVCHjFlJnOSojfevCYyyyZDH0IcvHhrsnQ5O1OsWzONuVVKIxSxiFZ/tR +fKDAf6xFTnw4O9Qig2VCfW2hJQrmMOuHW0W3dLQmCMO2ccdUd/xyfflH/olTiHZVdGwb8nIwRzSE +J15jFlOJuBZBZ4CiyHyd2IFylFlB+HgHhYabhWOGwYO1ZH/Og1dtQlFMk352CGRSIFTapnWQEUtN +l4zv8S0aaCFDyGCBqDUxZYpxGHX01y/JuH1xhn7TOCnNCI4eKDs5WGX4R425F4vF1o3BJ4vO0otq +I3rimI7jJY1jISqnBxknCIvruF83mF5wN4X7qGLIhR8A2Vg0yFERSIXn9Vv3GHy3Vj/WIkKddlYi +yIMv2I/VMjTLpW7pt05SWIZR0RPyxpB4SIUM9lBPGBl0GC7oSEEwRYLe4pJpZY2P0zbI1n+Oc44w +qY3PUnmF0ixjVpDD/mJ9wpOBGTVgXlaCaZiPcIWK5NiKBIiPdGaQ0TWGvAiG7nMchdZb7Vgf8zNi +MuMyzRdy/lePe9iC4TRx7WhhOQI/QiSVNAmAa2lT/piFbuh7ofJoYSZzrSZ1bvmWw3eN2nKUPVky +uPN5/VRfohRd0VYZoqhKIlU6TXYhJxmPUIloAwc1bPmHEpaZYZORHNlXUJM07hATwHR8MJYqkwWR +WaIezFhxSFlc8/Fq82hEnpeRozg3ULhhr9lAGtVEkCg5ZNRuuVleBPaZadhG0ZgkyPmDOTOKzViM +YgOcpukKqQcbjAWS0IleQ2ROjdh6A+md1qWdBRSX7iSYgFRTtRmBpJioieXJiHfJiMGIR9fJOn8I +MSfXYhspn4ooSa2mSAj4n+8Bmg03fBJZoPOJgsVZRxu1oOMRPXYYjdqjihFaEoZpXBREanuJoRI6 +cibFinq4ngUKh/wQd/H5ofYCZ0HJXR62opZFaAT0iFIZo4DIiUojkjeqKiuoZirKo5Y1a7AWckGa +BkuYoD5lpDK6eUs6CkDqpETwl1EqpfhJpVeKpVl6EgUAADs= + +--BOUNDARY-- + +--OUTER-- diff --git a/lib-python/2.2/email/test/data/msg_14.txt b/lib-python/2.2/email/test/data/msg_14.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_14.txt @@ -0,0 +1,23 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +I'm sorry but I'm using a drainbread ISP, which although big and +wealthy can't seem to generate standard compliant email. :( + +This message has a Content-Type: header with no subtype. I hope you +can still read it. + +-Me diff --git a/lib-python/2.2/email/test/data/msg_15.txt b/lib-python/2.2/email/test/data/msg_15.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_15.txt @@ -0,0 +1,52 @@ +Return-Path: +Received: from fepD.post.tele.dk (195.41.46.149) by mail.groupcare.dk (LSMTP for Windows NT v1.1b) with SMTP id <0.0014F8A2 at mail.groupcare.dk>; Mon, 30 Apr 2001 12:17:50 +0200 +User-Agent: Microsoft-Outlook-Express-Macintosh-Edition/5.02.2106 +Subject: XX +From: xx at xx.dk +To: XX +Message-ID: +Mime-version: 1.0 +Content-type: multipart/mixed; + boundary="MS_Mac_OE_3071477847_720252_MIME_Part" + +> Denne meddelelse er i MIME-format. Da dit postl?sningsprogram ikke forst?r dette format, kan del af eller hele meddelelsen v?re ul?selig. + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: multipart/alternative; + boundary="MS_Mac_OE_3071477847_720252_MIME_Part" + + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: text/plain; charset="ISO-8859-1" +Content-transfer-encoding: quoted-printable + +Some removed test. + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: text/html; charset="ISO-8859-1" +Content-transfer-encoding: quoted-printable + + + +Some removed HTML + + +Some removed text. + + + + +--MS_Mac_OE_3071477847_720252_MIME_Part-- + + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: image/gif; name="xx.gif"; + x-mac-creator="6F676C65"; + x-mac-type="47494666" +Content-disposition: attachment +Content-transfer-encoding: base64 + +Some removed base64 encoded chars. + +--MS_Mac_OE_3071477847_720252_MIME_Part-- + diff --git a/lib-python/2.2/email/test/data/msg_16.txt b/lib-python/2.2/email/test/data/msg_16.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_16.txt @@ -0,0 +1,123 @@ +Return-Path: <> +Delivered-To: scr-admin at socal-raves.org +Received: from cougar.noc.ucla.edu (cougar.noc.ucla.edu [169.232.10.18]) + by babylon.socal-raves.org (Postfix) with ESMTP id CCC2C51B84 + for ; Sun, 23 Sep 2001 20:13:54 -0700 (PDT) +Received: from sims-ms-daemon by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8Y at cougar.noc.ucla.edu> for scr-admin at socal-raves.org; Sun, + 23 Sep 2001 20:14:35 -0700 (PDT) +Received: from cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8X at cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +Date: Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +From: Internet Mail Delivery +Subject: Delivery Notification: Delivery has failed +To: scr-admin at socal-raves.org +Message-id: <0GK500B04D0B8X at cougar.noc.ucla.edu> +MIME-version: 1.0 +Sender: scr-owner at socal-raves.org +Errors-To: scr-owner at socal-raves.org +X-BeenThere: scr at socal-raves.org +X-Mailman-Version: 2.1a3 +Precedence: bulk +List-Help: +List-Post: +List-Subscribe: , + +List-Id: SoCal-Raves +List-Unsubscribe: , + +List-Archive: +Content-Type: multipart/report; boundary="Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)" + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: text/plain; charset=ISO-8859-1 + +This report relates to a message you sent with the following header fields: + + Message-id: <002001c144a6$8752e060$56104586 at oxy.edu> + Date: Sun, 23 Sep 2001 20:10:55 -0700 + From: "Ian T. Henry" + To: SoCal Raves + Subject: [scr] yeah for Ians!! + +Your message cannot be delivered to the following recipients: + + Recipient address: jangel1 at cougar.noc.ucla.edu + Reason: recipient reached disk quota + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: message/DELIVERY-STATUS + +Original-envelope-id: 0GK500B4HD0888 at cougar.noc.ucla.edu +Reporting-MTA: dns; cougar.noc.ucla.edu + +Action: failed +Status: 5.0.0 (recipient reached disk quota) +Original-recipient: rfc822;jangel1 at cougar.noc.ucla.edu +Final-recipient: rfc822;jangel1 at cougar.noc.ucla.edu + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: MESSAGE/RFC822 + +Return-path: scr-admin at socal-raves.org +Received: from sims-ms-daemon by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8X at cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +Received: from panther.noc.ucla.edu by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + with ESMTP id <0GK500B4GD0888 at cougar.noc.ucla.edu> for jangel1 at sims-ms-daemon; + Sun, 23 Sep 2001 20:14:33 -0700 (PDT) +Received: from babylon.socal-raves.org + (ip-209-85-222-117.dreamhost.com [209.85.222.117]) + by panther.noc.ucla.edu (8.9.1a/8.9.1) with ESMTP id UAA09793 for + ; Sun, 23 Sep 2001 20:14:32 -0700 (PDT) +Received: from babylon (localhost [127.0.0.1]) by babylon.socal-raves.org + (Postfix) with ESMTP id D3B2951B70; Sun, 23 Sep 2001 20:13:47 -0700 (PDT) +Received: by babylon.socal-raves.org (Postfix, from userid 60001) + id A611F51B82; Sun, 23 Sep 2001 20:13:46 -0700 (PDT) +Received: from tiger.cc.oxy.edu (tiger.cc.oxy.edu [134.69.3.112]) + by babylon.socal-raves.org (Postfix) with ESMTP id ADA7351B70 for + ; Sun, 23 Sep 2001 20:13:44 -0700 (PDT) +Received: from ent (n16h86.dhcp.oxy.edu [134.69.16.86]) + by tiger.cc.oxy.edu (8.8.8/8.8.8) with SMTP id UAA08100 for + ; Sun, 23 Sep 2001 20:14:24 -0700 (PDT) +Date: Sun, 23 Sep 2001 20:10:55 -0700 +From: "Ian T. Henry" +Subject: [scr] yeah for Ians!! +Sender: scr-admin at socal-raves.org +To: SoCal Raves +Errors-to: scr-admin at socal-raves.org +Message-id: <002001c144a6$8752e060$56104586 at oxy.edu> +MIME-version: 1.0 +X-Mailer: Microsoft Outlook Express 5.50.4522.1200 +Content-type: text/plain; charset=us-ascii +Precedence: bulk +Delivered-to: scr-post at babylon.socal-raves.org +Delivered-to: scr at socal-raves.org +X-Converted-To-Plain-Text: from multipart/alternative by demime 0.98e +X-Converted-To-Plain-Text: Alternative section used was text/plain +X-BeenThere: scr at socal-raves.org +X-Mailman-Version: 2.1a3 +List-Help: +List-Post: +List-Subscribe: , + +List-Id: SoCal-Raves +List-Unsubscribe: , + +List-Archive: + +I always love to find more Ian's that are over 3 years old!! + +Ian +_______________________________________________ +For event info, list questions, or to unsubscribe, see http://www.socal-raves.org/ + + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)-- + diff --git a/lib-python/2.2/email/test/data/msg_17.txt b/lib-python/2.2/email/test/data/msg_17.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_17.txt @@ -0,0 +1,12 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +Hi there, + +This is the dingus fish. + +[Non-text (image/gif) part of message omitted, filename dingusfish.gif] diff --git a/lib-python/2.2/email/test/data/msg_18.txt b/lib-python/2.2/email/test/data/msg_18.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_18.txt @@ -0,0 +1,6 @@ +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Foobar-Spoink-Defrobnit: wasnipoop; giraffes="very-long-necked-animals"; + spooge="yummy"; hippos="gargantuan"; marshmallows="gooey" + diff --git a/lib-python/2.2/email/test/data/msg_19.txt b/lib-python/2.2/email/test/data/msg_19.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_19.txt @@ -0,0 +1,43 @@ +Send Ppp mailing list submissions to + ppp at zzz.org + +To subscribe or unsubscribe via the World Wide Web, visit + http://www.zzz.org/mailman/listinfo/ppp +or, via email, send a message with subject or body 'help' to + ppp-request at zzz.org + +You can reach the person managing the list at + ppp-admin at zzz.org + +When replying, please edit your Subject line so it is more specific +than "Re: Contents of Ppp digest..." + +Today's Topics: + + 1. testing #1 (Barry A. Warsaw) + 2. testing #2 (Barry A. Warsaw) + 3. testing #3 (Barry A. Warsaw) + 4. testing #4 (Barry A. Warsaw) + 5. testing #5 (Barry A. Warsaw) + +hello + + +hello + + +hello + + +hello + + +hello + + + +_______________________________________________ +Ppp mailing list +Ppp at zzz.org +http://www.zzz.org/mailman/listinfo/ppp + diff --git a/lib-python/2.2/email/test/data/msg_20.txt b/lib-python/2.2/email/test/data/msg_20.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_20.txt @@ -0,0 +1,22 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Cc: ccc at zzz.org +CC: ddd at zzz.org +cc: eee at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/email/test/data/msg_21.txt b/lib-python/2.2/email/test/data/msg_21.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_21.txt @@ -0,0 +1,20 @@ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: Test +Content-Type: multipart/mixed; boundary="BOUNDARY" + +MIME message +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +One +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +Two +--BOUNDARY-- +End of MIME message diff --git a/lib-python/2.2/email/test/data/msg_22.txt b/lib-python/2.2/email/test/data/msg_22.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_22.txt @@ -0,0 +1,46 @@ +Mime-Version: 1.0 +Message-Id: +Date: Tue, 16 Oct 2001 13:59:25 +0300 +To: a at example.com +From: b at example.com +Content-Type: multipart/mixed; boundary="============_-1208892523==_============" + +--============_-1208892523==_============ +Content-Type: text/plain; charset="us-ascii" ; format="flowed" + +Text text text. +--============_-1208892523==_============ +Content-Id: +Content-Type: image/jpeg; name="wibble.JPG" + ; x-mac-type="4A504547" + ; x-mac-creator="474B4F4E" +Content-Disposition: attachment; filename="wibble.JPG" +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABIEBAREA +g6bCjjw/pIZSjO6FWFpldjySOmCNrO7DBZibUXhTwtCixw+GtAijVdqxxaPp0aKvmGXa +qrbBQvms0mAMeYS/3iTV1dG0hHaRNK01XblnWxtVdjkHLMIgTyqnk9VB7CrP2KzIINpa +4O7I+zxYO9WV8jZg71Zlb+8rMDkEirAVQFAUAKAFAAAUAYAUDgADgY6DjpRtXj5RxjHA +4wQRj0wQCMdCAewpaKKK/9k= +--============_-1208892523==_============ +Content-Id: +Content-Type: image/jpeg; name="wibble2.JPG" + ; x-mac-type="4A504547" + ; x-mac-creator="474B4F4E" +Content-Disposition: attachment; filename="wibble2.JPG" +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABJ0BAREA +/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +W6NFJJBEkU10kKGTcWMDwxuU+0JHvk8qAtOpNwqSR0n8c3BlDyXHlqsUltHEiTvdXLxR +7vMiGDNJAJWkAMk8ZkCFp5G2oo5W++INrbQtNfTQxJAuXlupz9oS4d5Y1W+E2XlWZJJE +Y7LWYQxTLE1zuMbfBPxw8X2fibVdIbSbI6nLZxX635t9TjtYreWR7WGKJTLJFFKSlozO +0ShxIXM43uC3/9k= +--============_-1208892523==_============ +Content-Type: text/plain; charset="us-ascii" ; format="flowed" + +Text text text. +--============_-1208892523==_============-- + diff --git a/lib-python/2.2/email/test/data/msg_23.txt b/lib-python/2.2/email/test/data/msg_23.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_23.txt @@ -0,0 +1,8 @@ +From: aperson at dom.ain +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain + +A message part +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_24.txt b/lib-python/2.2/email/test/data/msg_24.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_24.txt @@ -0,0 +1,10 @@ +Content-Type: multipart/mixed; boundary="BOUNDARY" +MIME-Version: 1.0 +Subject: A subject +To: aperson at dom.ain +From: bperson at dom.ain + +--BOUNDARY + + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_25.txt b/lib-python/2.2/email/test/data/msg_25.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_25.txt @@ -0,0 +1,117 @@ +From MAILER-DAEMON Fri Apr 06 16:46:09 2001 +Received: from [204.245.199.98] (helo=zinfandel.lacita.com) + by www.linux.org.uk with esmtp (Exim 3.13 #1) + id 14lYR6-0008Iv-00 + for linuxuser-admin at www.linux.org.uk; Fri, 06 Apr 2001 16:46:09 +0100 +Received: from localhost (localhost) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with internal id JAB03225; Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800) +Date: Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800) +From: Mail Delivery Subsystem +Subject: Returned mail: Too many hops 19 (17 max): from via [199.164.235.226], to +Message-Id: <200104061723.JAB03225 at zinfandel.lacita.com> +To: +To: postmaster at zinfandel.lacita.com +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + bo +Auto-Submitted: auto-generated (failure) + +This is a MIME-encapsulated message + +--JAB03225.986577786/zinfandel.lacita.com + +The original message was received at Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800) +from [199.164.235.226] + + ----- The following addresses have delivery notifications ----- + (unrecoverable error) + + ----- Transcript of session follows ----- +554 Too many hops 19 (17 max): from via [199.164.235.226], to + +--JAB03225.986577786/zinfandel.lacita.com +Content-Type: message/delivery-status + +Reporting-MTA: dns; zinfandel.lacita.com +Received-From-MTA: dns; [199.164.235.226] +Arrival-Date: Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800) + +Final-Recipient: rfc822; scoffman at wellpartner.com +Action: failed +Status: 5.4.6 +Last-Attempt-Date: Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800) + +--JAB03225.986577786/zinfandel.lacita.com +Content-Type: text/rfc822-headers + +Return-Path: linuxuser-admin at www.linux.org.uk +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03225 for ; Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03221 for ; Fri, 6 Apr 2001 09:22:18 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03217 for ; Fri, 6 Apr 2001 09:21:37 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03213 for ; Fri, 6 Apr 2001 09:20:56 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03209 for ; Fri, 6 Apr 2001 09:20:15 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03205 for ; Fri, 6 Apr 2001 09:19:33 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03201 for ; Fri, 6 Apr 2001 09:18:52 -0800 (GMT-0800) +Received: from zinfandel.lacita.com ([204.245.199.98]) + by + fo +Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03197 for ; Fri, 6 Apr 2001 09:17:54 -0800 (GMT-0800) +Received: from www.linux.org.uk (parcelfarce.linux.theplanet.co.uk [195.92.249.252]) + by + fo +Received: from localhost.localdomain + ([ + by + id +Received: from [212.1.130.11] (helo=s1.uklinux.net ident=root) + by + id + fo +Received: from server (ppp-2-22.cvx4.telinco.net [212.1.149.22]) + by + fo +From: Daniel James +Organization: LinuxUser +To: linuxuser at www.linux.org.uk +X-Mailer: KMail [version 1.1.99] +Content-Type: text/plain; + c +MIME-Version: 1.0 +Message-Id: <01040616033903.00962 at server> +Content-Transfer-Encoding: 8bit +Subject: [LinuxUser] bulletin no. 45 +Sender: linuxuser-admin at www.linux.org.uk +Errors-To: linuxuser-admin at www.linux.org.uk +X-BeenThere: linuxuser at www.linux.org.uk +X-Mailman-Version: 2.0.3 +Precedence: bulk +List-Help: +List-Post: +List-Subscribe: , + +List-Unsubscribe: , + +Date: Fri, 6 Apr 2001 16:03:39 +0100 + +--JAB03225.986577786/zinfandel.lacita.com-- + + diff --git a/lib-python/2.2/email/test/data/msg_26.txt b/lib-python/2.2/email/test/data/msg_26.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_26.txt @@ -0,0 +1,45 @@ +Received: from xcar [192.168.0.2] by jeeves.wooster.local + (SMTPD32-7.07 EVAL) id AFF92F0214; Sun, 12 May 2002 08:55:37 +0100 +Date: Sun, 12 May 2002 08:56:15 +0100 +From: Father Time +To: timbo at jeeves.wooster.local +Subject: IMAP file test +Message-ID: <6df65d354b.father.time at rpc.wooster.local> +X-Organization: Home +User-Agent: Messenger-Pro/2.50a (MsgServe/1.50) (RISC-OS/4.02) POPstar/2.03 +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="1618492860--2051301190--113853680" +Status: R +X-UIDL: 319998302 + +This message is in MIME format which your mailer apparently does not support. +You either require a newer version of your software which supports MIME, or +a separate MIME decoding utility. Alternatively, ask the sender of this +message to resend it in a different format. + +--1618492860--2051301190--113853680 +Content-Type: text/plain; charset=us-ascii + +Simple email with attachment. + + +--1618492860--2051301190--113853680 +Content-Type: application/riscos; name="clock.bmp,69c"; type=BMP; load=&fff69c4b; exec=&355dd4d1; access=&03 +Content-Disposition: attachment; filename="clock.bmp" +Content-Transfer-Encoding: base64 + +Qk12AgAAAAAAAHYAAAAoAAAAIAAAACAAAAABAAQAAAAAAAAAAADXDQAA1w0AAAAAAAAA +AAAAAAAAAAAAiAAAiAAAAIiIAIgAAACIAIgAiIgAALu7uwCIiIgAERHdACLuIgAz//8A +zAAAAN0R3QDu7iIA////AAAAAAAAAAAAAAAAAAAAAAAAAAi3AAAAAAAAADeAAAAAAAAA +C3ADMzMzMANwAAAAAAAAAAAHMAAAAANwAAAAAAAAAACAMAd3zPfwAwgAAAAAAAAIAwd/ +f8x/f3AwgAAAAAAAgDB0x/f3//zPAwgAAAAAAAcHfM9////8z/AwAAAAAAiwd/f3//// +////A4AAAAAAcEx/f///////zAMAAAAAiwfM9////3///8zwOAAAAAcHf3////B///// +8DAAAAALB/f3///wd3d3//AwAAAABwTPf//wCQAAD/zAMAAAAAsEx/f///B////8wDAA +AAAHB39////wf/////AwAAAACwf39///8H/////wMAAAAIcHfM9///B////M8DgAAAAA +sHTH///wf///xAMAAAAACHB3f3//8H////cDgAAAAAALB3zH//D//M9wMAAAAAAAgLB0 +z39///xHAwgAAAAAAAgLB3d3RHd3cDCAAAAAAAAAgLAHd0R3cAMIAAAAAAAAgAgLcAAA +AAMwgAgAAAAACDAAAAu7t7cwAAgDgAAAAABzcIAAAAAAAAgDMwAAAAAAN7uwgAAAAAgH +MzMAAAAACH97tzAAAAALu3c3gAAAAAAL+7tzDABAu7f7cAAAAAAACA+3MA7EQAv/sIAA +AAAAAAAIAAAAAAAAAIAAAAAA + +--1618492860--2051301190--113853680-- diff --git a/lib-python/2.2/email/test/data/msg_27.txt b/lib-python/2.2/email/test/data/msg_27.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_27.txt @@ -0,0 +1,15 @@ +Return-Path: +Received: by mail.dom.ain (Postfix, from userid 889) + id B9D0AD35DB; Tue, 4 Jun 2002 21:46:59 -0400 (EDT) +Message-ID: <15613.28051.707126.569693 at dom.ain> +Date: Tue, 4 Jun 2002 21:46:59 -0400 +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Subject: bug demonstration + 12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 + more text +From: aperson at dom.ain (Anne P. Erson) +To: bperson at dom.ain (Barney P. Erson) + +test diff --git a/lib-python/2.2/email/test/data/msg_28.txt b/lib-python/2.2/email/test/data/msg_28.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_28.txt @@ -0,0 +1,25 @@ +From: aperson at dom.ain +MIME-Version: 1.0 +Content-Type: multipart/digest; boundary=BOUNDARY + +--BOUNDARY +Content-Type: message/rfc822 + +Content-Type: text/plain; charset=us-ascii +To: aa at bb.org +From: cc at dd.org +Subject: ee + +message 1 + +--BOUNDARY +Content-Type: message/rfc822 + +Content-Type: text/plain; charset=us-ascii +To: aa at bb.org +From: cc at dd.org +Subject: ee + +message 2 + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_29.txt b/lib-python/2.2/email/test/data/msg_29.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_29.txt @@ -0,0 +1,22 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; + title*0*="us-ascii'en'This%20is%20even%20more%20"; + title*1*="%2A%2A%2Afun%2A%2A%2A%20"; + title*2="isn't it!" +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/email/test/data/msg_30.txt b/lib-python/2.2/email/test/data/msg_30.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_30.txt @@ -0,0 +1,23 @@ +From: aperson at dom.ain +MIME-Version: 1.0 +Content-Type: multipart/digest; boundary=BOUNDARY + +--BOUNDARY + +Content-Type: text/plain; charset=us-ascii +To: aa at bb.org +From: cc at dd.org +Subject: ee + +message 1 + +--BOUNDARY + +Content-Type: text/plain; charset=us-ascii +To: aa at bb.org +From: cc at dd.org +Subject: ee + +message 2 + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_31.txt b/lib-python/2.2/email/test/data/msg_31.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_31.txt @@ -0,0 +1,15 @@ +From: aperson at dom.ain +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary=BOUNDARY_ + +--BOUNDARY +Content-Type: text/plain + +message 1 + +--BOUNDARY +Content-Type: text/plain + +message 2 + +--BOUNDARY-- diff --git a/lib-python/2.2/email/test/data/msg_32.txt b/lib-python/2.2/email/test/data/msg_32.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_32.txt @@ -0,0 +1,14 @@ +Delivered-To: freebsd-isp at freebsd.org +Date: Tue, 26 Sep 2000 12:23:03 -0500 +From: Anne Person +To: Barney Dude +Subject: Re: Limiting Perl CPU Utilization... +Mime-Version: 1.0 +Content-Type: text/plain; charset*=ansi-x3.4-1968''us-ascii +Content-Disposition: inline +User-Agent: Mutt/1.3.8i +Sender: owner-freebsd-isp at FreeBSD.ORG +Precedence: bulk +X-Loop: FreeBSD.org + +Some message. diff --git a/lib-python/2.2/email/test/data/msg_33.txt b/lib-python/2.2/email/test/data/msg_33.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_33.txt @@ -0,0 +1,29 @@ +Delivered-To: freebsd-isp at freebsd.org +Date: Wed, 27 Sep 2000 11:11:09 -0500 +From: Anne Person +To: Barney Dude +Subject: Re: Limiting Perl CPU Utilization... +Mime-Version: 1.0 +Content-Type: multipart/signed; micalg*=ansi-x3.4-1968''pgp-md5; + protocol*=ansi-x3.4-1968''application%2Fpgp-signature; + boundary*="ansi-x3.4-1968''EeQfGwPcQSOJBaQU" +Content-Disposition: inline +Sender: owner-freebsd-isp at FreeBSD.ORG +Precedence: bulk +X-Loop: FreeBSD.org + + +--EeQfGwPcQSOJBaQU +Content-Type: text/plain; charset*=ansi-x3.4-1968''us-ascii +Content-Disposition: inline +Content-Transfer-Encoding: quoted-printable + +part 1 + +--EeQfGwPcQSOJBaQU +Content-Type: text/plain +Content-Disposition: inline + +part 2 + +--EeQfGwPcQSOJBaQU-- diff --git a/lib-python/2.2/email/test/data/msg_34.txt b/lib-python/2.2/email/test/data/msg_34.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_34.txt @@ -0,0 +1,19 @@ +From: aperson at dom.ain +To: bperson at dom.ain +Content-Type: multipart/digest; boundary=XYZ + +--XYZ +Content-Type: text/plain + + +This is a text plain part that is counter to recommended practice in +RFC 2046, $5.1.5, but is not illegal + +--XYZ + +From: cperson at dom.ain +To: dperson at dom.ain + +A submessage + +--XYZ-- diff --git a/lib-python/2.2/email/test/data/msg_35.txt b/lib-python/2.2/email/test/data/msg_35.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/data/msg_35.txt @@ -0,0 +1,4 @@ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: here's something interesting +counter to RFC 2822, there's no separating newline here diff --git a/lib-python/2.2/email/test/test_email.py b/lib-python/2.2/email/test/test_email.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/test_email.py @@ -0,0 +1,2718 @@ +# Copyright (C) 2001,2002,2003 Python Software Foundation +# email package unit tests + +import os +import sys +import time +import base64 +import difflib +import unittest +import warnings +from cStringIO import StringIO +from types import StringType, ListType + +import email + +from email.Charset import Charset +from email.Header import Header, decode_header, make_header +from email.Parser import Parser, HeaderParser +from email.Generator import Generator, DecodedGenerator +from email.Message import Message +from email.MIMEAudio import MIMEAudio +from email.MIMEText import MIMEText +from email.MIMEImage import MIMEImage +from email.MIMEBase import MIMEBase +from email.MIMEMessage import MIMEMessage +from email.MIMEMultipart import MIMEMultipart +from email import Utils +from email import Errors +from email import Encoders +from email import Iterators +from email import base64MIME +from email import quopriMIME + +from test.test_support import findfile, run_unittest +from email.test import __file__ as landmark + + +NL = '\n' +EMPTYSTRING = '' +SPACE = ' ' + +# We don't care about DeprecationWarnings +warnings.filterwarnings('ignore', '', DeprecationWarning, __name__) + +try: + True, False +except NameError: + True = 1 + False = 0 + + + +def openfile(filename, mode='r'): + path = os.path.join(os.path.dirname(landmark), 'data', filename) + return open(path, mode) + + + +# Base test class +class TestEmailBase(unittest.TestCase): + if hasattr(difflib, 'ndiff'): + # Python 2.2 and beyond + def ndiffAssertEqual(self, first, second): + """Like failUnlessEqual except use ndiff for readable output.""" + if first <> second: + sfirst = str(first) + ssecond = str(second) + diff = difflib.ndiff(sfirst.splitlines(), ssecond.splitlines()) + fp = StringIO() + print >> fp, NL, NL.join(diff) + raise self.failureException, fp.getvalue() + else: + # Python 2.1 + ndiffAssertEqual = unittest.TestCase.assertEqual + + def _msgobj(self, filename, strict=False): + fp = openfile(findfile(filename)) + try: + msg = email.message_from_file(fp, strict=strict) + finally: + fp.close() + return msg + + + +# Test various aspects of the Message class's API +class TestMessageAPI(TestEmailBase): + def test_get_all(self): + eq = self.assertEqual + msg = self._msgobj('msg_20.txt') + eq(msg.get_all('cc'), ['ccc at zzz.org', 'ddd at zzz.org', 'eee at zzz.org']) + eq(msg.get_all('xx', 'n/a'), 'n/a') + + def test_getset_charset(self): + eq = self.assertEqual + msg = Message() + eq(msg.get_charset(), None) + charset = Charset('iso-8859-1') + msg.set_charset(charset) + eq(msg['mime-version'], '1.0') + eq(msg.get_type(), 'text/plain') + eq(msg['content-type'], 'text/plain; charset="iso-8859-1"') + eq(msg.get_param('charset'), 'iso-8859-1') + eq(msg['content-transfer-encoding'], 'quoted-printable') + eq(msg.get_charset().input_charset, 'iso-8859-1') + # Remove the charset + msg.set_charset(None) + eq(msg.get_charset(), None) + eq(msg['content-type'], 'text/plain') + # Try adding a charset when there's already MIME headers present + msg = Message() + msg['MIME-Version'] = '2.0' + msg['Content-Type'] = 'text/x-weird' + msg['Content-Transfer-Encoding'] = 'quinted-puntable' + msg.set_charset(charset) + eq(msg['mime-version'], '2.0') + eq(msg['content-type'], 'text/x-weird; charset="iso-8859-1"') + eq(msg['content-transfer-encoding'], 'quinted-puntable') + + def test_set_charset_from_string(self): + eq = self.assertEqual + msg = Message() + msg.set_charset('us-ascii') + eq(msg.get_charset().input_charset, 'us-ascii') + eq(msg['content-type'], 'text/plain; charset="us-ascii"') + + def test_set_payload_with_charset(self): + msg = Message() + charset = Charset('iso-8859-1') + msg.set_payload('This is a string payload', charset) + self.assertEqual(msg.get_charset().input_charset, 'iso-8859-1') + + def test_get_charsets(self): + eq = self.assertEqual + + msg = self._msgobj('msg_08.txt') + charsets = msg.get_charsets() + eq(charsets, [None, 'us-ascii', 'iso-8859-1', 'iso-8859-2', 'koi8-r']) + + msg = self._msgobj('msg_09.txt') + charsets = msg.get_charsets('dingbat') + eq(charsets, ['dingbat', 'us-ascii', 'iso-8859-1', 'dingbat', + 'koi8-r']) + + msg = self._msgobj('msg_12.txt') + charsets = msg.get_charsets() + eq(charsets, [None, 'us-ascii', 'iso-8859-1', None, 'iso-8859-2', + 'iso-8859-3', 'us-ascii', 'koi8-r']) + + def test_get_filename(self): + eq = self.assertEqual + + msg = self._msgobj('msg_04.txt') + filenames = [p.get_filename() for p in msg.get_payload()] + eq(filenames, ['msg.txt', 'msg.txt']) + + msg = self._msgobj('msg_07.txt') + subpart = msg.get_payload(1) + eq(subpart.get_filename(), 'dingusfish.gif') + + def test_get_boundary(self): + eq = self.assertEqual + msg = self._msgobj('msg_07.txt') + # No quotes! + eq(msg.get_boundary(), 'BOUNDARY') + + def test_set_boundary(self): + eq = self.assertEqual + # This one has no existing boundary parameter, but the Content-Type: + # header appears fifth. + msg = self._msgobj('msg_01.txt') + msg.set_boundary('BOUNDARY') + header, value = msg.items()[4] + eq(header.lower(), 'content-type') + eq(value, 'text/plain; charset="us-ascii"; boundary="BOUNDARY"') + # This one has a Content-Type: header, with a boundary, stuck in the + # middle of its headers. Make sure the order is preserved; it should + # be fifth. + msg = self._msgobj('msg_04.txt') + msg.set_boundary('BOUNDARY') + header, value = msg.items()[4] + eq(header.lower(), 'content-type') + eq(value, 'multipart/mixed; boundary="BOUNDARY"') + # And this one has no Content-Type: header at all. + msg = self._msgobj('msg_03.txt') + self.assertRaises(Errors.HeaderParseError, + msg.set_boundary, 'BOUNDARY') + + def test_get_decoded_payload(self): + eq = self.assertEqual + msg = self._msgobj('msg_10.txt') + # The outer message is a multipart + eq(msg.get_payload(decode=True), None) + # Subpart 1 is 7bit encoded + eq(msg.get_payload(0).get_payload(decode=True), + 'This is a 7bit encoded message.\n') + # Subpart 2 is quopri + eq(msg.get_payload(1).get_payload(decode=True), + '\xa1This is a Quoted Printable encoded message!\n') + # Subpart 3 is base64 + eq(msg.get_payload(2).get_payload(decode=True), + 'This is a Base64 encoded message.') + # Subpart 4 has no Content-Transfer-Encoding: header. + eq(msg.get_payload(3).get_payload(decode=True), + 'This has no Content-Transfer-Encoding: header.\n') + + def test_get_decoded_uu_payload(self): + eq = self.assertEqual + msg = Message() + msg.set_payload('begin 666 -\n+:&5L;&\\@=V]R;&0 \n \nend\n') + for cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): + msg['content-transfer-encoding'] = cte + eq(msg.get_payload(decode=True), 'hello world') + # Now try some bogus data + msg.set_payload('foo') + eq(msg.get_payload(decode=True), 'foo') + + def test_decoded_generator(self): + eq = self.assertEqual + msg = self._msgobj('msg_07.txt') + fp = openfile('msg_17.txt') + try: + text = fp.read() + finally: + fp.close() + s = StringIO() + g = DecodedGenerator(s) + g.flatten(msg) + eq(s.getvalue(), text) + + def test__contains__(self): + msg = Message() + msg['From'] = 'Me' + msg['to'] = 'You' + # Check for case insensitivity + self.failUnless('from' in msg) + self.failUnless('From' in msg) + self.failUnless('FROM' in msg) + self.failUnless('to' in msg) + self.failUnless('To' in msg) + self.failUnless('TO' in msg) + + def test_as_string(self): + eq = self.assertEqual + msg = self._msgobj('msg_01.txt') + fp = openfile('msg_01.txt') + try: + text = fp.read() + finally: + fp.close() + eq(text, msg.as_string()) + fullrepr = str(msg) + lines = fullrepr.split('\n') + self.failUnless(lines[0].startswith('From ')) + eq(text, NL.join(lines[1:])) + + def test_bad_param(self): + msg = email.message_from_string("Content-Type: blarg; baz; boo\n") + self.assertEqual(msg.get_param('baz'), '') + + def test_missing_filename(self): + msg = email.message_from_string("From: foo\n") + self.assertEqual(msg.get_filename(), None) + + def test_bogus_filename(self): + msg = email.message_from_string( + "Content-Disposition: blarg; filename\n") + self.assertEqual(msg.get_filename(), '') + + def test_missing_boundary(self): + msg = email.message_from_string("From: foo\n") + self.assertEqual(msg.get_boundary(), None) + + def test_get_params(self): + eq = self.assertEqual + msg = email.message_from_string( + 'X-Header: foo=one; bar=two; baz=three\n') + eq(msg.get_params(header='x-header'), + [('foo', 'one'), ('bar', 'two'), ('baz', 'three')]) + msg = email.message_from_string( + 'X-Header: foo; bar=one; baz=two\n') + eq(msg.get_params(header='x-header'), + [('foo', ''), ('bar', 'one'), ('baz', 'two')]) + eq(msg.get_params(), None) + msg = email.message_from_string( + 'X-Header: foo; bar="one"; baz=two\n') + eq(msg.get_params(header='x-header'), + [('foo', ''), ('bar', 'one'), ('baz', 'two')]) + + def test_get_param_liberal(self): + msg = Message() + msg['Content-Type'] = 'Content-Type: Multipart/mixed; boundary = "CPIMSSMTPC06p5f3tG"' + self.assertEqual(msg.get_param('boundary'), 'CPIMSSMTPC06p5f3tG') + + def test_get_param(self): + eq = self.assertEqual + msg = email.message_from_string( + "X-Header: foo=one; bar=two; baz=three\n") + eq(msg.get_param('bar', header='x-header'), 'two') + eq(msg.get_param('quuz', header='x-header'), None) + eq(msg.get_param('quuz'), None) + msg = email.message_from_string( + 'X-Header: foo; bar="one"; baz=two\n') + eq(msg.get_param('foo', header='x-header'), '') + eq(msg.get_param('bar', header='x-header'), 'one') + eq(msg.get_param('baz', header='x-header'), 'two') + # XXX: We are not RFC-2045 compliant! We cannot parse: + # msg["Content-Type"] = 'text/plain; weird="hey; dolly? [you] @ <\\"home\\">?"' + # msg.get_param("weird") + # yet. + + def test_get_param_funky_continuation_lines(self): + msg = self._msgobj('msg_22.txt') + self.assertEqual(msg.get_payload(1).get_param('name'), 'wibble.JPG') + + def test_get_param_with_semis_in_quotes(self): + msg = email.message_from_string( + 'Content-Type: image/pjpeg; name="Jim&&Jill"\n') + self.assertEqual(msg.get_param('name'), 'Jim&&Jill') + self.assertEqual(msg.get_param('name', unquote=False), + '"Jim&&Jill"') + + def test_has_key(self): + msg = email.message_from_string('Header: exists') + self.failUnless(msg.has_key('header')) + self.failUnless(msg.has_key('Header')) + self.failUnless(msg.has_key('HEADER')) + self.failIf(msg.has_key('headeri')) + + def test_set_param(self): + eq = self.assertEqual + msg = Message() + msg.set_param('charset', 'iso-2022-jp') + eq(msg.get_param('charset'), 'iso-2022-jp') + msg.set_param('importance', 'high value') + eq(msg.get_param('importance'), 'high value') + eq(msg.get_param('importance', unquote=False), '"high value"') + eq(msg.get_params(), [('text/plain', ''), + ('charset', 'iso-2022-jp'), + ('importance', 'high value')]) + eq(msg.get_params(unquote=False), [('text/plain', ''), + ('charset', '"iso-2022-jp"'), + ('importance', '"high value"')]) + msg.set_param('charset', 'iso-9999-xx', header='X-Jimmy') + eq(msg.get_param('charset', header='X-Jimmy'), 'iso-9999-xx') + + def test_del_param(self): + eq = self.assertEqual + msg = self._msgobj('msg_05.txt') + eq(msg.get_params(), + [('multipart/report', ''), ('report-type', 'delivery-status'), + ('boundary', 'D1690A7AC1.996856090/mail.example.com')]) + old_val = msg.get_param("report-type") + msg.del_param("report-type") + eq(msg.get_params(), + [('multipart/report', ''), + ('boundary', 'D1690A7AC1.996856090/mail.example.com')]) + msg.set_param("report-type", old_val) + eq(msg.get_params(), + [('multipart/report', ''), + ('boundary', 'D1690A7AC1.996856090/mail.example.com'), + ('report-type', old_val)]) + + def test_set_type(self): + eq = self.assertEqual + msg = Message() + self.assertRaises(ValueError, msg.set_type, 'text') + msg.set_type('text/plain') + eq(msg['content-type'], 'text/plain') + msg.set_param('charset', 'us-ascii') + eq(msg['content-type'], 'text/plain; charset="us-ascii"') + msg.set_type('text/html') + eq(msg['content-type'], 'text/html; charset="us-ascii"') + + def test_get_content_type_missing(self): + msg = Message() + self.assertEqual(msg.get_content_type(), 'text/plain') + + def test_get_content_type_missing_with_default_type(self): + msg = Message() + msg.set_default_type('message/rfc822') + self.assertEqual(msg.get_content_type(), 'message/rfc822') + + def test_get_content_type_from_message_implicit(self): + msg = self._msgobj('msg_30.txt') + self.assertEqual(msg.get_payload(0).get_content_type(), + 'message/rfc822') + + def test_get_content_type_from_message_explicit(self): + msg = self._msgobj('msg_28.txt') + self.assertEqual(msg.get_payload(0).get_content_type(), + 'message/rfc822') + + def test_get_content_type_from_message_text_plain_implicit(self): + msg = self._msgobj('msg_03.txt') + self.assertEqual(msg.get_content_type(), 'text/plain') + + def test_get_content_type_from_message_text_plain_explicit(self): + msg = self._msgobj('msg_01.txt') + self.assertEqual(msg.get_content_type(), 'text/plain') + + def test_get_content_maintype_missing(self): + msg = Message() + self.assertEqual(msg.get_content_maintype(), 'text') + + def test_get_content_maintype_missing_with_default_type(self): + msg = Message() + msg.set_default_type('message/rfc822') + self.assertEqual(msg.get_content_maintype(), 'message') + + def test_get_content_maintype_from_message_implicit(self): + msg = self._msgobj('msg_30.txt') + self.assertEqual(msg.get_payload(0).get_content_maintype(), 'message') + + def test_get_content_maintype_from_message_explicit(self): + msg = self._msgobj('msg_28.txt') + self.assertEqual(msg.get_payload(0).get_content_maintype(), 'message') + + def test_get_content_maintype_from_message_text_plain_implicit(self): + msg = self._msgobj('msg_03.txt') + self.assertEqual(msg.get_content_maintype(), 'text') + + def test_get_content_maintype_from_message_text_plain_explicit(self): + msg = self._msgobj('msg_01.txt') + self.assertEqual(msg.get_content_maintype(), 'text') + + def test_get_content_subtype_missing(self): + msg = Message() + self.assertEqual(msg.get_content_subtype(), 'plain') + + def test_get_content_subtype_missing_with_default_type(self): + msg = Message() + msg.set_default_type('message/rfc822') + self.assertEqual(msg.get_content_subtype(), 'rfc822') + + def test_get_content_subtype_from_message_implicit(self): + msg = self._msgobj('msg_30.txt') + self.assertEqual(msg.get_payload(0).get_content_subtype(), 'rfc822') + + def test_get_content_subtype_from_message_explicit(self): + msg = self._msgobj('msg_28.txt') + self.assertEqual(msg.get_payload(0).get_content_subtype(), 'rfc822') + + def test_get_content_subtype_from_message_text_plain_implicit(self): + msg = self._msgobj('msg_03.txt') + self.assertEqual(msg.get_content_subtype(), 'plain') + + def test_get_content_subtype_from_message_text_plain_explicit(self): + msg = self._msgobj('msg_01.txt') + self.assertEqual(msg.get_content_subtype(), 'plain') + + def test_get_content_maintype_error(self): + msg = Message() + msg['Content-Type'] = 'no-slash-in-this-string' + self.assertEqual(msg.get_content_maintype(), 'text') + + def test_get_content_subtype_error(self): + msg = Message() + msg['Content-Type'] = 'no-slash-in-this-string' + self.assertEqual(msg.get_content_subtype(), 'plain') + + def test_replace_header(self): + eq = self.assertEqual + msg = Message() + msg.add_header('First', 'One') + msg.add_header('Second', 'Two') + msg.add_header('Third', 'Three') + eq(msg.keys(), ['First', 'Second', 'Third']) + eq(msg.values(), ['One', 'Two', 'Three']) + msg.replace_header('Second', 'Twenty') + eq(msg.keys(), ['First', 'Second', 'Third']) + eq(msg.values(), ['One', 'Twenty', 'Three']) + msg.add_header('First', 'Eleven') + msg.replace_header('First', 'One Hundred') + eq(msg.keys(), ['First', 'Second', 'Third', 'First']) + eq(msg.values(), ['One Hundred', 'Twenty', 'Three', 'Eleven']) + self.assertRaises(KeyError, msg.replace_header, 'Fourth', 'Missing') + + def test_broken_base64_payload(self): + x = 'AwDp0P7//y6LwKEAcPa/6Q=9' + msg = Message() + msg['content-type'] = 'audio/x-midi' + msg['content-transfer-encoding'] = 'base64' + msg.set_payload(x) + self.assertEqual(msg.get_payload(decode=True), x) + + + +# Test the email.Encoders module +class TestEncoders(unittest.TestCase): + def test_encode_noop(self): + eq = self.assertEqual + msg = MIMEText('hello world', _encoder=Encoders.encode_noop) + eq(msg.get_payload(), 'hello world') + + def test_encode_7bit(self): + eq = self.assertEqual + msg = MIMEText('hello world', _encoder=Encoders.encode_7or8bit) + eq(msg.get_payload(), 'hello world') + eq(msg['content-transfer-encoding'], '7bit') + msg = MIMEText('hello \x7f world', _encoder=Encoders.encode_7or8bit) + eq(msg.get_payload(), 'hello \x7f world') + eq(msg['content-transfer-encoding'], '7bit') + + def test_encode_8bit(self): + eq = self.assertEqual + msg = MIMEText('hello \x80 world', _encoder=Encoders.encode_7or8bit) + eq(msg.get_payload(), 'hello \x80 world') + eq(msg['content-transfer-encoding'], '8bit') + + def test_encode_empty_payload(self): + eq = self.assertEqual + msg = Message() + msg.set_charset('us-ascii') + eq(msg['content-transfer-encoding'], '7bit') + + def test_encode_base64(self): + eq = self.assertEqual + msg = MIMEText('hello world', _encoder=Encoders.encode_base64) + eq(msg.get_payload(), 'aGVsbG8gd29ybGQ=') + eq(msg['content-transfer-encoding'], 'base64') + + def test_encode_quoted_printable(self): + eq = self.assertEqual + msg = MIMEText('hello world', _encoder=Encoders.encode_quopri) + eq(msg.get_payload(), 'hello=20world') + eq(msg['content-transfer-encoding'], 'quoted-printable') + + def test_default_cte(self): + eq = self.assertEqual + msg = MIMEText('hello world') + eq(msg['content-transfer-encoding'], '7bit') + + def test_default_cte(self): + eq = self.assertEqual + # With no explicit _charset its us-ascii, and all are 7-bit + msg = MIMEText('hello world') + eq(msg['content-transfer-encoding'], '7bit') + # Similar, but with 8-bit data + msg = MIMEText('hello \xf8 world') + eq(msg['content-transfer-encoding'], '8bit') + # And now with a different charset + msg = MIMEText('hello \xf8 world', _charset='iso-8859-1') + eq(msg['content-transfer-encoding'], 'quoted-printable') + + + +# Test long header wrapping +class TestLongHeaders(TestEmailBase): + def test_split_long_continuation(self): + eq = self.ndiffAssertEqual + msg = email.message_from_string("""\ +Subject: bug demonstration +\t12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 +\tmore text + +test +""") + sfp = StringIO() + g = Generator(sfp) + g.flatten(msg) + eq(sfp.getvalue(), """\ +Subject: bug demonstration +\t12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 +\tmore text + +test +""") + + def test_another_long_almost_unsplittable_header(self): + eq = self.ndiffAssertEqual + hstr = """\ +bug demonstration +\t12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 +\tmore text""" + h = Header(hstr, continuation_ws='\t') + eq(h.encode(), """\ +bug demonstration +\t12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 +\tmore text""") + h = Header(hstr) + eq(h.encode(), """\ +bug demonstration + 12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789 + more text""") + + def test_long_nonstring(self): + eq = self.ndiffAssertEqual + g = Charset("iso-8859-1") + cz = Charset("iso-8859-2") + utf8 = Charset("utf-8") + g_head = "Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an s\xfcdl\xfcndischen Wandgem\xe4lden vorbei, gegen die rotierenden Klingen bef\xf6rdert. " + cz_head = "Finan\xe8ni metropole se hroutily pod tlakem jejich d\xf9vtipu.. " + utf8_head = u"\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00\u90e8\u306f\u30c9\u30a4\u30c4\u8a9e\u3067\u3059\u304c\u3001\u3042\u3068\u306f\u3067\u305f\u3089\u3081\u3067\u3059\u3002\u5b9f\u969b\u306b\u306f\u300cWenn ist das Nunstuck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput.\u300d\u3068\u8a00\u3063\u3066\u3044\u307e\u3059\u3002".encode("utf-8") + h = Header(g_head, g, header_name='Subject') + h.append(cz_head, cz) + h.append(utf8_head, utf8) + msg = Message() + msg['Subject'] = h + sfp = StringIO() + g = Generator(sfp) + g.flatten(msg) + eq(sfp.getvalue(), """\ +Subject: =?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerd?= + =?iso-8859-1?q?erband_komfortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndi?= + =?iso-8859-1?q?schen_Wandgem=E4lden_vorbei=2C_gegen_die_rotierenden_Kling?= + =?iso-8859-1?q?en_bef=F6rdert=2E_?= =?iso-8859-2?q?Finan=E8ni_met?= + =?iso-8859-2?q?ropole_se_hroutily_pod_tlakem_jejich_d=F9vtipu=2E=2E_?= + =?utf-8?b?5q2j56K644Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE?= + =?utf-8?b?44G+44Gb44KT44CC5LiA6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB?= + =?utf-8?b?44GC44Go44Gv44Gn44Gf44KJ44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CM?= + =?utf-8?q?Wenn_ist_das_Nunstuck_git_und_Slotermeyer=3F_Ja!_Beiherhund_das?= + =?utf-8?b?IE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0LuOAjeOBqOiogOOBow==?= + =?utf-8?b?44Gm44GE44G+44GZ44CC?= + +""") + eq(h.encode(), """\ +=?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerd?= + =?iso-8859-1?q?erband_komfortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndi?= + =?iso-8859-1?q?schen_Wandgem=E4lden_vorbei=2C_gegen_die_rotierenden_Kling?= + =?iso-8859-1?q?en_bef=F6rdert=2E_?= =?iso-8859-2?q?Finan=E8ni_met?= + =?iso-8859-2?q?ropole_se_hroutily_pod_tlakem_jejich_d=F9vtipu=2E=2E_?= + =?utf-8?b?5q2j56K644Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE?= + =?utf-8?b?44G+44Gb44KT44CC5LiA6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB?= + =?utf-8?b?44GC44Go44Gv44Gn44Gf44KJ44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CM?= + =?utf-8?q?Wenn_ist_das_Nunstuck_git_und_Slotermeyer=3F_Ja!_Beiherhund_das?= + =?utf-8?b?IE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0LuOAjeOBqOiogOOBow==?= + =?utf-8?b?44Gm44GE44G+44GZ44CC?=""") + + def test_long_header_encode(self): + eq = self.ndiffAssertEqual + h = Header('wasnipoop; giraffes="very-long-necked-animals"; ' + 'spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"', + header_name='X-Foobar-Spoink-Defrobnit') + eq(h.encode(), '''\ +wasnipoop; giraffes="very-long-necked-animals"; + spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"''') + + def test_long_header_encode_with_tab_continuation(self): + eq = self.ndiffAssertEqual + h = Header('wasnipoop; giraffes="very-long-necked-animals"; ' + 'spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"', + header_name='X-Foobar-Spoink-Defrobnit', + continuation_ws='\t') + eq(h.encode(), '''\ +wasnipoop; giraffes="very-long-necked-animals"; +\tspooge="yummy"; hippos="gargantuan"; marshmallows="gooey"''') + + def test_header_splitter(self): + eq = self.ndiffAssertEqual + msg = MIMEText('') + # It'd be great if we could use add_header() here, but that doesn't + # guarantee an order of the parameters. + msg['X-Foobar-Spoink-Defrobnit'] = ( + 'wasnipoop; giraffes="very-long-necked-animals"; ' + 'spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"') + sfp = StringIO() + g = Generator(sfp) + g.flatten(msg) + eq(sfp.getvalue(), '''\ +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Foobar-Spoink-Defrobnit: wasnipoop; giraffes="very-long-necked-animals"; +\tspooge="yummy"; hippos="gargantuan"; marshmallows="gooey" + +''') + + def test_no_semis_header_splitter(self): + eq = self.ndiffAssertEqual + msg = Message() + msg['From'] = 'test at dom.ain' + msg['References'] = SPACE.join(['<%d at dom.ain>' % i for i in range(10)]) + msg.set_payload('Test') + sfp = StringIO() + g = Generator(sfp) + g.flatten(msg) + eq(sfp.getvalue(), """\ +From: test at dom.ain +References: <0 at dom.ain> <1 at dom.ain> <2 at dom.ain> <3 at dom.ain> <4 at dom.ain> +\t<5 at dom.ain> <6 at dom.ain> <7 at dom.ain> <8 at dom.ain> <9 at dom.ain> + +Test""") + + def test_no_split_long_header(self): + eq = self.ndiffAssertEqual + hstr = 'References: ' + 'x' * 80 + h = Header(hstr, continuation_ws='\t') + eq(h.encode(), """\ +References: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""") + + def test_splitting_multiple_long_lines(self): + eq = self.ndiffAssertEqual + hstr = """\ +from babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for ; Sat, 2 Feb 2002 17:00:06 -0800 (PST) +\tfrom babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for ; Sat, 2 Feb 2002 17:00:06 -0800 (PST) +\tfrom babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for ; Sat, 2 Feb 2002 17:00:06 -0800 (PST) +""" + h = Header(hstr, continuation_ws='\t') + eq(h.encode(), """\ +from babylon.socal-raves.org (localhost [127.0.0.1]); +\tby babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; +\tfor ; +\tSat, 2 Feb 2002 17:00:06 -0800 (PST) +\tfrom babylon.socal-raves.org (localhost [127.0.0.1]); +\tby babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; +\tfor ; +\tSat, 2 Feb 2002 17:00:06 -0800 (PST) +\tfrom babylon.socal-raves.org (localhost [127.0.0.1]); +\tby babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; +\tfor ; +\tSat, 2 Feb 2002 17:00:06 -0800 (PST)""") + + def test_splitting_first_line_only_is_long(self): + eq = self.ndiffAssertEqual + hstr = """\ +from modemcable093.139-201-24.que.mc.videotron.ca ([24.201.139.93] helo=cthulhu.gerg.ca) +\tby kronos.mems-exchange.org with esmtp (Exim 4.05) +\tid 17k4h5-00034i-00 +\tfor test at mems-exchange.org; Wed, 28 Aug 2002 11:25:20 -0400""" + h = Header(hstr, maxlinelen=78, header_name='Received', + continuation_ws='\t') + eq(h.encode(), """\ +from modemcable093.139-201-24.que.mc.videotron.ca ([24.201.139.93] +\thelo=cthulhu.gerg.ca) +\tby kronos.mems-exchange.org with esmtp (Exim 4.05) +\tid 17k4h5-00034i-00 +\tfor test at mems-exchange.org; Wed, 28 Aug 2002 11:25:20 -0400""") + + def test_long_8bit_header(self): + eq = self.ndiffAssertEqual + msg = Message() + h = Header('Britische Regierung gibt', 'iso-8859-1', + header_name='Subject') + h.append('gr\xfcnes Licht f\xfcr Offshore-Windkraftprojekte') + msg['Subject'] = h + eq(msg.as_string(), """\ +Subject: =?iso-8859-1?q?Britische_Regierung_gibt?= =?iso-8859-1?q?gr=FCnes?= + =?iso-8859-1?q?_Licht_f=FCr_Offshore-Windkraftprojekte?= + +""") + + def test_long_8bit_header_no_charset(self): + eq = self.ndiffAssertEqual + msg = Message() + msg['Reply-To'] = 'Britische Regierung gibt gr\xfcnes Licht f\xfcr Offshore-Windkraftprojekte ' + eq(msg.as_string(), """\ +Reply-To: Britische Regierung gibt gr\xfcnes Licht f\xfcr Offshore-Windkraftprojekte + +""") + + def test_long_to_header(self): + eq = self.ndiffAssertEqual + to = '"Someone Test #A" ,,"Someone Test #B" , "Someone Test #C" , "Someone Test #D" ' + msg = Message() + msg['To'] = to + eq(msg.as_string(0), '''\ +To: "Someone Test #A" , , +\t"Someone Test #B" , +\t"Someone Test #C" , +\t"Someone Test #D" + +''') + + def test_long_line_after_append(self): + eq = self.ndiffAssertEqual + s = 'This is an example of string which has almost the limit of header length.' + h = Header(s) + h.append('Add another line.') + eq(h.encode(), """\ +This is an example of string which has almost the limit of header length. + Add another line.""") + + def test_shorter_line_with_append(self): + eq = self.ndiffAssertEqual + s = 'This is a shorter line.' + h = Header(s) + h.append('Add another sentence. (Surprise?)') + eq(h.encode(), + 'This is a shorter line. Add another sentence. (Surprise?)') + + def test_long_field_name(self): + eq = self.ndiffAssertEqual + fn = 'X-Very-Very-Very-Long-Header-Name' + gs = "Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an s\xfcdl\xfcndischen Wandgem\xe4lden vorbei, gegen die rotierenden Klingen bef\xf6rdert. " + h = Header(gs, 'iso-8859-1', header_name=fn) + # BAW: this seems broken because the first line is too long + eq(h.encode(), """\ +=?iso-8859-1?q?Die_Mieter_treten_hier_?= + =?iso-8859-1?q?ein_werden_mit_einem_Foerderband_komfortabel_den_Korridor_?= + =?iso-8859-1?q?entlang=2C_an_s=FCdl=FCndischen_Wandgem=E4lden_vorbei=2C_g?= + =?iso-8859-1?q?egen_die_rotierenden_Klingen_bef=F6rdert=2E_?=""") + + def test_long_received_header(self): + h = 'from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by hrothgar.la.mastaler.com (tmda-ofmipd) with ESMTP; Wed, 05 Mar 2003 18:10:18 -0700' + msg = Message() + msg['Received-1'] = Header(h, continuation_ws='\t') + msg['Received-2'] = h + self.assertEqual(msg.as_string(), """\ +Received-1: from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by +\throthgar.la.mastaler.com (tmda-ofmipd) with ESMTP; +\tWed, 05 Mar 2003 18:10:18 -0700 +Received-2: from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by +\throthgar.la.mastaler.com (tmda-ofmipd) with ESMTP; +\tWed, 05 Mar 2003 18:10:18 -0700 + +""") + + def test_string_headerinst_eq(self): + h = '<15975.17901.207240.414604 at sgigritzmann1.mathematik.tu-muenchen.de> (David Bremner\'s message of "Thu, 6 Mar 2003 13:58:21 +0100")' + msg = Message() + msg['Received-1'] = Header(h, header_name='Received-1', + continuation_ws='\t') + msg['Received-2'] = h + self.assertEqual(msg.as_string(), """\ +Received-1: <15975.17901.207240.414604 at sgigritzmann1.mathematik.tu-muenchen.de> +\t(David Bremner's message of "Thu, 6 Mar 2003 13:58:21 +0100") +Received-2: <15975.17901.207240.414604 at sgigritzmann1.mathematik.tu-muenchen.de> +\t(David Bremner's message of "Thu, 6 Mar 2003 13:58:21 +0100") + +""") + + def test_long_unbreakable_lines_with_continuation(self): + eq = self.ndiffAssertEqual + msg = Message() + t = """\ + iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9 + locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp""" + msg['Face-1'] = t + msg['Face-2'] = Header(t, header_name='Face-2') + eq(msg.as_string(), """\ +Face-1: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9 +\tlocQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp +Face-2: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9 + locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp + +""") + + def test_another_long_multiline_header(self): + eq = self.ndiffAssertEqual + m = '''\ +Received: from siimage.com ([172.25.1.3]) by zima.siliconimage.com with Microsoft SMTPSVC(5.0.2195.4905); +\tWed, 16 Oct 2002 07:41:11 -0700''' + msg = email.message_from_string(m) + eq(msg.as_string(), '''\ +Received: from siimage.com ([172.25.1.3]) by zima.siliconimage.com with +\tMicrosoft SMTPSVC(5.0.2195.4905); Wed, 16 Oct 2002 07:41:11 -0700 + +''') + + def test_long_lines_with_different_header(self): + eq = self.ndiffAssertEqual + h = """\ +List-Unsubscribe: , + """ + msg = Message() + msg['List'] = h + msg['List'] = Header(h, header_name='List') + eq(msg.as_string(), """\ +List: List-Unsubscribe: , +\t +List: List-Unsubscribe: , + + +""") + + + +# Test mangling of "From " lines in the body of a message +class TestFromMangling(unittest.TestCase): + def setUp(self): + self.msg = Message() + self.msg['From'] = 'aaa at bbb.org' + self.msg.set_payload("""\ +From the desk of A.A.A.: +Blah blah blah +""") + + def test_mangled_from(self): + s = StringIO() + g = Generator(s, mangle_from_=True) + g.flatten(self.msg) + self.assertEqual(s.getvalue(), """\ +From: aaa at bbb.org + +>From the desk of A.A.A.: +Blah blah blah +""") + + def test_dont_mangle_from(self): + s = StringIO() + g = Generator(s, mangle_from_=False) + g.flatten(self.msg) + self.assertEqual(s.getvalue(), """\ +From: aaa at bbb.org + +From the desk of A.A.A.: +Blah blah blah +""") + + + +# Test the basic MIMEAudio class +class TestMIMEAudio(unittest.TestCase): + def setUp(self): + # Make sure we pick up the audiotest.au that lives in email/test/data. + # In Python, there's an audiotest.au living in Lib/test but that isn't + # included in some binary distros that don't include the test + # package. The trailing empty string on the .join() is significant + # since findfile() will do a dirname(). + datadir = os.path.join(os.path.dirname(landmark), 'data', '') + fp = open(findfile('audiotest.au', datadir), 'rb') + try: + self._audiodata = fp.read() + finally: + fp.close() + self._au = MIMEAudio(self._audiodata) + + def test_guess_minor_type(self): + self.assertEqual(self._au.get_type(), 'audio/basic') + + def test_encoding(self): + payload = self._au.get_payload() + self.assertEqual(base64.decodestring(payload), self._audiodata) + + def checkSetMinor(self): + au = MIMEAudio(self._audiodata, 'fish') + self.assertEqual(im.get_type(), 'audio/fish') + + def test_custom_encoder(self): + eq = self.assertEqual + def encoder(msg): + orig = msg.get_payload() + msg.set_payload(0) + msg['Content-Transfer-Encoding'] = 'broken64' + au = MIMEAudio(self._audiodata, _encoder=encoder) + eq(au.get_payload(), 0) + eq(au['content-transfer-encoding'], 'broken64') + + def test_add_header(self): + eq = self.assertEqual + unless = self.failUnless + self._au.add_header('Content-Disposition', 'attachment', + filename='audiotest.au') + eq(self._au['content-disposition'], + 'attachment; filename="audiotest.au"') + eq(self._au.get_params(header='content-disposition'), + [('attachment', ''), ('filename', 'audiotest.au')]) + eq(self._au.get_param('filename', header='content-disposition'), + 'audiotest.au') + missing = [] + eq(self._au.get_param('attachment', header='content-disposition'), '') + unless(self._au.get_param('foo', failobj=missing, + header='content-disposition') is missing) + # Try some missing stuff + unless(self._au.get_param('foobar', missing) is missing) + unless(self._au.get_param('attachment', missing, + header='foobar') is missing) + + + +# Test the basic MIMEImage class +class TestMIMEImage(unittest.TestCase): + def setUp(self): + fp = openfile('PyBanner048.gif') + try: + self._imgdata = fp.read() + finally: + fp.close() + self._im = MIMEImage(self._imgdata) + + def test_guess_minor_type(self): + self.assertEqual(self._im.get_type(), 'image/gif') + + def test_encoding(self): + payload = self._im.get_payload() + self.assertEqual(base64.decodestring(payload), self._imgdata) + + def checkSetMinor(self): + im = MIMEImage(self._imgdata, 'fish') + self.assertEqual(im.get_type(), 'image/fish') + + def test_custom_encoder(self): + eq = self.assertEqual + def encoder(msg): + orig = msg.get_payload() + msg.set_payload(0) + msg['Content-Transfer-Encoding'] = 'broken64' + im = MIMEImage(self._imgdata, _encoder=encoder) + eq(im.get_payload(), 0) + eq(im['content-transfer-encoding'], 'broken64') + + def test_add_header(self): + eq = self.assertEqual + unless = self.failUnless + self._im.add_header('Content-Disposition', 'attachment', + filename='dingusfish.gif') + eq(self._im['content-disposition'], + 'attachment; filename="dingusfish.gif"') + eq(self._im.get_params(header='content-disposition'), + [('attachment', ''), ('filename', 'dingusfish.gif')]) + eq(self._im.get_param('filename', header='content-disposition'), + 'dingusfish.gif') + missing = [] + eq(self._im.get_param('attachment', header='content-disposition'), '') + unless(self._im.get_param('foo', failobj=missing, + header='content-disposition') is missing) + # Try some missing stuff + unless(self._im.get_param('foobar', missing) is missing) + unless(self._im.get_param('attachment', missing, + header='foobar') is missing) + + + +# Test the basic MIMEText class +class TestMIMEText(unittest.TestCase): + def setUp(self): + self._msg = MIMEText('hello there') + + def test_types(self): + eq = self.assertEqual + unless = self.failUnless + eq(self._msg.get_type(), 'text/plain') + eq(self._msg.get_param('charset'), 'us-ascii') + missing = [] + unless(self._msg.get_param('foobar', missing) is missing) + unless(self._msg.get_param('charset', missing, header='foobar') + is missing) + + def test_payload(self): + self.assertEqual(self._msg.get_payload(), 'hello there') + self.failUnless(not self._msg.is_multipart()) + + def test_charset(self): + eq = self.assertEqual + msg = MIMEText('hello there', _charset='us-ascii') + eq(msg.get_charset().input_charset, 'us-ascii') + eq(msg['content-type'], 'text/plain; charset="us-ascii"') + + + +# Test a more complicated multipart/mixed type message +class TestMultipartMixed(TestEmailBase): + def setUp(self): + fp = openfile('PyBanner048.gif') + try: + data = fp.read() + finally: + fp.close() + + container = MIMEBase('multipart', 'mixed', boundary='BOUNDARY') + image = MIMEImage(data, name='dingusfish.gif') + image.add_header('content-disposition', 'attachment', + filename='dingusfish.gif') + intro = MIMEText('''\ +Hi there, + +This is the dingus fish. +''') + container.attach(intro) + container.attach(image) + container['From'] = 'Barry ' + container['To'] = 'Dingus Lovers ' + container['Subject'] = 'Here is your dingus fish' + + now = 987809702.54848599 + timetuple = time.localtime(now) + if timetuple[-1] == 0: + tzsecs = time.timezone + else: + tzsecs = time.altzone + if tzsecs > 0: + sign = '-' + else: + sign = '+' + tzoffset = ' %s%04d' % (sign, tzsecs / 36) + container['Date'] = time.strftime( + '%a, %d %b %Y %H:%M:%S', + time.localtime(now)) + tzoffset + self._msg = container + self._im = image + self._txt = intro + + def test_hierarchy(self): + # convenience + eq = self.assertEqual + unless = self.failUnless + raises = self.assertRaises + # tests + m = self._msg + unless(m.is_multipart()) + eq(m.get_type(), 'multipart/mixed') + eq(len(m.get_payload()), 2) + raises(IndexError, m.get_payload, 2) + m0 = m.get_payload(0) + m1 = m.get_payload(1) + unless(m0 is self._txt) + unless(m1 is self._im) + eq(m.get_payload(), [m0, m1]) + unless(not m0.is_multipart()) + unless(not m1.is_multipart()) + + def test_no_parts_in_a_multipart(self): + outer = MIMEBase('multipart', 'mixed') + outer['Subject'] = 'A subject' + outer['To'] = 'aperson at dom.ain' + outer['From'] = 'bperson at dom.ain' + outer.preamble = '' + outer.epilogue = '' + outer.set_boundary('BOUNDARY') + msg = MIMEText('hello world') + self.assertEqual(outer.as_string(), '''\ +Content-Type: multipart/mixed; boundary="BOUNDARY" +MIME-Version: 1.0 +Subject: A subject +To: aperson at dom.ain +From: bperson at dom.ain + +--BOUNDARY + + +--BOUNDARY-- +''') + + def test_one_part_in_a_multipart(self): + eq = self.ndiffAssertEqual + outer = MIMEBase('multipart', 'mixed') + outer['Subject'] = 'A subject' + outer['To'] = 'aperson at dom.ain' + outer['From'] = 'bperson at dom.ain' + outer.preamble = '' + outer.epilogue = '' + outer.set_boundary('BOUNDARY') + msg = MIMEText('hello world') + outer.attach(msg) + eq(outer.as_string(), '''\ +Content-Type: multipart/mixed; boundary="BOUNDARY" +MIME-Version: 1.0 +Subject: A subject +To: aperson at dom.ain +From: bperson at dom.ain + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +hello world +--BOUNDARY-- +''') + + def test_seq_parts_in_a_multipart(self): + eq = self.ndiffAssertEqual + outer = MIMEBase('multipart', 'mixed') + outer['Subject'] = 'A subject' + outer['To'] = 'aperson at dom.ain' + outer['From'] = 'bperson at dom.ain' + outer.preamble = '' + outer.epilogue = '' + msg = MIMEText('hello world') + outer.attach(msg) + outer.set_boundary('BOUNDARY') + eq(outer.as_string(), '''\ +Content-Type: multipart/mixed; boundary="BOUNDARY" +MIME-Version: 1.0 +Subject: A subject +To: aperson at dom.ain +From: bperson at dom.ain + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +hello world +--BOUNDARY-- +''') + + + +# Test some badly formatted messages +class TestNonConformant(TestEmailBase): + def test_parse_missing_minor_type(self): + eq = self.assertEqual + msg = self._msgobj('msg_14.txt') + eq(msg.get_type(), 'text') + eq(msg.get_main_type(), None) + eq(msg.get_subtype(), None) + + def test_bogus_boundary(self): + fp = openfile(findfile('msg_15.txt')) + try: + data = fp.read() + finally: + fp.close() + p = Parser(strict=True) + # Note, under a future non-strict parsing mode, this would parse the + # message into the intended message tree. + self.assertRaises(Errors.BoundaryError, p.parsestr, data) + + def test_multipart_no_boundary(self): + fp = openfile(findfile('msg_25.txt')) + try: + self.assertRaises(Errors.BoundaryError, + email.message_from_file, fp) + finally: + fp.close() + + def test_invalid_content_type(self): + eq = self.assertEqual + neq = self.ndiffAssertEqual + msg = Message() + # RFC 2045, $5.2 says invalid yields text/plain + msg['Content-Type'] = 'text' + eq(msg.get_content_maintype(), 'text') + eq(msg.get_content_subtype(), 'plain') + eq(msg.get_content_type(), 'text/plain') + # Clear the old value and try something /really/ invalid + del msg['content-type'] + msg['Content-Type'] = 'foo' + eq(msg.get_content_maintype(), 'text') + eq(msg.get_content_subtype(), 'plain') + eq(msg.get_content_type(), 'text/plain') + # Still, make sure that the message is idempotently generated + s = StringIO() + g = Generator(s) + g.flatten(msg) + neq(s.getvalue(), 'Content-Type: foo\n\n') + + def test_no_start_boundary(self): + eq = self.ndiffAssertEqual + msg = self._msgobj('msg_31.txt') + eq(msg.get_payload(), """\ +--BOUNDARY +Content-Type: text/plain + +message 1 + +--BOUNDARY +Content-Type: text/plain + +message 2 + +--BOUNDARY-- +""") + + def test_no_separating_blank_line(self): + eq = self.ndiffAssertEqual + msg = self._msgobj('msg_35.txt') + eq(msg.as_string(), """\ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: here's something interesting + +counter to RFC 2822, there's no separating newline here +""") + # strict=True should raise an exception + self.assertRaises(Errors.HeaderParseError, + self._msgobj, 'msg_35.txt', True) + + + +# Test RFC 2047 header encoding and decoding +class TestRFC2047(unittest.TestCase): + def test_iso_8859_1(self): + eq = self.assertEqual + s = '=?iso-8859-1?q?this=20is=20some=20text?=' + eq(Utils.decode(s), 'this is some text') + s = '=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?=' + eq(Utils.decode(s), u'Keld J\xf8rn Simonsen') + s = '=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=' \ + '=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=' + eq(Utils.decode(s), 'If you can read this you understand the example.') + s = '=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=' + eq(Utils.decode(s), + u'\u05dd\u05d5\u05dc\u05e9 \u05df\u05d1 \u05d9\u05dc\u05d8\u05e4\u05e0') + s = '=?iso-8859-1?q?this=20is?= =?iso-8859-1?q?some=20text?=' + eq(Utils.decode(s), u'this issome text') + s = '=?iso-8859-1?q?this=20is_?= =?iso-8859-1?q?some=20text?=' + eq(Utils.decode(s), u'this is some text') + + def test_encode_header(self): + eq = self.assertEqual + s = 'this is some text' + eq(Utils.encode(s), '=?iso-8859-1?q?this=20is=20some=20text?=') + s = 'Keld_J\xf8rn_Simonsen' + eq(Utils.encode(s), '=?iso-8859-1?q?Keld_J=F8rn_Simonsen?=') + s1 = 'If you can read this yo' + s2 = 'u understand the example.' + eq(Utils.encode(s1, encoding='b'), + '=?iso-8859-1?b?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=') + eq(Utils.encode(s2, charset='iso-8859-2', encoding='b'), + '=?iso-8859-2?b?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=') + + def test_rfc2047_multiline(self): + eq = self.assertEqual + s = """Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz + foo bar =?mac-iceland?q?r=8Aksm=9Arg=8Cs?=""" + dh = decode_header(s) + eq(dh, [ + ('Re:', None), + ('r\x8aksm\x9arg\x8cs', 'mac-iceland'), + ('baz foo bar', None), + ('r\x8aksm\x9arg\x8cs', 'mac-iceland')]) + eq(str(make_header(dh)), + """Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar + =?mac-iceland?q?r=8Aksm=9Arg=8Cs?=""") + + def test_whitespace_eater_unicode(self): + eq = self.assertEqual + s = '=?ISO-8859-1?Q?Andr=E9?= Pirard ' + dh = decode_header(s) + eq(dh, [('Andr\xe9', 'iso-8859-1'), ('Pirard ', None)]) + # Python 2.1's unicode() builtin doesn't call the object's + # __unicode__() method. Use the following alternative instead. + #hu = unicode(make_header(dh)).encode('latin-1') + hu = make_header(dh).__unicode__().encode('latin-1') + eq(hu, 'Andr\xe9 Pirard ') + + + +# Test the MIMEMessage class +class TestMIMEMessage(TestEmailBase): + def setUp(self): + fp = openfile('msg_11.txt') + try: + self._text = fp.read() + finally: + fp.close() + + def test_type_error(self): + self.assertRaises(TypeError, MIMEMessage, 'a plain string') + + def test_valid_argument(self): + eq = self.assertEqual + unless = self.failUnless + subject = 'A sub-message' + m = Message() + m['Subject'] = subject + r = MIMEMessage(m) + eq(r.get_type(), 'message/rfc822') + payload = r.get_payload() + unless(type(payload), ListType) + eq(len(payload), 1) + subpart = payload[0] + unless(subpart is m) + eq(subpart['subject'], subject) + + def test_bad_multipart(self): + eq = self.assertEqual + msg1 = Message() + msg1['Subject'] = 'subpart 1' + msg2 = Message() + msg2['Subject'] = 'subpart 2' + r = MIMEMessage(msg1) + self.assertRaises(Errors.MultipartConversionError, r.attach, msg2) + + def test_generate(self): + # First craft the message to be encapsulated + m = Message() + m['Subject'] = 'An enclosed message' + m.set_payload('Here is the body of the message.\n') + r = MIMEMessage(m) + r['Subject'] = 'The enclosing message' + s = StringIO() + g = Generator(s) + g.flatten(r) + self.assertEqual(s.getvalue(), """\ +Content-Type: message/rfc822 +MIME-Version: 1.0 +Subject: The enclosing message + +Subject: An enclosed message + +Here is the body of the message. +""") + + def test_parse_message_rfc822(self): + eq = self.assertEqual + unless = self.failUnless + msg = self._msgobj('msg_11.txt') + eq(msg.get_type(), 'message/rfc822') + payload = msg.get_payload() + unless(isinstance(payload, ListType)) + eq(len(payload), 1) + submsg = payload[0] + self.failUnless(isinstance(submsg, Message)) + eq(submsg['subject'], 'An enclosed message') + eq(submsg.get_payload(), 'Here is the body of the message.\n') + + def test_dsn(self): + eq = self.assertEqual + unless = self.failUnless + # msg 16 is a Delivery Status Notification, see RFC 1894 + msg = self._msgobj('msg_16.txt') + eq(msg.get_type(), 'multipart/report') + unless(msg.is_multipart()) + eq(len(msg.get_payload()), 3) + # Subpart 1 is a text/plain, human readable section + subpart = msg.get_payload(0) + eq(subpart.get_type(), 'text/plain') + eq(subpart.get_payload(), """\ +This report relates to a message you sent with the following header fields: + + Message-id: <002001c144a6$8752e060$56104586 at oxy.edu> + Date: Sun, 23 Sep 2001 20:10:55 -0700 + From: "Ian T. Henry" + To: SoCal Raves + Subject: [scr] yeah for Ians!! + +Your message cannot be delivered to the following recipients: + + Recipient address: jangel1 at cougar.noc.ucla.edu + Reason: recipient reached disk quota + +""") + # Subpart 2 contains the machine parsable DSN information. It + # consists of two blocks of headers, represented by two nested Message + # objects. + subpart = msg.get_payload(1) + eq(subpart.get_type(), 'message/delivery-status') + eq(len(subpart.get_payload()), 2) + # message/delivery-status should treat each block as a bunch of + # headers, i.e. a bunch of Message objects. + dsn1 = subpart.get_payload(0) + unless(isinstance(dsn1, Message)) + eq(dsn1['original-envelope-id'], '0GK500B4HD0888 at cougar.noc.ucla.edu') + eq(dsn1.get_param('dns', header='reporting-mta'), '') + # Try a missing one + eq(dsn1.get_param('nsd', header='reporting-mta'), None) + dsn2 = subpart.get_payload(1) + unless(isinstance(dsn2, Message)) + eq(dsn2['action'], 'failed') + eq(dsn2.get_params(header='original-recipient'), + [('rfc822', ''), ('jangel1 at cougar.noc.ucla.edu', '')]) + eq(dsn2.get_param('rfc822', header='final-recipient'), '') + # Subpart 3 is the original message + subpart = msg.get_payload(2) + eq(subpart.get_type(), 'message/rfc822') + payload = subpart.get_payload() + unless(isinstance(payload, ListType)) + eq(len(payload), 1) + subsubpart = payload[0] + unless(isinstance(subsubpart, Message)) + eq(subsubpart.get_type(), 'text/plain') + eq(subsubpart['message-id'], + '<002001c144a6$8752e060$56104586 at oxy.edu>') + + def test_epilogue(self): + eq = self.ndiffAssertEqual + fp = openfile('msg_21.txt') + try: + text = fp.read() + finally: + fp.close() + msg = Message() + msg['From'] = 'aperson at dom.ain' + msg['To'] = 'bperson at dom.ain' + msg['Subject'] = 'Test' + msg.preamble = 'MIME message\n' + msg.epilogue = 'End of MIME message\n' + msg1 = MIMEText('One') + msg2 = MIMEText('Two') + msg.add_header('Content-Type', 'multipart/mixed', boundary='BOUNDARY') + msg.attach(msg1) + msg.attach(msg2) + sfp = StringIO() + g = Generator(sfp) + g.flatten(msg) + eq(sfp.getvalue(), text) + + def test_no_nl_preamble(self): + eq = self.ndiffAssertEqual + msg = Message() + msg['From'] = 'aperson at dom.ain' + msg['To'] = 'bperson at dom.ain' + msg['Subject'] = 'Test' + msg.preamble = 'MIME message' + msg.epilogue = '' + msg1 = MIMEText('One') + msg2 = MIMEText('Two') + msg.add_header('Content-Type', 'multipart/mixed', boundary='BOUNDARY') + msg.attach(msg1) + msg.attach(msg2) + eq(msg.as_string(), """\ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: Test +Content-Type: multipart/mixed; boundary="BOUNDARY" + +MIME message +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +One +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +Two +--BOUNDARY-- +""") + + def test_default_type(self): + eq = self.assertEqual + fp = openfile('msg_30.txt') + try: + msg = email.message_from_file(fp) + finally: + fp.close() + container1 = msg.get_payload(0) + eq(container1.get_default_type(), 'message/rfc822') + eq(container1.get_type(), None) + container2 = msg.get_payload(1) + eq(container2.get_default_type(), 'message/rfc822') + eq(container2.get_type(), None) + container1a = container1.get_payload(0) + eq(container1a.get_default_type(), 'text/plain') + eq(container1a.get_type(), 'text/plain') + container2a = container2.get_payload(0) + eq(container2a.get_default_type(), 'text/plain') + eq(container2a.get_type(), 'text/plain') + + def test_default_type_with_explicit_container_type(self): + eq = self.assertEqual + fp = openfile('msg_28.txt') + try: + msg = email.message_from_file(fp) + finally: + fp.close() + container1 = msg.get_payload(0) + eq(container1.get_default_type(), 'message/rfc822') + eq(container1.get_type(), 'message/rfc822') + container2 = msg.get_payload(1) + eq(container2.get_default_type(), 'message/rfc822') + eq(container2.get_type(), 'message/rfc822') + container1a = container1.get_payload(0) + eq(container1a.get_default_type(), 'text/plain') + eq(container1a.get_type(), 'text/plain') + container2a = container2.get_payload(0) + eq(container2a.get_default_type(), 'text/plain') + eq(container2a.get_type(), 'text/plain') + + def test_default_type_non_parsed(self): + eq = self.assertEqual + neq = self.ndiffAssertEqual + # Set up container + container = MIMEMultipart('digest', 'BOUNDARY') + container.epilogue = '\n' + # Set up subparts + subpart1a = MIMEText('message 1\n') + subpart2a = MIMEText('message 2\n') + subpart1 = MIMEMessage(subpart1a) + subpart2 = MIMEMessage(subpart2a) + container.attach(subpart1) + container.attach(subpart2) + eq(subpart1.get_type(), 'message/rfc822') + eq(subpart1.get_default_type(), 'message/rfc822') + eq(subpart2.get_type(), 'message/rfc822') + eq(subpart2.get_default_type(), 'message/rfc822') + neq(container.as_string(0), '''\ +Content-Type: multipart/digest; boundary="BOUNDARY" +MIME-Version: 1.0 + +--BOUNDARY +Content-Type: message/rfc822 +MIME-Version: 1.0 + +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +message 1 + +--BOUNDARY +Content-Type: message/rfc822 +MIME-Version: 1.0 + +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +message 2 + +--BOUNDARY-- +''') + del subpart1['content-type'] + del subpart1['mime-version'] + del subpart2['content-type'] + del subpart2['mime-version'] + eq(subpart1.get_type(), None) + eq(subpart1.get_default_type(), 'message/rfc822') + eq(subpart2.get_type(), None) + eq(subpart2.get_default_type(), 'message/rfc822') + neq(container.as_string(0), '''\ +Content-Type: multipart/digest; boundary="BOUNDARY" +MIME-Version: 1.0 + +--BOUNDARY + +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +message 1 + +--BOUNDARY + +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +message 2 + +--BOUNDARY-- +''') + + + +# A general test of parser->model->generator idempotency. IOW, read a message +# in, parse it into a message object tree, then without touching the tree, +# regenerate the plain text. The original text and the transformed text +# should be identical. Note: that we ignore the Unix-From since that may +# contain a changed date. +class TestIdempotent(TestEmailBase): + def _msgobj(self, filename): + fp = openfile(filename) + try: + data = fp.read() + finally: + fp.close() + msg = email.message_from_string(data) + return msg, data + + def _idempotent(self, msg, text): + eq = self.ndiffAssertEqual + s = StringIO() + g = Generator(s, maxheaderlen=0) + g.flatten(msg) + eq(text, s.getvalue()) + + def test_parse_text_message(self): + eq = self.assertEquals + msg, text = self._msgobj('msg_01.txt') + eq(msg.get_type(), 'text/plain') + eq(msg.get_main_type(), 'text') + eq(msg.get_subtype(), 'plain') + eq(msg.get_params()[1], ('charset', 'us-ascii')) + eq(msg.get_param('charset'), 'us-ascii') + eq(msg.preamble, None) + eq(msg.epilogue, None) + self._idempotent(msg, text) + + def test_parse_untyped_message(self): + eq = self.assertEquals + msg, text = self._msgobj('msg_03.txt') + eq(msg.get_type(), None) + eq(msg.get_params(), None) + eq(msg.get_param('charset'), None) + self._idempotent(msg, text) + + def test_simple_multipart(self): + msg, text = self._msgobj('msg_04.txt') + self._idempotent(msg, text) + + def test_MIME_digest(self): + msg, text = self._msgobj('msg_02.txt') + self._idempotent(msg, text) + + def test_long_header(self): + msg, text = self._msgobj('msg_27.txt') + self._idempotent(msg, text) + + def test_MIME_digest_with_part_headers(self): + msg, text = self._msgobj('msg_28.txt') + self._idempotent(msg, text) + + def test_mixed_with_image(self): + msg, text = self._msgobj('msg_06.txt') + self._idempotent(msg, text) + + def test_multipart_report(self): + msg, text = self._msgobj('msg_05.txt') + self._idempotent(msg, text) + + def test_dsn(self): + msg, text = self._msgobj('msg_16.txt') + self._idempotent(msg, text) + + def test_preamble_epilogue(self): + msg, text = self._msgobj('msg_21.txt') + self._idempotent(msg, text) + + def test_multipart_one_part(self): + msg, text = self._msgobj('msg_23.txt') + self._idempotent(msg, text) + + def test_multipart_no_parts(self): + msg, text = self._msgobj('msg_24.txt') + self._idempotent(msg, text) + + def test_no_start_boundary(self): + msg, text = self._msgobj('msg_31.txt') + self._idempotent(msg, text) + + def test_rfc2231_charset(self): + msg, text = self._msgobj('msg_32.txt') + self._idempotent(msg, text) + + def test_more_rfc2231_parameters(self): + msg, text = self._msgobj('msg_33.txt') + self._idempotent(msg, text) + + def test_text_plain_in_a_multipart_digest(self): + msg, text = self._msgobj('msg_34.txt') + self._idempotent(msg, text) + + def test_content_type(self): + eq = self.assertEquals + unless = self.failUnless + # Get a message object and reset the seek pointer for other tests + msg, text = self._msgobj('msg_05.txt') + eq(msg.get_type(), 'multipart/report') + # Test the Content-Type: parameters + params = {} + for pk, pv in msg.get_params(): + params[pk] = pv + eq(params['report-type'], 'delivery-status') + eq(params['boundary'], 'D1690A7AC1.996856090/mail.example.com') + eq(msg.preamble, 'This is a MIME-encapsulated message.\n\n') + eq(msg.epilogue, '\n\n') + eq(len(msg.get_payload()), 3) + # Make sure the subparts are what we expect + msg1 = msg.get_payload(0) + eq(msg1.get_type(), 'text/plain') + eq(msg1.get_payload(), 'Yadda yadda yadda\n') + msg2 = msg.get_payload(1) + eq(msg2.get_type(), None) + eq(msg2.get_payload(), 'Yadda yadda yadda\n') + msg3 = msg.get_payload(2) + eq(msg3.get_type(), 'message/rfc822') + self.failUnless(isinstance(msg3, Message)) + payload = msg3.get_payload() + unless(isinstance(payload, ListType)) + eq(len(payload), 1) + msg4 = payload[0] + unless(isinstance(msg4, Message)) + eq(msg4.get_payload(), 'Yadda yadda yadda\n') + + def test_parser(self): + eq = self.assertEquals + unless = self.failUnless + msg, text = self._msgobj('msg_06.txt') + # Check some of the outer headers + eq(msg.get_type(), 'message/rfc822') + # Make sure the payload is a list of exactly one sub-Message, and that + # that submessage has a type of text/plain + payload = msg.get_payload() + unless(isinstance(payload, ListType)) + eq(len(payload), 1) + msg1 = payload[0] + self.failUnless(isinstance(msg1, Message)) + eq(msg1.get_type(), 'text/plain') + self.failUnless(isinstance(msg1.get_payload(), StringType)) + eq(msg1.get_payload(), '\n') + + + +# Test various other bits of the package's functionality +class TestMiscellaneous(unittest.TestCase): + def test_message_from_string(self): + fp = openfile('msg_01.txt') + try: + text = fp.read() + finally: + fp.close() + msg = email.message_from_string(text) + s = StringIO() + # Don't wrap/continue long headers since we're trying to test + # idempotency. + g = Generator(s, maxheaderlen=0) + g.flatten(msg) + self.assertEqual(text, s.getvalue()) + + def test_message_from_file(self): + fp = openfile('msg_01.txt') + try: + text = fp.read() + fp.seek(0) + msg = email.message_from_file(fp) + s = StringIO() + # Don't wrap/continue long headers since we're trying to test + # idempotency. + g = Generator(s, maxheaderlen=0) + g.flatten(msg) + self.assertEqual(text, s.getvalue()) + finally: + fp.close() + + def test_message_from_string_with_class(self): + unless = self.failUnless + fp = openfile('msg_01.txt') + try: + text = fp.read() + finally: + fp.close() + # Create a subclass + class MyMessage(Message): + pass + + msg = email.message_from_string(text, MyMessage) + unless(isinstance(msg, MyMessage)) + # Try something more complicated + fp = openfile('msg_02.txt') + try: + text = fp.read() + finally: + fp.close() + msg = email.message_from_string(text, MyMessage) + for subpart in msg.walk(): + unless(isinstance(subpart, MyMessage)) + + def test_message_from_file_with_class(self): + unless = self.failUnless + # Create a subclass + class MyMessage(Message): + pass + + fp = openfile('msg_01.txt') + try: + msg = email.message_from_file(fp, MyMessage) + finally: + fp.close() + unless(isinstance(msg, MyMessage)) + # Try something more complicated + fp = openfile('msg_02.txt') + try: + msg = email.message_from_file(fp, MyMessage) + finally: + fp.close() + for subpart in msg.walk(): + unless(isinstance(subpart, MyMessage)) + + def test__all__(self): + module = __import__('email') + all = module.__all__ + all.sort() + self.assertEqual(all, ['Charset', 'Encoders', 'Errors', 'Generator', + 'Header', 'Iterators', 'MIMEAudio', 'MIMEBase', + 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', + 'MIMENonMultipart', 'MIMEText', 'Message', + 'Parser', 'Utils', 'base64MIME', + 'message_from_file', 'message_from_string', + 'quopriMIME']) + + def test_formatdate(self): + now = time.time() + self.assertEqual(Utils.parsedate(Utils.formatdate(now))[:6], + time.gmtime(now)[:6]) + + def test_formatdate_localtime(self): + now = time.time() + self.assertEqual( + Utils.parsedate(Utils.formatdate(now, localtime=True))[:6], + time.localtime(now)[:6]) + + def test_parsedate_none(self): + self.assertEqual(Utils.parsedate(''), None) + + def test_parsedate_compact(self): + # The FWS after the comma is optional + self.assertEqual(Utils.parsedate('Wed,3 Apr 2002 14:58:26 +0800'), + Utils.parsedate('Wed, 3 Apr 2002 14:58:26 +0800')) + + def test_parsedate_no_dayofweek(self): + eq = self.assertEqual + eq(Utils.parsedate_tz('25 Feb 2003 13:47:26 -0800'), + (2003, 2, 25, 13, 47, 26, 0, 0, 0, -28800)) + + def test_parsedate_compact_no_dayofweek(self): + eq = self.assertEqual + eq(Utils.parsedate_tz('5 Feb 2003 13:47:26 -0800'), + (2003, 2, 5, 13, 47, 26, 0, 0, 0, -28800)) + + def test_parseaddr_empty(self): + self.assertEqual(Utils.parseaddr('<>'), ('', '')) + self.assertEqual(Utils.formataddr(Utils.parseaddr('<>')), '') + + def test_noquote_dump(self): + self.assertEqual( + Utils.formataddr(('A Silly Person', 'person at dom.ain')), + 'A Silly Person ') + + def test_escape_dump(self): + self.assertEqual( + Utils.formataddr(('A (Very) Silly Person', 'person at dom.ain')), + r'"A \(Very\) Silly Person" ') + a = r'A \(Special\) Person' + b = 'person at dom.ain' + self.assertEqual(Utils.parseaddr(Utils.formataddr((a, b))), (a, b)) + + def test_escape_backslashes(self): + self.assertEqual( + Utils.formataddr(('Arthur \Backslash\ Foobar', 'person at dom.ain')), + r'"Arthur \\Backslash\\ Foobar" ') + a = r'Arthur \Backslash\ Foobar' + b = 'person at dom.ain' + self.assertEqual(Utils.parseaddr(Utils.formataddr((a, b))), (a, b)) + + def test_name_with_dot(self): + x = 'John X. Doe ' + y = '"John X. Doe" ' + a, b = ('John X. Doe', 'jxd at example.com') + self.assertEqual(Utils.parseaddr(x), (a, b)) + self.assertEqual(Utils.parseaddr(y), (a, b)) + # formataddr() quotes the name if there's a dot in it + self.assertEqual(Utils.formataddr((a, b)), y) + + def test_quote_dump(self): + self.assertEqual( + Utils.formataddr(('A Silly; Person', 'person at dom.ain')), + r'"A Silly; Person" ') + + def test_fix_eols(self): + eq = self.assertEqual + eq(Utils.fix_eols('hello'), 'hello') + eq(Utils.fix_eols('hello\n'), 'hello\r\n') + eq(Utils.fix_eols('hello\r'), 'hello\r\n') + eq(Utils.fix_eols('hello\r\n'), 'hello\r\n') + eq(Utils.fix_eols('hello\n\r'), 'hello\r\n\r\n') + + def test_charset_richcomparisons(self): + eq = self.assertEqual + ne = self.failIfEqual + cset1 = Charset() + cset2 = Charset() + eq(cset1, 'us-ascii') + eq(cset1, 'US-ASCII') + eq(cset1, 'Us-AsCiI') + eq('us-ascii', cset1) + eq('US-ASCII', cset1) + eq('Us-AsCiI', cset1) + ne(cset1, 'usascii') + ne(cset1, 'USASCII') + ne(cset1, 'UsAsCiI') + ne('usascii', cset1) + ne('USASCII', cset1) + ne('UsAsCiI', cset1) + eq(cset1, cset2) + eq(cset2, cset1) + + def test_getaddresses(self): + eq = self.assertEqual + eq(Utils.getaddresses(['aperson at dom.ain (Al Person)', + 'Bud Person ']), + [('Al Person', 'aperson at dom.ain'), + ('Bud Person', 'bperson at dom.ain')]) + + def test_getaddresses_nasty(self): + eq = self.assertEqual + eq(Utils.getaddresses(['foo: ;']), [('', '')]) + eq(Utils.getaddresses( + ['[]*-- =~$']), + [('', ''), ('', ''), ('', '*--')]) + eq(Utils.getaddresses( + ['foo: ;', '"Jason R. Mastaler" ']), + [('', ''), ('Jason R. Mastaler', 'jason at dom.ain')]) + + def test_utils_quote_unquote(self): + eq = self.assertEqual + msg = Message() + msg.add_header('content-disposition', 'attachment', + filename='foo\\wacky"name') + eq(msg.get_filename(), 'foo\\wacky"name') + + def test_get_body_encoding_with_bogus_charset(self): + charset = Charset('not a charset') + self.assertEqual(charset.get_body_encoding(), 'base64') + + def test_get_body_encoding_with_uppercase_charset(self): + eq = self.assertEqual + msg = Message() + msg['Content-Type'] = 'text/plain; charset=UTF-8' + eq(msg['content-type'], 'text/plain; charset=UTF-8') + charsets = msg.get_charsets() + eq(len(charsets), 1) + eq(charsets[0], 'utf-8') + charset = Charset(charsets[0]) + eq(charset.get_body_encoding(), 'base64') + msg.set_payload('hello world', charset=charset) + eq(msg.get_payload(), 'hello world') + eq(msg['content-transfer-encoding'], 'base64') + # Try another one + msg = Message() + msg['Content-Type'] = 'text/plain; charset="US-ASCII"' + charsets = msg.get_charsets() + eq(len(charsets), 1) + eq(charsets[0], 'us-ascii') + charset = Charset(charsets[0]) + eq(charset.get_body_encoding(), Encoders.encode_7or8bit) + msg.set_payload('hello world', charset=charset) + eq(msg.get_payload(), 'hello world') + eq(msg['content-transfer-encoding'], '7bit') + + def test_charsets_case_insensitive(self): + lc = Charset('us-ascii') + uc = Charset('US-ASCII') + self.assertEqual(lc.get_body_encoding(), uc.get_body_encoding()) + + + +# Test the iterator/generators +class TestIterators(TestEmailBase): + def test_body_line_iterator(self): + eq = self.assertEqual + # First a simple non-multipart message + msg = self._msgobj('msg_01.txt') + it = Iterators.body_line_iterator(msg) + lines = list(it) + eq(len(lines), 6) + eq(EMPTYSTRING.join(lines), msg.get_payload()) + # Now a more complicated multipart + msg = self._msgobj('msg_02.txt') + it = Iterators.body_line_iterator(msg) + lines = list(it) + eq(len(lines), 43) + fp = openfile('msg_19.txt') + try: + eq(EMPTYSTRING.join(lines), fp.read()) + finally: + fp.close() + + def test_typed_subpart_iterator(self): + eq = self.assertEqual + msg = self._msgobj('msg_04.txt') + it = Iterators.typed_subpart_iterator(msg, 'text') + lines = [] + subparts = 0 + for subpart in it: + subparts += 1 + lines.append(subpart.get_payload()) + eq(subparts, 2) + eq(EMPTYSTRING.join(lines), """\ +a simple kind of mirror +to reflect upon our own +a simple kind of mirror +to reflect upon our own +""") + + def test_typed_subpart_iterator_default_type(self): + eq = self.assertEqual + msg = self._msgobj('msg_03.txt') + it = Iterators.typed_subpart_iterator(msg, 'text', 'plain') + lines = [] + subparts = 0 + for subpart in it: + subparts += 1 + lines.append(subpart.get_payload()) + eq(subparts, 1) + eq(EMPTYSTRING.join(lines), """\ + +Hi, + +Do you like this message? + +-Me +""") + + + +class TestParsers(TestEmailBase): + def test_header_parser(self): + eq = self.assertEqual + # Parse only the headers of a complex multipart MIME document + fp = openfile('msg_02.txt') + try: + msg = HeaderParser().parse(fp) + finally: + fp.close() + eq(msg['from'], 'ppp-request at zzz.org') + eq(msg['to'], 'ppp at zzz.org') + eq(msg.get_type(), 'multipart/mixed') + eq(msg.is_multipart(), 0) + self.failUnless(isinstance(msg.get_payload(), StringType)) + + def test_whitespace_continuaton(self): + eq = self.assertEqual + # This message contains a line after the Subject: header that has only + # whitespace, but it is not empty! + msg = email.message_from_string("""\ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: the next line has a space on it +\x20 +Date: Mon, 8 Apr 2002 15:09:19 -0400 +Message-ID: spam + +Here's the message body +""") + eq(msg['subject'], 'the next line has a space on it\n ') + eq(msg['message-id'], 'spam') + eq(msg.get_payload(), "Here's the message body\n") + + def test_crlf_separation(self): + eq = self.assertEqual + fp = openfile('msg_26.txt', mode='rb') + try: + msg = Parser().parse(fp) + finally: + fp.close() + eq(len(msg.get_payload()), 2) + part1 = msg.get_payload(0) + eq(part1.get_type(), 'text/plain') + eq(part1.get_payload(), 'Simple email with attachment.\r\n\r\n') + part2 = msg.get_payload(1) + eq(part2.get_type(), 'application/riscos') + + def test_multipart_digest_with_extra_mime_headers(self): + eq = self.assertEqual + neq = self.ndiffAssertEqual + fp = openfile('msg_28.txt') + try: + msg = email.message_from_file(fp) + finally: + fp.close() + # Structure is: + # multipart/digest + # message/rfc822 + # text/plain + # message/rfc822 + # text/plain + eq(msg.is_multipart(), 1) + eq(len(msg.get_payload()), 2) + part1 = msg.get_payload(0) + eq(part1.get_type(), 'message/rfc822') + eq(part1.is_multipart(), 1) + eq(len(part1.get_payload()), 1) + part1a = part1.get_payload(0) + eq(part1a.is_multipart(), 0) + eq(part1a.get_type(), 'text/plain') + neq(part1a.get_payload(), 'message 1\n') + # next message/rfc822 + part2 = msg.get_payload(1) + eq(part2.get_type(), 'message/rfc822') + eq(part2.is_multipart(), 1) + eq(len(part2.get_payload()), 1) + part2a = part2.get_payload(0) + eq(part2a.is_multipart(), 0) + eq(part2a.get_type(), 'text/plain') + neq(part2a.get_payload(), 'message 2\n') + + def test_three_lines(self): + # A bug report by Andrew McNamara + lines = ['From: Andrew Person output codec + c = Charset('euc-jp') + # With apologies to Tokio Kikuchi ;) + try: + eq('\x1b$B5FCO;~IW\x1b(B', + c.body_encode('\xb5\xc6\xc3\xcf\xbb\xfe\xc9\xd7')) + eq('\xb5\xc6\xc3\xcf\xbb\xfe\xc9\xd7', + c.body_encode('\xb5\xc6\xc3\xcf\xbb\xfe\xc9\xd7', False)) + except LookupError: + # We probably don't have the Japanese codecs installed + pass + # Testing SF bug #625509, which we have to fake, since there are no + # built-in encodings where the header encoding is QP but the body + # encoding is not. + from email import Charset as CharsetModule + CharsetModule.add_charset('fake', CharsetModule.QP, None) + c = Charset('fake') + eq('hello w\xf6rld', c.body_encode('hello w\xf6rld')) + + + +# Test multilingual MIME headers. +class TestHeader(TestEmailBase): + def test_simple(self): + eq = self.ndiffAssertEqual + h = Header('Hello World!') + eq(h.encode(), 'Hello World!') + h.append(' Goodbye World!') + eq(h.encode(), 'Hello World! Goodbye World!') + + def test_simple_surprise(self): + eq = self.ndiffAssertEqual + h = Header('Hello World!') + eq(h.encode(), 'Hello World!') + h.append('Goodbye World!') + eq(h.encode(), 'Hello World! Goodbye World!') + + def test_header_needs_no_decoding(self): + h = 'no decoding needed' + self.assertEqual(decode_header(h), [(h, None)]) + + def test_long(self): + h = Header("I am the very model of a modern Major-General; I've information vegetable, animal, and mineral; I know the kings of England, and I quote the fights historical from Marathon to Waterloo, in order categorical; I'm very well acquainted, too, with matters mathematical; I understand equations, both the simple and quadratical; about binomial theorem I'm teeming with a lot o' news, with many cheerful facts about the square of the hypotenuse.", + maxlinelen=76) + for l in h.encode(splitchars=' ').split('\n '): + self.failUnless(len(l) <= 76) + + def test_multilingual(self): + eq = self.ndiffAssertEqual + g = Charset("iso-8859-1") + cz = Charset("iso-8859-2") + utf8 = Charset("utf-8") + g_head = "Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an s\xfcdl\xfcndischen Wandgem\xe4lden vorbei, gegen die rotierenden Klingen bef\xf6rdert. " + cz_head = "Finan\xe8ni metropole se hroutily pod tlakem jejich d\xf9vtipu.. " + utf8_head = u"\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00\u90e8\u306f\u30c9\u30a4\u30c4\u8a9e\u3067\u3059\u304c\u3001\u3042\u3068\u306f\u3067\u305f\u3089\u3081\u3067\u3059\u3002\u5b9f\u969b\u306b\u306f\u300cWenn ist das Nunstuck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput.\u300d\u3068\u8a00\u3063\u3066\u3044\u307e\u3059\u3002".encode("utf-8") + h = Header(g_head, g) + h.append(cz_head, cz) + h.append(utf8_head, utf8) + enc = h.encode() + eq(enc, """\ +=?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerderband_ko?= + =?iso-8859-1?q?mfortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndischen_Wan?= + =?iso-8859-1?q?dgem=E4lden_vorbei=2C_gegen_die_rotierenden_Klingen_bef=F6?= + =?iso-8859-1?q?rdert=2E_?= =?iso-8859-2?q?Finan=E8ni_metropole_se_hroutily?= + =?iso-8859-2?q?_pod_tlakem_jejich_d=F9vtipu=2E=2E_?= =?utf-8?b?5q2j56K6?= + =?utf-8?b?44Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE44G+44Gb44KT44CC?= + =?utf-8?b?5LiA6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB44GC44Go44Gv44Gn?= + =?utf-8?b?44Gf44KJ44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CMV2VubiBpc3QgZGFz?= + =?utf-8?q?_Nunstuck_git_und_Slotermeyer=3F_Ja!_Beiherhund_das_Oder_die_Fl?= + =?utf-8?b?aXBwZXJ3YWxkdCBnZXJzcHV0LuOAjeOBqOiogOOBo+OBpuOBhOOBvuOBmQ==?= + =?utf-8?b?44CC?=""") + eq(decode_header(enc), + [(g_head, "iso-8859-1"), (cz_head, "iso-8859-2"), + (utf8_head, "utf-8")]) + # Test for conversion to unicode. BAW: Python 2.1 doesn't support the + # __unicode__() protocol, so do things this way for compatibility. + ustr = h.__unicode__() + # For Python 2.2 and beyond + #ustr = unicode(h) + eq(ustr.encode('utf-8'), + 'Die Mieter treten hier ein werden mit einem Foerderband ' + 'komfortabel den Korridor entlang, an s\xc3\xbcdl\xc3\xbcndischen ' + 'Wandgem\xc3\xa4lden vorbei, gegen die rotierenden Klingen ' + 'bef\xc3\xb6rdert. Finan\xc4\x8dni metropole se hroutily pod ' + 'tlakem jejich d\xc5\xafvtipu.. \xe6\xad\xa3\xe7\xa2\xba\xe3\x81' + '\xab\xe8\xa8\x80\xe3\x81\x86\xe3\x81\xa8\xe7\xbf\xbb\xe8\xa8\xb3' + '\xe3\x81\xaf\xe3\x81\x95\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3' + '\x81\xbe\xe3\x81\x9b\xe3\x82\x93\xe3\x80\x82\xe4\xb8\x80\xe9\x83' + '\xa8\xe3\x81\xaf\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84\xe8\xaa\x9e' + '\xe3\x81\xa7\xe3\x81\x99\xe3\x81\x8c\xe3\x80\x81\xe3\x81\x82\xe3' + '\x81\xa8\xe3\x81\xaf\xe3\x81\xa7\xe3\x81\x9f\xe3\x82\x89\xe3\x82' + '\x81\xe3\x81\xa7\xe3\x81\x99\xe3\x80\x82\xe5\xae\x9f\xe9\x9a\x9b' + '\xe3\x81\xab\xe3\x81\xaf\xe3\x80\x8cWenn ist das Nunstuck git ' + 'und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt ' + 'gersput.\xe3\x80\x8d\xe3\x81\xa8\xe8\xa8\x80\xe3\x81\xa3\xe3\x81' + '\xa6\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82') + # Test make_header() + newh = make_header(decode_header(enc)) + eq(newh, enc) + + def test_header_ctor_default_args(self): + eq = self.ndiffAssertEqual + h = Header() + eq(h, '') + h.append('foo', Charset('iso-8859-1')) + eq(h, '=?iso-8859-1?q?foo?=') + + def test_explicit_maxlinelen(self): + eq = self.ndiffAssertEqual + hstr = 'A very long line that must get split to something other than at the 76th character boundary to test the non-default behavior' + h = Header(hstr) + eq(h.encode(), '''\ +A very long line that must get split to something other than at the 76th + character boundary to test the non-default behavior''') + h = Header(hstr, header_name='Subject') + eq(h.encode(), '''\ +A very long line that must get split to something other than at the + 76th character boundary to test the non-default behavior''') + h = Header(hstr, maxlinelen=1024, header_name='Subject') + eq(h.encode(), hstr) + + def test_us_ascii_header(self): + eq = self.assertEqual + s = 'hello' + x = decode_header(s) + eq(x, [('hello', None)]) + h = make_header(x) + eq(s, h.encode()) + + def test_string_charset(self): + eq = self.assertEqual + h = Header() + h.append('hello', 'iso-8859-1') + eq(h, '=?iso-8859-1?q?hello?=') + +## def test_unicode_error(self): +## raises = self.assertRaises +## raises(UnicodeError, Header, u'[P\xf6stal]', 'us-ascii') +## raises(UnicodeError, Header, '[P\xf6stal]', 'us-ascii') +## h = Header() +## raises(UnicodeError, h.append, u'[P\xf6stal]', 'us-ascii') +## raises(UnicodeError, h.append, '[P\xf6stal]', 'us-ascii') +## raises(UnicodeError, Header, u'\u83ca\u5730\u6642\u592b', 'iso-8859-1') + + def test_utf8_shortest(self): + eq = self.assertEqual + h = Header(u'p\xf6stal', 'utf-8') + eq(h.encode(), '=?utf-8?q?p=C3=B6stal?=') + h = Header(u'\u83ca\u5730\u6642\u592b', 'utf-8') + eq(h.encode(), '=?utf-8?b?6I+K5Zyw5pmC5aSr?=') + + def test_bad_8bit_header(self): + raises = self.assertRaises + eq = self.assertEqual + x = 'Ynwp4dUEbay Auction Semiar- No Charge \x96 Earn Big' + raises(UnicodeError, Header, x) + h = Header() + raises(UnicodeError, h.append, x) + eq(str(Header(x, errors='replace')), x) + h.append(x, errors='replace') + eq(str(h), x) + + def test_encoded_adjacent_nonencoded(self): + eq = self.assertEqual + h = Header() + h.append('hello', 'iso-8859-1') + h.append('world') + s = h.encode() + eq(s, '=?iso-8859-1?q?hello?= world') + h = make_header(decode_header(s)) + eq(h.encode(), s) + + def test_whitespace_eater(self): + eq = self.assertEqual + s = 'Subject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztk=?= =?koi8-r?q?=CA?= zz.' + parts = decode_header(s) + eq(parts, [('Subject:', None), ('\xf0\xd2\xcf\xd7\xc5\xd2\xcb\xc1 \xce\xc1 \xc6\xc9\xce\xc1\xcc\xd8\xce\xd9\xca', 'koi8-r'), ('zz.', None)]) + hdr = make_header(parts) + eq(hdr.encode(), + 'Subject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztnK?= zz.') + + def test_broken_base64_header(self): + raises = self.assertRaises + s = 'Subject: =?EUC-KR?B?CSixpLDtKSC/7Liuvsax4iC6uLmwMcijIKHaILzSwd/H0SC8+LCjwLsgv7W/+Mj3IQ?=' + raises(Errors.HeaderParseError, decode_header, s) + + + +# Test RFC 2231 header parameters (en/de)coding +class TestRFC2231(TestEmailBase): + def test_get_param(self): + eq = self.assertEqual + msg = self._msgobj('msg_29.txt') + eq(msg.get_param('title'), + ('us-ascii', 'en', 'This is even more ***fun*** isn\'t it!')) + eq(msg.get_param('title', unquote=False), + ('us-ascii', 'en', '"This is even more ***fun*** isn\'t it!"')) + + def test_set_param(self): + eq = self.assertEqual + msg = Message() + msg.set_param('title', 'This is even more ***fun*** isn\'t it!', + charset='us-ascii') + eq(msg.get_param('title'), + ('us-ascii', '', 'This is even more ***fun*** isn\'t it!')) + msg.set_param('title', 'This is even more ***fun*** isn\'t it!', + charset='us-ascii', language='en') + eq(msg.get_param('title'), + ('us-ascii', 'en', 'This is even more ***fun*** isn\'t it!')) + msg = self._msgobj('msg_01.txt') + msg.set_param('title', 'This is even more ***fun*** isn\'t it!', + charset='us-ascii', language='en') + eq(msg.as_string(), """\ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) +\tid 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 +Content-Type: text/plain; charset=us-ascii; +\ttitle*="us-ascii'en'This%20is%20even%20more%20%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it%21" + + +Hi, + +Do you like this message? + +-Me +""") + + def test_del_param(self): + eq = self.ndiffAssertEqual + msg = self._msgobj('msg_01.txt') + msg.set_param('foo', 'bar', charset='us-ascii', language='en') + msg.set_param('title', 'This is even more ***fun*** isn\'t it!', + charset='us-ascii', language='en') + msg.del_param('foo', header='Content-Type') + eq(msg.as_string(), """\ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) +\tid 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 +Content-Type: text/plain; charset="us-ascii"; +\ttitle*="us-ascii'en'This%20is%20even%20more%20%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it%21" + + +Hi, + +Do you like this message? + +-Me +""") + + def test_rfc2231_get_content_charset(self): + eq = self.assertEqual + msg = self._msgobj('msg_32.txt') + eq(msg.get_content_charset(), 'us-ascii') + + def test_rfc2231_no_language_or_charset(self): + m = '''\ +Content-Transfer-Encoding: 8bit +Content-Disposition: inline; filename="file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEMP_nsmail.htm" +Content-Type: text/html; NAME*0=file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEM; NAME*1=P_nsmail.htm + +''' + msg = email.message_from_string(m) + self.assertEqual(msg.get_param('NAME'), + (None, None, 'file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEMP_nsmail.htm')) + + def test_rfc2231_no_language_or_charset_in_filename(self): + m = '''\ +Content-Disposition: inline; +\tfilename*0="This%20is%20even%20more%20"; +\tfilename*1="%2A%2A%2Afun%2A%2A%2A%20"; +\tfilename*2="is it not.pdf" + +''' + msg = email.message_from_string(m) + self.assertEqual(msg.get_filename(), + 'This is even more ***fun*** is it not.pdf') + + def test_rfc2231_no_language_or_charset_in_boundary(self): + m = '''\ +Content-Type: multipart/alternative; +\tboundary*0="This%20is%20even%20more%20"; +\tboundary*1="%2A%2A%2Afun%2A%2A%2A%20"; +\tboundary*2="is it not.pdf" + +''' + msg = email.message_from_string(m) + self.assertEqual(msg.get_boundary(), + 'This is even more ***fun*** is it not.pdf') + + def test_rfc2231_no_language_or_charset_in_charset(self): + # This is a nonsensical charset value, but tests the code anyway + m = '''\ +Content-Type: text/plain; +\tcharset*0="This%20is%20even%20more%20"; +\tcharset*1="%2A%2A%2Afun%2A%2A%2A%20"; +\tcharset*2="is it not.pdf" + +''' + msg = email.message_from_string(m) + self.assertEqual(msg.get_content_charset(), + 'this is even more ***fun*** is it not.pdf') + + + +def _testclasses(): + mod = sys.modules[__name__] + return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] + + +def suite(): + suite = unittest.TestSuite() + for testclass in _testclasses(): + suite.addTest(unittest.makeSuite(testclass)) + return suite + + +def test_main(): + for testclass in _testclasses(): + run_unittest(testclass) + + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') diff --git a/lib-python/2.2/email/test/test_email_codecs.py b/lib-python/2.2/email/test/test_email_codecs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/test_email_codecs.py @@ -0,0 +1,68 @@ +# Copyright (C) 2002 Python Software Foundation +# email package unit tests for (optional) Asian codecs + +import unittest +from test.test_support import run_unittest + +from email.test.test_email import TestEmailBase +from email.Charset import Charset +from email.Header import Header, decode_header + +# See if we have the Japanese codecs package installed +try: + unicode('foo', 'japanese.iso-2022-jp') +except LookupError: + # Different in Python 2.3 + from test_support import TestSkipped + raise TestSkipped, 'Optional Japanese codecs not installed' + + + +class TestEmailAsianCodecs(TestEmailBase): + def test_japanese_codecs(self): + eq = self.ndiffAssertEqual + j = Charset("euc-jp") + g = Charset("iso-8859-1") + h = Header("Hello World!") + jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa' + ghello = 'Gr\xfc\xdf Gott!' + h.append(jhello, j) + h.append(ghello, g) + # BAW: This used to -- and maybe should -- fold the two iso-8859-1 + # chunks into a single encoded word. However it doesn't violate the + # standard to have them as two encoded chunks and maybe it's + # reasonable for each .append() call to result in a separate + # encoded word. + eq(h.encode(), """\ +Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?= + =?iso-8859-1?q?Gr=FC=DF?= =?iso-8859-1?q?_Gott!?=""") + eq(decode_header(h.encode()), + [('Hello World!', None), + ('\x1b$B%O%m!<%o!<%k%I!*\x1b(B', 'iso-2022-jp'), + ('Gr\xfc\xdf Gott!', 'iso-8859-1')]) + long = 'test-ja \xa4\xd8\xc5\xea\xb9\xc6\xa4\xb5\xa4\xec\xa4\xbf\xa5\xe1\xa1\xbc\xa5\xeb\xa4\xcf\xbb\xca\xb2\xf1\xbc\xd4\xa4\xce\xbe\xb5\xc7\xa7\xa4\xf2\xc2\xd4\xa4\xc3\xa4\xc6\xa4\xa4\xa4\xde\xa4\xb9' + h = Header(long, j, header_name="Subject") + # test a very long header + enc = h.encode() + # TK: splitting point may differ by codec design and/or Header encoding + eq(enc , """\ +=?iso-2022-jp?b?dGVzdC1qYSAbJEIkWEVqOUYkNSRsJD8lYSE8JWskTztKGyhC?= + =?iso-2022-jp?b?GyRCMnE8VCROPjVHJyRyQlQkQyRGJCQkXiQ5GyhC?=""") + # TK: full decode comparison + eq(h.__unicode__().encode('euc-jp'), long) + + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestEmailAsianCodecs)) + return suite + + +def test_main(): + run_unittest(TestEmailAsianCodecs) + + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') diff --git a/lib-python/2.2/email/test/test_email_torture.py b/lib-python/2.2/email/test/test_email_torture.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/email/test/test_email_torture.py @@ -0,0 +1,136 @@ +# Copyright (C) 2002 Python Software Foundation +# +# A torture test of the email package. This should not be run as part of the +# standard Python test suite since it requires several meg of email messages +# collected in the wild. These source messages are not checked into the +# Python distro, but are available as part of the standalone email package at +# http://sf.net/projects/mimelib + +import sys +import os +import unittest +from cStringIO import StringIO +from types import ListType + +from email.test.test_email import TestEmailBase +from test.test_support import TestSkipped + +import email +from email import __file__ as testfile +from email.Iterators import _structure + +def openfile(filename): + from os.path import join, dirname, abspath + path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename)) + return open(path, 'r') + +# Prevent this test from running in the Python distro +try: + openfile('crispin-torture.txt') +except IOError: + raise TestSkipped + + + +class TortureBase(TestEmailBase): + def _msgobj(self, filename): + fp = openfile(filename) + try: + msg = email.message_from_file(fp) + finally: + fp.close() + return msg + + + +class TestCrispinTorture(TortureBase): + # Mark Crispin's torture test from the SquirrelMail project + def test_mondo_message(self): + eq = self.assertEqual + neq = self.ndiffAssertEqual + msg = self._msgobj('crispin-torture.txt') + payload = msg.get_payload() + eq(type(payload), ListType) + eq(len(payload), 12) + eq(msg.preamble, None) + eq(msg.epilogue, '\n\n') + # Probably the best way to verify the message is parsed correctly is to + # dump its structure and compare it against the known structure. + fp = StringIO() + _structure(msg, fp=fp) + neq(fp.getvalue(), """\ +multipart/mixed + text/plain + message/rfc822 + multipart/alternative + text/plain + multipart/mixed + text/richtext + application/andrew-inset + message/rfc822 + audio/basic + audio/basic + image/pbm + message/rfc822 + multipart/mixed + multipart/mixed + text/plain + audio/x-sun + multipart/mixed + image/gif + image/gif + application/x-be2 + application/atomicmail + audio/x-sun + message/rfc822 + multipart/mixed + text/plain + image/pgm + text/plain + message/rfc822 + multipart/mixed + text/plain + image/pbm + message/rfc822 + application/postscript + image/gif + message/rfc822 + multipart/mixed + audio/basic + audio/basic + message/rfc822 + multipart/mixed + application/postscript + text/plain + message/rfc822 + multipart/mixed + text/plain + multipart/parallel + image/gif + audio/basic + application/atomicmail + message/rfc822 + audio/x-sun +""") + + +def _testclasses(): + mod = sys.modules[__name__] + return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] + + +def suite(): + suite = unittest.TestSuite() + for testclass in _testclasses(): + suite.addTest(unittest.makeSuite(testclass)) + return suite + + +def test_main(): + for testclass in _testclasses(): + test_support.run_unittest(testclass) + + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') diff --git a/lib-python/2.2/encodings/__init__.py b/lib-python/2.2/encodings/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/__init__.py @@ -0,0 +1,97 @@ +""" Standard "encodings" Package + + Standard Python encoding modules are stored in this package + directory. + + Codec modules must have names corresponding to standard lower-case + encoding names with hyphens mapped to underscores, e.g. 'utf-8' is + implemented by the module 'utf_8.py'. + + Each codec module must export the following interface: + + * getregentry() -> (encoder, decoder, stream_reader, stream_writer) + The getregentry() API must return callable objects which adhere to + the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be standard encoding + names as defined above (lower-case, hyphens converted to + underscores). + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs,aliases,exceptions + +_cache = {} +_unknown = '--unknown--' + +class CodecRegistryError(exceptions.LookupError, + exceptions.SystemError): + pass + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding,_unknown) + if entry is not _unknown: + return entry + + # Import the module + modname = encoding.replace('-', '_') + modname = aliases.aliases.get(modname,modname) + try: + mod = __import__(modname,globals(),locals(),'*') + except ImportError,why: + # cache misses + _cache[encoding] = None + return None + + try: + getregentry = mod.getregentry + except AttributeError: + # Not a codec module + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + try: + entry = tuple(getregentry()) + except AttributeError: + entry = () + if len(entry) != 4: + raise CodecRegistryError,\ + 'module "%s" (%s) failed to register' % \ + (mod.__name__, mod.__file__) + for obj in entry: + if not callable(obj): + raise CodecRegistryError,\ + 'incompatible codecs in module "%s" (%s)' % \ + (mod.__name__, mod.__file__) + + # Cache the codec registry entry + _cache[encoding] = entry + + # Register its aliases (without overwriting previously registered + # aliases) + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + if not aliases.aliases.has_key(alias): + aliases.aliases[alias] = modname + + # Return the registry entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) diff --git a/lib-python/2.2/encodings/aliases.py b/lib-python/2.2/encodings/aliases.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/aliases.py @@ -0,0 +1,115 @@ +""" Encoding Aliases Support + + This module is used by the encodings package search function to + map encodings names to module names. + + Note that the search function converts the encoding names to lower + case and replaces hyphens with underscores *before* performing the + lookup. + +""" +aliases = { + + # Latin-1 + 'latin': 'latin_1', + 'latin1': 'latin_1', + + # UTF-7 + 'utf7': 'utf_7', + 'u7': 'utf_7', + + # UTF-8 + 'utf': 'utf_8', + 'utf8': 'utf_8', + 'u8': 'utf_8', + 'utf8 at ucs2': 'utf_8', + 'utf8 at ucs4': 'utf_8', + + # UTF-16 + 'utf16': 'utf_16', + 'u16': 'utf_16', + 'utf_16be': 'utf_16_be', + 'utf_16le': 'utf_16_le', + 'unicodebigunmarked': 'utf_16_be', + 'unicodelittleunmarked': 'utf_16_le', + + # ASCII + 'us_ascii': 'ascii', + 'ansi_x3.4_1968': 'ascii', # used on Linux + 'ansi_x3_4_1968': 'ascii', # used on BSD? + '646': 'ascii', # used on Solaris + + # EBCDIC + 'ebcdic_cp_us': 'cp037', + 'ibm039': 'cp037', + 'ibm1140': 'cp1140', + + # ISO + '8859': 'latin_1', + 'iso8859': 'latin_1', + 'iso8859_1': 'latin_1', + 'iso_8859_1': 'latin_1', + 'iso_8859_10': 'iso8859_10', + 'iso_8859_13': 'iso8859_13', + 'iso_8859_14': 'iso8859_14', + 'iso_8859_15': 'iso8859_15', + 'iso_8859_2': 'iso8859_2', + 'iso_8859_3': 'iso8859_3', + 'iso_8859_4': 'iso8859_4', + 'iso_8859_5': 'iso8859_5', + 'iso_8859_6': 'iso8859_6', + 'iso_8859_7': 'iso8859_7', + 'iso_8859_8': 'iso8859_8', + 'iso_8859_9': 'iso8859_9', + + # Mac + 'maclatin2': 'mac_latin2', + 'maccentraleurope': 'mac_latin2', + 'maccyrillic': 'mac_cyrillic', + 'macgreek': 'mac_greek', + 'maciceland': 'mac_iceland', + 'macroman': 'mac_roman', + 'macturkish': 'mac_turkish', + + # Windows + 'windows_1251': 'cp1251', + 'windows_1252': 'cp1252', + 'windows_1254': 'cp1254', + 'windows_1255': 'cp1255', + 'windows_1256': 'cp1256', + 'windows_1257': 'cp1257', + 'windows_1258': 'cp1258', + + # MBCS + 'dbcs': 'mbcs', + + # Code pages + '437': 'cp437', + + # CJK + # + # The codecs for these encodings are not distributed with the + # Python core, but are included here for reference, since the + # locale module relies on having these aliases available. + # + 'jis_7': 'jis_7', + 'iso_2022_jp': 'jis_7', + 'ujis': 'euc_jp', + 'ajec': 'euc_jp', + 'eucjp': 'euc_jp', + 'tis260': 'tactis', + 'sjis': 'shift_jis', + + # Content transfer/compression encodings + 'rot13': 'rot_13', + 'base64': 'base64_codec', + 'base_64': 'base64_codec', + 'zlib': 'zlib_codec', + 'zip': 'zlib_codec', + 'hex': 'hex_codec', + 'uu': 'uu_codec', + 'quopri': 'quopri_codec', + 'quotedprintable': 'quopri_codec', + 'quoted_printable': 'quopri_codec', + +} diff --git a/lib-python/2.2/encodings/ascii.py b/lib-python/2.2/encodings/ascii.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/ascii.py @@ -0,0 +1,35 @@ +""" Python 'ascii' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.ascii_encode + decode = codecs.ascii_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.ascii_decode + decode = codecs.ascii_encode + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/base64_codec.py b/lib-python/2.2/encodings/base64_codec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/base64_codec.py @@ -0,0 +1,62 @@ +""" Python 'base64_codec' Codec - base64 content transfer encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal at lemburg.com). + +""" +import codecs, base64 + +### Codec APIs + +def base64_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = base64.encodestring(input) + return (output, len(input)) + +def base64_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = base64.decodestring(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return base64_encode(input,errors) + def decode(self, input,errors='strict'): + return base64_decode(input,errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (base64_encode,base64_decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/charmap.py b/lib-python/2.2/encodings/charmap.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/charmap.py @@ -0,0 +1,51 @@ +""" Generic Python Character Mapping Codec. + + Use this codec directly rather than through the automatic + conversion mechanisms supplied by unicode() and .encode(). + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.charmap_encode + decode = codecs.charmap_decode + +class StreamWriter(Codec,codecs.StreamWriter): + + def __init__(self,stream,errors='strict',mapping=None): + + codecs.StreamWriter.__init__(self,stream,errors) + self.mapping = mapping + + def encode(self,input,errors='strict'): + + return Codec.encode(input,errors,self.mapping) + +class StreamReader(Codec,codecs.StreamReader): + + def __init__(self,stream,errors='strict',mapping=None): + + codecs.StreamReader.__init__(self,strict,errors) + self.mapping = mapping + + def decode(self,input,errors='strict'): + + return Codec.decode(input,errors,self.mapping) + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/cp037.py b/lib-python/2.2/encodings/cp037.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp037.py @@ -0,0 +1,280 @@ +""" Python Character Mapping Codec generated from 'CP037.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0004: 0x009c, # CONTROL + 0x0005: 0x0009, # HORIZONTAL TABULATION + 0x0006: 0x0086, # CONTROL + 0x0007: 0x007f, # DELETE + 0x0008: 0x0097, # CONTROL + 0x0009: 0x008d, # CONTROL + 0x000a: 0x008e, # CONTROL + 0x0014: 0x009d, # CONTROL + 0x0015: 0x0085, # CONTROL + 0x0016: 0x0008, # BACKSPACE + 0x0017: 0x0087, # CONTROL + 0x001a: 0x0092, # CONTROL + 0x001b: 0x008f, # CONTROL + 0x0020: 0x0080, # CONTROL + 0x0021: 0x0081, # CONTROL + 0x0022: 0x0082, # CONTROL + 0x0023: 0x0083, # CONTROL + 0x0024: 0x0084, # CONTROL + 0x0025: 0x000a, # LINE FEED + 0x0026: 0x0017, # END OF TRANSMISSION BLOCK + 0x0027: 0x001b, # ESCAPE + 0x0028: 0x0088, # CONTROL + 0x0029: 0x0089, # CONTROL + 0x002a: 0x008a, # CONTROL + 0x002b: 0x008b, # CONTROL + 0x002c: 0x008c, # CONTROL + 0x002d: 0x0005, # ENQUIRY + 0x002e: 0x0006, # ACKNOWLEDGE + 0x002f: 0x0007, # BELL + 0x0030: 0x0090, # CONTROL + 0x0031: 0x0091, # CONTROL + 0x0032: 0x0016, # SYNCHRONOUS IDLE + 0x0033: 0x0093, # CONTROL + 0x0034: 0x0094, # CONTROL + 0x0035: 0x0095, # CONTROL + 0x0036: 0x0096, # CONTROL + 0x0037: 0x0004, # END OF TRANSMISSION + 0x0038: 0x0098, # CONTROL + 0x0039: 0x0099, # CONTROL + 0x003a: 0x009a, # CONTROL + 0x003b: 0x009b, # CONTROL + 0x003c: 0x0014, # DEVICE CONTROL FOUR + 0x003d: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x003e: 0x009e, # CONTROL + 0x003f: 0x001a, # SUBSTITUTE + 0x0040: 0x0020, # SPACE + 0x0041: 0x00a0, # NO-BREAK SPACE + 0x0042: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0043: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0044: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0045: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0046: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0047: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0048: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0049: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x004a: 0x00a2, # CENT SIGN + 0x004b: 0x002e, # FULL STOP + 0x004c: 0x003c, # LESS-THAN SIGN + 0x004d: 0x0028, # LEFT PARENTHESIS + 0x004e: 0x002b, # PLUS SIGN + 0x004f: 0x007c, # VERTICAL LINE + 0x0050: 0x0026, # AMPERSAND + 0x0051: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0052: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0053: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0054: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0055: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0056: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0057: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0058: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0059: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x005a: 0x0021, # EXCLAMATION MARK + 0x005b: 0x0024, # DOLLAR SIGN + 0x005c: 0x002a, # ASTERISK + 0x005d: 0x0029, # RIGHT PARENTHESIS + 0x005e: 0x003b, # SEMICOLON + 0x005f: 0x00ac, # NOT SIGN + 0x0060: 0x002d, # HYPHEN-MINUS + 0x0061: 0x002f, # SOLIDUS + 0x0062: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0063: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0064: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0065: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0066: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x0067: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0068: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0069: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x006a: 0x00a6, # BROKEN BAR + 0x006b: 0x002c, # COMMA + 0x006c: 0x0025, # PERCENT SIGN + 0x006d: 0x005f, # LOW LINE + 0x006e: 0x003e, # GREATER-THAN SIGN + 0x006f: 0x003f, # QUESTION MARK + 0x0070: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x0071: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0072: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0073: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0074: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0075: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x0076: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x0077: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0078: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0079: 0x0060, # GRAVE ACCENT + 0x007a: 0x003a, # COLON + 0x007b: 0x0023, # NUMBER SIGN + 0x007c: 0x0040, # COMMERCIAL AT + 0x007d: 0x0027, # APOSTROPHE + 0x007e: 0x003d, # EQUALS SIGN + 0x007f: 0x0022, # QUOTATION MARK + 0x0080: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x0081: 0x0061, # LATIN SMALL LETTER A + 0x0082: 0x0062, # LATIN SMALL LETTER B + 0x0083: 0x0063, # LATIN SMALL LETTER C + 0x0084: 0x0064, # LATIN SMALL LETTER D + 0x0085: 0x0065, # LATIN SMALL LETTER E + 0x0086: 0x0066, # LATIN SMALL LETTER F + 0x0087: 0x0067, # LATIN SMALL LETTER G + 0x0088: 0x0068, # LATIN SMALL LETTER H + 0x0089: 0x0069, # LATIN SMALL LETTER I + 0x008a: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008b: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH (ICELANDIC) + 0x008d: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x008e: 0x00fe, # LATIN SMALL LETTER THORN (ICELANDIC) + 0x008f: 0x00b1, # PLUS-MINUS SIGN + 0x0090: 0x00b0, # DEGREE SIGN + 0x0091: 0x006a, # LATIN SMALL LETTER J + 0x0092: 0x006b, # LATIN SMALL LETTER K + 0x0093: 0x006c, # LATIN SMALL LETTER L + 0x0094: 0x006d, # LATIN SMALL LETTER M + 0x0095: 0x006e, # LATIN SMALL LETTER N + 0x0096: 0x006f, # LATIN SMALL LETTER O + 0x0097: 0x0070, # LATIN SMALL LETTER P + 0x0098: 0x0071, # LATIN SMALL LETTER Q + 0x0099: 0x0072, # LATIN SMALL LETTER R + 0x009a: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x009b: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x009c: 0x00e6, # LATIN SMALL LIGATURE AE + 0x009d: 0x00b8, # CEDILLA + 0x009e: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x00b5, # MICRO SIGN + 0x00a1: 0x007e, # TILDE + 0x00a2: 0x0073, # LATIN SMALL LETTER S + 0x00a3: 0x0074, # LATIN SMALL LETTER T + 0x00a4: 0x0075, # LATIN SMALL LETTER U + 0x00a5: 0x0076, # LATIN SMALL LETTER V + 0x00a6: 0x0077, # LATIN SMALL LETTER W + 0x00a7: 0x0078, # LATIN SMALL LETTER X + 0x00a8: 0x0079, # LATIN SMALL LETTER Y + 0x00a9: 0x007a, # LATIN SMALL LETTER Z + 0x00aa: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ab: 0x00bf, # INVERTED QUESTION MARK + 0x00ac: 0x00d0, # LATIN CAPITAL LETTER ETH (ICELANDIC) + 0x00ad: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ae: 0x00de, # LATIN CAPITAL LETTER THORN (ICELANDIC) + 0x00af: 0x00ae, # REGISTERED SIGN + 0x00b0: 0x005e, # CIRCUMFLEX ACCENT + 0x00b1: 0x00a3, # POUND SIGN + 0x00b2: 0x00a5, # YEN SIGN + 0x00b3: 0x00b7, # MIDDLE DOT + 0x00b4: 0x00a9, # COPYRIGHT SIGN + 0x00b5: 0x00a7, # SECTION SIGN + 0x00b7: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00b8: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00b9: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ba: 0x005b, # LEFT SQUARE BRACKET + 0x00bb: 0x005d, # RIGHT SQUARE BRACKET + 0x00bc: 0x00af, # MACRON + 0x00bd: 0x00a8, # DIAERESIS + 0x00be: 0x00b4, # ACUTE ACCENT + 0x00bf: 0x00d7, # MULTIPLICATION SIGN + 0x00c0: 0x007b, # LEFT CURLY BRACKET + 0x00c1: 0x0041, # LATIN CAPITAL LETTER A + 0x00c2: 0x0042, # LATIN CAPITAL LETTER B + 0x00c3: 0x0043, # LATIN CAPITAL LETTER C + 0x00c4: 0x0044, # LATIN CAPITAL LETTER D + 0x00c5: 0x0045, # LATIN CAPITAL LETTER E + 0x00c6: 0x0046, # LATIN CAPITAL LETTER F + 0x00c7: 0x0047, # LATIN CAPITAL LETTER G + 0x00c8: 0x0048, # LATIN CAPITAL LETTER H + 0x00c9: 0x0049, # LATIN CAPITAL LETTER I + 0x00ca: 0x00ad, # SOFT HYPHEN + 0x00cb: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00cc: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00cd: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x00ce: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00cf: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00d0: 0x007d, # RIGHT CURLY BRACKET + 0x00d1: 0x004a, # LATIN CAPITAL LETTER J + 0x00d2: 0x004b, # LATIN CAPITAL LETTER K + 0x00d3: 0x004c, # LATIN CAPITAL LETTER L + 0x00d4: 0x004d, # LATIN CAPITAL LETTER M + 0x00d5: 0x004e, # LATIN CAPITAL LETTER N + 0x00d6: 0x004f, # LATIN CAPITAL LETTER O + 0x00d7: 0x0050, # LATIN CAPITAL LETTER P + 0x00d8: 0x0051, # LATIN CAPITAL LETTER Q + 0x00d9: 0x0052, # LATIN CAPITAL LETTER R + 0x00da: 0x00b9, # SUPERSCRIPT ONE + 0x00db: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00dd: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x00de: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00df: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00e0: 0x005c, # REVERSE SOLIDUS + 0x00e1: 0x00f7, # DIVISION SIGN + 0x00e2: 0x0053, # LATIN CAPITAL LETTER S + 0x00e3: 0x0054, # LATIN CAPITAL LETTER T + 0x00e4: 0x0055, # LATIN CAPITAL LETTER U + 0x00e5: 0x0056, # LATIN CAPITAL LETTER V + 0x00e6: 0x0057, # LATIN CAPITAL LETTER W + 0x00e7: 0x0058, # LATIN CAPITAL LETTER X + 0x00e8: 0x0059, # LATIN CAPITAL LETTER Y + 0x00e9: 0x005a, # LATIN CAPITAL LETTER Z + 0x00ea: 0x00b2, # SUPERSCRIPT TWO + 0x00eb: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00ec: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00ed: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00f0: 0x0030, # DIGIT ZERO + 0x00f1: 0x0031, # DIGIT ONE + 0x00f2: 0x0032, # DIGIT TWO + 0x00f3: 0x0033, # DIGIT THREE + 0x00f4: 0x0034, # DIGIT FOUR + 0x00f5: 0x0035, # DIGIT FIVE + 0x00f6: 0x0036, # DIGIT SIX + 0x00f7: 0x0037, # DIGIT SEVEN + 0x00f8: 0x0038, # DIGIT EIGHT + 0x00f9: 0x0039, # DIGIT NINE + 0x00fa: 0x00b3, # SUPERSCRIPT THREE + 0x00fb: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00fd: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00fe: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ff: 0x009f, # CONTROL +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1006.py b/lib-python/2.2/encodings/cp1006.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1006.py @@ -0,0 +1,138 @@ +""" Python Character Mapping Codec generated from 'CP1006.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x06f0, # EXTENDED ARABIC-INDIC DIGIT ZERO + 0x00a2: 0x06f1, # EXTENDED ARABIC-INDIC DIGIT ONE + 0x00a3: 0x06f2, # EXTENDED ARABIC-INDIC DIGIT TWO + 0x00a4: 0x06f3, # EXTENDED ARABIC-INDIC DIGIT THREE + 0x00a5: 0x06f4, # EXTENDED ARABIC-INDIC DIGIT FOUR + 0x00a6: 0x06f5, # EXTENDED ARABIC-INDIC DIGIT FIVE + 0x00a7: 0x06f6, # EXTENDED ARABIC-INDIC DIGIT SIX + 0x00a8: 0x06f7, # EXTENDED ARABIC-INDIC DIGIT SEVEN + 0x00a9: 0x06f8, # EXTENDED ARABIC-INDIC DIGIT EIGHT + 0x00aa: 0x06f9, # EXTENDED ARABIC-INDIC DIGIT NINE + 0x00ab: 0x060c, # ARABIC COMMA + 0x00ac: 0x061b, # ARABIC SEMICOLON + 0x00ae: 0x061f, # ARABIC QUESTION MARK + 0x00af: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00b0: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00b1: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00b2: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00b3: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00b4: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00b5: 0xfb56, # ARABIC LETTER PEH ISOLATED FORM + 0x00b6: 0xfb58, # ARABIC LETTER PEH INITIAL FORM + 0x00b7: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00b8: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00b9: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00ba: 0xfb66, # ARABIC LETTER TTEH ISOLATED FORM + 0x00bb: 0xfb68, # ARABIC LETTER TTEH INITIAL FORM + 0x00bc: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00bd: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00be: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00bf: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00c0: 0xfb7a, # ARABIC LETTER TCHEH ISOLATED FORM + 0x00c1: 0xfb7c, # ARABIC LETTER TCHEH INITIAL FORM + 0x00c2: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00c3: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00c4: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00c5: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00c6: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00c7: 0xfb84, # ARABIC LETTER DAHAL ISOLATED FORMN + 0x00c8: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00c9: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00ca: 0xfb8c, # ARABIC LETTER RREH ISOLATED FORM + 0x00cb: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00cc: 0xfb8a, # ARABIC LETTER JEH ISOLATED FORM + 0x00cd: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00ce: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00cf: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00d0: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d1: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00d2: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d3: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00d4: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d5: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d6: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d7: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00d8: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00db: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00dc: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00dd: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00de: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00df: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00e0: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e1: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00e4: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e5: 0xfb92, # ARABIC LETTER GAF ISOLATED FORM + 0x00e6: 0xfb94, # ARABIC LETTER GAF INITIAL FORM + 0x00e7: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00e8: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e9: 0xfee0, # ARABIC LETTER LAM MEDIAL FORM + 0x00ea: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00eb: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00ec: 0xfb9e, # ARABIC LETTER NOON GHUNNA ISOLATED FORM + 0x00ed: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00ee: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00ef: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00f0: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00f1: 0xfba6, # ARABIC LETTER HEH GOAL ISOLATED FORM + 0x00f2: 0xfba8, # ARABIC LETTER HEH GOAL INITIAL FORM + 0x00f3: 0xfba9, # ARABIC LETTER HEH GOAL MEDIAL FORM + 0x00f4: 0xfbaa, # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + 0x00f5: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00f6: 0xfe89, # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + 0x00f7: 0xfe8a, # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + 0x00f8: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00f9: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fa: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00fb: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00fc: 0xfbb0, # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + 0x00fd: 0xfbae, # ARABIC LETTER YEH BARREE ISOLATED FORM + 0x00fe: 0xfe7c, # ARABIC SHADDA ISOLATED FORM + 0x00ff: 0xfe7d, # ARABIC SHADDA MEDIAL FORM +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1026.py b/lib-python/2.2/encodings/cp1026.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1026.py @@ -0,0 +1,280 @@ +""" Python Character Mapping Codec generated from 'CP1026.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0004: 0x009c, # CONTROL + 0x0005: 0x0009, # HORIZONTAL TABULATION + 0x0006: 0x0086, # CONTROL + 0x0007: 0x007f, # DELETE + 0x0008: 0x0097, # CONTROL + 0x0009: 0x008d, # CONTROL + 0x000a: 0x008e, # CONTROL + 0x0014: 0x009d, # CONTROL + 0x0015: 0x0085, # CONTROL + 0x0016: 0x0008, # BACKSPACE + 0x0017: 0x0087, # CONTROL + 0x001a: 0x0092, # CONTROL + 0x001b: 0x008f, # CONTROL + 0x0020: 0x0080, # CONTROL + 0x0021: 0x0081, # CONTROL + 0x0022: 0x0082, # CONTROL + 0x0023: 0x0083, # CONTROL + 0x0024: 0x0084, # CONTROL + 0x0025: 0x000a, # LINE FEED + 0x0026: 0x0017, # END OF TRANSMISSION BLOCK + 0x0027: 0x001b, # ESCAPE + 0x0028: 0x0088, # CONTROL + 0x0029: 0x0089, # CONTROL + 0x002a: 0x008a, # CONTROL + 0x002b: 0x008b, # CONTROL + 0x002c: 0x008c, # CONTROL + 0x002d: 0x0005, # ENQUIRY + 0x002e: 0x0006, # ACKNOWLEDGE + 0x002f: 0x0007, # BELL + 0x0030: 0x0090, # CONTROL + 0x0031: 0x0091, # CONTROL + 0x0032: 0x0016, # SYNCHRONOUS IDLE + 0x0033: 0x0093, # CONTROL + 0x0034: 0x0094, # CONTROL + 0x0035: 0x0095, # CONTROL + 0x0036: 0x0096, # CONTROL + 0x0037: 0x0004, # END OF TRANSMISSION + 0x0038: 0x0098, # CONTROL + 0x0039: 0x0099, # CONTROL + 0x003a: 0x009a, # CONTROL + 0x003b: 0x009b, # CONTROL + 0x003c: 0x0014, # DEVICE CONTROL FOUR + 0x003d: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x003e: 0x009e, # CONTROL + 0x003f: 0x001a, # SUBSTITUTE + 0x0040: 0x0020, # SPACE + 0x0041: 0x00a0, # NO-BREAK SPACE + 0x0042: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0043: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0044: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0045: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0046: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0047: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0048: 0x007b, # LEFT CURLY BRACKET + 0x0049: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x004a: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x004b: 0x002e, # FULL STOP + 0x004c: 0x003c, # LESS-THAN SIGN + 0x004d: 0x0028, # LEFT PARENTHESIS + 0x004e: 0x002b, # PLUS SIGN + 0x004f: 0x0021, # EXCLAMATION MARK + 0x0050: 0x0026, # AMPERSAND + 0x0051: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0052: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0053: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0054: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0055: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0056: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0057: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0058: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0059: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x005a: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x005b: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x005c: 0x002a, # ASTERISK + 0x005d: 0x0029, # RIGHT PARENTHESIS + 0x005e: 0x003b, # SEMICOLON + 0x005f: 0x005e, # CIRCUMFLEX ACCENT + 0x0060: 0x002d, # HYPHEN-MINUS + 0x0061: 0x002f, # SOLIDUS + 0x0062: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0063: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0064: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0065: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0066: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x0067: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0068: 0x005b, # LEFT SQUARE BRACKET + 0x0069: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x006a: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x006b: 0x002c, # COMMA + 0x006c: 0x0025, # PERCENT SIGN + 0x006d: 0x005f, # LOW LINE + 0x006e: 0x003e, # GREATER-THAN SIGN + 0x006f: 0x003f, # QUESTION MARK + 0x0070: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x0071: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0072: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0073: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0074: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0075: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x0076: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x0077: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0078: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0079: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x007a: 0x003a, # COLON + 0x007b: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x007c: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x007d: 0x0027, # APOSTROPHE + 0x007e: 0x003d, # EQUALS SIGN + 0x007f: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0080: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x0081: 0x0061, # LATIN SMALL LETTER A + 0x0082: 0x0062, # LATIN SMALL LETTER B + 0x0083: 0x0063, # LATIN SMALL LETTER C + 0x0084: 0x0064, # LATIN SMALL LETTER D + 0x0085: 0x0065, # LATIN SMALL LETTER E + 0x0086: 0x0066, # LATIN SMALL LETTER F + 0x0087: 0x0067, # LATIN SMALL LETTER G + 0x0088: 0x0068, # LATIN SMALL LETTER H + 0x0089: 0x0069, # LATIN SMALL LETTER I + 0x008a: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008b: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008c: 0x007d, # RIGHT CURLY BRACKET + 0x008d: 0x0060, # GRAVE ACCENT + 0x008e: 0x00a6, # BROKEN BAR + 0x008f: 0x00b1, # PLUS-MINUS SIGN + 0x0090: 0x00b0, # DEGREE SIGN + 0x0091: 0x006a, # LATIN SMALL LETTER J + 0x0092: 0x006b, # LATIN SMALL LETTER K + 0x0093: 0x006c, # LATIN SMALL LETTER L + 0x0094: 0x006d, # LATIN SMALL LETTER M + 0x0095: 0x006e, # LATIN SMALL LETTER N + 0x0096: 0x006f, # LATIN SMALL LETTER O + 0x0097: 0x0070, # LATIN SMALL LETTER P + 0x0098: 0x0071, # LATIN SMALL LETTER Q + 0x0099: 0x0072, # LATIN SMALL LETTER R + 0x009a: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x009b: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x009c: 0x00e6, # LATIN SMALL LIGATURE AE + 0x009d: 0x00b8, # CEDILLA + 0x009e: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x00b5, # MICRO SIGN + 0x00a1: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00a2: 0x0073, # LATIN SMALL LETTER S + 0x00a3: 0x0074, # LATIN SMALL LETTER T + 0x00a4: 0x0075, # LATIN SMALL LETTER U + 0x00a5: 0x0076, # LATIN SMALL LETTER V + 0x00a6: 0x0077, # LATIN SMALL LETTER W + 0x00a7: 0x0078, # LATIN SMALL LETTER X + 0x00a8: 0x0079, # LATIN SMALL LETTER Y + 0x00a9: 0x007a, # LATIN SMALL LETTER Z + 0x00aa: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ab: 0x00bf, # INVERTED QUESTION MARK + 0x00ac: 0x005d, # RIGHT SQUARE BRACKET + 0x00ad: 0x0024, # DOLLAR SIGN + 0x00ae: 0x0040, # COMMERCIAL AT + 0x00af: 0x00ae, # REGISTERED SIGN + 0x00b0: 0x00a2, # CENT SIGN + 0x00b1: 0x00a3, # POUND SIGN + 0x00b2: 0x00a5, # YEN SIGN + 0x00b3: 0x00b7, # MIDDLE DOT + 0x00b4: 0x00a9, # COPYRIGHT SIGN + 0x00b5: 0x00a7, # SECTION SIGN + 0x00b7: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00b8: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00b9: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ba: 0x00ac, # NOT SIGN + 0x00bb: 0x007c, # VERTICAL LINE + 0x00bc: 0x00af, # MACRON + 0x00bd: 0x00a8, # DIAERESIS + 0x00be: 0x00b4, # ACUTE ACCENT + 0x00bf: 0x00d7, # MULTIPLICATION SIGN + 0x00c0: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00c1: 0x0041, # LATIN CAPITAL LETTER A + 0x00c2: 0x0042, # LATIN CAPITAL LETTER B + 0x00c3: 0x0043, # LATIN CAPITAL LETTER C + 0x00c4: 0x0044, # LATIN CAPITAL LETTER D + 0x00c5: 0x0045, # LATIN CAPITAL LETTER E + 0x00c6: 0x0046, # LATIN CAPITAL LETTER F + 0x00c7: 0x0047, # LATIN CAPITAL LETTER G + 0x00c8: 0x0048, # LATIN CAPITAL LETTER H + 0x00c9: 0x0049, # LATIN CAPITAL LETTER I + 0x00ca: 0x00ad, # SOFT HYPHEN + 0x00cb: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00cc: 0x007e, # TILDE + 0x00cd: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x00ce: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00cf: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00d0: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00d1: 0x004a, # LATIN CAPITAL LETTER J + 0x00d2: 0x004b, # LATIN CAPITAL LETTER K + 0x00d3: 0x004c, # LATIN CAPITAL LETTER L + 0x00d4: 0x004d, # LATIN CAPITAL LETTER M + 0x00d5: 0x004e, # LATIN CAPITAL LETTER N + 0x00d6: 0x004f, # LATIN CAPITAL LETTER O + 0x00d7: 0x0050, # LATIN CAPITAL LETTER P + 0x00d8: 0x0051, # LATIN CAPITAL LETTER Q + 0x00d9: 0x0052, # LATIN CAPITAL LETTER R + 0x00da: 0x00b9, # SUPERSCRIPT ONE + 0x00db: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x005c, # REVERSE SOLIDUS + 0x00dd: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x00de: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00df: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00e0: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00e1: 0x00f7, # DIVISION SIGN + 0x00e2: 0x0053, # LATIN CAPITAL LETTER S + 0x00e3: 0x0054, # LATIN CAPITAL LETTER T + 0x00e4: 0x0055, # LATIN CAPITAL LETTER U + 0x00e5: 0x0056, # LATIN CAPITAL LETTER V + 0x00e6: 0x0057, # LATIN CAPITAL LETTER W + 0x00e7: 0x0058, # LATIN CAPITAL LETTER X + 0x00e8: 0x0059, # LATIN CAPITAL LETTER Y + 0x00e9: 0x005a, # LATIN CAPITAL LETTER Z + 0x00ea: 0x00b2, # SUPERSCRIPT TWO + 0x00eb: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00ec: 0x0023, # NUMBER SIGN + 0x00ed: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00f0: 0x0030, # DIGIT ZERO + 0x00f1: 0x0031, # DIGIT ONE + 0x00f2: 0x0032, # DIGIT TWO + 0x00f3: 0x0033, # DIGIT THREE + 0x00f4: 0x0034, # DIGIT FOUR + 0x00f5: 0x0035, # DIGIT FIVE + 0x00f6: 0x0036, # DIGIT SIX + 0x00f7: 0x0037, # DIGIT SEVEN + 0x00f8: 0x0038, # DIGIT EIGHT + 0x00f9: 0x0039, # DIGIT NINE + 0x00fa: 0x00b3, # SUPERSCRIPT THREE + 0x00fb: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0022, # QUOTATION MARK + 0x00fd: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00fe: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ff: 0x009f, # CONTROL +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1140.py b/lib-python/2.2/encodings/cp1140.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1140.py @@ -0,0 +1,45 @@ +""" Python Character Mapping Codec for cp1140 + +Written by Brian Quinlan(brian at sweetapp.com). NO WARRANTY. +""" + +import codecs +import copy +import cp037 + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = copy.copy(cp037.decoding_map) + +decoding_map.update({ + 0x009f: 0x20ac # EURO SIGN +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) + diff --git a/lib-python/2.2/encodings/cp1250.py b/lib-python/2.2/encodings/cp1250.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1250.py @@ -0,0 +1,123 @@ +""" Python Character Mapping Codec generated from 'CP1250.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: None, # UNDEFINED + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: None, # UNDEFINED + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x008d: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x008e: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x008f: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: None, # UNDEFINED + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x009d: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009e: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x009f: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a1: 0x02c7, # CARON + 0x00a2: 0x02d8, # BREVE + 0x00a3: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00a5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00aa: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00af: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00b2: 0x02db, # OGONEK + 0x00b3: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x00b9: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00ba: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00bc: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x00bd: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00be: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x00bf: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00c0: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00c3: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c5: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x00c6: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00cc: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00cf: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d0: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00d2: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d5: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x00d8: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00d9: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00db: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00de: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00e0: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00e3: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00e5: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x00e6: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00ec: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00ef: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00f0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00f1: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00f2: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00f5: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x00f8: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00f9: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fe: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ff: 0x02d9, # DOT ABOVE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1251.py b/lib-python/2.2/encodings/cp1251.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1251.py @@ -0,0 +1,157 @@ +""" Python Character Mapping Codec generated from 'CP1251.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0081: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x20ac, # EURO SIGN + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x008d: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x008e: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x008f: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x0090: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: None, # UNDEFINED + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x009d: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x009e: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x009f: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x00a1: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00a2: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00a3: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x00a5: 0x0490, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x00a8: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00aa: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00af: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00b2: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b3: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b4: 0x0491, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x00b8: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00b9: 0x2116, # NUMERO SIGN + 0x00ba: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00bc: 0x0458, # CYRILLIC SMALL LETTER JE + 0x00bd: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x00be: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x00bf: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00c0: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00c1: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00c2: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00c3: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00c4: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00c5: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00c6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00c7: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00c8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00c9: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00ca: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00cb: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00cc: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00cd: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00ce: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00cf: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00d0: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00d1: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00d2: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00d3: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00d4: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00d5: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00d6: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00d7: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00d8: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00d9: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00da: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00db: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00dc: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00dd: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00de: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x00df: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00e1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00e2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00e3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00e4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00e5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00e6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00e7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00e8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00e9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00ea: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00eb: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ec: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ed: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ee: 0x043e, # CYRILLIC SMALL LETTER O + 0x00ef: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00f0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00f1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00f2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00f3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00f4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00f5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00f6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00f7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00f8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00fb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00fc: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00fd: 0x044d, # CYRILLIC SMALL LETTER E + 0x00fe: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ff: 0x044f, # CYRILLIC SMALL LETTER YA +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1252.py b/lib-python/2.2/encodings/cp1252.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1252.py @@ -0,0 +1,76 @@ +""" Python Character Mapping Codec generated from 'CP1252.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x008d: None, # UNDEFINED + 0x008e: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x02dc, # SMALL TILDE + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x0153, # LATIN SMALL LIGATURE OE + 0x009d: None, # UNDEFINED + 0x009e: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1253.py b/lib-python/2.2/encodings/cp1253.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1253.py @@ -0,0 +1,151 @@ +""" Python Character Mapping Codec generated from 'CP1253.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: None, # UNDEFINED + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: None, # UNDEFINED + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: None, # UNDEFINED + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: None, # UNDEFINED + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: None, # UNDEFINED + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: None, # UNDEFINED + 0x009d: None, # UNDEFINED + 0x009e: None, # UNDEFINED + 0x009f: None, # UNDEFINED + 0x00a1: 0x0385, # GREEK DIALYTIKA TONOS + 0x00a2: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00aa: None, # UNDEFINED + 0x00af: 0x2015, # HORIZONTAL BAR + 0x00b4: 0x0384, # GREEK TONOS + 0x00b8: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00b9: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ba: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00bc: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00be: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00bf: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00c0: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00c1: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00c2: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00c3: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00c4: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00c5: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00c6: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00c7: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00c8: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00c9: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ca: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00cb: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00cc: 0x039c, # GREEK CAPITAL LETTER MU + 0x00cd: 0x039d, # GREEK CAPITAL LETTER NU + 0x00ce: 0x039e, # GREEK CAPITAL LETTER XI + 0x00cf: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00d0: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00d1: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00d2: None, # UNDEFINED + 0x00d3: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d4: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d5: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d6: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d7: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d8: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d9: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00da: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00db: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00dc: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00dd: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00de: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00df: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e0: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00e1: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e2: 0x03b2, # GREEK SMALL LETTER BETA + 0x00e3: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00e4: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00e5: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00e6: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e7: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e8: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e9: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00ea: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00eb: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00ec: 0x03bc, # GREEK SMALL LETTER MU + 0x00ed: 0x03bd, # GREEK SMALL LETTER NU + 0x00ee: 0x03be, # GREEK SMALL LETTER XI + 0x00ef: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00f0: 0x03c0, # GREEK SMALL LETTER PI + 0x00f1: 0x03c1, # GREEK SMALL LETTER RHO + 0x00f2: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00f3: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00f4: 0x03c4, # GREEK SMALL LETTER TAU + 0x00f5: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f6: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f7: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f8: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f9: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fa: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00fd: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00fe: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ff: None, # UNDEFINED +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1254.py b/lib-python/2.2/encodings/cp1254.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1254.py @@ -0,0 +1,82 @@ +""" Python Character Mapping Codec generated from 'CP1254.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x02dc, # SMALL TILDE + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x0153, # LATIN SMALL LIGATURE OE + 0x009d: None, # UNDEFINED + 0x009e: None, # UNDEFINED + 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00d0: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00dd: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x00de: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00f0: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00fd: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00fe: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1255.py b/lib-python/2.2/encodings/cp1255.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1255.py @@ -0,0 +1,143 @@ +""" Python Character Mapping Codec generated from 'CP1255.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: None, # UNDEFINED + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: None, # UNDEFINED + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x02dc, # SMALL TILDE + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: None, # UNDEFINED + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: None, # UNDEFINED + 0x009d: None, # UNDEFINED + 0x009e: None, # UNDEFINED + 0x009f: None, # UNDEFINED + 0x00a4: 0x20aa, # NEW SHEQEL SIGN + 0x00aa: 0x00d7, # MULTIPLICATION SIGN + 0x00ba: 0x00f7, # DIVISION SIGN + 0x00c0: 0x05b0, # HEBREW POINT SHEVA + 0x00c1: 0x05b1, # HEBREW POINT HATAF SEGOL + 0x00c2: 0x05b2, # HEBREW POINT HATAF PATAH + 0x00c3: 0x05b3, # HEBREW POINT HATAF QAMATS + 0x00c4: 0x05b4, # HEBREW POINT HIRIQ + 0x00c5: 0x05b5, # HEBREW POINT TSERE + 0x00c6: 0x05b6, # HEBREW POINT SEGOL + 0x00c7: 0x05b7, # HEBREW POINT PATAH + 0x00c8: 0x05b8, # HEBREW POINT QAMATS + 0x00c9: 0x05b9, # HEBREW POINT HOLAM + 0x00ca: None, # UNDEFINED + 0x00cb: 0x05bb, # HEBREW POINT QUBUTS + 0x00cc: 0x05bc, # HEBREW POINT DAGESH OR MAPIQ + 0x00cd: 0x05bd, # HEBREW POINT METEG + 0x00ce: 0x05be, # HEBREW PUNCTUATION MAQAF + 0x00cf: 0x05bf, # HEBREW POINT RAFE + 0x00d0: 0x05c0, # HEBREW PUNCTUATION PASEQ + 0x00d1: 0x05c1, # HEBREW POINT SHIN DOT + 0x00d2: 0x05c2, # HEBREW POINT SIN DOT + 0x00d3: 0x05c3, # HEBREW PUNCTUATION SOF PASUQ + 0x00d4: 0x05f0, # HEBREW LIGATURE YIDDISH DOUBLE VAV + 0x00d5: 0x05f1, # HEBREW LIGATURE YIDDISH VAV YOD + 0x00d6: 0x05f2, # HEBREW LIGATURE YIDDISH DOUBLE YOD + 0x00d7: 0x05f3, # HEBREW PUNCTUATION GERESH + 0x00d8: 0x05f4, # HEBREW PUNCTUATION GERSHAYIM + 0x00d9: None, # UNDEFINED + 0x00da: None, # UNDEFINED + 0x00db: None, # UNDEFINED + 0x00dc: None, # UNDEFINED + 0x00dd: None, # UNDEFINED + 0x00de: None, # UNDEFINED + 0x00df: None, # UNDEFINED + 0x00e0: 0x05d0, # HEBREW LETTER ALEF + 0x00e1: 0x05d1, # HEBREW LETTER BET + 0x00e2: 0x05d2, # HEBREW LETTER GIMEL + 0x00e3: 0x05d3, # HEBREW LETTER DALET + 0x00e4: 0x05d4, # HEBREW LETTER HE + 0x00e5: 0x05d5, # HEBREW LETTER VAV + 0x00e6: 0x05d6, # HEBREW LETTER ZAYIN + 0x00e7: 0x05d7, # HEBREW LETTER HET + 0x00e8: 0x05d8, # HEBREW LETTER TET + 0x00e9: 0x05d9, # HEBREW LETTER YOD + 0x00ea: 0x05da, # HEBREW LETTER FINAL KAF + 0x00eb: 0x05db, # HEBREW LETTER KAF + 0x00ec: 0x05dc, # HEBREW LETTER LAMED + 0x00ed: 0x05dd, # HEBREW LETTER FINAL MEM + 0x00ee: 0x05de, # HEBREW LETTER MEM + 0x00ef: 0x05df, # HEBREW LETTER FINAL NUN + 0x00f0: 0x05e0, # HEBREW LETTER NUN + 0x00f1: 0x05e1, # HEBREW LETTER SAMEKH + 0x00f2: 0x05e2, # HEBREW LETTER AYIN + 0x00f3: 0x05e3, # HEBREW LETTER FINAL PE + 0x00f4: 0x05e4, # HEBREW LETTER PE + 0x00f5: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x00f6: 0x05e6, # HEBREW LETTER TSADI + 0x00f7: 0x05e7, # HEBREW LETTER QOF + 0x00f8: 0x05e8, # HEBREW LETTER RESH + 0x00f9: 0x05e9, # HEBREW LETTER SHIN + 0x00fa: 0x05ea, # HEBREW LETTER TAV + 0x00fb: None, # UNDEFINED + 0x00fc: None, # UNDEFINED + 0x00fd: 0x200e, # LEFT-TO-RIGHT MARK + 0x00fe: 0x200f, # RIGHT-TO-LEFT MARK + 0x00ff: None, # UNDEFINED +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1256.py b/lib-python/2.2/encodings/cp1256.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1256.py @@ -0,0 +1,129 @@ +""" Python Character Mapping Codec generated from 'CP1256.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: 0x067e, # ARABIC LETTER PEH + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0679, # ARABIC LETTER TTEH + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x008d: 0x0686, # ARABIC LETTER TCHEH + 0x008e: 0x0698, # ARABIC LETTER JEH + 0x008f: 0x0688, # ARABIC LETTER DDAL + 0x0090: 0x06af, # ARABIC LETTER GAF + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x06a9, # ARABIC LETTER KEHEH + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0691, # ARABIC LETTER RREH + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x0153, # LATIN SMALL LIGATURE OE + 0x009d: 0x200c, # ZERO WIDTH NON-JOINER + 0x009e: 0x200d, # ZERO WIDTH JOINER + 0x009f: 0x06ba, # ARABIC LETTER NOON GHUNNA + 0x00a1: 0x060c, # ARABIC COMMA + 0x00aa: 0x06be, # ARABIC LETTER HEH DOACHASHMEE + 0x00ba: 0x061b, # ARABIC SEMICOLON + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x06c1, # ARABIC LETTER HEH GOAL + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d8: 0x0637, # ARABIC LETTER TAH + 0x00d9: 0x0638, # ARABIC LETTER ZAH + 0x00da: 0x0639, # ARABIC LETTER AIN + 0x00db: 0x063a, # ARABIC LETTER GHAIN + 0x00dc: 0x0640, # ARABIC TATWEEL + 0x00dd: 0x0641, # ARABIC LETTER FEH + 0x00de: 0x0642, # ARABIC LETTER QAF + 0x00df: 0x0643, # ARABIC LETTER KAF + 0x00e1: 0x0644, # ARABIC LETTER LAM + 0x00e3: 0x0645, # ARABIC LETTER MEEM + 0x00e4: 0x0646, # ARABIC LETTER NOON + 0x00e5: 0x0647, # ARABIC LETTER HEH + 0x00e6: 0x0648, # ARABIC LETTER WAW + 0x00ec: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ed: 0x064a, # ARABIC LETTER YEH + 0x00f0: 0x064b, # ARABIC FATHATAN + 0x00f1: 0x064c, # ARABIC DAMMATAN + 0x00f2: 0x064d, # ARABIC KASRATAN + 0x00f3: 0x064e, # ARABIC FATHA + 0x00f5: 0x064f, # ARABIC DAMMA + 0x00f6: 0x0650, # ARABIC KASRA + 0x00f8: 0x0651, # ARABIC SHADDA + 0x00fa: 0x0652, # ARABIC SUKUN + 0x00fd: 0x200e, # LEFT-TO-RIGHT MARK + 0x00fe: 0x200f, # RIGHT-TO-LEFT MARK + 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1257.py b/lib-python/2.2/encodings/cp1257.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1257.py @@ -0,0 +1,131 @@ +""" Python Character Mapping Codec generated from 'CP1257.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: None, # UNDEFINED + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: None, # UNDEFINED + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: None, # UNDEFINED + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: None, # UNDEFINED + 0x008d: 0x00a8, # DIAERESIS + 0x008e: 0x02c7, # CARON + 0x008f: 0x00b8, # CEDILLA + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: None, # UNDEFINED + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: None, # UNDEFINED + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: None, # UNDEFINED + 0x009d: 0x00af, # MACRON + 0x009e: 0x02db, # OGONEK + 0x009f: None, # UNDEFINED + 0x00a1: None, # UNDEFINED + 0x00a5: None, # UNDEFINED + 0x00a8: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00aa: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x00af: 0x00c6, # LATIN CAPITAL LETTER AE + 0x00b8: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x00ba: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x00bf: 0x00e6, # LATIN SMALL LETTER AE + 0x00c0: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00c1: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00c2: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00c3: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x00c6: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00c7: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x00cb: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00cc: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x00cd: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00ce: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00cf: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00d0: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00d1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00d2: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00d4: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00d8: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00d9: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00da: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x00db: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00dd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00de: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00e0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00e1: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00e2: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x00e3: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x00e6: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00e7: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00eb: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00ec: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x00ed: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ee: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x00ef: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00f0: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00f1: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00f2: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00f4: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x00f8: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00f9: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x00fa: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x00fb: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00fd: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00fe: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00ff: 0x02d9, # DOT ABOVE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp1258.py b/lib-python/2.2/encodings/cp1258.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp1258.py @@ -0,0 +1,90 @@ +""" Python Character Mapping Codec generated from 'CP1258.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: None, # UNDEFINED + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x02dc, # SMALL TILDE + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: None, # UNDEFINED + 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x009c: 0x0153, # LATIN SMALL LIGATURE OE + 0x009d: None, # UNDEFINED + 0x009e: None, # UNDEFINED + 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00c3: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00cc: 0x0300, # COMBINING GRAVE ACCENT + 0x00d0: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x0309, # COMBINING HOOK ABOVE + 0x00d5: 0x01a0, # LATIN CAPITAL LETTER O WITH HORN + 0x00dd: 0x01af, # LATIN CAPITAL LETTER U WITH HORN + 0x00de: 0x0303, # COMBINING TILDE + 0x00e3: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00ec: 0x0301, # COMBINING ACUTE ACCENT + 0x00f0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00f2: 0x0323, # COMBINING DOT BELOW + 0x00f5: 0x01a1, # LATIN SMALL LETTER O WITH HORN + 0x00fd: 0x01b0, # LATIN SMALL LETTER U WITH HORN + 0x00fe: 0x20ab, # DONG SIGN +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp424.py b/lib-python/2.2/encodings/cp424.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp424.py @@ -0,0 +1,280 @@ +""" Python Character Mapping Codec generated from 'CP424.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0004: 0x009c, # SELECT + 0x0005: 0x0009, # HORIZONTAL TABULATION + 0x0006: 0x0086, # REQUIRED NEW LINE + 0x0007: 0x007f, # DELETE + 0x0008: 0x0097, # GRAPHIC ESCAPE + 0x0009: 0x008d, # SUPERSCRIPT + 0x000a: 0x008e, # REPEAT + 0x0014: 0x009d, # RESTORE/ENABLE PRESENTATION + 0x0015: 0x0085, # NEW LINE + 0x0016: 0x0008, # BACKSPACE + 0x0017: 0x0087, # PROGRAM OPERATOR COMMUNICATION + 0x001a: 0x0092, # UNIT BACK SPACE + 0x001b: 0x008f, # CUSTOMER USE ONE + 0x0020: 0x0080, # DIGIT SELECT + 0x0021: 0x0081, # START OF SIGNIFICANCE + 0x0022: 0x0082, # FIELD SEPARATOR + 0x0023: 0x0083, # WORD UNDERSCORE + 0x0024: 0x0084, # BYPASS OR INHIBIT PRESENTATION + 0x0025: 0x000a, # LINE FEED + 0x0026: 0x0017, # END OF TRANSMISSION BLOCK + 0x0027: 0x001b, # ESCAPE + 0x0028: 0x0088, # SET ATTRIBUTE + 0x0029: 0x0089, # START FIELD EXTENDED + 0x002a: 0x008a, # SET MODE OR SWITCH + 0x002b: 0x008b, # CONTROL SEQUENCE PREFIX + 0x002c: 0x008c, # MODIFY FIELD ATTRIBUTE + 0x002d: 0x0005, # ENQUIRY + 0x002e: 0x0006, # ACKNOWLEDGE + 0x002f: 0x0007, # BELL + 0x0030: 0x0090, # + 0x0031: 0x0091, # + 0x0032: 0x0016, # SYNCHRONOUS IDLE + 0x0033: 0x0093, # INDEX RETURN + 0x0034: 0x0094, # PRESENTATION POSITION + 0x0035: 0x0095, # TRANSPARENT + 0x0036: 0x0096, # NUMERIC BACKSPACE + 0x0037: 0x0004, # END OF TRANSMISSION + 0x0038: 0x0098, # SUBSCRIPT + 0x0039: 0x0099, # INDENT TABULATION + 0x003a: 0x009a, # REVERSE FORM FEED + 0x003b: 0x009b, # CUSTOMER USE THREE + 0x003c: 0x0014, # DEVICE CONTROL FOUR + 0x003d: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x003e: 0x009e, # + 0x003f: 0x001a, # SUBSTITUTE + 0x0040: 0x0020, # SPACE + 0x0041: 0x05d0, # HEBREW LETTER ALEF + 0x0042: 0x05d1, # HEBREW LETTER BET + 0x0043: 0x05d2, # HEBREW LETTER GIMEL + 0x0044: 0x05d3, # HEBREW LETTER DALET + 0x0045: 0x05d4, # HEBREW LETTER HE + 0x0046: 0x05d5, # HEBREW LETTER VAV + 0x0047: 0x05d6, # HEBREW LETTER ZAYIN + 0x0048: 0x05d7, # HEBREW LETTER HET + 0x0049: 0x05d8, # HEBREW LETTER TET + 0x004a: 0x00a2, # CENT SIGN + 0x004b: 0x002e, # FULL STOP + 0x004c: 0x003c, # LESS-THAN SIGN + 0x004d: 0x0028, # LEFT PARENTHESIS + 0x004e: 0x002b, # PLUS SIGN + 0x004f: 0x007c, # VERTICAL LINE + 0x0050: 0x0026, # AMPERSAND + 0x0051: 0x05d9, # HEBREW LETTER YOD + 0x0052: 0x05da, # HEBREW LETTER FINAL KAF + 0x0053: 0x05db, # HEBREW LETTER KAF + 0x0054: 0x05dc, # HEBREW LETTER LAMED + 0x0055: 0x05dd, # HEBREW LETTER FINAL MEM + 0x0056: 0x05de, # HEBREW LETTER MEM + 0x0057: 0x05df, # HEBREW LETTER FINAL NUN + 0x0058: 0x05e0, # HEBREW LETTER NUN + 0x0059: 0x05e1, # HEBREW LETTER SAMEKH + 0x005a: 0x0021, # EXCLAMATION MARK + 0x005b: 0x0024, # DOLLAR SIGN + 0x005c: 0x002a, # ASTERISK + 0x005d: 0x0029, # RIGHT PARENTHESIS + 0x005e: 0x003b, # SEMICOLON + 0x005f: 0x00ac, # NOT SIGN + 0x0060: 0x002d, # HYPHEN-MINUS + 0x0061: 0x002f, # SOLIDUS + 0x0062: 0x05e2, # HEBREW LETTER AYIN + 0x0063: 0x05e3, # HEBREW LETTER FINAL PE + 0x0064: 0x05e4, # HEBREW LETTER PE + 0x0065: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0066: 0x05e6, # HEBREW LETTER TSADI + 0x0067: 0x05e7, # HEBREW LETTER QOF + 0x0068: 0x05e8, # HEBREW LETTER RESH + 0x0069: 0x05e9, # HEBREW LETTER SHIN + 0x006a: 0x00a6, # BROKEN BAR + 0x006b: 0x002c, # COMMA + 0x006c: 0x0025, # PERCENT SIGN + 0x006d: 0x005f, # LOW LINE + 0x006e: 0x003e, # GREATER-THAN SIGN + 0x006f: 0x003f, # QUESTION MARK + 0x0070: None, # UNDEFINED + 0x0071: 0x05ea, # HEBREW LETTER TAV + 0x0072: None, # UNDEFINED + 0x0073: None, # UNDEFINED + 0x0074: 0x00a0, # NO-BREAK SPACE + 0x0075: None, # UNDEFINED + 0x0076: None, # UNDEFINED + 0x0077: None, # UNDEFINED + 0x0078: 0x2017, # DOUBLE LOW LINE + 0x0079: 0x0060, # GRAVE ACCENT + 0x007a: 0x003a, # COLON + 0x007b: 0x0023, # NUMBER SIGN + 0x007c: 0x0040, # COMMERCIAL AT + 0x007d: 0x0027, # APOSTROPHE + 0x007e: 0x003d, # EQUALS SIGN + 0x007f: 0x0022, # QUOTATION MARK + 0x0080: None, # UNDEFINED + 0x0081: 0x0061, # LATIN SMALL LETTER A + 0x0082: 0x0062, # LATIN SMALL LETTER B + 0x0083: 0x0063, # LATIN SMALL LETTER C + 0x0084: 0x0064, # LATIN SMALL LETTER D + 0x0085: 0x0065, # LATIN SMALL LETTER E + 0x0086: 0x0066, # LATIN SMALL LETTER F + 0x0087: 0x0067, # LATIN SMALL LETTER G + 0x0088: 0x0068, # LATIN SMALL LETTER H + 0x0089: 0x0069, # LATIN SMALL LETTER I + 0x008a: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008b: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008c: None, # UNDEFINED + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: 0x00b1, # PLUS-MINUS SIGN + 0x0090: 0x00b0, # DEGREE SIGN + 0x0091: 0x006a, # LATIN SMALL LETTER J + 0x0092: 0x006b, # LATIN SMALL LETTER K + 0x0093: 0x006c, # LATIN SMALL LETTER L + 0x0094: 0x006d, # LATIN SMALL LETTER M + 0x0095: 0x006e, # LATIN SMALL LETTER N + 0x0096: 0x006f, # LATIN SMALL LETTER O + 0x0097: 0x0070, # LATIN SMALL LETTER P + 0x0098: 0x0071, # LATIN SMALL LETTER Q + 0x0099: 0x0072, # LATIN SMALL LETTER R + 0x009a: None, # UNDEFINED + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0x00b8, # CEDILLA + 0x009e: None, # UNDEFINED + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x00b5, # MICRO SIGN + 0x00a1: 0x007e, # TILDE + 0x00a2: 0x0073, # LATIN SMALL LETTER S + 0x00a3: 0x0074, # LATIN SMALL LETTER T + 0x00a4: 0x0075, # LATIN SMALL LETTER U + 0x00a5: 0x0076, # LATIN SMALL LETTER V + 0x00a6: 0x0077, # LATIN SMALL LETTER W + 0x00a7: 0x0078, # LATIN SMALL LETTER X + 0x00a8: 0x0079, # LATIN SMALL LETTER Y + 0x00a9: 0x007a, # LATIN SMALL LETTER Z + 0x00aa: None, # UNDEFINED + 0x00ab: None, # UNDEFINED + 0x00ac: None, # UNDEFINED + 0x00ad: None, # UNDEFINED + 0x00ae: None, # UNDEFINED + 0x00af: 0x00ae, # REGISTERED SIGN + 0x00b0: 0x005e, # CIRCUMFLEX ACCENT + 0x00b1: 0x00a3, # POUND SIGN + 0x00b2: 0x00a5, # YEN SIGN + 0x00b3: 0x00b7, # MIDDLE DOT + 0x00b4: 0x00a9, # COPYRIGHT SIGN + 0x00b5: 0x00a7, # SECTION SIGN + 0x00b7: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00b8: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00b9: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ba: 0x005b, # LEFT SQUARE BRACKET + 0x00bb: 0x005d, # RIGHT SQUARE BRACKET + 0x00bc: 0x00af, # MACRON + 0x00bd: 0x00a8, # DIAERESIS + 0x00be: 0x00b4, # ACUTE ACCENT + 0x00bf: 0x00d7, # MULTIPLICATION SIGN + 0x00c0: 0x007b, # LEFT CURLY BRACKET + 0x00c1: 0x0041, # LATIN CAPITAL LETTER A + 0x00c2: 0x0042, # LATIN CAPITAL LETTER B + 0x00c3: 0x0043, # LATIN CAPITAL LETTER C + 0x00c4: 0x0044, # LATIN CAPITAL LETTER D + 0x00c5: 0x0045, # LATIN CAPITAL LETTER E + 0x00c6: 0x0046, # LATIN CAPITAL LETTER F + 0x00c7: 0x0047, # LATIN CAPITAL LETTER G + 0x00c8: 0x0048, # LATIN CAPITAL LETTER H + 0x00c9: 0x0049, # LATIN CAPITAL LETTER I + 0x00ca: 0x00ad, # SOFT HYPHEN + 0x00cb: None, # UNDEFINED + 0x00cc: None, # UNDEFINED + 0x00cd: None, # UNDEFINED + 0x00ce: None, # UNDEFINED + 0x00cf: None, # UNDEFINED + 0x00d0: 0x007d, # RIGHT CURLY BRACKET + 0x00d1: 0x004a, # LATIN CAPITAL LETTER J + 0x00d2: 0x004b, # LATIN CAPITAL LETTER K + 0x00d3: 0x004c, # LATIN CAPITAL LETTER L + 0x00d4: 0x004d, # LATIN CAPITAL LETTER M + 0x00d5: 0x004e, # LATIN CAPITAL LETTER N + 0x00d6: 0x004f, # LATIN CAPITAL LETTER O + 0x00d7: 0x0050, # LATIN CAPITAL LETTER P + 0x00d8: 0x0051, # LATIN CAPITAL LETTER Q + 0x00d9: 0x0052, # LATIN CAPITAL LETTER R + 0x00da: 0x00b9, # SUPERSCRIPT ONE + 0x00db: None, # UNDEFINED + 0x00dc: None, # UNDEFINED + 0x00dd: None, # UNDEFINED + 0x00de: None, # UNDEFINED + 0x00df: None, # UNDEFINED + 0x00e0: 0x005c, # REVERSE SOLIDUS + 0x00e1: 0x00f7, # DIVISION SIGN + 0x00e2: 0x0053, # LATIN CAPITAL LETTER S + 0x00e3: 0x0054, # LATIN CAPITAL LETTER T + 0x00e4: 0x0055, # LATIN CAPITAL LETTER U + 0x00e5: 0x0056, # LATIN CAPITAL LETTER V + 0x00e6: 0x0057, # LATIN CAPITAL LETTER W + 0x00e7: 0x0058, # LATIN CAPITAL LETTER X + 0x00e8: 0x0059, # LATIN CAPITAL LETTER Y + 0x00e9: 0x005a, # LATIN CAPITAL LETTER Z + 0x00ea: 0x00b2, # SUPERSCRIPT TWO + 0x00eb: None, # UNDEFINED + 0x00ec: None, # UNDEFINED + 0x00ed: None, # UNDEFINED + 0x00ee: None, # UNDEFINED + 0x00ef: None, # UNDEFINED + 0x00f0: 0x0030, # DIGIT ZERO + 0x00f1: 0x0031, # DIGIT ONE + 0x00f2: 0x0032, # DIGIT TWO + 0x00f3: 0x0033, # DIGIT THREE + 0x00f4: 0x0034, # DIGIT FOUR + 0x00f5: 0x0035, # DIGIT FIVE + 0x00f6: 0x0036, # DIGIT SIX + 0x00f7: 0x0037, # DIGIT SEVEN + 0x00f8: 0x0038, # DIGIT EIGHT + 0x00f9: 0x0039, # DIGIT NINE + 0x00fa: 0x00b3, # SUPERSCRIPT THREE + 0x00fb: None, # UNDEFINED + 0x00fc: None, # UNDEFINED + 0x00fd: None, # UNDEFINED + 0x00fe: None, # UNDEFINED + 0x00ff: 0x009f, # EIGHT ONES +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp437.py b/lib-python/2.2/encodings/cp437.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp437.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP437.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp500.py b/lib-python/2.2/encodings/cp500.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp500.py @@ -0,0 +1,280 @@ +""" Python Character Mapping Codec generated from 'CP500.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0004: 0x009c, # CONTROL + 0x0005: 0x0009, # HORIZONTAL TABULATION + 0x0006: 0x0086, # CONTROL + 0x0007: 0x007f, # DELETE + 0x0008: 0x0097, # CONTROL + 0x0009: 0x008d, # CONTROL + 0x000a: 0x008e, # CONTROL + 0x0014: 0x009d, # CONTROL + 0x0015: 0x0085, # CONTROL + 0x0016: 0x0008, # BACKSPACE + 0x0017: 0x0087, # CONTROL + 0x001a: 0x0092, # CONTROL + 0x001b: 0x008f, # CONTROL + 0x0020: 0x0080, # CONTROL + 0x0021: 0x0081, # CONTROL + 0x0022: 0x0082, # CONTROL + 0x0023: 0x0083, # CONTROL + 0x0024: 0x0084, # CONTROL + 0x0025: 0x000a, # LINE FEED + 0x0026: 0x0017, # END OF TRANSMISSION BLOCK + 0x0027: 0x001b, # ESCAPE + 0x0028: 0x0088, # CONTROL + 0x0029: 0x0089, # CONTROL + 0x002a: 0x008a, # CONTROL + 0x002b: 0x008b, # CONTROL + 0x002c: 0x008c, # CONTROL + 0x002d: 0x0005, # ENQUIRY + 0x002e: 0x0006, # ACKNOWLEDGE + 0x002f: 0x0007, # BELL + 0x0030: 0x0090, # CONTROL + 0x0031: 0x0091, # CONTROL + 0x0032: 0x0016, # SYNCHRONOUS IDLE + 0x0033: 0x0093, # CONTROL + 0x0034: 0x0094, # CONTROL + 0x0035: 0x0095, # CONTROL + 0x0036: 0x0096, # CONTROL + 0x0037: 0x0004, # END OF TRANSMISSION + 0x0038: 0x0098, # CONTROL + 0x0039: 0x0099, # CONTROL + 0x003a: 0x009a, # CONTROL + 0x003b: 0x009b, # CONTROL + 0x003c: 0x0014, # DEVICE CONTROL FOUR + 0x003d: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x003e: 0x009e, # CONTROL + 0x003f: 0x001a, # SUBSTITUTE + 0x0040: 0x0020, # SPACE + 0x0041: 0x00a0, # NO-BREAK SPACE + 0x0042: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0043: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0044: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0045: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0046: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0047: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0048: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0049: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x004a: 0x005b, # LEFT SQUARE BRACKET + 0x004b: 0x002e, # FULL STOP + 0x004c: 0x003c, # LESS-THAN SIGN + 0x004d: 0x0028, # LEFT PARENTHESIS + 0x004e: 0x002b, # PLUS SIGN + 0x004f: 0x0021, # EXCLAMATION MARK + 0x0050: 0x0026, # AMPERSAND + 0x0051: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0052: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0053: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0054: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0055: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0056: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0057: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0058: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0059: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x005a: 0x005d, # RIGHT SQUARE BRACKET + 0x005b: 0x0024, # DOLLAR SIGN + 0x005c: 0x002a, # ASTERISK + 0x005d: 0x0029, # RIGHT PARENTHESIS + 0x005e: 0x003b, # SEMICOLON + 0x005f: 0x005e, # CIRCUMFLEX ACCENT + 0x0060: 0x002d, # HYPHEN-MINUS + 0x0061: 0x002f, # SOLIDUS + 0x0062: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0063: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0064: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0065: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0066: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x0067: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0068: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0069: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x006a: 0x00a6, # BROKEN BAR + 0x006b: 0x002c, # COMMA + 0x006c: 0x0025, # PERCENT SIGN + 0x006d: 0x005f, # LOW LINE + 0x006e: 0x003e, # GREATER-THAN SIGN + 0x006f: 0x003f, # QUESTION MARK + 0x0070: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x0071: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0072: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0073: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0074: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0075: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x0076: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x0077: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0078: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0079: 0x0060, # GRAVE ACCENT + 0x007a: 0x003a, # COLON + 0x007b: 0x0023, # NUMBER SIGN + 0x007c: 0x0040, # COMMERCIAL AT + 0x007d: 0x0027, # APOSTROPHE + 0x007e: 0x003d, # EQUALS SIGN + 0x007f: 0x0022, # QUOTATION MARK + 0x0080: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x0081: 0x0061, # LATIN SMALL LETTER A + 0x0082: 0x0062, # LATIN SMALL LETTER B + 0x0083: 0x0063, # LATIN SMALL LETTER C + 0x0084: 0x0064, # LATIN SMALL LETTER D + 0x0085: 0x0065, # LATIN SMALL LETTER E + 0x0086: 0x0066, # LATIN SMALL LETTER F + 0x0087: 0x0067, # LATIN SMALL LETTER G + 0x0088: 0x0068, # LATIN SMALL LETTER H + 0x0089: 0x0069, # LATIN SMALL LETTER I + 0x008a: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008b: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH (ICELANDIC) + 0x008d: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x008e: 0x00fe, # LATIN SMALL LETTER THORN (ICELANDIC) + 0x008f: 0x00b1, # PLUS-MINUS SIGN + 0x0090: 0x00b0, # DEGREE SIGN + 0x0091: 0x006a, # LATIN SMALL LETTER J + 0x0092: 0x006b, # LATIN SMALL LETTER K + 0x0093: 0x006c, # LATIN SMALL LETTER L + 0x0094: 0x006d, # LATIN SMALL LETTER M + 0x0095: 0x006e, # LATIN SMALL LETTER N + 0x0096: 0x006f, # LATIN SMALL LETTER O + 0x0097: 0x0070, # LATIN SMALL LETTER P + 0x0098: 0x0071, # LATIN SMALL LETTER Q + 0x0099: 0x0072, # LATIN SMALL LETTER R + 0x009a: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x009b: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x009c: 0x00e6, # LATIN SMALL LIGATURE AE + 0x009d: 0x00b8, # CEDILLA + 0x009e: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x00b5, # MICRO SIGN + 0x00a1: 0x007e, # TILDE + 0x00a2: 0x0073, # LATIN SMALL LETTER S + 0x00a3: 0x0074, # LATIN SMALL LETTER T + 0x00a4: 0x0075, # LATIN SMALL LETTER U + 0x00a5: 0x0076, # LATIN SMALL LETTER V + 0x00a6: 0x0077, # LATIN SMALL LETTER W + 0x00a7: 0x0078, # LATIN SMALL LETTER X + 0x00a8: 0x0079, # LATIN SMALL LETTER Y + 0x00a9: 0x007a, # LATIN SMALL LETTER Z + 0x00aa: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ab: 0x00bf, # INVERTED QUESTION MARK + 0x00ac: 0x00d0, # LATIN CAPITAL LETTER ETH (ICELANDIC) + 0x00ad: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ae: 0x00de, # LATIN CAPITAL LETTER THORN (ICELANDIC) + 0x00af: 0x00ae, # REGISTERED SIGN + 0x00b0: 0x00a2, # CENT SIGN + 0x00b1: 0x00a3, # POUND SIGN + 0x00b2: 0x00a5, # YEN SIGN + 0x00b3: 0x00b7, # MIDDLE DOT + 0x00b4: 0x00a9, # COPYRIGHT SIGN + 0x00b5: 0x00a7, # SECTION SIGN + 0x00b7: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00b8: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00b9: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ba: 0x00ac, # NOT SIGN + 0x00bb: 0x007c, # VERTICAL LINE + 0x00bc: 0x00af, # MACRON + 0x00bd: 0x00a8, # DIAERESIS + 0x00be: 0x00b4, # ACUTE ACCENT + 0x00bf: 0x00d7, # MULTIPLICATION SIGN + 0x00c0: 0x007b, # LEFT CURLY BRACKET + 0x00c1: 0x0041, # LATIN CAPITAL LETTER A + 0x00c2: 0x0042, # LATIN CAPITAL LETTER B + 0x00c3: 0x0043, # LATIN CAPITAL LETTER C + 0x00c4: 0x0044, # LATIN CAPITAL LETTER D + 0x00c5: 0x0045, # LATIN CAPITAL LETTER E + 0x00c6: 0x0046, # LATIN CAPITAL LETTER F + 0x00c7: 0x0047, # LATIN CAPITAL LETTER G + 0x00c8: 0x0048, # LATIN CAPITAL LETTER H + 0x00c9: 0x0049, # LATIN CAPITAL LETTER I + 0x00ca: 0x00ad, # SOFT HYPHEN + 0x00cb: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00cc: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00cd: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x00ce: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00cf: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00d0: 0x007d, # RIGHT CURLY BRACKET + 0x00d1: 0x004a, # LATIN CAPITAL LETTER J + 0x00d2: 0x004b, # LATIN CAPITAL LETTER K + 0x00d3: 0x004c, # LATIN CAPITAL LETTER L + 0x00d4: 0x004d, # LATIN CAPITAL LETTER M + 0x00d5: 0x004e, # LATIN CAPITAL LETTER N + 0x00d6: 0x004f, # LATIN CAPITAL LETTER O + 0x00d7: 0x0050, # LATIN CAPITAL LETTER P + 0x00d8: 0x0051, # LATIN CAPITAL LETTER Q + 0x00d9: 0x0052, # LATIN CAPITAL LETTER R + 0x00da: 0x00b9, # SUPERSCRIPT ONE + 0x00db: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00dd: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x00de: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00df: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00e0: 0x005c, # REVERSE SOLIDUS + 0x00e1: 0x00f7, # DIVISION SIGN + 0x00e2: 0x0053, # LATIN CAPITAL LETTER S + 0x00e3: 0x0054, # LATIN CAPITAL LETTER T + 0x00e4: 0x0055, # LATIN CAPITAL LETTER U + 0x00e5: 0x0056, # LATIN CAPITAL LETTER V + 0x00e6: 0x0057, # LATIN CAPITAL LETTER W + 0x00e7: 0x0058, # LATIN CAPITAL LETTER X + 0x00e8: 0x0059, # LATIN CAPITAL LETTER Y + 0x00e9: 0x005a, # LATIN CAPITAL LETTER Z + 0x00ea: 0x00b2, # SUPERSCRIPT TWO + 0x00eb: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00ec: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00ed: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00f0: 0x0030, # DIGIT ZERO + 0x00f1: 0x0031, # DIGIT ONE + 0x00f2: 0x0032, # DIGIT TWO + 0x00f3: 0x0033, # DIGIT THREE + 0x00f4: 0x0034, # DIGIT FOUR + 0x00f5: 0x0035, # DIGIT FIVE + 0x00f6: 0x0036, # DIGIT SIX + 0x00f7: 0x0037, # DIGIT SEVEN + 0x00f8: 0x0038, # DIGIT EIGHT + 0x00f9: 0x0039, # DIGIT NINE + 0x00fa: 0x00b3, # SUPERSCRIPT THREE + 0x00fb: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00fd: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00fe: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ff: 0x009f, # CONTROL +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp737.py b/lib-python/2.2/encodings/cp737.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp737.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP737.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp775.py b/lib-python/2.2/encodings/cp775.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp775.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP775.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0096: 0x00a2, # CENT SIGN + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a7: 0x00a6, # BROKEN BAR + 0x00a8: 0x00a9, # COPYRIGHT SIGN + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp850.py b/lib-python/2.2/encodings/cp850.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp850.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP850.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp852.py b/lib-python/2.2/encodings/cp852.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp852.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP852.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00f2: 0x02db, # OGONEK + 0x00f3: 0x02c7, # CARON + 0x00f4: 0x02d8, # BREVE + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp855.py b/lib-python/2.2/encodings/cp855.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp855.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP855.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp856.py b/lib-python/2.2/encodings/cp856.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp856.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP856.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: None, # UNDEFINED + 0x009c: 0x00a3, # POUND SIGN + 0x009d: None, # UNDEFINED + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: None, # UNDEFINED + 0x00a0: None, # UNDEFINED + 0x00a1: None, # UNDEFINED + 0x00a2: None, # UNDEFINED + 0x00a3: None, # UNDEFINED + 0x00a4: None, # UNDEFINED + 0x00a5: None, # UNDEFINED + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: None, # UNDEFINED + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: None, # UNDEFINED + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: None, # UNDEFINED + 0x00b6: None, # UNDEFINED + 0x00b7: None, # UNDEFINED + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: None, # UNDEFINED + 0x00c7: None, # UNDEFINED + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: None, # UNDEFINED + 0x00d1: None, # UNDEFINED + 0x00d2: None, # UNDEFINED + 0x00d3: None, # UNDEFINEDS + 0x00d4: None, # UNDEFINED + 0x00d5: None, # UNDEFINED + 0x00d6: None, # UNDEFINEDE + 0x00d7: None, # UNDEFINED + 0x00d8: None, # UNDEFINED + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: None, # UNDEFINED + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: None, # UNDEFINED + 0x00e1: None, # UNDEFINED + 0x00e2: None, # UNDEFINED + 0x00e3: None, # UNDEFINED + 0x00e4: None, # UNDEFINED + 0x00e5: None, # UNDEFINED + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: None, # UNDEFINED + 0x00e9: None, # UNDEFINED + 0x00ea: None, # UNDEFINED + 0x00eb: None, # UNDEFINED + 0x00ec: None, # UNDEFINED + 0x00ed: None, # UNDEFINED + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp857.py b/lib-python/2.2/encodings/cp857.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp857.py @@ -0,0 +1,171 @@ +""" Python Character Mapping Codec generated from 'CP857.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp860.py b/lib-python/2.2/encodings/cp860.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp860.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP860.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp861.py b/lib-python/2.2/encodings/cp861.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp861.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP861.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp862.py b/lib-python/2.2/encodings/cp862.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp862.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP862.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp863.py b/lib-python/2.2/encodings/cp863.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp863.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP863.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00b6, # PILCROW SIGN + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x2017, # DOUBLE LOW LINE + 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x008f: 0x00a7, # SECTION SIGN + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00a4, # CURRENCY SIGN + 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00a6, # BROKEN BAR + 0x00a1: 0x00b4, # ACUTE ACCENT + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00a8, # DIAERESIS + 0x00a5: 0x00b8, # CEDILLA + 0x00a6: 0x00b3, # SUPERSCRIPT THREE + 0x00a7: 0x00af, # MACRON + 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp864.py b/lib-python/2.2/encodings/cp864.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp864.py @@ -0,0 +1,170 @@ +""" Python Character Mapping Codec generated from 'CP864.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp865.py b/lib-python/2.2/encodings/cp865.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp865.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP865.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00a4, # CURRENCY SIGN + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp866.py b/lib-python/2.2/encodings/cp866.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp866.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP866.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp869.py b/lib-python/2.2/encodings/cp869.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp869.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'CP869.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: None, # UNDEFINED + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: None, # UNDEFINED + 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0087: None, # UNDEFINED + 0x0088: 0x00b7, # MIDDLE DOT + 0x0089: 0x00ac, # NOT SIGN + 0x008a: 0x00a6, # BROKEN BAR + 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x008e: 0x2015, # HORIZONTAL BAR + 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0093: None, # UNDEFINED + 0x0094: None, # UNDEFINED + 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x0097: 0x00a9, # COPYRIGHT SIGN + 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0099: 0x00b2, # SUPERSCRIPT TWO + 0x009a: 0x00b3, # SUPERSCRIPT THREE + 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU + 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI + 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA + 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00e6: 0x03bc, # GREEK SMALL LETTER MU + 0x00e7: 0x03bd, # GREEK SMALL LETTER NU + 0x00e8: 0x03be, # GREEK SMALL LETTER XI + 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ea: 0x03c0, # GREEK SMALL LETTER PI + 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO + 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ef: 0x0384, # GREEK TONOS + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp874.py b/lib-python/2.2/encodings/cp874.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp874.py @@ -0,0 +1,171 @@ +""" Python Character Mapping Codec generated from 'CP874.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: None, # UNDEFINED + 0x0087: None, # UNDEFINED + 0x0088: None, # UNDEFINED + 0x0089: None, # UNDEFINED + 0x008a: None, # UNDEFINED + 0x008b: None, # UNDEFINED + 0x008c: None, # UNDEFINED + 0x008d: None, # UNDEFINED + 0x008e: None, # UNDEFINED + 0x008f: None, # UNDEFINED + 0x0090: None, # UNDEFINED + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: None, # UNDEFINED + 0x0099: None, # UNDEFINED + 0x009a: None, # UNDEFINED + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: None, # UNDEFINED + 0x009e: None, # UNDEFINED + 0x009f: None, # UNDEFINED + 0x00a1: 0x0e01, # THAI CHARACTER KO KAI + 0x00a2: 0x0e02, # THAI CHARACTER KHO KHAI + 0x00a3: 0x0e03, # THAI CHARACTER KHO KHUAT + 0x00a4: 0x0e04, # THAI CHARACTER KHO KHWAI + 0x00a5: 0x0e05, # THAI CHARACTER KHO KHON + 0x00a6: 0x0e06, # THAI CHARACTER KHO RAKHANG + 0x00a7: 0x0e07, # THAI CHARACTER NGO NGU + 0x00a8: 0x0e08, # THAI CHARACTER CHO CHAN + 0x00a9: 0x0e09, # THAI CHARACTER CHO CHING + 0x00aa: 0x0e0a, # THAI CHARACTER CHO CHANG + 0x00ab: 0x0e0b, # THAI CHARACTER SO SO + 0x00ac: 0x0e0c, # THAI CHARACTER CHO CHOE + 0x00ad: 0x0e0d, # THAI CHARACTER YO YING + 0x00ae: 0x0e0e, # THAI CHARACTER DO CHADA + 0x00af: 0x0e0f, # THAI CHARACTER TO PATAK + 0x00b0: 0x0e10, # THAI CHARACTER THO THAN + 0x00b1: 0x0e11, # THAI CHARACTER THO NANGMONTHO + 0x00b2: 0x0e12, # THAI CHARACTER THO PHUTHAO + 0x00b3: 0x0e13, # THAI CHARACTER NO NEN + 0x00b4: 0x0e14, # THAI CHARACTER DO DEK + 0x00b5: 0x0e15, # THAI CHARACTER TO TAO + 0x00b6: 0x0e16, # THAI CHARACTER THO THUNG + 0x00b7: 0x0e17, # THAI CHARACTER THO THAHAN + 0x00b8: 0x0e18, # THAI CHARACTER THO THONG + 0x00b9: 0x0e19, # THAI CHARACTER NO NU + 0x00ba: 0x0e1a, # THAI CHARACTER BO BAIMAI + 0x00bb: 0x0e1b, # THAI CHARACTER PO PLA + 0x00bc: 0x0e1c, # THAI CHARACTER PHO PHUNG + 0x00bd: 0x0e1d, # THAI CHARACTER FO FA + 0x00be: 0x0e1e, # THAI CHARACTER PHO PHAN + 0x00bf: 0x0e1f, # THAI CHARACTER FO FAN + 0x00c0: 0x0e20, # THAI CHARACTER PHO SAMPHAO + 0x00c1: 0x0e21, # THAI CHARACTER MO MA + 0x00c2: 0x0e22, # THAI CHARACTER YO YAK + 0x00c3: 0x0e23, # THAI CHARACTER RO RUA + 0x00c4: 0x0e24, # THAI CHARACTER RU + 0x00c5: 0x0e25, # THAI CHARACTER LO LING + 0x00c6: 0x0e26, # THAI CHARACTER LU + 0x00c7: 0x0e27, # THAI CHARACTER WO WAEN + 0x00c8: 0x0e28, # THAI CHARACTER SO SALA + 0x00c9: 0x0e29, # THAI CHARACTER SO RUSI + 0x00ca: 0x0e2a, # THAI CHARACTER SO SUA + 0x00cb: 0x0e2b, # THAI CHARACTER HO HIP + 0x00cc: 0x0e2c, # THAI CHARACTER LO CHULA + 0x00cd: 0x0e2d, # THAI CHARACTER O ANG + 0x00ce: 0x0e2e, # THAI CHARACTER HO NOKHUK + 0x00cf: 0x0e2f, # THAI CHARACTER PAIYANNOI + 0x00d0: 0x0e30, # THAI CHARACTER SARA A + 0x00d1: 0x0e31, # THAI CHARACTER MAI HAN-AKAT + 0x00d2: 0x0e32, # THAI CHARACTER SARA AA + 0x00d3: 0x0e33, # THAI CHARACTER SARA AM + 0x00d4: 0x0e34, # THAI CHARACTER SARA I + 0x00d5: 0x0e35, # THAI CHARACTER SARA II + 0x00d6: 0x0e36, # THAI CHARACTER SARA UE + 0x00d7: 0x0e37, # THAI CHARACTER SARA UEE + 0x00d8: 0x0e38, # THAI CHARACTER SARA U + 0x00d9: 0x0e39, # THAI CHARACTER SARA UU + 0x00da: 0x0e3a, # THAI CHARACTER PHINTHU + 0x00db: None, # UNDEFINED + 0x00dc: None, # UNDEFINED + 0x00dd: None, # UNDEFINED + 0x00de: None, # UNDEFINED + 0x00df: 0x0e3f, # THAI CURRENCY SYMBOL BAHT + 0x00e0: 0x0e40, # THAI CHARACTER SARA E + 0x00e1: 0x0e41, # THAI CHARACTER SARA AE + 0x00e2: 0x0e42, # THAI CHARACTER SARA O + 0x00e3: 0x0e43, # THAI CHARACTER SARA AI MAIMUAN + 0x00e4: 0x0e44, # THAI CHARACTER SARA AI MAIMALAI + 0x00e5: 0x0e45, # THAI CHARACTER LAKKHANGYAO + 0x00e6: 0x0e46, # THAI CHARACTER MAIYAMOK + 0x00e7: 0x0e47, # THAI CHARACTER MAITAIKHU + 0x00e8: 0x0e48, # THAI CHARACTER MAI EK + 0x00e9: 0x0e49, # THAI CHARACTER MAI THO + 0x00ea: 0x0e4a, # THAI CHARACTER MAI TRI + 0x00eb: 0x0e4b, # THAI CHARACTER MAI CHATTAWA + 0x00ec: 0x0e4c, # THAI CHARACTER THANTHAKHAT + 0x00ed: 0x0e4d, # THAI CHARACTER NIKHAHIT + 0x00ee: 0x0e4e, # THAI CHARACTER YAMAKKAN + 0x00ef: 0x0e4f, # THAI CHARACTER FONGMAN + 0x00f0: 0x0e50, # THAI DIGIT ZERO + 0x00f1: 0x0e51, # THAI DIGIT ONE + 0x00f2: 0x0e52, # THAI DIGIT TWO + 0x00f3: 0x0e53, # THAI DIGIT THREE + 0x00f4: 0x0e54, # THAI DIGIT FOUR + 0x00f5: 0x0e55, # THAI DIGIT FIVE + 0x00f6: 0x0e56, # THAI DIGIT SIX + 0x00f7: 0x0e57, # THAI DIGIT SEVEN + 0x00f8: 0x0e58, # THAI DIGIT EIGHT + 0x00f9: 0x0e59, # THAI DIGIT NINE + 0x00fa: 0x0e5a, # THAI CHARACTER ANGKHANKHU + 0x00fb: 0x0e5b, # THAI CHARACTER KHOMUT + 0x00fc: None, # UNDEFINED + 0x00fd: None, # UNDEFINED + 0x00fe: None, # UNDEFINED + 0x00ff: None, # UNDEFINED +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/cp875.py b/lib-python/2.2/encodings/cp875.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/cp875.py @@ -0,0 +1,281 @@ +""" Python Character Mapping Codec generated from 'CP875.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0004: 0x009c, # CONTROL + 0x0005: 0x0009, # HORIZONTAL TABULATION + 0x0006: 0x0086, # CONTROL + 0x0007: 0x007f, # DELETE + 0x0008: 0x0097, # CONTROL + 0x0009: 0x008d, # CONTROL + 0x000a: 0x008e, # CONTROL + 0x0014: 0x009d, # CONTROL + 0x0015: 0x0085, # CONTROL + 0x0016: 0x0008, # BACKSPACE + 0x0017: 0x0087, # CONTROL + 0x001a: 0x0092, # CONTROL + 0x001b: 0x008f, # CONTROL + 0x0020: 0x0080, # CONTROL + 0x0021: 0x0081, # CONTROL + 0x0022: 0x0082, # CONTROL + 0x0023: 0x0083, # CONTROL + 0x0024: 0x0084, # CONTROL + 0x0025: 0x000a, # LINE FEED + 0x0026: 0x0017, # END OF TRANSMISSION BLOCK + 0x0027: 0x001b, # ESCAPE + 0x0028: 0x0088, # CONTROL + 0x0029: 0x0089, # CONTROL + 0x002a: 0x008a, # CONTROL + 0x002b: 0x008b, # CONTROL + 0x002c: 0x008c, # CONTROL + 0x002d: 0x0005, # ENQUIRY + 0x002e: 0x0006, # ACKNOWLEDGE + 0x002f: 0x0007, # BELL + 0x0030: 0x0090, # CONTROL + 0x0031: 0x0091, # CONTROL + 0x0032: 0x0016, # SYNCHRONOUS IDLE + 0x0033: 0x0093, # CONTROL + 0x0034: 0x0094, # CONTROL + 0x0035: 0x0095, # CONTROL + 0x0036: 0x0096, # CONTROL + 0x0037: 0x0004, # END OF TRANSMISSION + 0x0038: 0x0098, # CONTROL + 0x0039: 0x0099, # CONTROL + 0x003a: 0x009a, # CONTROL + 0x003b: 0x009b, # CONTROL + 0x003c: 0x0014, # DEVICE CONTROL FOUR + 0x003d: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x003e: 0x009e, # CONTROL + 0x003f: 0x001a, # SUBSTITUTE + 0x0040: 0x0020, # SPACE + 0x0041: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0042: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0043: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0044: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0045: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0046: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0047: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0048: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0049: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x004a: 0x005b, # LEFT SQUARE BRACKET + 0x004b: 0x002e, # FULL STOP + 0x004c: 0x003c, # LESS-THAN SIGN + 0x004d: 0x0028, # LEFT PARENTHESIS + 0x004e: 0x002b, # PLUS SIGN + 0x004f: 0x0021, # EXCLAMATION MARK + 0x0050: 0x0026, # AMPERSAND + 0x0051: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x0052: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x0053: 0x039c, # GREEK CAPITAL LETTER MU + 0x0054: 0x039d, # GREEK CAPITAL LETTER NU + 0x0055: 0x039e, # GREEK CAPITAL LETTER XI + 0x0056: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x0057: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0058: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0059: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x005a: 0x005d, # RIGHT SQUARE BRACKET + 0x005b: 0x0024, # DOLLAR SIGN + 0x005c: 0x002a, # ASTERISK + 0x005d: 0x0029, # RIGHT PARENTHESIS + 0x005e: 0x003b, # SEMICOLON + 0x005f: 0x005e, # CIRCUMFLEX ACCENT + 0x0060: 0x002d, # HYPHEN-MINUS + 0x0061: 0x002f, # SOLIDUS + 0x0062: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0063: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0064: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0065: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0066: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0067: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0068: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0069: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x006a: 0x007c, # VERTICAL LINE + 0x006b: 0x002c, # COMMA + 0x006c: 0x0025, # PERCENT SIGN + 0x006d: 0x005f, # LOW LINE + 0x006e: 0x003e, # GREATER-THAN SIGN + 0x006f: 0x003f, # QUESTION MARK + 0x0070: 0x00a8, # DIAERESIS + 0x0071: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0072: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0073: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0074: 0x00a0, # NO-BREAK SPACE + 0x0075: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0076: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0077: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0078: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0079: 0x0060, # GRAVE ACCENT + 0x007a: 0x003a, # COLON + 0x007b: 0x0023, # NUMBER SIGN + 0x007c: 0x0040, # COMMERCIAL AT + 0x007d: 0x0027, # APOSTROPHE + 0x007e: 0x003d, # EQUALS SIGN + 0x007f: 0x0022, # QUOTATION MARK + 0x0080: 0x0385, # GREEK DIALYTIKA TONOS + 0x0081: 0x0061, # LATIN SMALL LETTER A + 0x0082: 0x0062, # LATIN SMALL LETTER B + 0x0083: 0x0063, # LATIN SMALL LETTER C + 0x0084: 0x0064, # LATIN SMALL LETTER D + 0x0085: 0x0065, # LATIN SMALL LETTER E + 0x0086: 0x0066, # LATIN SMALL LETTER F + 0x0087: 0x0067, # LATIN SMALL LETTER G + 0x0088: 0x0068, # LATIN SMALL LETTER H + 0x0089: 0x0069, # LATIN SMALL LETTER I + 0x008a: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x008b: 0x03b2, # GREEK SMALL LETTER BETA + 0x008c: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x008d: 0x03b4, # GREEK SMALL LETTER DELTA + 0x008e: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x008f: 0x03b6, # GREEK SMALL LETTER ZETA + 0x0090: 0x00b0, # DEGREE SIGN + 0x0091: 0x006a, # LATIN SMALL LETTER J + 0x0092: 0x006b, # LATIN SMALL LETTER K + 0x0093: 0x006c, # LATIN SMALL LETTER L + 0x0094: 0x006d, # LATIN SMALL LETTER M + 0x0095: 0x006e, # LATIN SMALL LETTER N + 0x0096: 0x006f, # LATIN SMALL LETTER O + 0x0097: 0x0070, # LATIN SMALL LETTER P + 0x0098: 0x0071, # LATIN SMALL LETTER Q + 0x0099: 0x0072, # LATIN SMALL LETTER R + 0x009a: 0x03b7, # GREEK SMALL LETTER ETA + 0x009b: 0x03b8, # GREEK SMALL LETTER THETA + 0x009c: 0x03b9, # GREEK SMALL LETTER IOTA + 0x009d: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x009e: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x009f: 0x03bc, # GREEK SMALL LETTER MU + 0x00a0: 0x00b4, # ACUTE ACCENT + 0x00a1: 0x007e, # TILDE + 0x00a2: 0x0073, # LATIN SMALL LETTER S + 0x00a3: 0x0074, # LATIN SMALL LETTER T + 0x00a4: 0x0075, # LATIN SMALL LETTER U + 0x00a5: 0x0076, # LATIN SMALL LETTER V + 0x00a6: 0x0077, # LATIN SMALL LETTER W + 0x00a7: 0x0078, # LATIN SMALL LETTER X + 0x00a8: 0x0079, # LATIN SMALL LETTER Y + 0x00a9: 0x007a, # LATIN SMALL LETTER Z + 0x00aa: 0x03bd, # GREEK SMALL LETTER NU + 0x00ab: 0x03be, # GREEK SMALL LETTER XI + 0x00ac: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ad: 0x03c0, # GREEK SMALL LETTER PI + 0x00ae: 0x03c1, # GREEK SMALL LETTER RHO + 0x00af: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00b0: 0x00a3, # POUND SIGN + 0x00b1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00b2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00b3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00b4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00b5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00b6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00b7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00b8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00b9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ba: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00bb: 0x03c4, # GREEK SMALL LETTER TAU + 0x00bc: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00bd: 0x03c6, # GREEK SMALL LETTER PHI + 0x00be: 0x03c7, # GREEK SMALL LETTER CHI + 0x00bf: 0x03c8, # GREEK SMALL LETTER PSI + 0x00c0: 0x007b, # LEFT CURLY BRACKET + 0x00c1: 0x0041, # LATIN CAPITAL LETTER A + 0x00c2: 0x0042, # LATIN CAPITAL LETTER B + 0x00c3: 0x0043, # LATIN CAPITAL LETTER C + 0x00c4: 0x0044, # LATIN CAPITAL LETTER D + 0x00c5: 0x0045, # LATIN CAPITAL LETTER E + 0x00c6: 0x0046, # LATIN CAPITAL LETTER F + 0x00c7: 0x0047, # LATIN CAPITAL LETTER G + 0x00c8: 0x0048, # LATIN CAPITAL LETTER H + 0x00c9: 0x0049, # LATIN CAPITAL LETTER I + 0x00ca: 0x00ad, # SOFT HYPHEN + 0x00cb: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00cc: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00cd: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00ce: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00cf: 0x2015, # HORIZONTAL BAR + 0x00d0: 0x007d, # RIGHT CURLY BRACKET + 0x00d1: 0x004a, # LATIN CAPITAL LETTER J + 0x00d2: 0x004b, # LATIN CAPITAL LETTER K + 0x00d3: 0x004c, # LATIN CAPITAL LETTER L + 0x00d4: 0x004d, # LATIN CAPITAL LETTER M + 0x00d5: 0x004e, # LATIN CAPITAL LETTER N + 0x00d6: 0x004f, # LATIN CAPITAL LETTER O + 0x00d7: 0x0050, # LATIN CAPITAL LETTER P + 0x00d8: 0x0051, # LATIN CAPITAL LETTER Q + 0x00d9: 0x0052, # LATIN CAPITAL LETTER R + 0x00da: 0x00b1, # PLUS-MINUS SIGN + 0x00db: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00dc: 0x001a, # SUBSTITUTE + 0x00dd: 0x0387, # GREEK ANO TELEIA + 0x00de: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00df: 0x00a6, # BROKEN BAR + 0x00e0: 0x005c, # REVERSE SOLIDUS + 0x00e1: 0x001a, # SUBSTITUTE + 0x00e2: 0x0053, # LATIN CAPITAL LETTER S + 0x00e3: 0x0054, # LATIN CAPITAL LETTER T + 0x00e4: 0x0055, # LATIN CAPITAL LETTER U + 0x00e5: 0x0056, # LATIN CAPITAL LETTER V + 0x00e6: 0x0057, # LATIN CAPITAL LETTER W + 0x00e7: 0x0058, # LATIN CAPITAL LETTER X + 0x00e8: 0x0059, # LATIN CAPITAL LETTER Y + 0x00e9: 0x005a, # LATIN CAPITAL LETTER Z + 0x00ea: 0x00b2, # SUPERSCRIPT TWO + 0x00eb: 0x00a7, # SECTION SIGN + 0x00ec: 0x001a, # SUBSTITUTE + 0x00ed: 0x001a, # SUBSTITUTE + 0x00ee: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ef: 0x00ac, # NOT SIGN + 0x00f0: 0x0030, # DIGIT ZERO + 0x00f1: 0x0031, # DIGIT ONE + 0x00f2: 0x0032, # DIGIT TWO + 0x00f3: 0x0033, # DIGIT THREE + 0x00f4: 0x0034, # DIGIT FOUR + 0x00f5: 0x0035, # DIGIT FIVE + 0x00f6: 0x0036, # DIGIT SIX + 0x00f7: 0x0037, # DIGIT SEVEN + 0x00f8: 0x0038, # DIGIT EIGHT + 0x00f9: 0x0039, # DIGIT NINE + 0x00fa: 0x00b3, # SUPERSCRIPT THREE + 0x00fb: 0x00a9, # COPYRIGHT SIGN + 0x00fc: 0x001a, # SUBSTITUTE + 0x00fd: 0x001a, # SUBSTITUTE + 0x00fe: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ff: 0x009f, # CONTROL +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/hex_codec.py b/lib-python/2.2/encodings/hex_codec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/hex_codec.py @@ -0,0 +1,62 @@ +""" Python 'hex_codec' Codec - 2-digit hex content transfer encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal at lemburg.com). + +""" +import codecs, binascii + +### Codec APIs + +def hex_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = binascii.b2a_hex(input) + return (output, len(input)) + +def hex_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = binascii.a2b_hex(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return hex_encode(input,errors) + def decode(self, input,errors='strict'): + return hex_decode(input,errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (hex_encode,hex_decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/iso8859_1.py b/lib-python/2.2/encodings/iso8859_1.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_1.py @@ -0,0 +1,44 @@ +""" Python Character Mapping Codec generated from '8859-1.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_10.py b/lib-python/2.2/encodings/iso8859_10.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_10.py @@ -0,0 +1,90 @@ +""" Python Character Mapping Codec generated from '8859-10.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a2: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00a3: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x00a4: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a5: 0x0128, # LATIN CAPITAL LETTER I WITH TILDE + 0x00a6: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00a8: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00a9: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00aa: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00ab: 0x0166, # LATIN CAPITAL LETTER T WITH STROKE + 0x00ac: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00ae: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00af: 0x014a, # LATIN CAPITAL LETTER ENG + 0x00b1: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00b2: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x00b3: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x00b4: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x00b5: 0x0129, # LATIN SMALL LETTER I WITH TILDE + 0x00b6: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00b8: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00b9: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00ba: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00bb: 0x0167, # LATIN SMALL LETTER T WITH STROKE + 0x00bc: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00bd: 0x2015, # HORIZONTAL BAR + 0x00be: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00bf: 0x014b, # LATIN SMALL LETTER ENG + 0x00c0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00c7: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00cc: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00d1: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00d2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00d7: 0x0168, # LATIN CAPITAL LETTER U WITH TILDE + 0x00d9: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00e0: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x00e7: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00ec: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00f1: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00f2: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x00f7: 0x0169, # LATIN SMALL LETTER U WITH TILDE + 0x00f9: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00ff: 0x0138, # LATIN SMALL LETTER KRA +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_13.py b/lib-python/2.2/encodings/iso8859_13.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_13.py @@ -0,0 +1,100 @@ +""" Python Character Mapping Codec generated from '8859-13.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a5: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00a8: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00aa: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x00af: 0x00c6, # LATIN CAPITAL LETTER AE + 0x00b4: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00b8: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x00ba: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x00bf: 0x00e6, # LATIN SMALL LETTER AE + 0x00c0: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00c1: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00c2: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00c3: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x00c6: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00c7: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x00cb: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00cc: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x00cd: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00ce: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00cf: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00d0: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00d1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00d2: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00d4: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00d8: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00d9: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00da: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x00db: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00dd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00de: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00e0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00e1: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00e2: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x00e3: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x00e6: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00e7: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00eb: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00ec: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x00ed: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ee: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x00ef: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00f0: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00f1: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00f2: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00f4: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x00f8: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00f9: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x00fa: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x00fb: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00fd: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00fe: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00ff: 0x2019, # RIGHT SINGLE QUOTATION MARK +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_14.py b/lib-python/2.2/encodings/iso8859_14.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_14.py @@ -0,0 +1,75 @@ +""" Python Character Mapping Codec generated from '8859-14.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x1e02, # LATIN CAPITAL LETTER B WITH DOT ABOVE + 0x00a2: 0x1e03, # LATIN SMALL LETTER B WITH DOT ABOVE + 0x00a4: 0x010a, # LATIN CAPITAL LETTER C WITH DOT ABOVE + 0x00a5: 0x010b, # LATIN SMALL LETTER C WITH DOT ABOVE + 0x00a6: 0x1e0a, # LATIN CAPITAL LETTER D WITH DOT ABOVE + 0x00a8: 0x1e80, # LATIN CAPITAL LETTER W WITH GRAVE + 0x00aa: 0x1e82, # LATIN CAPITAL LETTER W WITH ACUTE + 0x00ab: 0x1e0b, # LATIN SMALL LETTER D WITH DOT ABOVE + 0x00ac: 0x1ef2, # LATIN CAPITAL LETTER Y WITH GRAVE + 0x00af: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00b0: 0x1e1e, # LATIN CAPITAL LETTER F WITH DOT ABOVE + 0x00b1: 0x1e1f, # LATIN SMALL LETTER F WITH DOT ABOVE + 0x00b2: 0x0120, # LATIN CAPITAL LETTER G WITH DOT ABOVE + 0x00b3: 0x0121, # LATIN SMALL LETTER G WITH DOT ABOVE + 0x00b4: 0x1e40, # LATIN CAPITAL LETTER M WITH DOT ABOVE + 0x00b5: 0x1e41, # LATIN SMALL LETTER M WITH DOT ABOVE + 0x00b7: 0x1e56, # LATIN CAPITAL LETTER P WITH DOT ABOVE + 0x00b8: 0x1e81, # LATIN SMALL LETTER W WITH GRAVE + 0x00b9: 0x1e57, # LATIN SMALL LETTER P WITH DOT ABOVE + 0x00ba: 0x1e83, # LATIN SMALL LETTER W WITH ACUTE + 0x00bb: 0x1e60, # LATIN CAPITAL LETTER S WITH DOT ABOVE + 0x00bc: 0x1ef3, # LATIN SMALL LETTER Y WITH GRAVE + 0x00bd: 0x1e84, # LATIN CAPITAL LETTER W WITH DIAERESIS + 0x00be: 0x1e85, # LATIN SMALL LETTER W WITH DIAERESIS + 0x00bf: 0x1e61, # LATIN SMALL LETTER S WITH DOT ABOVE + 0x00d0: 0x0174, # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + 0x00d7: 0x1e6a, # LATIN CAPITAL LETTER T WITH DOT ABOVE + 0x00de: 0x0176, # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + 0x00f0: 0x0175, # LATIN SMALL LETTER W WITH CIRCUMFLEX + 0x00f7: 0x1e6b, # LATIN SMALL LETTER T WITH DOT ABOVE + 0x00fe: 0x0177, # LATIN SMALL LETTER Y WITH CIRCUMFLEX +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_15.py b/lib-python/2.2/encodings/iso8859_15.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_15.py @@ -0,0 +1,52 @@ +""" Python Character Mapping Codec generated from '8859-15.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a4: 0x20ac, # EURO SIGN + 0x00a6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00a8: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00b4: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00b8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00bc: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x00bd: 0x0153, # LATIN SMALL LIGATURE OE + 0x00be: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_2.py b/lib-python/2.2/encodings/iso8859_2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_2.py @@ -0,0 +1,101 @@ +""" Python Character Mapping Codec generated from '8859-2.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a2: 0x02d8, # BREVE + 0x00a3: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00a5: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x00a6: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x00a9: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00aa: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00ab: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x00ac: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x00ae: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00af: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00b1: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00b2: 0x02db, # OGONEK + 0x00b3: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x00b5: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x00b6: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x00b7: 0x02c7, # CARON + 0x00b9: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00ba: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00bb: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x00bc: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00bd: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00be: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00bf: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00c0: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00c3: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c5: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x00c6: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00cc: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00cf: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d0: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00d2: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d5: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x00d8: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00d9: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00db: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00de: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00e0: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00e3: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00e5: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x00e6: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00ec: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00ef: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00f0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00f1: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00f2: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00f5: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x00f8: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00f9: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fe: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ff: 0x02d9, # DOT ABOVE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_3.py b/lib-python/2.2/encodings/iso8859_3.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_3.py @@ -0,0 +1,79 @@ +""" Python Character Mapping Codec generated from '8859-3.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x0126, # LATIN CAPITAL LETTER H WITH STROKE + 0x00a2: 0x02d8, # BREVE + 0x00a5: None, + 0x00a6: 0x0124, # LATIN CAPITAL LETTER H WITH CIRCUMFLEX + 0x00a9: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x00aa: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00ab: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00ac: 0x0134, # LATIN CAPITAL LETTER J WITH CIRCUMFLEX + 0x00ae: None, + 0x00af: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00b1: 0x0127, # LATIN SMALL LETTER H WITH STROKE + 0x00b6: 0x0125, # LATIN SMALL LETTER H WITH CIRCUMFLEX + 0x00b9: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00ba: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00bb: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00bc: 0x0135, # LATIN SMALL LETTER J WITH CIRCUMFLEX + 0x00be: None, + 0x00bf: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00c3: None, + 0x00c5: 0x010a, # LATIN CAPITAL LETTER C WITH DOT ABOVE + 0x00c6: 0x0108, # LATIN CAPITAL LETTER C WITH CIRCUMFLEX + 0x00d0: None, + 0x00d5: 0x0120, # LATIN CAPITAL LETTER G WITH DOT ABOVE + 0x00d8: 0x011c, # LATIN CAPITAL LETTER G WITH CIRCUMFLEX + 0x00dd: 0x016c, # LATIN CAPITAL LETTER U WITH BREVE + 0x00de: 0x015c, # LATIN CAPITAL LETTER S WITH CIRCUMFLEX + 0x00e3: None, + 0x00e5: 0x010b, # LATIN SMALL LETTER C WITH DOT ABOVE + 0x00e6: 0x0109, # LATIN SMALL LETTER C WITH CIRCUMFLEX + 0x00f0: None, + 0x00f5: 0x0121, # LATIN SMALL LETTER G WITH DOT ABOVE + 0x00f8: 0x011d, # LATIN SMALL LETTER G WITH CIRCUMFLEX + 0x00fd: 0x016d, # LATIN SMALL LETTER U WITH BREVE + 0x00fe: 0x015d, # LATIN SMALL LETTER S WITH CIRCUMFLEX + 0x00ff: 0x02d9, # DOT ABOVE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_4.py b/lib-python/2.2/encodings/iso8859_4.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_4.py @@ -0,0 +1,94 @@ +""" Python Character Mapping Codec generated from '8859-4.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a2: 0x0138, # LATIN SMALL LETTER KRA + 0x00a3: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x00a5: 0x0128, # LATIN CAPITAL LETTER I WITH TILDE + 0x00a6: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00a9: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00aa: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ab: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x00ac: 0x0166, # LATIN CAPITAL LETTER T WITH STROKE + 0x00ae: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00b1: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00b2: 0x02db, # OGONEK + 0x00b3: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x00b5: 0x0129, # LATIN SMALL LETTER I WITH TILDE + 0x00b6: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00b7: 0x02c7, # CARON + 0x00b9: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00ba: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x00bb: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x00bc: 0x0167, # LATIN SMALL LETTER T WITH STROKE + 0x00bd: 0x014a, # LATIN CAPITAL LETTER ENG + 0x00be: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00bf: 0x014b, # LATIN SMALL LETTER ENG + 0x00c0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00c7: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00c8: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ca: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00cc: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00cf: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00d0: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d1: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00d2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00d3: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00d9: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00dd: 0x0168, # LATIN CAPITAL LETTER U WITH TILDE + 0x00de: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00e0: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x00e7: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00e8: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00ea: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00ec: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00ef: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x00f0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00f1: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00f2: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x00f3: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00f9: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00fd: 0x0169, # LATIN SMALL LETTER U WITH TILDE + 0x00fe: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00ff: 0x02d9, # DOT ABOVE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_5.py b/lib-python/2.2/encodings/iso8859_5.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_5.py @@ -0,0 +1,138 @@ +""" Python Character Mapping Codec generated from '8859-5.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00a2: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x00a3: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x00a4: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00a5: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x00a6: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00a7: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00a8: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x00a9: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x00aa: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x00ab: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x00ac: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x00ae: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00af: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x00b0: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00b1: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00b2: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00b3: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00b4: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00b5: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00b6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00b7: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00ba: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00bb: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00bc: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00bd: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00be: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00bf: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00c0: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00c1: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00c2: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00c3: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00c4: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00c5: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00c6: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00c7: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00c8: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00c9: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00ca: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00cb: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00cc: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00cd: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00ce: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x00cf: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00d0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00d1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00d2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00d3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00d4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00d5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00d6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00d7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00d8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00d9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00da: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00db: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00dc: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00dd: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00de: 0x043e, # CYRILLIC SMALL LETTER O + 0x00df: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x2116, # NUMERO SIGN + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x00f3: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x00f4: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f5: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x00f6: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f7: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f8: 0x0458, # CYRILLIC SMALL LETTER JE + 0x00f9: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x00fa: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x00fb: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x00fc: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00ff: 0x045f, # CYRILLIC SMALL LETTER DZHE +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_6.py b/lib-python/2.2/encodings/iso8859_6.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_6.py @@ -0,0 +1,137 @@ +""" Python Character Mapping Codec generated from '8859-6.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: None, + 0x00a2: None, + 0x00a3: None, + 0x00a5: None, + 0x00a6: None, + 0x00a7: None, + 0x00a8: None, + 0x00a9: None, + 0x00aa: None, + 0x00ab: None, + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ae: None, + 0x00af: None, + 0x00b0: None, + 0x00b1: None, + 0x00b2: None, + 0x00b3: None, + 0x00b4: None, + 0x00b5: None, + 0x00b6: None, + 0x00b7: None, + 0x00b8: None, + 0x00b9: None, + 0x00ba: None, + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: None, + 0x00bd: None, + 0x00be: None, + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: None, + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d7: 0x0637, # ARABIC LETTER TAH + 0x00d8: 0x0638, # ARABIC LETTER ZAH + 0x00d9: 0x0639, # ARABIC LETTER AIN + 0x00da: 0x063a, # ARABIC LETTER GHAIN + 0x00db: None, + 0x00dc: None, + 0x00dd: None, + 0x00de: None, + 0x00df: None, + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0x0641, # ARABIC LETTER FEH + 0x00e2: 0x0642, # ARABIC LETTER QAF + 0x00e3: 0x0643, # ARABIC LETTER KAF + 0x00e4: 0x0644, # ARABIC LETTER LAM + 0x00e5: 0x0645, # ARABIC LETTER MEEM + 0x00e6: 0x0646, # ARABIC LETTER NOON + 0x00e7: 0x0647, # ARABIC LETTER HEH + 0x00e8: 0x0648, # ARABIC LETTER WAW + 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ea: 0x064a, # ARABIC LETTER YEH + 0x00eb: 0x064b, # ARABIC FATHATAN + 0x00ec: 0x064c, # ARABIC DAMMATAN + 0x00ed: 0x064d, # ARABIC KASRATAN + 0x00ee: 0x064e, # ARABIC FATHA + 0x00ef: 0x064f, # ARABIC DAMMA + 0x00f0: 0x0650, # ARABIC KASRA + 0x00f1: 0x0651, # ARABIC SHADDA + 0x00f2: 0x0652, # ARABIC SUKUN + 0x00f3: None, + 0x00f4: None, + 0x00f5: None, + 0x00f6: None, + 0x00f7: None, + 0x00f8: None, + 0x00f9: None, + 0x00fa: None, + 0x00fb: None, + 0x00fc: None, + 0x00fd: None, + 0x00fe: None, + 0x00ff: None, +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_7.py b/lib-python/2.2/encodings/iso8859_7.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_7.py @@ -0,0 +1,124 @@ +""" Python Character Mapping Codec generated from '8859-7.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00a2: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00a4: None, + 0x00a5: None, + 0x00aa: None, + 0x00ae: None, + 0x00af: 0x2015, # HORIZONTAL BAR + 0x00b4: 0x0384, # GREEK TONOS + 0x00b5: 0x0385, # GREEK DIALYTIKA TONOS + 0x00b6: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00b8: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00b9: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ba: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00bc: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00be: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00bf: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00c0: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00c1: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00c2: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00c3: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00c4: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00c5: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00c6: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00c7: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00c8: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00c9: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ca: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00cb: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00cc: 0x039c, # GREEK CAPITAL LETTER MU + 0x00cd: 0x039d, # GREEK CAPITAL LETTER NU + 0x00ce: 0x039e, # GREEK CAPITAL LETTER XI + 0x00cf: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00d0: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00d1: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00d2: None, + 0x00d3: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d4: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d5: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d6: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d7: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d8: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d9: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00da: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00db: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00dc: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00dd: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00de: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00df: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e0: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00e1: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e2: 0x03b2, # GREEK SMALL LETTER BETA + 0x00e3: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00e4: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00e5: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00e6: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e7: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e8: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e9: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00ea: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00eb: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00ec: 0x03bc, # GREEK SMALL LETTER MU + 0x00ed: 0x03bd, # GREEK SMALL LETTER NU + 0x00ee: 0x03be, # GREEK SMALL LETTER XI + 0x00ef: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00f0: 0x03c0, # GREEK SMALL LETTER PI + 0x00f1: 0x03c1, # GREEK SMALL LETTER RHO + 0x00f2: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00f3: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00f4: 0x03c4, # GREEK SMALL LETTER TAU + 0x00f5: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f6: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f7: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f8: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f9: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fa: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00fd: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00fe: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ff: None, +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_8.py b/lib-python/2.2/encodings/iso8859_8.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_8.py @@ -0,0 +1,112 @@ +""" Python Character Mapping Codec generated from '8859-8.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00a1: None, + 0x00aa: 0x00d7, # MULTIPLICATION SIGN + 0x00ba: 0x00f7, # DIVISION SIGN + 0x00bf: None, + 0x00c0: None, + 0x00c1: None, + 0x00c2: None, + 0x00c3: None, + 0x00c4: None, + 0x00c5: None, + 0x00c6: None, + 0x00c7: None, + 0x00c8: None, + 0x00c9: None, + 0x00ca: None, + 0x00cb: None, + 0x00cc: None, + 0x00cd: None, + 0x00ce: None, + 0x00cf: None, + 0x00d0: None, + 0x00d1: None, + 0x00d2: None, + 0x00d3: None, + 0x00d4: None, + 0x00d5: None, + 0x00d6: None, + 0x00d7: None, + 0x00d8: None, + 0x00d9: None, + 0x00da: None, + 0x00db: None, + 0x00dc: None, + 0x00dd: None, + 0x00de: None, + 0x00df: 0x2017, # DOUBLE LOW LINE + 0x00e0: 0x05d0, # HEBREW LETTER ALEF + 0x00e1: 0x05d1, # HEBREW LETTER BET + 0x00e2: 0x05d2, # HEBREW LETTER GIMEL + 0x00e3: 0x05d3, # HEBREW LETTER DALET + 0x00e4: 0x05d4, # HEBREW LETTER HE + 0x00e5: 0x05d5, # HEBREW LETTER VAV + 0x00e6: 0x05d6, # HEBREW LETTER ZAYIN + 0x00e7: 0x05d7, # HEBREW LETTER HET + 0x00e8: 0x05d8, # HEBREW LETTER TET + 0x00e9: 0x05d9, # HEBREW LETTER YOD + 0x00ea: 0x05da, # HEBREW LETTER FINAL KAF + 0x00eb: 0x05db, # HEBREW LETTER KAF + 0x00ec: 0x05dc, # HEBREW LETTER LAMED + 0x00ed: 0x05dd, # HEBREW LETTER FINAL MEM + 0x00ee: 0x05de, # HEBREW LETTER MEM + 0x00ef: 0x05df, # HEBREW LETTER FINAL NUN + 0x00f0: 0x05e0, # HEBREW LETTER NUN + 0x00f1: 0x05e1, # HEBREW LETTER SAMEKH + 0x00f2: 0x05e2, # HEBREW LETTER AYIN + 0x00f3: 0x05e3, # HEBREW LETTER FINAL PE + 0x00f4: 0x05e4, # HEBREW LETTER PE + 0x00f5: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x00f6: 0x05e6, # HEBREW LETTER TSADI + 0x00f7: 0x05e7, # HEBREW LETTER QOF + 0x00f8: 0x05e8, # HEBREW LETTER RESH + 0x00f9: 0x05e9, # HEBREW LETTER SHIN + 0x00fa: 0x05ea, # HEBREW LETTER TAV + 0x00fb: None, + 0x00fc: None, + 0x00fd: 0x200e, # LEFT-TO-RIGHT MARK + 0x00fe: 0x200f, # RIGHT-TO-LEFT MARK + 0x00ff: None, +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/iso8859_9.py b/lib-python/2.2/encodings/iso8859_9.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/iso8859_9.py @@ -0,0 +1,50 @@ +""" Python Character Mapping Codec generated from '8859-9.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x00d0: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00dd: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x00de: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00f0: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00fd: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00fe: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/koi8_r.py b/lib-python/2.2/encodings/koi8_r.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/koi8_r.py @@ -0,0 +1,172 @@ +""" Python Character Mapping Codec generated from 'KOI8-R.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x0081: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x0082: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x0083: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x0084: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x0085: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x0086: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x0087: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x0088: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x0089: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x008a: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x008b: 0x2580, # UPPER HALF BLOCK + 0x008c: 0x2584, # LOWER HALF BLOCK + 0x008d: 0x2588, # FULL BLOCK + 0x008e: 0x258c, # LEFT HALF BLOCK + 0x008f: 0x2590, # RIGHT HALF BLOCK + 0x0090: 0x2591, # LIGHT SHADE + 0x0091: 0x2592, # MEDIUM SHADE + 0x0092: 0x2593, # DARK SHADE + 0x0093: 0x2320, # TOP HALF INTEGRAL + 0x0094: 0x25a0, # BLACK SQUARE + 0x0095: 0x2219, # BULLET OPERATOR + 0x0096: 0x221a, # SQUARE ROOT + 0x0097: 0x2248, # ALMOST EQUAL TO + 0x0098: 0x2264, # LESS-THAN OR EQUAL TO + 0x0099: 0x2265, # GREATER-THAN OR EQUAL TO + 0x009a: 0x00a0, # NO-BREAK SPACE + 0x009b: 0x2321, # BOTTOM HALF INTEGRAL + 0x009c: 0x00b0, # DEGREE SIGN + 0x009d: 0x00b2, # SUPERSCRIPT TWO + 0x009e: 0x00b7, # MIDDLE DOT + 0x009f: 0x00f7, # DIVISION SIGN + 0x00a0: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00a1: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00a2: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00a3: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00a4: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00a5: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00a6: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00a7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00a8: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00a9: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00aa: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00ab: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00ac: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00ad: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00ae: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00af: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00b0: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00b1: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00b2: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b3: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00b4: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b5: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00b6: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00b7: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00b8: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00b9: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00ba: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00bb: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00bc: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00bd: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00be: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00bf: 0x00a9, # COPYRIGHT SIGN + 0x00c0: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00c1: 0x0430, # CYRILLIC SMALL LETTER A + 0x00c2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00c3: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00c4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00c5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00c6: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00c7: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00c8: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00c9: 0x0438, # CYRILLIC SMALL LETTER I + 0x00ca: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00cb: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00cc: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00cd: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ce: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00cf: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d0: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d1: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00d2: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00d3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00d4: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00d5: 0x0443, # CYRILLIC SMALL LETTER U + 0x00d6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00d7: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00d8: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00d9: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00da: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00db: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00dc: 0x044d, # CYRILLIC SMALL LETTER E + 0x00dd: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00de: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00df: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00e0: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x00e1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00e2: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00e3: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00e4: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00e5: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00e6: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00e7: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00e8: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00e9: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00ea: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00eb: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00ec: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00ed: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00ee: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00ef: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00f0: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00f1: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00f2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00f3: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00f4: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00f5: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00f6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00f7: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00f8: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00f9: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00fa: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00fb: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00fc: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00fd: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fe: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00ff: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/koi8_u.py b/lib-python/2.2/encodings/koi8_u.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/koi8_u.py @@ -0,0 +1,54 @@ +""" Python Character Mapping Codec for KOI8U. + + This character scheme is compliant to RFC2319 + +Written by Marc-Andre Lemburg (mal at lemburg.com). +Modified by Maxim Dzumanenko . + +(c) Copyright 2002, Python Software Foundation. + +"""#" + +import codecs, koi8_r + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = koi8_r.decoding_map.copy() +decoding_map.update({ + 0x00a4: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00a6: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00a7: 0x0457, # CYRILLIC SMALL LETTER YI (UKRAINIAN) + 0x00ad: 0x0491, # CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + 0x00b4: 0x0403, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00b6: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b7: 0x0407, # CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + 0x00bd: 0x0490, # CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/latin_1.py b/lib-python/2.2/encodings/latin_1.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/latin_1.py @@ -0,0 +1,35 @@ +""" Python 'latin-1' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.latin_1_encode + decode = codecs.latin_1_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.latin_1_decode + decode = codecs.latin_1_encode + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/mac_cyrillic.py b/lib-python/2.2/encodings/mac_cyrillic.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_cyrillic.py @@ -0,0 +1,167 @@ +""" Python Character Mapping Codec generated from 'CYRILLIC.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x2020, # DAGGER + 0x00a1: 0x00b0, # DEGREE SIGN + 0x00a4: 0x00a7, # SECTION SIGN + 0x00a5: 0x2022, # BULLET + 0x00a6: 0x00b6, # PILCROW SIGN + 0x00a7: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x2122, # TRADE MARK SIGN + 0x00ab: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x00ac: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x00af: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x00b0: 0x221e, # INFINITY + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL + 0x00b7: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x00b8: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00b9: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00ba: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00bb: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00bc: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x00bd: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x00be: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x00bf: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x00c0: 0x0458, # CYRILLIC SMALL LETTER JE + 0x00c1: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x221a, # SQUARE ROOT + 0x00c4: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00c5: 0x2248, # ALMOST EQUAL TO + 0x00c6: 0x2206, # INCREMENT + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x00cc: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x00cd: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x00ce: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x00cf: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2014, # EM DASH + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00d8: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00d9: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00da: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x00db: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x00dc: 0x2116, # NUMERO SIGN + 0x00dd: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00de: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00df: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00e0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00e1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00e2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00e3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00e4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00e5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00e6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00e7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00e8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00e9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00ea: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00eb: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ec: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ed: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ee: 0x043e, # CYRILLIC SMALL LETTER O + 0x00ef: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00f0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00f1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00f2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00f3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00f4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00f5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00f6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00f7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00f8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00fb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00fc: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00fd: 0x044d, # CYRILLIC SMALL LETTER E + 0x00fe: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ff: 0x00a4, # CURRENCY SIGN +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mac_greek.py b/lib-python/2.2/encodings/mac_greek.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_greek.py @@ -0,0 +1,170 @@ +""" Python Character Mapping Codec generated from 'GREEK.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00b9, # SUPERSCRIPT ONE + 0x0082: 0x00b2, # SUPERSCRIPT TWO + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00b3, # SUPERSCRIPT THREE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x0385, # GREEK DIALYTIKA TONOS + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x0384, # GREEK TONOS + 0x008c: 0x00a8, # DIAERESIS + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00a3, # POUND SIGN + 0x0093: 0x2122, # TRADE MARK SIGN + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x2022, # BULLET + 0x0097: 0x00bd, # VULGAR FRACTION ONE HALF + 0x0098: 0x2030, # PER MILLE SIGN + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00a6, # BROKEN BAR + 0x009c: 0x00ad, # SOFT HYPHEN + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x2020, # DAGGER + 0x00a1: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a2: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a3: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00a4: 0x039b, # GREEK CAPITAL LETTER LAMBDA + 0x00a5: 0x039e, # GREEK CAPITAL LETTER XI + 0x00a6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00ab: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00ac: 0x00a7, # SECTION SIGN + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x00b0, # DEGREE SIGN + 0x00af: 0x0387, # GREEK ANO TELEIA + 0x00b0: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x00a5, # YEN SIGN + 0x00b5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00b6: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00b7: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00b8: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00b9: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ba: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00bb: 0x039c, # GREEK CAPITAL LETTER MU + 0x00bc: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00bd: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00be: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00bf: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00c0: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00c1: 0x039d, # GREEK CAPITAL LETTER NU + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00c4: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c5: 0x2248, # ALMOST EQUAL TO + 0x00c6: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00cc: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00cd: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00ce: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00cf: 0x0153, # LATIN SMALL LIGATURE OE + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2015, # HORIZONTAL BAR + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00d8: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00d9: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00da: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00db: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00dc: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00dd: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00de: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00df: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00e0: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e1: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e2: 0x03b2, # GREEK SMALL LETTER BETA + 0x00e3: 0x03c8, # GREEK SMALL LETTER PSI + 0x00e4: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00e5: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00e6: 0x03c6, # GREEK SMALL LETTER PHI + 0x00e7: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00e8: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e9: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00ea: 0x03be, # GREEK SMALL LETTER XI + 0x00eb: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00ec: 0x03bb, # GREEK SMALL LETTER LAMBDA + 0x00ed: 0x03bc, # GREEK SMALL LETTER MU + 0x00ee: 0x03bd, # GREEK SMALL LETTER NU + 0x00ef: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00f0: 0x03c0, # GREEK SMALL LETTER PI + 0x00f1: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00f2: 0x03c1, # GREEK SMALL LETTER RHO + 0x00f3: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00f4: 0x03c4, # GREEK SMALL LETTER TAU + 0x00f5: 0x03b8, # GREEK SMALL LETTER THETA + 0x00f6: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00f7: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00f8: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f9: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00fa: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00fb: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00fc: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fd: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00fe: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00ff: None, # UNDEFINED +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mac_iceland.py b/lib-python/2.2/encodings/mac_iceland.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_iceland.py @@ -0,0 +1,166 @@ +""" Python Character Mapping Codec generated from 'ICELAND.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x008c: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00a1: 0x00b0, # DEGREE SIGN + 0x00a4: 0x00a7, # SECTION SIGN + 0x00a5: 0x2022, # BULLET + 0x00a6: 0x00b6, # PILCROW SIGN + 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x2122, # TRADE MARK SIGN + 0x00ab: 0x00b4, # ACUTE ACCENT + 0x00ac: 0x00a8, # DIAERESIS + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x00af: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00b0: 0x221e, # INFINITY + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x00a5, # YEN SIGN + 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL + 0x00b7: 0x2211, # N-ARY SUMMATION + 0x00b8: 0x220f, # N-ARY PRODUCT + 0x00b9: 0x03c0, # GREEK SMALL LETTER PI + 0x00ba: 0x222b, # INTEGRAL + 0x00bb: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00bc: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00bd: 0x2126, # OHM SIGN + 0x00be: 0x00e6, # LATIN SMALL LIGATURE AE + 0x00bf: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x00c0: 0x00bf, # INVERTED QUESTION MARK + 0x00c1: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x221a, # SQUARE ROOT + 0x00c4: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00c5: 0x2248, # ALMOST EQUAL TO + 0x00c6: 0x2206, # INCREMENT + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00cc: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00ce: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x00cf: 0x0153, # LATIN SMALL LIGATURE OE + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2014, # EM DASH + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x25ca, # LOZENGE + 0x00d8: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00d9: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00da: 0x2044, # FRACTION SLASH + 0x00db: 0x00a4, # CURRENCY SIGN + 0x00dc: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00dd: 0x00f0, # LATIN SMALL LETTER ETH + 0x00df: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e0: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00e1: 0x00b7, # MIDDLE DOT + 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00e4: 0x2030, # PER MILLE SIGN + 0x00e5: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00e6: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00e8: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00e9: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00eb: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00ec: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00ed: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00f0: None, # UNDEFINED + 0x00f1: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00f3: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00f4: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00f5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00f6: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x00f7: 0x02dc, # SMALL TILDE + 0x00f8: 0x00af, # MACRON + 0x00f9: 0x02d8, # BREVE + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x02da, # RING ABOVE + 0x00fc: 0x00b8, # CEDILLA + 0x00fd: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00fe: 0x02db, # OGONEK + 0x00ff: 0x02c7, # CARON +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mac_latin2.py b/lib-python/2.2/encodings/mac_latin2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_latin2.py @@ -0,0 +1,170 @@ +""" Python Character Mapping Codec generated from 'LATIN2.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x0082: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x0089: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x008c: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x008d: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x0090: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x0091: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x0094: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x0095: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x0096: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x009e: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x2020, # DAGGER + 0x00a1: 0x00b0, # DEGREE SIGN + 0x00a2: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a4: 0x00a7, # SECTION SIGN + 0x00a5: 0x2022, # BULLET + 0x00a6: 0x00b6, # PILCROW SIGN + 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x2122, # TRADE MARK SIGN + 0x00ab: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00ac: 0x00a8, # DIAERESIS + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x00af: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00b0: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00b1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x00b5: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL + 0x00b7: 0x2211, # N-ARY SUMMATION + 0x00b8: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x00b9: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00ba: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00bb: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x00bc: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x00bd: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x00be: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x00bf: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00c0: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00c1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x221a, # SQUARE ROOT + 0x00c4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00c5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00c6: 0x2206, # INCREMENT + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00cc: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00ce: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x00cf: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2014, # EM DASH + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x25ca, # LOZENGE + 0x00d8: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x00d9: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00da: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00db: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00dc: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x00dd: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x00de: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00df: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x00e0: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x00e1: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00e4: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e5: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x00e6: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00e8: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x00e9: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00eb: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00ec: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00ed: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00f0: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00f1: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00f3: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x00f4: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00f5: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00f6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00f7: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00f8: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00f9: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fa: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00fb: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00fc: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00fd: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00fe: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x00ff: 0x02c7, # CARON +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mac_roman.py b/lib-python/2.2/encodings/mac_roman.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_roman.py @@ -0,0 +1,167 @@ +""" Python Character Mapping Codec generated from 'ROMAN.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x008c: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x2020, # DAGGER + 0x00a1: 0x00b0, # DEGREE SIGN + 0x00a4: 0x00a7, # SECTION SIGN + 0x00a5: 0x2022, # BULLET + 0x00a6: 0x00b6, # PILCROW SIGN + 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x2122, # TRADE MARK SIGN + 0x00ab: 0x00b4, # ACUTE ACCENT + 0x00ac: 0x00a8, # DIAERESIS + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x00af: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00b0: 0x221e, # INFINITY + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x00a5, # YEN SIGN + 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL + 0x00b7: 0x2211, # N-ARY SUMMATION + 0x00b8: 0x220f, # N-ARY PRODUCT + 0x00b9: 0x03c0, # GREEK SMALL LETTER PI + 0x00ba: 0x222b, # INTEGRAL + 0x00bb: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00bc: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00bd: 0x2126, # OHM SIGN + 0x00be: 0x00e6, # LATIN SMALL LIGATURE AE + 0x00bf: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x00c0: 0x00bf, # INVERTED QUESTION MARK + 0x00c1: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x221a, # SQUARE ROOT + 0x00c4: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00c5: 0x2248, # ALMOST EQUAL TO + 0x00c6: 0x2206, # INCREMENT + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00cc: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00ce: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x00cf: 0x0153, # LATIN SMALL LIGATURE OE + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2014, # EM DASH + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x25ca, # LOZENGE + 0x00d8: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00d9: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00da: 0x2044, # FRACTION SLASH + 0x00db: 0x00a4, # CURRENCY SIGN + 0x00dc: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x00dd: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x00de: 0xfb01, # LATIN SMALL LIGATURE FI + 0x00df: 0xfb02, # LATIN SMALL LIGATURE FL + 0x00e0: 0x2021, # DOUBLE DAGGER + 0x00e1: 0x00b7, # MIDDLE DOT + 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00e4: 0x2030, # PER MILLE SIGN + 0x00e5: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00e6: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00e8: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00e9: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00eb: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00ec: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00ed: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00f0: None, # UNDEFINED + 0x00f1: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00f3: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00f4: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00f5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00f6: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x00f7: 0x02dc, # SMALL TILDE + 0x00f8: 0x00af, # MACRON + 0x00f9: 0x02d8, # BREVE + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x02da, # RING ABOVE + 0x00fc: 0x00b8, # CEDILLA + 0x00fd: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00fe: 0x02db, # OGONEK + 0x00ff: 0x02c7, # CARON +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mac_turkish.py b/lib-python/2.2/encodings/mac_turkish.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mac_turkish.py @@ -0,0 +1,167 @@ +""" Python Character Mapping Codec generated from 'TURKISH.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x008c: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x2020, # DAGGER + 0x00a1: 0x00b0, # DEGREE SIGN + 0x00a4: 0x00a7, # SECTION SIGN + 0x00a5: 0x2022, # BULLET + 0x00a6: 0x00b6, # PILCROW SIGN + 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00a8: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x2122, # TRADE MARK SIGN + 0x00ab: 0x00b4, # ACUTE ACCENT + 0x00ac: 0x00a8, # DIAERESIS + 0x00ad: 0x2260, # NOT EQUAL TO + 0x00ae: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x00af: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00b0: 0x221e, # INFINITY + 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO + 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00b4: 0x00a5, # YEN SIGN + 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL + 0x00b7: 0x2211, # N-ARY SUMMATION + 0x00b8: 0x220f, # N-ARY PRODUCT + 0x00b9: 0x03c0, # GREEK SMALL LETTER PI + 0x00ba: 0x222b, # INTEGRAL + 0x00bb: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00bc: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00bd: 0x2126, # OHM SIGN + 0x00be: 0x00e6, # LATIN SMALL LIGATURE AE + 0x00bf: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x00c0: 0x00bf, # INVERTED QUESTION MARK + 0x00c1: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00c2: 0x00ac, # NOT SIGN + 0x00c3: 0x221a, # SQUARE ROOT + 0x00c4: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00c5: 0x2248, # ALMOST EQUAL TO + 0x00c6: 0x2206, # INCREMENT + 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS + 0x00ca: 0x00a0, # NO-BREAK SPACE + 0x00cb: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00cc: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00ce: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x00cf: 0x0153, # LATIN SMALL LIGATURE OE + 0x00d0: 0x2013, # EN DASH + 0x00d1: 0x2014, # EM DASH + 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00d6: 0x00f7, # DIVISION SIGN + 0x00d7: 0x25ca, # LOZENGE + 0x00d8: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00d9: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00da: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00db: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00dc: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x00dd: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00de: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00df: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00e0: 0x2021, # DOUBLE DAGGER + 0x00e1: 0x00b7, # MIDDLE DOT + 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00e4: 0x2030, # PER MILLE SIGN + 0x00e5: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00e6: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00e8: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00e9: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00eb: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00ec: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00ed: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00f0: None, # UNDEFINED + 0x00f1: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00f3: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00f4: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00f5: None, # UNDEFINED + 0x00f6: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x00f7: 0x02dc, # SMALL TILDE + 0x00f8: 0x00af, # MACRON + 0x00f9: 0x02d8, # BREVE + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x02da, # RING ABOVE + 0x00fc: 0x00b8, # CEDILLA + 0x00fd: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00fe: 0x02db, # OGONEK + 0x00ff: 0x02c7, # CARON +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/lib-python/2.2/encodings/mbcs.py b/lib-python/2.2/encodings/mbcs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/mbcs.py @@ -0,0 +1,36 @@ +""" Python 'mbcs' Codec for Windows + + +Cloned by Mark Hammond (mhammond at skippinet.com.au) from ascii.py, +which was written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.mbcs_encode + decode = codecs.mbcs_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.mbcs_decode + decode = codecs.mbcs_encode + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/quopri_codec.py b/lib-python/2.2/encodings/quopri_codec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/quopri_codec.py @@ -0,0 +1,58 @@ +"""Codec for quoted-printable encoding. + +Like base64 and rot13, this returns Python strings, not Unicode. +""" + +import codecs, quopri +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +def quopri_encode(input, errors='strict'): + """Encode the input, returning a tuple (output object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + f = StringIO(input) + g = StringIO() + quopri.encode(f, g, 1) + output = g.getvalue() + return (output, len(input)) + +def quopri_decode(input, errors='strict'): + """Decode the input, returning a tuple (output object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + f = StringIO(input) + g = StringIO() + quopri.decode(f, g) + output = g.getvalue() + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return quopri_encode(input,errors) + def decode(self, input,errors='strict'): + return quopri_decode(input,errors) + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +# encodings module API + +def getregentry(): + return (quopri_encode, quopri_decode, StreamReader, StreamWriter) diff --git a/lib-python/2.2/encodings/raw_unicode_escape.py b/lib-python/2.2/encodings/raw_unicode_escape.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/raw_unicode_escape.py @@ -0,0 +1,30 @@ +""" Python 'raw-unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.raw_unicode_escape_encode + decode = codecs.raw_unicode_escape_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/rot_13.py b/lib-python/2.2/encodings/rot_13.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/rot_13.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +""" Python Character Mapping Codec for ROT13. + + See http://ucsub.colorado.edu/~kominek/rot13/ for details. + + Written by Marc-Andre Lemburg (mal at lemburg.com). + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0041: 0x004e, + 0x0042: 0x004f, + 0x0043: 0x0050, + 0x0044: 0x0051, + 0x0045: 0x0052, + 0x0046: 0x0053, + 0x0047: 0x0054, + 0x0048: 0x0055, + 0x0049: 0x0056, + 0x004a: 0x0057, + 0x004b: 0x0058, + 0x004c: 0x0059, + 0x004d: 0x005a, + 0x004e: 0x0041, + 0x004f: 0x0042, + 0x0050: 0x0043, + 0x0051: 0x0044, + 0x0052: 0x0045, + 0x0053: 0x0046, + 0x0054: 0x0047, + 0x0055: 0x0048, + 0x0056: 0x0049, + 0x0057: 0x004a, + 0x0058: 0x004b, + 0x0059: 0x004c, + 0x005a: 0x004d, + 0x0061: 0x006e, + 0x0062: 0x006f, + 0x0063: 0x0070, + 0x0064: 0x0071, + 0x0065: 0x0072, + 0x0066: 0x0073, + 0x0067: 0x0074, + 0x0068: 0x0075, + 0x0069: 0x0076, + 0x006a: 0x0077, + 0x006b: 0x0078, + 0x006c: 0x0079, + 0x006d: 0x007a, + 0x006e: 0x0061, + 0x006f: 0x0062, + 0x0070: 0x0063, + 0x0071: 0x0064, + 0x0072: 0x0065, + 0x0073: 0x0066, + 0x0074: 0x0067, + 0x0075: 0x0068, + 0x0076: 0x0069, + 0x0077: 0x006a, + 0x0078: 0x006b, + 0x0079: 0x006c, + 0x007a: 0x006d, +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) + +### Filter API + +def rot13(infile, outfile): + outfile.write(infile.read().encode('rot-13')) + +if __name__ == '__main__': + import sys + rot13(sys.stdin, sys.stdout) diff --git a/lib-python/2.2/encodings/undefined.py b/lib-python/2.2/encodings/undefined.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/undefined.py @@ -0,0 +1,34 @@ +""" Python 'undefined' Codec + + This codec will always raise a ValueError exception when being + used. It is intended for use by the site.py file to switch off + automatic string to Unicode coercion. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + raise UnicodeError, "undefined encoding" + + def decode(self,input,errors='strict'): + raise UnicodeError, "undefined encoding" + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/unicode_escape.py b/lib-python/2.2/encodings/unicode_escape.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/unicode_escape.py @@ -0,0 +1,30 @@ +""" Python 'unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_escape_encode + decode = codecs.unicode_escape_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/unicode_internal.py b/lib-python/2.2/encodings/unicode_internal.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/unicode_internal.py @@ -0,0 +1,30 @@ +""" Python 'unicode-internal' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_internal_encode + decode = codecs.unicode_internal_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/utf_16.py b/lib-python/2.2/encodings/utf_16.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/utf_16.py @@ -0,0 +1,61 @@ +""" Python 'utf-16' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs, sys + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.utf_16_encode + decode = codecs.utf_16_decode + +class StreamWriter(Codec,codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + self.bom_written = 0 + codecs.StreamWriter.__init__(self, stream, errors) + + def write(self, data): + result = codecs.StreamWriter.write(self, data) + if not self.bom_written: + self.bom_written = 1 + if sys.byteorder == 'little': + self.encode = codecs.utf_16_le_encode + else: + self.encode = codecs.utf_16_be_encode + return result + +class StreamReader(Codec,codecs.StreamReader): + def __init__(self, stream, errors='strict'): + self.bom_read = 0 + codecs.StreamReader.__init__(self, stream, errors) + + def read(self, size=-1): + if not self.bom_read: + signature = self.stream.read(2) + if signature == codecs.BOM_BE: + self.decode = codecs.utf_16_be_decode + elif signature == codecs.BOM_LE: + self.decode = codecs.utf_16_le_decode + else: + raise UnicodeError,"UTF-16 stream does not start with BOM" + if size > 2: + size -= 2 + elif size >= 0: + size = 0 + self.bom_read = 1 + return codecs.StreamReader.read(self, size) + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/utf_16_be.py b/lib-python/2.2/encodings/utf_16_be.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/utf_16_be.py @@ -0,0 +1,31 @@ +""" Python 'utf-16-be' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.utf_16_be_encode + decode = codecs.utf_16_be_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/utf_16_le.py b/lib-python/2.2/encodings/utf_16_le.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/utf_16_le.py @@ -0,0 +1,31 @@ +""" Python 'utf-16-le' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.utf_16_le_encode + decode = codecs.utf_16_le_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/utf_7.py b/lib-python/2.2/encodings/utf_7.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/utf_7.py @@ -0,0 +1,27 @@ +""" Python 'utf-7' Codec + +Written by Brian Quinlan (brian at sweetapp.com). +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.utf_7_encode + decode = codecs.utf_7_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/utf_8.py b/lib-python/2.2/encodings/utf_8.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/utf_8.py @@ -0,0 +1,31 @@ +""" Python 'utf-8' Codec + + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.utf_8_encode + decode = codecs.utf_8_decode + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + diff --git a/lib-python/2.2/encodings/uu_codec.py b/lib-python/2.2/encodings/uu_codec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/uu_codec.py @@ -0,0 +1,112 @@ +""" Python 'uu_codec' Codec - UU content transfer encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal at lemburg.com). Some details were + adapted from uu.py which was written by Lance Ellinghouse and + modified by Jack Jansen and Fredrik Lundh. + +""" +import codecs, binascii + +### Codec APIs + +def uu_encode(input,errors='strict',filename='',mode=0666): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + from cStringIO import StringIO + from binascii import b2a_uu + infile = StringIO(input) + outfile = StringIO() + read = infile.read + write = outfile.write + + # Encode + write('begin %o %s\n' % (mode & 0777, filename)) + chunk = read(45) + while chunk: + write(b2a_uu(chunk)) + chunk = read(45) + write(' \nend\n') + + return (outfile.getvalue(), len(input)) + +def uu_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + Note: filename and file mode information in the input data is + ignored. + + """ + assert errors == 'strict' + from cStringIO import StringIO + from binascii import a2b_uu + infile = StringIO(input) + outfile = StringIO() + readline = infile.readline + write = outfile.write + + # Find start of encoded data + while 1: + s = readline() + if not s: + raise ValueError, 'Missing "begin" line in input data' + if s[:5] == 'begin': + break + + # Decode + while 1: + s = readline() + if not s or \ + s == 'end\n': + break + try: + data = a2b_uu(s) + except binascii.Error, v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((ord(s[0])-32) & 63) * 4 + 5) / 3 + data = a2b_uu(s[:nbytes]) + #sys.stderr.write("Warning: %s\n" % str(v)) + write(data) + if not s: + raise ValueError, 'Truncated input data' + + return (outfile.getvalue(), len(input)) + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return uu_encode(input,errors) + def decode(self,input,errors='strict'): + return uu_decode(input,errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (uu_encode,uu_decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/encodings/zlib_codec.py b/lib-python/2.2/encodings/zlib_codec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/encodings/zlib_codec.py @@ -0,0 +1,63 @@ +""" Python 'zlib_codec' Codec - zlib compression encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal at lemburg.com). + +""" +import codecs +import zlib # this codec needs the optional zlib module ! + +### Codec APIs + +def zlib_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = zlib.compress(input) + return (output, len(input)) + +def zlib_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = zlib.decompress(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return zlib_encode(input, errors) + def decode(self, input, errors='strict'): + return zlib_decode(input, errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (zlib_encode,zlib_decode,StreamReader,StreamWriter) diff --git a/lib-python/2.2/filecmp.py b/lib-python/2.2/filecmp.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/filecmp.py @@ -0,0 +1,331 @@ +"""Utilities for comparing files and directories. + +Classes: + dircmp + +Functions: + cmp(f1, f2, shallow=1, use_statcache=0) -> int + cmpfiles(a, b, common) -> ([], [], []) + +""" + +import os +import stat +import statcache + +__all__ = ["cmp","dircmp","cmpfiles"] + +_cache = {} +BUFSIZE=8*1024 + +def cmp(f1, f2, shallow=1, use_statcache=0): + """Compare two files. + + Arguments: + + f1 -- First file name + + f2 -- Second file name + + shallow -- Just check stat signature (do not read the files). + defaults to 1. + + use_statcache -- Do not stat() each file directly: go through + the statcache module for more efficiency. + + Return value: + + integer -- 1 if the files are the same, 0 otherwise. + + This function uses a cache for past comparisons and the results, + with a cache invalidation mechanism relying on stale signatures. + Of course, if 'use_statcache' is true, this mechanism is defeated, + and the cache will never grow stale. + + """ + if use_statcache: + stat_function = statcache.stat + else: + stat_function = os.stat + s1 = _sig(stat_function(f1)) + s2 = _sig(stat_function(f2)) + if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG: + return 0 + if shallow and s1 == s2: + return 1 + if s1[1] != s2[1]: + return 0 + + result = _cache.get((f1, f2)) + if result and (s1, s2) == result[:2]: + return result[2] + outcome = _do_cmp(f1, f2) + _cache[f1, f2] = s1, s2, outcome + return outcome + +def _sig(st): + return (stat.S_IFMT(st[stat.ST_MODE]), + st[stat.ST_SIZE], + st[stat.ST_MTIME]) + +def _do_cmp(f1, f2): + bufsize = BUFSIZE + fp1 = open(f1, 'rb') + fp2 = open(f2, 'rb') + while 1: + b1 = fp1.read(bufsize) + b2 = fp2.read(bufsize) + if b1 != b2: + return 0 + if not b1: + return 1 + +# Directory comparison class. +# +class dircmp: + """A class that manages the comparison of 2 directories. + + dircmp(a,b,ignore=None,hide=None) + A and B are directories. + IGNORE is a list of names to ignore, + defaults to ['RCS', 'CVS', 'tags']. + HIDE is a list of names to hide, + defaults to [os.curdir, os.pardir]. + + High level usage: + x = dircmp(dir1, dir2) + x.report() -> prints a report on the differences between dir1 and dir2 + or + x.report_partial_closure() -> prints report on differences between dir1 + and dir2, and reports on common immediate subdirectories. + x.report_full_closure() -> like report_partial_closure, + but fully recursive. + + Attributes: + left_list, right_list: The files in dir1 and dir2, + filtered by hide and ignore. + common: a list of names in both dir1 and dir2. + left_only, right_only: names only in dir1, dir2. + common_dirs: subdirectories in both dir1 and dir2. + common_files: files in both dir1 and dir2. + common_funny: names in both dir1 and dir2 where the type differs between + dir1 and dir2, or the name is not stat-able. + same_files: list of identical files. + diff_files: list of filenames which differ. + funny_files: list of files which could not be compared. + subdirs: a dictionary of dircmp objects, keyed by names in common_dirs. + """ + + def __init__(self, a, b, ignore=None, hide=None): # Initialize + self.left = a + self.right = b + if hide is None: + self.hide = [os.curdir, os.pardir] # Names never to be shown + else: + self.hide = hide + if ignore is None: + self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison + else: + self.ignore = ignore + + def phase0(self): # Compare everything except common subdirectories + self.left_list = _filter(os.listdir(self.left), + self.hide+self.ignore) + self.right_list = _filter(os.listdir(self.right), + self.hide+self.ignore) + self.left_list.sort() + self.right_list.sort() + + __p4_attrs = ('subdirs',) + __p3_attrs = ('same_files', 'diff_files', 'funny_files') + __p2_attrs = ('common_dirs', 'common_files', 'common_funny') + __p1_attrs = ('common', 'left_only', 'right_only') + __p0_attrs = ('left_list', 'right_list') + + def __getattr__(self, attr): + if attr in self.__p4_attrs: + self.phase4() + elif attr in self.__p3_attrs: + self.phase3() + elif attr in self.__p2_attrs: + self.phase2() + elif attr in self.__p1_attrs: + self.phase1() + elif attr in self.__p0_attrs: + self.phase0() + else: + raise AttributeError, attr + return getattr(self, attr) + + def phase1(self): # Compute common names + a_only, b_only = [], [] + common = {} + b = {} + for fnm in self.right_list: + b[fnm] = 1 + for x in self.left_list: + if b.get(x, 0): + common[x] = 1 + else: + a_only.append(x) + for x in self.right_list: + if common.get(x, 0): + pass + else: + b_only.append(x) + self.common = common.keys() + self.left_only = a_only + self.right_only = b_only + + def phase2(self): # Distinguish files, directories, funnies + self.common_dirs = [] + self.common_files = [] + self.common_funny = [] + + for x in self.common: + a_path = os.path.join(self.left, x) + b_path = os.path.join(self.right, x) + + ok = 1 + try: + a_stat = statcache.stat(a_path) + except os.error, why: + # print 'Can\'t stat', a_path, ':', why[1] + ok = 0 + try: + b_stat = statcache.stat(b_path) + except os.error, why: + # print 'Can\'t stat', b_path, ':', why[1] + ok = 0 + + if ok: + a_type = stat.S_IFMT(a_stat[stat.ST_MODE]) + b_type = stat.S_IFMT(b_stat[stat.ST_MODE]) + if a_type != b_type: + self.common_funny.append(x) + elif stat.S_ISDIR(a_type): + self.common_dirs.append(x) + elif stat.S_ISREG(a_type): + self.common_files.append(x) + else: + self.common_funny.append(x) + else: + self.common_funny.append(x) + + def phase3(self): # Find out differences between common files + xx = cmpfiles(self.left, self.right, self.common_files) + self.same_files, self.diff_files, self.funny_files = xx + + def phase4(self): # Find out differences between common subdirectories + # A new dircmp object is created for each common subdirectory, + # these are stored in a dictionary indexed by filename. + # The hide and ignore properties are inherited from the parent + self.subdirs = {} + for x in self.common_dirs: + a_x = os.path.join(self.left, x) + b_x = os.path.join(self.right, x) + self.subdirs[x] = dircmp(a_x, b_x, self.ignore, self.hide) + + def phase4_closure(self): # Recursively call phase4() on subdirectories + self.phase4() + for x in self.subdirs.keys(): + self.subdirs[x].phase4_closure() + + def report(self): # Print a report on the differences between a and b + # Output format is purposely lousy + print 'diff', self.left, self.right + if self.left_only: + self.left_only.sort() + print 'Only in', self.left, ':', self.left_only + if self.right_only: + self.right_only.sort() + print 'Only in', self.right, ':', self.right_only + if self.same_files: + self.same_files.sort() + print 'Identical files :', self.same_files + if self.diff_files: + self.diff_files.sort() + print 'Differing files :', self.diff_files + if self.funny_files: + self.funny_files.sort() + print 'Trouble with common files :', self.funny_files + if self.common_dirs: + self.common_dirs.sort() + print 'Common subdirectories :', self.common_dirs + if self.common_funny: + self.common_funny.sort() + print 'Common funny cases :', self.common_funny + + def report_partial_closure(self): # Print reports on self and on subdirs + self.report() + for x in self.subdirs.keys(): + print + self.subdirs[x].report() + + def report_full_closure(self): # Report on self and subdirs recursively + self.report() + for x in self.subdirs.keys(): + print + self.subdirs[x].report_full_closure() + + +def cmpfiles(a, b, common, shallow=1, use_statcache=0): + """Compare common files in two directories. + + a, b -- directory names + common -- list of file names found in both directories + shallow -- if true, do comparison based solely on stat() information + use_statcache -- if true, use statcache.stat() instead of os.stat() + + Returns a tuple of three lists: + files that compare equal + files that are different + filenames that aren't regular files. + + """ + res = ([], [], []) + for x in common: + ax = os.path.join(a, x) + bx = os.path.join(b, x) + res[_cmp(ax, bx, shallow, use_statcache)].append(x) + return res + + +# Compare two files. +# Return: +# 0 for equal +# 1 for different +# 2 for funny cases (can't stat, etc.) +# +def _cmp(a, b, sh, st): + try: + return not abs(cmp(a, b, sh, st)) + except os.error: + return 2 + + +# Return a copy with items that occur in skip removed. +# +def _filter(list, skip): + result = [] + for item in list: + if item not in skip: result.append(item) + return result + + +# Demonstration and testing. +# +def demo(): + import sys + import getopt + options, args = getopt.getopt(sys.argv[1:], 'r') + if len(args) != 2: + raise getopt.error, 'need exactly two args' + dd = dircmp(args[0], args[1]) + if ('-r', '') in options: + dd.report_full_closure() + else: + dd.report() + +if __name__ == '__main__': + demo() diff --git a/lib-python/2.2/fileinput.py b/lib-python/2.2/fileinput.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/fileinput.py @@ -0,0 +1,349 @@ +"""Helper class to quickly write a loop over all standard input files. + +Typical use is: + + import fileinput + for line in fileinput.input(): + process(line) + +This iterates over the lines of all files listed in sys.argv[1:], +defaulting to sys.stdin if the list is empty. If a filename is '-' it +is also replaced by sys.stdin. To specify an alternative list of +filenames, pass it as the argument to input(). A single file name is +also allowed. + +Functions filename(), lineno() return the filename and cumulative line +number of the line that has just been read; filelineno() returns its +line number in the current file; isfirstline() returns true iff the +line just read is the first line of its file; isstdin() returns true +iff the line was read from sys.stdin. Function nextfile() closes the +current file so that the next iteration will read the first line from +the next file (if any); lines not read from the file will not count +towards the cumulative line count; the filename is not changed until +after the first line of the next file has been read. Function close() +closes the sequence. + +Before any lines have been read, filename() returns None and both line +numbers are zero; nextfile() has no effect. After all lines have been +read, filename() and the line number functions return the values +pertaining to the last line read; nextfile() has no effect. + +All files are opened in text mode. If an I/O error occurs during +opening or reading a file, the IOError exception is raised. + +If sys.stdin is used more than once, the second and further use will +return no lines, except perhaps for interactive use, or if it has been +explicitly reset (e.g. using sys.stdin.seek(0)). + +Empty files are opened and immediately closed; the only time their +presence in the list of filenames is noticeable at all is when the +last file opened is empty. + +It is possible that the last line of a file doesn't end in a newline +character; otherwise lines are returned including the trailing +newline. + +Class FileInput is the implementation; its methods filename(), +lineno(), fileline(), isfirstline(), isstdin(), nextfile() and close() +correspond to the functions in the module. In addition it has a +readline() method which returns the next input line, and a +__getitem__() method which implements the sequence behavior. The +sequence must be accessed in strictly sequential order; sequence +access and readline() cannot be mixed. + +Optional in-place filtering: if the keyword argument inplace=1 is +passed to input() or to the FileInput constructor, the file is moved +to a backup file and standard output is directed to the input file. +This makes it possible to write a filter that rewrites its input file +in place. If the keyword argument backup="." is also +given, it specifies the extension for the backup file, and the backup +file remains around; by default, the extension is ".bak" and it is +deleted when the output file is closed. In-place filtering is +disabled when standard input is read. XXX The current implementation +does not work for MS-DOS 8+3 filesystems. + +Performance: this module is unfortunately one of the slower ways of +processing large numbers of input lines. Nevertheless, a significant +speed-up has been obtained by using readlines(bufsize) instead of +readline(). A new keyword argument, bufsize=N, is present on the +input() function and the FileInput() class to override the default +buffer size. + +XXX Possible additions: + +- optional getopt argument processing +- specify open mode ('r' or 'rb') +- fileno() +- isatty() +- read(), read(size), even readlines() + +""" + +import sys, os, stat + +__all__ = ["input","close","nextfile","filename","lineno","filelineno", + "isfirstline","isstdin","FileInput"] + +_state = None + +DEFAULT_BUFSIZE = 8*1024 + +def input(files=None, inplace=0, backup="", bufsize=0): + """input([files[, inplace[, backup]]]) + + Create an instance of the FileInput class. The instance will be used + as global state for the functions of this module, and is also returned + to use during iteration. The parameters to this function will be passed + along to the constructor of the FileInput class. + """ + global _state + if _state and _state._file: + raise RuntimeError, "input() already active" + _state = FileInput(files, inplace, backup, bufsize) + return _state + +def close(): + """Close the sequence.""" + global _state + state = _state + _state = None + if state: + state.close() + +def nextfile(): + """ + Close the current file so that the next iteration will read the first + line from the next file (if any); lines not read from the file will + not count towards the cumulative line count. The filename is not + changed until after the first line of the next file has been read. + Before the first line has been read, this function has no effect; + it cannot be used to skip the first file. After the last line of the + last file has been read, this function has no effect. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.nextfile() + +def filename(): + """ + Return the name of the file currently being read. + Before the first line has been read, returns None. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.filename() + +def lineno(): + """ + Return the cumulative line number of the line that has just been read. + Before the first line has been read, returns 0. After the last line + of the last file has been read, returns the line number of that line. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.lineno() + +def filelineno(): + """ + Return the line number in the current file. Before the first line + has been read, returns 0. After the last line of the last file has + been read, returns the line number of that line within the file. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.filelineno() + +def isfirstline(): + """ + Returns true the line just read is the first line of its file, + otherwise returns false. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.isfirstline() + +def isstdin(): + """ + Returns true if the last line was read from sys.stdin, + otherwise returns false. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.isstdin() + +class FileInput: + """class FileInput([files[, inplace[, backup]]]) + + Class FileInput is the implementation of the module; its methods + filename(), lineno(), fileline(), isfirstline(), isstdin(), nextfile() + and close() correspond to the functions of the same name in the module. + In addition it has a readline() method which returns the next + input line, and a __getitem__() method which implements the + sequence behavior. The sequence must be accessed in strictly + sequential order; random access and readline() cannot be mixed. + """ + + def __init__(self, files=None, inplace=0, backup="", bufsize=0): + if type(files) == type(''): + files = (files,) + else: + if files is None: + files = sys.argv[1:] + if not files: + files = ('-',) + else: + files = tuple(files) + self._files = files + self._inplace = inplace + self._backup = backup + self._bufsize = bufsize or DEFAULT_BUFSIZE + self._savestdout = None + self._output = None + self._filename = None + self._lineno = 0 + self._filelineno = 0 + self._file = None + self._isstdin = 0 + self._backupfilename = None + self._buffer = [] + self._bufindex = 0 + + def __del__(self): + self.close() + + def close(self): + self.nextfile() + self._files = () + + def __getitem__(self, i): + try: + line = self._buffer[self._bufindex] + except IndexError: + pass + else: + self._bufindex += 1 + self._lineno += 1 + self._filelineno += 1 + return line + if i != self._lineno: + raise RuntimeError, "accessing lines out of order" + line = self.readline() + if not line: + raise IndexError, "end of input reached" + return line + + def nextfile(self): + savestdout = self._savestdout + self._savestdout = 0 + if savestdout: + sys.stdout = savestdout + + output = self._output + self._output = 0 + if output: + output.close() + + file = self._file + self._file = 0 + if file and not self._isstdin: + file.close() + + backupfilename = self._backupfilename + self._backupfilename = 0 + if backupfilename and not self._backup: + try: os.unlink(backupfilename) + except: pass + + self._isstdin = 0 + self._buffer = [] + self._bufindex = 0 + + def readline(self): + try: + line = self._buffer[self._bufindex] + except IndexError: + pass + else: + self._bufindex += 1 + self._lineno += 1 + self._filelineno += 1 + return line + if not self._file: + if not self._files: + return "" + self._filename = self._files[0] + self._files = self._files[1:] + self._filelineno = 0 + self._file = None + self._isstdin = 0 + self._backupfilename = 0 + if self._filename == '-': + self._filename = '' + self._file = sys.stdin + self._isstdin = 1 + else: + if self._inplace: + self._backupfilename = ( + self._filename + (self._backup or os.extsep+"bak")) + try: os.unlink(self._backupfilename) + except os.error: pass + # The next few lines may raise IOError + os.rename(self._filename, self._backupfilename) + self._file = open(self._backupfilename, "r") + try: + perm = os.fstat(self._file.fileno())[stat.ST_MODE] + except: + self._output = open(self._filename, "w") + else: + fd = os.open(self._filename, + os.O_CREAT | os.O_WRONLY | os.O_TRUNC, + perm) + self._output = os.fdopen(fd, "w") + try: + os.chmod(self._filename, perm) + except: + pass + self._savestdout = sys.stdout + sys.stdout = self._output + else: + # This may raise IOError + self._file = open(self._filename, "r") + self._buffer = self._file.readlines(self._bufsize) + self._bufindex = 0 + if not self._buffer: + self.nextfile() + # Recursive call + return self.readline() + + def filename(self): + return self._filename + + def lineno(self): + return self._lineno + + def filelineno(self): + return self._filelineno + + def isfirstline(self): + return self._filelineno == 1 + + def isstdin(self): + return self._isstdin + +def _test(): + import getopt + inplace = 0 + backup = 0 + opts, args = getopt.getopt(sys.argv[1:], "ib:") + for o, a in opts: + if o == '-i': inplace = 1 + if o == '-b': backup = a + for line in input(args, inplace=inplace, backup=backup): + if line[-1:] == '\n': line = line[:-1] + if line[-1:] == '\r': line = line[:-1] + print "%d: %s[%d]%s %s" % (lineno(), filename(), filelineno(), + isfirstline() and "*" or "", line) + print "%d: %s[%d]" % (lineno(), filename(), filelineno()) + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/fnmatch.py b/lib-python/2.2/fnmatch.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/fnmatch.py @@ -0,0 +1,107 @@ +"""Filename matching with shell patterns. + +fnmatch(FILENAME, PATTERN) matches according to the local convention. +fnmatchcase(FILENAME, PATTERN) always takes case in account. + +The functions operate by translating the pattern into a regular +expression. They cache the compiled regular expressions for speed. + +The function translate(PATTERN) returns a regular expression +corresponding to PATTERN. (It does not compile it.) +""" + +import re + +__all__ = ["fnmatch","fnmatchcase","translate"] + +_cache = {} + +def fnmatch(name, pat): + """Test whether FILENAME matches PATTERN. + + Patterns are Unix shell style: + + * matches everything + ? matches any single character + [seq] matches any character in seq + [!seq] matches any char not in seq + + An initial period in FILENAME is not special. + Both FILENAME and PATTERN are first case-normalized + if the operating system requires it. + If you don't want this, use fnmatchcase(FILENAME, PATTERN). + """ + + import os + name = os.path.normcase(name) + pat = os.path.normcase(pat) + return fnmatchcase(name, pat) + +def filter(names, pat): + """Return the subset of the list NAMES that match PAT""" + import os,posixpath + result=[] + pat=os.path.normcase(pat) + if not _cache.has_key(pat): + res = translate(pat) + _cache[pat] = re.compile(res) + match=_cache[pat].match + if os.path is posixpath: + # normcase on posix is NOP. Optimize it away from the loop. + for name in names: + if match(name): + result.append(name) + else: + for name in names: + if match(os.path.normcase(name)): + result.append(name) + return result + +def fnmatchcase(name, pat): + """Test whether FILENAME matches PATTERN, including case. + + This is a version of fnmatch() which doesn't case-normalize + its arguments. + """ + + if not _cache.has_key(pat): + res = translate(pat) + _cache[pat] = re.compile(res) + return _cache[pat].match(name) is not None + +def translate(pat): + """Translate a shell PATTERN to a regular expression. + + There is no way to quote meta-characters. + """ + + i, n = 0, len(pat) + res = '' + while i < n: + c = pat[i] + i = i+1 + if c == '*': + res = res + '.*' + elif c == '?': + res = res + '.' + elif c == '[': + j = i + if j < n and pat[j] == '!': + j = j+1 + if j < n and pat[j] == ']': + j = j+1 + while j < n and pat[j] != ']': + j = j+1 + if j >= n: + res = res + '\\[' + else: + stuff = pat[i:j].replace('\\','\\\\') + i = j+1 + if stuff[0] == '!': + stuff = '^' + stuff[1:] + elif stuff[0] == '^': + stuff = '\\' + stuff + res = '%s[%s]' % (res, stuff) + else: + res = res + re.escape(c) + return res + "$" diff --git a/lib-python/2.2/formatter.py b/lib-python/2.2/formatter.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/formatter.py @@ -0,0 +1,454 @@ +"""Generic output formatting. + +Formatter objects transform an abstract flow of formatting events into +specific output events on writer objects. Formatters manage several stack +structures to allow various properties of a writer object to be changed and +restored; writers need not be able to handle relative changes nor any sort +of ``change back'' operation. Specific writer properties which may be +controlled via formatter objects are horizontal alignment, font, and left +margin indentations. A mechanism is provided which supports providing +arbitrary, non-exclusive style settings to a writer as well. Additional +interfaces facilitate formatting events which are not reversible, such as +paragraph separation. + +Writer objects encapsulate device interfaces. Abstract devices, such as +file formats, are supported as well as physical devices. The provided +implementations all work with abstract devices. The interface makes +available mechanisms for setting the properties which formatter objects +manage and inserting data into the output. +""" + +import string +import sys +from types import StringType + + +AS_IS = None + + +class NullFormatter: + """A formatter which does nothing. + + If the writer parameter is omitted, a NullWriter instance is created. + No methods of the writer are called by NullFormatter instances. + + Implementations should inherit from this class if implementing a writer + interface but don't need to inherit any implementation. + + """ + + def __init__(self, writer=None): + if not writer: + writer = NullWriter() + self.writer = writer + def end_paragraph(self, blankline): pass + def add_line_break(self): pass + def add_hor_rule(self, *args, **kw): pass + def add_label_data(self, format, counter, blankline=None): pass + def add_flowing_data(self, data): pass + def add_literal_data(self, data): pass + def flush_softspace(self): pass + def push_alignment(self, align): pass + def pop_alignment(self): pass + def push_font(self, x): pass + def pop_font(self): pass + def push_margin(self, margin): pass + def pop_margin(self): pass + def set_spacing(self, spacing): pass + def push_style(self, *styles): pass + def pop_style(self, n=1): pass + def assert_line_data(self, flag=1): pass + + +class AbstractFormatter: + """The standard formatter. + + This implementation has demonstrated wide applicability to many writers, + and may be used directly in most circumstances. It has been used to + implement a full-featured World Wide Web browser. + + """ + + # Space handling policy: blank spaces at the boundary between elements + # are handled by the outermost context. "Literal" data is not checked + # to determine context, so spaces in literal data are handled directly + # in all circumstances. + + def __init__(self, writer): + self.writer = writer # Output device + self.align = None # Current alignment + self.align_stack = [] # Alignment stack + self.font_stack = [] # Font state + self.margin_stack = [] # Margin state + self.spacing = None # Vertical spacing state + self.style_stack = [] # Other state, e.g. color + self.nospace = 1 # Should leading space be suppressed + self.softspace = 0 # Should a space be inserted + self.para_end = 1 # Just ended a paragraph + self.parskip = 0 # Skipped space between paragraphs? + self.hard_break = 1 # Have a hard break + self.have_label = 0 + + def end_paragraph(self, blankline): + if not self.hard_break: + self.writer.send_line_break() + self.have_label = 0 + if self.parskip < blankline and not self.have_label: + self.writer.send_paragraph(blankline - self.parskip) + self.parskip = blankline + self.have_label = 0 + self.hard_break = self.nospace = self.para_end = 1 + self.softspace = 0 + + def add_line_break(self): + if not (self.hard_break or self.para_end): + self.writer.send_line_break() + self.have_label = self.parskip = 0 + self.hard_break = self.nospace = 1 + self.softspace = 0 + + def add_hor_rule(self, *args, **kw): + if not self.hard_break: + self.writer.send_line_break() + apply(self.writer.send_hor_rule, args, kw) + self.hard_break = self.nospace = 1 + self.have_label = self.para_end = self.softspace = self.parskip = 0 + + def add_label_data(self, format, counter, blankline = None): + if self.have_label or not self.hard_break: + self.writer.send_line_break() + if not self.para_end: + self.writer.send_paragraph((blankline and 1) or 0) + if type(format) is StringType: + self.writer.send_label_data(self.format_counter(format, counter)) + else: + self.writer.send_label_data(format) + self.nospace = self.have_label = self.hard_break = self.para_end = 1 + self.softspace = self.parskip = 0 + + def format_counter(self, format, counter): + label = '' + for c in format: + if c == '1': + label = label + ('%d' % counter) + elif c in 'aA': + if counter > 0: + label = label + self.format_letter(c, counter) + elif c in 'iI': + if counter > 0: + label = label + self.format_roman(c, counter) + else: + label = label + c + return label + + def format_letter(self, case, counter): + label = '' + while counter > 0: + counter, x = divmod(counter-1, 26) + # This makes a strong assumption that lowercase letters + # and uppercase letters form two contiguous blocks, with + # letters in order! + s = chr(ord(case) + x) + label = s + label + return label + + def format_roman(self, case, counter): + ones = ['i', 'x', 'c', 'm'] + fives = ['v', 'l', 'd'] + label, index = '', 0 + # This will die of IndexError when counter is too big + while counter > 0: + counter, x = divmod(counter, 10) + if x == 9: + label = ones[index] + ones[index+1] + label + elif x == 4: + label = ones[index] + fives[index] + label + else: + if x >= 5: + s = fives[index] + x = x-5 + else: + s = '' + s = s + ones[index]*x + label = s + label + index = index + 1 + if case == 'I': + return label.upper() + return label + + def add_flowing_data(self, data, + # These are only here to load them into locals: + whitespace = string.whitespace, + join = string.join, split = string.split): + if not data: return + # The following looks a bit convoluted but is a great improvement over + # data = regsub.gsub('[' + string.whitespace + ']+', ' ', data) + prespace = data[:1] in whitespace + postspace = data[-1:] in whitespace + data = join(split(data)) + if self.nospace and not data: + return + elif prespace or self.softspace: + if not data: + if not self.nospace: + self.softspace = 1 + self.parskip = 0 + return + if not self.nospace: + data = ' ' + data + self.hard_break = self.nospace = self.para_end = \ + self.parskip = self.have_label = 0 + self.softspace = postspace + self.writer.send_flowing_data(data) + + def add_literal_data(self, data): + if not data: return + if self.softspace: + self.writer.send_flowing_data(" ") + self.hard_break = data[-1:] == '\n' + self.nospace = self.para_end = self.softspace = \ + self.parskip = self.have_label = 0 + self.writer.send_literal_data(data) + + def flush_softspace(self): + if self.softspace: + self.hard_break = self.para_end = self.parskip = \ + self.have_label = self.softspace = 0 + self.nospace = 1 + self.writer.send_flowing_data(' ') + + def push_alignment(self, align): + if align and align != self.align: + self.writer.new_alignment(align) + self.align = align + self.align_stack.append(align) + else: + self.align_stack.append(self.align) + + def pop_alignment(self): + if self.align_stack: + del self.align_stack[-1] + if self.align_stack: + self.align = align = self.align_stack[-1] + self.writer.new_alignment(align) + else: + self.align = None + self.writer.new_alignment(None) + + def push_font(self, (size, i, b, tt)): + if self.softspace: + self.hard_break = self.para_end = self.softspace = 0 + self.nospace = 1 + self.writer.send_flowing_data(' ') + if self.font_stack: + csize, ci, cb, ctt = self.font_stack[-1] + if size is AS_IS: size = csize + if i is AS_IS: i = ci + if b is AS_IS: b = cb + if tt is AS_IS: tt = ctt + font = (size, i, b, tt) + self.font_stack.append(font) + self.writer.new_font(font) + + def pop_font(self): + if self.font_stack: + del self.font_stack[-1] + if self.font_stack: + font = self.font_stack[-1] + else: + font = None + self.writer.new_font(font) + + def push_margin(self, margin): + self.margin_stack.append(margin) + fstack = filter(None, self.margin_stack) + if not margin and fstack: + margin = fstack[-1] + self.writer.new_margin(margin, len(fstack)) + + def pop_margin(self): + if self.margin_stack: + del self.margin_stack[-1] + fstack = filter(None, self.margin_stack) + if fstack: + margin = fstack[-1] + else: + margin = None + self.writer.new_margin(margin, len(fstack)) + + def set_spacing(self, spacing): + self.spacing = spacing + self.writer.new_spacing(spacing) + + def push_style(self, *styles): + if self.softspace: + self.hard_break = self.para_end = self.softspace = 0 + self.nospace = 1 + self.writer.send_flowing_data(' ') + for style in styles: + self.style_stack.append(style) + self.writer.new_styles(tuple(self.style_stack)) + + def pop_style(self, n=1): + del self.style_stack[-n:] + self.writer.new_styles(tuple(self.style_stack)) + + def assert_line_data(self, flag=1): + self.nospace = self.hard_break = not flag + self.para_end = self.parskip = self.have_label = 0 + + +class NullWriter: + """Minimal writer interface to use in testing & inheritance. + + A writer which only provides the interface definition; no actions are + taken on any methods. This should be the base class for all writers + which do not need to inherit any implementation methods. + + """ + def __init__(self): pass + def flush(self): pass + def new_alignment(self, align): pass + def new_font(self, font): pass + def new_margin(self, margin, level): pass + def new_spacing(self, spacing): pass + def new_styles(self, styles): pass + def send_paragraph(self, blankline): pass + def send_line_break(self): pass + def send_hor_rule(self, *args, **kw): pass + def send_label_data(self, data): pass + def send_flowing_data(self, data): pass + def send_literal_data(self, data): pass + + +class AbstractWriter(NullWriter): + """A writer which can be used in debugging formatters, but not much else. + + Each method simply announces itself by printing its name and + arguments on standard output. + + """ + + def new_alignment(self, align): + print "new_alignment(%s)" % `align` + + def new_font(self, font): + print "new_font(%s)" % `font` + + def new_margin(self, margin, level): + print "new_margin(%s, %d)" % (`margin`, level) + + def new_spacing(self, spacing): + print "new_spacing(%s)" % `spacing` + + def new_styles(self, styles): + print "new_styles(%s)" % `styles` + + def send_paragraph(self, blankline): + print "send_paragraph(%s)" % `blankline` + + def send_line_break(self): + print "send_line_break()" + + def send_hor_rule(self, *args, **kw): + print "send_hor_rule()" + + def send_label_data(self, data): + print "send_label_data(%s)" % `data` + + def send_flowing_data(self, data): + print "send_flowing_data(%s)" % `data` + + def send_literal_data(self, data): + print "send_literal_data(%s)" % `data` + + +class DumbWriter(NullWriter): + """Simple writer class which writes output on the file object passed in + as the file parameter or, if file is omitted, on standard output. The + output is simply word-wrapped to the number of columns specified by + the maxcol parameter. This class is suitable for reflowing a sequence + of paragraphs. + + """ + + def __init__(self, file=None, maxcol=72): + self.file = file or sys.stdout + self.maxcol = maxcol + NullWriter.__init__(self) + self.reset() + + def reset(self): + self.col = 0 + self.atbreak = 0 + + def send_paragraph(self, blankline): + self.file.write('\n'*blankline) + self.col = 0 + self.atbreak = 0 + + def send_line_break(self): + self.file.write('\n') + self.col = 0 + self.atbreak = 0 + + def send_hor_rule(self, *args, **kw): + self.file.write('\n') + self.file.write('-'*self.maxcol) + self.file.write('\n') + self.col = 0 + self.atbreak = 0 + + def send_literal_data(self, data): + self.file.write(data) + i = data.rfind('\n') + if i >= 0: + self.col = 0 + data = data[i+1:] + data = data.expandtabs() + self.col = self.col + len(data) + self.atbreak = 0 + + def send_flowing_data(self, data): + if not data: return + atbreak = self.atbreak or data[0] in string.whitespace + col = self.col + maxcol = self.maxcol + write = self.file.write + for word in data.split(): + if atbreak: + if col + len(word) >= maxcol: + write('\n') + col = 0 + else: + write(' ') + col = col + 1 + write(word) + col = col + len(word) + atbreak = 1 + self.col = col + self.atbreak = data[-1] in string.whitespace + + +def test(file = None): + w = DumbWriter() + f = AbstractFormatter(w) + if file: + fp = open(file) + elif sys.argv[1:]: + fp = open(sys.argv[1]) + else: + fp = sys.stdin + while 1: + line = fp.readline() + if not line: + break + if line == '\n': + f.end_paragraph(1) + else: + f.add_flowing_data(line) + f.end_paragraph(0) + + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/fpformat.py b/lib-python/2.2/fpformat.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/fpformat.py @@ -0,0 +1,142 @@ +"""General floating point formatting functions. + +Functions: +fix(x, digits_behind) +sci(x, digits_behind) + +Each takes a number or a string and a number of digits as arguments. + +Parameters: +x: number to be formatted; or a string resembling a number +digits_behind: number of digits behind the decimal point +""" + +import re + +__all__ = ["fix","sci","NotANumber"] + +# Compiled regular expression to "decode" a number +decoder = re.compile(r'^([-+]?)0*(\d*)((?:\.\d*)?)(([eE][-+]?\d+)?)$') +# \0 the whole thing +# \1 leading sign or empty +# \2 digits left of decimal point +# \3 fraction (empty or begins with point) +# \4 exponent part (empty or begins with 'e' or 'E') + +try: + class NotANumber(ValueError): + pass +except TypeError: + NotANumber = 'fpformat.NotANumber' + +def extract(s): + """Return (sign, intpart, fraction, expo) or raise an exception: + sign is '+' or '-' + intpart is 0 or more digits beginning with a nonzero + fraction is 0 or more digits + expo is an integer""" + res = decoder.match(s) + if res is None: raise NotANumber, s + sign, intpart, fraction, exppart = res.group(1,2,3,4) + if sign == '+': sign = '' + if fraction: fraction = fraction[1:] + if exppart: expo = int(exppart[1:]) + else: expo = 0 + return sign, intpart, fraction, expo + +def unexpo(intpart, fraction, expo): + """Remove the exponent by changing intpart and fraction.""" + if expo > 0: # Move the point left + f = len(fraction) + intpart, fraction = intpart + fraction[:expo], fraction[expo:] + if expo > f: + intpart = intpart + '0'*(expo-f) + elif expo < 0: # Move the point right + i = len(intpart) + intpart, fraction = intpart[:expo], intpart[expo:] + fraction + if expo < -i: + fraction = '0'*(-expo-i) + fraction + return intpart, fraction + +def roundfrac(intpart, fraction, digs): + """Round or extend the fraction to size digs.""" + f = len(fraction) + if f <= digs: + return intpart, fraction + '0'*(digs-f) + i = len(intpart) + if i+digs < 0: + return '0'*-digs, '' + total = intpart + fraction + nextdigit = total[i+digs] + if nextdigit >= '5': # Hard case: increment last digit, may have carry! + n = i + digs - 1 + while n >= 0: + if total[n] != '9': break + n = n-1 + else: + total = '0' + total + i = i+1 + n = 0 + total = total[:n] + chr(ord(total[n]) + 1) + '0'*(len(total)-n-1) + intpart, fraction = total[:i], total[i:] + if digs >= 0: + return intpart, fraction[:digs] + else: + return intpart[:digs] + '0'*-digs, '' + +def fix(x, digs): + """Format x as [-]ddd.ddd with 'digs' digits after the point + and at least one digit before. + If digs <= 0, the point is suppressed.""" + if type(x) != type(''): x = `x` + try: + sign, intpart, fraction, expo = extract(x) + except NotANumber: + return x + intpart, fraction = unexpo(intpart, fraction, expo) + intpart, fraction = roundfrac(intpart, fraction, digs) + while intpart and intpart[0] == '0': intpart = intpart[1:] + if intpart == '': intpart = '0' + if digs > 0: return sign + intpart + '.' + fraction + else: return sign + intpart + +def sci(x, digs): + """Format x as [-]d.dddE[+-]ddd with 'digs' digits after the point + and exactly one digit before. + If digs is <= 0, one digit is kept and the point is suppressed.""" + if type(x) != type(''): x = `x` + sign, intpart, fraction, expo = extract(x) + if not intpart: + while fraction and fraction[0] == '0': + fraction = fraction[1:] + expo = expo - 1 + if fraction: + intpart, fraction = fraction[0], fraction[1:] + expo = expo - 1 + else: + intpart = '0' + else: + expo = expo + len(intpart) - 1 + intpart, fraction = intpart[0], intpart[1:] + fraction + digs = max(0, digs) + intpart, fraction = roundfrac(intpart, fraction, digs) + if len(intpart) > 1: + intpart, fraction, expo = \ + intpart[0], intpart[1:] + fraction[:-1], \ + expo + len(intpart) - 1 + s = sign + intpart + if digs > 0: s = s + '.' + fraction + e = `abs(expo)` + e = '0'*(3-len(e)) + e + if expo < 0: e = '-' + e + else: e = '+' + e + return s + 'e' + e + +def test(): + """Interactive test run.""" + try: + while 1: + x, digs = input('Enter (x, digs): ') + print x, fix(x, digs), sci(x, digs) + except (EOFError, KeyboardInterrupt): + pass diff --git a/lib-python/2.2/ftplib.py b/lib-python/2.2/ftplib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/ftplib.py @@ -0,0 +1,804 @@ +"""An FTP client class and some helper functions. + +Based on RFC 959: File Transfer Protocol (FTP), by J. Postel and J. Reynolds + +Example: + +>>> from ftplib import FTP +>>> ftp = FTP('ftp.python.org') # connect to host, default port +>>> ftp.login() # default, i.e.: user anonymous, passwd anonymous@ +'230 Guest login ok, access restrictions apply.' +>>> ftp.retrlines('LIST') # list directory contents +total 9 +drwxr-xr-x 8 root wheel 1024 Jan 3 1994 . +drwxr-xr-x 8 root wheel 1024 Jan 3 1994 .. +drwxr-xr-x 2 root wheel 1024 Jan 3 1994 bin +drwxr-xr-x 2 root wheel 1024 Jan 3 1994 etc +d-wxrwxr-x 2 ftp wheel 1024 Sep 5 13:43 incoming +drwxr-xr-x 2 root wheel 1024 Nov 17 1993 lib +drwxr-xr-x 6 1094 wheel 1024 Sep 13 19:07 pub +drwxr-xr-x 3 root wheel 1024 Jan 3 1994 usr +-rw-r--r-- 1 root root 312 Aug 1 1994 welcome.msg +'226 Transfer complete.' +>>> ftp.quit() +'221 Goodbye.' +>>> + +A nice test that reveals some of the network dialogue would be: +python ftplib.py -d localhost -l -p -l +""" + +# +# Changes and improvements suggested by Steve Majewski. +# Modified by Jack to work on the mac. +# Modified by Siebren to support docstrings and PASV. +# + +import os +import sys +import string + +# Import SOCKS module if it exists, else standard socket module socket +try: + import SOCKS; socket = SOCKS; del SOCKS # import SOCKS as socket + from socket import getfqdn; socket.getfqdn = getfqdn; del getfqdn +except ImportError: + import socket + +__all__ = ["FTP","Netrc"] + +# Magic number from +MSG_OOB = 0x1 # Process data out of band + + +# The standard FTP server control port +FTP_PORT = 21 + + +# Exception raised when an error or invalid response is received +class Error(Exception): pass +class error_reply(Error): pass # unexpected [123]xx reply +class error_temp(Error): pass # 4xx errors +class error_perm(Error): pass # 5xx errors +class error_proto(Error): pass # response does not begin with [1-5] + + +# All exceptions (hopefully) that may be raised here and that aren't +# (always) programming errors on our side +all_errors = (Error, socket.error, IOError, EOFError) + + +# Line terminators (we always output CRLF, but accept any of CRLF, CR, LF) +CRLF = '\r\n' + + +# The class itself +class FTP: + + '''An FTP client class. + + To create a connection, call the class using these argument: + host, user, passwd, acct + These are all strings, and have default value ''. + Then use self.connect() with optional host and port argument. + + To download a file, use ftp.retrlines('RETR ' + filename), + or ftp.retrbinary() with slightly different arguments. + To upload a file, use ftp.storlines() or ftp.storbinary(), + which have an open file as argument (see their definitions + below for details). + The download/upload functions first issue appropriate TYPE + and PORT or PASV commands. +''' + + debugging = 0 + host = '' + port = FTP_PORT + sock = None + file = None + welcome = None + passiveserver = 1 + + # Initialization method (called by class instantiation). + # Initialize host to localhost, port to standard ftp port + # Optional arguments are host (for connect()), + # and user, passwd, acct (for login()) + def __init__(self, host='', user='', passwd='', acct=''): + if host: + self.connect(host) + if user: self.login(user, passwd, acct) + + def connect(self, host = '', port = 0): + '''Connect to host. Arguments are: + - host: hostname to connect to (string, default previous host) + - port: port to connect to (integer, default previous port)''' + if host: self.host = host + if port: self.port = port + msg = "getaddrinfo returns an empty list" + for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + try: + self.sock = socket.socket(af, socktype, proto) + self.sock.connect(sa) + except socket.error, msg: + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket.error, msg + self.af = af + self.file = self.sock.makefile('rb') + self.welcome = self.getresp() + return self.welcome + + def getwelcome(self): + '''Get the welcome message from the server. + (this is read and squirreled away by connect())''' + if self.debugging: + print '*welcome*', self.sanitize(self.welcome) + return self.welcome + + def set_debuglevel(self, level): + '''Set the debugging level. + The required argument level means: + 0: no debugging output (default) + 1: print commands and responses but not body text etc. + 2: also print raw lines read and sent before stripping CR/LF''' + self.debugging = level + debug = set_debuglevel + + def set_pasv(self, val): + '''Use passive or active mode for data transfers. + With a false argument, use the normal PORT mode, + With a true argument, use the PASV command.''' + self.passiveserver = val + + # Internal: "sanitize" a string for printing + def sanitize(self, s): + if s[:5] == 'pass ' or s[:5] == 'PASS ': + i = len(s) + while i > 5 and s[i-1] in '\r\n': + i = i-1 + s = s[:5] + '*'*(i-5) + s[i:] + return `s` + + # Internal: send one line to the server, appending CRLF + def putline(self, line): + line = line + CRLF + if self.debugging > 1: print '*put*', self.sanitize(line) + self.sock.sendall(line) + + # Internal: send one command to the server (through putline()) + def putcmd(self, line): + if self.debugging: print '*cmd*', self.sanitize(line) + self.putline(line) + + # Internal: return one line from the server, stripping CRLF. + # Raise EOFError if the connection is closed + def getline(self): + line = self.file.readline() + if self.debugging > 1: + print '*get*', self.sanitize(line) + if not line: raise EOFError + if line[-2:] == CRLF: line = line[:-2] + elif line[-1:] in CRLF: line = line[:-1] + return line + + # Internal: get a response from the server, which may possibly + # consist of multiple lines. Return a single string with no + # trailing CRLF. If the response consists of multiple lines, + # these are separated by '\n' characters in the string + def getmultiline(self): + line = self.getline() + if line[3:4] == '-': + code = line[:3] + while 1: + nextline = self.getline() + line = line + ('\n' + nextline) + if nextline[:3] == code and \ + nextline[3:4] != '-': + break + return line + + # Internal: get a response from the server. + # Raise various errors if the response indicates an error + def getresp(self): + resp = self.getmultiline() + if self.debugging: print '*resp*', self.sanitize(resp) + self.lastresp = resp[:3] + c = resp[:1] + if c == '4': + raise error_temp, resp + if c == '5': + raise error_perm, resp + if c not in '123': + raise error_proto, resp + return resp + + def voidresp(self): + """Expect a response beginning with '2'.""" + resp = self.getresp() + if resp[0] != '2': + raise error_reply, resp + return resp + + def abort(self): + '''Abort a file transfer. Uses out-of-band data. + This does not follow the procedure from the RFC to send Telnet + IP and Synch; that doesn't seem to work with the servers I've + tried. Instead, just send the ABOR command as OOB data.''' + line = 'ABOR' + CRLF + if self.debugging > 1: print '*put urgent*', self.sanitize(line) + self.sock.sendall(line, MSG_OOB) + resp = self.getmultiline() + if resp[:3] not in ('426', '226'): + raise error_proto, resp + + def sendcmd(self, cmd): + '''Send a command and return the response.''' + self.putcmd(cmd) + return self.getresp() + + def voidcmd(self, cmd): + """Send a command and expect a response beginning with '2'.""" + self.putcmd(cmd) + return self.voidresp() + + def sendport(self, host, port): + '''Send a PORT command with the current host and the given + port number. + ''' + hbytes = host.split('.') + pbytes = [`port/256`, `port%256`] + bytes = hbytes + pbytes + cmd = 'PORT ' + ','.join(bytes) + return self.voidcmd(cmd) + + def sendeprt(self, host, port): + '''Send a EPRT command with the current host and the given port number.''' + af = 0 + if self.af == socket.AF_INET: + af = 1 + if self.af == socket.AF_INET6: + af = 2 + if af == 0: + raise error_proto, 'unsupported address family' + fields = ['', `af`, host, `port`, ''] + cmd = 'EPRT ' + string.joinfields(fields, '|') + return self.voidcmd(cmd) + + def makeport(self): + '''Create a new socket and send a PORT command for it.''' + msg = "getaddrinfo returns an empty list" + sock = None + for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE): + af, socktype, proto, canonname, sa = res + try: + sock = socket.socket(af, socktype, proto) + sock.bind(sa) + except socket.error, msg: + if sock: + sock.close() + sock = None + continue + break + if not sock: + raise socket.error, msg + sock.listen(1) + port = sock.getsockname()[1] # Get proper port + host = self.sock.getsockname()[0] # Get proper host + if self.af == socket.AF_INET: + resp = self.sendport(host, port) + else: + resp = self.sendeprt(host, port) + return sock + + def makepasv(self): + if self.af == socket.AF_INET: + host, port = parse227(self.sendcmd('PASV')) + else: + host, port = parse229(self.sendcmd('EPSV'), self.sock.getpeername()) + return host, port + + def ntransfercmd(self, cmd, rest=None): + """Initiate a transfer over the data connection. + + If the transfer is active, send a port command and the + transfer command, and accept the connection. If the server is + passive, send a pasv command, connect to it, and start the + transfer command. Either way, return the socket for the + connection and the expected size of the transfer. The + expected size may be None if it could not be determined. + + Optional `rest' argument can be a string that is sent as the + argument to a RESTART command. This is essentially a server + marker used to tell the server to skip over any data up to the + given marker. + """ + size = None + if self.passiveserver: + host, port = self.makepasv() + af, socktype, proto, canon, sa = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)[0] + conn = socket.socket(af, socktype, proto) + conn.connect(sa) + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + if resp[0] != '1': + raise error_reply, resp + else: + sock = self.makeport() + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + if resp[0] != '1': + raise error_reply, resp + conn, sockaddr = sock.accept() + if resp[:3] == '150': + # this is conditional in case we received a 125 + size = parse150(resp) + return conn, size + + def transfercmd(self, cmd, rest=None): + """Like ntransfercmd() but returns only the socket.""" + return self.ntransfercmd(cmd, rest)[0] + + def login(self, user = '', passwd = '', acct = ''): + '''Login, default anonymous.''' + if not user: user = 'anonymous' + if not passwd: passwd = '' + if not acct: acct = '' + if user == 'anonymous' and passwd in ('', '-'): + # If there is no anonymous ftp password specified + # then we'll just use anonymous@ + # We don't send any other thing because: + # - We want to remain anonymous + # - We want to stop SPAM + # - We don't want to let ftp sites to discriminate by the user, + # host or country. + passwd = passwd + 'anonymous@' + resp = self.sendcmd('USER ' + user) + if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd) + if resp[0] == '3': resp = self.sendcmd('ACCT ' + acct) + if resp[0] != '2': + raise error_reply, resp + return resp + + def retrbinary(self, cmd, callback, blocksize=8192, rest=None): + """Retrieve data in binary mode. + + `cmd' is a RETR command. `callback' is a callback function is + called for each block. No more than `blocksize' number of + bytes will be read from the socket. Optional `rest' is passed + to transfercmd(). + + A new port is created for you. Return the response code. + """ + self.voidcmd('TYPE I') + conn = self.transfercmd(cmd, rest) + while 1: + data = conn.recv(blocksize) + if not data: + break + callback(data) + conn.close() + return self.voidresp() + + def retrlines(self, cmd, callback = None): + '''Retrieve data in line mode. + The argument is a RETR or LIST command. + The callback function (2nd argument) is called for each line, + with trailing CRLF stripped. This creates a new port for you. + print_line() is the default callback.''' + if not callback: callback = print_line + resp = self.sendcmd('TYPE A') + conn = self.transfercmd(cmd) + fp = conn.makefile('rb') + while 1: + line = fp.readline() + if self.debugging > 2: print '*retr*', `line` + if not line: + break + if line[-2:] == CRLF: + line = line[:-2] + elif line[-1:] == '\n': + line = line[:-1] + callback(line) + fp.close() + conn.close() + return self.voidresp() + + def storbinary(self, cmd, fp, blocksize=8192): + '''Store a file in binary mode.''' + self.voidcmd('TYPE I') + conn = self.transfercmd(cmd) + while 1: + buf = fp.read(blocksize) + if not buf: break + conn.sendall(buf) + conn.close() + return self.voidresp() + + def storlines(self, cmd, fp): + '''Store a file in line mode.''' + self.voidcmd('TYPE A') + conn = self.transfercmd(cmd) + while 1: + buf = fp.readline() + if not buf: break + if buf[-2:] != CRLF: + if buf[-1] in CRLF: buf = buf[:-1] + buf = buf + CRLF + conn.sendall(buf) + conn.close() + return self.voidresp() + + def acct(self, password): + '''Send new account name.''' + cmd = 'ACCT ' + password + return self.voidcmd(cmd) + + def nlst(self, *args): + '''Return a list of files in a given directory (default the current).''' + cmd = 'NLST' + for arg in args: + cmd = cmd + (' ' + arg) + files = [] + self.retrlines(cmd, files.append) + return files + + def dir(self, *args): + '''List a directory in long form. + By default list current directory to stdout. + Optional last argument is callback function; all + non-empty arguments before it are concatenated to the + LIST command. (This *should* only be used for a pathname.)''' + cmd = 'LIST' + func = None + if args[-1:] and type(args[-1]) != type(''): + args, func = args[:-1], args[-1] + for arg in args: + if arg: + cmd = cmd + (' ' + arg) + self.retrlines(cmd, func) + + def rename(self, fromname, toname): + '''Rename a file.''' + resp = self.sendcmd('RNFR ' + fromname) + if resp[0] != '3': + raise error_reply, resp + return self.voidcmd('RNTO ' + toname) + + def delete(self, filename): + '''Delete a file.''' + resp = self.sendcmd('DELE ' + filename) + if resp[:3] in ('250', '200'): + return resp + elif resp[:1] == '5': + raise error_perm, resp + else: + raise error_reply, resp + + def cwd(self, dirname): + '''Change to a directory.''' + if dirname == '..': + try: + return self.voidcmd('CDUP') + except error_perm, msg: + if msg.args[0][:3] != '500': + raise + elif dirname == '': + dirname = '.' # does nothing, but could return error + cmd = 'CWD ' + dirname + return self.voidcmd(cmd) + + def size(self, filename): + '''Retrieve the size of a file.''' + # Note that the RFC doesn't say anything about 'SIZE' + resp = self.sendcmd('SIZE ' + filename) + if resp[:3] == '213': + s = resp[3:].strip() + try: + return int(s) + except (OverflowError, ValueError): + return long(s) + + def mkd(self, dirname): + '''Make a directory, return its full pathname.''' + resp = self.sendcmd('MKD ' + dirname) + return parse257(resp) + + def rmd(self, dirname): + '''Remove a directory.''' + return self.voidcmd('RMD ' + dirname) + + def pwd(self): + '''Return current working directory.''' + resp = self.sendcmd('PWD') + return parse257(resp) + + def quit(self): + '''Quit, and close the connection.''' + resp = self.voidcmd('QUIT') + self.close() + return resp + + def close(self): + '''Close the connection without assuming anything about it.''' + if self.file: + self.file.close() + self.sock.close() + self.file = self.sock = None + + +_150_re = None + +def parse150(resp): + '''Parse the '150' response for a RETR request. + Returns the expected transfer size or None; size is not guaranteed to + be present in the 150 message. + ''' + if resp[:3] != '150': + raise error_reply, resp + global _150_re + if _150_re is None: + import re + _150_re = re.compile("150 .* \((\d+) bytes\)", re.IGNORECASE) + m = _150_re.match(resp) + if not m: + return None + s = m.group(1) + try: + return int(s) + except (OverflowError, ValueError): + return long(s) + + +_227_re = None + +def parse227(resp): + '''Parse the '227' response for a PASV request. + Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' + Return ('host.addr.as.numbers', port#) tuple.''' + + if resp[:3] != '227': + raise error_reply, resp + global _227_re + if _227_re is None: + import re + _227_re = re.compile(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)') + m = _227_re.search(resp) + if not m: + raise error_proto, resp + numbers = m.groups() + host = '.'.join(numbers[:4]) + port = (int(numbers[4]) << 8) + int(numbers[5]) + return host, port + + +def parse229(resp, peer): + '''Parse the '229' response for a EPSV request. + Raises error_proto if it does not contain '(|||port|)' + Return ('host.addr.as.numbers', port#) tuple.''' + + if resp[:3] <> '229': + raise error_reply, resp + left = string.find(resp, '(') + if left < 0: raise error_proto, resp + right = string.find(resp, ')', left + 1) + if right < 0: + raise error_proto, resp # should contain '(|||port|)' + if resp[left + 1] <> resp[right - 1]: + raise error_proto, resp + parts = string.split(resp[left + 1:right], resp[left+1]) + if len(parts) <> 5: + raise error_proto, resp + host = peer[0] + port = string.atoi(parts[3]) + return host, port + + +def parse257(resp): + '''Parse the '257' response for a MKD or PWD request. + This is a response to a MKD or PWD request: a directory name. + Returns the directoryname in the 257 reply.''' + + if resp[:3] != '257': + raise error_reply, resp + if resp[3:5] != ' "': + return '' # Not compliant to RFC 959, but UNIX ftpd does this + dirname = '' + i = 5 + n = len(resp) + while i < n: + c = resp[i] + i = i+1 + if c == '"': + if i >= n or resp[i] != '"': + break + i = i+1 + dirname = dirname + c + return dirname + + +def print_line(line): + '''Default retrlines callback to print a line.''' + print line + + +def ftpcp(source, sourcename, target, targetname = '', type = 'I'): + '''Copy file from one FTP-instance to another.''' + if not targetname: targetname = sourcename + type = 'TYPE ' + type + source.voidcmd(type) + target.voidcmd(type) + sourcehost, sourceport = parse227(source.sendcmd('PASV')) + target.sendport(sourcehost, sourceport) + # RFC 959: the user must "listen" [...] BEFORE sending the + # transfer request. + # So: STOR before RETR, because here the target is a "user". + treply = target.sendcmd('STOR ' + targetname) + if treply[:3] not in ('125', '150'): raise error_proto # RFC 959 + sreply = source.sendcmd('RETR ' + sourcename) + if sreply[:3] not in ('125', '150'): raise error_proto # RFC 959 + source.voidresp() + target.voidresp() + + +class Netrc: + """Class to parse & provide access to 'netrc' format files. + + See the netrc(4) man page for information on the file format. + + WARNING: This class is obsolete -- use module netrc instead. + + """ + __defuser = None + __defpasswd = None + __defacct = None + + def __init__(self, filename=None): + if not filename: + if os.environ.has_key("HOME"): + filename = os.path.join(os.environ["HOME"], + ".netrc") + else: + raise IOError, \ + "specify file to load or set $HOME" + self.__hosts = {} + self.__macros = {} + fp = open(filename, "r") + in_macro = 0 + while 1: + line = fp.readline() + if not line: break + if in_macro and line.strip(): + macro_lines.append(line) + continue + elif in_macro: + self.__macros[macro_name] = tuple(macro_lines) + in_macro = 0 + words = line.split() + host = user = passwd = acct = None + default = 0 + i = 0 + while i < len(words): + w1 = words[i] + if i+1 < len(words): + w2 = words[i + 1] + else: + w2 = None + if w1 == 'default': + default = 1 + elif w1 == 'machine' and w2: + host = w2.lower() + i = i + 1 + elif w1 == 'login' and w2: + user = w2 + i = i + 1 + elif w1 == 'password' and w2: + passwd = w2 + i = i + 1 + elif w1 == 'account' and w2: + acct = w2 + i = i + 1 + elif w1 == 'macdef' and w2: + macro_name = w2 + macro_lines = [] + in_macro = 1 + break + i = i + 1 + if default: + self.__defuser = user or self.__defuser + self.__defpasswd = passwd or self.__defpasswd + self.__defacct = acct or self.__defacct + if host: + if self.__hosts.has_key(host): + ouser, opasswd, oacct = \ + self.__hosts[host] + user = user or ouser + passwd = passwd or opasswd + acct = acct or oacct + self.__hosts[host] = user, passwd, acct + fp.close() + + def get_hosts(self): + """Return a list of hosts mentioned in the .netrc file.""" + return self.__hosts.keys() + + def get_account(self, host): + """Returns login information for the named host. + + The return value is a triple containing userid, + password, and the accounting field. + + """ + host = host.lower() + user = passwd = acct = None + if self.__hosts.has_key(host): + user, passwd, acct = self.__hosts[host] + user = user or self.__defuser + passwd = passwd or self.__defpasswd + acct = acct or self.__defacct + return user, passwd, acct + + def get_macros(self): + """Return a list of all defined macro names.""" + return self.__macros.keys() + + def get_macro(self, macro): + """Return a sequence of lines which define a named macro.""" + return self.__macros[macro] + + + +def test(): + '''Test program. + Usage: ftp [-d] [-r[file]] host [-l[dir]] [-d[dir]] [-p] [file] ...''' + + debugging = 0 + rcfile = None + while sys.argv[1] == '-d': + debugging = debugging+1 + del sys.argv[1] + if sys.argv[1][:2] == '-r': + # get name of alternate ~/.netrc file: + rcfile = sys.argv[1][2:] + del sys.argv[1] + host = sys.argv[1] + ftp = FTP(host) + ftp.set_debuglevel(debugging) + userid = passwd = acct = '' + try: + netrc = Netrc(rcfile) + except IOError: + if rcfile is not None: + sys.stderr.write("Could not open account file" + " -- using anonymous login.") + else: + try: + userid, passwd, acct = netrc.get_account(host) + except KeyError: + # no account for host + sys.stderr.write( + "No account -- using anonymous login.") + ftp.login(userid, passwd, acct) + for file in sys.argv[2:]: + if file[:2] == '-l': + ftp.dir(file[2:]) + elif file[:2] == '-d': + cmd = 'CWD' + if file[2:]: cmd = cmd + ' ' + file[2:] + resp = ftp.sendcmd(cmd) + elif file == '-p': + ftp.set_pasv(not ftp.passiveserver) + else: + ftp.retrbinary('RETR ' + file, \ + sys.stdout.write, 1024) + ftp.quit() + + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/getopt.py b/lib-python/2.2/getopt.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/getopt.py @@ -0,0 +1,144 @@ +"""Parser for command line options. + +This module helps scripts to parse the command line arguments in +sys.argv. It supports the same conventions as the Unix getopt() +function (including the special meanings of arguments of the form `-' +and `--'). Long options similar to those supported by GNU software +may be used as well via an optional third argument. This module +provides a single function and an exception: + +getopt() -- Parse command line options +GetoptError -- exception (class) raised with 'opt' attribute, which is the +option involved with the exception. +""" + +# Long option support added by Lars Wirzenius . + +# Gerrit Holl moved the string-based exceptions +# to class-based exceptions. + +__all__ = ["GetoptError","error","getopt"] + +class GetoptError(Exception): + opt = '' + msg = '' + def __init__(self, msg, opt): + self.msg = msg + self.opt = opt + Exception.__init__(self, msg, opt) + + def __str__(self): + return self.msg + +error = GetoptError # backward compatibility + +def getopt(args, shortopts, longopts = []): + """getopt(args, options[, long_options]) -> opts, args + + Parses command line options and parameter list. args is the + argument list to be parsed, without the leading reference to the + running program. Typically, this means "sys.argv[1:]". shortopts + is the string of option letters that the script wants to + recognize, with options that require an argument followed by a + colon (i.e., the same format that Unix getopt() uses). If + specified, longopts is a list of strings with the names of the + long options which should be supported. The leading '--' + characters should not be included in the option name. Options + which require an argument should be followed by an equal sign + ('='). + + The return value consists of two elements: the first is a list of + (option, value) pairs; the second is the list of program arguments + left after the option list was stripped (this is a trailing slice + of the first argument). Each option-and-value pair returned has + the option as its first element, prefixed with a hyphen (e.g., + '-x'), and the option argument as its second element, or an empty + string if the option has no argument. The options occur in the + list in the same order in which they were found, thus allowing + multiple occurrences. Long and short options may be mixed. + + """ + + opts = [] + if type(longopts) == type(""): + longopts = [longopts] + else: + longopts = list(longopts) + while args and args[0].startswith('-') and args[0] != '-': + if args[0] == '--': + args = args[1:] + break + if args[0].startswith('--'): + opts, args = do_longs(opts, args[0][2:], longopts, args[1:]) + else: + opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:]) + + return opts, args + +def do_longs(opts, opt, longopts, args): + try: + i = opt.index('=') + except ValueError: + optarg = None + else: + opt, optarg = opt[:i], opt[i+1:] + + has_arg, opt = long_has_args(opt, longopts) + if has_arg: + if optarg is None: + if not args: + raise GetoptError('option --%s requires argument' % opt, opt) + optarg, args = args[0], args[1:] + elif optarg: + raise GetoptError('option --%s must not have an argument' % opt, opt) + opts.append(('--' + opt, optarg or '')) + return opts, args + +# Return: +# has_arg? +# full option name +def long_has_args(opt, longopts): + possibilities = [o for o in longopts if o.startswith(opt)] + if not possibilities: + raise GetoptError('option --%s not recognized' % opt, opt) + # Is there an exact match? + if opt in possibilities: + return 0, opt + elif opt + '=' in possibilities: + return 1, opt + # No exact match, so better be unique. + if len(possibilities) > 1: + # XXX since possibilities contains all valid continuations, might be + # nice to work them into the error msg + raise GetoptError('option --%s not a unique prefix' % opt, opt) + assert len(possibilities) == 1 + unique_match = possibilities[0] + has_arg = unique_match.endswith('=') + if has_arg: + unique_match = unique_match[:-1] + return has_arg, unique_match + +def do_shorts(opts, optstring, shortopts, args): + while optstring != '': + opt, optstring = optstring[0], optstring[1:] + if short_has_arg(opt, shortopts): + if optstring == '': + if not args: + raise GetoptError('option -%s requires argument' % opt, + opt) + optstring, args = args[0], args[1:] + optarg, optstring = optstring, '' + else: + optarg = '' + opts.append(('-' + opt, optarg)) + return opts, args + +def short_has_arg(opt, shortopts): + for i in range(len(shortopts)): + if opt == shortopts[i] != ':': + return shortopts.startswith(':', i+1) + raise GetoptError('option -%s not recognized' % opt, opt) + +if __name__ == '__main__': + import sys + print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]) diff --git a/lib-python/2.2/getpass.py b/lib-python/2.2/getpass.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/getpass.py @@ -0,0 +1,123 @@ +"""Utilities to get a password and/or the current user name. + +getpass(prompt) - prompt for a password, with echo turned off +getuser() - get the user name from the environment or password database + +On Windows, the msvcrt module will be used. +On the Mac EasyDialogs.AskPassword is used, if available. + +""" + +# Authors: Piers Lauder (original) +# Guido van Rossum (Windows support and cleanup) + +import sys + +__all__ = ["getpass","getuser"] + +def unix_getpass(prompt='Password: '): + """Prompt for a password, with echo turned off. + + Restore terminal settings at end. + """ + + try: + fd = sys.stdin.fileno() + except: + return default_getpass(prompt) + + old = termios.tcgetattr(fd) # a copy to save + new = old[:] + + new[3] = new[3] & ~termios.ECHO # 3 == 'lflags' + try: + termios.tcsetattr(fd, termios.TCSADRAIN, new) + passwd = _raw_input(prompt) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old) + + sys.stdout.write('\n') + return passwd + + +def win_getpass(prompt='Password: '): + """Prompt for password with echo off, using Windows getch().""" + if sys.stdin is not sys.__stdin__: + return default_getpass(prompt) + import msvcrt + for c in prompt: + msvcrt.putch(c) + pw = "" + while 1: + c = msvcrt.getch() + if c == '\r' or c == '\n': + break + if c == '\003': + raise KeyboardInterrupt + if c == '\b': + pw = pw[:-1] + else: + pw = pw + c + msvcrt.putch('\r') + msvcrt.putch('\n') + return pw + + +def default_getpass(prompt='Password: '): + print "Warning: Problem with getpass. Passwords may be echoed." + return _raw_input(prompt) + + +def _raw_input(prompt=""): + # A raw_input() replacement that doesn't save the string in the + # GNU readline history. + prompt = str(prompt) + if prompt: + sys.stdout.write(prompt) + line = sys.stdin.readline() + if not line: + raise EOFError + if line[-1] == '\n': + line = line[:-1] + return line + + +def getuser(): + """Get the username from the environment or password database. + + First try various environment variables, then the password + database. This works on Windows as long as USERNAME is set. + + """ + + import os + + for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'): + user = os.environ.get(name) + if user: + return user + + # If this fails, the exception will "explain" why + import pwd + return pwd.getpwuid(os.getuid())[0] + +# Bind the name getpass to the appropriate function +try: + import termios + # it's possible there is an incompatible termios from the + # McMillan Installer, make sure we have a UNIX-compatible termios + termios.tcgetattr, termios.tcsetattr +except (ImportError, AttributeError): + try: + import msvcrt + except ImportError: + try: + from EasyDialogs import AskPassword + except ImportError: + getpass = default_getpass + else: + getpass = AskPassword + else: + getpass = win_getpass +else: + getpass = unix_getpass diff --git a/lib-python/2.2/gettext.py b/lib-python/2.2/gettext.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/gettext.py @@ -0,0 +1,311 @@ +"""Internationalization and localization support. + +This module provides internationalization (I18N) and localization (L10N) +support for your Python programs by providing an interface to the GNU gettext +message catalog library. + +I18N refers to the operation by which a program is made aware of multiple +languages. L10N refers to the adaptation of your program, once +internationalized, to the local language and cultural habits. + +""" + +# This module represents the integration of work, contributions, feedback, and +# suggestions from the following people: +# +# Martin von Loewis, who wrote the initial implementation of the underlying +# C-based libintlmodule (later renamed _gettext), along with a skeletal +# gettext.py implementation. +# +# Peter Funk, who wrote fintl.py, a fairly complete wrapper around intlmodule, +# which also included a pure-Python implementation to read .mo files if +# intlmodule wasn't available. +# +# James Henstridge, who also wrote a gettext.py module, which has some +# interesting, but currently unsupported experimental features: the notion of +# a Catalog class and instances, and the ability to add to a catalog file via +# a Python API. +# +# Barry Warsaw integrated these modules, wrote the .install() API and code, +# and conformed all C and Python code to Python's coding standards. +# +# Francois Pinard and Marc-Andre Lemburg also contributed valuably to this +# module. +# +# TODO: +# - Lazy loading of .mo files. Currently the entire catalog is loaded into +# memory, but that's probably bad for large translated programs. Instead, +# the lexical sort of original strings in GNU .mo files should be exploited +# to do binary searches and lazy initializations. Or you might want to use +# the undocumented double-hash algorithm for .mo files with hash tables, but +# you'll need to study the GNU gettext code to do this. +# +# - Support Solaris .mo file formats. Unfortunately, we've been unable to +# find this format documented anywhere. + +import os +import sys +import struct +from errno import ENOENT + +__all__ = ['NullTranslations', 'GNUTranslations', 'Catalog', + 'find', 'translation', 'install', 'textdomain', 'bindtextdomain', + 'dgettext', 'gettext', + ] + +_default_localedir = os.path.join(sys.prefix, 'share', 'locale') + + + +def _expand_lang(locale): + from locale import normalize + locale = normalize(locale) + COMPONENT_CODESET = 1 << 0 + COMPONENT_TERRITORY = 1 << 1 + COMPONENT_MODIFIER = 1 << 2 + # split up the locale into its base components + mask = 0 + pos = locale.find('@') + if pos >= 0: + modifier = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_MODIFIER + else: + modifier = '' + pos = locale.find('.') + if pos >= 0: + codeset = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_CODESET + else: + codeset = '' + pos = locale.find('_') + if pos >= 0: + territory = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_TERRITORY + else: + territory = '' + language = locale + ret = [] + for i in range(mask+1): + if not (i & ~mask): # if all components for this combo exist ... + val = language + if i & COMPONENT_TERRITORY: val += territory + if i & COMPONENT_CODESET: val += codeset + if i & COMPONENT_MODIFIER: val += modifier + ret.append(val) + ret.reverse() + return ret + + + +class NullTranslations: + def __init__(self, fp=None): + self._info = {} + self._charset = None + if fp: + self._parse(fp) + + def _parse(self, fp): + pass + + def gettext(self, message): + return message + + def ugettext(self, message): + return unicode(message) + + def info(self): + return self._info + + def charset(self): + return self._charset + + def install(self, unicode=0): + import __builtin__ + __builtin__.__dict__['_'] = unicode and self.ugettext or self.gettext + + +class GNUTranslations(NullTranslations): + # Magic number of .mo files + LE_MAGIC = 0x950412de + BE_MAGIC = 0xde120495 + + def _parse(self, fp): + """Override this method to support alternative .mo formats.""" + # We need to & all 32 bit unsigned integers with 0xffffffff for + # portability to 64 bit machines. + MASK = 0xffffffff + unpack = struct.unpack + filename = getattr(fp, 'name', '') + # Parse the .mo file header, which consists of 5 little endian 32 + # bit words. + self._catalog = catalog = {} + buf = fp.read() + buflen = len(buf) + # Are we big endian or little endian? + magic = unpack('4i', buf[4:20]) + ii = '>ii' + else: + raise IOError(0, 'Bad magic number', filename) + # more unsigned ints + msgcount &= MASK + masteridx &= MASK + transidx &= MASK + # Now put all messages from the .mo file buffer into the catalog + # dictionary. + for i in xrange(0, msgcount): + mlen, moff = unpack(ii, buf[masteridx:masteridx+8]) + moff &= MASK + mend = moff + (mlen & MASK) + tlen, toff = unpack(ii, buf[transidx:transidx+8]) + toff &= MASK + tend = toff + (tlen & MASK) + if mend < buflen and tend < buflen: + tmsg = buf[toff:tend] + catalog[buf[moff:mend]] = tmsg + else: + raise IOError(0, 'File is corrupt', filename) + # See if we're looking at GNU .mo conventions for metadata + if mlen == 0 and tmsg.lower().startswith('project-id-version:'): + # Catalog description + lastk = None + for item in tmsg.split('\n'): + item = item.strip() + if not item: + continue + if ':' in item: + k, v = item.split(':', 1) + k = k.strip().lower() + v = v.strip() + self._info[k] = v + lastk = k + elif lastk: + self._info[lastk] += '\n' + item + if k == 'content-type': + self._charset = v.split('charset=')[1] + # advance to next entry in the seek tables + masteridx += 8 + transidx += 8 + + def gettext(self, message): + return self._catalog.get(message, message) + + def ugettext(self, message): + tmsg = self._catalog.get(message, message) + return unicode(tmsg, self._charset) + + + +# Locate a .mo file using the gettext strategy +def find(domain, localedir=None, languages=None): + # Get some reasonable defaults for arguments that were not supplied + if localedir is None: + localedir = _default_localedir + if languages is None: + languages = [] + for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'): + val = os.environ.get(envar) + if val: + languages = val.split(':') + break + if 'C' not in languages: + languages.append('C') + # now normalize and expand the languages + nelangs = [] + for lang in languages: + for nelang in _expand_lang(lang): + if nelang not in nelangs: + nelangs.append(nelang) + # select a language + for lang in nelangs: + if lang == 'C': + break + mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain) + if os.path.exists(mofile): + return mofile + return None + + + +# a mapping between absolute .mo file path and Translation object +_translations = {} + +def translation(domain, localedir=None, languages=None, + class_=None, fallback=0): + if class_ is None: + class_ = GNUTranslations + mofile = find(domain, localedir, languages) + if mofile is None: + if fallback: + return NullTranslations() + raise IOError(ENOENT, 'No translation file found for domain', domain) + key = os.path.abspath(mofile) + # TBD: do we need to worry about the file pointer getting collected? + # Avoid opening, reading, and parsing the .mo file after it's been done + # once. + t = _translations.get(key) + if t is None: + t = _translations.setdefault(key, class_(open(mofile, 'rb'))) + return t + + + +def install(domain, localedir=None, unicode=0): + translation(domain, localedir, fallback=1).install(unicode) + + + +# a mapping b/w domains and locale directories +_localedirs = {} +# current global domain, `messages' used for compatibility w/ GNU gettext +_current_domain = 'messages' + + +def textdomain(domain=None): + global _current_domain + if domain is not None: + _current_domain = domain + return _current_domain + + +def bindtextdomain(domain, localedir=None): + global _localedirs + if localedir is not None: + _localedirs[domain] = localedir + return _localedirs.get(domain, _default_localedir) + + +def dgettext(domain, message): + try: + t = translation(domain, _localedirs.get(domain, None)) + except IOError: + return message + return t.gettext(message) + + +def gettext(message): + return dgettext(_current_domain, message) + + +# dcgettext() has been deemed unnecessary and is not implemented. + +# James Henstridge's Catalog constructor from GNOME gettext. Documented usage +# was: +# +# import gettext +# cat = gettext.Catalog(PACKAGE, localedir=LOCALEDIR) +# _ = cat.gettext +# print _('Hello World') + +# The resulting catalog object currently don't support access through a +# dictionary API, which was supported (but apparently unused) in GNOME +# gettext. + +Catalog = translation diff --git a/lib-python/2.2/glob.py b/lib-python/2.2/glob.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/glob.py @@ -0,0 +1,56 @@ +"""Filename globbing utility.""" + +import os +import fnmatch +import re + +__all__ = ["glob"] + +def glob(pathname): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la fnmatch. + + """ + if not has_magic(pathname): + if os.path.exists(pathname): + return [pathname] + else: + return [] + dirname, basename = os.path.split(pathname) + if not dirname: + return glob1(os.curdir, basename) + elif has_magic(dirname): + list = glob(dirname) + else: + list = [dirname] + if not has_magic(basename): + result = [] + for dirname in list: + if basename or os.path.isdir(dirname): + name = os.path.join(dirname, basename) + if os.path.exists(name): + result.append(name) + else: + result = [] + for dirname in list: + sublist = glob1(dirname, basename) + for name in sublist: + result.append(os.path.join(dirname, name)) + return result + +def glob1(dirname, pattern): + if not dirname: dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return [] + if pattern[0]!='.': + names=filter(lambda x: x[0]!='.',names) + return fnmatch.filter(names,pattern) + + +magic_check = re.compile('[*?[]') + +def has_magic(s): + return magic_check.search(s) is not None diff --git a/lib-python/2.2/gopherlib.py b/lib-python/2.2/gopherlib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/gopherlib.py @@ -0,0 +1,205 @@ +"""Gopher protocol client interface.""" + +__all__ = ["send_selector","send_query"] + +# Default selector, host and port +DEF_SELECTOR = '1/' +DEF_HOST = 'gopher.micro.umn.edu' +DEF_PORT = 70 + +# Recognized file types +A_TEXT = '0' +A_MENU = '1' +A_CSO = '2' +A_ERROR = '3' +A_MACBINHEX = '4' +A_PCBINHEX = '5' +A_UUENCODED = '6' +A_INDEX = '7' +A_TELNET = '8' +A_BINARY = '9' +A_DUPLICATE = '+' +A_SOUND = 's' +A_EVENT = 'e' +A_CALENDAR = 'c' +A_HTML = 'h' +A_TN3270 = 'T' +A_MIME = 'M' +A_IMAGE = 'I' +A_WHOIS = 'w' +A_QUERY = 'q' +A_GIF = 'g' +A_HTML = 'h' # HTML file +A_WWW = 'w' # WWW address +A_PLUS_IMAGE = ':' +A_PLUS_MOVIE = ';' +A_PLUS_SOUND = '<' + + +_names = dir() +_type_to_name_map = {} +def type_to_name(gtype): + """Map all file types to strings; unknown types become TYPE='x'.""" + global _type_to_name_map + if _type_to_name_map=={}: + for name in _names: + if name[:2] == 'A_': + _type_to_name_map[eval(name)] = name[2:] + if _type_to_name_map.has_key(gtype): + return _type_to_name_map[gtype] + return 'TYPE=' + `gtype` + +# Names for characters and strings +CRLF = '\r\n' +TAB = '\t' + +def send_selector(selector, host, port = 0): + """Send a selector to a given host and port, return a file with the reply.""" + import socket + if not port: + i = host.find(':') + if i >= 0: + host, port = host[:i], int(host[i+1:]) + if not port: + port = DEF_PORT + elif type(port) == type(''): + port = int(port) + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((host, port)) + s.sendall(selector + CRLF) + s.shutdown(1) + return s.makefile('rb') + +def send_query(selector, query, host, port = 0): + """Send a selector and a query string.""" + return send_selector(selector + '\t' + query, host, port) + +def path_to_selector(path): + """Takes a path as returned by urlparse and returns the appropriate selector.""" + if path=="/": + return "/" + else: + return path[2:] # Cuts initial slash and data type identifier + +def path_to_datatype_name(path): + """Takes a path as returned by urlparse and maps it to a string. + See section 3.4 of RFC 1738 for details.""" + if path=="/": + # No way to tell, although "INDEX" is likely + return "TYPE='unknown'" + else: + return type_to_name(path[1]) + +# The following functions interpret the data returned by the gopher +# server according to the expected type, e.g. textfile or directory + +def get_directory(f): + """Get a directory in the form of a list of entries.""" + list = [] + while 1: + line = f.readline() + if not line: + print '(Unexpected EOF from server)' + break + if line[-2:] == CRLF: + line = line[:-2] + elif line[-1:] in CRLF: + line = line[:-1] + if line == '.': + break + if not line: + print '(Empty line from server)' + continue + gtype = line[0] + parts = line[1:].split(TAB) + if len(parts) < 4: + print '(Bad line from server:', `line`, ')' + continue + if len(parts) > 4: + if parts[4:] != ['+']: + print '(Extra info from server:', + print parts[4:], ')' + else: + parts.append('') + parts.insert(0, gtype) + list.append(parts) + return list + +def get_textfile(f): + """Get a text file as a list of lines, with trailing CRLF stripped.""" + list = [] + get_alt_textfile(f, list.append) + return list + +def get_alt_textfile(f, func): + """Get a text file and pass each line to a function, with trailing CRLF stripped.""" + while 1: + line = f.readline() + if not line: + print '(Unexpected EOF from server)' + break + if line[-2:] == CRLF: + line = line[:-2] + elif line[-1:] in CRLF: + line = line[:-1] + if line == '.': + break + if line[:2] == '..': + line = line[1:] + func(line) + +def get_binary(f): + """Get a binary file as one solid data block.""" + data = f.read() + return data + +def get_alt_binary(f, func, blocksize): + """Get a binary file and pass each block to a function.""" + while 1: + data = f.read(blocksize) + if not data: + break + func(data) + +def test(): + """Trivial test program.""" + import sys + import getopt + opts, args = getopt.getopt(sys.argv[1:], '') + selector = DEF_SELECTOR + type = selector[0] + host = DEF_HOST + if args: + host = args[0] + args = args[1:] + if args: + type = args[0] + args = args[1:] + if len(type) > 1: + type, selector = type[0], type + else: + selector = '' + if args: + selector = args[0] + args = args[1:] + query = '' + if args: + query = args[0] + args = args[1:] + if type == A_INDEX: + f = send_query(selector, query, host) + else: + f = send_selector(selector, host) + if type == A_TEXT: + list = get_textfile(f) + for item in list: print item + elif type in (A_MENU, A_INDEX): + list = get_directory(f) + for item in list: print item + else: + data = get_binary(f) + print 'binary data:', len(data), 'bytes:', `data[:100]`[:40] + +# Run the test when run as script +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/gzip.py b/lib-python/2.2/gzip.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/gzip.py @@ -0,0 +1,390 @@ +"""Functions that read and write gzipped files. + +The user of the file doesn't have to worry about the compression, +but random access is not allowed.""" + +# based on Andrew Kuchling's minigzip.py distributed with the zlib module + +import struct, sys, time +import zlib +import __builtin__ + +__all__ = ["GzipFile","open"] + +FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 + +READ, WRITE = 1, 2 + +def write32(output, value): + output.write(struct.pack("' + + def _init_write(self, filename): + if filename[-3:] != '.gz': + filename = filename + '.gz' + self.filename = filename + self.crc = zlib.crc32("") + self.size = 0 + self.writebuf = [] + self.bufsize = 0 + + def _write_gzip_header(self): + self.fileobj.write('\037\213') # magic header + self.fileobj.write('\010') # compression method + fname = self.filename[:-3] + flags = 0 + if fname: + flags = FNAME + self.fileobj.write(chr(flags)) + write32u(self.fileobj, long(time.time())) + self.fileobj.write('\002') + self.fileobj.write('\377') + if fname: + self.fileobj.write(fname + '\000') + + def _init_read(self): + self.crc = zlib.crc32("") + self.size = 0 + + def _read_gzip_header(self): + magic = self.fileobj.read(2) + if magic != '\037\213': + raise IOError, 'Not a gzipped file' + method = ord( self.fileobj.read(1) ) + if method != 8: + raise IOError, 'Unknown compression method' + flag = ord( self.fileobj.read(1) ) + # modtime = self.fileobj.read(4) + # extraflag = self.fileobj.read(1) + # os = self.fileobj.read(1) + self.fileobj.read(6) + + if flag & FEXTRA: + # Read & discard the extra field, if present + xlen=ord(self.fileobj.read(1)) + xlen=xlen+256*ord(self.fileobj.read(1)) + self.fileobj.read(xlen) + if flag & FNAME: + # Read and discard a null-terminated string containing the filename + while (1): + s=self.fileobj.read(1) + if not s or s=='\000': break + if flag & FCOMMENT: + # Read and discard a null-terminated string containing a comment + while (1): + s=self.fileobj.read(1) + if not s or s=='\000': break + if flag & FHCRC: + self.fileobj.read(2) # Read & discard the 16-bit header CRC + + + def write(self,data): + if self.fileobj is None: + raise ValueError, "write() on closed GzipFile object" + if len(data) > 0: + self.size = self.size + len(data) + self.crc = zlib.crc32(data, self.crc) + self.fileobj.write( self.compress.compress(data) ) + self.offset += len(data) + + def read(self, size=-1): + if self.extrasize <= 0 and self.fileobj is None: + return '' + + readsize = 1024 + if size < 0: # get the whole thing + try: + while 1: + self._read(readsize) + readsize = readsize * 2 + except EOFError: + size = self.extrasize + else: # just get some more of it + try: + while size > self.extrasize: + self._read(readsize) + readsize = readsize * 2 + except EOFError: + if size > self.extrasize: + size = self.extrasize + + chunk = self.extrabuf[:size] + self.extrabuf = self.extrabuf[size:] + self.extrasize = self.extrasize - size + + self.offset += size + return chunk + + def _unread(self, buf): + self.extrabuf = buf + self.extrabuf + self.extrasize = len(buf) + self.extrasize + self.offset -= len(buf) + + def _read(self, size=1024): + if self.fileobj is None: raise EOFError, "Reached EOF" + + if self._new_member: + # If the _new_member flag is set, we have to + # jump to the next member, if there is one. + # + # First, check if we're at the end of the file; + # if so, it's time to stop; no more members to read. + pos = self.fileobj.tell() # Save current position + self.fileobj.seek(0, 2) # Seek to end of file + if pos == self.fileobj.tell(): + raise EOFError, "Reached EOF" + else: + self.fileobj.seek( pos ) # Return to original position + + self._init_read() + self._read_gzip_header() + self.decompress = zlib.decompressobj(-zlib.MAX_WBITS) + self._new_member = 0 + + # Read a chunk of data from the file + buf = self.fileobj.read(size) + + # If the EOF has been reached, flush the decompression object + # and mark this object as finished. + + if buf == "": + uncompress = self.decompress.flush() + self._read_eof() + self._add_read_data( uncompress ) + raise EOFError, 'Reached EOF' + + uncompress = self.decompress.decompress(buf) + self._add_read_data( uncompress ) + + if self.decompress.unused_data != "": + # Ending case: we've come to the end of a member in the file, + # so seek back to the start of the unused data, finish up + # this member, and read a new gzip header. + # (The number of bytes to seek back is the length of the unused + # data, minus 8 because _read_eof() will rewind a further 8 bytes) + self.fileobj.seek( -len(self.decompress.unused_data)+8, 1) + + # Check the CRC and file size, and set the flag so we read + # a new member on the next call + self._read_eof() + self._new_member = 1 + + def _add_read_data(self, data): + self.crc = zlib.crc32(data, self.crc) + self.extrabuf = self.extrabuf + data + self.extrasize = self.extrasize + len(data) + self.size = self.size + len(data) + + def _read_eof(self): + # We've read to the end of the file, so we have to rewind in order + # to reread the 8 bytes containing the CRC and the file size. + # We check the that the computed CRC and size of the + # uncompressed data matches the stored values. + self.fileobj.seek(-8, 1) + crc32 = read32(self.fileobj) + isize = read32(self.fileobj) + if crc32%0x100000000L != self.crc%0x100000000L: + raise ValueError, "CRC check failed" + elif isize != self.size: + raise ValueError, "Incorrect length of data produced" + + def close(self): + if self.mode == WRITE: + self.fileobj.write(self.compress.flush()) + write32(self.fileobj, self.crc) + write32(self.fileobj, self.size) + self.fileobj = None + elif self.mode == READ: + self.fileobj = None + if self.myfileobj: + self.myfileobj.close() + self.myfileobj = None + + def __del__(self): + try: + if (self.myfileobj is None and + self.fileobj is None): + return + except AttributeError: + return + self.close() + + def flush(self): + self.fileobj.flush() + + def isatty(self): + return 0 + + def tell(self): + return self.offset + + def rewind(self): + '''Return the uncompressed stream file position indicator to the + beginning of the file''' + if self.mode != READ: + raise IOError("Can't rewind in write mode") + self.fileobj.seek(0) + self._new_member = 1 + self.extrabuf = "" + self.extrasize = 0 + self.offset = 0 + + def seek(self, offset): + if self.mode == WRITE: + if offset < self.offset: + raise IOError('Negative seek in write mode') + count = offset - self.offset + for i in range(count/1024): + self.write(1024*'\0') + self.write((count%1024)*'\0') + elif self.mode == READ: + if offset < self.offset: + # for negative seek, rewind and do positive seek + self.rewind() + count = offset - self.offset + for i in range(count/1024): self.read(1024) + self.read(count % 1024) + + def readline(self, size=-1): + if size < 0: size = sys.maxint + bufs = [] + readsize = min(100, size) # Read from the file in small chunks + while 1: + if size == 0: + return "".join(bufs) # Return resulting line + + c = self.read(readsize) + i = c.find('\n') + if size is not None: + # We set i=size to break out of the loop under two + # conditions: 1) there's no newline, and the chunk is + # larger than size, or 2) there is a newline, but the + # resulting line would be longer than 'size'. + if i==-1 and len(c) > size: i=size-1 + elif size <= i: i = size -1 + + if i >= 0 or c == '': + bufs.append(c[:i+1]) # Add portion of last chunk + self._unread(c[i+1:]) # Push back rest of chunk + return ''.join(bufs) # Return resulting line + + # Append chunk to list, decrease 'size', + bufs.append(c) + size = size - len(c) + readsize = min(size, readsize * 2) + + def readlines(self, sizehint=0): + # Negative numbers result in reading all the lines + if sizehint <= 0: sizehint = sys.maxint + L = [] + while sizehint > 0: + line = self.readline() + if line == "": break + L.append( line ) + sizehint = sizehint - len(line) + + return L + + def writelines(self, L): + for line in L: + self.write(line) + + +def _test(): + # Act like gzip; with -d, act like gunzip. + # The input file is not deleted, however, nor are any other gzip + # options or features supported. + args = sys.argv[1:] + decompress = args and args[0] == "-d" + if decompress: + args = args[1:] + if not args: + args = ["-"] + for arg in args: + if decompress: + if arg == "-": + f = GzipFile(filename="", mode="rb", fileobj=sys.stdin) + g = sys.stdout + else: + if arg[-3:] != ".gz": + print "filename doesn't end in .gz:", `arg` + continue + f = open(arg, "rb") + g = __builtin__.open(arg[:-3], "wb") + else: + if arg == "-": + f = sys.stdin + g = GzipFile(filename="", mode="wb", fileobj=sys.stdout) + else: + f = __builtin__.open(arg, "rb") + g = open(arg + ".gz", "wb") + while 1: + chunk = f.read(1024) + if not chunk: + break + g.write(chunk) + if g is not sys.stdout: + g.close() + if f is not sys.stdin: + f.close() + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/hmac.py b/lib-python/2.2/hmac.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/hmac.py @@ -0,0 +1,99 @@ +"""HMAC (Keyed-Hashing for Message Authentication) Python module. + +Implements the HMAC algorithm as described by RFC 2104. +""" + +import string + +def _strxor(s1, s2): + """Utility method. XOR the two strings s1 and s2 (must have same length). + """ + return "".join(map(lambda x, y: chr(ord(x) ^ ord(y)), s1, s2)) + +# The size of the digests returned by HMAC depends on the underlying +# hashing module used. +digest_size = None + +class HMAC: + """RFC2104 HMAC class. + + This supports the API for Cryptographic Hash Functions (PEP 247). + """ + + def __init__(self, key, msg = None, digestmod = None): + """Create a new HMAC object. + + key: key for the keyed hash object. + msg: Initial input for the hash, if provided. + digestmod: A module supporting PEP 247. Defaults to the md5 module. + """ + if digestmod == None: + import md5 + digestmod = md5 + + self.digestmod = digestmod + self.outer = digestmod.new() + self.inner = digestmod.new() + self.digest_size = digestmod.digest_size + + blocksize = 64 + ipad = "\x36" * blocksize + opad = "\x5C" * blocksize + + if len(key) > blocksize: + key = digestmod.new(key).digest() + + key = key + chr(0) * (blocksize - len(key)) + self.outer.update(_strxor(key, opad)) + self.inner.update(_strxor(key, ipad)) + if (msg): + self.update(msg) + +## def clear(self): +## raise NotImplementedError, "clear() method not available in HMAC." + + def update(self, msg): + """Update this hashing object with the string msg. + """ + self.inner.update(msg) + + def copy(self): + """Return a separate copy of this hashing object. + + An update to this copy won't affect the original object. + """ + other = HMAC("") + other.digestmod = self.digestmod + other.inner = self.inner.copy() + other.outer = self.outer.copy() + return other + + def digest(self): + """Return the hash value of this hashing object. + + This returns a string containing 8-bit data. The object is + not altered in any way by this function; you can continue + updating the object after calling this function. + """ + h = self.outer.copy() + h.update(self.inner.digest()) + return h.digest() + + def hexdigest(self): + """Like digest(), but returns a string of hexadecimal digits instead. + """ + return "".join([string.zfill(hex(ord(x))[2:], 2) + for x in tuple(self.digest())]) + +def new(key, msg = None, digestmod = None): + """Create a new hashing object and return it. + + key: The starting key for the hash. + msg: if available, will immediately be hashed into the object's starting + state. + + You can now feed arbitrary strings into the object using its update() + method, and can ask for the hash value at any time by calling its digest() + method. + """ + return HMAC(key, msg, digestmod) diff --git a/lib-python/2.2/hotshot/__init__.py b/lib-python/2.2/hotshot/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/hotshot/__init__.py @@ -0,0 +1,41 @@ +"""High-perfomance logging profiler, mostly written in C.""" + +import _hotshot + +from _hotshot import ProfilerError + + +class Profile: + def __init__(self, logfn, lineevents=0, linetimings=1): + self.lineevents = lineevents and 1 or 0 + self.linetimings = (linetimings and lineevents) and 1 or 0 + self._prof = p = _hotshot.profiler( + logfn, self.lineevents, self.linetimings) + + def close(self): + self._prof.close() + + def start(self): + self._prof.start() + + def stop(self): + self._prof.stop() + + def addinfo(self, key, value): + self._prof.addinfo(key, value) + + # These methods offer the same interface as the profile.Profile class, + # but delegate most of the work to the C implementation underneath. + + def run(self, cmd): + import __main__ + dict = __main__.__dict__ + return self.runctx(cmd, dict, dict) + + def runctx(self, cmd, globals, locals): + code = compile(cmd, "", "exec") + self._prof.runcode(code, globals, locals) + return self + + def runcall(self, func, *args, **kw): + return self._prof.runcall(func, args, kw) diff --git a/lib-python/2.2/hotshot/log.py b/lib-python/2.2/hotshot/log.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/hotshot/log.py @@ -0,0 +1,194 @@ +import _hotshot +import os.path +import parser +import symbol +import sys + +from _hotshot import \ + WHAT_ENTER, \ + WHAT_EXIT, \ + WHAT_LINENO, \ + WHAT_DEFINE_FILE, \ + WHAT_DEFINE_FUNC, \ + WHAT_ADD_INFO + + +__all__ = ["LogReader", "ENTER", "EXIT", "LINE"] + + +ENTER = WHAT_ENTER +EXIT = WHAT_EXIT +LINE = WHAT_LINENO + + +try: + StopIteration +except NameError: + StopIteration = IndexError + + +class LogReader: + def __init__(self, logfn): + # fileno -> filename + self._filemap = {} + # (fileno, lineno) -> filename, funcname + self._funcmap = {} + + self._reader = _hotshot.logreader(logfn) + self._nextitem = self._reader.next + self._info = self._reader.info + if self._info.has_key('current-directory'): + self.cwd = self._info['current-directory'] + else: + self.cwd = None + self._stack = [] + self._append = self._stack.append + self._pop = self._stack.pop + + def addinfo(self, key, value): + """This method is called for each additional ADD_INFO record. + + This can be overridden by applications that want to receive + these events. The default implementation does not need to be + called by alternate implementations. + + The initial set of ADD_INFO records do not pass through this + mechanism; this is only needed to receive notification when + new values are added. Subclasses can inspect self._info after + calling LogReader.__init__(). + """ + pass + + def get_filename(self, fileno): + try: + return self._filemap[fileno] + except KeyError: + raise ValueError, "unknown fileno" + + def get_filenames(self): + return self._filemap.values() + + def get_fileno(self, filename): + filename = os.path.normcase(os.path.normpath(filename)) + for fileno, name in self._filemap.items(): + if name == filename: + return fileno + raise ValueError, "unknown filename" + + def get_funcname(self, fileno, lineno): + try: + return self._funcmap[(fileno, lineno)] + except KeyError: + raise ValueError, "unknown function location" + + # Iteration support: + # This adds an optional (& ignored) parameter to next() so that the + # same bound method can be used as the __getitem__() method -- this + # avoids using an additional method call which kills the performance. + + def next(self, index=0): + while 1: + try: + what, tdelta, fileno, lineno = self._nextitem() + except TypeError: + # logreader().next() returns None at the end + self._reader.close() + raise StopIteration() + + # handle the most common cases first + + if what == WHAT_ENTER: + filename, funcname = self._decode_location(fileno, lineno) + self._append((filename, funcname, lineno)) + return what, (filename, lineno, funcname), tdelta + + if what == WHAT_EXIT: + filename, funcname, lineno = self._pop() + return what, (filename, lineno, funcname), tdelta + + if what == WHAT_LINENO: + filename, funcname, firstlineno = self._stack[-1] + return what, (filename, lineno, funcname), tdelta + + if what == WHAT_DEFINE_FILE: + filename = os.path.normcase(os.path.normpath(tdelta)) + self._filemap[fileno] = filename + elif what == WHAT_DEFINE_FUNC: + filename = self._filemap[fileno] + self._funcmap[(fileno, lineno)] = (filename, tdelta) + elif what == WHAT_ADD_INFO: + # value already loaded into self.info; call the + # overridable addinfo() handler so higher-level code + # can pick up the new value + if tdelta == 'current-directory': + self.cwd = lineno + self.addinfo(tdelta, lineno) + else: + raise ValueError, "unknown event type" + + if sys.version < "2.2": + # Don't add this for newer Python versions; we only want iteration + # support, not general sequence support. + __getitem__ = next + else: + def __iter__(self): + return self + + # + # helpers + # + + def _decode_location(self, fileno, lineno): + try: + return self._funcmap[(fileno, lineno)] + except KeyError: + # + # This should only be needed when the log file does not + # contain all the DEFINE_FUNC records needed to allow the + # function name to be retrieved from the log file. + # + if self._loadfile(fileno): + filename = funcname = None + try: + filename, funcname = self._funcmap[(fileno, lineno)] + except KeyError: + filename = self._filemap.get(fileno) + funcname = None + self._funcmap[(fileno, lineno)] = (filename, funcname) + return filename, funcname + + def _loadfile(self, fileno): + try: + filename = self._filemap[fileno] + except KeyError: + print "Could not identify fileId", fileno + return 1 + if filename is None: + return 1 + absname = os.path.normcase(os.path.join(self.cwd, filename)) + + try: + fp = open(absname) + except IOError: + return + st = parser.suite(fp.read()) + fp.close() + + # Scan the tree looking for def and lambda nodes, filling in + # self._funcmap with all the available information. + funcdef = symbol.funcdef + lambdef = symbol.lambdef + + stack = [st.totuple(1)] + + while stack: + tree = stack.pop() + try: + sym = tree[0] + except (IndexError, TypeError): + continue + if sym == funcdef: + self._funcmap[(fileno, tree[2][2])] = filename, tree[2][1] + elif sym == lambdef: + self._funcmap[(fileno, tree[1][2])] = filename, "" + stack.extend(list(tree[1:])) diff --git a/lib-python/2.2/hotshot/stats.py b/lib-python/2.2/hotshot/stats.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/hotshot/stats.py @@ -0,0 +1,93 @@ +"""Statistics analyzer for HotShot.""" + +import profile +import pstats + +import hotshot.log + +from hotshot.log import ENTER, EXIT + + +def load(filename): + return StatsLoader(filename).load() + + +class StatsLoader: + def __init__(self, logfn): + self._logfn = logfn + self._code = {} + self._stack = [] + self.pop_frame = self._stack.pop + + def load(self): + # The timer selected by the profiler should never be used, so make + # sure it doesn't work: + p = Profile() + p.get_time = _brokentimer + log = hotshot.log.LogReader(self._logfn) + taccum = 0 + for event in log: + what, (filename, lineno, funcname), tdelta = event + if tdelta > 0: + taccum += tdelta + + # We multiply taccum to convert from the microseconds we + # have to the seconds that the profile/pstats module work + # with; this allows the numbers to have some basis in + # reality (ignoring calibration issues for now). + + if what == ENTER: + frame = self.new_frame(filename, lineno, funcname) + p.trace_dispatch_call(frame, taccum * .000001) + taccum = 0 + + elif what == EXIT: + frame = self.pop_frame() + p.trace_dispatch_return(frame, taccum * .000001) + taccum = 0 + + # no further work for line events + + assert not self._stack + return pstats.Stats(p) + + def new_frame(self, *args): + # args must be filename, firstlineno, funcname + # our code objects are cached since we don't need to create + # new ones every time + try: + code = self._code[args] + except KeyError: + code = FakeCode(*args) + self._code[args] = code + # frame objects are create fresh, since the back pointer will + # vary considerably + if self._stack: + back = self._stack[-1] + else: + back = None + frame = FakeFrame(code, back) + self._stack.append(frame) + return frame + + +class Profile(profile.Profile): + def simulate_cmd_complete(self): + pass + + +class FakeCode: + def __init__(self, filename, firstlineno, funcname): + self.co_filename = filename + self.co_firstlineno = firstlineno + self.co_name = self.__name__ = funcname + + +class FakeFrame: + def __init__(self, code, back): + self.f_back = back + self.f_code = code + + +def _brokentimer(): + raise RuntimeError, "this timer should not be called" diff --git a/lib-python/2.2/htmlentitydefs.py b/lib-python/2.2/htmlentitydefs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/htmlentitydefs.py @@ -0,0 +1,257 @@ +"""HTML character entity references.""" + +entitydefs = { + 'AElig': '\306', # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 + 'Aacute': '\301', # latin capital letter A with acute, U+00C1 ISOlat1 + 'Acirc': '\302', # latin capital letter A with circumflex, U+00C2 ISOlat1 + 'Agrave': '\300', # latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1 + 'Alpha': 'Α', # greek capital letter alpha, U+0391 + 'Aring': '\305', # latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1 + 'Atilde': '\303', # latin capital letter A with tilde, U+00C3 ISOlat1 + 'Auml': '\304', # latin capital letter A with diaeresis, U+00C4 ISOlat1 + 'Beta': 'Β', # greek capital letter beta, U+0392 + 'Ccedil': '\307', # latin capital letter C with cedilla, U+00C7 ISOlat1 + 'Chi': 'Χ', # greek capital letter chi, U+03A7 + 'Dagger': '‡', # double dagger, U+2021 ISOpub + 'Delta': 'Δ', # greek capital letter delta, U+0394 ISOgrk3 + 'ETH': '\320', # latin capital letter ETH, U+00D0 ISOlat1 + 'Eacute': '\311', # latin capital letter E with acute, U+00C9 ISOlat1 + 'Ecirc': '\312', # latin capital letter E with circumflex, U+00CA ISOlat1 + 'Egrave': '\310', # latin capital letter E with grave, U+00C8 ISOlat1 + 'Epsilon': 'Ε', # greek capital letter epsilon, U+0395 + 'Eta': 'Η', # greek capital letter eta, U+0397 + 'Euml': '\313', # latin capital letter E with diaeresis, U+00CB ISOlat1 + 'Gamma': 'Γ', # greek capital letter gamma, U+0393 ISOgrk3 + 'Iacute': '\315', # latin capital letter I with acute, U+00CD ISOlat1 + 'Icirc': '\316', # latin capital letter I with circumflex, U+00CE ISOlat1 + 'Igrave': '\314', # latin capital letter I with grave, U+00CC ISOlat1 + 'Iota': 'Ι', # greek capital letter iota, U+0399 + 'Iuml': '\317', # latin capital letter I with diaeresis, U+00CF ISOlat1 + 'Kappa': 'Κ', # greek capital letter kappa, U+039A + 'Lambda': 'Λ', # greek capital letter lambda, U+039B ISOgrk3 + 'Mu': 'Μ', # greek capital letter mu, U+039C + 'Ntilde': '\321', # latin capital letter N with tilde, U+00D1 ISOlat1 + 'Nu': 'Ν', # greek capital letter nu, U+039D + 'OElig': 'Œ', # latin capital ligature OE, U+0152 ISOlat2 + 'Oacute': '\323', # latin capital letter O with acute, U+00D3 ISOlat1 + 'Ocirc': '\324', # latin capital letter O with circumflex, U+00D4 ISOlat1 + 'Ograve': '\322', # latin capital letter O with grave, U+00D2 ISOlat1 + 'Omega': 'Ω', # greek capital letter omega, U+03A9 ISOgrk3 + 'Omicron': 'Ο', # greek capital letter omicron, U+039F + 'Oslash': '\330', # latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1 + 'Otilde': '\325', # latin capital letter O with tilde, U+00D5 ISOlat1 + 'Ouml': '\326', # latin capital letter O with diaeresis, U+00D6 ISOlat1 + 'Phi': 'Φ', # greek capital letter phi, U+03A6 ISOgrk3 + 'Pi': 'Π', # greek capital letter pi, U+03A0 ISOgrk3 + 'Prime': '″', # double prime = seconds = inches, U+2033 ISOtech + 'Psi': 'Ψ', # greek capital letter psi, U+03A8 ISOgrk3 + 'Rho': 'Ρ', # greek capital letter rho, U+03A1 + 'Scaron': 'Š', # latin capital letter S with caron, U+0160 ISOlat2 + 'Sigma': 'Σ', # greek capital letter sigma, U+03A3 ISOgrk3 + 'THORN': '\336', # latin capital letter THORN, U+00DE ISOlat1 + 'Tau': 'Τ', # greek capital letter tau, U+03A4 + 'Theta': 'Θ', # greek capital letter theta, U+0398 ISOgrk3 + 'Uacute': '\332', # latin capital letter U with acute, U+00DA ISOlat1 + 'Ucirc': '\333', # latin capital letter U with circumflex, U+00DB ISOlat1 + 'Ugrave': '\331', # latin capital letter U with grave, U+00D9 ISOlat1 + 'Upsilon': 'Υ', # greek capital letter upsilon, U+03A5 ISOgrk3 + 'Uuml': '\334', # latin capital letter U with diaeresis, U+00DC ISOlat1 + 'Xi': 'Ξ', # greek capital letter xi, U+039E ISOgrk3 + 'Yacute': '\335', # latin capital letter Y with acute, U+00DD ISOlat1 + 'Yuml': 'Ÿ', # latin capital letter Y with diaeresis, U+0178 ISOlat2 + 'Zeta': 'Ζ', # greek capital letter zeta, U+0396 + 'aacute': '\341', # latin small letter a with acute, U+00E1 ISOlat1 + 'acirc': '\342', # latin small letter a with circumflex, U+00E2 ISOlat1 + 'acute': '\264', # acute accent = spacing acute, U+00B4 ISOdia + 'aelig': '\346', # latin small letter ae = latin small ligature ae, U+00E6 ISOlat1 + 'agrave': '\340', # latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1 + 'alefsym': 'ℵ', # alef symbol = first transfinite cardinal, U+2135 NEW + 'alpha': 'α', # greek small letter alpha, U+03B1 ISOgrk3 + 'amp': '\46', # ampersand, U+0026 ISOnum + 'and': '∧', # logical and = wedge, U+2227 ISOtech + 'ang': '∠', # angle, U+2220 ISOamso + 'aring': '\345', # latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1 + 'asymp': '≈', # almost equal to = asymptotic to, U+2248 ISOamsr + 'atilde': '\343', # latin small letter a with tilde, U+00E3 ISOlat1 + 'auml': '\344', # latin small letter a with diaeresis, U+00E4 ISOlat1 + 'bdquo': '„', # double low-9 quotation mark, U+201E NEW + 'beta': 'β', # greek small letter beta, U+03B2 ISOgrk3 + 'brvbar': '\246', # broken bar = broken vertical bar, U+00A6 ISOnum + 'bull': '•', # bullet = black small circle, U+2022 ISOpub + 'cap': '∩', # intersection = cap, U+2229 ISOtech + 'ccedil': '\347', # latin small letter c with cedilla, U+00E7 ISOlat1 + 'cedil': '\270', # cedilla = spacing cedilla, U+00B8 ISOdia + 'cent': '\242', # cent sign, U+00A2 ISOnum + 'chi': 'χ', # greek small letter chi, U+03C7 ISOgrk3 + 'circ': 'ˆ', # modifier letter circumflex accent, U+02C6 ISOpub + 'clubs': '♣', # black club suit = shamrock, U+2663 ISOpub + 'cong': '≅', # approximately equal to, U+2245 ISOtech + 'copy': '\251', # copyright sign, U+00A9 ISOnum + 'crarr': '↵', # downwards arrow with corner leftwards = carriage return, U+21B5 NEW + 'cup': '∪', # union = cup, U+222A ISOtech + 'curren': '\244', # currency sign, U+00A4 ISOnum + 'dArr': '⇓', # downwards double arrow, U+21D3 ISOamsa + 'dagger': '†', # dagger, U+2020 ISOpub + 'darr': '↓', # downwards arrow, U+2193 ISOnum + 'deg': '\260', # degree sign, U+00B0 ISOnum + 'delta': 'δ', # greek small letter delta, U+03B4 ISOgrk3 + 'diams': '♦', # black diamond suit, U+2666 ISOpub + 'divide': '\367', # division sign, U+00F7 ISOnum + 'eacute': '\351', # latin small letter e with acute, U+00E9 ISOlat1 + 'ecirc': '\352', # latin small letter e with circumflex, U+00EA ISOlat1 + 'egrave': '\350', # latin small letter e with grave, U+00E8 ISOlat1 + 'empty': '∅', # empty set = null set = diameter, U+2205 ISOamso + 'emsp': ' ', # em space, U+2003 ISOpub + 'ensp': ' ', # en space, U+2002 ISOpub + 'epsilon': 'ε', # greek small letter epsilon, U+03B5 ISOgrk3 + 'equiv': '≡', # identical to, U+2261 ISOtech + 'eta': 'η', # greek small letter eta, U+03B7 ISOgrk3 + 'eth': '\360', # latin small letter eth, U+00F0 ISOlat1 + 'euml': '\353', # latin small letter e with diaeresis, U+00EB ISOlat1 + 'euro': '€', # euro sign, U+20AC NEW + 'exist': '∃', # there exists, U+2203 ISOtech + 'fnof': 'ƒ', # latin small f with hook = function = florin, U+0192 ISOtech + 'forall': '∀', # for all, U+2200 ISOtech + 'frac12': '\275', # vulgar fraction one half = fraction one half, U+00BD ISOnum + 'frac14': '\274', # vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum + 'frac34': '\276', # vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum + 'frasl': '⁄', # fraction slash, U+2044 NEW + 'gamma': 'γ', # greek small letter gamma, U+03B3 ISOgrk3 + 'ge': '≥', # greater-than or equal to, U+2265 ISOtech + 'gt': '\76', # greater-than sign, U+003E ISOnum + 'hArr': '⇔', # left right double arrow, U+21D4 ISOamsa + 'harr': '↔', # left right arrow, U+2194 ISOamsa + 'hearts': '♥', # black heart suit = valentine, U+2665 ISOpub + 'hellip': '…', # horizontal ellipsis = three dot leader, U+2026 ISOpub + 'iacute': '\355', # latin small letter i with acute, U+00ED ISOlat1 + 'icirc': '\356', # latin small letter i with circumflex, U+00EE ISOlat1 + 'iexcl': '\241', # inverted exclamation mark, U+00A1 ISOnum + 'igrave': '\354', # latin small letter i with grave, U+00EC ISOlat1 + 'image': 'ℑ', # blackletter capital I = imaginary part, U+2111 ISOamso + 'infin': '∞', # infinity, U+221E ISOtech + 'int': '∫', # integral, U+222B ISOtech + 'iota': 'ι', # greek small letter iota, U+03B9 ISOgrk3 + 'iquest': '\277', # inverted question mark = turned question mark, U+00BF ISOnum + 'isin': '∈', # element of, U+2208 ISOtech + 'iuml': '\357', # latin small letter i with diaeresis, U+00EF ISOlat1 + 'kappa': 'κ', # greek small letter kappa, U+03BA ISOgrk3 + 'lArr': '⇐', # leftwards double arrow, U+21D0 ISOtech + 'lambda': 'λ', # greek small letter lambda, U+03BB ISOgrk3 + 'lang': '〈', # left-pointing angle bracket = bra, U+2329 ISOtech + 'laquo': '\253', # left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum + 'larr': '←', # leftwards arrow, U+2190 ISOnum + 'lceil': '⌈', # left ceiling = apl upstile, U+2308 ISOamsc + 'ldquo': '“', # left double quotation mark, U+201C ISOnum + 'le': '≤', # less-than or equal to, U+2264 ISOtech + 'lfloor': '⌊', # left floor = apl downstile, U+230A ISOamsc + 'lowast': '∗', # asterisk operator, U+2217 ISOtech + 'loz': '◊', # lozenge, U+25CA ISOpub + 'lrm': '‎', # left-to-right mark, U+200E NEW RFC 2070 + 'lsaquo': '‹', # single left-pointing angle quotation mark, U+2039 ISO proposed + 'lsquo': '‘', # left single quotation mark, U+2018 ISOnum + 'lt': '\74', # less-than sign, U+003C ISOnum + 'macr': '\257', # macron = spacing macron = overline = APL overbar, U+00AF ISOdia + 'mdash': '—', # em dash, U+2014 ISOpub + 'micro': '\265', # micro sign, U+00B5 ISOnum + 'middot': '\267', # middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum + 'minus': '−', # minus sign, U+2212 ISOtech + 'mu': 'μ', # greek small letter mu, U+03BC ISOgrk3 + 'nabla': '∇', # nabla = backward difference, U+2207 ISOtech + 'nbsp': '\240', # no-break space = non-breaking space, U+00A0 ISOnum + 'ndash': '–', # en dash, U+2013 ISOpub + 'ne': '≠', # not equal to, U+2260 ISOtech + 'ni': '∋', # contains as member, U+220B ISOtech + 'not': '\254', # not sign, U+00AC ISOnum + 'notin': '∉', # not an element of, U+2209 ISOtech + 'nsub': '⊄', # not a subset of, U+2284 ISOamsn + 'ntilde': '\361', # latin small letter n with tilde, U+00F1 ISOlat1 + 'nu': 'ν', # greek small letter nu, U+03BD ISOgrk3 + 'oacute': '\363', # latin small letter o with acute, U+00F3 ISOlat1 + 'ocirc': '\364', # latin small letter o with circumflex, U+00F4 ISOlat1 + 'oelig': 'œ', # latin small ligature oe, U+0153 ISOlat2 + 'ograve': '\362', # latin small letter o with grave, U+00F2 ISOlat1 + 'oline': '‾', # overline = spacing overscore, U+203E NEW + 'omega': 'ω', # greek small letter omega, U+03C9 ISOgrk3 + 'omicron': 'ο', # greek small letter omicron, U+03BF NEW + 'oplus': '⊕', # circled plus = direct sum, U+2295 ISOamsb + 'or': '∨', # logical or = vee, U+2228 ISOtech + 'ordf': '\252', # feminine ordinal indicator, U+00AA ISOnum + 'ordm': '\272', # masculine ordinal indicator, U+00BA ISOnum + 'oslash': '\370', # latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1 + 'otilde': '\365', # latin small letter o with tilde, U+00F5 ISOlat1 + 'otimes': '⊗', # circled times = vector product, U+2297 ISOamsb + 'ouml': '\366', # latin small letter o with diaeresis, U+00F6 ISOlat1 + 'para': '\266', # pilcrow sign = paragraph sign, U+00B6 ISOnum + 'part': '∂', # partial differential, U+2202 ISOtech + 'permil': '‰', # per mille sign, U+2030 ISOtech + 'perp': '⊥', # up tack = orthogonal to = perpendicular, U+22A5 ISOtech + 'phi': 'φ', # greek small letter phi, U+03C6 ISOgrk3 + 'pi': 'π', # greek small letter pi, U+03C0 ISOgrk3 + 'piv': 'ϖ', # greek pi symbol, U+03D6 ISOgrk3 + 'plusmn': '\261', # plus-minus sign = plus-or-minus sign, U+00B1 ISOnum + 'pound': '\243', # pound sign, U+00A3 ISOnum + 'prime': '′', # prime = minutes = feet, U+2032 ISOtech + 'prod': '∏', # n-ary product = product sign, U+220F ISOamsb + 'prop': '∝', # proportional to, U+221D ISOtech + 'psi': 'ψ', # greek small letter psi, U+03C8 ISOgrk3 + 'quot': '\42', # quotation mark = APL quote, U+0022 ISOnum + 'rArr': '⇒', # rightwards double arrow, U+21D2 ISOtech + 'radic': '√', # square root = radical sign, U+221A ISOtech + 'rang': '〉', # right-pointing angle bracket = ket, U+232A ISOtech + 'raquo': '\273', # right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum + 'rarr': '→', # rightwards arrow, U+2192 ISOnum + 'rceil': '⌉', # right ceiling, U+2309 ISOamsc + 'rdquo': '”', # right double quotation mark, U+201D ISOnum + 'real': 'ℜ', # blackletter capital R = real part symbol, U+211C ISOamso + 'reg': '\256', # registered sign = registered trade mark sign, U+00AE ISOnum + 'rfloor': '⌋', # right floor, U+230B ISOamsc + 'rho': 'ρ', # greek small letter rho, U+03C1 ISOgrk3 + 'rlm': '‏', # right-to-left mark, U+200F NEW RFC 2070 + 'rsaquo': '›', # single right-pointing angle quotation mark, U+203A ISO proposed + 'rsquo': '’', # right single quotation mark, U+2019 ISOnum + 'sbquo': '‚', # single low-9 quotation mark, U+201A NEW + 'scaron': 'š', # latin small letter s with caron, U+0161 ISOlat2 + 'sdot': '⋅', # dot operator, U+22C5 ISOamsb + 'sect': '\247', # section sign, U+00A7 ISOnum + 'shy': '\255', # soft hyphen = discretionary hyphen, U+00AD ISOnum + 'sigma': 'σ', # greek small letter sigma, U+03C3 ISOgrk3 + 'sigmaf': 'ς', # greek small letter final sigma, U+03C2 ISOgrk3 + 'sim': '∼', # tilde operator = varies with = similar to, U+223C ISOtech + 'spades': '♠', # black spade suit, U+2660 ISOpub + 'sub': '⊂', # subset of, U+2282 ISOtech + 'sube': '⊆', # subset of or equal to, U+2286 ISOtech + 'sum': '∑', # n-ary sumation, U+2211 ISOamsb + 'sup': '⊃', # superset of, U+2283 ISOtech + 'sup1': '\271', # superscript one = superscript digit one, U+00B9 ISOnum + 'sup2': '\262', # superscript two = superscript digit two = squared, U+00B2 ISOnum + 'sup3': '\263', # superscript three = superscript digit three = cubed, U+00B3 ISOnum + 'supe': '⊇', # superset of or equal to, U+2287 ISOtech + 'szlig': '\337', # latin small letter sharp s = ess-zed, U+00DF ISOlat1 + 'tau': 'τ', # greek small letter tau, U+03C4 ISOgrk3 + 'there4': '∴', # therefore, U+2234 ISOtech + 'theta': 'θ', # greek small letter theta, U+03B8 ISOgrk3 + 'thetasym': 'ϑ', # greek small letter theta symbol, U+03D1 NEW + 'thinsp': ' ', # thin space, U+2009 ISOpub + 'thorn': '\376', # latin small letter thorn with, U+00FE ISOlat1 + 'tilde': '˜', # small tilde, U+02DC ISOdia + 'times': '\327', # multiplication sign, U+00D7 ISOnum + 'trade': '™', # trade mark sign, U+2122 ISOnum + 'uArr': '⇑', # upwards double arrow, U+21D1 ISOamsa + 'uacute': '\372', # latin small letter u with acute, U+00FA ISOlat1 + 'uarr': '↑', # upwards arrow, U+2191 ISOnum + 'ucirc': '\373', # latin small letter u with circumflex, U+00FB ISOlat1 + 'ugrave': '\371', # latin small letter u with grave, U+00F9 ISOlat1 + 'uml': '\250', # diaeresis = spacing diaeresis, U+00A8 ISOdia + 'upsih': 'ϒ', # greek upsilon with hook symbol, U+03D2 NEW + 'upsilon': 'υ', # greek small letter upsilon, U+03C5 ISOgrk3 + 'uuml': '\374', # latin small letter u with diaeresis, U+00FC ISOlat1 + 'weierp': '℘', # script capital P = power set = Weierstrass p, U+2118 ISOamso + 'xi': 'ξ', # greek small letter xi, U+03BE ISOgrk3 + 'yacute': '\375', # latin small letter y with acute, U+00FD ISOlat1 + 'yen': '\245', # yen sign = yuan sign, U+00A5 ISOnum + 'yuml': '\377', # latin small letter y with diaeresis, U+00FF ISOlat1 + 'zeta': 'ζ', # greek small letter zeta, U+03B6 ISOgrk3 + 'zwj': '‍', # zero width joiner, U+200D NEW RFC 2070 + 'zwnj': '‌', # zero width non-joiner, U+200C NEW RFC 2070 + +} diff --git a/lib-python/2.2/htmllib.py b/lib-python/2.2/htmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/htmllib.py @@ -0,0 +1,475 @@ +"""HTML 2.0 parser. + +See the HTML 2.0 specification: +http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_toc.html +""" + + +from sgmllib import SGMLParser +from formatter import AS_IS + +__all__ = ["HTMLParser"] + +class HTMLParser(SGMLParser): + """This is the basic HTML parser class. + + It supports all entity names required by the HTML 2.0 specification + RFC 1866. It also defines handlers for all HTML 2.0 and many HTML 3.0 + and 3.2 elements. + + """ + + from htmlentitydefs import entitydefs + + def __init__(self, formatter, verbose=0): + """Creates an instance of the HTMLParser class. + + The formatter parameter is the formatter instance associated with + the parser. + + """ + SGMLParser.__init__(self, verbose) + self.formatter = formatter + self.savedata = None + self.isindex = 0 + self.title = None + self.base = None + self.anchor = None + self.anchorlist = [] + self.nofill = 0 + self.list_stack = [] + + # ------ Methods used internally; some may be overridden + + # --- Formatter interface, taking care of 'savedata' mode; + # shouldn't need to be overridden + + def handle_data(self, data): + if self.savedata is not None: + self.savedata = self.savedata + data + else: + if self.nofill: + self.formatter.add_literal_data(data) + else: + self.formatter.add_flowing_data(data) + + # --- Hooks to save data; shouldn't need to be overridden + + def save_bgn(self): + """Begins saving character data in a buffer instead of sending it + to the formatter object. + + Retrieve the stored data via the save_end() method. Use of the + save_bgn() / save_end() pair may not be nested. + + """ + self.savedata = '' + + def save_end(self): + """Ends buffering character data and returns all data saved since + the preceding call to the save_bgn() method. + + If the nofill flag is false, whitespace is collapsed to single + spaces. A call to this method without a preceding call to the + save_bgn() method will raise a TypeError exception. + + """ + data = self.savedata + self.savedata = None + if not self.nofill: + data = ' '.join(data.split()) + return data + + # --- Hooks for anchors; should probably be overridden + + def anchor_bgn(self, href, name, type): + """This method is called at the start of an anchor region. + + The arguments correspond to the attributes of the tag with + the same names. The default implementation maintains a list of + hyperlinks (defined by the HREF attribute for tags) within + the document. The list of hyperlinks is available as the data + attribute anchorlist. + + """ + self.anchor = href + if self.anchor: + self.anchorlist.append(href) + + def anchor_end(self): + """This method is called at the end of an anchor region. + + The default implementation adds a textual footnote marker using an + index into the list of hyperlinks created by the anchor_bgn()method. + + """ + if self.anchor: + self.handle_data("[%d]" % len(self.anchorlist)) + self.anchor = None + + # --- Hook for images; should probably be overridden + + def handle_image(self, src, alt, *args): + """This method is called to handle images. + + The default implementation simply passes the alt value to the + handle_data() method. + + """ + self.handle_data(alt) + + # --------- Top level elememts + + def start_html(self, attrs): pass + def end_html(self): pass + + def start_head(self, attrs): pass + def end_head(self): pass + + def start_body(self, attrs): pass + def end_body(self): pass + + # ------ Head elements + + def start_title(self, attrs): + self.save_bgn() + + def end_title(self): + self.title = self.save_end() + + def do_base(self, attrs): + for a, v in attrs: + if a == 'href': + self.base = v + + def do_isindex(self, attrs): + self.isindex = 1 + + def do_link(self, attrs): + pass + + def do_meta(self, attrs): + pass + + def do_nextid(self, attrs): # Deprecated + pass + + # ------ Body elements + + # --- Headings + + def start_h1(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h1', 0, 1, 0)) + + def end_h1(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + def start_h2(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h2', 0, 1, 0)) + + def end_h2(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + def start_h3(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h3', 0, 1, 0)) + + def end_h3(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + def start_h4(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h4', 0, 1, 0)) + + def end_h4(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + def start_h5(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h5', 0, 1, 0)) + + def end_h5(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + def start_h6(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font(('h6', 0, 1, 0)) + + def end_h6(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + + # --- Block Structuring Elements + + def do_p(self, attrs): + self.formatter.end_paragraph(1) + + def start_pre(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_font((AS_IS, AS_IS, AS_IS, 1)) + self.nofill = self.nofill + 1 + + def end_pre(self): + self.formatter.end_paragraph(1) + self.formatter.pop_font() + self.nofill = max(0, self.nofill - 1) + + def start_xmp(self, attrs): + self.start_pre(attrs) + self.setliteral('xmp') # Tell SGML parser + + def end_xmp(self): + self.end_pre() + + def start_listing(self, attrs): + self.start_pre(attrs) + self.setliteral('listing') # Tell SGML parser + + def end_listing(self): + self.end_pre() + + def start_address(self, attrs): + self.formatter.end_paragraph(0) + self.formatter.push_font((AS_IS, 1, AS_IS, AS_IS)) + + def end_address(self): + self.formatter.end_paragraph(0) + self.formatter.pop_font() + + def start_blockquote(self, attrs): + self.formatter.end_paragraph(1) + self.formatter.push_margin('blockquote') + + def end_blockquote(self): + self.formatter.end_paragraph(1) + self.formatter.pop_margin() + + # --- List Elements + + def start_ul(self, attrs): + self.formatter.end_paragraph(not self.list_stack) + self.formatter.push_margin('ul') + self.list_stack.append(['ul', '*', 0]) + + def end_ul(self): + if self.list_stack: del self.list_stack[-1] + self.formatter.end_paragraph(not self.list_stack) + self.formatter.pop_margin() + + def do_li(self, attrs): + self.formatter.end_paragraph(0) + if self.list_stack: + [dummy, label, counter] = top = self.list_stack[-1] + top[2] = counter = counter+1 + else: + label, counter = '*', 0 + self.formatter.add_label_data(label, counter) + + def start_ol(self, attrs): + self.formatter.end_paragraph(not self.list_stack) + self.formatter.push_margin('ol') + label = '1.' + for a, v in attrs: + if a == 'type': + if len(v) == 1: v = v + '.' + label = v + self.list_stack.append(['ol', label, 0]) + + def end_ol(self): + if self.list_stack: del self.list_stack[-1] + self.formatter.end_paragraph(not self.list_stack) + self.formatter.pop_margin() + + def start_menu(self, attrs): + self.start_ul(attrs) + + def end_menu(self): + self.end_ul() + + def start_dir(self, attrs): + self.start_ul(attrs) + + def end_dir(self): + self.end_ul() + + def start_dl(self, attrs): + self.formatter.end_paragraph(1) + self.list_stack.append(['dl', '', 0]) + + def end_dl(self): + self.ddpop(1) + if self.list_stack: del self.list_stack[-1] + + def do_dt(self, attrs): + self.ddpop() + + def do_dd(self, attrs): + self.ddpop() + self.formatter.push_margin('dd') + self.list_stack.append(['dd', '', 0]) + + def ddpop(self, bl=0): + self.formatter.end_paragraph(bl) + if self.list_stack: + if self.list_stack[-1][0] == 'dd': + del self.list_stack[-1] + self.formatter.pop_margin() + + # --- Phrase Markup + + # Idiomatic Elements + + def start_cite(self, attrs): self.start_i(attrs) + def end_cite(self): self.end_i() + + def start_code(self, attrs): self.start_tt(attrs) + def end_code(self): self.end_tt() + + def start_em(self, attrs): self.start_i(attrs) + def end_em(self): self.end_i() + + def start_kbd(self, attrs): self.start_tt(attrs) + def end_kbd(self): self.end_tt() + + def start_samp(self, attrs): self.start_tt(attrs) + def end_samp(self): self.end_tt() + + def start_strong(self, attrs): self.start_b(attrs) + def end_strong(self): self.end_b() + + def start_var(self, attrs): self.start_i(attrs) + def end_var(self): self.end_i() + + # Typographic Elements + + def start_i(self, attrs): + self.formatter.push_font((AS_IS, 1, AS_IS, AS_IS)) + def end_i(self): + self.formatter.pop_font() + + def start_b(self, attrs): + self.formatter.push_font((AS_IS, AS_IS, 1, AS_IS)) + def end_b(self): + self.formatter.pop_font() + + def start_tt(self, attrs): + self.formatter.push_font((AS_IS, AS_IS, AS_IS, 1)) + def end_tt(self): + self.formatter.pop_font() + + def start_a(self, attrs): + href = '' + name = '' + type = '' + for attrname, value in attrs: + value = value.strip() + if attrname == 'href': + href = value + if attrname == 'name': + name = value + if attrname == 'type': + type = value.lower() + self.anchor_bgn(href, name, type) + + def end_a(self): + self.anchor_end() + + # --- Line Break + + def do_br(self, attrs): + self.formatter.add_line_break() + + # --- Horizontal Rule + + def do_hr(self, attrs): + self.formatter.add_hor_rule() + + # --- Image + + def do_img(self, attrs): + align = '' + alt = '(image)' + ismap = '' + src = '' + width = 0 + height = 0 + for attrname, value in attrs: + if attrname == 'align': + align = value + if attrname == 'alt': + alt = value + if attrname == 'ismap': + ismap = value + if attrname == 'src': + src = value + if attrname == 'width': + try: width = int(value) + except ValueError: pass + if attrname == 'height': + try: height = int(value) + except ValueError: pass + self.handle_image(src, alt, ismap, align, width, height) + + # --- Really Old Unofficial Deprecated Stuff + + def do_plaintext(self, attrs): + self.start_pre(attrs) + self.setnomoretags() # Tell SGML parser + + # --- Unhandled tags + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag): + pass + + +def test(args = None): + import sys, formatter + + if not args: + args = sys.argv[1:] + + silent = args and args[0] == '-s' + if silent: + del args[0] + + if args: + file = args[0] + else: + file = 'test.html' + + if file == '-': + f = sys.stdin + else: + try: + f = open(file, 'r') + except IOError, msg: + print file, ":", msg + sys.exit(1) + + data = f.read() + + if f is not sys.stdin: + f.close() + + if silent: + f = formatter.NullFormatter() + else: + f = formatter.AbstractFormatter(formatter.DumbWriter()) + + p = HTMLParser(f) + p.feed(data) + p.close() + + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/httplib.py b/lib-python/2.2/httplib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/httplib.py @@ -0,0 +1,1238 @@ +"""HTTP/1.1 client library + + + + +HTTPConnection go through a number of "states", which defines when a client +may legally make another request or fetch the response for a particular +request. This diagram details these state transitions: + + (null) + | + | HTTPConnection() + v + Idle + | + | putrequest() + v + Request-started + | + | ( putheader() )* endheaders() + v + Request-sent + | + | response = getresponse() + v + Unread-response [Response-headers-read] + |\____________________ + | | + | response.read() | putrequest() + v v + Idle Req-started-unread-response + ______/| + / | + response.read() | | ( putheader() )* endheaders() + v v + Request-started Req-sent-unread-response + | + | response.read() + v + Request-sent + +This diagram presents the following rules: + -- a second request may not be started until {response-headers-read} + -- a response [object] cannot be retrieved until {request-sent} + -- there is no differentiation between an unread response body and a + partially read response body + +Note: this enforcement is applied by the HTTPConnection class. The + HTTPResponse class does not enforce this state machine, which + implies sophisticated clients may accelerate the request/response + pipeline. Caution should be taken, though: accelerating the states + beyond the above pattern may imply knowledge of the server's + connection-close behavior for certain requests. For example, it + is impossible to tell whether the server will close the connection + UNTIL the response headers have been read; this means that further + requests cannot be placed into the pipeline until it is known that + the server will NOT be closing the connection. + +Logical State __state __response +------------- ------- ---------- +Idle _CS_IDLE None +Request-started _CS_REQ_STARTED None +Request-sent _CS_REQ_SENT None +Unread-response _CS_IDLE +Req-started-unread-response _CS_REQ_STARTED +Req-sent-unread-response _CS_REQ_SENT +""" + +import errno +import mimetools +import socket +from urlparse import urlsplit + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +__all__ = ["HTTP", "HTTPResponse", "HTTPConnection", "HTTPSConnection", + "HTTPException", "NotConnected", "UnknownProtocol", + "UnknownTransferEncoding", "UnimplementedFileMode", + "IncompleteRead", "InvalidURL", "ImproperConnectionState", + "CannotSendRequest", "CannotSendHeader", "ResponseNotReady", + "BadStatusLine", "error"] + +HTTP_PORT = 80 +HTTPS_PORT = 443 + +_UNKNOWN = 'UNKNOWN' + +# connection states +_CS_IDLE = 'Idle' +_CS_REQ_STARTED = 'Request-started' +_CS_REQ_SENT = 'Request-sent' + +class HTTPMessage(mimetools.Message): + + def addheader(self, key, value): + """Add header for field key handling repeats.""" + prev = self.dict.get(key) + if prev is None: + self.dict[key] = value + else: + combined = ", ".join((prev, value)) + self.dict[key] = combined + + def addcontinue(self, key, more): + """Add more field data from a continuation line.""" + prev = self.dict[key] + self.dict[key] = prev + "\n " + more + + def readheaders(self): + """Read header lines. + + Read header lines up to the entirely blank line that terminates them. + The (normally blank) line that ends the headers is skipped, but not + included in the returned list. If a non-header line ends the headers, + (which is an error), an attempt is made to backspace over it; it is + never included in the returned list. + + The variable self.status is set to the empty string if all went well, + otherwise it is an error message. The variable self.headers is a + completely uninterpreted list of lines contained in the header (so + printing them will reproduce the header exactly as it appears in the + file). + + If multiple header fields with the same name occur, they are combined + according to the rules in RFC 2616 sec 4.2: + + Appending each subsequent field-value to the first, each separated + by a comma. The order in which header fields with the same field-name + are received is significant to the interpretation of the combined + field value. + """ + # XXX The implementation overrides the readheaders() method of + # rfc822.Message. The base class design isn't amenable to + # customized behavior here so the method here is a copy of the + # base class code with a few small changes. + + self.dict = {} + self.unixfrom = '' + self.headers = list = [] + self.status = '' + headerseen = "" + firstline = 1 + startofline = unread = tell = None + if hasattr(self.fp, 'unread'): + unread = self.fp.unread + elif self.seekable: + tell = self.fp.tell + while 1: + if tell: + try: + startofline = tell() + except IOError: + startofline = tell = None + self.seekable = 0 + line = self.fp.readline() + if not line: + self.status = 'EOF in headers' + break + # Skip unix From name time lines + if firstline and line.startswith('From '): + self.unixfrom = self.unixfrom + line + continue + firstline = 0 + if headerseen and line[0] in ' \t': + # XXX Not sure if continuation lines are handled properly + # for http and/or for repeating headers + # It's a continuation line. + list.append(line) + x = self.dict[headerseen] + "\n " + line.strip() + self.addcontinue(headerseen, line.strip()) + continue + elif self.iscomment(line): + # It's a comment. Ignore it. + continue + elif self.islast(line): + # Note! No pushback here! The delimiter line gets eaten. + break + headerseen = self.isheader(line) + if headerseen: + # It's a legal header line, save it. + list.append(line) + self.addheader(headerseen, line[len(headerseen)+1:].strip()) + continue + else: + # It's not a header line; throw it back and stop here. + if not self.dict: + self.status = 'No headers' + else: + self.status = 'Non-header line where header expected' + # Try to undo the read. + if unread: + unread(line) + elif tell: + self.fp.seek(startofline) + else: + self.status = self.status + '; bad seek' + break + +class HTTPResponse: + + # strict: If true, raise BadStatusLine if the status line can't be + # parsed as a valid HTTP/1.0 or 1.1 status line. By default it is + # false because it prevents clients from talking to HTTP/0.9 + # servers. Note that a response with a sufficiently corrupted + # status line will look like an HTTP/0.9 response. + + # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details. + + def __init__(self, sock, debuglevel=0, strict=0): + self.fp = sock.makefile('rb', 0) + self.debuglevel = debuglevel + self.strict = strict + + self.msg = None + + # from the Status-Line of the response + self.version = _UNKNOWN # HTTP-Version + self.status = _UNKNOWN # Status-Code + self.reason = _UNKNOWN # Reason-Phrase + + self.chunked = _UNKNOWN # is "chunked" being used? + self.chunk_left = _UNKNOWN # bytes left to read in current chunk + self.length = _UNKNOWN # number of bytes left in response + self.will_close = _UNKNOWN # conn will close at end of response + + def _read_status(self): + # Initialize with Simple-Response defaults + line = self.fp.readline() + if self.debuglevel > 0: + print "reply:", repr(line) + if not line: + # Presumably, the server closed the connection before + # sending a valid response. + raise BadStatusLine(line) + try: + [version, status, reason] = line.split(None, 2) + except ValueError: + try: + [version, status] = line.split(None, 1) + reason = "" + except ValueError: + # empty version will cause next test to fail and status + # will be treated as 0.9 response. + version = "" + if not version.startswith('HTTP/'): + if self.strict: + self.close() + raise BadStatusLine(line) + else: + # assume it's a Simple-Response from an 0.9 server + self.fp = LineAndFileWrapper(line, self.fp) + return "HTTP/0.9", 200, "" + + # The status code is a three-digit number + try: + status = int(status) + if status < 100 or status > 999: + raise BadStatusLine(line) + except ValueError: + raise BadStatusLine(line) + return version, status, reason + + def begin(self): + if self.msg is not None: + # we've already started reading the response + return + + # read until we get a non-100 response + while 1: + version, status, reason = self._read_status() + if status != 100: + break + # skip the header from the 100 response + while 1: + skip = self.fp.readline().strip() + if not skip: + break + if self.debuglevel > 0: + print "header:", skip + + self.status = status + self.reason = reason.strip() + if version == 'HTTP/1.0': + self.version = 10 + elif version.startswith('HTTP/1.'): + self.version = 11 # use HTTP/1.1 code for HTTP/1.x where x>=1 + elif version == 'HTTP/0.9': + self.version = 9 + else: + raise UnknownProtocol(version) + + if self.version == 9: + self.chunked = 0 + self.will_close = 1 + self.msg = HTTPMessage(StringIO()) + return + + self.msg = HTTPMessage(self.fp, 0) + if self.debuglevel > 0: + for hdr in self.msg.headers: + print "header:", hdr, + + # don't let the msg keep an fp + self.msg.fp = None + + # are we using the chunked-style of transfer encoding? + tr_enc = self.msg.getheader('transfer-encoding') + if tr_enc and tr_enc.lower() == "chunked": + self.chunked = 1 + self.chunk_left = None + else: + self.chunked = 0 + + # will the connection close at the end of the response? + conn = self.msg.getheader('connection') + if conn: + conn = conn.lower() + # a "Connection: close" will always close the connection. if we + # don't see that and this is not HTTP/1.1, then the connection will + # close unless we see a Keep-Alive header. + self.will_close = conn.find('close') != -1 or \ + ( self.version != 11 and \ + not self.msg.getheader('keep-alive') ) + else: + # for HTTP/1.1, the connection will always remain open + # otherwise, it will remain open IFF we see a Keep-Alive header + self.will_close = self.version != 11 and \ + not self.msg.getheader('keep-alive') + + # do we have a Content-Length? + # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked" + length = self.msg.getheader('content-length') + if length and not self.chunked: + try: + self.length = int(length) + except ValueError: + self.length = None + else: + self.length = None + + # does the body have a fixed length? (of zero) + if (status == 204 or # No Content + status == 304 or # Not Modified + 100 <= status < 200): # 1xx codes + self.length = 0 + + # if the connection remains open, and we aren't using chunked, and + # a content-length was not provided, then assume that the connection + # WILL close. + if not self.will_close and \ + not self.chunked and \ + self.length is None: + self.will_close = 1 + + def close(self): + if self.fp: + self.fp.close() + self.fp = None + + def isclosed(self): + # NOTE: it is possible that we will not ever call self.close(). This + # case occurs when will_close is TRUE, length is None, and we + # read up to the last byte, but NOT past it. + # + # IMPLIES: if will_close is FALSE, then self.close() will ALWAYS be + # called, meaning self.isclosed() is meaningful. + return self.fp is None + + def read(self, amt=None): + if self.fp is None: + return '' + + if self.chunked: + return self._read_chunked(amt) + + if amt is None: + # unbounded read + if self.will_close: + s = self.fp.read() + else: + s = self._safe_read(self.length) + self.close() # we read everything + return s + + if self.length is not None: + if amt > self.length: + # clip the read to the "end of response" + amt = self.length + self.length -= amt + + # we do not use _safe_read() here because this may be a .will_close + # connection, and the user is reading more bytes than will be provided + # (for example, reading in 1k chunks) + s = self.fp.read(amt) + + return s + + def _read_chunked(self, amt): + assert self.chunked != _UNKNOWN + chunk_left = self.chunk_left + value = '' + + # XXX This accumulates chunks by repeated string concatenation, + # which is not efficient as the number or size of chunks gets big. + while 1: + if chunk_left is None: + line = self.fp.readline() + i = line.find(';') + if i >= 0: + line = line[:i] # strip chunk-extensions + chunk_left = int(line, 16) + if chunk_left == 0: + break + if amt is None: + value += self._safe_read(chunk_left) + elif amt < chunk_left: + value += self._safe_read(amt) + self.chunk_left = chunk_left - amt + return value + elif amt == chunk_left: + value += self._safe_read(amt) + self._safe_read(2) # toss the CRLF at the end of the chunk + self.chunk_left = None + return value + else: + value += self._safe_read(chunk_left) + amt -= chunk_left + + # we read the whole chunk, get another + self._safe_read(2) # toss the CRLF at the end of the chunk + chunk_left = None + + # read and discard trailer up to the CRLF terminator + ### note: we shouldn't have any trailers! + while 1: + line = self.fp.readline() + if line == '\r\n': + break + + # we read everything; close the "file" + # XXX Shouldn't the client close the file? + self.close() + + return value + + def _safe_read(self, amt): + """Read the number of bytes requested, compensating for partial reads. + + Normally, we have a blocking socket, but a read() can be interrupted + by a signal (resulting in a partial read). + + Note that we cannot distinguish between EOF and an interrupt when zero + bytes have been read. IncompleteRead() will be raised in this + situation. + + This function should be used when bytes "should" be present for + reading. If the bytes are truly not available (due to EOF), then the + IncompleteRead exception can be used to detect the problem. + """ + s = '' + while amt > 0: + chunk = self.fp.read(amt) + if not chunk: + raise IncompleteRead(s) + s = s + chunk + amt = amt - len(chunk) + return s + + def getheader(self, name, default=None): + if self.msg is None: + raise ResponseNotReady() + return self.msg.getheader(name, default) + + +class HTTPConnection: + + _http_vsn = 11 + _http_vsn_str = 'HTTP/1.1' + + response_class = HTTPResponse + default_port = HTTP_PORT + auto_open = 1 + debuglevel = 0 + strict = 0 + + def __init__(self, host, port=None, strict=None): + self.sock = None + self._buffer = [] + self.__response = None + self.__state = _CS_IDLE + + self._set_hostport(host, port) + if strict is not None: + self.strict = strict + + def _set_hostport(self, host, port): + if port is None: + i = host.find(':') + if i >= 0: + try: + port = int(host[i+1:]) + except ValueError: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + host = host[:i] + else: + port = self.default_port + self.host = host + self.port = port + + def set_debuglevel(self, level): + self.debuglevel = level + + def connect(self): + """Connect to the host and port specified in __init__.""" + msg = "getaddrinfo returns an empty list" + for res in socket.getaddrinfo(self.host, self.port, 0, + socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + try: + self.sock = socket.socket(af, socktype, proto) + if self.debuglevel > 0: + print "connect: (%s, %s)" % (self.host, self.port) + self.sock.connect(sa) + except socket.error, msg: + if self.debuglevel > 0: + print 'connect fail:', (self.host, self.port) + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket.error, msg + + def close(self): + """Close the connection to the HTTP server.""" + if self.sock: + self.sock.close() # close it manually... there may be other refs + self.sock = None + if self.__response: + self.__response.close() + self.__response = None + self.__state = _CS_IDLE + + def send(self, str): + """Send `str' to the server.""" + if self.sock is None: + if self.auto_open: + self.connect() + else: + raise NotConnected() + + # send the data to the server. if we get a broken pipe, then close + # the socket. we want to reconnect when somebody tries to send again. + # + # NOTE: we DO propagate the error, though, because we cannot simply + # ignore the error... the caller will know if they can retry. + if self.debuglevel > 0: + print "send:", repr(str) + try: + self.sock.sendall(str) + except socket.error, v: + if v[0] == 32: # Broken pipe + self.close() + raise + + def _output(self, s): + """Add a line of output to the current request buffer. + + Assumes that the line does *not* end with \\r\\n. + """ + self._buffer.append(s) + + def _send_output(self): + """Send the currently buffered request and clear the buffer. + + Appends an extra \\r\\n to the buffer. + """ + self._buffer.extend(("", "")) + msg = "\r\n".join(self._buffer) + del self._buffer[:] + self.send(msg) + + def putrequest(self, method, url, skip_host=0): + """Send a request to the server. + + `method' specifies an HTTP request method, e.g. 'GET'. + `url' specifies the object being requested, e.g. '/index.html'. + """ + + # check if a prior response has been completed + # XXX What if it hasn't? + if self.__response and self.__response.isclosed(): + self.__response = None + + # + # in certain cases, we cannot issue another request on this connection. + # this occurs when: + # 1) we are in the process of sending a request. (_CS_REQ_STARTED) + # 2) a response to a previous request has signalled that it is going + # to close the connection upon completion. + # 3) the headers for the previous response have not been read, thus + # we cannot determine whether point (2) is true. (_CS_REQ_SENT) + # + # if there is no prior response, then we can request at will. + # + # if point (2) is true, then we will have passed the socket to the + # response (effectively meaning, "there is no prior response"), and + # will open a new one when a new request is made. + # + # Note: if a prior response exists, then we *can* start a new request. + # We are not allowed to begin fetching the response to this new + # request, however, until that prior response is complete. + # + if self.__state == _CS_IDLE: + self.__state = _CS_REQ_STARTED + else: + raise CannotSendRequest() + + if not url: + url = '/' + str = '%s %s %s' % (method, url, self._http_vsn_str) + + self._output(str) + + if self._http_vsn == 11: + # Issue some standard headers for better HTTP/1.1 compliance + + if not skip_host: + # this header is issued *only* for HTTP/1.1 + # connections. more specifically, this means it is + # only issued when the client uses the new + # HTTPConnection() class. backwards-compat clients + # will be using HTTP/1.0 and those clients may be + # issuing this header themselves. we should NOT issue + # it twice; some web servers (such as Apache) barf + # when they see two Host: headers + + # If we need a non-standard port,include it in the + # header. If the request is going through a proxy, + # but the host of the actual URL, not the host of the + # proxy. + + netloc = '' + if url.startswith('http'): + nil, netloc, nil, nil, nil = urlsplit(url) + + if netloc: + self.putheader('Host', netloc) + elif self.port == HTTP_PORT: + self.putheader('Host', self.host) + else: + self.putheader('Host', "%s:%s" % (self.host, self.port)) + + # note: we are assuming that clients will not attempt to set these + # headers since *this* library must deal with the + # consequences. this also means that when the supporting + # libraries are updated to recognize other forms, then this + # code should be changed (removed or updated). + + # we only want a Content-Encoding of "identity" since we don't + # support encodings such as x-gzip or x-deflate. + self.putheader('Accept-Encoding', 'identity') + + # we can accept "chunked" Transfer-Encodings, but no others + # NOTE: no TE header implies *only* "chunked" + #self.putheader('TE', 'chunked') + + # if TE is supplied in the header, then it must appear in a + # Connection header. + #self.putheader('Connection', 'TE') + + else: + # For HTTP/1.0, the server will assume "not chunked" + pass + + def putheader(self, header, value): + """Send a request header line to the server. + + For example: h.putheader('Accept', 'text/html') + """ + if self.__state != _CS_REQ_STARTED: + raise CannotSendHeader() + + str = '%s: %s' % (header, value) + self._output(str) + + def endheaders(self): + """Indicate that the last header line has been sent to the server.""" + + if self.__state == _CS_REQ_STARTED: + self.__state = _CS_REQ_SENT + else: + raise CannotSendHeader() + + self._send_output() + + def request(self, method, url, body=None, headers={}): + """Send a complete request to the server.""" + + try: + self._send_request(method, url, body, headers) + except socket.error, v: + # trap 'Broken pipe' if we're allowed to automatically reconnect + if v[0] != 32 or not self.auto_open: + raise + # try one more time + self._send_request(method, url, body, headers) + + def _send_request(self, method, url, body, headers): + # If headers already contains a host header, then define the + # optional skip_host argument to putrequest(). The check is + # harder because field names are case insensitive. + if 'Host' in (headers + or [k for k in headers.iterkeys() if k.lower() == "host"]): + self.putrequest(method, url, skip_host=1) + else: + self.putrequest(method, url) + + if body: + self.putheader('Content-Length', str(len(body))) + for hdr, value in headers.items(): + self.putheader(hdr, value) + self.endheaders() + + if body: + self.send(body) + + def getresponse(self): + "Get the response from the server." + + # check if a prior response has been completed + if self.__response and self.__response.isclosed(): + self.__response = None + + # + # if a prior response exists, then it must be completed (otherwise, we + # cannot read this response's header to determine the connection-close + # behavior) + # + # note: if a prior response existed, but was connection-close, then the + # socket and response were made independent of this HTTPConnection + # object since a new request requires that we open a whole new + # connection + # + # this means the prior response had one of two states: + # 1) will_close: this connection was reset and the prior socket and + # response operate independently + # 2) persistent: the response was retained and we await its + # isclosed() status to become true. + # + if self.__state != _CS_REQ_SENT or self.__response: + raise ResponseNotReady() + + if self.debuglevel > 0: + response = self.response_class(self.sock, self.debuglevel, + strict=self.strict) + else: + response = self.response_class(self.sock, strict=self.strict) + + response.begin() + assert response.will_close != _UNKNOWN + self.__state = _CS_IDLE + + if response.will_close: + # this effectively passes the connection to the response + self.close() + else: + # remember this, so we can tell when it is complete + self.__response = response + + return response + +# The next several classes are used to define FakeSocket,a socket-like +# interface to an SSL connection. + +# The primary complexity comes from faking a makefile() method. The +# standard socket makefile() implementation calls dup() on the socket +# file descriptor. As a consequence, clients can call close() on the +# parent socket and its makefile children in any order. The underlying +# socket isn't closed until they are all closed. + +# The implementation uses reference counting to keep the socket open +# until the last client calls close(). SharedSocket keeps track of +# the reference counting and SharedSocketClient provides an constructor +# and close() method that call incref() and decref() correctly. + +class SharedSocket: + + def __init__(self, sock): + self.sock = sock + self._refcnt = 0 + + def incref(self): + self._refcnt += 1 + + def decref(self): + self._refcnt -= 1 + assert self._refcnt >= 0 + if self._refcnt == 0: + self.sock.close() + + def __del__(self): + self.sock.close() + +class SharedSocketClient: + + def __init__(self, shared): + self._closed = 0 + self._shared = shared + self._shared.incref() + self._sock = shared.sock + + def close(self): + if not self._closed: + self._shared.decref() + self._closed = 1 + self._shared = None + +class SSLFile(SharedSocketClient): + """File-like object wrapping an SSL socket.""" + + BUFSIZE = 8192 + + def __init__(self, sock, ssl, bufsize=None): + SharedSocketClient.__init__(self, sock) + self._ssl = ssl + self._buf = '' + self._bufsize = bufsize or self.__class__.BUFSIZE + + def _read(self): + buf = '' + # put in a loop so that we retry on transient errors + while 1: + try: + buf = self._ssl.read(self._bufsize) + except socket.sslerror, err: + if (err[0] == socket.SSL_ERROR_WANT_READ + or err[0] == socket.SSL_ERROR_WANT_WRITE): + continue + if (err[0] == socket.SSL_ERROR_ZERO_RETURN + or err[0] == socket.SSL_ERROR_EOF): + break + raise + except socket.error, err: + if err[0] == errno.EINTR: + continue + if err[0] == errno.EBADF: + # XXX socket was closed? + break + raise + else: + break + return buf + + def read(self, size=None): + L = [self._buf] + avail = len(self._buf) + while size is None or avail < size: + s = self._read() + if s == '': + break + L.append(s) + avail += len(s) + all = "".join(L) + if size is None: + self._buf = '' + return all + else: + self._buf = all[size:] + return all[:size] + + def readline(self): + L = [self._buf] + self._buf = '' + while 1: + i = L[-1].find("\n") + if i >= 0: + break + s = self._read() + if s == '': + break + L.append(s) + if i == -1: + # loop exited because there is no more data + return "".join(L) + else: + all = "".join(L) + # XXX could do enough bookkeeping not to do a 2nd search + i = all.find("\n") + 1 + line = all[:i] + self._buf = all[i:] + return line + +class FakeSocket(SharedSocketClient): + + class _closedsocket: + def __getattr__(self, name): + raise error(9, 'Bad file descriptor') + + def __init__(self, sock, ssl): + sock = SharedSocket(sock) + SharedSocketClient.__init__(self, sock) + self._ssl = ssl + + def close(self): + SharedSocketClient.close(self) + self._sock = self.__class__._closedsocket() + + def makefile(self, mode, bufsize=None): + if mode != 'r' and mode != 'rb': + raise UnimplementedFileMode() + return SSLFile(self._shared, self._ssl, bufsize) + + def send(self, stuff, flags = 0): + return self._ssl.write(stuff) + + sendall = send + + def recv(self, len = 1024, flags = 0): + return self._ssl.read(len) + + def __getattr__(self, attr): + return getattr(self._sock, attr) + + +class HTTPSConnection(HTTPConnection): + "This class allows communication via SSL." + + default_port = HTTPS_PORT + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None): + HTTPConnection.__init__(self, host, port, strict) + self.key_file = key_file + self.cert_file = cert_file + + def connect(self): + "Connect to a host on a given (SSL) port." + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((self.host, self.port)) + realsock = sock + if hasattr(sock, "_sock"): + realsock = sock._sock + ssl = socket.ssl(realsock, self.key_file, self.cert_file) + self.sock = FakeSocket(sock, ssl) + + +class HTTP: + "Compatibility class with httplib.py from 1.5." + + _http_vsn = 10 + _http_vsn_str = 'HTTP/1.0' + + debuglevel = 0 + + _connection_class = HTTPConnection + + def __init__(self, host='', port=None, strict=None): + "Provide a default host, since the superclass requires one." + + # some joker passed 0 explicitly, meaning default port + if port == 0: + port = None + + # Note that we may pass an empty string as the host; this will throw + # an error when we attempt to connect. Presumably, the client code + # will call connect before then, with a proper host. + self._setup(self._connection_class(host, port, strict)) + + def _setup(self, conn): + self._conn = conn + + # set up delegation to flesh out interface + self.send = conn.send + self.putrequest = conn.putrequest + self.endheaders = conn.endheaders + self.set_debuglevel = conn.set_debuglevel + + conn._http_vsn = self._http_vsn + conn._http_vsn_str = self._http_vsn_str + + self.file = None + + def connect(self, host=None, port=None): + "Accept arguments to set the host/port, since the superclass doesn't." + + if host is not None: + self._conn._set_hostport(host, port) + self._conn.connect() + + def getfile(self): + "Provide a getfile, since the superclass' does not use this concept." + return self.file + + def putheader(self, header, *values): + "The superclass allows only one value argument." + self._conn.putheader(header, '\r\n\t'.join(values)) + + def getreply(self): + """Compat definition since superclass does not define it. + + Returns a tuple consisting of: + - server status code (e.g. '200' if all goes well) + - server "reason" corresponding to status code + - any RFC822 headers in the response from the server + """ + try: + response = self._conn.getresponse() + except BadStatusLine, e: + ### hmm. if getresponse() ever closes the socket on a bad request, + ### then we are going to have problems with self.sock + + ### should we keep this behavior? do people use it? + # keep the socket open (as a file), and return it + self.file = self._conn.sock.makefile('rb', 0) + + # close our socket -- we want to restart after any protocol error + self.close() + + self.headers = None + return -1, e.line, None + + self.headers = response.msg + self.file = response.fp + return response.status, response.reason, response.msg + + def close(self): + self._conn.close() + + # note that self.file == response.fp, which gets closed by the + # superclass. just clear the object ref here. + ### hmm. messy. if status==-1, then self.file is owned by us. + ### well... we aren't explicitly closing, but losing this ref will + ### do it + self.file = None + +if hasattr(socket, 'ssl'): + class HTTPS(HTTP): + """Compatibility with 1.5 httplib interface + + Python 1.5.2 did not have an HTTPS class, but it defined an + interface for sending http requests that is also useful for + https. + """ + + _connection_class = HTTPSConnection + + def __init__(self, host='', port=None, key_file=None, cert_file=None, + strict=None): + # provide a default host, pass the X509 cert info + + # urf. compensate for bad input. + if port == 0: + port = None + self._setup(self._connection_class(host, port, key_file, + cert_file, strict)) + + # we never actually use these for anything, but we keep them + # here for compatibility with post-1.5.2 CVS. + self.key_file = key_file + self.cert_file = cert_file + + +class HTTPException(Exception): + # Subclasses that define an __init__ must call Exception.__init__ + # or define self.args. Otherwise, str() will fail. + pass + +class NotConnected(HTTPException): + pass + +class InvalidURL(HTTPException): + pass + +class UnknownProtocol(HTTPException): + def __init__(self, version): + self.args = version, + self.version = version + +class UnknownTransferEncoding(HTTPException): + pass + +class UnimplementedFileMode(HTTPException): + pass + +class IncompleteRead(HTTPException): + def __init__(self, partial): + self.args = partial, + self.partial = partial + +class ImproperConnectionState(HTTPException): + pass + +class CannotSendRequest(ImproperConnectionState): + pass + +class CannotSendHeader(ImproperConnectionState): + pass + +class ResponseNotReady(ImproperConnectionState): + pass + +class BadStatusLine(HTTPException): + def __init__(self, line): + self.args = line, + self.line = line + +# for backwards compatibility +error = HTTPException + +class LineAndFileWrapper: + """A limited file-like object for HTTP/0.9 responses.""" + + # The status-line parsing code calls readline(), which normally + # get the HTTP status line. For a 0.9 response, however, this is + # actually the first line of the body! Clients need to get a + # readable file object that contains that line. + + def __init__(self, line, file): + self._line = line + self._file = file + self._line_consumed = 0 + self._line_offset = 0 + self._line_left = len(line) + + def __getattr__(self, attr): + return getattr(self._file, attr) + + def _done(self): + # called when the last byte is read from the line. After the + # call, all read methods are delegated to the underlying file + # obhect. + self._line_consumed = 1 + self.read = self._file.read + self.readline = self._file.readline + self.readlines = self._file.readlines + + def read(self, amt=None): + assert not self._line_consumed and self._line_left + if amt is None or amt > self._line_left: + s = self._line[self._line_offset:] + self._done() + if amt is None: + return s + self._file.read() + else: + return s + self._file.read(amt - len(s)) + else: + assert amt <= self._line_left + i = self._line_offset + j = i + amt + s = self._line[i:j] + self._line_offset = j + self._line_left -= amt + if self._line_left == 0: + self._done() + return s + + def readline(self): + s = self._line[self._line_offset:] + self._done() + return s + + def readlines(self, size=None): + L = [self._line[self._line_offset:]] + self._done() + if size is None: + return L + self._file.readlines() + else: + return L + self._file.readlines(size) + +def test(): + """Test this module. + + A hodge podge of tests collected here, because they have too many + external dependencies for the regular test suite. + """ + + import sys + import getopt + opts, args = getopt.getopt(sys.argv[1:], 'd') + dl = 0 + for o, a in opts: + if o == '-d': dl = dl + 1 + host = 'www.python.org' + selector = '/' + if args[0:]: host = args[0] + if args[1:]: selector = args[1] + h = HTTP() + h.set_debuglevel(dl) + h.connect(host) + h.putrequest('GET', selector) + h.endheaders() + status, reason, headers = h.getreply() + print 'status =', status + print 'reason =', reason + print "read", len(h.getfile().read()) + print + if headers: + for header in headers.headers: print header.strip() + print + + # minimal test that code to extract host from url works + class HTTP11(HTTP): + _http_vsn = 11 + _http_vsn_str = 'HTTP/1.1' + + h = HTTP11('www.python.org') + h.putrequest('GET', 'http://www.python.org/~jeremy/') + h.endheaders() + h.getreply() + h.close() + + if hasattr(socket, 'ssl'): + + for host, selector in (('sourceforge.net', '/projects/python'), + ): + print "https://%s%s" % (host, selector) + hs = HTTPS() + hs.set_debuglevel(dl) + hs.connect(host) + hs.putrequest('GET', selector) + hs.endheaders() + status, reason, headers = hs.getreply() + print 'status =', status + print 'reason =', reason + print "read", len(hs.getfile().read()) + print + if headers: + for header in headers.headers: print header.strip() + print + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/ihooks.py b/lib-python/2.2/ihooks.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/ihooks.py @@ -0,0 +1,511 @@ +"""Import hook support. + +Consistent use of this module will make it possible to change the +different mechanisms involved in loading modules independently. + +While the built-in module imp exports interfaces to the built-in +module searching and loading algorithm, and it is possible to replace +the built-in function __import__ in order to change the semantics of +the import statement, until now it has been difficult to combine the +effect of different __import__ hacks, like loading modules from URLs +by rimport.py, or restricted execution by rexec.py. + +This module defines three new concepts: + +1) A "file system hooks" class provides an interface to a filesystem. + +One hooks class is defined (Hooks), which uses the interface provided +by standard modules os and os.path. It should be used as the base +class for other hooks classes. + +2) A "module loader" class provides an interface to to search for a +module in a search path and to load it. It defines a method which +searches for a module in a single directory; by overriding this method +one can redefine the details of the search. If the directory is None, +built-in and frozen modules are searched instead. + +Two module loader class are defined, both implementing the search +strategy used by the built-in __import__ function: ModuleLoader uses +the imp module's find_module interface, while HookableModuleLoader +uses a file system hooks class to interact with the file system. Both +use the imp module's load_* interfaces to actually load the module. + +3) A "module importer" class provides an interface to import a +module, as well as interfaces to reload and unload a module. It also +provides interfaces to install and uninstall itself instead of the +default __import__ and reload (and unload) functions. + +One module importer class is defined (ModuleImporter), which uses a +module loader instance passed in (by default HookableModuleLoader is +instantiated). + +The classes defined here should be used as base classes for extended +functionality along those lines. + +If a module importer class supports dotted names, its import_module() +must return a different value depending on whether it is called on +behalf of a "from ... import ..." statement or not. (This is caused +by the way the __import__ hook is used by the Python interpreter.) It +would also do wise to install a different version of reload(). + +""" + + +import __builtin__ +import imp +import os +import sys + +__all__ = ["BasicModuleLoader","Hooks","ModuleLoader","FancyModuleLoader", + "BasicModuleImporter","ModuleImporter","install","uninstall"] + +VERBOSE = 0 + + +from imp import C_EXTENSION, PY_SOURCE, PY_COMPILED +from imp import C_BUILTIN, PY_FROZEN, PKG_DIRECTORY +BUILTIN_MODULE = C_BUILTIN +FROZEN_MODULE = PY_FROZEN + + +class _Verbose: + + def __init__(self, verbose = VERBOSE): + self.verbose = verbose + + def get_verbose(self): + return self.verbose + + def set_verbose(self, verbose): + self.verbose = verbose + + # XXX The following is an experimental interface + + def note(self, *args): + if self.verbose: + apply(self.message, args) + + def message(self, format, *args): + if args: + print format%args + else: + print format + + +class BasicModuleLoader(_Verbose): + + """Basic module loader. + + This provides the same functionality as built-in import. It + doesn't deal with checking sys.modules -- all it provides is + find_module() and a load_module(), as well as find_module_in_dir() + which searches just one directory, and can be overridden by a + derived class to change the module search algorithm when the basic + dependency on sys.path is unchanged. + + The interface is a little more convenient than imp's: + find_module(name, [path]) returns None or 'stuff', and + load_module(name, stuff) loads the module. + + """ + + def find_module(self, name, path = None): + if path is None: + path = [None] + self.default_path() + for dir in path: + stuff = self.find_module_in_dir(name, dir) + if stuff: return stuff + return None + + def default_path(self): + return sys.path + + def find_module_in_dir(self, name, dir): + if dir is None: + return self.find_builtin_module(name) + else: + try: + return imp.find_module(name, [dir]) + except ImportError: + return None + + def find_builtin_module(self, name): + # XXX frozen packages? + if imp.is_builtin(name): + return None, '', ('', '', BUILTIN_MODULE) + if imp.is_frozen(name): + return None, '', ('', '', FROZEN_MODULE) + return None + + def load_module(self, name, stuff): + file, filename, info = stuff + try: + return imp.load_module(name, file, filename, info) + finally: + if file: file.close() + + +class Hooks(_Verbose): + + """Hooks into the filesystem and interpreter. + + By deriving a subclass you can redefine your filesystem interface, + e.g. to merge it with the URL space. + + This base class behaves just like the native filesystem. + + """ + + # imp interface + def get_suffixes(self): return imp.get_suffixes() + def new_module(self, name): return imp.new_module(name) + def is_builtin(self, name): return imp.is_builtin(name) + def init_builtin(self, name): return imp.init_builtin(name) + def is_frozen(self, name): return imp.is_frozen(name) + def init_frozen(self, name): return imp.init_frozen(name) + def get_frozen_object(self, name): return imp.get_frozen_object(name) + def load_source(self, name, filename, file=None): + return imp.load_source(name, filename, file) + def load_compiled(self, name, filename, file=None): + return imp.load_compiled(name, filename, file) + def load_dynamic(self, name, filename, file=None): + return imp.load_dynamic(name, filename, file) + def load_package(self, name, filename, file=None): + return imp.load_module(name, file, filename, ("", "", PKG_DIRECTORY)) + + def add_module(self, name): + d = self.modules_dict() + if d.has_key(name): return d[name] + d[name] = m = self.new_module(name) + return m + + # sys interface + def modules_dict(self): return sys.modules + def default_path(self): return sys.path + + def path_split(self, x): return os.path.split(x) + def path_join(self, x, y): return os.path.join(x, y) + def path_isabs(self, x): return os.path.isabs(x) + # etc. + + def path_exists(self, x): return os.path.exists(x) + def path_isdir(self, x): return os.path.isdir(x) + def path_isfile(self, x): return os.path.isfile(x) + def path_islink(self, x): return os.path.islink(x) + # etc. + + def openfile(self, *x): return apply(open, x) + openfile_error = IOError + def listdir(self, x): return os.listdir(x) + listdir_error = os.error + # etc. + + +class ModuleLoader(BasicModuleLoader): + + """Default module loader; uses file system hooks. + + By defining suitable hooks, you might be able to load modules from + other sources than the file system, e.g. from compressed or + encrypted files, tar files or (if you're brave!) URLs. + + """ + + def __init__(self, hooks = None, verbose = VERBOSE): + BasicModuleLoader.__init__(self, verbose) + self.hooks = hooks or Hooks(verbose) + + def default_path(self): + return self.hooks.default_path() + + def modules_dict(self): + return self.hooks.modules_dict() + + def get_hooks(self): + return self.hooks + + def set_hooks(self, hooks): + self.hooks = hooks + + def find_builtin_module(self, name): + # XXX frozen packages? + if self.hooks.is_builtin(name): + return None, '', ('', '', BUILTIN_MODULE) + if self.hooks.is_frozen(name): + return None, '', ('', '', FROZEN_MODULE) + return None + + def find_module_in_dir(self, name, dir, allow_packages=1): + if dir is None: + return self.find_builtin_module(name) + if allow_packages: + fullname = self.hooks.path_join(dir, name) + if self.hooks.path_isdir(fullname): + stuff = self.find_module_in_dir("__init__", fullname, 0) + if stuff: + file = stuff[0] + if file: file.close() + return None, fullname, ('', '', PKG_DIRECTORY) + for info in self.hooks.get_suffixes(): + suff, mode, type = info + fullname = self.hooks.path_join(dir, name+suff) + try: + fp = self.hooks.openfile(fullname, mode) + return fp, fullname, info + except self.hooks.openfile_error: + pass + return None + + def load_module(self, name, stuff): + file, filename, info = stuff + (suff, mode, type) = info + try: + if type == BUILTIN_MODULE: + return self.hooks.init_builtin(name) + if type == FROZEN_MODULE: + return self.hooks.init_frozen(name) + if type == C_EXTENSION: + m = self.hooks.load_dynamic(name, filename, file) + elif type == PY_SOURCE: + m = self.hooks.load_source(name, filename, file) + elif type == PY_COMPILED: + m = self.hooks.load_compiled(name, filename, file) + elif type == PKG_DIRECTORY: + m = self.hooks.load_package(name, filename, file) + else: + raise ImportError, "Unrecognized module type (%s) for %s" % \ + (`type`, name) + finally: + if file: file.close() + m.__file__ = filename + return m + + +class FancyModuleLoader(ModuleLoader): + + """Fancy module loader -- parses and execs the code itself.""" + + def load_module(self, name, stuff): + file, filename, (suff, mode, type) = stuff + realfilename = filename + path = None + + if type == PKG_DIRECTORY: + initstuff = self.find_module_in_dir("__init__", filename, 0) + if not initstuff: + raise ImportError, "No __init__ module in package %s" % name + initfile, initfilename, initinfo = initstuff + initsuff, initmode, inittype = initinfo + if inittype not in (PY_COMPILED, PY_SOURCE): + if initfile: initfile.close() + raise ImportError, \ + "Bad type (%s) for __init__ module in package %s" % ( + `inittype`, name) + path = [filename] + file = initfile + realfilename = initfilename + type = inittype + + if type == FROZEN_MODULE: + code = self.hooks.get_frozen_object(name) + elif type == PY_COMPILED: + import marshal + file.seek(8) + code = marshal.load(file) + elif type == PY_SOURCE: + data = file.read() + code = compile(data, realfilename, 'exec') + else: + return ModuleLoader.load_module(self, name, stuff) + + m = self.hooks.add_module(name) + if path: + m.__path__ = path + m.__file__ = filename + exec code in m.__dict__ + return m + + +class BasicModuleImporter(_Verbose): + + """Basic module importer; uses module loader. + + This provides basic import facilities but no package imports. + + """ + + def __init__(self, loader = None, verbose = VERBOSE): + _Verbose.__init__(self, verbose) + self.loader = loader or ModuleLoader(None, verbose) + self.modules = self.loader.modules_dict() + + def get_loader(self): + return self.loader + + def set_loader(self, loader): + self.loader = loader + + def get_hooks(self): + return self.loader.get_hooks() + + def set_hooks(self, hooks): + return self.loader.set_hooks(hooks) + + def import_module(self, name, globals={}, locals={}, fromlist=[]): + if self.modules.has_key(name): + return self.modules[name] # Fast path + stuff = self.loader.find_module(name) + if not stuff: + raise ImportError, "No module named %s" % name + return self.loader.load_module(name, stuff) + + def reload(self, module, path = None): + name = module.__name__ + stuff = self.loader.find_module(name, path) + if not stuff: + raise ImportError, "Module %s not found for reload" % name + return self.loader.load_module(name, stuff) + + def unload(self, module): + del self.modules[module.__name__] + # XXX Should this try to clear the module's namespace? + + def install(self): + self.save_import_module = __builtin__.__import__ + self.save_reload = __builtin__.reload + if not hasattr(__builtin__, 'unload'): + __builtin__.unload = None + self.save_unload = __builtin__.unload + __builtin__.__import__ = self.import_module + __builtin__.reload = self.reload + __builtin__.unload = self.unload + + def uninstall(self): + __builtin__.__import__ = self.save_import_module + __builtin__.reload = self.save_reload + __builtin__.unload = self.save_unload + if not __builtin__.unload: + del __builtin__.unload + + +class ModuleImporter(BasicModuleImporter): + + """A module importer that supports packages.""" + + def import_module(self, name, globals=None, locals=None, fromlist=None): + parent = self.determine_parent(globals) + q, tail = self.find_head_package(parent, name) + m = self.load_tail(q, tail) + if not fromlist: + return q + if hasattr(m, "__path__"): + self.ensure_fromlist(m, fromlist) + return m + + def determine_parent(self, globals): + if not globals or not globals.has_key("__name__"): + return None + pname = globals['__name__'] + if globals.has_key("__path__"): + parent = self.modules[pname] + assert globals is parent.__dict__ + return parent + if '.' in pname: + i = pname.rfind('.') + pname = pname[:i] + parent = self.modules[pname] + assert parent.__name__ == pname + return parent + return None + + def find_head_package(self, parent, name): + if '.' in name: + i = name.find('.') + head = name[:i] + tail = name[i+1:] + else: + head = name + tail = "" + if parent: + qname = "%s.%s" % (parent.__name__, head) + else: + qname = head + q = self.import_it(head, qname, parent) + if q: return q, tail + if parent: + qname = head + parent = None + q = self.import_it(head, qname, parent) + if q: return q, tail + raise ImportError, "No module named " + qname + + def load_tail(self, q, tail): + m = q + while tail: + i = tail.find('.') + if i < 0: i = len(tail) + head, tail = tail[:i], tail[i+1:] + mname = "%s.%s" % (m.__name__, head) + m = self.import_it(head, mname, m) + if not m: + raise ImportError, "No module named " + mname + return m + + def ensure_fromlist(self, m, fromlist, recursive=0): + for sub in fromlist: + if sub == "*": + if not recursive: + try: + all = m.__all__ + except AttributeError: + pass + else: + self.ensure_fromlist(m, all, 1) + continue + if sub != "*" and not hasattr(m, sub): + subname = "%s.%s" % (m.__name__, sub) + submod = self.import_it(sub, subname, m) + if not submod: + raise ImportError, "No module named " + subname + + def import_it(self, partname, fqname, parent, force_load=0): + if not partname: + raise ValueError, "Empty module name" + if not force_load: + try: + return self.modules[fqname] + except KeyError: + pass + try: + path = parent and parent.__path__ + except AttributeError: + return None + stuff = self.loader.find_module(partname, path) + if not stuff: + return None + m = self.loader.load_module(fqname, stuff) + if parent: + setattr(parent, partname, m) + return m + + def reload(self, module): + name = module.__name__ + if '.' not in name: + return self.import_it(name, name, None, force_load=1) + i = name.rfind('.') + pname = name[:i] + parent = self.modules[pname] + return self.import_it(name[i+1:], name, parent, force_load=1) + + +default_importer = None +current_importer = None + +def install(importer = None): + global current_importer + current_importer = importer or default_importer or ModuleImporter() + current_importer.install() + +def uninstall(): + global current_importer + current_importer.uninstall() diff --git a/lib-python/2.2/imaplib.py b/lib-python/2.2/imaplib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/imaplib.py @@ -0,0 +1,1208 @@ +"""IMAP4 client. + +Based on RFC 2060. + +Public class: IMAP4 +Public variable: Debug +Public functions: Internaldate2tuple + Int2AP + ParseFlags + Time2Internaldate +""" + +# Author: Piers Lauder December 1997. +# +# Authentication code contributed by Donn Cave June 1998. +# String method conversion by ESR, February 2001. +# GET/SETACL contributed by Anthony Baxter April 2001. + +__version__ = "2.49" + +import binascii, re, socket, time, random, sys + +__all__ = ["IMAP4", "Internaldate2tuple", + "Int2AP", "ParseFlags", "Time2Internaldate"] + +# Globals + +CRLF = '\r\n' +Debug = 0 +IMAP4_PORT = 143 +AllowedVersions = ('IMAP4REV1', 'IMAP4') # Most recent first + +# Commands + +Commands = { + # name valid states + 'APPEND': ('AUTH', 'SELECTED'), + 'AUTHENTICATE': ('NONAUTH',), + 'CAPABILITY': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'), + 'CHECK': ('SELECTED',), + 'CLOSE': ('SELECTED',), + 'COPY': ('SELECTED',), + 'CREATE': ('AUTH', 'SELECTED'), + 'DELETE': ('AUTH', 'SELECTED'), + 'EXAMINE': ('AUTH', 'SELECTED'), + 'EXPUNGE': ('SELECTED',), + 'FETCH': ('SELECTED',), + 'GETACL': ('AUTH', 'SELECTED'), + 'LIST': ('AUTH', 'SELECTED'), + 'LOGIN': ('NONAUTH',), + 'LOGOUT': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'), + 'LSUB': ('AUTH', 'SELECTED'), + 'NAMESPACE': ('AUTH', 'SELECTED'), + 'NOOP': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'), + 'PARTIAL': ('SELECTED',), + 'RENAME': ('AUTH', 'SELECTED'), + 'SEARCH': ('SELECTED',), + 'SELECT': ('AUTH', 'SELECTED'), + 'SETACL': ('AUTH', 'SELECTED'), + 'SORT': ('SELECTED',), + 'STATUS': ('AUTH', 'SELECTED'), + 'STORE': ('SELECTED',), + 'SUBSCRIBE': ('AUTH', 'SELECTED'), + 'UID': ('SELECTED',), + 'UNSUBSCRIBE': ('AUTH', 'SELECTED'), + } + +# Patterns to match server responses + +Continuation = re.compile(r'\+( (?P.*))?') +Flags = re.compile(r'.*FLAGS \((?P[^\)]*)\)') +InternalDate = re.compile(r'.*INTERNALDATE "' + r'(?P[ 123][0-9])-(?P[A-Z][a-z][a-z])-(?P[0-9][0-9][0-9][0-9])' + r' (?P[0-9][0-9]):(?P[0-9][0-9]):(?P[0-9][0-9])' + r' (?P[-+])(?P[0-9][0-9])(?P[0-9][0-9])' + r'"') +Literal = re.compile(r'.*{(?P\d+)}$') +Response_code = re.compile(r'\[(?P[A-Z-]+)( (?P[^\]]*))?\]') +Untagged_response = re.compile(r'\* (?P[A-Z-]+)( (?P.*))?') +Untagged_status = re.compile(r'\* (?P\d+) (?P[A-Z-]+)( (?P.*))?') + + + +class IMAP4: + + """IMAP4 client class. + + Instantiate with: IMAP4([host[, port]]) + + host - host's name (default: localhost); + port - port number (default: standard IMAP4 port). + + All IMAP4rev1 commands are supported by methods of the same + name (in lower-case). + + All arguments to commands are converted to strings, except for + AUTHENTICATE, and the last argument to APPEND which is passed as + an IMAP4 literal. If necessary (the string contains any + non-printing characters or white-space and isn't enclosed with + either parentheses or double quotes) each string is quoted. + However, the 'password' argument to the LOGIN command is always + quoted. If you want to avoid having an argument string quoted + (eg: the 'flags' argument to STORE) then enclose the string in + parentheses (eg: "(\Deleted)"). + + Each command returns a tuple: (type, [data, ...]) where 'type' + is usually 'OK' or 'NO', and 'data' is either the text from the + tagged response, or untagged results from command. + + Errors raise the exception class .error(""). + IMAP4 server errors raise .abort(""), + which is a sub-class of 'error'. Mailbox status changes + from READ-WRITE to READ-ONLY raise the exception class + .readonly(""), which is a sub-class of 'abort'. + + "error" exceptions imply a program error. + "abort" exceptions imply the connection should be reset, and + the command re-tried. + "readonly" exceptions imply the command should be re-tried. + + Note: to use this module, you must read the RFCs pertaining + to the IMAP4 protocol, as the semantics of the arguments to + each IMAP4 command are left to the invoker, not to mention + the results. + """ + + class error(Exception): pass # Logical errors - debug required + class abort(error): pass # Service errors - close and retry + class readonly(abort): pass # Mailbox status changed to READ-ONLY + + mustquote = re.compile(r"[^\w!#$%&'*+,.:;<=>?^`|~-]") + + def __init__(self, host = '', port = IMAP4_PORT): + self.host = host + self.port = port + self.debug = Debug + self.state = 'LOGOUT' + self.literal = None # A literal argument to a command + self.tagged_commands = {} # Tagged commands awaiting response + self.untagged_responses = {} # {typ: [data, ...], ...} + self.continuation_response = '' # Last continuation response + self.is_readonly = None # READ-ONLY desired state + self.tagnum = 0 + + # Open socket to server. + + self.open(host, port) + + # Create unique tag for this session, + # and compile tagged response matcher. + + self.tagpre = Int2AP(random.randint(0, 31999)) + self.tagre = re.compile(r'(?P' + + self.tagpre + + r'\d+) (?P[A-Z]+) (?P.*)') + + # Get server welcome message, + # request and store CAPABILITY response. + + if __debug__: + if self.debug >= 1: + _mesg('imaplib version %s' % __version__) + _mesg('new IMAP4 connection, tag=%s' % self.tagpre) + + self.welcome = self._get_response() + if self.untagged_responses.has_key('PREAUTH'): + self.state = 'AUTH' + elif self.untagged_responses.has_key('OK'): + self.state = 'NONAUTH' + else: + raise self.error(self.welcome) + + cap = 'CAPABILITY' + self._simple_command(cap) + if not self.untagged_responses.has_key(cap): + raise self.error('no CAPABILITY response from server') + self.capabilities = tuple(self.untagged_responses[cap][-1].upper().split()) + + if __debug__: + if self.debug >= 3: + _mesg('CAPABILITIES: %s' % `self.capabilities`) + + for version in AllowedVersions: + if not version in self.capabilities: + continue + self.PROTOCOL_VERSION = version + return + + raise self.error('server not IMAP4 compliant') + + + def __getattr__(self, attr): + # Allow UPPERCASE variants of IMAP4 command methods. + if Commands.has_key(attr): + return getattr(self, attr.lower()) + raise AttributeError("Unknown IMAP4 command: '%s'" % attr) + + + + # Overridable methods + + + def open(self, host, port): + """Setup connection to remote server on "host:port". + This connection will be used by the routines: + read, readline, send, shutdown. + """ + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.host, self.port)) + self.file = self.sock.makefile('rb') + + + def read(self, size): + """Read 'size' bytes from remote.""" + return self.file.read(size) + + + def readline(self): + """Read line from remote.""" + return self.file.readline() + + + def send(self, data): + """Send data to remote.""" + self.sock.sendall(data) + + def shutdown(self): + """Close I/O established in "open".""" + self.file.close() + self.sock.close() + + + def socket(self): + """Return socket instance used to connect to IMAP4 server. + + socket = .socket() + """ + return self.sock + + + + # Utility methods + + + def recent(self): + """Return most recent 'RECENT' responses if any exist, + else prompt server for an update using the 'NOOP' command. + + (typ, [data]) = .recent() + + 'data' is None if no new messages, + else list of RECENT responses, most recent last. + """ + name = 'RECENT' + typ, dat = self._untagged_response('OK', [None], name) + if dat[-1]: + return typ, dat + typ, dat = self.noop() # Prod server for response + return self._untagged_response(typ, dat, name) + + + def response(self, code): + """Return data for response 'code' if received, or None. + + Old value for response 'code' is cleared. + + (code, [data]) = .response(code) + """ + return self._untagged_response(code, [None], code.upper()) + + + + # IMAP4 commands + + + def append(self, mailbox, flags, date_time, message): + """Append message to named mailbox. + + (typ, [data]) = .append(mailbox, flags, date_time, message) + + All args except `message' can be None. + """ + name = 'APPEND' + if not mailbox: + mailbox = 'INBOX' + if flags: + if (flags[0],flags[-1]) != ('(',')'): + flags = '(%s)' % flags + else: + flags = None + if date_time: + date_time = Time2Internaldate(date_time) + else: + date_time = None + self.literal = message + return self._simple_command(name, mailbox, flags, date_time) + + + def authenticate(self, mechanism, authobject): + """Authenticate command - requires response processing. + + 'mechanism' specifies which authentication mechanism is to + be used - it must appear in .capabilities in the + form AUTH=. + + 'authobject' must be a callable object: + + data = authobject(response) + + It will be called to process server continuation responses. + It should return data that will be encoded and sent to server. + It should return None if the client abort response '*' should + be sent instead. + """ + mech = mechanism.upper() + cap = 'AUTH=%s' % mech + if not cap in self.capabilities: + raise self.error("Server doesn't allow %s authentication." % mech) + self.literal = _Authenticator(authobject).process + typ, dat = self._simple_command('AUTHENTICATE', mech) + if typ != 'OK': + raise self.error(dat[-1]) + self.state = 'AUTH' + return typ, dat + + + def check(self): + """Checkpoint mailbox on server. + + (typ, [data]) = .check() + """ + return self._simple_command('CHECK') + + + def close(self): + """Close currently selected mailbox. + + Deleted messages are removed from writable mailbox. + This is the recommended command before 'LOGOUT'. + + (typ, [data]) = .close() + """ + try: + typ, dat = self._simple_command('CLOSE') + finally: + self.state = 'AUTH' + return typ, dat + + + def copy(self, message_set, new_mailbox): + """Copy 'message_set' messages onto end of 'new_mailbox'. + + (typ, [data]) = .copy(message_set, new_mailbox) + """ + return self._simple_command('COPY', message_set, new_mailbox) + + + def create(self, mailbox): + """Create new mailbox. + + (typ, [data]) = .create(mailbox) + """ + return self._simple_command('CREATE', mailbox) + + + def delete(self, mailbox): + """Delete old mailbox. + + (typ, [data]) = .delete(mailbox) + """ + return self._simple_command('DELETE', mailbox) + + + def expunge(self): + """Permanently remove deleted items from selected mailbox. + + Generates 'EXPUNGE' response for each deleted message. + + (typ, [data]) = .expunge() + + 'data' is list of 'EXPUNGE'd message numbers in order received. + """ + name = 'EXPUNGE' + typ, dat = self._simple_command(name) + return self._untagged_response(typ, dat, name) + + + def fetch(self, message_set, message_parts): + """Fetch (parts of) messages. + + (typ, [data, ...]) = .fetch(message_set, message_parts) + + 'message_parts' should be a string of selected parts + enclosed in parentheses, eg: "(UID BODY[TEXT])". + + 'data' are tuples of message part envelope and data. + """ + name = 'FETCH' + typ, dat = self._simple_command(name, message_set, message_parts) + return self._untagged_response(typ, dat, name) + + + def getacl(self, mailbox): + """Get the ACLs for a mailbox. + + (typ, [data]) = .getacl(mailbox) + """ + typ, dat = self._simple_command('GETACL', mailbox) + return self._untagged_response(typ, dat, 'ACL') + + + def list(self, directory='""', pattern='*'): + """List mailbox names in directory matching pattern. + + (typ, [data]) = .list(directory='""', pattern='*') + + 'data' is list of LIST responses. + """ + name = 'LIST' + typ, dat = self._simple_command(name, directory, pattern) + return self._untagged_response(typ, dat, name) + + + def login(self, user, password): + """Identify client using plaintext password. + + (typ, [data]) = .login(user, password) + + NB: 'password' will be quoted. + """ + #if not 'AUTH=LOGIN' in self.capabilities: + # raise self.error("Server doesn't allow LOGIN authentication." % mech) + typ, dat = self._simple_command('LOGIN', user, self._quote(password)) + if typ != 'OK': + raise self.error(dat[-1]) + self.state = 'AUTH' + return typ, dat + + + def logout(self): + """Shutdown connection to server. + + (typ, [data]) = .logout() + + Returns server 'BYE' response. + """ + self.state = 'LOGOUT' + try: typ, dat = self._simple_command('LOGOUT') + except: typ, dat = 'NO', ['%s: %s' % sys.exc_info()[:2]] + self.shutdown() + if self.untagged_responses.has_key('BYE'): + return 'BYE', self.untagged_responses['BYE'] + return typ, dat + + + def lsub(self, directory='""', pattern='*'): + """List 'subscribed' mailbox names in directory matching pattern. + + (typ, [data, ...]) = .lsub(directory='""', pattern='*') + + 'data' are tuples of message part envelope and data. + """ + name = 'LSUB' + typ, dat = self._simple_command(name, directory, pattern) + return self._untagged_response(typ, dat, name) + + + def namespace(self): + """ Returns IMAP namespaces ala rfc2342 + + (typ, [data, ...]) = .namespace() + """ + name = 'NAMESPACE' + typ, dat = self._simple_command(name) + return self._untagged_response(typ, dat, name) + + + def noop(self): + """Send NOOP command. + + (typ, data) = .noop() + """ + if __debug__: + if self.debug >= 3: + _dump_ur(self.untagged_responses) + return self._simple_command('NOOP') + + + def partial(self, message_num, message_part, start, length): + """Fetch truncated part of a message. + + (typ, [data, ...]) = .partial(message_num, message_part, start, length) + + 'data' is tuple of message part envelope and data. + """ + name = 'PARTIAL' + typ, dat = self._simple_command(name, message_num, message_part, start, length) + return self._untagged_response(typ, dat, 'FETCH') + + + def rename(self, oldmailbox, newmailbox): + """Rename old mailbox name to new. + + (typ, data) = .rename(oldmailbox, newmailbox) + """ + return self._simple_command('RENAME', oldmailbox, newmailbox) + + + def search(self, charset, *criteria): + """Search mailbox for matching messages. + + (typ, [data]) = .search(charset, criterium, ...) + + 'data' is space separated list of matching message numbers. + """ + name = 'SEARCH' + if charset: + typ, dat = apply(self._simple_command, (name, 'CHARSET', charset) + criteria) + else: + typ, dat = apply(self._simple_command, (name,) + criteria) + return self._untagged_response(typ, dat, name) + + + def select(self, mailbox='INBOX', readonly=None): + """Select a mailbox. + + Flush all untagged responses. + + (typ, [data]) = .select(mailbox='INBOX', readonly=None) + + 'data' is count of messages in mailbox ('EXISTS' response). + """ + # Mandated responses are ('FLAGS', 'EXISTS', 'RECENT', 'UIDVALIDITY') + self.untagged_responses = {} # Flush old responses. + self.is_readonly = readonly + if readonly: + name = 'EXAMINE' + else: + name = 'SELECT' + typ, dat = self._simple_command(name, mailbox) + if typ != 'OK': + self.state = 'AUTH' # Might have been 'SELECTED' + return typ, dat + self.state = 'SELECTED' + if self.untagged_responses.has_key('READ-ONLY') \ + and not readonly: + if __debug__: + if self.debug >= 1: + _dump_ur(self.untagged_responses) + raise self.readonly('%s is not writable' % mailbox) + return typ, self.untagged_responses.get('EXISTS', [None]) + + + def setacl(self, mailbox, who, what): + """Set a mailbox acl. + + (typ, [data]) = .create(mailbox, who, what) + """ + return self._simple_command('SETACL', mailbox, who, what) + + + def sort(self, sort_criteria, charset, *search_criteria): + """IMAP4rev1 extension SORT command. + + (typ, [data]) = .sort(sort_criteria, charset, search_criteria, ...) + """ + name = 'SORT' + #if not name in self.capabilities: # Let the server decide! + # raise self.error('unimplemented extension command: %s' % name) + if (sort_criteria[0],sort_criteria[-1]) != ('(',')'): + sort_criteria = '(%s)' % sort_criteria + typ, dat = apply(self._simple_command, (name, sort_criteria, charset) + search_criteria) + return self._untagged_response(typ, dat, name) + + + def status(self, mailbox, names): + """Request named status conditions for mailbox. + + (typ, [data]) = .status(mailbox, names) + """ + name = 'STATUS' + #if self.PROTOCOL_VERSION == 'IMAP4': # Let the server decide! + # raise self.error('%s unimplemented in IMAP4 (obtain IMAP4rev1 server, or re-code)' % name) + typ, dat = self._simple_command(name, mailbox, names) + return self._untagged_response(typ, dat, name) + + + def store(self, message_set, command, flags): + """Alters flag dispositions for messages in mailbox. + + (typ, [data]) = .store(message_set, command, flags) + """ + if (flags[0],flags[-1]) != ('(',')'): + flags = '(%s)' % flags # Avoid quoting the flags + typ, dat = self._simple_command('STORE', message_set, command, flags) + return self._untagged_response(typ, dat, 'FETCH') + + + def subscribe(self, mailbox): + """Subscribe to new mailbox. + + (typ, [data]) = .subscribe(mailbox) + """ + return self._simple_command('SUBSCRIBE', mailbox) + + + def uid(self, command, *args): + """Execute "command arg ..." with messages identified by UID, + rather than message number. + + (typ, [data]) = .uid(command, arg1, arg2, ...) + + Returns response appropriate to 'command'. + """ + command = command.upper() + if not Commands.has_key(command): + raise self.error("Unknown IMAP4 UID command: %s" % command) + if self.state not in Commands[command]: + raise self.error('command %s illegal in state %s' + % (command, self.state)) + name = 'UID' + typ, dat = apply(self._simple_command, (name, command) + args) + if command in ('SEARCH', 'SORT'): + name = command + else: + name = 'FETCH' + return self._untagged_response(typ, dat, name) + + + def unsubscribe(self, mailbox): + """Unsubscribe from old mailbox. + + (typ, [data]) = .unsubscribe(mailbox) + """ + return self._simple_command('UNSUBSCRIBE', mailbox) + + + def xatom(self, name, *args): + """Allow simple extension commands + notified by server in CAPABILITY response. + + Assumes command is legal in current state. + + (typ, [data]) = .xatom(name, arg, ...) + + Returns response appropriate to extension command `name'. + """ + name = name.upper() + #if not name in self.capabilities: # Let the server decide! + # raise self.error('unknown extension command: %s' % name) + if not Commands.has_key(name): + Commands[name] = (self.state,) + return apply(self._simple_command, (name,) + args) + + + + # Private methods + + + def _append_untagged(self, typ, dat): + + if dat is None: dat = '' + ur = self.untagged_responses + if __debug__: + if self.debug >= 5: + _mesg('untagged_responses[%s] %s += ["%s"]' % + (typ, len(ur.get(typ,'')), dat)) + if ur.has_key(typ): + ur[typ].append(dat) + else: + ur[typ] = [dat] + + + def _check_bye(self): + bye = self.untagged_responses.get('BYE') + if bye: + raise self.abort(bye[-1]) + + + def _command(self, name, *args): + + if self.state not in Commands[name]: + self.literal = None + raise self.error( + 'command %s illegal in state %s' % (name, self.state)) + + for typ in ('OK', 'NO', 'BAD'): + if self.untagged_responses.has_key(typ): + del self.untagged_responses[typ] + + if self.untagged_responses.has_key('READ-ONLY') \ + and not self.is_readonly: + raise self.readonly('mailbox status changed to READ-ONLY') + + tag = self._new_tag() + data = '%s %s' % (tag, name) + for arg in args: + if arg is None: continue + data = '%s %s' % (data, self._checkquote(arg)) + + literal = self.literal + if literal is not None: + self.literal = None + if type(literal) is type(self._command): + literator = literal + else: + literator = None + data = '%s {%s}' % (data, len(literal)) + + if __debug__: + if self.debug >= 4: + _mesg('> %s' % data) + else: + _log('> %s' % data) + + try: + self.send('%s%s' % (data, CRLF)) + except (socket.error, OSError), val: + raise self.abort('socket error: %s' % val) + + if literal is None: + return tag + + while 1: + # Wait for continuation response + + while self._get_response(): + if self.tagged_commands[tag]: # BAD/NO? + return tag + + # Send literal + + if literator: + literal = literator(self.continuation_response) + + if __debug__: + if self.debug >= 4: + _mesg('write literal size %s' % len(literal)) + + try: + self.send(literal) + self.send(CRLF) + except (socket.error, OSError), val: + raise self.abort('socket error: %s' % val) + + if not literator: + break + + return tag + + + def _command_complete(self, name, tag): + self._check_bye() + try: + typ, data = self._get_tagged_response(tag) + except self.abort, val: + raise self.abort('command: %s => %s' % (name, val)) + except self.error, val: + raise self.error('command: %s => %s' % (name, val)) + self._check_bye() + if typ == 'BAD': + raise self.error('%s command error: %s %s' % (name, typ, data)) + return typ, data + + + def _get_response(self): + + # Read response and store. + # + # Returns None for continuation responses, + # otherwise first response line received. + + resp = self._get_line() + + # Command completion response? + + if self._match(self.tagre, resp): + tag = self.mo.group('tag') + if not self.tagged_commands.has_key(tag): + raise self.abort('unexpected tagged response: %s' % resp) + + typ = self.mo.group('type') + dat = self.mo.group('data') + self.tagged_commands[tag] = (typ, [dat]) + else: + dat2 = None + + # '*' (untagged) responses? + + if not self._match(Untagged_response, resp): + if self._match(Untagged_status, resp): + dat2 = self.mo.group('data2') + + if self.mo is None: + # Only other possibility is '+' (continuation) response... + + if self._match(Continuation, resp): + self.continuation_response = self.mo.group('data') + return None # NB: indicates continuation + + raise self.abort("unexpected response: '%s'" % resp) + + typ = self.mo.group('type') + dat = self.mo.group('data') + if dat is None: dat = '' # Null untagged response + if dat2: dat = dat + ' ' + dat2 + + # Is there a literal to come? + + while self._match(Literal, dat): + + # Read literal direct from connection. + + size = int(self.mo.group('size')) + if __debug__: + if self.debug >= 4: + _mesg('read literal size %s' % size) + data = self.read(size) + + # Store response with literal as tuple + + self._append_untagged(typ, (dat, data)) + + # Read trailer - possibly containing another literal + + dat = self._get_line() + + self._append_untagged(typ, dat) + + # Bracketed response information? + + if typ in ('OK', 'NO', 'BAD') and self._match(Response_code, dat): + self._append_untagged(self.mo.group('type'), self.mo.group('data')) + + if __debug__: + if self.debug >= 1 and typ in ('NO', 'BAD', 'BYE'): + _mesg('%s response: %s' % (typ, dat)) + + return resp + + + def _get_tagged_response(self, tag): + + while 1: + result = self.tagged_commands[tag] + if result is not None: + del self.tagged_commands[tag] + return result + + # Some have reported "unexpected response" exceptions. + # Note that ignoring them here causes loops. + # Instead, send me details of the unexpected response and + # I'll update the code in `_get_response()'. + + try: + self._get_response() + except self.abort, val: + if __debug__: + if self.debug >= 1: + print_log() + raise + + + def _get_line(self): + + line = self.readline() + if not line: + raise self.abort('socket error: EOF') + + # Protocol mandates all lines terminated by CRLF + + line = line[:-2] + if __debug__: + if self.debug >= 4: + _mesg('< %s' % line) + else: + _log('< %s' % line) + return line + + + def _match(self, cre, s): + + # Run compiled regular expression match method on 's'. + # Save result, return success. + + self.mo = cre.match(s) + if __debug__: + if self.mo is not None and self.debug >= 5: + _mesg("\tmatched r'%s' => %s" % (cre.pattern, `self.mo.groups()`)) + return self.mo is not None + + + def _new_tag(self): + + tag = '%s%s' % (self.tagpre, self.tagnum) + self.tagnum = self.tagnum + 1 + self.tagged_commands[tag] = None + return tag + + + def _checkquote(self, arg): + + # Must quote command args if non-alphanumeric chars present, + # and not already quoted. + + if type(arg) is not type(''): + return arg + if (arg[0],arg[-1]) in (('(',')'),('"','"')): + return arg + if self.mustquote.search(arg) is None: + return arg + return self._quote(arg) + + + def _quote(self, arg): + + arg = arg.replace('\\', '\\\\') + arg = arg.replace('"', '\\"') + + return '"%s"' % arg + + + def _simple_command(self, name, *args): + + return self._command_complete(name, apply(self._command, (name,) + args)) + + + def _untagged_response(self, typ, dat, name): + + if typ == 'NO': + return typ, dat + if not self.untagged_responses.has_key(name): + return typ, [None] + data = self.untagged_responses[name] + if __debug__: + if self.debug >= 5: + _mesg('untagged_responses[%s] => %s' % (name, data)) + del self.untagged_responses[name] + return typ, data + + + +class _Authenticator: + + """Private class to provide en/decoding + for base64-based authentication conversation. + """ + + def __init__(self, mechinst): + self.mech = mechinst # Callable object to provide/process data + + def process(self, data): + ret = self.mech(self.decode(data)) + if ret is None: + return '*' # Abort conversation + return self.encode(ret) + + def encode(self, inp): + # + # Invoke binascii.b2a_base64 iteratively with + # short even length buffers, strip the trailing + # line feed from the result and append. "Even" + # means a number that factors to both 6 and 8, + # so when it gets to the end of the 8-bit input + # there's no partial 6-bit output. + # + oup = '' + while inp: + if len(inp) > 48: + t = inp[:48] + inp = inp[48:] + else: + t = inp + inp = '' + e = binascii.b2a_base64(t) + if e: + oup = oup + e[:-1] + return oup + + def decode(self, inp): + if not inp: + return '' + return binascii.a2b_base64(inp) + + + +Mon2num = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, + 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12} + +def Internaldate2tuple(resp): + """Convert IMAP4 INTERNALDATE to UT. + + Returns Python time module tuple. + """ + + mo = InternalDate.match(resp) + if not mo: + return None + + mon = Mon2num[mo.group('mon')] + zonen = mo.group('zonen') + + day = int(mo.group('day')) + year = int(mo.group('year')) + hour = int(mo.group('hour')) + min = int(mo.group('min')) + sec = int(mo.group('sec')) + zoneh = int(mo.group('zoneh')) + zonem = int(mo.group('zonem')) + + # INTERNALDATE timezone must be subtracted to get UT + + zone = (zoneh*60 + zonem)*60 + if zonen == '-': + zone = -zone + + tt = (year, mon, day, hour, min, sec, -1, -1, -1) + + utc = time.mktime(tt) + + # Following is necessary because the time module has no 'mkgmtime'. + # 'mktime' assumes arg in local timezone, so adds timezone/altzone. + + lt = time.localtime(utc) + if time.daylight and lt[-1]: + zone = zone + time.altzone + else: + zone = zone + time.timezone + + return time.localtime(utc - zone) + + + +def Int2AP(num): + + """Convert integer to A-P string representation.""" + + val = ''; AP = 'ABCDEFGHIJKLMNOP' + num = int(abs(num)) + while num: + num, mod = divmod(num, 16) + val = AP[mod] + val + return val + + + +def ParseFlags(resp): + + """Convert IMAP4 flags response to python tuple.""" + + mo = Flags.match(resp) + if not mo: + return () + + return tuple(mo.group('flags').split()) + + +def Time2Internaldate(date_time): + + """Convert 'date_time' to IMAP4 INTERNALDATE representation. + + Return string in form: '"DD-Mmm-YYYY HH:MM:SS +HHMM"' + """ + + if isinstance(date_time, (int, float)): + tt = time.localtime(date_time) + elif isinstance(date_time, (tuple, time.struct_time)): + tt = date_time + elif isinstance(date_time, str): + return date_time # Assume in correct format + else: + raise ValueError("date_time not of a known type") + + dt = time.strftime("%d-%b-%Y %H:%M:%S", tt) + if dt[0] == '0': + dt = ' ' + dt[1:] + if time.daylight and tt[-1]: + zone = -time.altzone + else: + zone = -time.timezone + return '"' + dt + " %+03d%02d" % divmod(zone/60, 60) + '"' + + + +if __debug__: + + def _mesg(s, secs=None): + if secs is None: + secs = time.time() + tm = time.strftime('%M:%S', time.localtime(secs)) + sys.stderr.write(' %s.%02d %s\n' % (tm, (secs*100)%100, s)) + sys.stderr.flush() + + def _dump_ur(dict): + # Dump untagged responses (in `dict'). + l = dict.items() + if not l: return + t = '\n\t\t' + l = map(lambda x:'%s: "%s"' % (x[0], x[1][0] and '" "'.join(x[1]) or ''), l) + _mesg('untagged responses dump:%s%s' % (t, t.join(l))) + + _cmd_log = [] # Last `_cmd_log_len' interactions + _cmd_log_len = 10 + + def _log(line): + # Keep log of last `_cmd_log_len' interactions for debugging. + if len(_cmd_log) == _cmd_log_len: + del _cmd_log[0] + _cmd_log.append((time.time(), line)) + + def print_log(): + _mesg('last %d IMAP4 interactions:' % len(_cmd_log)) + for secs,line in _cmd_log: + _mesg(line, secs) + + + +if __name__ == '__main__': + + import getopt, getpass + + try: + optlist, args = getopt.getopt(sys.argv[1:], 'd:') + except getopt.error, val: + pass + + for opt,val in optlist: + if opt == '-d': + Debug = int(val) + + if not args: args = ('',) + + host = args[0] + + USER = getpass.getuser() + PASSWD = getpass.getpass("IMAP password for %s on %s: " % (USER, host or "localhost")) + + test_mesg = 'From: %(user)s at localhost%(lf)sSubject: IMAP4 test%(lf)s%(lf)sdata...%(lf)s' % {'user':USER, 'lf':CRLF} + test_seq1 = ( + ('login', (USER, PASSWD)), + ('create', ('/tmp/xxx 1',)), + ('rename', ('/tmp/xxx 1', '/tmp/yyy')), + ('CREATE', ('/tmp/yyz 2',)), + ('append', ('/tmp/yyz 2', None, None, test_mesg)), + ('list', ('/tmp', 'yy*')), + ('select', ('/tmp/yyz 2',)), + ('search', (None, 'SUBJECT', 'test')), + ('partial', ('1', 'RFC822', 1, 1024)), + ('store', ('1', 'FLAGS', '(\Deleted)')), + ('namespace', ()), + ('expunge', ()), + ('recent', ()), + ('close', ()), + ) + + test_seq2 = ( + ('select', ()), + ('response',('UIDVALIDITY',)), + ('uid', ('SEARCH', 'ALL')), + ('response', ('EXISTS',)), + ('append', (None, None, None, test_mesg)), + ('recent', ()), + ('logout', ()), + ) + + def run(cmd, args): + _mesg('%s %s' % (cmd, args)) + typ, dat = apply(getattr(M, cmd), args) + _mesg('%s => %s %s' % (cmd, typ, dat)) + return dat + + try: + M = IMAP4(host) + _mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION) + _mesg('CAPABILITIES = %s' % `M.capabilities`) + + for cmd,args in test_seq1: + run(cmd, args) + + for ml in run('list', ('/tmp/', 'yy%')): + mo = re.match(r'.*"([^"]+)"$', ml) + if mo: path = mo.group(1) + else: path = ml.split()[-1] + run('delete', (path,)) + + for cmd,args in test_seq2: + dat = run(cmd, args) + + if (cmd,args) != ('uid', ('SEARCH', 'ALL')): + continue + + uid = dat[-1].split() + if not uid: continue + run('uid', ('FETCH', '%s' % uid[-1], + '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)')) + + print '\nAll tests OK.' + + except: + print '\nTests failed.' + + if not Debug: + print ''' +If you would like to see debugging output, +try: %s -d5 +''' % sys.argv[0] + + raise diff --git a/lib-python/2.2/imghdr.py b/lib-python/2.2/imghdr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/imghdr.py @@ -0,0 +1,154 @@ +"""Recognize image file formats based on their first few bytes.""" + +__all__ = ["what"] + +#-------------------------# +# Recognize image headers # +#-------------------------# + +def what(file, h=None): + if h is None: + if type(file) == type(''): + f = open(file, 'rb') + h = f.read(32) + else: + location = file.tell() + h = file.read(32) + file.seek(location) + f = None + else: + f = None + try: + for tf in tests: + res = tf(h, f) + if res: + return res + finally: + if f: f.close() + return None + + +#---------------------------------# +# Subroutines per image file type # +#---------------------------------# + +tests = [] + +def test_rgb(h, f): + """SGI image library""" + if h[:2] == '\001\332': + return 'rgb' + +tests.append(test_rgb) + +def test_gif(h, f): + """GIF ('87 and '89 variants)""" + if h[:6] in ('GIF87a', 'GIF89a'): + return 'gif' + +tests.append(test_gif) + +def test_pbm(h, f): + """PBM (portable bitmap)""" + if len(h) >= 3 and \ + h[0] == 'P' and h[1] in '14' and h[2] in ' \t\n\r': + return 'pbm' + +tests.append(test_pbm) + +def test_pgm(h, f): + """PGM (portable graymap)""" + if len(h) >= 3 and \ + h[0] == 'P' and h[1] in '25' and h[2] in ' \t\n\r': + return 'pgm' + +tests.append(test_pgm) + +def test_ppm(h, f): + """PPM (portable pixmap)""" + if len(h) >= 3 and \ + h[0] == 'P' and h[1] in '36' and h[2] in ' \t\n\r': + return 'ppm' + +tests.append(test_ppm) + +def test_tiff(h, f): + """TIFF (can be in Motorola or Intel byte order)""" + if h[:2] in ('MM', 'II'): + return 'tiff' + +tests.append(test_tiff) + +def test_rast(h, f): + """Sun raster file""" + if h[:4] == '\x59\xA6\x6A\x95': + return 'rast' + +tests.append(test_rast) + +def test_xbm(h, f): + """X bitmap (X10 or X11)""" + s = '#define ' + if h[:len(s)] == s: + return 'xbm' + +tests.append(test_xbm) + +def test_jpeg(h, f): + """JPEG data in JFIF format""" + if h[6:10] == 'JFIF': + return 'jpeg' + +tests.append(test_jpeg) + +def test_bmp(h, f): + if h[:2] == 'BM': + return 'bmp' + +tests.append(test_bmp) + +def test_png(h, f): + if h[:8] == "\211PNG\r\n\032\n": + return 'png' + +tests.append(test_png) + +#--------------------# +# Small test program # +#--------------------# + +def test(): + import sys + recursive = 0 + if sys.argv[1:] and sys.argv[1] == '-r': + del sys.argv[1:2] + recursive = 1 + try: + if sys.argv[1:]: + testall(sys.argv[1:], recursive, 1) + else: + testall(['.'], recursive, 1) + except KeyboardInterrupt: + sys.stderr.write('\n[Interrupted]\n') + sys.exit(1) + +def testall(list, recursive, toplevel): + import sys + import os + for filename in list: + if os.path.isdir(filename): + print filename + '/:', + if recursive or toplevel: + print 'recursing down:' + import glob + names = glob.glob(os.path.join(filename, '*')) + testall(names, recursive, 0) + else: + print '*** directory (use -r) ***' + else: + print filename + ':', + sys.stdout.flush() + try: + print what(filename) + except IOError: + print '*** not found ***' diff --git a/lib-python/2.2/imputil.py b/lib-python/2.2/imputil.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/imputil.py @@ -0,0 +1,720 @@ +""" +Import utilities + +Exported classes: + ImportManager Manage the import process + + Importer Base class for replacing standard import functions + BuiltinImporter Emulate the import mechanism for builtin and frozen modules + + DynLoadSuffixImporter +""" + +# note: avoid importing non-builtin modules +import imp ### not available in JPython? +import sys +import __builtin__ + +# for the DirectoryImporter +import struct +import marshal + +__all__ = ["ImportManager","Importer","BuiltinImporter"] + +_StringType = type('') +_ModuleType = type(sys) ### doesn't work in JPython... + +class ImportManager: + "Manage the import process." + + def install(self, namespace=vars(__builtin__)): + "Install this ImportManager into the specified namespace." + + if isinstance(namespace, _ModuleType): + namespace = vars(namespace) + + # Note: we have no notion of "chaining" + + # Record the previous import hook, then install our own. + self.previous_importer = namespace['__import__'] + self.namespace = namespace + namespace['__import__'] = self._import_hook + + ### fix this + #namespace['reload'] = self._reload_hook + + def uninstall(self): + "Restore the previous import mechanism." + self.namespace['__import__'] = self.previous_importer + + def add_suffix(self, suffix, importFunc): + assert callable(importFunc) + self.fs_imp.add_suffix(suffix, importFunc) + + ###################################################################### + # + # PRIVATE METHODS + # + + clsFilesystemImporter = None + + def __init__(self, fs_imp=None): + # we're definitely going to be importing something in the future, + # so let's just load the OS-related facilities. + if not _os_stat: + _os_bootstrap() + + # This is the Importer that we use for grabbing stuff from the + # filesystem. It defines one more method (import_from_dir) for our use. + if not fs_imp: + cls = self.clsFilesystemImporter or _FilesystemImporter + fs_imp = cls() + self.fs_imp = fs_imp + + # Initialize the set of suffixes that we recognize and import. + # The default will import dynamic-load modules first, followed by + # .py files (or a .py file's cached bytecode) + for desc in imp.get_suffixes(): + if desc[2] == imp.C_EXTENSION: + self.add_suffix(desc[0], + DynLoadSuffixImporter(desc).import_file) + self.add_suffix('.py', py_suffix_importer) + + def _import_hook(self, fqname, globals=None, locals=None, fromlist=None): + """Python calls this hook to locate and import a module.""" + + parts = fqname.split('.') + + # determine the context of this import + parent = self._determine_import_context(globals) + + # if there is a parent, then its importer should manage this import + if parent: + module = parent.__importer__._do_import(parent, parts, fromlist) + if module: + return module + + # has the top module already been imported? + try: + top_module = sys.modules[parts[0]] + except KeyError: + + # look for the topmost module + top_module = self._import_top_module(parts[0]) + if not top_module: + # the topmost module wasn't found at all. + raise ImportError, 'No module named ' + fqname + + # fast-path simple imports + if len(parts) == 1: + if not fromlist: + return top_module + + if not top_module.__dict__.get('__ispkg__'): + # __ispkg__ isn't defined (the module was not imported by us), + # or it is zero. + # + # In the former case, there is no way that we could import + # sub-modules that occur in the fromlist (but we can't raise an + # error because it may just be names) because we don't know how + # to deal with packages that were imported by other systems. + # + # In the latter case (__ispkg__ == 0), there can't be any sub- + # modules present, so we can just return. + # + # In both cases, since len(parts) == 1, the top_module is also + # the "bottom" which is the defined return when a fromlist + # exists. + return top_module + + importer = top_module.__dict__.get('__importer__') + if importer: + return importer._finish_import(top_module, parts[1:], fromlist) + + # Grrr, some people "import os.path" + if len(parts) == 2 and hasattr(top_module, parts[1]): + return top_module + + # If the importer does not exist, then we have to bail. A missing + # importer means that something else imported the module, and we have + # no knowledge of how to get sub-modules out of the thing. + raise ImportError, 'No module named ' + fqname + + def _determine_import_context(self, globals): + """Returns the context in which a module should be imported. + + The context could be a loaded (package) module and the imported module + will be looked for within that package. The context could also be None, + meaning there is no context -- the module should be looked for as a + "top-level" module. + """ + + if not globals or not globals.get('__importer__'): + # globals does not refer to one of our modules or packages. That + # implies there is no relative import context (as far as we are + # concerned), and it should just pick it off the standard path. + return None + + # The globals refer to a module or package of ours. It will define + # the context of the new import. Get the module/package fqname. + parent_fqname = globals['__name__'] + + # if a package is performing the import, then return itself (imports + # refer to pkg contents) + if globals['__ispkg__']: + parent = sys.modules[parent_fqname] + assert globals is parent.__dict__ + return parent + + i = parent_fqname.rfind('.') + + # a module outside of a package has no particular import context + if i == -1: + return None + + # if a module in a package is performing the import, then return the + # package (imports refer to siblings) + parent_fqname = parent_fqname[:i] + parent = sys.modules[parent_fqname] + assert parent.__name__ == parent_fqname + return parent + + def _import_top_module(self, name): + # scan sys.path looking for a location in the filesystem that contains + # the module, or an Importer object that can import the module. + for item in sys.path: + if isinstance(item, _StringType): + module = self.fs_imp.import_from_dir(item, name) + else: + module = item.import_top(name) + if module: + return module + return None + + def _reload_hook(self, module): + "Python calls this hook to reload a module." + + # reloading of a module may or may not be possible (depending on the + # importer), but at least we can validate that it's ours to reload + importer = module.__dict__.get('__importer__') + if not importer: + ### oops. now what... + pass + + # okay. it is using the imputil system, and we must delegate it, but + # we don't know what to do (yet) + ### we should blast the module dict and do another get_code(). need to + ### flesh this out and add proper docco... + raise SystemError, "reload not yet implemented" + + +class Importer: + "Base class for replacing standard import functions." + + def import_top(self, name): + "Import a top-level module." + return self._import_one(None, name, name) + + ###################################################################### + # + # PRIVATE METHODS + # + def _finish_import(self, top, parts, fromlist): + # if "a.b.c" was provided, then load the ".b.c" portion down from + # below the top-level module. + bottom = self._load_tail(top, parts) + + # if the form is "import a.b.c", then return "a" + if not fromlist: + # no fromlist: return the top of the import tree + return top + + # the top module was imported by self. + # + # this means that the bottom module was also imported by self (just + # now, or in the past and we fetched it from sys.modules). + # + # since we imported/handled the bottom module, this means that we can + # also handle its fromlist (and reliably use __ispkg__). + + # if the bottom node is a package, then (potentially) import some + # modules. + # + # note: if it is not a package, then "fromlist" refers to names in + # the bottom module rather than modules. + # note: for a mix of names and modules in the fromlist, we will + # import all modules and insert those into the namespace of + # the package module. Python will pick up all fromlist names + # from the bottom (package) module; some will be modules that + # we imported and stored in the namespace, others are expected + # to be present already. + if bottom.__ispkg__: + self._import_fromlist(bottom, fromlist) + + # if the form is "from a.b import c, d" then return "b" + return bottom + + def _import_one(self, parent, modname, fqname): + "Import a single module." + + # has the module already been imported? + try: + return sys.modules[fqname] + except KeyError: + pass + + # load the module's code, or fetch the module itself + result = self.get_code(parent, modname, fqname) + if result is None: + return None + + module = self._process_result(result, fqname) + + # insert the module into its parent + if parent: + setattr(parent, modname, module) + return module + + def _process_result(self, (ispkg, code, values), fqname): + # did get_code() return an actual module? (rather than a code object) + is_module = isinstance(code, _ModuleType) + + # use the returned module, or create a new one to exec code into + if is_module: + module = code + else: + module = imp.new_module(fqname) + + ### record packages a bit differently?? + module.__importer__ = self + module.__ispkg__ = ispkg + + # insert additional values into the module (before executing the code) + module.__dict__.update(values) + + # the module is almost ready... make it visible + sys.modules[fqname] = module + + # execute the code within the module's namespace + if not is_module: + exec code in module.__dict__ + + # fetch from sys.modules instead of returning module directly. + # also make module's __name__ agree with fqname, in case + # the "exec code in module.__dict__" played games on us. + module = sys.modules[fqname] + module.__name__ = fqname + return module + + def _load_tail(self, m, parts): + """Import the rest of the modules, down from the top-level module. + + Returns the last module in the dotted list of modules. + """ + for part in parts: + fqname = "%s.%s" % (m.__name__, part) + m = self._import_one(m, part, fqname) + if not m: + raise ImportError, "No module named " + fqname + return m + + def _import_fromlist(self, package, fromlist): + 'Import any sub-modules in the "from" list.' + + # if '*' is present in the fromlist, then look for the '__all__' + # variable to find additional items (modules) to import. + if '*' in fromlist: + fromlist = list(fromlist) + \ + list(package.__dict__.get('__all__', [])) + + for sub in fromlist: + # if the name is already present, then don't try to import it (it + # might not be a module!). + if sub != '*' and not hasattr(package, sub): + subname = "%s.%s" % (package.__name__, sub) + submod = self._import_one(package, sub, subname) + if not submod: + raise ImportError, "cannot import name " + subname + + def _do_import(self, parent, parts, fromlist): + """Attempt to import the module relative to parent. + + This method is used when the import context specifies that + imported the parent module. + """ + top_name = parts[0] + top_fqname = parent.__name__ + '.' + top_name + top_module = self._import_one(parent, top_name, top_fqname) + if not top_module: + # this importer and parent could not find the module (relatively) + return None + + return self._finish_import(top_module, parts[1:], fromlist) + + ###################################################################### + # + # METHODS TO OVERRIDE + # + def get_code(self, parent, modname, fqname): + """Find and retrieve the code for the given module. + + parent specifies a parent module to define a context for importing. It + may be None, indicating no particular context for the search. + + modname specifies a single module (not dotted) within the parent. + + fqname specifies the fully-qualified module name. This is a + (potentially) dotted name from the "root" of the module namespace + down to the modname. + If there is no parent, then modname==fqname. + + This method should return None, or a 3-tuple. + + * If the module was not found, then None should be returned. + + * The first item of the 2- or 3-tuple should be the integer 0 or 1, + specifying whether the module that was found is a package or not. + + * The second item is the code object for the module (it will be + executed within the new module's namespace). This item can also + be a fully-loaded module object (e.g. loaded from a shared lib). + + * The third item is a dictionary of name/value pairs that will be + inserted into new module before the code object is executed. This + is provided in case the module's code expects certain values (such + as where the module was found). When the second item is a module + object, then these names/values will be inserted *after* the module + has been loaded/initialized. + """ + raise RuntimeError, "get_code not implemented" + + +###################################################################### +# +# Some handy stuff for the Importers +# + +# byte-compiled file suffix character +_suffix_char = __debug__ and 'c' or 'o' + +# byte-compiled file suffix +_suffix = '.py' + _suffix_char + +def _compile(pathname, timestamp): + """Compile (and cache) a Python source file. + + The file specified by is compiled to a code object and + returned. + + Presuming the appropriate privileges exist, the bytecodes will be + saved back to the filesystem for future imports. The source file's + modification timestamp must be provided as a Long value. + """ + codestring = open(pathname, 'r').read() + if codestring and codestring[-1] != '\n': + codestring = codestring + '\n' + code = __builtin__.compile(codestring, pathname, 'exec') + + # try to cache the compiled code + try: + f = open(pathname + _suffix_char, 'wb') + except IOError: + pass + else: + f.write('\0\0\0\0') + f.write(struct.pack('= t_py: + f = open(file, 'rb') + if f.read(4) == imp.get_magic(): + t = struct.unpack('>> import foo +# >>> foo +# +# +# ---- revamped import mechanism +# >>> import imputil +# >>> imputil._test_revamp() +# >>> import foo +# >>> foo +# +# +# +# from MAL: +# should BuiltinImporter exist in sys.path or hard-wired in ImportManager? +# need __path__ processing +# performance +# move chaining to a subclass [gjs: it's been nuked] +# deinstall should be possible +# query mechanism needed: is a specific Importer installed? +# py/pyc/pyo piping hooks to filter/process these files +# wish list: +# distutils importer hooked to list of standard Internet repositories +# module->file location mapper to speed FS-based imports +# relative imports +# keep chaining so that it can play nice with other import hooks +# +# from Gordon: +# push MAL's mapper into sys.path[0] as a cache (hard-coded for apps) +# +# from Guido: +# need to change sys.* references for rexec environs +# need hook for MAL's walk-me-up import strategy, or Tim's absolute strategy +# watch out for sys.modules[...] is None +# flag to force absolute imports? (speeds _determine_import_context and +# checking for a relative module) +# insert names of archives into sys.path (see quote below) +# note: reload does NOT blast module dict +# shift import mechanisms and policies around; provide for hooks, overrides +# (see quote below) +# add get_source stuff +# get_topcode and get_subcode +# CRLF handling in _compile +# race condition in _compile +# refactoring of os.py to deal with _os_bootstrap problem +# any special handling to do for importing a module with a SyntaxError? +# (e.g. clean up the traceback) +# implement "domain" for path-type functionality using pkg namespace +# (rather than FS-names like __path__) +# don't use the word "private"... maybe "internal" +# +# +# Guido's comments on sys.path caching: +# +# We could cache this in a dictionary: the ImportManager can have a +# cache dict mapping pathnames to importer objects, and a separate +# method for coming up with an importer given a pathname that's not yet +# in the cache. The method should do a stat and/or look at the +# extension to decide which importer class to use; you can register new +# importer classes by registering a suffix or a Boolean function, plus a +# class. If you register a new importer class, the cache is zapped. +# The cache is independent from sys.path (but maintained per +# ImportManager instance) so that rearrangements of sys.path do the +# right thing. If a path is dropped from sys.path the corresponding +# cache entry is simply no longer used. +# +# My/Guido's comments on factoring ImportManager and Importer: +# +# > However, we still have a tension occurring here: +# > +# > 1) implementing policy in ImportManager assists in single-point policy +# > changes for app/rexec situations +# > 2) implementing policy in Importer assists in package-private policy +# > changes for normal, operating conditions +# > +# > I'll see if I can sort out a way to do this. Maybe the Importer class will +# > implement the methods (which can be overridden to change policy) by +# > delegating to ImportManager. +# +# Maybe also think about what kind of policies an Importer would be +# likely to want to change. I have a feeling that a lot of the code +# there is actually not so much policy but a *necessity* to get things +# working given the calling conventions for the __import__ hook: whether +# to return the head or tail of a dotted name, or when to do the "finish +# fromlist" stuff. +# diff --git a/lib-python/2.2/inspect.py b/lib-python/2.2/inspect.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/inspect.py @@ -0,0 +1,785 @@ +"""Get useful information from live Python objects. + +This module encapsulates the interface provided by the internal special +attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion. +It also provides some help for examining source code and class layout. + +Here are some of the useful functions provided by this module: + + ismodule(), isclass(), ismethod(), isfunction(), istraceback(), + isframe(), iscode(), isbuiltin(), isroutine() - check object types + getmembers() - get members of an object that satisfy a given condition + + getfile(), getsourcefile(), getsource() - find an object's source code + getdoc(), getcomments() - get documentation on an object + getmodule() - determine the module that an object came from + getclasstree() - arrange classes so as to represent their hierarchy + + getargspec(), getargvalues() - get info about function arguments + formatargspec(), formatargvalues() - format an argument spec + getouterframes(), getinnerframes() - get info about frames + currentframe() - get the current stack frame + stack(), trace() - get info about frames on the stack or in a traceback +""" + +# This module is in the public domain. No warranties. + +__author__ = 'Ka-Ping Yee ' +__date__ = '1 Jan 2001' + +import sys, os, types, string, re, dis, imp, tokenize + +# ----------------------------------------------------------- type-checking +def ismodule(object): + """Return true if the object is a module. + + Module objects provide these attributes: + __doc__ documentation string + __file__ filename (missing for built-in modules)""" + return isinstance(object, types.ModuleType) + +def isclass(object): + """Return true if the object is a class. + + Class objects provide these attributes: + __doc__ documentation string + __module__ name of module in which this class was defined""" + return isinstance(object, types.ClassType) or hasattr(object, '__bases__') + +def ismethod(object): + """Return true if the object is an instance method. + + Instance method objects provide these attributes: + __doc__ documentation string + __name__ name with which this method was defined + im_class class object in which this method belongs + im_func function object containing implementation of method + im_self instance to which this method is bound, or None""" + return isinstance(object, types.MethodType) + +def ismethoddescriptor(object): + """Return true if the object is a method descriptor. + + But not if ismethod() or isclass() or isfunction() are true. + + This is new in Python 2.2, and, for example, is true of int.__add__. + An object passing this test has a __get__ attribute but not a __set__ + attribute, but beyond that the set of attributes varies. __name__ is + usually sensible, and __doc__ often is. + + Methods implemented via descriptors that also pass one of the other + tests return false from the ismethoddescriptor() test, simply because + the other tests promise more -- you can, e.g., count on having the + im_func attribute (etc) when an object passes ismethod().""" + return (hasattr(object, "__get__") + and not hasattr(object, "__set__") # else it's a data descriptor + and not ismethod(object) # mutual exclusion + and not isfunction(object) + and not isclass(object)) + +def isfunction(object): + """Return true if the object is a user-defined function. + + Function objects provide these attributes: + __doc__ documentation string + __name__ name with which this function was defined + func_code code object containing compiled function bytecode + func_defaults tuple of any default values for arguments + func_doc (same as __doc__) + func_globals global namespace in which this function was defined + func_name (same as __name__)""" + return isinstance(object, types.FunctionType) + +def istraceback(object): + """Return true if the object is a traceback. + + Traceback objects provide these attributes: + tb_frame frame object at this level + tb_lasti index of last attempted instruction in bytecode + tb_lineno current line number in Python source code + tb_next next inner traceback object (called by this level)""" + return isinstance(object, types.TracebackType) + +def isframe(object): + """Return true if the object is a frame object. + + Frame objects provide these attributes: + f_back next outer frame object (this frame's caller) + f_builtins built-in namespace seen by this frame + f_code code object being executed in this frame + f_exc_traceback traceback if raised in this frame, or None + f_exc_type exception type if raised in this frame, or None + f_exc_value exception value if raised in this frame, or None + f_globals global namespace seen by this frame + f_lasti index of last attempted instruction in bytecode + f_lineno current line number in Python source code + f_locals local namespace seen by this frame + f_restricted 0 or 1 if frame is in restricted execution mode + f_trace tracing function for this frame, or None""" + return isinstance(object, types.FrameType) + +def iscode(object): + """Return true if the object is a code object. + + Code objects provide these attributes: + co_argcount number of arguments (not including * or ** args) + co_code string of raw compiled bytecode + co_consts tuple of constants used in the bytecode + co_filename name of file in which this code object was created + co_firstlineno number of first line in Python source code + co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg + co_lnotab encoded mapping of line numbers to bytecode indices + co_name name with which this code object was defined + co_names tuple of names of local variables + co_nlocals number of local variables + co_stacksize virtual machine stack space required + co_varnames tuple of names of arguments and local variables""" + return isinstance(object, types.CodeType) + +def isbuiltin(object): + """Return true if the object is a built-in function or method. + + Built-in functions and methods provide these attributes: + __doc__ documentation string + __name__ original name of this function or method + __self__ instance to which a method is bound, or None""" + return isinstance(object, types.BuiltinFunctionType) + +def isroutine(object): + """Return true if the object is any kind of function or method.""" + return (isbuiltin(object) + or isfunction(object) + or ismethod(object) + or ismethoddescriptor(object)) + +def getmembers(object, predicate=None): + """Return all members of an object as (name, value) pairs sorted by name. + Optionally, only return members that satisfy a given predicate.""" + results = [] + for key in dir(object): + value = getattr(object, key) + if not predicate or predicate(value): + results.append((key, value)) + results.sort() + return results + +def classify_class_attrs(cls): + """Return list of attribute-descriptor tuples. + + For each name in dir(cls), the return list contains a 4-tuple + with these elements: + + 0. The name (a string). + + 1. The kind of attribute this is, one of these strings: + 'class method' created via classmethod() + 'static method' created via staticmethod() + 'property' created via property() + 'method' any other flavor of method + 'data' not a method + + 2. The class which defined this attribute (a class). + + 3. The object as obtained directly from the defining class's + __dict__, not via getattr. This is especially important for + data attributes: C.data is just a data object, but + C.__dict__['data'] may be a data descriptor with additional + info, like a __doc__ string. + """ + + mro = getmro(cls) + names = dir(cls) + result = [] + for name in names: + # Get the object associated with the name. + # Getting an obj from the __dict__ sometimes reveals more than + # using getattr. Static and class methods are dramatic examples. + if name in cls.__dict__: + obj = cls.__dict__[name] + else: + obj = getattr(cls, name) + + # Figure out where it was defined. + homecls = getattr(obj, "__objclass__", None) + if homecls is None: + # search the dicts. + for base in mro: + if name in base.__dict__: + homecls = base + break + + # Get the object again, in order to get it from the defining + # __dict__ instead of via getattr (if possible). + if homecls is not None and name in homecls.__dict__: + obj = homecls.__dict__[name] + + # Also get the object via getattr. + obj_via_getattr = getattr(cls, name) + + # Classify the object. + if isinstance(obj, staticmethod): + kind = "static method" + elif isinstance(obj, classmethod): + kind = "class method" + elif isinstance(obj, property): + kind = "property" + elif (ismethod(obj_via_getattr) or + ismethoddescriptor(obj_via_getattr)): + kind = "method" + else: + kind = "data" + + result.append((name, kind, homecls, obj)) + + return result + +# ----------------------------------------------------------- class helpers +def _searchbases(cls, accum): + # Simulate the "classic class" search order. + if cls in accum: + return + accum.append(cls) + for base in cls.__bases__: + _searchbases(base, accum) + +def getmro(cls): + "Return tuple of base classes (including cls) in method resolution order." + if hasattr(cls, "__mro__"): + return cls.__mro__ + else: + result = [] + _searchbases(cls, result) + return tuple(result) + +# -------------------------------------------------- source code extraction +def indentsize(line): + """Return the indent size, in spaces, at the start of a line of text.""" + expline = string.expandtabs(line) + return len(expline) - len(string.lstrip(expline)) + +def getdoc(object): + """Get the documentation string for an object. + + All tabs are expanded to spaces. To clean up docstrings that are + indented to line up with blocks of code, any whitespace than can be + uniformly removed from the second line onwards is removed.""" + try: + doc = object.__doc__ + except AttributeError: + return None + if not isinstance(doc, (str, unicode)): + return None + try: + lines = string.split(string.expandtabs(doc), '\n') + except UnicodeError: + return None + else: + margin = None + for line in lines[1:]: + content = len(string.lstrip(line)) + if not content: continue + indent = len(line) - content + if margin is None: margin = indent + else: margin = min(margin, indent) + if margin is not None: + for i in range(1, len(lines)): lines[i] = lines[i][margin:] + return string.join(lines, '\n') + +def getfile(object): + """Work out which source or compiled file an object was defined in.""" + if ismodule(object): + if hasattr(object, '__file__'): + return object.__file__ + raise TypeError, 'arg is a built-in module' + if isclass(object): + object = sys.modules.get(object.__module__) + if hasattr(object, '__file__'): + return object.__file__ + raise TypeError, 'arg is a built-in class' + if ismethod(object): + object = object.im_func + if isfunction(object): + object = object.func_code + if istraceback(object): + object = object.tb_frame + if isframe(object): + object = object.f_code + if iscode(object): + return object.co_filename + raise TypeError, 'arg is not a module, class, method, ' \ + 'function, traceback, frame, or code object' + +def getmoduleinfo(path): + """Get the module name, suffix, mode, and module type for a given file.""" + filename = os.path.basename(path) + suffixes = map(lambda (suffix, mode, mtype): + (-len(suffix), suffix, mode, mtype), imp.get_suffixes()) + suffixes.sort() # try longest suffixes first, in case they overlap + for neglen, suffix, mode, mtype in suffixes: + if filename[neglen:] == suffix: + return filename[:neglen], suffix, mode, mtype + +def getmodulename(path): + """Return the module name for a given file, or None.""" + info = getmoduleinfo(path) + if info: return info[0] + +def getsourcefile(object): + """Return the Python source file an object was defined in, if it exists.""" + filename = getfile(object) + if string.lower(filename[-4:]) in ['.pyc', '.pyo']: + filename = filename[:-4] + '.py' + for suffix, mode, kind in imp.get_suffixes(): + if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix: + # Looks like a binary file. We want to only return a text file. + return None + if os.path.exists(filename): + return filename + +def getabsfile(object): + """Return an absolute path to the source or compiled file for an object. + + The idea is for each object to have a unique origin, so this routine + normalizes the result as much as possible.""" + return os.path.normcase( + os.path.abspath(getsourcefile(object) or getfile(object))) + +modulesbyfile = {} + +def getmodule(object): + """Return the module an object was defined in, or None if not found.""" + if ismodule(object): + return object + if isclass(object): + return sys.modules.get(object.__module__) + try: + file = getabsfile(object) + except TypeError: + return None + if modulesbyfile.has_key(file): + return sys.modules[modulesbyfile[file]] + for module in sys.modules.values(): + if hasattr(module, '__file__'): + modulesbyfile[getabsfile(module)] = module.__name__ + if modulesbyfile.has_key(file): + return sys.modules[modulesbyfile[file]] + main = sys.modules['__main__'] + if hasattr(main, object.__name__): + mainobject = getattr(main, object.__name__) + if mainobject is object: + return main + builtin = sys.modules['__builtin__'] + if hasattr(builtin, object.__name__): + builtinobject = getattr(builtin, object.__name__) + if builtinobject is object: + return builtin + +def findsource(object): + """Return the entire source file and starting line number for an object. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a list of all the lines + in the file and the line number indexes a line in that list. An IOError + is raised if the source code cannot be retrieved.""" + try: + file = open(getsourcefile(object)) + except (TypeError, IOError): + raise IOError, 'could not get source code' + lines = file.readlines() + file.close() + + if ismodule(object): + return lines, 0 + + if isclass(object): + name = object.__name__ + pat = re.compile(r'^\s*class\s*' + name + r'\b') + for i in range(len(lines)): + if pat.match(lines[i]): return lines, i + else: raise IOError, 'could not find class definition' + + if ismethod(object): + object = object.im_func + if isfunction(object): + object = object.func_code + if istraceback(object): + object = object.tb_frame + if isframe(object): + object = object.f_code + if iscode(object): + if not hasattr(object, 'co_firstlineno'): + raise IOError, 'could not find function definition' + lnum = object.co_firstlineno - 1 + pat = re.compile(r'^(\s*def\s)|(.*\slambda(:|\s))') + while lnum > 0: + if pat.match(lines[lnum]): break + lnum = lnum - 1 + return lines, lnum + raise IOError, 'could not find code object' + +def getcomments(object): + """Get lines of comments immediately preceding an object's source code.""" + try: lines, lnum = findsource(object) + except IOError: return None + + if ismodule(object): + # Look for a comment block at the top of the file. + start = 0 + if lines and lines[0][:2] == '#!': start = 1 + while start < len(lines) and string.strip(lines[start]) in ['', '#']: + start = start + 1 + if start < len(lines) and lines[start][:1] == '#': + comments = [] + end = start + while end < len(lines) and lines[end][:1] == '#': + comments.append(string.expandtabs(lines[end])) + end = end + 1 + return string.join(comments, '') + + # Look for a preceding block of comments at the same indentation. + elif lnum > 0: + indent = indentsize(lines[lnum]) + end = lnum - 1 + if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \ + indentsize(lines[end]) == indent: + comments = [string.lstrip(string.expandtabs(lines[end]))] + if end > 0: + end = end - 1 + comment = string.lstrip(string.expandtabs(lines[end])) + while comment[:1] == '#' and indentsize(lines[end]) == indent: + comments[:0] = [comment] + end = end - 1 + if end < 0: break + comment = string.lstrip(string.expandtabs(lines[end])) + while comments and string.strip(comments[0]) == '#': + comments[:1] = [] + while comments and string.strip(comments[-1]) == '#': + comments[-1:] = [] + return string.join(comments, '') + +class ListReader: + """Provide a readline() method to return lines from a list of strings.""" + def __init__(self, lines): + self.lines = lines + self.index = 0 + + def readline(self): + i = self.index + if i < len(self.lines): + self.index = i + 1 + return self.lines[i] + else: return '' + +class EndOfBlock(Exception): pass + +class BlockFinder: + """Provide a tokeneater() method to detect the end of a code block.""" + def __init__(self): + self.indent = 0 + self.started = 0 + self.last = 0 + + def tokeneater(self, type, token, (srow, scol), (erow, ecol), line): + if not self.started: + if type == tokenize.NAME: self.started = 1 + elif type == tokenize.NEWLINE: + self.last = srow + elif type == tokenize.INDENT: + self.indent = self.indent + 1 + elif type == tokenize.DEDENT: + self.indent = self.indent - 1 + if self.indent == 0: raise EndOfBlock, self.last + elif type == tokenize.NAME and scol == 0: + raise EndOfBlock, self.last + +def getblock(lines): + """Extract the block of code at the top of the given list of lines.""" + try: + tokenize.tokenize(ListReader(lines).readline, BlockFinder().tokeneater) + except EndOfBlock, eob: + return lines[:eob.args[0]] + # Fooling the indent/dedent logic implies a one-line definition + return lines[:1] + +def getsourcelines(object): + """Return a list of source lines and starting line number for an object. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a list of the lines + corresponding to the object and the line number indicates where in the + original source file the first line of code was found. An IOError is + raised if the source code cannot be retrieved.""" + lines, lnum = findsource(object) + + if ismodule(object): return lines, 0 + else: return getblock(lines[lnum:]), lnum + 1 + +def getsource(object): + """Return the text of the source code for an object. + + The argument may be a module, class, method, function, traceback, frame, + or code object. The source code is returned as a single string. An + IOError is raised if the source code cannot be retrieved.""" + lines, lnum = getsourcelines(object) + return string.join(lines, '') + +# --------------------------------------------------- class tree extraction +def walktree(classes, children, parent): + """Recursive helper function for getclasstree().""" + results = [] + classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) + for c in classes: + results.append((c, c.__bases__)) + if children.has_key(c): + results.append(walktree(children[c], children, c)) + return results + +def getclasstree(classes, unique=0): + """Arrange the given list of classes into a hierarchy of nested lists. + + Where a nested list appears, it contains classes derived from the class + whose entry immediately precedes the list. Each entry is a 2-tuple + containing a class and a tuple of its base classes. If the 'unique' + argument is true, exactly one entry appears in the returned structure + for each class in the given list. Otherwise, classes using multiple + inheritance and their descendants will appear multiple times.""" + children = {} + roots = [] + for c in classes: + if c.__bases__: + for parent in c.__bases__: + if not children.has_key(parent): + children[parent] = [] + children[parent].append(c) + if unique and parent in classes: break + elif c not in roots: + roots.append(c) + for parent in children.keys(): + if parent not in classes: + roots.append(parent) + return walktree(roots, children, None) + +# ------------------------------------------------ argument list extraction +# These constants are from Python's compile.h. +CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8 + +def getargs(co): + """Get information about the arguments accepted by a code object. + + Three things are returned: (args, varargs, varkw), where 'args' is + a list of argument names (possibly containing nested lists), and + 'varargs' and 'varkw' are the names of the * and ** arguments or None.""" + if not iscode(co): raise TypeError, 'arg is not a code object' + + code = co.co_code + nargs = co.co_argcount + names = co.co_varnames + args = list(names[:nargs]) + step = 0 + + # The following acrobatics are for anonymous (tuple) arguments. + for i in range(nargs): + if args[i][:1] in ['', '.']: + stack, remain, count = [], [], [] + while step < len(code): + op = ord(code[step]) + step = step + 1 + if op >= dis.HAVE_ARGUMENT: + opname = dis.opname[op] + value = ord(code[step]) + ord(code[step+1])*256 + step = step + 2 + if opname in ['UNPACK_TUPLE', 'UNPACK_SEQUENCE']: + remain.append(value) + count.append(value) + elif opname == 'STORE_FAST': + stack.append(names[value]) + remain[-1] = remain[-1] - 1 + while remain[-1] == 0: + remain.pop() + size = count.pop() + stack[-size:] = [stack[-size:]] + if not remain: break + remain[-1] = remain[-1] - 1 + if not remain: break + args[i] = stack[0] + + varargs = None + if co.co_flags & CO_VARARGS: + varargs = co.co_varnames[nargs] + nargs = nargs + 1 + varkw = None + if co.co_flags & CO_VARKEYWORDS: + varkw = co.co_varnames[nargs] + return args, varargs, varkw + +def getargspec(func): + """Get the names and default values of a function's arguments. + + A tuple of four things is returned: (args, varargs, varkw, defaults). + 'args' is a list of the argument names (it may contain nested lists). + 'varargs' and 'varkw' are the names of the * and ** arguments or None. + 'defaults' is an n-tuple of the default values of the last n arguments.""" + if ismethod(func): + func = func.im_func + if not isfunction(func): raise TypeError, 'arg is not a Python function' + args, varargs, varkw = getargs(func.func_code) + return args, varargs, varkw, func.func_defaults + +def getargvalues(frame): + """Get information about arguments passed into a particular frame. + + A tuple of four things is returned: (args, varargs, varkw, locals). + 'args' is a list of the argument names (it may contain nested lists). + 'varargs' and 'varkw' are the names of the * and ** arguments or None. + 'locals' is the locals dictionary of the given frame.""" + args, varargs, varkw = getargs(frame.f_code) + return args, varargs, varkw, frame.f_locals + +def joinseq(seq): + if len(seq) == 1: + return '(' + seq[0] + ',)' + else: + return '(' + string.join(seq, ', ') + ')' + +def strseq(object, convert, join=joinseq): + """Recursively walk a sequence, stringifying each element.""" + if type(object) in [types.ListType, types.TupleType]: + return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object)) + else: + return convert(object) + +def formatargspec(args, varargs=None, varkw=None, defaults=None, + formatarg=str, + formatvarargs=lambda name: '*' + name, + formatvarkw=lambda name: '**' + name, + formatvalue=lambda value: '=' + repr(value), + join=joinseq): + """Format an argument spec from the 4 values returned by getargspec. + + The first four arguments are (args, varargs, varkw, defaults). The + other four arguments are the corresponding optional formatting functions + that are called to turn names and values into strings. The ninth + argument is an optional function to format the sequence of arguments.""" + specs = [] + if defaults: + firstdefault = len(args) - len(defaults) + for i in range(len(args)): + spec = strseq(args[i], formatarg, join) + if defaults and i >= firstdefault: + spec = spec + formatvalue(defaults[i - firstdefault]) + specs.append(spec) + if varargs: + specs.append(formatvarargs(varargs)) + if varkw: + specs.append(formatvarkw(varkw)) + return '(' + string.join(specs, ', ') + ')' + +def formatargvalues(args, varargs, varkw, locals, + formatarg=str, + formatvarargs=lambda name: '*' + name, + formatvarkw=lambda name: '**' + name, + formatvalue=lambda value: '=' + repr(value), + join=joinseq): + """Format an argument spec from the 4 values returned by getargvalues. + + The first four arguments are (args, varargs, varkw, locals). The + next four arguments are the corresponding optional formatting functions + that are called to turn names and values into strings. The ninth + argument is an optional function to format the sequence of arguments.""" + def convert(name, locals=locals, + formatarg=formatarg, formatvalue=formatvalue): + return formatarg(name) + formatvalue(locals[name]) + specs = [] + for i in range(len(args)): + specs.append(strseq(args[i], convert, join)) + if varargs: + specs.append(formatvarargs(varargs) + formatvalue(locals[varargs])) + if varkw: + specs.append(formatvarkw(varkw) + formatvalue(locals[varkw])) + return '(' + string.join(specs, ', ') + ')' + +# -------------------------------------------------- stack frame extraction +def getframeinfo(frame, context=1): + """Get information about a frame or traceback object. + + A tuple of five things is returned: the filename, the line number of + the current line, the function name, a list of lines of context from + the source code, and the index of the current line within that list. + The optional second argument specifies the number of lines of context + to return, which are centered around the current line.""" + if istraceback(frame): + frame = frame.tb_frame + if not isframe(frame): + raise TypeError, 'arg is not a frame or traceback object' + + filename = getsourcefile(frame) + lineno = getlineno(frame) + if context > 0: + start = lineno - 1 - context//2 + try: + lines, lnum = findsource(frame) + except IOError: + lines = index = None + else: + start = max(start, 1) + start = min(start, len(lines) - context) + lines = lines[start:start+context] + index = lineno - 1 - start + else: + lines = index = None + + return (filename, lineno, frame.f_code.co_name, lines, index) + +def getlineno(frame): + """Get the line number from a frame object, allowing for optimization.""" + # Written by Marc-Andr? Lemburg; revised by Jim Hugunin and Fredrik Lundh. + lineno = frame.f_lineno + code = frame.f_code + if hasattr(code, 'co_lnotab'): + table = code.co_lnotab + lineno = code.co_firstlineno + addr = 0 + for i in range(0, len(table), 2): + addr = addr + ord(table[i]) + if addr > frame.f_lasti: break + lineno = lineno + ord(table[i+1]) + return lineno + +def getouterframes(frame, context=1): + """Get a list of records for a frame and all higher (calling) frames. + + Each record contains a frame object, filename, line number, function + name, a list of lines of context, and index within the context.""" + framelist = [] + while frame: + framelist.append((frame,) + getframeinfo(frame, context)) + frame = frame.f_back + return framelist + +def getinnerframes(tb, context=1): + """Get a list of records for a traceback's frame and all lower frames. + + Each record contains a frame object, filename, line number, function + name, a list of lines of context, and index within the context.""" + framelist = [] + while tb: + framelist.append((tb.tb_frame,) + getframeinfo(tb, context)) + tb = tb.tb_next + return framelist + +def currentframe(): + """Return the frame object for the caller's stack frame.""" + try: + raise 'catch me' + except: + return sys.exc_traceback.tb_frame.f_back + +if hasattr(sys, '_getframe'): currentframe = sys._getframe + +def stack(context=1): + """Return a list of records for the stack above the caller's frame.""" + return getouterframes(currentframe().f_back, context) + +def trace(context=1): + """Return a list of records for the stack below the current exception.""" + return getinnerframes(sys.exc_traceback, context) diff --git a/lib-python/2.2/keyword.py b/lib-python/2.2/keyword.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/keyword.py @@ -0,0 +1,97 @@ +#! /usr/bin/env python + +"""Keywords (from "graminit.c") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree after building the interpreter and run: + + python Lib/keyword.py +""" + +__all__ = ["iskeyword", "kwlist"] + +kwlist = [ +#--start keywords-- + 'and', + 'assert', + 'break', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'exec', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'not', + 'or', + 'pass', + 'print', + 'raise', + 'return', + 'try', + 'while', + 'yield', +#--end keywords-- + ] + +kwdict = {} +for keyword in kwlist: + kwdict[keyword] = 1 + +iskeyword = kwdict.has_key + +def main(): + import sys, re + + args = sys.argv[1:] + iptfile = args and args[0] or "Python/graminit.c" + if len(args) > 1: optfile = args[1] + else: optfile = "Lib/keyword.py" + + # scan the source file for keywords + fp = open(iptfile) + strprog = re.compile('"([^"]+)"') + lines = [] + while 1: + line = fp.readline() + if not line: break + if line.find('{1, "') > -1: + match = strprog.search(line) + if match: + lines.append(" '" + match.group(1) + "',\n") + fp.close() + lines.sort() + + # load the output skeleton from the target + fp = open(optfile) + format = fp.readlines() + fp.close() + + # insert the lines of keywords + try: + start = format.index("#--start keywords--\n") + 1 + end = format.index("#--end keywords--\n") + format[start:end] = lines + except ValueError: + sys.stderr.write("target does not contain format markers\n") + sys.exit(1) + + # write the output file + fp = open(optfile, 'w') + fp.write(''.join(format)) + fp.close() + +if __name__ == "__main__": + main() diff --git a/lib-python/2.2/knee.py b/lib-python/2.2/knee.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/knee.py @@ -0,0 +1,126 @@ +"""An Python re-implementation of hierarchical module import. + +This code is intended to be read, not executed. However, it does work +-- all you need to do to enable it is "import knee". + +(The name is a pun on the klunkier predecessor of this module, "ni".) + +""" + +import sys, imp, __builtin__ + + +# Replacement for __import__() +def import_hook(name, globals=None, locals=None, fromlist=None): + parent = determine_parent(globals) + q, tail = find_head_package(parent, name) + m = load_tail(q, tail) + if not fromlist: + return q + if hasattr(m, "__path__"): + ensure_fromlist(m, fromlist) + return m + +def determine_parent(globals): + if not globals or not globals.has_key("__name__"): + return None + pname = globals['__name__'] + if globals.has_key("__path__"): + parent = sys.modules[pname] + assert globals is parent.__dict__ + return parent + if '.' in pname: + i = pname.rfind('.') + pname = pname[:i] + parent = sys.modules[pname] + assert parent.__name__ == pname + return parent + return None + +def find_head_package(parent, name): + if '.' in name: + i = name.find('.') + head = name[:i] + tail = name[i+1:] + else: + head = name + tail = "" + if parent: + qname = "%s.%s" % (parent.__name__, head) + else: + qname = head + q = import_module(head, qname, parent) + if q: return q, tail + if parent: + qname = head + parent = None + q = import_module(head, qname, parent) + if q: return q, tail + raise ImportError, "No module named " + qname + +def load_tail(q, tail): + m = q + while tail: + i = tail.find('.') + if i < 0: i = len(tail) + head, tail = tail[:i], tail[i+1:] + mname = "%s.%s" % (m.__name__, head) + m = import_module(head, mname, m) + if not m: + raise ImportError, "No module named " + mname + return m + +def ensure_fromlist(m, fromlist, recursive=0): + for sub in fromlist: + if sub == "*": + if not recursive: + try: + all = m.__all__ + except AttributeError: + pass + else: + ensure_fromlist(m, all, 1) + continue + if sub != "*" and not hasattr(m, sub): + subname = "%s.%s" % (m.__name__, sub) + submod = import_module(sub, subname, m) + if not submod: + raise ImportError, "No module named " + subname + +def import_module(partname, fqname, parent): + try: + return sys.modules[fqname] + except KeyError: + pass + try: + fp, pathname, stuff = imp.find_module(partname, + parent and parent.__path__) + except ImportError: + return None + try: + m = imp.load_module(fqname, fp, pathname, stuff) + finally: + if fp: fp.close() + if parent: + setattr(parent, partname, m) + return m + + +# Replacement for reload() +def reload_hook(module): + name = module.__name__ + if '.' not in name: + return import_module(name, name, None) + i = name.rfind('.') + pname = name[:i] + parent = sys.modules[pname] + return import_module(name[i+1:], name, parent) + + +# Save the original hooks +original_import = __builtin__.__import__ +original_reload = __builtin__.reload + +# Now install our hooks +__builtin__.__import__ = import_hook +__builtin__.reload = reload_hook diff --git a/lib-python/2.2/lib-old/Para.py b/lib-python/2.2/lib-old/Para.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/Para.py @@ -0,0 +1,343 @@ +# Text formatting abstractions +# Note -- this module is obsolete, it's too slow anyway + + +# Oft-used type object +Int = type(0) + + +# Represent a paragraph. This is a list of words with associated +# font and size information, plus indents and justification for the +# entire paragraph. +# Once the words have been added to a paragraph, it can be laid out +# for different line widths. Once laid out, it can be rendered at +# different screen locations. Once rendered, it can be queried +# for mouse hits, and parts of the text can be highlighted +class Para: + # + def __init__(self): + self.words = [] # The words + self.just = 'l' # Justification: 'l', 'r', 'lr' or 'c' + self.indent_left = self.indent_right = self.indent_hang = 0 + # Final lay-out parameters, may change + self.left = self.top = self.right = self.bottom = \ + self.width = self.height = self.lines = None + # + # Add a word, computing size information for it. + # Words may also be added manually by appending to self.words + # Each word should be a 7-tuple: + # (font, text, width, space, stretch, ascent, descent) + def addword(self, d, font, text, space, stretch): + if font is not None: + d.setfont(font) + width = d.textwidth(text) + ascent = d.baseline() + descent = d.lineheight() - ascent + spw = d.textwidth(' ') + space = space * spw + stretch = stretch * spw + tuple = (font, text, width, space, stretch, ascent, descent) + self.words.append(tuple) + # + # Hooks to begin and end anchors -- insert numbers in the word list! + def bgn_anchor(self, id): + self.words.append(id) + # + def end_anchor(self, id): + self.words.append(0) + # + # Return the total length (width) of the text added so far, in pixels + def getlength(self): + total = 0 + for word in self.words: + if type(word) is not Int: + total = total + word[2] + word[3] + return total + # + # Tab to a given position (relative to the current left indent): + # remove all stretch, add fixed space up to the new indent. + # If the current position is already at the tab stop, + # don't add any new space (but still remove the stretch) + def tabto(self, tab): + total = 0 + as, de = 1, 0 + for i in range(len(self.words)): + word = self.words[i] + if type(word) is Int: continue + (fo, te, wi, sp, st, as, de) = word + self.words[i] = (fo, te, wi, sp, 0, as, de) + total = total + wi + sp + if total < tab: + self.words.append((None, '', 0, tab-total, 0, as, de)) + # + # Make a hanging tag: tab to hang, increment indent_left by hang, + # and reset indent_hang to -hang + def makehangingtag(self, hang): + self.tabto(hang) + self.indent_left = self.indent_left + hang + self.indent_hang = -hang + # + # Decide where the line breaks will be given some screen width + def layout(self, linewidth): + self.width = linewidth + height = 0 + self.lines = lines = [] + avail1 = self.width - self.indent_left - self.indent_right + avail = avail1 - self.indent_hang + words = self.words + i = 0 + n = len(words) + lastfont = None + while i < n: + firstfont = lastfont + charcount = 0 + width = 0 + stretch = 0 + ascent = 0 + descent = 0 + lsp = 0 + j = i + while i < n: + word = words[i] + if type(word) is Int: + if word > 0 and width >= avail: + break + i = i+1 + continue + fo, te, wi, sp, st, as, de = word + if width + wi > avail and width > 0 and wi > 0: + break + if fo is not None: + lastfont = fo + if width == 0: + firstfont = fo + charcount = charcount + len(te) + (sp > 0) + width = width + wi + sp + lsp = sp + stretch = stretch + st + lst = st + ascent = max(ascent, as) + descent = max(descent, de) + i = i+1 + while i > j and type(words[i-1]) is Int and \ + words[i-1] > 0: i = i-1 + width = width - lsp + if i < n: + stretch = stretch - lst + else: + stretch = 0 + tuple = i-j, firstfont, charcount, width, stretch, \ + ascent, descent + lines.append(tuple) + height = height + ascent + descent + avail = avail1 + self.height = height + # + # Call a function for all words in a line + def visit(self, wordfunc, anchorfunc): + avail1 = self.width - self.indent_left - self.indent_right + avail = avail1 - self.indent_hang + v = self.top + i = 0 + for tuple in self.lines: + wordcount, firstfont, charcount, width, stretch, \ + ascent, descent = tuple + h = self.left + self.indent_left + if i == 0: h = h + self.indent_hang + extra = 0 + if self.just == 'r': h = h + avail - width + elif self.just == 'c': h = h + (avail - width) / 2 + elif self.just == 'lr' and stretch > 0: + extra = avail - width + v2 = v + ascent + descent + for j in range(i, i+wordcount): + word = self.words[j] + if type(word) is Int: + ok = anchorfunc(self, tuple, word, \ + h, v) + if ok is not None: return ok + continue + fo, te, wi, sp, st, as, de = word + if extra > 0 and stretch > 0: + ex = extra * st / stretch + extra = extra - ex + stretch = stretch - st + else: + ex = 0 + h2 = h + wi + sp + ex + ok = wordfunc(self, tuple, word, h, v, \ + h2, v2, (j==i), (j==i+wordcount-1)) + if ok is not None: return ok + h = h2 + v = v2 + i = i + wordcount + avail = avail1 + # + # Render a paragraph in "drawing object" d, using the rectangle + # given by (left, top, right) with an unspecified bottom. + # Return the computed bottom of the text. + def render(self, d, left, top, right): + if self.width != right-left: + self.layout(right-left) + self.left = left + self.top = top + self.right = right + self.bottom = self.top + self.height + self.anchorid = 0 + try: + self.d = d + self.visit(self.__class__._renderword, \ + self.__class__._renderanchor) + finally: + self.d = None + return self.bottom + # + def _renderword(self, tuple, word, h, v, h2, v2, isfirst, islast): + if word[0] is not None: self.d.setfont(word[0]) + baseline = v + tuple[5] + self.d.text((h, baseline - word[5]), word[1]) + if self.anchorid > 0: + self.d.line((h, baseline+2), (h2, baseline+2)) + # + def _renderanchor(self, tuple, word, h, v): + self.anchorid = word + # + # Return which anchor(s) was hit by the mouse + def hitcheck(self, mouseh, mousev): + self.mouseh = mouseh + self.mousev = mousev + self.anchorid = 0 + self.hits = [] + self.visit(self.__class__._hitcheckword, \ + self.__class__._hitcheckanchor) + return self.hits + # + def _hitcheckword(self, tuple, word, h, v, h2, v2, isfirst, islast): + if self.anchorid > 0 and h <= self.mouseh <= h2 and \ + v <= self.mousev <= v2: + self.hits.append(self.anchorid) + # + def _hitcheckanchor(self, tuple, word, h, v): + self.anchorid = word + # + # Return whether the given anchor id is present + def hasanchor(self, id): + return id in self.words or -id in self.words + # + # Extract the raw text from the word list, substituting one space + # for non-empty inter-word space, and terminating with '\n' + def extract(self): + text = '' + for w in self.words: + if type(w) is not Int: + word = w[1] + if w[3]: word = word + ' ' + text = text + word + return text + '\n' + # + # Return which character position was hit by the mouse, as + # an offset in the entire text as returned by extract(). + # Return None if the mouse was not in this paragraph + def whereis(self, d, mouseh, mousev): + if mousev < self.top or mousev > self.bottom: + return None + self.mouseh = mouseh + self.mousev = mousev + self.lastfont = None + self.charcount = 0 + try: + self.d = d + return self.visit(self.__class__._whereisword, \ + self.__class__._whereisanchor) + finally: + self.d = None + # + def _whereisword(self, tuple, word, h1, v1, h2, v2, isfirst, islast): + fo, te, wi, sp, st, as, de = word + if fo is not None: self.lastfont = fo + h = h1 + if isfirst: h1 = 0 + if islast: h2 = 999999 + if not (v1 <= self.mousev <= v2 and h1 <= self.mouseh <= h2): + self.charcount = self.charcount + len(te) + (sp > 0) + return + if self.lastfont is not None: + self.d.setfont(self.lastfont) + cc = 0 + for c in te: + cw = self.d.textwidth(c) + if self.mouseh <= h + cw/2: + return self.charcount + cc + cc = cc+1 + h = h+cw + self.charcount = self.charcount + cc + if self.mouseh <= (h+h2) / 2: + return self.charcount + else: + return self.charcount + 1 + # + def _whereisanchor(self, tuple, word, h, v): + pass + # + # Return screen position corresponding to position in paragraph. + # Return tuple (h, vtop, vbaseline, vbottom). + # This is more or less the inverse of whereis() + def screenpos(self, d, pos): + if pos < 0: + ascent, descent = self.lines[0][5:7] + return self.left, self.top, self.top + ascent, \ + self.top + ascent + descent + self.pos = pos + self.lastfont = None + try: + self.d = d + ok = self.visit(self.__class__._screenposword, \ + self.__class__._screenposanchor) + finally: + self.d = None + if ok is None: + ascent, descent = self.lines[-1][5:7] + ok = self.right, self.bottom - ascent - descent, \ + self.bottom - descent, self.bottom + return ok + # + def _screenposword(self, tuple, word, h1, v1, h2, v2, isfirst, islast): + fo, te, wi, sp, st, as, de = word + if fo is not None: self.lastfont = fo + cc = len(te) + (sp > 0) + if self.pos > cc: + self.pos = self.pos - cc + return + if self.pos < cc: + self.d.setfont(self.lastfont) + h = h1 + self.d.textwidth(te[:self.pos]) + else: + h = h2 + ascent, descent = tuple[5:7] + return h, v1, v1+ascent, v2 + # + def _screenposanchor(self, tuple, word, h, v): + pass + # + # Invert the stretch of text between pos1 and pos2. + # If pos1 is None, the beginning is implied; + # if pos2 is None, the end is implied. + # Undoes its own effect when called again with the same arguments + def invert(self, d, pos1, pos2): + if pos1 is None: + pos1 = self.left, self.top, self.top, self.top + else: + pos1 = self.screenpos(d, pos1) + if pos2 is None: + pos2 = self.right, self.bottom,self.bottom,self.bottom + else: + pos2 = self.screenpos(d, pos2) + h1, top1, baseline1, bottom1 = pos1 + h2, top2, baseline2, bottom2 = pos2 + if bottom1 <= top2: + d.invert((h1, top1), (self.right, bottom1)) + h1 = self.left + if bottom1 < top2: + d.invert((h1, bottom1), (self.right, top2)) + top1, bottom1 = top2, bottom2 + d.invert((h1, top1), (h2, bottom2)) diff --git a/lib-python/2.2/lib-old/addpack.py b/lib-python/2.2/lib-old/addpack.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/addpack.py @@ -0,0 +1,67 @@ +# This module provides standard support for "packages". +# +# The idea is that large groups of related modules can be placed in +# their own subdirectory, which can be added to the Python search path +# in a relatively easy way. +# +# The current version takes a package name and searches the Python +# search path for a directory by that name, and if found adds it to +# the module search path (sys.path). It maintains a list of packages +# that have already been added so adding the same package many times +# is OK. +# +# It is intended to be used in a fairly stylized manner: each module +# that wants to use a particular package, say 'Foo', is supposed to +# contain the following code: +# +# from addpack import addpack +# addpack('Foo') +# +# +# Additional arguments, when present, provide additional places where +# to look for the package before trying sys.path (these may be either +# strings or lists/tuples of strings). Also, if the package name is a +# full pathname, first the last component is tried in the usual way, +# then the full pathname is tried last. If the package name is a +# *relative* pathname (UNIX: contains a slash but doesn't start with +# one), then nothing special is done. The packages "/foo/bar/bletch" +# and "bletch" are considered the same, but unrelated to "bar/bletch". +# +# If the algorithm finds more than one suitable subdirectory, all are +# added to the search path -- this makes it possible to override part +# of a package. The same path will not be added more than once. +# +# If no directory is found, ImportError is raised. + +_packs = {} # {pack: [pathname, ...], ...} + +def addpack(pack, *locations): + import os + if os.path.isabs(pack): + base = os.path.basename(pack) + else: + base = pack + if _packs.has_key(base): + return + import sys + path = [] + for loc in _flatten(locations) + sys.path: + fn = os.path.join(loc, base) + if fn not in path and os.path.isdir(fn): + path.append(fn) + if pack != base and pack not in path and os.path.isdir(pack): + path.append(pack) + if not path: raise ImportError, 'package ' + pack + ' not found' + _packs[base] = path + for fn in path: + if fn not in sys.path: + sys.path.append(fn) + +def _flatten(locations): + locs = [] + for loc in locations: + if type(loc) == type(''): + locs.append(loc) + else: + locs = locs + _flatten(loc) + return locs diff --git a/lib-python/2.2/lib-old/cmp.py b/lib-python/2.2/lib-old/cmp.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/cmp.py @@ -0,0 +1,63 @@ +"""Efficiently compare files, boolean outcome only (equal / not equal). + +Tricks (used in this order): + - Files with identical type, size & mtime are assumed to be clones + - Files with different type or size cannot be identical + - We keep a cache of outcomes of earlier comparisons + - We don't fork a process to run 'cmp' but read the files ourselves +""" + +import os + +cache = {} + +def cmp(f1, f2, shallow=1): + """Compare two files, use the cache if possible. + Return 1 for identical files, 0 for different. + Raise exceptions if either file could not be statted, read, etc.""" + s1, s2 = sig(os.stat(f1)), sig(os.stat(f2)) + if s1[0] != 8 or s2[0] != 8: + # Either is a not a plain file -- always report as different + return 0 + if shallow and s1 == s2: + # type, size & mtime match -- report same + return 1 + if s1[:2] != s2[:2]: # Types or sizes differ, don't bother + # types or sizes differ -- report different + return 0 + # same type and size -- look in the cache + key = (f1, f2) + try: + cs1, cs2, outcome = cache[key] + # cache hit + if s1 == cs1 and s2 == cs2: + # cached signatures match + return outcome + # stale cached signature(s) + except KeyError: + # cache miss + pass + # really compare + outcome = do_cmp(f1, f2) + cache[key] = s1, s2, outcome + return outcome + +def sig(st): + """Return signature (i.e., type, size, mtime) from raw stat data + 0-5: st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid + 6-9: st_size, st_atime, st_mtime, st_ctime""" + type = st[0] / 4096 + size = st[6] + mtime = st[8] + return type, size, mtime + +def do_cmp(f1, f2): + """Compare two files, really.""" + bufsize = 8*1024 # Could be tuned + fp1 = open(f1, 'rb') + fp2 = open(f2, 'rb') + while 1: + b1 = fp1.read(bufsize) + b2 = fp2.read(bufsize) + if b1 != b2: return 0 + if not b1: return 1 diff --git a/lib-python/2.2/lib-old/cmpcache.py b/lib-python/2.2/lib-old/cmpcache.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/cmpcache.py @@ -0,0 +1,64 @@ +"""Efficiently compare files, boolean outcome only (equal / not equal). + +Tricks (used in this order): + - Use the statcache module to avoid statting files more than once + - Files with identical type, size & mtime are assumed to be clones + - Files with different type or size cannot be identical + - We keep a cache of outcomes of earlier comparisons + - We don't fork a process to run 'cmp' but read the files ourselves +""" + +import os +from stat import * +import statcache + + +# The cache. +# +cache = {} + + +def cmp(f1, f2, shallow=1): + """Compare two files, use the cache if possible. + May raise os.error if a stat or open of either fails. + Return 1 for identical files, 0 for different. + Raise exceptions if either file could not be statted, read, etc.""" + s1, s2 = sig(statcache.stat(f1)), sig(statcache.stat(f2)) + if not S_ISREG(s1[0]) or not S_ISREG(s2[0]): + # Either is a not a plain file -- always report as different + return 0 + if shallow and s1 == s2: + # type, size & mtime match -- report same + return 1 + if s1[:2] != s2[:2]: # Types or sizes differ, don't bother + # types or sizes differ -- report different + return 0 + # same type and size -- look in the cache + key = f1 + ' ' + f2 + if cache.has_key(key): + cs1, cs2, outcome = cache[key] + # cache hit + if s1 == cs1 and s2 == cs2: + # cached signatures match + return outcome + # stale cached signature(s) + # really compare + outcome = do_cmp(f1, f2) + cache[key] = s1, s2, outcome + return outcome + +def sig(st): + """Return signature (i.e., type, size, mtime) from raw stat data.""" + return S_IFMT(st[ST_MODE]), st[ST_SIZE], st[ST_MTIME] + +def do_cmp(f1, f2): + """Compare two files, really.""" + #print ' cmp', f1, f2 # XXX remove when debugged + bufsize = 8*1024 # Could be tuned + fp1 = open(f1, 'rb') + fp2 = open(f2, 'rb') + while 1: + b1 = fp1.read(bufsize) + b2 = fp2.read(bufsize) + if b1 != b2: return 0 + if not b1: return 1 diff --git a/lib-python/2.2/lib-old/codehack.py b/lib-python/2.2/lib-old/codehack.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/codehack.py @@ -0,0 +1,81 @@ +# A subroutine for extracting a function name from a code object +# (with cache) + +import sys +from stat import * +import string +import os +import linecache + +# XXX The functions getcodename() and getfuncname() are now obsolete +# XXX as code and function objects now have a name attribute -- +# XXX co.co_name and f.func_name. +# XXX getlineno() is now also obsolete because of the new attribute +# XXX of code objects, co.co_firstlineno. + +# Extract the function or class name from a code object. +# This is a bit of a hack, since a code object doesn't contain +# the name directly. So what do we do: +# - get the filename (which *is* in the code object) +# - look in the code string to find the first SET_LINENO instruction +# (this must be the first instruction) +# - get the line from the file +# - if the line starts with 'class' or 'def' (after possible whitespace), +# extract the following identifier +# +# This breaks apart when the function was read from +# or constructed by exec(), when the file is not accessible, +# and also when the file has been modified or when a line is +# continued with a backslash before the function or class name. +# +# Because this is a pretty expensive hack, a cache is kept. + +SET_LINENO = 127 # The opcode (see "opcode.h" in the Python source) +identchars = string.ascii_letters + string.digits + '_' # Identifier characters + +_namecache = {} # The cache + +def getcodename(co): + try: + return co.co_name + except AttributeError: + pass + key = `co` # arbitrary but uniquely identifying string + if _namecache.has_key(key): return _namecache[key] + filename = co.co_filename + code = co.co_code + name = '' + if ord(code[0]) == SET_LINENO: + lineno = ord(code[1]) | ord(code[2]) << 8 + line = linecache.getline(filename, lineno) + words = line.split() + if len(words) >= 2 and words[0] in ('def', 'class'): + name = words[1] + for i in range(len(name)): + if name[i] not in identchars: + name = name[:i] + break + _namecache[key] = name + return name + +# Use the above routine to find a function's name. + +def getfuncname(func): + try: + return func.func_name + except AttributeError: + pass + return getcodename(func.func_code) + +# A part of the above code to extract just the line number from a code object. + +def getlineno(co): + try: + return co.co_firstlineno + except AttributeError: + pass + code = co.co_code + if ord(code[0]) == SET_LINENO: + return ord(code[1]) | ord(code[2]) << 8 + else: + return -1 diff --git a/lib-python/2.2/lib-old/dircmp.py b/lib-python/2.2/lib-old/dircmp.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/dircmp.py @@ -0,0 +1,202 @@ +"""A class to build directory diff tools on.""" + +import os + +import dircache +import cmpcache +import statcache +from stat import * + +class dircmp: + """Directory comparison class.""" + + def new(self, a, b): + """Initialize.""" + self.a = a + self.b = b + # Properties that caller may change before calling self.run(): + self.hide = [os.curdir, os.pardir] # Names never to be shown + self.ignore = ['RCS', 'tags'] # Names ignored in comparison + + return self + + def run(self): + """Compare everything except common subdirectories.""" + self.a_list = filter(dircache.listdir(self.a), self.hide) + self.b_list = filter(dircache.listdir(self.b), self.hide) + self.a_list.sort() + self.b_list.sort() + self.phase1() + self.phase2() + self.phase3() + + def phase1(self): + """Compute common names.""" + self.a_only = [] + self.common = [] + for x in self.a_list: + if x in self.b_list: + self.common.append(x) + else: + self.a_only.append(x) + + self.b_only = [] + for x in self.b_list: + if x not in self.common: + self.b_only.append(x) + + def phase2(self): + """Distinguish files, directories, funnies.""" + self.common_dirs = [] + self.common_files = [] + self.common_funny = [] + + for x in self.common: + a_path = os.path.join(self.a, x) + b_path = os.path.join(self.b, x) + + ok = 1 + try: + a_stat = statcache.stat(a_path) + except os.error, why: + # print 'Can\'t stat', a_path, ':', why[1] + ok = 0 + try: + b_stat = statcache.stat(b_path) + except os.error, why: + # print 'Can\'t stat', b_path, ':', why[1] + ok = 0 + + if ok: + a_type = S_IFMT(a_stat[ST_MODE]) + b_type = S_IFMT(b_stat[ST_MODE]) + if a_type != b_type: + self.common_funny.append(x) + elif S_ISDIR(a_type): + self.common_dirs.append(x) + elif S_ISREG(a_type): + self.common_files.append(x) + else: + self.common_funny.append(x) + else: + self.common_funny.append(x) + + def phase3(self): + """Find out differences between common files.""" + xx = cmpfiles(self.a, self.b, self.common_files) + self.same_files, self.diff_files, self.funny_files = xx + + def phase4(self): + """Find out differences between common subdirectories. + A new dircmp object is created for each common subdirectory, + these are stored in a dictionary indexed by filename. + The hide and ignore properties are inherited from the parent.""" + self.subdirs = {} + for x in self.common_dirs: + a_x = os.path.join(self.a, x) + b_x = os.path.join(self.b, x) + self.subdirs[x] = newdd = dircmp().new(a_x, b_x) + newdd.hide = self.hide + newdd.ignore = self.ignore + newdd.run() + + def phase4_closure(self): + """Recursively call phase4() on subdirectories.""" + self.phase4() + for x in self.subdirs.keys(): + self.subdirs[x].phase4_closure() + + def report(self): + """Print a report on the differences between a and b.""" + # Assume that phases 1 to 3 have been executed + # Output format is purposely lousy + print 'diff', self.a, self.b + if self.a_only: + print 'Only in', self.a, ':', self.a_only + if self.b_only: + print 'Only in', self.b, ':', self.b_only + if self.same_files: + print 'Identical files :', self.same_files + if self.diff_files: + print 'Differing files :', self.diff_files + if self.funny_files: + print 'Trouble with common files :', self.funny_files + if self.common_dirs: + print 'Common subdirectories :', self.common_dirs + if self.common_funny: + print 'Common funny cases :', self.common_funny + + def report_closure(self): + """Print reports on self and on subdirs. + If phase 4 hasn't been done, no subdir reports are printed.""" + self.report() + try: + x = self.subdirs + except AttributeError: + return # No subdirectories computed + for x in self.subdirs.keys(): + print + self.subdirs[x].report_closure() + + def report_phase4_closure(self): + """Report and do phase 4 recursively.""" + self.report() + self.phase4() + for x in self.subdirs.keys(): + print + self.subdirs[x].report_phase4_closure() + + +def cmpfiles(a, b, common): + """Compare common files in two directories. + Return: + - files that compare equal + - files that compare different + - funny cases (can't stat etc.)""" + + res = ([], [], []) + for x in common: + res[cmp(os.path.join(a, x), os.path.join(b, x))].append(x) + return res + + +def cmp(a, b): + """Compare two files. + Return: + 0 for equal + 1 for different + 2 for funny cases (can't stat, etc.)""" + + try: + if cmpcache.cmp(a, b): return 0 + return 1 + except os.error: + return 2 + + +def filter(list, skip): + """Return a copy with items that occur in skip removed.""" + + result = [] + for item in list: + if item not in skip: result.append(item) + return result + + +def demo(): + """Demonstration and testing.""" + + import sys + import getopt + options, args = getopt.getopt(sys.argv[1:], 'r') + if len(args) != 2: + raise getopt.error, 'need exactly two args' + dd = dircmp().new(args[0], args[1]) + dd.run() + if ('-r', '') in options: + dd.report_phase4_closure() + else: + dd.report() + +if __name__ == "__main__": + demo() diff --git a/lib-python/2.2/lib-old/dump.py b/lib-python/2.2/lib-old/dump.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/dump.py @@ -0,0 +1,63 @@ +# Module 'dump' +# +# Print python code that reconstructs a variable. +# This only works in certain cases. +# +# It works fine for: +# - ints and floats (except NaNs and other weird things) +# - strings +# - compounds and lists, provided it works for all their elements +# - imported modules, provided their name is the module name +# +# It works for top-level dictionaries but not for dictionaries +# contained in other objects (could be made to work with some hassle +# though). +# +# It does not work for functions (all sorts), classes, class objects, +# windows, files etc. +# +# Finally, objects referenced by more than one name or contained in more +# than one other object lose their sharing property (this is bad for +# strings used as exception identifiers, for instance). + +# Dump a whole symbol table +# +def dumpsymtab(dict): + for key in dict.keys(): + dumpvar(key, dict[key]) + +# Dump a single variable +# +def dumpvar(name, x): + import sys + t = type(x) + if t == type({}): + print name, '= {}' + for key in x.keys(): + item = x[key] + if not printable(item): + print '#', + print name, '[', `key`, '] =', `item` + elif t in (type(''), type(0), type(0.0), type([]), type(())): + if not printable(x): + print '#', + print name, '=', `x` + elif t == type(sys): + print 'import', name, '#', x + else: + print '#', name, '=', x + +# check if a value is printable in a way that can be read back with input() +# +def printable(x): + t = type(x) + if t in (type(''), type(0), type(0.0)): + return 1 + if t in (type([]), type(())): + for item in x: + if not printable(item): + return 0 + return 1 + if x == {}: + return 1 + return 0 diff --git a/lib-python/2.2/lib-old/find.py b/lib-python/2.2/lib-old/find.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/find.py @@ -0,0 +1,26 @@ +import fnmatch +import os + +_debug = 0 + +_prune = ['(*)'] + +def find(pattern, dir = os.curdir): + list = [] + names = os.listdir(dir) + names.sort() + for name in names: + if name in (os.curdir, os.pardir): + continue + fullname = os.path.join(dir, name) + if fnmatch.fnmatch(name, pattern): + list.append(fullname) + if os.path.isdir(fullname) and not os.path.islink(fullname): + for p in _prune: + if fnmatch.fnmatch(name, p): + if _debug: print "skip", `fullname` + break + else: + if _debug: print "descend into", `fullname` + list = list + find(pattern, fullname) + return list diff --git a/lib-python/2.2/lib-old/fmt.py b/lib-python/2.2/lib-old/fmt.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/fmt.py @@ -0,0 +1,623 @@ +# Text formatting abstractions +# Note -- this module is obsolete, it's too slow anyway + + +import string +import Para + + +# A formatter back-end object has one method that is called by the formatter: +# addpara(p), where p is a paragraph object. For example: + + +# Formatter back-end to do nothing at all with the paragraphs +class NullBackEnd: + # + def __init__(self): + pass + # + def addpara(self, p): + pass + # + def bgn_anchor(self, id): + pass + # + def end_anchor(self, id): + pass + + +# Formatter back-end to collect the paragraphs in a list +class SavingBackEnd(NullBackEnd): + # + def __init__(self): + self.paralist = [] + # + def addpara(self, p): + self.paralist.append(p) + # + def hitcheck(self, h, v): + hits = [] + for p in self.paralist: + if p.top <= v <= p.bottom: + for id in p.hitcheck(h, v): + if id not in hits: + hits.append(id) + return hits + # + def extract(self): + text = '' + for p in self.paralist: + text = text + (p.extract()) + return text + # + def extractpart(self, long1, long2): + if long1 > long2: long1, long2 = long2, long1 + para1, pos1 = long1 + para2, pos2 = long2 + text = '' + while para1 < para2: + ptext = self.paralist[para1].extract() + text = text + ptext[pos1:] + pos1 = 0 + para1 = para1 + 1 + ptext = self.paralist[para2].extract() + return text + ptext[pos1:pos2] + # + def whereis(self, d, h, v): + total = 0 + for i in range(len(self.paralist)): + p = self.paralist[i] + result = p.whereis(d, h, v) + if result is not None: + return i, result + return None + # + def roundtowords(self, long1, long2): + i, offset = long1 + text = self.paralist[i].extract() + while offset > 0 and text[offset-1] != ' ': offset = offset-1 + long1 = i, offset + # + i, offset = long2 + text = self.paralist[i].extract() + n = len(text) + while offset < n-1 and text[offset] != ' ': offset = offset+1 + long2 = i, offset + # + return long1, long2 + # + def roundtoparagraphs(self, long1, long2): + long1 = long1[0], 0 + long2 = long2[0], len(self.paralist[long2[0]].extract()) + return long1, long2 + + +# Formatter back-end to send the text directly to the drawing object +class WritingBackEnd(NullBackEnd): + # + def __init__(self, d, width): + self.d = d + self.width = width + self.lineno = 0 + # + def addpara(self, p): + self.lineno = p.render(self.d, 0, self.lineno, self.width) + + +# A formatter receives a stream of formatting instructions and assembles +# these into a stream of paragraphs on to a back-end. The assembly is +# parametrized by a text measurement object, which must match the output +# operations of the back-end. The back-end is responsible for splitting +# paragraphs up in lines of a given maximum width. (This is done because +# in a windowing environment, when the window size changes, there is no +# need to redo the assembly into paragraphs, but the splitting into lines +# must be done taking the new window size into account.) + + +# Formatter base class. Initialize it with a text measurement object, +# which is used for text measurements, and a back-end object, +# which receives the completed paragraphs. The formatting methods are: +# setfont(font) +# setleftindent(nspaces) +# setjust(type) where type is 'l', 'c', 'r', or 'lr' +# flush() +# vspace(nlines) +# needvspace(nlines) +# addword(word, nspaces) +class BaseFormatter: + # + def __init__(self, d, b): + # Drawing object used for text measurements + self.d = d + # + # BackEnd object receiving completed paragraphs + self.b = b + # + # Parameters of the formatting model + self.leftindent = 0 + self.just = 'l' + self.font = None + self.blanklines = 0 + # + # Parameters derived from the current font + self.space = d.textwidth(' ') + self.line = d.lineheight() + self.ascent = d.baseline() + self.descent = self.line - self.ascent + # + # Parameter derived from the default font + self.n_space = self.space + # + # Current paragraph being built + self.para = None + self.nospace = 1 + # + # Font to set on the next word + self.nextfont = None + # + def newpara(self): + return Para.Para() + # + def setfont(self, font): + if font is None: return + self.font = self.nextfont = font + d = self.d + d.setfont(font) + self.space = d.textwidth(' ') + self.line = d.lineheight() + self.ascent = d.baseline() + self.descent = self.line - self.ascent + # + def setleftindent(self, nspaces): + self.leftindent = int(self.n_space * nspaces) + if self.para: + hang = self.leftindent - self.para.indent_left + if hang > 0 and self.para.getlength() <= hang: + self.para.makehangingtag(hang) + self.nospace = 1 + else: + self.flush() + # + def setrightindent(self, nspaces): + self.rightindent = int(self.n_space * nspaces) + if self.para: + self.para.indent_right = self.rightindent + self.flush() + # + def setjust(self, just): + self.just = just + if self.para: + self.para.just = self.just + # + def flush(self): + if self.para: + self.b.addpara(self.para) + self.para = None + if self.font is not None: + self.d.setfont(self.font) + self.nospace = 1 + # + def vspace(self, nlines): + self.flush() + if nlines > 0: + self.para = self.newpara() + tuple = None, '', 0, 0, 0, int(nlines*self.line), 0 + self.para.words.append(tuple) + self.flush() + self.blanklines = self.blanklines + nlines + # + def needvspace(self, nlines): + self.flush() # Just to be sure + if nlines > self.blanklines: + self.vspace(nlines - self.blanklines) + # + def addword(self, text, space): + if self.nospace and not text: + return + self.nospace = 0 + self.blanklines = 0 + if not self.para: + self.para = self.newpara() + self.para.indent_left = self.leftindent + self.para.just = self.just + self.nextfont = self.font + space = int(space * self.space) + self.para.words.append((self.nextfont, text, + self.d.textwidth(text), space, space, + self.ascent, self.descent)) + self.nextfont = None + # + def bgn_anchor(self, id): + if not self.para: + self.nospace = 0 + self.addword('', 0) + self.para.bgn_anchor(id) + # + def end_anchor(self, id): + if not self.para: + self.nospace = 0 + self.addword('', 0) + self.para.end_anchor(id) + + +# Measuring object for measuring text as viewed on a tty +class NullMeasurer: + # + def __init__(self): + pass + # + def setfont(self, font): + pass + # + def textwidth(self, text): + return len(text) + # + def lineheight(self): + return 1 + # + def baseline(self): + return 0 + + +# Drawing object for writing plain ASCII text to a file +class FileWriter: + # + def __init__(self, fp): + self.fp = fp + self.lineno, self.colno = 0, 0 + # + def setfont(self, font): + pass + # + def text(self, (h, v), str): + if not str: return + if '\n' in str: + raise ValueError, 'can\'t write \\n' + while self.lineno < v: + self.fp.write('\n') + self.colno, self.lineno = 0, self.lineno + 1 + while self.lineno > v: + # XXX This should never happen... + self.fp.write('\033[A') # ANSI up arrow + self.lineno = self.lineno - 1 + if self.colno < h: + self.fp.write(' ' * (h - self.colno)) + elif self.colno > h: + self.fp.write('\b' * (self.colno - h)) + self.colno = h + self.fp.write(str) + self.colno = h + len(str) + + +# Formatting class to do nothing at all with the data +class NullFormatter(BaseFormatter): + # + def __init__(self): + d = NullMeasurer() + b = NullBackEnd() + BaseFormatter.__init__(self, d, b) + + +# Formatting class to write directly to a file +class WritingFormatter(BaseFormatter): + # + def __init__(self, fp, width): + dm = NullMeasurer() + dw = FileWriter(fp) + b = WritingBackEnd(dw, width) + BaseFormatter.__init__(self, dm, b) + self.blanklines = 1 + # + # Suppress multiple blank lines + def needvspace(self, nlines): + BaseFormatter.needvspace(self, min(1, nlines)) + + +# A "FunnyFormatter" writes ASCII text with a twist: *bold words*, +# _italic text_ and _underlined words_, and `quoted text'. +# It assumes that the fonts are 'r', 'i', 'b', 'u', 'q': (roman, +# italic, bold, underline, quote). +# Moreover, if the font is in upper case, the text is converted to +# UPPER CASE. +class FunnyFormatter(WritingFormatter): + # + def flush(self): + if self.para: finalize(self.para) + WritingFormatter.flush(self) + + +# Surrounds *bold words* and _italic text_ in a paragraph with +# appropriate markers, fixing the size (assuming these characters' +# width is 1). +openchar = \ + {'b':'*', 'i':'_', 'u':'_', 'q':'`', 'B':'*', 'I':'_', 'U':'_', 'Q':'`'} +closechar = \ + {'b':'*', 'i':'_', 'u':'_', 'q':'\'', 'B':'*', 'I':'_', 'U':'_', 'Q':'\''} +def finalize(para): + oldfont = curfont = 'r' + para.words.append(('r', '', 0, 0, 0, 0)) # temporary, deleted at end + for i in range(len(para.words)): + fo, te, wi = para.words[i][:3] + if fo is not None: curfont = fo + if curfont != oldfont: + if closechar.has_key(oldfont): + c = closechar[oldfont] + j = i-1 + while j > 0 and para.words[j][1] == '': j = j-1 + fo1, te1, wi1 = para.words[j][:3] + te1 = te1 + c + wi1 = wi1 + len(c) + para.words[j] = (fo1, te1, wi1) + \ + para.words[j][3:] + if openchar.has_key(curfont) and te: + c = openchar[curfont] + te = c + te + wi = len(c) + wi + para.words[i] = (fo, te, wi) + \ + para.words[i][3:] + if te: oldfont = curfont + else: oldfont = 'r' + if curfont in string.uppercase: + te = string.upper(te) + para.words[i] = (fo, te, wi) + para.words[i][3:] + del para.words[-1] + + +# Formatter back-end to draw the text in a window. +# This has an option to draw while the paragraphs are being added, +# to minimize the delay before the user sees anything. +# This manages the entire "document" of the window. +class StdwinBackEnd(SavingBackEnd): + # + def __init__(self, window, drawnow): + self.window = window + self.drawnow = drawnow + self.width = window.getwinsize()[0] + self.selection = None + self.height = 0 + window.setorigin(0, 0) + window.setdocsize(0, 0) + self.d = window.begindrawing() + SavingBackEnd.__init__(self) + # + def finish(self): + self.d.close() + self.d = None + self.window.setdocsize(0, self.height) + # + def addpara(self, p): + self.paralist.append(p) + if self.drawnow: + self.height = \ + p.render(self.d, 0, self.height, self.width) + else: + p.layout(self.width) + p.left = 0 + p.top = self.height + p.right = self.width + p.bottom = self.height + p.height + self.height = p.bottom + # + def resize(self): + self.window.change((0, 0), (self.width, self.height)) + self.width = self.window.getwinsize()[0] + self.height = 0 + for p in self.paralist: + p.layout(self.width) + p.left = 0 + p.top = self.height + p.right = self.width + p.bottom = self.height + p.height + self.height = p.bottom + self.window.change((0, 0), (self.width, self.height)) + self.window.setdocsize(0, self.height) + # + def redraw(self, area): + d = self.window.begindrawing() + (left, top), (right, bottom) = area + d.erase(area) + d.cliprect(area) + for p in self.paralist: + if top < p.bottom and p.top < bottom: + v = p.render(d, p.left, p.top, p.right) + if self.selection: + self.invert(d, self.selection) + d.close() + # + def setselection(self, new): + if new: + long1, long2 = new + pos1 = long1[:3] + pos2 = long2[:3] + new = pos1, pos2 + if new != self.selection: + d = self.window.begindrawing() + if self.selection: + self.invert(d, self.selection) + if new: + self.invert(d, new) + d.close() + self.selection = new + # + def getselection(self): + return self.selection + # + def extractselection(self): + if self.selection: + a, b = self.selection + return self.extractpart(a, b) + else: + return None + # + def invert(self, d, region): + long1, long2 = region + if long1 > long2: long1, long2 = long2, long1 + para1, pos1 = long1 + para2, pos2 = long2 + while para1 < para2: + self.paralist[para1].invert(d, pos1, None) + pos1 = None + para1 = para1 + 1 + self.paralist[para2].invert(d, pos1, pos2) + # + def search(self, prog): + import re, string + if type(prog) is type(''): + prog = re.compile(string.lower(prog)) + if self.selection: + iold = self.selection[0][0] + else: + iold = -1 + hit = None + for i in range(len(self.paralist)): + if i == iold or i < iold and hit: + continue + p = self.paralist[i] + text = string.lower(p.extract()) + match = prog.search(text) + if match: + a, b = match.group(0) + long1 = i, a + long2 = i, b + hit = long1, long2 + if i > iold: + break + if hit: + self.setselection(hit) + i = hit[0][0] + p = self.paralist[i] + self.window.show((p.left, p.top), (p.right, p.bottom)) + return 1 + else: + return 0 + # + def showanchor(self, id): + for i in range(len(self.paralist)): + p = self.paralist[i] + if p.hasanchor(id): + long1 = i, 0 + long2 = i, len(p.extract()) + hit = long1, long2 + self.setselection(hit) + self.window.show( + (p.left, p.top), (p.right, p.bottom)) + break + + +# GL extensions + +class GLFontCache: + # + def __init__(self): + self.reset() + self.setfont('') + # + def reset(self): + self.fontkey = None + self.fonthandle = None + self.fontinfo = None + self.fontcache = {} + # + def close(self): + self.reset() + # + def setfont(self, fontkey): + if fontkey == '': + fontkey = 'Times-Roman 12' + elif ' ' not in fontkey: + fontkey = fontkey + ' 12' + if fontkey == self.fontkey: + return + if self.fontcache.has_key(fontkey): + handle = self.fontcache[fontkey] + else: + import string + i = string.index(fontkey, ' ') + name, sizestr = fontkey[:i], fontkey[i:] + size = eval(sizestr) + key1 = name + ' 1' + key = name + ' ' + `size` + # NB key may differ from fontkey! + if self.fontcache.has_key(key): + handle = self.fontcache[key] + else: + if self.fontcache.has_key(key1): + handle = self.fontcache[key1] + else: + import fm + handle = fm.findfont(name) + self.fontcache[key1] = handle + handle = handle.scalefont(size) + self.fontcache[fontkey] = \ + self.fontcache[key] = handle + self.fontkey = fontkey + if self.fonthandle != handle: + self.fonthandle = handle + self.fontinfo = handle.getfontinfo() + handle.setfont() + + +class GLMeasurer(GLFontCache): + # + def textwidth(self, text): + return self.fonthandle.getstrwidth(text) + # + def baseline(self): + return self.fontinfo[6] - self.fontinfo[3] + # + def lineheight(self): + return self.fontinfo[6] + + +class GLWriter(GLFontCache): + # + # NOTES: + # (1) Use gl.ortho2 to use X pixel coordinates! + # + def text(self, (h, v), text): + import gl, fm + gl.cmov2i(h, v + self.fontinfo[6] - self.fontinfo[3]) + fm.prstr(text) + # + def setfont(self, fontkey): + oldhandle = self.fonthandle + GLFontCache.setfont(fontkey) + if self.fonthandle != oldhandle: + handle.setfont() + + +class GLMeasurerWriter(GLMeasurer, GLWriter): + pass + + +class GLBackEnd(SavingBackEnd): + # + def __init__(self, wid): + import gl + gl.winset(wid) + self.wid = wid + self.width = gl.getsize()[1] + self.height = 0 + self.d = GLMeasurerWriter() + SavingBackEnd.__init__(self) + # + def finish(self): + pass + # + def addpara(self, p): + self.paralist.append(p) + self.height = p.render(self.d, 0, self.height, self.width) + # + def redraw(self): + import gl + gl.winset(self.wid) + width = gl.getsize()[1] + if width != self.width: + setdocsize = 1 + self.width = width + for p in self.paralist: + p.top = p.bottom = None + d = self.d + v = 0 + for p in self.paralist: + v = p.render(d, 0, v, width) diff --git a/lib-python/2.2/lib-old/grep.py b/lib-python/2.2/lib-old/grep.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/grep.py @@ -0,0 +1,79 @@ +# 'grep' + +import regex +from regex_syntax import * + +opt_show_where = 0 +opt_show_filename = 0 +opt_show_lineno = 1 + +def grep(pat, *files): + return ggrep(RE_SYNTAX_GREP, pat, files) + +def egrep(pat, *files): + return ggrep(RE_SYNTAX_EGREP, pat, files) + +def emgrep(pat, *files): + return ggrep(RE_SYNTAX_EMACS, pat, files) + +def ggrep(syntax, pat, files): + if len(files) == 1 and type(files[0]) == type([]): + files = files[0] + global opt_show_filename + opt_show_filename = (len(files) != 1) + syntax = regex.set_syntax(syntax) + try: + prog = regex.compile(pat) + finally: + syntax = regex.set_syntax(syntax) + for filename in files: + fp = open(filename, 'r') + lineno = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + if prog.search(line) >= 0: + showline(filename, lineno, line, prog) + fp.close() + +def pgrep(pat, *files): + if len(files) == 1 and type(files[0]) == type([]): + files = files[0] + global opt_show_filename + opt_show_filename = (len(files) != 1) + import re + prog = re.compile(pat) + for filename in files: + fp = open(filename, 'r') + lineno = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + if prog.search(line): + showline(filename, lineno, line, prog) + fp.close() + +def showline(filename, lineno, line, prog): + if line[-1:] == '\n': line = line[:-1] + if opt_show_lineno: + prefix = `lineno`.rjust(3) + ': ' + else: + prefix = '' + if opt_show_filename: + prefix = filename + ': ' + prefix + print prefix + line + if opt_show_where: + start, end = prog.regs()[0] + line = line[:start] + if '\t' not in line: + prefix = ' ' * (len(prefix) + start) + else: + prefix = ' ' * len(prefix) + for c in line: + if c != '\t': c = ' ' + prefix = prefix + c + if start == end: prefix = prefix + '\\' + else: prefix = prefix + '^'*(end-start) + print prefix diff --git a/lib-python/2.2/lib-old/lockfile.py b/lib-python/2.2/lib-old/lockfile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/lockfile.py @@ -0,0 +1,15 @@ +import struct, fcntl + +def writelock(f): + _lock(f, fcntl.F_WRLCK) + +def readlock(f): + _lock(f, fcntl.F_RDLCK) + +def unlock(f): + _lock(f, fcntl.F_UNLCK) + +def _lock(f, op): + dummy = fcntl.fcntl(f.fileno(), fcntl.F_SETLKW, + struct.pack('2h8l', op, + 0, 0, 0, 0, 0, 0, 0, 0, 0)) diff --git a/lib-python/2.2/lib-old/newdir.py b/lib-python/2.2/lib-old/newdir.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/newdir.py @@ -0,0 +1,73 @@ +# New dir() function + + +# This should be the new dir(), except that it should still list +# the current local name space by default + +def listattrs(x): + try: + dictkeys = x.__dict__.keys() + except (AttributeError, TypeError): + dictkeys = [] + # + try: + methods = x.__methods__ + except (AttributeError, TypeError): + methods = [] + # + try: + members = x.__members__ + except (AttributeError, TypeError): + members = [] + # + try: + the_class = x.__class__ + except (AttributeError, TypeError): + the_class = None + # + try: + bases = x.__bases__ + except (AttributeError, TypeError): + bases = () + # + total = dictkeys + methods + members + if the_class: + # It's a class instace; add the class's attributes + # that are functions (methods)... + class_attrs = listattrs(the_class) + class_methods = [] + for name in class_attrs: + if is_function(getattr(the_class, name)): + class_methods.append(name) + total = total + class_methods + elif bases: + # It's a derived class; add the base class attributes + for base in bases: + base_attrs = listattrs(base) + total = total + base_attrs + total.sort() + return total + i = 0 + while i+1 < len(total): + if total[i] == total[i+1]: + del total[i+1] + else: + i = i+1 + return total + + +# Helper to recognize functions + +def is_function(x): + return type(x) == type(is_function) + + +# Approximation of builtin dir(); but note that this lists the user's +# variables by default, not the current local name space. + +def dir(x = None): + if x is not None: + return listattrs(x) + else: + import __main__ + return listattrs(__main__) diff --git a/lib-python/2.2/lib-old/ni.py b/lib-python/2.2/lib-old/ni.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/ni.py @@ -0,0 +1,433 @@ +"""New import scheme with package support. + +Quick Reference +--------------- + +- To enable package support, execute "import ni" before importing any + packages. Importing this module automatically installs the relevant + import hooks. + +- To create a package named spam containing sub-modules ham, bacon and + eggs, create a directory spam somewhere on Python's module search + path (i.e. spam's parent directory must be one of the directories in + sys.path or $PYTHONPATH); then create files ham.py, bacon.py and + eggs.py inside spam. + +- To import module ham from package spam and use function hamneggs() + from that module, you can either do + + import spam.ham # *not* "import spam" !!! + spam.ham.hamneggs() + + or + + from spam import ham + ham.hamneggs() + + or + + from spam.ham import hamneggs + hamneggs() + +- Importing just "spam" does not do what you expect: it creates an + empty package named spam if one does not already exist, but it does + not import spam's submodules. The only submodule that is guaranteed + to be imported is spam.__init__, if it exists. Note that + spam.__init__ is a submodule of package spam. It can reference to + spam's namespace via the '__.' prefix, for instance + + __.spam_inited = 1 # Set a package-level variable + + + +Theory of Operation +------------------- + +A Package is a module that can contain other modules. Packages can be +nested. Package introduce dotted names for modules, like P.Q.M, which +could correspond to a file P/Q/M.py found somewhere on sys.path. It +is possible to import a package itself, though this makes little sense +unless the package contains a module called __init__. + +A package has two variables that control the namespace used for +packages and modules, both initialized to sensible defaults the first +time the package is referenced. + +(1) A package's *module search path*, contained in the per-package +variable __path__, defines a list of *directories* where submodules or +subpackages of the package are searched. It is initialized to the +directory containing the package. Setting this variable to None makes +the module search path default to sys.path (this is not quite the same +as setting it to sys.path, since the latter won't track later +assignments to sys.path). + +(2) A package's *import domain*, contained in the per-package variable +__domain__, defines a list of *packages* that are searched (using +their respective module search paths) to satisfy imports. It is +initialized to the list consisting of the package itself, its parent +package, its parent's parent, and so on, ending with the root package +(the nameless package containing all top-level packages and modules, +whose module search path is None, implying sys.path). + +The default domain implements a search algorithm called "expanding +search". An alternative search algorithm called "explicit search" +fixes the import search path to contain only the root package, +requiring the modules in the package to name all imported modules by +their full name. The convention of using '__' to refer to the current +package (both as a per-module variable and in module names) can be +used by packages using explicit search to refer to modules in the same +package; this combination is known as "explicit-relative search". + +The PackageImporter and PackageLoader classes together implement the +following policies: + +- There is a root package, whose name is ''. It cannot be imported + directly but may be referenced, e.g. by using '__' from a top-level + module. + +- In each module or package, the variable '__' contains a reference to + the parent package; in the root package, '__' points to itself. + +- In the name for imported modules (e.g. M in "import M" or "from M + import ..."), a leading '__' refers to the current package (i.e. + the package containing the current module); leading '__.__' and so + on refer to the current package's parent, and so on. The use of + '__' elsewhere in the module name is not supported. + +- Modules are searched using the "expanding search" algorithm by + virtue of the default value for __domain__. + +- If A.B.C is imported, A is searched using __domain__; then + subpackage B is searched in A using its __path__, and so on. + +- Built-in modules have priority: even if a file sys.py exists in a + package, "import sys" imports the built-in sys module. + +- The same holds for frozen modules, for better or for worse. + +- Submodules and subpackages are not automatically loaded when their + parent packages is loaded. + +- The construct "from package import *" is illegal. (It can still be + used to import names from a module.) + +- When "from package import module1, module2, ..." is used, those + modules are explicitly loaded. + +- When a package is loaded, if it has a submodule __init__, that + module is loaded. This is the place where required submodules can + be loaded, the __path__ variable extended, etc. The __init__ module + is loaded even if the package was loaded only in order to create a + stub for a sub-package: if "import P.Q.R" is the first reference to + P, and P has a submodule __init__, P.__init__ is loaded before P.Q + is even searched. + +Caveats: + +- It is possible to import a package that has no __init__ submodule; + this is not particularly useful but there may be useful applications + for it (e.g. to manipulate its search paths from the outside!). + +- There are no special provisions for os.chdir(). If you plan to use + os.chdir() before you have imported all your modules, it is better + not to have relative pathnames in sys.path. (This could actually be + fixed by changing the implementation of path_join() in the hook to + absolutize paths.) + +- Packages and modules are introduced in sys.modules as soon as their + loading is started. When the loading is terminated by an exception, + the sys.modules entries remain around. + +- There are no special measures to support mutually recursive modules, + but it will work under the same conditions where it works in the + flat module space system. + +- Sometimes dummy entries (whose value is None) are entered in + sys.modules, to indicate that a particular module does not exist -- + this is done to speed up the expanding search algorithm when a + module residing at a higher level is repeatedly imported (Python + promises that importing a previously imported module is cheap!) + +- Although dynamically loaded extensions are allowed inside packages, + the current implementation (hardcoded in the interpreter) of their + initialization may cause problems if an extension invokes the + interpreter during its initialization. + +- reload() may find another version of the module only if it occurs on + the package search path. Thus, it keeps the connection to the + package to which the module belongs, but may find a different file. + +XXX Need to have an explicit name for '', e.g. '__root__'. + +""" + + +import imp +import sys +import __builtin__ + +import ihooks +from ihooks import ModuleLoader, ModuleImporter + + +class PackageLoader(ModuleLoader): + + """A subclass of ModuleLoader with package support. + + find_module_in_dir() will succeed if there's a subdirectory with + the given name; load_module() will create a stub for a package and + load its __init__ module if it exists. + + """ + + def find_module_in_dir(self, name, dir): + if dir is not None: + dirname = self.hooks.path_join(dir, name) + if self.hooks.path_isdir(dirname): + return None, dirname, ('', '', 'PACKAGE') + return ModuleLoader.find_module_in_dir(self, name, dir) + + def load_module(self, name, stuff): + file, filename, info = stuff + suff, mode, type = info + if type == 'PACKAGE': + return self.load_package(name, stuff) + if sys.modules.has_key(name): + m = sys.modules[name] + else: + sys.modules[name] = m = imp.new_module(name) + self.set_parent(m) + if type == imp.C_EXTENSION and '.' in name: + return self.load_dynamic(name, stuff) + else: + return ModuleLoader.load_module(self, name, stuff) + + def load_dynamic(self, name, stuff): + file, filename, (suff, mode, type) = stuff + # Hack around restriction in imp.load_dynamic() + i = name.rfind('.') + tail = name[i+1:] + if sys.modules.has_key(tail): + save = sys.modules[tail] + else: + save = None + sys.modules[tail] = imp.new_module(name) + try: + m = imp.load_dynamic(tail, filename, file) + finally: + if save: + sys.modules[tail] = save + else: + del sys.modules[tail] + sys.modules[name] = m + return m + + def load_package(self, name, stuff): + file, filename, info = stuff + if sys.modules.has_key(name): + package = sys.modules[name] + else: + sys.modules[name] = package = imp.new_module(name) + package.__path__ = [filename] + self.init_package(package) + return package + + def init_package(self, package): + self.set_parent(package) + self.set_domain(package) + self.call_init_module(package) + + def set_parent(self, m): + name = m.__name__ + if '.' in name: + name = name[:name.rfind('.')] + else: + name = '' + m.__ = sys.modules[name] + + def set_domain(self, package): + name = package.__name__ + package.__domain__ = domain = [name] + while '.' in name: + name = name[:name.rfind('.')] + domain.append(name) + if name: + domain.append('') + + def call_init_module(self, package): + stuff = self.find_module('__init__', package.__path__) + if stuff: + m = self.load_module(package.__name__ + '.__init__', stuff) + package.__init__ = m + + +class PackageImporter(ModuleImporter): + + """Importer that understands packages and '__'.""" + + def __init__(self, loader = None, verbose = 0): + ModuleImporter.__init__(self, + loader or PackageLoader(None, verbose), verbose) + + def import_module(self, name, globals={}, locals={}, fromlist=[]): + if globals.has_key('__'): + package = globals['__'] + else: + # No calling context, assume in root package + package = sys.modules[''] + if name[:3] in ('__.', '__'): + p = package + name = name[3:] + while name[:3] in ('__.', '__'): + p = p.__ + name = name[3:] + if not name: + return self.finish(package, p, '', fromlist) + if '.' in name: + i = name.find('.') + name, tail = name[:i], name[i:] + else: + tail = '' + mname = p.__name__ and p.__name__+'.'+name or name + m = self.get1(mname) + return self.finish(package, m, tail, fromlist) + if '.' in name: + i = name.find('.') + name, tail = name[:i], name[i:] + else: + tail = '' + for pname in package.__domain__: + mname = pname and pname+'.'+name or name + m = self.get0(mname) + if m: break + else: + raise ImportError, "No such module %s" % name + return self.finish(m, m, tail, fromlist) + + def finish(self, module, m, tail, fromlist): + # Got ....A; now get ....A.B.C.D + yname = m.__name__ + if tail and sys.modules.has_key(yname + tail): # Fast path + yname, tail = yname + tail, '' + m = self.get1(yname) + while tail: + i = tail.find('.', 1) + if i > 0: + head, tail = tail[:i], tail[i:] + else: + head, tail = tail, '' + yname = yname + head + m = self.get1(yname) + + # Got ....A.B.C.D; now finalize things depending on fromlist + if not fromlist: + return module + if '__' in fromlist: + raise ImportError, "Can't import __ from anywhere" + if not hasattr(m, '__path__'): return m + if '*' in fromlist: + raise ImportError, "Can't import * from a package" + for f in fromlist: + if hasattr(m, f): continue + fname = yname + '.' + f + self.get1(fname) + return m + + def get1(self, name): + m = self.get(name) + if not m: + raise ImportError, "No module named %s" % name + return m + + def get0(self, name): + m = self.get(name) + if not m: + sys.modules[name] = None + return m + + def get(self, name): + # Internal routine to get or load a module when its parent exists + if sys.modules.has_key(name): + return sys.modules[name] + if '.' in name: + i = name.rfind('.') + head, tail = name[:i], name[i+1:] + else: + head, tail = '', name + path = sys.modules[head].__path__ + stuff = self.loader.find_module(tail, path) + if not stuff: + return None + sys.modules[name] = m = self.loader.load_module(name, stuff) + if head: + setattr(sys.modules[head], tail, m) + return m + + def reload(self, module): + name = module.__name__ + if '.' in name: + i = name.rfind('.') + head, tail = name[:i], name[i+1:] + path = sys.modules[head].__path__ + else: + tail = name + path = sys.modules[''].__path__ + stuff = self.loader.find_module(tail, path) + if not stuff: + raise ImportError, "No module named %s" % name + return self.loader.load_module(name, stuff) + + def unload(self, module): + if hasattr(module, '__path__'): + raise ImportError, "don't know how to unload packages yet" + PackageImporter.unload(self, module) + + def install(self): + if not sys.modules.has_key(''): + sys.modules[''] = package = imp.new_module('') + package.__path__ = None + self.loader.init_package(package) + for m in sys.modules.values(): + if not m: continue + if not hasattr(m, '__'): + self.loader.set_parent(m) + ModuleImporter.install(self) + + +def install(v = 0): + ihooks.install(PackageImporter(None, v)) + +def uninstall(): + ihooks.uninstall() + +def ni(v = 0): + install(v) + +def no(): + uninstall() + +def test(): + import pdb + try: + testproper() + except: + sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info() + print + print sys.last_type, ':', sys.last_value + print + pdb.pm() + +def testproper(): + install(1) + try: + import mactest + print dir(mactest) + raw_input('OK?') + finally: + uninstall() + + +if __name__ == '__main__': + test() +else: + install() diff --git a/lib-python/2.2/lib-old/packmail.py b/lib-python/2.2/lib-old/packmail.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/packmail.py @@ -0,0 +1,111 @@ +# Module 'packmail' -- create a self-unpacking shell archive. + +# This module works on UNIX and on the Mac; the archives can unpack +# themselves only on UNIX. + +import os +from stat import ST_MTIME + +# Print help +def help(): + print 'All fns have a file open for writing as first parameter' + print 'pack(f, fullname, name): pack fullname as name' + print 'packsome(f, directory, namelist): selected files from directory' + print 'packall(f, directory): pack all files from directory' + print 'packnotolder(f, directory, name): pack all files from directory' + print ' that are not older than a file there' + print 'packtree(f, directory): pack entire directory tree' + +# Pack one file +def pack(outfp, file, name): + fp = open(file, 'r') + outfp.write('echo ' + name + '\n') + outfp.write('sed "s/^X//" >"' + name + '" <<"!"\n') + while 1: + line = fp.readline() + if not line: break + if line[-1:] != '\n': + line = line + '\n' + outfp.write('X' + line) + outfp.write('!\n') + fp.close() + +# Pack some files from a directory +def packsome(outfp, dirname, names): + for name in names: + print name + file = os.path.join(dirname, name) + pack(outfp, file, name) + +# Pack all files from a directory +def packall(outfp, dirname): + names = os.listdir(dirname) + try: + names.remove('.') + except: + pass + try: + names.remove('..') + except: + pass + names.sort() + packsome(outfp, dirname, names) + +# Pack all files from a directory that are not older than a give one +def packnotolder(outfp, dirname, oldest): + names = os.listdir(dirname) + try: + names.remove('.') + except: + pass + try: + names.remove('..') + except: + pass + oldest = os.path.join(dirname, oldest) + st = os.stat(oldest) + mtime = st[ST_MTIME] + todo = [] + for name in names: + print name, '...', + st = os.stat(os.path.join(dirname, name)) + if st[ST_MTIME] >= mtime: + print 'Yes.' + todo.append(name) + else: + print 'No.' + todo.sort() + packsome(outfp, dirname, todo) + +# Pack a whole tree (no exceptions) +def packtree(outfp, dirname): + print 'packtree', dirname + outfp.write('mkdir ' + unixfix(dirname) + '\n') + names = os.listdir(dirname) + try: + names.remove('.') + except: + pass + try: + names.remove('..') + except: + pass + subdirs = [] + for name in names: + fullname = os.path.join(dirname, name) + if os.path.isdir(fullname): + subdirs.append(fullname) + else: + print 'pack', fullname + pack(outfp, fullname, unixfix(fullname)) + for subdirname in subdirs: + packtree(outfp, subdirname) + +def unixfix(name): + comps = name.split(os.sep) + res = '' + for comp in comps: + if comp: + if res: res = res + '/' + res = res + comp + return res diff --git a/lib-python/2.2/lib-old/poly.py b/lib-python/2.2/lib-old/poly.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/poly.py @@ -0,0 +1,52 @@ +# module 'poly' -- Polynomials + +# A polynomial is represented by a list of coefficients, e.g., +# [1, 10, 5] represents 1*x**0 + 10*x**1 + 5*x**2 (or 1 + 10x + 5x**2). +# There is no way to suppress internal zeros; trailing zeros are +# taken out by normalize(). + +def normalize(p): # Strip unnecessary zero coefficients + n = len(p) + while n: + if p[n-1]: return p[:n] + n = n-1 + return [] + +def plus(a, b): + if len(a) < len(b): a, b = b, a # make sure a is the longest + res = a[:] # make a copy + for i in range(len(b)): + res[i] = res[i] + b[i] + return normalize(res) + +def minus(a, b): + neg_b = map(lambda x: -x, b[:]) + return plus(a, neg_b) + +def one(power, coeff): # Representation of coeff * x**power + res = [] + for i in range(power): res.append(0) + return res + [coeff] + +def times(a, b): + res = [] + for i in range(len(a)): + for j in range(len(b)): + res = plus(res, one(i+j, a[i]*b[j])) + return res + +def power(a, n): # Raise polynomial a to the positive integral power n + if n == 0: return [1] + if n == 1: return a + if n/2*2 == n: + b = power(a, n/2) + return times(b, b) + return times(power(a, n-1), a) + +def der(a): # First derivative + res = a[1:] + for i in range(len(res)): + res[i] = res[i] * (i+1) + return res + +# Computing a primitive function would require rational arithmetic... diff --git a/lib-python/2.2/lib-old/rand.py b/lib-python/2.2/lib-old/rand.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/rand.py @@ -0,0 +1,13 @@ +# Module 'rand' +# Don't use unless you want compatibility with C's rand()! + +import whrandom + +def srand(seed): + whrandom.seed(seed%256, seed/256%256, seed/65536%256) + +def rand(): + return int(whrandom.random() * 32768.0) % 32768 + +def choice(seq): + return seq[rand() % len(seq)] diff --git a/lib-python/2.2/lib-old/tb.py b/lib-python/2.2/lib-old/tb.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/tb.py @@ -0,0 +1,177 @@ +# Print tracebacks, with a dump of local variables. +# Also an interactive stack trace browser. +# Note -- this module is obsolete -- use pdb.pm() instead. + +import sys +import os +from stat import * +import linecache + +def br(): browser(sys.last_traceback) + +def tb(): printtb(sys.last_traceback) + +def browser(tb): + if not tb: + print 'No traceback.' + return + tblist = [] + while tb: + tblist.append(tb) + tb = tb.tb_next + ptr = len(tblist)-1 + tb = tblist[ptr] + while 1: + if tb != tblist[ptr]: + tb = tblist[ptr] + print `ptr` + ':', + printtbheader(tb) + try: + line = raw_input('TB: ') + except KeyboardInterrupt: + print '\n[Interrupted]' + break + except EOFError: + print '\n[EOF]' + break + cmd = line.strip() + if cmd: + if cmd == 'quit': + break + elif cmd == 'list': + browserlist(tb) + elif cmd == 'up': + if ptr-1 >= 0: ptr = ptr-1 + else: print 'Bottom of stack.' + elif cmd == 'down': + if ptr+1 < len(tblist): ptr = ptr+1 + else: print 'Top of stack.' + elif cmd == 'locals': + printsymbols(tb.tb_frame.f_locals) + elif cmd == 'globals': + printsymbols(tb.tb_frame.f_globals) + elif cmd in ('?', 'help'): + browserhelp() + else: + browserexec(tb, cmd) + +def browserlist(tb): + filename = tb.tb_frame.f_code.co_filename + lineno = tb.tb_lineno + last = lineno + first = max(1, last-10) + for i in range(first, last+1): + if i == lineno: prefix = '***' + `i`.rjust(4) + ':' + else: prefix = `i`.rjust(7) + ':' + line = linecache.getline(filename, i) + if line[-1:] == '\n': line = line[:-1] + print prefix + line + +def browserexec(tb, cmd): + locals = tb.tb_frame.f_locals + globals = tb.tb_frame.f_globals + try: + exec cmd+'\n' in globals, locals + except: + t, v = sys.exc_info()[:2] + print '*** Exception:', + if type(t) is type(''): + print t, + else: + print t.__name__, + if v is not None: + print ':', v, + print + print 'Type help to get help.' + +def browserhelp(): + print + print ' This is the traceback browser. Commands are:' + print ' up : move one level up in the call stack' + print ' down : move one level down in the call stack' + print ' locals : print all local variables at this level' + print ' globals : print all global variables at this level' + print ' list : list source code around the failure' + print ' help : print help (what you are reading now)' + print ' quit : back to command interpreter' + print ' Typing any other 1-line statement will execute it' + print ' using the current level\'s symbol tables' + print + +def printtb(tb): + while tb: + print1tb(tb) + tb = tb.tb_next + +def print1tb(tb): + printtbheader(tb) + if tb.tb_frame.f_locals is not tb.tb_frame.f_globals: + printsymbols(tb.tb_frame.f_locals) + +def printtbheader(tb): + filename = tb.tb_frame.f_code.co_filename + lineno = tb.tb_lineno + info = '"' + filename + '"(' + `lineno` + ')' + line = linecache.getline(filename, lineno) + if line: + info = info + ': ' + line.strip() + print info + +def printsymbols(d): + keys = d.keys() + keys.sort() + for name in keys: + print ' ' + name.ljust(12) + ':', + printobject(d[name], 4) + print + +def printobject(v, maxlevel): + if v is None: + print 'None', + elif type(v) in (type(0), type(0.0)): + print v, + elif type(v) is type(''): + if len(v) > 20: + print `v[:17] + '...'`, + else: + print `v`, + elif type(v) is type(()): + print '(', + printlist(v, maxlevel) + print ')', + elif type(v) is type([]): + print '[', + printlist(v, maxlevel) + print ']', + elif type(v) is type({}): + print '{', + printdict(v, maxlevel) + print '}', + else: + print v, + +def printlist(v, maxlevel): + n = len(v) + if n == 0: return + if maxlevel <= 0: + print '...', + return + for i in range(min(6, n)): + printobject(v[i], maxlevel-1) + if i+1 < n: print ',', + if n > 6: print '...', + +def printdict(v, maxlevel): + keys = v.keys() + n = len(keys) + if n == 0: return + if maxlevel <= 0: + print '...', + return + keys.sort() + for i in range(min(6, n)): + key = keys[i] + print `key` + ':', + printobject(v[key], maxlevel-1) + if i+1 < n: print ',', + if n > 6: print '...', diff --git a/lib-python/2.2/lib-old/util.py b/lib-python/2.2/lib-old/util.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/util.py @@ -0,0 +1,25 @@ +# Module 'util' -- some useful functions that don't fit elsewhere + +# NB: These are now built-in functions, but this module is provided +# for compatibility. Don't use in new programs unless you need backward +# compatibility (i.e. need to run with old interpreters). + + +# Remove an item from a list. +# No complaints if it isn't in the list at all. +# If it occurs more than once, remove the first occurrence. +# +def remove(item, list): + if item in list: list.remove(item) + + +# Return a string containing a file's contents. +# +def readfile(fn): + return readopenfile(open(fn, 'r')) + + +# Read an open file until EOF. +# +def readopenfile(fp): + return fp.read() diff --git a/lib-python/2.2/lib-old/whatsound.py b/lib-python/2.2/lib-old/whatsound.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/whatsound.py @@ -0,0 +1,1 @@ +from sndhdr import * diff --git a/lib-python/2.2/lib-old/zmod.py b/lib-python/2.2/lib-old/zmod.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-old/zmod.py @@ -0,0 +1,94 @@ +# module 'zmod' + +# Compute properties of mathematical "fields" formed by taking +# Z/n (the whole numbers modulo some whole number n) and an +# irreducible polynomial (i.e., a polynomial with only complex zeros), +# e.g., Z/5 and X**2 + 2. +# +# The field is formed by taking all possible linear combinations of +# a set of d base vectors (where d is the degree of the polynomial). +# +# Note that this procedure doesn't yield a field for all combinations +# of n and p: it may well be that some numbers have more than one +# inverse and others have none. This is what we check. +# +# Remember that a field is a ring where each element has an inverse. +# A ring has commutative addition and multiplication, a zero and a one: +# 0*x = x*0 = 0, 0+x = x+0 = x, 1*x = x*1 = x. Also, the distributive +# property holds: a*(b+c) = a*b + b*c. +# (XXX I forget if this is an axiom or follows from the rules.) + +import poly + + +# Example N and polynomial + +N = 5 +P = poly.plus(poly.one(0, 2), poly.one(2, 1)) # 2 + x**2 + + +# Return x modulo y. Returns >= 0 even if x < 0. + +def mod(x, y): + return divmod(x, y)[1] + + +# Normalize a polynomial modulo n and modulo p. + +def norm(a, n, p): + a = poly.modulo(a, p) + a = a[:] + for i in range(len(a)): a[i] = mod(a[i], n) + a = poly.normalize(a) + return a + + +# Make a list of all n^d elements of the proposed field. + +def make_all(mat): + all = [] + for row in mat: + for a in row: + all.append(a) + return all + +def make_elements(n, d): + if d == 0: return [poly.one(0, 0)] + sub = make_elements(n, d-1) + all = [] + for a in sub: + for i in range(n): + all.append(poly.plus(a, poly.one(d-1, i))) + return all + +def make_inv(all, n, p): + x = poly.one(1, 1) + inv = [] + for a in all: + inv.append(norm(poly.times(a, x), n, p)) + return inv + +def checkfield(n, p): + all = make_elements(n, len(p)-1) + inv = make_inv(all, n, p) + all1 = all[:] + inv1 = inv[:] + all1.sort() + inv1.sort() + if all1 == inv1: print 'BINGO!' + else: + print 'Sorry:', n, p + print all + print inv + +def rj(s, width): + if type(s) is not type(''): s = `s` + n = len(s) + if n >= width: return s + return ' '*(width - n) + s + +def lj(s, width): + if type(s) is not type(''): s = `s` + n = len(s) + if n >= width: return s + return s + ' '*(width - n) diff --git a/lib-python/2.2/lib-tk/Canvas.py b/lib-python/2.2/lib-tk/Canvas.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/Canvas.py @@ -0,0 +1,188 @@ +# This module exports classes for the various canvas item types + +# NOTE: This module was an experiment and is now obsolete. +# It's best to use the Tkinter.Canvas class directly. + +from Tkinter import Canvas, _cnfmerge, _flatten + + +class CanvasItem: + def __init__(self, canvas, itemType, *args, **kw): + self.canvas = canvas + self.id = canvas._create(itemType, args, kw) + if not hasattr(canvas, 'items'): + canvas.items = {} + canvas.items[self.id] = self + def __str__(self): + return str(self.id) + def __repr__(self): + return '<%s, id=%d>' % (self.__class__.__name__, self.id) + def delete(self): + del self.canvas.items[self.id] + self.canvas.delete(self.id) + def __getitem__(self, key): + v = self.canvas.tk.split(self.canvas.tk.call( + self.canvas._w, 'itemconfigure', + self.id, '-' + key)) + return v[4] + cget = __getitem__ + def __setitem__(self, key, value): + self.canvas.itemconfig(self.id, {key: value}) + def keys(self): + if not hasattr(self, '_keys'): + self._keys = map(lambda x, tk=self.canvas.tk: + tk.splitlist(x)[0][1:], + self.canvas.tk.splitlist( + self.canvas._do( + 'itemconfigure', + (self.id,)))) + return self._keys + def has_key(self, key): + return key in self.keys() + def addtag(self, tag, option='withtag'): + self.canvas.addtag(tag, option, self.id) + def bbox(self): + x1, y1, x2, y2 = self.canvas.bbox(self.id) + return (x1, y1), (x2, y2) + def bind(self, sequence=None, command=None, add=None): + return self.canvas.tag_bind(self.id, sequence, command, add) + def unbind(self, sequence, funcid=None): + self.canvas.tag_unbind(self.id, sequence, funcid) + def config(self, cnf={}, **kw): + return self.canvas.itemconfig(self.id, _cnfmerge((cnf, kw))) + def coords(self, pts = ()): + flat = () + for x, y in pts: flat = flat + (x, y) + return apply(self.canvas.coords, (self.id,) + flat) + def dchars(self, first, last=None): + self.canvas.dchars(self.id, first, last) + def dtag(self, ttd): + self.canvas.dtag(self.id, ttd) + def focus(self): + self.canvas.focus(self.id) + def gettags(self): + return self.canvas.gettags(self.id) + def icursor(self, index): + self.canvas.icursor(self.id, index) + def index(self, index): + return self.canvas.index(self.id, index) + def insert(self, beforethis, string): + self.canvas.insert(self.id, beforethis, string) + def lower(self, belowthis=None): + self.canvas.tag_lower(self.id, belowthis) + def move(self, xamount, yamount): + self.canvas.move(self.id, xamount, yamount) + def tkraise(self, abovethis=None): + self.canvas.tag_raise(self.id, abovethis) + raise_ = tkraise # BW compat + def scale(self, xorigin, yorigin, xscale, yscale): + self.canvas.scale(self.id, xorigin, yorigin, xscale, yscale) + def type(self): + return self.canvas.type(self.id) + +class Arc(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'arc') + args, kw) + +class Bitmap(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'bitmap') + args, kw) + +class ImageItem(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'image') + args, kw) + +class Line(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'line') + args, kw) + +class Oval(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'oval') + args, kw) + +class Polygon(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'polygon') + args,kw) + +class Rectangle(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'rectangle')+args,kw) + +# XXX "Text" is taken by the Text widget... +class CanvasText(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'text') + args, kw) + +class Window(CanvasItem): + def __init__(self, canvas, *args, **kw): + apply(CanvasItem.__init__, (self, canvas, 'window') + args, kw) + +class Group: + def __init__(self, canvas, tag=None): + if not tag: + tag = 'Group%d' % id(self) + self.tag = self.id = tag + self.canvas = canvas + self.canvas.dtag(self.tag) + def str(self): + return self.tag + __str__ = str + def _do(self, cmd, *args): + return self.canvas._do(cmd, (self.tag,) + _flatten(args)) + def addtag_above(self, tagOrId): + self._do('addtag', 'above', tagOrId) + def addtag_all(self): + self._do('addtag', 'all') + def addtag_below(self, tagOrId): + self._do('addtag', 'below', tagOrId) + def addtag_closest(self, x, y, halo=None, start=None): + self._do('addtag', 'closest', x, y, halo, start) + def addtag_enclosed(self, x1, y1, x2, y2): + self._do('addtag', 'enclosed', x1, y1, x2, y2) + def addtag_overlapping(self, x1, y1, x2, y2): + self._do('addtag', 'overlapping', x1, y1, x2, y2) + def addtag_withtag(self, tagOrId): + self._do('addtag', 'withtag', tagOrId) + def bbox(self): + return self.canvas._getints(self._do('bbox')) + def bind(self, sequence=None, command=None, add=None): + return self.canvas.tag_bind(self.id, sequence, command, add) + def unbind(self, sequence, funcid=None): + self.canvas.tag_unbind(self.id, sequence, funcid) + def coords(self, *pts): + return self._do('coords', pts) + def dchars(self, first, last=None): + self._do('dchars', first, last) + def delete(self): + self._do('delete') + def dtag(self, tagToDelete=None): + self._do('dtag', tagToDelete) + def focus(self): + self._do('focus') + def gettags(self): + return self.canvas.tk.splitlist(self._do('gettags', self.tag)) + def icursor(self, index): + return self._do('icursor', index) + def index(self, index): + return self.canvas.tk.getint(self._do('index', index)) + def insert(self, beforeThis, string): + self._do('insert', beforeThis, string) + def config(self, cnf={}, **kw): + return self.canvas.itemconfigure(self.tag, _cnfmerge((cnf,kw))) + def lower(self, belowThis=None): + self._do('lower', belowThis) + def move(self, xAmount, yAmount): + self._do('move', xAmount, yAmount) + def tkraise(self, aboveThis=None): + self._do('raise', aboveThis) + lift = tkraise + def scale(self, xOrigin, yOrigin, xScale, yScale): + self._do('scale', xOrigin, yOrigin, xScale, yScale) + def select_adjust(self, index): + self.canvas._do('select', ('adjust', self.tag, index)) + def select_from(self, index): + self.canvas._do('select', ('from', self.tag, index)) + def select_to(self, index): + self.canvas._do('select', ('to', self.tag, index)) + def type(self): + return self._do('type') diff --git a/lib-python/2.2/lib-tk/Dialog.py b/lib-python/2.2/lib-tk/Dialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/Dialog.py @@ -0,0 +1,49 @@ +# Dialog.py -- Tkinter interface to the tk_dialog script. + +from Tkinter import * +from Tkinter import _cnfmerge + +if TkVersion <= 3.6: + DIALOG_ICON = 'warning' +else: + DIALOG_ICON = 'questhead' + + +class Dialog(Widget): + def __init__(self, master=None, cnf={}, **kw): + cnf = _cnfmerge((cnf, kw)) + self.widgetName = '__dialog__' + Widget._setup(self, master, cnf) + self.num = self.tk.getint( + apply(self.tk.call, + ('tk_dialog', self._w, + cnf['title'], cnf['text'], + cnf['bitmap'], cnf['default']) + + cnf['strings'])) + try: Widget.destroy(self) + except TclError: pass + def destroy(self): pass + +def _test(): + d = Dialog(None, {'title': 'File Modified', + 'text': + 'File "Python.h" has been modified' + ' since the last time it was saved.' + ' Do you want to save it before' + ' exiting the application.', + 'bitmap': DIALOG_ICON, + 'default': 0, + 'strings': ('Save File', + 'Discard Changes', + 'Return to Editor')}) + print d.num + + +if __name__ == '__main__': + t = Button(None, {'text': 'Test', + 'command': _test, + Pack: {}}) + q = Button(None, {'text': 'Quit', + 'command': t.quit, + Pack: {}}) + t.mainloop() diff --git a/lib-python/2.2/lib-tk/FileDialog.py b/lib-python/2.2/lib-tk/FileDialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/FileDialog.py @@ -0,0 +1,273 @@ +"""File selection dialog classes. + +Classes: + +- FileDialog +- LoadFileDialog +- SaveFileDialog + +""" + +from Tkinter import * +from Dialog import Dialog + +import os +import fnmatch + + +dialogstates = {} + + +class FileDialog: + + """Standard file selection dialog -- no checks on selected file. + + Usage: + + d = FileDialog(master) + file = d.go(dir_or_file, pattern, default, key) + if file is None: ...canceled... + else: ...open file... + + All arguments to go() are optional. + + The 'key' argument specifies a key in the global dictionary + 'dialogstates', which keeps track of the values for the directory + and pattern arguments, overriding the values passed in (it does + not keep track of the default argument!). If no key is specified, + the dialog keeps no memory of previous state. Note that memory is + kept even when the dialog is canceled. (All this emulates the + behavior of the Macintosh file selection dialogs.) + + """ + + title = "File Selection Dialog" + + def __init__(self, master, title=None): + if title is None: title = self.title + self.master = master + self.directory = None + + self.top = Toplevel(master) + self.top.title(title) + self.top.iconname(title) + + self.botframe = Frame(self.top) + self.botframe.pack(side=BOTTOM, fill=X) + + self.selection = Entry(self.top) + self.selection.pack(side=BOTTOM, fill=X) + self.selection.bind('', self.ok_event) + + self.filter = Entry(self.top) + self.filter.pack(side=TOP, fill=X) + self.filter.bind('', self.filter_command) + + self.midframe = Frame(self.top) + self.midframe.pack(expand=YES, fill=BOTH) + + self.filesbar = Scrollbar(self.midframe) + self.filesbar.pack(side=RIGHT, fill=Y) + self.files = Listbox(self.midframe, exportselection=0, + yscrollcommand=(self.filesbar, 'set')) + self.files.pack(side=RIGHT, expand=YES, fill=BOTH) + btags = self.files.bindtags() + self.files.bindtags(btags[1:] + btags[:1]) + self.files.bind('', self.files_select_event) + self.files.bind('', self.files_double_event) + self.filesbar.config(command=(self.files, 'yview')) + + self.dirsbar = Scrollbar(self.midframe) + self.dirsbar.pack(side=LEFT, fill=Y) + self.dirs = Listbox(self.midframe, exportselection=0, + yscrollcommand=(self.dirsbar, 'set')) + self.dirs.pack(side=LEFT, expand=YES, fill=BOTH) + self.dirsbar.config(command=(self.dirs, 'yview')) + btags = self.dirs.bindtags() + self.dirs.bindtags(btags[1:] + btags[:1]) + self.dirs.bind('', self.dirs_select_event) + self.dirs.bind('', self.dirs_double_event) + + self.ok_button = Button(self.botframe, + text="OK", + command=self.ok_command) + self.ok_button.pack(side=LEFT) + self.filter_button = Button(self.botframe, + text="Filter", + command=self.filter_command) + self.filter_button.pack(side=LEFT, expand=YES) + self.cancel_button = Button(self.botframe, + text="Cancel", + command=self.cancel_command) + self.cancel_button.pack(side=RIGHT) + + self.top.protocol('WM_DELETE_WINDOW', self.cancel_command) + # XXX Are the following okay for a general audience? + self.top.bind('', self.cancel_command) + self.top.bind('', self.cancel_command) + + def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None): + if key and dialogstates.has_key(key): + self.directory, pattern = dialogstates[key] + else: + dir_or_file = os.path.expanduser(dir_or_file) + if os.path.isdir(dir_or_file): + self.directory = dir_or_file + else: + self.directory, default = os.path.split(dir_or_file) + self.set_filter(self.directory, pattern) + self.set_selection(default) + self.filter_command() + self.selection.focus_set() + self.top.grab_set() + self.how = None + self.master.mainloop() # Exited by self.quit(how) + if key: + directory, pattern = self.get_filter() + if self.how: + directory = os.path.dirname(self.how) + dialogstates[key] = directory, pattern + self.top.destroy() + return self.how + + def quit(self, how=None): + self.how = how + self.master.quit() # Exit mainloop() + + def dirs_double_event(self, event): + self.filter_command() + + def dirs_select_event(self, event): + dir, pat = self.get_filter() + subdir = self.dirs.get('active') + dir = os.path.normpath(os.path.join(self.directory, subdir)) + self.set_filter(dir, pat) + + def files_double_event(self, event): + self.ok_command() + + def files_select_event(self, event): + file = self.files.get('active') + self.set_selection(file) + + def ok_event(self, event): + self.ok_command() + + def ok_command(self): + self.quit(self.get_selection()) + + def filter_command(self, event=None): + dir, pat = self.get_filter() + try: + names = os.listdir(dir) + except os.error: + self.master.bell() + return + self.directory = dir + self.set_filter(dir, pat) + names.sort() + subdirs = [os.pardir] + matchingfiles = [] + for name in names: + fullname = os.path.join(dir, name) + if os.path.isdir(fullname): + subdirs.append(name) + elif fnmatch.fnmatch(name, pat): + matchingfiles.append(name) + self.dirs.delete(0, END) + for name in subdirs: + self.dirs.insert(END, name) + self.files.delete(0, END) + for name in matchingfiles: + self.files.insert(END, name) + head, tail = os.path.split(self.get_selection()) + if tail == os.curdir: tail = '' + self.set_selection(tail) + + def get_filter(self): + filter = self.filter.get() + filter = os.path.expanduser(filter) + if filter[-1:] == os.sep or os.path.isdir(filter): + filter = os.path.join(filter, "*") + return os.path.split(filter) + + def get_selection(self): + file = self.selection.get() + file = os.path.expanduser(file) + return file + + def cancel_command(self, event=None): + self.quit() + + def set_filter(self, dir, pat): + if not os.path.isabs(dir): + try: + pwd = os.getcwd() + except os.error: + pwd = None + if pwd: + dir = os.path.join(pwd, dir) + dir = os.path.normpath(dir) + self.filter.delete(0, END) + self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*")) + + def set_selection(self, file): + self.selection.delete(0, END) + self.selection.insert(END, os.path.join(self.directory, file)) + + +class LoadFileDialog(FileDialog): + + """File selection dialog which checks that the file exists.""" + + title = "Load File Selection Dialog" + + def ok_command(self): + file = self.get_selection() + if not os.path.isfile(file): + self.master.bell() + else: + self.quit(file) + + +class SaveFileDialog(FileDialog): + + """File selection dialog which checks that the file may be created.""" + + title = "Save File Selection Dialog" + + def ok_command(self): + file = self.get_selection() + if os.path.exists(file): + if os.path.isdir(file): + self.master.bell() + return + d = Dialog(self.top, + title="Overwrite Existing File Question", + text="Overwrite existing file %s?" % `file`, + bitmap='questhead', + default=1, + strings=("Yes", "Cancel")) + if d.num != 0: + return + else: + head, tail = os.path.split(file) + if not os.path.isdir(head): + self.master.bell() + return + self.quit(file) + + +def test(): + """Simple test program.""" + root = Tk() + root.withdraw() + fd = LoadFileDialog(root) + loadfile = fd.go(key="test") + fd = SaveFileDialog(root) + savefile = fd.go(key="test") + print loadfile, savefile + + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/lib-tk/FixTk.py b/lib-python/2.2/lib-tk/FixTk.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/FixTk.py @@ -0,0 +1,37 @@ +import sys, os + +# Delay import _tkinter until we have set TCL_LIBRARY, +# so that Tcl_FindExecutable has a chance to locate its +# encoding directory. + +# Unfortunately, we cannot know the TCL_LIBRARY directory +# if we don't know the tcl version, which we cannot find out +# without import Tcl. Fortunately, Tcl will itself look in +# \..\tcl, so anything close to +# the real Tcl library will do. + +prefix = os.path.join(sys.prefix,"tcl") +# if this does not exist, no further search is needed +if os.path.exists(prefix): + if not os.environ.has_key("TCL_LIBRARY"): + for name in os.listdir(prefix): + if name.startswith("tcl"): + tcldir = os.path.join(prefix,name) + if os.path.isdir(tcldir): + os.environ["TCL_LIBRARY"] = tcldir + # Compute TK_LIBRARY, knowing that it has the same version + # as Tcl + import _tkinter + ver = str(_tkinter.TCL_VERSION) + if not os.environ.has_key("TK_LIBRARY"): + v = os.path.join(prefix, 'tk'+ver) + if os.path.exists(os.path.join(v, "tclIndex")): + os.environ['TK_LIBRARY'] = v + # We don't know the Tix version, so we must search the entire + # directory + if not os.environ.has_key("TIX_LIBRARY"): + for name in os.listdir(prefix): + if name.startswith("tix"): + tixdir = os.path.join(prefix,name) + if os.path.isdir(tixdir): + os.environ["TIX_LIBRARY"] = tixdir diff --git a/lib-python/2.2/lib-tk/ScrolledText.py b/lib-python/2.2/lib-tk/ScrolledText.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/ScrolledText.py @@ -0,0 +1,43 @@ +# A ScrolledText widget feels like a text widget but also has a +# vertical scroll bar on its right. (Later, options may be added to +# add a horizontal bar as well, to make the bars disappear +# automatically when not needed, to move them to the other side of the +# window, etc.) +# +# Configuration options are passed to the Text widget. +# A Frame widget is inserted between the master and the text, to hold +# the Scrollbar widget. +# Most methods calls are inherited from the Text widget; Pack methods +# are redirected to the Frame widget however. + +from Tkinter import * +from Tkinter import _cnfmerge + +class ScrolledText(Text): + def __init__(self, master=None, cnf=None, **kw): + if cnf is None: + cnf = {} + if kw: + cnf = _cnfmerge((cnf, kw)) + fcnf = {} + for k in cnf.keys(): + if type(k) == ClassType or k == 'name': + fcnf[k] = cnf[k] + del cnf[k] + self.frame = apply(Frame, (master,), fcnf) + self.vbar = Scrollbar(self.frame, name='vbar') + self.vbar.pack(side=RIGHT, fill=Y) + cnf['name'] = 'text' + apply(Text.__init__, (self, self.frame), cnf) + self.pack(side=LEFT, fill=BOTH, expand=1) + self['yscrollcommand'] = self.vbar.set + self.vbar['command'] = self.yview + + # Copy geometry methods of self.frame -- hack! + methods = Pack.__dict__.keys() + methods = methods + Grid.__dict__.keys() + methods = methods + Place.__dict__.keys() + + for m in methods: + if m[0] != '_' and m != 'config' and m != 'configure': + setattr(self, m, getattr(self.frame, m)) diff --git a/lib-python/2.2/lib-tk/SimpleDialog.py b/lib-python/2.2/lib-tk/SimpleDialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/SimpleDialog.py @@ -0,0 +1,111 @@ +"""A simple but flexible modal dialog box.""" + + +from Tkinter import * + + +class SimpleDialog: + + def __init__(self, master, + text='', buttons=[], default=None, cancel=None, + title=None, class_=None): + if class_: + self.root = Toplevel(master, class_=class_) + else: + self.root = Toplevel(master) + if title: + self.root.title(title) + self.root.iconname(title) + self.message = Message(self.root, text=text, aspect=400) + self.message.pack(expand=1, fill=BOTH) + self.frame = Frame(self.root) + self.frame.pack() + self.num = default + self.cancel = cancel + self.default = default + self.root.bind('', self.return_event) + for num in range(len(buttons)): + s = buttons[num] + b = Button(self.frame, text=s, + command=(lambda self=self, num=num: self.done(num))) + if num == default: + b.config(relief=RIDGE, borderwidth=8) + b.pack(side=LEFT, fill=BOTH, expand=1) + self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window) + self._set_transient(master) + + def _set_transient(self, master, relx=0.5, rely=0.3): + widget = self.root + widget.withdraw() # Remain invisible while we figure out the geometry + widget.transient(master) + widget.update_idletasks() # Actualize geometry information + if master.winfo_ismapped(): + m_width = master.winfo_width() + m_height = master.winfo_height() + m_x = master.winfo_rootx() + m_y = master.winfo_rooty() + else: + m_width = master.winfo_screenwidth() + m_height = master.winfo_screenheight() + m_x = m_y = 0 + w_width = widget.winfo_reqwidth() + w_height = widget.winfo_reqheight() + x = m_x + (m_width - w_width) * relx + y = m_y + (m_height - w_height) * rely + if x+w_width > master.winfo_screenwidth(): + x = master.winfo_screenwidth() - w_width + elif x < 0: + x = 0 + if y+w_height > master.winfo_screenheight(): + y = master.winfo_screenheight() - w_height + elif y < 0: + y = 0 + widget.geometry("+%d+%d" % (x, y)) + widget.deiconify() # Become visible at the desired location + + def go(self): + self.root.grab_set() + self.root.mainloop() + self.root.destroy() + return self.num + + def return_event(self, event): + if self.default is None: + self.root.bell() + else: + self.done(self.default) + + def wm_delete_window(self): + if self.cancel is None: + self.root.bell() + else: + self.done(self.cancel) + + def done(self, num): + self.num = num + self.root.quit() + + +def test(): + root = Tk() + def doit(root=root): + d = SimpleDialog(root, + text="This is a test dialog. " + "Would this have been an actual dialog, " + "the buttons below would have been glowing " + "in soft pink light.\n" + "Do you believe this?", + buttons=["Yes", "No", "Cancel"], + default=0, + cancel=2, + title="Test Dialog") + print d.go() + t = Button(root, text='Test', command=doit) + t.pack() + q = Button(root, text='Quit', command=t.quit) + q.pack() + t.mainloop() + + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/lib-tk/Tix.py b/lib-python/2.2/lib-tk/Tix.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/lib-tk/Tix.py @@ -0,0 +1,1626 @@ +# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- +# +# $Id$ +# +# Tix.py -- Tix widget wrappers. +# +# For Tix, see http://tix.sourceforge.net +# +# - Sudhir Shenoy (sshenoy at gol.com), Dec. 1995. +# based on an idea of Jean-Marc Lugrin (lugrin at ms.com) +# +# NOTE: In order to minimize changes to Tkinter.py, some of the code here +# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__) +# and will break if there are major changes in Tkinter. +# +# The Tix widgets are represented by a class hierarchy in python with proper +# inheritance of base classes. +# +# As a result after creating a 'w = StdButtonBox', I can write +# w.ok['text'] = 'Who Cares' +# or w.ok['bg'] = w['bg'] +# or even w.ok.invoke() +# etc. +# +# Compare the demo tixwidgets.py to the original Tcl program and you will +# appreciate the advantages. +# + +import string +from Tkinter import * +from Tkinter import _flatten, _cnfmerge, _default_root + +# WARNING - TkVersion is a limited precision floating point number +if TkVersion < 3.999: + raise ImportError, "This version of Tix.py requires Tk 4.0 or higher" + +import _tkinter # If this fails your Python may not be configured for Tk +# TixVersion = string.atof(tkinter.TIX_VERSION) # If this fails your Python may not be configured for Tix +# WARNING - TixVersion is a limited precision floating point number + +# Some more constants (for consistency with Tkinter) +WINDOW = 'window' +TEXT = 'text' +STATUS = 'status' +IMMEDIATE = 'immediate' +IMAGE = 'image' +IMAGETEXT = 'imagetext' +BALLOON = 'balloon' +AUTO = 'auto' +ACROSSTOP = 'acrosstop' + +# Some constants used by Tkinter dooneevent() +TCL_DONT_WAIT = 1 << 1 +TCL_WINDOW_EVENTS = 1 << 2 +TCL_FILE_EVENTS = 1 << 3 +TCL_TIMER_EVENTS = 1 << 4 +TCL_IDLE_EVENTS = 1 << 5 +TCL_ALL_EVENTS = 0 + +# BEWARE - this is implemented by copying some code from the Widget class +# in Tkinter (to override Widget initialization) and is therefore +# liable to break. +import Tkinter, os + +# Could probably add this to Tkinter.Misc +class tixCommand: + """The tix commands provide access to miscellaneous elements + of Tix's internal state and the Tix application context. + Most of the information manipulated by these commands pertains + to the application as a whole, or to a screen or + display, rather than to a particular window. + + This is a mixin class, assumed to be mixed to Tkinter.Tk + that supports the self.tk.call method. + """ + + def tix_addbitmapdir(self, directory): + """Tix maintains a list of directories under which + the tix_getimage and tix_getbitmap commands will + search for image files. The standard bitmap directory + is $TIX_LIBRARY/bitmaps. The addbitmapdir command + adds directory into this list. By using this + command, the image files of an applications can + also be located using the tix_getimage or tix_getbitmap + command. + """ + return self.tk.call('tix', 'addbitmapdir', directory) + + def tix_cget(self, option): + """Returns the current value of the configuration + option given by option. Option may be any of the + options described in the CONFIGURATION OPTIONS section. + """ + return self.tk.call('tix', 'cget', option) + + def tix_configure(self, cnf=None, **kw): + """Query or modify the configuration options of the Tix application + context. If no option is specified, returns a dictionary all of the + available options. If option is specified with no value, then the + command returns a list describing the one named option (this list + will be identical to the corresponding sublist of the value + returned if no option is specified). If one or more option-value + pairs are specified, then the command modifies the given option(s) + to have the given value(s); in this case the command returns an + empty string. Option may be any of the configuration options. + """ + # Copied from Tkinter.py + if kw: + cnf = _cnfmerge((cnf, kw)) + elif cnf: + cnf = _cnfmerge(cnf) + if cnf is None: + cnf = {} + for x in self.tk.split(self.tk.call('tix', 'configure')): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + if isinstance(cnf, StringType): + x = self.tk.split(self.tk.call('tix', 'configure', '-'+cnf)) + return (x[0][1:],) + x[1:] + return self.tk.call(('tix', 'configure') + self._options(cnf)) + + def tix_filedialog(self, dlgclass=None): + """Returns the file selection dialog that may be shared among + different calls from this application. This command will create a + file selection dialog widget when it is called the first time. This + dialog will be returned by all subsequent calls to tix_filedialog. + An optional dlgclass parameter can be passed to specified what type + of file selection dialog widget is desired. Possible options are + tix FileSelectDialog or tixExFileSelectDialog. + """ + if dlgclass is not None: + return self.tk.call('tix', 'filedialog', dlgclass) + else: + return self.tk.call('tix', 'filedialog') + + def tix_getbitmap(self, name): + """Locates a bitmap file of the name name.xpm or name in one of the + bitmap directories (see the tix_addbitmapdir command above). By + using tix_getbitmap, you can avoid hard coding the pathnames of the + bitmap files in your application. When successful, it returns the + complete pathname of the bitmap file, prefixed with the character + '@'. The returned value can be used to configure the -bitmap + option of the TK and Tix widgets. + """ + return self.tk.call('tix', 'getbitmap', name) + + def tix_getimage(self, name): + """Locates an image file of the name name.xpm, name.xbm or name.ppm + in one of the bitmap directories (see the addbitmapdir command + above). If more than one file with the same name (but different + extensions) exist, then the image type is chosen according to the + depth of the X display: xbm images are chosen on monochrome + displays and color images are chosen on color displays. By using + tix_ getimage, you can advoid hard coding the pathnames of the + image files in your application. When successful, this command + returns the name of the newly created image, which can be used to + configure the -image option of the Tk and Tix widgets. + """ + return self.tk.call('tix', 'getimage', name) + + def tix_option_get(self, name): + """Gets the options manitained by the Tix + scheme mechanism. Available options include: + + active_bg active_fg bg + bold_font dark1_bg dark1_fg + dark2_bg dark2_fg disabled_fg + fg fixed_font font + inactive_bg inactive_fg input1_bg + input2_bg italic_font light1_bg + light1_fg light2_bg light2_fg + menu_font output1_bg output2_bg + select_bg select_fg selector + """ + # could use self.tk.globalgetvar('tixOption', name) + return self.tk.call('tix', 'option', 'get', name) + + def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None): + """Resets the scheme and fontset of the Tix application to + newScheme and newFontSet, respectively. This affects only those + widgets created after this call. Therefore, it is best to call the + resetoptions command before the creation of any widgets in a Tix + application. + + The optional parameter newScmPrio can be given to reset the + priority level of the Tk options set by the Tix schemes. + + Because of the way Tk handles the X option database, after Tix has + been has imported and inited, it is not possible to reset the color + schemes and font sets using the tix config command. Instead, the + tix_resetoptions command must be used. + """ + if newScmPrio is not None: + return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio) + else: + return self.tk.call('tix', 'resetoptions', newScheme, newFontSet) + +class Tk(Tkinter.Tk, tixCommand): + """Toplevel widget of Tix which represents mostly the main window + of an application. It has an associated Tcl interpreter.""" + def __init__(self, screenName=None, baseName=None, className='Tix'): + Tkinter.Tk.__init__(self, screenName, baseName, className) + tixlib = os.environ.get('TIX_LIBRARY') + self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]') + if tixlib is not None: + self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib) + self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib) + # Load Tix - this should work dynamically or statically + # If it's static, lib/tix8.1/pkgIndex.tcl should have + # 'load {} Tix' + # If it's dynamic under Unix, lib/tix8.1/pkgIndex.tcl should have + # 'load libtix8.1.8.3.so Tix' + self.tk.eval('package require Tix') + + +# The Tix 'tixForm' geometry manager +class Form: + """The Tix Form geometry manager + + Widgets can be arranged by specifying attachments to other widgets. + See Tix documentation for complete details""" + + def config(self, cnf={}, **kw): + apply(self.tk.call, ('tixForm', self._w) + self._options(cnf, kw)) + + form = config + + def __setitem__(self, key, value): + Form.form(self, {key: value}) + + def check(self): + return self.tk.call('tixForm', 'check', self._w) + + def forget(self): + self.tk.call('tixForm', 'forget', self._w) + + def grid(self, xsize=0, ysize=0): + if (not xsize) and (not ysize): + x = self.tk.call('tixForm', 'grid', self._w) + y = self.tk.splitlist(x) + z = () + for x in y: + z = z + (self.tk.getint(x),) + return z + self.tk.call('tixForm', 'grid', self._w, xsize, ysize) + + def info(self, option=None): + if not option: + return self.tk.call('tixForm', 'info', self._w) + if option[0] != '-': + option = '-' + option + return self.tk.call('tixForm', 'info', self._w, option) + + def slaves(self): + return map(self._nametowidget, + self.tk.splitlist( + self.tk.call( + 'tixForm', 'slaves', self._w))) + + + + +Tkinter.Widget.__bases__ = Tkinter.Widget.__bases__ + (Form,) + +class TixWidget(Tkinter.Widget): + """A TixWidget class is used to package all (or most) Tix widgets. + + Widget initialization is extended in two ways: + 1) It is possible to give a list of options which must be part of + the creation command (so called Tix 'static' options). These cannot be + given as a 'config' command later. + 2) It is possible to give the name of an existing TK widget. These are + child widgets created automatically by a Tix mega-widget. The Tk call + to create these widgets is therefore bypassed in TixWidget.__init__ + + Both options are for use by subclasses only. + """ + def __init__ (self, master=None, widgetName=None, + static_options=None, cnf={}, kw={}): + # Merge keywords and dictionary arguments + if kw: + cnf = _cnfmerge((cnf, kw)) + else: + cnf = _cnfmerge(cnf) + + # Move static options into extra. static_options must be + # a list of keywords (or None). + extra=() + if static_options: + for k,v in cnf.items()[:]: + if k in static_options: + extra = extra + ('-' + k, v) + del cnf[k] + + self.widgetName = widgetName + Widget._setup(self, master, cnf) + + # If widgetName is None, this is a dummy creation call where the + # corresponding Tk widget has already been created by Tix + if widgetName: + apply(self.tk.call, (widgetName, self._w) + extra) + + # Non-static options - to be done via a 'config' command + if cnf: + Widget.config(self, cnf) + + # Dictionary to hold subwidget names for easier access. We can't + # use the children list because the public Tix names may not be the + # same as the pathname component + self.subwidget_list = {} + + # We set up an attribute access function so that it is possible to + # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello' + # when w is a StdButtonBox. + # We can even do w.ok.invoke() because w.ok is subclassed from the + # Button class if you go through the proper constructors + def __getattr__(self, name): + if self.subwidget_list.has_key(name): + return self.subwidget_list[name] + raise AttributeError, name + + def set_silent(self, value): + """Set a variable without calling its action routine""" + self.tk.call('tixSetSilent', self._w, value) + + def subwidget(self, name): + """Return the named subwidget (which must have been created by + the sub-class).""" + n = self._subwidget_name(name) + if not n: + raise TclError, "Subwidget " + name + " not child of " + self._name + # Remove header of name and leading dot + n = n[len(self._w)+1:] + return self._nametowidget(n) + + def subwidgets_all(self): + """Return all subwidgets.""" + names = self._subwidget_names() + if not names: + return [] + retlist = [] + for name in names: + name = name[len(self._w)+1:] + try: + retlist.append(self._nametowidget(name)) + except: + # some of the widgets are unknown e.g. border in LabelFrame + pass + return retlist + + def _subwidget_name(self,name): + """Get a subwidget name (returns a String, not a Widget !)""" + try: + return self.tk.call(self._w, 'subwidget', name) + except TclError: + return None + + def _subwidget_names(self): + """Return the name of all subwidgets.""" + try: + x = self.tk.call(self._w, 'subwidgets', '-all') + return self.tk.split(x) + except TclError: + return None + + def config_all(self, option, value): + """Set configuration options for all subwidgets (and self).""" + if option == '': + return + elif not isinstance(option, StringType): + option = `option` + if not isinstance(value, StringType): + value = `value` + names = self._subwidget_names() + for name in names: + self.tk.call(name, 'configure', '-' + option, value) + +# Subwidgets are child widgets created automatically by mega-widgets. +# In python, we have to create these subwidgets manually to mirror their +# existence in Tk/Tix. +class TixSubWidget(TixWidget): + """Subwidget class. + + This is used to mirror child widgets automatically created + by Tix/Tk as part of a mega-widget in Python (which is not informed + of this)""" + + def __init__(self, master, name, + destroy_physically=1, check_intermediate=1): + if check_intermediate: + path = master._subwidget_name(name) + try: + path = path[len(master._w)+1:] + plist = string.splitfields(path, '.') + except: + plist = [] + + if (not check_intermediate) or len(plist) < 2: + # immediate descendant + TixWidget.__init__(self, master, None, None, {'name' : name}) + else: + # Ensure that the intermediate widgets exist + parent = master + for i in range(len(plist) - 1): + n = string.joinfields(plist[:i+1], '.') + try: + w = master._nametowidget(n) + parent = w + except KeyError: + # Create the intermediate widget + parent = TixSubWidget(parent, plist[i], + destroy_physically=0, + check_intermediate=0) + TixWidget.__init__(self, parent, None, None, {'name' : name}) + self.destroy_physically = destroy_physically + + def destroy(self): + # For some widgets e.g., a NoteBook, when we call destructors, + # we must be careful not to destroy the frame widget since this + # also destroys the parent NoteBook thus leading to an exception + # in Tkinter when it finally calls Tcl to destroy the NoteBook + for c in self.children.values(): c.destroy() + if self.master.children.has_key(self._name): + del self.master.children[self._name] + if self.master.subwidget_list.has_key(self._name): + del self.master.subwidget_list[self._name] + if self.destroy_physically: + # This is bypassed only for a few widgets + self.tk.call('destroy', self._w) + + +# Useful func. to split Tcl lists and return as a dict. From Tkinter.py +def _lst2dict(lst): + dict = {} + for x in lst: + dict[x[0][1:]] = (x[0][1:],) + x[1:] + return dict + +# Useful class to create a display style - later shared by many items. +# Contributed by Steffen Kremser +class DisplayStyle: + """DisplayStyle - handle configuration options shared by + (multiple) Display Items""" + + def __init__(self, itemtype, cnf={}, **kw ): + master = _default_root # global from Tkinter + if not master and cnf.has_key('refwindow'): master=cnf['refwindow'] + elif not master and kw.has_key('refwindow'): master= kw['refwindow'] + elif not master: raise RuntimeError, "Too early to create display style: no root window" + self.tk = master.tk + self.stylename = apply(self.tk.call, ('tixDisplayStyle', itemtype) + + self._options(cnf,kw) ) + + def __str__(self): + return self.stylename + + def _options(self, cnf, kw ): + if kw and cnf: + cnf = _cnfmerge((cnf, kw)) + elif kw: + cnf = kw + opts = () + for k, v in cnf.items(): + opts = opts + ('-'+k, v) + return opts + + def delete(self): + self.tk.call(self.stylename, 'delete') + del(self) + + def __setitem__(self,key,value): + self.tk.call(self.stylename, 'configure', '-%s'%key, value) + + def config(self, cnf={}, **kw): + return _lst2dict( + self.tk.split( + apply(self.tk.call, + (self.stylename, 'configure') + self._options(cnf,kw)))) + + def __getitem__(self,key): + return self.tk.call(self.stylename, 'cget', '-%s'%key) + + +###################################################### +### The Tix Widget classes - in alphabetical order ### +###################################################### + +class Balloon(TixWidget): + """Balloon help widget. + + Subwidget Class + --------- ----- + label Label + message Message""" + + def __init__(self, master=None, cnf={}, **kw): + # static seem to be -installcolormap -initwait -statusbar -cursor + static = ['options', 'installcolormap', 'initwait', 'statusbar', + 'cursor'] + TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw) + self.subwidget_list['label'] = _dummyLabel(self, 'label', + destroy_physically=0) + self.subwidget_list['message'] = _dummyLabel(self, 'message', + destroy_physically=0) + + def bind_widget(self, widget, cnf={}, **kw): + """Bind balloon widget to another. + One balloon widget may be bound to several widgets at the same time""" + apply(self.tk.call, + (self._w, 'bind', widget._w) + self._options(cnf, kw)) + + def unbind_widget(self, widget): + self.tk.call(self._w, 'unbind', widget._w) + +class ButtonBox(TixWidget): + """ButtonBox - A container for pushbuttons. + Subwidgets are the buttons added with the add method. + """ + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixButtonBox', + ['orientation', 'options'], cnf, kw) + + def add(self, name, cnf={}, **kw): + """Add a button with given name to box.""" + + btn = apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = _dummyButton(self, name) + return btn + + def invoke(self, name): + if self.subwidget_list.has_key(name): + self.tk.call(self._w, 'invoke', name) + +class ComboBox(TixWidget): + """ComboBox - an Entry field with a dropdown menu. The user can select a + choice by either typing in the entry subwdget or selecting from the + listbox subwidget. + + Subwidget Class + --------- ----- + entry Entry + arrow Button + slistbox ScrolledListBox + tick Button + cross Button : present if created with the fancy option""" + + def __init__ (self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixComboBox', + ['editable', 'dropdown', 'fancy', 'options'], + cnf, kw) + self.subwidget_list['label'] = _dummyLabel(self, 'label') + self.subwidget_list['entry'] = _dummyEntry(self, 'entry') + self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') + self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, + 'slistbox') + try: + self.subwidget_list['tick'] = _dummyButton(self, 'tick') + self.subwidget_list['cross'] = _dummyButton(self, 'cross') + except TypeError: + # unavailable when -fancy not specified + pass + + def add_history(self, str): + self.tk.call(self._w, 'addhistory', str) + + def append_history(self, str): + self.tk.call(self._w, 'appendhistory', str) + + def insert(self, index, str): + self.tk.call(self._w, 'insert', index, str) + + def pick(self, index): + self.tk.call(self._w, 'pick', index) + +class Control(TixWidget): + """Control - An entry field with value change arrows. The user can + adjust the value by pressing the two arrow buttons or by entering + the value directly into the entry. The new value will be checked + against the user-defined upper and lower limits. + + Subwidget Class + --------- ----- + incr Button + decr Button + entry Entry + label Label""" + + def __init__ (self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw) + self.subwidget_list['incr'] = _dummyButton(self, 'incr') + self.subwidget_list['decr'] = _dummyButton(self, 'decr') + self.subwidget_list['label'] = _dummyLabel(self, 'label') + self.subwidget_list['entry'] = _dummyEntry(self, 'entry') + + def decrement(self): + self.tk.call(self._w, 'decr') + + def increment(self): + self.tk.call(self._w, 'incr') + + def invoke(self): + self.tk.call(self._w, 'invoke') + + def update(self): + self.tk.call(self._w, 'update') + +class DirList(TixWidget): + """DirList - displays a list view of a directory, its previous + directories and its sub-directories. The user can choose one of + the directories displayed in the list or change to another directory. + + Subwidget Class + --------- ----- + hlist HList + hsb Scrollbar + vsb Scrollbar""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + + def chdir(self, dir): + self.tk.call(self._w, 'chdir', dir) + +class DirTree(TixWidget): + """DirTree - Directory Listing in a hierarchical view. + Displays a tree view of a directory, its previous directories and its + sub-directories. The user can choose one of the directories displayed + in the list or change to another directory. + + Subwidget Class + --------- ----- + hlist HList + hsb Scrollbar + vsb Scrollbar""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + + def chdir(self, dir): + self.tk.call(self._w, 'chdir', dir) + +class DirSelectBox(TixWidget): + """DirSelectBox - Motif style file select box. + It is generally used for + the user to choose a file. FileSelectBox stores the files mostly + recently selected into a ComboBox widget so that they can be quickly + selected again. + + Subwidget Class + --------- ----- + selection ComboBox + filter ComboBox + dirlist ScrolledListBox + filelist ScrolledListBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw) + self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') + self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') + +class ExFileSelectBox(TixWidget): + """ExFileSelectBox - MS Windows style file select box. + It provides an convenient method for the user to select files. + + Subwidget Class + --------- ----- + cancel Button + ok Button + hidden Checkbutton + types ComboBox + dir ComboBox + file ComboBox + dirlist ScrolledListBox + filelist ScrolledListBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw) + self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') + self.subwidget_list['ok'] = _dummyButton(self, 'ok') + self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') + self.subwidget_list['types'] = _dummyComboBox(self, 'types') + self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') + self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') + self.subwidget_list['file'] = _dummyComboBox(self, 'file') + self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') + + def filter(self): + self.tk.call(self._w, 'filter') + + def invoke(self): + self.tk.call(self._w, 'invoke') + + +# Should inherit from a Dialog class +class DirSelectDialog(TixWidget): + """The DirSelectDialog widget presents the directories in the file + system in a dialog window. The user can use this dialog window to + navigate through the file system to select the desired directory. + + Subwidgets Class + ---------- ----- + dirbox DirSelectDialog""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirSelectDialog', + ['options'], cnf, kw) + self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox') + # cancel and ok buttons are missing + + def popup(self): + self.tk.call(self._w, 'popup') + + def popdown(self): + self.tk.call(self._w, 'popdown') + + +# Should inherit from a Dialog class +class ExFileSelectDialog(TixWidget): + """ExFileSelectDialog - MS Windows style file select dialog. + It provides an convenient method for the user to select files. + + Subwidgets Class + ---------- ----- + fsbox ExFileSelectBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixExFileSelectDialog', + ['options'], cnf, kw) + self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox') + + def popup(self): + self.tk.call(self._w, 'popup') + + def popdown(self): + self.tk.call(self._w, 'popdown') + +class FileSelectBox(TixWidget): + """ExFileSelectBox - Motif style file select box. + It is generally used for + the user to choose a file. FileSelectBox stores the files mostly + recently selected into a ComboBox widget so that they can be quickly + selected again. + + Subwidget Class + --------- ----- + selection ComboBox + filter ComboBox + dirlist ScrolledListBox + filelist ScrolledListBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw) + self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') + self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') + self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') + self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') + + def apply_filter(self): # name of subwidget is same as command + self.tk.call(self._w, 'filter') + + def invoke(self): + self.tk.call(self._w, 'invoke') + +# Should inherit from a Dialog class +class FileSelectDialog(TixWidget): + """FileSelectDialog - Motif style file select dialog. + + Subwidgets Class + ---------- ----- + btns StdButtonBox + fsbox FileSelectBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixFileSelectDialog', + ['options'], cnf, kw) + self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns') + self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox') + + def popup(self): + self.tk.call(self._w, 'popup') + + def popdown(self): + self.tk.call(self._w, 'popdown') + +class FileEntry(TixWidget): + """FileEntry - Entry field with button that invokes a FileSelectDialog. + The user can type in the filename manually. Alternatively, the user can + press the button widget that sits next to the entry, which will bring + up a file selection dialog. + + Subwidgets Class + ---------- ----- + button Button + entry Entry""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixFileEntry', + ['dialogtype', 'options'], cnf, kw) + self.subwidget_list['button'] = _dummyButton(self, 'button') + self.subwidget_list['entry'] = _dummyEntry(self, 'entry') + + def invoke(self): + self.tk.call(self._w, 'invoke') + + def file_dialog(self): + # XXX return python object + pass + +class HList(TixWidget): + """HList - Hierarchy display widget can be used to display any data + that have a hierarchical structure, for example, file system directory + trees. The list entries are indented and connected by branch lines + according to their places in the hierachy. + + Subwidgets - None""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self, master, 'tixHList', + ['columns', 'options'], cnf, kw) + + def add(self, entry, cnf={}, **kw): + return apply(self.tk.call, + (self._w, 'add', entry) + self._options(cnf, kw)) + + def add_child(self, parent=None, cnf={}, **kw): + if not parent: + parent = '' + return apply(self.tk.call, + (self._w, 'addchild', parent) + self._options(cnf, kw)) + + def anchor_set(self, entry): + self.tk.call(self._w, 'anchor', 'set', entry) + + def anchor_clear(self): + self.tk.call(self._w, 'anchor', 'clear') + + def column_width(self, col=0, width=None, chars=None): + if not chars: + return self.tk.call(self._w, 'column', 'width', col, width) + else: + return self.tk.call(self._w, 'column', 'width', col, + '-char', chars) + + def delete_all(self): + self.tk.call(self._w, 'delete', 'all') + + def delete_entry(self, entry): + self.tk.call(self._w, 'delete', 'entry', entry) + + def delete_offsprings(self, entry): + self.tk.call(self._w, 'delete', 'offsprings', entry) + + def delete_siblings(self, entry): + self.tk.call(self._w, 'delete', 'siblings', entry) + + def dragsite_set(self, index): + self.tk.call(self._w, 'dragsite', 'set', index) + + def dragsite_clear(self): + self.tk.call(self._w, 'dragsite', 'clear') + + def dropsite_set(self, index): + self.tk.call(self._w, 'dropsite', 'set', index) + + def dropsite_clear(self): + self.tk.call(self._w, 'dropsite', 'clear') + + def header_create(self, col, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'header', 'create', col) + self._options(cnf, kw)) + + def header_configure(self, col, cnf={}, **kw): + if cnf is None: + return _lst2dict( + self.tk.split( + self.tk.call(self._w, 'header', 'configure', col))) + apply(self.tk.call, (self._w, 'header', 'configure', col) + + self._options(cnf, kw)) + + def header_cget(self, col, opt): + return self.tk.call(self._w, 'header', 'cget', col, opt) + + def header_exists(self, col): + return self.tk.call(self._w, 'header', 'exists', col) + + def header_delete(self, col): + self.tk.call(self._w, 'header', 'delete', col) + + def header_size(self, col): + return self.tk.call(self._w, 'header', 'size', col) + + def hide_entry(self, entry): + self.tk.call(self._w, 'hide', 'entry', entry) + + def indicator_create(self, entry, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'indicator', 'create', entry) + self._options(cnf, kw)) + + def indicator_configure(self, entry, cnf={}, **kw): + if cnf is None: + return _lst2dict( + self.tk.split( + self.tk.call(self._w, 'indicator', 'configure', entry))) + apply(self.tk.call, + (self._w, 'indicator', 'configure', entry) + self._options(cnf, kw)) + + def indicator_cget(self, entry, opt): + return self.tk.call(self._w, 'indicator', 'cget', entry, opt) + + def indicator_exists(self, entry): + return self.tk.call (self._w, 'indicator', 'exists', entry) + + def indicator_delete(self, entry): + self.tk.call(self._w, 'indicator', 'delete', entry) + + def indicator_size(self, entry): + return self.tk.call(self._w, 'indicator', 'size', entry) + + def info_anchor(self): + return self.tk.call(self._w, 'info', 'anchor') + + def info_children(self, entry=None): + c = self.tk.call(self._w, 'info', 'children', entry) + return self.tk.splitlist(c) + + def info_data(self, entry): + return self.tk.call(self._w, 'info', 'data', entry) + + def info_exists(self, entry): + return self.tk.call(self._w, 'info', 'exists', entry) + + def info_hidden(self, entry): + return self.tk.call(self._w, 'info', 'hidden', entry) + + def info_next(self, entry): + return self.tk.call(self._w, 'info', 'next', entry) + + def info_parent(self, entry): + return self.tk.call(self._w, 'info', 'parent', entry) + + def info_prev(self, entry): + return self.tk.call(self._w, 'info', 'prev', entry) + + def info_selection(self): + c = self.tk.call(self._w, 'info', 'selection') + return self.tk.splitlist(c) + + def item_cget(self, entry, col, opt): + return self.tk.call(self._w, 'item', 'cget', entry, col, opt) + + def item_configure(self, entry, col, cnf={}, **kw): + if cnf is None: + return _lst2dict( + self.tk.split( + self.tk.call(self._w, 'item', 'configure', entry, col))) + apply(self.tk.call, (self._w, 'item', 'configure', entry, col) + + self._options(cnf, kw)) + + def item_create(self, entry, col, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'item', 'create', entry, col) + self._options(cnf, kw)) + + def item_exists(self, entry, col): + return self.tk.call(self._w, 'item', 'exists', entry, col) + + def item_delete(self, entry, col): + self.tk.call(self._w, 'item', 'delete', entry, col) + + def nearest(self, y): + return self.tk.call(self._w, 'nearest', y) + + def see(self, entry): + self.tk.call(self._w, 'see', entry) + + def selection_clear(self, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'selection', 'clear') + self._options(cnf, kw)) + + def selection_includes(self, entry): + return self.tk.call(self._w, 'selection', 'includes', entry) + + def selection_set(self, first, last=None): + self.tk.call(self._w, 'selection', 'set', first, last) + + def show_entry(self, entry): + return self.tk.call(self._w, 'show', 'entry', entry) + + def xview(self, *args): + apply(self.tk.call, (self._w, 'xview') + args) + + def yview(self, *args): + apply(self.tk.call, (self._w, 'yview') + args) + +class InputOnly(TixWidget): + """InputOnly - Invisible widget. + + Subwidgets - None""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw) + +class LabelEntry(TixWidget): + """LabelEntry - Entry field with label. Packages an entry widget + and a label into one mega widget. It can beused be used to simplify + the creation of ``entry-form'' type of interface. + + Subwidgets Class + ---------- ----- + label Label + entry Entry""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self, master, 'tixLabelEntry', + ['labelside','options'], cnf, kw) + self.subwidget_list['label'] = _dummyLabel(self, 'label') + self.subwidget_list['entry'] = _dummyEntry(self, 'entry') + +class LabelFrame(TixWidget): + """LabelFrame - Labelled Frame container. Packages a frame widget + and a label into one mega widget. To create widgets inside a + LabelFrame widget, one creates the new widgets relative to the + frame subwidget and manage them inside the frame subwidget. + + Subwidgets Class + ---------- ----- + label Label + frame Frame""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self, master, 'tixLabelFrame', + ['labelside','options'], cnf, kw) + self.subwidget_list['label'] = _dummyLabel(self, 'label') + self.subwidget_list['frame'] = _dummyFrame(self, 'frame') + + +class ListNoteBook(TixWidget): + """A ListNoteBook widget is very similar to the TixNoteBook widget: + it can be used to display many windows in a limited space using a + notebook metaphor. The notebook is divided into a stack of pages + (windows). At one time only one of these pages can be shown. + The user can navigate through these pages by + choosing the name of the desired page in the hlist subwidget.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'vsb') + + + def add(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = TixSubWidget(self, name) + return self.subwidget_list[name] + + def raise_page(self, name): # raise is a python keyword + self.tk.call(self._w, 'raise', name) + +class Meter(TixWidget): + """The Meter widget can be used to show the progress of a background + job which may take a long time to execute. + """ + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixMeter', + ['options'], cnf, kw) + +class NoteBook(TixWidget): + """NoteBook - Multi-page container widget (tabbed notebook metaphor). + + Subwidgets Class + ---------- ----- + nbframe NoteBookFrame + page widgets added dynamically with the add method""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw) + self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe', + destroy_physically=0) + + def add(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = TixSubWidget(self, name) + return self.subwidget_list[name] + + def delete(self, name): + self.tk.call(self._w, 'delete', name) + + def page(self, name): + return self.subwidget(name) + + def pages(self): + # Can't call subwidgets_all directly because we don't want .nbframe + names = self.tk.split(self.tk.call(self._w, 'pages')) + ret = [] + for x in names: + ret.append(self.subwidget(x)) + return ret + + def raise_page(self, name): # raise is a python keyword + self.tk.call(self._w, 'raise', name) + + def raised(self): + return self.tk.call(self._w, 'raised') + +class NoteBookFrame(TixWidget): + """Will be added when Tix documentation is available !!!""" + pass + +class OptionMenu(TixWidget): + """OptionMenu - creates a menu button of options. + + Subwidget Class + --------- ----- + menubutton Menubutton + menu Menu""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw) + self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') + self.subwidget_list['menu'] = _dummyMenu(self, 'menu') + + def add_command(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', 'command', name) + self._options(cnf, kw)) + + def add_separator(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', 'separator', name) + self._options(cnf, kw)) + + def delete(self, name): + self.tk.call(self._w, 'delete', name) + + def disable(self, name): + self.tk.call(self._w, 'disable', name) + + def enable(self, name): + self.tk.call(self._w, 'enable', name) + +class PanedWindow(TixWidget): + """PanedWindow - Multi-pane container widget + allows the user to interactively manipulate the sizes of several + panes. The panes can be arranged either vertically or horizontally.The + user changes the sizes of the panes by dragging the resize handle + between two panes. + + Subwidgets Class + ---------- ----- + g/p widgets added dynamically with the add method.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw) + + def add(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = TixSubWidget(self, name, + check_intermediate=0) + return self.subwidget_list[name] + + def panes(self): + names = self.tk.call(self._w, 'panes') + ret = [] + for x in names: + ret.append(self.subwidget(x)) + return ret + +class PopupMenu(TixWidget): + """PopupMenu widget can be used as a replacement of the tk_popup command. + The advantage of the Tix PopupMenu widget is it requires less application + code to manipulate. + + + Subwidgets Class + ---------- ----- + menubutton Menubutton + menu Menu""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw) + self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') + self.subwidget_list['menu'] = _dummyMenu(self, 'menu') + + def bind_widget(self, widget): + self.tk.call(self._w, 'bind', widget._w) + + def unbind_widget(self, widget): + self.tk.call(self._w, 'unbind', widget._w) + + def post_widget(self, widget, x, y): + self.tk.call(self._w, 'post', widget._w, x, y) + +class ResizeHandle(TixWidget): + """Internal widget to draw resize handles on Scrolled widgets.""" + + def __init__(self, master, cnf={}, **kw): + # There seems to be a Tix bug rejecting the configure method + # Let's try making the flags -static + flags = ['options', 'command', 'cursorfg', 'cursorbg', + 'handlesize', 'hintcolor', 'hintwidth', + 'x', 'y'] + # In fact, x y height width are configurable + TixWidget.__init__(self, master, 'tixResizeHandle', + flags, cnf, kw) + + def attach_widget(self, widget): + self.tk.call(self._w, 'attachwidget', widget._w) + + def detach_widget(self, widget): + self.tk.call(self._w, 'detachwidget', widget._w) + + def hide(self, widget): + self.tk.call(self._w, 'hide', widget._w) + + def show(self, widget): + self.tk.call(self._w, 'show', widget._w) + +class ScrolledHList(TixWidget): + """ScrolledHList - HList with automatic scrollbars.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixScrolledHList', ['options'], + cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class ScrolledListBox(TixWidget): + """ScrolledListBox - Listbox with automatic scrollbars.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw) + self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class ScrolledText(TixWidget): + """ScrolledText - Text with automatic scrollbars.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw) + self.subwidget_list['text'] = _dummyText(self, 'text') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class ScrolledTList(TixWidget): + """ScrolledTList - TList with automatic scrollbars.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixScrolledTList', ['options'], + cnf, kw) + self.subwidget_list['tlist'] = _dummyTList(self, 'tlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class ScrolledWindow(TixWidget): + """ScrolledWindow - Window with automatic scrollbars.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw) + self.subwidget_list['window'] = _dummyFrame(self, 'window') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class Select(TixWidget): + """Select - Container of button subwidgets. It can be used to provide + radio-box or check-box style of selection options for the user. + + Subwidgets are buttons added dynamically using the add method.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixSelect', + ['allowzero', 'radio', 'orientation', 'labelside', + 'options'], + cnf, kw) + self.subwidget_list['label'] = _dummyLabel(self, 'label') + + def add(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = _dummyButton(self, name) + return self.subwidget_list[name] + + def invoke(self, name): + self.tk.call(self._w, 'invoke', name) + +class StdButtonBox(TixWidget): + """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """ + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixStdButtonBox', + ['orientation', 'options'], cnf, kw) + self.subwidget_list['ok'] = _dummyButton(self, 'ok') + self.subwidget_list['apply'] = _dummyButton(self, 'apply') + self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') + self.subwidget_list['help'] = _dummyButton(self, 'help') + + def invoke(self, name): + if self.subwidget_list.has_key(name): + self.tk.call(self._w, 'invoke', name) + +class TList(TixWidget): + """TList - Hierarchy display widget which can be + used to display data in a tabular format. The list entries of a TList + widget are similar to the entries in the Tk listbox widget. The main + differences are (1) the TList widget can display the list entries in a + two dimensional format and (2) you can use graphical images as well as + multiple colors and fonts for the list entries. + + Subwidgets - None""" + + def __init__ (self,master=None,cnf={}, **kw): + TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw) + + def active_set(self, index): + self.tk.call(self._w, 'active', 'set', index) + + def active_clear(self): + self.tk.call(self._w, 'active', 'clear') + + def anchor_set(self, index): + self.tk.call(self._w, 'anchor', 'set', index) + + def anchor_clear(self): + self.tk.call(self._w, 'anchor', 'clear') + + def delete(self, from_, to=None): + self.tk.call(self._w, 'delete', from_, to) + + def dragsite_set(self, index): + self.tk.call(self._w, 'dragsite', 'set', index) + + def dragsite_clear(self): + self.tk.call(self._w, 'dragsite', 'clear') + + def dropsite_set(self, index): + self.tk.call(self._w, 'dropsite', 'set', index) + + def dropsite_clear(self): + self.tk.call(self._w, 'dropsite', 'clear') + + def insert(self, index, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'insert', index) + self._options(cnf, kw)) + + def info_active(self): + return self.tk.call(self._w, 'info', 'active') + + def info_anchor(self): + return self.tk.call(self._w, 'info', 'anchor') + + def info_down(self, index): + return self.tk.call(self._w, 'info', 'down', index) + + def info_left(self, index): + return self.tk.call(self._w, 'info', 'left', index) + + def info_right(self, index): + return self.tk.call(self._w, 'info', 'right', index) + + def info_selection(self): + c = self.tk.call(self._w, 'info', 'selection') + return self.tk.splitlist(c) + + def info_size(self): + return self.tk.call(self._w, 'info', 'size') + + def info_up(self, index): + return self.tk.call(self._w, 'info', 'up', index) + + def nearest(self, x, y): + return self.tk.call(self._w, 'nearest', x, y) + + def see(self, index): + self.tk.call(self._w, 'see', index) + + def selection_clear(self, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'selection', 'clear') + self._options(cnf, kw)) + + def selection_includes(self, index): + return self.tk.call(self._w, 'selection', 'includes', index) + + def selection_set(self, first, last=None): + self.tk.call(self._w, 'selection', 'set', first, last) + + def xview(self, *args): + apply(self.tk.call, (self._w, 'xview') + args) + + def yview(self, *args): + apply(self.tk.call, (self._w, 'yview') + args) + +class Tree(TixWidget): + """Tree - The tixTree widget can be used to display hierachical + data in a tree form. The user can adjust + the view of the tree by opening or closing parts of the tree.""" + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixTree', + ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + + def autosetmode(self): + self.tk.call(self._w, 'autosetmode') + + def close(self, entrypath): + self.tk.call(self._w, 'close', entrypath) + + def getmode(self, entrypath): + return self.tk.call(self._w, 'getmode', entrypath) + + def open(self, entrypath): + self.tk.call(self._w, 'open', entrypath) + + def setmode(self, entrypath, mode='none'): + self.tk.call(self._w, 'setmode', entrypath, mode) + + +# Could try subclassing Tree for CheckList - would need another arg to init +class CheckList(TixWidget): + """The CheckList widget + displays a list of items to be selected by the user. CheckList acts + similarly to the Tk checkbutton or radiobutton widgets, except it is + capable of handling many more items than checkbuttons or radiobuttons. + """ + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixCheckList', + ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + + def autosetmode(self): + self.tk.call(self._w, 'autosetmode') + + def close(self, entrypath): + self.tk.call(self._w, 'close', entrypath) + + def getmode(self, entrypath): + return self.tk.call(self._w, 'getmode', entrypath) + + def open(self, entrypath): + self.tk.call(self._w, 'open', entrypath) + + def getselection(self, mode='on'): + '''Mode can be on, off, default''' + self.tk.call(self._w, 'getselection', mode) + + def getstatus(self, entrypath): + self.tk.call(self._w, 'getstatus', entrypath) + + def setstatus(self, entrypath, mode='on'): + self.tk.call(self._w, 'setstatus', entrypath, mode) + + +########################################################################### +### The subclassing below is used to instantiate the subwidgets in each ### +### mega widget. This allows us to access their methods directly. ### +########################################################################### + +class _dummyButton(Button, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyCheckbutton(Checkbutton, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyEntry(Entry, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyFrame(Frame, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyLabel(Label, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyListbox(Listbox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyMenu(Menu, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyMenubutton(Menubutton, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyScrollbar(Scrollbar, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyText(Text, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyScrolledListBox(ScrolledListBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class _dummyHList(HList, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyScrolledHList(ScrolledHList, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class _dummyTList(TList, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + +class _dummyComboBox(ComboBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['entry'] = _dummyEntry(self, 'entry') + self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') + # I'm not sure about this destroy_physically=0 in all cases; + # it may depend on if -dropdown is true; I've added as a trial + self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, + 'slistbox', + destroy_physically=0) + self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox', + destroy_physically=0) + +class _dummyDirList(DirList, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + +class _dummyDirSelectBox(DirSelectBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') + self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') + +class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') + self.subwidget_list['ok'] = _dummyButton(self, 'ok') + self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') + self.subwidget_list['types'] = _dummyComboBox(self, 'types') + self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') + self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') + self.subwidget_list['file'] = _dummyComboBox(self, 'file') + self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') + +class _dummyFileSelectBox(FileSelectBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') + self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') + self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') + self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') + +class _dummyFileComboBox(ComboBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx') + +class _dummyStdButtonBox(StdButtonBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['ok'] = _dummyButton(self, 'ok') + self.subwidget_list['apply'] = _dummyButton(self, 'apply') + self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') + self.subwidget_list['help'] = _dummyButton(self, 'help') + +class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget): + def __init__(self, master, name, destroy_physically=0): + TixSubWidget.__init__(self, master, name, destroy_physically) + +######################## +### Utility Routines ### +######################## + +# Returns the qualified path name for the widget. Normally used to set +# default options for subwidgets. See tixwidgets.py +def OptionName(widget): + return widget.tk.call('tixOptionName', widget._w) + +# Called with a dictionary argument of the form +# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'} +# returns a string which can be used to configure the fsbox file types +# in an ExFileSelectBox. i.e., +# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}' +def FileTypeList(dict): + s = '' + for type in dict.keys(): + s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} ' + return s + +# Still to be done: +class CObjView(TixWidget): + """This file implements the Canvas Object View widget. This is a base + class of IconView. It implements automatic placement/adjustment of the + scrollbars according to the canvas objects inside the canvas subwidget. + The scrollbars are adjusted so that the canvas is just large enough + to see all the objects. + """ + pass + diff --git a/lib-python/2.2/lib-tk/Tkconstants.py b/lib-python/2.2/lib-tk/Tkconstants.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/Tkconstants.py @@ -0,0 +1,103 @@ +# Symbolic constants for Tk + +# Booleans +NO=FALSE=OFF=0 +YES=TRUE=ON=1 + +# -anchor and -sticky +N='n' +S='s' +W='w' +E='e' +NW='nw' +SW='sw' +NE='ne' +SE='se' +NS='ns' +EW='ew' +NSEW='nsew' +CENTER='center' + +# -fill +NONE='none' +X='x' +Y='y' +BOTH='both' + +# -side +LEFT='left' +TOP='top' +RIGHT='right' +BOTTOM='bottom' + +# -relief +RAISED='raised' +SUNKEN='sunken' +FLAT='flat' +RIDGE='ridge' +GROOVE='groove' +SOLID = 'solid' + +# -orient +HORIZONTAL='horizontal' +VERTICAL='vertical' + +# -tabs +NUMERIC='numeric' + +# -wrap +CHAR='char' +WORD='word' + +# -align +BASELINE='baseline' + +# -bordermode +INSIDE='inside' +OUTSIDE='outside' + +# Special tags, marks and insert positions +SEL='sel' +SEL_FIRST='sel.first' +SEL_LAST='sel.last' +END='end' +INSERT='insert' +CURRENT='current' +ANCHOR='anchor' +ALL='all' # e.g. Canvas.delete(ALL) + +# Text widget and button states +NORMAL='normal' +DISABLED='disabled' +ACTIVE='active' + +# Menu item types +CASCADE='cascade' +CHECKBUTTON='checkbutton' +COMMAND='command' +RADIOBUTTON='radiobutton' +SEPARATOR='separator' + +# Selection modes for list boxes +SINGLE='single' +BROWSE='browse' +MULTIPLE='multiple' +EXTENDED='extended' + +# Various canvas styles +PIESLICE='pieslice' +CHORD='chord' +ARC='arc' +FIRST='first' +LAST='last' +BUTT='butt' +PROJECTING='projecting' +ROUND='round' +BEVEL='bevel' +MITER='miter' + +# Arguments to xview/yview +MOVETO='moveto' +SCROLL='scroll' +UNITS='units' +PAGES='pages' diff --git a/lib-python/2.2/lib-tk/Tkdnd.py b/lib-python/2.2/lib-tk/Tkdnd.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/Tkdnd.py @@ -0,0 +1,321 @@ +"""Drag-and-drop support for Tkinter. + +This is very preliminary. I currently only support dnd *within* one +application, between different windows (or within the same window). + +I an trying to make this as generic as possible -- not dependent on +the use of a particular widget or icon type, etc. I also hope that +this will work with Pmw. + +To enable an object to be dragged, you must create an event binding +for it that starts the drag-and-drop process. Typically, you should +bind to a callback function that you write. The function +should call Tkdnd.dnd_start(source, event), where 'source' is the +object to be dragged, and 'event' is the event that invoked the call +(the argument to your callback function). Even though this is a class +instantiation, the returned instance should not be stored -- it will +be kept alive automatically for the duration of the drag-and-drop. + +When a drag-and-drop is already in process for the Tk interpreter, the +call is *ignored*; this normally averts starting multiple simultaneous +dnd processes, e.g. because different button callbacks all +dnd_start(). + +The object is *not* necessarily a widget -- it can be any +application-specific object that is meaningful to potential +drag-and-drop targets. + +Potential drag-and-drop targets are discovered as follows. Whenever +the mouse moves, and at the start and end of a drag-and-drop move, the +Tk widget directly under the mouse is inspected. This is the target +widget (not to be confused with the target object, yet to be +determined). If there is no target widget, there is no dnd target +object. If there is a target widget, and it has an attribute +dnd_accept, this should be a function (or any callable object). The +function is called as dnd_accept(source, event), where 'source' is the +object being dragged (the object passed to dnd_start() above), and +'event' is the most recent event object (generally a event; +it can also be or ). If the dnd_accept() +function returns something other than None, this is the new dnd target +object. If dnd_accept() returns None, or if the target widget has no +dnd_accept attribute, the target widget's parent is considered as the +target widget, and the search for a target object is repeated from +there. If necessary, the search is repeated all the way up to the +root widget. If none of the target widgets can produce a target +object, there is no target object (the target object is None). + +The target object thus produced, if any, is called the new target +object. It is compared with the old target object (or None, if there +was no old target widget). There are several cases ('source' is the +source object, and 'event' is the most recent event object): + +- Both the old and new target objects are None. Nothing happens. + +- The old and new target objects are the same object. Its method +dnd_motion(source, event) is called. + +- The old target object was None, and the new target object is not +None. The new target object's method dnd_enter(source, event) is +called. + +- The new target object is None, and the old target object is not +None. The old target object's method dnd_leave(source, event) is +called. + +- The old and new target objects differ and neither is None. The old +target object's method dnd_leave(source, event), and then the new +target object's method dnd_enter(source, event) is called. + +Once this is done, the new target object replaces the old one, and the +Tk mainloop proceeds. The return value of the methods mentioned above +is ignored; if they raise an exception, the normal exception handling +mechanisms take over. + +The drag-and-drop processes can end in two ways: a final target object +is selected, or no final target object is selected. When a final +target object is selected, it will always have been notified of the +potential drop by a call to its dnd_enter() method, as described +above, and possibly one or more calls to its dnd_motion() method; its +dnd_leave() method has not been called since the last call to +dnd_enter(). The target is notified of the drop by a call to its +method dnd_commit(source, event). + +If no final target object is selected, and there was an old target +object, its dnd_leave(source, event) method is called to complete the +dnd sequence. + +Finally, the source object is notified that the drag-and-drop process +is over, by a call to source.dnd_end(target, event), specifying either +the selected target object, or None if no target object was selected. +The source object can use this to implement the commit action; this is +sometimes simpler than to do it in the target's dnd_commit(). The +target's dnd_commit() method could then simply be aliased to +dnd_leave(). + +At any time during a dnd sequence, the application can cancel the +sequence by calling the cancel() method on the object returned by +dnd_start(). This will call dnd_leave() if a target is currently +active; it will never call dnd_commit(). + +""" + + +import Tkinter + + +# The factory function + +def dnd_start(source, event): + h = DndHandler(source, event) + if h.root: + return h + else: + return None + + +# The class that does the work + +class DndHandler: + + root = None + + def __init__(self, source, event): + if event.num > 5: + return + root = event.widget._root() + try: + root.__dnd + return # Don't start recursive dnd + except AttributeError: + root.__dnd = self + self.root = root + self.source = source + self.target = None + self.initial_button = button = event.num + self.initial_widget = widget = event.widget + self.release_pattern = "" % (button, button) + self.save_cursor = widget['cursor'] or "" + widget.bind(self.release_pattern, self.on_release) + widget.bind("", self.on_motion) + widget['cursor'] = "hand2" + + def __del__(self): + root = self.root + self.root = None + if root: + try: + del root.__dnd + except AttributeError: + pass + + def on_motion(self, event): + x, y = event.x_root, event.y_root + target_widget = self.initial_widget.winfo_containing(x, y) + source = self.source + new_target = None + while target_widget: + try: + attr = target_widget.dnd_accept + except AttributeError: + pass + else: + new_target = attr(source, event) + if new_target: + break + target_widget = target_widget.master + old_target = self.target + if old_target is new_target: + if old_target: + old_target.dnd_motion(source, event) + else: + if old_target: + self.target = None + old_target.dnd_leave(source, event) + if new_target: + new_target.dnd_enter(source, event) + self.target = new_target + + def on_release(self, event): + self.finish(event, 1) + + def cancel(self, event=None): + self.finish(event, 0) + + def finish(self, event, commit=0): + target = self.target + source = self.source + widget = self.initial_widget + root = self.root + try: + del root.__dnd + self.initial_widget.unbind(self.release_pattern) + self.initial_widget.unbind("") + widget['cursor'] = self.save_cursor + self.target = self.source = self.initial_widget = self.root = None + if target: + if commit: + target.dnd_commit(source, event) + else: + target.dnd_leave(source, event) + finally: + source.dnd_end(target, event) + + + +# ---------------------------------------------------------------------- +# The rest is here for testing and demonstration purposes only! + +class Icon: + + def __init__(self, name): + self.name = name + self.canvas = self.label = self.id = None + + def attach(self, canvas, x=10, y=10): + if canvas is self.canvas: + self.canvas.coords(self.id, x, y) + return + if self.canvas: + self.detach() + if not canvas: + return + label = Tkinter.Label(canvas, text=self.name, + borderwidth=2, relief="raised") + id = canvas.create_window(x, y, window=label, anchor="nw") + self.canvas = canvas + self.label = label + self.id = id + label.bind("", self.press) + + def detach(self): + canvas = self.canvas + if not canvas: + return + id = self.id + label = self.label + self.canvas = self.label = self.id = None + canvas.delete(id) + label.destroy() + + def press(self, event): + if dnd_start(self, event): + # where the pointer is relative to the label widget: + self.x_off = event.x + self.y_off = event.y + # where the widget is relative to the canvas: + self.x_orig, self.y_orig = self.canvas.coords(self.id) + + def move(self, event): + x, y = self.where(self.canvas, event) + self.canvas.coords(self.id, x, y) + + def putback(self): + self.canvas.coords(self.id, self.x_orig, self.y_orig) + + def where(self, canvas, event): + # where the corner of the canvas is relative to the screen: + x_org = canvas.winfo_rootx() + y_org = canvas.winfo_rooty() + # where the pointer is relative to the canvas widget: + x = event.x_root - x_org + y = event.y_root - y_org + # compensate for initial pointer offset + return x - self.x_off, y - self.y_off + + def dnd_end(self, target, event): + pass + +class Tester: + + def __init__(self, root): + self.top = Tkinter.Toplevel(root) + self.canvas = Tkinter.Canvas(self.top, width=100, height=100) + self.canvas.pack(fill="both", expand=1) + self.canvas.dnd_accept = self.dnd_accept + + def dnd_accept(self, source, event): + return self + + def dnd_enter(self, source, event): + self.canvas.focus_set() # Show highlight border + x, y = source.where(self.canvas, event) + x1, y1, x2, y2 = source.canvas.bbox(source.id) + dx, dy = x2-x1, y2-y1 + self.dndid = self.canvas.create_rectangle(x, y, x+dx, y+dy) + self.dnd_motion(source, event) + + def dnd_motion(self, source, event): + x, y = source.where(self.canvas, event) + x1, y1, x2, y2 = self.canvas.bbox(self.dndid) + self.canvas.move(self.dndid, x-x1, y-y1) + + def dnd_leave(self, source, event): + self.top.focus_set() # Hide highlight border + self.canvas.delete(self.dndid) + self.dndid = None + + def dnd_commit(self, source, event): + self.dnd_leave(source, event) + x, y = source.where(self.canvas, event) + source.attach(self.canvas, x, y) + +def test(): + root = Tkinter.Tk() + root.geometry("+1+1") + Tkinter.Button(command=root.quit, text="Quit").pack() + t1 = Tester(root) + t1.top.geometry("+1+60") + t2 = Tester(root) + t2.top.geometry("+120+60") + t3 = Tester(root) + t3.top.geometry("+240+60") + i1 = Icon("ICON1") + i2 = Icon("ICON2") + i3 = Icon("ICON3") + i1.attach(t1.canvas) + i2.attach(t2.canvas) + i3.attach(t3.canvas) + root.mainloop() + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/lib-tk/Tkinter.py b/lib-python/2.2/lib-tk/Tkinter.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/Tkinter.py @@ -0,0 +1,3141 @@ +"""Wrapper functions for Tcl/Tk. + +Tkinter provides classes which allow the display, positioning and +control of widgets. Toplevel widgets are Tk and Toplevel. Other +widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton, +Checkbutton, Scale, Listbox, Scrollbar, OptionMenu. Properties of the +widgets are specified with keyword arguments. Keyword arguments have +the same name as the corresponding resource under Tk. + +Widgets are positioned with one of the geometry managers Place, Pack +or Grid. These managers can be called with methods place, pack, grid +available in every Widget. + +Actions are bound to events by resources (e.g. keyword argument +command) or with the method bind. + +Example (Hello, World): +import Tkinter +from Tkconstants import * +tk = Tkinter.Tk() +frame = Tkinter.Frame(tk, relief=RIDGE, borderwidth=2) +frame.pack(fill=BOTH,expand=1) +label = Tkinter.Label(frame, text="Hello, World") +label.pack(fill=X, expand=1) +button = Tkinter.Button(frame,text="Exit",command=tk.destroy) +button.pack(side=BOTTOM) +tk.mainloop() +""" + +__version__ = "$Revision$" + +import sys +if sys.platform == "win32": + import FixTk # Attempt to configure Tcl/Tk without requiring PATH +import _tkinter # If this fails your Python may not be configured for Tk +tkinter = _tkinter # b/w compat for export +TclError = _tkinter.TclError +from types import * +from Tkconstants import * +try: + import MacOS; _MacOS = MacOS; del MacOS +except ImportError: + _MacOS = None + +TkVersion = float(_tkinter.TK_VERSION) +TclVersion = float(_tkinter.TCL_VERSION) + +READABLE = _tkinter.READABLE +WRITABLE = _tkinter.WRITABLE +EXCEPTION = _tkinter.EXCEPTION + +# These are not always defined, e.g. not on Win32 with Tk 8.0 :-( +try: _tkinter.createfilehandler +except AttributeError: _tkinter.createfilehandler = None +try: _tkinter.deletefilehandler +except AttributeError: _tkinter.deletefilehandler = None + + +def _flatten(tuple): + """Internal function.""" + res = () + for item in tuple: + if type(item) in (TupleType, ListType): + res = res + _flatten(item) + elif item is not None: + res = res + (item,) + return res + +try: _flatten = _tkinter._flatten +except AttributeError: pass + +def _cnfmerge(cnfs): + """Internal function.""" + if type(cnfs) is DictionaryType: + return cnfs + elif type(cnfs) in (NoneType, StringType): + return cnfs + else: + cnf = {} + for c in _flatten(cnfs): + try: + cnf.update(c) + except (AttributeError, TypeError), msg: + print "_cnfmerge: fallback due to:", msg + for k, v in c.items(): + cnf[k] = v + return cnf + +try: _cnfmerge = _tkinter._cnfmerge +except AttributeError: pass + +class Event: + """Container for the properties of an event. + + Instances of this type are generated if one of the following events occurs: + + KeyPress, KeyRelease - for keyboard events + ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events + Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate, + Colormap, Gravity, Reparent, Property, Destroy, Activate, + Deactivate - for window events. + + If a callback function for one of these events is registered + using bind, bind_all, bind_class, or tag_bind, the callback is + called with an Event as first argument. It will have the + following attributes (in braces are the event types for which + the attribute is valid): + + serial - serial number of event + num - mouse button pressed (ButtonPress, ButtonRelease) + focus - whether the window has the focus (Enter, Leave) + height - height of the exposed window (Configure, Expose) + width - width of the exposed window (Configure, Expose) + keycode - keycode of the pressed key (KeyPress, KeyRelease) + state - state of the event as a number (ButtonPress, ButtonRelease, + Enter, KeyPress, KeyRelease, + Leave, Motion) + state - state as a string (Visibility) + time - when the event occurred + x - x-position of the mouse + y - y-position of the mouse + x_root - x-position of the mouse on the screen + (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) + y_root - y-position of the mouse on the screen + (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) + char - pressed character (KeyPress, KeyRelease) + send_event - see X/Windows documentation + keysym - keysym of the the event as a string (KeyPress, KeyRelease) + keysym_num - keysym of the event as a number (KeyPress, KeyRelease) + type - type of the event as a number + widget - widget in which the event occurred + delta - delta of wheel movement (MouseWheel) + """ + pass + +_support_default_root = 1 +_default_root = None + +def NoDefaultRoot(): + """Inhibit setting of default root window. + + Call this function to inhibit that the first instance of + Tk is used for windows without an explicit parent window. + """ + global _support_default_root + _support_default_root = 0 + global _default_root + _default_root = None + del _default_root + +def _tkerror(err): + """Internal function.""" + pass + +def _exit(code='0'): + """Internal function. Calling it will throw the exception SystemExit.""" + raise SystemExit, code + +_varnum = 0 +class Variable: + """Internal class. Base class to define value holders for e.g. buttons.""" + _default = "" + def __init__(self, master=None): + """Construct a variable with an optional MASTER as master widget. + The variable is named PY_VAR_number in Tcl. + """ + global _varnum + if not master: + master = _default_root + self._master = master + self._tk = master.tk + self._name = 'PY_VAR' + `_varnum` + _varnum = _varnum + 1 + self.set(self._default) + def __del__(self): + """Unset the variable in Tcl.""" + self._tk.globalunsetvar(self._name) + def __str__(self): + """Return the name of the variable in Tcl.""" + return self._name + def set(self, value): + """Set the variable to VALUE.""" + return self._tk.globalsetvar(self._name, value) + def trace_variable(self, mode, callback): + """Define a trace callback for the variable. + + MODE is one of "r", "w", "u" for read, write, undefine. + CALLBACK must be a function which is called when + the variable is read, written or undefined. + + Return the name of the callback. + """ + cbname = self._master._register(callback) + self._tk.call("trace", "variable", self._name, mode, cbname) + return cbname + trace = trace_variable + def trace_vdelete(self, mode, cbname): + """Delete the trace callback for a variable. + + MODE is one of "r", "w", "u" for read, write, undefine. + CBNAME is the name of the callback returned from trace_variable or trace. + """ + self._tk.call("trace", "vdelete", self._name, mode, cbname) + self._master.deletecommand(cbname) + def trace_vinfo(self): + """Return all trace callback information.""" + return map(self._tk.split, self._tk.splitlist( + self._tk.call("trace", "vinfo", self._name))) + +class StringVar(Variable): + """Value holder for strings variables.""" + _default = "" + def __init__(self, master=None): + """Construct a string variable. + + MASTER can be given as master widget.""" + Variable.__init__(self, master) + + def get(self): + """Return value of variable as string.""" + return self._tk.globalgetvar(self._name) + +class IntVar(Variable): + """Value holder for integer variables.""" + _default = 0 + def __init__(self, master=None): + """Construct an integer variable. + + MASTER can be given as master widget.""" + Variable.__init__(self, master) + + def get(self): + """Return the value of the variable as an integer.""" + return getint(self._tk.globalgetvar(self._name)) + +class DoubleVar(Variable): + """Value holder for float variables.""" + _default = 0.0 + def __init__(self, master=None): + """Construct a float variable. + + MASTER can be given as a master widget.""" + Variable.__init__(self, master) + + def get(self): + """Return the value of the variable as a float.""" + return getdouble(self._tk.globalgetvar(self._name)) + +class BooleanVar(Variable): + """Value holder for boolean variables.""" + _default = "false" + def __init__(self, master=None): + """Construct a boolean variable. + + MASTER can be given as a master widget.""" + Variable.__init__(self, master) + + def get(self): + """Return the value of the variable as 0 or 1.""" + return self._tk.getboolean(self._tk.globalgetvar(self._name)) + +def mainloop(n=0): + """Run the main loop of Tcl.""" + _default_root.tk.mainloop(n) + +getint = int + +getdouble = float + +def getboolean(s): + """Convert true and false to integer values 1 and 0.""" + return _default_root.tk.getboolean(s) + +# Methods defined on both toplevel and interior widgets +class Misc: + """Internal class. + + Base class which defines methods common for interior widgets.""" + + # XXX font command? + _tclCommands = None + def destroy(self): + """Internal function. + + Delete all Tcl commands created for + this widget in the Tcl interpreter.""" + if self._tclCommands is not None: + for name in self._tclCommands: + #print '- Tkinter: deleted command', name + self.tk.deletecommand(name) + self._tclCommands = None + def deletecommand(self, name): + """Internal function. + + Delete the Tcl command provided in NAME.""" + #print '- Tkinter: deleted command', name + self.tk.deletecommand(name) + try: + self._tclCommands.remove(name) + except ValueError: + pass + def tk_strictMotif(self, boolean=None): + """Set Tcl internal variable, whether the look and feel + should adhere to Motif. + + A parameter of 1 means adhere to Motif (e.g. no color + change if mouse passes over slider). + Returns the set value.""" + return self.tk.getboolean(self.tk.call( + 'set', 'tk_strictMotif', boolean)) + def tk_bisque(self): + """Change the color scheme to light brown as used in Tk 3.6 and before.""" + self.tk.call('tk_bisque') + def tk_setPalette(self, *args, **kw): + """Set a new color scheme for all widget elements. + + A single color as argument will cause that all colors of Tk + widget elements are derived from this. + Alternatively several keyword parameters and its associated + colors can be given. The following keywords are valid: + activeBackground, foreground, selectColor, + activeForeground, highlightBackground, selectBackground, + background, highlightColor, selectForeground, + disabledForeground, insertBackground, troughColor.""" + self.tk.call(('tk_setPalette',) + + _flatten(args) + _flatten(kw.items())) + def tk_menuBar(self, *args): + """Do not use. Needed in Tk 3.6 and earlier.""" + pass # obsolete since Tk 4.0 + def wait_variable(self, name='PY_VAR'): + """Wait until the variable is modified. + + A parameter of type IntVar, StringVar, DoubleVar or + BooleanVar must be given.""" + self.tk.call('tkwait', 'variable', name) + waitvar = wait_variable # XXX b/w compat + def wait_window(self, window=None): + """Wait until a WIDGET is destroyed. + + If no parameter is given self is used.""" + if window is None: + window = self + self.tk.call('tkwait', 'window', window._w) + def wait_visibility(self, window=None): + """Wait until the visibility of a WIDGET changes + (e.g. it appears). + + If no parameter is given self is used.""" + if window is None: + window = self + self.tk.call('tkwait', 'visibility', window._w) + def setvar(self, name='PY_VAR', value='1'): + """Set Tcl variable NAME to VALUE.""" + self.tk.setvar(name, value) + def getvar(self, name='PY_VAR'): + """Return value of Tcl variable NAME.""" + return self.tk.getvar(name) + getint = int + getdouble = float + def getboolean(self, s): + """Return 0 or 1 for Tcl boolean values true and false given as parameter.""" + return self.tk.getboolean(s) + def focus_set(self): + """Direct input focus to this widget. + + If the application currently does not have the focus + this widget will get the focus if the application gets + the focus through the window manager.""" + self.tk.call('focus', self._w) + focus = focus_set # XXX b/w compat? + def focus_force(self): + """Direct input focus to this widget even if the + application does not have the focus. Use with + caution!""" + self.tk.call('focus', '-force', self._w) + def focus_get(self): + """Return the widget which has currently the focus in the + application. + + Use focus_displayof to allow working with several + displays. Return None if application does not have + the focus.""" + name = self.tk.call('focus') + if name == 'none' or not name: return None + return self._nametowidget(name) + def focus_displayof(self): + """Return the widget which has currently the focus on the + display where this widget is located. + + Return None if the application does not have the focus.""" + name = self.tk.call('focus', '-displayof', self._w) + if name == 'none' or not name: return None + return self._nametowidget(name) + def focus_lastfor(self): + """Return the widget which would have the focus if top level + for this widget gets the focus from the window manager.""" + name = self.tk.call('focus', '-lastfor', self._w) + if name == 'none' or not name: return None + return self._nametowidget(name) + def tk_focusFollowsMouse(self): + """The widget under mouse will get automatically focus. Can not + be disabled easily.""" + self.tk.call('tk_focusFollowsMouse') + def tk_focusNext(self): + """Return the next widget in the focus order which follows + widget which has currently the focus. + + The focus order first goes to the next child, then to + the children of the child recursively and then to the + next sibling which is higher in the stacking order. A + widget is omitted if it has the takefocus resource set + to 0.""" + name = self.tk.call('tk_focusNext', self._w) + if not name: return None + return self._nametowidget(name) + def tk_focusPrev(self): + """Return previous widget in the focus order. See tk_focusNext for details.""" + name = self.tk.call('tk_focusPrev', self._w) + if not name: return None + return self._nametowidget(name) + def after(self, ms, func=None, *args): + """Call function once after given time. + + MS specifies the time in milliseconds. FUNC gives the + function which shall be called. Additional parameters + are given as parameters to the function call. Return + identifier to cancel scheduling with after_cancel.""" + if not func: + # I'd rather use time.sleep(ms*0.001) + self.tk.call('after', ms) + else: + # XXX Disgusting hack to clean up after calling func + tmp = [] + def callit(func=func, args=args, self=self, tmp=tmp): + try: + apply(func, args) + finally: + try: + self.deletecommand(tmp[0]) + except TclError: + pass + name = self._register(callit) + tmp.append(name) + return self.tk.call('after', ms, name) + def after_idle(self, func, *args): + """Call FUNC once if the Tcl main loop has no event to + process. + + Return an identifier to cancel the scheduling with + after_cancel.""" + return apply(self.after, ('idle', func) + args) + def after_cancel(self, id): + """Cancel scheduling of function identified with ID. + + Identifier returned by after or after_idle must be + given as first parameter.""" + try: + (script, type) = self.tk.splitlist( + self.tk.call('after', 'info', id)) + self.deletecommand(script) + except TclError: + pass + self.tk.call('after', 'cancel', id) + def bell(self, displayof=0): + """Ring a display's bell.""" + self.tk.call(('bell',) + self._displayof(displayof)) + # Clipboard handling: + def clipboard_clear(self, **kw): + """Clear the data in the Tk clipboard. + + A widget specified for the optional displayof keyword + argument specifies the target display.""" + if not kw.has_key('displayof'): kw['displayof'] = self._w + self.tk.call(('clipboard', 'clear') + self._options(kw)) + def clipboard_append(self, string, **kw): + """Append STRING to the Tk clipboard. + + A widget specified at the optional displayof keyword + argument specifies the target display. The clipboard + can be retrieved with selection_get.""" + if not kw.has_key('displayof'): kw['displayof'] = self._w + self.tk.call(('clipboard', 'append') + self._options(kw) + + ('--', string)) + # XXX grab current w/o window argument + def grab_current(self): + """Return widget which has currently the grab in this application + or None.""" + name = self.tk.call('grab', 'current', self._w) + if not name: return None + return self._nametowidget(name) + def grab_release(self): + """Release grab for this widget if currently set.""" + self.tk.call('grab', 'release', self._w) + def grab_set(self): + """Set grab for this widget. + + A grab directs all events to this and descendant + widgets in the application.""" + self.tk.call('grab', 'set', self._w) + def grab_set_global(self): + """Set global grab for this widget. + + A global grab directs all events to this and + descendant widgets on the display. Use with caution - + other applications do not get events anymore.""" + self.tk.call('grab', 'set', '-global', self._w) + def grab_status(self): + """Return None, "local" or "global" if this widget has + no, a local or a global grab.""" + status = self.tk.call('grab', 'status', self._w) + if status == 'none': status = None + return status + def lower(self, belowThis=None): + """Lower this widget in the stacking order.""" + self.tk.call('lower', self._w, belowThis) + def option_add(self, pattern, value, priority = None): + """Set a VALUE (second parameter) for an option + PATTERN (first parameter). + + An optional third parameter gives the numeric priority + (defaults to 80).""" + self.tk.call('option', 'add', pattern, value, priority) + def option_clear(self): + """Clear the option database. + + It will be reloaded if option_add is called.""" + self.tk.call('option', 'clear') + def option_get(self, name, className): + """Return the value for an option NAME for this widget + with CLASSNAME. + + Values with higher priority override lower values.""" + return self.tk.call('option', 'get', self._w, name, className) + def option_readfile(self, fileName, priority = None): + """Read file FILENAME into the option database. + + An optional second parameter gives the numeric + priority.""" + self.tk.call('option', 'readfile', fileName, priority) + def selection_clear(self, **kw): + """Clear the current X selection.""" + if not kw.has_key('displayof'): kw['displayof'] = self._w + self.tk.call(('selection', 'clear') + self._options(kw)) + def selection_get(self, **kw): + """Return the contents of the current X selection. + + A keyword parameter selection specifies the name of + the selection and defaults to PRIMARY. A keyword + parameter displayof specifies a widget on the display + to use.""" + if not kw.has_key('displayof'): kw['displayof'] = self._w + return self.tk.call(('selection', 'get') + self._options(kw)) + def selection_handle(self, command, **kw): + """Specify a function COMMAND to call if the X + selection owned by this widget is queried by another + application. + + This function must return the contents of the + selection. The function will be called with the + arguments OFFSET and LENGTH which allows the chunking + of very long selections. The following keyword + parameters can be provided: + selection - name of the selection (default PRIMARY), + type - type of the selection (e.g. STRING, FILE_NAME).""" + name = self._register(command) + self.tk.call(('selection', 'handle') + self._options(kw) + + (self._w, name)) + def selection_own(self, **kw): + """Become owner of X selection. + + A keyword parameter selection specifies the name of + the selection (default PRIMARY).""" + self.tk.call(('selection', 'own') + + self._options(kw) + (self._w,)) + def selection_own_get(self, **kw): + """Return owner of X selection. + + The following keyword parameter can + be provided: + selection - name of the selection (default PRIMARY), + type - type of the selection (e.g. STRING, FILE_NAME).""" + if not kw.has_key('displayof'): kw['displayof'] = self._w + name = self.tk.call(('selection', 'own') + self._options(kw)) + if not name: return None + return self._nametowidget(name) + def send(self, interp, cmd, *args): + """Send Tcl command CMD to different interpreter INTERP to be executed.""" + return self.tk.call(('send', interp, cmd) + args) + def lower(self, belowThis=None): + """Lower this widget in the stacking order.""" + self.tk.call('lower', self._w, belowThis) + def tkraise(self, aboveThis=None): + """Raise this widget in the stacking order.""" + self.tk.call('raise', self._w, aboveThis) + lift = tkraise + def colormodel(self, value=None): + """Useless. Not implemented in Tk.""" + return self.tk.call('tk', 'colormodel', self._w, value) + def winfo_atom(self, name, displayof=0): + """Return integer which represents atom NAME.""" + args = ('winfo', 'atom') + self._displayof(displayof) + (name,) + return getint(self.tk.call(args)) + def winfo_atomname(self, id, displayof=0): + """Return name of atom with identifier ID.""" + args = ('winfo', 'atomname') \ + + self._displayof(displayof) + (id,) + return self.tk.call(args) + def winfo_cells(self): + """Return number of cells in the colormap for this widget.""" + return getint( + self.tk.call('winfo', 'cells', self._w)) + def winfo_children(self): + """Return a list of all widgets which are children of this widget.""" + result = [] + for child in self.tk.splitlist( + self.tk.call('winfo', 'children', self._w)): + try: + # Tcl sometimes returns extra windows, e.g. for + # menus; those need to be skipped + result.append(self._nametowidget(child)) + except KeyError: + pass + return result + + def winfo_class(self): + """Return window class name of this widget.""" + return self.tk.call('winfo', 'class', self._w) + def winfo_colormapfull(self): + """Return true if at the last color request the colormap was full.""" + return self.tk.getboolean( + self.tk.call('winfo', 'colormapfull', self._w)) + def winfo_containing(self, rootX, rootY, displayof=0): + """Return the widget which is at the root coordinates ROOTX, ROOTY.""" + args = ('winfo', 'containing') \ + + self._displayof(displayof) + (rootX, rootY) + name = self.tk.call(args) + if not name: return None + return self._nametowidget(name) + def winfo_depth(self): + """Return the number of bits per pixel.""" + return getint(self.tk.call('winfo', 'depth', self._w)) + def winfo_exists(self): + """Return true if this widget exists.""" + return getint( + self.tk.call('winfo', 'exists', self._w)) + def winfo_fpixels(self, number): + """Return the number of pixels for the given distance NUMBER + (e.g. "3c") as float.""" + return getdouble(self.tk.call( + 'winfo', 'fpixels', self._w, number)) + def winfo_geometry(self): + """Return geometry string for this widget in the form "widthxheight+X+Y".""" + return self.tk.call('winfo', 'geometry', self._w) + def winfo_height(self): + """Return height of this widget.""" + return getint( + self.tk.call('winfo', 'height', self._w)) + def winfo_id(self): + """Return identifier ID for this widget.""" + return self.tk.getint( + self.tk.call('winfo', 'id', self._w)) + def winfo_interps(self, displayof=0): + """Return the name of all Tcl interpreters for this display.""" + args = ('winfo', 'interps') + self._displayof(displayof) + return self.tk.splitlist(self.tk.call(args)) + def winfo_ismapped(self): + """Return true if this widget is mapped.""" + return getint( + self.tk.call('winfo', 'ismapped', self._w)) + def winfo_manager(self): + """Return the window mananger name for this widget.""" + return self.tk.call('winfo', 'manager', self._w) + def winfo_name(self): + """Return the name of this widget.""" + return self.tk.call('winfo', 'name', self._w) + def winfo_parent(self): + """Return the name of the parent of this widget.""" + return self.tk.call('winfo', 'parent', self._w) + def winfo_pathname(self, id, displayof=0): + """Return the pathname of the widget given by ID.""" + args = ('winfo', 'pathname') \ + + self._displayof(displayof) + (id,) + return self.tk.call(args) + def winfo_pixels(self, number): + """Rounded integer value of winfo_fpixels.""" + return getint( + self.tk.call('winfo', 'pixels', self._w, number)) + def winfo_pointerx(self): + """Return the x coordinate of the pointer on the root window.""" + return getint( + self.tk.call('winfo', 'pointerx', self._w)) + def winfo_pointerxy(self): + """Return a tuple of x and y coordinates of the pointer on the root window.""" + return self._getints( + self.tk.call('winfo', 'pointerxy', self._w)) + def winfo_pointery(self): + """Return the y coordinate of the pointer on the root window.""" + return getint( + self.tk.call('winfo', 'pointery', self._w)) + def winfo_reqheight(self): + """Return requested height of this widget.""" + return getint( + self.tk.call('winfo', 'reqheight', self._w)) + def winfo_reqwidth(self): + """Return requested width of this widget.""" + return getint( + self.tk.call('winfo', 'reqwidth', self._w)) + def winfo_rgb(self, color): + """Return tuple of decimal values for red, green, blue for + COLOR in this widget.""" + return self._getints( + self.tk.call('winfo', 'rgb', self._w, color)) + def winfo_rootx(self): + """Return x coordinate of upper left corner of this widget on the + root window.""" + return getint( + self.tk.call('winfo', 'rootx', self._w)) + def winfo_rooty(self): + """Return y coordinate of upper left corner of this widget on the + root window.""" + return getint( + self.tk.call('winfo', 'rooty', self._w)) + def winfo_screen(self): + """Return the screen name of this widget.""" + return self.tk.call('winfo', 'screen', self._w) + def winfo_screencells(self): + """Return the number of the cells in the colormap of the screen + of this widget.""" + return getint( + self.tk.call('winfo', 'screencells', self._w)) + def winfo_screendepth(self): + """Return the number of bits per pixel of the root window of the + screen of this widget.""" + return getint( + self.tk.call('winfo', 'screendepth', self._w)) + def winfo_screenheight(self): + """Return the number of pixels of the height of the screen of this widget + in pixel.""" + return getint( + self.tk.call('winfo', 'screenheight', self._w)) + def winfo_screenmmheight(self): + """Return the number of pixels of the height of the screen of + this widget in mm.""" + return getint( + self.tk.call('winfo', 'screenmmheight', self._w)) + def winfo_screenmmwidth(self): + """Return the number of pixels of the width of the screen of + this widget in mm.""" + return getint( + self.tk.call('winfo', 'screenmmwidth', self._w)) + def winfo_screenvisual(self): + """Return one of the strings directcolor, grayscale, pseudocolor, + staticcolor, staticgray, or truecolor for the default + colormodel of this screen.""" + return self.tk.call('winfo', 'screenvisual', self._w) + def winfo_screenwidth(self): + """Return the number of pixels of the width of the screen of + this widget in pixel.""" + return getint( + self.tk.call('winfo', 'screenwidth', self._w)) + def winfo_server(self): + """Return information of the X-Server of the screen of this widget in + the form "XmajorRminor vendor vendorVersion".""" + return self.tk.call('winfo', 'server', self._w) + def winfo_toplevel(self): + """Return the toplevel widget of this widget.""" + return self._nametowidget(self.tk.call( + 'winfo', 'toplevel', self._w)) + def winfo_viewable(self): + """Return true if the widget and all its higher ancestors are mapped.""" + return getint( + self.tk.call('winfo', 'viewable', self._w)) + def winfo_visual(self): + """Return one of the strings directcolor, grayscale, pseudocolor, + staticcolor, staticgray, or truecolor for the + colormodel of this widget.""" + return self.tk.call('winfo', 'visual', self._w) + def winfo_visualid(self): + """Return the X identifier for the visual for this widget.""" + return self.tk.call('winfo', 'visualid', self._w) + def winfo_visualsavailable(self, includeids=0): + """Return a list of all visuals available for the screen + of this widget. + + Each item in the list consists of a visual name (see winfo_visual), a + depth and if INCLUDEIDS=1 is given also the X identifier.""" + data = self.tk.split( + self.tk.call('winfo', 'visualsavailable', self._w, + includeids and 'includeids' or None)) + if type(data) is StringType: + data = [self.tk.split(data)] + return map(self.__winfo_parseitem, data) + def __winfo_parseitem(self, t): + """Internal function.""" + return t[:1] + tuple(map(self.__winfo_getint, t[1:])) + def __winfo_getint(self, x): + """Internal function.""" + return int(x, 0) + def winfo_vrootheight(self): + """Return the height of the virtual root window associated with this + widget in pixels. If there is no virtual root window return the + height of the screen.""" + return getint( + self.tk.call('winfo', 'vrootheight', self._w)) + def winfo_vrootwidth(self): + """Return the width of the virtual root window associated with this + widget in pixel. If there is no virtual root window return the + width of the screen.""" + return getint( + self.tk.call('winfo', 'vrootwidth', self._w)) + def winfo_vrootx(self): + """Return the x offset of the virtual root relative to the root + window of the screen of this widget.""" + return getint( + self.tk.call('winfo', 'vrootx', self._w)) + def winfo_vrooty(self): + """Return the y offset of the virtual root relative to the root + window of the screen of this widget.""" + return getint( + self.tk.call('winfo', 'vrooty', self._w)) + def winfo_width(self): + """Return the width of this widget.""" + return getint( + self.tk.call('winfo', 'width', self._w)) + def winfo_x(self): + """Return the x coordinate of the upper left corner of this widget + in the parent.""" + return getint( + self.tk.call('winfo', 'x', self._w)) + def winfo_y(self): + """Return the y coordinate of the upper left corner of this widget + in the parent.""" + return getint( + self.tk.call('winfo', 'y', self._w)) + def update(self): + """Enter event loop until all pending events have been processed by Tcl.""" + self.tk.call('update') + def update_idletasks(self): + """Enter event loop until all idle callbacks have been called. This + will update the display of windows but not process events caused by + the user.""" + self.tk.call('update', 'idletasks') + def bindtags(self, tagList=None): + """Set or get the list of bindtags for this widget. + + With no argument return the list of all bindtags associated with + this widget. With a list of strings as argument the bindtags are + set to this list. The bindtags determine in which order events are + processed (see bind).""" + if tagList is None: + return self.tk.splitlist( + self.tk.call('bindtags', self._w)) + else: + self.tk.call('bindtags', self._w, tagList) + def _bind(self, what, sequence, func, add, needcleanup=1): + """Internal function.""" + if type(func) is StringType: + self.tk.call(what + (sequence, func)) + elif func: + funcid = self._register(func, self._substitute, + needcleanup) + cmd = ('%sif {"[%s %s]" == "break"} break\n' + % + (add and '+' or '', + funcid, self._subst_format_str)) + self.tk.call(what + (sequence, cmd)) + return funcid + elif sequence: + return self.tk.call(what + (sequence,)) + else: + return self.tk.splitlist(self.tk.call(what)) + def bind(self, sequence=None, func=None, add=None): + """Bind to this widget at event SEQUENCE a call to function FUNC. + + SEQUENCE is a string of concatenated event + patterns. An event pattern is of the form + where MODIFIER is one + of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4, + Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3, + B3, Alt, Button4, B4, Double, Button5, B5 Triple, + Mod1, M1. TYPE is one of Activate, Enter, Map, + ButtonPress, Button, Expose, Motion, ButtonRelease + FocusIn, MouseWheel, Circulate, FocusOut, Property, + Colormap, Gravity Reparent, Configure, KeyPress, Key, + Unmap, Deactivate, KeyRelease Visibility, Destroy, + Leave and DETAIL is the button number for ButtonPress, + ButtonRelease and DETAIL is the Keysym for KeyPress and + KeyRelease. Examples are + for pressing Control and mouse button 1 or + for pressing A and the Alt key (KeyPress can be omitted). + An event pattern can also be a virtual event of the form + <> where AString can be arbitrary. This + event can be generated by event_generate. + If events are concatenated they must appear shortly + after each other. + + FUNC will be called if the event sequence occurs with an + instance of Event as argument. If the return value of FUNC is + "break" no further bound function is invoked. + + An additional boolean parameter ADD specifies whether FUNC will + be called additionally to the other bound function or whether + it will replace the previous function. + + Bind will return an identifier to allow deletion of the bound function with + unbind without memory leak. + + If FUNC or SEQUENCE is omitted the bound function or list + of bound events are returned.""" + + return self._bind(('bind', self._w), sequence, func, add) + def unbind(self, sequence, funcid=None): + """Unbind for this widget for event SEQUENCE the + function identified with FUNCID.""" + self.tk.call('bind', self._w, sequence, '') + if funcid: + self.deletecommand(funcid) + def bind_all(self, sequence=None, func=None, add=None): + """Bind to all widgets at an event SEQUENCE a call to function FUNC. + An additional boolean parameter ADD specifies whether FUNC will + be called additionally to the other bound function or whether + it will replace the previous function. See bind for the return value.""" + return self._bind(('bind', 'all'), sequence, func, add, 0) + def unbind_all(self, sequence): + """Unbind for all widgets for event SEQUENCE all functions.""" + self.tk.call('bind', 'all' , sequence, '') + def bind_class(self, className, sequence=None, func=None, add=None): + + """Bind to widgets with bindtag CLASSNAME at event + SEQUENCE a call of function FUNC. An additional + boolean parameter ADD specifies whether FUNC will be + called additionally to the other bound function or + whether it will replace the previous function. See bind for + the return value.""" + + return self._bind(('bind', className), sequence, func, add, 0) + def unbind_class(self, className, sequence): + """Unbind for a all widgets with bindtag CLASSNAME for event SEQUENCE + all functions.""" + self.tk.call('bind', className , sequence, '') + def mainloop(self, n=0): + """Call the mainloop of Tk.""" + self.tk.mainloop(n) + def quit(self): + """Quit the Tcl interpreter. All widgets will be destroyed.""" + self.tk.quit() + def _getints(self, string): + """Internal function.""" + if string: + return tuple(map(getint, self.tk.splitlist(string))) + def _getdoubles(self, string): + """Internal function.""" + if string: + return tuple(map(getdouble, self.tk.splitlist(string))) + def _getboolean(self, string): + """Internal function.""" + if string: + return self.tk.getboolean(string) + def _displayof(self, displayof): + """Internal function.""" + if displayof: + return ('-displayof', displayof) + if displayof is None: + return ('-displayof', self._w) + return () + def _options(self, cnf, kw = None): + """Internal function.""" + if kw: + cnf = _cnfmerge((cnf, kw)) + else: + cnf = _cnfmerge(cnf) + res = () + for k, v in cnf.items(): + if v is not None: + if k[-1] == '_': k = k[:-1] + if callable(v): + v = self._register(v) + res = res + ('-'+k, v) + return res + def nametowidget(self, name): + """Return the Tkinter instance of a widget identified by + its Tcl name NAME.""" + w = self + if name[0] == '.': + w = w._root() + name = name[1:] + while name: + i = name.find('.') + if i >= 0: + name, tail = name[:i], name[i+1:] + else: + tail = '' + w = w.children[name] + name = tail + return w + _nametowidget = nametowidget + def _register(self, func, subst=None, needcleanup=1): + """Return a newly created Tcl function. If this + function is called, the Python function FUNC will + be executed. An optional function SUBST can + be given which will be executed before FUNC.""" + f = CallWrapper(func, subst, self).__call__ + name = `id(f)` + try: + func = func.im_func + except AttributeError: + pass + try: + name = name + func.__name__ + except AttributeError: + pass + self.tk.createcommand(name, f) + if needcleanup: + if self._tclCommands is None: + self._tclCommands = [] + self._tclCommands.append(name) + #print '+ Tkinter created command', name + return name + register = _register + def _root(self): + """Internal function.""" + w = self + while w.master: w = w.master + return w + _subst_format = ('%#', '%b', '%f', '%h', '%k', + '%s', '%t', '%w', '%x', '%y', + '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y', '%D') + _subst_format_str = " ".join(_subst_format) + def _substitute(self, *args): + """Internal function.""" + if len(args) != len(self._subst_format): return args + getboolean = self.tk.getboolean + + getint = int + def getint_event(s): + """Tk changed behavior in 8.4.2, returning "??" rather more often.""" + try: + return int(s) + except ValueError: + return s + + nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y, D = args + # Missing: (a, c, d, m, o, v, B, R) + e = Event() + # serial field: valid vor all events + # number of button: ButtonPress and ButtonRelease events only + # height field: Configure, ConfigureRequest, Create, + # ResizeRequest, and Expose events only + # keycode field: KeyPress and KeyRelease events only + # time field: "valid for events that contain a time field" + # width field: Configure, ConfigureRequest, Create, ResizeRequest, + # and Expose events only + # x field: "valid for events that contain a x field" + # y field: "valid for events that contain a y field" + # keysym as decimal: KeyPress and KeyRelease events only + # x_root, y_root fields: ButtonPress, ButtonRelease, KeyPress, + # KeyRelease,and Motion events + e.serial = getint(nsign) + e.num = getint_event(b) + try: e.focus = getboolean(f) + except TclError: pass + e.height = getint_event(h) + e.keycode = getint_event(k) + e.state = getint_event(s) + e.time = getint_event(t) + e.width = getint_event(w) + e.x = getint_event(x) + e.y = getint_event(y) + e.char = A + try: e.send_event = getboolean(E) + except TclError: pass + e.keysym = K + e.keysym_num = getint_event(N) + e.type = T + try: + e.widget = self._nametowidget(W) + except KeyError: + e.widget = W + e.x_root = getint_event(X) + e.y_root = getint_event(Y) + try: + e.delta = getint(D) + except ValueError: + e.delta = 0 + return (e,) + def _report_exception(self): + """Internal function.""" + import sys + exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback + root = self._root() + root.report_callback_exception(exc, val, tb) + # These used to be defined in Widget: + def configure(self, cnf=None, **kw): + """Configure resources of a widget. + + The values for resources are specified as keyword + arguments. To get an overview about + the allowed keyword arguments call the method keys. + """ + # XXX ought to generalize this so tag_config etc. can use it + if kw: + cnf = _cnfmerge((cnf, kw)) + elif cnf: + cnf = _cnfmerge(cnf) + if cnf is None: + cnf = {} + for x in self.tk.split( + self.tk.call(self._w, 'configure')): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + if type(cnf) is StringType: + x = self.tk.split(self.tk.call( + self._w, 'configure', '-'+cnf)) + return (x[0][1:],) + x[1:] + self.tk.call((self._w, 'configure') + + self._options(cnf)) + config = configure + def cget(self, key): + """Return the resource value for a KEY given as string.""" + return self.tk.call(self._w, 'cget', '-' + key) + __getitem__ = cget + def __setitem__(self, key, value): + self.configure({key: value}) + def keys(self): + """Return a list of all resource names of this widget.""" + return map(lambda x: x[0][1:], + self.tk.split(self.tk.call(self._w, 'configure'))) + def __str__(self): + """Return the window path name of this widget.""" + return self._w + # Pack methods that apply to the master + _noarg_ = ['_noarg_'] + def pack_propagate(self, flag=_noarg_): + """Set or get the status for propagation of geometry information. + + A boolean argument specifies whether the geometry information + of the slaves will determine the size of this widget. If no argument + is given the current setting will be returned. + """ + if flag is Misc._noarg_: + return self._getboolean(self.tk.call( + 'pack', 'propagate', self._w)) + else: + self.tk.call('pack', 'propagate', self._w, flag) + propagate = pack_propagate + def pack_slaves(self): + """Return a list of all slaves of this widget + in its packing order.""" + return map(self._nametowidget, + self.tk.splitlist( + self.tk.call('pack', 'slaves', self._w))) + slaves = pack_slaves + # Place method that applies to the master + def place_slaves(self): + """Return a list of all slaves of this widget + in its packing order.""" + return map(self._nametowidget, + self.tk.splitlist( + self.tk.call( + 'place', 'slaves', self._w))) + # Grid methods that apply to the master + def grid_bbox(self, column=None, row=None, col2=None, row2=None): + """Return a tuple of integer coordinates for the bounding + box of this widget controlled by the geometry manager grid. + + If COLUMN, ROW is given the bounding box applies from + the cell with row and column 0 to the specified + cell. If COL2 and ROW2 are given the bounding box + starts at that cell. + + The returned integers specify the offset of the upper left + corner in the master widget and the width and height. + """ + args = ('grid', 'bbox', self._w) + if column is not None and row is not None: + args = args + (column, row) + if col2 is not None and row2 is not None: + args = args + (col2, row2) + return self._getints(apply(self.tk.call, args)) or None + + bbox = grid_bbox + def _grid_configure(self, command, index, cnf, kw): + """Internal function.""" + if type(cnf) is StringType and not kw: + if cnf[-1:] == '_': + cnf = cnf[:-1] + if cnf[:1] != '-': + cnf = '-'+cnf + options = (cnf,) + else: + options = self._options(cnf, kw) + if not options: + res = self.tk.call('grid', + command, self._w, index) + words = self.tk.splitlist(res) + dict = {} + for i in range(0, len(words), 2): + key = words[i][1:] + value = words[i+1] + if not value: + value = None + elif '.' in value: + value = getdouble(value) + else: + value = getint(value) + dict[key] = value + return dict + res = self.tk.call( + ('grid', command, self._w, index) + + options) + if len(options) == 1: + if not res: return None + # In Tk 7.5, -width can be a float + if '.' in res: return getdouble(res) + return getint(res) + def grid_columnconfigure(self, index, cnf={}, **kw): + """Configure column INDEX of a grid. + + Valid resources are minsize (minimum size of the column), + weight (how much does additional space propagate to this column) + and pad (how much space to let additionally).""" + return self._grid_configure('columnconfigure', index, cnf, kw) + columnconfigure = grid_columnconfigure + def grid_location(self, x, y): + """Return a tuple of column and row which identify the cell + at which the pixel at position X and Y inside the master + widget is located.""" + return self._getints( + self.tk.call( + 'grid', 'location', self._w, x, y)) or None + def grid_propagate(self, flag=_noarg_): + """Set or get the status for propagation of geometry information. + + A boolean argument specifies whether the geometry information + of the slaves will determine the size of this widget. If no argument + is given, the current setting will be returned. + """ + if flag is Misc._noarg_: + return self._getboolean(self.tk.call( + 'grid', 'propagate', self._w)) + else: + self.tk.call('grid', 'propagate', self._w, flag) + def grid_rowconfigure(self, index, cnf={}, **kw): + """Configure row INDEX of a grid. + + Valid resources are minsize (minimum size of the row), + weight (how much does additional space propagate to this row) + and pad (how much space to let additionally).""" + return self._grid_configure('rowconfigure', index, cnf, kw) + rowconfigure = grid_rowconfigure + def grid_size(self): + """Return a tuple of the number of column and rows in the grid.""" + return self._getints( + self.tk.call('grid', 'size', self._w)) or None + size = grid_size + def grid_slaves(self, row=None, column=None): + """Return a list of all slaves of this widget + in its packing order.""" + args = () + if row is not None: + args = args + ('-row', row) + if column is not None: + args = args + ('-column', column) + return map(self._nametowidget, + self.tk.splitlist(self.tk.call( + ('grid', 'slaves', self._w) + args))) + + # Support for the "event" command, new in Tk 4.2. + # By Case Roole. + + def event_add(self, virtual, *sequences): + """Bind a virtual event VIRTUAL (of the form <>) + to an event SEQUENCE such that the virtual event is triggered + whenever SEQUENCE occurs.""" + args = ('event', 'add', virtual) + sequences + self.tk.call(args) + + def event_delete(self, virtual, *sequences): + """Unbind a virtual event VIRTUAL from SEQUENCE.""" + args = ('event', 'delete', virtual) + sequences + self.tk.call(args) + + def event_generate(self, sequence, **kw): + """Generate an event SEQUENCE. Additional + keyword arguments specify parameter of the event + (e.g. x, y, rootx, rooty).""" + args = ('event', 'generate', self._w, sequence) + for k, v in kw.items(): + args = args + ('-%s' % k, str(v)) + self.tk.call(args) + + def event_info(self, virtual=None): + """Return a list of all virtual events or the information + about the SEQUENCE bound to the virtual event VIRTUAL.""" + return self.tk.splitlist( + self.tk.call('event', 'info', virtual)) + + # Image related commands + + def image_names(self): + """Return a list of all existing image names.""" + return self.tk.call('image', 'names') + + def image_types(self): + """Return a list of all available image types (e.g. phote bitmap).""" + return self.tk.call('image', 'types') + + +class CallWrapper: + """Internal class. Stores function to call when some user + defined Tcl function is called e.g. after an event occurred.""" + def __init__(self, func, subst, widget): + """Store FUNC, SUBST and WIDGET as members.""" + self.func = func + self.subst = subst + self.widget = widget + def __call__(self, *args): + """Apply first function SUBST to arguments, than FUNC.""" + try: + if self.subst: + args = apply(self.subst, args) + return apply(self.func, args) + except SystemExit, msg: + raise SystemExit, msg + except: + self.widget._report_exception() + + +class Wm: + """Provides functions for the communication with the window manager.""" + def wm_aspect(self, + minNumer=None, minDenom=None, + maxNumer=None, maxDenom=None): + """Instruct the window manager to set the aspect ratio (width/height) + of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple + of the actual values if no argument is given.""" + return self._getints( + self.tk.call('wm', 'aspect', self._w, + minNumer, minDenom, + maxNumer, maxDenom)) + aspect = wm_aspect + def wm_client(self, name=None): + """Store NAME in WM_CLIENT_MACHINE property of this widget. Return + current value.""" + return self.tk.call('wm', 'client', self._w, name) + client = wm_client + def wm_colormapwindows(self, *wlist): + """Store list of window names (WLIST) into WM_COLORMAPWINDOWS property + of this widget. This list contains windows whose colormaps differ from their + parents. Return current list of widgets if WLIST is empty.""" + if len(wlist) > 1: + wlist = (wlist,) # Tk needs a list of windows here + args = ('wm', 'colormapwindows', self._w) + wlist + return map(self._nametowidget, self.tk.call(args)) + colormapwindows = wm_colormapwindows + def wm_command(self, value=None): + """Store VALUE in WM_COMMAND property. It is the command + which shall be used to invoke the application. Return current + command if VALUE is None.""" + return self.tk.call('wm', 'command', self._w, value) + command = wm_command + def wm_deiconify(self): + """Deiconify this widget. If it was never mapped it will not be mapped. + On Windows it will raise this widget and give it the focus.""" + return self.tk.call('wm', 'deiconify', self._w) + deiconify = wm_deiconify + def wm_focusmodel(self, model=None): + """Set focus model to MODEL. "active" means that this widget will claim + the focus itself, "passive" means that the window manager shall give + the focus. Return current focus model if MODEL is None.""" + return self.tk.call('wm', 'focusmodel', self._w, model) + focusmodel = wm_focusmodel + def wm_frame(self): + """Return identifier for decorative frame of this widget if present.""" + return self.tk.call('wm', 'frame', self._w) + frame = wm_frame + def wm_geometry(self, newGeometry=None): + """Set geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return + current value if None is given.""" + return self.tk.call('wm', 'geometry', self._w, newGeometry) + geometry = wm_geometry + def wm_grid(self, + baseWidth=None, baseHeight=None, + widthInc=None, heightInc=None): + """Instruct the window manager that this widget shall only be + resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and + height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the + number of grid units requested in Tk_GeometryRequest.""" + return self._getints(self.tk.call( + 'wm', 'grid', self._w, + baseWidth, baseHeight, widthInc, heightInc)) + grid = wm_grid + def wm_group(self, pathName=None): + """Set the group leader widgets for related widgets to PATHNAME. Return + the group leader of this widget if None is given.""" + return self.tk.call('wm', 'group', self._w, pathName) + group = wm_group + def wm_iconbitmap(self, bitmap=None): + """Set bitmap for the iconified widget to BITMAP. Return + the bitmap if None is given.""" + return self.tk.call('wm', 'iconbitmap', self._w, bitmap) + iconbitmap = wm_iconbitmap + def wm_iconify(self): + """Display widget as icon.""" + return self.tk.call('wm', 'iconify', self._w) + iconify = wm_iconify + def wm_iconmask(self, bitmap=None): + """Set mask for the icon bitmap of this widget. Return the + mask if None is given.""" + return self.tk.call('wm', 'iconmask', self._w, bitmap) + iconmask = wm_iconmask + def wm_iconname(self, newName=None): + """Set the name of the icon for this widget. Return the name if + None is given.""" + return self.tk.call('wm', 'iconname', self._w, newName) + iconname = wm_iconname + def wm_iconposition(self, x=None, y=None): + """Set the position of the icon of this widget to X and Y. Return + a tuple of the current values of X and X if None is given.""" + return self._getints(self.tk.call( + 'wm', 'iconposition', self._w, x, y)) + iconposition = wm_iconposition + def wm_iconwindow(self, pathName=None): + """Set widget PATHNAME to be displayed instead of icon. Return the current + value if None is given.""" + return self.tk.call('wm', 'iconwindow', self._w, pathName) + iconwindow = wm_iconwindow + def wm_maxsize(self, width=None, height=None): + """Set max WIDTH and HEIGHT for this widget. If the window is gridded + the values are given in grid units. Return the current values if None + is given.""" + return self._getints(self.tk.call( + 'wm', 'maxsize', self._w, width, height)) + maxsize = wm_maxsize + def wm_minsize(self, width=None, height=None): + """Set min WIDTH and HEIGHT for this widget. If the window is gridded + the values are given in grid units. Return the current values if None + is given.""" + return self._getints(self.tk.call( + 'wm', 'minsize', self._w, width, height)) + minsize = wm_minsize + def wm_overrideredirect(self, boolean=None): + """Instruct the window manager to ignore this widget + if BOOLEAN is given with 1. Return the current value if None + is given.""" + return self._getboolean(self.tk.call( + 'wm', 'overrideredirect', self._w, boolean)) + overrideredirect = wm_overrideredirect + def wm_positionfrom(self, who=None): + """Instruct the window manager that the position of this widget shall + be defined by the user if WHO is "user", and by its own policy if WHO is + "program".""" + return self.tk.call('wm', 'positionfrom', self._w, who) + positionfrom = wm_positionfrom + def wm_protocol(self, name=None, func=None): + """Bind function FUNC to command NAME for this widget. + Return the function bound to NAME if None is given. NAME could be + e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".""" + if callable(func): + command = self._register(func) + else: + command = func + return self.tk.call( + 'wm', 'protocol', self._w, name, command) + protocol = wm_protocol + def wm_resizable(self, width=None, height=None): + """Instruct the window manager whether this width can be resized + in WIDTH or HEIGHT. Both values are boolean values.""" + return self.tk.call('wm', 'resizable', self._w, width, height) + resizable = wm_resizable + def wm_sizefrom(self, who=None): + """Instruct the window manager that the size of this widget shall + be defined by the user if WHO is "user", and by its own policy if WHO is + "program".""" + return self.tk.call('wm', 'sizefrom', self._w, who) + sizefrom = wm_sizefrom + def wm_state(self, newstate=None): + """Query or set the state of this widget as one of normal, icon, + iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only).""" + return self.tk.call('wm', 'state', self._w, newstate) + state = wm_state + def wm_title(self, string=None): + """Set the title of this widget.""" + return self.tk.call('wm', 'title', self._w, string) + title = wm_title + def wm_transient(self, master=None): + """Instruct the window manager that this widget is transient + with regard to widget MASTER.""" + return self.tk.call('wm', 'transient', self._w, master) + transient = wm_transient + def wm_withdraw(self): + """Withdraw this widget from the screen such that it is unmapped + and forgotten by the window manager. Re-draw it with wm_deiconify.""" + return self.tk.call('wm', 'withdraw', self._w) + withdraw = wm_withdraw + + +class Tk(Misc, Wm): + """Toplevel widget of Tk which represents mostly the main window + of an appliation. It has an associated Tcl interpreter.""" + _w = '.' + def __init__(self, screenName=None, baseName=None, className='Tk'): + """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will + be created. BASENAME will be used for the identification of the profile file (see + readprofile). + It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME + is the name of the widget class.""" + global _default_root + self.master = None + self.children = {} + if baseName is None: + import sys, os + baseName = os.path.basename(sys.argv[0]) + baseName, ext = os.path.splitext(baseName) + if ext not in ('.py', '.pyc', '.pyo'): + baseName = baseName + ext + self.tk = _tkinter.create(screenName, baseName, className) + if _MacOS and hasattr(_MacOS, 'SchedParams'): + # Disable event scanning except for Command-Period + _MacOS.SchedParams(1, 0) + # Work around nasty MacTk bug + # XXX Is this one still needed? + self.update() + # Version sanity checks + tk_version = self.tk.getvar('tk_version') + if tk_version != _tkinter.TK_VERSION: + raise RuntimeError, \ + "tk.h version (%s) doesn't match libtk.a version (%s)" \ + % (_tkinter.TK_VERSION, tk_version) + tcl_version = self.tk.getvar('tcl_version') + if tcl_version != _tkinter.TCL_VERSION: + raise RuntimeError, \ + "tcl.h version (%s) doesn't match libtcl.a version (%s)" \ + % (_tkinter.TCL_VERSION, tcl_version) + if TkVersion < 4.0: + raise RuntimeError, \ + "Tk 4.0 or higher is required; found Tk %s" \ + % str(TkVersion) + self.tk.createcommand('tkerror', _tkerror) + self.tk.createcommand('exit', _exit) + self.readprofile(baseName, className) + if _support_default_root and not _default_root: + _default_root = self + self.protocol("WM_DELETE_WINDOW", self.destroy) + def destroy(self): + """Destroy this and all descendants widgets. This will + end the application of this Tcl interpreter.""" + for c in self.children.values(): c.destroy() + self.tk.call('destroy', self._w) + Misc.destroy(self) + global _default_root + if _support_default_root and _default_root is self: + _default_root = None + def readprofile(self, baseName, className): + """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into + the Tcl Interpreter and calls execfile on BASENAME.py and CLASSNAME.py if + such a file exists in the home directory.""" + import os + if os.environ.has_key('HOME'): home = os.environ['HOME'] + else: home = os.curdir + class_tcl = os.path.join(home, '.%s.tcl' % className) + class_py = os.path.join(home, '.%s.py' % className) + base_tcl = os.path.join(home, '.%s.tcl' % baseName) + base_py = os.path.join(home, '.%s.py' % baseName) + dir = {'self': self} + exec 'from Tkinter import *' in dir + if os.path.isfile(class_tcl): + self.tk.call('source', class_tcl) + if os.path.isfile(class_py): + execfile(class_py, dir) + if os.path.isfile(base_tcl): + self.tk.call('source', base_tcl) + if os.path.isfile(base_py): + execfile(base_py, dir) + def report_callback_exception(self, exc, val, tb): + """Internal function. It reports exception on sys.stderr.""" + import traceback, sys + sys.stderr.write("Exception in Tkinter callback\n") + sys.last_type = exc + sys.last_value = val + sys.last_traceback = tb + traceback.print_exception(exc, val, tb) + +# Ideally, the classes Pack, Place and Grid disappear, the +# pack/place/grid methods are defined on the Widget class, and +# everybody uses w.pack_whatever(...) instead of Pack.whatever(w, +# ...), with pack(), place() and grid() being short for +# pack_configure(), place_configure() and grid_columnconfigure(), and +# forget() being short for pack_forget(). As a practical matter, I'm +# afraid that there is too much code out there that may be using the +# Pack, Place or Grid class, so I leave them intact -- but only as +# backwards compatibility features. Also note that those methods that +# take a master as argument (e.g. pack_propagate) have been moved to +# the Misc class (which now incorporates all methods common between +# toplevel and interior widgets). Again, for compatibility, these are +# copied into the Pack, Place or Grid class. + +class Pack: + """Geometry manager Pack. + + Base class to use the methods pack_* in every widget.""" + def pack_configure(self, cnf={}, **kw): + """Pack a widget in the parent widget. Use as options: + after=widget - pack it after you have packed widget + anchor=NSEW (or subset) - position widget according to + given direction + before=widget - pack it before you will pack widget + expand=1 or 0 - expand widget if parent size grows + fill=NONE or X or Y or BOTH - fill widget if widget grows + in=master - use master to contain this widget + ipadx=amount - add internal padding in x direction + ipady=amount - add internal padding in y direction + padx=amount - add padding in x direction + pady=amount - add padding in y direction + side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget. + """ + self.tk.call( + ('pack', 'configure', self._w) + + self._options(cnf, kw)) + pack = configure = config = pack_configure + def pack_forget(self): + """Unmap this widget and do not use it for the packing order.""" + self.tk.call('pack', 'forget', self._w) + forget = pack_forget + def pack_info(self): + """Return information about the packing options + for this widget.""" + words = self.tk.splitlist( + self.tk.call('pack', 'info', self._w)) + dict = {} + for i in range(0, len(words), 2): + key = words[i][1:] + value = words[i+1] + if value[:1] == '.': + value = self._nametowidget(value) + dict[key] = value + return dict + info = pack_info + propagate = pack_propagate = Misc.pack_propagate + slaves = pack_slaves = Misc.pack_slaves + +class Place: + """Geometry manager Place. + + Base class to use the methods place_* in every widget.""" + def place_configure(self, cnf={}, **kw): + """Place a widget in the parent widget. Use as options: + in=master - master relative to which the widget is placed. + x=amount - locate anchor of this widget at position x of master + y=amount - locate anchor of this widget at position y of master + relx=amount - locate anchor of this widget between 0.0 and 1.0 + relative to width of master (1.0 is right edge) + rely=amount - locate anchor of this widget between 0.0 and 1.0 + relative to height of master (1.0 is bottom edge) + anchor=NSEW (or subset) - position anchor according to given direction + width=amount - width of this widget in pixel + height=amount - height of this widget in pixel + relwidth=amount - width of this widget between 0.0 and 1.0 + relative to width of master (1.0 is the same width + as the master) + relheight=amount - height of this widget between 0.0 and 1.0 + relative to height of master (1.0 is the same + height as the master) + bordermode="inside" or "outside" - whether to take border width of master widget + into account + """ + for k in ['in_']: + if kw.has_key(k): + kw[k[:-1]] = kw[k] + del kw[k] + self.tk.call( + ('place', 'configure', self._w) + + self._options(cnf, kw)) + place = configure = config = place_configure + def place_forget(self): + """Unmap this widget.""" + self.tk.call('place', 'forget', self._w) + forget = place_forget + def place_info(self): + """Return information about the placing options + for this widget.""" + words = self.tk.splitlist( + self.tk.call('place', 'info', self._w)) + dict = {} + for i in range(0, len(words), 2): + key = words[i][1:] + value = words[i+1] + if value[:1] == '.': + value = self._nametowidget(value) + dict[key] = value + return dict + info = place_info + slaves = place_slaves = Misc.place_slaves + +class Grid: + """Geometry manager Grid. + + Base class to use the methods grid_* in every widget.""" + # Thanks to Masazumi Yoshikawa (yosikawa at isi.edu) + def grid_configure(self, cnf={}, **kw): + """Position a widget in the parent widget in a grid. Use as options: + column=number - use cell identified with given column (starting with 0) + columnspan=number - this widget will span several columns + in=master - use master to contain this widget + ipadx=amount - add internal padding in x direction + ipady=amount - add internal padding in y direction + padx=amount - add padding in x direction + pady=amount - add padding in y direction + row=number - use cell identified with given row (starting with 0) + rowspan=number - this widget will span several rows + sticky=NSEW - if cell is larger on which sides will this + widget stick to the cell boundary + """ + self.tk.call( + ('grid', 'configure', self._w) + + self._options(cnf, kw)) + grid = configure = config = grid_configure + bbox = grid_bbox = Misc.grid_bbox + columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure + def grid_forget(self): + """Unmap this widget.""" + self.tk.call('grid', 'forget', self._w) + forget = grid_forget + def grid_remove(self): + """Unmap this widget but remember the grid options.""" + self.tk.call('grid', 'remove', self._w) + def grid_info(self): + """Return information about the options + for positioning this widget in a grid.""" + words = self.tk.splitlist( + self.tk.call('grid', 'info', self._w)) + dict = {} + for i in range(0, len(words), 2): + key = words[i][1:] + value = words[i+1] + if value[:1] == '.': + value = self._nametowidget(value) + dict[key] = value + return dict + info = grid_info + location = grid_location = Misc.grid_location + propagate = grid_propagate = Misc.grid_propagate + rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure + size = grid_size = Misc.grid_size + slaves = grid_slaves = Misc.grid_slaves + +class BaseWidget(Misc): + """Internal class.""" + def _setup(self, master, cnf): + """Internal function. Sets up information about children.""" + if _support_default_root: + global _default_root + if not master: + if not _default_root: + _default_root = Tk() + master = _default_root + self.master = master + self.tk = master.tk + name = None + if cnf.has_key('name'): + name = cnf['name'] + del cnf['name'] + if not name: + name = `id(self)` + self._name = name + if master._w=='.': + self._w = '.' + name + else: + self._w = master._w + '.' + name + self.children = {} + if self.master.children.has_key(self._name): + self.master.children[self._name].destroy() + self.master.children[self._name] = self + def __init__(self, master, widgetName, cnf={}, kw={}, extra=()): + """Construct a widget with the parent widget MASTER, a name WIDGETNAME + and appropriate options.""" + if kw: + cnf = _cnfmerge((cnf, kw)) + self.widgetName = widgetName + BaseWidget._setup(self, master, cnf) + classes = [] + for k in cnf.keys(): + if type(k) is ClassType: + classes.append((k, cnf[k])) + del cnf[k] + self.tk.call( + (widgetName, self._w) + extra + self._options(cnf)) + for k, v in classes: + k.configure(self, v) + def destroy(self): + """Destroy this and all descendants widgets.""" + for c in self.children.values(): c.destroy() + if self.master.children.has_key(self._name): + del self.master.children[self._name] + self.tk.call('destroy', self._w) + Misc.destroy(self) + def _do(self, name, args=()): + # XXX Obsolete -- better use self.tk.call directly! + return self.tk.call((self._w, name) + args) + +class Widget(BaseWidget, Pack, Place, Grid): + """Internal class. + + Base class for a widget which can be positioned with the geometry managers + Pack, Place or Grid.""" + pass + +class Toplevel(BaseWidget, Wm): + """Toplevel widget, e.g. for dialogs.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a toplevel widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, class, + colormap, container, cursor, height, highlightbackground, + highlightcolor, highlightthickness, menu, relief, screen, takefocus, + use, visual, width.""" + if kw: + cnf = _cnfmerge((cnf, kw)) + extra = () + for wmkey in ['screen', 'class_', 'class', 'visual', + 'colormap']: + if cnf.has_key(wmkey): + val = cnf[wmkey] + # TBD: a hack needed because some keys + # are not valid as keyword arguments + if wmkey[-1] == '_': opt = '-'+wmkey[:-1] + else: opt = '-'+wmkey + extra = extra + (opt, val) + del cnf[wmkey] + BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra) + root = self._root() + self.iconname(root.iconname()) + self.title(root.title()) + self.protocol("WM_DELETE_WINDOW", self.destroy) + +class Button(Widget): + """Button widget.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a button widget with the parent MASTER. + + Valid resource names: activebackground, activeforeground, anchor, + background, bd, bg, bitmap, borderwidth, command, cursor, default, + disabledforeground, fg, font, foreground, height, + highlightbackground, highlightcolor, highlightthickness, image, + justify, padx, pady, relief, state, takefocus, text, textvariable, + underline, width, wraplength.""" + Widget.__init__(self, master, 'button', cnf, kw) + def tkButtonEnter(self, *dummy): + self.tk.call('tkButtonEnter', self._w) + def tkButtonLeave(self, *dummy): + self.tk.call('tkButtonLeave', self._w) + def tkButtonDown(self, *dummy): + self.tk.call('tkButtonDown', self._w) + def tkButtonUp(self, *dummy): + self.tk.call('tkButtonUp', self._w) + def tkButtonInvoke(self, *dummy): + self.tk.call('tkButtonInvoke', self._w) + def flash(self): + self.tk.call(self._w, 'flash') + def invoke(self): + return self.tk.call(self._w, 'invoke') + +# Indices: +# XXX I don't like these -- take them away +def AtEnd(): + return 'end' +def AtInsert(*args): + s = 'insert' + for a in args: + if a: s = s + (' ' + a) + return s +def AtSelFirst(): + return 'sel.first' +def AtSelLast(): + return 'sel.last' +def At(x, y=None): + if y is None: + return '@' + `x` + else: + return '@' + `x` + ',' + `y` + +class Canvas(Widget): + """Canvas widget to display graphical elements like lines or text.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a canvas widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, closeenough, + confine, cursor, height, highlightbackground, highlightcolor, + highlightthickness, insertbackground, insertborderwidth, + insertofftime, insertontime, insertwidth, offset, relief, + scrollregion, selectbackground, selectborderwidth, selectforeground, + state, takefocus, width, xscrollcommand, xscrollincrement, + yscrollcommand, yscrollincrement.""" + Widget.__init__(self, master, 'canvas', cnf, kw) + def addtag(self, *args): + """Internal function.""" + self.tk.call((self._w, 'addtag') + args) + def addtag_above(self, newtag, tagOrId): + """Add tag NEWTAG to all items above TAGORID.""" + self.addtag(newtag, 'above', tagOrId) + def addtag_all(self, newtag): + """Add tag NEWTAG to all items.""" + self.addtag(newtag, 'all') + def addtag_below(self, newtag, tagOrId): + """Add tag NEWTAG to all items below TAGORID.""" + self.addtag(newtag, 'below', tagOrId) + def addtag_closest(self, newtag, x, y, halo=None, start=None): + """Add tag NEWTAG to item which is closest to pixel at X, Y. + If several match take the top-most. + All items closer than HALO are considered overlapping (all are + closests). If START is specified the next below this tag is taken.""" + self.addtag(newtag, 'closest', x, y, halo, start) + def addtag_enclosed(self, newtag, x1, y1, x2, y2): + """Add tag NEWTAG to all items in the rectangle defined + by X1,Y1,X2,Y2.""" + self.addtag(newtag, 'enclosed', x1, y1, x2, y2) + def addtag_overlapping(self, newtag, x1, y1, x2, y2): + """Add tag NEWTAG to all items which overlap the rectangle + defined by X1,Y1,X2,Y2.""" + self.addtag(newtag, 'overlapping', x1, y1, x2, y2) + def addtag_withtag(self, newtag, tagOrId): + """Add tag NEWTAG to all items with TAGORID.""" + self.addtag(newtag, 'withtag', tagOrId) + def bbox(self, *args): + """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle + which encloses all items with tags specified as arguments.""" + return self._getints( + self.tk.call((self._w, 'bbox') + args)) or None + def tag_unbind(self, tagOrId, sequence, funcid=None): + """Unbind for all items with TAGORID for event SEQUENCE the + function identified with FUNCID.""" + self.tk.call(self._w, 'bind', tagOrId, sequence, '') + if funcid: + self.deletecommand(funcid) + def tag_bind(self, tagOrId, sequence=None, func=None, add=None): + """Bind to all items with TAGORID at event SEQUENCE a call to function FUNC. + + An additional boolean parameter ADD specifies whether FUNC will be + called additionally to the other bound function or whether it will + replace the previous function. See bind for the return value.""" + return self._bind((self._w, 'bind', tagOrId), + sequence, func, add) + def canvasx(self, screenx, gridspacing=None): + """Return the canvas x coordinate of pixel position SCREENX rounded + to nearest multiple of GRIDSPACING units.""" + return getdouble(self.tk.call( + self._w, 'canvasx', screenx, gridspacing)) + def canvasy(self, screeny, gridspacing=None): + """Return the canvas y coordinate of pixel position SCREENY rounded + to nearest multiple of GRIDSPACING units.""" + return getdouble(self.tk.call( + self._w, 'canvasy', screeny, gridspacing)) + def coords(self, *args): + """Return a list of coordinates for the item given in ARGS.""" + # XXX Should use _flatten on args + return map(getdouble, + self.tk.splitlist( + self.tk.call((self._w, 'coords') + args))) + def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={}) + """Internal function.""" + args = _flatten(args) + cnf = args[-1] + if type(cnf) in (DictionaryType, TupleType): + args = args[:-1] + else: + cnf = {} + return getint(apply( + self.tk.call, + (self._w, 'create', itemType) + + args + self._options(cnf, kw))) + def create_arc(self, *args, **kw): + """Create arc shaped region with coordinates x1,y1,x2,y2.""" + return self._create('arc', args, kw) + def create_bitmap(self, *args, **kw): + """Create bitmap with coordinates x1,y1.""" + return self._create('bitmap', args, kw) + def create_image(self, *args, **kw): + """Create image item with coordinates x1,y1.""" + return self._create('image', args, kw) + def create_line(self, *args, **kw): + """Create line with coordinates x1,y1,...,xn,yn.""" + return self._create('line', args, kw) + def create_oval(self, *args, **kw): + """Create oval with coordinates x1,y1,x2,y2.""" + return self._create('oval', args, kw) + def create_polygon(self, *args, **kw): + """Create polygon with coordinates x1,y1,...,xn,yn.""" + return self._create('polygon', args, kw) + def create_rectangle(self, *args, **kw): + """Create rectangle with coordinates x1,y1,x2,y2.""" + return self._create('rectangle', args, kw) + def create_text(self, *args, **kw): + """Create text with coordinates x1,y1.""" + return self._create('text', args, kw) + def create_window(self, *args, **kw): + """Create window with coordinates x1,y1,x2,y2.""" + return self._create('window', args, kw) + def dchars(self, *args): + """Delete characters of text items identified by tag or id in ARGS (possibly + several times) from FIRST to LAST character (including).""" + self.tk.call((self._w, 'dchars') + args) + def delete(self, *args): + """Delete items identified by all tag or ids contained in ARGS.""" + self.tk.call((self._w, 'delete') + args) + def dtag(self, *args): + """Delete tag or id given as last arguments in ARGS from items + identified by first argument in ARGS.""" + self.tk.call((self._w, 'dtag') + args) + def find(self, *args): + """Internal function.""" + return self._getints( + self.tk.call((self._w, 'find') + args)) or () + def find_above(self, tagOrId): + """Return items above TAGORID.""" + return self.find('above', tagOrId) + def find_all(self): + """Return all items.""" + return self.find('all') + def find_below(self, tagOrId): + """Return all items below TAGORID.""" + return self.find('below', tagOrId) + def find_closest(self, x, y, halo=None, start=None): + """Return item which is closest to pixel at X, Y. + If several match take the top-most. + All items closer than HALO are considered overlapping (all are + closests). If START is specified the next below this tag is taken.""" + return self.find('closest', x, y, halo, start) + def find_enclosed(self, x1, y1, x2, y2): + """Return all items in rectangle defined + by X1,Y1,X2,Y2.""" + return self.find('enclosed', x1, y1, x2, y2) + def find_overlapping(self, x1, y1, x2, y2): + """Return all items which overlap the rectangle + defined by X1,Y1,X2,Y2.""" + return self.find('overlapping', x1, y1, x2, y2) + def find_withtag(self, tagOrId): + """Return all items with TAGORID.""" + return self.find('withtag', tagOrId) + def focus(self, *args): + """Set focus to the first item specified in ARGS.""" + return self.tk.call((self._w, 'focus') + args) + def gettags(self, *args): + """Return tags associated with the first item specified in ARGS.""" + return self.tk.splitlist( + self.tk.call((self._w, 'gettags') + args)) + def icursor(self, *args): + """Set cursor at position POS in the item identified by TAGORID. + In ARGS TAGORID must be first.""" + self.tk.call((self._w, 'icursor') + args) + def index(self, *args): + """Return position of cursor as integer in item specified in ARGS.""" + return getint(self.tk.call((self._w, 'index') + args)) + def insert(self, *args): + """Insert TEXT in item TAGORID at position POS. ARGS must + be TAGORID POS TEXT.""" + self.tk.call((self._w, 'insert') + args) + def itemcget(self, tagOrId, option): + """Return the resource value for an OPTION for item TAGORID.""" + return self.tk.call( + (self._w, 'itemcget') + (tagOrId, '-'+option)) + def itemconfigure(self, tagOrId, cnf=None, **kw): + """Configure resources of an item TAGORID. + + The values for resources are specified as keyword + arguments. To get an overview about + the allowed keyword arguments call the method without arguments. + """ + if cnf is None and not kw: + cnf = {} + for x in self.tk.split( + self.tk.call(self._w, + 'itemconfigure', tagOrId)): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + if type(cnf) == StringType and not kw: + x = self.tk.split(self.tk.call( + self._w, 'itemconfigure', tagOrId, '-'+cnf)) + return (x[0][1:],) + x[1:] + self.tk.call((self._w, 'itemconfigure', tagOrId) + + self._options(cnf, kw)) + itemconfig = itemconfigure + # lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift, + # so the preferred name for them is tag_lower, tag_raise + # (similar to tag_bind, and similar to the Text widget); + # unfortunately can't delete the old ones yet (maybe in 1.6) + def tag_lower(self, *args): + """Lower an item TAGORID given in ARGS + (optional below another item).""" + self.tk.call((self._w, 'lower') + args) + lower = tag_lower + def move(self, *args): + """Move an item TAGORID given in ARGS.""" + self.tk.call((self._w, 'move') + args) + def postscript(self, cnf={}, **kw): + """Print the contents of the canvas to a postscript + file. Valid options: colormap, colormode, file, fontmap, + height, pageanchor, pageheight, pagewidth, pagex, pagey, + rotate, witdh, x, y.""" + return self.tk.call((self._w, 'postscript') + + self._options(cnf, kw)) + def tag_raise(self, *args): + """Raise an item TAGORID given in ARGS + (optional above another item).""" + self.tk.call((self._w, 'raise') + args) + lift = tkraise = tag_raise + def scale(self, *args): + """Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE.""" + self.tk.call((self._w, 'scale') + args) + def scan_mark(self, x, y): + """Remember the current X, Y coordinates.""" + self.tk.call(self._w, 'scan', 'mark', x, y) + def scan_dragto(self, x, y): + """Adjust the view of the canvas to 10 times the + difference between X and Y and the coordinates given in + scan_mark.""" + self.tk.call(self._w, 'scan', 'dragto', x, y) + def select_adjust(self, tagOrId, index): + """Adjust the end of the selection near the cursor of an item TAGORID to index.""" + self.tk.call(self._w, 'select', 'adjust', tagOrId, index) + def select_clear(self): + """Clear the selection if it is in this widget.""" + self.tk.call(self._w, 'select', 'clear') + def select_from(self, tagOrId, index): + """Set the fixed end of a selection in item TAGORID to INDEX.""" + self.tk.call(self._w, 'select', 'from', tagOrId, index) + def select_item(self): + """Return the item which has the selection.""" + return self.tk.call(self._w, 'select', 'item') or None + def select_to(self, tagOrId, index): + """Set the variable end of a selection in item TAGORID to INDEX.""" + self.tk.call(self._w, 'select', 'to', tagOrId, index) + def type(self, tagOrId): + """Return the type of the item TAGORID.""" + return self.tk.call(self._w, 'type', tagOrId) or None + def xview(self, *args): + """Query and change horizontal position of the view.""" + if not args: + return self._getdoubles(self.tk.call(self._w, 'xview')) + self.tk.call((self._w, 'xview') + args) + def xview_moveto(self, fraction): + """Adjusts the view in the window so that FRACTION of the + total width of the canvas is off-screen to the left.""" + self.tk.call(self._w, 'xview', 'moveto', fraction) + def xview_scroll(self, number, what): + """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'xview', 'scroll', number, what) + def yview(self, *args): + """Query and change vertical position of the view.""" + if not args: + return self._getdoubles(self.tk.call(self._w, 'yview')) + self.tk.call((self._w, 'yview') + args) + def yview_moveto(self, fraction): + """Adjusts the view in the window so that FRACTION of the + total height of the canvas is off-screen to the top.""" + self.tk.call(self._w, 'yview', 'moveto', fraction) + def yview_scroll(self, number, what): + """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'yview', 'scroll', number, what) + +class Checkbutton(Widget): + """Checkbutton widget which is either in on- or off-state.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a checkbutton widget with the parent MASTER. + + Valid resource names: activebackground, activeforeground, anchor, + background, bd, bg, bitmap, borderwidth, command, cursor, + disabledforeground, fg, font, foreground, height, + highlightbackground, highlightcolor, highlightthickness, image, + indicatoron, justify, offvalue, onvalue, padx, pady, relief, + selectcolor, selectimage, state, takefocus, text, textvariable, + underline, variable, width, wraplength.""" + Widget.__init__(self, master, 'checkbutton', cnf, kw) + def deselect(self): + """Put the button in off-state.""" + self.tk.call(self._w, 'deselect') + def flash(self): + """Flash the button.""" + self.tk.call(self._w, 'flash') + def invoke(self): + """Toggle the button and invoke a command if given as resource.""" + return self.tk.call(self._w, 'invoke') + def select(self): + """Put the button in on-state.""" + self.tk.call(self._w, 'select') + def toggle(self): + """Toggle the button.""" + self.tk.call(self._w, 'toggle') + +class Entry(Widget): + """Entry widget which allows to display simple text.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct an entry widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, cursor, + exportselection, fg, font, foreground, highlightbackground, + highlightcolor, highlightthickness, insertbackground, + insertborderwidth, insertofftime, insertontime, insertwidth, + invalidcommand, invcmd, justify, relief, selectbackground, + selectborderwidth, selectforeground, show, state, takefocus, + textvariable, validate, validatecommand, vcmd, width, + xscrollcommand.""" + Widget.__init__(self, master, 'entry', cnf, kw) + def delete(self, first, last=None): + """Delete text from FIRST to LAST (not included).""" + self.tk.call(self._w, 'delete', first, last) + def get(self): + """Return the text.""" + return self.tk.call(self._w, 'get') + def icursor(self, index): + """Insert cursor at INDEX.""" + self.tk.call(self._w, 'icursor', index) + def index(self, index): + """Return position of cursor.""" + return getint(self.tk.call( + self._w, 'index', index)) + def insert(self, index, string): + """Insert STRING at INDEX.""" + self.tk.call(self._w, 'insert', index, string) + def scan_mark(self, x): + """Remember the current X, Y coordinates.""" + self.tk.call(self._w, 'scan', 'mark', x) + def scan_dragto(self, x): + """Adjust the view of the canvas to 10 times the + difference between X and Y and the coordinates given in + scan_mark.""" + self.tk.call(self._w, 'scan', 'dragto', x) + def selection_adjust(self, index): + """Adjust the end of the selection near the cursor to INDEX.""" + self.tk.call(self._w, 'selection', 'adjust', index) + select_adjust = selection_adjust + def selection_clear(self): + """Clear the selection if it is in this widget.""" + self.tk.call(self._w, 'selection', 'clear') + select_clear = selection_clear + def selection_from(self, index): + """Set the fixed end of a selection to INDEX.""" + self.tk.call(self._w, 'selection', 'from', index) + select_from = selection_from + def selection_present(self): + """Return whether the widget has the selection.""" + return self.tk.getboolean( + self.tk.call(self._w, 'selection', 'present')) + select_present = selection_present + def selection_range(self, start, end): + """Set the selection from START to END (not included).""" + self.tk.call(self._w, 'selection', 'range', start, end) + select_range = selection_range + def selection_to(self, index): + """Set the variable end of a selection to INDEX.""" + self.tk.call(self._w, 'selection', 'to', index) + select_to = selection_to + def xview(self, index): + """Query and change horizontal position of the view.""" + self.tk.call(self._w, 'xview', index) + def xview_moveto(self, fraction): + """Adjust the view in the window so that FRACTION of the + total width of the entry is off-screen to the left.""" + self.tk.call(self._w, 'xview', 'moveto', fraction) + def xview_scroll(self, number, what): + """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'xview', 'scroll', number, what) + +class Frame(Widget): + """Frame widget which may contain other widgets and can have a 3D border.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a frame widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, class, + colormap, container, cursor, height, highlightbackground, + highlightcolor, highlightthickness, relief, takefocus, visual, width.""" + cnf = _cnfmerge((cnf, kw)) + extra = () + if cnf.has_key('class_'): + extra = ('-class', cnf['class_']) + del cnf['class_'] + elif cnf.has_key('class'): + extra = ('-class', cnf['class']) + del cnf['class'] + Widget.__init__(self, master, 'frame', cnf, {}, extra) + +class Label(Widget): + """Label widget which can display text and bitmaps.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a label widget with the parent MASTER. + + Valid resource names: anchor, background, bd, bg, bitmap, + borderwidth, cursor, fg, font, foreground, height, + highlightbackground, highlightcolor, highlightthickness, image, + justify, padx, pady, relief, takefocus, text, textvariable, + underline, width, wraplength.""" + Widget.__init__(self, master, 'label', cnf, kw) + +class Listbox(Widget): + """Listbox widget which can display a list of strings.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a listbox widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, cursor, + exportselection, fg, font, foreground, height, highlightbackground, + highlightcolor, highlightthickness, relief, selectbackground, + selectborderwidth, selectforeground, selectmode, setgrid, takefocus, + width, xscrollcommand, yscrollcommand, listvariable.""" + Widget.__init__(self, master, 'listbox', cnf, kw) + def activate(self, index): + """Activate item identified by INDEX.""" + self.tk.call(self._w, 'activate', index) + def bbox(self, *args): + """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle + which encloses the item identified by index in ARGS.""" + return self._getints( + self.tk.call((self._w, 'bbox') + args)) or None + def curselection(self): + """Return list of indices of currently selected item.""" + # XXX Ought to apply self._getints()... + return self.tk.splitlist(self.tk.call( + self._w, 'curselection')) + def delete(self, first, last=None): + """Delete items from FIRST to LAST (not included).""" + self.tk.call(self._w, 'delete', first, last) + def get(self, first, last=None): + """Get list of items from FIRST to LAST (not included).""" + if last: + return self.tk.splitlist(self.tk.call( + self._w, 'get', first, last)) + else: + return self.tk.call(self._w, 'get', first) + def index(self, index): + """Return index of item identified with INDEX.""" + i = self.tk.call(self._w, 'index', index) + if i == 'none': return None + return getint(i) + def insert(self, index, *elements): + """Insert ELEMENTS at INDEX.""" + self.tk.call((self._w, 'insert', index) + elements) + def nearest(self, y): + """Get index of item which is nearest to y coordinate Y.""" + return getint(self.tk.call( + self._w, 'nearest', y)) + def scan_mark(self, x, y): + """Remember the current X, Y coordinates.""" + self.tk.call(self._w, 'scan', 'mark', x, y) + def scan_dragto(self, x, y): + """Adjust the view of the listbox to 10 times the + difference between X and Y and the coordinates given in + scan_mark.""" + self.tk.call(self._w, 'scan', 'dragto', x, y) + def see(self, index): + """Scroll such that INDEX is visible.""" + self.tk.call(self._w, 'see', index) + def selection_anchor(self, index): + """Set the fixed end oft the selection to INDEX.""" + self.tk.call(self._w, 'selection', 'anchor', index) + select_anchor = selection_anchor + def selection_clear(self, first, last=None): + """Clear the selection from FIRST to LAST (not included).""" + self.tk.call(self._w, + 'selection', 'clear', first, last) + select_clear = selection_clear + def selection_includes(self, index): + """Return 1 if INDEX is part of the selection.""" + return self.tk.getboolean(self.tk.call( + self._w, 'selection', 'includes', index)) + select_includes = selection_includes + def selection_set(self, first, last=None): + """Set the selection from FIRST to LAST (not included) without + changing the currently selected elements.""" + self.tk.call(self._w, 'selection', 'set', first, last) + select_set = selection_set + def size(self): + """Return the number of elements in the listbox.""" + return getint(self.tk.call(self._w, 'size')) + def xview(self, *what): + """Query and change horizontal position of the view.""" + if not what: + return self._getdoubles(self.tk.call(self._w, 'xview')) + self.tk.call((self._w, 'xview') + what) + def xview_moveto(self, fraction): + """Adjust the view in the window so that FRACTION of the + total width of the entry is off-screen to the left.""" + self.tk.call(self._w, 'xview', 'moveto', fraction) + def xview_scroll(self, number, what): + """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'xview', 'scroll', number, what) + def yview(self, *what): + """Query and change vertical position of the view.""" + if not what: + return self._getdoubles(self.tk.call(self._w, 'yview')) + self.tk.call((self._w, 'yview') + what) + def yview_moveto(self, fraction): + """Adjust the view in the window so that FRACTION of the + total width of the entry is off-screen to the top.""" + self.tk.call(self._w, 'yview', 'moveto', fraction) + def yview_scroll(self, number, what): + """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'yview', 'scroll', number, what) + def itemcget(self, index, option): + """Return the resource value for an ITEM and an OPTION.""" + return self.tk.call( + (self._w, 'itemcget') + (index, '-'+option)) + def itemconfigure(self, index, cnf=None, **kw): + """Configure resources of an ITEM. + + The values for resources are specified as keyword arguments. + To get an overview about the allowed keyword arguments + call the method without arguments. + Valid resource names: background, bg, foreground, fg, + selectbackground, selectforeground.""" + if cnf is None and not kw: + cnf = {} + for x in self.tk.split( + self.tk.call(self._w, 'itemconfigure', index)): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + if type(cnf) == StringType and not kw: + x = self.tk.split(self.tk.call( + self._w, 'itemconfigure', index, '-'+cnf)) + return (x[0][1:],) + x[1:] + self.tk.call((self._w, 'itemconfigure', index) + + self._options(cnf, kw)) + itemconfig = itemconfigure + +class Menu(Widget): + """Menu widget which allows to display menu bars, pull-down menus and pop-up menus.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct menu widget with the parent MASTER. + + Valid resource names: activebackground, activeborderwidth, + activeforeground, background, bd, bg, borderwidth, cursor, + disabledforeground, fg, font, foreground, postcommand, relief, + selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" + Widget.__init__(self, master, 'menu', cnf, kw) + def tk_bindForTraversal(self): + pass # obsolete since Tk 4.0 + def tk_mbPost(self): + self.tk.call('tk_mbPost', self._w) + def tk_mbUnpost(self): + self.tk.call('tk_mbUnpost') + def tk_traverseToMenu(self, char): + self.tk.call('tk_traverseToMenu', self._w, char) + def tk_traverseWithinMenu(self, char): + self.tk.call('tk_traverseWithinMenu', self._w, char) + def tk_getMenuButtons(self): + return self.tk.call('tk_getMenuButtons', self._w) + def tk_nextMenu(self, count): + self.tk.call('tk_nextMenu', count) + def tk_nextMenuEntry(self, count): + self.tk.call('tk_nextMenuEntry', count) + def tk_invokeMenu(self): + self.tk.call('tk_invokeMenu', self._w) + def tk_firstMenu(self): + self.tk.call('tk_firstMenu', self._w) + def tk_mbButtonDown(self): + self.tk.call('tk_mbButtonDown', self._w) + def tk_popup(self, x, y, entry=""): + """Post the menu at position X,Y with entry ENTRY.""" + self.tk.call('tk_popup', self._w, x, y, entry) + def activate(self, index): + """Activate entry at INDEX.""" + self.tk.call(self._w, 'activate', index) + def add(self, itemType, cnf={}, **kw): + """Internal function.""" + self.tk.call((self._w, 'add', itemType) + + self._options(cnf, kw)) + def add_cascade(self, cnf={}, **kw): + """Add hierarchical menu item.""" + self.add('cascade', cnf or kw) + def add_checkbutton(self, cnf={}, **kw): + """Add checkbutton menu item.""" + self.add('checkbutton', cnf or kw) + def add_command(self, cnf={}, **kw): + """Add command menu item.""" + self.add('command', cnf or kw) + def add_radiobutton(self, cnf={}, **kw): + """Addd radio menu item.""" + self.add('radiobutton', cnf or kw) + def add_separator(self, cnf={}, **kw): + """Add separator.""" + self.add('separator', cnf or kw) + def insert(self, index, itemType, cnf={}, **kw): + """Internal function.""" + self.tk.call((self._w, 'insert', index, itemType) + + self._options(cnf, kw)) + def insert_cascade(self, index, cnf={}, **kw): + """Add hierarchical menu item at INDEX.""" + self.insert(index, 'cascade', cnf or kw) + def insert_checkbutton(self, index, cnf={}, **kw): + """Add checkbutton menu item at INDEX.""" + self.insert(index, 'checkbutton', cnf or kw) + def insert_command(self, index, cnf={}, **kw): + """Add command menu item at INDEX.""" + self.insert(index, 'command', cnf or kw) + def insert_radiobutton(self, index, cnf={}, **kw): + """Addd radio menu item at INDEX.""" + self.insert(index, 'radiobutton', cnf or kw) + def insert_separator(self, index, cnf={}, **kw): + """Add separator at INDEX.""" + self.insert(index, 'separator', cnf or kw) + def delete(self, index1, index2=None): + """Delete menu items between INDEX1 and INDEX2 (not included).""" + self.tk.call(self._w, 'delete', index1, index2) + def entrycget(self, index, option): + """Return the resource value of an menu item for OPTION at INDEX.""" + return self.tk.call(self._w, 'entrycget', index, '-' + option) + def entryconfigure(self, index, cnf=None, **kw): + """Configure a menu item at INDEX.""" + if cnf is None and not kw: + cnf = {} + for x in self.tk.split(self.tk.call( + (self._w, 'entryconfigure', index))): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + if type(cnf) == StringType and not kw: + x = self.tk.split(self.tk.call( + (self._w, 'entryconfigure', index, '-'+cnf))) + return (x[0][1:],) + x[1:] + self.tk.call((self._w, 'entryconfigure', index) + + self._options(cnf, kw)) + entryconfig = entryconfigure + def index(self, index): + """Return the index of a menu item identified by INDEX.""" + i = self.tk.call(self._w, 'index', index) + if i == 'none': return None + return getint(i) + def invoke(self, index): + """Invoke a menu item identified by INDEX and execute + the associated command.""" + return self.tk.call(self._w, 'invoke', index) + def post(self, x, y): + """Display a menu at position X,Y.""" + self.tk.call(self._w, 'post', x, y) + def type(self, index): + """Return the type of the menu item at INDEX.""" + return self.tk.call(self._w, 'type', index) + def unpost(self): + """Unmap a menu.""" + self.tk.call(self._w, 'unpost') + def yposition(self, index): + """Return the y-position of the topmost pixel of the menu item at INDEX.""" + return getint(self.tk.call( + self._w, 'yposition', index)) + +class Menubutton(Widget): + """Menubutton widget, obsolete since Tk8.0.""" + def __init__(self, master=None, cnf={}, **kw): + Widget.__init__(self, master, 'menubutton', cnf, kw) + +class Message(Widget): + """Message widget to display multiline text. Obsolete since Label does it too.""" + def __init__(self, master=None, cnf={}, **kw): + Widget.__init__(self, master, 'message', cnf, kw) + +class Radiobutton(Widget): + """Radiobutton widget which shows only one of several buttons in on-state.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a radiobutton widget with the parent MASTER. + + Valid resource names: activebackground, activeforeground, anchor, + background, bd, bg, bitmap, borderwidth, command, cursor, + disabledforeground, fg, font, foreground, height, + highlightbackground, highlightcolor, highlightthickness, image, + indicatoron, justify, padx, pady, relief, selectcolor, selectimage, + state, takefocus, text, textvariable, underline, value, variable, + width, wraplength.""" + Widget.__init__(self, master, 'radiobutton', cnf, kw) + def deselect(self): + """Put the button in off-state.""" + + self.tk.call(self._w, 'deselect') + def flash(self): + """Flash the button.""" + self.tk.call(self._w, 'flash') + def invoke(self): + """Toggle the button and invoke a command if given as resource.""" + return self.tk.call(self._w, 'invoke') + def select(self): + """Put the button in on-state.""" + self.tk.call(self._w, 'select') + +class Scale(Widget): + """Scale widget which can display a numerical scale.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a scale widget with the parent MASTER. + + Valid resource names: activebackground, background, bigincrement, bd, + bg, borderwidth, command, cursor, digits, fg, font, foreground, from, + highlightbackground, highlightcolor, highlightthickness, label, + length, orient, relief, repeatdelay, repeatinterval, resolution, + showvalue, sliderlength, sliderrelief, state, takefocus, + tickinterval, to, troughcolor, variable, width.""" + Widget.__init__(self, master, 'scale', cnf, kw) + def get(self): + """Get the current value as integer or float.""" + value = self.tk.call(self._w, 'get') + try: + return getint(value) + except ValueError: + return getdouble(value) + def set(self, value): + """Set the value to VALUE.""" + self.tk.call(self._w, 'set', value) + def coords(self, value=None): + """Return a tuple (X,Y) of the point along the centerline of the + trough that corresponds to VALUE or the current value if None is + given.""" + + return self._getints(self.tk.call(self._w, 'coords', value)) + def identify(self, x, y): + """Return where the point X,Y lies. Valid return values are "slider", + "though1" and "though2".""" + return self.tk.call(self._w, 'identify', x, y) + +class Scrollbar(Widget): + """Scrollbar widget which displays a slider at a certain position.""" + def __init__(self, master=None, cnf={}, **kw): + """Construct a scrollbar widget with the parent MASTER. + + Valid resource names: activebackground, activerelief, + background, bd, bg, borderwidth, command, cursor, + elementborderwidth, highlightbackground, + highlightcolor, highlightthickness, jump, orient, + relief, repeatdelay, repeatinterval, takefocus, + troughcolor, width.""" + Widget.__init__(self, master, 'scrollbar', cnf, kw) + def activate(self, index): + """Display the element at INDEX with activebackground and activerelief. + INDEX can be "arrow1","slider" or "arrow2".""" + self.tk.call(self._w, 'activate', index) + def delta(self, deltax, deltay): + """Return the fractional change of the scrollbar setting if it + would be moved by DELTAX or DELTAY pixels.""" + return getdouble( + self.tk.call(self._w, 'delta', deltax, deltay)) + def fraction(self, x, y): + """Return the fractional value which corresponds to a slider + position of X,Y.""" + return getdouble(self.tk.call(self._w, 'fraction', x, y)) + def identify(self, x, y): + """Return the element under position X,Y as one of + "arrow1","slider","arrow2" or "".""" + return self.tk.call(self._w, 'identify', x, y) + def get(self): + """Return the current fractional values (upper and lower end) + of the slider position.""" + return self._getdoubles(self.tk.call(self._w, 'get')) + def set(self, *args): + """Set the fractional values of the slider position (upper and + lower ends as value between 0 and 1).""" + self.tk.call((self._w, 'set') + args) + +class Text(Widget): + """Text widget which can display text in various forms.""" + # XXX Add dump() + def __init__(self, master=None, cnf={}, **kw): + """Construct a text widget with the parent MASTER. + + Valid resource names: background, bd, bg, borderwidth, cursor, + exportselection, fg, font, foreground, height, + highlightbackground, highlightcolor, highlightthickness, + insertbackground, insertborderwidth, insertofftime, + insertontime, insertwidth, padx, pady, relief, + selectbackground, selectborderwidth, selectforeground, + setgrid, spacing1, spacing2, spacing3, state, tabs, takefocus, + width, wrap, xscrollcommand, yscrollcommand.""" + Widget.__init__(self, master, 'text', cnf, kw) + def bbox(self, *args): + """Return a tuple of (x,y,width,height) which gives the bounding + box of the visible part of the character at the index in ARGS.""" + return self._getints( + self.tk.call((self._w, 'bbox') + args)) or None + def tk_textSelectTo(self, index): + self.tk.call('tk_textSelectTo', self._w, index) + def tk_textBackspace(self): + self.tk.call('tk_textBackspace', self._w) + def tk_textIndexCloser(self, a, b, c): + self.tk.call('tk_textIndexCloser', self._w, a, b, c) + def tk_textResetAnchor(self, index): + self.tk.call('tk_textResetAnchor', self._w, index) + def compare(self, index1, op, index2): + """Return whether between index INDEX1 and index INDEX2 the + relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=.""" + return self.tk.getboolean(self.tk.call( + self._w, 'compare', index1, op, index2)) + def debug(self, boolean=None): + """Turn on the internal consistency checks of the B-Tree inside the text + widget according to BOOLEAN.""" + return self.tk.getboolean(self.tk.call( + self._w, 'debug', boolean)) + def delete(self, index1, index2=None): + """Delete the characters between INDEX1 and INDEX2 (not included).""" + self.tk.call(self._w, 'delete', index1, index2) + def dlineinfo(self, index): + """Return tuple (x,y,width,height,baseline) giving the bounding box + and baseline position of the visible part of the line containing + the character at INDEX.""" + return self._getints(self.tk.call(self._w, 'dlineinfo', index)) + def get(self, index1, index2=None): + """Return the text from INDEX1 to INDEX2 (not included).""" + return self.tk.call(self._w, 'get', index1, index2) + # (Image commands are new in 8.0) + def image_cget(self, index, option): + """Return the value of OPTION of an embedded image at INDEX.""" + if option[:1] != "-": + option = "-" + option + if option[-1:] == "_": + option = option[:-1] + return self.tk.call(self._w, "image", "cget", index, option) + def image_configure(self, index, cnf={}, **kw): + """Configure an embedded image at INDEX.""" + if not cnf and not kw: + cnf = {} + for x in self.tk.split( + self.tk.call( + self._w, "image", "configure", index)): + cnf[x[0][1:]] = (x[0][1:],) + x[1:] + return cnf + apply(self.tk.call, + (self._w, "image", "configure", index) + + self._options(cnf, kw)) + def image_create(self, index, cnf={}, **kw): + """Create an embedded image at INDEX.""" + return apply(self.tk.call, + (self._w, "image", "create", index) + + self._options(cnf, kw)) + def image_names(self): + """Return all names of embedded images in this widget.""" + return self.tk.call(self._w, "image", "names") + def index(self, index): + """Return the index in the form line.char for INDEX.""" + return self.tk.call(self._w, 'index', index) + def insert(self, index, chars, *args): + """Insert CHARS before the characters at INDEX. An additional + tag can be given in ARGS. Additional CHARS and tags can follow in ARGS.""" + self.tk.call((self._w, 'insert', index, chars) + args) + def mark_gravity(self, markName, direction=None): + """Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT). + Return the current value if None is given for DIRECTION.""" + return self.tk.call( + (self._w, 'mark', 'gravity', markName, direction)) + def mark_names(self): + """Return all mark names.""" + return self.tk.splitlist(self.tk.call( + self._w, 'mark', 'names')) + def mark_set(self, markName, index): + """Set mark MARKNAME before the character at INDEX.""" + self.tk.call(self._w, 'mark', 'set', markName, index) + def mark_unset(self, *markNames): + """Delete all marks in MARKNAMES.""" + self.tk.call((self._w, 'mark', 'unset') + markNames) + def mark_next(self, index): + """Return the name of the next mark after INDEX.""" + return self.tk.call(self._w, 'mark', 'next', index) or None + def mark_previous(self, index): + """Return the name of the previous mark before INDEX.""" + return self.tk.call(self._w, 'mark', 'previous', index) or None + def scan_mark(self, x, y): + """Remember the current X, Y coordinates.""" + self.tk.call(self._w, 'scan', 'mark', x, y) + def scan_dragto(self, x, y): + """Adjust the view of the text to 10 times the + difference between X and Y and the coordinates given in + scan_mark.""" + self.tk.call(self._w, 'scan', 'dragto', x, y) + def search(self, pattern, index, stopindex=None, + forwards=None, backwards=None, exact=None, + regexp=None, nocase=None, count=None): + """Search PATTERN beginning from INDEX until STOPINDEX. + Return the index of the first character of a match or an empty string.""" + args = [self._w, 'search'] + if forwards: args.append('-forwards') + if backwards: args.append('-backwards') + if exact: args.append('-exact') + if regexp: args.append('-regexp') + if nocase: args.append('-nocase') + if count: args.append('-count'); args.append(count) + if pattern[0] == '-': args.append('--') + args.append(pattern) + args.append(index) + if stopindex: args.append(stopindex) + return self.tk.call(tuple(args)) + def see(self, index): + """Scroll such that the character at INDEX is visible.""" + self.tk.call(self._w, 'see', index) + def tag_add(self, tagName, index1, *args): + """Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS. + Additional pairs of indices may follow in ARGS.""" + self.tk.call( + (self._w, 'tag', 'add', tagName, index1) + args) + def tag_unbind(self, tagName, sequence, funcid=None): + """Unbind for all characters with TAGNAME for event SEQUENCE the + function identified with FUNCID.""" + self.tk.call(self._w, 'tag', 'bind', tagName, sequence, '') + if funcid: + self.deletecommand(funcid) + def tag_bind(self, tagName, sequence, func, add=None): + """Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC. + + An additional boolean parameter ADD specifies whether FUNC will be + called additionally to the other bound function or whether it will + replace the previous function. See bind for the return value.""" + return self._bind((self._w, 'tag', 'bind', tagName), + sequence, func, add) + def tag_cget(self, tagName, option): + """Return the value of OPTION for tag TAGNAME.""" + if option[:1] != '-': + option = '-' + option + if option[-1:] == '_': + option = option[:-1] + return self.tk.call(self._w, 'tag', 'cget', tagName, option) + def tag_configure(self, tagName, cnf={}, **kw): + """Configure a tag TAGNAME.""" + if type(cnf) == StringType: + x = self.tk.split(self.tk.call( + self._w, 'tag', 'configure', tagName, '-'+cnf)) + return (x[0][1:],) + x[1:] + self.tk.call( + (self._w, 'tag', 'configure', tagName) + + self._options(cnf, kw)) + tag_config = tag_configure + def tag_delete(self, *tagNames): + """Delete all tags in TAGNAMES.""" + self.tk.call((self._w, 'tag', 'delete') + tagNames) + def tag_lower(self, tagName, belowThis=None): + """Change the priority of tag TAGNAME such that it is lower + than the priority of BELOWTHIS.""" + self.tk.call(self._w, 'tag', 'lower', tagName, belowThis) + def tag_names(self, index=None): + """Return a list of all tag names.""" + return self.tk.splitlist( + self.tk.call(self._w, 'tag', 'names', index)) + def tag_nextrange(self, tagName, index1, index2=None): + """Return a list of start and end index for the first sequence of + characters between INDEX1 and INDEX2 which all have tag TAGNAME. + The text is searched forward from INDEX1.""" + return self.tk.splitlist(self.tk.call( + self._w, 'tag', 'nextrange', tagName, index1, index2)) + def tag_prevrange(self, tagName, index1, index2=None): + """Return a list of start and end index for the first sequence of + characters between INDEX1 and INDEX2 which all have tag TAGNAME. + The text is searched backwards from INDEX1.""" + return self.tk.splitlist(self.tk.call( + self._w, 'tag', 'prevrange', tagName, index1, index2)) + def tag_raise(self, tagName, aboveThis=None): + """Change the priority of tag TAGNAME such that it is higher + than the priority of ABOVETHIS.""" + self.tk.call( + self._w, 'tag', 'raise', tagName, aboveThis) + def tag_ranges(self, tagName): + """Return a list of ranges of text which have tag TAGNAME.""" + return self.tk.splitlist(self.tk.call( + self._w, 'tag', 'ranges', tagName)) + def tag_remove(self, tagName, index1, index2=None): + """Remove tag TAGNAME from all characters between INDEX1 and INDEX2.""" + self.tk.call( + self._w, 'tag', 'remove', tagName, index1, index2) + def window_cget(self, index, option): + """Return the value of OPTION of an embedded window at INDEX.""" + if option[:1] != '-': + option = '-' + option + if option[-1:] == '_': + option = option[:-1] + return self.tk.call(self._w, 'window', 'cget', index, option) + def window_configure(self, index, cnf={}, **kw): + """Configure an embedded window at INDEX.""" + if type(cnf) == StringType: + x = self.tk.split(self.tk.call( + self._w, 'window', 'configure', + index, '-'+cnf)) + return (x[0][1:],) + x[1:] + self.tk.call( + (self._w, 'window', 'configure', index) + + self._options(cnf, kw)) + window_config = window_configure + def window_create(self, index, cnf={}, **kw): + """Create a window at INDEX.""" + self.tk.call( + (self._w, 'window', 'create', index) + + self._options(cnf, kw)) + def window_names(self): + """Return all names of embedded windows in this widget.""" + return self.tk.splitlist( + self.tk.call(self._w, 'window', 'names')) + def xview(self, *what): + """Query and change horizontal position of the view.""" + if not what: + return self._getdoubles(self.tk.call(self._w, 'xview')) + self.tk.call((self._w, 'xview') + what) + def xview_moveto(self, fraction): + """Adjusts the view in the window so that FRACTION of the + total width of the canvas is off-screen to the left.""" + self.tk.call(self._w, 'xview', 'moveto', fraction) + def xview_scroll(self, number, what): + """Shift the x-view according to NUMBER which is measured + in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'xview', 'scroll', number, what) + def yview(self, *what): + """Query and change vertical position of the view.""" + if not what: + return self._getdoubles(self.tk.call(self._w, 'yview')) + self.tk.call((self._w, 'yview') + what) + def yview_moveto(self, fraction): + """Adjusts the view in the window so that FRACTION of the + total height of the canvas is off-screen to the top.""" + self.tk.call(self._w, 'yview', 'moveto', fraction) + def yview_scroll(self, number, what): + """Shift the y-view according to NUMBER which is measured + in "units" or "pages" (WHAT).""" + self.tk.call(self._w, 'yview', 'scroll', number, what) + def yview_pickplace(self, *what): + """Obsolete function, use see.""" + self.tk.call((self._w, 'yview', '-pickplace') + what) + +class _setit: + """Internal class. It wraps the command in the widget OptionMenu.""" + def __init__(self, var, value, callback=None): + self.__value = value + self.__var = var + self.__callback = callback + def __call__(self, *args): + self.__var.set(self.__value) + if self.__callback: + apply(self.__callback, (self.__value,)+args) + +class OptionMenu(Menubutton): + """OptionMenu which allows the user to select a value from a menu.""" + def __init__(self, master, variable, value, *values, **kwargs): + """Construct an optionmenu widget with the parent MASTER, with + the resource textvariable set to VARIABLE, the initially selected + value VALUE, the other menu values VALUES and an additional + keyword argument command.""" + kw = {"borderwidth": 2, "textvariable": variable, + "indicatoron": 1, "relief": RAISED, "anchor": "c", + "highlightthickness": 2} + Widget.__init__(self, master, "menubutton", kw) + self.widgetName = 'tk_optionMenu' + menu = self.__menu = Menu(self, name="menu", tearoff=0) + self.menuname = menu._w + # 'command' is the only supported keyword + callback = kwargs.get('command') + if kwargs.has_key('command'): + del kwargs['command'] + if kwargs: + raise TclError, 'unknown option -'+kwargs.keys()[0] + menu.add_command(label=value, + command=_setit(variable, value, callback)) + for v in values: + menu.add_command(label=v, + command=_setit(variable, v, callback)) + self["menu"] = menu + + def __getitem__(self, name): + if name == 'menu': + return self.__menu + return Widget.__getitem__(self, name) + + def destroy(self): + """Destroy this widget and the associated menu.""" + Menubutton.destroy(self) + self.__menu = None + +class Image: + """Base class for images.""" + _last_id = 0 + def __init__(self, imgtype, name=None, cnf={}, master=None, **kw): + self.name = None + if not master: + master = _default_root + if not master: + raise RuntimeError, 'Too early to create image' + self.tk = master.tk + if not name: + Image._last_id += 1 + name = "pyimage" +`Image._last_id` # tk itself would use image + # The following is needed for systems where id(x) + # can return a negative number, such as Linux/m68k: + if name[0] == '-': name = '_' + name[1:] + if kw and cnf: cnf = _cnfmerge((cnf, kw)) + elif kw: cnf = kw + options = () + for k, v in cnf.items(): + if callable(v): + v = self._register(v) + options = options + ('-'+k, v) + self.tk.call(('image', 'create', imgtype, name,) + options) + self.name = name + def __str__(self): return self.name + def __del__(self): + if self.name: + try: + self.tk.call('image', 'delete', self.name) + except TclError: + # May happen if the root was destroyed + pass + def __setitem__(self, key, value): + self.tk.call(self.name, 'configure', '-'+key, value) + def __getitem__(self, key): + return self.tk.call(self.name, 'configure', '-'+key) + def configure(self, **kw): + """Configure the image.""" + res = () + for k, v in _cnfmerge(kw).items(): + if v is not None: + if k[-1] == '_': k = k[:-1] + if callable(v): + v = self._register(v) + res = res + ('-'+k, v) + self.tk.call((self.name, 'config') + res) + config = configure + def height(self): + """Return the height of the image.""" + return getint( + self.tk.call('image', 'height', self.name)) + def type(self): + """Return the type of the imgage, e.g. "photo" or "bitmap".""" + return self.tk.call('image', 'type', self.name) + def width(self): + """Return the width of the image.""" + return getint( + self.tk.call('image', 'width', self.name)) + +class PhotoImage(Image): + """Widget which can display colored images in GIF, PPM/PGM format.""" + def __init__(self, name=None, cnf={}, master=None, **kw): + """Create an image with NAME. + + Valid resource names: data, format, file, gamma, height, palette, + width.""" + apply(Image.__init__, (self, 'photo', name, cnf, master), kw) + def blank(self): + """Display a transparent image.""" + self.tk.call(self.name, 'blank') + def cget(self, option): + """Return the value of OPTION.""" + return self.tk.call(self.name, 'cget', '-' + option) + # XXX config + def __getitem__(self, key): + return self.tk.call(self.name, 'cget', '-' + key) + # XXX copy -from, -to, ...? + def copy(self): + """Return a new PhotoImage with the same image as this widget.""" + destImage = PhotoImage() + self.tk.call(destImage, 'copy', self.name) + return destImage + def zoom(self,x,y=''): + """Return a new PhotoImage with the same image as this widget + but zoom it with X and Y.""" + destImage = PhotoImage() + if y=='': y=x + self.tk.call(destImage, 'copy', self.name, '-zoom',x,y) + return destImage + def subsample(self,x,y=''): + """Return a new PhotoImage based on the same image as this widget + but use only every Xth or Yth pixel.""" + destImage = PhotoImage() + if y=='': y=x + self.tk.call(destImage, 'copy', self.name, '-subsample',x,y) + return destImage + def get(self, x, y): + """Return the color (red, green, blue) of the pixel at X,Y.""" + return self.tk.call(self.name, 'get', x, y) + def put(self, data, to=None): + """Put row formated colors to image starting from + position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))""" + args = (self.name, 'put', data) + if to: + if to[0] == '-to': + to = to[1:] + args = args + ('-to',) + tuple(to) + self.tk.call(args) + # XXX read + def write(self, filename, format=None, from_coords=None): + """Write image to file FILENAME in FORMAT starting from + position FROM_COORDS.""" + args = (self.name, 'write', filename) + if format: + args = args + ('-format', format) + if from_coords: + args = args + ('-from',) + tuple(from_coords) + self.tk.call(args) + +class BitmapImage(Image): + """Widget which can display a bitmap.""" + def __init__(self, name=None, cnf={}, master=None, **kw): + """Create a bitmap with NAME. + + Valid resource names: background, data, file, foreground, maskdata, maskfile.""" + apply(Image.__init__, (self, 'bitmap', name, cnf, master), kw) + +def image_names(): return _default_root.tk.call('image', 'names') +def image_types(): return _default_root.tk.call('image', 'types') + +###################################################################### +# Extensions: + +class Studbutton(Button): + def __init__(self, master=None, cnf={}, **kw): + Widget.__init__(self, master, 'studbutton', cnf, kw) + self.bind('', self.tkButtonEnter) + self.bind('', self.tkButtonLeave) + self.bind('<1>', self.tkButtonDown) + self.bind('', self.tkButtonUp) + +class Tributton(Button): + def __init__(self, master=None, cnf={}, **kw): + Widget.__init__(self, master, 'tributton', cnf, kw) + self.bind('', self.tkButtonEnter) + self.bind('', self.tkButtonLeave) + self.bind('<1>', self.tkButtonDown) + self.bind('', self.tkButtonUp) + self['fg'] = self['bg'] + self['activebackground'] = self['bg'] + +###################################################################### +# Test: + +def _test(): + root = Tk() + text = "This is Tcl/Tk version %s" % TclVersion + if TclVersion >= 8.1: + try: + text = text + unicode("\nThis should be a cedilla: \347", + "iso-8859-1") + except NameError: + pass # no unicode support + label = Label(root, text=text) + label.pack() + test = Button(root, text="Click me!", + command=lambda root=root: root.test.configure( + text="[%s]" % root.test['text'])) + test.pack() + root.test = test + quit = Button(root, text="QUIT", command=root.destroy) + quit.pack() + # The following three commands are needed so the window pops + # up on top on Windows... + root.iconify() + root.update() + root.deiconify() + root.mainloop() + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/lib-tk/tkColorChooser.py b/lib-python/2.2/lib-tk/tkColorChooser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkColorChooser.py @@ -0,0 +1,74 @@ +# +# Instant Python +# $Id$ +# +# tk common colour chooser dialogue +# +# this module provides an interface to the native color dialogue +# available in Tk 4.2 and newer. +# +# written by Fredrik Lundh, May 1997 +# +# fixed initialcolor handling in August 1998 +# + +# +# options (all have default values): +# +# - initialcolor: colour to mark as selected when dialog is displayed +# (given as an RGB triplet or a Tk color string) +# +# - parent: which window to place the dialog on top of +# +# - title: dialog title +# + +from tkCommonDialog import Dialog + + +# +# color chooser class + +class Chooser(Dialog): + "Ask for a color" + + command = "tk_chooseColor" + + def _fixoptions(self): + try: + # make sure initialcolor is a tk color string + color = self.options["initialcolor"] + if type(color) == type(()): + # assume an RGB triplet + self.options["initialcolor"] = "#%02x%02x%02x" % color + except KeyError: + pass + + def _fixresult(self, widget, result): + # to simplify application code, the color chooser returns + # an RGB tuple together with the Tk color string + if not result: + return None, None # canceled + r, g, b = widget.winfo_rgb(result) + return (r/256, g/256, b/256), result + + +# +# convenience stuff + +def askcolor(color = None, **options): + "Ask for a color" + + if color: + options = options.copy() + options["initialcolor"] = color + + return apply(Chooser, (), options).show() + + +# -------------------------------------------------------------------- +# test stuff + +if __name__ == "__main__": + + print "color", askcolor() diff --git a/lib-python/2.2/lib-tk/tkCommonDialog.py b/lib-python/2.2/lib-tk/tkCommonDialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkCommonDialog.py @@ -0,0 +1,65 @@ +# +# Instant Python +# $Id$ +# +# base class for tk common dialogues +# +# this module provides a base class for accessing the common +# dialogues available in Tk 4.2 and newer. use tkFileDialog, +# tkColorChooser, and tkMessageBox to access the individual +# dialogs. +# +# written by Fredrik Lundh, May 1997 +# + +from Tkinter import * +import os + +class Dialog: + + command = None + + def __init__(self, master=None, **options): + + # FIXME: should this be placed on the module level instead? + if TkVersion < 4.2: + raise TclError, "this module requires Tk 4.2 or newer" + + self.master = master + self.options = options + if not master and options.get('parent'): + self.master = options['parent'] + + def _fixoptions(self): + pass # hook + + def _fixresult(self, widget, result): + return result # hook + + def show(self, **options): + + # update instance options + for k, v in options.items(): + self.options[k] = v + + self._fixoptions() + + # we need a dummy widget to properly process the options + # (at least as long as we use Tkinter 1.63) + w = Frame(self.master) + + try: + + s = apply(w.tk.call, (self.command,) + w._options(self.options)) + + s = self._fixresult(w, s) + + finally: + + try: + # get rid of the widget + w.destroy() + except: + pass + + return s diff --git a/lib-python/2.2/lib-tk/tkFileDialog.py b/lib-python/2.2/lib-tk/tkFileDialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkFileDialog.py @@ -0,0 +1,129 @@ +# +# Instant Python +# $Id$ +# +# tk common file dialogues +# +# this module provides interfaces to the native file dialogues +# available in Tk 4.2 and newer, and the directory dialogue available +# in Tk 8.3 and newer. +# +# written by Fredrik Lundh, May 1997. +# + +# +# options (all have default values): +# +# - defaultextension: added to filename if not explicitly given +# +# - filetypes: sequence of (label, pattern) tuples. the same pattern +# may occur with several patterns. use "*" as pattern to indicate +# all files. +# +# - initialdir: initial directory. preserved by dialog instance. +# +# - initialfile: initial file (ignored by the open dialog). preserved +# by dialog instance. +# +# - parent: which window to place the dialog on top of +# +# - title: dialog title +# +# options for the directory chooser: +# +# - initialdir, parent, title: see above +# +# - mustexist: if true, user must pick an existing directory +# + +from tkCommonDialog import Dialog + +class _Dialog(Dialog): + + def _fixoptions(self): + try: + # make sure "filetypes" is a tuple + self.options["filetypes"] = tuple(self.options["filetypes"]) + except KeyError: + pass + + def _fixresult(self, widget, result): + if result: + # keep directory and filename until next time + import os + path, file = os.path.split(result) + self.options["initialdir"] = path + self.options["initialfile"] = file + self.filename = result # compatibility + return result + + +# +# file dialogs + +class Open(_Dialog): + "Ask for a filename to open" + + command = "tk_getOpenFile" + +class SaveAs(_Dialog): + "Ask for a filename to save as" + + command = "tk_getSaveFile" + + +# the directory dialog has its own _fix routines. +class Directory(Dialog): + "Ask for a directory" + + command = "tk_chooseDirectory" + + def _fixresult(self, widget, result): + if result: + # keep directory until next time + self.options["initialdir"] = result + self.directory = result # compatibility + return result + +# +# convenience stuff + +def askopenfilename(**options): + "Ask for a filename to open" + + return Open(**options).show() + +def asksaveasfilename(**options): + "Ask for a filename to save as" + + return SaveAs(**options).show() + +# FIXME: are the following two perhaps a bit too convenient? + +def askopenfile(mode = "r", **options): + "Ask for a filename to open, and returned the opened file" + + filename = Open(**options).show() + if filename: + return open(filename, mode) + return None + +def asksaveasfile(mode = "w", **options): + "Ask for a filename to save as, and returned the opened file" + + filename = SaveAs(**options).show() + if filename: + return open(filename, mode) + return None + +def askdirectory (**options): + "Ask for a directory, and return the file name" + return Directory(**options).show() + +# -------------------------------------------------------------------- +# test stuff + +if __name__ == "__main__": + + print "open", askopenfilename(filetypes=[("all filez", "*")]) + print "saveas", asksaveasfilename() diff --git a/lib-python/2.2/lib-tk/tkFont.py b/lib-python/2.2/lib-tk/tkFont.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkFont.py @@ -0,0 +1,191 @@ +# +# Tkinter +# $Id$ +# +# font wrapper +# +# written by Fredrik Lundh , February 1998 +# +# FIXME: should add 'displayof' option where relevant (actual, families, +# measure, and metrics) +# +# Copyright (c) Secret Labs AB 1998. +# +# info at pythonware.com +# http://www.pythonware.com +# + +__version__ = "0.9" + +import Tkinter + +# weight/slant +NORMAL = "normal" +BOLD = "bold" +ITALIC = "italic" + +class Font: + + """Represents a named font. + + Constructor options are: + + font -- font specifier (name, system font, or (family, size, style)-tuple) + + or any combination of + + family -- font 'family', e.g. Courier, Times, Helvetica + size -- font size in points + weight -- font thickness: NORMAL, BOLD + slant -- font slant: NORMAL, ITALIC + underline -- font underlining: false (0), true (1) + overstrike -- font strikeout: false (0), true (1) + name -- name to use for this font configuration (defaults to a unique name) + """ + + def _set(self, kw): + options = [] + for k, v in kw.items(): + options.append("-"+k) + options.append(str(v)) + return tuple(options) + + def _get(self, args): + options = [] + for k in args: + options.append("-"+k) + return tuple(options) + + def _mkdict(self, args): + options = {} + for i in range(0, len(args), 2): + options[args[i][1:]] = args[i+1] + return options + + def __init__(self, root=None, font=None, name=None, **options): + if not root: + root = Tkinter._default_root + if font: + # get actual settings corresponding to the given font + font = root.tk.splitlist(root.tk.call("font", "actual", font)) + else: + font = self._set(options) + if not name: + name = "font" + str(id(self)) + self.name = name + apply(root.tk.call, ("font", "create", name) + font) + # backlinks! + self._root = root + self._split = root.tk.splitlist + self._call = root.tk.call + + def __str__(self): + return self.name + + def __del__(self): + try: + self._call("font", "delete", self.name) + except (AttributeError, Tkinter.TclError): + pass + + def copy(self): + "Return a distinct copy of the current font" + return apply(Font, (self._root,), self.actual()) + + def actual(self, option=None): + "Return actual font attributes" + if option: + return self._call("font", "actual", self.name, "-"+option) + else: + return self._mkdict( + self._split(self._call("font", "actual", self.name)) + ) + + def cget(self, option): + "Get font attribute" + return self._call("font", "config", self.name, "-"+option) + + def config(self, **options): + "Modify font attributes" + if options: + apply(self._call, ("font", "config", self.name) + + self._set(options)) + else: + return self._mkdict( + self._split(self._call("font", "config", self.name)) + ) + + configure = config + + def measure(self, text): + "Return text width" + return int(self._call("font", "measure", self.name, text)) + + def metrics(self, *options): + """Return font metrics. + + For best performance, create a dummy widget + using this font before calling this method.""" + + if options: + return int( + self._call("font", "metrics", self.name, self._get(options)) + ) + else: + res = self._split(self._call("font", "metrics", self.name)) + options = {} + for i in range(0, len(res), 2): + options[res[i][1:]] = int(res[i+1]) + return options + +def families(root=None): + "Get font families (as a tuple)" + if not root: + root = Tkinter._default_root + return root.tk.splitlist(root.tk.call("font", "families")) + +def names(root=None): + "Get names of defined fonts (as a tuple)" + if not root: + root = Tkinter._default_root + return root.tk.splitlist(root.tk.call("font", "names")) + +# -------------------------------------------------------------------- +# test stuff + +if __name__ == "__main__": + + root = Tkinter.Tk() + + # create a font + f = Font(family="times", size=30, weight=NORMAL) + + print f.actual() + print f.actual("family") + print f.actual("weight") + + print f.config() + print f.cget("family") + print f.cget("weight") + + print names() + + print f.measure("hello"), f.metrics("linespace") + + print f.metrics() + + f = Font(font=("Courier", 20, "bold")) + print f.measure("hello"), f.metrics("linespace") + + w = Tkinter.Label(root, text="Hello, world", font=f) + w.pack() + + w = Tkinter.Button(root, text="Quit!", command=root.destroy) + w.pack() + + fb = Font(font=w["font"]).copy() + fb.config(weight=BOLD) + + w.config(font=fb) + + Tkinter.mainloop() diff --git a/lib-python/2.2/lib-tk/tkMessageBox.py b/lib-python/2.2/lib-tk/tkMessageBox.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkMessageBox.py @@ -0,0 +1,120 @@ +# +# Instant Python +# $Id$ +# +# tk common message boxes +# +# this module provides an interface to the native message boxes +# available in Tk 4.2 and newer. +# +# written by Fredrik Lundh, May 1997 +# + +# +# options (all have default values): +# +# - default: which button to make default (one of the reply codes) +# +# - icon: which icon to display (see below) +# +# - message: the message to display +# +# - parent: which window to place the dialog on top of +# +# - title: dialog title +# +# - type: dialog type; that is, which buttons to display (see below) +# + +from tkCommonDialog import Dialog + +# +# constants + +# icons +ERROR = "error" +INFO = "info" +QUESTION = "question" +WARNING = "warning" + +# types +ABORTRETRYIGNORE = "abortretryignore" +OK = "ok" +OKCANCEL = "okcancel" +RETRYCANCEL = "retrycancel" +YESNO = "yesno" +YESNOCANCEL = "yesnocancel" + +# replies +ABORT = "abort" +RETRY = "retry" +IGNORE = "ignore" +OK = "ok" +CANCEL = "cancel" +YES = "yes" +NO = "no" + + +# +# message dialog class + +class Message(Dialog): + "A message box" + + command = "tk_messageBox" + + +# +# convenience stuff + +def _show(title=None, message=None, icon=None, type=None, **options): + if icon: options["icon"] = icon + if type: options["type"] = type + if title: options["title"] = title + if message: options["message"] = message + return apply(Message, (), options).show() + +def showinfo(title=None, message=None, **options): + "Show an info message" + return apply(_show, (title, message, INFO, OK), options) + +def showwarning(title=None, message=None, **options): + "Show a warning message" + return apply(_show, (title, message, WARNING, OK), options) + +def showerror(title=None, message=None, **options): + "Show an error message" + return apply(_show, (title, message, ERROR, OK), options) + +def askquestion(title=None, message=None, **options): + "Ask a question" + return apply(_show, (title, message, QUESTION, YESNO), options) + +def askokcancel(title=None, message=None, **options): + "Ask if operation should proceed; return true if the answer is ok" + s = apply(_show, (title, message, QUESTION, OKCANCEL), options) + return s == OK + +def askyesno(title=None, message=None, **options): + "Ask a question; return true if the answer is yes" + s = apply(_show, (title, message, QUESTION, YESNO), options) + return s == YES + +def askretrycancel(title=None, message=None, **options): + "Ask if operation should be retried; return true if the answer is yes" + s = apply(_show, (title, message, WARNING, RETRYCANCEL), options) + return s == RETRY + + +# -------------------------------------------------------------------- +# test stuff + +if __name__ == "__main__": + + print "info", showinfo("Spam", "Egg Information") + print "warning", showwarning("Spam", "Egg Warning") + print "error", showerror("Spam", "Egg Alert") + print "question", askquestion("Spam", "Question?") + print "proceed", askokcancel("Spam", "Proceed?") + print "yes/no", askyesno("Spam", "Got it?") + print "try again", askretrycancel("Spam", "Try again?") diff --git a/lib-python/2.2/lib-tk/tkSimpleDialog.py b/lib-python/2.2/lib-tk/tkSimpleDialog.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/tkSimpleDialog.py @@ -0,0 +1,313 @@ +# +# An Introduction to Tkinter +# tkSimpleDialog.py +# +# Copyright (c) 1997 by Fredrik Lundh +# +# fredrik at pythonware.com +# http://www.pythonware.com +# + +# -------------------------------------------------------------------- +# dialog base class + +'''Dialog boxes + +This module handles dialog boxes. It contains the following +public symbols: + +Dialog -- a base class for dialogs + +askinteger -- get an integer from the user + +askfloat -- get a float from the user + +askstring -- get a string from the user +''' + +from Tkinter import * +import os + +class Dialog(Toplevel): + + '''Class to open dialogs. + + This class is intended as a base class for custom dialogs + ''' + + def __init__(self, parent, title = None): + + '''Initialize a dialog. + + Arguments: + + parent -- a parent window (the application window) + + title -- the dialog title + ''' + Toplevel.__init__(self, parent) + self.transient(parent) + + if title: + self.title(title) + + self.parent = parent + + self.result = None + + body = Frame(self) + self.initial_focus = self.body(body) + body.pack(padx=5, pady=5) + + self.buttonbox() + + self.grab_set() + + if not self.initial_focus: + self.initial_focus = self + + self.protocol("WM_DELETE_WINDOW", self.cancel) + + if self.parent is not None: + self.geometry("+%d+%d" % (parent.winfo_rootx()+50, + parent.winfo_rooty()+50)) + + self.initial_focus.focus_set() + + self.wait_window(self) + + def destroy(self): + '''Destroy the window''' + self.initial_focus = None + Toplevel.destroy(self) + + # + # construction hooks + + def body(self, master): + '''create dialog body. + + return widget that should have initial focus. + This method should be overridden, and is called + by the __init__ method. + ''' + pass + + def buttonbox(self): + '''add standard button box. + + override if you do not want the standard buttons + ''' + + box = Frame(self) + + w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) + w.pack(side=LEFT, padx=5, pady=5) + w = Button(box, text="Cancel", width=10, command=self.cancel) + w.pack(side=LEFT, padx=5, pady=5) + + self.bind("", self.ok) + self.bind("", self.cancel) + + box.pack() + + # + # standard button semantics + + def ok(self, event=None): + + if not self.validate(): + self.initial_focus.focus_set() # put focus back + return + + self.withdraw() + self.update_idletasks() + + self.apply() + + self.cancel() + + def cancel(self, event=None): + + # put focus back to the parent window + if self.parent is not None: + self.parent.focus_set() + self.destroy() + + # + # command hooks + + def validate(self): + '''validate the data + + This method is called automatically to validate the data before the + dialog is destroyed. By default, it always validates OK. + ''' + + return 1 # override + + def apply(self): + '''process the data + + This method is called automatically to process the data, *after* + the dialog is destroyed. By default, it does nothing. + ''' + + pass # override + + +# -------------------------------------------------------------------- +# convenience dialogues + +class _QueryDialog(Dialog): + + def __init__(self, title, prompt, + initialvalue=None, + minvalue = None, maxvalue = None, + parent = None): + + if not parent: + import Tkinter + parent = Tkinter._default_root + + self.prompt = prompt + self.minvalue = minvalue + self.maxvalue = maxvalue + + self.initialvalue = initialvalue + + Dialog.__init__(self, parent, title) + + def destroy(self): + self.entry = None + Dialog.destroy(self) + + def body(self, master): + + w = Label(master, text=self.prompt, justify=LEFT) + w.grid(row=0, padx=5, sticky=W) + + self.entry = Entry(master, name="entry") + self.entry.grid(row=1, padx=5, sticky=W+E) + + if self.initialvalue: + self.entry.insert(0, self.initialvalue) + self.entry.select_range(0, END) + + return self.entry + + def validate(self): + + import tkMessageBox + + try: + result = self.getresult() + except ValueError: + tkMessageBox.showwarning( + "Illegal value", + self.errormessage + "\nPlease try again", + parent = self + ) + return 0 + + if self.minvalue is not None and result < self.minvalue: + tkMessageBox.showwarning( + "Too small", + "The allowed minimum value is %s. " + "Please try again." % self.minvalue, + parent = self + ) + return 0 + + if self.maxvalue is not None and result > self.maxvalue: + tkMessageBox.showwarning( + "Too large", + "The allowed maximum value is %s. " + "Please try again." % self.maxvalue, + parent = self + ) + return 0 + + self.result = result + + return 1 + + +class _QueryInteger(_QueryDialog): + errormessage = "Not an integer." + def getresult(self): + return int(self.entry.get()) + +def askinteger(title, prompt, **kw): + '''get an integer from the user + + Arguments: + + title -- the dialog title + prompt -- the label text + **kw -- see SimpleDialog class + + Return value is an integer + ''' + d = apply(_QueryInteger, (title, prompt), kw) + return d.result + +class _QueryFloat(_QueryDialog): + errormessage = "Not a floating point value." + def getresult(self): + return float(self.entry.get()) + +def askfloat(title, prompt, **kw): + '''get a float from the user + + Arguments: + + title -- the dialog title + prompt -- the label text + **kw -- see SimpleDialog class + + Return value is a float + ''' + d = apply(_QueryFloat, (title, prompt), kw) + return d.result + +class _QueryString(_QueryDialog): + def __init__(self, *args, **kw): + if kw.has_key("show"): + self.__show = kw["show"] + del kw["show"] + else: + self.__show = None + _QueryDialog.__init__(self, *args, **kw) + + def body(self, master): + entry = _QueryDialog.body(self, master) + if self.__show is not None: + entry.configure(show=self.__show) + return entry + + def getresult(self): + return self.entry.get() + +def askstring(title, prompt, **kw): + '''get a string from the user + + Arguments: + + title -- the dialog title + prompt -- the label text + **kw -- see SimpleDialog class + + Return value is a string + ''' + d = apply(_QueryString, (title, prompt), kw) + return d.result + +if __name__ == "__main__": + + root = Tk() + root.update() + + print askinteger("Spam", "Egg count", initialvalue=12*12) + print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100) + print askstring("Spam", "Egg label") diff --git a/lib-python/2.2/lib-tk/turtle.py b/lib-python/2.2/lib-tk/turtle.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/lib-tk/turtle.py @@ -0,0 +1,385 @@ +# LogoMation-like turtle graphics + +from math import * # Also for export +import Tkinter +class Error(Exception): + pass + +class RawPen: + + def __init__(self, canvas): + self._canvas = canvas + self._items = [] + self._tracing = 1 + self._arrow = 0 + self.degrees() + self.reset() + + def degrees(self, fullcircle=360.0): + self._fullcircle = fullcircle + self._invradian = pi / (fullcircle * 0.5) + + def radians(self): + self.degrees(2.0*pi) + + def reset(self): + canvas = self._canvas + self._canvas.update() + width = canvas.winfo_width() + height = canvas.winfo_height() + if width <= 1: + width = canvas['width'] + if height <= 1: + height = canvas['height'] + self._origin = float(width)/2.0, float(height)/2.0 + self._position = self._origin + self._angle = 0.0 + self._drawing = 1 + self._width = 1 + self._color = "black" + self._filling = 0 + self._path = [] + self._tofill = [] + self.clear() + canvas._root().tkraise() + + def clear(self): + self.fill(0) + canvas = self._canvas + items = self._items + self._items = [] + for item in items: + canvas.delete(item) + self._delete_turtle() + self._draw_turtle() + + + def tracer(self, flag): + self._tracing = flag + if not self._tracing: + self._delete_turtle() + self._draw_turtle() + + def forward(self, distance): + x0, y0 = start = self._position + x1 = x0 + distance * cos(self._angle*self._invradian) + y1 = y0 - distance * sin(self._angle*self._invradian) + self._goto(x1, y1) + + def backward(self, distance): + self.forward(-distance) + + def left(self, angle): + self._angle = (self._angle + angle) % self._fullcircle + self._draw_turtle() + + def right(self, angle): + self.left(-angle) + + def up(self): + self._drawing = 0 + + def down(self): + self._drawing = 1 + + def width(self, width): + self._width = float(width) + + def color(self, *args): + if not args: + raise Error, "no color arguments" + if len(args) == 1: + color = args[0] + if type(color) == type(""): + # Test the color first + try: + id = self._canvas.create_line(0, 0, 0, 0, fill=color) + except Tkinter.TclError: + raise Error, "bad color string: %s" % `color` + self._set_color(color) + return + try: + r, g, b = color + except: + raise Error, "bad color sequence: %s" % `color` + else: + try: + r, g, b = args + except: + raise Error, "bad color arguments: %s" % `args` + assert 0 <= r <= 1 + assert 0 <= g <= 1 + assert 0 <= b <= 1 + x = 255.0 + y = 0.5 + self._set_color("#%02x%02x%02x" % (int(r*x+y), int(g*x+y), int(b*x+y))) + + def _set_color(self,color): + self._color = color + self._draw_turtle() + + + def write(self, arg, move=0): + x, y = start = self._position + x = x-1 # correction -- calibrated for Windows + item = self._canvas.create_text(x, y, + text=str(arg), anchor="sw", + fill=self._color) + self._items.append(item) + if move: + x0, y0, x1, y1 = self._canvas.bbox(item) + self._goto(x1, y1) + self._draw_turtle() + + def fill(self, flag): + if self._filling: + path = tuple(self._path) + smooth = self._filling < 0 + if len(path) > 2: + item = self._canvas._create('polygon', path, + {'fill': self._color, + 'smooth': smooth}) + self._items.append(item) + self._canvas.lower(item) + if self._tofill: + for item in self._tofill: + self._canvas.itemconfigure(item, fill=self._color) + self._items.append(item) + self._path = [] + self._tofill = [] + self._filling = flag + if flag: + self._path.append(self._position) + + def circle(self, radius, extent=None): + if extent is None: + extent = self._fullcircle + x0, y0 = self._position + xc = x0 - radius * sin(self._angle * self._invradian) + yc = y0 - radius * cos(self._angle * self._invradian) + if radius >= 0.0: + start = self._angle - 90.0 + else: + start = self._angle + 90.0 + extent = -extent + if self._filling: + if abs(extent) >= self._fullcircle: + item = self._canvas.create_oval(xc-radius, yc-radius, + xc+radius, yc+radius, + width=self._width, + outline="") + self._tofill.append(item) + item = self._canvas.create_arc(xc-radius, yc-radius, + xc+radius, yc+radius, + style="chord", + start=start, + extent=extent, + width=self._width, + outline="") + self._tofill.append(item) + if self._drawing: + if abs(extent) >= self._fullcircle: + item = self._canvas.create_oval(xc-radius, yc-radius, + xc+radius, yc+radius, + width=self._width, + outline=self._color) + self._items.append(item) + item = self._canvas.create_arc(xc-radius, yc-radius, + xc+radius, yc+radius, + style="arc", + start=start, + extent=extent, + width=self._width, + outline=self._color) + self._items.append(item) + angle = start + extent + x1 = xc + abs(radius) * cos(angle * self._invradian) + y1 = yc - abs(radius) * sin(angle * self._invradian) + self._angle = (self._angle + extent) % self._fullcircle + self._position = x1, y1 + if self._filling: + self._path.append(self._position) + self._draw_turtle() + + def goto(self, *args): + if len(args) == 1: + try: + x, y = args[0] + except: + raise Error, "bad point argument: %s" % `args[0]` + else: + try: + x, y = args + except: + raise Error, "bad coordinates: %s" % `args[0]` + x0, y0 = self._origin + self._goto(x0+x, y0-y) + + def _goto(self, x1, y1): + x0, y0 = start = self._position + self._position = map(float, (x1, y1)) + if self._filling: + self._path.append(self._position) + if self._drawing: + if self._tracing: + dx = float(x1 - x0) + dy = float(y1 - y0) + distance = hypot(dx, dy) + nhops = int(distance) + item = self._canvas.create_line(x0, y0, x0, y0, + width=self._width, + capstyle="round", + fill=self._color) + try: + for i in range(1, 1+nhops): + x, y = x0 + dx*i/nhops, y0 + dy*i/nhops + self._canvas.coords(item, x0, y0, x, y) + self._draw_turtle((x,y)) + self._canvas.update() + self._canvas.after(10) + # in case nhops==0 + self._canvas.coords(item, x0, y0, x1, y1) + self._canvas.itemconfigure(item, arrow="none") + except Tkinter.TclError: + # Probably the window was closed! + return + else: + item = self._canvas.create_line(x0, y0, x1, y1, + width=self._width, + capstyle="round", + fill=self._color) + self._items.append(item) + self._draw_turtle() + + def _draw_turtle(self,position=[]): + if not self._tracing: + return + if position == []: + position = self._position + x,y = position + distance = 8 + dx = distance * cos(self._angle*self._invradian) + dy = distance * sin(self._angle*self._invradian) + self._delete_turtle() + self._arrow = self._canvas.create_line(x-dx,y+dy,x,y, + width=self._width, + arrow="last", + capstyle="round", + fill=self._color) + self._canvas.update() + + def _delete_turtle(self): + if self._arrow != 0: + self._canvas.delete(self._arrow) + self._arrow = 0 + + + +_root = None +_canvas = None +_pen = None + +class Pen(RawPen): + + def __init__(self): + global _root, _canvas + if _root is None: + _root = Tkinter.Tk() + _root.wm_protocol("WM_DELETE_WINDOW", self._destroy) + if _canvas is None: + # XXX Should have scroll bars + _canvas = Tkinter.Canvas(_root, background="white") + _canvas.pack(expand=1, fill="both") + RawPen.__init__(self, _canvas) + + def _destroy(self): + global _root, _canvas, _pen + root = self._canvas._root() + if root is _root: + _pen = None + _root = None + _canvas = None + root.destroy() + + +def _getpen(): + global _pen + pen = _pen + if not pen: + _pen = pen = Pen() + return pen + +def degrees(): _getpen().degrees() +def radians(): _getpen().radians() +def reset(): _getpen().reset() +def clear(): _getpen().clear() +def tracer(flag): _getpen().tracer(flag) +def forward(distance): _getpen().forward(distance) +def backward(distance): _getpen().backward(distance) +def left(angle): _getpen().left(angle) +def right(angle): _getpen().right(angle) +def up(): _getpen().up() +def down(): _getpen().down() +def width(width): _getpen().width(width) +def color(*args): apply(_getpen().color, args) +def write(arg, move=0): _getpen().write(arg, move) +def fill(flag): _getpen().fill(flag) +def circle(radius, extent=None): _getpen().circle(radius, extent) +def goto(*args): apply(_getpen().goto, args) + +def demo(): + reset() + tracer(1) + up() + backward(100) + down() + # draw 3 squares; the last filled + width(3) + for i in range(3): + if i == 2: + fill(1) + for j in range(4): + forward(20) + left(90) + if i == 2: + color("maroon") + fill(0) + up() + forward(30) + down() + width(1) + color("black") + # move out of the way + tracer(0) + up() + right(90) + forward(100) + right(90) + forward(100) + right(180) + down() + # some text + write("startstart", 1) + write("start", 1) + color("red") + # staircase + for i in range(5): + forward(20) + left(90) + forward(20) + right(90) + # filled staircase + fill(1) + for i in range(5): + forward(20) + left(90) + forward(20) + right(90) + fill(0) + # more text + write("end") + if __name__ == '__main__': + _root.mainloop() + +if __name__ == '__main__': + demo() diff --git a/lib-python/2.2/linecache.py b/lib-python/2.2/linecache.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/linecache.py @@ -0,0 +1,101 @@ +"""Cache lines from files. + +This is intended to read lines from modules imported -- hence if a filename +is not found, it will look down the module search path for a file by +that name. +""" + +import sys +import os +from stat import * + +__all__ = ["getline","clearcache","checkcache"] + +def getline(filename, lineno): + lines = getlines(filename) + if 1 <= lineno <= len(lines): + return lines[lineno-1] + else: + return '' + + +# The cache + +cache = {} # The cache + + +def clearcache(): + """Clear the cache entirely.""" + + global cache + cache = {} + + +def getlines(filename): + """Get the lines for a file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + if cache.has_key(filename): + return cache[filename][2] + else: + return updatecache(filename) + + +def checkcache(): + """Discard cache entries that are out of date. + (This is not checked upon each call!)""" + + for filename in cache.keys(): + size, mtime, lines, fullname = cache[filename] + try: + stat = os.stat(fullname) + except os.error: + del cache[filename] + continue + if size != stat[ST_SIZE] or mtime != stat[ST_MTIME]: + del cache[filename] + + +def updatecache(filename): + """Update a cache entry and return its list of lines. + If something's wrong, print a message, discard the cache entry, + and return an empty list.""" + + if cache.has_key(filename): + del cache[filename] + if not filename or filename[0] + filename[-1] == '<>': + return [] + fullname = filename + try: + stat = os.stat(fullname) + except os.error, msg: + # Try looking through the module search path. + basename = os.path.split(filename)[1] + for dirname in sys.path: + # When using imputil, sys.path may contain things other than + # strings; ignore them when it happens. + try: + fullname = os.path.join(dirname, basename) + except (TypeError, AttributeError): + # Not sufficiently string-like to do anything useful with. + pass + else: + try: + stat = os.stat(fullname) + break + except os.error: + pass + else: + # No luck +## print '*** Cannot stat', filename, ':', msg + return [] + try: + fp = open(fullname, 'r') + lines = fp.readlines() + fp.close() + except IOError, msg: +## print '*** Cannot open', fullname, ':', msg + return [] + size, mtime = stat[ST_SIZE], stat[ST_MTIME] + cache[filename] = size, mtime, lines, fullname + return lines diff --git a/lib-python/2.2/locale.py b/lib-python/2.2/locale.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/locale.py @@ -0,0 +1,743 @@ +""" Locale support. + + The module provides low-level access to the C lib's locale APIs + and adds high level number formatting APIs as well as a locale + aliasing engine to complement these. + + The aliasing engine includes support for many commonly used locale + names and maps them to values suitable for passing to the C lib's + setlocale() function. It also includes default encodings for all + supported locale names. + +""" + +import sys + +# Try importing the _locale module. +# +# If this fails, fall back on a basic 'C' locale emulation. + +# Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before +# trying the import. So __all__ is also fiddled at the end of the file. +__all__ = ["setlocale","Error","localeconv","strcoll","strxfrm", + "format","str","atof","atoi","LC_CTYPE","LC_COLLATE", + "LC_TIME","LC_MONETARY","LC_NUMERIC", "LC_ALL","CHAR_MAX"] + +try: + + from _locale import * + +except ImportError: + + # Locale emulation + + CHAR_MAX = 127 + LC_ALL = 6 + LC_COLLATE = 3 + LC_CTYPE = 0 + LC_MESSAGES = 5 + LC_MONETARY = 4 + LC_NUMERIC = 1 + LC_TIME = 2 + Error = ValueError + + def localeconv(): + """ localeconv() -> dict. + Returns numeric and monetary locale-specific parameters. + """ + # 'C' locale default values + return {'grouping': [127], + 'currency_symbol': '', + 'n_sign_posn': 127, + 'p_cs_precedes': 127, + 'n_cs_precedes': 127, + 'mon_grouping': [], + 'n_sep_by_space': 127, + 'decimal_point': '.', + 'negative_sign': '', + 'positive_sign': '', + 'p_sep_by_space': 127, + 'int_curr_symbol': '', + 'p_sign_posn': 127, + 'thousands_sep': '', + 'mon_thousands_sep': '', + 'frac_digits': 127, + 'mon_decimal_point': '', + 'int_frac_digits': 127} + + def setlocale(category, value=None): + """ setlocale(integer,string=None) -> string. + Activates/queries locale processing. + """ + if value is not None and value != 'C': + raise Error, '_locale emulation only supports "C" locale' + return 'C' + + def strcoll(a,b): + """ strcoll(string,string) -> int. + Compares two strings according to the locale. + """ + return cmp(a,b) + + def strxfrm(s): + """ strxfrm(string) -> string. + Returns a string that behaves for cmp locale-aware. + """ + return s + +### Number formatting APIs + +# Author: Martin von Loewis + +#perform the grouping from right to left +def _group(s): + conv=localeconv() + grouping=conv['grouping'] + if not grouping:return (s, 0) + result="" + seps = 0 + spaces = "" + if s[-1] == ' ': + sp = s.find(' ') + spaces = s[sp:] + s = s[:sp] + while s and grouping: + # if grouping is -1, we are done + if grouping[0]==CHAR_MAX: + break + # 0: re-use last group ad infinitum + elif grouping[0]!=0: + #process last group + group=grouping[0] + grouping=grouping[1:] + if result: + result=s[-group:]+conv['thousands_sep']+result + seps += 1 + else: + result=s[-group:] + s=s[:-group] + if s and s[-1] not in "0123456789": + # the leading string is only spaces and signs + return s+result+spaces,seps + if not result: + return s+spaces,seps + if s: + result=s+conv['thousands_sep']+result + seps += 1 + return result+spaces,seps + +def format(f,val,grouping=0): + """Formats a value in the same way that the % formatting would use, + but takes the current locale into account. + Grouping is applied if the third parameter is true.""" + result = f % val + fields = result.split(".") + seps = 0 + if grouping: + fields[0],seps=_group(fields[0]) + if len(fields)==2: + result = fields[0]+localeconv()['decimal_point']+fields[1] + elif len(fields)==1: + result = fields[0] + else: + raise Error, "Too many decimal points in result string" + + while seps: + # If the number was formatted for a specific width, then it + # might have been filled with spaces to the left or right. If + # so, kill as much spaces as there where separators. + # Leading zeroes as fillers are not yet dealt with, as it is + # not clear how they should interact with grouping. + sp = result.find(" ") + if sp==-1:break + result = result[:sp]+result[sp+1:] + seps -= 1 + + return result + +def str(val): + """Convert float to integer, taking the locale into account.""" + return format("%.12g",val) + +def atof(str,func=float): + "Parses a string as a float according to the locale settings." + #First, get rid of the grouping + ts = localeconv()['thousands_sep'] + if ts: + s=str.split(ts) + str="".join(s) + #next, replace the decimal point with a dot + dd = localeconv()['decimal_point'] + if dd: + s=str.split(dd) + str='.'.join(s) + #finally, parse the string + return func(str) + +def atoi(str): + "Converts a string to an integer according to the locale settings." + return atof(str, int) + +def _test(): + setlocale(LC_ALL, "") + #do grouping + s1=format("%d", 123456789,1) + print s1, "is", atoi(s1) + #standard formatting + s1=str(3.14) + print s1, "is", atof(s1) + +### Locale name aliasing engine + +# Author: Marc-Andre Lemburg, mal at lemburg.com +# Various tweaks by Fredrik Lundh + +# store away the low-level version of setlocale (it's +# overridden below) +_setlocale = setlocale + +def normalize(localename): + + """ Returns a normalized locale code for the given locale + name. + + The returned locale code is formatted for use with + setlocale(). + + If normalization fails, the original name is returned + unchanged. + + If the given encoding is not known, the function defaults to + the default encoding for the locale code just like setlocale() + does. + + """ + # Normalize the locale name and extract the encoding + fullname = localename.lower() + if ':' in fullname: + # ':' is sometimes used as encoding delimiter. + fullname = fullname.replace(':', '.') + if '.' in fullname: + langname, encoding = fullname.split('.')[:2] + fullname = langname + '.' + encoding + else: + langname = fullname + encoding = '' + + # First lookup: fullname (possibly with encoding) + code = locale_alias.get(fullname, None) + if code is not None: + return code + + # Second try: langname (without encoding) + code = locale_alias.get(langname, None) + if code is not None: + if '.' in code: + langname, defenc = code.split('.') + else: + langname = code + defenc = '' + if encoding: + encoding = encoding_alias.get(encoding, encoding) + else: + encoding = defenc + if encoding: + return langname + '.' + encoding + else: + return langname + + else: + return localename + +def _parse_localename(localename): + + """ Parses the locale code for localename and returns the + result as tuple (language code, encoding). + + The localename is normalized and passed through the locale + alias engine. A ValueError is raised in case the locale name + cannot be parsed. + + The language code corresponds to RFC 1766. code and encoding + can be None in case the values cannot be determined or are + unknown to this implementation. + + """ + code = normalize(localename) + if '@' in localename: + # Deal with locale modifiers + code, modifier = code.split('@') + if modifier == 'euro' and '.' not in code: + # Assume Latin-9 for @euro locales. This is bogus, + # since some systems may use other encodings for these + # locales. Also, we ignore other modifiers. + return code, 'iso-8859-15' + + if '.' in code: + return code.split('.')[:2] + elif code == 'C': + return None, None + raise ValueError, 'unknown locale: %s' % localename + +def _build_localename(localetuple): + + """ Builds a locale code from the given tuple (language code, + encoding). + + No aliasing or normalizing takes place. + + """ + language, encoding = localetuple + if language is None: + language = 'C' + if encoding is None: + return language + else: + return language + '.' + encoding + +def getdefaultlocale(envvars=('LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')): + + """ Tries to determine the default locale settings and returns + them as tuple (language code, encoding). + + According to POSIX, a program which has not called + setlocale(LC_ALL, "") runs using the portable 'C' locale. + Calling setlocale(LC_ALL, "") lets it use the default locale as + defined by the LANG variable. Since we don't want to interfere + with the current locale setting we thus emulate the behavior + in the way described above. + + To maintain compatibility with other platforms, not only the + LANG variable is tested, but a list of variables given as + envvars parameter. The first found to be defined will be + used. envvars defaults to the search path used in GNU gettext; + it must always contain the variable name 'LANG'. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + + try: + # check if it's supported by the _locale module + import _locale + code, encoding = _locale._getdefaultlocale() + except (ImportError, AttributeError): + pass + else: + # make sure the code/encoding values are valid + if sys.platform == "win32" and code and code[:2] == "0x": + # map windows language identifier to language name + code = windows_locale.get(int(code, 0)) + # ...add other platform-specific processing here, if + # necessary... + return code, encoding + + # fall back on POSIX behaviour + import os + lookup = os.environ.get + for variable in envvars: + localename = lookup(variable,None) + if localename is not None: + break + else: + localename = 'C' + return _parse_localename(localename) + + +def getlocale(category=LC_CTYPE): + + """ Returns the current setting for the given locale category as + tuple (language code, encoding). + + category may be one of the LC_* value except LC_ALL. It + defaults to LC_CTYPE. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + localename = _setlocale(category) + if category == LC_ALL and ';' in localename: + raise TypeError, 'category LC_ALL is not supported' + return _parse_localename(localename) + +def setlocale(category, locale=None): + + """ Set the locale for the given category. The locale can be + a string, a locale tuple (language code, encoding), or None. + + Locale tuples are converted to strings the locale aliasing + engine. Locale strings are passed directly to the C lib. + + category may be given as one of the LC_* values. + + """ + if locale and type(locale) is not type(""): + # convert to string + locale = normalize(_build_localename(locale)) + return _setlocale(category, locale) + +def resetlocale(category=LC_ALL): + + """ Sets the locale for category to the default setting. + + The default setting is determined by calling + getdefaultlocale(). category defaults to LC_ALL. + + """ + _setlocale(category, _build_localename(getdefaultlocale())) + +### Database +# +# The following data was extracted from the locale.alias file which +# comes with X11 and then hand edited removing the explicit encoding +# definitions and adding some more aliases. The file is usually +# available as /usr/lib/X11/locale/locale.alias. +# + +# +# The encoding_alias table maps lowercase encoding alias names to C +# locale encoding names (case-sensitive). +# +encoding_alias = { + '437': 'C', + 'c': 'C', + 'iso8859': 'ISO8859-1', + '8859': 'ISO8859-1', + '88591': 'ISO8859-1', + 'ascii': 'ISO8859-1', + 'en': 'ISO8859-1', + 'iso88591': 'ISO8859-1', + 'iso_8859-1': 'ISO8859-1', + '885915': 'ISO8859-15', + 'iso885915': 'ISO8859-15', + 'iso_8859-15': 'ISO8859-15', + 'iso8859-2': 'ISO8859-2', + 'iso88592': 'ISO8859-2', + 'iso_8859-2': 'ISO8859-2', + 'iso88595': 'ISO8859-5', + 'iso88596': 'ISO8859-6', + 'iso88597': 'ISO8859-7', + 'iso88598': 'ISO8859-8', + 'iso88599': 'ISO8859-9', + 'iso-2022-jp': 'JIS7', + 'jis': 'JIS7', + 'jis7': 'JIS7', + 'sjis': 'SJIS', + 'tis620': 'TACTIS', + 'ajec': 'eucJP', + 'eucjp': 'eucJP', + 'ujis': 'eucJP', + 'utf-8': 'utf', + 'utf8': 'utf', + 'utf8 at ucs4': 'utf', +} + +# +# The locale_alias table maps lowercase alias names to C locale names +# (case-sensitive). Encodings are always separated from the locale +# name using a dot ('.'); they should only be given in case the +# language name is needed to interpret the given encoding alias +# correctly (CJK codes often have this need). +# +locale_alias = { + 'american': 'en_US.ISO8859-1', + 'ar': 'ar_AA.ISO8859-6', + 'ar_aa': 'ar_AA.ISO8859-6', + 'ar_sa': 'ar_SA.ISO8859-6', + 'arabic': 'ar_AA.ISO8859-6', + 'bg': 'bg_BG.ISO8859-5', + 'bg_bg': 'bg_BG.ISO8859-5', + 'bulgarian': 'bg_BG.ISO8859-5', + 'c-french': 'fr_CA.ISO8859-1', + 'c': 'C', + 'c_c': 'C', + 'cextend': 'en_US.ISO8859-1', + 'chinese-s': 'zh_CN.eucCN', + 'chinese-t': 'zh_TW.eucTW', + 'croatian': 'hr_HR.ISO8859-2', + 'cs': 'cs_CZ.ISO8859-2', + 'cs_cs': 'cs_CZ.ISO8859-2', + 'cs_cz': 'cs_CZ.ISO8859-2', + 'cz': 'cz_CZ.ISO8859-2', + 'cz_cz': 'cz_CZ.ISO8859-2', + 'czech': 'cs_CS.ISO8859-2', + 'da': 'da_DK.ISO8859-1', + 'da_dk': 'da_DK.ISO8859-1', + 'danish': 'da_DK.ISO8859-1', + 'de': 'de_DE.ISO8859-1', + 'de_at': 'de_AT.ISO8859-1', + 'de_ch': 'de_CH.ISO8859-1', + 'de_de': 'de_DE.ISO8859-1', + 'dutch': 'nl_BE.ISO8859-1', + 'ee': 'ee_EE.ISO8859-4', + 'el': 'el_GR.ISO8859-7', + 'el_gr': 'el_GR.ISO8859-7', + 'en': 'en_US.ISO8859-1', + 'en_au': 'en_AU.ISO8859-1', + 'en_ca': 'en_CA.ISO8859-1', + 'en_gb': 'en_GB.ISO8859-1', + 'en_ie': 'en_IE.ISO8859-1', + 'en_nz': 'en_NZ.ISO8859-1', + 'en_uk': 'en_GB.ISO8859-1', + 'en_us': 'en_US.ISO8859-1', + 'eng_gb': 'en_GB.ISO8859-1', + 'english': 'en_EN.ISO8859-1', + 'english_uk': 'en_GB.ISO8859-1', + 'english_united-states': 'en_US.ISO8859-1', + 'english_us': 'en_US.ISO8859-1', + 'es': 'es_ES.ISO8859-1', + 'es_ar': 'es_AR.ISO8859-1', + 'es_bo': 'es_BO.ISO8859-1', + 'es_cl': 'es_CL.ISO8859-1', + 'es_co': 'es_CO.ISO8859-1', + 'es_cr': 'es_CR.ISO8859-1', + 'es_ec': 'es_EC.ISO8859-1', + 'es_es': 'es_ES.ISO8859-1', + 'es_gt': 'es_GT.ISO8859-1', + 'es_mx': 'es_MX.ISO8859-1', + 'es_ni': 'es_NI.ISO8859-1', + 'es_pa': 'es_PA.ISO8859-1', + 'es_pe': 'es_PE.ISO8859-1', + 'es_py': 'es_PY.ISO8859-1', + 'es_sv': 'es_SV.ISO8859-1', + 'es_uy': 'es_UY.ISO8859-1', + 'es_ve': 'es_VE.ISO8859-1', + 'et': 'et_EE.ISO8859-4', + 'et_ee': 'et_EE.ISO8859-4', + 'fi': 'fi_FI.ISO8859-1', + 'fi_fi': 'fi_FI.ISO8859-1', + 'finnish': 'fi_FI.ISO8859-1', + 'fr': 'fr_FR.ISO8859-1', + 'fr_be': 'fr_BE.ISO8859-1', + 'fr_ca': 'fr_CA.ISO8859-1', + 'fr_ch': 'fr_CH.ISO8859-1', + 'fr_fr': 'fr_FR.ISO8859-1', + 'fre_fr': 'fr_FR.ISO8859-1', + 'french': 'fr_FR.ISO8859-1', + 'french_france': 'fr_FR.ISO8859-1', + 'ger_de': 'de_DE.ISO8859-1', + 'german': 'de_DE.ISO8859-1', + 'german_germany': 'de_DE.ISO8859-1', + 'greek': 'el_GR.ISO8859-7', + 'hebrew': 'iw_IL.ISO8859-8', + 'hr': 'hr_HR.ISO8859-2', + 'hr_hr': 'hr_HR.ISO8859-2', + 'hu': 'hu_HU.ISO8859-2', + 'hu_hu': 'hu_HU.ISO8859-2', + 'hungarian': 'hu_HU.ISO8859-2', + 'icelandic': 'is_IS.ISO8859-1', + 'id': 'id_ID.ISO8859-1', + 'id_id': 'id_ID.ISO8859-1', + 'is': 'is_IS.ISO8859-1', + 'is_is': 'is_IS.ISO8859-1', + 'iso-8859-1': 'en_US.ISO8859-1', + 'iso-8859-15': 'en_US.ISO8859-15', + 'iso8859-1': 'en_US.ISO8859-1', + 'iso8859-15': 'en_US.ISO8859-15', + 'iso_8859_1': 'en_US.ISO8859-1', + 'iso_8859_15': 'en_US.ISO8859-15', + 'it': 'it_IT.ISO8859-1', + 'it_ch': 'it_CH.ISO8859-1', + 'it_it': 'it_IT.ISO8859-1', + 'italian': 'it_IT.ISO8859-1', + 'iw': 'iw_IL.ISO8859-8', + 'iw_il': 'iw_IL.ISO8859-8', + 'ja': 'ja_JP.eucJP', + 'ja.jis': 'ja_JP.JIS7', + 'ja.sjis': 'ja_JP.SJIS', + 'ja_jp': 'ja_JP.eucJP', + 'ja_jp.ajec': 'ja_JP.eucJP', + 'ja_jp.euc': 'ja_JP.eucJP', + 'ja_jp.eucjp': 'ja_JP.eucJP', + 'ja_jp.iso-2022-jp': 'ja_JP.JIS7', + 'ja_jp.jis': 'ja_JP.JIS7', + 'ja_jp.jis7': 'ja_JP.JIS7', + 'ja_jp.mscode': 'ja_JP.SJIS', + 'ja_jp.sjis': 'ja_JP.SJIS', + 'ja_jp.ujis': 'ja_JP.eucJP', + 'japan': 'ja_JP.eucJP', + 'japanese': 'ja_JP.SJIS', + 'japanese-euc': 'ja_JP.eucJP', + 'japanese.euc': 'ja_JP.eucJP', + 'jp_jp': 'ja_JP.eucJP', + 'ko': 'ko_KR.eucKR', + 'ko_kr': 'ko_KR.eucKR', + 'ko_kr.euc': 'ko_KR.eucKR', + 'korean': 'ko_KR.eucKR', + 'lt': 'lt_LT.ISO8859-4', + 'lv': 'lv_LV.ISO8859-4', + 'mk': 'mk_MK.ISO8859-5', + 'mk_mk': 'mk_MK.ISO8859-5', + 'nl': 'nl_NL.ISO8859-1', + 'nl_be': 'nl_BE.ISO8859-1', + 'nl_nl': 'nl_NL.ISO8859-1', + 'no': 'no_NO.ISO8859-1', + 'no_no': 'no_NO.ISO8859-1', + 'norwegian': 'no_NO.ISO8859-1', + 'pl': 'pl_PL.ISO8859-2', + 'pl_pl': 'pl_PL.ISO8859-2', + 'polish': 'pl_PL.ISO8859-2', + 'portuguese': 'pt_PT.ISO8859-1', + 'portuguese_brazil': 'pt_BR.ISO8859-1', + 'posix': 'C', + 'posix-utf2': 'C', + 'pt': 'pt_PT.ISO8859-1', + 'pt_br': 'pt_BR.ISO8859-1', + 'pt_pt': 'pt_PT.ISO8859-1', + 'ro': 'ro_RO.ISO8859-2', + 'ro_ro': 'ro_RO.ISO8859-2', + 'ru': 'ru_RU.ISO8859-5', + 'ru_ru': 'ru_RU.ISO8859-5', + 'rumanian': 'ro_RO.ISO8859-2', + 'russian': 'ru_RU.ISO8859-5', + 'serbocroatian': 'sh_YU.ISO8859-2', + 'sh': 'sh_YU.ISO8859-2', + 'sh_hr': 'sh_HR.ISO8859-2', + 'sh_sp': 'sh_YU.ISO8859-2', + 'sh_yu': 'sh_YU.ISO8859-2', + 'sk': 'sk_SK.ISO8859-2', + 'sk_sk': 'sk_SK.ISO8859-2', + 'sl': 'sl_CS.ISO8859-2', + 'sl_cs': 'sl_CS.ISO8859-2', + 'sl_si': 'sl_SI.ISO8859-2', + 'slovak': 'sk_SK.ISO8859-2', + 'slovene': 'sl_CS.ISO8859-2', + 'sp': 'sp_YU.ISO8859-5', + 'sp_yu': 'sp_YU.ISO8859-5', + 'spanish': 'es_ES.ISO8859-1', + 'spanish_spain': 'es_ES.ISO8859-1', + 'sr_sp': 'sr_SP.ISO8859-2', + 'sv': 'sv_SE.ISO8859-1', + 'sv_se': 'sv_SE.ISO8859-1', + 'swedish': 'sv_SE.ISO8859-1', + 'th_th': 'th_TH.TACTIS', + 'tr': 'tr_TR.ISO8859-9', + 'tr_tr': 'tr_TR.ISO8859-9', + 'turkish': 'tr_TR.ISO8859-9', + 'univ': 'en_US.utf', + 'universal': 'en_US.utf', + 'zh': 'zh_CN.eucCN', + 'zh_cn': 'zh_CN.eucCN', + 'zh_cn.big5': 'zh_TW.eucTW', + 'zh_cn.euc': 'zh_CN.eucCN', + 'zh_tw': 'zh_TW.eucTW', + 'zh_tw.euc': 'zh_TW.eucTW', +} + +# +# this maps windows language identifiers (as used on Windows 95 and +# earlier) to locale strings. +# +# NOTE: this mapping is incomplete. If your language is missing, send +# a note with the missing language identifier and the suggested locale +# code to Fredrik Lundh . Thanks /F + +windows_locale = { + 0x0404: "zh_TW", # Chinese (Taiwan) + 0x0804: "zh_CN", # Chinese (PRC) + 0x0406: "da_DK", # Danish + 0x0413: "nl_NL", # Dutch (Netherlands) + 0x0409: "en_US", # English (United States) + 0x0809: "en_UK", # English (United Kingdom) + 0x0c09: "en_AU", # English (Australian) + 0x1009: "en_CA", # English (Canadian) + 0x1409: "en_NZ", # English (New Zealand) + 0x1809: "en_IE", # English (Ireland) + 0x1c09: "en_ZA", # English (South Africa) + 0x040b: "fi_FI", # Finnish + 0x040c: "fr_FR", # French (Standard) + 0x080c: "fr_BE", # French (Belgian) + 0x0c0c: "fr_CA", # French (Canadian) + 0x100c: "fr_CH", # French (Switzerland) + 0x0407: "de_DE", # German (Standard) + 0x0408: "el_GR", # Greek + 0x040d: "iw_IL", # Hebrew + 0x040f: "is_IS", # Icelandic + 0x0410: "it_IT", # Italian (Standard) + 0x0411: "ja_JA", # Japanese + 0x0414: "no_NO", # Norwegian (Bokmal) + 0x0816: "pt_PT", # Portuguese (Standard) + 0x0c0a: "es_ES", # Spanish (Modern Sort) + 0x0441: "sw_KE", # Swahili (Kenya) + 0x041d: "sv_SE", # Swedish + 0x081d: "sv_FI", # Swedish (Finland) + 0x041f: "tr_TR", # Turkish +} + +def _print_locale(): + + """ Test function. + """ + categories = {} + def _init_categories(categories=categories): + for k,v in globals().items(): + if k[:3] == 'LC_': + categories[k] = v + _init_categories() + del categories['LC_ALL'] + + print 'Locale defaults as determined by getdefaultlocale():' + print '-'*72 + lang, enc = getdefaultlocale() + print 'Language: ', lang or '(undefined)' + print 'Encoding: ', enc or '(undefined)' + print + + print 'Locale settings on startup:' + print '-'*72 + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + + print + print 'Locale settings after calling resetlocale():' + print '-'*72 + resetlocale() + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + + try: + setlocale(LC_ALL, "") + except: + print 'NOTE:' + print 'setlocale(LC_ALL, "") does not support the default locale' + print 'given in the OS environment variables.' + else: + print + print 'Locale settings after calling setlocale(LC_ALL, ""):' + print '-'*72 + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + +### + +try: + LC_MESSAGES +except: + pass +else: + __all__.append("LC_MESSAGES") + +if __name__=='__main__': + print 'Locale aliasing:' + print + _print_locale() + print + print 'Number formatting:' + print + _test() diff --git a/lib-python/2.2/macpath.py b/lib-python/2.2/macpath.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/macpath.py @@ -0,0 +1,242 @@ +"""Pathname and path-related operations for the Macintosh.""" + +import os +from stat import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","islink","exists","isdir","isfile", + "walk","expanduser","expandvars","normpath","abspath", + "realpath"] + +# Normalize the case of a pathname. Dummy in Posix, but .lower() here. + +def normcase(path): + return path.lower() + + +def isabs(s): + """Return true if a path is absolute. + On the Mac, relative paths begin with a colon, + but as a special case, paths with no colons at all are also relative. + Anything else is absolute (the string up to the first colon is the + volume name).""" + + return ':' in s and s[0] != ':' + + +def join(s, *p): + path = s + for t in p: + if (not s) or isabs(t): + path = t + continue + if t[:1] == ':': + t = t[1:] + if ':' not in path: + path = ':' + path + if path[-1:] != ':': + path = path + ':' + path = path + t + return path + + +def split(s): + """Split a pathname into two parts: the directory leading up to the final + bit, and the basename (the filename, without colons, in that directory). + The result (s, t) is such that join(s, t) yields the original argument.""" + + if ':' not in s: return '', s + colon = 0 + for i in range(len(s)): + if s[i] == ':': colon = i + 1 + path, file = s[:colon-1], s[colon:] + if path and not ':' in path: + path = path + ':' + return path, file + + +def splitext(p): + """Split a path into root and extension. + The extension is everything starting at the last dot in the last + pathname component; the root is everything before that. + It is always true that root + ext == p.""" + + root, ext = '', '' + for c in p: + if c == ':': + root, ext = root + ext + c, '' + elif c == '.': + if ext: + root, ext = root + ext, c + else: + ext = c + elif ext: + ext = ext + c + else: + root = root + c + return root, ext + + +def splitdrive(p): + """Split a pathname into a drive specification and the rest of the + path. Useful on DOS/Windows/NT; on the Mac, the drive is always + empty (don't use the volume name -- it doesn't have the same + syntactic and semantic oddities as DOS drive letters, such as there + being a separate current directory per drive).""" + + return '', p + + +# Short interfaces to split() + +def dirname(s): return split(s)[0] +def basename(s): return split(s)[1] + +def ismount(s): + if not isabs(s): + return False + components = split(s) + return len(components) == 2 and components[1] == '' + +def isdir(s): + """Return true if the pathname refers to an existing directory.""" + + try: + st = os.stat(s) + except os.error: + return 0 + return S_ISDIR(st[ST_MODE]) + + +# Get size, mtime, atime of files. + +def getsize(filename): + """Return the size of a file, reported by os.stat().""" + st = os.stat(filename) + return st[ST_SIZE] + +def getmtime(filename): + """Return the last modification time of a file, reported by os.stat().""" + st = os.stat(filename) + return st[ST_MTIME] + +def getatime(filename): + """Return the last access time of a file, reported by os.stat().""" + st = os.stat(filename) + return st[ST_ATIME] + + +def islink(s): + """Return true if the pathname refers to a symbolic link. + Always false on the Mac, until we understand Aliases.)""" + + return 0 + + +def isfile(s): + """Return true if the pathname refers to an existing regular file.""" + + try: + st = os.stat(s) + except os.error: + return 0 + return S_ISREG(st[ST_MODE]) + + +def exists(s): + """Return true if the pathname refers to an existing file or directory.""" + + try: + st = os.stat(s) + except os.error: + return 0 + return 1 + +# Return the longest prefix of all list elements. + +def commonprefix(m): + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' + prefix = m[0] + for item in m: + for i in range(len(prefix)): + if prefix[:i+1] != item[:i+1]: + prefix = prefix[:i] + if i == 0: return '' + break + return prefix + +def expandvars(path): + """Dummy to retain interface-compatibility with other operating systems.""" + return path + + +def expanduser(path): + """Dummy to retain interface-compatibility with other operating systems.""" + return path + +norm_error = 'macpath.norm_error: path cannot be normalized' + +def normpath(s): + """Normalize a pathname. Will return the same result for + equivalent paths.""" + + if ":" not in s: + return ":"+s + + comps = s.split(":") + i = 1 + while i < len(comps)-1: + if comps[i] == "" and comps[i-1] != "": + if i > 1: + del comps[i-1:i+1] + i = i - 1 + else: + # best way to handle this is to raise an exception + raise norm_error, 'Cannot use :: immediately after volume name' + else: + i = i + 1 + + s = ":".join(comps) + + # remove trailing ":" except for ":" and "Volume:" + if s[-1] == ":" and len(comps) > 2 and s != ":"*len(s): + s = s[:-1] + return s + + +def walk(top, func, arg): + """Directory tree walk with callback function. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), call func(arg, dirname, fnames). + dirname is the name of the directory, and fnames a list of the names of + the files and subdirectories in dirname (excluding '.' and '..'). func + may modify the fnames list in-place (e.g. via del or slice assignment), + and walk will only recurse into the subdirectories whose names remain in + fnames; this can be used to implement a filter, or to impose a specific + order of visiting. No semantics are defined for, or required of, arg, + beyond that arg is always passed to func. It can be used, e.g., to pass + a filename pattern, or a mutable object designed to accumulate + statistics. Passing None for arg is common.""" + + try: + names = os.listdir(top) + except os.error: + return + func(arg, top, names) + for name in names: + name = join(top, name) + if isdir(name): + walk(name, func, arg) + + +def abspath(path): + """Return an absolute path.""" + if not isabs(path): + path = join(os.getcwd(), path) + return normpath(path) + +# realpath is a no-op on systems without islink support +realpath = abspath diff --git a/lib-python/2.2/macurl2path.py b/lib-python/2.2/macurl2path.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/macurl2path.py @@ -0,0 +1,95 @@ +"""Macintosh-specific module for conversion between pathnames and URLs. + +Do not import directly; use urllib instead.""" + +import urllib +import os + +__all__ = ["url2pathname","pathname2url"] + +def url2pathname(pathname): + "Convert /-delimited pathname to mac pathname" + # + # XXXX The .. handling should be fixed... + # + tp = urllib.splittype(pathname)[0] + if tp and tp != 'file': + raise RuntimeError, 'Cannot convert non-local URL to pathname' + # Turn starting /// into /, an empty hostname means current host + if pathname[:3] == '///': + pathname = pathname[2:] + elif pathname[:2] == '//': + raise RuntimeError, 'Cannot convert non-local URL to pathname' + components = pathname.split('/') + # Remove . and embedded .. + i = 0 + while i < len(components): + if components[i] == '.': + del components[i] + elif components[i] == '..' and i > 0 and \ + components[i-1] not in ('', '..'): + del components[i-1:i+1] + i = i-1 + elif components[i] == '' and i > 0 and components[i-1] != '': + del components[i] + else: + i = i+1 + if not components[0]: + # Absolute unix path, don't start with colon + rv = ':'.join(components[1:]) + else: + # relative unix path, start with colon. First replace + # leading .. by empty strings (giving ::file) + i = 0 + while i < len(components) and components[i] == '..': + components[i] = '' + i = i + 1 + rv = ':' + ':'.join(components) + # and finally unquote slashes and other funny characters + return urllib.unquote(rv) + +def pathname2url(pathname): + "convert mac pathname to /-delimited pathname" + if '/' in pathname: + raise RuntimeError, "Cannot convert pathname containing slashes" + components = pathname.split(':') + # Remove empty first and/or last component + if components[0] == '': + del components[0] + if components[-1] == '': + del components[-1] + # Replace empty string ('::') by .. (will result in '/../' later) + for i in range(len(components)): + if components[i] == '': + components[i] = '..' + # Truncate names longer than 31 bytes + components = map(_pncomp2url, components) + + if os.path.isabs(pathname): + return '/' + '/'.join(components) + else: + return '/'.join(components) + +def _pncomp2url(component): + component = urllib.quote(component[:31], safe='') # We want to quote slashes + return component + +def test(): + for url in ["index.html", + "bar/index.html", + "/foo/bar/index.html", + "/foo/bar/", + "/"]: + print `url`, '->', `url2pathname(url)` + for path in ["drive:", + "drive:dir:", + "drive:dir:file", + "drive:file", + "file", + ":file", + ":dir:", + ":dir:file"]: + print `path`, '->', `pathname2url(path)` + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/mailbox.py b/lib-python/2.2/mailbox.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/mailbox.py @@ -0,0 +1,313 @@ +#! /usr/bin/env python + +"""Classes to handle Unix style, MMDF style, and MH style mailboxes.""" + + +import rfc822 +import os + +__all__ = ["UnixMailbox","MmdfMailbox","MHMailbox","Maildir","BabylMailbox", + "PortableUnixMailbox"] + +class _Mailbox: + def __init__(self, fp, factory=rfc822.Message): + self.fp = fp + self.seekp = 0 + self.factory = factory + + def __iter__(self): + return iter(self.next, None) + + def next(self): + while 1: + self.fp.seek(self.seekp) + try: + self._search_start() + except EOFError: + self.seekp = self.fp.tell() + return None + start = self.fp.tell() + self._search_end() + self.seekp = stop = self.fp.tell() + if start != stop: + break + return self.factory(_Subfile(self.fp, start, stop)) + + +class _Subfile: + def __init__(self, fp, start, stop): + self.fp = fp + self.start = start + self.stop = stop + self.pos = self.start + + def read(self, length = None): + if self.pos >= self.stop: + return '' + remaining = self.stop - self.pos + if length is None or length < 0: + length = remaining + elif length > remaining: + length = remaining + self.fp.seek(self.pos) + data = self.fp.read(length) + self.pos = self.fp.tell() + return data + + def readline(self, length = None): + if self.pos >= self.stop: + return '' + if length is None: + length = self.stop - self.pos + self.fp.seek(self.pos) + data = self.fp.readline(length) + self.pos = self.fp.tell() + return data + + def readlines(self, sizehint = -1): + lines = [] + while 1: + line = self.readline() + if not line: + break + lines.append(line) + if sizehint >= 0: + sizehint = sizehint - len(line) + if sizehint <= 0: + break + return lines + + def tell(self): + return self.pos - self.start + + def seek(self, pos, whence=0): + if whence == 0: + self.pos = self.start + pos + elif whence == 1: + self.pos = self.pos + pos + elif whence == 2: + self.pos = self.stop + pos + + def close(self): + del self.fp + + +# Recommended to use PortableUnixMailbox instead! +class UnixMailbox(_Mailbox): + def _search_start(self): + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + raise EOFError + if line[:5] == 'From ' and self._isrealfromline(line): + self.fp.seek(pos) + return + + def _search_end(self): + self.fp.readline() # Throw away header line + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + return + if line[:5] == 'From ' and self._isrealfromline(line): + self.fp.seek(pos) + return + + # An overridable mechanism to test for From-line-ness. You can either + # specify a different regular expression or define a whole new + # _isrealfromline() method. Note that this only gets called for lines + # starting with the 5 characters "From ". + # + # BAW: According to + #http://home.netscape.com/eng/mozilla/2.0/relnotes/demo/content-length.html + # the only portable, reliable way to find message delimiters in a BSD (i.e + # Unix mailbox) style folder is to search for "\n\nFrom .*\n", or at the + # beginning of the file, "^From .*\n". While _fromlinepattern below seems + # like a good idea, in practice, there are too many variations for more + # strict parsing of the line to be completely accurate. + # + # _strict_isrealfromline() is the old version which tries to do stricter + # parsing of the From_ line. _portable_isrealfromline() simply returns + # true, since it's never called if the line doesn't already start with + # "From ". + # + # This algorithm, and the way it interacts with _search_start() and + # _search_end() may not be completely correct, because it doesn't check + # that the two characters preceding "From " are \n\n or the beginning of + # the file. Fixing this would require a more extensive rewrite than is + # necessary. For convenience, we've added a StrictUnixMailbox class which + # uses the older, more strict _fromlinepattern regular expression. + + _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \ + r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$" + _regexp = None + + def _strict_isrealfromline(self, line): + if not self._regexp: + import re + self._regexp = re.compile(self._fromlinepattern) + return self._regexp.match(line) + + def _portable_isrealfromline(self, line): + return 1 + + _isrealfromline = _strict_isrealfromline + + +class PortableUnixMailbox(UnixMailbox): + _isrealfromline = UnixMailbox._portable_isrealfromline + + +class MmdfMailbox(_Mailbox): + def _search_start(self): + while 1: + line = self.fp.readline() + if not line: + raise EOFError + if line[:5] == '\001\001\001\001\n': + return + + def _search_end(self): + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + return + if line == '\001\001\001\001\n': + self.fp.seek(pos) + return + + +class MHMailbox: + def __init__(self, dirname, factory=rfc822.Message): + import re + pat = re.compile('^[1-9][0-9]*$') + self.dirname = dirname + # the three following lines could be combined into: + # list = map(long, filter(pat.match, os.listdir(self.dirname))) + list = os.listdir(self.dirname) + list = filter(pat.match, list) + list = map(long, list) + list.sort() + # This only works in Python 1.6 or later; + # before that str() added 'L': + self.boxes = map(str, list) + self.factory = factory + + def __iter__(self): + return iter(self.next, None) + + def next(self): + if not self.boxes: + return None + fn = self.boxes[0] + del self.boxes[0] + fp = open(os.path.join(self.dirname, fn)) + return self.factory(fp) + + +class Maildir: + # Qmail directory mailbox + + def __init__(self, dirname, factory=rfc822.Message): + self.dirname = dirname + self.factory = factory + + # check for new mail + newdir = os.path.join(self.dirname, 'new') + boxes = [os.path.join(newdir, f) + for f in os.listdir(newdir) if f[0] != '.'] + + # Now check for current mail in this maildir + curdir = os.path.join(self.dirname, 'cur') + boxes += [os.path.join(curdir, f) + for f in os.listdir(curdir) if f[0] != '.'] + + self.boxes = boxes + + def __iter__(self): + return iter(self.next, None) + + def next(self): + if not self.boxes: + return None + fn = self.boxes[0] + del self.boxes[0] + fp = open(fn) + return self.factory(fp) + + +class BabylMailbox(_Mailbox): + def _search_start(self): + while 1: + line = self.fp.readline() + if not line: + raise EOFError + if line == '*** EOOH ***\n': + return + + def _search_end(self): + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + return + if line == '\037\014\n': + self.fp.seek(pos) + return + + +def _test(): + import sys + + args = sys.argv[1:] + if not args: + for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER': + if os.environ.has_key(key): + mbox = os.environ[key] + break + else: + print "$MAIL, $LOGNAME nor $USER set -- who are you?" + return + else: + mbox = args[0] + if mbox[:1] == '+': + mbox = os.environ['HOME'] + '/Mail/' + mbox[1:] + elif not '/' in mbox: + mbox = '/usr/mail/' + mbox + if os.path.isdir(mbox): + if os.path.isdir(os.path.join(mbox, 'cur')): + mb = Maildir(mbox) + else: + mb = MHMailbox(mbox) + else: + fp = open(mbox, 'r') + mb = PortableUnixMailbox(fp) + + msgs = [] + while 1: + msg = mb.next() + if msg is None: + break + msgs.append(msg) + if len(args) <= 1: + msg.fp = None + if len(args) > 1: + num = int(args[1]) + print 'Message %d body:'%num + msg = msgs[num-1] + msg.rewindbody() + sys.stdout.write(msg.fp.read()) + else: + print 'Mailbox',mbox,'has',len(msgs),'messages:' + for msg in msgs: + f = msg.getheader('from') or "" + s = msg.getheader('subject') or "" + d = msg.getheader('date') or "" + print '-%20.20s %20.20s %-30.30s'%(f, d[5:], s) + + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/mailcap.py b/lib-python/2.2/mailcap.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/mailcap.py @@ -0,0 +1,255 @@ +"""Mailcap file handling. See RFC 1524.""" + +import os + +__all__ = ["getcaps","findmatch"] + +# Part 1: top-level interface. + +def getcaps(): + """Return a dictionary containing the mailcap database. + + The dictionary maps a MIME type (in all lowercase, e.g. 'text/plain') + to a list of dictionaries corresponding to mailcap entries. The list + collects all the entries for that MIME type from all available mailcap + files. Each dictionary contains key-value pairs for that MIME type, + where the viewing command is stored with the key "view". + + """ + caps = {} + for mailcap in listmailcapfiles(): + try: + fp = open(mailcap, 'r') + except IOError: + continue + morecaps = readmailcapfile(fp) + fp.close() + for key in morecaps.keys(): + if not caps.has_key(key): + caps[key] = morecaps[key] + else: + caps[key] = caps[key] + morecaps[key] + return caps + +def listmailcapfiles(): + """Return a list of all mailcap files found on the system.""" + # XXX Actually, this is Unix-specific + if os.environ.has_key('MAILCAPS'): + str = os.environ['MAILCAPS'] + mailcaps = str.split(':') + else: + if os.environ.has_key('HOME'): + home = os.environ['HOME'] + else: + # Don't bother with getpwuid() + home = '.' # Last resort + mailcaps = [home + '/.mailcap', '/etc/mailcap', + '/usr/etc/mailcap', '/usr/local/etc/mailcap'] + return mailcaps + + +# Part 2: the parser. + +def readmailcapfile(fp): + """Read a mailcap file and return a dictionary keyed by MIME type. + + Each MIME type is mapped to an entry consisting of a list of + dictionaries; the list will contain more than one such dictionary + if a given MIME type appears more than once in the mailcap file. + Each dictionary contains key-value pairs for that MIME type, where + the viewing command is stored with the key "view". + """ + caps = {} + while 1: + line = fp.readline() + if not line: break + # Ignore comments and blank lines + if line[0] == '#' or line.strip() == '': + continue + nextline = line + # Join continuation lines + while nextline[-2:] == '\\\n': + nextline = fp.readline() + if not nextline: nextline = '\n' + line = line[:-2] + nextline + # Parse the line + key, fields = parseline(line) + if not (key and fields): + continue + # Normalize the key + types = key.split('/') + for j in range(len(types)): + types[j] = types[j].strip() + key = '/'.join(types).lower() + # Update the database + if caps.has_key(key): + caps[key].append(fields) + else: + caps[key] = [fields] + return caps + +def parseline(line): + """Parse one entry in a mailcap file and return a dictionary. + + The viewing command is stored as the value with the key "view", + and the rest of the fields produce key-value pairs in the dict. + """ + fields = [] + i, n = 0, len(line) + while i < n: + field, i = parsefield(line, i, n) + fields.append(field) + i = i+1 # Skip semicolon + if len(fields) < 2: + return None, None + key, view, rest = fields[0], fields[1], fields[2:] + fields = {'view': view} + for field in rest: + i = field.find('=') + if i < 0: + fkey = field + fvalue = "" + else: + fkey = field[:i].strip() + fvalue = field[i+1:].strip() + if fields.has_key(fkey): + # Ignore it + pass + else: + fields[fkey] = fvalue + return key, fields + +def parsefield(line, i, n): + """Separate one key-value pair in a mailcap entry.""" + start = i + while i < n: + c = line[i] + if c == ';': + break + elif c == '\\': + i = i+2 + else: + i = i+1 + return line[start:i].strip(), i + + +# Part 3: using the database. + +def findmatch(caps, MIMEtype, key='view', filename="/dev/null", plist=[]): + """Find a match for a mailcap entry. + + Return a tuple containing the command line, and the mailcap entry + used; (None, None) if no match is found. This may invoke the + 'test' command of several matching entries before deciding which + entry to use. + + """ + entries = lookup(caps, MIMEtype, key) + # XXX This code should somehow check for the needsterminal flag. + for e in entries: + if e.has_key('test'): + test = subst(e['test'], filename, plist) + if test and os.system(test) != 0: + continue + command = subst(e[key], MIMEtype, filename, plist) + return command, e + return None, None + +def lookup(caps, MIMEtype, key=None): + entries = [] + if caps.has_key(MIMEtype): + entries = entries + caps[MIMEtype] + MIMEtypes = MIMEtype.split('/') + MIMEtype = MIMEtypes[0] + '/*' + if caps.has_key(MIMEtype): + entries = entries + caps[MIMEtype] + if key is not None: + entries = filter(lambda e, key=key: e.has_key(key), entries) + return entries + +def subst(field, MIMEtype, filename, plist=[]): + # XXX Actually, this is Unix-specific + res = '' + i, n = 0, len(field) + while i < n: + c = field[i]; i = i+1 + if c != '%': + if c == '\\': + c = field[i:i+1]; i = i+1 + res = res + c + else: + c = field[i]; i = i+1 + if c == '%': + res = res + c + elif c == 's': + res = res + filename + elif c == 't': + res = res + MIMEtype + elif c == '{': + start = i + while i < n and field[i] != '}': + i = i+1 + name = field[start:i] + i = i+1 + res = res + findparam(name, plist) + # XXX To do: + # %n == number of parts if type is multipart/* + # %F == list of alternating type and filename for parts + else: + res = res + '%' + c + return res + +def findparam(name, plist): + name = name.lower() + '=' + n = len(name) + for p in plist: + if p[:n].lower() == name: + return p[n:] + return '' + + +# Part 4: test program. + +def test(): + import sys + caps = getcaps() + if not sys.argv[1:]: + show(caps) + return + for i in range(1, len(sys.argv), 2): + args = sys.argv[i:i+2] + if len(args) < 2: + print "usage: mailcap [MIMEtype file] ..." + return + MIMEtype = args[0] + file = args[1] + command, e = findmatch(caps, MIMEtype, 'view', file) + if not command: + print "No viewer found for", type + else: + print "Executing:", command + sts = os.system(command) + if sts: + print "Exit status:", sts + +def show(caps): + print "Mailcap files:" + for fn in listmailcapfiles(): print "\t" + fn + print + if not caps: caps = getcaps() + print "Mailcap entries:" + print + ckeys = caps.keys() + ckeys.sort() + for type in ckeys: + print type + entries = caps[type] + for e in entries: + keys = e.keys() + keys.sort() + for k in keys: + print " %-15s" % k, e[k] + print + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/markupbase.py b/lib-python/2.2/markupbase.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/markupbase.py @@ -0,0 +1,317 @@ +"""Shared support for scanning document type declarations in HTML and XHTML.""" + +import re +import string + +_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9]*\s*').match +_declstringlit_match = re.compile(r'(\'[^\']*\'|"[^"]*")\s*').match + +del re + + +class ParserBase: + """Parser base class which provides some common support methods used + by the SGML/HTML and XHTML parsers.""" + + def __init__(self): + if self.__class__ is ParserBase: + raise RuntimeError( + "markupbase.ParserBase must be subclassed") + + def error(self, message): + raise NotImplementedError( + "subclasses of ParserBase must override error()") + + def reset(self): + self.lineno = 1 + self.offset = 0 + + def getpos(self): + """Return current line number and offset.""" + return self.lineno, self.offset + + # Internal -- update line number and offset. This should be + # called for each piece of data exactly once, in order -- in other + # words the concatenation of all the input strings to this + # function should be exactly the entire input. + def updatepos(self, i, j): + if i >= j: + return j + rawdata = self.rawdata + nlines = string.count(rawdata, "\n", i, j) + if nlines: + self.lineno = self.lineno + nlines + pos = string.rindex(rawdata, "\n", i, j) # Should not fail + self.offset = j-(pos+1) + else: + self.offset = self.offset + j-i + return j + + _decl_otherchars = '' + + # Internal -- parse declaration (for use by subclasses). + def parse_declaration(self, i): + # This is some sort of declaration; in "HTML as + # deployed," this should only be the document type + # declaration (""). + rawdata = self.rawdata + j = i + 2 + assert rawdata[i:j] == "' + n = len(rawdata) + decltype, j = self._scan_name(j, i) + if j < 0: + return j + if decltype == "doctype": + self._decl_otherchars = '' + while j < n: + c = rawdata[j] + if c == ">": + # end of declaration syntax + data = rawdata[i+2:j] + if decltype == "doctype": + self.handle_decl(data) + else: + self.unknown_decl(data) + return j + 1 + if c in "\"'": + m = _declstringlit_match(rawdata, j) + if not m: + return -1 # incomplete + j = m.end() + elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ": + name, j = self._scan_name(j, i) + elif c in self._decl_otherchars: + j = j + 1 + elif c == "[": + if decltype == "doctype": + j = self._parse_doctype_subset(j + 1, i) + else: + self.error("unexpected '[' char in declaration") + else: + self.error( + "unexpected %s char in declaration" % `rawdata[j]`) + if j < 0: + return j + return -1 # incomplete + + # Internal -- scan past the internal subset in a n: + # end of buffer; incomplete + return -1 + if rawdata[j:j+4] == " +%s +''' % (title, contents) + + def heading(self, title, fgcol, bgcol, extras=''): + """Format a page heading.""" + return ''' + + +
 
+ 
%s
%s
+ ''' % (bgcol, fgcol, title, fgcol, extras or ' ') + + def section(self, title, fgcol, bgcol, contents, width=10, + prelude='', marginalia=None, gap='  '): + """Format a section with a heading.""" + if marginalia is None: + marginalia = '' + ' ' * width + '' + result = ''' + + + + ''' % (bgcol, fgcol, title) + if prelude: + result = result + ''' + + +''' % (bgcol, marginalia, prelude, gap) + else: + result = result + ''' +''' % (bgcol, marginalia, gap) + + return result + '\n
 
+%s
%s%s
%s
%s%s%s
' % contents + + def bigsection(self, title, *args): + """Format a section with a big heading.""" + title = '%s' % title + return apply(self.section, (title,) + args) + + def preformat(self, text): + """Format literal preformatted text.""" + text = self.escape(expandtabs(text)) + return replace(text, '\n\n', '\n \n', '\n\n', '\n \n', + ' ', ' ', '\n', '
\n') + + def multicolumn(self, list, format, cols=4): + """Format a list of items into a multi-column list.""" + result = '' + rows = (len(list)+cols-1)/cols + for col in range(cols): + result = result + '' % (100/cols) + for i in range(rows*col, rows*col+rows): + if i < len(list): + result = result + format(list[i]) + '
\n' + result = result + '' + return '%s
' % result + + def grey(self, text): return '%s' % text + + def namelink(self, name, *dicts): + """Make a link for an identifier, given name-to-URL mappings.""" + for dict in dicts: + if dict.has_key(name): + return '
%s' % (dict[name], name) + return name + + def classlink(self, object, modname): + """Make a link for a class.""" + name, module = object.__name__, sys.modules.get(object.__module__) + if hasattr(module, name) and getattr(module, name) is object: + return '%s' % ( + module.__name__, name, classname(object, modname)) + return classname(object, modname) + + def modulelink(self, object): + """Make a link for a module.""" + return '%s' % (object.__name__, object.__name__) + + def modpkglink(self, (name, path, ispackage, shadowed)): + """Make a link for a module or package to display in an index.""" + if shadowed: + return self.grey(name) + if path: + url = '%s.%s.html' % (path, name) + else: + url = '%s.html' % name + if ispackage: + text = '%s (package)' % name + else: + text = name + return '%s' % (url, text) + + def markup(self, text, escape=None, funcs={}, classes={}, methods={}): + """Mark up some plain text, given a context of symbols to look for. + Each context dictionary maps object names to anchor names.""" + escape = escape or self.escape + results = [] + here = 0 + pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + r'RFC[- ]?(\d+)|' + r'PEP[- ]?(\d+)|' + r'(self\.)?(\w+))') + while 1: + match = pattern.search(text, here) + if not match: break + start, end = match.span() + results.append(escape(text[here:start])) + + all, scheme, rfc, pep, selfdot, name = match.groups() + if scheme: + url = escape(all).replace('"', '"') + results.append('%s' % (url, url)) + elif rfc: + url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc) + results.append('%s' % (url, escape(all))) + elif pep: + url = 'http://www.python.org/peps/pep-%04d.html' % int(pep) + results.append('%s' % (url, escape(all))) + elif text[end:end+1] == '(': + results.append(self.namelink(name, methods, funcs, classes)) + elif selfdot: + results.append('self.%s' % name) + else: + results.append(self.namelink(name, classes)) + here = end + results.append(escape(text[here:])) + return join(results, '') + + # ---------------------------------------------- type-specific routines + + def formattree(self, tree, modname, parent=None): + """Produce HTML for a class tree as given by inspect.getclasstree().""" + result = '' + for entry in tree: + if type(entry) is type(()): + c, bases = entry + result = result + '

' + result = result + self.classlink(c, modname) + if bases and bases != (parent,): + parents = [] + for base in bases: + parents.append(self.classlink(base, modname)) + result = result + '(' + join(parents, ', ') + ')' + result = result + '\n
' + elif type(entry) is type([]): + result = result + '
\n%s
\n' % self.formattree( + entry, modname, c) + return '
\n%s
\n' % result + + def docmodule(self, object, name=None, mod=None, *ignored): + """Produce HTML documentation for a module object.""" + name = object.__name__ # ignore the passed-in name + parts = split(name, '.') + links = [] + for i in range(len(parts)-1): + links.append( + '%s' % + (join(parts[:i+1], '.'), parts[i])) + linkedname = join(links + parts[-1:], '.') + head = '%s' % linkedname + try: + path = inspect.getabsfile(object) + url = path + if sys.platform == 'win32': + import nturl2path + url = nturl2path.pathname2url(path) + filelink = '%s' % (url, path) + except TypeError: + filelink = '(built-in)' + info = [] + if hasattr(object, '__version__'): + version = str(object.__version__) + if version[:11] == '$' + 'Revision: ' and version[-1:] == '$': + version = strip(version[11:-1]) + info.append('version %s' % self.escape(version)) + if hasattr(object, '__date__'): + info.append(self.escape(str(object.__date__))) + if info: + head = head + ' (%s)' % join(info, ', ') + result = self.heading( + head, '#ffffff', '#7799ee', 'index
' + filelink) + + modules = inspect.getmembers(object, inspect.ismodule) + + classes, cdict = [], {} + for key, value in inspect.getmembers(object, inspect.isclass): + if (inspect.getmodule(value) or object) is object: + classes.append((key, value)) + cdict[key] = cdict[value] = '#' + key + for key, value in classes: + for base in value.__bases__: + key, modname = base.__name__, base.__module__ + module = sys.modules.get(modname) + if modname != name and module and hasattr(module, key): + if getattr(module, key) is base: + if not cdict.has_key(key): + cdict[key] = cdict[base] = modname + '.html#' + key + funcs, fdict = [], {} + for key, value in inspect.getmembers(object, inspect.isroutine): + if inspect.isbuiltin(value) or inspect.getmodule(value) is object: + funcs.append((key, value)) + fdict[key] = '#-' + key + if inspect.isfunction(value): fdict[value] = fdict[key] + data = [] + for key, value in inspect.getmembers(object, isdata): + if key not in ['__builtins__', '__doc__']: + data.append((key, value)) + + doc = self.markup(getdoc(object), self.preformat, fdict, cdict) + doc = doc and '%s' % doc + result = result + '

%s

\n' % doc + + if hasattr(object, '__path__'): + modpkgs = [] + modnames = [] + for file in os.listdir(object.__path__[0]): + path = os.path.join(object.__path__[0], file) + modname = inspect.getmodulename(file) + if modname and modname not in modnames: + modpkgs.append((modname, name, 0, 0)) + modnames.append(modname) + elif ispackage(path): + modpkgs.append((file, name, 1, 0)) + modpkgs.sort() + contents = self.multicolumn(modpkgs, self.modpkglink) + result = result + self.bigsection( + 'Package Contents', '#ffffff', '#aa55cc', contents) + elif modules: + contents = self.multicolumn( + modules, lambda (key, value), s=self: s.modulelink(value)) + result = result + self.bigsection( + 'Modules', '#fffff', '#aa55cc', contents) + + if classes: + classlist = map(lambda (key, value): value, classes) + contents = [ + self.formattree(inspect.getclasstree(classlist, 1), name)] + for key, value in classes: + contents.append(self.document(value, key, name, fdict, cdict)) + result = result + self.bigsection( + 'Classes', '#ffffff', '#ee77aa', join(contents)) + if funcs: + contents = [] + for key, value in funcs: + contents.append(self.document(value, key, name, fdict, cdict)) + result = result + self.bigsection( + 'Functions', '#ffffff', '#eeaa77', join(contents)) + if data: + contents = [] + for key, value in data: + contents.append(self.document(value, key)) + result = result + self.bigsection( + 'Data', '#ffffff', '#55aa55', join(contents, '
\n')) + if hasattr(object, '__author__'): + contents = self.markup(str(object.__author__), self.preformat) + result = result + self.bigsection( + 'Author', '#ffffff', '#7799ee', contents) + if hasattr(object, '__credits__'): + contents = self.markup(str(object.__credits__), self.preformat) + result = result + self.bigsection( + 'Credits', '#ffffff', '#7799ee', contents) + + return result + + def docclass(self, object, name=None, mod=None, funcs={}, classes={}, + *ignored): + """Produce HTML documentation for a class object.""" + realname = object.__name__ + name = name or realname + bases = object.__bases__ + + contents = [] + push = contents.append + + # Cute little class to pump out a horizontal rule between sections. + class HorizontalRule: + def __init__(self): + self.needone = 0 + def maybe(self): + if self.needone: + push('
\n') + self.needone = 1 + hr = HorizontalRule() + + # List the mro, if non-trivial. + mro = list(inspect.getmro(object)) + if len(mro) > 2: + hr.maybe() + push('
Method resolution order:
\n') + for base in mro: + push('
%s
\n' % self.classlink(base, + object.__module__)) + push('
\n') + + def spill(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + push(self.document(getattr(object, name), name, mod, + funcs, classes, mdict, object)) + push('\n') + return attrs + + def spillproperties(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + push('
%s
\n' % name) + if value.__doc__ is not None: + doc = self.markup(value.__doc__, self.preformat, + funcs, classes, mdict) + push('
%s
\n' % doc) + for attr, tag in [("fget", " getter"), + ("fset", " setter"), + ("fdel", " deleter")]: + func = getattr(value, attr) + if func is not None: + base = self.document(func, name + tag, mod, + funcs, classes, mdict, object) + push('
%s
\n' % base) + push('
\n') + return attrs + + def spilldata(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + base = self.docother(getattr(object, name), name, mod) + if callable(value): + doc = getattr(value, "__doc__", None) + else: + doc = None + if doc is None: + push('
%s
\n' % base) + else: + doc = self.markup(getdoc(value), self.preformat, + funcs, classes, mdict) + doc = '
%s' % doc + push('
%s%s
\n' % (base, doc)) + push('\n') + return attrs + + attrs = inspect.classify_class_attrs(object) + mdict = {} + for key, kind, homecls, value in attrs: + mdict[key] = anchor = '#' + name + '-' + key + value = getattr(object, key) + try: + # The value may not be hashable (e.g., a data attr with + # a dict or list value). + mdict[value] = anchor + except TypeError: + pass + + while attrs: + if mro: + thisclass = mro.pop(0) + else: + thisclass = attrs[0][2] + attrs, inherited = _split_list(attrs, lambda t: t[2] is thisclass) + + if thisclass is object: + tag = "defined here" + else: + tag = "inherited from %s" % self.classlink(thisclass, + object.__module__) + tag += ':
\n' + + # Sort attrs by name. + attrs.sort(lambda t1, t2: cmp(t1[0], t2[0])) + + # Pump out the attrs, segregated by kind. + attrs = spill("Methods %s" % tag, attrs, + lambda t: t[1] == 'method') + attrs = spill("Class methods %s" % tag, attrs, + lambda t: t[1] == 'class method') + attrs = spill("Static methods %s" % tag, attrs, + lambda t: t[1] == 'static method') + attrs = spillproperties("Properties %s" % tag, attrs, + lambda t: t[1] == 'property') + attrs = spilldata("Data and non-method functions %s" % tag, attrs, + lambda t: t[1] == 'data') + assert attrs == [] + attrs = inherited + + contents = ''.join(contents) + + if name == realname: + title = 'class %s' % ( + name, realname) + else: + title = '%s = class %s' % ( + name, name, realname) + if bases: + parents = [] + for base in bases: + parents.append(self.classlink(base, object.__module__)) + title = title + '(%s)' % join(parents, ', ') + doc = self.markup(getdoc(object), self.preformat, funcs, classes, mdict) + doc = doc and '%s
 
' % doc or ' ' + + return self.section(title, '#000000', '#ffc8d8', contents, 5, doc) + + def formatvalue(self, object): + """Format an argument default value as text.""" + return self.grey('=' + self.repr(object)) + + def docroutine(self, object, name=None, mod=None, + funcs={}, classes={}, methods={}, cl=None): + """Produce HTML documentation for a function or method object.""" + realname = object.__name__ + name = name or realname + anchor = (cl and cl.__name__ or '') + '-' + name + note = '' + skipdocs = 0 + if inspect.ismethod(object): + imclass = object.im_class + if cl: + if imclass is not cl: + note = ' from ' + self.classlink(imclass, mod) + else: + if object.im_self: + note = ' method of %s instance' % self.classlink( + object.im_self.__class__, mod) + else: + note = ' unbound %s method' % self.classlink(imclass,mod) + object = object.im_func + + if name == realname: + title = '%s' % (anchor, realname) + else: + if (cl and cl.__dict__.has_key(realname) and + cl.__dict__[realname] is object): + reallink = '%s' % ( + cl.__name__ + '-' + realname, realname) + skipdocs = 1 + else: + reallink = realname + title = '%s = %s' % ( + anchor, name, reallink) + if inspect.isfunction(object): + args, varargs, varkw, defaults = inspect.getargspec(object) + argspec = inspect.formatargspec( + args, varargs, varkw, defaults, formatvalue=self.formatvalue) + if realname == '': + title = '%s lambda ' % name + argspec = argspec[1:-1] # remove parentheses + else: + argspec = '(...)' + + decl = title + argspec + (note and self.grey( + '%s' % note)) + + if skipdocs: + return '
%s
\n' % decl + else: + doc = self.markup( + getdoc(object), self.preformat, funcs, classes, methods) + doc = doc and '
%s
' % doc + return '
%s
%s
\n' % (decl, doc) + + def docother(self, object, name=None, mod=None, *ignored): + """Produce HTML documentation for a data object.""" + lhs = name and '%s = ' % name or '' + return lhs + self.repr(object) + + def index(self, dir, shadowed=None): + """Generate an HTML index for a directory of modules.""" + modpkgs = [] + if shadowed is None: shadowed = {} + seen = {} + files = os.listdir(dir) + + def found(name, ispackage, + modpkgs=modpkgs, shadowed=shadowed, seen=seen): + if not seen.has_key(name): + modpkgs.append((name, '', ispackage, shadowed.has_key(name))) + seen[name] = 1 + shadowed[name] = 1 + + # Package spam/__init__.py takes precedence over module spam.py. + for file in files: + path = os.path.join(dir, file) + if ispackage(path): found(file, 1) + for file in files: + path = os.path.join(dir, file) + if os.path.isfile(path): + modname = inspect.getmodulename(file) + if modname: found(modname, 0) + + modpkgs.sort() + contents = self.multicolumn(modpkgs, self.modpkglink) + return self.bigsection(dir, '#ffffff', '#ee77aa', contents) + +# -------------------------------------------- text documentation generator + +class TextRepr(Repr): + """Class for safely making a text representation of a Python object.""" + def __init__(self): + Repr.__init__(self) + self.maxlist = self.maxtuple = 20 + self.maxdict = 10 + self.maxstring = self.maxother = 100 + + def repr1(self, x, level): + methodname = 'repr_' + join(split(type(x).__name__), '_') + if hasattr(self, methodname): + return getattr(self, methodname)(x, level) + else: + return cram(stripid(repr(x)), self.maxother) + + def repr_string(self, x, level): + test = cram(x, self.maxstring) + testrepr = repr(test) + if '\\' in test and '\\' not in replace(testrepr, r'\\', ''): + # Backslashes are only literal in the string and are never + # needed to make any special characters, so show a raw string. + return 'r' + testrepr[0] + test + testrepr[0] + return testrepr + + repr_str = repr_string + + def repr_instance(self, x, level): + try: + return cram(stripid(repr(x)), self.maxstring) + except: + return '<%s instance>' % x.__class__.__name__ + +class TextDoc(Doc): + """Formatter class for text documentation.""" + + # ------------------------------------------- text formatting utilities + + _repr_instance = TextRepr() + repr = _repr_instance.repr + + def bold(self, text): + """Format a string in bold by overstriking.""" + return join(map(lambda ch: ch + '\b' + ch, text), '') + + def indent(self, text, prefix=' '): + """Indent text by prepending a given prefix to each line.""" + if not text: return '' + lines = split(text, '\n') + lines = map(lambda line, prefix=prefix: prefix + line, lines) + if lines: lines[-1] = rstrip(lines[-1]) + return join(lines, '\n') + + def section(self, title, contents): + """Format a section with a given heading.""" + return self.bold(title) + '\n' + rstrip(self.indent(contents)) + '\n\n' + + # ---------------------------------------------- type-specific routines + + def formattree(self, tree, modname, parent=None, prefix=''): + """Render in text a class tree as returned by inspect.getclasstree().""" + result = '' + for entry in tree: + if type(entry) is type(()): + c, bases = entry + result = result + prefix + classname(c, modname) + if bases and bases != (parent,): + parents = map(lambda c, m=modname: classname(c, m), bases) + result = result + '(%s)' % join(parents, ', ') + result = result + '\n' + elif type(entry) is type([]): + result = result + self.formattree( + entry, modname, c, prefix + ' ') + return result + + def docmodule(self, object, name=None, mod=None): + """Produce text documentation for a given module object.""" + name = object.__name__ # ignore the passed-in name + synop, desc = splitdoc(getdoc(object)) + result = self.section('NAME', name + (synop and ' - ' + synop)) + + try: + file = inspect.getabsfile(object) + except TypeError: + file = '(built-in)' + result = result + self.section('FILE', file) + if desc: + result = result + self.section('DESCRIPTION', desc) + + classes = [] + for key, value in inspect.getmembers(object, inspect.isclass): + if (inspect.getmodule(value) or object) is object: + classes.append((key, value)) + funcs = [] + for key, value in inspect.getmembers(object, inspect.isroutine): + if inspect.isbuiltin(value) or inspect.getmodule(value) is object: + funcs.append((key, value)) + data = [] + for key, value in inspect.getmembers(object, isdata): + if key not in ['__builtins__', '__doc__']: + data.append((key, value)) + + if hasattr(object, '__path__'): + modpkgs = [] + for file in os.listdir(object.__path__[0]): + path = os.path.join(object.__path__[0], file) + modname = inspect.getmodulename(file) + if modname and modname not in modpkgs: + modpkgs.append(modname) + elif ispackage(path): + modpkgs.append(file + ' (package)') + modpkgs.sort() + result = result + self.section( + 'PACKAGE CONTENTS', join(modpkgs, '\n')) + + if classes: + classlist = map(lambda (key, value): value, classes) + contents = [self.formattree( + inspect.getclasstree(classlist, 1), name)] + for key, value in classes: + contents.append(self.document(value, key, name)) + result = result + self.section('CLASSES', join(contents, '\n')) + + if funcs: + contents = [] + for key, value in funcs: + contents.append(self.document(value, key, name)) + result = result + self.section('FUNCTIONS', join(contents, '\n')) + + if data: + contents = [] + for key, value in data: + contents.append(self.docother(value, key, name, 70)) + result = result + self.section('DATA', join(contents, '\n')) + + if hasattr(object, '__version__'): + version = str(object.__version__) + if version[:11] == '$' + 'Revision: ' and version[-1:] == '$': + version = strip(version[11:-1]) + result = result + self.section('VERSION', version) + if hasattr(object, '__date__'): + result = result + self.section('DATE', str(object.__date__)) + if hasattr(object, '__author__'): + result = result + self.section('AUTHOR', str(object.__author__)) + if hasattr(object, '__credits__'): + result = result + self.section('CREDITS', str(object.__credits__)) + return result + + def docclass(self, object, name=None, mod=None): + """Produce text documentation for a given class object.""" + realname = object.__name__ + name = name or realname + bases = object.__bases__ + + def makename(c, m=object.__module__): + return classname(c, m) + + if name == realname: + title = 'class ' + self.bold(realname) + else: + title = self.bold(name) + ' = class ' + realname + if bases: + parents = map(makename, bases) + title = title + '(%s)' % join(parents, ', ') + + doc = getdoc(object) + contents = doc and [doc + '\n'] or [] + push = contents.append + + # List the mro, if non-trivial. + mro = list(inspect.getmro(object)) + if len(mro) > 2: + push("Method resolution order:") + for base in mro: + push(' ' + makename(base)) + push('') + + # Cute little class to pump out a horizontal rule between sections. + class HorizontalRule: + def __init__(self): + self.needone = 0 + def maybe(self): + if self.needone: + push('-' * 70) + self.needone = 1 + hr = HorizontalRule() + + def spill(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + push(self.document(getattr(object, name), + name, mod, object)) + return attrs + + def spillproperties(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + push(name) + need_blank_after_doc = 0 + doc = getdoc(value) or '' + if doc: + push(self.indent(doc)) + need_blank_after_doc = 1 + for attr, tag in [("fget", " getter"), + ("fset", " setter"), + ("fdel", " deleter")]: + func = getattr(value, attr) + if func is not None: + if need_blank_after_doc: + push('') + need_blank_after_doc = 0 + base = self.docother(func, name + tag, mod, 70) + push(self.indent(base)) + push('') + return attrs + + def spilldata(msg, attrs, predicate): + ok, attrs = _split_list(attrs, predicate) + if ok: + hr.maybe() + push(msg) + for name, kind, homecls, value in ok: + if callable(value): + doc = getattr(value, "__doc__", None) + else: + doc = None + push(self.docother(getattr(object, name), + name, mod, 70, doc) + '\n') + return attrs + + attrs = inspect.classify_class_attrs(object) + while attrs: + if mro: + thisclass = mro.pop(0) + else: + thisclass = attrs[0][2] + attrs, inherited = _split_list(attrs, lambda t: t[2] is thisclass) + + if thisclass is object: + tag = "defined here" + else: + tag = "inherited from %s" % classname(thisclass, + object.__module__) + + # Sort attrs by name. + attrs.sort(lambda t1, t2: cmp(t1[0], t2[0])) + + # Pump out the attrs, segregated by kind. + attrs = spill("Methods %s:\n" % tag, attrs, + lambda t: t[1] == 'method') + attrs = spill("Class methods %s:\n" % tag, attrs, + lambda t: t[1] == 'class method') + attrs = spill("Static methods %s:\n" % tag, attrs, + lambda t: t[1] == 'static method') + attrs = spillproperties("Properties %s:\n" % tag, attrs, + lambda t: t[1] == 'property') + attrs = spilldata("Data and non-method functions %s:\n" % tag, + attrs, lambda t: t[1] == 'data') + assert attrs == [] + attrs = inherited + + contents = '\n'.join(contents) + if not contents: + return title + '\n' + return title + '\n' + self.indent(rstrip(contents), ' | ') + '\n' + + def formatvalue(self, object): + """Format an argument default value as text.""" + return '=' + self.repr(object) + + def docroutine(self, object, name=None, mod=None, cl=None): + """Produce text documentation for a function or method object.""" + realname = object.__name__ + name = name or realname + note = '' + skipdocs = 0 + if inspect.ismethod(object): + imclass = object.im_class + if cl: + if imclass is not cl: + note = ' from ' + classname(imclass, mod) + else: + if object.im_self: + note = ' method of %s instance' % classname( + object.im_self.__class__, mod) + else: + note = ' unbound %s method' % classname(imclass,mod) + object = object.im_func + + if name == realname: + title = self.bold(realname) + else: + if (cl and cl.__dict__.has_key(realname) and + cl.__dict__[realname] is object): + skipdocs = 1 + title = self.bold(name) + ' = ' + realname + if inspect.isfunction(object): + args, varargs, varkw, defaults = inspect.getargspec(object) + argspec = inspect.formatargspec( + args, varargs, varkw, defaults, formatvalue=self.formatvalue) + if realname == '': + title = 'lambda' + argspec = argspec[1:-1] # remove parentheses + else: + argspec = '(...)' + decl = title + argspec + note + + if skipdocs: + return decl + '\n' + else: + doc = getdoc(object) or '' + return decl + '\n' + (doc and rstrip(self.indent(doc)) + '\n') + + def docother(self, object, name=None, mod=None, maxlen=None, doc=None): + """Produce text documentation for a data object.""" + repr = self.repr(object) + if maxlen: + line = (name and name + ' = ' or '') + repr + chop = maxlen - len(line) + if chop < 0: repr = repr[:chop] + '...' + line = (name and self.bold(name) + ' = ' or '') + repr + if doc is not None: + line += '\n' + self.indent(str(doc)) + return line + +# --------------------------------------------------------- user interfaces + +def pager(text): + """The first time this is called, determine what kind of pager to use.""" + global pager + pager = getpager() + pager(text) + +def getpager(): + """Decide what method to use for paging through text.""" + if type(sys.stdout) is not types.FileType: + return plainpager + if not sys.stdin.isatty() or not sys.stdout.isatty(): + return plainpager + if os.environ.get('TERM') in ['dumb', 'emacs']: + return plainpager + if os.environ.has_key('PAGER'): + if sys.platform == 'win32': # pipes completely broken in Windows + return lambda text: tempfilepager(plain(text), os.environ['PAGER']) + elif os.environ.get('TERM') in ['dumb', 'emacs']: + return lambda text: pipepager(plain(text), os.environ['PAGER']) + else: + return lambda text: pipepager(text, os.environ['PAGER']) + if sys.platform == 'win32': + return lambda text: tempfilepager(plain(text), 'more <') + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return lambda text: pipepager(text, 'less') + + import tempfile + filename = tempfile.mktemp() + open(filename, 'w').close() + try: + if hasattr(os, 'system') and os.system('more %s' % filename) == 0: + return lambda text: pipepager(text, 'more') + else: + return ttypager + finally: + os.unlink(filename) + +def plain(text): + """Remove boldface formatting from text.""" + return re.sub('.\b', '', text) + +def pipepager(text, cmd): + """Page through text by feeding it to another program.""" + pipe = os.popen(cmd, 'w') + try: + pipe.write(text) + pipe.close() + except IOError: + pass # Ignore broken pipes caused by quitting the pager program. + +def tempfilepager(text, cmd): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + file = open(filename, 'w') + file.write(text) + file.close() + try: + os.system(cmd + ' ' + filename) + finally: + os.unlink(filename) + +def ttypager(text): + """Page through text on a text terminal.""" + lines = split(plain(text), '\n') + try: + import tty + fd = sys.stdin.fileno() + old = tty.tcgetattr(fd) + tty.setcbreak(fd) + getchar = lambda: sys.stdin.read(1) + except (ImportError, AttributeError): + tty = None + getchar = lambda: sys.stdin.readline()[:-1][:1] + + try: + r = inc = os.environ.get('LINES', 25) - 1 + sys.stdout.write(join(lines[:inc], '\n') + '\n') + while lines[r:]: + sys.stdout.write('-- more --') + sys.stdout.flush() + c = getchar() + + if c in ['q', 'Q']: + sys.stdout.write('\r \r') + break + elif c in ['\r', '\n']: + sys.stdout.write('\r \r' + lines[r] + '\n') + r = r + 1 + continue + if c in ['b', 'B', '\x1b']: + r = r - inc - inc + if r < 0: r = 0 + sys.stdout.write('\n' + join(lines[r:r+inc], '\n') + '\n') + r = r + inc + + finally: + if tty: + tty.tcsetattr(fd, tty.TCSAFLUSH, old) + +def plainpager(text): + """Simply print unformatted text. This is the ultimate fallback.""" + sys.stdout.write(plain(text)) + +def describe(thing): + """Produce a short description of the given thing.""" + if inspect.ismodule(thing): + if thing.__name__ in sys.builtin_module_names: + return 'built-in module ' + thing.__name__ + if hasattr(thing, '__path__'): + return 'package ' + thing.__name__ + else: + return 'module ' + thing.__name__ + if inspect.isbuiltin(thing): + return 'built-in function ' + thing.__name__ + if inspect.isclass(thing): + return 'class ' + thing.__name__ + if inspect.isfunction(thing): + return 'function ' + thing.__name__ + if inspect.ismethod(thing): + return 'method ' + thing.__name__ + if type(thing) is types.InstanceType: + return 'instance of ' + thing.__class__.__name__ + return type(thing).__name__ + +def locate(path, forceload=0): + """Locate an object by name or dotted path, importing as necessary.""" + parts = split(path, '.') + module, n = None, 0 + while n < len(parts): + nextmodule = safeimport(join(parts[:n+1], '.'), forceload) + if nextmodule: module, n = nextmodule, n + 1 + else: break + if module: + object = module + for part in parts[n:]: + try: object = getattr(object, part) + except AttributeError: return None + return object + else: + import __builtin__ + if hasattr(__builtin__, path): + return getattr(__builtin__, path) + +# --------------------------------------- interactive interpreter interface + +text = TextDoc() +html = HTMLDoc() + +def resolve(thing, forceload=0): + """Given an object or a path to an object, get the object and its name.""" + if isinstance(thing, str): + object = locate(thing, forceload) + if not object: + raise ImportError, 'no Python documentation found for %r' % thing + return object, thing + else: + return thing, getattr(thing, '__name__', None) + +def doc(thing, title='Python Library Documentation: %s', forceload=0): + """Display text documentation, given an object or a path to an object.""" + try: + object, name = resolve(thing, forceload) + desc = describe(object) + module = inspect.getmodule(object) + if name and '.' in name: + desc += ' in ' + name[:name.rfind('.')] + elif module and module is not object: + desc += ' in module ' + module.__name__ + pager(title % desc + '\n\n' + text.document(object, name)) + except (ImportError, ErrorDuringImport), value: + print value + +def writedoc(thing, forceload=0): + """Write HTML documentation to a file in the current directory.""" + try: + object, name = resolve(thing, forceload) + page = html.page(describe(object), html.document(object, name)) + file = open(name + '.html', 'w') + file.write(page) + file.close() + print 'wrote', name + '.html' + except (ImportError, ErrorDuringImport), value: + print value + +def writedocs(dir, pkgpath='', done=None): + """Write out HTML documentation for all modules in a directory tree.""" + if done is None: done = {} + for file in os.listdir(dir): + path = os.path.join(dir, file) + if ispackage(path): + writedocs(path, pkgpath + file + '.', done) + elif os.path.isfile(path): + modname = inspect.getmodulename(path) + if modname: + modname = pkgpath + modname + if not done.has_key(modname): + done[modname] = 1 + writedoc(modname) + +class Helper: + keywords = { + 'and': 'BOOLEAN', + 'assert': ('ref/assert', ''), + 'break': ('ref/break', 'while for'), + 'class': ('ref/class', 'CLASSES SPECIALMETHODS'), + 'continue': ('ref/continue', 'while for'), + 'def': ('ref/function', ''), + 'del': ('ref/del', 'BASICMETHODS'), + 'elif': 'if', + 'else': ('ref/if', 'while for'), + 'except': 'try', + 'exec': ('ref/exec', ''), + 'finally': 'try', + 'for': ('ref/for', 'break continue while'), + 'from': 'import', + 'global': ('ref/global', 'NAMESPACES'), + 'if': ('ref/if', 'TRUTHVALUE'), + 'import': ('ref/import', 'MODULES'), + 'in': ('ref/comparisons', 'SEQUENCEMETHODS2'), + 'is': 'COMPARISON', + 'lambda': ('ref/lambdas', 'FUNCTIONS'), + 'not': 'BOOLEAN', + 'or': 'BOOLEAN', + 'pass': ('ref/pass', ''), + 'print': ('ref/print', ''), + 'raise': ('ref/raise', 'EXCEPTIONS'), + 'return': ('ref/return', 'FUNCTIONS'), + 'try': ('ref/try', 'EXCEPTIONS'), + 'while': ('ref/while', 'break continue if TRUTHVALUE'), + 'yield': ('ref/yield', ''), + } + + topics = { + 'TYPES': ('ref/types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS FUNCTIONS CLASSES MODULES FILES inspect'), + 'STRINGS': ('ref/strings', 'str UNICODE SEQUENCES STRINGMETHODS FORMATTING TYPES'), + 'STRINGMETHODS': ('lib/string-methods', 'STRINGS FORMATTING'), + 'FORMATTING': ('lib/typesseq-strings', 'OPERATORS'), + 'UNICODE': ('ref/strings', 'encodings unicode TYPES STRING'), + 'NUMBERS': ('ref/numbers', 'INTEGER FLOAT COMPLEX TYPES'), + 'INTEGER': ('ref/integers', 'int range'), + 'FLOAT': ('ref/floating', 'float math'), + 'COMPLEX': ('ref/imaginary', 'complex cmath'), + 'SEQUENCES': ('lib/typesseq', 'STRINGMETHODS FORMATTING xrange LISTS'), + 'MAPPINGS': 'DICTIONARIES', + 'FUNCTIONS': ('lib/typesfunctions', 'def TYPES'), + 'METHODS': ('lib/typesmethods', 'class def CLASSES TYPES'), + 'CODEOBJECTS': ('lib/bltin-code-objects', 'compile FUNCTIONS TYPES'), + 'TYPEOBJECTS': ('lib/bltin-type-objects', 'types TYPES'), + 'FRAMEOBJECTS': 'TYPES', + 'TRACEBACKS': 'TYPES', + 'NONE': ('lib/bltin-null-object', ''), + 'ELLIPSIS': ('lib/bltin-ellipsis-object', 'SLICINGS'), + 'FILES': ('lib/bltin-file-objects', ''), + 'SPECIALATTRIBUTES': ('lib/specialattrs', ''), + 'CLASSES': ('ref/types', 'class SPECIALMETHODS PRIVATENAMES'), + 'MODULES': ('lib/typesmodules', 'import'), + 'PACKAGES': 'import', + 'EXPRESSIONS': ('ref/summary', 'lambda or and not in is BOOLEAN COMPARISON BITWISE SHIFTING BINARY FORMATTING POWER UNARY ATTRIBUTES SUBSCRIPTS SLICINGS CALLS TUPLES LISTS DICTIONARIES BACKQUOTES'), + 'OPERATORS': 'EXPRESSIONS', + 'PRECEDENCE': 'EXPRESSIONS', + 'OBJECTS': ('ref/objects', 'TYPES'), + 'SPECIALMETHODS': ('ref/specialnames', 'BASICMETHODS ATTRIBUTEMETHODS CALLABLEMETHODS SEQUENCEMETHODS1 MAPPINGMETHODS SEQUENCEMETHODS2 NUMBERMETHODS CLASSES'), + 'BASICMETHODS': ('ref/customization', 'cmp hash repr str SPECIALMETHODS'), + 'ATTRIBUTEMETHODS': ('ref/attribute-access', 'ATTRIBUTES SPECIALMETHODS'), + 'CALLABLEMETHODS': ('ref/callable-types', 'CALLS SPECIALMETHODS'), + 'SEQUENCEMETHODS1': ('ref/sequence-types', 'SEQUENCES SEQUENCEMETHODS2 SPECIALMETHODS'), + 'SEQUENCEMETHODS2': ('ref/sequence-methods', 'SEQUENCES SEQUENCEMETHODS1 SPECIALMETHODS'), + 'MAPPINGMETHODS': ('ref/sequence-types', 'MAPPINGS SPECIALMETHODS'), + 'NUMBERMETHODS': ('ref/numeric-types', 'NUMBERS AUGMENTEDASSIGNMENT SPECIALMETHODS'), + 'EXECUTION': ('ref/naming', ''), + 'NAMESPACES': ('ref/naming', 'global ASSIGNMENT DELETION'), + 'SCOPING': 'NAMESPACES', + 'FRAMES': 'NAMESPACES', + 'EXCEPTIONS': ('ref/exceptions', 'try except finally raise'), + 'COERCIONS': 'CONVERSIONS', + 'CONVERSIONS': ('ref/conversions', ''), + 'IDENTIFIERS': ('ref/identifiers', 'keywords SPECIALIDENTIFIERS'), + 'SPECIALIDENTIFIERS': ('ref/id-classes', ''), + 'PRIVATENAMES': ('ref/atom-identifiers', ''), + 'LITERALS': ('ref/atom-literals', 'STRINGS BACKQUOTES NUMBERS TUPLELITERALS LISTLITERALS DICTIONARYLITERALS'), + 'TUPLES': 'SEQUENCES', + 'TUPLELITERALS': ('ref/exprlists', 'TUPLES LITERALS'), + 'LISTS': ('lib/typesseq-mutable', 'LISTLITERALS'), + 'LISTLITERALS': ('ref/lists', 'LISTS LITERALS'), + 'DICTIONARIES': ('lib/typesmapping', 'DICTIONARYLITERALS'), + 'DICTIONARYLITERALS': ('ref/dict', 'DICTIONARIES LITERALS'), + 'BACKQUOTES': ('ref/string-conversions', 'repr str STRINGS LITERALS'), + 'ATTRIBUTES': ('ref/attribute-references', 'getattr hasattr setattr ATTRIBUTEMETHODS'), + 'SUBSCRIPTS': ('ref/subscriptions', 'SEQUENCEMETHODS1'), + 'SLICINGS': ('ref/slicings', 'SEQUENCEMETHODS2'), + 'CALLS': ('ref/calls', 'EXPRESSIONS'), + 'POWER': ('ref/power', 'EXPRESSIONS'), + 'UNARY': ('ref/unary', 'EXPRESSIONS'), + 'BINARY': ('ref/binary', 'EXPRESSIONS'), + 'SHIFTING': ('ref/shifting', 'EXPRESSIONS'), + 'BITWISE': ('ref/bitwise', 'EXPRESSIONS'), + 'COMPARISON': ('ref/comparisons', 'EXPRESSIONS BASICMETHODS'), + 'BOOLEAN': ('ref/Booleans', 'EXPRESSIONS TRUTHVALUE'), + 'ASSERTION': 'assert', + 'ASSIGNMENT': ('ref/assignment', 'AUGMENTEDASSIGNMENT'), + 'AUGMENTEDASSIGNMENT': ('ref/augassign', 'NUMBERMETHODS'), + 'DELETION': 'del', + 'PRINTING': 'print', + 'RETURNING': 'return', + 'IMPORTING': 'import', + 'CONDITIONAL': 'if', + 'LOOPING': ('ref/compound', 'for while break continue'), + 'TRUTHVALUE': ('lib/truth', 'if while and or not BASICMETHODS'), + 'DEBUGGING': ('lib/module-pdb', 'pdb'), + } + + def __init__(self, input, output): + self.input = input + self.output = output + self.docdir = None + execdir = os.path.dirname(sys.executable) + homedir = os.environ.get('PYTHONHOME') + for dir in [os.environ.get('PYTHONDOCS'), + homedir and os.path.join(homedir, 'doc'), + os.path.join(execdir, 'doc'), + '/usr/doc/python-docs-' + split(sys.version)[0], + '/usr/doc/python-' + split(sys.version)[0], + '/usr/doc/python-docs-' + sys.version[:3], + '/usr/doc/python-' + sys.version[:3]]: + if dir and os.path.isdir(os.path.join(dir, 'lib')): + self.docdir = dir + + def __repr__(self): + if inspect.stack()[1][3] == '?': + self() + return '' + return '' + + def __call__(self, request=None): + if request is not None: + self.help(request) + else: + self.intro() + self.interact() + self.output.write(''' +You are now leaving help and returning to the Python interpreter. +If you want to ask for help on a particular object directly from the +interpreter, you can type "help(object)". Executing "help('string')" +has the same effect as typing a particular string at the help> prompt. +''') + + def interact(self): + self.output.write('\n') + while 1: + self.output.write('help> ') + self.output.flush() + try: + request = self.input.readline() + if not request: break + except KeyboardInterrupt: break + request = strip(replace(request, '"', '', "'", '')) + if lower(request) in ['q', 'quit']: break + self.help(request) + + def help(self, request): + if type(request) is type(''): + if request == 'help': self.intro() + elif request == 'keywords': self.listkeywords() + elif request == 'topics': self.listtopics() + elif request == 'modules': self.listmodules() + elif request[:8] == 'modules ': + self.listmodules(split(request)[1]) + elif self.keywords.has_key(request): self.showtopic(request) + elif self.topics.has_key(request): self.showtopic(request) + elif request: doc(request, 'Help on %s:') + elif isinstance(request, Helper): self() + else: doc(request, 'Help on %s:') + self.output.write('\n') + + def intro(self): + self.output.write(''' +Welcome to Python %s! This is the online help utility. + +If this is your first time using Python, you should definitely check out +the tutorial on the Internet at http://www.python.org/doc/tut/. + +Enter the name of any module, keyword, or topic to get help on writing +Python programs and using Python modules. To quit this help utility and +return to the interpreter, just type "quit". + +To get a list of available modules, keywords, or topics, type "modules", +"keywords", or "topics". Each module also comes with a one-line summary +of what it does; to list the modules whose summaries contain a given word +such as "spam", type "modules spam". +''' % sys.version[:3]) + + def list(self, items, columns=4, width=80): + items = items[:] + items.sort() + colw = width / columns + rows = (len(items) + columns - 1) / columns + for row in range(rows): + for col in range(columns): + i = col * rows + row + if i < len(items): + self.output.write(items[i]) + if col < columns - 1: + self.output.write(' ' + ' ' * (colw-1 - len(items[i]))) + self.output.write('\n') + + def listkeywords(self): + self.output.write(''' +Here is a list of the Python keywords. Enter any keyword to get more help. + +''') + self.list(self.keywords.keys()) + + def listtopics(self): + self.output.write(''' +Here is a list of available topics. Enter any topic name to get more help. + +''') + self.list(self.topics.keys()) + + def showtopic(self, topic): + if not self.docdir: + self.output.write(''' +Sorry, topic and keyword documentation is not available because the Python +HTML documentation files could not be found. If you have installed them, +please set the environment variable PYTHONDOCS to indicate their location. +''') + return + target = self.topics.get(topic, self.keywords.get(topic)) + if not target: + self.output.write('no documentation found for %s\n' % repr(topic)) + return + if type(target) is type(''): + return self.showtopic(target) + + filename, xrefs = target + filename = self.docdir + '/' + filename + '.html' + try: + file = open(filename) + except: + self.output.write('could not read docs from %s\n' % filename) + return + + divpat = re.compile(']*navigat.*?', re.I | re.S) + addrpat = re.compile('.*?', re.I | re.S) + document = re.sub(addrpat, '', re.sub(divpat, '', file.read())) + file.close() + + import htmllib, formatter, StringIO + buffer = StringIO.StringIO() + parser = htmllib.HTMLParser( + formatter.AbstractFormatter(formatter.DumbWriter(buffer))) + parser.start_table = parser.do_p + parser.end_table = lambda parser=parser: parser.do_p({}) + parser.start_tr = parser.do_br + parser.start_td = parser.start_th = lambda a, b=buffer: b.write('\t') + parser.feed(document) + buffer = replace(buffer.getvalue(), '\xa0', ' ', '\n', '\n ') + pager(' ' + strip(buffer) + '\n') + if xrefs: + buffer = StringIO.StringIO() + formatter.DumbWriter(buffer).send_flowing_data( + 'Related help topics: ' + join(split(xrefs), ', ') + '\n') + self.output.write('\n%s\n' % buffer.getvalue()) + + def listmodules(self, key=''): + if key: + self.output.write(''' +Here is a list of matching modules. Enter any module name to get more help. + +''') + apropos(key) + else: + self.output.write(''' +Please wait a moment while I gather a list of all available modules... + +''') + modules = {} + def callback(path, modname, desc, modules=modules): + if modname and modname[-9:] == '.__init__': + modname = modname[:-9] + ' (package)' + if find(modname, '.') < 0: + modules[modname] = 1 + ModuleScanner().run(callback) + self.list(modules.keys()) + self.output.write(''' +Enter any module name to get more help. Or, type "modules spam" to search +for modules whose descriptions contain the word "spam". +''') + +help = Helper(sys.stdin, sys.stdout) + +class Scanner: + """A generic tree iterator.""" + def __init__(self, roots, children, descendp): + self.roots = roots[:] + self.state = [] + self.children = children + self.descendp = descendp + + def next(self): + if not self.state: + if not self.roots: + return None + root = self.roots.pop(0) + self.state = [(root, self.children(root))] + node, children = self.state[-1] + if not children: + self.state.pop() + return self.next() + child = children.pop(0) + if self.descendp(child): + self.state.append((child, self.children(child))) + return child + +class ModuleScanner(Scanner): + """An interruptible scanner that searches module synopses.""" + def __init__(self): + roots = map(lambda dir: (dir, ''), pathdirs()) + Scanner.__init__(self, roots, self.submodules, self.isnewpackage) + self.inodes = map(lambda (dir, pkg): os.stat(dir)[1], roots) + + def submodules(self, (dir, package)): + children = [] + for file in os.listdir(dir): + path = os.path.join(dir, file) + if ispackage(path): + children.append((path, package + (package and '.') + file)) + else: + children.append((path, package)) + children.sort() # so that spam.py comes before spam.pyc or spam.pyo + return children + + def isnewpackage(self, (dir, package)): + inode = os.path.exists(dir) and os.stat(dir)[1] + if not (os.path.islink(dir) and inode in self.inodes): + self.inodes.append(inode) # detect circular symbolic links + return ispackage(dir) + + def run(self, callback, key=None, completer=None): + if key: key = lower(key) + self.quit = 0 + seen = {} + + for modname in sys.builtin_module_names: + if modname != '__main__': + seen[modname] = 1 + if key is None: + callback(None, modname, '') + else: + desc = split(__import__(modname).__doc__ or '', '\n')[0] + if find(lower(modname + ' - ' + desc), key) >= 0: + callback(None, modname, desc) + + while not self.quit: + node = self.next() + if not node: break + path, package = node + modname = inspect.getmodulename(path) + if os.path.isfile(path) and modname: + modname = package + (package and '.') + modname + if not seen.has_key(modname): + seen[modname] = 1 # if we see spam.py, skip spam.pyc + if key is None: + callback(path, modname, '') + else: + desc = synopsis(path) or '' + if find(lower(modname + ' - ' + desc), key) >= 0: + callback(path, modname, desc) + if completer: completer() + +def apropos(key): + """Print all the one-line module summaries that contain a substring.""" + def callback(path, modname, desc): + if modname[-9:] == '.__init__': + modname = modname[:-9] + ' (package)' + print modname, desc and '- ' + desc + try: import warnings + except ImportError: pass + else: warnings.filterwarnings('ignore') # ignore problems during import + ModuleScanner().run(callback, key) + +# --------------------------------------------------- web browser interface + +def serve(port, callback=None, completer=None): + import BaseHTTPServer, mimetools, select + + # Patch up mimetools.Message so it doesn't break if rfc822 is reloaded. + class Message(mimetools.Message): + def __init__(self, fp, seekable=1): + Message = self.__class__ + Message.__bases__[0].__bases__[0].__init__(self, fp, seekable) + self.encodingheader = self.getheader('content-transfer-encoding') + self.typeheader = self.getheader('content-type') + self.parsetype() + self.parseplist() + + class DocHandler(BaseHTTPServer.BaseHTTPRequestHandler): + def send_document(self, title, contents): + try: + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.end_headers() + self.wfile.write(html.page(title, contents)) + except IOError: pass + + def do_GET(self): + path = self.path + if path[-5:] == '.html': path = path[:-5] + if path[:1] == '/': path = path[1:] + if path and path != '.': + try: + obj = locate(path, forceload=1) + except ErrorDuringImport, value: + self.send_document(path, html.escape(str(value))) + return + if obj: + self.send_document(describe(obj), html.document(obj, path)) + else: + self.send_document(path, +'no Python documentation found for %s' % repr(path)) + else: + heading = html.heading( +'Python: Index of Modules', +'#ffffff', '#7799ee') + def bltinlink(name): + return '%s' % (name, name) + names = filter(lambda x: x != '__main__', + sys.builtin_module_names) + contents = html.multicolumn(names, bltinlink) + indices = ['

' + html.bigsection( + 'Built-in Modules', '#ffffff', '#ee77aa', contents)] + + seen = {} + for dir in pathdirs(): + indices.append(html.index(dir, seen)) + contents = heading + join(indices) + '''

+ +pydoc by Ka-Ping Yee <ping at lfw.org>''' + self.send_document('Index of Modules', contents) + + def log_message(self, *args): pass + + class DocServer(BaseHTTPServer.HTTPServer): + def __init__(self, port, callback): + host = (sys.platform == 'mac') and '127.0.0.1' or 'localhost' + self.address = ('', port) + self.url = 'http://%s:%d/' % (host, port) + self.callback = callback + self.base.__init__(self, self.address, self.handler) + + def serve_until_quit(self): + import select + self.quit = 0 + while not self.quit: + rd, wr, ex = select.select([self.socket.fileno()], [], [], 1) + if rd: self.handle_request() + + def server_activate(self): + self.base.server_activate(self) + if self.callback: self.callback(self) + + DocServer.base = BaseHTTPServer.HTTPServer + DocServer.handler = DocHandler + DocHandler.MessageClass = Message + try: + try: + DocServer(port, callback).serve_until_quit() + except (KeyboardInterrupt, select.error): + pass + finally: + if completer: completer() + +# ----------------------------------------------------- graphical interface + +def gui(): + """Graphical interface (starts web server and pops up a control window).""" + class GUI: + def __init__(self, window, port=7464): + self.window = window + self.server = None + self.scanner = None + + import Tkinter + self.server_frm = Tkinter.Frame(window) + self.title_lbl = Tkinter.Label(self.server_frm, + text='Starting server...\n ') + self.open_btn = Tkinter.Button(self.server_frm, + text='open browser', command=self.open, state='disabled') + self.quit_btn = Tkinter.Button(self.server_frm, + text='quit serving', command=self.quit, state='disabled') + + self.search_frm = Tkinter.Frame(window) + self.search_lbl = Tkinter.Label(self.search_frm, text='Search for') + self.search_ent = Tkinter.Entry(self.search_frm) + self.search_ent.bind('', self.search) + self.stop_btn = Tkinter.Button(self.search_frm, + text='stop', pady=0, command=self.stop, state='disabled') + if sys.platform == 'win32': + # Trying to hide and show this button crashes under Windows. + self.stop_btn.pack(side='right') + + self.window.title('pydoc') + self.window.protocol('WM_DELETE_WINDOW', self.quit) + self.title_lbl.pack(side='top', fill='x') + self.open_btn.pack(side='left', fill='x', expand=1) + self.quit_btn.pack(side='right', fill='x', expand=1) + self.server_frm.pack(side='top', fill='x') + + self.search_lbl.pack(side='left') + self.search_ent.pack(side='right', fill='x', expand=1) + self.search_frm.pack(side='top', fill='x') + self.search_ent.focus_set() + + font = ('helvetica', sys.platform == 'win32' and 8 or 10) + self.result_lst = Tkinter.Listbox(window, font=font, height=6) + self.result_lst.bind('', self.select) + self.result_lst.bind('', self.goto) + self.result_scr = Tkinter.Scrollbar(window, + orient='vertical', command=self.result_lst.yview) + self.result_lst.config(yscrollcommand=self.result_scr.set) + + self.result_frm = Tkinter.Frame(window) + self.goto_btn = Tkinter.Button(self.result_frm, + text='go to selected', command=self.goto) + self.hide_btn = Tkinter.Button(self.result_frm, + text='hide results', command=self.hide) + self.goto_btn.pack(side='left', fill='x', expand=1) + self.hide_btn.pack(side='right', fill='x', expand=1) + + self.window.update() + self.minwidth = self.window.winfo_width() + self.minheight = self.window.winfo_height() + self.bigminheight = (self.server_frm.winfo_reqheight() + + self.search_frm.winfo_reqheight() + + self.result_lst.winfo_reqheight() + + self.result_frm.winfo_reqheight()) + self.bigwidth, self.bigheight = self.minwidth, self.bigminheight + self.expanded = 0 + self.window.wm_geometry('%dx%d' % (self.minwidth, self.minheight)) + self.window.wm_minsize(self.minwidth, self.minheight) + + import threading + threading.Thread( + target=serve, args=(port, self.ready, self.quit)).start() + + def ready(self, server): + self.server = server + self.title_lbl.config( + text='Python documentation server at\n' + server.url) + self.open_btn.config(state='normal') + self.quit_btn.config(state='normal') + + def open(self, event=None, url=None): + url = url or self.server.url + try: + import webbrowser + webbrowser.open(url) + except ImportError: # pre-webbrowser.py compatibility + if sys.platform == 'win32': + os.system('start "%s"' % url) + elif sys.platform == 'mac': + try: import ic + except ImportError: pass + else: ic.launchurl(url) + else: + rc = os.system('netscape -remote "openURL(%s)" &' % url) + if rc: os.system('netscape "%s" &' % url) + + def quit(self, event=None): + if self.server: + self.server.quit = 1 + self.window.quit() + + def search(self, event=None): + key = self.search_ent.get() + self.stop_btn.pack(side='right') + self.stop_btn.config(state='normal') + self.search_lbl.config(text='Searching for "%s"...' % key) + self.search_ent.forget() + self.search_lbl.pack(side='left') + self.result_lst.delete(0, 'end') + self.goto_btn.config(state='disabled') + self.expand() + + import threading + if self.scanner: + self.scanner.quit = 1 + self.scanner = ModuleScanner() + threading.Thread(target=self.scanner.run, + args=(self.update, key, self.done)).start() + + def update(self, path, modname, desc): + if modname[-9:] == '.__init__': + modname = modname[:-9] + ' (package)' + self.result_lst.insert('end', + modname + ' - ' + (desc or '(no description)')) + + def stop(self, event=None): + if self.scanner: + self.scanner.quit = 1 + self.scanner = None + + def done(self): + self.scanner = None + self.search_lbl.config(text='Search for') + self.search_lbl.pack(side='left') + self.search_ent.pack(side='right', fill='x', expand=1) + if sys.platform != 'win32': self.stop_btn.forget() + self.stop_btn.config(state='disabled') + + def select(self, event=None): + self.goto_btn.config(state='normal') + + def goto(self, event=None): + selection = self.result_lst.curselection() + if selection: + modname = split(self.result_lst.get(selection[0]))[0] + self.open(url=self.server.url + modname + '.html') + + def collapse(self): + if not self.expanded: return + self.result_frm.forget() + self.result_scr.forget() + self.result_lst.forget() + self.bigwidth = self.window.winfo_width() + self.bigheight = self.window.winfo_height() + self.window.wm_geometry('%dx%d' % (self.minwidth, self.minheight)) + self.window.wm_minsize(self.minwidth, self.minheight) + self.expanded = 0 + + def expand(self): + if self.expanded: return + self.result_frm.pack(side='bottom', fill='x') + self.result_scr.pack(side='right', fill='y') + self.result_lst.pack(side='top', fill='both', expand=1) + self.window.wm_geometry('%dx%d' % (self.bigwidth, self.bigheight)) + self.window.wm_minsize(self.minwidth, self.bigminheight) + self.expanded = 1 + + def hide(self, event=None): + self.stop() + self.collapse() + + import Tkinter + try: + gui = GUI(Tkinter.Tk()) + Tkinter.mainloop() + except KeyboardInterrupt: + pass + +# -------------------------------------------------- command-line interface + +def ispath(x): + return isinstance(x, str) and find(x, os.sep) >= 0 + +def cli(): + """Command-line interface (looks at sys.argv to decide what to do).""" + import getopt + class BadUsage: pass + + # Scripts don't get the current directory in their path by default. + scriptdir = os.path.dirname(sys.argv[0]) + if scriptdir in sys.path: + sys.path.remove(scriptdir) + sys.path.insert(0, '.') + + try: + opts, args = getopt.getopt(sys.argv[1:], 'gk:p:w') + writing = 0 + + for opt, val in opts: + if opt == '-g': + gui() + return + if opt == '-k': + apropos(val) + return + if opt == '-p': + try: + port = int(val) + except ValueError: + raise BadUsage + def ready(server): + print 'pydoc server ready at %s' % server.url + def stopped(): + print 'pydoc server stopped' + serve(port, ready, stopped) + return + if opt == '-w': + writing = 1 + + if not args: raise BadUsage + for arg in args: + if ispath(arg) and not os.path.exists(arg): + print 'file %r does not exist' % arg + break + try: + if ispath(arg) and os.path.isfile(arg): + arg = importfile(arg) + if writing: + if ispath(arg) and os.path.isdir(arg): + writedocs(arg) + else: + writedoc(arg) + else: + doc(arg) + except ErrorDuringImport, value: + print value + + except (getopt.error, BadUsage): + cmd = sys.argv[0] + print """pydoc - the Python documentation tool + +%s ... + Show text documentation on something. may be the name of a + function, module, or package, or a dotted reference to a class or + function within a module or module in a package. If contains + a '%s', it is used as the path to a Python source file to document. + +%s -k + Search for a keyword in the synopsis lines of all available modules. + +%s -p + Start an HTTP server on the given port on the local machine. + +%s -g + Pop up a graphical interface for finding and serving documentation. + +%s -w ... + Write out the HTML documentation for a module to a file in the current + directory. If contains a '%s', it is treated as a filename; if + it names a directory, documentation is written for all the contents. +""" % (cmd, os.sep, cmd, cmd, cmd, cmd, os.sep) + +if __name__ == '__main__': cli() diff --git a/lib-python/2.2/quopri.py b/lib-python/2.2/quopri.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/quopri.py @@ -0,0 +1,237 @@ +#! /usr/bin/env python + +"""Conversions to/from quoted-printable transport encoding as per RFC 1521.""" + +# (Dec 1991 version). + +__all__ = ["encode", "decode", "encodestring", "decodestring"] + +ESCAPE = '=' +MAXLINESIZE = 76 +HEX = '0123456789ABCDEF' +EMPTYSTRING = '' + +try: + from binascii import a2b_qp, b2a_qp +except: + a2b_qp = None + b2a_qp = None + + +def needsquoting(c, quotetabs, header): + """Decide whether a particular character needs to be quoted. + + The 'quotetabs' flag indicates whether embedded tabs and spaces should be + quoted. Note that line-ending tabs and spaces are always encoded, as per + RFC 1521. + """ + if c in ' \t': + return quotetabs + # if header, we have to escape _ because _ is used to escape space + if c == '_': + return header + return c == ESCAPE or not (' ' <= c <= '~') + +def quote(c): + """Quote a single character.""" + i = ord(c) + return ESCAPE + HEX[i//16] + HEX[i%16] + + + +def encode(input, output, quotetabs, header = 0): + """Read 'input', apply quoted-printable encoding, and write to 'output'. + + 'input' and 'output' are files with readline() and write() methods. + The 'quotetabs' flag indicates whether embedded tabs and spaces should be + quoted. Note that line-ending tabs and spaces are always encoded, as per + RFC 1521. + The 'header' flag indicates whether we are encoding spaces as _ as per + RFC 1522. + """ + + if b2a_qp is not None: + data = input.read() + odata = b2a_qp(data, quotetabs = quotetabs, header = header) + output.write(odata) + return + + def write(s, output=output, lineEnd='\n'): + # RFC 1521 requires that the line ending in a space or tab must have + # that trailing character encoded. + if s and s[-1:] in ' \t': + output.write(s[:-1] + quote(s[-1]) + lineEnd) + elif s == '.': + output.write(quote(s) + lineEnd) + else: + output.write(s + lineEnd) + + prevline = None + while 1: + line = input.readline() + if not line: + break + outline = [] + # Strip off any readline induced trailing newline + stripped = '' + if line[-1:] == '\n': + line = line[:-1] + stripped = '\n' + # Calculate the un-length-limited encoded line + for c in line: + if needsquoting(c, quotetabs, header): + c = quote(c) + if header and c == ' ': + outline.append('_') + else: + outline.append(c) + # First, write out the previous line + if prevline is not None: + write(prevline) + # Now see if we need any soft line breaks because of RFC-imposed + # length limitations. Then do the thisline->prevline dance. + thisline = EMPTYSTRING.join(outline) + while len(thisline) > MAXLINESIZE: + # Don't forget to include the soft line break `=' sign in the + # length calculation! + write(thisline[:MAXLINESIZE-1], lineEnd='=\n') + thisline = thisline[MAXLINESIZE-1:] + # Write out the current line + prevline = thisline + # Write out the last line, without a trailing newline + if prevline is not None: + write(prevline, lineEnd=stripped) + +def encodestring(s, quotetabs = 0, header = 0): + if b2a_qp is not None: + return b2a_qp(s, quotetabs = quotetabs, header = header) + from cStringIO import StringIO + infp = StringIO(s) + outfp = StringIO() + encode(infp, outfp, quotetabs, header) + return outfp.getvalue() + + + +def decode(input, output, header = 0): + """Read 'input', apply quoted-printable decoding, and write to 'output'. + 'input' and 'output' are files with readline() and write() methods. + If 'header' is true, decode underscore as space (per RFC 1522).""" + + if a2b_qp is not None: + data = input.read() + odata = a2b_qp(data, header = header) + output.write(odata) + return + + new = '' + while 1: + line = input.readline() + if not line: break + i, n = 0, len(line) + if n > 0 and line[n-1] == '\n': + partial = 0; n = n-1 + # Strip trailing whitespace + while n > 0 and line[n-1] in " \t\r": + n = n-1 + else: + partial = 1 + while i < n: + c = line[i] + if c == '_' and header: + new = new + ' '; i = i+1 + elif c != ESCAPE: + new = new + c; i = i+1 + elif i+1 == n and not partial: + partial = 1; break + elif i+1 < n and line[i+1] == ESCAPE: + new = new + ESCAPE; i = i+2 + elif i+2 < n and ishex(line[i+1]) and ishex(line[i+2]): + new = new + chr(unhex(line[i+1:i+3])); i = i+3 + else: # Bad escape sequence -- leave it in + new = new + c; i = i+1 + if not partial: + output.write(new + '\n') + new = '' + if new: + output.write(new) + +def decodestring(s, header = 0): + if a2b_qp is not None: + return a2b_qp(s, header = header) + from cStringIO import StringIO + infp = StringIO(s) + outfp = StringIO() + decode(infp, outfp, header = header) + return outfp.getvalue() + + + +# Other helper functions +def ishex(c): + """Return true if the character 'c' is a hexadecimal digit.""" + return '0' <= c <= '9' or 'a' <= c <= 'f' or 'A' <= c <= 'F' + +def unhex(s): + """Get the integer value of a hexadecimal number.""" + bits = 0 + for c in s: + if '0' <= c <= '9': + i = ord('0') + elif 'a' <= c <= 'f': + i = ord('a')-10 + elif 'A' <= c <= 'F': + i = ord('A')-10 + else: + break + bits = bits*16 + (ord(c) - i) + return bits + + + +def main(): + import sys + import getopt + try: + opts, args = getopt.getopt(sys.argv[1:], 'td') + except getopt.error, msg: + sys.stdout = sys.stderr + print msg + print "usage: quopri [-t | -d] [file] ..." + print "-t: quote tabs" + print "-d: decode; default encode" + sys.exit(2) + deco = 0 + tabs = 0 + for o, a in opts: + if o == '-t': tabs = 1 + if o == '-d': deco = 1 + if tabs and deco: + sys.stdout = sys.stderr + print "-t and -d are mutually exclusive" + sys.exit(2) + if not args: args = ['-'] + sts = 0 + for file in args: + if file == '-': + fp = sys.stdin + else: + try: + fp = open(file) + except IOError, msg: + sys.stderr.write("%s: can't open (%s)\n" % (file, msg)) + sts = 1 + continue + if deco: + decode(fp, sys.stdout) + else: + encode(fp, sys.stdout, tabs) + if fp is not sys.stdin: + fp.close() + if sts: + sys.exit(sts) + + + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/random.py b/lib-python/2.2/random.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/random.py @@ -0,0 +1,779 @@ +"""Random variable generators. + + integers + -------- + uniform within range + + sequences + --------- + pick random element + generate random permutation + + distributions on the real line: + ------------------------------ + uniform + normal (Gaussian) + lognormal + negative exponential + gamma + beta + + distributions on the circle (angles 0 to 2pi) + --------------------------------------------- + circular uniform + von Mises + +Translated from anonymously contributed C/C++ source. + +Multi-threading note: the random number generator used here is not thread- +safe; it is possible that two calls return the same random value. However, +you can instantiate a different instance of Random() in each thread to get +generators that don't share state, then use .setstate() and .jumpahead() to +move the generators to disjoint segments of the full period. For example, + +def create_generators(num, delta, firstseed=None): + ""\"Return list of num distinct generators. + Each generator has its own unique segment of delta elements from + Random.random()'s full period. + Seed the first generator with optional arg firstseed (default is + None, to seed from current time). + ""\" + + from random import Random + g = Random(firstseed) + result = [g] + for i in range(num - 1): + laststate = g.getstate() + g = Random() + g.setstate(laststate) + g.jumpahead(delta) + result.append(g) + return result + +gens = create_generators(10, 1000000) + +That creates 10 distinct generators, which can be passed out to 10 distinct +threads. The generators don't share state so can be called safely in +parallel. So long as no thread calls its g.random() more than a million +times (the second argument to create_generators), the sequences seen by +each thread will not overlap. + +The period of the underlying Wichmann-Hill generator is 6,953,607,871,644, +and that limits how far this technique can be pushed. + +Just for fun, note that since we know the period, .jumpahead() can also be +used to "move backward in time": + +>>> g = Random(42) # arbitrary +>>> g.random() +0.25420336316883324 +>>> g.jumpahead(6953607871644L - 1) # move *back* one +>>> g.random() +0.25420336316883324 +""" +# XXX The docstring sucks. + +from math import log as _log, exp as _exp, pi as _pi, e as _e +from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from math import floor as _floor + +__all__ = ["Random","seed","random","uniform","randint","choice", + "randrange","shuffle","normalvariate","lognormvariate", + "cunifvariate","expovariate","vonmisesvariate","gammavariate", + "stdgamma","gauss","betavariate","paretovariate","weibullvariate", + "getstate","setstate","jumpahead","whseed"] + +def _verify(name, computed, expected): + if abs(computed - expected) > 1e-7: + raise ValueError( + "computed value for %s deviates too much " + "(computed %g, expected %g)" % (name, computed, expected)) + +NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) +_verify('NV_MAGICCONST', NV_MAGICCONST, 1.71552776992141) + +TWOPI = 2.0*_pi +_verify('TWOPI', TWOPI, 6.28318530718) + +LOG4 = _log(4.0) +_verify('LOG4', LOG4, 1.38629436111989) + +SG_MAGICCONST = 1.0 + _log(4.5) +_verify('SG_MAGICCONST', SG_MAGICCONST, 2.50407739677627) + +del _verify + +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. + +class Random: + """Random number generator base class used by bound module functions. + + Used to instantiate instances of Random to get generators that don't + share state. Especially useful for multi-threaded programs, creating + a different instance of Random for each thread, and using the jumpahead() + method to ensure that the generated sequences seen by each thread don't + overlap. + + Class Random can also be subclassed if you want to use a different basic + generator of your own devising: in that case, override the following + methods: random(), seed(), getstate(), setstate() and jumpahead(). + + """ + + VERSION = 1 # used by getstate/setstate + + def __init__(self, x=None): + """Initialize an instance. + + Optional argument x controls seeding, as for Random.seed(). + """ + + self.seed(x) + +## -------------------- core generator ------------------- + + # Specific to Wichmann-Hill generator. Subclasses wishing to use a + # different core generator should override the seed(), random(), + # getstate(), setstate() and jumpahead() methods. + + def seed(self, a=None): + """Initialize internal state from hashable object. + + None or no argument seeds from current time. + + If a is not None or an int or long, hash(a) is used instead. + + If a is an int or long, a is used directly. Distinct values between + 0 and 27814431486575L inclusive are guaranteed to yield distinct + internal states (this guarantee is specific to the default + Wichmann-Hill generator). + """ + + if a is None: + # Initialize from current time + import time + a = long(time.time() * 256) + + if type(a) not in (type(3), type(3L)): + a = hash(a) + + a, x = divmod(a, 30268) + a, y = divmod(a, 30306) + a, z = divmod(a, 30322) + self._seed = int(x)+1, int(y)+1, int(z)+1 + + self.gauss_next = None + + def random(self): + """Get the next random number in the range [0.0, 1.0).""" + + # Wichman-Hill random number generator. + # + # Wichmann, B. A. & Hill, I. D. (1982) + # Algorithm AS 183: + # An efficient and portable pseudo-random number generator + # Applied Statistics 31 (1982) 188-190 + # + # see also: + # Correction to Algorithm AS 183 + # Applied Statistics 33 (1984) 123 + # + # McLeod, A. I. (1985) + # A remark on Algorithm AS 183 + # Applied Statistics 34 (1985),198-200 + + # This part is thread-unsafe: + # BEGIN CRITICAL SECTION + x, y, z = self._seed + x = (171 * x) % 30269 + y = (172 * y) % 30307 + z = (170 * z) % 30323 + self._seed = x, y, z + # END CRITICAL SECTION + + # Note: on a platform using IEEE-754 double arithmetic, this can + # never return 0.0 (asserted by Tim; proof too long for a comment). + return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 + + def getstate(self): + """Return internal state; can be passed to setstate() later.""" + return self.VERSION, self._seed, self.gauss_next + + def setstate(self, state): + """Restore internal state from object returned by getstate().""" + version = state[0] + if version == 1: + version, self._seed, self.gauss_next = state + else: + raise ValueError("state with version %s passed to " + "Random.setstate() of version %s" % + (version, self.VERSION)) + + def jumpahead(self, n): + """Act as if n calls to random() were made, but quickly. + + n is an int, greater than or equal to 0. + + Example use: If you have 2 threads and know that each will + consume no more than a million random numbers, create two Random + objects r1 and r2, then do + r2.setstate(r1.getstate()) + r2.jumpahead(1000000) + Then r1 and r2 will use guaranteed-disjoint segments of the full + period. + """ + + if not n >= 0: + raise ValueError("n must be >= 0") + x, y, z = self._seed + x = int(x * pow(171, n, 30269)) % 30269 + y = int(y * pow(172, n, 30307)) % 30307 + z = int(z * pow(170, n, 30323)) % 30323 + self._seed = x, y, z + + def __whseed(self, x=0, y=0, z=0): + """Set the Wichmann-Hill seed from (x, y, z). + + These must be integers in the range [0, 256). + """ + + if not type(x) == type(y) == type(z) == type(0): + raise TypeError('seeds must be integers') + if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256): + raise ValueError('seeds must be in range(0, 256)') + if 0 == x == y == z: + # Initialize from current time + import time + t = long(time.time() * 256) + t = int((t&0xffffff) ^ (t>>24)) + t, x = divmod(t, 256) + t, y = divmod(t, 256) + t, z = divmod(t, 256) + # Zero is a poor seed, so substitute 1 + self._seed = (x or 1, y or 1, z or 1) + + self.gauss_next = None + + def whseed(self, a=None): + """Seed from hashable object's hash code. + + None or no argument seeds from current time. It is not guaranteed + that objects with distinct hash codes lead to distinct internal + states. + + This is obsolete, provided for compatibility with the seed routine + used prior to Python 2.1. Use the .seed() method instead. + """ + + if a is None: + self.__whseed() + return + a = hash(a) + a, x = divmod(a, 256) + a, y = divmod(a, 256) + a, z = divmod(a, 256) + x = (x + a) % 256 or 1 + y = (y + a) % 256 or 1 + z = (z + a) % 256 or 1 + self.__whseed(x, y, z) + +## ---- Methods below this point do not need to be overridden when +## ---- subclassing for the purpose of using a different core generator. + +## -------------------- pickle support ------------------- + + def __getstate__(self): # for pickle + return self.getstate() + + def __setstate__(self, state): # for pickle + self.setstate(state) + +## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1, int=int, default=None): + """Choose a random item from range(start, stop[, step]). + + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. + Do not supply the 'int' and 'default' arguments. + """ + + # This code is a bit messy to make it fast for the + # common case while still doing adequate error checking. + istart = int(start) + if istart != start: + raise ValueError, "non-integer arg 1 for randrange()" + if stop is default: + if istart > 0: + return int(self.random() * istart) + raise ValueError, "empty range for randrange()" + + # stop argument supplied. + istop = int(stop) + if istop != stop: + raise ValueError, "non-integer stop for randrange()" + if step == 1 and istart < istop: + try: + return istart + int(self.random()*(istop - istart)) + except OverflowError: + # This can happen if istop-istart > sys.maxint + 1, and + # multiplying by random() doesn't reduce it to something + # <= sys.maxint. We know that the overall result fits + # in an int, and can still do it correctly via math.floor(). + # But that adds another function call, so for speed we + # avoided that whenever possible. + return int(istart + _floor(self.random()*(istop - istart))) + if step == 1: + raise ValueError, "empty range for randrange()" + + # Non-unit step argument supplied. + istep = int(step) + if istep != step: + raise ValueError, "non-integer step for randrange()" + if istep > 0: + n = (istop - istart + istep - 1) / istep + elif istep < 0: + n = (istop - istart + istep + 1) / istep + else: + raise ValueError, "zero step for randrange()" + + if n <= 0: + raise ValueError, "empty range for randrange()" + return istart + istep*int(self.random() * n) + + def randint(self, a, b): + """Return random integer in range [a, b], including both end points. + """ + + return self.randrange(a, b+1) + +## -------------------- sequence methods ------------------- + + def choice(self, seq): + """Choose a random element from a non-empty sequence.""" + return seq[int(self.random() * len(seq))] + + def shuffle(self, x, random=None, int=int): + """x, random=random.random -> shuffle list x in place; return None. + + Optional arg random is a 0-argument function returning a random + float in [0.0, 1.0); by default, the standard random.random. + + Note that for even rather small len(x), the total number of + permutations of x is larger than the period of most random number + generators; this implies that "most" permutations of a long + sequence can never be generated. + """ + + if random is None: + random = self.random + for i in xrange(len(x)-1, 0, -1): + # pick an element in x[:i+1] with which to exchange x[i] + j = int(random() * (i+1)) + x[i], x[j] = x[j], x[i] + +## -------------------- real-valued distributions ------------------- + +## -------------------- uniform distribution ------------------- + + def uniform(self, a, b): + """Get a random number in the range [a, b).""" + return a + (b-a) * self.random() + +## -------------------- normal distribution -------------------- + + def normalvariate(self, mu, sigma): + """Normal distribution. + + mu is the mean, and sigma is the standard deviation. + + """ + # mu = mean, sigma = standard deviation + + # Uses Kinderman and Monahan method. Reference: Kinderman, + # A.J. and Monahan, J.F., "Computer generation of random + # variables using the ratio of uniform deviates", ACM Trans + # Math Software, 3, (1977), pp257-260. + + random = self.random + while 1: + u1 = random() + u2 = 1.0 - random() + z = NV_MAGICCONST*(u1-0.5)/u2 + zz = z*z/4.0 + if zz <= -_log(u2): + break + return mu + z*sigma + +## -------------------- lognormal distribution -------------------- + + def lognormvariate(self, mu, sigma): + """Log normal distribution. + + If you take the natural logarithm of this distribution, you'll get a + normal distribution with mean mu and standard deviation sigma. + mu can have any value, and sigma must be greater than zero. + + """ + return _exp(self.normalvariate(mu, sigma)) + +## -------------------- circular uniform -------------------- + + def cunifvariate(self, mean, arc): + """Circular uniform distribution. + + mean is the mean angle, and arc is the range of the distribution, + centered around the mean angle. Both values must be expressed in + radians. Returned values range between mean - arc/2 and + mean + arc/2 and are normalized to between 0 and pi. + + Deprecated in version 2.3. Use: + (mean + arc * (Random.random() - 0.5)) % Math.pi + + """ + # mean: mean angle (in radians between 0 and pi) + # arc: range of distribution (in radians between 0 and pi) + + return (mean + arc * (self.random() - 0.5)) % _pi + +## -------------------- exponential distribution -------------------- + + def expovariate(self, lambd): + """Exponential distribution. + + lambd is 1.0 divided by the desired mean. (The parameter would be + called "lambda", but that is a reserved word in Python.) Returned + values range from 0 to positive infinity. + + """ + # lambd: rate lambd = 1/mean + # ('lambda' is a Python reserved word) + + random = self.random + u = random() + while u <= 1e-7: + u = random() + return -_log(u)/lambd + +## -------------------- von Mises distribution -------------------- + + def vonmisesvariate(self, mu, kappa): + """Circular data distribution. + + mu is the mean angle, expressed in radians between 0 and 2*pi, and + kappa is the concentration parameter, which must be greater than or + equal to zero. If kappa is equal to zero, this distribution reduces + to a uniform random angle over the range 0 to 2*pi. + + """ + # mu: mean angle (in radians between 0 and 2*pi) + # kappa: concentration parameter kappa (>= 0) + # if kappa = 0 generate uniform random angle + + # Based upon an algorithm published in: Fisher, N.I., + # "Statistical Analysis of Circular Data", Cambridge + # University Press, 1993. + + # Thanks to Magnus Kessler for a correction to the + # implementation of step 4. + + random = self.random + if kappa <= 1e-6: + return TWOPI * random() + + a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa) + b = (a - _sqrt(2.0 * a))/(2.0 * kappa) + r = (1.0 + b * b)/(2.0 * b) + + while 1: + u1 = random() + + z = _cos(_pi * u1) + f = (1.0 + r * z)/(r + z) + c = kappa * (r - f) + + u2 = random() + + if not (u2 >= c * (2.0 - c) and u2 > c * _exp(1.0 - c)): + break + + u3 = random() + if u3 > 0.5: + theta = (mu % TWOPI) + _acos(f) + else: + theta = (mu % TWOPI) - _acos(f) + + return theta + +## -------------------- gamma distribution -------------------- + + def gammavariate(self, alpha, beta): + """Gamma distribution. Not the gamma function! + + Conditions on the parameters are alpha > 0 and beta > 0. + + """ + + # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 + + # Warning: a few older sources define the gamma distribution in terms + # of alpha > -1.0 + if alpha <= 0.0 or beta <= 0.0: + raise ValueError, 'gammavariate: alpha and beta must be > 0.0' + + random = self.random + if alpha > 1.0: + + # Uses R.C.H. Cheng, "The generation of Gamma + # variables with non-integral shape parameters", + # Applied Statistics, (1977), 26, No. 1, p71-74 + + ainv = _sqrt(2.0 * alpha - 1.0) + bbb = alpha - LOG4 + ccc = alpha + ainv + + while 1: + u1 = random() + if not 1e-7 < u1 < .9999999: + continue + u2 = 1.0 - random() + v = _log(u1/(1.0-u1))/ainv + x = alpha*_exp(v) + z = u1*u1*u2 + r = bbb+ccc*v-x + if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + return x * beta + + elif alpha == 1.0: + # expovariate(1) + u = random() + while u <= 1e-7: + u = random() + return -_log(u) * beta + + else: # alpha is between 0 and 1 (exclusive) + + # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle + + while 1: + u = random() + b = (_e + alpha)/_e + p = b*u + if p <= 1.0: + x = pow(p, 1.0/alpha) + else: + # p > 1 + x = -_log((b-p)/alpha) + u1 = random() + if not (((p <= 1.0) and (u1 > _exp(-x))) or + ((p > 1) and (u1 > pow(x, alpha - 1.0)))): + break + return x * beta + + + def stdgamma(self, alpha, ainv, bbb, ccc): + # This method was (and shall remain) undocumented. + # This method is deprecated + # for the following reasons: + # 1. Returns same as .gammavariate(alpha, 1.0) + # 2. Requires caller to provide 3 extra arguments + # that are functions of alpha anyway + # 3. Can't be used for alpha < 0.5 + + # ainv = sqrt(2 * alpha - 1) + # bbb = alpha - log(4) + # ccc = alpha + ainv + import warnings + warnings.warn("The stdgamma function is deprecated; " + "use gammavariate() instead", + DeprecationWarning) + return self.gammavariate(alpha, 1.0) + + + +## -------------------- Gauss (faster alternative) -------------------- + + def gauss(self, mu, sigma): + """Gaussian distribution. + + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z*sigma + +## -------------------- beta -------------------- +## See +## http://sourceforge.net/bugs/?func=detailbug&bug_id=130030&group_id=5470 +## for Ivan Frohne's insightful analysis of why the original implementation: +## +## def betavariate(self, alpha, beta): +## # Discrete Event Simulation in C, pp 87-88. +## +## y = self.expovariate(alpha) +## z = self.expovariate(1.0/beta) +## return z/(y+z) +## +## was dead wrong, and how it probably got that way. + + def betavariate(self, alpha, beta): + """Beta distribution. + + Conditions on the parameters are alpha > -1 and beta} > -1. + Returned values range between 0 and 1. + + """ + + # This version due to Janne Sinkkonen, and matches all the std + # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). + y = self.gammavariate(alpha, 1.) + if y == 0: + return 0.0 + else: + return y / (y + self.gammavariate(beta, 1.)) + +## -------------------- Pareto -------------------- + + def paretovariate(self, alpha): + """Pareto distribution. alpha is the shape parameter.""" + # Jain, pg. 495 + + u = 1.0 - self.random() + return 1.0 / pow(u, 1.0/alpha) + +## -------------------- Weibull -------------------- + + def weibullvariate(self, alpha, beta): + """Weibull distribution. + + alpha is the scale parameter and beta is the shape parameter. + + """ + # Jain, pg. 499; bug fix courtesy Bill Arms + + u = 1.0 - self.random() + return alpha * pow(-_log(u), 1.0/beta) + +## -------------------- test program -------------------- + +def _test_generator(n, funccall): + import time + print n, 'times', funccall + code = compile(funccall, funccall, 'eval') + sum = 0.0 + sqsum = 0.0 + smallest = 1e10 + largest = -1e10 + t0 = time.time() + for i in range(n): + x = eval(code) + sum = sum + x + sqsum = sqsum + x*x + smallest = min(x, smallest) + largest = max(x, largest) + t1 = time.time() + print round(t1-t0, 3), 'sec,', + avg = sum/n + stddev = _sqrt(sqsum/n - avg*avg) + print 'avg %g, stddev %g, min %g, max %g' % \ + (avg, stddev, smallest, largest) + +def _test(N=20000): + print 'TWOPI =', TWOPI + print 'LOG4 =', LOG4 + print 'NV_MAGICCONST =', NV_MAGICCONST + print 'SG_MAGICCONST =', SG_MAGICCONST + _test_generator(N, 'random()') + _test_generator(N, 'normalvariate(0.0, 1.0)') + _test_generator(N, 'lognormvariate(0.0, 1.0)') + _test_generator(N, 'cunifvariate(0.0, 1.0)') + _test_generator(N, 'expovariate(1.0)') + _test_generator(N, 'vonmisesvariate(0.0, 1.0)') + _test_generator(N, 'gammavariate(0.01, 1.0)') + _test_generator(N, 'gammavariate(0.1, 1.0)') + _test_generator(N, 'gammavariate(0.1, 2.0)') + _test_generator(N, 'gammavariate(0.5, 1.0)') + _test_generator(N, 'gammavariate(0.9, 1.0)') + _test_generator(N, 'gammavariate(1.0, 1.0)') + _test_generator(N, 'gammavariate(2.0, 1.0)') + _test_generator(N, 'gammavariate(20.0, 1.0)') + _test_generator(N, 'gammavariate(200.0, 1.0)') + _test_generator(N, 'gauss(0.0, 1.0)') + _test_generator(N, 'betavariate(3.0, 3.0)') + _test_generator(N, 'paretovariate(1.0)') + _test_generator(N, 'weibullvariate(1.0, 1.0)') + + # Test jumpahead. + s = getstate() + jumpahead(N) + r1 = random() + # now do it the slow way + setstate(s) + for i in range(N): + random() + r2 = random() + if r1 != r2: + raise ValueError("jumpahead test failed " + `(N, r1, r2)`) + +# Create one instance, seeded from current time, and export its methods +# as module-level functions. The functions are not threadsafe, and state +# is shared across all uses (both in the user's code and in the Python +# libraries), but that's fine for most programs and is easier for the +# casual user than making them instantiate their own Random() instance. +_inst = Random() +seed = _inst.seed +random = _inst.random +uniform = _inst.uniform +randint = _inst.randint +choice = _inst.choice +randrange = _inst.randrange +shuffle = _inst.shuffle +normalvariate = _inst.normalvariate +lognormvariate = _inst.lognormvariate +cunifvariate = _inst.cunifvariate +expovariate = _inst.expovariate +vonmisesvariate = _inst.vonmisesvariate +gammavariate = _inst.gammavariate +stdgamma = _inst.stdgamma +gauss = _inst.gauss +betavariate = _inst.betavariate +paretovariate = _inst.paretovariate +weibullvariate = _inst.weibullvariate +getstate = _inst.getstate +setstate = _inst.setstate +jumpahead = _inst.jumpahead +whseed = _inst.whseed + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/re.py b/lib-python/2.2/re.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/re.py @@ -0,0 +1,33 @@ +"""Minimal "re" compatibility wrapper""" + +# If your regexps don't work well under 2.0b1, you can switch +# to the old engine ("pre") down below. +# +# To help us fix any remaining bugs in the new engine, please +# report what went wrong. You can either use the following web +# page: +# +# http://sourceforge.net/bugs/?group_id=5470 +# +# or send a mail to SRE's author: +# +# Fredrik Lundh +# +# Make sure to include the pattern, the string SRE failed to +# match, and what result you expected. +# +# thanks /F +# + +engine = "sre" +# engine = "pre" + +if engine == "sre": + # New unicode-aware engine + from sre import * + from sre import __all__ +else: + # Old 1.5.2 engine. This one supports 8-bit strings only, + # and will be removed in 2.0 final. + from pre import * + from pre import __all__ diff --git a/lib-python/2.2/reconvert.py b/lib-python/2.2/reconvert.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/reconvert.py @@ -0,0 +1,192 @@ +#! /usr/bin/env python1.5 + +r"""Convert old ("regex") regular expressions to new syntax ("re"). + +When imported as a module, there are two functions, with their own +strings: + + convert(s, syntax=None) -- convert a regex regular expression to re syntax + + quote(s) -- return a quoted string literal + +When used as a script, read a Python string literal (or any other +expression evaluating to a string) from stdin, and write the +translated expression to stdout as a string literal. Unless stdout is +a tty, no trailing \n is written to stdout. This is done so that it +can be used with Emacs C-U M-| (shell-command-on-region with argument +which filters the region through the shell command). + +No attempt has been made at coding for performance. + +Translation table... + + \( ( (unless RE_NO_BK_PARENS set) + \) ) (unless RE_NO_BK_PARENS set) + \| | (unless RE_NO_BK_VBAR set) + \< \b (not quite the same, but alla...) + \> \b (not quite the same, but alla...) + \` \A + \' \Z + +Not translated... + + . + ^ + $ + * + + (unless RE_BK_PLUS_QM set, then to \+) + ? (unless RE_BK_PLUS_QM set, then to \?) + \ + \b + \B + \w + \W + \1 ... \9 + +Special cases... + + Non-printable characters are always replaced by their 3-digit + escape code (except \t, \n, \r, which use mnemonic escapes) + + Newline is turned into | when RE_NEWLINE_OR is set + +XXX To be done... + + [...] (different treatment of backslashed items?) + [^...] (different treatment of backslashed items?) + ^ $ * + ? (in some error contexts these are probably treated differently) + \vDD \DD (in the regex docs but only works when RE_ANSI_HEX set) + +""" + + +import warnings +warnings.filterwarnings("ignore", ".* regex .*", DeprecationWarning, __name__, + append=1) + +import regex +from regex_syntax import * # RE_* + +__all__ = ["convert","quote"] + +# Default translation table +mastertable = { + r'\<': r'\b', + r'\>': r'\b', + r'\`': r'\A', + r'\'': r'\Z', + r'\(': '(', + r'\)': ')', + r'\|': '|', + '(': r'\(', + ')': r'\)', + '|': r'\|', + '\t': r'\t', + '\n': r'\n', + '\r': r'\r', +} + + +def convert(s, syntax=None): + """Convert a regex regular expression to re syntax. + + The first argument is the regular expression, as a string object, + just like it would be passed to regex.compile(). (I.e., pass the + actual string object -- string quotes must already have been + removed and the standard escape processing has already been done, + e.g. by eval().) + + The optional second argument is the regex syntax variant to be + used. This is an integer mask as passed to regex.set_syntax(); + the flag bits are defined in regex_syntax. When not specified, or + when None is given, the current regex syntax mask (as retrieved by + regex.get_syntax()) is used -- which is 0 by default. + + The return value is a regular expression, as a string object that + could be passed to re.compile(). (I.e., no string quotes have + been added -- use quote() below, or repr().) + + The conversion is not always guaranteed to be correct. More + syntactical analysis should be performed to detect borderline + cases and decide what to do with them. For example, 'x*?' is not + translated correctly. + + """ + table = mastertable.copy() + if syntax is None: + syntax = regex.get_syntax() + if syntax & RE_NO_BK_PARENS: + del table[r'\('], table[r'\)'] + del table['('], table[')'] + if syntax & RE_NO_BK_VBAR: + del table[r'\|'] + del table['|'] + if syntax & RE_BK_PLUS_QM: + table['+'] = r'\+' + table['?'] = r'\?' + table[r'\+'] = '+' + table[r'\?'] = '?' + if syntax & RE_NEWLINE_OR: + table['\n'] = '|' + res = "" + + i = 0 + end = len(s) + while i < end: + c = s[i] + i = i+1 + if c == '\\': + c = s[i] + i = i+1 + key = '\\' + c + key = table.get(key, key) + res = res + key + else: + c = table.get(c, c) + res = res + c + return res + + +def quote(s, quote=None): + """Convert a string object to a quoted string literal. + + This is similar to repr() but will return a "raw" string (r'...' + or r"...") when the string contains backslashes, instead of + doubling all backslashes. The resulting string does *not* always + evaluate to the same string as the original; however it will do + just the right thing when passed into re.compile(). + + The optional second argument forces the string quote; it must be + a single character which is a valid Python string quote. + + """ + if quote is None: + q = "'" + altq = "'" + if q in s and altq not in s: + q = altq + else: + assert quote in ('"', "'") + q = quote + res = q + for c in s: + if c == q: c = '\\' + c + elif c < ' ' or c > '~': c = "\\%03o" % ord(c) + res = res + c + res = res + q + if '\\' in res: + res = 'r' + res + return res + + +def main(): + """Main program -- called when run as a script.""" + import sys + s = eval(sys.stdin.read()) + sys.stdout.write(quote(convert(s))) + if sys.stdout.isatty(): + sys.stdout.write("\n") + + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/regex_syntax.py b/lib-python/2.2/regex_syntax.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/regex_syntax.py @@ -0,0 +1,53 @@ +"""Constants for selecting regexp syntaxes for the obsolete regex module. + +This module is only for backward compatibility. "regex" has now +been replaced by the new regular expression module, "re". + +These bits are passed to regex.set_syntax() to choose among +alternative regexp syntaxes. +""" + +# 1 means plain parentheses serve as grouping, and backslash +# parentheses are needed for literal searching. +# 0 means backslash-parentheses are grouping, and plain parentheses +# are for literal searching. +RE_NO_BK_PARENS = 1 + +# 1 means plain | serves as the "or"-operator, and \| is a literal. +# 0 means \| serves as the "or"-operator, and | is a literal. +RE_NO_BK_VBAR = 2 + +# 0 means plain + or ? serves as an operator, and \+, \? are literals. +# 1 means \+, \? are operators and plain +, ? are literals. +RE_BK_PLUS_QM = 4 + +# 1 means | binds tighter than ^ or $. +# 0 means the contrary. +RE_TIGHT_VBAR = 8 + +# 1 means treat \n as an _OR operator +# 0 means treat it as a normal character +RE_NEWLINE_OR = 16 + +# 0 means that a special characters (such as *, ^, and $) always have +# their special meaning regardless of the surrounding context. +# 1 means that special characters may act as normal characters in some +# contexts. Specifically, this applies to: +# ^ - only special at the beginning, or after ( or | +# $ - only special at the end, or before ) or | +# *, +, ? - only special when not after the beginning, (, or | +RE_CONTEXT_INDEP_OPS = 32 + +# ANSI sequences (\n etc) and \xhh +RE_ANSI_HEX = 64 + +# No GNU extensions +RE_NO_GNU_EXTENSIONS = 128 + +# Now define combinations of bits for the standard possibilities. +RE_SYNTAX_AWK = (RE_NO_BK_PARENS | RE_NO_BK_VBAR | RE_CONTEXT_INDEP_OPS) +RE_SYNTAX_EGREP = (RE_SYNTAX_AWK | RE_NEWLINE_OR) +RE_SYNTAX_GREP = (RE_BK_PLUS_QM | RE_NEWLINE_OR) +RE_SYNTAX_EMACS = 0 + +# (Python's obsolete "regexp" module used a syntax similar to awk.) diff --git a/lib-python/2.2/regsub.py b/lib-python/2.2/regsub.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/regsub.py @@ -0,0 +1,198 @@ +"""Regexp-based split and replace using the obsolete regex module. + +This module is only for backward compatibility. These operations +are now provided by the new regular expression module, "re". + +sub(pat, repl, str): replace first occurrence of pattern in string +gsub(pat, repl, str): replace all occurrences of pattern in string +split(str, pat, maxsplit): split string using pattern as delimiter +splitx(str, pat, maxsplit): split string using pattern as delimiter plus + return delimiters +""" + +import warnings +warnings.warn("the regsub module is deprecated; please use re.sub()", + DeprecationWarning) + +# Ignore further deprecation warnings about this module +warnings.filterwarnings("ignore", "", DeprecationWarning, __name__) + +import regex + +__all__ = ["sub","gsub","split","splitx","capwords"] + +# Replace first occurrence of pattern pat in string str by replacement +# repl. If the pattern isn't found, the string is returned unchanged. +# The replacement may contain references \digit to subpatterns and +# escaped backslashes. The pattern may be a string or an already +# compiled pattern. + +def sub(pat, repl, str): + prog = compile(pat) + if prog.search(str) >= 0: + regs = prog.regs + a, b = regs[0] + str = str[:a] + expand(repl, regs, str) + str[b:] + return str + + +# Replace all (non-overlapping) occurrences of pattern pat in string +# str by replacement repl. The same rules as for sub() apply. +# Empty matches for the pattern are replaced only when not adjacent to +# a previous match, so e.g. gsub('', '-', 'abc') returns '-a-b-c-'. + +def gsub(pat, repl, str): + prog = compile(pat) + new = '' + start = 0 + first = 1 + while prog.search(str, start) >= 0: + regs = prog.regs + a, b = regs[0] + if a == b == start and not first: + if start >= len(str) or prog.search(str, start+1) < 0: + break + regs = prog.regs + a, b = regs[0] + new = new + str[start:a] + expand(repl, regs, str) + start = b + first = 0 + new = new + str[start:] + return new + + +# Split string str in fields separated by delimiters matching pattern +# pat. Only non-empty matches for the pattern are considered, so e.g. +# split('abc', '') returns ['abc']. +# The optional 3rd argument sets the number of splits that are performed. + +def split(str, pat, maxsplit = 0): + return intsplit(str, pat, maxsplit, 0) + +# Split string str in fields separated by delimiters matching pattern +# pat. Only non-empty matches for the pattern are considered, so e.g. +# split('abc', '') returns ['abc']. The delimiters are also included +# in the list. +# The optional 3rd argument sets the number of splits that are performed. + + +def splitx(str, pat, maxsplit = 0): + return intsplit(str, pat, maxsplit, 1) + +# Internal function used to implement split() and splitx(). + +def intsplit(str, pat, maxsplit, retain): + prog = compile(pat) + res = [] + start = next = 0 + splitcount = 0 + while prog.search(str, next) >= 0: + regs = prog.regs + a, b = regs[0] + if a == b: + next = next + 1 + if next >= len(str): + break + else: + res.append(str[start:a]) + if retain: + res.append(str[a:b]) + start = next = b + splitcount = splitcount + 1 + if (maxsplit and (splitcount >= maxsplit)): + break + res.append(str[start:]) + return res + + +# Capitalize words split using a pattern + +def capwords(str, pat='[^a-zA-Z0-9_]+'): + words = splitx(str, pat) + for i in range(0, len(words), 2): + words[i] = words[i].capitalize() + return "".join(words) + + +# Internal subroutines: +# compile(pat): compile a pattern, caching already compiled patterns +# expand(repl, regs, str): expand \digit escapes in replacement string + + +# Manage a cache of compiled regular expressions. +# +# If the pattern is a string a compiled version of it is returned. If +# the pattern has been used before we return an already compiled +# version from the cache; otherwise we compile it now and save the +# compiled version in the cache, along with the syntax it was compiled +# with. Instead of a string, a compiled regular expression can also +# be passed. + +cache = {} + +def compile(pat): + if type(pat) != type(''): + return pat # Assume it is a compiled regex + key = (pat, regex.get_syntax()) + if cache.has_key(key): + prog = cache[key] # Get it from the cache + else: + prog = cache[key] = regex.compile(pat) + return prog + + +def clear_cache(): + global cache + cache = {} + + +# Expand \digit in the replacement. +# Each occurrence of \digit is replaced by the substring of str +# indicated by regs[digit]. To include a literal \ in the +# replacement, double it; other \ escapes are left unchanged (i.e. +# the \ and the following character are both copied). + +def expand(repl, regs, str): + if '\\' not in repl: + return repl + new = '' + i = 0 + ord0 = ord('0') + while i < len(repl): + c = repl[i]; i = i+1 + if c != '\\' or i >= len(repl): + new = new + c + else: + c = repl[i]; i = i+1 + if '0' <= c <= '9': + a, b = regs[ord(c)-ord0] + new = new + str[a:b] + elif c == '\\': + new = new + c + else: + new = new + '\\' + c + return new + + +# Test program, reads sequences "pat repl str" from stdin. +# Optional argument specifies pattern used to split lines. + +def test(): + import sys + if sys.argv[1:]: + delpat = sys.argv[1] + else: + delpat = '[ \t\n]+' + while 1: + if sys.stdin.isatty(): sys.stderr.write('--> ') + line = sys.stdin.readline() + if not line: break + if line[-1] == '\n': line = line[:-1] + fields = split(line, delpat) + if len(fields) != 3: + print 'Sorry, not three fields' + print 'split:', `fields` + continue + [pat, repl, str] = split(line, delpat) + print 'sub :', `sub(pat, repl, str)` + print 'gsub:', `gsub(pat, repl, str)` diff --git a/lib-python/2.2/repr.py b/lib-python/2.2/repr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/repr.py @@ -0,0 +1,95 @@ +"""Redo the `...` (representation) but with limits on most sizes.""" + +__all__ = ["Repr","repr"] + +class Repr: + def __init__(self): + self.maxlevel = 6 + self.maxtuple = 6 + self.maxlist = 6 + self.maxdict = 4 + self.maxstring = 30 + self.maxlong = 40 + self.maxother = 20 + def repr(self, x): + return self.repr1(x, self.maxlevel) + def repr1(self, x, level): + typename = type(x).__name__ + if ' ' in typename: + parts = typename.split() + typename = '_'.join(parts) + if hasattr(self, 'repr_' + typename): + return getattr(self, 'repr_' + typename)(x, level) + else: + s = `x` + if len(s) > self.maxother: + i = max(0, (self.maxother-3)//2) + j = max(0, self.maxother-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + def repr_tuple(self, x, level): + n = len(x) + if n == 0: return '()' + if level <= 0: return '(...)' + s = '' + for i in range(min(n, self.maxtuple)): + if s: s = s + ', ' + s = s + self.repr1(x[i], level-1) + if n > self.maxtuple: s = s + ', ...' + elif n == 1: s = s + ',' + return '(' + s + ')' + def repr_list(self, x, level): + n = len(x) + if n == 0: return '[]' + if level <= 0: return '[...]' + s = '' + for i in range(min(n, self.maxlist)): + if s: s = s + ', ' + s = s + self.repr1(x[i], level-1) + if n > self.maxlist: s = s + ', ...' + return '[' + s + ']' + def repr_dict(self, x, level): + n = len(x) + if n == 0: return '{}' + if level <= 0: return '{...}' + s = '' + keys = x.keys() + keys.sort() + for i in range(min(n, self.maxdict)): + if s: s = s + ', ' + key = keys[i] + s = s + self.repr1(key, level-1) + s = s + ': ' + self.repr1(x[key], level-1) + if n > self.maxdict: s = s + ', ...' + return '{' + s + '}' + def repr_str(self, x, level): + s = `x[:self.maxstring]` + if len(s) > self.maxstring: + i = max(0, (self.maxstring-3)//2) + j = max(0, self.maxstring-3-i) + s = `x[:i] + x[len(x)-j:]` + s = s[:i] + '...' + s[len(s)-j:] + return s + def repr_long(self, x, level): + s = `x` # XXX Hope this isn't too slow... + if len(s) > self.maxlong: + i = max(0, (self.maxlong-3)//2) + j = max(0, self.maxlong-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + def repr_instance(self, x, level): + try: + s = `x` + # Bugs in x.__repr__() can cause arbitrary + # exceptions -- then make up something + except: + return '<' + x.__class__.__name__ + ' instance at ' + \ + hex(id(x))[2:] + '>' + if len(s) > self.maxstring: + i = max(0, (self.maxstring-3)//2) + j = max(0, self.maxstring-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + +aRepr = Repr() +repr = aRepr.repr diff --git a/lib-python/2.2/rexec.py b/lib-python/2.2/rexec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/rexec.py @@ -0,0 +1,592 @@ +"""Restricted execution facilities. + +The class RExec exports methods r_exec(), r_eval(), r_execfile(), and +r_import(), which correspond roughly to the built-in operations +exec, eval(), execfile() and import, but executing the code in an +environment that only exposes those built-in operations that are +deemed safe. To this end, a modest collection of 'fake' modules is +created which mimics the standard modules by the same names. It is a +policy decision which built-in modules and operations are made +available; this module provides a reasonable default, but derived +classes can change the policies e.g. by overriding or extending class +variables like ok_builtin_modules or methods like make_sys(). + +XXX To do: +- r_open should allow writing tmp dir +- r_exec etc. with explicit globals/locals? (Use rexec("exec ... in ...")?) + +""" + + +import sys +import __builtin__ +import os +import ihooks +import imp + +__all__ = ["RExec"] + +class FileBase: + + ok_file_methods = ('fileno', 'flush', 'isatty', 'read', 'readline', + 'readlines', 'seek', 'tell', 'write', 'writelines') + + +class FileWrapper(FileBase): + + # XXX This is just like a Bastion -- should use that! + + def __init__(self, f): + self.f = f + for m in self.ok_file_methods: + if not hasattr(self, m) and hasattr(f, m): + setattr(self, m, getattr(f, m)) + + def close(self): + self.flush() + + +TEMPLATE = """ +def %s(self, *args): + return apply(getattr(self.mod, self.name).%s, args) +""" + +class FileDelegate(FileBase): + + def __init__(self, mod, name): + self.mod = mod + self.name = name + + for m in FileBase.ok_file_methods + ('close',): + exec TEMPLATE % (m, m) + + +class RHooks(ihooks.Hooks): + + def __init__(self, *args): + # Hacks to support both old and new interfaces: + # old interface was RHooks(rexec[, verbose]) + # new interface is RHooks([verbose]) + verbose = 0 + rexec = None + if args and type(args[-1]) == type(0): + verbose = args[-1] + args = args[:-1] + if args and hasattr(args[0], '__class__'): + rexec = args[0] + args = args[1:] + if args: + raise TypeError, "too many arguments" + ihooks.Hooks.__init__(self, verbose) + self.rexec = rexec + + def set_rexec(self, rexec): + # Called by RExec instance to complete initialization + self.rexec = rexec + + def get_suffixes(self): + return self.rexec.get_suffixes() + + def is_builtin(self, name): + return self.rexec.is_builtin(name) + + def init_builtin(self, name): + m = __import__(name) + return self.rexec.copy_except(m, ()) + + def init_frozen(self, name): raise SystemError, "don't use this" + def load_source(self, *args): raise SystemError, "don't use this" + def load_compiled(self, *args): raise SystemError, "don't use this" + def load_package(self, *args): raise SystemError, "don't use this" + + def load_dynamic(self, name, filename, file): + return self.rexec.load_dynamic(name, filename, file) + + def add_module(self, name): + return self.rexec.add_module(name) + + def modules_dict(self): + return self.rexec.modules + + def default_path(self): + return self.rexec.modules['sys'].path + + +# XXX Backwards compatibility +RModuleLoader = ihooks.FancyModuleLoader +RModuleImporter = ihooks.ModuleImporter + + +class RExec(ihooks._Verbose): + """Basic restricted execution framework. + + Code executed in this restricted environment will only have access to + modules and functions that are deemed safe; you can subclass RExec to + add or remove capabilities as desired. + + The RExec class can prevent code from performing unsafe operations like + reading or writing disk files, or using TCP/IP sockets. However, it does + not protect against code using extremely large amounts of memory or + processor time. + + """ + + ok_path = tuple(sys.path) # That's a policy decision + + ok_builtin_modules = ('audioop', 'array', 'binascii', + 'cmath', 'errno', 'imageop', + 'marshal', 'math', 'md5', 'operator', + 'parser', 'regex', 'pcre', 'rotor', 'select', + 'sha', '_sre', 'strop', 'struct', 'time') + + ok_posix_names = ('error', 'fstat', 'listdir', 'lstat', 'readlink', + 'stat', 'times', 'uname', 'getpid', 'getppid', + 'getcwd', 'getuid', 'getgid', 'geteuid', 'getegid') + + ok_sys_names = ('byteorder', 'copyright', 'exit', 'getdefaultencoding', + 'getrefcount', 'hexversion', 'maxint', 'maxunicode', + 'platform', 'ps1', 'ps2', 'version', 'version_info') + + nok_builtin_names = ('open', 'file', 'reload', '__import__') + + ok_file_types = (imp.C_EXTENSION, imp.PY_SOURCE) + + def __init__(self, hooks = None, verbose = 0): + """Returns an instance of the RExec class. + + The hooks parameter is an instance of the RHooks class or a subclass + of it. If it is omitted or None, the default RHooks class is + instantiated. + + Whenever the RExec module searches for a module (even a built-in one) + or reads a module's code, it doesn't actually go out to the file + system itself. Rather, it calls methods of an RHooks instance that + was passed to or created by its constructor. (Actually, the RExec + object doesn't make these calls --- they are made by a module loader + object that's part of the RExec object. This allows another level of + flexibility, which can be useful when changing the mechanics of + import within the restricted environment.) + + By providing an alternate RHooks object, we can control the file + system accesses made to import a module, without changing the + actual algorithm that controls the order in which those accesses are + made. For instance, we could substitute an RHooks object that + passes all filesystem requests to a file server elsewhere, via some + RPC mechanism such as ILU. Grail's applet loader uses this to support + importing applets from a URL for a directory. + + If the verbose parameter is true, additional debugging output may be + sent to standard output. + + """ + + raise RuntimeError, "This code is not secure in Python 2.2 and 2.3" + + ihooks._Verbose.__init__(self, verbose) + # XXX There's a circular reference here: + self.hooks = hooks or RHooks(verbose) + self.hooks.set_rexec(self) + self.modules = {} + self.ok_dynamic_modules = self.ok_builtin_modules + list = [] + for mname in self.ok_builtin_modules: + if mname in sys.builtin_module_names: + list.append(mname) + self.ok_builtin_modules = tuple(list) + self.set_trusted_path() + self.make_builtin() + self.make_initial_modules() + # make_sys must be last because it adds the already created + # modules to its builtin_module_names + self.make_sys() + self.loader = RModuleLoader(self.hooks, verbose) + self.importer = RModuleImporter(self.loader, verbose) + + def set_trusted_path(self): + # Set the path from which dynamic modules may be loaded. + # Those dynamic modules must also occur in ok_builtin_modules + self.trusted_path = filter(os.path.isabs, sys.path) + + def load_dynamic(self, name, filename, file): + if name not in self.ok_dynamic_modules: + raise ImportError, "untrusted dynamic module: %s" % name + if sys.modules.has_key(name): + src = sys.modules[name] + else: + src = imp.load_dynamic(name, filename, file) + dst = self.copy_except(src, []) + return dst + + def make_initial_modules(self): + self.make_main() + self.make_osname() + + # Helpers for RHooks + + def get_suffixes(self): + return [item # (suff, mode, type) + for item in imp.get_suffixes() + if item[2] in self.ok_file_types] + + def is_builtin(self, mname): + return mname in self.ok_builtin_modules + + # The make_* methods create specific built-in modules + + def make_builtin(self): + m = self.copy_except(__builtin__, self.nok_builtin_names) + m.__import__ = self.r_import + m.reload = self.r_reload + m.open = m.file = self.r_open + + def make_main(self): + m = self.add_module('__main__') + + def make_osname(self): + osname = os.name + src = __import__(osname) + dst = self.copy_only(src, self.ok_posix_names) + dst.environ = e = {} + for key, value in os.environ.items(): + e[key] = value + + def make_sys(self): + m = self.copy_only(sys, self.ok_sys_names) + m.modules = self.modules + m.argv = ['RESTRICTED'] + m.path = map(None, self.ok_path) + m.exc_info = self.r_exc_info + m = self.modules['sys'] + l = self.modules.keys() + list(self.ok_builtin_modules) + l.sort() + m.builtin_module_names = tuple(l) + + # The copy_* methods copy existing modules with some changes + + def copy_except(self, src, exceptions): + dst = self.copy_none(src) + for name in dir(src): + setattr(dst, name, getattr(src, name)) + for name in exceptions: + try: + delattr(dst, name) + except AttributeError: + pass + return dst + + def copy_only(self, src, names): + dst = self.copy_none(src) + for name in names: + try: + value = getattr(src, name) + except AttributeError: + continue + setattr(dst, name, value) + return dst + + def copy_none(self, src): + m = self.add_module(src.__name__) + m.__doc__ = src.__doc__ + return m + + # Add a module -- return an existing module or create one + + def add_module(self, mname): + m = self.modules.get(mname) + if m is None: + self.modules[mname] = m = self.hooks.new_module(mname) + m.__builtins__ = self.modules['__builtin__'] + return m + + # The r* methods are public interfaces + + def r_exec(self, code): + """Execute code within a restricted environment. + + The code parameter must either be a string containing one or more + lines of Python code, or a compiled code object, which will be + executed in the restricted environment's __main__ module. + + """ + m = self.add_module('__main__') + exec code in m.__dict__ + + def r_eval(self, code): + """Evaluate code within a restricted environment. + + The code parameter must either be a string containing a Python + expression, or a compiled code object, which will be evaluated in + the restricted environment's __main__ module. The value of the + expression or code object will be returned. + + """ + m = self.add_module('__main__') + return eval(code, m.__dict__) + + def r_execfile(self, file): + """Execute the Python code in the file in the restricted + environment's __main__ module. + + """ + m = self.add_module('__main__') + execfile(file, m.__dict__) + + def r_import(self, mname, globals={}, locals={}, fromlist=[]): + """Import a module, raising an ImportError exception if the module + is considered unsafe. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + """ + return self.importer.import_module(mname, globals, locals, fromlist) + + def r_reload(self, m): + """Reload the module object, re-parsing and re-initializing it. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + """ + return self.importer.reload(m) + + def r_unload(self, m): + """Unload the module. + + Removes it from the restricted environment's sys.modules dictionary. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + """ + return self.importer.unload(m) + + # The s_* methods are similar but also swap std{in,out,err} + + def make_delegate_files(self): + s = self.modules['sys'] + self.delegate_stdin = FileDelegate(s, 'stdin') + self.delegate_stdout = FileDelegate(s, 'stdout') + self.delegate_stderr = FileDelegate(s, 'stderr') + self.restricted_stdin = FileWrapper(sys.stdin) + self.restricted_stdout = FileWrapper(sys.stdout) + self.restricted_stderr = FileWrapper(sys.stderr) + + def set_files(self): + if not hasattr(self, 'save_stdin'): + self.save_files() + if not hasattr(self, 'delegate_stdin'): + self.make_delegate_files() + s = self.modules['sys'] + s.stdin = self.restricted_stdin + s.stdout = self.restricted_stdout + s.stderr = self.restricted_stderr + sys.stdin = self.delegate_stdin + sys.stdout = self.delegate_stdout + sys.stderr = self.delegate_stderr + + def reset_files(self): + self.restore_files() + s = self.modules['sys'] + self.restricted_stdin = s.stdin + self.restricted_stdout = s.stdout + self.restricted_stderr = s.stderr + + + def save_files(self): + self.save_stdin = sys.stdin + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + + def restore_files(self): + sys.stdin = self.save_stdin + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + + def s_apply(self, func, args=(), kw=None): + self.save_files() + try: + self.set_files() + if kw: + r = apply(func, args, kw) + else: + r = apply(func, args) + finally: + self.restore_files() + return r + + def s_exec(self, *args): + """Execute code within a restricted environment. + + Similar to the r_exec() method, but the code will be granted access + to restricted versions of the standard I/O streams sys.stdin, + sys.stderr, and sys.stdout. + + The code parameter must either be a string containing one or more + lines of Python code, or a compiled code object, which will be + executed in the restricted environment's __main__ module. + + """ + return self.s_apply(self.r_exec, args) + + def s_eval(self, *args): + """Evaluate code within a restricted environment. + + Similar to the r_eval() method, but the code will be granted access + to restricted versions of the standard I/O streams sys.stdin, + sys.stderr, and sys.stdout. + + The code parameter must either be a string containing a Python + expression, or a compiled code object, which will be evaluated in + the restricted environment's __main__ module. The value of the + expression or code object will be returned. + + """ + return self.s_apply(self.r_eval, args) + + def s_execfile(self, *args): + """Execute the Python code in the file in the restricted + environment's __main__ module. + + Similar to the r_execfile() method, but the code will be granted + access to restricted versions of the standard I/O streams sys.stdin, + sys.stderr, and sys.stdout. + + """ + return self.s_apply(self.r_execfile, args) + + def s_import(self, *args): + """Import a module, raising an ImportError exception if the module + is considered unsafe. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + Similar to the r_import() method, but has access to restricted + versions of the standard I/O streams sys.stdin, sys.stderr, and + sys.stdout. + + """ + return self.s_apply(self.r_import, args) + + def s_reload(self, *args): + """Reload the module object, re-parsing and re-initializing it. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + Similar to the r_reload() method, but has access to restricted + versions of the standard I/O streams sys.stdin, sys.stderr, and + sys.stdout. + + """ + return self.s_apply(self.r_reload, args) + + def s_unload(self, *args): + """Unload the module. + + Removes it from the restricted environment's sys.modules dictionary. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + Similar to the r_unload() method, but has access to restricted + versions of the standard I/O streams sys.stdin, sys.stderr, and + sys.stdout. + + """ + return self.s_apply(self.r_unload, args) + + # Restricted open(...) + + def r_open(self, file, mode='r', buf=-1): + """Method called when open() is called in the restricted environment. + + The arguments are identical to those of the open() function, and a + file object (or a class instance compatible with file objects) + should be returned. RExec's default behaviour is allow opening + any file for reading, but forbidding any attempt to write a file. + + This method is implicitly called by code executing in the + restricted environment. Overriding this method in a subclass is + used to change the policies enforced by a restricted environment. + + """ + if mode not in ('r', 'rb'): + raise IOError, "can't open files for writing in restricted mode" + return open(file, mode, buf) + + # Restricted version of sys.exc_info() + + def r_exc_info(self): + ty, va, tr = sys.exc_info() + tr = None + return ty, va, tr + + +def test(): + import getopt, traceback + opts, args = getopt.getopt(sys.argv[1:], 'vt:') + verbose = 0 + trusted = [] + for o, a in opts: + if o == '-v': + verbose = verbose+1 + if o == '-t': + trusted.append(a) + r = RExec(verbose=verbose) + if trusted: + r.ok_builtin_modules = r.ok_builtin_modules + tuple(trusted) + if args: + r.modules['sys'].argv = args + r.modules['sys'].path.insert(0, os.path.dirname(args[0])) + else: + r.modules['sys'].path.insert(0, "") + fp = sys.stdin + if args and args[0] != '-': + try: + fp = open(args[0]) + except IOError, msg: + print "%s: can't open file %s" % (sys.argv[0], `args[0]`) + return 1 + if fp.isatty(): + print "*** RESTRICTED *** Python", sys.version + print 'Type "help", "copyright", "credits" or "license" ' \ + 'for more information.' + + while 1: + try: + try: + s = raw_input('>>> ') + except EOFError: + print + break + if s and s[0] != '#': + s = s + '\n' + c = compile(s, '', 'single') + r.s_exec(c) + except SystemExit, n: + return n + except: + traceback.print_exc() + else: + text = fp.read() + fp.close() + c = compile(text, fp.name, 'exec') + try: + r.s_exec(c) + except SystemExit, n: + return n + except: + traceback.print_exc() + return 1 + + +if __name__ == '__main__': + sys.exit(test()) diff --git a/lib-python/2.2/rfc822.py b/lib-python/2.2/rfc822.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/rfc822.py @@ -0,0 +1,1010 @@ +"""RFC 2822 message manipulation. + +Note: This is only a very rough sketch of a full RFC-822 parser; in particular +the tokenizing of addresses does not adhere to all the quoting rules. + +Note: RFC 2822 is a long awaited update to RFC 822. This module should +conform to RFC 2822, and is thus mis-named (it's not worth renaming it). Some +effort at RFC 2822 updates have been made, but a thorough audit has not been +performed. Consider any RFC 2822 non-conformance to be a bug. + + RFC 2822: http://www.faqs.org/rfcs/rfc2822.html + RFC 822 : http://www.faqs.org/rfcs/rfc822.html (obsolete) + +Directions for use: + +To create a Message object: first open a file, e.g.: + + fp = open(file, 'r') + +You can use any other legal way of getting an open file object, e.g. use +sys.stdin or call os.popen(). Then pass the open file object to the Message() +constructor: + + m = Message(fp) + +This class can work with any input object that supports a readline method. If +the input object has seek and tell capability, the rewindbody method will +work; also illegal lines will be pushed back onto the input stream. If the +input object lacks seek but has an `unread' method that can push back a line +of input, Message will use that to push back illegal lines. Thus this class +can be used to parse messages coming from a buffered stream. + +The optional `seekable' argument is provided as a workaround for certain stdio +libraries in which tell() discards buffered data before discovering that the +lseek() system call doesn't work. For maximum portability, you should set the +seekable argument to zero to prevent that initial \code{tell} when passing in +an unseekable object such as a a file object created from a socket object. If +it is 1 on entry -- which it is by default -- the tell() method of the open +file object is called once; if this raises an exception, seekable is reset to +0. For other nonzero values of seekable, this test is not made. + +To get the text of a particular header there are several methods: + + str = m.getheader(name) + str = m.getrawheader(name) + +where name is the name of the header, e.g. 'Subject'. The difference is that +getheader() strips the leading and trailing whitespace, while getrawheader() +doesn't. Both functions retain embedded whitespace (including newlines) +exactly as they are specified in the header, and leave the case of the text +unchanged. + +For addresses and address lists there are functions + + realname, mailaddress = m.getaddr(name) + list = m.getaddrlist(name) + +where the latter returns a list of (realname, mailaddr) tuples. + +There is also a method + + time = m.getdate(name) + +which parses a Date-like field and returns a time-compatible tuple, +i.e. a tuple such as returned by time.localtime() or accepted by +time.mktime(). + +See the class definition for lower level access methods. + +There are also some utility functions here. +""" +# Cleanup and extensions by Eric S. Raymond + +import time + +__all__ = ["Message","AddressList","parsedate","parsedate_tz","mktime_tz"] + +_blanklines = ('\r\n', '\n') # Optimization for islast() + + +class Message: + """Represents a single RFC 2822-compliant message.""" + + def __init__(self, fp, seekable = 1): + """Initialize the class instance and read the headers.""" + if seekable == 1: + # Exercise tell() to make sure it works + # (and then assume seek() works, too) + try: + fp.tell() + except (AttributeError, IOError): + seekable = 0 + else: + seekable = 1 + self.fp = fp + self.seekable = seekable + self.startofheaders = None + self.startofbody = None + # + if self.seekable: + try: + self.startofheaders = self.fp.tell() + except IOError: + self.seekable = 0 + # + self.readheaders() + # + if self.seekable: + try: + self.startofbody = self.fp.tell() + except IOError: + self.seekable = 0 + + def rewindbody(self): + """Rewind the file to the start of the body (if seekable).""" + if not self.seekable: + raise IOError, "unseekable file" + self.fp.seek(self.startofbody) + + def readheaders(self): + """Read header lines. + + Read header lines up to the entirely blank line that terminates them. + The (normally blank) line that ends the headers is skipped, but not + included in the returned list. If a non-header line ends the headers, + (which is an error), an attempt is made to backspace over it; it is + never included in the returned list. + + The variable self.status is set to the empty string if all went well, + otherwise it is an error message. The variable self.headers is a + completely uninterpreted list of lines contained in the header (so + printing them will reproduce the header exactly as it appears in the + file). + """ + self.dict = {} + self.unixfrom = '' + self.headers = list = [] + self.status = '' + headerseen = "" + firstline = 1 + startofline = unread = tell = None + if hasattr(self.fp, 'unread'): + unread = self.fp.unread + elif self.seekable: + tell = self.fp.tell + while 1: + if tell: + try: + startofline = tell() + except IOError: + startofline = tell = None + self.seekable = 0 + line = self.fp.readline() + if not line: + self.status = 'EOF in headers' + break + # Skip unix From name time lines + if firstline and line.startswith('From '): + self.unixfrom = self.unixfrom + line + continue + firstline = 0 + if headerseen and line[0] in ' \t': + # It's a continuation line. + list.append(line) + x = (self.dict[headerseen] + "\n " + line.strip()) + self.dict[headerseen] = x.strip() + continue + elif self.iscomment(line): + # It's a comment. Ignore it. + continue + elif self.islast(line): + # Note! No pushback here! The delimiter line gets eaten. + break + headerseen = self.isheader(line) + if headerseen: + # It's a legal header line, save it. + list.append(line) + self.dict[headerseen] = line[len(headerseen)+1:].strip() + continue + else: + # It's not a header line; throw it back and stop here. + if not self.dict: + self.status = 'No headers' + else: + self.status = 'Non-header line where header expected' + # Try to undo the read. + if unread: + unread(line) + elif tell: + self.fp.seek(startofline) + else: + self.status = self.status + '; bad seek' + break + + def isheader(self, line): + """Determine whether a given line is a legal header. + + This method should return the header name, suitably canonicalized. + You may override this method in order to use Message parsing on tagged + data in RFC 2822-like formats with special header formats. + """ + i = line.find(':') + if i > 0: + return line[:i].lower() + else: + return None + + def islast(self, line): + """Determine whether a line is a legal end of RFC 2822 headers. + + You may override this method if your application wants to bend the + rules, e.g. to strip trailing whitespace, or to recognize MH template + separators ('--------'). For convenience (e.g. for code reading from + sockets) a line consisting of \r\n also matches. + """ + return line in _blanklines + + def iscomment(self, line): + """Determine whether a line should be skipped entirely. + + You may override this method in order to use Message parsing on tagged + data in RFC 2822-like formats that support embedded comments or + free-text data. + """ + return None + + def getallmatchingheaders(self, name): + """Find all header lines matching a given header name. + + Look through the list of headers and find all lines matching a given + header name (and their continuation lines). A list of the lines is + returned, without interpretation. If the header does not occur, an + empty list is returned. If the header occurs multiple times, all + occurrences are returned. Case is not important in the header name. + """ + name = name.lower() + ':' + n = len(name) + list = [] + hit = 0 + for line in self.headers: + if line[:n].lower() == name: + hit = 1 + elif not line[:1].isspace(): + hit = 0 + if hit: + list.append(line) + return list + + def getfirstmatchingheader(self, name): + """Get the first header line matching name. + + This is similar to getallmatchingheaders, but it returns only the + first matching header (and its continuation lines). + """ + name = name.lower() + ':' + n = len(name) + list = [] + hit = 0 + for line in self.headers: + if hit: + if not line[:1].isspace(): + break + elif line[:n].lower() == name: + hit = 1 + if hit: + list.append(line) + return list + + def getrawheader(self, name): + """A higher-level interface to getfirstmatchingheader(). + + Return a string containing the literal text of the header but with the + keyword stripped. All leading, trailing and embedded whitespace is + kept in the string, however. Return None if the header does not + occur. + """ + + list = self.getfirstmatchingheader(name) + if not list: + return None + list[0] = list[0][len(name) + 1:] + return ''.join(list) + + def getheader(self, name, default=None): + """Get the header value for a name. + + This is the normal interface: it returns a stripped version of the + header value for a given header name, or None if it doesn't exist. + This uses the dictionary version which finds the *last* such header. + """ + try: + return self.dict[name.lower()] + except KeyError: + return default + get = getheader + + def getheaders(self, name): + """Get all values for a header. + + This returns a list of values for headers given more than once; each + value in the result list is stripped in the same way as the result of + getheader(). If the header is not given, return an empty list. + """ + result = [] + current = '' + have_header = 0 + for s in self.getallmatchingheaders(name): + if s[0].isspace(): + if current: + current = "%s\n %s" % (current, s.strip()) + else: + current = s.strip() + else: + if have_header: + result.append(current) + current = s[s.find(":") + 1:].strip() + have_header = 1 + if have_header: + result.append(current) + return result + + def getaddr(self, name): + """Get a single address from a header, as a tuple. + + An example return value: + ('Guido van Rossum', 'guido at cwi.nl') + """ + # New, by Ben Escoto + alist = self.getaddrlist(name) + if alist: + return alist[0] + else: + return (None, None) + + def getaddrlist(self, name): + """Get a list of addresses from a header. + + Retrieves a list of addresses from a header, where each address is a + tuple as returned by getaddr(). Scans all named headers, so it works + properly with multiple To: or Cc: headers for example. + """ + raw = [] + for h in self.getallmatchingheaders(name): + if h[0] in ' \t': + raw.append(h) + else: + if raw: + raw.append(', ') + i = h.find(':') + if i > 0: + addr = h[i+1:] + raw.append(addr) + alladdrs = ''.join(raw) + a = AddrlistClass(alladdrs) + return a.getaddrlist() + + def getdate(self, name): + """Retrieve a date field from a header. + + Retrieves a date field from the named header, returning a tuple + compatible with time.mktime(). + """ + try: + data = self[name] + except KeyError: + return None + return parsedate(data) + + def getdate_tz(self, name): + """Retrieve a date field from a header as a 10-tuple. + + The first 9 elements make up a tuple compatible with time.mktime(), + and the 10th is the offset of the poster's time zone from GMT/UTC. + """ + try: + data = self[name] + except KeyError: + return None + return parsedate_tz(data) + + + # Access as a dictionary (only finds *last* header of each type): + + def __len__(self): + """Get the number of headers in a message.""" + return len(self.dict) + + def __getitem__(self, name): + """Get a specific header, as from a dictionary.""" + return self.dict[name.lower()] + + def __setitem__(self, name, value): + """Set the value of a header. + + Note: This is not a perfect inversion of __getitem__, because any + changed headers get stuck at the end of the raw-headers list rather + than where the altered header was. + """ + del self[name] # Won't fail if it doesn't exist + self.dict[name.lower()] = value + text = name + ": " + value + lines = text.split("\n") + for line in lines: + self.headers.append(line + "\n") + + def __delitem__(self, name): + """Delete all occurrences of a specific header, if it is present.""" + name = name.lower() + if not self.dict.has_key(name): + return + del self.dict[name] + name = name + ':' + n = len(name) + list = [] + hit = 0 + for i in range(len(self.headers)): + line = self.headers[i] + if line[:n].lower() == name: + hit = 1 + elif not line[:1].isspace(): + hit = 0 + if hit: + list.append(i) + list.reverse() + for i in list: + del self.headers[i] + + def setdefault(self, name, default=""): + lowername = name.lower() + if self.dict.has_key(lowername): + return self.dict[lowername] + else: + text = name + ": " + default + lines = text.split("\n") + for line in lines: + self.headers.append(line + "\n") + self.dict[lowername] = default + return default + + def has_key(self, name): + """Determine whether a message contains the named header.""" + return self.dict.has_key(name.lower()) + + def keys(self): + """Get all of a message's header field names.""" + return self.dict.keys() + + def values(self): + """Get all of a message's header field values.""" + return self.dict.values() + + def items(self): + """Get all of a message's headers. + + Returns a list of name, value tuples. + """ + return self.dict.items() + + def __str__(self): + str = '' + for hdr in self.headers: + str = str + hdr + return str + + +# Utility functions +# ----------------- + +# XXX Should fix unquote() and quote() to be really conformant. +# XXX The inverses of the parse functions may also be useful. + + +def unquote(str): + """Remove quotes from a string.""" + if len(str) > 1: + if str[0] == '"' and str[-1:] == '"': + return str[1:-1] + if str[0] == '<' and str[-1:] == '>': + return str[1:-1] + return str + + +def quote(str): + """Add quotes around a string.""" + return str.replace('\\', '\\\\').replace('"', '\\"') + + +def parseaddr(address): + """Parse an address into a (realname, mailaddr) tuple.""" + a = AddressList(address) + list = a.addresslist + if not list: + return (None, None) + else: + return list[0] + + +class AddrlistClass: + """Address parser class by Ben Escoto. + + To understand what this class does, it helps to have a copy of + RFC 2822 in front of you. + + http://www.faqs.org/rfcs/rfc2822.html + + Note: this class interface is deprecated and may be removed in the future. + Use rfc822.AddressList instead. + """ + + def __init__(self, field): + """Initialize a new instance. + + `field' is an unparsed address header field, containing one or more + addresses. + """ + self.specials = '()<>@,:;.\"[]' + self.pos = 0 + self.LWS = ' \t' + self.CR = '\r\n' + self.atomends = self.specials + self.LWS + self.CR + # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it + # is obsolete syntax. RFC 2822 requires that we recognize obsolete + # syntax, so allow dots in phrases. + self.phraseends = self.atomends.replace('.', '') + self.field = field + self.commentlist = [] + + def gotonext(self): + """Parse up to the start of the next address.""" + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS + '\n\r': + self.pos = self.pos + 1 + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + else: break + + def getaddrlist(self): + """Parse all addresses. + + Returns a list containing all of the addresses. + """ + result = [] + while 1: + ad = self.getaddress() + if ad: + result += ad + else: + break + return result + + def getaddress(self): + """Parse the next address.""" + self.commentlist = [] + self.gotonext() + + oldpos = self.pos + oldcl = self.commentlist + plist = self.getphraselist() + + self.gotonext() + returnlist = [] + + if self.pos >= len(self.field): + # Bad email address technically, no domain. + if plist: + returnlist = [(' '.join(self.commentlist), plist[0])] + + elif self.field[self.pos] in '.@': + # email address is just an addrspec + # this isn't very efficient since we start over + self.pos = oldpos + self.commentlist = oldcl + addrspec = self.getaddrspec() + returnlist = [(' '.join(self.commentlist), addrspec)] + + elif self.field[self.pos] == ':': + # address is a group + returnlist = [] + + fieldlen = len(self.field) + self.pos = self.pos + 1 + while self.pos < len(self.field): + self.gotonext() + if self.pos < fieldlen and self.field[self.pos] == ';': + self.pos = self.pos + 1 + break + returnlist = returnlist + self.getaddress() + + elif self.field[self.pos] == '<': + # Address is a phrase then a route addr + routeaddr = self.getrouteaddr() + + if self.commentlist: + returnlist = [(' '.join(plist) + ' (' + \ + ' '.join(self.commentlist) + ')', routeaddr)] + else: returnlist = [(' '.join(plist), routeaddr)] + + else: + if plist: + returnlist = [(' '.join(self.commentlist), plist[0])] + elif self.field[self.pos] in self.specials: + self.pos = self.pos + 1 + + self.gotonext() + if self.pos < len(self.field) and self.field[self.pos] == ',': + self.pos = self.pos + 1 + return returnlist + + def getrouteaddr(self): + """Parse a route address (Return-path value). + + This method just skips all the route stuff and returns the addrspec. + """ + if self.field[self.pos] != '<': + return + + expectroute = 0 + self.pos = self.pos + 1 + self.gotonext() + adlist = "" + while self.pos < len(self.field): + if expectroute: + self.getdomain() + expectroute = 0 + elif self.field[self.pos] == '>': + self.pos = self.pos + 1 + break + elif self.field[self.pos] == '@': + self.pos = self.pos + 1 + expectroute = 1 + elif self.field[self.pos] == ':': + self.pos = self.pos + 1 + else: + adlist = self.getaddrspec() + self.pos = self.pos + 1 + break + self.gotonext() + + return adlist + + def getaddrspec(self): + """Parse an RFC 2822 addr-spec.""" + aslist = [] + + self.gotonext() + while self.pos < len(self.field): + if self.field[self.pos] == '.': + aslist.append('.') + self.pos = self.pos + 1 + elif self.field[self.pos] == '"': + aslist.append('"%s"' % self.getquote()) + elif self.field[self.pos] in self.atomends: + break + else: aslist.append(self.getatom()) + self.gotonext() + + if self.pos >= len(self.field) or self.field[self.pos] != '@': + return ''.join(aslist) + + aslist.append('@') + self.pos = self.pos + 1 + self.gotonext() + return ''.join(aslist) + self.getdomain() + + def getdomain(self): + """Get the complete domain name from an address.""" + sdlist = [] + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS: + self.pos = self.pos + 1 + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + elif self.field[self.pos] == '[': + sdlist.append(self.getdomainliteral()) + elif self.field[self.pos] == '.': + self.pos = self.pos + 1 + sdlist.append('.') + elif self.field[self.pos] in self.atomends: + break + else: sdlist.append(self.getatom()) + return ''.join(sdlist) + + def getdelimited(self, beginchar, endchars, allowcomments = 1): + """Parse a header fragment delimited by special characters. + + `beginchar' is the start character for the fragment. If self is not + looking at an instance of `beginchar' then getdelimited returns the + empty string. + + `endchars' is a sequence of allowable end-delimiting characters. + Parsing stops when one of these is encountered. + + If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed + within the parsed fragment. + """ + if self.field[self.pos] != beginchar: + return '' + + slist = [''] + quote = 0 + self.pos = self.pos + 1 + while self.pos < len(self.field): + if quote == 1: + slist.append(self.field[self.pos]) + quote = 0 + elif self.field[self.pos] in endchars: + self.pos = self.pos + 1 + break + elif allowcomments and self.field[self.pos] == '(': + slist.append(self.getcomment()) + elif self.field[self.pos] == '\\': + quote = 1 + else: + slist.append(self.field[self.pos]) + self.pos = self.pos + 1 + + return ''.join(slist) + + def getquote(self): + """Get a quote-delimited fragment from self's field.""" + return self.getdelimited('"', '"\r', 0) + + def getcomment(self): + """Get a parenthesis-delimited fragment from self's field.""" + return self.getdelimited('(', ')\r', 1) + + def getdomainliteral(self): + """Parse an RFC 2822 domain-literal.""" + return '[%s]' % self.getdelimited('[', ']\r', 0) + + def getatom(self, atomends=None): + """Parse an RFC 2822 atom. + + Optional atomends specifies a different set of end token delimiters + (the default is to use self.atomends). This is used e.g. in + getphraselist() since phrase endings must not include the `.' (which + is legal in phrases).""" + atomlist = [''] + if atomends is None: + atomends = self.atomends + + while self.pos < len(self.field): + if self.field[self.pos] in atomends: + break + else: atomlist.append(self.field[self.pos]) + self.pos = self.pos + 1 + + return ''.join(atomlist) + + def getphraselist(self): + """Parse a sequence of RFC 2822 phrases. + + A phrase is a sequence of words, which are in turn either RFC 2822 + atoms or quoted-strings. Phrases are canonicalized by squeezing all + runs of continuous whitespace into one space. + """ + plist = [] + + while self.pos < len(self.field): + if self.field[self.pos] in self.LWS: + self.pos = self.pos + 1 + elif self.field[self.pos] == '"': + plist.append(self.getquote()) + elif self.field[self.pos] == '(': + self.commentlist.append(self.getcomment()) + elif self.field[self.pos] in self.phraseends: + break + else: + plist.append(self.getatom(self.phraseends)) + + return plist + +class AddressList(AddrlistClass): + """An AddressList encapsulates a list of parsed RFC 2822 addresses.""" + def __init__(self, field): + AddrlistClass.__init__(self, field) + if field: + self.addresslist = self.getaddrlist() + else: + self.addresslist = [] + + def __len__(self): + return len(self.addresslist) + + def __str__(self): + return ", ".join(map(dump_address_pair, self.addresslist)) + + def __add__(self, other): + # Set union + newaddr = AddressList(None) + newaddr.addresslist = self.addresslist[:] + for x in other.addresslist: + if not x in self.addresslist: + newaddr.addresslist.append(x) + return newaddr + + def __iadd__(self, other): + # Set union, in-place + for x in other.addresslist: + if not x in self.addresslist: + self.addresslist.append(x) + return self + + def __sub__(self, other): + # Set difference + newaddr = AddressList(None) + for x in self.addresslist: + if not x in other.addresslist: + newaddr.addresslist.append(x) + return newaddr + + def __isub__(self, other): + # Set difference, in-place + for x in other.addresslist: + if x in self.addresslist: + self.addresslist.remove(x) + return self + + def __getitem__(self, index): + # Make indexing, slices, and 'in' work + return self.addresslist[index] + +def dump_address_pair(pair): + """Dump a (name, address) pair in a canonicalized form.""" + if pair[0]: + return '"' + pair[0] + '" <' + pair[1] + '>' + else: + return pair[1] + +# Parse a date field + +_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', + 'aug', 'sep', 'oct', 'nov', 'dec', + 'january', 'february', 'march', 'april', 'may', 'june', 'july', + 'august', 'september', 'october', 'november', 'december'] +_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] + +# The timezone table does not include the military time zones defined +# in RFC822, other than Z. According to RFC1123, the description in +# RFC822 gets the signs wrong, so we can't rely on any such time +# zones. RFC1123 recommends that numeric timezone indicators be used +# instead of timezone names. + +_timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0, + 'AST': -400, 'ADT': -300, # Atlantic (used in Canada) + 'EST': -500, 'EDT': -400, # Eastern + 'CST': -600, 'CDT': -500, # Central + 'MST': -700, 'MDT': -600, # Mountain + 'PST': -800, 'PDT': -700 # Pacific + } + + +def parsedate_tz(data): + """Convert a date string to a time tuple. + + Accounts for military timezones. + """ + if not data: + return None + data = data.split() + if data[0][-1] in (',', '.') or data[0].lower() in _daynames: + # There's a dayname here. Skip it + del data[0] + if len(data) == 3: # RFC 850 date, deprecated + stuff = data[0].split('-') + if len(stuff) == 3: + data = stuff + data[1:] + if len(data) == 4: + s = data[3] + i = s.find('+') + if i > 0: + data[3:] = [s[:i], s[i+1:]] + else: + data.append('') # Dummy tz + if len(data) < 5: + return None + data = data[:5] + [dd, mm, yy, tm, tz] = data + mm = mm.lower() + if not mm in _monthnames: + dd, mm = mm, dd.lower() + if not mm in _monthnames: + return None + mm = _monthnames.index(mm)+1 + if mm > 12: mm = mm - 12 + if dd[-1] == ',': + dd = dd[:-1] + i = yy.find(':') + if i > 0: + yy, tm = tm, yy + if yy[-1] == ',': + yy = yy[:-1] + if not yy[0].isdigit(): + yy, tz = tz, yy + if tm[-1] == ',': + tm = tm[:-1] + tm = tm.split(':') + if len(tm) == 2: + [thh, tmm] = tm + tss = '0' + elif len(tm) == 3: + [thh, tmm, tss] = tm + else: + return None + try: + yy = int(yy) + dd = int(dd) + thh = int(thh) + tmm = int(tmm) + tss = int(tss) + except ValueError: + return None + tzoffset = None + tz = tz.upper() + if _timezones.has_key(tz): + tzoffset = _timezones[tz] + else: + try: + tzoffset = int(tz) + except ValueError: + pass + # Convert a timezone offset into seconds ; -0500 -> -18000 + if tzoffset: + if tzoffset < 0: + tzsign = -1 + tzoffset = -tzoffset + else: + tzsign = 1 + tzoffset = tzsign * ( (tzoffset//100)*3600 + (tzoffset % 100)*60) + tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0, tzoffset) + return tuple + + +def parsedate(data): + """Convert a time string to a time tuple.""" + t = parsedate_tz(data) + if type(t) == type( () ): + return t[:9] + else: return t + + +def mktime_tz(data): + """Turn a 10-tuple as returned by parsedate_tz() into a UTC timestamp.""" + if data[9] is None: + # No zone info, so localtime is better assumption than GMT + return time.mktime(data[:8] + (-1,)) + else: + t = time.mktime(data[:8] + (0,)) + return t - data[9] - time.timezone + +def formatdate(timeval=None): + """Returns time format preferred for Internet standards. + + Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 + + According to RFC 1123, day and month names must always be in + English. If not for that, this code could use strftime(). It + can't because strftime() honors the locale and could generated + non-English names. + """ + if timeval is None: + timeval = time.time() + timeval = time.gmtime(timeval) + return "%s, %02d %s %04d %02d:%02d:%02d GMT" % ( + ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][timeval[6]], + timeval[2], + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][timeval[1]-1], + timeval[0], timeval[3], timeval[4], timeval[5]) + + +# When used as script, run a small test program. +# The first command line argument must be a filename containing one +# message in RFC-822 format. + +if __name__ == '__main__': + import sys, os + file = os.path.join(os.environ['HOME'], 'Mail/inbox/1') + if sys.argv[1:]: file = sys.argv[1] + f = open(file, 'r') + m = Message(f) + print 'From:', m.getaddr('from') + print 'To:', m.getaddrlist('to') + print 'Subject:', m.getheader('subject') + print 'Date:', m.getheader('date') + date = m.getdate_tz('date') + tz = date[-1] + date = time.localtime(mktime_tz(date)) + if date: + print 'ParsedDate:', time.asctime(date), + hhmmss = tz + hhmm, ss = divmod(hhmmss, 60) + hh, mm = divmod(hhmm, 60) + print "%+03d%02d" % (hh, mm), + if ss: print ".%02d" % ss, + print + else: + print 'ParsedDate:', None + m.rewindbody() + n = 0 + while f.readline(): + n = n + 1 + print 'Lines:', n + print '-'*70 + print 'len =', len(m) + if m.has_key('Date'): print 'Date =', m['Date'] + if m.has_key('X-Nonsense'): pass + print 'keys =', m.keys() + print 'values =', m.values() + print 'items =', m.items() diff --git a/lib-python/2.2/rlcompleter.py b/lib-python/2.2/rlcompleter.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/rlcompleter.py @@ -0,0 +1,122 @@ +"""Word completion for GNU readline 2.0. + +This requires the latest extension to the readline module (the +completes keywords, built-ins and globals in __main__; when completing +NAME.NAME..., it evaluates (!) the expression up to the last dot and +completes its attributes. + +It's very cool to do "import string" type "string.", hit the +completion key (twice), and see the list of names defined by the +string module! + +Tip: to use the tab key as the completion key, call + + readline.parse_and_bind("tab: complete") + +Notes: + +- Exceptions raised by the completer function are *ignored* (and +generally cause the completion to fail). This is a feature -- since +readline sets the tty device in raw (or cbreak) mode, printing a +traceback wouldn't work well without some complicated hoopla to save, +reset and restore the tty state. + +- The evaluation of the NAME.NAME... form may cause arbitrary +application defined code to be executed if an object with a +__getattr__ hook is found. Since it is the responsibility of the +application (or the user) to enable this feature, I consider this an +acceptable risk. More complicated expressions (e.g. function calls or +indexing operations) are *not* evaluated. + +- GNU readline is also used by the built-in functions input() and +raw_input(), and thus these also benefit/suffer from the completer +features. Clearly an interactive application can benefit by +specifying its own completer function and using raw_input() for all +its input. + +- When the original stdin is not a tty device, GNU readline is never +used, and this module (and the readline module) are silently inactive. + +""" + +import readline +import __builtin__ +import __main__ + +__all__ = ["Completer"] + +class Completer: + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if state == 0: + if "." in text: + self.matches = self.attr_matches(text) + else: + self.matches = self.global_matches(text) + try: + return self.matches[state] + except IndexError: + return None + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names + currently defines in __main__ that match. + + """ + import keyword + matches = [] + n = len(text) + for list in [keyword.kwlist, + __builtin__.__dict__.keys(), + __main__.__dict__.keys()]: + for word in list: + if word[:n] == text and word != "__builtins__": + matches.append(word) + return matches + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluatable in the globals of __main__, it will be evaluated + and its attributes (as revealed by dir()) are used as possible + completions. (For class instances, class members are are also + considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + import re + m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) + if not m: + return + expr, attr = m.group(1, 3) + object = eval(expr, __main__.__dict__) + words = dir(object) + if hasattr(object,'__class__'): + words.append('__class__') + words = words + get_class_members(object.__class__) + matches = [] + n = len(attr) + for word in words: + if word[:n] == attr and word != "__builtins__": + matches.append("%s.%s" % (expr, word)) + return matches + +def get_class_members(klass): + ret = dir(klass) + if hasattr(klass,'__bases__'): + for base in klass.__bases__: + ret = ret + get_class_members(base) + return ret + +readline.set_completer(Completer().complete) diff --git a/lib-python/2.2/robotparser.py b/lib-python/2.2/robotparser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/robotparser.py @@ -0,0 +1,262 @@ +""" robotparser.py + + Copyright (C) 2000 Bastian Kleineidam + + You can choose between two licenses when using this package: + 1) GNU GPLv2 + 2) PSF license for Python 2.2 + + The robots.txt Exclusion Protocol is implemented as specified in + http://info.webcrawler.com/mak/projects/robots/norobots-rfc.html +""" +import re,urlparse,urllib + +__all__ = ["RobotFileParser"] + +debug = 0 + +def _debug(msg): + if debug: print msg + + +class RobotFileParser: + def __init__(self, url=''): + self.entries = [] + self.disallow_all = 0 + self.allow_all = 0 + self.set_url(url) + self.last_checked = 0 + + def mtime(self): + return self.last_checked + + def modified(self): + import time + self.last_checked = time.time() + + def set_url(self, url): + self.url = url + self.host, self.path = urlparse.urlparse(url)[1:3] + + def read(self): + opener = URLopener() + f = opener.open(self.url) + lines = [] + line = f.readline() + while line: + lines.append(line.strip()) + line = f.readline() + self.errcode = opener.errcode + if self.errcode == 401 or self.errcode == 403: + self.disallow_all = 1 + _debug("disallow all") + elif self.errcode >= 400: + self.allow_all = 1 + _debug("allow all") + elif self.errcode == 200 and lines: + _debug("parse lines") + self.parse(lines) + + def parse(self, lines): + """parse the input lines from a robot.txt file. + We allow that a user-agent: line is not preceded by + one or more blank lines.""" + state = 0 + linenumber = 0 + entry = Entry() + + for line in lines: + linenumber = linenumber + 1 + if not line: + if state==1: + _debug("line %d: warning: you should insert" + " allow: or disallow: directives below any" + " user-agent: line" % linenumber) + entry = Entry() + state = 0 + elif state==2: + self.entries.append(entry) + entry = Entry() + state = 0 + # remove optional comment and strip line + i = line.find('#') + if i>=0: + line = line[:i] + line = line.strip() + if not line: + continue + line = line.split(':', 1) + if len(line) == 2: + line[0] = line[0].strip().lower() + line[1] = line[1].strip() + if line[0] == "user-agent": + if state==2: + _debug("line %d: warning: you should insert a blank" + " line before any user-agent" + " directive" % linenumber) + self.entries.append(entry) + entry = Entry() + entry.useragents.append(line[1]) + state = 1 + elif line[0] == "disallow": + if state==0: + _debug("line %d: error: you must insert a user-agent:" + " directive before this line" % linenumber) + else: + entry.rulelines.append(RuleLine(line[1], 0)) + state = 2 + elif line[0] == "allow": + if state==0: + _debug("line %d: error: you must insert a user-agent:" + " directive before this line" % linenumber) + else: + entry.rulelines.append(RuleLine(line[1], 1)) + else: + _debug("line %d: warning: unknown key %s" % (linenumber, + line[0])) + else: + _debug("line %d: error: malformed line %s"%(linenumber, line)) + if state==2: + self.entries.append(entry) + _debug("Parsed rules:\n%s" % str(self)) + + + def can_fetch(self, useragent, url): + """using the parsed robots.txt decide if useragent can fetch url""" + _debug("Checking robot.txt allowance for:\n user agent: %s\n url: %s" % + (useragent, url)) + if self.disallow_all: + return 0 + if self.allow_all: + return 1 + # search for given user agent matches + # the first match counts + url = urllib.quote(urlparse.urlparse(url)[2]) or "/" + for entry in self.entries: + if entry.applies_to(useragent): + return entry.allowance(url) + # agent not found ==> access granted + return 1 + + + def __str__(self): + ret = "" + for entry in self.entries: + ret = ret + str(entry) + "\n" + return ret + + +class RuleLine: + """A rule line is a single "Allow:" (allowance==1) or "Disallow:" + (allowance==0) followed by a path.""" + def __init__(self, path, allowance): + self.path = urllib.quote(path) + self.allowance = allowance + + def applies_to(self, filename): + return self.path=="*" or re.match(self.path, filename) + + def __str__(self): + return (self.allowance and "Allow" or "Disallow")+": "+self.path + + +class Entry: + """An entry has one or more user-agents and zero or more rulelines""" + def __init__(self): + self.useragents = [] + self.rulelines = [] + + def __str__(self): + ret = "" + for agent in self.useragents: + ret = ret + "User-agent: "+agent+"\n" + for line in self.rulelines: + ret = ret + str(line) + "\n" + return ret + + def applies_to(self, useragent): + """check if this entry applies to the specified agent""" + # split the name token and make it lower case + useragent = useragent.split("/")[0].lower() + for agent in self.useragents: + if agent=='*': + # we have the catch-all agent + return 1 + agent = agent.lower() + # don't forget to re.escape + if re.search(re.escape(useragent), agent): + return 1 + return 0 + + def allowance(self, filename): + """Preconditions: + - our agent applies to this entry + - filename is URL decoded""" + for line in self.rulelines: + _debug((filename, str(line), line.allowance)) + if line.applies_to(filename): + return line.allowance + return 1 + +class URLopener(urllib.FancyURLopener): + def __init__(self, *args): + apply(urllib.FancyURLopener.__init__, (self,) + args) + self.errcode = 200 + + def http_error_default(self, url, fp, errcode, errmsg, headers): + self.errcode = errcode + return urllib.FancyURLopener.http_error_default(self, url, fp, errcode, + errmsg, headers) + +def _check(a,b): + if not b: + ac = "access denied" + else: + ac = "access allowed" + if a!=b: + print "failed" + else: + print "ok (%s)" % ac + print + +def _test(): + global debug + rp = RobotFileParser() + debug = 1 + + # robots.txt that exists, gotten to by redirection + rp.set_url('http://www.musi-cal.com/robots.txt') + rp.read() + + # test for re.escape + _check(rp.can_fetch('*', 'http://www.musi-cal.com/'), 1) + # this should match the first rule, which is a disallow + _check(rp.can_fetch('', 'http://www.musi-cal.com/'), 0) + # various cherry pickers + _check(rp.can_fetch('CherryPickerSE', + 'http://www.musi-cal.com/cgi-bin/event-search' + '?city=San+Francisco'), 0) + _check(rp.can_fetch('CherryPickerSE/1.0', + 'http://www.musi-cal.com/cgi-bin/event-search' + '?city=San+Francisco'), 0) + _check(rp.can_fetch('CherryPickerSE/1.5', + 'http://www.musi-cal.com/cgi-bin/event-search' + '?city=San+Francisco'), 0) + # case sensitivity + _check(rp.can_fetch('ExtractorPro', 'http://www.musi-cal.com/blubba'), 0) + _check(rp.can_fetch('extractorpro', 'http://www.musi-cal.com/blubba'), 0) + # substring test + _check(rp.can_fetch('toolpak/1.1', 'http://www.musi-cal.com/blubba'), 0) + # tests for catch-all * agent + _check(rp.can_fetch('spam', 'http://www.musi-cal.com/search'), 0) + _check(rp.can_fetch('spam', 'http://www.musi-cal.com/Musician/me'), 1) + _check(rp.can_fetch('spam', 'http://www.musi-cal.com/'), 1) + _check(rp.can_fetch('spam', 'http://www.musi-cal.com/'), 1) + + # robots.txt that does not exist + rp.set_url('http://www.lycos.com/robots.txt') + rp.read() + _check(rp.can_fetch('Mozilla', 'http://www.lycos.com/search'), 1) + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/sched.py b/lib-python/2.2/sched.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/sched.py @@ -0,0 +1,106 @@ +"""A generally useful event scheduler class. + +Each instance of this class manages its own queue. +No multi-threading is implied; you are supposed to hack that +yourself, or use a single instance per application. + +Each instance is parametrized with two functions, one that is +supposed to return the current time, one that is supposed to +implement a delay. You can implement real-time scheduling by +substituting time and sleep from built-in module time, or you can +implement simulated time by writing your own functions. This can +also be used to integrate scheduling with STDWIN events; the delay +function is allowed to modify the queue. Time can be expressed as +integers or floating point numbers, as long as it is consistent. + +Events are specified by tuples (time, priority, action, argument). +As in UNIX, lower priority numbers mean higher priority; in this +way the queue can be maintained fully sorted. Execution of the +event means calling the action function, passing it the argument. +Remember that in Python, multiple function arguments can be packed +in a tuple. The action function may be an instance method so it +has another way to reference private data (besides global variables). +Parameterless functions or methods cannot be used, however. +""" + +# XXX The timefunc and delayfunc should have been defined as methods +# XXX so you can define new kinds of schedulers using subclassing +# XXX instead of having to define a module or class just to hold +# XXX the global state of your particular time and delay functions. + +import bisect + +__all__ = ["scheduler"] + +class scheduler: + def __init__(self, timefunc, delayfunc): + """Initialize a new instance, passing the time and delay + functions""" + self.queue = [] + self.timefunc = timefunc + self.delayfunc = delayfunc + + def enterabs(self, time, priority, action, argument): + """Enter a new event in the queue at an absolute time. + + Returns an ID for the event which can be used to remove it, + if necessary. + + """ + event = time, priority, action, argument + bisect.insort(self.queue, event) + return event # The ID + + def enter(self, delay, priority, action, argument): + """A variant that specifies the time as a relative time. + + This is actually the more commonly used interface. + + """ + time = self.timefunc() + delay + return self.enterabs(time, priority, action, argument) + + def cancel(self, event): + """Remove an event from the queue. + + This must be presented the ID as returned by enter(). + If the event is not in the queue, this raises RuntimeError. + + """ + self.queue.remove(event) + + def empty(self): + """Check whether the queue is empty.""" + return len(self.queue) == 0 + + def run(self): + """Execute events until the queue is empty. + + When there is a positive delay until the first event, the + delay function is called and the event is left in the queue; + otherwise, the event is removed from the queue and executed + (its action function is called, passing it the argument). If + the delay function returns prematurely, it is simply + restarted. + + It is legal for both the delay function and the action + function to to modify the queue or to raise an exception; + exceptions are not caught but the scheduler's state remains + well-defined so run() may be called again. + + A questionably hack is added to allow other threads to run: + just after an event is executed, a delay of 0 is executed, to + avoid monopolizing the CPU when other threads are also + runnable. + + """ + q = self.queue + while q: + time, priority, action, argument = q[0] + now = self.timefunc() + if now < time: + self.delayfunc(time - now) + else: + del q[0] + void = apply(action, argument) + self.delayfunc(0) # Let other threads run diff --git a/lib-python/2.2/sgmllib.py b/lib-python/2.2/sgmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/sgmllib.py @@ -0,0 +1,516 @@ +"""A parser for SGML, using the derived class as a static DTD.""" + +# XXX This only supports those SGML features used by HTML. + +# XXX There should be a way to distinguish between PCDATA (parsed +# character data -- the normal case), RCDATA (replaceable character +# data -- only char and entity references and end tags are special) +# and CDATA (character data -- only end tags are special). RCDATA is +# not supported at all. + + +import markupbase +import re + +__all__ = ["SGMLParser"] + +# Regular expressions used for parsing + +interesting = re.compile('[&<]') +incomplete = re.compile('&([a-zA-Z][a-zA-Z0-9]*|#[0-9]*)?|' + '<([a-zA-Z][^<>]*|' + '/([a-zA-Z][^<>]*)?|' + '![^<>]*)?') + +entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') +charref = re.compile('&#([0-9]+)[^0-9]') + +starttagopen = re.compile('<[>a-zA-Z]') +shorttagopen = re.compile('<[a-zA-Z][-.a-zA-Z0-9]*/') +shorttag = re.compile('<([a-zA-Z][-.a-zA-Z0-9]*)/([^/]*)/') +piclose = re.compile('>') +endbracket = re.compile('[<>]') +commentclose = re.compile(r'--\s*>') +tagfind = re.compile('[a-zA-Z][-_.a-zA-Z0-9]*') +attrfind = re.compile( + r'\s*([a-zA-Z_][-:.a-zA-Z_0-9]*)(\s*=\s*' + r'(\'[^\']*\'|"[^"]*"|[-a-zA-Z0-9./:;+*%?!&$\(\)_#=~\'"]*))?') + + +class SGMLParseError(RuntimeError): + """Exception raised for all parse errors.""" + pass + + +# SGML parser base class -- find tags and call handler functions. +# Usage: p = SGMLParser(); p.feed(data); ...; p.close(). +# The dtd is defined by deriving a class which defines methods +# with special names to handle tags: start_foo and end_foo to handle +# and , respectively, or do_foo to handle by itself. +# (Tags are converted to lower case for this purpose.) The data +# between tags is passed to the parser by calling self.handle_data() +# with some data as argument (the data may be split up in arbitrary +# chunks). Entity references are passed by calling +# self.handle_entityref() with the entity reference as argument. + +class SGMLParser(markupbase.ParserBase): + + def __init__(self, verbose=0): + """Initialize and reset this instance.""" + self.verbose = verbose + self.reset() + + def reset(self): + """Reset this instance. Loses all unprocessed data.""" + self.rawdata = '' + self.stack = [] + self.lasttag = '???' + self.nomoretags = 0 + self.literal = 0 + markupbase.ParserBase.reset(self) + + def setnomoretags(self): + """Enter literal mode (CDATA) till EOF. + + Intended for derived classes only. + """ + self.nomoretags = self.literal = 1 + + def setliteral(self, *args): + """Enter literal mode (CDATA). + + Intended for derived classes only. + """ + self.literal = 1 + + def feed(self, data): + """Feed some data to the parser. + + Call this as often as you want, with as little or as much text + as you want (may include '\n'). (This just saves the text, + all the processing is done by goahead().) + """ + + self.rawdata = self.rawdata + data + self.goahead(0) + + def close(self): + """Handle the remaining data.""" + self.goahead(1) + + def error(self, message): + raise SGMLParseError(message) + + # Internal -- handle data as far as reasonable. May leave state + # and data to be processed by a subsequent call. If 'end' is + # true, force handling all data as if followed by EOF marker. + def goahead(self, end): + rawdata = self.rawdata + i = 0 + n = len(rawdata) + while i < n: + if self.nomoretags: + self.handle_data(rawdata[i:n]) + i = n + break + match = interesting.search(rawdata, i) + if match: j = match.start() + else: j = n + if i < j: + self.handle_data(rawdata[i:j]) + i = j + if i == n: break + if rawdata[i] == '<': + if starttagopen.match(rawdata, i): + if self.literal: + self.handle_data(rawdata[i]) + i = i+1 + continue + k = self.parse_starttag(i) + if k < 0: break + i = k + continue + if rawdata.startswith(" (i + 1): + self.handle_data("<") + i = i+1 + else: + # incomplete + break + continue + if rawdata.startswith(" '012' and (-3, 3) --> '-03' +# Decadent feature: the argument may be a string or a number +# (Use of this is deprecated; it should be a string as with ljust c.s.) +def zfill(x, width): + """zfill(x, width) -> string + + Pad a numeric string x with zeros on the left, to fill a field + of the specified width. The string x is never truncated. + + """ + if not isinstance(x, _StringTypes): + x = repr(x) + return x.zfill(width) + +# Expand tabs in a string. +# Doesn't take non-printing chars into account, but does understand \n. +def expandtabs(s, tabsize=8): + """expandtabs(s [,tabsize]) -> string + + Return a copy of the string s with all tab characters replaced + by the appropriate number of spaces, depending on the current + column, and the tabsize (default 8). + + """ + return s.expandtabs(tabsize) + +# Character translation through look-up table. +def translate(s, table, deletions=""): + """translate(s,table [,deletions]) -> string + + Return a copy of the string s, where all characters occurring + in the optional argument deletions are removed, and the + remaining characters have been mapped through the given + translation table, which must be a string of length 256. The + deletions argument is not allowed for Unicode strings. + + """ + if deletions: + return s.translate(table, deletions) + else: + # Add s[:0] so that if s is Unicode and table is an 8-bit string, + # table is converted to Unicode. This means that table *cannot* + # be a dictionary -- for that feature, use u.translate() directly. + return s.translate(table + s[:0]) + +# Capitalize a string, e.g. "aBc dEf" -> "Abc def". +def capitalize(s): + """capitalize(s) -> string + + Return a copy of the string s with only its first character + capitalized. + + """ + return s.capitalize() + +# Capitalize the words in a string, e.g. " aBc dEf " -> "Abc Def". +# See also regsub.capwords(). +def capwords(s, sep=None): + """capwords(s, [sep]) -> string + + Split the argument into words using split, capitalize each + word using capitalize, and join the capitalized words using + join. Note that this replaces runs of whitespace characters by + a single space. + + """ + return join(map(capitalize, s.split(sep)), sep or ' ') + +# Construct a translation string +_idmapL = None +def maketrans(fromstr, tostr): + """maketrans(frm, to) -> string + + Return a translation table (a string of 256 bytes long) + suitable for use in string.translate. The strings frm and to + must be of the same length. + + """ + if len(fromstr) != len(tostr): + raise ValueError, "maketrans arguments must have same length" + global _idmapL + if not _idmapL: + _idmapL = map(None, _idmap) + L = _idmapL[:] + fromstr = map(ord, fromstr) + for i in range(len(fromstr)): + L[fromstr[i]] = tostr[i] + return join(L, "") + +# Substring replacement (global) +def replace(s, old, new, maxsplit=-1): + """replace (str, old, new[, maxsplit]) -> string + + Return a copy of string str with all occurrences of substring + old replaced by new. If the optional argument maxsplit is + given, only the first maxsplit occurrences are replaced. + + """ + return s.replace(old, new, maxsplit) + + +# Try importing optional built-in module "strop" -- if it exists, +# it redefines some string operations that are 100-1000 times faster. +# It also defines values for whitespace, lowercase and uppercase +# that match 's definitions. + +try: + from strop import maketrans, lowercase, uppercase, whitespace + letters = lowercase + uppercase +except ImportError: + pass # Use the original versions diff --git a/lib-python/2.2/stringold.py b/lib-python/2.2/stringold.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/stringold.py @@ -0,0 +1,430 @@ +# module 'string' -- A collection of string operations + +# Warning: most of the code you see here isn't normally used nowadays. With +# Python 1.6, many of these functions are implemented as methods on the +# standard string object. They used to be implemented by a built-in module +# called strop, but strop is now obsolete itself. + +"""Common string manipulations. + +Public module variables: + +whitespace -- a string containing all characters considered whitespace +lowercase -- a string containing all characters considered lowercase letters +uppercase -- a string containing all characters considered uppercase letters +letters -- a string containing all characters considered letters +digits -- a string containing all characters considered decimal digits +hexdigits -- a string containing all characters considered hexadecimal digits +octdigits -- a string containing all characters considered octal digits + +""" + +# Some strings for ctype-style character classification +whitespace = ' \t\n\r\v\f' +lowercase = 'abcdefghijklmnopqrstuvwxyz' +uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +letters = lowercase + uppercase +digits = '0123456789' +hexdigits = digits + 'abcdef' + 'ABCDEF' +octdigits = '01234567' + +# Case conversion helpers +_idmap = '' +for i in range(256): _idmap = _idmap + chr(i) +del i + +# Backward compatible names for exceptions +index_error = ValueError +atoi_error = ValueError +atof_error = ValueError +atol_error = ValueError + +# convert UPPER CASE letters to lower case +def lower(s): + """lower(s) -> string + + Return a copy of the string s converted to lowercase. + + """ + return s.lower() + +# Convert lower case letters to UPPER CASE +def upper(s): + """upper(s) -> string + + Return a copy of the string s converted to uppercase. + + """ + return s.upper() + +# Swap lower case letters and UPPER CASE +def swapcase(s): + """swapcase(s) -> string + + Return a copy of the string s with upper case characters + converted to lowercase and vice versa. + + """ + return s.swapcase() + +# Strip leading and trailing tabs and spaces +def strip(s): + """strip(s) -> string + + Return a copy of the string s with leading and trailing + whitespace removed. + + """ + return s.strip() + +# Strip leading tabs and spaces +def lstrip(s): + """lstrip(s) -> string + + Return a copy of the string s with leading whitespace removed. + + """ + return s.lstrip() + +# Strip trailing tabs and spaces +def rstrip(s): + """rstrip(s) -> string + + Return a copy of the string s with trailing whitespace + removed. + + """ + return s.rstrip() + + +# Split a string into a list of space/tab-separated words +def split(s, sep=None, maxsplit=0): + """split(str [,sep [,maxsplit]]) -> list of strings + + Return a list of the words in the string s, using sep as the + delimiter string. If maxsplit is nonzero, splits into at most + maxsplit words If sep is not specified, any whitespace string + is a separator. Maxsplit defaults to 0. + + (split and splitfields are synonymous) + + """ + return s.split(sep, maxsplit) +splitfields = split + +# Join fields with optional separator +def join(words, sep = ' '): + """join(list [,sep]) -> string + + Return a string composed of the words in list, with + intervening occurrences of sep. The default separator is a + single space. + + (joinfields and join are synonymous) + + """ + return sep.join(words) +joinfields = join + +# for a little bit of speed +_apply = apply + +# Find substring, raise exception if not found +def index(s, *args): + """index(s, sub [,start [,end]]) -> int + + Like find but raises ValueError when the substring is not found. + + """ + return _apply(s.index, args) + +# Find last substring, raise exception if not found +def rindex(s, *args): + """rindex(s, sub [,start [,end]]) -> int + + Like rfind but raises ValueError when the substring is not found. + + """ + return _apply(s.rindex, args) + +# Count non-overlapping occurrences of substring +def count(s, *args): + """count(s, sub[, start[,end]]) -> int + + Return the number of occurrences of substring sub in string + s[start:end]. Optional arguments start and end are + interpreted as in slice notation. + + """ + return _apply(s.count, args) + +# Find substring, return -1 if not found +def find(s, *args): + """find(s, sub [,start [,end]]) -> in + + Return the lowest index in s where substring sub is found, + such that sub is contained within s[start,end]. Optional + arguments start and end are interpreted as in slice notation. + + Return -1 on failure. + + """ + return _apply(s.find, args) + +# Find last substring, return -1 if not found +def rfind(s, *args): + """rfind(s, sub [,start [,end]]) -> int + + Return the highest index in s where substring sub is found, + such that sub is contained within s[start,end]. Optional + arguments start and end are interpreted as in slice notation. + + Return -1 on failure. + + """ + return _apply(s.rfind, args) + +# for a bit of speed +_float = float +_int = int +_long = long +_StringType = type('') + +# Convert string to float +def atof(s): + """atof(s) -> float + + Return the floating point number represented by the string s. + + """ + if type(s) == _StringType: + return _float(s) + else: + raise TypeError('argument 1: expected string, %s found' % + type(s).__name__) + +# Convert string to integer +def atoi(*args): + """atoi(s [,base]) -> int + + Return the integer represented by the string s in the given + base, which defaults to 10. The string s must consist of one + or more digits, possibly preceded by a sign. If base is 0, it + is chosen from the leading characters of s, 0 for octal, 0x or + 0X for hexadecimal. If base is 16, a preceding 0x or 0X is + accepted. + + """ + try: + s = args[0] + except IndexError: + raise TypeError('function requires at least 1 argument: %d given' % + len(args)) + # Don't catch type error resulting from too many arguments to int(). The + # error message isn't compatible but the error type is, and this function + # is complicated enough already. + if type(s) == _StringType: + return _apply(_int, args) + else: + raise TypeError('argument 1: expected string, %s found' % + type(s).__name__) + + +# Convert string to long integer +def atol(*args): + """atol(s [,base]) -> long + + Return the long integer represented by the string s in the + given base, which defaults to 10. The string s must consist + of one or more digits, possibly preceded by a sign. If base + is 0, it is chosen from the leading characters of s, 0 for + octal, 0x or 0X for hexadecimal. If base is 16, a preceding + 0x or 0X is accepted. A trailing L or l is not accepted, + unless base is 0. + + """ + try: + s = args[0] + except IndexError: + raise TypeError('function requires at least 1 argument: %d given' % + len(args)) + # Don't catch type error resulting from too many arguments to long(). The + # error message isn't compatible but the error type is, and this function + # is complicated enough already. + if type(s) == _StringType: + return _apply(_long, args) + else: + raise TypeError('argument 1: expected string, %s found' % + type(s).__name__) + + +# Left-justify a string +def ljust(s, width): + """ljust(s, width) -> string + + Return a left-justified version of s, in a field of the + specified width, padded with spaces as needed. The string is + never truncated. + + """ + n = width - len(s) + if n <= 0: return s + return s + ' '*n + +# Right-justify a string +def rjust(s, width): + """rjust(s, width) -> string + + Return a right-justified version of s, in a field of the + specified width, padded with spaces as needed. The string is + never truncated. + + """ + n = width - len(s) + if n <= 0: return s + return ' '*n + s + +# Center a string +def center(s, width): + """center(s, width) -> string + + Return a center version of s, in a field of the specified + width. padded with spaces as needed. The string is never + truncated. + + """ + n = width - len(s) + if n <= 0: return s + half = n/2 + if n%2 and width%2: + # This ensures that center(center(s, i), j) = center(s, j) + half = half+1 + return ' '*half + s + ' '*(n-half) + +# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03' +# Decadent feature: the argument may be a string or a number +# (Use of this is deprecated; it should be a string as with ljust c.s.) +def zfill(x, width): + """zfill(x, width) -> string + + Pad a numeric string x with zeros on the left, to fill a field + of the specified width. The string x is never truncated. + + """ + if type(x) == type(''): s = x + else: s = `x` + n = len(s) + if n >= width: return s + sign = '' + if s[0] in ('-', '+'): + sign, s = s[0], s[1:] + return sign + '0'*(width-n) + s + +# Expand tabs in a string. +# Doesn't take non-printing chars into account, but does understand \n. +def expandtabs(s, tabsize=8): + """expandtabs(s [,tabsize]) -> string + + Return a copy of the string s with all tab characters replaced + by the appropriate number of spaces, depending on the current + column, and the tabsize (default 8). + + """ + res = line = '' + for c in s: + if c == '\t': + c = ' '*(tabsize - len(line) % tabsize) + line = line + c + if c == '\n': + res = res + line + line = '' + return res + line + +# Character translation through look-up table. +def translate(s, table, deletions=""): + """translate(s,table [,deletechars]) -> string + + Return a copy of the string s, where all characters occurring + in the optional argument deletechars are removed, and the + remaining characters have been mapped through the given + translation table, which must be a string of length 256. + + """ + return s.translate(table, deletions) + +# Capitalize a string, e.g. "aBc dEf" -> "Abc def". +def capitalize(s): + """capitalize(s) -> string + + Return a copy of the string s with only its first character + capitalized. + + """ + return s.capitalize() + +# Capitalize the words in a string, e.g. " aBc dEf " -> "Abc Def". +# See also regsub.capwords(). +def capwords(s, sep=None): + """capwords(s, [sep]) -> string + + Split the argument into words using split, capitalize each + word using capitalize, and join the capitalized words using + join. Note that this replaces runs of whitespace characters by + a single space. + + """ + return join(map(capitalize, s.split(sep)), sep or ' ') + +# Construct a translation string +_idmapL = None +def maketrans(fromstr, tostr): + """maketrans(frm, to) -> string + + Return a translation table (a string of 256 bytes long) + suitable for use in string.translate. The strings frm and to + must be of the same length. + + """ + if len(fromstr) != len(tostr): + raise ValueError, "maketrans arguments must have same length" + global _idmapL + if not _idmapL: + _idmapL = map(None, _idmap) + L = _idmapL[:] + fromstr = map(ord, fromstr) + for i in range(len(fromstr)): + L[fromstr[i]] = tostr[i] + return join(L, "") + +# Substring replacement (global) +def replace(s, old, new, maxsplit=0): + """replace (str, old, new[, maxsplit]) -> string + + Return a copy of string str with all occurrences of substring + old replaced by new. If the optional argument maxsplit is + given, only the first maxsplit occurrences are replaced. + + """ + return s.replace(old, new, maxsplit) + + +# XXX: transitional +# +# If string objects do not have methods, then we need to use the old string.py +# library, which uses strop for many more things than just the few outlined +# below. +try: + ''.upper +except AttributeError: + from stringold import * + +# Try importing optional built-in module "strop" -- if it exists, +# it redefines some string operations that are 100-1000 times faster. +# It also defines values for whitespace, lowercase and uppercase +# that match 's definitions. + +try: + from strop import maketrans, lowercase, uppercase, whitespace + letters = lowercase + uppercase +except ImportError: + pass # Use the original versions diff --git a/lib-python/2.2/sunau.py b/lib-python/2.2/sunau.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/sunau.py @@ -0,0 +1,474 @@ +"""Stuff to parse Sun and NeXT audio files. + +An audio file consists of a header followed by the data. The structure +of the header is as follows. + + +---------------+ + | magic word | + +---------------+ + | header size | + +---------------+ + | data size | + +---------------+ + | encoding | + +---------------+ + | sample rate | + +---------------+ + | # of channels | + +---------------+ + | info | + | | + +---------------+ + +The magic word consists of the 4 characters '.snd'. Apart from the +info field, all header fields are 4 bytes in size. They are all +32-bit unsigned integers encoded in big-endian byte order. + +The header size really gives the start of the data. +The data size is the physical size of the data. From the other +parameters the number of frames can be calculated. +The encoding gives the way in which audio samples are encoded. +Possible values are listed below. +The info field currently consists of an ASCII string giving a +human-readable description of the audio file. The info field is +padded with NUL bytes to the header size. + +Usage. + +Reading audio files: + f = sunau.open(file, 'r') +where file is either the name of a file or an open file pointer. +The open file pointer must have methods read(), seek(), and close(). +When the setpos() and rewind() methods are not used, the seek() +method is not necessary. + +This returns an instance of a class with the following public methods: + getnchannels() -- returns number of audio channels (1 for + mono, 2 for stereo) + getsampwidth() -- returns sample width in bytes + getframerate() -- returns sampling frequency + getnframes() -- returns number of audio frames + getcomptype() -- returns compression type ('NONE' or 'ULAW') + getcompname() -- returns human-readable version of + compression type ('not compressed' matches 'NONE') + getparams() -- returns a tuple consisting of all of the + above in the above order + getmarkers() -- returns None (for compatibility with the + aifc module) + getmark(id) -- raises an error since the mark does not + exist (for compatibility with the aifc module) + readframes(n) -- returns at most n frames of audio + rewind() -- rewind to the beginning of the audio stream + setpos(pos) -- seek to the specified position + tell() -- return the current position + close() -- close the instance (make it unusable) +The position returned by tell() and the position given to setpos() +are compatible and have nothing to do with the actual position in the +file. +The close() method is called automatically when the class instance +is destroyed. + +Writing audio files: + f = sunau.open(file, 'w') +where file is either the name of a file or an open file pointer. +The open file pointer must have methods write(), tell(), seek(), and +close(). + +This returns an instance of a class with the following public methods: + setnchannels(n) -- set the number of channels + setsampwidth(n) -- set the sample width + setframerate(n) -- set the frame rate + setnframes(n) -- set the number of frames + setcomptype(type, name) + -- set the compression type and the + human-readable compression type + setparams(tuple)-- set all parameters at once + tell() -- return current position in output file + writeframesraw(data) + -- write audio frames without pathing up the + file header + writeframes(data) + -- write audio frames and patch up the file header + close() -- patch up the file header and close the + output file +You should set the parameters before the first writeframesraw or +writeframes. The total number of frames does not need to be set, +but when it is set to the correct value, the header does not have to +be patched up. +It is best to first set all parameters, perhaps possibly the +compression type, and then write audio frames using writeframesraw. +When all frames have been written, either call writeframes('') or +close() to patch up the sizes in the header. +The close() method is called automatically when the class instance +is destroyed. +""" + +# from +AUDIO_FILE_MAGIC = 0x2e736e64 +AUDIO_FILE_ENCODING_MULAW_8 = 1 +AUDIO_FILE_ENCODING_LINEAR_8 = 2 +AUDIO_FILE_ENCODING_LINEAR_16 = 3 +AUDIO_FILE_ENCODING_LINEAR_24 = 4 +AUDIO_FILE_ENCODING_LINEAR_32 = 5 +AUDIO_FILE_ENCODING_FLOAT = 6 +AUDIO_FILE_ENCODING_DOUBLE = 7 +AUDIO_FILE_ENCODING_ADPCM_G721 = 23 +AUDIO_FILE_ENCODING_ADPCM_G722 = 24 +AUDIO_FILE_ENCODING_ADPCM_G723_3 = 25 +AUDIO_FILE_ENCODING_ADPCM_G723_5 = 26 +AUDIO_FILE_ENCODING_ALAW_8 = 27 + +# from +AUDIO_UNKNOWN_SIZE = 0xFFFFFFFFL # ((unsigned)(~0)) + +_simple_encodings = [AUDIO_FILE_ENCODING_MULAW_8, + AUDIO_FILE_ENCODING_LINEAR_8, + AUDIO_FILE_ENCODING_LINEAR_16, + AUDIO_FILE_ENCODING_LINEAR_24, + AUDIO_FILE_ENCODING_LINEAR_32, + AUDIO_FILE_ENCODING_ALAW_8] + +class Error(Exception): + pass + +def _read_u32(file): + x = 0L + for i in range(4): + byte = file.read(1) + if byte == '': + raise EOFError + x = x*256 + ord(byte) + return x + +def _write_u32(file, x): + data = [] + for i in range(4): + d, m = divmod(x, 256) + data.insert(0, m) + x = d + for i in range(4): + file.write(chr(int(data[i]))) + +class Au_read: + + def __init__(self, f): + if type(f) == type(''): + import __builtin__ + f = __builtin__.open(f, 'rb') + self.initfp(f) + + def __del__(self): + if self._file: + self.close() + + def initfp(self, file): + self._file = file + self._soundpos = 0 + magic = int(_read_u32(file)) + if magic != AUDIO_FILE_MAGIC: + raise Error, 'bad magic number' + self._hdr_size = int(_read_u32(file)) + if self._hdr_size < 24: + raise Error, 'header size too small' + if self._hdr_size > 100: + raise Error, 'header size ridiculously large' + self._data_size = _read_u32(file) + if self._data_size != AUDIO_UNKNOWN_SIZE: + self._data_size = int(self._data_size) + self._encoding = int(_read_u32(file)) + if self._encoding not in _simple_encodings: + raise Error, 'encoding not (yet) supported' + if self._encoding in (AUDIO_FILE_ENCODING_MULAW_8, + AUDIO_FILE_ENCODING_ALAW_8): + self._sampwidth = 2 + self._framesize = 1 + elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_8: + self._framesize = self._sampwidth = 1 + elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_16: + self._framesize = self._sampwidth = 2 + elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_24: + self._framesize = self._sampwidth = 3 + elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_32: + self._framesize = self._sampwidth = 4 + else: + raise Error, 'unknown encoding' + self._framerate = int(_read_u32(file)) + self._nchannels = int(_read_u32(file)) + self._framesize = self._framesize * self._nchannels + if self._hdr_size > 24: + self._info = file.read(self._hdr_size - 24) + for i in range(len(self._info)): + if self._info[i] == '\0': + self._info = self._info[:i] + break + else: + self._info = '' + + def getfp(self): + return self._file + + def getnchannels(self): + return self._nchannels + + def getsampwidth(self): + return self._sampwidth + + def getframerate(self): + return self._framerate + + def getnframes(self): + if self._data_size == AUDIO_UNKNOWN_SIZE: + return AUDIO_UNKNOWN_SIZE + if self._encoding in _simple_encodings: + return self._data_size / self._framesize + return 0 # XXX--must do some arithmetic here + + def getcomptype(self): + if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: + return 'ULAW' + elif self._encoding == AUDIO_FILE_ENCODING_ALAW_8: + return 'ALAW' + else: + return 'NONE' + + def getcompname(self): + if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: + return 'CCITT G.711 u-law' + elif self._encoding == AUDIO_FILE_ENCODING_ALAW_8: + return 'CCITT G.711 A-law' + else: + return 'not compressed' + + def getparams(self): + return self.getnchannels(), self.getsampwidth(), \ + self.getframerate(), self.getnframes(), \ + self.getcomptype(), self.getcompname() + + def getmarkers(self): + return None + + def getmark(self, id): + raise Error, 'no marks' + + def readframes(self, nframes): + if self._encoding in _simple_encodings: + if nframes == AUDIO_UNKNOWN_SIZE: + data = self._file.read() + else: + data = self._file.read(nframes * self._framesize * self._nchannels) + if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: + import audioop + data = audioop.ulaw2lin(data, self._sampwidth) + return data + return None # XXX--not implemented yet + + def rewind(self): + self._soundpos = 0 + self._file.seek(self._hdr_size) + + def tell(self): + return self._soundpos + + def setpos(self, pos): + if pos < 0 or pos > self.getnframes(): + raise Error, 'position not in range' + self._file.seek(pos * self._framesize + self._hdr_size) + self._soundpos = pos + + def close(self): + self._file = None + +class Au_write: + + def __init__(self, f): + if type(f) == type(''): + import __builtin__ + f = __builtin__.open(f, 'wb') + self.initfp(f) + + def __del__(self): + if self._file: + self.close() + + def initfp(self, file): + self._file = file + self._framerate = 0 + self._nchannels = 0 + self._sampwidth = 0 + self._framesize = 0 + self._nframes = AUDIO_UNKNOWN_SIZE + self._nframeswritten = 0 + self._datawritten = 0 + self._datalength = 0 + self._info = '' + self._comptype = 'ULAW' # default is U-law + + def setnchannels(self, nchannels): + if self._nframeswritten: + raise Error, 'cannot change parameters after starting to write' + if nchannels not in (1, 2, 4): + raise Error, 'only 1, 2, or 4 channels supported' + self._nchannels = nchannels + + def getnchannels(self): + if not self._nchannels: + raise Error, 'number of channels not set' + return self._nchannels + + def setsampwidth(self, sampwidth): + if self._nframeswritten: + raise Error, 'cannot change parameters after starting to write' + if sampwidth not in (1, 2, 4): + raise Error, 'bad sample width' + self._sampwidth = sampwidth + + def getsampwidth(self): + if not self._framerate: + raise Error, 'sample width not specified' + return self._sampwidth + + def setframerate(self, framerate): + if self._nframeswritten: + raise Error, 'cannot change parameters after starting to write' + self._framerate = framerate + + def getframerate(self): + if not self._framerate: + raise Error, 'frame rate not set' + return self._framerate + + def setnframes(self, nframes): + if self._nframeswritten: + raise Error, 'cannot change parameters after starting to write' + if nframes < 0: + raise Error, '# of frames cannot be negative' + self._nframes = nframes + + def getnframes(self): + return self._nframeswritten + + def setcomptype(self, type, name): + if type in ('NONE', 'ULAW'): + self._comptype = type + else: + raise Error, 'unknown compression type' + + def getcomptype(self): + return self._comptype + + def getcompname(self): + if self._comptype == 'ULAW': + return 'CCITT G.711 u-law' + elif self._comptype == 'ALAW': + return 'CCITT G.711 A-law' + else: + return 'not compressed' + + def setparams(self, (nchannels, sampwidth, framerate, nframes, comptype, compname)): + self.setnchannels(nchannels) + self.setsampwidth(sampwidth) + self.setframerate(framerate) + self.setnframes(nframes) + self.setcomptype(comptype, compname) + + def getparams(self): + return self.getnchannels(), self.getsampwidth(), \ + self.getframerate(), self.getnframes(), \ + self.getcomptype(), self.getcompname() + + def tell(self): + return self._nframeswritten + + def writeframesraw(self, data): + self._ensure_header_written() + nframes = len(data) / self._framesize + if self._comptype == 'ULAW': + import audioop + data = audioop.lin2ulaw(data, self._sampwidth) + self._file.write(data) + self._nframeswritten = self._nframeswritten + nframes + self._datawritten = self._datawritten + len(data) + + def writeframes(self, data): + self.writeframesraw(data) + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + + def close(self): + self._ensure_header_written() + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + self._file = None + + # + # private methods + # + + def _ensure_header_written(self): + if not self._nframeswritten: + if not self._nchannels: + raise Error, '# of channels not specified' + if not self._sampwidth: + raise Error, 'sample width not specified' + if not self._framerate: + raise Error, 'frame rate not specified' + self._write_header() + + def _write_header(self): + if self._comptype == 'NONE': + if self._sampwidth == 1: + encoding = AUDIO_FILE_ENCODING_LINEAR_8 + self._framesize = 1 + elif self._sampwidth == 2: + encoding = AUDIO_FILE_ENCODING_LINEAR_16 + self._framesize = 2 + elif self._sampwidth == 4: + encoding = AUDIO_FILE_ENCODING_LINEAR_32 + self._framesize = 4 + else: + raise Error, 'internal error' + elif self._comptype == 'ULAW': + encoding = AUDIO_FILE_ENCODING_MULAW_8 + self._framesize = 1 + else: + raise Error, 'internal error' + self._framesize = self._framesize * self._nchannels + _write_u32(self._file, AUDIO_FILE_MAGIC) + header_size = 25 + len(self._info) + header_size = (header_size + 7) & ~7 + _write_u32(self._file, header_size) + if self._nframes == AUDIO_UNKNOWN_SIZE: + length = AUDIO_UNKNOWN_SIZE + else: + length = self._nframes * self._framesize + _write_u32(self._file, length) + self._datalength = length + _write_u32(self._file, encoding) + _write_u32(self._file, self._framerate) + _write_u32(self._file, self._nchannels) + self._file.write(self._info) + self._file.write('\0'*(header_size - len(self._info) - 24)) + + def _patchheader(self): + self._file.seek(8) + _write_u32(self._file, self._datawritten) + self._datalength = self._datawritten + self._file.seek(0, 2) + +def open(f, mode=None): + if mode is None: + if hasattr(f, 'mode'): + mode = f.mode + else: + mode = 'rb' + if mode in ('r', 'rb'): + return Au_read(f) + elif mode in ('w', 'wb'): + return Au_write(f) + else: + raise Error, "mode must be 'r', 'rb', 'w', or 'wb'" + +openfp = open diff --git a/lib-python/2.2/sunaudio.py b/lib-python/2.2/sunaudio.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/sunaudio.py @@ -0,0 +1,44 @@ +"""Interpret sun audio headers.""" + +MAGIC = '.snd' + +class error(Exception): + pass + + +def get_long_be(s): + """Convert a 4-char value to integer.""" + return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3]) + + +def gethdr(fp): + """Read a sound header from an open file.""" + if fp.read(4) != MAGIC: + raise error, 'gethdr: bad magic word' + hdr_size = get_long_be(fp.read(4)) + data_size = get_long_be(fp.read(4)) + encoding = get_long_be(fp.read(4)) + sample_rate = get_long_be(fp.read(4)) + channels = get_long_be(fp.read(4)) + excess = hdr_size - 24 + if excess < 0: + raise error, 'gethdr: bad hdr_size' + if excess > 0: + info = fp.read(excess) + else: + info = '' + return (data_size, encoding, sample_rate, channels, info) + + +def printhdr(file): + """Read and print the sound header of a named file.""" + hdr = gethdr(open(file, 'r')) + data_size, encoding, sample_rate, channels, info = hdr + while info[-1:] == '\0': + info = info[:-1] + print 'File name: ', file + print 'Data size: ', data_size + print 'Encoding: ', encoding + print 'Sample rate:', sample_rate + print 'Channels: ', channels + print 'Info: ', `info` diff --git a/lib-python/2.2/symbol.py b/lib-python/2.2/symbol.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/symbol.py @@ -0,0 +1,95 @@ +#! /usr/bin/env python + +"""Non-terminal symbols of Python grammar (from "graminit.h").""" + +# This file is automatically generated; please don't muck it up! +# +# To update the symbols in this file, 'cd' to the top directory of +# the python source tree after building the interpreter and run: +# +# python Lib/symbol.py + +#--start constants-- +single_input = 256 +file_input = 257 +eval_input = 258 +funcdef = 259 +parameters = 260 +varargslist = 261 +fpdef = 262 +fplist = 263 +stmt = 264 +simple_stmt = 265 +small_stmt = 266 +expr_stmt = 267 +augassign = 268 +print_stmt = 269 +del_stmt = 270 +pass_stmt = 271 +flow_stmt = 272 +break_stmt = 273 +continue_stmt = 274 +return_stmt = 275 +yield_stmt = 276 +raise_stmt = 277 +import_stmt = 278 +import_as_name = 279 +dotted_as_name = 280 +dotted_name = 281 +global_stmt = 282 +exec_stmt = 283 +assert_stmt = 284 +compound_stmt = 285 +if_stmt = 286 +while_stmt = 287 +for_stmt = 288 +try_stmt = 289 +except_clause = 290 +suite = 291 +test = 292 +and_test = 293 +not_test = 294 +comparison = 295 +comp_op = 296 +expr = 297 +xor_expr = 298 +and_expr = 299 +shift_expr = 300 +arith_expr = 301 +term = 302 +factor = 303 +power = 304 +atom = 305 +listmaker = 306 +lambdef = 307 +trailer = 308 +subscriptlist = 309 +subscript = 310 +sliceop = 311 +exprlist = 312 +testlist = 313 +testlist_safe = 314 +dictmaker = 315 +classdef = 316 +arglist = 317 +argument = 318 +list_iter = 319 +list_for = 320 +list_if = 321 +#--end constants-- + +sym_name = {} +for _name, _value in globals().items(): + if type(_value) is type(0): + sym_name[_value] = _name + + +def main(): + import sys + import token + if len(sys.argv) == 1: + sys.argv = sys.argv + ["Include/graminit.h", "Lib/symbol.py"] + token.main() + +if __name__ == "__main__": + main() diff --git a/lib-python/2.2/symtable.py b/lib-python/2.2/symtable.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/symtable.py @@ -0,0 +1,255 @@ +"""Interface to the compiler's internal symbol tables""" + +import _symtable +from _symtable import USE, DEF_GLOBAL, DEF_LOCAL, DEF_PARAM, \ + DEF_STAR, DEF_DOUBLESTAR, DEF_INTUPLE, DEF_FREE, \ + DEF_FREE_GLOBAL, DEF_FREE_CLASS, DEF_IMPORT, DEF_BOUND, \ + OPT_IMPORT_STAR, OPT_EXEC, OPT_BARE_EXEC + +import weakref + +__all__ = ["symtable", "SymbolTable", "newSymbolTable", "Class", + "Function", "Symbol"] + +def symtable(code, filename, compile_type): + raw = _symtable.symtable(code, filename, compile_type) + return newSymbolTable(raw[0], filename) + +class SymbolTableFactory: + def __init__(self): + self.__memo = weakref.WeakValueDictionary() + + def new(self, table, filename): + if table.type == _symtable.TYPE_FUNCTION: + return Function(table, filename) + if table.type == _symtable.TYPE_CLASS: + return Class(table, filename) + return SymbolTable(table, filename) + + def __call__(self, table, filename): + key = table, filename + obj = self.__memo.get(key, None) + if obj is None: + obj = self.__memo[key] = self.new(table, filename) + return obj + +newSymbolTable = SymbolTableFactory() + +def bool(x): + """Helper to force boolean result to 1 or 0""" + if x: + return 1 + return 0 + +def is_free(flags): + if (flags & (USE | DEF_FREE)) \ + and (flags & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)): + return 1 + if flags & DEF_FREE_CLASS: + return 1 + return 0 + +class SymbolTable: + def __init__(self, raw_table, filename): + self._table = raw_table + self._filename = filename + self._symbols = {} + + def __repr__(self): + if self.__class__ == SymbolTable: + kind = "" + else: + kind = "%s " % self.__class__.__name__ + + if self._table.name == "global": + return "<%sSymbolTable for module %s>" % (kind, self._filename) + else: + return "<%sSymbolTable for %s in %s>" % (kind, self._table.name, + self._filename) + + def get_type(self): + if self._table.type == _symtable.TYPE_MODULE: + return "module" + if self._table.type == _symtable.TYPE_FUNCTION: + return "function" + if self._table.type == _symtable.TYPE_CLASS: + return "class" + assert self._table.type in (1, 2, 3), \ + "unexpected type: %s" % self._table.type + + def get_id(self): + return self._table.id + + def get_name(self): + return self._table.name + + def get_lineno(self): + return self._table.lineno + + def is_optimized(self): + return bool(self._table.type == _symtable.TYPE_FUNCTION + and not self._table.optimized) + + def is_nested(self): + return bool(self._table.nested) + + def has_children(self): + return bool(self._table.children) + + def has_exec(self): + """Return true if the scope uses exec""" + return bool(self._table.optimized & (OPT_EXEC | OPT_BARE_EXEC)) + + def has_import_star(self): + """Return true if the scope uses import *""" + return bool(self._table.optimized & OPT_IMPORT_STAR) + + def get_identifiers(self): + return self._table.symbols.keys() + + def lookup(self, name): + sym = self._symbols.get(name) + if sym is None: + flags = self._table.symbols[name] + namespaces = self.__check_children(name) + sym = self._symbols[name] = Symbol(name, flags, namespaces) + return sym + + def get_symbols(self): + return [self.lookup(ident) for ident in self.get_identifiers()] + + def __check_children(self, name): + return [newSymbolTable(st, self._filename) + for st in self._table.children + if st.name == name] + + def get_children(self): + return [newSymbolTable(st, self._filename) + for st in self._table.children] + +class Function(SymbolTable): + + # Default values for instance variables + __params = None + __locals = None + __frees = None + __globals = None + + def __idents_matching(self, test_func): + return tuple([ident for ident in self.get_identifiers() + if test_func(self._table.symbols[ident])]) + + def get_parameters(self): + if self.__params is None: + self.__params = self.__idents_matching(lambda x:x & DEF_PARAM) + return self.__params + + def get_locals(self): + if self.__locals is None: + self.__locals = self.__idents_matching(lambda x:x & DEF_BOUND) + return self.__locals + + def get_globals(self): + if self.__globals is None: + glob = DEF_GLOBAL | DEF_FREE_GLOBAL + self.__globals = self.__idents_matching(lambda x:x & glob) + return self.__globals + + def get_frees(self): + if self.__frees is None: + self.__frees = self.__idents_matching(is_free) + return self.__frees + +class Class(SymbolTable): + + __methods = None + + def get_methods(self): + if self.__methods is None: + d = {} + for st in self._table.children: + d[st.name] = 1 + self.__methods = tuple(d.keys()) + return self.__methods + +class Symbol: + def __init__(self, name, flags, namespaces=None): + self.__name = name + self.__flags = flags + self.__namespaces = namespaces or () + + def __repr__(self): + return "" % self.__name + + def get_name(self): + return self.__name + + def is_referenced(self): + return bool(self.__flags & _symtable.USE) + + def is_parameter(self): + return bool(self.__flags & DEF_PARAM) + + def is_global(self): + return bool((self.__flags & DEF_GLOBAL) + or (self.__flags & DEF_FREE_GLOBAL)) + + def is_vararg(self): + return bool(self.__flags & DEF_STAR) + + def is_keywordarg(self): + return bool(self.__flags & DEF_DOUBLESTAR) + + def is_local(self): + return bool(self.__flags & DEF_BOUND) + + def is_free(self): + if (self.__flags & (USE | DEF_FREE)) \ + and (self.__flags & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)): + return 1 + if self.__flags & DEF_FREE_CLASS: + return 1 + return 0 + + def is_imported(self): + return bool(self.__flags & DEF_IMPORT) + + def is_assigned(self): + return bool(self.__flags & DEF_LOCAL) + + def is_in_tuple(self): + return bool(self.__flags & DEF_INTUPLE) + + def is_namespace(self): + """Returns true if name binding introduces new namespace. + + If the name is used as the target of a function or class + statement, this will be true. + + Note that a single name can be bound to multiple objects. If + is_namespace() is true, the name may also be bound to other + objects, like an int or list, that does not introduce a new + namespace. + """ + return bool(self.__namespaces) + + def get_namespaces(self): + """Return a list of namespaces bound to this name""" + return self.__namespaces + + def get_namespace(self): + """Returns the single namespace bound to this name. + + Raises ValueError if the name is bound to multiple namespaces. + """ + if len(self.__namespaces) != 1: + raise ValueError, "name is bound to multiple namespaces" + return self.__namespaces[0] + +if __name__ == "__main__": + import os, sys + src = open(sys.argv[0]).read() + mod = symtable(src, os.path.split(sys.argv[0])[1], "exec") + for ident in mod.get_identifiers(): + info = mod.lookup(ident) + print info, info.is_local(), info.is_namespace() diff --git a/lib-python/2.2/tabnanny.py b/lib-python/2.2/tabnanny.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/tabnanny.py @@ -0,0 +1,327 @@ +#! /usr/bin/env python + +"""The Tab Nanny despises ambiguous indentation. She knows no mercy. + +tabnanny -- Detection of ambiguous indentation + +For the time being this module is intended to be called as a script. +However it is possible to import it into an IDE and use the function +check() described below. + +Warning: The API provided by this module is likely to change in future +releases; such changes may not be backward compatible. +""" + +# Released to the public domain, by Tim Peters, 15 April 1998. + +# XXX Note: this is now a standard library module. +# XXX The API needs to undergo changes however; the current code is too +# XXX script-like. This will be addressed later. + +__version__ = "6" + +import os +import sys +import getopt +import tokenize +if not hasattr(tokenize, 'NL'): + raise ValueError("tokenize.NL doesn't exist -- tokenize module too old") + +__all__ = ["check", "NannyNag", "process_tokens"] + +verbose = 0 +filename_only = 0 + +def errprint(*args): + sep = "" + for arg in args: + sys.stderr.write(sep + str(arg)) + sep = " " + sys.stderr.write("\n") + +def main(): + global verbose, filename_only + try: + opts, args = getopt.getopt(sys.argv[1:], "qv") + except getopt.error, msg: + errprint(msg) + return + for o, a in opts: + if o == '-q': + filename_only = filename_only + 1 + if o == '-v': + verbose = verbose + 1 + if not args: + errprint("Usage:", sys.argv[0], "[-v] file_or_directory ...") + return + for arg in args: + check(arg) + +class NannyNag: + """ + Raised by tokeneater() if detecting an ambiguous indent. + Captured and handled in check(). + """ + def __init__(self, lineno, msg, line): + self.lineno, self.msg, self.line = lineno, msg, line + def get_lineno(self): + return self.lineno + def get_msg(self): + return self.msg + def get_line(self): + return self.line + +def check(file): + """check(file_or_dir) + + If file_or_dir is a directory and not a symbolic link, then recursively + descend the directory tree named by file_or_dir, checking all .py files + along the way. If file_or_dir is an ordinary Python source file, it is + checked for whitespace related problems. The diagnostic messages are + written to standard output using the print statement. + """ + + if os.path.isdir(file) and not os.path.islink(file): + if verbose: + print "%s: listing directory" % `file` + names = os.listdir(file) + for name in names: + fullname = os.path.join(file, name) + if (os.path.isdir(fullname) and + not os.path.islink(fullname) or + os.path.normcase(name[-3:]) == ".py"): + check(fullname) + return + + try: + f = open(file) + except IOError, msg: + errprint("%s: I/O Error: %s" % (`file`, str(msg))) + return + + if verbose > 1: + print "checking", `file`, "..." + + try: + process_tokens(tokenize.generate_tokens(f.readline)) + + except tokenize.TokenError, msg: + errprint("%s: Token Error: %s" % (`file`, str(msg))) + return + + except NannyNag, nag: + badline = nag.get_lineno() + line = nag.get_line() + if verbose: + print "%s: *** Line %d: trouble in tab city! ***" % ( + `file`, badline) + print "offending line:", `line` + print nag.get_msg() + else: + if ' ' in file: file = '"' + file + '"' + if filename_only: print file + else: print file, badline, `line` + return + + if verbose: + print "%s: Clean bill of health." % `file` + +class Whitespace: + # the characters used for space and tab + S, T = ' \t' + + # members: + # raw + # the original string + # n + # the number of leading whitespace characters in raw + # nt + # the number of tabs in raw[:n] + # norm + # the normal form as a pair (count, trailing), where: + # count + # a tuple such that raw[:n] contains count[i] + # instances of S * i + T + # trailing + # the number of trailing spaces in raw[:n] + # It's A Theorem that m.indent_level(t) == + # n.indent_level(t) for all t >= 1 iff m.norm == n.norm. + # is_simple + # true iff raw[:n] is of the form (T*)(S*) + + def __init__(self, ws): + self.raw = ws + S, T = Whitespace.S, Whitespace.T + count = [] + b = n = nt = 0 + for ch in self.raw: + if ch == S: + n = n + 1 + b = b + 1 + elif ch == T: + n = n + 1 + nt = nt + 1 + if b >= len(count): + count = count + [0] * (b - len(count) + 1) + count[b] = count[b] + 1 + b = 0 + else: + break + self.n = n + self.nt = nt + self.norm = tuple(count), b + self.is_simple = len(count) <= 1 + + # return length of longest contiguous run of spaces (whether or not + # preceding a tab) + def longest_run_of_spaces(self): + count, trailing = self.norm + return max(len(count)-1, trailing) + + def indent_level(self, tabsize): + # count, il = self.norm + # for i in range(len(count)): + # if count[i]: + # il = il + (i/tabsize + 1)*tabsize * count[i] + # return il + + # quicker: + # il = trailing + sum (i/ts + 1)*ts*count[i] = + # trailing + ts * sum (i/ts + 1)*count[i] = + # trailing + ts * sum i/ts*count[i] + count[i] = + # trailing + ts * [(sum i/ts*count[i]) + (sum count[i])] = + # trailing + ts * [(sum i/ts*count[i]) + num_tabs] + # and note that i/ts*count[i] is 0 when i < ts + + count, trailing = self.norm + il = 0 + for i in range(tabsize, len(count)): + il = il + i/tabsize * count[i] + return trailing + tabsize * (il + self.nt) + + # return true iff self.indent_level(t) == other.indent_level(t) + # for all t >= 1 + def equal(self, other): + return self.norm == other.norm + + # return a list of tuples (ts, i1, i2) such that + # i1 == self.indent_level(ts) != other.indent_level(ts) == i2. + # Intended to be used after not self.equal(other) is known, in which + # case it will return at least one witnessing tab size. + def not_equal_witness(self, other): + n = max(self.longest_run_of_spaces(), + other.longest_run_of_spaces()) + 1 + a = [] + for ts in range(1, n+1): + if self.indent_level(ts) != other.indent_level(ts): + a.append( (ts, + self.indent_level(ts), + other.indent_level(ts)) ) + return a + + # Return true iff self.indent_level(t) < other.indent_level(t) + # for all t >= 1. + # The algorithm is due to Vincent Broman. + # Easy to prove it's correct. + # XXXpost that. + # Trivial to prove n is sharp (consider T vs ST). + # Unknown whether there's a faster general way. I suspected so at + # first, but no longer. + # For the special (but common!) case where M and N are both of the + # form (T*)(S*), M.less(N) iff M.len() < N.len() and + # M.num_tabs() <= N.num_tabs(). Proof is easy but kinda long-winded. + # XXXwrite that up. + # Note that M is of the form (T*)(S*) iff len(M.norm[0]) <= 1. + def less(self, other): + if self.n >= other.n: + return 0 + if self.is_simple and other.is_simple: + return self.nt <= other.nt + n = max(self.longest_run_of_spaces(), + other.longest_run_of_spaces()) + 1 + # the self.n >= other.n test already did it for ts=1 + for ts in range(2, n+1): + if self.indent_level(ts) >= other.indent_level(ts): + return 0 + return 1 + + # return a list of tuples (ts, i1, i2) such that + # i1 == self.indent_level(ts) >= other.indent_level(ts) == i2. + # Intended to be used after not self.less(other) is known, in which + # case it will return at least one witnessing tab size. + def not_less_witness(self, other): + n = max(self.longest_run_of_spaces(), + other.longest_run_of_spaces()) + 1 + a = [] + for ts in range(1, n+1): + if self.indent_level(ts) >= other.indent_level(ts): + a.append( (ts, + self.indent_level(ts), + other.indent_level(ts)) ) + return a + +def format_witnesses(w): + import string + firsts = map(lambda tup: str(tup[0]), w) + prefix = "at tab size" + if len(w) > 1: + prefix = prefix + "s" + return prefix + " " + string.join(firsts, ', ') + +def process_tokens(tokens): + INDENT = tokenize.INDENT + DEDENT = tokenize.DEDENT + NEWLINE = tokenize.NEWLINE + JUNK = tokenize.COMMENT, tokenize.NL + indents = [Whitespace("")] + check_equal = 0 + + for (type, token, start, end, line) in tokens: + if type == NEWLINE: + # a program statement, or ENDMARKER, will eventually follow, + # after some (possibly empty) run of tokens of the form + # (NL | COMMENT)* (INDENT | DEDENT+)? + # If an INDENT appears, setting check_equal is wrong, and will + # be undone when we see the INDENT. + check_equal = 1 + + elif type == INDENT: + check_equal = 0 + thisguy = Whitespace(token) + if not indents[-1].less(thisguy): + witness = indents[-1].not_less_witness(thisguy) + msg = "indent not greater e.g. " + format_witnesses(witness) + raise NannyNag(start[0], msg, line) + indents.append(thisguy) + + elif type == DEDENT: + # there's nothing we need to check here! what's important is + # that when the run of DEDENTs ends, the indentation of the + # program statement (or ENDMARKER) that triggered the run is + # equal to what's left at the top of the indents stack + + # Ouch! This assert triggers if the last line of the source + # is indented *and* lacks a newline -- then DEDENTs pop out + # of thin air. + # assert check_equal # else no earlier NEWLINE, or an earlier INDENT + check_equal = 1 + + del indents[-1] + + elif check_equal and type not in JUNK: + # this is the first "real token" following a NEWLINE, so it + # must be the first token of the next program statement, or an + # ENDMARKER; the "line" argument exposes the leading whitespace + # for this statement; in the case of ENDMARKER, line is an empty + # string, so will properly match the empty string with which the + # "indents" stack was seeded + check_equal = 0 + thisguy = Whitespace(line) + if not indents[-1].equal(thisguy): + witness = indents[-1].not_equal_witness(thisguy) + msg = "indent not equal e.g. " + format_witnesses(witness) + raise NannyNag(start[0], msg, line) + + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/telnetlib.py b/lib-python/2.2/telnetlib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/telnetlib.py @@ -0,0 +1,593 @@ +"""TELNET client class. + +Based on RFC 854: TELNET Protocol Specification, by J. Postel and +J. Reynolds + +Example: + +>>> from telnetlib import Telnet +>>> tn = Telnet('www.python.org', 79) # connect to finger port +>>> tn.write('guido\r\n') +>>> print tn.read_all() +Login Name TTY Idle When Where +guido Guido van Rossum pts/2 snag.cnri.reston.. + +>>> + +Note that read_all() won't read until eof -- it just reads some data +-- but it guarantees to read at least one byte unless EOF is hit. + +It is possible to pass a Telnet object to select.select() in order to +wait until more data is available. Note that in this case, +read_eager() may return '' even if there was data on the socket, +because the protocol negotiation may have eaten the data. This is why +EOFError is needed in some cases to distinguish between "no data" and +"connection closed" (since the socket also appears ready for reading +when it is closed). + +Bugs: +- may hang when connection is slow in the middle of an IAC sequence + +To do: +- option negotiation +- timeout should be intrinsic to the connection object instead of an + option on one of the read calls only + +""" + + +# Imported modules +import sys +import socket +import select + +__all__ = ["Telnet"] + +# Tunable parameters +DEBUGLEVEL = 0 + +# Telnet protocol defaults +TELNET_PORT = 23 + +# Telnet protocol characters (don't change) +IAC = chr(255) # "Interpret As Command" +DONT = chr(254) +DO = chr(253) +WONT = chr(252) +WILL = chr(251) +theNULL = chr(0) + +# Telnet protocol options code (don't change) +# These ones all come from arpa/telnet.h +BINARY = chr(0) # 8-bit data path +ECHO = chr(1) # echo +RCP = chr(2) # prepare to reconnect +SGA = chr(3) # suppress go ahead +NAMS = chr(4) # approximate message size +STATUS = chr(5) # give status +TM = chr(6) # timing mark +RCTE = chr(7) # remote controlled transmission and echo +NAOL = chr(8) # negotiate about output line width +NAOP = chr(9) # negotiate about output page size +NAOCRD = chr(10) # negotiate about CR disposition +NAOHTS = chr(11) # negotiate about horizontal tabstops +NAOHTD = chr(12) # negotiate about horizontal tab disposition +NAOFFD = chr(13) # negotiate about formfeed disposition +NAOVTS = chr(14) # negotiate about vertical tab stops +NAOVTD = chr(15) # negotiate about vertical tab disposition +NAOLFD = chr(16) # negotiate about output LF disposition +XASCII = chr(17) # extended ascii character set +LOGOUT = chr(18) # force logout +BM = chr(19) # byte macro +DET = chr(20) # data entry terminal +SUPDUP = chr(21) # supdup protocol +SUPDUPOUTPUT = chr(22) # supdup output +SNDLOC = chr(23) # send location +TTYPE = chr(24) # terminal type +EOR = chr(25) # end or record +TUID = chr(26) # TACACS user identification +OUTMRK = chr(27) # output marking +TTYLOC = chr(28) # terminal location number +VT3270REGIME = chr(29) # 3270 regime +X3PAD = chr(30) # X.3 PAD +NAWS = chr(31) # window size +TSPEED = chr(32) # terminal speed +LFLOW = chr(33) # remote flow control +LINEMODE = chr(34) # Linemode option +XDISPLOC = chr(35) # X Display Location +OLD_ENVIRON = chr(36) # Old - Environment variables +AUTHENTICATION = chr(37) # Authenticate +ENCRYPT = chr(38) # Encryption option +NEW_ENVIRON = chr(39) # New - Environment variables +# the following ones come from +# http://www.iana.org/assignments/telnet-options +# Unfortunately, that document does not assign identifiers +# to all of them, so we are making them up +TN3270E = chr(40) # TN3270E +XAUTH = chr(41) # XAUTH +CHARSET = chr(42) # CHARSET +RSP = chr(43) # Telnet Remote Serial Port +COM_PORT_OPTION = chr(44) # Com Port Control Option +SUPPRESS_LOCAL_ECHO = chr(45) # Telnet Suppress Local Echo +TLS = chr(46) # Telnet Start TLS +KERMIT = chr(47) # KERMIT +SEND_URL = chr(48) # SEND-URL +FORWARD_X = chr(49) # FORWARD_X +PRAGMA_LOGON = chr(138) # TELOPT PRAGMA LOGON +SSPI_LOGON = chr(139) # TELOPT SSPI LOGON +PRAGMA_HEARTBEAT = chr(140) # TELOPT PRAGMA HEARTBEAT +EXOPL = chr(255) # Extended-Options-List + +class Telnet: + + """Telnet interface class. + + An instance of this class represents a connection to a telnet + server. The instance is initially not connected; the open() + method must be used to establish a connection. Alternatively, the + host name and optional port number can be passed to the + constructor, too. + + Don't try to reopen an already connected instance. + + This class has many read_*() methods. Note that some of them + raise EOFError when the end of the connection is read, because + they can return an empty string for other reasons. See the + individual doc strings. + + read_until(expected, [timeout]) + Read until the expected string has been seen, or a timeout is + hit (default is no timeout); may block. + + read_all() + Read all data until EOF; may block. + + read_some() + Read at least one byte or EOF; may block. + + read_very_eager() + Read all data available already queued or on the socket, + without blocking. + + read_eager() + Read either data already queued or some data available on the + socket, without blocking. + + read_lazy() + Read all data in the raw queue (processing it first), without + doing any socket I/O. + + read_very_lazy() + Reads all data in the cooked queue, without doing any socket + I/O. + + set_option_negotiation_callback(callback) + Each time a telnet option is read on the input flow, this callback + (if set) is called with the following parameters : + callback(telnet socket, command (DO/DONT/WILL/WONT), option) + No other action is done afterwards by telnetlib. + + """ + + def __init__(self, host=None, port=0): + """Constructor. + + When called without arguments, create an unconnected instance. + With a hostname argument, it connects the instance; a port + number is optional. + + """ + self.debuglevel = DEBUGLEVEL + self.host = host + self.port = port + self.sock = None + self.rawq = '' + self.irawq = 0 + self.cookedq = '' + self.eof = 0 + self.option_callback = None + if host: + self.open(host, port) + + def open(self, host, port=0): + """Connect to a host. + + The optional second argument is the port number, which + defaults to the standard telnet port (23). + + Don't try to reopen an already connected instance. + + """ + self.eof = 0 + if not port: + port = TELNET_PORT + self.host = host + self.port = port + msg = "getaddrinfo returns an empty list" + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + try: + self.sock = socket.socket(af, socktype, proto) + self.sock.connect(sa) + except socket.error, msg: + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket.error, msg + + def __del__(self): + """Destructor -- close the connection.""" + self.close() + + def msg(self, msg, *args): + """Print a debug message, when the debug level is > 0. + + If extra arguments are present, they are substituted in the + message using the standard string formatting operator. + + """ + if self.debuglevel > 0: + print 'Telnet(%s,%d):' % (self.host, self.port), + if args: + print msg % args + else: + print msg + + def set_debuglevel(self, debuglevel): + """Set the debug level. + + The higher it is, the more debug output you get (on sys.stdout). + + """ + self.debuglevel = debuglevel + + def close(self): + """Close the connection.""" + if self.sock: + self.sock.close() + self.sock = 0 + self.eof = 1 + + def get_socket(self): + """Return the socket object used internally.""" + return self.sock + + def fileno(self): + """Return the fileno() of the socket object used internally.""" + return self.sock.fileno() + + def write(self, buffer): + """Write a string to the socket, doubling any IAC characters. + + Can block if the connection is blocked. May raise + socket.error if the connection is closed. + + """ + if IAC in buffer: + buffer = buffer.replace(IAC, IAC+IAC) + self.msg("send %s", `buffer`) + self.sock.sendall(buffer) + + def read_until(self, match, timeout=None): + """Read until a given string is encountered or until timeout. + + When no match is found, return whatever is available instead, + possibly the empty string. Raise EOFError if the connection + is closed and no cooked data is available. + + """ + n = len(match) + self.process_rawq() + i = self.cookedq.find(match) + if i >= 0: + i = i+n + buf = self.cookedq[:i] + self.cookedq = self.cookedq[i:] + return buf + s_reply = ([self], [], []) + s_args = s_reply + if timeout is not None: + s_args = s_args + (timeout,) + while not self.eof and apply(select.select, s_args) == s_reply: + i = max(0, len(self.cookedq)-n) + self.fill_rawq() + self.process_rawq() + i = self.cookedq.find(match, i) + if i >= 0: + i = i+n + buf = self.cookedq[:i] + self.cookedq = self.cookedq[i:] + return buf + return self.read_very_lazy() + + def read_all(self): + """Read all data until EOF; block until connection closed.""" + self.process_rawq() + while not self.eof: + self.fill_rawq() + self.process_rawq() + buf = self.cookedq + self.cookedq = '' + return buf + + def read_some(self): + """Read at least one byte of cooked data unless EOF is hit. + + Return '' if EOF is hit. Block if no data is immediately + available. + + """ + self.process_rawq() + while not self.cookedq and not self.eof: + self.fill_rawq() + self.process_rawq() + buf = self.cookedq + self.cookedq = '' + return buf + + def read_very_eager(self): + """Read everything that's possible without blocking in I/O (eager). + + Raise EOFError if connection closed and no cooked data + available. Return '' if no cooked data available otherwise. + Don't block unless in the midst of an IAC sequence. + + """ + self.process_rawq() + while not self.eof and self.sock_avail(): + self.fill_rawq() + self.process_rawq() + return self.read_very_lazy() + + def read_eager(self): + """Read readily available data. + + Raise EOFError if connection closed and no cooked data + available. Return '' if no cooked data available otherwise. + Don't block unless in the midst of an IAC sequence. + + """ + self.process_rawq() + while not self.cookedq and not self.eof and self.sock_avail(): + self.fill_rawq() + self.process_rawq() + return self.read_very_lazy() + + def read_lazy(self): + """Process and return data that's already in the queues (lazy). + + Raise EOFError if connection closed and no data available. + Return '' if no cooked data available otherwise. Don't block + unless in the midst of an IAC sequence. + + """ + self.process_rawq() + return self.read_very_lazy() + + def read_very_lazy(self): + """Return any data available in the cooked queue (very lazy). + + Raise EOFError if connection closed and no data available. + Return '' if no cooked data available otherwise. Don't block. + + """ + buf = self.cookedq + self.cookedq = '' + if not buf and self.eof and not self.rawq: + raise EOFError, 'telnet connection closed' + return buf + + def set_option_negotiation_callback(self, callback): + """Provide a callback function called after each receipt of a telnet option.""" + self.option_callback = callback + + def process_rawq(self): + """Transfer from raw queue to cooked queue. + + Set self.eof when connection is closed. Don't block unless in + the midst of an IAC sequence. + + """ + buf = '' + try: + while self.rawq: + c = self.rawq_getchar() + if c == theNULL: + continue + if c == "\021": + continue + if c != IAC: + buf = buf + c + continue + c = self.rawq_getchar() + if c == IAC: + buf = buf + c + elif c in (DO, DONT): + opt = self.rawq_getchar() + self.msg('IAC %s %d', c == DO and 'DO' or 'DONT', ord(opt)) + if self.option_callback: + self.option_callback(self.sock, c, opt) + else: + self.sock.sendall(IAC + WONT + opt) + elif c in (WILL, WONT): + opt = self.rawq_getchar() + self.msg('IAC %s %d', + c == WILL and 'WILL' or 'WONT', ord(opt)) + if self.option_callback: + self.option_callback(self.sock, c, opt) + else: + self.sock.sendall(IAC + DONT + opt) + else: + self.msg('IAC %d not recognized' % ord(c)) + except EOFError: # raised by self.rawq_getchar() + pass + self.cookedq = self.cookedq + buf + + def rawq_getchar(self): + """Get next char from raw queue. + + Block if no data is immediately available. Raise EOFError + when connection is closed. + + """ + if not self.rawq: + self.fill_rawq() + if self.eof: + raise EOFError + c = self.rawq[self.irawq] + self.irawq = self.irawq + 1 + if self.irawq >= len(self.rawq): + self.rawq = '' + self.irawq = 0 + return c + + def fill_rawq(self): + """Fill raw queue from exactly one recv() system call. + + Block if no data is immediately available. Set self.eof when + connection is closed. + + """ + if self.irawq >= len(self.rawq): + self.rawq = '' + self.irawq = 0 + # The buffer size should be fairly small so as to avoid quadratic + # behavior in process_rawq() above + buf = self.sock.recv(50) + self.msg("recv %s", `buf`) + self.eof = (not buf) + self.rawq = self.rawq + buf + + def sock_avail(self): + """Test whether data is available on the socket.""" + return select.select([self], [], [], 0) == ([self], [], []) + + def interact(self): + """Interaction function, emulates a very dumb telnet client.""" + if sys.platform == "win32": + self.mt_interact() + return + while 1: + rfd, wfd, xfd = select.select([self, sys.stdin], [], []) + if self in rfd: + try: + text = self.read_eager() + except EOFError: + print '*** Connection closed by remote host ***' + break + if text: + sys.stdout.write(text) + sys.stdout.flush() + if sys.stdin in rfd: + line = sys.stdin.readline() + if not line: + break + self.write(line) + + def mt_interact(self): + """Multithreaded version of interact().""" + import thread + thread.start_new_thread(self.listener, ()) + while 1: + line = sys.stdin.readline() + if not line: + break + self.write(line) + + def listener(self): + """Helper for mt_interact() -- this executes in the other thread.""" + while 1: + try: + data = self.read_eager() + except EOFError: + print '*** Connection closed by remote host ***' + return + if data: + sys.stdout.write(data) + else: + sys.stdout.flush() + + def expect(self, list, timeout=None): + """Read until one from a list of a regular expressions matches. + + The first argument is a list of regular expressions, either + compiled (re.RegexObject instances) or uncompiled (strings). + The optional second argument is a timeout, in seconds; default + is no timeout. + + Return a tuple of three items: the index in the list of the + first regular expression that matches; the match object + returned; and the text read up till and including the match. + + If EOF is read and no text was read, raise EOFError. + Otherwise, when nothing matches, return (-1, None, text) where + text is the text received so far (may be the empty string if a + timeout happened). + + If a regular expression ends with a greedy match (e.g. '.*') + or if more than one expression can match the same input, the + results are undeterministic, and may depend on the I/O timing. + + """ + re = None + list = list[:] + indices = range(len(list)) + for i in indices: + if not hasattr(list[i], "search"): + if not re: import re + list[i] = re.compile(list[i]) + while 1: + self.process_rawq() + for i in indices: + m = list[i].search(self.cookedq) + if m: + e = m.end() + text = self.cookedq[:e] + self.cookedq = self.cookedq[e:] + return (i, m, text) + if self.eof: + break + if timeout is not None: + r, w, x = select.select([self.fileno()], [], [], timeout) + if not r: + break + self.fill_rawq() + text = self.read_very_lazy() + if not text and self.eof: + raise EOFError + return (-1, None, text) + + +def test(): + """Test program for telnetlib. + + Usage: python telnetlib.py [-d] ... [host [port]] + + Default host is localhost; default port is 23. + + """ + debuglevel = 0 + while sys.argv[1:] and sys.argv[1] == '-d': + debuglevel = debuglevel+1 + del sys.argv[1] + host = 'localhost' + if sys.argv[1:]: + host = sys.argv[1] + port = 0 + if sys.argv[2:]: + portstr = sys.argv[2] + try: + port = int(portstr) + except ValueError: + port = socket.getservbyname(portstr, 'tcp') + tn = Telnet() + tn.set_debuglevel(debuglevel) + tn.open(host, port) + tn.interact() + tn.close() + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/tempfile.py b/lib-python/2.2/tempfile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/tempfile.py @@ -0,0 +1,244 @@ +"""Temporary files and filenames.""" + +# XXX This tries to be not UNIX specific, but I don't know beans about +# how to choose a temp directory or filename on MS-DOS or other +# systems so it may have to be changed... + +import os + +__all__ = ["mktemp", "TemporaryFile", "tempdir", "gettempprefix"] + +# Parameters that the caller may set to override the defaults +tempdir = None +template = None + +def gettempdir(): + """Function to calculate the directory to use.""" + global tempdir + if tempdir is not None: + return tempdir + + # _gettempdir_inner deduces whether a candidate temp dir is usable by + # trying to create a file in it, and write to it. If that succeeds, + # great, it closes the file and unlinks it. There's a race, though: + # the *name* of the test file it tries is the same across all threads + # under most OSes (Linux is an exception), and letting multiple threads + # all try to open, write to, close, and unlink a single file can cause + # a variety of bogus errors (e.g., you cannot unlink a file under + # Windows if anyone has it open, and two threads cannot create the + # same file in O_EXCL mode under Unix). The simplest cure is to serialize + # calls to _gettempdir_inner. This isn't a real expense, because the + # first thread to succeed sets the global tempdir, and all subsequent + # calls to gettempdir() reuse that without trying _gettempdir_inner. + _tempdir_lock.acquire() + try: + return _gettempdir_inner() + finally: + _tempdir_lock.release() + +def _gettempdir_inner(): + """Function to calculate the directory to use.""" + global tempdir + if tempdir is not None: + return tempdir + try: + pwd = os.getcwd() + except (AttributeError, os.error): + pwd = os.curdir + attempdirs = ['/tmp', '/var/tmp', '/usr/tmp', pwd] + if os.name == 'nt': + attempdirs.insert(0, 'C:\\TEMP') + attempdirs.insert(0, '\\TEMP') + elif os.name == 'mac': + import macfs, MACFS + try: + refnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk, + MACFS.kTemporaryFolderType, 1) + dirname = macfs.FSSpec((refnum, dirid, '')).as_pathname() + attempdirs.insert(0, dirname) + except macfs.error: + pass + elif os.name == 'riscos': + scrapdir = os.getenv('Wimp$ScrapDir') + if scrapdir: + attempdirs.insert(0, scrapdir) + for envname in 'TMPDIR', 'TEMP', 'TMP': + if os.environ.has_key(envname): + attempdirs.insert(0, os.environ[envname]) + testfile = gettempprefix() + 'test' + for dir in attempdirs: + try: + filename = os.path.join(dir, testfile) + if os.name == 'posix': + try: + fd = os.open(filename, + os.O_RDWR | os.O_CREAT | os.O_EXCL, 0700) + except OSError: + pass + else: + fp = os.fdopen(fd, 'w') + fp.write('blat') + fp.close() + os.unlink(filename) + del fp, fd + tempdir = dir + break + else: + fp = open(filename, 'w') + fp.write('blat') + fp.close() + os.unlink(filename) + tempdir = dir + break + except IOError: + pass + if tempdir is None: + msg = "Can't find a usable temporary directory amongst " + `attempdirs` + raise IOError, msg + return tempdir + + +# template caches the result of gettempprefix, for speed, when possible. +# XXX unclear why this isn't "_template"; left it "template" for backward +# compatibility. +if os.name == "posix": + # We don't try to cache the template on posix: the pid may change on us + # between calls due to a fork, and on Linux the pid changes even for + # another thread in the same process. Since any attempt to keep the + # cache in synch would have to call os.getpid() anyway in order to make + # sure the pid hasn't changed between calls, a cache wouldn't save any + # time. In addition, a cache is difficult to keep correct with the pid + # changing willy-nilly, and earlier attempts proved buggy (races). + template = None + +# Else the pid never changes, so gettempprefix always returns the same +# string. +elif os.name == "nt": + template = '~' + `os.getpid()` + '-' +elif os.name in ('mac', 'riscos'): + template = 'Python-Tmp-' +else: + template = 'tmp' # XXX might choose a better one + +def gettempprefix(): + """Function to calculate a prefix of the filename to use. + + This incorporates the current process id on systems that support such a + notion, so that concurrent processes don't generate the same prefix. + """ + + global template + if template is None: + return '@' + `os.getpid()` + '.' + else: + return template + + +def mktemp(suffix=""): + """User-callable function to return a unique temporary file name.""" + dir = gettempdir() + pre = gettempprefix() + while 1: + i = _counter.get_next() + file = os.path.join(dir, pre + str(i) + suffix) + if not os.path.exists(file): + return file + + +class TemporaryFileWrapper: + """Temporary file wrapper + + This class provides a wrapper around files opened for temporary use. + In particular, it seeks to automatically remove the file when it is + no longer needed. + """ + + # Cache the unlinker so we don't get spurious errors at shutdown + # when the module-level "os" is None'd out. Note that this must + # be referenced as self.unlink, because the name TemporaryFileWrapper + # may also get None'd out before __del__ is called. + unlink = os.unlink + + def __init__(self, file, path): + self.file = file + self.path = path + self.close_called = 0 + + def close(self): + if not self.close_called: + self.close_called = 1 + self.file.close() + self.unlink(self.path) + + def __del__(self): + self.close() + + def __getattr__(self, name): + file = self.__dict__['file'] + a = getattr(file, name) + if type(a) != type(0): + setattr(self, name, a) + return a + + +def TemporaryFile(mode='w+b', bufsize=-1, suffix=""): + """Create and return a temporary file (opened read-write by default).""" + name = mktemp(suffix) + if os.name == 'posix': + # Unix -- be very careful + fd = os.open(name, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700) + try: + os.unlink(name) + return os.fdopen(fd, mode, bufsize) + except: + os.close(fd) + raise + else: + # Non-unix -- can't unlink file that's still open, use wrapper + file = open(name, mode, bufsize) + return TemporaryFileWrapper(file, name) + +# In order to generate unique names, mktemp() uses _counter.get_next(). +# This returns a unique integer on each call, in a threadsafe way (i.e., +# multiple threads will never see the same integer). The integer will +# usually be a Python int, but if _counter.get_next() is called often +# enough, it will become a Python long. +# Note that the only names that survive this next block of code +# are "_counter" and "_tempdir_lock". + +class _ThreadSafeCounter: + def __init__(self, mutex, initialvalue=0): + self.mutex = mutex + self.i = initialvalue + + def get_next(self): + self.mutex.acquire() + result = self.i + try: + newi = result + 1 + except OverflowError: + newi = long(result) + 1 + self.i = newi + self.mutex.release() + return result + +try: + import thread + +except ImportError: + class _DummyMutex: + def acquire(self): + pass + + release = acquire + + _counter = _ThreadSafeCounter(_DummyMutex()) + _tempdir_lock = _DummyMutex() + del _DummyMutex + +else: + _counter = _ThreadSafeCounter(thread.allocate_lock()) + _tempdir_lock = thread.allocate_lock() + del thread + +del _ThreadSafeCounter diff --git a/lib-python/2.2/test/README b/lib-python/2.2/test/README new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/README @@ -0,0 +1,372 @@ + Writing Python Regression Tests + ------------------------------- + Skip Montanaro + (skip at mojam.com) + + +Introduction + +If you add a new module to Python or modify the functionality of an existing +module, you should write one or more test cases to exercise that new +functionality. There are different ways to do this within the regression +testing facility provided with Python; any particular test should use only +one of these options. Each option requires writing a test module using the +conventions of the the selected option: + + - PyUnit based tests + - doctest based tests + - "traditional" Python test modules + +Regardless of the mechanics of the testing approach you choose, +you will be writing unit tests (isolated tests of functions and objects +defined by the module) using white box techniques. Unlike black box +testing, where you only have the external interfaces to guide your test case +writing, in white box testing you can see the code being tested and tailor +your test cases to exercise it more completely. In particular, you will be +able to refer to the C and Python code in the CVS repository when writing +your regression test cases. + + +PyUnit based tests + +The PyUnit framework is based on the ideas of unit testing as espoused +by Kent Beck and the Extreme Programming (XP) movement. The specific +interface provided by the framework is tightly based on the JUnit +Java implementation of Beck's original SmallTalk test framework. Please +see the documentation of the unittest module for detailed information on +the interface and general guidelines on writing PyUnit based tests. + +The test_support helper module provides a two functions for use by +PyUnit based tests in the Python regression testing framework: +run_unittest() takes a unittest.TestCase derived class as a parameter +and runs the tests defined in that class, and run_suite() takes a +populated TestSuite instance and runs the tests.. All test methods in +the Python regression framework have names that start with "test_" and +use lower-case names with words separated with underscores. + +All PyUnit-based tests in the Python test suite use boilerplate that +looks like this: + + import unittest + import test_support + + class MyTestCase(unittest.TestCase): + # define test methods here... + + def test_main(): + test_support.run_unittest(MyTestCase) + + if __name__ == "__main__": + test_main() + +This has the advantage that it allows the unittest module to be used +as a script to run individual tests as well as working well with the +regrtest framework. + + +doctest based tests + +Tests written to use doctest are actually part of the docstrings for +the module being tested. Each test is written as a display of an +interactive session, including the Python prompts, statements that would +be typed by the user, and the output of those statements (including +tracebacks, although only the exception msg needs to be retained then). +The module in the test package is simply a wrapper that causes doctest +to run over the tests in the module. The test for the difflib module +provides a convenient example: + + import difflib, test_support + test_support.run_doctest(difflib) + +If the test is successful, nothing is written to stdout (so you should not +create a corresponding output/test_difflib file), but running regrtest +with -v will give a detailed report, the same as if passing -v to doctest. + +A second argument can be passed to run_doctest to tell doctest to search +sys.argv for -v instead of using test_support's idea of verbosity. This +is useful for writing doctest-based tests that aren't simply running a +doctest'ed Lib module, but contain the doctests themselves. Then at +times you may want to run such a test directly as a doctest, independent +of the regrtest framework. The tail end of test_descrtut.py is a good +example: + + def test_main(verbose=None): + import test_support, test.test_descrtut + test_support.run_doctest(test.test_descrtut, verbose) + + if __name__ == "__main__": + test_main(1) + +If run via regrtest, test_main() is called (by regrtest) without specifying +verbose, and then test_support's idea of verbosity is used. But when +run directly, test_main(1) is called, and then doctest's idea of verbosity +is used. + +See the documentation for the doctest module for information on +writing tests using the doctest framework. + + +"traditional" Python test modules + +The mechanics of how the "traditional" test system operates are fairly +straightforward. When a test case is run, the output is compared with the +expected output that is stored in .../Lib/test/output. If the test runs to +completion and the actual and expected outputs match, the test succeeds, if +not, it fails. If an ImportError or test_support.TestSkipped error is +raised, the test is not run. + + +Executing Test Cases + +If you are writing test cases for module spam, you need to create a file +in .../Lib/test named test_spam.py. In addition, if the tests are expected +to write to stdout during a successful run, you also need to create an +expected output file in .../Lib/test/output named test_spam ("..." +represents the top-level directory in the Python source tree, the directory +containing the configure script). If needed, generate the initial version +of the test output file by executing: + + ./python Lib/test/regrtest.py -g test_spam.py + +from the top-level directory. + +Any time you modify test_spam.py you need to generate a new expected +output file. Don't forget to desk check the generated output to make sure +it's really what you expected to find! All in all it's usually better +not to have an expected-out file (note that doctest- and unittest-based +tests do not). + +To run a single test after modifying a module, simply run regrtest.py +without the -g flag: + + ./python Lib/test/regrtest.py test_spam.py + +While debugging a regression test, you can of course execute it +independently of the regression testing framework and see what it prints: + + ./python Lib/test/test_spam.py + +To run the entire test suite: + +[UNIX, + other platforms where "make" works] Make the "test" target at the +top level: + + make test + +{WINDOWS] Run rt.bat from your PCBuild directory. Read the comments at +the top of rt.bat for the use of special -d, -O and -q options processed +by rt.bat. + +[OTHER] You can simply execute the two runs of regrtest (optimized and +non-optimized) directly: + + ./python Lib/test/regrtest.py + ./python -O Lib/test/regrtest.py + +But note that this way picks up whatever .pyc and .pyo files happen to be +around. The makefile and rt.bat ways run the tests twice, the first time +removing all .pyc and .pyo files from the subtree rooted at Lib/. + +Test cases generate output based upon values computed by the test code. +When executed, regrtest.py compares the actual output generated by executing +the test case with the expected output and reports success or failure. It +stands to reason that if the actual and expected outputs are to match, they +must not contain any machine dependencies. This means your test cases +should not print out absolute machine addresses (e.g. the return value of +the id() builtin function) or floating point numbers with large numbers of +significant digits (unless you understand what you are doing!). + + +Test Case Writing Tips + +Writing good test cases is a skilled task and is too complex to discuss in +detail in this short document. Many books have been written on the subject. +I'll show my age by suggesting that Glenford Myers' "The Art of Software +Testing", published in 1979, is still the best introduction to the subject +available. It is short (177 pages), easy to read, and discusses the major +elements of software testing, though its publication predates the +object-oriented software revolution, so doesn't cover that subject at all. +Unfortunately, it is very expensive (about $100 new). If you can borrow it +or find it used (around $20), I strongly urge you to pick up a copy. + +The most important goal when writing test cases is to break things. A test +case that doesn't uncover a bug is much less valuable than one that does. +In designing test cases you should pay attention to the following: + + * Your test cases should exercise all the functions and objects defined + in the module, not just the ones meant to be called by users of your + module. This may require you to write test code that uses the module + in ways you don't expect (explicitly calling internal functions, for + example - see test_atexit.py). + + * You should consider any boundary values that may tickle exceptional + conditions (e.g. if you were writing regression tests for division, + you might well want to generate tests with numerators and denominators + at the limits of floating point and integer numbers on the machine + performing the tests as well as a denominator of zero). + + * You should exercise as many paths through the code as possible. This + may not always be possible, but is a goal to strive for. In + particular, when considering if statements (or their equivalent), you + want to create test cases that exercise both the true and false + branches. For loops, you should create test cases that exercise the + loop zero, one and multiple times. + + * You should test with obviously invalid input. If you know that a + function requires an integer input, try calling it with other types of + objects to see how it responds. + + * You should test with obviously out-of-range input. If the domain of a + function is only defined for positive integers, try calling it with a + negative integer. + + * If you are going to fix a bug that wasn't uncovered by an existing + test, try to write a test case that exposes the bug (preferably before + fixing it). + + * If you need to create a temporary file, you can use the filename in + test_support.TESTFN to do so. It is important to remove the file + when done; other tests should be able to use the name without cleaning + up after your test. + + +Regression Test Writing Rules + +Each test case is different. There is no "standard" form for a Python +regression test case, though there are some general rules (note that +these mostly apply only to the "classic" tests; unittest- and doctest- +based tests should follow the conventions natural to those frameworks): + + * If your test case detects a failure, raise TestFailed (found in + test_support). + + * Import everything you'll need as early as possible. + + * If you'll be importing objects from a module that is at least + partially platform-dependent, only import those objects you need for + the current test case to avoid spurious ImportError exceptions that + prevent the test from running to completion. + + * Print all your test case results using the print statement. For + non-fatal errors, print an error message (or omit a successful + completion print) to indicate the failure, but proceed instead of + raising TestFailed. + + * Use "assert" sparingly, if at all. It's usually better to just print + what you got, and rely on regrtest's got-vs-expected comparison to + catch deviations from what you expect. assert statements aren't + executed at all when regrtest is run in -O mode; and, because they + cause the test to stop immediately, can lead to a long & tedious + test-fix, test-fix, test-fix, ... cycle when things are badly broken + (and note that "badly broken" often includes running the test suite + for the first time on new platforms or under new implementations of + the language). + + +Miscellaneous + +There is a test_support module you can import from your test case. It +provides the following useful objects: + + * TestFailed - raise this exception when your regression test detects a + failure. + + * TestSkipped - raise this if the test could not be run because the + platform doesn't offer all the required facilities (like large + file support), even if all the required modules are available. + + * verbose - you can use this variable to control print output. Many + modules use it. Search for "verbose" in the test_*.py files to see + lots of examples. + + * verify(condition, reason='test failed'). Use this instead of + + assert condition[, reason] + + verify() has two advantages over assert: it works even in -O mode, + and it raises TestFailed on failure instead of AssertionError. + + * TESTFN - a string that should always be used as the filename when you + need to create a temp file. Also use try/finally to ensure that your + temp files are deleted before your test completes. Note that you + cannot unlink an open file on all operating systems, so also be sure + to close temp files before trying to unlink them. + + * sortdict(dict) - acts like repr(dict.items()), but sorts the items + first. This is important when printing a dict value, because the + order of items produced by dict.items() is not defined by the + language. + + * findfile(file) - you can call this function to locate a file somewhere + along sys.path or in the Lib/test tree - see test_linuxaudiodev.py for + an example of its use. + + * use_large_resources - true iff tests requiring large time or space + should be run. + + * fcmp(x,y) - you can call this function to compare two floating point + numbers when you expect them to only be approximately equal withing a + fuzz factor (test_support.FUZZ, which defaults to 1e-6). + +NOTE: Always import something from test_support like so: + + from test_support import verbose + +or like so: + + import test_support + ... use test_support.verbose in the code ... + +Never import anything from test_support like this: + + from test.test_support import verbose + +"test" is a package already, so can refer to modules it contains without +"test." qualification. If you do an explicit "test.xxx" qualification, that +can fool Python into believing test.xxx is a module distinct from the xxx +in the current package, and you can end up importing two distinct copies of +xxx. This is especially bad if xxx=test_support, as regrtest.py can (and +routinely does) overwrite its "verbose" and "use_large_resources" +attributes: if you get a second copy of test_support loaded, it may not +have the same values for those as regrtest intended. + + +Python and C statement coverage results are currently available at + + http://www.musi-cal.com/~skip/python/Python/dist/src/ + +As of this writing (July, 2000) these results are being generated nightly. +You can refer to the summaries and the test coverage output files to see +where coverage is adequate or lacking and write test cases to beef up the +coverage. + + +Some Non-Obvious regrtest Features + + * Automagic test detection: When you create a new test file + test_spam.py, you do not need to modify regrtest (or anything else) + to advertise its existence. regrtest searches for and runs all + modules in the test directory with names of the form test_xxx.py. + + * Miranda output: If, when running test_spam.py, regrtest does not + find an expected-output file test/output/test_spam, regrtest + pretends that it did find one, containing the single line + + test_spam + + This allows new tests that don't expect to print anything to stdout + to not bother creating expected-output files. + + * Two-stage testing: To run test_spam.py, regrtest imports test_spam + as a module. Most tests run to completion as a side-effect of + getting imported. After importing test_spam, regrtest also executes + test_spam.test_main(), if test_spam has a "test_main" attribute. + This is rarely required with the "traditional" Python tests, and + you shouldn't create a module global with name test_main unless + you're specifically exploiting this gimmick. This usage does + prove useful with PyUnit-based tests as well, however; defining + a test_main() which is run by regrtest and a script-stub in the + test module ("if __name__ == '__main__': test_main()") allows + the test to be used like any other Python test and also work + with the unittest.py-as-a-script approach, allowing a developer + to run specific tests from the command line. diff --git a/lib-python/2.2/test/__init__.py b/lib-python/2.2/test/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/__init__.py @@ -0,0 +1,1 @@ +# Dummy file to make this directory a package. diff --git a/lib-python/2.2/test/audiotest.au b/lib-python/2.2/test/audiotest.au new file mode 100644 index 0000000000000000000000000000000000000000..1ad28ce1fdd781e4370fdf68577e8a35b4ed8a8e GIT binary patch literal 23493 zc${3k$&TE}mIe5_yYTA0Oi7_BMxW=269|GJ2!d!XY{7-CY{_i{-1Vk^pwV4bDWy_U zYKjQOD8)SZ1c$@nAP53naKQyvT=E0>8P?Z4q^wuX2!-68G}?6Ux#wIny6}JfpZ~|- z{`R-(-~Q%Y!vFuv-~Lwl-yi;eI9xZ+^E65F+;tq+fp-}kId$M&o~CIAuUzUw-HZTfnVVx`P)wp|5qsl_ z7sSL;T7$OK=Q+t#B|#7d-9bmtG{ZJ^Qxhe)lcq_g4Wo(?404zSDRrGNikE2^22o0F zUFdcDg8`>18X?Hg6|UFo_Ii?TrQUopoBGQjiu^G57UTJ3G+#t%W>c8DG)bK-#Ay-{ zLNkKWEVXmjG&HH-=AcDzE6ql{B8&V$MTAa$I6UZtZW@@z;c_~=_cE+XjaI+Q>n=^B zFf}Z(J7|i%J`9bKIEJmLy}l`GS>P|P?w1QMHk|~MbeZ~NKgbhDRt(*8qd1%{!X$A; zlNiViGrWkQn>nxMrj>hk~4ow_rwr;zYVH!MVND`qboqJ%ynAfrG#EUST zgApT1u}wSn7U6Ij#W__i8`-HJh07$zSdoZ)bGI at +IdK) zUKTlyC}P=g;vgH&63?Zwd;q4^yDB)$-vg5$d?`Dx7r=mtJI|`QJ#V80uDk(@d zLf>DUUC)R2KF)$H84ahyZ#VPFI0h3zX6PsWWC2F6i;^O9mP?#C#fT`~cDGyW>)_{+ z1Fal1+I*vD!RSY}tV`We6{bj*ILXy`S?-q`?N(JmI?hv5wZ(qBIcN_|1KQ>y$CR5r zzTZc#4K6@%YRJk!7EQ;EgNYYHllzL60hT+<@F)T&xt)yX60J|?be)Y at i8wj6cc+CB2!n3b*4w4N~692WuoOU8IB0n zajS1xb~;;l^N3>85~zZ5GRENdff`diO>+x|#-)ymQ!r9W;xtIC7(fY1QFs44h2EZ4(K(nihO1CLcM(+`$BwZptCnE$!a!94F$~kS4P6DWFflfCQ;=nOfL&)f at sk+K zoYaz38j|^ zzd`; z)Hm@!ZC1^;PTkOqHA!tMoNAE~UdFB~I5plCqhPuuw}1qKB3d}T59iY~(Q&Vn^EjT& z$UU@)M|DTU6Z;+orbtV&%u#2U24mZo^+C&(0IqN1NowS69jj?_=cP9|QWdF9y3UN= zz=-r|N!5GAy-(6R+mj`sZ4Z)pI1GbOp$)|x;B*?$33io+CK^JzbW at n|zS>gcULK6I zFiAO7N0OjKUV;`W)~iU;JMPS<3nyr%bs{O+JaV!$;BYA$p!yikgc)|5by?AB?qZ?` z%CwxW$4!6h4&65H%(U4tWvv#(x9yR5yJ>Ij at 7xylQ(L%qxJu=qefj*|A}Y;{;5lD^ zTl~25&M%3Vq*kmPUMGe3OQkffBpa2B-4eflq-_NK(Tghoy0Z7nZ#}JGTyyIh_p0~d z`P<&6rr#8c%5U0L^@I1Um`>D}iuCIF*Xr-i)8fh5R&l2MmWp#XTX&<&jmqHFLdZUM zpBB at ORBg6@D;=+WI)1h>OXzm}aP98P^Ue0jUbFUjU42f(SI$l;jio0NF7w zM_aXbyZK<_Xut_)C;9fNRN46Y&L%I@(YpHnJKnh at Tb)MfIOB5FU)uM{*Jk`-haJ!^7x6=Hjdt3)}G7j;cNP}u;xB1j&2Tu*nC?4^XuZ- zW9OO{W(zcKo_^ak$$zP;I;AJ6T=&e7XSY5nNS?xWf)o6`36bZy)CufxIPPIz2IpGK3;j+$?^ z{WqW7e{PevH-)Jfh}#h=nm+&aaQlTwhsP~DebM(jn#`AfTm1TBOyAD7Jb%l~x|iij z@$;YE?ZVC8_vdMbQ>8jFUT&HHap?WsnY{DY_;>MOr+V;YtMSL~`QJ-}*YCH31)pwJ zzjETEoma=xf4kjzHC(Gr<7 at uud$YJ!ieG(CA77*&`xW;~NqwGvfBLBS$LFKR#f{f{ zefjp9uC0Gci@#L}JX at Q-J}Ir0_udEV=BXDotTXkWg`NN0 zzx+F0d%xeb&*b5H`CNbUy!`R~;q&$9Cw~mf*JIRPpDcDBbcmFon`SgA>Q at bbqwdGcUuYG)X`gDC` z_~vL^OU=VAZqQq|%kSPDKH?tjzKz;D-;ORG4KxUO#p6HDH at 4S~-;CF+e6;_htcio_ z&ha0&<(F$W?=Cj-bLZqqoA#UH#;3QJPt?apyLm at Gx<6cNO$HSh?srGO-u>h7JwM$( zKE8iixh|G!o$qgNp6kEdzMC``+4a%dRv?;%t>~49%1_ANX(^)Q!;5Ewtics}|L at J& zqs8WzgTYnHKi_#yzHbYS at _$|Kt=Z4gx9huIVOM*CjX~QiyxTq8xcz(fA-s1Av%4p} zfQ-hI{(lCaUKU?|Jf0k_JA0*aGkd9RzxZ?azPkR8^v`cs&c at C0Go4m~t>=^1qgeQN z{^08^t(V`f*E_{BU+lj6e6(Z#divqZ#q{xe^cXd_`;UI*es7;YdAxOeW8ZI>e{46@ zp6Q6oS8xBEw*Ps2a5-$PeVc6F$LOy7%hs#S<9~m=@%qmd^ zU80es*8T8tuhsjzb4iajcg*q5`gXBX_-EynH(OhKq)$#JmGURG^Ih|&`nvxcKHGjQ z-hJOo%EIq*&95lMj<);uC|vueaya}m-1I*5dbWSv-D=JdGeKixi&rgIgb8dF@|GfQN-ddjS z{(hMG at 5cDMFm$!j;pe@%_`hDxjnmSLwWPN7{PCklkDd*`Ue+G{Qc0$7ov!kQ+GxP* zt?v81*Ne+v&W at zt8m=xJTWa}nuz#VH{@c-%T$!nX{X!krSo!yP^A9Y{W zO3l~%yJqiKE<5=cy1}=zNy)}(_2tQ*pYFB452~#%)$*o0Hj7&@#4Ymb;Ip{>WGBBr zlFNj~^tn)xdzJUQZ)V0n%OQCubw&Bm-fXQudsf!}>twgJRwzymkCyyw=r1;;N~ON} zY4?rC|Fh!eZ;Zg4?B4h2=Ch45eYO8l+jw4?e*d(v$D^a^POnhdDtvo=a^C*6)TSSz z#GD+QjQE|MVqN+D&(A^q*P at wxNGTfMrkkzev+WZ7?RwXGx>>t;$Pn=J1 at 5?jppIoy`l9hvbFc})Vn!5vpO5kN>%C4PhXwFuSLb$ zGbx!|nbk&Nv&08~9Df1d-1fz6s6#|{f`J<_ at lj>aCCp0l-lK;vNihc z=o8)E*ts$G18tIx!eV`MqbR1YPQIWQo7?ehZG9^KeR_*8(df==RM&PY?d_q+0T z>4hCmzm1boa$hdJESD?w+P3)_QH6)An=6bEvHP1fp50w{Ntff at Hh;JOr#C39@#4kt>CB6LuHP&-tLpUa{`*Dmr10gPQm11G1k$pJ)GO at NFwd#jQXJZR#nNZyX{e|fVI&>-tHwhHUp`tke2k-ha~t8{vOI#Ee~-W`-nTU*lb?dfS;EIjSq zobTN^IloY?PPwqd`|nP^E_yqU`_9qcWvt0)qDhrk+!>mA zt6V6k0Zf3uz4MrNPxfvtfio^Oy#|5Dy8h$KY4&WZ)IYvCo;CH}c#^@`ReH&%y-$nU z`kJU6os7)BVjY`lrBp6kcYhomx=(jD`op`^WnGv33#+ at cS!&YVy-!|!{V~s-o-I&M zvyLTH*e;ay>pzYU^B0Ae&B@|)(Zu|1YWLT-3Z2EDC%bWV>yfOSA1zH)$^y0fVrR4F z?0)((R at Wc5>&K at TQ{BM}xBsHJUcvhxzTA-QM~%|y;kS{A at Y3wRD8c7@A3tA#i`Gil z``>PI>?G1)v$WkvK7aanLAHLa)-S&toG)mOy3Ln`?S}vU>z7+~``7Yd{ONE!m13?` z-71v2!?y>Yr~Qpz%hK at U!E`*BNktgB3V-~^m)&J&?P=M%{Ic(jx$&U5T`X4AZ*RWr zdG)pDWpcT at ACCFqpuAHoROI6~U%tkrXTaO1Uk%Lap-rgw*7k?b=Mc|u2%)TBu zx9w#Uz^_!~79UQ&ME$~}YI}ZovRrg9>Gz(O3q5P^!}}Y%@Jo4Xc6WG(v*uMrFYJ`I z_|g0OFL|%{E8n~PeCyLr=5hK~xmYt#|JXgwD;rz2 at o4YP4jShUaJO2q<9_|}{yr=} z=E_Gf$(A$tW-cqGLV1vUzWFe>%a7E`$@iP3X&Gm>S1y$b0@*wNJVDJzYVq=FHdEP& zpj0Yu^ZL=@?p;=S(%rgWcr(F9=XO>u?G$+V`qRP5qP(@WGf&U<3H$bWqsZsrKhz z&UV9o?Xk#*r^_Tm;f;fK%H^VnPQHA)NJ`HtJJa;$##mUx$m!R%%Ux-7aI(7)>R^16 z<7kni=+1Gvjb2$qlh0Sz>Wl5|_TA*@Ru9x at VF~3zrPj;u_IB^m;-*-=9^YNdo;C-C z-fq-;-16{bcPUq&D81>4KhudmcU-PoEp`U}{^%&Hbf3yNJdRUa#)~|aTfM4a-+#V2 zb<3Tn3dt^AOXH1@;$E{>@0pXm`;(+9tO>SzlG=Jlj~ozxTGv-Ov}9|vXPvot|5}?e4=zf2bkmi^Zn(3e~Pr(w`Hs$6v{n3`EYS=mH2JzZh01(t~|L8?P77K)J3zs*{QKDZ4o*>$lRRH zZ>D)0X0#$kC(*T0tUnV5(KpZ2Jn!VT$VoeKSkywfexl z|9)_~unL>Cst>SN)Z3ot=sVCjbNc=L$?2jZcFDK#RlpN2P1NqQ7cX`iTCnfK$higo z{$lrj7R2|*xBg&zYr87ZvA*n<+b?u3yo_ho+&dknS*O|7^84d2Clj+&Xz^Z(^g2?O z6Gz>ybans!_#;eo%icEfY-ngCJUuua8~s|l*Au(N-iw#(YmHiVJ3aPJ&kv3+gI;5x zc$brdC=xfDG+G$Gy?VDJVs?3Pi z+b*{h)v{-~CT*9?WmVItZb$L;B9|q@$ zzNK1L5T=PmT;gGHnU08Pyd2)l7g)EEKMzBjM)^3^xUy)FJd3VIUc~i#1IxB-1?6;< z8C*p|Gz^1pcPwVeI(2MQQVE$-v9ev`O=Rd-*~IU;UBe}rYgu`Go5^Lc7*RFkiM)uo zWlJ^fEO+fBm<3s{*;Z{gLo at f%vuK&`sy0Hhn+4;zKWJ%j9J%RaI1R*3tt at bwqT+0M z>ltE8p?Q+I*ZKDwGN~IfazRuF;bNL~dmWj&OB!4s9e)Q)={mZt^P1u$X1%mk=?SKe z at 27_+^BaxgAWnT_u^5fxUaQv8MP0HcBj7?>tIG3=YUuHNytKJ$d!R_NoQ=<~r$po% znyedozPPD>^?5-I$KP(}d9zpHTJ2uT^+)$y zT)l$CbWTU($uz*-Zn-9Qb%gxoGBvo4(RQ((y5V9 at Rk_9~eU;}-mr|YUgA3qHBU!wl zSmqSj&_zzv5z(PxSW1bA4L3=^9ym2Osik4pMY-+rZ at 9tm`k-zO$y at CJdJaMXXBjYXWzpSMV44ERvNOm94`&zE=old3H at 6+!93X<3;*Q&LiFrOS=FLAd~=R2IH2Uo+f-Kdmn-GOMT z-uc&OgmW=j|z%W{aNYq!zq9mzS# zN?qMmlk3qq8}OV&C`JlCy#GGx==E-%=ccJd^DvUSoUA#-P-emO=&YB0rn9&061ZZO!VEB=i)Cmkk at 4)<8dA98Q{gNy at _z5ye|9rkbkD$U>GT zM at e`?x>{A9rJgIQneY3Cq_uU!qKY!MhD!xTSD4!=X=`>gUpiv1B3dL+`ACe0u_D*{ zfsr6yw_|_i2>p&0`+?FZ8^QVMvRT|2c$0gh*S4-MzPrs*S at CWsq+046o_@Hm6xW65 z at G@7M+2#2+y-=!U=f`)#c42(^@lvU6_l=W#n)I#9`OI!t`Xs)O`Pz2n;_Tb9{j at AB z_vQen`N`>0+ITUTeLHmuFACR3Cuw!9YF`}2y=`%L@*Nj;ww$Z)w|wDw`S$BoQhnUf zPfloeU74I5(Pn8|363XH`FTZqd-6?uT1vlOdG+Vw)zOh(UoUmN!+T?Uvpjoy5m$a4 zEWUo at S}&8&_eaKhZD55*eyv=r&)!_*?MK4(*HM|@3O`Iw++wH2g-5sDVx=;DeW4B> zDTjym>ryp*x17WUq2I{9-3U9?B7JqNb{_Lb$Mm@@Ctns$D071%y}l%c`i}hSKHT4?(^JWU}lloF^-RO;w^9HJ9Slp7!=w!#t%{s`Ig|Xeu}8^tmHCaO3o(Rq<5QuSM5!CX1LWXf6y%nSv{B2hWe&GIlp$7YdS8Q^RwNV?2~$-i*fT#&CB_pFE19O zu>U0N7xKx$SC>o%<%*mL;<+gnmS2ATKJ at L%)7x%ga`N at e4X1^jo`gkwF0^-M$G;qZ zv!&9 at tL@Us;n_{NuwGWAHX?M$_qQfr|MB%ulzZ!wo$A+v>G9A}*Q8!6qWQfbZ|ZM; zxqOEQbel at 0gZ<^nwbELz7^P+6jMY}9__|#EJ$xB*TWIIvb98djCdG~@M1gy&H-wGx z{y*OD?HEd@$H{+&NB5&nz165&VW7^0dZGMkr}Z{kyXUu!-teP*a3 at I>siH-(K9B45 zZTsCXpWg5EPkW_-ax{zf(l)9zE5skrZ+cTKci%j^e)qh6AgyQF at YdLK22rQZ*@>D@ zI~}Psc=PDw-G=hHy=mq1JL3Z)exuv8Q!%(xM7O&AN9)Bap>!0k(LlJdjwZFSQcM)r zw3b>&Zf~ECetA86ay(qaz8uBJ!~Sivp_ehJnMlawPW#Oh=k2=oS$a7NdS3QD@2Os(R?vj z7>$`YpmL-OcE3LR{O|9N9-SUO702E7#pGu2RVvI%O{|(zH8#2Go9B%;&p0SP3`*oC z8!MB+U@;IgA+Z#r+rB*i<@d>>{j10Bu-V at C7tT??INoWy20zrXrZwOE8ohrMe`#%; zhK1?5;D^(qlGWXy9cq26(*FJN{N3aD&z-F+GNUpzZId~9D73-9&8!CgZRx70z}bbMV>-oEU- zEq1?>wd;Im`L!3`n=VbFcAzIbDmhbNCFX+i(oaSwnW zcZ{pP?8 at RaFozztWt9_hq*Fv>@Y3ZHlc9zn;CZ>8r at 4kSUAA2dXsBh|K(i@|Bg>?w ziLs3>4OuuhB`wtjMbUB at tQyf7Hgc?)*g}|ECMLF_0J-B7lqpUa+ca}A5Nd21k!xTV zBep5WuxyC3W}Z`s(wM-<1koH37h{V$I-w?U9g?!`QAwN=$3&(s8>VIu2MT1aYh%#6 zh*F$HDKLaIM>r)G2n`3Zy;BZEbj)_4xNOgriyhVigbW9}#57FPurM?f!zq%(KRAQ1 zLhOiAMGy(os4VT); zb#iJYo?*Mxg7MT4g6ebICWPkDMcak`P at o`A4%9ET4a)dDadT*IiuJ_H6 at YW3pfop8 zMxiY(GN3Ck!Wps?tT}P&BuS2v$TU*K8_t6E)Mc)-9bHJx9Hd*scG$KqQ_%?2Mq=Mf z97@@qFH>WCObF3+OW|xsks%@^Hi!+FL?WBH#crZ2D)iscbwjlD(8Mw(Mr6R4i!f6v zf^On0^-z#xw&_?n#SW*ay2|saYr!;29E?t|+r at Mo$#IefxpS2W*;waDv&*TDZCgaNEZuPpBQ*_ at x?Yy# z5lpZptGeVW9CSX5$t*Foh!~dZN`1b|Co|KHh#5q&8>7riO&c6S6D`b#Gh;qUiOp*e za8qmtA$6!BIksvcN!K8ZTe_7a%MWv+NeY-*o=4Hr4}sn%{xr%GFi{I7mK{b}?!YwU z7Sj9Jz$8H=2Y*y$qzSSlNUEsyx`w10G`9w9n;W+Cg_HYP5Q9mgG$F38V+(B4)NJIW zFzI0JF2N2+J}2_0!{y8)Bqh;2g8A^>bRGg}O=mt+0&FXxYGuTU!G%BzD^%l<&=p!; zp`$8&NfMA~XtH7`k}%+TL6SI)?}KvDx*Xqb54!N7EC{MB%A%qIWS9o{yQ!+GpsR{X zG(y175dcc+rnyU#G!CNB3l<9y74zw6GMh{$!|`Z7pZVTo?%mxFZ-;mAdp#TvC!@(? zGV^8&VBo$F<+41ZZbrdzK^N#S%21mHASQ at Hf6#CD+O2M@(P}iB&04DlFIufmtJmpv zoA9#DiGnl`1n2}e5Cuh+;1}AdseoXHZ39LS>Ja8h1QVDonD!{iqBIMWaOwMtz+VRN zcez;3rqjuII+ at QG^W}2s!%1)IEtcNG^F1%}{J;xCC>%m(vm{}gKHZ$D4h9 at -d!=D$ znxd?#h96ZCMUcciw2T*d_L?2=hJCVnEr_Bhfue>o8gyHQ_F5)D6u2%l+i?inK+5)% z(iOxq(9G$NBVYZ(=@m{sTKwPtPekr|MBt9kA8j*ro{dl55Md%*A#U^~59Gp9?N_lIi#CvB8qSZIn z%WaNBqwjQci!-^t5KpoSuc at _;ovIz#8QoU7a7=q0eVJo=Gu4}b8afWoj&G#sX5{MD z;%@0(olbJcOM)bg?oalE$=!{o>;AXl at ceWP9u1n(o4eWQ#1EHqAnx>b>IF-xsu1s} zWA)4CVWg?4R^Dn)W=M3+=C;A{hAy@?c7!9`E^C7qJKQyu%2+5CWWER9P}nM~M<6KG z{!ZDtG=;J;s8wQ(Gc~PT?YYT8L+x1-NA4$vAS9+izp1WA6j^o_hsRCiFHLuOHgxQp z+huwcn#pjMC)l69)#l;#Qi+Bq8ORNfgm;#GyGQ|dgQL?v_L6~|-^{VOj6^vn{oEsb zzonvsoD*WLD4?k&h;yYP`&@%)e6`my-Tju>v$<{EoDLLu-fZhmy-Q at F*{iC?mv&$D zq%G5!v~_dV?pUOw0io&itMc%uG#G}ZO5z7<7DjC at F~o4 at Vu|nL%UzDU9#@*n;nJQ3 zk!nTM&hHZd87cpGXX1mnfTv?RS_}cNW6O+YOPWcNzZ*;5v0ca}85u7946#IFmPRR+ z`O%Fc-Yo}JBiG{C4GCw+0t8#^AgQCxvyMB`+bvt{-IE{~JDED* zchVzVeX&0$;!ENhXPD6?{aPUwG0bELxI-V zE9YabsOhRI1AKwI%7A8oWC{S8Br6g?8k}NSr81lY@(9PudG!bXHCNlzE!#pCuoi#} zAb2cZL408E;D<#G$IY`8nzX{4{3raxDFda|zaLNpSFsi|3;-|!9D0BwV0z99Au!uj zzk*5tC59V}o-vNb!arhr-JwBj|GZ)SYx5WdHmrvOK3#3AXV3;e?3ZoKe}Fl-6Eu~w zefc)4j>X><3_=NeRmy%i1$et^5If5{NGZcv2B36>!3?9x>eq1}o*rO*AuD8M1y(&< zUHyRI?3F`U>)4#E2<{4tSD?7M{GmBe{Xiz$+B4bjF*p2}TA}MPPz3YYJo1 at XBR<$yOEuMuXXAeXzwmPGB}5Tx4;WxDJK*2cM=e zIgFO)ls&A#9yG`@u+fCN*iG0|2=E5}z^x$mQVg|PK>5L at kwGlNh8Wa_Z9!qv08 at m2 zrmmZYVyHF?2rx;8Z8*rl>?LM%suRO8v4cT{e=wV4%;W{Ddu9Bq+c7UJJ2C5E&zIOM4`Y8}09G>xM0dqf zpxmnT%4gW)DHf}g8LvYU at E@G8T4C(r65uyFQ()8yNQUhQM5>9?7>tG00^VzyB+NV* zE|i$MqSyds8Bi-^vIk#)w1>dlRWnvJeqcEMB6Jzi1EXiMbvYf|L~}wz>-7~km`9cb zu%&8n4!i#SG|DX?1sXRHs5c9+1Z+`a)C*M5V(vi;v&2$(l`bY;ssk_69{7nx{UD{_ z)s7}gcsU$v|u9$^2C{VYX+kupNvP5CyaF1y at ke-r!jd!!gQ2CDfKPlXciLRq$~Nf*k&!GU zG&lyU1=oTB2G~Ma*P&}Vbdd!_$H~wN5x}>=moba&EYw(lnU3YM5CdSbN?Hhxu{dn5AYg#gYtS0TP;dquip>NAx>cZs zv4iX3s+GiI0SeBz*rWiztPhk~2YbSeJqHJ{VHz3)a}1G!J!faK(C9FfWvL$qfG#T! z$juOty at If47=XDDCmwpsazJP`(#!}fli``mf;$*Bi-HJ0XcU`888&JTW>Fp}6?@bS zMgb zaXdUL`Lo{t{`mj*=4TD~FQ!Qz$~ojmADn-=TMV(cT~2^5?A| zbnuTyE?4yLFMjsl{d*W{^7B)6gC7&K>hLNKyFX9=7>l3HbAFE0>d{d9$7KFc#6PO~ z>- at izBY!pbr;29G at _})>|I+*a9=cTl>!E26Metvf at S{S51q+Cl2DeFQVnLb*wQ6IB>sF6*|NwhB+Al&K;)8j0+xwD z`{F^f=OnXPYUrS&81Mm{I}ep_B9fn#U}8vso;6jOIDM+>3VRQ$+uS4f{Bt|w at q zna*dl-E0|4XF&ja6B6m&0Z;N^cAc5Mu7+bLfEoeWvDh3KBz8|{*`UgsQwrkGwNf{i z8UrbH+}qnk?KDwHlML7tO#-dc;h@~`TdcRMBnlwVI4SXCtx at ZfB)dP)|MQK{O0u5CE;Fp<1bkSsEVRo6Uk8+{Cu2TBbA22IaEorvC9*Ef+O! znCgy!4QHH5t(r=*=;}Cc)!WO3Zz7slP7r8tTZ20DvpZaF3cl}}B+G43QJT~f6+{-{ z_0VkalIH;%&lV(299LG(@>MbQb6e?#SX=YH;> zW$wr=ofQ}(q7suaa}zqOGREjGkQLM16wJ)9 z9FXoBb|I!gU{z#Amh*dJL?qJ&C^CTUW>g{6k}YT*=sZE5OsO$)96`)tIf>?uhI6c# z88z5by#l at riFu1vQ4cddoJWS7=DOg9j*N)h9+30MFwbDvQH;CZBoXw$k-5}Ig6oQP z9#6)y{aqGC;83zRPx>^rL?uoPEqC~aV#JqvK21fzff;gUu>zd~Lr5VUQl%pbXgWvk zjig&(7sv;vBC)Cf8HZqOa05)RZ)dfzN9y za5o?~EZeNokrCfSI7gZ);Vh(V7a=uO2(B=&nt~=ancQh1^juZh^X7hJQQJ_Es;HWx z>h4^OuM-?3hAsfT#LF-?*(M-EQdLQo?U=~(8zl*;pomlv9S>AtZb<-tk|8UqGgZ^u zg*J__rdU+cLl-n9QsDNIsw=Xy5b1S7f{3zJ4pqy6;edabtZkMiFC1ktBVnATik<5c zn4!kf&^EAa;4&ynGSEywr&plOzB*v_9KGzIRXV+SZ|W~3AWV*`wcEa((l^aJ%tk)fJ0wH&r=C+C>~K5M`= z#AZ*7XBLy*80kRwp)f=>&_}M8>aOJ)>{(-rWd(o^1I4#86P*4b+Oh5+#yZ*74fc~F zJ7 at WW+yeFu)Ev41JGEh)bxG4iL32GRzKTek+LGothUq1SovVUu z2%Mzf=bCq7n^__ at mCzCMvz(8DF5q{6VBl;lgcq3^MRHrQHQ5~n5WuW~ zT*Z14DP7%CWp|oFn73qvL=FUJ9fPd}*91z2K$VI}q7z#u at 7%jm5Fv>$Op{cvdYQSi^OyjXc0|Z2uEfuA) zAG3^@WiZ!aNft0?dzDTEGiF}`!q$Kui1ZKEh*=U2G`?vt>}Lx%EdRF>BCBl7sw$S5 z1a9TBZxvyy#_R%?-C=na at J{BYKlmlVE6)Ew%2yN>+YclR{p5M8q$(i_Zh~V at Woq zvf(b!R%HD}%UKSAu&idDWe>||582y?0b at hUGEMBZHY4_IR`7#lTaCH>url?KE_?XK zmxtsp{)_qVR_2@`Yx3cC(66E zejHpaL#U?T><&y*R(0F|Zfj1OyFz(Dm-pk5H_doX5E0g(%gHH4YJ{;^Y?!e(oy0T3 zb^DwGyaM9Kc|y4{iL`pt@`BsZbezfkfxx~*0?=?2pxzQCa;>CfbT}PPGJ)ecURNzJ zrHcuX$626Mn|kUFXLlYIxL&uf$QsQ2H{Tq1c_$hFS*9``Oe{r*wfz zEz=~Ea5{HXAn?2*vBcwSL^R)>;(A9jK&DK_f#X7S&{Qx)lwML|MM0v}6w^r3G>8c? zL|Ib|7=9~DZ8f(2T$CZS`EJJ6S`ka=vG at fs#WhkR&MhEadB`##m;#>$wALZIDiFqW zq9v|jXE at FBgk^ddr~;D#%at{VMu?>h8C%XWmPKS~B}->Mq)L+RnzjX0h1zaL;e5uj z at hr$VlEEDTY#_RWb0j(-4)eK>X^!1P#?QaySp8KZCsY{(D at mct;-4(D&w<#e=%wR6AOn-9|mD ziFw%$*mrrzvd;C|UFY`tY>De`4+~c6Ez$_7y1{k2vg4hfh8B-Rtt41=fl zV{h)7)Z}@7;6`z9y1-?x;S2_H;NjSkuj at cdLfCrzXZY>3$=q?v` z%ey6jwT5`rjR?8DQg)oSUTbyI)LF!VELtiOg%l|GhtQ~;InIC&{iS;C<3UdxG+I3* z8rcWAqYkN}3PU=}j&BSg|5A at v^}d!KcFG{JE1m9=GpDB`A$I^DZATUt- at nSj)G;cu zV6?2^TzfE<`>@=F4MzyNoBRVia`l4(&3GPk

!nE!EGC^1CA0W zVeFyMh+HD&sv#MI!FD}@$}wG*9aw-!Us_8XJ4-dSFeqK5EVVlkYUECU at -$4inF z2WA at Qj*)0o0rWA6?ylDQ7#difn^Lw^?J%NG%#?Fg25u_D5KuNI1~rlC5HP8m=s8|&0 zHU;dFU_PW!bcvQxN6tWBfh;mXYeL)u)L123p$QOOGC&ppr$nWzl{w3#2xU43-H_PG zp$-%RJ;HJ(P>TV;#kO`5ro-3^{O}cXWJP2ch9aFwQcO}eN#Z!qEyCC_V at nozwxX&g z$@OEQ5 ziA;_0IMb9QJIxG1Opfp6x|9a4so^Y2Q>1nJ3gbja!%?BfB_Xk-a2BZ+c9iZw1MnhU zbT|~N4LcoYZ7sWXkm2S5-%@9zrP-r$@6`thME2z6f(iMGDH(glSy|xHwEXz%q=I+UJZc25AeAhjlOU?{h)4om zq>iiEF^D7x=ImywtbxN>E<`Z}`?D}NUA99IOfO5Yr7CRWhAa!ZrLWebKpS`qFG)!j zgb`hlWJ~UJL>+>Y3Q-5=X`Ux}>c-wYfezCwPQepxtSUSwYG{>Oz?f!f0__g{#d4+9 zfC%V4Eq+n{vbTUm{ z1qX5L>I%|L34#u<>87kBCK*zH4t4o{=wRMpJ6yn=^BfqdVp%y+*(Np3$eGge$BPW} zz|$b8DZpTe)YsUe8$@=teUJDdWl!AMLb-3anI(%r$FZcEEJ*<>5rn6NoH&V>m%c04 zbm%LfS)74hmE4Ra!GXQ2;y||D)D7-jSE(DTZ3gKiv2{_$U at SC(&}~W_r+~H7TTsyr zL9qZTqUqAMWCeT&YG8s=mqkqnzA#Fl-nIz at +m1(9voM9m8aPi92Q+iP-RTRm9bYF% z)$|OokN809veacOuTc_)K?2n&ydas*oUn|QE%XFE16`Z_e@&b*jvFxyMUS+A5d=nH z7??r at 3sow0fVpIv6kE7(<=HWzT2+XYk^{Ue*gXFJ?STlgE|ykBh@?B|GKa z=C^c>6octQX3t-08g#Z>Zp#+h08SVTwE<1f>NWr^oizT5_4FQ4TxWP)ZT(ozo(%SI z#{3Q!x(05x9*b&%lhi=VMmxf&^ySd^0g!ci8dDjW#l93AQ_k7XF at dWr)re~Qy{lkW zKd-0^1$zqQB>Z zhO$Qpa?kbcV=g%kXu@~OBeggN4t|kdFFu)UatNgZ-R?EHfhj(WyRGy3GYH-uA2_0r zmju1XUa400XS21mNQx*lVxA(GwsT1UTb0f~-Af-XG^Lnijno$z5p(ub z0;$m~giY3x3ZbPw*B6PSi at m6vdt~j^_VI$VwyfA0(%pLp1Nq9dV3t;MMlRSe=E2}p z7zRG at X-nj4`vfl*rI6$kX1%W*C{b57mR>E;&qG%OQF`GguM4*YfpS4`?5i^*e#-T2 zoL5K6SSX7*bj;((dGi$?FSPSywW071WqatZeQ*32+^C>~M;vQ!Fq;JwP{mUI%z57- zE)gDPEFOyz*j?6T%d#hh`aa(8Htad4FubXv8);SBCwSs2ebM{?CA5(Z!4dE5_7kJX zrOBLZQ?=?;0<@l#!74G9JGCS_k-BDU at mJ072P`NyuTS|_y0OY{-oI7_UZFU|S6RMS XY at 3gEoUH7s+P27(s&By7x8j z{~uUT;GrYce_~0|$((r{tZl_!y0Q#RM^`;uQ6(RHpD7?imZ|-N_{uUC7WQk3?{;NH zGBwmSM64;~s?+3SXG-Nyu3{`#=d5DO(qd+qsKHY;ql=l7x86TUlZ}C6Vbu~P?#atE z!mD*BPwkz#Y9{O4c}n3W8Y~Pf8hs4Am3i417pt>w-Kbi1Ms*cq6L0#=1@(C;T5FqB zI`?aIZdcj6`MlEcyPC%tUL`!Oy6(*WPKk$;osA=QZI3!%)vK*u3l>dh6n=W+r`7Uw z87|f;mIVuzy^!H%3ug*Ry3lZtiKX(3gJD90!wDVbQ~xb(3ZIH_hKecjIdrrNEMq*+ zw2q_9fVDYU$~z!BlZkPe2`868z>JleY9_Cwc0?5}jhn}yqqg&PsRyI=95n_eg{;)6 zUEV25u at h%3nrgtVIQJB900ZOA{Gyhb0w)(u-^0G>fNh4rBnQ=ooY0O-yFUwdHXcyA zcQ9fSL*pbiE|%fBFT}IRa?h1uSC4v4gI;fuEi5h!m!cM^#(GWk z)Zh>@cyMCD9RtCd at Fy#;tZHd4VqVvKa97jak0*L2zVCdJ5Y(_=Q)s7-#`Zma8C79D zo;Ht8`8 at AtY}j?kT1V}M at K+x0X?v|380XI|kgij|@Ti-SU1381e@~x>;pe#a#%!0U zXwY=(GJ4Nj6vE9Z<1CQzTvD~cRgFbh!Lm9)<52PQi2^*0N<0}(#WyA{yw8=v$ncnh z+d+JqmhwJ{=D_5=P12nQ8`P(o{r5R^k3)Fb0*4reni+>CorqY};~^rp-QCqN<%yI2 z*O?PMZ25C$KIG7ORpFGNZL#5oqLzx1{A}5?6FH@{b6!U9EDAX8v_MD4Qm%i7#Dfb- zsdf$w5#n=CsHs&-%;03a{`Ya%Vl9osnUM at JSCTmYaBgm3`mo}MbD!^1!{bb=HZ5YG ztMBtklXLq~s~K|E)2dc3vF%_z&XjSEA)ROPgFE&BHUVGZpCVa=fskIb!Cda_v1 +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/test/data/msg_02.txt b/lib-python/2.2/test/data/msg_02.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_02.txt @@ -0,0 +1,135 @@ +MIME-version: 1.0 +From: ppp-request at zzz.org +Sender: ppp-admin at zzz.org +To: ppp at zzz.org +Subject: Ppp digest, Vol 1 #2 - 5 msgs +Date: Fri, 20 Apr 2001 20:18:00 -0400 (EDT) +X-Mailer: Mailman v2.0.4 +X-Mailman-Version: 2.0.4 +Content-Type: multipart/mixed; boundary="192.168.1.2.889.32614.987812255.500.21814" + +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Masthead (Ppp digest, Vol 1 #2) + +Send Ppp mailing list submissions to + ppp at zzz.org + +To subscribe or unsubscribe via the World Wide Web, visit + http://www.zzz.org/mailman/listinfo/ppp +or, via email, send a message with subject or body 'help' to + ppp-request at zzz.org + +You can reach the person managing the list at + ppp-admin at zzz.org + +When replying, please edit your Subject line so it is more specific +than "Re: Contents of Ppp digest..." + + +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Today's Topics (5 msgs) + +Today's Topics: + + 1. testing #1 (Barry A. Warsaw) + 2. testing #2 (Barry A. Warsaw) + 3. testing #3 (Barry A. Warsaw) + 4. testing #4 (Barry A. Warsaw) + 5. testing #5 (Barry A. Warsaw) + +--192.168.1.2.889.32614.987812255.500.21814 +Content-Type: multipart/digest; boundary="__--__--" + +--__--__-- + +Message: 1 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Date: Fri, 20 Apr 2001 20:16:13 -0400 +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #1 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 2 +Date: Fri, 20 Apr 2001 20:16:21 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Precedence: bulk + + +hello + + +--__--__-- + +Message: 3 +Date: Fri, 20 Apr 2001 20:16:25 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #3 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 4 +Date: Fri, 20 Apr 2001 20:16:28 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #4 +Precedence: bulk + + +hello + + +--__--__-- + +Message: 5 +Date: Fri, 20 Apr 2001 20:16:32 -0400 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +To: ppp at zzz.org +From: barry at digicool.com (Barry A. Warsaw) +Subject: [Ppp] testing #5 +Precedence: bulk + + +hello + + + + +--__--__---- +--192.168.1.2.889.32614.987812255.500.21814 +Content-type: text/plain; charset=us-ascii +Content-description: Digest Footer + +_______________________________________________ +Ppp mailing list +Ppp at zzz.org +http://www.zzz.org/mailman/listinfo/ppp + + +--192.168.1.2.889.32614.987812255.500.21814-- + +End of Ppp Digest + diff --git a/lib-python/2.2/test/data/msg_03.txt b/lib-python/2.2/test/data/msg_03.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_03.txt @@ -0,0 +1,16 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/test/data/msg_04.txt b/lib-python/2.2/test/data/msg_04.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_04.txt @@ -0,0 +1,37 @@ +Return-Path: +Delivered-To: barry at python.org +Received: by mail.python.org (Postfix, from userid 889) + id C2BF0D37C6; Tue, 11 Sep 2001 00:05:05 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="h90VIIIKmx" +Content-Transfer-Encoding: 7bit +Message-ID: <15261.36209.358846.118674 at anthem.python.org> +From: barry at python.org (Barry A. Warsaw) +To: barry at python.org +Subject: a simple multipart +Date: Tue, 11 Sep 2001 00:05:05 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Make a door into a window + + +--h90VIIIKmx +Content-Type: text/plain +Content-Disposition: inline; + filename="msg.txt" +Content-Transfer-Encoding: 7bit + +a simple kind of mirror +to reflect upon our own + +--h90VIIIKmx +Content-Type: text/plain +Content-Disposition: inline; + filename="msg.txt" +Content-Transfer-Encoding: 7bit + +a simple kind of mirror +to reflect upon our own + +--h90VIIIKmx-- + diff --git a/lib-python/2.2/test/data/msg_05.txt b/lib-python/2.2/test/data/msg_05.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_05.txt @@ -0,0 +1,28 @@ +From: foo +Subject: bar +To: baz +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="D1690A7AC1.996856090/mail.example.com" +Message-Id: <20010803162810.0CA8AA7ACC at mail.example.com> + +This is a MIME-encapsulated message. + +--D1690A7AC1.996856090/mail.example.com +Content-Type: text/plain + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com +Content-Type: message/rfc822 + +From: nobody at python.org + +Yadda yadda yadda + +--D1690A7AC1.996856090/mail.example.com-- + diff --git a/lib-python/2.2/test/data/msg_06.txt b/lib-python/2.2/test/data/msg_06.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_06.txt @@ -0,0 +1,33 @@ +Return-Path: +Delivered-To: barry at python.org +MIME-Version: 1.0 +Content-Type: message/rfc822 +Content-Description: forwarded message +Content-Transfer-Encoding: 7bit +Message-ID: <15265.9482.641338.555352 at python.org> +From: barry at zope.com (Barry A. Warsaw) +Sender: barry at python.org +To: barry at python.org +Subject: forwarded message from Barry A. Warsaw +Date: Thu, 13 Sep 2001 17:28:42 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Be dirty +X-Url: http://barry.wooz.org + +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Return-Path: +Delivered-To: barry at python.org +Message-ID: <15265.9468.713530.98441 at python.org> +From: barry at zope.com (Barry A. Warsaw) +Sender: barry at python.org +To: barry at python.org +Subject: testing +Date: Thu, 13 Sep 2001 17:28:28 -0400 +X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid +X-Attribution: BAW +X-Oblique-Strategy: Spectrum analysis +X-Url: http://barry.wooz.org + + diff --git a/lib-python/2.2/test/data/msg_07.txt b/lib-python/2.2/test/data/msg_07.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_07.txt @@ -0,0 +1,83 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + +Hi there, + +This is the dingus fish. + +--BOUNDARY +Content-Type: image/gif; name="dingusfish.gif" +Content-Transfer-Encoding: base64 +content-disposition: attachment; filename="dingusfish.gif" + +R0lGODdhAAEAAfAAAP///wAAACwAAAAAAAEAAQAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm6sq2 +7gvH8kzX9o3n+s73/g8MCofEovGITGICTKbyCV0FDNOo9SqpQqpOrJfXzTQj2vD3TGtqL+NtGQ2f +qTXmxzuOd7WXdcc9DyjU53ewFni4s0fGhdiYaEhGBelICTNoV1j5NUnFcrmUqemjNifJVWpaOqaI +oFq3SspZsSraE7sHq3jr1MZqWvi662vxV4tD+pvKW6aLDOCLyur8PDwbanyDeq0N3DctbQYeLDvR +RY6t95m6UB0d3mwIrV7e2VGNvjjffukeJp4w7F65KecGFsTHQGAygOrgrWs1jt28Rc88KESYcGLA +/obvTkH6p+CinWJiJmIMqXGQwH/y4qk0SYjgQTczT3ajKZGfuI0uJ4kkVI/DT5s3/ejkxI0aT4Y+ +YTYgWbImUaXk9nlLmnSh1qJiJFl0OpUqRK4oOy7NyRQtHWofhoYVxkwWXKUSn0YsS+fUV6lhqfYb +6ayd3Z5qQdG1B7bvQzaJjwUV2lixMUZ7JVsOlfjWVr/3NB/uFvnySBN6Dcb6rGwaRM3wsormw5cC +M9NxWy/bWdufudCvy8bOAjXjVVwta/uO21sE5RHBCzNFXtgq9ORtH4eYjVP4Yryo026nvkFmCeyA +B29efV6ravCMK5JwWd5897Qrx7ll38o6iHDZ/rXPR//feevhF4l7wjUGX3xq1eeRfM4RSJGBIV1D +z1gKPkfWag3mVBVvva1RlX5bAJTPR/2YqNtw/FkIYYEi/pIZiAdpcxpoHtmnYYoZtvhUftzdx5ZX +JSKDW405zkGcZzzGZ6KEv4FI224oDmijlEf+xp6MJK5ojY/ASeVUR+wsKRuJ+XFZ5o7ZeEime8t1 +ouUsU6YjF5ZtUihhkGfCdFQLWQFJ3UXxmElfhQnR+eCdcDbkFZp6vTRmj56ApCihn5QGpaToNZmR +n3NVSpZcQpZ2KEONusaiCsKAug0wkQbJSFO+PTSjneGxOuFjPlUk3ovWvdIerjUg9ZGIOtGq/qeX +eCYrrCX+1UPsgTKGGRSbzd5q156d/gpfbJxe66eD5iQKrXj7RGgruGxs62qebBHUKS32CKluCiqZ +qh+pmehmEb71noAUoe5e9Zm17S7773V10pjrtG4CmuurCV/n6zLK5turWNhqOvFXbjhZrMD0YhKe +wR0zOyuvsh6MWrGoIuzvyWu5y1WIFAqmJselypxXh6dKLNOKEB98L88bS2rkNqqlKzCNJp9c0G0j +Gzh0iRrCbHSXmPR643QS+4rWhgFmnSbSuXCjS0xAOWkU2UdLqyuUNfHSFdUouy3bm5i5GnDM3tG8 +doJ4r5tqu3pPbRSVfvs8uJzeNXhp3n4j/tZ42SwH7eaWUUOjc3qFV9453UHTXZfcLH+OeNs5g36x +lBnHvTm7EbMbLeuaLncao8vWCXimfo1o+843Ak6y4ChNeGntvAYvfLK4ezmoyNIbNCLTCXO9ZV3A +E8/s88RczPzDwI4Ob7XZyl7+9Miban29h+tJZPrE21wgvBphDfrrfPdCTPKJD/y98L1rZwHcV6Jq +Zab0metpuNIX/qAFPoz171WUaUb4HAhBSzHuHfjzHb3kha/2Cctis/ORArVHNYfFyYRH2pYIRzic +isVOfPWD1b6mRTqpCRBozzof6UZVvFXRxWIr3GGrEviGYgyPMfahheiSaLs/9QeFu7oZ/ndSY8DD +ya9x+uPed+7mxN2IzIISBOMLFYWVqC3Pew1T2nFuuCiwZS5/v6II10i4t1OJcUH2U9zxKodHsGGv +Oa+zkvNUYUOa/TCCRutF9MzDwdlUMJADTCGSbDQ5OV4PTamDoPEi6Ecc/RF5RWwkcdSXvSOaDWSn +I9LlvubFTQpuc6JKXLcKeb+xdbKRBnwREemXyjg6ME65aJiOuBgrktzykfPLJBKR9ClMavJ62/Ff +BlNIyod9yX9wcSXexnXFpvkrbXk64xsx5Db7wXKP5fSgsvwIMM/9631VLBfkmtbHRXpqmtei52hG +pUwSlo+BASQoeILDOBgREECxBBh5/iYmNsQ9dIv5+OI++QkqdsJPc3uykz5fkM+OraeekcQF7X4n +B5S67za5U967PmooGQhUXfF7afXyCD7ONdRe17QogYjVx38uLwtrS6nhTnm15LQUnu9E2uK6CNI/ +1HOABj0ESwOjut4FEpFQpdNAm4K2LHnDWHNcmKB2ioKBogysVZtMO2nSxUdZ8Yk2kJc7URioLVI0 +YgmtIwZj4LoeKemgnOnbUdGnzZ4Oa6scqiolBGqS6RgWNLu0RMhcaE6rhhU4hiuqFXPAG8fGwTPW +FKeLMtdVmXLSs5YJGF/YeVm7rREMlY3UYE+yCxbaMXX8y15m5zVHq6GOKDMynzII/jdUHdyVqIy0 +ifX2+r/EgtZcvRzSb72gU9ui87M2VecjKildW/aFqaYhKoryUjfB/g4qtyVuc60xFDGmCxwjW+qu +zjuwl2GkOWn66+3QiiEctvd04OVvcCVzjgT7lrkvjVGKKHmmlDUKowSeikb5kK/mJReuWOxONx+s +ULsl+Lqb0CVn0SrVyJ6wt4t6yTeSCafhPhAf0OXn6L60UMxiLolFAtmN35S2Ob1lZpQ1r/n0Qb5D +oQ1zJiRVDgF8N3Q8TYfbi3DyWCy3lT1nxyBs6FT3S2GOzWRlxwKvlRP0RPJA9SjxEy0UoEnkA+M4 +cnzLMJrBGWLFEaaUb5lvpqbq/loOaU5+DFuHPxo82/OZuM8FXG3oVNZhtWpMpb/0Xu5m/LfLhHZQ +7yuVI0MqZ7NE43imC8jH3IwGZlbPm0xkJYs7+2U48hXTsFSMqgGDvai0kLxyynKNT/waj+q1c1tz +GjOpPBgdCSq3UKZxCSsqFIY+O6JbAWGWcV1pwqLyj5sGqCF1xb1F3varUWqrJv6cN3PrUXzijtfZ +FshpBL3Xwr4GIPvU2N8EjrJgS1zl21rbXQMXeXc5jjFyrhpCzijSv/RQtyPSzHCFMhlME95fHglt +pRsX+dfSQjUeHAlpWzJ5iOo79Ldnaxai6bXTcGO3fp07ri7HLEmXXPlYi8bv/qVxvNcdra6m7Rlb +6JBTb5fd66VhFRjGArh2n7R1rDW4P5NOT9K0I183T2scYkeZ3q/VFyLb09U9ajzXBS8Kgkhc4mBS +kYY9cy3Vy9lUnuNJH8HGIclUilwnBtjUOH0gteGOZ4c/XNrhXLSYDyxfnD8z1pDy7rYRvDolhnbe +UMzxCZUs40s6s7UIvBnLgc0+vKuOkIXeOrDymlp+Zxra4MZLBbVrqD/jTJ597pDmnw5c4+DbyB88 +9Cg9DodYcSuMZT/114pptqc/EuTjRPvH/z5slzI3tluOEBBLqOXLOX+0I5929tO97wkvl/atCz+y +xJrdwteW2FNW/NSmBP+f/maYtVs/bYyBC7Ox3jsYZHL05CIrBa/nS+b3bHfiYm4Ueil1YZZSgAUI +fFZ1dxUmeA2oQRQ3RuGXNGLFV9/XbGFGPV6kfzk1TBBCd+izc7q1H+OHMJwmaBX2IQNYVAKHYepV +SSGCe6CnbYHHETKGNe43EDvFgZr0gB/nVHPHZ80VV1ojOiI3XDvYIkl4ayo4bxQIgrFXWTvBI0nH +VElWMuw2aLUWCRHHf8ymVCHjFlJnOSojfevCYyyyZDH0IcvHhrsnQ5O1OsWzONuVVKIxSxiFZ/tR +fKDAf6xFTnw4O9Qig2VCfW2hJQrmMOuHW0W3dLQmCMO2ccdUd/xyfflH/olTiHZVdGwb8nIwRzSE +J15jFlOJuBZBZ4CiyHyd2IFylFlB+HgHhYabhWOGwYO1ZH/Og1dtQlFMk352CGRSIFTapnWQEUtN +l4zv8S0aaCFDyGCBqDUxZYpxGHX01y/JuH1xhn7TOCnNCI4eKDs5WGX4R425F4vF1o3BJ4vO0otq +I3rimI7jJY1jISqnBxknCIvruF83mF5wN4X7qGLIhR8A2Vg0yFERSIXn9Vv3GHy3Vj/WIkKddlYi +yIMv2I/VMjTLpW7pt05SWIZR0RPyxpB4SIUM9lBPGBl0GC7oSEEwRYLe4pJpZY2P0zbI1n+Oc44w +qY3PUnmF0ixjVpDD/mJ9wpOBGTVgXlaCaZiPcIWK5NiKBIiPdGaQ0TWGvAiG7nMchdZb7Vgf8zNi +MuMyzRdy/lePe9iC4TRx7WhhOQI/QiSVNAmAa2lT/piFbuh7ofJoYSZzrSZ1bvmWw3eN2nKUPVky +uPN5/VRfohRd0VYZoqhKIlU6TXYhJxmPUIloAwc1bPmHEpaZYZORHNlXUJM07hATwHR8MJYqkwWR +WaIezFhxSFlc8/Fq82hEnpeRozg3ULhhr9lAGtVEkCg5ZNRuuVleBPaZadhG0ZgkyPmDOTOKzViM +YgOcpukKqQcbjAWS0IleQ2ROjdh6A+md1qWdBRSX7iSYgFRTtRmBpJioieXJiHfJiMGIR9fJOn8I +MSfXYhspn4ooSa2mSAj4n+8Bmg03fBJZoPOJgsVZRxu1oOMRPXYYjdqjihFaEoZpXBREanuJoRI6 +cibFinq4ngUKh/wQd/H5ofYCZ0HJXR62opZFaAT0iFIZo4DIiUojkjeqKiuoZirKo5Y1a7AWckGa +BkuYoD5lpDK6eUs6CkDqpETwl1EqpfhJpVeKpVl6EgUAADs= + +--BOUNDARY-- diff --git a/lib-python/2.2/test/data/msg_08.txt b/lib-python/2.2/test/data/msg_08.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_08.txt @@ -0,0 +1,24 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-2" + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/test/data/msg_09.txt b/lib-python/2.2/test/data/msg_09.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_09.txt @@ -0,0 +1,24 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: text/plain + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/test/data/msg_10.txt b/lib-python/2.2/test/data/msg_10.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_10.txt @@ -0,0 +1,32 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +This is a 7bit encoded message. + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" +Content-Transfer-Encoding: Quoted-Printable + +=A1This is a Quoted Printable encoded message! + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-1" +Content-Transfer-Encoding: Base64 + +VGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2Uu + + +--BOUNDARY +Content-Type: text/plain; charset="iso-8859-1" + +This has no Content-Transfer-Encoding: header. + +--BOUNDARY-- diff --git a/lib-python/2.2/test/data/msg_11.txt b/lib-python/2.2/test/data/msg_11.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_11.txt @@ -0,0 +1,7 @@ +Content-Type: message/rfc822 +MIME-Version: 1.0 +Subject: The enclosing message + +Subject: An enclosed message + +Here is the body of the message. diff --git a/lib-python/2.2/test/data/msg_12.txt b/lib-python/2.2/test/data/msg_12.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_12.txt @@ -0,0 +1,36 @@ +MIME-Version: 1.0 +From: Barry Warsaw +To: Dingus Lovers +Subject: Lyrics +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/html; charset="iso-8859-1" + + +--BOUNDARY +Content-Type: multipart/mixed; boundary="ANOTHER" + +--ANOTHER +Content-Type: text/plain; charset="iso-8859-2" + + +--ANOTHER +Content-Type: text/plain; charset="iso-8859-3" + +--ANOTHER-- + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + + +--BOUNDARY +Content-Type: text/plain; charset="koi8-r" + + +--BOUNDARY-- diff --git a/lib-python/2.2/test/data/msg_13.txt b/lib-python/2.2/test/data/msg_13.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_13.txt @@ -0,0 +1,94 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="OUTER" + +--OUTER +Content-Type: text/plain; charset="us-ascii" + +A text/plain part + +--OUTER +Content-Type: multipart/mixed; boundary=BOUNDARY + + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + +Hi there, + +This is the dingus fish. + +--BOUNDARY +Content-Type: image/gif; name="dingusfish.gif" +Content-Transfer-Encoding: base64 +content-disposition: attachment; filename="dingusfish.gif" + +R0lGODdhAAEAAfAAAP///wAAACwAAAAAAAEAAQAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm6sq2 +7gvH8kzX9o3n+s73/g8MCofEovGITGICTKbyCV0FDNOo9SqpQqpOrJfXzTQj2vD3TGtqL+NtGQ2f +qTXmxzuOd7WXdcc9DyjU53ewFni4s0fGhdiYaEhGBelICTNoV1j5NUnFcrmUqemjNifJVWpaOqaI +oFq3SspZsSraE7sHq3jr1MZqWvi662vxV4tD+pvKW6aLDOCLyur8PDwbanyDeq0N3DctbQYeLDvR +RY6t95m6UB0d3mwIrV7e2VGNvjjffukeJp4w7F65KecGFsTHQGAygOrgrWs1jt28Rc88KESYcGLA +/obvTkH6p+CinWJiJmIMqXGQwH/y4qk0SYjgQTczT3ajKZGfuI0uJ4kkVI/DT5s3/ejkxI0aT4Y+ +YTYgWbImUaXk9nlLmnSh1qJiJFl0OpUqRK4oOy7NyRQtHWofhoYVxkwWXKUSn0YsS+fUV6lhqfYb +6ayd3Z5qQdG1B7bvQzaJjwUV2lixMUZ7JVsOlfjWVr/3NB/uFvnySBN6Dcb6rGwaRM3wsormw5cC +M9NxWy/bWdufudCvy8bOAjXjVVwta/uO21sE5RHBCzNFXtgq9ORtH4eYjVP4Yryo026nvkFmCeyA +B29efV6ravCMK5JwWd5897Qrx7ll38o6iHDZ/rXPR//feevhF4l7wjUGX3xq1eeRfM4RSJGBIV1D +z1gKPkfWag3mVBVvva1RlX5bAJTPR/2YqNtw/FkIYYEi/pIZiAdpcxpoHtmnYYoZtvhUftzdx5ZX +JSKDW405zkGcZzzGZ6KEv4FI224oDmijlEf+xp6MJK5ojY/ASeVUR+wsKRuJ+XFZ5o7ZeEime8t1 +ouUsU6YjF5ZtUihhkGfCdFQLWQFJ3UXxmElfhQnR+eCdcDbkFZp6vTRmj56ApCihn5QGpaToNZmR +n3NVSpZcQpZ2KEONusaiCsKAug0wkQbJSFO+PTSjneGxOuFjPlUk3ovWvdIerjUg9ZGIOtGq/qeX +eCYrrCX+1UPsgTKGGRSbzd5q156d/gpfbJxe66eD5iQKrXj7RGgruGxs62qebBHUKS32CKluCiqZ +qh+pmehmEb71noAUoe5e9Zm17S7773V10pjrtG4CmuurCV/n6zLK5turWNhqOvFXbjhZrMD0YhKe +wR0zOyuvsh6MWrGoIuzvyWu5y1WIFAqmJselypxXh6dKLNOKEB98L88bS2rkNqqlKzCNJp9c0G0j +Gzh0iRrCbHSXmPR643QS+4rWhgFmnSbSuXCjS0xAOWkU2UdLqyuUNfHSFdUouy3bm5i5GnDM3tG8 +doJ4r5tqu3pPbRSVfvs8uJzeNXhp3n4j/tZ42SwH7eaWUUOjc3qFV9453UHTXZfcLH+OeNs5g36x +lBnHvTm7EbMbLeuaLncao8vWCXimfo1o+843Ak6y4ChNeGntvAYvfLK4ezmoyNIbNCLTCXO9ZV3A +E8/s88RczPzDwI4Ob7XZyl7+9Miban29h+tJZPrE21wgvBphDfrrfPdCTPKJD/y98L1rZwHcV6Jq +Zab0metpuNIX/qAFPoz171WUaUb4HAhBSzHuHfjzHb3kha/2Cctis/ORArVHNYfFyYRH2pYIRzic +isVOfPWD1b6mRTqpCRBozzof6UZVvFXRxWIr3GGrEviGYgyPMfahheiSaLs/9QeFu7oZ/ndSY8DD +ya9x+uPed+7mxN2IzIISBOMLFYWVqC3Pew1T2nFuuCiwZS5/v6II10i4t1OJcUH2U9zxKodHsGGv +Oa+zkvNUYUOa/TCCRutF9MzDwdlUMJADTCGSbDQ5OV4PTamDoPEi6Ecc/RF5RWwkcdSXvSOaDWSn +I9LlvubFTQpuc6JKXLcKeb+xdbKRBnwREemXyjg6ME65aJiOuBgrktzykfPLJBKR9ClMavJ62/Ff +BlNIyod9yX9wcSXexnXFpvkrbXk64xsx5Db7wXKP5fSgsvwIMM/9631VLBfkmtbHRXpqmtei52hG +pUwSlo+BASQoeILDOBgREECxBBh5/iYmNsQ9dIv5+OI++QkqdsJPc3uykz5fkM+OraeekcQF7X4n +B5S67za5U967PmooGQhUXfF7afXyCD7ONdRe17QogYjVx38uLwtrS6nhTnm15LQUnu9E2uK6CNI/ +1HOABj0ESwOjut4FEpFQpdNAm4K2LHnDWHNcmKB2ioKBogysVZtMO2nSxUdZ8Yk2kJc7URioLVI0 +YgmtIwZj4LoeKemgnOnbUdGnzZ4Oa6scqiolBGqS6RgWNLu0RMhcaE6rhhU4hiuqFXPAG8fGwTPW +FKeLMtdVmXLSs5YJGF/YeVm7rREMlY3UYE+yCxbaMXX8y15m5zVHq6GOKDMynzII/jdUHdyVqIy0 +ifX2+r/EgtZcvRzSb72gU9ui87M2VecjKildW/aFqaYhKoryUjfB/g4qtyVuc60xFDGmCxwjW+qu +zjuwl2GkOWn66+3QiiEctvd04OVvcCVzjgT7lrkvjVGKKHmmlDUKowSeikb5kK/mJReuWOxONx+s +ULsl+Lqb0CVn0SrVyJ6wt4t6yTeSCafhPhAf0OXn6L60UMxiLolFAtmN35S2Ob1lZpQ1r/n0Qb5D +oQ1zJiRVDgF8N3Q8TYfbi3DyWCy3lT1nxyBs6FT3S2GOzWRlxwKvlRP0RPJA9SjxEy0UoEnkA+M4 +cnzLMJrBGWLFEaaUb5lvpqbq/loOaU5+DFuHPxo82/OZuM8FXG3oVNZhtWpMpb/0Xu5m/LfLhHZQ +7yuVI0MqZ7NE43imC8jH3IwGZlbPm0xkJYs7+2U48hXTsFSMqgGDvai0kLxyynKNT/waj+q1c1tz +GjOpPBgdCSq3UKZxCSsqFIY+O6JbAWGWcV1pwqLyj5sGqCF1xb1F3varUWqrJv6cN3PrUXzijtfZ +FshpBL3Xwr4GIPvU2N8EjrJgS1zl21rbXQMXeXc5jjFyrhpCzijSv/RQtyPSzHCFMhlME95fHglt +pRsX+dfSQjUeHAlpWzJ5iOo79Ldnaxai6bXTcGO3fp07ri7HLEmXXPlYi8bv/qVxvNcdra6m7Rlb +6JBTb5fd66VhFRjGArh2n7R1rDW4P5NOT9K0I183T2scYkeZ3q/VFyLb09U9ajzXBS8Kgkhc4mBS +kYY9cy3Vy9lUnuNJH8HGIclUilwnBtjUOH0gteGOZ4c/XNrhXLSYDyxfnD8z1pDy7rYRvDolhnbe +UMzxCZUs40s6s7UIvBnLgc0+vKuOkIXeOrDymlp+Zxra4MZLBbVrqD/jTJ597pDmnw5c4+DbyB88 +9Cg9DodYcSuMZT/114pptqc/EuTjRPvH/z5slzI3tluOEBBLqOXLOX+0I5929tO97wkvl/atCz+y +xJrdwteW2FNW/NSmBP+f/maYtVs/bYyBC7Ox3jsYZHL05CIrBa/nS+b3bHfiYm4Ueil1YZZSgAUI +fFZ1dxUmeA2oQRQ3RuGXNGLFV9/XbGFGPV6kfzk1TBBCd+izc7q1H+OHMJwmaBX2IQNYVAKHYepV +SSGCe6CnbYHHETKGNe43EDvFgZr0gB/nVHPHZ80VV1ojOiI3XDvYIkl4ayo4bxQIgrFXWTvBI0nH +VElWMuw2aLUWCRHHf8ymVCHjFlJnOSojfevCYyyyZDH0IcvHhrsnQ5O1OsWzONuVVKIxSxiFZ/tR +fKDAf6xFTnw4O9Qig2VCfW2hJQrmMOuHW0W3dLQmCMO2ccdUd/xyfflH/olTiHZVdGwb8nIwRzSE +J15jFlOJuBZBZ4CiyHyd2IFylFlB+HgHhYabhWOGwYO1ZH/Og1dtQlFMk352CGRSIFTapnWQEUtN +l4zv8S0aaCFDyGCBqDUxZYpxGHX01y/JuH1xhn7TOCnNCI4eKDs5WGX4R425F4vF1o3BJ4vO0otq +I3rimI7jJY1jISqnBxknCIvruF83mF5wN4X7qGLIhR8A2Vg0yFERSIXn9Vv3GHy3Vj/WIkKddlYi +yIMv2I/VMjTLpW7pt05SWIZR0RPyxpB4SIUM9lBPGBl0GC7oSEEwRYLe4pJpZY2P0zbI1n+Oc44w +qY3PUnmF0ixjVpDD/mJ9wpOBGTVgXlaCaZiPcIWK5NiKBIiPdGaQ0TWGvAiG7nMchdZb7Vgf8zNi +MuMyzRdy/lePe9iC4TRx7WhhOQI/QiSVNAmAa2lT/piFbuh7ofJoYSZzrSZ1bvmWw3eN2nKUPVky +uPN5/VRfohRd0VYZoqhKIlU6TXYhJxmPUIloAwc1bPmHEpaZYZORHNlXUJM07hATwHR8MJYqkwWR +WaIezFhxSFlc8/Fq82hEnpeRozg3ULhhr9lAGtVEkCg5ZNRuuVleBPaZadhG0ZgkyPmDOTOKzViM +YgOcpukKqQcbjAWS0IleQ2ROjdh6A+md1qWdBRSX7iSYgFRTtRmBpJioieXJiHfJiMGIR9fJOn8I +MSfXYhspn4ooSa2mSAj4n+8Bmg03fBJZoPOJgsVZRxu1oOMRPXYYjdqjihFaEoZpXBREanuJoRI6 +cibFinq4ngUKh/wQd/H5ofYCZ0HJXR62opZFaAT0iFIZo4DIiUojkjeqKiuoZirKo5Y1a7AWckGa +BkuYoD5lpDK6eUs6CkDqpETwl1EqpfhJpVeKpVl6EgUAADs= + +--BOUNDARY-- + +--OUTER-- diff --git a/lib-python/2.2/test/data/msg_14.txt b/lib-python/2.2/test/data/msg_14.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_14.txt @@ -0,0 +1,23 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +I'm sorry but I'm using a drainbread ISP, which although big and +wealthy can't seem to generate standard compliant email. :( + +This message has a Content-Type: header with no subtype. I hope you +can still read it. + +-Me diff --git a/lib-python/2.2/test/data/msg_15.txt b/lib-python/2.2/test/data/msg_15.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_15.txt @@ -0,0 +1,52 @@ +Return-Path: +Received: from fepD.post.tele.dk (195.41.46.149) by mail.groupcare.dk (LSMTP for Windows NT v1.1b) with SMTP id <0.0014F8A2 at mail.groupcare.dk>; Mon, 30 Apr 2001 12:17:50 +0200 +User-Agent: Microsoft-Outlook-Express-Macintosh-Edition/5.02.2106 +Subject: XX +From: xx at xx.dk +To: XX +Message-ID: +Mime-version: 1.0 +Content-type: multipart/mixed; + boundary="MS_Mac_OE_3071477847_720252_MIME_Part" + +> Denne meddelelse er i MIME-format. Da dit postl?sningsprogram ikke forst?r dette format, kan del af eller hele meddelelsen v?re ul?selig. + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: multipart/alternative; + boundary="MS_Mac_OE_3071477847_720252_MIME_Part" + + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: text/plain; charset="ISO-8859-1" +Content-transfer-encoding: quoted-printable + +Some removed test. + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: text/html; charset="ISO-8859-1" +Content-transfer-encoding: quoted-printable + + + +Some removed HTML + + +Some removed text. + + + + +--MS_Mac_OE_3071477847_720252_MIME_Part-- + + +--MS_Mac_OE_3071477847_720252_MIME_Part +Content-type: image/gif; name="xx.gif"; + x-mac-creator="6F676C65"; + x-mac-type="47494666" +Content-disposition: attachment +Content-transfer-encoding: base64 + +Some removed base64 encoded chars. + +--MS_Mac_OE_3071477847_720252_MIME_Part-- + diff --git a/lib-python/2.2/test/data/msg_16.txt b/lib-python/2.2/test/data/msg_16.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_16.txt @@ -0,0 +1,123 @@ +Return-Path: <> +Delivered-To: scr-admin at socal-raves.org +Received: from cougar.noc.ucla.edu (cougar.noc.ucla.edu [169.232.10.18]) + by babylon.socal-raves.org (Postfix) with ESMTP id CCC2C51B84 + for ; Sun, 23 Sep 2001 20:13:54 -0700 (PDT) +Received: from sims-ms-daemon by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8Y at cougar.noc.ucla.edu> for scr-admin at socal-raves.org; Sun, + 23 Sep 2001 20:14:35 -0700 (PDT) +Received: from cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8X at cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +Date: Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +From: Internet Mail Delivery +Subject: Delivery Notification: Delivery has failed +To: scr-admin at socal-raves.org +Message-id: <0GK500B04D0B8X at cougar.noc.ucla.edu> +MIME-version: 1.0 +Sender: scr-owner at socal-raves.org +Errors-To: scr-owner at socal-raves.org +X-BeenThere: scr at socal-raves.org +X-Mailman-Version: 2.1a3 +Precedence: bulk +List-Help: +List-Post: +List-Subscribe: , + +List-Id: SoCal-Raves +List-Unsubscribe: , + +List-Archive: +Content-Type: multipart/report; boundary="Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)" + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: text/plain; charset=ISO-8859-1 + +This report relates to a message you sent with the following header fields: + + Message-id: <002001c144a6$8752e060$56104586 at oxy.edu> + Date: Sun, 23 Sep 2001 20:10:55 -0700 + From: "Ian T. Henry" + To: SoCal Raves + Subject: [scr] yeah for Ians!! + +Your message cannot be delivered to the following recipients: + + Recipient address: jangel1 at cougar.noc.ucla.edu + Reason: recipient reached disk quota + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: message/DELIVERY-STATUS + +Original-envelope-id: 0GK500B4HD0888 at cougar.noc.ucla.edu +Reporting-MTA: dns; cougar.noc.ucla.edu + +Action: failed +Status: 5.0.0 (recipient reached disk quota) +Original-recipient: rfc822;jangel1 at cougar.noc.ucla.edu +Final-recipient: rfc822;jangel1 at cougar.noc.ucla.edu + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA) +Content-type: MESSAGE/RFC822 + +Return-path: scr-admin at socal-raves.org +Received: from sims-ms-daemon by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + id <0GK500B01D0B8X at cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT) +Received: from panther.noc.ucla.edu by cougar.noc.ucla.edu + (Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10) + with ESMTP id <0GK500B4GD0888 at cougar.noc.ucla.edu> for jangel1 at sims-ms-daemon; + Sun, 23 Sep 2001 20:14:33 -0700 (PDT) +Received: from babylon.socal-raves.org + (ip-209-85-222-117.dreamhost.com [209.85.222.117]) + by panther.noc.ucla.edu (8.9.1a/8.9.1) with ESMTP id UAA09793 for + ; Sun, 23 Sep 2001 20:14:32 -0700 (PDT) +Received: from babylon (localhost [127.0.0.1]) by babylon.socal-raves.org + (Postfix) with ESMTP id D3B2951B70; Sun, 23 Sep 2001 20:13:47 -0700 (PDT) +Received: by babylon.socal-raves.org (Postfix, from userid 60001) + id A611F51B82; Sun, 23 Sep 2001 20:13:46 -0700 (PDT) +Received: from tiger.cc.oxy.edu (tiger.cc.oxy.edu [134.69.3.112]) + by babylon.socal-raves.org (Postfix) with ESMTP id ADA7351B70 for + ; Sun, 23 Sep 2001 20:13:44 -0700 (PDT) +Received: from ent (n16h86.dhcp.oxy.edu [134.69.16.86]) + by tiger.cc.oxy.edu (8.8.8/8.8.8) with SMTP id UAA08100 for + ; Sun, 23 Sep 2001 20:14:24 -0700 (PDT) +Date: Sun, 23 Sep 2001 20:10:55 -0700 +From: "Ian T. Henry" +Subject: [scr] yeah for Ians!! +Sender: scr-admin at socal-raves.org +To: SoCal Raves +Errors-to: scr-admin at socal-raves.org +Message-id: <002001c144a6$8752e060$56104586 at oxy.edu> +MIME-version: 1.0 +X-Mailer: Microsoft Outlook Express 5.50.4522.1200 +Content-type: text/plain; charset=us-ascii +Precedence: bulk +Delivered-to: scr-post at babylon.socal-raves.org +Delivered-to: scr at socal-raves.org +X-Converted-To-Plain-Text: from multipart/alternative by demime 0.98e +X-Converted-To-Plain-Text: Alternative section used was text/plain +X-BeenThere: scr at socal-raves.org +X-Mailman-Version: 2.1a3 +List-Help: +List-Post: +List-Subscribe: , + +List-Id: SoCal-Raves +List-Unsubscribe: , + +List-Archive: + +I always love to find more Ian's that are over 3 years old!! + +Ian +_______________________________________________ +For event info, list questions, or to unsubscribe, see http://www.socal-raves.org/ + + + +--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)-- + diff --git a/lib-python/2.2/test/data/msg_17.txt b/lib-python/2.2/test/data/msg_17.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_17.txt @@ -0,0 +1,12 @@ +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +Hi there, + +This is the dingus fish. + +[Non-text (image/gif) part of message omitted, filename dingusfish.gif] diff --git a/lib-python/2.2/test/data/msg_18.txt b/lib-python/2.2/test/data/msg_18.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_18.txt @@ -0,0 +1,6 @@ +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Foobar-Spoink-Defrobnit: wasnipoop; giraffes="very-long-necked-animals"; + spooge="yummy"; hippos="gargantuan"; marshmallows="gooey" + diff --git a/lib-python/2.2/test/data/msg_19.txt b/lib-python/2.2/test/data/msg_19.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_19.txt @@ -0,0 +1,43 @@ +Send Ppp mailing list submissions to + ppp at zzz.org + +To subscribe or unsubscribe via the World Wide Web, visit + http://www.zzz.org/mailman/listinfo/ppp +or, via email, send a message with subject or body 'help' to + ppp-request at zzz.org + +You can reach the person managing the list at + ppp-admin at zzz.org + +When replying, please edit your Subject line so it is more specific +than "Re: Contents of Ppp digest..." + +Today's Topics: + + 1. testing #1 (Barry A. Warsaw) + 2. testing #2 (Barry A. Warsaw) + 3. testing #3 (Barry A. Warsaw) + 4. testing #4 (Barry A. Warsaw) + 5. testing #5 (Barry A. Warsaw) + +hello + + +hello + + +hello + + +hello + + +hello + + + +_______________________________________________ +Ppp mailing list +Ppp at zzz.org +http://www.zzz.org/mailman/listinfo/ppp + diff --git a/lib-python/2.2/test/data/msg_20.txt b/lib-python/2.2/test/data/msg_20.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_20.txt @@ -0,0 +1,22 @@ +Return-Path: +Delivered-To: bbb at zzz.org +Received: by mail.zzz.org (Postfix, from userid 889) + id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT) +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Message-ID: <15090.61304.110929.45684 at aaa.zzz.org> +From: bbb at ddd.com (John X. Doe) +To: bbb at zzz.org +Cc: ccc at zzz.org +CC: ddd at zzz.org +cc: eee at zzz.org +Subject: This is a test message +Date: Fri, 4 May 2001 14:05:44 -0400 + + +Hi, + +Do you like this message? + +-Me diff --git a/lib-python/2.2/test/data/msg_21.txt b/lib-python/2.2/test/data/msg_21.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_21.txt @@ -0,0 +1,22 @@ +From: aperson at dom.ain +To: bperson at dom.ain +Subject: Test +Content-Type: multipart/mixed; boundary="BOUNDARY" + +MIME message +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +One + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit + +Two + +--BOUNDARY-- +End of MIME message diff --git a/lib-python/2.2/test/data/msg_22.txt b/lib-python/2.2/test/data/msg_22.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_22.txt @@ -0,0 +1,46 @@ +Mime-Version: 1.0 +Message-Id: +Date: Tue, 16 Oct 2001 13:59:25 +0300 +To: a at example.com +From: b at example.com +Content-Type: multipart/mixed; boundary="============_-1208892523==_============" + +--============_-1208892523==_============ +Content-Type: text/plain; charset="us-ascii" ; format="flowed" + +Text text text. +--============_-1208892523==_============ +Content-Id: +Content-Type: image/jpeg; name="wibble.JPG" + ; x-mac-type="4A504547" + ; x-mac-creator="474B4F4E" +Content-Disposition: attachment; filename="wibble.JPG" +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABIEBAREA +g6bCjjw/pIZSjO6FWFpldjySOmCNrO7DBZibUXhTwtCixw+GtAijVdqxxaPp0aKvmGXa +qrbBQvms0mAMeYS/3iTV1dG0hHaRNK01XblnWxtVdjkHLMIgTyqnk9VB7CrP2KzIINpa +4O7I+zxYO9WV8jZg71Zlb+8rMDkEirAVQFAUAKAFAAAUAYAUDgADgY6DjpRtXj5RxjHA +4wQRj0wQCMdCAewpaKKK/9k= +--============_-1208892523==_============ +Content-Id: +Content-Type: image/jpeg; name="wibble2.JPG" + ; x-mac-type="4A504547" + ; x-mac-creator="474B4F4E" +Content-Disposition: attachment; filename="wibble2.JPG" +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABJ0BAREA +/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +W6NFJJBEkU10kKGTcWMDwxuU+0JHvk8qAtOpNwqSR0n8c3BlDyXHlqsUltHEiTvdXLxR +7vMiGDNJAJWkAMk8ZkCFp5G2oo5W++INrbQtNfTQxJAuXlupz9oS4d5Y1W+E2XlWZJJE +Y7LWYQxTLE1zuMbfBPxw8X2fibVdIbSbI6nLZxX635t9TjtYreWR7WGKJTLJFFKSlozO +0ShxIXM43uC3/9k= +--============_-1208892523==_============ +Content-Type: text/plain; charset="us-ascii" ; format="flowed" + +Text text text. +--============_-1208892523==_============-- + diff --git a/lib-python/2.2/test/data/msg_23.txt b/lib-python/2.2/test/data/msg_23.txt new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/data/msg_23.txt @@ -0,0 +1,8 @@ +From: aperson at dom.ain +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain + +A message part +--BOUNDARY-- diff --git a/lib-python/2.2/test/double_const.py b/lib-python/2.2/test/double_const.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/double_const.py @@ -0,0 +1,30 @@ +from test_support import TestFailed + +# A test for SF bug 422177: manifest float constants varied way too much in +# precision depending on whether Python was loading a module for the first +# time, or reloading it from a precompiled .pyc. The "expected" failure +# mode is that when test_import imports this after all .pyc files have been +# erased, it passes, but when test_import imports this from +# double_const.pyc, it fails. This indicates a woeful loss of precision in +# the marshal format for doubles. It's also possible that repr() doesn't +# produce enough digits to get reasonable precision for this box. + +PI = 3.14159265358979324 +TWOPI = 6.28318530717958648 + +PI_str = "3.14159265358979324" +TWOPI_str = "6.28318530717958648" + +# Verify that the double x is within a few bits of eval(x_str). +def check_ok(x, x_str): + assert x > 0.0 + x2 = eval(x_str) + assert x2 > 0.0 + diff = abs(x - x2) + # If diff is no larger than 3 ULP (wrt x2), then diff/8 is no larger + # than 0.375 ULP, so adding diff/8 to x2 should have no effect. + if x2 + (diff / 8.) != x2: + raise TestFailed("Manifest const %s lost too much precision " % x_str) + +check_ok(PI, PI_str) +check_ok(TWOPI, TWOPI_str) diff --git a/lib-python/2.2/test/greyrgb.uue b/lib-python/2.2/test/greyrgb.uue new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/greyrgb.uue @@ -0,0 +1,1547 @@ +begin 644 greytest.rgb +M =H! 0 " 0 ! ! "0 )( ;F\@;F%M90 +M +M ! " #_ $ %- +M\ 0]<$ %%Z! !2>P +M +M +M +M +M +M +M +M H +!@ # L T1 .%@ #QH ! > +M 1(P $BD !,O 4- %3H !8_ 710 &$H !E0 :50 &UD +M !Q? =90 'FH !]P @=@ (7D ")^ CA )(D "6/ FE +M)YH "B> II *JH "NP LM0 +;D "Z_ OQ ,,@ #', R +MT ,]4 #39 UWP -N4 #?J X\ .?0 #KX [_ /0( #X' +M _"@ 0! $$5 !"&P 0R$ $0G !%+0 1C( $* "(D B98 (J< "+H@ C*@ (VN ". +ML@ C[8 )"Z "1OP DL0 )/* "4T E=8 );< "7X@ F.@ )GM +M ":\@ F_@ )S\ "> @ GP@ * . "A$P HA< *,< "D(0 I28 +M *8K "G, J#8 *D[ "J00 JT< *Q- "M4P KED *]> "P9 +ML6H +)P "S= M'H +6 "VA@ MXL +B/ "YDP NI< +N= "\ +MHP O:D +ZN "_M P+H ,' #"Q@ P\P ,31 #%UP QMT ,?C +M #(Z R>T ,KS #+]P S/P ,X" #/" T T -$2 #2& TQX +M -0D #5*@ UB\ -60 +MWU\ .!E #A:P XG .-T #D>0 Y7T .:# #GB0 Z(\ .F4 #J +MF0 ZY\ .RD #MJ [JX .^T #PN0 \;\ /+% #SR@ ]- /76 +M #VVP ]^ /CF #YZP ^O /OU #\^P _@$ /\' $ # ! 1( +M 0(6 $#&P !!"$ 04G $&+ !!S( 0 at X $)/ !"D( 0M' $,3 ! +M#5$ 0Y6 !!@ 04 $& !!0 00 $$ !!0 08 $& ! +M!0 08 $% !!@ 04 $& !!0 00 $& !!@ 04 $& +M !!@ 0, $% !!@ 04 $& !!0 08 $$ !!@ 08 +M $& !!0 00 $& !!0 00 $$ !! 04 $$ !!@ +M 08 $% !!@ 00 $$ !! 08 $% ! P 08 $% ! +M!@ 08 $& !!@ 04 $& !!@ 00 $& !!@ 00 $& +M !!@ 08 $& !!@ 04 $% !!@ 08 $& !!0 04 +M $% !!0 00 $$ !!0 04 $& !!@ 08 $& ! P +M 04 $% !!0 08 $& !!@ 08 $& !!0 00 $& ! +M!0 00 $& !!@ 04 $& !!@ 00 $& !!@ 04 $& +M !!@ 08 $$ !!@ 00 $% !!@ 08 $& !! 08 +M $% !!@ 08 $& !!@ 08 $& !! 00 $$ !!0 +M 04 $& !!@ 08 $& !!@ 08 $% !!0 08 $$ ! +M!@ 08 $& !!0 00 $% !!0 04 $% !!0 08 $% +M !!@ 08 $& !!@ 08 $% !!@ 08 $& !! 08 +M $& !!@ 04 $$ !! 00 $& !!@ 08 $% !!@ +M 08 $& !!@ 08 $% !!@ 08 $& !!0 04 $& ! +M! 04 $& !!@ 04 $% !!@ 08 $& !!@ 04 $& +M !!0 00 $% !!0 04 $& !!@ 08 $& !!@ 04 +M $$ !!0 00 $& !!@ 08 $% !!0 08 $% !! +M 08 $& !!0 08 $& !!0 08 $& !!0 04 $& ! +M!0 04 $% !!@ 08 $& !!0 08 $$ !!0 08 $& +M !!0 08 $& !! 08 $% !!0 04 $% !!OZ*@EA6 +M*3156$5:6TUFHII,#9$6%D#.?Y$ +M=W5H8%D_*1@@+3!07)U:EA%:5MK at 4\Y +M8H-V>VE8-CQ;@W V+4QO3#=64!U)1# 5&#M$8'!C$DV.TE@ 3D!1 #^<8)P-EAA8FI?+1LE<()F8V-?22DM +M.RU-:F)B3#8M3W!B;W)8.3DG&SE at 6%@I'6)[:F- at 36IR6T]R:EII/B=8U at V<&!:/QM)G)@ +M17=[8FIH23Y at 9T5%8FE-.3Q-7V)K5B=B@')Z:FE;;$UF at TLV:H-N?7-825IW +M>W!)24]K224V5D16:6$@&#(\16E-6SDM7VI:=WIZ:FM at -ALE+39F?'I836M: +M9GV"@FI%/X)%:P$V 5@ \')M>F-;6V)V=RT.)6.(8F-P7)K9DU%3&MJ8FA%9GI,+6]W:G)K6C]9 +M:$U5:G)H8$0Y25M<224E8&MR9EM;<'-Z=TE9>H)N?'9 at 7EEJH* :D5; +M23E):&\P)RE86%I at 8Q42,&A%<'IU>GIJ7"T@%25-:ER-339A:FIZ?()Z6UA@ +M6F)M>F]),$PM(@-)Z5A)6')R9FE- +M5G*#6DUB:FI$6E8M3'UZ24UN7EI--BU;?V)K6G)R:V))6#\R+39 at 6FAC9F9J +M7#8V/V)U=RT@&!56DPY(#9L7)@.RU?>@-R_G!F3&!N("5)8EI% +M/S9%:H!B3#Y)6$E;>GILG$_&S9Z8VMB=75R8D]/8VE63&);8V]FG)Q8:0M24DG16M<8VAB8WMR9S(8.UA$ +M-EA$871L/B4I,'6"8&-H168$:YMN@(9]9F-A/R5?7"4K("TY54UJ26QI+2U: +M6EX#>HU]:UI)26*#83(8(EQZ V:%:F!-:W(!>@%W /Y[AG=@6#E-6F)S:%A5 +M16EOV],67-5("U)8%@K%39@>G-R8#]8 +M36N";D1/GIB44UG:%EJ at G)B6FIJ:VZ >VYK +M:#LV7EEJ=V-$$B5J>G5N=TD@&RU?:@-:N45(>WMK+1A)&U:9FDV37-S;&E;=7A]=G)K6UA-7#9$/S0;/V!B16IH+45;6 at -CEFMK=6M: +M259B7C\M-F!L/TQK8UIB:FH!8@%$ /YG at GUS6#!$8&!:6#E$+6!K:VIR>G=D +M?7=M3R5823DR+5EB:$UB>G!)37IO/S(R.TLE&"UA:G)W33YM36J":S8V46YU +M>F],1%Q6,B4R7D0R-C!61%!@36IR:VEB8UMA259J64UB/S9K>FLE)5IK:V(Y +M/F)RH [&SQ83%IH8#8G:GI@&PXM8FIK>W=I8#\8%14M<5I,8W!)/FEZ +M'IL;G):6DE,65XE+55-=VIF>FI;:&!%/S\V/V ^)3Y,8VMB8E at R +M+3EK;VAH at G)Z 7G)Z64QB:EX_5F]J:V=>24EBFKS5$QB:V)<9EN"@G!:26]O3&A>259)6CY,>GII7UE%-CEC +M23YB>F<[.T1965I636)J:$DE& D;2UA,6ED^/RU%:UMR>G9U:DQNBG=C6TQH +M:U4[+5AN8&-J:&!6<(!Z=T]8:WIJ8#8[,BU)9U],3&)[<6)G:5 at M +M.SD@&!(_;VU)37)W at H)4(!@E25MF:F)9-CLP6$4Y15MVGIJ +M6$1B:%MC8%9<=7U]>W)S:F-I36A5.Q@;6FIU at H)J/BU>??YR658^+6I:7&Y; +M3W%W:$1C=6YL63]RVA64TMC9UI?9F(P26%- +M8UI:8&IR>FT\*Q at I5DU-25M%/DE83%9J>GIF/AU:DH)P84E:8DL^66EF?6XY +M8')K4'MR6#9::X!]8S8P8VMF84Q(:&!?3T6"6EP!:@%P /YH/TU[-"4=4SXP +M:#8V6FIJ8EM)+UN':G)R34V":F)@7#P at +6AW8DE:=WI;8&!8-D0_.S(I+6!J +M6%1::H)]=U4T*S98:VIC<$DP26%))S]-GMB,$E:/A at 2*6B":T4E"2U-641-8W6&?6YB.2E; +M;EI8/BD8#A@@1'IZ5B([7V)B3%QC:T\^27)ZFIK +M:U]):&L[&!@^W)O6C8R;V%%.SY66E9$6F)J;V!:6E9)238_F%0638K,#9(:'3UI;9WML:T1-9TQJ8UIJ +M8W!H36J":F)W:4E/=V]:2U4[(C]836ER=81UFM at 255@65EZ:FAC<(I at -C9)7V)J +M8FYT 7H!< #^6#Y)16=O3%EP83])-F)Z=V at P1$E)-C!Q at FIK:V-K@'=)("56 +M8EH_+2=CBFIJ6D0_36)/1#9-:&]%8&EJH*"8CLR25A@:FIH, at D@6&IJ:4PY37)R9U4 at +6!@9UI852D.#B R,#PM3'5J +M_DH)Z@@%U 7 +M_E8Y6556:$DP8G=I9S96 +M8TD^245-1#DV/UEB9EA;<'=B35Z"BGIK/DE::FM$8#8;-DUB9VUXA6M$0C]) +M8&=:;QL)"45536]O6$5KF)8/C8_4"T_E9::VM:36EL9BT;-G!R7%IF>G9K:VY+1"4 at -EA)36=6:4U6:&!/6F!) +M6$U$:$E/8VI at +3EK=H6"84E-:F]'-TDI&S9)1W-R?7)98$D^1$E89S05#BU) +M36MW;UIG66:"8S!@.69Z:D4P840M/#(V.S99F]8(AM)6$EUG)/:&I,1%I$6E at M6&IJ9&UUBEQC9G*"14A8 +M*2)8:F):8$DI*8(^:P%F 6H _EIH<& M(#]N23\^1&IR>FMR6D]9:F0I)5I: +M+5A%1%E?/S!(24DR.S8;.3X;/F)-G)P8'!C23Y@ +M8DU/=UDK*38[6W.$=WIZ:$187#YG8E]B:F)3>H9:/V)Z=58P/BD8275B7&9@ +M/TN"/D4!<@%B ,PV6%@;/C\_8%I823Y8:GIR<6(_.5MI/C996"U89EA-6$DI +M'39)6$DV+40[)2T_1&]V2S9:>HI>&!@PG\G87)F:#8[ S^+ +M,#];6U8O1&!Q:%8#2?Y-36!P8VA96F]M;6M,5F(_26 R'4]W7SY-;G%; +M+3ES<4LV-CYA:WQN&I9.3YA8TU-:F!)*24_ +M3%Z#>GJC at G)'5DDP8FUB65YK7&9UFE)3T1%.5B$>G);:H*"9G)J65MC6V\[&SYB5DE)6CEQGYW7BU)8FAA6TQ?G=-6G-H3SD5+5L_8F-;:W)B +M8$DV6FIJ6EAN=5I9:&))6X)R:FA/%1):32DV.3]9 at GIR 8 !50#^2T]K<%AG +M63X_6&)?23]-W)Z8#EJBG59( D@,#968DD=/F]R=6A-:W)N3S9- +M>GYH+TQZ at FI:=W),9FUI7C]@34UN238Y>GIF6T]I_G-]>V$8%3=R>G-C34]] +MAG9]<#PI.5]0)2]Z@&-C8FA@H):/U!T6W=[8"TP85LV16MN +M>G at _/TEI6DU).6)837:&;V-$4')U8VMR:T1L241U63Y$/CEC=WIR6&AJ8V9S +M>GIB35A-.6.'9EQ98#8 at .4U$2T5)3()C9@&& 7( _FE%:WI;:F,^.6-B7U]8 +M36IU<6!)26!@6FMK:'-O54EA8F-)8')@+6!G-C(G$AM:@FA%/S]9;VM84%!) +M6EQ?/C94:FYN>W)-1'UV3R 8#A at T8&]),#E,GUN +M46IR7&)M6T]:<%DY9E\M&VMK8VE%6^=R:7IJ*QTM:FYK22V-A<&YW?7(^+2DM6')ZF)B6EA$.TEB.3]9<$0^3 *# /YR.4UZ;VIG.2M;8%]BH=R/TMI8D4 at +45CA'!5-D4_2U4R-C!:GUF7&-R at GIP2S8\,DEK:SDM:XAO30-;ED]9854V+4UZ7DE)1#Q$5CXM +M/GQ?)24!<@&# /YK24UZ:G!,/CY at 85!:?V9J:W)O36)W:VEH9UH_66%:66)J +M:V]P8UAB65A-7UY$3')W238V.6MH24E:8%]<8F]B1$U-7GIB:EQF=8)Z6QL2 +M+6]$1&J(>F9?*0X;66 ;+6A%7V@^&T2"B')B2&V*6EQ)0D1B:EI).SY/8%I, +M+27^16-J:C<_9F-C:TL at +6MZ=G!W;%@I+V]P6FDV(F)Z;F];6"4K:(5W86!P +M:F=5*S8_:G)<14UO:ELR&Q at Y?(1W/S _6& _+2D^669Z,CEB<4E%=GUU8&AZ +M?()P1#Q926%R;%D^9WUZ;%I-23\_:68\&R)B;CM58&%I6DD\26M@@B4. 4P! +M=0#*3#E:>DUW8#Y(6G!B37%M=VIJ8CE%:T]6 +M3&-O;VAFUI@ +M:VMQ8#8E+4]K>V-(:ED8%4R"&$R&!4[8GB*:3]/:6-)-#Q866-K-BFS/F9:1&IZ;F)K&!/;G)U=GUR8%A$-G-X22DK24TP:6IJ>G(Y66-S:2T. 38!< #^)1U@>FER +M9EI-6&]W26)RBH%Z<$4V6G)B:G-K34M81#Y$9SD_13]-;$U61$E;=WMH7&)@ +M63Y::5I_;T0M-D1J>FE$(#EJ at GMF6F-,6G%W:F-I)39B>G)J3&)J4')[8&!V +M.5IH6#0K27)B241B at GI/26A68')8)25$G=)&V]W8#Y at 838E5F-;>H))/V)[=X)>( $; 3\ UQ at 5-EJ WIO3V%A16-W7F at V(" _ +M<6M6-$EI-C!9>G=%(!LV3UIRG=)+3E9GUH26)Z=VMK=V)% +M26MR,B K +M-FJ":4EK>G598'-L8VMI35!H3UES@&M$+4UR:VIR;W)Z>V)%6TDY26AO!#:K +M5DUB2W>";CP;-F!N at G9N;&9Z@': 8Q@;6&DV,%J ;UIH35I9;C0;)V:"?0%H +M 5D _H!B65Y88VY[>F))(!AJ<69N>F)K<%QJ:FE5.4U)6FIJFUK:"D5&" [6&AR1$%UBOZ 6S]: +M8G!%-CPT26)F'M[<$E- +MH6#V$8 +M%3=R>G-C34]]AG9]<#PI.5]0)2]Z@&-C6V)A?8!>-D6"=W4!; %K /Z"33E@ +M15A,<'MK5" 28WIK:W=B:FE,6')Z:#XM)24^8G)W:F%//D0[25IJF at _.24@(&AG1#]:>G(^.6-NF=%8EH^+1L@%39-+2=J +M at GQ--BT[.6MKFY0:G%;8GIB8V0T'39O339O@&YC:4E$/U!C@#^@TDG639).6EP8E4@ +M)5IZ>F)J:F)8+39B9'Y;-"D8($5C6EIH<4E%:7)N?7-%63E(?7-P83X@&TEZ at W);7T5; +M>& Y6&);=7A]=G)K6UA-7#8;)5IR9EHP6V-W=BTT15MJ:T08*6N"=7U[9F at V +M/FE)26E-1'6(:7=K,A at R86A5*45K?&LP.3FMM;S\@ +M17!R:W)<*2 T56$V$CEJ>GV&GIC8$5C at FM/8[MR9E-< +M at GAZ;&YR6EI)54E88F]I)45C:FHW/V9C8VM+("UK>G9P=VQ8*2]O<%II-B)B +MBGIK8&EK8#8.#@$P 6( _C9Z@&!9+2FHY+4UZ?7IZ/RU:>FM:8E at _241-/V)K +M?6-9*SYCBOZ-BGML36)816E;:X%/.6*#=GMI6#8\6X-P-A at 8-H)K/V%H6DQ? +M8VM8/VMJ9HJ/;GM:8&MK<6 V)2U/:WMC2&I9&!5, at G-9)1M6=79G,B4@)3Z" +M=U4"%0#^26I[@&YR:$5 at 1#LR+59BW!)*RE):VM;84U at 16)J:DDT8VA/>HUV +M:#E,1#!I8T0@(#]IG)P36)J524M6%]$ +M&QM9>GV%?&IK/Q at I<'IFG=)67J";GQV8%Y9:G)N4%@\26):6E at Y6&%B9G!+'4UH.6:1 at F M+55)86MF +M-B V8WF8^'5J2 at G!A5G!I245%36YQ22]%:EI;>WIO +M3V%A16-W7F at V(" _<6M6-$EI3S9K,$1:)39W at P$M 2< L4E-6FE$2'IR:TDM +M+4E>1&-W34E-6F)96W)P+5EW:U\V+4E?/SY)6%@R(E]C:WI;-DD#EDT/DU; +M:6]A23966FMK1"TE5I**@FA)7&-)/DE;7'5W6#E@,#YR;6UJ>FLY6G=C33\I +M*3YC6E0M.69A1&]%-CL;&TR" 6@!/@#^:$UC<$E%:W6'9R4I5%A%6G1$2&A; +M7F!%7GU)37]R:EE$5DU).SY)8#\E86QZ>F(V/UQ[EDI#@X^@GUZ=7V#=5M$871L/B4I,'6"8&-I168$:YEQFI;*4E:6&8I +M(%EJ?862>FEG9F)%6GMB7&MO35 at E+45%4&V ;SE-H-W24E at 7T5-:%E9:&AC8$E/G:#W=A6W5[8UHM36)621(837)F=9**V%%BH!;/UIB<$4V/#1)8F9R6&QN:V%@84MA24E4(!U%>&)B7UA)-BDI.0%H +M 5H W%8V+4DM+4ER at WI086%B8%E at 8&-R8FA at +2U;?W)H8$]88VIH6DE)6&]- +M+45BX*":V!)25IJ>E8V/TE%35IR>F ^5FIT +MG)OGUR:FZ%=S^ DGH)[6T0R-EAJ;W!R<&%$8W)83W*&@#\V27%A-A@;8&Q$ +M(#)I8#]:3411;H,Y8G)C,B Y37IF86EN9T=RBG)5;G2#8S\Y6$D\56!I:V$_ +M36MK3%QI+3!H<&!8-BM):VD^-C(M/FJ";S8"/P#^6%A)-D1-36ER=7IK-CY8 +M45@^:GIF330\-T5Z>FYC,AL at 8UM%8FIJ;FQC;VUN;%E);W)J;EI)/SY)6G*" +M at G5KWIR63E>56!SW1$*2U;:#\@,EIW6UM>-C!( +M9EA::FQ/-D1)GUU:FYK8EI@ +M8VIK:F)1>G0;27)R:G5%15IPH=P;&Q/:&QW?EMA.5MW:4MA<'=9*39%F)-24AZ>V!;)2!9:UA)/C\V R"(+5QR;FIJ;FH#8OYF>FUK8W)W +M+4M:3U%V<&%@3VIF/V%K14]I1#]BFI66T0E-F!I +M:5]B8G)R;UE-6W)F9F],8#P8#BE)6&)O6V!)/SY-G)B22TM1%E]@G)? +M6%9J>VM6.T19:%I-6%E)-CP\,CYB;UE<>FIK:V!-:DQ9>W=Z36!A345:;W)W +M86E:6F)B;&MH6%EP84]B>G6 VQ$&S!S<%E+,%MW:VEQ8$UF24UH/S9$)2U965 at _6W)K:&%J>G P.7-W +M<$LM.5A;9W)C3UMI/V)Z:VMJ7F9_6T0I)V*(@X* 3TAR<#(2'5EJ +M8UY$/F)B=V]625I8.4E at 83(@+5E8/S]88#9%9UIR<#PE1X-R<$LV6'!C8VM/6#(M W+384U-6#X_:&-B;6MU>F(R%2]WB'I/.5I,;VMA13YI8UAH>FM: +M2&IZ at W%%66MM5H=S(@-&!H8$E8/Q at E2UEP:U at E-G-S>W _5G)\:4U:344_:6 ^)14I +M25@^1&IZE!96UIN at G5B35@_27IZ at W!- +M85M%/V!8.6)F>XAC)0D26H-W8#D^.V):84U/3T4^6GML8V-H>HIL,$AZ=7)% +M/TEC8F-C:6$M1#8I-DUUBGI/4'-87EY5]"DM5#L8&RU9 FMH7CLV +M86!H230T/%A98VM)+39;(!(V:%I86EMN>W);35 at V6&YUB&(T8W!824\^)3 _ +M@)%P*0X827)F:V$^/VA98VQA2T0V-V=A8&MZ=8-C-D5[@G=@/SE)87)Z6FDV +M/SXM_C9-8G:"6TUL<%MA:5Q)83\R+39)6F-Z at G!826U-+3M$15IK>W=A6'*#=6$^/EA:;G=R:F I$C]/6#X_240G8VE86%!F>H)W30%: +M 7, _FM;8VIZ:U9B>FM:8W)V>&!-3%48#@XI27J2A'5R:EA)28B#DDT+5AK +M7G)S/DEP8F-K83]97CY915AB=UQZ<458 +M11U,:G)P1!LE8GIB45A8/AU8844_,&-0.2U) V"K6V)RW)B/UAA36IPFM88G)U>F]-8%@;"0X8-FN*BFU>338V1(J%@F]4+2U,;TPW5E =240P +M%1@[1&!P8W)R;VMK6"T;/WAP.6)U9')R3#()&%F"=UM>6$5),&!O.5AA:6EB +M6#!::#]A24U97$UR>%M98VQZ:D0I-C9C?7%;3V V/Z!Z;FAC624M25Z(;CLR +M6W5R:V-O-BU)6$54/E at V(!M%6P-8PDQ-6V-C:6-926!Q:WIR7G)K6TE/86=R +M=69A8#])=X-J9G!R6#8E/WN";G5R:F!>)4)@6$D_3'5N6F- at 1&MCFA at 230I6%IR;V!-:&EC:FQ$369J8P)[ /YF33M-=GU$35I,-&!J;7-U +M4&IP,A4.'3QO at HUZ12TI+4EZ>()UG=$.7!I-A(V8#9/15AI340;/UXG/T1,9T1) +M;')C22<_F8M("5:>WMH25IR:7> =V!%3UI) +M8FAF+0X8/TU%/DU)-C]88%I:6$E@>F)KG=Z6SXP8"DK/SX_-CEJFIB8E8^1$DY +M:6]$16)K6EQF8V%?@D11 7H!?0#^=7)816IZ:$E)+1@^54U[@%!,F$R(!LV:W9V:F9R>H* :D5;23E):&\P)RE86%I at 8VUJ6%M;1&YF)25B +MBG(_:H5Z<#8M67I[8"4P<&T;-FA at 839/*3YQ52DM27!;64]B:FD\,DQB +M239$2S9)8V-B<$D^]&E(&IP/S!S;24V640P8G%F;GIJ6TE':&%82TE/245$ +M&A1<'=R9U45)4U:.4E;6V)V=RT@ +M-EA at 6E@^&T1K37* :6%@15AP64UB8UL_9H-K8V)P7C(R=$Q$8GMZ@&-5-D5A +M85AA:7!5-EIK8UA%8W-O-A at E86]J8%I935]))6ES<6)89G%/-BD^9H):1 %J +M 7H _F1F;FUR6U at E%2T\/SXY<(:(:UI:9CY$;GIJ:7)A/RT_845I7&IK4&Z +MAGUF8V$_)5]<)2L at +3E536IR:UY)&RUC- at D.'6IZ8W!$68A+/%M:<()A.2 E +M/!@E6&85/G-'7UE)H->8FT^-D596VEK8$]C +M:F)I/TECF M+44@%2TV"25@ +M/C Y8&YZ6W!K530_6T]F at VM/>HA[;G)925E4)15-UQB=5Q:33EK at FI, 40!:P#^@W)'6G%C8F$R%1 at V +M/CYF?75K+2TV<&A-=UMI=V$_-DQB6E at P,G=R9E-<@GAZ;&YR6EI)3%E>)2U5 +M36!W6TP^8(" :R4)-GI]=G)B at UDP.6IZ?8IK/EEA-"DK%0X;8%@V+6!W=UIR +M:&!@86M;6FYI,&.*AGIJ8#Y%/A at .+5]0_E!J9GAR<7=S8%59:U\M/V-<;W!F +M?8)U>UEM>FU;1#8_:%@M+3E<@H-,16%%8VE85EE)8&IR +M=7)O8AL2.7IW;G)B3S])8X)B10$E 44 _GI[159C15IR;S\Y)2U$8W5HGIF8G=Q351L>W*">V-F:5Y)4$$@,EA at 1#9-9G)B35E96$UZG9P6V)J +M7E]Z:T]833E$8&!:6 ,_U&-RBGUR:5L_36-Z>EQ853(;)VMR7CE$8FMC2SY4 +M/RG5BG9U:DQNBG=C6TQH:U4[+5AA34DB/V]R9G=/-DM-;8-R +M9FUW33EIH*" +M:UX!1 %4 /Y]BGUL4&=RW)R338_+2]JG)[VI_=S9K?75Z9C8V6&IH6DE)6#9J +M;75[;T\V6&%P;'):/TEI:4L^6FM at 8%MA/VA4*2U@,B5M669Q26.#:UDV/%MZ +MVMK9R4V5#]6&Q at P7T(M6%IK:T0M +M)5:2BH)H6$D_+39P<#EHBF at 5/FI<;U@^52 @1%@Y6')Z>W)B;&)@7V-:-BU) +M83])- at X5,$5,4&1U=7FM>.R E_CPV6W$\)5A- +M:$E$/"5+ at W]/.4UB<& G24EF8UQ0:F<^)3Y/ +M;&QC238V379W34UJ6G!@8U5B5C8M340R:$M%>W%L at W):24D^6G5ZGIW:W)W;V)+/"U%25A5.3(V*2(^ +M1%IN at V$T("5821L817=N:EY/:&9U;VE4.S;^23YA>F@[-DEW8#L@%2UO>UD@ +M+6!S:#]H:V)J:V%J7U!G5C0E'5,^/DD^-F!H5C1-23 \1%ISG)]/RT_-RTY:W!5.T]F at GR# 5L!.0#^+5AN>FUK8D]M<#\M8H!P/CY) +M7UI9639-FQR>GIR:44E+41@<7!A/RTI-CD_67IR@%4R +M6&9;1%EZV at R%1 at M86\\#AL^:W)W>W)J +M8EYA:DDP:UA85#L[)2U$.S9-:U]%63\G,$E/;'- at -TE)2V.#@FIC86Y[6W)K +M6D0 at 23(V=6);:6!J>GUQ:44K)4UR>G)C;'-C6V)I;'9U;6,G1')?6F%6338E +M-S8K+4]Z=5HY8H)0>@%H 38 M1L_<&YF=7IB4& M%3!J@%])5$5%5CX^16)R +M8DLP8$1J +M=V!A1#8#/]588V=)2U0V-#9%6%!)&R4M/TQQ at FU<;&Y]FYK:6%$8&EJ;F->:$UN at FIB6" .*4EN9$UH138^)TE81%QR8C9)8EIH:W)F +M84DY8G)C,B Y37IF86ENWIR +M_FQ at 6&MP9C0I)2=8:4EC>FD@"1 at I/T1F?7I;34U at 3UA:245G;TQ9<%X_23]: +M:6!664D_7DE88%]$+3(I-C9$;FI:GEQ>,')J5C)!/"=JG5R:FV"<%XP6%A+:W)M??Z)WMF +M6!@8+4]A<'YP-BDM-EA at 8%!O:UA%6CE/;(-R6D5B:&MH64E,6EM)35HV+5IK +M<&)B6#!$6%Y56&)98(" 6VIR16]J64E95F!-1&)Z:4E/1$U$VIZ +MFI5)3(Y:G]B8GIF;T0I/VIB5C]K>F$M1%8V8'-Z;6)-:')8*2]8;CLP8()Z +M8$D\.7)C)0Y,=6M)37IZG-Z<&!8/DUF-A at V:WIR8U\^.6!X +M<'1 at -BUU@G-K<&)R=V):23E6<$DT:G)R:E at M)VJ)@F)654$V/CEC<$U(:UMF +M>FI6:&@[+4DE16%R>F at E#AUB;GLI at C!R 6,!/P#^*1L^;WR"@GIF:UMA64E% +M8G6&=4\G/FMS:W!RW)C7&YLWUM:&!$6EAC8FERAGU-("U; +M=6YZ at H)S:F R)6TY%2UA35""9R55=W!%65@\27![;UXR)3EB at G!J9F)07FM) +M6G5C8GIN8W(!L_)1U@>G=R +M:V]U=G5F-"LM3VE%1/YZBFDP17Q[=G)I3&)R26%/6UIN"5B .&UEZ;6IH47=A/D1):%A63%!B8VEJ3UA8:V$E,&-UUF"87(!:@%$ .X@/VA;@G5]9EQ;3#XV3VE99GUZ6B(5.6)?;H.&@FM- +M1#)H1!LM/D59>GEXI&Q45- at -:_F)K>G5ZWUS8S\8&"TP8G)%34U/ +M8W)Z>W=J:G=>,CQ+.45P:UM@:7)P63]/>'-R:F)-7V]J:FM09']ZF(_5FIB65],1W&">GIO:5MF:VA>/"U$.415 +M(C]P8E at V3WQZ<%A98EI@/S)8:W-5*2TY;8EL338;+69P=W0!<@%@ /XM)V)C +M6FMU?(-K/EA6'3E,F])+1L2/FZ"?U0=/$UB +M7G)K9GIZ14]>141$6VYZ@&(E3%I%27#^G=S<&I at 6%5;9GU[83X^4'I\<%0I&"5BA7UH+39,66-L=VQO<75Z +M8EAH9F-@/R!%:#E%6H*"1#X\& E$>GI]@WIA)1@^8W)P/C!$7CM):&]F:WIR2V!%+3YW_H%N8E%:=V-86GIZ-"!-;U42#A at M38(^)P%, 40 _BD^66MO8G)R>G)H5DU>7#!$@7UN +MH)Z8S(@)3!@:V8V-FAR9CE$>GV :4]:8G)Z at DTY +M8$DE&T5RG5P1"T_7#M4-BU-:&MA +M2UIC.2UB at GUK,ALE6()Z:%A;=W-B52 V8$DR+6%U53PM-UMQ7C98:F-),CD^ +M23X^238Y7UEJ;F]H8G)]@&<[-F!G/S9?;U0P:G5R6C ^6$1,7SEH36%%8FE+ +M<7M@*2DR25B"6& !:0%> /YH1R +M1!M862&8[.UGH9X)]FI816)P6FEF-EM6/" Y;UM%25AA<6@^-C!::&!4+39%.SE86&!B +M9FI at 7EEM>H)B84E65BTM6'9G/G&">F(#/HE)8V V5F-?:T<#8HEA6$]@35IB +M7VL!> & /YW6TDR$AM@>FQC8#8E6W)P246 :$U08" ;6H)K3U9,37!_<$U/ +M?W<^-FAB25A at 16-K8EI;6VYZV\M#@XP8GM))4E<,A4 at 6&ER=V-C:VE)3VGV +M:W5V?'!?52 .+6)H8W-Z>H)R8TD_3VIZ7VMH36%K82D at 6')R:UDR&S9J>FUA +M6&%;15ES65MH53L\340P+3YC<&M?/S9>8H!O,BDV/TE665IBSDV:H!K36!(8&1, +M8')<:FMC7F9Z+3!>1"DO15M;>G)C8DE%6FOM8F)F>WAK7B 5 +M(%EO8G)R:6!-8%M86FIR:G):/DE18$1):VYK<4]$*39K>G%B8VYA/UAF:5YK +M6DM88$DV(" _5F-R6V!H36IJ23(V24U624E-9W%Q(!@R/D5: +M6CXM6&-B:W*#>F%::%DI&#EO7%@[/TUK,#9B +M;G)H2UA9:&QH22TR.SQ)6UM,9G5O6$4^6'"\7T5@@()V9U at T,EER:W5K;&A@ +M6EA-3VAM8V-:-BTM-C)6@&)>=T0M("5@<&E64&T!<@%B *]Q8EIB.Q@[6#!$22TE7FE/3'N" +M>FI::W))("UO6C8^6&!03#LR)2]-6DUA8VE:3 1R_EQK36-K8%4R-EXM8%MB +M:FQ)& XB6DU;51T_>GQF6FU at 8%QB<'A[8U])86%B>W)FDV.6A: +M+39C=V8^,$D[ R74+6%J<'MI36)N>W)L6FIZ:V _/UE)8&-K:VI)& DR7BTM +M( D_F9>>FIN<#D.)6)O:%D_ +M:V P22T2 TG^66EK=G)[=V)A/QLV36!?67<\(!@B8F)R>FA>*0X at 26QC:GIO +M-B V:7N">FA:23\Y6V-A=W-5-#E8638V539+,A)%:V-%,!TE16MR8EA at 8F)R +M<6UW8S8V52T5("4P:GUZ=6YW/AM,BHI[<%I865INF _-DDT +M'0X;24Q:>H5:/UZ#>G)B:WIU:TQ%541836!R>FA>,C]H)0,)_B)B?V Y7V)H +M:$E89G)?,$EI8&-O4&]O/S1+6F^#:%MR:W)K.Q@@1&-I3UYC6# V(!@E&R(^ +M8VQH3W6)>UE$(!4M;FE;8EPG#@Y636=J4&M5&"!88%I-W!A +M84E%:G![B&]@6&!?-BU<6E at 8#B5 at 8FEA1#0G1(]J34U at 9FIR;VAN63D# +M&*(I1&)B7&MS5!4G9&UV>W)K;VMN=FIB6D5$38!K5#)$7R(M 6(!;0#):V-R +M7S]->GQS8EA$6#!$;"(P;8)Z8&-]9D5K>E at M($F"F9B;'IF>GI@,"=;4QU->F!R;H!H( ,5_B V:X!C8$5%;G!%8'%8,DEC +M6$QWB'IK1" M/V-[8#E::WIO/"D^6$589&-P6F!85#(T*2D2,&-,/DV"?VE5 +M( XE<(5P6V!>.Q at M66--,%A>&Q@\66)@=TLE(#MC8V)R>VM>EHV-DER;FYJ:50K"14G+15)6V: =85]<69F>W)9 +M:8)W/B!62"5):DAC6WIP,C \.RLE37MB63\^9F\^6'!H1%E at 8VAF@X):/CDE +M.UAF6"TM17)S52 Y;T4_:FYZ36-P3SX__C\[*RU).S(\;FUP62<8+6:#=UI; +M6&!!%3Y925EA:%4\1$UJ8F Y6#PT.45:7DQS8W-4&Q at M239-:FYN8F958VARF)<:W)R;VYR:V!83UMH +M8FIB<&IJ7&T_/U at R($V :DU:36MI.S]@=5 at V,$UP2')[-B(V)2U)8$DT+55L +M at 6]$27)9+4ELBD5%;5HV1?Y-3%Y$/TE$.6](:&!$1#YJ at X)L8F)R;#Q+6$1- +M6UIO:FE::&@V&TE>+2 V6')P6SEF at VM@7&A%/UAH65A",C]C=T at Y3W M8F-O +M51 at 2*5HM-F)Y;UYK3TU9:7-[6#0G-&%;.6J!;'-R9CP@%39RF9B/C]$8&!,16-R3"EZ83(W26-/2W!K +M8FIK:F]Z;6I/:$D8&" 8%2 V1!LM>WI96G!/9GQU63]B>UA-EIJ +M53Y:/!LPFI%24E9-C!<:F-R:UIJ>GIK +M8VU9/#)$1#0T25P2(&IW2&)]6F)Z@HER/B4\*25C10X.%4E-+41Z>FG: F):7V)LC'I:6%A)1$EC<&]K8G!P8%59 +M9D1@:G);3'J2BF\\1$0P6C0##OX5%0XV>GIB1#1$:%E88W%)/D]I5EIO6$5) +M1VYR6#]:>F\I%2U96#D_=E8^6"TV3VQJ>GIM/REB?TT_:3Y$F)%6DE%<@."GVMR;1L_3&)I.5 at Y +M3V!B=8-S7 at D816YW8V-H3WIS14P#6/Y at 67)R7UER'!%16A9:VEH:FUZ5"<@ +M+5I3/F)-154M%2U,6G)S;S8I8FDM,'%8+4D^-%]FFM@ +M8%]O<&!88UDV-C(V8&*R/D1$-C)J8U at R,BLI369N8UI8:G5F at G5<+1LP47IS33D!:P%R (1UW!F-C9;:T5H8EI@ +M-BLT+3Y68F \26!@)25B9BTG1$]F>H!R8$UBXIC16:">FMC8S PW=H9FI985 at M$B V26-$,&)M9EH_7V8^- at -:_DDI%24M27IR6$L_6')Z:F ^13X8 +M#BU?4%!J9GAR<7=O:%XV-CPI-EMU;F-D?8)R:VMI16MMG=886QJ/V)O4&-%25LV24DW/S8V +M3VE5-EA-+25):6YVB8)P3,M-8VA)/DUI:G=R8T]W:4]C:7IL11 at 5+6!B:')P +M<%8^3&I/568\+3\W+3EL=U4[3TU9>HIP35QVA7UZ;#PE;()U=7-O8DE):G!) +M/DT!7 %R /Y9=VIF>FI;:& M("D at -F ^)3Y,-D0\)4QJ1UIJ;6)>7V!-6SY/>GUR<%A;;'K^ +MU8^65A)56%B66I_8TUP:V)B:X*#21 at .+5MC6V%KA7Y]@V9-24PV +M)3WA:.2]B at WYU6EIJ<(9];6E)9W5M;7UZ63)I>FHV at C9? 6(!9P#^ +M17!<2')K<&MC5CY)-DEC6DD^+6-[;7!-*2!)9#X_7EIL3TE)8#\R4%Q;86)J +M=TURBF)'<&YC:%9)6$QO=V)824]R=FM;:6%)*0D.+44@&U9J/UJ!:6)R6#!; +M:#9$6D1$65L^-&MJ8&-[<6):;'!,6F- at 8%L[6'5[8')C15J!_G)13&U[:U@; +M-E4[-DEH:FMCE at E'3Q at 8%I96WN&AXIW8V!;2S9>7D0M.6Z# +M:B4;,GIR:V-H6UQ]?5QB6'=F:VY]>DPK8WEG+8(G60%J 5\ _DUN6-B8#E9>_YK.2E%GF)W6#!B +M:%E:6FYU9FMK;GIK7CL@)3PV6W$\)5A)6&%C24EKBGIK>G]N:TDE2&-:8G5I +M/SE,:FI6/RE$GAR5EA$@BUF 5@!'0#^+5IZ>C P4&I%6EQF)2TY>HIR63E08EE; +M34L_1&)P7&=13W)B3VYR23\^/UER;UM)35QJ8$E(:G)N@&$V25M-5EIN:EY/ +M:&9U;VE4.S9)/F%Z:#LV6V-:8&!8:HAS3&*"@GII.S!89W)U:4DV,&!H:%4M +M+V!;15MK:6);8W)Z_G)@/#Q/9W)J;FEIF at E#AUB;GMZ>V-)/#9).6EI;'HY+3(R25I)16:" +M at G=H-H(=6 %A 24 FEAK:FY at 2UAJ8V]J:#LI)5EU>G)85F)B6T5- V#^8F)K +M3UAJ7)))4UB7T])37*(<# Y <$D\/W)U=7)D23\_F,#6ZYI8FM836MA)3!C=7)I +M53Q-<'N%C7AC145>/%MJ2"T.#CX\/SDM,&*"A7%R8U4_ 3D!:P#^=8)W6F-6 +M-V)U;FYF;U]-8VQ/56IO6F-B-AM$:FUK669Q5E]P:VA/:G [#@XE245G=TQ) +M9H:(:%8Y:'IR>G(V/UYF=VE5-F-C2V-[>G)L8%AK<&8T1$U-26!@3&M9GII8TE$,"]65EQVBG)C:VMR;FI836EI-"E/8V-K:%E$8W:-DH!O +M33E-6&-0.3D=#CY@=38)%3E[A6YB38)).P$= 3\ BVIUFD^&T5K +M6W)M/C8_;8)P7C!86$MKF-K6C]R>FDV +M/TUR at V]A8%MA8V]@/" M,F)$.3PK+5MW+1 at P,$E:%>EHT)2U);G V1&UO8#E)5B]R:UDT&RU$8F]5)2TG8G)U +M?7I at 638@+3(V:XV#8F9NR5!21TY +M;6MH3T1/>GIY>FIF5FI[:3!;,CQB +M?8)P/CD@)4UW23!?8CX;.6D_6V _-"W5N"2UL?'!]@F,V17AR34AF("4I,G1>&S!9 +M;75W21LV 6 !1P#^1%I$6E at M36IJ9&AUBEQC9G*"14A8*2)8:FA8.4UZ?'5] +M at G);6X*(7UEC8F!68VXE/CP;.6I9/#(V9F))/DEB23]<;FQR82 5.6-K3VJ* +M at EA6:H.#82TG%2UM/C!).2<^;WIP25A::F$_*39F8FMK:4U;F Y66MP-#]B=6MA6$]C8%9A-#9-24UH6"T8:5]I:VIR at T0R&Q@^ +M:EA6:&([&S9P6%A>-BT\1%4^.6%$)41$8&IR;EIP6S8I&S9 at 7&Y,2&YN:W M +M.6)C6EXT($UO51()#B!,6T]4>G(Y+6M]6TUR1#8M-FAR62M86F9ZH9:/V)Z=58P/BD8275:/CE%>GM(4'MR8EIU at G)C +M3V%B6&IR-DA$.SY9:F0I-G=R6TD^6#D_:W)SHII,$5\>U@; +M*1 at E9#X^6#P8&V!Z>G!H6F)I2V9 at 7EIA8FEJV @%2!5:5I8.6)R5#9C?6Q%:V$Y*5A6@%H /)'5DD; +MOYM2TE)84D@#FF$@G))-VN*:#LM26!@9GIJ3%MP>FZ!84E:<&9Z?6@\-%B#>V-C +M7E%R9SE1GH!@@%R /YB8$DE6FIJ6EAKE\R&SEB/BU88&IM>G5F=7))16EP6S9$F-I:4 at _9FLV-E@V8&!)+45R>H)G26-J +M8SY$;TTM25XM+45N=6Y9;GB*:6E>-C]C8D0Y=7=)6%I)6%IF at GUN6S9/BGM1;&M16V)>25MR +M:U at _3$M97E8_.6N"6S]B at F-; 6L!<@#^V9B6UM9/!@. +M-GI]:FE83X)R138E.59J:U]6:FMC;UA9:$E$-EA at .RDR.TE?+39H;UMN:V!9 +M8VMR:5E)8$\;&V)R2$DW+3E%6FUP:U _17U[2&-R:V!<:&EHF)H8F)).S]-3VE) +M/CPI(#9O:$5R at H)U:$E):VIJ:39$H!J34T#28M8>GIR8S8I6&IR8P-8S40M+38V1&-C:EI: +M8W5R:&!825Y:8&)K23 ^.RU$:FE866)Z:UQ]>F- at 6$D_+2 5(FMZ;VM)*7* +M:E\_/DU:6EA at 8V-I-B56>EXV/SP[.S8V;G=C7FY5-DU@:G)< +M3%AS6"TW65MJ8!LM:FYB:E!)/T]K:V _/V!%VM:36IK4&E:8V):65A:8V-8_F)0 +M8()K1%!88SL at -C(Y8G!K65IF855+23\V/T0K&!M?<3])2%A0>FMC9F-8:&-A +M8%@_+5IR:W!J:5D_8%M:6EMC>FEA34Q;9FIR;FQ%46]H23M$8V-S:54M04E) +M1&EL:3\V36-P22=-/S!::VIK8TU::6$V16M8+6!]>GIP2X(V/ $K 3\ _G)L +M63YG?7IL6DE%-C]K:388(F)N.UE at 86%5)3YH141C;V=+36IZ8TU:>FDE+59A +M:5@@)6N#BG=8*2U9=W)@24EH)6=R')9 +M,BT\-C!R?6MJ9F-B6S\[/T]C1 X.-F-)/TM8369K:W)K8V-R:6-8,A at M3V-R +M:V-/26MN8UYC9FYN:U at V+4QB:F!I/SYH:5 at V/X"">WMI-CEI22=%:VE)/T^# +M=V%9:5D_36-G:T4G36Q[8V9J6UEL>GV"<$2"/%D!20%A /YX8$]N:VMA,"E?@HV +M51@@67)C:5E;:2!8:7)W8V-K:4E/:6MU=GQP7U5+/EIH/SE$25IC9F(I+38; +M/FM]EI,;7UZ:D<_52(;6G9R +MEL^2UM@:EDG#B!)23];:6%:9FYUF-/ +M6V)J;GIO/R4^6&)/144_86E%-D1ZAV]Z=ED^=W T/VE;15DY=7)86FMC:5 # +M8)([&"U(?8!S=GIG8UIR>F,_.6 !6@%I /YW86)R=FYR=7)Z=TD;;W=@/F!A +M-B568UMZ?W%C/QLE26MR9EMRAG V-EMR:UMJ6VUZ6UM)3#=$8VYN=75]BF]%26-K +M8UIN/!LR+3Q96VA@:7-F>H)K7&=R>VDY&!(\;&A86V%[@F,V5&%-8GM[8#)) +M65E$/$4_258I%2]Z?%MF<&-8>GMA66M/16M93TPY/F!:7U5-14EC*Q at E3WUM +M;8)N8&!99ED\@BU6 3\!6@#^8F9R=79C:6-:7'I4$EE]6T5;<5E):VA(W B#BUKH)-+41Z=UY: +M9S8 at 16-'65AK_G)V:45,9FM:83),6$L_6FQJ;G5V=8)Z8UE;8V-8>F\M*1 at E +M/SE-37!R6FMU=6MF:X!R+0X.+5I:16MK=7I:/EEA2TU]?5IIGI]>DQ(:V]B7&IS8S8P)WMU/!@M;'IU9DT[.6=Z1#9)8FMC:V]<545835MG +M>OYN:W!:24QW;&%+6&->*3E>:V-N=7)]@F]A/EI;8'*#63LE*2DM/DEJ:V-C +M9G)KH!V@&,8&UAI-C!:@&]::$U:=U&&BG@\+2T;)6."B%I'6V%% +M8&M),$5I83];>GYW7BU)8FAA6TQ?DP^54Q:;')F66$Y85I(:WING-C34]] +MAG9]<#PI.5]0)2]Z@&-C6V)H6'IZ=FA>-A at 8/WJ"6C]0=%MW>V M,&%;-D5K +M;GIX/S]):5I-23EB1&-I3UYC6# V+24I)24^8VQH3W5Z:U%B:%AI8CYA;VYF +M:DDE/VN*@F-B3%YZ:EA)25YJ;G)>12)>8$QJW<^ +M/EE%-CX_26YX84E0>GIF6T]IV$!& $5 ,LM:FYK22$DV-F%) +M.3L=-EA%6&1C<%I at 340$-OXE.6-,/FUU>DU%6T]A33E@H-[6"T_6$UR;EI9G5]>EI; +M85 at V86M@:V-%239%83\;3&IH-DQR>'5;4&MF/"U/=4\M&!@W9E5%1%!U=FMR +MV9H-CYI24EI341UB&D^ +M1VMN-!L^?V8_36IH/S8M/DAZAW(_2VEB12 M16.$<%4V13]57BTV,%9NF<_6GI9.2T_5%MB6#EZ12L5%1M$;5Q;>F)>=V V8F!C:V)) +M5#\[65D@(DEI239;G9P=VQ8*2]O<%II-B)BBGIN;UM8)2MHA7=A +M8'!J9U4K-C]JGIH27**=5I$)1LY9'6&>EIA845B +MAOYZ341J:54V2U1-8&D[;D\_6H)6%14M8%8P26%;8%QF;'M-.5!F9FQR:EQ::FMI8#9- +M=6--/SE%/DE@/TUN:$D[.T at P4'V#V$_6V _3"TE16.":FH!-P$_ +M /YK:W%@-B4M3VM[8TAJ61 at 53()S624;5G5V&$R&!4[8GB*:3]/;&E%-#Q68&-I6F)G:G)K3UA<8EMK6EA86TU8 +M-EAN=8AB-&-P6$E//B4P1'J :TE:@G5523Y86%%F;V=%37=6*WW^?')O6D5A +M84U:3'-R24QKG5C7UIC6TL_.75[:UI+6EE+ +M34],:6-I9BT@($5J=GMS8UI(>GUW36-R@FY[ 5H!8 #^:6-W<#XE +M-EA-F--8VMK8UYB:G)I8SD_6VAB8C8Y16:#8#!B +MW)C3T]J21M<_G5T>V)A:&,_64AN=U at G +M369 at 6&-;,#!C:G)Z=U8R16)W22U-:VYC;&L\#C9U:CE%6%\P.7)C66QJW183':"@&-RB'IB6&EI48)/8@%: 6H _EI;>WIO3V%A16-W7F at V +M(" _<6M6-$EI3S8G67UX12 ;-D]:6D]O6%9H6%YS65Y:;S\8-FA:;U!< +M=VYW:W4^-DUO3&YB141BF ^/W=O:VM8+1L_>' Y8G5DG!)1.I<=7A,35!P7UI;:W5:-D5 at 6%IJ8S8V +M3VMU?7=)-C];FLY6G=C33\I*3YC6E0M.69A +M1"DY:F9T-" E+39K>UM$:W)R3&)P86MQ<&)R9RT_=W)C-C1KG=$/UI/,$UI +M;&A::$PG'5J"U at M-EMR +M4%EC8V)C8408+5MZ=UE:6V-Q8V,_("=0?8-\8U9:.3]S:UI9, X;7'I]@&,_ +M.4AB>EI98&%)+3E1:G)L)QM$>H%J:VQJ=6 at _1%98,"TE16);9WMS9EYR?7)) +M6%M<=8)W6 $Y 6 _B4M1450;8!O.4UR;%M9/RTV1#\_+3YK=U at _27!B:UXR +M("LV:H)I26MZ=5E@VA18DLY8V%%3S<.#C9PBH9J6UXP57IK:&-P +M83LP24106AL.'6*#>FI<:G5<26%I:40#/Y$Y.7!R>EM(&)),')_:VE5*RU)8WIZ>'M[ +M<$E-H6#X!R +M8V9[UM/:&):8UI83S0@)R\Y=HEP<&D_3&M;:VM[@6D_24E+/A at . +M&S]NF)C9#0=-G=O339O@&YC:4E$/U!C +M=89Z:S]F6 X5*S]J6D1K:UQ(>H)R8&]P.3)KV-:>GIK85A8 +M7F(Y1&-J:F%6:VD^*418-DQK8VMO:6IA86Q16EIH<4E%:7)N?7-%63E(?7-P83X@&TEZ at W); +M7T5;>& Y6&);=7A]9G9]?75R9SY)-&-R8F%$%6]@2QL_:$0G'1MBBGU[85B" +M/S9A<'J#22HIN845<FMZ>TDY8UM)-BU)6$US?7UR:FIB7&E>?&Q9.45-67)6 +M.6)022U9:V9-3$5C8UXV:&M6159)+T5K:FM;655)3VMP.3\_2&ML6UD_+2(P +MH=@,&IR85I%6X%/.6MR#8E\W27!F<&$I#@XM8GIZ8V!%8X)K3V-R +M9E-<@EQB9GIU?'I90BU;GIJ;GM:67)C-BDP,D0_8W)]@G9S:UA at 47)R6#9$545R:$5-/CDM37)S +M8T5$6TTP-EQP;%H_.39%8EL^86QN?'<\("U:>GIF8G=Q351L85I-7&A>+5AR;FV"9&9Z +M8#EFX9RF);639)6VMA-TMAHUV:#E,1#!I8T0@(#]IH)N?'9 at 7EEJG)F:F)-8F)@6F)J21M)84QR8_UB6EEK8&-F +MFLM%25C>FI)17-R8V-J:EEH9FMK&!(M7&YZ;#]):FYI8$UF>@-] 7(!80"O3TQO>G]@+3M> +M at GUN:V);7EIJ;%M at 6D]86DE,8#X^6W)L9E45+5PY6H.*<"4;2W #=_YC/#=C +M>EDT/DU;:6]A23966FMK1"TY6H**@FA823\M-G!P.6B*:!4^:EQO6#Y5("!$ +M6#E8GIJ +M34]RG)P9F!-7UIK:4DM,CD_:6++8G)I6G)U:"TE16-F +M>V%)36--6'!M6UI$:GMP3TUB:UMB@%J )!;1&%T;#XE*3!U at F!C:45F!&N: +M<7)K7#D_6&X^+3]::TA5-#0_-D5F<'W=A6W5[8UHM36)621(837)F +M=9**9RD.#A50 at G)B=8!A8ULO3VIK8SE8;& \&S!S at VYV>FIK:V-J:V-8/UA8 +M53]5:$TOF%913E$;'IU8DD2+6:":C]BG)OW<^8F]6*14 at 1')96GI]=S0##OXV +MFMB>FMI23([.T1:6EA>6FI:,%@V*39%;U]$2TE- +M34E,34]Q2RTV84UK8V-P/U%P+0X.+6 V.4QB:6E-16MH16VN;6IZ:SE:=V-- +M/RDI/F-:5"TYF-N9BDV17)825MQ:$D^23XG7T0M +M+4E%8FQC6EAP<40@'31>8%M;8EII-BU68#9%4&V ;SE-/S9)8FIREQ>,')J +M5C)!/"=B:V!-8&]:16I:+2 V3W=[:&!:)S#^VYL:'%F1"DK6&-C<"4=1$E) +M8FA0;FQJ84D_65IB>&YZAW!L;$]H;'=^6V$Y6W=I2V%P=UDI-D5RFI5)3(Y:G]B8GIF;T0I/VIB5C]K>F$M1%8^6FEC +M35AZ8$UC32TI/TAQ at G=F8395_G)N/T1 at 6UA08F9R:&.#7BU)2UL_.7%R:UI9 +M6$U-.4V";EIF;EYC6$0G;F V,EAW:V)B6V!H3#YI83XT8FI:3TQJ345)/TU% +M36!S>H--4XJ"8F- at 23L_ +M26F#;$DE,&M[/((.#@%6 74 _GIK6$5B>%H[/UAC86M>54M at 8$AO6#]-<&$\ +M*6EF7EIF at WUN8W=J8EEK at F-F,C96:6F!G)R:C8; +M&S8V8HIZ7FEA8_Y_=T]@6F%835I>:G)DA75:6VEO1")$<7-:15E-839$>H)B +M4$U at 6TUN7EI--BU;?V);645%6EDP2VQ>-CE$86A-35A+6$E8-C!):GIR:DL_ +M6%A@:7)A35IR:T1<:2TP=WQ;6#8K52 @5GIZ14U]>G)R;6DM545K at VM)&SYX +M>DF"&!@!1 %J /Y[;$0;,'-P64LP6W=K:7%@369)36 at _-F%$)2U965 at _6W)K +M:&%J>G P.7-W<$LM.5A;9W)C3UMI/V)Z*R M.UIV at F9K +M;E[^8D at P8TUC8%M/6F)JFE++3Y86#Y$538P'-J8EDM)4R(844@*40I&#ERFM-7G-P&RTP8X)K1!A)@XIQ at EA% 4D! +M7P#^,A at M8%@^/UA at -D5G6G)P/"5' +M at W)P2S98<&-A84E09C]:8E8Y*2E/6TU;>GG)A.4EO63]:>H)M($AS9D5B +M<$4Y6%@[>XIZ:UY51$LM)2T2&V)@-AM$23]W8UE)/UMK at 5@^8H-V>VE8-CQA +M=VD\("E4,B4M3VIF at 8-P.3YR>BL8&UM_6T0I)V*(@X*"@ %/ 4@ DFIK+2W _5G)\ +M:4U:344_:6 ^)14I25@^1&IZ%IO>CXM8FI1=4PV6#8_8&YZ?6YXFMJ +MF)W<&)I1"D2(#Q9;U0;-FE;:VQC6#E-9H-+-FJ#;GUS64E8<'-K23(T854W +M/$U96GJ$52DM6#L##OYJ +MV);/RTP<'55 +M& X;1$DM&SYN at G]4'3Q-8EYR:V9Z>G)L2S9B;G),1#9I8$1H;H)Z4%E)+2=I +MB&YU at DD26G)>3"VUNF-+/V-U84$T/DU;:6]A23DG3W6*=EQVG=)67)];GQV8%Y9:FYK6E@\16-B66Y[<$DI +M.6A))PXV:6$M1#P5&T1]D@%[ 4\ _DUL<%MA:5Q)83\@'15C8F-Z at G!826U- +M/RT\1"U(:W-R63]86%YS>V,V55YZ at FM;<5M$GI]@S8E6WIR +M6"4 at 1%A6/CM:=5Q9?_Y+*45P+5E$( XV36IB+6=W +M>G5B1$UH:DU$86]R6E9P7SY-=7IJ6S8R/VI]?6MMG!)*R!Z?V P/UYU=6YK8EM>6FIL6V!:.6AN26)Z:V9Z>FA)/UE)*0XE6FDV +M-CX5&"6"67T!@@%; /YC>G=A3V-O8VE%+3(8/SY0H(V-FN">F,[%399<%I) +M87)C1'+>8S8^:#)[<"(.+6MR;F!H:UMC:VUI2#YC>G)@/B5B=7UR33)%<&L^ +M-F)Z>V!)>W=A6W5[8UHY9DE,;H)U:F)(:VY;65E;8%@V+3DP3&MR8UY5=&P^ +M)2U):G)J8VA%9 at 1KGG%R&T5H,#EZ=5QN?7)B24]))0X826$M(AL;.458;@&# +M 7, _G)Z at GAH8W-S?&A81"D@/DU-;7IR>GIR6#=)G!@255%3$U- +MW V+6)V at GM6.T1B;T0V3')R:%AB9F]C +M;GI[=R)86"U9=72!:UIK8C):8VIK6$E<6$M88$Q9<'AA2QL8*3]C:&)F;2U) +MF%9>&99:$E%:&))6&!%8VMB6EM;;GIR:DD^3&E@:7MH.R<^ +M+2UPBH))(DU9)2U)87)B/F-]>FYH*14T8F9K;G5U:%O^8%98:7-R;FDM)5AZ +M?5Q-:V: ?6I:239-:W)R251B:WV";VAK8VM-241K8EI)8#]:3411;H,[26$V +M2V]JD]-8E4R+55Q3S@%O 4@ F4MB34QR8DAGFM5/!L@(#]A +M2#E%D]$/TEC>WU9(!M:>G=-G)K&EL=FE815MG>F]%.T1I+6!;8FIL21 at .(EI-6U4=/WI\9EI at 6& Y+5IZF-I6CLE27=U;VXV+6]K;%M0;42S)T0P&VAQ +M9D0I*TEA8V!)/D5)26)C8F-$.UAC& D8+4UN?WIN8TE+9VI><%@\1$M5/"5% +M 7(!8@#!G=:3&AA338#+?YA:G![:4UB;GMR;%IJ>FM@ +M/S]926!C:VMJ21@),EXM+2 )/W)M6DU:6%@M&T5R9DUC.T5B>%H[/UA at 8V-> +M6$M at 8$AI6TU915EP.QT=(#),G)R>FE5/SYI:#Y8 5@!4 #C<$4P +M8X!B6GN*@UD^25AA15AA3&MI6%A$%0X;@8J"=V$_-BDV88B"=7)F:T\^83]- +M<$DM/VIO-AMP at WA-.6ER6#8@&RE)3%IZA5H_7H-ZG5K3$551%A-8')Z +M:%XR/V at E PG^(F)_8$5835 at R*41J2%A:8H)O6EH^-C])24U/22DR3VMO8$0R +M-$U-13P;&S]Z=7IR1!@@6V @17)@6F at Y16!V>V(E+6A96F)6.2DI3ULY6'"# +MA8);26!88&!>H:*@W=9*0X5.8*,A'UK8$M9639);&A987%O2R5O +M>G-96&-F8#8@&"!")TENA8IKF9Z>F P)UM3'4UZ8')N@&@@ Q7^ +M(#9K@&- at 25E)-DE?1$M,68-P;&M)56%C8TD_:5P\1&-ZH)Z8$$[4& V8'=C6F V)UIUG R,#P[*R5->V)86$E@ +M241-15E%18B*;F-(25MRX')@.5!I345HFI98#9,;FMI/UYH37!U51 at .&T1)/EEJ,#=O/B)CBGQU8&-K13M$>G(V +M27-K:UH_+2LE-C!%8$0E)39J=6-A8P-9G6AJ +M9G-@& D))7"*?'UZ245C9FIJ:38M7H*&:T5)/TMF>FM:6#P8)S @#BDV/DU; +MB'IB7&MRG)8.3]L]&UR;DE;645::FM[1!4Y>H""<6-8+14;36\^88*",B =2'*">G-F S:)1')[:V-B8VQ% +M 3P!3P#^:VI>03]97V. ?6YI85M84&II-DUI6DU$2UE925E:8G)N-C0@)6*# +M at G)W6#Y/345:<"T;67U];TTR)39J at W=),DD8&" 8%2 V1!LM>WI96G!/9GQU +M63]B>UA-EIJ53Y:/!LPV]$+5EA:%Q)83\I("E) +M6V-Z at G!826UP33ENAVUB/SP at +41NAH-W8&$^-EEB15IO8X)@-@%) 6D _DUB +M=W%)13YB>G5K540V8XB 83]9/#)$1#0T25P2(&IW2&)]6F)ZG5O1%9%6'!H4%R*BF9%,B4E6&=M9G=V6#9;6V,#:*E)-#(I/CY0EI8 +M7DE526-P;S8\7F$T&"4B2&I-:U!GG*"62 !+0$^ /Y$-TQR840@)TDY.5IR:FUV>W)> +M:VA5,BT_6FIA,B5-F))6&!@:7%I24M;2V-H,$ER63)R +M/UYM.QU@?7<_&S9B9C8V<&9B6' V +M(#E?9S9-W)F:W-[26)< +M8S8I-F!:8FAQ9FZ"<3LM at 8-R3T5,8&IZ=TU-;UMJ:4]:>F8M3&MC8G)R=6MA +M7C0T-D]O:EI,=TPM36)B6E%BV9MB%D at .S9-3$UK;G9P:W)R8V$[(CEB=8-R6%A[:6]R:G=J:W!; +M8()B8@%9 5H _G5Z:%QR7FA>,%N!>V$P6FYZ?6)/36N"=UMJ.41K +M>W=A17*#=6$^/EA:;G=-36);9UM)269Q7D5(8EIBH)R6$DM/TU8-D5;3%!9WIK53P;(" _84 at Y8UMW>F)A52DM-F*%@VEB>G5V:UIC9G-P6VR":$0!80%C +M /YB9FYRW)B/UAA36IP36!;8&E;8&%>:V-A16!).4]R8U8^6&!%+45J=7)G6S\R1&MF +M8F9N8E8^-D5]?79H14]C:WAR?7A)-FAP34E)1&EO.6IZ-QM)@EO^6D]-:DQ9 +M>S _:WQZ:S!>/B=:;7(M-FEM;VA)/$UZ@&D\/&%C24AK8UY$:6%)*V-G/D5O +M24EK9AL8/W5;36EP;TA%.4=ZA7IO/TE6/S(Y6EMI36ML34]K:VYI8&)F/# ; +M/W=-+3\V8W)-15E%*1 at P;H)L:WIN>G);6$QH:6%K at G V 3X!30"O6F-!8WQ- +M-BD8,'* 9FMK=7)B9V%)65E<U\G8')':F)%6#8^;CLP7(*";#!H +M1!@E38!),&IR8EQ at 33]B.5E;24G.:%IGF!B6"TI-EIF>F-Q:V%A>'%%14U/8TM;54UZ838M)4E; +M/S<_2S8.&$5B15MR9GIR:&);66%A8W)H 3X!- #^,#X8*W=C/" 8&U![8V)B +M=7IK;VM-/S]86SXP8"DK/SX_-CEJEE(8V]RF1N&A)-DM at 6EIR>FQR84U83&=937)RGIR:6):669Z>FI8 +M1"\V8W)@:&-1@%\ /YI/"LV86M95C(8)4]K:V%:8FY^@%I)2VY[>H!C539% +M86%886EP539::V-816-S;S88)6%O/!4I/SEF at H-]GIK85@; +M#B=<:W5H/EYB;W)K7F96&T1U=69/4%M%.4E-,$1J:4\Y22T5*1 at 5.75W-C\^ +M)T=01%;^34UC<%A)3SE88G);'6M];E at I("UGBG9L:38E-FA::')Z;V=86VUW +MW5R6$E)-EMI6%MC +M35F&CG),14M:=VE+14]I:VL[("5%6&)]62LE:7!+6#\V.6EH14Q%1$Q8 at FE; +M 6,!@@"]>F at R+4U:6T]5-#0^:6]B6DU9P-C UO^66!K?7UZHZ*=6MS<%M):'1,:&UCO7)[6REC at WIR63E>56!H6UM at 65ARBGI8/$E$ +M:X)C,$]Q8WII1"D;-FEW:3\E16!%:5D\-FAK5D5622]%:UH!1 %J /YJ;T5$ +M8%IB6&$\*R4V:&E;84]C:DD;$CER>HA!37IN+2TV16EI35AI:W-R251;7G-K +M5DAP<6!!-#])3V)Q;%YC85M;8%ERA(1UG-B6EH^4(6*:D5;:F9N +M=FZ#FYJ:SXMG9R +M:3\8*6%H7F=$/S\M85M$-EQP;%H_.39%@G* 3D!/P#^:6M96VAL<6EO62TE +M($5?8&-96F\V#@DE25Y[66UZ;5M$-C]H6"TM.5R"@TQ%845C:5A667=R6E19 +M65MR>GIP8V-;3UA/>HR$=6YC239@=7MZ6&-L:45J?6(Y3&IL9FMT:6"*>DLM +M-D1N>G9R8$UH52DV36QR:FAKG5K3&)M$OX2-E9(85MF=SXM*1 at M;FEV>WQWVM6.T19:%I-9F%+*30\,CYB;UE<>FIK:V!-:DQ9>W=Z36!A +M345:;W)W86E:6F)B;&MH6%EP84]B>G6 FYZ=6M88T5-:$U@:F(V54MI:E at B +M6H-L338E8H-O/" R539KB&]A25]H6DU%/TUJ;TEC:V T8W)S@&];6%ABF!)*3!;;FMJ8EM;8&-B84D; +M'6AF9T1J at QNN$D1-1&)K7&MC6%0T+6!?7W)\@&MNW)R=WIK:F-P:3]%6E at P/T199G%)8X-K638\6WIS +M9CQ)6#8_>FY;86AP;VA8.3]<FM at 6EA:6EQ]@VDY53\=+1MB +M8CE>8UA:6$Q6-CY-+TUN?8J&?'=8-"4_4')C UO(7G9]FYC24MJ22TK&%Q8.38P6G)]@VA%,"TM8W=I +M65M::GJ!>VM/6#(M W+#84U-6#X_:&-B;6MU>F(R%2]WB'I/.5I,;VMA13YI +M8UAH>FM:2&IZ at W%%66MMG):3'-Z8TM)6%E824M%>W%L at W):24D^6G5ZH-P36%;13]@6#EB9GN(8R4)$EJ#=V Y/CMB6F%-3T]%/EI[;&-C:'J* +M;#!(>G5R13])8V)C8WJ#G=,3'!@/SEO +MG)]F)18VDM'5AA13\P8U M-C]A +M=V9B6VE@:GI]<6E%*R5-=7US8VQS8UMB:6QV=6UC7RT;6H)H15],.3]%:6!C +M:6!R;V Y6H*$:T at I/W!$37)P.3(O.5A at 6F%I23YB8VM[=69B6V%H9U9)15MB +M:F-$4')U8VMR:UMC:GK^:U9B>FM:8W)V>&!-340@*38\6WIR3&ER:EA)5G)O +M33(M/FEO8FA4*1)8*0X2+4E67VAS>G)H8F(V.45F at V P8G)K;&A), at D;:HEZ +M230M6&M>/EE%6&)W7'IQ15AR>WIS1"U$67)]=69C:$5' +M=W):7D4=@DQJ 7(!< #^;CLR6W5R:V-O-BU)6$54/E at V+4188VYR#:F9P22T[16%;6VMO;FMO:5!R +M at VU8/SE:-CYKUY%14US=G)B8$E-V-06EY\_G='8GIK6&)R=7IO6F!4*2DM.6-[FM4+2U,;TPW +M5E =240P%1@[1&!P8W)R;VMK6"T;/WAP.6)U9')R3#()&%F"=UM>6$5),&!O +M.5AA:6EB6#!::#]A24U97$UR>%M98VQZ:D0I-C9C?7%;3V V/WIN:&-9)8(M +M20%> 8@ _GMH25IR:7> =V!%3UI)8FAF+2 V15IB9FYK<#XP8EIB8EDV6WIB +M:W)R;F))14E$26-B36-C6&*"D7)L at 6@_1$5A9CE%=TA(:WIC8GYM3$DP-B4^ +M7')C6#8M.58G.7IN138I45I>:F V+6EO1$E at 8V)<9F-A7T11>GUF33M-=OY] +M1$U:3#1@:FUS=5!B8SLR(!U(G=$.7!I-A(V8#9/15AI340; +M/UXG/T1,9T1);')C22<_+1M@:P-:_F)B33(Y8G%)179]=7)816IZ:$E)+1@^54U[ +M@%!,GM@)3!P;1LV:&!9/UAR8EXI/G%5*2U)<%M9 +M3V)J:3PR3&))-I)$2S9)8V-B<$D^:4AR at GA>,"4!8P%M /YK8SPY86%::WJ# +M>&A1<'=R9U50(!@V24]98F)-8VA923!9:%9 at -AM$:TUR@&EA8$58<%E-8F-; +M/V:#:V-;:W-P83XE+6-H;VMN6EIZBG)K;%A@:6)B66IJ3&9%(")9839W>V$Y +M/F!8/TEIF-:;HEZ7F-::')F8T]<:C!@8U at V.5@^7GIR6DE:/CE:8G)Z +M:D1F at F-A1#EO9$U/;V1F;FUR_EM8)14M/#\^.7"&B&M:6F8^1&YZ:FER83\M +M/V%%7&IK4&Z AGUF8V$_)5]<)2L at +3E536IR:UY)&RUC- at D.'6IZ8W!$68A+ +M/%M:<()A.2 E/!@E6'IZ231)<6$V&!M@;$0[%2MP;G6*;F-P:VQO:$U'64DV +M,&MW6DUJ;&-97H(P-@%' 68 _F)Z6R4_:VMI8W.*?6M:3%MP8VI65#D_64U: +M=W Y6G)A:7UP-C9O;3(E/UEC9G-<8V at Y1%AB;F at M3')W:E!R>F-/6&%527)J +M=75N6UZ&@V)08F9J9G)K8W!)25!;/QM%84ECF M +M+44@%2UU at T]97WMT1"DM6V at _530_6T]F at VM/>HA[;G)925E4)15-C9,8EHP,G=R9E-<@GAZ;&YR +M6EI)3%E>)2U536!W6TP^8(" :R4)-GI]=G)B at UDP.6IZ?8IK/EEA-"DK=WY; +M83E;=VE+87!W66!@86M;6FYI,&.*AGIJ8#Y%/A at .+5]04&IF>')Q at G=S 6 ! +M50#^8%I-66%C6V-L:WUR>G9P6V)J6F%L:455/T]B:S]/7$1:GI<6%4R&R=K&A+-RD;26]@/S [*S9$&Q4;6VYF;6I;26MP:CX;)WI[159C_D5:GIF8G=Q351L>W*">V-F:5Y)4&N"8V8R-E9I:8%R +M8FJ"F-J8U5;7FZ):%A; +M9BD;16)Q24E(:%0G.5MI/"LK)1TV;W5R8VMP:FMC26)U?6<#:H%N W+^:V@\ +M$EE[8E at M)SEH8$0R&TEP8W)F/TUZ at FM>1%2 BFIC65IIG9U:DQNBG=C6TQH:U4[+5AA34DB/V]R +M9G=/-DM-;8-R9FUW33EIW)R338_+2]J +MW)B +M;&)@7V-:-BU))39SFM>.R E +M/#9;<3PE at EA- 6@!20#^.R 5+6][62 M8'-H2VAK7&9K:UR&CG),14M:=VE+ +M/TMC8VAI5C1-23 \1%ISG)@3UA)+59$.6AN:VMF?(-; +M.45K>G5K_EM89()O)2UQ:3LE245K:FM@,E9N9F)J24EA5DD_/CDV'4E:6&8I +M(%EJ?862>DDV(!@EHIZ>G=KU!/ +M:FMQ9DE%;&AJ34Q@:&A)37*"?7IM8DU8.2U5/D5 at 9UIJ8E!Z:#8M6&YZ;6MB +M3VUP/RUB@' ^/DE?6EE9-DUS;UQB3&-T3$1B62T\+4UB5DD2&$UR9G62BFG)I124V55YZ at FM; +M<5M$G* 53)89EM$67IR:EDV6&]D9F]>7TM8.4UYX):1#8M/"4Y9T0P1&-K;TTY8W!K +M6$Q:8%@E17)@=8)F45A8/B=$,#Y@:$5$6DEB8RT;/W!N9J]U>F)08"T5,&J +M7TE41456/CY%8G)R6#!-GUW- ,.N39R<7)Z +M:V)S8SXY6H!H+4QW8D08%45SH!1EM-36!$86M%3VE$/V)RF9A:6YS9C .#BUK;76"FQ965MK9G9W21M-G)L8%AK<&:"-"D!)0$G /XM3V%P?G R%0XE66!@4&]K6$5: +M;&MH6%EP84]B>G5H64E$7UM)35HV+5IK<&)B6#!$6%Y56&)98(" 6VI]:CY, +M6EYK;&%:14UR>G!A16)O6DUC63]-8FM%-D5:>GUK1" 8(%A:2W!R1TE816 M +M*RTV3%MB2SY,@%LV/TM@;EO^3WUR46 \%2U69FI;;F [(!4W7S]);' _1$5C +M;VI08V!86FIL3S9$27-S8EIL>FIF*Q(M8GIM>7IK:F\_(F!Z7%XPDDR(#9I>WG!@6#Y-9C88-FMZ'!T8#8M=8)S:VIB6EE:8VM:6G!)/V-F +M8F-CFD_.3E-VIZF9O1"D_:F)6/VMZ82U$5C9@GIRE69M at G-K/R4M8'-K6WJ2=T]C>H)U +M;@%! 1@ _E]>24%<@#DV,CYR at W)96G)U:VIO:V%%/FEC6&-S:VMN?8)W:3\_ +M8EX;)6EK=7=L83]/:DU%)3(I375[;TU%6F-;:'IB6FYC54E%8V9::G)B/TUI +M8W**AH)K:4D_6V _,D1>8#XM8X%R:5I-8&E<8$1%6%I8/S]K:U8I&SYO?/Z" +M at GIF:UMA64E%8G6&=4\G/FMS:W!R26MR64]R>FM>)S V3WJ";F!%:GIH*25C>D]$/TEC +M=W!5/SE/*1 at V<$PY6GI[G)>:W)S>VYC8EIA34]/145:<&Q;:WN#?7!86&IF(!MI.5IX +M:6)-6FM@)1LV6%I<:FA)+3Y at 6VMZWUM:&!$6EAC +M8FERAGU-("U;=6YZ at H)S:E@[/U4M+6%-4()G)55W<$596#Q)<'MO7C(E.6*" +M<&IF8E!>:TE:=6-B>FYC=S8\,CF >F,V-EIF=U4E/X)N(!M)@G!825IR<%@@ +M&S\E'6!Z=W)K;W5V=68T*RU/:45$>HII,$5\@GMV 7(!:0#^)T5P5#=K/T]< +MGMW:FIW7C(K625%<&M;8&ER<%D_ +M3WAS=VIH538M1&EL;FIB:G)B.3YL>D0G/V--6&%@669R=&YZ9E@^-D5A6F9N +M9TD^7UEK;UM%8%!U:DQ%9F9K<'IR22 _:%N"Z'5]9EQ;3#XV3VE99GUZ6B(5 +M.6)?;H.&@FM-/SQ8&RT^15EZ=S8G8&,P2U]96G-U:EI%+24O9GUR;6M/8F)@ +M6FMP=W-<:W5$7D0RF]%6F90.6%SG)$23DV6&A:8W)R=VY9/RTM8VYN8F-;:%IC<&IJ=6M/6F@^ +M:7A:;WI6& X8/&-K;&!;:G=8-F!J-A(G8H:- at CP@'2DR/D0_/S1K WJ/6#!A +M64E):7)M>F-I:4AF 7,!60#^8FMW/B!P64TY:WUZGIR;$LV8FYR3$0V:6!$:&Z">E!922TG:8AN=8)I-!@; +M2VMN()%10%R 6L _GIR?TD217!)+4QR>G%P-FEO/C!8<&,@)6AZ?6L_-C):@F]$ +M-D]O8$E))U]L/"T[254M&!TY:W E+6J"=FMC8#9%H)O3&%) +M&W!Z at X-R:V!98FA(6V-KG=S<&I at 6%5;9GU[83X^4'QP5"D8)6*%?6 at M-DQ9 +M8VQW;&]Q=7IB6&AF8V _($5H.45:@H)$/CP8"41Z>GV#>F$E&#YC.TEH;V9K>G)+8$4M/G>!;F)16G>"8U@!6@%Z +M /Z#>H9P,#EO:#]%8WIF8C]H=V$\-EIC.2UB at GUK,ALE6()Z:%A;=W-B52 V +M8$DR+6%U53PM-UMQ7C98:VMF8W!I8FU\@W-R8"D@/W)Z:C8V+0Y:G)J +M66)R6TU;9G5F.38V,%9R=7QR47!B23XI6%A$8UI:8&E>*3Y9:V_^8G)R>G)H +M5DU>7#!$@7UNX9W8%IK at FA) 40!@ #^?VMN at V!; +MFI816)P6FEF-EM6/" Y;UM% +M25AA<6@^-C!::%E/;W=F>GIR6C\8#BE::FI5&Q4526)/8FIM;4=,;G)K6DE98VE+8F]" +M*3Y6-D1ZA')$&UA9)SE-9H)]02 ^6V M(D1)/R4V:VYR:SP;)V:#@TDG +M64DI#B5G"?7-C6H)@)0$; 6 [6)I7GII8H)R5FIZ>FM$ +M8W-K3&-W:V$I(%AR-D=K7'I\G)C6ED#8OYH9EQ/:6MB9G5W6TDR$AM@>FQC8#8E6W)P246 :$U08" ;6H)K +M3U9,37!W6%IK=SXV:&))6&!%8VMB6EM;;GIR:DD^3&E@:7MH.R<^+2UPBH)) +M(DU9)2U)87)UTDE25PR%2!8:7*0 +M=V-C:VE)3VEK=79\<%]5( $. 2T _EEO7G)B8WUS35QR:UI+6&!)-B @/U9CW5<:6,V+V-V at G5C/U5)6G5\9FMJ35MC24Q_ +M=VA%6&-J8F9[+3!>1"DO15M;>G)C8DE%6FMB +M8F9[>&N"7B !%0$@ +-9DD^37)J6FMJ1#LY8H-M8D])36IL=5Q?1$1 at 3#8G6EYP:590;7)B +MW!;14E% +M6G%(:GIO+1L^6$LM*2LG640B8HIR6$188%EJ:VMB at WUCTE$ +M:&9C:EQC14DB6'IF65E%3&IF:VM8+3EB240V+1U-?V)-9H)F<6):8CNI&#M8 +M,$1)+25>:4],>X)Z:EIK

+6!;8FIL21 at .(EI-6U4=/WI\9EIM8&!<8G!X>V-?26%A8GMR7#]) +M36-G:')C 44 _F$_&S98 +M8EA9=SL.#B)B8G> :5Y5*0X at 26EC:G9I-B V:7N">FA:23\Y6V-A=W-5-#E8 +M638V539+,A)$?W);:'-K6EI;8SYS>F-F>G5C6E9)+7F*:UIB7&MK6EM).QM8 +M=7)-13]8;FEFW:!:%!A1* V25 at Y.S(8($E:.2=P +MBGQB6')Z:38Y:%HM-F-P83Y).P,EU"UA:G![:4UB;GMR;%IJ>FM@/S]926!C +M:VMJ21@),EXM+2 )/W)M5CEB8V)<.6EW>FM956EP<&I<>FA$.TM:8WIF7GIJ +M;G Y#B5B;VA9/VM@,$DM$@-)AEEI:W9R>P%W 6( _EE$(!4M;FE;8EPG#@Y6 +M36=J4&MW51@@6&!:6G)C+255GMP86%)16IP>XAO8%A at 7S8M7%I8& XE +M8$E8:WI[:UI86$EC9VMN9D]G6F-)%5E\@G)<8V)J8F!)/C1);G9-)TEB:V=F +M>FIB6D5$38!K5#)$7R(M8FV"G5K3$551%A-8')Z:%XR/V at E +M PFZ(F)_8#E?8FAH25AF.Q at M66--,%AP7AL8 +M/%EB8'=+)2 [8V-BGQS8EA$6#!$;"(P;8)Z8&-]9D5K>E at M($EZF9Z>F P)UM3'4UZ8')N@&@@ Q6Z(#9K@&-@ +M145N<$5@<5 at R26-83'>(>FM$("T_8WM at .5IK>F\\*3Y815AD8W!:8%A4,C0I +M*1(P8TP^30&" 7\ _G!9)Q at M9H-W6EM88$$5/EE)66%A:%4\1$UJ8F Y6#PT +M.45:7CP_8W)ZEHV-DER;FII5"L)%2G R,#P[*R5->V)9/SYF;SY8<&A$ +M66!C:&:#@EH^.24[6&)8-BU%+2 V6')P6SEF +M at VM@7&A%/UAH65A",C]C=T at Y3W!>16-K;G!)6%A)6%A at 33!>1#])@D0Y 6\!2 #^3#Y$ +M:%A-;GIW:VIS=VA-6TE58$U%8WIZ9F9I-BE)6$0R.UAW8V%HEE:<$]F?'59/V)[ +M6$US6EIJ'IG+25)A5\Y8DDI25M'8F9568)93P%P 5@ _F!).6-W23(_:W)F +M7FYW2$U9/F%)26%N at G!:63]A?4E+7C]H=V)@9G*#>G: FI%24E9 +M-C!<:F-R:UIJ>FMC;5D\,D1$-#1)7!(@:G=(8GU:8GIR:#Y!9CY$?V at _35EM +M at H)O7$E812 I8%IF;V!I:%0P,EIB55AA8%Z"B7(^)3PI-EA$%0X524TM1'IZ +M9RT5)VIK6F]A)39 at 8%E:34F"34L!:@%W /YR6#]:>F\I%2U96#D_=E8^6"TV +M-D]L:GIZ;3\I8G]-/VD^1')B35MN at W)C>H!G340I3'-Z:V!A6VEC:&->/UAO +M:F-C65@^245837!P6UEH65 at E.6U]A' V2V-N at GIR3TQB6"=8EI87DE5 +M26-P;VMB<'!@55EF1&!JI**;SP_1#]).Q at .#A45#C9Z>F)$-$1H65AC +M<4D^3VE66F]8 at D5) 4GIK8&!?;W!?845:;FI at 6$D_35D_ +M2$E@>V=P;V9G13EH;7IR145-8G)U>G):;%@I16Z*@G5K:G5F at G5<+1LP47IS +M33EK,C)8HS=913E86V!R"1A%;G=C8VA/>G-%3%A)5F!9H)I37J2DGI;15A88#\T.2 ."0XV at H)J24MQ at UE88VIO;TAA.3EX +M<$5% 6@!60#].6>)BGU[<&8V-EMK16AB6F V*RLT+3Y68F \26!@)25B9BTG +M1$]F>H!R8$UBX)::FA)5G*)>'5NGQN=W!C52TE(#YO6F!F:W)H22T5(%F">GUR9'(E+3]8 +M8DD[)24[1%N";E\Y*2U$5F!B:V)W +M;HJ&=6!;6%AP6EIX52 5#BEP>F-%27*&:# R8&9Z:VG!S<6%IGMW:&:L:EEA6"T2(#9) +M8T0P8FUR>FYP8#05,DE834E9;G):6!4)"2=:669:/U]F/C8#6M$Y6G)J6"=9 +M86AK8VM-241K8EI)8#\_-DEK:#X_<&IB;VA>-C8\*39;=6YC9'V"FQK +MH5[5CY96$E586)9:G]C +M38%W36%C-A at G5DURG):8W-I +M84DV=UM8-CEK7QTE8FYJ9FMW7C9$/"5,:D=::FUB7G)R:$UK=7=C<'!87E]@ +M35L^3WI]VN"6!L!-@%5 /Y%238Y6UEC=V)BH!9-D1)/R4M8GV%:SE,:38;7GIR +M:TTM1#Y:8EIQ at H)R4#XMF9I7S0@,C))6D]-9H*"=V at V'59@,BU:G)@/#Q/9X)R:@%N 6D +M_F9W=VM$(!@I3U]$6']P53Y823!)2SEBTD;&UIMBGURG=;1" = +M+59::W]V:5MA13)%7C(V=W]9*2589DE86T5F1$EH35!L;VY at 1"U836I,67MW +M>E!W;FI$-F. 9FA863PP)6-]A8EJ2S8@(#9R:C!-53L[8%M92T51>E at 5%3EK +M>F9:3&)[:SX\/SDM,&*"A7%R8U4_/F>"?6I9:.U at 36IF=7IK8$E58%E9>FIH +M8W!@-BUB:$UP=7![6V)H1&)J:VEB:&!8/SE<>G)@2V!B>H-K/R4_=7)Y:#XM6#\M +M/UM) RV08H M)U]@34^ GIJ8308(#9-:X!R:6-L +M224M/S(P:HIO.R P6FE]:3EJ;VEP6$]:6H)K23Q615 at V/FYR:UIK>GII8W)[ +M:& ^.6AM2X"*A'QR8U9454MJ8S\^6D]$8&)R:UDO658R,"=J=5Q$+3!P8CY@ +M=38)%3E[A6YB34D['3]U at G=:8_Y6-V)U;FYF;U]-8VQ/56IO6F-B-AM$:FUK +M669Q5G!K:$]J<#L.#B5)16=W3$EFABT\8VMO1&J&;6IH8V)(;T58=&!R at 6]U +M:%IG+3E::W!$34U)8&!,:UER?&=-:VMD:5H_3&9U=6I86UA+66AA1"42.6H_ +M(#E$&R=OR5!21TY;6MH3T1/>GIY>FI6:GMI,%MR22TY23(@ +M23(;86]:5FIJ34E%)TQW?89[6UI8.SEJ=8-Z9EIK>F +M-BTT8W!824\^)41$:&-U=7=[:UIK>FIB8CDB+4E%-FA?6UI::TU;:D]J:TQJ +M?75L8F-:.5YT?75L8UMC6#8M-FAR62M86F9ZG!)6%IJ +M83\I-F9B:VMI35MR>FIJ:&-C6B(P1#!->GI at .5F":W !- $_ /YI?W)K:VEB +M14UR7BDY82TM.7J*4$TY*5A6GIH1%A<+W?^8E]B:V)3>H9:/V)Z=58P +M/BD8275:/CE%>GM(4'MB6G6"6F%@ +M:&AR>WIR2V@[ +M*259=7IR6%9B8EMKBF@[+4E at 8&9Z:DQ;<'IN at 7-)/S])8%@P23\M-EAI=X!- +M1%EB:5!R;P-)_BTE+4UK;UI-8V!-:G!C65E)(D>";6YU9FI$/E9:8G5]GJ"FYC:6%@-F!J8$Q)/DE9:@-ZD6UR +MA8)C,AT.&#]K8D0^.3E? 6(!6P#^9VMB3&:"@G5RF\Y,C9)7W=R8$QJGUV8EY8*59K6V9]?6YB3$M97E8_.6N" +M6S]B8UMKE\R&SEB/BU8:FUZ +M=69UFYL8F!-6DUC/R4Y84];:&MH +M13]F:S8V6#9 at 8TDM17)Z at F=)8VIC/D1O32U)7#8P16YU;EEN>(IS7"D8(%9W +M8FAB6X)96 %- 5L _FMR85E>;GUU;H5[9EYF;U]-8VE/5FIO8&- at 6X)R138E +M.59J:U]-:FMC;UA9:$E$-EA8-B ;&U9?)2UKG)8:/YJ8V9S>WI;35A-.6.'9EQ/;2T5.6)17"4R/B451&)1>GIB;&I,27!P +M:D0R8FYW7WV%.24B/CEB86-)2&MC7D1I84DK8V!526%;6V->:38I8H!H/C]) +M544^5&AR;7)6/&)R>F at Y8C\;+5A$-C!:<6),8&Z)@&U0-BD_:&-C:$V"5EH! +M-@%( (U$:FE866)Z:UQ]>F)J W+^1%MK8S8Y8TU:8BER@&I?.S!)6EI-:'!K +M;VM83'!I6&%L8#L@%2 V53Q$64U;=V9)65MC:UAF21 at .%4E987%X6CERGUA&QM,=75J63D[*2=,6D=R8CD;&TEA2 X218)]G)C +M-BE8;H6#6F!-/"TM-C9$8V-J6EIC>GQW:%Q)7EI at 8FM),#X!.P$M /X;/F=O +M6EMF;V)M;F)B?7UF86!K;S8_22DY6C!;!:DQB;8)I*R5-W9NF-JW)R<#X;&$EZ?VY?)1 at E1X*":FA% +M22TM-C]A=V9B6VE@:GI]H- at +41+/%!P3&)H*14O:5IB:VM$($1N.QMP +M;T0M/FEC3%]8238^8EA5-C9F+14^8AT.;V1;65%N339)41;_GUF7GIF66)F:VE86$4;27)R>H-R +M6DUN>G5<.5I94$DO9X!:.5AI87!K6"TM6G)J=75]=#(.&$EJ:G=H(!M):&)Q +M=6YB:FI%8&J"@F(^6%EKH)8&!4R7G=B13 .%2UQ=7IP36 _+3]8:75] +MFH_27IZ;V)A24MI +M.4EJ>FY@*1TT/#(I7V(M7VQ:8GIZ9FY>8V!816Y at -C)8=VMJ34UK;75K36!J +M7U at M27)?+4UP8V9X23(_8V-K:FIR;5\R(#9-8GQW)0X;-F)YE4R+6MU=7)-(A5-;F@^+VN"H9K23)% +M:5Y)8#DE;^%J65IZ at U!-8%M-;EY:338M6W]B:TQ8:V)C:F9K:VIC539,6#Y% +MU at _16E:36)J9F9J5C8V/V)R;S8@&!56G56,#XR*4EJ +M7TE%6&%A64E-:&X[&TEB W*<9EQG.R 5)3E%1%QJG)_>#P5-&%>-C)J at F))+4EI6&Z#>G!A/CM@ +M46-C36)K=VI66G!W:$0M+2 ^@GIP8V-S:UM)2S\^8FIW8E at Y-EA8+45J8EE+ +M;H-]?4PV56IQ>GIB,#E64%DV%3YZ at FHM("UA1#85,GIK.4DP,$1H:#8;.?Y: +M6$1:>F,Y26A%7GMZ<3\;-GIC;EI-3$U@:UQR/S]$6F-B7TUH9D0@(#9)3UEB8DUC:%E,6FIR6#!;33F"23X!+0%6 /Y9 +M6$5-8GI[=SX=27IF>H!$%1M$<#L2.7]W-A(G8F)L at WIR<%AA?6%6/RE/:WN( +M;4E;G9VH)M($AS9G9K238B.7!F>H-J;3XR,A4.$D1F14QR;T5);C\M/G)Z:V at V34DY.S\!50%/ /Y@:UDT1&]Z>DD[ +M-DQK;&M9,C)C>E4@)6)W/R!$2$UC>GIB8E at _:G)A52LE16:">W=?7&MC<&D_ +M+6)Z at GIF=HIW230M/V)B:V)J:F)Q:"(5,BT^:F)$8W-C/T1-FA66G-K6BWH-F!B1%M:/DUR8C\V:WIK)25: +M;W)R;UXM+4E';7AN?V P1$$8#BUH5DEMGIR6&AJ +M8V9S=G5F35A-.6.'9EQ07S8E/F1F:V)<2U8Y37ER22U$>V$V&Q at M8&@#294Y +M/UE-6G=P.5IR>W=H7G!@5EI5)S\!=0%; /Y/:FQ>26%<ED[,D]R;45H8$5/GU[ +M:30T16)G;VIB;F]U>E\[/"5%-B56FD at 86QI154_3V)K/T]<WMF6!@8+4]A<'YP,EMJ;TU)1$5?:F)@676%@F)0:F)B88(R)0%8 6@ +M_FM).6MG8(%N8FIR:U!K6#(M8VIC34UO;UMA:UI-/SE:8V)@/S8R$C)63W)R +M:FM9/V%K63E)-CLR-D5C8VIF9G5W:#8V3TE;;X)-/W)R9G(_7&9BGMW-#Y-6VEO84E)36MW;FUR +M6FMR?S]X8$]NDEL":%4!+0%- +IA6#!6,A at I23Y::W)Z;TDY3&E@ +M63\R)4M: V+^:FYR>F(^/U at V-DU[:DUJ;U!S8F)R:FJ#<$E51#Y812TE17)] +M:EE::TU).5E$)UEZ6C!-:F P1'J">FIK<&$Y6G)J6"=986AK8VM-241K8EI) +M8#]:6X)R=8AK15IRG=)&V]W8#Y at 838E5F)B:RT^8VM/:HJ"6%9J at X-U<$M?7DE!8F], +M:7IP8S\I,B5%<$DM3')Z<7 \)4QZ>G@!( $E /Y6.2T^:G5VG!$/F)C:4\R&S]@:G)K +M8FMN?W)A6EL_-C9J>F)N:C]J at FIZULG.4UMB'IR6F-S:6%)-G=;6SEK3V:% +MFYZ8" 2)UMR8GMW85MU>V-:&QM;@GUR7FMR>V]B +M:$DP3&)<8F1;:W5J3UQN:V-U_GUZ8$\Y6VYP=3E, at F%8.5ARF), +M6#\M38)Z>@(^ --F5"5):&!,35Q at +3!,,B4[26-8/UAB:U]86GI]8E at I+6!P +M65IF.3(@%2EB-CY?:'%O8FMI23 [*3!-6EMK?V]:3&)R:F)B53\V.TU$8G)R +M9FIZ;P-K_F)B7E\R.R )"2UFC9%;UI$+2=/8D5KH!V@&,8&UAI-C!:@&]::$U:,&%92:I) +M:7)M>F-I:4AFVA85EIJ65ER8$0T*TM@ +M-CY/87!P8G)_:#8E,#!I6SE:>G5J5EIB9G),6$DM)S8Y8&I:8EIRF9C:EIP:FI,)38V,&+^6SEDC7]W +M.41@@XEN-BUA8V)Z$5% +MH9[12UJ +M;FM))S!WBGU]>VE>-D58+2=J:V!P9U!+8$4M/G>!;F)16G=C6%IZ>G)_21(. +M&UII;G!?.QLB86YJ.T5U?7)).5AR at H)J3P%5 40 _FFEG*25)9EM;:DU::VIK5C8G8G)R:EIC8$EJ=V _1%]U>W!C +M8TA-F)%6VIK1!@I:X)U +M?7MF:#8^:4E):4U$=8AI:W!%&R5$>X9W8%IK:$E$@(-ZAG P#A5$6WJ0;RT; +M,DEW;S8P8%YB8$D^8(!J/P%; 7< _H!)*25)8DD_.4]Z@&9A14E?52 8(%9T +M>FM$)4QL8EQ08V-F>FA$3UE-:%@I%1L_>G)F1$TY138V.TE8,%AB/UIJ7S9: +M?7IF:G)F:VIM=T0Y:EH@*41% +M3'5C/REAAVUZ8"4 at 8_YL9EEUBEE@-DQN:VD_7FA-<'552QL)#B!)34P_7T19 +M7C8P6FTM8GIR6CY,6EHE%39J9QL88'I:6G)F8V-K2R M:WIV<'=L6"DO;W!: +M:38B8HIZ:WAF.SM99X)]C\I5$1:=SXM6#8P +M65 at V,'*"<#X!+P%J /Y_FI,+3LV8H!C2S V-D^&>F-U:59%6WI;36IP4 XM6&IJ7%I)6GIU +M:U at M/&/^:V]$:H9M:FAC8DAO15AT8'*!6&8M&!A$<&]?8&MK>GI:.T5H5EIB +M5CDI*4];.1LM6F at I(FN -B=Z:VMQ8#8E+4]K>V-(:ED8%4R" +M 14!.0#^6EIW>G]R:#8;-%AU:UIW7TMH6TDI$BU:8E]F25]8-BU886)R;S8; +M/VAP/S9>7D0Y6FMR=V!A6#PI(C8G*SPM-EA1:WIR<&E@,BE$8$PP#AMKC&UJ +M8EA5-F"":TU-7B4=>FUQ>FU6-DUZ6T1F:V@@&$EZ(!4 at 66]><'MW8F=98&AK7SE$4S9):&@R+8(V80(M /XM-FEN +M at GUO025$6$Q--G):/FAO669$/UMO:F-B8V \+5AC>X-Q5"LV8'$_.6)_:$59 +M469U>6M;8$M>6#\T*QLV6$QC>G5W8ED_/#=H1"TP(%B*;6)-8V=-8G)B/UI: +M.RER=&UZ<%A%2']B/VIJ;S8;-GIZ6"U86V)06V%:5FK^:DU)12=,=WV&>UM: +M6#LY:G6#>'5\8UE4/D5866I@:V=R8F)J;W!U51 at .&T1)8C\Y7S @&UIZ21M@ +M6EM[>F]/86%%8W=>:#8@(#]Q:U9-24AZ>V!;)2!9:UA)/D4[#A at 8-#)9GIK:$UA=7)R=%@M,%9R at F$_ at BM+ 4D!+0#^,BE):G6">E4M7FA$ +M33YB3S9:<$]B;TU-GM04&-H:VMJ:E\P8G=B<$0V25I6 +M+3])+25):V-R>F$=#A at M27)R:V$_-%AK:U at E1"4M1450;8!O.4UR;%M9/RTV +M1#\_65]U=G5J5CY)/FEG.0-CHVEJ<7=B83\;-EAB6$DV.7)Z8D4_)1M;?(:* +M:$1$16EC8$E6 5\!60#8:6!8:TUK<$D=16A966-W6B _8$587T]+6GUZ9TUK +M8V9$/UQU:CE%.5IK83\\37!P:%\_35M)869%7V!,6DT_-EAF3VEB;%!;6FJ +M>F=8,BU824U?-C]$9P-R_F-DH6"F)9FYL8F!-6DUC;T1-6UM-4'!B6F--5C8@($5H:%8T,C(;*U1,:GA] +M>EG.3'*"E!9 +M6UIN at H)_:54@#B5A<$E$25A$8&QI.RU6:&9]>V)).3E8:$U8 5D!=@#^BG=/ +M8R4V5E]%8&I,:U at V6$DY8&!8/T]R>GV":#\_8VI at 23];:F!6:&!8/S]K>G)K +M3TUR at GIJ:VL_6FMK:$D\*3];8')R:E!B24EU?7V*;D])35IB3&%)&U"*BF9( +M6GIW.2TV33ECAV9<3VTM%3Y?6%AB.2 8%3EP>F]F?84Y_B4B/CEB86-)2&MC +M7D1I84DK8V=B:FMC+2UB8D]C8U at W24U:;W)H7E561#9)+3YJ;G):4&YZ=7IK +M63\V56!IVYM<%DG +A B<$M)66 _,%I[<"TV6F)R at GIP5#!)6H)@6 %9 74 + +end diff --git a/lib-python/2.2/test/output/test_MimeWriter b/lib-python/2.2/test/output/test_MimeWriter new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_MimeWriter @@ -0,0 +1,110 @@ +test_MimeWriter +From: bwarsaw at cnri.reston.va.us +Date: Mon Feb 12 17:21:48 EST 1996 +To: kss-submit at cnri.reston.va.us +MIME-Version: 1.0 +Content-Type: multipart/knowbot; + boundary="801spam999"; + version="0.1" + +This is a multi-part message in MIME format. + +--801spam999 +Content-Type: multipart/knowbot-metadata; + boundary="802spam999" + + +--802spam999 +Content-Type: message/rfc822 +KP-Metadata-Type: simple +KP-Access: read-only + +KPMD-Interpreter: python +KPMD-Interpreter-Version: 1.3 +KPMD-Owner-Name: Barry Warsaw +KPMD-Owner-Rendezvous: bwarsaw at cnri.reston.va.us +KPMD-Home-KSS: kss.cnri.reston.va.us +KPMD-Identifier: hdl://cnri.kss/my_first_knowbot +KPMD-Launch-Date: Mon Feb 12 16:39:03 EST 1996 + +--802spam999 +Content-Type: text/isl +KP-Metadata-Type: complex +KP-Metadata-Key: connection +KP-Access: read-only +KP-Connection-Description: Barry's Big Bass Business +KP-Connection-Id: B4 +KP-Connection-Direction: client + +INTERFACE Seller-1; + +TYPE Seller = OBJECT + DOCUMENTATION "A simple Seller interface to test ILU" + METHODS + price():INTEGER, + END; + +--802spam999 +Content-Type: message/external-body; + access-type="URL"; + URL="hdl://cnri.kss/generic-knowbot" + +Content-Type: text/isl +KP-Metadata-Type: complex +KP-Metadata-Key: generic-interface +KP-Access: read-only +KP-Connection-Description: Generic Interface for All Knowbots +KP-Connection-Id: generic-kp +KP-Connection-Direction: client + + +--802spam999-- + +--801spam999 +Content-Type: multipart/knowbot-code; + boundary="803spam999" + + +--803spam999 +Content-Type: text/plain +KP-Module-Name: BuyerKP + +class Buyer: + def __setup__(self, maxprice): + self._maxprice = maxprice + + def __main__(self, kos): + """Entry point upon arrival at a new KOS.""" + broker = kos.broker() + # B4 == Barry's Big Bass Business :-) + seller = broker.lookup('Seller_1.Seller', 'B4') + if seller: + price = seller.price() + print 'Seller wants $', price, '... ' + if price > self._maxprice: + print 'too much!' + else: + print "I'll take it!" + else: + print 'no seller found here' + +--803spam999-- + +--801spam999 +Content-Type: multipart/knowbot-state; + boundary="804spam999" +KP-Main-Module: main + + +--804spam999 +Content-Type: text/plain +KP-Module-Name: main + +# instantiate a buyer instance and put it in a magic place for the KOS +# to find. +__kp__ = Buyer() +__kp__.__setup__(500) + +--804spam999-- + +--801spam999-- diff --git a/lib-python/2.2/test/output/test_asynchat b/lib-python/2.2/test/output/test_asynchat new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_asynchat @@ -0,0 +1,3 @@ +test_asynchat +Connected +Received: 'hello world' diff --git a/lib-python/2.2/test/output/test_augassign b/lib-python/2.2/test/output/test_augassign new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_augassign @@ -0,0 +1,51 @@ +test_augassign +6 +[6] +6 +[1, 2, 3, 4, 1, 2, 3, 4] +[1, 2, 1, 2, 3] +1 +1 +1 +11 +1 +12 +1 +1 +13 +__add__ called +__radd__ called +__iadd__ called +__sub__ called +__rsub__ called +__isub__ called +__mul__ called +__rmul__ called +__imul__ called +__div__ called +__rdiv__ called +__idiv__ called +__floordiv__ called +__rfloordiv__ called +__ifloordiv__ called +__mod__ called +__rmod__ called +__imod__ called +__pow__ called +__rpow__ called +__ipow__ called +__or__ called +__ror__ called +__ior__ called +__and__ called +__rand__ called +__iand__ called +__xor__ called +__rxor__ called +__ixor__ called +__rshift__ called +__rrshift__ called +__irshift__ called +__lshift__ called +__rlshift__ called +__ilshift__ called diff --git a/lib-python/2.2/test/output/test_binascii b/lib-python/2.2/test/output/test_binascii new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_binascii @@ -0,0 +1,29 @@ +test_binascii +Conversion between binary data and ASCII +binascii.Error +binascii.Incomplete +a2b_base64 : (ascii) -> bin. Decode a line of base64 data +b2a_base64 : (bin) -> ascii. Base64-code line of data +a2b_hqx : ascii -> bin, done. Decode .hqx coding +b2a_hqx : Encode .hqx data +crc_hqx : (data, oldcrc) -> newcrc. Compute hqx CRC incrementally +rlecode_hqx : Binhex RLE-code binary data +rledecode_hqx : Decode hexbin RLE-coded string +a2b_uu : (ascii) -> bin. Decode a line of uuencoded data +b2a_uu : (bin) -> ascii. Uuencode line of data +base64 test +VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4NCgABAgMEBQYHCAkK +CwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJD +REVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8 +fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1 +tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u +7/Dx8vP09fb3+Pn6+/z9/v8NCkhlbGxvIHdvcmxkLgo= +uu test +M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP7V!A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>GM\?7Y_@(&"@X2% +MAH>(B8J+C(V.CY"1DI.4E9:7F)F:FYR=GI^@H:*CI*6FIZBIJJNLK:ZOL+&R +ML[2UMK>XN;J[O+V^O\#!PL/$Q<;'R,G*R\S-SL_0T=+3U-76U]C9VMOKK[.WN[_#Q\O/T]?;W^/GZ^_S]_O\-"DAE;&QO('=O 4 +2 - 2 = 0 +2 -= 2 => 0 +2 * 2 = 4 +2 *= 2 => 4 +2 / 2 = 1 +2 /= 2 => 1 +2 ** 2 = 4 +2 **= 2 => 4 +2 % 2 = 0 +2 %= 2 => 0 +2 + 4.0 = 6.0 +2 += 4.0 => 6.0 +2 - 4.0 = -2.0 +2 -= 4.0 => -2.0 +2 * 4.0 = 8.0 +2 *= 4.0 => 8.0 +2 / 4.0 = 0.5 +2 /= 4.0 => 0.5 +2 ** 4.0 = 16.0 +2 **= 4.0 => 16.0 +2 % 4.0 = 2.0 +2 %= 4.0 => 2.0 +2 + 2 = 4 +2 += 2 => 4 +2 - 2 = 0 +2 -= 2 => 0 +2 * 2 = 4 +2 *= 2 => 4 +2 / 2 = 1 +2 /= 2 => 1 +2 ** 2 = 4 +2 **= 2 => 4 +2 % 2 = 0 +2 %= 2 => 0 +2 + (2+0j) = (4+0j) +2 += (2+0j) => (4+0j) +2 - (2+0j) = 0j +2 -= (2+0j) => 0j +2 * (2+0j) = (4+0j) +2 *= (2+0j) => (4+0j) +2 / (2+0j) = (1+0j) +2 /= (2+0j) => (1+0j) +2 ** (2+0j) = (4+0j) +2 **= (2+0j) => (4+0j) +2 % (2+0j) = 0j +2 %= (2+0j) => 0j +2 + [1] ... exceptions.TypeError +2 += [1] ... exceptions.TypeError +2 - [1] ... exceptions.TypeError +2 -= [1] ... exceptions.TypeError +2 * [1] = [1, 1] +2 *= [1] => [1, 1] +2 / [1] ... exceptions.TypeError +2 /= [1] ... exceptions.TypeError +2 ** [1] ... exceptions.TypeError +2 **= [1] ... exceptions.TypeError +2 % [1] ... exceptions.TypeError +2 %= [1] ... exceptions.TypeError +2 + (2,) ... exceptions.TypeError +2 += (2,) ... exceptions.TypeError +2 - (2,) ... exceptions.TypeError +2 -= (2,) ... exceptions.TypeError +2 * (2,) = (2, 2) +2 *= (2,) => (2, 2) +2 / (2,) ... exceptions.TypeError +2 /= (2,) ... exceptions.TypeError +2 ** (2,) ... exceptions.TypeError +2 **= (2,) ... exceptions.TypeError +2 % (2,) ... exceptions.TypeError +2 %= (2,) ... exceptions.TypeError +2 + None ... exceptions.TypeError +2 += None ... exceptions.TypeError +2 - None ... exceptions.TypeError +2 -= None ... exceptions.TypeError +2 * None ... exceptions.TypeError +2 *= None ... exceptions.TypeError +2 / None ... exceptions.TypeError +2 /= None ... exceptions.TypeError +2 ** None ... exceptions.TypeError +2 **= None ... exceptions.TypeError +2 % None ... exceptions.TypeError +2 %= None ... exceptions.TypeError +2 + = 3 +2 += => 3 +2 - = 1 +2 -= => 1 +2 * = 2 +2 *= => 2 +2 / = 2 +2 /= => 2 +2 ** = 2 +2 **= => 2 +2 % = 0 +2 %= => 0 +2 + = 4 +2 += => 4 +2 - = 0 +2 -= => 0 +2 * = 4 +2 *= => 4 +2 / = 1 +2 /= => 1 +2 ** = 4 +2 **= => 4 +2 % = 0 +2 %= => 0 +4.0 + 2 = 6.0 +4.0 += 2 => 6.0 +4.0 - 2 = 2.0 +4.0 -= 2 => 2.0 +4.0 * 2 = 8.0 +4.0 *= 2 => 8.0 +4.0 / 2 = 2.0 +4.0 /= 2 => 2.0 +4.0 ** 2 = 16.0 +4.0 **= 2 => 16.0 +4.0 % 2 = 0.0 +4.0 %= 2 => 0.0 +4.0 + 4.0 = 8.0 +4.0 += 4.0 => 8.0 +4.0 - 4.0 = 0.0 +4.0 -= 4.0 => 0.0 +4.0 * 4.0 = 16.0 +4.0 *= 4.0 => 16.0 +4.0 / 4.0 = 1.0 +4.0 /= 4.0 => 1.0 +4.0 ** 4.0 = 256.0 +4.0 **= 4.0 => 256.0 +4.0 % 4.0 = 0.0 +4.0 %= 4.0 => 0.0 +4.0 + 2 = 6.0 +4.0 += 2 => 6.0 +4.0 - 2 = 2.0 +4.0 -= 2 => 2.0 +4.0 * 2 = 8.0 +4.0 *= 2 => 8.0 +4.0 / 2 = 2.0 +4.0 /= 2 => 2.0 +4.0 ** 2 = 16.0 +4.0 **= 2 => 16.0 +4.0 % 2 = 0.0 +4.0 %= 2 => 0.0 +4.0 + (2+0j) = (6+0j) +4.0 += (2+0j) => (6+0j) +4.0 - (2+0j) = (2+0j) +4.0 -= (2+0j) => (2+0j) +4.0 * (2+0j) = (8+0j) +4.0 *= (2+0j) => (8+0j) +4.0 / (2+0j) = (2+0j) +4.0 /= (2+0j) => (2+0j) +4.0 ** (2+0j) = (16+0j) +4.0 **= (2+0j) => (16+0j) +4.0 % (2+0j) = 0j +4.0 %= (2+0j) => 0j +4.0 + [1] ... exceptions.TypeError +4.0 += [1] ... exceptions.TypeError +4.0 - [1] ... exceptions.TypeError +4.0 -= [1] ... exceptions.TypeError +4.0 * [1] ... exceptions.TypeError +4.0 *= [1] ... exceptions.TypeError +4.0 / [1] ... exceptions.TypeError +4.0 /= [1] ... exceptions.TypeError +4.0 ** [1] ... exceptions.TypeError +4.0 **= [1] ... exceptions.TypeError +4.0 % [1] ... exceptions.TypeError +4.0 %= [1] ... exceptions.TypeError +4.0 + (2,) ... exceptions.TypeError +4.0 += (2,) ... exceptions.TypeError +4.0 - (2,) ... exceptions.TypeError +4.0 -= (2,) ... exceptions.TypeError +4.0 * (2,) ... exceptions.TypeError +4.0 *= (2,) ... exceptions.TypeError +4.0 / (2,) ... exceptions.TypeError +4.0 /= (2,) ... exceptions.TypeError +4.0 ** (2,) ... exceptions.TypeError +4.0 **= (2,) ... exceptions.TypeError +4.0 % (2,) ... exceptions.TypeError +4.0 %= (2,) ... exceptions.TypeError +4.0 + None ... exceptions.TypeError +4.0 += None ... exceptions.TypeError +4.0 - None ... exceptions.TypeError +4.0 -= None ... exceptions.TypeError +4.0 * None ... exceptions.TypeError +4.0 *= None ... exceptions.TypeError +4.0 / None ... exceptions.TypeError +4.0 /= None ... exceptions.TypeError +4.0 ** None ... exceptions.TypeError +4.0 **= None ... exceptions.TypeError +4.0 % None ... exceptions.TypeError +4.0 %= None ... exceptions.TypeError +4.0 + = 5.0 +4.0 += => 5.0 +4.0 - = 3.0 +4.0 -= => 3.0 +4.0 * = 4.0 +4.0 *= => 4.0 +4.0 / = 4.0 +4.0 /= => 4.0 +4.0 ** = 4.0 +4.0 **= => 4.0 +4.0 % = 0.0 +4.0 %= => 0.0 +4.0 + = 6.0 +4.0 += => 6.0 +4.0 - = 2.0 +4.0 -= => 2.0 +4.0 * = 8.0 +4.0 *= => 8.0 +4.0 / = 2.0 +4.0 /= => 2.0 +4.0 ** = 16.0 +4.0 **= => 16.0 +4.0 % = 0.0 +4.0 %= => 0.0 +2 + 2 = 4 +2 += 2 => 4 +2 - 2 = 0 +2 -= 2 => 0 +2 * 2 = 4 +2 *= 2 => 4 +2 / 2 = 1 +2 /= 2 => 1 +2 ** 2 = 4 +2 **= 2 => 4 +2 % 2 = 0 +2 %= 2 => 0 +2 + 4.0 = 6.0 +2 += 4.0 => 6.0 +2 - 4.0 = -2.0 +2 -= 4.0 => -2.0 +2 * 4.0 = 8.0 +2 *= 4.0 => 8.0 +2 / 4.0 = 0.5 +2 /= 4.0 => 0.5 +2 ** 4.0 = 16.0 +2 **= 4.0 => 16.0 +2 % 4.0 = 2.0 +2 %= 4.0 => 2.0 +2 + 2 = 4 +2 += 2 => 4 +2 - 2 = 0 +2 -= 2 => 0 +2 * 2 = 4 +2 *= 2 => 4 +2 / 2 = 1 +2 /= 2 => 1 +2 ** 2 = 4 +2 **= 2 => 4 +2 % 2 = 0 +2 %= 2 => 0 +2 + (2+0j) = (4+0j) +2 += (2+0j) => (4+0j) +2 - (2+0j) = 0j +2 -= (2+0j) => 0j +2 * (2+0j) = (4+0j) +2 *= (2+0j) => (4+0j) +2 / (2+0j) = (1+0j) +2 /= (2+0j) => (1+0j) +2 ** (2+0j) = (4+0j) +2 **= (2+0j) => (4+0j) +2 % (2+0j) = 0j +2 %= (2+0j) => 0j +2 + [1] ... exceptions.TypeError +2 += [1] ... exceptions.TypeError +2 - [1] ... exceptions.TypeError +2 -= [1] ... exceptions.TypeError +2 * [1] = [1, 1] +2 *= [1] => [1, 1] +2 / [1] ... exceptions.TypeError +2 /= [1] ... exceptions.TypeError +2 ** [1] ... exceptions.TypeError +2 **= [1] ... exceptions.TypeError +2 % [1] ... exceptions.TypeError +2 %= [1] ... exceptions.TypeError +2 + (2,) ... exceptions.TypeError +2 += (2,) ... exceptions.TypeError +2 - (2,) ... exceptions.TypeError +2 -= (2,) ... exceptions.TypeError +2 * (2,) = (2, 2) +2 *= (2,) => (2, 2) +2 / (2,) ... exceptions.TypeError +2 /= (2,) ... exceptions.TypeError +2 ** (2,) ... exceptions.TypeError +2 **= (2,) ... exceptions.TypeError +2 % (2,) ... exceptions.TypeError +2 %= (2,) ... exceptions.TypeError +2 + None ... exceptions.TypeError +2 += None ... exceptions.TypeError +2 - None ... exceptions.TypeError +2 -= None ... exceptions.TypeError +2 * None ... exceptions.TypeError +2 *= None ... exceptions.TypeError +2 / None ... exceptions.TypeError +2 /= None ... exceptions.TypeError +2 ** None ... exceptions.TypeError +2 **= None ... exceptions.TypeError +2 % None ... exceptions.TypeError +2 %= None ... exceptions.TypeError +2 + = 3 +2 += => 3 +2 - = 1 +2 -= => 1 +2 * = 2 +2 *= => 2 +2 / = 2 +2 /= => 2 +2 ** = 2 +2 **= => 2 +2 % = 0 +2 %= => 0 +2 + = 4 +2 += => 4 +2 - = 0 +2 -= => 0 +2 * = 4 +2 *= => 4 +2 / = 1 +2 /= => 1 +2 ** = 4 +2 **= => 4 +2 % = 0 +2 %= => 0 +(2+0j) + 2 = (4+0j) +(2+0j) += 2 => (4+0j) +(2+0j) - 2 = 0j +(2+0j) -= 2 => 0j +(2+0j) * 2 = (4+0j) +(2+0j) *= 2 => (4+0j) +(2+0j) / 2 = (1+0j) +(2+0j) /= 2 => (1+0j) +(2+0j) ** 2 = (4+0j) +(2+0j) **= 2 => (4+0j) +(2+0j) % 2 = 0j +(2+0j) %= 2 => 0j +(2+0j) + 4.0 = (6+0j) +(2+0j) += 4.0 => (6+0j) +(2+0j) - 4.0 = (-2+0j) +(2+0j) -= 4.0 => (-2+0j) +(2+0j) * 4.0 = (8+0j) +(2+0j) *= 4.0 => (8+0j) +(2+0j) / 4.0 = (0.5+0j) +(2+0j) /= 4.0 => (0.5+0j) +(2+0j) ** 4.0 = (16+0j) +(2+0j) **= 4.0 => (16+0j) +(2+0j) % 4.0 = (2+0j) +(2+0j) %= 4.0 => (2+0j) +(2+0j) + 2 = (4+0j) +(2+0j) += 2 => (4+0j) +(2+0j) - 2 = 0j +(2+0j) -= 2 => 0j +(2+0j) * 2 = (4+0j) +(2+0j) *= 2 => (4+0j) +(2+0j) / 2 = (1+0j) +(2+0j) /= 2 => (1+0j) +(2+0j) ** 2 = (4+0j) +(2+0j) **= 2 => (4+0j) +(2+0j) % 2 = 0j +(2+0j) %= 2 => 0j +(2+0j) + (2+0j) = (4+0j) +(2+0j) += (2+0j) => (4+0j) +(2+0j) - (2+0j) = 0j +(2+0j) -= (2+0j) => 0j +(2+0j) * (2+0j) = (4+0j) +(2+0j) *= (2+0j) => (4+0j) +(2+0j) / (2+0j) = (1+0j) +(2+0j) /= (2+0j) => (1+0j) +(2+0j) ** (2+0j) = (4+0j) +(2+0j) **= (2+0j) => (4+0j) +(2+0j) % (2+0j) = 0j +(2+0j) %= (2+0j) => 0j +(2+0j) + [1] ... exceptions.TypeError +(2+0j) += [1] ... exceptions.TypeError +(2+0j) - [1] ... exceptions.TypeError +(2+0j) -= [1] ... exceptions.TypeError +(2+0j) * [1] ... exceptions.TypeError +(2+0j) *= [1] ... exceptions.TypeError +(2+0j) / [1] ... exceptions.TypeError +(2+0j) /= [1] ... exceptions.TypeError +(2+0j) ** [1] ... exceptions.TypeError +(2+0j) **= [1] ... exceptions.TypeError +(2+0j) % [1] ... exceptions.TypeError +(2+0j) %= [1] ... exceptions.TypeError +(2+0j) + (2,) ... exceptions.TypeError +(2+0j) += (2,) ... exceptions.TypeError +(2+0j) - (2,) ... exceptions.TypeError +(2+0j) -= (2,) ... exceptions.TypeError +(2+0j) * (2,) ... exceptions.TypeError +(2+0j) *= (2,) ... exceptions.TypeError +(2+0j) / (2,) ... exceptions.TypeError +(2+0j) /= (2,) ... exceptions.TypeError +(2+0j) ** (2,) ... exceptions.TypeError +(2+0j) **= (2,) ... exceptions.TypeError +(2+0j) % (2,) ... exceptions.TypeError +(2+0j) %= (2,) ... exceptions.TypeError +(2+0j) + None ... exceptions.TypeError +(2+0j) += None ... exceptions.TypeError +(2+0j) - None ... exceptions.TypeError +(2+0j) -= None ... exceptions.TypeError +(2+0j) * None ... exceptions.TypeError +(2+0j) *= None ... exceptions.TypeError +(2+0j) / None ... exceptions.TypeError +(2+0j) /= None ... exceptions.TypeError +(2+0j) ** None ... exceptions.TypeError +(2+0j) **= None ... exceptions.TypeError +(2+0j) % None ... exceptions.TypeError +(2+0j) %= None ... exceptions.TypeError +(2+0j) + = (3+0j) +(2+0j) += => (3+0j) +(2+0j) - = (1+0j) +(2+0j) -= => (1+0j) +(2+0j) * = (2+0j) +(2+0j) *= => (2+0j) +(2+0j) / = (2+0j) +(2+0j) /= => (2+0j) +(2+0j) ** = (2+0j) +(2+0j) **= => (2+0j) +(2+0j) % = 0j +(2+0j) %= => 0j +(2+0j) + = (4+0j) +(2+0j) += => (4+0j) +(2+0j) - = 0j +(2+0j) -= => 0j +(2+0j) * = (4+0j) +(2+0j) *= => (4+0j) +(2+0j) / = (1+0j) +(2+0j) /= => (1+0j) +(2+0j) ** = (4+0j) +(2+0j) **= => (4+0j) +(2+0j) % = 0j +(2+0j) %= => 0j +[1] + 2 ... exceptions.TypeError +[1] += 2 ... exceptions.TypeError +[1] - 2 ... exceptions.TypeError +[1] -= 2 ... exceptions.TypeError +[1] * 2 = [1, 1] +[1] *= 2 => [1, 1] +[1] / 2 ... exceptions.TypeError +[1] /= 2 ... exceptions.TypeError +[1] ** 2 ... exceptions.TypeError +[1] **= 2 ... exceptions.TypeError +[1] % 2 ... exceptions.TypeError +[1] %= 2 ... exceptions.TypeError +[1] + 4.0 ... exceptions.TypeError +[1] += 4.0 ... exceptions.TypeError +[1] - 4.0 ... exceptions.TypeError +[1] -= 4.0 ... exceptions.TypeError +[1] * 4.0 ... exceptions.TypeError +[1] *= 4.0 ... exceptions.TypeError +[1] / 4.0 ... exceptions.TypeError +[1] /= 4.0 ... exceptions.TypeError +[1] ** 4.0 ... exceptions.TypeError +[1] **= 4.0 ... exceptions.TypeError +[1] % 4.0 ... exceptions.TypeError +[1] %= 4.0 ... exceptions.TypeError +[1] + 2 ... exceptions.TypeError +[1] += 2 ... exceptions.TypeError +[1] - 2 ... exceptions.TypeError +[1] -= 2 ... exceptions.TypeError +[1] * 2 = [1, 1] +[1] *= 2 => [1, 1] +[1] / 2 ... exceptions.TypeError +[1] /= 2 ... exceptions.TypeError +[1] ** 2 ... exceptions.TypeError +[1] **= 2 ... exceptions.TypeError +[1] % 2 ... exceptions.TypeError +[1] %= 2 ... exceptions.TypeError +[1] + (2+0j) ... exceptions.TypeError +[1] += (2+0j) ... exceptions.TypeError +[1] - (2+0j) ... exceptions.TypeError +[1] -= (2+0j) ... exceptions.TypeError +[1] * (2+0j) ... exceptions.TypeError +[1] *= (2+0j) ... exceptions.TypeError +[1] / (2+0j) ... exceptions.TypeError +[1] /= (2+0j) ... exceptions.TypeError +[1] ** (2+0j) ... exceptions.TypeError +[1] **= (2+0j) ... exceptions.TypeError +[1] % (2+0j) ... exceptions.TypeError +[1] %= (2+0j) ... exceptions.TypeError +[1] + [1] = [1, 1] +[1] += [1] => [1, 1] +[1] - [1] ... exceptions.TypeError +[1] -= [1] ... exceptions.TypeError +[1] * [1] ... exceptions.TypeError +[1] *= [1] ... exceptions.TypeError +[1] / [1] ... exceptions.TypeError +[1] /= [1] ... exceptions.TypeError +[1] ** [1] ... exceptions.TypeError +[1] **= [1] ... exceptions.TypeError +[1] % [1] ... exceptions.TypeError +[1] %= [1] ... exceptions.TypeError +[1] + (2,) ... exceptions.TypeError +[1] += (2,) => [1, 2] +[1] - (2,) ... exceptions.TypeError +[1] -= (2,) ... exceptions.TypeError +[1] * (2,) ... exceptions.TypeError +[1] *= (2,) ... exceptions.TypeError +[1] / (2,) ... exceptions.TypeError +[1] /= (2,) ... exceptions.TypeError +[1] ** (2,) ... exceptions.TypeError +[1] **= (2,) ... exceptions.TypeError +[1] % (2,) ... exceptions.TypeError +[1] %= (2,) ... exceptions.TypeError +[1] + None ... exceptions.TypeError +[1] += None ... exceptions.TypeError +[1] - None ... exceptions.TypeError +[1] -= None ... exceptions.TypeError +[1] * None ... exceptions.TypeError +[1] *= None ... exceptions.TypeError +[1] / None ... exceptions.TypeError +[1] /= None ... exceptions.TypeError +[1] ** None ... exceptions.TypeError +[1] **= None ... exceptions.TypeError +[1] % None ... exceptions.TypeError +[1] %= None ... exceptions.TypeError +[1] + ... exceptions.TypeError +[1] += ... exceptions.TypeError +[1] - ... exceptions.TypeError +[1] -= ... exceptions.TypeError +[1] * = [1] +[1] *= ... exceptions.TypeError +[1] / ... exceptions.TypeError +[1] /= ... exceptions.TypeError +[1] ** ... exceptions.TypeError +[1] **= ... exceptions.TypeError +[1] % ... exceptions.TypeError +[1] %= ... exceptions.TypeError +[1] + ... exceptions.TypeError +[1] += ... exceptions.TypeError +[1] - ... exceptions.TypeError +[1] -= ... exceptions.TypeError +[1] * = [1, 1] +[1] *= ... exceptions.TypeError +[1] / ... exceptions.TypeError +[1] /= ... exceptions.TypeError +[1] ** ... exceptions.TypeError +[1] **= ... exceptions.TypeError +[1] % ... exceptions.TypeError +[1] %= ... exceptions.TypeError +(2,) + 2 ... exceptions.TypeError +(2,) += 2 ... exceptions.TypeError +(2,) - 2 ... exceptions.TypeError +(2,) -= 2 ... exceptions.TypeError +(2,) * 2 = (2, 2) +(2,) *= 2 => (2, 2) +(2,) / 2 ... exceptions.TypeError +(2,) /= 2 ... exceptions.TypeError +(2,) ** 2 ... exceptions.TypeError +(2,) **= 2 ... exceptions.TypeError +(2,) % 2 ... exceptions.TypeError +(2,) %= 2 ... exceptions.TypeError +(2,) + 4.0 ... exceptions.TypeError +(2,) += 4.0 ... exceptions.TypeError +(2,) - 4.0 ... exceptions.TypeError +(2,) -= 4.0 ... exceptions.TypeError +(2,) * 4.0 ... exceptions.TypeError +(2,) *= 4.0 ... exceptions.TypeError +(2,) / 4.0 ... exceptions.TypeError +(2,) /= 4.0 ... exceptions.TypeError +(2,) ** 4.0 ... exceptions.TypeError +(2,) **= 4.0 ... exceptions.TypeError +(2,) % 4.0 ... exceptions.TypeError +(2,) %= 4.0 ... exceptions.TypeError +(2,) + 2 ... exceptions.TypeError +(2,) += 2 ... exceptions.TypeError +(2,) - 2 ... exceptions.TypeError +(2,) -= 2 ... exceptions.TypeError +(2,) * 2 = (2, 2) +(2,) *= 2 => (2, 2) +(2,) / 2 ... exceptions.TypeError +(2,) /= 2 ... exceptions.TypeError +(2,) ** 2 ... exceptions.TypeError +(2,) **= 2 ... exceptions.TypeError +(2,) % 2 ... exceptions.TypeError +(2,) %= 2 ... exceptions.TypeError +(2,) + (2+0j) ... exceptions.TypeError +(2,) += (2+0j) ... exceptions.TypeError +(2,) - (2+0j) ... exceptions.TypeError +(2,) -= (2+0j) ... exceptions.TypeError +(2,) * (2+0j) ... exceptions.TypeError +(2,) *= (2+0j) ... exceptions.TypeError +(2,) / (2+0j) ... exceptions.TypeError +(2,) /= (2+0j) ... exceptions.TypeError +(2,) ** (2+0j) ... exceptions.TypeError +(2,) **= (2+0j) ... exceptions.TypeError +(2,) % (2+0j) ... exceptions.TypeError +(2,) %= (2+0j) ... exceptions.TypeError +(2,) + [1] ... exceptions.TypeError +(2,) += [1] ... exceptions.TypeError +(2,) - [1] ... exceptions.TypeError +(2,) -= [1] ... exceptions.TypeError +(2,) * [1] ... exceptions.TypeError +(2,) *= [1] ... exceptions.TypeError +(2,) / [1] ... exceptions.TypeError +(2,) /= [1] ... exceptions.TypeError +(2,) ** [1] ... exceptions.TypeError +(2,) **= [1] ... exceptions.TypeError +(2,) % [1] ... exceptions.TypeError +(2,) %= [1] ... exceptions.TypeError +(2,) + (2,) = (2, 2) +(2,) += (2,) => (2, 2) +(2,) - (2,) ... exceptions.TypeError +(2,) -= (2,) ... exceptions.TypeError +(2,) * (2,) ... exceptions.TypeError +(2,) *= (2,) ... exceptions.TypeError +(2,) / (2,) ... exceptions.TypeError +(2,) /= (2,) ... exceptions.TypeError +(2,) ** (2,) ... exceptions.TypeError +(2,) **= (2,) ... exceptions.TypeError +(2,) % (2,) ... exceptions.TypeError +(2,) %= (2,) ... exceptions.TypeError +(2,) + None ... exceptions.TypeError +(2,) += None ... exceptions.TypeError +(2,) - None ... exceptions.TypeError +(2,) -= None ... exceptions.TypeError +(2,) * None ... exceptions.TypeError +(2,) *= None ... exceptions.TypeError +(2,) / None ... exceptions.TypeError +(2,) /= None ... exceptions.TypeError +(2,) ** None ... exceptions.TypeError +(2,) **= None ... exceptions.TypeError +(2,) % None ... exceptions.TypeError +(2,) %= None ... exceptions.TypeError +(2,) + ... exceptions.TypeError +(2,) += ... exceptions.TypeError +(2,) - ... exceptions.TypeError +(2,) -= ... exceptions.TypeError +(2,) * = (2,) +(2,) *= => (2,) +(2,) / ... exceptions.TypeError +(2,) /= ... exceptions.TypeError +(2,) ** ... exceptions.TypeError +(2,) **= ... exceptions.TypeError +(2,) % ... exceptions.TypeError +(2,) %= ... exceptions.TypeError +(2,) + ... exceptions.TypeError +(2,) += ... exceptions.TypeError +(2,) - ... exceptions.TypeError +(2,) -= ... exceptions.TypeError +(2,) * = (2, 2) +(2,) *= => (2, 2) +(2,) / ... exceptions.TypeError +(2,) /= ... exceptions.TypeError +(2,) ** ... exceptions.TypeError +(2,) **= ... exceptions.TypeError +(2,) % ... exceptions.TypeError +(2,) %= ... exceptions.TypeError +None + 2 ... exceptions.TypeError +None += 2 ... exceptions.TypeError +None - 2 ... exceptions.TypeError +None -= 2 ... exceptions.TypeError +None * 2 ... exceptions.TypeError +None *= 2 ... exceptions.TypeError +None / 2 ... exceptions.TypeError +None /= 2 ... exceptions.TypeError +None ** 2 ... exceptions.TypeError +None **= 2 ... exceptions.TypeError +None % 2 ... exceptions.TypeError +None %= 2 ... exceptions.TypeError +None + 4.0 ... exceptions.TypeError +None += 4.0 ... exceptions.TypeError +None - 4.0 ... exceptions.TypeError +None -= 4.0 ... exceptions.TypeError +None * 4.0 ... exceptions.TypeError +None *= 4.0 ... exceptions.TypeError +None / 4.0 ... exceptions.TypeError +None /= 4.0 ... exceptions.TypeError +None ** 4.0 ... exceptions.TypeError +None **= 4.0 ... exceptions.TypeError +None % 4.0 ... exceptions.TypeError +None %= 4.0 ... exceptions.TypeError +None + 2 ... exceptions.TypeError +None += 2 ... exceptions.TypeError +None - 2 ... exceptions.TypeError +None -= 2 ... exceptions.TypeError +None * 2 ... exceptions.TypeError +None *= 2 ... exceptions.TypeError +None / 2 ... exceptions.TypeError +None /= 2 ... exceptions.TypeError +None ** 2 ... exceptions.TypeError +None **= 2 ... exceptions.TypeError +None % 2 ... exceptions.TypeError +None %= 2 ... exceptions.TypeError +None + (2+0j) ... exceptions.TypeError +None += (2+0j) ... exceptions.TypeError +None - (2+0j) ... exceptions.TypeError +None -= (2+0j) ... exceptions.TypeError +None * (2+0j) ... exceptions.TypeError +None *= (2+0j) ... exceptions.TypeError +None / (2+0j) ... exceptions.TypeError +None /= (2+0j) ... exceptions.TypeError +None ** (2+0j) ... exceptions.TypeError +None **= (2+0j) ... exceptions.TypeError +None % (2+0j) ... exceptions.TypeError +None %= (2+0j) ... exceptions.TypeError +None + [1] ... exceptions.TypeError +None += [1] ... exceptions.TypeError +None - [1] ... exceptions.TypeError +None -= [1] ... exceptions.TypeError +None * [1] ... exceptions.TypeError +None *= [1] ... exceptions.TypeError +None / [1] ... exceptions.TypeError +None /= [1] ... exceptions.TypeError +None ** [1] ... exceptions.TypeError +None **= [1] ... exceptions.TypeError +None % [1] ... exceptions.TypeError +None %= [1] ... exceptions.TypeError +None + (2,) ... exceptions.TypeError +None += (2,) ... exceptions.TypeError +None - (2,) ... exceptions.TypeError +None -= (2,) ... exceptions.TypeError +None * (2,) ... exceptions.TypeError +None *= (2,) ... exceptions.TypeError +None / (2,) ... exceptions.TypeError +None /= (2,) ... exceptions.TypeError +None ** (2,) ... exceptions.TypeError +None **= (2,) ... exceptions.TypeError +None % (2,) ... exceptions.TypeError +None %= (2,) ... exceptions.TypeError +None + None ... exceptions.TypeError +None += None ... exceptions.TypeError +None - None ... exceptions.TypeError +None -= None ... exceptions.TypeError +None * None ... exceptions.TypeError +None *= None ... exceptions.TypeError +None / None ... exceptions.TypeError +None /= None ... exceptions.TypeError +None ** None ... exceptions.TypeError +None **= None ... exceptions.TypeError +None % None ... exceptions.TypeError +None %= None ... exceptions.TypeError +None + ... exceptions.TypeError +None += ... exceptions.TypeError +None - ... exceptions.TypeError +None -= ... exceptions.TypeError +None * ... exceptions.TypeError +None *= ... exceptions.TypeError +None / ... exceptions.TypeError +None /= ... exceptions.TypeError +None ** ... exceptions.TypeError +None **= ... exceptions.TypeError +None % ... exceptions.TypeError +None %= ... exceptions.TypeError +None + ... exceptions.TypeError +None += ... exceptions.TypeError +None - ... exceptions.TypeError +None -= ... exceptions.TypeError +None * ... exceptions.TypeError +None *= ... exceptions.TypeError +None / ... exceptions.TypeError +None /= ... exceptions.TypeError +None ** ... exceptions.TypeError +None **= ... exceptions.TypeError +None % ... exceptions.TypeError +None %= ... exceptions.TypeError + + 2 = 3 + += 2 => 3 + - 2 = -1 + -= 2 => -1 + * 2 = 2 + *= 2 => 2 + / 2 = 0 + /= 2 => 0 + ** 2 = 1 + **= 2 => 1 + % 2 = 1 + %= 2 => 1 + + 4.0 = 5.0 + += 4.0 => 5.0 + - 4.0 = -3.0 + -= 4.0 => -3.0 + * 4.0 = 4.0 + *= 4.0 => 4.0 + / 4.0 = 0.25 + /= 4.0 => 0.25 + ** 4.0 = 1.0 + **= 4.0 => 1.0 + % 4.0 = 1.0 + %= 4.0 => 1.0 + + 2 = 3 + += 2 => 3 + - 2 = -1 + -= 2 => -1 + * 2 = 2 + *= 2 => 2 + / 2 = 0 + /= 2 => 0 + ** 2 = 1 + **= 2 => 1 + % 2 = 1 + %= 2 => 1 + + (2+0j) = (3+0j) + += (2+0j) => (3+0j) + - (2+0j) = (-1+0j) + -= (2+0j) => (-1+0j) + * (2+0j) = (2+0j) + *= (2+0j) => (2+0j) + / (2+0j) = (0.5+0j) + /= (2+0j) => (0.5+0j) + ** (2+0j) = (1+0j) + **= (2+0j) => (1+0j) + % (2+0j) = (1+0j) + %= (2+0j) => (1+0j) + + [1] ... exceptions.TypeError + += [1] ... exceptions.TypeError + - [1] ... exceptions.TypeError + -= [1] ... exceptions.TypeError + * [1] = [1] + *= [1] => [1] + / [1] ... exceptions.TypeError + /= [1] ... exceptions.TypeError + ** [1] ... exceptions.TypeError + **= [1] ... exceptions.TypeError + % [1] ... exceptions.TypeError + %= [1] ... exceptions.TypeError + + (2,) ... exceptions.TypeError + += (2,) ... exceptions.TypeError + - (2,) ... exceptions.TypeError + -= (2,) ... exceptions.TypeError + * (2,) = (2,) + *= (2,) => (2,) + / (2,) ... exceptions.TypeError + /= (2,) ... exceptions.TypeError + ** (2,) ... exceptions.TypeError + **= (2,) ... exceptions.TypeError + % (2,) ... exceptions.TypeError + %= (2,) ... exceptions.TypeError + + None ... exceptions.TypeError + += None ... exceptions.TypeError + - None ... exceptions.TypeError + -= None ... exceptions.TypeError + * None ... exceptions.TypeError + *= None ... exceptions.TypeError + / None ... exceptions.TypeError + /= None ... exceptions.TypeError + ** None ... exceptions.TypeError + **= None ... exceptions.TypeError + % None ... exceptions.TypeError + %= None ... exceptions.TypeError + + = 2 + += => 2 + - = 0 + -= => 0 + * = 1 + *= => 1 + / = 1 + /= => 1 + ** = 1 + **= => 1 + % = 0 + %= => 0 + + = 3 + += => 3 + - = -1 + -= => -1 + * = 2 + *= => 2 + / = 0 + /= => 0 + ** = 1 + **= => 1 + % = 1 + %= => 1 + + 2 = 4 + += 2 => 4 + - 2 = 0 + -= 2 => 0 + * 2 = 4 + *= 2 => 4 + / 2 = 1 + /= 2 => 1 + ** 2 = 4 + **= 2 => 4 + % 2 = 0 + %= 2 => 0 + + 4.0 = 6.0 + += 4.0 => 6.0 + - 4.0 = -2.0 + -= 4.0 => -2.0 + * 4.0 = 8.0 + *= 4.0 => 8.0 + / 4.0 = 0.5 + /= 4.0 => 0.5 + ** 4.0 = 16.0 + **= 4.0 => 16.0 + % 4.0 = 2.0 + %= 4.0 => 2.0 + + 2 = 4 + += 2 => 4 + - 2 = 0 + -= 2 => 0 + * 2 = 4 + *= 2 => 4 + / 2 = 1 + /= 2 => 1 + ** 2 = 4 + **= 2 => 4 + % 2 = 0 + %= 2 => 0 + + (2+0j) = (4+0j) + += (2+0j) => (4+0j) + - (2+0j) = 0j + -= (2+0j) => 0j + * (2+0j) = (4+0j) + *= (2+0j) => (4+0j) + / (2+0j) = (1+0j) + /= (2+0j) => (1+0j) + ** (2+0j) = (4+0j) + **= (2+0j) => (4+0j) + % (2+0j) = 0j + %= (2+0j) => 0j + + [1] ... exceptions.TypeError + += [1] ... exceptions.TypeError + - [1] ... exceptions.TypeError + -= [1] ... exceptions.TypeError + * [1] = [1, 1] + *= [1] => [1, 1] + / [1] ... exceptions.TypeError + /= [1] ... exceptions.TypeError + ** [1] ... exceptions.TypeError + **= [1] ... exceptions.TypeError + % [1] ... exceptions.TypeError + %= [1] ... exceptions.TypeError + + (2,) ... exceptions.TypeError + += (2,) ... exceptions.TypeError + - (2,) ... exceptions.TypeError + -= (2,) ... exceptions.TypeError + * (2,) = (2, 2) + *= (2,) => (2, 2) + / (2,) ... exceptions.TypeError + /= (2,) ... exceptions.TypeError + ** (2,) ... exceptions.TypeError + **= (2,) ... exceptions.TypeError + % (2,) ... exceptions.TypeError + %= (2,) ... exceptions.TypeError + + None ... exceptions.TypeError + += None ... exceptions.TypeError + - None ... exceptions.TypeError + -= None ... exceptions.TypeError + * None ... exceptions.TypeError + *= None ... exceptions.TypeError + / None ... exceptions.TypeError + /= None ... exceptions.TypeError + ** None ... exceptions.TypeError + **= None ... exceptions.TypeError + % None ... exceptions.TypeError + %= None ... exceptions.TypeError + + = 3 + += => 3 + - = 1 + -= => 1 + * = 2 + *= => 2 + / = 2 + /= => 2 + ** = 2 + **= => 2 + % = 0 + %= => 0 + + = 4 + += => 4 + - = 0 + -= => 0 + * = 4 + *= => 4 + / = 1 + /= => 1 + ** = 4 + **= => 4 + % = 0 + %= => 0 +divmod(2, 2) = (1, 0) +divmod(2, 4.0) = (0.0, 2.0) +divmod(2, 2) = (1L, 0L) +divmod(2, (2+0j)) = ((1+0j), 0j) +divmod(2, [1]) ... exceptions.TypeError +divmod(2, (2,)) ... exceptions.TypeError +divmod(2, None) ... exceptions.TypeError +divmod(2, ) ... exceptions.TypeError +divmod(2, ) = (1, 0) +divmod(4.0, 2) = (2.0, 0.0) +divmod(4.0, 4.0) = (1.0, 0.0) +divmod(4.0, 2) = (2.0, 0.0) +divmod(4.0, (2+0j)) = ((2+0j), 0j) +divmod(4.0, [1]) ... exceptions.TypeError +divmod(4.0, (2,)) ... exceptions.TypeError +divmod(4.0, None) ... exceptions.TypeError +divmod(4.0, ) ... exceptions.TypeError +divmod(4.0, ) = (2.0, 0.0) +divmod(2, 2) = (1L, 0L) +divmod(2, 4.0) = (0.0, 2.0) +divmod(2, 2) = (1L, 0L) +divmod(2, (2+0j)) = ((1+0j), 0j) +divmod(2, [1]) ... exceptions.TypeError +divmod(2, (2,)) ... exceptions.TypeError +divmod(2, None) ... exceptions.TypeError +divmod(2, ) ... exceptions.TypeError +divmod(2, ) = (1L, 0L) +divmod((2+0j), 2) = ((1+0j), 0j) +divmod((2+0j), 4.0) = (0j, (2+0j)) +divmod((2+0j), 2) = ((1+0j), 0j) +divmod((2+0j), (2+0j)) = ((1+0j), 0j) +divmod((2+0j), [1]) ... exceptions.TypeError +divmod((2+0j), (2,)) ... exceptions.TypeError +divmod((2+0j), None) ... exceptions.TypeError +divmod((2+0j), ) ... exceptions.TypeError +divmod((2+0j), ) = ((1+0j), 0j) +divmod([1], 2) ... exceptions.TypeError +divmod([1], 4.0) ... exceptions.TypeError +divmod([1], 2) ... exceptions.TypeError +divmod([1], (2+0j)) ... exceptions.TypeError +divmod([1], [1]) ... exceptions.TypeError +divmod([1], (2,)) ... exceptions.TypeError +divmod([1], None) ... exceptions.TypeError +divmod([1], ) ... exceptions.TypeError +divmod([1], ) ... exceptions.TypeError +divmod((2,), 2) ... exceptions.TypeError +divmod((2,), 4.0) ... exceptions.TypeError +divmod((2,), 2) ... exceptions.TypeError +divmod((2,), (2+0j)) ... exceptions.TypeError +divmod((2,), [1]) ... exceptions.TypeError +divmod((2,), (2,)) ... exceptions.TypeError +divmod((2,), None) ... exceptions.TypeError +divmod((2,), ) ... exceptions.TypeError +divmod((2,), ) ... exceptions.TypeError +divmod(None, 2) ... exceptions.TypeError +divmod(None, 4.0) ... exceptions.TypeError +divmod(None, 2) ... exceptions.TypeError +divmod(None, (2+0j)) ... exceptions.TypeError +divmod(None, [1]) ... exceptions.TypeError +divmod(None, (2,)) ... exceptions.TypeError +divmod(None, None) ... exceptions.TypeError +divmod(None, ) ... exceptions.TypeError +divmod(None, ) ... exceptions.TypeError +divmod(, 2) ... exceptions.TypeError +divmod(, 4.0) ... exceptions.TypeError +divmod(, 2) ... exceptions.TypeError +divmod(, (2+0j)) ... exceptions.TypeError +divmod(, [1]) ... exceptions.TypeError +divmod(, (2,)) ... exceptions.TypeError +divmod(, None) ... exceptions.TypeError +divmod(, ) ... exceptions.TypeError +divmod(, ) ... exceptions.TypeError +divmod(, 2) = (1, 0) +divmod(, 4.0) = (0.0, 2.0) +divmod(, 2) = (1L, 0L) +divmod(, (2+0j)) = ((1+0j), 0j) +divmod(, [1]) ... exceptions.TypeError +divmod(, (2,)) ... exceptions.TypeError +divmod(, None) ... exceptions.TypeError +divmod(, ) ... exceptions.TypeError +divmod(, ) = (1, 0) diff --git a/lib-python/2.2/test/output/test_compare b/lib-python/2.2/test/output/test_compare new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_compare @@ -0,0 +1,101 @@ +test_compare +2 == 2 +2 == 2.0 +2 == 2 +2 == (2+0j) +2 != [1] +2 != (3,) +2 != None +2 != +2 == +2 == +2.0 == 2 +2.0 == 2.0 +2.0 == 2 +2.0 == (2+0j) +2.0 != [1] +2.0 != (3,) +2.0 != None +2.0 != +2.0 == +2.0 == +2 == 2 +2 == 2.0 +2 == 2 +2 == (2+0j) +2 != [1] +2 != (3,) +2 != None +2 != +2 == +2 == +(2+0j) == 2 +(2+0j) == 2.0 +(2+0j) == 2 +(2+0j) == (2+0j) +(2+0j) != [1] +(2+0j) != (3,) +(2+0j) != None +(2+0j) != +(2+0j) == +(2+0j) == +[1] != 2 +[1] != 2.0 +[1] != 2 +[1] != (2+0j) +[1] == [1] +[1] != (3,) +[1] != None +[1] != +[1] != +[1] != +(3,) != 2 +(3,) != 2.0 +(3,) != 2 +(3,) != (2+0j) +(3,) != [1] +(3,) == (3,) +(3,) != None +(3,) != +(3,) != +(3,) != +None != 2 +None != 2.0 +None != 2 +None != (2+0j) +None != [1] +None != (3,) +None == None +None != +None != +None != + != 2 + != 2.0 + != 2 + != (2+0j) + != [1] + != (3,) + != None + == + != + != + == 2 + == 2.0 + == 2 + == (2+0j) + != [1] + != (3,) + != None + != + == + == + == 2 + == 2.0 + == 2 + == (2+0j) + != [1] + != (3,) + != None + != + == + == diff --git a/lib-python/2.2/test/output/test_compile b/lib-python/2.2/test/output/test_compile new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_compile @@ -0,0 +1,7 @@ +test_compile +1 2 +1 2 +3 4 +1 2 3 +1 2 3 +2 3 4 diff --git a/lib-python/2.2/test/output/test_cookie b/lib-python/2.2/test/output/test_cookie new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_cookie @@ -0,0 +1,32 @@ +test_cookie + +Set-Cookie: chips=ahoy; +Set-Cookie: vienna=finger; + chips 'ahoy' 'ahoy' +Set-Cookie: chips=ahoy; + vienna 'finger' 'finger' +Set-Cookie: vienna=finger; + +Set-Cookie: keebler="E=mc2; L=\"Loves\"; fudge=\012;"; + keebler 'E=mc2; L="Loves"; fudge=\n;' 'E=mc2; L="Loves"; fudge=\n;' +Set-Cookie: keebler="E=mc2; L=\"Loves\"; fudge=\012;"; + +Set-Cookie: keebler=E=mc2; + keebler 'E=mc2' 'E=mc2' +Set-Cookie: keebler=E=mc2; +Set-Cookie: Customer="WILE_E_COYOTE"; Path=/acme; + + + + + + +If anything blows up after this line, it's from Cookie's doctest. diff --git a/lib-python/2.2/test/output/test_exceptions b/lib-python/2.2/test/output/test_exceptions new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_exceptions @@ -0,0 +1,52 @@ +test_exceptions +5. Built-in exceptions +spam +AttributeError +spam +EOFError +spam +IOError +spam +ImportError +spam +IndexError +spam +KeyError +spam +KeyboardInterrupt +(not testable in a script) +spam +MemoryError +(not safe to test) +spam +NameError +spam +OverflowError +spam +RuntimeError +(not used any more?) +spam +SyntaxError +'continue' not supported inside 'finally' clause +ok +'continue' not properly in loop +ok +'continue' not properly in loop +ok +spam +IndentationError +spam +TabError +spam +SystemError +(hard to reproduce) +spam +SystemExit +spam +TypeError +spam +ValueError +spam +ZeroDivisionError +spam +Exception diff --git a/lib-python/2.2/test/output/test_extcall b/lib-python/2.2/test/output/test_extcall new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_extcall @@ -0,0 +1,112 @@ +test_extcall +() {} +(1,) {} +(1, 2) {} +(1, 2, 3) {} +(1, 2, 3, 4, 5) {} +(1, 2, 3, 4, 5) {} +(1, 2, 3, 4, 5) {} +(1, 2, 3) {'a': 4, 'b': 5} +(1, 2, 3, 4, 5) {'a': 6, 'b': 7} +(1, 2, 3, 6, 7) {'a': 8, 'b': 9, 'x': 4, 'y': 5} +TypeError: g() takes at least 1 argument (0 given) +TypeError: g() takes at least 1 argument (0 given) +TypeError: g() takes at least 1 argument (0 given) +1 () {} +1 (2,) {} +1 (2, 3) {} +1 (2, 3, 4, 5) {} +0 (1, 2) {} +0 (1, 2, 3) {} +1 () {'a': 1, 'b': 2, 'c': 3, 'd': 4} +{'a': 1, 'b': 2, 'c': 3} +{'a': 1, 'b': 2, 'c': 3} +g() got multiple values for keyword argument 'x' +g() got multiple values for keyword argument 'b' +f() keywords must be strings +h() got an unexpected keyword argument 'e' +h() argument after * must be a sequence +dir() argument after * must be a sequence +NoneType object argument after * must be a sequence +h() argument after ** must be a dictionary +dir() argument after ** must be a dictionary +NoneType object argument after ** must be a dictionary +dir() got multiple values for keyword argument 'b' +3 512 1 +3 +3 +za () {} -> za() takes exactly 1 argument (0 given) +za () {'a': 'aa'} -> ok za aa B D E V a +za () {'d': 'dd'} -> za() got an unexpected keyword argument 'd' +za () {'a': 'aa', 'd': 'dd'} -> za() got an unexpected keyword argument 'd' +za () {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> za() got an unexpected keyword argument 'b' +za (1, 2) {} -> za() takes exactly 1 argument (2 given) +za (1, 2) {'a': 'aa'} -> za() takes exactly 1 non-keyword argument (2 given) +za (1, 2) {'d': 'dd'} -> za() takes exactly 1 non-keyword argument (2 given) +za (1, 2) {'a': 'aa', 'd': 'dd'} -> za() takes exactly 1 non-keyword argument (2 given) +za (1, 2) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> za() takes exactly 1 non-keyword argument (2 given) +za (1, 2, 3, 4, 5) {} -> za() takes exactly 1 argument (5 given) +za (1, 2, 3, 4, 5) {'a': 'aa'} -> za() takes exactly 1 non-keyword argument (5 given) +za (1, 2, 3, 4, 5) {'d': 'dd'} -> za() takes exactly 1 non-keyword argument (5 given) +za (1, 2, 3, 4, 5) {'a': 'aa', 'd': 'dd'} -> za() takes exactly 1 non-keyword argument (5 given) +za (1, 2, 3, 4, 5) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> za() takes exactly 1 non-keyword argument (5 given) +zade () {} -> zade() takes at least 1 argument (0 given) +zade () {'a': 'aa'} -> ok zade aa B d e V a +zade () {'d': 'dd'} -> zade() takes at least 1 non-keyword argument (0 given) +zade () {'a': 'aa', 'd': 'dd'} -> ok zade aa B dd e V d +zade () {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zade() got an unexpected keyword argument 'b' +zade (1, 2) {} -> ok zade 1 B 2 e V e +zade (1, 2) {'a': 'aa'} -> zade() got multiple values for keyword argument 'a' +zade (1, 2) {'d': 'dd'} -> zade() got multiple values for keyword argument 'd' +zade (1, 2) {'a': 'aa', 'd': 'dd'} -> zade() got multiple values for keyword argument 'a' +zade (1, 2) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zade() got multiple values for keyword argument 'a' +zade (1, 2, 3, 4, 5) {} -> zade() takes at most 3 arguments (5 given) +zade (1, 2, 3, 4, 5) {'a': 'aa'} -> zade() takes at most 3 non-keyword arguments (5 given) +zade (1, 2, 3, 4, 5) {'d': 'dd'} -> zade() takes at most 3 non-keyword arguments (5 given) +zade (1, 2, 3, 4, 5) {'a': 'aa', 'd': 'dd'} -> zade() takes at most 3 non-keyword arguments (5 given) +zade (1, 2, 3, 4, 5) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zade() takes at most 3 non-keyword arguments (5 given) +zabk () {} -> zabk() takes exactly 2 arguments (0 given) +zabk () {'a': 'aa'} -> zabk() takes exactly 2 non-keyword arguments (1 given) +zabk () {'d': 'dd'} -> zabk() takes exactly 2 non-keyword arguments (0 given) +zabk () {'a': 'aa', 'd': 'dd'} -> zabk() takes exactly 2 non-keyword arguments (1 given) +zabk () {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> ok zabk aa bb D E V {'d': 'dd', 'e': 'ee'} +zabk (1, 2) {} -> ok zabk 1 2 D E V {} +zabk (1, 2) {'a': 'aa'} -> zabk() got multiple values for keyword argument 'a' +zabk (1, 2) {'d': 'dd'} -> ok zabk 1 2 D E V {'d': 'dd'} +zabk (1, 2) {'a': 'aa', 'd': 'dd'} -> zabk() got multiple values for keyword argument 'a' +zabk (1, 2) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabk() got multiple values for keyword argument 'a' +zabk (1, 2, 3, 4, 5) {} -> zabk() takes exactly 2 arguments (5 given) +zabk (1, 2, 3, 4, 5) {'a': 'aa'} -> zabk() takes exactly 2 non-keyword arguments (5 given) +zabk (1, 2, 3, 4, 5) {'d': 'dd'} -> zabk() takes exactly 2 non-keyword arguments (5 given) +zabk (1, 2, 3, 4, 5) {'a': 'aa', 'd': 'dd'} -> zabk() takes exactly 2 non-keyword arguments (5 given) +zabk (1, 2, 3, 4, 5) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabk() takes exactly 2 non-keyword arguments (5 given) +zabdv () {} -> zabdv() takes at least 2 arguments (0 given) +zabdv () {'a': 'aa'} -> zabdv() takes at least 2 non-keyword arguments (1 given) +zabdv () {'d': 'dd'} -> zabdv() takes at least 2 non-keyword arguments (0 given) +zabdv () {'a': 'aa', 'd': 'dd'} -> zabdv() takes at least 2 non-keyword arguments (1 given) +zabdv () {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabdv() got an unexpected keyword argument 'e' +zabdv (1, 2) {} -> ok zabdv 1 2 d E () e +zabdv (1, 2) {'a': 'aa'} -> zabdv() got multiple values for keyword argument 'a' +zabdv (1, 2) {'d': 'dd'} -> ok zabdv 1 2 dd E () d +zabdv (1, 2) {'a': 'aa', 'd': 'dd'} -> zabdv() got multiple values for keyword argument 'a' +zabdv (1, 2) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabdv() got multiple values for keyword argument 'a' +zabdv (1, 2, 3, 4, 5) {} -> ok zabdv 1 2 3 E (4, 5) e +zabdv (1, 2, 3, 4, 5) {'a': 'aa'} -> zabdv() got multiple values for keyword argument 'a' +zabdv (1, 2, 3, 4, 5) {'d': 'dd'} -> zabdv() got multiple values for keyword argument 'd' +zabdv (1, 2, 3, 4, 5) {'a': 'aa', 'd': 'dd'} -> zabdv() got multiple values for keyword argument 'a' +zabdv (1, 2, 3, 4, 5) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabdv() got multiple values for keyword argument 'a' +zabdevk () {} -> zabdevk() takes at least 2 arguments (0 given) +zabdevk () {'a': 'aa'} -> zabdevk() takes at least 2 non-keyword arguments (1 given) +zabdevk () {'d': 'dd'} -> zabdevk() takes at least 2 non-keyword arguments (0 given) +zabdevk () {'a': 'aa', 'd': 'dd'} -> zabdevk() takes at least 2 non-keyword arguments (1 given) +zabdevk () {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> ok zabdevk aa bb dd ee () {} +zabdevk (1, 2) {} -> ok zabdevk 1 2 d e () {} +zabdevk (1, 2) {'a': 'aa'} -> zabdevk() got multiple values for keyword argument 'a' +zabdevk (1, 2) {'d': 'dd'} -> ok zabdevk 1 2 dd e () {} +zabdevk (1, 2) {'a': 'aa', 'd': 'dd'} -> zabdevk() got multiple values for keyword argument 'a' +zabdevk (1, 2) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabdevk() got multiple values for keyword argument 'a' +zabdevk (1, 2, 3, 4, 5) {} -> ok zabdevk 1 2 3 4 (5,) {} +zabdevk (1, 2, 3, 4, 5) {'a': 'aa'} -> zabdevk() got multiple values for keyword argument 'a' +zabdevk (1, 2, 3, 4, 5) {'d': 'dd'} -> zabdevk() got multiple values for keyword argument 'd' +zabdevk (1, 2, 3, 4, 5) {'a': 'aa', 'd': 'dd'} -> zabdevk() got multiple values for keyword argument 'a' +zabdevk (1, 2, 3, 4, 5) {'a': 'aa', 'b': 'bb', 'd': 'dd', 'e': 'ee'} -> zabdevk() got multiple values for keyword argument 'a' diff --git a/lib-python/2.2/test/output/test_frozen b/lib-python/2.2/test/output/test_frozen new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_frozen @@ -0,0 +1,4 @@ +test_frozen +Hello world... +Hello world... +Hello world... diff --git a/lib-python/2.2/test/output/test_future b/lib-python/2.2/test/output/test_future new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_future @@ -0,0 +1,9 @@ +test_future +6 +6 +2 +SyntaxError badsyntax_future3 3 +SyntaxError badsyntax_future4 3 +SyntaxError badsyntax_future5 4 +SyntaxError badsyntax_future6 3 +SyntaxError badsyntax_future7 3 diff --git a/lib-python/2.2/test/output/test_gettext b/lib-python/2.2/test/output/test_gettext new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_gettext @@ -0,0 +1,46 @@ +test_gettext +test api 1 +installing gettext +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba +fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH +trggrkg zrffntr pngnybt yvoenel. +wink wink +bacon +test api 2 +1 +gettext +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +albatross +bacon +Throatwobbler Mangrove +wink wink +Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba +fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH +trggrkg zrffntr pngnybt yvoenel. diff --git a/lib-python/2.2/test/output/test_global b/lib-python/2.2/test/output/test_global new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_global @@ -0,0 +1,5 @@ +test_global +got SyntaxError as expected +got SyntaxError as expected +got SyntaxError as expected +as expected, no SyntaxError diff --git a/lib-python/2.2/test/output/test_grammar b/lib-python/2.2/test/output/test_grammar new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_grammar @@ -0,0 +1,66 @@ +test_grammar +1. Parser +1.1 Tokens +1.1.1 Backslashes +1.1.2 Numeric literals +1.1.2.1 Plain integers +1.1.2.2 Long integers +1.1.2.3 Floating point +1.1.3 String literals +1.2 Grammar +single_input +file_input +expr_input +eval_input +funcdef +lambdef +simple_stmt +expr_stmt +print_stmt +1 2 3 +1 2 3 +1 1 1 +extended print_stmt +1 2 3 +1 2 3 +1 1 1 +hello world +del_stmt +pass_stmt +flow_stmt +break_stmt +continue_stmt +continue + try/except ok +continue + try/finally ok +testing continue and break in try/except in loop +return_stmt +raise_stmt +import_stmt +global_stmt +exec_stmt +assert_stmt +if_stmt +while_stmt +for_stmt +try_stmt +suite +test +comparison +binary mask ops +shift ops +additive ops +multiplicative ops +unary ops +selectors + +atoms +classdef +['Apple', 'Banana', 'Coco nut'] +[3, 6, 9, 12, 15] +[3, 4, 5] +[(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'), (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'), (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'), (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'), (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')] +[(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'), (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'), (5, 'Banana'), (5, 'Coconut')] +[[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]] +[0, 0, 0] +[[1, 2], [3, 4], [5, 6]] +[('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'), ('Macdonalds', 'Cheeseburger')] diff --git a/lib-python/2.2/test/output/test_httplib b/lib-python/2.2/test/output/test_httplib new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_httplib @@ -0,0 +1,10 @@ +test_httplib +reply: 'HTTP/1.1 200 Ok\n' +Text +reply: 'HTTP/1.1 400.100 Not Ok\n' +BadStatusLine raised as expected +InvalidURL raised as expected +InvalidURL raised as expected +reply: 'HTTP/1.1 200 OK\n' +header: Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme" +header: Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme" diff --git a/lib-python/2.2/test/output/test_linuxaudiodev b/lib-python/2.2/test/output/test_linuxaudiodev new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_linuxaudiodev @@ -0,0 +1,7 @@ +test_linuxaudiodev +expected rate >= 0, not -1 +expected sample size >= 0, not -2 +nchannels must be 1 or 2, not 3 +unknown audio encoding: 177 +for linear unsigned 16-bit little-endian audio, expected sample size 16, not 8 +for linear unsigned 8-bit audio, expected sample size 8, not 16 diff --git a/lib-python/2.2/test/output/test_longexp b/lib-python/2.2/test/output/test_longexp new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_longexp @@ -0,0 +1,2 @@ +test_longexp +65580 diff --git a/lib-python/2.2/test/output/test_math b/lib-python/2.2/test/output/test_math new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_math @@ -0,0 +1,26 @@ +test_math +math module, testing with eps 1e-05 +constants +acos +asin +atan +atan2 +ceil +cos +cosh +exp +fabs +floor +fmod +frexp +hypot +ldexp +log +log10 +modf +pow +sin +sinh +sqrt +tan +tanh diff --git a/lib-python/2.2/test/output/test_md5 b/lib-python/2.2/test/output/test_md5 new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_md5 @@ -0,0 +1,9 @@ +test_md5 +MD5 test suite: +MD5 ("") = d41d8cd98f00b204e9800998ecf8427e +MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 +MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 +MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 +MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b +MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f +MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a diff --git a/lib-python/2.2/test/output/test_mimetools b/lib-python/2.2/test/output/test_mimetools new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_mimetools @@ -0,0 +1,5 @@ +test_mimetools +7bit PASS +8bit PASS +base64 PASS +quoted-printable PASS diff --git a/lib-python/2.2/test/output/test_mmap b/lib-python/2.2/test/output/test_mmap new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_mmap @@ -0,0 +1,34 @@ +test_mmap + + Position of foo: 1.0 pages + Length of file: 2.0 pages + Contents of byte 0: '\x00' + Contents of first 3 bytes: '\x00\x00\x00' + + Modifying file's content... + Contents of byte 0: '3' + Contents of first 3 bytes: '3\x00\x00' + Contents of second page: '\x00foobar\x00' + Regex match on mmap (page start, length of match): 1.0 6 + Seek to zeroth byte + Seek to 42nd byte + Seek to last byte + Try to seek to negative position... + Try to seek beyond end of mmap... + Try to seek to negative position... + Attempting resize() + Creating 10 byte test data file. + Opening mmap with access=ACCESS_READ + Ensuring that readonly mmap can't be slice assigned. + Ensuring that readonly mmap can't be item assigned. + Ensuring that readonly mmap can't be write() to. + Ensuring that readonly mmap can't be write_byte() to. + Ensuring that readonly mmap can't be resized. + Opening mmap with size too big + Opening mmap with access=ACCESS_WRITE + Modifying write-through memory map. + Opening mmap with access=ACCESS_COPY + Modifying copy-on-write memory map. + Ensuring copy-on-write maps cannot be resized. + Ensuring invalid access parameter raises exception. + Test passed diff --git a/lib-python/2.2/test/output/test_new b/lib-python/2.2/test/output/test_new new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_new @@ -0,0 +1,7 @@ +test_new +new.module() +new.classobj() +new.instance() +new.instancemethod() +new.function() +new.code() diff --git a/lib-python/2.2/test/output/test_nis b/lib-python/2.2/test/output/test_nis new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_nis @@ -0,0 +1,2 @@ +test_nis +nis.maps() diff --git a/lib-python/2.2/test/output/test_opcodes b/lib-python/2.2/test/output/test_opcodes new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_opcodes @@ -0,0 +1,6 @@ +test_opcodes +2. Opcodes +XXX Not yet fully implemented +2.1 try inside for loop +2.2 raise class exceptions +2.3 comparing function objects diff --git a/lib-python/2.2/test/output/test_openpty b/lib-python/2.2/test/output/test_openpty new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_openpty @@ -0,0 +1,2 @@ +test_openpty +Ping! diff --git a/lib-python/2.2/test/output/test_operations b/lib-python/2.2/test/output/test_operations new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_operations @@ -0,0 +1,6 @@ +test_operations +3. Operations +XXX Mostly not yet implemented +3.1 Dictionary lookups succeed even if __cmp__() raises an exception +raising error +No exception passed through. diff --git a/lib-python/2.2/test/output/test_pkg b/lib-python/2.2/test/output/test_pkg new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_pkg @@ -0,0 +1,45 @@ +test_pkg +running test t1 +running test t2 +t2 loading +doc for t2 +t2.sub.subsub loading +t2 t2.sub t2.sub.subsub +['sub', 't2'] +t2.sub t2.sub.subsub +t2.sub.subsub +['spam', 'sub', 'subsub', 't2'] +t2 t2.sub t2.sub.subsub +['spam', 'sub', 'subsub', 't2'] +running test t3 +t3 loading +t3.sub.subsub loading +t3 t3.sub t3.sub.subsub +t3 loading +t3.sub.subsub loading +running test t4 +t4 loading +t4.sub.subsub loading +t4.sub.subsub.spam = 1 +running test t5 +t5.foo loading +t5.string loading +1 +['foo', 'string', 't5'] +['__doc__', '__file__', '__name__', '__path__', 'foo', 'string', 't5'] +['__doc__', '__file__', '__name__', 'string'] +['__doc__', '__file__', '__name__', 'spam'] +running test t6 +['__all__', '__doc__', '__file__', '__name__', '__path__'] +t6.spam loading +t6.ham loading +t6.eggs loading +['__all__', '__doc__', '__file__', '__name__', '__path__', 'eggs', 'ham', 'spam'] +['eggs', 'ham', 'spam', 't6'] +running test t7 +t7 loading +['__doc__', '__file__', '__name__', '__path__'] +['__doc__', '__file__', '__name__', '__path__'] +t7.sub.subsub loading +['__doc__', '__file__', '__name__', '__path__', 'spam'] +t7.sub.subsub.spam = 1 diff --git a/lib-python/2.2/test/output/test_poll b/lib-python/2.2/test/output/test_poll new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_poll @@ -0,0 +1,17 @@ +test_poll +Running poll test 1 + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. + This is a test. +Poll test 1 complete +Running poll test 2 +Poll test 2 complete diff --git a/lib-python/2.2/test/output/test_popen2 b/lib-python/2.2/test/output/test_popen2 new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_popen2 @@ -0,0 +1,9 @@ +test_popen2 +Test popen2 module: +testing popen2... +testing popen3... +All OK +Testing os module: +testing popen2... +testing popen3... +All OK diff --git a/lib-python/2.2/test/output/test_posixpath b/lib-python/2.2/test/output/test_posixpath new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_posixpath @@ -0,0 +1,2 @@ +test_posixpath +No errors. Thank your lucky stars. diff --git a/lib-python/2.2/test/output/test_pow b/lib-python/2.2/test/output/test_pow new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_pow @@ -0,0 +1,25 @@ +test_pow +Testing integer mode... + Testing 2-argument pow() function... + Testing 3-argument pow() function... +Testing long integer mode... + Testing 2-argument pow() function... + Testing 3-argument pow() function... +Testing floating point mode... + Testing 3-argument pow() function... +The number in both columns should match. +3 3 +-5 -5 +-1 -1 +5 5 +-3 -3 +-7 -7 + +3L 3L +-5L -5L +-1L -1L +5L 5L +-3L -3L +-7L -7L + + diff --git a/lib-python/2.2/test/output/test_profile b/lib-python/2.2/test/output/test_profile new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_profile @@ -0,0 +1,17 @@ +test_profile + 53 function calls in 1.000 CPU seconds + + Ordered by: standard name + + ncalls tottime percall cumtime percall filename:lineno(function) + 1 0.000 0.000 1.000 1.000 :1(?) + 0 0.000 0.000 profile:0(profiler) + 1 0.000 0.000 1.000 1.000 profile:0(testfunc()) + 1 0.400 0.400 1.000 1.000 test_profile.py:21(testfunc) + 2 0.080 0.040 0.600 0.300 test_profile.py:30(helper) + 4 0.116 0.029 0.120 0.030 test_profile.py:48(helper1) + 8 0.312 0.039 0.400 0.050 test_profile.py:56(helper2) + 8 0.064 0.008 0.080 0.010 test_profile.py:66(subhelper) + 28 0.028 0.001 0.028 0.001 test_profile.py:78(__getattr__) + + diff --git a/lib-python/2.2/test/output/test_pty b/lib-python/2.2/test/output/test_pty new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_pty @@ -0,0 +1,3 @@ +test_pty +I wish to buy a fish license. +For my pet fish, Eric. diff --git a/lib-python/2.2/test/output/test_pwd b/lib-python/2.2/test/output/test_pwd new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_pwd @@ -0,0 +1,7 @@ +test_pwd +pwd.getpwall() +pwd.getpwuid() +pwd.getpwnam() +name matches uid +caught expected exception +caught expected exception diff --git a/lib-python/2.2/test/output/test_pyexpat b/lib-python/2.2/test/output/test_pyexpat new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_pyexpat @@ -0,0 +1,110 @@ +test_pyexpat +OK. +OK. +OK. +OK. +OK. +OK. +OK. +OK. +OK. +OK. +OK. +OK. +PI: + 'xml-stylesheet' 'href="stylesheet.css"' +Comment: + ' comment data ' +Notation declared: ('notation', None, 'notation.jpeg', None) +Unparsed entity decl: + ('unparsed_entity', None, 'entity.file', None, 'notation') +Start element: + 'root' {'attr1': 'value1', 'attr2': 'value2\xe1\xbd\x80'} +NS decl: + 'myns' 'http://www.python.org/namespace' +Start element: + 'http://www.python.org/namespace!subelement' {} +Character data: + 'Contents of subelements' +End element: + 'http://www.python.org/namespace!subelement' +End of NS decl: + 'myns' +Start element: + 'sub2' {} +Start of CDATA section +Character data: + 'contents of CDATA section' +End of CDATA section +End element: + 'sub2' +External entity ref: (None, 'entity.file', None) +End element: + 'root' +PI: + u'xml-stylesheet' u'href="stylesheet.css"' +Comment: + u' comment data ' +Notation declared: (u'notation', None, u'notation.jpeg', None) +Unparsed entity decl: + (u'unparsed_entity', None, u'entity.file', None, u'notation') +Start element: + u'root' {u'attr1': u'value1', u'attr2': u'value2\u1f40'} +NS decl: + u'myns' u'http://www.python.org/namespace' +Start element: + u'http://www.python.org/namespace!subelement' {} +Character data: + u'Contents of subelements' +End element: + u'http://www.python.org/namespace!subelement' +End of NS decl: + u'myns' +Start element: + u'sub2' {} +Start of CDATA section +Character data: + u'contents of CDATA section' +End of CDATA section +End element: + u'sub2' +External entity ref: (None, u'entity.file', None) +End element: + u'root' +PI: + u'xml-stylesheet' u'href="stylesheet.css"' +Comment: + u' comment data ' +Notation declared: (u'notation', None, u'notation.jpeg', None) +Unparsed entity decl: + (u'unparsed_entity', None, u'entity.file', None, u'notation') +Start element: + u'root' {u'attr1': u'value1', u'attr2': u'value2\u1f40'} +NS decl: + u'myns' u'http://www.python.org/namespace' +Start element: + u'http://www.python.org/namespace!subelement' {} +Character data: + u'Contents of subelements' +End element: + u'http://www.python.org/namespace!subelement' +End of NS decl: + u'myns' +Start element: + u'sub2' {} +Start of CDATA section +Character data: + u'contents of CDATA section' +End of CDATA section +End element: + u'sub2' +External entity ref: (None, u'entity.file', None) +End element: + u'root' + +Testing constructor for proper handling of namespace_separator values: +Legal values tested o.k. +Caught expected TypeError: +ParserCreate() argument 2 must be string or None, not int +Caught expected ValueError: +namespace_separator must be at most one character, omitted, or None diff --git a/lib-python/2.2/test/output/test_re b/lib-python/2.2/test/output/test_re new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_re @@ -0,0 +1,2 @@ +test_re +maximum recursion limit exceeded diff --git a/lib-python/2.2/test/output/test_regex b/lib-python/2.2/test/output/test_regex new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_regex @@ -0,0 +1,29 @@ +test_regex +no match: -1 +successful search: 6 +caught expected exception +failed awk syntax: -1 +successful awk syntax: 2 +failed awk syntax: -1 +matching with group names and compile() +-1 +caught expected exception +matching with group names and symcomp() +7 +801 999 +801 +('801', '999') +('801', '999') +realpat: \([0-9]+\) *\([0-9]+\) +groupindex: {'one': 1, 'two': 2} +not case folded search: -1 +case folded search: 6 +__members__: ['last', 'regs', 'translate', 'groupindex', 'realpat', 'givenpat'] +regs: ((6, 11), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1), (-1, -1)) +last: HELLO WORLD +translate: 256 +givenpat: world +match with pos: -1 +search with pos: 18 +bogus group: ('world', None, None) +no name: caught expected exception diff --git a/lib-python/2.2/test/output/test_rgbimg b/lib-python/2.2/test/output/test_rgbimg new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_rgbimg @@ -0,0 +1,2 @@ +test_rgbimg +RGBimg test suite: diff --git a/lib-python/2.2/test/output/test_richcmp b/lib-python/2.2/test/output/test_richcmp new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_richcmp @@ -0,0 +1,187 @@ +test_richcmp + +operator: < + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 1 | 1 | +Number(1) | 0 | 0 | 1 | +Number(2) | 0 | 0 | 0 | +----------+-----------+-----------+-----------+- + +operator: <= + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 1 | 1 | +Number(1) | 0 | 1 | 1 | +Number(2) | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: == + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 0 | 0 | +Number(1) | 0 | 1 | 0 | +Number(2) | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: != + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 1 | 1 | +Number(1) | 1 | 0 | 1 | +Number(2) | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: > + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 0 | 0 | +Number(1) | 1 | 0 | 0 | +Number(2) | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: >= + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 0 | 0 | +Number(1) | 1 | 1 | 0 | +Number(2) | 1 | 1 | 1 | +----------+-----------+-----------+-----------+- + +************************************************** + +operator: < + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 0 | 1 | 1 | + 1 | 0 | 0 | 1 | + 2 | 0 | 0 | 0 | +----------+-----------+-----------+-----------+- + +operator: <= + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 1 | 1 | 1 | + 1 | 0 | 1 | 1 | + 2 | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: == + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 1 | 0 | 0 | + 1 | 0 | 1 | 0 | + 2 | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: != + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 0 | 1 | 1 | + 1 | 1 | 0 | 1 | + 2 | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: > + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 0 | 0 | 0 | + 1 | 1 | 0 | 0 | + 2 | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: >= + + | Number(0) | Number(1) | Number(2) | +----------+-----------+-----------+-----------+- + 0 | 1 | 0 | 0 | + 1 | 1 | 1 | 0 | + 2 | 1 | 1 | 1 | +----------+-----------+-----------+-----------+- + +************************************************** + +operator: < + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 1 | 1 | +Number(1) | 0 | 0 | 1 | +Number(2) | 0 | 0 | 0 | +----------+-----------+-----------+-----------+- + +operator: <= + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 1 | 1 | +Number(1) | 0 | 1 | 1 | +Number(2) | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: == + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 0 | 0 | +Number(1) | 0 | 1 | 0 | +Number(2) | 0 | 0 | 1 | +----------+-----------+-----------+-----------+- + +operator: != + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 1 | 1 | +Number(1) | 1 | 0 | 1 | +Number(2) | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: > + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 0 | 0 | 0 | +Number(1) | 1 | 0 | 0 | +Number(2) | 1 | 1 | 0 | +----------+-----------+-----------+-----------+- + +operator: >= + + | 0 | 1 | 2 | +----------+-----------+-----------+-----------+- +Number(0) | 1 | 0 | 0 | +Number(1) | 1 | 1 | 0 | +Number(2) | 1 | 1 | 1 | +----------+-----------+-----------+-----------+- + +************************************************** +Vector([0, 1, 2, 3, 4]) < Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 0, 0, 0]) +Vector([0, 1, 2, 3, 4]) < [2, 2, 2, 2, 2] -> Vector([1, 1, 0, 0, 0]) + [0, 1, 2, 3, 4] < Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 0, 0, 0]) +Vector([0, 1, 2, 3, 4]) <= Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 1, 0, 0]) +Vector([0, 1, 2, 3, 4]) <= [2, 2, 2, 2, 2] -> Vector([1, 1, 1, 0, 0]) + [0, 1, 2, 3, 4] <= Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 1, 0, 0]) +Vector([0, 1, 2, 3, 4]) == Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 1, 0, 0]) +Vector([0, 1, 2, 3, 4]) == [2, 2, 2, 2, 2] -> Vector([0, 0, 1, 0, 0]) + [0, 1, 2, 3, 4] == Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 1, 0, 0]) +Vector([0, 1, 2, 3, 4]) != Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 0, 1, 1]) +Vector([0, 1, 2, 3, 4]) != [2, 2, 2, 2, 2] -> Vector([1, 1, 0, 1, 1]) + [0, 1, 2, 3, 4] != Vector([2, 2, 2, 2, 2]) -> Vector([1, 1, 0, 1, 1]) +Vector([0, 1, 2, 3, 4]) > Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 0, 1, 1]) +Vector([0, 1, 2, 3, 4]) > [2, 2, 2, 2, 2] -> Vector([0, 0, 0, 1, 1]) + [0, 1, 2, 3, 4] > Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 0, 1, 1]) +Vector([0, 1, 2, 3, 4]) >= Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 1, 1, 1]) +Vector([0, 1, 2, 3, 4]) >= [2, 2, 2, 2, 2] -> Vector([0, 0, 1, 1, 1]) + [0, 1, 2, 3, 4] >= Vector([2, 2, 2, 2, 2]) -> Vector([0, 0, 1, 1, 1]) diff --git a/lib-python/2.2/test/output/test_rotor b/lib-python/2.2/test/output/test_rotor new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_rotor @@ -0,0 +1,5 @@ +test_rotor +'\xb5q\x90\xa3\xe8IT\xd1\x07\xda\x1d\xdc\xdf' +'\x1b>k(\x1f\x8a,\x81\xcb\x9f\xe2' +spam and eggs +cheese shop diff --git a/lib-python/2.2/test/output/test_sax b/lib-python/2.2/test/output/test_sax new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_sax @@ -0,0 +1,42 @@ +test_sax +Passed test_attrs_empty +Passed test_attrs_wattr +Passed test_double_quoteattr +Passed test_escape_all +Passed test_escape_basic +Passed test_escape_extra +Passed test_expat_attrs_empty +Passed test_expat_attrs_wattr +Passed test_expat_dtdhandler +Passed test_expat_entityresolver +Passed test_expat_file +Passed test_expat_incomplete +Passed test_expat_incremental +Passed test_expat_incremental_reset +Passed test_expat_inpsource_filename +Passed test_expat_inpsource_location +Passed test_expat_inpsource_stream +Passed test_expat_inpsource_sysid +Passed test_expat_locator_noinfo +Passed test_expat_locator_withinfo +Passed test_expat_nsattrs_empty +Passed test_expat_nsattrs_wattr +Passed test_expat_nsdecl_pair_diff +Passed test_expat_nsdecl_pair_same +Passed test_expat_nsdecl_single +Passed test_filter_basic +Passed test_make_parser +Passed test_make_parser2 +Passed test_nsattrs_empty +Passed test_nsattrs_wattr +Passed test_quoteattr_basic +Passed test_single_double_quoteattr +Passed test_single_quoteattr +Passed test_xmlgen_attr_escape +Passed test_xmlgen_basic +Passed test_xmlgen_content +Passed test_xmlgen_content_escape +Passed test_xmlgen_ignorable +Passed test_xmlgen_ns +Passed test_xmlgen_pi +40 tests, 0 failures diff --git a/lib-python/2.2/test/output/test_scope b/lib-python/2.2/test/output/test_scope new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_scope @@ -0,0 +1,24 @@ +test_scope +1. simple nesting +2. extra nesting +3. simple nesting + rebinding +4. nesting with global but no free +5. nesting through class +6. nesting plus free ref to global +7. nearest enclosing scope +8. mixed freevars and cellvars +9. free variable in method +10. recursion +11. unoptimized namespaces +12. lambdas +13. UnboundLocal +14. complex definitions +15. scope of global statements +16. check leaks +17. class and global +18. verify that locals() works +19. var is bound and free in class +20. interaction with trace function +20. eval and exec with free variables +21. list comprehension with local variables +22. eval with free variables diff --git a/lib-python/2.2/test/output/test_signal b/lib-python/2.2/test/output/test_signal new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_signal @@ -0,0 +1,2 @@ +test_signal +starting pause() loop... diff --git a/lib-python/2.2/test/output/test_socket b/lib-python/2.2/test/output/test_socket new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_socket @@ -0,0 +1,2 @@ +test_socket +socket.error diff --git a/lib-python/2.2/test/output/test_string b/lib-python/2.2/test/output/test_string new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_string @@ -0,0 +1,3 @@ +test_string +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/lib-python/2.2/test/output/test_thread b/lib-python/2.2/test/output/test_thread new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_thread @@ -0,0 +1,6 @@ +test_thread +waiting for all tasks to complete +all tasks done + +*** Barrier Test *** +all tasks done diff --git a/lib-python/2.2/test/output/test_threadedtempfile b/lib-python/2.2/test/output/test_threadedtempfile new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_threadedtempfile @@ -0,0 +1,5 @@ +test_threadedtempfile +Creating +Starting +Reaping +Done: errors 0 ok 1000 diff --git a/lib-python/2.2/test/output/test_tokenize b/lib-python/2.2/test/output/test_tokenize new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_tokenize @@ -0,0 +1,648 @@ +test_tokenize +1,0-1,35: COMMENT "# Tests for the 'tokenize' module.\n" +2,0-2,43: COMMENT '# Large bits stolen from test_grammar.py. \n' +3,0-3,1: NL '\n' +4,0-4,11: COMMENT '# Comments\n' +5,0-5,3: STRING '"#"' +5,3-5,4: NEWLINE '\n' +6,0-6,3: COMMENT "#'\n" +7,0-7,3: COMMENT '#"\n' +8,0-8,3: COMMENT '#\\\n' +9,7-9,9: COMMENT '#\n' +10,4-10,10: COMMENT '# abc\n' +11,0-12,4: STRING "'''#\n#'''" +12,4-12,5: NEWLINE '\n' +13,0-13,1: NL '\n' +14,0-14,1: NAME 'x' +14,2-14,3: OP '=' +14,4-14,5: NUMBER '1' +14,7-14,8: COMMENT '#' +14,8-14,9: NEWLINE '\n' +15,0-15,1: NL '\n' +16,0-16,25: COMMENT '# Balancing continuation\n' +17,0-17,1: NL '\n' +18,0-18,1: NAME 'a' +18,2-18,3: OP '=' +18,4-18,5: OP '(' +18,5-18,6: NUMBER '3' +18,6-18,7: OP ',' +18,8-18,9: NUMBER '4' +18,9-18,10: OP ',' +18,10-18,11: NL '\n' +19,2-19,3: NUMBER '5' +19,3-19,4: OP ',' +19,5-19,6: NUMBER '6' +19,6-19,7: OP ')' +19,7-19,8: NEWLINE '\n' +20,0-20,1: NAME 'y' +20,2-20,3: OP '=' +20,4-20,5: OP '[' +20,5-20,6: NUMBER '3' +20,6-20,7: OP ',' +20,8-20,9: NUMBER '4' +20,9-20,10: OP ',' +20,10-20,11: NL '\n' +21,2-21,3: NUMBER '5' +21,3-21,4: OP ']' +21,4-21,5: NEWLINE '\n' +22,0-22,1: NAME 'z' +22,2-22,3: OP '=' +22,4-22,5: OP '{' +22,5-22,8: STRING "'a'" +22,8-22,9: OP ':' +22,9-22,10: NUMBER '5' +22,10-22,11: OP ',' +22,11-22,12: NL '\n' +23,2-23,5: STRING "'b'" +23,5-23,6: OP ':' +23,6-23,7: NUMBER '6' +23,7-23,8: OP '}' +23,8-23,9: NEWLINE '\n' +24,0-24,1: NAME 'x' +24,2-24,3: OP '=' +24,4-24,5: OP '(' +24,5-24,8: NAME 'len' +24,8-24,9: OP '(' +24,9-24,10: OP '`' +24,10-24,11: NAME 'y' +24,11-24,12: OP '`' +24,12-24,13: OP ')' +24,14-24,15: OP '+' +24,16-24,17: NUMBER '5' +24,17-24,18: OP '*' +24,18-24,19: NAME 'x' +24,20-24,21: OP '-' +24,22-24,23: NAME 'a' +24,23-24,24: OP '[' +24,24-24,25: NL '\n' +25,3-25,4: NUMBER '3' +25,5-25,6: OP ']' +25,6-25,7: NL '\n' +26,3-26,4: OP '-' +26,5-26,6: NAME 'x' +26,7-26,8: OP '+' +26,9-26,12: NAME 'len' +26,12-26,13: OP '(' +26,13-26,14: OP '{' +26,14-26,15: NL '\n' +27,3-27,4: OP '}' +27,4-27,5: NL '\n' +28,4-28,5: OP ')' +28,5-28,6: NL '\n' +29,2-29,3: OP ')' +29,3-29,4: NEWLINE '\n' +30,0-30,1: NL '\n' +31,0-31,37: COMMENT '# Backslash means line continuation:\n' +32,0-32,1: NAME 'x' +32,2-32,3: OP '=' +32,4-32,5: NUMBER '1' +33,0-33,1: OP '+' +33,2-33,3: NUMBER '1' +33,3-33,4: NEWLINE '\n' +34,0-34,1: NL '\n' +35,0-35,55: COMMENT '# Backslash does not means continuation in comments :\\\n' +36,0-36,1: NAME 'x' +36,2-36,3: OP '=' +36,4-36,5: NUMBER '0' +36,5-36,6: NEWLINE '\n' +37,0-37,1: NL '\n' +38,0-38,20: COMMENT '# Ordinary integers\n' +39,0-39,4: NUMBER '0xff' +39,5-39,7: OP '<>' +39,8-39,11: NUMBER '255' +39,11-39,12: NEWLINE '\n' +40,0-40,4: NUMBER '0377' +40,5-40,7: OP '<>' +40,8-40,11: NUMBER '255' +40,11-40,12: NEWLINE '\n' +41,0-41,10: NUMBER '2147483647' +41,13-41,15: OP '!=' +41,16-41,28: NUMBER '017777777777' +41,28-41,29: NEWLINE '\n' +42,0-42,1: OP '-' +42,1-42,11: NUMBER '2147483647' +42,11-42,12: OP '-' +42,12-42,13: NUMBER '1' +42,14-42,16: OP '!=' +42,17-42,29: NUMBER '020000000000' +42,29-42,30: NEWLINE '\n' +43,0-43,12: NUMBER '037777777777' +43,13-43,15: OP '!=' +43,16-43,17: OP '-' +43,17-43,18: NUMBER '1' +43,18-43,19: NEWLINE '\n' +44,0-44,10: NUMBER '0xffffffff' +44,11-44,13: OP '!=' +44,14-44,15: OP '-' +44,15-44,16: NUMBER '1' +44,16-44,17: NEWLINE '\n' +45,0-45,1: NL '\n' +46,0-46,16: COMMENT '# Long integers\n' +47,0-47,1: NAME 'x' +47,2-47,3: OP '=' +47,4-47,6: NUMBER '0L' +47,6-47,7: NEWLINE '\n' +48,0-48,1: NAME 'x' +48,2-48,3: OP '=' +48,4-48,6: NUMBER '0l' +48,6-48,7: NEWLINE '\n' +49,0-49,1: NAME 'x' +49,2-49,3: OP '=' +49,4-49,23: NUMBER '0xffffffffffffffffL' +49,23-49,24: NEWLINE '\n' +50,0-50,1: NAME 'x' +50,2-50,3: OP '=' +50,4-50,23: NUMBER '0xffffffffffffffffl' +50,23-50,24: NEWLINE '\n' +51,0-51,1: NAME 'x' +51,2-51,3: OP '=' +51,4-51,23: NUMBER '077777777777777777L' +51,23-51,24: NEWLINE '\n' +52,0-52,1: NAME 'x' +52,2-52,3: OP '=' +52,4-52,23: NUMBER '077777777777777777l' +52,23-52,24: NEWLINE '\n' +53,0-53,1: NAME 'x' +53,2-53,3: OP '=' +53,4-53,35: NUMBER '123456789012345678901234567890L' +53,35-53,36: NEWLINE '\n' +54,0-54,1: NAME 'x' +54,2-54,3: OP '=' +54,4-54,35: NUMBER '123456789012345678901234567890l' +54,35-54,36: NEWLINE '\n' +55,0-55,1: NL '\n' +56,0-56,25: COMMENT '# Floating-point numbers\n' +57,0-57,1: NAME 'x' +57,2-57,3: OP '=' +57,4-57,8: NUMBER '3.14' +57,8-57,9: NEWLINE '\n' +58,0-58,1: NAME 'x' +58,2-58,3: OP '=' +58,4-58,8: NUMBER '314.' +58,8-58,9: NEWLINE '\n' +59,0-59,1: NAME 'x' +59,2-59,3: OP '=' +59,4-59,9: NUMBER '0.314' +59,9-59,10: NEWLINE '\n' +60,0-60,18: COMMENT '# XXX x = 000.314\n' +61,0-61,1: NAME 'x' +61,2-61,3: OP '=' +61,4-61,8: NUMBER '.314' +61,8-61,9: NEWLINE '\n' +62,0-62,1: NAME 'x' +62,2-62,3: OP '=' +62,4-62,8: NUMBER '3e14' +62,8-62,9: NEWLINE '\n' +63,0-63,1: NAME 'x' +63,2-63,3: OP '=' +63,4-63,8: NUMBER '3E14' +63,8-63,9: NEWLINE '\n' +64,0-64,1: NAME 'x' +64,2-64,3: OP '=' +64,4-64,9: NUMBER '3e-14' +64,9-64,10: NEWLINE '\n' +65,0-65,1: NAME 'x' +65,2-65,3: OP '=' +65,4-65,9: NUMBER '3e+14' +65,9-65,10: NEWLINE '\n' +66,0-66,1: NAME 'x' +66,2-66,3: OP '=' +66,4-66,9: NUMBER '3.e14' +66,9-66,10: NEWLINE '\n' +67,0-67,1: NAME 'x' +67,2-67,3: OP '=' +67,4-67,9: NUMBER '.3e14' +67,9-67,10: NEWLINE '\n' +68,0-68,1: NAME 'x' +68,2-68,3: OP '=' +68,4-68,9: NUMBER '3.1e4' +68,9-68,10: NEWLINE '\n' +69,0-69,1: NL '\n' +70,0-70,18: COMMENT '# String literals\n' +71,0-71,1: NAME 'x' +71,2-71,3: OP '=' +71,4-71,6: STRING "''" +71,6-71,7: OP ';' +71,8-71,9: NAME 'y' +71,10-71,11: OP '=' +71,12-71,14: STRING '""' +71,14-71,15: OP ';' +71,15-71,16: NEWLINE '\n' +72,0-72,1: NAME 'x' +72,2-72,3: OP '=' +72,4-72,8: STRING "'\\''" +72,8-72,9: OP ';' +72,10-72,11: NAME 'y' +72,12-72,13: OP '=' +72,14-72,17: STRING '"\'"' +72,17-72,18: OP ';' +72,18-72,19: NEWLINE '\n' +73,0-73,1: NAME 'x' +73,2-73,3: OP '=' +73,4-73,7: STRING '\'"\'' +73,7-73,8: OP ';' +73,9-73,10: NAME 'y' +73,11-73,12: OP '=' +73,13-73,17: STRING '"\\""' +73,17-73,18: OP ';' +73,18-73,19: NEWLINE '\n' +74,0-74,1: NAME 'x' +74,2-74,3: OP '=' +74,4-74,32: STRING '"doesn\'t \\"shrink\\" does it"' +74,32-74,33: NEWLINE '\n' +75,0-75,1: NAME 'y' +75,2-75,3: OP '=' +75,4-75,31: STRING '\'doesn\\\'t "shrink" does it\'' +75,31-75,32: NEWLINE '\n' +76,0-76,1: NAME 'x' +76,2-76,3: OP '=' +76,4-76,32: STRING '"does \\"shrink\\" doesn\'t it"' +76,32-76,33: NEWLINE '\n' +77,0-77,1: NAME 'y' +77,2-77,3: OP '=' +77,4-77,31: STRING '\'does "shrink" doesn\\\'t it\'' +77,31-77,32: NEWLINE '\n' +78,0-78,1: NAME 'x' +78,2-78,3: OP '=' +78,4-83,3: STRING '"""\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n"""' +83,3-83,4: NEWLINE '\n' +84,0-84,1: NAME 'y' +84,2-84,3: OP '=' +84,4-84,63: STRING '\'\\nThe "quick"\\nbrown fox\\njumps over\\nthe \\\'lazy\\\' dog.\\n\'' +84,63-84,64: NEWLINE '\n' +85,0-85,1: NAME 'y' +85,2-85,3: OP '=' +85,4-90,3: STRING '\'\'\'\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n\'\'\'' +90,3-90,4: OP ';' +90,4-90,5: NEWLINE '\n' +91,0-91,1: NAME 'y' +91,2-91,3: OP '=' +91,4-96,1: STRING '"\\n\\\nThe \\"quick\\"\\n\\\nbrown fox\\n\\\njumps over\\n\\\nthe \'lazy\' dog.\\n\\\n"' +96,1-96,2: OP ';' +96,2-96,3: NEWLINE '\n' +97,0-97,1: NAME 'y' +97,2-97,3: OP '=' +97,4-102,1: STRING '\'\\n\\\nThe \\"quick\\"\\n\\\nbrown fox\\n\\\njumps over\\n\\\nthe \\\'lazy\\\' dog.\\n\\\n\'' +102,1-102,2: OP ';' +102,2-102,3: NEWLINE '\n' +103,0-103,1: NAME 'x' +103,2-103,3: OP '=' +103,4-103,9: STRING "r'\\\\'" +103,10-103,11: OP '+' +103,12-103,17: STRING "R'\\\\'" +103,17-103,18: NEWLINE '\n' +104,0-104,1: NAME 'x' +104,2-104,3: OP '=' +104,4-104,9: STRING "r'\\''" +104,10-104,11: OP '+' +104,12-104,14: STRING "''" +104,14-104,15: NEWLINE '\n' +105,0-105,1: NAME 'y' +105,2-105,3: OP '=' +105,4-107,6: STRING "r'''\nfoo bar \\\\\nbaz'''" +107,7-107,8: OP '+' +107,9-108,6: STRING "R'''\nfoo'''" +108,6-108,7: NEWLINE '\n' +109,0-109,1: NAME 'y' +109,2-109,3: OP '=' +109,4-111,3: STRING 'r"""foo\nbar \\\\ baz\n"""' +111,4-111,5: OP '+' +111,6-112,3: STRING "R'''spam\n'''" +112,3-112,4: NEWLINE '\n' +113,0-113,1: NAME 'x' +113,2-113,3: OP '=' +113,4-113,10: STRING "u'abc'" +113,11-113,12: OP '+' +113,13-113,19: STRING "U'ABC'" +113,19-113,20: NEWLINE '\n' +114,0-114,1: NAME 'y' +114,2-114,3: OP '=' +114,4-114,10: STRING 'u"abc"' +114,11-114,12: OP '+' +114,13-114,19: STRING 'U"ABC"' +114,19-114,20: NEWLINE '\n' +115,0-115,1: NAME 'x' +115,2-115,3: OP '=' +115,4-115,11: STRING "ur'abc'" +115,12-115,13: OP '+' +115,14-115,21: STRING "Ur'ABC'" +115,22-115,23: OP '+' +115,24-115,31: STRING "uR'ABC'" +115,32-115,33: OP '+' +115,34-115,41: STRING "UR'ABC'" +115,41-115,42: NEWLINE '\n' +116,0-116,1: NAME 'y' +116,2-116,3: OP '=' +116,4-116,11: STRING 'ur"abc"' +116,12-116,13: OP '+' +116,14-116,21: STRING 'Ur"ABC"' +116,22-116,23: OP '+' +116,24-116,31: STRING 'uR"ABC"' +116,32-116,33: OP '+' +116,34-116,41: STRING 'UR"ABC"' +116,41-116,42: NEWLINE '\n' +117,0-117,1: NAME 'x' +117,2-117,3: OP '=' +117,4-117,10: STRING "ur'\\\\'" +117,11-117,12: OP '+' +117,13-117,19: STRING "UR'\\\\'" +117,19-117,20: NEWLINE '\n' +118,0-118,1: NAME 'x' +118,2-118,3: OP '=' +118,4-118,10: STRING "ur'\\''" +118,11-118,12: OP '+' +118,13-118,15: STRING "''" +118,15-118,16: NEWLINE '\n' +119,0-119,1: NAME 'y' +119,2-119,3: OP '=' +119,4-121,6: STRING "ur'''\nfoo bar \\\\\nbaz'''" +121,7-121,8: OP '+' +121,9-122,6: STRING "UR'''\nfoo'''" +122,6-122,7: NEWLINE '\n' +123,0-123,1: NAME 'y' +123,2-123,3: OP '=' +123,4-125,3: STRING 'Ur"""foo\nbar \\\\ baz\n"""' +125,4-125,5: OP '+' +125,6-126,3: STRING "uR'''spam\n'''" +126,3-126,4: NEWLINE '\n' +127,0-127,1: NL '\n' +128,0-128,14: COMMENT '# Indentation\n' +129,0-129,2: NAME 'if' +129,3-129,4: NUMBER '1' +129,4-129,5: OP ':' +129,5-129,6: NEWLINE '\n' +130,0-130,4: INDENT ' ' +130,4-130,5: NAME 'x' +130,6-130,7: OP '=' +130,8-130,9: NUMBER '2' +130,9-130,10: NEWLINE '\n' +131,0-131,0: DEDENT '' +131,0-131,2: NAME 'if' +131,3-131,4: NUMBER '1' +131,4-131,5: OP ':' +131,5-131,6: NEWLINE '\n' +132,0-132,8: INDENT ' ' +132,8-132,9: NAME 'x' +132,10-132,11: OP '=' +132,12-132,13: NUMBER '2' +132,13-132,14: NEWLINE '\n' +133,0-133,0: DEDENT '' +133,0-133,2: NAME 'if' +133,3-133,4: NUMBER '1' +133,4-133,5: OP ':' +133,5-133,6: NEWLINE '\n' +134,0-134,4: INDENT ' ' +134,4-134,9: NAME 'while' +134,10-134,11: NUMBER '0' +134,11-134,12: OP ':' +134,12-134,13: NEWLINE '\n' +135,0-135,5: INDENT ' ' +135,5-135,7: NAME 'if' +135,8-135,9: NUMBER '0' +135,9-135,10: OP ':' +135,10-135,11: NEWLINE '\n' +136,0-136,11: INDENT ' ' +136,11-136,12: NAME 'x' +136,13-136,14: OP '=' +136,15-136,16: NUMBER '2' +136,16-136,17: NEWLINE '\n' +137,5-137,5: DEDENT '' +137,5-137,6: NAME 'x' +137,7-137,8: OP '=' +137,9-137,10: NUMBER '2' +137,10-137,11: NEWLINE '\n' +138,0-138,0: DEDENT '' +138,0-138,0: DEDENT '' +138,0-138,2: NAME 'if' +138,3-138,4: NUMBER '0' +138,4-138,5: OP ':' +138,5-138,6: NEWLINE '\n' +139,0-139,2: INDENT ' ' +139,2-139,4: NAME 'if' +139,5-139,6: NUMBER '2' +139,6-139,7: OP ':' +139,7-139,8: NEWLINE '\n' +140,0-140,3: INDENT ' ' +140,3-140,8: NAME 'while' +140,9-140,10: NUMBER '0' +140,10-140,11: OP ':' +140,11-140,12: NEWLINE '\n' +141,0-141,8: INDENT ' ' +141,8-141,10: NAME 'if' +141,11-141,12: NUMBER '1' +141,12-141,13: OP ':' +141,13-141,14: NEWLINE '\n' +142,0-142,10: INDENT ' ' +142,10-142,11: NAME 'x' +142,12-142,13: OP '=' +142,14-142,15: NUMBER '2' +142,15-142,16: NEWLINE '\n' +143,0-143,1: NL '\n' +144,0-144,12: COMMENT '# Operators\n' +145,0-145,1: NL '\n' +146,0-146,0: DEDENT '' +146,0-146,0: DEDENT '' +146,0-146,0: DEDENT '' +146,0-146,0: DEDENT '' +146,0-146,3: NAME 'def' +146,4-146,7: NAME 'd22' +146,7-146,8: OP '(' +146,8-146,9: NAME 'a' +146,9-146,10: OP ',' +146,11-146,12: NAME 'b' +146,12-146,13: OP ',' +146,14-146,15: NAME 'c' +146,15-146,16: OP '=' +146,16-146,17: NUMBER '1' +146,17-146,18: OP ',' +146,19-146,20: NAME 'd' +146,20-146,21: OP '=' +146,21-146,22: NUMBER '2' +146,22-146,23: OP ')' +146,23-146,24: OP ':' +146,25-146,29: NAME 'pass' +146,29-146,30: NEWLINE '\n' +147,0-147,3: NAME 'def' +147,4-147,8: NAME 'd01v' +147,8-147,9: OP '(' +147,9-147,10: NAME 'a' +147,10-147,11: OP '=' +147,11-147,12: NUMBER '1' +147,12-147,13: OP ',' +147,14-147,15: OP '*' +147,15-147,20: NAME 'restt' +147,20-147,21: OP ',' +147,22-147,24: OP '**' +147,24-147,29: NAME 'restd' +147,29-147,30: OP ')' +147,30-147,31: OP ':' +147,32-147,36: NAME 'pass' +147,36-147,37: NEWLINE '\n' +148,0-148,1: NL '\n' +149,0-149,1: OP '(' +149,1-149,2: NAME 'x' +149,2-149,3: OP ',' +149,4-149,5: NAME 'y' +149,5-149,6: OP ')' +149,7-149,9: OP '<>' +149,10-149,11: OP '(' +149,11-149,12: OP '{' +149,12-149,15: STRING "'a'" +149,15-149,16: OP ':' +149,16-149,17: NUMBER '1' +149,17-149,18: OP '}' +149,18-149,19: OP ',' +149,20-149,21: OP '{' +149,21-149,24: STRING "'b'" +149,24-149,25: OP ':' +149,25-149,26: NUMBER '2' +149,26-149,27: OP '}' +149,27-149,28: OP ')' +149,28-149,29: NEWLINE '\n' +150,0-150,1: NL '\n' +151,0-151,13: COMMENT '# comparison\n' +152,0-152,2: NAME 'if' +152,3-152,4: NUMBER '1' +152,5-152,6: OP '<' +152,7-152,8: NUMBER '1' +152,9-152,10: OP '>' +152,11-152,12: NUMBER '1' +152,13-152,15: OP '==' +152,16-152,17: NUMBER '1' +152,18-152,20: OP '>=' +152,21-152,22: NUMBER '1' +152,23-152,25: OP '<=' +152,26-152,27: NUMBER '1' +152,28-152,30: OP '<>' +152,31-152,32: NUMBER '1' +152,33-152,35: OP '!=' +152,36-152,37: NUMBER '1' +152,38-152,40: NAME 'in' +152,41-152,42: NUMBER '1' +152,43-152,46: NAME 'not' +152,47-152,49: NAME 'in' +152,50-152,51: NUMBER '1' +152,52-152,54: NAME 'is' +152,55-152,56: NUMBER '1' +152,57-152,59: NAME 'is' +152,60-152,63: NAME 'not' +152,64-152,65: NUMBER '1' +152,65-152,66: OP ':' +152,67-152,71: NAME 'pass' +152,71-152,72: NEWLINE '\n' +153,0-153,1: NL '\n' +154,0-154,9: COMMENT '# binary\n' +155,0-155,1: NAME 'x' +155,2-155,3: OP '=' +155,4-155,5: NUMBER '1' +155,6-155,7: OP '&' +155,8-155,9: NUMBER '1' +155,9-155,10: NEWLINE '\n' +156,0-156,1: NAME 'x' +156,2-156,3: OP '=' +156,4-156,5: NUMBER '1' +156,6-156,7: OP '^' +156,8-156,9: NUMBER '1' +156,9-156,10: NEWLINE '\n' +157,0-157,1: NAME 'x' +157,2-157,3: OP '=' +157,4-157,5: NUMBER '1' +157,6-157,7: OP '|' +157,8-157,9: NUMBER '1' +157,9-157,10: NEWLINE '\n' +158,0-158,1: NL '\n' +159,0-159,8: COMMENT '# shift\n' +160,0-160,1: NAME 'x' +160,2-160,3: OP '=' +160,4-160,5: NUMBER '1' +160,6-160,8: OP '<<' +160,9-160,10: NUMBER '1' +160,11-160,13: OP '>>' +160,14-160,15: NUMBER '1' +160,15-160,16: NEWLINE '\n' +161,0-161,1: NL '\n' +162,0-162,11: COMMENT '# additive\n' +163,0-163,1: NAME 'x' +163,2-163,3: OP '=' +163,4-163,5: NUMBER '1' +163,6-163,7: OP '-' +163,8-163,9: NUMBER '1' +163,10-163,11: OP '+' +163,12-163,13: NUMBER '1' +163,14-163,15: OP '-' +163,16-163,17: NUMBER '1' +163,18-163,19: OP '+' +163,20-163,21: NUMBER '1' +163,21-163,22: NEWLINE '\n' +164,0-164,1: NL '\n' +165,0-165,17: COMMENT '# multiplicative\n' +166,0-166,1: NAME 'x' +166,2-166,3: OP '=' +166,4-166,5: NUMBER '1' +166,6-166,7: OP '/' +166,8-166,9: NUMBER '1' +166,10-166,11: OP '*' +166,12-166,13: NUMBER '1' +166,14-166,15: OP '%' +166,16-166,17: NUMBER '1' +166,17-166,18: NEWLINE '\n' +167,0-167,1: NL '\n' +168,0-168,8: COMMENT '# unary\n' +169,0-169,1: NAME 'x' +169,2-169,3: OP '=' +169,4-169,5: OP '~' +169,5-169,6: NUMBER '1' +169,7-169,8: OP '^' +169,9-169,10: NUMBER '1' +169,11-169,12: OP '&' +169,13-169,14: NUMBER '1' +169,15-169,16: OP '|' +169,17-169,18: NUMBER '1' +169,19-169,20: OP '&' +169,21-169,22: NUMBER '1' +169,23-169,24: OP '^' +169,25-169,26: OP '-' +169,26-169,27: NUMBER '1' +169,27-169,28: NEWLINE '\n' +170,0-170,1: NAME 'x' +170,2-170,3: OP '=' +170,4-170,5: OP '-' +170,5-170,6: NUMBER '1' +170,6-170,7: OP '*' +170,7-170,8: NUMBER '1' +170,8-170,9: OP '/' +170,9-170,10: NUMBER '1' +170,11-170,12: OP '+' +170,13-170,14: NUMBER '1' +170,14-170,15: OP '*' +170,15-170,16: NUMBER '1' +170,17-170,18: OP '-' +170,19-170,20: OP '-' +170,20-170,21: OP '-' +170,21-170,22: OP '-' +170,22-170,23: NUMBER '1' +170,23-170,24: OP '*' +170,24-170,25: NUMBER '1' +170,25-170,26: NEWLINE '\n' +171,0-171,1: NL '\n' +172,0-172,11: COMMENT '# selector\n' +173,0-173,6: NAME 'import' +173,7-173,10: NAME 'sys' +173,10-173,11: OP ',' +173,12-173,16: NAME 'time' +173,16-173,17: NEWLINE '\n' +174,0-174,1: NAME 'x' +174,2-174,3: OP '=' +174,4-174,7: NAME 'sys' +174,7-174,8: OP '.' +174,8-174,15: NAME 'modules' +174,15-174,16: OP '[' +174,16-174,22: STRING "'time'" +174,22-174,23: OP ']' +174,23-174,24: OP '.' +174,24-174,28: NAME 'time' +174,28-174,29: OP '(' +174,29-174,30: OP ')' +174,30-174,31: NEWLINE '\n' +175,0-175,1: NL '\n' +176,0-176,0: ENDMARKER '' diff --git a/lib-python/2.2/test/output/test_types b/lib-python/2.2/test/output/test_types new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_types @@ -0,0 +1,16 @@ +test_types +6. Built-in types +6.1 Truth value testing +6.2 Boolean operations +6.3 Comparisons +6.4 Numeric types (mostly conversions) +6.4.1 32-bit integers +6.4.2 Long integers +6.4.3 Floating point numbers +6.5 Sequence types +6.5.1 Strings +6.5.2 Tuples +6.5.3 Lists +6.5.3a Additional list operations +6.6 Mappings == Dictionaries +6.7 Buffers diff --git a/lib-python/2.2/test/output/test_ucn b/lib-python/2.2/test/output/test_ucn new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_ucn @@ -0,0 +1,7 @@ +test_ucn +Testing General Unicode Character Name, and case insensitivity... done. +Testing name to code mapping.... done. +Testing code to name mapping for all characters.... done. +Found 10538 characters in the unicode name database +Testing misc. symbols for unicode character name expansion.... done. +Testing unicode character name expansion strict error handling.... done. diff --git a/lib-python/2.2/test/output/test_unicode b/lib-python/2.2/test/output/test_unicode new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_unicode @@ -0,0 +1,21 @@ +test_unicode +Testing Unicode comparisons... done. +Testing Unicode contains method... done. +Testing Unicode formatting strings... done. +Testing builtin unicode()... done. +Testing builtin codecs... done. +Testing standard mapping codecs... 0-127... 128-255... done. +Testing Unicode string concatenation... done. +Testing Unicode printing... abc +abc def +abc def +abc def +abc + +abc +abc +def + +def + +done. diff --git a/lib-python/2.2/test/output/test_unicode_file b/lib-python/2.2/test/output/test_unicode_file new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_unicode_file @@ -0,0 +1,2 @@ +test_unicode_file +All the Unicode tests appeared to work diff --git a/lib-python/2.2/test/output/test_unicodedata b/lib-python/2.2/test/output/test_unicodedata new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_unicodedata @@ -0,0 +1,5 @@ +test_unicodedata +Testing Unicode Database... +Methods: 84b72943b1d4320bc1e64a4888f7cdf62eea219a +Functions: 41e1d4792185d6474a43c83ce4f593b1bdb01f8a +API: ok diff --git a/lib-python/2.2/test/output/test_urlparse b/lib-python/2.2/test/output/test_urlparse new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_urlparse @@ -0,0 +1,47 @@ +test_urlparse +http://www.python.org = ('http', 'www.python.org', '', '', '', '') +http://www.python.org#abc = ('http', 'www.python.org', '', '', '', 'abc') +http://www.python.org/#abc = ('http', 'www.python.org', '/', '', '', 'abc') +http://a/b/c/d;p?q#f = ('http', 'a', '/b/c/d', 'p', 'q', 'f') +file:///tmp/junk.txt = ('file', '', '/tmp/junk.txt', '', '', '') + +urlparse.urljoin() tests + +g:h = 'g:h' +g = 'http://a/b/c/g' +./g = 'http://a/b/c/g' +g/ = 'http://a/b/c/g/' +/g = 'http://a/g' +//g = 'http://g' +?y = 'http://a/b/c/d;p?y' +g?y = 'http://a/b/c/g?y' +g?y/./x = 'http://a/b/c/g?y/./x' +#s = 'http://a/b/c/d;p?q#s' +g#s = 'http://a/b/c/g#s' +g#s/./x = 'http://a/b/c/g#s/./x' +g?y#s = 'http://a/b/c/g?y#s' +;x = 'http://a/b/c/d;x' +g;x = 'http://a/b/c/g;x' +g;x?y#s = 'http://a/b/c/g;x?y#s' +. = 'http://a/b/c/' +./ = 'http://a/b/c/' +.. = 'http://a/b/' +../ = 'http://a/b/' +../g = 'http://a/b/g' +../.. = 'http://a/' +../../ = 'http://a/' +../../g = 'http://a/g' + = 'http://a/b/c/d;p?q#f' +../../../g = 'http://a/../g' +../../../../g = 'http://a/../../g' +/./g = 'http://a/./g' +/../g = 'http://a/../g' +g. = 'http://a/b/c/g.' +.g = 'http://a/b/c/.g' +g.. = 'http://a/b/c/g..' +..g = 'http://a/b/c/..g' +./../g = 'http://a/b/g' +./g/. = 'http://a/b/c/g/' +g/./h = 'http://a/b/c/g/h' +g/../h = 'http://a/b/c/h' +0 errors diff --git a/lib-python/2.2/test/output/test_winreg b/lib-python/2.2/test/output/test_winreg new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_winreg @@ -0,0 +1,3 @@ +test_winreg +Local registry tests worked +Remote registry calls can be tested using 'test_winreg.py --remote \\machine_name' diff --git a/lib-python/2.2/test/output/test_winsound b/lib-python/2.2/test/output/test_winsound new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_winsound @@ -0,0 +1,2 @@ +test_winsound +Hopefully you heard some sounds increasing in frequency! diff --git a/lib-python/2.2/test/output/test_xreadline b/lib-python/2.2/test/output/test_xreadline new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_xreadline @@ -0,0 +1,4 @@ +test_xreadline +AttributeError (expected) +TypeError (expected) +RuntimeError (expected): xreadlines object accessed out of order diff --git a/lib-python/2.2/test/output/test_zlib b/lib-python/2.2/test/output/test_zlib new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/output/test_zlib @@ -0,0 +1,14 @@ +test_zlib +0xe5c1a120 0x43b6aa94 +0xbd602f7 0xbd602f7 +expecting Bad compression level +expecting Invalid initialization option +expecting Invalid initialization option +normal compression/decompression succeeded +compress/decompression obj succeeded +decompress with init options succeeded +decompressobj with init options succeeded +should be '': '' +max_length decompressobj succeeded +unconsumed_tail should be '': '' +Testing on 17K of random data diff --git a/lib-python/2.2/test/pickletester.py b/lib-python/2.2/test/pickletester.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/pickletester.py @@ -0,0 +1,285 @@ +import unittest +from test_support import TestFailed, have_unicode + +class C: + def __cmp__(self, other): + return cmp(self.__dict__, other.__dict__) + +import __main__ +__main__.C = C +C.__module__ = "__main__" + +class myint(int): + def __init__(self, x): + self.str = str(x) + +class initarg(C): + + __safe_for_unpickling__ = 1 + + def __init__(self, a, b): + self.a = a + self.b = b + + def __getinitargs__(self): + return self.a, self.b + +class metaclass(type): + pass + +class use_metaclass(object): + __metaclass__ = metaclass + +# break into multiple strings to avoid confusing font-lock-mode +DATA = """(lp1 +I0 +aL1L +aF2 +ac__builtin__ +complex +p2 +""" + \ +"""(F3 +F0 +tRp3 +aI1 +aI-1 +aI255 +aI-255 +aI-256 +aI65535 +aI-65535 +aI-65536 +aI2147483647 +aI-2147483647 +aI-2147483648 +a""" + \ +"""(S'abc' +p4 +g4 +""" + \ +"""(i__main__ +C +p5 +""" + \ +"""(dp6 +S'foo' +p7 +I1 +sS'bar' +p8 +I2 +sbg5 +tp9 +ag9 +aI5 +a. +""" + +BINDATA = ']q\x01(K\x00L1L\nG@\x00\x00\x00\x00\x00\x00\x00' + \ + 'c__builtin__\ncomplex\nq\x02(G@\x08\x00\x00\x00\x00\x00' + \ + '\x00G\x00\x00\x00\x00\x00\x00\x00\x00tRq\x03K\x01J\xff\xff' + \ + '\xff\xffK\xffJ\x01\xff\xff\xffJ\x00\xff\xff\xffM\xff\xff' + \ + 'J\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff\xff\x7fJ\x01\x00' + \ + '\x00\x80J\x00\x00\x00\x80(U\x03abcq\x04h\x04(c__main__\n' + \ + 'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \ + '\x06tq\nh\nK\x05e.' + +def create_data(): + c = C() + c.foo = 1 + c.bar = 2 + x = [0, 1L, 2.0, 3.0+0j] + # Append some integer test cases at cPickle.c's internal size + # cutoffs. + uint1max = 0xff + uint2max = 0xffff + int4max = 0x7fffffff + x.extend([1, -1, + uint1max, -uint1max, -uint1max-1, + uint2max, -uint2max, -uint2max-1, + int4max, -int4max, -int4max-1]) + y = ('abc', 'abc', c, c) + x.append(y) + x.append(y) + x.append(5) + return x + +class AbstractPickleTests(unittest.TestCase): + + _testdata = create_data() + + def setUp(self): + # subclass must define self.dumps, self.loads, self.error + pass + + def test_misc(self): + # test various datatypes not tested by testdata + x = myint(4) + s = self.dumps(x) + y = self.loads(s) + self.assertEqual(x, y) + + x = (1, ()) + s = self.dumps(x) + y = self.loads(s) + self.assertEqual(x, y) + + x = initarg(1, x) + s = self.dumps(x) + y = self.loads(s) + self.assertEqual(x, y) + + # XXX test __reduce__ protocol? + + def test_identity(self): + s = self.dumps(self._testdata) + x = self.loads(s) + self.assertEqual(x, self._testdata) + + def test_constant(self): + x = self.loads(DATA) + self.assertEqual(x, self._testdata) + x = self.loads(BINDATA) + self.assertEqual(x, self._testdata) + + def test_binary(self): + s = self.dumps(self._testdata, 1) + x = self.loads(s) + self.assertEqual(x, self._testdata) + + def test_recursive_list(self): + l = [] + l.append(l) + s = self.dumps(l) + x = self.loads(s) + self.assertEqual(x, l) + self.assertEqual(x, x[0]) + self.assertEqual(id(x), id(x[0])) + + def test_recursive_dict(self): + d = {} + d[1] = d + s = self.dumps(d) + x = self.loads(s) + self.assertEqual(x, d) + self.assertEqual(x[1], x) + self.assertEqual(id(x[1]), id(x)) + + def test_recursive_inst(self): + i = C() + i.attr = i + s = self.dumps(i) + x = self.loads(s) + self.assertEqual(x, i) + self.assertEqual(x.attr, x) + self.assertEqual(id(x.attr), id(x)) + + def test_recursive_multi(self): + l = [] + d = {1:l} + i = C() + i.attr = d + l.append(i) + s = self.dumps(l) + x = self.loads(s) + self.assertEqual(x, l) + self.assertEqual(x[0], i) + self.assertEqual(x[0].attr, d) + self.assertEqual(x[0].attr[1], x) + self.assertEqual(x[0].attr[1][0], i) + self.assertEqual(x[0].attr[1][0].attr, d) + + def test_garyp(self): + self.assertRaises(self.error, self.loads, 'garyp') + + def test_insecure_strings(self): + insecure = ["abc", "2 + 2", # not quoted + "'abc' + 'def'", # not a single quoted string + "'abc", # quote is not closed + "'abc\"", # open quote and close quote don't match + "'abc' ?", # junk after close quote + # some tests of the quoting rules + "'abc\"\''", + "'\\\\a\'\'\'\\\'\\\\\''", + ] + for s in insecure: + buf = "S" + s + "\012p0\012." + self.assertRaises(ValueError, self.loads, buf) + + if have_unicode: + def test_unicode(self): + endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'), + unicode('<\n>'), unicode('<\\>')] + for u in endcases: + p = self.dumps(u) + u2 = self.loads(p) + self.assertEqual(u2, u) + + def test_ints(self): + import sys + n = sys.maxint + while n: + for expected in (-n, n): + s = self.dumps(expected) + n2 = self.loads(s) + self.assertEqual(expected, n2) + n = n >> 1 + + def test_maxint64(self): + maxint64 = (1L << 63) - 1 + data = 'I' + str(maxint64) + '\n.' + got = self.loads(data) + self.assertEqual(got, maxint64) + + # Try too with a bogus literal. + data = 'I' + str(maxint64) + 'JUNK\n.' + self.assertRaises(ValueError, self.loads, data) + + def test_reduce(self): + pass + + def test_getinitargs(self): + pass + + def test_metaclass(self): + a = use_metaclass() + s = self.dumps(a) + b = self.loads(s) + self.assertEqual(a.__class__, b.__class__) + + def test_structseq(self): + import time + t = time.localtime() + s = self.dumps(t) + u = self.loads(s) + self.assertEqual(t, u) + import os + if hasattr(os, "stat"): + t = os.stat(os.curdir) + s = self.dumps(t) + u = self.loads(s) + self.assertEqual(t, u) + if hasattr(os, "statvfs"): + t = os.statvfs(os.curdir) + s = self.dumps(t) + u = self.loads(s) + self.assertEqual(t, u) + +class AbstractPickleModuleTests(unittest.TestCase): + + def test_dump_closed_file(self): + import tempfile, os + fn = tempfile.mktemp() + f = open(fn, "w") + f.close() + self.assertRaises(ValueError, self.module.dump, 123, f) + os.remove(fn) + + def test_load_closed_file(self): + import tempfile, os + fn = tempfile.mktemp() + f = open(fn, "w") + f.close() + self.assertRaises(ValueError, self.module.dump, 123, f) + os.remove(fn) diff --git a/lib-python/2.2/test/pydocfodder.py b/lib-python/2.2/test/pydocfodder.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/pydocfodder.py @@ -0,0 +1,210 @@ +"""Something just to look at via pydoc.""" + +class A_classic: + "A classic class." + def A_method(self): + "Method defined in A." + def AB_method(self): + "Method defined in A and B." + def AC_method(self): + "Method defined in A and C." + def AD_method(self): + "Method defined in A and D." + def ABC_method(self): + "Method defined in A, B and C." + def ABD_method(self): + "Method defined in A, B and D." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + + +class B_classic(A_classic): + "A classic class, derived from A_classic." + def AB_method(self): + "Method defined in A and B." + def ABC_method(self): + "Method defined in A, B and C." + def ABD_method(self): + "Method defined in A, B and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def B_method(self): + "Method defined in B." + def BC_method(self): + "Method defined in B and C." + def BD_method(self): + "Method defined in B and D." + def BCD_method(self): + "Method defined in B, C and D." + +class C_classic(A_classic): + "A classic class, derived from A_classic." + def AC_method(self): + "Method defined in A and C." + def ABC_method(self): + "Method defined in A, B and C." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def BC_method(self): + "Method defined in B and C." + def BCD_method(self): + "Method defined in B, C and D." + def C_method(self): + "Method defined in C." + def CD_method(self): + "Method defined in C and D." + +class D_classic(B_classic, C_classic): + "A classic class, derived from B_classic and C_classic." + def AD_method(self): + "Method defined in A and D." + def ABD_method(self): + "Method defined in A, B and D." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def BD_method(self): + "Method defined in B and D." + def BCD_method(self): + "Method defined in B, C and D." + def CD_method(self): + "Method defined in C and D." + def D_method(self): + "Method defined in D." + + +class A_new(object): + "A new-style class." + + def A_method(self): + "Method defined in A." + def AB_method(self): + "Method defined in A and B." + def AC_method(self): + "Method defined in A and C." + def AD_method(self): + "Method defined in A and D." + def ABC_method(self): + "Method defined in A, B and C." + def ABD_method(self): + "Method defined in A, B and D." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + + def A_classmethod(cls, x): + "A class method defined in A." + A_classmethod = classmethod(A_classmethod) + + def A_staticmethod(): + "A static method defined in A." + A_staticmethod = staticmethod(A_staticmethod) + + def _getx(self): + "A property getter function." + def _setx(self, value): + "A property setter function." + def _delx(self): + "A property deleter function." + A_property = property(fdel=_delx, fget=_getx, fset=_setx, + doc="A sample property defined in A.") + + A_int_alias = int + +class B_new(A_new): + "A new-style class, derived from A_new." + + def AB_method(self): + "Method defined in A and B." + def ABC_method(self): + "Method defined in A, B and C." + def ABD_method(self): + "Method defined in A, B and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def B_method(self): + "Method defined in B." + def BC_method(self): + "Method defined in B and C." + def BD_method(self): + "Method defined in B and D." + def BCD_method(self): + "Method defined in B, C and D." + +class C_new(A_new): + "A new-style class, derived from A_new." + + def AC_method(self): + "Method defined in A and C." + def ABC_method(self): + "Method defined in A, B and C." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def BC_method(self): + "Method defined in B and C." + def BCD_method(self): + "Method defined in B, C and D." + def C_method(self): + "Method defined in C." + def CD_method(self): + "Method defined in C and D." + +class D_new(B_new, C_new): + """A new-style class, derived from B_new and C_new. + """ + + def AD_method(self): + "Method defined in A and D." + def ABD_method(self): + "Method defined in A, B and D." + def ACD_method(self): + "Method defined in A, C and D." + def ABCD_method(self): + "Method defined in A, B, C and D." + def BD_method(self): + "Method defined in B and D." + def BCD_method(self): + "Method defined in B, C and D." + def CD_method(self): + "Method defined in C and D." + def D_method(self): + "Method defined in D." + +class FunkyProperties(object): + """From SF bug 472347, by Roeland Rengelink. + + Property getters etc may not be vanilla functions or methods, + and this used to make GUI pydoc blow up. + """ + + def __init__(self): + self.desc = {'x':0} + + class get_desc: + def __init__(self, attr): + self.attr = attr + def __call__(self, inst): + print 'Get called', self, inst + return inst.desc[self.attr] + class set_desc: + def __init__(self, attr): + self.attr = attr + def __call__(self, inst, val): + print 'Set called', self, inst, val + inst.desc[self.attr] = val + class del_desc: + def __init__(self, attr): + self.attr = attr + def __call__(self, inst): + print 'Del called', self, inst + del inst.desc[self.attr] + + x = property(get_desc('x'), set_desc('x'), del_desc('x'), 'prop x') diff --git a/lib-python/2.2/test/pystone.py b/lib-python/2.2/test/pystone.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/pystone.py @@ -0,0 +1,252 @@ +#! /usr/bin/env python + +""" +"PYSTONE" Benchmark Program + +Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes) + +Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. + + Translated from ADA to C by Rick Richardson. + Every method to preserve ADA-likeness has been used, + at the expense of C-ness. + + Translated from C to Python by Guido van Rossum. + +Version History: + + Version 1.1 corrects two bugs in version 1.0: + + First, it leaked memory: in Proc1(), NextRecord ends + up having a pointer to itself. I have corrected this + by zapping NextRecord.PtrComp at the end of Proc1(). + + Second, Proc3() used the operator != to compare a + record to None. This is rather inefficient and not + true to the intention of the original benchmark (where + a pointer comparison to None is intended; the != + operator attempts to find a method __cmp__ to do value + comparison of the record). Version 1.1 runs 5-10 + percent faster than version 1.0, so benchmark figures + of different versions can't be compared directly. + +""" + +LOOPS = 10000 + +from time import clock + +__version__ = "1.1" + +[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) + +class Record: + + def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0, + IntComp = 0, StringComp = 0): + self.PtrComp = PtrComp + self.Discr = Discr + self.EnumComp = EnumComp + self.IntComp = IntComp + self.StringComp = StringComp + + def copy(self): + return Record(self.PtrComp, self.Discr, self.EnumComp, + self.IntComp, self.StringComp) + +TRUE = 1 +FALSE = 0 + +def main(): + benchtime, stones = pystones() + print "Pystone(%s) time for %d passes = %g" % \ + (__version__, LOOPS, benchtime) + print "This machine benchmarks at %g pystones/second" % stones + + +def pystones(loops=LOOPS): + return Proc0(loops) + +IntGlob = 0 +BoolGlob = FALSE +Char1Glob = '\0' +Char2Glob = '\0' +Array1Glob = [0]*51 +Array2Glob = map(lambda x: x[:], [Array1Glob]*51) +PtrGlb = None +PtrGlbNext = None + +def Proc0(loops=LOOPS): + global IntGlob + global BoolGlob + global Char1Glob + global Char2Glob + global Array1Glob + global Array2Glob + global PtrGlb + global PtrGlbNext + + starttime = clock() + for i in range(loops): + pass + nulltime = clock() - starttime + + PtrGlbNext = Record() + PtrGlb = Record() + PtrGlb.PtrComp = PtrGlbNext + PtrGlb.Discr = Ident1 + PtrGlb.EnumComp = Ident3 + PtrGlb.IntComp = 40 + PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" + String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" + Array2Glob[8][7] = 10 + + starttime = clock() + + for i in range(loops): + Proc5() + Proc4() + IntLoc1 = 2 + IntLoc2 = 3 + String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" + EnumLoc = Ident2 + BoolGlob = not Func2(String1Loc, String2Loc) + while IntLoc1 < IntLoc2: + IntLoc3 = 5 * IntLoc1 - IntLoc2 + IntLoc3 = Proc7(IntLoc1, IntLoc2) + IntLoc1 = IntLoc1 + 1 + Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) + PtrGlb = Proc1(PtrGlb) + CharIndex = 'A' + while CharIndex <= Char2Glob: + if EnumLoc == Func1(CharIndex, 'C'): + EnumLoc = Proc6(Ident1) + CharIndex = chr(ord(CharIndex)+1) + IntLoc3 = IntLoc2 * IntLoc1 + IntLoc2 = IntLoc3 / IntLoc1 + IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 + IntLoc1 = Proc2(IntLoc1) + + benchtime = clock() - starttime - nulltime + return benchtime, (loops / benchtime) + +def Proc1(PtrParIn): + PtrParIn.PtrComp = NextRecord = PtrGlb.copy() + PtrParIn.IntComp = 5 + NextRecord.IntComp = PtrParIn.IntComp + NextRecord.PtrComp = PtrParIn.PtrComp + NextRecord.PtrComp = Proc3(NextRecord.PtrComp) + if NextRecord.Discr == Ident1: + NextRecord.IntComp = 6 + NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) + NextRecord.PtrComp = PtrGlb.PtrComp + NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) + else: + PtrParIn = NextRecord.copy() + NextRecord.PtrComp = None + return PtrParIn + +def Proc2(IntParIO): + IntLoc = IntParIO + 10 + while 1: + if Char1Glob == 'A': + IntLoc = IntLoc - 1 + IntParIO = IntLoc - IntGlob + EnumLoc = Ident1 + if EnumLoc == Ident1: + break + return IntParIO + +def Proc3(PtrParOut): + global IntGlob + + if PtrGlb is not None: + PtrParOut = PtrGlb.PtrComp + else: + IntGlob = 100 + PtrGlb.IntComp = Proc7(10, IntGlob) + return PtrParOut + +def Proc4(): + global Char2Glob + + BoolLoc = Char1Glob == 'A' + BoolLoc = BoolLoc or BoolGlob + Char2Glob = 'B' + +def Proc5(): + global Char1Glob + global BoolGlob + + Char1Glob = 'A' + BoolGlob = FALSE + +def Proc6(EnumParIn): + EnumParOut = EnumParIn + if not Func3(EnumParIn): + EnumParOut = Ident4 + if EnumParIn == Ident1: + EnumParOut = Ident1 + elif EnumParIn == Ident2: + if IntGlob > 100: + EnumParOut = Ident1 + else: + EnumParOut = Ident4 + elif EnumParIn == Ident3: + EnumParOut = Ident2 + elif EnumParIn == Ident4: + pass + elif EnumParIn == Ident5: + EnumParOut = Ident3 + return EnumParOut + +def Proc7(IntParI1, IntParI2): + IntLoc = IntParI1 + 2 + IntParOut = IntParI2 + IntLoc + return IntParOut + +def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): + global IntGlob + + IntLoc = IntParI1 + 5 + Array1Par[IntLoc] = IntParI2 + Array1Par[IntLoc+1] = Array1Par[IntLoc] + Array1Par[IntLoc+30] = IntLoc + for IntIndex in range(IntLoc, IntLoc+2): + Array2Par[IntLoc][IntIndex] = IntLoc + Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 + Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] + IntGlob = 5 + +def Func1(CharPar1, CharPar2): + CharLoc1 = CharPar1 + CharLoc2 = CharLoc1 + if CharLoc2 != CharPar2: + return Ident1 + else: + return Ident2 + +def Func2(StrParI1, StrParI2): + IntLoc = 1 + while IntLoc <= 1: + if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: + CharLoc = 'A' + IntLoc = IntLoc + 1 + if CharLoc >= 'W' and CharLoc <= 'Z': + IntLoc = 7 + if CharLoc == 'X': + return TRUE + else: + if StrParI1 > StrParI2: + IntLoc = IntLoc + 7 + return TRUE + else: + return FALSE + +def Func3(EnumParIn): + EnumLoc = EnumParIn + if EnumLoc == Ident3: return TRUE + return FALSE + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/test/re_tests.py b/lib-python/2.2/test/re_tests.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/re_tests.py @@ -0,0 +1,661 @@ +#!/usr/bin/env python +# -*- mode: python -*- + +# Re test suite and benchmark suite v1.5 + +# The 3 possible outcomes for each pattern +[SUCCEED, FAIL, SYNTAX_ERROR] = range(3) + +# Benchmark suite (needs expansion) +# +# The benchmark suite does not test correctness, just speed. The +# first element of each tuple is the regex pattern; the second is a +# string to match it against. The benchmarking code will embed the +# second string inside several sizes of padding, to test how regex +# matching performs on large strings. + +benchmarks = [ + + # test common prefix + ('Python|Perl', 'Perl'), # Alternation + ('(Python|Perl)', 'Perl'), # Grouped alternation + + ('Python|Perl|Tcl', 'Perl'), # Alternation + ('(Python|Perl|Tcl)', 'Perl'), # Grouped alternation + + ('(Python)\\1', 'PythonPython'), # Backreference + ('([0a-z][a-z0-9]*,)+', 'a5,b7,c9,'), # Disable the fastmap optimization + ('([a-z][a-z0-9]*,)+', 'a5,b7,c9,'), # A few sets + + ('Python', 'Python'), # Simple text literal + ('.*Python', 'Python'), # Bad text literal + ('.*Python.*', 'Python'), # Worse text literal + ('.*(Python)', 'Python'), # Bad text literal with grouping + +] + +# Test suite (for verifying correctness) +# +# The test suite is a list of 5- or 3-tuples. The 5 parts of a +# complete tuple are: +# element 0: a string containing the pattern +# 1: the string to match against the pattern +# 2: the expected result (SUCCEED, FAIL, SYNTAX_ERROR) +# 3: a string that will be eval()'ed to produce a test string. +# This is an arbitrary Python expression; the available +# variables are "found" (the whole match), and "g1", "g2", ... +# up to "g99" contain the contents of each group, or the +# string 'None' if the group wasn't given a value, or the +# string 'Error' if the group index was out of range; +# also "groups", the return value of m.group() (a tuple). +# 4: The expected result of evaluating the expression. +# If the two don't match, an error is reported. +# +# If the regex isn't expected to work, the latter two elements can be omitted. + +tests = [ + # Test ?P< and ?P= extensions + ('(?Pa)', '', SYNTAX_ERROR), # Begins with a digit + ('(?Pa)', '', SYNTAX_ERROR), # Begins with an illegal char + ('(?Pa)', '', SYNTAX_ERROR), # Begins with an illegal char + + # Same tests, for the ?P= form + ('(?Pa)(?P=foo_123', 'aa', SYNTAX_ERROR), + ('(?Pa)(?P=1)', 'aa', SYNTAX_ERROR), + ('(?Pa)(?P=!)', 'aa', SYNTAX_ERROR), + ('(?Pa)(?P=foo_124', 'aa', SYNTAX_ERROR), # Backref to undefined group + + ('(?Pa)', 'a', SUCCEED, 'g1', 'a'), + ('(?Pa)(?P=foo_123)', 'aa', SUCCEED, 'g1', 'a'), + + # Test octal escapes + ('\\1', 'a', SYNTAX_ERROR), # Backreference + ('[\\1]', '\1', SUCCEED, 'found', '\1'), # Character + ('\\09', chr(0) + '9', SUCCEED, 'found', chr(0) + '9'), + ('\\141', 'a', SUCCEED, 'found', 'a'), + ('(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\119', 'abcdefghijklk9', SUCCEED, 'found+"-"+g11', 'abcdefghijklk9-k'), + + # Test \0 is handled everywhere + (r'\0', '\0', SUCCEED, 'found', '\0'), + (r'[\0a]', '\0', SUCCEED, 'found', '\0'), + (r'[a\0]', '\0', SUCCEED, 'found', '\0'), + (r'[^a\0]', '\0', FAIL), + + # Test various letter escapes + (r'\a[\b]\f\n\r\t\v', '\a\b\f\n\r\t\v', SUCCEED, 'found', '\a\b\f\n\r\t\v'), + (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', SUCCEED, 'found', '\a\b\f\n\r\t\v'), + # NOTE: not an error under PCRE/PRE: + # (r'\u', '', SYNTAX_ERROR), # A Perl escape + (r'\c\e\g\h\i\j\k\m\o\p\q\y\z', 'ceghijkmopqyz', SUCCEED, 'found', 'ceghijkmopqyz'), + (r'\xff', '\377', SUCCEED, 'found', chr(255)), + # new \x semantics + (r'\x00ffffffffffffff', '\377', FAIL, 'found', chr(255)), + (r'\x00f', '\017', FAIL, 'found', chr(15)), + (r'\x00fe', '\376', FAIL, 'found', chr(254)), + # (r'\x00ffffffffffffff', '\377', SUCCEED, 'found', chr(255)), + # (r'\x00f', '\017', SUCCEED, 'found', chr(15)), + # (r'\x00fe', '\376', SUCCEED, 'found', chr(254)), + + (r"^\w+=(\\[\000-\277]|[^\n\\])*", "SRC=eval.c g.c blah blah blah \\\\\n\tapes.c", + SUCCEED, 'found', "SRC=eval.c g.c blah blah blah \\\\"), + + # Test that . only matches \n in DOTALL mode + ('a.b', 'acb', SUCCEED, 'found', 'acb'), + ('a.b', 'a\nb', FAIL), + ('a.*b', 'acc\nccb', FAIL), + ('a.{4,5}b', 'acc\nccb', FAIL), + ('a.b', 'a\rb', SUCCEED, 'found', 'a\rb'), + ('a.b(?s)', 'a\nb', SUCCEED, 'found', 'a\nb'), + ('a.*(?s)b', 'acc\nccb', SUCCEED, 'found', 'acc\nccb'), + ('(?s)a.{4,5}b', 'acc\nccb', SUCCEED, 'found', 'acc\nccb'), + ('(?s)a.b', 'a\nb', SUCCEED, 'found', 'a\nb'), + + (')', '', SYNTAX_ERROR), # Unmatched right bracket + ('', '', SUCCEED, 'found', ''), # Empty pattern + ('abc', 'abc', SUCCEED, 'found', 'abc'), + ('abc', 'xbc', FAIL), + ('abc', 'axc', FAIL), + ('abc', 'abx', FAIL), + ('abc', 'xabcy', SUCCEED, 'found', 'abc'), + ('abc', 'ababc', SUCCEED, 'found', 'abc'), + ('ab*c', 'abc', SUCCEED, 'found', 'abc'), + ('ab*bc', 'abc', SUCCEED, 'found', 'abc'), + ('ab*bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab*bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab+bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab+bc', 'abc', FAIL), + ('ab+bc', 'abq', FAIL), + ('ab+bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab?bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab?bc', 'abc', SUCCEED, 'found', 'abc'), + ('ab?bc', 'abbbbc', FAIL), + ('ab?c', 'abc', SUCCEED, 'found', 'abc'), + ('^abc$', 'abc', SUCCEED, 'found', 'abc'), + ('^abc$', 'abcc', FAIL), + ('^abc', 'abcc', SUCCEED, 'found', 'abc'), + ('^abc$', 'aabc', FAIL), + ('abc$', 'aabc', SUCCEED, 'found', 'abc'), + ('^', 'abc', SUCCEED, 'found+"-"', '-'), + ('$', 'abc', SUCCEED, 'found+"-"', '-'), + ('a.c', 'abc', SUCCEED, 'found', 'abc'), + ('a.c', 'axc', SUCCEED, 'found', 'axc'), + ('a.*c', 'axyzc', SUCCEED, 'found', 'axyzc'), + ('a.*c', 'axyzd', FAIL), + ('a[bc]d', 'abc', FAIL), + ('a[bc]d', 'abd', SUCCEED, 'found', 'abd'), + ('a[b-d]e', 'abd', FAIL), + ('a[b-d]e', 'ace', SUCCEED, 'found', 'ace'), + ('a[b-d]', 'aac', SUCCEED, 'found', 'ac'), + ('a[-b]', 'a-', SUCCEED, 'found', 'a-'), + ('a[\\-b]', 'a-', SUCCEED, 'found', 'a-'), + # NOTE: not an error under PCRE/PRE: + # ('a[b-]', 'a-', SYNTAX_ERROR), + ('a[]b', '-', SYNTAX_ERROR), + ('a[', '-', SYNTAX_ERROR), + ('a\\', '-', SYNTAX_ERROR), + ('abc)', '-', SYNTAX_ERROR), + ('(abc', '-', SYNTAX_ERROR), + ('a]', 'a]', SUCCEED, 'found', 'a]'), + ('a[]]b', 'a]b', SUCCEED, 'found', 'a]b'), + ('a[\]]b', 'a]b', SUCCEED, 'found', 'a]b'), + ('a[^bc]d', 'aed', SUCCEED, 'found', 'aed'), + ('a[^bc]d', 'abd', FAIL), + ('a[^-b]c', 'adc', SUCCEED, 'found', 'adc'), + ('a[^-b]c', 'a-c', FAIL), + ('a[^]b]c', 'a]c', FAIL), + ('a[^]b]c', 'adc', SUCCEED, 'found', 'adc'), + ('\\ba\\b', 'a-', SUCCEED, '"-"', '-'), + ('\\ba\\b', '-a', SUCCEED, '"-"', '-'), + ('\\ba\\b', '-a-', SUCCEED, '"-"', '-'), + ('\\by\\b', 'xy', FAIL), + ('\\by\\b', 'yz', FAIL), + ('\\by\\b', 'xyz', FAIL), + ('x\\b', 'xyz', FAIL), + ('x\\B', 'xyz', SUCCEED, '"-"', '-'), + ('\\Bz', 'xyz', SUCCEED, '"-"', '-'), + ('z\\B', 'xyz', FAIL), + ('\\Bx', 'xyz', FAIL), + ('\\Ba\\B', 'a-', FAIL, '"-"', '-'), + ('\\Ba\\B', '-a', FAIL, '"-"', '-'), + ('\\Ba\\B', '-a-', FAIL, '"-"', '-'), + ('\\By\\B', 'xy', FAIL), + ('\\By\\B', 'yz', FAIL), + ('\\By\\b', 'xy', SUCCEED, '"-"', '-'), + ('\\by\\B', 'yz', SUCCEED, '"-"', '-'), + ('\\By\\B', 'xyz', SUCCEED, '"-"', '-'), + ('ab|cd', 'abc', SUCCEED, 'found', 'ab'), + ('ab|cd', 'abcd', SUCCEED, 'found', 'ab'), + ('()ef', 'def', SUCCEED, 'found+"-"+g1', 'ef-'), + ('$b', 'b', FAIL), + ('a\\(b', 'a(b', SUCCEED, 'found+"-"+g1', 'a(b-Error'), + ('a\\(*b', 'ab', SUCCEED, 'found', 'ab'), + ('a\\(*b', 'a((b', SUCCEED, 'found', 'a((b'), + ('a\\\\b', 'a\\b', SUCCEED, 'found', 'a\\b'), + ('((a))', 'abc', SUCCEED, 'found+"-"+g1+"-"+g2', 'a-a-a'), + ('(a)b(c)', 'abc', SUCCEED, 'found+"-"+g1+"-"+g2', 'abc-a-c'), + ('a+b+c', 'aabbabc', SUCCEED, 'found', 'abc'), + ('(a+|b)*', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b)+', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b)?', 'ab', SUCCEED, 'found+"-"+g1', 'a-a'), + (')(', '-', SYNTAX_ERROR), + ('[^ab]*', 'cde', SUCCEED, 'found', 'cde'), + ('abc', '', FAIL), + ('a*', '', SUCCEED, 'found', ''), + ('a|b|c|d|e', 'e', SUCCEED, 'found', 'e'), + ('(a|b|c|d|e)f', 'ef', SUCCEED, 'found+"-"+g1', 'ef-e'), + ('abcd*efg', 'abcdefg', SUCCEED, 'found', 'abcdefg'), + ('ab*', 'xabyabbbz', SUCCEED, 'found', 'ab'), + ('ab*', 'xayabbbz', SUCCEED, 'found', 'a'), + ('(ab|cd)e', 'abcde', SUCCEED, 'found+"-"+g1', 'cde-cd'), + ('[abhgefdc]ij', 'hij', SUCCEED, 'found', 'hij'), + ('^(ab|cd)e', 'abcde', FAIL, 'xg1y', 'xy'), + ('(abc|)ef', 'abcdef', SUCCEED, 'found+"-"+g1', 'ef-'), + ('(a|b)c*d', 'abcd', SUCCEED, 'found+"-"+g1', 'bcd-b'), + ('(ab|ab*)bc', 'abc', SUCCEED, 'found+"-"+g1', 'abc-a'), + ('a([bc]*)c*', 'abc', SUCCEED, 'found+"-"+g1', 'abc-bc'), + ('a([bc]*)(c*d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), + ('a([bc]+)(c*d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), + ('a([bc]*)(c+d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-b-cd'), + ('a[bcd]*dcdcde', 'adcdcde', SUCCEED, 'found', 'adcdcde'), + ('a[bcd]+dcdcde', 'adcdcde', FAIL), + ('(ab|a)b*c', 'abc', SUCCEED, 'found+"-"+g1', 'abc-ab'), + ('((a)(b)c)(d)', 'abcd', SUCCEED, 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d'), + ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', SUCCEED, 'found', 'alpha'), + ('^a(bc+|b[eh])g|.h$', 'abh', SUCCEED, 'found+"-"+g1', 'bh-None'), + ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', SUCCEED, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), + ('(bc+d$|ef*g.|h?i(j|k))', 'ij', SUCCEED, 'found+"-"+g1+"-"+g2', 'ij-ij-j'), + ('(bc+d$|ef*g.|h?i(j|k))', 'effg', FAIL), + ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', FAIL), + ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', SUCCEED, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), + ('(((((((((a)))))))))', 'a', SUCCEED, 'found', 'a'), + ('multiple words of text', 'uh-uh', FAIL), + ('multiple words', 'multiple words, yeah', SUCCEED, 'found', 'multiple words'), + ('(.*)c(.*)', 'abcde', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcde-ab-de'), + ('\\((.*), (.*)\\)', '(a, b)', SUCCEED, 'g2+"-"+g1', 'b-a'), + ('[k]', 'ab', FAIL), + ('a[-]?c', 'ac', SUCCEED, 'found', 'ac'), + ('(abc)\\1', 'abcabc', SUCCEED, 'g1', 'abc'), + ('([a-c]*)\\1', 'abcabc', SUCCEED, 'g1', 'abc'), + ('^(.+)?B', 'AB', SUCCEED, 'g1', 'A'), + ('(a+).\\1$', 'aaaaa', SUCCEED, 'found+"-"+g1', 'aaaaa-aa'), + ('^(a+).\\1$', 'aaaa', FAIL), + ('(abc)\\1', 'abcabc', SUCCEED, 'found+"-"+g1', 'abcabc-abc'), + ('([a-c]+)\\1', 'abcabc', SUCCEED, 'found+"-"+g1', 'abcabc-abc'), + ('(a)\\1', 'aa', SUCCEED, 'found+"-"+g1', 'aa-a'), + ('(a+)\\1', 'aa', SUCCEED, 'found+"-"+g1', 'aa-a'), + ('(a+)+\\1', 'aa', SUCCEED, 'found+"-"+g1', 'aa-a'), + ('(a).+\\1', 'aba', SUCCEED, 'found+"-"+g1', 'aba-a'), + ('(a)ba*\\1', 'aba', SUCCEED, 'found+"-"+g1', 'aba-a'), + ('(aa|a)a\\1$', 'aaa', SUCCEED, 'found+"-"+g1', 'aaa-a'), + ('(a|aa)a\\1$', 'aaa', SUCCEED, 'found+"-"+g1', 'aaa-a'), + ('(a+)a\\1$', 'aaa', SUCCEED, 'found+"-"+g1', 'aaa-a'), + ('([abc]*)\\1', 'abcabc', SUCCEED, 'found+"-"+g1', 'abcabc-abc'), + ('(a)(b)c|ab', 'ab', SUCCEED, 'found+"-"+g1+"-"+g2', 'ab-None-None'), + ('(a)+x', 'aaax', SUCCEED, 'found+"-"+g1', 'aaax-a'), + ('([ac])+x', 'aacx', SUCCEED, 'found+"-"+g1', 'aacx-c'), + ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', SUCCEED, 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/'), + ('([^.]*)\\.([^:]*):[T ]+(.*)', 'track1.title:TBlah blah blah', SUCCEED, 'found+"-"+g1+"-"+g2+"-"+g3', 'track1.title:TBlah blah blah-track1-title-Blah blah blah'), + ('([^N]*N)+', 'abNNxyzN', SUCCEED, 'found+"-"+g1', 'abNNxyzN-xyzN'), + ('([^N]*N)+', 'abNNxyz', SUCCEED, 'found+"-"+g1', 'abNN-N'), + ('([abc]*)x', 'abcx', SUCCEED, 'found+"-"+g1', 'abcx-abc'), + ('([abc]*)x', 'abc', FAIL), + ('([xyz]*)x', 'abcx', SUCCEED, 'found+"-"+g1', 'x-'), + ('(a)+b|aac', 'aac', SUCCEED, 'found+"-"+g1', 'aac-None'), + + # Test symbolic groups + + ('(?Paaa)a', 'aaaa', SYNTAX_ERROR), + ('(?Paaa)a', 'aaaa', SUCCEED, 'found+"-"+id', 'aaaa-aaa'), + ('(?Paa)(?P=id)', 'aaaa', SUCCEED, 'found+"-"+id', 'aaaa-aa'), + ('(?Paa)(?P=xd)', 'aaaa', SYNTAX_ERROR), + + # Test octal escapes/memory references + + ('\\1', 'a', SYNTAX_ERROR), + ('\\09', chr(0) + '9', SUCCEED, 'found', chr(0) + '9'), + ('\\141', 'a', SUCCEED, 'found', 'a'), + ('(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\119', 'abcdefghijklk9', SUCCEED, 'found+"-"+g11', 'abcdefghijklk9-k'), + + # All tests from Perl + + ('abc', 'abc', SUCCEED, 'found', 'abc'), + ('abc', 'xbc', FAIL), + ('abc', 'axc', FAIL), + ('abc', 'abx', FAIL), + ('abc', 'xabcy', SUCCEED, 'found', 'abc'), + ('abc', 'ababc', SUCCEED, 'found', 'abc'), + ('ab*c', 'abc', SUCCEED, 'found', 'abc'), + ('ab*bc', 'abc', SUCCEED, 'found', 'abc'), + ('ab*bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab*bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab{0,}bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab+bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab+bc', 'abc', FAIL), + ('ab+bc', 'abq', FAIL), + ('ab{1,}bc', 'abq', FAIL), + ('ab+bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab{1,}bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab{1,3}bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab{3,4}bc', 'abbbbc', SUCCEED, 'found', 'abbbbc'), + ('ab{4,5}bc', 'abbbbc', FAIL), + ('ab?bc', 'abbc', SUCCEED, 'found', 'abbc'), + ('ab?bc', 'abc', SUCCEED, 'found', 'abc'), + ('ab{0,1}bc', 'abc', SUCCEED, 'found', 'abc'), + ('ab?bc', 'abbbbc', FAIL), + ('ab?c', 'abc', SUCCEED, 'found', 'abc'), + ('ab{0,1}c', 'abc', SUCCEED, 'found', 'abc'), + ('^abc$', 'abc', SUCCEED, 'found', 'abc'), + ('^abc$', 'abcc', FAIL), + ('^abc', 'abcc', SUCCEED, 'found', 'abc'), + ('^abc$', 'aabc', FAIL), + ('abc$', 'aabc', SUCCEED, 'found', 'abc'), + ('^', 'abc', SUCCEED, 'found', ''), + ('$', 'abc', SUCCEED, 'found', ''), + ('a.c', 'abc', SUCCEED, 'found', 'abc'), + ('a.c', 'axc', SUCCEED, 'found', 'axc'), + ('a.*c', 'axyzc', SUCCEED, 'found', 'axyzc'), + ('a.*c', 'axyzd', FAIL), + ('a[bc]d', 'abc', FAIL), + ('a[bc]d', 'abd', SUCCEED, 'found', 'abd'), + ('a[b-d]e', 'abd', FAIL), + ('a[b-d]e', 'ace', SUCCEED, 'found', 'ace'), + ('a[b-d]', 'aac', SUCCEED, 'found', 'ac'), + ('a[-b]', 'a-', SUCCEED, 'found', 'a-'), + ('a[b-]', 'a-', SUCCEED, 'found', 'a-'), + ('a[b-a]', '-', SYNTAX_ERROR), + ('a[]b', '-', SYNTAX_ERROR), + ('a[', '-', SYNTAX_ERROR), + ('a]', 'a]', SUCCEED, 'found', 'a]'), + ('a[]]b', 'a]b', SUCCEED, 'found', 'a]b'), + ('a[^bc]d', 'aed', SUCCEED, 'found', 'aed'), + ('a[^bc]d', 'abd', FAIL), + ('a[^-b]c', 'adc', SUCCEED, 'found', 'adc'), + ('a[^-b]c', 'a-c', FAIL), + ('a[^]b]c', 'a]c', FAIL), + ('a[^]b]c', 'adc', SUCCEED, 'found', 'adc'), + ('ab|cd', 'abc', SUCCEED, 'found', 'ab'), + ('ab|cd', 'abcd', SUCCEED, 'found', 'ab'), + ('()ef', 'def', SUCCEED, 'found+"-"+g1', 'ef-'), + ('*a', '-', SYNTAX_ERROR), + ('(*)b', '-', SYNTAX_ERROR), + ('$b', 'b', FAIL), + ('a\\', '-', SYNTAX_ERROR), + ('a\\(b', 'a(b', SUCCEED, 'found+"-"+g1', 'a(b-Error'), + ('a\\(*b', 'ab', SUCCEED, 'found', 'ab'), + ('a\\(*b', 'a((b', SUCCEED, 'found', 'a((b'), + ('a\\\\b', 'a\\b', SUCCEED, 'found', 'a\\b'), + ('abc)', '-', SYNTAX_ERROR), + ('(abc', '-', SYNTAX_ERROR), + ('((a))', 'abc', SUCCEED, 'found+"-"+g1+"-"+g2', 'a-a-a'), + ('(a)b(c)', 'abc', SUCCEED, 'found+"-"+g1+"-"+g2', 'abc-a-c'), + ('a+b+c', 'aabbabc', SUCCEED, 'found', 'abc'), + ('a{1,}b{1,}c', 'aabbabc', SUCCEED, 'found', 'abc'), + ('a**', '-', SYNTAX_ERROR), + ('a.+?c', 'abcabc', SUCCEED, 'found', 'abc'), + ('(a+|b)*', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b){0,}', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b)+', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b){1,}', 'ab', SUCCEED, 'found+"-"+g1', 'ab-b'), + ('(a+|b)?', 'ab', SUCCEED, 'found+"-"+g1', 'a-a'), + ('(a+|b){0,1}', 'ab', SUCCEED, 'found+"-"+g1', 'a-a'), + (')(', '-', SYNTAX_ERROR), + ('[^ab]*', 'cde', SUCCEED, 'found', 'cde'), + ('abc', '', FAIL), + ('a*', '', SUCCEED, 'found', ''), + ('([abc])*d', 'abbbcd', SUCCEED, 'found+"-"+g1', 'abbbcd-c'), + ('([abc])*bcd', 'abcd', SUCCEED, 'found+"-"+g1', 'abcd-a'), + ('a|b|c|d|e', 'e', SUCCEED, 'found', 'e'), + ('(a|b|c|d|e)f', 'ef', SUCCEED, 'found+"-"+g1', 'ef-e'), + ('abcd*efg', 'abcdefg', SUCCEED, 'found', 'abcdefg'), + ('ab*', 'xabyabbbz', SUCCEED, 'found', 'ab'), + ('ab*', 'xayabbbz', SUCCEED, 'found', 'a'), + ('(ab|cd)e', 'abcde', SUCCEED, 'found+"-"+g1', 'cde-cd'), + ('[abhgefdc]ij', 'hij', SUCCEED, 'found', 'hij'), + ('^(ab|cd)e', 'abcde', FAIL), + ('(abc|)ef', 'abcdef', SUCCEED, 'found+"-"+g1', 'ef-'), + ('(a|b)c*d', 'abcd', SUCCEED, 'found+"-"+g1', 'bcd-b'), + ('(ab|ab*)bc', 'abc', SUCCEED, 'found+"-"+g1', 'abc-a'), + ('a([bc]*)c*', 'abc', SUCCEED, 'found+"-"+g1', 'abc-bc'), + ('a([bc]*)(c*d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), + ('a([bc]+)(c*d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), + ('a([bc]*)(c+d)', 'abcd', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcd-b-cd'), + ('a[bcd]*dcdcde', 'adcdcde', SUCCEED, 'found', 'adcdcde'), + ('a[bcd]+dcdcde', 'adcdcde', FAIL), + ('(ab|a)b*c', 'abc', SUCCEED, 'found+"-"+g1', 'abc-ab'), + ('((a)(b)c)(d)', 'abcd', SUCCEED, 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d'), + ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', SUCCEED, 'found', 'alpha'), + ('^a(bc+|b[eh])g|.h$', 'abh', SUCCEED, 'found+"-"+g1', 'bh-None'), + ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', SUCCEED, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), + ('(bc+d$|ef*g.|h?i(j|k))', 'ij', SUCCEED, 'found+"-"+g1+"-"+g2', 'ij-ij-j'), + ('(bc+d$|ef*g.|h?i(j|k))', 'effg', FAIL), + ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', FAIL), + ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', SUCCEED, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), + ('((((((((((a))))))))))', 'a', SUCCEED, 'g10', 'a'), + ('((((((((((a))))))))))\\10', 'aa', SUCCEED, 'found', 'aa'), +# Python does not have the same rules for \\41 so this is a syntax error +# ('((((((((((a))))))))))\\41', 'aa', FAIL), +# ('((((((((((a))))))))))\\41', 'a!', SUCCEED, 'found', 'a!'), + ('((((((((((a))))))))))\\41', '', SYNTAX_ERROR), + ('(?i)((((((((((a))))))))))\\41', '', SYNTAX_ERROR), + ('(((((((((a)))))))))', 'a', SUCCEED, 'found', 'a'), + ('multiple words of text', 'uh-uh', FAIL), + ('multiple words', 'multiple words, yeah', SUCCEED, 'found', 'multiple words'), + ('(.*)c(.*)', 'abcde', SUCCEED, 'found+"-"+g1+"-"+g2', 'abcde-ab-de'), + ('\\((.*), (.*)\\)', '(a, b)', SUCCEED, 'g2+"-"+g1', 'b-a'), + ('[k]', 'ab', FAIL), + ('a[-]?c', 'ac', SUCCEED, 'found', 'ac'), + ('(abc)\\1', 'abcabc', SUCCEED, 'g1', 'abc'), + ('([a-c]*)\\1', 'abcabc', SUCCEED, 'g1', 'abc'), + ('(?i)abc', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)abc', 'XBC', FAIL), + ('(?i)abc', 'AXC', FAIL), + ('(?i)abc', 'ABX', FAIL), + ('(?i)abc', 'XABCY', SUCCEED, 'found', 'ABC'), + ('(?i)abc', 'ABABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab*c', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab*bc', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab*bc', 'ABBC', SUCCEED, 'found', 'ABBC'), + ('(?i)ab*?bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab{0,}?bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab+?bc', 'ABBC', SUCCEED, 'found', 'ABBC'), + ('(?i)ab+bc', 'ABC', FAIL), + ('(?i)ab+bc', 'ABQ', FAIL), + ('(?i)ab{1,}bc', 'ABQ', FAIL), + ('(?i)ab+bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab{1,}?bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab{1,3}?bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab{3,4}?bc', 'ABBBBC', SUCCEED, 'found', 'ABBBBC'), + ('(?i)ab{4,5}?bc', 'ABBBBC', FAIL), + ('(?i)ab??bc', 'ABBC', SUCCEED, 'found', 'ABBC'), + ('(?i)ab??bc', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab{0,1}?bc', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab??bc', 'ABBBBC', FAIL), + ('(?i)ab??c', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)ab{0,1}?c', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)^abc$', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)^abc$', 'ABCC', FAIL), + ('(?i)^abc', 'ABCC', SUCCEED, 'found', 'ABC'), + ('(?i)^abc$', 'AABC', FAIL), + ('(?i)abc$', 'AABC', SUCCEED, 'found', 'ABC'), + ('(?i)^', 'ABC', SUCCEED, 'found', ''), + ('(?i)$', 'ABC', SUCCEED, 'found', ''), + ('(?i)a.c', 'ABC', SUCCEED, 'found', 'ABC'), + ('(?i)a.c', 'AXC', SUCCEED, 'found', 'AXC'), + ('(?i)a.*?c', 'AXYZC', SUCCEED, 'found', 'AXYZC'), + ('(?i)a.*c', 'AXYZD', FAIL), + ('(?i)a[bc]d', 'ABC', FAIL), + ('(?i)a[bc]d', 'ABD', SUCCEED, 'found', 'ABD'), + ('(?i)a[b-d]e', 'ABD', FAIL), + ('(?i)a[b-d]e', 'ACE', SUCCEED, 'found', 'ACE'), + ('(?i)a[b-d]', 'AAC', SUCCEED, 'found', 'AC'), + ('(?i)a[-b]', 'A-', SUCCEED, 'found', 'A-'), + ('(?i)a[b-]', 'A-', SUCCEED, 'found', 'A-'), + ('(?i)a[b-a]', '-', SYNTAX_ERROR), + ('(?i)a[]b', '-', SYNTAX_ERROR), + ('(?i)a[', '-', SYNTAX_ERROR), + ('(?i)a]', 'A]', SUCCEED, 'found', 'A]'), + ('(?i)a[]]b', 'A]B', SUCCEED, 'found', 'A]B'), + ('(?i)a[^bc]d', 'AED', SUCCEED, 'found', 'AED'), + ('(?i)a[^bc]d', 'ABD', FAIL), + ('(?i)a[^-b]c', 'ADC', SUCCEED, 'found', 'ADC'), + ('(?i)a[^-b]c', 'A-C', FAIL), + ('(?i)a[^]b]c', 'A]C', FAIL), + ('(?i)a[^]b]c', 'ADC', SUCCEED, 'found', 'ADC'), + ('(?i)ab|cd', 'ABC', SUCCEED, 'found', 'AB'), + ('(?i)ab|cd', 'ABCD', SUCCEED, 'found', 'AB'), + ('(?i)()ef', 'DEF', SUCCEED, 'found+"-"+g1', 'EF-'), + ('(?i)*a', '-', SYNTAX_ERROR), + ('(?i)(*)b', '-', SYNTAX_ERROR), + ('(?i)$b', 'B', FAIL), + ('(?i)a\\', '-', SYNTAX_ERROR), + ('(?i)a\\(b', 'A(B', SUCCEED, 'found+"-"+g1', 'A(B-Error'), + ('(?i)a\\(*b', 'AB', SUCCEED, 'found', 'AB'), + ('(?i)a\\(*b', 'A((B', SUCCEED, 'found', 'A((B'), + ('(?i)a\\\\b', 'A\\B', SUCCEED, 'found', 'A\\B'), + ('(?i)abc)', '-', SYNTAX_ERROR), + ('(?i)(abc', '-', SYNTAX_ERROR), + ('(?i)((a))', 'ABC', SUCCEED, 'found+"-"+g1+"-"+g2', 'A-A-A'), + ('(?i)(a)b(c)', 'ABC', SUCCEED, 'found+"-"+g1+"-"+g2', 'ABC-A-C'), + ('(?i)a+b+c', 'AABBABC', SUCCEED, 'found', 'ABC'), + ('(?i)a{1,}b{1,}c', 'AABBABC', SUCCEED, 'found', 'ABC'), + ('(?i)a**', '-', SYNTAX_ERROR), + ('(?i)a.+?c', 'ABCABC', SUCCEED, 'found', 'ABC'), + ('(?i)a.*?c', 'ABCABC', SUCCEED, 'found', 'ABC'), + ('(?i)a.{0,5}?c', 'ABCABC', SUCCEED, 'found', 'ABC'), + ('(?i)(a+|b)*', 'AB', SUCCEED, 'found+"-"+g1', 'AB-B'), + ('(?i)(a+|b){0,}', 'AB', SUCCEED, 'found+"-"+g1', 'AB-B'), + ('(?i)(a+|b)+', 'AB', SUCCEED, 'found+"-"+g1', 'AB-B'), + ('(?i)(a+|b){1,}', 'AB', SUCCEED, 'found+"-"+g1', 'AB-B'), + ('(?i)(a+|b)?', 'AB', SUCCEED, 'found+"-"+g1', 'A-A'), + ('(?i)(a+|b){0,1}', 'AB', SUCCEED, 'found+"-"+g1', 'A-A'), + ('(?i)(a+|b){0,1}?', 'AB', SUCCEED, 'found+"-"+g1', '-None'), + ('(?i))(', '-', SYNTAX_ERROR), + ('(?i)[^ab]*', 'CDE', SUCCEED, 'found', 'CDE'), + ('(?i)abc', '', FAIL), + ('(?i)a*', '', SUCCEED, 'found', ''), + ('(?i)([abc])*d', 'ABBBCD', SUCCEED, 'found+"-"+g1', 'ABBBCD-C'), + ('(?i)([abc])*bcd', 'ABCD', SUCCEED, 'found+"-"+g1', 'ABCD-A'), + ('(?i)a|b|c|d|e', 'E', SUCCEED, 'found', 'E'), + ('(?i)(a|b|c|d|e)f', 'EF', SUCCEED, 'found+"-"+g1', 'EF-E'), + ('(?i)abcd*efg', 'ABCDEFG', SUCCEED, 'found', 'ABCDEFG'), + ('(?i)ab*', 'XABYABBBZ', SUCCEED, 'found', 'AB'), + ('(?i)ab*', 'XAYABBBZ', SUCCEED, 'found', 'A'), + ('(?i)(ab|cd)e', 'ABCDE', SUCCEED, 'found+"-"+g1', 'CDE-CD'), + ('(?i)[abhgefdc]ij', 'HIJ', SUCCEED, 'found', 'HIJ'), + ('(?i)^(ab|cd)e', 'ABCDE', FAIL), + ('(?i)(abc|)ef', 'ABCDEF', SUCCEED, 'found+"-"+g1', 'EF-'), + ('(?i)(a|b)c*d', 'ABCD', SUCCEED, 'found+"-"+g1', 'BCD-B'), + ('(?i)(ab|ab*)bc', 'ABC', SUCCEED, 'found+"-"+g1', 'ABC-A'), + ('(?i)a([bc]*)c*', 'ABC', SUCCEED, 'found+"-"+g1', 'ABC-BC'), + ('(?i)a([bc]*)(c*d)', 'ABCD', SUCCEED, 'found+"-"+g1+"-"+g2', 'ABCD-BC-D'), + ('(?i)a([bc]+)(c*d)', 'ABCD', SUCCEED, 'found+"-"+g1+"-"+g2', 'ABCD-BC-D'), + ('(?i)a([bc]*)(c+d)', 'ABCD', SUCCEED, 'found+"-"+g1+"-"+g2', 'ABCD-B-CD'), + ('(?i)a[bcd]*dcdcde', 'ADCDCDE', SUCCEED, 'found', 'ADCDCDE'), + ('(?i)a[bcd]+dcdcde', 'ADCDCDE', FAIL), + ('(?i)(ab|a)b*c', 'ABC', SUCCEED, 'found+"-"+g1', 'ABC-AB'), + ('(?i)((a)(b)c)(d)', 'ABCD', SUCCEED, 'g1+"-"+g2+"-"+g3+"-"+g4', 'ABC-A-B-D'), + ('(?i)[a-zA-Z_][a-zA-Z0-9_]*', 'ALPHA', SUCCEED, 'found', 'ALPHA'), + ('(?i)^a(bc+|b[eh])g|.h$', 'ABH', SUCCEED, 'found+"-"+g1', 'BH-None'), + ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFGZ', SUCCEED, 'found+"-"+g1+"-"+g2', 'EFFGZ-EFFGZ-None'), + ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'IJ', SUCCEED, 'found+"-"+g1+"-"+g2', 'IJ-IJ-J'), + ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFG', FAIL), + ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'BCDD', FAIL), + ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'REFFGZ', SUCCEED, 'found+"-"+g1+"-"+g2', 'EFFGZ-EFFGZ-None'), + ('(?i)((((((((((a))))))))))', 'A', SUCCEED, 'g10', 'A'), + ('(?i)((((((((((a))))))))))\\10', 'AA', SUCCEED, 'found', 'AA'), + #('(?i)((((((((((a))))))))))\\41', 'AA', FAIL), + #('(?i)((((((((((a))))))))))\\41', 'A!', SUCCEED, 'found', 'A!'), + ('(?i)(((((((((a)))))))))', 'A', SUCCEED, 'found', 'A'), + ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))', 'A', SUCCEED, 'g1', 'A'), + ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))', 'C', SUCCEED, 'g1', 'C'), + ('(?i)multiple words of text', 'UH-UH', FAIL), + ('(?i)multiple words', 'MULTIPLE WORDS, YEAH', SUCCEED, 'found', 'MULTIPLE WORDS'), + ('(?i)(.*)c(.*)', 'ABCDE', SUCCEED, 'found+"-"+g1+"-"+g2', 'ABCDE-AB-DE'), + ('(?i)\\((.*), (.*)\\)', '(A, B)', SUCCEED, 'g2+"-"+g1', 'B-A'), + ('(?i)[k]', 'AB', FAIL), +# ('(?i)abcd', 'ABCD', SUCCEED, 'found+"-"+\\found+"-"+\\\\found', 'ABCD-$&-\\ABCD'), +# ('(?i)a(bc)d', 'ABCD', SUCCEED, 'g1+"-"+\\g1+"-"+\\\\g1', 'BC-$1-\\BC'), + ('(?i)a[-]?c', 'AC', SUCCEED, 'found', 'AC'), + ('(?i)(abc)\\1', 'ABCABC', SUCCEED, 'g1', 'ABC'), + ('(?i)([a-c]*)\\1', 'ABCABC', SUCCEED, 'g1', 'ABC'), + ('a(?!b).', 'abad', SUCCEED, 'found', 'ad'), + ('a(?=d).', 'abad', SUCCEED, 'found', 'ad'), + ('a(?=c|d).', 'abad', SUCCEED, 'found', 'ad'), + ('a(?:b|c|d)(.)', 'ace', SUCCEED, 'g1', 'e'), + ('a(?:b|c|d)*(.)', 'ace', SUCCEED, 'g1', 'e'), + ('a(?:b|c|d)+?(.)', 'ace', SUCCEED, 'g1', 'e'), + ('a(?:b|(c|e){1,2}?|d)+?(.)', 'ace', SUCCEED, 'g1 + g2', 'ce'), + ('^(.+)?B', 'AB', SUCCEED, 'g1', 'A'), + + # Comments using the (?#...) syntax + + ('w(?# comment', 'w', SYNTAX_ERROR), + ('w(?# comment 1)xy(?# comment 2)z', 'wxyz', SUCCEED, 'found', 'wxyz'), + + # Check odd placement of embedded pattern modifiers + + # not an error under PCRE/PRE: + ('w(?i)', 'W', SUCCEED, 'found', 'W'), + # ('w(?i)', 'W', SYNTAX_ERROR), + + # Comments using the x embedded pattern modifier + + ("""(?x)w# comment 1 + x y + # comment 2 + z""", 'wxyz', SUCCEED, 'found', 'wxyz'), + + # using the m embedded pattern modifier + + ('^abc', """jkl +abc +xyz""", FAIL), + ('(?m)^abc', """jkl +abc +xyz""", SUCCEED, 'found', 'abc'), + + ('(?m)abc$', """jkl +xyzabc +123""", SUCCEED, 'found', 'abc'), + + # using the s embedded pattern modifier + + ('a.b', 'a\nb', FAIL), + ('(?s)a.b', 'a\nb', SUCCEED, 'found', 'a\nb'), + + # test \w, etc. both inside and outside character classes + + ('\\w+', '--ab_cd0123--', SUCCEED, 'found', 'ab_cd0123'), + ('[\\w]+', '--ab_cd0123--', SUCCEED, 'found', 'ab_cd0123'), + ('\\D+', '1234abc5678', SUCCEED, 'found', 'abc'), + ('[\\D]+', '1234abc5678', SUCCEED, 'found', 'abc'), + ('[\\da-fA-F]+', '123abc', SUCCEED, 'found', '123abc'), + # not an error under PCRE/PRE: + # ('[\\d-x]', '-', SYNTAX_ERROR), + (r'([\s]*)([\S]*)([\s]*)', ' testing!1972', SUCCEED, 'g3+g2+g1', 'testing!1972 '), + (r'(\s*)(\S*)(\s*)', ' testing!1972', SUCCEED, 'g3+g2+g1', 'testing!1972 '), + + (r'\xff', '\377', SUCCEED, 'found', chr(255)), + # new \x semantics + (r'\x00ff', '\377', FAIL), + # (r'\x00ff', '\377', SUCCEED, 'found', chr(255)), + (r'\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', SUCCEED, 'found', '\t\n\v\r\f\ag'), + ('\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', SUCCEED, 'found', '\t\n\v\r\f\ag'), + (r'\t\n\v\r\f\a', '\t\n\v\r\f\a', SUCCEED, 'found', chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)), + (r'[\t][\n][\v][\r][\f][\b]', '\t\n\v\r\f\b', SUCCEED, 'found', '\t\n\v\r\f\b'), + + # + # post-1.5.2 additions + + # xmllib problem + (r'(([a-z]+):)?([a-z]+)$', 'smil', SUCCEED, 'g1+"-"+g2+"-"+g3', 'None-None-smil'), + # bug 110866: reference to undefined group + (r'((.)\1+)', '', SYNTAX_ERROR), + # bug 111869: search (PRE/PCRE fails on this one, SRE doesn't) + (r'.*d', 'abc\nabd', SUCCEED, 'found', 'abd'), + # bug 112468: various expected syntax errors + (r'(', '', SYNTAX_ERROR), + (r'[\41]', '!', SUCCEED, 'found', '!'), + # bug 114033: nothing to repeat + (r'(x?)?', 'x', SUCCEED, 'found', 'x'), + # bug 115040: rescan if flags are modified inside pattern + (r' (?x)foo ', 'foo', SUCCEED, 'found', 'foo'), + # bug 115618: negative lookahead + (r'(?]*?b', 'a>b', FAIL), + # bug 490573: minimizing repeat problem + (r'^a*?$', 'foo', FAIL), +] + +try: + u = eval("u'\N{LATIN CAPITAL LETTER A WITH DIAERESIS}'") +except SyntaxError: + pass +else: + tests.extend([ + # bug 410271: \b broken under locales + (r'\b.\b', 'a', SUCCEED, 'found', 'a'), + (r'(?u)\b.\b', u, SUCCEED, 'found', u), + (r'(?u)\w', u, SUCCEED, 'found', u), + ]) diff --git a/lib-python/2.2/test/regex_tests.py b/lib-python/2.2/test/regex_tests.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/regex_tests.py @@ -0,0 +1,287 @@ +# Regex test suite and benchmark suite v1.5a2 +# Due to the use of r"aw" strings, this file will +# only work with Python 1.5 or higher. + +# The 3 possible outcomes for each pattern +[SUCCEED, FAIL, SYNTAX_ERROR] = range(3) + +# Benchmark suite (needs expansion) +# +# The benchmark suite does not test correctness, just speed. The +# first element of each tuple is the regex pattern; the second is a +# string to match it against. The benchmarking code will embed the +# second string inside several sizes of padding, to test how regex +# matching performs on large strings. + +benchmarks = [ + ('Python', 'Python'), # Simple text literal + ('.*Python', 'Python'), # Bad text literal + ('.*Python.*', 'Python'), # Worse text literal + ('.*\\(Python\\)', 'Python'), # Bad text literal with grouping + + ('(Python\\|Perl\\|Tcl', 'Perl'), # Alternation + ('\\(Python\\|Perl\\|Tcl\\)', 'Perl'), # Grouped alternation + ('\\(Python\\)\\1', 'PythonPython'), # Backreference +# ('\\([0a-z][a-z]*,\\)+', 'a5,b7,c9,'), # Disable the fastmap optimization + ('\\([a-z][a-z0-9]*,\\)+', 'a5,b7,c9,') # A few sets +] + +# Test suite (for verifying correctness) +# +# The test suite is a list of 5- or 3-tuples. The 5 parts of a +# complete tuple are: +# element 0: a string containing the pattern +# 1: the string to match against the pattern +# 2: the expected result (SUCCEED, FAIL, SYNTAX_ERROR) +# 3: a string that will be eval()'ed to produce a test string. +# This is an arbitrary Python expression; the available +# variables are "found" (the whole match), and "g1", "g2", ... +# up to "g10" contain the contents of each group, or the +# string 'None' if the group wasn't given a value. +# 4: The expected result of evaluating the expression. +# If the two don't match, an error is reported. +# +# If the regex isn't expected to work, the latter two elements can be omitted. + +tests = [ +('abc', 'abc', SUCCEED, + 'found', 'abc'), +('abc', 'xbc', FAIL), +('abc', 'axc', FAIL), +('abc', 'abx', FAIL), +('abc', 'xabcy', SUCCEED, + 'found', 'abc'), +('abc', 'ababc', SUCCEED, + 'found', 'abc'), +('ab*c', 'abc', SUCCEED, + 'found', 'abc'), +('ab*bc', 'abc', SUCCEED, + 'found', 'abc'), +('ab*bc', 'abbc', SUCCEED, + 'found', 'abbc'), +('ab*bc', 'abbbbc', SUCCEED, + 'found', 'abbbbc'), +('ab+bc', 'abbc', SUCCEED, + 'found', 'abbc'), +('ab+bc', 'abc', FAIL), +('ab+bc', 'abq', FAIL), +('ab+bc', 'abbbbc', SUCCEED, + 'found', 'abbbbc'), +('ab?bc', 'abbc', SUCCEED, + 'found', 'abbc'), +('ab?bc', 'abc', SUCCEED, + 'found', 'abc'), +('ab?bc', 'abbbbc', FAIL), +('ab?c', 'abc', SUCCEED, + 'found', 'abc'), +('^abc$', 'abc', SUCCEED, + 'found', 'abc'), +('^abc$', 'abcc', FAIL), +('^abc', 'abcc', SUCCEED, + 'found', 'abc'), +('^abc$', 'aabc', FAIL), +('abc$', 'aabc', SUCCEED, + 'found', 'abc'), +('^', 'abc', SUCCEED, + 'found+"-"', '-'), +('$', 'abc', SUCCEED, + 'found+"-"', '-'), +('a.c', 'abc', SUCCEED, + 'found', 'abc'), +('a.c', 'axc', SUCCEED, + 'found', 'axc'), +('a.*c', 'axyzc', SUCCEED, + 'found', 'axyzc'), +('a.*c', 'axyzd', FAIL), +('a[bc]d', 'abc', FAIL), +('a[bc]d', 'abd', SUCCEED, + 'found', 'abd'), +('a[b-d]e', 'abd', FAIL), +('a[b-d]e', 'ace', SUCCEED, + 'found', 'ace'), +('a[b-d]', 'aac', SUCCEED, + 'found', 'ac'), +('a[-b]', 'a-', SUCCEED, + 'found', 'a-'), +('a[b-]', 'a-', SUCCEED, + 'found', 'a-'), +('a[]b', '-', SYNTAX_ERROR), +('a[', '-', SYNTAX_ERROR), +('a\\', '-', SYNTAX_ERROR), +('abc\\)', '-', SYNTAX_ERROR), +('\\(abc', '-', SYNTAX_ERROR), +('a]', 'a]', SUCCEED, + 'found', 'a]'), +('a[]]b', 'a]b', SUCCEED, + 'found', 'a]b'), +('a[^bc]d', 'aed', SUCCEED, + 'found', 'aed'), +('a[^bc]d', 'abd', FAIL), +('a[^-b]c', 'adc', SUCCEED, + 'found', 'adc'), +('a[^-b]c', 'a-c', FAIL), +('a[^]b]c', 'a]c', FAIL), +('a[^]b]c', 'adc', SUCCEED, + 'found', 'adc'), +('\\ba\\b', 'a-', SUCCEED, + '"-"', '-'), +('\\ba\\b', '-a', SUCCEED, + '"-"', '-'), +('\\ba\\b', '-a-', SUCCEED, + '"-"', '-'), +('\\by\\b', 'xy', FAIL), +('\\by\\b', 'yz', FAIL), +('\\by\\b', 'xyz', FAIL), +('ab\\|cd', 'abc', SUCCEED, + 'found', 'ab'), +('ab\\|cd', 'abcd', SUCCEED, + 'found', 'ab'), +('\\(\\)ef', 'def', SUCCEED, + 'found+"-"+g1', 'ef-'), +('$b', 'b', FAIL), +('a(b', 'a(b', SUCCEED, + 'found+"-"+g1', 'a(b-None'), +('a(*b', 'ab', SUCCEED, + 'found', 'ab'), +('a(*b', 'a((b', SUCCEED, + 'found', 'a((b'), +('a\\\\b', 'a\\b', SUCCEED, + 'found', 'a\\b'), +('\\(\\(a\\)\\)', 'abc', SUCCEED, + 'found+"-"+g1+"-"+g2', 'a-a-a'), +('\\(a\\)b\\(c\\)', 'abc', SUCCEED, + 'found+"-"+g1+"-"+g2', 'abc-a-c'), +('a+b+c', 'aabbabc', SUCCEED, + 'found', 'abc'), +('\\(a+\\|b\\)*', 'ab', SUCCEED, + 'found+"-"+g1', 'ab-b'), +('\\(a+\\|b\\)+', 'ab', SUCCEED, + 'found+"-"+g1', 'ab-b'), +('\\(a+\\|b\\)?', 'ab', SUCCEED, + 'found+"-"+g1', 'a-a'), +('\\)\\(', '-', SYNTAX_ERROR), +('[^ab]*', 'cde', SUCCEED, + 'found', 'cde'), +('abc', '', FAIL), +('a*', '', SUCCEED, + 'found', ''), +('a\\|b\\|c\\|d\\|e', 'e', SUCCEED, + 'found', 'e'), +('\\(a\\|b\\|c\\|d\\|e\\)f', 'ef', SUCCEED, + 'found+"-"+g1', 'ef-e'), +('abcd*efg', 'abcdefg', SUCCEED, + 'found', 'abcdefg'), +('ab*', 'xabyabbbz', SUCCEED, + 'found', 'ab'), +('ab*', 'xayabbbz', SUCCEED, + 'found', 'a'), +('\\(ab\\|cd\\)e', 'abcde', SUCCEED, + 'found+"-"+g1', 'cde-cd'), +('[abhgefdc]ij', 'hij', SUCCEED, + 'found', 'hij'), +('^\\(ab\\|cd\\)e', 'abcde', FAIL, + 'xg1y', 'xy'), +('\\(abc\\|\\)ef', 'abcdef', SUCCEED, + 'found+"-"+g1', 'ef-'), +('\\(a\\|b\\)c*d', 'abcd', SUCCEED, + 'found+"-"+g1', 'bcd-b'), +('\\(ab\\|ab*\\)bc', 'abc', SUCCEED, + 'found+"-"+g1', 'abc-a'), +('a\\([bc]*\\)c*', 'abc', SUCCEED, + 'found+"-"+g1', 'abc-bc'), +('a\\([bc]*\\)\\(c*d\\)', 'abcd', SUCCEED, + 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), +('a\\([bc]+\\)\\(c*d\\)', 'abcd', SUCCEED, + 'found+"-"+g1+"-"+g2', 'abcd-bc-d'), +('a\\([bc]*\\)\\(c+d\\)', 'abcd', SUCCEED, + 'found+"-"+g1+"-"+g2', 'abcd-b-cd'), +('a[bcd]*dcdcde', 'adcdcde', SUCCEED, + 'found', 'adcdcde'), +('a[bcd]+dcdcde', 'adcdcde', FAIL), +('\\(ab\\|a\\)b*c', 'abc', SUCCEED, + 'found+"-"+g1', 'abc-ab'), +('\\(\\(a\\)\\(b\\)c\\)\\(d\\)', 'abcd', SUCCEED, + 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d'), +('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', SUCCEED, + 'found', 'alpha'), +('^a\\(bc+\\|b[eh]\\)g\\|.h$', 'abh', SUCCEED, + 'found+"-"+g1', 'bh-None'), +('\\(bc+d$\\|ef*g.\\|h?i\\(j\\|k\\)\\)', 'effgz', SUCCEED, + 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), +('\\(bc+d$\\|ef*g.\\|h?i\\(j\\|k\\)\\)', 'ij', SUCCEED, + 'found+"-"+g1+"-"+g2', 'ij-ij-j'), +('\\(bc+d$\\|ef*g.\\|h?i\\(j\\|k\\)\\)', 'effg', FAIL), +('\\(bc+d$\\|ef*g.\\|h?i\\(j\\|k\\)\\)', 'bcdd', FAIL), +('\\(bc+d$\\|ef*g.\\|h?i\\(j\\|k\\)\\)', 'reffgz', SUCCEED, + 'found+"-"+g1+"-"+g2', 'effgz-effgz-None'), +('\\(\\(\\(\\(\\(\\(\\(\\(\\(a\\)\\)\\)\\)\\)\\)\\)\\)\\)', 'a', SUCCEED, + 'found', 'a'), +('multiple words of text', 'uh-uh', FAIL), +('multiple words', 'multiple words, yeah', SUCCEED, + 'found', 'multiple words'), +('\\(.*\\)c\\(.*\\)', 'abcde', SUCCEED, + 'found+"-"+g1+"-"+g2', 'abcde-ab-de'), +('(\\(.*\\), \\(.*\\))', '(a, b)', SUCCEED, + 'g2+"-"+g1', 'b-a'), +('[k]', 'ab', FAIL), +('a[-]?c', 'ac', SUCCEED, + 'found', 'ac'), +('\\(abc\\)\\1', 'abcabc', SUCCEED, + 'g1', 'abc'), +('\\([a-c]*\\)\\1', 'abcabc', SUCCEED, + 'g1', 'abc'), +('^\\(.+\\)?B', 'AB', SUCCEED, + 'g1', 'A'), +('\\(a+\\).\\1$', 'aaaaa', SUCCEED, + 'found+"-"+g1', 'aaaaa-aa'), +('^\\(a+\\).\\1$', 'aaaa', FAIL), +('\\(abc\\)\\1', 'abcabc', SUCCEED, + 'found+"-"+g1', 'abcabc-abc'), +('\\([a-c]+\\)\\1', 'abcabc', SUCCEED, + 'found+"-"+g1', 'abcabc-abc'), +('\\(a\\)\\1', 'aa', SUCCEED, + 'found+"-"+g1', 'aa-a'), +('\\(a+\\)\\1', 'aa', SUCCEED, + 'found+"-"+g1', 'aa-a'), +('\\(a+\\)+\\1', 'aa', SUCCEED, + 'found+"-"+g1', 'aa-a'), +('\\(a\\).+\\1', 'aba', SUCCEED, + 'found+"-"+g1', 'aba-a'), +('\\(a\\)ba*\\1', 'aba', SUCCEED, + 'found+"-"+g1', 'aba-a'), +('\\(aa\\|a\\)a\\1$', 'aaa', SUCCEED, + 'found+"-"+g1', 'aaa-a'), +('\\(a\\|aa\\)a\\1$', 'aaa', SUCCEED, + 'found+"-"+g1', 'aaa-a'), +('\\(a+\\)a\\1$', 'aaa', SUCCEED, + 'found+"-"+g1', 'aaa-a'), +('\\([abc]*\\)\\1', 'abcabc', SUCCEED, + 'found+"-"+g1', 'abcabc-abc'), +('\\(a\\)\\(b\\)c\\|ab', 'ab', SUCCEED, + 'found+"-"+g1+"-"+g2', 'ab-None-None'), +('\\(a\\)+x', 'aaax', SUCCEED, + 'found+"-"+g1', 'aaax-a'), +('\\([ac]\\)+x', 'aacx', SUCCEED, + 'found+"-"+g1', 'aacx-c'), +('\\([^/]*/\\)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', SUCCEED, + 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/'), +('\\([^.]*\\)\\.\\([^:]*\\):[T ]+\\(.*\\)', 'track1.title:TBlah blah blah', SUCCEED, + 'found+"-"+g1+"-"+g2+"-"+g3', 'track1.title:TBlah blah blah-track1-title-Blah blah blah'), +('\\([^N]*N\\)+', 'abNNxyzN', SUCCEED, + 'found+"-"+g1', 'abNNxyzN-xyzN'), +('\\([^N]*N\\)+', 'abNNxyz', SUCCEED, + 'found+"-"+g1', 'abNN-N'), +('\\([abc]*\\)x', 'abcx', SUCCEED, + 'found+"-"+g1', 'abcx-abc'), +('\\([abc]*\\)x', 'abc', FAIL), +('\\([xyz]*\\)x', 'abcx', SUCCEED, + 'found+"-"+g1', 'x-'), +('\\(a\\)+b\\|aac', 'aac', SUCCEED, + 'found+"-"+g1', 'aac-None'), +('\', 'ab', FAIL), +('a\>', 'a!', SUCCEED, 'found', 'a'), +('a\>', 'a', SUCCEED, 'found', 'a'), +] diff --git a/lib-python/2.2/test/regrtest.py b/lib-python/2.2/test/regrtest.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/regrtest.py @@ -0,0 +1,832 @@ +#! /usr/bin/env python + +"""Regression test. + +This will find all modules whose name is "test_*" in the test +directory, and run them. Various command line options provide +additional facilities. + +Command line options: + +-v: verbose -- run tests in verbose mode with output to stdout +-q: quiet -- don't print anything except if a test fails +-g: generate -- write the output file for a test instead of comparing it +-x: exclude -- arguments are tests to *exclude* +-s: single -- run only a single test (see below) +-r: random -- randomize test execution order +-l: findleaks -- if GC is available detect tests that leak memory +-u: use -- specify which special resource intensive tests to run +-h: help -- print this text and exit + +If non-option arguments are present, they are names for tests to run, +unless -x is given, in which case they are names for tests not to run. +If no test names are given, all tests are run. + +-v is incompatible with -g and does not compare test output files. + +-s means to run only a single test and exit. This is useful when +doing memory analysis on the Python interpreter (which tend to consume +too many resources to run the full regression test non-stop). The +file /tmp/pynexttest is read to find the next test to run. If this +file is missing, the first test_*.py file in testdir or on the command +line is used. (actually tempfile.gettempdir() is used instead of +/tmp). + +-u is used to specify which special resource intensive tests to run, +such as those requiring large file support or network connectivity. +The argument is a comma-separated list of words indicating the +resources to test. Currently only the following are defined: + + all - Enable all special resources. + + curses - Tests that use curses and will modify the terminal's + state and output modes. + + largefile - It is okay to run some test that may create huge + files. These tests can take a long time and may + consume >2GB of disk space temporarily. + + network - It is okay to run tests that use external network + resource, e.g. testing SSL support for sockets. + +To enable all resources except one, use '-uall,-'. For +example, to run all the tests except for the network tests, give the +option '-uall,-network'. +""" + +import sys +import os +import getopt +import traceback +import random +import StringIO + +import test_support + +RESOURCE_NAMES = ['curses', 'largefile', 'network'] + + +def usage(code, msg=''): + print __doc__ + if msg: print msg + sys.exit(code) + + +def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0, + exclude=0, single=0, randomize=0, findleaks=0, + use_resources=None): + """Execute a test suite. + + This also parses command-line options and modifies its behavior + accordingly. + + tests -- a list of strings containing test names (optional) + testdir -- the directory in which to look for tests (optional) + + Users other than the Python test suite will certainly want to + specify testdir; if it's omitted, the directory containing the + Python test suite is searched for. + + If the tests argument is omitted, the tests listed on the + command-line will be used. If that's empty, too, then all *.py + files beginning with test_ will be used. + + The other default arguments (verbose, quiet, generate, exclude, + single, randomize, findleaks, and use_resources) allow programmers + calling main() directly to set the values that would normally be + set by flags on the command line. + + """ + + test_support.record_original_stdout(sys.stdout) + try: + opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrlu:', + ['help', 'verbose', 'quiet', 'generate', + 'exclude', 'single', 'random', + 'findleaks', 'use=']) + except getopt.error, msg: + usage(2, msg) + + # Defaults + if use_resources is None: + use_resources = [] + for o, a in opts: + if o in ('-h', '--help'): + usage(0) + elif o in ('-v', '--verbose'): + verbose += 1 + elif o in ('-q', '--quiet'): + quiet = 1; + verbose = 0 + elif o in ('-g', '--generate'): + generate = 1 + elif o in ('-x', '--exclude'): + exclude = 1 + elif o in ('-s', '--single'): + single = 1 + elif o in ('-r', '--randomize'): + randomize = 1 + elif o in ('-l', '--findleaks'): + findleaks = 1 + elif o in ('-u', '--use'): + u = [x.lower() for x in a.split(',')] + for r in u: + if r == 'all': + use_resources[:] = RESOURCE_NAMES + continue + remove = False + if r[0] == '-': + remove = True + r = r[1:] + if r not in RESOURCE_NAMES: + usage(1, 'Invalid -u/--use option: ' + a) + if remove: + if r in use_resources: + use_resources.remove(r) + elif r not in use_resources: + use_resources.append(r) + if generate and verbose: + usage(2, "-g and -v don't go together!") + + good = [] + bad = [] + skipped = [] + + if findleaks: + try: + import gc + except ImportError: + print 'No GC available, disabling findleaks.' + findleaks = 0 + else: + # Uncomment the line below to report garbage that is not + # freeable by reference counting alone. By default only + # garbage that is not collectable by the GC is reported. + #gc.set_debug(gc.DEBUG_SAVEALL) + found_garbage = [] + + if single: + from tempfile import gettempdir + filename = os.path.join(gettempdir(), 'pynexttest') + try: + fp = open(filename, 'r') + next = fp.read().strip() + tests = [next] + fp.close() + except IOError: + pass + for i in range(len(args)): + # Strip trailing ".py" from arguments + if args[i][-3:] == os.extsep+'py': + args[i] = args[i][:-3] + stdtests = STDTESTS[:] + nottests = NOTTESTS[:] + if exclude: + for arg in args: + if arg in stdtests: + stdtests.remove(arg) + nottests[:0] = args + args = [] + tests = tests or args or findtests(testdir, stdtests, nottests) + if single: + tests = tests[:1] + if randomize: + random.shuffle(tests) + test_support.verbose = verbose # Tell tests to be moderately quiet + test_support.use_resources = use_resources + save_modules = sys.modules.keys() + for test in tests: + if not quiet: + print test + sys.stdout.flush() + ok = runtest(test, generate, verbose, quiet, testdir) + if ok > 0: + good.append(test) + elif ok == 0: + bad.append(test) + else: + skipped.append(test) + if findleaks: + gc.collect() + if gc.garbage: + print "Warning: test created", len(gc.garbage), + print "uncollectable object(s)." + # move the uncollectable objects somewhere so we don't see + # them again + found_garbage.extend(gc.garbage) + del gc.garbage[:] + # Unload the newly imported modules (best effort finalization) + for module in sys.modules.keys(): + if module not in save_modules and module.startswith("test."): + test_support.unload(module) + + # The lists won't be sorted if running with -r + good.sort() + bad.sort() + skipped.sort() + + if good and not quiet: + if not bad and not skipped and len(good) > 1: + print "All", + print count(len(good), "test"), "OK." + if verbose: + print "CAUTION: stdout isn't compared in verbose mode: a test" + print "that passes in verbose mode may fail without it." + if bad: + print count(len(bad), "test"), "failed:" + printlist(bad) + if skipped and not quiet: + print count(len(skipped), "test"), "skipped:" + printlist(skipped) + + e = _ExpectedSkips() + plat = sys.platform + if e.isvalid(): + surprise = _Set(skipped) - e.getexpected() + if surprise: + print count(len(surprise), "skip"), \ + "unexpected on", plat + ":" + printlist(surprise) + else: + print "Those skips are all expected on", plat + "." + else: + print "Ask someone to teach regrtest.py about which tests are" + print "expected to get skipped on", plat + "." + + if single: + alltests = findtests(testdir, stdtests, nottests) + for i in range(len(alltests)): + if tests[0] == alltests[i]: + if i == len(alltests) - 1: + os.unlink(filename) + else: + fp = open(filename, 'w') + fp.write(alltests[i+1] + '\n') + fp.close() + break + else: + os.unlink(filename) + + sys.exit(len(bad) > 0) + + +STDTESTS = [ + 'test_grammar', + 'test_opcodes', + 'test_operations', + 'test_builtin', + 'test_exceptions', + 'test_types', + ] + +NOTTESTS = [ + 'test_support', + 'test_b1', + 'test_b2', + 'test_future1', + 'test_future2', + 'test_future3', + ] + +def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): + """Return a list of all applicable test modules.""" + if not testdir: testdir = findtestdir() + names = os.listdir(testdir) + tests = [] + for name in names: + if name[:5] == "test_" and name[-3:] == os.extsep+"py": + modname = name[:-3] + if modname not in stdtests and modname not in nottests: + tests.append(modname) + tests.sort() + return stdtests + tests + +def runtest(test, generate, verbose, quiet, testdir = None): + """Run a single test. + test -- the name of the test + generate -- if true, generate output, instead of running the test + and comparing it to a previously created output file + verbose -- if true, print more messages + quiet -- if true, don't print 'skipped' messages (probably redundant) + testdir -- test directory + """ + test_support.unload(test) + if not testdir: testdir = findtestdir() + outputdir = os.path.join(testdir, "output") + outputfile = os.path.join(outputdir, test) + if verbose: + cfp = None + else: + cfp = StringIO.StringIO() + try: + save_stdout = sys.stdout + try: + if cfp: + sys.stdout = cfp + print test # Output file starts with test name + the_module = __import__(test, globals(), locals(), []) + # Most tests run to completion simply as a side-effect of + # being imported. For the benefit of tests that can't run + # that way (like test_threaded_import), explicitly invoke + # their test_main() function (if it exists). + indirect_test = getattr(the_module, "test_main", None) + if indirect_test is not None: + indirect_test() + finally: + sys.stdout = save_stdout + except (ImportError, test_support.TestSkipped), msg: + if not quiet: + print test, "skipped --", msg + sys.stdout.flush() + return -1 + except KeyboardInterrupt: + raise + except test_support.TestFailed, msg: + print "test", test, "failed --", msg + sys.stdout.flush() + return 0 + except: + type, value = sys.exc_info()[:2] + print "test", test, "crashed --", str(type) + ":", value + sys.stdout.flush() + if verbose: + traceback.print_exc(file=sys.stdout) + sys.stdout.flush() + return 0 + else: + if not cfp: + return 1 + output = cfp.getvalue() + if generate: + if output == test + "\n": + if os.path.exists(outputfile): + # Write it since it already exists (and the contents + # may have changed), but let the user know it isn't + # needed: + print "output file", outputfile, \ + "is no longer needed; consider removing it" + else: + # We don't need it, so don't create it. + return 1 + fp = open(outputfile, "w") + fp.write(output) + fp.close() + return 1 + if os.path.exists(outputfile): + fp = open(outputfile, "r") + expected = fp.read() + fp.close() + else: + expected = test + "\n" + if output == expected: + return 1 + print "test", test, "produced unexpected output:" + sys.stdout.flush() + reportdiff(expected, output) + sys.stdout.flush() + return 0 + +def reportdiff(expected, output): + import difflib + print "*" * 70 + a = expected.splitlines(1) + b = output.splitlines(1) + sm = difflib.SequenceMatcher(a=a, b=b) + tuples = sm.get_opcodes() + + def pair(x0, x1): + # x0:x1 are 0-based slice indices; convert to 1-based line indices. + x0 += 1 + if x0 >= x1: + return "line " + str(x0) + else: + return "lines %d-%d" % (x0, x1) + + for op, a0, a1, b0, b1 in tuples: + if op == 'equal': + pass + + elif op == 'delete': + print "***", pair(a0, a1), "of expected output missing:" + for line in a[a0:a1]: + print "-", line, + + elif op == 'replace': + print "*** mismatch between", pair(a0, a1), "of expected", \ + "output and", pair(b0, b1), "of actual output:" + for line in difflib.ndiff(a[a0:a1], b[b0:b1]): + print line, + + elif op == 'insert': + print "***", pair(b0, b1), "of actual output doesn't appear", \ + "in expected output after line", str(a1)+":" + for line in b[b0:b1]: + print "+", line, + + else: + print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1) + + print "*" * 70 + +def findtestdir(): + if __name__ == '__main__': + file = sys.argv[0] + else: + file = __file__ + testdir = os.path.dirname(file) or os.curdir + return testdir + +def count(n, word): + if n == 1: + return "%d %s" % (n, word) + else: + return "%d %ss" % (n, word) + +def printlist(x, width=70, indent=4): + """Print the elements of a sequence to stdout. + + Optional arg width (default 70) is the maximum line length. + Optional arg indent (default 4) is the number of blanks with which to + begin each line. + """ + + line = ' ' * indent + for one in map(str, x): + w = len(line) + len(one) + if line[-1:] == ' ': + pad = '' + else: + pad = ' ' + w += 1 + if w > width: + print line + line = ' ' * indent + one + else: + line += pad + one + if len(line) > indent: + print line + +class _Set: + def __init__(self, seq=[]): + data = self.data = {} + for x in seq: + data[x] = 1 + + def __len__(self): + return len(self.data) + + def __sub__(self, other): + "Return set of all elements in self not in other." + result = _Set() + data = result.data = self.data.copy() + for x in other.data: + if x in data: + del data[x] + return result + + def __iter__(self): + return iter(self.data) + + def tolist(self, sorted=1): + "Return _Set elements as a list." + data = self.data.keys() + if sorted: + data.sort() + return data + +_expectations = { + 'win32': + """ + test_al + test_cd + test_cl + test_commands + test_crypt + test_curses + test_dbm + test_dl + test_email_codecs + test_fcntl + test_fork1 + test_gdbm + test_gl + test_grp + test_imgfile + test_largefile + test_linuxaudiodev + test_mhlib + test_nis + test_openpty + test_poll + test_pty + test_pwd + test_signal + test_socket_ssl + test_socketserver + test_sunaudiodev + test_timing + """, + 'linux2': + """ + test_al + test_cd + test_cl + test_curses + test_dl + test_email_codecs + test_gl + test_imgfile + test_largefile + test_nis + test_ntpath + test_socket_ssl + test_socketserver + test_sunaudiodev + test_unicode_file + test_winreg + test_winsound + """, + 'mac': + """ + test_al + test_bsddb + test_cd + test_cl + test_commands + test_crypt + test_curses + test_dbm + test_dl + test_email_codecs + test_fcntl + test_fork1 + test_gl + test_grp + test_imgfile + test_largefile + test_linuxaudiodev + test_locale + test_mmap + test_nis + test_ntpath + test_openpty + test_poll + test_popen2 + test_pty + test_pwd + test_signal + test_socket_ssl + test_socketserver + test_sunaudiodev + test_sundry + test_timing + test_unicode_file + test_winreg + test_winsound + """, + 'unixware7': + """ + test_al + test_bsddb + test_cd + test_cl + test_dl + test_email_codecs + test_gl + test_imgfile + test_largefile + test_linuxaudiodev + test_minidom + test_nis + test_ntpath + test_openpty + test_pyexpat + test_sax + test_socketserver + test_sunaudiodev + test_sundry + test_unicode_file + test_winreg + test_winsound + """, + 'openunix8': + """ + test_al + test_bsddb + test_cd + test_cl + test_dl + test_email_codecs + test_gl + test_imgfile + test_largefile + test_linuxaudiodev + test_minidom + test_nis + test_ntpath + test_openpty + test_pyexpat + test_sax + test_socketserver + test_sunaudiodev + test_sundry + test_unicode_file + test_winreg + test_winsound + """, + 'sco_sv3': + """ + test_al + test_asynchat + test_bsddb + test_cd + test_cl + test_dl + test_email_codecs + test_fork1 + test_gettext + test_gl + test_imgfile + test_largefile + test_linuxaudiodev + test_locale + test_minidom + test_nis + test_ntpath + test_openpty + test_pyexpat + test_queue + test_sax + test_socketserver + test_sunaudiodev + test_sundry + test_thread + test_threaded_import + test_threadedtempfile + test_threading + test_unicode_file + test_winreg + test_winsound + """, + 'riscos': + """ + test_al + test_asynchat + test_bsddb + test_cd + test_cl + test_commands + test_crypt + test_dbm + test_dl + test_email_codecs + test_fcntl + test_fork1 + test_gdbm + test_gl + test_grp + test_imgfile + test_largefile + test_linuxaudiodev + test_locale + test_mmap + test_nis + test_ntpath + test_openpty + test_poll + test_popen2 + test_pty + test_pwd + test_socket_ssl + test_socketserver + test_strop + test_sunaudiodev + test_sundry + test_thread + test_threaded_import + test_threadedtempfile + test_threading + test_timing + test_unicode_file + test_winreg + test_winsound + """, + 'darwin': + """ + test_al + test_cd + test_cl + test_curses + test_dl + test_email_codecs + test_gdbm + test_gl + test_imgfile + test_largefile + test_locale + test_linuxaudiodev + test_minidom + test_nis + test_ntpath + test_poll + test_socket_ssl + test_socketserver + test_sunaudiodev + test_unicode_file + test_winreg + test_winsound + """, + 'sunos5': + """ + test_al + test_bsddb + test_cd + test_cl + test_curses + test_dbm + test_email_codecs + test_gdbm + test_gl + test_gzip + test_imgfile + test_linuxaudiodev + test_mpz + test_openpty + test_socketserver + test_zipfile + test_zlib + """, + 'hp-ux11': + """ + test_al + test_bsddb + test_cd + test_cl + test_curses + test_dl + test_gdbm + test_gl + test_gzip + test_imgfile + test_largefile + test_linuxaudiodev + test_locale + test_minidom + test_nis + test_ntpath + test_openpty + test_pyexpat + test_sax + test_socketserver + test_sunaudiodev + test_zipfile + test_zlib + """, + 'freebsd4': + """ + test_al + test_cd + test_cl + test_curses + test_email_codecs + test_gdbm + test_gl + test_imgfile + test_linuxaudiodev + test_locale + test_minidom + test_nis + test_pyexpat + test_sax + test_socket_ssl + test_socketserver + test_sunaudiodev + test_unicode_file + test_winreg + test_winsound + """, +} + +class _ExpectedSkips: + def __init__(self): + self.valid = 0 + if _expectations.has_key(sys.platform): + s = _expectations[sys.platform] + self.expected = _Set(s.split()) + self.valid = 1 + + def isvalid(self): + "Return true iff _ExpectedSkips knows about the current platform." + return self.valid + + def getexpected(self): + """Return set of test names we expect to skip on current platform. + + self.isvalid() must be true. + """ + + assert self.isvalid() + return self.expected + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/test/reperf.py b/lib-python/2.2/test/reperf.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/reperf.py @@ -0,0 +1,23 @@ +import re +import time + +def main(): + s = "\13hello\14 \13world\14 " * 1000 + p = re.compile(r"([\13\14])") + timefunc(10, p.sub, "", s) + timefunc(10, p.split, s) + timefunc(10, p.findall, s) + +def timefunc(n, func, *args, **kw): + t0 = time.clock() + try: + for i in range(n): + result = apply(func, args, kw) + return result + finally: + t1 = time.clock() + if n > 1: + print n, "times", + print func.__name__, "%.3f" % (t1-t0), "CPU seconds" + +main() diff --git a/lib-python/2.2/test/sortperf.py b/lib-python/2.2/test/sortperf.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/sortperf.py @@ -0,0 +1,141 @@ +"""Sort performance test. + +See main() for command line syntax. +See tabulate() for output format. + +""" + +import sys +import time +import random +import marshal +import tempfile +import operator +import os + +td = tempfile.gettempdir() + +def randrange(n): + """Return a random shuffle of range(n).""" + fn = os.path.join(td, "rr%06d" % n) + try: + fp = open(fn, "rb") + except IOError: + result = [] + for i in range(n): + result.append(random.random()) + try: + try: + fp = open(fn, "wb") + marshal.dump(result, fp) + fp.close() + fp = None + finally: + if fp: + try: + os.unlink(fn) + except os.error: + pass + except IOError, msg: + print "can't write", fn, ":", msg + else: + result = marshal.load(fp) + fp.close() + ##assert len(result) == n + # Shuffle it a bit... + for i in range(10): + i = random.randrange(0, n) + temp = result[:i] + del result[:i] + temp.reverse() + result[len(result):] = temp + del temp + return result + +def fl(): + sys.stdout.flush() + +def doit(L): + t0 = time.clock() + L.sort() + t1 = time.clock() + print "%6.2f" % (t1-t0), + fl() + +def tabulate(r): + """Tabulate sort speed for lists of various sizes. + + The sizes are 2**i for i in r (the argument, a list). + + The output displays i, 2**i, and the time to sort arrays of 2**i + floating point numbers with the following properties: + + *sort: random data + \sort: descending data + /sort: ascending data + ~sort: many duplicates + -sort: all equal + !sort: worst case scenario + + """ + cases = ("*sort", "\\sort", "/sort", "~sort", "-sort", "!sort") + fmt = ("%2s %6s" + " %6s"*len(cases)) + print fmt % (("i", "2**i") + cases) + for i in r: + n = 1< 4: + del L[4:] + L = L*(n/4) + L = map(lambda x: --x, L) + doit(L) # ~sort + del L + L = map(abs, [-0.5]*n) + doit(L) # -sort + L = range(n/2-1, -1, -1) + L[len(L):] = range(n/2) + doit(L) # !sort + print + +def main(): + """Main program when invoked as a script. + + One argument: tabulate a single row. + Two arguments: tabulate a range (inclusive). + Extra arguments are used to seed the random generator. + + """ + # default range (inclusive) + k1 = 15 + k2 = 19 + if sys.argv[1:]: + # one argument: single point + k1 = k2 = int(sys.argv[1]) + if sys.argv[2:]: + # two arguments: specify range + k2 = int(sys.argv[2]) + if sys.argv[3:]: + # derive random seed from remaining arguments + x, y, z = 0, 0, 0 + for a in sys.argv[3:]: + h = hash(a) + h, d = divmod(h, 256) + h = h & 0xffffff + x = (x^h^d) & 255 + h = h>>8 + y = (y^h^d) & 255 + h = h>>8 + z = (z^h^d) & 255 + whrandom.seed(x, y, z) + r = range(k1, k2+1) # include the end point + tabulate(r) + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/test/string_tests.py b/lib-python/2.2/test/string_tests.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/string_tests.py @@ -0,0 +1,265 @@ +"""Common tests shared by test_string and test_userstring""" + +import string +from test_support import verify, verbose, TestFailed, have_unicode + +transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377' + +from UserList import UserList + +class Sequence: + def __init__(self): self.seq = 'wxyz' + def __len__(self): return len(self.seq) + def __getitem__(self, i): return self.seq[i] + +class BadSeq1(Sequence): + def __init__(self): self.seq = [7, 'hello', 123L] + +class BadSeq2(Sequence): + def __init__(self): self.seq = ['a', 'b', 'c'] + def __len__(self): return 8 + +def run_module_tests(test): + """Run all tests that exercise a function in the string module""" + + test('atoi', " 1 ", 1) + test('atoi', " 1x", ValueError) + test('atoi', " x1 ", ValueError) + test('atol', " 1 ", 1L) + test('atol', " 1x ", ValueError) + test('atol', " x1 ", ValueError) + test('atof', " 1 ", 1.0) + test('atof', " 1x ", ValueError) + test('atof', " x1 ", ValueError) + + test('maketrans', 'abc', transtable, 'xyz') + test('maketrans', 'abc', ValueError, 'xyzq') + + # join now works with any sequence type + test('join', ['a', 'b', 'c', 'd'], 'a b c d') + test('join', ('a', 'b', 'c', 'd'), 'abcd', '') + test('join', Sequence(), 'w x y z') + test('join', 7, TypeError) + + test('join', BadSeq1(), TypeError) + test('join', BadSeq2(), 'a b c') + + # try a few long ones + print ":".join(['x' * 100] * 100) + print ":".join(('x' * 100,) * 100) + + +def run_method_tests(test): + """Run all tests that exercise a method of a string object""" + + test('capitalize', ' hello ', ' hello ') + test('capitalize', 'hello ', 'Hello ') + test('capitalize', 'aaaa', 'Aaaa') + test('capitalize', 'AaAa', 'Aaaa') + + test('count', 'aaa', 3, 'a') + test('count', 'aaa', 0, 'b') + + test('find', 'abcdefghiabc', 0, 'abc') + test('find', 'abcdefghiabc', 9, 'abc', 1) + test('find', 'abcdefghiabc', -1, 'def', 4) + test('rfind', 'abcdefghiabc', 9, 'abc') + test('lower', 'HeLLo', 'hello') + test('lower', 'hello', 'hello') + test('upper', 'HeLLo', 'HELLO') + test('upper', 'HELLO', 'HELLO') + + test('title', ' hello ', ' Hello ') + test('title', 'hello ', 'Hello ') + test('title', "fOrMaT thIs aS titLe String", 'Format This As Title String') + test('title', "fOrMaT,thIs-aS*titLe;String", 'Format,This-As*Title;String') + test('title', "getInt", 'Getint') + + test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi') + test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi', 8) + test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi', 4) + test('expandtabs', 'abc\r\nab\tdef\ng\thi', 'abc\r\nab def\ng hi', 4) + + test('islower', 'a', 1) + test('islower', 'A', 0) + test('islower', '\n', 0) + test('islower', 'abc', 1) + test('islower', 'aBc', 0) + test('islower', 'abc\n', 1) + + test('isupper', 'a', 0) + test('isupper', 'A', 1) + test('isupper', '\n', 0) + test('isupper', 'ABC', 1) + test('isupper', 'AbC', 0) + test('isupper', 'ABC\n', 1) + + test('istitle', 'a', 0) + test('istitle', 'A', 1) + test('istitle', '\n', 0) + test('istitle', 'A Titlecased Line', 1) + test('istitle', 'A\nTitlecased Line', 1) + test('istitle', 'A Titlecased, Line', 1) + test('istitle', 'Not a capitalized String', 0) + test('istitle', 'Not\ta Titlecase String', 0) + test('istitle', 'Not--a Titlecase String', 0) + + test('isalpha', 'a', 1) + test('isalpha', 'A', 1) + test('isalpha', '\n', 0) + test('isalpha', 'abc', 1) + test('isalpha', 'aBc123', 0) + test('isalpha', 'abc\n', 0) + + test('isalnum', 'a', 1) + test('isalnum', 'A', 1) + test('isalnum', '\n', 0) + test('isalnum', '123abc456', 1) + test('isalnum', 'a1b3c', 1) + test('isalnum', 'aBc000 ', 0) + test('isalnum', 'abc\n', 0) + + # join now works with any sequence type + test('join', ' ', 'a b c d', ['a', 'b', 'c', 'd']) + test('join', '', 'abcd', ('a', 'b', 'c', 'd')) + test('join', ' ', 'w x y z', Sequence()) + test('join', 'a', 'abc', ('abc',)) + test('join', 'a', 'z', UserList(['z'])) + if have_unicode: + test('join', unicode('.'), unicode('a.b.c'), ['a', 'b', 'c']) + test('join', '.', unicode('a.b.c'), [unicode('a'), 'b', 'c']) + test('join', '.', unicode('a.b.c'), ['a', unicode('b'), 'c']) + test('join', '.', unicode('a.b.c'), ['a', 'b', unicode('c')]) + test('join', '.', TypeError, ['a', unicode('b'), 3]) + for i in [5, 25, 125]: + test('join', '-', ((('a' * i) + '-') * i)[:-1], + ['a' * i] * i) + + test('join', ' ', TypeError, BadSeq1()) + test('join', ' ', 'a b c', BadSeq2()) + + test('splitlines', "abc\ndef\n\rghi", ['abc', 'def', '', 'ghi']) + test('splitlines', "abc\ndef\n\r\nghi", ['abc', 'def', '', 'ghi']) + test('splitlines', "abc\ndef\r\nghi", ['abc', 'def', 'ghi']) + test('splitlines', "abc\ndef\r\nghi\n", ['abc', 'def', 'ghi']) + test('splitlines', "abc\ndef\r\nghi\n\r", ['abc', 'def', 'ghi', '']) + test('splitlines', "\nabc\ndef\r\nghi\n\r", ['', 'abc', 'def', 'ghi', '']) + test('splitlines', "\nabc\ndef\r\nghi\n\r", ['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'], 1) + + test('split', 'this is the split function', + ['this', 'is', 'the', 'split', 'function']) + test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|') + test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2) + test('split', 'a b c d', ['a', 'b c d'], None, 1) + test('split', 'a b c d', ['a', 'b', 'c d'], None, 2) + test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 3) + test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 4) + test('split', 'a b c d', ['a b c d'], None, 0) + test('split', 'a b c d', ['a', 'b', 'c d'], None, 2) + test('split', 'a b c d ', ['a', 'b', 'c', 'd']) + + test('strip', ' hello ', 'hello') + test('lstrip', ' hello ', 'hello ') + test('rstrip', ' hello ', ' hello') + test('strip', 'hello', 'hello') + + # strip/lstrip/rstrip with None arg + test('strip', ' hello ', 'hello', None) + test('lstrip', ' hello ', 'hello ', None) + test('rstrip', ' hello ', ' hello', None) + test('strip', 'hello', 'hello', None) + + # strip/lstrip/rstrip with str arg + test('strip', 'xyzzyhelloxyzzy', 'hello', 'xyz') + test('lstrip', 'xyzzyhelloxyzzy', 'helloxyzzy', 'xyz') + test('rstrip', 'xyzzyhelloxyzzy', 'xyzzyhello', 'xyz') + test('strip', 'hello', 'hello', 'xyz') + + # strip/lstrip/rstrip with unicode arg + test('strip', 'xyzzyhelloxyzzy', u'hello', u'xyz') + test('lstrip', 'xyzzyhelloxyzzy', u'helloxyzzy', u'xyz') + test('rstrip', 'xyzzyhelloxyzzy', u'xyzzyhello', u'xyz') + test('strip', 'hello', u'hello', u'xyz') + + test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS') + test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def') + + table = string.maketrans('a', 'A') + test('translate', 'abc', 'Abc', table) + test('translate', 'xyz', 'xyz', table) + + test('replace', 'one!two!three!', 'one at two!three!', '!', '@', 1) + test('replace', 'one!two!three!', 'onetwothree', '!', '') + test('replace', 'one!two!three!', 'one at two@three!', '!', '@', 2) + test('replace', 'one!two!three!', 'one at two@three@', '!', '@', 3) + test('replace', 'one!two!three!', 'one at two@three@', '!', '@', 4) + test('replace', 'one!two!three!', 'one!two!three!', '!', '@', 0) + test('replace', 'one!two!three!', 'one at two@three@', '!', '@') + test('replace', 'one!two!three!', 'one!two!three!', 'x', '@') + test('replace', 'one!two!three!', 'one!two!three!', 'x', '@', 2) + # Next three for SF bug 422088: [OSF1 alpha] string.replace(); died with + # MemoryError due to empty result (platform malloc issue when requesting + # 0 bytes). + test('replace', '123', '', '123', '') + test('replace', '123123', '', '123', '') + test('replace', '123x123', 'x', '123', '') + + test('startswith', 'hello', 1, 'he') + test('startswith', 'hello', 1, 'hello') + test('startswith', 'hello', 0, 'hello world') + test('startswith', 'hello', 1, '') + test('startswith', 'hello', 0, 'ello') + test('startswith', 'hello', 1, 'ello', 1) + test('startswith', 'hello', 1, 'o', 4) + test('startswith', 'hello', 0, 'o', 5) + test('startswith', 'hello', 1, '', 5) + test('startswith', 'hello', 0, 'lo', 6) + test('startswith', 'helloworld', 1, 'lowo', 3) + test('startswith', 'helloworld', 1, 'lowo', 3, 7) + test('startswith', 'helloworld', 0, 'lowo', 3, 6) + + test('endswith', 'hello', 1, 'lo') + test('endswith', 'hello', 0, 'he') + test('endswith', 'hello', 1, '') + test('endswith', 'hello', 0, 'hello world') + test('endswith', 'helloworld', 0, 'worl') + test('endswith', 'helloworld', 1, 'worl', 3, 9) + test('endswith', 'helloworld', 1, 'world', 3, 12) + test('endswith', 'helloworld', 1, 'lowo', 1, 7) + test('endswith', 'helloworld', 1, 'lowo', 2, 7) + test('endswith', 'helloworld', 1, 'lowo', 3, 7) + test('endswith', 'helloworld', 0, 'lowo', 4, 7) + test('endswith', 'helloworld', 0, 'lowo', 3, 8) + test('endswith', 'ab', 0, 'ab', 0, 1) + test('endswith', 'ab', 0, 'ab', 0, 0) + + test('zfill', '123', '123', 2) + test('zfill', '123', '123', 3) + test('zfill', '123', '0123', 4) + test('zfill', '+123', '+123', 3) + test('zfill', '+123', '+123', 4) + test('zfill', '+123', '+0123', 5) + test('zfill', '-123', '-123', 3) + test('zfill', '-123', '-123', 4) + test('zfill', '-123', '-0123', 5) + test('zfill', '', '000', 3) + test('zfill', '34', '34', 1) + test('zfill', '34', '0034', 4) + + # Encoding/decoding + codecs = [('rot13', 'uryyb jbeyq'), + ('base64', 'aGVsbG8gd29ybGQ=\n'), + ('hex', '68656c6c6f20776f726c64'), + ('uu', 'begin 666 \n+:&5L;&\\@=V]R;&0 \n \nend\n')] + for encoding, data in codecs: + test('encode', 'hello world', data, encoding) + test('decode', data, 'hello world', encoding) + # zlib is optional, so we make the test optional too... + try: + import zlib + except ImportError: + pass + else: + data = 'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x1a\x0b\x04]' + verify('hello world'.encode('zlib') == data) + verify(data.decode('zlib') == 'hello world') diff --git a/lib-python/2.2/test/test.xml b/lib-python/2.2/test/test.xml new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test.xml @@ -0,0 +1,115 @@ + + +Introduction to XSL +

Introduction to XSL

+ + + +
+

Overview +

+
    + +
  • 1.Intro
  • + +
  • 2.History
  • + +
  • 3.XSL Basics
  • + +
  • Lunch
  • + +
  • 4.An XML Data Model
  • + +
  • 5.XSL Patterns
  • + +
  • 6.XSL Templates
  • + +
  • 7.XSL Formatting Model +
  • + +
+ + + + + + +
+

Intro

+
    + +
  • Who am I?
  • + +
  • Who are you?
  • + +
  • Why are we here? +
  • + +
+ + + + + + +
+

History: XML and SGML

+
    + +
  • XML is a subset of SGML.
  • + +
  • SGML allows the separation of abstract content from formatting.
  • + +
  • Also one of XML's primary virtues (in the doc publishing domain). +
  • + +
+ + + + + + +
+

History: What are stylesheets?

+
    + +
  • Stylesheets specify the formatting of SGML/XML documents.
  • + +
  • Stylesheets put the "style" back into documents.
  • + +
  • New York Times content+NYT Stylesheet = NYT paper +
  • + +
+ + + + + + +
+

History: FOSI

+
    + +
  • FOSI: "Formatted Output Specification Instance" +
      +
    • MIL-STD-28001 +
    • + +
    • FOSI's are SGML documents +
    • + +
    • A stylesheet for another document +
    • +
  • + +
  • Obsolete but implemented... +
  • + +
+ + + + + diff --git a/lib-python/2.2/test/test.xml.out b/lib-python/2.2/test/test.xml.out new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test.xml.out @@ -0,0 +1,115 @@ + + +Introduction to XSL +

Introduction to XSL

+ + + +
+

Overview +

+
    + +
  • 1.Intro
  • + +
  • 2.History
  • + +
  • 3.XSL Basics
  • + +
  • Lunch
  • + +
  • 4.An XML Data Model
  • + +
  • 5.XSL Patterns
  • + +
  • 6.XSL Templates
  • + +
  • 7.XSL Formatting Model +
  • + +
+ + + + + + +
+

Intro

+
    + +
  • Who am I?
  • + +
  • Who are you?
  • + +
  • Why are we here? +
  • + +
+ + + + + + +
+

History: XML and SGML

+
    + +
  • XML is a subset of SGML.
  • + +
  • SGML allows the separation of abstract content from formatting.
  • + +
  • Also one of XML's primary virtues (in the doc publishing domain). +
  • + +
+ + + + + + +
+

History: What are stylesheets?

+
    + +
  • Stylesheets specify the formatting of SGML/XML documents.
  • + +
  • Stylesheets put the "style" back into documents.
  • + +
  • New York Times content+NYT Stylesheet = NYT paper +
  • + +
+ + + + + + +
+

History: FOSI

+
    + +
  • FOSI: "Formatted Output Specification Instance" +
      +
    • MIL-STD-28001 +
    • + +
    • FOSI's are SGML documents +
    • + +
    • A stylesheet for another document +
    • +
  • + +
  • Obsolete but implemented... +
  • + +
+ + + + + \ No newline at end of file diff --git a/lib-python/2.2/test/test_MimeWriter.py b/lib-python/2.2/test/test_MimeWriter.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_MimeWriter.py @@ -0,0 +1,170 @@ +"""Test program for MimeWriter module. + +The test program was too big to comfortably fit in the MimeWriter +class, so it's here in its own file. + +This should generate Barry's example, modulo some quotes and newlines. + +""" + + +from MimeWriter import MimeWriter + +SELLER = '''\ +INTERFACE Seller-1; + +TYPE Seller = OBJECT + DOCUMENTATION "A simple Seller interface to test ILU" + METHODS + price():INTEGER, + END; +''' + +BUYER = '''\ +class Buyer: + def __setup__(self, maxprice): + self._maxprice = maxprice + + def __main__(self, kos): + """Entry point upon arrival at a new KOS.""" + broker = kos.broker() + # B4 == Barry's Big Bass Business :-) + seller = broker.lookup('Seller_1.Seller', 'B4') + if seller: + price = seller.price() + print 'Seller wants $', price, '... ' + if price > self._maxprice: + print 'too much!' + else: + print "I'll take it!" + else: + print 'no seller found here' +''' # Don't ask why this comment is here + +STATE = '''\ +# instantiate a buyer instance and put it in a magic place for the KOS +# to find. +__kp__ = Buyer() +__kp__.__setup__(500) +''' + +SIMPLE_METADATA = [ + ("Interpreter", "python"), + ("Interpreter-Version", "1.3"), + ("Owner-Name", "Barry Warsaw"), + ("Owner-Rendezvous", "bwarsaw at cnri.reston.va.us"), + ("Home-KSS", "kss.cnri.reston.va.us"), + ("Identifier", "hdl://cnri.kss/my_first_knowbot"), + ("Launch-Date", "Mon Feb 12 16:39:03 EST 1996"), + ] + +COMPLEX_METADATA = [ + ("Metadata-Type", "complex"), + ("Metadata-Key", "connection"), + ("Access", "read-only"), + ("Connection-Description", "Barry's Big Bass Business"), + ("Connection-Id", "B4"), + ("Connection-Direction", "client"), + ] + +EXTERNAL_METADATA = [ + ("Metadata-Type", "complex"), + ("Metadata-Key", "generic-interface"), + ("Access", "read-only"), + ("Connection-Description", "Generic Interface for All Knowbots"), + ("Connection-Id", "generic-kp"), + ("Connection-Direction", "client"), + ] + + +def main(): + import sys + + # Toplevel headers + + toplevel = MimeWriter(sys.stdout) + toplevel.addheader("From", "bwarsaw at cnri.reston.va.us") + toplevel.addheader("Date", "Mon Feb 12 17:21:48 EST 1996") + toplevel.addheader("To", "kss-submit at cnri.reston.va.us") + toplevel.addheader("MIME-Version", "1.0") + + # Toplevel body parts + + f = toplevel.startmultipartbody("knowbot", "801spam999", + [("version", "0.1")], prefix=0) + f.write("This is a multi-part message in MIME format.\n") + + # First toplevel body part: metadata + + md = toplevel.nextpart() + md.startmultipartbody("knowbot-metadata", "802spam999") + + # Metadata part 1 + + md1 = md.nextpart() + md1.addheader("KP-Metadata-Type", "simple") + md1.addheader("KP-Access", "read-only") + m = MimeWriter(md1.startbody("message/rfc822")) + for key, value in SIMPLE_METADATA: + m.addheader("KPMD-" + key, value) + m.flushheaders() + del md1 + + # Metadata part 2 + + md2 = md.nextpart() + for key, value in COMPLEX_METADATA: + md2.addheader("KP-" + key, value) + f = md2.startbody("text/isl") + f.write(SELLER) + del md2 + + # Metadata part 3 + + md3 = md.nextpart() + f = md3.startbody("message/external-body", + [("access-type", "URL"), + ("URL", "hdl://cnri.kss/generic-knowbot")]) + m = MimeWriter(f) + for key, value in EXTERNAL_METADATA: + md3.addheader("KP-" + key, value) + md3.startbody("text/isl") + # Phantom body doesn't need to be written + + md.lastpart() + + # Second toplevel body part: code + + code = toplevel.nextpart() + code.startmultipartbody("knowbot-code", "803spam999") + + # Code: buyer program source + + buyer = code.nextpart() + buyer.addheader("KP-Module-Name", "BuyerKP") + f = buyer.startbody("text/plain") + f.write(BUYER) + + code.lastpart() + + # Third toplevel body part: state + + state = toplevel.nextpart() + state.addheader("KP-Main-Module", "main") + state.startmultipartbody("knowbot-state", "804spam999") + + # State: a bunch of assignments + + st = state.nextpart() + st.addheader("KP-Module-Name", "main") + f = st.startbody("text/plain") + f.write(STATE) + + state.lastpart() + + # End toplevel body parts + + toplevel.lastpart() + + +main() diff --git a/lib-python/2.2/test/test_StringIO.py b/lib-python/2.2/test/test_StringIO.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_StringIO.py @@ -0,0 +1,113 @@ +# Tests StringIO and cStringIO + +import unittest +import StringIO +import cStringIO +import types +import test_support + + +class TestGenericStringIO(unittest.TestCase): + # use a class variable MODULE to define which module is being tested + + # Line of data to test as string + _line = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!' + + # Constructor to use for the test data (._line is passed to this + # constructor) + constructor = str + + def setUp(self): + self._line = self.constructor(self._line) + self._lines = self.constructor((self._line + '\n') * 5) + self._fp = self.MODULE.StringIO(self._lines) + + def test_reads(self): + eq = self.assertEqual + eq(self._fp.read(10), self._line[:10]) + eq(self._fp.readline(), self._line[10:] + '\n') + eq(len(self._fp.readlines(60)), 2) + + def test_writes(self): + f = self.MODULE.StringIO() + f.write(self._line[:6]) + f.seek(3) + f.write(self._line[20:26]) + f.write(self._line[52]) + self.assertEqual(f.getvalue(), 'abcuvwxyz!') + + def test_writelines(self): + f = self.MODULE.StringIO() + f.writelines([self._line[0], self._line[1], self._line[2]]) + f.seek(0) + self.assertEqual(f.getvalue(), 'abc') + + def test_truncate(self): + eq = self.assertEqual + f = self.MODULE.StringIO() + f.write(self._lines) + f.seek(10) + f.truncate() + eq(f.getvalue(), 'abcdefghij') + f.seek(0) + f.truncate(5) + eq(f.getvalue(), 'abcde') + f.close() + self.assertRaises(ValueError, f.write, 'frobnitz') + + def test_iterator(self): + eq = self.assertEqual + unless = self.failUnless + it = iter(self._fp) + # Does this object support the iteration protocol? + unless(hasattr(it, '__iter__')) + unless(hasattr(it, 'next')) + i = 0 + for line in self._fp: + eq(line, self._line + '\n') + i += 1 + eq(i, 5) + +class TestStringIO(TestGenericStringIO): + MODULE = StringIO + + if test_support.have_unicode: + def test_unicode(self): + + # The StringIO module also supports concatenating Unicode + # snippets to larger Unicode strings. This is tested by this + # method. Note that cStringIO does not support this extension. + + f = self.MODULE.StringIO() + f.write(self._line[:6]) + f.seek(3) + f.write(unicode(self._line[20:26])) + f.write(unicode(self._line[52])) + s = f.getvalue() + self.assertEqual(s, unicode('abcuvwxyz!')) + self.assertEqual(type(s), types.UnicodeType) + +class TestcStringIO(TestGenericStringIO): + MODULE = cStringIO + +import sys +if sys.platform.startswith('java'): + # Jython doesn't have a buffer object, so we just do a useless + # fake of the buffer tests. + buffer = str + +class TestBufferStringIO(TestStringIO): + constructor = buffer + +class TestBuffercStringIO(TestcStringIO): + constructor = buffer + + +def test_main(): + test_support.run_unittest(TestStringIO) + test_support.run_unittest(TestcStringIO) + test_support.run_unittest(TestBufferStringIO) + test_support.run_unittest(TestBuffercStringIO) + +if __name__ == '__main__': + test_main() diff --git a/lib-python/2.2/test/test___all__.py b/lib-python/2.2/test/test___all__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test___all__.py @@ -0,0 +1,158 @@ +from test_support import verify, verbose +import sys + +def check_all(modname): + names = {} + try: + exec "import %s" % modname in names + except ImportError: + # Silent fail here seems the best route since some modules + # may not be available in all environments. + # Since an ImportError may leave a partial module object in + # sys.modules, get rid of that first. Here's what happens if + # you don't: importing pty fails on Windows because pty tries to + # import FCNTL, which doesn't exist. That raises an ImportError, + # caught here. It also leaves a partial pty module in sys.modules. + # So when test_pty is called later, the import of pty succeeds, + # but shouldn't. As a result, test_pty crashes with an + # AttributeError instead of an ImportError, and regrtest interprets + # the latter as a test failure (ImportError is treated as "test + # skipped" -- which is what test_pty should say on Windows). + try: + del sys.modules[modname] + except KeyError: + pass + return + verify(hasattr(sys.modules[modname], "__all__"), + "%s has no __all__ attribute" % modname) + names = {} + exec "from %s import *" % modname in names + if names.has_key("__builtins__"): + del names["__builtins__"] + keys = names.keys() + keys.sort() + all = list(sys.modules[modname].__all__) # in case it's a tuple + all.sort() + verify(keys==all, "%s != %s" % (keys, all)) + +if not sys.platform.startswith('java'): + # In case _socket fails to build, make this test fail more gracefully + # than an AttributeError somewhere deep in CGIHTTPServer. + import _socket + +check_all("BaseHTTPServer") +check_all("CGIHTTPServer") +check_all("ConfigParser") +check_all("Cookie") +check_all("MimeWriter") +check_all("SimpleHTTPServer") +check_all("SocketServer") +check_all("StringIO") +check_all("UserString") +check_all("aifc") +check_all("atexit") +check_all("audiodev") +check_all("base64") +check_all("bdb") +check_all("binhex") +check_all("calendar") +check_all("cgi") +check_all("cmd") +check_all("code") +check_all("codecs") +check_all("codeop") +check_all("colorsys") +check_all("commands") +check_all("compileall") +check_all("copy") +check_all("copy_reg") +check_all("dbhash") +check_all("dircache") +check_all("dis") +check_all("doctest") +check_all("dospath") +check_all("filecmp") +check_all("fileinput") +check_all("fnmatch") +check_all("fpformat") +check_all("ftplib") +check_all("getopt") +check_all("getpass") +check_all("gettext") +check_all("glob") +check_all("gopherlib") +check_all("gzip") +check_all("htmllib") +check_all("httplib") +check_all("ihooks") +check_all("imaplib") +check_all("imghdr") +check_all("imputil") +check_all("keyword") +check_all("linecache") +check_all("locale") +check_all("macpath") +check_all("macurl2path") +check_all("mailbox") +check_all("mhlib") +check_all("mimetools") +check_all("mimetypes") +check_all("mimify") +check_all("multifile") +check_all("netrc") +check_all("nntplib") +check_all("ntpath") +check_all("os") +check_all("pdb") +check_all("pickle") +check_all("pipes") +check_all("popen2") +check_all("poplib") +check_all("posixpath") +check_all("pprint") +check_all("pre") +check_all("profile") +check_all("pstats") +check_all("pty") +check_all("py_compile") +check_all("pyclbr") +check_all("quopri") +check_all("random") +check_all("re") +check_all("reconvert") +import warnings +warnings.filterwarnings("ignore", ".* regsub .*", DeprecationWarning, "regsub", + append=1) +check_all("regsub") +check_all("repr") +check_all("rexec") +check_all("rfc822") +check_all("rlcompleter") +check_all("robotparser") +check_all("sched") +check_all("sgmllib") +check_all("shelve") +check_all("shlex") +check_all("shutil") +check_all("smtpd") +check_all("smtplib") +check_all("sndhdr") +check_all("socket") +check_all("sre") +check_all("stat_cache") +check_all("tabnanny") +check_all("telnetlib") +check_all("tempfile") +check_all("toaiff") +check_all("tokenize") +check_all("traceback") +check_all("tty") +check_all("urllib") +check_all("urlparse") +check_all("uu") +check_all("warnings") +check_all("wave") +check_all("weakref") +check_all("webbrowser") +check_all("xdrlib") +check_all("zipfile") diff --git a/lib-python/2.2/test/test___future__.py b/lib-python/2.2/test/test___future__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test___future__.py @@ -0,0 +1,59 @@ +#! /usr/bin/env python +from test_support import verbose, verify +from types import TupleType, StringType, IntType +import __future__ + +GOOD_SERIALS = ("alpha", "beta", "candidate", "final") + +features = __future__.all_feature_names + +# Verify that all_feature_names appears correct. +given_feature_names = features[:] +for name in dir(__future__): + obj = getattr(__future__, name, None) + if obj is not None and isinstance(obj, __future__._Feature): + verify(name in given_feature_names, + "%r should have been in all_feature_names" % name) + given_feature_names.remove(name) +verify(len(given_feature_names) == 0, + "all_feature_names has too much: %r" % given_feature_names) +del given_feature_names + +for feature in features: + value = getattr(__future__, feature) + if verbose: + print "Checking __future__ ", feature, "value", value + + optional = value.getOptionalRelease() + mandatory = value.getMandatoryRelease() + + verify(type(optional) is TupleType, "optional isn't tuple") + verify(len(optional) == 5, "optional isn't 5-tuple") + major, minor, micro, level, serial = optional + verify(type(major) is IntType, "optional major isn't int") + verify(type(minor) is IntType, "optional minor isn't int") + verify(type(micro) is IntType, "optional micro isn't int") + verify(type(level) is StringType, "optional level isn't string") + verify(level in GOOD_SERIALS, + "optional level string has unknown value") + verify(type(serial) is IntType, "optional serial isn't int") + + verify(type(mandatory) is TupleType or + mandatory is None, "mandatory isn't tuple or None") + if mandatory is not None: + verify(len(mandatory) == 5, "mandatory isn't 5-tuple") + major, minor, micro, level, serial = mandatory + verify(type(major) is IntType, "mandatory major isn't int") + verify(type(minor) is IntType, "mandatory minor isn't int") + verify(type(micro) is IntType, "mandatory micro isn't int") + verify(type(level) is StringType, "mandatory level isn't string") + verify(level in GOOD_SERIALS, + "mandatory serial string has unknown value") + verify(type(serial) is IntType, "mandatory serial isn't int") + verify(optional < mandatory, + "optional not less than mandatory, and mandatory not None") + + verify(hasattr(value, "compiler_flag"), + "feature is missing a .compiler_flag attr") + verify(type(getattr(value, "compiler_flag")) is IntType, + ".compiler_flag isn't int") diff --git a/lib-python/2.2/test/test_al.py b/lib-python/2.2/test/test_al.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_al.py @@ -0,0 +1,23 @@ +#! /usr/bin/env python +"""Whimpy test script for the al module + Roger E. Masse +""" +import al +from test_support import verbose + +alattrs = ['__doc__', '__name__', 'getdefault', 'getminmax', 'getname', 'getparams', + 'newconfig', 'openport', 'queryparams', 'setparams'] + +# This is a very unobtrusive test for the existence of the al module and all it's +# attributes. More comprehensive examples can be found in Demo/al + +def main(): + # touch all the attributes of al without doing anything + if verbose: + print 'Touching al module attributes...' + for attr in alattrs: + if verbose: + print 'touching: ', attr + getattr(al, attr) + +main() diff --git a/lib-python/2.2/test/test_array.py b/lib-python/2.2/test/test_array.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_array.py @@ -0,0 +1,192 @@ +#! /usr/bin/env python +"""Test the arraymodule. + Roger E. Masse +""" +import array +from test_support import verbose, TESTFN, unlink, TestFailed + +def main(): + + testtype('c', 'c') + + for type in (['b', 'h', 'i', 'l', 'f', 'd']): + testtype(type, 1) + + unlink(TESTFN) + + +def testoverflow(type, lowerLimit, upperLimit): + # should not overflow assigning lower limit + if verbose: + print "overflow test: array(%s, [%s])" % (`type`, `lowerLimit`) + try: + a = array.array(type, [lowerLimit]) + except: + raise TestFailed, "array(%s) overflowed assigning %s" %\ + (`type`, `lowerLimit`) + # should overflow assigning less than lower limit + if verbose: + print "overflow test: array(%s, [%s])" % (`type`, `lowerLimit-1`) + try: + a = array.array(type, [lowerLimit-1]) + raise TestFailed, "array(%s) did not overflow assigning %s" %\ + (`type`, `lowerLimit-1`) + except OverflowError: + pass + # should not overflow assigning upper limit + if verbose: + print "overflow test: array(%s, [%s])" % (`type`, `upperLimit`) + try: + a = array.array(type, [upperLimit]) + except: + raise TestFailed, "array(%s) overflowed assigning %s" %\ + (`type`, `upperLimit`) + # should overflow assigning more than upper limit + if verbose: + print "overflow test: array(%s, [%s])" % (`type`, `upperLimit+1`) + try: + a = array.array(type, [upperLimit+1]) + raise TestFailed, "array(%s) did not overflow assigning %s" %\ + (`type`, `upperLimit+1`) + except OverflowError: + pass + + + +def testtype(type, example): + + a = array.array(type) + a.append(example) + if verbose: + print 40*'*' + print 'array after append: ', a + a.typecode + a.itemsize + if a.typecode in ('i', 'b', 'h', 'l'): + a.byteswap() + + if a.typecode == 'c': + f = open(TESTFN, "w") + f.write("The quick brown fox jumps over the lazy dog.\n") + f.close() + f = open(TESTFN, 'r') + a.fromfile(f, 10) + f.close() + if verbose: + print 'char array with 10 bytes of TESTFN appended: ', a + a.fromlist(['a', 'b', 'c']) + if verbose: + print 'char array with list appended: ', a + + a.insert(0, example) + if verbose: + print 'array of %s after inserting another:' % a.typecode, a + f = open(TESTFN, 'w') + a.tofile(f) + f.close() + + # This block is just to verify that the operations don't blow up. + a.tolist() + a.tostring() + repr(a) + str(a) + + if verbose: + print 'array of %s converted to a list: ' % a.typecode, a.tolist() + if verbose: + print 'array of %s converted to a string: ' \ + % a.typecode, `a.tostring()` + + if type == 'c': + a = array.array(type, "abcde") + a[:-1] = a + if a != array.array(type, "abcdee"): + raise TestFailed, "array(%s) self-slice-assign (head)" % `type` + a = array.array(type, "abcde") + a[1:] = a + if a != array.array(type, "aabcde"): + raise TestFailed, "array(%s) self-slice-assign (tail)" % `type` + a = array.array(type, "abcde") + a[1:-1] = a + if a != array.array(type, "aabcdee"): + raise TestFailed, "array(%s) self-slice-assign (cntr)" % `type` + if a.index("e") != 5: + raise TestFailed, "array(%s) index-test" % `type` + if a.count("a") != 2: + raise TestFailed, "array(%s) count-test" % `type` + a.remove("e") + if a != array.array(type, "aabcde"): + raise TestFailed, "array(%s) remove-test" % `type` + if a.pop(0) != "a": + raise TestFailed, "array(%s) pop-test" % `type` + if a.pop(1) != "b": + raise TestFailed, "array(%s) pop-test" % `type` + a.extend(array.array(type, "xyz")) + if a != array.array(type, "acdexyz"): + raise TestFailed, "array(%s) extend-test" % `type` + a.pop() + a.pop() + a.pop() + x = a.pop() + if x != 'e': + raise TestFailed, "array(%s) pop-test" % `type` + if a != array.array(type, "acd"): + raise TestFailed, "array(%s) pop-test" % `type` + a.reverse() + if a != array.array(type, "dca"): + raise TestFailed, "array(%s) reverse-test" % `type` + else: + a = array.array(type, [1, 2, 3, 4, 5]) + a[:-1] = a + if a != array.array(type, [1, 2, 3, 4, 5, 5]): + raise TestFailed, "array(%s) self-slice-assign (head)" % `type` + a = array.array(type, [1, 2, 3, 4, 5]) + a[1:] = a + if a != array.array(type, [1, 1, 2, 3, 4, 5]): + raise TestFailed, "array(%s) self-slice-assign (tail)" % `type` + a = array.array(type, [1, 2, 3, 4, 5]) + a[1:-1] = a + if a != array.array(type, [1, 1, 2, 3, 4, 5, 5]): + raise TestFailed, "array(%s) self-slice-assign (cntr)" % `type` + if a.index(5) != 5: + raise TestFailed, "array(%s) index-test" % `type` + if a.count(1) != 2: + raise TestFailed, "array(%s) count-test" % `type` + a.remove(5) + if a != array.array(type, [1, 1, 2, 3, 4, 5]): + raise TestFailed, "array(%s) remove-test" % `type` + if a.pop(0) != 1: + raise TestFailed, "array(%s) pop-test" % `type` + if a.pop(1) != 2: + raise TestFailed, "array(%s) pop-test" % `type` + a.extend(array.array(type, [7, 8, 9])) + if a != array.array(type, [1, 3, 4, 5, 7, 8, 9]): + raise TestFailed, "array(%s) extend-test" % `type` + a.pop() + a.pop() + a.pop() + x = a.pop() + if x != 5: + raise TestFailed, "array(%s) pop-test" % `type` + if a != array.array(type, [1, 3, 4]): + raise TestFailed, "array(%s) pop-test" % `type` + a.reverse() + if a != array.array(type, [4, 3, 1]): + raise TestFailed, "array(%s) reverse-test" % `type` + + # test that overflow exceptions are raised as expected for assignment + # to array of specific integral types + from math import pow + if type in ('b', 'h', 'i', 'l'): + # check signed and unsigned versions + a = array.array(type) + signedLowerLimit = -1 * long(pow(2, a.itemsize * 8 - 1)) + signedUpperLimit = long(pow(2, a.itemsize * 8 - 1)) - 1L + unsignedLowerLimit = 0 + unsignedUpperLimit = long(pow(2, a.itemsize * 8)) - 1L + testoverflow(type, signedLowerLimit, signedUpperLimit) + testoverflow(type.upper(), unsignedLowerLimit, unsignedUpperLimit) + + + +main() diff --git a/lib-python/2.2/test/test_asynchat.py b/lib-python/2.2/test/test_asynchat.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_asynchat.py @@ -0,0 +1,58 @@ +# test asynchat -- requires threading + +import thread # If this fails, we can't test this module +import asyncore, asynchat, socket, threading, time + +HOST = "127.0.0.1" +PORT = 54321 + +class echo_server(threading.Thread): + + def run(self): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind((HOST, PORT)) + sock.listen(1) + conn, client = sock.accept() + buffer = "" + while "\n" not in buffer: + data = conn.recv(10) + if not data: + break + buffer = buffer + data + while buffer: + n = conn.send(buffer) + buffer = buffer[n:] + conn.close() + sock.close() + +class echo_client(asynchat.async_chat): + + def __init__(self): + asynchat.async_chat.__init__(self) + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect((HOST, PORT)) + self.set_terminator("\n") + self.buffer = "" + + def handle_connect(self): + print "Connected" + + def collect_incoming_data(self, data): + self.buffer = self.buffer + data + + def found_terminator(self): + print "Received:", `self.buffer` + self.buffer = "" + self.close() + +def main(): + s = echo_server() + s.start() + time.sleep(1) # Give server time to initialize + c = echo_client() + c.push("hello ") + c.push("world\n") + asyncore.loop() + +main() diff --git a/lib-python/2.2/test/test_atexit.py b/lib-python/2.2/test/test_atexit.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_atexit.py @@ -0,0 +1,66 @@ +# Test the atexit module. +from test_support import TESTFN, vereq, is_jython +import atexit +from os import popen, unlink +import sys + +executable = sys.executable +if is_jython: + executable = "jython" + +input = """\ +import atexit + +def handler1(): + print "handler1" + +def handler2(*args, **kargs): + print "handler2", args, kargs + +atexit.register(handler1) +atexit.register(handler2) +atexit.register(handler2, 7, kw="abc") +""" + +fname = TESTFN + ".py" +f = file(fname, "w") +f.write(input) +f.close() + +p = popen("%s %s" % (executable, fname)) +output = p.read() +p.close() +vereq(output, """\ +handler2 (7,) {'kw': 'abc'} +handler2 () {} +handler1 +""") + +input = """\ +def direct(): + print "direct exit" + +import sys +sys.exitfunc = direct + +# Make sure atexit doesn't drop +def indirect(): + print "indirect exit" + +import atexit +atexit.register(indirect) +""" + +f = file(fname, "w") +f.write(input) +f.close() + +p = popen("%s %s" % (executable, fname)) +output = p.read() +p.close() +vereq(output, """\ +indirect exit +direct exit +""") + +unlink(fname) diff --git a/lib-python/2.2/test/test_audioop.py b/lib-python/2.2/test/test_audioop.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_audioop.py @@ -0,0 +1,264 @@ +# Test audioop. +import audioop +from test_support import verbose + +def gendata1(): + return '\0\1\2' + +def gendata2(): + if verbose: + print 'getsample' + if audioop.getsample('\0\1', 2, 0) == 1: + return '\0\0\0\1\0\2' + else: + return '\0\0\1\0\2\0' + +def gendata4(): + if verbose: + print 'getsample' + if audioop.getsample('\0\0\0\1', 4, 0) == 1: + return '\0\0\0\0\0\0\0\1\0\0\0\2' + else: + return '\0\0\0\0\1\0\0\0\2\0\0\0' + +def testmax(data): + if verbose: + print 'max' + if audioop.max(data[0], 1) != 2 or \ + audioop.max(data[1], 2) != 2 or \ + audioop.max(data[2], 4) != 2: + return 0 + return 1 + +def testminmax(data): + if verbose: + print 'minmax' + if audioop.minmax(data[0], 1) != (0, 2) or \ + audioop.minmax(data[1], 2) != (0, 2) or \ + audioop.minmax(data[2], 4) != (0, 2): + return 0 + return 1 + +def testmaxpp(data): + if verbose: + print 'maxpp' + if audioop.maxpp(data[0], 1) != 0 or \ + audioop.maxpp(data[1], 2) != 0 or \ + audioop.maxpp(data[2], 4) != 0: + return 0 + return 1 + +def testavg(data): + if verbose: + print 'avg' + if audioop.avg(data[0], 1) != 1 or \ + audioop.avg(data[1], 2) != 1 or \ + audioop.avg(data[2], 4) != 1: + return 0 + return 1 + +def testavgpp(data): + if verbose: + print 'avgpp' + if audioop.avgpp(data[0], 1) != 0 or \ + audioop.avgpp(data[1], 2) != 0 or \ + audioop.avgpp(data[2], 4) != 0: + return 0 + return 1 + +def testrms(data): + if audioop.rms(data[0], 1) != 1 or \ + audioop.rms(data[1], 2) != 1 or \ + audioop.rms(data[2], 4) != 1: + return 0 + return 1 + +def testcross(data): + if verbose: + print 'cross' + if audioop.cross(data[0], 1) != 0 or \ + audioop.cross(data[1], 2) != 0 or \ + audioop.cross(data[2], 4) != 0: + return 0 + return 1 + +def testadd(data): + if verbose: + print 'add' + data2 = [] + for d in data: + str = '' + for s in d: + str = str + chr(ord(s)*2) + data2.append(str) + if audioop.add(data[0], data[0], 1) != data2[0] or \ + audioop.add(data[1], data[1], 2) != data2[1] or \ + audioop.add(data[2], data[2], 4) != data2[2]: + return 0 + return 1 + +def testbias(data): + if verbose: + print 'bias' + # Note: this test assumes that avg() works + d1 = audioop.bias(data[0], 1, 100) + d2 = audioop.bias(data[1], 2, 100) + d4 = audioop.bias(data[2], 4, 100) + if audioop.avg(d1, 1) != 101 or \ + audioop.avg(d2, 2) != 101 or \ + audioop.avg(d4, 4) != 101: + return 0 + return 1 + +def testlin2lin(data): + if verbose: + print 'lin2lin' + # too simple: we test only the size + for d1 in data: + for d2 in data: + got = len(d1)//3 + wtd = len(d2)//3 + if len(audioop.lin2lin(d1, got, wtd)) != len(d2): + return 0 + return 1 + +def testadpcm2lin(data): + # Very cursory test + if audioop.adpcm2lin('\0\0', 1, None) != ('\0\0\0\0', (0,0)): + return 0 + return 1 + +def testlin2adpcm(data): + if verbose: + print 'lin2adpcm' + # Very cursory test + if audioop.lin2adpcm('\0\0\0\0', 1, None) != ('\0\0', (0,0)): + return 0 + return 1 + +def testlin2ulaw(data): + if verbose: + print 'lin2ulaw' + if audioop.lin2ulaw(data[0], 1) != '\377\347\333' or \ + audioop.lin2ulaw(data[1], 2) != '\377\377\377' or \ + audioop.lin2ulaw(data[2], 4) != '\377\377\377': + return 0 + return 1 + +def testulaw2lin(data): + if verbose: + print 'ulaw2lin' + # Cursory + d = audioop.lin2ulaw(data[0], 1) + if audioop.ulaw2lin(d, 1) != data[0]: + return 0 + return 1 + +def testmul(data): + if verbose: + print 'mul' + data2 = [] + for d in data: + str = '' + for s in d: + str = str + chr(ord(s)*2) + data2.append(str) + if audioop.mul(data[0], 1, 2) != data2[0] or \ + audioop.mul(data[1],2, 2) != data2[1] or \ + audioop.mul(data[2], 4, 2) != data2[2]: + return 0 + return 1 + +def testratecv(data): + if verbose: + print 'ratecv' + state = None + d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) + d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) + if d1 + d2 != '\000\000\001\001\002\001\000\000\001\001\002': + return 0 + return 1 + +def testreverse(data): + if verbose: + print 'reverse' + if audioop.reverse(data[0], 1) != '\2\1\0': + return 0 + return 1 + +def testtomono(data): + if verbose: + print 'tomono' + data2 = '' + for d in data[0]: + data2 = data2 + d + d + if audioop.tomono(data2, 1, 0.5, 0.5) != data[0]: + return 0 + return 1 + +def testtostereo(data): + if verbose: + print 'tostereo' + data2 = '' + for d in data[0]: + data2 = data2 + d + d + if audioop.tostereo(data[0], 1, 1, 1) != data2: + return 0 + return 1 + +def testfindfactor(data): + if verbose: + print 'findfactor' + if audioop.findfactor(data[1], data[1]) != 1.0: + return 0 + return 1 + +def testfindfit(data): + if verbose: + print 'findfit' + if audioop.findfit(data[1], data[1]) != (0, 1.0): + return 0 + return 1 + +def testfindmax(data): + if verbose: + print 'findmax' + if audioop.findmax(data[1], 1) != 2: + return 0 + return 1 + +def testgetsample(data): + if verbose: + print 'getsample' + for i in range(3): + if audioop.getsample(data[0], 1, i) != i or \ + audioop.getsample(data[1], 2, i) != i or \ + audioop.getsample(data[2], 4, i) != i: + return 0 + return 1 + +def testone(name, data): + try: + func = eval('test'+name) + except NameError: + print 'No test found for audioop.'+name+'()' + return + try: + rv = func(data) + except 'xx': + print 'Test FAILED for audioop.'+name+'() (with an exception)' + return + if not rv: + print 'Test FAILED for audioop.'+name+'()' + +def testall(): + data = [gendata1(), gendata2(), gendata4()] + names = dir(audioop) + # We know there is a routine 'add' + routines = [] + for n in names: + if type(eval('audioop.'+n)) == type(audioop.add): + routines.append(n) + for n in routines: + testone(n, data) +testall() diff --git a/lib-python/2.2/test/test_augassign.py b/lib-python/2.2/test/test_augassign.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_augassign.py @@ -0,0 +1,261 @@ +# Augmented assignment test. + +x = 2 +x += 1 +x *= 2 +x **= 2 +x -= 8 +x //= 2 +x //= 1 +x %= 12 +x &= 2 +x |= 5 +x ^= 1 + +print x + +x = [2] +x[0] += 1 +x[0] *= 2 +x[0] **= 2 +x[0] -= 8 +x[0] //= 2 +x[0] //= 2 +x[0] %= 12 +x[0] &= 2 +x[0] |= 5 +x[0] ^= 1 + +print x + +x = {0: 2} +x[0] += 1 +x[0] *= 2 +x[0] **= 2 +x[0] -= 8 +x[0] //= 2 +x[0] //= 1 +x[0] %= 12 +x[0] &= 2 +x[0] |= 5 +x[0] ^= 1 + +print x[0] + +x = [1,2] +x += [3,4] +x *= 2 + +print x + +x = [1, 2, 3] +y = x +x[1:2] *= 2 +y[1:2] += [1] + +print x +print x is y + +class aug_test: + def __init__(self, value): + self.val = value + def __radd__(self, val): + return self.val + val + def __add__(self, val): + return aug_test(self.val + val) + + +class aug_test2(aug_test): + def __iadd__(self, val): + self.val = self.val + val + return self + +class aug_test3(aug_test): + def __iadd__(self, val): + return aug_test3(self.val + val) + +x = aug_test(1) +y = x +x += 10 + +print isinstance(x, aug_test) +print y is not x +print x.val + +x = aug_test2(2) +y = x +x += 10 + +print y is x +print x.val + +x = aug_test3(3) +y = x +x += 10 + +print isinstance(x, aug_test3) +print y is not x +print x.val + +class testall: + + def __add__(self, val): + print "__add__ called" + def __radd__(self, val): + print "__radd__ called" + def __iadd__(self, val): + print "__iadd__ called" + return self + + def __sub__(self, val): + print "__sub__ called" + def __rsub__(self, val): + print "__rsub__ called" + def __isub__(self, val): + print "__isub__ called" + return self + + def __mul__(self, val): + print "__mul__ called" + def __rmul__(self, val): + print "__rmul__ called" + def __imul__(self, val): + print "__imul__ called" + return self + + def __div__(self, val): + print "__div__ called" + def __rdiv__(self, val): + print "__rdiv__ called" + def __idiv__(self, val): + print "__idiv__ called" + return self + + def __floordiv__(self, val): + print "__floordiv__ called" + return self + def __ifloordiv__(self, val): + print "__ifloordiv__ called" + return self + def __rfloordiv__(self, val): + print "__rfloordiv__ called" + return self + + def __truediv__(self, val): + print "__truediv__ called" + return self + def __itruediv__(self, val): + print "__itruediv__ called" + return self + + def __mod__(self, val): + print "__mod__ called" + def __rmod__(self, val): + print "__rmod__ called" + def __imod__(self, val): + print "__imod__ called" + return self + + def __pow__(self, val): + print "__pow__ called" + def __rpow__(self, val): + print "__rpow__ called" + def __ipow__(self, val): + print "__ipow__ called" + return self + + def __or__(self, val): + print "__or__ called" + def __ror__(self, val): + print "__ror__ called" + def __ior__(self, val): + print "__ior__ called" + return self + + def __and__(self, val): + print "__and__ called" + def __rand__(self, val): + print "__rand__ called" + def __iand__(self, val): + print "__iand__ called" + return self + + def __xor__(self, val): + print "__xor__ called" + def __rxor__(self, val): + print "__rxor__ called" + def __ixor__(self, val): + print "__ixor__ called" + return self + + def __rshift__(self, val): + print "__rshift__ called" + def __rrshift__(self, val): + print "__rrshift__ called" + def __irshift__(self, val): + print "__irshift__ called" + return self + + def __lshift__(self, val): + print "__lshift__ called" + def __rlshift__(self, val): + print "__rlshift__ called" + def __ilshift__(self, val): + print "__ilshift__ called" + return self + +x = testall() +x + 1 +1 + x +x += 1 + +x - 1 +1 - x +x -= 1 + +x * 1 +1 * x +x *= 1 + +if 1/2 == 0: + x / 1 + 1 / x + x /= 1 +else: + # True division is in effect, so "/" doesn't map to __div__ etc; + # but the canned expected-output file requires that those get called. + x.__div__(1) + x.__rdiv__(1) + x.__idiv__(1) + +x // 1 +1 // x +x //= 1 + +x % 1 +1 % x +x %= 1 + +x ** 1 +1 ** x +x **= 1 + +x | 1 +1 | x +x |= 1 + +x & 1 +1 & x +x &= 1 + +x ^ 1 +1 ^ x +x ^= 1 + +x >> 1 +1 >> x +x >>= 1 + +x << 1 +1 << x +x <<= 1 diff --git a/lib-python/2.2/test/test_b1.py b/lib-python/2.2/test/test_b1.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_b1.py @@ -0,0 +1,632 @@ +# Python test set -- part 4a, built-in functions a-m + +from test_support import * + +print '__import__' +__import__('sys') +__import__('time') +__import__('string') +try: __import__('spamspam') +except ImportError: pass +else: raise TestFailed, "__import__('spamspam') should fail" + +print 'abs' +if abs(0) != 0: raise TestFailed, 'abs(0)' +if abs(1234) != 1234: raise TestFailed, 'abs(1234)' +if abs(-1234) != 1234: raise TestFailed, 'abs(-1234)' +# +if abs(0.0) != 0.0: raise TestFailed, 'abs(0.0)' +if abs(3.14) != 3.14: raise TestFailed, 'abs(3.14)' +if abs(-3.14) != 3.14: raise TestFailed, 'abs(-3.14)' +# +if abs(0L) != 0L: raise TestFailed, 'abs(0L)' +if abs(1234L) != 1234L: raise TestFailed, 'abs(1234L)' +if abs(-1234L) != 1234L: raise TestFailed, 'abs(-1234L)' + +try: abs('a') +except TypeError: pass +else: raise TestFailed, 'abs("a")' + +print 'apply' +def f0(*args): + if args != (): raise TestFailed, 'f0 called with ' + `args` +def f1(a1): + if a1 != 1: raise TestFailed, 'f1 called with ' + `a1` +def f2(a1, a2): + if a1 != 1 or a2 != 2: + raise TestFailed, 'f2 called with ' + `a1, a2` +def f3(a1, a2, a3): + if a1 != 1 or a2 != 2 or a3 != 3: + raise TestFailed, 'f3 called with ' + `a1, a2, a3` +apply(f0, ()) +apply(f1, (1,)) +apply(f2, (1, 2)) +apply(f3, (1, 2, 3)) + +# A PyCFunction that takes only positional parameters should allow an +# empty keyword dictionary to pass without a complaint, but raise a +# TypeError if the dictionary is non-empty. +apply(id, (1,), {}) +try: + apply(id, (1,), {"foo": 1}) +except TypeError: + pass +else: + raise TestFailed, 'expected TypeError; no exception raised' + +print 'callable' +if not callable(len):raise TestFailed, 'callable(len)' +def f(): pass +if not callable(f): raise TestFailed, 'callable(f)' +class C: + def meth(self): pass +if not callable(C): raise TestFailed, 'callable(C)' +x = C() +if not callable(x.meth): raise TestFailed, 'callable(x.meth)' +if callable(x): raise TestFailed, 'callable(x)' +class D(C): + def __call__(self): pass +y = D() +if not callable(y): raise TestFailed, 'callable(y)' +y() + +print 'chr' +if chr(32) != ' ': raise TestFailed, 'chr(32)' +if chr(65) != 'A': raise TestFailed, 'chr(65)' +if chr(97) != 'a': raise TestFailed, 'chr(97)' + +# cmp +print 'cmp' +if cmp(-1, 1) != -1: raise TestFailed, 'cmp(-1, 1)' +if cmp(1, -1) != 1: raise TestFailed, 'cmp(1, -1)' +if cmp(1, 1) != 0: raise TestFailed, 'cmp(1, 1)' +# verify that circular objects are handled +a = []; a.append(a) +b = []; b.append(b) +from UserList import UserList +c = UserList(); c.append(c) +if cmp(a, b) != 0: raise TestFailed, "cmp(%s, %s)" % (a, b) +if cmp(b, c) != 0: raise TestFailed, "cmp(%s, %s)" % (b, c) +if cmp(c, a) != 0: raise TestFailed, "cmp(%s, %s)" % (c, a) +if cmp(a, c) != 0: raise TestFailed, "cmp(%s, %s)" % (a, c) +# okay, now break the cycles +a.pop(); b.pop(); c.pop() + +print 'coerce' +if fcmp(coerce(1, 1.1), (1.0, 1.1)): raise TestFailed, 'coerce(1, 1.1)' +if coerce(1, 1L) != (1L, 1L): raise TestFailed, 'coerce(1, 1L)' +if fcmp(coerce(1L, 1.1), (1.0, 1.1)): raise TestFailed, 'coerce(1L, 1.1)' + +try: coerce(0.5, long("12345" * 1000)) +except OverflowError: pass +else: raise TestFailed, 'coerce(0.5, long("12345" * 1000))' + +print 'compile' +compile('print 1\n', '', 'exec') + +print 'complex' +if complex(1,10) != 1+10j: raise TestFailed, 'complex(1,10)' +if complex(1,10L) != 1+10j: raise TestFailed, 'complex(1,10L)' +if complex(1,10.0) != 1+10j: raise TestFailed, 'complex(1,10.0)' +if complex(1L,10) != 1+10j: raise TestFailed, 'complex(1L,10)' +if complex(1L,10L) != 1+10j: raise TestFailed, 'complex(1L,10L)' +if complex(1L,10.0) != 1+10j: raise TestFailed, 'complex(1L,10.0)' +if complex(1.0,10) != 1+10j: raise TestFailed, 'complex(1.0,10)' +if complex(1.0,10L) != 1+10j: raise TestFailed, 'complex(1.0,10L)' +if complex(1.0,10.0) != 1+10j: raise TestFailed, 'complex(1.0,10.0)' +if complex(3.14+0j) != 3.14+0j: raise TestFailed, 'complex(3.14)' +if complex(3.14) != 3.14+0j: raise TestFailed, 'complex(3.14)' +if complex(314) != 314.0+0j: raise TestFailed, 'complex(314)' +if complex(314L) != 314.0+0j: raise TestFailed, 'complex(314L)' +if complex(3.14+0j, 0j) != 3.14+0j: raise TestFailed, 'complex(3.14, 0j)' +if complex(3.14, 0.0) != 3.14+0j: raise TestFailed, 'complex(3.14, 0.0)' +if complex(314, 0) != 314.0+0j: raise TestFailed, 'complex(314, 0)' +if complex(314L, 0L) != 314.0+0j: raise TestFailed, 'complex(314L, 0L)' +if complex(0j, 3.14j) != -3.14+0j: raise TestFailed, 'complex(0j, 3.14j)' +if complex(0.0, 3.14j) != -3.14+0j: raise TestFailed, 'complex(0.0, 3.14j)' +if complex(0j, 3.14) != 3.14j: raise TestFailed, 'complex(0j, 3.14)' +if complex(0.0, 3.14) != 3.14j: raise TestFailed, 'complex(0.0, 3.14)' +if complex("1") != 1+0j: raise TestFailed, 'complex("1")' +if complex("1j") != 1j: raise TestFailed, 'complex("1j")' + +try: complex("1", "1") +except TypeError: pass +else: raise TestFailed, 'complex("1", "1")' + +try: complex(1, "1") +except TypeError: pass +else: raise TestFailed, 'complex(1, "1")' + +if complex(" 3.14+J ") != 3.14+1j: raise TestFailed, 'complex(" 3.14+J )"' +if have_unicode: + if complex(unicode(" 3.14+J ")) != 3.14+1j: + raise TestFailed, 'complex(u" 3.14+J )"' + +# SF bug 543840: complex(string) accepts strings with \0 +# Fixed in 2.3. +try: + complex('1+1j\0j') +except ValueError: + pass +else: + raise TestFailed("complex('1+1j\0j') should have raised ValueError") + +class Z: + def __complex__(self): return 3.14j +z = Z() +if complex(z) != 3.14j: raise TestFailed, 'complex(classinstance)' + +print 'delattr' +import sys +sys.spam = 1 +delattr(sys, 'spam') + +print 'dir' +x = 1 +if 'x' not in dir(): raise TestFailed, 'dir()' +import sys +if 'modules' not in dir(sys): raise TestFailed, 'dir(sys)' + +print 'divmod' +if divmod(12, 7) != (1, 5): raise TestFailed, 'divmod(12, 7)' +if divmod(-12, 7) != (-2, 2): raise TestFailed, 'divmod(-12, 7)' +if divmod(12, -7) != (-2, -2): raise TestFailed, 'divmod(12, -7)' +if divmod(-12, -7) != (1, -5): raise TestFailed, 'divmod(-12, -7)' +# +if divmod(12L, 7L) != (1L, 5L): raise TestFailed, 'divmod(12L, 7L)' +if divmod(-12L, 7L) != (-2L, 2L): raise TestFailed, 'divmod(-12L, 7L)' +if divmod(12L, -7L) != (-2L, -2L): raise TestFailed, 'divmod(12L, -7L)' +if divmod(-12L, -7L) != (1L, -5L): raise TestFailed, 'divmod(-12L, -7L)' +# +if divmod(12, 7L) != (1, 5L): raise TestFailed, 'divmod(12, 7L)' +if divmod(-12, 7L) != (-2, 2L): raise TestFailed, 'divmod(-12, 7L)' +if divmod(12L, -7) != (-2L, -2): raise TestFailed, 'divmod(12L, -7)' +if divmod(-12L, -7) != (1L, -5): raise TestFailed, 'divmod(-12L, -7)' +# +if fcmp(divmod(3.25, 1.0), (3.0, 0.25)): + raise TestFailed, 'divmod(3.25, 1.0)' +if fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)): + raise TestFailed, 'divmod(-3.25, 1.0)' +if fcmp(divmod(3.25, -1.0), (-4.0, -0.75)): + raise TestFailed, 'divmod(3.25, -1.0)' +if fcmp(divmod(-3.25, -1.0), (3.0, -0.25)): + raise TestFailed, 'divmod(-3.25, -1.0)' + +print 'eval' +if eval('1+1') != 2: raise TestFailed, 'eval(\'1+1\')' +if eval(' 1+1\n') != 2: raise TestFailed, 'eval(\' 1+1\\n\')' +globals = {'a': 1, 'b': 2} +locals = {'b': 200, 'c': 300} +if eval('a', globals) != 1: + raise TestFailed, "eval(1) == %s" % eval('a', globals) +if eval('a', globals, locals) != 1: + raise TestFailed, "eval(2)" +if eval('b', globals, locals) != 200: + raise TestFailed, "eval(3)" +if eval('c', globals, locals) != 300: + raise TestFailed, "eval(4)" +if have_unicode: + if eval(unicode('1+1')) != 2: raise TestFailed, 'eval(u\'1+1\')' + if eval(unicode(' 1+1\n')) != 2: raise TestFailed, 'eval(u\' 1+1\\n\')' +globals = {'a': 1, 'b': 2} +locals = {'b': 200, 'c': 300} +if have_unicode: + if eval(unicode('a'), globals) != 1: + raise TestFailed, "eval(1) == %s" % eval(unicode('a'), globals) + if eval(unicode('a'), globals, locals) != 1: + raise TestFailed, "eval(2)" + if eval(unicode('b'), globals, locals) != 200: + raise TestFailed, "eval(3)" + if eval(unicode('c'), globals, locals) != 300: + raise TestFailed, "eval(4)" + +print 'execfile' +z = 0 +f = open(TESTFN, 'w') +f.write('z = z+1\n') +f.write('z = z*2\n') +f.close() +execfile(TESTFN) +if z != 2: raise TestFailed, "execfile(1)" +globals['z'] = 0 +execfile(TESTFN, globals) +if globals['z'] != 2: raise TestFailed, "execfile(1)" +locals['z'] = 0 +execfile(TESTFN, globals, locals) +if locals['z'] != 2: raise TestFailed, "execfile(1)" +unlink(TESTFN) + +print 'filter' +if filter(lambda c: 'a' <= c <= 'z', 'Hello World') != 'elloorld': + raise TestFailed, 'filter (filter a string)' +if filter(None, [1, 'hello', [], [3], '', None, 9, 0]) != [1, 'hello', [3], 9]: + raise TestFailed, 'filter (remove false values)' +if filter(lambda x: x > 0, [1, -3, 9, 0, 2]) != [1, 9, 2]: + raise TestFailed, 'filter (keep positives)' +class Squares: + def __init__(self, max): + self.max = max + self.sofar = [] + def __len__(self): return len(self.sofar) + def __getitem__(self, i): + if not 0 <= i < self.max: raise IndexError + n = len(self.sofar) + while n <= i: + self.sofar.append(n*n) + n = n+1 + return self.sofar[i] +if filter(None, Squares(10)) != [1, 4, 9, 16, 25, 36, 49, 64, 81]: + raise TestFailed, 'filter(None, Squares(10))' +if filter(lambda x: x%2, Squares(10)) != [1, 9, 25, 49, 81]: + raise TestFailed, 'filter(oddp, Squares(10))' +class StrSquares: + def __init__(self, max): + self.max = max + self.sofar = [] + def __len__(self): + return len(self.sofar) + def __getitem__(self, i): + if not 0 <= i < self.max: + raise IndexError + n = len(self.sofar) + while n <= i: + self.sofar.append(str(n*n)) + n = n+1 + return self.sofar[i] +def identity(item): + return 1 +filter(identity, Squares(5)) + +print 'float' +if float(3.14) != 3.14: raise TestFailed, 'float(3.14)' +if float(314) != 314.0: raise TestFailed, 'float(314)' +if float(314L) != 314.0: raise TestFailed, 'float(314L)' +if float(" 3.14 ") != 3.14: raise TestFailed, 'float(" 3.14 ")' +if have_unicode: + if float(unicode(" 3.14 ")) != 3.14: + raise TestFailed, 'float(u" 3.14 ")' + if float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')) != 3.14: + raise TestFailed, 'float(u" \u0663.\u0661\u0664 ")' + +print 'getattr' +import sys +if getattr(sys, 'stdout') is not sys.stdout: raise TestFailed, 'getattr' +try: + getattr(sys, 1) +except TypeError: + pass +else: + raise TestFailed, "getattr(sys, 1) should raise an exception" +try: + getattr(sys, 1, "foo") +except TypeError: + pass +else: + raise TestFailed, 'getattr(sys, 1, "foo") should raise an exception' + +print 'hasattr' +import sys +if not hasattr(sys, 'stdout'): raise TestFailed, 'hasattr' +try: + hasattr(sys, 1) +except TypeError: + pass +else: + raise TestFailed, "hasattr(sys, 1) should raise an exception" + +print 'hash' +hash(None) +if not hash(1) == hash(1L) == hash(1.0): raise TestFailed, 'numeric hash()' +hash('spam') +hash((0,1,2,3)) +def f(): pass +try: hash([]) +except TypeError: pass +else: raise TestFailed, "hash([]) should raise an exception" +try: hash({}) +except TypeError: pass +else: raise TestFailed, "hash({}) should raise an exception" + +print 'hex' +if hex(16) != '0x10': raise TestFailed, 'hex(16)' +if hex(16L) != '0x10L': raise TestFailed, 'hex(16L)' +if len(hex(-1)) != len(hex(sys.maxint)): raise TestFailed, 'len(hex(-1))' +if hex(-16) not in ('0xfffffff0', '0xfffffffffffffff0'): + raise TestFailed, 'hex(-16)' +if hex(-16L) != '-0x10L': raise TestFailed, 'hex(-16L)' + +print 'id' +id(None) +id(1) +id(1L) +id(1.0) +id('spam') +id((0,1,2,3)) +id([0,1,2,3]) +id({'spam': 1, 'eggs': 2, 'ham': 3}) + +# Test input() later, together with raw_input + +print 'int' +if int(314) != 314: raise TestFailed, 'int(314)' +if int(3.14) != 3: raise TestFailed, 'int(3.14)' +if int(314L) != 314: raise TestFailed, 'int(314L)' +# Check that conversion from float truncates towards zero +if int(-3.14) != -3: raise TestFailed, 'int(-3.14)' +if int(3.9) != 3: raise TestFailed, 'int(3.9)' +if int(-3.9) != -3: raise TestFailed, 'int(-3.9)' +if int(3.5) != 3: raise TestFailed, 'int(3.5)' +if int(-3.5) != -3: raise TestFailed, 'int(-3.5)' +# Different base: +if int("10",16) != 16L: raise TestFailed, 'int("10",16)' +if have_unicode: + if int(unicode("10"),16) != 16L: + raise TestFailed, 'int(u"10",16)' +# Test conversion from strings and various anomalies +L = [ + ('0', 0), + ('1', 1), + ('9', 9), + ('10', 10), + ('99', 99), + ('100', 100), + ('314', 314), + (' 314', 314), + ('314 ', 314), + (' \t\t 314 \t\t ', 314), + (`sys.maxint`, sys.maxint), + (' 1x', ValueError), + (' 1 ', 1), + (' 1\02 ', ValueError), + ('', ValueError), + (' ', ValueError), + (' \t\t ', ValueError) +] +if have_unicode: + L += [ + (unicode('0'), 0), + (unicode('1'), 1), + (unicode('9'), 9), + (unicode('10'), 10), + (unicode('99'), 99), + (unicode('100'), 100), + (unicode('314'), 314), + (unicode(' 314'), 314), + (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314), + (unicode(' \t\t 314 \t\t '), 314), + (unicode(' 1x'), ValueError), + (unicode(' 1 '), 1), + (unicode(' 1\02 '), ValueError), + (unicode(''), ValueError), + (unicode(' '), ValueError), + (unicode(' \t\t '), ValueError), +] +for s, v in L: + for sign in "", "+", "-": + for prefix in "", " ", "\t", " \t\t ": + ss = prefix + sign + s + vv = v + if sign == "-" and v is not ValueError: + vv = -v + try: + if int(ss) != vv: + raise TestFailed, "int(%s)" % `ss` + except v: + pass + except ValueError, e: + raise TestFailed, "int(%s) raised ValueError: %s" % (`ss`, e) +s = `-1-sys.maxint` +if int(s)+1 != -sys.maxint: + raise TestFailed, "int(%s)" % `s` +try: + int(s[1:]) +except ValueError: + pass +else: + raise TestFailed, "int(%s)" % `s[1:]` + " should raise ValueError" +try: + int(1e100) +except OverflowError: + pass +else: + raise TestFailed("int(1e100) expected OverflowError") +try: + int(-1e100) +except OverflowError: + pass +else: + raise TestFailed("int(-1e100) expected OverflowError") + + +# SF bug 434186: 0x80000000/2 != 0x80000000>>1. +# Worked by accident in Windows release build, but failed in debug build. +# Failed in all Linux builds. +x = -1-sys.maxint +if x >> 1 != x//2: + raise TestFailed("x >> 1 != x/2 when x == -1-sys.maxint") + +try: int('123\0') +except ValueError: pass +else: raise TestFailed("int('123\0') didn't raise exception") + +print 'isinstance' +class C: + pass +class D(C): + pass +class E: + pass +c = C() +d = D() +e = E() +if not isinstance(c, C): raise TestFailed, 'isinstance(c, C)' +if not isinstance(d, C): raise TestFailed, 'isinstance(d, C)' +if isinstance(e, C): raise TestFailed, 'isinstance(e, C)' +if isinstance(c, D): raise TestFailed, 'isinstance(c, D)' +if isinstance('foo', E): raise TestFailed, 'isinstance("Foo", E)' +try: + isinstance(E, 'foo') + raise TestFailed, 'isinstance(E, "foo")' +except TypeError: + pass + +print 'issubclass' +if not issubclass(D, C): raise TestFailed, 'issubclass(D, C)' +if not issubclass(C, C): raise TestFailed, 'issubclass(C, C)' +if issubclass(C, D): raise TestFailed, 'issubclass(C, D)' +try: + issubclass('foo', E) + raise TestFailed, 'issubclass("foo", E)' +except TypeError: + pass +try: + issubclass(E, 'foo') + raise TestFailed, 'issubclass(E, "foo")' +except TypeError: + pass + +print 'len' +if len('123') != 3: raise TestFailed, 'len(\'123\')' +if len(()) != 0: raise TestFailed, 'len(())' +if len((1, 2, 3, 4)) != 4: raise TestFailed, 'len((1, 2, 3, 4))' +if len([1, 2, 3, 4]) != 4: raise TestFailed, 'len([1, 2, 3, 4])' +if len({}) != 0: raise TestFailed, 'len({})' +if len({'a':1, 'b': 2}) != 2: raise TestFailed, 'len({\'a\':1, \'b\': 2})' + +print 'list' +if list([]) != []: raise TestFailed, 'list([])' +l0_3 = [0, 1, 2, 3] +l0_3_bis = list(l0_3) +if l0_3 != l0_3_bis or l0_3 is l0_3_bis: raise TestFailed, 'list([0, 1, 2, 3])' +if list(()) != []: raise TestFailed, 'list(())' +if list((0, 1, 2, 3)) != [0, 1, 2, 3]: raise TestFailed, 'list((0, 1, 2, 3))' +if list('') != []: raise TestFailed, 'list('')' +if list('spam') != ['s', 'p', 'a', 'm']: raise TestFailed, "list('spam')" + +if sys.maxint == 0x7fffffff: + # This test can currently only work on 32-bit machines. + # XXX If/when PySequence_Length() returns a ssize_t, it should be + # XXX re-enabled. + try: + # Verify clearing of bug #556025. + # This assumes that the max data size (sys.maxint) == max + # address size this also assumes that the address size is at + # least 4 bytes with 8 byte addresses, the bug is not well + # tested + # + # Note: This test is expected to SEGV under Cygwin 1.3.12 or + # earlier due to a newlib bug. See the following mailing list + # thread for the details: + + # http://sources.redhat.com/ml/newlib/2002/msg00369.html + list(xrange(sys.maxint // 2)) + except MemoryError: + pass + else: + raise TestFailed, 'list(xrange(sys.maxint / 4))' + +print 'long' +if long(314) != 314L: raise TestFailed, 'long(314)' +if long(3.14) != 3L: raise TestFailed, 'long(3.14)' +if long(314L) != 314L: raise TestFailed, 'long(314L)' +# Check that conversion from float truncates towards zero +if long(-3.14) != -3L: raise TestFailed, 'long(-3.14)' +if long(3.9) != 3L: raise TestFailed, 'long(3.9)' +if long(-3.9) != -3L: raise TestFailed, 'long(-3.9)' +if long(3.5) != 3L: raise TestFailed, 'long(3.5)' +if long(-3.5) != -3L: raise TestFailed, 'long(-3.5)' +if long("-3") != -3L: raise TestFailed, 'long("-3")' +if have_unicode: + if long(unicode("-3")) != -3L: + raise TestFailed, 'long(u"-3")' +# Different base: +if long("10",16) != 16L: raise TestFailed, 'long("10",16)' +if have_unicode: + if long(unicode("10"),16) != 16L: + raise TestFailed, 'long(u"10",16)' +# Check conversions from string (same test set as for int(), and then some) +LL = [ + ('1' + '0'*20, 10L**20), + ('1' + '0'*100, 10L**100) +] +if have_unicode: + L+=[ + (unicode('1') + unicode('0')*20, 10L**20), + (unicode('1') + unicode('0')*100, 10L**100), +] +for s, v in L + LL: + for sign in "", "+", "-": + for prefix in "", " ", "\t", " \t\t ": + ss = prefix + sign + s + vv = v + if sign == "-" and v is not ValueError: + vv = -v + try: + if long(ss) != long(vv): + raise TestFailed, "long(%s)" % `ss` + except v: + pass + except ValueError, e: + raise TestFailed, "long(%s) raised ValueError: %s" % (`ss`, e) + +try: long('123\0') +except ValueError: pass +else: raise TestFailed("long('123\0') didn't raise exception") + +print 'map' +if map(None, 'hello world') != ['h','e','l','l','o',' ','w','o','r','l','d']: + raise TestFailed, 'map(None, \'hello world\')' +if map(None, 'abcd', 'efg') != \ + [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]: + raise TestFailed, 'map(None, \'abcd\', \'efg\')' +if map(None, range(10)) != [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: + raise TestFailed, 'map(None, range(10))' +if map(lambda x: x*x, range(1,4)) != [1, 4, 9]: + raise TestFailed, 'map(lambda x: x*x, range(1,4))' +try: + from math import sqrt +except ImportError: + def sqrt(x): + return pow(x, 0.5) +if map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]) != [[4.0, 2.0], [9.0, 3.0]]: + raise TestFailed, 'map(lambda x: map(sqrt,x), [[16, 4], [81, 9]])' +if map(lambda x, y: x+y, [1,3,2], [9,1,4]) != [10, 4, 6]: + raise TestFailed, 'map(lambda x,y: x+y, [1,3,2], [9,1,4])' +def plus(*v): + accu = 0 + for i in v: accu = accu + i + return accu +if map(plus, [1, 3, 7]) != [1, 3, 7]: + raise TestFailed, 'map(plus, [1, 3, 7])' +if map(plus, [1, 3, 7], [4, 9, 2]) != [1+4, 3+9, 7+2]: + raise TestFailed, 'map(plus, [1, 3, 7], [4, 9, 2])' +if map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]) != [1+4+1, 3+9+1, 7+2+0]: + raise TestFailed, 'map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])' +if map(None, Squares(10)) != [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]: + raise TestFailed, 'map(None, Squares(10))' +if map(int, Squares(10)) != [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]: + raise TestFailed, 'map(int, Squares(10))' +if map(None, Squares(3), Squares(2)) != [(0,0), (1,1), (4,None)]: + raise TestFailed, 'map(None, Squares(3), Squares(2))' +if map(max, Squares(3), Squares(2)) != [0, 1, 4]: + raise TestFailed, 'map(max, Squares(3), Squares(2))' + +print 'max' +if max('123123') != '3': raise TestFailed, 'max(\'123123\')' +if max(1, 2, 3) != 3: raise TestFailed, 'max(1, 2, 3)' +if max((1, 2, 3, 1, 2, 3)) != 3: raise TestFailed, 'max((1, 2, 3, 1, 2, 3))' +if max([1, 2, 3, 1, 2, 3]) != 3: raise TestFailed, 'max([1, 2, 3, 1, 2, 3])' +# +if max(1, 2L, 3.0) != 3.0: raise TestFailed, 'max(1, 2L, 3.0)' +if max(1L, 2.0, 3) != 3: raise TestFailed, 'max(1L, 2.0, 3)' +if max(1.0, 2, 3L) != 3L: raise TestFailed, 'max(1.0, 2, 3L)' + +print 'min' +if min('123123') != '1': raise TestFailed, 'min(\'123123\')' +if min(1, 2, 3) != 1: raise TestFailed, 'min(1, 2, 3)' +if min((1, 2, 3, 1, 2, 3)) != 1: raise TestFailed, 'min((1, 2, 3, 1, 2, 3))' +if min([1, 2, 3, 1, 2, 3]) != 1: raise TestFailed, 'min([1, 2, 3, 1, 2, 3])' +# +if min(1, 2L, 3.0) != 1: raise TestFailed, 'min(1, 2L, 3.0)' +if min(1L, 2.0, 3) != 1L: raise TestFailed, 'min(1L, 2.0, 3)' +if min(1.0, 2, 3L) != 1.0: raise TestFailed, 'min(1.0, 2, 3L)' diff --git a/lib-python/2.2/test/test_b2.py b/lib-python/2.2/test/test_b2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_b2.py @@ -0,0 +1,365 @@ +# Python test set -- part 4b, built-in functions n-z + +from test_support import * + +print 'oct' +if oct(100) != '0144': raise TestFailed, 'oct(100)' +if oct(100L) != '0144L': raise TestFailed, 'oct(100L)' +if oct(-100) not in ('037777777634', '01777777777777777777634'): + raise TestFailed, 'oct(-100)' +if oct(-100L) != '-0144L': raise TestFailed, 'oct(-100L)' + +print 'open' +# NB the first 4 lines are also used to test input and raw_input, below +fp = open(TESTFN, 'w') +try: + fp.write('1+1\n') + fp.write('1+1\n') + fp.write('The quick brown fox jumps over the lazy dog') + fp.write('.\n') + fp.write('Dear John\n') + fp.write('XXX'*100) + fp.write('YYY'*100) +finally: + fp.close() +# +fp = open(TESTFN, 'r') +try: + if fp.readline(4) != '1+1\n': raise TestFailed, 'readline(4) # exact' + if fp.readline(4) != '1+1\n': raise TestFailed, 'readline(4) # exact' + if fp.readline() != 'The quick brown fox jumps over the lazy dog.\n': + raise TestFailed, 'readline() # default' + if fp.readline(4) != 'Dear': raise TestFailed, 'readline(4) # short' + if fp.readline(100) != ' John\n': raise TestFailed, 'readline(100)' + if fp.read(300) != 'XXX'*100: raise TestFailed, 'read(300)' + if fp.read(1000) != 'YYY'*100: raise TestFailed, 'read(1000) # truncate' +finally: + fp.close() + +print 'ord' +if ord(' ') != 32: raise TestFailed, 'ord(\' \')' +if ord('A') != 65: raise TestFailed, 'ord(\'A\')' +if ord('a') != 97: raise TestFailed, 'ord(\'a\')' + +print 'pow' +if pow(0,0) != 1: raise TestFailed, 'pow(0,0)' +if pow(0,1) != 0: raise TestFailed, 'pow(0,1)' +if pow(1,0) != 1: raise TestFailed, 'pow(1,0)' +if pow(1,1) != 1: raise TestFailed, 'pow(1,1)' +# +if pow(2,0) != 1: raise TestFailed, 'pow(2,0)' +if pow(2,10) != 1024: raise TestFailed, 'pow(2,10)' +if pow(2,20) != 1024*1024: raise TestFailed, 'pow(2,20)' +if pow(2,30) != 1024*1024*1024: raise TestFailed, 'pow(2,30)' +# +if pow(-2,0) != 1: raise TestFailed, 'pow(-2,0)' +if pow(-2,1) != -2: raise TestFailed, 'pow(-2,1)' +if pow(-2,2) != 4: raise TestFailed, 'pow(-2,2)' +if pow(-2,3) != -8: raise TestFailed, 'pow(-2,3)' +# +if pow(0L,0) != 1: raise TestFailed, 'pow(0L,0)' +if pow(0L,1) != 0: raise TestFailed, 'pow(0L,1)' +if pow(1L,0) != 1: raise TestFailed, 'pow(1L,0)' +if pow(1L,1) != 1: raise TestFailed, 'pow(1L,1)' +# +if pow(2L,0) != 1: raise TestFailed, 'pow(2L,0)' +if pow(2L,10) != 1024: raise TestFailed, 'pow(2L,10)' +if pow(2L,20) != 1024*1024: raise TestFailed, 'pow(2L,20)' +if pow(2L,30) != 1024*1024*1024: raise TestFailed, 'pow(2L,30)' +# +if pow(-2L,0) != 1: raise TestFailed, 'pow(-2L,0)' +if pow(-2L,1) != -2: raise TestFailed, 'pow(-2L,1)' +if pow(-2L,2) != 4: raise TestFailed, 'pow(-2L,2)' +if pow(-2L,3) != -8: raise TestFailed, 'pow(-2L,3)' +# +if fcmp(pow(0.,0), 1.): raise TestFailed, 'pow(0.,0)' +if fcmp(pow(0.,1), 0.): raise TestFailed, 'pow(0.,1)' +if fcmp(pow(1.,0), 1.): raise TestFailed, 'pow(1.,0)' +if fcmp(pow(1.,1), 1.): raise TestFailed, 'pow(1.,1)' +# +if fcmp(pow(2.,0), 1.): raise TestFailed, 'pow(2.,0)' +if fcmp(pow(2.,10), 1024.): raise TestFailed, 'pow(2.,10)' +if fcmp(pow(2.,20), 1024.*1024.): raise TestFailed, 'pow(2.,20)' +if fcmp(pow(2.,30), 1024.*1024.*1024.): raise TestFailed, 'pow(2.,30)' +# +if fcmp(pow(-2.,0), 1.): raise TestFailed, 'pow(-2.,0)' +if fcmp(pow(-2.,1), -2.): raise TestFailed, 'pow(-2.,1)' +if fcmp(pow(-2.,2), 4.): raise TestFailed, 'pow(-2.,2)' +if fcmp(pow(-2.,3), -8.): raise TestFailed, 'pow(-2.,3)' + +from types import FloatType +for x in 2, 2L, 2.0: + for y in 10, 10L, 10.0: + for z in 1000, 1000L, 1000.0: + if isinstance(x, FloatType) or \ + isinstance(y, FloatType) or \ + isinstance(z, FloatType): + try: + pow(x, y, z) + except TypeError: + pass + else: + raise TestFailed("3-arg float pow(%s, %s, %s) should " + "have raised TypeError" % (x, y, z)) + else: + if fcmp(pow(x, y, z), 24.0): + raise TestFailed, 'pow(%s, %s, %s)' % (x, y, z) + +print 'range' +if range(3) != [0, 1, 2]: raise TestFailed, 'range(3)' +if range(1, 5) != [1, 2, 3, 4]: raise TestFailed, 'range(1, 5)' +if range(0) != []: raise TestFailed, 'range(0)' +if range(-3) != []: raise TestFailed, 'range(-3)' +if range(1, 10, 3) != [1, 4, 7]: raise TestFailed, 'range(1, 10, 3)' +if range(5, -5, -3) != [5, 2, -1, -4]: raise TestFailed, 'range(5, -5, -3)' + +print 'input and raw_input' +import sys +fp = open(TESTFN, 'r') +savestdin = sys.stdin +try: + sys.stdin = fp + if input() != 2: raise TestFailed, 'input()' + if input('testing\n') != 2: raise TestFailed, 'input()' + if raw_input() != 'The quick brown fox jumps over the lazy dog.': + raise TestFailed, 'raw_input()' + if raw_input('testing\n') != 'Dear John': + raise TestFailed, 'raw_input(\'testing\\n\')' +finally: + sys.stdin = savestdin + fp.close() + +print 'reduce' +if reduce(lambda x, y: x+y, ['a', 'b', 'c'], '') != 'abc': + raise TestFailed, 'reduce(): implode a string' +if reduce(lambda x, y: x+y, + [['a', 'c'], [], ['d', 'w']], []) != ['a','c','d','w']: + raise TestFailed, 'reduce(): append' +if reduce(lambda x, y: x*y, range(2,8), 1) != 5040: + raise TestFailed, 'reduce(): compute 7!' +if reduce(lambda x, y: x*y, range(2,21), 1L) != 2432902008176640000L: + raise TestFailed, 'reduce(): compute 20!, use long' +class Squares: + def __init__(self, max): + self.max = max + self.sofar = [] + def __len__(self): return len(self.sofar) + def __getitem__(self, i): + if not 0 <= i < self.max: raise IndexError + n = len(self.sofar) + while n <= i: + self.sofar.append(n*n) + n = n+1 + return self.sofar[i] +if reduce(lambda x, y: x+y, Squares(10)) != 285: + raise TestFailed, 'reduce(<+>, Squares(10))' +if reduce(lambda x, y: x+y, Squares(10), 0) != 285: + raise TestFailed, 'reduce(<+>, Squares(10), 0)' +if reduce(lambda x, y: x+y, Squares(0), 0) != 0: + raise TestFailed, 'reduce(<+>, Squares(0), 0)' + + +print 'reload' +import marshal +reload(marshal) +import string +reload(string) +## import sys +## try: reload(sys) +## except ImportError: pass +## else: raise TestFailed, 'reload(sys) should fail' + +print 'repr' +if repr('') != '\'\'': raise TestFailed, 'repr(\'\')' +if repr(0) != '0': raise TestFailed, 'repr(0)' +if repr(0L) != '0L': raise TestFailed, 'repr(0L)' +if repr(()) != '()': raise TestFailed, 'repr(())' +if repr([]) != '[]': raise TestFailed, 'repr([])' +if repr({}) != '{}': raise TestFailed, 'repr({})' + +print 'round' +if round(0.0) != 0.0: raise TestFailed, 'round(0.0)' +if round(1.0) != 1.0: raise TestFailed, 'round(1.0)' +if round(10.0) != 10.0: raise TestFailed, 'round(10.0)' +if round(1000000000.0) != 1000000000.0: + raise TestFailed, 'round(1000000000.0)' +if round(1e20) != 1e20: raise TestFailed, 'round(1e20)' + +if round(-1.0) != -1.0: raise TestFailed, 'round(-1.0)' +if round(-10.0) != -10.0: raise TestFailed, 'round(-10.0)' +if round(-1000000000.0) != -1000000000.0: + raise TestFailed, 'round(-1000000000.0)' +if round(-1e20) != -1e20: raise TestFailed, 'round(-1e20)' + +if round(0.1) != 0.0: raise TestFailed, 'round(0.0)' +if round(1.1) != 1.0: raise TestFailed, 'round(1.0)' +if round(10.1) != 10.0: raise TestFailed, 'round(10.0)' +if round(1000000000.1) != 1000000000.0: + raise TestFailed, 'round(1000000000.0)' + +if round(-1.1) != -1.0: raise TestFailed, 'round(-1.0)' +if round(-10.1) != -10.0: raise TestFailed, 'round(-10.0)' +if round(-1000000000.1) != -1000000000.0: + raise TestFailed, 'round(-1000000000.0)' + +if round(0.9) != 1.0: raise TestFailed, 'round(0.9)' +if round(9.9) != 10.0: raise TestFailed, 'round(9.9)' +if round(999999999.9) != 1000000000.0: + raise TestFailed, 'round(999999999.9)' + +if round(-0.9) != -1.0: raise TestFailed, 'round(-0.9)' +if round(-9.9) != -10.0: raise TestFailed, 'round(-9.9)' +if round(-999999999.9) != -1000000000.0: + raise TestFailed, 'round(-999999999.9)' + +print 'setattr' +import sys +setattr(sys, 'spam', 1) +if sys.spam != 1: raise TestFailed, 'setattr(sys, \'spam\', 1)' +try: + setattr(sys, 1, 'spam') +except TypeError: + pass +else: + raise TestFailed, "setattr(sys, 1, 'spam') should raise exception" + +print 'str' +if str('') != '': raise TestFailed, 'str(\'\')' +if str(0) != '0': raise TestFailed, 'str(0)' +if str(0L) != '0': raise TestFailed, 'str(0L)' +if str(()) != '()': raise TestFailed, 'str(())' +if str([]) != '[]': raise TestFailed, 'str([])' +if str({}) != '{}': raise TestFailed, 'str({})' + +print 'tuple' +if tuple(()) != (): raise TestFailed, 'tuple(())' +t0_3 = (0, 1, 2, 3) +t0_3_bis = tuple(t0_3) +if t0_3 is not t0_3_bis: raise TestFailed, 'tuple((0, 1, 2, 3))' +if tuple([]) != (): raise TestFailed, 'tuple([])' +if tuple([0, 1, 2, 3]) != (0, 1, 2, 3): raise TestFailed, 'tuple([0, 1, 2, 3])' +if tuple('') != (): raise TestFailed, 'tuple('')' +if tuple('spam') != ('s', 'p', 'a', 'm'): raise TestFailed, "tuple('spam')" + +print 'type' +if type('') != type('123') or type('') == type(()): + raise TestFailed, 'type()' + +print 'vars' +a = b = None +a = vars().keys() +b = dir() +a.sort() +b.sort() +if a != b: raise TestFailed, 'vars()' +import sys +a = vars(sys).keys() +b = dir(sys) +a.sort() +b.sort() +if a != b: raise TestFailed, 'vars(sys)' +def f0(): + if vars() != {}: raise TestFailed, 'vars() in f0()' +f0() +def f2(): + f0() + a = 1 + b = 2 + if vars() != {'a': a, 'b': b}: raise TestFailed, 'vars() in f2()' +f2() + +print 'xrange' +import warnings +warnings.filterwarnings('ignore', r".*xrange", DeprecationWarning) +if tuple(xrange(10)) != tuple(range(10)): raise TestFailed, 'xrange(10)' +if tuple(xrange(5,10)) != tuple(range(5,10)): raise TestFailed, 'xrange(5,10)' +if tuple(xrange(0,10,2)) != tuple(range(0,10,2)): + raise TestFailed, 'xrange(0,10,2)' +r = xrange(10) +if r.tolist() != range(10): raise TestFailed, 'xrange(10).tolist()' +if r.start != 0: raise TestFailed, 'xrange(10).start' +if r.stop != 10: raise TestFailed, 'xrange(10).stop' +if r.step != 1: raise TestFailed, 'xrange(10).step' +r = xrange(3, 10) +if r.tolist() != range(3, 10): raise TestFailed, 'xrange(3, 10).tolist()' +if r.start != 3: raise TestFailed, 'xrange(3, 10).start' +if r.stop != 10: raise TestFailed, 'xrange(3, 10).stop' +if r.step != 1: raise TestFailed, 'xrange(3, 10).step' +r = xrange(3, 10, 2) +if r.tolist() != range(3, 10, 2): raise TestFailed, 'xrange(3, 10, 2).tolist()' +if r.start != 3: raise TestFailed, 'xrange(3, 10, 2).start' +if r.stop != 11: raise TestFailed, 'xrange(3, 10, 2).stop' +if r.step != 2: raise TestFailed, 'xrange(3, 10, 2).step' +r = xrange(10, 3, -1) +if r.tolist() != range(10, 3, -1): + raise TestFailed, 'xrange(10, 3, -1).tolist()' +if r.start != 10: raise TestFailed, 'xrange(10, 3, -1).start' +if r.stop != 3: raise TestFailed, 'xrange(10, 3, -1).stop' +if r.step != -1: raise TestFailed, 'xrange(10, 3, -1).step' +# regression tests for SourceForge bug #221965 +def _range_test(r): + verify(r.start != r.stop, 'Test not valid for passed-in xrange object.') + if r.stop in r: + raise TestFailed, 'r.stop in ' + `r` + if r.stop-r.step not in r: + raise TestFailed, 'r.stop-r.step not in ' + `r` + if r.start not in r: + raise TestFailed, 'r.start not in ' + `r` + if r.stop+r.step in r: + raise TestFailed, 'r.stop+r.step in ' + `r` +_range_test(xrange(10)) +_range_test(xrange(9, -1, -1)) +_range_test(xrange(0, 10, 2)) + +print 'zip' +a = (1, 2, 3) +b = (4, 5, 6) +t = [(1, 4), (2, 5), (3, 6)] +if zip(a, b) != t: raise TestFailed, 'zip(a, b) - same size, both tuples' +b = [4, 5, 6] +if zip(a, b) != t: raise TestFailed, 'zip(a, b) - same size, tuple/list' +b = (4, 5, 6, 7) +if zip(a, b) != t: raise TestFailed, 'zip(a, b) - b is longer' +class I: + def __getitem__(self, i): + if i < 0 or i > 2: raise IndexError + return i + 4 +if zip(a, I()) != t: raise TestFailed, 'zip(a, b) - b is instance' +exc = 0 +try: + zip() +except TypeError: + exc = 1 +except: + e = sys.exc_info()[0] + raise TestFailed, 'zip() - no args, expected TypeError, got %s' % e +if not exc: + raise TestFailed, 'zip() - no args, missing expected TypeError' + +exc = 0 +try: + zip(None) +except TypeError: + exc = 1 +except: + e = sys.exc_info()[0] + raise TestFailed, 'zip(None) - expected TypeError, got %s' % e +if not exc: + raise TestFailed, 'zip(None) - missing expected TypeError' +class G: + pass +exc = 0 +try: + zip(a, G()) +except TypeError: + exc = 1 +except: + e = sys.exc_info()[0] + raise TestFailed, 'zip(a, b) - b instance w/o __getitem__' +if not exc: + raise TestFailed, 'zip(a, b) - missing expected TypeError' + + +# Epilogue -- unlink the temp file + +unlink(TESTFN) diff --git a/lib-python/2.2/test/test_base64.py b/lib-python/2.2/test/test_base64.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_base64.py @@ -0,0 +1,53 @@ +import unittest +import test_support +import base64 +from binascii import Error as binascii_error + +class Base64TestCase(unittest.TestCase): + def test_encode_string(self): + """Testing encode string""" + test_support.verify(base64.encodestring("www.python.org") == + "d3d3LnB5dGhvbi5vcmc=\n", + reason="www.python.org encodestring failed") + test_support.verify(base64.encodestring("a") == + "YQ==\n", + reason="a encodestring failed") + test_support.verify(base64.encodestring("ab") == + "YWI=\n", + reason="ab encodestring failed") + test_support.verify(base64.encodestring("abc") == + "YWJj\n", + reason="abc encodestring failed") + test_support.verify(base64.encodestring("") == + "", + reason="null encodestring failed") + test_support.verify(base64.encodestring( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#0^&*();:<>,. []{}") == + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n", + reason = "long encodestring failed") + + def test_decode_string(self): + """Testing decode string""" + test_support.verify(base64.decodestring("d3d3LnB5dGhvbi5vcmc=\n") == + "www.python.org", + reason="www.python.org decodestring failed") + test_support.verify(base64.decodestring("YQ==\n") == + "a", + reason="a decodestring failed") + test_support.verify(base64.decodestring("YWI=\n") == + "ab", + reason="ab decodestring failed") + test_support.verify(base64.decodestring("YWJj\n") == + "abc", + reason="abc decodestring failed") + test_support.verify(base64.decodestring( + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n") == + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#0^&*();:<>,. []{}", + reason = "long decodestring failed") + test_support.verify(base64.decodestring('') == '') + +def test_main(): + test_support.run_unittest(Base64TestCase) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_bastion.py b/lib-python/2.2/test/test_bastion.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_bastion.py @@ -0,0 +1,3 @@ +##import Bastion +## +##Bastion._test() diff --git a/lib-python/2.2/test/test_binascii.py b/lib-python/2.2/test/test_binascii.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_binascii.py @@ -0,0 +1,119 @@ +"""Test the binascii C module.""" + +from test_support import verify, verbose +import binascii + +# Show module doc string +print binascii.__doc__ + +# Show module exceptions +print binascii.Error +print binascii.Incomplete + +# Check presence and display doc strings of all functions +funcs = [] +for suffix in "base64", "hqx", "uu": + prefixes = ["a2b_", "b2a_"] + if suffix == "hqx": + prefixes.extend(["crc_", "rlecode_", "rledecode_"]) + for prefix in prefixes: + name = prefix + suffix + funcs.append(getattr(binascii, name)) +for func in funcs: + print "%-15s: %s" % (func.__name__, func.__doc__) + +# Create binary test data +testdata = "The quick brown fox jumps over the lazy dog.\r\n" +for i in range(256): + # Be slow so we don't depend on other modules + testdata = testdata + chr(i) +testdata = testdata + "\r\nHello world.\n" + +# Test base64 with valid data +print "base64 test" +MAX_BASE64 = 57 +lines = [] +for i in range(0, len(testdata), MAX_BASE64): + b = testdata[i:i+MAX_BASE64] + a = binascii.b2a_base64(b) + lines.append(a) + print a, +res = "" +for line in lines: + b = binascii.a2b_base64(line) + res = res + b +verify(res == testdata) + +# Test base64 with random invalid characters sprinkled throughout +# (This requires a new version of binascii.) +fillers = "" +valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" +for i in range(256): + c = chr(i) + if c not in valid: + fillers = fillers + c +def addnoise(line): + noise = fillers + ratio = len(line) // len(noise) + res = "" + while line and noise: + if len(line) // len(noise) > ratio: + c, line = line[0], line[1:] + else: + c, noise = noise[0], noise[1:] + res = res + c + return res + noise + line +res = "" +for line in map(addnoise, lines): + b = binascii.a2b_base64(line) + res = res + b +verify(res == testdata) + +# Test base64 with just invalid characters, which should return +# empty strings. +verify(binascii.a2b_base64(fillers) == '') + +# Test uu +print "uu test" +MAX_UU = 45 +lines = [] +for i in range(0, len(testdata), MAX_UU): + b = testdata[i:i+MAX_UU] + a = binascii.b2a_uu(b) + lines.append(a) + print a, +res = "" +for line in lines: + b = binascii.a2b_uu(line) + res = res + b +verify(res == testdata) + +# Test crc32() +crc = binascii.crc32("Test the CRC-32 of") +crc = binascii.crc32(" this string.", crc) +if crc != 1571220330: + print "binascii.crc32() failed." + +# The hqx test is in test_binhex.py + +# test hexlification +s = '{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' +t = binascii.b2a_hex(s) +u = binascii.a2b_hex(t) +if s != u: + print 'binascii hexlification failed' +try: + binascii.a2b_hex(t[:-1]) +except TypeError: + pass +else: + print 'expected TypeError not raised' +try: + binascii.a2b_hex(t[:-1] + 'q') +except TypeError: + pass +else: + print 'expected TypeError not raised' + +# Verify the treatment of Unicode strings +verify(binascii.hexlify(u'a') == '61', "hexlify failed for Unicode") diff --git a/lib-python/2.2/test/test_binhex.py b/lib-python/2.2/test/test_binhex.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_binhex.py @@ -0,0 +1,50 @@ +#! /usr/bin/env python +"""Test script for the binhex C module + + Uses the mechanism of the python binhex module + Based on an original test by Roger E. Masse. +""" +import binhex +import os +import tempfile +import test_support +import unittest + + +class BinHexTestCase(unittest.TestCase): + + def setUp(self): + self.fname1 = tempfile.mktemp() + self.fname2 = tempfile.mktemp() + + def tearDown(self): + try: os.unlink(self.fname1) + except OSError: pass + + try: os.unlink(self.fname2) + except OSError: pass + + DATA = 'Jack is my hero' + + def test_binhex(self): + f = open(self.fname1, 'w') + f.write(self.DATA) + f.close() + + binhex.binhex(self.fname1, self.fname2) + + binhex.hexbin(self.fname2, self.fname1) + + f = open(self.fname1, 'r') + finish = f.readline() + f.close() + + self.assertEqual(self.DATA, finish) + + +def test_main(): + test_support.run_unittest(BinHexTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_binop.py b/lib-python/2.2/test/test_binop.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_binop.py @@ -0,0 +1,328 @@ +"""Tests for binary operators on subtypes of built-in types.""" + +import test_support +import unittest + +def gcd(a, b): + """Greatest common divisor using Euclid's algorithm.""" + while a: + a, b = b%a, a + return b + +def isint(x): + """Test whether an object is an instance of int or long.""" + return isinstance(x, int) or isinstance(x, long) + +def isnum(x): + """Test whether an object is an instance of a built-in numeric type.""" + for T in int, long, float, complex: + if isinstance(x, T): + return 1 + return 0 + +def isRat(x): + """Test wheter an object is an instance of the Rat class.""" + return isinstance(x, Rat) + +class Rat(object): + + """Rational number implemented as a normalized pair of longs.""" + + __slots__ = ['_Rat__num', '_Rat__den'] + + def __init__(self, num=0L, den=1L): + """Constructor: Rat([num[, den]]). + + The arguments must be ints or longs, and default to (0, 1).""" + if not isint(num): + raise TypeError, "Rat numerator must be int or long (%r)" % num + if not isint(den): + raise TypeError, "Rat denominator must be int or long (%r)" % den + # But the zero is always on + if den == 0: + raise ZeroDivisionError, "zero denominator" + g = gcd(den, num) + self.__num = long(num//g) + self.__den = long(den//g) + + def _get_num(self): + """Accessor function for read-only 'num' attribute of Rat.""" + return self.__num + num = property(_get_num, None) + + def _get_den(self): + """Accessor function for read-only 'den' attribute of Rat.""" + return self.__den + den = property(_get_den, None) + + def __repr__(self): + """Convert a Rat to an string resembling a Rat constructor call.""" + return "Rat(%d, %d)" % (self.__num, self.__den) + + def __str__(self): + """Convert a Rat to a string resembling a decimal numeric value.""" + return str(float(self)) + + def __float__(self): + """Convert a Rat to a float.""" + return self.__num*1.0/self.__den + + def __int__(self): + """Convert a Rat to an int; self.den must be 1.""" + if self.__den == 1: + try: + return int(self.__num) + except OverflowError: + raise OverflowError, ("%s too large to convert to int" % + repr(self)) + raise ValueError, "can't convert %s to int" % repr(self) + + def __long__(self): + """Convert a Rat to an long; self.den must be 1.""" + if self.__den == 1: + return long(self.__num) + raise ValueError, "can't convert %s to long" % repr(self) + + def __add__(self, other): + """Add two Rats, or a Rat and a number.""" + if isint(other): + other = Rat(other) + if isRat(other): + return Rat(self.__num*other.__den + other.__num*self.__den, + self.__den*other.__den) + if isnum(other): + return float(self) + other + return NotImplemented + + __radd__ = __add__ + + def __sub__(self, other): + """Subtract two Rats, or a Rat and a number.""" + if isint(other): + other = Rat(other) + if isRat(other): + return Rat(self.__num*other.__den - other.__num*self.__den, + self.__den*other.__den) + if isnum(other): + return float(self) - other + return NotImplemented + + def __rsub__(self, other): + """Subtract two Rats, or a Rat and a number (reversed args).""" + if isint(other): + other = Rat(other) + if isRat(other): + return Rat(other.__num*self.__den - self.__num*other.__den, + self.__den*other.__den) + if isnum(other): + return other - float(self) + return NotImplemented + + def __mul__(self, other): + """Multiply two Rats, or a Rat and a number.""" + if isRat(other): + return Rat(self.__num*other.__num, self.__den*other.__den) + if isint(other): + return Rat(self.__num*other, self.__den) + if isnum(other): + return float(self)*other + return NotImplemented + + __rmul__ = __mul__ + + def __truediv__(self, other): + """Divide two Rats, or a Rat and a number.""" + if isRat(other): + return Rat(self.__num*other.__den, self.__den*other.__num) + if isint(other): + return Rat(self.__num, self.__den*other) + if isnum(other): + return float(self) / other + return NotImplemented + + __div__ = __truediv__ + + def __rtruediv__(self, other): + """Divide two Rats, or a Rat and a number (reversed args).""" + if isRat(other): + return Rat(other.__num*self.__den, other.__den*self.__num) + if isint(other): + return Rat(other*self.__den, self.__num) + if isnum(other): + return other / float(self) + return NotImplemented + + __rdiv__ = __rtruediv__ + + def __floordiv__(self, other): + """Divide two Rats, returning the floored result.""" + if isint(other): + other = Rat(other) + elif not isRat(other): + return NotImplemented + x = self/other + return x.__num // x.__den + + def __rfloordiv__(self, other): + """Divide two Rats, returning the floored result (reversed args).""" + x = other/self + return x.__num // x.__den + + def __divmod__(self, other): + """Divide two Rats, returning quotient and remainder.""" + if isint(other): + other = Rat(other) + elif not isRat(other): + return NotImplemented + x = self//other + return (x, self - other * x) + + def __rdivmod__(self, other): + "Divide two Rats, returning quotient and remainder (reversed args).""" + if isint(other): + other = Rat(other) + elif not isRat(other): + return NotImplemented + return divmod(other, self) + + def __mod__(self, other): + """Take one Rat modulo another.""" + return divmod(self, other)[1] + + def __rmod__(self, other): + """Take one Rat modulo another (reversed args).""" + return divmod(other, self)[1] + + def __eq__(self, other): + """Compare two Rats for equality.""" + if isint(other): + return self.__den == 1 and self.__num == other + if isRat(other): + return self.__num == other.__num and self.__den == other.__den + if isnum(other): + return float(self) == other + return NotImplemented + + def __ne__(self, other): + """Compare two Rats for inequality.""" + return not self == other + +class RatTestCase(unittest.TestCase): + """Unit tests for Rat class and its support utilities.""" + + def test_gcd(self): + self.assertEqual(gcd(10, 12), 2) + self.assertEqual(gcd(10, 15), 5) + self.assertEqual(gcd(10, 11), 1) + self.assertEqual(gcd(100, 15), 5) + self.assertEqual(gcd(-10, 2), -2) + self.assertEqual(gcd(10, -2), 2) + self.assertEqual(gcd(-10, -2), -2) + for i in range(1, 20): + for j in range(1, 20): + self.assert_(gcd(i, j) > 0) + self.assert_(gcd(-i, j) < 0) + self.assert_(gcd(i, -j) > 0) + self.assert_(gcd(-i, -j) < 0) + + def test_constructor(self): + a = Rat(10, 15) + self.assertEqual(a.num, 2) + self.assertEqual(a.den, 3) + a = Rat(10L, 15L) + self.assertEqual(a.num, 2) + self.assertEqual(a.den, 3) + a = Rat(10, -15) + self.assertEqual(a.num, -2) + self.assertEqual(a.den, 3) + a = Rat(-10, 15) + self.assertEqual(a.num, -2) + self.assertEqual(a.den, 3) + a = Rat(-10, -15) + self.assertEqual(a.num, 2) + self.assertEqual(a.den, 3) + a = Rat(7) + self.assertEqual(a.num, 7) + self.assertEqual(a.den, 1) + try: + a = Rat(1, 0) + except ZeroDivisionError: + pass + else: + self.fail("Rat(1, 0) didn't raise ZeroDivisionError") + for bad in "0", 0.0, 0j, (), [], {}, None, Rat, unittest: + try: + a = Rat(bad) + except TypeError: + pass + else: + self.fail("Rat(%r) didn't raise TypeError" % bad) + try: + a = Rat(1, bad) + except TypeError: + pass + else: + self.fail("Rat(1, %r) didn't raise TypeError" % bad) + + def test_add(self): + self.assertEqual(Rat(2, 3) + Rat(1, 3), 1) + self.assertEqual(Rat(2, 3) + 1, Rat(5, 3)) + self.assertEqual(1 + Rat(2, 3), Rat(5, 3)) + self.assertEqual(1.0 + Rat(1, 2), 1.5) + self.assertEqual(Rat(1, 2) + 1.0, 1.5) + + def test_sub(self): + self.assertEqual(Rat(7, 2) - Rat(7, 5), Rat(21, 10)) + self.assertEqual(Rat(7, 5) - 1, Rat(2, 5)) + self.assertEqual(1 - Rat(3, 5), Rat(2, 5)) + self.assertEqual(Rat(3, 2) - 1.0, 0.5) + self.assertEqual(1.0 - Rat(1, 2), 0.5) + + def test_mul(self): + self.assertEqual(Rat(2, 3) * Rat(5, 7), Rat(10, 21)) + self.assertEqual(Rat(10, 3) * 3, 10) + self.assertEqual(3 * Rat(10, 3), 10) + self.assertEqual(Rat(10, 5) * 0.5, 1.0) + self.assertEqual(0.5 * Rat(10, 5), 1.0) + + def test_div(self): + self.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3)) + self.assertEqual(Rat(10, 3) / 3, Rat(10, 9)) + self.assertEqual(2 / Rat(5), Rat(2, 5)) + self.assertEqual(3.0 * Rat(1, 2), 1.5) + self.assertEqual(Rat(1, 2) * 3.0, 1.5) + + def test_floordiv(self): + self.assertEqual(Rat(10) // Rat(4), 2) + self.assertEqual(Rat(10, 3) // Rat(4, 3), 2) + self.assertEqual(Rat(10) // 4, 2) + self.assertEqual(10 // Rat(4), 2) + + def test_eq(self): + self.assertEqual(Rat(10), Rat(20, 2)) + self.assertEqual(Rat(10), 10) + self.assertEqual(10, Rat(10)) + self.assertEqual(Rat(10), 10.0) + self.assertEqual(10.0, Rat(10)) + + def test_future_div(self): + exec future_test + + # XXX Ran out of steam; TO DO: divmod, div, future division + +future_test = """ +from __future__ import division +self.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3)) +self.assertEqual(Rat(10, 3) / 3, Rat(10, 9)) +self.assertEqual(2 / Rat(5), Rat(2, 5)) +self.assertEqual(3.0 * Rat(1, 2), 1.5) +self.assertEqual(Rat(1, 2) * 3.0, 1.5) +self.assertEqual(eval('1/2'), 0.5) +""" + +def test_main(): + test_support.run_unittest(RatTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_bisect.py b/lib-python/2.2/test/test_bisect.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_bisect.py @@ -0,0 +1,127 @@ +from test_support import TestFailed + +import bisect +import sys + +nerrors = 0 + +def check_bisect(func, list, elt, expected): + global nerrors + got = func(list, elt) + if got != expected: + print >> sys.stderr, \ + "expected %s(%s, %s) -> %s, but got %s" % (func.__name__, + list, + elt, + expected, + got) + nerrors += 1 + +# XXX optional slice arguments need tests. + +check_bisect(bisect.bisect_right, [], 1, 0) +check_bisect(bisect.bisect_right, [1], 0, 0) +check_bisect(bisect.bisect_right, [1], 1, 1) +check_bisect(bisect.bisect_right, [1], 2, 1) +check_bisect(bisect.bisect_right, [1, 1], 0, 0) +check_bisect(bisect.bisect_right, [1, 1], 1, 2) +check_bisect(bisect.bisect_right, [1, 1], 2, 2) +check_bisect(bisect.bisect_right, [1, 1, 1], 0, 0) +check_bisect(bisect.bisect_right, [1, 1, 1], 1, 3) +check_bisect(bisect.bisect_right, [1, 1, 1], 2, 3) +check_bisect(bisect.bisect_right, [1, 1, 1, 1], 0, 0) +check_bisect(bisect.bisect_right, [1, 1, 1, 1], 1, 4) +check_bisect(bisect.bisect_right, [1, 1, 1, 1], 2, 4) +check_bisect(bisect.bisect_right, [1, 2], 0, 0) +check_bisect(bisect.bisect_right, [1, 2], 1, 1) +check_bisect(bisect.bisect_right, [1, 2], 1.5, 1) +check_bisect(bisect.bisect_right, [1, 2], 2, 2) +check_bisect(bisect.bisect_right, [1, 2], 3, 2) +check_bisect(bisect.bisect_right, [1, 1, 2, 2], 0, 0) +check_bisect(bisect.bisect_right, [1, 1, 2, 2], 1, 2) +check_bisect(bisect.bisect_right, [1, 1, 2, 2], 1.5, 2) +check_bisect(bisect.bisect_right, [1, 1, 2, 2], 2, 4) +check_bisect(bisect.bisect_right, [1, 1, 2, 2], 3, 4) +check_bisect(bisect.bisect_right, [1, 2, 3], 0, 0) +check_bisect(bisect.bisect_right, [1, 2, 3], 1, 1) +check_bisect(bisect.bisect_right, [1, 2, 3], 1.5, 1) +check_bisect(bisect.bisect_right, [1, 2, 3], 2, 2) +check_bisect(bisect.bisect_right, [1, 2, 3], 2.5, 2) +check_bisect(bisect.bisect_right, [1, 2, 3], 3, 3) +check_bisect(bisect.bisect_right, [1, 2, 3], 4, 3) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 0, 0) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1, 1) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1.5, 1) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2, 3) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2.5, 3) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3, 6) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3.5, 6) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 4, 10) +check_bisect(bisect.bisect_right, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 5, 10) + +check_bisect(bisect.bisect_left, [], 1, 0) +check_bisect(bisect.bisect_left, [1], 0, 0) +check_bisect(bisect.bisect_left, [1], 1, 0) +check_bisect(bisect.bisect_left, [1], 2, 1) +check_bisect(bisect.bisect_left, [1, 1], 0, 0) +check_bisect(bisect.bisect_left, [1, 1], 1, 0) +check_bisect(bisect.bisect_left, [1, 1], 2, 2) +check_bisect(bisect.bisect_left, [1, 1, 1], 0, 0) +check_bisect(bisect.bisect_left, [1, 1, 1], 1, 0) +check_bisect(bisect.bisect_left, [1, 1, 1], 2, 3) +check_bisect(bisect.bisect_left, [1, 1, 1, 1], 0, 0) +check_bisect(bisect.bisect_left, [1, 1, 1, 1], 1, 0) +check_bisect(bisect.bisect_left, [1, 1, 1, 1], 2, 4) +check_bisect(bisect.bisect_left, [1, 2], 0, 0) +check_bisect(bisect.bisect_left, [1, 2], 1, 0) +check_bisect(bisect.bisect_left, [1, 2], 1.5, 1) +check_bisect(bisect.bisect_left, [1, 2], 2, 1) +check_bisect(bisect.bisect_left, [1, 2], 3, 2) +check_bisect(bisect.bisect_left, [1, 1, 2, 2], 0, 0) +check_bisect(bisect.bisect_left, [1, 1, 2, 2], 1, 0) +check_bisect(bisect.bisect_left, [1, 1, 2, 2], 1.5, 2) +check_bisect(bisect.bisect_left, [1, 1, 2, 2], 2, 2) +check_bisect(bisect.bisect_left, [1, 1, 2, 2], 3, 4) +check_bisect(bisect.bisect_left, [1, 2, 3], 0, 0) +check_bisect(bisect.bisect_left, [1, 2, 3], 1, 0) +check_bisect(bisect.bisect_left, [1, 2, 3], 1.5, 1) +check_bisect(bisect.bisect_left, [1, 2, 3], 2, 1) +check_bisect(bisect.bisect_left, [1, 2, 3], 2.5, 2) +check_bisect(bisect.bisect_left, [1, 2, 3], 3, 2) +check_bisect(bisect.bisect_left, [1, 2, 3], 4, 3) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 0, 0) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1, 0) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1.5, 1) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2, 1) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2.5, 3) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3, 3) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3.5, 6) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 4, 6) +check_bisect(bisect.bisect_left, [1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 5, 10) + +def check_insort(n): + global nerrors + from random import choice + import sys + digits = "0123456789" + raw = [] + insorted = [] + for i in range(n): + digit = choice(digits) + raw.append(digit) + if digit in "02468": + f = bisect.insort_left + else: + f = bisect.insort_right + f(insorted, digit) + sorted = raw[:] + sorted.sort() + if sorted == insorted: + return + print >> sys.stderr, "insort test failed: raw %s got %s" % (raw, insorted) + nerrors += 1 + +check_insort(500) + +if nerrors: + raise TestFailed("%d errors in test_bisect" % nerrors) diff --git a/lib-python/2.2/test/test_bsddb.py b/lib-python/2.2/test/test_bsddb.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_bsddb.py @@ -0,0 +1,76 @@ +#! /usr/bin/env python +"""Test script for the bsddb C module + Roger E. Masse +""" + +import os +import bsddb +import dbhash # Just so we know it's imported +import tempfile +from test_support import verbose, verify + +def test(openmethod, what): + + if verbose: + print '\nTesting: ', what + + fname = tempfile.mktemp() + f = openmethod(fname, 'c') + verify(f.keys() == []) + if verbose: + print 'creation...' + f['0'] = '' + f['a'] = 'Guido' + f['b'] = 'van' + f['c'] = 'Rossum' + f['d'] = 'invented' + f['f'] = 'Python' + if verbose: + print '%s %s %s' % (f['a'], f['b'], f['c']) + + if what == 'BTree' : + if verbose: + print 'key ordering...' + f.set_location(f.first()[0]) + while 1: + try: + rec = f.next() + except KeyError: + if rec != f.last(): + print 'Error, last != last!' + f.previous() + break + if verbose: + print rec + if not f.has_key('a'): + print 'Error, missing key!' + + f.sync() + f.close() + if verbose: + print 'modification...' + f = openmethod(fname, 'w') + f['d'] = 'discovered' + + if verbose: + print 'access...' + for key in f.keys(): + word = f[key] + if verbose: + print word + + f.close() + try: + os.remove(fname) + except os.error: + pass + +types = [(bsddb.btopen, 'BTree'), + (bsddb.hashopen, 'Hash Table'), + # (bsddb.rnopen,'Record Numbers'), 'put' for RECNO for bsddb 1.85 + # appears broken... at least on + # Solaris Intel - rmasse 1/97 + ] + +for type in types: + test(type[0], type[1]) diff --git a/lib-python/2.2/test/test_bufio.py b/lib-python/2.2/test/test_bufio.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_bufio.py @@ -0,0 +1,60 @@ +from test_support import verify, TestFailed, TESTFN + +# Simple test to ensure that optimizations in fileobject.c deliver +# the expected results. For best testing, run this under a debug-build +# Python too (to exercise asserts in the C code). + +# Repeat string 'pattern' as often as needed to reach total length +# 'length'. Then call try_one with that string, a string one larger +# than that, and a string one smaller than that. The main driver +# feeds this all small sizes and various powers of 2, so we exercise +# all likely stdio buffer sizes, and "off by one" errors on both +# sides. +def drive_one(pattern, length): + q, r = divmod(length, len(pattern)) + teststring = pattern * q + pattern[:r] + verify(len(teststring) == length) + try_one(teststring) + try_one(teststring + "x") + try_one(teststring[:-1]) + +# Write s + "\n" + s to file, then open it and ensure that successive +# .readline()s deliver what we wrote. +def try_one(s): + # Since C doesn't guarantee we can write/read arbitrary bytes in text + # files, use binary mode. + f = open(TESTFN, "wb") + # write once with \n and once without + f.write(s) + f.write("\n") + f.write(s) + f.close() + f = open(TESTFN, "rb") + line = f.readline() + if line != s + "\n": + raise TestFailed("Expected %r got %r" % (s + "\n", line)) + line = f.readline() + if line != s: + raise TestFailed("Expected %r got %r" % (s, line)) + line = f.readline() + if line: + raise TestFailed("Expected EOF but got %r" % line) + f.close() + +# A pattern with prime length, to avoid simple relationships with +# stdio buffer sizes. +primepat = "1234567890\00\01\02\03\04\05\06" + +nullpat = "\0" * 1000 + +try: + for size in range(1, 257) + [512, 1000, 1024, 2048, 4096, 8192, 10000, + 16384, 32768, 65536, 1000000]: + drive_one(primepat, size) + drive_one(nullpat, size) +finally: + try: + import os + os.unlink(TESTFN) + except: + pass diff --git a/lib-python/2.2/test/test_builtin.py b/lib-python/2.2/test/test_builtin.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_builtin.py @@ -0,0 +1,13 @@ +# Python test set -- part 4, built-in functions + +from test_support import * + +print '4. Built-in functions' + +print 'test_b1' +unload('test_b1') +import test_b1 + +print 'test_b2' +unload('test_b2') +import test_b2 diff --git a/lib-python/2.2/test/test_calendar.py b/lib-python/2.2/test/test_calendar.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_calendar.py @@ -0,0 +1,61 @@ +import calendar +import unittest + +from test_support import run_unittest + + +class CalendarTestCase(unittest.TestCase): + def test_isleap(self): + # Make sure that the return is right for a few years, and + # ensure that the return values are 1 or 0, not just true or + # false (see SF bug #485794). Specific additional tests may + # be appropriate; this tests a single "cycle". + self.assertEqual(calendar.isleap(2000), 1) + self.assertEqual(calendar.isleap(2001), 0) + self.assertEqual(calendar.isleap(2002), 0) + self.assertEqual(calendar.isleap(2003), 0) + + def test_setfirstweekday(self): + self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber') + self.assertRaises(ValueError, calendar.setfirstweekday, -1) + self.assertRaises(ValueError, calendar.setfirstweekday, 200) + orig = calendar.firstweekday() + calendar.setfirstweekday(calendar.SUNDAY) + self.assertEqual(calendar.firstweekday(), calendar.SUNDAY) + calendar.setfirstweekday(calendar.MONDAY) + self.assertEqual(calendar.firstweekday(), calendar.MONDAY) + calendar.setfirstweekday(orig) + + def test_enumerateweekdays(self): + self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10) + self.assertRaises(IndexError, calendar.day_name.__getitem__, 10) + self.assertEqual(len([d for d in calendar.day_abbr]), 7) + + def test_days(self): + for attr in "day_name", "day_abbr": + value = getattr(calendar, attr) + self.assertEqual(len(value), 7) + self.assertEqual(len(value[:]), 7) + # ensure they're all unique + d = {} + for v in value: + d[v] = 1 + self.assertEqual(len(d), 7) + + def test_months(self): + for attr in "month_name", "month_abbr": + value = getattr(calendar, attr) + self.assertEqual(len(value), 13) + self.assertEqual(len(value[:]), 13) + self.assertEqual(value[0], "") + # ensure they're all unique + d = {} + for v in value: + d[v] = 1 + self.assertEqual(len(d), 13) + +def test_main(): + run_unittest(CalendarTestCase) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_call.py b/lib-python/2.2/test/test_call.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_call.py @@ -0,0 +1,131 @@ +import unittest +from test_support import run_unittest + +# The test cases here cover several paths through the function calling +# code. They depend on the METH_XXX flag that is used to define a C +# function, which can't be verified from Python. If the METH_XXX decl +# for a C function changes, these tests may not cover the right paths. + +class CFunctionCalls(unittest.TestCase): + + def test_varargs0(self): + self.assertRaises(TypeError, {}.has_key) + + def test_varargs1(self): + {}.has_key(0) + + def test_varargs2(self): + self.assertRaises(TypeError, {}.has_key, 0, 1) + + def test_varargs0_ext(self): + try: + {}.has_key(*()) + except TypeError: + pass + + def test_varargs1_ext(self): + {}.has_key(*(0,)) + + def test_varargs2_ext(self): + try: + {}.has_key(*(1, 2)) + except TypeError: + pass + else: + raise RuntimeError + + def test_varargs0_kw(self): + self.assertRaises(TypeError, {}.has_key, x=2) + + def test_varargs1_kw(self): + self.assertRaises(TypeError, {}.has_key, x=2) + + def test_varargs2_kw(self): + self.assertRaises(TypeError, {}.has_key, x=2, y=2) + + def test_oldargs0_0(self): + {}.keys() + + def test_oldargs0_1(self): + self.assertRaises(TypeError, {}.keys, 0) + + def test_oldargs0_2(self): + self.assertRaises(TypeError, {}.keys, 0, 1) + + def test_oldargs0_0_ext(self): + {}.keys(*()) + + def test_oldargs0_1_ext(self): + try: + {}.keys(*(0,)) + except TypeError: + pass + else: + raise RuntimeError + + def test_oldargs0_2_ext(self): + try: + {}.keys(*(1, 2)) + except TypeError: + pass + else: + raise RuntimeError + + def test_oldargs0_0_kw(self): + try: + {}.keys(x=2) + except TypeError: + pass + else: + raise RuntimeError + + def test_oldargs0_1_kw(self): + self.assertRaises(TypeError, {}.keys, x=2) + + def test_oldargs0_2_kw(self): + self.assertRaises(TypeError, {}.keys, x=2, y=2) + + def test_oldargs1_0(self): + self.assertRaises(TypeError, {}.update) + + def test_oldargs1_1(self): + {}.update({}) + + def test_oldargs1_2(self): + self.assertRaises(TypeError, {}.update, {}, 1) + + def test_oldargs1_0_ext(self): + try: + {}.update(*()) + except TypeError: + pass + else: + raise RuntimeError + + def test_oldargs1_1_ext(self): + {}.update(*({},)) + + def test_oldargs1_2_ext(self): + try: + {}.update(*({}, 2)) + except TypeError: + pass + else: + raise RuntimeError + + def test_oldargs1_0_kw(self): + self.assertRaises(TypeError, {}.update, x=2) + + def test_oldargs1_1_kw(self): + self.assertRaises(TypeError, {}.update, {}, x=2) + + def test_oldargs1_2_kw(self): + self.assertRaises(TypeError, {}.update, x=2, y=2) + + +def test_main(): + run_unittest(CFunctionCalls) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_capi.py b/lib-python/2.2/test/test_capi.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_capi.py @@ -0,0 +1,16 @@ +# Run the _testcapi module tests (tests for the Python/C API): by defn, +# these are all functions _testcapi exports whose name begins with 'test_'. + +import sys +import test_support +import _testcapi + +for name in dir(_testcapi): + if name.startswith('test_'): + test = getattr(_testcapi, name) + if test_support.verbose: + print "internal", name + try: + test() + except _testcapi.error: + raise test_support.TestFailed, sys.exc_info()[1] diff --git a/lib-python/2.2/test/test_cd.py b/lib-python/2.2/test/test_cd.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_cd.py @@ -0,0 +1,26 @@ +#! /usr/bin/env python +"""Whimpy test script for the cd module + Roger E. Masse +""" +import cd +from test_support import verbose + +cdattrs = ['BLOCKSIZE', 'CDROM', 'DATASIZE', 'ERROR', 'NODISC', 'PAUSED', 'PLAYING', 'READY', + 'STILL', '__doc__', '__name__', 'atime', 'audio', 'catalog', 'control', 'createparser', 'error', + 'ident', 'index', 'msftoframe', 'open', 'pnum', 'ptime'] + + +# This is a very inobtrusive test for the existence of the cd module and all it's +# attributes. More comprehensive examples can be found in Demo/cd and +# require that you have a CD and a CD ROM drive + +def main(): + # touch all the attributes of cd without doing anything + if verbose: + print 'Touching cd module attributes...' + for attr in cdattrs: + if verbose: + print 'touching: ', attr + getattr(cd, attr) + +main() diff --git a/lib-python/2.2/test/test_cfgparser.py b/lib-python/2.2/test/test_cfgparser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_cfgparser.py @@ -0,0 +1,284 @@ +import ConfigParser +import StringIO + +from test_support import TestFailed, verify + + +def basic(src): + print "Testing basic accessors..." + cf = ConfigParser.ConfigParser() + sio = StringIO.StringIO(src) + cf.readfp(sio) + L = cf.sections() + L.sort() + verify(L == [r'Commented Bar', + r'Foo Bar', + r'Internationalized Stuff', + r'Long Line', + r'Section\with$weird%characters[' '\t', + r'Spaces', + r'Spacey Bar', + ], + "unexpected list of section names") + + # The use of spaces in the section names serves as a regression test for + # SourceForge bug #115357. + # http://sourceforge.net/bugs/?func=detailbug&group_id=5470&bug_id=115357 + verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar') + verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar') + verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar') + verify(cf.get('Spaces', 'key with spaces', raw=1) == 'value') + verify(cf.get('Spaces', 'another with spaces', raw=1) == 'splat!') + + verify('__name__' not in cf.options("Foo Bar"), + '__name__ "option" should not be exposed by the API!') + + # Make sure the right things happen for remove_option(); + # added to include check for SourceForge bug #123324: + verify(cf.remove_option('Foo Bar', 'foo'), + "remove_option() failed to report existance of option") + verify(not cf.has_option('Foo Bar', 'foo'), + "remove_option() failed to remove option") + verify(not cf.remove_option('Foo Bar', 'foo'), + "remove_option() failed to report non-existance of option" + " that was removed") + try: + cf.remove_option('No Such Section', 'foo') + except ConfigParser.NoSectionError: + pass + else: + raise TestFailed( + "remove_option() failed to report non-existance of option" + " that never existed") + + verify(cf.get('Long Line', 'foo', raw=1) == + 'this line is much, much longer than my editor\nlikes it.') + + +def write(src): + print "Testing writing of files..." + cf = ConfigParser.ConfigParser() + sio = StringIO.StringIO(src) + cf.readfp(sio) + output = StringIO.StringIO() + cf.write(output) + verify(output, """[DEFAULT] +foo = another very + long line + +[Long Line] +foo = this line is much, much longer than my editor + likes it. +""") + +def case_sensitivity(): + print "Testing case sensitivity..." + cf = ConfigParser.ConfigParser() + cf.add_section("A") + cf.add_section("a") + L = cf.sections() + L.sort() + verify(L == ["A", "a"]) + cf.set("a", "B", "value") + verify(cf.options("a") == ["b"]) + verify(cf.get("a", "b", raw=1) == "value", + "could not locate option, expecting case-insensitive option names") + verify(cf.has_option("a", "b")) + cf.set("A", "A-B", "A-B value") + for opt in ("a-b", "A-b", "a-B", "A-B"): + verify(cf.has_option("A", opt), + "has_option() returned false for option which should exist") + verify(cf.options("A") == ["a-b"]) + verify(cf.options("a") == ["b"]) + cf.remove_option("a", "B") + verify(cf.options("a") == []) + + # SF bug #432369: + cf = ConfigParser.ConfigParser() + sio = StringIO.StringIO("[MySection]\nOption: first line\n\tsecond line\n") + cf.readfp(sio) + verify(cf.options("MySection") == ["option"]) + verify(cf.get("MySection", "Option") == "first line\nsecond line") + + # SF bug #561822: + cf = ConfigParser.ConfigParser(defaults={"key":"value"}) + cf.readfp(StringIO.StringIO("[section]\nnekey=nevalue\n")) + verify(cf.has_option("section", "Key")) + + +def boolean(src): + print "Testing interpretation of boolean Values..." + cf = ConfigParser.ConfigParser() + sio = StringIO.StringIO(src) + cf.readfp(sio) + for x in range(1, 5): + verify(cf.getboolean('BOOLTEST', 't%d' % (x)) == 1) + for x in range(1, 5): + verify(cf.getboolean('BOOLTEST', 'f%d' % (x)) == 0) + for x in range(1, 5): + try: + cf.getboolean('BOOLTEST', 'e%d' % (x)) + except ValueError: + pass + else: + raise TestFailed( + "getboolean() failed to report a non boolean value") + + +def interpolation(src): + print "Testing value interpolation..." + cf = ConfigParser.ConfigParser({"getname": "%(__name__)s"}) + sio = StringIO.StringIO(src) + cf.readfp(sio) + verify(cf.get("Foo", "getname") == "Foo") + verify(cf.get("Foo", "bar") == "something with interpolation (1 step)") + verify(cf.get("Foo", "bar9") + == "something with lots of interpolation (9 steps)") + verify(cf.get("Foo", "bar10") + == "something with lots of interpolation (10 steps)") + expect_get_error(cf, ConfigParser.InterpolationDepthError, "Foo", "bar11") + + +def parse_errors(): + print "Testing parse errors..." + expect_parse_error(ConfigParser.ParsingError, + """[Foo]\n extra-spaces: splat\n""") + expect_parse_error(ConfigParser.ParsingError, + """[Foo]\n extra-spaces= splat\n""") + expect_parse_error(ConfigParser.ParsingError, + """[Foo]\noption-without-value\n""") + expect_parse_error(ConfigParser.ParsingError, + """[Foo]\n:value-without-option-name\n""") + expect_parse_error(ConfigParser.ParsingError, + """[Foo]\n=value-without-option-name\n""") + expect_parse_error(ConfigParser.MissingSectionHeaderError, + """No Section!\n""") + + +def query_errors(): + print "Testing query interface..." + cf = ConfigParser.ConfigParser() + verify(cf.sections() == [], + "new ConfigParser should have no defined sections") + verify(not cf.has_section("Foo"), + "new ConfigParser should have no acknowledged sections") + try: + cf.options("Foo") + except ConfigParser.NoSectionError, e: + pass + else: + raise TestFailed( + "Failed to catch expected NoSectionError from options()") + try: + cf.set("foo", "bar", "value") + except ConfigParser.NoSectionError, e: + pass + else: + raise TestFailed("Failed to catch expected NoSectionError from set()") + expect_get_error(cf, ConfigParser.NoSectionError, "foo", "bar") + cf.add_section("foo") + expect_get_error(cf, ConfigParser.NoOptionError, "foo", "bar") + + +def weird_errors(): + print "Testing miscellaneous error conditions..." + cf = ConfigParser.ConfigParser() + cf.add_section("Foo") + try: + cf.add_section("Foo") + except ConfigParser.DuplicateSectionError, e: + pass + else: + raise TestFailed("Failed to catch expected DuplicateSectionError") + + +def expect_get_error(cf, exctype, section, option, raw=0): + try: + cf.get(section, option, raw=raw) + except exctype, e: + pass + else: + raise TestFailed("Failed to catch expected " + exctype.__name__) + + +def expect_parse_error(exctype, src): + cf = ConfigParser.ConfigParser() + sio = StringIO.StringIO(src) + try: + cf.readfp(sio) + except exctype, e: + pass + else: + raise TestFailed("Failed to catch expected " + exctype.__name__) + + +basic(r""" +[Foo Bar] +foo=bar +[Spacey Bar] +foo = bar +[Commented Bar] +foo: bar ; comment +[Long Line] +foo: this line is much, much longer than my editor + likes it. +[Section\with$weird%characters[""" '\t' r"""] +[Internationalized Stuff] +foo[bg]: Bulgarian +foo=Default +foo[en]=English +foo[de]=Deutsch +[Spaces] +key with spaces : value +another with spaces = splat! +""") +write("""[Long Line] +foo: this line is much, much longer than my editor + likes it. +[DEFAULT] +foo: another very + long line""") +case_sensitivity() +boolean(r""" +[BOOLTEST] +T1=1 +T2=TRUE +T3=True +T4=oN +T5=yes +F1=0 +F2=FALSE +F3=False +F4=oFF +F5=nO +E1=2 +E2=foo +E3=-1 +E4=0.1 +E5=FALSE AND MORE +""") +interpolation(r""" +[Foo] +bar=something %(with1)s interpolation (1 step) +bar9=something %(with9)s lots of interpolation (9 steps) +bar10=something %(with10)s lots of interpolation (10 steps) +bar11=something %(with11)s lots of interpolation (11 steps) +with11=%(with10)s +with10=%(with9)s +with9=%(with8)s +with8=%(with7)s +with7=%(with6)s +with6=%(with5)s +with5=%(with4)s +with4=%(with3)s +with3=%(with2)s +with2=%(with1)s +with1=with + +[Mutual Recursion] +foo=%(bar)s +bar=%(foo)s +""") +parse_errors() +query_errors() +weird_errors() diff --git a/lib-python/2.2/test/test_cgi.py b/lib-python/2.2/test/test_cgi.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_cgi.py @@ -0,0 +1,188 @@ +from test_support import verify, verbose +import cgi +import os +import sys + +class HackedSysModule: + # The regression test will have real values in sys.argv, which + # will completely confuse the test of the cgi module + argv = [] + stdin = sys.stdin + +cgi.sys = HackedSysModule() + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +class ComparableException: + def __init__(self, err): + self.err = err + + def __str__(self): + return str(self.err) + + def __cmp__(self, anExc): + if not isinstance(anExc, Exception): + return -1 + x = cmp(self.err.__class__, anExc.__class__) + if x != 0: + return x + return cmp(self.err.args, anExc.args) + + def __getattr__(self, attr): + return getattr(self.err, attr) + +def do_test(buf, method): + env = {} + if method == "GET": + fp = None + env['REQUEST_METHOD'] = 'GET' + env['QUERY_STRING'] = buf + elif method == "POST": + fp = StringIO(buf) + env['REQUEST_METHOD'] = 'POST' + env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded' + env['CONTENT_LENGTH'] = str(len(buf)) + else: + raise ValueError, "unknown method: %s" % method + try: + return cgi.parse(fp, env, strict_parsing=1) + except StandardError, err: + return ComparableException(err) + +# A list of test cases. Each test case is a a two-tuple that contains +# a string with the query and a dictionary with the expected result. + +parse_test_cases = [ + ("", ValueError("bad query field: ''")), + ("&", ValueError("bad query field: ''")), + ("&&", ValueError("bad query field: ''")), + (";", ValueError("bad query field: ''")), + (";&;", ValueError("bad query field: ''")), + # Should the next few really be valid? + ("=", {}), + ("=&=", {}), + ("=;=", {}), + # This rest seem to make sense + ("=a", {'': ['a']}), + ("&=a", ValueError("bad query field: ''")), + ("=a&", ValueError("bad query field: ''")), + ("=&a", ValueError("bad query field: 'a'")), + ("b=a", {'b': ['a']}), + ("b+=a", {'b ': ['a']}), + ("a=b=a", {'a': ['b=a']}), + ("a=+b=a", {'a': [' b=a']}), + ("&b=a", ValueError("bad query field: ''")), + ("b&=a", ValueError("bad query field: 'b'")), + ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), + ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", + {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], + 'cuyer': ['r'], + 'expire': ['964546263'], + 'kid': ['130003.300038'], + 'lobale': ['en-US'], + 'order_id': ['0bb2e248638833d48cb7fed300000f1b'], + 'ss': ['env'], + 'view': ['bustomer'], + }), + + ("group_id=5470&set=custom&_assigned_to=31392&_status=1&_category=100&SUBMIT=Browse", + {'SUBMIT': ['Browse'], + '_assigned_to': ['31392'], + '_category': ['100'], + '_status': ['1'], + 'group_id': ['5470'], + 'set': ['custom'], + }) + ] + +def norm(list): + if type(list) == type([]): + list.sort() + return list + +def first_elts(list): + return map(lambda x:x[0], list) + +def first_second_elts(list): + return map(lambda p:(p[0], p[1][0]), list) + +def main(): + for orig, expect in parse_test_cases: + # Test basic parsing + print repr(orig) + d = do_test(orig, "GET") + verify(d == expect, "Error parsing %s" % repr(orig)) + d = do_test(orig, "POST") + verify(d == expect, "Error parsing %s" % repr(orig)) + + env = {'QUERY_STRING': orig} + fcd = cgi.FormContentDict(env) + sd = cgi.SvFormContentDict(env) + fs = cgi.FieldStorage(environ=env) + if type(expect) == type({}): + # test dict interface + verify(len(expect) == len(fcd)) + verify(norm(expect.keys()) == norm(fcd.keys())) + verify(norm(expect.values()) == norm(fcd.values())) + verify(norm(expect.items()) == norm(fcd.items())) + verify(fcd.get("nonexistent field", "default") == "default") + verify(len(sd) == len(fs)) + verify(norm(sd.keys()) == norm(fs.keys())) + verify(fs.getvalue("nonexistent field", "default") == "default") + # test individual fields + for key in expect.keys(): + expect_val = expect[key] + verify(fcd.has_key(key)) + verify(norm(fcd[key]) == norm(expect[key])) + verify(fcd.get(key, "default") == fcd[key]) + verify(fs.has_key(key)) + if len(expect_val) > 1: + single_value = 0 + else: + single_value = 1 + try: + val = sd[key] + except IndexError: + verify(not single_value) + verify(fs.getvalue(key) == expect_val) + else: + verify(single_value) + verify(val == expect_val[0]) + verify(fs.getvalue(key) == expect_val[0]) + verify(norm(sd.getlist(key)) == norm(expect_val)) + if single_value: + verify(norm(sd.values()) == \ + first_elts(norm(expect.values()))) + verify(norm(sd.items()) == \ + first_second_elts(norm(expect.items()))) + + # Test the weird FormContentDict classes + env = {'QUERY_STRING': "x=1&y=2.0&z=2-3.%2b0&1=1abc"} + expect = {'x': 1, 'y': 2.0, 'z': '2-3.+0', '1': '1abc'} + d = cgi.InterpFormContentDict(env) + for k, v in expect.items(): + verify(d[k] == v) + for k, v in d.items(): + verify(expect[k] == v) + verify(norm(expect.values()) == norm(d.values())) + + print "Testing log" + cgi.initlog() + cgi.log("Testing") + cgi.logfp = sys.stdout + cgi.initlog("%s", "Testing initlog 1") + cgi.log("%s", "Testing log 2") + if os.path.exists("/dev/null"): + cgi.logfp = None + cgi.logfile = "/dev/null" + cgi.initlog("%s", "Testing log 3") + cgi.log("Testing log 4") + +main() diff --git a/lib-python/2.2/test/test_charmapcodec.py b/lib-python/2.2/test/test_charmapcodec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_charmapcodec.py @@ -0,0 +1,43 @@ +""" Python character mapping codec test + +This uses the test codec in testcodec.py and thus also tests the +encodings package lookup scheme. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright 2000 Guido van Rossum. + +"""#" + +def check(a, b): + if a != b: + print '*** check failed: %s != %s' % (repr(a), repr(b)) + else: + print '%s == %s: OK' % (a, b) + +# test codec's full path name (see test/testcodec.py) +codecname = 'test.testcodec' + +check(unicode('abc', codecname), u'abc') +check(unicode('xdef', codecname), u'abcdef') +check(unicode('defx', codecname), u'defabc') +check(unicode('dxf', codecname), u'dabcf') +check(unicode('dxfx', codecname), u'dabcfabc') + +check(u'abc'.encode(codecname), 'abc') +check(u'xdef'.encode(codecname), 'abcdef') +check(u'defx'.encode(codecname), 'defabc') +check(u'dxf'.encode(codecname), 'dabcf') +check(u'dxfx'.encode(codecname), 'dabcfabc') + +check(unicode('ydef', codecname), u'def') +check(unicode('defy', codecname), u'def') +check(unicode('dyf', codecname), u'df') +check(unicode('dyfy', codecname), u'df') + +try: + unicode('abc\001', codecname) +except UnicodeError: + print '\\001 maps to undefined: OK' +else: + print '*** check failed: \\001 does not map to undefined' diff --git a/lib-python/2.2/test/test_cl.py b/lib-python/2.2/test/test_cl.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_cl.py @@ -0,0 +1,78 @@ +#! /usr/bin/env python +"""Whimpy test script for the cl module + Roger E. Masse +""" +import cl +from test_support import verbose + +clattrs = ['ADDED_ALGORITHM_ERROR', 'ALAW', 'ALGORITHM_ID', +'ALGORITHM_VERSION', 'AUDIO', 'AWARE_ERROR', 'AWARE_MPEG_AUDIO', +'AWARE_MULTIRATE', 'AWCMP_CONST_QUAL', 'AWCMP_FIXED_RATE', +'AWCMP_INDEPENDENT', 'AWCMP_JOINT_STEREO', 'AWCMP_LOSSLESS', +'AWCMP_MPEG_LAYER_I', 'AWCMP_MPEG_LAYER_II', 'AWCMP_STEREO', +'Algorithm', 'AlgorithmNumber', 'AlgorithmType', 'AudioFormatName', +'BAD_ALGORITHM_NAME', 'BAD_ALGORITHM_TYPE', 'BAD_BLOCK_SIZE', +'BAD_BOARD', 'BAD_BUFFERING', 'BAD_BUFFERLENGTH_NEG', +'BAD_BUFFERLENGTH_ODD', 'BAD_BUFFER_EXISTS', 'BAD_BUFFER_HANDLE', +'BAD_BUFFER_POINTER', 'BAD_BUFFER_QUERY_SIZE', 'BAD_BUFFER_SIZE', +'BAD_BUFFER_SIZE_POINTER', 'BAD_BUFFER_TYPE', +'BAD_COMPRESSION_SCHEME', 'BAD_COMPRESSOR_HANDLE', +'BAD_COMPRESSOR_HANDLE_POINTER', 'BAD_FRAME_SIZE', +'BAD_FUNCTIONALITY', 'BAD_FUNCTION_POINTER', 'BAD_HEADER_SIZE', +'BAD_INITIAL_VALUE', 'BAD_INTERNAL_FORMAT', 'BAD_LICENSE', +'BAD_MIN_GT_MAX', 'BAD_NO_BUFFERSPACE', 'BAD_NUMBER_OF_BLOCKS', +'BAD_PARAM', 'BAD_PARAM_ID_POINTER', 'BAD_PARAM_TYPE', 'BAD_POINTER', +'BAD_PVBUFFER', 'BAD_SCHEME_POINTER', 'BAD_STREAM_HEADER', +'BAD_STRING_POINTER', 'BAD_TEXT_STRING_PTR', 'BEST_FIT', +'BIDIRECTIONAL', 'BITRATE_POLICY', 'BITRATE_TARGET', +'BITS_PER_COMPONENT', 'BLENDING', 'BLOCK_SIZE', 'BOTTOM_UP', +'BUFFER_NOT_CREATED', 'BUF_DATA', 'BUF_FRAME', 'BytesPerPixel', +'BytesPerSample', 'CHANNEL_POLICY', 'CHROMA_THRESHOLD', 'CODEC', +'COMPONENTS', 'COMPRESSED_BUFFER_SIZE', 'COMPRESSION_RATIO', +'COMPRESSOR', 'CONTINUOUS_BLOCK', 'CONTINUOUS_NONBLOCK', +'CompressImage', 'DATA', 'DECOMPRESSOR', 'DecompressImage', +'EDGE_THRESHOLD', 'ENABLE_IMAGEINFO', 'END_OF_SEQUENCE', 'ENUM_VALUE', +'EXACT_COMPRESSION_RATIO', 'EXTERNAL_DEVICE', 'FLOATING_ENUM_VALUE', +'FLOATING_RANGE_VALUE', 'FRAME', 'FRAME_BUFFER_SIZE', +'FRAME_BUFFER_SIZE_ZERO', 'FRAME_RATE', 'FRAME_TYPE', 'G711_ALAW', +'G711_ULAW', 'GRAYSCALE', 'GetAlgorithmName', 'HDCC', +'HDCC_SAMPLES_PER_TILE', 'HDCC_TILE_THRESHOLD', 'HEADER_START_CODE', +'IMAGE_HEIGHT', 'IMAGE_WIDTH', 'INTERNAL_FORMAT', +'INTERNAL_IMAGE_HEIGHT', 'INTERNAL_IMAGE_WIDTH', 'INTRA', 'JPEG', +'JPEG_ERROR', 'JPEG_NUM_PARAMS', 'JPEG_QUALITY_FACTOR', +'JPEG_QUANTIZATION_TABLES', 'JPEG_SOFTWARE', 'JPEG_STREAM_HEADERS', +'KEYFRAME', 'LAST_FRAME_INDEX', 'LAYER', 'LUMA_THRESHOLD', +'MAX_NUMBER_OF_AUDIO_ALGORITHMS', 'MAX_NUMBER_OF_ORIGINAL_FORMATS', +'MAX_NUMBER_OF_PARAMS', 'MAX_NUMBER_OF_VIDEO_ALGORITHMS', 'MONO', +'MPEG_VIDEO', 'MVC1', 'MVC2', 'MVC2_BLENDING', 'MVC2_BLENDING_OFF', +'MVC2_BLENDING_ON', 'MVC2_CHROMA_THRESHOLD', 'MVC2_EDGE_THRESHOLD', +'MVC2_ERROR', 'MVC2_LUMA_THRESHOLD', 'NEXT_NOT_AVAILABLE', +'NOISE_MARGIN', 'NONE', 'NUMBER_OF_FRAMES', 'NUMBER_OF_PARAMS', +'ORIENTATION', 'ORIGINAL_FORMAT', 'OpenCompressor', +'OpenDecompressor', 'PARAM_OUT_OF_RANGE', 'PREDICTED', 'PREROLL', +'ParamID', 'ParamNumber', 'ParamType', 'QUALITY_FACTOR', +'QUALITY_LEVEL', 'QueryAlgorithms', 'QueryMaxHeaderSize', +'QueryScheme', 'QuerySchemeFromName', 'RANGE_VALUE', 'RGB', 'RGB332', +'RGB8', 'RGBA', 'RGBX', 'RLE', 'RLE24', 'RTR', 'RTR1', +'RTR_QUALITY_LEVEL', 'SAMPLES_PER_TILE', 'SCHEME_BUSY', +'SCHEME_NOT_AVAILABLE', 'SPEED', 'STEREO_INTERLEAVED', +'STREAM_HEADERS', 'SetDefault', 'SetMax', 'SetMin', 'TILE_THRESHOLD', +'TOP_DOWN', 'ULAW', 'UNCOMPRESSED', 'UNCOMPRESSED_AUDIO', +'UNCOMPRESSED_VIDEO', 'UNKNOWN_SCHEME', 'VIDEO', 'VideoFormatName', +'Y', 'YCbCr', 'YCbCr422', 'YCbCr422DC', 'YCbCr422HC', 'YUV', 'YUV422', +'YUV422DC', 'YUV422HC', '__doc__', '__name__', 'cvt_type', 'error'] + + +# This is a very inobtrusive test for the existence of the cl +# module and all it's attributes. + +def main(): + # touch all the attributes of al without doing anything + if verbose: + print 'Touching cl module attributes...' + for attr in clattrs: + if verbose: + print 'touching: ', attr + getattr(cl, attr) + +main() diff --git a/lib-python/2.2/test/test_class.py b/lib-python/2.2/test/test_class.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_class.py @@ -0,0 +1,317 @@ +"Test the functionality of Python classes implementing operators." + +from test_support import TestFailed + +testmeths = [ + +# Binary operations + "add", + "radd", + "sub", + "rsub", + "mul", + "rmul", + "div", + "rdiv", + "mod", + "rmod", + "divmod", + "rdivmod", + "pow", + "rpow", + "rshift", + "rrshift", + "lshift", + "rlshift", + "and", + "rand", + "or", + "ror", + "xor", + "rxor", + +# List/dict operations + "contains", + "getitem", + "getslice", + "setitem", + "setslice", + "delitem", + "delslice", + +# Unary operations + "neg", + "pos", + "abs", + "int", + "long", + "float", + "oct", + "hex", + +# generic operations + "init", + ] + +# These need to return something other than None +# "coerce", +# "hash", +# "str", +# "repr", + +# These are separate because they can influence the test of other methods. +# "getattr", +# "setattr", +# "delattr", + +class AllTests: + def __coerce__(self, *args): + print "__coerce__:", args + return (self,) + args + + def __hash__(self, *args): + print "__hash__:", args + return hash(id(self)) + + def __str__(self, *args): + print "__str__:", args + return "AllTests" + + def __repr__(self, *args): + print "__repr__:", args + return "AllTests" + + def __cmp__(self, *args): + print "__cmp__:", args + return 0 + + def __del__(self, *args): + print "__del__:", args + +# Synthesize AllTests methods from the names in testmeths. + +method_template = """\ +def __%(method)s__(self, *args): + print "__%(method)s__:", args +""" + +for method in testmeths: + exec method_template % locals() in AllTests.__dict__ + +del method, method_template + +# this also tests __init__ of course. +testme = AllTests() + +# Binary operations + +testme + 1 +1 + testme + +testme - 1 +1 - testme + +testme * 1 +1 * testme + +if 1/2 == 0: + testme / 1 + 1 / testme +else: + # True division is in effect, so "/" doesn't map to __div__ etc; but + # the canned expected-output file requires that __div__ etc get called. + testme.__coerce__(1) + testme.__div__(1) + testme.__coerce__(1) + testme.__rdiv__(1) + +testme % 1 +1 % testme + +divmod(testme,1) +divmod(1, testme) + +testme ** 1 +1 ** testme + +testme >> 1 +1 >> testme + +testme << 1 +1 << testme + +testme & 1 +1 & testme + +testme | 1 +1 | testme + +testme ^ 1 +1 ^ testme + + +# List/dict operations + +1 in testme + +testme[1] +testme[1] = 1 +del testme[1] + +testme[:42] +testme[:42] = "The Answer" +del testme[:42] + +testme[2:1024:10] +testme[2:1024:10] = "A lot" +del testme[2:1024:10] + +testme[:42, ..., :24:, 24, 100] +testme[:42, ..., :24:, 24, 100] = "Strange" +del testme[:42, ..., :24:, 24, 100] + + +# Now remove the slice hooks to see if converting normal slices to slice +# object works. + +del AllTests.__getslice__ +del AllTests.__setslice__ +del AllTests.__delslice__ + +import sys +if sys.platform[:4] != 'java': + testme[:42] + testme[:42] = "The Answer" + del testme[:42] +else: + # This works under Jython, but the actual slice values are + # different. + print "__getitem__: (slice(0, 42, None),)" + print "__setitem__: (slice(0, 42, None), 'The Answer')" + print "__delitem__: (slice(0, 42, None),)" + +# Unary operations + +-testme ++testme +abs(testme) +if sys.platform[:4] != 'java': + int(testme) + long(testme) + float(testme) + oct(testme) + hex(testme) +else: + # Jython enforced that the these methods return + # a value of the expected type. + print "__int__: ()" + print "__long__: ()" + print "__float__: ()" + print "__oct__: ()" + print "__hex__: ()" + + +# And the rest... + +hash(testme) +repr(testme) +str(testme) + +testme == 1 +testme < 1 +testme > 1 +testme <> 1 +testme != 1 +1 == testme +1 < testme +1 > testme +1 <> testme +1 != testme + +# This test has to be last (duh.) + +del testme +if sys.platform[:4] == 'java': + import java + java.lang.System.gc() + +# Interfering tests + +class ExtraTests: + def __getattr__(self, *args): + print "__getattr__:", args + return "SomeVal" + + def __setattr__(self, *args): + print "__setattr__:", args + + def __delattr__(self, *args): + print "__delattr__:", args + +testme = ExtraTests() +testme.spam +testme.eggs = "spam, spam, spam and ham" +del testme.cardinal + + +# Test correct errors from hash() on objects with comparisons but no __hash__ + +class C0: + pass + +hash(C0()) # This should work; the next two should raise TypeError + +class C1: + def __cmp__(self, other): return 0 + +try: hash(C1()) +except TypeError: pass +else: raise TestFailed, "hash(C1()) should raise an exception" + +class C2: + def __eq__(self, other): return 1 + +try: hash(C2()) +except TypeError: pass +else: raise TestFailed, "hash(C2()) should raise an exception" + + +# Test for SF bug 532646 + +class A: + pass +A.__call__ = A() +a = A() +try: + a() # This should not segfault +except RuntimeError: + pass +else: + raise TestFailed, "how could this not have overflowed the stack?" + + +# Tests for exceptions raised in instance_getattr2(). + +def booh(self): + raise AttributeError, "booh" + +class A: + a = property(booh) +try: + A().a # Raised AttributeError: A instance has no attribute 'a' +except AttributeError, x: + if str(x) is not "booh": + print "attribute error for A().a got masked:", str(x) + +class E: + __eq__ = property(booh) +E() == E() # In debug mode, caused a C-level assert() to fail + +class I: + __init__ = property(booh) +try: + I() # In debug mode, printed XXX undetected error and raises AttributeError +except AttributeError, x: + pass +else: + print "attribute error for I.__init__ got masked" diff --git a/lib-python/2.2/test/test_cmath.py b/lib-python/2.2/test/test_cmath.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_cmath.py @@ -0,0 +1,35 @@ +#! /usr/bin/env python +""" Simple test script for cmathmodule.c + Roger E. Masse +""" +import cmath +from test_support import verbose + +testdict = {'acos' : 1.0, + 'acosh' : 1.0, + 'asin' : 1.0, + 'asinh' : 1.0, + 'atan' : 0.2, + 'atanh' : 0.2, + 'cos' : 1.0, + 'cosh' : 1.0, + 'exp' : 1.0, + 'log' : 1.0, + 'log10' : 1.0, + 'sin' : 1.0, + 'sinh' : 1.0, + 'sqrt' : 1.0, + 'tan' : 1.0, + 'tanh' : 1.0} + +for func in testdict.keys(): + f = getattr(cmath, func) + r = f(testdict[func]) + if verbose: + print 'Calling %s(%f) = %f' % (func, testdict[func], abs(r)) + +p = cmath.pi +e = cmath.e +if verbose: + print 'PI = ', abs(p) + print 'E = ', abs(e) diff --git a/lib-python/2.2/test/test_codecs.py b/lib-python/2.2/test/test_codecs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_codecs.py @@ -0,0 +1,31 @@ +import test_support,unittest +import codecs +import StringIO + +class UTF16Test(unittest.TestCase): + + spamle = '\xff\xfes\x00p\x00a\x00m\x00s\x00p\x00a\x00m\x00' + spambe = '\xfe\xff\x00s\x00p\x00a\x00m\x00s\x00p\x00a\x00m' + + def test_only_one_bom(self): + _,_,reader,writer = codecs.lookup("utf-16") + # encode some stream + s = StringIO.StringIO() + f = writer(s) + f.write(u"spam") + f.write(u"spam") + d = s.getvalue() + # check whether there is exactly one BOM in it + self.assert_(d == self.spamle or d == self.spambe) + # try to read it back + s = StringIO.StringIO(d) + f = reader(s) + self.assertEquals(f.read(), u"spamspam") + + +def test_main(): + test_support.run_unittest(UTF16Test) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_codeop.py b/lib-python/2.2/test/test_codeop.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_codeop.py @@ -0,0 +1,190 @@ +""" + Test cases for codeop.py + Nick Mathewson +""" +import unittest +from test_support import run_unittest, is_jython + +from codeop import compile_command + +if is_jython: + import sys + import cStringIO + + def unify_callables(d): + for n,v in d.items(): + if callable(v): + d[n] = callable + return d + +class CodeopTests(unittest.TestCase): + + def assertValid(self, str, symbol='single'): + '''succeed iff str is a valid piece of code''' + if is_jython: + code = compile_command(str, "", symbol) + self.assert_(code) + if symbol == "single": + d,r = {},{} + saved_stdout = sys.stdout + sys.stdout = cStringIO.StringIO() + try: + exec code in d + exec compile(str,"","single") in r + finally: + sys.stdout = saved_stdout + elif symbol == 'eval': + ctx = {'a': 2} + d = { 'value': eval(code,ctx) } + r = { 'value': eval(str,ctx) } + self.assertEquals(unify_callables(r),unify_callables(d)) + else: + expected = compile(str, "", symbol) + self.assertEquals( compile_command(str, "", symbol), expected) + + def assertIncomplete(self, str, symbol='single'): + '''succeed iff str is the start of a valid piece of code''' + self.assertEquals( compile_command(str, symbol=symbol), None) + + def assertInvalid(self, str, symbol='single', is_syntax=1): + '''succeed iff str is the start of an invalid piece of code''' + try: + compile_command(str,symbol=symbol) + self.fail("No exception thrown for invalid code") + except SyntaxError: + self.assert_(is_syntax) + except OverflowError: + self.assert_(not is_syntax) + + def test_valid(self): + av = self.assertValid + + # special case + if not is_jython: + self.assertEquals(compile_command(""), + compile("pass", "", 'single')) + self.assertEquals(compile_command("\n"), + compile("pass", "", 'single')) + else: + av("") + av("\n") + + av("a = 1") + av("\na = 1") + av("a = 1\n") + av("a = 1\n\n") + av("\n\na = 1\n\n") + + av("def x():\n pass\n") + av("if 1:\n pass\n") + + av("\n\nif 1: pass\n") + av("\n\nif 1: pass\n\n") + + av("def x():\n\n pass\n") + av("def x():\n pass\n \n") + av("def x():\n pass\n \n") + + av("pass\n") + av("3**3\n") + + av("if 9==3:\n pass\nelse:\n pass\n") + av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") + + av("#a\n#b\na = 3\n") + av("#a\n\n \na=3\n") + av("a=3\n\n") + av("a = 9+ \\\n3") + + av("3**3","eval") + av("(lambda z: \n z**3)","eval") + + av("9+ \\\n3","eval") + av("9+ \\\n3\n","eval") + + av("\n\na**3","eval") + av("\n \na**3","eval") + av("#a\n#b\na**3","eval") + + def test_incomplete(self): + ai = self.assertIncomplete + + ai("(a **") + ai("(a,b,") + ai("(a,b,(") + ai("(a,b,(") + ai("a = (") + ai("a = {") + ai("b + {") + + ai("if 9==3:\n pass\nelse:") + ai("if 9==3:\n pass\nelse:\n") + ai("if 9==3:\n pass\nelse:\n pass") + ai("if 1:") + ai("if 1:\n") + ai("if 1:\n pass\n if 1:\n pass\n else:") + ai("if 1:\n pass\n if 1:\n pass\n else:\n") + ai("if 1:\n pass\n if 1:\n pass\n else:\n pass") + + ai("def x():") + ai("def x():\n") + ai("def x():\n\n") + + ai("def x():\n pass") + ai("def x():\n pass\n ") + ai("def x():\n pass\n ") + ai("\n\ndef x():\n pass") + + ai("a = 9+ \\") + ai("a = 'a\\") + ai("a = '''xy") + + ai("","eval") + ai("\n","eval") + ai("(","eval") + ai("(\n\n\n","eval") + ai("(9+","eval") + ai("9+ \\","eval") + ai("lambda z: \\","eval") + + def test_invalid(self): + ai = self.assertInvalid + ai("a b") + + ai("a @") + ai("a b @") + ai("a ** @") + + ai("a = ") + ai("a = 9 +") + + ai("def x():\n\npass\n") + + ai("\n\n if 1: pass\n\npass") + + ai("a = 9+ \\\n") + ai("a = 'a\\ ") + ai("a = 'a\\\n") + + ai("a = 1","eval") + ai("a = (","eval") + ai("]","eval") + ai("())","eval") + ai("[}","eval") + ai("9+","eval") + ai("lambda z:","eval") + ai("a b","eval") + + def test_filename(self): + self.assertEquals(compile_command("a = 1\n", "abc").co_filename, + compile("a = 1\n", "abc", 'single').co_filename) + self.assertNotEquals(compile_command("a = 1\n", "abc").co_filename, + compile("a = 1\n", "def", 'single').co_filename) + + +def test_main(): + run_unittest(CodeopTests) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_coercion.py b/lib-python/2.2/test/test_coercion.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_coercion.py @@ -0,0 +1,118 @@ +import copy +import sys +import warnings + +# Fake a number that implements numeric methods through __coerce__ +class CoerceNumber: + def __init__(self, arg): + self.arg = arg + + def __repr__(self): + return '' % repr(self.arg) + + def __coerce__(self, other): + if isinstance(other, CoerceNumber): + return self.arg, other.arg + else: + return (self.arg, other) + + +# Fake a number that implements numeric ops through methods. +class MethodNumber: + + def __init__(self,arg): + self.arg = arg + + def __repr__(self): + return '' % repr(self.arg) + + def __add__(self,other): + return self.arg + other + + def __radd__(self,other): + return other + self.arg + + def __sub__(self,other): + return self.arg - other + + def __rsub__(self,other): + return other - self.arg + + def __mul__(self,other): + return self.arg * other + + def __rmul__(self,other): + return other * self.arg + + def __div__(self,other): + return self.arg / other + + def __rdiv__(self,other): + return other / self.arg + + def __pow__(self,other): + return self.arg ** other + + def __rpow__(self,other): + return other ** self.arg + + def __mod__(self,other): + return self.arg % other + + def __rmod__(self,other): + return other % self.arg + + def __cmp__(self, other): + return cmp(self.arg, other) + + +candidates = [ 2, 4.0, 2L, 2+0j, [1], (2,), None, + MethodNumber(1), CoerceNumber(2)] + +infix_binops = [ '+', '-', '*', '/', '**', '%' ] +prefix_binops = [ 'divmod' ] + +def do_infix_binops(): + for a in candidates: + for b in candidates: + for op in infix_binops: + print '%s %s %s' % (a, op, b), + try: + x = eval('a %s b' % op) + except: + error = sys.exc_info()[:2] + print '... %s' % error[0] + else: + print '=', x + try: + z = copy.copy(a) + except copy.Error: + z = a # assume it has no inplace ops + print '%s %s= %s' % (a, op, b), + try: + exec('z %s= b' % op) + except: + error = sys.exc_info()[:2] + print '... %s' % error[0] + else: + print '=>', z + +def do_prefix_binops(): + for a in candidates: + for b in candidates: + for op in prefix_binops: + print '%s(%s, %s)' % (op, a, b), + try: + x = eval('%s(a, b)' % op) + except: + error = sys.exc_info()[:2] + print '... %s' % error[0] + else: + print '=', x + +warnings.filterwarnings("ignore", + r'complex divmod\(\), // and % are deprecated', + DeprecationWarning, + r'test_coercion$') +do_infix_binops() +do_prefix_binops() diff --git a/lib-python/2.2/test/test_commands.py b/lib-python/2.2/test/test_commands.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_commands.py @@ -0,0 +1,52 @@ +''' + Tests for commands module + Nick Mathewson +''' +import unittest +import os, tempfile, re + +from test_support import TestSkipped, run_unittest +from commands import * + +# The module says: +# "NB This only works (and is only relevant) for UNIX." +# +# Actually, getoutput should work on any platform with an os.popen, but +# I'll take the comment as given, and skip this suite. + +if os.name != 'posix': + raise TestSkipped('Not posix; skipping test_commands') + + +class CommandTests(unittest.TestCase): + + def test_getoutput(self): + self.assertEquals(getoutput('echo xyzzy'), 'xyzzy') + self.assertEquals(getstatusoutput('echo xyzzy'), (0, 'xyzzy')) + + # we use mktemp in the next line to get a filename which we + # _know_ won't exist. This is guaranteed to fail. + status, output = getstatusoutput('cat ' + tempfile.mktemp()) + self.assertNotEquals(status, 0) + + def test_getstatus(self): + # This pattern should match 'ls -ld /.' on any posix + # system, however perversely configured. + pat = r'''d......... # It is a directory. + \s+\d+ # It has some number of links. + \s+\w+\s+\w+ # It has a user and group, which may + # be named anything. + \s+\d+ # It has a size. + [^/]* # Skip the date. + /. # and end with the name of the file. + ''' + + self.assert_(re.match(pat, getstatus("/."), re.VERBOSE)) + + +def test_main(): + run_unittest(CommandTests) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_compare.py b/lib-python/2.2/test/test_compare.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_compare.py @@ -0,0 +1,56 @@ +import sys + +from test_support import * + +class Empty: + def __repr__(self): + return '' + +class Coerce: + def __init__(self, arg): + self.arg = arg + + def __repr__(self): + return '' % self.arg + + def __coerce__(self, other): + if isinstance(other, Coerce): + return self.arg, other.arg + else: + return self.arg, other + +class Cmp: + def __init__(self,arg): + self.arg = arg + + def __repr__(self): + return '' % self.arg + + def __cmp__(self, other): + return cmp(self.arg, other) + + +candidates = [2, 2.0, 2L, 2+0j, [1], (3,), None, Empty(), Coerce(2), Cmp(2.0)] + +def test(): + for a in candidates: + for b in candidates: + try: + x = a == b + except: + print 'cmp(%s, %s) => %s' % (a, b, sys.exc_info()[0]) + else: + if x: + print "%s == %s" % (a, b) + else: + print "%s != %s" % (a, b) + # Ensure default comparison compares id() of args + L = [] + for i in range(10): + L.insert(len(L)//2, Empty()) + for a in L: + for b in L: + if cmp(a, b) != cmp(id(a), id(b)): + print "ERROR:", cmp(a, b), cmp(id(a), id(b)), id(a), id(b) + +test() diff --git a/lib-python/2.2/test/test_compile.py b/lib-python/2.2/test/test_compile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_compile.py @@ -0,0 +1,129 @@ +from test_support import verbose, TestFailed + +if verbose: + print "Testing whether compiler catches assignment to __debug__" + +try: + compile('__debug__ = 1', '?', 'single') +except SyntaxError: + pass + +import __builtin__ +prev = __builtin__.__debug__ +setattr(__builtin__, '__debug__', 'sure') +setattr(__builtin__, '__debug__', prev) + +if verbose: + print 'Running tests on argument handling' + +try: + exec 'def f(a, a): pass' + raise TestFailed, "duplicate arguments" +except SyntaxError: + pass + +try: + exec 'def f(a = 0, a = 1): pass' + raise TestFailed, "duplicate keyword arguments" +except SyntaxError: + pass + +try: + exec 'def f(a): global a; a = 1' + raise TestFailed, "variable is global and local" +except SyntaxError: + pass + +if verbose: + print "testing complex args" + +def comp_args((a, b)): + print a,b + +comp_args((1, 2)) + +def comp_args((a, b)=(3, 4)): + print a, b + +comp_args((1, 2)) +comp_args() + +def comp_args(a, (b, c)): + print a, b, c + +comp_args(1, (2, 3)) + +def comp_args(a=2, (b, c)=(3, 4)): + print a, b, c + +comp_args(1, (2, 3)) +comp_args() + +try: + exec 'def f(a=1, (b, c)): pass' + raise TestFailed, "non-default args after default" +except SyntaxError: + pass + +if verbose: + print "testing bad float literals" + +def expect_error(s): + try: + eval(s) + raise TestFailed("%r accepted" % s) + except SyntaxError: + pass + +expect_error("2e") +expect_error("2.0e+") +expect_error("1e-") +expect_error("3-4e/21") + + +if verbose: + print "testing literals with leading zeroes" + +def expect_same(test_source, expected): + got = eval(test_source) + if got != expected: + raise TestFailed("eval(%r) gave %r, but expected %r" % + (test_source, got, expected)) + +expect_error("077787") +expect_error("0xj") +expect_error("0x.") +expect_error("0e") +expect_same("0777", 511) +expect_same("0777L", 511) +expect_same("000777", 511) +expect_same("0xff", 255) +expect_same("0xffL", 255) +expect_same("0XfF", 255) +expect_same("0777.", 777) +expect_same("0777.0", 777) +expect_same("000000000000000000000000000000000000000000000000000777e0", 777) +expect_same("0777e1", 7770) +expect_same("0e0", 0) +expect_same("0000E-012", 0) +expect_same("09.5", 9.5) +expect_same("0777j", 777j) +expect_same("00j", 0j) +expect_same("00.0", 0) +expect_same("0e3", 0) +expect_same("090000000000000.", 90000000000000.) +expect_same("090000000000000.0000000000000000000000", 90000000000000.) +expect_same("090000000000000e0", 90000000000000.) +expect_same("090000000000000e-0", 90000000000000.) +expect_same("090000000000000j", 90000000000000j) +expect_error("090000000000000") # plain octal literal w/ decimal digit +expect_error("080000000000000") # plain octal literal w/ decimal digit +expect_error("000000000000009") # plain octal literal w/ decimal digit +expect_error("000000000000008") # plain octal literal w/ decimal digit +expect_same("000000000000007", 7) +expect_same("000000000000008.", 8.) +expect_same("000000000000009.", 9.) + +# Verify treatment of unary minus on negative numbers SF bug #660455 +expect_same("0xffffffff", -1) +expect_same("-0xffffffff", 1) diff --git a/lib-python/2.2/test/test_complex.py b/lib-python/2.2/test/test_complex.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_complex.py @@ -0,0 +1,68 @@ +from test_support import TestFailed +from random import random + +# These tests ensure that complex math does the right thing; tests of +# the complex() function/constructor are in test_b1.py. + +# XXX need many, many more tests here. + +nerrors = 0 + +def check_close_real(x, y, eps=1e-9): + """Return true iff floats x and y "are close\"""" + # put the one with larger magnitude second + if abs(x) > abs(y): + x, y = y, x + if y == 0: + return abs(x) < eps + if x == 0: + return abs(y) < eps + # check that relative difference < eps + return abs((x-y)/y) < eps + +def check_close(x, y, eps=1e-9): + """Return true iff complexes x and y "are close\"""" + return check_close_real(x.real, y.real, eps) and \ + check_close_real(x.imag, y.imag, eps) + +def test_div(x, y): + """Compute complex z=x*y, and check that z/x==y and z/y==x.""" + global nerrors + z = x * y + if x != 0: + q = z / x + if not check_close(q, y): + nerrors += 1 + print "%r / %r == %r but expected %r" % (z, x, q, y) + if y != 0: + q = z / y + if not check_close(q, x): + nerrors += 1 + print "%r / %r == %r but expected %r" % (z, y, q, x) + +simple_real = [float(i) for i in range(-5, 6)] +simple_complex = [complex(x, y) for x in simple_real for y in simple_real] +for x in simple_complex: + for y in simple_complex: + test_div(x, y) + +# A naive complex division algorithm (such as in 2.0) is very prone to +# nonsense errors for these (overflows and underflows). +test_div(complex(1e200, 1e200), 1+0j) +test_div(complex(1e-200, 1e-200), 1+0j) + +# Just for fun. +for i in range(100): + test_div(complex(random(), random()), + complex(random(), random())) + +try: + z = 1.0 / (0+0j) +except ZeroDivisionError: + pass +else: + nerrors += 1 + raise TestFailed("Division by complex 0 didn't raise ZeroDivisionError") + +if nerrors: + raise TestFailed("%d tests failed" % nerrors) diff --git a/lib-python/2.2/test/test_contains.py b/lib-python/2.2/test/test_contains.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_contains.py @@ -0,0 +1,171 @@ +from test_support import TestFailed, have_unicode + +class base_set: + + def __init__(self, el): + self.el = el + +class set(base_set): + + def __contains__(self, el): + return self.el == el + +class seq(base_set): + + def __getitem__(self, n): + return [self.el][n] + +def check(ok, *args): + if not ok: + raise TestFailed, " ".join(map(str, args)) + +a = base_set(1) +b = set(1) +c = seq(1) + +check(1 in b, "1 not in set(1)") +check(0 not in b, "0 in set(1)") +check(1 in c, "1 not in seq(1)") +check(0 not in c, "0 in seq(1)") + +try: + 1 in a + check(0, "in base_set did not raise error") +except TypeError: + pass + +try: + 1 not in a + check(0, "not in base_set did not raise error") +except TypeError: + pass + +# Test char in string + +check('c' in 'abc', "'c' not in 'abc'") +check('d' not in 'abc', "'d' in 'abc'") + +try: + '' in 'abc' + check(0, "'' in 'abc' did not raise error") +except TypeError: + pass + +try: + 'ab' in 'abc' + check(0, "'ab' in 'abc' did not raise error") +except TypeError: + pass + +try: + None in 'abc' + check(0, "None in 'abc' did not raise error") +except TypeError: + pass + + +if have_unicode: + + # Test char in Unicode + + check('c' in unicode('abc'), "'c' not in u'abc'") + check('d' not in unicode('abc'), "'d' in u'abc'") + + try: + '' in unicode('abc') + check(0, "'' in u'abc' did not raise error") + except TypeError: + pass + + try: + 'ab' in unicode('abc') + check(0, "'ab' in u'abc' did not raise error") + except TypeError: + pass + + try: + None in unicode('abc') + check(0, "None in u'abc' did not raise error") + except TypeError: + pass + + # Test Unicode char in Unicode + + check(unicode('c') in unicode('abc'), "u'c' not in u'abc'") + check(unicode('d') not in unicode('abc'), "u'd' in u'abc'") + + try: + unicode('') in unicode('abc') + check(0, "u'' in u'abc' did not raise error") + except TypeError: + pass + + try: + unicode('ab') in unicode('abc') + check(0, "u'ab' in u'abc' did not raise error") + except TypeError: + pass + + # Test Unicode char in string + + check(unicode('c') in 'abc', "u'c' not in 'abc'") + check(unicode('d') not in 'abc', "u'd' in 'abc'") + + try: + unicode('') in 'abc' + check(0, "u'' in 'abc' did not raise error") + except TypeError: + pass + + try: + unicode('ab') in 'abc' + check(0, "u'ab' in 'abc' did not raise error") + except TypeError: + pass + +# A collection of tests on builtin sequence types +a = range(10) +for i in a: + check(i in a, "%s not in %s" % (`i`, `a`)) +check(16 not in a, "16 not in %s" % `a`) +check(a not in a, "%s not in %s" % (`a`, `a`)) + +a = tuple(a) +for i in a: + check(i in a, "%s not in %s" % (`i`, `a`)) +check(16 not in a, "16 not in %s" % `a`) +check(a not in a, "%s not in %s" % (`a`, `a`)) + +class Deviant1: + """Behaves strangely when compared + + This class is designed to make sure that the contains code + works when the list is modified during the check. + """ + + aList = range(15) + + def __cmp__(self, other): + if other == 12: + self.aList.remove(12) + self.aList.remove(13) + self.aList.remove(14) + return 1 + +check(Deviant1() not in Deviant1.aList, "Deviant1 failed") + +class Deviant2: + """Behaves strangely when compared + + This class raises an exception during comparison. That in + turn causes the comparison to fail with a TypeError. + """ + + def __cmp__(self, other): + if other == 4: + raise RuntimeError, "gotcha" + +try: + check(Deviant2() not in a, "oops") +except TypeError: + pass diff --git a/lib-python/2.2/test/test_cookie.py b/lib-python/2.2/test/test_cookie.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_cookie.py @@ -0,0 +1,47 @@ +# Simple test suite for Cookie.py + +from test_support import verify, verbose, run_doctest +import Cookie + +# Currently this only tests SimpleCookie + +cases = [ + ('chips=ahoy; vienna=finger', {'chips':'ahoy', 'vienna':'finger'}), + ('keebler="E=mc2; L=\\"Loves\\"; fudge=\\012;";', + {'keebler' : 'E=mc2; L="Loves"; fudge=\012;'}), + + # Check illegal cookies that have an '=' char in an unquoted value + ('keebler=E=mc2;', {'keebler' : 'E=mc2'}) + ] + +for data, dict in cases: + C = Cookie.SimpleCookie() ; C.load(data) + print repr(C) + print str(C) + items = dict.items() + items.sort() + for k, v in items: + print ' ', k, repr( C[k].value ), repr(v) + verify(C[k].value == v) + print C[k] + +C = Cookie.SimpleCookie() +C.load('Customer="WILE_E_COYOTE"; Version=1; Path=/acme') + +verify(C['Customer'].value == 'WILE_E_COYOTE') +verify(C['Customer']['version'] == '1') +verify(C['Customer']['path'] == '/acme') + +print C.output(['path']) +print C.js_output() +print C.js_output(['path']) + +# Try cookie with quoted meta-data +C = Cookie.SimpleCookie() +C.load('Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"') +verify(C['Customer'].value == 'WILE_E_COYOTE') +verify(C['Customer']['version'] == '1') +verify(C['Customer']['path'] == '/acme') + +print "If anything blows up after this line, it's from Cookie's doctest." +run_doctest(Cookie) diff --git a/lib-python/2.2/test/test_copy_reg.py b/lib-python/2.2/test/test_copy_reg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_copy_reg.py @@ -0,0 +1,30 @@ +import copy_reg +import test_support +import unittest + + +class C: + pass + + +class CopyRegTestCase(unittest.TestCase): + + def test_class(self): + self.assertRaises(TypeError, copy_reg.pickle, + C, None, None) + + def test_noncallable_reduce(self): + self.assertRaises(TypeError, copy_reg.pickle, + type(1), "not a callable") + + def test_noncallable_constructor(self): + self.assertRaises(TypeError, copy_reg.pickle, + type(1), int, "not a callable") + + +def test_main(): + test_support.run_unittest(CopyRegTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_cpickle.py b/lib-python/2.2/test/test_cpickle.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_cpickle.py @@ -0,0 +1,100 @@ +import cPickle +import test_support +import unittest +from cStringIO import StringIO +from pickletester import AbstractPickleTests, AbstractPickleModuleTests + +class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests): + + def setUp(self): + self.dumps = cPickle.dumps + self.loads = cPickle.loads + + error = cPickle.BadPickleGet + module = cPickle + +class cPicklePicklerTests(AbstractPickleTests): + + def dumps(self, arg, bin=0): + f = StringIO() + p = cPickle.Pickler(f, bin) + p.dump(arg) + f.seek(0) + return f.read() + + def loads(self, buf): + f = StringIO(buf) + p = cPickle.Unpickler(f) + return p.load() + + error = cPickle.BadPickleGet + +class cPickleListPicklerTests(AbstractPickleTests): + + def dumps(self, arg, bin=0): + p = cPickle.Pickler(bin) + p.dump(arg) + return p.getvalue() + + def loads(self, *args): + f = StringIO(args[0]) + p = cPickle.Unpickler(f) + return p.load() + + error = cPickle.BadPickleGet + +class cPickleFastPicklerTests(AbstractPickleTests): + + def dumps(self, arg, bin=0): + f = StringIO() + p = cPickle.Pickler(f, bin) + p.fast = 1 + p.dump(arg) + f.seek(0) + return f.read() + + def loads(self, *args): + f = StringIO(args[0]) + p = cPickle.Unpickler(f) + return p.load() + + error = cPickle.BadPickleGet + + def test_recursive_list(self): + self.assertRaises(ValueError, + AbstractPickleTests.test_recursive_list, + self) + + def test_recursive_inst(self): + self.assertRaises(ValueError, + AbstractPickleTests.test_recursive_inst, + self) + + def test_recursive_dict(self): + self.assertRaises(ValueError, + AbstractPickleTests.test_recursive_dict, + self) + + def test_recursive_multi(self): + self.assertRaises(ValueError, + AbstractPickleTests.test_recursive_multi, + self) + + def test_nonrecursive_deep(self): + a = [] + for i in range(100): + a = [a] + b = self.loads(self.dumps(a)) + self.assertEqual(a, b) + +def test_main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTest(loader.loadTestsFromTestCase(cPickleTests)) + suite.addTest(loader.loadTestsFromTestCase(cPicklePicklerTests)) + suite.addTest(loader.loadTestsFromTestCase(cPickleListPicklerTests)) + suite.addTest(loader.loadTestsFromTestCase(cPickleFastPicklerTests)) + test_support.run_suite(suite) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_crypt.py b/lib-python/2.2/test/test_crypt.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_crypt.py @@ -0,0 +1,11 @@ +#! /usr/bin/env python +"""Simple test script for cryptmodule.c + Roger E. Masse +""" + +from test_support import verify, verbose +import crypt + +c = crypt.crypt('mypassword', 'ab') +if verbose: + print 'Test encryption: ', c diff --git a/lib-python/2.2/test/test_curses.py b/lib-python/2.2/test/test_curses.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_curses.py @@ -0,0 +1,210 @@ +# +# Test script for the curses module +# +# This script doesn't actually display anything very coherent. but it +# does call every method and function. +# +# Functions not tested: {def,reset}_{shell,prog}_mode, getch(), getstr(), +# getmouse(), ungetmouse(), init_color() +# + +import curses, sys, tempfile + +# Optionally test curses module. This currently requires that the +# 'curses' resource be given on the regrtest command line using the -u +# option. If not available, nothing after this line will be executed. + +import test_support +test_support.requires('curses') + +def window_funcs(stdscr): + "Test the methods of windows" + win = curses.newwin(10,10) + win = curses.newwin(5,5, 5,5) + win2 = curses.newwin(15,15, 5,5) + + for meth in [stdscr.addch, stdscr.addstr]: + for args in [('a'), ('a', curses.A_BOLD), + (4,4, 'a'), (5,5, 'a', curses.A_BOLD)]: + apply(meth, args) + + for meth in [stdscr.box, stdscr.clear, stdscr.clrtobot, + stdscr.clrtoeol, stdscr.cursyncup, stdscr.delch, + stdscr.deleteln, stdscr.erase, stdscr.getbegyx, + stdscr.getbkgd, stdscr.getkey, stdscr.getmaxyx, + stdscr.getparyx, stdscr.getyx, stdscr.inch, + stdscr.insertln, stdscr.instr, stdscr.is_wintouched, + win.noutrefresh, stdscr.redrawwin, stdscr.refresh, + stdscr.standout, stdscr.standend, stdscr.syncdown, + stdscr.syncup, stdscr.touchwin, stdscr.untouchwin]: + meth() + + stdscr.addnstr('1234', 3) + stdscr.addnstr('1234', 3, curses.A_BOLD) + stdscr.addnstr(4,4, '1234', 3) + stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD) + + stdscr.attron(curses.A_BOLD) + stdscr.attroff(curses.A_BOLD) + stdscr.attrset(curses.A_BOLD) + stdscr.bkgd(' ') + stdscr.bkgd(' ', curses.A_REVERSE) + stdscr.bkgdset(' ') + stdscr.bkgdset(' ', curses.A_REVERSE) + + win.border(65, 66, 67, 68, + 69, 70, 71, 72) + win.border('|', '!', '-', '_', + '+', '\\', '#', '/') + try: + win.border(65, 66, 67, 68, + 69, [], 71, 72) + except TypeError: + pass + else: + raise RuntimeError, "Expected win.border() to raise TypeError" + + stdscr.clearok(1) + + win4 = stdscr.derwin(2,2) + win4 = stdscr.derwin(1,1, 5,5) + win4.mvderwin(9,9) + + stdscr.echochar('a') + stdscr.echochar('a', curses.A_BOLD) + stdscr.hline('-', 5) + stdscr.hline('-', 5, curses.A_BOLD) + stdscr.hline(1,1,'-', 5) + stdscr.hline(1,1,'-', 5, curses.A_BOLD) + + stdscr.idcok(1) + stdscr.idlok(1) + stdscr.immedok(1) + stdscr.insch('c') + stdscr.insdelln(1) + stdscr.insnstr('abc', 3) + stdscr.insnstr('abc', 3, curses.A_BOLD) + stdscr.insnstr(5, 5, 'abc', 3) + stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD) + + stdscr.insstr('def') + stdscr.insstr('def', curses.A_BOLD) + stdscr.insstr(5, 5, 'def') + stdscr.insstr(5, 5, 'def', curses.A_BOLD) + stdscr.is_linetouched(0) + stdscr.keypad(1) + stdscr.leaveok(1) + stdscr.move(3,3) + win.mvwin(2,2) + stdscr.nodelay(1) + stdscr.notimeout(1) + win2.overlay(win) + win2.overwrite(win) + stdscr.redrawln(1,2) + + stdscr.scrollok(1) + stdscr.scroll() + stdscr.scroll(2) + stdscr.scroll(-3) + + stdscr.setscrreg(10,15) + win3 = stdscr.subwin(10,10) + win3 = stdscr.subwin(10,10, 5,5) + stdscr.syncok(1) + stdscr.timeout(5) + stdscr.touchline(5,5) + stdscr.touchline(5,5,0) + stdscr.vline('a', 3) + stdscr.vline('a', 3, curses.A_STANDOUT) + stdscr.vline(1,1, 'a', 3) + stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT) + + if hasattr(curses, 'resize'): + stdscr.resize() + if hasattr(curses, 'enclose'): + stdscr.enclose() + + +def module_funcs(stdscr): + "Test module-level functions" + + for func in [curses.baudrate, curses.beep, curses.can_change_color, + curses.cbreak, curses.def_prog_mode, curses.doupdate, + curses.filter, curses.flash, curses.flushinp, + curses.has_colors, curses.has_ic, curses.has_il, + curses.isendwin, curses.killchar, curses.longname, + curses.nocbreak, curses.noecho, curses.nonl, + curses.noqiflush, curses.noraw, + curses.reset_prog_mode, curses.termattrs, + curses.termname, curses.erasechar, curses.getsyx]: + func() + + # Functions that actually need arguments + curses.curs_set(1) + curses.delay_output(1) + curses.echo() ; curses.echo(1) + + f = tempfile.TemporaryFile() + stdscr.putwin(f) + f.seek(0) + curses.getwin(f) + f.close() + + curses.halfdelay(1) + curses.intrflush(1) + curses.meta(1) + curses.napms(100) + curses.newpad(50,50) + win = curses.newwin(5,5) + win = curses.newwin(5,5, 1,1) + curses.nl() ; curses.nl(1) + curses.putp('abc') + curses.qiflush() + curses.raw() ; curses.raw(1) + curses.setsyx(5,5) + curses.setupterm(fd=sys.__stdout__.fileno()) + curses.tigetflag('hc') + curses.tigetnum('co') + curses.tigetstr('cr') + curses.tparm('cr') + curses.typeahead(sys.__stdin__.fileno()) + curses.unctrl('a') + curses.ungetch('a') + curses.use_env(1) + + # Functions only available on a few platforms + if curses.has_colors(): + curses.start_color() + curses.init_pair(2, 1,1) + curses.color_content(1) + curses.color_pair(2) + curses.pair_content(curses.COLOR_PAIRS) + curses.pair_number(0) + + if hasattr(curses, 'keyname'): + curses.keyname(13) + + if hasattr(curses, 'has_key'): + curses.has_key(13) + + if hasattr(curses, 'getmouse'): + curses.mousemask(curses.BUTTON1_PRESSED) + curses.mouseinterval(10) + + +def main(stdscr): + curses.savetty() + try: + module_funcs(stdscr) + window_funcs(stdscr) + finally: + curses.resetty() + +if __name__ == '__main__': + curses.wrapper(main) +else: + try: + stdscr = curses.initscr() + main(stdscr) + finally: + curses.endwin() diff --git a/lib-python/2.2/test/test_dbm.py b/lib-python/2.2/test/test_dbm.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_dbm.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python +"""Test script for the dbm module + Roger E. Masse +""" +import dbm +from dbm import error +from test_support import verbose, verify + +filename = '/tmp/delete_me' + +d = dbm.open(filename, 'c') +verify(d.keys() == []) +d['a'] = 'b' +d['12345678910'] = '019237410982340912840198242' +d.keys() +if d.has_key('a'): + if verbose: + print 'Test dbm keys: ', d.keys() + +d.close() +d = dbm.open(filename, 'r') +d.close() +d = dbm.open(filename, 'rw') +d.close() +d = dbm.open(filename, 'w') +d.close() +d = dbm.open(filename, 'n') +d.close() + +try: + import os + if dbm.library == "ndbm": + # classic dbm + os.unlink(filename + '.dir') + os.unlink(filename + '.pag') + elif dbm.library == "BSD db": + # BSD DB's compatibility layer + os.unlink(filename + '.db') + else: + # GNU gdbm compatibility layer + os.unlink(filename) +except: + pass diff --git a/lib-python/2.2/test/test_descr.py b/lib-python/2.2/test/test_descr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_descr.py @@ -0,0 +1,3276 @@ +# Test enhancements related to descriptors and new-style classes + +from test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout +from copy import deepcopy +import warnings + +warnings.filterwarnings("ignore", + r'complex divmod\(\), // and % are deprecated$', + DeprecationWarning, r'(|test_descr)$') + +def veris(a, b): + if a is not b: + raise TestFailed, "%r is %r" % (a, b) + +def testunop(a, res, expr="len(a)", meth="__len__"): + if verbose: print "checking", expr + dict = {'a': a} + vereq(eval(expr, dict), res) + t = type(a) + m = getattr(t, meth) + while meth not in t.__dict__: + t = t.__bases__[0] + vereq(m, t.__dict__[meth]) + vereq(m(a), res) + bm = getattr(a, meth) + vereq(bm(), res) + +def testbinop(a, b, res, expr="a+b", meth="__add__"): + if verbose: print "checking", expr + dict = {'a': a, 'b': b} + + # XXX Hack so this passes before 2.3 when -Qnew is specified. + if meth == "__div__" and 1/2 == 0.5: + meth = "__truediv__" + + vereq(eval(expr, dict), res) + t = type(a) + m = getattr(t, meth) + while meth not in t.__dict__: + t = t.__bases__[0] + vereq(m, t.__dict__[meth]) + vereq(m(a, b), res) + bm = getattr(a, meth) + vereq(bm(b), res) + +def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"): + if verbose: print "checking", expr + dict = {'a': a, 'b': b, 'c': c} + vereq(eval(expr, dict), res) + t = type(a) + m = getattr(t, meth) + while meth not in t.__dict__: + t = t.__bases__[0] + vereq(m, t.__dict__[meth]) + vereq(m(a, b, c), res) + bm = getattr(a, meth) + vereq(bm(b, c), res) + +def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"): + if verbose: print "checking", stmt + dict = {'a': deepcopy(a), 'b': b} + exec stmt in dict + vereq(dict['a'], res) + t = type(a) + m = getattr(t, meth) + while meth not in t.__dict__: + t = t.__bases__[0] + vereq(m, t.__dict__[meth]) + dict['a'] = deepcopy(a) + m(dict['a'], b) + vereq(dict['a'], res) + dict['a'] = deepcopy(a) + bm = getattr(dict['a'], meth) + bm(b) + vereq(dict['a'], res) + +def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"): + if verbose: print "checking", stmt + dict = {'a': deepcopy(a), 'b': b, 'c': c} + exec stmt in dict + vereq(dict['a'], res) + t = type(a) + m = getattr(t, meth) + while meth not in t.__dict__: + t = t.__bases__[0] + vereq(m, t.__dict__[meth]) + dict['a'] = deepcopy(a) + m(dict['a'], b, c) + vereq(dict['a'], res) + dict['a'] = deepcopy(a) + bm = getattr(dict['a'], meth) + bm(b, c) + vereq(dict['a'], res) + +def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"): + if verbose: print "checking", stmt + dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d} + exec stmt in dict + vereq(dict['a'], res) + t = type(a) + while meth not in t.__dict__: + t = t.__bases__[0] + m = getattr(t, meth) + vereq(m, t.__dict__[meth]) + dict['a'] = deepcopy(a) + m(dict['a'], b, c, d) + vereq(dict['a'], res) + dict['a'] = deepcopy(a) + bm = getattr(dict['a'], meth) + bm(b, c, d) + vereq(dict['a'], res) + +def class_docstrings(): + class Classic: + "A classic docstring." + vereq(Classic.__doc__, "A classic docstring.") + vereq(Classic.__dict__['__doc__'], "A classic docstring.") + + class Classic2: + pass + verify(Classic2.__doc__ is None) + + class NewStatic(object): + "Another docstring." + vereq(NewStatic.__doc__, "Another docstring.") + vereq(NewStatic.__dict__['__doc__'], "Another docstring.") + + class NewStatic2(object): + pass + verify(NewStatic2.__doc__ is None) + + class NewDynamic(object): + "Another docstring." + vereq(NewDynamic.__doc__, "Another docstring.") + vereq(NewDynamic.__dict__['__doc__'], "Another docstring.") + + class NewDynamic2(object): + pass + verify(NewDynamic2.__doc__ is None) + +def lists(): + if verbose: print "Testing list operations..." + testbinop([1], [2], [1,2], "a+b", "__add__") + testbinop([1,2,3], 2, 1, "b in a", "__contains__") + testbinop([1,2,3], 4, 0, "b in a", "__contains__") + testbinop([1,2,3], 1, 2, "a[b]", "__getitem__") + testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__") + testsetop([1], [2], [1,2], "a+=b", "__iadd__") + testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__") + testunop([1,2,3], 3, "len(a)", "__len__") + testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__") + testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__") + testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__") + testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__") + +def dicts(): + if verbose: print "Testing dict operations..." + testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__") + testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__") + testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__") + testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__") + d = {1:2,3:4} + l1 = [] + for i in d.keys(): l1.append(i) + l = [] + for i in iter(d): l.append(i) + vereq(l, l1) + l = [] + for i in d.__iter__(): l.append(i) + vereq(l, l1) + l = [] + for i in dict.__iter__(d): l.append(i) + vereq(l, l1) + d = {1:2, 3:4} + testunop(d, 2, "len(a)", "__len__") + vereq(eval(repr(d), {}), d) + vereq(eval(d.__repr__(), {}), d) + testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__") + +def dict_constructor(): + if verbose: + print "Testing dict constructor ..." + d = dict() + vereq(d, {}) + d = dict({}) + vereq(d, {}) + d = dict(items={}) + vereq(d, {}) + d = dict({1: 2, 'a': 'b'}) + vereq(d, {1: 2, 'a': 'b'}) + vereq(d, dict(d.items())) + vereq(d, dict(items=d.iteritems())) + for badarg in 0, 0L, 0j, "0", [0], (0,): + try: + dict(badarg) + except TypeError: + pass + except ValueError: + if badarg == "0": + # It's a sequence, and its elements are also sequences (gotta + # love strings ), but they aren't of length 2, so this + # one seemed better as a ValueError than a TypeError. + pass + else: + raise TestFailed("no TypeError from dict(%r)" % badarg) + else: + raise TestFailed("no TypeError from dict(%r)" % badarg) + try: + dict(senseless={}) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dict(senseless={})") + + try: + dict({}, {}) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dict({}, {})") + + class Mapping: + # Lacks a .keys() method; will be added later. + dict = {1:2, 3:4, 'a':1j} + + try: + dict(Mapping()) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dict(incomplete mapping)") + + Mapping.keys = lambda self: self.dict.keys() + Mapping.__getitem__ = lambda self, i: self.dict[i] + d = dict(items=Mapping()) + vereq(d, Mapping.dict) + + # Init from sequence of iterable objects, each producing a 2-sequence. + class AddressBookEntry: + def __init__(self, first, last): + self.first = first + self.last = last + def __iter__(self): + return iter([self.first, self.last]) + + d = dict([AddressBookEntry('Tim', 'Warsaw'), + AddressBookEntry('Barry', 'Peters'), + AddressBookEntry('Tim', 'Peters'), + AddressBookEntry('Barry', 'Warsaw')]) + vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'}) + + d = dict(zip(range(4), range(1, 5))) + vereq(d, dict([(i, i+1) for i in range(4)])) + + # Bad sequence lengths. + for bad in [('tooshort',)], [('too', 'long', 'by 1')]: + try: + dict(bad) + except ValueError: + pass + else: + raise TestFailed("no ValueError from dict(%r)" % bad) + +def test_dir(): + if verbose: + print "Testing dir() ..." + junk = 12 + vereq(dir(), ['junk']) + del junk + + # Just make sure these don't blow up! + for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir: + dir(arg) + + # Try classic classes. + class C: + Cdata = 1 + def Cmethod(self): pass + + cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__'] + vereq(dir(C), cstuff) + verify('im_self' in dir(C.Cmethod)) + + c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__. + vereq(dir(c), cstuff) + + c.cdata = 2 + c.cmethod = lambda self: 0 + vereq(dir(c), cstuff + ['cdata', 'cmethod']) + verify('im_self' in dir(c.Cmethod)) + + class A(C): + Adata = 1 + def Amethod(self): pass + + astuff = ['Adata', 'Amethod'] + cstuff + vereq(dir(A), astuff) + verify('im_self' in dir(A.Amethod)) + a = A() + vereq(dir(a), astuff) + verify('im_self' in dir(a.Amethod)) + a.adata = 42 + a.amethod = lambda self: 3 + vereq(dir(a), astuff + ['adata', 'amethod']) + + # The same, but with new-style classes. Since these have object as a + # base class, a lot more gets sucked in. + def interesting(strings): + return [s for s in strings if not s.startswith('_')] + + class C(object): + Cdata = 1 + def Cmethod(self): pass + + cstuff = ['Cdata', 'Cmethod'] + vereq(interesting(dir(C)), cstuff) + + c = C() + vereq(interesting(dir(c)), cstuff) + verify('im_self' in dir(C.Cmethod)) + + c.cdata = 2 + c.cmethod = lambda self: 0 + vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod']) + verify('im_self' in dir(c.Cmethod)) + + class A(C): + Adata = 1 + def Amethod(self): pass + + astuff = ['Adata', 'Amethod'] + cstuff + vereq(interesting(dir(A)), astuff) + verify('im_self' in dir(A.Amethod)) + a = A() + vereq(interesting(dir(a)), astuff) + a.adata = 42 + a.amethod = lambda self: 3 + vereq(interesting(dir(a)), astuff + ['adata', 'amethod']) + verify('im_self' in dir(a.Amethod)) + + # Try a module subclass. + import sys + class M(type(sys)): + pass + minstance = M() + minstance.b = 2 + minstance.a = 1 + vereq(dir(minstance), ['a', 'b']) + + class M2(M): + def getdict(self): + return "Not a dict!" + __dict__ = property(getdict) + + m2instance = M2() + m2instance.b = 2 + m2instance.a = 1 + vereq(m2instance.__dict__, "Not a dict!") + try: + dir(m2instance) + except TypeError: + pass + + # Two essentially featureless objects, just inheriting stuff from + # object. + vereq(dir(None), dir(Ellipsis)) + + # Nasty test case for proxied objects + class Wrapper(object): + def __init__(self, obj): + self.__obj = obj + def __repr__(self): + return "Wrapper(%s)" % repr(self.__obj) + def __getitem__(self, key): + return Wrapper(self.__obj[key]) + def __len__(self): + return len(self.__obj) + def __getattr__(self, name): + return Wrapper(getattr(self.__obj, name)) + + class C(object): + def __getclass(self): + return Wrapper(type(self)) + __class__ = property(__getclass) + + dir(C()) # This used to segfault + +binops = { + 'add': '+', + 'sub': '-', + 'mul': '*', + 'div': '/', + 'mod': '%', + 'divmod': 'divmod', + 'pow': '**', + 'lshift': '<<', + 'rshift': '>>', + 'and': '&', + 'xor': '^', + 'or': '|', + 'cmp': 'cmp', + 'lt': '<', + 'le': '<=', + 'eq': '==', + 'ne': '!=', + 'gt': '>', + 'ge': '>=', + } + +for name, expr in binops.items(): + if expr.islower(): + expr = expr + "(a, b)" + else: + expr = 'a %s b' % expr + binops[name] = expr + +unops = { + 'pos': '+', + 'neg': '-', + 'abs': 'abs', + 'invert': '~', + 'int': 'int', + 'long': 'long', + 'float': 'float', + 'oct': 'oct', + 'hex': 'hex', + } + +for name, expr in unops.items(): + if expr.islower(): + expr = expr + "(a)" + else: + expr = '%s a' % expr + unops[name] = expr + +def numops(a, b, skip=[]): + dict = {'a': a, 'b': b} + for name, expr in binops.items(): + if name not in skip: + name = "__%s__" % name + if hasattr(a, name): + res = eval(expr, dict) + testbinop(a, b, res, expr, name) + for name, expr in unops.items(): + if name not in skip: + name = "__%s__" % name + if hasattr(a, name): + res = eval(expr, dict) + testunop(a, res, expr, name) + +def ints(): + if verbose: print "Testing int operations..." + numops(100, 3) + # The following crashes in Python 2.2 + vereq((1).__nonzero__(), 1) + vereq((0).__nonzero__(), 0) + # This returns 'NotImplemented' in Python 2.2 + class C(int): + def __add__(self, other): + return NotImplemented + try: + C() + "" + except TypeError: + pass + else: + raise TestFailed, "NotImplemented should have caused TypeError" + +def longs(): + if verbose: print "Testing long operations..." + numops(100L, 3L) + +def floats(): + if verbose: print "Testing float operations..." + numops(100.0, 3.0) + +def complexes(): + if verbose: print "Testing complex operations..." + numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float']) + class Number(complex): + __slots__ = ['prec'] + def __new__(cls, *args, **kwds): + result = complex.__new__(cls, *args) + result.prec = kwds.get('prec', 12) + return result + def __repr__(self): + prec = self.prec + if self.imag == 0.0: + return "%.*g" % (prec, self.real) + if self.real == 0.0: + return "%.*gj" % (prec, self.imag) + return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) + __str__ = __repr__ + + a = Number(3.14, prec=6) + vereq(`a`, "3.14") + vereq(a.prec, 6) + + a = Number(a, prec=2) + vereq(`a`, "3.1") + vereq(a.prec, 2) + + a = Number(234.5) + vereq(`a`, "234.5") + vereq(a.prec, 12) + +def spamlists(): + if verbose: print "Testing spamlist operations..." + import copy, xxsubtype as spam + def spamlist(l, memo=None): + import xxsubtype as spam + return spam.spamlist(l) + # This is an ugly hack: + copy._deepcopy_dispatch[spam.spamlist] = spamlist + + testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__") + testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__") + testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__") + testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__") + testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]), + "a[b:c]", "__getslice__") + testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]), + "a+=b", "__iadd__") + testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__") + testunop(spamlist([1,2,3]), 3, "len(a)", "__len__") + testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__") + testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__") + testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__") + testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]), + spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__") + # Test subclassing + class C(spam.spamlist): + def foo(self): return 1 + a = C() + vereq(a, []) + vereq(a.foo(), 1) + a.append(100) + vereq(a, [100]) + vereq(a.getstate(), 0) + a.setstate(42) + vereq(a.getstate(), 42) + +def spamdicts(): + if verbose: print "Testing spamdict operations..." + import copy, xxsubtype as spam + def spamdict(d, memo=None): + import xxsubtype as spam + sd = spam.spamdict() + for k, v in d.items(): sd[k] = v + return sd + # This is an ugly hack: + copy._deepcopy_dispatch[spam.spamdict] = spamdict + + testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__") + testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__") + testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__") + testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__") + d = spamdict({1:2,3:4}) + l1 = [] + for i in d.keys(): l1.append(i) + l = [] + for i in iter(d): l.append(i) + vereq(l, l1) + l = [] + for i in d.__iter__(): l.append(i) + vereq(l, l1) + l = [] + for i in type(spamdict({})).__iter__(d): l.append(i) + vereq(l, l1) + straightd = {1:2, 3:4} + spamd = spamdict(straightd) + testunop(spamd, 2, "len(a)", "__len__") + testunop(spamd, repr(straightd), "repr(a)", "__repr__") + testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}), + "a[b]=c", "__setitem__") + # Test subclassing + class C(spam.spamdict): + def foo(self): return 1 + a = C() + vereq(a.items(), []) + vereq(a.foo(), 1) + a['foo'] = 'bar' + vereq(a.items(), [('foo', 'bar')]) + vereq(a.getstate(), 0) + a.setstate(100) + vereq(a.getstate(), 100) + +def pydicts(): + if verbose: print "Testing Python subclass of dict..." + verify(issubclass(dict, dict)) + verify(isinstance({}, dict)) + d = dict() + vereq(d, {}) + verify(d.__class__ is dict) + verify(isinstance(d, dict)) + class C(dict): + state = -1 + def __init__(self, *a, **kw): + if a: + vereq(len(a), 1) + self.state = a[0] + if kw: + for k, v in kw.items(): self[v] = k + def __getitem__(self, key): + return self.get(key, 0) + def __setitem__(self, key, value): + verify(isinstance(key, type(0))) + dict.__setitem__(self, key, value) + def setstate(self, state): + self.state = state + def getstate(self): + return self.state + verify(issubclass(C, dict)) + a1 = C(12) + vereq(a1.state, 12) + a2 = C(foo=1, bar=2) + vereq(a2[1] == 'foo' and a2[2], 'bar') + a = C() + vereq(a.state, -1) + vereq(a.getstate(), -1) + a.setstate(0) + vereq(a.state, 0) + vereq(a.getstate(), 0) + a.setstate(10) + vereq(a.state, 10) + vereq(a.getstate(), 10) + vereq(a[42], 0) + a[42] = 24 + vereq(a[42], 24) + if verbose: print "pydict stress test ..." + N = 50 + for i in range(N): + a[i] = C() + for j in range(N): + a[i][j] = i*j + for i in range(N): + for j in range(N): + vereq(a[i][j], i*j) + +def pylists(): + if verbose: print "Testing Python subclass of list..." + class C(list): + def __getitem__(self, i): + return list.__getitem__(self, i) + 100 + def __getslice__(self, i, j): + return (i, j) + a = C() + a.extend([0,1,2]) + vereq(a[0], 100) + vereq(a[1], 101) + vereq(a[2], 102) + vereq(a[100:200], (100,200)) + +def metaclass(): + if verbose: print "Testing __metaclass__..." + class C: + __metaclass__ = type + def __init__(self): + self.__state = 0 + def getstate(self): + return self.__state + def setstate(self, state): + self.__state = state + a = C() + vereq(a.getstate(), 0) + a.setstate(10) + vereq(a.getstate(), 10) + class D: + class __metaclass__(type): + def myself(cls): return cls + vereq(D.myself(), D) + d = D() + verify(d.__class__ is D) + class M1(type): + def __new__(cls, name, bases, dict): + dict['__spam__'] = 1 + return type.__new__(cls, name, bases, dict) + class C: + __metaclass__ = M1 + vereq(C.__spam__, 1) + c = C() + vereq(c.__spam__, 1) + + class _instance(object): + pass + class M2(object): + def __new__(cls, name, bases, dict): + self = object.__new__(cls) + self.name = name + self.bases = bases + self.dict = dict + return self + __new__ = staticmethod(__new__) + def __call__(self): + it = _instance() + # Early binding of methods + for key in self.dict: + if key.startswith("__"): + continue + setattr(it, key, self.dict[key].__get__(it, self)) + return it + class C: + __metaclass__ = M2 + def spam(self): + return 42 + vereq(C.name, 'C') + vereq(C.bases, ()) + verify('spam' in C.dict) + c = C() + vereq(c.spam(), 42) + + # More metaclass examples + + class autosuper(type): + # Automatically add __super to the class + # This trick only works for dynamic classes + def __new__(metaclass, name, bases, dict): + cls = super(autosuper, metaclass).__new__(metaclass, + name, bases, dict) + # Name mangling for __super removes leading underscores + while name[:1] == "_": + name = name[1:] + if name: + name = "_%s__super" % name + else: + name = "__super" + setattr(cls, name, super(cls)) + return cls + class A: + __metaclass__ = autosuper + def meth(self): + return "A" + class B(A): + def meth(self): + return "B" + self.__super.meth() + class C(A): + def meth(self): + return "C" + self.__super.meth() + class D(C, B): + def meth(self): + return "D" + self.__super.meth() + vereq(D().meth(), "DCBA") + class E(B, C): + def meth(self): + return "E" + self.__super.meth() + vereq(E().meth(), "EBCA") + + class autoproperty(type): + # Automatically create property attributes when methods + # named _get_x and/or _set_x are found + def __new__(metaclass, name, bases, dict): + hits = {} + for key, val in dict.iteritems(): + if key.startswith("_get_"): + key = key[5:] + get, set = hits.get(key, (None, None)) + get = val + hits[key] = get, set + elif key.startswith("_set_"): + key = key[5:] + get, set = hits.get(key, (None, None)) + set = val + hits[key] = get, set + for key, (get, set) in hits.iteritems(): + dict[key] = property(get, set) + return super(autoproperty, metaclass).__new__(metaclass, + name, bases, dict) + class A: + __metaclass__ = autoproperty + def _get_x(self): + return -self.__x + def _set_x(self, x): + self.__x = -x + a = A() + verify(not hasattr(a, "x")) + a.x = 12 + vereq(a.x, 12) + vereq(a._A__x, -12) + + class multimetaclass(autoproperty, autosuper): + # Merge of multiple cooperating metaclasses + pass + class A: + __metaclass__ = multimetaclass + def _get_x(self): + return "A" + class B(A): + def _get_x(self): + return "B" + self.__super._get_x() + class C(A): + def _get_x(self): + return "C" + self.__super._get_x() + class D(C, B): + def _get_x(self): + return "D" + self.__super._get_x() + vereq(D().x, "DCBA") + + # Make sure type(x) doesn't call x.__class__.__init__ + class T(type): + counter = 0 + def __init__(self, *args): + T.counter += 1 + class C: + __metaclass__ = T + vereq(T.counter, 1) + a = C() + vereq(type(a), C) + vereq(T.counter, 1) + + class C(object): pass + c = C() + try: c() + except TypeError: pass + else: raise TestError, "calling object w/o call method should raise TypeError" + +def pymods(): + if verbose: print "Testing Python subclass of module..." + log = [] + import sys + MT = type(sys) + class MM(MT): + def __init__(self): + MT.__init__(self) + def __getattribute__(self, name): + log.append(("getattr", name)) + return MT.__getattribute__(self, name) + def __setattr__(self, name, value): + log.append(("setattr", name, value)) + MT.__setattr__(self, name, value) + def __delattr__(self, name): + log.append(("delattr", name)) + MT.__delattr__(self, name) + a = MM() + a.foo = 12 + x = a.foo + del a.foo + vereq(log, [("setattr", "foo", 12), + ("getattr", "foo"), + ("delattr", "foo")]) + +def multi(): + if verbose: print "Testing multiple inheritance..." + class C(object): + def __init__(self): + self.__state = 0 + def getstate(self): + return self.__state + def setstate(self, state): + self.__state = state + a = C() + vereq(a.getstate(), 0) + a.setstate(10) + vereq(a.getstate(), 10) + class D(dict, C): + def __init__(self): + type({}).__init__(self) + C.__init__(self) + d = D() + vereq(d.keys(), []) + d["hello"] = "world" + vereq(d.items(), [("hello", "world")]) + vereq(d["hello"], "world") + vereq(d.getstate(), 0) + d.setstate(10) + vereq(d.getstate(), 10) + vereq(D.__mro__, (D, dict, C, object)) + + # SF bug #442833 + class Node(object): + def __int__(self): + return int(self.foo()) + def foo(self): + return "23" + class Frag(Node, list): + def foo(self): + return "42" + vereq(Node().__int__(), 23) + vereq(int(Node()), 23) + vereq(Frag().__int__(), 42) + vereq(int(Frag()), 42) + + # MI mixing classic and new-style classes. + + class A: + x = 1 + + class B(A): + pass + + class C(A): + x = 2 + + class D(B, C): + pass + vereq(D.x, 1) + + # Classic MRO is preserved for a classic base class. + class E(D, object): + pass + vereq(E.__mro__, (E, D, B, A, C, object)) + vereq(E.x, 1) + + # But with a mix of classic bases, their MROs are combined using + # new-style MRO. + class F(B, C, object): + pass + vereq(F.__mro__, (F, B, C, A, object)) + vereq(F.x, 2) + + # Try something else. + class C: + def cmethod(self): + return "C a" + def all_method(self): + return "C b" + + class M1(C, object): + def m1method(self): + return "M1 a" + def all_method(self): + return "M1 b" + + vereq(M1.__mro__, (M1, C, object)) + m = M1() + vereq(m.cmethod(), "C a") + vereq(m.m1method(), "M1 a") + vereq(m.all_method(), "M1 b") + + class D(C): + def dmethod(self): + return "D a" + def all_method(self): + return "D b" + + class M2(object, D): + def m2method(self): + return "M2 a" + def all_method(self): + return "M2 b" + + vereq(M2.__mro__, (M2, object, D, C)) + m = M2() + vereq(m.cmethod(), "C a") + vereq(m.dmethod(), "D a") + vereq(m.m2method(), "M2 a") + vereq(m.all_method(), "M2 b") + + class M3(M1, object, M2): + def m3method(self): + return "M3 a" + def all_method(self): + return "M3 b" + # XXX Expected this (the commented-out result): + # vereq(M3.__mro__, (M3, M1, M2, object, D, C)) + vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ? + m = M3() + vereq(m.cmethod(), "C a") + vereq(m.dmethod(), "D a") + vereq(m.m1method(), "M1 a") + vereq(m.m2method(), "M2 a") + vereq(m.m3method(), "M3 a") + vereq(m.all_method(), "M3 b") + + class Classic: + pass + try: + class New(Classic): + __metaclass__ = type + except TypeError: + pass + else: + raise TestFailed, "new class with only classic bases - shouldn't be" + +def diamond(): + if verbose: print "Testing multiple inheritance special cases..." + class A(object): + def spam(self): return "A" + vereq(A().spam(), "A") + class B(A): + def boo(self): return "B" + def spam(self): return "B" + vereq(B().spam(), "B") + vereq(B().boo(), "B") + class C(A): + def boo(self): return "C" + vereq(C().spam(), "A") + vereq(C().boo(), "C") + class D(B, C): pass + vereq(D().spam(), "B") + vereq(D().boo(), "B") + vereq(D.__mro__, (D, B, C, A, object)) + class E(C, B): pass + vereq(E().spam(), "B") + vereq(E().boo(), "C") + vereq(E.__mro__, (E, C, B, A, object)) + class F(D, E): pass + vereq(F().spam(), "B") + vereq(F().boo(), "B") + vereq(F.__mro__, (F, D, E, B, C, A, object)) + class G(E, D): pass + vereq(G().spam(), "B") + vereq(G().boo(), "C") + vereq(G.__mro__, (G, E, D, C, B, A, object)) + +def objects(): + if verbose: print "Testing object class..." + a = object() + vereq(a.__class__, object) + vereq(type(a), object) + b = object() + verify(a is not b) + verify(not hasattr(a, "foo")) + try: + a.foo = 12 + except (AttributeError, TypeError): + pass + else: + verify(0, "object() should not allow setting a foo attribute") + verify(not hasattr(object(), "__dict__")) + + class Cdict(object): + pass + x = Cdict() + vereq(x.__dict__, {}) + x.foo = 1 + vereq(x.foo, 1) + vereq(x.__dict__, {'foo': 1}) + +def slots(): + if verbose: print "Testing __slots__..." + class C0(object): + __slots__ = [] + x = C0() + verify(not hasattr(x, "__dict__")) + verify(not hasattr(x, "foo")) + + class C1(object): + __slots__ = ['a'] + x = C1() + verify(not hasattr(x, "__dict__")) + verify(not hasattr(x, "a")) + x.a = 1 + vereq(x.a, 1) + x.a = None + veris(x.a, None) + del x.a + verify(not hasattr(x, "a")) + + class C3(object): + __slots__ = ['a', 'b', 'c'] + x = C3() + verify(not hasattr(x, "__dict__")) + verify(not hasattr(x, 'a')) + verify(not hasattr(x, 'b')) + verify(not hasattr(x, 'c')) + x.a = 1 + x.b = 2 + x.c = 3 + vereq(x.a, 1) + vereq(x.b, 2) + vereq(x.c, 3) + + # Test leaks + class Counted(object): + counter = 0 # counts the number of instances alive + def __init__(self): + Counted.counter += 1 + def __del__(self): + Counted.counter -= 1 + class C(object): + __slots__ = ['a', 'b', 'c'] + x = C() + x.a = Counted() + x.b = Counted() + x.c = Counted() + vereq(Counted.counter, 3) + del x + vereq(Counted.counter, 0) + class D(C): + pass + x = D() + x.a = Counted() + x.z = Counted() + vereq(Counted.counter, 2) + del x + vereq(Counted.counter, 0) + class E(D): + __slots__ = ['e'] + x = E() + x.a = Counted() + x.z = Counted() + x.e = Counted() + vereq(Counted.counter, 3) + del x + vereq(Counted.counter, 0) + + # Test cyclical leaks [SF bug 519621] + class F(object): + __slots__ = ['a', 'b'] + log = [] + s = F() + s.a = [Counted(), s] + vereq(Counted.counter, 1) + s = None + import gc + gc.collect() + vereq(Counted.counter, 0) + + # Test lookup leaks [SF bug 572567] + import sys,gc + class G(object): + def __cmp__(self, other): + return 0 + g = G() + orig_objects = len(gc.get_objects()) + for i in xrange(10): + g==g + new_objects = len(gc.get_objects()) + vereq(orig_objects, new_objects) + class H(object): + __slots__ = ['a', 'b'] + def __init__(self): + self.a = 1 + self.b = 2 + def __del__(self): + assert self.a == 1 + assert self.b == 2 + + save_stderr = sys.stderr + sys.stderr = sys.stdout + h = H() + try: + del h + finally: + sys.stderr = save_stderr + +def dynamics(): + if verbose: print "Testing class attribute propagation..." + class D(object): + pass + class E(D): + pass + class F(D): + pass + D.foo = 1 + vereq(D.foo, 1) + # Test that dynamic attributes are inherited + vereq(E.foo, 1) + vereq(F.foo, 1) + # Test dynamic instances + class C(object): + pass + a = C() + verify(not hasattr(a, "foobar")) + C.foobar = 2 + vereq(a.foobar, 2) + C.method = lambda self: 42 + vereq(a.method(), 42) + C.__repr__ = lambda self: "C()" + vereq(repr(a), "C()") + C.__int__ = lambda self: 100 + vereq(int(a), 100) + vereq(a.foobar, 2) + verify(not hasattr(a, "spam")) + def mygetattr(self, name): + if name == "spam": + return "spam" + raise AttributeError + C.__getattr__ = mygetattr + vereq(a.spam, "spam") + a.new = 12 + vereq(a.new, 12) + def mysetattr(self, name, value): + if name == "spam": + raise AttributeError + return object.__setattr__(self, name, value) + C.__setattr__ = mysetattr + try: + a.spam = "not spam" + except AttributeError: + pass + else: + verify(0, "expected AttributeError") + vereq(a.spam, "spam") + class D(C): + pass + d = D() + d.foo = 1 + vereq(d.foo, 1) + + # Test handling of int*seq and seq*int + class I(int): + pass + vereq("a"*I(2), "aa") + vereq(I(2)*"a", "aa") + vereq(2*I(3), 6) + vereq(I(3)*2, 6) + vereq(I(3)*I(2), 6) + + # Test handling of long*seq and seq*long + class L(long): + pass + vereq("a"*L(2L), "aa") + vereq(L(2L)*"a", "aa") + vereq(2*L(3), 6) + vereq(L(3)*2, 6) + vereq(L(3)*L(2), 6) + + # Test comparison of classes with dynamic metaclasses + class dynamicmetaclass(type): + pass + class someclass: + __metaclass__ = dynamicmetaclass + verify(someclass != object) + +def errors(): + if verbose: print "Testing errors..." + + try: + class C(list, dict): + pass + except TypeError: + pass + else: + verify(0, "inheritance from both list and dict should be illegal") + + try: + class C(object, None): + pass + except TypeError: + pass + else: + verify(0, "inheritance from non-type should be illegal") + class Classic: + pass + + try: + class C(type(len)): + pass + except TypeError: + pass + else: + verify(0, "inheritance from CFunction should be illegal") + + try: + class C(object): + __slots__ = 1 + except TypeError: + pass + else: + verify(0, "__slots__ = 1 should be illegal") + + try: + class C(object): + __slots__ = [1] + except TypeError: + pass + else: + verify(0, "__slots__ = [1] should be illegal") + +def classmethods(): + if verbose: print "Testing class methods..." + class C(object): + def foo(*a): return a + goo = classmethod(foo) + c = C() + vereq(C.goo(1), (C, 1)) + vereq(c.goo(1), (C, 1)) + vereq(c.foo(1), (c, 1)) + class D(C): + pass + d = D() + vereq(D.goo(1), (D, 1)) + vereq(d.goo(1), (D, 1)) + vereq(d.foo(1), (d, 1)) + vereq(D.foo(d, 1), (d, 1)) + # Test for a specific crash (SF bug 528132) + def f(cls, arg): return (cls, arg) + ff = classmethod(f) + vereq(ff.__get__(0, int)(42), (int, 42)) + vereq(ff.__get__(0)(42), (int, 42)) + + # Test super() with classmethods (SF bug 535444) + veris(C.goo.im_self, C) + veris(D.goo.im_self, D) + veris(super(D,D).goo.im_self, D) + veris(super(D,d).goo.im_self, D) + vereq(super(D,D).goo(), (D,)) + vereq(super(D,d).goo(), (D,)) + + # Verify that argument is checked for callability (SF bug 753451) + try: + classmethod(1).__get__(1) + except TypeError: + pass + else: + raise TestFailed, "classmethod should check for callability" + +def staticmethods(): + if verbose: print "Testing static methods..." + class C(object): + def foo(*a): return a + goo = staticmethod(foo) + c = C() + vereq(C.goo(1), (1,)) + vereq(c.goo(1), (1,)) + vereq(c.foo(1), (c, 1,)) + class D(C): + pass + d = D() + vereq(D.goo(1), (1,)) + vereq(d.goo(1), (1,)) + vereq(d.foo(1), (d, 1)) + vereq(D.foo(d, 1), (d, 1)) + +def classic(): + if verbose: print "Testing classic classes..." + class C: + def foo(*a): return a + goo = classmethod(foo) + c = C() + vereq(C.goo(1), (C, 1)) + vereq(c.goo(1), (C, 1)) + vereq(c.foo(1), (c, 1)) + class D(C): + pass + d = D() + vereq(D.goo(1), (D, 1)) + vereq(d.goo(1), (D, 1)) + vereq(d.foo(1), (d, 1)) + vereq(D.foo(d, 1), (d, 1)) + class E: # *not* subclassing from C + foo = C.foo + vereq(E().foo, C.foo) # i.e., unbound + verify(repr(C.foo.__get__(C())).startswith("= 0) + vereq(str(c1), repr(c1)) + verify(-1 not in c1) + for i in range(10): + verify(i in c1) + verify(10 not in c1) + # Test the default behavior for dynamic classes + class D(object): + def __getitem__(self, i): + if 0 <= i < 10: return i + raise IndexError + d1 = D() + d2 = D() + verify(not not d1) + vereq(hash(d1), id(d1)) + vereq(cmp(d1, d2), cmp(id(d1), id(d2))) + vereq(d1, d1) + verify(d1 != d2) + verify(not d1 != d1) + verify(not d1 == d2) + # Note that the module name appears in str/repr, and that varies + # depending on whether this test is run standalone or from a framework. + verify(str(d1).find('D object at ') >= 0) + vereq(str(d1), repr(d1)) + verify(-1 not in d1) + for i in range(10): + verify(i in d1) + verify(10 not in d1) + # Test overridden behavior for static classes + class Proxy(object): + def __init__(self, x): + self.x = x + def __nonzero__(self): + return not not self.x + def __hash__(self): + return hash(self.x) + def __eq__(self, other): + return self.x == other + def __ne__(self, other): + return self.x != other + def __cmp__(self, other): + return cmp(self.x, other.x) + def __str__(self): + return "Proxy:%s" % self.x + def __repr__(self): + return "Proxy(%r)" % self.x + def __contains__(self, value): + return value in self.x + p0 = Proxy(0) + p1 = Proxy(1) + p_1 = Proxy(-1) + verify(not p0) + verify(not not p1) + vereq(hash(p0), hash(0)) + vereq(p0, p0) + verify(p0 != p1) + verify(not p0 != p0) + vereq(not p0, p1) + vereq(cmp(p0, p1), -1) + vereq(cmp(p0, p0), 0) + vereq(cmp(p0, p_1), 1) + vereq(str(p0), "Proxy:0") + vereq(repr(p0), "Proxy(0)") + p10 = Proxy(range(10)) + verify(-1 not in p10) + for i in range(10): + verify(i in p10) + verify(10 not in p10) + # Test overridden behavior for dynamic classes + class DProxy(object): + def __init__(self, x): + self.x = x + def __nonzero__(self): + return not not self.x + def __hash__(self): + return hash(self.x) + def __eq__(self, other): + return self.x == other + def __ne__(self, other): + return self.x != other + def __cmp__(self, other): + return cmp(self.x, other.x) + def __str__(self): + return "DProxy:%s" % self.x + def __repr__(self): + return "DProxy(%r)" % self.x + def __contains__(self, value): + return value in self.x + p0 = DProxy(0) + p1 = DProxy(1) + p_1 = DProxy(-1) + verify(not p0) + verify(not not p1) + vereq(hash(p0), hash(0)) + vereq(p0, p0) + verify(p0 != p1) + verify(not p0 != p0) + vereq(not p0, p1) + vereq(cmp(p0, p1), -1) + vereq(cmp(p0, p0), 0) + vereq(cmp(p0, p_1), 1) + vereq(str(p0), "DProxy:0") + vereq(repr(p0), "DProxy(0)") + p10 = DProxy(range(10)) + verify(-1 not in p10) + for i in range(10): + verify(i in p10) + verify(10 not in p10) + # Safety test for __cmp__ + def unsafecmp(a, b): + try: + a.__class__.__cmp__(a, b) + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % ( + a.__class__, a, b) + unsafecmp(u"123", "123") + unsafecmp("123", u"123") + unsafecmp(1, 1.0) + unsafecmp(1.0, 1) + unsafecmp(1, 1L) + unsafecmp(1L, 1) + + class Letter(str): + def __new__(cls, letter): + if letter == 'EPS': + return str.__new__(cls) + return str.__new__(cls, letter) + def __str__(self): + if not self: + return 'EPS' + return self + + # sys.stdout needs to be the original to trigger the recursion bug + import sys + test_stdout = sys.stdout + sys.stdout = get_original_stdout() + try: + # nothing should actually be printed, this should raise an exception + print Letter('w') + except RuntimeError: + pass + else: + raise TestFailed, "expected a RuntimeError for print recursion" + sys.stdout = test_stdout + +def weakrefs(): + if verbose: print "Testing weak references..." + import weakref + class C(object): + pass + c = C() + r = weakref.ref(c) + verify(r() is c) + del c + verify(r() is None) + del r + class NoWeak(object): + __slots__ = ['foo'] + no = NoWeak() + try: + weakref.ref(no) + except TypeError, msg: + verify(str(msg).find("weak reference") >= 0) + else: + verify(0, "weakref.ref(no) should be illegal") + class Weak(object): + __slots__ = ['foo', '__weakref__'] + yes = Weak() + r = weakref.ref(yes) + verify(r() is yes) + del yes + verify(r() is None) + del r + +def properties(): + if verbose: print "Testing property..." + class C(object): + def getx(self): + return self.__x + def setx(self, value): + self.__x = value + def delx(self): + del self.__x + x = property(getx, setx, delx, doc="I'm the x property.") + a = C() + verify(not hasattr(a, "x")) + a.x = 42 + vereq(a._C__x, 42) + vereq(a.x, 42) + del a.x + verify(not hasattr(a, "x")) + verify(not hasattr(a, "_C__x")) + C.x.__set__(a, 100) + vereq(C.x.__get__(a), 100) + C.x.__delete__(a) + verify(not hasattr(a, "x")) + + raw = C.__dict__['x'] + verify(isinstance(raw, property)) + + attrs = dir(raw) + verify("__doc__" in attrs) + verify("fget" in attrs) + verify("fset" in attrs) + verify("fdel" in attrs) + + vereq(raw.__doc__, "I'm the x property.") + verify(raw.fget is C.__dict__['getx']) + verify(raw.fset is C.__dict__['setx']) + verify(raw.fdel is C.__dict__['delx']) + + for attr in "__doc__", "fget", "fset", "fdel": + try: + setattr(raw, attr, 42) + except TypeError, msg: + if str(msg).find('readonly') < 0: + raise TestFailed("when setting readonly attr %r on a " + "property, got unexpected TypeError " + "msg %r" % (attr, str(msg))) + else: + raise TestFailed("expected TypeError from trying to set " + "readonly %r attr on a property" % attr) + + class D(object): + __getitem__ = property(lambda s: 1/0) + + d = D() + try: + for i in d: + str(i) + except ZeroDivisionError: + pass + else: + raise TestFailed, "expected ZeroDivisionError from bad property" + +def supers(): + if verbose: print "Testing super..." + + class A(object): + def meth(self, a): + return "A(%r)" % a + + vereq(A().meth(1), "A(1)") + + class B(A): + def __init__(self): + self.__super = super(B, self) + def meth(self, a): + return "B(%r)" % a + self.__super.meth(a) + + vereq(B().meth(2), "B(2)A(2)") + + class C(A): + def meth(self, a): + return "C(%r)" % a + self.__super.meth(a) + C._C__super = super(C) + + vereq(C().meth(3), "C(3)A(3)") + + class D(C, B): + def meth(self, a): + return "D(%r)" % a + super(D, self).meth(a) + + vereq(D().meth(4), "D(4)C(4)B(4)A(4)") + + # Test for subclassing super + + class mysuper(super): + def __init__(self, *args): + return super(mysuper, self).__init__(*args) + + class E(D): + def meth(self, a): + return "E(%r)" % a + mysuper(E, self).meth(a) + + vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") + + class F(E): + def meth(self, a): + s = self.__super + return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) + F._F__super = mysuper(F) + + vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") + + # Make sure certain errors are raised + + try: + super(D, 42) + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow super(D, 42)" + + try: + super(D, C()) + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow super(D, C())" + + try: + super(D).__get__(12) + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow super(D).__get__(12)" + + try: + super(D).__get__(C()) + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow super(D).__get__(C())" + +def inherits(): + if verbose: print "Testing inheritance from basic types..." + + class hexint(int): + def __repr__(self): + return hex(self) + def __add__(self, other): + return hexint(int.__add__(self, other)) + # (Note that overriding __radd__ doesn't work, + # because the int type gets first dibs.) + vereq(repr(hexint(7) + 9), "0x10") + vereq(repr(hexint(1000) + 7), "0x3ef") + a = hexint(12345) + vereq(a, 12345) + vereq(int(a), 12345) + verify(int(a).__class__ is int) + vereq(hash(a), hash(12345)) + verify((+a).__class__ is int) + verify((a >> 0).__class__ is int) + verify((a << 0).__class__ is int) + verify((hexint(0) << 12).__class__ is int) + verify((hexint(0) >> 12).__class__ is int) + + class octlong(long): + __slots__ = [] + def __str__(self): + s = oct(self) + if s[-1] == 'L': + s = s[:-1] + return s + def __add__(self, other): + return self.__class__(super(octlong, self).__add__(other)) + __radd__ = __add__ + vereq(str(octlong(3) + 5), "010") + # (Note that overriding __radd__ here only seems to work + # because the example uses a short int left argument.) + vereq(str(5 + octlong(3000)), "05675") + a = octlong(12345) + vereq(a, 12345L) + vereq(long(a), 12345L) + vereq(hash(a), hash(12345L)) + verify(long(a).__class__ is long) + verify((+a).__class__ is long) + verify((-a).__class__ is long) + verify((-octlong(0)).__class__ is long) + verify((a >> 0).__class__ is long) + verify((a << 0).__class__ is long) + verify((a - 0).__class__ is long) + verify((a * 1).__class__ is long) + verify((a ** 1).__class__ is long) + verify((a // 1).__class__ is long) + verify((1 * a).__class__ is long) + verify((a | 0).__class__ is long) + verify((a ^ 0).__class__ is long) + verify((a & -1L).__class__ is long) + verify((octlong(0) << 12).__class__ is long) + verify((octlong(0) >> 12).__class__ is long) + verify(abs(octlong(0)).__class__ is long) + + # Because octlong overrides __add__, we can't check the absence of +0 + # optimizations using octlong. + class longclone(long): + pass + a = longclone(1) + verify((a + 0).__class__ is long) + verify((0 + a).__class__ is long) + + # Check that negative clones don't segfault + a = longclone(-1) + vereq(a.__dict__, {}) + vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit + + class precfloat(float): + __slots__ = ['prec'] + def __init__(self, value=0.0, prec=12): + self.prec = int(prec) + float.__init__(value) + def __repr__(self): + return "%.*g" % (self.prec, self) + vereq(repr(precfloat(1.1)), "1.1") + a = precfloat(12345) + vereq(a, 12345.0) + vereq(float(a), 12345.0) + verify(float(a).__class__ is float) + vereq(hash(a), hash(12345.0)) + verify((+a).__class__ is float) + + class madcomplex(complex): + def __repr__(self): + return "%.17gj%+.17g" % (self.imag, self.real) + a = madcomplex(-3, 4) + vereq(repr(a), "4j-3") + base = complex(-3, 4) + veris(base.__class__, complex) + vereq(a, base) + vereq(complex(a), base) + veris(complex(a).__class__, complex) + a = madcomplex(a) # just trying another form of the constructor + vereq(repr(a), "4j-3") + vereq(a, base) + vereq(complex(a), base) + veris(complex(a).__class__, complex) + vereq(hash(a), hash(base)) + veris((+a).__class__, complex) + veris((a + 0).__class__, complex) + vereq(a + 0, base) + veris((a - 0).__class__, complex) + vereq(a - 0, base) + veris((a * 1).__class__, complex) + vereq(a * 1, base) + veris((a / 1).__class__, complex) + vereq(a / 1, base) + + class madtuple(tuple): + _rev = None + def rev(self): + if self._rev is not None: + return self._rev + L = list(self) + L.reverse() + self._rev = self.__class__(L) + return self._rev + a = madtuple((1,2,3,4,5,6,7,8,9,0)) + vereq(a, (1,2,3,4,5,6,7,8,9,0)) + vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1))) + vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0))) + for i in range(512): + t = madtuple(range(i)) + u = t.rev() + v = u.rev() + vereq(v, t) + a = madtuple((1,2,3,4,5)) + vereq(tuple(a), (1,2,3,4,5)) + verify(tuple(a).__class__ is tuple) + vereq(hash(a), hash((1,2,3,4,5))) + verify(a[:].__class__ is tuple) + verify((a * 1).__class__ is tuple) + verify((a * 0).__class__ is tuple) + verify((a + ()).__class__ is tuple) + a = madtuple(()) + vereq(tuple(a), ()) + verify(tuple(a).__class__ is tuple) + verify((a + a).__class__ is tuple) + verify((a * 0).__class__ is tuple) + verify((a * 1).__class__ is tuple) + verify((a * 2).__class__ is tuple) + verify(a[:].__class__ is tuple) + + class madstring(str): + _rev = None + def rev(self): + if self._rev is not None: + return self._rev + L = list(self) + L.reverse() + self._rev = self.__class__("".join(L)) + return self._rev + s = madstring("abcdefghijklmnopqrstuvwxyz") + vereq(s, "abcdefghijklmnopqrstuvwxyz") + vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba")) + vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz")) + for i in range(256): + s = madstring("".join(map(chr, range(i)))) + t = s.rev() + u = t.rev() + vereq(u, s) + s = madstring("12345") + vereq(str(s), "12345") + verify(str(s).__class__ is str) + + base = "\x00" * 5 + s = madstring(base) + vereq(s, base) + vereq(str(s), base) + verify(str(s).__class__ is str) + vereq(hash(s), hash(base)) + vereq({s: 1}[base], 1) + vereq({base: 1}[s], 1) + verify((s + "").__class__ is str) + vereq(s + "", base) + verify(("" + s).__class__ is str) + vereq("" + s, base) + verify((s * 0).__class__ is str) + vereq(s * 0, "") + verify((s * 1).__class__ is str) + vereq(s * 1, base) + verify((s * 2).__class__ is str) + vereq(s * 2, base + base) + verify(s[:].__class__ is str) + vereq(s[:], base) + verify(s[0:0].__class__ is str) + vereq(s[0:0], "") + verify(s.strip().__class__ is str) + vereq(s.strip(), base) + verify(s.lstrip().__class__ is str) + vereq(s.lstrip(), base) + verify(s.rstrip().__class__ is str) + vereq(s.rstrip(), base) + identitytab = ''.join([chr(i) for i in range(256)]) + verify(s.translate(identitytab).__class__ is str) + vereq(s.translate(identitytab), base) + verify(s.translate(identitytab, "x").__class__ is str) + vereq(s.translate(identitytab, "x"), base) + vereq(s.translate(identitytab, "\x00"), "") + verify(s.replace("x", "x").__class__ is str) + vereq(s.replace("x", "x"), base) + verify(s.ljust(len(s)).__class__ is str) + vereq(s.ljust(len(s)), base) + verify(s.rjust(len(s)).__class__ is str) + vereq(s.rjust(len(s)), base) + verify(s.center(len(s)).__class__ is str) + vereq(s.center(len(s)), base) + verify(s.lower().__class__ is str) + vereq(s.lower(), base) + + s = madstring("x y") + vereq(s, "x y") + verify(intern(s).__class__ is str) + verify(intern(s) is intern("x y")) + vereq(intern(s), "x y") + + i = intern("y x") + s = madstring("y x") + vereq(s, i) + verify(intern(s).__class__ is str) + verify(intern(s) is i) + + s = madstring(i) + verify(intern(s).__class__ is str) + verify(intern(s) is i) + + class madunicode(unicode): + _rev = None + def rev(self): + if self._rev is not None: + return self._rev + L = list(self) + L.reverse() + self._rev = self.__class__(u"".join(L)) + return self._rev + u = madunicode("ABCDEF") + vereq(u, u"ABCDEF") + vereq(u.rev(), madunicode(u"FEDCBA")) + vereq(u.rev().rev(), madunicode(u"ABCDEF")) + base = u"12345" + u = madunicode(base) + vereq(unicode(u), base) + verify(unicode(u).__class__ is unicode) + vereq(hash(u), hash(base)) + vereq({u: 1}[base], 1) + vereq({base: 1}[u], 1) + verify(u.strip().__class__ is unicode) + vereq(u.strip(), base) + verify(u.lstrip().__class__ is unicode) + vereq(u.lstrip(), base) + verify(u.rstrip().__class__ is unicode) + vereq(u.rstrip(), base) + verify(u.replace(u"x", u"x").__class__ is unicode) + vereq(u.replace(u"x", u"x"), base) + verify(u.replace(u"xy", u"xy").__class__ is unicode) + vereq(u.replace(u"xy", u"xy"), base) + verify(u.center(len(u)).__class__ is unicode) + vereq(u.center(len(u)), base) + verify(u.ljust(len(u)).__class__ is unicode) + vereq(u.ljust(len(u)), base) + verify(u.rjust(len(u)).__class__ is unicode) + vereq(u.rjust(len(u)), base) + verify(u.lower().__class__ is unicode) + vereq(u.lower(), base) + verify(u.upper().__class__ is unicode) + vereq(u.upper(), base) + verify(u.capitalize().__class__ is unicode) + vereq(u.capitalize(), base) + verify(u.title().__class__ is unicode) + vereq(u.title(), base) + verify((u + u"").__class__ is unicode) + vereq(u + u"", base) + verify((u"" + u).__class__ is unicode) + vereq(u"" + u, base) + verify((u * 0).__class__ is unicode) + vereq(u * 0, u"") + verify((u * 1).__class__ is unicode) + vereq(u * 1, base) + verify((u * 2).__class__ is unicode) + vereq(u * 2, base + base) + verify(u[:].__class__ is unicode) + vereq(u[:], base) + verify(u[0:0].__class__ is unicode) + vereq(u[0:0], u"") + + class sublist(list): + pass + a = sublist(range(5)) + vereq(a, range(5)) + a.append("hello") + vereq(a, range(5) + ["hello"]) + a[5] = 5 + vereq(a, range(6)) + a.extend(range(6, 20)) + vereq(a, range(20)) + a[-5:] = [] + vereq(a, range(15)) + del a[10:15] + vereq(len(a), 10) + vereq(a, range(10)) + vereq(list(a), range(10)) + vereq(a[0], 0) + vereq(a[9], 9) + vereq(a[-10], 0) + vereq(a[-1], 9) + vereq(a[:5], range(5)) + + class CountedInput(file): + """Counts lines read by self.readline(). + + self.lineno is the 0-based ordinal of the last line read, up to + a maximum of one greater than the number of lines in the file. + + self.ateof is true if and only if the final "" line has been read, + at which point self.lineno stops incrementing, and further calls + to readline() continue to return "". + """ + + lineno = 0 + ateof = 0 + def readline(self): + if self.ateof: + return "" + s = file.readline(self) + # Next line works too. + # s = super(CountedInput, self).readline() + self.lineno += 1 + if s == "": + self.ateof = 1 + return s + + f = file(name=TESTFN, mode='w') + lines = ['a\n', 'b\n', 'c\n'] + try: + f.writelines(lines) + f.close() + f = CountedInput(TESTFN) + for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]): + got = f.readline() + vereq(expected, got) + vereq(f.lineno, i) + vereq(f.ateof, (i > len(lines))) + f.close() + finally: + try: + f.close() + except: + pass + try: + import os + os.unlink(TESTFN) + except: + pass + +def keywords(): + if verbose: + print "Testing keyword args to basic type constructors ..." + vereq(int(x=1), 1) + vereq(float(x=2), 2.0) + vereq(long(x=3), 3L) + vereq(complex(imag=42, real=666), complex(666, 42)) + vereq(str(object=500), '500') + vereq(unicode(string='abc', errors='strict'), u'abc') + vereq(tuple(sequence=range(3)), (0, 1, 2)) + vereq(list(sequence=(0, 1, 2)), range(3)) + vereq(dict(items={1: 2}), {1: 2}) + + for constructor in (int, float, long, complex, str, unicode, + tuple, list, dict, file): + try: + constructor(bogus_keyword_arg=1) + except TypeError: + pass + else: + raise TestFailed("expected TypeError from bogus keyword " + "argument to %r" % constructor) + +def restricted(): + # XXX This test is disabled because rexec is not deemed safe + return + import rexec + if verbose: + print "Testing interaction with restricted execution ..." + + sandbox = rexec.RExec() + + code1 = """f = open(%r, 'w')""" % TESTFN + code2 = """f = file(%r, 'w')""" % TESTFN + code3 = """\ +f = open(%r) +t = type(f) # a sneaky way to get the file() constructor +f.close() +f = t(%r, 'w') # rexec can't catch this by itself +""" % (TESTFN, TESTFN) + + f = open(TESTFN, 'w') # Create the file so code3 can find it. + f.close() + + try: + for code in code1, code2, code3: + try: + sandbox.r_exec(code) + except IOError, msg: + if str(msg).find("restricted") >= 0: + outcome = "OK" + else: + outcome = "got an exception, but not an expected one" + else: + outcome = "expected a restricted-execution exception" + + if outcome != "OK": + raise TestFailed("%s, in %r" % (outcome, code)) + + finally: + try: + import os + os.unlink(TESTFN) + except: + pass + +def str_subclass_as_dict_key(): + if verbose: + print "Testing a str subclass used as dict key .." + + class cistr(str): + """Sublcass of str that computes __eq__ case-insensitively. + + Also computes a hash code of the string in canonical form. + """ + + def __init__(self, value): + self.canonical = value.lower() + self.hashcode = hash(self.canonical) + + def __eq__(self, other): + if not isinstance(other, cistr): + other = cistr(other) + return self.canonical == other.canonical + + def __hash__(self): + return self.hashcode + + vereq(cistr('ABC'), 'abc') + vereq('aBc', cistr('ABC')) + vereq(str(cistr('ABC')), 'ABC') + + d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3} + vereq(d[cistr('one')], 1) + vereq(d[cistr('tWo')], 2) + vereq(d[cistr('THrEE')], 3) + verify(cistr('ONe') in d) + vereq(d.get(cistr('thrEE')), 3) + +def classic_comparisons(): + if verbose: print "Testing classic comparisons..." + class classic: + pass + for base in (classic, int, object): + if verbose: print " (base = %s)" % base + class C(base): + def __init__(self, value): + self.value = int(value) + def __cmp__(self, other): + if isinstance(other, C): + return cmp(self.value, other.value) + if isinstance(other, int) or isinstance(other, long): + return cmp(self.value, other) + return NotImplemented + c1 = C(1) + c2 = C(2) + c3 = C(3) + vereq(c1, 1) + c = {1: c1, 2: c2, 3: c3} + for x in 1, 2, 3: + for y in 1, 2, 3: + verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) + for op in "<", "<=", "==", "!=", ">", ">=": + verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), + "x=%d, y=%d" % (x, y)) + verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y)) + verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) + +def rich_comparisons(): + if verbose: + print "Testing rich comparisons..." + class Z(complex): + pass + z = Z(1) + vereq(z, 1+0j) + vereq(1+0j, z) + class ZZ(complex): + def __eq__(self, other): + try: + return abs(self - other) <= 1e-6 + except: + return NotImplemented + zz = ZZ(1.0000003) + vereq(zz, 1+0j) + vereq(1+0j, zz) + + class classic: + pass + for base in (classic, int, object, list): + if verbose: print " (base = %s)" % base + class C(base): + def __init__(self, value): + self.value = int(value) + def __cmp__(self, other): + raise TestFailed, "shouldn't call __cmp__" + def __eq__(self, other): + if isinstance(other, C): + return self.value == other.value + if isinstance(other, int) or isinstance(other, long): + return self.value == other + return NotImplemented + def __ne__(self, other): + if isinstance(other, C): + return self.value != other.value + if isinstance(other, int) or isinstance(other, long): + return self.value != other + return NotImplemented + def __lt__(self, other): + if isinstance(other, C): + return self.value < other.value + if isinstance(other, int) or isinstance(other, long): + return self.value < other + return NotImplemented + def __le__(self, other): + if isinstance(other, C): + return self.value <= other.value + if isinstance(other, int) or isinstance(other, long): + return self.value <= other + return NotImplemented + def __gt__(self, other): + if isinstance(other, C): + return self.value > other.value + if isinstance(other, int) or isinstance(other, long): + return self.value > other + return NotImplemented + def __ge__(self, other): + if isinstance(other, C): + return self.value >= other.value + if isinstance(other, int) or isinstance(other, long): + return self.value >= other + return NotImplemented + c1 = C(1) + c2 = C(2) + c3 = C(3) + vereq(c1, 1) + c = {1: c1, 2: c2, 3: c3} + for x in 1, 2, 3: + for y in 1, 2, 3: + for op in "<", "<=", "==", "!=", ">", ">=": + verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), + "x=%d, y=%d" % (x, y)) + verify(eval("c[x] %s y" % op) == eval("x %s y" % op), + "x=%d, y=%d" % (x, y)) + verify(eval("x %s c[y]" % op) == eval("x %s y" % op), + "x=%d, y=%d" % (x, y)) + +def coercions(): + if verbose: print "Testing coercions..." + class I(int): pass + coerce(I(0), 0) + coerce(0, I(0)) + class L(long): pass + coerce(L(0), 0) + coerce(L(0), 0L) + coerce(0, L(0)) + coerce(0L, L(0)) + class F(float): pass + coerce(F(0), 0) + coerce(F(0), 0L) + coerce(F(0), 0.) + coerce(0, F(0)) + coerce(0L, F(0)) + coerce(0., F(0)) + class C(complex): pass + coerce(C(0), 0) + coerce(C(0), 0L) + coerce(C(0), 0.) + coerce(C(0), 0j) + coerce(0, C(0)) + coerce(0L, C(0)) + coerce(0., C(0)) + coerce(0j, C(0)) + +def descrdoc(): + if verbose: print "Testing descriptor doc strings..." + def check(descr, what): + vereq(descr.__doc__, what) + check(file.closed, "flag set if the file is closed") # getset descriptor + check(file.name, "file name") # member descriptor + +def setclass(): + if verbose: print "Testing __class__ assignment..." + class C(object): pass + class D(object): pass + class E(object): pass + class F(D, E): pass + for cls in C, D, E, F: + for cls2 in C, D, E, F: + x = cls() + x.__class__ = cls2 + verify(x.__class__ is cls2) + x.__class__ = cls + verify(x.__class__ is cls) + def cant(x, C): + try: + x.__class__ = C + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C) + try: + delattr(x, "__class__") + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow del %r.__class__" % x + cant(C(), list) + cant(list(), C) + cant(C(), 1) + cant(C(), object) + cant(object(), list) + cant(list(), object) + o = object() + cant(o, type(1)) + cant(o, type(None)) + del o + +def setdict(): + if verbose: print "Testing __dict__ assignment..." + class C(object): pass + a = C() + a.__dict__ = {'b': 1} + vereq(a.b, 1) + def cant(x, dict): + try: + x.__dict__ = dict + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict) + cant(a, None) + cant(a, []) + cant(a, 1) + del a.__dict__ # Deleting __dict__ is allowed + # Classes don't allow __dict__ assignment + cant(C, {}) + +def pickles(): + if verbose: + print "Testing pickling and copying new-style classes and objects..." + import pickle, cPickle + + def sorteditems(d): + L = d.items() + L.sort() + return L + + global C + class C(object): + def __init__(self, a, b): + super(C, self).__init__() + self.a = a + self.b = b + def __repr__(self): + return "C(%r, %r)" % (self.a, self.b) + + global C1 + class C1(list): + def __new__(cls, a, b): + return super(C1, cls).__new__(cls) + def __init__(self, a, b): + self.a = a + self.b = b + def __repr__(self): + return "C1(%r, %r)<%r>" % (self.a, self.b, list(self)) + + global C2 + class C2(int): + def __new__(cls, a, b, val=0): + return super(C2, cls).__new__(cls, val) + def __init__(self, a, b, val=0): + self.a = a + self.b = b + def __repr__(self): + return "C2(%r, %r)<%r>" % (self.a, self.b, int(self)) + + global C3 + class C3(object): + def __init__(self, foo): + self.foo = foo + def __getstate__(self): + return self.foo + def __setstate__(self, foo): + self.foo = foo + + global C4classic, C4 + class C4classic: # classic + pass + class C4(C4classic, object): # mixed inheritance + pass + + for p in pickle, cPickle: + for bin in 0, 1: + if verbose: + print p.__name__, ["text", "binary"][bin] + + for cls in C, C1, C2: + s = p.dumps(cls, bin) + cls2 = p.loads(s) + verify(cls2 is cls) + + a = C1(1, 2); a.append(42); a.append(24) + b = C2("hello", "world", 42) + s = p.dumps((a, b), bin) + x, y = p.loads(s) + vereq(x.__class__, a.__class__) + vereq(sorteditems(x.__dict__), sorteditems(a.__dict__)) + vereq(y.__class__, b.__class__) + vereq(sorteditems(y.__dict__), sorteditems(b.__dict__)) + vereq(`x`, `a`) + vereq(`y`, `b`) + if verbose: + print "a = x =", a + print "b = y =", b + # Test for __getstate__ and __setstate__ on new style class + u = C3(42) + s = p.dumps(u, bin) + v = p.loads(s) + veris(u.__class__, v.__class__) + vereq(u.foo, v.foo) + # Test for picklability of hybrid class + u = C4() + u.foo = 42 + s = p.dumps(u, bin) + v = p.loads(s) + veris(u.__class__, v.__class__) + vereq(u.foo, v.foo) + + # Testing copy.deepcopy() + if verbose: + print "deepcopy" + import copy + for cls in C, C1, C2: + cls2 = copy.deepcopy(cls) + verify(cls2 is cls) + + a = C1(1, 2); a.append(42); a.append(24) + b = C2("hello", "world", 42) + x, y = copy.deepcopy((a, b)) + vereq(x.__class__, a.__class__) + vereq(sorteditems(x.__dict__), sorteditems(a.__dict__)) + vereq(y.__class__, b.__class__) + vereq(sorteditems(y.__dict__), sorteditems(b.__dict__)) + vereq(`x`, `a`) + vereq(`y`, `b`) + if verbose: + print "a = x =", a + print "b = y =", b + +def pickleslots(): + if verbose: print "Testing pickling of classes with __slots__ ..." + import pickle, cPickle + # Pickling of classes with __slots__ but without __getstate__ should fail + global B, C, D, E + class B(object): + pass + for base in [object, B]: + class C(base): + __slots__ = ['a'] + class D(C): + pass + try: + pickle.dumps(C()) + except TypeError: + pass + else: + raise TestFailed, "should fail: pickle C instance - %s" % base + try: + cPickle.dumps(C()) + except TypeError: + pass + else: + raise TestFailed, "should fail: cPickle C instance - %s" % base + try: + pickle.dumps(C()) + except TypeError: + pass + else: + raise TestFailed, "should fail: pickle D instance - %s" % base + try: + cPickle.dumps(D()) + except TypeError: + pass + else: + raise TestFailed, "should fail: cPickle D instance - %s" % base + # Give C a __getstate__ and __setstate__ + class C(base): + __slots__ = ['a'] + def __getstate__(self): + try: + d = self.__dict__.copy() + except AttributeError: + d = {} + try: + d['a'] = self.a + except AttributeError: + pass + return d + def __setstate__(self, d): + for k, v in d.items(): + setattr(self, k, v) + class D(C): + pass + # Now it should work + x = C() + y = pickle.loads(pickle.dumps(x)) + vereq(hasattr(y, 'a'), 0) + y = cPickle.loads(cPickle.dumps(x)) + vereq(hasattr(y, 'a'), 0) + x.a = 42 + y = pickle.loads(pickle.dumps(x)) + vereq(y.a, 42) + y = cPickle.loads(cPickle.dumps(x)) + vereq(y.a, 42) + x = D() + x.a = 42 + x.b = 100 + y = pickle.loads(pickle.dumps(x)) + vereq(y.a + y.b, 142) + y = cPickle.loads(cPickle.dumps(x)) + vereq(y.a + y.b, 142) + # But a subclass that adds a slot should not work + class E(C): + __slots__ = ['b'] + try: + pickle.dumps(E()) + except TypeError: + pass + else: + raise TestFailed, "should fail: pickle E instance - %s" % base + try: + cPickle.dumps(E()) + except TypeError: + pass + else: + raise TestFailed, "should fail: cPickle E instance - %s" % base + +def copies(): + if verbose: print "Testing copy.copy() and copy.deepcopy()..." + import copy + class C(object): + pass + + a = C() + a.foo = 12 + b = copy.copy(a) + vereq(b.__dict__, a.__dict__) + + a.bar = [1,2,3] + c = copy.copy(a) + vereq(c.bar, a.bar) + verify(c.bar is a.bar) + + d = copy.deepcopy(a) + vereq(d.__dict__, a.__dict__) + a.bar.append(4) + vereq(d.bar, [1,2,3]) + +def binopoverride(): + if verbose: print "Testing overrides of binary operations..." + class I(int): + def __repr__(self): + return "I(%r)" % int(self) + def __add__(self, other): + return I(int(self) + int(other)) + __radd__ = __add__ + def __pow__(self, other, mod=None): + if mod is None: + return I(pow(int(self), int(other))) + else: + return I(pow(int(self), int(other), int(mod))) + def __rpow__(self, other, mod=None): + if mod is None: + return I(pow(int(other), int(self), mod)) + else: + return I(pow(int(other), int(self), int(mod))) + + vereq(`I(1) + I(2)`, "I(3)") + vereq(`I(1) + 2`, "I(3)") + vereq(`1 + I(2)`, "I(3)") + vereq(`I(2) ** I(3)`, "I(8)") + vereq(`2 ** I(3)`, "I(8)") + vereq(`I(2) ** 3`, "I(8)") + vereq(`pow(I(2), I(3), I(5))`, "I(3)") + class S(str): + def __eq__(self, other): + return self.lower() == other.lower() + +def subclasspropagation(): + if verbose: print "Testing propagation of slot functions to subclasses..." + class A(object): + pass + class B(A): + pass + class C(A): + pass + class D(B, C): + pass + d = D() + vereq(hash(d), id(d)) + A.__hash__ = lambda self: 42 + vereq(hash(d), 42) + C.__hash__ = lambda self: 314 + vereq(hash(d), 314) + B.__hash__ = lambda self: 144 + vereq(hash(d), 144) + D.__hash__ = lambda self: 100 + vereq(hash(d), 100) + del D.__hash__ + vereq(hash(d), 144) + del B.__hash__ + vereq(hash(d), 314) + del C.__hash__ + vereq(hash(d), 42) + del A.__hash__ + vereq(hash(d), id(d)) + d.foo = 42 + d.bar = 42 + vereq(d.foo, 42) + vereq(d.bar, 42) + def __getattribute__(self, name): + if name == "foo": + return 24 + return object.__getattribute__(self, name) + A.__getattribute__ = __getattribute__ + vereq(d.foo, 24) + vereq(d.bar, 42) + def __getattr__(self, name): + if name in ("spam", "foo", "bar"): + return "hello" + raise AttributeError, name + B.__getattr__ = __getattr__ + vereq(d.spam, "hello") + vereq(d.foo, 24) + vereq(d.bar, 42) + del A.__getattribute__ + vereq(d.foo, 42) + del d.foo + vereq(d.foo, "hello") + vereq(d.bar, 42) + del B.__getattr__ + try: + d.foo + except AttributeError: + pass + else: + raise TestFailed, "d.foo should be undefined now" + + # Test a nasty bug in recurse_down_subclasses() + import gc + class A(object): + pass + class B(A): + pass + del B + gc.collect() + A.__setitem__ = lambda *a: None # crash + +def buffer_inherit(): + import binascii + # SF bug [#470040] ParseTuple t# vs subclasses. + if verbose: + print "Testing that buffer interface is inherited ..." + + class MyStr(str): + pass + base = 'abc' + m = MyStr(base) + # b2a_hex uses the buffer interface to get its argument's value, via + # PyArg_ParseTuple 't#' code. + vereq(binascii.b2a_hex(m), binascii.b2a_hex(base)) + + # It's not clear that unicode will continue to support the character + # buffer interface, and this test will fail if that's taken away. + class MyUni(unicode): + pass + base = u'abc' + m = MyUni(base) + vereq(binascii.b2a_hex(m), binascii.b2a_hex(base)) + + class MyInt(int): + pass + m = MyInt(42) + try: + binascii.b2a_hex(m) + raise TestFailed('subclass of int should not have a buffer interface') + except TypeError: + pass + +def str_of_str_subclass(): + import binascii + import cStringIO + + if verbose: + print "Testing __str__ defined in subclass of str ..." + + class octetstring(str): + def __str__(self): + return binascii.b2a_hex(self) + def __repr__(self): + return self + " repr" + + o = octetstring('A') + vereq(type(o), octetstring) + vereq(type(str(o)), str) + vereq(type(repr(o)), str) + vereq(ord(o), 0x41) + vereq(str(o), '41') + vereq(repr(o), 'A repr') + vereq(o.__str__(), '41') + vereq(o.__repr__(), 'A repr') + + capture = cStringIO.StringIO() + # Calling str() or not exercises different internal paths. + print >> capture, o + print >> capture, str(o) + vereq(capture.getvalue(), '41\n41\n') + capture.close() + +def kwdargs(): + if verbose: print "Testing keyword arguments to __init__, __call__..." + def f(a): return a + vereq(f.__call__(a=42), 42) + a = [] + list.__init__(a, sequence=[0, 1, 2]) + vereq(a, [0, 1, 2]) + +def delhook(): + if verbose: print "Testing __del__ hook..." + log = [] + class C(object): + def __del__(self): + log.append(1) + c = C() + vereq(log, []) + del c + vereq(log, [1]) + + class D(object): pass + d = D() + try: del d[0] + except TypeError: pass + else: raise TestFailed, "invalid del() didn't raise TypeError" + +def hashinherit(): + if verbose: print "Testing hash of mutable subclasses..." + + class mydict(dict): + pass + d = mydict() + try: + hash(d) + except TypeError: + pass + else: + raise TestFailed, "hash() of dict subclass should fail" + + class mylist(list): + pass + d = mylist() + try: + hash(d) + except TypeError: + pass + else: + raise TestFailed, "hash() of list subclass should fail" + +def strops(): + try: 'a' + 5 + except TypeError: pass + else: raise TestFailed, "'' + 5 doesn't raise TypeError" + + try: ''.split('') + except ValueError: pass + else: raise TestFailed, "''.split('') doesn't raise ValueError" + + try: ''.join([0]) + except TypeError: pass + else: raise TestFailed, "''.join([0]) doesn't raise TypeError" + + try: ''.rindex('5') + except ValueError: pass + else: raise TestFailed, "''.rindex('5') doesn't raise ValueError" + + try: ''.replace('', '') + except ValueError: pass + else: raise TestFailed, "''.replace('', '') doesn't raise ValueError" + + try: '%(n)s' % None + except TypeError: pass + else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError" + + try: '%(n' % {} + except ValueError: pass + else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError" + + try: '%*s' % ('abc') + except TypeError: pass + else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError" + + try: '%*.*s' % ('abc', 5) + except TypeError: pass + else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError" + + try: '%s' % (1, 2) + except TypeError: pass + else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError" + + try: '%' % None + except ValueError: pass + else: raise TestFailed, "'%' % None doesn't raise ValueError" + + vereq('534253'.isdigit(), 1) + vereq('534253x'.isdigit(), 0) + vereq('%c' % 5, '\x05') + vereq('%c' % '5', '5') + +def deepcopyrecursive(): + if verbose: print "Testing deepcopy of recursive objects..." + class Node: + pass + a = Node() + b = Node() + a.b = b + b.a = a + z = deepcopy(a) # This blew up before + +def modules(): + if verbose: print "Testing uninitialized module objects..." + from types import ModuleType as M + m = M.__new__(M) + str(m) + vereq(hasattr(m, "__name__"), 0) + vereq(hasattr(m, "__file__"), 0) + vereq(hasattr(m, "foo"), 0) + vereq(m.__dict__, None) + m.foo = 1 + vereq(m.__dict__, {"foo": 1}) + +def docdescriptor(): + # SF bug 542984 + if verbose: print "Testing __doc__ descriptor..." + class DocDescr(object): + def __get__(self, object, otype): + if object: + object = object.__class__.__name__ + ' instance' + if otype: + otype = otype.__name__ + return 'object=%s; type=%s' % (object, otype) + class OldClass: + __doc__ = DocDescr() + class NewClass(object): + __doc__ = DocDescr() + vereq(OldClass.__doc__, 'object=None; type=OldClass') + vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass') + vereq(NewClass.__doc__, 'object=None; type=NewClass') + vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass') + +def imulbug(): + # SF bug 544647 + if verbose: print "Testing for __imul__ problems..." + class C(object): + def __imul__(self, other): + return (self, other) + x = C() + y = x + y *= 1.0 + vereq(y, (x, 1.0)) + y = x + y *= 2 + vereq(y, (x, 2)) + y = x + y *= 3L + vereq(y, (x, 3L)) + y = x + y *= 1L<<100 + vereq(y, (x, 1L<<100)) + y = x + y *= None + vereq(y, (x, None)) + y = x + y *= "foo" + vereq(y, (x, "foo")) + +def copy_setstate(): + if verbose: + print "Testing that copy.*copy() correctly uses __setstate__..." + import copy + class C(object): + def __init__(self, foo=None): + self.foo = foo + self.__foo = foo + def setfoo(self, foo=None): + self.foo = foo + def getfoo(self): + return self.__foo + def __getstate__(self): + return [self.foo] + def __setstate__(self, lst): + assert len(lst) == 1 + self.__foo = self.foo = lst[0] + a = C(42) + a.setfoo(24) + vereq(a.foo, 24) + vereq(a.getfoo(), 42) + b = copy.copy(a) + vereq(b.foo, 24) + vereq(b.getfoo(), 24) + b = copy.deepcopy(a) + vereq(b.foo, 24) + vereq(b.getfoo(), 24) + +def subtype_resurrection(): + if verbose: + print "Testing resurrection of new-style instance..." + + class C(object): + container = [] + + def __del__(self): + # resurrect the instance + C.container.append(self) + + c = C() + c.attr = 42 + # The most interesting thing here is whether this blows up, due to flawed + # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug). + del c + + # If that didn't blow up, it's also interesting to see whether clearing + # the last container slot works: that will attempt to delete c again, + # which will cause c to get appended back to the container again "during" + # the del. + del C.container[-1] + vereq(len(C.container), 1) + vereq(C.container[-1].attr, 42) + + # Make c mortal again, so that the test framework with -l doesn't report + # it as a leak. + del C.__del__ + +def funnynew(): + if verbose: print "Testing __new__ returning something unexpected..." + class C(object): + def __new__(cls, arg): + if isinstance(arg, str): return [1, 2, 3] + elif isinstance(arg, int): return object.__new__(D) + else: return object.__new__(cls) + class D(C): + def __init__(self, arg): + self.foo = arg + vereq(C("1"), [1, 2, 3]) + vereq(D("1"), [1, 2, 3]) + d = D(None) + veris(d.foo, None) + d = C(1) + vereq(isinstance(d, D), True) + vereq(d.foo, 1) + d = D(1) + vereq(isinstance(d, D), True) + vereq(d.foo, 1) + +def subclass_right_op(): + if verbose: + print "Testing correct dispatch of subclass overloading __r__..." + + # This code tests various cases where right-dispatch of a subclass + # should be preferred over left-dispatch of a base class. + + # Case 1: subclass of int; this tests code in abstract.c::binary_op1() + + class B(int): + def __div__(self, other): + return "B.__div__" + def __rdiv__(self, other): + return "B.__rdiv__" + + vereq(B(1) / 1, "B.__div__") + vereq(1 / B(1), "B.__rdiv__") + + # Case 2: subclass of object; this is just the baseline for case 3 + + class C(object): + def __div__(self, other): + return "C.__div__" + def __rdiv__(self, other): + return "C.__rdiv__" + + vereq(C(1) / 1, "C.__div__") + vereq(1 / C(1), "C.__rdiv__") + + # Case 3: subclass of new-style class; here it gets interesting + + class D(C): + def __div__(self, other): + return "D.__div__" + def __rdiv__(self, other): + return "D.__rdiv__" + + vereq(D(1) / C(1), "D.__div__") + vereq(C(1) / D(1), "D.__rdiv__") + + # Case 4: this didn't work right in 2.2.2 and 2.3a1 + + class E(C): + pass + + vereq(E.__rdiv__, C.__rdiv__) + + vereq(E(1) / 1, "C.__div__") + vereq(1 / E(1), "C.__rdiv__") + vereq(E(1) / C(1), "C.__div__") + vereq(C(1) / E(1), "C.__div__") # This one would fail + +def dict_type_with_metaclass(): + if verbose: + print "Testing type of __dict__ when __metaclass__ set..." + + class B(object): + pass + class M(type): + pass + class C: + # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy + __metaclass__ = M + veris(type(C.__dict__), type(B.__dict__)) + +def weakref_segfault(): + # SF 742911 + if verbose: + print "Testing weakref segfault..." + + import weakref + + class Provoker: + def __init__(self, referrent): + self.ref = weakref.ref(referrent) + + def __del__(self): + x = self.ref() + + class Oops(object): + pass + + o = Oops() + o.whatever = Provoker(o) + del o + + +def crash_in_get_sf736892(): + def func(): + pass + + try: + f = func.__get__(None) + except TypeError: + pass + else: + # should not get here + f(1) # crash + + +def test_main(): + weakref_segfault() # Must be first, somehow + class_docstrings() + lists() + dicts() + dict_constructor() + test_dir() + ints() + longs() + floats() + complexes() + spamlists() + spamdicts() + pydicts() + pylists() + metaclass() + pymods() + multi() + diamond() + objects() + slots() + dynamics() + errors() + classmethods() + staticmethods() + classic() + compattr() + newslot() + altmro() + overloading() + methods() + specials() + weakrefs() + properties() + supers() + inherits() + keywords() + restricted() + str_subclass_as_dict_key() + classic_comparisons() + rich_comparisons() + coercions() + descrdoc() + setclass() + setdict() + pickles() + copies() + binopoverride() + subclasspropagation() + buffer_inherit() + str_of_str_subclass() + kwdargs() + delhook() + hashinherit() + strops() + deepcopyrecursive() + modules() + pickleslots() + docdescriptor() + imulbug() + copy_setstate() + subtype_resurrection() + funnynew() + subclass_right_op() + dict_type_with_metaclass() + crash_in_get_sf736892() + + if verbose: print "All OK" + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_descrtut.py b/lib-python/2.2/test/test_descrtut.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_descrtut.py @@ -0,0 +1,501 @@ +# This contains most of the executable examples from Guido's descr +# tutorial, once at +# +# http://www.python.org/2.2/descrintro.html +# +# A few examples left implicit in the writeup were fleshed out, a few were +# skipped due to lack of interest (e.g., faking super() by hand isn't +# of much interest anymore), and a few were fiddled to make the output +# deterministic. + +from test_support import sortdict +import pprint + +class defaultdict(dict): + def __init__(self, default=None): + dict.__init__(self) + self.default = default + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.default + + def get(self, key, *args): + if not args: + args = (self.default,) + return dict.get(self, key, *args) + + def merge(self, other): + for key in other: + if key not in self: + self[key] = other[key] + +test_1 = """ + +Here's the new type at work: + + >>> print defaultdict # show our type + + >>> print type(defaultdict) # its metatype + + >>> a = defaultdict(default=0.0) # create an instance + >>> print a # show the instance + {} + >>> print type(a) # show its type + + >>> print a.__class__ # show its class + + >>> print type(a) is a.__class__ # its type is its class + 1 + >>> a[1] = 3.25 # modify the instance + >>> print a # show the new value + {1: 3.25} + >>> print a[1] # show the new item + 3.25 + >>> print a[0] # a non-existant item + 0.0 + >>> a.merge({1:100, 2:200}) # use a dict method + >>> print sortdict(a) # show the result + {1: 3.25, 2: 200} + >>> + +We can also use the new type in contexts where classic only allows "real" +dictionaries, such as the locals/globals dictionaries for the exec +statement or the built-in function eval(): + + >>> def sorted(seq): + ... seq.sort() + ... return seq + >>> print sorted(a.keys()) + [1, 2] + >>> exec "x = 3; print x" in a + 3 + >>> print sorted(a.keys()) + [1, 2, '__builtins__', 'x'] + >>> print a['x'] + 3 + >>> + +However, our __getitem__() method is not used for variable access by the +interpreter: + + >>> exec "print foo" in a + Traceback (most recent call last): + File "", line 1, in ? + File "", line 1, in ? + NameError: name 'foo' is not defined + >>> + +Now I'll show that defaultdict instances have dynamic instance variables, +just like classic classes: + + >>> a.default = -1 + >>> print a["noway"] + -1 + >>> a.default = -1000 + >>> print a["noway"] + -1000 + >>> 'default' in dir(a) + 1 + >>> a.x1 = 100 + >>> a.x2 = 200 + >>> print a.x1 + 100 + >>> d = dir(a) + >>> 'default' in d and 'x1' in d and 'x2' in d + 1 + >>> print a.__dict__ + {'default': -1000, 'x2': 200, 'x1': 100} + >>> +""" + +class defaultdict2(dict): + __slots__ = ['default'] + + def __init__(self, default=None): + dict.__init__(self) + self.default = default + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.default + + def get(self, key, *args): + if not args: + args = (self.default,) + return dict.get(self, key, *args) + + def merge(self, other): + for key in other: + if key not in self: + self[key] = other[key] + +test_2 = """ + +The __slots__ declaration takes a list of instance variables, and reserves +space for exactly these in the instance. When __slots__ is used, other +instance variables cannot be assigned to: + + >>> a = defaultdict2(default=0.0) + >>> a[1] + 0.0 + >>> a.default = -1 + >>> a[1] + -1 + >>> a.x1 = 1 + Traceback (most recent call last): + File "", line 1, in ? + AttributeError: 'defaultdict2' object has no attribute 'x1' + >>> + +""" + +test_3 = """ + +Introspecting instances of built-in types + +For instance of built-in types, x.__class__ is now the same as type(x): + + >>> type([]) + + >>> [].__class__ + + >>> list + + >>> isinstance([], list) + 1 + >>> isinstance([], dict) + 0 + >>> isinstance([], object) + 1 + >>> + +Under the new proposal, the __methods__ attribute no longer exists: + + >>> [].__methods__ + Traceback (most recent call last): + File "", line 1, in ? + AttributeError: 'list' object has no attribute '__methods__' + >>> + +Instead, you can get the same information from the list type: + + >>> pprint.pprint(dir(list)) # like list.__dict__.keys(), but sorted + ['__add__', + '__class__', + '__contains__', + '__delattr__', + '__delitem__', + '__delslice__', + '__doc__', + '__eq__', + '__ge__', + '__getattribute__', + '__getitem__', + '__getslice__', + '__gt__', + '__hash__', + '__iadd__', + '__imul__', + '__init__', + '__le__', + '__len__', + '__lt__', + '__mul__', + '__ne__', + '__new__', + '__reduce__', + '__repr__', + '__rmul__', + '__setattr__', + '__setitem__', + '__setslice__', + '__str__', + 'append', + 'count', + 'extend', + 'index', + 'insert', + 'pop', + 'remove', + 'reverse', + 'sort'] + +The new introspection API gives more information than the old one: in +addition to the regular methods, it also shows the methods that are +normally invoked through special notations, e.g. __iadd__ (+=), __len__ +(len), __ne__ (!=). You can invoke any method from this list directly: + + >>> a = ['tic', 'tac'] + >>> list.__len__(a) # same as len(a) + 2 + >>> a.__len__() # ditto + 2 + >>> list.append(a, 'toe') # same as a.append('toe') + >>> a + ['tic', 'tac', 'toe'] + >>> + +This is just like it is for user-defined classes. +""" + +test_4 = """ + +Static methods and class methods + +The new introspection API makes it possible to add static methods and class +methods. Static methods are easy to describe: they behave pretty much like +static methods in C++ or Java. Here's an example: + + >>> class C: + ... + ... def foo(x, y): + ... print "staticmethod", x, y + ... foo = staticmethod(foo) + + >>> C.foo(1, 2) + staticmethod 1 2 + >>> c = C() + >>> c.foo(1, 2) + staticmethod 1 2 + +Class methods use a similar pattern to declare methods that receive an +implicit first argument that is the *class* for which they are invoked. + + >>> class C: + ... def foo(cls, y): + ... print "classmethod", cls, y + ... foo = classmethod(foo) + + >>> C.foo(1) + classmethod test.test_descrtut.C 1 + >>> c = C() + >>> c.foo(1) + classmethod test.test_descrtut.C 1 + + >>> class D(C): + ... pass + + >>> D.foo(1) + classmethod test.test_descrtut.D 1 + >>> d = D() + >>> d.foo(1) + classmethod test.test_descrtut.D 1 + +This prints "classmethod __main__.D 1" both times; in other words, the +class passed as the first argument of foo() is the class involved in the +call, not the class involved in the definition of foo(). + +But notice this: + + >>> class E(C): + ... def foo(cls, y): # override C.foo + ... print "E.foo() called" + ... C.foo(y) + ... foo = classmethod(foo) + + >>> E.foo(1) + E.foo() called + classmethod test.test_descrtut.C 1 + >>> e = E() + >>> e.foo(1) + E.foo() called + classmethod test.test_descrtut.C 1 + +In this example, the call to C.foo() from E.foo() will see class C as its +first argument, not class E. This is to be expected, since the call +specifies the class C. But it stresses the difference between these class +methods and methods defined in metaclasses (where an upcall to a metamethod +would pass the target class as an explicit first argument). +""" + +test_5 = """ + +Attributes defined by get/set methods + + + >>> class property(object): + ... + ... def __init__(self, get, set=None): + ... self.__get = get + ... self.__set = set + ... + ... def __get__(self, inst, type=None): + ... return self.__get(inst) + ... + ... def __set__(self, inst, value): + ... if self.__set is None: + ... raise AttributeError, "this attribute is read-only" + ... return self.__set(inst, value) + +Now let's define a class with an attribute x defined by a pair of methods, +getx() and and setx(): + + >>> class C(object): + ... + ... def __init__(self): + ... self.__x = 0 + ... + ... def getx(self): + ... return self.__x + ... + ... def setx(self, x): + ... if x < 0: x = 0 + ... self.__x = x + ... + ... x = property(getx, setx) + +Here's a small demonstration: + + >>> a = C() + >>> a.x = 10 + >>> print a.x + 10 + >>> a.x = -10 + >>> print a.x + 0 + >>> + +Hmm -- property is builtin now, so let's try it that way too. + + >>> del property # unmask the builtin + >>> property + + + >>> class C(object): + ... def __init__(self): + ... self.__x = 0 + ... def getx(self): + ... return self.__x + ... def setx(self, x): + ... if x < 0: x = 0 + ... self.__x = x + ... x = property(getx, setx) + + + >>> a = C() + >>> a.x = 10 + >>> print a.x + 10 + >>> a.x = -10 + >>> print a.x + 0 + >>> +""" + +test_6 = """ + +Method resolution order + +This example is implicit in the writeup. + +>>> class A: # classic class +... def save(self): +... print "called A.save()" +>>> class B(A): +... pass +>>> class C(A): +... def save(self): +... print "called C.save()" +>>> class D(B, C): +... pass + +>>> D().save() +called A.save() + +>>> class A(object): # new class +... def save(self): +... print "called A.save()" +>>> class B(A): +... pass +>>> class C(A): +... def save(self): +... print "called C.save()" +>>> class D(B, C): +... pass + +>>> D().save() +called C.save() +""" + +class A(object): + def m(self): + return "A" + +class B(A): + def m(self): + return "B" + super(B, self).m() + +class C(A): + def m(self): + return "C" + super(C, self).m() + +class D(C, B): + def m(self): + return "D" + super(D, self).m() + + +test_7 = """ + +Cooperative methods and "super" + +>>> print D().m() # "DCBA" +DCBA +""" + +test_8 = """ + +Backwards incompatibilities + +>>> class A: +... def foo(self): +... print "called A.foo()" + +>>> class B(A): +... pass + +>>> class C(A): +... def foo(self): +... B.foo(self) + +>>> C().foo() +Traceback (most recent call last): + ... +TypeError: unbound method foo() must be called with B instance as first argument (got C instance instead) + +>>> class C(A): +... def foo(self): +... A.foo(self) +>>> C().foo() +called A.foo() +""" + +__test__ = {"tut1": test_1, + "tut2": test_2, + "tut3": test_3, + "tut4": test_4, + "tut5": test_5, + "tut6": test_6, + "tut7": test_7, + "tut8": test_8} + +# Magic test name that regrtest.py invokes *after* importing this module. +# This worms around a bootstrap problem. +# Note that doctest and regrtest both look in sys.argv for a "-v" argument, +# so this works as expected in both ways of running regrtest. +def test_main(verbose=None): + # Obscure: import this module as test.test_descrtut instead of as + # plain test_descrtut because the name of this module works its way + # into the doctest examples, and unless the full test.test_descrtut + # business is used the name can change depending on how the test is + # invoked. + import test_support, test.test_descrtut + test_support.run_doctest(test.test_descrtut, verbose) + +# This part isn't needed for regrtest, but for running the test directly. +if __name__ == "__main__": + test_main(1) diff --git a/lib-python/2.2/test/test_difflib.py b/lib-python/2.2/test/test_difflib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_difflib.py @@ -0,0 +1,2 @@ +import difflib, test_support +test_support.run_doctest(difflib) diff --git a/lib-python/2.2/test/test_dircache.py b/lib-python/2.2/test/test_dircache.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_dircache.py @@ -0,0 +1,74 @@ +""" + Test cases for the dircache module + Nick Mathewson +""" + +import unittest +from test_support import run_unittest, TESTFN +import dircache, os, time, sys + + +class DircacheTests(unittest.TestCase): + def setUp(self): + self.tempdir = TESTFN+"_dir" + os.mkdir(self.tempdir) + + def tearDown(self): + for fname in os.listdir(self.tempdir): + self.delTemp(fname) + os.rmdir(self.tempdir) + + def writeTemp(self, fname): + f = open(os.path.join(self.tempdir, fname), 'w') + f.close() + + def mkdirTemp(self, fname): + os.mkdir(os.path.join(self.tempdir, fname)) + + def delTemp(self, fname): + fname = os.path.join(self.tempdir, fname) + if os.path.isdir(fname): + os.rmdir(fname) + else: + os.unlink(fname) + + def test_listdir(self): + ## SUCCESSFUL CASES + entries = dircache.listdir(self.tempdir) + self.assertEquals(entries, []) + + # Check that cache is actually caching, not just passing through. + self.assert_(dircache.listdir(self.tempdir) is entries) + + # Directories aren't "files" on Windows, and directory mtime has + # nothing to do with when files under a directory get created. + # That is, this test can't possibly work under Windows -- dircache + # is only good for capturing a one-shot snapshot there. + + if sys.platform[:3] not in ('win', 'os2'): + # Sadly, dircache has the same granularity as stat.mtime, and so + # can't notice any changes that occured within 1 sec of the last + # time it examined a directory. + time.sleep(1) + self.writeTemp("test1") + entries = dircache.listdir(self.tempdir) + self.assertEquals(entries, ['test1']) + self.assert_(dircache.listdir(self.tempdir) is entries) + + ## UNSUCCESSFUL CASES + self.assertEquals(dircache.listdir(self.tempdir+"_nonexistent"), []) + + def test_annotate(self): + self.writeTemp("test2") + self.mkdirTemp("A") + lst = ['A', 'test2', 'test_nonexistent'] + dircache.annotate(self.tempdir, lst) + self.assertEquals(lst, ['A/', 'test2', 'test_nonexistent']) + + +def test_main(): + run_unittest(DircacheTests) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_dl.py b/lib-python/2.2/test/test_dl.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_dl.py @@ -0,0 +1,33 @@ +#! /usr/bin/env python +"""Test dlmodule.c + Roger E. Masse revised strategy by Barry Warsaw +""" + +import dl +from test_support import verbose,TestSkipped + +sharedlibs = [ + ('/usr/lib/libc.so', 'getpid'), + ('/lib/libc.so.6', 'getpid'), + ('/usr/bin/cygwin1.dll', 'getpid'), + ] + +for s, func in sharedlibs: + try: + if verbose: + print 'trying to open:', s, + l = dl.open(s) + except dl.error, err: + if verbose: + print 'failed', repr(str(err)) + pass + else: + if verbose: + print 'succeeded...', + l.call(func) + l.close() + if verbose: + print 'worked!' + break +else: + raise TestSkipped, 'Could not open any shared libraries' diff --git a/lib-python/2.2/test/test_doctest.py b/lib-python/2.2/test/test_doctest.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_doctest.py @@ -0,0 +1,2 @@ +import doctest, test_support +test_support.run_doctest(doctest) diff --git a/lib-python/2.2/test/test_doctest2.py b/lib-python/2.2/test/test_doctest2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_doctest2.py @@ -0,0 +1,108 @@ +"""A module to test whether doctest recognizes some 2.2 features, +like static and class methods. + +>>> print 'yup' # 1 +yup +""" + +import test_support + +class C(object): + """Class C. + + >>> print C() # 2 + 42 + """ + + def __init__(self): + """C.__init__. + + >>> print C() # 3 + 42 + """ + + def __str__(self): + """ + >>> print C() # 4 + 42 + """ + return "42" + + class D(object): + """A nested D class. + + >>> print "In D!" # 5 + In D! + """ + + def nested(self): + """ + >>> print 3 # 6 + 3 + """ + + def getx(self): + """ + >>> c = C() # 7 + >>> c.x = 12 # 8 + >>> print c.x # 9 + -12 + """ + return -self._x + + def setx(self, value): + """ + >>> c = C() # 10 + >>> c.x = 12 # 11 + >>> print c.x # 12 + -12 + """ + self._x = value + + x = property(getx, setx, doc="""\ + >>> c = C() # 13 + >>> c.x = 12 # 14 + >>> print c.x # 15 + -12 + """) + + def statm(): + """ + A static method. + + >>> print C.statm() # 16 + 666 + >>> print C().statm() # 17 + 666 + """ + return 666 + + statm = staticmethod(statm) + + def clsm(cls, val): + """ + A class method. + + >>> print C.clsm(22) # 18 + 22 + >>> print C().clsm(23) # 19 + 23 + """ + return val + + clsm = classmethod(clsm) + +def test_main(): + import test_doctest2 + EXPECTED = 19 + f, t = test_support.run_doctest(test_doctest2) + if t != EXPECTED: + raise test_support.TestFailed("expected %d tests to run, not %d" % + (EXPECTED, t)) + +# Pollute the namespace with a bunch of imported functions and classes, +# to make sure they don't get tested. +from doctest import * + +if __name__ == '__main__': + test_main() diff --git a/lib-python/2.2/test/test_dospath.py b/lib-python/2.2/test/test_dospath.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_dospath.py @@ -0,0 +1,61 @@ +import dospath +import test_support +import unittest + + +class DOSPathTestCase(unittest.TestCase): + + def test_abspath(self): + self.assert_(dospath.abspath("C:\\") == "C:\\") + + def test_isabs(self): + isabs = dospath.isabs + self.assert_(isabs("c:\\")) + self.assert_(isabs("\\\\conky\\mountpoint\\")) + self.assert_(isabs("\\foo")) + self.assert_(isabs("\\foo\\bar")) + self.failIf(isabs("foo")) + self.failIf(isabs("foo\\")) + self.failIf(isabs("foo\\bar")) + self.failIf(isabs("c:foo")) + self.failIf(isabs("c:foo\\")) + self.failIf(isabs("c:foo\\bar")) + + def test_commonprefix(self): + commonprefix = dospath.commonprefix + self.assert_(commonprefix(["/home/swenson/spam", "/home/swen/spam"]) + == "/home/swen") + self.assert_(commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"]) + == "\\home\\swen\\") + self.assert_(commonprefix(["/home/swen/spam", "/home/swen/spam"]) + == "/home/swen/spam") + + def test_split(self): + split = dospath.split + self.assertEquals(split("c:\\foo\\bar"), + ('c:\\foo', 'bar')) + self.assertEquals(split("\\\\conky\\mountpoint\\foo\\bar"), + ('\\\\conky\\mountpoint\\foo', 'bar')) + + self.assertEquals(split("c:\\"), ('c:\\', '')) + self.assertEquals(split("\\\\conky\\mountpoint\\"), + ('\\\\conky\\mountpoint', '')) + + self.assertEquals(split("c:/"), ('c:/', '')) + self.assertEquals(split("//conky/mountpoint/"), + ('//conky/mountpoint', '')) + + def test_splitdrive(self): + splitdrive = dospath.splitdrive + self.assertEquals(splitdrive("c:\\foo\\bar"), ('c:', '\\foo\\bar')) + self.assertEquals(splitdrive("c:/foo/bar"), ('c:', '/foo/bar')) + self.assertEquals(splitdrive("foo\\bar"), ('', 'foo\\bar')) + self.assertEquals(splitdrive("c:"), ('c:', '')) + + +def test_main(): + test_support.run_unittest(DOSPathTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_dumbdbm.py b/lib-python/2.2/test/test_dumbdbm.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_dumbdbm.py @@ -0,0 +1,79 @@ +#! /usr/bin/env python +"""Test script for the dumbdbm module + Original by Roger E. Masse +""" + +import os +import test_support +import unittest +import dumbdbm +import tempfile + +_fname = tempfile.mktemp() + +def _delete_files(): + for ext in [".dir", ".dat", ".bak"]: + try: + os.unlink(_fname + ext) + except OSError: + pass + +class DumbDBMTestCase(unittest.TestCase): + _dict = {'0': '', + 'a': 'Python:', + 'b': 'Programming', + 'c': 'the', + 'd': 'way', + 'f': 'Guido', + 'g': 'intended' + } + + def __init__(self, *args): + unittest.TestCase.__init__(self, *args) + self._dkeys = self._dict.keys() + self._dkeys.sort() + + def test_dumbdbm_creation(self): + _delete_files() + f = dumbdbm.open(_fname, 'c') + self.assertEqual(f.keys(), []) + for key in self._dict: + f[key] = self._dict[key] + self.read_helper(f) + f.close() + + def test_dumbdbm_modification(self): + f = dumbdbm.open(_fname, 'w') + self._dict['g'] = f['g'] = "indented" + self.read_helper(f) + f.close() + + def test_dumbdbm_read(self): + f = dumbdbm.open(_fname, 'r') + self.read_helper(f) + f.close() + + def test_dumbdbm_keys(self): + f = dumbdbm.open(_fname) + keys = self.keys_helper(f) + f.close() + + def read_helper(self, f): + keys = self.keys_helper(f) + for key in self._dict: + self.assertEqual(self._dict[key], f[key]) + + def keys_helper(self, f): + keys = f.keys() + keys.sort() + self.assertEqual(keys, self._dkeys) + return keys + +def test_main(): + try: + test_support.run_unittest(DumbDBMTestCase) + finally: + _delete_files() + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_email.py b/lib-python/2.2/test/test_email.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_email.py @@ -0,0 +1,13 @@ +# Copyright (C) 2001,2002 Python Software Foundation +# email package unit tests + +import unittest +# The specific tests now live in Lib/email/test +from email.test.test_email import suite +from test_support import run_suite + +def test_main(): + run_suite(suite()) + +if __name__ == '__main__': + test_main() diff --git a/lib-python/2.2/test/test_email_codecs.py b/lib-python/2.2/test/test_email_codecs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_email_codecs.py @@ -0,0 +1,11 @@ +# Copyright (C) 2002 Python Software Foundation +# email package unit tests for (optional) Asian codecs + +import unittest +# The specific tests now live in Lib/email/test +from email.test.test_email_codecs import suite + + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') diff --git a/lib-python/2.2/test/test_errno.py b/lib-python/2.2/test/test_errno.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_errno.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +"""Test the errno module + Roger E. Masse +""" + +import errno +from test_support import verbose + +errors = ['E2BIG', 'EACCES', 'EADDRINUSE', 'EADDRNOTAVAIL', 'EADV', + 'EAFNOSUPPORT', 'EAGAIN', 'EALREADY', 'EBADE', 'EBADF', + 'EBADFD', 'EBADMSG', 'EBADR', 'EBADRQC', 'EBADSLT', + 'EBFONT', 'EBUSY', 'ECHILD', 'ECHRNG', 'ECOMM', + 'ECONNABORTED', 'ECONNREFUSED', 'ECONNRESET', + 'EDEADLK', 'EDEADLOCK', 'EDESTADDRREQ', 'EDOM', + 'EDQUOT', 'EEXIST', 'EFAULT', 'EFBIG', 'EHOSTDOWN', + 'EHOSTUNREACH', 'EIDRM', 'EILSEQ', 'EINPROGRESS', + 'EINTR', 'EINVAL', 'EIO', 'EISCONN', 'EISDIR', + 'EL2HLT', 'EL2NSYNC', 'EL3HLT', 'EL3RST', 'ELIBACC', + 'ELIBBAD', 'ELIBEXEC', 'ELIBMAX', 'ELIBSCN', 'ELNRNG', + 'ELOOP', 'EMFILE', 'EMLINK', 'EMSGSIZE', 'EMULTIHOP', + 'ENAMETOOLONG', 'ENETDOWN', 'ENETRESET', 'ENETUNREACH', + 'ENFILE', 'ENOANO', 'ENOBUFS', 'ENOCSI', 'ENODATA', + 'ENODEV', 'ENOENT', 'ENOEXEC', 'ENOLCK', 'ENOLINK', + 'ENOMEM', 'ENOMSG', 'ENONET', 'ENOPKG', 'ENOPROTOOPT', + 'ENOSPC', 'ENOSR', 'ENOSTR', 'ENOSYS', 'ENOTBLK', + 'ENOTCONN', 'ENOTDIR', 'ENOTEMPTY', 'ENOTOBACCO', 'ENOTSOCK', + 'ENOTTY', 'ENOTUNIQ', 'ENXIO', 'EOPNOTSUPP', + 'EOVERFLOW', 'EPERM', 'EPFNOSUPPORT', 'EPIPE', + 'EPROTO', 'EPROTONOSUPPORT', 'EPROTOTYPE', + 'ERANGE', 'EREMCHG', 'EREMOTE', 'ERESTART', + 'EROFS', 'ESHUTDOWN', 'ESOCKTNOSUPPORT', 'ESPIPE', + 'ESRCH', 'ESRMNT', 'ESTALE', 'ESTRPIPE', 'ETIME', + 'ETIMEDOUT', 'ETOOMANYREFS', 'ETXTBSY', 'EUNATCH', + 'EUSERS', 'EWOULDBLOCK', 'EXDEV', 'EXFULL'] + +# +# This is is a wee bit bogus since the module only conditionally adds +# errno constants if they have been defined by errno.h However, this +# test seems to work on SGI, Sparc & intel Solaris, and linux. +# +for error in errors: + try: + a = getattr(errno, error) + except AttributeError: + if verbose: + print '%s: not found' % error + else: + if verbose: + print '%s: %d' % (error, a) diff --git a/lib-python/2.2/test/test_exceptions.py b/lib-python/2.2/test/test_exceptions.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_exceptions.py @@ -0,0 +1,206 @@ +# Python test set -- part 5, built-in exceptions + +from test_support import * +from types import ClassType +import warnings +import sys, traceback + +warnings.filterwarnings("error", "", OverflowWarning, __name__) + +print '5. Built-in exceptions' +# XXX This is not really enough, each *operation* should be tested! + +# Reloading the built-in exceptions module failed prior to Py2.2, while it +# should act the same as reloading built-in sys. +try: + import exceptions + reload(exceptions) +except ImportError, e: + raise TestFailed, e + +def test_raise_catch(exc): + try: + raise exc, "spam" + except exc, err: + buf = str(err) + try: + raise exc("spam") + except exc, err: + buf = str(err) + print buf + +def r(thing): + test_raise_catch(thing) + if isinstance(thing, ClassType): + print thing.__name__ + else: + print thing + +r(AttributeError) +import sys +try: x = sys.undefined_attribute +except AttributeError: pass + +r(EOFError) +import sys +fp = open(TESTFN, 'w') +fp.close() +fp = open(TESTFN, 'r') +savestdin = sys.stdin +try: + try: + sys.stdin = fp + x = raw_input() + except EOFError: + pass +finally: + sys.stdin = savestdin + fp.close() + +r(IOError) +try: open('this file does not exist', 'r') +except IOError: pass + +r(ImportError) +try: import undefined_module +except ImportError: pass + +r(IndexError) +x = [] +try: a = x[10] +except IndexError: pass + +r(KeyError) +x = {} +try: a = x['key'] +except KeyError: pass + +r(KeyboardInterrupt) +print '(not testable in a script)' + +r(MemoryError) +print '(not safe to test)' + +r(NameError) +try: x = undefined_variable +except NameError: pass + +r(OverflowError) +x = 1 +try: + while 1: x = x+x +except OverflowError: pass + +r(RuntimeError) +print '(not used any more?)' + +r(SyntaxError) +try: exec '/\n' +except SyntaxError: pass + +# make sure the right exception message is raised for each of these +# code fragments: + +def ckmsg(src, msg): + try: + compile(src, '', 'exec') + except SyntaxError, e: + print e.msg + if e.msg == msg: + print "ok" + else: + print "expected:", msg + else: + print "failed to get expected SyntaxError" + +s = '''\ +while 1: + try: + pass + finally: + continue +''' +if sys.platform.startswith('java'): + print "'continue' not supported inside 'finally' clause" + print "ok" +else: + ckmsg(s, "'continue' not supported inside 'finally' clause") +s = '''\ +try: + continue +except: + pass +''' +ckmsg(s, "'continue' not properly in loop") +ckmsg("continue\n", "'continue' not properly in loop") + +r(IndentationError) + +r(TabError) +# can only be tested under -tt, and is the only test for -tt +#try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '', 'exec') +#except TabError: pass +#else: raise TestFailed + +r(SystemError) +print '(hard to reproduce)' + +r(SystemExit) +import sys +try: sys.exit(0) +except SystemExit: pass + +r(TypeError) +try: [] + () +except TypeError: pass + +r(ValueError) +try: x = chr(10000) +except ValueError: pass + +r(ZeroDivisionError) +try: x = 1/0 +except ZeroDivisionError: pass + +r(Exception) +try: x = 1/0 +except Exception, e: pass + +# test that setting an exception at the C level works even if the +# exception object can't be constructed. + +class BadException: + def __init__(self): + raise RuntimeError, "can't instantiate BadException" + +def test_capi1(): + import _testcapi + try: + _testcapi.raise_exception(BadException, 1) + except TypeError, err: + exc, err, tb = sys.exc_info() + co = tb.tb_frame.f_code + assert co.co_name == "test_capi1" + assert co.co_filename.endswith('test_exceptions.py') + else: + print "Expected exception" + +def test_capi2(): + import _testcapi + try: + _testcapi.raise_exception(BadException, 0) + except RuntimeError, err: + exc, err, tb = sys.exc_info() + co = tb.tb_frame.f_code + assert co.co_name == "__init__" + assert co.co_filename.endswith('test_exceptions.py') + co2 = tb.tb_frame.f_back.f_code + assert co2.co_name == "test_capi2" + else: + print "Expected exception" + +if not sys.platform.startswith('java'): + test_capi1() + test_capi2() + +unlink(TESTFN) diff --git a/lib-python/2.2/test/test_extcall.py b/lib-python/2.2/test/test_extcall.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_extcall.py @@ -0,0 +1,268 @@ +from test_support import verify, verbose, TestFailed, sortdict +from UserList import UserList + +def f(*a, **k): + print a, sortdict(k) + +def g(x, *y, **z): + print x, y, sortdict(z) + +def h(j=1, a=2, h=3): + print j, a, h + +f() +f(1) +f(1, 2) +f(1, 2, 3) + +f(1, 2, 3, *(4, 5)) +f(1, 2, 3, *[4, 5]) +f(1, 2, 3, *UserList([4, 5])) +f(1, 2, 3, **{'a':4, 'b':5}) +f(1, 2, 3, *(4, 5), **{'a':6, 'b':7}) +f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b':9}) + +try: + g() +except TypeError, err: + print "TypeError:", err +else: + print "should raise TypeError: not enough arguments; expected 1, got 0" + +try: + g(*()) +except TypeError, err: + print "TypeError:", err +else: + print "should raise TypeError: not enough arguments; expected 1, got 0" + +try: + g(*(), **{}) +except TypeError, err: + print "TypeError:", err +else: + print "should raise TypeError: not enough arguments; expected 1, got 0" + +g(1) +g(1, 2) +g(1, 2, 3) +g(1, 2, 3, *(4, 5)) +class Nothing: pass +try: + g(*Nothing()) +except TypeError, attr: + pass +else: + print "should raise TypeError" + +class Nothing: + def __len__(self): + return 5 +try: + g(*Nothing()) +except TypeError, attr: + pass +else: + print "should raise TypeError" + +class Nothing: + def __len__(self): + return 5 + def __getitem__(self, i): + if i < 3: + return i + else: + raise IndexError, i +g(*Nothing()) + +class Nothing: + def __init__(self): + self.c = 0 + def __iter__(self): + return self +try: + g(*Nothing()) +except TypeError, attr: + pass +else: + print "should raise TypeError" + +class Nothing: + def __init__(self): + self.c = 0 + def __iter__(self): + return self + def next(self): + if self.c == 4: + raise StopIteration + c = self.c + self.c += 1 + return c +g(*Nothing()) + +# make sure the function call doesn't stomp on the dictionary? +d = {'a': 1, 'b': 2, 'c': 3} +d2 = d.copy() +verify(d == d2) +g(1, d=4, **d) +print sortdict(d) +print sortdict(d2) +verify(d == d2, "function call modified dictionary") + +# what about willful misconduct? +def saboteur(**kw): + kw['x'] = locals() # yields a cyclic kw + return kw +d = {} +kw = saboteur(a=1, **d) +verify(d == {}) +# break the cycle +del kw['x'] + +try: + g(1, 2, 3, **{'x':4, 'y':5}) +except TypeError, err: + print err +else: + print "should raise TypeError: keyword parameter redefined" + +try: + g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9}) +except TypeError, err: + print err +else: + print "should raise TypeError: keyword parameter redefined" + +try: + f(**{1:2}) +except TypeError, err: + print err +else: + print "should raise TypeError: keywords must be strings" + +try: + h(**{'e': 2}) +except TypeError, err: + print err +else: + print "should raise TypeError: unexpected keyword argument: e" + +try: + h(*h) +except TypeError, err: + print err +else: + print "should raise TypeError: * argument must be a tuple" + +try: + dir(*h) +except TypeError, err: + print err +else: + print "should raise TypeError: * argument must be a tuple" + +try: + None(*h) +except TypeError, err: + print err +else: + print "should raise TypeError: * argument must be a tuple" + +try: + h(**h) +except TypeError, err: + print err +else: + print "should raise TypeError: ** argument must be a dictionary" + +try: + dir(**h) +except TypeError, err: + print err +else: + print "should raise TypeError: ** argument must be a dictionary" + +try: + None(**h) +except TypeError, err: + print err +else: + print "should raise TypeError: ** argument must be a dictionary" + +try: + dir(b=1,**{'b':1}) +except TypeError, err: + print err +else: + print "should raise TypeError: dir() got multiple values for keyword argument 'b'" + +def f2(*a, **b): + return a, b + +d = {} +for i in range(512): + key = 'k%d' % i + d[key] = i +a, b = f2(1, *(2, 3), **d) +print len(a), len(b), b == d + +class Foo: + def method(self, arg1, arg2): + return arg1 + arg2 + +x = Foo() +print Foo.method(*(x, 1, 2)) +print Foo.method(x, *(1, 2)) +try: + print Foo.method(*(1, 2, 3)) +except TypeError, err: + pass +else: + print 'expected a TypeError for unbound method call' +try: + print Foo.method(1, *(2, 3)) +except TypeError, err: + pass +else: + print 'expected a TypeError for unbound method call' + +# A PyCFunction that takes only positional parameters should allow an +# empty keyword dictionary to pass without a complaint, but raise a +# TypeError if the dictionary is non-empty. +id(1, **{}) +try: + id(1, **{"foo": 1}) +except TypeError: + pass +else: + raise TestFailed, 'expected TypeError; no exception raised' + +a, b, d, e, v, k = 'A', 'B', 'D', 'E', 'V', 'K' +funcs = [] +maxargs = {} +for args in ['', 'a', 'ab']: + for defargs in ['', 'd', 'de']: + for vararg in ['', 'v']: + for kwarg in ['', 'k']: + name = 'z' + args + defargs + vararg + kwarg + arglist = list(args) + map( + lambda x: '%s="%s"' % (x, x), defargs) + if vararg: arglist.append('*' + vararg) + if kwarg: arglist.append('**' + kwarg) + decl = (('def %s(%s): print "ok %s", a, b, d, e, v, ' + + 'type(k) is type ("") and k or sortdict(k)') + % (name, ', '.join(arglist), name)) + exec(decl) + func = eval(name) + funcs.append(func) + maxargs[func] = len(args + defargs) + +for name in ['za', 'zade', 'zabk', 'zabdv', 'zabdevk']: + func = eval(name) + for args in [(), (1, 2), (1, 2, 3, 4, 5)]: + for kwargs in ['', 'a', 'd', 'ad', 'abde']: + kwdict = {} + for k in kwargs: kwdict[k] = k + k + print func.func_name, args, sortdict(kwdict), '->', + try: apply(func, args, kwdict) + except TypeError, err: print err diff --git a/lib-python/2.2/test/test_fcntl.py b/lib-python/2.2/test/test_fcntl.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_fcntl.py @@ -0,0 +1,53 @@ +#! /usr/bin/env python +"""Test program for the fcntl C module. + Roger E. Masse +""" +import struct +import fcntl +import os, sys +from test_support import verbose, TESTFN + +filename = TESTFN + +try: + os.O_LARGEFILE +except AttributeError: + start_len = "ll" +else: + start_len = "qq" + +if sys.platform in ('netbsd1', 'Darwin1.2', 'darwin', + 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5', + 'bsdos2', 'bsdos3', 'bsdos4', + 'openbsd', 'openbsd2', 'openbsd3'): + lockdata = struct.pack('lxxxxlxxxxlhh', 0, 0, 0, fcntl.F_WRLCK, 0) +elif sys.platform in ['aix3', 'aix4', 'hp-uxB', 'unixware7']: + lockdata = struct.pack('hhlllii', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) +else: + lockdata = struct.pack('hh'+start_len+'hh', fcntl.F_WRLCK, 0, 0, 0, 0, 0) +if verbose: + print 'struct.pack: ', `lockdata` + + +# the example from the library docs +f = open(filename, 'w') +rv = fcntl.fcntl(f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) +if verbose: + print 'Status from fnctl with O_NONBLOCK: ', rv + +rv = fcntl.fcntl(f.fileno(), fcntl.F_SETLKW, lockdata) +if verbose: + print 'String from fcntl with F_SETLKW: ', `rv` + +f.close() +os.unlink(filename) + + +# Again, but pass the file rather than numeric descriptor: +f = open(filename, 'w') +rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NONBLOCK) + +rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata) + +f.close() +os.unlink(filename) diff --git a/lib-python/2.2/test/test_file.py b/lib-python/2.2/test/test_file.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_file.py @@ -0,0 +1,63 @@ +import os + +from test_support import verify, TESTFN +from UserList import UserList + +# verify writelines with instance sequence +l = UserList(['1', '2']) +f = open(TESTFN, 'wb') +f.writelines(l) +f.close() +f = open(TESTFN, 'rb') +buf = f.read() +f.close() +verify(buf == '12') + +# verify writelines with integers +f = open(TESTFN, 'wb') +try: + f.writelines([1, 2, 3]) +except TypeError: + pass +else: + print "writelines accepted sequence of integers" +f.close() + +# verify writelines with integers in UserList +f = open(TESTFN, 'wb') +l = UserList([1,2,3]) +try: + f.writelines(l) +except TypeError: + pass +else: + print "writelines accepted sequence of integers" +f.close() + +# verify writelines with non-string object +class NonString: pass + +f = open(TESTFN, 'wb') +try: + f.writelines([NonString(), NonString()]) +except TypeError: + pass +else: + print "writelines accepted sequence of non-string objects" +f.close() + +# verify that we get a sensible error message for bad mode argument +bad_mode = "qwerty" +try: + open(TESTFN, bad_mode) +except IOError, msg: + if msg[0] != 0: + s = str(msg) + if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: + print "bad error message for invalid mode: %s" % s + # if msg[0] == 0, we're probably on Windows where there may be + # no obvious way to discover why open() failed. +else: + print "no error for invalid mode: %s" % bad_mode + +os.unlink(TESTFN) diff --git a/lib-python/2.2/test/test_fileinput.py b/lib-python/2.2/test/test_fileinput.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_fileinput.py @@ -0,0 +1,159 @@ +''' +Tests for fileinput module. +Nick Mathewson +''' + +from test_support import verify, verbose, TESTFN +import sys, os, re +from StringIO import StringIO +from fileinput import FileInput + +# The fileinput module has 2 interfaces: the FileInput class which does +# all the work, and a few functions (input, etc.) that use a global _state +# variable. We only test the FileInput class, since the other functions +# only provide a thin facade over FileInput. + +# Write lines (a list of lines) to temp file number i, and return the +# temp file's name. +def writeTmp(i, lines): + name = TESTFN + str(i) + f = open(name, 'w') + f.writelines(lines) + f.close() + return name + +pat = re.compile(r'LINE (\d+) OF FILE (\d+)') + +def remove_tempfiles(*names): + for name in names: + try: + os.unlink(name) + except: + pass + +def runTests(t1, t2, t3, t4, bs=0, round=0): + start = 1 + round*6 + if verbose: + print '%s. Simple iteration (bs=%s)' % (start+0, bs) + fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + lines = list(fi) + fi.close() + verify(len(lines) == 31) + verify(lines[4] == 'Line 5 of file 1\n') + verify(lines[30] == 'Line 1 of file 4\n') + verify(fi.lineno() == 31) + verify(fi.filename() == t4) + + if verbose: + print '%s. Status variables (bs=%s)' % (start+1, bs) + fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + s = "x" + while s and s != 'Line 6 of file 2\n': + s = fi.readline() + verify(fi.filename() == t2) + verify(fi.lineno() == 21) + verify(fi.filelineno() == 6) + verify(not fi.isfirstline()) + verify(not fi.isstdin()) + + if verbose: + print '%s. Nextfile (bs=%s)' % (start+2, bs) + fi.nextfile() + verify(fi.readline() == 'Line 1 of file 3\n') + verify(fi.lineno() == 22) + fi.close() + + if verbose: + print '%s. Stdin (bs=%s)' % (start+3, bs) + fi = FileInput(files=(t1, t2, t3, t4, '-'), bufsize=bs) + savestdin = sys.stdin + try: + sys.stdin = StringIO("Line 1 of stdin\nLine 2 of stdin\n") + lines = list(fi) + verify(len(lines) == 33) + verify(lines[32] == 'Line 2 of stdin\n') + verify(fi.filename() == '') + fi.nextfile() + finally: + sys.stdin = savestdin + + if verbose: + print '%s. Boundary conditions (bs=%s)' % (start+4, bs) + fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + verify(fi.lineno() == 0) + verify(fi.filename() == None) + fi.nextfile() + verify(fi.lineno() == 0) + verify(fi.filename() == None) + + if verbose: + print '%s. Inplace (bs=%s)' % (start+5, bs) + savestdout = sys.stdout + try: + fi = FileInput(files=(t1, t2, t3, t4), inplace=1, bufsize=bs) + for line in fi: + line = line[:-1].upper() + print line + fi.close() + finally: + sys.stdout = savestdout + + fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + for line in fi: + verify(line[-1] == '\n') + m = pat.match(line[:-1]) + verify(m != None) + verify(int(m.group(1)) == fi.filelineno()) + fi.close() + + +def writeFiles(): + global t1, t2, t3, t4 + t1 = writeTmp(1, ["Line %s of file 1\n" % (i+1) for i in range(15)]) + t2 = writeTmp(2, ["Line %s of file 2\n" % (i+1) for i in range(10)]) + t3 = writeTmp(3, ["Line %s of file 3\n" % (i+1) for i in range(5)]) + t4 = writeTmp(4, ["Line %s of file 4\n" % (i+1) for i in range(1)]) + +# First, run the tests with default and teeny buffer size. +for round, bs in (0, 0), (1, 30): + try: + writeFiles() + runTests(t1, t2, t3, t4, bs, round) + finally: + remove_tempfiles(t1, t2, t3, t4) + +# Next, check for proper behavior with 0-byte files. +if verbose: + print "13. 0-byte files" +try: + t1 = writeTmp(1, [""]) + t2 = writeTmp(2, [""]) + t3 = writeTmp(3, ["The only line there is.\n"]) + t4 = writeTmp(4, [""]) + fi = FileInput(files=(t1, t2, t3, t4)) + line = fi.readline() + verify(line == 'The only line there is.\n') + verify(fi.lineno() == 1) + verify(fi.filelineno() == 1) + verify(fi.filename() == t3) + line = fi.readline() + verify(not line) + verify(fi.lineno() == 1) + verify(fi.filelineno() == 0) + verify(fi.filename() == t4) + fi.close() +finally: + remove_tempfiles(t1, t2, t3, t4) + +if verbose: + print "14. Files that don't end with newline" +try: + t1 = writeTmp(1, ["A\nB\nC"]) + t2 = writeTmp(2, ["D\nE\nF"]) + fi = FileInput(files=(t1, t2)) + lines = list(fi) + verify(lines == ["A\n", "B\n", "C", "D\n", "E\n", "F"]) + verify(fi.filelineno() == 3) + verify(fi.lineno() == 6) +finally: + remove_tempfiles(t1, t2) diff --git a/lib-python/2.2/test/test_fnmatch.py b/lib-python/2.2/test/test_fnmatch.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_fnmatch.py @@ -0,0 +1,46 @@ +"""Test cases for the fnmatch module.""" + +import test_support +import unittest + +from fnmatch import fnmatch, fnmatchcase + + +class FnmatchTestCase(unittest.TestCase): + def check_match(self, filename, pattern, should_match=1): + if should_match: + self.assert_(fnmatch(filename, pattern), + "expected %r to match pattern %r" + % (filename, pattern)) + else: + self.assert_(not fnmatch(filename, pattern), + "expected %r not to match pattern %r" + % (filename, pattern)) + + def test_fnmatch(self): + check = self.check_match + check('abc', 'abc') + check('abc', '?*?') + check('abc', '???*') + check('abc', '*???') + check('abc', '???') + check('abc', '*') + check('abc', 'ab[cd]') + check('abc', 'ab[!de]') + check('abc', 'ab[de]', 0) + check('a', '??', 0) + check('a', 'b', 0) + + # these test that '\' is handled correctly in character sets; + # see SF bug #??? + check('\\', r'[\]') + check('a', r'[!\]') + check('\\', r'[!\]', 0) + + +def test_main(): + test_support.run_unittest(FnmatchTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_fork1.py b/lib-python/2.2/test/test_fork1.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_fork1.py @@ -0,0 +1,75 @@ +"""This test checks for correct fork() behavior. + +We want fork1() semantics -- only the forking thread survives in the +child after a fork(). + +On some systems (e.g. Solaris without posix threads) we find that all +active threads survive in the child after a fork(); this is an error. + +While BeOS doesn't officially support fork and native threading in +the same application, the present example should work just fine. DC +""" + +import os, sys, time, thread +from test_support import verify, verbose, TestSkipped + +try: + os.fork +except AttributeError: + raise TestSkipped, "os.fork not defined -- skipping test_fork1" + +LONGSLEEP = 2 + +SHORTSLEEP = 0.5 + +NUM_THREADS = 4 + +alive = {} + +stop = 0 + +def f(id): + while not stop: + alive[id] = os.getpid() + try: + time.sleep(SHORTSLEEP) + except IOError: + pass + +def main(): + for i in range(NUM_THREADS): + thread.start_new(f, (i,)) + + time.sleep(LONGSLEEP) + + a = alive.keys() + a.sort() + verify(a == range(NUM_THREADS)) + + prefork_lives = alive.copy() + + if sys.platform in ['unixware7']: + cpid = os.fork1() + else: + cpid = os.fork() + + if cpid == 0: + # Child + time.sleep(LONGSLEEP) + n = 0 + for key in alive.keys(): + if alive[key] != prefork_lives[key]: + n = n+1 + os._exit(n) + else: + # Parent + spid, status = os.waitpid(cpid, 0) + verify(spid == cpid) + verify(status == 0, + "cause = %d, exit = %d" % (status&0xff, status>>8) ) + global stop + # Tell threads to die + stop = 1 + time.sleep(2*SHORTSLEEP) # Wait for threads to die + +main() diff --git a/lib-python/2.2/test/test_format.py b/lib-python/2.2/test/test_format.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_format.py @@ -0,0 +1,218 @@ +from test_support import verbose, have_unicode +import sys + +# test string formatting operator (I am not sure if this is being tested +# elsewhere but, surely, some of the given cases are *not* tested because +# they crash python) +# test on unicode strings as well + +overflowok = 1 + +def testformat(formatstr, args, output=None): + if verbose: + if output: + print "%s %% %s =? %s ..." %\ + (repr(formatstr), repr(args), repr(output)), + else: + print "%s %% %s works? ..." % (repr(formatstr), repr(args)), + try: + result = formatstr % args + except OverflowError: + if not overflowok: + raise + if verbose: + print 'overflow (this is fine)' + else: + if output and result != output: + if verbose: + print 'no' + print "%s %% %s == %s != %s" %\ + (repr(formatstr), repr(args), repr(result), repr(output)) + else: + if verbose: + print 'yes' + +def testboth(formatstr, *args): + testformat(formatstr, *args) + if have_unicode: + testformat(unicode(formatstr), *args) + + +testboth("%.1d", (1,), "1") +testboth("%.*d", (sys.maxint,1)) # expect overflow +testboth("%.100d", (1,), '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001') +testboth("%#.117x", (1,), '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001') +testboth("%#.118x", (1,), '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001') + +testboth("%f", (1.0,), "1.000000") +# these are trying to test the limits of the internal magic-number-length +# formatting buffer, if that number changes then these tests are less +# effective +testboth("%#.*g", (109, -1.e+49/3.)) +testboth("%#.*g", (110, -1.e+49/3.)) +testboth("%#.*g", (110, -1.e+100/3.)) + +# test some ridiculously large precision, expect overflow +testboth('%12.*f', (123456, 1.0)) + +# Formatting of long integers. Overflow is not ok +overflowok = 0 +testboth("%x", 10L, "a") +testboth("%x", 100000000000L, "174876e800") +testboth("%o", 10L, "12") +testboth("%o", 100000000000L, "1351035564000") +testboth("%d", 10L, "10") +testboth("%d", 100000000000L, "100000000000") + +big = 123456789012345678901234567890L +testboth("%d", big, "123456789012345678901234567890") +testboth("%d", -big, "-123456789012345678901234567890") +testboth("%5d", -big, "-123456789012345678901234567890") +testboth("%31d", -big, "-123456789012345678901234567890") +testboth("%32d", -big, " -123456789012345678901234567890") +testboth("%-32d", -big, "-123456789012345678901234567890 ") +testboth("%032d", -big, "-0123456789012345678901234567890") +testboth("%-032d", -big, "-123456789012345678901234567890 ") +testboth("%034d", -big, "-000123456789012345678901234567890") +testboth("%034d", big, "0000123456789012345678901234567890") +testboth("%0+34d", big, "+000123456789012345678901234567890") +testboth("%+34d", big, " +123456789012345678901234567890") +testboth("%34d", big, " 123456789012345678901234567890") +testboth("%.2d", big, "123456789012345678901234567890") +testboth("%.30d", big, "123456789012345678901234567890") +testboth("%.31d", big, "0123456789012345678901234567890") +testboth("%32.31d", big, " 0123456789012345678901234567890") + +big = 0x1234567890abcdef12345L # 21 hex digits +testboth("%x", big, "1234567890abcdef12345") +testboth("%x", -big, "-1234567890abcdef12345") +testboth("%5x", -big, "-1234567890abcdef12345") +testboth("%22x", -big, "-1234567890abcdef12345") +testboth("%23x", -big, " -1234567890abcdef12345") +testboth("%-23x", -big, "-1234567890abcdef12345 ") +testboth("%023x", -big, "-01234567890abcdef12345") +testboth("%-023x", -big, "-1234567890abcdef12345 ") +testboth("%025x", -big, "-0001234567890abcdef12345") +testboth("%025x", big, "00001234567890abcdef12345") +testboth("%0+25x", big, "+0001234567890abcdef12345") +testboth("%+25x", big, " +1234567890abcdef12345") +testboth("%25x", big, " 1234567890abcdef12345") +testboth("%.2x", big, "1234567890abcdef12345") +testboth("%.21x", big, "1234567890abcdef12345") +testboth("%.22x", big, "01234567890abcdef12345") +testboth("%23.22x", big, " 01234567890abcdef12345") +testboth("%-23.22x", big, "01234567890abcdef12345 ") +testboth("%X", big, "1234567890ABCDEF12345") +testboth("%#X", big, "0X1234567890ABCDEF12345") +testboth("%#x", big, "0x1234567890abcdef12345") +testboth("%#x", -big, "-0x1234567890abcdef12345") +testboth("%#.23x", -big, "-0x001234567890abcdef12345") +testboth("%#+.23x", big, "+0x001234567890abcdef12345") +testboth("%# .23x", big, " 0x001234567890abcdef12345") +testboth("%#+.23X", big, "+0X001234567890ABCDEF12345") +testboth("%#-+.23X", big, "+0X001234567890ABCDEF12345") +testboth("%#-+26.23X", big, "+0X001234567890ABCDEF12345") +testboth("%#-+27.23X", big, "+0X001234567890ABCDEF12345 ") +testboth("%#+27.23X", big, " +0X001234567890ABCDEF12345") +# next one gets two leading zeroes from precision, and another from the +# 0 flag and the width +testboth("%#+027.23X", big, "+0X0001234567890ABCDEF12345") +# same, except no 0 flag +testboth("%#+27.23X", big, " +0X001234567890ABCDEF12345") + +big = 012345670123456701234567012345670L # 32 octal digits +testboth("%o", big, "12345670123456701234567012345670") +testboth("%o", -big, "-12345670123456701234567012345670") +testboth("%5o", -big, "-12345670123456701234567012345670") +testboth("%33o", -big, "-12345670123456701234567012345670") +testboth("%34o", -big, " -12345670123456701234567012345670") +testboth("%-34o", -big, "-12345670123456701234567012345670 ") +testboth("%034o", -big, "-012345670123456701234567012345670") +testboth("%-034o", -big, "-12345670123456701234567012345670 ") +testboth("%036o", -big, "-00012345670123456701234567012345670") +testboth("%036o", big, "000012345670123456701234567012345670") +testboth("%0+36o", big, "+00012345670123456701234567012345670") +testboth("%+36o", big, " +12345670123456701234567012345670") +testboth("%36o", big, " 12345670123456701234567012345670") +testboth("%.2o", big, "12345670123456701234567012345670") +testboth("%.32o", big, "12345670123456701234567012345670") +testboth("%.33o", big, "012345670123456701234567012345670") +testboth("%34.33o", big, " 012345670123456701234567012345670") +testboth("%-34.33o", big, "012345670123456701234567012345670 ") +testboth("%o", big, "12345670123456701234567012345670") +testboth("%#o", big, "012345670123456701234567012345670") +testboth("%#o", -big, "-012345670123456701234567012345670") +testboth("%#.34o", -big, "-0012345670123456701234567012345670") +testboth("%#+.34o", big, "+0012345670123456701234567012345670") +testboth("%# .34o", big, " 0012345670123456701234567012345670") +testboth("%#+.34o", big, "+0012345670123456701234567012345670") +testboth("%#-+.34o", big, "+0012345670123456701234567012345670") +testboth("%#-+37.34o", big, "+0012345670123456701234567012345670 ") +testboth("%#+37.34o", big, " +0012345670123456701234567012345670") +# next one gets one leading zero from precision +testboth("%.33o", big, "012345670123456701234567012345670") +# base marker shouldn't change that, since "0" is redundant +testboth("%#.33o", big, "012345670123456701234567012345670") +# but reduce precision, and base marker should add a zero +testboth("%#.32o", big, "012345670123456701234567012345670") +# one leading zero from precision, and another from "0" flag & width +testboth("%034.33o", big, "0012345670123456701234567012345670") +# base marker shouldn't change that +testboth("%0#34.33o", big, "0012345670123456701234567012345670") + +# Some small ints, in both Python int and long flavors). +testboth("%d", 42, "42") +testboth("%d", -42, "-42") +testboth("%d", 42L, "42") +testboth("%d", -42L, "-42") +testboth("%#x", 1, "0x1") +testboth("%#x", 1L, "0x1") +testboth("%#X", 1, "0X1") +testboth("%#X", 1L, "0X1") +testboth("%#o", 1, "01") +testboth("%#o", 1L, "01") +testboth("%#o", 0, "0") +testboth("%#o", 0L, "0") +testboth("%o", 0, "0") +testboth("%o", 0L, "0") +testboth("%d", 0, "0") +testboth("%d", 0L, "0") +testboth("%#x", 0, "0x0") +testboth("%#x", 0L, "0x0") +testboth("%#X", 0, "0X0") +testboth("%#X", 0L, "0X0") + +testboth("%x", 0x42, "42") +# testboth("%x", -0x42, "ffffffbe") # Alas, that's specific to 32-bit machines +testboth("%x", 0x42L, "42") +testboth("%x", -0x42L, "-42") + +testboth("%o", 042, "42") +# testboth("%o", -042, "37777777736") # Alas, that's specific to 32-bit machines +testboth("%o", 042L, "42") +testboth("%o", -042L, "-42") + +# Test exception for unknown format characters +if verbose: + print 'Testing exceptions' + +def test_exc(formatstr, args, exception, excmsg): + try: + testformat(formatstr, args) + except exception, exc: + if str(exc) == excmsg: + if verbose: + print "yes" + else: + if verbose: print 'no' + print 'Unexpected ', exception, ':', repr(str(exc)) + except: + if verbose: print 'no' + print 'Unexpected exception' + raise + +test_exc('abc %a', 1, ValueError, + "unsupported format character 'a' (0x61) at index 5") +if have_unicode: + test_exc(unicode('abc %\u3000','raw-unicode-escape'), 1, ValueError, + "unsupported format character '?' (0x3000) at index 5") diff --git a/lib-python/2.2/test/test_fpformat.py b/lib-python/2.2/test/test_fpformat.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_fpformat.py @@ -0,0 +1,75 @@ +''' + Tests for fpformat module + Nick Mathewson +''' +from test_support import run_unittest +import unittest +from fpformat import fix, sci, NotANumber + +StringType = type('') + +# Test the old and obsolescent fpformat module. +# +# (It's obsolescent because fix(n,d) == "%.*f"%(d,n) and +# sci(n,d) == "%.*e"%(d,n) +# for all reasonable numeric n and d, except that sci gives 3 exponent +# digits instead of 2. +# +# Differences only occur for unreasonable n and d. <.2 wink>) + +class FpformatTest(unittest.TestCase): + + def checkFix(self, n, digits): + result = fix(n, digits) + if isinstance(n, StringType): + n = repr(n) + expected = "%.*f" % (digits, float(n)) + + self.assertEquals(result, expected) + + def checkSci(self, n, digits): + result = sci(n, digits) + if isinstance(n, StringType): + n = repr(n) + expected = "%.*e" % (digits, float(n)) + # add the extra 0 if needed + num, exp = expected.split("e") + if len(exp) < 4: + exp = exp[0] + "0" + exp[1:] + expected = "%se%s" % (num, exp) + + self.assertEquals(result, expected) + + def test_basic_cases(self): + self.assertEquals(fix(100.0/3, 3), '33.333') + self.assertEquals(sci(100.0/3, 3), '3.333e+001') + + def test_reasonable_values(self): + for d in range(7): + for val in (1000.0/3, 1000, 1000.0, .002, 1.0/3, 1e10): + for realVal in (val, 1.0/val, -val, -1.0/val): + self.checkFix(realVal, d) + self.checkSci(realVal, d) + + def test_failing_values(self): + # Now for 'unreasonable n and d' + self.assertEquals(fix(1.0, 1000), '1.'+('0'*1000)) + self.assertEquals(sci("1"+('0'*1000), 0), '1e+1000') + + # This behavior is inconsistent. sci raises an exception; fix doesn't. + yacht = "Throatwobbler Mangrove" + self.assertEquals(fix(yacht, 10), yacht) + try: + sci(yacht, 10) + except NotANumber: + pass + else: + self.fail("No exception on non-numeric sci") + + +def test_main(): + run_unittest(FpformatTest) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_frozen.py b/lib-python/2.2/test/test_frozen.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_frozen.py @@ -0,0 +1,26 @@ +# Test the frozen module defined in frozen.c. + +from test_support import TestFailed +import sys, os + +try: + import __hello__ +except ImportError, x: + raise TestFailed, "import __hello__ failed:", x + +try: + import __phello__ +except ImportError, x: + raise TestFailed, "import __phello__ failed:", x + +try: + import __phello__.spam +except ImportError, x: + raise TestFailed, "import __phello__.spam failed:", x + +try: + import __phello__.foo +except ImportError: + pass +else: + raise TestFailed, "import __phello__.foo should have failed" diff --git a/lib-python/2.2/test/test_funcattrs.py b/lib-python/2.2/test/test_funcattrs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_funcattrs.py @@ -0,0 +1,379 @@ +from test_support import verbose, TestFailed, verify +import types + +class F: + def a(self): + pass + +def b(): + 'my docstring' + pass + +# setting attributes on functions +try: + b.publish +except AttributeError: pass +else: raise TestFailed, 'expected AttributeError' + +if b.__dict__ <> {}: + raise TestFailed, 'expected unassigned func.__dict__ to be {}' + +b.publish = 1 +if b.publish <> 1: + raise TestFailed, 'function attribute not set to expected value' + +docstring = 'its docstring' +b.__doc__ = docstring +if b.__doc__ <> docstring: + raise TestFailed, 'problem with setting __doc__ attribute' + +if 'publish' not in dir(b): + raise TestFailed, 'attribute not in dir()' + +try: + del b.__dict__ +except TypeError: pass +else: raise TestFailed, 'del func.__dict__ expected TypeError' + +b.publish = 1 +try: + b.__dict__ = None +except TypeError: pass +else: raise TestFailed, 'func.__dict__ = None expected TypeError' + +d = {'hello': 'world'} +b.__dict__ = d +if b.func_dict is not d: + raise TestFailed, 'func.__dict__ assignment to dictionary failed' +if b.hello <> 'world': + raise TestFailed, 'attribute after func.__dict__ assignment failed' + +f1 = F() +f2 = F() + +try: + F.a.publish +except AttributeError: pass +else: raise TestFailed, 'expected AttributeError' + +try: + f1.a.publish +except AttributeError: pass +else: raise TestFailed, 'expected AttributeError' + +# In Python 2.1 beta 1, we disallowed setting attributes on unbound methods +# (it was already disallowed on bound methods). See the PEP for details. +try: + F.a.publish = 1 +except (AttributeError, TypeError): pass +else: raise TestFailed, 'expected AttributeError or TypeError' + +# But setting it explicitly on the underlying function object is okay. +F.a.im_func.publish = 1 + +if F.a.publish <> 1: + raise TestFailed, 'unbound method attribute not set to expected value' + +if f1.a.publish <> 1: + raise TestFailed, 'bound method attribute access did not work' + +if f2.a.publish <> 1: + raise TestFailed, 'bound method attribute access did not work' + +if 'publish' not in dir(F.a): + raise TestFailed, 'attribute not in dir()' + +try: + f1.a.publish = 0 +except (AttributeError, TypeError): pass +else: raise TestFailed, 'expected AttributeError or TypeError' + +# See the comment above about the change in semantics for Python 2.1b1 +try: + F.a.myclass = F +except (AttributeError, TypeError): pass +else: raise TestFailed, 'expected AttributeError or TypeError' + +F.a.im_func.myclass = F + +f1.a.myclass +f2.a.myclass +f1.a.myclass +F.a.myclass + +if f1.a.myclass is not f2.a.myclass or \ + f1.a.myclass is not F.a.myclass: + raise TestFailed, 'attributes were not the same' + +# try setting __dict__ +try: + F.a.__dict__ = (1, 2, 3) +except (AttributeError, TypeError): pass +else: raise TestFailed, 'expected TypeError or AttributeError' + +F.a.im_func.__dict__ = {'one': 11, 'two': 22, 'three': 33} + +if f1.a.two <> 22: + raise TestFailed, 'setting __dict__' + +from UserDict import UserDict +d = UserDict({'four': 44, 'five': 55}) + +try: + F.a.__dict__ = d +except (AttributeError, TypeError): pass +else: raise TestFailed + +if f2.a.one <> f1.a.one <> F.a.one <> 11: + raise TestFailed + +# im_func may not be a Python method! +import new +F.id = new.instancemethod(id, None, F) + +eff = F() +if eff.id() <> id(eff): + raise TestFailed + +try: + F.id.foo +except AttributeError: pass +else: raise TestFailed + +try: + F.id.foo = 12 +except (AttributeError, TypeError): pass +else: raise TestFailed + +try: + F.id.foo +except AttributeError: pass +else: raise TestFailed + +try: + eff.id.foo +except AttributeError: pass +else: raise TestFailed + +try: + eff.id.foo = 12 +except (AttributeError, TypeError): pass +else: raise TestFailed + +try: + eff.id.foo +except AttributeError: pass +else: raise TestFailed + +# Regression test for a crash in pre-2.1a1 +def another(): + pass + +try: + del another.__dict__ +except TypeError: pass +else: raise TestFailed + +try: + del another.func_dict +except TypeError: pass +else: raise TestFailed + +try: + another.func_dict = None +except TypeError: pass +else: raise TestFailed + +try: + del another.bar +except AttributeError: pass +else: raise TestFailed + +# This isn't specifically related to function attributes, but it does test a +# core dump regression in funcobject.c +del another.func_defaults + +def foo(): + pass + +def bar(): + pass + +def temp(): + print 1 + +if foo==bar: + raise TestFailed + +d={} +d[foo] = 1 + +foo.func_code = temp.func_code + +d[foo] + +# Test all predefined function attributes systematically + +def cantset(obj, name, value): + verify(hasattr(obj, name)) # Otherwise it's probably a typo + try: + setattr(obj, name, value) + except (AttributeError, TypeError): + pass + else: + raise TestFailed, "shouldn't be able to set %s to %r" % (name, value) + try: + delattr(obj, name) + except (AttributeError, TypeError): + pass + else: + raise TestFailed, "shouldn't be able to del %s" % name + +def test_func_closure(): + a = 12 + def f(): print a + c = f.func_closure + verify(isinstance(c, tuple)) + verify(len(c) == 1) + verify(c[0].__class__.__name__ == "cell") # don't have a type object handy + cantset(f, "func_closure", c) + +def test_func_doc(): + def f(): pass + verify(f.__doc__ is None) + verify(f.func_doc is None) + f.__doc__ = "hello" + verify(f.__doc__ == "hello") + verify(f.func_doc == "hello") + del f.__doc__ + verify(f.__doc__ is None) + verify(f.func_doc is None) + f.func_doc = "world" + verify(f.__doc__ == "world") + verify(f.func_doc == "world") + del f.func_doc + verify(f.func_doc is None) + verify(f.__doc__ is None) + +def test_func_globals(): + def f(): pass + verify(f.func_globals is globals()) + cantset(f, "func_globals", globals()) + +def test_func_name(): + def f(): pass + verify(f.__name__ == "f") + verify(f.func_name == "f") + cantset(f, "func_name", "f") + cantset(f, "__name__", "f") + +def test_func_code(): + def f(): pass + def g(): print 12 + verify(type(f.func_code) is types.CodeType) + f.func_code = g.func_code + cantset(f, "func_code", None) + +def test_func_defaults(): + def f(a, b): return (a, b) + verify(f.func_defaults is None) + f.func_defaults = (1, 2) + verify(f.func_defaults == (1, 2)) + verify(f(10) == (10, 2)) + def g(a=1, b=2): return (a, b) + verify(g.func_defaults == (1, 2)) + del g.func_defaults + verify(g.func_defaults is None) + try: + g() + except TypeError: + pass + else: + raise TestFailed, "shouldn't be allowed to call g() w/o defaults" + +def test_func_dict(): + def f(): pass + a = f.__dict__ + b = f.func_dict + verify(a == {}) + verify(a is b) + f.hello = 'world' + verify(a == {'hello': 'world'}) + verify(f.func_dict is a is f.__dict__) + f.func_dict = {} + verify(not hasattr(f, "hello")) + f.__dict__ = {'world': 'hello'} + verify(f.world == "hello") + verify(f.__dict__ is f.func_dict == {'world': 'hello'}) + cantset(f, "func_dict", None) + cantset(f, "__dict__", None) + +def test_im_class(): + class C: + def foo(self): pass + verify(C.foo.im_class is C) + verify(C().foo.im_class is C) + cantset(C.foo, "im_class", C) + cantset(C().foo, "im_class", C) + +def test_im_func(): + def foo(self): pass + class C: + pass + C.foo = foo + verify(C.foo.im_func is foo) + verify(C().foo.im_func is foo) + cantset(C.foo, "im_func", foo) + cantset(C().foo, "im_func", foo) + +def test_im_self(): + class C: + def foo(self): pass + verify(C.foo.im_self is None) + c = C() + verify(c.foo.im_self is c) + cantset(C.foo, "im_self", None) + cantset(c.foo, "im_self", c) + +def test_im_dict(): + class C: + def foo(self): pass + foo.bar = 42 + verify(C.foo.__dict__ == {'bar': 42}) + verify(C().foo.__dict__ == {'bar': 42}) + cantset(C.foo, "__dict__", C.foo.__dict__) + cantset(C().foo, "__dict__", C.foo.__dict__) + +def test_im_doc(): + class C: + def foo(self): "hello" + verify(C.foo.__doc__ == "hello") + verify(C().foo.__doc__ == "hello") + cantset(C.foo, "__doc__", "hello") + cantset(C().foo, "__doc__", "hello") + +def test_im_name(): + class C: + def foo(self): pass + verify(C.foo.__name__ == "foo") + verify(C().foo.__name__ == "foo") + cantset(C.foo, "__name__", "foo") + cantset(C().foo, "__name__", "foo") + +def testmore(): + test_func_closure() + test_func_doc() + test_func_globals() + test_func_name() + test_func_code() + test_func_defaults() + test_func_dict() + # Tests for instance method attributes + test_im_class() + test_im_func() + test_im_self() + test_im_dict() + test_im_doc() + test_im_name() + +testmore() diff --git a/lib-python/2.2/test/test_future.py b/lib-python/2.2/test/test_future.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_future.py @@ -0,0 +1,47 @@ +# Test various flavors of legal and illegal future statements + +from test_support import unload +import re + +rx = re.compile('\((\S+).py, line (\d+)') + +def check_error_location(msg): + mo = rx.search(msg) + print "SyntaxError %s %s" % mo.group(1, 2) + +# The first two tests should work + +unload('test_future1') +import test_future1 + +unload('test_future2') +import test_future2 + +unload('test_future3') +import test_future3 + +# The remaining tests should fail +try: + import badsyntax_future3 +except SyntaxError, msg: + check_error_location(str(msg)) + +try: + import badsyntax_future4 +except SyntaxError, msg: + check_error_location(str(msg)) + +try: + import badsyntax_future5 +except SyntaxError, msg: + check_error_location(str(msg)) + +try: + import badsyntax_future6 +except SyntaxError, msg: + check_error_location(str(msg)) + +try: + import badsyntax_future7 +except SyntaxError, msg: + check_error_location(str(msg)) diff --git a/lib-python/2.2/test/test_future1.py b/lib-python/2.2/test/test_future1.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_future1.py @@ -0,0 +1,11 @@ +"""This is a test""" + +# Import the name nested_scopes twice to trigger SF bug #407394 (regression). +from __future__ import nested_scopes, nested_scopes + +def f(x): + def g(y): + return x + y + return g + +print f(2)(4) diff --git a/lib-python/2.2/test/test_future2.py b/lib-python/2.2/test/test_future2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_future2.py @@ -0,0 +1,10 @@ +"""This is a test""" + +from __future__ import nested_scopes; import string + +def f(x): + def g(y): + return x + y + return g + +print f(2)(4) diff --git a/lib-python/2.2/test/test_future3.py b/lib-python/2.2/test/test_future3.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_future3.py @@ -0,0 +1,11 @@ +from __future__ import nested_scopes +from __future__ import division +from __future__ import nested_scopes + +def f(x): + def g(y): + return y // x + return g + + +print f(2)(5) diff --git a/lib-python/2.2/test/test_gc.py b/lib-python/2.2/test/test_gc.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_gc.py @@ -0,0 +1,346 @@ +from test_support import verify, verbose, TestFailed +import sys +import gc + +def expect(actual, expected, name): + if actual != expected: + raise TestFailed, "test_%s: actual %d, expected %d" % ( + name, actual, expected) + +def expect_nonzero(actual, name): + if actual == 0: + raise TestFailed, "test_%s: unexpected zero" % name + +def run_test(name, thunk): + if verbose: + print "testing %s..." % name, + thunk() + if verbose: + print "ok" + +def test_list(): + l = [] + l.append(l) + gc.collect() + del l + expect(gc.collect(), 1, "list") + +def test_dict(): + d = {} + d[1] = d + gc.collect() + del d + expect(gc.collect(), 1, "dict") + +def test_tuple(): + # since tuples are immutable we close the loop with a list + l = [] + t = (l,) + l.append(t) + gc.collect() + del t + del l + expect(gc.collect(), 2, "tuple") + +def test_class(): + class A: + pass + A.a = A + gc.collect() + del A + expect_nonzero(gc.collect(), "class") + +def test_newstyleclass(): + class A(object): + pass + gc.collect() + del A + expect_nonzero(gc.collect(), "staticclass") + +def test_instance(): + class A: + pass + a = A() + a.a = a + gc.collect() + del a + expect_nonzero(gc.collect(), "instance") + +def test_newinstance(): + class A(object): + pass + a = A() + a.a = a + gc.collect() + del a + expect_nonzero(gc.collect(), "newinstance") + class B(list): + pass + class C(B, A): + pass + a = C() + a.a = a + gc.collect() + del a + expect_nonzero(gc.collect(), "newinstance(2)") + del B, C + expect_nonzero(gc.collect(), "newinstance(3)") + A.a = A() + del A + expect_nonzero(gc.collect(), "newinstance(4)") + expect(gc.collect(), 0, "newinstance(5)") + +def test_method(): + # Tricky: self.__init__ is a bound method, it references the instance. + class A: + def __init__(self): + self.init = self.__init__ + a = A() + gc.collect() + del a + expect_nonzero(gc.collect(), "method") + +def test_finalizer(): + # A() is uncollectable if it is part of a cycle, make sure it shows up + # in gc.garbage. + class A: + def __del__(self): pass + class B: + pass + a = A() + a.a = a + id_a = id(a) + b = B() + b.b = b + gc.collect() + del a + del b + expect_nonzero(gc.collect(), "finalizer") + for obj in gc.garbage: + if id(obj) == id_a: + del obj.a + break + else: + raise TestFailed, "didn't find obj in garbage (finalizer)" + gc.garbage.remove(obj) + +def test_function(): + # Tricky: f -> d -> f, code should call d.clear() after the exec to + # break the cycle. + d = {} + exec("def f(): pass\n") in d + gc.collect() + del d + expect(gc.collect(), 2, "function") + +def test_frame(): + def f(): + frame = sys._getframe() + gc.collect() + f() + expect(gc.collect(), 1, "frame") + + +def test_saveall(): + # Verify that cyclic garbage like lists show up in gc.garbage if the + # SAVEALL option is enabled. + debug = gc.get_debug() + gc.set_debug(debug | gc.DEBUG_SAVEALL) + l = [] + l.append(l) + id_l = id(l) + del l + gc.collect() + try: + for obj in gc.garbage: + if id(obj) == id_l: + del obj[:] + break + else: + raise TestFailed, "didn't find obj in garbage (saveall)" + gc.garbage.remove(obj) + finally: + gc.set_debug(debug) + +def test_del(): + # __del__ methods can trigger collection, make this to happen + thresholds = gc.get_threshold() + gc.enable() + gc.set_threshold(1) + + class A: + def __del__(self): + dir(self) + a = A() + del a + + gc.disable() + apply(gc.set_threshold, thresholds) + +class Ouch: + n = 0 + def __del__(self): + Ouch.n = Ouch.n + 1 + if Ouch.n % 7 == 0: + gc.collect() + +def test_trashcan(): + # "trashcan" is a hack to prevent stack overflow when deallocating + # very deeply nested tuples etc. It works in part by abusing the + # type pointer and refcount fields, and that can yield horrible + # problems when gc tries to traverse the structures. + # If this test fails (as it does in 2.0, 2.1 and 2.2), it will + # most likely die via segfault. + + gc.enable() + N = 200 + for count in range(3): + t = [] + for i in range(N): + t = [t, Ouch()] + u = [] + for i in range(N): + u = [u, Ouch()] + v = {} + for i in range(N): + v = {1: v, 2: Ouch()} + gc.disable() + +class Boom: + def __getattr__(self, someattribute): + del self.attr + raise AttributeError + +def test_boom(): + a = Boom() + b = Boom() + a.attr = b + b.attr = a + + gc.collect() + garbagelen = len(gc.garbage) + del a, b + # a<->b are in a trash cycle now. Collection will invoke Boom.__getattr__ + # (to see whether a and b have __del__ methods), and __getattr__ deletes + # the internal "attr" attributes as a side effect. That causes the + # trash cycle to get reclaimed via refcounts falling to 0, thus mutating + # the trash graph as a side effect of merely asking whether __del__ + # exists. This used to (before 2.3b1) crash Python. Now __getattr__ + # isn't called. + expect(gc.collect(), 4, "boom") + expect(len(gc.garbage), garbagelen, "boom") + +class Boom2: + def __init__(self): + self.x = 0 + + def __getattr__(self, someattribute): + self.x += 1 + if self.x > 1: + del self.attr + raise AttributeError + +def test_boom2(): + a = Boom2() + b = Boom2() + a.attr = b + b.attr = a + + gc.collect() + garbagelen = len(gc.garbage) + del a, b + # Much like test_boom(), except that __getattr__ doesn't break the + # cycle until the second time gc checks for __del__. As of 2.3b1, + # there isn't a second time, so this simply cleans up the trash cycle. + # We expect a, b, a.__dict__ and b.__dict__ (4 objects) to get reclaimed + # this way. + expect(gc.collect(), 4, "boom2") + expect(len(gc.garbage), garbagelen, "boom2") + +# boom__new and boom2_new are exactly like boom and boom2, except use +# new-style classes. + +class Boom_New(object): + def __getattr__(self, someattribute): + del self.attr + raise AttributeError + +def test_boom_new(): + a = Boom_New() + b = Boom_New() + a.attr = b + b.attr = a + + gc.collect() + garbagelen = len(gc.garbage) + del a, b + expect(gc.collect(), 4, "boom_new") + expect(len(gc.garbage), garbagelen, "boom_new") + +class Boom2_New(object): + def __init__(self): + self.x = 0 + + def __getattr__(self, someattribute): + self.x += 1 + if self.x > 1: + del self.attr + raise AttributeError + +def test_boom2_new(): + a = Boom2_New() + b = Boom2_New() + a.attr = b + b.attr = a + + gc.collect() + garbagelen = len(gc.garbage) + del a, b + expect(gc.collect(), 4, "boom2_new") + expect(len(gc.garbage), garbagelen, "boom2_new") + +def test_all(): + gc.collect() # Delete 2nd generation garbage + run_test("lists", test_list) + run_test("dicts", test_dict) + run_test("tuples", test_tuple) + run_test("classes", test_class) + run_test("new style classes", test_newstyleclass) + run_test("instances", test_instance) + run_test("new instances", test_newinstance) + run_test("methods", test_method) + run_test("functions", test_function) + run_test("frames", test_frame) + run_test("finalizers", test_finalizer) + run_test("__del__", test_del) + run_test("saveall", test_saveall) + run_test("trashcan", test_trashcan) + run_test("boom", test_boom) + run_test("boom2", test_boom2) + run_test("boom_new", test_boom_new) + run_test("boom2_new", test_boom2_new) + +def test(): + if verbose: + print "disabling automatic collection" + enabled = gc.isenabled() + gc.disable() + verify(not gc.isenabled() ) + debug = gc.get_debug() + gc.set_debug(debug & ~gc.DEBUG_LEAK) # this test is supposed to leak + + try: + test_all() + finally: + gc.set_debug(debug) + # test gc.enable() even if GC is disabled by default + if verbose: + print "restoring automatic collection" + # make sure to always test gc.enable() + gc.enable() + verify(gc.isenabled()) + if not enabled: + gc.disable() + + +test() diff --git a/lib-python/2.2/test/test_gdbm.py b/lib-python/2.2/test/test_gdbm.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_gdbm.py @@ -0,0 +1,46 @@ +#! /usr/bin/env python +"""Test script for the gdbm module + Roger E. Masse +""" + +import gdbm +from gdbm import error +from test_support import verbose, verify, TestFailed + +filename= '/tmp/delete_me' + +g = gdbm.open(filename, 'c') +verify(g.keys() == []) +g['a'] = 'b' +g['12345678910'] = '019237410982340912840198242' +a = g.keys() +if verbose: + print 'Test gdbm file keys: ', a + +g.has_key('a') +g.close() +try: + g['a'] +except error: + pass +else: + raise TestFailed, "expected gdbm.error accessing closed database" +g = gdbm.open(filename, 'r') +g.close() +g = gdbm.open(filename, 'w') +g.close() +g = gdbm.open(filename, 'n') +g.close() +try: + g = gdbm.open(filename, 'rx') + g.close() +except error: + pass +else: + raise TestFailed, "expected gdbm.error when passing invalid open flags" + +try: + import os + os.unlink(filename) +except: + pass diff --git a/lib-python/2.2/test/test_generators.py b/lib-python/2.2/test/test_generators.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_generators.py @@ -0,0 +1,1386 @@ +from __future__ import generators + +tutorial_tests = """ +Let's try a simple generator: + + >>> def f(): + ... yield 1 + ... yield 2 + + >>> for i in f(): + ... print i + 1 + 2 + >>> g = f() + >>> g.next() + 1 + >>> g.next() + 2 + +"Falling off the end" stops the generator: + + >>> g.next() + Traceback (most recent call last): + File "", line 1, in ? + File "", line 2, in g + StopIteration + +"return" also stops the generator: + + >>> def f(): + ... yield 1 + ... return + ... yield 2 # never reached + ... + >>> g = f() + >>> g.next() + 1 + >>> g.next() + Traceback (most recent call last): + File "", line 1, in ? + File "", line 3, in f + StopIteration + >>> g.next() # once stopped, can't be resumed + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + +"raise StopIteration" stops the generator too: + + >>> def f(): + ... yield 1 + ... raise StopIteration + ... yield 2 # never reached + ... + >>> g = f() + >>> g.next() + 1 + >>> g.next() + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + >>> g.next() + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + +However, they are not exactly equivalent: + + >>> def g1(): + ... try: + ... return + ... except: + ... yield 1 + ... + >>> list(g1()) + [] + + >>> def g2(): + ... try: + ... raise StopIteration + ... except: + ... yield 42 + >>> print list(g2()) + [42] + +This may be surprising at first: + + >>> def g3(): + ... try: + ... return + ... finally: + ... yield 1 + ... + >>> list(g3()) + [1] + +Let's create an alternate range() function implemented as a generator: + + >>> def yrange(n): + ... for i in range(n): + ... yield i + ... + >>> list(yrange(5)) + [0, 1, 2, 3, 4] + +Generators always return to the most recent caller: + + >>> def creator(): + ... r = yrange(5) + ... print "creator", r.next() + ... return r + ... + >>> def caller(): + ... r = creator() + ... for i in r: + ... print "caller", i + ... + >>> caller() + creator 0 + caller 1 + caller 2 + caller 3 + caller 4 + +Generators can call other generators: + + >>> def zrange(n): + ... for i in yrange(n): + ... yield i + ... + >>> list(zrange(5)) + [0, 1, 2, 3, 4] + +""" + +# The examples from PEP 255. + +pep_tests = """ + +Specification: Yield + + Restriction: A generator cannot be resumed while it is actively + running: + + >>> def g(): + ... i = me.next() + ... yield i + >>> me = g() + >>> me.next() + Traceback (most recent call last): + ... + File "", line 2, in g + ValueError: generator already executing + +Specification: Return + + Note that return isn't always equivalent to raising StopIteration: the + difference lies in how enclosing try/except constructs are treated. + For example, + + >>> def f1(): + ... try: + ... return + ... except: + ... yield 1 + >>> print list(f1()) + [] + + because, as in any function, return simply exits, but + + >>> def f2(): + ... try: + ... raise StopIteration + ... except: + ... yield 42 + >>> print list(f2()) + [42] + + because StopIteration is captured by a bare "except", as is any + exception. + +Specification: Generators and Exception Propagation + + >>> def f(): + ... return 1//0 + >>> def g(): + ... yield f() # the zero division exception propagates + ... yield 42 # and we'll never get here + >>> k = g() + >>> k.next() + Traceback (most recent call last): + File "", line 1, in ? + File "", line 2, in g + File "", line 2, in f + ZeroDivisionError: integer division or modulo by zero + >>> k.next() # and the generator cannot be resumed + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + >>> + +Specification: Try/Except/Finally + + >>> def f(): + ... try: + ... yield 1 + ... try: + ... yield 2 + ... 1//0 + ... yield 3 # never get here + ... except ZeroDivisionError: + ... yield 4 + ... yield 5 + ... raise + ... except: + ... yield 6 + ... yield 7 # the "raise" above stops this + ... except: + ... yield 8 + ... yield 9 + ... try: + ... x = 12 + ... finally: + ... yield 10 + ... yield 11 + >>> print list(f()) + [1, 2, 4, 5, 8, 9, 10, 11] + >>> + +Guido's binary tree example. + + >>> # A binary tree class. + >>> class Tree: + ... + ... def __init__(self, label, left=None, right=None): + ... self.label = label + ... self.left = left + ... self.right = right + ... + ... def __repr__(self, level=0, indent=" "): + ... s = level*indent + `self.label` + ... if self.left: + ... s = s + "\\n" + self.left.__repr__(level+1, indent) + ... if self.right: + ... s = s + "\\n" + self.right.__repr__(level+1, indent) + ... return s + ... + ... def __iter__(self): + ... return inorder(self) + + >>> # Create a Tree from a list. + >>> def tree(list): + ... n = len(list) + ... if n == 0: + ... return [] + ... i = n // 2 + ... return Tree(list[i], tree(list[:i]), tree(list[i+1:])) + + >>> # Show it off: create a tree. + >>> t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + + >>> # A recursive generator that generates Tree leaves in in-order. + >>> def inorder(t): + ... if t: + ... for x in inorder(t.left): + ... yield x + ... yield t.label + ... for x in inorder(t.right): + ... yield x + + >>> # Show it off: create a tree. + ... t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + ... # Print the nodes of the tree in in-order. + ... for x in t: + ... print x, + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + + >>> # A non-recursive generator. + >>> def inorder(node): + ... stack = [] + ... while node: + ... while node.left: + ... stack.append(node) + ... node = node.left + ... yield node.label + ... while not node.right: + ... try: + ... node = stack.pop() + ... except IndexError: + ... return + ... yield node.label + ... node = node.right + + >>> # Exercise the non-recursive generator. + >>> for x in t: + ... print x, + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +""" + +# Examples from Iterator-List and Python-Dev and c.l.py. + +email_tests = """ + +The difference between yielding None and returning it. + +>>> def g(): +... for i in range(3): +... yield None +... yield None +... return +>>> list(g()) +[None, None, None, None] + +Ensure that explicitly raising StopIteration acts like any other exception +in try/except, not like a return. + +>>> def g(): +... yield 1 +... try: +... raise StopIteration +... except: +... yield 2 +... yield 3 +>>> list(g()) +[1, 2, 3] + +Next one was posted to c.l.py. + +>>> def gcomb(x, k): +... "Generate all combinations of k elements from list x." +... +... if k > len(x): +... return +... if k == 0: +... yield [] +... else: +... first, rest = x[0], x[1:] +... # A combination does or doesn't contain first. +... # If it does, the remainder is a k-1 comb of rest. +... for c in gcomb(rest, k-1): +... c.insert(0, first) +... yield c +... # If it doesn't contain first, it's a k comb of rest. +... for c in gcomb(rest, k): +... yield c + +>>> seq = range(1, 5) +>>> for k in range(len(seq) + 2): +... print "%d-combs of %s:" % (k, seq) +... for c in gcomb(seq, k): +... print " ", c +0-combs of [1, 2, 3, 4]: + [] +1-combs of [1, 2, 3, 4]: + [1] + [2] + [3] + [4] +2-combs of [1, 2, 3, 4]: + [1, 2] + [1, 3] + [1, 4] + [2, 3] + [2, 4] + [3, 4] +3-combs of [1, 2, 3, 4]: + [1, 2, 3] + [1, 2, 4] + [1, 3, 4] + [2, 3, 4] +4-combs of [1, 2, 3, 4]: + [1, 2, 3, 4] +5-combs of [1, 2, 3, 4]: + +From the Iterators list, about the types of these things. + +>>> def g(): +... yield 1 +... +>>> type(g) + +>>> i = g() +>>> type(i) + +>>> [s for s in dir(i) if not s.startswith('_')] +['gi_frame', 'gi_running', 'next'] +>>> print i.next.__doc__ +x.next() -> the next value, or raise StopIteration +>>> iter(i) is i +1 +>>> import types +>>> isinstance(i, types.GeneratorType) +1 + +And more, added later. + +>>> i.gi_running +0 +>>> type(i.gi_frame) + +>>> i.gi_running = 42 +Traceback (most recent call last): + ... +TypeError: readonly attribute +>>> def g(): +... yield me.gi_running +>>> me = g() +>>> me.gi_running +0 +>>> me.next() +1 +>>> me.gi_running +0 + +A clever union-find implementation from c.l.py, due to David Eppstein. +Sent: Friday, June 29, 2001 12:16 PM +To: python-list at python.org +Subject: Re: PEP 255: Simple Generators + +>>> class disjointSet: +... def __init__(self, name): +... self.name = name +... self.parent = None +... self.generator = self.generate() +... +... def generate(self): +... while not self.parent: +... yield self +... for x in self.parent.generator: +... yield x +... +... def find(self): +... return self.generator.next() +... +... def union(self, parent): +... if self.parent: +... raise ValueError("Sorry, I'm not a root!") +... self.parent = parent +... +... def __str__(self): +... return self.name + +>>> names = "ABCDEFGHIJKLM" +>>> sets = [disjointSet(name) for name in names] +>>> roots = sets[:] + +>>> import random +>>> random.seed(42) +>>> while 1: +... for s in sets: +... print "%s->%s" % (s, s.find()), +... print +... if len(roots) > 1: +... s1 = random.choice(roots) +... roots.remove(s1) +... s2 = random.choice(roots) +... s1.union(s2) +... print "merged", s1, "into", s2 +... else: +... break +A->A B->B C->C D->D E->E F->F G->G H->H I->I J->J K->K L->L M->M +merged D into G +A->A B->B C->C D->G E->E F->F G->G H->H I->I J->J K->K L->L M->M +merged C into F +A->A B->B C->F D->G E->E F->F G->G H->H I->I J->J K->K L->L M->M +merged L into A +A->A B->B C->F D->G E->E F->F G->G H->H I->I J->J K->K L->A M->M +merged H into E +A->A B->B C->F D->G E->E F->F G->G H->E I->I J->J K->K L->A M->M +merged B into E +A->A B->E C->F D->G E->E F->F G->G H->E I->I J->J K->K L->A M->M +merged J into G +A->A B->E C->F D->G E->E F->F G->G H->E I->I J->G K->K L->A M->M +merged E into G +A->A B->G C->F D->G E->G F->F G->G H->G I->I J->G K->K L->A M->M +merged M into G +A->A B->G C->F D->G E->G F->F G->G H->G I->I J->G K->K L->A M->G +merged I into K +A->A B->G C->F D->G E->G F->F G->G H->G I->K J->G K->K L->A M->G +merged K into A +A->A B->G C->F D->G E->G F->F G->G H->G I->A J->G K->A L->A M->G +merged F into A +A->A B->G C->A D->G E->G F->A G->G H->G I->A J->G K->A L->A M->G +merged A into G +A->G B->G C->G D->G E->G F->G G->G H->G I->G J->G K->G L->G M->G +""" + +# Fun tests (for sufficiently warped notions of "fun"). + +fun_tests = """ + +Build up to a recursive Sieve of Eratosthenes generator. + +>>> def firstn(g, n): +... return [g.next() for i in range(n)] + +>>> def intsfrom(i): +... while 1: +... yield i +... i += 1 + +>>> firstn(intsfrom(5), 7) +[5, 6, 7, 8, 9, 10, 11] + +>>> def exclude_multiples(n, ints): +... for i in ints: +... if i % n: +... yield i + +>>> firstn(exclude_multiples(3, intsfrom(1)), 6) +[1, 2, 4, 5, 7, 8] + +>>> def sieve(ints): +... prime = ints.next() +... yield prime +... not_divisible_by_prime = exclude_multiples(prime, ints) +... for p in sieve(not_divisible_by_prime): +... yield p + +>>> primes = sieve(intsfrom(2)) +>>> firstn(primes, 20) +[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71] + + +Another famous problem: generate all integers of the form + 2**i * 3**j * 5**k +in increasing order, where i,j,k >= 0. Trickier than it may look at first! +Try writing it without generators, and correctly, and without generating +3 internal results for each result output. + +>>> def times(n, g): +... for i in g: +... yield n * i +>>> firstn(times(10, intsfrom(1)), 10) +[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] + +>>> def merge(g, h): +... ng = g.next() +... nh = h.next() +... while 1: +... if ng < nh: +... yield ng +... ng = g.next() +... elif ng > nh: +... yield nh +... nh = h.next() +... else: +... yield ng +... ng = g.next() +... nh = h.next() + +The following works, but is doing a whale of a lot of redundant work -- +it's not clear how to get the internal uses of m235 to share a single +generator. Note that me_times2 (etc) each need to see every element in the +result sequence. So this is an example where lazy lists are more natural +(you can look at the head of a lazy list any number of times). + +>>> def m235(): +... yield 1 +... me_times2 = times(2, m235()) +... me_times3 = times(3, m235()) +... me_times5 = times(5, m235()) +... for i in merge(merge(me_times2, +... me_times3), +... me_times5): +... yield i + +Don't print "too many" of these -- the implementation above is extremely +inefficient: each call of m235() leads to 3 recursive calls, and in +turn each of those 3 more, and so on, and so on, until we've descended +enough levels to satisfy the print stmts. Very odd: when I printed 5 +lines of results below, this managed to screw up Win98's malloc in "the +usual" way, i.e. the heap grew over 4Mb so Win98 started fragmenting +address space, and it *looked* like a very slow leak. + +>>> result = m235() +>>> for i in range(3): +... print firstn(result, 15) +[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24] +[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80] +[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192] + +Heh. Here's one way to get a shared list, complete with an excruciating +namespace renaming trick. The *pretty* part is that the times() and merge() +functions can be reused as-is, because they only assume their stream +arguments are iterable -- a LazyList is the same as a generator to times(). + +>>> class LazyList: +... def __init__(self, g): +... self.sofar = [] +... self.fetch = g.next +... +... def __getitem__(self, i): +... sofar, fetch = self.sofar, self.fetch +... while i >= len(sofar): +... sofar.append(fetch()) +... return sofar[i] + +>>> def m235(): +... yield 1 +... # Gack: m235 below actually refers to a LazyList. +... me_times2 = times(2, m235) +... me_times3 = times(3, m235) +... me_times5 = times(5, m235) +... for i in merge(merge(me_times2, +... me_times3), +... me_times5): +... yield i + +Print as many of these as you like -- *this* implementation is memory- +efficient. + +>>> m235 = LazyList(m235()) +>>> for i in range(5): +... print [m235[j] for j in range(15*i, 15*(i+1))] +[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24] +[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80] +[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192] +[200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384] +[400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675] + + +Ye olde Fibonacci generator, LazyList style. + +>>> def fibgen(a, b): +... +... def sum(g, h): +... while 1: +... yield g.next() + h.next() +... +... def tail(g): +... g.next() # throw first away +... for x in g: +... yield x +... +... yield a +... yield b +... for s in sum(iter(fib), +... tail(iter(fib))): +... yield s + +>>> fib = LazyList(fibgen(1, 2)) +>>> firstn(iter(fib), 17) +[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584] +""" + +# syntax_tests mostly provokes SyntaxErrors. Also fiddling with #if 0 +# hackery. + +syntax_tests = """ + +>>> def f(): +... return 22 +... yield 1 +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 2) + +>>> def f(): +... yield 1 +... return 22 +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 3) + +"return None" is not the same as "return" in a generator: + +>>> def f(): +... yield 1 +... return None +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 3) + +This one is fine: + +>>> def f(): +... yield 1 +... return + +>>> def f(): +... try: +... yield 1 +... finally: +... pass +Traceback (most recent call last): + ... +SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (, line 3) + +>>> def f(): +... try: +... try: +... 1//0 +... except ZeroDivisionError: +... yield 666 # bad because *outer* try has finally +... except: +... pass +... finally: +... pass +Traceback (most recent call last): + ... +SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (, line 6) + +But this is fine: + +>>> def f(): +... try: +... try: +... yield 12 +... 1//0 +... except ZeroDivisionError: +... yield 666 +... except: +... try: +... x = 12 +... finally: +... yield 12 +... except: +... return +>>> list(f()) +[12, 666] + +>>> def f(): +... yield +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> def f(): +... if 0: +... yield +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> def f(): +... if 0: +... yield 1 +>>> type(f()) + + +>>> def f(): +... if "": +... yield None +>>> type(f()) + + +>>> def f(): +... return +... try: +... if x==4: +... pass +... elif 0: +... try: +... 1//0 +... except SyntaxError: +... pass +... else: +... if 0: +... while 12: +... x += 1 +... yield 2 # don't blink +... f(a, b, c, d, e) +... else: +... pass +... except: +... x = 1 +... return +>>> type(f()) + + +>>> def f(): +... if 0: +... def g(): +... yield 1 +... +>>> type(f()) + + +>>> def f(): +... if 0: +... class C: +... def __init__(self): +... yield 1 +... def f(self): +... yield 2 +>>> type(f()) + + +>>> def f(): +... if 0: +... return +... if 0: +... yield 2 +>>> type(f()) + + + +>>> def f(): +... if 0: +... lambda x: x # shouldn't trigger here +... return # or here +... def f(i): +... return 2*i # or here +... if 0: +... return 3 # but *this* sucks (line 8) +... if 0: +... yield 2 # because it's a generator +Traceback (most recent call last): +SyntaxError: 'return' with argument inside generator (, line 8) + +This one caused a crash (see SF bug 567538): + +>>> def f(): +... for i in range(3): +... try: +... continue +... finally: +... yield i +... +>>> g = f() +>>> print g.next() +0 +>>> print g.next() +1 +>>> print g.next() +2 +>>> print g.next() +Traceback (most recent call last): +StopIteration +""" + +# conjoin is a simple backtracking generator, named in honor of Icon's +# "conjunction" control structure. Pass a list of no-argument functions +# that return iterable objects. Easiest to explain by example: assume the +# function list [x, y, z] is passed. Then conjoin acts like: +# +# def g(): +# values = [None] * 3 +# for values[0] in x(): +# for values[1] in y(): +# for values[2] in z(): +# yield values +# +# So some 3-lists of values *may* be generated, each time we successfully +# get into the innermost loop. If an iterator fails (is exhausted) before +# then, it "backtracks" to get the next value from the nearest enclosing +# iterator (the one "to the left"), and starts all over again at the next +# slot (pumps a fresh iterator). Of course this is most useful when the +# iterators have side-effects, so that which values *can* be generated at +# each slot depend on the values iterated at previous slots. + +def conjoin(gs): + + values = [None] * len(gs) + + def gen(i, values=values): + if i >= len(gs): + yield values + else: + for values[i] in gs[i](): + for x in gen(i+1): + yield x + + for x in gen(0): + yield x + +# That works fine, but recursing a level and checking i against len(gs) for +# each item produced is inefficient. By doing manual loop unrolling across +# generator boundaries, it's possible to eliminate most of that overhead. +# This isn't worth the bother *in general* for generators, but conjoin() is +# a core building block for some CPU-intensive generator applications. + +def conjoin(gs): + + n = len(gs) + values = [None] * n + + # Do one loop nest at time recursively, until the # of loop nests + # remaining is divisible by 3. + + def gen(i, values=values): + if i >= n: + yield values + + elif (n-i) % 3: + ip1 = i+1 + for values[i] in gs[i](): + for x in gen(ip1): + yield x + + else: + for x in _gen3(i): + yield x + + # Do three loop nests at a time, recursing only if at least three more + # remain. Don't call directly: this is an internal optimization for + # gen's use. + + def _gen3(i, values=values): + assert i < n and (n-i) % 3 == 0 + ip1, ip2, ip3 = i+1, i+2, i+3 + g, g1, g2 = gs[i : ip3] + + if ip3 >= n: + # These are the last three, so we can yield values directly. + for values[i] in g(): + for values[ip1] in g1(): + for values[ip2] in g2(): + yield values + + else: + # At least 6 loop nests remain; peel off 3 and recurse for the + # rest. + for values[i] in g(): + for values[ip1] in g1(): + for values[ip2] in g2(): + for x in _gen3(ip3): + yield x + + for x in gen(0): + yield x + +# And one more approach: For backtracking apps like the Knight's Tour +# solver below, the number of backtracking levels can be enormous (one +# level per square, for the Knight's Tour, so that e.g. a 100x100 board +# needs 10,000 levels). In such cases Python is likely to run out of +# stack space due to recursion. So here's a recursion-free version of +# conjoin too. +# NOTE WELL: This allows large problems to be solved with only trivial +# demands on stack space. Without explicitly resumable generators, this is +# much harder to achieve. OTOH, this is much slower (up to a factor of 2) +# than the fancy unrolled recursive conjoin. + +def flat_conjoin(gs): # rename to conjoin to run tests with this instead + n = len(gs) + values = [None] * n + iters = [None] * n + _StopIteration = StopIteration # make local because caught a *lot* + i = 0 + while 1: + # Descend. + try: + while i < n: + it = iters[i] = gs[i]().next + values[i] = it() + i += 1 + except _StopIteration: + pass + else: + assert i == n + yield values + + # Backtrack until an older iterator can be resumed. + i -= 1 + while i >= 0: + try: + values[i] = iters[i]() + # Success! Start fresh at next level. + i += 1 + break + except _StopIteration: + # Continue backtracking. + i -= 1 + else: + assert i < 0 + break + +# A conjoin-based N-Queens solver. + +class Queens: + def __init__(self, n): + self.n = n + rangen = range(n) + + # Assign a unique int to each column and diagonal. + # columns: n of those, range(n). + # NW-SE diagonals: 2n-1 of these, i-j unique and invariant along + # each, smallest i-j is 0-(n-1) = 1-n, so add n-1 to shift to 0- + # based. + # NE-SW diagonals: 2n-1 of these, i+j unique and invariant along + # each, smallest i+j is 0, largest is 2n-2. + + # For each square, compute a bit vector of the columns and + # diagonals it covers, and for each row compute a function that + # generates the possiblities for the columns in that row. + self.rowgenerators = [] + for i in rangen: + rowuses = [(1L << j) | # column ordinal + (1L << (n + i-j + n-1)) | # NW-SE ordinal + (1L << (n + 2*n-1 + i+j)) # NE-SW ordinal + for j in rangen] + + def rowgen(rowuses=rowuses): + for j in rangen: + uses = rowuses[j] + if uses & self.used == 0: + self.used |= uses + yield j + self.used &= ~uses + + self.rowgenerators.append(rowgen) + + # Generate solutions. + def solve(self): + self.used = 0 + for row2col in conjoin(self.rowgenerators): + yield row2col + + def printsolution(self, row2col): + n = self.n + assert n == len(row2col) + sep = "+" + "-+" * n + print sep + for i in range(n): + squares = [" " for j in range(n)] + squares[row2col[i]] = "Q" + print "|" + "|".join(squares) + "|" + print sep + +# A conjoin-based Knight's Tour solver. This is pretty sophisticated +# (e.g., when used with flat_conjoin above, and passing hard=1 to the +# constructor, a 200x200 Knight's Tour was found quickly -- note that we're +# creating 10s of thousands of generators then!), and is lengthy. + +class Knights: + def __init__(self, m, n, hard=0): + self.m, self.n = m, n + + # solve() will set up succs[i] to be a list of square #i's + # successors. + succs = self.succs = [] + + # Remove i0 from each of its successor's successor lists, i.e. + # successors can't go back to i0 again. Return 0 if we can + # detect this makes a solution impossible, else return 1. + + def remove_from_successors(i0, len=len): + # If we remove all exits from a free square, we're dead: + # even if we move to it next, we can't leave it again. + # If we create a square with one exit, we must visit it next; + # else somebody else will have to visit it, and since there's + # only one adjacent, there won't be a way to leave it again. + # Finelly, if we create more than one free square with a + # single exit, we can only move to one of them next, leaving + # the other one a dead end. + ne0 = ne1 = 0 + for i in succs[i0]: + s = succs[i] + s.remove(i0) + e = len(s) + if e == 0: + ne0 += 1 + elif e == 1: + ne1 += 1 + return ne0 == 0 and ne1 < 2 + + # Put i0 back in each of its successor's successor lists. + + def add_to_successors(i0): + for i in succs[i0]: + succs[i].append(i0) + + # Generate the first move. + def first(): + if m < 1 or n < 1: + return + + # Since we're looking for a cycle, it doesn't matter where we + # start. Starting in a corner makes the 2nd move easy. + corner = self.coords2index(0, 0) + remove_from_successors(corner) + self.lastij = corner + yield corner + add_to_successors(corner) + + # Generate the second moves. + def second(): + corner = self.coords2index(0, 0) + assert self.lastij == corner # i.e., we started in the corner + if m < 3 or n < 3: + return + assert len(succs[corner]) == 2 + assert self.coords2index(1, 2) in succs[corner] + assert self.coords2index(2, 1) in succs[corner] + # Only two choices. Whichever we pick, the other must be the + # square picked on move m*n, as it's the only way to get back + # to (0, 0). Save its index in self.final so that moves before + # the last know it must be kept free. + for i, j in (1, 2), (2, 1): + this = self.coords2index(i, j) + final = self.coords2index(3-i, 3-j) + self.final = final + + remove_from_successors(this) + succs[final].append(corner) + self.lastij = this + yield this + succs[final].remove(corner) + add_to_successors(this) + + # Generate moves 3 thru m*n-1. + def advance(len=len): + # If some successor has only one exit, must take it. + # Else favor successors with fewer exits. + candidates = [] + for i in succs[self.lastij]: + e = len(succs[i]) + assert e > 0, "else remove_from_successors() pruning flawed" + if e == 1: + candidates = [(e, i)] + break + candidates.append((e, i)) + else: + candidates.sort() + + for e, i in candidates: + if i != self.final: + if remove_from_successors(i): + self.lastij = i + yield i + add_to_successors(i) + + # Generate moves 3 thru m*n-1. Alternative version using a + # stronger (but more expensive) heuristic to order successors. + # Since the # of backtracking levels is m*n, a poor move early on + # can take eons to undo. Smallest square board for which this + # matters a lot is 52x52. + def advance_hard(vmid=(m-1)/2.0, hmid=(n-1)/2.0, len=len): + # If some successor has only one exit, must take it. + # Else favor successors with fewer exits. + # Break ties via max distance from board centerpoint (favor + # corners and edges whenever possible). + candidates = [] + for i in succs[self.lastij]: + e = len(succs[i]) + assert e > 0, "else remove_from_successors() pruning flawed" + if e == 1: + candidates = [(e, 0, i)] + break + i1, j1 = self.index2coords(i) + d = (i1 - vmid)**2 + (j1 - hmid)**2 + candidates.append((e, -d, i)) + else: + candidates.sort() + + for e, d, i in candidates: + if i != self.final: + if remove_from_successors(i): + self.lastij = i + yield i + add_to_successors(i) + + # Generate the last move. + def last(): + assert self.final in succs[self.lastij] + yield self.final + + if m*n < 4: + self.squaregenerators = [first] + else: + self.squaregenerators = [first, second] + \ + [hard and advance_hard or advance] * (m*n - 3) + \ + [last] + + def coords2index(self, i, j): + assert 0 <= i < self.m + assert 0 <= j < self.n + return i * self.n + j + + def index2coords(self, index): + assert 0 <= index < self.m * self.n + return divmod(index, self.n) + + def _init_board(self): + succs = self.succs + del succs[:] + m, n = self.m, self.n + c2i = self.coords2index + + offsets = [( 1, 2), ( 2, 1), ( 2, -1), ( 1, -2), + (-1, -2), (-2, -1), (-2, 1), (-1, 2)] + rangen = range(n) + for i in range(m): + for j in rangen: + s = [c2i(i+io, j+jo) for io, jo in offsets + if 0 <= i+io < m and + 0 <= j+jo < n] + succs.append(s) + + # Generate solutions. + def solve(self): + self._init_board() + for x in conjoin(self.squaregenerators): + yield x + + def printsolution(self, x): + m, n = self.m, self.n + assert len(x) == m*n + w = len(str(m*n)) + format = "%" + str(w) + "d" + + squares = [[None] * n for i in range(m)] + k = 1 + for i in x: + i1, j1 = self.index2coords(i) + squares[i1][j1] = format % k + k += 1 + + sep = "+" + ("-" * w + "+") * n + print sep + for i in range(m): + row = squares[i] + print "|" + "|".join(row) + "|" + print sep + +conjoin_tests = """ + +Generate the 3-bit binary numbers in order. This illustrates dumbest- +possible use of conjoin, just to generate the full cross-product. + +>>> for c in conjoin([lambda: iter((0, 1))] * 3): +... print c +[0, 0, 0] +[0, 0, 1] +[0, 1, 0] +[0, 1, 1] +[1, 0, 0] +[1, 0, 1] +[1, 1, 0] +[1, 1, 1] + +For efficiency in typical backtracking apps, conjoin() yields the same list +object each time. So if you want to save away a full account of its +generated sequence, you need to copy its results. + +>>> def gencopy(iterator): +... for x in iterator: +... yield x[:] + +>>> for n in range(10): +... all = list(gencopy(conjoin([lambda: iter((0, 1))] * n))) +... print n, len(all), all[0] == [0] * n, all[-1] == [1] * n +0 1 1 1 +1 2 1 1 +2 4 1 1 +3 8 1 1 +4 16 1 1 +5 32 1 1 +6 64 1 1 +7 128 1 1 +8 256 1 1 +9 512 1 1 + +And run an 8-queens solver. + +>>> q = Queens(8) +>>> LIMIT = 2 +>>> count = 0 +>>> for row2col in q.solve(): +... count += 1 +... if count <= LIMIT: +... print "Solution", count +... q.printsolution(row2col) +Solution 1 ++-+-+-+-+-+-+-+-+ +|Q| | | | | | | | ++-+-+-+-+-+-+-+-+ +| | | | |Q| | | | ++-+-+-+-+-+-+-+-+ +| | | | | | | |Q| ++-+-+-+-+-+-+-+-+ +| | | | | |Q| | | ++-+-+-+-+-+-+-+-+ +| | |Q| | | | | | ++-+-+-+-+-+-+-+-+ +| | | | | | |Q| | ++-+-+-+-+-+-+-+-+ +| |Q| | | | | | | ++-+-+-+-+-+-+-+-+ +| | | |Q| | | | | ++-+-+-+-+-+-+-+-+ +Solution 2 ++-+-+-+-+-+-+-+-+ +|Q| | | | | | | | ++-+-+-+-+-+-+-+-+ +| | | | | |Q| | | ++-+-+-+-+-+-+-+-+ +| | | | | | | |Q| ++-+-+-+-+-+-+-+-+ +| | |Q| | | | | | ++-+-+-+-+-+-+-+-+ +| | | | | | |Q| | ++-+-+-+-+-+-+-+-+ +| | | |Q| | | | | ++-+-+-+-+-+-+-+-+ +| |Q| | | | | | | ++-+-+-+-+-+-+-+-+ +| | | | |Q| | | | ++-+-+-+-+-+-+-+-+ + +>>> print count, "solutions in all." +92 solutions in all. + +And run a Knight's Tour on a 10x10 board. Note that there are about +20,000 solutions even on a 6x6 board, so don't dare run this to exhaustion. + +>>> k = Knights(10, 10) +>>> LIMIT = 2 +>>> count = 0 +>>> for x in k.solve(): +... count += 1 +... if count <= LIMIT: +... print "Solution", count +... k.printsolution(x) +... else: +... break +Solution 1 ++---+---+---+---+---+---+---+---+---+---+ +| 1| 58| 27| 34| 3| 40| 29| 10| 5| 8| ++---+---+---+---+---+---+---+---+---+---+ +| 26| 35| 2| 57| 28| 33| 4| 7| 30| 11| ++---+---+---+---+---+---+---+---+---+---+ +| 59|100| 73| 36| 41| 56| 39| 32| 9| 6| ++---+---+---+---+---+---+---+---+---+---+ +| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31| ++---+---+---+---+---+---+---+---+---+---+ +| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50| ++---+---+---+---+---+---+---+---+---+---+ +| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13| ++---+---+---+---+---+---+---+---+---+---+ +| 87| 98| 91| 80| 77| 84| 53| 46| 65| 44| ++---+---+---+---+---+---+---+---+---+---+ +| 90| 23| 88| 95| 70| 79| 68| 83| 14| 17| ++---+---+---+---+---+---+---+---+---+---+ +| 97| 92| 21| 78| 81| 94| 19| 16| 45| 66| ++---+---+---+---+---+---+---+---+---+---+ +| 22| 89| 96| 93| 20| 69| 82| 67| 18| 15| ++---+---+---+---+---+---+---+---+---+---+ +Solution 2 ++---+---+---+---+---+---+---+---+---+---+ +| 1| 58| 27| 34| 3| 40| 29| 10| 5| 8| ++---+---+---+---+---+---+---+---+---+---+ +| 26| 35| 2| 57| 28| 33| 4| 7| 30| 11| ++---+---+---+---+---+---+---+---+---+---+ +| 59|100| 73| 36| 41| 56| 39| 32| 9| 6| ++---+---+---+---+---+---+---+---+---+---+ +| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31| ++---+---+---+---+---+---+---+---+---+---+ +| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50| ++---+---+---+---+---+---+---+---+---+---+ +| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13| ++---+---+---+---+---+---+---+---+---+---+ +| 87| 98| 89| 80| 77| 84| 53| 46| 65| 44| ++---+---+---+---+---+---+---+---+---+---+ +| 90| 23| 92| 95| 70| 79| 68| 83| 14| 17| ++---+---+---+---+---+---+---+---+---+---+ +| 97| 88| 21| 78| 81| 94| 19| 16| 45| 66| ++---+---+---+---+---+---+---+---+---+---+ +| 22| 91| 96| 93| 20| 69| 82| 67| 18| 15| ++---+---+---+---+---+---+---+---+---+---+ +""" + +__test__ = {"tut": tutorial_tests, + "pep": pep_tests, + "email": email_tests, + "fun": fun_tests, + "syntax": syntax_tests, + "conjoin": conjoin_tests} + +# Magic test name that regrtest.py invokes *after* importing this module. +# This worms around a bootstrap problem. +# Note that doctest and regrtest both look in sys.argv for a "-v" argument, +# so this works as expected in both ways of running regrtest. +def test_main(verbose=None): + import doctest, test_support, test_generators + if 0: # change to 1 to run forever (to check for leaks) + while 1: + doctest.master = None + test_support.run_doctest(test_generators, verbose) + print ".", + else: + test_support.run_doctest(test_generators, verbose) + +# This part isn't needed for regrtest, but for running the test directly. +if __name__ == "__main__": + test_main(1) diff --git a/lib-python/2.2/test/test_getargs.py b/lib-python/2.2/test/test_getargs.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_getargs.py @@ -0,0 +1,21 @@ +"""Test the internal getargs.c implementation + + PyArg_ParseTuple() is defined here. + +The test here is not intended to test all of the module, just the +single case that failed between 2.1 and 2.2a2. +""" + +# marshal.loads() uses PyArg_ParseTuple(args, "s#:loads") +# The s code will cause a Unicode conversion to occur. This test +# verify that the error is propagated properly from the C code back to +# Python. + +# XXX If the encoding succeeds using the current default encoding, +# this test will fail because it does not test the right part of the +# PyArg_ParseTuple() implementation. +import marshal +try: + marshal.loads(u"\222") +except UnicodeError: + pass diff --git a/lib-python/2.2/test/test_getopt.py b/lib-python/2.2/test/test_getopt.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_getopt.py @@ -0,0 +1,110 @@ +# test_getopt.py +# David Goodger 2000-08-19 + +import getopt +from getopt import GetoptError +from test_support import verify, verbose + +def expectException(teststr, expected, failure=AssertionError): + """Executes a statement passed in teststr, and raises an exception + (failure) if the expected exception is *not* raised.""" + try: + exec teststr + except expected: + pass + else: + raise failure + +if verbose: + print 'Running tests on getopt.short_has_arg' +verify(getopt.short_has_arg('a', 'a:')) +verify(not getopt.short_has_arg('a', 'a')) +expectException("tmp = getopt.short_has_arg('a', 'b')", GetoptError) +expectException("tmp = getopt.short_has_arg('a', '')", GetoptError) + +if verbose: + print 'Running tests on getopt.long_has_args' +has_arg, option = getopt.long_has_args('abc', ['abc=']) +verify(has_arg) +verify(option == 'abc') +has_arg, option = getopt.long_has_args('abc', ['abc']) +verify(not has_arg) +verify(option == 'abc') +has_arg, option = getopt.long_has_args('abc', ['abcd']) +verify(not has_arg) +verify(option == 'abcd') +expectException("has_arg, option = getopt.long_has_args('abc', ['def'])", + GetoptError) +expectException("has_arg, option = getopt.long_has_args('abc', [])", + GetoptError) +expectException("has_arg, option = " + \ + "getopt.long_has_args('abc', ['abcd','abcde'])", + GetoptError) + +if verbose: + print 'Running tests on getopt.do_shorts' +opts, args = getopt.do_shorts([], 'a', 'a', []) +verify(opts == [('-a', '')]) +verify(args == []) +opts, args = getopt.do_shorts([], 'a1', 'a:', []) +verify(opts == [('-a', '1')]) +verify(args == []) +#opts, args = getopt.do_shorts([], 'a=1', 'a:', []) +#verify(opts == [('-a', '1')]) +#verify(args == []) +opts, args = getopt.do_shorts([], 'a', 'a:', ['1']) +verify(opts == [('-a', '1')]) +verify(args == []) +opts, args = getopt.do_shorts([], 'a', 'a:', ['1', '2']) +verify(opts == [('-a', '1')]) +verify(args == ['2']) +expectException("opts, args = getopt.do_shorts([], 'a1', 'a', [])", + GetoptError) +expectException("opts, args = getopt.do_shorts([], 'a', 'a:', [])", + GetoptError) + +if verbose: + print 'Running tests on getopt.do_longs' +opts, args = getopt.do_longs([], 'abc', ['abc'], []) +verify(opts == [('--abc', '')]) +verify(args == []) +opts, args = getopt.do_longs([], 'abc=1', ['abc='], []) +verify(opts == [('--abc', '1')]) +verify(args == []) +opts, args = getopt.do_longs([], 'abc=1', ['abcd='], []) +verify(opts == [('--abcd', '1')]) +verify(args == []) +opts, args = getopt.do_longs([], 'abc', ['ab', 'abc', 'abcd'], []) +verify(opts == [('--abc', '')]) +verify(args == []) +# Much like the preceding, except with a non-alpha character ("-") in +# option name that precedes "="; failed in +# http://sourceforge.net/bugs/?func=detailbug&bug_id=126863&group_id=5470 +opts, args = getopt.do_longs([], 'foo=42', ['foo-bar', 'foo=',], []) +verify(opts == [('--foo', '42')]) +verify(args == []) +expectException("opts, args = getopt.do_longs([], 'abc=1', ['abc'], [])", + GetoptError) +expectException("opts, args = getopt.do_longs([], 'abc', ['abc='], [])", + GetoptError) + +# note: the empty string between '-a' and '--beta' is significant: +# it simulates an empty string option argument ('-a ""') on the command line. +cmdline = ['-a', '1', '-b', '--alpha=2', '--beta', '-a', '3', '-a', '', + '--beta', 'arg1', 'arg2'] + +if verbose: + print 'Running tests on getopt.getopt' +opts, args = getopt.getopt(cmdline, 'a:b', ['alpha=', 'beta']) +verify(opts == [('-a', '1'), ('-b', ''), ('--alpha', '2'), ('--beta', ''), + ('-a', '3'), ('-a', ''), ('--beta', '')] ) +# Note ambiguity of ('-b', '') and ('-a', '') above. This must be +# accounted for in the code that calls getopt(). +verify(args == ['arg1', 'arg2']) + +expectException( + "opts, args = getopt.getopt(cmdline, 'a:b', ['alpha', 'beta'])", + GetoptError) + +if verbose: + print "Module getopt: tests completed successfully." diff --git a/lib-python/2.2/test/test_gettext.py b/lib-python/2.2/test/test_gettext.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_gettext.py @@ -0,0 +1,200 @@ +import os +import base64 +import gettext + + +def test_api_1(localedir, mofile): + print 'test api 1' + + # Test basic interface + os.environ['LANGUAGE'] = 'xx' + + print 'installing gettext' + gettext.install('gettext', localedir) + + # test some translations + print _('albatross') + print _(u'mullusk') + print _(r'Raymond Luxury Yach-t') + print _(ur'nudge nudge') + + # double quotes + print _("albatross") + print _(u"mullusk") + print _(r"Raymond Luxury Yach-t") + print _(ur"nudge nudge") + + # triple single quotes + print _('''albatross''') + print _(u'''mullusk''') + print _(r'''Raymond Luxury Yach-t''') + print _(ur'''nudge nudge''') + + # triple double quotes + print _("""albatross""") + print _(u"""mullusk""") + print _(r"""Raymond Luxury Yach-t""") + print _(ur"""nudge nudge""") + + # multiline strings + print _('''This module provides internationalization and localization +support for your Python programs by providing an interface to the GNU +gettext message catalog library.''') + + # test the alternative interface + fp = open(os.path.join(mofile), 'rb') + t = gettext.GNUTranslations(fp) + fp.close() + + t.install() + + print _('nudge nudge') + + # try unicode return type + t.install(unicode=1) + + print _('mullusk') + + + +def test_api_2(localedir, mofile): + print 'test api 2' + + gettext.bindtextdomain('gettext', localedir) + print gettext.bindtextdomain('gettext') == localedir + + gettext.textdomain('gettext') + # should return 'gettext' + print gettext.textdomain() + + # local function override builtin + _ = gettext.gettext + + # test some translations + print _('albatross') + print _(u'mullusk') + print _(r'Raymond Luxury Yach-t') + print _(ur'nudge nudge') + + # double quotes + print _("albatross") + print _(u"mullusk") + print _(r"Raymond Luxury Yach-t") + print _(ur"nudge nudge") + + # triple single quotes + print _('''albatross''') + print _(u'''mullusk''') + print _(r'''Raymond Luxury Yach-t''') + print _(ur'''nudge nudge''') + + # triple double quotes + print _("""albatross""") + print _(u"""mullusk""") + print _(r"""Raymond Luxury Yach-t""") + print _(ur"""nudge nudge""") + + # multiline strings + print _('''This module provides internationalization and localization +support for your Python programs by providing an interface to the GNU +gettext message catalog library.''') + + # Now test dgettext() + def _(message): + return gettext.dgettext('gettext') + + + +GNU_MO_DATA = '''\ +3hIElQAAAAAFAAAAHAAAAEQAAAAHAAAAbAAAAAAAAACIAAAAFQAAAIkAAAChAAAAnwAAAAcAAABB +AQAACwAAAEkBAAAZAQAAVQEAABYAAABvAgAAoQAAAIYCAAAFAAAAKAMAAAkAAAAuAwAAAQAAAAQA +AAACAAAAAAAAAAUAAAAAAAAAAwAAAABSYXltb25kIEx1eHVyeSBZYWNoLXQAVGhpcyBtb2R1bGUg +cHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsaXphdGlvbgpzdXBwb3J0IGZv +ciB5b3VyIFB5dGhvbiBwcm9ncmFtcyBieSBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBH +TlUKZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4AbXVsbHVzawBudWRnZSBudWRnZQBQ +cm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1SZXZpc2lvbi1EYXRlOiAyMDAwLTA4LTI5IDEyOjE5 +LTA0OjAwCkxhc3QtVHJhbnNsYXRvcjogQmFycnkgQS4gV2Fyc2F3IDxiYXJyeUBweXRob24ub3Jn +PgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpNSU1FLVZlcnNpb246 +IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9a29pOF9yCkNvbnRlbnQtVHJh +bnNmZXItRW5jb2Rpbmc6IG5vbmUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4xCgBUaHJv +YXR3b2JibGVyIE1hbmdyb3ZlAEd1dmYgemJxaHlyIGNlYml2cXJmIHZhZ3JlYW5ndmJhbnl2bW5n +dmJhIG5hcSB5YnBueXZtbmd2YmEKZmhjY2JlZyBzYmUgbGJoZSBDbGd1YmEgY2VidGVuemYgb2wg +Y2ViaXZxdmF0IG5hIHZhZ3Jlc25wciBnYiBndXIgVEFICnRyZ2dya2cgenJmZm50ciBwbmdueWJ0 +IHl2b2VuZWwuAGJhY29uAHdpbmsgd2luawA= +''' + + +LOCALEDIR = os.path.join('xx', 'LC_MESSAGES') +MOFILE = os.path.join(LOCALEDIR, 'gettext.mo') + +def setup(): + os.makedirs(LOCALEDIR) + fp = open(MOFILE, 'wb') + fp.write(base64.decodestring(GNU_MO_DATA)) + fp.close() + +def teardown(): + os.unlink(MOFILE) + os.removedirs(LOCALEDIR) + + +try: + setup() + test_api_1(os.curdir, MOFILE) + test_api_2(os.curdir, MOFILE) +finally: + teardown() + pass + + + +# For reference, here's the .po file used to created the .mo data above. + +''' +# Dummy translation for Python's test_gettext.py module. +# Copyright (C) 2001 Python Software Foundation +# Barry Warsaw , 2000. +# +msgid "" +msgstr "" +"Project-Id-Version: 2.0\n" +"PO-Revision-Date: 2000-08-29 12:19-04:00\n" +"Last-Translator: Barry A. Warsaw \n" +"Language-Team: XX \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8_r\n" +"Content-Transfer-Encoding: none\n" +"Generated-By: pygettext.py 1.1\n" + +#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37 +#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92 +#: test_gettext.py:98 +msgid "nudge nudge" +msgstr "wink wink" + +#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34 +#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95 +msgid "albatross" +msgstr "" + +#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36 +#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97 +msgid "Raymond Luxury Yach-t" +msgstr "Throatwobbler Mangrove" + +#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35 +#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90 +#: test_gettext.py:96 +msgid "mullusk" +msgstr "bacon" + +#: test_gettext.py:40 test_gettext.py:101 +msgid "" +"This module provides internationalization and localization\n" +"support for your Python programs by providing an interface to the GNU\n" +"gettext message catalog library." +msgstr "" +"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n" +"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n" +"trggrkg zrffntr pngnybt yvoenel." +''' diff --git a/lib-python/2.2/test/test_gl.py b/lib-python/2.2/test/test_gl.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_gl.py @@ -0,0 +1,150 @@ +#! /usr/bin/env python +"""Very simple test script for the SGI gl library extension module + taken mostly from the documentation. + Roger E. Masse +""" +from test_support import verbose, TestSkipped +import gl, GL, time + +glattrs = ['RGBcolor', 'RGBcursor', 'RGBmode', 'RGBrange', 'RGBwritemask', +'__doc__', '__name__', 'addtopup', 'altgetmatrix', 'arc', 'arcf', +'arcfi', 'arcfs', 'arci', 'arcs', 'attachcursor', 'backbuffer', +'backface', 'bbox2', 'bbox2i', 'bbox2s', 'bgnclosedline', 'bgnline', +'bgnpoint', 'bgnpolygon', 'bgnsurface', 'bgntmesh', 'bgntrim', +'blankscreen', 'blanktime', 'blendfunction', 'blink', 'c3f', 'c3i', +'c3s', 'c4f', 'c4i', 'c4s', 'callobj', 'charstr', 'chunksize', 'circ', +'circf', 'circfi', 'circfs', 'circi', 'circs', 'clear', +'clearhitcode', 'clkoff', 'clkon', 'closeobj', 'cmode', 'cmov', +'cmov2', 'cmov2i', 'cmov2s', 'cmovi', 'cmovs', 'color', 'colorf', +'compactify', 'concave', 'cpack', 'crv', 'crvn', 'curorigin', +'cursoff', 'curson', 'curstype', 'curvebasis', 'curveit', +'curveprecision', 'cyclemap', 'czclear', 'defbasis', 'defcursor', +'deflinestyle', 'delobj', 'deltag', 'depthcue', 'devport', 'dglclose', +'dglopen', 'dither', 'dopup', 'doublebuffer', 'draw', 'draw2', +'draw2i', 'draw2s', 'drawi', 'drawmode', 'draws', 'editobj', +'endclosedline', 'endfullscrn', 'endline', 'endpick', 'endpoint', +'endpolygon', 'endpupmode', 'endselect', 'endsurface', 'endtmesh', +'endtrim', 'finish', 'font', 'foreground', 'freepup', 'frontbuffer', +'fudge', 'fullscrn', 'gRGBcolor', 'gRGBmask', 'gammaramp', 'gbegin', +'gconfig', 'genobj', 'gentag', 'getbackface', 'getbuffer', +'getbutton', 'getcmmode', 'getcolor', 'getcpos', 'getcursor', +'getdcm', 'getdepth', 'getdescender', 'getdisplaymode', 'getdrawmode', +'getfont', 'getgdesc', 'getgpos', 'getheight', 'gethitcode', +'getlsbackup', 'getlsrepeat', 'getlstyle', 'getlwidth', 'getmap', +'getmatrix', 'getmcolor', 'getmmode', 'getmonitor', +'getnurbsproperty', 'getopenobj', 'getorigin', 'getothermonitor', +'getpattern', 'getplanes', 'getport', 'getresetls', 'getscrmask', +'getshade', 'getsize', 'getsm', 'gettp', 'getvaluator', 'getvideo', +'getviewport', 'getwritemask', 'getzbuffer', 'gewrite', 'gflush', +'ginit', 'glcompat', 'greset', 'gselect', 'gsync', 'gversion', +'iconsize', 'icontitle', 'imakebackground', 'initnames', 'ismex', +'isobj', 'isqueued', 'istag', 'keepaspect', 'lRGBrange', 'lampoff', +'lampon', 'linesmooth', 'linewidth', 'lmbind', 'lmcolor', 'lmdef', +'loadmatrix', 'loadname', 'logicop', 'lookat', 'lrectread', +'lrectwrite', 'lsbackup', 'lsetdepth', 'lshaderange', 'lsrepeat', +'makeobj', 'maketag', 'mapcolor', 'mapw', 'mapw2', 'maxsize', +'minsize', 'mmode', 'move', 'move2', 'move2i', 'move2s', 'movei', +'moves', 'multimap', 'multmatrix', 'n3f', 'newpup', 'newtag', +'noborder', 'noise', 'noport', 'normal', 'nurbscurve', 'nurbssurface', +'nvarray', 'objdelete', 'objinsert', 'objreplace', 'onemap', 'ortho', +'ortho2', 'overlay', 'packrect', 'pagecolor', 'pagewritemask', +'passthrough', 'patch', 'patchbasis', 'patchcurves', 'patchprecision', +'pclos', 'pdr', 'pdr2', 'pdr2i', 'pdr2s', 'pdri', 'pdrs', +'perspective', 'pick', 'picksize', 'pixmode', 'pmv', 'pmv2', 'pmv2i', +'pmv2s', 'pmvi', 'pmvs', 'pnt', 'pnt2', 'pnt2i', 'pnt2s', 'pnti', +'pnts', 'pntsmooth', 'polarview', 'polf', 'polf2', 'polf2i', 'polf2s', +'polfi', 'polfs', 'poly', 'poly2', 'poly2i', 'poly2s', 'polyi', +'polys', 'popattributes', 'popmatrix', 'popname', 'popviewport', +'prefposition', 'prefsize', 'pupmode', 'pushattributes', 'pushmatrix', +'pushname', 'pushviewport', 'pwlcurve', 'qdevice', 'qenter', 'qgetfd', +'qread', 'qreset', 'qtest', 'rcrv', 'rcrvn', 'rdr', 'rdr2', 'rdr2i', +'rdr2s', 'rdri', 'rdrs', 'readdisplay', 'readsource', 'rect', +'rectcopy', 'rectf', 'rectfi', 'rectfs', 'recti', 'rects', 'rectzoom', +'resetls', 'reshapeviewport', 'ringbell', 'rmv', 'rmv2', 'rmv2i', +'rmv2s', 'rmvi', 'rmvs', 'rot', 'rotate', 'rpatch', 'rpdr', 'rpdr2', +'rpdr2i', 'rpdr2s', 'rpdri', 'rpdrs', 'rpmv', 'rpmv2', 'rpmv2i', +'rpmv2s', 'rpmvi', 'rpmvs', 'sbox', 'sboxf', 'sboxfi', 'sboxfs', +'sboxi', 'sboxs', 'scale', 'screenspace', 'scrmask', 'setbell', +'setcursor', 'setdepth', 'setlinestyle', 'setmap', 'setmonitor', +'setnurbsproperty', 'setpattern', 'setpup', 'setshade', 'setvaluator', +'setvideo', 'shademodel', 'shaderange', 'singlebuffer', 'smoothline', +'spclos', 'splf', 'splf2', 'splf2i', 'splf2s', 'splfi', 'splfs', +'stepunit', 'strwidth', 'subpixel', 'swapbuffers', 'swapinterval', +'swaptmesh', 'swinopen', 'textcolor', 'textinit', 'textport', +'textwritemask', 'tie', 'tpoff', 'tpon', 'translate', 'underlay', +'unpackrect', 'unqdevice', 'v2d', 'v2f', 'v2i', 'v2s', 'v3d', 'v3f', +'v3i', 'v3s', 'v4d', 'v4f', 'v4i', 'v4s', 'varray', 'videocmd', +'viewport', 'vnarray', 'winattach', 'winclose', 'winconstraints', +'windepth', 'window', 'winget', 'winmove', 'winopen', 'winpop', +'winposition', 'winpush', 'winset', 'wintitle', 'wmpack', 'writemask', +'writepixels', 'xfpt', 'xfpt2', 'xfpt2i', 'xfpt2s', 'xfpt4', 'xfpt4i', +'xfpt4s', 'xfpti', 'xfpts', 'zbuffer', 'zclear', 'zdraw', 'zfunction', +'zsource', 'zwritemask'] + +def main(): + # insure that we at least have an X display before continuing. + import os + try: + display = os.environ['DISPLAY'] + except: + raise TestSkipped, "No $DISPLAY -- skipping gl test" + + # touch all the attributes of gl without doing anything + if verbose: + print 'Touching gl module attributes...' + for attr in glattrs: + if verbose: + print 'touching: ', attr + getattr(gl, attr) + + # create a small 'Crisscross' window + if verbose: + print 'Creating a small "CrissCross" window...' + print 'foreground' + gl.foreground() + if verbose: + print 'prefposition' + gl.prefposition(500, 900, 500, 900) + if verbose: + print 'winopen "CrissCross"' + w = gl.winopen('CrissCross') + if verbose: + print 'clear' + gl.clear() + if verbose: + print 'ortho2' + gl.ortho2(0.0, 400.0, 0.0, 400.0) + if verbose: + print 'color WHITE' + gl.color(GL.WHITE) + if verbose: + print 'color RED' + gl.color(GL.RED) + if verbose: + print 'bgnline' + gl.bgnline() + if verbose: + print 'v2f' + gl.v2f(0.0, 0.0) + gl.v2f(400.0, 400.0) + if verbose: + print 'endline' + gl.endline() + if verbose: + print 'bgnline' + gl.bgnline() + if verbose: + print 'v2i' + gl.v2i(400, 0) + gl.v2i(0, 400) + if verbose: + print 'endline' + gl.endline() + if verbose: + print 'Displaying window for 2 seconds...' + time.sleep(2) + if verbose: + print 'winclose' + gl.winclose(w) + +main() diff --git a/lib-python/2.2/test/test_glob.py b/lib-python/2.2/test/test_glob.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_glob.py @@ -0,0 +1,115 @@ +import unittest +from test_support import run_unittest, TESTFN +import glob +import os + +def mkdirs(fname): + if os.path.exists(fname) or fname == '': + return + base, file = os.path.split(fname) + mkdirs(base) + os.mkdir(fname) + +def touchfile(fname): + base, file = os.path.split(fname) + mkdirs(base) + f = open(fname, 'w') + f.close() + +def deltree(fname): + for f in os.listdir(fname): + fullname = os.path.join(fname, f) + if os.path.isdir(fullname): + deltree(fullname) + else: + try: + os.unlink(fullname) + except: + pass + try: + os.rmdir(fname) + except: + pass + + +class GlobTests(unittest.TestCase): + + def norm(self, *parts): + return os.path.normpath(os.path.join(self.tempdir, *parts)) + + def mktemp(self, *parts): + touchfile(self.norm(*parts)) + + def setUp(self): + self.tempdir = TESTFN+"_dir" + self.mktemp('a', 'D') + self.mktemp('aab', 'F') + self.mktemp('aaa', 'zzzF') + self.mktemp('ZZZ') + self.mktemp('a', 'bcd', 'EF') + self.mktemp('a', 'bcd', 'efg', 'ha') + + def tearDown(self): + deltree(self.tempdir) + + def glob(self, *parts): + if len(parts) == 1: + pattern = parts[0] + else: + pattern = os.path.join(*parts) + p = os.path.join(self.tempdir, pattern) + return glob.glob(p) + + def assertSequencesEqual_noorder(self, l1, l2): + l1 = list(l1) + l2 = list(l2) + l1.sort() + l2.sort() + self.assertEqual(l1, l2) + + def test_glob_literal(self): + eq = self.assertSequencesEqual_noorder + np = lambda *f: norm(self.tempdir, *f) + eq(self.glob('a'), [self.norm('a')]) + eq(self.glob('a', 'D'), [self.norm('a', 'D')]) + eq(self.glob('aab'), [self.norm('aab')]) + eq(self.glob('zymurgy'), []) + + def test_glob_one_directory(self): + eq = self.assertSequencesEqual_noorder + np = lambda *f: norm(self.tempdir, *f) + eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa'])) + eq(self.glob('*a'), map(self.norm, ['a', 'aaa'])) + eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab'])) + eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab'])) + eq(self.glob('*q'), []) + + def test_glob_nested_directory(self): + eq = self.assertSequencesEqual_noorder + np = lambda *f: norm(self.tempdir, *f) + if os.path.normcase("abCD") == "abCD": + # case-sensitive filesystem + eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')]) + else: + # case insensitive filesystem + eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'), + self.norm('a', 'bcd', 'efg')]) + eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')]) + + def test_glob_directory_names(self): + eq = self.assertSequencesEqual_noorder + np = lambda *f: norm(self.tempdir, *f) + eq(self.glob('*', 'D'), [self.norm('a', 'D')]) + eq(self.glob('*', '*a'), []) + eq(self.glob('a', '*', '*', '*a'), + [self.norm('a', 'bcd', 'efg', 'ha')]) + eq(self.glob('?a?', '*F'), map(self.norm, [os.path.join('aaa', 'zzzF'), + os.path.join('aab', 'F')])) + + +def test_main(): + run_unittest(GlobTests) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_global.py b/lib-python/2.2/test/test_global.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_global.py @@ -0,0 +1,51 @@ +"""Verify that warnings are issued for global statements following use.""" + +from test_support import check_syntax + +import warnings + +warnings.filterwarnings("error", module="") + +def compile_and_check(text, should_fail=1): + try: + compile(text, "", "exec") + except SyntaxError, msg: + if should_fail: + print "got SyntaxError as expected" + else: + print "raised unexpected SyntaxError:", text + else: + if should_fail: + print "should have raised SyntaxError:", text + else: + print "as expected, no SyntaxError" + +prog_text_1 = """ +def wrong1(): + a = 1 + b = 2 + global a + global b +""" +compile_and_check(prog_text_1) + +prog_text_2 = """ +def wrong2(): + print x + global x +""" +compile_and_check(prog_text_2) + +prog_text_3 = """ +def wrong3(): + print x + x = 2 + global x +""" +compile_and_check(prog_text_3) + +prog_text_4 = """ +global x +x = 2 +""" +compile_and_check(prog_text_4, 0) diff --git a/lib-python/2.2/test/test_grammar.py b/lib-python/2.2/test/test_grammar.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_grammar.py @@ -0,0 +1,732 @@ +# Python test set -- part 1, grammar. +# This just tests whether the parser accepts them all. + +from test_support import * +import sys + +print '1. Parser' + +print '1.1 Tokens' + +print '1.1.1 Backslashes' + +# Backslash means line continuation: +x = 1 \ ++ 1 +if x != 2: raise TestFailed, 'backslash for line continuation' + +# Backslash does not means continuation in comments :\ +x = 0 +if x != 0: raise TestFailed, 'backslash ending comment' + +print '1.1.2 Numeric literals' + +print '1.1.2.1 Plain integers' +if 0xff != 255: raise TestFailed, 'hex int' +if 0377 != 255: raise TestFailed, 'octal int' +if 2147483647 != 017777777777: raise TestFailed, 'large positive int' +try: + from sys import maxint +except ImportError: + maxint = 2147483647 +if maxint == 2147483647: + if -2147483647-1 != 020000000000: raise TestFailed, 'max negative int' + # XXX -2147483648 + if 037777777777 != -1: raise TestFailed, 'oct -1' + if 0xffffffff != -1: raise TestFailed, 'hex -1' + for s in '2147483648', '040000000000', '0x100000000': + try: + x = eval(s) + except OverflowError: + print "OverflowError on huge integer literal " + `s` +elif eval('maxint == 9223372036854775807'): + if eval('-9223372036854775807-1 != 01000000000000000000000'): + raise TestFailed, 'max negative int' + if eval('01777777777777777777777') != -1: raise TestFailed, 'oct -1' + if eval('0xffffffffffffffff') != -1: raise TestFailed, 'hex -1' + for s in '9223372036854775808', '02000000000000000000000', \ + '0x10000000000000000': + try: + x = eval(s) + except OverflowError: + print "OverflowError on huge integer literal " + `s` +else: + print 'Weird maxint value', maxint + +print '1.1.2.2 Long integers' +x = 0L +x = 0l +x = 0xffffffffffffffffL +x = 0xffffffffffffffffl +x = 077777777777777777L +x = 077777777777777777l +x = 123456789012345678901234567890L +x = 123456789012345678901234567890l + +print '1.1.2.3 Floating point' +x = 3.14 +x = 314. +x = 0.314 +# XXX x = 000.314 +x = .314 +x = 3e14 +x = 3E14 +x = 3e-14 +x = 3e+14 +x = 3.e14 +x = .3e14 +x = 3.1e4 + +print '1.1.3 String literals' + +x = ''; y = ""; verify(len(x) == 0 and x == y) +x = '\''; y = "'"; verify(len(x) == 1 and x == y and ord(x) == 39) +x = '"'; y = "\""; verify(len(x) == 1 and x == y and ord(x) == 34) +x = "doesn't \"shrink\" does it" +y = 'doesn\'t "shrink" does it' +verify(len(x) == 24 and x == y) +x = "does \"shrink\" doesn't it" +y = 'does "shrink" doesn\'t it' +verify(len(x) == 24 and x == y) +x = """ +The "quick" +brown fox +jumps over +the 'lazy' dog. +""" +y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n' +verify(x == y) +y = ''' +The "quick" +brown fox +jumps over +the 'lazy' dog. +'''; verify(x == y) +y = "\n\ +The \"quick\"\n\ +brown fox\n\ +jumps over\n\ +the 'lazy' dog.\n\ +"; verify(x == y) +y = '\n\ +The \"quick\"\n\ +brown fox\n\ +jumps over\n\ +the \'lazy\' dog.\n\ +'; verify(x == y) + + +print '1.2 Grammar' + +print 'single_input' # NEWLINE | simple_stmt | compound_stmt NEWLINE +# XXX can't test in a script -- this rule is only used when interactive + +print 'file_input' # (NEWLINE | stmt)* ENDMARKER +# Being tested as this very moment this very module + +print 'expr_input' # testlist NEWLINE +# XXX Hard to test -- used only in calls to input() + +print 'eval_input' # testlist ENDMARKER +x = eval('1, 0 or 1') + +print 'funcdef' +### 'def' NAME parameters ':' suite +### parameters: '(' [varargslist] ')' +### varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' ('**'|'*' '*') NAME] +### | ('**'|'*' '*') NAME) +### | fpdef ['=' test] (',' fpdef ['=' test])* [','] +### fpdef: NAME | '(' fplist ')' +### fplist: fpdef (',' fpdef)* [','] +### arglist: (argument ',')* (argument | *' test [',' '**' test] | '**' test) +### argument: [test '='] test # Really [keyword '='] test +def f1(): pass +f1() +f1(*()) +f1(*(), **{}) +def f2(one_argument): pass +def f3(two, arguments): pass +def f4(two, (compound, (argument, list))): pass +def f5((compound, first), two): pass +verify(f2.func_code.co_varnames == ('one_argument',)) +verify(f3.func_code.co_varnames == ('two', 'arguments')) +if sys.platform.startswith('java'): + verify(f4.func_code.co_varnames == + ('two', '(compound, (argument, list))', 'compound', 'argument', + 'list',)) + verify(f5.func_code.co_varnames == + ('(compound, first)', 'two', 'compound', 'first')) +else: + verify(f4.func_code.co_varnames == ('two', '.2', 'compound', + 'argument', 'list')) + verify(f5.func_code.co_varnames == ('.0', 'two', 'compound', 'first')) +def a1(one_arg,): pass +def a2(two, args,): pass +def v0(*rest): pass +def v1(a, *rest): pass +def v2(a, b, *rest): pass +def v3(a, (b, c), *rest): return a, b, c, rest +if sys.platform.startswith('java'): + verify(v3.func_code.co_varnames == ('a', '(b, c)', 'rest', 'b', 'c')) +else: + verify(v3.func_code.co_varnames == ('a', '.2', 'rest', 'b', 'c')) +verify(v3(1, (2, 3), 4) == (1, 2, 3, (4,))) +def d01(a=1): pass +d01() +d01(1) +d01(*(1,)) +d01(**{'a':2}) +def d11(a, b=1): pass +d11(1) +d11(1, 2) +d11(1, **{'b':2}) +def d21(a, b, c=1): pass +d21(1, 2) +d21(1, 2, 3) +d21(*(1, 2, 3)) +d21(1, *(2, 3)) +d21(1, 2, *(3,)) +d21(1, 2, **{'c':3}) +def d02(a=1, b=2): pass +d02() +d02(1) +d02(1, 2) +d02(*(1, 2)) +d02(1, *(2,)) +d02(1, **{'b':2}) +d02(**{'a': 1, 'b': 2}) +def d12(a, b=1, c=2): pass +d12(1) +d12(1, 2) +d12(1, 2, 3) +def d22(a, b, c=1, d=2): pass +d22(1, 2) +d22(1, 2, 3) +d22(1, 2, 3, 4) +def d01v(a=1, *rest): pass +d01v() +d01v(1) +d01v(1, 2) +d01v(*(1, 2, 3, 4)) +d01v(*(1,)) +d01v(**{'a':2}) +def d11v(a, b=1, *rest): pass +d11v(1) +d11v(1, 2) +d11v(1, 2, 3) +def d21v(a, b, c=1, *rest): pass +d21v(1, 2) +d21v(1, 2, 3) +d21v(1, 2, 3, 4) +d21v(*(1, 2, 3, 4)) +d21v(1, 2, **{'c': 3}) +def d02v(a=1, b=2, *rest): pass +d02v() +d02v(1) +d02v(1, 2) +d02v(1, 2, 3) +d02v(1, *(2, 3, 4)) +d02v(**{'a': 1, 'b': 2}) +def d12v(a, b=1, c=2, *rest): pass +d12v(1) +d12v(1, 2) +d12v(1, 2, 3) +d12v(1, 2, 3, 4) +d12v(*(1, 2, 3, 4)) +d12v(1, 2, *(3, 4, 5)) +d12v(1, *(2,), **{'c': 3}) +def d22v(a, b, c=1, d=2, *rest): pass +d22v(1, 2) +d22v(1, 2, 3) +d22v(1, 2, 3, 4) +d22v(1, 2, 3, 4, 5) +d22v(*(1, 2, 3, 4)) +d22v(1, 2, *(3, 4, 5)) +d22v(1, *(2, 3), **{'d': 4}) + +### lambdef: 'lambda' [varargslist] ':' test +print 'lambdef' +l1 = lambda : 0 +verify(l1() == 0) +l2 = lambda : a[d] # XXX just testing the expression +l3 = lambda : [2 < x for x in [-1, 3, 0L]] +verify(l3() == [0, 1, 0]) +l4 = lambda x = lambda y = lambda z=1 : z : y() : x() +verify(l4() == 1) +l5 = lambda x, y, z=2: x + y + z +verify(l5(1, 2) == 5) +verify(l5(1, 2, 3) == 6) +check_syntax("lambda x: x = 2") + +### stmt: simple_stmt | compound_stmt +# Tested below + +### simple_stmt: small_stmt (';' small_stmt)* [';'] +print 'simple_stmt' +x = 1; pass; del x + +### small_stmt: expr_stmt | print_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt +# Tested below + +print 'expr_stmt' # (exprlist '=')* exprlist +1 +1, 2, 3 +x = 1 +x = 1, 2, 3 +x = y = z = 1, 2, 3 +x, y, z = 1, 2, 3 +abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4) +# NB these variables are deleted below + +check_syntax("x + 1 = 1") +check_syntax("a + 1 = b + 2") + +print 'print_stmt' # 'print' (test ',')* [test] +print 1, 2, 3 +print 1, 2, 3, +print +print 0 or 1, 0 or 1, +print 0 or 1 + +print 'extended print_stmt' # 'print' '>>' test ',' +import sys +print >> sys.stdout, 1, 2, 3 +print >> sys.stdout, 1, 2, 3, +print >> sys.stdout +print >> sys.stdout, 0 or 1, 0 or 1, +print >> sys.stdout, 0 or 1 + +# test printing to an instance +class Gulp: + def write(self, msg): pass + +gulp = Gulp() +print >> gulp, 1, 2, 3 +print >> gulp, 1, 2, 3, +print >> gulp +print >> gulp, 0 or 1, 0 or 1, +print >> gulp, 0 or 1 + +# test print >> None +def driver(): + oldstdout = sys.stdout + sys.stdout = Gulp() + try: + tellme(Gulp()) + tellme() + finally: + sys.stdout = oldstdout + +# we should see this once +def tellme(file=sys.stdout): + print >> file, 'hello world' + +driver() + +# we should not see this at all +def tellme(file=None): + print >> file, 'goodbye universe' + +driver() + +# syntax errors +check_syntax('print ,') +check_syntax('print >> x,') + +print 'del_stmt' # 'del' exprlist +del abc +del x, y, (z, xyz) + +print 'pass_stmt' # 'pass' +pass + +print 'flow_stmt' # break_stmt | continue_stmt | return_stmt | raise_stmt +# Tested below + +print 'break_stmt' # 'break' +while 1: break + +print 'continue_stmt' # 'continue' +i = 1 +while i: i = 0; continue + +msg = "" +while not msg: + msg = "continue + try/except ok" + try: + continue + msg = "continue failed to continue inside try" + except: + msg = "continue inside try called except block" +print msg + +msg = "" +while not msg: + msg = "finally block not called" + try: + continue + finally: + msg = "continue + try/finally ok" +print msg + + +# This test warrants an explanation. It is a test specifically for SF bugs +# #463359 and #462937. The bug is that a 'break' statement executed or +# exception raised inside a try/except inside a loop, *after* a continue +# statement has been executed in that loop, will cause the wrong number of +# arguments to be popped off the stack and the instruction pointer reset to +# a very small number (usually 0.) Because of this, the following test +# *must* written as a function, and the tracking vars *must* be function +# arguments with default values. Otherwise, the test will loop and loop. + +print "testing continue and break in try/except in loop" +def test_break_continue_loop(extra_burning_oil = 1, count=0): + big_hippo = 2 + while big_hippo: + count += 1 + try: + if extra_burning_oil and big_hippo == 1: + extra_burning_oil -= 1 + break + big_hippo -= 1 + continue + except: + raise + if count > 2 or big_hippo <> 1: + print "continue then break in try/except in loop broken!" +test_break_continue_loop() + +print 'return_stmt' # 'return' [testlist] +def g1(): return +def g2(): return 1 +g1() +x = g2() + +print 'raise_stmt' # 'raise' test [',' test] +try: raise RuntimeError, 'just testing' +except RuntimeError: pass +try: raise KeyboardInterrupt +except KeyboardInterrupt: pass + +print 'import_stmt' # 'import' NAME (',' NAME)* | 'from' NAME 'import' ('*' | NAME (',' NAME)*) +import sys +import time, sys +from time import time +from sys import * +from sys import path, argv + +print 'global_stmt' # 'global' NAME (',' NAME)* +def f(): + global a + global a, b + global one, two, three, four, five, six, seven, eight, nine, ten + +print 'exec_stmt' # 'exec' expr ['in' expr [',' expr]] +def f(): + z = None + del z + exec 'z=1+1\n' + if z != 2: raise TestFailed, 'exec \'z=1+1\'\\n' + del z + exec 'z=1+1' + if z != 2: raise TestFailed, 'exec \'z=1+1\'' + z = None + del z + import types + if hasattr(types, "UnicodeType"): + exec r"""if 1: + exec u'z=1+1\n' + if z != 2: raise TestFailed, 'exec u\'z=1+1\'\\n' + del z + exec u'z=1+1' + if z != 2: raise TestFailed, 'exec u\'z=1+1\'' +""" +f() +g = {} +exec 'z = 1' in g +if g.has_key('__builtins__'): del g['__builtins__'] +if g != {'z': 1}: raise TestFailed, 'exec \'z = 1\' in g' +g = {} +l = {} + +import warnings +warnings.filterwarnings("ignore", "global statement", module="") +exec 'global a; a = 1; b = 2' in g, l +if g.has_key('__builtins__'): del g['__builtins__'] +if l.has_key('__builtins__'): del l['__builtins__'] +if (g, l) != ({'a':1}, {'b':2}): raise TestFailed, 'exec ... in g (%s), l (%s)' %(g,l) + + +print "assert_stmt" # assert_stmt: 'assert' test [',' test] +assert 1 +assert 1, 1 +assert lambda x:x +assert 1, lambda x:x+1 + +### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef +# Tested below + +print 'if_stmt' # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] +if 1: pass +if 1: pass +else: pass +if 0: pass +elif 0: pass +if 0: pass +elif 0: pass +elif 0: pass +elif 0: pass +else: pass + +print 'while_stmt' # 'while' test ':' suite ['else' ':' suite] +while 0: pass +while 0: pass +else: pass + +print 'for_stmt' # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] +for i in 1, 2, 3: pass +for i, j, k in (): pass +else: pass +class Squares: + def __init__(self, max): + self.max = max + self.sofar = [] + def __len__(self): return len(self.sofar) + def __getitem__(self, i): + if not 0 <= i < self.max: raise IndexError + n = len(self.sofar) + while n <= i: + self.sofar.append(n*n) + n = n+1 + return self.sofar[i] +n = 0 +for x in Squares(10): n = n+x +if n != 285: raise TestFailed, 'for over growing sequence' + +print 'try_stmt' +### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] +### | 'try' ':' suite 'finally' ':' suite +### except_clause: 'except' [expr [',' expr]] +try: + 1/0 +except ZeroDivisionError: + pass +else: + pass +try: 1/0 +except EOFError: pass +except TypeError, msg: pass +except RuntimeError, msg: pass +except: pass +else: pass +try: 1/0 +except (EOFError, TypeError, ZeroDivisionError): pass +try: 1/0 +except (EOFError, TypeError, ZeroDivisionError), msg: pass +try: pass +finally: pass + +print 'suite' # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT +if 1: pass +if 1: + pass +if 1: + # + # + # + pass + pass + # + pass + # + +print 'test' +### and_test ('or' and_test)* +### and_test: not_test ('and' not_test)* +### not_test: 'not' not_test | comparison +if not 1: pass +if 1 and 1: pass +if 1 or 1: pass +if not not not 1: pass +if not 1 and 1 and 1: pass +if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass + +print 'comparison' +### comparison: expr (comp_op expr)* +### comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' +if 1: pass +x = (1 == 1) +if 1 == 1: pass +if 1 != 1: pass +if 1 <> 1: pass +if 1 < 1: pass +if 1 > 1: pass +if 1 <= 1: pass +if 1 >= 1: pass +if 1 is 1: pass +if 1 is not 1: pass +if 1 in (): pass +if 1 not in (): pass +if 1 < 1 > 1 == 1 >= 1 <= 1 <> 1 != 1 in 1 not in 1 is 1 is not 1: pass + +print 'binary mask ops' +x = 1 & 1 +x = 1 ^ 1 +x = 1 | 1 + +print 'shift ops' +x = 1 << 1 +x = 1 >> 1 +x = 1 << 1 >> 1 + +print 'additive ops' +x = 1 +x = 1 + 1 +x = 1 - 1 - 1 +x = 1 - 1 + 1 - 1 + 1 + +print 'multiplicative ops' +x = 1 * 1 +x = 1 / 1 +x = 1 % 1 +x = 1 / 1 * 1 % 1 + +print 'unary ops' +x = +1 +x = -1 +x = ~1 +x = ~1 ^ 1 & 1 | 1 & 1 ^ -1 +x = -1*1/1 + 1*1 - ---1*1 + +print 'selectors' +### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME +### subscript: expr | [expr] ':' [expr] +f1() +f2(1) +f2(1,) +f3(1, 2) +f3(1, 2,) +f4(1, (2, (3, 4))) +v0() +v0(1) +v0(1,) +v0(1,2) +v0(1,2,3,4,5,6,7,8,9,0) +v1(1) +v1(1,) +v1(1,2) +v1(1,2,3) +v1(1,2,3,4,5,6,7,8,9,0) +v2(1,2) +v2(1,2,3) +v2(1,2,3,4) +v2(1,2,3,4,5,6,7,8,9,0) +v3(1,(2,3)) +v3(1,(2,3),4) +v3(1,(2,3),4,5,6,7,8,9,0) +print +import sys, time +c = sys.path[0] +x = time.time() +x = sys.modules['time'].time() +a = '01234' +c = a[0] +c = a[-1] +s = a[0:5] +s = a[:5] +s = a[0:] +s = a[:] +s = a[-5:] +s = a[:-1] +s = a[-4:-3] + +print 'atoms' +### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING +### dictmaker: test ':' test (',' test ':' test)* [','] + +x = (1) +x = (1 or 2 or 3) +x = (1 or 2 or 3, 2, 3) + +x = [] +x = [1] +x = [1 or 2 or 3] +x = [1 or 2 or 3, 2, 3] +x = [] + +x = {} +x = {'one': 1} +x = {'one': 1,} +x = {'one' or 'two': 1 or 2} +x = {'one': 1, 'two': 2} +x = {'one': 1, 'two': 2,} +x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6} + +x = `x` +x = `1 or 2 or 3` +x = x +x = 'x' +x = 123 + +### exprlist: expr (',' expr)* [','] +### testlist: test (',' test)* [','] +# These have been exercised enough above + +print 'classdef' # 'class' NAME ['(' testlist ')'] ':' suite +class B: pass +class C1(B): pass +class C2(B): pass +class D(C1, C2, B): pass +class C: + def meth1(self): pass + def meth2(self, arg): pass + def meth3(self, a1, a2): pass + +# list comprehension tests +nums = [1, 2, 3, 4, 5] +strs = ["Apple", "Banana", "Coconut"] +spcs = [" Apple", " Banana ", "Coco nut "] + +print [s.strip() for s in spcs] +print [3 * x for x in nums] +print [x for x in nums if x > 2] +print [(i, s) for i in nums for s in strs] +print [(i, s) for i in nums for s in [f for f in strs if "n" in f]] +print [(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)] + +def test_in_func(l): + return [None < x < 3 for x in l if x > 2] + +print test_in_func(nums) + +def test_nested_front(): + print [[y for y in [x, x + 1]] for x in [1,3,5]] + +test_nested_front() + +check_syntax("[i, s for i in nums for s in strs]") +check_syntax("[x if y]") + +suppliers = [ + (1, "Boeing"), + (2, "Ford"), + (3, "Macdonalds") +] + +parts = [ + (10, "Airliner"), + (20, "Engine"), + (30, "Cheeseburger") +] + +suppart = [ + (1, 10), (1, 20), (2, 20), (3, 30) +] + +print [ + (sname, pname) + for (sno, sname) in suppliers + for (pno, pname) in parts + for (sp_sno, sp_pno) in suppart + if sno == sp_sno and pno == sp_pno +] diff --git a/lib-python/2.2/test/test_grp.py b/lib-python/2.2/test/test_grp.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_grp.py @@ -0,0 +1,27 @@ +"""Test script for the grp module.""" + +# XXX This really needs some work, but what are the expected invariants? + +import grp +import test_support +import unittest + + +class GroupDatabaseTestCase(unittest.TestCase): + + def setUp(self): + self.groups = grp.getgrall() + + def test_getgrgid(self): + entry = grp.getgrgid(self.groups[0][2]) + + def test_getgrnam(self): + entry = grp.getgrnam(self.groups[0][0]) + + +def test_main(): + test_support.run_unittest(GroupDatabaseTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_gzip.py b/lib-python/2.2/test/test_gzip.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_gzip.py @@ -0,0 +1,82 @@ +from test_support import verify +import sys, os +import gzip, tempfile + +filename = tempfile.mktemp() + +data1 = """ int length=DEFAULTALLOC, err = Z_OK; + PyObject *RetVal; + int flushmode = Z_FINISH; + unsigned long start_total_out; + +""" + +data2 = """/* zlibmodule.c -- gzip-compatible data compression */ +/* See http://www.cdrom.com/pub/infozip/zlib/ */ +/* See http://www.winimage.com/zLibDll for Windows */ +""" + +f = gzip.GzipFile(filename, 'wb') ; f.write(data1 * 50) ; f.close() + +f = gzip.GzipFile(filename, 'r') ; d = f.read() ; f.close() +verify(d == data1*50) + +# Append to the previous file +f = gzip.GzipFile(filename, 'ab') ; f.write(data2 * 15) ; f.close() + +f = gzip.GzipFile(filename, 'rb') ; d = f.read() ; f.close() +verify(d == (data1*50) + (data2*15)) + +# Try .readline() with varying line lengths + +f = gzip.GzipFile(filename, 'rb') +line_length = 0 +while 1: + L = f.readline(line_length) + if L == "" and line_length != 0: break + verify(len(L) <= line_length) + line_length = (line_length + 1) % 50 +f.close() + +# Try .readlines() + +f = gzip.GzipFile(filename, 'rb') +L = f.readlines() +f.close() + +f = gzip.GzipFile(filename, 'rb') +while 1: + L = f.readlines(150) + if L == []: break +f.close() + +# Try seek, read test + +f = gzip.GzipFile(filename) +while 1: + oldpos = f.tell() + line1 = f.readline() + if not line1: break + newpos = f.tell() + f.seek(oldpos) # negative seek + if len(line1)>10: + amount = 10 + else: + amount = len(line1) + line2 = f.read(amount) + verify(line1[:amount] == line2) + f.seek(newpos) # positive seek +f.close() + +# Try seek, write test +f = gzip.GzipFile(filename, 'w') +for pos in range(0, 256, 16): + f.seek(pos) + f.write('GZ\n') +f.close() + +f = gzip.GzipFile(filename, 'r') +verify(f.myfileobj.mode == 'rb') +f.close() + +os.unlink(filename) diff --git a/lib-python/2.2/test/test_hash.py b/lib-python/2.2/test/test_hash.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_hash.py @@ -0,0 +1,36 @@ +# test the invariant that +# iff a==b then hash(a)==hash(b) +# + +import test_support +import unittest + + +class HashEqualityTestCase(unittest.TestCase): + + def same_hash(self, *objlist): + # Hash each object given and fail if + # the hash values are not all the same. + hashed = map(hash, objlist) + for h in hashed[1:]: + if h != hashed[0]: + self.fail("hashed values differ: %s" % `objlist`) + + def test_numeric_literals(self): + self.same_hash(1, 1L, 1.0, 1.0+0.0j) + + def test_coerced_integers(self): + self.same_hash(int(1), long(1), float(1), complex(1), + int('1'), float('1.0')) + + def test_coerced_floats(self): + self.same_hash(long(1.23e300), float(1.23e300)) + self.same_hash(float(0.5), complex(0.5, 0.0)) + + +def test_main(): + test_support.run_unittest(HashEqualityTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_hmac.py b/lib-python/2.2/test/test_hmac.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_hmac.py @@ -0,0 +1,108 @@ +import hmac +import unittest +import test_support + +class TestVectorsTestCase(unittest.TestCase): + def test_vectors(self): + """Test the HMAC module against test vectors from the RFC.""" + + def md5test(key, data, digest): + h = hmac.HMAC(key, data) + self.failUnless(h.hexdigest().upper() == digest.upper()) + + md5test(chr(0x0b) * 16, + "Hi There", + "9294727A3638BB1C13F48EF8158BFC9D") + + md5test("Jefe", + "what do ya want for nothing?", + "750c783e6ab0b503eaa86e310a5db738") + + md5test(chr(0xAA)*16, + chr(0xDD)*50, + "56be34521d144c88dbb8c733f0e8b3f6") + +class ConstructorTestCase(unittest.TestCase): + def test_normal(self): + """Standard constructor call.""" + failed = 0 + try: + h = hmac.HMAC("key") + except: + self.fail("Standard constructor call raised exception.") + + def test_withtext(self): + """Constructor call with text.""" + try: + h = hmac.HMAC("key", "hash this!") + except: + self.fail("Constructor call with text argument raised exception.") + + def test_withmodule(self): + """Constructor call with text and digest module.""" + import sha + try: + h = hmac.HMAC("key", "", sha) + except: + self.fail("Constructor call with sha module raised exception.") + +class SanityTestCase(unittest.TestCase): + def test_default_is_md5(self): + """Testing if HMAC defaults to MD5 algorithm.""" + import md5 + h = hmac.HMAC("key") + self.failUnless(h.digestmod == md5) + + def test_exercise_all_methods(self): + """Exercising all methods once.""" + # This must not raise any exceptions + try: + h = hmac.HMAC("my secret key") + h.update("compute the hash of this text!") + dig = h.digest() + dig = h.hexdigest() + h2 = h.copy() + except: + fail("Exception raised during normal usage of HMAC class.") + +class CopyTestCase(unittest.TestCase): + def test_attributes(self): + """Testing if attributes are of same type.""" + h1 = hmac.HMAC("key") + h2 = h1.copy() + self.failUnless(h1.digestmod == h2.digestmod, + "Modules don't match.") + self.failUnless(type(h1.inner) == type(h2.inner), + "Types of inner don't match.") + self.failUnless(type(h1.outer) == type(h2.outer), + "Types of outer don't match.") + + def test_realcopy(self): + """Testing if the copy method created a real copy.""" + h1 = hmac.HMAC("key") + h2 = h1.copy() + # Using id() in case somebody has overridden __cmp__. + self.failUnless(id(h1) != id(h2), "No real copy of the HMAC instance.") + self.failUnless(id(h1.inner) != id(h2.inner), + "No real copy of the attribute 'inner'.") + self.failUnless(id(h1.outer) != id(h2.outer), + "No real copy of the attribute 'outer'.") + + def test_equality(self): + """Testing if the copy has the same digests.""" + h1 = hmac.HMAC("key") + h1.update("some random text") + h2 = h1.copy() + self.failUnless(h1.digest() == h2.digest(), + "Digest of copy doesn't match original digest.") + self.failUnless(h1.hexdigest() == h2.hexdigest(), + "Hexdigest of copy doesn't match original hexdigest.") + +def test_main(): + test_support.run_unittest(TestVectorsTestCase) + test_support.run_unittest(ConstructorTestCase) + test_support.run_unittest(SanityTestCase) + test_support.run_unittest(CopyTestCase) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_hotshot.py b/lib-python/2.2/test/test_hotshot.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_hotshot.py @@ -0,0 +1,117 @@ +import hotshot +import hotshot.log +import os +import pprint +import unittest + +import test_support + +from hotshot.log import ENTER, EXIT, LINE + + +def shortfilename(fn): + # We use a really shortened filename since an exact match is made, + # and the source may be either a Python source file or a + # pre-compiled bytecode file. + if fn: + return os.path.splitext(os.path.basename(fn))[0] + else: + return fn + + +class UnlinkingLogReader(hotshot.log.LogReader): + """Extend the LogReader so the log file is unlinked when we're + done with it.""" + + def __init__(self, logfn): + self.__logfn = logfn + hotshot.log.LogReader.__init__(self, logfn) + + def next(self, index=None): + try: + return hotshot.log.LogReader.next(self) + except (IndexError, StopIteration): + os.unlink(self.__logfn) + raise + + +class HotShotTestCase(unittest.TestCase): + def new_profiler(self, lineevents=0, linetimings=1): + self.logfn = test_support.TESTFN + return hotshot.Profile(self.logfn, lineevents, linetimings) + + def get_logreader(self): + return UnlinkingLogReader(self.logfn) + + def get_events_wotime(self): + L = [] + for event in self.get_logreader(): + what, (filename, lineno, funcname), tdelta = event + L.append((what, (shortfilename(filename), lineno, funcname))) + return L + + def check_events(self, expected): + events = self.get_events_wotime() + if not __debug__: + # Running under -O, so we don't get LINE events + expected = [ev for ev in expected if ev[0] != LINE] + if events != expected: + self.fail( + "events did not match expectation; got:\n%s\nexpected:\n%s" + % (pprint.pformat(events), pprint.pformat(expected))) + + def run_test(self, callable, events, profiler=None): + if profiler is None: + profiler = self.new_profiler() + profiler.runcall(callable) + profiler.close() + self.check_events(events) + + def test_addinfo(self): + def f(p): + p.addinfo("test-key", "test-value") + profiler = self.new_profiler() + profiler.runcall(f, profiler) + profiler.close() + log = self.get_logreader() + info = log._info + list(log) + self.failUnless(info["test-key"] == ["test-value"]) + + def test_line_numbers(self): + def f(): + y = 2 + x = 1 + def g(): + f() + f_lineno = f.func_code.co_firstlineno + g_lineno = g.func_code.co_firstlineno + events = [(ENTER, ("test_hotshot", g_lineno, "g")), + (LINE, ("test_hotshot", g_lineno, "g")), + (LINE, ("test_hotshot", g_lineno+1, "g")), + (ENTER, ("test_hotshot", f_lineno, "f")), + (LINE, ("test_hotshot", f_lineno, "f")), + (LINE, ("test_hotshot", f_lineno+1, "f")), + (LINE, ("test_hotshot", f_lineno+2, "f")), + (EXIT, ("test_hotshot", f_lineno, "f")), + (EXIT, ("test_hotshot", g_lineno, "g")), + ] + self.run_test(g, events, self.new_profiler(lineevents=1)) + + def test_start_stop(self): + # Make sure we don't return NULL in the start() and stop() + # methods when there isn't an error. Bug in 2.2 noted by + # Anthony Baxter. + profiler = self.new_profiler() + profiler.start() + profiler.stop() + profiler.close() + os.unlink(self.logfn) + + +def test_main(): + test_support.run_unittest(HotShotTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_htmllib.py b/lib-python/2.2/test/test_htmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_htmllib.py @@ -0,0 +1,42 @@ +import formatter +import htmllib +import unittest + +import test_support + + +class AnchorCollector(htmllib.HTMLParser): + def __init__(self, *args, **kw): + self.__anchors = [] + htmllib.HTMLParser.__init__(self, *args, **kw) + + def get_anchor_info(self): + return self.__anchors + + def anchor_bgn(self, *args): + self.__anchors.append(args) + + +class HTMLParserTestCase(unittest.TestCase): + def test_anchor_collection(self): + # See SF bug #467059. + parser = AnchorCollector(formatter.NullFormatter(), verbose=1) + parser.feed( + """ + + + """) + parser.close() + self.assertEquals(parser.get_anchor_info(), + [('http://foo.org/', 'splat', ''), + ('http://www.python.org/', '', ''), + ('', 'frob', ''), + ]) + + +def test_main(): + test_support.run_unittest(HTMLParserTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_htmlparser.py b/lib-python/2.2/test/test_htmlparser.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_htmlparser.py @@ -0,0 +1,294 @@ +"""Tests for HTMLParser.py.""" + +import HTMLParser +import pprint +import sys +import test_support +import unittest + + +class EventCollector(HTMLParser.HTMLParser): + + def __init__(self): + self.events = [] + self.append = self.events.append + HTMLParser.HTMLParser.__init__(self) + + def get_events(self): + # Normalize the list of events so that buffer artefacts don't + # separate runs of contiguous characters. + L = [] + prevtype = None + for event in self.events: + type = event[0] + if type == prevtype == "data": + L[-1] = ("data", L[-1][1] + event[1]) + else: + L.append(event) + prevtype = type + self.events = L + return L + + # structure markup + + def handle_starttag(self, tag, attrs): + self.append(("starttag", tag, attrs)) + + def handle_startendtag(self, tag, attrs): + self.append(("startendtag", tag, attrs)) + + def handle_endtag(self, tag): + self.append(("endtag", tag)) + + # all other markup + + def handle_comment(self, data): + self.append(("comment", data)) + + def handle_charref(self, data): + self.append(("charref", data)) + + def handle_data(self, data): + self.append(("data", data)) + + def handle_decl(self, data): + self.append(("decl", data)) + + def handle_entityref(self, data): + self.append(("entityref", data)) + + def handle_pi(self, data): + self.append(("pi", data)) + + def unknown_decl(self, decl): + self.append(("unknown decl", decl)) + + +class EventCollectorExtra(EventCollector): + + def handle_starttag(self, tag, attrs): + EventCollector.handle_starttag(self, tag, attrs) + self.append(("starttag_text", self.get_starttag_text())) + + +class TestCaseBase(unittest.TestCase): + + def _run_check(self, source, expected_events, collector=EventCollector): + parser = collector() + for s in source: + parser.feed(s) + parser.close() + events = parser.get_events() + if events != expected_events: + self.fail("received events did not match expected events\n" + "Expected:\n" + pprint.pformat(expected_events) + + "\nReceived:\n" + pprint.pformat(events)) + + def _run_check_extra(self, source, events): + self._run_check(source, events, EventCollectorExtra) + + def _parse_error(self, source): + def parse(source=source): + parser = HTMLParser.HTMLParser() + parser.feed(source) + parser.close() + self.assertRaises(HTMLParser.HTMLParseError, parse) + + +class HTMLParserTestCase(TestCaseBase): + + def test_processing_instruction_only(self): + self._run_check("", [ + ("pi", "processing instruction"), + ]) + + def test_simple_html(self): + self._run_check(""" + +&entity; + +sample +text +“ + + +""", [ + ("data", "\n"), + ("decl", "DOCTYPE html PUBLIC 'foo'"), + ("data", "\n"), + ("starttag", "html", []), + ("entityref", "entity"), + ("charref", "32"), + ("data", "\n"), + ("comment", "comment1a\n->< + + + + + + %paramEntity; + +]""" + self._run_check("" % inside, [ + ("decl", inside), + ]) + + def test_bad_nesting(self): + # Strangely, this *is* supposed to test that overlapping + # elements are allowed. HTMLParser is more geared toward + # lexing the input that parsing the structure. + self._run_check("", [ + ("starttag", "a", []), + ("starttag", "b", []), + ("endtag", "a"), + ("endtag", "b"), + ]) + + def test_bare_ampersands(self): + self._run_check("this text & contains & ampersands &", [ + ("data", "this text & contains & ampersands &"), + ]) + + def test_bare_pointy_brackets(self): + self._run_check("this < text > contains < bare>pointy< brackets", [ + ("data", "this < text > contains < bare>pointy< brackets"), + ]) + + def test_attr_syntax(self): + output = [ + ("starttag", "a", [("b", "v"), ("c", "v"), ("d", "v"), ("e", None)]) + ] + self._run_check("""""", output) + self._run_check("""""", output) + self._run_check("""""", output) + self._run_check("""""", output) + + def test_attr_values(self): + self._run_check("""""", + [("starttag", "a", [("b", "xxx\n\txxx"), + ("c", "yyy\t\nyyy"), + ("d", "\txyz\n")]) + ]) + self._run_check("""""", [ + ("starttag", "a", [("b", ""), ("c", "")]), + ]) + + def test_attr_entity_replacement(self): + self._run_check("""""", [ + ("starttag", "a", [("b", "&><\"'")]), + ]) + + def test_attr_funky_names(self): + self._run_check("""""", [ + ("starttag", "a", [("a.b", "v"), ("c:d", "v"), ("e-f", "v")]), + ]) + + def test_illegal_declarations(self): + self._parse_error('') + + def test_starttag_end_boundary(self): + self._run_check("""""", [("starttag", "a", [("b", "<")])]) + self._run_check("""""", [("starttag", "a", [("b", ">")])]) + + def test_buffer_artefacts(self): + output = [("starttag", "a", [("b", "<")])] + self._run_check([""], output) + self._run_check([""], output) + self._run_check([""], output) + self._run_check([""], output) + self._run_check([""], output) + self._run_check([""], output) + + output = [("starttag", "a", [("b", ">")])] + self._run_check([""], output) + self._run_check([""], output) + self._run_check([""], output) + self._run_check(["'>"], output) + self._run_check([""], output) + self._run_check([""], output) + + def test_starttag_junk_chars(self): + self._parse_error("") + self._parse_error("") + self._parse_error("") + self._parse_error("") + self._parse_error("") + self._parse_error("'") + self._parse_error("

", [ + ("starttag", "p", []), + ("startendtag", "img", [("src", "foo")]), + ("endtag", "p"), + ]) + + def test_get_starttag_text(self): + s = """""" + self._run_check_extra(s, [ + ("starttag", "foo:bar", [("one", "1"), ("two", "2")]), + ("starttag_text", s)]) + + def test_cdata_content(self): + s = """""" + self._run_check(s, [ + ("starttag", "script", []), + ("data", " ¬-an-entity-ref; "), + ("endtag", "script"), + ]) + s = """""" + self._run_check(s, [ + ("starttag", "script", []), + ("data", " "), + ("endtag", "script"), + ]) + + +def test_main(): + test_support.run_unittest(HTMLParserTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_httplib.py b/lib-python/2.2/test/test_httplib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_httplib.py @@ -0,0 +1,58 @@ +from test_support import verify,verbose +import httplib +import StringIO + +class FakeSocket: + def __init__(self, text): + self.text = text + + def makefile(self, mode, bufsize=None): + if mode != 'r' and mode != 'rb': + raise httplib.UnimplementedFileMode() + return StringIO.StringIO(self.text) + +# Test HTTP status lines + +body = "HTTP/1.1 200 Ok\n\nText" +sock = FakeSocket(body) +resp = httplib.HTTPResponse(sock, 1) +resp.begin() +print resp.read() +resp.close() + +body = "HTTP/1.1 400.100 Not Ok\n\nText" +sock = FakeSocket(body) +resp = httplib.HTTPResponse(sock, 1) +try: + resp.begin() +except httplib.BadStatusLine: + print "BadStatusLine raised as expected" +else: + print "Expect BadStatusLine" + +# Check invalid host_port + +for hp in ("www.python.org:abc", "www.python.org:"): + try: + h = httplib.HTTP(hp) + except httplib.InvalidURL: + print "InvalidURL raised as expected" + else: + print "Expect InvalidURL" + +# test response with multiple message headers with the same field name. +text = ('HTTP/1.1 200 OK\n' + 'Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"\n' + 'Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1";' + ' Path="/acme"\n' + '\n' + 'No body\n') +hdr = ('Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"' + ', ' + 'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"') +s = FakeSocket(text) +r = httplib.HTTPResponse(s, 1) +r.begin() +cookies = r.getheader("Set-Cookie") +if cookies != hdr: + raise AssertionError, "multiple headers not combined properly" diff --git a/lib-python/2.2/test/test_imageop.py b/lib-python/2.2/test/test_imageop.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_imageop.py @@ -0,0 +1,171 @@ +#! /usr/bin/env python + +"""Test script for the imageop module. This has the side + effect of partially testing the imgfile module as well. + Roger E. Masse +""" + +from test_support import verbose, unlink + +import imageop, uu, os + +def main(use_rgbimg=1): + + # Create binary test files + uu.decode(get_qualified_path('testrgb'+os.extsep+'uue'), 'test'+os.extsep+'rgb') + + if use_rgbimg: + image, width, height = getrgbimage('test'+os.extsep+'rgb') + else: + image, width, height = getimage('test'+os.extsep+'rgb') + + # Return the selected part of image, which should by width by height + # in size and consist of pixels of psize bytes. + if verbose: + print 'crop' + newimage = imageop.crop (image, 4, width, height, 0, 0, 1, 1) + + # Return image scaled to size newwidth by newheight. No interpolation + # is done, scaling is done by simple-minded pixel duplication or removal. + # Therefore, computer-generated images or dithered images will + # not look nice after scaling. + if verbose: + print 'scale' + scaleimage = imageop.scale(image, 4, width, height, 1, 1) + + # Run a vertical low-pass filter over an image. It does so by computing + # each destination pixel as the average of two vertically-aligned source + # pixels. The main use of this routine is to forestall excessive flicker + # if the image two vertically-aligned source pixels, hence the name. + if verbose: + print 'tovideo' + videoimage = imageop.tovideo (image, 4, width, height) + + # Convert an rgb image to an 8 bit rgb + if verbose: + print 'rgb2rgb8' + greyimage = imageop.rgb2rgb8(image, width, height) + + # Convert an 8 bit rgb image to a 24 bit rgb image + if verbose: + print 'rgb82rgb' + image = imageop.rgb82rgb(greyimage, width, height) + + # Convert an rgb image to an 8 bit greyscale image + if verbose: + print 'rgb2grey' + greyimage = imageop.rgb2grey(image, width, height) + + # Convert an 8 bit greyscale image to a 24 bit rgb image + if verbose: + print 'grey2rgb' + image = imageop.grey2rgb(greyimage, width, height) + + # Convert a 8-bit deep greyscale image to a 1-bit deep image by + # thresholding all the pixels. The resulting image is tightly packed + # and is probably only useful as an argument to mono2grey. + if verbose: + print 'grey2mono' + monoimage = imageop.grey2mono (greyimage, width, height, 0) + + # monoimage, width, height = getimage('monotest.rgb') + # Convert a 1-bit monochrome image to an 8 bit greyscale or color image. + # All pixels that are zero-valued on input get value p0 on output and + # all one-value input pixels get value p1 on output. To convert a + # monochrome black-and-white image to greyscale pass the values 0 and + # 255 respectively. + if verbose: + print 'mono2grey' + greyimage = imageop.mono2grey (monoimage, width, height, 0, 255) + + # Convert an 8-bit greyscale image to a 1-bit monochrome image using a + # (simple-minded) dithering algorithm. + if verbose: + print 'dither2mono' + monoimage = imageop.dither2mono (greyimage, width, height) + + # Convert an 8-bit greyscale image to a 4-bit greyscale image without + # dithering. + if verbose: + print 'grey2grey4' + grey4image = imageop.grey2grey4 (greyimage, width, height) + + # Convert an 8-bit greyscale image to a 2-bit greyscale image without + # dithering. + if verbose: + print 'grey2grey2' + grey2image = imageop.grey2grey2 (greyimage, width, height) + + # Convert an 8-bit greyscale image to a 2-bit greyscale image with + # dithering. As for dither2mono, the dithering algorithm is currently + # very simple. + if verbose: + print 'dither2grey2' + grey2image = imageop.dither2grey2 (greyimage, width, height) + + # Convert a 4-bit greyscale image to an 8-bit greyscale image. + if verbose: + print 'grey42grey' + greyimage = imageop.grey42grey (grey4image, width, height) + + # Convert a 2-bit greyscale image to an 8-bit greyscale image. + if verbose: + print 'grey22grey' + image = imageop.grey22grey (grey2image, width, height) + + # Cleanup + unlink('test'+os.extsep+'rgb') + +def getrgbimage(name): + """return a tuple consisting of image (in 'imgfile' format but + using rgbimg instead) width and height""" + + import rgbimg + + try: + sizes = rgbimg.sizeofimage(name) + except rgbimg.error: + name = get_qualified_path(name) + sizes = rgbimg.sizeofimage(name) + if verbose: + print 'rgbimg opening test image: %s, sizes: %s' % (name, str(sizes)) + + image = rgbimg.longimagedata(name) + return (image, sizes[0], sizes[1]) + +def getimage(name): + """return a tuple consisting of + image (in 'imgfile' format) width and height + """ + + import imgfile + + try: + sizes = imgfile.getsizes(name) + except imgfile.error: + name = get_qualified_path(name) + sizes = imgfile.getsizes(name) + if verbose: + print 'imgfile opening test image: %s, sizes: %s' % (name, str(sizes)) + + image = imgfile.read(name) + return (image, sizes[0], sizes[1]) + +def get_qualified_path(name): + """ return a more qualified path to name""" + import sys + import os + path = sys.path + try: + path = [os.path.dirname(__file__)] + path + except NameError: + pass + for dir in path: + fullname = os.path.join(dir, name) + if os.path.exists(fullname): + return fullname + return name + +# rgbimg (unlike imgfile) is portable to platforms other than SGI. +# So we prefer to use it. +main(use_rgbimg=1) diff --git a/lib-python/2.2/test/test_imgfile.py b/lib-python/2.2/test/test_imgfile.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_imgfile.py @@ -0,0 +1,116 @@ +#! /usr/bin/env python + +"""Simple test script for imgfile.c + Roger E. Masse +""" + +from test_support import verbose, unlink, findfile + +import imgfile, uu, os + + +def main(): + + uu.decode(findfile('testrgb.uue'), 'test.rgb') + uu.decode(findfile('greyrgb.uue'), 'greytest.rgb') + + # Test a 3 byte color image + testimage('test.rgb') + + # Test a 1 byte greyscale image + testimage('greytest.rgb') + + unlink('test.rgb') + unlink('greytest.rgb') + +def testimage(name): + """Run through the imgfile's battery of possible methods + on the image passed in name. + """ + + import sys + import os + + outputfile = '/tmp/deleteme' + + # try opening the name directly + try: + # This function returns a tuple (x, y, z) where x and y are the size + # of the image in pixels and z is the number of bytes per pixel. Only + # 3 byte RGB pixels and 1 byte greyscale pixels are supported. + sizes = imgfile.getsizes(name) + except imgfile.error: + # get a more qualified path component of the script... + if __name__ == '__main__': + ourname = sys.argv[0] + else: # ...or the full path of the module + ourname = sys.modules[__name__].__file__ + + parts = ourname.split(os.sep) + parts[-1] = name + name = os.sep.join(parts) + sizes = imgfile.getsizes(name) + if verbose: + print 'Opening test image: %s, sizes: %s' % (name, str(sizes)) + # This function reads and decodes the image on the specified file, + # and returns it as a python string. The string has either 1 byte + # greyscale pixels or 4 byte RGBA pixels. The bottom left pixel + # is the first in the string. This format is suitable to pass + # to gl.lrectwrite, for instance. + image = imgfile.read(name) + + # This function writes the RGB or greyscale data in data to + # image file file. x and y give the size of the image, z is + # 1 for 1 byte greyscale images or 3 for RGB images (which + # are stored as 4 byte values of which only the lower three + # bytes are used). These are the formats returned by gl.lrectread. + if verbose: + print 'Writing output file' + imgfile.write (outputfile, image, sizes[0], sizes[1], sizes[2]) + + + if verbose: + print 'Opening scaled test image: %s, sizes: %s' % (name, str(sizes)) + # This function is identical to read but it returns an image that + # is scaled to the given x and y sizes. If the filter and blur + # parameters are omitted scaling is done by simply dropping + # or duplicating pixels, so the result will be less than perfect, + # especially for computer-generated images. Alternatively, + # you can specify a filter to use to smoothen the image after + # scaling. The filter forms supported are 'impulse', 'box', + # 'triangle', 'quadratic' and 'gaussian'. If a filter is + # specified blur is an optional parameter specifying the + # blurriness of the filter. It defaults to 1.0. readscaled + # makes no attempt to keep the aspect ratio correct, so that + # is the users' responsibility. + if verbose: + print 'Filtering with "impulse"' + simage = imgfile.readscaled (name, sizes[0]/2, sizes[1]/2, 'impulse', 2.0) + + # This function sets a global flag which defines whether the + # scan lines of the image are read or written from bottom to + # top (flag is zero, compatible with SGI GL) or from top to + # bottom(flag is one, compatible with X). The default is zero. + if verbose: + print 'Switching to X compatibility' + imgfile.ttob (1) + + if verbose: + print 'Filtering with "triangle"' + simage = imgfile.readscaled (name, sizes[0]/2, sizes[1]/2, 'triangle', 3.0) + if verbose: + print 'Switching back to SGI compatibility' + imgfile.ttob (0) + + if verbose: print 'Filtering with "quadratic"' + simage = imgfile.readscaled (name, sizes[0]/2, sizes[1]/2, 'quadratic') + if verbose: print 'Filtering with "gaussian"' + simage = imgfile.readscaled (name, sizes[0]/2, sizes[1]/2, 'gaussian', 1.0) + + if verbose: + print 'Writing output file' + imgfile.write (outputfile, simage, sizes[0]/2, sizes[1]/2, sizes[2]) + + os.unlink(outputfile) + +main() diff --git a/lib-python/2.2/test/test_import.py b/lib-python/2.2/test/test_import.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_import.py @@ -0,0 +1,71 @@ +from test_support import TESTFN, TestFailed + +import os +import random +import sys + +# Brief digression to test that import is case-sensitive: if we got this +# far, we know for sure that "random" exists. +try: + import RAnDoM +except ImportError: + pass +else: + raise TestFailed("import of RAnDoM should have failed (case mismatch)") + +# Another brief digression to test the accuracy of manifest float constants. +import double_const # don't blink -- that *was* the test + +def test_with_extension(ext): # ext normally ".py"; perhaps ".pyw" + source = TESTFN + ext + pyo = TESTFN + os.extsep + "pyo" + if sys.platform.startswith('java'): + pyc = TESTFN + "$py.class" + else: + pyc = TESTFN + os.extsep + "pyc" + + f = open(source, "w") + print >> f, "# This tests Python's ability to import a", ext, "file." + a = random.randrange(1000) + b = random.randrange(1000) + print >> f, "a =", a + print >> f, "b =", b + f.close() + + try: + try: + mod = __import__(TESTFN) + except ImportError, err: + raise ValueError("import from %s failed: %s" % (ext, err)) + + if mod.a != a or mod.b != b: + print a, "!=", mod.a + print b, "!=", mod.b + raise ValueError("module loaded (%s) but contents invalid" % mod) + finally: + os.unlink(source) + + try: + try: + reload(mod) + except ImportError, err: + raise ValueError("import from .pyc/.pyo failed: %s" % err) + finally: + try: + os.unlink(pyc) + except os.error: + pass + try: + os.unlink(pyo) + except os.error: + pass + del sys.modules[TESTFN] + +sys.path.insert(0, os.curdir) +try: + test_with_extension(os.extsep + "py") + if sys.platform.startswith("win"): + for ext in ".PY", ".Py", ".pY", ".pyw", ".PYW", ".pYw": + test_with_extension(ext) +finally: + del sys.path[0] diff --git a/lib-python/2.2/test/test_inspect.py b/lib-python/2.2/test/test_inspect.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_inspect.py @@ -0,0 +1,363 @@ +source = '''# line 1 +'A module docstring.' + +import sys, inspect +# line 5 + +# line 7 +def spam(a, b, c, d=3, (e, (f,))=(4, (5,)), *g, **h): + eggs(b + d, c + f) + +# line 11 +def eggs(x, y): + "A docstring." + global fr, st + fr = inspect.currentframe() + st = inspect.stack() + p = x + q = y / 0 + +# line 20 +class StupidGit: + """A longer, + + indented + + docstring.""" +# line 27 + + def abuse(self, a, b, c): + """Another + +\tdocstring + + containing + +\ttabs +\t + """ + self.argue(a, b, c) +# line 40 + def argue(self, a, b, c): + try: + spam(a, b, c) + except: + self.ex = sys.exc_info() + self.tr = inspect.trace() + +# line 48 +class MalodorousPervert(StupidGit): + pass + +class ParrotDroppings: + pass + +class FesteringGob(MalodorousPervert, ParrotDroppings): + pass +''' + +# Functions tested in this suite: +# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode, +# isbuiltin, isroutine, getmembers, getdoc, getfile, getmodule, +# getsourcefile, getcomments, getsource, getclasstree, getargspec, +# getargvalues, formatargspec, formatargvalues, currentframe, stack, trace + +from test_support import TestFailed, TESTFN +import sys, imp, os, string + +def test(assertion, message, *args): + if not assertion: + raise TestFailed, message % args + +import inspect + +file = open(TESTFN, 'w') +file.write(source) +file.close() + +# Note that load_source creates file TESTFN+'c' or TESTFN+'o'. +mod = imp.load_source('testmod', TESTFN) +files_to_clean_up = [TESTFN, TESTFN + 'c', TESTFN + 'o'] + +def istest(func, exp): + obj = eval(exp) + test(func(obj), '%s(%s)' % (func.__name__, exp)) + for other in [inspect.isbuiltin, inspect.isclass, inspect.iscode, + inspect.isframe, inspect.isfunction, inspect.ismethod, + inspect.ismodule, inspect.istraceback]: + if other is not func: + test(not other(obj), 'not %s(%s)' % (other.__name__, exp)) + +git = mod.StupidGit() +try: + 1/0 +except: + tb = sys.exc_traceback + +istest(inspect.isbuiltin, 'sys.exit') +istest(inspect.isbuiltin, '[].append') +istest(inspect.isclass, 'mod.StupidGit') +istest(inspect.iscode, 'mod.spam.func_code') +istest(inspect.isframe, 'tb.tb_frame') +istest(inspect.isfunction, 'mod.spam') +istest(inspect.ismethod, 'mod.StupidGit.abuse') +istest(inspect.ismethod, 'git.argue') +istest(inspect.ismodule, 'mod') +istest(inspect.istraceback, 'tb') +test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)') +test(inspect.isroutine([].count), 'isroutine([].count)') + +classes = inspect.getmembers(mod, inspect.isclass) +test(classes == + [('FesteringGob', mod.FesteringGob), + ('MalodorousPervert', mod.MalodorousPervert), + ('ParrotDroppings', mod.ParrotDroppings), + ('StupidGit', mod.StupidGit)], 'class list') +tree = inspect.getclasstree(map(lambda x: x[1], classes), 1) +test(tree == + [(mod.ParrotDroppings, ()), + (mod.StupidGit, ()), + [(mod.MalodorousPervert, (mod.StupidGit,)), + [(mod.FesteringGob, (mod.MalodorousPervert, mod.ParrotDroppings)) + ] + ] + ], 'class tree') + +functions = inspect.getmembers(mod, inspect.isfunction) +test(functions == [('eggs', mod.eggs), ('spam', mod.spam)], 'function list') + +test(inspect.getdoc(mod) == 'A module docstring.', 'getdoc(mod)') +test(inspect.getcomments(mod) == '# line 1\n', 'getcomments(mod)') +test(inspect.getmodule(mod.StupidGit) == mod, 'getmodule(mod.StupidGit)') +test(inspect.getfile(mod.StupidGit) == TESTFN, 'getfile(mod.StupidGit)') +test(inspect.getsourcefile(mod.spam) == TESTFN, 'getsourcefile(mod.spam)') +test(inspect.getsourcefile(git.abuse) == TESTFN, 'getsourcefile(git.abuse)') + +def sourcerange(top, bottom): + lines = string.split(source, '\n') + return string.join(lines[top-1:bottom], '\n') + '\n' + +test(inspect.getsource(git.abuse) == sourcerange(29, 39), + 'getsource(git.abuse)') +test(inspect.getsource(mod.StupidGit) == sourcerange(21, 46), + 'getsource(mod.StupidGit)') +test(inspect.getdoc(mod.StupidGit) == + 'A longer,\n\nindented\n\ndocstring.', 'getdoc(mod.StupidGit)') +test(inspect.getdoc(git.abuse) == + 'Another\n\ndocstring\n\ncontaining\n\ntabs\n\n', 'getdoc(git.abuse)') +test(inspect.getcomments(mod.StupidGit) == '# line 20\n', + 'getcomments(mod.StupidGit)') + +args, varargs, varkw, defaults = inspect.getargspec(mod.eggs) +test(args == ['x', 'y'], 'mod.eggs args') +test(varargs == None, 'mod.eggs varargs') +test(varkw == None, 'mod.eggs varkw') +test(defaults == None, 'mod.eggs defaults') +test(inspect.formatargspec(args, varargs, varkw, defaults) == + '(x, y)', 'mod.eggs formatted argspec') +args, varargs, varkw, defaults = inspect.getargspec(mod.spam) +test(args == ['a', 'b', 'c', 'd', ['e', ['f']]], 'mod.spam args') +test(varargs == 'g', 'mod.spam varargs') +test(varkw == 'h', 'mod.spam varkw') +test(defaults == (3, (4, (5,))), 'mod.spam defaults') +test(inspect.formatargspec(args, varargs, varkw, defaults) == + '(a, b, c, d=3, (e, (f,))=(4, (5,)), *g, **h)', + 'mod.spam formatted argspec') + +git.abuse(7, 8, 9) + +istest(inspect.istraceback, 'git.ex[2]') +istest(inspect.isframe, 'mod.fr') + +test(len(git.tr) == 3, 'trace() length') +test(git.tr[0][1:] == (TESTFN, 46, 'argue', + [' self.tr = inspect.trace()\n'], 0), + 'trace() row 2') +test(git.tr[1][1:] == (TESTFN, 9, 'spam', [' eggs(b + d, c + f)\n'], 0), + 'trace() row 2') +test(git.tr[2][1:] == (TESTFN, 18, 'eggs', [' q = y / 0\n'], 0), + 'trace() row 3') + +test(len(mod.st) >= 5, 'stack() length') +test(mod.st[0][1:] == + (TESTFN, 16, 'eggs', [' st = inspect.stack()\n'], 0), + 'stack() row 1') +test(mod.st[1][1:] == + (TESTFN, 9, 'spam', [' eggs(b + d, c + f)\n'], 0), + 'stack() row 2') +test(mod.st[2][1:] == + (TESTFN, 43, 'argue', [' spam(a, b, c)\n'], 0), + 'stack() row 3') +test(mod.st[3][1:] == + (TESTFN, 39, 'abuse', [' self.argue(a, b, c)\n'], 0), + 'stack() row 4') + +args, varargs, varkw, locals = inspect.getargvalues(mod.fr) +test(args == ['x', 'y'], 'mod.fr args') +test(varargs == None, 'mod.fr varargs') +test(varkw == None, 'mod.fr varkw') +test(locals == {'x': 11, 'p': 11, 'y': 14}, 'mod.fr locals') +test(inspect.formatargvalues(args, varargs, varkw, locals) == + '(x=11, y=14)', 'mod.fr formatted argvalues') + +args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back) +test(args == ['a', 'b', 'c', 'd', ['e', ['f']]], 'mod.fr.f_back args') +test(varargs == 'g', 'mod.fr.f_back varargs') +test(varkw == 'h', 'mod.fr.f_back varkw') +test(inspect.formatargvalues(args, varargs, varkw, locals) == + '(a=7, b=8, c=9, d=3, (e=4, (f=5,)), *g=(), **h={})', + 'mod.fr.f_back formatted argvalues') + +for fname in files_to_clean_up: + try: + os.unlink(fname) + except: + pass + +# Test classic-class method resolution order. +class A: pass +class B(A): pass +class C(A): pass +class D(B, C): pass + +expected = (D, B, A, C) +got = inspect.getmro(D) +test(expected == got, "expected %r mro, got %r", expected, got) + +# The same w/ new-class MRO. +class A(object): pass +class B(A): pass +class C(A): pass +class D(B, C): pass + +expected = (D, B, C, A, object) +got = inspect.getmro(D) +test(expected == got, "expected %r mro, got %r", expected, got) + +# Test classify_class_attrs. +def attrs_wo_objs(cls): + return [t[:3] for t in inspect.classify_class_attrs(cls)] + +class A: + def s(): pass + s = staticmethod(s) + + def c(cls): pass + c = classmethod(c) + + def getp(self): pass + p = property(getp) + + def m(self): pass + + def m1(self): pass + + datablob = '1' + +attrs = attrs_wo_objs(A) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'class method', A) in attrs, 'missing class method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', A) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + +class B(A): + def m(self): pass + +attrs = attrs_wo_objs(B) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'class method', A) in attrs, 'missing class method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', B) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + + +class C(A): + def m(self): pass + def c(self): pass + +attrs = attrs_wo_objs(C) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'method', C) in attrs, 'missing plain method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', C) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + +class D(B, C): + def m1(self): pass + +attrs = attrs_wo_objs(D) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'class method', A) in attrs, 'missing class method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', B) in attrs, 'missing plain method') +test(('m1', 'method', D) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + +# Repeat all that, but w/ new-style classes. + +class A(object): + + def s(): pass + s = staticmethod(s) + + def c(cls): pass + c = classmethod(c) + + def getp(self): pass + p = property(getp) + + def m(self): pass + + def m1(self): pass + + datablob = '1' + +attrs = attrs_wo_objs(A) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'class method', A) in attrs, 'missing class method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', A) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + +class B(A): + + def m(self): pass + +attrs = attrs_wo_objs(B) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'class method', A) in attrs, 'missing class method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', B) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + + +class C(A): + + def m(self): pass + def c(self): pass + +attrs = attrs_wo_objs(C) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'method', C) in attrs, 'missing plain method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', C) in attrs, 'missing plain method') +test(('m1', 'method', A) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') + +class D(B, C): + + def m1(self): pass + +attrs = attrs_wo_objs(D) +test(('s', 'static method', A) in attrs, 'missing static method') +test(('c', 'method', C) in attrs, 'missing plain method') +test(('p', 'property', A) in attrs, 'missing property') +test(('m', 'method', B) in attrs, 'missing plain method') +test(('m1', 'method', D) in attrs, 'missing plain method') +test(('datablob', 'data', A) in attrs, 'missing data') diff --git a/lib-python/2.2/test/test_iter.py b/lib-python/2.2/test/test_iter.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_iter.py @@ -0,0 +1,779 @@ +# Test iterators. + +import unittest +from test_support import run_unittest, TESTFN, unlink, have_unicode + +# Test result of triple loop (too big to inline) +TRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2), + (0, 1, 0), (0, 1, 1), (0, 1, 2), + (0, 2, 0), (0, 2, 1), (0, 2, 2), + + (1, 0, 0), (1, 0, 1), (1, 0, 2), + (1, 1, 0), (1, 1, 1), (1, 1, 2), + (1, 2, 0), (1, 2, 1), (1, 2, 2), + + (2, 0, 0), (2, 0, 1), (2, 0, 2), + (2, 1, 0), (2, 1, 1), (2, 1, 2), + (2, 2, 0), (2, 2, 1), (2, 2, 2)] + +# Helper classes + +class BasicIterClass: + def __init__(self, n): + self.n = n + self.i = 0 + def next(self): + res = self.i + if res >= self.n: + raise StopIteration + self.i = res + 1 + return res + +class IteratingSequenceClass: + def __init__(self, n): + self.n = n + def __iter__(self): + return BasicIterClass(self.n) + +class SequenceClass: + def __init__(self, n): + self.n = n + def __getitem__(self, i): + if 0 <= i < self.n: + return i + else: + raise IndexError + +# Main test suite + +class TestCase(unittest.TestCase): + + # Helper to check that an iterator returns a given sequence + def check_iterator(self, it, seq): + res = [] + while 1: + try: + val = it.next() + except StopIteration: + break + res.append(val) + self.assertEqual(res, seq) + + # Helper to check that a for loop generates a given sequence + def check_for_loop(self, expr, seq): + res = [] + for val in expr: + res.append(val) + self.assertEqual(res, seq) + + # Test basic use of iter() function + def test_iter_basic(self): + self.check_iterator(iter(range(10)), range(10)) + + # Test that iter(iter(x)) is the same as iter(x) + def test_iter_idempotency(self): + seq = range(10) + it = iter(seq) + it2 = iter(it) + self.assert_(it is it2) + + # Test that for loops over iterators work + def test_iter_for_loop(self): + self.check_for_loop(iter(range(10)), range(10)) + + # Test several independent iterators over the same list + def test_iter_independence(self): + seq = range(3) + res = [] + for i in iter(seq): + for j in iter(seq): + for k in iter(seq): + res.append((i, j, k)) + self.assertEqual(res, TRIPLETS) + + # Test triple list comprehension using iterators + def test_nested_comprehensions_iter(self): + seq = range(3) + res = [(i, j, k) + for i in iter(seq) for j in iter(seq) for k in iter(seq)] + self.assertEqual(res, TRIPLETS) + + # Test triple list comprehension without iterators + def test_nested_comprehensions_for(self): + seq = range(3) + res = [(i, j, k) for i in seq for j in seq for k in seq] + self.assertEqual(res, TRIPLETS) + + # Test a class with __iter__ in a for loop + def test_iter_class_for(self): + self.check_for_loop(IteratingSequenceClass(10), range(10)) + + # Test a class with __iter__ with explicit iter() + def test_iter_class_iter(self): + self.check_iterator(iter(IteratingSequenceClass(10)), range(10)) + + # Test for loop on a sequence class without __iter__ + def test_seq_class_for(self): + self.check_for_loop(SequenceClass(10), range(10)) + + # Test iter() on a sequence class without __iter__ + def test_seq_class_iter(self): + self.check_iterator(iter(SequenceClass(10)), range(10)) + + # Test two-argument iter() with callable instance + def test_iter_callable(self): + class C: + def __init__(self): + self.i = 0 + def __call__(self): + i = self.i + self.i = i + 1 + if i > 100: + raise IndexError # Emergency stop + return i + self.check_iterator(iter(C(), 10), range(10)) + + # Test two-argument iter() with function + def test_iter_function(self): + def spam(state=[0]): + i = state[0] + state[0] = i+1 + return i + self.check_iterator(iter(spam, 10), range(10)) + + # Test two-argument iter() with function that raises StopIteration + def test_iter_function_stop(self): + def spam(state=[0]): + i = state[0] + if i == 10: + raise StopIteration + state[0] = i+1 + return i + self.check_iterator(iter(spam, 20), range(10)) + + # Test exception propagation through function iterator + def test_exception_function(self): + def spam(state=[0]): + i = state[0] + state[0] = i+1 + if i == 10: + raise RuntimeError + return i + res = [] + try: + for x in iter(spam, 20): + res.append(x) + except RuntimeError: + self.assertEqual(res, range(10)) + else: + self.fail("should have raised RuntimeError") + + # Test exception propagation through sequence iterator + def test_exception_sequence(self): + class MySequenceClass(SequenceClass): + def __getitem__(self, i): + if i == 10: + raise RuntimeError + return SequenceClass.__getitem__(self, i) + res = [] + try: + for x in MySequenceClass(20): + res.append(x) + except RuntimeError: + self.assertEqual(res, range(10)) + else: + self.fail("should have raised RuntimeError") + + # Test for StopIteration from __getitem__ + def test_stop_sequence(self): + class MySequenceClass(SequenceClass): + def __getitem__(self, i): + if i == 10: + raise StopIteration + return SequenceClass.__getitem__(self, i) + self.check_for_loop(MySequenceClass(20), range(10)) + + # Test a big range + def test_iter_big_range(self): + self.check_for_loop(iter(range(10000)), range(10000)) + + # Test an empty list + def test_iter_empty(self): + self.check_for_loop(iter([]), []) + + # Test a tuple + def test_iter_tuple(self): + self.check_for_loop(iter((0,1,2,3,4,5,6,7,8,9)), range(10)) + + # Test an xrange + def test_iter_xrange(self): + self.check_for_loop(iter(xrange(10)), range(10)) + + # Test a string + def test_iter_string(self): + self.check_for_loop(iter("abcde"), ["a", "b", "c", "d", "e"]) + + # Test a Unicode string + if have_unicode: + def test_iter_unicode(self): + self.check_for_loop(iter(unicode("abcde")), + [unicode("a"), unicode("b"), unicode("c"), + unicode("d"), unicode("e")]) + + # Test a directory + def test_iter_dict(self): + dict = {} + for i in range(10): + dict[i] = None + self.check_for_loop(dict, dict.keys()) + + # Test a file + def test_iter_file(self): + f = open(TESTFN, "w") + try: + for i in range(5): + f.write("%d\n" % i) + finally: + f.close() + f = open(TESTFN, "r") + try: + self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"]) + self.check_for_loop(f, []) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test list()'s use of iterators. + def test_builtin_list(self): + self.assertEqual(list(SequenceClass(5)), range(5)) + self.assertEqual(list(SequenceClass(0)), []) + self.assertEqual(list(()), []) + self.assertEqual(list(range(10, -1, -1)), range(10, -1, -1)) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(list(d), d.keys()) + + self.assertRaises(TypeError, list, list) + self.assertRaises(TypeError, list, 42) + + f = open(TESTFN, "w") + try: + for i in range(5): + f.write("%d\n" % i) + finally: + f.close() + f = open(TESTFN, "r") + try: + self.assertEqual(list(f), ["0\n", "1\n", "2\n", "3\n", "4\n"]) + f.seek(0, 0) + self.assertEqual(list(f.xreadlines()), + ["0\n", "1\n", "2\n", "3\n", "4\n"]) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test tuples()'s use of iterators. + def test_builtin_tuple(self): + self.assertEqual(tuple(SequenceClass(5)), (0, 1, 2, 3, 4)) + self.assertEqual(tuple(SequenceClass(0)), ()) + self.assertEqual(tuple([]), ()) + self.assertEqual(tuple(()), ()) + self.assertEqual(tuple("abc"), ("a", "b", "c")) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(tuple(d), tuple(d.keys())) + + self.assertRaises(TypeError, tuple, list) + self.assertRaises(TypeError, tuple, 42) + + f = open(TESTFN, "w") + try: + for i in range(5): + f.write("%d\n" % i) + finally: + f.close() + f = open(TESTFN, "r") + try: + self.assertEqual(tuple(f), ("0\n", "1\n", "2\n", "3\n", "4\n")) + f.seek(0, 0) + self.assertEqual(tuple(f.xreadlines()), + ("0\n", "1\n", "2\n", "3\n", "4\n")) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test filter()'s use of iterators. + def test_builtin_filter(self): + self.assertEqual(filter(None, SequenceClass(5)), range(1, 5)) + self.assertEqual(filter(None, SequenceClass(0)), []) + self.assertEqual(filter(None, ()), ()) + self.assertEqual(filter(None, "abc"), "abc") + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(filter(None, d), d.keys()) + + self.assertRaises(TypeError, filter, None, list) + self.assertRaises(TypeError, filter, None, 42) + + class Boolean: + def __init__(self, truth): + self.truth = truth + def __nonzero__(self): + return self.truth + True = Boolean(1) + False = Boolean(0) + + class Seq: + def __init__(self, *args): + self.vals = args + def __iter__(self): + class SeqIter: + def __init__(self, vals): + self.vals = vals + self.i = 0 + def __iter__(self): + return self + def next(self): + i = self.i + self.i = i + 1 + if i < len(self.vals): + return self.vals[i] + else: + raise StopIteration + return SeqIter(self.vals) + + seq = Seq(*([True, False] * 25)) + self.assertEqual(filter(lambda x: not x, seq), [False]*25) + self.assertEqual(filter(lambda x: not x, iter(seq)), [False]*25) + + # Test max() and min()'s use of iterators. + def test_builtin_max_min(self): + self.assertEqual(max(SequenceClass(5)), 4) + self.assertEqual(min(SequenceClass(5)), 0) + self.assertEqual(max(8, -1), 8) + self.assertEqual(min(8, -1), -1) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(max(d), "two") + self.assertEqual(min(d), "one") + self.assertEqual(max(d.itervalues()), 3) + self.assertEqual(min(iter(d.itervalues())), 1) + + f = open(TESTFN, "w") + try: + f.write("medium line\n") + f.write("xtra large line\n") + f.write("itty-bitty line\n") + finally: + f.close() + f = open(TESTFN, "r") + try: + self.assertEqual(min(f), "itty-bitty line\n") + f.seek(0, 0) + self.assertEqual(max(f), "xtra large line\n") + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test map()'s use of iterators. + def test_builtin_map(self): + self.assertEqual(map(None, SequenceClass(5)), range(5)) + self.assertEqual(map(lambda x: x+1, SequenceClass(5)), range(1, 6)) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(map(None, d), d.keys()) + self.assertEqual(map(lambda k, d=d: (k, d[k]), d), d.items()) + dkeys = d.keys() + expected = [(i < len(d) and dkeys[i] or None, + i, + i < len(d) and dkeys[i] or None) + for i in range(5)] + self.assertEqual(map(None, d, + SequenceClass(5), + iter(d.iterkeys())), + expected) + + f = open(TESTFN, "w") + try: + for i in range(10): + f.write("xy" * i + "\n") # line i has len 2*i+1 + finally: + f.close() + f = open(TESTFN, "r") + try: + self.assertEqual(map(len, f), range(1, 21, 2)) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test zip()'s use of iterators. + def test_builtin_zip(self): + self.assertRaises(TypeError, zip) + self.assertRaises(TypeError, zip, None) + self.assertRaises(TypeError, zip, range(10), 42) + self.assertRaises(TypeError, zip, range(10), zip) + + self.assertEqual(zip(IteratingSequenceClass(3)), + [(0,), (1,), (2,)]) + self.assertEqual(zip(SequenceClass(3)), + [(0,), (1,), (2,)]) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(d.items(), zip(d, d.itervalues())) + + # Generate all ints starting at constructor arg. + class IntsFrom: + def __init__(self, start): + self.i = start + + def __iter__(self): + return self + + def next(self): + i = self.i + self.i = i+1 + return i + + f = open(TESTFN, "w") + try: + f.write("a\n" "bbb\n" "cc\n") + finally: + f.close() + f = open(TESTFN, "r") + try: + self.assertEqual(zip(IntsFrom(0), f, IntsFrom(-100)), + [(0, "a\n", -100), + (1, "bbb\n", -99), + (2, "cc\n", -98)]) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test reduces()'s use of iterators. + def test_builtin_reduce(self): + from operator import add + self.assertEqual(reduce(add, SequenceClass(5)), 10) + self.assertEqual(reduce(add, SequenceClass(5), 42), 52) + self.assertRaises(TypeError, reduce, add, SequenceClass(0)) + self.assertEqual(reduce(add, SequenceClass(0), 42), 42) + self.assertEqual(reduce(add, SequenceClass(1)), 0) + self.assertEqual(reduce(add, SequenceClass(1), 42), 42) + + d = {"one": 1, "two": 2, "three": 3} + self.assertEqual(reduce(add, d), "".join(d.keys())) + + # This test case will be removed if we don't have Unicode + def test_unicode_join_endcase(self): + + # This class inserts a Unicode object into its argument's natural + # iteration, in the 3rd position. + class OhPhooey: + def __init__(self, seq): + self.it = iter(seq) + self.i = 0 + + def __iter__(self): + return self + + def next(self): + i = self.i + self.i = i+1 + if i == 2: + return unicode("fooled you!") + return self.it.next() + + f = open(TESTFN, "w") + try: + f.write("a\n" + "b\n" + "c\n") + finally: + f.close() + + f = open(TESTFN, "r") + # Nasty: string.join(s) can't know whether unicode.join() is needed + # until it's seen all of s's elements. But in this case, f's + # iterator cannot be restarted. So what we're testing here is + # whether string.join() can manage to remember everything it's seen + # and pass that on to unicode.join(). + try: + got = " - ".join(OhPhooey(f)) + self.assertEqual(got, unicode("a\n - b\n - fooled you! - c\n")) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + if not have_unicode: + def test_unicode_join_endcase(self): pass + + # Test iterators with 'x in y' and 'x not in y'. + def test_in_and_not_in(self): + for sc5 in IteratingSequenceClass(5), SequenceClass(5): + for i in range(5): + self.assert_(i in sc5) + for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5: + self.assert_(i not in sc5) + + self.assertRaises(TypeError, lambda: 3 in 12) + self.assertRaises(TypeError, lambda: 3 not in map) + + d = {"one": 1, "two": 2, "three": 3, 1j: 2j} + for k in d: + self.assert_(k in d) + self.assert_(k not in d.itervalues()) + for v in d.values(): + self.assert_(v in d.itervalues()) + self.assert_(v not in d) + for k, v in d.iteritems(): + self.assert_((k, v) in d.iteritems()) + self.assert_((v, k) not in d.iteritems()) + + f = open(TESTFN, "w") + try: + f.write("a\n" "b\n" "c\n") + finally: + f.close() + f = open(TESTFN, "r") + try: + for chunk in "abc": + f.seek(0, 0) + self.assert_(chunk not in f) + f.seek(0, 0) + self.assert_((chunk + "\n") in f) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test iterators with operator.countOf (PySequence_Count). + def test_countOf(self): + from operator import countOf + self.assertEqual(countOf([1,2,2,3,2,5], 2), 3) + self.assertEqual(countOf((1,2,2,3,2,5), 2), 3) + self.assertEqual(countOf("122325", "2"), 3) + self.assertEqual(countOf("122325", "6"), 0) + + self.assertRaises(TypeError, countOf, 42, 1) + self.assertRaises(TypeError, countOf, countOf, countOf) + + d = {"one": 3, "two": 3, "three": 3, 1j: 2j} + for k in d: + self.assertEqual(countOf(d, k), 1) + self.assertEqual(countOf(d.itervalues(), 3), 3) + self.assertEqual(countOf(d.itervalues(), 2j), 1) + self.assertEqual(countOf(d.itervalues(), 1j), 0) + + f = open(TESTFN, "w") + try: + f.write("a\n" "b\n" "c\n" "b\n") + finally: + f.close() + f = open(TESTFN, "r") + try: + for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0): + f.seek(0, 0) + self.assertEqual(countOf(f, letter + "\n"), count) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + # Test iterators with operator.indexOf (PySequence_Index). + def test_indexOf(self): + from operator import indexOf + self.assertEqual(indexOf([1,2,2,3,2,5], 1), 0) + self.assertEqual(indexOf((1,2,2,3,2,5), 2), 1) + self.assertEqual(indexOf((1,2,2,3,2,5), 3), 3) + self.assertEqual(indexOf((1,2,2,3,2,5), 5), 5) + self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 0) + self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 6) + + self.assertEqual(indexOf("122325", "2"), 1) + self.assertEqual(indexOf("122325", "5"), 5) + self.assertRaises(ValueError, indexOf, "122325", "6") + + self.assertRaises(TypeError, indexOf, 42, 1) + self.assertRaises(TypeError, indexOf, indexOf, indexOf) + + f = open(TESTFN, "w") + try: + f.write("a\n" "b\n" "c\n" "d\n" "e\n") + finally: + f.close() + f = open(TESTFN, "r") + try: + fiter = iter(f) + self.assertEqual(indexOf(fiter, "b\n"), 1) + self.assertEqual(indexOf(fiter, "d\n"), 1) + self.assertEqual(indexOf(fiter, "e\n"), 0) + self.assertRaises(ValueError, indexOf, fiter, "a\n") + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + iclass = IteratingSequenceClass(3) + for i in range(3): + self.assertEqual(indexOf(iclass, i), i) + self.assertRaises(ValueError, indexOf, iclass, -1) + + # Test iterators with file.writelines(). + def test_writelines(self): + f = file(TESTFN, "w") + + try: + self.assertRaises(TypeError, f.writelines, None) + self.assertRaises(TypeError, f.writelines, 42) + + f.writelines(["1\n", "2\n"]) + f.writelines(("3\n", "4\n")) + f.writelines({'5\n': None}) + f.writelines({}) + + # Try a big chunk too. + class Iterator: + def __init__(self, start, finish): + self.start = start + self.finish = finish + self.i = self.start + + def next(self): + if self.i >= self.finish: + raise StopIteration + result = str(self.i) + '\n' + self.i += 1 + return result + + def __iter__(self): + return self + + class Whatever: + def __init__(self, start, finish): + self.start = start + self.finish = finish + + def __iter__(self): + return Iterator(self.start, self.finish) + + f.writelines(Whatever(6, 6+2000)) + f.close() + + f = file(TESTFN) + expected = [str(i) + "\n" for i in range(1, 2006)] + self.assertEqual(list(f), expected) + + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + + # Test iterators on RHS of unpacking assignments. + def test_unpack_iter(self): + a, b = 1, 2 + self.assertEqual((a, b), (1, 2)) + + a, b, c = IteratingSequenceClass(3) + self.assertEqual((a, b, c), (0, 1, 2)) + + try: # too many values + a, b = IteratingSequenceClass(3) + except ValueError: + pass + else: + self.fail("should have raised ValueError") + + try: # not enough values + a, b, c = IteratingSequenceClass(2) + except ValueError: + pass + else: + self.fail("should have raised ValueError") + + try: # not iterable + a, b, c = len + except TypeError: + pass + else: + self.fail("should have raised TypeError") + + a, b, c = {1: 42, 2: 42, 3: 42}.itervalues() + self.assertEqual((a, b, c), (42, 42, 42)) + + f = open(TESTFN, "w") + lines = ("a\n", "bb\n", "ccc\n") + try: + for line in lines: + f.write(line) + finally: + f.close() + f = open(TESTFN, "r") + try: + a, b, c = f + self.assertEqual((a, b, c), lines) + finally: + f.close() + try: + unlink(TESTFN) + except OSError: + pass + + (a, b), (c,) = IteratingSequenceClass(2), {42: 24} + self.assertEqual((a, b, c), (0, 1, 42)) + + # Test reference count behavior + + class C(object): + count = 0 + def __new__(cls): + cls.count += 1 + return object.__new__(cls) + def __del__(self): + cls = self.__class__ + assert cls.count > 0 + cls.count -= 1 + x = C() + self.assertEqual(C.count, 1) + del x + self.assertEqual(C.count, 0) + l = [C(), C(), C()] + self.assertEqual(C.count, 3) + try: + a, b = iter(l) + except ValueError: + pass + del l + self.assertEqual(C.count, 0) + +def test_main(): + run_unittest(TestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_largefile.py b/lib-python/2.2/test/test_largefile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_largefile.py @@ -0,0 +1,162 @@ +#!python + +#---------------------------------------------------------------------- +# test largefile support on system where this makes sense +# +#---------------------------------------------------------------------- + +import test_support +import os, struct, stat, sys + +try: + import signal + # The default handler for SIGXFSZ is to abort the process. + # By ignoring it, system calls exceeding the file size resource + # limit will raise IOError instead of crashing the interpreter. + oldhandler = signal.signal(signal.SIGXFSZ, signal.SIG_IGN) +except (ImportError, AttributeError): + pass + + +# create >2GB file (2GB = 2147483648 bytes) +size = 2500000000L +name = test_support.TESTFN + + +# On Windows and Mac OSX this test comsumes large resources; It takes +# a long time to build the >2GB file and takes >2GB of disk space +# therefore the resource must be enabled to run this test. If not, +# nothing after this line stanza will be executed. +if sys.platform[:3] == 'win' or sys.platform == 'darwin': + test_support.requires( + 'largefile', + 'test requires %s bytes and a long time to run' % str(size)) +else: + # Only run if the current filesystem supports large files. + # (Skip this test on Windows, since we now always support large files.) + f = open(test_support.TESTFN, 'wb') + try: + # 2**31 == 2147483648 + f.seek(2147483649L) + # Seeking is not enough of a test: you must write and flush, too! + f.write("x") + f.flush() + except (IOError, OverflowError): + f.close() + os.unlink(test_support.TESTFN) + raise test_support.TestSkipped, \ + "filesystem does not have largefile support" + else: + f.close() + + +def expect(got_this, expect_this): + if test_support.verbose: + print '%r =?= %r ...' % (got_this, expect_this), + if got_this != expect_this: + if test_support.verbose: + print 'no' + raise test_support.TestFailed, 'got %r, but expected %r' %\ + (got_this, expect_this) + else: + if test_support.verbose: + print 'yes' + + +# test that each file function works as expected for a large (i.e. >2GB, do +# we have to check >4GB) files + +if test_support.verbose: + print 'create large file via seek (may be sparse file) ...' +f = open(name, 'wb') +f.write('z') +f.seek(0) +f.seek(size) +f.write('a') +f.flush() +if test_support.verbose: + print 'check file size with os.fstat' +expect(os.fstat(f.fileno())[stat.ST_SIZE], size+1) +f.close() +if test_support.verbose: + print 'check file size with os.stat' +expect(os.stat(name)[stat.ST_SIZE], size+1) + +if test_support.verbose: + print 'play around with seek() and read() with the built largefile' +f = open(name, 'rb') +expect(f.tell(), 0) +expect(f.read(1), 'z') +expect(f.tell(), 1) +f.seek(0) +expect(f.tell(), 0) +f.seek(0, 0) +expect(f.tell(), 0) +f.seek(42) +expect(f.tell(), 42) +f.seek(42, 0) +expect(f.tell(), 42) +f.seek(42, 1) +expect(f.tell(), 84) +f.seek(0, 1) +expect(f.tell(), 84) +f.seek(0, 2) # seek from the end +expect(f.tell(), size + 1 + 0) +f.seek(-10, 2) +expect(f.tell(), size + 1 - 10) +f.seek(-size-1, 2) +expect(f.tell(), 0) +f.seek(size) +expect(f.tell(), size) +expect(f.read(1), 'a') # the 'a' that was written at the end of the file above +f.seek(-size-1, 1) +expect(f.read(1), 'z') +expect(f.tell(), 1) +f.close() + +if test_support.verbose: + print 'play around with os.lseek() with the built largefile' +f = open(name, 'rb') +expect(os.lseek(f.fileno(), 0, 0), 0) +expect(os.lseek(f.fileno(), 42, 0), 42) +expect(os.lseek(f.fileno(), 42, 1), 84) +expect(os.lseek(f.fileno(), 0, 1), 84) +expect(os.lseek(f.fileno(), 0, 2), size+1+0) +expect(os.lseek(f.fileno(), -10, 2), size+1-10) +expect(os.lseek(f.fileno(), -size-1, 2), 0) +expect(os.lseek(f.fileno(), size, 0), size) +expect(f.read(1), 'a') # the 'a' that was written at the end of the file above +f.close() + +if hasattr(f, 'truncate'): + if test_support.verbose: + print 'try truncate' + f = open(name, 'r+b') + f.seek(0, 2) + expect(f.tell(), size+1) # else we've lost track of the true size + # Cut it back via seek + truncate with no argument. + newsize = size - 10 + f.seek(newsize) + f.truncate() + expect(f.tell(), newsize) # else pointer moved + f.seek(0, 2) + expect(f.tell(), newsize) # else wasn't truncated + # Ensure that truncate(smaller than true size) shrinks the file. + newsize -= 1 + f.seek(42) + f.truncate(newsize) + expect(f.tell(), 42) # else pointer moved + f.seek(0, 2) + expect(f.tell(), newsize) # else wasn't truncated + + # XXX truncate(larger than true size) is ill-defined across platforms + + # cut it waaaaay back + f.seek(0) + f.truncate(1) + expect(f.tell(), 0) # else pointer moved + expect(len(f.read()), 1) # else wasn't truncated + + f.close() + +os.unlink(name) diff --git a/lib-python/2.2/test/test_linuxaudiodev.py b/lib-python/2.2/test/test_linuxaudiodev.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_linuxaudiodev.py @@ -0,0 +1,89 @@ +from test_support import verbose, findfile, TestFailed, TestSkipped + +import errno +import fcntl +import linuxaudiodev +import os +import sys +import select +import sunaudio +import time +import audioop + +SND_FORMAT_MULAW_8 = 1 + +def play_sound_file(path): + fp = open(path, 'r') + size, enc, rate, nchannels, extra = sunaudio.gethdr(fp) + data = fp.read() + fp.close() + + if enc != SND_FORMAT_MULAW_8: + print "Expect .au file with 8-bit mu-law samples" + return + + try: + a = linuxaudiodev.open('w') + except linuxaudiodev.error, msg: + if msg[0] in (errno.EACCES, errno.ENODEV, errno.EBUSY): + raise TestSkipped, msg + raise TestFailed, msg + + # convert the data to 16-bit signed + data = audioop.ulaw2lin(data, 2) + + # set the data format + if sys.byteorder == 'little': + fmt = linuxaudiodev.AFMT_S16_LE + else: + fmt = linuxaudiodev.AFMT_S16_BE + + # at least check that these methods can be invoked + a.bufsize() + a.obufcount() + a.obuffree() + a.getptr() + a.fileno() + + # set parameters based on .au file headers + a.setparameters(rate, 16, nchannels, fmt) + a.write(data) + a.flush() + a.close() + +def test_errors(): + a = linuxaudiodev.open("w") + size = 8 + fmt = linuxaudiodev.AFMT_U8 + rate = 8000 + nchannels = 1 + try: + a.setparameters(-1, size, nchannels, fmt) + except ValueError, msg: + print msg + try: + a.setparameters(rate, -2, nchannels, fmt) + except ValueError, msg: + print msg + try: + a.setparameters(rate, size, 3, fmt) + except ValueError, msg: + print msg + try: + a.setparameters(rate, size, nchannels, 177) + except ValueError, msg: + print msg + try: + a.setparameters(rate, size, nchannels, linuxaudiodev.AFMT_U16_LE) + except ValueError, msg: + print msg + try: + a.setparameters(rate, 16, nchannels, fmt) + except ValueError, msg: + print msg + +def test(): + play_sound_file(findfile('audiotest.au')) + test_errors() + +test() diff --git a/lib-python/2.2/test/test_locale.py b/lib-python/2.2/test/test_locale.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_locale.py @@ -0,0 +1,44 @@ +from test_support import verbose, TestSkipped +import locale +import sys + +if sys.platform == 'darwin': + raise TestSkipped("Locale support on MacOSX is minimal and cannot be tested") +oldlocale = locale.setlocale(locale.LC_NUMERIC) + +tloc = "en_US" +if sys.platform[:3] == "win": + tloc = "en" + +try: + locale.setlocale(locale.LC_NUMERIC, tloc) +except locale.Error: + raise ImportError, "test locale %s not supported" % tloc + +def testformat(formatstr, value, grouping = 0, output=None): + if verbose: + if output: + print "%s %% %s =? %s ..." %\ + (repr(formatstr), repr(value), repr(output)), + else: + print "%s %% %s works? ..." % (repr(formatstr), repr(value)), + result = locale.format(formatstr, value, grouping = grouping) + if output and result != output: + if verbose: + print 'no' + print "%s %% %s == %s != %s" %\ + (repr(formatstr), repr(value), repr(result), repr(output)) + else: + if verbose: + print "yes" + +try: + testformat("%f", 1024, grouping=1, output='1,024.000000') + testformat("%f", 102, grouping=1, output='102.000000') + testformat("%f", -42, grouping=1, output='-42.000000') + testformat("%+f", -42, grouping=1, output='-42.000000') + testformat("%20.f", -42, grouping=1, output=' -42') + testformat("%+10.f", -4200, grouping=1, output=' -4,200') + testformat("%-10.f", 4200, grouping=1, output='4,200 ') +finally: + locale.setlocale(locale.LC_NUMERIC, oldlocale) diff --git a/lib-python/2.2/test/test_long.py b/lib-python/2.2/test/test_long.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_long.py @@ -0,0 +1,410 @@ +from test_support import verify, verbose, TestFailed, fcmp +from string import join +from random import random, randint + +# SHIFT should match the value in longintrepr.h for best testing. +SHIFT = 15 +BASE = 2 ** SHIFT +MASK = BASE - 1 + +# Max number of base BASE digits to use in test cases. Doubling +# this will at least quadruple the runtime. +MAXDIGITS = 10 + +# build some special values +special = map(long, [0, 1, 2, BASE, BASE >> 1]) +special.append(0x5555555555555555L) +special.append(0xaaaaaaaaaaaaaaaaL) +# some solid strings of one bits +p2 = 4L # 0 and 1 already added +for i in range(2*SHIFT): + special.append(p2 - 1) + p2 = p2 << 1 +del p2 +# add complements & negations +special = special + map(lambda x: ~x, special) + \ + map(lambda x: -x, special) + +# ------------------------------------------------------------ utilities + +# Use check instead of assert so the test still does something +# under -O. + +def check(ok, *args): + if not ok: + raise TestFailed, join(map(str, args), " ") + +# Get quasi-random long consisting of ndigits digits (in base BASE). +# quasi == the most-significant digit will not be 0, and the number +# is constructed to contain long strings of 0 and 1 bits. These are +# more likely than random bits to provoke digit-boundary errors. +# The sign of the number is also random. + +def getran(ndigits): + verify(ndigits > 0) + nbits_hi = ndigits * SHIFT + nbits_lo = nbits_hi - SHIFT + 1 + answer = 0L + nbits = 0 + r = int(random() * (SHIFT * 2)) | 1 # force 1 bits to start + while nbits < nbits_lo: + bits = (r >> 1) + 1 + bits = min(bits, nbits_hi - nbits) + verify(1 <= bits <= SHIFT) + nbits = nbits + bits + answer = answer << bits + if r & 1: + answer = answer | ((1 << bits) - 1) + r = int(random() * (SHIFT * 2)) + verify(nbits_lo <= nbits <= nbits_hi) + if random() < 0.5: + answer = -answer + return answer + +# Get random long consisting of ndigits random digits (relative to base +# BASE). The sign bit is also random. + +def getran2(ndigits): + answer = 0L + for i in range(ndigits): + answer = (answer << SHIFT) | randint(0, MASK) + if random() < 0.5: + answer = -answer + return answer + +# --------------------------------------------------------------- divmod + +def test_division_2(x, y): + q, r = divmod(x, y) + q2, r2 = x//y, x%y + pab, pba = x*y, y*x + check(pab == pba, "multiplication does not commute for", x, y) + check(q == q2, "divmod returns different quotient than / for", x, y) + check(r == r2, "divmod returns different mod than % for", x, y) + check(x == q*y + r, "x != q*y + r after divmod on", x, y) + if y > 0: + check(0 <= r < y, "bad mod from divmod on", x, y) + else: + check(y < r <= 0, "bad mod from divmod on", x, y) + +def test_division(maxdigits=MAXDIGITS): + if verbose: + print "long / * % divmod" + digits = range(1, maxdigits+1) + for lenx in digits: + x = getran(lenx) + for leny in digits: + y = getran(leny) or 1L + test_division_2(x, y) + +# -------------------------------------------------------------- ~ & | ^ + +def test_bitop_identities_1(x): + check(x & 0 == 0, "x & 0 != 0 for", x) + check(x | 0 == x, "x | 0 != x for", x) + check(x ^ 0 == x, "x ^ 0 != x for", x) + check(x & -1 == x, "x & -1 != x for", x) + check(x | -1 == -1, "x | -1 != -1 for", x) + check(x ^ -1 == ~x, "x ^ -1 != ~x for", x) + check(x == ~~x, "x != ~~x for", x) + check(x & x == x, "x & x != x for", x) + check(x | x == x, "x | x != x for", x) + check(x ^ x == 0, "x ^ x != 0 for", x) + check(x & ~x == 0, "x & ~x != 0 for", x) + check(x | ~x == -1, "x | ~x != -1 for", x) + check(x ^ ~x == -1, "x ^ ~x != -1 for", x) + check(-x == 1 + ~x == ~(x-1), "not -x == 1 + ~x == ~(x-1) for", x) + for n in range(2*SHIFT): + p2 = 2L ** n + check(x << n >> n == x, "x << n >> n != x for", x, n) + check(x // p2 == x >> n, "x // p2 != x >> n for x n p2", x, n, p2) + check(x * p2 == x << n, "x * p2 != x << n for x n p2", x, n, p2) + check(x & -p2 == x >> n << n == x & ~(p2 - 1), + "not x & -p2 == x >> n << n == x & ~(p2 - 1) for x n p2", + x, n, p2) + +def test_bitop_identities_2(x, y): + check(x & y == y & x, "x & y != y & x for", x, y) + check(x | y == y | x, "x | y != y | x for", x, y) + check(x ^ y == y ^ x, "x ^ y != y ^ x for", x, y) + check(x ^ y ^ x == y, "x ^ y ^ x != y for", x, y) + check(x & y == ~(~x | ~y), "x & y != ~(~x | ~y) for", x, y) + check(x | y == ~(~x & ~y), "x | y != ~(~x & ~y) for", x, y) + check(x ^ y == (x | y) & ~(x & y), + "x ^ y != (x | y) & ~(x & y) for", x, y) + check(x ^ y == (x & ~y) | (~x & y), + "x ^ y == (x & ~y) | (~x & y) for", x, y) + check(x ^ y == (x | y) & (~x | ~y), + "x ^ y == (x | y) & (~x | ~y) for", x, y) + +def test_bitop_identities_3(x, y, z): + check((x & y) & z == x & (y & z), + "(x & y) & z != x & (y & z) for", x, y, z) + check((x | y) | z == x | (y | z), + "(x | y) | z != x | (y | z) for", x, y, z) + check((x ^ y) ^ z == x ^ (y ^ z), + "(x ^ y) ^ z != x ^ (y ^ z) for", x, y, z) + check(x & (y | z) == (x & y) | (x & z), + "x & (y | z) != (x & y) | (x & z) for", x, y, z) + check(x | (y & z) == (x | y) & (x | z), + "x | (y & z) != (x | y) & (x | z) for", x, y, z) + +def test_bitop_identities(maxdigits=MAXDIGITS): + if verbose: + print "long bit-operation identities" + for x in special: + test_bitop_identities_1(x) + digits = range(1, maxdigits+1) + for lenx in digits: + x = getran(lenx) + test_bitop_identities_1(x) + for leny in digits: + y = getran(leny) + test_bitop_identities_2(x, y) + test_bitop_identities_3(x, y, getran((lenx + leny)//2)) + +# ------------------------------------------------- hex oct repr str atol + +def slow_format(x, base): + if (x, base) == (0, 8): + # this is an oddball! + return "0L" + digits = [] + sign = 0 + if x < 0: + sign, x = 1, -x + while x: + x, r = divmod(x, base) + digits.append(int(r)) + digits.reverse() + digits = digits or [0] + return '-'[:sign] + \ + {8: '0', 10: '', 16: '0x'}[base] + \ + join(map(lambda i: "0123456789ABCDEF"[i], digits), '') + \ + "L" + +def test_format_1(x): + from string import atol + for base, mapper in (8, oct), (10, repr), (16, hex): + got = mapper(x) + expected = slow_format(x, base) + check(got == expected, mapper.__name__, "returned", + got, "but expected", expected, "for", x) + check(atol(got, 0) == x, 'atol("%s", 0) !=' % got, x) + # str() has to be checked a little differently since there's no + # trailing "L" + got = str(x) + expected = slow_format(x, 10)[:-1] + check(got == expected, mapper.__name__, "returned", + got, "but expected", expected, "for", x) + +def test_format(maxdigits=MAXDIGITS): + if verbose: + print "long str/hex/oct/atol" + for x in special: + test_format_1(x) + for i in range(10): + for lenx in range(1, maxdigits+1): + x = getran(lenx) + test_format_1(x) + +# ----------------------------------------------------------------- misc + +def test_misc(maxdigits=MAXDIGITS): + if verbose: + print "long miscellaneous operations" + import sys + + # check the extremes in int<->long conversion + hugepos = sys.maxint + hugeneg = -hugepos - 1 + hugepos_aslong = long(hugepos) + hugeneg_aslong = long(hugeneg) + check(hugepos == hugepos_aslong, "long(sys.maxint) != sys.maxint") + check(hugeneg == hugeneg_aslong, + "long(-sys.maxint-1) != -sys.maxint-1") + + # long -> int should not fail for hugepos_aslong or hugeneg_aslong + try: + check(int(hugepos_aslong) == hugepos, + "converting sys.maxint to long and back to int fails") + except OverflowError: + raise TestFailed, "int(long(sys.maxint)) overflowed!" + try: + check(int(hugeneg_aslong) == hugeneg, + "converting -sys.maxint-1 to long and back to int fails") + except OverflowError: + raise TestFailed, "int(long(-sys.maxint-1)) overflowed!" + + # but long -> int should overflow for hugepos+1 and hugeneg-1 + x = hugepos_aslong + 1 + try: + int(x) + raise ValueError + except OverflowError: + pass + except: + raise TestFailed, "int(long(sys.maxint) + 1) didn't overflow" + + x = hugeneg_aslong - 1 + try: + int(x) + raise ValueError + except OverflowError: + pass + except: + raise TestFailed, "int(long(-sys.maxint-1) - 1) didn't overflow" + +# ----------------------------------- tests of auto int->long conversion + +def test_auto_overflow(): + import math, sys + + if verbose: + print "auto-convert int->long on overflow" + + special = [0, 1, 2, 3, sys.maxint-1, sys.maxint, sys.maxint+1] + sqrt = int(math.sqrt(sys.maxint)) + special.extend([sqrt-1, sqrt, sqrt+1]) + special.extend([-i for i in special]) + + def checkit(*args): + # Heavy use of nested scopes here! + verify(got == expected, "for %r expected %r got %r" % + (args, expected, got)) + + for x in special: + longx = long(x) + + expected = -longx + got = -x + checkit('-', x) + + for y in special: + longy = long(y) + + expected = longx + longy + got = x + y + checkit(x, '+', y) + + expected = longx - longy + got = x - y + checkit(x, '-', y) + + expected = longx * longy + got = x * y + checkit(x, '*', y) + + if y: + expected = longx / longy + got = x / y + checkit(x, '/', y) + + expected = longx // longy + got = x // y + checkit(x, '//', y) + + expected = divmod(longx, longy) + got = divmod(longx, longy) + checkit(x, 'divmod', y) + + if abs(y) < 5 and not (x == 0 and y < 0): + expected = longx ** longy + got = x ** y + checkit(x, '**', y) + + for z in special: + if z != 0 : + if y >= 0: + expected = pow(longx, longy, long(z)) + got = pow(x, y, z) + checkit('pow', x, y, '%', z) + else: + try: + pow(longx, longy, long(z)) + except TypeError: + pass + else: + raise TestFailed("pow%r should have raised " + "TypeError" % ((longx, longy, long(z)))) + +# ---------------------------------------- tests of long->float overflow + +def test_float_overflow(): + import math + + if verbose: + print "long->float overflow" + + for x in -2.0, -1.0, 0.0, 1.0, 2.0: + verify(float(long(x)) == x) + + shuge = '12345' * 1000 + huge = 1L << 30000 + mhuge = -huge + namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math} + for test in ["float(huge)", "float(mhuge)", + "complex(huge)", "complex(mhuge)", + "complex(huge, 1)", "complex(mhuge, 1)", + "complex(1, huge)", "complex(1, mhuge)", + "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.", + "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.", + "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.", + "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.", + "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.", + "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.", + "math.sin(huge)", "math.sin(mhuge)", + "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better + "math.floor(huge)", "math.floor(mhuge)", + "float(shuge) == long(shuge)"]: + + try: + eval(test, namespace) + except OverflowError: + pass + else: + raise TestFailed("expected OverflowError from %s" % test) + +# ---------------------------------------------- test huge log and log10 + +def test_logs(): + import math + + if verbose: + print "log and log10" + + LOG10E = math.log10(math.e) + + for exp in range(10) + [100, 1000, 10000]: + value = 10 ** exp + log10 = math.log10(value) + verify(fcmp(log10, exp) == 0) + + # log10(value) == exp, so log(value) == log10(value)/log10(e) == + # exp/LOG10E + expected = exp / LOG10E + log = math.log(value) + verify(fcmp(log, expected) == 0) + + for bad in -(1L << 10000), -2L, 0L: + try: + math.log(bad) + raise TestFailed("expected ValueError from log(<= 0)") + except ValueError: + pass + + try: + math.log10(bad) + raise TestFailed("expected ValueError from log10(<= 0)") + except ValueError: + pass + +# ---------------------------------------------------------------- do it + +test_division() +test_bitop_identities() +test_format() +test_misc() +test_auto_overflow() +test_float_overflow() +test_logs() diff --git a/lib-python/2.2/test/test_long_future.py b/lib-python/2.2/test/test_long_future.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_long_future.py @@ -0,0 +1,55 @@ +from __future__ import division +# When true division is the default, get rid of this and add it to +# test_long.py instead. In the meantime, it's too obscure to try to +# trick just part of test_long into using future division. + +from test_support import TestFailed, verify, verbose + +def test_true_division(): + if verbose: + print "long true division" + huge = 1L << 40000 + mhuge = -huge + verify(huge / huge == 1.0) + verify(mhuge / mhuge == 1.0) + verify(huge / mhuge == -1.0) + verify(mhuge / huge == -1.0) + verify(1 / huge == 0.0) + verify(1L / huge == 0.0) + verify(1 / mhuge == 0.0) + verify(1L / mhuge == 0.0) + verify((666 * huge + (huge >> 1)) / huge == 666.5) + verify((666 * mhuge + (mhuge >> 1)) / mhuge == 666.5) + verify((666 * huge + (huge >> 1)) / mhuge == -666.5) + verify((666 * mhuge + (mhuge >> 1)) / huge == -666.5) + verify(huge / (huge << 1) == 0.5) + verify((1000000 * huge) / huge == 1000000) + + namespace = {'huge': huge, 'mhuge': mhuge} + + for overflow in ["float(huge)", "float(mhuge)", + "huge / 1", "huge / 2L", "huge / -1", "huge / -2L", + "mhuge / 100", "mhuge / 100L"]: + try: + eval(overflow, namespace) + except OverflowError: + pass + else: + raise TestFailed("expected OverflowError from %r" % overflow) + + for underflow in ["1 / huge", "2L / huge", "-1 / huge", "-2L / huge", + "100 / mhuge", "100L / mhuge"]: + result = eval(underflow, namespace) + if result != 0.0: + raise TestFailed("expected underflow to 0 from %r" % underflow) + + for zero in ["huge / 0", "huge / 0L", + "mhuge / 0", "mhuge / 0L"]: + try: + eval(zero, namespace) + except ZeroDivisionError: + pass + else: + raise TestFailed("expected ZeroDivisionError from %r" % zero) + +test_true_division() diff --git a/lib-python/2.2/test/test_longexp.py b/lib-python/2.2/test/test_longexp.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_longexp.py @@ -0,0 +1,12 @@ +import sys +from test_support import TestSkipped + +REPS = 65580 + +if sys.platform == 'mac': + import gestalt + if gestalt.gestalt('sysv') > 0x9ff: + raise TestSkipped, 'Triggers pathological malloc slowdown on OSX MacPython' + +l = eval("[" + "2," * REPS + "]") +print len(l) diff --git a/lib-python/2.2/test/test_mailbox.py b/lib-python/2.2/test/test_mailbox.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mailbox.py @@ -0,0 +1,104 @@ +import mailbox +import os +import test_support +import time +import unittest + +# cleanup earlier tests +try: + os.unlink(test_support.TESTFN) +except os.error: + pass + + +DUMMY_MESSAGE = """\ +From: some.body at dummy.domain +To: me at my.domain + +This is a dummy message. +""" + + +class MaildirTestCase(unittest.TestCase): + + def setUp(self): + # create a new maildir mailbox to work with: + self._dir = test_support.TESTFN + os.mkdir(self._dir) + os.mkdir(os.path.join(self._dir, "cur")) + os.mkdir(os.path.join(self._dir, "tmp")) + os.mkdir(os.path.join(self._dir, "new")) + self._counter = 1 + self._msgfiles = [] + + def tearDown(self): + map(os.unlink, self._msgfiles) + os.rmdir(os.path.join(self._dir, "cur")) + os.rmdir(os.path.join(self._dir, "tmp")) + os.rmdir(os.path.join(self._dir, "new")) + os.rmdir(self._dir) + + def createMessage(self, dir): + t = int(time.time() % 1000000) + pid = self._counter + self._counter += 1 + filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) + tmpname = os.path.join(self._dir, "tmp", filename) + newname = os.path.join(self._dir, dir, filename) + fp = open(tmpname, "w") + self._msgfiles.append(tmpname) + fp.write(DUMMY_MESSAGE) + fp.close() + if hasattr(os, "link"): + os.link(tmpname, newname) + else: + fp = open(newname, "w") + fp.write(DUMMY_MESSAGE) + fp.close() + self._msgfiles.append(newname) + + def test_empty_maildir(self): + """Test an empty maildir mailbox""" + # Test for regression on bug #117490: + # Make sure the boxes attribute actually gets set. + self.mbox = mailbox.Maildir(test_support.TESTFN) + self.assert_(hasattr(self.mbox, "boxes")) + self.assert_(len(self.mbox.boxes) == 0) + self.assert_(self.mbox.next() is None) + self.assert_(self.mbox.next() is None) + + def test_nonempty_maildir_cur(self): + self.createMessage("cur") + self.mbox = mailbox.Maildir(test_support.TESTFN) + self.assert_(len(self.mbox.boxes) == 1) + self.assert_(self.mbox.next() is not None) + self.assert_(self.mbox.next() is None) + self.assert_(self.mbox.next() is None) + + def test_nonempty_maildir_new(self): + self.createMessage("new") + self.mbox = mailbox.Maildir(test_support.TESTFN) + self.assert_(len(self.mbox.boxes) == 1) + self.assert_(self.mbox.next() is not None) + self.assert_(self.mbox.next() is None) + self.assert_(self.mbox.next() is None) + + def test_nonempty_maildir_both(self): + self.createMessage("cur") + self.createMessage("new") + self.mbox = mailbox.Maildir(test_support.TESTFN) + self.assert_(len(self.mbox.boxes) == 2) + self.assert_(self.mbox.next() is not None) + self.assert_(self.mbox.next() is not None) + self.assert_(self.mbox.next() is None) + self.assert_(self.mbox.next() is None) + + # XXX We still need more tests! + + +def test_main(): + test_support.run_unittest(MaildirTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_marshal.py b/lib-python/2.2/test/test_marshal.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_marshal.py @@ -0,0 +1,44 @@ +from test_support import TestFailed +import marshal +import sys + +# XXX Much more needed here. + +# Test the full range of Python ints. +n = sys.maxint +while n: + for expected in (-n, n): + s = marshal.dumps(expected) + got = marshal.loads(s) + if expected != got: + raise TestFailed("for int %d, marshal string is %r, loaded " + "back as %d" % (expected, s, got)) + n = n >> 1 + +# Simulate int marshaling on a 64-bit box. This is most interesting if +# we're running the test on a 32-bit box, of course. + +def to_little_endian_string(value, nbytes): + bytes = [] + for i in range(nbytes): + bytes.append(chr(value & 0xff)) + value >>= 8 + return ''.join(bytes) + +maxint64 = (1L << 63) - 1 +minint64 = -maxint64-1 + +for base in maxint64, minint64, -maxint64, -(minint64 >> 1): + while base: + s = 'I' + to_little_endian_string(base, 8) + got = marshal.loads(s) + if base != got: + raise TestFailed("for int %d, simulated marshal string is %r, " + "loaded back as %d" % (base, s, got)) + if base == -1: # a fixed-point for shifting right 1 + base = 0 + else: + base >>= 1 + +# Simple-minded check for SF 588452: Debug build crashes +marshal.dumps([128] * 1000) diff --git a/lib-python/2.2/test/test_math.py b/lib-python/2.2/test/test_math.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_math.py @@ -0,0 +1,195 @@ +# Python test set -- math module +# XXXX Should not do tests around zero only + +from test_support import * + +seps='1e-05' +eps = eval(seps) +print 'math module, testing with eps', seps +import math + +def testit(name, value, expected): + if abs(value-expected) > eps: + raise TestFailed, '%s returned %f, expected %f'%\ + (name, value, expected) + +print 'constants' +testit('pi', math.pi, 3.1415926) +testit('e', math.e, 2.7182818) + +print 'acos' +testit('acos(-1)', math.acos(-1), math.pi) +testit('acos(0)', math.acos(0), math.pi/2) +testit('acos(1)', math.acos(1), 0) + +print 'asin' +testit('asin(-1)', math.asin(-1), -math.pi/2) +testit('asin(0)', math.asin(0), 0) +testit('asin(1)', math.asin(1), math.pi/2) + +print 'atan' +testit('atan(-1)', math.atan(-1), -math.pi/4) +testit('atan(0)', math.atan(0), 0) +testit('atan(1)', math.atan(1), math.pi/4) + +print 'atan2' +testit('atan2(-1, 0)', math.atan2(-1, 0), -math.pi/2) +testit('atan2(-1, 1)', math.atan2(-1, 1), -math.pi/4) +testit('atan2(0, 1)', math.atan2(0, 1), 0) +testit('atan2(1, 1)', math.atan2(1, 1), math.pi/4) +testit('atan2(1, 0)', math.atan2(1, 0), math.pi/2) + +print 'ceil' +testit('ceil(0.5)', math.ceil(0.5), 1) +testit('ceil(1.0)', math.ceil(1.0), 1) +testit('ceil(1.5)', math.ceil(1.5), 2) +testit('ceil(-0.5)', math.ceil(-0.5), 0) +testit('ceil(-1.0)', math.ceil(-1.0), -1) +testit('ceil(-1.5)', math.ceil(-1.5), -1) + +print 'cos' +testit('cos(-pi/2)', math.cos(-math.pi/2), 0) +testit('cos(0)', math.cos(0), 1) +testit('cos(pi/2)', math.cos(math.pi/2), 0) +testit('cos(pi)', math.cos(math.pi), -1) + +print 'cosh' +testit('cosh(0)', math.cosh(0), 1) +testit('cosh(2)-2*cosh(1)**2', math.cosh(2)-2*math.cosh(1)**2, -1) # Thanks to Lambert + +print 'exp' +testit('exp(-1)', math.exp(-1), 1/math.e) +testit('exp(0)', math.exp(0), 1) +testit('exp(1)', math.exp(1), math.e) + +print 'fabs' +testit('fabs(-1)', math.fabs(-1), 1) +testit('fabs(0)', math.fabs(0), 0) +testit('fabs(1)', math.fabs(1), 1) + +print 'floor' +testit('floor(0.5)', math.floor(0.5), 0) +testit('floor(1.0)', math.floor(1.0), 1) +testit('floor(1.5)', math.floor(1.5), 1) +testit('floor(-0.5)', math.floor(-0.5), -1) +testit('floor(-1.0)', math.floor(-1.0), -1) +testit('floor(-1.5)', math.floor(-1.5), -2) + +print 'fmod' +testit('fmod(10,1)', math.fmod(10,1), 0) +testit('fmod(10,0.5)', math.fmod(10,0.5), 0) +testit('fmod(10,1.5)', math.fmod(10,1.5), 1) +testit('fmod(-10,1)', math.fmod(-10,1), 0) +testit('fmod(-10,0.5)', math.fmod(-10,0.5), 0) +testit('fmod(-10,1.5)', math.fmod(-10,1.5), -1) + +print 'frexp' +def testfrexp(name, (mant, exp), (emant, eexp)): + if abs(mant-emant) > eps or exp != eexp: + raise TestFailed, '%s returned %s, expected %s'%\ + (name, `mant, exp`, `emant,eexp`) + +testfrexp('frexp(-1)', math.frexp(-1), (-0.5, 1)) +testfrexp('frexp(0)', math.frexp(0), (0, 0)) +testfrexp('frexp(1)', math.frexp(1), (0.5, 1)) +testfrexp('frexp(2)', math.frexp(2), (0.5, 2)) + +print 'hypot' +testit('hypot(0,0)', math.hypot(0,0), 0) +testit('hypot(3,4)', math.hypot(3,4), 5) + +print 'ldexp' +testit('ldexp(0,1)', math.ldexp(0,1), 0) +testit('ldexp(1,1)', math.ldexp(1,1), 2) +testit('ldexp(1,-1)', math.ldexp(1,-1), 0.5) +testit('ldexp(-1,1)', math.ldexp(-1,1), -2) + +print 'log' +testit('log(1/e)', math.log(1/math.e), -1) +testit('log(1)', math.log(1), 0) +testit('log(e)', math.log(math.e), 1) + +print 'log10' +testit('log10(0.1)', math.log10(0.1), -1) +testit('log10(1)', math.log10(1), 0) +testit('log10(10)', math.log10(10), 1) + +print 'modf' +def testmodf(name, (v1, v2), (e1, e2)): + if abs(v1-e1) > eps or abs(v2-e2): + raise TestFailed, '%s returned %s, expected %s'%\ + (name, `v1,v2`, `e1,e2`) + +testmodf('modf(1.5)', math.modf(1.5), (0.5, 1.0)) +testmodf('modf(-1.5)', math.modf(-1.5), (-0.5, -1.0)) + +print 'pow' +testit('pow(0,1)', math.pow(0,1), 0) +testit('pow(1,0)', math.pow(1,0), 1) +testit('pow(2,1)', math.pow(2,1), 2) +testit('pow(2,-1)', math.pow(2,-1), 0.5) + +print 'sin' +testit('sin(0)', math.sin(0), 0) +testit('sin(pi/2)', math.sin(math.pi/2), 1) +testit('sin(-pi/2)', math.sin(-math.pi/2), -1) + +print 'sinh' +testit('sinh(0)', math.sinh(0), 0) +testit('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1) +testit('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0) + +print 'sqrt' +testit('sqrt(0)', math.sqrt(0), 0) +testit('sqrt(1)', math.sqrt(1), 1) +testit('sqrt(4)', math.sqrt(4), 2) + +print 'tan' +testit('tan(0)', math.tan(0), 0) +testit('tan(pi/4)', math.tan(math.pi/4), 1) +testit('tan(-pi/4)', math.tan(-math.pi/4), -1) + +print 'tanh' +testit('tanh(0)', math.tanh(0), 0) +testit('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0) + +# RED_FLAG 16-Oct-2000 Tim +# While 2.0 is more consistent about exceptions than previous releases, it +# still fails this part of the test on some platforms. For now, we only +# *run* test_exceptions() in verbose mode, so that this isn't normally +# tested. + +def test_exceptions(): + print 'exceptions' + try: + x = math.exp(-1000000000) + except: + # mathmodule.c is failing to weed out underflows from libm, or + # we've got an fp format with huge dynamic range + raise TestFailed("underflowing exp() should not have raised " + "an exception") + if x != 0: + raise TestFailed("underflowing exp() should have returned 0") + + # If this fails, probably using a strict IEEE-754 conforming libm, and x + # is +Inf afterwards. But Python wants overflows detected by default. + try: + x = math.exp(1000000000) + except OverflowError: + pass + else: + raise TestFailed("overflowing exp() didn't trigger OverflowError") + + # If this fails, it could be a puzzle. One odd possibility is that + # mathmodule.c's macros are getting confused while comparing + # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE + # as a result (and so raising OverflowError instead). + try: + x = math.sqrt(-1.0) + except ValueError: + pass + else: + raise TestFailed("sqrt(-1) didn't raise ValueError") + +if verbose: + test_exceptions() diff --git a/lib-python/2.2/test/test_md5.py b/lib-python/2.2/test/test_md5.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_md5.py @@ -0,0 +1,30 @@ +# Testing md5 module + +import string +from md5 import md5 + +def hexstr(s): + h = string.hexdigits + r = '' + for c in s: + i = ord(c) + r = r + h[(i >> 4) & 0xF] + h[i & 0xF] + return r + +def md5test(s): + return 'MD5 ("' + s + '") = ' + hexstr(md5(s).digest()) + +print 'MD5 test suite:' +print md5test('') +print md5test('a') +print md5test('abc') +print md5test('message digest') +print md5test('abcdefghijklmnopqrstuvwxyz') +print md5test('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') +print md5test('12345678901234567890123456789012345678901234567890123456789012345678901234567890') + +# hexdigest is new with Python 2.0 +m = md5('testing the hexdigest method') +h = m.hexdigest() +if hexstr(m.digest()) != h: + print 'hexdigest() failed' diff --git a/lib-python/2.2/test/test_mhlib.py b/lib-python/2.2/test/test_mhlib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mhlib.py @@ -0,0 +1,340 @@ +""" + Tests for the mhlib module + Nick Mathewson +""" + +### BUG: This suite doesn't currently test the mime functionality of +### mhlib. It should. + +import unittest +from test_support import run_unittest, TESTFN, TestSkipped +import os, StringIO +import sys +import mhlib + +if sys.platform.startswith("win") or sys.platform=="riscos": + raise TestSkipped("test_mhlib skipped on %s -- "%sys.platform + + "too many Unix assumptions") + +_mhroot = TESTFN+"_MH" +_mhpath = os.path.join(_mhroot, "MH") +_mhprofile = os.path.join(_mhroot, ".mh_profile") + +def normF(f): + return os.path.join(*f.split('/')) + +def writeFile(fname, contents): + dir = os.path.split(fname)[0] + if dir and not os.path.exists(dir): + mkdirs(dir) + f = open(fname, 'w') + f.write(contents) + f.close() + +def readFile(fname): + f = open(fname) + r = f.read() + f.close() + return r + +def writeProfile(dict): + contents = [ "%s: %s\n" % (k, v) for k, v in dict.iteritems() ] + writeFile(_mhprofile, "".join(contents)) + +def writeContext(folder): + folder = normF(folder) + writeFile(os.path.join(_mhpath, "context"), + "Current-Folder: %s\n" % folder) + +def writeCurMessage(folder, cur): + folder = normF(folder) + writeFile(os.path.join(_mhpath, folder, ".mh_sequences"), + "cur: %s\n"%cur) + +def writeMessage(folder, n, headers, body): + folder = normF(folder) + headers = "".join([ "%s: %s\n" % (k, v) for k, v in headers.iteritems() ]) + contents = "%s\n%s\n" % (headers,body) + mkdirs(os.path.join(_mhpath, folder)) + writeFile(os.path.join(_mhpath, folder, str(n)), contents) + +def getMH(): + return mhlib.MH(os.path.abspath(_mhpath), _mhprofile) + +def sortLines(s): + lines = s.split("\n") + lines = [ line.strip() for line in lines if len(line) >= 2 ] + lines.sort() + return lines + +# These next 2 functions are copied from test_glob.py. +def mkdirs(fname): + if os.path.exists(fname) or fname == '': + return + base, file = os.path.split(fname) + mkdirs(base) + os.mkdir(fname) + +def deltree(fname): + if not os.path.exists(fname): + return + for f in os.listdir(fname): + fullname = os.path.join(fname, f) + if os.path.isdir(fullname): + deltree(fullname) + else: + try: + os.unlink(fullname) + except: + pass + try: + os.rmdir(fname) + except: + pass + +class MhlibTests(unittest.TestCase): + def setUp(self): + deltree(_mhroot) + mkdirs(_mhpath) + writeProfile({'Path' : os.path.abspath(_mhpath), + 'Editor': 'emacs', + 'ignored-attribute': 'camping holiday'}) + # Note: These headers aren't really conformant to RFC822, but + # mhlib shouldn't care about that. + + # An inbox with a couple of messages. + writeMessage('inbox', 1, + {'From': 'Mrs. Premise', + 'To': 'Mrs. Conclusion', + 'Date': '18 July 2001'}, "Hullo, Mrs. Conclusion!\n") + writeMessage('inbox', 2, + {'From': 'Mrs. Conclusion', + 'To': 'Mrs. Premise', + 'Date': '29 July 2001'}, "Hullo, Mrs. Premise!\n") + + # A folder with many messages + for i in range(5, 101)+range(101, 201, 2): + writeMessage('wide', i, + {'From': 'nowhere', 'Subject': 'message #%s' % i}, + "This is message number %s\n" % i) + + # A deeply nested folder + def deep(folder, n): + writeMessage(folder, n, + {'Subject': 'Message %s/%s' % (folder, n) }, + "This is message number %s in %s\n" % (n, folder) ) + deep('deep/f1', 1) + deep('deep/f1', 2) + deep('deep/f1', 3) + deep('deep/f2', 4) + deep('deep/f2', 6) + deep('deep', 3) + deep('deep/f2/f3', 1) + deep('deep/f2/f3', 2) + + def tearDown(self): + deltree(_mhroot) + + def test_basic(self): + writeContext('inbox') + writeCurMessage('inbox', 2) + mh = getMH() + + eq = self.assertEquals + eq(mh.getprofile('Editor'), 'emacs') + eq(mh.getprofile('not-set'), None) + eq(mh.getpath(), os.path.abspath(_mhpath)) + eq(mh.getcontext(), 'inbox') + + mh.setcontext('wide') + eq(mh.getcontext(), 'wide') + eq(readFile(os.path.join(_mhpath, 'context')), + "Current-Folder: wide\n") + + mh.setcontext('inbox') + + inbox = mh.openfolder('inbox') + eq(inbox.getfullname(), + os.path.join(os.path.abspath(_mhpath), 'inbox')) + eq(inbox.getsequencesfilename(), + os.path.join(os.path.abspath(_mhpath), 'inbox', '.mh_sequences')) + eq(inbox.getmessagefilename(1), + os.path.join(os.path.abspath(_mhpath), 'inbox', '1')) + + def test_listfolders(self): + mh = getMH() + eq = self.assertEquals + + folders = mh.listfolders() + folders.sort() + eq(folders, ['deep', 'inbox', 'wide']) + + folders = mh.listallfolders() + folders.sort() + tfolders = map(normF, ['deep', 'deep/f1', 'deep/f2', 'deep/f2/f3', + 'inbox', 'wide']) + tfolders.sort() + eq(folders, tfolders) + + folders = mh.listsubfolders('deep') + folders.sort() + eq(folders, map(normF, ['deep/f1', 'deep/f2'])) + + folders = mh.listallsubfolders('deep') + folders.sort() + eq(folders, map(normF, ['deep/f1', 'deep/f2', 'deep/f2/f3'])) + eq(mh.listsubfolders(normF('deep/f2')), [normF('deep/f2/f3')]) + + eq(mh.listsubfolders('inbox'), []) + eq(mh.listallsubfolders('inbox'), []) + + def test_sequence(self): + mh = getMH() + eq = self.assertEquals + writeCurMessage('wide', 55) + + f = mh.openfolder('wide') + all = f.listmessages() + eq(all, range(5, 101)+range(101, 201, 2)) + eq(f.getcurrent(), 55) + f.setcurrent(99) + eq(readFile(os.path.join(_mhpath, 'wide', '.mh_sequences')), + 'cur: 99\n') + + def seqeq(seq, val): + eq(f.parsesequence(seq), val) + + seqeq('5-55', range(5, 56)) + seqeq('90-108', range(90, 101)+range(101, 109, 2)) + seqeq('90-108', range(90, 101)+range(101, 109, 2)) + + seqeq('10:10', range(10, 20)) + seqeq('10:+10', range(10, 20)) + seqeq('101:10', range(101, 121, 2)) + + seqeq('cur', [99]) + seqeq('.', [99]) + seqeq('prev', [98]) + seqeq('next', [100]) + seqeq('cur:-3', [97, 98, 99]) + seqeq('first-cur', range(5, 100)) + seqeq('150-last', range(151, 201, 2)) + seqeq('prev-next', [98, 99, 100]) + + lowprimes = [5, 7, 11, 13, 17, 19, 23, 29] + lowcompos = [x for x in range(5, 31) if not x in lowprimes ] + f.putsequences({'cur': [5], + 'lowprime': lowprimes, + 'lowcompos': lowcompos}) + seqs = readFile(os.path.join(_mhpath, 'wide', '.mh_sequences')) + seqs = sortLines(seqs) + eq(seqs, ["cur: 5", + "lowcompos: 6 8-10 12 14-16 18 20-22 24-28 30", + "lowprime: 5 7 11 13 17 19 23 29"]) + + seqeq('lowprime', lowprimes) + seqeq('lowprime:1', [5]) + seqeq('lowprime:2', [5, 7]) + seqeq('lowprime:-2', [23, 29]) + + ## Not supported + #seqeq('lowprime:first', [5]) + #seqeq('lowprime:last', [29]) + #seqeq('lowprime:prev', [29]) + #seqeq('lowprime:next', [29]) + + def test_modify(self): + mh = getMH() + eq = self.assertEquals + + mh.makefolder("dummy1") + self.assert_("dummy1" in mh.listfolders()) + path = os.path.join(_mhpath, "dummy1") + self.assert_(os.path.exists(path)) + + f = mh.openfolder('dummy1') + def create(n): + msg = "From: foo\nSubject: %s\n\nDummy Message %s\n" % (n,n) + f.createmessage(n, StringIO.StringIO(msg)) + + create(7) + create(8) + create(9) + + eq(readFile(f.getmessagefilename(9)), + "From: foo\nSubject: 9\n\nDummy Message 9\n") + + eq(f.listmessages(), [7, 8, 9]) + files = os.listdir(path) + files.sort() + eq(files, ['7', '8', '9']) + + f.removemessages(['7', '8']) + files = os.listdir(path) + files.sort() + eq(files, [',7', ',8', '9']) + eq(f.listmessages(), [9]) + create(10) + create(11) + create(12) + + mh.makefolder("dummy2") + f2 = mh.openfolder("dummy2") + eq(f2.listmessages(), []) + f.movemessage(10, f2, 3) + f.movemessage(11, f2, 5) + eq(f.listmessages(), [9, 12]) + eq(f2.listmessages(), [3, 5]) + eq(readFile(f2.getmessagefilename(3)), + "From: foo\nSubject: 10\n\nDummy Message 10\n") + + f.copymessage(9, f2, 4) + eq(f.listmessages(), [9, 12]) + eq(readFile(f2.getmessagefilename(4)), + "From: foo\nSubject: 9\n\nDummy Message 9\n") + + f.refilemessages([9, 12], f2) + eq(f.listmessages(), []) + eq(f2.listmessages(), [3, 4, 5, 6, 7]) + eq(readFile(f2.getmessagefilename(7)), + "From: foo\nSubject: 12\n\nDummy Message 12\n") + # XXX This should check that _copysequences does the right thing. + + mh.deletefolder('dummy1') + mh.deletefolder('dummy2') + self.assert_('dummy1' not in mh.listfolders()) + self.assert_(not os.path.exists(path)) + + def test_read(self): + mh = getMH() + eq = self.assertEquals + + f = mh.openfolder('inbox') + msg = f.openmessage(1) + # Check some basic stuff from rfc822 + eq(msg.getheader('From'), "Mrs. Premise") + eq(msg.getheader('To'), "Mrs. Conclusion") + + # Okay, we have the right message. Let's check the stuff from + # mhlib. + lines = sortLines(msg.getheadertext()) + eq(lines, ["Date: 18 July 2001", + "From: Mrs. Premise", + "To: Mrs. Conclusion"]) + lines = sortLines(msg.getheadertext(lambda h: len(h)==4)) + eq(lines, ["Date: 18 July 2001", + "From: Mrs. Premise"]) + eq(msg.getbodytext(), "Hullo, Mrs. Conclusion!\n\n") + eq(msg.getbodytext(0), "Hullo, Mrs. Conclusion!\n\n") + + # XXXX there should be a better way to reclaim the file handle + msg.fp.close() + del msg + + +def test_main(): + run_unittest(MhlibTests) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_mimetools.py b/lib-python/2.2/test/test_mimetools.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mimetools.py @@ -0,0 +1,18 @@ +from test_support import TestFailed +import mimetools + +import string,StringIO +start = string.ascii_letters + "=" + string.digits + "\n" +for enc in ['7bit','8bit','base64','quoted-printable']: + print enc, + i = StringIO.StringIO(start) + o = StringIO.StringIO() + mimetools.encode(i,o,enc) + i = StringIO.StringIO(o.getvalue()) + o = StringIO.StringIO() + mimetools.decode(i,o,enc) + if o.getvalue()==start: + print "PASS" + else: + print "FAIL" + print o.getvalue() diff --git a/lib-python/2.2/test/test_mimetypes.py b/lib-python/2.2/test/test_mimetypes.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mimetypes.py @@ -0,0 +1,59 @@ +import mimetypes +import StringIO +import unittest + +import test_support + +# Tell it we don't know about external files: +mimetypes.knownfiles = [] + + +class MimeTypesTestCase(unittest.TestCase): + def setUp(self): + self.db = mimetypes.MimeTypes() + + def test_default_data(self): + self.assertEqual(self.db.guess_type("foo.html"), + ("text/html", None)) + self.assertEqual(self.db.guess_type("foo.tgz"), + ("application/x-tar", "gzip")) + self.assertEqual(self.db.guess_type("foo.tar.gz"), + ("application/x-tar", "gzip")) + self.assertEqual(self.db.guess_type("foo.tar.Z"), + ("application/x-tar", "compress")) + + def test_data_urls(self): + self.assertEqual(self.db.guess_type("data:,thisIsTextPlain"), + ("text/plain", None)) + self.assertEqual(self.db.guess_type("data:;base64,thisIsTextPlain"), + ("text/plain", None)) + self.assertEqual(self.db.guess_type("data:text/x-foo,thisIsTextXFoo"), + ("text/x-foo", None)) + + def test_file_parsing(self): + sio = StringIO.StringIO("x-application/x-unittest pyunit\n") + self.db.readfp(sio) + self.assertEqual(self.db.guess_type("foo.pyunit"), + ("x-application/x-unittest", None)) + self.assertEqual(self.db.guess_extension("x-application/x-unittest"), + ".pyunit") + + def test_non_standard_types(self): + # First try strict + self.assertEqual(self.db.guess_type('foo.xul', strict=1), + (None, None)) + self.assertEqual(self.db.guess_extension('image/jpg', strict=1), + None) + # And then non-strict + self.assertEqual(self.db.guess_type('foo.xul', strict=0), + ('text/xul', None)) + self.assertEqual(self.db.guess_extension('image/jpg', strict=0), + '.jpg') + + +def test_main(): + test_support.run_unittest(MimeTypesTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_minidom.py b/lib-python/2.2/test/test_minidom.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_minidom.py @@ -0,0 +1,649 @@ +# test for xml.dom.minidom + +from xml.dom.minidom import parse, Node, Document, parseString +from xml.dom import HierarchyRequestErr +import xml.parsers.expat + +import os +import sys +import traceback +from test_support import verbose + +if __name__ == "__main__": + base = sys.argv[0] +else: + base = __file__ +tstfile = os.path.join(os.path.dirname(base), "test"+os.extsep+"xml") +del base + +def confirm(test, testname = "Test"): + if not test: + print "Failed " + testname + raise Exception + +Node._debug = 1 + +def testParseFromFile(): + from StringIO import StringIO + dom = parse(StringIO(open(tstfile).read())) + dom.unlink() + confirm(isinstance(dom,Document)) + +def testGetElementsByTagName(): + dom = parse(tstfile) + confirm(dom.getElementsByTagName("LI") == \ + dom.documentElement.getElementsByTagName("LI")) + dom.unlink() + +def testInsertBefore(): + dom = parseString("") + root = dom.documentElement + elem = root.childNodes[0] + nelem = dom.createElement("element") + root.insertBefore(nelem, elem) + confirm(len(root.childNodes) == 2 + and root.childNodes.length == 2 + and root.childNodes[0] is nelem + and root.childNodes.item(0) is nelem + and root.childNodes[1] is elem + and root.childNodes.item(1) is elem + and root.firstChild is nelem + and root.lastChild is elem + and root.toxml() == "" + , "testInsertBefore -- node properly placed in tree") + nelem = dom.createElement("element") + root.insertBefore(nelem, None) + confirm(len(root.childNodes) == 3 + and root.childNodes.length == 3 + and root.childNodes[1] is elem + and root.childNodes.item(1) is elem + and root.childNodes[2] is nelem + and root.childNodes.item(2) is nelem + and root.lastChild is nelem + and nelem.previousSibling is elem + and root.toxml() == "" + , "testInsertBefore -- node properly placed in tree") + nelem2 = dom.createElement("bar") + root.insertBefore(nelem2, nelem) + confirm(len(root.childNodes) == 4 + and root.childNodes.length == 4 + and root.childNodes[2] is nelem2 + and root.childNodes.item(2) is nelem2 + and root.childNodes[3] is nelem + and root.childNodes.item(3) is nelem + and nelem2.nextSibling is nelem + and nelem.previousSibling is nelem2 + and root.toxml() == "" + , "testInsertBefore -- node properly placed in tree") + dom.unlink() + +def _create_fragment_test_nodes(): + dom = parseString("") + orig = dom.createTextNode("original") + c1 = dom.createTextNode("foo") + c2 = dom.createTextNode("bar") + c3 = dom.createTextNode("bat") + dom.documentElement.appendChild(orig) + frag = dom.createDocumentFragment() + frag.appendChild(c1) + frag.appendChild(c2) + frag.appendChild(c3) + return dom, orig, c1, c2, c3, frag + +def testInsertBeforeFragment(): + dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes() + dom.documentElement.insertBefore(frag, None) + confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3), + "insertBefore(, None)") + frag.unlink() + dom.unlink() + # + dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes() + dom.documentElement.insertBefore(frag, orig) + confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3, orig), + "insertBefore(, orig)") + frag.unlink() + dom.unlink() + +def testAppendChild(): + dom = parse(tstfile) + dom.documentElement.appendChild(dom.createComment(u"Hello")) + confirm(dom.documentElement.childNodes[-1].nodeName == "#comment") + confirm(dom.documentElement.childNodes[-1].data == "Hello") + dom.unlink() + +def testAppendChildFragment(): + dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes() + dom.documentElement.appendChild(frag) + confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3), + "appendChild()") + frag.unlink() + dom.unlink() + +def testReplaceChildFragment(): + dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes() + dom.documentElement.replaceChild(frag, orig) + orig.unlink() + confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3), + "replaceChild()") + frag.unlink() + dom.unlink() + +def testLegalChildren(): + dom = Document() + elem = dom.createElement('element') + text = dom.createTextNode('text') + + try: dom.appendChild(text) + except HierarchyRequestErr: pass + else: + print "dom.appendChild didn't raise HierarchyRequestErr" + + dom.appendChild(elem) + try: dom.insertBefore(text, elem) + except HierarchyRequestErr: pass + else: + print "dom.appendChild didn't raise HierarchyRequestErr" + + try: dom.replaceChild(text, elem) + except HierarchyRequestErr: pass + else: + print "dom.appendChild didn't raise HierarchyRequestErr" + + nodemap = elem.attributes + try: nodemap.setNamedItem(text) + except HierarchyRequestErr: pass + else: + print "NamedNodeMap.setNamedItem didn't raise HierarchyRequestErr" + + try: nodemap.setNamedItemNS(text) + except HierarchyRequestErr: pass + else: + print "NamedNodeMap.setNamedItemNS didn't raise HierarchyRequestErr" + + elem.appendChild(text) + dom.unlink() + +def testNamedNodeMapSetItem(): + dom = Document() + elem = dom.createElement('element') + attrs = elem.attributes + attrs["foo"] = "bar" + a = attrs.item(0) + confirm(a.ownerDocument is dom, + "NamedNodeMap.__setitem__() sets ownerDocument") + confirm(a.ownerElement is elem, + "NamedNodeMap.__setitem__() sets ownerElement") + confirm(a.value == "bar", + "NamedNodeMap.__setitem__() sets value") + confirm(a.nodeValue == "bar", + "NamedNodeMap.__setitem__() sets nodeValue") + elem.unlink() + dom.unlink() + +def testNonZero(): + dom = parse(tstfile) + confirm(dom)# should not be zero + dom.appendChild(dom.createComment("foo")) + confirm(not dom.childNodes[-1].childNodes) + dom.unlink() + +def testUnlink(): + dom = parse(tstfile) + dom.unlink() + +def testElement(): + dom = Document() + dom.appendChild(dom.createElement("abc")) + confirm(dom.documentElement) + dom.unlink() + +def testAAA(): + dom = parseString("") + el = dom.documentElement + el.setAttribute("spam", "jam2") + confirm(el.toxml() == '', "testAAA") + a = el.getAttributeNode("spam") + confirm(a.ownerDocument is dom, + "setAttribute() sets ownerDocument") + confirm(a.ownerElement is dom.documentElement, + "setAttribute() sets ownerElement") + dom.unlink() + +def testAAB(): + dom = parseString("") + el = dom.documentElement + el.setAttribute("spam", "jam") + el.setAttribute("spam", "jam2") + confirm(el.toxml() == '', "testAAB") + dom.unlink() + +def testAddAttr(): + dom = Document() + child = dom.appendChild(dom.createElement("abc")) + + child.setAttribute("def", "ghi") + confirm(child.getAttribute("def") == "ghi") + confirm(child.attributes["def"].value == "ghi") + + child.setAttribute("jkl", "mno") + confirm(child.getAttribute("jkl") == "mno") + confirm(child.attributes["jkl"].value == "mno") + + confirm(len(child.attributes) == 2) + + child.setAttribute("def", "newval") + confirm(child.getAttribute("def") == "newval") + confirm(child.attributes["def"].value == "newval") + + confirm(len(child.attributes) == 2) + dom.unlink() + +def testDeleteAttr(): + dom = Document() + child = dom.appendChild(dom.createElement("abc")) + + confirm(len(child.attributes) == 0) + child.setAttribute("def", "ghi") + confirm(len(child.attributes) == 1) + del child.attributes["def"] + confirm(len(child.attributes) == 0) + dom.unlink() + +def testRemoveAttr(): + dom = Document() + child = dom.appendChild(dom.createElement("abc")) + + child.setAttribute("def", "ghi") + confirm(len(child.attributes) == 1) + child.removeAttribute("def") + confirm(len(child.attributes) == 0) + + dom.unlink() + +def testRemoveAttrNS(): + dom = Document() + child = dom.appendChild( + dom.createElementNS("http://www.python.org", "python:abc")) + child.setAttributeNS("http://www.w3.org", "xmlns:python", + "http://www.python.org") + child.setAttributeNS("http://www.python.org", "python:abcattr", "foo") + confirm(len(child.attributes) == 2) + child.removeAttributeNS("http://www.python.org", "abcattr") + confirm(len(child.attributes) == 1) + + dom.unlink() + +def testRemoveAttributeNode(): + dom = Document() + child = dom.appendChild(dom.createElement("foo")) + child.setAttribute("spam", "jam") + confirm(len(child.attributes) == 1) + node = child.getAttributeNode("spam") + child.removeAttributeNode(node) + confirm(len(child.attributes) == 0) + + dom.unlink() + +def testChangeAttr(): + dom = parseString("") + el = dom.documentElement + el.setAttribute("spam", "jam") + confirm(len(el.attributes) == 1) + el.setAttribute("spam", "bam") + confirm(len(el.attributes) == 1) + el.attributes["spam"] = "ham" + confirm(len(el.attributes) == 1) + el.setAttribute("spam2", "bam") + confirm(len(el.attributes) == 2) + el.attributes[ "spam2"] = "bam2" + confirm(len(el.attributes) == 2) + dom.unlink() + +def testGetAttrList(): + pass + +def testGetAttrValues(): pass + +def testGetAttrLength(): pass + +def testGetAttribute(): pass + +def testGetAttributeNS(): pass + +def testGetAttributeNode(): pass + +def testGetElementsByTagNameNS(): + d=""" + + """ + dom = parseString(d) + elem = dom.getElementsByTagNameNS("http://pyxml.sf.net/minidom","myelem") + confirm(len(elem) == 1) + dom.unlink() + +def testGetEmptyNodeListFromElementsByTagNameNS(): pass + +def testElementReprAndStr(): + dom = Document() + el = dom.appendChild(dom.createElement("abc")) + string1 = repr(el) + string2 = str(el) + confirm(string1 == string2) + dom.unlink() + +# commented out until Fredrick's fix is checked in +def _testElementReprAndStrUnicode(): + dom = Document() + el = dom.appendChild(dom.createElement(u"abc")) + string1 = repr(el) + string2 = str(el) + confirm(string1 == string2) + dom.unlink() + +# commented out until Fredrick's fix is checked in +def _testElementReprAndStrUnicodeNS(): + dom = Document() + el = dom.appendChild( + dom.createElementNS(u"http://www.slashdot.org", u"slash:abc")) + string1 = repr(el) + string2 = str(el) + confirm(string1 == string2) + confirm(string1.find("slash:abc") != -1) + dom.unlink() + +def testAttributeRepr(): + dom = Document() + el = dom.appendChild(dom.createElement(u"abc")) + node = el.setAttribute("abc", "def") + confirm(str(node) == repr(node)) + dom.unlink() + +def testTextNodeRepr(): pass + +def testWriteXML(): + str = '\n
' + dom = parseString(str) + domstr = dom.toxml() + dom.unlink() + confirm(str == domstr) + +def testProcessingInstruction(): pass + +def testProcessingInstructionRepr(): pass + +def testTextRepr(): pass + +def testWriteText(): pass + +def testDocumentElement(): pass + +def testTooManyDocumentElements(): + doc = parseString("") + elem = doc.createElement("extra") + try: + doc.appendChild(elem) + except HierarchyRequestErr: + pass + else: + print "Failed to catch expected exception when" \ + " adding extra document element." + elem.unlink() + doc.unlink() + +def testCreateElementNS(): pass + +def testCreateAttributeNS(): pass + +def testParse(): pass + +def testParseString(): pass + +def testComment(): pass + +def testAttrListItem(): pass + +def testAttrListItems(): pass + +def testAttrListItemNS(): pass + +def testAttrListKeys(): pass + +def testAttrListKeysNS(): pass + +def testAttrListValues(): pass + +def testAttrListLength(): pass + +def testAttrList__getitem__(): pass + +def testAttrList__setitem__(): pass + +def testSetAttrValueandNodeValue(): pass + +def testParseElement(): pass + +def testParseAttributes(): pass + +def testParseElementNamespaces(): pass + +def testParseAttributeNamespaces(): pass + +def testParseProcessingInstructions(): pass + +def testChildNodes(): pass + +def testFirstChild(): pass + +def testHasChildNodes(): pass + +def testCloneElementShallow(): + dom, clone = _setupCloneElement(0) + confirm(len(clone.childNodes) == 0 + and clone.childNodes.length == 0 + and clone.parentNode is None + and clone.toxml() == '' + , "testCloneElementShallow") + dom.unlink() + +def testCloneElementDeep(): + dom, clone = _setupCloneElement(1) + confirm(len(clone.childNodes) == 1 + and clone.childNodes.length == 1 + and clone.parentNode is None + and clone.toxml() == '' + , "testCloneElementDeep") + dom.unlink() + +def _setupCloneElement(deep): + dom = parseString("") + root = dom.documentElement + clone = root.cloneNode(deep) + _testCloneElementCopiesAttributes( + root, clone, "testCloneElement" + (deep and "Deep" or "Shallow")) + # mutilate the original so shared data is detected + root.tagName = root.nodeName = "MODIFIED" + root.setAttribute("attr", "NEW VALUE") + root.setAttribute("added", "VALUE") + return dom, clone + +def _testCloneElementCopiesAttributes(e1, e2, test): + attrs1 = e1.attributes + attrs2 = e2.attributes + keys1 = attrs1.keys() + keys2 = attrs2.keys() + keys1.sort() + keys2.sort() + confirm(keys1 == keys2, "clone of element has same attribute keys") + for i in range(len(keys1)): + a1 = attrs1.item(i) + a2 = attrs2.item(i) + confirm(a1 is not a2 + and a1.value == a2.value + and a1.nodeValue == a2.nodeValue + and a1.namespaceURI == a2.namespaceURI + and a1.localName == a2.localName + , "clone of attribute node has proper attribute values") + confirm(a2.ownerElement is e2, + "clone of attribute node correctly owned") + + +def testCloneDocumentShallow(): pass + +def testCloneDocumentDeep(): pass + +def testCloneAttributeShallow(): pass + +def testCloneAttributeDeep(): pass + +def testClonePIShallow(): pass + +def testClonePIDeep(): pass + +def testNormalize(): + doc = parseString("") + root = doc.documentElement + root.appendChild(doc.createTextNode("first")) + root.appendChild(doc.createTextNode("second")) + confirm(len(root.childNodes) == 2 + and root.childNodes.length == 2, "testNormalize -- preparation") + doc.normalize() + confirm(len(root.childNodes) == 1 + and root.childNodes.length == 1 + and root.firstChild is root.lastChild + and root.firstChild.data == "firstsecond" + , "testNormalize -- result") + doc.unlink() + + doc = parseString("") + root = doc.documentElement + root.appendChild(doc.createTextNode("")) + doc.normalize() + confirm(len(root.childNodes) == 0 + and root.childNodes.length == 0, + "testNormalize -- single empty node removed") + doc.unlink() + +def testSiblings(): + doc = parseString("text?") + root = doc.documentElement + (pi, text, elm) = root.childNodes + + confirm(pi.nextSibling is text and + pi.previousSibling is None and + text.nextSibling is elm and + text.previousSibling is pi and + elm.nextSibling is None and + elm.previousSibling is text, "testSiblings") + + doc.unlink() + +def testParents(): + doc = parseString("") + root = doc.documentElement + elm1 = root.childNodes[0] + (elm2a, elm2b) = elm1.childNodes + elm3 = elm2b.childNodes[0] + + confirm(root.parentNode is doc and + elm1.parentNode is root and + elm2a.parentNode is elm1 and + elm2b.parentNode is elm1 and + elm3.parentNode is elm2b, "testParents") + + doc.unlink() + +def testNodeListItem(): + doc = parseString("") + children = doc.childNodes + docelem = children[0] + confirm(children[0] is children.item(0) + and children.item(1) is None + and docelem.childNodes.item(0) is docelem.childNodes[0] + and docelem.childNodes.item(1) is docelem.childNodes[1] + and docelem.childNodes.item(0).childNodes.item(0) is None, + "test NodeList.item()") + doc.unlink() + +def testSAX2DOM(): + from xml.dom import pulldom + + sax2dom = pulldom.SAX2DOM() + sax2dom.startDocument() + sax2dom.startElement("doc", {}) + sax2dom.characters("text") + sax2dom.startElement("subelm", {}) + sax2dom.characters("text") + sax2dom.endElement("subelm") + sax2dom.characters("text") + sax2dom.endElement("doc") + sax2dom.endDocument() + + doc = sax2dom.document + root = doc.documentElement + (text1, elm1, text2) = root.childNodes + text3 = elm1.childNodes[0] + + confirm(text1.previousSibling is None and + text1.nextSibling is elm1 and + elm1.previousSibling is text1 and + elm1.nextSibling is text2 and + text2.previousSibling is elm1 and + text2.nextSibling is None and + text3.previousSibling is None and + text3.nextSibling is None, "testSAX2DOM - siblings") + + confirm(root.parentNode is doc and + text1.parentNode is root and + elm1.parentNode is root and + text2.parentNode is root and + text3.parentNode is elm1, "testSAX2DOM - parents") + + doc.unlink() + +# --- MAIN PROGRAM + +names = globals().keys() +names.sort() + +failed = [] + +try: + Node.allnodes +except AttributeError: + # We don't actually have the minidom from the standard library, + # but are picking up the PyXML version from site-packages. + def check_allnodes(): + pass +else: + def check_allnodes(): + confirm(len(Node.allnodes) == 0, + "assertion: len(Node.allnodes) == 0") + if len(Node.allnodes): + print "Garbage left over:" + if verbose: + print Node.allnodes.items()[0:10] + else: + # Don't print specific nodes if repeatable results + # are needed + print len(Node.allnodes) + Node.allnodes = {} + +for name in names: + if name.startswith("test"): + func = globals()[name] + try: + func() + check_allnodes() + except: + failed.append(name) + print "Test Failed: ", name + sys.stdout.flush() + traceback.print_exception(*sys.exc_info()) + print `sys.exc_info()[1]` + Node.allnodes = {} + +if failed: + print "\n\n\n**** Check for failures in these tests:" + for name in failed: + print " " + name diff --git a/lib-python/2.2/test/test_mmap.py b/lib-python/2.2/test/test_mmap.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mmap.py @@ -0,0 +1,317 @@ +from test.test_support import verify, vereq, TESTFN +import mmap +import os, re + +PAGESIZE = mmap.PAGESIZE + +def test_both(): + "Test mmap module on Unix systems and Windows" + + # Create a file to be mmap'ed. + if os.path.exists(TESTFN): + os.unlink(TESTFN) + f = open(TESTFN, 'w+') + + try: # unlink TESTFN no matter what + # Write 2 pages worth of data to the file + f.write('\0'* PAGESIZE) + f.write('foo') + f.write('\0'* (PAGESIZE-3) ) + f.flush() + m = mmap.mmap(f.fileno(), 2 * PAGESIZE) + f.close() + + # Simple sanity checks + + print type(m) # SF bug 128713: segfaulted on Linux + print ' Position of foo:', m.find('foo') / float(PAGESIZE), 'pages' + vereq(m.find('foo'), PAGESIZE) + + print ' Length of file:', len(m) / float(PAGESIZE), 'pages' + vereq(len(m), 2*PAGESIZE) + + print ' Contents of byte 0:', repr(m[0]) + vereq(m[0], '\0') + print ' Contents of first 3 bytes:', repr(m[0:3]) + vereq(m[0:3], '\0\0\0') + + # Modify the file's content + print "\n Modifying file's content..." + m[0] = '3' + m[PAGESIZE +3: PAGESIZE +3+3] = 'bar' + + # Check that the modification worked + print ' Contents of byte 0:', repr(m[0]) + vereq(m[0], '3') + print ' Contents of first 3 bytes:', repr(m[0:3]) + vereq(m[0:3], '3\0\0') + print ' Contents of second page:', repr(m[PAGESIZE-1 : PAGESIZE + 7]) + vereq(m[PAGESIZE-1 : PAGESIZE + 7], '\0foobar\0') + + m.flush() + + # Test doing a regular expression match in an mmap'ed file + match = re.search('[A-Za-z]+', m) + if match is None: + print ' ERROR: regex match on mmap failed!' + else: + start, end = match.span(0) + length = end - start + + print ' Regex match on mmap (page start, length of match):', + print start / float(PAGESIZE), length + + vereq(start, PAGESIZE) + vereq(end, PAGESIZE + 6) + + # test seeking around (try to overflow the seek implementation) + m.seek(0,0) + print ' Seek to zeroth byte' + vereq(m.tell(), 0) + m.seek(42,1) + print ' Seek to 42nd byte' + vereq(m.tell(), 42) + m.seek(0,2) + print ' Seek to last byte' + vereq(m.tell(), len(m)) + + print ' Try to seek to negative position...' + try: + m.seek(-1) + except ValueError: + pass + else: + verify(0, 'expected a ValueError but did not get it') + + print ' Try to seek beyond end of mmap...' + try: + m.seek(1,2) + except ValueError: + pass + else: + verify(0, 'expected a ValueError but did not get it') + + print ' Try to seek to negative position...' + try: + m.seek(-len(m)-1,2) + except ValueError: + pass + else: + verify(0, 'expected a ValueError but did not get it') + + # Try resizing map + print ' Attempting resize()' + try: + m.resize(512) + except SystemError: + # resize() not supported + # No messages are printed, since the output of this test suite + # would then be different across platforms. + pass + else: + # resize() is supported + verify(len(m) == 512, + "len(m) is %d, but expecting 512" % (len(m),) ) + # Check that we can no longer seek beyond the new size. + try: + m.seek(513,0) + except ValueError: + pass + else: + verify(0, 'Could seek beyond the new size') + + m.close() + + finally: + try: + f.close() + except OSError: + pass + try: + os.unlink(TESTFN) + except OSError: + pass + + # Test for "access" keyword parameter + try: + mapsize = 10 + print " Creating", mapsize, "byte test data file." + open(TESTFN, "wb").write("a"*mapsize) + print " Opening mmap with access=ACCESS_READ" + f = open(TESTFN, "rb") + m = mmap.mmap(f.fileno(), mapsize, access=mmap.ACCESS_READ) + verify(m[:] == 'a'*mapsize, "Readonly memory map data incorrect.") + + print " Ensuring that readonly mmap can't be slice assigned." + try: + m[:] = 'b'*mapsize + except TypeError: + pass + else: + verify(0, "Able to write to readonly memory map") + + print " Ensuring that readonly mmap can't be item assigned." + try: + m[0] = 'b' + except TypeError: + pass + else: + verify(0, "Able to write to readonly memory map") + + print " Ensuring that readonly mmap can't be write() to." + try: + m.seek(0,0) + m.write('abc') + except TypeError: + pass + else: + verify(0, "Able to write to readonly memory map") + + print " Ensuring that readonly mmap can't be write_byte() to." + try: + m.seek(0,0) + m.write_byte('d') + except TypeError: + pass + else: + verify(0, "Able to write to readonly memory map") + + print " Ensuring that readonly mmap can't be resized." + try: + m.resize(2*mapsize) + except SystemError: # resize is not universally supported + pass + except TypeError: + pass + else: + verify(0, "Able to resize readonly memory map") + del m, f + verify(open(TESTFN, "rb").read() == 'a'*mapsize, + "Readonly memory map data file was modified") + + print " Opening mmap with size too big" + import sys + f = open(TESTFN, "r+b") + try: + m = mmap.mmap(f.fileno(), mapsize+1) + except ValueError: + # we do not expect a ValueError on Windows + # CAUTION: This also changes the size of the file on disk, and + # later tests assume that the length hasn't changed. We need to + # repair that. + if sys.platform.startswith('win'): + verify(0, "Opening mmap with size+1 should work on Windows.") + else: + # we expect a ValueError on Unix, but not on Windows + if not sys.platform.startswith('win'): + verify(0, "Opening mmap with size+1 should raise ValueError.") + m.close() + f.close() + if sys.platform.startswith('win'): + # Repair damage from the resizing test. + f = open(TESTFN, 'r+b') + f.truncate(mapsize) + f.close() + + print " Opening mmap with access=ACCESS_WRITE" + f = open(TESTFN, "r+b") + m = mmap.mmap(f.fileno(), mapsize, access=mmap.ACCESS_WRITE) + print " Modifying write-through memory map." + m[:] = 'c'*mapsize + verify(m[:] == 'c'*mapsize, + "Write-through memory map memory not updated properly.") + m.flush() + m.close() + f.close() + f = open(TESTFN, 'rb') + stuff = f.read() + f.close() + verify(stuff == 'c'*mapsize, + "Write-through memory map data file not updated properly.") + + print " Opening mmap with access=ACCESS_COPY" + f = open(TESTFN, "r+b") + m = mmap.mmap(f.fileno(), mapsize, access=mmap.ACCESS_COPY) + print " Modifying copy-on-write memory map." + m[:] = 'd'*mapsize + verify(m[:] == 'd' * mapsize, + "Copy-on-write memory map data not written correctly.") + m.flush() + verify(open(TESTFN, "rb").read() == 'c'*mapsize, + "Copy-on-write test data file should not be modified.") + try: + print " Ensuring copy-on-write maps cannot be resized." + m.resize(2*mapsize) + except TypeError: + pass + else: + verify(0, "Copy-on-write mmap resize did not raise exception.") + del m, f + try: + print " Ensuring invalid access parameter raises exception." + f = open(TESTFN, "r+b") + m = mmap.mmap(f.fileno(), mapsize, access=4) + except ValueError: + pass + else: + verify(0, "Invalid access code should have raised exception.") + + if os.name == "posix": + # Try incompatible flags, prot and access parameters. + f = open(TESTFN, "r+b") + try: + m = mmap.mmap(f.fileno(), mapsize, flags=mmap.MAP_PRIVATE, + prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE) + except ValueError: + pass + else: + verify(0, "Incompatible parameters should raise ValueError.") + f.close() + finally: + try: + os.unlink(TESTFN) + except OSError: + pass + + # Do a tougher .find() test. SF bug 515943 pointed out that, in 2.2, + # searching for data with embedded \0 bytes didn't work. + f = open(TESTFN, 'w+') + + try: # unlink TESTFN no matter what + data = 'aabaac\x00deef\x00\x00aa\x00' + n = len(data) + f.write(data) + f.flush() + m = mmap.mmap(f.fileno(), n) + f.close() + + for start in range(n+1): + for finish in range(start, n+1): + slice = data[start : finish] + vereq(m.find(slice), data.find(slice)) + vereq(m.find(slice + 'x'), -1) + m.close() + + finally: + os.unlink(TESTFN) + + # make sure a double close doesn't crash on Solaris (Bug# 665913) + f = open(TESTFN, 'w+') + + try: # unlink TESTFN no matter what + f.write(2**16 * 'a') # Arbitrary character + f.close() + + f = open(TESTFN) + mf = mmap.mmap(f.fileno(), 2**16, access=mmap.ACCESS_READ) + mf.close() + mf.close() + f.close() + + finally: + os.unlink(TESTFN) + + + print ' Test passed' + +test_both() diff --git a/lib-python/2.2/test/test_multifile.py b/lib-python/2.2/test/test_multifile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_multifile.py @@ -0,0 +1,66 @@ +import mimetools +import multifile +import cStringIO + +msg = """Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="=====================_590453667==_" +X-OriginalArrivalTime: 05 Feb 2002 03:43:23.0310 (UTC) FILETIME=[42D88CE0:01C1ADF7] + +--=====================_590453667==_ +Content-Type: multipart/alternative; + boundary="=====================_590453677==_.ALT" + +--=====================_590453677==_.ALT +Content-Type: text/plain; charset="us-ascii"; format=flowed + +test A +--=====================_590453677==_.ALT +Content-Type: text/html; charset="us-ascii" + + +test B + +--=====================_590453677==_.ALT-- + +--=====================_590453667==_ +Content-Type: text/plain; charset="us-ascii" +Content-Disposition: attachment; filename="att.txt" + +Attached Content. +Attached Content. +Attached Content. +Attached Content. + +--=====================_590453667==_-- + +""" + +boundaries = 0 +linecount = 0 + +def getMIMEMsg(mf): + global boundaries, linecount + msg = mimetools.Message(mf) + + #print "TYPE: %s" % msg.gettype() + if msg.getmaintype() == 'multipart': + boundary = msg.getparam("boundary") + boundaries += 1 + + mf.push(boundary) + while mf.next(): + getMIMEMsg(mf) + mf.pop() + else: + lines = mf.readlines() + linecount += len(lines) + +def main(): + f = cStringIO.StringIO(msg) + getMIMEMsg(multifile.MultiFile(f)) + assert boundaries == 2 + assert linecount == 9 + +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/test/test_mutants.py b/lib-python/2.2/test/test_mutants.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_mutants.py @@ -0,0 +1,285 @@ +from test_support import verbose, TESTFN +import random +import os + +# From SF bug #422121: Insecurities in dict comparison. + +# Safety of code doing comparisons has been an historical Python weak spot. +# The problem is that comparison of structures written in C *naturally* +# wants to hold on to things like the size of the container, or "the +# biggest" containee so far, across a traversal of the container; but +# code to do containee comparisons can call back into Python and mutate +# the container in arbitrary ways while the C loop is in midstream. If the +# C code isn't extremely paranoid about digging things out of memory on +# each trip, and artificially boosting refcounts for the duration, anything +# from infinite loops to OS crashes can result (yes, I use Windows ). +# +# The other problem is that code designed to provoke a weakness is usually +# white-box code, and so catches only the particular vulnerabilities the +# author knew to protect against. For example, Python's list.sort() code +# went thru many iterations as one "new" vulnerability after another was +# discovered. +# +# So the dict comparison test here uses a black-box approach instead, +# generating dicts of various sizes at random, and performing random +# mutations on them at random times. This proved very effective, +# triggering at least six distinct failure modes the first 20 times I +# ran it. Indeed, at the start, the driver never got beyond 6 iterations +# before the test died. + +# The dicts are global to make it easy to mutate tham from within functions. +dict1 = {} +dict2 = {} + +# The current set of keys in dict1 and dict2. These are materialized as +# lists to make it easy to pick a dict key at random. +dict1keys = [] +dict2keys = [] + +# Global flag telling maybe_mutate() wether to *consider* mutating. +mutate = 0 + +# If global mutate is true, consider mutating a dict. May or may not +# mutate a dict even if mutate is true. If it does decide to mutate a +# dict, it picks one of {dict1, dict2} at random, and deletes a random +# entry from it; or, more rarely, adds a random element. + +def maybe_mutate(): + global mutate + if not mutate: + return + if random.random() < 0.5: + return + + if random.random() < 0.5: + target, keys = dict1, dict1keys + else: + target, keys = dict2, dict2keys + + if random.random() < 0.2: + # Insert a new key. + mutate = 0 # disable mutation until key inserted + while 1: + newkey = Horrid(random.randrange(100)) + if newkey not in target: + break + target[newkey] = Horrid(random.randrange(100)) + keys.append(newkey) + mutate = 1 + + elif keys: + # Delete a key at random. + i = random.randrange(len(keys)) + key = keys[i] + del target[key] + # CAUTION: don't use keys.remove(key) here. Or do . The + # point is that .remove() would trigger more comparisons, and so + # also more calls to this routine. We're mutating often enough + # without that. + del keys[i] + +# A horrid class that triggers random mutations of dict1 and dict2 when +# instances are compared. + +class Horrid: + def __init__(self, i): + # Comparison outcomes are determined by the value of i. + self.i = i + + # An artificial hashcode is selected at random so that we don't + # have any systematic relationship between comparison outcomes + # (based on self.i and other.i) and relative position within the + # hash vector (based on hashcode). + self.hashcode = random.randrange(1000000000) + + def __hash__(self): + return self.hashcode + + def __cmp__(self, other): + maybe_mutate() # The point of the test. + return cmp(self.i, other.i) + + def __repr__(self): + return "Horrid(%d)" % self.i + +# Fill dict d with numentries (Horrid(i), Horrid(j)) key-value pairs, +# where i and j are selected at random from the candidates list. +# Return d.keys() after filling. + +def fill_dict(d, candidates, numentries): + d.clear() + for i in xrange(numentries): + d[Horrid(random.choice(candidates))] = \ + Horrid(random.choice(candidates)) + return d.keys() + +# Test one pair of randomly generated dicts, each with n entries. +# Note that dict comparison is trivial if they don't have the same number +# of entires (then the "shorter" dict is instantly considered to be the +# smaller one, without even looking at the entries). + +def test_one(n): + global mutate, dict1, dict2, dict1keys, dict2keys + + # Fill the dicts without mutating them. + mutate = 0 + dict1keys = fill_dict(dict1, range(n), n) + dict2keys = fill_dict(dict2, range(n), n) + + # Enable mutation, then compare the dicts so long as they have the + # same size. + mutate = 1 + if verbose: + print "trying w/ lengths", len(dict1), len(dict2), + while dict1 and len(dict1) == len(dict2): + if verbose: + print ".", + c = cmp(dict1, dict2) + if verbose: + print + +# Run test_one n times. At the start (before the bugs were fixed), 20 +# consecutive runs of this test each blew up on or before the sixth time +# test_one was run. So n doesn't have to be large to get an interesting +# test. +# OTOH, calling with large n is also interesting, to ensure that the fixed +# code doesn't hold on to refcounts *too* long (in which case memory would +# leak). + +def test(n): + for i in xrange(n): + test_one(random.randrange(1, 100)) + +# See last comment block for clues about good values for n. +test(100) + +########################################################################## +# Another segfault bug, distilled by Michael Hudson from a c.l.py post. + +class Child: + def __init__(self, parent): + self.__dict__['parent'] = parent + def __getattr__(self, attr): + self.parent.a = 1 + self.parent.b = 1 + self.parent.c = 1 + self.parent.d = 1 + self.parent.e = 1 + self.parent.f = 1 + self.parent.g = 1 + self.parent.h = 1 + self.parent.i = 1 + return getattr(self.parent, attr) + +class Parent: + def __init__(self): + self.a = Child(self) + +# Hard to say what this will print! May vary from time to time. But +# we're specifically trying to test the tp_print slot here, and this is +# the clearest way to do it. We print the result to a temp file so that +# the expected-output file doesn't need to change. + +f = open(TESTFN, "w") +print >> f, Parent().__dict__ +f.close() +os.unlink(TESTFN) + +########################################################################## +# And another core-dumper from Michael Hudson. + +dict = {} + +# Force dict to malloc its table. +for i in range(1, 10): + dict[i] = i + +f = open(TESTFN, "w") + +class Machiavelli: + def __repr__(self): + dict.clear() + + # Michael sez: "doesn't crash without this. don't know why." + # Tim sez: "luck of the draw; crashes with or without for me." + print >> f + + return `"machiavelli"` + + def __hash__(self): + return 0 + +dict[Machiavelli()] = Machiavelli() + +print >> f, str(dict) +f.close() +os.unlink(TESTFN) +del f, dict + + +########################################################################## +# And another core-dumper from Michael Hudson. + +dict = {} + +# let's force dict to malloc its table +for i in range(1, 10): + dict[i] = i + +class Machiavelli2: + def __eq__(self, other): + dict.clear() + return 1 + + def __hash__(self): + return 0 + +dict[Machiavelli2()] = Machiavelli2() + +try: + dict[Machiavelli2()] +except KeyError: + pass + +del dict + +########################################################################## +# And another core-dumper from Michael Hudson. + +dict = {} + +# let's force dict to malloc its table +for i in range(1, 10): + dict[i] = i + +class Machiavelli3: + def __init__(self, id): + self.id = id + + def __eq__(self, other): + if self.id == other.id: + dict.clear() + return 1 + else: + return 0 + + def __repr__(self): + return "%s(%s)"%(self.__class__.__name__, self.id) + + def __hash__(self): + return 0 + +dict[Machiavelli3(1)] = Machiavelli3(0) +dict[Machiavelli3(2)] = Machiavelli3(0) + +f = open(TESTFN, "w") +try: + try: + print >> f, dict[Machiavelli3(2)] + except KeyError: + pass +finally: + f.close() + os.unlink(TESTFN) + +del dict diff --git a/lib-python/2.2/test/test_netrc.py b/lib-python/2.2/test/test_netrc.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_netrc.py @@ -0,0 +1,42 @@ + +import netrc, os, tempfile, test_support, unittest + +TEST_NETRC = """ +machine foo login log1 password pass1 account acct1 + +macdef macro1 +line1 +line2 + +macdef macro2 +line3 +line4 + +default login log2 password pass2 + +""" + +temp_filename = tempfile.mktemp() + +class NetrcTestCase(unittest.TestCase): + + def setUp (self): + fp = open(temp_filename, 'wt') + fp.write(TEST_NETRC) + fp.close() + self.netrc = netrc.netrc(temp_filename) + + def tearDown (self): + del self.netrc + os.unlink(temp_filename) + + def test_case_1(self): + self.assert_(self.netrc.macros == {'macro1':['line1\n', 'line2\n'], + 'macro2':['line3\n', 'line4\n']} + ) + self.assert_(self.netrc.hosts['foo'] == ('log1', 'acct1', 'pass1')) + self.assert_(self.netrc.hosts['default'] == ('log2', None, 'pass2')) + + +if __name__ == "__main__": + test_support.run_unittest(NetrcTestCase) diff --git a/lib-python/2.2/test/test_new.py b/lib-python/2.2/test/test_new.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_new.py @@ -0,0 +1,108 @@ +from test_support import verbose, verify +import sys +import new + +class Eggs: + def get_yolks(self): + return self.yolks + +print 'new.module()' +m = new.module('Spam') +if verbose: + print m +m.Eggs = Eggs +sys.modules['Spam'] = m +import Spam + +def get_more_yolks(self): + return self.yolks + 3 + +print 'new.classobj()' +C = new.classobj('Spam', (Spam.Eggs,), {'get_more_yolks': get_more_yolks}) +if verbose: + print C +print 'new.instance()' +c = new.instance(C, {'yolks': 3}) +if verbose: + print c +o = new.instance(C) +verify(o.__dict__ == {}, + "new __dict__ should be empty") +del o +o = new.instance(C, None) +verify(o.__dict__ == {}, + "new __dict__ should be empty") +del o + +def break_yolks(self): + self.yolks = self.yolks - 2 +print 'new.instancemethod()' +im = new.instancemethod(break_yolks, c, C) +if verbose: + print im + +verify(c.get_yolks() == 3 and c.get_more_yolks() == 6, + 'Broken call of hand-crafted class instance') +im() +verify(c.get_yolks() == 1 and c.get_more_yolks() == 4, + 'Broken call of hand-crafted instance method') + +# It's unclear what the semantics should be for a code object compiled at +# module scope, but bound and run in a function. In CPython, `c' is global +# (by accident?) while in Jython, `c' is local. The intent of the test +# clearly is to make `c' global, so let's be explicit about it. +codestr = ''' +global c +a = 1 +b = 2 +c = a + b +''' + +ccode = compile(codestr, '', 'exec') +# Jython doesn't have a __builtins__, so use a portable alternative +import __builtin__ +g = {'c': 0, '__builtins__': __builtin__} +# this test could be more robust +print 'new.function()' +func = new.function(ccode, g) +if verbose: + print func +func() +verify(g['c'] == 3, + 'Could not create a proper function object') + +# test the various extended flavors of function.new +def f(x): + def g(y): + return x + y + return g +g = f(4) +new.function(f.func_code, {}, "blah") +g2 = new.function(g.func_code, {}, "blah", (2,), g.func_closure) +verify(g2() == 6) +g3 = new.function(g.func_code, {}, "blah", None, g.func_closure) +verify(g3(5) == 9) +def test_closure(func, closure, exc): + try: + new.function(func.func_code, {}, "", None, closure) + except exc: + pass + else: + print "corrupt closure accepted" + +test_closure(g, None, TypeError) # invalid closure +test_closure(g, (1,), TypeError) # non-cell in closure +test_closure(g, (1, 1), ValueError) # closure is wrong size +test_closure(f, g.func_closure, ValueError) # no closure needed + +print 'new.code()' +# bogus test of new.code() +# Note: Jython will never have new.code() +if hasattr(new, 'code'): + d = new.code(3, 3, 3, 3, codestr, (), (), (), + "", "", 1, "", (), ()) + # test backwards-compatibility version with no freevars or cellvars + d = new.code(3, 3, 3, 3, codestr, (), (), (), + "", "", 1, "") + if verbose: + print d diff --git a/lib-python/2.2/test/test_nis.py b/lib-python/2.2/test/test_nis.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_nis.py @@ -0,0 +1,32 @@ +from test_support import verbose, TestFailed, TestSkipped +import nis + +print 'nis.maps()' +try: + maps = nis.maps() +except nis.error, msg: + # NIS is probably not active, so this test isn't useful + if verbose: + raise TestFailed, msg + # only do this if running under the regression suite + raise TestSkipped, msg + +done = 0 +for nismap in maps: + if verbose: + print nismap + mapping = nis.cat(nismap) + for k, v in mapping.items(): + if verbose: + print ' ', k, v + if not k: + continue + if nis.match(k, nismap) != v: + print "NIS match failed for key `%s' in map `%s'" % (k, nismap) + else: + # just test the one key, otherwise this test could take a + # very long time + done = 1 + break + if done: + break diff --git a/lib-python/2.2/test/test_ntpath.py b/lib-python/2.2/test/test_ntpath.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_ntpath.py @@ -0,0 +1,114 @@ +import ntpath +from test_support import verbose, TestFailed +import os + +errors = 0 + +def tester(fn, wantResult): + global errors + fn = fn.replace("\\", "\\\\") + gotResult = eval(fn) + if wantResult != gotResult: + print "error!" + print "evaluated: " + str(fn) + print "should be: " + str(wantResult) + print " returned: " + str(gotResult) + print "" + errors = errors + 1 + +tester('ntpath.splitdrive("c:\\foo\\bar")', + ('c:', '\\foo\\bar')) +tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")', + ('\\\\conky\\mountpoint', '\\foo\\bar')) +tester('ntpath.splitdrive("c:/foo/bar")', + ('c:', '/foo/bar')) +tester('ntpath.splitunc("//conky/mountpoint/foo/bar")', + ('//conky/mountpoint', '/foo/bar')) + +tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar')) +tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")', + ('\\\\conky\\mountpoint\\foo', 'bar')) + +tester('ntpath.split("c:\\")', ('c:\\', '')) +tester('ntpath.split("\\\\conky\\mountpoint\\")', + ('\\\\conky\\mountpoint', '')) + +tester('ntpath.split("c:/")', ('c:/', '')) +tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint', '')) + +tester('ntpath.isabs("c:\\")', 1) +tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1) +tester('ntpath.isabs("\\foo")', 1) +tester('ntpath.isabs("\\foo\\bar")', 1) + +tester('ntpath.abspath("C:\\")', "C:\\") + +tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])', + "/home/swen") +tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])', + "\\home\\swen\\") +tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])', + "/home/swen/spam") + +tester('ntpath.join("")', '') +tester('ntpath.join("", "", "")', '') +tester('ntpath.join("a")', 'a') +tester('ntpath.join("/a")', '/a') +tester('ntpath.join("\\a")', '\\a') +tester('ntpath.join("a:")', 'a:') +tester('ntpath.join("a:", "b")', 'a:b') +tester('ntpath.join("a:", "/b")', 'a:/b') +tester('ntpath.join("a:", "\\b")', 'a:\\b') +tester('ntpath.join("a", "/b")', '/b') +tester('ntpath.join("a", "\\b")', '\\b') +tester('ntpath.join("a", "b", "c")', 'a\\b\\c') +tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c') +tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c') +tester('ntpath.join("a", "b", "\\c")', '\\c') +tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep') +tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b') +tester("ntpath.join('c:', '/a')", 'c:/a') +tester("ntpath.join('c:/', '/a')", 'c:/a') +tester("ntpath.join('c:/a', '/b')", '/b') +tester("ntpath.join('c:', 'd:/')", 'd:/') +tester("ntpath.join('c:/', 'd:/')", 'd:/') +tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b') + +tester("ntpath.join('')", '') +tester("ntpath.join('', '', '', '', '')", '') +tester("ntpath.join('a')", 'a') +tester("ntpath.join('', 'a')", 'a') +tester("ntpath.join('', '', '', '', 'a')", 'a') +tester("ntpath.join('a', '')", 'a\\') +tester("ntpath.join('a', '', '', '', '')", 'a\\') +tester("ntpath.join('a\\', '')", 'a\\') +tester("ntpath.join('a\\', '', '', '', '')", 'a\\') + +tester("ntpath.normpath('A//////././//.//B')", r'A\B') +tester("ntpath.normpath('A/./B')", r'A\B') +tester("ntpath.normpath('A/foo/../B')", r'A\B') +tester("ntpath.normpath('C:A//B')", r'C:A\B') +tester("ntpath.normpath('D:A/./B')", r'D:A\B') +tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B') + +# Next 3 seem dubious, and especially the 3rd, but normpath is possibly +# trying to leave UNC paths alone without actually knowing anything about +# them. +tester("ntpath.normpath('C:///A//B')", r'C:\\\A\B') +tester("ntpath.normpath('D:///A/./B')", r'D:\\\A\B') +tester("ntpath.normpath('e:///A/foo/../B')", r'e:\\\A\B') + +tester("ntpath.normpath('..')", r'..') +tester("ntpath.normpath('.')", r'.') +tester("ntpath.normpath('')", r'.') +tester("ntpath.normpath('/')", '\\') +tester("ntpath.normpath('c:/')", 'c:\\') +tester("ntpath.normpath('/../.././..')", '\\') +tester("ntpath.normpath('c:/../../..')", 'c:\\') +tester("ntpath.normpath('../.././..')", r'..\..\..') +tester("ntpath.normpath('K:../.././..')", r'K:..\..\..') + +if errors: + raise TestFailed(str(errors) + " errors.") +elif verbose: + print "No errors. Thank your lucky stars." diff --git a/lib-python/2.2/test/test_opcodes.py b/lib-python/2.2/test/test_opcodes.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_opcodes.py @@ -0,0 +1,101 @@ +# Python test set -- part 2, opcodes + +from test_support import * + + +print '2. Opcodes' +print 'XXX Not yet fully implemented' + +print '2.1 try inside for loop' +n = 0 +for i in range(10): + n = n+i + try: 1/0 + except NameError: pass + except ZeroDivisionError: pass + except TypeError: pass + try: pass + except: pass + try: pass + finally: pass + n = n+i +if n != 90: + raise TestFailed, 'try inside for' + + +print '2.2 raise class exceptions' + +class AClass: pass +class BClass(AClass): pass +class CClass: pass +class DClass(AClass): + def __init__(self, ignore): + pass + +try: raise AClass() +except: pass + +try: raise AClass() +except AClass: pass + +try: raise BClass() +except AClass: pass + +try: raise BClass() +except CClass: raise TestFailed +except: pass + +a = AClass() +b = BClass() + +try: raise AClass, b +except BClass, v: + if v != b: raise TestFailed, "v!=b" +else: raise TestFailed, "no exception" + +try: raise b +except AClass, v: + if v != b: raise TestFailed, "v!=b AClass" + +# not enough arguments +try: raise BClass, a +except TypeError: pass + +try: raise DClass, a +except DClass, v: + if not isinstance(v, DClass): + raise TestFailed, "v not DClass" + +print '2.3 comparing function objects' + +f = eval('lambda: None') +g = eval('lambda: None') +if f == g: raise TestFailed, "functions should not be same" + +f = eval('lambda a: a') +g = eval('lambda a: a') +if f == g: raise TestFailed, "functions should not be same" + +f = eval('lambda a=1: a') +g = eval('lambda a=1: a') +if f == g: raise TestFailed, "functions should not be same" + +f = eval('lambda: 0') +g = eval('lambda: 1') +if f == g: raise TestFailed + +f = eval('lambda: None') +g = eval('lambda a: None') +if f == g: raise TestFailed + +f = eval('lambda a: None') +g = eval('lambda b: None') +if f == g: raise TestFailed + +f = eval('lambda a: None') +g = eval('lambda a=None: None') +if f == g: raise TestFailed + +f = eval('lambda a=0: None') +g = eval('lambda a=1: None') +if f == g: raise TestFailed diff --git a/lib-python/2.2/test/test_openpty.py b/lib-python/2.2/test/test_openpty.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_openpty.py @@ -0,0 +1,21 @@ +# Test to see if openpty works. (But don't worry if it isn't available.) + +import os +from test_support import verbose, TestFailed, TestSkipped + +try: + if verbose: + print "Calling os.openpty()" + master, slave = os.openpty() + if verbose: + print "(master, slave) = (%d, %d)"%(master, slave) +except AttributeError: + raise TestSkipped, "No openpty() available." + +if not os.isatty(master): + raise TestFailed, "Master-end of pty is not a terminal." +if not os.isatty(slave): + raise TestFailed, "Slave-end of pty is not a terminal." + +os.write(slave, 'Ping!') +print os.read(master, 1024) diff --git a/lib-python/2.2/test/test_operations.py b/lib-python/2.2/test/test_operations.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_operations.py @@ -0,0 +1,52 @@ +# Python test set -- part 3, built-in operations. + + +print '3. Operations' +print 'XXX Mostly not yet implemented' + + +print '3.1 Dictionary lookups succeed even if __cmp__() raises an exception' + +# SourceForge bug #112558: +# http://sourceforge.net/bugs/?func=detailbug&bug_id=112558&group_id=5470 + +class BadDictKey: + already_printed_raising_error = 0 + + def __hash__(self): + return hash(self.__class__) + + def __cmp__(self, other): + if isinstance(other, self.__class__): + if not BadDictKey.already_printed_raising_error: + # How many times __cmp__ gets called depends on the hash + # code and the internals of the dict implementation; we + # know it will be called at least once, but that's it. + # already_printed_raising_error makes sure the expected- + # output file prints the msg at most once. + BadDictKey.already_printed_raising_error = 1 + print "raising error" + raise RuntimeError, "gotcha" + return other + +d = {} +x1 = BadDictKey() +x2 = BadDictKey() +d[x1] = 1 +d[x2] = 2 +print "No exception passed through." + +# Dict resizing bug, found by Jack Jansen in 2.2 CVS development. +# This version got an assert failure in debug build, infinite loop in +# release build. Unfortunately, provoking this kind of stuff requires +# a mix of inserts and deletes hitting exactly the right hash codes in +# exactly the right order, and I can't think of a randomized approach +# that would be *likely* to hit a failing case in reasonable time. + +d = {} +for i in range(5): + d[i] = i +for i in range(5): + del d[i] +for i in range(5, 9): # i==8 was the problem + d[i] = i diff --git a/lib-python/2.2/test/test_operator.py b/lib-python/2.2/test/test_operator.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_operator.py @@ -0,0 +1,218 @@ +import operator +import unittest + +import test_support + + +class OperatorTestCase(unittest.TestCase): + def test_lt(self): + self.failIf(operator.lt(1, 0)) + self.failIf(operator.lt(1, 0.0)) + self.failIf(operator.lt(1, 1)) + self.failIf(operator.lt(1, 1.0)) + self.failUnless(operator.lt(1, 2)) + self.failUnless(operator.lt(1, 2.0)) + + def test_le(self): + self.failIf(operator.le(1, 0)) + self.failIf(operator.le(1, 0.0)) + self.failUnless(operator.le(1, 1)) + self.failUnless(operator.le(1, 1.0)) + self.failUnless(operator.le(1, 2)) + self.failUnless(operator.le(1, 2.0)) + + def test_eq(self): + self.failIf(operator.eq(1, 0)) + self.failIf(operator.eq(1, 0.0)) + self.failUnless(operator.eq(1, 1)) + self.failUnless(operator.eq(1, 1.0)) + self.failIf(operator.eq(1, 2)) + self.failIf(operator.eq(1, 2.0)) + + def test_ne(self): + self.failUnless(operator.ne(1, 0)) + self.failUnless(operator.ne(1, 0.0)) + self.failIf(operator.ne(1, 1)) + self.failIf(operator.ne(1, 1.0)) + self.failUnless(operator.ne(1, 2)) + self.failUnless(operator.ne(1, 2.0)) + + def test_ge(self): + self.failUnless(operator.ge(1, 0)) + self.failUnless(operator.ge(1, 0.0)) + self.failUnless(operator.ge(1, 1)) + self.failUnless(operator.ge(1, 1.0)) + self.failIf(operator.ge(1, 2)) + self.failIf(operator.ge(1, 2.0)) + + def test_gt(self): + self.failUnless(operator.gt(1, 0)) + self.failUnless(operator.gt(1, 0.0)) + self.failIf(operator.gt(1, 1)) + self.failIf(operator.gt(1, 1.0)) + self.failIf(operator.gt(1, 2)) + self.failIf(operator.gt(1, 2.0)) + + def test_abs(self): + self.failUnless(operator.abs(-1) == 1) + self.failUnless(operator.abs(1) == 1) + + def test_add(self): + self.failUnless(operator.add(3, 4) == 7) + + def test_bitwise_and(self): + self.failUnless(operator.and_(0xf, 0xa) == 0xa) + + def test_concat(self): + self.failUnless(operator.concat('py', 'thon') == 'python') + self.failUnless(operator.concat([1, 2], [3, 4]) == [1, 2, 3, 4]) + + def test_countOf(self): + self.failUnless(operator.countOf([1, 2, 1, 3, 1, 4], 3) == 1) + self.failUnless(operator.countOf([1, 2, 1, 3, 1, 4], 5) == 0) + + def test_delitem(self): + a = [4, 3, 2, 1] + self.failUnless(operator.delitem(a, 1) is None) + self.assert_(a == [4, 2, 1]) + + def test_delslice(self): + a = range(10) + self.failUnless(operator.delslice(a, 2, 8) is None) + self.assert_(a == [0, 1, 8, 9]) + + def test_div(self): + self.failUnless(operator.floordiv(5, 2) == 2) + + def test_floordiv(self): + self.failUnless(operator.floordiv(5, 2) == 2) + + def test_truediv(self): + self.failUnless(operator.truediv(5, 2) == 2.5) + + def test_getitem(self): + a = range(10) + self.failUnless(operator.getitem(a, 2) == 2) + + def test_getslice(self): + a = range(10) + self.failUnless(operator.getslice(a, 4, 6) == [4, 5]) + + def test_indexOf(self): + self.failUnless(operator.indexOf([4, 3, 2, 1], 3) == 1) + self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0) + + def test_invert(self): + self.failUnless(operator.inv(4) == -5) + + def test_isCallable(self): + class C: + pass + def check(self, o, v): + self.assert_(operator.isCallable(o) == callable(o) == v) + check(self, 4, 0) + check(self, operator.isCallable, 1) + check(self, C, 1) + check(self, C(), 0) + + def test_isMappingType(self): + self.failIf(operator.isMappingType(1)) + self.failIf(operator.isMappingType(operator.isMappingType)) + self.failUnless(operator.isMappingType(operator.__dict__)) + self.failUnless(operator.isMappingType({})) + + def test_isNumberType(self): + self.failUnless(operator.isNumberType(8)) + self.failUnless(operator.isNumberType(8j)) + self.failUnless(operator.isNumberType(8L)) + self.failUnless(operator.isNumberType(8.3)) + self.failIf(operator.isNumberType(dir())) + + def test_isSequenceType(self): + self.failUnless(operator.isSequenceType(dir())) + self.failUnless(operator.isSequenceType(())) + self.failUnless(operator.isSequenceType(xrange(10))) + self.failUnless(operator.isSequenceType('yeahbuddy')) + self.failIf(operator.isSequenceType(3)) + + def test_lshift(self): + self.failUnless(operator.lshift(5, 1) == 10) + self.failUnless(operator.lshift(5, 0) == 5) + self.assertRaises(ValueError, operator.lshift, 2, -1) + + def test_mod(self): + self.failUnless(operator.mod(5, 2) == 1) + + def test_mul(self): + self.failUnless(operator.mul(5, 2) == 10) + + def test_neg(self): + self.failUnless(operator.neg(5) == -5) + self.failUnless(operator.neg(-5) == 5) + self.failUnless(operator.neg(0) == 0) + self.failUnless(operator.neg(-0) == 0) + + def test_bitwise_or(self): + self.failUnless(operator.or_(0xa, 0x5) == 0xf) + + def test_pos(self): + self.failUnless(operator.pos(5) == 5) + self.failUnless(operator.pos(-5) == -5) + self.failUnless(operator.pos(0) == 0) + self.failUnless(operator.pos(-0) == 0) + + def test_repeat(self): + a = range(3) + self.failUnless(operator.repeat(a, 2) == a+a) + self.failUnless(operator.repeat(a, 1) == a) + self.failUnless(operator.repeat(a, 0) == []) + a = (1, 2, 3) + self.failUnless(operator.repeat(a, 2) == a+a) + self.failUnless(operator.repeat(a, 1) == a) + self.failUnless(operator.repeat(a, 0) == ()) + a = '123' + self.failUnless(operator.repeat(a, 2) == a+a) + self.failUnless(operator.repeat(a, 1) == a) + self.failUnless(operator.repeat(a, 0) == '') + + def test_rshift(self): + self.failUnless(operator.rshift(5, 1) == 2) + self.failUnless(operator.rshift(5, 0) == 5) + self.assertRaises(ValueError, operator.rshift, 2, -1) + + def test_contains(self): + self.failUnless(operator.contains(range(4), 2)) + self.failIf(operator.contains(range(4), 5)) + self.failUnless(operator.sequenceIncludes(range(4), 2)) + self.failIf(operator.sequenceIncludes(range(4), 5)) + + def test_setitem(self): + a = range(3) + self.failUnless(operator.setitem(a, 0, 2) is None) + self.assert_(a == [2, 1, 2]) + self.assertRaises(IndexError, operator.setitem, a, 4, 2) + + def test_setslice(self): + a = range(4) + self.failUnless(operator.setslice(a, 1, 3, [2, 1]) is None) + self.assert_(a == [0, 2, 1, 3]) + + def test_sub(self): + self.failUnless(operator.sub(5, 2) == 3) + + def test_truth(self): + self.failUnless(operator.truth(5)) + self.failUnless(operator.truth([0])) + self.failIf(operator.truth(0)) + self.failIf(operator.truth([])) + + def test_bitwise_xor(self): + self.failUnless(operator.xor(0xb, 0xc) == 0x7) + + +def test_main(): + test_support.run_unittest(OperatorTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_os.py b/lib-python/2.2/test/test_os.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_os.py @@ -0,0 +1,187 @@ +# As a test suite for the os module, this is woefully inadequate, but this +# does add tests for a few functions which have been determined to be more +# more portable than they had been thought to be. + +import os +import unittest +import warnings + +warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, __name__) +warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning, __name__) + +from test_support import TESTFN, run_unittest + +class TemporaryFileTests(unittest.TestCase): + def setUp(self): + self.files = [] + os.mkdir(TESTFN) + + def tearDown(self): + for name in self.files: + os.unlink(name) + os.rmdir(TESTFN) + + def check_tempfile(self, name): + # make sure it doesn't already exist: + self.failIf(os.path.exists(name), + "file already exists for temporary file") + # make sure we can create the file + open(name, "w") + self.files.append(name) + + def test_tempnam(self): + if not hasattr(os, "tempnam"): + return + warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, + "test_os") + self.check_tempfile(os.tempnam()) + + name = os.tempnam(TESTFN) + self.check_tempfile(name) + + name = os.tempnam(TESTFN, "pfx") + self.assert_(os.path.basename(name)[:3] == "pfx") + self.check_tempfile(name) + + def test_tmpfile(self): + if not hasattr(os, "tmpfile"): + return + fp = os.tmpfile() + fp.write("foobar") + fp.seek(0,0) + s = fp.read() + fp.close() + self.assert_(s == "foobar") + + def test_tmpnam(self): + if not hasattr(os, "tmpnam"): + return + warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning, + "test_os") + self.check_tempfile(os.tmpnam()) + +# Test attributes on return values from os.*stat* family. +class StatAttributeTests(unittest.TestCase): + def setUp(self): + os.mkdir(TESTFN) + self.fname = os.path.join(TESTFN, "f1") + f = open(self.fname, 'wb') + f.write("ABC") + f.close() + + def tearDown(self): + os.unlink(self.fname) + os.rmdir(TESTFN) + + def test_stat_attributes(self): + if not hasattr(os, "stat"): + return + + import stat + result = os.stat(self.fname) + + # Make sure direct access works + self.assertEquals(result[stat.ST_SIZE], 3) + self.assertEquals(result.st_size, 3) + + import sys + + # Make sure all the attributes are there + members = dir(result) + for name in dir(stat): + if name[:3] == 'ST_': + attr = name.lower() + self.assertEquals(getattr(result, attr), + result[getattr(stat, name)]) + self.assert_(attr in members) + + try: + result[200] + self.fail("No exception thrown") + except IndexError: + pass + + # Make sure that assignment fails + try: + result.st_mode = 1 + self.fail("No exception thrown") + except TypeError: + pass + + try: + result.st_rdev = 1 + self.fail("No exception thrown") + except (AttributeError, TypeError): + pass + + try: + result.parrot = 1 + self.fail("No exception thrown") + except AttributeError: + pass + + # Use the stat_result constructor with a too-short tuple. + try: + result2 = os.stat_result((10,)) + self.fail("No exception thrown") + except TypeError: + pass + + # Use the constructr with a too-long tuple. + try: + result2 = os.stat_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)) + except TypeError: + pass + + + def test_statvfs_attributes(self): + if not hasattr(os, "statvfs"): + return + + import statvfs + result = os.statvfs(self.fname) + + # Make sure direct access works + self.assertEquals(result.f_bfree, result[statvfs.F_BFREE]) + + # Make sure all the attributes are there + members = dir(result) + for name in dir(statvfs): + if name[:2] == 'F_': + attr = name.lower() + self.assertEquals(getattr(result, attr), + result[getattr(statvfs, name)]) + self.assert_(attr in members) + + # Make sure that assignment really fails + try: + result.f_bfree = 1 + self.fail("No exception thrown") + except TypeError: + pass + + try: + result.parrot = 1 + self.fail("No exception thrown") + except AttributeError: + pass + + # Use the constructor with a too-short tuple. + try: + result2 = os.statvfs_result((10,)) + self.fail("No exception thrown") + except TypeError: + pass + + # Use the constructr with a too-long tuple. + try: + result2 = os.statvfs_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)) + except TypeError: + pass + +def test_main(): + run_unittest(TemporaryFileTests) + run_unittest(StatAttributeTests) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_parser.py b/lib-python/2.2/test/test_parser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_parser.py @@ -0,0 +1,383 @@ +import parser +import test_support +import unittest + +# +# First, we test that we can generate trees from valid source fragments, +# and that these valid trees are indeed allowed by the tree-loading side +# of the parser module. +# + +class RoundtripLegalSyntaxTestCase(unittest.TestCase): + def roundtrip(self, f, s): + st1 = f(s) + t = st1.totuple() + try: + st2 = parser.sequence2st(t) + except parser.ParserError: + self.fail("could not roundtrip %r" % s) + + self.assertEquals(t, st2.totuple(), + "could not re-generate syntax tree") + + def check_expr(self, s): + self.roundtrip(parser.expr, s) + + def check_suite(self, s): + self.roundtrip(parser.suite, s) + + def test_yield_statement(self): + self.check_suite("from __future__ import generators\n" + "def f(): yield 1") + self.check_suite("from __future__ import generators\n" + "def f(): return; yield 1") + self.check_suite("from __future__ import generators\n" + "def f(): yield 1; return") + self.check_suite("from __future__ import generators\n" + "def f():\n" + " for x in range(30):\n" + " yield x\n") + + def test_expressions(self): + self.check_expr("foo(1)") + self.check_expr("[1, 2, 3]") + self.check_expr("[x**3 for x in range(20)]") + self.check_expr("[x**3 for x in range(20) if x % 3]") + self.check_expr("foo(*args)") + self.check_expr("foo(*args, **kw)") + self.check_expr("foo(**kw)") + self.check_expr("foo(key=value)") + self.check_expr("foo(key=value, *args)") + self.check_expr("foo(key=value, *args, **kw)") + self.check_expr("foo(key=value, **kw)") + self.check_expr("foo(a, b, c, *args)") + self.check_expr("foo(a, b, c, *args, **kw)") + self.check_expr("foo(a, b, c, **kw)") + self.check_expr("foo + bar") + self.check_expr("foo - bar") + self.check_expr("foo * bar") + self.check_expr("foo / bar") + self.check_expr("foo // bar") + self.check_expr("lambda: 0") + self.check_expr("lambda x: 0") + self.check_expr("lambda *y: 0") + self.check_expr("lambda *y, **z: 0") + self.check_expr("lambda **z: 0") + self.check_expr("lambda x, y: 0") + self.check_expr("lambda foo=bar: 0") + self.check_expr("lambda foo=bar, spaz=nifty+spit: 0") + self.check_expr("lambda foo=bar, **z: 0") + self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0") + self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0") + self.check_expr("lambda x, *y, **z: 0") + + def test_print(self): + self.check_suite("print") + self.check_suite("print 1") + self.check_suite("print 1,") + self.check_suite("print >>fp") + self.check_suite("print >>fp, 1") + self.check_suite("print >>fp, 1,") + + def test_simple_expression(self): + # expr_stmt + self.check_suite("a") + + def test_simple_assignments(self): + self.check_suite("a = b") + self.check_suite("a = b = c = d = e") + + def test_simple_augmented_assignments(self): + self.check_suite("a += b") + self.check_suite("a -= b") + self.check_suite("a *= b") + self.check_suite("a /= b") + self.check_suite("a //= b") + self.check_suite("a %= b") + self.check_suite("a &= b") + self.check_suite("a |= b") + self.check_suite("a ^= b") + self.check_suite("a <<= b") + self.check_suite("a >>= b") + self.check_suite("a **= b") + + def test_function_defs(self): + self.check_suite("def f(): pass") + self.check_suite("def f(*args): pass") + self.check_suite("def f(*args, **kw): pass") + self.check_suite("def f(**kw): pass") + self.check_suite("def f(foo=bar): pass") + self.check_suite("def f(foo=bar, *args): pass") + self.check_suite("def f(foo=bar, *args, **kw): pass") + self.check_suite("def f(foo=bar, **kw): pass") + + self.check_suite("def f(a, b): pass") + self.check_suite("def f(a, b, *args): pass") + self.check_suite("def f(a, b, *args, **kw): pass") + self.check_suite("def f(a, b, **kw): pass") + self.check_suite("def f(a, b, foo=bar): pass") + self.check_suite("def f(a, b, foo=bar, *args): pass") + self.check_suite("def f(a, b, foo=bar, *args, **kw): pass") + self.check_suite("def f(a, b, foo=bar, **kw): pass") + + def test_import_from_statement(self): + self.check_suite("from sys.path import *") + self.check_suite("from sys.path import dirname") + self.check_suite("from sys.path import dirname as my_dirname") + self.check_suite("from sys.path import dirname, basename") + self.check_suite( + "from sys.path import dirname as my_dirname, basename") + self.check_suite( + "from sys.path import dirname, basename as my_basename") + + def test_basic_import_statement(self): + self.check_suite("import sys") + self.check_suite("import sys as system") + self.check_suite("import sys, math") + self.check_suite("import sys as system, math") + self.check_suite("import sys, math as my_math") + + def test_assert(self): + self.check_suite("assert alo < ahi and blo < bhi\n") + +# +# Second, we take *invalid* trees and make sure we get ParserError +# rejections for them. +# + +class IllegalSyntaxTestCase(unittest.TestCase): + def check_bad_tree(self, tree, label): + try: + parser.sequence2st(tree) + except parser.ParserError: + pass + else: + self.fail("did not detect invalid tree for %r" % label) + + def test_junk(self): + # not even remotely valid: + self.check_bad_tree((1, 2, 3), "") + + def test_illegal_yield_1(self): + """Illegal yield statement: def f(): return 1; yield 1""" + tree = \ + (257, + (264, + (285, + (259, + (1, 'def'), + (1, 'f'), + (260, (7, '('), (8, ')')), + (11, ':'), + (291, + (4, ''), + (5, ''), + (264, + (265, + (266, + (272, + (275, + (1, 'return'), + (313, + (292, + (293, + (294, + (295, + (297, + (298, + (299, + (300, + (301, + (302, (303, (304, (305, (2, '1')))))))))))))))))), + (264, + (265, + (266, + (272, + (276, + (1, 'yield'), + (313, + (292, + (293, + (294, + (295, + (297, + (298, + (299, + (300, + (301, + (302, + (303, (304, (305, (2, '1')))))))))))))))))), + (4, ''))), + (6, ''))))), + (4, ''), + (0, '')))) + self.check_bad_tree(tree, "def f():\n return 1\n yield 1") + + def test_illegal_yield_2(self): + """Illegal return in generator: def f(): return 1; yield 1""" + tree = \ + (257, + (264, + (265, + (266, + (278, + (1, 'from'), + (281, (1, '__future__')), + (1, 'import'), + (279, (1, 'generators')))), + (4, ''))), + (264, + (285, + (259, + (1, 'def'), + (1, 'f'), + (260, (7, '('), (8, ')')), + (11, ':'), + (291, + (4, ''), + (5, ''), + (264, + (265, + (266, + (272, + (275, + (1, 'return'), + (313, + (292, + (293, + (294, + (295, + (297, + (298, + (299, + (300, + (301, + (302, (303, (304, (305, (2, '1')))))))))))))))))), + (264, + (265, + (266, + (272, + (276, + (1, 'yield'), + (313, + (292, + (293, + (294, + (295, + (297, + (298, + (299, + (300, + (301, + (302, + (303, (304, (305, (2, '1')))))))))))))))))), + (4, ''))), + (6, ''))))), + (4, ''), + (0, '')))) + self.check_bad_tree(tree, "def f():\n return 1\n yield 1") + + def test_print_chevron_comma(self): + """Illegal input: print >>fp,""" + tree = \ + (257, + (264, + (265, + (266, + (268, + (1, 'print'), + (35, '>>'), + (290, + (291, + (292, + (293, + (295, + (296, + (297, + (298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))), + (12, ','))), + (4, ''))), + (0, '')) + self.check_bad_tree(tree, "print >>fp,") + + def test_a_comma_comma_c(self): + """Illegal input: a,,c""" + tree = \ + (258, + (311, + (290, + (291, + (292, + (293, + (295, + (296, + (297, + (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))), + (12, ','), + (12, ','), + (290, + (291, + (292, + (293, + (295, + (296, + (297, + (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "a,,c") + + def test_illegal_operator(self): + """Illegal input: a $= b""" + tree = \ + (257, + (264, + (265, + (266, + (267, + (312, + (291, + (292, + (293, + (294, + (296, + (297, + (298, + (299, + (300, (301, (302, (303, (304, (1, 'a'))))))))))))))), + (268, (37, '$=')), + (312, + (291, + (292, + (293, + (294, + (296, + (297, + (298, + (299, + (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))), + (4, ''))), + (0, '')) + self.check_bad_tree(tree, "a $= b") + + def test_malformed_global(self): + #doesn't have global keyword in ast + tree = (257, + (264, + (265, + (266, + (282, (1, 'foo'))), (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "malformed global ast") + +def test_main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTest(loader.loadTestsFromTestCase(RoundtripLegalSyntaxTestCase)) + suite.addTest(loader.loadTestsFromTestCase(IllegalSyntaxTestCase)) + test_support.run_suite(suite) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_pep247.py b/lib-python/2.2/test/test_pep247.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pep247.py @@ -0,0 +1,50 @@ +# +# Test suite to check compliance with PEP 247, the standard API for +# hashing algorithms. +# + +import md5, sha, hmac + +def check_hash_module(module, key=None): + assert hasattr(module, 'digest_size'), "Must have digest_size" + assert (module.digest_size is None or + module.digest_size > 0), "digest_size must be None or positive" + + if key is not None: + obj1 = module.new(key) + obj2 = module.new(key, "string") + + h1 = module.new(key, "string").digest() + obj3 = module.new(key) ; obj3.update("string") ; h2 = obj3.digest() + assert h1 == h2, "Hashes must match" + + else: + obj1 = module.new() + obj2 = module.new("string") + + h1 = module.new("string").digest() + obj3 = module.new() ; obj3.update("string") ; h2 = obj3.digest() + assert h1 == h2, "Hashes must match" + + assert hasattr(obj1, 'digest_size'), "Objects must have digest_size attr" + if module.digest_size is not None: + assert obj1.digest_size == module.digest_size, "digest_size must match" + assert obj1.digest_size == len(h1), "digest_size must match actual size" + obj1.update("string") + obj_copy = obj1.copy() + assert obj1.digest() == obj_copy.digest(), "Copied objects must match" + assert obj1.hexdigest() == obj_copy.hexdigest(), \ + "Copied objects must match" + digest, hexdigest = obj1.digest(), obj1.hexdigest() + hd2 = "" + for byte in digest: + hd2 += "%02x" % ord(byte) + assert hd2 == hexdigest, "hexdigest doesn't appear correct" + + print 'Module', module.__name__, 'seems to comply with PEP 247' + + +if __name__ == '__main__': + check_hash_module(md5) + check_hash_module(sha) + check_hash_module(hmac, key='abc') diff --git a/lib-python/2.2/test/test_pickle.py b/lib-python/2.2/test/test_pickle.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pickle.py @@ -0,0 +1,40 @@ +import pickle +import test_support +import unittest +from cStringIO import StringIO +from pickletester import AbstractPickleTests, AbstractPickleModuleTests + +class PickleTests(AbstractPickleTests, AbstractPickleModuleTests): + + def setUp(self): + self.dumps = pickle.dumps + self.loads = pickle.loads + + module = pickle + error = KeyError + +class PicklerTests(AbstractPickleTests): + + error = KeyError + + def dumps(self, arg, bin=0): + f = StringIO() + p = pickle.Pickler(f, bin) + p.dump(arg) + f.seek(0) + return f.read() + + def loads(self, buf): + f = StringIO(buf) + u = pickle.Unpickler(f) + return u.load() + +def test_main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTest(loader.loadTestsFromTestCase(PickleTests)) + suite.addTest(loader.loadTestsFromTestCase(PicklerTests)) + test_support.run_suite(suite) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_pkg.py b/lib-python/2.2/test/test_pkg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pkg.py @@ -0,0 +1,259 @@ +# Test packages (dotted-name import) + +import sys, os, tempfile, traceback +from os import mkdir, rmdir, extsep # Can't test if these fail +del mkdir, rmdir +from test_support import verify, verbose, TestFailed + +# Helpers to create and destroy hierarchies. + +def mkhier(root, descr): + mkdir(root) + for name, contents in descr: + comps = name.split() + fullname = root + for c in comps: + fullname = os.path.join(fullname, c) + if contents is None: + mkdir(fullname) + else: + if verbose: print "write", fullname + f = open(fullname, "w") + f.write(contents) + if contents and contents[-1] != '\n': + f.write('\n') + f.close() + +def mkdir(x): + if verbose: print "mkdir", x + os.mkdir(x) + +def cleanout(root): + names = os.listdir(root) + for name in names: + fullname = os.path.join(root, name) + if os.path.isdir(fullname) and not os.path.islink(fullname): + cleanout(fullname) + else: + os.remove(fullname) + rmdir(root) + +def rmdir(x): + if verbose: print "rmdir", x + os.rmdir(x) + +def fixdir(lst): + try: + lst.remove('__builtins__') + except ValueError: + pass + return lst + +# Helper to run a test + +def runtest(hier, code): + root = tempfile.mktemp() + mkhier(root, hier) + savepath = sys.path[:] + codefile = tempfile.mktemp() + f = open(codefile, "w") + f.write(code) + f.close() + try: + sys.path.insert(0, root) + if verbose: print "sys.path =", sys.path + try: + execfile(codefile, globals(), {}) + except: + traceback.print_exc(file=sys.stdout) + finally: + sys.path[:] = savepath + try: + cleanout(root) + except (os.error, IOError): + pass + os.remove(codefile) + +# Test descriptions + +tests = [ + ("t1", [("t1", None), ("t1 __init__"+os.extsep+"py", "")], "import t1"), + + ("t2", [ + ("t2", None), + ("t2 __init__"+os.extsep+"py", "'doc for t2'; print __name__, 'loading'"), + ("t2 sub", None), + ("t2 sub __init__"+os.extsep+"py", ""), + ("t2 sub subsub", None), + ("t2 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ], +""" +import t2 +print t2.__doc__ +import t2.sub +import t2.sub.subsub +print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ +import t2 +from t2 import * +print dir() +from t2 import sub +from t2.sub import subsub +from t2.sub.subsub import spam +print sub.__name__, subsub.__name__ +print sub.subsub.__name__ +print dir() +import t2.sub +import t2.sub.subsub +print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ +from t2 import * +print dir() +"""), + + ("t3", [ + ("t3", None), + ("t3 __init__"+os.extsep+"py", "print __name__, 'loading'"), + ("t3 sub", None), + ("t3 sub __init__"+os.extsep+"py", ""), + ("t3 sub subsub", None), + ("t3 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ], +""" +import t3.sub.subsub +print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__ +reload(t3) +reload(t3.sub) +reload(t3.sub.subsub) +"""), + + ("t4", [ + ("t4"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (t4"+os.extsep+"py)'"), + ("t4", None), + ("t4 __init__"+os.extsep+"py", "print __name__, 'loading'"), + ("t4 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), + ("t4 sub", None), + ("t4 sub __init__"+os.extsep+"py", ""), + ("t4 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), + ("t4 sub subsub", None), + ("t4 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ], +""" +from t4.sub.subsub import * +print "t4.sub.subsub.spam =", spam +"""), + + ("t5", [ + ("t5", None), + ("t5 __init__"+os.extsep+"py", "import t5.foo"), + ("t5 string"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ("t5 foo"+os.extsep+"py", + "print __name__, 'loading'; import string; print string.spam"), + ], +""" +import t5 +from t5 import * +print dir() +import t5 +print fixdir(dir(t5)) +print fixdir(dir(t5.foo)) +print fixdir(dir(t5.string)) +"""), + + ("t6", [ + ("t6", None), + ("t6 __init__"+os.extsep+"py", "__all__ = ['spam', 'ham', 'eggs']"), + ("t6 spam"+os.extsep+"py", "print __name__, 'loading'"), + ("t6 ham"+os.extsep+"py", "print __name__, 'loading'"), + ("t6 eggs"+os.extsep+"py", "print __name__, 'loading'"), + ], +""" +import t6 +print fixdir(dir(t6)) +from t6 import * +print fixdir(dir(t6)) +print dir() +"""), + + ("t7", [ + ("t7"+os.extsep+"py", "print 'Importing t7"+os.extsep+"py'"), + ("t7", None), + ("t7 __init__"+os.extsep+"py", "print __name__, 'loading'"), + ("t7 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), + ("t7 sub", None), + ("t7 sub __init__"+os.extsep+"py", ""), + ("t7 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), + ("t7 sub subsub", None), + ("t7 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ], +""" +t7, sub, subsub = None, None, None +import t7 as tas +print fixdir(dir(tas)) +verify(not t7) +from t7 import sub as subpar +print fixdir(dir(subpar)) +verify(not t7 and not sub) +from t7.sub import subsub as subsubsub +print fixdir(dir(subsubsub)) +verify(not t7 and not sub and not subsub) +from t7.sub.subsub import spam as ham +print "t7.sub.subsub.spam =", ham +verify(not t7 and not sub and not subsub) +"""), + +] + +nontests = [ + ("x5", [], ("import a" + ".a"*400)), + ("x6", [], ("import a" + ".a"*499)), + ("x7", [], ("import a" + ".a"*500)), + ("x8", [], ("import a" + ".a"*1100)), + ("x9", [], ("import " + "a"*400)), + ("x10", [], ("import " + "a"*500)), + ("x11", [], ("import " + "a"*998)), + ("x12", [], ("import " + "a"*999)), + ("x13", [], ("import " + "a"*999)), + ("x14", [], ("import " + "a"*2000)), +] + +"""XXX Things to test + +import package without __init__ +import package with __init__ +__init__ importing submodule +__init__ importing global module +__init__ defining variables +submodule importing other submodule +submodule importing global module +submodule import submodule via global name +from package import submodule +from package import subpackage +from package import variable (defined in __init__) +from package import * (defined in __init__) +""" + +# Run the tests + +args = [] +if __name__ == '__main__': + args = sys.argv[1:] + if args and args[0] == '-q': + verbose = 0 + del args[0] + +for name, hier, code in tests: + if args and name not in args: + print "skipping test", name + continue + print "running test", name + runtest(hier, code) + +# Test +import sys +import imp +try: + import sys.imp +except ImportError: + # This is what we expect + pass +else: + raise TestFailed, "No ImportError exception on 'import sys.imp'" diff --git a/lib-python/2.2/test/test_pkgimport.py b/lib-python/2.2/test/test_pkgimport.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pkgimport.py @@ -0,0 +1,84 @@ +import os, sys, string, random, tempfile, unittest + +from test_support import run_unittest + +class TestImport(unittest.TestCase): + + def __init__(self, *args, **kw): + self.package_name = 'PACKAGE_' + while sys.modules.has_key(self.package_name): + self.package_name += random.choose(string.letters) + self.module_name = self.package_name + '.foo' + unittest.TestCase.__init__(self, *args, **kw) + + def remove_modules(self): + for module_name in (self.package_name, self.module_name): + if sys.modules.has_key(module_name): + del sys.modules[module_name] + + def setUp(self): + self.test_dir = tempfile.mktemp() + os.mkdir(self.test_dir) + sys.path.append(self.test_dir) + self.package_dir = os.path.join(self.test_dir, + self.package_name) + os.mkdir(self.package_dir) + open(os.path.join(self.package_dir, '__init__'+os.extsep+'py'), 'w') + self.module_path = os.path.join(self.package_dir, 'foo'+os.extsep+'py') + + def tearDown(self): + for file in os.listdir(self.package_dir): + os.remove(os.path.join(self.package_dir, file)) + os.rmdir(self.package_dir) + os.rmdir(self.test_dir) + self.assertNotEqual(sys.path.count(self.test_dir), 0) + sys.path.remove(self.test_dir) + self.remove_modules() + + def rewrite_file(self, contents): + for extension in "co": + compiled_path = self.module_path + extension + if os.path.exists(compiled_path): + os.remove(compiled_path) + f = open(self.module_path, 'w') + f.write(contents) + f.close() + + def test_package_import__semantics(self): + + # Generate a couple of broken modules to try importing. + + # ...try loading the module when there's a SyntaxError + self.rewrite_file('for') + try: __import__(self.module_name) + except SyntaxError: pass + else: raise RuntimeError, 'Failed to induce SyntaxError' + self.assert_(not sys.modules.has_key(self.module_name) and + not hasattr(sys.modules[self.package_name], 'foo')) + + # ...make up a variable name that isn't bound in __builtins__ + var = 'a' + while var in dir(__builtins__): + var += random.choose(string.letters) + + # ...make a module that just contains that + self.rewrite_file(var) + + try: __import__(self.module_name) + except NameError: pass + else: raise RuntimeError, 'Failed to induce NameError.' + module = __import__(self.module_name).foo + + # ...now change the module so that the NameError doesn't + # happen + self.rewrite_file('%s = 1' % var) + reload(module) + self.assertEqual(getattr(module, var), 1) + + +def test_main(): + run_unittest(TestImport) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_poll.py b/lib-python/2.2/test/test_poll.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_poll.py @@ -0,0 +1,172 @@ +# Test case for the os.poll() function + +import sys, os, select, random +from test_support import verify, verbose, TestSkipped, TESTFN + +try: + select.poll +except AttributeError: + raise TestSkipped, "select.poll not defined -- skipping test_poll" + + +def find_ready_matching(ready, flag): + match = [] + for fd, mode in ready: + if mode & flag: + match.append(fd) + return match + +def test_poll1(): + """Basic functional test of poll object + + Create a bunch of pipe and test that poll works with them. + """ + print 'Running poll test 1' + p = select.poll() + + NUM_PIPES = 12 + MSG = " This is a test." + MSG_LEN = len(MSG) + readers = [] + writers = [] + r2w = {} + w2r = {} + + for i in range(NUM_PIPES): + rd, wr = os.pipe() + p.register(rd, select.POLLIN) + p.register(wr, select.POLLOUT) + readers.append(rd) + writers.append(wr) + r2w[rd] = wr + w2r[wr] = rd + + while writers: + ready = p.poll() + ready_writers = find_ready_matching(ready, select.POLLOUT) + if not ready_writers: + raise RuntimeError, "no pipes ready for writing" + wr = random.choice(ready_writers) + os.write(wr, MSG) + + ready = p.poll() + ready_readers = find_ready_matching(ready, select.POLLIN) + if not ready_readers: + raise RuntimeError, "no pipes ready for reading" + rd = random.choice(ready_readers) + buf = os.read(rd, MSG_LEN) + verify(len(buf) == MSG_LEN) + print buf + os.close(r2w[rd]) ; os.close( rd ) + p.unregister( r2w[rd] ) + p.unregister( rd ) + writers.remove(r2w[rd]) + + poll_unit_tests() + print 'Poll test 1 complete' + +def poll_unit_tests(): + # returns NVAL for invalid file descriptor + FD = 42 + try: + os.close(FD) + except OSError: + pass + p = select.poll() + p.register(FD) + r = p.poll() + verify(r[0] == (FD, select.POLLNVAL)) + + f = open(TESTFN, 'w') + fd = f.fileno() + p = select.poll() + p.register(f) + r = p.poll() + verify(r[0][0] == fd) + f.close() + r = p.poll() + verify(r[0] == (fd, select.POLLNVAL)) + os.unlink(TESTFN) + + # type error for invalid arguments + p = select.poll() + try: + p.register(p) + except TypeError: + pass + else: + print "Bogus register call did not raise TypeError" + try: + p.unregister(p) + except TypeError: + pass + else: + print "Bogus unregister call did not raise TypeError" + + # can't unregister non-existent object + p = select.poll() + try: + p.unregister(3) + except KeyError: + pass + else: + print "Bogus unregister call did not raise KeyError" + + # Test error cases + pollster = select.poll() + class Nope: + pass + + class Almost: + def fileno(self): + return 'fileno' + + try: + pollster.register( Nope(), 0 ) + except TypeError: pass + else: print 'expected TypeError exception, not raised' + + try: + pollster.register( Almost(), 0 ) + except TypeError: pass + else: print 'expected TypeError exception, not raised' + + +# Another test case for poll(). This is copied from the test case for +# select(), modified to use poll() instead. + +def test_poll2(): + print 'Running poll test 2' + cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' + p = os.popen(cmd, 'r') + pollster = select.poll() + pollster.register( p, select.POLLIN ) + for tout in (0, 1000, 2000, 4000, 8000, 16000) + (-1,)*10: + if verbose: + print 'timeout =', tout + fdlist = pollster.poll(tout) + if (fdlist == []): + continue + fd, flags = fdlist[0] + if flags & select.POLLHUP: + line = p.readline() + if line != "": + print 'error: pipe seems to be closed, but still returns data' + continue + + elif flags & select.POLLIN: + line = p.readline() + if verbose: + print `line` + if not line: + if verbose: + print 'EOF' + break + continue + else: + print 'Unexpected return value from select.poll:', fdlist + p.close() + print 'Poll test 2 complete' + +test_poll1() +test_poll2() diff --git a/lib-python/2.2/test/test_popen2.py b/lib-python/2.2/test/test_popen2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_popen2.py @@ -0,0 +1,72 @@ +#! /usr/bin/env python +"""Test script for popen2.py + Christian Tismer +""" + +import os +import sys +from test_support import TestSkipped + +# popen2 contains its own testing routine +# which is especially useful to see if open files +# like stdin can be read successfully by a forked +# subprocess. + +def main(): + print "Test popen2 module:" + if sys.platform[:4] == 'beos' and __name__ != '__main__': + # Locks get messed up or something. Generally we're supposed + # to avoid mixing "posix" fork & exec with native threads, and + # they may be right about that after all. + raise TestSkipped, "popen2() doesn't work during import on BeOS" + try: + from os import popen + except ImportError: + # if we don't have os.popen, check that + # we have os.fork. if not, skip the test + # (by raising an ImportError) + from os import fork + import popen2 + popen2._test() + + +def _test(): + # same test as popen2._test(), but using the os.popen*() API + print "Testing os module:" + import popen2 + cmd = "cat" + teststr = "ab cd\n" + if os.name == "nt": + cmd = "more" + # "more" doesn't act the same way across Windows flavors, + # sometimes adding an extra newline at the start or the + # end. So we strip whitespace off both ends for comparison. + expected = teststr.strip() + print "testing popen2..." + w, r = os.popen2(cmd) + w.write(teststr) + w.close() + got = r.read() + if got.strip() != expected: + raise ValueError("wrote %s read %s" % (`teststr`, `got`)) + print "testing popen3..." + try: + w, r, e = os.popen3([cmd]) + except: + w, r, e = os.popen3(cmd) + w.write(teststr) + w.close() + got = r.read() + if got.strip() != expected: + raise ValueError("wrote %s read %s" % (`teststr`, `got`)) + got = e.read() + if got: + raise ValueError("unexected %s on stderr" % `got`) + for inst in popen2._active[:]: + inst.wait() + if popen2._active: + raise ValueError("_active not empty") + print "All OK" + +main() +_test() diff --git a/lib-python/2.2/test/test_posixpath.py b/lib-python/2.2/test/test_posixpath.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_posixpath.py @@ -0,0 +1,40 @@ +import posixpath + +errors = 0 + +def tester(fn, wantResult): + gotResult = eval(fn) + if wantResult != gotResult: + print "error!" + print "evaluated: " + str(fn) + print "should be: " + str(wantResult) + print " returned: " + str(gotResult) + print "" + global errors + errors = errors + 1 + +tester('posixpath.splitdrive("/foo/bar")', ('', '/foo/bar')) + +tester('posixpath.split("/foo/bar")', ('/foo', 'bar')) +tester('posixpath.split("/")', ('/', '')) +tester('posixpath.split("foo")', ('', 'foo')) + +tester('posixpath.splitext("foo.ext")', ('foo', '.ext')) +tester('posixpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext')) + +tester('posixpath.isabs("/")', 1) +tester('posixpath.isabs("/foo")', 1) +tester('posixpath.isabs("/foo/bar")', 1) +tester('posixpath.isabs("foo/bar")', 0) + +tester('posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])', + "/home/swen") +tester('posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"])', + "/home/swen/") +tester('posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])', + "/home/swen/spam") + +if errors: + print str(errors) + " errors." +else: + print "No errors. Thank your lucky stars." diff --git a/lib-python/2.2/test/test_pow.py b/lib-python/2.2/test/test_pow.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pow.py @@ -0,0 +1,125 @@ +import sys +import test_support + + +def powtest(type): + if type != float: + print " Testing 2-argument pow() function..." + for i in range(-1000, 1000): + if pow(type(i), 0) != 1: + raise ValueError, 'pow('+str(i)+',0) != 1' + if pow(type(i), 1) != type(i): + raise ValueError, 'pow('+str(i)+',1) != '+str(i) + if pow(type(0), 1) != type(0): + raise ValueError, 'pow(0,'+str(i)+') != 0' + if pow(type(1), 1) != type(1): + raise ValueError, 'pow(1,'+str(i)+') != 1' + + for i in range(-100, 100): + if pow(type(i), 3) != i*i*i: + raise ValueError, 'pow('+str(i)+',3) != '+str(i*i*i) + + pow2 = 1 + for i in range(0,31): + if pow(2, i) != pow2: + raise ValueError, 'pow(2,'+str(i)+') != '+str(pow2) + if i != 30 : pow2 = pow2*2 + + for othertype in int, long: + for i in range(-10, 0) + range(1, 10): + ii = type(i) + for j in range(1, 11): + jj = -othertype(j) + try: + pow(ii, jj) + except ValueError: + raise ValueError, "pow(%s, %s) failed" % (ii, jj) + + for othertype in int, long, float: + for i in range(1, 100): + zero = type(0) + exp = -othertype(i/10.0) + if exp == 0: + continue + try: + pow(zero, exp) + except ZeroDivisionError: + pass # taking zero to any negative exponent should fail + else: + raise ValueError, "pow(%s, %s) did not fail" % (zero, exp) + + print " Testing 3-argument pow() function..." + il, ih = -20, 20 + jl, jh = -5, 5 + kl, kh = -10, 10 + compare = cmp + if type == float: + il = 1 + compare = test_support.fcmp + elif type == int: + jl = 0 + elif type == long: + jl, jh = 0, 15 + for i in range(il, ih+1): + for j in range(jl, jh+1): + for k in range(kl, kh+1): + if k != 0: + if type == float or j < 0: + try: + pow(type(i),j,k) + except TypeError: + pass + else: + raise TestFailed("expected TypeError from " + "pow%r" % ((type(i), j, k))) + continue + if compare(pow(type(i),j,k), pow(type(i),j)% type(k)): + raise ValueError, "pow(" +str(i)+ "," +str(j)+ \ + "," +str(k)+ ") != pow(" +str(i)+ "," + \ + str(j)+ ") % " +str(k) + + +print 'Testing integer mode...' +powtest(int) +print 'Testing long integer mode...' +powtest(long) +print 'Testing floating point mode...' +powtest(float) + +# Other tests-- not very systematic + +print 'The number in both columns should match.' +print `pow(3,3) % 8`, `pow(3,3,8)` +print `pow(3,3) % -8`, `pow(3,3,-8)` +print `pow(3,2) % -2`, `pow(3,2,-2)` +print `pow(-3,3) % 8`, `pow(-3,3,8)` +print `pow(-3,3) % -8`, `pow(-3,3,-8)` +print `pow(5,2) % -8`, `pow(5,2,-8)` +print + +print `pow(3L,3L) % 8`, `pow(3L,3L,8)` +print `pow(3L,3L) % -8`, `pow(3L,3L,-8)` +print `pow(3L,2) % -2`, `pow(3L,2,-2)` +print `pow(-3L,3L) % 8`, `pow(-3L,3L,8)` +print `pow(-3L,3L) % -8`, `pow(-3L,3L,-8)` +print `pow(5L,2) % -8`, `pow(5L,2,-8)` +print + +print + +for i in range(-10, 11): + for j in range(0, 6): + for k in range(-7, 11): + if j >= 0 and k != 0: + o = pow(i,j) % k + n = pow(i,j,k) + if o != n: print 'Integer mismatch:', i,j,k + if j >= 0 and k != 0: + o = pow(long(i),j) % k + n = pow(long(i),j,k) + if o != n: print 'Integer mismatch:', i,j,k + +class TestRpow: + def __rpow__(self, other): + return None +None ** TestRpow() # Won't fail when __rpow__ invoked. SF bug #643260. diff --git a/lib-python/2.2/test/test_pprint.py b/lib-python/2.2/test/test_pprint.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pprint.py @@ -0,0 +1,104 @@ +import pprint +import unittest + +import test_support + +try: + uni = unicode +except NameError: + def uni(x):return x + + +class QueryTestCase(unittest.TestCase): + + def setUp(self): + self.a = range(100) + self.b = range(200) + self.a[-12] = self.b + + def test_basic(self): + """Verify .isrecursive() and .isreadable() w/o recursion.""" + verify = self.assert_ + for safe in (2, 2.0, 2j, "abc", [3], (2,2), {3: 3}, uni("yaddayadda"), + self.a, self.b): + verify(not pprint.isrecursive(safe), + "expected not isrecursive for " + `safe`) + verify(pprint.isreadable(safe), + "expected isreadable for " + `safe`) + + def test_knotted(self): + """Verify .isrecursive() and .isreadable() w/ recursion.""" + # Tie a knot. + self.b[67] = self.a + # Messy dict. + self.d = {} + self.d[0] = self.d[1] = self.d[2] = self.d + + verify = self.assert_ + + for icky in self.a, self.b, self.d, (self.d, self.d): + verify(pprint.isrecursive(icky), "expected isrecursive") + verify(not pprint.isreadable(icky), "expected not isreadable") + + # Break the cycles. + self.d.clear() + del self.a[:] + del self.b[:] + + for safe in self.a, self.b, self.d, (self.d, self.d): + verify(not pprint.isrecursive(safe), + "expected not isrecursive for " + `safe`) + verify(pprint.isreadable(safe), + "expected isreadable for " + `safe`) + + def test_unreadable(self): + """Not recursive but not readable anyway.""" + verify = self.assert_ + for unreadable in type(3), pprint, pprint.isrecursive: + verify(not pprint.isrecursive(unreadable), + "expected not isrecursive for " + `unreadable`) + verify(not pprint.isreadable(unreadable), + "expected not isreadable for " + `unreadable`) + + def test_same_as_repr(self): + "Simple objects and small containers that should be same as repr()." + verify = self.assert_ + for simple in (0, 0L, 0+0j, 0.0, "", uni(""), (), [], {}, verify, pprint, + -6, -6L, -6-6j, -1.5, "x", uni("x"), (3,), [3], {3: 6}, + (1,2), [3,4], {5: 6, 7: 8}, + {"xy\tab\n": (3,), 5: [[]], (): {}}, + range(10, -11, -1) + ): + native = repr(simple) + for function in "pformat", "saferepr": + f = getattr(pprint, function) + got = f(simple) + verify(native == got, "expected %s got %s from pprint.%s" % + (native, got, function)) + + + def test_basic_line_wrap(self): + """verify basic line-wrapping operation""" + o = {'RPM_cal': 0, + 'RPM_cal2': 48059, + 'Speed_cal': 0, + 'controldesk_runtime_us': 0, + 'main_code_runtime_us': 0, + 'read_io_runtime_us': 0, + 'write_io_runtime_us': 43690} + exp = """\ +{'RPM_cal': 0, + 'RPM_cal2': 48059, + 'Speed_cal': 0, + 'controldesk_runtime_us': 0, + 'main_code_runtime_us': 0, + 'read_io_runtime_us': 0, + 'write_io_runtime_us': 43690}""" + self.assertEqual(pprint.pformat(o), exp) + +def test_main(): + test_support.run_unittest(QueryTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_profile.py b/lib-python/2.2/test/test_profile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_profile.py @@ -0,0 +1,86 @@ +"""Test suite for the profile module.""" + +import profile + +# In order to have reproducible time, we simulate a timer in the global +# variable 'ticks', which represents simulated time in milliseconds. +# (We can't use a helper function increment the timer since it would be +# included in the profile and would appear to consume all the time.) +ticks = 0 + +def test_main(): + global ticks + ticks = 0 + prof = profile.Profile(timer) + prof.runctx("testfunc()", globals(), globals()) + prof.print_stats() + +def timer(): + return ticks*0.001 + +def testfunc(): + # 1 call + # 1000 ticks total: 400 ticks local, 600 ticks in subfunctions + global ticks + ticks += 199 + helper() # 300 + helper() # 300 + ticks += 201 + +def helper(): + # 2 calls + # 300 ticks total: 40 ticks local, 260 ticks in subfunctions + global ticks + ticks += 1 + helper1() # 30 + ticks += 3 + helper1() # 30 + ticks += 6 + helper2() # 50 + ticks += 5 + helper2() # 50 + ticks += 4 + helper2() # 50 + ticks += 7 + helper2() # 50 + ticks += 14 + +def helper1(): + # 4 calls + # 30 ticks total: 29 ticks local, 1 tick in subfunctions + global ticks + ticks += 10 + hasattr(C(), "foo") + ticks += 19 + +def helper2(): + # 8 calls + # 50 ticks local: 39 ticks local, 11 ticks in subfunctions + global ticks + ticks += 11 + hasattr(C(), "bar") # 1 + ticks += 13 + subhelper() # 10 + ticks += 15 + +def subhelper(): + # 8 calls + # 10 ticks total: 8 ticks local, 2 ticks in subfunctions + global ticks + ticks += 2 + for i in range(2): + try: + C().foo # 1 x 2 + except AttributeError: + ticks += 3 # 3 x 2 + +class C: + def __getattr__(self, name): + # 28 calls + # 1 tick, local + global ticks + ticks += 1 + raise AttributeError + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_profilehooks.py b/lib-python/2.2/test/test_profilehooks.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_profilehooks.py @@ -0,0 +1,360 @@ +from __future__ import generators + +from test_support import TestFailed + +import pprint +import sys +import unittest + +import test_support + + +class HookWatcher: + def __init__(self): + self.frames = [] + self.events = [] + + def callback(self, frame, event, arg): + self.add_event(event, frame) + + def add_event(self, event, frame=None): + """Add an event to the log.""" + if frame is None: + frame = sys._getframe(1) + + try: + frameno = self.frames.index(frame) + except ValueError: + frameno = len(self.frames) + self.frames.append(frame) + + self.events.append((frameno, event, ident(frame))) + + def get_events(self): + """Remove calls to add_event().""" + disallowed = [ident(self.add_event.im_func), ident(ident)] + self.frames = None + + return [item for item in self.events if item[2] not in disallowed] + + +class ProfileSimulator(HookWatcher): + def __init__(self, testcase): + self.testcase = testcase + self.stack = [] + HookWatcher.__init__(self) + + def callback(self, frame, event, arg): + # Callback registered with sys.setprofile()/sys.settrace() + self.dispatch[event](self, frame) + + def trace_call(self, frame): + self.add_event('call', frame) + self.stack.append(frame) + + def trace_return(self, frame): + self.add_event('return', frame) + self.stack.pop() + + def trace_exception(self, frame): + self.testcase.fail( + "the profiler should never receive exception events") + + dispatch = { + 'call': trace_call, + 'exception': trace_exception, + 'return': trace_return, + } + + +class TestCaseBase(unittest.TestCase): + def check_events(self, callable, expected): + events = capture_events(callable, self.new_watcher()) + if events != expected: + self.fail("Expected events:\n%s\nReceived events:\n%s" + % (pprint.pformat(expected), pprint.pformat(events))) + + +class ProfileHookTestCase(TestCaseBase): + def new_watcher(self): + return HookWatcher() + + def test_simple(self): + def f(p): + pass + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_exception(self): + def f(p): + 1/0 + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_caught_exception(self): + def f(p): + try: 1/0 + except: pass + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_caught_nested_exception(self): + def f(p): + try: 1/0 + except: pass + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_nested_exception(self): + def f(p): + 1/0 + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + # This isn't what I expected: + # (0, 'exception', protect_ident), + # I expected this again: + (1, 'return', f_ident), + ]) + + def test_exception_in_except_clause(self): + def f(p): + 1/0 + def g(p): + try: + f(p) + except: + try: f(p) + except: pass + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(1, 'call', g_ident), + (2, 'call', f_ident), + (2, 'return', f_ident), + (3, 'call', f_ident), + (3, 'return', f_ident), + (1, 'return', g_ident), + ]) + + def test_exception_propogation(self): + def f(p): + 1/0 + def g(p): + try: f(p) + finally: p.add_event("falling through") + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(1, 'call', g_ident), + (2, 'call', f_ident), + (2, 'return', f_ident), + (1, 'falling through', g_ident), + (1, 'return', g_ident), + ]) + + def test_raise_twice(self): + def f(p): + try: 1/0 + except: 1/0 + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_raise_reraise(self): + def f(p): + try: 1/0 + except: raise + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_raise(self): + def f(p): + raise Exception() + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_distant_exception(self): + def f(): + 1/0 + def g(): + f() + def h(): + g() + def i(): + h() + def j(p): + i() + f_ident = ident(f) + g_ident = ident(g) + h_ident = ident(h) + i_ident = ident(i) + j_ident = ident(j) + self.check_events(j, [(1, 'call', j_ident), + (2, 'call', i_ident), + (3, 'call', h_ident), + (4, 'call', g_ident), + (5, 'call', f_ident), + (5, 'return', f_ident), + (4, 'return', g_ident), + (3, 'return', h_ident), + (2, 'return', i_ident), + (1, 'return', j_ident), + ]) + + def test_generator(self): + def f(): + for i in range(2): + yield i + def g(p): + for i in f(): + pass + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(1, 'call', g_ident), + # call the iterator twice to generate values + (2, 'call', f_ident), + (2, 'return', f_ident), + (2, 'call', f_ident), + (2, 'return', f_ident), + # once more; returns end-of-iteration with + # actually raising an exception + (2, 'call', f_ident), + (2, 'return', f_ident), + (1, 'return', g_ident), + ]) + + def test_stop_iteration(self): + def f(): + for i in range(2): + yield i + raise StopIteration + def g(p): + for i in f(): + pass + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(1, 'call', g_ident), + # call the iterator twice to generate values + (2, 'call', f_ident), + (2, 'return', f_ident), + (2, 'call', f_ident), + (2, 'return', f_ident), + # once more to hit the raise: + (2, 'call', f_ident), + (2, 'return', f_ident), + (1, 'return', g_ident), + ]) + + +class ProfileSimulatorTestCase(TestCaseBase): + def new_watcher(self): + return ProfileSimulator(self) + + def test_simple(self): + def f(p): + pass + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_basic_exception(self): + def f(p): + 1/0 + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_caught_exception(self): + def f(p): + try: 1/0 + except: pass + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident), + ]) + + def test_distant_exception(self): + def f(): + 1/0 + def g(): + f() + def h(): + g() + def i(): + h() + def j(p): + i() + f_ident = ident(f) + g_ident = ident(g) + h_ident = ident(h) + i_ident = ident(i) + j_ident = ident(j) + self.check_events(j, [(1, 'call', j_ident), + (2, 'call', i_ident), + (3, 'call', h_ident), + (4, 'call', g_ident), + (5, 'call', f_ident), + (5, 'return', f_ident), + (4, 'return', g_ident), + (3, 'return', h_ident), + (2, 'return', i_ident), + (1, 'return', j_ident), + ]) + + +def ident(function): + if hasattr(function, "f_code"): + code = function.f_code + else: + code = function.func_code + return code.co_firstlineno, code.co_name + + +def protect(f, p): + try: f(p) + except: pass + +protect_ident = ident(protect) + + +def capture_events(callable, p=None): + try: sys.setprofile() + except TypeError: pass + else: raise TestFailed, 'sys.setprofile() did not raise TypeError' + + if p is None: + p = HookWatcher() + sys.setprofile(p.callback) + protect(callable, p) + sys.setprofile(None) + return p.get_events()[1:-1] + + +def show_events(callable): + import pprint + pprint.pprint(capture_events(callable)) + + +def test_main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTest(loader.loadTestsFromTestCase(ProfileHookTestCase)) + suite.addTest(loader.loadTestsFromTestCase(ProfileSimulatorTestCase)) + test_support.run_suite(suite) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_pty.py b/lib-python/2.2/test/test_pty.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pty.py @@ -0,0 +1,98 @@ +import pty, os, sys +from test_support import verbose, TestFailed, TestSkipped + +TEST_STRING_1 = "I wish to buy a fish license.\n" +TEST_STRING_2 = "For my pet fish, Eric.\n" + +if verbose: + def debug(msg): + print msg +else: + def debug(msg): + pass + +# Marginal testing of pty suite. Cannot do extensive 'do or fail' testing +# because pty code is not too portable. + +try: + debug("Calling master_open()") + master_fd, slave_name = pty.master_open() + debug("Got master_fd '%d', slave_name '%s'"%(master_fd, slave_name)) + debug("Calling slave_open(%s)"%`slave_name`) + slave_fd = pty.slave_open(slave_name) + debug("Got slave_fd '%d'"%slave_fd) +except OSError: + # " An optional feature could not be imported " ... ? + raise TestSkipped, "Pseudo-terminals (seemingly) not functional." + +if not os.isatty(slave_fd): + raise TestFailed, "slave_fd is not a tty" + +# IRIX apparently turns \n into \r\n. Allow that, but avoid allowing other +# differences (like extra whitespace, trailing garbage, etc.) + +debug("Writing to slave_fd") +os.write(slave_fd, TEST_STRING_1) +s1 = os.read(master_fd, 1024) +sys.stdout.write(s1.replace("\r\n", "\n")) + +debug("Writing chunked output") +os.write(slave_fd, TEST_STRING_2[:5]) +os.write(slave_fd, TEST_STRING_2[5:]) +s2 = os.read(master_fd, 1024) +sys.stdout.write(s2.replace("\r\n", "\n")) + +os.close(slave_fd) +os.close(master_fd) + +# basic pty passed. + +debug("calling pty.fork()") +pid, master_fd = pty.fork() +if pid == pty.CHILD: + # stdout should be connected to a tty. + if not os.isatty(1): + debug("Child's fd 1 is not a tty?!") + os._exit(3) + + # After pty.fork(), the child should already be a session leader. + # (on those systems that have that concept.) + debug("In child, calling os.setsid()") + try: + os.setsid() + except OSError: + # Good, we already were session leader + debug("Good: OSError was raised.") + pass + except AttributeError: + # Have pty, but not setsid() ? + debug("No setsid() available ?") + pass + except: + # We don't want this error to propagate, escaping the call to + # os._exit() and causing very peculiar behavior in the calling + # regrtest.py ! + # Note: could add traceback printing here. + debug("An unexpected error was raised.") + os._exit(1) + else: + debug("os.setsid() succeeded! (bad!)") + os._exit(2) + os._exit(4) +else: + debug("Waiting for child (%d) to finish."%pid) + (pid, status) = os.waitpid(pid, 0) + res = status >> 8 + debug("Child (%d) exited with status %d (%d)."%(pid, res, status)) + if res == 1: + raise TestFailed, "Child raised an unexpected exception in os.setsid()" + elif res == 2: + raise TestFailed, "pty.fork() failed to make child a session leader." + elif res == 3: + raise TestFailed, "Child spawned by pty.fork() did not have a tty as stdout" + elif res != 4: + raise TestFailed, "pty.fork() failed for unknown reasons." + +os.close(master_fd) + +# pty.fork() passed. diff --git a/lib-python/2.2/test/test_pwd.py b/lib-python/2.2/test/test_pwd.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pwd.py @@ -0,0 +1,71 @@ +from test_support import verbose +import pwd + +print 'pwd.getpwall()' +entries = pwd.getpwall() + +for e in entries: + name = e[0] + uid = e[2] + if verbose: + print name, uid + print 'pwd.getpwuid()' + dbuid = pwd.getpwuid(uid) + if dbuid[0] != name: + print 'Mismatch in pwd.getpwuid()' + print 'pwd.getpwnam()' + dbname = pwd.getpwnam(name) + if dbname[2] != uid: + print 'Mismatch in pwd.getpwnam()' + else: + print 'name matches uid' + break + +# try to get some errors +bynames = {} +byuids = {} +for n, p, u, g, gecos, d, s in entries: + bynames[n] = u + byuids[u] = n + +allnames = bynames.keys() +namei = 0 +fakename = allnames[namei] +while bynames.has_key(fakename): + chars = map(None, fakename) + for i in range(len(chars)): + if chars[i] == 'z': + chars[i] = 'A' + break + elif chars[i] == 'Z': + continue + else: + chars[i] = chr(ord(chars[i]) + 1) + break + else: + namei = namei + 1 + try: + fakename = allnames[namei] + except IndexError: + # should never happen... if so, just forget it + break + fakename = ''.join(map(None, chars)) + +try: + pwd.getpwnam(fakename) +except KeyError: + print 'caught expected exception' +else: + print 'fakename', fakename, 'did not except pwd.getpwnam()' + +# Choose a non-existent uid. +fakeuid = 4127 +while byuids.has_key(fakeuid): + fakeuid = (fakeuid * 3) % 0x10000 + +try: + pwd.getpwuid(fakeuid) +except KeyError: + print 'caught expected exception' +else: + print 'fakeuid', fakeuid, 'did not except pwd.getpwuid()' diff --git a/lib-python/2.2/test/test_pyclbr.py b/lib-python/2.2/test/test_pyclbr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pyclbr.py @@ -0,0 +1,154 @@ +''' + Test cases for pyclbr.py + Nick Mathewson +''' +from test_support import run_unittest +import unittest, sys +from types import ClassType, FunctionType, MethodType +import pyclbr + +# This next line triggers an error on old versions of pyclbr. + +from commands import getstatus + +# Here we test the python class browser code. +# +# The main function in this suite, 'testModule', compares the output +# of pyclbr with the introspected members of a module. Because pyclbr +# is imperfect (as designed), testModule is called with a set of +# members to ignore. + +class PyclbrTest(unittest.TestCase): + + def assertListEq(self, l1, l2, ignore): + ''' succeed iff {l1} - {ignore} == {l2} - {ignore} ''' + for p1, p2 in (l1, l2), (l2, l1): + for item in p1: + ok = (item in p2) or (item in ignore) + if not ok: + self.fail("%r missing" % item) + + + def assertHasattr(self, obj, attr, ignore): + ''' succeed iff hasattr(obj,attr) or attr in ignore. ''' + if attr in ignore: return + if not hasattr(obj, attr): print "???", attr + self.failUnless(hasattr(obj, attr)) + + + def assertHaskey(self, obj, key, ignore): + ''' succeed iff obj.has_key(key) or key in ignore. ''' + if key in ignore: return + if not obj.has_key(key): print "***",key + self.failUnless(obj.has_key(key)) + + def assertEquals(self, a, b, ignore=None): + ''' succeed iff a == b or a in ignore or b in ignore ''' + if (ignore == None) or (a in ignore) or (b in ignore): return + + unittest.TestCase.assertEquals(self, a, b) + + def checkModule(self, moduleName, module=None, ignore=()): + ''' succeed iff pyclbr.readmodule_ex(modulename) corresponds + to the actual module object, module. Any identifiers in + ignore are ignored. If no module is provided, the appropriate + module is loaded with __import__.''' + + if module == None: + module = __import__(moduleName, globals(), {}, []) + + dict = pyclbr.readmodule_ex(moduleName) + + # Make sure the toplevel functions and classes are the same. + for name, value in dict.items(): + if name in ignore: + continue + self.assertHasattr(module, name, ignore) + py_item = getattr(module, name) + if isinstance(value, pyclbr.Function): + self.assertEquals(type(py_item), FunctionType) + else: + self.assertEquals(type(py_item), ClassType) + real_bases = [base.__name__ for base in py_item.__bases__] + pyclbr_bases = [ getattr(base, 'name', base) + for base in value.super ] + + self.assertListEq(real_bases, pyclbr_bases, ignore) + + actualMethods = [] + for m in py_item.__dict__.keys(): + if type(getattr(py_item, m)) == MethodType: + actualMethods.append(m) + foundMethods = [] + for m in value.methods.keys(): + if m[:2] == '__' and m[-2:] != '__': + foundMethods.append('_'+name+m) + else: + foundMethods.append(m) + + self.assertListEq(foundMethods, actualMethods, ignore) + self.assertEquals(py_item.__module__, value.module) + + self.assertEquals(py_item.__name__, value.name, ignore) + # can't check file or lineno + + # Now check for missing stuff. + for name in dir(module): + item = getattr(module, name) + if type(item) in (ClassType, FunctionType): + self.assertHaskey(dict, name, ignore) + + def test_easy(self): + self.checkModule('pyclbr') + self.checkModule('doctest', + ignore=['_isclass', + '_isfunction', + '_ismodule', + '_classify_class_attrs']) + self.checkModule('rfc822', ignore=["get"]) + self.checkModule('xmllib') + self.checkModule('difflib') + + def test_others(self): + cm = self.checkModule + + # these are about the 20 longest modules. + + cm('random', ignore=('_verify',)) # deleted + + cm('cgi', ignore=('f', 'g', # nested declarations + 'log')) # set with =, not def + + cm('mhlib', ignore=('do', # nested declaration + 'bisect')) # imported method, set with = + + cm('urllib', ignore=('getproxies_environment', # set with = + 'getproxies_registry', # set with = + 'open_https')) # not on all platforms + + cm('pickle', ignore=('g',)) # deleted declaration + + cm('aifc', ignore=('openfp',)) # set with = + + cm('Cookie', ignore=('__str__', 'Cookie')) # set with = + + cm('sre_parse', ignore=('literal', # nested def + 'makedict', 'dump' # from sre_constants + )) + + cm('test.test_pyclbr', + module=sys.modules[__name__]) + + # pydoc doesn't work because of string issues + # cm('pydoc', pydoc) + + # pdb plays too many dynamic games + # cm('pdb', pdb) + + +def test_main(): + run_unittest(PyclbrTest) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_pyexpat.py b/lib-python/2.2/test/test_pyexpat.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_pyexpat.py @@ -0,0 +1,202 @@ +# Very simple test - Parse a file and print what happens + +# XXX TypeErrors on calling handlers, or on bad return values from a +# handler, are obscure and unhelpful. + +import pyexpat +from xml.parsers import expat + +from test_support import sortdict + +class Outputter: + def StartElementHandler(self, name, attrs): + print 'Start element:\n\t', repr(name), sortdict(attrs) + + def EndElementHandler(self, name): + print 'End element:\n\t', repr(name) + + def CharacterDataHandler(self, data): + data = data.strip() + if data: + print 'Character data:' + print '\t', repr(data) + + def ProcessingInstructionHandler(self, target, data): + print 'PI:\n\t', repr(target), repr(data) + + def StartNamespaceDeclHandler(self, prefix, uri): + print 'NS decl:\n\t', repr(prefix), repr(uri) + + def EndNamespaceDeclHandler(self, prefix): + print 'End of NS decl:\n\t', repr(prefix) + + def StartCdataSectionHandler(self): + print 'Start of CDATA section' + + def EndCdataSectionHandler(self): + print 'End of CDATA section' + + def CommentHandler(self, text): + print 'Comment:\n\t', repr(text) + + def NotationDeclHandler(self, *args): + name, base, sysid, pubid = args + print 'Notation declared:', args + + def UnparsedEntityDeclHandler(self, *args): + entityName, base, systemId, publicId, notationName = args + print 'Unparsed entity decl:\n\t', args + + def NotStandaloneHandler(self, userData): + print 'Not standalone' + return 1 + + def ExternalEntityRefHandler(self, *args): + context, base, sysId, pubId = args + print 'External entity ref:', args[1:] + return 1 + + def DefaultHandler(self, userData): + pass + + def DefaultHandlerExpand(self, userData): + pass + + +def confirm(ok): + if ok: + print "OK." + else: + print "Not OK." + +out = Outputter() +parser = expat.ParserCreate(namespace_separator='!') + +# Test getting/setting returns_unicode +parser.returns_unicode = 0; confirm(parser.returns_unicode == 0) +parser.returns_unicode = 1; confirm(parser.returns_unicode == 1) +parser.returns_unicode = 2; confirm(parser.returns_unicode == 1) +parser.returns_unicode = 0; confirm(parser.returns_unicode == 0) + +# Test getting/setting ordered_attributes +parser.ordered_attributes = 0; confirm(parser.ordered_attributes == 0) +parser.ordered_attributes = 1; confirm(parser.ordered_attributes == 1) +parser.ordered_attributes = 2; confirm(parser.ordered_attributes == 1) +parser.ordered_attributes = 0; confirm(parser.ordered_attributes == 0) + +# Test getting/setting specified_attributes +parser.specified_attributes = 0; confirm(parser.specified_attributes == 0) +parser.specified_attributes = 1; confirm(parser.specified_attributes == 1) +parser.specified_attributes = 2; confirm(parser.specified_attributes == 1) +parser.specified_attributes = 0; confirm(parser.specified_attributes == 0) + +HANDLER_NAMES = [ + 'StartElementHandler', 'EndElementHandler', + 'CharacterDataHandler', 'ProcessingInstructionHandler', + 'UnparsedEntityDeclHandler', 'NotationDeclHandler', + 'StartNamespaceDeclHandler', 'EndNamespaceDeclHandler', + 'CommentHandler', 'StartCdataSectionHandler', + 'EndCdataSectionHandler', + 'DefaultHandler', 'DefaultHandlerExpand', + #'NotStandaloneHandler', + 'ExternalEntityRefHandler' + ] +for name in HANDLER_NAMES: + setattr(parser, name, getattr(out, name)) + +data = '''\ + + + + + + + + +%unparsed_entity; +]> + + + + Contents of subelements + + +&external_entity; + +''' + +# Produce UTF-8 output +parser.returns_unicode = 0 +try: + parser.Parse(data, 1) +except expat.error: + print '** Error', parser.ErrorCode, expat.ErrorString(parser.ErrorCode) + print '** Line', parser.ErrorLineNumber + print '** Column', parser.ErrorColumnNumber + print '** Byte', parser.ErrorByteIndex + +# Try the parse again, this time producing Unicode output +parser = expat.ParserCreate(namespace_separator='!') +parser.returns_unicode = 1 + +for name in HANDLER_NAMES: + setattr(parser, name, getattr(out, name)) +try: + parser.Parse(data, 1) +except expat.error: + print '** Error', parser.ErrorCode, expat.ErrorString(parser.ErrorCode) + print '** Line', parser.ErrorLineNumber + print '** Column', parser.ErrorColumnNumber + print '** Byte', parser.ErrorByteIndex + +# Try parsing a file +parser = expat.ParserCreate(namespace_separator='!') +parser.returns_unicode = 1 + +for name in HANDLER_NAMES: + setattr(parser, name, getattr(out, name)) +import StringIO +file = StringIO.StringIO(data) +try: + parser.ParseFile(file) +except expat.error: + print '** Error', parser.ErrorCode, expat.ErrorString(parser.ErrorCode) + print '** Line', parser.ErrorLineNumber + print '** Column', parser.ErrorColumnNumber + print '** Byte', parser.ErrorByteIndex + + +# Tests that make sure we get errors when the namespace_separator value +# is illegal, and that we don't for good values: +print +print "Testing constructor for proper handling of namespace_separator values:" +expat.ParserCreate() +expat.ParserCreate(namespace_separator=None) +expat.ParserCreate(namespace_separator=' ') +print "Legal values tested o.k." +try: + expat.ParserCreate(namespace_separator=42) +except TypeError, e: + print "Caught expected TypeError:" + print e +else: + print "Failed to catch expected TypeError." + +try: + expat.ParserCreate(namespace_separator='too long') +except ValueError, e: + print "Caught expected ValueError:" + print e +else: + print "Failed to catch expected ValueError." + +# ParserCreate() needs to accept a namespace_separator of zero length +# to satisfy the requirements of RDF applications that are required +# to simply glue together the namespace URI and the localname. Though +# considered a wart of the RDF specifications, it needs to be supported. +# +# See XML-SIG mailing list thread starting with +# http://mail.python.org/pipermail/xml-sig/2001-April/005202.html +# +expat.ParserCreate(namespace_separator='') # too short diff --git a/lib-python/2.2/test/test_queue.py b/lib-python/2.2/test/test_queue.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_queue.py @@ -0,0 +1,158 @@ +# Some simple Queue module tests, plus some failure conditions +# to ensure the Queue locks remain stable +import Queue +import sys +import threading +import time + +from test_support import verify, TestFailed, verbose + +queue_size = 5 + +# Execute a function that blocks, and in a seperate thread, a function that +# triggers the release. Returns the result of the blocking function. +class _TriggerThread(threading.Thread): + def __init__(self, fn, args): + self.fn = fn + self.args = args + self.startedEvent = threading.Event() + threading.Thread.__init__(self) + def run(self): + time.sleep(.1) + self.startedEvent.set() + self.fn(*self.args) + +def _doBlockingTest( block_func, block_args, trigger_func, trigger_args): + t = _TriggerThread(trigger_func, trigger_args) + t.start() + try: + return block_func(*block_args) + finally: + # If we unblocked before our thread made the call, we failed! + if not t.startedEvent.isSet(): + raise TestFailed("blocking function '%r' appeared not to block" % (block_func,)) + t.join(1) # make sure the thread terminates + if t.isAlive(): + raise TestFailed("trigger function '%r' appeared to not return" % (trigger_func,)) + +# A Queue subclass that can provoke failure at a moment's notice :) +class FailingQueueException(Exception): + pass + +class FailingQueue(Queue.Queue): + def __init__(self, *args): + self.fail_next_put = False + self.fail_next_get = False + Queue.Queue.__init__(self, *args) + def _put(self, item): + if self.fail_next_put: + self.fail_next_put = False + raise FailingQueueException, "You Lose" + return Queue.Queue._put(self, item) + def _get(self): + if self.fail_next_get: + self.fail_next_get = False + raise FailingQueueException, "You Lose" + return Queue.Queue._get(self) + +def FailingQueueTest(q): + if not q.empty(): + raise RuntimeError, "Call this function with an empty queue" + for i in range(queue_size-1): + q.put(i) + q.fail_next_put = True + # Test a failing non-blocking put. + try: + q.put("oops", block=0) + raise TestFailed("The queue didn't fail when it should have") + except FailingQueueException: + pass + q.put("last") + verify(q.full(), "Queue should be full") + q.fail_next_put = True + # Test a failing blocking put + try: + _doBlockingTest( q.put, ("full",), q.get, ()) + raise TestFailed("The queue didn't fail when it should have") + except FailingQueueException: + pass + # Check the Queue isn't damaged. + # put failed, but get succeeded - re-add + q.put("last") + verify(q.full(), "Queue should be full") + q.get() + verify(not q.full(), "Queue should not be full") + q.put("last") + verify(q.full(), "Queue should be full") + # Test a blocking put + _doBlockingTest( q.put, ("full",), q.get, ()) + # Empty it + for i in range(queue_size): + q.get() + verify(q.empty(), "Queue should be empty") + q.put("first") + q.fail_next_get = True + try: + q.get() + raise TestFailed("The queue didn't fail when it should have") + except FailingQueueException: + pass + verify(not q.empty(), "Queue should not be empty") + q.get() + verify(q.empty(), "Queue should be empty") + q.fail_next_get = True + try: + _doBlockingTest( q.get, (), q.put, ('empty',)) + raise TestFailed("The queue didn't fail when it should have") + except FailingQueueException: + pass + # put succeeded, but get failed. + verify(not q.empty(), "Queue should not be empty") + q.get() + verify(q.empty(), "Queue should be empty") + +def SimpleQueueTest(q): + if not q.empty(): + raise RuntimeError, "Call this function with an empty queue" + # I guess we better check things actually queue correctly a little :) + q.put(111) + q.put(222) + verify(q.get()==111 and q.get()==222, "Didn't seem to queue the correct data!") + for i in range(queue_size-1): + q.put(i) + verify(not q.full(), "Queue should not be full") + q.put("last") + verify(q.full(), "Queue should be full") + try: + q.put("full", block=0) + raise TestFailed("Didn't appear to block with a full queue") + except Queue.Full: + pass + # Test a blocking put + _doBlockingTest( q.put, ("full",), q.get, ()) + # Empty it + for i in range(queue_size): + q.get() + verify(q.empty(), "Queue should be empty") + try: + q.get(block=0) + raise TestFailed("Didn't appear to block with an empty queue") + except Queue.Empty: + pass + # Test a blocking get + _doBlockingTest( q.get, (), q.put, ('empty',)) + +def test(): + q=Queue.Queue(queue_size) + # Do it a couple of times on the same queue + SimpleQueueTest(q) + SimpleQueueTest(q) + if verbose: + print "Simple Queue tests seemed to work" + q = FailingQueue(queue_size) + FailingQueueTest(q) + FailingQueueTest(q) + if verbose: + print "Failing Queue tests seemed to work" + +test() diff --git a/lib-python/2.2/test/test_quopri.py b/lib-python/2.2/test/test_quopri.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_quopri.py @@ -0,0 +1,157 @@ +import test_support +import unittest + +from cStringIO import StringIO +from quopri import * + + + +ENCSAMPLE = """\ +Here's a bunch of special=20 + +=A1=A2=A3=A4=A5=A6=A7=A8=A9 +=AA=AB=AC=AD=AE=AF=B0=B1=B2=B3 +=B4=B5=B6=B7=B8=B9=BA=BB=BC=BD=BE +=BF=C0=C1=C2=C3=C4=C5=C6 +=C7=C8=C9=CA=CB=CC=CD=CE=CF +=D0=D1=D2=D3=D4=D5=D6=D7 +=D8=D9=DA=DB=DC=DD=DE=DF +=E0=E1=E2=E3=E4=E5=E6=E7 +=E8=E9=EA=EB=EC=ED=EE=EF +=F0=F1=F2=F3=F4=F5=F6=F7 +=F8=F9=FA=FB=FC=FD=FE=FF + +characters... have fun! +""" + +# First line ends with a space +DECSAMPLE = "Here's a bunch of special \n" + \ +"""\ + +\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9 +\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3 +\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe +\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6 +\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf +\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7 +\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf +\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7 +\xe8\xe9\xea\xeb\xec\xed\xee\xef +\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7 +\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +characters... have fun! +""" + + + +class QuopriTestCase(unittest.TestCase): + # Each entry is a tuple of (plaintext, encoded string). These strings are + # used in the "quotetabs=0" tests. + STRINGS = ( + # Some normal strings + ('hello', 'hello'), + ('''hello + there + world''', '''hello + there + world'''), + ('''hello + there + world +''', '''hello + there + world +'''), + ('\201\202\203', '=81=82=83'), + # Add some trailing MUST QUOTE strings + ('hello ', 'hello=20'), + ('hello\t', 'hello=09'), + # Some long lines. First, a single line of 108 characters + ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + '''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=D8=D9=DA=DB=DC=DD=DE=DFx= +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'''), + # A line of exactly 76 characters, no soft line break should be needed + ('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'), + # A line of 77 characters, forcing a soft line break at position 75, + # and a second line of exactly 2 characters (because the soft line + # break `=' sign counts against the line length limit). + ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', + '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= +zz'''), + # A line of 151 characters, forcing a soft line break at position 75, + # with a second line of exactly 76 characters and no trailing = + ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', + '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''), + # A string containing a hard line break, but which the first line is + # 151 characters and the second line is exactly 76 characters. This + # should leave us with three lines, the first which has a soft line + # break, and which the second and third do not. + ('''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz''', + '''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy= +yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''), + # Now some really complex stuff ;) + (DECSAMPLE, ENCSAMPLE), + ) + + # These are used in the "quotetabs=1" tests. + ESTRINGS = ( + ('hello world', 'hello=20world'), + ('hello\tworld', 'hello=09world'), + ) + + # These are used in the "header=1" tests. + HSTRINGS = ( + ('hello world', 'hello_world'), + ('hello_world', 'hello=5Fworld'), + ) + + def test_encodestring(self): + for p, e in self.STRINGS: + self.assert_(encodestring(p) == e) + + def test_decodestring(self): + for p, e in self.STRINGS: + self.assert_(decodestring(e) == p) + + def test_idempotent_string(self): + for p, e in self.STRINGS: + self.assert_(decodestring(encodestring(e)) == e) + + def test_encode(self): + for p, e in self.STRINGS: + infp = StringIO(p) + outfp = StringIO() + encode(infp, outfp, quotetabs=0) + self.assert_(outfp.getvalue() == e) + + def test_decode(self): + for p, e in self.STRINGS: + infp = StringIO(e) + outfp = StringIO() + decode(infp, outfp) + self.assert_(outfp.getvalue() == p) + + def test_embedded_ws(self): + for p, e in self.ESTRINGS: + self.assert_(encodestring(p, quotetabs=1) == e) + self.assert_(decodestring(e) == p) + + def test_encode_header(self): + for p, e in self.HSTRINGS: + self.assert_(encodestring(p, header = 1) == e) + + def test_decode_header(self): + for p, e in self.HSTRINGS: + self.assert_(decodestring(e, header = 1) == p) + +def test_main(): + test_support.run_unittest(QuopriTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_random.py b/lib-python/2.2/test/test_random.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_random.py @@ -0,0 +1,19 @@ +import test_support +import random + +# Ensure that the seed() method initializes all the hidden state. In +# particular, through 2.2.1 it failed to reset a piece of state used by +# (and only by) the .gauss() method. + +for seed in 1, 12, 123, 1234, 12345, 123456, 654321: + for seeder in random.seed, random.whseed: + seeder(seed) + x1 = random.random() + y1 = random.gauss(0, 1) + + seeder(seed) + x2 = random.random() + y2 = random.gauss(0, 1) + + test_support.vereq(x1, x2) + test_support.vereq(y1, y2) diff --git a/lib-python/2.2/test/test_re.py b/lib-python/2.2/test/test_re.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_re.py @@ -0,0 +1,392 @@ +import sys +sys.path = ['.'] + sys.path + +from test_support import verify, verbose, TestFailed +import re +import sys, os, traceback + +# Misc tests from Tim Peters' re.doc + +if verbose: + print 'Running tests on re.search and re.match' + +try: + verify(re.search('x*', 'axx').span(0) == (0, 0)) + verify(re.search('x*', 'axx').span() == (0, 0)) + verify(re.search('x+', 'axx').span(0) == (1, 3)) + verify(re.search('x+', 'axx').span() == (1, 3)) + verify(re.search('x', 'aaa') is None) +except: + raise TestFailed, "re.search" + +try: + verify(re.match('a*', 'xxx').span(0) == (0, 0)) + verify(re.match('a*', 'xxx').span() == (0, 0)) + verify(re.match('x*', 'xxxa').span(0) == (0, 3)) + verify(re.match('x*', 'xxxa').span() == (0, 3)) + verify(re.match('a+', 'xxx') is None) +except: + raise TestFailed, "re.search" + +if verbose: + print 'Running tests on re.sub' + +try: + verify(re.sub("(?i)b+", "x", "bbbb BBBB") == 'x x') + + def bump_num(matchobj): + int_value = int(matchobj.group(0)) + return str(int_value + 1) + + verify(re.sub(r'\d+', bump_num, '08.2 -2 23x99y') == '9.3 -3 24x100y') + verify(re.sub(r'\d+', bump_num, '08.2 -2 23x99y', 3) == '9.3 -3 23x99y') + + verify(re.sub('.', lambda m: r"\n", 'x') == '\\n') + verify(re.sub('.', r"\n", 'x') == '\n') + + s = r"\1\1" + verify(re.sub('(.)', s, 'x') == 'xx') + verify(re.sub('(.)', re.escape(s), 'x') == s) + verify(re.sub('(.)', lambda m: s, 'x') == s) + + verify(re.sub('(?Px)', '\g\g', 'xx') == 'xxxx') + verify(re.sub('(?Px)', '\g\g<1>', 'xx') == 'xxxx') + verify(re.sub('(?Px)', '\g\g', 'xx') == 'xxxx') + verify(re.sub('(?Px)', '\g<1>\g<1>', 'xx') == 'xxxx') + + verify(re.sub('a', r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D', 'a') == '\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D') + verify(re.sub('a', '\t\n\v\r\f\a', 'a') == '\t\n\v\r\f\a') + verify(re.sub('a', '\t\n\v\r\f\a', 'a') == (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7))) + + verify(re.sub('^\s*', 'X', 'test') == 'Xtest') + + # Test for sub() on escaped characters, see SF bug #449000 + verify(re.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n') == 'abc\ndef\n') + verify(re.sub('\r\n', r'\n', 'abc\r\ndef\r\n') == 'abc\ndef\n') + verify(re.sub(r'\r\n', '\n', 'abc\r\ndef\r\n') == 'abc\ndef\n') + verify(re.sub('\r\n', '\n', 'abc\r\ndef\r\n') == 'abc\ndef\n') +except AssertionError: + raise TestFailed, "re.sub" + + +try: + verify(re.sub('a', 'b', 'aaaaa') == 'bbbbb') + verify(re.sub('a', 'b', 'aaaaa', 1) == 'baaaa') +except AssertionError: + raise TestFailed, "qualified re.sub" + +if verbose: + print 'Running tests on symbolic references' + +try: + re.sub('(?Px)', '\gx)', '\g<', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)', '\g', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)', '\g', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)', '\g<1a1>', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)', '\g', 'xx') +except IndexError, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)|(?Py)', '\g', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +try: + re.sub('(?Px)|(?Py)', '\\2', 'xx') +except re.error, reason: + pass +else: + raise TestFailed, "symbolic reference" + +if verbose: + print 'Running tests on re.subn' + +try: + verify(re.subn("(?i)b+", "x", "bbbb BBBB") == ('x x', 2)) + verify(re.subn("b+", "x", "bbbb BBBB") == ('x BBBB', 1)) + verify(re.subn("b+", "x", "xyz") == ('xyz', 0)) + verify(re.subn("b*", "x", "xyz") == ('xxxyxzx', 4)) + verify(re.subn("b*", "x", "xyz", 2) == ('xxxyz', 2)) +except AssertionError: + raise TestFailed, "re.subn" + +if verbose: + print 'Running tests on re.split' + +try: + verify(re.split(":", ":a:b::c") == ['', 'a', 'b', '', 'c']) + verify(re.split(":*", ":a:b::c") == ['', 'a', 'b', 'c']) + verify(re.split("(:*)", ":a:b::c") == ['', ':', 'a', ':', 'b', '::', 'c']) + verify(re.split("(?::*)", ":a:b::c") == ['', 'a', 'b', 'c']) + verify(re.split("(:)*", ":a:b::c") == ['', ':', 'a', ':', 'b', ':', 'c']) + verify(re.split("([b:]+)", ":a:b::c") == ['', ':', 'a', ':b::', 'c']) + verify(re.split("(b)|(:+)", ":a:b::c") == \ + ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c'] ) + verify(re.split("(?:b)|(?::+)", ":a:b::c") == ['', 'a', '', '', 'c']) +except AssertionError: + raise TestFailed, "re.split" + +try: + verify(re.split(":", ":a:b::c", 2) == ['', 'a', 'b::c']) + verify(re.split(':', 'a:b:c:d', 2) == ['a', 'b', 'c:d']) + + verify(re.split("(:)", ":a:b::c", 2) == ['', ':', 'a', ':', 'b::c']) + verify(re.split("(:*)", ":a:b::c", 2) == ['', ':', 'a', ':', 'b::c']) +except AssertionError: + raise TestFailed, "qualified re.split" + +if verbose: + print "Running tests on re.findall" + +try: + verify(re.findall(":+", "abc") == []) + verify(re.findall(":+", "a:b::c:::d") == [":", "::", ":::"]) + verify(re.findall("(:+)", "a:b::c:::d") == [":", "::", ":::"]) + verify(re.findall("(:)(:*)", "a:b::c:::d") == [(":", ""), + (":", ":"), + (":", "::")] ) +except AssertionError: + raise TestFailed, "re.findall" + +if verbose: + print "Running tests on re.match" + +try: + # No groups at all + m = re.match('a', 'a') ; verify(m.groups() == ()) + # A single group + m = re.match('(a)', 'a') ; verify(m.groups() == ('a',)) + + pat = re.compile('((a)|(b))(c)?') + verify(pat.match('a').groups() == ('a', 'a', None, None)) + verify(pat.match('b').groups() == ('b', None, 'b', None)) + verify(pat.match('ac').groups() == ('a', 'a', None, 'c')) + verify(pat.match('bc').groups() == ('b', None, 'b', 'c')) + verify(pat.match('bc').groups("") == ('b', "", 'b', 'c')) +except AssertionError: + raise TestFailed, "match .groups() method" + +try: + # A single group + m = re.match('(a)', 'a') + verify(m.group(0) == 'a') + verify(m.group(0) == 'a') + verify(m.group(1) == 'a') + verify(m.group(1, 1) == ('a', 'a')) + + pat = re.compile('(?:(?Pa)|(?Pb))(?Pc)?') + verify(pat.match('a').group(1, 2, 3) == ('a', None, None)) + verify(pat.match('b').group('a1', 'b2', 'c3') == (None, 'b', None)) + verify(pat.match('ac').group(1, 'b2', 3) == ('a', None, 'c')) +except AssertionError: + raise TestFailed, "match .group() method" + +if verbose: + print "Running tests on re.escape" + +try: + p="" + for i in range(0, 256): + p = p + chr(i) + verify(re.match(re.escape(chr(i)), chr(i)) is not None) + verify(re.match(re.escape(chr(i)), chr(i)).span() == (0,1)) + + pat=re.compile( re.escape(p) ) + verify(pat.match(p) is not None) + verify(pat.match(p).span() == (0,256)) +except AssertionError: + raise TestFailed, "re.escape" + + +if verbose: + print 'Pickling a RegexObject instance' + +import pickle +pat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)') +s = pickle.dumps(pat) +pat = pickle.loads(s) + +try: + verify(re.I == re.IGNORECASE) + verify(re.L == re.LOCALE) + verify(re.M == re.MULTILINE) + verify(re.S == re.DOTALL) + verify(re.X == re.VERBOSE) +except AssertionError: + raise TestFailed, 're module constants' + +for flags in [re.I, re.M, re.X, re.S, re.L]: + try: + r = re.compile('^pattern$', flags) + except: + print 'Exception raised on flag', flags + +if verbose: + print 'Test engine limitations' + +# Try nasty case that overflows the straightforward recursive +# implementation of repeated groups. +try: + verify(re.match('(x)*', 50000*'x').span() == (0, 50000)) +except RuntimeError, v: + print v + +from re_tests import * + +if verbose: + print 'Running re_tests test suite' +else: + # To save time, only run the first and last 10 tests + #tests = tests[:10] + tests[-10:] + pass + +for t in tests: + sys.stdout.flush() + pattern = s = outcome = repl = expected = None + if len(t) == 5: + pattern, s, outcome, repl, expected = t + elif len(t) == 3: + pattern, s, outcome = t + else: + raise ValueError, ('Test tuples should have 3 or 5 fields', t) + + try: + obj = re.compile(pattern) + except re.error: + if outcome == SYNTAX_ERROR: pass # Expected a syntax error + else: + print '=== Syntax error:', t + except KeyboardInterrupt: raise KeyboardInterrupt + except: + print '*** Unexpected error ***', t + if verbose: + traceback.print_exc(file=sys.stdout) + else: + try: + result = obj.search(s) + except re.error, msg: + print '=== Unexpected exception', t, repr(msg) + if outcome == SYNTAX_ERROR: + # This should have been a syntax error; forget it. + pass + elif outcome == FAIL: + if result is None: pass # No match, as expected + else: print '=== Succeeded incorrectly', t + elif outcome == SUCCEED: + if result is not None: + # Matched, as expected, so now we compute the + # result string and compare it to our expected result. + start, end = result.span(0) + vardict={'found': result.group(0), + 'groups': result.group(), + 'flags': result.re.flags} + for i in range(1, 100): + try: + gi = result.group(i) + # Special hack because else the string concat fails: + if gi is None: + gi = "None" + except IndexError: + gi = "Error" + vardict['g%d' % i] = gi + for i in result.re.groupindex.keys(): + try: + gi = result.group(i) + if gi is None: + gi = "None" + except IndexError: + gi = "Error" + vardict[i] = gi + repl = eval(repl, vardict) + if repl != expected: + print '=== grouping error', t, + print repr(repl) + ' should be ' + repr(expected) + else: + print '=== Failed incorrectly', t + + # Try the match on a unicode string, and check that it + # still succeeds. + try: + result = obj.search(unicode(s, "latin-1")) + if result is None: + print '=== Fails on unicode match', t + except NameError: + continue # 1.5.2 + except TypeError: + continue # unicode test case + + # Try the match on a unicode pattern, and check that it + # still succeeds. + obj=re.compile(unicode(pattern, "latin-1")) + result = obj.search(s) + if result is None: + print '=== Fails on unicode pattern match', t + + # Try the match with the search area limited to the extent + # of the match and see if it still succeeds. \B will + # break (because it won't match at the end or start of a + # string), so we'll ignore patterns that feature it. + + if pattern[:2] != '\\B' and pattern[-2:] != '\\B' \ + and result is not None: + obj = re.compile(pattern) + result = obj.search(s, result.start(0), result.end(0) + 1) + if result is None: + print '=== Failed on range-limited match', t + + # Try the match with IGNORECASE enabled, and check that it + # still succeeds. + obj = re.compile(pattern, re.IGNORECASE) + result = obj.search(s) + if result is None: + print '=== Fails on case-insensitive match', t + + # Try the match with LOCALE enabled, and check that it + # still succeeds. + obj = re.compile(pattern, re.LOCALE) + result = obj.search(s) + if result is None: + print '=== Fails on locale-sensitive match', t + + # Try the match with UNICODE locale enabled, and check + # that it still succeeds. + obj = re.compile(pattern, re.UNICODE) + result = obj.search(s) + if result is None: + print '=== Fails on unicode-sensitive match', t diff --git a/lib-python/2.2/test/test_regex.py b/lib-python/2.2/test/test_regex.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_regex.py @@ -0,0 +1,113 @@ +from test_support import verbose, sortdict +import warnings +warnings.filterwarnings("ignore", "the regex module is deprecated", + DeprecationWarning, __name__) +import regex +from regex_syntax import * + +re = 'a+b+c+' +print 'no match:', regex.match(re, 'hello aaaabcccc world') +print 'successful search:', regex.search(re, 'hello aaaabcccc world') +try: + cre = regex.compile('\(' + re) +except regex.error: + print 'caught expected exception' +else: + print 'expected regex.error not raised' + +print 'failed awk syntax:', regex.search('(a+)|(b+)', 'cdb') +prev = regex.set_syntax(RE_SYNTAX_AWK) +print 'successful awk syntax:', regex.search('(a+)|(b+)', 'cdb') +regex.set_syntax(prev) +print 'failed awk syntax:', regex.search('(a+)|(b+)', 'cdb') + +re = '\([0-9]+\) *\([0-9]+\)' +print 'matching with group names and compile()' +cre = regex.compile(re) +print cre.match('801 999') +try: + print cre.group('one') +except regex.error: + print 'caught expected exception' +else: + print 'expected regex.error not raised' + +print 'matching with group names and symcomp()' +cre = regex.symcomp(re) +print cre.match('801 999') +print cre.group(0) +print cre.group('one') +print cre.group(1, 2) +print cre.group('one', 'two') +print 'realpat:', cre.realpat +print 'groupindex:', sortdict(cre.groupindex) + +re = 'world' +cre = regex.compile(re) +print 'not case folded search:', cre.search('HELLO WORLD') +cre = regex.compile(re, regex.casefold) +print 'case folded search:', cre.search('HELLO WORLD') + +print '__members__:', cre.__members__ +print 'regs:', cre.regs +print 'last:', cre.last +print 'translate:', len(cre.translate) +print 'givenpat:', cre.givenpat + +print 'match with pos:', cre.match('hello world', 7) +print 'search with pos:', cre.search('hello world there world', 7) +print 'bogus group:', cre.group(0, 1, 3) +try: + print 'no name:', cre.group('one') +except regex.error: + print 'caught expected exception' +else: + print 'expected regex.error not raised' + +from regex_tests import * +if verbose: print 'Running regex_tests test suite' + +for t in tests: + pattern=s=outcome=repl=expected=None + if len(t)==5: + pattern, s, outcome, repl, expected = t + elif len(t)==3: + pattern, s, outcome = t + else: + raise ValueError, ('Test tuples should have 3 or 5 fields',t) + + try: + obj=regex.compile(pattern) + except regex.error: + if outcome==SYNTAX_ERROR: pass # Expected a syntax error + else: + # Regex syntax errors aren't yet reported, so for + # the official test suite they'll be quietly ignored. + pass + #print '=== Syntax error:', t + else: + try: + result=obj.search(s) + except regex.error, msg: + print '=== Unexpected exception', t, repr(msg) + if outcome==SYNTAX_ERROR: + # This should have been a syntax error; forget it. + pass + elif outcome==FAIL: + if result==-1: pass # No match, as expected + else: print '=== Succeeded incorrectly', t + elif outcome==SUCCEED: + if result!=-1: + # Matched, as expected, so now we compute the + # result string and compare it to our expected result. + start, end = obj.regs[0] + found=s[start:end] + groups=obj.group(1,2,3,4,5,6,7,8,9,10) + vardict=vars() + for i in range(len(groups)): + vardict['g'+str(i+1)]=str(groups[i]) + repl=eval(repl) + if repl!=expected: + print '=== grouping error', t, repr(repl)+' should be '+repr(expected) + else: + print '=== Failed incorrectly', t diff --git a/lib-python/2.2/test/test_repr.py b/lib-python/2.2/test/test_repr.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_repr.py @@ -0,0 +1,275 @@ +""" + Test cases for the repr module + Nick Mathewson +""" + +import sys +import os +import unittest + +from test_support import run_unittest +from repr import repr as r # Don't shadow builtin repr + + +def nestedTuple(nesting): + t = () + for i in range(nesting): + t = (t,) + return t + +class ReprTests(unittest.TestCase): + + def test_string(self): + eq = self.assertEquals + eq(r("abc"), "'abc'") + eq(r("abcdefghijklmnop"),"'abcdefghijklmnop'") + + s = "a"*30+"b"*30 + expected = `s`[:13] + "..." + `s`[-14:] + eq(r(s), expected) + + eq(r("\"'"), repr("\"'")) + s = "\""*30+"'"*100 + expected = `s`[:13] + "..." + `s`[-14:] + eq(r(s), expected) + + def test_container(self): + eq = self.assertEquals + # Tuples give up after 6 elements + eq(r(()), "()") + eq(r((1,)), "(1,)") + eq(r((1, 2, 3)), "(1, 2, 3)") + eq(r((1, 2, 3, 4, 5, 6)), "(1, 2, 3, 4, 5, 6)") + eq(r((1, 2, 3, 4, 5, 6, 7)), "(1, 2, 3, 4, 5, 6, ...)") + + # Lists give up after 6 as well + eq(r([]), "[]") + eq(r([1]), "[1]") + eq(r([1, 2, 3]), "[1, 2, 3]") + eq(r([1, 2, 3, 4, 5, 6]), "[1, 2, 3, 4, 5, 6]") + eq(r([1, 2, 3, 4, 5, 6, 7]), "[1, 2, 3, 4, 5, 6, ...]") + + # Dictionaries give up after 4. + eq(r({}), "{}") + d = {'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4} + eq(r(d), "{'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}") + d['arthur'] = 1 + eq(r(d), "{'alice': 1, 'arthur': 1, 'bob': 2, 'charles': 3, ...}") + + def test_numbers(self): + eq = self.assertEquals + eq(r(123), repr(123)) + eq(r(123L), repr(123L)) + eq(r(1.0/3), repr(1.0/3)) + + n = 10L**100 + expected = `n`[:18] + "..." + `n`[-19:] + eq(r(n), expected) + + def test_instance(self): + eq = self.assertEquals + i1 = ClassWithRepr("a") + eq(r(i1), repr(i1)) + + i2 = ClassWithRepr("x"*1000) + expected = `i2`[:13] + "..." + `i2`[-14:] + eq(r(i2), expected) + + i3 = ClassWithFailingRepr() + eq(r(i3), (""%id(i3))) + + s = r(ClassWithFailingRepr) + self.failUnless(s.startswith("")) + self.failUnless(s.find("...") == 8) + + def test_file(self): + fp = open(unittest.__file__) + self.failUnless(repr(fp).startswith( + "') + # Methods + self.failUnless(repr(''.split).startswith( + '") + # XXX member descriptors + # XXX attribute descriptors + # XXX slot descriptors + # static and class methods + class C: + def foo(cls): pass + x = staticmethod(C.foo) + self.failUnless(repr(x).startswith('" % areallylongpackageandmodulenametotestreprtruncation.__file__) + + def test_type(self): + eq = self.assertEquals + touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\ +class foo(object): + pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo + eq(repr(foo.foo), + "") + + def test_object(self): + # XXX Test the repr of a type with a really long tp_name but with no + # tp_repr. WIBNI we had ::Inline? :) + pass + + def test_class(self): + touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\ +class bar: + pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar + self.failUnless(repr(bar.bar).startswith( + "') + # Bound method next + iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + self.failUnless(repr(iqux.amethod).startswith( + '\n\ntest\n') + self.assert_(msg.get("to") == '"last, first" ') + self.assert_(msg.get("TO") == '"last, first" ') + self.assert_(msg.get("No-Such-Header") is None) + self.assert_(msg.get("No-Such-Header", "No-Such-Value") + == "No-Such-Value") + + def test_setdefault(self): + msg = self.create_message( + 'To: "last, first" \n\ntest\n') + self.assert_(not msg.has_key("New-Header")) + self.assert_(msg.setdefault("New-Header", "New-Value") == "New-Value") + self.assert_(msg.setdefault("New-Header", "Different-Value") + == "New-Value") + self.assert_(msg["new-header"] == "New-Value") + + self.assert_(msg.setdefault("Another-Header") == "") + self.assert_(msg["another-header"] == "") + + def check(self, msg, results): + """Check addresses and the date.""" + m = self.create_message(msg) + i = 0 + for n, a in m.getaddrlist('to') + m.getaddrlist('cc'): + try: + mn, ma = results[i][0], results[i][1] + except IndexError: + print 'extra parsed address:', repr(n), repr(a) + continue + i = i + 1 + if mn == n and ma == a: + pass + else: + print 'not found:', repr(n), repr(a) + + out = m.getdate('date') + if out: + self.assertEqual(out, + (1999, 1, 13, 23, 57, 35, 0, 0, 0), + "date conversion failed") + + + # Note: all test cases must have the same date (in various formats), + # or no date! + + def test_basic(self): + self.check( + 'Date: Wed, 13 Jan 1999 23:57:35 -0500\n' + 'From: Guido van Rossum \n' + 'To: "Guido van\n' + '\t : Rossum" \n' + 'Subject: test2\n' + '\n' + 'test2\n', + [('Guido van\n\t : Rossum', 'guido at python.org')]) + + self.check( + 'From: Barry \n' + 'Date: 13-Jan-1999 23:57:35 EST\n' + '\n' + 'test', + [('Guido: the Barbarian', 'guido at python.org'), + ('Guido: the Madman', 'guido at python.org') + ]) + + self.check( + 'To: "The monster with\n' + ' the very long name: Guido" \n' + 'Date: Wed, 13 Jan 1999 23:57:35 -0500\n' + '\n' + 'test', + [('The monster with\n the very long name: Guido', + 'guido at python.org')]) + + self.check( + 'To: "Amit J. Patel" \n' + 'CC: Mike Fletcher ,\n' + ' "\'string-sig at python.org\'" \n' + 'Cc: fooz at bat.com, bart at toof.com\n' + 'Cc: goit at lip.com\n' + 'Date: Wed, 13 Jan 1999 23:57:35 -0500\n' + '\n' + 'test', + [('Amit J. Patel', 'amitp at Theory.Stanford.EDU'), + ('Mike Fletcher', 'mfletch at vrtelecom.com'), + ("'string-sig at python.org'", 'string-sig at python.org'), + ('', 'fooz at bat.com'), + ('', 'bart at toof.com'), + ('', 'goit at lip.com'), + ]) + + self.check( + 'To: Some One \n' + 'From: Anudder Persin \n' + 'Date:\n' + '\n' + 'test', + [('Some One', 'someone at dom.ain')]) + + self.check( + 'To: person at dom.ain (User J. Person)\n\n', + [('User J. Person', 'person at dom.ain')]) + + def test_twisted(self): + # This one is just twisted. I don't know what the proper + # result should be, but it shouldn't be to infloop, which is + # what used to happen! + self.check( + 'To: <[smtp:dd47 at mail.xxx.edu]_at_hmhq at hdq-mdm1-imgout.companay.com>\n' + 'Date: Wed, 13 Jan 1999 23:57:35 -0500\n' + '\n' + 'test', + [('', ''), + ('', 'dd47 at mail.xxx.edu'), + ('', '_at_hmhq at hdq-mdm1-imgout.companay.com'), + ]) + + def test_commas_in_full_name(self): + # This exercises the old commas-in-a-full-name bug, which + # should be doing the right thing in recent versions of the + # module. + self.check( + 'To: "last, first" \n' + '\n' + 'test', + [('last, first', 'userid at foo.net')]) + + def test_quoted_name(self): + self.check( + 'To: (Comment stuff) "Quoted name"@somewhere.com\n' + '\n' + 'test', + [('Comment stuff', '"Quoted name"@somewhere.com')]) + + def test_bogus_to_header(self): + self.check( + 'To: :\n' + 'Cc: goit at lip.com\n' + 'Date: Wed, 13 Jan 1999 23:57:35 -0500\n' + '\n' + 'test', + [('', 'goit at lip.com')]) + + def test_addr_ipquad(self): + self.check( + 'To: guido@[132.151.1.21]\n' + '\n' + 'foo', + [('', 'guido@[132.151.1.21]')]) + + def test_rfc2822_phrases(self): + # RFC 2822 (the update to RFC 822) specifies that dots in phrases are + # obsolete syntax, which conforming programs MUST recognize but NEVER + # generate (see $4.1 Miscellaneous obsolete tokens). This is a + # departure from RFC 822 which did not allow dots in non-quoted + # phrases. + self.check('To: User J. Person \n\n', + [('User J. Person', 'person at dom.ain')]) + + # This takes to long to add to the test suite +## def test_an_excrutiatingly_long_address_field(self): +## OBSCENELY_LONG_HEADER_MULTIPLIER = 10000 +## oneaddr = ('Person' * 10) + '@' + ('.'.join(['dom']*10)) + '.com' +## addr = ', '.join([oneaddr] * OBSCENELY_LONG_HEADER_MULTIPLIER) +## lst = rfc822.AddrlistClass(addr).getaddrlist() +## self.assertEqual(len(lst), OBSCENELY_LONG_HEADER_MULTIPLIER) + + + def test_parseaddr(self): + eq = self.assertEqual + eq(rfc822.parseaddr('<>'), ('', '')) + eq(rfc822.parseaddr('aperson at dom.ain'), ('', 'aperson at dom.ain')) + eq(rfc822.parseaddr('bperson at dom.ain (Bea A. Person)'), + ('Bea A. Person', 'bperson at dom.ain')) + eq(rfc822.parseaddr('Cynthia Person '), + ('Cynthia Person', 'cperson at dom.ain')) + +def test_main(): + test_support.run_unittest(MessageTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_rgbimg.py b/lib-python/2.2/test/test_rgbimg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_rgbimg.py @@ -0,0 +1,63 @@ +# Testing rgbimg module + +import rgbimg, os, uu + +from test_support import verbose, unlink, findfile + +class error(Exception): + pass + +print 'RGBimg test suite:' + +def testimg(rgb_file, raw_file): + rgb_file = findfile(rgb_file) + raw_file = findfile(raw_file) + width, height = rgbimg.sizeofimage(rgb_file) + rgb = rgbimg.longimagedata(rgb_file) + if len(rgb) != width * height * 4: + raise error, 'bad image length' + raw = open(raw_file, 'rb').read() + if rgb != raw: + raise error, \ + 'images don\'t match for '+rgb_file+' and '+raw_file + for depth in [1, 3, 4]: + rgbimg.longstoimage(rgb, width, height, depth, '@.rgb') + os.unlink('@.rgb') + +table = [ + ('testrgb'+os.extsep+'uue', 'test'+os.extsep+'rgb'), + ('testimg'+os.extsep+'uue', 'test'+os.extsep+'rawimg'), + ('testimgr'+os.extsep+'uue', 'test'+os.extsep+'rawimg'+os.extsep+'rev'), + ] +for source, target in table: + source = findfile(source) + target = findfile(target) + if verbose: + print "uudecoding", source, "->", target, "..." + uu.decode(source, target) + +if verbose: + print "testing..." + +ttob = rgbimg.ttob(0) +if ttob != 0: + raise error, 'ttob should start out as zero' + +testimg('test'+os.extsep+'rgb', 'test'+os.extsep+'rawimg') + +ttob = rgbimg.ttob(1) +if ttob != 0: + raise error, 'ttob should be zero' + +testimg('test'+os.extsep+'rgb', 'test'+os.extsep+'rawimg'+os.extsep+'rev') + +ttob = rgbimg.ttob(0) +if ttob != 1: + raise error, 'ttob should be one' + +ttob = rgbimg.ttob(0) +if ttob != 0: + raise error, 'ttob should be zero' + +for source, target in table: + unlink(findfile(target)) diff --git a/lib-python/2.2/test/test_richcmp.py b/lib-python/2.2/test/test_richcmp.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_richcmp.py @@ -0,0 +1,261 @@ +# Tests for rich comparisons + +from test_support import TestFailed, verify, verbose + +class Number: + + def __init__(self, x): + self.x = x + + def __lt__(self, other): + return self.x < other + + def __le__(self, other): + return self.x <= other + + def __eq__(self, other): + return self.x == other + + def __ne__(self, other): + return self.x != other + + def __gt__(self, other): + return self.x > other + + def __ge__(self, other): + return self.x >= other + + def __cmp__(self, other): + raise TestFailed, "Number.__cmp__() should not be called" + + def __repr__(self): + return "Number(%s)" % repr(self.x) + +class Vector: + + def __init__(self, data): + self.data = data + + def __len__(self): + return len(self.data) + + def __getitem__(self, i): + return self.data[i] + + def __setitem__(self, i, v): + self.data[i] = v + + def __hash__(self): + raise TypeError, "Vectors cannot be hashed" + + def __nonzero__(self): + raise TypeError, "Vectors cannot be used in Boolean contexts" + + def __cmp__(self, other): + raise TestFailed, "Vector.__cmp__() should not be called" + + def __repr__(self): + return "Vector(%s)" % repr(self.data) + + def __lt__(self, other): + return Vector([a < b for a, b in zip(self.data, self.__cast(other))]) + + def __le__(self, other): + return Vector([a <= b for a, b in zip(self.data, self.__cast(other))]) + + def __eq__(self, other): + return Vector([a == b for a, b in zip(self.data, self.__cast(other))]) + + def __ne__(self, other): + return Vector([a != b for a, b in zip(self.data, self.__cast(other))]) + + def __gt__(self, other): + return Vector([a > b for a, b in zip(self.data, self.__cast(other))]) + + def __ge__(self, other): + return Vector([a >= b for a, b in zip(self.data, self.__cast(other))]) + + def __cast(self, other): + if isinstance(other, Vector): + other = other.data + if len(self.data) != len(other): + raise ValueError, "Cannot compare vectors of different length" + return other + +operators = "<", "<=", "==", "!=", ">", ">=" +opmap = {} +for op in operators: + opmap[op] = eval("lambda a, b: a %s b" % op) + +def testvector(): + a = Vector(range(2)) + b = Vector(range(3)) + for op in operators: + try: + opmap[op](a, b) + except ValueError: + pass + else: + raise TestFailed, "a %s b for different length should fail" % op + a = Vector(range(5)) + b = Vector(5 * [2]) + for op in operators: + print "%23s %-2s %-23s -> %s" % (a, op, b, opmap[op](a, b)) + print "%23s %-2s %-23s -> %s" % (a, op, b.data, opmap[op](a, b.data)) + print "%23s %-2s %-23s -> %s" % (a.data, op, b, opmap[op](a.data, b)) + try: + if opmap[op](a, b): + raise TestFailed, "a %s b shouldn't be true" % op + else: + raise TestFailed, "a %s b shouldn't be false" % op + except TypeError: + pass + +def testop(a, b, op): + try: + ax = a.x + except AttributeError: + ax = a + try: + bx = b.x + except AttributeError: + bx = b + opfunc = opmap[op] + realoutcome = opfunc(ax, bx) + testoutcome = opfunc(a, b) + if realoutcome != testoutcome: + print "Error for", a, op, b, ": expected", realoutcome, + print "but got", testoutcome +## else: +## print a, op, b, "-->", testoutcome # and "true" or "false" + +def testit(a, b): + testop(a, b, "<") + testop(a, b, "<=") + testop(a, b, "==") + testop(a, b, "!=") + testop(a, b, ">") + testop(a, b, ">=") + +def basic(): + for a in range(3): + for b in range(3): + testit(Number(a), Number(b)) + testit(a, Number(b)) + testit(Number(a), b) + +def tabulate(c1=Number, c2=Number): + for op in operators: + opfunc = opmap[op] + print + print "operator:", op + print + print "%9s" % "", + for b in range(3): + b = c2(b) + print "| %9s" % b, + print "|" + print '----------+-' * 4 + for a in range(3): + a = c1(a) + print "%9s" % a, + for b in range(3): + b = c2(b) + print "| %9s" % opfunc(a, b), + print "|" + print '----------+-' * 4 + print + print '*' * 50 + +def misbehavin(): + class Misb: + def __lt__(self, other): return 0 + def __gt__(self, other): return 0 + def __eq__(self, other): return 0 + def __le__(self, other): raise TestFailed, "This shouldn't happen" + def __ge__(self, other): raise TestFailed, "This shouldn't happen" + def __ne__(self, other): raise TestFailed, "This shouldn't happen" + def __cmp__(self, other): raise RuntimeError, "expected" + a = Misb() + b = Misb() + verify((ab) == 0) + try: + print cmp(a, b) + except RuntimeError: + pass + else: + raise TestFailed, "cmp(Misb(), Misb()) didn't raise RuntimeError" + +def recursion(): + from UserList import UserList + a = UserList(); a.append(a) + b = UserList(); b.append(b) + def check(s, a=a, b=b): + if verbose: + print "check", s + try: + if not eval(s): + raise TestFailed, s + " was false but expected to be true" + except RuntimeError, msg: + raise TestFailed, str(msg) + if verbose: + print "recursion tests: a=%s, b=%s" % (a, b) + check('a==b') + check('not a!=b') + a.append(1) + if verbose: + print "recursion tests: a=%s, b=%s" % (a, b) + check('a!=b') + check('not a==b') + b.append(0) + if verbose: + print "recursion tests: a=%s, b=%s" % (a, b) + check('a!=b') + check('not a==b') + a[1] = -1 + if verbose: + print "recursion tests: a=%s, b=%s" % (a, b) + check('a!=b') + check('not a==b') + if verbose: print "recursion tests ok" + +def dicts(): + # Verify that __eq__ and __ne__ work for dicts even if the keys and + # values don't support anything other than __eq__ and __ne__. Complex + # numbers are a fine example of that. + import random + imag1a = {} + for i in range(50): + imag1a[random.randrange(100)*1j] = random.randrange(100)*1j + items = imag1a.items() + random.shuffle(items) + imag1b = {} + for k, v in items: + imag1b[k] = v + imag2 = imag1b.copy() + imag2[k] = v + 1.0 + verify(imag1a == imag1a, "imag1a == imag1a should have worked") + verify(imag1a == imag1b, "imag1a == imag1b should have worked") + verify(imag2 == imag2, "imag2 == imag2 should have worked") + verify(imag1a != imag2, "imag1a != imag2 should have worked") + for op in "<", "<=", ">", ">=": + try: + eval("imag1a %s imag2" % op) + except TypeError: + pass + else: + raise TestFailed("expected TypeError from imag1a %s imag2" % op) + +def main(): + basic() + tabulate() + tabulate(c1=int) + tabulate(c2=int) + testvector() + misbehavin() + recursion() + dicts() + +main() diff --git a/lib-python/2.2/test/test_rotor.py b/lib-python/2.2/test/test_rotor.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_rotor.py @@ -0,0 +1,28 @@ +import rotor + +r = rotor.newrotor("you'll never guess this") +r = rotor.newrotor("you'll never guess this", 12) + +A = 'spam and eggs' +B = 'cheese shop' + +a = r.encrypt(A) +print `a` +b = r.encryptmore(B) +print `b` + +A1 = r.decrypt(a) +print A1 +if A1 != A: + print 'decrypt failed' + +B1 = r.decryptmore(b) +print B1 +if B1 != B: + print 'decryptmore failed' + +try: + r.setkey() +except TypeError: + pass +r.setkey('you guessed it!') diff --git a/lib-python/2.2/test/test_sax.py b/lib-python/2.2/test/test_sax.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_sax.py @@ -0,0 +1,707 @@ +# regression test for SAX 2.0 +# $Id$ + +from xml.sax import make_parser, ContentHandler, \ + SAXException, SAXReaderNotAvailable, SAXParseException +try: + make_parser() +except SAXReaderNotAvailable: + # don't try to test this module if we cannot create a parser + raise ImportError("no XML parsers available") +from xml.sax.saxutils import XMLGenerator, escape, quoteattr, XMLFilterBase +from xml.sax.expatreader import create_parser +from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl +from cStringIO import StringIO +from test_support import verify, verbose, TestFailed, findfile +import os + +# ===== Utilities + +tests = 0 +fails = 0 + +def confirm(outcome, name): + global tests, fails + + tests = tests + 1 + if outcome: + print "Passed", name + else: + print "Failed", name + fails = fails + 1 + +def test_make_parser2(): + try: + # Creating parsers several times in a row should succeed. + # Testing this because there have been failures of this kind + # before. + from xml.sax import make_parser + p = make_parser() + from xml.sax import make_parser + p = make_parser() + from xml.sax import make_parser + p = make_parser() + from xml.sax import make_parser + p = make_parser() + from xml.sax import make_parser + p = make_parser() + from xml.sax import make_parser + p = make_parser() + except: + return 0 + else: + return p + + +# =========================================================================== +# +# saxutils tests +# +# =========================================================================== + +# ===== escape + +def test_escape_basic(): + return escape("Donald Duck & Co") == "Donald Duck & Co" + +def test_escape_all(): + return escape("") == "<Donald Duck & Co>" + +def test_escape_extra(): + return escape("Hei p? deg", {"?" : "å"}) == "Hei på deg" + +# ===== quoteattr + +def test_quoteattr_basic(): + return quoteattr("Donald Duck & Co") == '"Donald Duck & Co"' + +def test_single_quoteattr(): + return (quoteattr('Includes "double" quotes') + == '\'Includes "double" quotes\'') + +def test_double_quoteattr(): + return (quoteattr("Includes 'single' quotes") + == "\"Includes 'single' quotes\"") + +def test_single_double_quoteattr(): + return (quoteattr("Includes 'single' and \"double\" quotes") + == "\"Includes 'single' and "double" quotes\"") + +# ===== make_parser + +def test_make_parser(): + try: + # Creating a parser should succeed - it should fall back + # to the expatreader + p = make_parser(['xml.parsers.no_such_parser']) + except: + return 0 + else: + return p + + +# ===== XMLGenerator + +start = '\n' + +def test_xmlgen_basic(): + result = StringIO() + gen = XMLGenerator(result) + gen.startDocument() + gen.startElement("doc", {}) + gen.endElement("doc") + gen.endDocument() + + return result.getvalue() == start + "" + +def test_xmlgen_content(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startElement("doc", {}) + gen.characters("huhei") + gen.endElement("doc") + gen.endDocument() + + return result.getvalue() == start + "huhei" + +def test_xmlgen_pi(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.processingInstruction("test", "data") + gen.startElement("doc", {}) + gen.endElement("doc") + gen.endDocument() + + return result.getvalue() == start + "" + +def test_xmlgen_content_escape(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startElement("doc", {}) + gen.characters("<huhei&" + +def test_xmlgen_attr_escape(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startElement("doc", {"a": '"'}) + gen.startElement("e", {"a": "'"}) + gen.endElement("e") + gen.startElement("e", {"a": "'\""}) + gen.endElement("e") + gen.endElement("doc") + gen.endDocument() + + return result.getvalue() == start \ + + "" + +def test_xmlgen_ignorable(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startElement("doc", {}) + gen.ignorableWhitespace(" ") + gen.endElement("doc") + gen.endDocument() + + return result.getvalue() == start + " " + +ns_uri = "http://www.python.org/xml-ns/saxtest/" + +def test_xmlgen_ns(): + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startPrefixMapping("ns1", ns_uri) + gen.startElementNS((ns_uri, "doc"), "ns1:doc", {}) + # add an unqualified name + gen.startElementNS((None, "udoc"), None, {}) + gen.endElementNS((None, "udoc"), None) + gen.endElementNS((ns_uri, "doc"), "ns1:doc") + gen.endPrefixMapping("ns1") + gen.endDocument() + + return result.getvalue() == start + \ + ('' % + ns_uri) + +# ===== XMLFilterBase + +def test_filter_basic(): + result = StringIO() + gen = XMLGenerator(result) + filter = XMLFilterBase() + filter.setContentHandler(gen) + + filter.startDocument() + filter.startElement("doc", {}) + filter.characters("content") + filter.ignorableWhitespace(" ") + filter.endElement("doc") + filter.endDocument() + + return result.getvalue() == start + "content " + +# =========================================================================== +# +# expatreader tests +# +# =========================================================================== + +# ===== XMLReader support + +def test_expat_file(): + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(open(findfile("test"+os.extsep+"xml"))) + + return result.getvalue() == xml_test_out + +# ===== DTDHandler support + +class TestDTDHandler: + + def __init__(self): + self._notations = [] + self._entities = [] + + def notationDecl(self, name, publicId, systemId): + self._notations.append((name, publicId, systemId)) + + def unparsedEntityDecl(self, name, publicId, systemId, ndata): + self._entities.append((name, publicId, systemId, ndata)) + +def test_expat_dtdhandler(): + parser = create_parser() + handler = TestDTDHandler() + parser.setDTDHandler(handler) + + parser.feed('\n') + parser.feed(' \n') + parser.feed(']>\n') + parser.feed('') + parser.close() + + return handler._notations == [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)] and \ + handler._entities == [("img", None, "expat.gif", "GIF")] + +# ===== EntityResolver support + +class TestEntityResolver: + + def resolveEntity(self, publicId, systemId): + inpsrc = InputSource() + inpsrc.setByteStream(StringIO("")) + return inpsrc + +def test_expat_entityresolver(): + parser = create_parser() + parser.setEntityResolver(TestEntityResolver()) + result = StringIO() + parser.setContentHandler(XMLGenerator(result)) + + parser.feed('\n') + parser.feed(']>\n') + parser.feed('&test;') + parser.close() + + return result.getvalue() == start + "" + +# ===== Attributes support + +class AttrGatherer(ContentHandler): + + def startElement(self, name, attrs): + self._attrs = attrs + + def startElementNS(self, name, qname, attrs): + self._attrs = attrs + +def test_expat_attrs_empty(): + parser = create_parser() + gather = AttrGatherer() + parser.setContentHandler(gather) + + parser.feed("") + parser.close() + + return verify_empty_attrs(gather._attrs) + +def test_expat_attrs_wattr(): + parser = create_parser() + gather = AttrGatherer() + parser.setContentHandler(gather) + + parser.feed("") + parser.close() + + return verify_attrs_wattr(gather._attrs) + +def test_expat_nsattrs_empty(): + parser = create_parser(1) + gather = AttrGatherer() + parser.setContentHandler(gather) + + parser.feed("") + parser.close() + + return verify_empty_nsattrs(gather._attrs) + +def test_expat_nsattrs_wattr(): + parser = create_parser(1) + gather = AttrGatherer() + parser.setContentHandler(gather) + + parser.feed("" % ns_uri) + parser.close() + + attrs = gather._attrs + + return attrs.getLength() == 1 and \ + attrs.getNames() == [(ns_uri, "attr")] and \ + attrs.getQNames() == ["ns:attr"] and \ + len(attrs) == 1 and \ + attrs.has_key((ns_uri, "attr")) and \ + attrs.keys() == [(ns_uri, "attr")] and \ + attrs.get((ns_uri, "attr")) == "val" and \ + attrs.get((ns_uri, "attr"), 25) == "val" and \ + attrs.items() == [((ns_uri, "attr"), "val")] and \ + attrs.values() == ["val"] and \ + attrs.getValue((ns_uri, "attr")) == "val" and \ + attrs[(ns_uri, "attr")] == "val" + +class ElemGatherer(ContentHandler): + def __init__(self): + self.events = [] + def startElementNS(self, pair, qname, attrs): + self.events.append(('start', pair, qname)) + def endElementNS(self, pair, qname): + self.events.append(('end', pair, qname)) + +def check_expat_nsdecl(text, expected): + parser = create_parser(1) + handler = ElemGatherer() + parser.setContentHandler(handler) + parser.feed(text) + parser.close() + if verbose and handler.events != expected: + from pprint import pprint + print "Expected:" + pprint(expected) + print "Received:" + pprint(handler.events) + return handler.events == expected + +def test_expat_nsdecl_single(): + return check_expat_nsdecl( + "", [ + ("start", ("http://xml.python.org/", "abc"), "abc"), + ("end", ("http://xml.python.org/", "abc"), "abc"), + ]) + +def test_expat_nsdecl_pair_same(): + # XXX This shows where xml.sax.expatreader can use the wrong + # prefix when more than one is in scope for a particular URI. + # We still want to exercise this code since previous versions got + # the namespace handling wrong in more severe ways (exceptions + # that should not have happened). + return check_expat_nsdecl( + "" + "" + "" + "", [ + ("start", ("http://xml.python.org/", "abc"), "foo:abc"), + ("start", ("http://xml.python.org/", "def"), "foo:def"), + ("end", ("http://xml.python.org/", "def"), "foo:def"), + ("start", ("http://xml.python.org/", "ghi"), "foo:ghi"), + ("end", ("http://xml.python.org/", "ghi"), "foo:ghi"), + ("end", ("http://xml.python.org/", "abc"), "foo:abc"), + ]) + +def test_expat_nsdecl_pair_diff(): + return check_expat_nsdecl( + "" + "" + "" + "", [ + ("start", ("http://xml.python.org/1", "abc"), "abc"), + ("start", ("http://xml.python.org/2", "def"), "foo:def"), + ("end", ("http://xml.python.org/2", "def"), "foo:def"), + ("start", ("http://xml.python.org/1", "ghi"), "ghi"), + ("end", ("http://xml.python.org/1", "ghi"), "ghi"), + ("end", ("http://xml.python.org/1", "abc"), "abc"), + ]) + +# ===== InputSource support + +xml_test_out = open(findfile("test"+os.extsep+"xml"+os.extsep+"out")).read() + +def test_expat_inpsource_filename(): + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(findfile("test"+os.extsep+"xml")) + + return result.getvalue() == xml_test_out + +def test_expat_inpsource_sysid(): + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(InputSource(findfile("test"+os.extsep+"xml"))) + + return result.getvalue() == xml_test_out + +def test_expat_inpsource_stream(): + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + inpsrc = InputSource() + inpsrc.setByteStream(open(findfile("test"+os.extsep+"xml"))) + parser.parse(inpsrc) + + return result.getvalue() == xml_test_out + +# ===== IncrementalParser support + +def test_expat_incremental(): + result = StringIO() + xmlgen = XMLGenerator(result) + parser = create_parser() + parser.setContentHandler(xmlgen) + + parser.feed("") + parser.feed("") + parser.close() + + return result.getvalue() == start + "" + +def test_expat_incremental_reset(): + result = StringIO() + xmlgen = XMLGenerator(result) + parser = create_parser() + parser.setContentHandler(xmlgen) + + parser.feed("") + parser.feed("text") + + result = StringIO() + xmlgen = XMLGenerator(result) + parser.setContentHandler(xmlgen) + parser.reset() + + parser.feed("") + parser.feed("text") + parser.feed("") + parser.close() + + return result.getvalue() == start + "text" + +# ===== Locator support + +def test_expat_locator_noinfo(): + result = StringIO() + xmlgen = XMLGenerator(result) + parser = create_parser() + parser.setContentHandler(xmlgen) + + parser.feed("") + parser.feed("") + parser.close() + + return parser.getSystemId() is None and \ + parser.getPublicId() is None and \ + parser.getLineNumber() == 1 + +def test_expat_locator_withinfo(): + result = StringIO() + xmlgen = XMLGenerator(result) + parser = create_parser() + parser.setContentHandler(xmlgen) + parser.parse(findfile("test.xml")) + + return parser.getSystemId() == findfile("test.xml") and \ + parser.getPublicId() is None + + +# =========================================================================== +# +# error reporting +# +# =========================================================================== + +def test_expat_inpsource_location(): + parser = create_parser() + parser.setContentHandler(ContentHandler()) # do nothing + source = InputSource() + source.setByteStream(StringIO("")) #ill-formed + name = "a file name" + source.setSystemId(name) + try: + parser.parse(source) + except SAXException, e: + return e.getSystemId() == name + +def test_expat_incomplete(): + parser = create_parser() + parser.setContentHandler(ContentHandler()) # do nothing + try: + parser.parse(StringIO("")) + except SAXParseException: + return 1 # ok, error found + else: + return 0 + + +# =========================================================================== +# +# xmlreader tests +# +# =========================================================================== + +# ===== AttributesImpl + +def verify_empty_attrs(attrs): + try: + attrs.getValue("attr") + gvk = 0 + except KeyError: + gvk = 1 + + try: + attrs.getValueByQName("attr") + gvqk = 0 + except KeyError: + gvqk = 1 + + try: + attrs.getNameByQName("attr") + gnqk = 0 + except KeyError: + gnqk = 1 + + try: + attrs.getQNameByName("attr") + gqnk = 0 + except KeyError: + gqnk = 1 + + try: + attrs["attr"] + gik = 0 + except KeyError: + gik = 1 + + return attrs.getLength() == 0 and \ + attrs.getNames() == [] and \ + attrs.getQNames() == [] and \ + len(attrs) == 0 and \ + not attrs.has_key("attr") and \ + attrs.keys() == [] and \ + attrs.get("attrs") is None and \ + attrs.get("attrs", 25) == 25 and \ + attrs.items() == [] and \ + attrs.values() == [] and \ + gvk and gvqk and gnqk and gik and gqnk + +def verify_attrs_wattr(attrs): + return attrs.getLength() == 1 and \ + attrs.getNames() == ["attr"] and \ + attrs.getQNames() == ["attr"] and \ + len(attrs) == 1 and \ + attrs.has_key("attr") and \ + attrs.keys() == ["attr"] and \ + attrs.get("attr") == "val" and \ + attrs.get("attr", 25) == "val" and \ + attrs.items() == [("attr", "val")] and \ + attrs.values() == ["val"] and \ + attrs.getValue("attr") == "val" and \ + attrs.getValueByQName("attr") == "val" and \ + attrs.getNameByQName("attr") == "attr" and \ + attrs["attr"] == "val" and \ + attrs.getQNameByName("attr") == "attr" + +def test_attrs_empty(): + return verify_empty_attrs(AttributesImpl({})) + +def test_attrs_wattr(): + return verify_attrs_wattr(AttributesImpl({"attr" : "val"})) + +# ===== AttributesImpl + +def verify_empty_nsattrs(attrs): + try: + attrs.getValue((ns_uri, "attr")) + gvk = 0 + except KeyError: + gvk = 1 + + try: + attrs.getValueByQName("ns:attr") + gvqk = 0 + except KeyError: + gvqk = 1 + + try: + attrs.getNameByQName("ns:attr") + gnqk = 0 + except KeyError: + gnqk = 1 + + try: + attrs.getQNameByName((ns_uri, "attr")) + gqnk = 0 + except KeyError: + gqnk = 1 + + try: + attrs[(ns_uri, "attr")] + gik = 0 + except KeyError: + gik = 1 + + return attrs.getLength() == 0 and \ + attrs.getNames() == [] and \ + attrs.getQNames() == [] and \ + len(attrs) == 0 and \ + not attrs.has_key((ns_uri, "attr")) and \ + attrs.keys() == [] and \ + attrs.get((ns_uri, "attr")) is None and \ + attrs.get((ns_uri, "attr"), 25) == 25 and \ + attrs.items() == [] and \ + attrs.values() == [] and \ + gvk and gvqk and gnqk and gik and gqnk + +def test_nsattrs_empty(): + return verify_empty_nsattrs(AttributesNSImpl({}, {})) + +def test_nsattrs_wattr(): + attrs = AttributesNSImpl({(ns_uri, "attr") : "val"}, + {(ns_uri, "attr") : "ns:attr"}) + + return attrs.getLength() == 1 and \ + attrs.getNames() == [(ns_uri, "attr")] and \ + attrs.getQNames() == ["ns:attr"] and \ + len(attrs) == 1 and \ + attrs.has_key((ns_uri, "attr")) and \ + attrs.keys() == [(ns_uri, "attr")] and \ + attrs.get((ns_uri, "attr")) == "val" and \ + attrs.get((ns_uri, "attr"), 25) == "val" and \ + attrs.items() == [((ns_uri, "attr"), "val")] and \ + attrs.values() == ["val"] and \ + attrs.getValue((ns_uri, "attr")) == "val" and \ + attrs.getValueByQName("ns:attr") == "val" and \ + attrs.getNameByQName("ns:attr") == (ns_uri, "attr") and \ + attrs[(ns_uri, "attr")] == "val" and \ + attrs.getQNameByName((ns_uri, "attr")) == "ns:attr" + + +# ===== Main program + +def make_test_output(): + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(findfile("test"+os.extsep+"xml")) + + outf = open(findfile("test"+os.extsep+"xml"+os.extsep+"out"), "w") + outf.write(result.getvalue()) + outf.close() + +items = locals().items() +items.sort() +for (name, value) in items: + if name[ : 5] == "test_": + confirm(value(), name) + +print "%d tests, %d failures" % (tests, fails) +if fails != 0: + raise TestFailed, "%d of %d tests failed" % (fails, tests) diff --git a/lib-python/2.2/test/test_scope.py b/lib-python/2.2/test/test_scope.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_scope.py @@ -0,0 +1,524 @@ +from test_support import verify, TestFailed, check_syntax + +import warnings +warnings.filterwarnings("ignore", r"import \*", SyntaxWarning, "") + +print "1. simple nesting" + +def make_adder(x): + def adder(y): + return x + y + return adder + +inc = make_adder(1) +plus10 = make_adder(10) + +verify(inc(1) == 2) +verify(plus10(-2) == 8) + +print "2. extra nesting" + +def make_adder2(x): + def extra(): # check freevars passing through non-use scopes + def adder(y): + return x + y + return adder + return extra() + +inc = make_adder2(1) +plus10 = make_adder2(10) + +verify(inc(1) == 2) +verify(plus10(-2) == 8) + +print "3. simple nesting + rebinding" + +def make_adder3(x): + def adder(y): + return x + y + x = x + 1 # check tracking of assignment to x in defining scope + return adder + +inc = make_adder3(0) +plus10 = make_adder3(9) + +verify(inc(1) == 2) +verify(plus10(-2) == 8) + +print "4. nesting with global but no free" + +def make_adder4(): # XXX add exta level of indirection + def nest(): + def nest(): + def adder(y): + return global_x + y # check that plain old globals work + return adder + return nest() + return nest() + +global_x = 1 +adder = make_adder4() +verify(adder(1) == 2) + +global_x = 10 +verify(adder(-2) == 8) + +print "5. nesting through class" + +def make_adder5(x): + class Adder: + def __call__(self, y): + return x + y + return Adder() + +inc = make_adder5(1) +plus10 = make_adder5(10) + +verify(inc(1) == 2) +verify(plus10(-2) == 8) + +print "6. nesting plus free ref to global" + +def make_adder6(x): + global global_nest_x + def adder(y): + return global_nest_x + y + global_nest_x = x + return adder + +inc = make_adder6(1) +plus10 = make_adder6(10) + +verify(inc(1) == 11) # there's only one global +verify(plus10(-2) == 8) + +print "7. nearest enclosing scope" + +def f(x): + def g(y): + x = 42 # check that this masks binding in f() + def h(z): + return x + z + return h + return g(2) + +test_func = f(10) +verify(test_func(5) == 47) + +print "8. mixed freevars and cellvars" + +def identity(x): + return x + +def f(x, y, z): + def g(a, b, c): + a = a + x # 3 + def h(): + # z * (4 + 9) + # 3 * 13 + return identity(z * (b + y)) + y = c + z # 9 + return h + return g + +g = f(1, 2, 3) +h = g(2, 4, 6) +verify(h() == 39) + +print "9. free variable in method" + +def test(): + method_and_var = "var" + class Test: + def method_and_var(self): + return "method" + def test(self): + return method_and_var + def actual_global(self): + return str("global") + def str(self): + return str(self) + return Test() + +t = test() +verify(t.test() == "var") +verify(t.method_and_var() == "method") +verify(t.actual_global() == "global") + +method_and_var = "var" +class Test: + # this class is not nested, so the rules are different + def method_and_var(self): + return "method" + def test(self): + return method_and_var + def actual_global(self): + return str("global") + def str(self): + return str(self) + +t = Test() +verify(t.test() == "var") +verify(t.method_and_var() == "method") +verify(t.actual_global() == "global") + +print "10. recursion" + +def f(x): + def fact(n): + if n == 0: + return 1 + else: + return n * fact(n - 1) + if x >= 0: + return fact(x) + else: + raise ValueError, "x must be >= 0" + +verify(f(6) == 720) + + +print "11. unoptimized namespaces" + +check_syntax("""\ +def unoptimized_clash1(strip): + def f(s): + from string import * + return strip(s) # ambiguity: free or local + return f +""") + +check_syntax("""\ +def unoptimized_clash2(): + from string import * + def f(s): + return strip(s) # ambiguity: global or local + return f +""") + +check_syntax("""\ +def unoptimized_clash2(): + from string import * + def g(): + def f(s): + return strip(s) # ambiguity: global or local + return f +""") + +# XXX could allow this for exec with const argument, but what's the point +check_syntax("""\ +def error(y): + exec "a = 1" + def f(x): + return x + y + return f +""") + +check_syntax("""\ +def f(x): + def g(): + return x + del x # can't del name +""") + +check_syntax("""\ +def f(): + def g(): + from string import * + return strip # global or local? +""") + +# and verify a few cases that should work + +exec """ +def noproblem1(): + from string import * + f = lambda x:x + +def noproblem2(): + from string import * + def f(x): + return x + 1 + +def noproblem3(): + from string import * + def f(x): + global y + y = x +""" + +print "12. lambdas" + +f1 = lambda x: lambda y: x + y +inc = f1(1) +plus10 = f1(10) +verify(inc(1) == 2) +verify(plus10(5) == 15) + +f2 = lambda x: (lambda : lambda y: x + y)() +inc = f2(1) +plus10 = f2(10) +verify(inc(1) == 2) +verify(plus10(5) == 15) + +f3 = lambda x: lambda y: global_x + y +global_x = 1 +inc = f3(None) +verify(inc(2) == 3) + +f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y) +g = f8(1, 2, 3) +h = g(2, 4, 6) +verify(h() == 18) + +print "13. UnboundLocal" + +def errorInOuter(): + print y + def inner(): + return y + y = 1 + +def errorInInner(): + def inner(): + return y + inner() + y = 1 + +try: + errorInOuter() +except UnboundLocalError: + pass +else: + raise TestFailed + +try: + errorInInner() +except NameError: + pass +else: + raise TestFailed + +print "14. complex definitions" + +def makeReturner(*lst): + def returner(): + return lst + return returner + +verify(makeReturner(1,2,3)() == (1,2,3)) + +def makeReturner2(**kwargs): + def returner(): + return kwargs + return returner + +verify(makeReturner2(a=11)()['a'] == 11) + +def makeAddPair((a, b)): + def addPair((c, d)): + return (a + c, b + d) + return addPair + +verify(makeAddPair((1, 2))((100, 200)) == (101,202)) + +print "15. scope of global statements" +# Examples posted by Samuele Pedroni to python-dev on 3/1/2001 + +# I +x = 7 +def f(): + x = 1 + def g(): + global x + def i(): + def h(): + return x + return h() + return i() + return g() +verify(f() == 7) +verify(x == 7) + +# II +x = 7 +def f(): + x = 1 + def g(): + x = 2 + def i(): + def h(): + return x + return h() + return i() + return g() +verify(f() == 2) +verify(x == 7) + +# III +x = 7 +def f(): + x = 1 + def g(): + global x + x = 2 + def i(): + def h(): + return x + return h() + return i() + return g() +verify(f() == 2) +verify(x == 2) + +# IV +x = 7 +def f(): + x = 3 + def g(): + global x + x = 2 + def i(): + def h(): + return x + return h() + return i() + return g() +verify(f() == 2) +verify(x == 2) + +print "16. check leaks" + +class Foo: + count = 0 + + def __init__(self): + Foo.count += 1 + + def __del__(self): + Foo.count -= 1 + +def f1(): + x = Foo() + def f2(): + return x + f2() + +for i in range(100): + f1() + +verify(Foo.count == 0) + +print "17. class and global" + +def test(x): + class Foo: + global x + def __call__(self, y): + return x + y + return Foo() + +x = 0 +verify(test(6)(2) == 8) +x = -1 +verify(test(3)(2) == 5) + +print "18. verify that locals() works" + +def f(x): + def g(y): + def h(z): + return y + z + w = x + y + y += 3 + return locals() + return g + +d = f(2)(4) +verify(d.has_key('h')) +del d['h'] +verify(d == {'x': 2, 'y': 7, 'w': 6}) + +print "19. var is bound and free in class" + +def f(x): + class C: + def m(self): + return x + a = x + return C + +inst = f(3)() +verify(inst.a == inst.m()) + +print "20. interaction with trace function" + +import sys +def tracer(a,b,c): + return tracer + +def adaptgetter(name, klass, getter): + kind, des = getter + if kind == 1: # AV happens when stepping from this line to next + if des == "": + des = "_%s__%s" % (klass.__name__, name) + return lambda obj: getattr(obj, des) + +class TestClass: + pass + +sys.settrace(tracer) +adaptgetter("foo", TestClass, (1, "")) +sys.settrace(None) + +try: sys.settrace() +except TypeError: pass +else: raise TestFailed, 'sys.settrace() did not raise TypeError' + +print "20. eval and exec with free variables" + +def f(x): + return lambda: x + 1 + +g = f(3) +try: + eval(g.func_code) +except TypeError: + pass +else: + print "eval() should have failed, because code contained free vars" + +try: + exec g.func_code +except TypeError: + pass +else: + print "exec should have failed, because code contained free vars" + +print "21. list comprehension with local variables" + +try: + print bad +except NameError: + pass +else: + print "bad should not be defined" + +def x(): + [bad for s in 'a b' for bad in s.split()] + +x() +try: + print bad +except NameError: + pass + +print "22. eval with free variables" + +def f(x): + def g(): + x + eval("x + 1") + return g + +f(4)() diff --git a/lib-python/2.2/test/test_select.py b/lib-python/2.2/test/test_select.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_select.py @@ -0,0 +1,62 @@ +# Testing select module +from test_support import verbose +import select +import os + +# test some known error conditions +try: + rfd, wfd, xfd = select.select(1, 2, 3) +except TypeError: + pass +else: + print 'expected TypeError exception not raised' + +class Nope: + pass + +class Almost: + def fileno(self): + return 'fileno' + +try: + rfd, wfd, xfd = select.select([Nope()], [], []) +except TypeError: + pass +else: + print 'expected TypeError exception not raised' + +try: + rfd, wfd, xfd = select.select([Almost()], [], []) +except TypeError: + pass +else: + print 'expected TypeError exception not raised' + + +def test(): + import sys + if sys.platform[:3] in ('win', 'mac', 'os2'): + if verbose: + print "Can't test select easily on", sys.platform + return + cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' + p = os.popen(cmd, 'r') + for tout in (0, 1, 2, 4, 8, 16) + (None,)*10: + if verbose: + print 'timeout =', tout + rfd, wfd, xfd = select.select([p], [], [], tout) + if (rfd, wfd, xfd) == ([], [], []): + continue + if (rfd, wfd, xfd) == ([p], [], []): + line = p.readline() + if verbose: + print `line` + if not line: + if verbose: + print 'EOF' + break + continue + print 'Unexpected return values from select():', rfd, wfd, xfd + p.close() + +test() diff --git a/lib-python/2.2/test/test_sgmllib.py b/lib-python/2.2/test/test_sgmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_sgmllib.py @@ -0,0 +1,314 @@ +import pprint +import sgmllib +import test_support +import unittest + + +class EventCollector(sgmllib.SGMLParser): + + def __init__(self): + self.events = [] + self.append = self.events.append + sgmllib.SGMLParser.__init__(self) + + def get_events(self): + # Normalize the list of events so that buffer artefacts don't + # separate runs of contiguous characters. + L = [] + prevtype = None + for event in self.events: + type = event[0] + if type == prevtype == "data": + L[-1] = ("data", L[-1][1] + event[1]) + else: + L.append(event) + prevtype = type + self.events = L + return L + + # structure markup + + def unknown_starttag(self, tag, attrs): + self.append(("starttag", tag, attrs)) + + def unknown_endtag(self, tag): + self.append(("endtag", tag)) + + # all other markup + + def handle_comment(self, data): + self.append(("comment", data)) + + def handle_charref(self, data): + self.append(("charref", data)) + + def handle_data(self, data): + self.append(("data", data)) + + def handle_decl(self, decl): + self.append(("decl", decl)) + + def handle_entityref(self, data): + self.append(("entityref", data)) + + def handle_pi(self, data): + self.append(("pi", data)) + + def unknown_decl(self, decl): + self.append(("unknown decl", decl)) + + +class CDATAEventCollector(EventCollector): + def start_cdata(self, attrs): + self.append(("starttag", "cdata", attrs)) + self.setliteral() + + +class SGMLParserTestCase(unittest.TestCase): + + collector = EventCollector + + def get_events(self, source): + parser = self.collector() + try: + for s in source: + parser.feed(s) + parser.close() + except: + #self.events = parser.events + raise + return parser.get_events() + + def check_events(self, source, expected_events): + try: + events = self.get_events(source) + except: + import sys + #print >>sys.stderr, pprint.pformat(self.events) + raise + if events != expected_events: + self.fail("received events did not match expected events\n" + "Expected:\n" + pprint.pformat(expected_events) + + "\nReceived:\n" + pprint.pformat(events)) + + def check_parse_error(self, source): + parser = EventCollector() + try: + parser.feed(source) + parser.close() + except sgmllib.SGMLParseError: + pass + else: + self.fail("expected SGMLParseError for %r\nReceived:\n%s" + % (source, pprint.pformat(parser.get_events()))) + + def test_doctype_decl_internal(self): + inside = """\ +DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01//EN' + SYSTEM 'http://www.w3.org/TR/html401/strict.dtd' [ + + + + + + + %paramEntity; + +]""" + self.check_events(["" % inside], [ + ("decl", inside), + ]) + + def test_doctype_decl_external(self): + inside = "DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01//EN'" + self.check_events("" % inside, [ + ("decl", inside), + ]) + + def test_underscore_in_attrname(self): + # SF bug #436621 + """Make sure attribute names with underscores are accepted""" + self.check_events("", [ + ("starttag", "a", [("has_under", "has_under"), + ("_under", "_under")]), + ]) + + def test_underscore_in_tagname(self): + # SF bug #436621 + """Make sure tag names with underscores are accepted""" + self.check_events("", [ + ("starttag", "has_under", []), + ("endtag", "has_under"), + ]) + + def test_quotes_in_unquoted_attrs(self): + # SF bug #436621 + """Be sure quotes in unquoted attributes are made part of the value""" + self.check_events("", [ + ("starttag", "a", [("href", "foo'bar\"baz")]), + ]) + + def test_xhtml_empty_tag(self): + """Handling of XHTML-style empty start tags""" + self.check_events("
text", [ + ("starttag", "br", []), + ("data", "text"), + ("starttag", "i", []), + ("endtag", "i"), + ]) + + def test_processing_instruction_only(self): + self.check_events("", [ + ("pi", "processing instruction"), + ]) + + def test_bad_nesting(self): + self.check_events("
", [ + ("starttag", "a", []), + ("starttag", "b", []), + ("endtag", "a"), + ("endtag", "b"), + ]) + + def test_bare_ampersands(self): + self.check_events("this text & contains & ampersands &", [ + ("data", "this text & contains & ampersands &"), + ]) + + def test_bare_pointy_brackets(self): + self.check_events("this < text > contains < bare>pointy< brackets", [ + ("data", "this < text > contains < bare>pointy< brackets"), + ]) + + def test_attr_syntax(self): + output = [ + ("starttag", "a", [("b", "v"), ("c", "v"), ("d", "v"), ("e", "e")]) + ] + self.check_events("""""", output) + self.check_events("""""", output) + self.check_events("""""", output) + self.check_events("""""", output) + + def test_attr_values(self): + self.check_events("""""", + [("starttag", "a", [("b", "xxx\n\txxx"), + ("c", "yyy\t\nyyy"), + ("d", "\txyz\n")]) + ]) + self.check_events("""""", [ + ("starttag", "a", [("b", ""), ("c", "")]), + ]) + + def test_attr_funky_names(self): + self.check_events("""""", [ + ("starttag", "a", [("a.b", "v"), ("c:d", "v"), ("e-f", "v")]), + ]) + + def test_illegal_declarations(self): + s = 'abcdef' + self.check_events(s, [ + ("data", "abc"), + ("unknown decl", 'spacer type="block" height="25"'), + ("data", "def"), + ]) + + def test_weird_starttags(self): + self.check_events("", [ + ("starttag", "a", []), + ("starttag", "a", []), + ]) + self.check_events("", [ + ("endtag", "a"), + ("starttag", "a", []), + ]) + + def test_declaration_junk_chars(self): + self.check_parse_error("") + + def test_get_starttag_text(self): + s = """""" + self.check_events(s, [ + ("starttag", "foobar", [("one", "1"), ("two", "2")]), + ]) + + def test_cdata_content(self): + s = (" ¬-an-entity-ref; " + " ") + self.collector = CDATAEventCollector + self.check_events(s, [ + ("starttag", "cdata", []), + ("data", " ¬-an-entity-ref; "), + ("endtag", "cdata"), + ("starttag", "notcdata", []), + ("data", " "), + ("comment", " comment "), + ("data", " "), + ("endtag", "notcdata"), + ]) + s = """ """ + self.check_events(s, [ + ("starttag", "cdata", []), + ("data", " "), + ("endtag", "cdata"), + ]) + + def test_illegal_declarations(self): + s = 'abcdef' + self.check_events(s, [ + ("data", "abc"), + ("unknown decl", 'spacer type="block" height="25"'), + ("data", "def"), + ]) + + # XXX These tests have been disabled by prefixing their names with + # an underscore. The first two exercise outstanding bugs in the + # sgmllib module, and the third exhibits questionable behavior + # that needs to be carefully considered before changing it. + + def _test_starttag_end_boundary(self): + self.check_events("""""", [("starttag", "a", [("b", "<")])]) + self.check_events("""""", [("starttag", "a", [("b", ">")])]) + + def _test_buffer_artefacts(self): + output = [("starttag", "a", [("b", "<")])] + self.check_events([""], output) + self.check_events([""], output) + self.check_events([""], output) + self.check_events([""], output) + self.check_events([""], output) + self.check_events([""], output) + + output = [("starttag", "a", [("b", ">")])] + self.check_events([""], output) + self.check_events([""], output) + self.check_events([""], output) + self.check_events(["'>"], output) + self.check_events([""], output) + self.check_events([""], output) + + def _test_starttag_junk_chars(self): + self.check_parse_error("<") + self.check_parse_error("<>") + self.check_parse_error("") + self.check_parse_error("") + self.check_parse_error("") + self.check_parse_error("'") + self.check_parse_error(" orig: + raise TestFailed,"socket.getnameinfo loses a reference" + +try: + # On some versions, this crashes the interpreter. + socket.getnameinfo(('x', 0, 0, 0), 0) +except socket.error: + pass + +canfork = hasattr(os, 'fork') +try: + PORT = 50007 + if not canfork or os.fork(): + # parent is server + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(("127.0.0.1", PORT)) + s.listen(1) + if verbose: + print 'parent accepting' + if canfork: + conn, addr = s.accept() + if verbose: + print 'connected by', addr + # couple of interesting tests while we've got a live socket + f = conn.fileno() + if verbose: + print 'fileno:', f + p = conn.getpeername() + if verbose: + print 'peer:', p + n = conn.getsockname() + if verbose: + print 'sockname:', n + f = conn.makefile() + if verbose: + print 'file obj:', f + while 1: + data = conn.recv(1024) + if not data: + break + if verbose: + print 'received:', data + conn.sendall(data) + conn.close() + else: + try: + # child is client + time.sleep(5) + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + if verbose: + print 'child connecting' + s.connect(("127.0.0.1", PORT)) + msg = 'socket test' + s.send(msg) + data = s.recv(1024) + if msg != data: + print 'parent/client mismatch' + s.close() + finally: + os._exit(1) +except socket.error, msg: + raise TestFailed, msg diff --git a/lib-python/2.2/test/test_socket_ssl.py b/lib-python/2.2/test/test_socket_ssl.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_socket_ssl.py @@ -0,0 +1,27 @@ +# Test just the SSL support in the socket module, in a moderately bogus way. + +import test_support + +# Optionally test SSL support. This currently requires the 'network' resource +# as given on the regrtest command line. If not available, nothing after this +# line will be executed. +test_support.requires('network') + +import socket +if not hasattr(socket, "ssl"): + raise test_support.TestSkipped("socket module has no ssl support") + +import urllib + +socket.RAND_status() +try: + socket.RAND_egd(1) +except TypeError: + pass +else: + print "didn't raise TypeError" +socket.RAND_add("this is a random string", 75.0) + +f = urllib.urlopen('https://sf.net') +buf = f.read() +f.close() diff --git a/lib-python/2.2/test/test_socketserver.py b/lib-python/2.2/test/test_socketserver.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_socketserver.py @@ -0,0 +1,165 @@ +# Test suite for SocketServer.py + +import test_support +from test_support import verbose, verify, TESTFN, TestSkipped +test_support.requires('network') + +from SocketServer import * +import socket +import select +import time +import threading +import os + +NREQ = 3 +DELAY = 0.5 + +class MyMixinHandler: + def handle(self): + time.sleep(DELAY) + line = self.rfile.readline() + time.sleep(DELAY) + self.wfile.write(line) + +class MyStreamHandler(MyMixinHandler, StreamRequestHandler): + pass + +class MyDatagramHandler(MyMixinHandler, DatagramRequestHandler): + pass + +class MyMixinServer: + def serve_a_few(self): + for i in range(NREQ): + self.handle_request() + def handle_error(self, request, client_address): + self.close_request(request) + self.server_close() + raise + +teststring = "hello world\n" + +def receive(sock, n, timeout=20): + r, w, x = select.select([sock], [], [], timeout) + if sock in r: + return sock.recv(n) + else: + raise RuntimeError, "timed out on %s" % `sock` + +def testdgram(proto, addr): + s = socket.socket(proto, socket.SOCK_DGRAM) + s.sendto(teststring, addr) + buf = data = receive(s, 100) + while data and '\n' not in buf: + data = receive(s, 100) + buf += data + verify(buf == teststring) + s.close() + +def teststream(proto, addr): + s = socket.socket(proto, socket.SOCK_STREAM) + s.connect(addr) + s.sendall(teststring) + buf = data = receive(s, 100) + while data and '\n' not in buf: + data = receive(s, 100) + buf += data + verify(buf == teststring) + s.close() + +class ServerThread(threading.Thread): + def __init__(self, addr, svrcls, hdlrcls): + threading.Thread.__init__(self) + self.__addr = addr + self.__svrcls = svrcls + self.__hdlrcls = hdlrcls + def run(self): + class svrcls(MyMixinServer, self.__svrcls): + pass + if verbose: print "thread: creating server" + svr = svrcls(self.__addr, self.__hdlrcls) + if verbose: print "thread: serving three times" + svr.serve_a_few() + if verbose: print "thread: done" + +seed = 0 +def pickport(): + global seed + seed += 1 + return 10000 + (os.getpid() % 1000)*10 + seed + +host = "localhost" +testfiles = [] +def pickaddr(proto): + if proto == socket.AF_INET: + return (host, pickport()) + else: + fn = TESTFN + str(pickport()) + testfiles.append(fn) + return fn + +def cleanup(): + for fn in testfiles: + try: + os.remove(fn) + except os.error: + pass + testfiles[:] = [] + +def testloop(proto, servers, hdlrcls, testfunc): + for svrcls in servers: + addr = pickaddr(proto) + if verbose: + print "ADDR =", addr + print "CLASS =", svrcls + t = ServerThread(addr, svrcls, hdlrcls) + if verbose: print "server created" + t.start() + if verbose: print "server running" + for i in range(NREQ): + time.sleep(DELAY) + if verbose: print "test client", i + testfunc(proto, addr) + if verbose: print "waiting for server" + t.join() + if verbose: print "done" + +tcpservers = [TCPServer, ThreadingTCPServer] +if hasattr(os, 'fork'): + tcpservers.append(ForkingTCPServer) +udpservers = [UDPServer, ThreadingUDPServer] +if hasattr(os, 'fork'): + udpservers.append(ForkingUDPServer) + +if not hasattr(socket, 'AF_UNIX'): + streamservers = [] + dgramservers = [] +else: + class ForkingUnixStreamServer(ForkingMixIn, UnixStreamServer): pass + streamservers = [UnixStreamServer, ThreadingUnixStreamServer, + ForkingUnixStreamServer] + class ForkingUnixDatagramServer(ForkingMixIn, UnixDatagramServer): pass + dgramservers = [UnixDatagramServer, ThreadingUnixDatagramServer, + ForkingUnixDatagramServer] + +def testall(): + testloop(socket.AF_INET, tcpservers, MyStreamHandler, teststream) + testloop(socket.AF_INET, udpservers, MyDatagramHandler, testdgram) + if hasattr(socket, 'AF_UNIX'): + testloop(socket.AF_UNIX, streamservers, MyStreamHandler, teststream) + # Alas, on Linux (at least) recvfrom() doesn't return a meaningful + # client address so this cannot work: + ##testloop(socket.AF_UNIX, dgramservers, MyDatagramHandler, testdgram) + +def test_main(): + import imp + if imp.lock_held(): + # If the import lock is held, the threads will hang. + raise TestSkipped("can't run when import lock is held") + + try: + testall() + finally: + cleanup() + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_sre.py b/lib-python/2.2/test/test_sre.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_sre.py @@ -0,0 +1,434 @@ +# SRE test harness for the Python regression suite + +# this is based on test_re.py, but uses a test function instead +# of all those asserts + +import sys +sys.path=['.']+sys.path + +from test_support import verbose, TestFailed, have_unicode +import sre +import sys, os, string, traceback + +# +# test support + +def test(expression, result, exception=None): + try: + r = eval(expression) + except: + if exception: + if not isinstance(sys.exc_value, exception): + print expression, "FAILED" + # display name, not actual value + if exception is sre.error: + print "expected", "sre.error" + else: + print "expected", exception.__name__ + print "got", sys.exc_type.__name__, str(sys.exc_value) + else: + print expression, "FAILED" + traceback.print_exc(file=sys.stdout) + else: + if exception: + print expression, "FAILED" + if exception is sre.error: + print "expected", "sre.error" + else: + print "expected", exception.__name__ + print "got result", repr(r) + else: + if r != result: + print expression, "FAILED" + print "expected", repr(result) + print "got result", repr(r) + +if verbose: + print 'Running tests on character literals' + +for i in [0, 8, 16, 32, 64, 127, 128, 255]: + test(r"""sre.match(r"\%03o" % i, chr(i)) is not None""", 1) + test(r"""sre.match(r"\%03o0" % i, chr(i)+"0") is not None""", 1) + test(r"""sre.match(r"\%03o8" % i, chr(i)+"8") is not None""", 1) + test(r"""sre.match(r"\x%02x" % i, chr(i)) is not None""", 1) + test(r"""sre.match(r"\x%02x0" % i, chr(i)+"0") is not None""", 1) + test(r"""sre.match(r"\x%02xz" % i, chr(i)+"z") is not None""", 1) +test(r"""sre.match("\911", "")""", None, sre.error) + +# +# Misc tests from Tim Peters' re.doc + +if verbose: + print 'Running tests on sre.search and sre.match' + +test(r"""sre.search(r'x*', 'axx').span(0)""", (0, 0)) +test(r"""sre.search(r'x*', 'axx').span()""", (0, 0)) +test(r"""sre.search(r'x+', 'axx').span(0)""", (1, 3)) +test(r"""sre.search(r'x+', 'axx').span()""", (1, 3)) +test(r"""sre.search(r'x', 'aaa')""", None) + +test(r"""sre.match(r'a*', 'xxx').span(0)""", (0, 0)) +test(r"""sre.match(r'a*', 'xxx').span()""", (0, 0)) +test(r"""sre.match(r'x*', 'xxxa').span(0)""", (0, 3)) +test(r"""sre.match(r'x*', 'xxxa').span()""", (0, 3)) +test(r"""sre.match(r'a+', 'xxx')""", None) + +# bug 113254 +test(r"""sre.match(r'(a)|(b)', 'b').start(1)""", -1) +test(r"""sre.match(r'(a)|(b)', 'b').end(1)""", -1) +test(r"""sre.match(r'(a)|(b)', 'b').span(1)""", (-1, -1)) + +# bug 612074 +pat=u"["+sre.escape(u"\u2039")+u"]" +test(r"""sre.compile(pat) and 1""", 1, None) + +if verbose: + print 'Running tests on sre.sub' + +test(r"""sre.sub(r"(?i)b+", "x", "bbbb BBBB")""", 'x x') + +def bump_num(matchobj): + int_value = int(matchobj.group(0)) + return str(int_value + 1) + +test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y')""", '9.3 -3 24x100y') +test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y', 3)""", '9.3 -3 23x99y') + +test(r"""sre.sub(r'.', lambda m: r"\n", 'x')""", '\\n') +test(r"""sre.sub(r'.', r"\n", 'x')""", '\n') + +s = r"\1\1" + +test(r"""sre.sub(r'(.)', s, 'x')""", 'xx') +test(r"""sre.sub(r'(.)', sre.escape(s), 'x')""", s) +test(r"""sre.sub(r'(.)', lambda m: s, 'x')""", s) + +test(r"""sre.sub(r'(?Px)', '\g\g', 'xx')""", 'xxxx') +test(r"""sre.sub(r'(?Px)', '\g\g<1>', 'xx')""", 'xxxx') +test(r"""sre.sub(r'(?Px)', '\g\g', 'xx')""", 'xxxx') +test(r"""sre.sub(r'(?Px)', '\g<1>\g<1>', 'xx')""", 'xxxx') + +# bug 449964: fails for group followed by other escape +test(r"""sre.sub(r'(?Px)', '\g<1>\g<1>\\b', 'xx')""", 'xx\bxx\b') + +test(r"""sre.sub(r'a', r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D', 'a')""", '\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D') +test(r"""sre.sub(r'a', '\t\n\v\r\f\a', 'a')""", '\t\n\v\r\f\a') +test(r"""sre.sub(r'a', '\t\n\v\r\f\a', 'a')""", (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7))) + +test(r"""sre.sub(r'^\s*', 'X', 'test')""", 'Xtest') + +# qualified sub +test(r"""sre.sub(r'a', 'b', 'aaaaa')""", 'bbbbb') +test(r"""sre.sub(r'a', 'b', 'aaaaa', 1)""", 'baaaa') + +# bug 114660 +test(r"""sre.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there')""", 'hello there') + +# Test for sub() on escaped characters, see SF bug #449000 +test(r"""sre.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n')""", 'abc\ndef\n') +test(r"""sre.sub('\r\n', r'\n', 'abc\r\ndef\r\n')""", 'abc\ndef\n') +test(r"""sre.sub(r'\r\n', '\n', 'abc\r\ndef\r\n')""", 'abc\ndef\n') +test(r"""sre.sub('\r\n', '\n', 'abc\r\ndef\r\n')""", 'abc\ndef\n') + +# Test for empty sub() behaviour, see SF bug #462270 +test(r"""sre.sub('x*', '-', 'abxd')""", '-a-b-d-') +test(r"""sre.sub('x+', '-', 'abxd')""", 'ab-d') + +if verbose: + print 'Running tests on symbolic references' + +test(r"""sre.sub(r'(?Px)', '\gx)', '\g<', 'xx')""", None, sre.error) +test(r"""sre.sub(r'(?Px)', '\g', 'xx')""", None, sre.error) +test(r"""sre.sub(r'(?Px)', '\g', 'xx')""", None, sre.error) +test(r"""sre.sub(r'(?Px)', '\g<1a1>', 'xx')""", None, sre.error) +test(r"""sre.sub(r'(?Px)', '\g', 'xx')""", None, IndexError) +test(r"""sre.sub(r'(?Px)|(?Py)', '\g', 'xx')""", None, sre.error) +test(r"""sre.sub(r'(?Px)|(?Py)', '\\2', 'xx')""", None, sre.error) + +if verbose: + print 'Running tests on sre.subn' + +test(r"""sre.subn(r"(?i)b+", "x", "bbbb BBBB")""", ('x x', 2)) +test(r"""sre.subn(r"b+", "x", "bbbb BBBB")""", ('x BBBB', 1)) +test(r"""sre.subn(r"b+", "x", "xyz")""", ('xyz', 0)) +test(r"""sre.subn(r"b*", "x", "xyz")""", ('xxxyxzx', 4)) +test(r"""sre.subn(r"b*", "x", "xyz", 2)""", ('xxxyz', 2)) + +if verbose: + print 'Running tests on sre.split' + +test(r"""sre.split(r":", ":a:b::c")""", ['', 'a', 'b', '', 'c']) +test(r"""sre.split(r":+", ":a:b:::")""", ['', 'a', 'b', '']) +test(r"""sre.split(r":*", ":a:b::c")""", ['', 'a', 'b', 'c']) +test(r"""sre.split(r"(:*)", ":a:b::c")""", ['', ':', 'a', ':', 'b', '::', 'c']) +test(r"""sre.split(r"(?::*)", ":a:b::c")""", ['', 'a', 'b', 'c']) +test(r"""sre.split(r"(:)*", ":a:b::c")""", ['', ':', 'a', ':', 'b', ':', 'c']) +test(r"""sre.split(r"([b:]+)", ":a:b::c")""", ['', ':', 'a', ':b::', 'c']) +test(r"""sre.split(r"(b)|(:+)", ":a:b::c")""", + ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c']) +test(r"""sre.split(r"(?:b)|(?::+)", ":a:b::c")""", ['', 'a', '', '', 'c']) + +test(r"""sre.split(r":", ":a:b::c", 2)""", ['', 'a', 'b::c']) +test(r"""sre.split(r':', 'a:b:c:d', 2)""", ['a', 'b', 'c:d']) + +test(r"""sre.split(r"(:)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c']) +test(r"""sre.split(r"(:*)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c']) + +if verbose: + print "Running tests on sre.findall" + +test(r"""sre.findall(r":+", "abc")""", []) +test(r"""sre.findall(r":+", "a:b::c:::d")""", [":", "::", ":::"]) +test(r"""sre.findall(r"(:+)", "a:b::c:::d")""", [":", "::", ":::"]) +test(r"""sre.findall(r"(:)(:*)", "a:b::c:::d")""", + [(":", ""), (":", ":"), (":", "::")]) +test(r"""sre.findall(r"(a)|(b)", "abc")""", [("a", ""), ("", "b")]) + +# bug 117612 +test(r"""sre.findall(r"(a|(b))", "aba")""", [("a", ""),("b", "b"),("a", "")]) + +if sys.hexversion >= 0x02020000: + if verbose: + print "Running tests on sre.finditer" + def fixup(seq): + # convert iterator to list + if not hasattr(seq, "next") or not hasattr(seq, "__iter__"): + print "finditer returned", type(seq) + return map(lambda item: item.group(0), seq) + # sanity + test(r"""fixup(sre.finditer(r":+", "a:b::c:::d"))""", [":", "::", ":::"]) + +if verbose: + print "Running tests on sre.match" + +test(r"""sre.match(r'a', 'a').groups()""", ()) +test(r"""sre.match(r'(a)', 'a').groups()""", ('a',)) +test(r"""sre.match(r'(a)', 'a').group(0)""", 'a') +test(r"""sre.match(r'(a)', 'a').group(1)""", 'a') +test(r"""sre.match(r'(a)', 'a').group(1, 1)""", ('a', 'a')) + +pat = sre.compile(r'((a)|(b))(c)?') +test(r"""pat.match('a').groups()""", ('a', 'a', None, None)) +test(r"""pat.match('b').groups()""", ('b', None, 'b', None)) +test(r"""pat.match('ac').groups()""", ('a', 'a', None, 'c')) +test(r"""pat.match('bc').groups()""", ('b', None, 'b', 'c')) +test(r"""pat.match('bc').groups("")""", ('b', "", 'b', 'c')) + +pat = sre.compile(r'(?:(?Pa)|(?Pb))(?Pc)?') +test(r"""pat.match('a').group(1, 2, 3)""", ('a', None, None)) +test(r"""pat.match('b').group('a1', 'b2', 'c3')""", (None, 'b', None)) +test(r"""pat.match('ac').group(1, 'b2', 3)""", ('a', None, 'c')) + +# bug 448951 (similar to 429357, but with single char match) +# (Also test greedy matches.) +for op in '','?','*': + test(r"""sre.match(r'((.%s):)?z', 'z').groups()"""%op, (None, None)) + test(r"""sre.match(r'((.%s):)?z', 'a:z').groups()"""%op, ('a:', 'a')) + +if verbose: + print "Running tests on sre.escape" + +p = "" +for i in range(0, 256): + p = p + chr(i) + test(r"""sre.match(sre.escape(chr(i)), chr(i)) is not None""", 1) + test(r"""sre.match(sre.escape(chr(i)), chr(i)).span()""", (0,1)) + +pat = sre.compile(sre.escape(p)) +test(r"""pat.match(p) is not None""", 1) +test(r"""pat.match(p).span()""", (0,256)) + +if verbose: + print 'Running tests on sre.Scanner' + +def s_ident(scanner, token): return token +def s_operator(scanner, token): return "op%s" % token +def s_float(scanner, token): return float(token) +def s_int(scanner, token): return int(token) + +scanner = sre.Scanner([ + (r"[a-zA-Z_]\w*", s_ident), + (r"\d+\.\d*", s_float), + (r"\d+", s_int), + (r"=|\+|-|\*|/", s_operator), + (r"\s+", None), + ]) + +# sanity check +test('scanner.scan("sum = 3*foo + 312.50 + bar")', + (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], '')) + +if verbose: + print 'Pickling a SRE_Pattern instance' + +try: + import pickle + pat = sre.compile(r'a(?:b|(c|e){1,2}?|d)+?(.)') + s = pickle.dumps(pat) + pat = pickle.loads(s) +except: + print TestFailed, 're module pickle' + +try: + import cPickle + pat = sre.compile(r'a(?:b|(c|e){1,2}?|d)+?(.)') + s = cPickle.dumps(pat) + pat = cPickle.loads(s) +except: + print TestFailed, 're module cPickle' + +# constants +test(r"""sre.I""", sre.IGNORECASE) +test(r"""sre.L""", sre.LOCALE) +test(r"""sre.M""", sre.MULTILINE) +test(r"""sre.S""", sre.DOTALL) +test(r"""sre.X""", sre.VERBOSE) +test(r"""sre.T""", sre.TEMPLATE) +test(r"""sre.U""", sre.UNICODE) + +for flags in [sre.I, sre.M, sre.X, sre.S, sre.L, sre.T, sre.U]: + try: + r = sre.compile('^pattern$', flags) + except: + print 'Exception raised on flag', flags + +if verbose: + print 'Test engine limitations' + +# Try nasty case that overflows the straightforward recursive +# implementation of repeated groups. +test("sre.match('(x)*', 50000*'x').span()", (0, 50000), RuntimeError) +test("sre.match(r'(x)*y', 50000*'x'+'y').span()", (0, 50001), RuntimeError) +test("sre.match(r'(x)*?y', 50000*'x'+'y').span()", (0, 50001), RuntimeError) + +from re_tests import * + +if verbose: + print 'Running re_tests test suite' +else: + # To save time, only run the first and last 10 tests + #tests = tests[:10] + tests[-10:] + pass + +for t in tests: + sys.stdout.flush() + pattern=s=outcome=repl=expected=None + if len(t)==5: + pattern, s, outcome, repl, expected = t + elif len(t)==3: + pattern, s, outcome = t + else: + raise ValueError, ('Test tuples should have 3 or 5 fields',t) + + try: + obj=sre.compile(pattern) + except sre.error: + if outcome==SYNTAX_ERROR: pass # Expected a syntax error + else: + print '=== Syntax error:', t + except KeyboardInterrupt: raise KeyboardInterrupt + except: + print '*** Unexpected error ***', t + if verbose: + traceback.print_exc(file=sys.stdout) + else: + try: + result=obj.search(s) + except (sre.error), msg: + print '=== Unexpected exception', t, repr(msg) + if outcome==SYNTAX_ERROR: + print '=== Compiled incorrectly', t + elif outcome==FAIL: + if result is None: pass # No match, as expected + else: print '=== Succeeded incorrectly', t + elif outcome==SUCCEED: + if result is not None: + # Matched, as expected, so now we compute the + # result string and compare it to our expected result. + start, end = result.span(0) + vardict={'found': result.group(0), + 'groups': result.group(), + 'flags': result.re.flags} + for i in range(1, 100): + try: + gi = result.group(i) + # Special hack because else the string concat fails: + if gi is None: + gi = "None" + except IndexError: + gi = "Error" + vardict['g%d' % i] = gi + for i in result.re.groupindex.keys(): + try: + gi = result.group(i) + if gi is None: + gi = "None" + except IndexError: + gi = "Error" + vardict[i] = gi + repl=eval(repl, vardict) + if repl!=expected: + print '=== grouping error', t, + print repr(repl)+' should be '+repr(expected) + else: + print '=== Failed incorrectly', t + continue + + # Try the match on a unicode string, and check that it + # still succeeds. + try: + u = unicode(s, "latin-1") + except NameError: + pass + except TypeError: + continue # skip unicode test strings + else: + result=obj.search(u) + if result==None: + print '=== Fails on unicode match', t + + # Try the match on a unicode pattern, and check that it + # still succeeds. + try: + u = unicode(pattern, "latin-1") + except NameError: + pass + else: + obj=sre.compile(u) + result=obj.search(s) + if result==None: + print '=== Fails on unicode pattern match', t + + # Try the match with the search area limited to the extent + # of the match and see if it still succeeds. \B will + # break (because it won't match at the end or start of a + # string), so we'll ignore patterns that feature it. + + if pattern[:2]!='\\B' and pattern[-2:]!='\\B': + obj=sre.compile(pattern) + result=obj.search(s, result.start(0), result.end(0)+1) + if result==None: + print '=== Failed on range-limited match', t + + # Try the match with IGNORECASE enabled, and check that it + # still succeeds. + obj=sre.compile(pattern, sre.IGNORECASE) + result=obj.search(s) + if result==None: + print '=== Fails on case-insensitive match', t + + # Try the match with LOCALE enabled, and check that it + # still succeeds. + obj=sre.compile(pattern, sre.LOCALE) + result=obj.search(s) + if result==None: + print '=== Fails on locale-sensitive match', t + + # Try the match with UNICODE locale enabled, and check + # that it still succeeds. + if have_unicode: + obj=sre.compile(pattern, sre.UNICODE) + result=obj.search(s) + if result==None: + print '=== Fails on unicode-sensitive match', t diff --git a/lib-python/2.2/test/test_strftime.py b/lib-python/2.2/test/test_strftime.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_strftime.py @@ -0,0 +1,146 @@ +#! /usr/bin/env python + +# Sanity checker for time.strftime + +import time, calendar, sys, os, re +from test_support import verbose + +def main(): + global verbose + # For C Python, these tests expect C locale, so we try to set that + # explicitly. For Jython, Finn says we need to be in the US locale; my + # understanding is that this is the closest Java gets to C's "C" locale. + # Jython ought to supply an _locale module which Does The Right Thing, but + # this is the best we can do given today's state of affairs. + try: + import java + java.util.Locale.setDefault(java.util.Locale.US) + except ImportError: + # Can't do this first because it will succeed, even in Jython + import locale + locale.setlocale(locale.LC_TIME, 'C') + now = time.time() + strftest(now) + verbose = 0 + # Try a bunch of dates and times, chosen to vary through time of + # day and daylight saving time + for j in range(-5, 5): + for i in range(25): + strftest(now + (i + j*100)*23*3603) + +def strftest(now): + if verbose: + print "strftime test for", time.ctime(now) + nowsecs = str(long(now))[:-1] + gmt = time.gmtime(now) + now = time.localtime(now) + + if now[3] < 12: ampm='(AM|am)' + else: ampm='(PM|pm)' + + jan1 = time.localtime(time.mktime((now[0], 1, 1) + (0,)*6)) + + try: + if now[8]: tz = time.tzname[1] + else: tz = time.tzname[0] + except AttributeError: + tz = '' + + if now[3] > 12: clock12 = now[3] - 12 + elif now[3] > 0: clock12 = now[3] + else: clock12 = 12 + + expectations = ( + ('%a', calendar.day_abbr[now[6]], 'abbreviated weekday name'), + ('%A', calendar.day_name[now[6]], 'full weekday name'), + ('%b', calendar.month_abbr[now[1]], 'abbreviated month name'), + ('%B', calendar.month_name[now[1]], 'full month name'), + # %c see below + ('%d', '%02d' % now[2], 'day of month as number (00-31)'), + ('%H', '%02d' % now[3], 'hour (00-23)'), + ('%I', '%02d' % clock12, 'hour (01-12)'), + ('%j', '%03d' % now[7], 'julian day (001-366)'), + ('%m', '%02d' % now[1], 'month as number (01-12)'), + ('%M', '%02d' % now[4], 'minute, (00-59)'), + ('%p', ampm, 'AM or PM as appropriate'), + ('%S', '%02d' % now[5], 'seconds of current time (00-60)'), + ('%U', '%02d' % ((now[7] + jan1[6])//7), + 'week number of the year (Sun 1st)'), + ('%w', '0?%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'), + ('%W', '%02d' % ((now[7] + (jan1[6] - 1)%7)//7), + 'week number of the year (Mon 1st)'), + # %x see below + ('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'), + ('%y', '%02d' % (now[0]%100), 'year without century'), + ('%Y', '%d' % now[0], 'year with century'), + # %Z see below + ('%%', '%', 'single percent sign'), + ) + + nonstandard_expectations = ( + # These are standard but don't have predictable output + ('%c', fixasctime(time.asctime(now)), 'near-asctime() format'), + ('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), + '%m/%d/%y %H:%M:%S'), + ('%Z', '%s' % tz, 'time zone name'), + + # These are some platform specific extensions + ('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'), + ('%e', '%2d' % now[2], 'day of month as number, blank padded ( 0-31)'), + ('%h', calendar.month_abbr[now[1]], 'abbreviated month name'), + ('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'), + ('%n', '\n', 'newline character'), + ('%r', '%02d:%02d:%02d %s' % (clock12, now[4], now[5], ampm), + '%I:%M:%S %p'), + ('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'), + ('%s', nowsecs, 'seconds since the Epoch in UCT'), + ('%t', '\t', 'tab character'), + ('%T', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'), + ('%3y', '%03d' % (now[0]%100), + 'year without century rendered using fieldwidth'), + ) + + if verbose: + print "Strftime test, platform: %s, Python version: %s" % \ + (sys.platform, sys.version.split()[0]) + + for e in expectations: + try: + result = time.strftime(e[0], now) + except ValueError, error: + print "Standard '%s' format gave error:" % e[0], error + continue + if re.match(e[1], result): continue + if not result or result[0] == '%': + print "Does not support standard '%s' format (%s)" % (e[0], e[2]) + else: + print "Conflict for %s (%s):" % (e[0], e[2]) + print " Expected %s, but got %s" % (e[1], result) + + for e in nonstandard_expectations: + try: + result = time.strftime(e[0], now) + except ValueError, result: + if verbose: + print "Error for nonstandard '%s' format (%s): %s" % \ + (e[0], e[2], str(result)) + continue + if re.match(e[1], result): + if verbose: + print "Supports nonstandard '%s' format (%s)" % (e[0], e[2]) + elif not result or result[0] == '%': + if verbose: + print "Does not appear to support '%s' format (%s)" % (e[0], + e[2]) + else: + if verbose: + print "Conflict for nonstandard '%s' format (%s):" % (e[0], + e[2]) + print " Expected %s, but got %s" % (e[1], result) + +def fixasctime(s): + if s[8] == ' ': + s = s[:8] + '0' + s[9:] + return s + +main() diff --git a/lib-python/2.2/test/test_string.py b/lib-python/2.2/test/test_string.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_string.py @@ -0,0 +1,83 @@ +from test_support import verbose, TestSkipped +import string_tests +import string, sys + +# XXX: kludge... short circuit if strings don't have methods +try: + ''.join +except AttributeError: + raise TestSkipped + +def test(name, input, output, *args): + if verbose: + print 'string.%s%s =? %s... ' % (name, (input,) + args, output), + try: + # Prefer string methods over string module functions + try: + f = getattr(input, name) + value = apply(f, args) + except AttributeError: + f = getattr(string, name) + value = apply(f, (input,) + args) + except: + value = sys.exc_type + f = name + if value == output: + # if the original is returned make sure that + # this doesn't happen with subclasses + if value is input: + class ssub(str): + def __repr__(self): + return 'ssub(%r)' % str.__repr__(self) + input = ssub(input) + try: + f = getattr(input, name) + value = apply(f, args) + except AttributeError: + f = getattr(string, name) + value = apply(f, (input,) + args) + if value is input: + if verbose: + print 'no' + print '*',f, `input`, `output`, `value` + return + if value != output: + if verbose: + print 'no' + print f, `input`, `output`, `value` + else: + if verbose: + print 'yes' + +string_tests.run_module_tests(test) +string_tests.run_method_tests(test) + +string.whitespace +string.lowercase +string.uppercase + +# Float formatting +for prec in range(100): + formatstring = u'%%.%if' % prec + value = 0.01 + for x in range(60): + value = value * 3.141592655 / 3.0 * 10.0 + #print 'Overflow check for x=%i and prec=%i:' % \ + # (x, prec), + try: + result = formatstring % value + except OverflowError: + # The formatfloat() code in stringobject.c and + # unicodeobject.c uses a 120 byte buffer and switches from + # 'f' formatting to 'g' at precision 50, so we expect + # OverflowErrors for the ranges x < 50 and prec >= 67. + if x >= 50 or \ + prec < 67: + print '*** unexpected OverflowError for x=%i and prec=%i' % (x, prec) + else: + #print 'OverflowError' + pass + else: + #print result + pass + diff --git a/lib-python/2.2/test/test_strop.py b/lib-python/2.2/test/test_strop.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_strop.py @@ -0,0 +1,133 @@ +import warnings +warnings.filterwarnings("ignore", "", DeprecationWarning, __name__) +warnings.filterwarnings("ignore", "", DeprecationWarning, "unittest") +import strop +import test_support +import unittest + + +class StropFunctionTestCase(unittest.TestCase): + + def test_atoi(self): + self.assert_(strop.atoi(" 1 ") == 1) + self.assertRaises(ValueError, strop.atoi, " 1x") + self.assertRaises(ValueError, strop.atoi, " x1 ") + + def test_atol(self): + self.assert_(strop.atol(" 1 ") == 1L) + self.assertRaises(ValueError, strop.atol, " 1x") + self.assertRaises(ValueError, strop.atol, " x1 ") + + def test_atof(self): + self.assert_(strop.atof(" 1 ") == 1.0) + self.assertRaises(ValueError, strop.atof, " 1x") + self.assertRaises(ValueError, strop.atof, " x1 ") + + def test_capitalize(self): + self.assert_(strop.capitalize(" hello ") == " hello ") + self.assert_(strop.capitalize("hello ") == "Hello ") + + def test_find(self): + self.assert_(strop.find("abcdefghiabc", "abc") == 0) + self.assert_(strop.find("abcdefghiabc", "abc", 1) == 9) + self.assert_(strop.find("abcdefghiabc", "def", 4) == -1) + + def test_rfind(self): + self.assert_(strop.rfind("abcdefghiabc", "abc") == 9) + + def test_lower(self): + self.assert_(strop.lower("HeLLo") == "hello") + + def test_upper(self): + self.assert_(strop.upper("HeLLo") == "HELLO") + + def test_swapcase(self): + self.assert_(strop.swapcase("HeLLo cOmpUteRs") == "hEllO CoMPuTErS") + + def test_strip(self): + self.assert_(strop.strip(" \t\n hello \t\n ") == "hello") + + def test_lstrip(self): + self.assert_(strop.lstrip(" \t\n hello \t\n ") == "hello \t\n ") + + def test_rstrip(self): + self.assert_(strop.rstrip(" \t\n hello \t\n ") == " \t\n hello") + + def test_replace(self): + replace = strop.replace + self.assert_(replace("one!two!three!", '!', '@', 1) + == "one at two!three!") + self.assert_(replace("one!two!three!", '!', '@', 2) + == "one at two@three!") + self.assert_(replace("one!two!three!", '!', '@', 3) + == "one at two@three@") + self.assert_(replace("one!two!three!", '!', '@', 4) + == "one at two@three@") + + # CAUTION: a replace count of 0 means infinity only to strop, + # not to the string .replace() method or to the + # string.replace() function. + + self.assert_(replace("one!two!three!", '!', '@', 0) + == "one at two@three@") + self.assert_(replace("one!two!three!", '!', '@') + == "one at two@three@") + self.assert_(replace("one!two!three!", 'x', '@') + == "one!two!three!") + self.assert_(replace("one!two!three!", 'x', '@', 2) + == "one!two!three!") + + def test_split(self): + split = strop.split + self.assert_(split("this is the split function") + == ['this', 'is', 'the', 'split', 'function']) + self.assert_(split("a|b|c|d", '|') == ['a', 'b', 'c', 'd']) + self.assert_(split("a|b|c|d", '|', 2) == ['a', 'b', 'c|d']) + self.assert_(split("a b c d", None, 1) == ['a', 'b c d']) + self.assert_(split("a b c d", None, 2) == ['a', 'b', 'c d']) + self.assert_(split("a b c d", None, 3) == ['a', 'b', 'c', 'd']) + self.assert_(split("a b c d", None, 4) == ['a', 'b', 'c', 'd']) + self.assert_(split("a b c d", None, 0) == ['a', 'b', 'c', 'd']) + self.assert_(split("a b c d", None, 2) == ['a', 'b', 'c d']) + + def test_join(self): + self.assert_(strop.join(['a', 'b', 'c', 'd']) == 'a b c d') + self.assert_(strop.join(('a', 'b', 'c', 'd'), '') == 'abcd') + self.assert_(strop.join(Sequence()) == 'w x y z') + + # try a few long ones + self.assert_(strop.join(['x' * 100] * 100, ':') + == (('x' * 100) + ":") * 99 + "x" * 100) + self.assert_(strop.join(('x' * 100,) * 100, ':') + == (('x' * 100) + ":") * 99 + "x" * 100) + + def test_maketrans(self): + self.assert_(strop.maketrans("abc", "xyz") == transtable) + self.assertRaises(ValueError, strop.maketrans, "abc", "xyzq") + + def test_translate(self): + self.assert_(strop.translate("xyzabcdef", transtable, "def") + == "xyzxyz") + + def test_data_attributes(self): + strop.lowercase + strop.uppercase + strop.whitespace + + +transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377' + + +# join() now works with any sequence type. +class Sequence: + def __init__(self): self.seq = 'wxyz' + def __len__(self): return len(self.seq) + def __getitem__(self, i): return self.seq[i] + + +def test_main(): + test_support.run_unittest(StropFunctionTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_struct.py b/lib-python/2.2/test/test_struct.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_struct.py @@ -0,0 +1,441 @@ +from test_support import TestFailed, verbose, verify +import struct +## import pdb + +import sys +ISBIGENDIAN = sys.byteorder == "big" +del sys +verify((struct.pack('=i', 1)[0] == chr(0)) == ISBIGENDIAN, + "bigendian determination appears wrong") + +def string_reverse(s): + chars = list(s) + chars.reverse() + return "".join(chars) + +def bigendian_to_native(value): + if ISBIGENDIAN: + return value + else: + return string_reverse(value) + +def simple_err(func, *args): + try: + apply(func, args) + except struct.error: + pass + else: + raise TestFailed, "%s%s did not raise struct.error" % ( + func.__name__, args) +## pdb.set_trace() + +def any_err(func, *args): + try: + apply(func, args) + except (struct.error, OverflowError, TypeError): + pass + else: + raise TestFailed, "%s%s did not raise error" % ( + func.__name__, args) +## pdb.set_trace() + + +simple_err(struct.calcsize, 'Z') + +sz = struct.calcsize('i') +if sz * 3 != struct.calcsize('iii'): + raise TestFailed, 'inconsistent sizes' + +fmt = 'cbxxxxxxhhhhiillffd' +fmt3 = '3c3b18x12h6i6l6f3d' +sz = struct.calcsize(fmt) +sz3 = struct.calcsize(fmt3) +if sz * 3 != sz3: + raise TestFailed, 'inconsistent sizes (3*%s -> 3*%d = %d, %s -> %d)' % ( + `fmt`, sz, 3*sz, `fmt3`, sz3) + +simple_err(struct.pack, 'iii', 3) +simple_err(struct.pack, 'i', 3, 3, 3) +simple_err(struct.pack, 'i', 'foo') +simple_err(struct.unpack, 'd', 'flap') +s = struct.pack('ii', 1, 2) +simple_err(struct.unpack, 'iii', s) +simple_err(struct.unpack, 'i', s) + +c = 'a' +b = 1 +h = 255 +i = 65535 +l = 65536 +f = 3.1415 +d = 3.1415 + +for prefix in ('', '@', '<', '>', '=', '!'): + for format in ('xcbhilfd', 'xcBHILfd'): + format = prefix + format + if verbose: + print "trying:", format + s = struct.pack(format, c, b, h, i, l, f, d) + cp, bp, hp, ip, lp, fp, dp = struct.unpack(format, s) + if (cp != c or bp != b or hp != h or ip != i or lp != l or + int(100 * fp) != int(100 * f) or int(100 * dp) != int(100 * d)): + # ^^^ calculate only to two decimal places + raise TestFailed, "unpack/pack not transitive (%s, %s)" % ( + str(format), str((cp, bp, hp, ip, lp, fp, dp))) + +# Test some of the new features in detail + +# (format, argument, big-endian result, little-endian result, asymmetric) +tests = [ + ('c', 'a', 'a', 'a', 0), + ('xc', 'a', '\0a', '\0a', 0), + ('cx', 'a', 'a\0', 'a\0', 0), + ('s', 'a', 'a', 'a', 0), + ('0s', 'helloworld', '', '', 1), + ('1s', 'helloworld', 'h', 'h', 1), + ('9s', 'helloworld', 'helloworl', 'helloworl', 1), + ('10s', 'helloworld', 'helloworld', 'helloworld', 0), + ('11s', 'helloworld', 'helloworld\0', 'helloworld\0', 1), + ('20s', 'helloworld', 'helloworld'+10*'\0', 'helloworld'+10*'\0', 1), + ('b', 7, '\7', '\7', 0), + ('b', -7, '\371', '\371', 0), + ('B', 7, '\7', '\7', 0), + ('B', 249, '\371', '\371', 0), + ('h', 700, '\002\274', '\274\002', 0), + ('h', -700, '\375D', 'D\375', 0), + ('H', 700, '\002\274', '\274\002', 0), + ('H', 0x10000-700, '\375D', 'D\375', 0), + ('i', 70000000, '\004,\035\200', '\200\035,\004', 0), + ('i', -70000000, '\373\323\342\200', '\200\342\323\373', 0), + ('I', 70000000L, '\004,\035\200', '\200\035,\004', 0), + ('I', 0x100000000L-70000000, '\373\323\342\200', '\200\342\323\373', 0), + ('l', 70000000, '\004,\035\200', '\200\035,\004', 0), + ('l', -70000000, '\373\323\342\200', '\200\342\323\373', 0), + ('L', 70000000L, '\004,\035\200', '\200\035,\004', 0), + ('L', 0x100000000L-70000000, '\373\323\342\200', '\200\342\323\373', 0), + ('f', 2.0, '@\000\000\000', '\000\000\000@', 0), + ('d', 2.0, '@\000\000\000\000\000\000\000', + '\000\000\000\000\000\000\000@', 0), + ('f', -2.0, '\300\000\000\000', '\000\000\000\300', 0), + ('d', -2.0, '\300\000\000\000\000\000\000\000', + '\000\000\000\000\000\000\000\300', 0), +] + +for fmt, arg, big, lil, asy in tests: + if verbose: + print `fmt`, `arg`, `big`, `lil` + for (xfmt, exp) in [('>'+fmt, big), ('!'+fmt, big), ('<'+fmt, lil), + ('='+fmt, ISBIGENDIAN and big or lil)]: + res = struct.pack(xfmt, arg) + if res != exp: + raise TestFailed, "pack(%s, %s) -> %s # expected %s" % ( + `fmt`, `arg`, `res`, `exp`) + n = struct.calcsize(xfmt) + if n != len(res): + raise TestFailed, "calcsize(%s) -> %d # expected %d" % ( + `xfmt`, n, len(res)) + rev = struct.unpack(xfmt, res)[0] + if rev != arg and not asy: + raise TestFailed, "unpack(%s, %s) -> (%s,) # expected (%s,)" % ( + `fmt`, `res`, `rev`, `arg`) + +########################################################################### +# Simple native q/Q tests. + +has_native_qQ = 1 +try: + struct.pack("q", 5) +except struct.error: + has_native_qQ = 0 + +if verbose: + print "Platform has native q/Q?", has_native_qQ and "Yes." or "No." + +any_err(struct.pack, "Q", -1) # can't pack -1 as unsigned regardless +simple_err(struct.pack, "q", "a") # can't pack string as 'q' regardless +simple_err(struct.pack, "Q", "a") # ditto, but 'Q' + +def test_native_qQ(): + bytes = struct.calcsize('q') + # The expected values here are in big-endian format, primarily because + # I'm on a little-endian machine and so this is the clearest way (for + # me) to force the code to get exercised. + for format, input, expected in ( + ('q', -1, '\xff' * bytes), + ('q', 0, '\x00' * bytes), + ('Q', 0, '\x00' * bytes), + ('q', 1L, '\x00' * (bytes-1) + '\x01'), + ('Q', (1L << (8*bytes))-1, '\xff' * bytes), + ('q', (1L << (8*bytes-1))-1, '\x7f' + '\xff' * (bytes - 1))): + got = struct.pack(format, input) + native_expected = bigendian_to_native(expected) + verify(got == native_expected, + "%r-pack of %r gave %r, not %r" % + (format, input, got, native_expected)) + retrieved = struct.unpack(format, got)[0] + verify(retrieved == input, + "%r-unpack of %r gave %r, not %r" % + (format, got, retrieved, input)) + +if has_native_qQ: + test_native_qQ() + +########################################################################### +# Standard integer tests (bBhHiIlLqQ). + +import binascii + +class IntTester: + + # XXX Most std integer modes fail to test for out-of-range. + # The "i" and "l" codes appear to range-check OK on 32-bit boxes, but + # fail to check correctly on some 64-bit ones (Tru64 Unix + Compaq C + # reported by Mark Favas). + BUGGY_RANGE_CHECK = "bBhHiIlL" + + def __init__(self, formatpair, bytesize): + assert len(formatpair) == 2 + self.formatpair = formatpair + for direction in "<>!=": + for code in formatpair: + format = direction + code + verify(struct.calcsize(format) == bytesize) + self.bytesize = bytesize + self.bitsize = bytesize * 8 + self.signed_code, self.unsigned_code = formatpair + self.unsigned_min = 0 + self.unsigned_max = 2L**self.bitsize - 1 + self.signed_min = -(2L**(self.bitsize-1)) + self.signed_max = 2L**(self.bitsize-1) - 1 + + def test_one(self, x, pack=struct.pack, + unpack=struct.unpack, + unhexlify=binascii.unhexlify): + if verbose: + print "trying std", self.formatpair, "on", x, "==", hex(x) + + # Try signed. + code = self.signed_code + if self.signed_min <= x <= self.signed_max: + # Try big-endian. + expected = long(x) + if x < 0: + expected += 1L << self.bitsize + assert expected > 0 + expected = hex(expected)[2:-1] # chop "0x" and trailing 'L' + if len(expected) & 1: + expected = "0" + expected + expected = unhexlify(expected) + expected = "\x00" * (self.bytesize - len(expected)) + expected + + # Pack work? + format = ">" + code + got = pack(format, x) + verify(got == expected, + "'%s'-pack of %r gave %r, not %r" % + (format, x, got, expected)) + + # Unpack work? + retrieved = unpack(format, got)[0] + verify(x == retrieved, + "'%s'-unpack of %r gave %r, not %r" % + (format, got, retrieved, x)) + + # Adding any byte should cause a "too big" error. + any_err(unpack, format, '\x01' + got) + + # Try little-endian. + format = "<" + code + expected = string_reverse(expected) + + # Pack work? + got = pack(format, x) + verify(got == expected, + "'%s'-pack of %r gave %r, not %r" % + (format, x, got, expected)) + + # Unpack work? + retrieved = unpack(format, got)[0] + verify(x == retrieved, + "'%s'-unpack of %r gave %r, not %r" % + (format, got, retrieved, x)) + + # Adding any byte should cause a "too big" error. + any_err(unpack, format, '\x01' + got) + + else: + # x is out of range -- verify pack realizes that. + if code in self.BUGGY_RANGE_CHECK: + if verbose: + print "Skipping buggy range check for code", code + else: + any_err(pack, ">" + code, x) + any_err(pack, "<" + code, x) + + # Much the same for unsigned. + code = self.unsigned_code + if self.unsigned_min <= x <= self.unsigned_max: + # Try big-endian. + format = ">" + code + expected = long(x) + expected = hex(expected)[2:-1] # chop "0x" and trailing 'L' + if len(expected) & 1: + expected = "0" + expected + expected = unhexlify(expected) + expected = "\x00" * (self.bytesize - len(expected)) + expected + + # Pack work? + got = pack(format, x) + verify(got == expected, + "'%s'-pack of %r gave %r, not %r" % + (format, x, got, expected)) + + # Unpack work? + retrieved = unpack(format, got)[0] + verify(x == retrieved, + "'%s'-unpack of %r gave %r, not %r" % + (format, got, retrieved, x)) + + # Adding any byte should cause a "too big" error. + any_err(unpack, format, '\x01' + got) + + # Try little-endian. + format = "<" + code + expected = string_reverse(expected) + + # Pack work? + got = pack(format, x) + verify(got == expected, + "'%s'-pack of %r gave %r, not %r" % + (format, x, got, expected)) + + # Unpack work? + retrieved = unpack(format, got)[0] + verify(x == retrieved, + "'%s'-unpack of %r gave %r, not %r" % + (format, got, retrieved, x)) + + # Adding any byte should cause a "too big" error. + any_err(unpack, format, '\x01' + got) + + else: + # x is out of range -- verify pack realizes that. + if code in self.BUGGY_RANGE_CHECK: + if verbose: + print "Skipping buggy range check for code", code + else: + any_err(pack, ">" + code, x) + any_err(pack, "<" + code, x) + + def run(self): + from random import randrange + + # Create all interesting powers of 2. + values = [] + for exp in range(self.bitsize + 3): + values.append(1L << exp) + + # Add some random values. + for i in range(self.bitsize): + val = 0L + for j in range(self.bytesize): + val = (val << 8) | randrange(256) + values.append(val) + + # Try all those, and their negations, and +-1 from them. Note + # that this tests all power-of-2 boundaries in range, and a few out + # of range, plus +-(2**n +- 1). + for base in values: + for val in -base, base: + for incr in -1, 0, 1: + x = val + incr + try: + x = int(x) + except OverflowError: + pass + self.test_one(x) + + # Some error cases. + for direction in "<>": + for code in self.formatpair: + for badobject in "a string", 3+42j, randrange: + any_err(struct.pack, direction + code, badobject) + +for args in [("bB", 1), + ("hH", 2), + ("iI", 4), + ("lL", 4), + ("qQ", 8)]: + t = IntTester(*args) + t.run() + + +########################################################################### +# The p ("Pascal string") code. + +def test_p_code(): + for code, input, expected, expectedback in [ + ('p','abc', '\x00', ''), + ('1p', 'abc', '\x00', ''), + ('2p', 'abc', '\x01a', 'a'), + ('3p', 'abc', '\x02ab', 'ab'), + ('4p', 'abc', '\x03abc', 'abc'), + ('5p', 'abc', '\x03abc\x00', 'abc'), + ('6p', 'abc', '\x03abc\x00\x00', 'abc'), + ('1000p', 'x'*1000, '\xff' + 'x'*999, 'x'*255)]: + got = struct.pack(code, input) + if got != expected: + raise TestFailed("pack(%r, %r) == %r but expected %r" % + (code, input, got, expected)) + (got,) = struct.unpack(code, got) + if got != expectedback: + raise TestFailed("unpack(%r, %r) == %r but expected %r" % + (code, input, got, expectedback)) + +test_p_code() + + +########################################################################### +# SF bug 705836. "f" had a severe rounding bug, where a carry +# from the low-order discarded bits could propagate into the exponent +# field, causing the result to be wrong by a factor of 2. + +def test_705836(): + import math + + for base in range(1, 33): + # smaller <- largest representable float less than base. + delta = 0.5 + while base - delta / 2.0 != base: + delta /= 2.0 + smaller = base - delta + # Packing this rounds away a solid string of trailing 1 bits. + packed = struct.pack("f", smaller) + verify(bigpacked == string_reverse(packed), + ">f pack should be byte-reversal of f", bigpacked)[0] + verify(base == unpacked) + + # Largest finite IEEE single. + big = (1 << 24) - 1 + big = math.ldexp(big, 127 - 23) + packed = struct.pack(">f", big) + unpacked = struct.unpack(">f", packed)[0] + verify(big == unpacked) + + # The same, but tack on a 1 bit so it rounds up to infinity. + big = (1 << 25) - 1 + big = math.ldexp(big, 127 - 24) + try: + packed = struct.pack(">f", big) + except OverflowError: + pass + else: + TestFailed("expected OverflowError") + +test_705836() diff --git a/lib-python/2.2/test/test_structseq.py b/lib-python/2.2/test/test_structseq.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_structseq.py @@ -0,0 +1,28 @@ +from test_support import vereq + +import time + +t = time.gmtime() +astuple = tuple(t) +vereq(len(t), len(astuple)) +vereq(t, astuple) + +# Check that slicing works the same way; at one point, slicing t[i:j] with +# 0 < i < j could produce NULLs in the result. +for i in range(-len(t), len(t)): + for j in range(-len(t), len(t)): + vereq(t[i:j], astuple[i:j]) + +# Devious code could crash structseqs' contructors +class C: + def __getitem__(self, i): + raise IndexError + def __len__(self): + return 9 + +try: + repr(time.struct_time(C())) +except: + pass + +# XXX more needed diff --git a/lib-python/2.2/test/test_sunaudiodev.py b/lib-python/2.2/test/test_sunaudiodev.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_sunaudiodev.py @@ -0,0 +1,28 @@ +from test_support import verbose, findfile, TestFailed, TestSkipped +import sunaudiodev +import os + +try: + audiodev = os.environ["AUDIODEV"] +except KeyError: + audiodev = "/dev/audio" + +if not os.path.exists(audiodev): + raise TestSkipped("no audio device found!") + +def play_sound_file(path): + fp = open(path, 'r') + data = fp.read() + fp.close() + try: + a = sunaudiodev.open('w') + except sunaudiodev.error, msg: + raise TestFailed, msg + else: + a.write(data) + a.close() + +def test(): + play_sound_file(findfile('audiotest.au')) + +test() diff --git a/lib-python/2.2/test/test_sundry.py b/lib-python/2.2/test/test_sundry.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_sundry.py @@ -0,0 +1,102 @@ +"""Do a minimal test of all the modules that aren't otherwise tested.""" + +import warnings +warnings.filterwarnings('ignore', '', DeprecationWarning, 'posixfile') + +from test_support import verbose + +import BaseHTTPServer +import CGIHTTPServer +import Queue +import SimpleHTTPServer +import SocketServer +import aifc +import anydbm +import audiodev +import bdb +import cmd +import code +import codeop +import colorsys +import commands +import compileall +try: + import curses # not available on Windows +except ImportError: + if verbose: + print "skipping curses" +import dircache +import dis +import distutils +import doctest +import dumbdbm +import encodings +import filecmp +import fnmatch +import formatter +import fpformat +import ftplib +import getpass +import glob +import gopherlib +import htmlentitydefs +import htmllib +import httplib +import imaplib +import imghdr +import imputil +import keyword +#import knee +import macpath +import macurl2path +import mailcap +import mhlib +import mimetypes +import mimify +import multifile +import mutex +import nntplib +import nturl2path +import pdb +import pipes +#import poplib +import posixfile +import pre +import profile +import pstats +import py_compile +import pyclbr +#import reconvert +import repr +try: + import rlcompleter # not available on Windows +except ImportError: + if verbose: + print "skipping rlcompleter" +import robotparser +import sched +import sgmllib +import shelve +import shlex +import shutil +import smtplib +import sndhdr +import statcache +import statvfs +import stringold +import sunau +import sunaudio +import symbol +import tabnanny +import telnetlib +import test +import toaiff +#import tzparse +import urllib2 +# Can't test the "user" module -- if the user has a ~/.pythonrc.py, it +# can screw up all sorts of things (esp. if it prints!). +#import user +import webbrowser +import whichdb +import xdrlib +import xml diff --git a/lib-python/2.2/test/test_support.py b/lib-python/2.2/test/test_support.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_support.py @@ -0,0 +1,233 @@ +"""Supporting definitions for the Python regression test.""" + +import sys + +class Error(Exception): + """Base class for regression test exceptions.""" + +class TestFailed(Error): + """Test failed.""" + +class TestSkipped(Error): + """Test skipped. + + This can be raised to indicate that a test was deliberatly + skipped, but not because a feature wasn't available. For + example, if some resource can't be used, such as the network + appears to be unavailable, this should be raised instead of + TestFailed. + """ + +verbose = 1 # Flag set to 0 by regrtest.py +use_resources = None # Flag set to [] by regrtest.py + +# _original_stdout is meant to hold stdout at the time regrtest began. +# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever. +# The point is to have some flavor of stdout the user can actually see. +_original_stdout = None +def record_original_stdout(stdout): + global _original_stdout + _original_stdout = stdout + +def get_original_stdout(): + return _original_stdout or sys.stdout + +def unload(name): + try: + del sys.modules[name] + except KeyError: + pass + +def forget(modname): + unload(modname) + import os + for dirname in sys.path: + try: + os.unlink(os.path.join(dirname, modname + '.pyc')) + except os.error: + pass + +def requires(resource, msg=None): + if use_resources is not None and resource not in use_resources: + if msg is None: + msg = "Use of the `%s' resource not enabled" % resource + raise TestSkipped(msg) + +FUZZ = 1e-6 + +def fcmp(x, y): # fuzzy comparison function + if type(x) == type(0.0) or type(y) == type(0.0): + try: + x, y = coerce(x, y) + fuzz = (abs(x) + abs(y)) * FUZZ + if abs(x-y) <= fuzz: + return 0 + except: + pass + elif type(x) == type(y) and type(x) in (type(()), type([])): + for i in range(min(len(x), len(y))): + outcome = fcmp(x[i], y[i]) + if outcome != 0: + return outcome + return cmp(len(x), len(y)) + return cmp(x, y) + +try: + unicode + have_unicode = 1 +except NameError: + have_unicode = 0 + +is_jython = sys.platform.startswith('java') + +import os +# Filename used for testing +if os.name == 'java': + # Jython disallows @ in module names + TESTFN = '$test' +elif os.name != 'riscos': + TESTFN = '@test' + # Unicode name only used if TEST_FN_ENCODING exists for the platform. + if have_unicode: + TESTFN_UNICODE=unicode("@test-\xe0\xf2", "latin-1") # 2 latin characters. + if os.name=="nt": + TESTFN_ENCODING="mbcs" +else: + TESTFN = 'test' + +# Make sure we can write to TESTFN, try in /tmp if we can't +fp = None +try: + fp = open(TESTFN, 'w+') +except IOError: + TMP_TESTFN = os.path.join('/tmp', TESTFN) + try: + fp = open(TMP_TESTFN, 'w+') + TESTFN = TMP_TESTFN + del TMP_TESTFN + except IOError: + print ('WARNING: tests will fail, unable to write to: %s or %s' % + (TESTFN, TMP_TESTFN)) +if fp is not None: + fp.close() + try: + os.unlink(TESTFN) + except: + pass +del os, fp + +from os import unlink + +def findfile(file, here=__file__): + import os + if os.path.isabs(file): + return file + path = sys.path + path = [os.path.dirname(here)] + path + for dn in path: + fn = os.path.join(dn, file) + if os.path.exists(fn): return fn + return file + +def verify(condition, reason='test failed'): + """Verify that condition is true. If not, raise TestFailed. + + The optional argument reason can be given to provide + a better error text. + """ + + if not condition: + raise TestFailed(reason) + +def vereq(a, b): + if not (a == b): + raise TestFailed, "%r == %r" % (a, b) + +def sortdict(dict): + "Like repr(dict), but in sorted order." + items = dict.items() + items.sort() + reprpairs = ["%r: %r" % pair for pair in items] + withcommas = ", ".join(reprpairs) + return "{%s}" % withcommas + +def check_syntax(statement): + try: + compile(statement, '', 'exec') + except SyntaxError: + pass + else: + print 'Missing SyntaxError: "%s"' % statement + + + +#======================================================================= +# Preliminary PyUNIT integration. + +import unittest + + +class BasicTestRunner: + def run(self, test): + result = unittest.TestResult() + test(result) + return result + + +def run_suite(suite, testclass=None): + """Run tests from a unittest.TestSuite-derived class.""" + if verbose: + runner = unittest.TextTestRunner(sys.stdout, verbosity=2) + else: + runner = BasicTestRunner() + + result = runner.run(suite) + if not result.wasSuccessful(): + if len(result.errors) == 1 and not result.failures: + err = result.errors[0][1] + elif len(result.failures) == 1 and not result.errors: + err = result.failures[0][1] + else: + if testclass is None: + msg = "errors occurred; run in verbose mode for details" + else: + msg = "errors occurred in %s.%s" \ + % (testclass.__module__, testclass.__name__) + raise TestFailed(msg) + raise TestFailed(err) + + +def run_unittest(testclass): + """Run tests from a unittest.TestCase-derived class.""" + run_suite(unittest.makeSuite(testclass), testclass) + + +#======================================================================= +# doctest driver. + +def run_doctest(module, verbosity=None): + """Run doctest on the given module. Return (#failures, #tests). + + If optional argument verbosity is not specified (or is None), pass + test_support's belief about verbosity on to doctest. Else doctest's + usual behavior is used (it searches sys.argv for -v). + """ + + import doctest + + if verbosity is None: + verbosity = verbose + else: + verbosity = None + + # Direct doctest output (normally just errors) to real stdout; doctest + # output shouldn't be compared by regrtest. + save_stdout = sys.stdout + sys.stdout = get_original_stdout() + try: + f, t = doctest.testmod(module, verbose=verbosity) + if f: + raise TestFailed("%d of %d doctests failed" % (f, t)) + return f, t + finally: + sys.stdout = save_stdout diff --git a/lib-python/2.2/test/test_symtable.py b/lib-python/2.2/test/test_symtable.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_symtable.py @@ -0,0 +1,8 @@ +from test_support import verify + +import _symtable + +symbols = _symtable.symtable("def f(x): return x", "?", "exec") + +verify(symbols[0].name == "global") +verify(len([ste for ste in symbols.values() if ste.name == "f"]) == 1) diff --git a/lib-python/2.2/test/test_tempfile.py b/lib-python/2.2/test/test_tempfile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_tempfile.py @@ -0,0 +1,10 @@ +# SF bug #476138: tempfile behavior across platforms +# Ensure that a temp file can be closed any number of times without error. + +import tempfile + +f = tempfile.TemporaryFile("w+b") +f.write('abc\n') +f.close() +f.close() +f.close() diff --git a/lib-python/2.2/test/test_thread.py b/lib-python/2.2/test/test_thread.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_thread.py @@ -0,0 +1,117 @@ +# Very rudimentary test of thread module + +# Create a bunch of threads, let each do some work, wait until all are done + +from test_support import verbose +import random +import thread +import time + +mutex = thread.allocate_lock() +rmutex = thread.allocate_lock() # for calls to random +running = 0 +done = thread.allocate_lock() +done.acquire() + +numtasks = 10 + +def task(ident): + global running + rmutex.acquire() + delay = random.random() * numtasks + rmutex.release() + if verbose: + print 'task', ident, 'will run for', round(delay, 1), 'sec' + time.sleep(delay) + if verbose: + print 'task', ident, 'done' + mutex.acquire() + running = running - 1 + if running == 0: + done.release() + mutex.release() + +next_ident = 0 +def newtask(): + global next_ident, running + mutex.acquire() + next_ident = next_ident + 1 + if verbose: + print 'creating task', next_ident + thread.start_new_thread(task, (next_ident,)) + running = running + 1 + mutex.release() + +for i in range(numtasks): + newtask() + +print 'waiting for all tasks to complete' +done.acquire() +print 'all tasks done' + +class barrier: + def __init__(self, n): + self.n = n + self.waiting = 0 + self.checkin = thread.allocate_lock() + self.checkout = thread.allocate_lock() + self.checkout.acquire() + + def enter(self): + checkin, checkout = self.checkin, self.checkout + + checkin.acquire() + self.waiting = self.waiting + 1 + if self.waiting == self.n: + self.waiting = self.n - 1 + checkout.release() + return + checkin.release() + + checkout.acquire() + self.waiting = self.waiting - 1 + if self.waiting == 0: + checkin.release() + return + checkout.release() + +numtrips = 3 +def task2(ident): + global running + for i in range(numtrips): + if ident == 0: + # give it a good chance to enter the next + # barrier before the others are all out + # of the current one + delay = 0.001 + else: + rmutex.acquire() + delay = random.random() * numtasks + rmutex.release() + if verbose: + print 'task', ident, 'will run for', round(delay, 1), 'sec' + time.sleep(delay) + if verbose: + print 'task', ident, 'entering barrier', i + bar.enter() + if verbose: + print 'task', ident, 'leaving barrier', i + mutex.acquire() + running -= 1 + # Must release mutex before releasing done, else the main thread can + # exit and set mutex to None as part of global teardown; then + # mutex.release() raises AttributeError. + finished = running == 0 + mutex.release() + if finished: + done.release() + +print '\n*** Barrier Test ***' +if done.acquire(0): + raise ValueError, "'done' should have remained acquired" +bar = barrier(numtasks) +running = numtasks +for i in range(numtasks): + thread.start_new_thread(task2, (i,)) +done.acquire() +print 'all tasks done' diff --git a/lib-python/2.2/test/test_threaded_import.py b/lib-python/2.2/test/test_threaded_import.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_threaded_import.py @@ -0,0 +1,56 @@ +# This is a variant of the very old (early 90's) file +# Demo/threads/bug.py. It simply provokes a number of threads into +# trying to import the same module "at the same time". +# There are no pleasant failure modes -- most likely is that Python +# complains several times about module random having no attribute +# randrange, and then Python hangs. + +import thread +from test_support import verbose, TestSkipped + +critical_section = thread.allocate_lock() +done = thread.allocate_lock() + +def task(): + global N, critical_section, done + import random + x = random.randrange(1, 3) + critical_section.acquire() + N -= 1 + # Must release critical_section before releasing done, else the main + # thread can exit and set critical_section to None as part of global + # teardown; then critical_section.release() raises AttributeError. + finished = N == 0 + critical_section.release() + if finished: + done.release() + +# Tricky: When regrtest imports this module, the thread running regrtest +# grabs the import lock and won't let go of it until this module returns. +# All other threads attempting an import hang for the duration. Since +# this test spawns threads that do little *but* import, we can't do that +# successfully until after this module finishes importing and regrtest +# regains control. To make this work, a special case was added to +# regrtest to invoke a module's "test_main" function (if any) after +# importing it. + +def test_main(): # magic name! see above + global N, done + + import imp + if imp.lock_held(): + # This triggers on, e.g., from test import autotest. + raise TestSkipped("can't run when import lock is held") + + done.acquire() + for N in (20, 50) * 3: + if verbose: + print "Trying", N, "threads ...", + for i in range(N): + thread.start_new_thread(task, ()) + done.acquire() + if verbose: + print "OK." + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_threadedtempfile.py b/lib-python/2.2/test/test_threadedtempfile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_threadedtempfile.py @@ -0,0 +1,86 @@ +""" +Create and delete FILES_PER_THREAD temp files (via tempfile.TemporaryFile) +in each of NUM_THREADS threads, recording the number of successes and +failures. A failure is a bug in tempfile, and may be due to: + ++ Trying to create more than one tempfile with the same name. ++ Trying to delete a tempfile that doesn't still exist. ++ Something we've never seen before. + +By default, NUM_THREADS == 20 and FILES_PER_THREAD == 50. This is enough to +create about 150 failures per run under Win98SE in 2.0, and runs pretty +quickly. Guido reports needing to boost FILES_PER_THREAD to 500 before +provoking a 2.0 failure under Linux. Run the test alone to boost either +via cmdline switches: + +-f FILES_PER_THREAD (int) +-t NUM_THREADS (int) +""" + +NUM_THREADS = 20 # change w/ -t option +FILES_PER_THREAD = 50 # change w/ -f option + +import thread # If this fails, we can't test this module +import threading +from test_support import TestFailed +import StringIO +from traceback import print_exc + +startEvent = threading.Event() + +import tempfile +tempfile.gettempdir() # Do this now, to avoid spurious races later + +class TempFileGreedy(threading.Thread): + error_count = 0 + ok_count = 0 + + def run(self): + self.errors = StringIO.StringIO() + startEvent.wait() + for i in range(FILES_PER_THREAD): + try: + f = tempfile.TemporaryFile("w+b") + f.close() + except: + self.error_count += 1 + print_exc(file=self.errors) + else: + self.ok_count += 1 + +def _test(): + threads = [] + + print "Creating" + for i in range(NUM_THREADS): + t = TempFileGreedy() + threads.append(t) + t.start() + + print "Starting" + startEvent.set() + + print "Reaping" + ok = errors = 0 + for t in threads: + t.join() + ok += t.ok_count + errors += t.error_count + if t.error_count: + print '%s errors:\n%s' % (t.getName(), t.errors.getvalue()) + + msg = "Done: errors %d ok %d" % (errors, ok) + print msg + if errors: + raise TestFailed(msg) + +if __name__ == "__main__": + import sys, getopt + opts, args = getopt.getopt(sys.argv[1:], "t:f:") + for o, v in opts: + if o == "-f": + FILES_PER_THREAD = int(v) + elif o == "-t": + NUM_THREADS = int(v) + +_test() diff --git a/lib-python/2.2/test/test_threading.py b/lib-python/2.2/test/test_threading.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_threading.py @@ -0,0 +1,55 @@ +# Very rudimentary test of threading module + +# Create a bunch of threads, let each do some work, wait until all are done + +from test_support import verbose +import random +import threading +import time + +# This takes about n/3 seconds to run (about n/3 clumps of tasks, times +# about 1 second per clump). +numtasks = 10 + +# no more than 3 of the 10 can run at once +sema = threading.BoundedSemaphore(value=3) +mutex = threading.RLock() +running = 0 + +class TestThread(threading.Thread): + def run(self): + global running + delay = random.random() * 2 + if verbose: + print 'task', self.getName(), 'will run for', delay, 'sec' + sema.acquire() + mutex.acquire() + running = running + 1 + if verbose: + print running, 'tasks are running' + mutex.release() + time.sleep(delay) + if verbose: + print 'task', self.getName(), 'done' + mutex.acquire() + running = running - 1 + if verbose: + print self.getName(), 'is finished.', running, 'tasks are running' + mutex.release() + sema.release() + +threads = [] +def starttasks(): + for i in range(numtasks): + t = TestThread(name=""%i) + threads.append(t) + t.start() + +starttasks() + +if verbose: + print 'waiting for all tasks to complete' +for t in threads: + t.join() +if verbose: + print 'all tasks done' diff --git a/lib-python/2.2/test/test_time.py b/lib-python/2.2/test/test_time.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_time.py @@ -0,0 +1,50 @@ +import test_support +import time +import unittest + + +class TimeTestCase(unittest.TestCase): + + def setUp(self): + self.t = time.time() + + def test_data_attributes(self): + time.altzone + time.daylight + time.timezone + time.tzname + + def test_clock(self): + time.clock() + + def test_conversions(self): + self.assert_(time.ctime(self.t) + == time.asctime(time.localtime(self.t))) + self.assert_(long(time.mktime(time.localtime(self.t))) + == long(self.t)) + + def test_sleep(self): + time.sleep(1.2) + + def test_strftime(self): + tt = time.gmtime(self.t) + for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I', + 'j', 'm', 'M', 'p', 'S', + 'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'): + format = ' %' + directive + try: + time.strftime(format, tt) + except ValueError: + self.fail('conversion specifier: %r failed.' % format) + + def test_asctime(self): + time.asctime(time.gmtime(self.t)) + self.assertRaises(TypeError, time.asctime, 0) + + +def test_main(): + test_support.run_unittest(TimeTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_timing.py b/lib-python/2.2/test/test_timing.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_timing.py @@ -0,0 +1,21 @@ +from test_support import verbose +import timing + +r = range(100000) +if verbose: + print 'starting...' +timing.start() +for i in r: + pass +timing.finish() +if verbose: + print 'finished' + +secs = timing.seconds() +milli = timing.milli() +micro = timing.micro() + +if verbose: + print 'seconds:', secs + print 'milli :', milli + print 'micro :', micro diff --git a/lib-python/2.2/test/test_tokenize.py b/lib-python/2.2/test/test_tokenize.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_tokenize.py @@ -0,0 +1,9 @@ +from test_support import verbose, findfile +import tokenize, os, sys + +if verbose: + print 'starting...' +file = open(findfile('tokenize_tests'+os.extsep+'py')) +tokenize.tokenize(file.readline) +if verbose: + print 'finished' diff --git a/lib-python/2.2/test/test_trace.py b/lib-python/2.2/test/test_trace.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_trace.py @@ -0,0 +1,219 @@ +# Testing the line trace facility. + +import test_support +import unittest +import sys +import difflib + +if not __debug__: + raise test_support.TestSkipped, "tracing not supported under -O" + +# A very basic example. If this fails, we're in deep trouble. +def basic(): + return 1 + +basic.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (1, 'return')] + +# Armin Rigo's failing example: +def arigo_example(): + x = 1 + del x + while 0: + pass + x = 1 + +arigo_example.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'line'), + (5, 'line'), + (5, 'return')] + +# check that lines consisting of just one instruction get traced: +def one_instr_line(): + x = 1 + del x + x = 1 + +one_instr_line.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'return')] + +def no_pop_tops(): # 0 + x = 1 # 1 + for a in range(2): # 2 + if a: # 3 + x = 1 # 4 + else: # 5 + x = 1 # 6 + +no_pop_tops.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (2, 'line'), + (2, 'line'), + (3, 'line'), + (6, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (2, 'line'), + (2, 'return')] + +def no_pop_blocks(): + while 0: + bla + x = 1 + +no_pop_blocks.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (1, 'line'), + (3, 'line'), + (3, 'return')] + +def called(): # line -3 + x = 1 + +def call(): # line 0 + called() + +call.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (-3, 'call'), + (-3, 'line'), + (-2, 'line'), + (-2, 'return'), + (1, 'return')] + +def raises(): + raise Exception + +def test_raise(): + try: + raises() + except Exception, exc: + x = 1 + +test_raise.events = [(0, 'call'), + (0, 'line'), + (1, 'line'), + (2, 'line'), + (-3, 'call'), + (-3, 'line'), + (-2, 'line'), + (-2, 'exception'), + (2, 'exception'), + (3, 'line'), + (4, 'line'), + (4, 'return')] + +def _settrace_and_return(tracefunc): + sys.settrace(tracefunc) + sys._getframe().f_back.f_trace = tracefunc +def settrace_and_return(tracefunc): + _settrace_and_return(tracefunc) + +settrace_and_return.events = [(1, 'return')] + +def _settrace_and_raise(tracefunc): + sys.settrace(tracefunc) + sys._getframe().f_back.f_trace = tracefunc + raise RuntimeError +def settrace_and_raise(tracefunc): + try: + _settrace_and_raise(tracefunc) + except RuntimeError, exc: + pass + +settrace_and_raise.events = [(2, 'exception'), + (3, 'line'), + (4, 'line'), + (4, 'return')] + +class Tracer: + def __init__(self): + self.events = [] + def trace(self, frame, event, arg): + self.events.append((frame.f_lineno, event)) + return self.trace + +class TraceTestCase(unittest.TestCase): + def compare_events(self, line_offset, events, expected_events): + events = [(l - line_offset, e) for (l, e) in events] + if events != expected_events: + self.fail( + "events did not match expectation:\n" + + "\n".join(difflib.ndiff(map(str, expected_events), + map(str, events)))) + + + def run_test(self, func): + tracer = Tracer() + sys.settrace(tracer.trace) + func() + sys.settrace(None) + self.compare_events(func.func_code.co_firstlineno, + tracer.events, func.events) + + def run_test2(self, func): + tracer = Tracer() + func(tracer.trace) + sys.settrace(None) + self.compare_events(func.func_code.co_firstlineno, + tracer.events, func.events) + + def test_1_basic(self): + self.run_test(basic) + def test_2_arigo(self): + self.run_test(arigo_example) + def test_3_one_instr(self): + self.run_test(one_instr_line) + def test_4_no_pop_blocks(self): + self.run_test(no_pop_blocks) + def test_5_no_pop_tops(self): + self.run_test(no_pop_tops) + def test_6_call(self): + self.run_test(call) + def test_7_raise(self): + self.run_test(test_raise) + + def test_8_settrace_and_return(self): + self.run_test2(settrace_and_return) + def test_9_settrace_and_raise(self): + self.run_test2(settrace_and_raise) + +class RaisingTraceFuncTestCase(unittest.TestCase): + def test_it(self): + def tr(frame, event, arg): + raise ValueError # just something that isn't RuntimeError + def f(): + return 1 + try: + for i in xrange(sys.getrecursionlimit() + 1): + sys.settrace(tr) + try: + f() + except ValueError: + pass + else: + self.fail("exception not thrown!") + except RuntimeError: + self.fail("recursion counter not reset") + + +def test_main(): + test_support.run_unittest(TraceTestCase) + test_support.run_unittest(RaisingTraceFuncTestCase) + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_traceback.py b/lib-python/2.2/test/test_traceback.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_traceback.py @@ -0,0 +1,49 @@ +"""Test cases for traceback module""" + +import unittest +from test_support import run_unittest, is_jython + +import traceback + +class TracebackCases(unittest.TestCase): + # For now, a very minimal set of tests. I want to be sure that + # formatting of SyntaxErrors works based on changes for 2.1. + + def get_exception_format(self, func, exc): + try: + func() + except exc, value: + return traceback.format_exception_only(exc, value) + else: + raise ValueError, "call did not raise exception" + + def syntax_error_with_caret(self): + compile("def fact(x):\n\treturn x!\n", "?", "exec") + + def syntax_error_without_caret(self): + # XXX why doesn't compile raise the same traceback? + import badsyntax_nocaret + + def test_caret(self): + err = self.get_exception_format(self.syntax_error_with_caret, + SyntaxError) + self.assert_(len(err) == 4) + self.assert_("^" in err[2]) # third line has caret + self.assert_(err[1].strip() == "return x!") + + def test_nocaret(self): + if is_jython: + # jython adds a caret in this case (why shouldn't it?) + return + err = self.get_exception_format(self.syntax_error_without_caret, + SyntaxError) + self.assert_(len(err) == 3) + self.assert_(err[1].strip() == "[x for x in x] = x") + + +def test_main(): + run_unittest(TracebackCases) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_types.py b/lib-python/2.2/test/test_types.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_types.py @@ -0,0 +1,428 @@ +# Python test set -- part 6, built-in types + +from test_support import * + +print '6. Built-in types' + +print '6.1 Truth value testing' +if None: raise TestFailed, 'None is true instead of false' +if 0: raise TestFailed, '0 is true instead of false' +if 0L: raise TestFailed, '0L is true instead of false' +if 0.0: raise TestFailed, '0.0 is true instead of false' +if '': raise TestFailed, '\'\' is true instead of false' +if (): raise TestFailed, '() is true instead of false' +if []: raise TestFailed, '[] is true instead of false' +if {}: raise TestFailed, '{} is true instead of false' +if not 1: raise TestFailed, '1 is false instead of true' +if not 1L: raise TestFailed, '1L is false instead of true' +if not 1.0: raise TestFailed, '1.0 is false instead of true' +if not 'x': raise TestFailed, '\'x\' is false instead of true' +if not (1, 1): raise TestFailed, '(1, 1) is false instead of true' +if not [1]: raise TestFailed, '[1] is false instead of true' +if not {'x': 1}: raise TestFailed, '{\'x\': 1} is false instead of true' +def f(): pass +class C: pass +import sys +x = C() +if not f: raise TestFailed, 'f is false instead of true' +if not C: raise TestFailed, 'C is false instead of true' +if not sys: raise TestFailed, 'sys is false instead of true' +if not x: raise TestFailed, 'x is false instead of true' + +print '6.2 Boolean operations' +if 0 or 0: raise TestFailed, '0 or 0 is true instead of false' +if 1 and 1: pass +else: raise TestFailed, '1 and 1 is false instead of false' +if not 1: raise TestFailed, 'not 1 is true instead of false' + +print '6.3 Comparisons' +if 0 < 1 <= 1 == 1 >= 1 > 0 != 1: pass +else: raise TestFailed, 'int comparisons failed' +if 0L < 1L <= 1L == 1L >= 1L > 0L != 1L: pass +else: raise TestFailed, 'long int comparisons failed' +if 0.0 < 1.0 <= 1.0 == 1.0 >= 1.0 > 0.0 != 1.0: pass +else: raise TestFailed, 'float comparisons failed' +if '' < 'a' <= 'a' == 'a' < 'abc' < 'abd' < 'b': pass +else: raise TestFailed, 'string comparisons failed' +if 0 in [0] and 0 not in [1]: pass +else: raise TestFailed, 'membership test failed' +if None is None and [] is not []: pass +else: raise TestFailed, 'identity test failed' + +print '6.4 Numeric types (mostly conversions)' +if 0 != 0L or 0 != 0.0 or 0L != 0.0: raise TestFailed, 'mixed comparisons' +if 1 != 1L or 1 != 1.0 or 1L != 1.0: raise TestFailed, 'mixed comparisons' +if -1 != -1L or -1 != -1.0 or -1L != -1.0: + raise TestFailed, 'int/long/float value not equal' +if int(1.9) == 1 == int(1.1) and int(-1.1) == -1 == int(-1.9): pass +else: raise TestFailed, 'int() does not round properly' +if long(1.9) == 1L == long(1.1) and long(-1.1) == -1L == long(-1.9): pass +else: raise TestFailed, 'long() does not round properly' +if float(1) == 1.0 and float(-1) == -1.0 and float(0) == 0.0: pass +else: raise TestFailed, 'float() does not work properly' +print '6.4.1 32-bit integers' +if 12 + 24 != 36: raise TestFailed, 'int op' +if 12 + (-24) != -12: raise TestFailed, 'int op' +if (-12) + 24 != 12: raise TestFailed, 'int op' +if (-12) + (-24) != -36: raise TestFailed, 'int op' +if not 12 < 24: raise TestFailed, 'int op' +if not -24 < -12: raise TestFailed, 'int op' +# Test for a particular bug in integer multiply +xsize, ysize, zsize = 238, 356, 4 +if not (xsize*ysize*zsize == zsize*xsize*ysize == 338912): + raise TestFailed, 'int mul commutativity' +# And another. +m = -sys.maxint - 1 +for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor + prod = divisor * j + if prod != m: + raise TestFailed, "%r * %r == %r != %r" % (divisor, j, prod, m) + if type(prod) is not int: + raise TestFailed, ("expected type(prod) to be int, not %r" % + type(prod)) +# Check for expected * overflow to long. +for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor - 1 + prod = divisor * j + if type(prod) is not long: + raise TestFailed, ("expected type(%r) to be long, not %r" % + (prod, type(prod))) +# Check for expected * overflow to long. +m = sys.maxint +for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor + 1 + prod = divisor * j + if type(prod) is not long: + raise TestFailed, ("expected type(%r) to be long, not %r" % + (prod, type(prod))) + +print '6.4.2 Long integers' +if 12L + 24L != 36L: raise TestFailed, 'long op' +if 12L + (-24L) != -12L: raise TestFailed, 'long op' +if (-12L) + 24L != 12L: raise TestFailed, 'long op' +if (-12L) + (-24L) != -36L: raise TestFailed, 'long op' +if not 12L < 24L: raise TestFailed, 'long op' +if not -24L < -12L: raise TestFailed, 'long op' +x = sys.maxint +if int(long(x)) != x: raise TestFailed, 'long op' +try: int(long(x)+1L) +except OverflowError: pass +else:raise TestFailed, 'long op' +x = -x +if int(long(x)) != x: raise TestFailed, 'long op' +x = x-1 +if int(long(x)) != x: raise TestFailed, 'long op' +try: int(long(x)-1L) +except OverflowError: pass +else:raise TestFailed, 'long op' +print '6.4.3 Floating point numbers' +if 12.0 + 24.0 != 36.0: raise TestFailed, 'float op' +if 12.0 + (-24.0) != -12.0: raise TestFailed, 'float op' +if (-12.0) + 24.0 != 12.0: raise TestFailed, 'float op' +if (-12.0) + (-24.0) != -36.0: raise TestFailed, 'float op' +if not 12.0 < 24.0: raise TestFailed, 'float op' +if not -24.0 < -12.0: raise TestFailed, 'float op' + +print '6.5 Sequence types' + +print '6.5.1 Strings' +if len('') != 0: raise TestFailed, 'len(\'\')' +if len('a') != 1: raise TestFailed, 'len(\'a\')' +if len('abcdef') != 6: raise TestFailed, 'len(\'abcdef\')' +if 'xyz' + 'abcde' != 'xyzabcde': raise TestFailed, 'string concatenation' +if 'xyz'*3 != 'xyzxyzxyz': raise TestFailed, 'string repetition *3' +if 0*'abcde' != '': raise TestFailed, 'string repetition 0*' +if min('abc') != 'a' or max('abc') != 'c': raise TestFailed, 'min/max string' +if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': pass +else: raise TestFailed, 'in/not in string' +x = 'x'*103 +if '%s!'%x != x+'!': raise TestFailed, 'nasty string formatting bug' + +print '6.5.2 Tuples' +if len(()) != 0: raise TestFailed, 'len(())' +if len((1,)) != 1: raise TestFailed, 'len((1,))' +if len((1,2,3,4,5,6)) != 6: raise TestFailed, 'len((1,2,3,4,5,6))' +if (1,2)+(3,4) != (1,2,3,4): raise TestFailed, 'tuple concatenation' +if (1,2)*3 != (1,2,1,2,1,2): raise TestFailed, 'tuple repetition *3' +if 0*(1,2,3) != (): raise TestFailed, 'tuple repetition 0*' +if min((1,2)) != 1 or max((1,2)) != 2: raise TestFailed, 'min/max tuple' +if 0 in (0,1,2) and 1 in (0,1,2) and 2 in (0,1,2) and 3 not in (0,1,2): pass +else: raise TestFailed, 'in/not in tuple' + +print '6.5.3 Lists' +if len([]) != 0: raise TestFailed, 'len([])' +if len([1,]) != 1: raise TestFailed, 'len([1,])' +if len([1,2,3,4,5,6]) != 6: raise TestFailed, 'len([1,2,3,4,5,6])' +if [1,2]+[3,4] != [1,2,3,4]: raise TestFailed, 'list concatenation' +if [1,2]*3 != [1,2,1,2,1,2]: raise TestFailed, 'list repetition *3' +if [1,2]*3L != [1,2,1,2,1,2]: raise TestFailed, 'list repetition *3L' +if 0*[1,2,3] != []: raise TestFailed, 'list repetition 0*' +if 0L*[1,2,3] != []: raise TestFailed, 'list repetition 0L*' +if min([1,2]) != 1 or max([1,2]) != 2: raise TestFailed, 'min/max list' +if 0 in [0,1,2] and 1 in [0,1,2] and 2 in [0,1,2] and 3 not in [0,1,2]: pass +else: raise TestFailed, 'in/not in list' +a = [1, 2, 3, 4, 5] +a[:-1] = a +if a != [1, 2, 3, 4, 5, 5]: + raise TestFailed, "list self-slice-assign (head)" +a = [1, 2, 3, 4, 5] +a[1:] = a +if a != [1, 1, 2, 3, 4, 5]: + raise TestFailed, "list self-slice-assign (tail)" +a = [1, 2, 3, 4, 5] +a[1:-1] = a +if a != [1, 1, 2, 3, 4, 5, 5]: + raise TestFailed, "list self-slice-assign (center)" + + +print '6.5.3a Additional list operations' +a = [0,1,2,3,4] +a[0L] = 1 +a[1L] = 2 +a[2L] = 3 +if a != [1,2,3,3,4]: raise TestFailed, 'list item assignment [0L], [1L], [2L]' +a[0] = 5 +a[1] = 6 +a[2] = 7 +if a != [5,6,7,3,4]: raise TestFailed, 'list item assignment [0], [1], [2]' +a[-2L] = 88 +a[-1L] = 99 +if a != [5,6,7,88,99]: raise TestFailed, 'list item assignment [-2L], [-1L]' +a[-2] = 8 +a[-1] = 9 +if a != [5,6,7,8,9]: raise TestFailed, 'list item assignment [-2], [-1]' +a[:2] = [0,4] +a[-3:] = [] +a[1:1] = [1,2,3] +if a != [0,1,2,3,4]: raise TestFailed, 'list slice assignment' +a[ 1L : 4L] = [7,8,9] +if a != [0,7,8,9,4]: raise TestFailed, 'list slice assignment using long ints' +del a[1:4] +if a != [0,4]: raise TestFailed, 'list slice deletion' +del a[0] +if a != [4]: raise TestFailed, 'list item deletion [0]' +del a[-1] +if a != []: raise TestFailed, 'list item deletion [-1]' +a=range(0,5) +del a[1L:4L] +if a != [0,4]: raise TestFailed, 'list slice deletion' +del a[0L] +if a != [4]: raise TestFailed, 'list item deletion [0]' +del a[-1L] +if a != []: raise TestFailed, 'list item deletion [-1]' +a.append(0) +a.append(1) +a.append(2) +if a != [0,1,2]: raise TestFailed, 'list append' +a.insert(0, -2) +a.insert(1, -1) +a.insert(2,0) +if a != [-2,-1,0,0,1,2]: raise TestFailed, 'list insert' +if a.count(0) != 2: raise TestFailed, ' list count' +if a.index(0) != 2: raise TestFailed, 'list index' +a.remove(0) +if a != [-2,-1,0,1,2]: raise TestFailed, 'list remove' +a.reverse() +if a != [2,1,0,-1,-2]: raise TestFailed, 'list reverse' +a.sort() +if a != [-2,-1,0,1,2]: raise TestFailed, 'list sort' +def revcmp(a, b): return cmp(b, a) +a.sort(revcmp) +if a != [2,1,0,-1,-2]: raise TestFailed, 'list sort with cmp func' +# The following dumps core in unpatched Python 1.5: +def myComparison(x,y): + return cmp(x%3, y%7) +z = range(12) +z.sort(myComparison) + +# Test extreme cases with long ints +a = [0,1,2,3,4] +if a[ -pow(2,128L): 3 ] != [0,1,2]: + raise TestFailed, "list slicing with too-small long integer" +if a[ 3: pow(2,145L) ] != [3,4]: + raise TestFailed, "list slicing with too-large long integer" + +print '6.6 Mappings == Dictionaries' +d = {} +if d.keys() != []: raise TestFailed, '{}.keys()' +if d.has_key('a') != 0: raise TestFailed, '{}.has_key(\'a\')' +if ('a' in d) != 0: raise TestFailed, "'a' in {}" +if ('a' not in d) != 1: raise TestFailed, "'a' not in {}" +if len(d) != 0: raise TestFailed, 'len({})' +d = {'a': 1, 'b': 2} +if len(d) != 2: raise TestFailed, 'len(dict)' +k = d.keys() +k.sort() +if k != ['a', 'b']: raise TestFailed, 'dict keys()' +if d.has_key('a') and d.has_key('b') and not d.has_key('c'): pass +else: raise TestFailed, 'dict keys()' +if 'a' in d and 'b' in d and 'c' not in d: pass +else: raise TestFailed, 'dict keys() # in/not in version' +if d['a'] != 1 or d['b'] != 2: raise TestFailed, 'dict item' +d['c'] = 3 +d['a'] = 4 +if d['c'] != 3 or d['a'] != 4: raise TestFailed, 'dict item assignment' +del d['b'] +if d != {'a': 4, 'c': 3}: raise TestFailed, 'dict item deletion' +# dict.clear() +d = {1:1, 2:2, 3:3} +d.clear() +if d != {}: raise TestFailed, 'dict clear' +# dict.update() +d.update({1:100}) +d.update({2:20}) +d.update({1:1, 2:2, 3:3}) +if d != {1:1, 2:2, 3:3}: raise TestFailed, 'dict update' +d.clear() +try: d.update(None) +except AttributeError: pass +else: raise TestFailed, 'dict.update(None), AttributeError expected' +class SimpleUserDict: + def __init__(self): + self.d = {1:1, 2:2, 3:3} + def keys(self): + return self.d.keys() + def __getitem__(self, i): + return self.d[i] +d.update(SimpleUserDict()) +if d != {1:1, 2:2, 3:3}: raise TestFailed, 'dict.update(instance)' +d.clear() +class FailingUserDict: + def keys(self): + raise ValueError +try: d.update(FailingUserDict()) +except ValueError: pass +else: raise TestFailed, 'dict.keys() expected ValueError' +class FailingUserDict: + def keys(self): + class BogonIter: + def __iter__(self): + raise ValueError + return BogonIter() +try: d.update(FailingUserDict()) +except ValueError: pass +else: raise TestFailed, 'iter(dict.keys()) expected ValueError' +class FailingUserDict: + def keys(self): + class BogonIter: + def __init__(self): + self.i = 1 + def __iter__(self): + return self + def next(self): + if self.i: + self.i = 0 + return 'a' + raise ValueError + return BogonIter() + def __getitem__(self, key): + return key +try: d.update(FailingUserDict()) +except ValueError: pass +else: raise TestFailed, 'iter(dict.keys()).next() expected ValueError' +class FailingUserDict: + def keys(self): + class BogonIter: + def __init__(self): + self.i = ord('a') + def __iter__(self): + return self + def next(self): + if self.i <= ord('z'): + rtn = chr(self.i) + self.i += 1 + return rtn + raise StopIteration + return BogonIter() + def __getitem__(self, key): + raise ValueError +try: d.update(FailingUserDict()) +except ValueError: pass +else: raise TestFailed, 'dict.update(), __getitem__ expected ValueError' +# dict.copy() +d = {1:1, 2:2, 3:3} +if d.copy() != {1:1, 2:2, 3:3}: raise TestFailed, 'dict copy' +if {}.copy() != {}: raise TestFailed, 'empty dict copy' +# dict.get() +d = {} +if d.get('c') is not None: raise TestFailed, 'missing {} get, no 2nd arg' +if d.get('c', 3) != 3: raise TestFailed, 'missing {} get, w/ 2nd arg' +d = {'a' : 1, 'b' : 2} +if d.get('c') is not None: raise TestFailed, 'missing dict get, no 2nd arg' +if d.get('c', 3) != 3: raise TestFailed, 'missing dict get, w/ 2nd arg' +if d.get('a') != 1: raise TestFailed, 'present dict get, no 2nd arg' +if d.get('a', 3) != 1: raise TestFailed, 'present dict get, w/ 2nd arg' +# dict.setdefault() +d = {} +if d.setdefault('key0') is not None: + raise TestFailed, 'missing {} setdefault, no 2nd arg' +if d.setdefault('key0') is not None: + raise TestFailed, 'present {} setdefault, no 2nd arg' +d.setdefault('key', []).append(3) +if d['key'][0] != 3: + raise TestFailed, 'missing {} setdefault, w/ 2nd arg' +d.setdefault('key', []).append(4) +if len(d['key']) != 2: + raise TestFailed, 'present {} setdefault, w/ 2nd arg' +# dict.popitem() +for copymode in -1, +1: + # -1: b has same structure as a + # +1: b is a.copy() + for log2size in range(12): + size = 2**log2size + a = {} + b = {} + for i in range(size): + a[`i`] = i + if copymode < 0: + b[`i`] = i + if copymode > 0: + b = a.copy() + for i in range(size): + ka, va = ta = a.popitem() + if va != int(ka): raise TestFailed, "a.popitem: %s" % str(ta) + kb, vb = tb = b.popitem() + if vb != int(kb): raise TestFailed, "b.popitem: %s" % str(tb) + if copymode < 0 and ta != tb: + raise TestFailed, "a.popitem != b.popitem: %s, %s" % ( + str(ta), str(tb)) + if a: raise TestFailed, 'a not empty after popitems: %s' % str(a) + if b: raise TestFailed, 'b not empty after popitems: %s' % str(b) + +try: type(1, 2) +except TypeError: pass +else: raise TestFailed, 'type(), w/2 args expected TypeError' + +try: type(1, 2, 3, 4) +except TypeError: pass +else: raise TestFailed, 'type(), w/4 args expected TypeError' + +print '6.7 Buffers' +try: buffer('asdf', -1) +except ValueError: pass +else: raise TestFailed, "buffer('asdf', -1) should raise ValueError" + +try: buffer(None) +except TypeError: pass +else: raise TestFailed, "buffer(None) should raise TypeError" + +a = buffer('asdf') +hash(a) +b = a * 5 +if a == b: + raise TestFailed, 'buffers should not be equal' +if str(b) != ('asdf' * 5): + raise TestFailed, 'repeated buffer has wrong content' +if str(a * 0) != '': + raise TestFailed, 'repeated buffer zero times has wrong content' +if str(a + buffer('def')) != 'asdfdef': + raise TestFailed, 'concatenation of buffers yields wrong content' + +try: a[1] = 'g' +except TypeError: pass +else: raise TestFailed, "buffer assignment should raise TypeError" + +try: a[0:1] = 'g' +except TypeError: pass +else: raise TestFailed, "buffer slice assignment should raise TypeError" diff --git a/lib-python/2.2/test/test_ucn.py b/lib-python/2.2/test/test_ucn.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_ucn.py @@ -0,0 +1,113 @@ +""" Test script for the Unicode implementation. + +Written by Bill Tutt. +Modified for Python 2.0 by Fredrik Lundh (fredrik at pythonware.com) + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" +from test_support import verify, verbose + +print 'Testing General Unicode Character Name, and case insensitivity...', + +# General and case insensitivity test: +try: + # put all \N escapes inside exec'd raw strings, to make sure this + # script runs even if the compiler chokes on \N escapes + exec r""" +s = u"\N{LATIN CAPITAL LETTER T}" \ + u"\N{LATIN SMALL LETTER H}" \ + u"\N{LATIN SMALL LETTER E}" \ + u"\N{SPACE}" \ + u"\N{LATIN SMALL LETTER R}" \ + u"\N{LATIN CAPITAL LETTER E}" \ + u"\N{LATIN SMALL LETTER D}" \ + u"\N{SPACE}" \ + u"\N{LATIN SMALL LETTER f}" \ + u"\N{LATIN CAPITAL LeTtEr o}" \ + u"\N{LATIN SMaLl LETTER x}" \ + u"\N{SPACE}" \ + u"\N{LATIN SMALL LETTER A}" \ + u"\N{LATIN SMALL LETTER T}" \ + u"\N{LATIN SMALL LETTER E}" \ + u"\N{SPACE}" \ + u"\N{LATIN SMALL LETTER T}" \ + u"\N{LATIN SMALL LETTER H}" \ + u"\N{LATIN SMALL LETTER E}" \ + u"\N{SpAcE}" \ + u"\N{LATIN SMALL LETTER S}" \ + u"\N{LATIN SMALL LETTER H}" \ + u"\N{LATIN SMALL LETTER E}" \ + u"\N{LATIN SMALL LETTER E}" \ + u"\N{LATIN SMALL LETTER P}" \ + u"\N{FULL STOP}" +verify(s == u"The rEd fOx ate the sheep.", s) +""" +except UnicodeError, v: + print v +print "done." + +import unicodedata + +print "Testing name to code mapping....", +for char in "SPAM": + name = "LATIN SMALL LETTER %s" % char + code = unicodedata.lookup(name) + verify(unicodedata.name(code) == name) +print "done." + +print "Testing code to name mapping for all characters....", +count = 0 +for code in range(65536): + try: + char = unichr(code) + name = unicodedata.name(char) + verify(unicodedata.lookup(name) == char) + count += 1 + except (KeyError, ValueError): + pass +print "done." + +print "Found", count, "characters in the unicode name database" + +# misc. symbol testing +print "Testing misc. symbols for unicode character name expansion....", +exec r""" +verify(u"\N{PILCROW SIGN}" == u"\u00b6") +verify(u"\N{REPLACEMENT CHARACTER}" == u"\uFFFD") +verify(u"\N{HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK}" == u"\uFF9F") +verify(u"\N{FULLWIDTH LATIN SMALL LETTER A}" == u"\uFF41") +""" +print "done." + +# strict error testing: +print "Testing unicode character name expansion strict error handling....", +try: + unicode("\N{blah}", 'unicode-escape', 'strict') +except UnicodeError: + pass +else: + raise AssertionError, "failed to raise an exception when given a bogus character name" + +try: + unicode("\N{" + "x" * 100000 + "}", 'unicode-escape', 'strict') +except UnicodeError: + pass +else: + raise AssertionError, "failed to raise an exception when given a very " \ + "long bogus character name" + +try: + unicode("\N{SPACE", 'unicode-escape', 'strict') +except UnicodeError: + pass +else: + raise AssertionError, "failed to raise an exception for a missing closing brace." + +try: + unicode("\NSPACE", 'unicode-escape', 'strict') +except UnicodeError: + pass +else: + raise AssertionError, "failed to raise an exception for a missing opening brace." +print "done." diff --git a/lib-python/2.2/test/test_unary.py b/lib-python/2.2/test/test_unary.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_unary.py @@ -0,0 +1,58 @@ +"""Test compiler changes for unary ops (+, -, ~) introduced in Python 2.2""" + +import unittest +from test_support import run_unittest + +class UnaryOpTestCase(unittest.TestCase): + + def test_negative(self): + self.assert_(-2 == 0 - 2) + self.assert_(-0 == 0) + self.assert_(--2 == 2) + self.assert_(-2L == 0 - 2L) + self.assert_(-2.0 == 0 - 2.0) + self.assert_(-2j == 0 - 2j) + + def test_positive(self): + self.assert_(+2 == 2) + self.assert_(+0 == 0) + self.assert_(++2 == 2) + self.assert_(+2L == 2L) + self.assert_(+2.0 == 2.0) + self.assert_(+2j == 2j) + + def test_invert(self): + self.assert_(-2 == 0 - 2) + self.assert_(-0 == 0) + self.assert_(--2 == 2) + self.assert_(-2L == 0 - 2L) + + def test_no_overflow(self): + nines = "9" * 32 + self.assert_(eval("+" + nines) == eval("+" + nines + "L")) + self.assert_(eval("-" + nines) == eval("-" + nines + "L")) + self.assert_(eval("~" + nines) == eval("~" + nines + "L")) + + def test_negation_of_exponentiation(self): + # Make sure '**' does the right thing; these form a + # regression test for SourceForge bug #456756. + self.assertEqual(-2 ** 3, -8) + self.assertEqual((-2) ** 3, -8) + self.assertEqual(-2 ** 4, -16) + self.assertEqual((-2) ** 4, 16) + + def test_bad_types(self): + for op in '+', '-', '~': + self.assertRaises(TypeError, eval, op + "'a'") + self.assertRaises(TypeError, eval, op + "u'a'") + + self.assertRaises(TypeError, eval, "~2j") + self.assertRaises(TypeError, eval, "~2.0") + + +def test_main(): + run_unittest(UnaryOpTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_unicode.py b/lib-python/2.2/test/test_unicode.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_unicode.py @@ -0,0 +1,782 @@ +""" Test script for the Unicode implementation. + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" +from test_support import verify, verbose, TestFailed +import sys, string + +if not sys.platform.startswith('java'): + # Test basic sanity of repr() + verify(repr(u'abc') == "u'abc'") + verify(repr(u'ab\\c') == "u'ab\\\\c'") + verify(repr(u'ab\\') == "u'ab\\\\'") + verify(repr(u'\\c') == "u'\\\\c'") + verify(repr(u'\\') == "u'\\\\'") + verify(repr(u'\n') == "u'\\n'") + verify(repr(u'\r') == "u'\\r'") + verify(repr(u'\t') == "u'\\t'") + verify(repr(u'\b') == "u'\\x08'") + verify(repr(u"'\"") == """u'\\'"'""") + verify(repr(u"'\"") == """u'\\'"'""") + verify(repr(u"'") == '''u"'"''') + verify(repr(u'"') == """u'"'""") + verify(repr(u''.join(map(unichr, range(256)))) == + "u'\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r" + "\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a" + "\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHI" + "JKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f" + "\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d" + "\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b" + "\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9" + "\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7" + "\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5" + "\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3" + "\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1" + "\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef" + "\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd" + "\\xfe\\xff'") + +def test(method, input, output, *args): + if verbose: + print '%s.%s%s =? %s... ' % (repr(input), method, args, repr(output)), + try: + f = getattr(input, method) + value = apply(f, args) + except: + value = sys.exc_type + exc = sys.exc_info()[:2] + else: + exc = None + if value == output and type(value) is type(output): + # if the original is returned make sure that + # this doesn't happen with subclasses + if value is input: + class usub(unicode): + def __repr__(self): + return 'usub(%r)' % unicode.__repr__(self) + input = usub(input) + try: + f = getattr(input, method) + value = apply(f, args) + except: + value = sys.exc_type + exc = sys.exc_info()[:2] + if value is input: + if verbose: + print 'no' + print '*',f, `input`, `output`, `value` + return + if value != output or type(value) is not type(output): + if verbose: + print 'no' + print '*',f, `input`, `output`, `value` + if exc: + print ' value == %s: %s' % (exc) + else: + if verbose: + print 'yes' + +test('capitalize', u' hello ', u' hello ') +test('capitalize', u'hello ', u'Hello ') +test('capitalize', u'aaaa', u'Aaaa') +test('capitalize', u'AaAa', u'Aaaa') + +test('count', u'aaa', 3, u'a') +test('count', u'aaa', 0, u'b') +test('count', 'aaa', 3, u'a') +test('count', 'aaa', 0, u'b') +test('count', u'aaa', 3, 'a') +test('count', u'aaa', 0, 'b') + +test('title', u' hello ', u' Hello ') +test('title', u'hello ', u'Hello ') +test('title', u"fOrMaT thIs aS titLe String", u'Format This As Title String') +test('title', u"fOrMaT,thIs-aS*titLe;String", u'Format,This-As*Title;String') +test('title', u"getInt", u'Getint') + +test('find', u'abcdefghiabc', 0, u'abc') +test('find', u'abcdefghiabc', 9, u'abc', 1) +test('find', u'abcdefghiabc', -1, u'def', 4) + +test('rfind', u'abcdefghiabc', 9, u'abc') +test('rfind', 'abcdefghiabc', 9, u'abc') +test('rfind', 'abcdefghiabc', 12, u'') +test('rfind', u'abcdefghiabc', 12, '') +test('rfind', u'abcdefghiabc', 12, u'') + +test('lower', u'HeLLo', u'hello') +test('lower', u'hello', u'hello') + +test('upper', u'HeLLo', u'HELLO') +test('upper', u'HELLO', u'HELLO') + +if 0: + transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377' + + test('maketrans', u'abc', transtable, u'xyz') + test('maketrans', u'abc', ValueError, u'xyzq') + +test('split', u'this is the split function', + [u'this', u'is', u'the', u'split', u'function']) +test('split', u'a|b|c|d', [u'a', u'b', u'c', u'd'], u'|') +test('split', u'a|b|c|d', [u'a', u'b', u'c|d'], u'|', 2) +test('split', u'a b c d', [u'a', u'b c d'], None, 1) +test('split', u'a b c d', [u'a', u'b', u'c d'], None, 2) +test('split', u'a b c d', [u'a', u'b', u'c', u'd'], None, 3) +test('split', u'a b c d', [u'a', u'b', u'c', u'd'], None, 4) +test('split', u'a b c d', [u'a b c d'], None, 0) +test('split', u'a b c d', [u'a', u'b', u'c d'], None, 2) +test('split', u'a b c d ', [u'a', u'b', u'c', u'd']) +test('split', u'a//b//c//d', [u'a', u'b', u'c', u'd'], u'//') +test('split', u'a//b//c//d', [u'a', u'b', u'c', u'd'], '//') +test('split', 'a//b//c//d', [u'a', u'b', u'c', u'd'], u'//') +test('split', u'endcase test', [u'endcase ', u''], u'test') +test('split', u'endcase test', [u'endcase ', u''], 'test') +test('split', 'endcase test', [u'endcase ', u''], u'test') + + +# join now works with any sequence type +class Sequence: + def __init__(self, seq): self.seq = seq + def __len__(self): return len(self.seq) + def __getitem__(self, i): return self.seq[i] + +test('join', u' ', u'a b c d', [u'a', u'b', u'c', u'd']) +test('join', u' ', u'a b c d', ['a', 'b', u'c', u'd']) +test('join', u'', u'abcd', (u'a', u'b', u'c', u'd')) +test('join', u' ', u'w x y z', Sequence('wxyz')) +test('join', u' ', TypeError, 7) +test('join', u' ', TypeError, Sequence([7, u'hello', 123L])) +test('join', ' ', u'a b c d', [u'a', u'b', u'c', u'd']) +test('join', ' ', u'a b c d', ['a', 'b', u'c', u'd']) +test('join', '', u'abcd', (u'a', u'b', u'c', u'd')) +test('join', ' ', u'w x y z', Sequence(u'wxyz')) +test('join', ' ', TypeError, 7) + +result = u'' +for i in range(10): + if i > 0: + result = result + u':' + result = result + u'x'*10 +test('join', u':', result, [u'x' * 10] * 10) +test('join', u':', result, (u'x' * 10,) * 10) + +test('strip', u' hello ', u'hello') +test('lstrip', u' hello ', u'hello ') +test('rstrip', u' hello ', u' hello') +test('strip', u'hello', u'hello') + +# strip/lstrip/rstrip with None arg +test('strip', u' hello ', u'hello', None) +test('lstrip', u' hello ', u'hello ', None) +test('rstrip', u' hello ', u' hello', None) +test('strip', u'hello', u'hello', None) + +# strip/lstrip/rstrip with unicode arg +test('strip', u'xyzzyhelloxyzzy', u'hello', u'xyz') +test('lstrip', u'xyzzyhelloxyzzy', u'helloxyzzy', u'xyz') +test('rstrip', u'xyzzyhelloxyzzy', u'xyzzyhello', u'xyz') +test('strip', u'hello', u'hello', u'xyz') + +# strip/lstrip/rstrip with str arg +test('strip', u'xyzzyhelloxyzzy', u'hello', 'xyz') +test('lstrip', u'xyzzyhelloxyzzy', u'helloxyzzy', 'xyz') +test('rstrip', u'xyzzyhelloxyzzy', u'xyzzyhello', 'xyz') +test('strip', u'hello', u'hello', 'xyz') + +test('swapcase', u'HeLLo cOmpUteRs', u'hEllO CoMPuTErS') + +if 0: + test('translate', u'xyzabcdef', u'xyzxyz', transtable, u'def') + + table = string.maketrans('a', u'A') + test('translate', u'abc', u'Abc', table) + test('translate', u'xyz', u'xyz', table) + +test('replace', u'one!two!three!', u'one at two!three!', u'!', u'@', 1) +test('replace', u'one!two!three!', u'onetwothree', '!', '') +test('replace', u'one!two!three!', u'one at two@three!', u'!', u'@', 2) +test('replace', u'one!two!three!', u'one at two@three@', u'!', u'@', 3) +test('replace', u'one!two!three!', u'one at two@three@', u'!', u'@', 4) +test('replace', u'one!two!three!', u'one!two!three!', u'!', u'@', 0) +test('replace', u'one!two!three!', u'one at two@three@', u'!', u'@') +test('replace', u'one!two!three!', u'one!two!three!', u'x', u'@') +test('replace', u'one!two!three!', u'one!two!three!', u'x', u'@', 2) +test('replace', u'abc', u'abc', u'ab', u'--', 0) +test('replace', u'abc', u'abc', u'xy', u'--') + +test('startswith', u'hello', 1, u'he') +test('startswith', u'hello', 1, u'hello') +test('startswith', u'hello', 0, u'hello world') +test('startswith', u'hello', 1, u'') +test('startswith', u'hello', 0, u'ello') +test('startswith', u'hello', 1, u'ello', 1) +test('startswith', u'hello', 1, u'o', 4) +test('startswith', u'hello', 0, u'o', 5) +test('startswith', u'hello', 1, u'', 5) +test('startswith', u'hello', 0, u'lo', 6) +test('startswith', u'helloworld', 1, u'lowo', 3) +test('startswith', u'helloworld', 1, u'lowo', 3, 7) +test('startswith', u'helloworld', 0, u'lowo', 3, 6) + +test('endswith', u'hello', 1, u'lo') +test('endswith', u'hello', 0, u'he') +test('endswith', u'hello', 1, u'') +test('endswith', u'hello', 0, u'hello world') +test('endswith', u'helloworld', 0, u'worl') +test('endswith', u'helloworld', 1, u'worl', 3, 9) +test('endswith', u'helloworld', 1, u'world', 3, 12) +test('endswith', u'helloworld', 1, u'lowo', 1, 7) +test('endswith', u'helloworld', 1, u'lowo', 2, 7) +test('endswith', u'helloworld', 1, u'lowo', 3, 7) +test('endswith', u'helloworld', 0, u'lowo', 4, 7) +test('endswith', u'helloworld', 0, u'lowo', 3, 8) +test('endswith', u'ab', 0, u'ab', 0, 1) +test('endswith', u'ab', 0, u'ab', 0, 0) +test('endswith', 'helloworld', 1, u'd') +test('endswith', 'helloworld', 0, u'l') + +test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi') +test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi', 8) +test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi', 4) +test('expandtabs', u'abc\r\nab\tdef\ng\thi', u'abc\r\nab def\ng hi', 4) + +if 0: + test('capwords', u'abc def ghi', u'Abc Def Ghi') + test('capwords', u'abc\tdef\nghi', u'Abc Def Ghi') + test('capwords', u'abc\t def \nghi', u'Abc Def Ghi') + +test('zfill', u'123', u'123', 2) +test('zfill', u'123', u'123', 3) +test('zfill', u'123', u'0123', 4) +test('zfill', u'+123', u'+123', 3) +test('zfill', u'+123', u'+123', 4) +test('zfill', u'+123', u'+0123', 5) +test('zfill', u'-123', u'-123', 3) +test('zfill', u'-123', u'-123', 4) +test('zfill', u'-123', u'-0123', 5) +test('zfill', u'', u'000', 3) +test('zfill', u'34', u'34', 1) +test('zfill', u'34', u'00034', 5) + +# Comparisons: +print 'Testing Unicode comparisons...', +verify(u'abc' == 'abc') +verify('abc' == u'abc') +verify(u'abc' == u'abc') +verify(u'abcd' > 'abc') +verify('abcd' > u'abc') +verify(u'abcd' > u'abc') +verify(u'abc' < 'abcd') +verify('abc' < u'abcd') +verify(u'abc' < u'abcd') +print 'done.' + +if 0: + # Move these tests to a Unicode collation module test... + + print 'Testing UTF-16 code point order comparisons...', + #No surrogates, no fixup required. + verify(u'\u0061' < u'\u20ac') + # Non surrogate below surrogate value, no fixup required + verify(u'\u0061' < u'\ud800\udc02') + + # Non surrogate above surrogate value, fixup required + def test_lecmp(s, s2): + verify(s < s2 , "comparison failed on %s < %s" % (s, s2)) + + def test_fixup(s): + s2 = u'\ud800\udc01' + test_lecmp(s, s2) + s2 = u'\ud900\udc01' + test_lecmp(s, s2) + s2 = u'\uda00\udc01' + test_lecmp(s, s2) + s2 = u'\udb00\udc01' + test_lecmp(s, s2) + s2 = u'\ud800\udd01' + test_lecmp(s, s2) + s2 = u'\ud900\udd01' + test_lecmp(s, s2) + s2 = u'\uda00\udd01' + test_lecmp(s, s2) + s2 = u'\udb00\udd01' + test_lecmp(s, s2) + s2 = u'\ud800\ude01' + test_lecmp(s, s2) + s2 = u'\ud900\ude01' + test_lecmp(s, s2) + s2 = u'\uda00\ude01' + test_lecmp(s, s2) + s2 = u'\udb00\ude01' + test_lecmp(s, s2) + s2 = u'\ud800\udfff' + test_lecmp(s, s2) + s2 = u'\ud900\udfff' + test_lecmp(s, s2) + s2 = u'\uda00\udfff' + test_lecmp(s, s2) + s2 = u'\udb00\udfff' + test_lecmp(s, s2) + + test_fixup(u'\ue000') + test_fixup(u'\uff61') + + # Surrogates on both sides, no fixup required + verify(u'\ud800\udc02' < u'\ud84d\udc56') + print 'done.' + +test('ljust', u'abc', u'abc ', 10) +test('rjust', u'abc', u' abc', 10) +test('center', u'abc', u' abc ', 10) +test('ljust', u'abc', u'abc ', 6) +test('rjust', u'abc', u' abc', 6) +test('center', u'abc', u' abc ', 6) +test('ljust', u'abc', u'abc', 2) +test('rjust', u'abc', u'abc', 2) +test('center', u'abc', u'abc', 2) + +test('islower', u'a', 1) +test('islower', u'A', 0) +test('islower', u'\n', 0) +test('islower', u'\u1FFc', 0) +test('islower', u'abc', 1) +test('islower', u'aBc', 0) +test('islower', u'abc\n', 1) + +test('isupper', u'a', 0) +test('isupper', u'A', 1) +test('isupper', u'\n', 0) +if sys.platform[:4] != 'java': + test('isupper', u'\u1FFc', 0) +test('isupper', u'ABC', 1) +test('isupper', u'AbC', 0) +test('isupper', u'ABC\n', 1) + +test('istitle', u'a', 0) +test('istitle', u'A', 1) +test('istitle', u'\n', 0) +test('istitle', u'\u1FFc', 1) +test('istitle', u'A Titlecased Line', 1) +test('istitle', u'A\nTitlecased Line', 1) +test('istitle', u'A Titlecased, Line', 1) +test('istitle', u'Greek \u1FFcitlecases ...', 1) +test('istitle', u'Not a capitalized String', 0) +test('istitle', u'Not\ta Titlecase String', 0) +test('istitle', u'Not--a Titlecase String', 0) + +test('isalpha', u'a', 1) +test('isalpha', u'A', 1) +test('isalpha', u'\n', 0) +test('isalpha', u'\u1FFc', 1) +test('isalpha', u'abc', 1) +test('isalpha', u'aBc123', 0) +test('isalpha', u'abc\n', 0) + +test('isalnum', u'a', 1) +test('isalnum', u'A', 1) +test('isalnum', u'\n', 0) +test('isalnum', u'123abc456', 1) +test('isalnum', u'a1b3c', 1) +test('isalnum', u'aBc000 ', 0) +test('isalnum', u'abc\n', 0) + +test('splitlines', u"abc\ndef\n\rghi", [u'abc', u'def', u'', u'ghi']) +test('splitlines', u"abc\ndef\n\r\nghi", [u'abc', u'def', u'', u'ghi']) +test('splitlines', u"abc\ndef\r\nghi", [u'abc', u'def', u'ghi']) +test('splitlines', u"abc\ndef\r\nghi\n", [u'abc', u'def', u'ghi']) +test('splitlines', u"abc\ndef\r\nghi\n\r", [u'abc', u'def', u'ghi', u'']) +test('splitlines', u"\nabc\ndef\r\nghi\n\r", [u'', u'abc', u'def', u'ghi', u'']) +test('splitlines', u"\nabc\ndef\r\nghi\n\r", [u'\n', u'abc\n', u'def\r\n', u'ghi\n', u'\r'], 1) + +test('translate', u"abababc", u'bbbc', {ord('a'):None}) +test('translate', u"abababc", u'iiic', {ord('a'):None, ord('b'):ord('i')}) +test('translate', u"abababc", u'iiix', {ord('a'):None, ord('b'):ord('i'), ord('c'):u'x'}) + +# Contains: +print 'Testing Unicode contains method...', +verify(('a' in u'abdb') == 1) +verify(('a' in u'bdab') == 1) +verify(('a' in u'bdaba') == 1) +verify(('a' in u'bdba') == 1) +verify(('a' in u'bdba') == 1) +verify((u'a' in u'bdba') == 1) +verify((u'a' in u'bdb') == 0) +verify((u'a' in 'bdb') == 0) +verify((u'a' in 'bdba') == 1) +verify((u'a' in ('a',1,None)) == 1) +verify((u'a' in (1,None,'a')) == 1) +verify((u'a' in (1,None,u'a')) == 1) +verify(('a' in ('a',1,None)) == 1) +verify(('a' in (1,None,'a')) == 1) +verify(('a' in (1,None,u'a')) == 1) +verify(('a' in ('x',1,u'y')) == 0) +verify(('a' in ('x',1,None)) == 0) +try: + u'\xe2' in 'g\xe2teau' +except UnicodeError: + pass +else: + print '*** contains operator does not propagate UnicodeErrors' +print 'done.' + +# Formatting: +print 'Testing Unicode formatting strings...', +verify(u"%s, %s" % (u"abc", "abc") == u'abc, abc') +verify(u"%s, %s, %i, %f, %5.2f" % (u"abc", "abc", 1, 2, 3) == u'abc, abc, 1, 2.000000, 3.00') +verify(u"%s, %s, %i, %f, %5.2f" % (u"abc", "abc", 1, -2, 3) == u'abc, abc, 1, -2.000000, 3.00') +verify(u"%s, %s, %i, %f, %5.2f" % (u"abc", "abc", -1, -2, 3.5) == u'abc, abc, -1, -2.000000, 3.50') +verify(u"%s, %s, %i, %f, %5.2f" % (u"abc", "abc", -1, -2, 3.57) == u'abc, abc, -1, -2.000000, 3.57') +verify(u"%s, %s, %i, %f, %5.2f" % (u"abc", "abc", -1, -2, 1003.57) == u'abc, abc, -1, -2.000000, 1003.57') +verify(u"%c" % (u"a",) == u'a') +verify(u"%c" % ("a",) == u'a') +verify(u"%c" % (34,) == u'"') +verify(u"%c" % (36,) == u'$') +if sys.platform[:4] != 'java': + value = u"%r, %r" % (u"abc", "abc") + if value != u"u'abc', 'abc'": + print '*** formatting failed for "%s"' % 'u"%r, %r" % (u"abc", "abc")' + +verify(u"%(x)s, %(y)s" % {'x':u"abc", 'y':"def"} == u'abc, def') +try: + value = u"%(x)s, %(?)s" % {'x':u"abc", u'?':"def"} +except KeyError: + print '*** formatting failed for "%s"' % "u'abc, def'" +else: + verify(value == u'abc, def') + +for ordinal in (-100, 0x200000): + try: + u"%c" % ordinal + except ValueError: + pass + else: + print '*** formatting u"%%c" %% %i should give a ValueError' % ordinal + +# formatting jobs delegated from the string implementation: +verify('...%(foo)s...' % {'foo':u"abc"} == u'...abc...') +verify('...%(foo)s...' % {'foo':"abc"} == '...abc...') +verify('...%(foo)s...' % {u'foo':"abc"} == '...abc...') +verify('...%(foo)s...' % {u'foo':u"abc"} == u'...abc...') +verify('...%(foo)s...' % {u'foo':u"abc",'def':123} == u'...abc...') +verify('...%(foo)s...' % {u'foo':u"abc",u'def':123} == u'...abc...') +verify('...%s...%s...%s...%s...' % (1,2,3,u"abc") == u'...1...2...3...abc...') +verify('...%%...%%s...%s...%s...%s...%s...' % (1,2,3,u"abc") == u'...%...%s...1...2...3...abc...') +verify('...%s...' % u"abc" == u'...abc...') +verify('%*s' % (5,u'abc',) == u' abc') +verify('%*s' % (-5,u'abc',) == u'abc ') +verify('%*.*s' % (5,2,u'abc',) == u' ab') +verify('%*.*s' % (5,3,u'abc',) == u' abc') +verify('%i %*.*s' % (10, 5,3,u'abc',) == u'10 abc') +verify('%i%s %*.*s' % (10, 3, 5,3,u'abc',) == u'103 abc') +print 'done.' + +print 'Testing builtin unicode()...', + +# unicode(obj) tests (this maps to PyObject_Unicode() at C level) + +verify(unicode(u'unicode remains unicode') == u'unicode remains unicode') + +class UnicodeSubclass(unicode): + pass + +verify(unicode(UnicodeSubclass('unicode subclass becomes unicode')) + == u'unicode subclass becomes unicode') + +verify(unicode('strings are converted to unicode') + == u'strings are converted to unicode') + +class UnicodeCompat: + def __init__(self, x): + self.x = x + def __unicode__(self): + return self.x + +verify(unicode(UnicodeCompat('__unicode__ compatible objects are recognized')) + == u'__unicode__ compatible objects are recognized') + +class StringCompat: + def __init__(self, x): + self.x = x + def __str__(self): + return self.x + +verify(unicode(StringCompat('__str__ compatible objects are recognized')) + == u'__str__ compatible objects are recognized') + +# unicode(obj) is compatible to str(): + +o = StringCompat('unicode(obj) is compatible to str()') +verify(unicode(o) == u'unicode(obj) is compatible to str()') +verify(str(o) == 'unicode(obj) is compatible to str()') + +for obj in (123, 123.45, 123L): + verify(unicode(obj) == unicode(str(obj))) + +# unicode(obj, encoding, error) tests (this maps to +# PyUnicode_FromEncodedObject() at C level) + +if not sys.platform.startswith('java'): + try: + unicode(u'decoding unicode is not supported', 'utf-8', 'strict') + except TypeError: + pass + else: + raise TestFailed, "decoding unicode should NOT be supported" + +verify(unicode('strings are decoded to unicode', 'utf-8', 'strict') + == u'strings are decoded to unicode') + +if not sys.platform.startswith('java'): + verify(unicode(buffer('character buffers are decoded to unicode'), + 'utf-8', 'strict') + == u'character buffers are decoded to unicode') + +print 'done.' + +# Test builtin codecs +print 'Testing builtin codecs...', + +# UTF-7 specific encoding tests: +utfTests = [(u'A\u2262\u0391.', 'A+ImIDkQ.'), # RFC2152 example + (u'Hi Mom -\u263a-!', 'Hi Mom -+Jjo--!'), # RFC2152 example + (u'\u65E5\u672C\u8A9E', '+ZeVnLIqe-'), # RFC2152 example + (u'Item 3 is \u00a31.', 'Item 3 is +AKM-1.'), # RFC2152 example + (u'+', '+-'), + (u'+-', '+--'), + (u'+?', '+-?'), + (u'\?', '+AFw?'), + (u'+?', '+-?'), + (ur'\\?', '+AFwAXA?'), + (ur'\\\?', '+AFwAXABc?'), + (ur'++--', '+-+---')] + +for x,y in utfTests: + verify( x.encode('utf-7') == y ) + +try: + unicode('+3ADYAA-', 'utf-7') # surrogates not supported +except UnicodeError: + pass +else: + raise TestFailed, "unicode('+3ADYAA-', 'utf-7') failed to raise an exception" + +verify(unicode('+3ADYAA-', 'utf-7', 'replace') == u'\ufffd') + +# UTF-8 specific encoding tests: +verify(u''.encode('utf-8') == '') +verify(u'\u20ac'.encode('utf-8') == '\xe2\x82\xac') +verify(u'\ud800\udc02'.encode('utf-8') == '\xf0\x90\x80\x82') +verify(u'\ud84d\udc56'.encode('utf-8') == '\xf0\xa3\x91\x96') +verify(u'\ud800'.encode('utf-8') == '\xed\xa0\x80') +verify(u'\udc00'.encode('utf-8') == '\xed\xb0\x80') +verify((u'\ud800\udc02'*1000).encode('utf-8') == + '\xf0\x90\x80\x82'*1000) +verify(u'\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f' + u'\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00' + u'\u90e8\u306f\u30c9\u30a4\u30c4\u8a9e\u3067\u3059\u304c' + u'\u3001\u3042\u3068\u306f\u3067\u305f\u3089\u3081\u3067' + u'\u3059\u3002\u5b9f\u969b\u306b\u306f\u300cWenn ist das' + u' Nunstuck git und'.encode('utf-8') == + '\xe6\xad\xa3\xe7\xa2\xba\xe3\x81\xab\xe8\xa8\x80\xe3\x81' + '\x86\xe3\x81\xa8\xe7\xbf\xbb\xe8\xa8\xb3\xe3\x81\xaf\xe3' + '\x81\x95\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3\x81\xbe' + '\xe3\x81\x9b\xe3\x82\x93\xe3\x80\x82\xe4\xb8\x80\xe9\x83' + '\xa8\xe3\x81\xaf\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84\xe8' + '\xaa\x9e\xe3\x81\xa7\xe3\x81\x99\xe3\x81\x8c\xe3\x80\x81' + '\xe3\x81\x82\xe3\x81\xa8\xe3\x81\xaf\xe3\x81\xa7\xe3\x81' + '\x9f\xe3\x82\x89\xe3\x82\x81\xe3\x81\xa7\xe3\x81\x99\xe3' + '\x80\x82\xe5\xae\x9f\xe9\x9a\x9b\xe3\x81\xab\xe3\x81\xaf' + '\xe3\x80\x8cWenn ist das Nunstuck git und') + +# UTF-8 specific decoding tests +verify(unicode('\xf0\xa3\x91\x96', 'utf-8') == u'\U00023456' ) +verify(unicode('\xf0\x90\x80\x82', 'utf-8') == u'\U00010002' ) +verify(unicode('\xe2\x82\xac', 'utf-8') == u'\u20ac' ) +# test UTF-8 2.2.1 bug work-around +verify(unicode('\xa0\x80', 'utf-8') == u'\ud800' ) +verify(unicode('\xaf\xbf', 'utf-8') == u'\udbff' ) +verify(unicode('\xed\xb0\x80', 'utf-8') == u'\udc00' ) +verify(unicode('\xed\xbf\xbf', 'utf-8') == u'\udfff' ) + +# Other possible utf-8 test cases: +# * strict decoding testing for all of the +# UTF8_ERROR cases in PyUnicode_DecodeUTF8 + +verify(unicode('hello','ascii') == u'hello') +verify(unicode('hello','utf-8') == u'hello') +verify(unicode('hello','utf8') == u'hello') +verify(unicode('hello','latin-1') == u'hello') + +# Error handling +try: + u'Andr\202 x'.encode('ascii') + u'Andr\202 x'.encode('ascii','strict') +except ValueError: + pass +else: + raise TestFailed, "u'Andr\202'.encode('ascii') failed to raise an exception" +verify(u'Andr\202 x'.encode('ascii','ignore') == "Andr x") +verify(u'Andr\202 x'.encode('ascii','replace') == "Andr? x") + +try: + unicode('Andr\202 x','ascii') + unicode('Andr\202 x','ascii','strict') +except ValueError: + pass +else: + raise TestFailed, "unicode('Andr\202') failed to raise an exception" +verify(unicode('Andr\202 x','ascii','ignore') == u"Andr x") +verify(unicode('Andr\202 x','ascii','replace') == u'Andr\uFFFD x') + +verify("\\N{foo}xx".decode("unicode-escape", "ignore") == u"xx") +try: + "\\".decode("unicode-escape") +except ValueError: + pass +else: + raise TestFailed, '"\\".decode("unicode-escape") should fail' + +verify(u'hello'.encode('ascii') == 'hello') +verify(u'hello'.encode('utf-7') == 'hello') +verify(u'hello'.encode('utf-8') == 'hello') +verify(u'hello'.encode('utf8') == 'hello') +verify(u'hello'.encode('utf-16-le') == 'h\000e\000l\000l\000o\000') +verify(u'hello'.encode('utf-16-be') == '\000h\000e\000l\000l\000o') +verify(u'hello'.encode('latin-1') == 'hello') + +# Roundtrip safety for BMP (just the first 1024 chars) +u = u''.join(map(unichr, range(1024))) +for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', + 'raw_unicode_escape', 'unicode_escape', 'unicode_internal'): + verify(unicode(u.encode(encoding),encoding) == u) + +# Roundtrip safety for non-BMP (just a few chars) +u = u'\U00010001\U00020002\U00030003\U00040004\U00050005' +for encoding in ('utf-8', + 'utf-16', 'utf-16-le', 'utf-16-be', + #'raw_unicode_escape', + 'unicode_escape', 'unicode_internal'): + verify(unicode(u.encode(encoding),encoding) == u) + +u = u''.join(map(unichr, range(256))) +for encoding in ( + 'latin-1', + ): + try: + verify(unicode(u.encode(encoding),encoding) == u) + except TestFailed: + print '*** codec "%s" failed round-trip' % encoding + except ValueError,why: + print '*** codec for "%s" failed: %s' % (encoding, why) + +u = u''.join(map(unichr, range(128))) +for encoding in ( + 'ascii', + ): + try: + verify(unicode(u.encode(encoding),encoding) == u) + except TestFailed: + print '*** codec "%s" failed round-trip' % encoding + except ValueError,why: + print '*** codec for "%s" failed: %s' % (encoding, why) + +print 'done.' + +print 'Testing standard mapping codecs...', + +print '0-127...', +s = ''.join(map(chr, range(128))) +for encoding in ( + 'cp037', 'cp1026', + 'cp437', 'cp500', 'cp737', 'cp775', 'cp850', + 'cp852', 'cp855', 'cp860', 'cp861', 'cp862', + 'cp863', 'cp865', 'cp866', + 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', + 'iso8859_2', 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', + 'iso8859_7', 'iso8859_9', 'koi8_r', 'latin_1', + 'mac_cyrillic', 'mac_latin2', + + 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', + 'cp1256', 'cp1257', 'cp1258', + 'cp856', 'cp857', 'cp864', 'cp869', 'cp874', + + 'mac_greek', 'mac_iceland','mac_roman', 'mac_turkish', + 'cp1006', 'iso8859_8', + + ### These have undefined mappings: + #'cp424', + + ### These fail the round-trip: + #'cp875' + + ): + try: + verify(unicode(s,encoding).encode(encoding) == s) + except TestFailed: + print '*** codec "%s" failed round-trip' % encoding + except ValueError,why: + print '*** codec for "%s" failed: %s' % (encoding, why) + +print '128-255...', +s = ''.join(map(chr, range(128,256))) +for encoding in ( + 'cp037', 'cp1026', + 'cp437', 'cp500', 'cp737', 'cp775', 'cp850', + 'cp852', 'cp855', 'cp860', 'cp861', 'cp862', + 'cp863', 'cp865', 'cp866', + 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', + 'iso8859_2', 'iso8859_4', 'iso8859_5', + 'iso8859_9', 'koi8_r', 'latin_1', + 'mac_cyrillic', 'mac_latin2', + + ### These have undefined mappings: + #'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', + #'cp1256', 'cp1257', 'cp1258', + #'cp424', 'cp856', 'cp857', 'cp864', 'cp869', 'cp874', + #'iso8859_3', 'iso8859_6', 'iso8859_7', + #'mac_greek', 'mac_iceland','mac_roman', 'mac_turkish', + + ### These fail the round-trip: + #'cp1006', 'cp875', 'iso8859_8', + + ): + try: + verify(unicode(s,encoding).encode(encoding) == s) + except TestFailed: + print '*** codec "%s" failed round-trip' % encoding + except ValueError,why: + print '*** codec for "%s" failed: %s' % (encoding, why) + +# UTF-8 must be roundtrip safe for all UCS-2 code points +# This excludes surrogates: in the full range, there would be +# a surrogate pair (\udbff\udc00), which gets converted back +# to a non-BMP character (\U0010fc00) +u = u''.join(map(unichr, range(0,0xd800)+range(0xe000,0x10000))) +for encoding in ('utf-8',): + verify(unicode(u.encode(encoding),encoding) == u) + +print 'done.' + +print 'Testing Unicode string concatenation...', +verify((u"abc" u"def") == u"abcdef") +verify(("abc" u"def") == u"abcdef") +verify((u"abc" "def") == u"abcdef") +verify((u"abc" u"def" "ghi") == u"abcdefghi") +verify(("abc" "def" u"ghi") == u"abcdefghi") +print 'done.' + +print 'Testing Unicode printing...', +print u'abc' +print u'abc', u'def' +print u'abc', 'def' +print 'abc', u'def' +print u'abc\n' +print u'abc\n', +print u'abc\n', +print u'def\n' +print u'def\n' +print 'done.' diff --git a/lib-python/2.2/test/test_unicode_file.py b/lib-python/2.2/test/test_unicode_file.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_unicode_file.py @@ -0,0 +1,95 @@ +# Test some Unicode file name semantics +# We dont test many operations on files other than +# that their names can be used with Unicode characters. +import os + +from test_support import verify, TestSkipped, TESTFN_UNICODE +try: + from test_support import TESTFN_ENCODING + oldlocale = None +except ImportError: + import locale + # try to run the test in an UTF-8 locale. If this locale is not + # available, avoid running the test since the locale's encoding + # might not support TESTFN_UNICODE. Likewise, if the system does + # not support locale.CODESET, Unicode file semantics is not + # available, either. + oldlocale = locale.setlocale(locale.LC_CTYPE) + try: + locale.setlocale(locale.LC_CTYPE,"en_US.UTF-8") + TESTFN_ENCODING = locale.nl_langinfo(locale.CODESET) + except (locale.Error, AttributeError): + raise TestSkipped("No Unicode filesystem semantics on this platform.") + +TESTFN_ENCODED = TESTFN_UNICODE.encode(TESTFN_ENCODING) + +# Check with creation as Unicode string. +f = open(TESTFN_UNICODE, 'wb') +if not os.path.isfile(TESTFN_UNICODE): + print "File doesn't exist after creating it" + +if not os.path.isfile(TESTFN_ENCODED): + print "File doesn't exist (encoded string) after creating it" + +f.close() + +# Test stat and chmod +if os.stat(TESTFN_ENCODED) != os.stat(TESTFN_UNICODE): + print "os.stat() did not agree on the 2 filenames" +os.chmod(TESTFN_ENCODED, 0777) +os.chmod(TESTFN_UNICODE, 0777) + +# Test rename +os.rename(TESTFN_ENCODED, TESTFN_ENCODED + ".new") +os.rename(TESTFN_UNICODE+".new", TESTFN_ENCODED) + +os.unlink(TESTFN_ENCODED) +if os.path.isfile(TESTFN_ENCODED) or \ + os.path.isfile(TESTFN_UNICODE): + print "File exists after deleting it" + +# Check with creation as encoded string. +f = open(TESTFN_ENCODED, 'wb') +if not os.path.isfile(TESTFN_UNICODE) or \ + not os.path.isfile(TESTFN_ENCODED): + print "File doesn't exist after creating it" + +path, base = os.path.split(os.path.abspath(TESTFN_ENCODED)) +if base not in os.listdir(path): + print "Filename did not appear in os.listdir()" + +f.close() +os.unlink(TESTFN_UNICODE) +if os.path.isfile(TESTFN_ENCODED) or \ + os.path.isfile(TESTFN_UNICODE): + print "File exists after deleting it" + +# test os.open +f = os.open(TESTFN_ENCODED, os.O_CREAT) +if not os.path.isfile(TESTFN_UNICODE) or \ + not os.path.isfile(TESTFN_ENCODED): + print "File doesn't exist after creating it" +os.close(f) +os.unlink(TESTFN_UNICODE) + +# Test directories etc +cwd = os.getcwd() +abs_encoded = os.path.abspath(TESTFN_ENCODED) + ".dir" +abs_unicode = os.path.abspath(TESTFN_UNICODE) + ".dir" +os.mkdir(abs_encoded) +try: + os.chdir(abs_encoded) + os.chdir(abs_unicode) +finally: + os.chdir(cwd) + os.rmdir(abs_unicode) +os.mkdir(abs_unicode) +try: + os.chdir(abs_encoded) + os.chdir(abs_unicode) +finally: + os.chdir(cwd) + os.rmdir(abs_encoded) +print "All the Unicode tests appeared to work" +if oldlocale: + locale.setlocale(locale.LC_CTYPE, oldlocale) diff --git a/lib-python/2.2/test/test_unicodedata.py b/lib-python/2.2/test/test_unicodedata.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_unicodedata.py @@ -0,0 +1,125 @@ +""" Test script for the unicodedata module. + + Written by Marc-Andre Lemburg (mal at lemburg.com). + + (c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" +from test_support import verify, verbose +import sha + +encoding = 'utf-8' + +def test_methods(): + + h = sha.sha() + for i in range(65536): + char = unichr(i) + data = [ + + # Predicates (single char) + char.isalnum() and u'1' or u'0', + char.isalpha() and u'1' or u'0', + char.isdecimal() and u'1' or u'0', + char.isdigit() and u'1' or u'0', + char.islower() and u'1' or u'0', + char.isnumeric() and u'1' or u'0', + char.isspace() and u'1' or u'0', + char.istitle() and u'1' or u'0', + char.isupper() and u'1' or u'0', + + # Predicates (multiple chars) + (char + u'abc').isalnum() and u'1' or u'0', + (char + u'abc').isalpha() and u'1' or u'0', + (char + u'123').isdecimal() and u'1' or u'0', + (char + u'123').isdigit() and u'1' or u'0', + (char + u'abc').islower() and u'1' or u'0', + (char + u'123').isnumeric() and u'1' or u'0', + (char + u' \t').isspace() and u'1' or u'0', + (char + u'abc').istitle() and u'1' or u'0', + (char + u'ABC').isupper() and u'1' or u'0', + + # Mappings (single char) + char.lower(), + char.upper(), + char.title(), + + # Mappings (multiple chars) + (char + u'abc').lower(), + (char + u'ABC').upper(), + (char + u'abc').title(), + (char + u'ABC').title(), + + ] + h.update(u''.join(data).encode(encoding)) + return h.hexdigest() + +def test_unicodedata(): + + h = sha.sha() + for i in range(65536): + char = unichr(i) + data = [ + # Properties + str(unicodedata.digit(char, -1)), + str(unicodedata.numeric(char, -1)), + str(unicodedata.decimal(char, -1)), + unicodedata.category(char), + unicodedata.bidirectional(char), + unicodedata.decomposition(char), + str(unicodedata.mirrored(char)), + str(unicodedata.combining(char)), + ] + h.update(''.join(data)) + return h.hexdigest() + +### Run tests + +print 'Testing Unicode Database...' +print 'Methods:', +print test_methods() + +# In case unicodedata is not available, this will raise an ImportError, +# but still test the above cases... +import unicodedata +print 'Functions:', +print test_unicodedata() + +# Some additional checks of the API: +print 'API:', + +verify(unicodedata.digit(u'A',None) is None) +verify(unicodedata.digit(u'9') == 9) +verify(unicodedata.digit(u'\u215b',None) is None) +verify(unicodedata.digit(u'\u2468') == 9) + +verify(unicodedata.numeric(u'A',None) is None) +verify(unicodedata.numeric(u'9') == 9) +verify(unicodedata.numeric(u'\u215b') == 0.125) +verify(unicodedata.numeric(u'\u2468') == 9.0) + +verify(unicodedata.decimal(u'A',None) is None) +verify(unicodedata.decimal(u'9') == 9) +verify(unicodedata.decimal(u'\u215b',None) is None) +verify(unicodedata.decimal(u'\u2468',None) is None) + +verify(unicodedata.category(u'\uFFFE') == 'Cn') +verify(unicodedata.category(u'a') == 'Ll') +verify(unicodedata.category(u'A') == 'Lu') + +verify(unicodedata.bidirectional(u'\uFFFE') == '') +verify(unicodedata.bidirectional(u' ') == 'WS') +verify(unicodedata.bidirectional(u'A') == 'L') + +verify(unicodedata.decomposition(u'\uFFFE') == '') +verify(unicodedata.decomposition(u'\u00bc') == ' 0031 2044 0034') + +verify(unicodedata.mirrored(u'\uFFFE') == 0) +verify(unicodedata.mirrored(u'a') == 0) +verify(unicodedata.mirrored(u'\u2201') == 1) + +verify(unicodedata.combining(u'\uFFFE') == 0) +verify(unicodedata.combining(u'a') == 0) +verify(unicodedata.combining(u'\u20e1') == 230) + +print 'ok' diff --git a/lib-python/2.2/test/test_unpack.py b/lib-python/2.2/test/test_unpack.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_unpack.py @@ -0,0 +1,144 @@ +from test_support import * + +t = (1, 2, 3) +l = [4, 5, 6] + +class Seq: + def __getitem__(self, i): + if i >= 0 and i < 3: return i + raise IndexError + +a = -1 +b = -1 +c = -1 + +# unpack tuple +if verbose: + print 'unpack tuple' +a, b, c = t +if a != 1 or b != 2 or c != 3: + raise TestFailed + +# unpack list +if verbose: + print 'unpack list' +a, b, c = l +if a != 4 or b != 5 or c != 6: + raise TestFailed + +# unpack implied tuple +if verbose: + print 'unpack implied tuple' +a, b, c = 7, 8, 9 +if a != 7 or b != 8 or c != 9: + raise TestFailed + +# unpack string... fun! +if verbose: + print 'unpack string' +a, b, c = 'one' +if a != 'o' or b != 'n' or c != 'e': + raise TestFailed + +# unpack generic sequence +if verbose: + print 'unpack sequence' +a, b, c = Seq() +if a != 0 or b != 1 or c != 2: + raise TestFailed + +# single element unpacking, with extra syntax +if verbose: + print 'unpack single tuple/list' +st = (99,) +sl = [100] +a, = st +if a != 99: + raise TestFailed +b, = sl +if b != 100: + raise TestFailed + +# now for some failures + +# unpacking non-sequence +if verbose: + print 'unpack non-sequence' +try: + a, b, c = 7 + raise TestFailed +except TypeError: + pass + + +# unpacking tuple of wrong size +if verbose: + print 'unpack tuple wrong size' +try: + a, b = t + raise TestFailed +except ValueError: + pass + +# unpacking list of wrong size +if verbose: + print 'unpack list wrong size' +try: + a, b = l + raise TestFailed +except ValueError: + pass + + +# unpacking sequence too short +if verbose: + print 'unpack sequence too short' +try: + a, b, c, d = Seq() + raise TestFailed +except ValueError: + pass + + +# unpacking sequence too long +if verbose: + print 'unpack sequence too long' +try: + a, b = Seq() + raise TestFailed +except ValueError: + pass + + +# unpacking a sequence where the test for too long raises a different +# kind of error +class BozoError(Exception): + pass + +class BadSeq: + def __getitem__(self, i): + if i >= 0 and i < 3: + return i + elif i == 3: + raise BozoError + else: + raise IndexError + + +# trigger code while not expecting an IndexError +if verbose: + print 'unpack sequence too long, wrong error' +try: + a, b, c, d, e = BadSeq() + raise TestFailed +except BozoError: + pass + +# trigger code while expecting an IndexError +if verbose: + print 'unpack sequence too short, wrong error' +try: + a, b, c = BadSeq() + raise TestFailed +except BozoError: + pass diff --git a/lib-python/2.2/test/test_urllib.py b/lib-python/2.2/test/test_urllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_urllib.py @@ -0,0 +1,109 @@ +# Minimal test of the quote function +from test_support import verify, verbose +import urllib + +chars = 'abcdefghijklmnopqrstuvwxyz'\ + '\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356' \ + '\357\360\361\362\363\364\365\366\370\371\372\373\374\375\376\377' \ + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ + '\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317' \ + '\320\321\322\323\324\325\326\330\331\332\333\334\335\336' + +expected = 'abcdefghijklmnopqrstuvwxyz' \ + '%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE' \ + '%EF%F0%F1%F2%F3%F4%F5%F6%F8%F9%FA%FB%FC%FD%FE%FF' \ + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ + '%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF' \ + '%D0%D1%D2%D3%D4%D5%D6%D8%D9%DA%DB%DC%DD%DE' + +test = urllib.quote(chars) +verify(test == expected, "urllib.quote problem 1") +test2 = urllib.unquote(expected) +verify(test2 == chars) + +in1 = "abc/def" +out1_1 = "abc/def" +out1_2 = "abc%2Fdef" + +verify(urllib.quote(in1) == out1_1, "urllib.quote problem 2") +verify(urllib.quote(in1, '') == out1_2, "urllib.quote problem 3") + +in2 = "abc?def" +out2_1 = "abc%3Fdef" +out2_2 = "abc?def" + +verify(urllib.quote(in2) == out2_1, "urllib.quote problem 4") +verify(urllib.quote(in2, '?') == out2_2, "urllib.quote problem 5") + + + +in3 = {"p1":"v1","p2":"v2"} +in3list = [("p1", "v1"), ("p2","v2")] +exp3_1 = "p2=v2&p1=v1" +exp3_2 = "p1=v1&p2=v2" +# dict input, only string values +act3 = urllib.urlencode(in3) +verify(act3==exp3_1 or act3==exp3_2, "urllib.urlencode problem 1 dict") +# list input, only string values +act3list = urllib.urlencode(in3list) +verify(act3list==exp3_2, "urllib.urlencode problem 1 list") + + +in4 = {"p1":["v1","v2"]} +in4list = [("p1", ["v1","v2"])] +exp4 = "p1=v1&p1=v2" +# dict input, list values, doseq==1 +act4 = urllib.urlencode(in4,doseq=1) +verify(act4==exp4, "urllib.urlencode problem 2 dict") +# list input, list values, doseq==1 +act4list = urllib.urlencode(in4,doseq=1) +verify(act4list==exp4, "urllib.urlencode problem 2 list") + + +in5 = in4 +in5list = in4list +exp5 = "p1=%5B%27v1%27%2C+%27v2%27%5D" +exp5list = "p1=%5B%27v1%27%2C+%27v2%27%5D" +# dict input, list variables, doseq=0 +act5 = urllib.urlencode(in5) +verify(act5==exp5, "urllib.urlencode problem 3 dict") +# list input, list variables, doseq=0 +act5list = urllib.urlencode(in5list) +verify(act5list==exp5list, "urllib.urlencode problem 3 list") + + +in6 = {"p1":"v1","p2":"v2"} +in6list = [("p1", "v1"), ("p2","v2")] +exp6_1 = "p2=v2&p1=v1" +exp6_2 = "p1=v1&p2=v2" +# dict input, only string values, doseq==1 +act6 = urllib.urlencode(in6,doseq=1) +verify(act6==exp6_1 or act6==exp6_2, "urllib.urlencode problem 4 dict") +# list input, only string values +act6list = urllib.urlencode(in6list,doseq=1) +verify(act6list==exp6_2, "urllib.urlencode problem 4 list") + + +in7 = "p1=v1&p2=v2" +try: + act7 = urllib.urlencode(in7) + print "urllib.urlencode problem 5 string" +except TypeError: + pass + + +import UserDict +in8 = UserDict.UserDict() +in8["p1"] = "v1" +in8["p2"] = ["v1", "v2"] +exp8_1 = "p1=v1&p2=v1&p2=v2" +exp8_2 = "p2=v1&p2=v2&p1=v1" +act8 = urllib.urlencode(in8,doseq=1) +verify(act8==exp8_1 or act8==exp8_2, "urllib.urlencode problem 6 UserDict") + + +import UserString +in9 = UserString.UserString("") +exp9 = "" +act9 = urllib.urlencode(in9,doseq=1) +verify(act9==exp9, "urllib.urlencode problem 7 UserString") diff --git a/lib-python/2.2/test/test_urllib2.py b/lib-python/2.2/test/test_urllib2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_urllib2.py @@ -0,0 +1,31 @@ +from test_support import verify +import urllib2 +import os + +# A couple trivial tests + +try: + urllib2.urlopen('bogus url') +except ValueError: + pass +else: + verify(0) + +# XXX Name hacking to get this to work on Windows. +fname = os.path.abspath(urllib2.__file__).replace('\\', '/') +if fname[1:2] == ":": + fname = fname[2:] +# And more hacking to get it to work on MacOS. This assumes +# urllib.pathname2url works, unfortunately... +if os.name == 'mac': + fname = '/' + fname.replace(':', '/') +elif os.name == 'riscos': + import string + fname = os.expand(fname) + fname = fname.translate(string.maketrans("/.", "./")) + +file_url = "file://%s" % fname +f = urllib2.urlopen(file_url) + +buf = f.read() +f.close() diff --git a/lib-python/2.2/test/test_urlparse.py b/lib-python/2.2/test/test_urlparse.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_urlparse.py @@ -0,0 +1,94 @@ +import urlparse + +errors = 0 + +RFC1808_BASE = "http://a/b/c/d;p?q#f" + +for url, expected in [('http://www.python.org', + ('http', 'www.python.org', '', '', '', '')), + ('http://www.python.org#abc', + ('http', 'www.python.org', '', '', '', 'abc')), + ('http://www.python.org/#abc', + ('http', 'www.python.org', '/', '', '', 'abc')), + (RFC1808_BASE, + ('http', 'a', '/b/c/d', 'p', 'q', 'f')), + ('file:///tmp/junk.txt', + ('file', '', '/tmp/junk.txt', '', '', '')), + ]: + result = urlparse.urlparse(url) + print "%-13s = %r" % (url, result) + if result != expected: + errors += 1 + print "urlparse(%r)" % url + print ("expected %r,\n" + " got %r") % (expected, result) + # put it back together and it should be the same + result2 = urlparse.urlunparse(result) + assert(result2 == url) +print + +def checkJoin(relurl, expected): + global errors + result = urlparse.urljoin(RFC1808_BASE, relurl) + print "%-13s = %r" % (relurl, result) + if result != expected: + errors += 1 + print "urljoin(%r, %r)" % (RFC1808_BASE, relurl) + print ("expected %r,\n" + " got %r") % (expected, result) + +print "urlparse.urljoin() tests" +print + +# "normal" cases from RFC 1808: +checkJoin('g:h', 'g:h') +checkJoin('g', 'http://a/b/c/g') +checkJoin('./g', 'http://a/b/c/g') +checkJoin('g/', 'http://a/b/c/g/') +checkJoin('/g', 'http://a/g') +checkJoin('//g', 'http://g') +checkJoin('?y', 'http://a/b/c/d;p?y') +checkJoin('g?y', 'http://a/b/c/g?y') +checkJoin('g?y/./x', 'http://a/b/c/g?y/./x') +checkJoin('#s', 'http://a/b/c/d;p?q#s') +checkJoin('g#s', 'http://a/b/c/g#s') +checkJoin('g#s/./x', 'http://a/b/c/g#s/./x') +checkJoin('g?y#s', 'http://a/b/c/g?y#s') +checkJoin(';x', 'http://a/b/c/d;x') +checkJoin('g;x', 'http://a/b/c/g;x') +checkJoin('g;x?y#s', 'http://a/b/c/g;x?y#s') +checkJoin('.', 'http://a/b/c/') +checkJoin('./', 'http://a/b/c/') +checkJoin('..', 'http://a/b/') +checkJoin('../', 'http://a/b/') +checkJoin('../g', 'http://a/b/g') +checkJoin('../..', 'http://a/') +checkJoin('../../', 'http://a/') +checkJoin('../../g', 'http://a/g') + +# "abnormal" cases from RFC 1808: +checkJoin('', 'http://a/b/c/d;p?q#f') +checkJoin('../../../g', 'http://a/../g') +checkJoin('../../../../g', 'http://a/../../g') +checkJoin('/./g', 'http://a/./g') +checkJoin('/../g', 'http://a/../g') +checkJoin('g.', 'http://a/b/c/g.') +checkJoin('.g', 'http://a/b/c/.g') +checkJoin('g..', 'http://a/b/c/g..') +checkJoin('..g', 'http://a/b/c/..g') +checkJoin('./../g', 'http://a/b/g') +checkJoin('./g/.', 'http://a/b/c/g/') +checkJoin('g/./h', 'http://a/b/c/g/h') +checkJoin('g/../h', 'http://a/b/c/h') + +# RFC 1808 and RFC 1630 disagree on these (according to RFC 1808), +# so we'll not actually run these tests (which expect 1808 behavior). +#checkJoin('http:g', 'http:g') +#checkJoin('http:', 'http:') + +print errors, "errors" + +# One more test backported from 2.3 +for u in ['Python', './Python']: + if urlparse.urlunparse(urlparse.urlparse(u)) != u: + print "*** urlparse/urlunparse failure for", `u` diff --git a/lib-python/2.2/test/test_userdict.py b/lib-python/2.2/test/test_userdict.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_userdict.py @@ -0,0 +1,120 @@ +# Check every path through every method of UserDict + +from test_support import verify, verbose +from UserDict import UserDict, IterableUserDict + +d0 = {} +d1 = {"one": 1} +d2 = {"one": 1, "two": 2} + +# Test constructors + +u = UserDict() +u0 = UserDict(d0) +u1 = UserDict(d1) +u2 = IterableUserDict(d2) + +uu = UserDict(u) +uu0 = UserDict(u0) +uu1 = UserDict(u1) +uu2 = UserDict(u2) + +# Test __repr__ + +verify(str(u0) == str(d0)) +verify(repr(u1) == repr(d1)) +verify(`u2` == `d2`) + +# Test __cmp__ and __len__ + +all = [d0, d1, d2, u, u0, u1, u2, uu, uu0, uu1, uu2] +for a in all: + for b in all: + verify(cmp(a, b) == cmp(len(a), len(b))) + +# Test __getitem__ + +verify(u2["one"] == 1) +try: + u1["two"] +except KeyError: + pass +else: + verify(0, "u1['two'] shouldn't exist") + +# Test __setitem__ + +u3 = UserDict(u2) +u3["two"] = 2 +u3["three"] = 3 + +# Test __delitem__ + +del u3["three"] +try: + del u3["three"] +except KeyError: + pass +else: + verify(0, "u3['three'] shouldn't exist") + +# Test clear + +u3.clear() +verify(u3 == {}) + +# Test copy() + +u2a = u2.copy() +verify(u2a == u2) + +class MyUserDict(UserDict): + def display(self): print self + +m2 = MyUserDict(u2) +m2a = m2.copy() +verify(m2a == m2) + +# SF bug #476616 -- copy() of UserDict subclass shared data +m2['foo'] = 'bar' +verify(m2a != m2) + +# Test keys, items, values + +verify(u2.keys() == d2.keys()) +verify(u2.items() == d2.items()) +verify(u2.values() == d2.values()) + +# Test has_key and "in". + +for i in u2.keys(): + verify(u2.has_key(i) == 1) + verify((i in u2) == 1) + verify(u1.has_key(i) == d1.has_key(i)) + verify((i in u1) == (i in d1)) + verify(u0.has_key(i) == d0.has_key(i)) + verify((i in u0) == (i in d0)) + +# Test update + +t = UserDict() +t.update(u2) +verify(t == u2) + +# Test get + +for i in u2.keys(): + verify(u2.get(i) == u2[i]) + verify(u1.get(i) == d1.get(i)) + verify(u0.get(i) == d0.get(i)) + +# Test "in" iteration. +for i in xrange(20): + u2[i] = str(i) +ikeys = [] +for k in u2: + ikeys.append(k) +ikeys.sort() +keys = u2.keys() +keys.sort() +verify(ikeys == keys) diff --git a/lib-python/2.2/test/test_userlist.py b/lib-python/2.2/test/test_userlist.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_userlist.py @@ -0,0 +1,201 @@ +# Check every path through every method of UserList + +from UserList import UserList +from test_support import TestFailed + +# Use check instead of assert so -O doesn't render the +# test useless. +# XXX: could use the verify function in test_support instead +def check(predicate, msg): + if not predicate: + raise TestFailed(msg + " failed") + +l0 = [] +l1 = [0] +l2 = [0, 1] + +# Test constructors + +u = UserList() +u0 = UserList(l0) +u1 = UserList(l1) +u2 = UserList(l2) + +uu = UserList(u) +uu0 = UserList(u0) +uu1 = UserList(u1) +uu2 = UserList(u2) + +v = UserList(tuple(u)) +class OtherList: + def __init__(self, initlist): + self.__data = initlist + def __len__(self): + return len(self.__data) + def __getitem__(self, i): + return self.__data[i] +v0 = UserList(OtherList(u0)) +vv = UserList("this is also a sequence") + +# Test __repr__ + +check(str(u0) == str(l0), "str(u0) == str(l0)") +check(repr(u1) == repr(l1), "repr(u1) == repr(l1)") +check(`u2` == `l2`, "`u2` == `l2`") + +# Test __cmp__ and __len__ + +def mycmp(a, b): + r = cmp(a, b) + if r < 0: return -1 + if r > 0: return 1 + return r + +all = [l0, l1, l2, u, u0, u1, u2, uu, uu0, uu1, uu2] +for a in all: + for b in all: + check(mycmp(a, b) == mycmp(len(a), len(b)), + "mycmp(a, b) == mycmp(len(a), len(b))") + +# Test __getitem__ + +for i in range(len(u2)): + check(u2[i] == i, "u2[i] == i") + +# Test __setitem__ + +uu2[0] = 0 +uu2[1] = 100 +try: + uu2[2] = 200 +except IndexError: + pass +else: + raise TestFailed("uu2[2] shouldn't be assignable") + +# Test __delitem__ + +del uu2[1] +del uu2[0] +try: + del uu2[0] +except IndexError: + pass +else: + raise TestFailed("uu2[0] shouldn't be deletable") + +# Test __getslice__ + +for i in range(-3, 4): + check(u2[:i] == l2[:i], "u2[:i] == l2[:i]") + check(u2[i:] == l2[i:], "u2[i:] == l2[i:]") + for j in range(-3, 4): + check(u2[i:j] == l2[i:j], "u2[i:j] == l2[i:j]") + +# Test __setslice__ + +for i in range(-3, 4): + u2[:i] = l2[:i] + check(u2 == l2, "u2 == l2") + u2[i:] = l2[i:] + check(u2 == l2, "u2 == l2") + for j in range(-3, 4): + u2[i:j] = l2[i:j] + check(u2 == l2, "u2 == l2") + +uu2 = u2[:] +uu2[:0] = [-2, -1] +check(uu2 == [-2, -1, 0, 1], "uu2 == [-2, -1, 0, 1]") +uu2[0:] = [] +check(uu2 == [], "uu2 == []") + +# Test __contains__ +for i in u2: + check(i in u2, "i in u2") +for i in min(u2)-1, max(u2)+1: + check(i not in u2, "i not in u2") + +# Test __delslice__ + +uu2 = u2[:] +del uu2[1:2] +del uu2[0:1] +check(uu2 == [], "uu2 == []") + +uu2 = u2[:] +del uu2[1:] +del uu2[:1] +check(uu2 == [], "uu2 == []") + +# Test __add__, __radd__, __mul__ and __rmul__ + +check(u1 + [] == [] + u1 == u1, "u1 + [] == [] + u1 == u1") +check(u1 + [1] == u2, "u1 + [1] == u2") +check([-1] + u1 == [-1, 0], "[-1] + u1 == [-1, 0]") +check(u2 == u2*1 == 1*u2, "u2 == u2*1 == 1*u2") +check(u2+u2 == u2*2 == 2*u2, "u2+u2 == u2*2 == 2*u2") +check(u2+u2+u2 == u2*3 == 3*u2, "u2+u2+u2 == u2*3 == 3*u2") + +# Test append + +u = u1[:] +u.append(1) +check(u == u2, "u == u2") + +# Test insert + +u = u2[:] +u.insert(0, -1) +check(u == [-1, 0, 1], "u == [-1, 0, 1]") + +# Test pop + +u = [-1] + u2 +u.pop() +check(u == [-1, 0], "u == [-1, 0]") +u.pop(0) +check(u == [0], "u == [0]") + +# Test remove + +u = u2[:] +u.remove(1) +check(u == u1, "u == u1") + +# Test count +u = u2*3 +check(u.count(0) == 3, "u.count(0) == 3") +check(u.count(1) == 3, "u.count(1) == 3") +check(u.count(2) == 0, "u.count(2) == 0") + + +# Test index + +check(u2.index(0) == 0, "u2.index(0) == 0") +check(u2.index(1) == 1, "u2.index(1) == 1") +try: + u2.index(2) +except ValueError: + pass +else: + raise TestFailed("expected ValueError") + +# Test reverse + +u = u2[:] +u.reverse() +check(u == [1, 0], "u == [1, 0]") +u.reverse() +check(u == u2, "u == u2") + +# Test sort + +u = UserList([1, 0]) +u.sort() +check(u == u2, "u == u2") + +# Test extend + +u = u1[:] +u.extend(u2) +check(u == u1 + u2, "u == u1 + u2") diff --git a/lib-python/2.2/test/test_userstring.py b/lib-python/2.2/test/test_userstring.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/test/test_userstring.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +import sys +from test_support import verbose +import string_tests +# UserString is a wrapper around the native builtin string type. +# UserString instances should behave similar to builtin string objects. +# The test cases were in part derived from 'test_string.py'. +from UserString import UserString + +if __name__ == "__main__": + verbose = '-v' in sys.argv + +tested_methods = {} + +def test(methodname, input, output, *args): + global tested_methods + tested_methods[methodname] = 1 + if verbose: + print '%r.%s(%s)' % (input, methodname, ", ".join(map(repr, args))), + u = UserString(input) + objects = [input, u, UserString(u)] + res = [""] * 3 + for i in range(3): + object = objects[i] + try: + f = getattr(object, methodname) + except AttributeError: + f = None + res[i] = AttributeError + else: + try: + res[i] = apply(f, args) + except: + res[i] = sys.exc_type + if res[0] == res[1] == res[2] == output: + if verbose: + print 'yes' + else: + if verbose: + print 'no' + print (methodname, input, output, args, res[0], res[1], res[2]) + +string_tests.run_method_tests(test) diff --git a/lib-python/2.2/test/test_uu.py b/lib-python/2.2/test/test_uu.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_uu.py @@ -0,0 +1,158 @@ +""" +Tests for uu module. +Nick Mathewson +""" + +from test_support import verify, TestFailed, verbose, TESTFN +import sys, os +import uu +from StringIO import StringIO + +teststr = "The smooth-scaled python crept over the sleeping dog\n" +expected = """\ +M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P +(:6YG(&1O9PH """ +encoded1 = "begin 666 t1\n"+expected+"\n \nend\n" +if verbose: + print '1. encode file->file' +inp = StringIO(teststr) +out = StringIO() +uu.encode(inp, out, "t1") +verify(out.getvalue() == encoded1) +inp = StringIO(teststr) +out = StringIO() +uu.encode(inp, out, "t1", 0644) +verify(out.getvalue() == "begin 644 t1\n"+expected+"\n \nend\n") + +if verbose: + print '2. decode file->file' +inp = StringIO(encoded1) +out = StringIO() +uu.decode(inp, out) +verify(out.getvalue() == teststr) +inp = StringIO("""UUencoded files may contain many lines, + even some that have 'begin' in them.\n"""+encoded1) +out = StringIO() +uu.decode(inp, out) +verify(out.getvalue() == teststr) + +stdinsave = sys.stdin +stdoutsave = sys.stdout +try: + if verbose: + print '3. encode stdin->stdout' + sys.stdin = StringIO(teststr) + sys.stdout = StringIO() + uu.encode("-", "-", "t1", 0666) + verify(sys.stdout.getvalue() == encoded1) + if verbose: + print >>stdoutsave, '4. decode stdin->stdout' + sys.stdin = StringIO(encoded1) + sys.stdout = StringIO() + uu.decode("-", "-") + verify(sys.stdout.getvalue() == teststr) +finally: + sys.stdin = stdinsave + sys.stdout = stdoutsave + +if verbose: + print '5. encode file->file' +tmpIn = TESTFN + "i" +tmpOut = TESTFN + "o" +try: + fin = open(tmpIn, 'wb') + fin.write(teststr) + fin.close() + + fin = open(tmpIn, 'rb') + fout = open(tmpOut, 'w') + uu.encode(fin, fout, tmpIn, mode=0644) + fin.close() + fout.close() + + fout = open(tmpOut, 'r') + s = fout.read() + fout.close() + verify(s == 'begin 644 ' + tmpIn + '\n' + expected + '\n \nend\n') + + os.unlink(tmpIn) + if verbose: + print '6. decode file-> file' + uu.decode(tmpOut) + fin = open(tmpIn, 'rb') + s = fin.read() + fin.close() + verify(s == teststr) + # XXX is there an xp way to verify the mode? + +finally: + try: + fin.close() + except: + pass + try: + fout.close() + except: + pass + try: + os.unlink(tmpIn) + except: + pass + try: + os.unlink(tmpOut) + except: + pass + +if verbose: + print '7. error: truncated input' +inp = StringIO("begin 644 t1\n"+expected) +out = StringIO() +try: + uu.decode(inp, out) + raise TestFailed("No exception thrown") +except uu.Error, e: + verify(str(e) == 'Truncated input file') + +if verbose: + print '8. error: missing begin' +inp = StringIO("") +out = StringIO() +try: + uu.decode(inp, out) + raise TestFailed("No exception thrown") +except uu.Error, e: + verify(str(e) == 'No valid begin line found in input file') + +# Test to verify that decode() will refuse to overwrite an existing file +import tempfile +outfile = tempfile.mktemp() +inp = StringIO('Here is a message to be uuencoded') +out = StringIO() +uu.encode(inp, out, outfile) +out.seek(0) +try: + if verbose: + print '9. decode w/file not exists is okay' + uu.decode(out) + if not os.path.exists(outfile): + raise TestFailed('uudecode w/ out_file=None failed') + fp = open(outfile) + data = fp.read() + fp.close() + if data <> inp.getvalue(): + raise TestFailed('uudecode stored something weird') + # Try to write it again, which should cause a failure + if verbose: + print '10. uudecode w/file exists fails' + out.seek(0) + try: + uu.decode(out) + except uu.Error: + pass + else: + raise TestFailed('expected to get a "file exists" error') +finally: + try: + os.unlink(outfile) + except OSError: + pass diff --git a/lib-python/2.2/test/test_wave.py b/lib-python/2.2/test/test_wave.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_wave.py @@ -0,0 +1,34 @@ +from test_support import TestFailed +import os, tempfile +import wave + +def check(t, msg=None): + if not t: + raise TestFailed, msg + +nchannels = 2 +sampwidth = 2 +framerate = 8000 +nframes = 100 + +testfile = tempfile.mktemp() + +f = wave.open(testfile, 'wb') +f.setnchannels(nchannels) +f.setsampwidth(sampwidth) +f.setframerate(framerate) +f.setnframes(nframes) +output = '\0' * nframes * nchannels * sampwidth +f.writeframes(output) +f.close() + +f = wave.open(testfile, 'rb') +check(nchannels == f.getnchannels(), "nchannels") +check(sampwidth == f.getsampwidth(), "sampwidth") +check(framerate == f.getframerate(), "framerate") +check(nframes == f.getnframes(), "nframes") +input = f.readframes(nframes) +check(input == output, "data") +f.close() + +os.remove(testfile) diff --git a/lib-python/2.2/test/test_weakref.py b/lib-python/2.2/test/test_weakref.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_weakref.py @@ -0,0 +1,573 @@ +import sys +import unittest +import UserList +import weakref + +import test_support + + +class C: + def method(self): + pass + + +class Callable: + bar = None + + def __call__(self, x): + self.bar = x + + +def create_function(): + def f(): pass + return f + +def create_bound_method(): + return C().method + +def create_unbound_method(): + return C.method + + +class TestBase(unittest.TestCase): + + def setUp(self): + self.cbcalled = 0 + + def callback(self, ref): + self.cbcalled += 1 + + +class ReferencesTestCase(TestBase): + + def test_basic_ref(self): + self.check_basic_ref(C) + self.check_basic_ref(create_function) + self.check_basic_ref(create_bound_method) + self.check_basic_ref(create_unbound_method) + + def test_basic_callback(self): + self.check_basic_callback(C) + self.check_basic_callback(create_function) + self.check_basic_callback(create_bound_method) + self.check_basic_callback(create_unbound_method) + + def test_multiple_callbacks(self): + o = C() + ref1 = weakref.ref(o, self.callback) + ref2 = weakref.ref(o, self.callback) + del o + self.assert_(ref1() is None, + "expected reference to be invalidated") + self.assert_(ref2() is None, + "expected reference to be invalidated") + self.assert_(self.cbcalled == 2, + "callback not called the right number of times") + + def test_multiple_selfref_callbacks(self): + """Make sure all references are invalidated before callbacks + are called.""" + # + # What's important here is that we're using the first + # reference in the callback invoked on the second reference + # (the most recently created ref is cleaned up first). This + # tests that all references to the object are invalidated + # before any of the callbacks are invoked, so that we only + # have one invocation of _weakref.c:cleanup_helper() active + # for a particular object at a time. + # + def callback(object, self=self): + self.ref() + c = C() + self.ref = weakref.ref(c, callback) + ref1 = weakref.ref(c, callback) + del c + + def test_proxy_ref(self): + o = C() + o.bar = 1 + ref1 = weakref.proxy(o, self.callback) + ref2 = weakref.proxy(o, self.callback) + del o + + def check(proxy): + proxy.bar + + self.assertRaises(weakref.ReferenceError, check, ref1) + self.assertRaises(weakref.ReferenceError, check, ref2) + self.assert_(self.cbcalled == 2) + + def check_basic_ref(self, factory): + o = factory() + ref = weakref.ref(o) + self.assert_(ref() is not None, + "weak reference to live object should be live") + o2 = ref() + self.assert_(o is o2, + "() should return original object if live") + + def check_basic_callback(self, factory): + self.cbcalled = 0 + o = factory() + ref = weakref.ref(o, self.callback) + del o + self.assert_(self.cbcalled == 1, + "callback did not properly set 'cbcalled'") + self.assert_(ref() is None, + "ref2 should be dead after deleting object reference") + + def test_ref_reuse(self): + o = C() + ref1 = weakref.ref(o) + # create a proxy to make sure that there's an intervening creation + # between these two; it should make no difference + proxy = weakref.proxy(o) + ref2 = weakref.ref(o) + self.assert_(ref1 is ref2, + "reference object w/out callback should be re-used") + + o = C() + proxy = weakref.proxy(o) + ref1 = weakref.ref(o) + ref2 = weakref.ref(o) + self.assert_(ref1 is ref2, + "reference object w/out callback should be re-used") + self.assert_(weakref.getweakrefcount(o) == 2, + "wrong weak ref count for object") + del proxy + self.assert_(weakref.getweakrefcount(o) == 1, + "wrong weak ref count for object after deleting proxy") + + def test_proxy_reuse(self): + o = C() + proxy1 = weakref.proxy(o) + ref = weakref.ref(o) + proxy2 = weakref.proxy(o) + self.assert_(proxy1 is proxy2, + "proxy object w/out callback should have been re-used") + + def test_basic_proxy(self): + o = C() + self.check_proxy(o, weakref.proxy(o)) + + L = UserList.UserList() + p = weakref.proxy(L) + self.failIf(p, "proxy for empty UserList should be false") + p.append(12) + self.assertEqual(len(L), 1) + self.failUnless(p, "proxy for non-empty UserList should be true") + p[:] = [2, 3] + self.assertEqual(len(L), 2) + self.assertEqual(len(p), 2) + self.failUnless(3 in p, "proxy didn't support __contains__() properly") + p[1] = 5 + self.assertEqual(L[1], 5) + self.assertEqual(p[1], 5) + L2 = UserList.UserList(L) + p2 = weakref.proxy(L2) + self.assertEqual(p, p2) + + def test_callable_proxy(self): + o = Callable() + ref1 = weakref.proxy(o) + + self.check_proxy(o, ref1) + + self.assert_(type(ref1) is weakref.CallableProxyType, + "proxy is not of callable type") + ref1('twinkies!') + self.assert_(o.bar == 'twinkies!', + "call through proxy not passed through to original") + ref1(x='Splat.') + self.assert_(o.bar == 'Splat.', + "call through proxy not passed through to original") + + # expect due to too few args + self.assertRaises(TypeError, ref1) + + # expect due to too many args + self.assertRaises(TypeError, ref1, 1, 2, 3) + + def check_proxy(self, o, proxy): + o.foo = 1 + self.assert_(proxy.foo == 1, + "proxy does not reflect attribute addition") + o.foo = 2 + self.assert_(proxy.foo == 2, + "proxy does not reflect attribute modification") + del o.foo + self.assert_(not hasattr(proxy, 'foo'), + "proxy does not reflect attribute removal") + + proxy.foo = 1 + self.assert_(o.foo == 1, + "object does not reflect attribute addition via proxy") + proxy.foo = 2 + self.assert_( + o.foo == 2, + "object does not reflect attribute modification via proxy") + del proxy.foo + self.assert_(not hasattr(o, 'foo'), + "object does not reflect attribute removal via proxy") + + def test_getweakrefcount(self): + o = C() + ref1 = weakref.ref(o) + ref2 = weakref.ref(o, self.callback) + self.assert_(weakref.getweakrefcount(o) == 2, + "got wrong number of weak reference objects") + + proxy1 = weakref.proxy(o) + proxy2 = weakref.proxy(o, self.callback) + self.assert_(weakref.getweakrefcount(o) == 4, + "got wrong number of weak reference objects") + + def test_getweakrefs(self): + o = C() + ref1 = weakref.ref(o, self.callback) + ref2 = weakref.ref(o, self.callback) + del ref1 + self.assert_(weakref.getweakrefs(o) == [ref2], + "list of refs does not match") + + o = C() + ref1 = weakref.ref(o, self.callback) + ref2 = weakref.ref(o, self.callback) + del ref2 + self.assert_(weakref.getweakrefs(o) == [ref1], + "list of refs does not match") + + def test_newstyle_number_ops(self): + class F(float): + pass + f = F(2.0) + p = weakref.proxy(f) + self.assert_(p + 1.0 == 3.0) + self.assert_(1.0 + p == 3.0) # this used to SEGV + + def test_callbacks_protected(self): + """Callbacks protected from already-set exceptions?""" + # Regression test for SF bug #478534. + class BogusError(Exception): + pass + data = {} + def remove(k): + del data[k] + def encapsulate(): + f = lambda : () + data[weakref.ref(f, remove)] = None + raise BogusError + try: + encapsulate() + except BogusError: + pass + else: + self.fail("exception not properly restored") + try: + encapsulate() + except BogusError: + pass + else: + self.fail("exception not properly restored") + + +class Object: + def __init__(self, arg): + self.arg = arg + def __repr__(self): + return "" % self.arg + + +class MappingTestCase(TestBase): + + COUNT = 10 + + def test_weak_values(self): + # + # This exercises d.copy(), d.items(), d[], del d[], len(d). + # + dict, objects = self.make_weak_valued_dict() + for o in objects: + self.assert_(weakref.getweakrefcount(o) == 1, + "wrong number of weak references to %r!" % o) + self.assert_(o is dict[o.arg], + "wrong object returned by weak dict!") + items1 = dict.items() + items2 = dict.copy().items() + items1.sort() + items2.sort() + self.assert_(items1 == items2, + "cloning of weak-valued dictionary did not work!") + del items1, items2 + self.assert_(len(dict) == self.COUNT) + del objects[0] + self.assert_(len(dict) == (self.COUNT - 1), + "deleting object did not cause dictionary update") + del objects, o + self.assert_(len(dict) == 0, + "deleting the values did not clear the dictionary") + # regression on SF bug #447152: + dict = weakref.WeakValueDictionary() + self.assertRaises(KeyError, dict.__getitem__, 1) + dict[2] = C() + self.assertRaises(KeyError, dict.__getitem__, 2) + + def test_weak_keys(self): + # + # This exercises d.copy(), d.items(), d[] = v, d[], del d[], + # len(d), d.has_key(). + # + dict, objects = self.make_weak_keyed_dict() + for o in objects: + self.assert_(weakref.getweakrefcount(o) == 1, + "wrong number of weak references to %r!" % o) + self.assert_(o.arg is dict[o], + "wrong object returned by weak dict!") + items1 = dict.items() + items2 = dict.copy().items() + items1.sort() + items2.sort() + self.assert_(items1 == items2, + "cloning of weak-keyed dictionary did not work!") + del items1, items2 + self.assert_(len(dict) == self.COUNT) + del objects[0] + self.assert_(len(dict) == (self.COUNT - 1), + "deleting object did not cause dictionary update") + del objects, o + self.assert_(len(dict) == 0, + "deleting the keys did not clear the dictionary") + o = Object(42) + dict[o] = "What is the meaning of the universe?" + self.assert_(dict.has_key(o)) + self.assert_(not dict.has_key(34)) + + def test_weak_keyed_iters(self): + dict, objects = self.make_weak_keyed_dict() + self.check_iters(dict) + + def test_weak_valued_iters(self): + dict, objects = self.make_weak_valued_dict() + self.check_iters(dict) + + def check_iters(self, dict): + # item iterator: + items = dict.items() + for item in dict.iteritems(): + items.remove(item) + self.assert_(len(items) == 0, "iteritems() did not touch all items") + + # key iterator, via __iter__(): + keys = dict.keys() + for k in dict: + keys.remove(k) + self.assert_(len(keys) == 0, "__iter__() did not touch all keys") + + # key iterator, via iterkeys(): + keys = dict.keys() + for k in dict.iterkeys(): + keys.remove(k) + self.assert_(len(keys) == 0, "iterkeys() did not touch all keys") + + # value iterator: + values = dict.values() + for v in dict.itervalues(): + values.remove(v) + self.assert_(len(values) == 0, "itervalues() did not touch all values") + + def test_make_weak_keyed_dict_from_dict(self): + o = Object(3) + dict = weakref.WeakKeyDictionary({o:364}) + self.assert_(dict[o] == 364) + + def test_make_weak_keyed_dict_from_weak_keyed_dict(self): + o = Object(3) + dict = weakref.WeakKeyDictionary({o:364}) + dict2 = weakref.WeakKeyDictionary(dict) + self.assert_(dict[o] == 364) + + def make_weak_keyed_dict(self): + dict = weakref.WeakKeyDictionary() + objects = map(Object, range(self.COUNT)) + for o in objects: + dict[o] = o.arg + return dict, objects + + def make_weak_valued_dict(self): + dict = weakref.WeakValueDictionary() + objects = map(Object, range(self.COUNT)) + for o in objects: + dict[o.arg] = o + return dict, objects + + def check_popitem(self, klass, key1, value1, key2, value2): + weakdict = klass() + weakdict[key1] = value1 + weakdict[key2] = value2 + self.assert_(len(weakdict) == 2) + k, v = weakdict.popitem() + self.assert_(len(weakdict) == 1) + if k is key1: + self.assert_(v is value1) + else: + self.assert_(v is value2) + k, v = weakdict.popitem() + self.assert_(len(weakdict) == 0) + if k is key1: + self.assert_(v is value1) + else: + self.assert_(v is value2) + + def test_weak_valued_dict_popitem(self): + self.check_popitem(weakref.WeakValueDictionary, + "key1", C(), "key2", C()) + + def test_weak_keyed_dict_popitem(self): + self.check_popitem(weakref.WeakKeyDictionary, + C(), "value 1", C(), "value 2") + + def check_setdefault(self, klass, key, value1, value2): + self.assert_(value1 is not value2, + "invalid test" + " -- value parameters must be distinct objects") + weakdict = klass() + o = weakdict.setdefault(key, value1) + self.assert_(o is value1) + self.assert_(weakdict.has_key(key)) + self.assert_(weakdict.get(key) is value1) + self.assert_(weakdict[key] is value1) + + o = weakdict.setdefault(key, value2) + self.assert_(o is value1) + self.assert_(weakdict.has_key(key)) + self.assert_(weakdict.get(key) is value1) + self.assert_(weakdict[key] is value1) + + def test_weak_valued_dict_setdefault(self): + self.check_setdefault(weakref.WeakValueDictionary, + "key", C(), C()) + + def test_weak_keyed_dict_setdefault(self): + self.check_setdefault(weakref.WeakKeyDictionary, + C(), "value 1", "value 2") + + def check_update(self, klass, dict): + # + # This exercises d.update(), len(d), d.keys(), d.has_key(), + # d.get(), d[]. + # + weakdict = klass() + weakdict.update(dict) + self.assert_(len(weakdict) == len(dict)) + for k in weakdict.keys(): + self.assert_(dict.has_key(k), + "mysterious new key appeared in weak dict") + v = dict.get(k) + self.assert_(v is weakdict[k]) + self.assert_(v is weakdict.get(k)) + for k in dict.keys(): + self.assert_(weakdict.has_key(k), + "original key disappeared in weak dict") + v = dict[k] + self.assert_(v is weakdict[k]) + self.assert_(v is weakdict.get(k)) + + def test_weak_valued_dict_update(self): + self.check_update(weakref.WeakValueDictionary, + {1: C(), 'a': C(), C(): C()}) + + def test_weak_keyed_dict_update(self): + self.check_update(weakref.WeakKeyDictionary, + {C(): 1, C(): 2, C(): 3}) + + def test_weak_keyed_delitem(self): + d = weakref.WeakKeyDictionary() + o1 = Object('1') + o2 = Object('2') + d[o1] = 'something' + d[o2] = 'something' + self.assert_(len(d) == 2) + del d[o1] + self.assert_(len(d) == 1) + self.assert_(d.keys() == [o2]) + + def test_weak_valued_delitem(self): + d = weakref.WeakValueDictionary() + o1 = Object('1') + o2 = Object('2') + d['something'] = o1 + d['something else'] = o2 + self.assert_(len(d) == 2) + del d['something'] + self.assert_(len(d) == 1) + self.assert_(d.items() == [('something else', o2)]) + + def test_weak_keyed_bad_delitem(self): + d = weakref.WeakKeyDictionary() + o = Object('1') + # An attempt to delete an object that isn't there should raise + # KeyError. It didn't before 2.3. + self.assertRaises(KeyError, d.__delitem__, o) + self.assertRaises(KeyError, d.__getitem__, o) + + # If a key isn't of a weakly referencable type, __getitem__ and + # __setitem__ raise TypeError. __delitem__ should too. + self.assertRaises(TypeError, d.__delitem__, 13) + self.assertRaises(TypeError, d.__getitem__, 13) + self.assertRaises(TypeError, d.__setitem__, 13, 13) + + def test_weak_keyed_cascading_deletes(self): + # SF bug 742860. For some reason, before 2.3 __delitem__ iterated + # over the keys via self.data.iterkeys(). If things vanished from + # the dict during this (or got added), that caused a RuntimeError. + + d = weakref.WeakKeyDictionary() + mutate = False + + class C(object): + def __init__(self, i): + self.value = i + def __hash__(self): + return hash(self.value) + def __eq__(self, other): + if mutate: + # Side effect that mutates the dict, by removing the + # last strong reference to a key. + del objs[-1] + return self.value == other.value + + objs = [C(i) for i in range(4)] + for o in objs: + d[o] = o.value + del o # now the only strong references to keys are in objs + # Find the order in which iterkeys sees the keys. + objs = d.keys() + # Reverse it, so that the iteration implementation of __delitem__ + # has to keep looping to find the first object we delete. + objs.reverse() + + # Turn on mutation in C.__eq__. The first time thru the loop, + # under the iterkeys() business the first comparison will delete + # the last item iterkeys() would see, and that causes a + # RuntimeError: dictionary changed size during iteration + # when the iterkeys() loop goes around to try comparing the next + # key. After this was fixed, it just deletes the last object *our* + # "for o in obj" loop would have gotten to. + mutate = True + count = 0 + for o in objs: + count += 1 + del d[o] + self.assertEqual(len(d), 0) + self.assertEqual(count, 2) + +def test_main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTest(loader.loadTestsFromTestCase(ReferencesTestCase)) + suite.addTest(loader.loadTestsFromTestCase(MappingTestCase)) + test_support.run_suite(suite) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_winreg.py b/lib-python/2.2/test/test_winreg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_winreg.py @@ -0,0 +1,151 @@ +# Test the windows specific win32reg module. +# Only win32reg functions not hit here: FlushKey, LoadKey and SaveKey + +from _winreg import * +import os, sys + +from test_support import verify, have_unicode + +test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me" + +test_data = [ + ("Int Value", 45, REG_DWORD), + ("String Val", "A string value", REG_SZ,), + ("StringExpand", "The path is %path%", REG_EXPAND_SZ), + ("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ), + ("Raw Data", ("binary"+chr(0)+"data"), REG_BINARY), +] +if have_unicode: + test_data+=[ + (unicode("Unicode Val"), unicode("A Unicode value"), REG_SZ,), + ("UnicodeExpand", unicode("The path is %path%"), REG_EXPAND_SZ), + ("Multi-unicode", [unicode("Lots"), unicode("of"), unicode("unicode"), unicode("values")], REG_MULTI_SZ), + ("Multi-mixed", [unicode("Unicode"), unicode("and"), "string", "values"],REG_MULTI_SZ), + ] + +def WriteTestData(root_key): + # Set the default value for this key. + SetValue(root_key, test_key_name, REG_SZ, "Default value") + key = CreateKey(root_key, test_key_name) + # Create a sub-key + sub_key = CreateKey(key, "sub_key") + # Give the sub-key some named values + + for value_name, value_data, value_type in test_data: + SetValueEx(sub_key, value_name, 0, value_type, value_data) + + # Check we wrote as many items as we thought. + nkeys, nvalues, since_mod = QueryInfoKey(key) + verify(nkeys==1, "Not the correct number of sub keys") + verify(nvalues==1, "Not the correct number of values") + nkeys, nvalues, since_mod = QueryInfoKey(sub_key) + verify(nkeys==0, "Not the correct number of sub keys") + verify(nvalues==len(test_data), "Not the correct number of values") + # Close this key this way... + # (but before we do, copy the key as an integer - this allows + # us to test that the key really gets closed). + int_sub_key = int(sub_key) + CloseKey(sub_key) + try: + QueryInfoKey(int_sub_key) + raise RuntimeError, "It appears the CloseKey() function does not close the actual key!" + except EnvironmentError: + pass + # ... and close that key that way :-) + int_key = int(key) + key.Close() + try: + QueryInfoKey(int_key) + raise RuntimeError, "It appears the key.Close() function does not close the actual key!" + except EnvironmentError: + pass + +def ReadTestData(root_key): + # Check we can get default value for this key. + val = QueryValue(root_key, test_key_name) + verify(val=="Default value", "Registry didn't give back the correct value") + + key = OpenKey(root_key, test_key_name) + # Read the sub-keys + sub_key = OpenKey(key, "sub_key") + # Check I can enumerate over the values. + index = 0 + while 1: + try: + data = EnumValue(sub_key, index) + except EnvironmentError: + break + verify(data in test_data, "Didn't read back the correct test data") + index = index + 1 + verify(index==len(test_data), "Didn't read the correct number of items") + # Check I can directly access each item + for value_name, value_data, value_type in test_data: + read_val, read_typ = QueryValueEx(sub_key, value_name) + verify(read_val==value_data and read_typ == value_type, \ + "Could not directly read the value" ) + sub_key.Close() + # Enumerate our main key. + read_val = EnumKey(key, 0) + verify(read_val == "sub_key", "Read subkey value wrong") + try: + EnumKey(key, 1) + verify(0, "Was able to get a second key when I only have one!") + except EnvironmentError: + pass + + key.Close() + +def DeleteTestData(root_key): + key = OpenKey(root_key, test_key_name, 0, KEY_ALL_ACCESS) + sub_key = OpenKey(key, "sub_key", 0, KEY_ALL_ACCESS) + # It is not necessary to delete the values before deleting + # the key (although subkeys must not exist). We delete them + # manually just to prove we can :-) + for value_name, value_data, value_type in test_data: + DeleteValue(sub_key, value_name) + + nkeys, nvalues, since_mod = QueryInfoKey(sub_key) + verify(nkeys==0 and nvalues==0, "subkey not empty before delete") + sub_key.Close() + DeleteKey(key, "sub_key") + + try: + # Shouldnt be able to delete it twice! + DeleteKey(key, "sub_key") + verify(0, "Deleting the key twice succeeded") + except EnvironmentError: + pass + key.Close() + DeleteKey(root_key, test_key_name) + # Opening should now fail! + try: + key = OpenKey(root_key, test_key_name) + verify(0, "Could open the non-existent key") + except WindowsError: # Use this error name this time + pass + +def TestAll(root_key): + WriteTestData(root_key) + ReadTestData(root_key) + DeleteTestData(root_key) + +# Test on my local machine. +TestAll(HKEY_CURRENT_USER) +print "Local registry tests worked" +try: + remote_name = sys.argv[sys.argv.index("--remote")+1] +except (IndexError, ValueError): + remote_name = None + +if remote_name is not None: + try: + remote_key = ConnectRegistry(remote_name, HKEY_CURRENT_USER) + except EnvironmentError, exc: + print "Could not connect to the remote machine -", exc.strerror + remote_key = None + if remote_key is not None: + TestAll(remote_key) + print "Remote registry tests worked" +else: + print "Remote registry calls can be tested using", + print "'test_winreg.py --remote \\\\machine_name'" diff --git a/lib-python/2.2/test/test_winsound.py b/lib-python/2.2/test/test_winsound.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_winsound.py @@ -0,0 +1,6 @@ +# Ridiculously simple test of the winsound module for Windows. + +import winsound +for i in range(100, 2000, 100): + winsound.Beep(i, 75) +print "Hopefully you heard some sounds increasing in frequency!" diff --git a/lib-python/2.2/test/test_xmllib.py b/lib-python/2.2/test/test_xmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_xmllib.py @@ -0,0 +1,35 @@ +'''Test module to thest the xmllib module. + Sjoerd Mullender +''' + +testdoc = """\ + + + + +]> +Hello, world! +""" + +import test_support +import unittest +import xmllib + + +class XMLParserTestCase(unittest.TestCase): + + def test_simple(self): + parser = xmllib.XMLParser() + for c in testdoc: + parser.feed(c) + parser.close() + + +def test_main(): + test_support.run_unittest(XMLParserTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_xmlrpc.py b/lib-python/2.2/test/test_xmlrpc.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_xmlrpc.py @@ -0,0 +1,37 @@ +import sys +import test_support +import unittest +import xmlrpclib + +alist = [{'astring': 'foo at bar.baz.spam', + 'afloat': 7283.43, + 'anint': 2**20, + 'ashortlong': 2L, + 'anotherlist': ['.zyx.41'], + 'abase64': xmlrpclib.Binary("my dog has fleas"), + 'boolean': xmlrpclib.False, + }] + +class XMLRPCTestCase(unittest.TestCase): + + def test_dump_load(self): + self.assertEquals(alist, + xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0]) + + def test_dump_big_long(self): + self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) + + def test_dump_bad_dict(self): + self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},)) + + def test_dump_big_int(self): + if sys.maxint > 2L**31-1: + self.assertRaises(OverflowError, xmlrpclib.dumps, + (int(2L**34),)) + +def test_main(): + test_support.run_unittest(XMLRPCTestCase) + + +if __name__ == "__main__": + test_main() diff --git a/lib-python/2.2/test/test_xreadline.py b/lib-python/2.2/test/test_xreadline.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_xreadline.py @@ -0,0 +1,43 @@ +from test_support import verbose + +class XReader: + def __init__(self): + self.count = 5 + + def readlines(self, sizehint = None): + self.count = self.count - 1 + return map(lambda x: "%d\n" % x, range(self.count)) + +class Null: pass + +import xreadlines + + +lineno = 0 + +try: + xreadlines.xreadlines(Null())[0] +except AttributeError, detail: + print "AttributeError (expected)" +else: + print "Did not throw attribute error" + +try: + xreadlines.xreadlines(XReader)[0] +except TypeError, detail: + print "TypeError (expected)" +else: + print "Did not throw type error" + +try: + xreadlines.xreadlines(XReader())[1] +except RuntimeError, detail: + print "RuntimeError (expected):", detail +else: + print "Did not throw runtime error" + +xresult = ['0\n', '1\n', '2\n', '3\n', '0\n', '1\n', '2\n', '0\n', '1\n', '0\n'] +for line in xreadlines.xreadlines(XReader()): + if line != xresult[lineno]: + print "line %d differs" % lineno + lineno += 1 diff --git a/lib-python/2.2/test/test_zipfile.py b/lib-python/2.2/test/test_zipfile.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_zipfile.py @@ -0,0 +1,78 @@ +import zlib # implied prerequisite +import zipfile, os, StringIO, tempfile +from test_support import TestFailed + +srcname = "junk9630"+os.extsep+"tmp" +zipname = "junk9708"+os.extsep+"tmp" + + +def zipTest(f, compression, srccontents): + zip = zipfile.ZipFile(f, "w", compression) # Create the ZIP archive + zip.write(srcname, "another"+os.extsep+"name") + zip.write(srcname, srcname) + zip.close() + + zip = zipfile.ZipFile(f, "r", compression) # Read the ZIP archive + readData2 = zip.read(srcname) + readData1 = zip.read("another"+os.extsep+"name") + zip.close() + + if readData1 != srccontents or readData2 != srccontents: + raise TestFailed, "Written data doesn't equal read data." + + +try: + fp = open(srcname, "wb") # Make a source file with some lines + for i in range(0, 1000): + fp.write("Test of zipfile line %d.\n" % i) + fp.close() + + fp = open(srcname, "rb") + writtenData = fp.read() + fp.close() + + for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()): + zipTest(file, zipfile.ZIP_STORED, writtenData) + + for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()): + zipTest(file, zipfile.ZIP_DEFLATED, writtenData) + +finally: + if os.path.isfile(srcname): # Remove temporary files + os.unlink(srcname) + if os.path.isfile(zipname): + os.unlink(zipname) + + +# This test checks that the ZipFile constructor closes the file object +# it opens if there's an error in the file. If it doesn't, the traceback +# holds a reference to the ZipFile object and, indirectly, the file object. +# On Windows, this causes the os.unlink() call to fail because the +# underlying file is still open. This is SF bug #412214. +# +fp = open(srcname, "w") +fp.write("this is not a legal zip file\n") +fp.close() +try: + zf = zipfile.ZipFile(srcname) +except zipfile.BadZipfile: + os.unlink(srcname) + + +# make sure we don't raise an AttributeError when a partially-constructed +# ZipFile instance is finalized; this tests for regression on SF tracker +# bug #403871. +try: + zipfile.ZipFile(srcname) +except IOError: + # The bug we're testing for caused an AttributeError to be raised + # when a ZipFile instance was created for a file that did not + # exist; the .fp member was not initialized but was needed by the + # __del__() method. Since the AttributeError is in the __del__(), + # it is ignored, but the user should be sufficiently annoyed by + # the message on the output that regression will be noticed + # quickly. + pass +else: + raise TestFailed("expected creation of readable ZipFile without\n" + " a file to raise an IOError.") diff --git a/lib-python/2.2/test/test_zlib.py b/lib-python/2.2/test/test_zlib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/test_zlib.py @@ -0,0 +1,226 @@ +import zlib +from test_support import TestFailed +import sys +import imp + +try: + t = imp.find_module('test_zlib') + file = t[0] +except ImportError: + file = open(__file__) +buf = file.read() * 8 +file.close() + +# test the checksums (hex so the test doesn't break on 64-bit machines) +print hex(zlib.crc32('penguin')), hex(zlib.crc32('penguin', 1)) +print hex(zlib.adler32('penguin')), hex(zlib.adler32('penguin', 1)) + +# make sure we generate some expected errors +try: + zlib.compress('ERROR', zlib.MAX_WBITS + 1) +except zlib.error, msg: + print "expecting", msg +try: + zlib.compressobj(1, 8, 0) +except ValueError, msg: + print "expecting", msg +try: + zlib.decompressobj(0) +except ValueError, msg: + print "expecting", msg + +x = zlib.compress(buf) +y = zlib.decompress(x) +if buf != y: + print "normal compression/decompression failed" +else: + print "normal compression/decompression succeeded" + +buf = buf * 16 + +co = zlib.compressobj(8, 8, -15) +x1 = co.compress(buf) +x2 = co.flush() +try: + co.flush() + print "Oops - second flush worked when it should not have!" +except zlib.error: + pass + +x = x1 + x2 + +dc = zlib.decompressobj(-15) +y1 = dc.decompress(x) +y2 = dc.flush() +y = y1 + y2 +if buf != y: + print "compress/decompression obj failed" +else: + print "compress/decompression obj succeeded" + +co = zlib.compressobj(2, 8, -12, 9, 1) +bufs = [] +for i in range(0, len(buf), 256): + bufs.append(co.compress(buf[i:i+256])) +bufs.append(co.flush()) +combuf = ''.join(bufs) + +decomp1 = zlib.decompress(combuf, -12, -5) +if decomp1 != buf: + print "decompress with init options failed" +else: + print "decompress with init options succeeded" + +deco = zlib.decompressobj(-12) +bufs = [] +for i in range(0, len(combuf), 128): + bufs.append(deco.decompress(combuf[i:i+128])) +bufs.append(deco.flush()) +decomp2 = ''.join(bufs) +if decomp2 != buf: + print "decompressobj with init options failed" +else: + print "decompressobj with init options succeeded" + +print "should be '':", `deco.unconsumed_tail` + +# Check a decompression object with max_length specified +deco = zlib.decompressobj(-12) +cb = combuf +bufs = [] +while cb: + max_length = 1 + len(cb)/10 + chunk = deco.decompress(cb, max_length) + if len(chunk) > max_length: + print 'chunk too big (%d>%d)' % (len(chunk),max_length) + bufs.append(chunk) + cb = deco.unconsumed_tail +bufs.append(deco.flush()) +decomp2 = ''.join(buf) +if decomp2 != buf: + print "max_length decompressobj failed" +else: + print "max_length decompressobj succeeded" + +# Misc tests of max_length +deco = zlib.decompressobj(-12) +try: + deco.decompress("", -1) +except ValueError: + pass +else: + print "failed to raise value error on bad max_length" +print "unconsumed_tail should be '':", `deco.unconsumed_tail` + +# Test flush() with the various options, using all the different levels +# in order to provide more variations. +sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH'] +sync_opt = [getattr(zlib, opt) for opt in sync_opt if hasattr(zlib, opt)] + +for sync in sync_opt: + for level in range(10): + obj = zlib.compressobj( level ) + d = obj.compress( buf[:3000] ) + d = d + obj.flush( sync ) + d = d + obj.compress( buf[3000:] ) + d = d + obj.flush() + if zlib.decompress(d) != buf: + print "Decompress failed: flush mode=%i, level=%i" % (sync,level) + del obj + +# Test for the odd flushing bugs noted in 2.0, and hopefully fixed in 2.1 + +import random +random.seed(1) + +print 'Testing on 17K of random data' + +if hasattr(zlib, 'Z_SYNC_FLUSH'): + + # Create compressor and decompressor objects + c=zlib.compressobj(9) + d=zlib.decompressobj() + + # Try 17K of data + # generate random data stream + a="" + for i in range(17*1024): + a=a+chr(random.randint(0,255)) + + # compress, sync-flush, and decompress + t = d.decompress( c.compress(a)+c.flush(zlib.Z_SYNC_FLUSH) ) + + # if decompressed data is different from the input data, choke. + if len(t) != len(a): + print len(a),len(t),len(d.unused_data) + raise TestFailed, "output of 17K doesn't match" + +def ignore(): + """An empty function with a big string. + + Make the compression algorithm work a little harder. + """ + + """ +LAERTES + + O, fear me not. + I stay too long: but here my father comes. + + Enter POLONIUS + + A double blessing is a double grace, + Occasion smiles upon a second leave. + +LORD POLONIUS + + Yet here, Laertes! aboard, aboard, for shame! + The wind sits in the shoulder of your sail, + And you are stay'd for. There; my blessing with thee! + And these few precepts in thy memory + See thou character. Give thy thoughts no tongue, + Nor any unproportioned thought his act. + Be thou familiar, but by no means vulgar. + Those friends thou hast, and their adoption tried, + Grapple them to thy soul with hoops of steel; + But do not dull thy palm with entertainment + Of each new-hatch'd, unfledged comrade. Beware + Of entrance to a quarrel, but being in, + Bear't that the opposed may beware of thee. + Give every man thy ear, but few thy voice; + Take each man's censure, but reserve thy judgment. + Costly thy habit as thy purse can buy, + But not express'd in fancy; rich, not gaudy; + For the apparel oft proclaims the man, + And they in France of the best rank and station + Are of a most select and generous chief in that. + Neither a borrower nor a lender be; + For loan oft loses both itself and friend, + And borrowing dulls the edge of husbandry. + This above all: to thine ownself be true, + And it must follow, as the night the day, + Thou canst not then be false to any man. + Farewell: my blessing season this in thee! + +LAERTES + + Most humbly do I take my leave, my lord. + +LORD POLONIUS + + The time invites you; go; your servants tend. + +LAERTES + + Farewell, Ophelia; and remember well + What I have said to you. + +OPHELIA + + 'Tis in my memory lock'd, + And you yourself shall keep the key of it. + +LAERTES + + Farewell. +""" diff --git a/lib-python/2.2/test/testall.py b/lib-python/2.2/test/testall.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/testall.py @@ -0,0 +1,4 @@ +# Backward compatibility -- you should use regrtest instead of this module. +import sys, regrtest +sys.argv[1:] = ["-vv"] +regrtest.main() diff --git a/lib-python/2.2/test/testcodec.py b/lib-python/2.2/test/testcodec.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/testcodec.py @@ -0,0 +1,48 @@ +""" Test Codecs (used by test_charmapcodec) + +Written by Marc-Andre Lemburg (mal at lemburg.com). + +(c) Copyright 2000 Guido van Rossum. + +"""#" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + + return codecs.charmap_decode(input,errors,decoding_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + + return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x78: u"abc", # 1-n decoding mapping + "abc": 0x0078,# 1-n encoding mapping + 0x01: None, # decoding mapping to + 0x79: u"", # decoding mapping to +}) + +### Encoding Map + +encoding_map = {} +for k,v in decoding_map.items(): + encoding_map[v] = k diff --git a/lib-python/2.2/test/testimg.uue b/lib-python/2.2/test/testimg.uue new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/testimg.uue @@ -0,0 +1,1170 @@ +begin 755 test.rawimg +M___Y^/\A$Q3_*1LC_QL4'/\;%AS_%Q(6_QP7&?\B&AW_'A<7_QT5&/\7$A3_ +M&108_Q84%O\7%1?_$Q 6_Q<3'/\:$Q__'1<;_R$:&O\5$Q7_'!D8_SHW-O\\ +M.CW_141*_TE)3/]/3U+_'1DA_R,<)O\B'"3_249,_T=$2O]$0D7_.38_]<7F/_%1$9 +M_QH6'O\B(2C_65A>_U587?]87%[_65M>_Q at 5&_\@'"3_%Q8<_U%34?]<6E7_ +M5U9/_U-14_\:%A__'AHB_TA&2/\]/CC_24I$_RDG*O\B'B;_)",I_UI;7/]; +M65;_7EA6_X%\?/^!?GW_7E]@_U!45O]45US_4U5:_U)46_].4%?_2TU4_T9( +M3_]#14S_1$E/_TA)4/](1T[_1D=._TI/5?])2E'_2$=._T-%3/])2U+_2$E0 +M_T9'3O]#1$O_0D1,_T!"2O]#14S_1DE._T5(3?]$1TS_0$-(_T1'3/]!0TC_ +M0T)(_S\^1/]#0DC_04-(_SD\0?\[0$7_0#]%_SY 1?\Z/$'_.CQ!_SH\0?\[ +M.S[_/SU _Q43%O\E(R;_%Q48_S0R-?\7%1C_)R4H_Q02%?\2$!/_%!(5_Q,1 +M%/\5$Q;_^>[U_SXT/O\F'"O_'QDA_QD4&/\6$17_%1 4_Q<2%O\:%1G_&!,7 +M_Q40%/\8$Q?_%Q03_Q<3%?\:%1O_'17YX_Y&1CO]O:FS_5U=:_U)45_]1 +M4U;_4%)7_TY/5O])4%;_2$]5_T1(4/]%1E'_1DA0_T=)4/]&2$__1$9-_T%# +M2O]$1DW_04-*_T!"2?] 0DG_04-*_T1&3?]!0TK_/D%&_T)%2O]!1$G_1$=, +M_T%#2O]!0TK_/3]&_T!"2?] 0D?_/D!%_S]!1O\^0$7_.3M _ST_1/\\/D/_ +M.CQ!_ST[/O\W-3?_,C R_S N,/\M*2O_)B(D_Q82%/\7$Q7_%1 4_Q(-$?\7 +M$A;_%1 4_Q81%?__]?K_+R4N_T<^2_\A'"+_&A49_Q81%?\5$!3_&!,7_Q81 +M%?\6$17_%1 4_Q at 3%_\7$1G_%Q(8_PT(#/]VGUW_V!C7?]765?_5E=8_TQ15O]+3U?_2E!:_T=*5O].4%C_2DQ3_T=)4/]' +M25#_14=._T9(3_]'25#_1$9-_SY 1_] 0DG_.SU$_T-%3/] 0TC_041)_TI- +M4O\^04;_/T%(_S]!2/\^0$?_0D1+_SY 1?\^0$7_/T%&_SY 1?\Z.CW_,C(U +M_RTM,/\G)RK_*RDK_R at F*/\J*"K_(R$C_R4A(_\I)2?_(AX at _RXJ+/\9%!C_ +M% \3_Q at 3%_\3#A+_&!,7__KQ\?\@%Q[_&Q0<_QL6&O\8$Q?_%1 4_Q40%/\5 +M$!3_%1 4_Q40%/\4#Q/_%Q(6_Q<3%?\7$A;_$PX2_Q at 3&?\<%1__&!,7_Q42 +M$?\4$!+_$0\2_Q(0$_\3$13_$Q$4_Q,1%/\4$A7_%A(:_QP8(?\;%AK_'!@: +M_Q\;'?\;%QG_%Q(6_Q40%/\5$!3_% \3_Q,/%_\7$QO_'AD?_Q\9'?\=&1O_ +M(R ?_R +M%R'_&Q@>_U964_]:6E?_7%E4_UE55_\8%!W_&AD at _V!?9?]=7E__86)C_ST\ +M0_\6%Q[_&QTB_V%B:?]B8FO_86%L_Q<7(/\B(RK_3E!5_U-56O]74EC_)Q\C +M_R4D(_];6UC_75Y8_VMJ:?^5DY7_A(""_UE65?]86%O_4U5:_U!26?].4%?_ +M2TU4_TE+4O]+353_1TE0_T)$2_]$1DW_1$9-_T-%3/]!0TK_04-*_SY!1O] +M0TC_0$-(_T%$2?\\/D7_/3]&_ST_1O\^0$?_/3]$_SP^0_\]/T3_.#H__S(P +M,_\J*"K_*RDK_R at F*/\H)BC_*2 +M(/\E(2/_)B$E_R,>(O\W,C;_)!\C_Q81%?_\\//_'A07_S$I+/\L)RG_'!<; +M_Q0/$_\5$!3_% \3_Q40%/\5$!3_% \3_Q<2%O\3#QC_%Q(8_Q at 3%_\8$1G_ +M$PP3_Q<1%?\5$!3_$1$4_Q(0$_\2$!/_$0\2_Q$/$O\0$!/_#0\2_Q43%O\@ +M&Q__%1,6_Q(0$_\1#Q+_$0\2_Q$/$O\0#A'_$0\2_Q .$?\1$A/_&!<>_Q at 4 +M'/\A'1__$0\1_TI&1/]54$K_(R(A_Q,1&O\5$QS_+2PR_U-45?]-4%7_5EE> +M_UY=8_\P+3/_'!@@_Q<8'_]>8VG_8F%H_V)A9_]C8FG_&!8?_Q<4(/]>7V;_ +M8&%H_V!A:/]45EO_&QHA_Q at 7'O]E9&K_961J_U]>9/\9%R#_'!HC_TU-4/\Q +M,S#_)R("7_'B C_R at L+O\;'R'_$1$4_Q$1%/\0$!/_$! 3_Q(0$_\3#A+_ +M&A08_W!H;/\7$A;_$A 3_Q$/$O\1#Q+_$0\2_Q .$?\1#Q+_$ X1_QD9'/]/ +M2U/_-S(X_R,@&_\].S/_5U!$_UI00?]>5TO_&A4;_Q at 4'/\X-CG_/#LZ_SY! +M0O]14UC_45)9_RPM-/\?&R/_%Q@?_V%F;/]H9V[_;6QR_V]N=?\6%!W_&Q at D +M_UU;9/]F9FG_9VAI_UM:8/\8%A__&AD at _V-C9O]H:FC_969G_Q85'/\4$QK_ +M5E=8_U]A7O]65EG_%A4<_QD8'O] /S[_)R4H_QH6'O\B'R7_9V-A_V%<8/\< +M&"#_(2 F_T=%1_\>'![_*"8H_UY<7O]Z=7#_J:&=_W=R=/];6%[_5%5<_TY. +M5_]$1D[_/4-+_S@[0/\Y/$'_+S(W_RDL,?\K*2S_+RHN_RTH+/\M*"S_*RDL +M_R at H*_\F)BG_)B8I_R8F*?\E)2C_*"@K_R_\6$17_&A49_QD4&/\8$Q?_&!,7_Q\:'O\F(27_2T5#_Y"+ +MA?^+B83_'Q\B_V)G;/]26%K_2DY0_S4D/_;%E'_W5 at 5/\I(27_,BTS_T1 0O]" +M0#W_55!*_U%,1O]'0D+_.C4Y_Q\;(_\7&!__4UA>_U-26?]/3E3_5U9=_Q at 6 +M'_\[.$3_,R\X_UM96_];7%;_6%99_QH7(_\9&!__6UQ=_U]C6_]@8F#_&!<= +M_QH9'_]?85__8&)?_UY>8?\8%Q[_%Q8<_T5$0_\V-#?_&!0<_QT:(/]K9F;_ +M;6AN_QD5'O\<&R+_;VQR_QT:(/\C(23_5U57_R8@)/\L)"C_4DU-_UM65O^ +M>WO_A8""_T1 0O\T,C3_)"0G_Q\>)/\;&B#_$A$7_R(B)?\H)BG_*RDL_S(P +M,_\R-#?_-SD\_SD[/O\Z/#__.3M _S at Z/_\V.#W_-3<\_S(T-_\L+C'_*"HM +M_R5TO_:V%6_UU/0/]\9%7_?F19_RT>(O\H(RG_ +M-S,U_SX[-O]E6D__85=)_U=,1?\\-C3_&A8>_Q<8'_\\/T3_/3Q"_QX;(?\< +M&R'_#PT6_R8B*_\M(B?_)2(=_UI<4_]3453_&Q at D_QD9(O]97%W_5UQ6_UI< +M6?\9&1S_&1@>_UYB8/]O<6__9&1G_Q at 7'O\<&R'_/T$__RDI+/\9%1W_'1DA +M_S\]/_\=&B#_&14>_Q<6'?\Q,#;_&Q@>_QP:'?]J:6C_(A\K_R =*?]02T__ +M3$9$_RHB'O\H(!S_3TI%_VAE8/^)A8?_6%99_TE'2O\5%!K_24Q1_T9)3O\\ +M/T3_0$-(_SY!1O]"14K_14A-_T!#2/]!1$G_/T!'_SH[0O\\/43_.3M _SL] +M0/\]/T+_+S$T_RLL+?\L*BS_*2'1S_ +M&A45_QD6'/\8%Q[_'QD=_T at N(?]*."K_4E-,_T9%2_\@&R?_%QDA_UYG;?]B +M9VS_:&=F_QT:(/\;&R;_0D1,_S at Z/?\M+#/_&!8?_Q85&_\\03W_#0\2_Q01 +M'?\8%A__$1D=_T5'3/\8%1O_%!8;_TQ.3/\:&!O_(R F_V9D9O\L*#'_'QLC +M_VAF:/]=6F#_(R F_T9$1_\A'R+_)"(E_U!*2/]%/SW_1D1'_Q45'O]B9&G_ +M4$]5_TQ+4?])2$[_24M0_T9(3?\_04;_0$)'_TU,4O\U-#K_,"\U_RTL,O\K +M*C#_*RHP_RHI+_\I*"[_)RDI/_ +M% \1_QD:&_\;%QG_&!,3_QD4%/\>&1G_%A$1_R4F(/\R-2__0$,]_T)%/_\R +M,B__+BXK_R$@'_\1#Q'_(!L;_T1"._]$03;_7%)$_WIK7O]31#?_0C,F_U-" +M-?]:2TO_'AD?_R,E*/]234?_;6)7_V582_]K7E'_95Q5_U)-4?].2TK_:FAC +M_Q41$_\6$A3_&A<=_Q83&?\J'A__6#TL_TTX)O]H7UC_;FIL_QX7(?\@'R;_ +M4UM?_V%E9_^)B(?_%!$7_Q<3'/^"@(/_?X%^_V-C9O\8%A__%!,9_TY,1_\6 +M$Q+_&14>_Q at 7'O\8("3_5%9;_Q,0%O\@(B?_65I;_Q,2&/\H)R[_9&1G_S0P +M.?\?&R/_9V5G_V%>9/\3$!;_5U58_QX<'_\C(23_96-F_QP;(?\6%A__1TI5 +M_R <'O]D7U__ at GU]_UU86/].3$__2DI-_T]/4O]&1DG_0$)'_T)$2?\^0$7_ +M/3]$_SY 1?\Y.T#_/D!%_ST_1/\]/4#_/S]"_SX^0?\_/T+_/CY!_SP\/_\S +M,S;_(" C_QH6&/_\^O?_*R at G_Q@6&/\;&1S_+2TP_Q at 8&_\6%AG_%!07_QX= +M)/\4%AO_%1 at 9_RDF(?\>'R#_CXZ-_YZ8D/_3SLG_T\O)_]7+Q__3RL3_R\6] +M_Z.7F/\8$A;_&1D<_Q at 3%_\<&!K_&A88_QP8&O\7$Q7_$1(3_QT>'_\;'1K_ +M)"&AC_24= _U932/]I7U'_>&9<_UA(/O]% +M."W_4D<\_V)34_\:$A;_&!H8_W)L9/]E6U'_;6!3_VI:2O]S9EO_55!+_VEG +M8/]:6%'_$PX0_Q40%/\5$AC_'QH<_T4V,?];/BS_2C =_Y:&??^&?W__)!TD +M_RDF+/]B:&K_?'^ _XF*B_\7%!K_&Q8<_WMW=?]O<6C_8F1A_QH9(/\7%AS_ +M14 [_T])1_\;%1W_%1<<_QHB)O\Y.T#_&18<_Q06&_]'24S_#Q 7_QP<)?]0 +M4E?_-C$]_Q\;(_]A7V'_6%5;_Q,0%O]85EG_'AP?_Q\=(/\[.D#_&!<=_Q01 +M%_\6$QG_&108_Q(,$/\J)"C_2D1(_U)04O]T(![_*"TG_SQ!._\K,"S_*S L_R\K*?]!/#;_5U%'_VA>4/]B4$;_ +M4$ V_T4Z+_]=4TC_7U)-_Q40$O\0$!/_;FEC_VQB6/][;F'_>6M<_X1W:O]C +M7%;_8%Q4_W%L9O\>%AG_%1 6_Q(0$_\@&1G_5$$Y_V%#+?]4-R7_D'UU_X^' +MA?\K)"O_8%]E_U!45O]04U3_3$U._P<&#/\C(23_14$__U)63?\F*"7_'ATC +M_Q at 7'?]-1D#_6%!._QL6'/\7%AS_*# T_U987?\;&![_%!8;_T1&2?\4%AO_ +M'1TH_T1&2_\M*S3_'QPB_TY,3O]/3%+_%!$7_UA66?\>'!__%A07_Q$,$/\: +M%AC_&!,5_R$:&O\;%AS_$P\7_QL7'_\=&2'_'!H=_R >(?\?'2#_4E!3_V]Q +M=/]565O_35%3_TI.4/]#2$W_/T1)_SY#2/\_1$G_0$%(_T-"2?]"04C_0D%( +M_ST_1/\]04/_.CY _S8Z//\5$Q7_^O+U_S0O-?\D(RG_;VIJ_Y:2D/\>&1W_ +M+2 at L_Z"5E/^+?WO_'1<;_QH9'_\=&QW_'1X?_Y60D/^>E8[_S\K%_];/S__8 +MS\__U,K&_]C,Q_^=E)3_&A47_QT9&_\5$Q7_%Q47_Q at 6&/\:&!K_$Q$3_Q,1 +M$_\;&1O_'!H<_QP:'/\G+";_.3X\_RHO+_\F+"C_-30M_R\J)/]+13W_6U-) +M_W]S:O]-03C_13LQ_TU%._]P8U;_(1D5_R\K+?]/1#W_&?\5$Q;_&AD?_Q\7&O\N+"[_C8B(_YZ5CO_/RL7_ +MTLO+_]?.SO_7%G_V9C6/]L:V#_-3,P_R >(?\B("+_*"0B_RT>&/]&*QK_ +M."$5_]3&P_^4C(K_'AH8_UU?7/]A;&?_6F!<_U]E8?]I;VO_76-?_SU#/_]* +M3T__$1,6_P\/$O\6%!?_-S0O_TQ'1_\@&B+_&!4;_S0Y/O]<7F/_659<_S R +M-_]045+_$@\5_R <)/\7%1C_%A07_QL9'/\6%!?_(!XA_Q42&/\D(2?_%!$7 +M_QX;(?\:%1G_&A49_Q81%?\4#Q/_%Q0:_Q83&?\8%1O_%1(8_Q83&?\4$1?_ +M%A,9_QD6'/\4$!C_(!PD_Q41&?\C'R?_-38W_U-54_]E9V7_2DQ*_TI,3_]$ +M1DG_04-&_SY 0_]"1$?_/T%$_SL]0/\^0$/_.3D\__OS]O\G(BC_(2 F_XZ) +MB?]U;VW_*B4I_Q at 6&?^]M[7_O;6Q_QP7&_\8%QW_&147_Q43%?^2C8W_GI6. +M_\K%P/_6S\__W=34_]S2SO_2QL'_H)>7_Q\:'/\7$Q7_%1,5_Q84%O\9%QG_ +M'!H<_Q,1$_\3$1/_&A@:_QL9&_\;&1O_)"DC_S4Z./\N,S/_)BPH_S0U+_\L +M*23_2T9 _TE#._]C657_65%-_TI%0/\Y-C'_,"PN_R0B)?\8%AG_&!89_QL7 +M&?\?&QG_+"4?_X!V;/]G6US_8EQ:_VEF8?] /3S_'AH<_QD7&?\T,B__)QP; +M_THS)_\Y)1W_RKV\_X-Y=?\@&1G_+"HL_S,Z.O](2TS_*2HK_V%B8_]]?G__ +M$1(3_[.UN/\;'2#_%A89_QP:'?\I)B'_O;BX_V!:8O\;&![_,C<\_S at Z/_\? +M'"+_*"HO_T!!0O\7%!K_)R,K_Q,1%/\,"@W_,C S_Q84%_\2$!/_'QPB_Q at 5 +M&_\3$!;_$0X4_Q at 3%_\9%!C_%A$5_Q40%/\2#Q7_&A<=_Q,0%O\2#Q7_&18< +M_Q$.%/\:%QW_$Q 6_Q82&O\7$QO_%1$9_Q82&O\?'2#_+"HM_RTK+O]24%/_ +M24I+_T5(2?]$1TC_0T9'_S]!1/\^0$/_04-&_T)$1_] 0D7___C[_R(?)?\5 +M%AW_'QP;_SPV-/\@&Q__(QTA_RX?'_\G%Q3_(AH>_Q,5&O\1%!7_0$%"_XB& +M at _^;E8W_Q\*]_];/S__=U-3_V]'-_]'%P?^>EY?_'!<9_Q82%/\4$A3_$ X0 +M_Q43%?\=&QW_$Q$3_Q<5%_\9%QG_,"XP_QH8&O\E*B;_,C8?]%.C__'QH:_RXJ+/\;%1G_%Q,5_R0C +M(O\?&AS_-"4?_R<9%O]74E3_>W-Q_R4=(/\E)"K_)BHL_R @(_\H)BG_&18< +M_VAG;?\@'R7_G)ZA_Q<9'/\:&AW_'1L>_R,>&?_$P<#_:&=M_R,@)O\7&A__ +M%QD>_Q(/%?\8%QW_*RPM_QT;'O\@'"3_$Q$4_Q84%_\U,S;_#0L._Q84%_\Q +M+C3_.#0\_QH6'O\;%Q__%Q(6_QH5&?\6$17_%1 4_Q83&?\7%!K_%!$7_Q83 +M&?\1#A3_$0X4_Q83&?\5$AC_%A,9_QL9'/\9%QK_&1<9_Q$-%?\3#Q?_.#0\ +M_RLH+O\G*2S__QP:'/\I +M)B7_CXZ'_Y65C/_$PKW_UL[,_]7*R?_:S\[_S<+!_Z&=F_\G)"/_%A(4_Q<2 +M%O\3$13_%Q47_Q84%O\5$Q7_%1,5_Q at 6&/\C(2/_&QD;_R0H)O\Y/CS_+S0R +M_R0I)_\[.SC_&R,M_S9&8/]#3VK_-3I3_S Z3O\]3UW_+#Q,_RF___Y^7E?]/34__24=$_Q\;'?\< +M&!K_(R4H_SY*4_\6+3+_3V)N_XZHM?\<)27_)2 @_SP_0/](34O_5E93_TU, +M2_],34[_LK2W_Q@;(/^TK[/_'AP>_Q\B(_\>&AS_(1\<_[FUL_]84U?_%A4< +M_Q(/%?\2$!/_$ X1_Q84%_\?'2#_%1,6_Q43%O\4$A7_$Q$4_Q$/$O\3$13_ +M$A 3_S(?\7 +M%1C_$ X1_QH8&_\4$A7_%!(5_Q02%?\3$AG_$Q(8_Q04%_\3%!7_%!4<_Q . +M%_]13U+_'QP;_VYO_Y>- at O]W:V+_.#(P_S] 0?](2$7_ +M:FYE_VIN9O]U at X;_.UUQ_WVOQ/^@Q^#_>**R_W6$A/^$>WO_0S]!_QLC(/\M +M,R__0TA&_W5Z>O^XP,+_%1\C_[V[OO\<&AS_&AT>_QX:'/\5&!+_MZFF_YN +MAO\4#Q7_$1$4_Q02%?\4$A7_$ X1_Q02%?\3$13_$Q$4_Q$/$O\2$!/_%1,6 +M_Q,1%/\4$A7_'ALA_Q,/%_\1#17_$ P4_Q$/$O\:&!O_&1<:_Q at 6&?\2$!/_ +M'1L>_Q02%?\:&!O_$@\5_Q(/%?\5$AC_%1(8_Q,2&/\1$QC_$Q4:_Q<9'O\1 +M$AG_$Q(8_S(P,O\?'1K_H9R<_X^$@_]H7%?_9EU=_V!<7O]>6ES_2D9(_U%- +M3_]24%/___3T_RPG*?\>("7_(1X=_RXF)/],1DK_(R F_R8>(?\J(B#_'1@< +M_Q@:'_\<&AS_=G-R_X.">_^8F(__O+JU_]C0SO_>T]+_V<[-_\6ZN?^JIJ3_ +M1T1#_Q82%/\7$A;_%Q48_QH8&O\7%1?_&!88_Q<5%_\7%1?_&QD;_QT;'?\? +M(R'_,38T_S,X-O\=(B#_.#8Q_R0B'_\?'"+_%A,?_Q01*/\P-U7_'S%5_R V +M7/\O5'?_.VJ-_RU:@O\>16__+%5Y_RY(;_]\@XG_GI"!_VQ at 5_]%03__+C$R +M_RHO*_]?8UK_ at 7]Z_UUF;?]9?)/_;YZV_Y_!V_^#I;G_H::K_S,L+/\T-3;_ +M55I8_WZ ??]L:VK_*2PM_Z"DIO]>8VC_PL##_Q,1$_\0$Q3_'AH<_R,A&O^X +MKZG_BWQ\_Q<1%?\6%!?_%!(5_Q02%?\3$13_$Q$4_Q,1%/\2$!/_$A 3_Q,1 +M%/\2$!/_$Q$4_QH8&_])1TK_%1,6_Q .$?\2$!/_$A 3_R >(?\B("/_(R$D +M_Q<5&/]$0D7_%!(5_Q .$?\4$!C_$@X6_QH6'O\G(RO_,2XT_S at S.?].2%#_ +M85ID_Q$.&_\4$1W_'!@@_T(]0?^MJ*K_LJJH_WMO:O]L967_BX*"_W!G9_]L +M967_7%=7_T,^0O__^?K_)R8M_RHO._\U-#K_*"(@_U=15?\>&R'_EI&3_[2L +MJO\^.3W_#A 5_QH8&O\>&QK_@'YW_Y63B_^\NK7_U]'/_]O0S__7S,O_PK>V +M_ZVII_\D(2#_&A88_Q40%/\3$13_&1<9_Q<5%_\8%AC_%Q47_Q<5%_\;&1O_ +M'QT?_Q\C(?\O-S3_.#T[_QPA'_\T.#K_'R$F_QH='O\1%AS_%QHL_Q8^7_Y:QO/]\F*#_7GB#_T-79?](97'_,D=D_WE[>?^6A';_<&5:_TM' +M1?]"14;_,38R_XZ/B/]Z=W;_'!DF_T%:H/^=EY7_2D="_U535?_6RLO_ +M6U-1_TI#0_\:%17_'!8:___X\_]!/4;_4UAJ_Q02%?\D)"'_;V1I_Q<4&O\3 +M%!7_*!T<_Q80%/\7%AS_&A88_X^*BO]_>'+_G9>/_ZVKIO_2T,W_V-#,_]?+ +MQ_^MJ*/_JZFF_QD6%?\;%QG_&A49_Q,1%/\7%1C_$0\2_Q02%?\5$AC_%A07 +M_Q84%O\Y.#?_)",B_RDX-/\U.3?_&1T;_R\T,/\E(BC_'1\<_Q0:(O\7&SO_ +M'!XA_UM95O^+F)W_B:.F_X69G?]E;6__6&)?_U=O;/\E0G+_>'U[_XMU<_]O +M95K_3TE'_R0E)O\C)2+_G92-_UUL_["PL_]"1$G_LK"S_QH: +M'?]S=7C_%1(8_QXB)/\E*2O_%!07_Q,.$O\6%!?_&A@;_Q<5&/\2$!/_%1,6 +M_Q,1%/\0#A'_$0\2_Q$/$?\1#Q'_#PT0_QL8'O\?)CS_%!8E_QT8&O\E("3_ +M$A 3_QD7&O\L*BW_'1L>_Q<5%_\5$Q7_34E+_RDD)O\:$A;_%A(4_Q(1$/\A +M'R+_$18<_Q@>(/\L*2C_'Q,6_V1:;?\;$BK_C("5_X%V??]%/#S_(1X=_SQ +M/O\P,C#_S\3#_S U,_]'2$G_(!L?_QH8&___\_+_*" C_R0A)_\A'!S_/T$^ +M_W1I;O\0#1/_)28G_S4J*?\G(27_%!,9_QL7&?];5E;_9V!:_Z":DO^EHY[_ +M@(6!_YR=E_^2D(O_=GES_WAX=?\7%!/_&!06_Q<2%O\1#Q+_%A07_Q02%?\7 +M%1C_%1(8_Q84%_\C(2/_&QH9_QP;&O\G-C+_.#PZ_Q@<&O\O.SC_)2(A_S8P +M)O\F+#S_'B=0_Q4;(_\B'AS_5%M;_U1G9_]TBHG_>XZ(_V!J8?]9<&O_+DM[ +M_W=\>O^9 at X'_=6M at _W9P;O\J*RS_,#(O_X^. at _]J8F#_#")CK_.3U%_R&_\F-#/_AIN=_W.)B_]A=W7_6V1=_UYU +M'Q^_YR'@O]G6DW_BH)^_Q\@(?\O,2__AXZ"_ZF5C?]06&+_9)2I +M_WFHP/^;S>C_6WR3_[RWO?^"=G?_'R A_SL^/__/R_WEW=/^FEYC_%1,5_RDM+_^[M;/_G)>9_Q at 3&?\=&Q[_%Q(2_T5) +M0?^HG9;_A8-^_V5O9O^%C8/_;'1J_V=O9?]I;67_%Q47_QH7'?\:&!O_&!88 +M_QL9&_\>'![_'!H<_Q at 6&/\:&!K_&A@:_Q at 6&/\7&!G_*"\O_S([._\4&1G_ +M-3 \_R(F'?\@%A__'2DP_R$V;/\6%"3_(A\>_R$M-/^*I*?_ at IVD_UUT>?]& +M4D__46IO_RU5?/]T>8O_D8!R_W- at 5O^>DHW_(2(C_Q\;'?^2BH;_IYV2_YFJ +MM_]VHKS_F,38_ZG-XO\J.TC_B(.#_YV8D_\>'B'_2TI0_\7 PO^NIJG_.C at Z +M_S@[//]+3D__/D-#_QH='O^"?H#_&!D:_QD9'/\<'!__$Q,6_Q04%_\6%AG_ +M%A89_QH:'?\]/4#_'Q\B_QD9'/\?'R+_#@X1_Q0.%O\4#Q/_$0\2_Q(0&?\8 +M(CW_(BI6_Q8<-O\8&"'_5$QG_T ^1_\K)R__&QHA_X.!?O]23T[_&A88_RE +M_RLH+O\?&R/_%!(4_V)C7?\;&QC_,S$L_QL8%_\5$Q;_*2TK_Q at 6&/__^/?_ +M0SL__Q\>)/\5%A?_)24B_[&EIO\;&1O_&1L>_QD3$?\6$1/_'!<=_QL9'/^2 +MC8W_14E!_Z*7D/]_?7C_7&5>_V9M9?]@9U__86A at _V1H8/\8%AC_&18<_Q84 +M%_\6%!;_&A@:_QT;'?\6%!;_%1,5_Q(0$O\9%QG_%Q47_Q<8&?\F+2W_-#T] +M_Q09&?\S,#S_(2@>_QH0&?\)$AG_&REA_QL7)_\G(1__&!H=_S1+2O^%H:3_ +M9'A\_TU65O]2:6C_,UAW_W%R??^7@&W_A7=N_ZB at GO\A'R+_'QT?_XV*A?^H +MH97_D:*O_R5/:?^SS^3_M'B'_'AXA_T-#1O\J*BW_(" C_RHJ+?\2$A7_% X6_Q0/$_\.# __ +M$Q$:_Q4A//\:)53_'"=*_S(U3O]B5'K_@'Z'_PT0%?\5$A[_$ T,_U!-3/\9 +M%1?_(!L?_T-"2/]65%;_8UQ<_Z:BJO]N;W;_%A07_QD2$O\Q)2'_'QH:_QL4 +M%/^IHZ'_%!$7_Q,/%_\/#0__8F-=_YN;F/\]/3K_'1L=_QL9'/\M+BC_&A88 +M___X]_],1$C_)20J_QX?(/\O-##_O[:V_QD7&?\D)"?_LZNI_[JUM_\;%AS_ +M$0\2_QX9&?\?(QO_H9:/_X!^>?\T/#C_.3\[_RTS+_\U.S?_76!:_Q at 6&/\4 +M$1?_%!(5_Q,1$_\5$Q7_%1,5_Q43%?\3$1/_%!(4_QD7&?\9%QG_%A<8_R$H +M*/\Q.CK_$A<7_RTM./\C*R'_(QDB_Q\E+?\?+67_-C5&_S'![_ +MC8Z(_YV8C/](66;_1VV(_Z_/Y?]TCJ/_1%1>_X2$@?^9FI3_)RTO_S U.O^P +MKK#_P[_!_V1I:?]<:&?_='M[_X2)B?^1CY'_J*"C_Q at 3%?\5$Q;_&AH=_Q 0 +M$_\7%QK_#@X1_Q86&?\='2#_'AXA_Q\?(O\9&1S_&1D<_P\/$O\3#17_$PX2 +M_Q .$?\4$AO_%1XV_QDC4/\;)4K_%!DW_V5/?/]^>87_$!@:_QH:)_\=&1O_ +M55)1_R at D)O\P*R__)R,E_R(8&_\R)2K_>7!W_T$V-?]@5EG_$0X4_Q00$O\6 +M$A3_&1(2_Y6/C?\5$AC_%! 8_Q<5%_]=7EC_GIZ;_S$R,_\<'!__'1L=_TM* +M0_^'A(/___7R_T Z/O\;'"/_&!D:_WAZ=_^\M;7_&A@:_Q43%O\F'Q__&A88 +M_Q83&?\='"+_BX:&_RHK)/^=E(W_ at X%\_R\W-/\H+2O_&1\;_RTS+_]365'_ +M&!88_Q01%_\4$A7_%1,5_Q02%/\3$1/_%!(4_Q43%?\4$A3_&1<9_QD7&?\7 +M&!G_(B&O\=%1G_&1\G_R0V;O\9'R__)BHB_RTP +M*O\V+2;_.S8V_VUP_[[#P_\^04+_S?]'1$/_&!06_RTH+/]'0DC_13M$_T,T/_^$?(;_85-4_Z&9G?\4$AO_ +M$Q48_Q,1$_\<%Q?_EY&/_PT+#O\5$AC_&!<6_V5F8/]K:6;_-38W_QH<(?\4 +M$A3_5%)*_[VZN?__]O#_54]3_S4Z1O\H)2O_)" >_[&NK?\9%1?_&A49_V%6 +M5?]C657_&Q<5_QT<&_\J'!W_*"DB_Y64B?^'B(+_)2PL_Q\F)O\>)B/_*C(N +M_TI63?\8&1K_%A$7_Q,1%/\6%!?_%A07_Q84%_\3$13_%!(4_Q02%/\6%!;_ +M&1<9_Q<5%_\?(B/_)S,R_PL2$O\M-3+_#Q$@_QL8$_\7(2S_&3!E_QXA,_\A +M'QC_+"HE_SPZ*_\G(AW_2D<\_X*(A/\C0F3_+%>%_QQ B_\M3I;_26=]_\"N +MLO\:'R3_(QD<_Y"0@?^>G)7_C(Z3_YFDJ_^7H[+_1UAE_SI&2O^.AH+_J*6D +M_]W5V/^3F)C_J:JK_\&_O/^ZN;C_V-/7_[JVM/_)PL+_ +M7O]K;6K_E9.._U%-2_\7$A;_+"@P_QX=(_\R*S+_.C$X_WYY?_]42TO_J:"@ +M_QP7&?\8%AG_$Q(8_QD4%O^EGYW_&!,7_Q43%O\:&1C_ at 8%X_YF6D?\\.#;_ +M)B(D_QD8%_]334/_P+V\___T\/]]=G;_&1HA_Q .$?^(A(+_JJ>F_QX:'/\= +M&!S_=&EH_VYF9/\:%17_'1L=_R\G*O\7(!G_-CTS_SI"/O\F+2W_(R8G_QD= +M&_\I+BK_1E!'_QL<'?\9%!K_%1,6_Q at 6&?\8%AG_&!89_Q02%?\6%!;_%1,5 +M_Q84%O\9%QG_%1,5_QXA(O\C+R[_$!<7_RLS,/\4%B7_&Q at 3_Q0>*?\9,6C_ +M+S-(_TA&0_\D)"'_+2LC_SHP,_\Y,RO_/STZ_R1 8O\L5X7_'D:1_RI+D_]$ +M7W?_MZ6I_Q,:&O\B%QS_C9!^_Z. at E/]X<&[_P;6X_]++U?\<'B;_.#L\_[6H +MH_^II*3_V<_2_WV"@O^;GI__RL7 _[JTLO_7G_B8:% +M_Q\>'?\7&1S_%1<:_Q$1%/\7%1C_%!46_PX/$/\_0$'_'A\@_R-_V-: +M6O^BF9G_'QH<_Q84%_\3$AC_'!<9_ZJDHO\T+S/_&A@;_R&1__%1(8_Q<9(/\4&B+_=W!W_QPD(/^*CXG_>7Y\_S5!0/\Y +M0D+_.4- _SM&0?]"3D7_$A,4_QD4&O\5$Q;_%1,6_Q84%_\7%1C_%!(5_Q84 +M%O\7%1?_%A06_QD7&?\8%AC_'2 A_R(N+?\@)R?_+#0Q_Q,5)/\<&13_"Q4@ +M_QHR:_\9'S7_0#\^_T!"0/\K,"K_'QPB_S8T+?\W.3;_'S99_RE7A/\:1I#_ +M*TJ2_SE2;_^QGZ'_%AX:_R8;(/^*BW[_I9^7_VA:6__JV=G_Z-C<_SDT-O]Y +M>7;_UGO_8S,__C9*2_WR#@__(QK__O;BS_^#7U__*P;O_O[>U_XJ% +MA?]Q;FW_+BTL_QH<'_\6&!O_%!07_Q at 6&?\/#0__$Q$3_Q,1$_\D(B3_'AP? +M_QP:'?\9%QK_%!(5_Q4/$_\4#Q/_$ X1_Q,3%O\8'RO_'R5%_Q$7,?\:%RW_ +M6$EB_V1I=?]D:6G_5EA5_X6#?O]134O_&A49_U).5O]_?H3_?WA__X!W?O^V +ML;?_A7Q\_Z:=G?\<%QG_'!H=_QP;(?\<%QG_K:>E_X:!A?\[.3S_+RXM_X:& +M??^=FI7_244]_QH8$_\:&!7_-"TG_[ZXO/__^OK_O+&P_R'B'_&AH=_Q04%_\1$13_% \3_Q0/$_\3$13_$A(5_Q<:&_\:'2[_#1$@ +M_Q at 1(O\E&BW_)RTU_S8[.?]45E/_55)-_U103O\9%!C_44Y4_RXK,?\B'2/_ +M+B4L_VYI;_]-1$3_KJ6E_Q at 3%?\5$Q;_#@T4_Q0/$_^LIZ?_?'AZ_S at V./\P +M,"W_EI:-_Z& +M_SH]/O\N/S__,4)"_S1&1/\Z3$C_2E-,_Q05%O\6$QG_'!8:_QD7&O\>'!__ +M%1,6_Q,1%/\6%!?_%!(5_QP:'?\:&!O_%148_QH>(/\B+S#_&B(D_R(J+O\3 +M'2?_(AX at _QH=*?\A.G7_)"9!_RHE(/]144;_.SLN_UA93/\Q-"C_'B =_Q at O +M3/\?2G3_"39]_RI+E/\B/V__Q*^K_Q08(/\F(1O_='1Q_ZBCG?])/SO_ZMO; +M__+5_];'Q_^YN;;_V\_0_YB9FO]67%[_S\C(_[JRL/_:TM#_ +MPKJX_[NSK_^EFZ3_4DU-_R(@'?\>'23_%!8;_Q<5&/\<&!K_$ T3_Q,0%O\3 +M$13_*RDK_RLK+O\9&R#_%!8;_Q$3&/\D)2;_-38W_SX_0/]+3$W_*"8I_Q88 +M&_\L,3'_9FAF_U!44O\\/CO_5U)-_VQ at 6_]__R(?*_\6#QG_ +M%10:_Q<8&?^BG9W_IIZ<_TI(0?]&1#W_3DE#_U),1/]_=W/___#L_[&EJ/\> +M&R'_&QL>_R4@(/]U<'#_&147_Q$/$O^JHZ/_LJNK_Q<3%?\3%1C_'AH<_R$I +M)O^QKJW_P;R\_W=\@?])457_0TM-_T)+2_]*3TG_%Q47_Q,0%O\2$!/_&A@; +M_Q02%?\5$Q;_$Q$4_Q04%_\2$A7_&1D<_QH:'?\8&!O_&Q\A_R M+O\B*BS_ +M(RDK_QHE+/\C)2/_)28Q_R9">_\?)#[_)R,A_S4V,/]'13W_5E9+_TU/1O\A +M(R'_%2Q)_R!+=?\)-GW_)D>0_QPY:?^QG)C_%1DA_R8A&_]34U#_G)>1_T V +M,O_NW]__[]G:_S N*__9T<__W]#0_WMY=O_;S<[_GYV?_T5)2__3T,__K:NH +M_]73T/^\NK?_HYZ9_ZF?J/\T+R__'!H7_S4X/?\>(R/_%AH8_S at Z-_\S+S'_ +M&A88_W!M;/]&1$'_*"'%[_WYW@?^NI['_J)^?_Z^FIO\:%1?_%Q48_Q<9(/\4%2#_(R(S +M_QH7+O\:%RW_$Q B_QD5)?\4#!K_$ P4_S0Q,/\_/C/_2T@\_S at V+___\^__ +MMZNN_Q42&/\7%QK_=7!P_STX./\6$A3_&!89_R8?'_\;%!3_&Q<9_Q47&O]* +M24C_-#PX_\.[N?_JV]O_X-'2_^+0U/_9R,C_T\/ _Y^:E/\?&QW_%1(8_Q,3 +M%O\8%AG_$Q$4_QD7&O\5$Q;_$! 3_Q 2%?\9&Q[_%QD<_Q45&/\9'1__("TN +M_R,K+?\H*RS_'2HO_R4K)_\L+C;_)$%W_R4K1?\C'R'_)"8D_S\]-O]144C_ +M75Y7_Q at 9&O\.)$3_&41N_P8S>O\H29+_'CMK_[NFHO\@)"S_)2 :_TM+2/^A +MG);_.C L_^76UO_PVMO_-C0Q_]C0SO_>S\__FI:4_][/T/^EH:/_2DQ/_]#) +MR?^LIJ3_U,[,_\"ZN/_$O+C_O;.\_S(M+?\R,"W_2$9(_YN;F/^8EI'_/3LT +M_ZFEH_\S+RW_KZRG_T ^-_^O_\JRJ?_)L:C_PZF at _[RAEO_5N*S_OZRB_T,W,_\> +M&1W_1T)(_Q<3%?\?&QW_)2$C_T(^0/\_-S7_HYJ:_QL6&/\7%1C_%!$7_Q<3 +M'/\-#!G_%!(E_QT9,_\<&#+_&Q at O_Q42*/\?&C3_)B,P_S0R+?\T,BO_4%53 +M___V\O_!M+/_'QXD_Q(4%_\=&1?_)!\?_R$='_\5$Q;_-"DH_T,X-_\?&AS_ +M&AH=_T1&1/\P.#3_P[FU__'1_R,@'_\6 +M&!W_%QL=_Q\B(_\='2#_(" C_R(B)?\E*2O_)2LM_R8L+O\J,#+_+# R_S(X +M.O\E,C/_)C$R_RHO+?\?*C'_)3 I_R4G+O\D/W7_*3%+_R0B)/\G*"G_1T=$ +M_U153_]254__)B at K_P\D0/\80V__!C)\_R9'C_\C/FW_N*>G_S O-?\K)B'_ +M,S$N_Z";E?\T+"C_Z]S=_^_9VO\L*2C_ULW-_]O,S/][DO_)KZ;_Q:J?_\JRJ?_*LJG_Q["D_\JSI_\[+RO_ +M/CH\_Q\=(/\M*BG_2$E#_TI+1?]24TW_4E--_TQ(1O]+1D;_&147_Q45&/\7 +M$A3_%@X8_Q80'O\7%1[_%A,J_Q41*_\7%2__&ALT_R$://\>&"S_'1P;_R4D +M(_^(@X?___+R_\V\MO\@'R;_%ALA_T-!/O\E)"/_%A06_QH8&_^,?W[_FHR- +M_R$7&O\@&R'_.C\__S4W-?^_NK7_\.'<_^W?W/_CU=+_VLK'_^'1SO^RJZ7_ +M/T$__R\Z._\N.CG_+3DX_RTY./\N.CG_+SLZ_RTX.?\N.3K_-#] _S(]/O\N +M.SS_+SP]_R8S-/\@+2[_'2XD_R$E-/\;*BG_,#@Z_R4]=/\H,TS_'R A_RDF +M)?\I*2;_2DU'_SH^-O\V-SC_%R$P_Q\[9_\0/(#_'D!__RH]9_^?FZ/_0S at W +M_RN_]2YLO^LEH[_OZ:?_^'(P__:P<#_T[V_ +M_QL4%/\?'!O_7UU:_R8D'_\[/SW_+"\P_SL^/_\W.CO_.3T[_UY at 7O]?8&'_ +M2TM._Q00&/\4#QO_#Q00_QD7*O\6$2W_%Q,M_Q44,?\3$C?_.35+_S,R.?]$ +M1D3_0T5#_]'(R/__\_?_SKRY_Q\<*?\<'RO_3$E(_QP;&O\9%QG_&1<:_QP6 +M'O\@&B+_'!<=_Q at 6&?]'3$S_/3\]_[^ZM?_LW=C_\-W7_]"]M__HU]'_X-'+ +M_ZNJH_\Y0$#_+SL__R at P,O\L-37_*34T_R at T,_\G,S+_)"\P_R,N+_\C+B__ +M(BTN_R8Q,O\K-C?_*C4V_R)_\?(23_+4A^_RHT3_\C +M(R;_+"@J_R\M)O]85TS_8V)7_UQ85O\-%B?_#"91_Q$Z?/\>1(+_)SE?_[*M +ML_\K)BC_'ATC_R0?&?^\L/]=6%+_I9Z8_YB/B?]Y +M;6C_1$0[_U)52?]*34'_14@\_V%A5O_&N*__[]/,_^#'P/_ERK__\-?0_]+# +MP_\@%A__%1 6_Q at 4%O\E(B'_+RTJ_Q83$O\U,3/_0S]!_QH6&/\F(2'_6%-3 +M_W5POK?_>T,W_,R at G_Z&/_\I)D/_8F-N +M_SH[//\F)BG_)",J_RPL+__2RLC___+M_X1R:/\6%!?_%!8;_UY=5O])1T3_ +M'!@:_QP7&_\B%13_'1$,_QL6%O\4%!?_$Q at 8_RDM*_^KIJ;_W]#+_[*KJ_\P +M-#;_*C(T_RLX.?\J-C/_+SP]_RHV._\K,S?_*3(R_RDU-/\D,"__)# O_RHR +M-/\J,C3_("@J_Q at C)/\:(B3_("8H_R at N,/\F+"[_+"PC_QP[7?\'$R[_'148 +M_QTWXL_^NI*#_QKZ\_UY96?_,PK[_D(J(_T=(2?_'Q<#_,BHH_\S$ +MR/\D)"?_N+"L_]C*Q__.P<#_A'UW_R(D&__*QK[_2#PU_ZRLH_^LK*/_,"\H +M_ZNLI?\W.S/_D)*)_S\_-/]$13C_<7%D_V9G6O^1BX/_V,6__]["O_^ID8[_ +M)Q at 8_RD=(/\2#0__$0\,_RLK'/\R-1__,30=_R\S'?\N,"W_,C,T_S$R,_\Q +M,C/_*BDH_Q43%?\8%AC_3DQ/_Q48._^AG+;_9F%<_Z>BNO\<&S__(R(__UM; +M;O\S.#+_.3TU_R ?)?\K*#3_961J_\C"P/_TZO3_5T9&_R4A*?\;'27_'1P; +M_QD7&O\;&![_&Q<@_QP8(?\;%Q__&18<_QD7&O\@'B'_&QH9_QH8%?\R*"O_ +MVL[*_TE24O\U/4'_-3T__S$\/?\O-SG_*C(T_R(?\7'1__&2$C_QHE)O\>*2K_(2PM_R$L+?\N-2G_-TEE_Q$9 +M*?\:&1C_(BQ._RLT1?\@(B#_'AHC_Q\A)O\B)2;_(R8G_R at M+?\P-3/_,C4V +M_S0S.?\\.$'_/C8Y_UA33O^&?GK_M*BK_\&\OO^FFY3_1T1*_^3=W?_RV];_ +M>71T_]K2U?_9R,C_T+NY_X)Z=O_$N+G_)B$C_\+!P/]03E'_-#8[_[^]O_]? +M75__O+&X_RLG*?^[LJS_WL[+_V%95_\V-2[_R<6]_V=F7_\_.C3_P[JT_SDW +M,/^NHIW_;&9>_SHZ+_]T=&?_:6=8_X![:?]W;UO_='!A_RXI)/\@&QO_$PX2 +M_Q$0%O\3%!7_&!4;_Q at 2%O\7$@S_-S$A_SLW(?\T-"'_-C0L_Q<6%?\D(B3_ +M)"(D_R$?(?\7%1C_$A 3_Q,3%O\?(23_!@HP_S6K_?WEI_WQV9O\\.C/_-#DU_P\5 +M$?\@)"+_&QP=_R(@(O\H)BC_)R8E_R at F(?\W-3#_'1H5_R0@'O]*1T;_$A 3 +M_Q(0$_\7%1C_$A 3_Q84%_\5$Q;_$1$4_Q@:'?\]0C[_(R<_^=D8S_ +M;&-=_TI%1?^1E)7_,SP\_T9+2?^1D9K_'APL_R at I,/^0CXC__^_B_[R2:O^Y +MCV'_K8E<_ZZ#5?^WBU__M(E9_[2+5_^WBUG_O(Y;_[>*5/^WBU/_O8E7_ZF +M5O^1>5[_V,J[_^31R_\L+2[_$Q4:_Q(6&/\6&AS_$Q48_R at J+?\0$A7_)RDL +M_QD;'O\F*"O_%!89_R4G*O\1$Q;_&R$C_QHB)/\?)2?_(2/_*PL7_V6__=W)F_WYZ:_][=&;_;&9<_Q\='_]0 +M3$K_4TM'_R$;&?\@&QO_+BDM_SP\.?]04TW_-#7E'_@'IR_R(@&_^QJJ3_X,[+_X1Y>/^HHYW_M;&I +M_S(P*/\V-2[_O;RU_Z2?FO\C)!W_F96-_W%E7/]U;F+_:V9:_WET:/\@'1C_ +M'1\B_QD7%/\^/3;_,#,M_TU33_]G96?_8F)?_T9+1?\I+B[_(BDI_RHM,O\8 +M%Q[_&QD;_YJ2E?^@F)O_HYN>_ZZFJ?^SJJK_N[*R_[RUM?_$O[__Q,Z]_UM@ +M6O]866#_J[.O_RLM,/^6DIK_,2PP_S8R-/]W=7?_B8F4_R0B,O\='B7_+3,U +M___T[O_4FV'_S)YQ_[Z%0__"DUW_OY!6_\256__ D5?_OY%7_[^,5__!D5+_ +MDFQ%_RT;#?]<4U/_8&!7_]+'P/_=SL__*S$S_RTR./\^0$7_)2DK_R8H*_\M +M,S7_(BHL_R0L+O\6'![_+# R_Q06&?\I*S#_%!,9_S0S.?\A'R+_&!X at _R,K +M+?\F+C+_*S V_S at T-O_4R<[_X,_7_^G7U/_MV='_\=K5__'9UO_SVMG_^-S9 +M__/7T__AR<;_^./?_Z.9E?\V,T#_)52._QXS@?\K4XK_P<+-_U=05_\G&"/_ +M='AZ_Y^7C?^'@GW_W=/6_][)SO\9'1__F9>9_\[ P?_8Q\?_9EE4_\_)P?\H +M)R;_14(]_X)[=?\^/#7_6UI3_T$\-_\3$0S_# H'_ZJBH/_.P\+_Q+RX_U!. +M1_] 1#O_6E1,_[:JI?]*0SW_+"TF_[>PI/^">&K_E8N _Y2)?O]A64__+RTJ +M_S@[0/]A8V;_8F5?_U-43?\R,2K_3$I#_RXL*?\R-#+_(RHJ_QD='_\;'2#_ +M%QD<_Q\A)/\M+S+_EXV)_Z&4C_^CEI'_FXZ)_Y6,AO^1B(+_C(-]_XR#??^$ +M?7?_*B8H_V%A:O^VLKO_,BXV_XZ+D?\6%!?_$ X0_X5_ at _]Z=8'_*BDZ_RDI +M,O],45;___'K_\6,4O_ DF7_SY94_\*37?_)F6+_R)AA_\657O_*EU;_R)EI +M_V!%(/\F&A7_(AP at _R$?*/]/3TS_S\.\_^?6UO\O,S7_%QD at _QT<(O\C)RG_ +M&QT at _R,I*_\P.#K_*"\O_Q@='?\K+B__&!D:_SL\-O]&24/_*3 P_QDC)_\< +M(R__(R8Q_S8S.?_1R,C_Z-;2_^W:U/_VW]K_^-_:__+_QX;(?\G(B;_)" B_QP:'/\9&AO_(!TC_Q at 8&_\7%1C_<6=J_XN#AO^> +MF9G_='!N_ZNHH__.O+C_+B@@_R\R)?_'O:[_GX]\_YN.??^1B('_75Q;_TY1 +M5O\Y04O_-3]*_SD^1/\I,2[_+S8/]46ES_ +M4%98_U%24_]/3E7_9F9U_Z^IM_]X='W_B(6+_X:$A_^IIZG_BH2(_W]ZAO\E +M)#7_.#A!_VQN'B'_(2,F_RDM+_\H*C'_3E%6_Q46%_^1B8?_ +MT\# _]"]O?^DF)3_3$,]_T-$/?]35T[_BH1\_YR+A?]I8V'_6EI=_SQ$3O\W +M1%7_-T=;_S%"6?\Z25S_,SQ#_RHP,O\A)RG_-CH\_Q88&_\G)RK_,C at Z_S,_ +M0_\K,CC_+CH^_RPW./\9(2/_*"PN_]K2U?_;TM+_X=C8_][5U?_HV=K_Y]77 +M_^C6V/_GU=?_]./C_]3)SO]X_S%"6?\T/$;_%A@;_Q06'?\Z-SW_&18<_Q<9'O\O +M-SO_'2DM_R$J,?\C,33_(S Q_S R-?\K)2G_Y]//__+;UO_OVM7_]^+=__?B +MWO_ZY>'_]>#;__?BW?_]XMO_S[FZ_VAB:O^IJ[#_D8V5_WY[@?^XM;O_IZ6H +M_VUG:_]Z=X/_(R0U_R at I,/\I)RG___7K_]FE;/_-IGS_VJ1A_\JA8/_%E5[_ +MO91C_Q\- /\@&#K_,"I&_RHI,/\\/#G_3TI%_SDT+O\]-3'_U,3!_^W9U?\V +M.SG_(R at M_R0D)_\M,C+_%AH8_S$S,?\_/CW_+3(R_R(F*/\G*2S_'1@>_VQF +M9/_$M[+_[M;3__'7U/_VW=C_\][9__'>V/_XW]K_[MO3__G%@O_)O[O_ULC%_[ROM/]J +M8&/_T<7!_\R]N/]M9V7_)B at K_R(G+?\V.3[_)BHL_TI.4/\[/T'_1TQ,_SL^ +M/_\@(2+_'QT?_];*S?_&O+__&A88_QX:'/\Q-CO_*B0H_Q8>(O\N/TW_,3]8 +M_SE#3?\]4&+_,$1 at _R8S1O\1%Q__.D=8_RXY1/\=&AG_*S \_RPL+_]A863_ +M+#0^_S=!1?\@+"O_+#4[_R0Q-O\K-SO_)BPN_RTK+?_GV-/_[]K5__+=V?_U +MW]W_^.'B__;@WO_VX=W_^.'<___GX/_FU=7_U?_TWM7_\N+8__7BV/_AS\O_V,7+_SQ$ +M5/\M057_.T5:_R=!;/\7("[_GY.$_R Q5?];763_%QXD_QLS6O\C,$G_$BQ- +M_R=6C?\L69G_,4V&_[Z^S?^NL*W_0#@[_QD4&/^!A'C_@'Y[_\:\N/_5QL'_ +MNJZQ_X%Y??_&O;W_R;V^_T1 0O\/%1?_&!HA_R,G*?\3%QG_%!@:_Q@<'O\1 +M%!7_'A\@_S$O,?\Y-3?_-C$W_S at Y0/\W.4#_'!LB_R8O+_\B(2?_'2HW_RT^ +M5O\Q/E'_)2HO_QXH-_]%3V3_EI6;_ZZII/]W?HK_,#I(_[*MK?\Y/TG_04)# +M_]'-S_\P-#S_-3U!_QLD)/\L,SG_("TR_S$]0?\8'B#_%187_]_0R__RW=C_ +M]=O8__G__#9VO_OVMC_[]G7_YJ.D?^$AHW_J*NP_Z";G_]F +M867_K*>K_Z:AI?]S;G#_$1(=_R F-O\N+C?_H9V?__SPZ__=IVW_RJ!R_\:7 +M7?^ND'K_.2(S_QX7-?\K)$+_*"$S_QP7'?\?&AK_(!D9_QH3&O\=&!S_*24C +M_\["O?_SW-?_/STZ_SDW.?]A6EK_-C at U_QP<&?\G)2+_+RHJ_YB,A?^FEHW_ +MT[VT_^_3R__ES\;_\-C/_^W1R?_LULW_\M;3_^+)R/^RH)W_N*:C_T8Z-O_6 +MSMC_-$=9_S1.7/\[/DG_.%:"_Q\?(O^QFGW_)3MB_T-%3/\Z/S__'#%4_Q8@ +M-/\@,D[_%SAM_R=,C?\L0'K_N[G)_X**AO\D("+_&!,7_W=Z;O]V=''_M:NG +M_]?'OO^^L;#_8%M?_U)-3_^PJJ[_B(J/_R$F*_\<'R3_&1T?_RTQ,_\R-CC_ +M)RLM_R4F)_\>'![_'QL=_YF4EO\X-SW_1DM1_R\T.O\7$QO_("0B_R$>)/\A +M+CO_,$!0_SD[0_^IHJ+_H**Q_TU79O][>W[_YN#>_Y*9I_\V/TW_P[BW_S@] +M0_\Y/CS_S,C&_S_QD1)?\T+D+_$ T9_Q84%_\8$QG_% T5_Q(/ +M%?\K*"?_Q;NW__#6S?^KHIO_:V5C_R,9%?\E("3_&10:_Q,.$/\<%Q?_$@T- +M_R(='_\?&!__(QPD_RH?'O\T)"'_.",A_RX<&?\G&1K_(AT?_QTB(/]U>7?_ +M0T5#_];1T_]::WO_&B8J_Q89)/\F3H;_&A\K_W)B4O\=-%[___CSLG_D7UU_SXU+_]&1#__\N'4_Y^'>/^LFHS_ at W=N_]_0U/]!0$?_769M +M_T!#2/^;F9O_&147_YJ6F/^GHZ7_<&MO_R(B,?\E*#K_+R\X_ZZFJO__[M;_ +MQYMS_SX>!/\<%17_&108_Q40%/\7$A;_%A$5_Q,1%/\6%!?_%1,6_Q43%O\4 +M$A3_%!,9_QD4&/^^LJ[_Z-7-_VI=6/\E'!S_2D \_TI%1?\9%1?_%A(4_QH6 +M&/]12T__-2\S_R8@)/\Y,S?_%A$5_Q<2%O\9%!C_&A49_QL9'/\5&1O_.D1! +M_U%64/\R-T/_[-O._S5#6/\G(R'_$!8F_S1:C?\;&RK_4T X_QTI1O\9'"[_ +M&AH=_Q4=,?\;)3#_'2 Y_Q <.?\C-V3_(#UW_ZVQQO^2C8__+2\T_Q89&O]P +M&R'_)R(D_TA#/?\9&A3_$1$4_RDG*O^&?GS_+RTP_Q,6&_\0$Q3_*BXL +M_V=F9?\P,3+_'2 E_SD^1/\U,S;_+2PK_T!#5?\Q04K_ at I"/_]W9V_\P-$G_ +M-D!/_[^WL_\U.D#_/$$__\W)Q_\O,3C_-C<^_SX^1_\G*C7_)24R_QDB*/^' +M at H3_M:ZU_][3R/^&<67_4U)'_RTL)?_?T,O_CGEM_ZF8B/]H9%S_TL+&_S]! +M2/\V.D+_0T)(_YB6F/\B'B#_E9&3_Y>3E?]J:&O_)24P_R$C,O\T-#?_K:BN +M___MX/\L'P[_'QPB_QT:(/\A'AW_'AD=_QD4&/\9%!C_%A07_R >(?\O+3#_ +M-S4X_SD[0/\_0$?_5E%7_\:YM/_NV]/_BGQY_T4V.O\I%QG_%@\/_Q,/$?\8 +M%!;_7%A:_VME:?]=5UO_2$)&_UM56?]54%3_%1 4_QX9'?\2#1'_C8>%_ZVE +MH_^]N+/_N+"L_Z6DJ__"L:3_4F)\_R,@'_\3&2/_1EN+_QD;(_]>4TC_$Q at Q +M_QH<*_\2$A7_%ATK_RHS.O\5%RS_#A4I_Q ;/?\C07G_HZF__XJ"AO\I(2O_ +M%1,6_V9E9/\B(A__,S0N_XZ%?_^BG)K_%Q47_RHG(O^(@'S_C(6%_Q\:'/\9 +M%QK_%A06_Q04%_\8%13_,28?_V5=6?]84U?_-#(U_XB ?O]544__@()__X:( +MA?\W/#C_&!L at _V-C9O]N:6G_L*RN_[VZN?]W=V[_.SY#_SA#1/]\B(7_W-C: +M_SD]4O\Q.TK_OK:R_S,X/O\^0T'_S\O)_S(T._]"0TK_-S= _RTP._\E*#/_ +M(RTQ_[RSL_^VJ[#_X-/&_XAN8/]223O_8EA-__'F[_G(]^_VEC6__4 +MQ,C_.#I!_S@\1/\^/4/_D(Z0_R <'O]>6ES_-# R_VUK;O\F)C'_(2,R_S,S +M-O^OJK#_^-?H_Q@:&/\6$AO_& X7_Q02%/\5$!3_$PX2_Q at 3%_\Y-SK_/SU +M_TI(2_]%0T;_0$))_T-%3?]'0DC_T+^Y_^W7S_^$=7;_(!@<_QP7&?\7$Q7_ +M&!06_R\K+?],2$K_6U59_TQ&2O\4#A+_(QTA_S$L,/] .S__&A49_Q0/$_^Z +MKZC_Q;&I_Z")A/^ ;&C_:V-F_[BFF/\S1F3_&!D:_Q(7'/\C)E#_%1@=_UQ8 +M2?\:&"O_'1TH_QH8&O\6&"#_(RPR_Q86)?\4%A[_&!PQ_R(Z:_^4EZC_I)N; +M_T,^0O\<%AK_03Q _QH8&O\;'1K_2DA _Z&>F?\:%AC_+"LJ_T! /?\R+R[_ +M$P\1_QH5&?\>&QK_*"PJ_VEI9O]B4DG_MZJE_\*ZOO\E("3_9U]=_Y^7D__B +MWMS_<7-Q_TM/4?\V.#W_7UI5_V)64?]/35#_6%)6_TU-0O]+2DG_&1P=_W5^ +M?O_=V=O_/$!5_RHT0_^_M[/_1$E/_S@].__/R\G_*2LR_ST^1?] 0$G_*RXY +M_R8L-/\9)"7_P;:U_\*RMO_CU,[_=5U4_U!&._];44/_Z]3/_W]L8/^+ at G'_ +M9F!8_]3"QO]!0TK_.CY&_T5$2O]^?'[_(Q\A_Q\;'?\B'B#_:6=J_Q at 8(_\5 +M%R;_3$Q/_[*ML?_YV/?_%A$5_R$1%?\=#QC_%!(5_Q40%/\8$Q?_%Q(8_PX) +M#?\U,#3_1D1'_U!-4_]&1U+_5EED_TQ'3?_&M:__Y]+._XQ_?O\;&1O_%1 at 9 +M_Q43%?\8%!;_&A88_Q82%/\1"P__#@@,_R :'O\;%1G_% \3_R ;'_\4#Q/_ +M'AD=_S\^,_^]M*;_P+*I_[RVKO_'O[O_JIN._TA;>?]34%;_&A\?_RLF2O\< +M'B'_6%9'_QX8)O\?'2;_&1<:_Q04'?\E+#+_$Q8B_PP-%/\:&B?_#!I!_T9& +M4?_ N;/_)B at F_QX9'?\6$17_%A89_Q(5%O\E)A__5E-._R,?(?\A(R'_)"DE +M_S]$0O\?(R'_4U%3_VYL:?^*B8C_'1\=_XMX;O_(M+#_UL?+_R,=(?]:5%+_ +MP[V[_^+:W?^!?H3_*"HQ_R ;(?]Q96'_?G-L_SH\0?\7$AC_6%9._S0Q,/\Z +M.#O_;7%S_]G6U?\Z/U'_,3M)_\*ZMO] 14O_.3X\_\C#P_\G*RW_/D!#_T9' +M3O\H*S;_,C8^_Q&!S_+RHD_ZF?E?^/@7C_:V-9_W%@6O^2C8C_0%-E_R$9)_\9&1S_ +M(R$T_R A*/]F85O_%A(:_Q\?*O\6%B'_'AXI_R$@_\6&!W_&1@>_R_QX='/\M+"O_-#,R_T)! +M0/\N+2S_*RTJ_WA]=_^@GI?_CHB&_^#5VO\;'!W_;5Q/_]W(P__MU=K_,2DM +M_T$\//^UM[7_XMC;_X:$A_\R.C[_'1LD_VID:/]H96#_4590_VEG8O]$03S_ +M8U]=_R4B(?^)B8S_X]W;_SQ 3_\\1E3_M[*M_T%&3/\]0$'_H)ZA_S Z-_] +M1D+_24A._S8Y1/\I*C7_(BHL_\2YN/_$M;G_V +M_V]J;O]Q;7W_*"E"_RPN-O]I;&W_XMCA_R at C)_\>(![_,S$L_S&_\_ +M/SS_0T- _R0B)/\?(1__/T1 _V=D7__-R,/_ZMO at _R:_TM56?\6&!__)R at I_VUL9?]+3T?_8F-< +M_RHK)?]?9&#_45E6_XJ.D/_AV]G_/T-2_SQ&5/^ZM;#_049,_T!#1/_+RD9#_,R0D_R09&/\G&1K_3D=!_SA# +M3O\:$R3_%!46_Q<4)_\I+#?_,3,V_R0D+_\='2C_(2$L_QP<)_\4%A[_$! 9 +M_Q,1&O\3#QC_%A, at _Q<:)?\H+3/_/#H]_S\].O\].S;_/3LV_S\]./\Q+S'_ +M'AP?_QH8&_\<&AW_'!H=_Q<7&O\8&QS_BX>%_]#(Q/_IU]O_*28L_S4S+O_4 +MQ\+_[]?<_RXF*O\Q+"S_MK&Q_^G9W?^8F)O_6&9I_YRDKO\3%AO_3DY+_WM] +M>O]76%G_*RTP_RDS-_\X1TS_ at XB-_]O5T_] 1%/_.4-1_XN&@?\^0TG_1DE* +M_\O)S/\Q.#[_0D5*_SX]1/\I+#?_-3<__R at P,O_!MK7_OJ^S_]/1SO]#0T#_ +M04=#_UI:5__,RL?_3U%._UA=6?];75K_T+_%_TI-4O^TM[S_:F5K_YR6GO\F +M(27_IJ.B_YV8GO]J96G_=7&!_RDJ0_\R-#S_B82(_]C0WO\3%B?_.4=<_Q$> +M._]!3&7_*"]%_QL=+/\<'"?_(1HB_RTF+?\P*S'_,S$T_S0O,_\_04;_-CA +M_SHX.__8RG[_,"HN_Q80%/\W,37_&1<9_QP8&O\B'1__'QT?_Q00$O\N +M*2/_/45/_Q0*&?\3$13_$Q B_R$D+_\@(2C_'!PE_Q<7(/\<'"7_&AHC_R(B +M*_\;&R3_%A0=_Q<3'/\5$A[_%!0A_Q49(?](24K_24M)_RHM+O\<'R#_&AT> +M_Q@:'_\8%Q[_&A8>_QX?)O\F)2O_.#H]_QPA(?\Z.SS_O+FT_^?5V?\F("C_ +M+C(P_\*VL?_UW>#_*B(F_R\J*O^SK*S_V,O*_Z*=H?]7:V__FZ*N_Y>9H?\G +M)BS_'ATC_R(F+O]E9FW_L;;"_T9=:?^"BY'_V]73_T-&4O\Z1%+_LZZI_T-% +M3/\[/C__OKR__S$V//\[/47_0#Y'_RS_R,E +M*/\F*"O_("@J_RHN,/\M+3#_*R\Q_RDJ*_\O+S+_'B(D_T-(3?]%2DC_T+_% +M_R\F+?\H*2K_KJ*=__7=X/\I(27_+"\ +MP?^GDXO_O:.6_["6B/_!J)?_R+&?_\VRH?_!I9?_R;*F_]O'P_]:7%__KK"X +M_UA56_]U<7G_)R(F_YN9EO^/BXW_75A:_VMK>O\I+$7_-#0]_VA=8O_MV>/_ +M(A at A_QT<(_\='"/_*2,K_Q at 2&O\8$Q?_'QT?_R0@(O\>&AS_'!@:_QH6&/\> +M%Q?_)2 F_ST\0_\F("3_HYF<_[2NK/^)AH'_+"DH_QX8'/\4#A+_KZFM_QL5 +M&?]P:F[_*"(F_UM56?\W,37_F8Z3_V1<8/^"?(#_$PX2_Q40$O\F(2/_)R(D +M_Q\:'/\.#A'_%A(4_Q(>,_\H-5+_$A$>_Q(/&_\4$1W_%Q0 at _QL8)/\>&R?_ +M'QPH_QH7(_\@'B?_'QTF_QH8(?\2$!G_$1 7_Q(1&/\3$AC_%!,9_R$C)O\> +M("/_.CP__SH\/_\4&AS_-SD\_U!+3_^4B8[_:V1K_X)]@_]"0$/_8V%C_Z6C +MH/_IVMO_*R4I_RXN*__-P;S_\MK=_R8>(O\I)";_L*"H_\# O?^ZJ;G_,TQ= +M_V9U>_]OA)#_;H:9_UEXBO]RD*;_;Y"<_V*-G_\H/$K_ at H2'_]C0S/].35K_ +M.41/_UQ>5?\Z.T+_,S_V9B:O\E("3_E9.0_XR(BO]E8&+_=76$_RTP2?\P,#G_KZBH +M_^G(O]",CK_,2 F_R$5%O\F&R#_'!,:_QT7&_]- +M1TO_&A08_Q<1%?\<%AK_*B0H_QP6&O\>$QC_% P0_QP6&O\7$A;_%A$3_QT8 +M&O\G(B3_'QH<_QL9'/\>&AC_$AHJ_Q8=,?\7%R+_&QLF_QL;)O\;&R;_'!HC +M_QT;)/\>'"7_*27K_WM;2 +M_TE(5?\M.$/_+#0J_TU.5?\[/4#_+S(S_R(/\C'B#_'1@:_R,<%O\<'B/_*",I_QX:(O\='2;_'1TF_QP= +M*/\L*S+_,C$W_R ?)?\8%QW_&A<=_QH7'?\9%AS_%Q0:_Q<7&O\='"+_)B4L +M_QT:)O\7%AS_7EYA_S P,_],3$__+BHL_QT@(?\Z0D3_&1L>_Q47'_\<'"7_ +M$Q87_V-?7?_$O;?_ZMK7_RHF*/\G(1__LJ:?_^/+SO\P*"S_,"PN_\.WL_]N +M=W#_N[6Y_S]27/^0D9+_PL3)_S<]3?\Y057_>H&'_]3,RO]H:'?_/$95_SQ" +M1/]T;&C_3$M8_RXY1/\1&Q+_(B0I_S at Z/?\5&AK_)BLP_SD\0?])2$__,C8^ +M_S0U0/\@)2K_JZ*B_\:WO/^LFY7_JI2+_ZB3A_^?BWW_EXA[_Y>%>_][:&#_ +MBGQS_^?2S?]C8V#_JZNN_TI%1?](14O_(!L?_X)_?O]I96?_9%]C_UU=;/\C +M)SW_/#U$_Y60EO_DT>?_*28L_S V0/\V,S__(R,L_Q,4'_\3%!__.SQ'_RLD +M+/\N+"[_/S0S_UI25O]965S_-#)_\L +M*2__(" I_QX;)_\6$1W_%Q(>_Q<2'O\6%!W_&1<@_QT;)/\?'2;_&AHC_Q<7 +M(/\<'"7_,S,\_U=46O\J*"O_$ X1_QH8&_]@8%W_>'IW_SP_0/\5%QK_'B E +M_T- 1O\9)B?_65M>_\6RLO_RU='_-RY_S4J+_\Q+S'_ +MSL*Y_V]UA?_,P<#_.TA9_Y".D?_*Q<7_-#Y-_R\[2O]Y?G[_V];1_VUO?O\R +M0E7_+3LZ_U122_]245[_,CQ*_QD='_\5&1O_,C8X_SH^0/\Z/T7_/3]"_TQ. +M4?\P-#S_)2LU_R$D*?]K:&?_N["U_]/(Q__-P[__U,K&_]S2SO_EV=7_Z-K7 +M_^77U/_JW-G_]N+>_UQ>7/]L;G'_)"$@_SLY._\?'2#_1D1'_QH8&_];6F'_ +M'A\P_R0G./\T.#K_ at H""_^'3[_\K+37_2%%?_RXP/_\:'2C_)BHY_QTA,/\0 +M%"/_5U!:_VEK;O^^L+'_Q+G _V5E;O].4%C_1DE._RHE)_\E'A[_(1H:_R,< +M'/\C'!S_*"$A_R$:&O\I(B+_+B:_\W(R/] 2EG_.454_VIS<_]S<&O_ +M?7^._S% 4_\T0#__1T4^_U958O\B+#K_/D)$_SD]/_\_0T7_/4%#_SQ!1_\W +M.3S_/D!#_S T//\G+3?_(20I_R4G)?^BG*#_YM'/__OBW?_XW]K_^N'<__WF +MX?_ZX][_^.'<__GBW?_TV-K_;6MM_R8F*?\X-3#_DY*1_R4C)?\B("+_(1\A +M_U-26?\N+T#_)"_RTH*/\U,##_'AD9_RTH*/\D'Q__)"(D_XM^>?]%-SC_)C15 +M_Q(>._\8&2K_%A,?_Q85(O\>'2K_&AHE_QX>*?\8&"/_%!,:_S(Q./\?'B7_ +M(!\F_QX<'_\>'!__'!H=_R_R at I.O\D)SC_-#@Z_TA&2/_AS^/_,2PP_R(C*O\R+C;_)2 B +M_Q0/$_\>&1W_,2PP_T,_1_\H*B__S+_$_]G(TO]85FG_1DE;_T-#3O\I(27_ +M*A\>_S0I*/\N(R+_*R ?_S H)/\L)R+_-"\J_R at C'O\R*B;_,B*/\>&B/_&ADF_QD:)?\8&"'_*2DR_S$Q.O\K+"W_(R(A +M_R$?(?\?'1__'QT at _QP:'?\7%1C_-30Z_Q<4&O\5%1C_'R A_R\I+?\C)"7_ +M4TI$_X5V_QD5%_^EGI[_VL_6_T-#3O\\/$O_0#I( +M_S$J,?\G("#_(QP<_RLD)/\F'Q__+",C_S4L+/\X+R__,"(2S_,S(X_R4C)O\@'B'_'AP?_R,@ +M'_\A'AW_(1P at _R$<(O\F'R;_'AD=_QP;(O\O,SO_FI&8_YRAH?\V3T[_15]H +M_SHW1/^3 at XO_N:JN_V%:8?_DW>?_?H&2_T%)7?\N*C+_FY::_\_ NO\W+#'_ +M*R at N_[:II/^]KJ__?7)Y_R at C(__%N;#_FY&-_\C'SO],3E7_%A06_W^!B/]# +M35O_.D95_QTL*/],3E/_CXJ<_R at R1O\?(R7_2DM,_QX@*/\H*SS_.SU$_S0X +M.O]"2$K_.T%#_RXQ-O\N,3;_*2PQ_RHM,O\F*S'_*"LP_S0V.?\D)2;_PKBM +M_[>CF__ at R<3_BWEO_Z"-A?^[JZC_8UM9_U-+0?_FU-#_XLW+_Y:+BO\U.CK_ +M,S@]_R$>'?^0BH+_>WEQ_R8F*?\E*#3_*RX__U-26/^%A8+_V,O=_RXF,/\Q +M+##_'QLC_QL7'_\B'R7_'1H at _S M,_\Q,3K_%Q0:_S&R'_'!D?_QT:(/\H(RG_*R8J_RLC)O\M)"3_ +M)",B_V=E8/]F85O_*!T<_[*GKO]S;77_)B7%[_ +M-#8]_SQ'4O\\2U'_'RD?_T5(0O^5E)O_*2\Y_UQ?9/\;("7_+C9 _Q at B,/\] +M1DS_-#H\_T!"1?\9%QK_%QD>_RTP-?\I+#'_+C$V_R$F+/\B)2K_+C S_SDZ +M._^^M*G_K9F1_^++QO^,>G#_F(A^_\"TK?]_)?\='"/_(!\F_QX>*_\G*"__95Y>_]_0T?\W +M-3[_,# __T0^3/]".T+_+28F_R4>'O\E'A[_(AL;_S J+O\9%!C_%1 4_Q<2 +M%O\:$A7_(AL;_RLD)/\K)"3_-C$Q_R4=(/]^)/]L:VK_,"LF_YN.C?\I(R?_N*VF_R@>&O]I:&__1$9- +M_QL?)_\W0$[_1D]@_S]"3O\0#1K_"0 2_R(7+O\.!QG_*20P_QL;)/\Q-$#_ +M*"\]_R0F+?\9&1S_24E,_Q04%_\;'2+_*2PQ_R\R-_\N,3;_)"DO_R,F*_\F +M*"O_/3X__[ZTJ?^SGY?_YL_*_Y.!=_^.>W/_P;*M_VE?6_]>4DG_[M_:_^33 +MT__7R,G_14!$_SDZ._\C(1[_85]:_RLP+O\I+2O_1TE1_S0T1_\T+SO_TL;/ +M_]3$V/]%/D;_(R F_R$?*/\W-T+_.3I%_U-47_\F)B__*"@S_Q\?*/](0$/_ +MWL_/_T,_2/]#0U+_/#E&_T [0?\D'!__*2 @_S(I*?\S*BK_&1,7_QH5&_\> +M&1__'1@<_QL3%O\@&1G_)1X>_R at A(?\P*"3_D8B"_]?(P_]J7EK_)R(D_R$; +M'_\H("/_,2 at H_R0B'_]>8V/_8F9H_XJ%A?]02$;_(!T<_Q\='_\C'!S_)1TA +M_R$;'_\F("3_*B(E_T])1_^1CHG_G)>1_[2PJ/\V,3'_,"LO_W]^A?\T.$#_ +M9&9D_[NVNO_(O^EF93_ at GEY_R\Q +M.?\R-#S_+35%_SI%5O\(#R/_)1TX_VIDGO]13I#_.#AQ_Q@;2O\:$BW_+RD_ +M_Q01)/\7%R+_&!,7_QL8'O\A(23_J*BK_RLN,_\L+C/_-CD^_RPN-?\C*"[_ +M'B$F_R4G*O\S,3/_P+:L_[*?E__>QL/_DX%W_X5T;O^MFY__;&IL_X)[=?_D +MU];_X\[,_["?G_^[LK+_)R4H_R\J+O\T,3#_("8H_U]F9O\L-#[_,C=)_S P +M.__3R]7_U'RK_&ALF_R0=)_\8$1C_&1,; +M_RXG+__DU=G_1T!*_ST]3/\V-D/_3TI0_RH>)_\I'"'_+2,?_R\C)/\:%!C_ +M(AP at _R(='_\J(B7_)R @_RDB(O\K)"3_*2(B_S0J)O]E9F#_X-/2_X%O$!G_'Q8=_QL9 +M,_]75X#_4E)Y_P\/'O\E("#_+C0\_T-!0__;TM+_*BDP_RXM-/\V.$#_*RXY +M_R8J,O\A)"G_*RDL_SHU-_^_L*K_UL.]_^W8UO^>BX/_A8!T_]C S_] 3E?_ +M+ATC_W9VA?_6Q\?_.# S_V]L_R <'O\@'2/_ +M>G)P_SP^1?]'5V?_.T53_SE"0O\;%C+_:5:$_Q4,'?\3%!O_$@X6_Q80&/\4 +M$1[_%Q8=_PH&%O\Q*T'_&14>_R4<'/\_0TO_24=)_];1T?\@'R7_+BTS_S$S +M.O\N,CK_,#4[_R4H+?\P+C'_(1P>_XM[_]Q;67_R[;, +M_Q_O?\M*"K_1#]%_RTI,?\X,3'_GY6+_X6$??^-BHG_ +M9F9O_RHM/O]%04G_Q+W'_]K#X/\E'"/_&!$8_R$0&O\A&B'_&QLD_R(H,/\M +M,#O_)20J_RXM-/]545G_ULS/_T([1?\[.TK_4U- at _U-.5/\P*";_(148_RP@ +M(?].13__O[.L_]S/RO]&/CS_*"(F_R,;'O\I(B+_)1X>_RDB(O\S*27_B8J$ +M_][1T/^@CI#_*" C_RG/^FG)C_P[>P_YZ6E/\H(R7_*B(E_U=(2/^4DH__WM+5_^+3V/\O +M+BW_)" B_R(>)O\W.D7_/4!!_[RTLO_:R\O_XM[<_U5:5/\U,S7_8%E at _Z.8 +MG?_MU]C_SL7,_SQ!3?\<&R+_8EI8_U5/3?\:%17_(Q\A_R$?(?\<&AS_'QT? +M_Q\='_]834S_2$E0_T939/]!2%;_)QTP_STK+?^KDH'_=EI7_UH]//^8=6[_ +MA6%7_X1B7_\K&!+_EH%__Z>1D_\4!@/_-RDF_T)$3/])2DO_U=+1_QP>(?\L +M+2[_/T)'_S U._\L,3?_)"_RPH*O\\-SW_+R at R_T X-O^@E(7_ at GES +M_XE]?O]?6V/_)BDU_SLZ0/^\M[W_S+S8_RDJ,?\4'R;_&QTD_R(B+?\E*C;_ +M/$1._Q,:(/\E)"K_*RHP_SDV//\?&!C_/3E"_SL[2O]*2EG_4U!6_RLC(?\X +M+"W_*AXA_RLD'O^7BX+_V,S%_UE.3?\J)BC_(!L=_RHC(_\J(R/_*"$A_S F +M(O^)BH3_WM'0_Z22E/\H("/_)Q\B_RHC(_\K)2/_+RDG_VUN;_]@96K_)B$C +M_Z21A?_ K:7_Q[NT_\6YL/_(N[;_JJ.C_R at E*_\E(R;_1C at U_[>PJO_?T-#_ +MZMO<_S0Q,/\D("+_'AHB_S7O_>GU^_W5[??]H +M96O_KJ.H__/AWO_8S=3_24Y:_QD:(?\H(B#_)A\?_R8A(?\A'1__'!P?_R > +M(?\A'R'_'AL:_T8W-_]!.T/_1T]?_U9;9_],3E7_#0,,_RL4'_\R(2?_%0H7 +M_R$4'_\G%Q__&0T6_R$:(O\8"QC_)A at G_R :(O^6BHO_1$)+_T=(2?_1T,__ +M+"XQ_TQ.3/\9'!W_("4J_SQ!1_\I+C/_2$-'_][6V?^)>&O_P:NB_^G3R_^8 +MA';_?W1I_]>[S_\<+CC_+"4L_R8Q//^1D(__*28E_S8P-/\I(RO_1S\[_YN+ +M>_^1AG__D8.$_TE$2O\B)3#_(R,F_ZZLKO_=SN;_)RLS_SM)6/\G*S/_-C8S +M_T) /?\_.SG_&Q,1_RPM)_\M,R__66%=_]72T?\X.4#_+3 \_SHW1/]I9&C_ +M+"(E_RXD)_\F'Q__)B(@_ST\-?_7R\?_;%M;_R8?'_\A'AW_)R @_R\F)O\M +M(2+_-2 at G_XZ.B__>T=#_LZ*B_RDD)/\D'Q__*",C_RHE)?\X,"[_96=E_V)I +M:?\B'2'_F8R!_\.RLO^#?';_:6=B_^76VO^MH:+_*28E_R4@(/\X,RW_O;2N +M_]3(Q/_DW-K_.#4T_R0@(O\@'"3_,C5 _SY%1?_"L[/_S+^^_^_DX_]Q:G;_ +M1U-<_UY=8_^YJZS_Z=K4_^70U?]%15+_&!HA_R0?(?\F(B3_(Q\A_R <'O\@ +M'![_(1T?_R(>(/\>&AS_-2EHO]955[_0D5& +M_];3TO\K+3#_.#HX_S4W-/\R-3K_,#$\_R at P-/_&NKO_Y]C=_Y5_=O_)L*O_ +MY'!G_(QL?_Q<; +M&?\?)1?_/D,W_SE"-?\M.BW_(RX;_R)"+?]ICX#_QL7$_TE$2O] /D?_-2\W +M_T Y.?\N(B/_)1L>_RLD)/\E(1__("0<_\C#OO^#<'#_,B0E_R0='?\G("#_ +M,RHJ_RTA(O\P(R+_AX>$_]K-S/^_KJ[_*20D_R0?'_\M*"C_,"LK_S8N+/]E +M9V7_7V9F_R,>(O]V;&'_:EU<_XR*@_^,CXG_Y]C<_["DI?\O+"O_)B$A_RLJ +M(_^MIJ#_R+JW_^O at W_\Q+BW_(Q\A_QL7'_\P,S[_/$-#_[^NKO^_L+#_\N7D +M_VYH=O])5F'_5E=>_[*FJ?_AU<[_Y]+7_S\_3/\@(BG_)2 B_R,?(?\C'R'_ +M(!P>_R <'O\A'1__(AX at _QX:'/\K(R'_24M._T926_]:96S_1$]:_SE#3O\J +M,3__,C%._S G8_\T*F__/S9\_UM1FO\8%4G_95^+_T$]7?\Y04O_E923_UA4 +M7?],3U#_V=;5_S R-_\P,3+_24M)_S R.?\Q,CW_)R\S_\.WN/_DU=K_?G%L +M_\"KJ?_WC_U\K)_\BWM_\H(R/_)2 @_R_WMP9?]H65G_LJNE_YN9E/_DU=G_MZNL_S,P+_\G +M(B+_(2(;_ZZIH_^MGYS_Y=C7_S,N+O\E(2/_)" H_SD\1_\Y/C[_P*VM_Z>6 +MEO_NW]__8UUK_SA)5O]#1T__JZ"E_^'4S__FT=;_/3U*_R B*?\H(R7_)B(D +M_R4A(_\B'B#_(AX at _R(>(/\B'B#_(AX at _R,;%_]14$__/$5,_XB*D?^+B8O_ +M24]1_SM'3/] 2%+_>'I__T9'3O\H+CC_'"4S_TQ55?]Y>GO_Q\')_SD^2O^+ +MB8O_3TM4_T)%1O_)QL7_+S W_RDI+/^8F9K_/#Y&_ST,W_J9B8_R8C +M(O\A'AW_)R @_RXE)?\N(B/_,20C_T1%/__7R,C_S+N[_R at C(_\E("#_)!\? +M_R8A(?\N)R?_*RDK_SH_/_\?&A[_;U]6_W]O;/^1B(+_I)^:_^C9VO^ZKJ__ +M+2HI_R,>'O\D)1[_KZFA_Y.'@__BU=3_/CDY_R,?(?\C(";_1$=2_T1(2O^\ +MK*G_DX*"_^?8V/^#?8O_-TA6_U]B;?^O_\RPK/^9C8;_V<37_R,Q0/\E(2G_)BLQ_WAX +M=?^=F)+_D(N+_X![>_^(@7O_9V!:_UQ=9/^5D)3_*"HM_S=#1_\[1$3_9FMK +M_][;S_\M*BG_,"XW_S@^.O]_?HO_9D.*_Z-[K_]%+$O_JHJ]_WM8F/_3PLS_ +M[-K0_TI&3_\^/DO_4U)?_ST\0_\K(R'_+R,D_S D)?\^-##_ _]W+R/_2P<'_)B$A_R0? +M'_\H(R/_*R8F_R at C)_\I)"C_)B$E_Q\:'O]S8V#_C(![_WIWWO\Z-37_)R,E_R0B)?]256#_ +M1$=3_[JKI?]U9V3_Z=O<_Y6)DO] 2EC_7%]J_Z.;GO^?F)C_Z-O6_T-#3O\N +M,3S_*B8H_R8B)/\C'R'_)" B_R(>(/\B'B#_(!P>_R(>(/\7$!C_*2XT_\K% +MR_^\M+C_W-/3_U%59/\A*3/_0$=3_VQN=?^7CH[_W,W2_TY17?]L;G7_=VUP +M_]W.T_]$1U+_AHN+_V%?:/\^04+_QL'!_RO_4R-?_+BY!_R$C*_\Y +M-3?_C7QV_]K#M_]!-3;_)R,E_V!>6?^$A7__B(B+_Y2/D_]P<7+_2E-3_U5: +M6O^'B8S_Z+O?_XA.H/^F9-'_QYS2_UQ(4?\U&3/_1S [_S4N*/^)?7G_FHF4 +M_]3(Q/_MVM3_4T]7_S'O\J)27_)R(F_QH5&?\A'"#_'!<;_U1$0?^6BH7_8V!;_ZFC +MH?_;S5E+_Y-O;_SPW-_\G(R7_'1L> +M_T!#3O\[/DK_L*&;_U]13O_DUM?_K:&J_T)-6/]35U__7E=7_X%Z>O_DU]+_ +M3T]:_RTP._\D("+_)2$C_R,?(?\D("+_(AX at _R,?(?\F(B3_(1T?_RLC(?\S +M,2S_74Y._ZB>FO_7S\W_3U-B_RLS/?] 1U/_7%YE_X^&AO_FU]S_24Q8_U)4 +M6_]C65S_VLO0_SH]2/]^@X/_85]H_TE,3?_>V=G_+RXU_R\N-?^4DIO_/#U( +M_SU 1?\N-#[_MJFH_\"LKO^JD8K_HHA]_ZJ4C/^YGY3_CG]R_\K#S_\P,S[_ +M(R8G_XU_@/^3 at 7W_WLO%_TH\/?\<%A[_(1\B_UQ>6_]K;VW_='%P_W]^??]W +M?'K_9VMI_UU at 8?_FQ=;_;DAI_]RUV/_[XMW_54A-_RDB+/\I)C+_-35 _WIS +M9_^5C7W_R[^Z_^30S/]'1$K_,S- _S at W1/]655S_*2$?_S(F)_\S)RC_-"HF +M_Y&%?O_9RL7_Q;:V_RLC)O\B'1__)1T at _RXE)?\K(!__-BHE_X* >?_2P+W_ +MTL'!_RDD)/\E("#_)B$A_R(='?\<%QO_%A$5_Q<2%O\;%AK_134R_Z>;EO]. +M2T;_IJ">_]W/S/_7S,O_,"TL_R8A(_\R+BS_Q+:G_U5-2?_BV=G_.C4U_R8B +M)/\:&!O_(R8Q_T)%4?^FEY'_4D1!_^'3U/^WK+/_/$A1_U9;8?^9DY'_D(F) +M_^GAWO_<&-8_]K2T/]35V;_+34__T5,6/]:7&/_?71T_^G:W_]% +M2%3_3U%8_V!66?_>S]3_1$=2_XZ3D_]T_][:&#_R[_( +M_T$_0?\X,R[_9EM:_SX\.?\J+"K_-C0V_R =(_\V-SC_='AV_VIM4E/_-#$E_RPH)O]$ +M.T+_>FYE_XZ%=__)O+O_W(/\F'B'_+20D_RXF)/\V+2?_;FEC +M_]K(Q?_/OK[_*R8F_R4@(/\D'Q__*",C_Q0/$_\4$!+_%A$5_Q at 3%_\P)B+_ +MLJ6 at _T-!.O^ZL*S_T\?#_]S1T/\T+R__)R(D_S at T,O^_LZ3_23\[_^79VO]" +M/3__)B(D_R ;'_\C)C'_0D-._ZB_T-&4O]46V'_1CY!_]O/TO] 1E#_<'-T_VEH;_]'2DO_GIJ<_S0V._\M +M+#+_IJ*K_S8Y1/\O,C?_+C0^_Y^2D?^QGZ'_:U]:_UQ74?]H:6/_;FIB_WUK +M9__#LKC_ULS(_]&_O/]V85__JJ&A_R0C*?\_-SO_)B0A_XN.B/]G;&K_455= +M_W%P;_]^?'?_5UE6_U!12_]344G_X]/*_V=84__ATM+_Y=#+_VQ at 8?\Q*C'_ +M.3,[_SPX0?^+ at GO_?G5N_[ZRK?_ at S,3_349-_SL]3/])2UK_.C8__S H*_\L +M)27_+RHE_R\J)/^/BX/_S<&Z_]+ O?\N)27_)!\?_RDB(O\J(R/_*"$A_RWMP_\"KI__&P;S_V]/1_S0M+?\D'R'_/34S_ZJDE/]5247_ +MY]C9_TI$2/\I(R?_(AP at _R >)_\M+S3_B(6$_T Z,O_BU-'_R;C _TM48O]$ +M257_E8^-_Z.T]C_0$-/_S]+5/\T,C3_S<;&_SQ!3?]*1T;_8&%B_T-(3?]02T__ +M+3$S_RTM,/^JI*S_045-_SM 1?\I,3O_6E)0_]#$Q?^*C8[_?W^"_Y^=IO]6 +M76/_+C<^_SL]0O\N)R?_,2 at H_[2GHO\J)2?_(" I_TQ'2?^'A'G_I:29_V=L +M:/]L='C_8W9^_X:(C?^"@G__1T5"_UI54/_8R+[_<6)<_]W/S/_FTLK_=VII +M_S4M,?\_.#__0SU%_V=@6O]N9V'_K**>_][+Q?]M9F[_0T15_U97:/]'0D[_ +M+24H_RTF)O\K)B'_-C$K_VQH8/_)O;;_U,*__RLB(O\D'Q__)A\?_RTF)O\J +M(R/_+2(/\_-S7_E8]_ +M_W!D8/_:R\S_95]C_RDC)_\C'2'_(!XG_ST_1/]%0D'_M:^G_]C*Q__1P,C_ +M04I8_U199?^0BHC_H)F9_^/1S?]W<'S_1D=2_R at C)?\J)2?_K*6E_Y2,BO^+ +M?GW_G)&6_R4@)O\J(B7_?W1S_UI<6O_$O;W_MK.R_[RNMO]-55__0DQ:_TE. +M8/]'3E3_<6QL_^+7W/],3UO_.45._X2"A/_:T]/_.3Y*_ST^/_]765S_/3]& +M_R at G+?\4&!K_)"0G_[NUO?]"1D[_049+_S$Y0_^1B8?_W]/4_U=I=_\W36/_ +M)SQ5_S!%7?](7'#_%R$O_QT?(O\F)23_4$5*_S G+O\?&A[_I9^7_["EGO^. +MAX'_;6]M_VYV>O]6:(S_2%%B_U!:2_],3$G_4TY._]?(N_]Z;&/_V'O\G("#_*"$A_R@='/\B +M(1K_%A8C_RDE+?\<'1?_RJVI_W-P9?_,L*W_L*BD_]_7U?\V+R__)!\A_S H +M)O]XM_UAA9_]+ +M5V#_/T94_T=/4_]234W_W-'6_U-68O]#3UC_A(*$_]3-S?\]0D[_'2,E_R\Q +M-O]/3UC_)B'O_6R<3_AH."_UI@ +M8O^/EYO_8F-D_RLF)O\N)R?_+24A_RLF(?]A757_HY>0_]3"O_\I("#_(AT= +M_R0='?\K)"3_+R at H_RXE)?\B'AS_3TU(_\O O_\M)"3_(QP<_RLD)/\M)B;_ +M(14>_U588_\@)%'_-S!?_QX<'__'JZ?_MJO^4CXK_W-'0_S at O+_\D +M'R'_*B(@_UU62/]V:F7_V\S-_X5]@/\H(B;_(!H>_QD9(O\^/T;_.3 at W_[6O +MI__3QL'_V,?-_T--6/]%2U7_?G9T_UE45/_(N;3_B8.+_T]27?\E(R7_+"W5S_]K. +MS_\C)2K_'"$G_U-68O\I)##_(ATA_R(@'?\D(AW_(B_UM94O]".3/_T,*__S H +M)O\B&QO_)1X>_S I*?\H(2'_*B,C_R\I(?^0B7O_R;VX_RLD)/\B'1W_*",C +M_RDD)/\K(BG_6&)?_R I6/\\/&?_'!X<_[VHH_]B4DG_MZJE_W1Q;/_=S,S_ +M/C4U_R,A(_\H("/_/C at V_SLT+O]G6US_E(N+_RLD)/\>&1__&AHC_SQ 2/\\ +M.CS_IYN6_\>YL/_;RW__0D)/_QT; +M'O\G'2#_IIB5_]'%OO^JFI?_MJ>G_S$H*/\G(R7_-CP^_TQ04O]85%;_IIZ< +M_S4Z-O\B*RO_2%%8_T9/7?]045S_AXF,_^/4V/]24&#_-T%+_U]@8?^^N[K_ +M-CE%_R at K-_\_04G_1DA/_T5(3?](3E#_*2DL_ZVIL?])25+_,3@^_S$U-_]+ +M24;_R\+"_R4@(O\B&AW_N:VP_R at C)?\@'2/_'!LA_Q86&?\E*"G_LZRF_]C+ +MQO_BUM+_N[>U_T)'1_]P=G+_4EA4_SD^0__CU]/_[]S4_^S9T?_SX-C_^^?? +M_\2[M?]%.S?_>FQI_]2^M?^:BH?_+28F_S\]0/\V+S;_'!T>_SP[.O^4D([_ +ML:6 at _W!H;/\G)S3_0DA8_V9D=/\E'2#_+B,B_RTB(?\E(1__)2,>_R 8%/_/ +MPL'_+28F_Q\8&/\B&QO_*2(B_R\H*/\M)B;_,"HB_Y.,?O_,P+O_*R0D_R(= +M'?\E("#_+2 at H_RLB(O]?9%[_7F5S_UI:9?\;&13_PJVH_T'B?_ +M04=1_T='2O^;D8W_M:FB_]K(RO]26F3_1$Q at _Q\>*_\6&R#_4TQ&_V5?9_\I +M)##_*B(F_S at I+?^LEY7_V%@O]Y:FK_*R(B_RRK?_XW=;_^=[7__[C +MW/_]Y-W_P+*S_RLC)O\A&QG_K9J0_Z>8D_\P*BC_04 __S8Q,_]%2TW_1$A& +M_Y&(@O^:C(G_CH.(_RPJ.O]$15S_<6U]_RLC)O\M(B'_,"4D_QX:&/\>'!?_ +M&A02_\B_O_\G(B3_(AT=_R$:&O\G("#_*R0D_RXG)_\M)Q__AX!R_\_#OO\H +M(2'_(!L;_R8A(?\F(2'_)B0A_UQ at 7O]G;&K_9&-B_R(>'/^]J*/_-RTC_YV8 +MDO\].S;_WLW-_V%86/\C(2/_*",E_S8S+O^ >W7_3$1 _ZJBH/\J(R/_(!LA +M_QD9(O\]1%#_/3Y%_X^'A?]934G_X,[2_T1,5O] 2%C_+BDO_TI&2/^!>'+_ +M(2$L_S4R/O\H(R7_,2("7_0$-(_TQ06/\[04O_3E!8_VIL;__4Q9?]+3E/_-#H\_QP<'_^>FJ+_1D9/ +M_RPO._\N,#?_,30U_TM*4/^KI*3_V\[-_^G8V/_KWMW_XM31_[^MJ?^5A'[_ +M=V1<_^?2S?_MV]?_T\O'_];+RO_3S\W_/T)#_V]Q;__JV];_^=[7___DW?__ +MY=[__^7>___GX/^BD9?_(QL?_QD4%/^,>V[_I)2+_R4@(/\^.SK_1#\__S=! +M1?]$247_CH-\_X^!?O^IH*#_/SQ(_SY 5?]84F#_+B_RXI*?\H*"7_8&)E_V5K9_]D9&?_(AT=_\*NIO\_ +M-"W_ at X)[_QL<%O_:R\S_'_ +M_^;?___GX/__YM___>3=_YR$C?\J&B+_03LY_WUL7O][:V'_)!\C_T$Y-_]" +M.CC_+S@^_S(U-O^+ at GO_>6QG_[ZTL/\V-3S_3U)D_TQ(6/\K(R;_*R$D_R\C +M)/\L(1K_*B0<_WAP9O_2Q\#_,B at K_R :'O\A&1S_+R8F_RXC(O\N)27_)R,A +M_VMJ7_^XKZG_*"$A_R$<'O\C'A[_+"@F_RPC(_]B8V3_8FMK_V%D9?\@'AO_ +MNJF;_R4=&_]W>'G_&!<6_\2]O?^4AH?_*" >_R8>&O];44?_95Q._V)>5O^Y +MK*O_*RHI_R8?)O\9%1[_.$%(_R_R$9'/\P)R?_+R0C_R\F +M)O\A'1O_7UY3_XZ%?_\G("#_(QX at _Q\:&O\J)B3_+20D_UE:6_]:8V/_:6QM +M_QX=(_^QI9[_'Q<:_S_["DG_^7G_\>#:__OB +MU?__Y-G__^7A___CW___Y=[__^7<__WDW?^FD8W_+B(>_S\X,O]D447_=F9< +M_QH5&?] .#;_,"@F_RDE+?\E(R7_:&A?_UM23/^XJJ?_,"HR_TY18_]&2%?_ +M,"LM_RLA)/\T*"G_,"4>_R at B&O^-A7O_QKNT_RXD)_\?&1W_'Q<:_RPC(_\M +M(B'_+",C_R8B(/\Z.2[_7U90_R8?'_\?&AS_*",C_R <&O\M)"3_4U15_UYG +M9_]B96;_(!TC_ZJ9D_\X*RK_6E12_W%K8_^TJJ;_IYN<_R8@)/\F(R+_65), +M_T,],_]V=&__R[Z]_RDH)_\A&B'_(!PE_SD^2O] 0D7_ at H!X_YB.BO\@'2/_ +M6EQD_TA/6_]-5V7_045-_T-&4O],5F3_355?_R A(O\O*2?_J9V6_Z*, at _^L +MEH[_HY.0_RD>(_\D'B+_*BPQ_TE05O]+5%O_2U5?_U!17/]<96O_M[.[_T$_ +M3_\I+SG_EY.;_R(?)?\K-4#_)BX^_QH>+?\A(";_A8" _TY24/\U.CC_&1L> +M_SDX/O]!1$G_'ATC_S4R./\A(RC_*"PT_R4G+O\\/D/_/CY!_YF/>__!II__ +MY,NZ_YF&;O_3P[K_EHB)_S,M,?\G(B3_Y]+&_\:]M_]/5UO_86=I_^',T?_V +MWMO__N?;___HW__[WMW_PZ6G__S at W/__Y][__^;?_[.DGO\F'AK_.30N_U=* +M/?]Q8UK_&!(6_S(I*?\F'1W_*"$I_QT9&_]+3$7_44A!_\BVL_\H'B?_861U +M_T5(5/\X,S/_)QT at _S,G*O\S*"'_*R4=_VYE7O^_M*W_,BDI_R$<'O\?%QK_ +M*R(B_S$F)?\J(2'_)R$?_RHH(/\_.#+_(!@;_R ;'?\G(B+_)2$?_RHC(_]/ +M4%'_769F_V%D9?\C'B+_IY2*_VY=5_]<4$?_<&9;_ZJ>F?^SI:;_)R(F_R0@ +M(O])1#__,BTG_W-Q;O_+P+__+"DH_R,=(?\A'27_(R\V_SH\.O]J75C_(QX@ +M_T1)5?]#2E;_04E3_T--6/]/4EW_2U!<_TM59/],5V+_(20E_RTH(_^GEX[_ +MNJ69_Z6/A_]$-C/_)QT at _R8@)/\N+C'_/$-)_T=05_]C9V__HJ*K_U1=9/\N +M*S'_-31!_S4Z1O\:&"C_.3='_RHR0O\<("C_(" C_XR(AO]G6U;_BHZ&_X:+ +MA_]\?'__-SD^_TY15O\;'2+_*B(?^@C8'_8%!&_SDM)O]?54O_D(1__[6HI_\F +M'B'_)AP?_S4P,O\N+"[_85U?_\>^OO\N)27_(QX at _R$?(O\;'2+_-C<^_TU1 +M6?\^1$[_+C(Z_TE/6?]"257_14Y<_T!*5?]&4%O_/DA3_TE37O\A(RC_*2$= +M_ZB8CO^XI9O_:EI7_X5X=_\B&QO_)"(D_R at C(_\T.3__0DA2_["GI_^EH*#_ +M24Y:_TU+3?\X.D+_(2LZ_SA#5/\H,4+_'1TH_RDD*/^AG9O_6%-'_Z>'__^C;___FV_^CE)7_ +M(QD<_R\H*/] -S#_8%92_QH1$?\F'B'_(!H>_R0>(O\>&AS_+2LH_R,;%__" +MLZW_.34S_T)'3/]L<'+_-BXL_RXB(_\Q)2C_,RHD_R0=%_\Q*"'_DXB!_SDP +M,/\A'![_'Q<:_RHA(?\P)23_+R8F_R4>'O\8%!+_'!H7_Q40%/\;%AK_)AXA +M_R@?'_\J)B3_14=%_V-L;/]@9&;_(!\E_XIX;O]00CG_*Q\;_T4[,?]U:63_ +MNJVL_RDA)/\F&R+_+R at O_QP>(?\/$A/_44M)_RD@(/\A'![_(!XA_QL=(O\I +M*C'_/$!(_T9,5O\M,3G_6F!J_S]&4O])4F#_35=B_T--6/]"3%?_45MF_R$C +M*/\J(B#_I):-_TH\,_^)?GW_& \/_R0?(?\A'"#_4$='_T)$2?]%2U/_9U]= +M_W)M;?\]0D[_+RTO_S]!2?]%4F7_+#9%_R at H,?]12$C_M+"N_V1;5/^]K)__ +MHX^'_U=84?]H;6G_O[W _S(T.?]/45;_(2,H_S R-_\K+3+_(2,K_RTO-O\Z +M/$'_-C8Y_V1;5/^##__^7> +M_Z"1E?\B&A[_*20F_S(K)?]734G_'!,3_R4=(/\>&!S_'A8:_QL7&?\D)2;_ +M'AD;_[VPJ_\Q+RS_66%E_X*'C/\X,#/_-"@I_R\D(_\Q*"+_'A82_T(Y,O]3 +M2$'_*R(B_R(='_\>%AG_*B$A_RH?'O\K(R'_)1X>_Q0/$?\7$A;_%1 6_Q0/ +M$_\E'2#_*R(B_RLG)?\J+"K_9W!P_VEM;_\?'B7_?&QC_UI.1_\Q)B7_1#LT +M_UQ02__"M;3_+"0G_R8=)/\C'2'_*2("C_ +M("$H_SLZ0/\D(B7_'AH8_T(Z-O]0143_(1T?_R4A(_\B'B#_(Q\A_R8B)/_I +MU-#_HYV;_VQT=O]234__]=_=__KAX/_[XN'__N7D___IXO__Z>+__^KB___K +MYO__Z^;_E8B-_R$8'_\A'"#_*B4 at _TI"0/\5#@[_)!P?_QT7&_\@&!O_'AL: +M_R at D)O]33$S_M*>F_S(P,O]A:&[_2D]5_R\G*_\S*"?_+B0 at _R\E(?\;%1/_ +M+B@@_S\W+?\;$Q'_*20F_QX9&_\K(B+_,28E_RD@(/\H("/_%A 4_QP6'O\3 +M#A3_% \3_R$<'O\E'A[_*B4E_S at Z./]IYMO\Q*2S_)2 B_SLV,?^+ at GO_:5E/_QT1#?\I("#_*B4G +M_S0R-?\7&1[_)"4L_TE-5?]67&;_1$I4_T]48/\Z04W_0DM9_U-:9O]#35C_ +M1E%<_TY79?\B'B?_+"(E_W5K9_\;%A'_)B(D_R >(?\A'"#_'18=_YJ-C/_@ +MV-O_/D%&_V!;5O^8E)+_-3M#_S P,_]+3U?_&A\E_XN)AO^QIZ/_8UI:_ZJD +MG/^:BW[_IYB+_V5E7/\\2DG_*S/8___HW?__Z^#_^^3?___KY___ +MZN;__^WG__WJY/^-?(;_(!<>_QT;'O\?&AS_.30V_Q<3%?\<&!K_'AH<_R,? +M'?]S;FG_M*NE_U!#/O]22DC_*2R_R\G*O\C(!__?75S_R,6%?\E'1O_(ATA_R0< +M'_\H(2'_(1TE_Q at 8(?\A(2K_1TA3_TY17?]-4V/_1DY>_T5-7?\Z0E+_6U]N +M_T]99_]'5F/_3UAF_R1C_\Y.3S_;W!W_U!06?]E:&G_?W]\_X!X=/^\ +MJZ7_GY2-_Y>,A?]D7%C_1TU)_S="0_\J-3;_-#L[_X.)A?])3U'_)20J_S(O +M-?\A(RC_)RTO_R,D+_\Z/#G_Y.'@_RLH+O\A'![_IIN:_R$9'/\?'"+_+BLJ +M_Z.AF?^___HW___ZN+_ +M_^OC__[JXO__Z^/__NOC_WUL=O\>%1S_&!89_Q at 3%?\M*"K_&!06_QH6&/\< +M&!K_65!*_S at O*?\T+BS_03P^_T5 0O\B("/_04E-_U9;8?\H(R7_*R0D_R8? +M'_\L)27_%A 4_QH7%O\<&A7_%1$3_Q82%/\;%QG_)A\?_RXF)/\F'Q__)2 B +M_Q81$_\;%AC_)2 @_RDD)/\F(2'_)B$A_R&R'_ +M3D<[_V]A7O\;%AK_0$5%_QL:&?]G8ES_)B0?_QX?(/\7$A;_(AH>_R$?(O\A +M'B3_(1D<_R(;&_\;%Q__("(J_SD[0_\_14__2E%=_T)+6?\Z0U'_1D]=_U9? +M;?\_3%G_2%5B_TE47_]-5V'_-S8\_R at C)_\@&Q__(!L?_X%Y?/\I(23_'!<9 +M_QL7&?^>F);_KI^D_T-%2O]74DW_D8J*_TA"1O_CU=W_Y=KA_Y&/F/]<5%?_ +MO*RC_[RIG?]]>W3_24Q&_S]$0O\Y1T;_+C(!W_9VID_WEV%AG_'AH<_]S4TO_PW^7_0T5*_V5C7O^"@(+_8%I>_^C6VO_IW=[_V-+: +M_^[@X?^]KJ'_BH)X_TU/3?\X04'_.$='_R\Y/?]%2DK_B9&._S Y.?]!3$W_ +M/T=+_R,B*/^?G*+_,S4Z_RPT-O\Q,CW_75E7_^;8V?]*04C_F)*0_YF4C_^/ +MCHW_C8N(_V1I9_]=9&3_9F5>_^W=T__VW-'__]_5__[CV/__YMW__^;=___E +MW/__Z-___^OC__SHX/_ZYM[__NKB___JXO]:25/_(1@?_QL9'/\=&!K_&!,5 +M_Q41$_\6$A3_%A(4_QT6'?\E'R/_/#_TU36_](2U;_ +M/SD]_R<@(/\B&QO_*"$A_Q42$?\3$13_&!89_Q(0$O\3#Q'_'1D;_R4>'O\R +M*BC_*2$?_S H)O\J(B#_+"0B_R@@'/\O)R/_+B8B_RHB'O\J(R/_(R$C_UIC +M8_]C:FK_)2(H_S I'?^8BH?_-3 T_W5P:O]%0C?_(QL7_QP-$O\B&AW_(1L9 +M_R<<&_\A'1O_'QH>_R,;'O\E'A[_)2$I_S0V/O\T.D+_0TM5_SU'4O\U/TG_ +M0$I4_T]98_\X0DS_,3M)_SX^3?^KH:O_I)ZB_SLV.O\F(27_(1P at _QP7&_]2 +M0T?_,B,G_R(8&_\/#0__J9Z=_^/2V/];76+_7%I5_W%V=O]A7&#_Y-+4_^/9 +MU?_HX.3_NJVH_XA^YMW__N3;___GWO__ZN+_^^??__[JXO_]Z>'__^CA + +end diff --git a/lib-python/2.2/test/testimgr.uue b/lib-python/2.2/test/testimgr.uue new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/testimgr.uue @@ -0,0 +1,1170 @@ +begin 755 test.rawimg.rev +M_UI)4_\A&!__&QD<_QT8&O\8$Q7_%1$3_Q82%/\6$A3_'18=_R4?(_\\-S?_ +M14(]_QP4&/\:%A[_35-;_TA+5O\_.3W_)R @_R(;&_\H(2'_%1(1_Q,1%/\8 +M%AG_$A 2_Q,/$?\=&1O_)1X>_S(J*/\I(1__,"@F_RHB(/\L)"+_*" <_R\G +M(_\N)B+_*B(>_RHC(_\C(2/_6F-C_V-J:O\E(BC_,"D=_YB*A_\U,#3_=7!J +M_T5"-_\C&Q?_' T2_R(:'?\A&QG_)QP;_R$=&_\?&A[_(QL>_R4>'O\E(2G_ +M-#8^_S0Z0O]#2U7_/4=2_S4_2?] 2E3_3UEC_SA"3/\Q.TG_/CY-_ZNAJ_^D +MGJ+_.S8Z_R8A)?\A'"#_'!<;_U)#1_\R(R?_(A@;_P\-#_^IGIW_X]+8_UM= +M8O]<6E7_<79V_V%<8/_DTM3_X]G5_^C at Y/^ZK:C_B'YP_TQ12_\Z/S__/T=) +M_R$O,O]15ES_B(R*_S8\./]#2TW_.D9*_SI"1O\?'B3_V-7;_S8X/?\N-CC_ +M+S [_UU95__IU]G_74M-_^#1R_^>E(G_7V!9_UU<5?]875W_5F)A_V]N9__L +MW]3_]]_6__W=U?_[W]?__.+9___FW?_^Y-O__^?>___JXO_[Y]___NKB__WI +MX?__Z.'_;EUG_R$8'_\3$13_&106_R ;'?\5$1/_&A88_QH6&/\D'!K_*!\? +M_T,^/O\]/#O_0SU!_QX;(?])4%;_3E):_S8P-/\I(B+_*R0D_RHC(_\6$A3_ +M%1,5_Q,1$_\4$A3_$@X0_R <'O\C'!S_-"PJ_R8?'_\I(B+_)!T=_R at A(?\I +M(R'_*2,A_RDC(?\L)B3_*B(E_RXL+O]B:VO_96QL_R =(_\[-"C_AGAU_Q at 3 +M%_\7%Q3_7UU8_UI84?\C'!S_&A@;_R(=(?\C&Q__(!L?_R(=(_\@&!O_*2(B +M_R4A*?\D)B[_+C0\_SM#3?\\1E'_0DQ7_TI47_]$3EG_1U%<_SY(5O]!2%3_ +M7EYG_Y&3F/]!/T+_(ATA_RDD*/\E("3_3T-&_R at 9'?\>%AG_'AH<_]S4TO_P +MW^7_0T5*_V5C7O^"@(+_8%I>_^C6VO_IW=[_V-+:_^[@X?^]KJ'_BH)X_TU/ +M3?\X04'_.$='_R\Y/?]%2DK_B9&._S Y.?]!3$W_/T=+_R,B*/^?G*+_,S4Z +M_RPT-O\Q,CW_75E7_^;8V?]*04C_F)*0_YF4C_^/CHW_C8N(_V1I9_]=9&3_ +M9F5>_^W=T__VW-'__]_5__[CV/__YMW__^;=___EW/__Z-___^OC__SHX/_Z +MYM[__NKB___JXO]];';_'A4<_Q at 6&?\8$Q7_+2 at J_Q@4%O\:%AC_'!@:_UE0 +M2O\X+RG_-"XL_T$\/O]%0$+_(B C_T%)3?]66V'_*",E_RLD)/\F'Q__+"4E +M_Q80%/\:%Q;_'!H5_Q41$_\6$A3_&Q<9_R8?'_\N)B3_)A\?_R4@(O\6$1/_ +M&Q88_R4@(/\I)"3_)B$A_R8A(?\G'R+_)B0F_V=P'R#_%Q(6_R(:'O\A'R+_(1XD_R$9 +M'/\B&QO_&Q7S_*2$D_QP7&?\;%QG_ +MGIB6_ZZ?I/]#14K_5U)-_Y&*BO](0D;_X]7=_^7:X?^1CYC_7%17_[RLH_^\ +MJ9W_?7MT_TE,1O\_1$+_.4=&_RXW-_\Y0D+_CI65_RXU-?\W/3__.3@^_Q at 5 +M&_\Q,SC_-3L]_RHK-O]03DO_W-75_R4F+?\6%QC_-S P_R___HW___ZN+_ +M_^OC__[JXO_^ZN+__^OC_XU\AO\@%Q[_'1L>_Q\:'/\Y-#;_%Q,5_QP8&O\> +M&AS_(Q\=_W-N:?^TJZ7_4$,^_U)*2/\I)RG_1$Q._T-(3?\P*RW_*B,C_R8? +M'_\I(B+_&!(6_R,@&_\E)1C_%A(0_R,>(O\>&AS_*R0D_RPD(O\G(B3_)R(F +M_Q81%?\5$!3_%! 2_QP8&O\D("+_)" B_RHB)?\M*RW_:'%Q_UUD9/\>&R'_ +M5D]#_W)D8?\B'2'_.#XZ_R,>&/_$M[+_+R&AS_&Q<9 +M_Q<2%/^ZMK3_WM'6_T5$2O]:4D[_EY&/_SDY//]O<'?_4%!9_V5H:?]_?WS_ +M@'AT_[RKI?^?E(W_EXR%_V1<6/]'34G_-T)#_RHU-O\T.SO_ at XF%_TE/4?\E +M)"K_,B\U_R$C*/\G+2__(R0O_SH\.?_DX>#_*R at N_R$<'O^FFYK_(1D<_Q\< +M(O\N*RK_HZ&9_YR9E/_6RF_S(P,O]A:&[_2D]5_R\G*_\S +M*"?_+B0 at _R\E(?\;%1/_+B@@_S\W+?\;$Q'_*20F_QX9&_\K(B+_,28E_RD@ +M(/\H("/_%A 4_QP6'O\3#A3_% \3_R$<'O\E'A[_*B4E_S at Z./]IYMO\Q*2S_)2 B_SLV,?^+ at GO_ +M:5E/_QT1#?\I("#_*B4G_S0R-?\7&1[_)"4L_TE-5?]67&;_1$I4_T]48/\Z +M04W_0DM9_U-:9O]#35C_1E%<_TY79?\B'B?_+"(E_W5K9_\;%A'_)B(D_R > +M(?\A'"#_'18=_YJ-C/_ at V-O_/D%&_V!;5O^8E)+_-3M#_S P,_]+3U?_&A\E +M_XN)AO^QIZ/_8UI:_ZJDG/^:BW[_IYB+_V5E7/\\2DG_*S/8___H +MW?__Z^#_^^3?___KY___ZN;__^WG__WJY/^@D97_(AH>_RDD)O\R*R7_5TU) +M_QP3$_\E'2#_'A@<_QX6&O\;%QG_)"4F_QX9&_^]L*O_,2\L_UEA9?^"AXS_ +M.# S_S0H*?\O)"/_,2 at B_QX6$O]".3+_4TA!_RLB(O\B'1__'A89_RHA(?\J +M'Q[_*R,A_R4>'O\4#Q'_%Q(6_Q40%O\4#Q/_)1T at _RLB(O\K)R7_*BPJ_V=P +M(_\6%Q[_0$1,_U%78?\B)B[_ +M3%)<_S]&4O]'4%[_/4=2_T5/6O]$3EG_25->_R +M&1G_)R,E_R,>(O\A'"+_<&%A_XZ)C?]!1DS_75A3_Z.?G?\\04W_+RTO_SH\ +M1/]%3ES_*BLR_V!:6/^HG9S_6U90_\"SJ/^EDH;_CX-Z_T)*1O]36U?_<')P +M_S8W/O].3U;_*"HO_SH\0?\L+C/_'B H_R A*/\[.D#_)"(E_QX:&/]".C;_ +M4$5$_R$='_\E(2/_(AX at _R,?(?\F(B3_Z=30_Z.=F_]L=';_4DU/__7?W?_Z +MX>#_^^+A__[EY/__Z>+__^GB___JXO__Z^;__^OF_Z.4E?\C&1S_+R at H_T W +M,/]@5E+_&A$1_R8>(?\@&A[_)!XB_QX:'/\M*RC_(QL7_\*SK?\Y-3/_0D=, +M_VQP_Q at 4$O\<&A?_%1 4_QL6&O\F'B'_*!\?_RHF)/]% +M1T7_8VQL_V!D9O\@'R7_BGAN_U!".?\K'QO_13LQ_W5I9/^ZK:S_*2$D_R8; +M(O\O*"__'!XA_P\2$_]12TG_*2 @_R$<'O\@'B'_&QTB_RDJ,?\\0$C_1DQ6 +M_RTQ.?]:8&K_/T92_TE28/]-5V+_0TU8_T),5_]16V;_(2,H_RHB(/^DEHW_ +M2CPS_XE^??\8#P__)!\A_R$<(/]01T?_0D1)_T5+4_]G7UW_(?^@C8'_8%!&_SDM)O]?54O_D(1__[6HI_\F +M'B'_)AP?_S4P,O\N+"[_85U?_\>^OO\N)27_(QX at _R$?(O\;'2+_-C<^_TU1 +M6?\^1$[_+C(Z_TE/6?]"257_14Y<_T!*5?]&4%O_/DA3_TE37O\A(RC_*2$= +M_ZB8CO^XI9O_:EI7_X5X=_\B&QO_)"(D_R at C(_\T.3__0DA2_["GI_^EH*#_ +M24Y:_TU+3?\X.D+_(2LZ_SA#5/\H,4+_'1TH_RDD*/^AG9O_6%-'_Z>'__^C;___FV_^SI)[_ +M)AX:_SDT+O]72CW_<6-:_Q at 2%O\R*2G_)AT=_R at A*?\=&1O_2TQ%_U%(0?_( +MMK/_*!XG_V%D=?]%2%3_.#,S_R<=(/\S)RK_,R at A_RLE'?]N95[_O[2M_S(I +M*?\A'![_'Q<:_RLB(O\Q)B7_*B$A_R4BO]N75?_7%!'_W!F6_^JGIG_ +MLZ6F_R(/]$257_0TI6_T%)4_]#35C_3U)=_TM07/]+563_3%=B_R$D +M)?\M*"/_IY>._[JEF?^ECX?_1#8S_R<=(/\F("3_+BXQ_SQ#2?]'4%?_8V=O +M_Z*BJ_]4763_+BLQ_S4T0?\U.D;_&A at H_SDW1_\J,D+_'" H_R @(_^,B(;_ +M9UM6_XJ.AO^&BX?_?'Q__SZ +MQ_\T.5+_/S]4_U!$7?]94V?_8%QL_VMG=_][9G+_CG9[__SBW___Z-W__^KA +M_Z:1C?\N(A[_/S at R_V111?]V9ES_&A49_T X-O\P*";_*24M_R4C)?]H:%__ +M6U),_[BJI_\P*C+_3E%C_T9(5_\P*RW_*R$D_S0H*?\P)1[_*"(:_XV%>__& +MN[3_+B0G_Q\9'?\?%QK_+",C_RTB(?\L(R/_)B(@_SHY+O]?5E#_)A\?_Q\: +M'/\H(R/_(!P:_RTD)/]35%7_7F=G_V)E9O\@'2/_JIF3_S at K*O]:5%+_<6MC +M_[2JIO^GFYS_)B D_R8C(O]94DS_0STS_W9T;__+OKW_*2 at G_R$:(?\@'"7_ +M.3Y*_T!"1?^"@'C_F(Z*_R =(_]:7&3_2$];_TU79?]!14W_0T92_TQ69/]- +M55__("$B_R\I)_^IG9;_HHR#_ZR6CO^CDY#_*1XC_R0>(O\J+#'_25!6_TM4 +M6_]+55__4%%<_UQE:_^WL[O_03]/_RDO.?^7DYO_(A\E_RLU0/\F+C[_&AXM +M_R$@)O^%@(#_3E)0_S4Z./\9&Q[_.3@^_T%$2?\>'2/_-3(X_R$C*/\H+#3_ +M)2V__^Y]O__^C?__O>W?_#I:?__.#<___G +MWO__YM__MYV at _S$?(?])/3G_=F%5_W]M8_\B'2'_-BXL_S\W-?\D)BW_)"(D +M_WUY_R$9'/\P)R?_+R0C_R\F)O\A'1O_7UY3_XZ%?_\G +M("#_(QX at _Q\:&O\J)B3_+20D_UE:6_]:8V/_:6QM_QX=(_^QI9[_'Q<:_S_["DG_^7G_\>#:__OBU?__Y-G__^7A___CW___ +MY=[__^7<__WDW?^VMA_R0?(_]!.3?_0CHX_R\X +M/O\R-3;_BX)[_WEL9_^^M+#_-C4\_T]29/],2%C_*R,F_RLA)/\O(R3_+"$: +M_RHD'/]X<&;_TL? _S(H*_\@&A[_(1D<_R\F)O\N(R+_+B4E_R_RPH)O\L(R/_8F-D_V)K:_]A9&7_(!X;_[JIF_\E +M'1O_=WAY_Q at 7%O_$O;W_E(:'_R@@'O\F'AK_6U%'_V5<3O]B7E;_N:RK_RLJ +M*?\F'R;_&14>_SA!2/\G)BW_,"HN_R8H)O][C_ZB=EO^XI)S_MZ>D_RTB)_\E'R/_ +M,"\U_TY/5O\D)B[_;&]Z_UU>:?]67V7_55%9_SG%C_UI/2/^O +MI*/_,2PL_QP7'?\L*C/_.4--_RDJ,?]_=G;_)B >_];)SO]*35C_14A3_X=\ +M>_]>6%;_*" >_TQ/6O\Z/$3_'AH<_RLF*/^=DI'_LJ>@_[RJIO^]KJ[_+",C +M_R8B)/\U-CW_5EA at _R B*?\<'B/_C(V4_TI,4_] 04C_9F=R_T9)5/]N<'/_ +MKZ.D_T5#4_\H,#K_:&IM_SHX._\E*#3_)BDU_T!"2O]66%__0T5*_S<]/_\M +M+3#_:65M_S] 1_\P,3S_-3<^_T9*3/\O,3;_?G)N_Z"+B?_1N;;_=6)<_]C* +MTO]83EC_*"$K_R ;(?_IU-+_X<_+_T4^./].1D+_34U*_WU\>__8D_\P*BC_ +M04 __S8Q,_]%2TW_1$A&_Y&(@O^:C(G_CH.(_RPJ.O]$15S_<6U]_RLC)O\M +M(B'_,"4D_QX:&/\>'!?_&A02_\B_O_\G(B3_(AT=_R$:&O\G("#_*R0D_RXG +M)_\M)Q__AX!R_\_#OO\H(2'_(!L;_R8A(?\F(2'_)B0A_UQ at 7O]G;&K_9&-B +M_R(>'/^]J*/_-RTC_YV8DO\].S;_WLW-_V%86/\C(2/_*",E_S8S+O^ >W7_ +M3$1 _ZJBH/\J(R/_(!LA_QD9(O\]1%#_/3Y%_X^'A?]934G_X,[2_T1,5O] +M2%C_+BDO_TI&2/^!>'+_(2$L_S4R/O\H(R7_,2("7_0$-(_TQ06/\[04O_3E!8 +M_VIL;__4Q9?]+3E/_ +M-#H\_QP<'_^>FJ+_1D9/_RPO._\N,#?_,30U_TM*4/^KI*3_V\[-_^G8V/_K +MWMW_XM31_[^MJ?^5A'[_=V1<_^?2S?_MV]?_T\O'_];+RO_3S\W_/T)#_V]Q +M;__JV];_^=[7___DW?__Y=[__^7>___GX/_$N[7_13LW_WIL:?_4OK7_FHJ' +M_RTF)O\_/4#_-B\V_QP='O\\.SK_E)"._[&EH/]P:&S_)R_UYE +M<_]:6F7_&QD4_\*MJ/]'.3#_IIV7_V%?6O_>S&1W_+BLJ +M_S(N+/]W;W+_HIF9_RTF)O\A'"+_'AXG_T%'4?]'1TK_FY&-_[6IHO_:R,K_ +M4EID_T1,8/\?'BO_%AL at _U-,1O]E7V?_*20P_RHB)O\X*2W_K)>5_]G(PO^7 +MA8+_>6IJ_RLB(O\G(R7_+S(W_TY15O\W-SK_AH&#_QP?(/\/%1?_2U%9_T!' +M4_]'2%/_B8N._]O,T/]%0U/_-T%+_R(C)/\X-33_+"\[_SU 3/]"1$S_3$Y5 +M_TM.4_]"2$K_)24H_[&MM?]!04K_+S,[_S8Y/O])2TG_D(N-_R$='_\O*"C_ +M."\O_T(]/?](1DC_:F5E_Y&)A_^IG9G_Z]S6_]7(P_]:4$S_U__^X]S__>3=_\S'N_]<44K_II*._^') +MP/^9B(C_,2DL_S at U._]$/47_)B$A_R ?'O\N+"[_O[:P_XB#@_\\0D3_9G)V +M_V]Q>/\O*BK_,28E_RL@'_\D(![_6UE2_T(Y,__0PK__,"@F_R(;&_\E'A[_ +M,"DI_R at A(?\J(R/_+RDA_Y")>__)O;C_*R0D_R(='?\H(R/_*20D_RLB*?]8 +M8E__("E8_SP\9_\<'AS_O:BC_V)22?^WJJ7_='%L_]W,S/\^-37_(R$C_R@@ +M(_\^.#;_.S0N_V=;7/^4BXO_*R0D_QX9'_\:&B/_/$!(_SPZ//^GFY;_Q[FP +M_]O)S?](4%K_25!>_T]'2_\B(2?_4$4^_X%[?_]"0D__'1L>_R<=(/^FF)7_ +MT<6^_ZJ:E_^VIZ?_,2 at H_R0_]3"O_\I("#_(AT= +M_R0='?\K)"3_+R at H_RXE)?\B'AS_3TU(_\O O_\M)"3_(QP<_RLD)/\M)B;_ +M(14>_U588_\@)%'_-S!?_QX<'__'JZ?_MJO^4CXK_W-'0_S at O+_\D +M'R'_*B(@_UU62/]V:F7_V\S-_X5]@/\H(B;_(!H>_QD9(O\^/T;_.3 at W_[6O +MI__3QL'_V,?-_T--6/]%2U7_?G9T_UE45/_(N;3_B8.+_T]27?\E(R7_+"W5S_]K. +MS_\C)2K_'"$G_U-68O\I)##_(ATA_R(@'?\D(AW_(BFQC_]G-QO_ETLC_@')O_RHA(?]!.3W_24))_VIC7?]G8EW_3T=%_]/$O_]A +M7&#_.3Q'_V-F')B_X1X=/_>S]#_;&9J_R at B)O\F("3_'1LD_SY 1?\\ +M.3C_M:^G_^'3T/_5Q,S_3%5C_T1)5?^$?GS_BH.#_];$P/^*@X__1TA3_RPH +M*O\O*"C_KZ2C_ZN=FO^'=W3_HI:7_R\I+?\K(R'_JI*5_U%)3/_+O\#_O["P +M_[BGK?]886?_2U=@_S]&5/]'3U/_4DU-_]S1UO]35F+_0T]8_X2"A/_4S0_XJ(@_]/4U'_/4)"_W-[??\Z2UG_86!F_UE<4/]03D?_8UM1 +M_]C(OO]Q8ES_W<_,_^;2RO]W:FG_-2TQ_S\X/_]#/47_9V!:_VYG8?^LHI[_ +MWLO%_VUF;O]#1%7_5E=H_T="3O\M)2C_+28F_RLF(?\V,2O_;&A at _\F]MO_4 +MPK__*R(B_R0?'_\F'Q__+28F_RHC(_\M)R7_2D(^_RH@'/_+O[O_*R(B_R0= +M'?\B&QO_*R0D_R47'_\C&Q?_(ALB_RXF*?\@(1K_SK*N_W-R9__#J:;_N+.N +M_]W5T_\V+R__(QX at _S\W-?^5CW__<&1 at _]K+S/]E7V/_*2,G_R,=(?\@'B?_ +M/3]$_T5"0?^UKZ?_V,K'_]' R/]!2EC_5%EE_Y"*B/^@F9G_X]'-_W=P?/]& +M1U+_*",E_RHE)_^LI:7_E(R*_XM^??^_XZ'@?]M;VW_;G9Z_U9HC/](46+_4%I+_TQ, +M2?]33D[_X]/*_V=84__ATM+_Y=#+_VQ at 8?\Q*C'_.3,[_SPX0?^+ at GO_?G5N +M_[ZRK?_ at S,3_349-_SL]3/])2UK_.C8__S H*_\L)27_+RHE_R\J)/^/BX/_ +MS<&Z_]+ O?\N)27_)!\?_RDB(O\J(R/_*"$A_RWMP_\"K +MI__&P;S_V]/1_S0M+?\D'R'_/34S_ZJDE/]5247_Y]C9_TI$2/\I(R?_(AP@ +M_R >)_\M+S3_B(6$_T Z,O_BU-'_R;C _TM48O]$257_E8^-_Z.T]C_0$-/_S]+ +M5/\T,C3_S<;&_SQ!3?]*1T;_8&%B_T-(3?]02T__+3$S_RTM,/^JI*S_045- +M_SM 1?\I,3O_6E)0_]#$Q?^*C8[_?W^"_Y^=IO]676/_+C<^_SL]0O\N)R?_ +M,2 at H_[2GHO\J)2?_(" I_TQ'2?^'A'G_I:29_V=L:/]L='C_8W9^_X:(C?^" +M at G__1T5"_UI54/_HV];_6U%'_^37TO_BSM?_7E)3_S0Q)?\L*";_1#M"_WIN +M9?^.A7?_R;R[_]W)Q?]!/T'_,3$^_T1$4?](1T[_,"HH_RH>'_\S)RC_-RXH +M_YB-AO_8R<3_T\+"_RHB)?\C'B#_)AXA_RTD)/\N)B3_-BTG_VYI8__:R,7_ +MS[Z^_RLF)O\E("#_)!\?_R at C(_\4#Q/_%! 2_Q81%?\8$Q?_,"8B_[*EH/]# +M03K_NK"L_]/'P__V?]04%O_/4!+_R8A(_\G(R7_*24G_U925/]G8F3_4T]1_R,>(O\K)RG_ +M*B8D_T='1/]G6%S_A(&'_]C0T_]88&K_359=_TA/6_]56F#_=&MK_^;9WO]# +M1E+_5%MA_T8^0?_;S]+_0$90_W!S=/]I:&__1TI+_YZ:G/\T-CO_+2PR_Z:B +MJ_\V.43_+S(W_RXT/O^?DI'_L9^A_VM?6O]<5U'_:&EC_VYJ8O]]:V?_P[*X +M_];,R/_1O[S_=F%?_ZJAH?\D(RG_/S<[_R8D(?^+CHC_9VQJ_U%57?]Q<&__ +M?GQW_U=95O]044O_4U%)_^;%UO]N2&G_W+78__OBW?]52$W_*2(L_RDF,O\U +M-4#_>G-G_Y6-??_+O[K_Y-#,_T=$2O\S,T#_.#=$_U957/\I(1__,B8G_S,G +M*/\T*B;_D85^_]G*Q?_%MK;_*R,F_R(='_\E'2#_+B4E_RL@'_\V*B7_ at H!Y +M_]+ O?_2P<'_*20D_R4@(/\F(2'_(AT=_QP7&_\6$17_%Q(6_QL6&O]%-3+_ +MIYN6_TY+1O^FH)[_W<_,_]?,R_\P+2S_)B$C_S(N+/_$MJ?_54U)_^+9V?\Z +M-37_)B(D_QH8&_\C)C'_0D51_Z:7D?]21$'_X=/4_[>LL_\\2%'_5EMA_YF3 +MD?^0B8G_Z=S7_T9&4?\X.T;_)R,E_R_]P8UC_VM+0_U-79O\M-3__14Q8_UI<8_]]='3_ +MZ=K?_T5(5/]/45C_8%99_][/U/]$1U+_CI.3_W1R>_]%2$G_R<3$_S0S.O\L +M*S+_FIBA_S,T/_\X.T#_)"HT_ZN>G?^NFIS_CGUW_W!D7?]".S7_DH1[_WMH +M8/_+O\C_03]!_S at S+O]F6UK_/CPY_RHL*O\V-#;_(!TC_S8W./]T>';_:FUR +M_YF6E?]H9F/_<'5Q_U164_]454__Z+O?_XA.H/^F9-'_QYS2_UQ(4?\U&3/_ +M1S [_S4N*/^)?7G_FHF4_]3(Q/_MVM3_4T]7_S'O\J)27_)R(F_QH5&?\A'"#_'!<; +M_U1$0?^6BH7_8V!;_ZFCH?_;S5E+_ +MY-O;_SPW-_\G(R7_'1L>_T!#3O\[/DK_L*&;_U]13O_DUM?_K:&J_T)-6/]3 +M5U__7E=7_X%Z>O_DU]+_3T]:_RTP._\D("+_)2$C_R,?(?\D("+_(AX at _R,? +M(?\F(B3_(1T?_RLC(?\S,2S_74Y._ZB>FO_7S\W_3U-B_RLS/?] 1U/_7%YE +M_X^&AO_FU]S_24Q8_U)46_]C65S_VLO0_SH]2/]^@X/_85]H_TE,3?_>V=G_ +M+RXU_R\N-?^4DIO_/#U(_SU 1?\N-#[_MJFH_\"LKO^JD8K_HHA]_ZJ4C/^Y +MGY3_CG]R_\K#S_\P,S[_(R8G_XU_@/^3 at 7W_WLO%_TH\/?\<%A[_(1\B_UQ> +M6_]K;VW_='%P_W]^??]W?'K_9VMI_UU at 8?_>V\__+2HI_S N-_\X/CK_?WZ+ +M_V9#BO^C>Z__12Q+_ZJ*O?][6)C_T\+,_^S:T/]*1D__/CY+_U-27_\]/$/_ +M*R,A_R\C)/\P)"7_/C0P_W)F7__7R,/_K)V=_RLC)O\@&QW_)Q\B_S,J*O\O +M)"/_,24 at _XF'@/_=R\C_TL'!_R8A(?\D'Q__*",C_RLF)O\H(R?_*20H_R8A +M)?\?&A[__]Z=W+_IZ&?_^'3T/_*O[[_+RPK_R4@(O\L*";_Q+:G +M_W5M:?_GWM[_.C4U_RBEO_$J)K_ +MNYZ2_\&EE_^;BGK_U,C7_RXN0?\A(RO_.34W_XU\=O_:P[?_034V_RO\H/RS_("PK_S$Z,_\W1#G_*#0]_S]"5/_*PL7_Y]C2_SL[1/\\0$__2TE9 +M_T9"2O\N)"?_+2,F_R<>'O\P*BC_8UQ6_][0S?^IF)C_)B,B_R$>'?\G("#_ +M+B4E_RXB(_\Q)"/_1$4__]?(R/_,N[O_*",C_R4@(/\D'Q__)B$A_RXG)_\K +M*2O_.C\__Q\:'O]O7U;_?V]L_Y&(@O^DGYK_Z-G:_[JNK_\M*BG_(QX>_R0E +M'O^OJ:'_DX>#_^+5U/\^.3G_(Q\A_R,@)O]$1U+_1$A*_[RLJ?^3 at H+_Y]C8 +M_X-]B_\W2%;_7V)M_YR4F/_:SLG_YM36_S8W0O\N,#?_*"0F_R(/\B'B#_(1T?_R,?(?\H'1S_1T-%_U%05O_ N<#_ZMGC_UU69_\] +M0E3_0DE;_WUV@/^UJ;+_Y]WL_U129?]A87#_C(*+_^#3V/\\/T3_CI"._U!. +M5_]"14;_SLO*_R at I,/\K*C#_B8B._S,T/_\N,#C_+C8Z_\2XN?_FUMK_T<&X +M_].YK/_7MZ__S+"L_YF-AO_9Q-?_(S% _R4A*?\F*S'_>'AU_YV8DO^0BXO_ +M@'M[_XB!>_]G8%K_7%UD_Y60E/\H*BW_-T-'_SM$1/]F:VO_O\3*_SY(-_\V +M0C/_+T P_TQC4/\Y5$/_#"D7_SY?3?\S3CW_/%I*_YBMH?_9TWC_U\K)_\BWM_\H(R/_)2 @_R_WMP9?]H65G_LJNE_YN9E/_DU=G_MZNL_S,P+_\G +M(B+_(2(;_ZZIH_^MGYS_Y=C7_S,N+O\E(2/_)" H_SD\1_\Y/C[_P*VM_Z>6 +MEO_NW]__8UUK_SA)5O]#1T__JZ"E_^'4S__FT=;_/3U*_R B*?\H(R7_)B(D +M_R4A(_\B'B#_(AX at _R(>(/\B'B#_(AX at _R,;%_]14$__/$5,_XB*D?^+B8O_ +M24]1_SM'3/] 2%+_>'I__T9'3O\H+CC_'"4S_TQ55?]Y>GO_Q\')_SD^2O^+ +MB8O_3TM4_T)%1O_)QL7_+S W_RDI+/^8F9K_/#Y&_S'A/_:S(/\>&AS_*R,A_TE+3O]&4EO_6F5L +M_T1/6O\Y0T[_*C$__S(Q3O\P)V/_-"IO_S\V?/];49K_&!5)_V5?B_]!/5W_ +M.4%+_Y64D_]85%W_3$]0_]G6U?\P,C?_,#$R_TE+2?\P,CG_,3(]_R&IA_W9K9/^2 at 8'_1CU$_R,D*_\^/#__MJNJ +M_]W.YO\G*S/_.TE8_R'?\G("#_+R8F_RTA(O\U*"?_CHZ+_][1T/^SHJ+_*20D_R0? +M'_\H(R/_*B4E_S at P+O]E9V7_8FEI_R(=(?^9C('_P[*R_X-\=O]I9V+_Y=;: +M_ZVAHO\I)B7_)2 @_S at S+?^]M*[_U,C$_^3_R <'O\A'1__(AX at _QX:'/\U)RC_2T9,_U5@ +M:_]16V7_1TU=_R at H-_]@76__6S_B'UV_Y&"@_]+1$O_(R4L_S4U +M./^AG)S_S+S8_RDJ,?\4'R;_&QTD_R(B+?\E*C;_/$1._Q,:(/\E)"K_*RHP +M_SDV//\?&!C_/3E"_SL[2O]*2EG_4U!6_RLC(?\X+"W_*AXA_RLD'O^7BX+_ +MV,S%_UE.3?\J)BC_(!L=_RHC(_\J(R/_*"$A_S F(O^)BH3_WM'0_Z22E/\H +M("/_)Q\B_RHC(_\K)2/_+RDG_VUN;_]@96K_)B$C_Z21A?_ K:7_Q[NT_\6Y +ML/_(N[;_JJ.C_R at E*_\E(R;_1C at U_[>PJO_?T-#_ZMO<_S0Q,/\D("+_'AHB +M_S7O_>GU^_W5[??]H96O_KJ.H__/AWO_8S=3_ +M24Y:_QD:(?\H(B#_)A\?_R8A(?\A'1__'!P?_R >(?\A'R'_'AL:_T8W-_]! +M.T/_1T]?_U9;9_],3E7_#0,,_RL4'_\R(2?_%0H7_R$4'_\G%Q__&0T6_R$: +M(O\8"QC_)A at G_R :(O^6BHO_1$)+_T=(2?_1T,__+"XQ_TQ.3/\9'!W_("4J +M_SQ!1_\I+C/_2$-'_][6V?^)>&O_P:NB_^G3R_^8A';_?W1I_]>[S_\<+CC_ +M+"4L_R8Q//^1D(__*28E_S8P-/\I(RO_1S\[_YN+>_^1AG__D8.$_TE$2O\B +M)3#_(R,F_ZZLKO_:P^#_)1PC_Q at 1&/\A$!K_(1HA_QL;)/\B*##_+3 [_R4D +M*O\N+33_55%9_];,S_]".T7_.SM*_U-38/]33E3_,"@F_R$5&/\L("'_3D4_ +M_[^SK/_'O\I(B+_,RDE_XF*A/_>T=#_ +MH(Z0_R@@(_\G'R+_*"$A_RPF)/\P+"K_7U]B_UUB9_\E("+_L**9_V584_^F +MGIS_IIR8_\.WL/^>EI3_*",E_RHB)?]72$C_E)*/_][2U?_BT]C_+RXM_R0@ +M(O\B'B;_-SI%_SU 0?^\M++_VLO+_^+>W/]56E3_-3,U_V!98/^CF)W_[=?8 +M_\[%S/\\04W_'!LB_V):6/]53TW_&A45_R,?(?\A'R'_'!H<_Q\='_\?'1__ +M6$U,_TA)4/]&4V3_04A6_R<=,/\]*RW_JY*!_W9:5_]:/3S_F'5N_X5A5_^$ +M8E__*Q at 2_Y:!?_^GD9/_% 8#_S]_\;!V?\R-3K_'" H_Q,2'_\;%QG_$Q,6_Q87'O\< +M%R/_'!<=_Q(.%O\J)"S_T,3'_U-,5O] 0$__04%._U!+4?\L(B7_*Q\B_TQ! +M0/\W+"O_6$U,_Y>/C?\T+2W_)!\A_R8?'_\K)"3_*R0D_R at A(?\R*"3_B8J$ +M_^'4T_^+>7O_(QL>_R4=(/\K)"3_+2 +M_R =(_]Z*/\?)37_Q[^]_RTH*O]$/T7_+2DQ_S at Q,?^?E8O_A81] +M_XV*B?]F9F__*BT^_T5!2?_$O'RK_ +M&ALF_R0=)_\8$1C_&1,;_RXG+__DU=G_1T!*_ST]3/\V-D/_3TI0_RH>)_\I +M'"'_+2,?_R\C)/\:%!C_(AP at _R(='_\J(B7_)R @_RDB(O\K)"3_*2(B_S0J +M)O]E9F#_X-/2_X%O$!G_'Q8=_QL9,_]75X#_4E)Y_P\/'O\E("#_+C0\_T-!0__;TM+_ +M*BDP_RXM-/\V.$#_*RXY_R8J,O\A)"G_*RDL_SHU-_^_L*K_UL.]_^W8UO^> +MBX/_A8!T_]C S_] 3E?_+ATC_W9VA?_6Q\?_.# S_V]L'O\H +M(2'_,"@D_Y&(@O_7R,/_:EY:_R_]34T?^]P[__ +MJ[&S_]31U__LV]O_\MS4_[FUM_\_4%;_%20D_W=X>?^ZK:C_75-6_QX<'_\= +M'!O_D(J(_T4Y-?\C'B+_I9F4_X)Y>?\O,3G_,C0\_RTU1?\Z15;_" \C_R4= +M./]J9)[_44Z0_S at XW7_Y-?6_^/.S/^PGY__N[*R_R_R4>'O\B&QO_,"HN_QD4&/\5$!3_%Q(6_QH2%?\B&QO_ +M*R0D_RLD)/\V,3'_)1T at _WYR=?]A65S_)!\C_R$<(/\K(R;_+R8F_R_R(<(/\?&1W_(QTA_Q at 3 +M%_\<%QO_'1H9_U123_^/BHS_3TI._Q\>)?\]04G_5UQ8_\#"Q?_3T>'_O+?) +M_R,<+?])0U'_U<[8_^K=W/_JUMC_IYRI_TI"5O\\(S3_=VYU_\.TKO]+0$7_ +M(1XD_VQK:O\P*R;_FXZ-_RDC)_^XK:;_*!X:_VEH;_]$1DW_&Q\G_S= 3O]& +M3V#_/T)._Q -&O\) !+_(A&R'_'!D?_QT:(/\H(RG_*R8J_RLC)O\M)"3_ +M)",B_V=E8/]F85O_*!T<_[*GKO]S;77_)B7%[_ +M-#8]_SQ'4O\\2U'_'RD?_T5(0O^5E)O_*2\Y_UQ?9/\;("7_+C9 _Q at B,/\] +M1DS_-#H\_T!"1?\9%QK_%QD>_RTP-?\I+#'_+C$V_R$F+/\B)2K_+C S_SDZ +M._^^M*G_K9F1_^++QO^,>G#_F(A^_\"TK?]_T>/_ +M*" J_R ;'_\A'27_(ATC_QL6&O\?&A[_*",G_QL8'O\9%1?_I9Z>_]K/UO]# +M0T[_/#Q+_T Z2/\Q*C'_)R @_R,<'/\K)"3_)A\?_RPC(_\U+"S_."\O_S G +M)_\R*RO_*R0D_R<@(/\K)"3_*R,G_Q40%/\5%1C_&Q49_QP5'/\<%QO_(!@; +M_RLB(O\C(2/_?\H(R/_Q;FP_YN1C?_(Q\[_3$Y5 +M_Q84%O]_ at 8C_0TU;_SI&5?\=+"C_3$Y3_X^*G/\H,D;_'R,E_TI+3/\>("C_ +M*"L\_SL]1/\T.#K_0DA*_SM!0_\N,3;_+C$V_RDL,?\J+3+_)BLQ_R at K,/\T +M-CG_)"4F_\*XK?^WHYO_X,G$_XMY;_^@C87_NZNH_V-;6?]32T'_YM30_^+- +MR_^6BXK_-3HZ_S,X/?\A'AW_D(J"_WMY_S(J)O\R)R;_+R0C_RXC(O\I(B+_*B4E_QP7%_\7$A+_'1@:_QT8 +M&O\=&!C_*R8F_QT6'?^%>G/_=FE<_TO]7D:?_2(BG_S!PC_\Z +M9HC_*C!&_W!:6_\W(B?_)"$G_[:OJ?_0N;K_8519_R\M+__-P;C_:FMV_]K1 +MT?]!2UK_4$Y1_\"^P/]&4%__/DI9_Q_RTH*/\U +M,##_'AD9_RTH*/\D'Q__)"(D_XM^>?]%-SC_)C15_Q(>._\8&2K_%A,?_Q85 +M(O\>'2K_&AHE_QX>*?\8&"/_%!,:_S(Q./\?'B7_(!\F_QX<'_\>'!__'!H= +M_R_R at I.O\D +M)SC_-#@Z_TA&2/_AT^__*RTU_TA17_\N,#__&ATH_R8J.?\=(3#_$!0C_U=0 +M6O]I:V[_OK"Q_\2YP/]E96[_3E!8_T9)3O\J)2?_)1X>_R$:&O\C'!S_(QP< +M_R at A(?\A&AK_*2(B_RXG)_\Q*BK_)A\?_RHC(_\M)B;_*B4E_R_Q at 5(?\3$!S_&!4A_QT:)O\:%R3_'QPI_QD6(_\@'2K_-#([_RDH +M+_](1T[_'QXE_QX<'_\3$13_#PT0_PL)#/\7$AC_0C@[_QX4$/\8&A?_%A<0 +M_S8U+O\A.#/_35]C_S]!2/_7R,/_,B +M__CAW/_YXMW_]-C:_VUK;?\F)BG_.#4P_Y.2D?\E(R7_(B B_R$?(?]34EG_ +M+B] _R0G./\V.CS_3TU/_^31Y_\I)BS_,#9 _S8S/_\C(RS_$Q0?_Q,4'_\[ +M/$?_*R0L_RXL+O\_-#/_6E)6_UE97/\T-SC_+3(R_R8E)/\B'1__)2 B_R(= +M'_\E("+_+"0G_R0<'_\I(23_*R,F_RDD)O\C'B#_*",E_R8A(_\F(2'_(1P< +M_R0?'_\D'Q__&A45_R(='?\G(B+_)!\?_R(:'O\C'!S_(1\B_Q at A,O\0%RG_ +M'AXG_RPI+_\@("G_'ALG_Q81'?\7$A[_%Q(>_Q84'?\9%R#_'1LD_Q\=)O\: +M&B/_%Q<@_QP<)?\S,SS_5U1:_RHH*_\0#A'_&A@;_V!@7?]X>G?_/#] _Q47 +M&O\>("7_0T!&_QDF)_]96U[_Q;*R__+5T?\W)R__(R,F_XF+ at O_+M[G_-2HO +M_S$O,?_.PKG_;W6%_\S!P/\[2%G_D(Z1_\K%Q?\T/DW_+SM*_WE^?O_;UM'_ +M;6]^_S)"5?\M.SK_5%)+_U)17O\R/$K_&1T?_Q49&_\R-CC_.CY _SH_1?\] +M/T+_3$Y1_S T//\E*S7_(20I_VMH9_^[L+7_T\C'_\W#O__4RL;_W-+._^79 +MU?_HVM?_Y=?4_^K'S#_)"(/\C'B#_'1@:_R,<%O\<'B/_*",I +M_QX:(O\='2;_'1TF_QP=*/\L*S+_,C$W_R ?)?\8%QW_&A<=_QH7'?\9%AS_ +M%Q0:_Q<7&O\='"+_)B4L_QT:)O\7%AS_7EYA_S P,_],3$__+BHL_QT@(?\Z +M0D3_&1L>_Q47'_\<'"7_$Q87_V-?7?_$O;?_ZMK7_RHF*/\G(1__LJ:?_^/+ +MSO\P*"S_,"PN_\.WL_]N=W#_N[6Y_S]27/^0D9+_PL3)_S<]3?\Y057_>H&' +M_]3,RO]H:'?_/$95_SQ"1/]T;&C_3$M8_RXY1/\1&Q+_(B0I_S at Z/?\5&AK_ +M)BLP_SD\0?])2$__,C8^_S0U0/\@)2K_JZ*B_\:WO/^LFY7_JI2+_ZB3A_^? +MBWW_EXA[_Y>%>_][:&#_BGQS_^?2S?]C8V#_JZNN_TI%1?](14O_(!L?_X)_ +M?O]I96?_9%]C_UU=;/\C)SW_/#U$_Y60EO_IW.?_&Q$:_R8?)O\@&Q__(ATC +M_R0?)?\G)"K_+2HP_Q at 3%_\=&1O_%Q,5_Q41$_\7$!#_'!<=_ST\0_\D'B+_ +M0C(Z_S$@)O\A%1;_)AL at _QP3&O\=%QO_34=+_QH4&/\7$17_'!8:_RHD*/\< +M%AK_'A,8_Q0,$/\<%AK_%Q(6_Q81$_\=&!K_)R(D_Q\:'/\;&1S_'AH8_Q(: +M*O\6'3'_%QO^[L;O_0%1B_Y.(C_^^O +M)_\?'2;_&A at A_Q(0&?\1$!?_$A$8_Q,2&/\4$QG_(2,F_QX@(_\Z/#__.CP_ +M_Q0:'/\W.3S_4$M/_Y2)CO]K9&O_ at GV#_T) 0_]C86/_I:. at _^G:V_\K)2G_ +M+BXK_\W!O/_RVMW_)AXB_RDD)O^PH*C_P,"]_[JIN?\S3%W_9G5[_V^$D/]N +MAIG_67B*_W*0IO]OD)S_8HV?_R@\2O^"A(?_V-#,_TY-6O\Y1$__7%Y5_SH[ +M0O\S-SG_=D/^SF8O_PZJ9_\2JE?_-KYK_PZ22_\FPG__ at R<3_='5V_ZFJL?]?6E[_ +M9F)J_R4@)/^5DY#_C(B*_V5 at 8O]U=83_+3!)_S P.?^OJ*C_Y]3D_R,=*_\P +M.DC_&R R_R$F./\8&RS_%14 at _QL6'/\9%1?_'!@:_R_R,E +M*/\F*"O_("@J_RHN,/\M+3#_*R\Q_RDJ*_\O+S+_'B(D_T-(3?]%2DC_T+_% +M_R\F+?\H*2K_KJ*=__7=X/\I(27_+"\ +MP?^GDXO_O:.6_["6B/_!J)?_R+&?_\VRH?_!I9?_R;*F_]O'P_]:7%__KK"X +M_UA56_]U<7G_)R(F_YN9EO^/BXW_75A:_VMK>O\I+$7_-#0]_VA=8O_8T-[_ +M$Q8G_SE'7/\1'CO_04QE_R at O1?\;'2S_'!PG_R$:(O\M)BW_,"LQ_S,Q-/\T +M+S/_/T%&_S8X0/\Z.#O_V,G)_\R]M_]Y;F/_>6UH_QH5%_]@6U__44Q0_Q<2 +M%O\B'"#_)1\C_TY(3/]:5%C_@'I^_S J+O\6$!3_-S$U_QD7&?\<&!K_(AT? +M_Q\='_\4$!+_+BDC_SU%3_\4"AG_$Q$4_Q,0(O\A)"__("$H_QP<)?\7%R#_ +M'!PE_QH:(_\B(BO_&QLD_Q84'?\7$QS_%1(>_Q04(?\5&2'_2$E*_TE+2?\J +M+2[_'!\@_QH='O\8&A__&!<>_QH6'O\>'R;_)B4K_S at Z/?\<(2'_.CL\_[RY +MM/_GU=G_)B H_RXR,/_"MK'_]=W at _RHB)O\O*BK_LZRL_]C+RO^BG:'_5VMO +M_YNBKO^7F:'_)R8L_QX=(_\B)B[_969M_[&VPO]&76G_ at HN1_]O5T_]#1E+_ +M.D12_[.NJ?]#14S_.SX__[Z\O_\Q-CS_.SU%_T ^1_\G*S/_+C X_R4M+_^! +M>7?_NZ^R_]S*QO_>R\7_WLW'_]W)P?_BR<+_T+NV_]C$P/_1NK7_W\G+_U-6 +M6_^EJ*W_5U)8_XJ&CO\E("3_HI^>_YN6FO]E8&3_<&Y^_R&!S_)R$E_R8@)/\B'"#_%0X._YZ1 +MD/\S)"3_)!D8_R<9&O].1T'_.$-._QH3)/\4%1;_%Q0G_RDL-_\Q,S;_)"0O +M_QT=*/\A(2S_'!PG_Q06'O\0$!G_$Q$:_Q,/&/\6$R#_%QHE_R at M,_\\.CW_ +M/STZ_ST[-O\].S;_/STX_S$O,?\>'!__&A@;_QP:'?\<&AW_%Q<:_Q@;'/^+ +MAX7_T,C$_^G7V_\I)BS_-3,N_]3'PO_OU]S_+B8J_S$L+/^VL;'_Z=G=_YB8 +MF_]89FG_G*2N_Q,6&_].3DO_>WUZ_U=86?\K+3#_*3,W_SA'3/^#B(W_V]73 +M_T!$4_\Y0U'_BX:!_SY#2?]&24K_R\G,_S$X/O]"14K_/CU$_RDL-_\U-S__ +M*# R_\&VM?^^K[/_T]'._T-#0/]!1T/_6EI7_\S*Q_]/44[_6%U9_UM=6O_0 +MO\7_2DU2_[2WO/]J96O_G):>_R8A)?^FHZ+_G9B>_VIE:?]U<8'_*2I#_S(T +M//^)A(C_XMCA_R at C)_\>(![_,S$L_S&_\_/SS_0T- _R0B)/\?(1__ +M/T1 _V=D7__-R,/_ZMO at _R:_TM56?\6&!__)R at I_VUL9?]+3T?_8F-<_RHK)?]?9&#_45E6_XJ. +MD/_AV]G_/T-2_SQ&5/^ZM;#_049,_T!#1/_+RG[_ +M'A@<_R\J)/^IGY7_CX%X_VMC6?]Q8%K_DHV(_T!39?\A&2?_&1D<_R,A-/\@ +M(2C_9F%;_Q82&O\?'RK_%A8A_QX>*?\G*C;_+3 \_Q04(?\4$R#_%QDN_Q\A +M*?^'A(/_%A@=_QD8'O\G)2C_,"XQ_QT;'O\>'1S_+2PK_S0S,O]"04#_+BTL +M_RLM*O]X?7?_H)Z7_XZ(AO_ at U=K_&QP=_VU<3__=R,/_[=7:_S$I+?]!/#S_ +MM;>U_^+8V_^&A(?_,CH^_QT;)/]J9&C_:&5 at _U%64/]I9V+_1$$\_V-?7?\E +M(B'_B8F,_^/=V_\\0$__/$94_[>RK?]!1DS_/4!!_Z">H?\P.C?_0$9"_TE( +M3O\V.43_*2HU_R(J+/_$N;C_Q+6Y_]G-R/]-1#W_03LS_U)'0/_DT]/_7%)( +M_V=D4_]72D7_U<#&_T1'3/^!A(G_=G%W_UA26O]54%3_'1H9_QT8'O]O:F[_ +M<6U]_R at I0O\L+C;_:6QM__G8]_\6$17_(1$5_QT/&/\4$A7_%1 4_Q at 3%_\7 +M$AC_#@D-_S4P-/]&1$?_4$U3_T9'4O]6663_3$=-_\:UK__GTL[_C']^_QL9 +M&_\5&!G_%1,5_Q at 4%O\:%AC_%A(4_Q$+#_\." S_(!H>_QL5&?\4#Q/_(!L? +M_Q0/$_\>&1W_/SXS_[VTIO_ LJG_O+:N_\>_N_^JFX[_2%MY_U-05O\:'Q__ +M*R9*_QP>(?]85D?_'A at F_Q\=)O\9%QK_%!0=_R4L,O\3%B+_# T4_QH:)_\, +M&D'_1D91_\"YL_\F*";_'AD=_Q81%?\6%AG_$A46_R4F'_]64T[_(Q\A_R$C +M(?\D*27_/T1"_Q\C(?]345/_;FQI_XJ)B/\='QW_BWAN_\BTL/_6Q\O_(QTA +M_UI44O_#O;O_XMK=_X%^A/\H*C'_(!LA_W%E8?]^&AS_(!P> +M_W5S=O^ ?XS_+"T^_S$S./^PJZ__^-?H_Q@:&/\6$AO_& X7_Q02%/\5$!3_ +M$PX2_Q at 3%_\Y-SK_/SU _TI(2_]%0T;_0$))_T-%3?]'0DC_T+^Y_^W7S_^$ +M=7;_(!@<_QP7&?\7$Q7_&!06_R\K+?],2$K_6U59_TQ&2O\4#A+_(QTA_S$L +M,/] .S__&A49_Q0/$_^ZKZC_Q;&I_Z")A/^ ;&C_:V-F_[BFF/\S1F3_&!D: +M_Q(7'/\C)E#_%1@=_UQ82?\:&"O_'1TH_QH8&O\6&"#_(RPR_Q86)?\4%A[_ +M&!PQ_R(Z:_^4EZC_I)N;_T,^0O\<%AK_03Q _QH8&O\;'1K_2DA _Z&>F?\: +M%AC_+"LJ_T! /?\R+R[_$P\1_QH5&?\>&QK_*"PJ_VEI9O]B4DG_MZJE_\*Z +MOO\E("3_9U]=_Y^7D__BWMS_<7-Q_TM/4?\V.#W_7UI5_V)64?]/35#_6%)6 +M_TU-0O]+2DG_&1P=_W5^?O_=V=O_/$!5_RHT0_^_M[/_1$E/_S@].__/R\G_ +M*2LR_ST^1?] 0$G_*RXY_R8L-/\9)"7_P;:U_\*RMO_CU,[_=5U4_U!&._]; +M44/_Z]3/_W]L8/^+ at G'_9F!8_]3"QO]!0TK_.CY&_T5$2O]^?'[_(Q\A_Q\; +M'?\B'B#_:6=J_Q at 8(_\5%R;_3$Q/_[*ML?__[>#_+!\._Q\<(O\=&B#_(1X= +M_QX9'?\9%!C_&108_Q84%_\@'B'_+RTP_S?]%-CK_*1<9_Q8/#_\3#Q'_&!06_UQ86O]K96G_75=;_TA"1O]; +M55G_55!4_Q40%/\>&1W_$@T1_XV'A?^MI:/_O;BS_[BPK/^EI*O_PK&D_U)B +M?/\C(!__$QDC_T9;B_\9&R/_7E-(_Q,8,?\:'"O_$A(5_Q8=*_\J,SK_%1S_S4Z +M0/\\03__S"A/^UKK7_WM/( +M_X9Q9?]34D?_+2PE_]_0R_^.>6W_J9B(_VAD7/_2PL;_/T%(_S8Z0O]#0DC_ +MF):8_R(>(/^5D9/_EY.5_VIH:_\E)3#_(2,R_S0T-_^MJ*[___+I_]FC:O_ +MEVW_?5PX_QT;%O\1#AO_%!$>_QD1)?\T+D+_$ T9_Q84%_\8$QG_% T5_Q(/ +M%?\K*"?_Q;NW__#6S?^KHIO_:V5C_R,9%?\E("3_&10:_Q,.$/\<%Q?_$@T- +M_R(='_\?&!__(QPD_RH?'O\T)"'_.",A_RX<&?\G&1K_(AT?_QTB(/]U>7?_ +M0T5#_];1T_]::WO_&B8J_Q89)/\F3H;_&A\K_W)B4O\=-%[___CSLG_D7UU_SXU+_]&1#__\N'4_Y^'>/^LFHS_ at W=N_]_0U/]!0$?_769M +M_T!#2/^;F9O_&147_YJ6F/^GHZ7_<&MO_R(B,?\E*#K_+R\X_ZZFJO_\\.O_ +MW:=M_\J@%S7_*R1"_R at A,_\<%QW_'QH:_R 9&?\: +M$QK_'1@<_RDE(__.PKW_\]S7_S\].O\Y-SG_85I:_S8X-?\<'!G_)R4B_R\J +M*O^8C(7_II:-_].]M/_OT\O_Y<_&__#8S__MTF[_=G1Q_[6KI__7Q[[_OK&P_V!;7_]234__L*JN_XB*C_\A)BO_'!\D_QD= +M'_\M,3/_,C8X_R_Q\;'?^9E);_.#<]_T9+4?\O-#K_%Q,; +M_R D(O\A'B3_(2X[_S! 4/\Y.T/_J:*B_Z"BL?]-5V;_>WM^_^;@WO^2F:?_ +M-C]-_\.XM_\X/4/_.3X\_\S(QO\W.4'_.C]$_QHA(?\P-3O_$QH at _QXC*/\L +M*BW_*2$D_^?3S__MV-/_Z]G5__+DX?_ZY-S_]MW6__'S,C_Z=?9_TE# +M2_]\A8S_F)N at _Z6CI?]*1DC_I*"B_Z*>H/]Y +MU?_RXMC_]>+8_^'/R__8Q/^ ?GO_QKRX_]7&P?^ZKK'_ at 7E]_\:]O?_)O;[_1$!"_P\5%_\8 +M&B'_(R_Q$4%?\>'R#_,2\Q_SDU-_\V,3?_.#E _S(/\5%A?_W]#+__+=V/_UV]C_^=S;__?;W?_VW=[_\-G:_^_:V/_O +MV=?_FHZ1_X2&C?^HJ[#_H)N?_V9A9?^LIZO_IJ&E_W-N_VQF9/_$M[+_[M;3__'7U/_V +MW=C_\][9__'>V/_XW]K_[MO3__G%@O_)O[O_ULC%_[ROM/]J8&/_T<7!_\R]N/]M9V7_ +M)B at K_R(G+?\V.3[_)BHL_TI.4/\[/T'_1TQ,_SL^/_\@(2+_'QT?_];*S?_& +MO+__&A88_QX:'/\Q-CO_*B0H_Q8>(O\N/TW_,3]8_SE#3?\]4&+_,$1 at _R8S +M1O\1%Q__.D=8_RXY1/\=&AG_*S \_RPL+_]A863_+#0^_S=!1?\@+"O_+#4[ +M_R0Q-O\K-SO_)BPN_RTK+?_GV-/_[]K5__+=V?_UW]W_^.'B__;@WO_VX=W_ +M^.'<___GX/_FU=7_W/_YW]S_^-S8___ at W/_XW-C_^-[5__??UO_QV-G_\=?4_VY:5O\Q +M*"+_+2X1W_X^-B/\N(!W_'!02_PT<'/\O0$[_-455_S=+8?\R +M1V/_+D-?_S%&7O\Q0EG_-#Q&_Q88&_\4%AW_.C<]_QD6'/\7&1[_+S<[_QTI +M+?\A*C'_(S$T_R,P,?\P,C7_*R4I_^?3S__RV];_[]K5__?BW?_WXM[_^N7A +M__7 at V__WXMW__>+;_\^YNO]H8FK_J:NP_Y&-E?]^>X'_N+6[_Z>EJ/]M9VO_ +M>G>#_R,D-?\H*3#_*2_V _/_\=$"/_'R$?_U902/]J9&C_/T Y_]/'P/_GT]7_.#H]_QT< +M(_\9%AS_+3$S_S8X._\G+2__*3$S_RTR,O\4&!;_-37%T_S,N-/\M+S?_;G1^_VUO("__&$R%_R$\B?\D +M3(K_OK_*_WQW=_\C$R'_$!,8_YJ2B/^'@GW_T,;)_]_)R_^;G9O_R<7#_]3$ +MP?_9RL7_.S,V_Q47'O\8&!O_)2,F_QX>(?\A(R;_*2TO_R at J,?].45;_%187 +M_Y&)A__3P,#_T+V]_Z28E/],0SW_0T0]_U-73O^*A'S_G(N%_VEC8?]:6EW_ +M/$1._S=$5?\W1UO_,4)9_SI)7/\S/$/_*C R_R$G*?\V.CS_%A@;_RG9^_X!]@_^SL;3_K:NM +M_X)\@/^$?XO_)R8W_R4E+O]L:FS___'K_\6,4O_ DF7_SY94_\*37?_)F6+_ +MR)AA_\657O_*EU;_R)EI_V!%(/\F&A7_(AP at _R$?*/]/3TS_S\.\_^?6UO\O +M,S7_%QD at _QT<(O\C)RG_&QT at _R,I*_\P.#K_*"\O_Q@='?\K+B__&!D:_SL\ +M-O]&24/_*3 P_QDC)_\<(R__(R8Q_S8S.?_1R,C_Z-;2_^W:U/_VW]K_^-_: +M__+_QX;(?\G(B;_)" B_QP:'/\9&AO_(!TC_Q at 8 +M&_\7%1C_<6=J_XN#AO^>F9G_='!N_ZNHH__.O+C_+B@@_R\R)?_'O:[_GX]\ +M_YN.??^1B('_75Q;_TY15O\Y04O_-3]*_SD^1/\I,2[_+S8/]46ES_4%98_U%24_]/3E7_9F9U_Z^IM_]X='W_B(6+_X:$ +MA_^IIZG_BH2(_W]ZAO\E)#7_.#A!_VQN_RPP,O\4 +M%AG_*2LP_Q03&?\T,SG_(1\B_Q@>(/\C*RW_)BXR_RLP-O\X-#;_U,G._^#/ +MU__IU]3_[=G1__':U?_QV=;_\]K9__C,X'_*U.*_\'"S?]74%?_)Q at C_W1X>O^?EXW_AX)]_]W3UO_>R<[_ +M&1T?_YF7F?_.P,'_V,?'_V995/_/R<'_*"W7_/CPU_UM:4_]! +M/#?_$Q$,_PP*!_^JHJ#_SL/"_\2\N/]03D?_0$0[_UI43/^VJJ7_2D,]_RPM +M)O^WL*3_ at GAJ_Y6+@/^4B7[_85E/_R\M*O\X.T#_86-F_V)E7_]35$W_,C$J +M_TQ*0_\N+"G_,C0R_R,J*O\9'1__&QT at _Q<9'/\?(23_+2\R_Y>-B?^AE(__ +MHY:1_YN.B?^5C(;_D8B"_XR#??^, at WW_A'UW_RHF*/]A86K_MK*[_S(N-O^. +MBY'_%A07_Q .$/^%?X/_>G6!_RHI.O\I*3+_3%%6___PX__,G6W_RIIG_\N< +M9?_#E%K_QI1;_\*05__!CUC_P)-7_\"/7/_!C%;_OI!3_ZE]2_]&+QC_86-A +M_\S%Q?_=T(B3_(R at H_RPQ,?\R.#K_*S U_SU#2_^A +MHJW_*#U:_UUFC__9S-__\-G:__75R__PV=K_\-K8__'9UO_NW-C_[^#;_^WA +MV/_CV-?_766%_SY1E_\M3'S_O4?^ >G+_(B ;_[&JI/_ at SLO_A'EX_ZBCG?^UL:G_,C H_S8U+O^] +MO+7_I)^:_R,D'?^9E8W_<65<_W5N8O]K9EK_>71H_R =&/\='R+_&1<4_SX] +M-O\P,RW_35-/_V=E9_]B8E__1DM%_RDN+O\B*2G_*BTR_Q at 7'O\;&1O_FI*5 +M_Z"8F_^CFY[_KJ:I_[.JJO^[LK+_O+6U_\2_O__$SKW_6V!:_UA98/^KLZ__ +M*RTP_Y:2FO\Q+##_-C(T_W=U=_^)B93_)"(R_QT>)?\M,S7__^_B_[R2:O^Y +MCV'_K8E<_ZZ#5?^WBU__M(E9_[2+5_^WBUG_O(Y;_[>*5/^WBU/_O8E7_ZF +M5O^1>5[_V,J[_^31R_\L+2[_$Q4:_Q(6&/\6&AS_$Q48_R at J+?\0$A7_)RDL +M_QD;'O\F*"O_%!89_R4G*O\1$Q;_&R$C_QHB)/\?)2?_(2/_*PL7_V6__=W)F_WYZ:_][=&;_;&9<_Q\='_]0 +M3$K_4TM'_R$;&?\@&QO_+BDM_SP\.?]04TW_-#G5U_]')S/_8Q\?_V<;&_R,@'_^_NKS_3DY1_X.! +M?/^:EI3_FYF;_\O'Q?]V=W'_P;BX_RHF*/^ZL:O_X-#-_["HIO_!P+G_:&1< +M_SPW,?^JJ*'_4TY(_S8T+?_ N[7_,BXF_\&^L_]Z=VO_>WEJ_W]Y:?]\=F;_ +M/#HS_S0Y-?\/%1'_("0B_QL<'?\B("+_*"8H_R(?\;&AG_&A at 5_S(H*__:SLK_25)2_S4]0?\U/3__,3P]_R\W.?\J +M,C3_)R\Q_Q\G*?\;(R7_&2$C_QDA(_\@)";_'!XA_Q<='_\9(2/_&B4F_QXI +M*O\A+"W_(2PM_RXU*?\W267_$1DI_QH9&/\B+$[_*S1%_R B(/\>&B/_'R$F +M_R(E)O\C)B?_*"TM_S U,_\R-3;_-#,Y_SPX0?\^-CG_6%-._X9^>O^TJ*O_ +MP;R^_Z:;E/]'1$K_Y-W=__+;UO]Y='3_VM+5_]G(R/_0N[G_ at GIV_\2XN?\F +M(2/_PL' _U!.4?\T-CO_O[V__U]=7_^\L;C_*RSLO_85E7_S8U +M+O_)Q;W_9V9?_S\Z-/_#NK3_.3_RTQ+_^=G:;_>WF)_RHK +M,O_$O[K___+M_X1R:/\6%!?_%!8;_UY=5O])1T3_'!@:_QP7&_\B%13_'1$, +M_QL6%O\4%!?_$Q at 8_RDM*_^KIJ;_W]#+_[*KJ_\P-#;_*C(T_RLX.?\J-C/_ +M+SP]_RHV._\K,S?_*3(R_RDU-/\D,"__)# O_RHR-/\J,C3_("@J_Q at C)/\: +M(B3_("8H_R at N,/\F+"[_+"PC_QP[7?\'$R[_'148_QTWXL_^NI*#_ +MQKZ\_UY96?_,PK[_D(J(_T=(2?_'Q<#_,BHH_\S$R/\D)"?_N+"L_]C*Q__. +MP<#_A'UW_R(D&__*QK[_2#PU_ZRLH_^LK*/_,"\H_ZNLI?\W.S/_D)*)_S\_ +M-/]$13C_<7%D_V9G6O^1BX/_V,6__]["O_^ID8[_)Q at 8_RD=(/\2#0__$0\, +M_RLK'/\R-1__,30=_R\S'?\N,"W_,C,T_S$R,_\Q,C/_*BDH_Q43%?\8%AC_ +M3DQ/_Q48._^AG+;_9F%<_Z>BNO\<&S__(R(__UM;;O\S.#+_.3TU_R ?)?\K +M*#3_961J_\C"P/_^[_#_QK2P_SX\1?\D*##_&!83_Q at 7%O\5$Q7_%1,6_Z*= +MG_^OIZK_&108_Q86&?\E*BK_-3(/\;(R7_'24G_R H*O\O,2C_)$!;_PP7+_\A'1__(#MQ_R0M2_\: +M&1__(QXB_Q\;&?\Y-S#_2DA _TQ'1_\5&2[_'"U1_QTW8_\I0&K_'RE$_UI4 +M6/\H)2O_'R G_QX:'/\D(B3_*"8C_^;MJ?_$OKS_44Y-_]/*Q/^]LZ__J*6D_\K%O_^QI:'_Q+S _RTM,/^WKZW_ +MWM#-_S,H)_^AG);_5%1+_VIJ7__ MJS_-CLO_YVBEO]!/SC_N[JS_T$_./^N +MJ:/_5%1+_SL^,O]664W_4E5)_TY-0O_7Q[[_]-7/_^K/R/_6O[K_J9>3_T at _ +M/_\3$!;_%1(8_QD4&/\7$Q7_,"TL_Q83$O\=&1O_)R,E_Q at 4%O\<&1C_+2 at H +M_TY)2_^;E9G_#PL__Z>BS/^VL[__KJ/8_Q01//\@'C__*29#_V)C;O\Z.SS_ +M)B8I_R0C*O\L+"__TLK(___S]__.O+G_'QPI_QP?*_],24C_'!L:_QD7&?\9 +M%QK_'!8>_R :(O\<%QW_&!89_T=,3/\]/SW_O[JU_^S=V/_PW=?_T+VW_^C7 +MT?_ at T'2/_)!\9_YRS_\"ZN/]23T[_VM'+_[RTL/^ZL[/_S,.]_];(Q?_.QLK_)24H +M_\S$PO_:S,G_6U-1_SDX,?_!O;7_(B<;_X!]N_]2YLO^LEH[_ +MOZ:?_^'(P__:P<#_T[V__QL4%/\?'!O_7UU:_R8D'_\[/SW_+"\P_SL^/_\W +M.CO_.3T[_UY at 7O]?8&'_2TM._Q00&/\4#QO_#Q00_QD7*O\6$2W_%Q,M_Q44 +M,?\3$C?_.35+_S,R.?]$1D3_0T5#_]'(R/__]O+_P;2S_Q\>)/\2%!?_'1D7 +M_R0?'_\A'1__%1,6_S0I*/]#.#?_'QH<_QH:'?]$1D3_,#@T_\.YM?_QW-K_ +MY]O7_^'5T?_=T,O_V_Q83*O\5 +M$2O_%Q4O_QH;-/\A&CS_'A at L_QT<&_\E)"/_B(.'___S[_^WJZ[_%1(8_Q<7 +M&O]U<'#_/3 at X_Q82%/\8%AG_)A\?_QL4%/\;%QG_%1<:_TI)2/\T/#C_P[NY +M_^K;V__ at T=+_XM#4_]G(R/_3P\#_GYJ4_Q\;'?\5$AC_$Q,6_Q at 6&?\3$13_ +M&1<:_Q43%O\0$!/_$!(5_QD;'O\7&1S_%148_QD='_\@+2[_(RLM_R at K+/\= +M*B__)2LG_RPN-O\D07?_)2M%_R,?(?\D)B3_/STV_U%12/]=7E?_&!D:_PXD +M1/\91&[_!C-Z_RA)DO\>.VO_NZ:B_R D+/\E(!K_2TM(_Z& +M&R'_&QL>_R4@(/]U<'#_&147_Q$/$O^JHZ/_LJNK_Q<3%?\3%1C_'AH<_R$I +M)O^QKJW_P;R\_W=\@?])457_0TM-_T)+2_]*3TG_%Q47_Q,0%O\2$!/_&A@; +M_Q02%?\5$Q;_$Q$4_Q04%_\2$A7_&1D<_QH:'?\8&!O_&Q\A_R M+O\B*BS_ +M(RDK_QHE+/\C)2/_)28Q_R9">_\?)#[_)R,A_S4V,/]'13W_5E9+_TU/1O\A +M(R'_%2Q)_R!+=?\)-GW_)D>0_QPY:?^QG)C_%1DA_R8A&_]34U#_G)>1_T V +M,O_NW]__[]G:_S N*__9T<__W]#0_WMY=O_;S<[_GYV?_T5)2__3T,__K:NH +M_]73T/^\NK?_HYZ9_ZF?J/\T+R__'!H7_S4X/?\>(R/_%AH8_S at Z-_\S+S'_ +M&A88_W!M;/]&1$'_*"'%[_WYW@?^NI['_J)^?_Z^FIO\:%1?_%Q48_Q<9(/\4%2#_(R(S +M_QH7+O\:%RW_$Q B_QD5)?\4#!K_$ P4_S0Q,/\_/C/_2T@\_S at V+___\>W_ +MJIZA_R$>)/\:&AW_A8" _[:QL?\2#A#_&!89_QT6%O\K)"3_&147_Q47&O]H +M8F;_%1P<_YJ=GO\Z/3[_+C\__S%"0O\T1D3_.DQ(_TI33/\4%1;_%A,9_QP6 +M&O\9%QK_'AP?_Q43%O\3$13_%A07_Q02%?\<&AW_&A@;_Q45&/\:'B#_(B\P +M_QHB)/\B*B[_$QTG_R(>(/\:'2G_(3IU_R0F0?\J)2#_45%&_SL[+O]864S_ +M,30H_QX@'?\8+TS_'TIT_PDV??\J2Y3_(C]O_\2OJ_\4&"#_)B$;_W1T_\_( +MR/^ZLK#_VM+0_\*ZN/^[LZ__I9ND_U)-3?\B(!W_'ATD_Q06&_\7%1C_'!@: +M_Q -$_\3$!;_$Q$4_RLI*_\K*R[_&1L at _Q06&_\1$QC_)"4F_S4V-_\^/T#_ +M2TQ-_R at F*?\6&!O_+#$Q_V9H9O]05%+_/#X[_U=23?]L8%O_?W-L_W)J:/\> +M&1W_4$I._R$<(O\0"A+_+"8N_VQF;O]<4U/_K:2D_QH5%_\7%1C_#P\:_Q(1 +M'O\B'RO_%@\9_Q44&O\7&!G_HIV=_Z:>G/]*2$'_1D0]_TY)0_]23$3_?W=S +M___Z^O^\L;#_)R(B_R0@(O\D'Q__C8J)_P\+#?\5$!3_LJBD_[>KI_\?%Q7_ +M'!D8_Q\5&/\@)"+_EI:3_U]B8_\T0D'_.$9%_SI)1?\^34C_0T]&_Q$4%?\; +M%AS_$Q$4_Q at 6&?\9%QK_%Q48_Q02%?\9%QG_%A06_QP:'/\5$Q7_&!88_QPA +M(?\F,C'_(BDI_R4L+/\9'2S_'QL9_PX5(?\A.W3_&A\X_R%!?_ +M?'MT_Z*:EO]@5%?_Y=?8_^O(?\:&AW_%!07_Q$1%/\4#Q/_% \3 +M_Q,1%/\2$A7_%QH;_QH=+O\-$2#_&!$B_R4:+?\G+37_-CLY_U164_]54DW_ +M5%!._QD4&/]13E3_+BLQ_R(=(_\N)2S_;FEO_TU$1/^NI:7_&!,5_Q43%O\. +M#13_% \3_ZRGI_]\>'K_.#8X_S P+?^6EHW_H9R6_TQ*0_\>'AO_(R$C_R at C +M(_^WM;C___3Q_Z&6E?\:%Q;_'AH<_S&1__%1(8 +M_Q<9(/\4&B+_=W!W_QPD(/^*CXG_>7Y\_S5!0/\Y0D+_.4- _SM&0?]"3D7_ +M$A,4_QD4&O\5$Q;_%1,6_Q84%_\7%1C_%!(5_Q84%O\7%1?_%A06_QD7&?\8 +M%AC_'2 A_R(N+?\@)R?_+#0Q_Q,5)/\<&13_"Q4 at _QHR:_\9'S7_0#\^_T!" +M0/\K,"K_'QPB_S8T+?\W.3;_'S99_RE7A/\:1I#_*TJ2_SE2;_^QGZ'_%AX: +M_R8;(/^*BW[_I9^7_VA:6__JV=G_Z-C<_SDT-O]Y>7;_UGO_8S,__ +MC9*2_WR#@__(QK__O;BS_^#7U__*P;O_O[>U_XJ%A?]Q;FW_+BTL_QH<'_\6 +M&!O_%!07_Q at 6&?\/#0__$Q$3_Q,1$_\D(B3_'AP?_QP:'?\9%QK_%!(5_Q4/ +M$_\4#Q/_$ X1_Q,3%O\8'RO_'R5%_Q$7,?\:%RW_6$EB_V1I=?]D:6G_5EA5 +M_X6#?O]134O_&A49_U).5O]_?H3_?WA__X!W?O^VL;?_A7Q\_Z:=G?\<%QG_ +M'!H=_QP;(?\<%QG_K:>E_X:!A?\[.3S_+RXM_X:&??^=FI7_244]_QH8$_\: +M&!7_-"TG_[ZXO/__]/#_?79V_QD:(?\0#A'_B(2"_ZJGIO\>&AS_'1@<_W1I +M:/]N9F3_&A45_QT;'?\O)RK_%R 9_S8],_\Z0C[_)BTM_R,F)_\9'1O_*2XJ +M_T901_\;'!W_&10:_Q43%O\8%AG_&!89_Q at 6&?\4$A7_%A06_Q43%?\6%!;_ +M&1<9_Q43%?\>(2+_(R\N_Q 7%_\K,S#_%!8E_QL8$_\4'BG_&3%H_R\S2/]( +M1D/_)"0A_RTK(_\Z,#/_.3,K_S\].O\D0&+_+%>%_QY&D?\J2Y/_1%]W_[>E +MJ?\3&AK_(A<<_XV0?O^CH)3_>'!N_\&UN/_2R]7_'!XF_S@[//^UJ*/_J:2D +M_]G/TO]]@H+_FYZ?_\K%P/^ZM++_W-+5_\B^NO_.QL3_?GEY_XF&A?\?'AW_ +M%QD<_Q47&O\1$13_%Q48_Q05%O\.#Q#_/T!!_QX?(/\G)2C_)2,F_R >(?\4 +M$A7_%A 4_Q0/$_\/#1#_#P\2_QPE/?\;(5'_$QY _Q8;-/\O(#G_:6YZ_V1I +M:?]H:F?_B8>"_U).3/\D'R/_/#A _T9%2_\1"A'_.C$X_XR'C?]C6EK_HIF9 +M_Q\:'/\6%!?_$Q(8_QP7&?^JI*+_-"\S_QH8&_\G)B7_?W]V_WUZ=?\_-C#_ +M*R8A_Q\:%/]63$'_R\'$___V\/]53U/_-3I&_R at E*_\D(![_L:ZM_QD5%_\: +M%1G_8595_V-95?\;%Q7_'1P;_RH<'?\H*2+_E92)_X>(@O\E+"S_'R8F_QXF +M(_\J,B[_2E9-_Q at 9&O\6$1?_$Q$4_Q84%_\6%!?_%A07_Q,1%/\4$A3_%!(4 +M_Q84%O\9%QG_%Q47_Q\B(_\G,S+_"Q(2_RTU,O\/$2#_&Q at 3_QCLO]'6&7_.D9*_XZ& +M at O^HI:3_W=78_Y.8F/^IJJO_P;^\_[JYN/_8T]?_NK:T_\G"PO]S;F[_A8*! +M_R\N+?\8&AW_&AP?_Q(2%?\8%AG_#0X/_UA;7/]15%7_(B4F_R >(?\D(B7_ +M'1L>_Q,1%/\6$!3_% \3_Q$/$O\4%!?_'28^_QPC4?\4'4+_'" \_RX>.O]A +M9G+_65Y>_VMM:O^5DX[_44U+_Q<2%O\L*##_'ATC_S(K,O\Z,3C_?GE__U1+ +M2_^IH*#_'!<9_Q at 6&?\3$AC_&106_Z6?G?\8$Q?_%1,6_QH9&/^!@7C_F9:1 +M_SPX-O\F(B3_&1 at 7_U--0__ O;S___7R_T Z/O\;'"/_&!D:_WAZ=_^\M;7_ +M&A@:_Q43%O\F'Q__&A88_Q83&?\='"+_BX:&_RHK)/^=E(W_ at X%\_R\W-/\H +M+2O_&1\;_RTS+_]365'_&!88_Q01%_\4$A7_%1,5_Q02%/\3$1/_%!(4_Q43 +M%?\4$A3_&1<9_QD7&?\7&!G_(B&O\=%1G_&1\G +M_R0V;O\9'R__)BHB_RTP*O\V+2;_.S8V_VUP_[[#P_\^04+_S?]'1$/_&!06_RTH+/]'0DC_13M$_T,T/_^$ +M?(;_85-4_Z&9G?\4$AO_$Q48_Q,1$_\<%Q?_EY&/_PT+#O\5$AC_&!<6_V5F +M8/]K:6;_-38W_QH<(?\4$A3_5%)*_[VZN?__^/?_3$1(_R4D*O\>'R#_+S0P +M_[^VMO\9%QG_)"0G_[.KJ?^ZM;?_&Q8<_Q$/$O\>&1G_'R,;_Z&6C_^ ?GG_ +M-#PX_SD_._\M,R__-3LW_UU at 6O\8%AC_%!$7_Q02%?\3$1/_%1,5_Q43%?\5 +M$Q7_$Q$3_Q02%/\9%QG_&1<9_Q87&/\A*"C_,3HZ_Q(7%_\M+3C_(RLA_R,9 +M(O\?)2W_'RUE_S8U1O\W.#+_/T$^_S,X,O^9I:3_F:6I_VYU=?]/96/_,UEY +M_W1\D/^(@'[_AH&!_ZRFJO\;%AS_'AP>_XV.B/^=F(S_2%EF_T=MB/^OS^7_ +M=(ZC_T147O^$A('_F9J4_R_^$ +MB8G_D8^1_ZB at H_\8$Q7_%1,6_QH:'?\0$!/_%Q<:_PX.$?\6%AG_'1T at _QX> +M(?\?'R+_&1D<_QD9'/\/#Q+_$PT5_Q,.$O\0#A'_%!(;_Q4>-O\9(U#_&R5* +M_Q09-_]E3WS_?GF%_Q 8&O\:&B?_'1D;_U524?\H)";_,"LO_RF_\Q,C/_'!P?_QT;'?]+2D/_AX2#___X]_]#.S__'QXD_Q46 +M%_\E)2+_L:6F_QL9&_\9&Q[_&1,1_Q81$_\<%QW_&QD<_Y*-C?]%24'_HI>0 +M_W]]>/]<95[_9FUE_V!G7_]A:&#_9&A at _Q@6&/\9%AS_%A07_Q84%O\:&!K_ +M'1L=_Q84%O\5$Q7_$A 2_QD7&?\7%1?_%Q at 9_R8M+?\T/3W_%!D9_S,P//\A +M*![_&A 9_PD2&?\;*6'_&Q'S_3596_U)I +M:/\S6'?_<7)]_Y> ;?^%=V[_J*">_R$?(O\?'1__C8J%_ZBAE?^1HJ__)4]I +M_[//Y/^URMS_$QTG_XJ%?_^#@'O_'B(D_UE;8/^_N[W_O;F[_RPQ,?\T0#__ +M-#T]_TQ85_\D)RC_E(R/_QD1%/\6%!?_&AH=_Q 0$_\8&!O_%148_QX>(?\> +M'B'_0T-&_RHJ+?\@("/_*BHM_Q(2%?\4#A;_% \3_PX,#_\3$1K_%2$\_QHE +M5/\<)TK_,C5._V)4>O^ ?H?_#1 5_Q42'O\0#0S_4$U,_QD5%_\@&Q__0T)( +M_U945O]C7%S_IJ*J_VYO=O\6%!?_&1(2_S$E(?\?&AK_&Q04_ZFCH?\4$1?_ +M$P\7_P\-#_]B8UW_FYN8_ST].O\=&QW_&QD<_RTN*/\:%AC___KY_RLC)_\2 +M$1?_'!T>_WEW=/^FEYC_%1,5_RDM+_^[M;/_G)>9_Q at 3&?\=&Q[_%Q(2_T5) +M0?^HG9;_A8-^_V5O9O^%C8/_;'1J_V=O9?]I;67_%Q47_QH7'?\:&!O_&!88 +M_QL9&_\>'![_'!H<_Q at 6&/\:&!K_&A@:_Q at 6&/\7&!G_*"\O_S([._\4&1G_ +M-3 \_R(F'?\@%A__'2DP_R$V;/\6%"3_(A\>_R$M-/^*I*?_ at IVD_UUT>?]& +M4D__46IO_RU5?/]T>8O_D8!R_W- at 5O^>DHW_(2(C_Q\;'?^2BH;_IYV2_YFJ +MM_]VHKS_F,38_ZG-XO\J.TC_B(.#_YV8D_\>'B'_2TI0_\7 PO^NIJG_.C at Z +M_S@[//]+3D__/D-#_QH='O^"?H#_&!D:_QD9'/\<'!__$Q,6_Q04%_\6%AG_ +M%A89_QH:'?\]/4#_'Q\B_QD9'/\?'R+_#@X1_Q0.%O\4#Q/_$0\2_Q(0&?\8 +M(CW_(BI6_Q8<-O\8&"'_5$QG_T ^1_\K)R__&QHA_X.!?O]23T[_&A88_RE +M_RLH+O\?&R/_%!(4_V)C7?\;&QC_,S$L_QL8%_\5$Q;_*2TK_Q at 6&/_Y[>[_ +M)Q\B_Q81%?\>&QK_'1T:_YJ.D?\H)2O_*"DJ_S$I)_\J)2?_%1(8_R(@(O]^ +M>7G_6U90_Z.:D_^4DHW_;G5N_Y&6D/]Z?7?_;G5N_W)S;?\4$1#_&108_QD4 +M&/\6%!?_&!89_Q at 6&?\9%QK_&1<:_Q84%_\@'B#_%Q85_QL:&?\G,S#_-#DW +M_Q8:&/\X/D#_(1\<_QX7$?]&3E[_)"U<_QH;)O\@'AO_)C0S_X:;G?]SB8O_ +M87=U_UMD7?]>=7#_+D]Z_WA\?O^. at O^I +ME8W_4%AB_V24J?]YJ,#_F\WH_UM\D_^\M[W_ at G9W_Q\@(?\[/C__S\G'_ZBA +MH?\Q+S'_+R\R_RHI+_]<6%;_'1H9_T-"2/\)"!7_'18B_R :(O\9%AS_$!,4 +M_Q45&/\4$A7_$0\2_Q84%_\?'2#_%A07_Q$/$O\1#Q+_$A 3_Q(0$O\2$!/_ +M%1(8_QTC0_\1%C#_$0\2_Q<1%?\I)2[_)R0J_S M,_\N+"__,2\Q_R8D)O\> +M&AS_0CT__R(E/O]*46?_%!XL_R,S3?]*5G7_"PP=_R$9%?]A7$K_0SXY_Q at 3 +M%?^BG9__*B0L_QH5&_\5%Q7_24Q&_U!/2/^LHI[_&1T;_Q at 9&O\H)BG_,"XP +M___S\O\H("/_)"$G_R$<'/\_03[_=&EN_Q -$_\E)B?_-2HI_R7/_>'AU_Q<4$_\8 +M%!;_%Q(6_Q$/$O\6%!?_%!(5_Q<5&/\5$AC_%A07_R,A(_\;&AG_'!L:_R)U#_%1LC_R(>'/]46UO_5&=G +M_W2*B?][CHC_8&IA_UEP:_\N2WO_=WQZ_YF#@?]U:V#_=G!N_RHK+/\P,B__ +MCXZ#_VIB8/\,)S+_<:C _X.QS?]BEK?_>:+ _[.SO/]N8F/_)"(D_RXR,/_/ +MR(?\=&QW_ +M(B B_VIF:/\F(2/_$P\?_Q at 8(_\5&!W_&B4P_QXF.O\Y/47_)R(=_S4O)_]L +M:VK_# T._Z2BG_\U,"O_(1P<_Q88%O\^0S__3$I%_\6YM?]'3$K_+B\P_QD4 +M&/\8%AG___3Q_SDT.O\7%R3_)B$E_RDK*/]]_["PL_]"1$G_LK"S_QH:'?]S=7C_%1(8_QXB)/\E +M*2O_%!07_Q,.$O\6%!?_&A@;_Q<5&/\2$!/_%1,6_Q,1%/\0#A'_$0\2_Q$/ +M$?\1#Q'_#PT0_QL8'O\?)CS_%!8E_QT8&O\E("3_$A 3_QD7&O\L*BW_'1L> +M_Q<5%_\5$Q7_34E+_RDD)O\:$A;_%A(4_Q(1$/\A'R+_$18<_Q@>(/\L*2C_ +M'Q,6_V1:;?\;$BK_C("5_X%V??]%/#S_(1X=_SQ /O\P,C#_S\3#_S U,_]' +M2$G_(!L?_QH8&___^//_03U&_U-8:O\4$A7_)"0A_V]D:?\7%!K_$Q05_R@= +M'/\6$!3_%Q8<_QH6&/^/BHK_?WAR_YV7C_^MJZ;_TM#-_]C0S/_7R\?_K:BC +M_ZNIIO\9%A7_&Q<9_QH5&?\3$13_%Q48_Q$/$O\4$A7_%1(8_Q84%_\6%!;_ +M.3 at W_R0C(O\I.#3_-3DW_QD=&_\O-##_)2(H_QT?'/\4&B+_%QL[_QP>(?]; +M65;_BYB=_XFCIO^%F9W_96UO_UAB7_]7;VS_)4)R_WA]>_^+=7/_;V5:_T]) +M1_\D)2;_(R4B_YV4C?]=;''_'RY%_Q K0_]]I;K_F\OG_Z',Y/^\P,+_4$=' +M_RDG*?]@9&+_SLC&_YF4E/\;&1O_N[N^_TI,4?^XM[[_&1L>_V!C9/\8%!+_ +M(1T;_R8A(?\9%!;_% \5_Q at 6&?\B("/_'1L>_Q(0$_\1#Q+_$A 3_Q84%_\3 +M$13_$0\1_Q$/$?\-"P[_'!D?_S,[2_\2$A__%0\3_Q(3%/\0$!/_&!89_R0B +M)?\7%1C_&!88_Q<5%_\8%!;_&A47_QP7'?\-#Q;_!PP2_P@'#O\3#A+_'!H7 +M_Q\;$_]^:6?_?6)R_T at N2?]3/5?_0C8__XV"@?]645'_.3L^_RTO-/_.PL/_ +M+C,Q_TQ-3O\=&!S_%Q0:___Y^O\G)BW_*B\[_S4T.O\H(B#_5U%5_QX;(?^6 +MD9/_M*RJ_SXY/?\.$!7_&A@:_QX;&O^ ?G?_E9.+_[RZM?_7T<__V]#/_]?, +MR__"M[;_K:FG_R0A(/\:%AC_%1 4_Q,1%/\9%QG_%Q47_Q at 6&/\7%1?_%Q47 +M_QL9&_\?'1__'R,A_R\W-/\X/3O_'"$?_S0X.O\?(2;_&AT>_Q$6'/\7&BS_ +M%R(C_T-84O]YCY?_EK&\_WR8H/]>>(/_0U=E_TAE7MY_Y:$=O]P +M95K_2T=%_T)%1O\Q-C+_CH^(_WIW=O\<&2;_05IQ_X&PPO^9Q=G_C+?)_ZJY +MN?\X-33_.3X^_V1I9__-R_]O:&__HYZ at _YV7E?]*1T+_55-5 +M_];*R_];4U'_2D-#_QH5%?\<%AK___3T_RPG*?\>("7_(1X=_RXF)/],1DK_ +M(R F_R8>(?\J(B#_'1@<_Q@:'_\<&AS_=G-R_X.">_^8F(__O+JU_]C0SO_> +MT]+_V<[-_\6ZN?^JIJ3_1T1#_Q82%/\7$A;_%Q48_QH8&O\7%1?_&!88_Q<5 +M%_\7%1?_&QD;_QT;'?\?(R'_,38T_S,X-O\=(B#_.#8Q_R0B'_\?'"+_%A,? +M_Q01*/\P-U7_'S%5_R V7/\O5'?_.VJ-_RU:@O\>16__+%5Y_RY(;_]\@XG_ +MGI"!_VQ at 5_]%03__+C$R_RHO*_]?8UK_ at 7]Z_UUF;?]9?)/_;YZV_Y_!V_^# +MI;G_H::K_S,L+/\T-3;_55I8_WZ ??]L:VK_*2PM_Z"DIO]>8VC_PL##_Q,1 +M$_\0$Q3_'AH<_R,A&O^XKZG_BWQ\_Q<1%?\6%!?_%!(5_Q02%?\3$13_$Q$4 +M_Q,1%/\2$!/_$A 3_Q,1%/\2$!/_$Q$4_QH8&_])1TK_%1,6_Q .$?\2$!/_ +M$A 3_R >(?\B("/_(R$D_Q<5&/]$0D7_%!(5_Q .$?\4$!C_$@X6_QH6'O\G +M(RO_,2XT_S at S.?].2%#_85ID_Q$.&_\4$1W_'!@@_T(]0?^MJ*K_LJJH_WMO +M:O]L967_BX*"_W!G9_]L967_7%=7_T,^0O__\.S_.S0T_RDJ*_]-1T7_-2TK +M_S8P-/\:%QW_65%4_V-;6?\G(B;_&QTB_R8D)O\V,S+_CXZ'_YB8C__$PKW_ +MV='/_]?,R__:S\[_Q;JY_ZJFI/]/3$O_%1$3_Q81%?\3$13_%Q47_Q84%O\5 +M$Q7_%1,5_Q84%O\>'![_&A@:_R(F)/\X/3O_,#4S_R,H)O\U.3?_%Q\I_PL7 +M,O\,$S?_"!,R_RL\:O\>.7;_*4M]_R=0@?\^;)[_+%J,_S);C/]%:)#_3F:- +M_TQ47O^7C8+_=VMB_S at R,/\_0$'_2$A%_VIN9?]J;F;_=8.&_SM=GK_N,#"_Q4?(_^] +MN[[_'!H<_QH='O\>&AS_%1 at 2_[>IIO^;@(;_% \5_Q$1%/\4$A7_%!(5_Q . +M$?\4$A7_$Q$4_Q,1%/\1#Q+_$A 3_Q43%O\3$13_%!(5_QX;(?\3#Q?_$0T5 +M_Q ,%/\1#Q+_&A@;_QD7&O\8%AG_$A 3_QT;'O\4$A7_&A@;_Q(/%?\2#Q7_ +M%1(8_Q42&/\3$AC_$1,8_Q,5&O\7&1[_$1(9_Q,2&/\R,#+_'QT:_Z&5_T]-3_])1T3_'QL=_QP8&O\C)2C_/DI3 +M_Q8M,O]/8F[_CJBU_QPE)?\E("#_/#] _TA-2_]65E/_34Q+_TQ-3O^RM+?_ +M&!L at _[2OL_\>'![_'R(C_QX:'/\A'QS_N;6S_UA35_\6%1S_$@\5_Q(0$_\0 +M#A'_%A07_Q\=(/\5$Q;_%1,6_Q02%?\3$13_$0\2_Q,1%/\2$!/_-S,[_S(N +M-_\=&2+_&A8?_Q(/%?\7%1C_%Q48_Q<5&/\/#1#_(!XA_Q<5&/\0#A'_&A@; +M_Q02%?\4$A7_%!(5_Q,2&?\3$AC_%!07_Q,4%?\4%1S_$ X7_U%/4O\?'!O_ +M;F]P_V9D8?^%@'K_5%-2_TQ04O]%24O_2$A+_TI(2_]'14C___C[_R(?)?\5 +M%AW_'QP;_SPV-/\@&Q__(QTA_RX?'_\G%Q3_(AH>_Q,5&O\1%!7_0$%"_XB& +M at _^;E8W_Q\*]_];/S__=U-3_V]'-_]'%P?^>EY?_'!<9_Q82%/\4$A3_$ X0 +M_Q43%?\=&QW_$Q$3_Q<5%_\9%QG_,"XP_QH8&O\E*B;_,C8?]%.C__'QH:_RXJ+/\;%1G_%Q,5_R0C +M(O\?&AS_-"4?_R<9%O]74E3_>W-Q_R4=(/\E)"K_)BHL_R @(_\H)BG_&18< +M_VAG;?\@'R7_G)ZA_Q<9'/\:&AW_'1L>_R,>&?_$P<#_:&=M_R,@)O\7&A__ +M%QD>_Q(/%?\8%QW_*RPM_QT;'O\@'"3_$Q$4_Q84%_\U,S;_#0L._Q84%_\Q +M+C3_.#0\_QH6'O\;%Q__%Q(6_QH5&?\6$17_%1 4_Q83&?\7%!K_%!$7_Q83 +M&?\1#A3_$0X4_Q83&?\5$AC_%A,9_QL9'/\9%QK_&1<9_Q$-%?\3#Q?_.#0\ +M_RLH+O\G*2S_U_[VUL?\<%QO_&!<=_QD5%_\5 +M$Q7_DHV-_YZ5CO_*Q<#_UL_/_]W4U/_77_(!D9_RPJ+/\S.CK_2$M,_RDJ +M*_]A8F/_?7Y__Q$2$_^SM;C_&QT at _Q86&?\<&AW_*28A_[VXN/]@6F+_&Q@> +M_S(W//\X.C__'QPB_R at J+_] 04+_%Q0:_R7_R0?(?\= +M&1O_%A06_Q<5%_\9%QG_&A@:_Q,1$_\2$!+_&A@:_QP:'/\:&!K_)RPF_S<\ +M.O\J+R__)2LG_R\Q+O\H)B/_/#DT_T0_.?]'/SW_&Q(2_R,<'/\>&1G_,RHD +M_T0\./]234W_:%]9_V9:4?]Q9EO_>FU at _X5W:/]Y<6?_9F-8_VQK8/\U,S#_ +M(!XA_R(@(O\H)"+_+1X8_T8K&O\X(17_U,;#_Y2,BO\>&AC_75]<_V%L9_]: +M8%S_7V5A_VEO:_]=8U__/4,__TI/3_\1$Q;_#P\2_Q84%_\W-"__3$='_R : +M(O\8%1O_-#D^_UQ>8_]95ES_,#(W_U!14O\2#Q7_(!PD_Q<5&/\6%!?_&QD< +M_Q84%_\@'B'_%1(8_R0A)_\4$1?_'ALA_QH5&?\:%1G_%A$5_Q0/$_\7%!K_ +M%A,9_Q at 5&_\5$AC_%A,9_Q01%_\6$QG_&18<_Q00&/\@'"3_%1$9_R,?)_\U +M-C?_4U53_V5G9?]*3$K_2DQ/_T1&2?]!0T;_/D!#_T)$1_\_043_.SU _SY +M0_\Y.3S_^O+U_S0O-?\D(RG_;VIJ_Y:2D/\>&1W_+2 at L_Z"5E/^+?WO_'1<; +M_QH9'_\=&QW_'1X?_Y60D/^>E8[_S\K%_];/S__8S\__U,K&_]C,Q_^=E)3_ +M&A47_QT9&_\5$Q7_%Q47_Q at 6&/\:&!K_$Q$3_Q,1$_\;&1O_'!H<_QP:'/\G +M+";_.3X\_RHO+_\F+"C_-30M_R\J)/]+13W_6U-)_W]S:O]-03C_13LQ_TU% +M._]P8U;_(1D5_R\K+?]/1#W_%Q[_&Q@>_Q42&/\5%A?_$Q05_Q87&/\0$1+_#@T3_QP;(?\8&1K_ +M'B >_R at M)_\\03O_*S L_RLP+/\O*RG_03PV_U=11_]H7E#_8E!&_U! -O]% +M.B__75-(_U]23?\5$!+_$! 3_VYI8_]L8EC_>VYA_WEK7/^$=VK_8UQ6_V!< +M5/]Q;&;_'A89_Q40%O\2$!/_(!D9_U1!.?]A0RW_5#_Q06&_]$1DG_%!8;_QT=*/]$ +M1DO_+2LT_Q\<(O].3$[_3TQ2_Q01%_]85EG_'AP?_Q84%_\1#!#_&A88_Q at 3 +M%?\A&AK_&Q8<_Q,/%_\;%Q__'1DA_QP:'?\@'B'_'QT at _U)04_]O<73_55E; +M_TU14_]*3E#_0TA-_S]$2?\^0TC_/T1)_T!!2/]#0DG_0D%(_T)!2/\]/T3_ +M/4%#_SH^0/\V.CS_%1,5__SZ]_\K*"?_&!88_QL9'/\M+3#_&!@;_Q86&?\4 +M%!?_'ATD_Q06&_\5&!G_*28A_QX?(/^/CHW_GIB0_]/.R?_3R\G_U8_Q at 2%O\9&1S_&!,7_QP8&O\:%AC_'!@:_Q<3%?\1$A/_'1X? +M_QL=&O\D)R'_'" 8_T!#/?\E)R3_%1<5_QX:&/])1T#_5E-(_VE?4?]X9ES_ +M6$@^_T4X+?]21SS_8E-3_QH2%O\8&AC_W=U_V]Q:/]B9&'_&AD@ +M_Q<6'/]%0#O_3TE'_QL5'?\5%QS_&B(F_SD[0/\9%AS_%!8;_T=)3/\/$!?_ +M'!PE_U!25_\V,3W_'QLC_V%?8?]855O_$Q 6_UA66?\>'!__'QT at _SLZ0/\8 +M%QW_%!$7_Q83&?\9%!C_$@P0_RHD*/]*1$C_4E!2_W1R=/]<6ES_6%98_TM- +M4O]'2D__1DE._T)%2O\_0D?_.SY#_S@[0/\S-CO_+C U_RXM,_\N+3/_+BTS +M_RLM,/\K+3#_+C S_RLM,/\@'B#_\_7R_SP^//\A'R'_CXJ._T]-4/\6%!?_ +M%Q48_Q43%O\C&Q__&108_QT@(?\6&!;_&Q\=_Y"1B_^BFY7_U<_-_];+RO_5 +MR<7_T\K$_\W'O_^>DI/_% \1_QD:&_\;%QG_&!,3_QD4%/\>&1G_%A$1_R4F +M(/\R-2__0$,]_T)%/_\R,B__+BXK_R$@'_\1#Q'_(!L;_T1"._]$03;_7%)$ +M_WIK7O]31#?_0C,F_U-"-?]:2TO_'AD?_R,E*/]234?_;6)7_V582_]K7E'_ +M95Q5_U)-4?].2TK_:FAC_Q41$_\6$A3_&A<=_Q83&?\J'A__6#TL_TTX)O]H +M7UC_;FIL_QX7(?\@'R;_4UM?_V%E9_^)B(?_%!$7_Q<3'/^"@(/_?X%^_V-C +M9O\8%A__%!,9_TY,1_\6$Q+_&14>_Q at 7'O\8("3_5%9;_Q,0%O\@(B?_65I; +M_Q,2&/\H)R[_9&1G_S0P.?\?&R/_9V5G_V%>9/\3$!;_5U58_QX<'_\C(23_ +M96-F_QP;(?\6%A__1TI5_R <'O]D7U__ at GU]_UU86/].3$__2DI-_T]/4O]& +M1DG_0$)'_T)$2?\^0$7_/3]$_SY 1?\Y.T#_/D!%_ST_1/\]/4#_/S]"_SX^ +M0?\_/T+_/CY!_SP\/_\S,S;_(" C_QH6&/_V\O#_/SHZ_RTK+?\G)RK_FIB; +M_Q at 3%_\8$Q?_&108_QP8&O\5$Q7_&AT>_Q at 6&?\?&QG_FI6/_YF4CO_6V=K_ +MS]/5_]#0T__-R,K_R[_ _V)65_]'0D+_?X%__V)?7O]34U#_0D(__S,S,/\N +M+BO_.#LU_S0V,_\K+2O_(R,F_QP9&/\6$Q+_$0P0_Q40%O\@&1G_14,\_U93 +M2/]M8U7_@')C_W-E5O]N7$[_;UM-_UU.3_];5U__*"LP_T5"/?]G6U+_9EE, +M_UM01?]*1D3_(Q\G_QH8&_]555+_'AT<_QH5%?\9%AS_&!<>_Q\9'?](+B'_ +M2C at J_U)33/]&14O_(!LG_Q<9(?]>9VW_8F=L_VAG9O\=&B#_&QLF_T)$3/\X +M.CW_+2PS_Q at 6'_\6%1O_/$$]_PT/$O\4$1W_&!8?_Q$9'?]%1TS_&!4;_Q06 +M&_],3DS_&A@;_R,@)O]F9&;_+"@Q_Q\;(_]H9FC_75I at _R,@)O]&1$?_(1\B +M_R0B)?]02DC_13\]_T9$1_\5%1[_8F1I_U!/5?],2U'_24A._TE+4/]&2$W_ +M/T%&_T!"1_]-3%+_-30Z_S O-?\M+#+_*RHP_RLJ,/\J*2__*2 at N_R_Q at 3%_\8$Q?_%Q(6_Q02%?\5$Q;_&108_T0\./^7D8?_F9B1 +M_\'$Q?^TN;[_K[.U_[:TM__!N;W_96-E_V=J:_]=8&'_,S8W_R0I*?\A)B;_ +M(",D_R,D)?\B("+_'1L>_Q at 6&?\6%!?_$ X1_Q,.$O\3#A+_$@T1_R(=(?\_ +M.3W_+"8D_UY72_]K85;_74] _WQD5?]^9%G_+1XB_R at C*?\W,S7_/CLV_V5: +M3_]A5TG_5TQ%_SPV-/\:%A[_%Q@?_SP_1/\]/$+_'ALA_QP;(?\/#1;_)B(K +M_RTB)_\E(AW_6EQ3_U-15/\;&"3_&1DB_UE<7?]77%;_6EQ9_QD9'/\9&![_ +M7F)@_V]Q;_]D9&?_&!<>_QP;(?\_03__*2DL_QD5'?\=&2'_/ST__QT:(/\9 +M%1[_%Q8=_S$P-O\;&![_'!H=_VII:/\B'RO_(!TI_U!+3_],1D3_*B(>_R@@ +M'/]/2D7_:&5 at _XF%A_]85EG_24=*_Q44&O])3%'_1DE._SP_1/] 0TC_/D%& +M_T)%2O]%2$W_0$-(_T%$2?\_0$?_.CM"_SP]1/\Y.T#_.SU _ST_0O\O,33_ +M*RPM_RPJ+/\I)RG_*2_\6$17_&A49_QD4&/\8$Q?_&!,7_Q\:'O\F(27_2T5#_Y"+ +MA?^+B83_'Q\B_V)G;/]26%K_2DY0_S4D/_;%E'_W5 at 5/\I(27_,BTS_T1 0O]" +M0#W_55!*_U%,1O]'0D+_.C4Y_Q\;(_\7&!__4UA>_U-26?]/3E3_5U9=_Q at 6 +M'_\[.$3_,R\X_UM96_];7%;_6%99_QH7(_\9&!__6UQ=_U]C6_]@8F#_&!<= +M_QH9'_]?85__8&)?_UY>8?\8%Q[_%Q8<_T5$0_\V-#?_&!0<_QT:(/]K9F;_ +M;6AN_QD5'O\<&R+_;VQR_QT:(/\C(23_5U57_R8@)/\L)"C_4DU-_UM65O^ +M>WO_A8""_T1 0O\T,C3_)"0G_Q\>)/\;&B#_$A$7_R(B)?\H)BG_*RDL_S(P +M,_\R-#?_-SD\_SD[/O\Z/#__.3M _S at Z/_\V.#W_-3<\_S(T-_\L+C'_*"HM +M_R_R at F*/]>7%[_>G5P_ZFAG?]W_U157/].3E?_1$9._SU#2_\X.T#_.3Q!_R\R-_\I+#'_*RDL_R\J+O\M +M*"S_+2 at L_RLI+/\H*"O_)B8I_R8F*?\F)BG_)24H_R at H*_\G)RK_)R%!?_,2DL_RPG*?\<%QO_% \3_Q40%/\4#Q/_%1 4_Q40%/\4#Q/_ +M%Q(6_Q,/&/\7$AC_&!,7_Q at 1&?\3#!/_%Q$5_Q40%/\1$13_$A 3_Q(0$_\1 +M#Q+_$0\2_Q 0$_\-#Q+_%1,6_R ;'_\5$Q;_$A 3_Q$/$O\1#Q+_$0\2_Q . +M$?\1#Q+_$ X1_Q$2$_\8%Q[_&!0<_R$='_\1#Q'_2D9$_U502O\C(B'_$Q$: +M_Q43'/\M+#+_4U15_TU05?]665[_7EUC_S M,_\<&"#_%Q@?_UYC:?]B86C_ +M8F%G_V-B:?\8%A__%Q0 at _UY?9O]@86C_8&%H_U166_\;&B'_&!<>_V5D:O]E +M9&K_7UYD_QD7(/\<&B/_34U0_S$S,/\G)RK_&QHA_QD8'O]!0#__+2LN_R < +M)/\G)"K_0#TX_T(^0/\A'B3_'Q\B_V1E7_^"@WW_EI64_V=E:/]565O_55A= +M_TY05_]*2E/_2$=._T9'3O]%1T[_049,_SY#2/] 14K_/D-(_SU"1_\^0$/_ +M/CY!_S0T-_\O+S+_+"HM_RLI+/\J*"O_*B at K_RLI*_\H)BC_*2(/\E(2/_)B$E_R,>(O\W +M,C;_)!\C_Q81%?_Z\?'_(!<>_QL4'/\;%AK_&!,7_Q40%/\5$!3_%1 4_Q40 +M%/\5$!3_% \3_Q<2%O\7$Q7_%Q(6_Q,.$O\8$QG_'!4?_Q at 3%_\5$A'_%! 2 +M_Q$/$O\2$!/_$Q$4_Q,1%/\3$13_%!(5_Q82&O\<&"'_&Q8:_QP8&O\?&QW_ +M&Q<9_Q<2%O\5$!3_%1 4_Q0/$_\3#Q?_%Q,;_QX9'_\?&1W_'1D;_R,@'_\G +M)"/_(1X=_Q82&O\8%!S_(!XA_TM+2/]-3TS_3E)*_TY/2/\<&!K_'A +M_QL=(O]A8FG_8F)K_V%A;/\7%R#_(B,J_TY05?]355K_5U)8_R6/]K:FG_E9.5_X2 @O]95E7_6%A;_U-56O]04EG_3E!7_TM-5/]) +M2U+_2TU4_T=)4/]"1$O_1$9-_T1&3?]#14S_04-*_T%#2O\^04;_0$-(_T!# +M2/]!1$G_/#Y%_ST_1O\]/T;_/D!'_ST_1/\\/D/_/3]$_S at Z/_\R,#/_*B at J +M_RLI*_\H)BC_*"8H_RDG*?\G)2?_)"(D_R[U_SXT/O\F'"O_'QDA_QD4&/\6$17_ +M%1 4_Q<2%O\:%1G_&!,7_Q40%/\8$Q?_%Q03_Q<3%?\:%1O_'17YX_Y&1 +MCO]O:FS_5U=:_U)45_]14U;_4%)7_TY/5O])4%;_2$]5_T1(4/]%1E'_1DA0 +M_T=)4/]&2$__1$9-_T%#2O]$1DW_04-*_T!"2?] 0DG_04-*_T1&3?]!0TK_ +M/D%&_T)%2O]!1$G_1$=,_T%#2O]!0TK_/3]&_T!"2?] 0D?_/D!%_S]!1O\^ +M0$7_.3M _ST_1/\\/D/_.CQ!_ST[/O\W-3?_,C R_S N,/\M*2O_)B(D_Q82 +M%/\7$Q7_%1 4_Q(-$?\7$A;_%1 4_Q81%?__^?C_(1,4_RD;(_\;%!S_&Q8< +M_Q<2%O\<%QG_(AH=_QX7%_\=%1C_%Q(4_QD4&/\6%!;_%Q47_Q,0%O\7$QS_ +M&A,?_QT7&_\A&AK_%1,5_QP9&/\Z-S;_/#H]_T5$2O])24S_3T]2_QT9(?\C +M'";_(APD_TE&3/]'1$K_1$)%_SDW.O]$0D7_3DQ/_U%/4O\9$AS_&Q0>_RDE +M+?]45EO_55=<_U577/]<7F/_7%YC_Q41&?\:%A[_(B$H_UE87O]56%W_6%Q> +M_UE;7O\8%1O_(!PD_Q<6'/]14U'_7%I5_U=63_]345/_&A8?_QX:(O](1DC_ +M/3XX_TE*1/\I)RK_(AXF_R0C*?]:6US_6UE6_UY85O^!?'S_ at 7Y]_UY?8/]0 +M5%;_5%=<_U-56O]25%O_3E!7_TM-5/]&2$__0T5,_T1)3_](25#_2$=._T9' +M3O]*3U7_24I1_TA'3O]#14S_24M2_TA)4/]&1T[_0T1+_T)$3/] 0DK_0T5, +M_T9)3O]%2$W_1$=,_T!#2/]$1TS_04-(_T-"2/\_/D3_0T)(_T%#2/\Y/$'_ +M.T!%_T _1?\^0$7_.CQ!_SH\0?\Z/$'_.SL^_S\]0/\5$Q;_)2,F_Q<5&/\T +>,C7_%Q48_R\ "MR L]0 +G@ "_Z Q?0 ,P #2# V!@ +M-XD #D+ ZC@ /! #V3 _%@ 0)D $(< !#GP 12( $:E !( +M* 2:L $LN !,L0 3C, $^V !1.0 4KP %0_ !5P@ 5T4 %C( +M !:2P 6\X %U1 !>U 8%< &': !C70 9. &9C !GY@ :6D +M &KL !L;P ;?( &]U !P^ XT 'T0 !^DP @!8 (&9 "#' A)D (8< "'GP B2( (JC ", +M) C:< (\J "0K0 DC ).S "5-@ EK4 )@U "9LP FS( )RS +M ">- G[, *$N "BIP I"@ *6E "G)@ J*( Q8 -VP #UX +M !#? 27 $]@ !56 6UP &%D !G: ;70 '. !Y@ ?XP +M(68 "+H D:P )>H "=J H[0 *G "OS M=@ +O@ #![ Q +M_@ ,X$ #4$ VAP . D #F, [#P /)$ #X4 _EP 01H $*= +M !$( 1:, $H &MM !L\ ;G, &_V !Q>0 LP H#0 *&L "C* I*< *8F "GI +MJ2$ S9 .7 #]\ !%> 2VP %%< !76 76 &-D !I; ; +MW@ '5\ ![A @9 (>< "-I D[ )FD "?K I;@ *O$ "QT +M M]P +WD ##\ R?P - ( #6% W" .(H #H- [D /1( +M #Z5 ! & 09L $,> !$H0 1B0 $>G !)*@ 2JT $PP !-L@ +M3S4 %"X !2.P 4[X %5! !6Q 6$< %G* !;30 7- %Y3 !? +MU@ 85D &+< !D7P 9>( &=E !HZ :FL &ON !M<0 ;O0 '!W +M !Q^@ 8 'F) ![# ?(\ 'X2 !_E0 @1@ +M (*; "$&@ A9L (<> "(H0 BB0 (NC "-)@ CJD ) L "1KP +MDS( )2U "6. E[< )DW ":M0 G#0 )VU "?- H+4 *(K "C +MJ0 I28 *:G "H(P J:( " @0 ($ !_ ?P 'X " +M @0 ( "! @0 ($ "! @0 ($ " @0 '\ +M " @0 ($ "! @0 ( "! @0 ($ "! @0 +M ( "! @0 ($ "! @0 ($ "! @0 ($ "! +M at 0 ($ "! @ ($ "! @0 ($ "! @0 ($ "! +M @0 ($ "! @0 ($ "! @0 ($ "! @0 ($ +M "! @0 ($ "! @0 ($ "! @0 ($ "! @0 +M ($ "! @0 ($ "! ?P ($ "! @0 ($ "! +M at 0 ($ "! @0 ($ "! @0 ($ "! @0 ($ "! +M ?P ($ !^ @0 '\ "! ?@ '\ "! @0 ($ +M !_ ?P '\ " @0 ( "! @0 '\ "! @0 +M ($ "! @0 '\ "! @0 ($ "! @0 ($ "! +M at 0 ($ "! @0 ($ "! @0 ($ "! @0 ($ "! +M @0 ($ "! @0 ($ "! @0 ($ "! @0 ($ +M "! @0 ($ "! @0 ($ "! @0 ($ "! @0 +M ($ "! @0 ($ "! @0 ($ "! @0 ($ "! +M at 0 ($ "! @0 ($ "! @0 ($ "! ?P ($ "! +M @0 ($ !_ @0 ($ "! @0 ($ "! @0 ($ +M "! @0 ($ "! @0 ($ !_ @0 '\ "! ?P +M ($ "! @0 ($ !_ ?P '\ " @0 ( "! +M at 0 ( "! @0 ($ "! ?P ($ "! @0 ($ "! +M @0 ($ "! @0 ($ "! @0 ($ "! @ ($ +M "! @0 ($ "! @0 ($ "! @0 ($ "! @0 +M ($ "! @0 ($ "! @0 ($ "! @0 ($ "! +M at 0 ($ "! @0 ($ "! @0 ($ "! @0 ($ "! +M @0 ($ "! @0 ($ "! @0 ($ "! @0 ($ +M "! ?P ($ "! @0 '\ "! @0 ($ "! @0 +M ($ "! ?0 'X !\ ?0 '\ !_ ?P 'D !\ +M?P '\ !_ ?P ('J^!0C'!P6&1T7&!08%A<6'!\;&A48-CU*3%(A +M)B1,2D4Z14]2'!XM6UQ<8V,9'BA>75Y>&R0<455/4Q\B2#A$*B8I7%96?'U@ +M5EQ:6U=43TQ/4$Y.55%.3%)03DM,2DQ.34Q(3$A(1$A(00-% T&+/D 6)A at U +M&"@5$Q4!% $6 .WY$QL4%A(7&A<5$A04%1 3$Q<:$QDW.D1)3QD<'$9$0C=" +M3$\2%"565U=>7A$6(5A87%L5'!936E91%AI&/DHG'B-;65A\?E]45U544$U( +M14E)1T=/2D=%2TE'1$1"14E(1T-'0T(^0D,\0#] SR+.ST3(Q4R%242$!(! +M$0$3 .W_(2D;&Q<<(AX=%QD6%Q,7&ATA%1PZ/$5)3QTC(DE'1#E$3E$9&RE4 +M555<7!4:(EE56%D8(!=17%=3&AY(/4DI(B1:6UZ!@5Y05%-23DM&0T1(2$9* +M24A#24A&0T) 0T9%1$!$04,_0T$Y.T ^ SJ+.S\5)1'1Q!21H>'1@<'R B)"@9&!U+35!15!<9+VE545$<(QA86%M4 +M&QM86ULE(1Q?1RTB*%)YD6]74E%03DE(1$5&1T9$041!0$!!1$$^0D%$04$] +M0$ ^/SXY/3PZ/3(3$_3!L=)DY13$\<)AU64DY6(!]65%(E +M(2!A8F8<)UE-3U10=UU76%976E984U!03D]034=)1$Q(25)&2$A'2T5%1D4] +M-3 J*R at J(R,G("P8$QF!75DQ+2D=.2D='149'1#Y .T- 04H^/S\^0CX^/SXZ,BTG*R at J(R4I(BX9 +M%!@!$P$8 (7Q'AP:%P44C!,6%182&1\7$1(2$P,4XA4:(1H:'1D6%!03%QL? +M'1L?(QT:'"%(3$I(&B$>4U=45QT at 95]C0QXB:6ML("I56E at C(UA8:96"55M: +M65=44E102TU-3$I*1DA(245&1D=$0T0_,RHK*"@I)R0E)B$A0> +M2T]23Q at 7&%9:6544&5]>8CP7'6)B81(2$>,@$? 1$ A?LF&Q<8!16!% ,7[148-!H5%!$2$0\-$!\;%A43%!(3 +M$A,1%Q at 9&2U%/188*5)-45(G(!U;8UUG&1I:8FA%%1I?9&(2&V%>81\ +M*%I@=F165UI13$I%2$5%0T5"/#U!/3X\/#@Z+"DN*BHG*24H)28G(B4F(S/RXD*CA )")? +M?91H6UU74P-.BTQ(2DA'0T$W,BTL RN%*"DH*B<#)@4D at 2(!)@$0 )[P%"DG +M%P\0#Q 0#Q(/$A,1#!$0$1 0#P\0#Q,;$Q ##[L.#PX2%Q0=#T90(A$3+%10 +M65TM&!AC86%B%A1?86%6&A=D9%X7&DTS)QH80"L<)#T^'A]E at Y5E65A02@-' +MED9#14-"0#XT+RHI*"@I)B_!XQ+!P4%105%107 +M$Q<8&!,7%1$2$A$1$ T5(!42 Q'4$!$0$1 at 8(1%*52,3%2U3359>,!P77F)B +M8Q at 77F!@5!L8965?&1Q-,2<;&4$M("= 0B$?9(*69U553DI(1D5!/D ^/3X^ +M-"\L*RHJ*R at I*"DF)24F!22!(@$F 1( EOD;&Q<8%AL8%144%Q4;$QHE(RXA +M%!0#$X42&&P6$P,2Q1$2$1Q3.!LS1$%+&QPY.D)8630C'VQN*%YPG71>7%=.2T!!-S$L+@,L at 2L#*8DH +M*RHJ)R>JEW6U1.1#TX.2\I*R\M+2LH R:))2 at G)R0D)2 at G!"6!* $B +M 2T ]?,F&QM[%1D8%Q<>)4.%A")L6E Z,"TI'Q at 7&!$3%!(2$1(2$11 &QLY +M0T=4)3-"/4I&0CDC'UY95%T?1#A;5EDC'UU;8!T?7U]A'AQ#-QP at 9FX>(G(@ +M)%X)"-"%Q9$-!0:9F at 5&VP:(54@)$U6 +M>X! ,B0>&A$B)BDP-#D[/#LZ.#&!=%-A@=:VT9'&\=(U]96MA-RDF)"4B'AD7$1(2$2$])$M60%59(BDU-D])130>'T1"(2$6 +M*R<=4U0D(EU661P>8&]G'B$_+!TA/R >'38>'6 at K*4]$'AQ%8(=92AI13D1( +M1DI-2$E'0D1 0$(T+2PI*0,H 1T!% "@]"(7%Y :$Q,2$A,4/)&8Q+FSM+EC +M:F V*28C)" ;%A0##I at -'3DF5V%/9&0>(S,[6E=,-A88/SP;&PT#(H1<41 at 9 +M URS&1AB<607&T$I%1D]&A46,!@::1\=2T8B($IEA59'%$Q)/T-!14A#1$ [ +M/3L]/S$L*B:UU\?BTH-SYE85<\&A<\/1X<#R8M)5I3&QE95UH9&5YO +M9!@&1F/CMK5T\K 5T)_7E _,"LU,RLF&!(0 +M%AD\2%5C5DY-3U\P/5),140G&U(<%1P>'2$J3$LG(6UL9B F3#TS'QL]$AT? +M'4P;&TP;)F8Q(VA@)D8$Q,4&!,=%AN5E-G3T,B_5D*!7U-",RX[-BTC&1,,$!E#4V-R +M95Q;3E:&!@9'!4:&!^:F=;/T,W+8D=_8E-",RXX-"LC'!81%2!%5FV &AD8'TA*4D8@%UYB:!T;0C at M&!8\#108$448%$P:(V8L'VA= +M(T8A)%!%1A5B4$Q)248_0$TU,"TK*RHI)P,I at RLI*@$; 1D ^_(\(8Y0%Q at 6 +M'Q at A%AV+E-R8U2Q\H1U=+4551 +M2F,3%!T9'RPF6&PA)E]GAQ<<@WYF'QE'$AX>)%L6)UL8+F7WU83TU224=)141%0$5$0$)!0D$_-@$C 1@ ^_4^'XI-%!43&Q0@&!^1 +MF\_+R$%4<(6,;%DH<7WU8 +M3$I/1D)$0#] .T _/3\^/SX\,P$@ 18 ^_,\(8]/%A<5(QD=%AN0HM76U=/- +MGA09&Q at 9'A8E,D!",BXA$2!$1%QZ4T)36AXC4FUE:V523FH5%AH6*EA-:&X> +M(%-AB107 at G]C&!1.%AD8&%03(%D3*&0T'V=A$U<>(V4<%D<@9()=3DI/1D!" +M/CT^.3X]/3\^/SX\,P$@ 1H ]? /3\*Q@;+1 at 6%!X4%2D>CY[3T]73RZ,8&1@<&AP7$1T;)!Q )14>259I +M>%A%4F(:&')E;6IS56E:$Q45'T5;2I:&)"EB?(D7&WMO8AH714\;%1HY&11' +M#QQ0-A]A6!-8'A\[&!06&1(J2E)T7%A+1T9"/SLX,P0N at RLK+@$K 2 ^_4J +M''^5&B!G&!<5&!(3(1H>)SLL+"DV1U!&-B](31(3 +M8UAA7&I65&89%A,9.2TE=84K95943 at PD/TTE(QU 3AP<-%T>&TD;*$LT(DY2 +M%UD?%Q 8%1H<%Q\A'2$@4W1;4U!-24A)2$E(2$1#0 $\ 14 ^_0G&7Z4%QUE +M;!4G%"B+E,W1S-# FA<8$A84%Q$-&QD at +4$P,"L\45Y00#I34A 0:6)N:W=< +M7&P6$! 904,W?8*#PK*R]!5VAB4$5=7Q40;FQ[>81C8'$>%1(@ +M5&%4D(\K8%!03 %A$:&"$;$QL= +M'" ?4F]534I#/SX_0$-"0CT].@$V 14 ^_4U*6J0'2R4>QL?'1^0CL7/S\;' +ME!<;%1<8&A,3&QP<)CPO*"TD/4EJ.#$[5A4M/5AC9W!>5V at T'QLB'BP>JE\O +M:6UA7#]#-%46$"$TB",F.V49($PC("'B4E +M1W5B55%*2$5#0C8V.0$T 1H ^_(O(VJ2&2B5?Q<9&QZ0E&A0;&R4E1W5?3DI#03X\.S$Q +M- $O 1D ^_-(,!IE(R4=&18?&BZ(CL7+SL[%ER$;%A<9&A,2&AP:)CHO)RXC +M-#D]$AP9)#A-65%;8&AG6& P(2(B&!H5PXH87&=<86M?/T\6$A$B$1&Q45$0\4$Q42$Q$3%A <$1\V56=,3$9#0$1!/0% 3D ^_A'*Q]O +M)" @(14:'RZ-GL_2U]S6H"0=%A<9&A,2&AP:)S,T12:&9Q +M>H5Y9FPU("(H+48XU)0>76%:7VE=/4H1#Q8W3" 8-%Q9,% 2(!<6&Q8@%204 +M'AH:%A07%A at 5%A06&10@%2,U4V5*2D1!/D(_.P$^ 3D KO8H)HEM*1FUL1L= +M%Q6-CL#/U,[!EQP5%189'!,3&AL;(S at S*"\D0#M534 Q+B4$&U%Q<5$XV5Q<_4 +MTL:7&A,3%!<:$1$8&1DI.C,L-2E&0UE1138L(A86%QLE=EM<9CT:%S(<,R6] +M>1DJ.DLJ8GX2M1T6&B:X6A at W.APJ010C$0HP%! <%1 .$Q01$ \7$ \6#A<0 +M$A,1$ATJ*U!*2$=&04!# 40!0@#[^RRM;=W-*@'Q<5 +M%AD<$Q,:&QLD-2XF-"Q+26-92CDP)!@8&Q\L@&=B:4 >&30G2CG*@R L,T at I +M87T1LQL6'"F]8!LR.!\H0!'!84$!4=$Q<9,!HE,C,D/"AO8G]L +M;7!UR4E)B H&6@@G!<:'2/$:",7%Q(8*QT@ +M$Q8U#18Q.!H;%QH6%187%!81$185%AL9&1$3."LG'"6'C+W,R<[!FR,4%A07%A45&",;)CPR)S at M8&I33EU,/D!/:F9O +ME4]$'1HH4S)NM24 at 0$M32TZW(+,>(QP:&Z A'.?3TD?'",^%D^.'"4\ +M2%9-3+(8M!X?'B&Y6!82$A 6'Q45%!,1$Q(W,AT:$@,7A0\@%Q : Q2/$Q,4 +M$Q0041]N9H543$5( 4H!1P#J[#0K12LT'519)B(F,H>/O<_+SKFD2Q,5%!<6 +M%146'AHD.S,F-RDR-S)J=GV!GHR,D(U>@F(P045E9H9QQ."RA'M!("]&>L(C +MOAP>'!*FAA44%141%104$A,6%!4A%Q44$AL:&1,>%1L5%008C1H>&1 at R&IR# +M5UU>7$@!3P%3 );P-"I'+3 745LB'20SCIC"TS\C,TAZP!^[&AT:&*F +M#Q$2$@X2$1$/$!,1$AL/#0P/&!<6$!L2& \/ Q*.$Q49$A(P'9R$7%U<6D8! +M30%0 /O_.RE--38:66,G&R8VCYC$V=?:Q:I/%183%Q85%18>&B(X,",U%PL, +M""L>*2<^+#)%3DR7=S at _2&IJ=3M]H'AUA$,;+4-UN!6]'!H>%;>;%!$4%! 4 +M$Q,1$A43%!X3$1 1&AD8$AT4&A(2%143$1,7$1,R'Z&/:&9 at 7DH!40%2 -/T +M*24=)$HF(2 <'QQR>X^USM+-N:1#%!88&A<8%Q<;'2$T-B Q'R(?*%557'>- +M at F]Y;XF!5S\R*UIZ;9.VV[FK+#98?6HMIFC#$Q0<&JE\%1<5%0,4I1,3%!,4 +M&TH6$1,3(2,D&$45$1 at 6'BLT.5!D&QT at 0:JH:F6"9V4!5P%" -/T)R >)D8@ +M'B(8&AIS at IBZT-/.NJ9$$A(5&!46%149&R,V."(V(AP3$3P:6F+#5:@&LLI&/ $1,:(:]\$102$@,1I1 0$1 1&$<3#A 0 +M'B A%4(2#A .%B,N,TA:#A$8/:BJ;V6"9V4!5P$^ -/_+!XA+DPC)BH=&!QV +M at YB\V-[9Q:I'%A<7&A<8%Q<;'1\Q,QTX)!\6%# ?("\[+1XL+GR>;$4N*E^! +M75EOGX.A,S15?FPIH%["$Q >([B+%Q84% ,3I1(2$Q(3&DD5$!(2("(C%T04 +M$!02&BVR+<&P!7 %# -/Z+3LZ(%4ADZH]%1H:=XNUS\_+ +MMJ<@&!04&1<8%Q<;'R$T.Q\Z)AX<+"-2E[R@@V5Q9'EV6D5&,HAV)G'"V%@,3I1(2$Q,.'%5-%1,0$1L8$@D3&4I&11 at P +M.H-1;&M[;Z"50E7+44,!%0$: -/Y)B\T(E$;D:PY$!@;?I.ZT=#,MZDA%A 1 +M%Q46%149'2,W/2$X(1T6&B)8C[&8>%=E1WN$94=%-H]W&5JPQ;>Y-3YIR8H8 +MCF.D$S,BAE\=%Q0;$P,0I0\/$! +&4]'$A -#A at 5#P80%4(].@\I-7Y'75IN +M:)Z71U/*4T,!%0$6 -/_)RHU*%<>EK0^#AH>@)6\U]O7PJTD&A43&1<8%Q<; +M'Q\O.!PT'QH1%Q=#>99\7D-(,GF6<$M",8YZ'$&!F8RJ.#EDS8\)>KT-#+J*D6%Q41%0\2$A04.",X.1TT(A\:&QY9 +MF*.9;6)O0GUU94DE)91L+BNER\S 1R=DR)09NTRW&V,4'2$4#Q8@&Q /$!01 +M#P\+&3L2#Q,0%B(5%A44%1LTFS'7 at 8)"L7$A<;&!,6%!$2$1$0'CPE&B03&BT> +M%Q5+)A84$"(<("@6;2J5?3P=/C##,TD!'P$; -?T-!&!XY.QPV(B8I)AL[B:R6AFUT07Y_;4(J)9 C7XV3 +MD7VP52H8RIL0#+$-4@!&P$8 )O_.1!>&5=)'F5=T at I(Y\9-EME75"J7RP4 +MT* >L$*R&G,5'B44$Q8:%Q(5$Q #$:$/&Q\4'242&2P=%Q5-*1H6$B$1&"P? +M9!N, at 44A/##/,$@9>+)B&%K>WJ!8&XL+X-@,L#-M\"\8R0PQYHLJ3&K +M%VHQ12D9%!07$Q0;& 02H1$?01\+)1L:)2$=(F at C'R,=,#I%'2=J#I\K'!8_ +M1;5*, $8 1D ^_,@(1Q!:0TF*B$3%U9 at FJ.%G9!Y>!04$@\4$A42%"$:&S8\ +M'#LB,"PG&QY;9XJ.:G!+?(-K<"LRCF(GJ+&6HK-B(C+)FBJF+*T88R0Y(A,1 +M$100$1 at 5#P\0$ X9(PT+(Q47(AX;(&8A#Q at 8)28](B]K#:(P'!A#2KE,+P$4 +M 18 ^_\H)"$_=! E-2<4&UMGH*6 G))V>!<8%Q$6%!<5%B,;'" +M%2)45'1[8%DN=YEU=BHPCVH,<8-B>;-N)"[/GRRF*K$;8B<\(101$Q82$QH7 +M$1$2$A <' H0*!@9)" =(FHF$Q at 5&AXY)S5L#*0U(18^3,5'+@$9 1@ ^^XB +M%1H:D2LJ)R<8(GE0DXUND'=N;1 8&!<9&1H:%R 5&3 W&$ <$5Y<)ALSG8MU +M77!Z?H)-?B$O at HUBJ<#HD[UW(3_'H3$R+U892!4B(AP4&!42%R 7$A(3$A,8 +M0S 2%2XJ,R\Q)AP_/F,U8,&5P^$YTD%1=,3Z(=&0$F 2X V/DG%AX=FB at H,2H5(GY; +MHY1ND7IN)QGBA\OAZE0 +M9'F;6[R"'SO/J#$O*EP=0PD=(!D0%101%A\6$1$#$J 5'1$1%RDG,"XQ)AY" +M(DH4(TH+(6%#&*(J&A5)4*P9& $H 3 ^_DG%QYTF!4OLYD9'A)!EGYF at VIE +M91<=&Q@;'AP8&AH8&2\[&3P='S!L)!XTIZ1Y3V]\BW)6C2,=AI*WO-CB2(.3 +M(5#"J3H\3T,>@!H<'Q87&1D=0"(<(A$6$Q(9/58V(6='+R%^3A at F)#% @Z V +M%B8=%J4N(Q1=&"P7%@$K 1@ ^_HC$1UWEQ,MM9<3&Q))G8-OC71O;147&!89 +M'!H6&!@6&"\[&3 F%BDV%!\MI)UT4FI5>8!@DB(;BIVJHL3-.X.8'DK IC@[ +M3D,=?AD9'!,4%A8:/1\9'PX.#P\0(BH<&$P^)QJ!3Q8B$B,U;8$D%BT?%J9=IBI*HB='DO%KCHX2SX:@A at 9 +M'!,4%A8:/1\9'PX4%!$2&"(6&%1 *QN#4AHG#1PR9W8?'3 at C':TK'Q1B&S,; +M%0$I 1@ ^_<_)!$1,='(U!D'A>95]@8!@<%Q8:'185$AD7&2T]&3P> +M&1EA)Q\=2J1\5FAW?6UNGB(?A96O:>3<)W][)&"]NS$_/50RH@*A(. +M#PP1(24G-51^$!(-314;0E1%J"$?C:B1);.U$XJ#'EF_O2PT-$PDE!D6&A 8%1X>0RH@*A(4% X3%1H< +M,F* #1404!D at 0U9CIFX6&3$?&ZD4$P]BFST=&P$M 1H F?=(*B PMADGJ;<< +M$AD;CWDX.R\W6A at 7%1,#%=\3%!D9&"@Z%S at A(BUE1C(^,J2I=6-YD'Z!JAP> +MB(QFB.6C7H&4+SJPP6EG>XF1HQ46'1,:$1D@(2(<'!(5$A$;-E!*-WR%&B<; +M428O)1LJ=S59%!(4$HT8&!=8FS,?'0%# 8, F?A$)!\TMAXF/H!,3&A 7#A8='A\9&0\-#@X2'B,E&4]Y&!H94B0K(Q at E +M<#96#A 2$H\2$!5>GC(<&P%* 80 F?],)1XOOQDDL[H;$1X?H8 T.2TU71 at 4 +M%!,#%=\3%!D9%B$Q$BTC(Q\?-C<_,YF9;D\S=(B&K!L>C9U(1Z]T1(29)S"P +MPV1<=(21J!@5&A 7#A8='A\9&0\3$Q 4%1D;%&5^$!H=52 at P)R(R>4%@$106 +M&945%!==GC$<'0%+ 8< GO(^(QIWM1H6'Q at 9(H8DC7PT*QLO41 at 7%144$Q05 +M% ,9VBAI1K at X!80BF>QX[%NU[#0LM< +MDADH'!8:$R$F*QP>&!,4$A,A,$M!.WE]-BMY0Q8L2$0_AE2=&Q at 3%X\.&!9@ +M9C%1\V'RHP+39P3U%0.T]HLATK1<95545&QTBB8(L)B,N31H7% ,7 Q3=%AD7(S(2,B 3+&4S&"4K'3R$ +M9(6+EGVR)!R!E9.KLF5*@J38F*N\N->TPFZ!+1T?%1D/7%4F(24>%!03$A<^ +M44(\.G)>:HY+%C C,CA_2Z 9&1 at 6G1<6&'B1-B07 4,!O "8]D\Z)2"N%156 +M61<<'"F4B"PF)C)6&1$1 Q3@$1(2%!<5(C,2-1$8(3 A'RHZ(D>(0E= 3F>N +M'QF0G(ZDHUA&AJ75F*J_N=.VPFZ"+AH<$A8.6U0E'B(;$1 /#Q0F(QT@'F9> +M;9--$B@=*S%Y2Z 7%A(4GQ,3&8&6."(8 4T!O0"8_U4U*"2Q&1IA8QL=*BB5 +MAR4?'BI*&!83 Q;@$Q04%AD7'R<++0\;%QD>(2P\)TJ"(RP<+4G &B.0GHR9 +MET +M,CI^5*D<&!,9I1 at 5&H&9/"89 5,!P "8\'8A$8*F'!QH9!4=*ADS/BTG&RI' +M'1H6 QG@%185%AD5(BX7,"43*6A(0R$C,RLZ8H61DW>I&AQ^E&ZXU28\HZ32 +M at I_ LM6ZQ'F%'1P:%!@6$$$@*"8A%103$!(]44 T.7II9X),(T!+$3B-6ID< +M%Q at 9HC,;)79U,"$4 4$!Q "8]'8:#H2G&AAI9A4;)R ]0BTF'2Y0'!03 Q;@ +M$A03%!<3(2\7,Q88'C$S1B0K,#,]0%=&2U^E&A>0H'"URQX[J*3/@I[%M-*^ +MQGF&'AD7$145#T ?)2,>$A /#0\E(1X;(&YI:H=.'SA%"C&'6ID:%!(7I"\8 +M)G]Z-B8: 4P!P0"8_WT9$(BJ'AUT;AH=+Q*D2W$R*-HWC!TAPXM:G9?9O*NMS(SGZ)'Q<5 +M$1<4#C\>)R4@%!84#P\<&Q,6+VED:(E2)#Q&$3J,8Z(?%A,[M85M+!\;%QD/$Q,D +M'QT:%1,3$18K13$M8G5I57Y+&5:$?WZW?)T9'2$9I84\+7V5/1,5 2'>Q?)T7&AL7IX$Y+H::11 at 8 2T!N #N_Z$:'C>V +M%A\>%1<4=QR*>34Y.3M"$AD5%187%!87%AD8'2(@+!,<"QH90$ K'S8W'RD: +M*SFQ%B:*I6CJZ#EYU:78C7S(O>#*OXIQ+AH6%!@/$Q,D'AP9%!44$!,8'Q$: +M6&1D5H51&E)_?X"VA:8$'(FMACLOAIU)&AH!- &^ /OZL"(B'XD-%*2G%1 at 8 +M(I-C045%2$85'!09&A at 5&18<%1 at A,2DL+!DA=#@E*C0Y*S!3A(Z5=)@?%W26 +M5]C=*+NCH=&+:LVUU[ZRBEPQ'QT7&1,3%"8A'1<4$Q,4%1LN("(M-3E334X8 +M5#$C+&]$I146%!.G>C at MC99#&R,!(P&X /OZL2(@'XH+$*BK%QD5))9B0D9) +M34\4%A$6%Q42%Q0:$Q8A,BDL'1L5.Q\F+3LX,S8Q5D1-49 at B%'N:5-?<*L&I +MH&A01#P\1$AH=$1$:+3M64E 43BL=)6E$ +MI1,3#0^G>#8PEIQ*'B$!(P&U /O_O"&A01%!03$A<:#1 at E)S94550942XB+FY-KA at 5#A2L +M?#@PEJ%,'B,!* &W /OMH20=@+$0&18D%QIF')X^/T)$2$P6&1H:'Q84%Q4= +M&Q@@,"0N)R I=4$@1BY,*!U,='V4;ZL@&W&=.]O='97'MM":7LBPT+BOI$T= +M)!L8&A,6%"LN(!L8)C= 32D;,692.TU;;&@=3B(2+FY3I!<8&AXK&1H9G9Q! +M/4,!1 %S /OQGAX:@+$.%A8D%1=B')T]/T)&3%,5$Q87'!,1%!(:&!4>+R(J +M'1X=.B8E43M9-" O2C9+/Z\8(72C/]O<()?'N<^97,BRTKJSFTT@'185& T0 +M$2DK&Q83)38_3"88,6A4/E)@KR(I_6N=N85L^ZVL*[I5(B'A07'! 3$RLK&101 +M)#4^2R at 6+&90/%=L?W(>4"$0+&Q +M(' 7$J.K%1@<)JV\@55-2TD7%A,;%184%Q4<'1LA+BPK+",Q>SXA,#U+1B%) +M=7V0:9 at A&U"1,M_:*\_0=LZ?2\^HT+>9J"\7/2,8-S$8;$$F-*(C7DE /EA+ +M5XBAL+.NISTA5WI[@;&?IA<8(" S+BTB)1H4,#,!/ $O /OPI1L;(' 5#Z.K +M$Q4:*:Z\?%%+2T\5$! 8$A,1%!(9&A@?+2HI)24F0B0C-D563R,L2S9'.9P9 +M(5.7-M_9+M'0>GR\:.",:.B\6;40G-J0E84Q#05M.7(VEM+BU +MM$,:3W)Q=Z>?IA45&14B%Q<0%0P,,3X!2 $V /O_L1X;)749$:JR%Q,>(;'! +M=TE#0DH7$Q(:%!43%!(9&A@;("(C&B,E)A\G-4=632$5( DF'+$5)E.<0.[O +M,-G?>]N?1=.MU;RCJ30<-1X6.#,:<$8H-*(C7TI!/UE.89FWR-'1S50C57AX +M?JZHKQH7%Q0C&AH3&100-#\!2P$X /OOKA@:<#@4&1\4&1I(.+G;TM3(P)0= +M&!89%!H6$Q4>'!@?+BTL+R5-' B03) /D1(KZFHH):LHC,=2!4=(T UFA at 8 +M%QP9)3,R+R at T,"T!*P%3 /OSJQ(7<#@2%A\4%Q=)/+O;T=#(PYH;$A,6$1<3 +M$!(;&14=+2LK*BLN02L?)CU17ADD1#-).Z8D($N<,-;:--#/EL^A3,FFSKJ\ +MLRTP1IN6.Z4OK#Z:.G8H23I(1DQ0M[*QJ:&XK#<90A,;(3XWFA85$1,,$AD8 +M&!(:(S(!,@%5 /O_MQ47=3T6&"8;&Q5*-,/JX.+9TY\?%1,8$QD5$! 9%Q49 +M(",H'24L)"4C)#]171 at .&08H'KL@)4NA.N7P-MC>FMZE2M"LU,#$O3(R2)N8 +M/:DSKT"<.74G139$0D94RLK)P[S5OT,>1QXR"JZD58?C:9 +M**(D5SL^/%.2II^IJ:2G*SP@*4-%34U&1A<8%!@>'BHK+S0\+!L!(P&' /OV +MM!X4&1\=$RDX&AI&.+GAD&@+ZDK8$1' +M15^>KZJRLK"S+SH=*DE+4U-(1A45$@X0%1,1%1L:&!P!) &# /O_P1\2'20A +M%31#'QI$,,/QY^'=V9XC%A]>P2MNZRL7&R2S >K$]BDYEC$2A+JHL7D!#05BER<7* +MRL?*.SX?+4A*4E),2QD5%Q86%Q85%QHA'AT!)0&( /ORMB8A/B,6&WZ-&B$_ +M-;76Z<[7TQC6$RWN9:FR,&]%!Q=)#\O/CH] +M8&!+$ \4%Q$3%!(U,D8!10'( /O_S2 60R46&HR:(2 Z-;_P[>/:X;(_+RXM +M+2XO+2XT,BXO)B =(1LP)2@?*2E*.C87'Q >*I]#)RN?,^OO*\_DO,FW3MNT +MR=;0S2C)T\$YH2NT0XZ at 7:Q"7TE at 54G#U*R_X=K3&Q]?)CLL.SZ3]&TL\/(QB7$S%,XO2=] +M/+Q8GH]M1%5-2&&XT\?*U\,6$!0B+1,Q/Q8A4W"%'10?&AD0%B4P)2)[(K'B2<,>[Q.62U^L+Y8XLSBC2S)-24*^ +MS\BZDS\6&!@5+!(;)188*$N9/\R_V#P_0VX\*2H!+P'( /OOM#PH%A<3$YVG +M%!8J-[#-T89E7$\V.C8S-C(N,2TM+AXC)2 at Q0!<=.RT9'ALW2$<9+3= *50E +M(!HB)MS<0V;)LJV^3LJSI<6EO"VOT"B<5&JV.Z(_NC^I5#Y954W'U<^_ES\0 +M$A03+1,9(Q09*$F5"Z*SHQ$>)F,[)B,!+ '* /O^QCXD&!@5%:*O&18E-;7< +MX(]J74DK+BXJ*B8B)B(B(Q8;'2 O) PA("0:(Q\Y2DP5'!TI'UHH'QXD*.;O +M0VO8O[?$4=.]J,JQQ"VWWC.A5&K -IU!NT&N5#M64D[7].K6J4 at 3%1D7,!8= +M)Q@<+4Z;#Z>VKA0@*6(Z)B0!+ '2 /OM:!<;5D0:&Q0,%A<8*Z;+JS8T.3,] +M.SLQ\!W&[XUHZ,HI3.)-#AD6H._OXX8( \,'!\='2TT,S,H%1A/ +M.[90/T1Q9I'8WJDG*1(1*S(Q+RXR,3$J%1A.%:%FIQPC6S,Y("L! +M90'( .3T1BDE&QH>("$?'!HA&14KRE)!/STY-#$I)2,C)B$?(R8J+2TI92D8 +M3D4@(R8F)RTS-CE!.4YZJ[Z42MW6=-7(N7:Y(\!1.[]?N"FLRU(2$N-Q$:(BL@'A\B(R at P,C0\ +M/EB&M,&F1^3R>=K9T(+$)L)0-+]?O"N[WF$VR6<_PSFN;#IT:8!W="X@$Q$3 +M&!@7-SLT-AT15$S,M04HR/CUJG+W)T<_2ULR_(S"0 +M5=O1= +M1A,3&!,7%A0=/C9SC%U%E3Q)FBP!, &( .'F+BLK+38K.#U"2%M<9VY\S\8Y +M*2LR+2LH("D5)1$A(2,G*BT];R,F*3,A.#]LGK[*U]?3V-;))"N74]O4=H3C2[+KYW>7EV.CD5)!P@ R:7-1H at 1Q 0%1 4 +M$Q$:0B=>D6-%E#Q+D1P!*0&/ /OP0CG9)RB at 6.3L>M'8V2._3H.: +MF\MVP2JZX+#!:#RJ4S; ,L%Z>W]\/#0/(!LB*",7(QG_#*OV^W(+'.=TXVNGLP +MKDQV>7)Z=&8=3$L;&RD\4SBL]WRGZ.R&^_([O>?T\ZP7TQLTUX at 7=^ +M>VP?4%,A("X\4#0?&Q(<&QD:%A at 8%AA016"Y+IZ?(RB))P$G 30 ^^-M9V5: +M6U=85UQ64TL88<7-)QHD(ATL&BT?+AHO&24D*#$Z-4NM6H_?VLO:V-;8V]C7 +MA9=\TT=5+X]OW-)./\G,A+)VI*"ZUFAV-7&)::!@B%#8M +M3V=?12XI,AX;E9N>J:JRM;^]6F"O,)HP-'>4,@$E 34 ^_"=FIR4E)"/DX^, +MD'TO8\71)Q4?(!HI&"L=*Q:.Q,#6\GR2596YF=!T?%STS4V5B2RXI +M+1<9DIB;IJJRM;_.8%FS+9(L,G6)(@$> 3, ^__,RLO#QL+!P,#!OJE&8Q2 +M0MCFFLLJOXYWQEZ (K'@A*BU,C:]I".9<75K>2 =&3XP36=B1BDB*A@;FJ"C +MKK.[O,3$6UBK*Y8Q-G>)) $= 2T A^YA<4-=5EL#5_%210U35\#/,SA%*RLU +M+"X>,ADP&3DB("TR-C;.U]31U=;9V=/&WY5 CH&*S5HU]ULX?F<''5,$F +M/74U4S<,!Z#"N$<[3*4])J1J@'Y/*D!F7TTJ0RDR*A\@'"0RB8^1B8:"?7UW +M*&J[-I$7$(.!.@$R 58 ^_2;GH63D)61D8R1;!M38,?.,3) *2 at S*BP<,!8K +M$S,?'BLN,#3)S]?9VMG:W-?)XYDS5#-3PE 8>)>"T\D=E\#'6"E91A+SAA8E,R3"XR(QD;%Q\MEZ&CFY61C(R$*F&V,HX6$(5Z*@$I +M 4P ^^M2951=8F%>5FD@%2 H3+S6-2 B*2 K.B\=+QHV0S G+S$YR-+4VMK4 +MU]C7T:\<,6\ID8B(S%]G)Y"&ULU!P#F7"HO"@RO8^.B%Q103\^ +M,3=#/B(S+RXA)R6E923F:I=(6$IX1Z) $X 6X ^__%P,_"RCM]OCR\_?V[,8E+V80(20C +MO5]H'Z*0W=DZQ=[).AP>)R0<&2 8%W&+GG2KSBXOQY^;D5U..34Y*2\^/",N +M)RD=(1\K8G)M:&!85%!13V:O>(B&J8I_)0$X 6P ^^YDH)V=F9N$BV-:1$1'0DD\,"H"SK8*$)P$E 6P ^^EN;69I:%MI-T$4'8!\0,3<."4=,AHG(S%#+Q4N'VS2 +MW-S8W-C5UMG45B(?*AX:*QHH at I"(R(T@'W]_PL6UP+^_2RXG(QLD-AT;%RR\ +MM3)WB!T2'$Y586-?7EE&&QT]'!X[+3$T,34IS];5W=[AV]W;NFJPE8&[J&N# +M-0$P 2D ^_*HF::;FI"2'R(4&XF!2\G;-Q\7,!4E(S5),A at G%V7.WM_ +MW]C76B at G*"0A,"(=3$9-PI09&HF$PL2UPL3$3"PG(AHD-A at 9&3+!N3N$C2 4 +M'$!%2T=#1D(\&!8W%ADW*2HQ,#(ET]O:XN+EX.+BN6*KC7NUI6=W) $I 2< +M^__?Q-W'SL._0#$-'9F-3M;Q-" :+!,A'#!$,AHH&V[=]/GX__CX]_'Q;C$M +M+"TJ-2@<'2 at FO98D&(^'R]V\R-'962 at B'Q+>W=S at U7BTFG*QJ7]D- $X 8T ^_6EIJ2AE90-&"HI +M/$HT-<39.R at D,AHS/C(F*1AFM];7W=[>W]O/S]#4$0S%T'GU7&OE&RKHWU<)@$Q 8P ^__9S=K*Q;T?(# J/$\Y/=3M +M-B,D+18Q/RTB)QULQ.[Q]O/Q^.[YXE(=+!QK("DG,R<8/3,MQ)X=&8*'R=:\ +M:M',;28B-B9*.T<[(!_6QAH>,2H6+C$Y/3 F$3HN'2LL82PW("PD*R8MY^_R +M]?CV]OC_YG*MF7&PJ():'P$P 8L ^^MQVMC7 +MD8VPGV6KI7 =-@$W 9\ ^_"KHZ.GA1L3"1,S-"D7*[W;/B$?-TLT&24@?\/8 +MW=_=WM[BXL_%1$%%02"3,5T>,S L5EE-OK X%(1^O,:N>;V]0!4:)Q<8'!0? +M+S4Q.3D;+R$J/CXJ*$^5J7XZK3]"S30])#,M/1X6T-W;W-O=V=K9CH:KFV&G +MH6X2)@$N 9T ^_WASMW:K2 at 8$!@V.3$;,,OM.1P@,4'8/"T[)Q>?(%L7&R,2)RPQOJY &8& QM6Z@<;)1 \8(Q,4&!$>,3DV.#<< +M)B(=+3$E'D66KG'98]43H;(B0[4$.B +ML69^WJ=-MT,\QD%$(3L@*"TDS]/5X=S6U\C92XR at I4BBH'0(AQ6TVJBB8?'3$V*R8<&Y0W2S03)!XN0#NBHE=[X)D_ +MN#T^R#D_(34:(RHAT]C9Y.3=W,S70X6;HT:@GG,G* $L :4 ^_S=RL:N.1XK +M*!P?(!H=*<[S/SEA-APG+YBFT^_E\.WL\N*RN$;6-#0[.!^Q)4,Z'!8@%R^8%*PB"$<&2TR)R4>'YDX1B\7("$A,#FIH$U[YI(VPS at YS#(2$9&A\@=T/3>RHDABM27GQ.1VQ&3'MTQU\Y%6U- +M6[RN2H2'438U*RXF%QL?'80V.3$7#Q\P,[O:CE9^WDU+MTP[T#HZ,30S(KA[ +MR74O/]1XC&[41VU(FQ>8I6\Q.@$X :H ^_*CEUP;#A$1+ at T4$PT/*+O6HF49 +M(!0.%PT=&!P?)",<&1TB>471:R893A]B-'-5,&(P'SPZM6,X$G907\*O2(6# +M3#$P*2LC%AT=&X0S-"\3$ALF++?;?4QXVCT]NT8_TC,U+RTJ';1XSGTU1.&' +MFG?00&9#F166HVLB* $O :8 ^__9P'T=$109-! 6&!02*\7PJVLC)1D3'!(B +M'R,J-#@N)R(==4/66AH6)AIR'7-6(EPI"R(HN%TW%'129]&Z2HB(2BPM)2DA +M$QL?'XLS,2L8%" <(+WH?#QQWSUWH93+=^.J6C2/S9#F"*5EVHE(0$T :T ^^ .(B = +M'1 at 8%R$P.$!'5[33>3H9#Q$66FE;1EE4%!T1A:.SK*ND?!\CBR-(,2L5*SHL +M*3UYOX8K%F0?+G^:%R)\A1P:%A<4'UE7-7Y/?X4X(&9IKKEN0T2%VE)*LCY! +MR3M*0#LS,;.PQF [3==N?EO(041#D!Y<,FXQ,@$V ; ANT?'!H>&0,4\AXM +M-3M 4;G;?#87#P\46&570E50$!D-AZ6XL*2Q8B 96QM3&!P2'3,7%1M!J8(A +M$V4B-(6<%2> A1H7%!05)EU3,H!1 at H@\&V-IK+IW/D.(V#T[MCA#RS1#-S H +M+;.KTVY)6-QZCV/$.CP]CAQ:,&LF(P$S :H ^_\L'QTA'AD9%B O-SD_5L;N +MBD4I%A,87&M=2%M5%1X2C:V]N*7"4B,31AE>$QH2%BH5#A CHXHI%68B,XZB +M%RJ(C!\9%A08,658-(A5@(8W&&-NL+UW.SA\W#DQOC,^SS)"-RTE([RVX(A2 +M8O&/G&G4.#@^D"!>-&TF(0$S :\ ^^@8&Q<4%!(7.D!+1DE-2+G/=AP9%18M +M2EE*$B$P/QD3J*F$:&:89!H<4!U)*R@:(#(E'C%KJ)M"&D :&D"9&"H]+A$9 +M&BIF2:6^)%V3W'%1/5514%9"21U^VU5#LT\[R3)%23DT);6VSE0[0\]@<5C& +M2D9*?B$=(&HC)@%/ ;$ ^]<:$@X2$ X3-SU(0T)%0K_7=1 at 7$Q0K2%5&#ATL +M.Q4/K[&);&.F1AD7)AA8&!T8&"P6%APZEYL^%CP8'4B>%BM +P\5&RQI4JJZ +M(%^7WG-/.%I635)-2AQ^V4 TMTD]RRL^0"XL)+:RU%U&4=1L at F#"0SY$?!\; +M'F<8%P%, :T ^_ at 8%A at 4%1,8.3]*14!#1]#MA" <%Q at O3%M,%",Q0!H4NL6@ +M@&NX,Q at 2(Q5<&AT:%B,6%!@BE*1#'$$:&TJA&BQ ,A,:'BAI8K?")6>?XG%+ +M-E]B3UA-2QEUW3PJOT0XSRD]0"LF&<'"XW506^M_BV;403I%?B,?(FD8%0%, +M ;( ^_<5%1 at 5%!<8#31'4U)D3:_.?AL9%188% \,'AD3'Q,=,Z:IKKN.>58? +M2B%')B8:'3(B%"=!4;,F'149%A].(2$E0B%3:8@=;K#+(5*[W80Q(6%L01A. +M,#MSU5%)MDL\PRU#3C8^([6VR#TV/M%475/'344Y<",<'G:,/@$X :\ ^]@1 +M$0\2$!,2"3!$34=91[72?QD8$Q06$@L(&A4/&P\9/K2RMK^;6U ?)AY6&!T7 +M%"P6#1H:1KDH&1$6%293'R,I1"-1;(D?>+3''52]VGXJ&V5S/!)6,3AQUC\[ +MND4^PRM 1RLV(KFTSD,^2-1A/[W O,>J2%,:*QQ8'A\9%"43#!H, +M1L F'A86$B56(R$D/Q]3;HH=B\C6(UK#XH$H('%^.A=8-#IMV3HQPD YR"<^ +M1B at R%\/&UU)"4.QP=F'513DV;R4>('6 + $Q ; @NDB Q?V%A(6&"Q)/U16 +M/JM>/V19%D2B&"-'@FUE97X<))5X65J(92<<-"A;&BHA*38\(2 N*8,='B at Q +M'APK,D L*G>7AMH=3\/:+3RUVX<^)&A at 4&(\72&,VT]4K4Q!H3="3D0U++BY +MR#TS0--(4T7&3(EW6E09'FY]0@$V 6T ^]L8$!(5%! 4&BY%-TA)-:Q=0VI; +M$D">%!]#?FEA87H8*I^!8V"-4QD9(2%A$A\6'BHP%!,9(808&"4N&QTL,T$M +M+7V>B-4<7,C5*3RWV(0Z&V1E5F=!7R*)W4!&LD9 GCI&2#DJ*KFUS40[1]-2 +M9$K 1X1Q4E :&&IM*0$N 6P ^^TB#Q :&149(#)*.TM).;EK2V]?%T6C&25) +MA&]G9X >+ZF/:W&20"$9(R!F%A\6'B,2(@-#@V,"PR'QPH*& H'RX^.CD;/$ D'T!?P^ J*\#@(R^T +MV)I9'REE1UPE8%:0V5)4L$Q$S$%&4#\R+K>SQCTV1M-$347*6;YJIB5FHG"# +M1@$X 5\ ^]@C(#$S/4I003Y$.BDS-BO(GW!D&!L-:Q<[%5,0'V,7'F.)FGN< +M4!,;'ADC*RTK)2$G%! 7'5TB(C-#/SP>/T,B(41DR-LG-<;;'R^UU9=5&"AL +M3V,K9%F.VT-&M49#R4%&230J++BOQC\Y2-!'4T;"5+EDGB%GG&QS+0$P 6 +M^^(H'C,W04]51D%&/"HR.#+5J'9I'2 2/T,D'S]GS>HG/=?S)S2XX9=+%B=M2V(J7U&* +MX3\\ND% RSA!2C$H),.^ST,[3MA'4$G34;9II"9JH7%W+ $N 6$ ^]DV-#E' +M+" A*S(Y.38V02M<2&1Y&Q<<'!E:'!@<)20@#I D&!I!3B06)SEDP-TR-TU-1 at 4E* +MS#Y*1#<_,K6SSD!#5\=.65K%4KQKGB6BGFF!0P$\ 8@ ^]HX-3<_(1H?*S W +M.C,M.2A=3VY_&1,8&!56&!08(2 <#I$D&1E'0Q,5%"PS)!TA'!80$0\3&BTZ +M/3L[/2\<&!H:%QN'R-(U41#AD-)R3A%/2PW +M,+:OT4-'6LI175V_3;=EEB&CF&5Q*@$T 80 ^^<^-CD]'ALC,C4[.S,M-RIJ +M6G:&'A@='1M<'AH>)R8B%9XS)"=..!H4%RDQ)!TA'!00$Q,6%R@\/ST]/S$> +M&AP<%QB+T.DI-=3O+C&VZ9A8G!-.>U(2%*22X@'A\>'B8K/2$\ +MM-DH,+'@)BJLRJ%OKJ$L(RYMPFF1TU)2J4P_OSQ%1S,X+W>RQL7'P<*VP+7+ +M6ZU8CB2>FF1^00$] 7D ^] 61QY,+QT<&B8K,2]!.#C)O6YM%5M,$AP?2%1Z +M*A Q%Q@='1 I10H1$"0A'!<<&B(;%!,2%!E)2RT?'1H7%A\E.B$[N=4@,K;= +M(BJLRYUKHIDF'29FMEV+U49$KD4^O#8]/BLP+7FORLO-RW>+0V-'?4Z57BB6BFV5P)P$S +M 6X H>0K2#(X+" <%QHE,SPW-RQ;8SY&'Q<5$A8A%Q09$Q49$P,AC!(2'2(7 +M'QTC(QT<'P,FR" 9&ALN,QXH*RHP,#$K,B1-2,4M*IW@)2FSRJURBF2%7VQ1 +MI7:"SW1&ED9#O#1"4CDS,WS!BY:(EY^AEZ;#7[A;>2:6C5IZ10$] 6( H=0= +M.B F&Q46%1 at C,3PQ,"A=:4E+'1,1#A(=$Q 4#Q$5$0,?UQ 7$1,.$Q$7&A85 +M&!T;&Q40$14M,!LE*"@N+2\J+R)(2K\F*:+=(2>PT:)GAEQW4EQ*DFB TV<[ +MGC]!NB\[22XH+WR\DZ.6J+&RI;+'7+!5<2*9BUAK+ $T 5T H>$YZVV at PH$ [OBPY +M2RLE(X''I[VPP;CUUK*0$T 6@ ^^,A(R,K&A&QT@)"Y"9BJ::B20BF*$20$Y :@ ^]D8'!PC$A,=(!H8%A<@/""9KH8I +M& ZI%6HB53&.7'P.$"$B&@X2'C41#Q$4&!L<%QX=&! 0$1(3(R \/!HY2XED +M?4!AH]HE+L':'B2 at P*E,=82&>)"0C3R$T$U$7CLW99((3%28G'PX6$B at 2$A07&QX?&B ?&A(1$A,4(1XZ.A0W4)1K at D)CI>DK +M+LWR)BFPP+HS9F]N67)O8BB"V$XY7#HSSP\3-P\G@=*E? +M9B65C&5U+0$P :\ J><:)A\C)2HP%QL5$Q =0R(Z)A8@&AM+&!4:*!H8$!H6 +M$QHD'!P8*C$B R;/(R0E,#$S&A86%1L;*4,O+S%92!,;.C!&G- at H);;6*2^I +M>KMBC\IIA(?&;$]ZTE5#*E5 ,S%"44 W)Y'"IY>5E9N8EJ#!;[9.6R6+AF-U +M1P$[ :, J=P1'QL='R0J$QD3$1 7/!XR(!4;$Q='%!$6)!83#!82$1 at B&AD: +M&AT7 QO/&AL<)RLM%! 3$A02)$ L+"Y610\3,RQ&HM at F*KW3)2VD at K%4B+U7 +MD;)B B)"%!P7%ATG'QL>$A87 QO/ +M'!T>*2XP%Q,3$A44(CXJ*BY40Q<7-#%+J>LJ+T8"YN +MWDDM+$T[+R'A@<'B,: QV#*S$? Q?)%A07'"4: +M%EXP3"H at 0AL7'!9?O=HF(:;+*"RW=[52D<0]08',:$9";$LY&R0Z&BL\2#8U +M):*WFY23BXB%:'S28ZM%11M_95]=)P$] 9 G>4T+1XJ(R$N'QX8&B8E02<8 +M%Q84$!H9&1(:$QL; Q';%APC(QTC'"@>'1T<+#(@&!H:&1<7'28=%UXP3"X= +M.AD5'!-CQ.HJ)[+C,###;KL_D,(W.7K4:#P\=$PN$2(X%28Y23(T(*O&K*JH +MGY>7>XKG8ZM*2""":61=(P$\ 94 ^^'AT@)"8C("4\6BL1&UUW0!HE1B=> +MLM$O)H*Y+S&YAUQ[_&SM77U-G> +M7'$@.R!'&V$P. $Z 8( ^]$F-C,C%!0\)"PT4EDW,B4=(!T@)!PA(R0>(R$A +M'!\?%1TB'QH<'R$7'BD@&Q$2$A07&QT:%QPS5"@.&&!Z/Q<@0"9;LM4G(XNW +M*B_"=<%(CL4^.W[6;T([4E$\'1DV/C\_3C0K)&BPR,/*TMG:U]SB7FXA.1U$ +M&%H?)P$X 8 ^^0I,#8C$Q,[*RX_6EDT+28B)2(E+"0I*RDC*"8F(20D&B(G +M)"(C(1 at 0'BP@'A87%Q89'1\:%QPS5RH0&F!X/!4>0QE9Q?(W(XG+-3'.;\P[ +MD,HT+WG;;3(M5%(R&14R.CH]3# E(6N[T\W4W.7HY>KV7&PD.Q]&&EL>) $T +M 8( ^^\U7S\H.3 C6FZQP&Y83B<>&AP<(1HB)RH?(R8E(B at F+R0@'!\^/XR- +M*" >(1PA)B0I(RH[+TXE'Q00#!@[$!<0+C-C2,,N)#A:,S:U.\-4FLA95'-K +MCE,_/F(Z1#]%0T<\0SPW*26 at S]W:W.'>W-W:;2DPD24B(5E . $\ 4\ ^],M +M43 =*B$44&NPN650224>&AP<(1HB)RH?(R8E(B at F+R0@'"$_-6=L%!05%1 5 +M&A<<%ATR*$<>'!$-"1(X%!H7-3A?0<@G'T)9+S2^*\1#E\A*17-P?T! 154L +M0CU#04$Y0#0M)">+?X>;CX>+8:R8UDB,@'U(O)P$Z 4T ^^$K2"X:)AT0 +M5VF^Q&5.1BHE(2,C*"$I+C$F*BTJ)RTK-"DE(1],/$-4#1<7&!,8'1H?&2 T +M*4@?'A,/"Q="'A at 6-B%-/]&1,5'1H>&!,Q'A\<'!HE)Q$?)!M6LFDY +M)$>%?:XQ*+JZ/">^2LI%B<-,0S9*A2XR/TXE-"XS*RXQ+3$P)"@UNK2OJY^5 +ME8UX131.;ADE85&!0R'R >'APG*1,A)AQBPV,>"AYD6J,V +M+;;,1RG*1-4XB\A"-RI, at R0F04\;,"HO)RDO*RTJ(20UR,;!O:VAH9F32C93 +M;AHF8E at H) $T 4@ ^^,P*C8B$QTP1R_$TFE;3B4>*"(?)"(J'B8F(R(B)1<2 +M&AH8)AUS7$,Z*",F)2$R.BTA(1\@'1 at Z&A at A+25$<'JGIX^(1ELG)ZFZ62^X +M=M%:4!:T8I&@$Q 44 ^^,J'R4C +M&AXG'A>>UDY+2#$@'"0?(RPO)RLD("0G%!@9'!L;(B-G+Y#09R4L."8A'Q\= +M("(F'2([F*%.:$2+KF'GDETRFKHQ+J2O>2.PC +MST,\.BH@'"0?(RPO)RLD("0C$ ,5VA<8(B%M/9/%6QHA,B,>'" >'!P?&1LS +MD:%/7S>#JEK=@4DJEL L**FN8VK6TO4S8LZ.!Z*>28H+@%2 84 L=XH("$B&Q\H&QFEVD,\0#$G +M(RLF+#4X,#(K)RLK%14;'!P@*R-R1Z'28AD>,R4@'B,#(<R8E*P%3 84 ^]TP,",?)2 S.AHPV41.1C,?("8?,2TQ +M'1HBT(2,B'QHE(28KHJ=\7$!IKVCT3X_3$(F'AX;+A at 4%A4;)"0Q('5<(R F)B5??I,H +M'1L<'B =(1<;&4^,3B5)6,7AR2U1V-S8J58T=:Y%)&HFC2>F&F]-)TY at 3AH2 +M+ADP)$ ]+1Q,%R(Q-S8O*RL_J9?*=W.M6TG:T\E$.QY:+BM11P$[ <\ JM0J +M(!(8'AP?'BA>T#4P/CLF'AX;*A00$A(;)"0Q'7)9'QPC)B9A@),E&P,:SAP9 +M'1,7&E**2AY!7,+1MQQ#SMW6G$(C;K1 'FLKCB.M'FA&'T!/0 at T %PKJITH\=\-+(6PPFRFX*&E$&S=&/Q )(@XI&S$H)!E)%!LI +M+RXD(R8]OK/FDX[!:5[NY-=%.2-A*RE'- $T =( ^]A&)BA"15\O,RA#STA2 +M1D$?("DJ%QL?'!89'B$D at L-:)!\C*!]C:(5&'!\<(1\D)4>)D:@Q+X5 9+K> +MT;^SU]O4MU8D>:A6'QN(-2*4>3D\158C.)Z0<4HM/R0B%QXDJS,S/C4N)BHS +MK)?#=VZ?;'76S)^R*"XP*&8^20$[ =4 ^\0^(!\W.E0F*!] SS]#.3L<("DJ +M$Q49&!,9'B$HB,A>(AL@*")C9H5('1T<'1L@(DF.E[ Q*WXX9K;6U,.QT=O< +MM5 D>*U3'!R*.1Z9>3$T-44/'61..!L2*1$7$Q at AJ"XN.2XH(2'1L@ +M)2 at PD==J)R$H,21>8HI0(!\C)2$F*D^1G+0V,'\T9+ODX6M;(+DX["[ +M)R\T(%\L,@$P =, ^^)-/"T]*B8G&!LOV4I,0U G(1\D&" ?)2 B)"(F8-)Q +M(" E(B5B8QFX'B8@#AAG&IJWLZ\S(1]%2L?BV%589BP>&1TS@'D>(#Q#TC T0#DR*2PWJKW6 at W3/5R.%QS-R.S*OD$5H +M2@$T :D ^\E+,QXP'QL=$1,GU4 ]-DH>'",C%!P=(B B)"(J9M-O'1TE)"=? +M7A>\'B <#A1C'J"_N+(T'Q"!)24L*BM?61S()2,B +M%1EH**_!Q, U(QLW3'B-P16=30C*$'1L6&!X=%D$>'$M) +MT24S.CH[+3$>V7,-R at UO2I%,3&+?8EO/@%) << AL$U(!(7$P,7\@XD +MQ$Q 04LB'T$L38\M'Q\D)"$HBM1Y&QTD)RE at 6"*1'1<>C)M0(+*#I<\P(1LY +M/[_3UD\XP=C?PST:*C$]%1H>'!UR/E=%0A96#!0.$!$6!BL5'$-'T1\M,S(U +M*"X<>ZW4A6VV*1XEOR at _*3&5A(IF+0%! ;T ^\8R'!,;$Q8<'!(JT%- 05 L +M*TPW6)&+(R4K+2U at 4R>;)!HCF*97++Z!K]HR)1\V/LGBXU$\ +MS.?US#@;,C="&2$E("!Z/$<[.1MI%1,2%A07"C$9)3])UB N,2XP)3 AB\'I +MF''+%R8?QRU$+3B?A8UF*@%% <0 ^^ C&!HA)# [*C19ST5*8%0F&"$_K,H\ +M)AXB'B(EA-"0(R(A)"IB9R*94YR8L)0E)4B/U=@M(B9%0;++W%0U8)W8S$TB +M6$T5(2$<'Q],4&16,"V!5SQN5U\2?Y,#)DQ+T2$N1SLW+!T9;*+,=&72."\] +MGBH],C:%7U;*0$Z ;< ^]HE&"$A&R(M)2Y5UD([4U,P(2Q.O]Q&*",I)2DSB=Z@*"4WN(O)"(W/;S:XE4U8*/MSCP<8E4:(R$<'Q]82$9! +M)SVK=EJ8A80KEJ<4-T))U1PL/S L)!P@L5-*!TC(R$BA-"4(R(C(R=O:B.% +MI;2PMJ,K)C6JT-PP(B)%4F'*>WY]:ZC>U%HA(!\A'Q\A(1HW0U]G50P?)Q7U[9:/AS4X:(A\A'1P>'QLW.T];3@,4(0H4%PT:"Q@: +MBD)(T"Y.'"5!+D/6>*O3A'2[+B4QD"8P(S^+AH-$)0$C :P ^\PI%!LB)3P3 +M)2LY'ST[2E,K."HKE]A9*B J*B at PB=ZD*"WIU:*[SV$D9*"8F(1P@(1Y&04=63 TK,A4A)QDA&"8 at ED1'T2Q, +M&2 \*4C>B<'IF'_7'"PFD2DV*4>;D9%)(@$C :X ^^8S6#,S/3D1)R]=T4 \ +M1&@E)Q\@-<=;'QT@)B(GB]"B)!\C)2YE:2&!LG9BVJ(E("VNQ-HT(B1 1;.^ +MXW9<8ZS4U5(A(20A'AX?(!PH3&ME73=OE#D?&A8Z458HHEY&TC X-#H\-+O= +M=JO+=V?3/R,_:"4N)T1L=H-++ $X 9P ^\XK22LV0#L3+3-ATCDP-V0B)!\B +M/,M;'QX@)B$HCM&B)!\C)3!G:1V,LGQGUJ$F(#.TR-PU(!PU1;._Y&I37:O: +MT$4:'R(?'!P='AHG1F!;32A=;B(0#0D9)S0AI55%TRTZ-S4Q,+K8?[#,AG' +M,QLU9B,FW(R B)"0]9!YE6:64V:PO(ANC +MG-@U-$](B,B(04>KQM018J)3T=(>D<-28Z +M+FA"-5*U79 Z(0%# :D ^\\R5WHL*S,Y/53%TD1/64HG)AXH5LV8(AT@)2,C +M/\B[(R ?(2WM: +M9)0M1P%$ 6L ^\A%;X\_+#I$-$+"V#M 24(D(QXJ7-"8(QX@)2(D1'QX>'1\=0U"Y +MV59"27:IW5)A at M,_D$Y%RRDJB#0P-KC6P;FWL(W$,2$K>)B+>X%@79 J0P%$ +M 6L ^\8N3'4H(#$W*#_*YSL\2T8N+2)V0@(AG7)4H-P$[ 68 ^\\I +M-SJ+BJ]+O9C,T$]+7T,A)"4P7\.=)ATB*B,@@,C!(1\C)BW*?T+XK +M(B:G:=XU)25 at 4Z5DW))8:IZ8UDX\*"0A(B @'B 8-,NXTV0S4W6.TEUU<--2 +MBVA"P2TQFD,_-JJ[EIJ2EWK702LW=KAT[\L("BV;=XU +M(R)51ZMGVXE*7YN8VT,Q)B(?(!X>'!X0+L6TTU4I1VZ.S5%N;I8K(+B,U?,,U(UZ%B(]Q4P%: 8D ^]XM,#A_9J-%JGO3[$H^ +M4STK+S ^L*R G,R\QB=W2)B0H*R at I)A]SC'JGX93$U%=$8&$@("0O +M<,"U)ATD*R4K@)289(!M!A5NARLDM)2>H4MLW)1Y.2IM.UZI87U=Z +MTEH[(B,A(B A)!\A+$Z:S6(]4V6&W%A;7-!(@VA-V34UFTA%/JBNBGV,E'+/ +M/B> ?<4]'B);;7!]>@%I 6$ ^[M.9)Q(&3 N?8G(VD\W4UHB'R,S=\6U(QLA +M*R8PB,K#*2$>)2(5'!=$BF"CSSU,S1UZ&UTQ46;W%^? %K 6 ^^B(IL=<-4;W!)" A'1L5 +M%AHRED:>S,LL(RRG2=DU)!LQ49%!U+-189&)UU%&)24C)"NL(295:WM8T&8_ +M6&-TWU186=12DWM)Q#HRH3] -)V<=UTU>V#(02Y:.2HV(SAV)((B8UX=CTEI7+Y$(Z)AHC0J92X;<\5IF0Z48X)R'B0F+6G(OB8@'R,/$!$3)J5!L,?1+R(TLS_9/2(;)D.<*-&Y2%V0 +ME-Y00"$C)5)B3QXG)D=8@=!@5D]::]E&6S[/1G-H2IHV+*(Y,C22GU]7:6IK +MLLR_8:$C-R2.;%5P?%D"40#[Z%ODXEXT+$1ZCLG=03%$2# J,S>8V-,J(R8M +M+C9NVL\K)20H%!06&#"R0[K3W#0G.+])Y4(F("-"J#3>QCQ6E9OK4#TF)RE6 +M9U,C*RI'9X386$U(573F0U1&VT!P:4>>-"VF-B\NG[%K7&AN?\T2TA,Y1%V4 at G("ZO!TRT?-:1)V$0C'!XOA3K4N%1)CYS453LG*J4V>Y(='!TM+AO%85=0 +M6VC30TLRQD%'84A+,2VD14 Q4L2-?YU=-STG**$I&QT=HB" 44!50#[ +MXV?AY6PQ.3R+?K[@33M).C L+R^/S=(N)"DJ*"=DPLPM)B0J(R,@*!^]>\#& +MVS0D/:I5YTHI(B MB$#BR4M$E:/F7#HM,*H[AYLA(B,K-R#05TM)4VW>0#\T +MS3Q*8$-0+2VJ03LI6M"*?Y]6+CLN,;0J($R'I6=L8X:" 4]3DM#A]1W8U5=<"\B)$HN'I>>@6UZC&)+ 4D!3@#[R&+/TFHM.#U at 9Z++ +M9D170B4F)C%HO<(B'Q\F(R="(+\B'1LD%QL;)B&R-X]DRU\C'1X_ +M0J_*P$I9BIG1<$;4-61RTM +M*S9LR=0K)"8M*BU**LLK)"(K)2,B+B#.<\.XW38C/Y5PVF4I(R ]1;78T4%4 +MD*#C=T8H*JR4BYPE*G]:Q+:\34))1W'B3#F$VCD]5STH%"2[0D$QD=]7-R

I9:VDU2\A)F)TT&HF)"1%.*?0S&-5?(/ CU,J +M**.:=)(4T)[ +M2V!< 4X!6P#[UWK9Y8 J04EJ9T_383EC0RXK+BASO=8K(2,J*S,A),PM)2*Q[$@F*;9"8G(2%5D+\@'1TD*"4<2+\D'"0F'F-17Q^G +M8*J*T"\A($AES8 F'B)&-Z?!S5A5=%2TBUTE)YF?AIX?)BM)H*985U946#[< +M559KPTDW&5%222VY2#8^<\\J)V(P(1T=)5ACS*13/9!F;'Z! 6P!DP#[QEW( +MSW3< D'"0F%5 at D,!RK:JV/T2\? +M(E9JS'TB&AD_.*_&QTU+=E2Y at U(C)YVDBYT<)B9)HJM:6%%(5#_924QIPSTQ +M$DA+1RJQ0#$V=(B& 7,!H@#[TFG7XH4L,T5H +M,276AEJ/8BLN+2MAH]0I(B0K+RXB3\LM(RLM(54 at -Q['4W#@D*EUVVX4H +M(!D^.;73V$-%?EG(B4\E+*FSFJLD+3%"GJUB3$5!3$+E1D)KRC at J$4A)02JW +M/"PP>]HC'%,I(B(D(EIMW;),,HE><9*2 7X!K@#[NTJ.P(@L.T4A'BZP at T1V +M>"HE'QY2,[\F&QXI(2,A>[@D'2,D*5]89QRC2:5LS#4C(S8N7(LD'R-(/):P +MS5I>2R<^?T\>()6^EZT(;'9C%FJ.HZ@;#18=" B(1\>%,$F&!LB*"8B?KLD +M'2 H(EYS912H,)=:S3LB'2HL >,!Y #[ +MQ$5ZU)HM/S86AO"1Z9A +MWD0B'BXR=Z(M(1Y!1YNUVE)$'Q9392DJ.*S9EWDK)R].-X8<#TM 1XG;13O56G-H3SY.Q_CY ?X!_0"BLR89D),H +M/S--1H*)B#I =X!X #[LB,;FI at J0#%+2(B, +M at RI%;2,B)1H<%+\B'1H@)"U*V$9-+;R\O/0G';WN3E >4!YP"BP"LAK:&L at G(B$G*RXMA\\H( ,FU%QG9"*]-YT]WF$C*#: 3*HJ(!D]/8]9X$1 +M+DJ!(34H,:' J+4L)C=.&$X>0$P[3FK4.RE';R4S/EQ+-!R>1BPN,4NKV^GK +MXK^5=^?MT];3/V_J^03_ /N7'Q1NBR Z/T5%?'Z at 2%5@)R(A(!5=P"<>&" K +M)2!PMB(<'BDE96=G':8M>Q;,9RJKB,B-E at B +M'HU,06=)<*-#,&HX*"E"6$4]+65 ,3=*,7*+N6+*3B$;U,\^1DU\S]GIYN%%3DU]W/@$_P'] /N-(CE> +M82,W.#XV>V>P/&18)B0D&AQFP"L>'"8B)2%?J2$>'B8C9&ME&YL;>1:]AQX: +M1TY6JRDF'D at M+B9Q1$M<5%-<0!PFHY:FEE6459/"9+/T1"+2A. +M0SA$*BU&0#\_*8>JPW_(/RW-T!W0'A /N$&CML:Q\Y.C at U +M at FRT-5)((R$C(21PQR@:&28C)2-JKR$<'B at C8VMD'JD=>!>]AB >45Q>K"H? +M%4$F*BAS.SM544M2.1 at CIYVDIR(?+T\F;UY?435*/"M +S8V'AU&/C4_)"=! +M.#@Z)I:MT)/'-Q\BT\,_:EVQX>7GY>8!Y 'H /B<*D%]>R1!0B\RBWF^-D], +M*RLO+"IXTC(@(2\N+B=KN"@A(RPL8F)A(+HE=QC$E"@F6V5BN2LF&3 at G,"9[ +M/S543T5,.AXKL:BXMRTE,$XD;%U653= -RT_)R\Q'!I$/#4\)2H_-#8X)J#% +MYZ/3/B4IZ]5#:%.U^/P%_P#[H"$Y56,A+#4M)'%&CH[LY at E(44[9+ at L("Y<-QDY7#E>7$Q244P='I^# +MF* C(CM>.7!K;%T]3#NC,3U!+B =P!W0#[G1\]86T=+C)"@H9;XI&ADG)"8=7H4@ +M'AHF)%IC;!VE%S= M9'C57 +M,69 at 9E4M0CVI*R at M(B(V/!L:.BD?/"\T,3>3K="3OS0?(=#!7#UYX.+DY>/E +M >4!Y #WMS%)=G\B-C\D)'UMK#)623$H,#,N;(HC9%ME35)D7R(GEH..D",B,59;7UQKNT\YFR5 /BTF@% X +M'CY)(S at H-"Y#07N?NFZZB3$DQK=;:=';V]_=I]P!W@'? /N1(CA19A4X*"4C +M:%*J*E%(*R$H)2*%NR09%R,B(R(Y5A\:(QPD5&=E'9DK5&NJFR C4CUTOB@: +M'#Y"@(X=7$]7149652$IG8R6DQX>+%!455%ELS\ODQ\U+AX@@%(Z&SA$'3(C +M+"<^/H^FRX;#B"TBTKU79\S>Y^C>I> !YP'F /NF+C]D=AI ,"DE:%NX,$Y& +M,"LT,"B-QBX?'RPM+"8Z7R8?*" M4UYB(*HX6G&TIR8F64-VRRDA(#E @I@@ +M6DA-04-,32 OJ:*LHRDD*DE+2U!'V_O_[P_P"_P#[GAHN/5H6*1TI&T5!LR=U5#,@*B$=7JTI +M'AHB)2$?(#(;'2(?(U%F92**5T=;F:8F(C\G;K\H(24V.E@@55936%U<9&(E +M(XZ9AS,@)#%)5V^K9#%!1BA'0B at CAE:&AW\^5B(M/2LX.D)GF*I8I(TJ(\_' +M4E1=9VQW24I)35)055ECS8= +M("Y#4&>B72LT.A at W,B @B%N.BWPY41TG.",R-3]ZH[MPK9(J(\VZ.3]$4UQG +M9G;B >@!Z@#[LR8Y5W$8,B8H'4M1R"AA13 at G,S,K;K\R(1\K,2HG*C\@("ZI40G)BX\1V.B +M5"XU-1HY*AP at C&>*AGPW3ALJ-A\M,S^'OM:#Q:$Q*NG'-#]066!K>X[\ O\ +M^Y(=+C15$B8A*2 V,+,J67 E)"0<&%RA+1P7)"$D'ADC%!TD'2(_:6DA at 48F +M2W^G(1\R+E^^)2 B(CY93CI955Q56U->*!V.FU=W&R0C/U*GH%I-0CI40B at H +MFT>1?EC905,H-#0V-D!$4(:31)TF(B/3LWE/X.'BWN34X0+; /N2'# ^6A(C +M'24>.S>U)DYD*2,<(AYCJ"T:%"0B)!X>*A(9(1TD06EG'HU0+56$J!X<,"Q= +MOB4>'QTW440R3TE.2E!(4R,AF*5:>!LB(SE(IZ!.2SHK0S$=))U3G(E;T3Q. +M(R\O+C [05^8HE*<(R$AT*YR2-C9VM;9S.4!Z 'F )JC*#A(9ALK(RLB/D/* +M+DUG,2\J*R5LLS8?' ,MWB4A*Q8>*28H/V!C(*!@.5^0M28F-2YAQRXC(1LV +M33XN24)%0$8^22$IJ+AJA2(D*#1"L*5)33 at A."@=*:%8IXE=USE+(2TM*BLX +M/VNMNF.S+R F[+MG1^;IZN;FW/H"_P#[E1PH,%(1(1XB'"@7K3-,$A<4&B$?)$5L9B5N.1LQ9*PD(B\A$TD@'B$B,4A6.6I28&)8 +M5V8H((TS?0\A($=)4UUM3B])944Q2*Y4GX=1:< Y5B at W,BLV03E4:65J(2 C +M)=.W7RW9V]O !W@#[E!DH-U81'AH>&BL;LS5'<"XB)2H=*(@P'!%!H0%AX?)D=L9!]X0A\[::TA&R@>$DL@'!X=*D!,,6!&4E=-3%LC(I8\ +M?@\?'$=$2U]M0BU!4C8H2+!;K(]8;;TT42,R+2,O/#9;'BYN;J >D!Y0#UHR,O0& :)B D'BTCPCE";#8N,3,D,9,Y(1\J,"\E&!P5 +M&R8H*D5C8""*4"M%=;HI)B\<#U$I(2 ;*3Q&+5H_24U#0E$A*J1*B1 at D(5!" +M16=R/2\_12PH4;1DO:-7:+\R3R$P*R$M.C9D at WY\+B4C*/#%5S+Y"/\ ^)4> +M)B5)$R <&ADF&ZLL98PS*2,B$C)!(A\9(1XA'A$6%A,@(B4J<&\E8T+AY%=1DE(B)AC4Q3G4TO1%PR6)Q0J(9Z +M1E=P/E8O03,H*$ E $'R,@(230FW9/W>#AY /B N8 ^Y$:)"M-$QT8%A;$XF.U"U)!T=)W5D&!@6 +M'A=$5R921E!'3TY3)1U,>QDC'AQAB498GT$M/$XK6IU6LY*#2EMR-T\J/"X@ +M(3HB&CI%'2$>'R+4G71-W^'BY>GIZ at +K /B@(BDR5QPE'AX;)!Z],5F".#0O +M,1Y"4RLB'BHJ*R44%Q44)2LK*F=I'WQ:,41)R,A<(Y!7:,\+SI%*F"H6\"ECT)3<#9.*#HL'B [)!Y"4"$E +M(B,FZ:-L4O7Z^_X%_P#[C1\@($ .'QL;&B9,IC)N52LG("$3("T1)ALB)2 C +M%!X4$QX>)3AR:2%94"+%5F5&!-66987&4G)6<1)"$@ +M'8S;1E:20S-7)8:C6IQ^BUQ)-%!'6B(_,2LP1"DC,KPK(1\C)*MO:2W8V-W@ +MW^?F > +M)3IR9QIB52(FL6(AX<%HW805N4 +M.S!/'XFG6J2+F&5*-U1"51TY+"0G02T! +MZ@#YE2$A*DH5)!T@'BA3M#)A2B\S+B\;+C\;*1XK,2DH%AP3%"$E*CAI8QMN +M83 [-\'APV +M%1H<'6FE/D at I3DTM(Q\B%AL8$"(<)"(D)A44$AHB(B4M<60A0V$A.ABR*A]S +M%1LA'R$E(2I376->75)N9V-F+2,?(R8<&12TUDI.CSQW66E\=*6-A5A)0S8[ +MA5$J-2 at O+SG@+AZ:'"(JF93(J=/CV][>W^+CX at +C /M\%QL:-!,8&A]NJT-* +M)TQ(*R,?(A(@)1(>&B0D(B(1$! 8(" B*W%D&T]D'3X>MR<@=18='1PA'1 at A +M2%%33DU"7UE66"8?&Q\D&A<2MM%$4I$Y<%!H?WBKE(Q<34(U.XE/)"\C+20\ +MX2@15J7.6]097^ O)^79$ +MW^+CX@'B >, ^VP5%A,H%!884"\N/$ @25LC)!\E$!<:$1(7'R8?(!$6("0A +M(1\D<&H;1V$611IB)!\2&A\>&1L7(CM%44M#3U],5517-B,;&WDA%Q>8GT52 +MBD+5VH]4K*E[3$1'-T*5-3TX%3,[*T[5)AXN;GZ.KKZ@'J +M >L LWT>&!@M&!H<63 at T044B058H*R8L%AH<%18;)BXF)18;)2DF)B +M3F\;0!MG)AX7(@,AOR(;(#D_2D(Z1E8_2$E--R@@(($I'!N>KD-7D4CCY9%< +MO+Q]23\Y+CF.+C9WG at SOSX_ 7_@?X!_@'_ )]G'Q06 +M'1,8&!H?/CM!(59:-"(D(Q05$Q00'APJ'R(=!"'8)"4N:VPC*'47%%A1'!LA +M'Q\C&R(I+CQ-45=?65Q65&>80B$H)$8=&1S2Y4I>@E[:WMKAH7A-04<]2HXY +M34LHHCHV/5?92)"/C8AG9%[3T=78W=WDS\=)"!#&18:U-]%8X!:UMW2X*Z"3T%'.4J1.4Q'(IPU-#)9 +MV$&2E(Z+:61EW=S?X^;FY>CKZ.8"Z@"@;B$3&2 5&AHD*$,]0QY)3C8I*RH6 +M%1,4$B C-"8I)"@#*=$L*BYB92 [AA at 77UHC&B(C("(@*24D+CL\0DI$1SY! +M7I%!(BDE3R@>'MSP0V6"8.CIV.Z]BDTX."]%B3!!/R.?,RPQ7>9*F)F/C61= +M9NWV__X%_X+\^@'^ ?\ M%,?'!H5$Q04'2,W/1@>6U8](!LA$109$A$;'B@? +M)B B'",B'B,C8VHH'82H<$L_23)(38Z2T<_2EE".SZAGC8A'!=#(Q at -GM)=6G9< +MTMG at K7Y1/T-;7'%AY./HNHA, +H.C\A48 at V0SHZ']@V+B]=Z5W at GE]=6%9O[/?]^_S__O__^_X!_0'_ + +end diff --git a/lib-python/2.2/test/tokenize_tests.py b/lib-python/2.2/test/tokenize_tests.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/test/tokenize_tests.py @@ -0,0 +1,175 @@ +# Tests for the 'tokenize' module. +# Large bits stolen from test_grammar.py. + +# Comments +"#" +#' +#" +#\ + # + # abc +'''# +#''' + +x = 1 # + +# Balancing continuation + +a = (3, 4, + 5, 6) +y = [3, 4, + 5] +z = {'a':5, + 'b':6} +x = (len(`y`) + 5*x - a[ + 3 ] + - x + len({ + } + ) + ) + +# Backslash means line continuation: +x = 1 \ ++ 1 + +# Backslash does not means continuation in comments :\ +x = 0 + +# Ordinary integers +0xff <> 255 +0377 <> 255 +2147483647 != 017777777777 +-2147483647-1 != 020000000000 +037777777777 != -1 +0xffffffff != -1 + +# Long integers +x = 0L +x = 0l +x = 0xffffffffffffffffL +x = 0xffffffffffffffffl +x = 077777777777777777L +x = 077777777777777777l +x = 123456789012345678901234567890L +x = 123456789012345678901234567890l + +# Floating-point numbers +x = 3.14 +x = 314. +x = 0.314 +# XXX x = 000.314 +x = .314 +x = 3e14 +x = 3E14 +x = 3e-14 +x = 3e+14 +x = 3.e14 +x = .3e14 +x = 3.1e4 + +# String literals +x = ''; y = ""; +x = '\''; y = "'"; +x = '"'; y = "\""; +x = "doesn't \"shrink\" does it" +y = 'doesn\'t "shrink" does it' +x = "does \"shrink\" doesn't it" +y = 'does "shrink" doesn\'t it' +x = """ +The "quick" +brown fox +jumps over +the 'lazy' dog. +""" +y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n' +y = ''' +The "quick" +brown fox +jumps over +the 'lazy' dog. +'''; +y = "\n\ +The \"quick\"\n\ +brown fox\n\ +jumps over\n\ +the 'lazy' dog.\n\ +"; +y = '\n\ +The \"quick\"\n\ +brown fox\n\ +jumps over\n\ +the \'lazy\' dog.\n\ +'; +x = r'\\' + R'\\' +x = r'\'' + '' +y = r''' +foo bar \\ +baz''' + R''' +foo''' +y = r"""foo +bar \\ baz +""" + R'''spam +''' +x = u'abc' + U'ABC' +y = u"abc" + U"ABC" +x = ur'abc' + Ur'ABC' + uR'ABC' + UR'ABC' +y = ur"abc" + Ur"ABC" + uR"ABC" + UR"ABC" +x = ur'\\' + UR'\\' +x = ur'\'' + '' +y = ur''' +foo bar \\ +baz''' + UR''' +foo''' +y = Ur"""foo +bar \\ baz +""" + uR'''spam +''' + +# Indentation +if 1: + x = 2 +if 1: + x = 2 +if 1: + while 0: + if 0: + x = 2 + x = 2 +if 0: + if 2: + while 0: + if 1: + x = 2 + +# Operators + +def d22(a, b, c=1, d=2): pass +def d01v(a=1, *restt, **restd): pass + +(x, y) <> ({'a':1}, {'b':2}) + +# comparison +if 1 < 1 > 1 == 1 >= 1 <= 1 <> 1 != 1 in 1 not in 1 is 1 is not 1: pass + +# binary +x = 1 & 1 +x = 1 ^ 1 +x = 1 | 1 + +# shift +x = 1 << 1 >> 1 + +# additive +x = 1 - 1 + 1 - 1 + 1 + +# multiplicative +x = 1 / 1 * 1 % 1 + +# unary +x = ~1 ^ 1 & 1 | 1 & 1 ^ -1 +x = -1*1/1 + 1*1 - ---1*1 + +# selector +import sys, time +x = sys.modules['time'].time() + diff --git a/lib-python/2.2/this.py b/lib-python/2.2/this.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/this.py @@ -0,0 +1,28 @@ +s = """Gur Mra bs Clguba, ol Gvz Crgref + +Ornhgvshy vf orggre guna htyl. +Rkcyvpvg vf orggre guna vzcyvpvg. +Fvzcyr vf orggre guna pbzcyrk. +Pbzcyrk vf orggre guna pbzcyvpngrq. +Syng vf orggre guna arfgrq. +Fcnefr vf orggre guna qrafr. +Ernqnovyvgl pbhagf. +Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. +Nygubhtu cenpgvpnyvgl orngf chevgl. +Reebef fubhyq arire cnff fvyragyl. +Hayrff rkcyvpvgyl fvyraprq. +Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. +Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. +Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. +Abj vf orggre guna arire. +Nygubhtu arire vf bsgra orggre guna *evtug* abj. +Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. +Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. +Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!""" + +d = {} +for c in (65, 97): + for i in range(26): + d[chr(i+c)] = chr((i+13) % 26 + c) + +print "".join([d.get(c, c) for c in s]) diff --git a/lib-python/2.2/threading.py b/lib-python/2.2/threading.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/threading.py @@ -0,0 +1,698 @@ +"""Proposed new threading module, emulating a subset of Java's threading model.""" + +import sys +import time +import thread +import traceback +import StringIO + +# Rename some stuff so "from threading import *" is safe + +_sys = sys +del sys + +_time = time.time +_sleep = time.sleep +del time + +_start_new_thread = thread.start_new_thread +_allocate_lock = thread.allocate_lock +_get_ident = thread.get_ident +ThreadError = thread.error +del thread + +_print_exc = traceback.print_exc +del traceback + +_StringIO = StringIO.StringIO +del StringIO + + +# Debug support (adapted from ihooks.py) + +_VERBOSE = 0 + +if __debug__: + + class _Verbose: + + def __init__(self, verbose=None): + if verbose is None: + verbose = _VERBOSE + self.__verbose = verbose + + def _note(self, format, *args): + if self.__verbose: + format = format % args + format = "%s: %s\n" % ( + currentThread().getName(), format) + _sys.stderr.write(format) + +else: + # Disable this when using "python -O" + class _Verbose: + def __init__(self, verbose=None): + pass + def _note(self, *args): + pass + + +# Synchronization classes + +Lock = _allocate_lock + +def RLock(*args, **kwargs): + return apply(_RLock, args, kwargs) + +class _RLock(_Verbose): + + def __init__(self, verbose=None): + _Verbose.__init__(self, verbose) + self.__block = _allocate_lock() + self.__owner = None + self.__count = 0 + + def __repr__(self): + return "<%s(%s, %d)>" % ( + self.__class__.__name__, + self.__owner and self.__owner.getName(), + self.__count) + + def acquire(self, blocking=1): + me = currentThread() + if self.__owner is me: + self.__count = self.__count + 1 + if __debug__: + self._note("%s.acquire(%s): recursive success", self, blocking) + return 1 + rc = self.__block.acquire(blocking) + if rc: + self.__owner = me + self.__count = 1 + if __debug__: + self._note("%s.acquire(%s): initial succes", self, blocking) + else: + if __debug__: + self._note("%s.acquire(%s): failure", self, blocking) + return rc + + def release(self): + me = currentThread() + assert self.__owner is me, "release() of un-acquire()d lock" + self.__count = count = self.__count - 1 + if not count: + self.__owner = None + self.__block.release() + if __debug__: + self._note("%s.release(): final release", self) + else: + if __debug__: + self._note("%s.release(): non-final release", self) + + # Internal methods used by condition variables + + def _acquire_restore(self, (count, owner)): + self.__block.acquire() + self.__count = count + self.__owner = owner + if __debug__: + self._note("%s._acquire_restore()", self) + + def _release_save(self): + if __debug__: + self._note("%s._release_save()", self) + count = self.__count + self.__count = 0 + owner = self.__owner + self.__owner = None + self.__block.release() + return (count, owner) + + def _is_owned(self): + return self.__owner is currentThread() + + +def Condition(*args, **kwargs): + return apply(_Condition, args, kwargs) + +class _Condition(_Verbose): + + def __init__(self, lock=None, verbose=None): + _Verbose.__init__(self, verbose) + if lock is None: + lock = RLock() + self.__lock = lock + # Export the lock's acquire() and release() methods + self.acquire = lock.acquire + self.release = lock.release + # If the lock defines _release_save() and/or _acquire_restore(), + # these override the default implementations (which just call + # release() and acquire() on the lock). Ditto for _is_owned(). + try: + self._release_save = lock._release_save + except AttributeError: + pass + try: + self._acquire_restore = lock._acquire_restore + except AttributeError: + pass + try: + self._is_owned = lock._is_owned + except AttributeError: + pass + self.__waiters = [] + + def __repr__(self): + return "" % (self.__lock, len(self.__waiters)) + + def _release_save(self): + self.__lock.release() # No state to save + + def _acquire_restore(self, x): + self.__lock.acquire() # Ignore saved state + + def _is_owned(self): + if self.__lock.acquire(0): + self.__lock.release() + return 0 + else: + return 1 + + def wait(self, timeout=None): + me = currentThread() + assert self._is_owned(), "wait() of un-acquire()d lock" + waiter = _allocate_lock() + waiter.acquire() + self.__waiters.append(waiter) + saved_state = self._release_save() + try: # restore state no matter what (e.g., KeyboardInterrupt) + if timeout is None: + waiter.acquire() + if __debug__: + self._note("%s.wait(): got it", self) + else: + # Balancing act: We can't afford a pure busy loop, so we + # have to sleep; but if we sleep the whole timeout time, + # we'll be unresponsive. The scheme here sleeps very + # little at first, longer as time goes on, but never longer + # than 20 times per second (or the timeout time remaining). + endtime = _time() + timeout + delay = 0.0005 # 500 us -> initial delay of 1 ms + while 1: + gotit = waiter.acquire(0) + if gotit: + break + remaining = endtime - _time() + if remaining <= 0: + break + delay = min(delay * 2, remaining, .05) + _sleep(delay) + if not gotit: + if __debug__: + self._note("%s.wait(%s): timed out", self, timeout) + try: + self.__waiters.remove(waiter) + except ValueError: + pass + else: + if __debug__: + self._note("%s.wait(%s): got it", self, timeout) + finally: + self._acquire_restore(saved_state) + + def notify(self, n=1): + me = currentThread() + assert self._is_owned(), "notify() of un-acquire()d lock" + __waiters = self.__waiters + waiters = __waiters[:n] + if not waiters: + if __debug__: + self._note("%s.notify(): no waiters", self) + return + self._note("%s.notify(): notifying %d waiter%s", self, n, + n!=1 and "s" or "") + for waiter in waiters: + waiter.release() + try: + __waiters.remove(waiter) + except ValueError: + pass + + def notifyAll(self): + self.notify(len(self.__waiters)) + + +def Semaphore(*args, **kwargs): + return apply(_Semaphore, args, kwargs) + +class _Semaphore(_Verbose): + + # After Tim Peters' semaphore class, but not quite the same (no maximum) + + def __init__(self, value=1, verbose=None): + assert value >= 0, "Semaphore initial value must be >= 0" + _Verbose.__init__(self, verbose) + self.__cond = Condition(Lock()) + self.__value = value + + def acquire(self, blocking=1): + rc = 0 + self.__cond.acquire() + while self.__value == 0: + if not blocking: + break + if __debug__: + self._note("%s.acquire(%s): blocked waiting, value=%s", + self, blocking, self.__value) + self.__cond.wait() + else: + self.__value = self.__value - 1 + if __debug__: + self._note("%s.acquire: success, value=%s", + self, self.__value) + rc = 1 + self.__cond.release() + return rc + + def release(self): + self.__cond.acquire() + self.__value = self.__value + 1 + if __debug__: + self._note("%s.release: success, value=%s", + self, self.__value) + self.__cond.notify() + self.__cond.release() + + +def BoundedSemaphore(*args, **kwargs): + return apply(_BoundedSemaphore, args, kwargs) + +class _BoundedSemaphore(_Semaphore): + """Semaphore that checks that # releases is <= # acquires""" + def __init__(self, value=1, verbose=None): + _Semaphore.__init__(self, value, verbose) + self._initial_value = value + + def release(self): + if self._Semaphore__value >= self._initial_value: + raise ValueError, "Semaphore released too many times" + return _Semaphore.release(self) + + +def Event(*args, **kwargs): + return apply(_Event, args, kwargs) + +class _Event(_Verbose): + + # After Tim Peters' event class (without is_posted()) + + def __init__(self, verbose=None): + _Verbose.__init__(self, verbose) + self.__cond = Condition(Lock()) + self.__flag = 0 + + def isSet(self): + return self.__flag + + def set(self): + self.__cond.acquire() + try: + self.__flag = 1 + self.__cond.notifyAll() + finally: + self.__cond.release() + + def clear(self): + self.__cond.acquire() + try: + self.__flag = 0 + finally: + self.__cond.release() + + def wait(self, timeout=None): + self.__cond.acquire() + try: + if not self.__flag: + self.__cond.wait(timeout) + finally: + self.__cond.release() + +# Helper to generate new thread names +_counter = 0 +def _newname(template="Thread-%d"): + global _counter + _counter = _counter + 1 + return template % _counter + +# Active thread administration +_active_limbo_lock = _allocate_lock() +_active = {} +_limbo = {} + + +# Main class for threads + +class Thread(_Verbose): + + __initialized = 0 + + def __init__(self, group=None, target=None, name=None, + args=(), kwargs={}, verbose=None): + assert group is None, "group argument must be None for now" + _Verbose.__init__(self, verbose) + self.__target = target + self.__name = str(name or _newname()) + self.__args = args + self.__kwargs = kwargs + self.__daemonic = self._set_daemon() + self.__started = 0 + self.__stopped = 0 + self.__block = Condition(Lock()) + self.__initialized = 1 + + def _set_daemon(self): + # Overridden in _MainThread and _DummyThread + return currentThread().isDaemon() + + def __repr__(self): + assert self.__initialized, "Thread.__init__() was not called" + status = "initial" + if self.__started: + status = "started" + if self.__stopped: + status = "stopped" + if self.__daemonic: + status = status + " daemon" + return "<%s(%s, %s)>" % (self.__class__.__name__, self.__name, status) + + def start(self): + assert self.__initialized, "Thread.__init__() not called" + assert not self.__started, "thread already started" + if __debug__: + self._note("%s.start(): starting thread", self) + _active_limbo_lock.acquire() + _limbo[self] = self + _active_limbo_lock.release() + _start_new_thread(self.__bootstrap, ()) + self.__started = 1 + _sleep(0.000001) # 1 usec, to let the thread run (Solaris hack) + + def run(self): + if self.__target: + apply(self.__target, self.__args, self.__kwargs) + + def __bootstrap(self): + try: + self.__started = 1 + _active_limbo_lock.acquire() + _active[_get_ident()] = self + del _limbo[self] + _active_limbo_lock.release() + if __debug__: + self._note("%s.__bootstrap(): thread started", self) + try: + self.run() + except SystemExit: + if __debug__: + self._note("%s.__bootstrap(): raised SystemExit", self) + except: + if __debug__: + self._note("%s.__bootstrap(): unhandled exception", self) + s = _StringIO() + _print_exc(file=s) + _sys.stderr.write("Exception in thread %s:\n%s\n" % + (self.getName(), s.getvalue())) + else: + if __debug__: + self._note("%s.__bootstrap(): normal return", self) + finally: + self.__stop() + try: + self.__delete() + except: + pass + + def __stop(self): + self.__block.acquire() + self.__stopped = 1 + self.__block.notifyAll() + self.__block.release() + + def __delete(self): + _active_limbo_lock.acquire() + del _active[_get_ident()] + _active_limbo_lock.release() + + def join(self, timeout=None): + assert self.__initialized, "Thread.__init__() not called" + assert self.__started, "cannot join thread before it is started" + assert self is not currentThread(), "cannot join current thread" + if __debug__: + if not self.__stopped: + self._note("%s.join(): waiting until thread stops", self) + self.__block.acquire() + if timeout is None: + while not self.__stopped: + self.__block.wait() + if __debug__: + self._note("%s.join(): thread stopped", self) + else: + deadline = _time() + timeout + while not self.__stopped: + delay = deadline - _time() + if delay <= 0: + if __debug__: + self._note("%s.join(): timed out", self) + break + self.__block.wait(delay) + else: + if __debug__: + self._note("%s.join(): thread stopped", self) + self.__block.release() + + def getName(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__name + + def setName(self, name): + assert self.__initialized, "Thread.__init__() not called" + self.__name = str(name) + + def isAlive(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__started and not self.__stopped + + def isDaemon(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__daemonic + + def setDaemon(self, daemonic): + assert self.__initialized, "Thread.__init__() not called" + assert not self.__started, "cannot set daemon status of active thread" + self.__daemonic = daemonic + +# The timer class was contributed by Itamar Shtull-Trauring + +def Timer(*args, **kwargs): + return _Timer(*args, **kwargs) + +class _Timer(Thread): + """Call a function after a specified number of seconds: + + t = Timer(30.0, f, args=[], kwargs={}) + t.start() + t.cancel() # stop the timer's action if it's still waiting + """ + + def __init__(self, interval, function, args=[], kwargs={}): + Thread.__init__(self) + self.interval = interval + self.function = function + self.args = args + self.kwargs = kwargs + self.finished = Event() + + def cancel(self): + """Stop the timer if it hasn't finished yet""" + self.finished.set() + + def run(self): + self.finished.wait(self.interval) + if not self.finished.isSet(): + self.function(*self.args, **self.kwargs) + self.finished.set() + +# Special thread class to represent the main thread +# This is garbage collected through an exit handler + +class _MainThread(Thread): + + def __init__(self): + Thread.__init__(self, name="MainThread") + self._Thread__started = 1 + _active_limbo_lock.acquire() + _active[_get_ident()] = self + _active_limbo_lock.release() + import atexit + atexit.register(self.__exitfunc) + + def _set_daemon(self): + return 0 + + def __exitfunc(self): + self._Thread__stop() + t = _pickSomeNonDaemonThread() + if t: + if __debug__: + self._note("%s: waiting for other threads", self) + while t: + t.join() + t = _pickSomeNonDaemonThread() + if __debug__: + self._note("%s: exiting", self) + self._Thread__delete() + +def _pickSomeNonDaemonThread(): + for t in enumerate(): + if not t.isDaemon() and t.isAlive(): + return t + return None + + +# Dummy thread class to represent threads not started here. +# These aren't garbage collected when they die, +# nor can they be waited for. +# Their purpose is to return *something* from currentThread(). +# They are marked as daemon threads so we won't wait for them +# when we exit (conform previous semantics). + +class _DummyThread(Thread): + + def __init__(self): + Thread.__init__(self, name=_newname("Dummy-%d")) + self._Thread__started = 1 + _active_limbo_lock.acquire() + _active[_get_ident()] = self + _active_limbo_lock.release() + + def _set_daemon(self): + return 1 + + def join(self, timeout=None): + assert 0, "cannot join a dummy thread" + + +# Global API functions + +def currentThread(): + try: + return _active[_get_ident()] + except KeyError: + ##print "currentThread(): no current thread for", _get_ident() + return _DummyThread() + +def activeCount(): + _active_limbo_lock.acquire() + count = len(_active) + len(_limbo) + _active_limbo_lock.release() + return count + +def enumerate(): + _active_limbo_lock.acquire() + active = _active.values() + _limbo.values() + _active_limbo_lock.release() + return active + + +# Create the main thread object + +_MainThread() + + +# Self-test code + +def _test(): + + class BoundedQueue(_Verbose): + + def __init__(self, limit): + _Verbose.__init__(self) + self.mon = RLock() + self.rc = Condition(self.mon) + self.wc = Condition(self.mon) + self.limit = limit + self.queue = [] + + def put(self, item): + self.mon.acquire() + while len(self.queue) >= self.limit: + self._note("put(%s): queue full", item) + self.wc.wait() + self.queue.append(item) + self._note("put(%s): appended, length now %d", + item, len(self.queue)) + self.rc.notify() + self.mon.release() + + def get(self): + self.mon.acquire() + while not self.queue: + self._note("get(): queue empty") + self.rc.wait() + item = self.queue[0] + del self.queue[0] + self._note("get(): got %s, %d left", item, len(self.queue)) + self.wc.notify() + self.mon.release() + return item + + class ProducerThread(Thread): + + def __init__(self, queue, quota): + Thread.__init__(self, name="Producer") + self.queue = queue + self.quota = quota + + def run(self): + from random import random + counter = 0 + while counter < self.quota: + counter = counter + 1 + self.queue.put("%s.%d" % (self.getName(), counter)) + _sleep(random() * 0.00001) + + + class ConsumerThread(Thread): + + def __init__(self, queue, count): + Thread.__init__(self, name="Consumer") + self.queue = queue + self.count = count + + def run(self): + while self.count > 0: + item = self.queue.get() + print item + self.count = self.count - 1 + + NP = 3 + QL = 4 + NI = 5 + + Q = BoundedQueue(QL) + P = [] + for i in range(NP): + t = ProducerThread(Q, NI) + t.setName("Producer-%d" % (i+1)) + P.append(t) + C = ConsumerThread(Q, NI*NP) + for t in P: + t.start() + _sleep(0.000001) + C.start() + for t in P: + t.join() + C.join() + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/toaiff.py b/lib-python/2.2/toaiff.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/toaiff.py @@ -0,0 +1,106 @@ +"""Convert "arbitrary" sound files to AIFF (Apple and SGI's audio format). + +Input may be compressed. +Uncompressed file type may be AIFF, WAV, VOC, 8SVX, NeXT/Sun, and others. +An exception is raised if the file is not of a recognized type. +Returned filename is either the input filename or a temporary filename; +in the latter case the caller must ensure that it is removed. +Other temporary files used are removed by the function. +""" + +import os +import tempfile +import pipes +import sndhdr + +__all__ = ["error", "toaiff"] + +table = {} + +t = pipes.Template() +t.append('sox -t au - -t aiff -r 8000 -', '--') +table['au'] = t + +# XXX The following is actually sub-optimal. +# XXX The HCOM sampling rate can be 22k, 22k/2, 22k/3 or 22k/4. +# XXX We must force the output sampling rate else the SGI won't play +# XXX files sampled at 5.5k or 7.333k; however this means that files +# XXX sampled at 11k are unnecessarily expanded. +# XXX Similar comments apply to some other file types. +t = pipes.Template() +t.append('sox -t hcom - -t aiff -r 22050 -', '--') +table['hcom'] = t + +t = pipes.Template() +t.append('sox -t voc - -t aiff -r 11025 -', '--') +table['voc'] = t + +t = pipes.Template() +t.append('sox -t wav - -t aiff -', '--') +table['wav'] = t + +t = pipes.Template() +t.append('sox -t 8svx - -t aiff -r 16000 -', '--') +table['8svx'] = t + +t = pipes.Template() +t.append('sox -t sndt - -t aiff -r 16000 -', '--') +table['sndt'] = t + +t = pipes.Template() +t.append('sox -t sndr - -t aiff -r 16000 -', '--') +table['sndr'] = t + +uncompress = pipes.Template() +uncompress.append('uncompress', '--') + + +class error(Exception): + pass + +def toaiff(filename): + temps = [] + ret = None + try: + ret = _toaiff(filename, temps) + finally: + for temp in temps[:]: + if temp != ret: + try: + os.unlink(temp) + except os.error: + pass + temps.remove(temp) + return ret + +def _toaiff(filename, temps): + if filename[-2:] == '.Z': + fname = tempfile.mktemp() + temps.append(fname) + sts = uncompress.copy(filename, fname) + if sts: + raise error, filename + ': uncompress failed' + else: + fname = filename + try: + ftype = sndhdr.whathdr(fname) + if ftype: + ftype = ftype[0] # All we're interested in + except IOError, msg: + if type(msg) == type(()) and len(msg) == 2 and \ + type(msg[0]) == type(0) and type(msg[1]) == type(''): + msg = msg[1] + if type(msg) != type(''): + msg = `msg` + raise error, filename + ': ' + msg + if ftype == 'aiff': + return fname + if ftype is None or not table.has_key(ftype): + raise error, \ + filename + ': unsupported audio file type ' + `ftype` + temp = tempfile.mktemp() + temps.append(temp) + sts = table[ftype].copy(fname, temp) + if sts: + raise error, filename + ': conversion to aiff failed' + return temp diff --git a/lib-python/2.2/token.py b/lib-python/2.2/token.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/token.py @@ -0,0 +1,140 @@ +#! /usr/bin/env python + +"""Token constants (from "token.h").""" + +# This file is automatically generated; please don't muck it up! +# +# To update the symbols in this file, 'cd' to the top directory of +# the python source tree after building the interpreter and run: +# +# python Lib/token.py + +#--start constants-- +ENDMARKER = 0 +NAME = 1 +NUMBER = 2 +STRING = 3 +NEWLINE = 4 +INDENT = 5 +DEDENT = 6 +LPAR = 7 +RPAR = 8 +LSQB = 9 +RSQB = 10 +COLON = 11 +COMMA = 12 +SEMI = 13 +PLUS = 14 +MINUS = 15 +STAR = 16 +SLASH = 17 +VBAR = 18 +AMPER = 19 +LESS = 20 +GREATER = 21 +EQUAL = 22 +DOT = 23 +PERCENT = 24 +BACKQUOTE = 25 +LBRACE = 26 +RBRACE = 27 +EQEQUAL = 28 +NOTEQUAL = 29 +LESSEQUAL = 30 +GREATEREQUAL = 31 +TILDE = 32 +CIRCUMFLEX = 33 +LEFTSHIFT = 34 +RIGHTSHIFT = 35 +DOUBLESTAR = 36 +PLUSEQUAL = 37 +MINEQUAL = 38 +STAREQUAL = 39 +SLASHEQUAL = 40 +PERCENTEQUAL = 41 +AMPEREQUAL = 42 +VBAREQUAL = 43 +CIRCUMFLEXEQUAL = 44 +LEFTSHIFTEQUAL = 45 +RIGHTSHIFTEQUAL = 46 +DOUBLESTAREQUAL = 47 +DOUBLESLASH = 48 +DOUBLESLASHEQUAL = 49 +OP = 50 +ERRORTOKEN = 51 +N_TOKENS = 52 +NT_OFFSET = 256 +#--end constants-- + +tok_name = {} +for _name, _value in globals().items(): + if type(_value) is type(0): + tok_name[_value] = _name + + +def ISTERMINAL(x): + return x < NT_OFFSET + +def ISNONTERMINAL(x): + return x >= NT_OFFSET + +def ISEOF(x): + return x == ENDMARKER + + +def main(): + import re + import sys + args = sys.argv[1:] + inFileName = args and args[0] or "Include/token.h" + outFileName = "Lib/token.py" + if len(args) > 1: + outFileName = args[1] + try: + fp = open(inFileName) + except IOError, err: + sys.stdout.write("I/O error: %s\n" % str(err)) + sys.exit(1) + lines = fp.read().split("\n") + fp.close() + prog = re.compile( + "#define[ \t][ \t]*([A-Z][A-Z_]*)[ \t][ \t]*([0-9][0-9]*)", + re.IGNORECASE) + tokens = {} + for line in lines: + match = prog.match(line) + if match: + name, val = match.group(1, 2) + val = int(val) + tokens[val] = name # reverse so we can sort them... + keys = tokens.keys() + keys.sort() + # load the output skeleton from the target: + try: + fp = open(outFileName) + except IOError, err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(2) + format = fp.read().split("\n") + fp.close() + try: + start = format.index("#--start constants--") + 1 + end = format.index("#--end constants--") + except ValueError: + sys.stderr.write("target does not contain format markers") + sys.exit(3) + lines = [] + for val in keys: + lines.append("%s = %d" % (tokens[val], val)) + format[start:end] = lines + try: + fp = open(outFileName, 'w') + except IOError, err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(4) + fp.write("\n".join(format)) + fp.close() + + +if __name__ == "__main__": + main() diff --git a/lib-python/2.2/tokenize.py b/lib-python/2.2/tokenize.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/tokenize.py @@ -0,0 +1,287 @@ +"""Tokenization help for Python programs. + +generate_tokens(readline) is a generator that breaks a stream of +text into Python tokens. It accepts a readline-like method which is called +repeatedly to get the next line of input (or "" for EOF). It generates +5-tuples with these members: + + the token type (see token.py) + the token (a string) + the starting (row, column) indices of the token (a 2-tuple of ints) + the ending (row, column) indices of the token (a 2-tuple of ints) + the original line (string) + +It is designed to match the working of the Python tokenizer exactly, except +that it produces COMMENT tokens for comments and gives type OP for all +operators + +Older entry points + tokenize_loop(readline, tokeneater) + tokenize(readline, tokeneater=printtoken) +are the same, except instead of generating tokens, tokeneater is a callback +function to which the 5 fields described above are passed as 5 arguments, +each time a new token is found.""" + +from __future__ import generators + +__author__ = 'Ka-Ping Yee ' +__credits__ = \ + 'GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro' + +import string, re +from token import * + +import token +__all__ = [x for x in dir(token) if x[0] != '_'] + ["COMMENT", "tokenize", + "generate_tokens", "NL"] +del token + +COMMENT = N_TOKENS +tok_name[COMMENT] = 'COMMENT' +NL = N_TOKENS + 1 +tok_name[NL] = 'NL' +N_TOKENS += 2 + +def group(*choices): return '(' + '|'.join(choices) + ')' +def any(*choices): return apply(group, choices) + '*' +def maybe(*choices): return apply(group, choices) + '?' + +Whitespace = r'[ \f\t]*' +Comment = r'#[^\r\n]*' +Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) +Name = r'[a-zA-Z_]\w*' + +Hexnumber = r'0[xX][\da-fA-F]*[lL]?' +Octnumber = r'0[0-7]*[lL]?' +Decnumber = r'[1-9]\d*[lL]?' +Intnumber = group(Hexnumber, Octnumber, Decnumber) +Exponent = r'[eE][-+]?\d+' +Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) +Expfloat = r'\d+' + Exponent +Floatnumber = group(Pointfloat, Expfloat) +Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') +Number = group(Imagnumber, Floatnumber, Intnumber) + +# Tail end of ' string. +Single = r"[^'\\]*(?:\\.[^'\\]*)*'" +# Tail end of " string. +Double = r'[^"\\]*(?:\\.[^"\\]*)*"' +# Tail end of ''' string. +Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" +# Tail end of """ string. +Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' +Triple = group("[uU]?[rR]?'''", '[uU]?[rR]?"""') +# Single-line ' or " string. +String = group(r"[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'", + r'[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"') + +# Because of leftmost-then-longest match semantics, be sure to put the +# longest operators first (e.g., if = came before ==, == would get +# recognized as two instances of =). +Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"<>", r"!=", + r"//=?", + r"[+\-*/%&|^=<>]=?", + r"~") + +Bracket = '[][(){}]' +Special = group(r'\r?\n', r'[:;.,`]') +Funny = group(Operator, Bracket, Special) + +PlainToken = group(Number, Funny, String, Name) +Token = Ignore + PlainToken + +# First (or only) line of ' or " string. +ContStr = group(r"[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" + + group("'", r'\\\r?\n'), + r'[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' + + group('"', r'\\\r?\n')) +PseudoExtras = group(r'\\\r?\n', Comment, Triple) +PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) + +tokenprog, pseudoprog, single3prog, double3prog = map( + re.compile, (Token, PseudoToken, Single3, Double3)) +endprogs = {"'": re.compile(Single), '"': re.compile(Double), + "'''": single3prog, '"""': double3prog, + "r'''": single3prog, 'r"""': double3prog, + "u'''": single3prog, 'u"""': double3prog, + "ur'''": single3prog, 'ur"""': double3prog, + "R'''": single3prog, 'R"""': double3prog, + "U'''": single3prog, 'U"""': double3prog, + "uR'''": single3prog, 'uR"""': double3prog, + "Ur'''": single3prog, 'Ur"""': double3prog, + "UR'''": single3prog, 'UR"""': double3prog, + 'r': None, 'R': None, 'u': None, 'U': None} + +tabsize = 8 + +class TokenError(Exception): pass + +class StopTokenizing(Exception): pass + +def printtoken(type, token, (srow, scol), (erow, ecol), line): # for testing + print "%d,%d-%d,%d:\t%s\t%s" % \ + (srow, scol, erow, ecol, tok_name[type], repr(token)) + +def tokenize(readline, tokeneater=printtoken): + """ + The tokenize() function accepts two parameters: one representing the + input stream, and one providing an output mechanism for tokenize(). + + The first parameter, readline, must be a callable object which provides + the same interface as the readline() method of built-in file objects. + Each call to the function should return one line of input as a string. + + The second parameter, tokeneater, must also be a callable object. It is + called once for each token, with five arguments, corresponding to the + tuples generated by generate_tokens(). + """ + try: + tokenize_loop(readline, tokeneater) + except StopTokenizing: + pass + +# backwards compatible interface +def tokenize_loop(readline, tokeneater): + for token_info in generate_tokens(readline): + apply(tokeneater, token_info) + +def generate_tokens(readline): + """ + The generate_tokens() generator requires one argment, readline, which + must be a callable object which provides the same interface as the + readline() method of built-in file objects. Each call to the function + should return one line of input as a string. + + The generator produces 5-tuples with these members: the token type; the + token string; a 2-tuple (srow, scol) of ints specifying the row and + column where the token begins in the source; a 2-tuple (erow, ecol) of + ints specifying the row and column where the token ends in the source; + and the line on which the token was found. The line passed is the + logical line; continuation lines are included. + """ + lnum = parenlev = continued = 0 + namechars, numchars = string.ascii_letters + '_', '0123456789' + contstr, needcont = '', 0 + contline = None + indents = [0] + + while 1: # loop over lines in stream + line = readline() + lnum = lnum + 1 + pos, max = 0, len(line) + + if contstr: # continued string + if not line: + raise TokenError, ("EOF in multi-line string", strstart) + endmatch = endprog.match(line) + if endmatch: + pos = end = endmatch.end(0) + yield (STRING, contstr + line[:end], + strstart, (lnum, end), contline + line) + contstr, needcont = '', 0 + contline = None + elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': + yield (ERRORTOKEN, contstr + line, + strstart, (lnum, len(line)), contline) + contstr = '' + contline = None + continue + else: + contstr = contstr + line + contline = contline + line + continue + + elif parenlev == 0 and not continued: # new statement + if not line: break + column = 0 + while pos < max: # measure leading whitespace + if line[pos] == ' ': column = column + 1 + elif line[pos] == '\t': column = (column/tabsize + 1)*tabsize + elif line[pos] == '\f': column = 0 + else: break + pos = pos + 1 + if pos == max: break + + if line[pos] in '#\r\n': # skip comments or blank lines + yield ((NL, COMMENT)[line[pos] == '#'], line[pos:], + (lnum, pos), (lnum, len(line)), line) + continue + + if column > indents[-1]: # count indents or dedents + indents.append(column) + yield (INDENT, line[:pos], (lnum, 0), (lnum, pos), line) + while column < indents[-1]: + indents = indents[:-1] + yield (DEDENT, '', (lnum, pos), (lnum, pos), line) + + else: # continued statement + if not line: + raise TokenError, ("EOF in multi-line statement", (lnum, 0)) + continued = 0 + + while pos < max: + pseudomatch = pseudoprog.match(line, pos) + if pseudomatch: # scan for tokens + start, end = pseudomatch.span(1) + spos, epos, pos = (lnum, start), (lnum, end), end + token, initial = line[start:end], line[start] + + if initial in numchars or \ + (initial == '.' and token != '.'): # ordinary number + yield (NUMBER, token, spos, epos, line) + elif initial in '\r\n': + yield (parenlev > 0 and NL or NEWLINE, + token, spos, epos, line) + elif initial == '#': + yield (COMMENT, token, spos, epos, line) + elif token in ("'''", '"""', # triple-quoted + "r'''", 'r"""', "R'''", 'R"""', + "u'''", 'u"""', "U'''", 'U"""', + "ur'''", 'ur"""', "Ur'''", 'Ur"""', + "uR'''", 'uR"""', "UR'''", 'UR"""'): + endprog = endprogs[token] + endmatch = endprog.match(line, pos) + if endmatch: # all on one line + pos = endmatch.end(0) + token = line[start:pos] + yield (STRING, token, spos, (lnum, pos), line) + else: + strstart = (lnum, start) # multiple lines + contstr = line[start:] + contline = line + break + elif initial in ("'", '"') or \ + token[:2] in ("r'", 'r"', "R'", 'R"', + "u'", 'u"', "U'", 'U"') or \ + token[:3] in ("ur'", 'ur"', "Ur'", 'Ur"', + "uR'", 'uR"', "UR'", 'UR"' ): + if token[-1] == '\n': # continued string + strstart = (lnum, start) + endprog = (endprogs[initial] or endprogs[token[1]] or + endprogs[token[2]]) + contstr, needcont = line[start:], 1 + contline = line + break + else: # ordinary string + yield (STRING, token, spos, epos, line) + elif initial in namechars: # ordinary name + yield (NAME, token, spos, epos, line) + elif initial == '\\': # continued stmt + continued = 1 + else: + if initial in '([{': parenlev = parenlev + 1 + elif initial in ')]}': parenlev = parenlev - 1 + yield (OP, token, spos, epos, line) + else: + yield (ERRORTOKEN, line[pos], + (lnum, pos), (lnum, pos+1), line) + pos = pos + 1 + + for indent in indents[1:]: # pop remaining indent levels + yield (DEDENT, '', (lnum, 0), (lnum, 0), '') + yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') + +if __name__ == '__main__': # testing + import sys + if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline) + else: tokenize(sys.stdin.readline) diff --git a/lib-python/2.2/traceback.py b/lib-python/2.2/traceback.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/traceback.py @@ -0,0 +1,301 @@ +"""Extract, format and print information about Python stack traces.""" + +import linecache +import sys +import types + +__all__ = ['extract_stack', 'extract_tb', 'format_exception', + 'format_exception_only', 'format_list', 'format_stack', + 'format_tb', 'print_exc', 'print_exception', 'print_last', + 'print_stack', 'print_tb', 'tb_lineno'] + +def _print(file, str='', terminator='\n'): + file.write(str+terminator) + + +def print_list(extracted_list, file=None): + """Print the list of tuples as returned by extract_tb() or + extract_stack() as a formatted stack trace to the given file.""" + if not file: + file = sys.stderr + for filename, lineno, name, line in extracted_list: + _print(file, + ' File "%s", line %d, in %s' % (filename,lineno,name)) + if line: + _print(file, ' %s' % line.strip()) + +def format_list(extracted_list): + """Format a list of traceback entry tuples for printing. + + Given a list of tuples as returned by extract_tb() or + extract_stack(), return a list of strings ready for printing. + Each string in the resulting list corresponds to the item with the + same index in the argument list. Each string ends in a newline; + the strings may contain internal newlines as well, for those items + whose source text line is not None. + """ + list = [] + for filename, lineno, name, line in extracted_list: + item = ' File "%s", line %d, in %s\n' % (filename,lineno,name) + if line: + item = item + ' %s\n' % line.strip() + list.append(item) + return list + + +def print_tb(tb, limit=None, file=None): + """Print up to 'limit' stack trace entries from the traceback 'tb'. + + If 'limit' is omitted or None, all entries are printed. If 'file' + is omitted or None, the output goes to sys.stderr; otherwise + 'file' should be an open file or file-like object with a write() + method. + """ + if not file: + file = sys.stderr + if limit is None: + if hasattr(sys, 'tracebacklimit'): + limit = sys.tracebacklimit + n = 0 + while tb is not None and (limit is None or n < limit): + f = tb.tb_frame + lineno = tb_lineno(tb) + co = f.f_code + filename = co.co_filename + name = co.co_name + _print(file, + ' File "%s", line %d, in %s' % (filename,lineno,name)) + line = linecache.getline(filename, lineno) + if line: _print(file, ' ' + line.strip()) + tb = tb.tb_next + n = n+1 + +def format_tb(tb, limit = None): + """A shorthand for 'format_list(extract_stack(f, limit)).""" + return format_list(extract_tb(tb, limit)) + +def extract_tb(tb, limit = None): + """Return list of up to limit pre-processed entries from traceback. + + This is useful for alternate formatting of stack traces. If + 'limit' is omitted or None, all entries are extracted. A + pre-processed stack trace entry is a quadruple (filename, line + number, function name, text) representing the information that is + usually printed for a stack trace. The text is a string with + leading and trailing whitespace stripped; if the source is not + available it is None. + """ + if limit is None: + if hasattr(sys, 'tracebacklimit'): + limit = sys.tracebacklimit + list = [] + n = 0 + while tb is not None and (limit is None or n < limit): + f = tb.tb_frame + lineno = tb_lineno(tb) + co = f.f_code + filename = co.co_filename + name = co.co_name + line = linecache.getline(filename, lineno) + if line: line = line.strip() + else: line = None + list.append((filename, lineno, name, line)) + tb = tb.tb_next + n = n+1 + return list + + +def print_exception(etype, value, tb, limit=None, file=None): + """Print exception up to 'limit' stack trace entries from 'tb' to 'file'. + + This differs from print_tb() in the following ways: (1) if + traceback is not None, it prints a header "Traceback (most recent + call last):"; (2) it prints the exception type and value after the + stack trace; (3) if type is SyntaxError and value has the + appropriate format, it prints the line where the syntax error + occurred with a caret on the next line indicating the approximate + position of the error. + """ + if not file: + file = sys.stderr + if tb: + _print(file, 'Traceback (most recent call last):') + print_tb(tb, limit, file) + lines = format_exception_only(etype, value) + for line in lines[:-1]: + _print(file, line, ' ') + _print(file, lines[-1], '') + +def format_exception(etype, value, tb, limit = None): + """Format a stack trace and the exception information. + + The arguments have the same meaning as the corresponding arguments + to print_exception(). The return value is a list of strings, each + ending in a newline and some containing internal newlines. When + these lines are concatenated and printed, exactly the same text is + printed as does print_exception(). + """ + if tb: + list = ['Traceback (most recent call last):\n'] + list = list + format_tb(tb, limit) + else: + list = [] + list = list + format_exception_only(etype, value) + return list + +def format_exception_only(etype, value): + """Format the exception part of a traceback. + + The arguments are the exception type and value such as given by + sys.last_type and sys.last_value. The return value is a list of + strings, each ending in a newline. Normally, the list contains a + single string; however, for SyntaxError exceptions, it contains + several lines that (when printed) display detailed information + about where the syntax error occurred. The message indicating + which exception occurred is the always last string in the list. + """ + list = [] + if type(etype) == types.ClassType: + stype = etype.__name__ + else: + stype = etype + if value is None: + list.append(str(stype) + '\n') + else: + if etype is SyntaxError: + try: + msg, (filename, lineno, offset, line) = value + except: + pass + else: + if not filename: filename = "" + list.append(' File "%s", line %d\n' % + (filename, lineno)) + if line is not None: + i = 0 + while i < len(line) and line[i].isspace(): + i = i+1 + list.append(' %s\n' % line.strip()) + if offset is not None: + s = ' ' + for c in line[i:offset-1]: + if c.isspace(): + s = s + c + else: + s = s + ' ' + list.append('%s^\n' % s) + value = msg + s = _some_str(value) + if s: + list.append('%s: %s\n' % (str(stype), s)) + else: + list.append('%s\n' % str(stype)) + return list + +def _some_str(value): + try: + return str(value) + except: + return '' % type(value).__name__ + + +def print_exc(limit=None, file=None): + """Shorthand for 'print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)'. + (In fact, it uses sys.exc_info() to retrieve the same information + in a thread-safe way.)""" + if not file: + file = sys.stderr + try: + etype, value, tb = sys.exc_info() + print_exception(etype, value, tb, limit, file) + finally: + etype = value = tb = None + +def print_last(limit=None, file=None): + """This is a shorthand for 'print_exception(sys.last_type, + sys.last_value, sys.last_traceback, limit, file)'.""" + if not file: + file = sys.stderr + print_exception(sys.last_type, sys.last_value, sys.last_traceback, + limit, file) + + +def print_stack(f=None, limit=None, file=None): + """Print a stack trace from its invocation point. + + The optional 'f' argument can be used to specify an alternate + stack frame at which to start. The optional 'limit' and 'file' + arguments have the same meaning as for print_exception(). + """ + if f is None: + try: + raise ZeroDivisionError + except ZeroDivisionError: + f = sys.exc_info()[2].tb_frame.f_back + print_list(extract_stack(f, limit), file) + +def format_stack(f=None, limit=None): + """Shorthand for 'format_list(extract_stack(f, limit))'.""" + if f is None: + try: + raise ZeroDivisionError + except ZeroDivisionError: + f = sys.exc_info()[2].tb_frame.f_back + return format_list(extract_stack(f, limit)) + +def extract_stack(f=None, limit = None): + """Extract the raw traceback from the current stack frame. + + The return value has the same format as for extract_tb(). The + optional 'f' and 'limit' arguments have the same meaning as for + print_stack(). Each item in the list is a quadruple (filename, + line number, function name, text), and the entries are in order + from oldest to newest stack frame. + """ + if f is None: + try: + raise ZeroDivisionError + except ZeroDivisionError: + f = sys.exc_info()[2].tb_frame.f_back + if limit is None: + if hasattr(sys, 'tracebacklimit'): + limit = sys.tracebacklimit + list = [] + n = 0 + while f is not None and (limit is None or n < limit): + lineno = f.f_lineno # XXX Too bad if -O is used + co = f.f_code + filename = co.co_filename + name = co.co_name + line = linecache.getline(filename, lineno) + if line: line = line.strip() + else: line = None + list.append((filename, lineno, name, line)) + f = f.f_back + n = n+1 + list.reverse() + return list + +def tb_lineno(tb): + """Calculate correct line number of traceback given in tb. + + Even works with -O on. + """ + # Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line() + # in compile.c. + # Revised version by Jim Hugunin to work with JPython too. + + c = tb.tb_frame.f_code + if not hasattr(c, 'co_lnotab'): + return tb.tb_lineno + + tab = c.co_lnotab + line = c.co_firstlineno + stopat = tb.tb_lasti + addr = 0 + for i in range(0, len(tab), 2): + addr = addr + ord(tab[i]) + if addr > stopat: + break + line = line + ord(tab[i+1]) + return line diff --git a/lib-python/2.2/tty.py b/lib-python/2.2/tty.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/tty.py @@ -0,0 +1,36 @@ +"""Terminal utilities.""" + +# Author: Steen Lumholt. + +from termios import * + +__all__ = ["setraw", "setcbreak"] + +# Indexes for termios list. +IFLAG = 0 +OFLAG = 1 +CFLAG = 2 +LFLAG = 3 +ISPEED = 4 +OSPEED = 5 +CC = 6 + +def setraw(fd, when=TCSAFLUSH): + """Put terminal into a raw mode.""" + mode = tcgetattr(fd) + mode[IFLAG] = mode[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON) + mode[OFLAG] = mode[OFLAG] & ~(OPOST) + mode[CFLAG] = mode[CFLAG] & ~(CSIZE | PARENB) + mode[CFLAG] = mode[CFLAG] | CS8 + mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG) + mode[CC][VMIN] = 1 + mode[CC][VTIME] = 0 + tcsetattr(fd, when, mode) + +def setcbreak(fd, when=TCSAFLUSH): + """Put terminal into a cbreak mode.""" + mode = tcgetattr(fd) + mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON) + mode[CC][VMIN] = 1 + mode[CC][VTIME] = 0 + tcsetattr(fd, when, mode) diff --git a/lib-python/2.2/types.py b/lib-python/2.2/types.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/types.py @@ -0,0 +1,86 @@ +"""Define names for all type symbols known in the standard interpreter. + +Types that are part of optional modules (e.g. array) are not listed. +""" +from __future__ import generators + +import sys + +# Iterators in Python aren't a matter of type but of protocol. A large +# and changing number of builtin types implement *some* flavor of +# iterator. Don't check the type! Use hasattr to check for both +# "__iter__" and "next" attributes instead. + +NoneType = type(None) +TypeType = type +ObjectType = object + +IntType = int +LongType = long +FloatType = float +try: + ComplexType = complex +except NameError: + pass + +StringType = str +try: + UnicodeType = unicode + StringTypes = (StringType, UnicodeType) +except NameError: + StringTypes = (StringType,) + +BufferType = type(buffer('')) + +TupleType = tuple +ListType = list +DictType = DictionaryType = dict + +def _f(): pass +FunctionType = type(_f) +LambdaType = type(lambda: None) # Same as FunctionType +try: + CodeType = type(_f.func_code) +except RuntimeError: + # Execution in restricted environment + pass + +def g(): + yield 1 +GeneratorType = type(g()) +del g + +class _C: + def _m(self): pass +ClassType = type(_C) +UnboundMethodType = type(_C._m) # Same as MethodType +_x = _C() +InstanceType = type(_x) +MethodType = type(_x._m) + +BuiltinFunctionType = type(len) +BuiltinMethodType = type([].append) # Same as BuiltinFunctionType + +ModuleType = type(sys) +FileType = file +XRangeType = type(xrange(0)) + +try: + raise TypeError +except TypeError: + try: + tb = sys.exc_info()[2] + TracebackType = type(tb) + FrameType = type(tb.tb_frame) + except AttributeError: + # In the restricted environment, exc_info returns (None, None, + # None) Then, tb.tb_frame gives an attribute error + pass + tb = None; del tb + +SliceType = type(slice(0)) +EllipsisType = type(Ellipsis) + +DictProxyType = type(TypeType.__dict__) + +del sys, _f, _C, _x, generators # Not for export diff --git a/lib-python/2.2/tzparse.py b/lib-python/2.2/tzparse.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/tzparse.py @@ -0,0 +1,98 @@ +"""Parse a timezone specification.""" + +# XXX Unfinished. +# XXX Only the typical form "XXXhhYYY;ddd/hh,ddd/hh" is currently supported. + +import warnings +warnings.warn( + "The tzparse module is obsolete and will disappear in the future", + DeprecationWarning) + +tzpat = ('^([A-Z][A-Z][A-Z])([-+]?[0-9]+)([A-Z][A-Z][A-Z]);' + '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$') + +tzprog = None + +def tzparse(tzstr): + """Given a timezone spec, return a tuple of information + (tzname, delta, dstname, daystart, hourstart, dayend, hourend), + where 'tzname' is the name of the timezone, 'delta' is the offset + in hours from GMT, 'dstname' is the name of the daylight-saving + timezone, and 'daystart'/'hourstart' and 'dayend'/'hourend' + specify the starting and ending points for daylight saving time.""" + global tzprog + if tzprog is None: + import re + tzprog = re.compile(tzpat) + match = tzprog.match(tzstr) + if not match: + raise ValueError, 'not the TZ syntax I understand' + subs = [] + for i in range(1, 8): + subs.append(match.group(i)) + for i in (1, 3, 4, 5, 6): + subs[i] = eval(subs[i]) + [tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs + return (tzname, delta, dstname, daystart, hourstart, dayend, hourend) + +def tzlocaltime(secs, params): + """Given a Unix time in seconds and a tuple of information about + a timezone as returned by tzparse(), return the local time in the + form (year, month, day, hour, min, sec, yday, wday, tzname).""" + import time + (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params + year, month, days, hours, mins, secs, yday, wday, isdst = \ + time.gmtime(secs - delta*3600) + if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend): + tzname = dstname + hours = hours + 1 + return year, month, days, hours, mins, secs, yday, wday, tzname + +def tzset(): + """Determine the current timezone from the "TZ" environment variable.""" + global tzparams, timezone, altzone, daylight, tzname + import os + tzstr = os.environ['TZ'] + tzparams = tzparse(tzstr) + timezone = tzparams[1] * 3600 + altzone = timezone - 3600 + daylight = 1 + tzname = tzparams[0], tzparams[2] + +def isdst(secs): + """Return true if daylight-saving time is in effect for the given + Unix time in the current timezone.""" + import time + (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \ + tzparams + year, month, days, hours, mins, secs, yday, wday, isdst = \ + time.gmtime(secs - delta*3600) + return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend) + +tzset() + +def localtime(secs): + """Get the local time in the current timezone.""" + return tzlocaltime(secs, tzparams) + +def test(): + from time import asctime, gmtime + import time, sys + now = time.time() + x = localtime(now) + tm = x[:-1] + (0,) + print 'now =', now, '=', asctime(tm), x[-1] + now = now - now % (24*3600) + if sys.argv[1:]: now = now + eval(sys.argv[1]) + x = gmtime(now) + tm = x[:-1] + (0,) + print 'gmtime =', now, '=', asctime(tm), 'yday =', x[-2] + jan1 = now - x[-2]*24*3600 + x = localtime(jan1) + tm = x[:-1] + (0,) + print 'jan1 =', jan1, '=', asctime(tm), x[-1] + for d in range(85, 95) + range(265, 275): + t = jan1 + d*24*3600 + x = localtime(t) + tm = x[:-1] + (0,) + print 'd =', d, 't =', t, '=', asctime(tm), x[-1] diff --git a/lib-python/2.2/unittest.py b/lib-python/2.2/unittest.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/unittest.py @@ -0,0 +1,723 @@ +#!/usr/bin/env python +''' +Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's +Smalltalk testing framework. + +This module contains the core framework classes that form the basis of +specific test cases and suites (TestCase, TestSuite etc.), and also a +text-based utility class for running the tests and reporting the results + (TextTestRunner). + +Simple usage: + + import unittest + + class IntegerArithmenticTestCase(unittest.TestCase): + def testAdd(self): ## test method names begin 'test*' + self.assertEquals((1 + 2), 3) + self.assertEquals(0 + 1, 1) + def testMultiply(self): + self.assertEquals((0 * 10), 0) + self.assertEquals((5 * 8), 40) + + if __name__ == '__main__': + unittest.main() + +Further information is available in the bundled documentation, and from + + http://pyunit.sourceforge.net/ + +Copyright (c) 1999, 2000, 2001 Steve Purcell +This module is free software, and you may redistribute it and/or modify +it under the same terms as Python itself, so long as this copyright message +and disclaimer are retained in their original form. + +IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF +THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, +AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +''' + +__author__ = "Steve Purcell" +__email__ = "stephen_purcell at yahoo dot com" +__version__ = "#Revision: 1.43 $"[11:-2] + +import time +import sys +import traceback +import string +import os +import types + +############################################################################## +# Test framework core +############################################################################## + +class TestResult: + """Holder for test result information. + + Test results are automatically managed by the TestCase and TestSuite + classes, and do not need to be explicitly manipulated by writers of tests. + + Each instance holds the total number of tests run, and collections of + failures and errors that occurred among those test runs. The collections + contain tuples of (testcase, exceptioninfo), where exceptioninfo is the + formatted traceback of the error that occurred. + """ + def __init__(self): + self.failures = [] + self.errors = [] + self.testsRun = 0 + self.shouldStop = 0 + + def startTest(self, test): + "Called when the given test is about to be run" + self.testsRun = self.testsRun + 1 + + def stopTest(self, test): + "Called when the given test has been run" + pass + + def addError(self, test, err): + """Called when an error has occurred. 'err' is a tuple of values as + returned by sys.exc_info(). + """ + self.errors.append((test, self._exc_info_to_string(err))) + + def addFailure(self, test, err): + """Called when an error has occurred. 'err' is a tuple of values as + returned by sys.exc_info().""" + self.failures.append((test, self._exc_info_to_string(err))) + + def addSuccess(self, test): + "Called when a test has completed successfully" + pass + + def wasSuccessful(self): + "Tells whether or not this result was a success" + return len(self.failures) == len(self.errors) == 0 + + def stop(self): + "Indicates that the tests should be aborted" + self.shouldStop = 1 + + def _exc_info_to_string(self, err): + """Converts a sys.exc_info()-style tuple of values into a string.""" + return string.join(apply(traceback.format_exception, err), '') + + def __repr__(self): + return "<%s run=%i errors=%i failures=%i>" % \ + (self.__class__, self.testsRun, len(self.errors), + len(self.failures)) + + +class TestCase: + """A class whose instances are single test cases. + + By default, the test code itself should be placed in a method named + 'runTest'. + + If the fixture may be used for many test cases, create as + many test methods as are needed. When instantiating such a TestCase + subclass, specify in the constructor arguments the name of the test method + that the instance is to execute. + + Test authors should subclass TestCase for their own tests. Construction + and deconstruction of the test's environment ('fixture') can be + implemented by overriding the 'setUp' and 'tearDown' methods respectively. + + If it is necessary to override the __init__ method, the base class + __init__ method must always be called. It is important that subclasses + should not change the signature of their __init__ method, since instances + of the classes are instantiated automatically by parts of the framework + in order to be run. + """ + + # This attribute determines which exception will be raised when + # the instance's assertion methods fail; test methods raising this + # exception will be deemed to have 'failed' rather than 'errored' + + failureException = AssertionError + + def __init__(self, methodName='runTest'): + """Create an instance of the class that will use the named test + method when executed. Raises a ValueError if the instance does + not have a method with the specified name. + """ + try: + self.__testMethodName = methodName + testMethod = getattr(self, methodName) + self.__testMethodDoc = testMethod.__doc__ + except AttributeError: + raise ValueError, "no such test method in %s: %s" % \ + (self.__class__, methodName) + + def setUp(self): + "Hook method for setting up the test fixture before exercising it." + pass + + def tearDown(self): + "Hook method for deconstructing the test fixture after testing it." + pass + + def countTestCases(self): + return 1 + + def defaultTestResult(self): + return TestResult() + + def shortDescription(self): + """Returns a one-line description of the test, or None if no + description has been provided. + + The default implementation of this method returns the first line of + the specified test method's docstring. + """ + doc = self.__testMethodDoc + return doc and string.strip(string.split(doc, "\n")[0]) or None + + def id(self): + return "%s.%s" % (self.__class__, self.__testMethodName) + + def __str__(self): + return "%s (%s)" % (self.__testMethodName, self.__class__) + + def __repr__(self): + return "<%s testMethod=%s>" % \ + (self.__class__, self.__testMethodName) + + def run(self, result=None): + return self(result) + + def __call__(self, result=None): + if result is None: result = self.defaultTestResult() + result.startTest(self) + testMethod = getattr(self, self.__testMethodName) + try: + try: + self.setUp() + except KeyboardInterrupt: + raise + except: + result.addError(self, self.__exc_info()) + return + + ok = 0 + try: + testMethod() + ok = 1 + except self.failureException, e: + result.addFailure(self, self.__exc_info()) + except KeyboardInterrupt: + raise + except: + result.addError(self, self.__exc_info()) + + try: + self.tearDown() + except KeyboardInterrupt: + raise + except: + result.addError(self, self.__exc_info()) + ok = 0 + if ok: result.addSuccess(self) + finally: + result.stopTest(self) + + def debug(self): + """Run the test without collecting errors in a TestResult""" + self.setUp() + getattr(self, self.__testMethodName)() + self.tearDown() + + def __exc_info(self): + """Return a version of sys.exc_info() with the traceback frame + minimised; usually the top level of the traceback frame is not + needed. + """ + exctype, excvalue, tb = sys.exc_info() + if sys.platform[:4] == 'java': ## tracebacks look different in Jython + return (exctype, excvalue, tb) + newtb = tb.tb_next + if newtb is None: + return (exctype, excvalue, tb) + return (exctype, excvalue, newtb) + + def fail(self, msg=None): + """Fail immediately, with the given message.""" + raise self.failureException, msg + + def failIf(self, expr, msg=None): + "Fail the test if the expression is true." + if expr: raise self.failureException, msg + + def failUnless(self, expr, msg=None): + """Fail the test unless the expression is true.""" + if not expr: raise self.failureException, msg + + def failUnlessRaises(self, excClass, callableObj, *args, **kwargs): + """Fail unless an exception of class excClass is thrown + by callableObj when invoked with arguments args and keyword + arguments kwargs. If a different type of exception is + thrown, it will not be caught, and the test case will be + deemed to have suffered an error, exactly as for an + unexpected exception. + """ + try: + apply(callableObj, args, kwargs) + except excClass: + return + else: + if hasattr(excClass,'__name__'): excName = excClass.__name__ + else: excName = str(excClass) + raise self.failureException, excName + + def failUnlessEqual(self, first, second, msg=None): + """Fail if the two objects are unequal as determined by the '!=' + operator. + """ + if first != second: + raise self.failureException, \ + (msg or '%s != %s' % (`first`, `second`)) + + def failIfEqual(self, first, second, msg=None): + """Fail if the two objects are equal as determined by the '==' + operator. + """ + if first == second: + raise self.failureException, \ + (msg or '%s == %s' % (`first`, `second`)) + + assertEqual = assertEquals = failUnlessEqual + + assertNotEqual = assertNotEquals = failIfEqual + + assertRaises = failUnlessRaises + + assert_ = failUnless + + + +class TestSuite: + """A test suite is a composite test consisting of a number of TestCases. + + For use, create an instance of TestSuite, then add test case instances. + When all tests have been added, the suite can be passed to a test + runner, such as TextTestRunner. It will run the individual test cases + in the order in which they were added, aggregating the results. When + subclassing, do not forget to call the base class constructor. + """ + def __init__(self, tests=()): + self._tests = [] + self.addTests(tests) + + def __repr__(self): + return "<%s tests=%s>" % (self.__class__, self._tests) + + __str__ = __repr__ + + def countTestCases(self): + cases = 0 + for test in self._tests: + cases = cases + test.countTestCases() + return cases + + def addTest(self, test): + self._tests.append(test) + + def addTests(self, tests): + for test in tests: + self.addTest(test) + + def run(self, result): + return self(result) + + def __call__(self, result): + for test in self._tests: + if result.shouldStop: + break + test(result) + return result + + def debug(self): + """Run the tests without collecting errors in a TestResult""" + for test in self._tests: test.debug() + + +class FunctionTestCase(TestCase): + """A test case that wraps a test function. + + This is useful for slipping pre-existing test functions into the + PyUnit framework. Optionally, set-up and tidy-up functions can be + supplied. As with TestCase, the tidy-up ('tearDown') function will + always be called if the set-up ('setUp') function ran successfully. + """ + + def __init__(self, testFunc, setUp=None, tearDown=None, + description=None): + TestCase.__init__(self) + self.__setUpFunc = setUp + self.__tearDownFunc = tearDown + self.__testFunc = testFunc + self.__description = description + + def setUp(self): + if self.__setUpFunc is not None: + self.__setUpFunc() + + def tearDown(self): + if self.__tearDownFunc is not None: + self.__tearDownFunc() + + def runTest(self): + self.__testFunc() + + def id(self): + return self.__testFunc.__name__ + + def __str__(self): + return "%s (%s)" % (self.__class__, self.__testFunc.__name__) + + def __repr__(self): + return "<%s testFunc=%s>" % (self.__class__, self.__testFunc) + + def shortDescription(self): + if self.__description is not None: return self.__description + doc = self.__testFunc.__doc__ + return doc and string.strip(string.split(doc, "\n")[0]) or None + + + +############################################################################## +# Locating and loading tests +############################################################################## + +class TestLoader: + """This class is responsible for loading tests according to various + criteria and returning them wrapped in a Test + """ + testMethodPrefix = 'test' + sortTestMethodsUsing = cmp + suiteClass = TestSuite + + def loadTestsFromTestCase(self, testCaseClass): + """Return a suite of all tests cases contained in testCaseClass""" + return self.suiteClass(map(testCaseClass, + self.getTestCaseNames(testCaseClass))) + + def loadTestsFromModule(self, module): + """Return a suite of all tests cases contained in the given module""" + tests = [] + for name in dir(module): + obj = getattr(module, name) + if type(obj) == types.ClassType and issubclass(obj, TestCase): + tests.append(self.loadTestsFromTestCase(obj)) + return self.suiteClass(tests) + + def loadTestsFromName(self, name, module=None): + """Return a suite of all tests cases given a string specifier. + + The name may resolve either to a module, a test case class, a + test method within a test case class, or a callable object which + returns a TestCase or TestSuite instance. + + The method optionally resolves the names relative to a given module. + """ + parts = string.split(name, '.') + if module is None: + if not parts: + raise ValueError, "incomplete test name: %s" % name + else: + parts_copy = parts[:] + while parts_copy: + try: + module = __import__(string.join(parts_copy,'.')) + break + except ImportError: + del parts_copy[-1] + if not parts_copy: raise + parts = parts[1:] + obj = module + for part in parts: + obj = getattr(obj, part) + + import unittest + if type(obj) == types.ModuleType: + return self.loadTestsFromModule(obj) + elif type(obj) == types.ClassType and issubclass(obj, unittest.TestCase): + return self.loadTestsFromTestCase(obj) + elif type(obj) == types.UnboundMethodType: + return obj.im_class(obj.__name__) + elif callable(obj): + test = obj() + if not isinstance(test, unittest.TestCase) and \ + not isinstance(test, unittest.TestSuite): + raise ValueError, \ + "calling %s returned %s, not a test" % (obj,test) + return test + else: + raise ValueError, "don't know how to make test from: %s" % obj + + def loadTestsFromNames(self, names, module=None): + """Return a suite of all tests cases found using the given sequence + of string specifiers. See 'loadTestsFromName()'. + """ + suites = [] + for name in names: + suites.append(self.loadTestsFromName(name, module)) + return self.suiteClass(suites) + + def getTestCaseNames(self, testCaseClass): + """Return a sorted sequence of method names found within testCaseClass + """ + testFnNames = filter(lambda n,p=self.testMethodPrefix: n[:len(p)] == p, + dir(testCaseClass)) + for baseclass in testCaseClass.__bases__: + for testFnName in self.getTestCaseNames(baseclass): + if testFnName not in testFnNames: # handle overridden methods + testFnNames.append(testFnName) + if self.sortTestMethodsUsing: + testFnNames.sort(self.sortTestMethodsUsing) + return testFnNames + + + +defaultTestLoader = TestLoader() + + +############################################################################## +# Patches for old functions: these functions should be considered obsolete +############################################################################## + +def _makeLoader(prefix, sortUsing, suiteClass=None): + loader = TestLoader() + loader.sortTestMethodsUsing = sortUsing + loader.testMethodPrefix = prefix + if suiteClass: loader.suiteClass = suiteClass + return loader + +def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp): + return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass) + +def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite): + return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass) + +def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite): + return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module) + + +############################################################################## +# Text UI +############################################################################## + +class _WritelnDecorator: + """Used to decorate file-like objects with a handy 'writeln' method""" + def __init__(self,stream): + self.stream = stream + + def __getattr__(self, attr): + return getattr(self.stream,attr) + + def writeln(self, *args): + if args: apply(self.write, args) + self.write('\n') # text-mode streams translate to \r\n if needed + + +class _TextTestResult(TestResult): + """A test result class that can print formatted text results to a stream. + + Used by TextTestRunner. + """ + separator1 = '=' * 70 + separator2 = '-' * 70 + + def __init__(self, stream, descriptions, verbosity): + TestResult.__init__(self) + self.stream = stream + self.showAll = verbosity > 1 + self.dots = verbosity == 1 + self.descriptions = descriptions + + def getDescription(self, test): + if self.descriptions: + return test.shortDescription() or str(test) + else: + return str(test) + + def startTest(self, test): + TestResult.startTest(self, test) + if self.showAll: + self.stream.write(self.getDescription(test)) + self.stream.write(" ... ") + + def addSuccess(self, test): + TestResult.addSuccess(self, test) + if self.showAll: + self.stream.writeln("ok") + elif self.dots: + self.stream.write('.') + + def addError(self, test, err): + TestResult.addError(self, test, err) + if self.showAll: + self.stream.writeln("ERROR") + elif self.dots: + self.stream.write('E') + + def addFailure(self, test, err): + TestResult.addFailure(self, test, err) + if self.showAll: + self.stream.writeln("FAIL") + elif self.dots: + self.stream.write('F') + + def printErrors(self): + if self.dots or self.showAll: + self.stream.writeln() + self.printErrorList('ERROR', self.errors) + self.printErrorList('FAIL', self.failures) + + def printErrorList(self, flavour, errors): + for test, err in errors: + self.stream.writeln(self.separator1) + self.stream.writeln("%s: %s" % (flavour,self.getDescription(test))) + self.stream.writeln(self.separator2) + self.stream.writeln("%s" % err) + + +class TextTestRunner: + """A test runner class that displays results in textual form. + + It prints out the names of tests as they are run, errors as they + occur, and a summary of the results at the end of the test run. + """ + def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1): + self.stream = _WritelnDecorator(stream) + self.descriptions = descriptions + self.verbosity = verbosity + + def _makeResult(self): + return _TextTestResult(self.stream, self.descriptions, self.verbosity) + + def run(self, test): + "Run the given test case or test suite." + result = self._makeResult() + startTime = time.time() + test(result) + stopTime = time.time() + timeTaken = float(stopTime - startTime) + result.printErrors() + self.stream.writeln(result.separator2) + run = result.testsRun + self.stream.writeln("Ran %d test%s in %.3fs" % + (run, run != 1 and "s" or "", timeTaken)) + self.stream.writeln() + if not result.wasSuccessful(): + self.stream.write("FAILED (") + failed, errored = map(len, (result.failures, result.errors)) + if failed: + self.stream.write("failures=%d" % failed) + if errored: + if failed: self.stream.write(", ") + self.stream.write("errors=%d" % errored) + self.stream.writeln(")") + else: + self.stream.writeln("OK") + return result + + + +############################################################################## +# Facilities for running tests from the command line +############################################################################## + +class TestProgram: + """A command-line program that runs a set of tests; this is primarily + for making test modules conveniently executable. + """ + USAGE = """\ +Usage: %(progName)s [options] [test] [...] + +Options: + -h, --help Show this message + -v, --verbose Verbose output + -q, --quiet Minimal output + +Examples: + %(progName)s - run default set of tests + %(progName)s MyTestSuite - run suite 'MyTestSuite' + %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething + %(progName)s MyTestCase - run all 'test*' test methods + in MyTestCase +""" + def __init__(self, module='__main__', defaultTest=None, + argv=None, testRunner=None, testLoader=defaultTestLoader): + if type(module) == type(''): + self.module = __import__(module) + for part in string.split(module,'.')[1:]: + self.module = getattr(self.module, part) + else: + self.module = module + if argv is None: + argv = sys.argv + self.verbosity = 1 + self.defaultTest = defaultTest + self.testRunner = testRunner + self.testLoader = testLoader + self.progName = os.path.basename(argv[0]) + self.parseArgs(argv) + self.runTests() + + def usageExit(self, msg=None): + if msg: print msg + print self.USAGE % self.__dict__ + sys.exit(2) + + def parseArgs(self, argv): + import getopt + try: + options, args = getopt.getopt(argv[1:], 'hHvq', + ['help','verbose','quiet']) + for opt, value in options: + if opt in ('-h','-H','--help'): + self.usageExit() + if opt in ('-q','--quiet'): + self.verbosity = 0 + if opt in ('-v','--verbose'): + self.verbosity = 2 + if len(args) == 0 and self.defaultTest is None: + self.test = self.testLoader.loadTestsFromModule(self.module) + return + if len(args) > 0: + self.testNames = args + else: + self.testNames = (self.defaultTest,) + self.createTests() + except getopt.error, msg: + self.usageExit(msg) + + def createTests(self): + self.test = self.testLoader.loadTestsFromNames(self.testNames, + self.module) + + def runTests(self): + if self.testRunner is None: + self.testRunner = TextTestRunner(verbosity=self.verbosity) + result = self.testRunner.run(self.test) + sys.exit(not result.wasSuccessful()) + +main = TestProgram + + +############################################################################## +# Executing this module from the command line +############################################################################## + +if __name__ == "__main__": + main(module=None) diff --git a/lib-python/2.2/urllib.py b/lib-python/2.2/urllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/urllib.py @@ -0,0 +1,1465 @@ +"""Open an arbitrary URL. + +See the following document for more info on URLs: +"Names and Addresses, URIs, URLs, URNs, URCs", at +http://www.w3.org/pub/WWW/Addressing/Overview.html + +See also the HTTP spec (from which the error codes are derived): +"HTTP - Hypertext Transfer Protocol", at +http://www.w3.org/pub/WWW/Protocols/ + +Related standards and specs: +- RFC1808: the "relative URL" spec. (authoritative status) +- RFC1738 - the "URL standard". (authoritative status) +- RFC1630 - the "URI spec". (informational status) + +The object returned by URLopener().open(file) will differ per +protocol. All you know is that is has methods read(), readline(), +readlines(), fileno(), close() and info(). The read*(), fileno() +and close() methods work like those of open files. +The info() method returns a mimetools.Message object which can be +used to query various info about the object, if available. +(mimetools.Message objects are queried with the getheader() method.) +""" + +import string +import socket +import os +import stat +import time +import sys +import types + +__all__ = ["urlopen", "URLopener", "FancyURLopener", "urlretrieve", + "urlcleanup", "quote", "quote_plus", "unquote", "unquote_plus", + "urlencode", "url2pathname", "pathname2url", "splittag", + "localhost", "thishost", "ftperrors", "basejoin", "unwrap", + "splittype", "splithost", "splituser", "splitpasswd", "splitport", + "splitnport", "splitquery", "splitattr", "splitvalue", + "splitgophertype", "getproxies"] + +__version__ = '1.15' # XXX This version is not always updated :-( + +MAXFTPCACHE = 10 # Trim the ftp cache beyond this size + +# Helper for non-unix systems +if os.name == 'mac': + from macurl2path import url2pathname, pathname2url +elif os.name == 'nt': + from nturl2path import url2pathname, pathname2url +elif os.name == 'riscos': + from rourl2path import url2pathname, pathname2url +else: + def url2pathname(pathname): + return unquote(pathname) + def pathname2url(pathname): + return quote(pathname) + +# This really consists of two pieces: +# (1) a class which handles opening of all sorts of URLs +# (plus assorted utilities etc.) +# (2) a set of functions for parsing URLs +# XXX Should these be separated out into different modules? + + +# Shortcut for basic usage +_urlopener = None +def urlopen(url, data=None): + """urlopen(url [, data]) -> open file-like object""" + global _urlopener + if not _urlopener: + _urlopener = FancyURLopener() + if data is None: + return _urlopener.open(url) + else: + return _urlopener.open(url, data) +def urlretrieve(url, filename=None, reporthook=None, data=None): + global _urlopener + if not _urlopener: + _urlopener = FancyURLopener() + return _urlopener.retrieve(url, filename, reporthook, data) +def urlcleanup(): + if _urlopener: + _urlopener.cleanup() + + +ftpcache = {} +class URLopener: + """Class to open URLs. + This is a class rather than just a subroutine because we may need + more than one set of global protocol-specific options. + Note -- this is a base class for those who don't want the + automatic handling of errors type 302 (relocated) and 401 + (authorization needed).""" + + __tempfiles = None + + version = "Python-urllib/%s" % __version__ + + # Constructor + def __init__(self, proxies=None, **x509): + if proxies is None: + proxies = getproxies() + assert hasattr(proxies, 'has_key'), "proxies must be a mapping" + self.proxies = proxies + self.key_file = x509.get('key_file') + self.cert_file = x509.get('cert_file') + self.addheaders = [('User-agent', self.version)] + self.__tempfiles = [] + self.__unlink = os.unlink # See cleanup() + self.tempcache = None + # Undocumented feature: if you assign {} to tempcache, + # it is used to cache files retrieved with + # self.retrieve(). This is not enabled by default + # since it does not work for changing documents (and I + # haven't got the logic to check expiration headers + # yet). + self.ftpcache = ftpcache + # Undocumented feature: you can use a different + # ftp cache by assigning to the .ftpcache member; + # in case you want logically independent URL openers + # XXX This is not threadsafe. Bah. + + def __del__(self): + self.close() + + def close(self): + self.cleanup() + + def cleanup(self): + # This code sometimes runs when the rest of this module + # has already been deleted, so it can't use any globals + # or import anything. + if self.__tempfiles: + for file in self.__tempfiles: + try: + self.__unlink(file) + except OSError: + pass + del self.__tempfiles[:] + if self.tempcache: + self.tempcache.clear() + + def addheader(self, *args): + """Add a header to be used by the HTTP interface only + e.g. u.addheader('Accept', 'sound/basic')""" + self.addheaders.append(args) + + # External interface + def open(self, fullurl, data=None): + """Use URLopener().open(file) instead of open(file, 'r').""" + fullurl = unwrap(toBytes(fullurl)) + if self.tempcache and self.tempcache.has_key(fullurl): + filename, headers = self.tempcache[fullurl] + fp = open(filename, 'rb') + return addinfourl(fp, headers, fullurl) + urltype, url = splittype(fullurl) + if not urltype: + urltype = 'file' + if self.proxies.has_key(urltype): + proxy = self.proxies[urltype] + urltype, proxyhost = splittype(proxy) + host, selector = splithost(proxyhost) + url = (host, fullurl) # Signal special case to open_*() + else: + proxy = None + name = 'open_' + urltype + self.type = urltype + if '-' in name: + # replace - with _ + name = '_'.join(name.split('-')) + if not hasattr(self, name): + if proxy: + return self.open_unknown_proxy(proxy, fullurl, data) + else: + return self.open_unknown(fullurl, data) + try: + if data is None: + return getattr(self, name)(url) + else: + return getattr(self, name)(url, data) + except socket.error, msg: + raise IOError, ('socket error', msg), sys.exc_info()[2] + + def open_unknown(self, fullurl, data=None): + """Overridable interface to open unknown URL type.""" + type, url = splittype(fullurl) + raise IOError, ('url error', 'unknown url type', type) + + def open_unknown_proxy(self, proxy, fullurl, data=None): + """Overridable interface to open unknown URL type.""" + type, url = splittype(fullurl) + raise IOError, ('url error', 'invalid proxy for %s' % type, proxy) + + # External interface + def retrieve(self, url, filename=None, reporthook=None, data=None): + """retrieve(url) returns (filename, headers) for a local object + or (tempfilename, headers) for a remote object.""" + url = unwrap(toBytes(url)) + if self.tempcache and self.tempcache.has_key(url): + return self.tempcache[url] + type, url1 = splittype(url) + if not filename and (not type or type == 'file'): + try: + fp = self.open_local_file(url1) + hdrs = fp.info() + del fp + return url2pathname(splithost(url1)[1]), hdrs + except IOError, msg: + pass + fp = self.open(url, data) + headers = fp.info() + if not filename: + import tempfile + garbage, path = splittype(url) + garbage, path = splithost(path or "") + path, garbage = splitquery(path or "") + path, garbage = splitattr(path or "") + suffix = os.path.splitext(path)[1] + filename = tempfile.mktemp(suffix) + self.__tempfiles.append(filename) + result = filename, headers + if self.tempcache is not None: + self.tempcache[url] = result + tfp = open(filename, 'wb') + bs = 1024*8 + size = -1 + blocknum = 1 + if reporthook: + if headers.has_key("content-length"): + size = int(headers["Content-Length"]) + reporthook(0, bs, size) + block = fp.read(bs) + if reporthook: + reporthook(1, bs, size) + while block: + tfp.write(block) + block = fp.read(bs) + blocknum = blocknum + 1 + if reporthook: + reporthook(blocknum, bs, size) + fp.close() + tfp.close() + del fp + del tfp + return result + + # Each method named open_ knows how to open that type of URL + + def open_http(self, url, data=None): + """Use HTTP protocol.""" + import httplib + user_passwd = None + if type(url) is types.StringType: + host, selector = splithost(url) + if host: + user_passwd, host = splituser(host) + host = unquote(host) + realhost = host + else: + host, selector = url + urltype, rest = splittype(selector) + url = rest + user_passwd = None + if urltype.lower() != 'http': + realhost = None + else: + realhost, rest = splithost(rest) + if realhost: + user_passwd, realhost = splituser(realhost) + if user_passwd: + selector = "%s://%s%s" % (urltype, realhost, rest) + if proxy_bypass(realhost): + host = realhost + + #print "proxy via http:", host, selector + if not host: raise IOError, ('http error', 'no host given') + if user_passwd: + import base64 + auth = base64.encodestring(user_passwd).strip() + else: + auth = None + h = httplib.HTTP(host) + if data is not None: + h.putrequest('POST', selector) + h.putheader('Content-type', 'application/x-www-form-urlencoded') + h.putheader('Content-length', '%d' % len(data)) + else: + h.putrequest('GET', selector) + if auth: h.putheader('Authorization', 'Basic %s' % auth) + if realhost: h.putheader('Host', realhost) + for args in self.addheaders: apply(h.putheader, args) + h.endheaders() + if data is not None: + h.send(data) + errcode, errmsg, headers = h.getreply() + fp = h.getfile() + if errcode == 200: + return addinfourl(fp, headers, "http:" + url) + else: + if data is None: + return self.http_error(url, fp, errcode, errmsg, headers) + else: + return self.http_error(url, fp, errcode, errmsg, headers, data) + + def http_error(self, url, fp, errcode, errmsg, headers, data=None): + """Handle http errors. + Derived class can override this, or provide specific handlers + named http_error_DDD where DDD is the 3-digit error code.""" + # First check if there's a specific handler for this error + name = 'http_error_%d' % errcode + if hasattr(self, name): + method = getattr(self, name) + if data is None: + result = method(url, fp, errcode, errmsg, headers) + else: + result = method(url, fp, errcode, errmsg, headers, data) + if result: return result + return self.http_error_default(url, fp, errcode, errmsg, headers) + + def http_error_default(self, url, fp, errcode, errmsg, headers): + """Default error handler: close the connection and raise IOError.""" + void = fp.read() + fp.close() + raise IOError, ('http error', errcode, errmsg, headers) + + if hasattr(socket, "ssl"): + def open_https(self, url, data=None): + """Use HTTPS protocol.""" + import httplib + user_passwd = None + if type(url) is types.StringType: + host, selector = splithost(url) + if host: + user_passwd, host = splituser(host) + host = unquote(host) + realhost = host + else: + host, selector = url + urltype, rest = splittype(selector) + url = rest + user_passwd = None + if urltype.lower() != 'https': + realhost = None + else: + realhost, rest = splithost(rest) + if realhost: + user_passwd, realhost = splituser(realhost) + if user_passwd: + selector = "%s://%s%s" % (urltype, realhost, rest) + #print "proxy via https:", host, selector + if not host: raise IOError, ('https error', 'no host given') + if user_passwd: + import base64 + auth = base64.encodestring(user_passwd).strip() + else: + auth = None + h = httplib.HTTPS(host, 0, + key_file=self.key_file, + cert_file=self.cert_file) + if data is not None: + h.putrequest('POST', selector) + h.putheader('Content-type', + 'application/x-www-form-urlencoded') + h.putheader('Content-length', '%d' % len(data)) + else: + h.putrequest('GET', selector) + if auth: h.putheader('Authorization: Basic %s' % auth) + if realhost: h.putheader('Host', realhost) + for args in self.addheaders: apply(h.putheader, args) + h.endheaders() + if data is not None: + h.send(data) + errcode, errmsg, headers = h.getreply() + fp = h.getfile() + if errcode == 200: + return addinfourl(fp, headers, "https:" + url) + else: + if data is None: + return self.http_error(url, fp, errcode, errmsg, headers) + else: + return self.http_error(url, fp, errcode, errmsg, headers, + data) + + def open_gopher(self, url): + """Use Gopher protocol.""" + import gopherlib + host, selector = splithost(url) + if not host: raise IOError, ('gopher error', 'no host given') + host = unquote(host) + type, selector = splitgophertype(selector) + selector, query = splitquery(selector) + selector = unquote(selector) + if query: + query = unquote(query) + fp = gopherlib.send_query(selector, query, host) + else: + fp = gopherlib.send_selector(selector, host) + return addinfourl(fp, noheaders(), "gopher:" + url) + + def open_file(self, url): + """Use local file or FTP depending on form of URL.""" + if url[:2] == '//' and url[2:3] != '/' and url[2:12].lower() != 'localhost/': + return self.open_ftp(url) + else: + return self.open_local_file(url) + + def open_local_file(self, url): + """Use local file.""" + import mimetypes, mimetools, rfc822, StringIO + host, file = splithost(url) + localname = url2pathname(file) + try: + stats = os.stat(localname) + except OSError, e: + raise IOError(e.errno, e.strerror, e.filename) + size = stats[stat.ST_SIZE] + modified = rfc822.formatdate(stats[stat.ST_MTIME]) + mtype = mimetypes.guess_type(url)[0] + headers = mimetools.Message(StringIO.StringIO( + 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % + (mtype or 'text/plain', size, modified))) + if not host: + urlfile = file + if file[:1] == '/': + urlfile = 'file://' + file + return addinfourl(open(localname, 'rb'), + headers, urlfile) + host, port = splitport(host) + if not port \ + and socket.gethostbyname(host) in (localhost(), thishost()): + urlfile = file + if file[:1] == '/': + urlfile = 'file://' + file + return addinfourl(open(localname, 'rb'), + headers, urlfile) + raise IOError, ('local file error', 'not on local host') + + def open_ftp(self, url): + """Use FTP protocol.""" + import mimetypes, mimetools, StringIO + host, path = splithost(url) + if not host: raise IOError, ('ftp error', 'no host given') + host, port = splitport(host) + user, host = splituser(host) + if user: user, passwd = splitpasswd(user) + else: passwd = None + host = unquote(host) + user = unquote(user or '') + passwd = unquote(passwd or '') + host = socket.gethostbyname(host) + if not port: + import ftplib + port = ftplib.FTP_PORT + else: + port = int(port) + path, attrs = splitattr(path) + path = unquote(path) + dirs = path.split('/') + dirs, file = dirs[:-1], dirs[-1] + if dirs and not dirs[0]: dirs = dirs[1:] + if dirs and not dirs[0]: dirs[0] = '/' + key = user, host, port, '/'.join(dirs) + # XXX thread unsafe! + if len(self.ftpcache) > MAXFTPCACHE: + # Prune the cache, rather arbitrarily + for k in self.ftpcache.keys(): + if k != key: + v = self.ftpcache[k] + del self.ftpcache[k] + v.close() + try: + if not self.ftpcache.has_key(key): + self.ftpcache[key] = \ + ftpwrapper(user, passwd, host, port, dirs) + if not file: type = 'D' + else: type = 'I' + for attr in attrs: + attr, value = splitvalue(attr) + if attr.lower() == 'type' and \ + value in ('a', 'A', 'i', 'I', 'd', 'D'): + type = value.upper() + (fp, retrlen) = self.ftpcache[key].retrfile(file, type) + mtype = mimetypes.guess_type("ftp:" + url)[0] + headers = "" + if mtype: + headers += "Content-Type: %s\n" % mtype + if retrlen is not None and retrlen >= 0: + headers += "Content-Length: %d\n" % retrlen + headers = mimetools.Message(StringIO.StringIO(headers)) + return addinfourl(fp, headers, "ftp:" + url) + except ftperrors(), msg: + raise IOError, ('ftp error', msg), sys.exc_info()[2] + + def open_data(self, url, data=None): + """Use "data" URL.""" + # ignore POSTed data + # + # syntax of data URLs: + # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + # mediatype := [ type "/" subtype ] *( ";" parameter ) + # data := *urlchar + # parameter := attribute "=" value + import StringIO, mimetools, time + try: + [type, data] = url.split(',', 1) + except ValueError: + raise IOError, ('data error', 'bad data URL') + if not type: + type = 'text/plain;charset=US-ASCII' + semi = type.rfind(';') + if semi >= 0 and '=' not in type[semi:]: + encoding = type[semi+1:] + type = type[:semi] + else: + encoding = '' + msg = [] + msg.append('Date: %s'%time.strftime('%a, %d %b %Y %T GMT', + time.gmtime(time.time()))) + msg.append('Content-type: %s' % type) + if encoding == 'base64': + import base64 + data = base64.decodestring(data) + else: + data = unquote(data) + msg.append('Content-length: %d' % len(data)) + msg.append('') + msg.append(data) + msg = '\n'.join(msg) + f = StringIO.StringIO(msg) + headers = mimetools.Message(f, 0) + f.fileno = None # needed for addinfourl + return addinfourl(f, headers, url) + + +class FancyURLopener(URLopener): + """Derived class with handlers for errors we can handle (perhaps).""" + + def __init__(self, *args): + apply(URLopener.__init__, (self,) + args) + self.auth_cache = {} + self.tries = 0 + self.maxtries = 10 + + def http_error_default(self, url, fp, errcode, errmsg, headers): + """Default error handling -- don't raise an exception.""" + return addinfourl(fp, headers, "http:" + url) + + def http_error_302(self, url, fp, errcode, errmsg, headers, data=None): + """Error 302 -- relocated (temporarily).""" + self.tries += 1 + if self.maxtries and self.tries >= self.maxtries: + if hasattr(self, "http_error_500"): + meth = self.http_error_500 + else: + meth = self.http_error_default + self.tries = 0 + return meth(url, fp, 500, + "Internal Server Error: Redirect Recursion", headers) + result = self.redirect_internal(url, fp, errcode, errmsg, headers, + data) + self.tries = 0 + return result + + def redirect_internal(self, url, fp, errcode, errmsg, headers, data): + if headers.has_key('location'): + newurl = headers['location'] + elif headers.has_key('uri'): + newurl = headers['uri'] + else: + return + void = fp.read() + fp.close() + # In case the server sent a relative URL, join with original: + newurl = basejoin(self.type + ":" + url, newurl) + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def http_error_301(self, url, fp, errcode, errmsg, headers, data=None): + """Error 301 -- also relocated (permanently).""" + return self.http_error_302(url, fp, errcode, errmsg, headers, data) + + def http_error_303(self, url, fp, errcode, errmsg, headers, data=None): + """Error 303 -- also relocated (essentially identical to 302).""" + return self.http_error_302(url, fp, errcode, errmsg, headers, data) + + def http_error_401(self, url, fp, errcode, errmsg, headers, data=None): + """Error 401 -- authentication required. + See this URL for a description of the basic authentication scheme: + http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt""" + if not headers.has_key('www-authenticate'): + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + stuff = headers['www-authenticate'] + import re + match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff) + if not match: + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + scheme, realm = match.groups() + if scheme.lower() != 'basic': + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + name = 'retry_' + self.type + '_basic_auth' + if data is None: + return getattr(self,name)(url, realm) + else: + return getattr(self,name)(url, realm, data) + + def retry_http_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + i = host.find('@') + 1 + host = host[i:] + user, passwd = self.get_user_passwd(host, realm, i) + if not (user or passwd): return None + host = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + host + newurl = 'http://' + host + selector + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def retry_https_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + i = host.find('@') + 1 + host = host[i:] + user, passwd = self.get_user_passwd(host, realm, i) + if not (user or passwd): return None + host = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + host + newurl = '//' + host + selector + return self.open_https(newurl, data) + + def get_user_passwd(self, host, realm, clear_cache = 0): + key = realm + '@' + host.lower() + if self.auth_cache.has_key(key): + if clear_cache: + del self.auth_cache[key] + else: + return self.auth_cache[key] + user, passwd = self.prompt_user_passwd(host, realm) + if user or passwd: self.auth_cache[key] = (user, passwd) + return user, passwd + + def prompt_user_passwd(self, host, realm): + """Override this in a GUI environment!""" + import getpass + try: + user = raw_input("Enter username for %s at %s: " % (realm, + host)) + passwd = getpass.getpass("Enter password for %s in %s at %s: " % + (user, realm, host)) + return user, passwd + except KeyboardInterrupt: + print + return None, None + + +# Utility functions + +_localhost = None +def localhost(): + """Return the IP address of the magic hostname 'localhost'.""" + global _localhost + if not _localhost: + _localhost = socket.gethostbyname('localhost') + return _localhost + +_thishost = None +def thishost(): + """Return the IP address of the current host.""" + global _thishost + if not _thishost: + _thishost = socket.gethostbyname(socket.gethostname()) + return _thishost + +_ftperrors = None +def ftperrors(): + """Return the set of errors raised by the FTP class.""" + global _ftperrors + if not _ftperrors: + import ftplib + _ftperrors = ftplib.all_errors + return _ftperrors + +_noheaders = None +def noheaders(): + """Return an empty mimetools.Message object.""" + global _noheaders + if not _noheaders: + import mimetools + import StringIO + _noheaders = mimetools.Message(StringIO.StringIO(), 0) + _noheaders.fp.close() # Recycle file descriptor + return _noheaders + + +# Utility classes + +class ftpwrapper: + """Class used by open_ftp() for cache of open FTP connections.""" + + def __init__(self, user, passwd, host, port, dirs): + self.user = user + self.passwd = passwd + self.host = host + self.port = port + self.dirs = dirs + self.init() + + def init(self): + import ftplib + self.busy = 0 + self.ftp = ftplib.FTP() + self.ftp.connect(self.host, self.port) + self.ftp.login(self.user, self.passwd) + for dir in self.dirs: + self.ftp.cwd(dir) + + def retrfile(self, file, type): + import ftplib + self.endtransfer() + if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1 + else: cmd = 'TYPE ' + type; isdir = 0 + try: + self.ftp.voidcmd(cmd) + except ftplib.all_errors: + self.init() + self.ftp.voidcmd(cmd) + conn = None + if file and not isdir: + # Use nlst to see if the file exists at all + try: + self.ftp.nlst(file) + except ftplib.error_perm, reason: + raise IOError, ('ftp error', reason), sys.exc_info()[2] + # Restore the transfer mode! + self.ftp.voidcmd(cmd) + # Try to retrieve as a file + try: + cmd = 'RETR ' + file + conn = self.ftp.ntransfercmd(cmd) + except ftplib.error_perm, reason: + if str(reason)[:3] != '550': + raise IOError, ('ftp error', reason), sys.exc_info()[2] + if not conn: + # Set transfer mode to ASCII! + self.ftp.voidcmd('TYPE A') + # Try a directory listing + if file: cmd = 'LIST ' + file + else: cmd = 'LIST' + conn = self.ftp.ntransfercmd(cmd) + self.busy = 1 + # Pass back both a suitably decorated object and a retrieval length + return (addclosehook(conn[0].makefile('rb'), + self.endtransfer), conn[1]) + def endtransfer(self): + if not self.busy: + return + self.busy = 0 + try: + self.ftp.voidresp() + except ftperrors(): + pass + + def close(self): + self.endtransfer() + try: + self.ftp.close() + except ftperrors(): + pass + +class addbase: + """Base class for addinfo and addclosehook.""" + + def __init__(self, fp): + self.fp = fp + self.read = self.fp.read + self.readline = self.fp.readline + if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines + if hasattr(self.fp, "fileno"): self.fileno = self.fp.fileno + + def __repr__(self): + return '<%s at %s whose fp = %s>' % (self.__class__.__name__, + `id(self)`, `self.fp`) + + def close(self): + self.read = None + self.readline = None + self.readlines = None + self.fileno = None + if self.fp: self.fp.close() + self.fp = None + +class addclosehook(addbase): + """Class to add a close hook to an open file.""" + + def __init__(self, fp, closehook, *hookargs): + addbase.__init__(self, fp) + self.closehook = closehook + self.hookargs = hookargs + + def close(self): + addbase.close(self) + if self.closehook: + apply(self.closehook, self.hookargs) + self.closehook = None + self.hookargs = None + +class addinfo(addbase): + """class to add an info() method to an open file.""" + + def __init__(self, fp, headers): + addbase.__init__(self, fp) + self.headers = headers + + def info(self): + return self.headers + +class addinfourl(addbase): + """class to add info() and geturl() methods to an open file.""" + + def __init__(self, fp, headers, url): + addbase.__init__(self, fp) + self.headers = headers + self.url = url + + def info(self): + return self.headers + + def geturl(self): + return self.url + + +def basejoin(base, url): + """Utility to combine a URL with a base URL to form a new URL.""" + type, path = splittype(url) + if type: + # if url is complete (i.e., it contains a type), return it + return url + host, path = splithost(path) + type, basepath = splittype(base) # inherit type from base + if host: + # if url contains host, just inherit type + if type: return type + '://' + host + path + else: + # no type inherited, so url must have started with // + # just return it + return url + host, basepath = splithost(basepath) # inherit host + basepath, basetag = splittag(basepath) # remove extraneous cruft + basepath, basequery = splitquery(basepath) # idem + if path[:1] != '/': + # non-absolute path name + if path[:1] in ('#', '?'): + # path is just a tag or query, attach to basepath + i = len(basepath) + else: + # else replace last component + i = basepath.rfind('/') + if i < 0: + # basepath not absolute + if host: + # host present, make absolute + basepath = '/' + else: + # else keep non-absolute + basepath = '' + else: + # remove last file component + basepath = basepath[:i+1] + # Interpret ../ (important because of symlinks) + while basepath and path[:3] == '../': + path = path[3:] + i = basepath[:-1].rfind('/') + if i > 0: + basepath = basepath[:i+1] + elif i == 0: + basepath = '/' + break + else: + basepath = '' + + path = basepath + path + if host and path and path[0] != '/': + path = '/' + path + if type and host: return type + '://' + host + path + elif type: return type + ':' + path + elif host: return '//' + host + path # don't know what this means + else: return path + + +# Utilities to parse URLs (most of these return None for missing parts): +# unwrap('') --> 'type://host/path' +# splittype('type:opaquestring') --> 'type', 'opaquestring' +# splithost('//host[:port]/path') --> 'host[:port]', '/path' +# splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]' +# splitpasswd('user:passwd') -> 'user', 'passwd' +# splitport('host:port') --> 'host', 'port' +# splitquery('/path?query') --> '/path', 'query' +# splittag('/path#tag') --> '/path', 'tag' +# splitattr('/path;attr1=value1;attr2=value2;...') -> +# '/path', ['attr1=value1', 'attr2=value2', ...] +# splitvalue('attr=value') --> 'attr', 'value' +# splitgophertype('/Xselector') --> 'X', 'selector' +# unquote('abc%20def') -> 'abc def' +# quote('abc def') -> 'abc%20def') + +def toBytes(url): + """toBytes(u"URL") --> 'URL'.""" + # Most URL schemes require ASCII. If that changes, the conversion + # can be relaxed + if type(url) is types.UnicodeType: + try: + url = url.encode("ASCII") + except UnicodeError: + raise UnicodeError("URL " + repr(url) + + " contains non-ASCII characters") + return url + +def unwrap(url): + """unwrap('') --> 'type://host/path'.""" + url = url.strip() + if url[:1] == '<' and url[-1:] == '>': + url = url[1:-1].strip() + if url[:4] == 'URL:': url = url[4:].strip() + return url + +_typeprog = None +def splittype(url): + """splittype('type:opaquestring') --> 'type', 'opaquestring'.""" + global _typeprog + if _typeprog is None: + import re + _typeprog = re.compile('^([^/:]+):') + + match = _typeprog.match(url) + if match: + scheme = match.group(1) + return scheme.lower(), url[len(scheme) + 1:] + return None, url + +_hostprog = None +def splithost(url): + """splithost('//host[:port]/path') --> 'host[:port]', '/path'.""" + global _hostprog + if _hostprog is None: + import re + _hostprog = re.compile('^//([^/]*)(.*)$') + + match = _hostprog.match(url) + if match: return match.group(1, 2) + return None, url + +_userprog = None +def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return map(unquote, match.group(1, 2)) + return None, host + +_passwdprog = None +def splitpasswd(user): + """splitpasswd('user:passwd') -> 'user', 'passwd'.""" + global _passwdprog + if _passwdprog is None: + import re + _passwdprog = re.compile('^([^:]*):(.*)$') + + match = _passwdprog.match(user) + if match: return match.group(1, 2) + return user, None + +# splittag('/path#tag') --> '/path', 'tag' +_portprog = None +def splitport(host): + """splitport('host:port') --> 'host', 'port'.""" + global _portprog + if _portprog is None: + import re + _portprog = re.compile('^(.*):([0-9]+)$') + + match = _portprog.match(host) + if match: return match.group(1, 2) + return host, None + +_nportprog = None +def splitnport(host, defport=-1): + """Split host and port, returning numeric port. + Return given default port if no ':' found; defaults to -1. + Return numerical port if a valid number are found after ':'. + Return None if ':' but not a valid number.""" + global _nportprog + if _nportprog is None: + import re + _nportprog = re.compile('^(.*):(.*)$') + + match = _nportprog.match(host) + if match: + host, port = match.group(1, 2) + try: + if not port: raise ValueError, "no digits" + nport = int(port) + except ValueError: + nport = None + return host, nport + return host, defport + +_queryprog = None +def splitquery(url): + """splitquery('/path?query') --> '/path', 'query'.""" + global _queryprog + if _queryprog is None: + import re + _queryprog = re.compile('^(.*)\?([^?]*)$') + + match = _queryprog.match(url) + if match: return match.group(1, 2) + return url, None + +_tagprog = None +def splittag(url): + """splittag('/path#tag') --> '/path', 'tag'.""" + global _tagprog + if _tagprog is None: + import re + _tagprog = re.compile('^(.*)#([^#]*)$') + + match = _tagprog.match(url) + if match: return match.group(1, 2) + return url, None + +def splitattr(url): + """splitattr('/path;attr1=value1;attr2=value2;...') -> + '/path', ['attr1=value1', 'attr2=value2', ...].""" + words = url.split(';') + return words[0], words[1:] + +_valueprog = None +def splitvalue(attr): + """splitvalue('attr=value') --> 'attr', 'value'.""" + global _valueprog + if _valueprog is None: + import re + _valueprog = re.compile('^([^=]*)=(.*)$') + + match = _valueprog.match(attr) + if match: return match.group(1, 2) + return attr, None + +def splitgophertype(selector): + """splitgophertype('/Xselector') --> 'X', 'selector'.""" + if selector[:1] == '/' and selector[1:2]: + return selector[1], selector[2:] + return None, selector + +def unquote(s): + """unquote('abc%20def') -> 'abc def'.""" + mychr = chr + myatoi = int + list = s.split('%') + res = [list[0]] + myappend = res.append + del list[0] + for item in list: + if item[1:2]: + try: + myappend(mychr(myatoi(item[:2], 16)) + + item[2:]) + except ValueError: + myappend('%' + item) + else: + myappend('%' + item) + return "".join(res) + +def unquote_plus(s): + """unquote('%7e/abc+def') -> '~/abc def'""" + if '+' in s: + # replace '+' with ' ' + s = ' '.join(s.split('+')) + return unquote(s) + +always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789' '_.-') + +_fast_safe_test = always_safe + '/' +_fast_safe = None + +def _fast_quote(s): + global _fast_safe + if _fast_safe is None: + _fast_safe = {} + for c in _fast_safe_test: + _fast_safe[c] = c + res = list(s) + for i in range(len(res)): + c = res[i] + if not _fast_safe.has_key(c): + res[i] = '%%%02X' % ord(c) + return ''.join(res) + +def quote(s, safe = '/'): + """quote('abc def') -> 'abc%20def' + + Each part of a URL, e.g. the path info, the query, etc., has a + different set of reserved characters that must be quoted. + + RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists + the following reserved characters. + + reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | + "$" | "," + + Each of these characters is reserved in some component of a URL, + but not necessarily in all of them. + + By default, the quote function is intended for quoting the path + section of a URL. Thus, it will not encode '/'. This character + is reserved, but in typical usage the quote function is being + called on a path where the existing slash characters are used as + reserved characters. + """ + safe = always_safe + safe + if _fast_safe_test == safe: + return _fast_quote(s) + res = list(s) + for i in range(len(res)): + c = res[i] + if c not in safe: + res[i] = '%%%02X' % ord(c) + return ''.join(res) + +def quote_plus(s, safe = ''): + """Quote the query fragment of a URL; replacing ' ' with '+'""" + if ' ' in s: + l = s.split(' ') + for i in range(len(l)): + l[i] = quote(l[i], safe) + return '+'.join(l) + else: + return quote(s, safe) + +def urlencode(query,doseq=0): + """Encode a sequence of two-element tuples or dictionary into a URL query string. + + If any values in the query arg are sequences and doseq is true, each + sequence element is converted to a separate parameter. + + If the query arg is a sequence of two-element tuples, the order of the + parameters in the output will match the order of parameters in the + input. + """ + + if hasattr(query,"items"): + # mapping objects + query = query.items() + else: + # it's a bother at times that strings and string-like objects are + # sequences... + try: + # non-sequence items should not work with len() + x = len(query) + # non-empty strings will fail this + if len(query) and type(query[0]) != types.TupleType: + raise TypeError + # zero-length sequences of all types will get here and succeed, + # but that's a minor nit - since the original implementation + # allowed empty dicts that type of behavior probably should be + # preserved for consistency + except TypeError: + ty,va,tb = sys.exc_info() + raise TypeError, "not a valid non-string sequence or mapping object", tb + + l = [] + if not doseq: + # preserve old behavior + for k, v in query: + k = quote_plus(str(k)) + v = quote_plus(str(v)) + l.append(k + '=' + v) + else: + for k, v in query: + k = quote_plus(str(k)) + if type(v) == types.StringType: + v = quote_plus(v) + l.append(k + '=' + v) + elif type(v) == types.UnicodeType: + # is there a reasonable way to convert to ASCII? + # encode generates a string, but "replace" or "ignore" + # lose information and "strict" can raise UnicodeError + v = quote_plus(v.encode("ASCII","replace")) + l.append(k + '=' + v) + else: + try: + # is this a sufficient test for sequence-ness? + x = len(v) + except TypeError: + # not a sequence + v = quote_plus(str(v)) + l.append(k + '=' + v) + else: + # loop over the sequence + for elt in v: + l.append(k + '=' + quote_plus(str(elt))) + return '&'.join(l) + +# Proxy handling +def getproxies_environment(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Scan the environment for variables named _proxy; + this seems to be the standard convention. If you need a + different way, you can pass a proxies dictionary to the + [Fancy]URLopener constructor. + + """ + proxies = {} + for name, value in os.environ.items(): + name = name.lower() + if value and name[-6:] == '_proxy': + proxies[name[:-6]] = value + return proxies + +if os.name == 'mac': + def getproxies(): + """Return a dictionary of scheme -> proxy server URL mappings. + + By convention the mac uses Internet Config to store + proxies. An HTTP proxy, for instance, is stored under + the HttpProxy key. + + """ + try: + import ic + except ImportError: + return {} + + try: + config = ic.IC() + except ic.error: + return {} + proxies = {} + # HTTP: + if config.has_key('UseHTTPProxy') and config['UseHTTPProxy']: + try: + value = config['HTTPProxyHost'] + except ic.error: + pass + else: + proxies['http'] = 'http://%s' % value + # FTP: XXXX To be done. + # Gopher: XXXX To be done. + return proxies + + def proxy_bypass(x): + return 0 + +elif os.name == 'nt': + def getproxies_registry(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Win32 uses the registry to store proxies. + + """ + proxies = {} + try: + import _winreg + except ImportError: + # Std module, so should be around - but you never know! + return proxies + try: + internetSettings = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = _winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + if proxyEnable: + # Returned as Unicode but problems if not converted to ASCII + proxyServer = str(_winreg.QueryValueEx(internetSettings, + 'ProxyServer')[0]) + if '=' in proxyServer: + # Per-protocol settings + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + import re + if not re.match('^([^/:]+)://', address): + address = '%s://%s' % (protocol, address) + proxies[protocol] = address + else: + # Use one setting for all protocols + if proxyServer[:5] == 'http:': + proxies['http'] = proxyServer + else: + proxies['http'] = 'http://%s' % proxyServer + proxies['ftp'] = 'ftp://%s' % proxyServer + internetSettings.Close() + except (WindowsError, ValueError, TypeError): + # Either registry key not found etc, or the value in an + # unexpected format. + # proxies already set up to be empty so nothing to do + pass + return proxies + + def getproxies(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Returns settings gathered from the environment, if specified, + or the registry. + + """ + return getproxies_environment() or getproxies_registry() + + def proxy_bypass(host): + try: + import _winreg + import re + import socket + except ImportError: + # Std modules, so should be around - but you never know! + return 0 + try: + internetSettings = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = _winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = str(_winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0]) + # ^^^^ Returned as Unicode but problems if not converted to ASCII + except WindowsError: + return 0 + if not proxyEnable or not proxyOverride: + return 0 + # try to make a host list from name and IP address. + host = [host] + try: + addr = socket.gethostbyname(host[0]) + if addr != host: + host.append(addr) + except socket.error: + pass + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + i = 0 + while i < len(proxyOverride): + if proxyOverride[i] == '': + proxyOverride[i:i+1] = ['localhost', + '127.0.0.1', + socket.gethostname(), + socket.gethostbyname( + socket.gethostname())] + i += 1 + # print proxyOverride + # now check if we match one of the registry values. + for test in proxyOverride: + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + for val in host: + # print "%s <--> %s" %( test, val ) + if re.match(test, val, re.I): + return 1 + return 0 + +else: + # By default use environment variables + getproxies = getproxies_environment + + def proxy_bypass(host): + return 0 + +# Test and time quote() and unquote() +def test1(): + import time + s = '' + for i in range(256): s = s + chr(i) + s = s*4 + t0 = time.time() + qs = quote(s) + uqs = unquote(qs) + t1 = time.time() + if uqs != s: + print 'Wrong!' + print `s` + print `qs` + print `uqs` + print round(t1 - t0, 3), 'sec' + + +def reporthook(blocknum, blocksize, totalsize): + # Report during remote transfers + print "Block number: %d, Block size: %d, Total size: %d" % ( + blocknum, blocksize, totalsize) + +# Test program +def test(args=[]): + if not args: + args = [ + '/etc/passwd', + 'file:/etc/passwd', + 'file://localhost/etc/passwd', + 'ftp://ftp.python.org/pub/python/README', +## 'gopher://gopher.micro.umn.edu/1/', + 'http://www.python.org/index.html', + ] + if hasattr(URLopener, "open_https"): + args.append('https://synergy.as.cmu.edu/~geek/') + try: + for url in args: + print '-'*10, url, '-'*10 + fn, h = urlretrieve(url, None, reporthook) + print fn + if h: + print '======' + for k in h.keys(): print k + ':', h[k] + print '======' + fp = open(fn, 'rb') + data = fp.read() + del fp + if '\r' in data: + table = string.maketrans("", "") + data = data.translate(table, "\r") + print data + fn, h = None, None + print '-'*40 + finally: + urlcleanup() + +def main(): + import getopt, sys + try: + opts, args = getopt.getopt(sys.argv[1:], "th") + except getopt.error, msg: + print msg + print "Use -h for help" + return + t = 0 + for o, a in opts: + if o == '-t': + t = t + 1 + if o == '-h': + print "Usage: python urllib.py [-t] [url ...]" + print "-t runs self-test;", + print "otherwise, contents of urls are printed" + return + if t: + if t > 1: + test1() + test(args) + else: + if not args: + print "Use -h for help" + for url in args: + print urlopen(url).read(), + +# Run test program when run as a script +if __name__ == '__main__': + main() diff --git a/lib-python/2.2/urllib2.py b/lib-python/2.2/urllib2.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/urllib2.py @@ -0,0 +1,1144 @@ +"""An extensible library for opening URLs using a variety of protocols + +The simplest way to use this module is to call the urlopen function, +which accepts a string containing a URL or a Request object (described +below). It opens the URL and returns the results as file-like +object; the returned object has some extra methods described below. + +The OpenerDirectory manages a collection of Handler objects that do +all the actual work. Each Handler implements a particular protocol or +option. The OpenerDirector is a composite object that invokes the +Handlers needed to open the requested URL. For example, the +HTTPHandler performs HTTP GET and POST requests and deals with +non-error returns. The HTTPRedirectHandler automatically deals with +HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler +deals with digest authentication. + +urlopen(url, data=None) -- basic usage is that same as original +urllib. pass the url and optionally data to post to an HTTP URL, and +get a file-like object back. One difference is that you can also pass +a Request instance instead of URL. Raises a URLError (subclass of +IOError); for HTTP errors, raises an HTTPError, which can also be +treated as a valid response. + +build_opener -- function that creates a new OpenerDirector instance. +will install the default handlers. accepts one or more Handlers as +arguments, either instances or Handler classes that it will +instantiate. if one of the argument is a subclass of the default +handler, the argument will be installed instead of the default. + +install_opener -- installs a new opener as the default opener. + +objects of interest: +OpenerDirector -- + +Request -- an object that encapsulates the state of a request. the +state can be a simple as the URL. it can also include extra HTTP +headers, e.g. a User-Agent. + +BaseHandler -- + +exceptions: +URLError-- a subclass of IOError, individual protocols have their own +specific subclass + +HTTPError-- also a valid HTTP response, so you can treat an HTTP error +as an exceptional event or valid response + +internals: +BaseHandler and parent +_call_chain conventions + +Example usage: + +import urllib2 + +# set up authentication info +authinfo = urllib2.HTTPBasicAuthHandler() +authinfo.add_password('realm', 'host', 'username', 'password') + +proxy_support = urllib2.ProxyHandler({"http" : "http://ahad-haam:3128"}) + +# build a new opener that adds authentication and caching FTP handlers +opener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler) + +# install it +urllib2.install_opener(opener) + +f = urllib2.urlopen('http://www.python.org/') + + +""" + +# XXX issues: +# If an authentication error handler that tries to perform +# authentication for some reason but fails, how should the error be +# signalled? The client needs to know the HTTP error code. But if +# the handler knows that the problem was, e.g., that it didn't know +# that hash algo that requested in the challenge, it would be good to +# pass that information along to the client, too. + +# XXX to do: +# name! +# documentation (getting there) +# complex proxies +# abstract factory for opener +# ftp errors aren't handled cleanly +# gopher can return a socket.error +# check digest against correct (i.e. non-apache) implementation + +import socket +import httplib +import inspect +import re +import base64 +import types +import urlparse +import md5 +import mimetypes +import mimetools +import rfc822 +import ftplib +import sys +import time +import os +import stat +import gopherlib +import posixpath + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +try: + import sha +except ImportError: + # need 1.5.2 final + sha = None + +# not sure how many of these need to be gotten rid of +from urllib import unwrap, unquote, splittype, splithost, \ + addinfourl, splitport, splitgophertype, splitquery, \ + splitattr, ftpwrapper, noheaders + +# support for proxies via environment variables +from urllib import getproxies + +# support for FileHandler +from urllib import localhost, url2pathname + +__version__ = "2.0a1" + +_opener = None +def urlopen(url, data=None): + global _opener + if _opener is None: + _opener = build_opener() + return _opener.open(url, data) + +def install_opener(opener): + global _opener + _opener = opener + +# do these error classes make sense? +# make sure all of the IOError stuff is overridden. we just want to be + # subtypes. + +class URLError(IOError): + # URLError is a sub-type of IOError, but it doesn't share any of + # the implementation. need to override __init__ and __str__ + def __init__(self, reason): + self.reason = reason + + def __str__(self): + return '' % self.reason + +class HTTPError(URLError, addinfourl): + """Raised when HTTP error occurs, but also acts like non-error return""" + __super_init = addinfourl.__init__ + + def __init__(self, url, code, msg, hdrs, fp): + self.__super_init(fp, hdrs, url) + self.code = code + self.msg = msg + self.hdrs = hdrs + self.fp = fp + # XXX + self.filename = url + + def __str__(self): + return 'HTTP Error %s: %s' % (self.code, self.msg) + + def __del__(self): + # XXX is this safe? what if user catches exception, then + # extracts fp and discards exception? + if self.fp: + self.fp.close() + +class GopherError(URLError): + pass + + +class Request: + + def __init__(self, url, data=None, headers={}): + # unwrap('') --> 'type://host/path' + self.__original = unwrap(url) + self.type = None + # self.__r_type is what's left after doing the splittype + self.host = None + self.port = None + self.data = data + self.headers = {} + self.headers.update(headers) + + def __getattr__(self, attr): + # XXX this is a fallback mechanism to guard against these + # methods getting called in a non-standard order. this may be + # too complicated and/or unnecessary. + # XXX should the __r_XXX attributes be public? + if attr[:12] == '_Request__r_': + name = attr[12:] + if hasattr(Request, 'get_' + name): + getattr(self, 'get_' + name)() + return getattr(self, attr) + raise AttributeError, attr + + def get_method(self): + if self.has_data(): + return "POST" + else: + return "GET" + + def add_data(self, data): + self.data = data + + def has_data(self): + return self.data is not None + + def get_data(self): + return self.data + + def get_full_url(self): + return self.__original + + def get_type(self): + if self.type is None: + self.type, self.__r_type = splittype(self.__original) + if self.type is None: + raise ValueError, "unknown url type: %s" % self.__original + return self.type + + def get_host(self): + if self.host is None: + self.host, self.__r_host = splithost(self.__r_type) + if self.host: + self.host = unquote(self.host) + return self.host + + def get_selector(self): + return self.__r_host + + def set_proxy(self, host, type): + self.host, self.type = host, type + self.__r_host = self.__original + + def add_header(self, key, val): + # useful for something like authentication + self.headers[key] = val + +class OpenerDirector: + def __init__(self): + server_version = "Python-urllib/%s" % __version__ + self.addheaders = [('User-agent', server_version)] + # manage the individual handlers + self.handlers = [] + self.handle_open = {} + self.handle_error = {} + + def add_handler(self, handler): + added = 0 + for meth in dir(handler): + if meth[-5:] == '_open': + protocol = meth[:-5] + if self.handle_open.has_key(protocol): + self.handle_open[protocol].append(handler) + else: + self.handle_open[protocol] = [handler] + added = 1 + continue + i = meth.find('_') + j = meth[i+1:].find('_') + i + 1 + if j != -1 and meth[i+1:j] == 'error': + proto = meth[:i] + kind = meth[j+1:] + try: + kind = int(kind) + except ValueError: + pass + dict = self.handle_error.get(proto, {}) + if dict.has_key(kind): + dict[kind].append(handler) + else: + dict[kind] = [handler] + self.handle_error[proto] = dict + added = 1 + continue + if added: + self.handlers.append(handler) + handler.add_parent(self) + + def __del__(self): + self.close() + + def close(self): + for handler in self.handlers: + handler.close() + self.handlers = [] + + def _call_chain(self, chain, kind, meth_name, *args): + # XXX raise an exception if no one else should try to handle + # this url. return None if you can't but someone else could. + handlers = chain.get(kind, ()) + for handler in handlers: + func = getattr(handler, meth_name) + + result = func(*args) + if result is not None: + return result + + def open(self, fullurl, data=None): + # accept a URL or a Request object + if isinstance(fullurl, (types.StringType, types.UnicodeType)): + req = Request(fullurl, data) + else: + req = fullurl + if data is not None: + req.add_data(data) + assert isinstance(req, Request) # really only care about interface + + result = self._call_chain(self.handle_open, 'default', + 'default_open', req) + if result: + return result + + type_ = req.get_type() + result = self._call_chain(self.handle_open, type_, type_ + \ + '_open', req) + if result: + return result + + return self._call_chain(self.handle_open, 'unknown', + 'unknown_open', req) + + def error(self, proto, *args): + if proto in ['http', 'https']: + # XXX http[s] protocols are special-cased + dict = self.handle_error['http'] # https is not different than http + proto = args[2] # YUCK! + meth_name = 'http_error_%d' % proto + http_err = 1 + orig_args = args + else: + dict = self.handle_error + meth_name = proto + '_error' + http_err = 0 + args = (dict, proto, meth_name) + args + result = self._call_chain(*args) + if result: + return result + + if http_err: + args = (dict, 'default', 'http_error_default') + orig_args + return self._call_chain(*args) + +# XXX probably also want an abstract factory that knows things like + # the fact that a ProxyHandler needs to get inserted first. +# would also know when it makes sense to skip a superclass in favor of + # a subclass and when it might make sense to include both + +def build_opener(*handlers): + """Create an opener object from a list of handlers. + + The opener will use several default handlers, including support + for HTTP and FTP. If there is a ProxyHandler, it must be at the + front of the list of handlers. (Yuck.) + + If any of the handlers passed as arguments are subclasses of the + default handlers, the default handlers will not be used. + """ + + opener = OpenerDirector() + default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + FTPHandler, FileHandler] + if hasattr(httplib, 'HTTPS'): + default_classes.append(HTTPSHandler) + skip = [] + for klass in default_classes: + for check in handlers: + if inspect.isclass(check): + if issubclass(check, klass): + skip.append(klass) + elif isinstance(check, klass): + skip.append(klass) + for klass in skip: + default_classes.remove(klass) + + for klass in default_classes: + opener.add_handler(klass()) + + for h in handlers: + if inspect.isclass(h): + h = h() + opener.add_handler(h) + return opener + +class BaseHandler: + def add_parent(self, parent): + self.parent = parent + def close(self): + self.parent = None + +class HTTPDefaultErrorHandler(BaseHandler): + def http_error_default(self, req, fp, code, msg, hdrs): + raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) + +class HTTPRedirectHandler(BaseHandler): + def redirect_request(self, req, fp, code, msg, headers, newurl): + """Return a Request or None in response to a redirect. + + This is called by the http_error_30x methods when a redirection + response is received. If a redirection should take place, return a new + Request to allow http_error_30x to perform the redirect. Otherwise, + raise HTTPError if no-one else should try to handle this url. Return + None if you can't but another Handler might. + + """ + m = req.get_method() + if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") + or code in (301, 302, 303) and m == "POST"): + # Strictly (according to RFC 2616), 301 or 302 in response + # to a POST MUST NOT cause a redirection without confirmation + # from the user (of urllib2, in this case). In practice, + # essentially all clients do redirect in this case, so we + # do the same. + return Request(newurl, headers=req.headers) + else: + raise HTTPError(req.get_full_url(), code, msg, headers, fp) + + # Implementation note: To avoid the server sending us into an + # infinite loop, the request object needs to track what URLs we + # have already seen. Do this by adding a handler-specific + # attribute to the Request object. + def http_error_302(self, req, fp, code, msg, headers): + if headers.has_key('location'): + newurl = headers['location'] + elif headers.has_key('uri'): + newurl = headers['uri'] + else: + return + newurl = urlparse.urljoin(req.get_full_url(), newurl) + + # XXX Probably want to forget about the state of the current + # request, although that might interact poorly with other + # handlers that also use handler-specific request attributes + new = self.redirect_request(req, fp, code, msg, headers, newurl) + if new is None: + return + + # loop detection + new.error_302_dict = {} + if hasattr(req, 'error_302_dict'): + if len(req.error_302_dict)>10 or \ + req.error_302_dict.has_key(newurl): + raise HTTPError(req.get_full_url(), code, + self.inf_msg + msg, headers, fp) + new.error_302_dict.update(req.error_302_dict) + new.error_302_dict[newurl] = newurl + + # Don't close the fp until we are sure that we won't use it + # with HTTPError. + fp.read() + fp.close() + + return self.parent.open(new) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + + inf_msg = "The HTTP server returned a redirect error that would " \ + "lead to an infinite loop.\n" \ + "The last 30x error message was:\n" + +class ProxyHandler(BaseHandler): + def __init__(self, proxies=None): + if proxies is None: + proxies = getproxies() + assert hasattr(proxies, 'has_key'), "proxies must be a mapping" + self.proxies = proxies + for type, url in proxies.items(): + setattr(self, '%s_open' % type, + lambda r, proxy=url, type=type, meth=self.proxy_open: \ + meth(r, proxy, type)) + + def proxy_open(self, req, proxy, type): + orig_type = req.get_type() + type, r_type = splittype(proxy) + host, XXX = splithost(r_type) + if '@' in host: + user_pass, host = host.split('@', 1) + if ':' in user_pass: + user, password = user_pass.split(':', 1) + user_pass = base64.encodestring('%s:%s' % (unquote(user), + unquote(password))) + req.add_header('Proxy-Authorization', 'Basic ' + user_pass) + host = unquote(host) + req.set_proxy(host, type) + if orig_type == type: + # let other handlers take care of it + # XXX this only makes sense if the proxy is before the + # other handlers + return None + else: + # need to start over, because the other handlers don't + # grok the proxy's URL type + return self.parent.open(req) + +# feature suggested by Duncan Booth +# XXX custom is not a good name +class CustomProxy: + # either pass a function to the constructor or override handle + def __init__(self, proto, func=None, proxy_addr=None): + self.proto = proto + self.func = func + self.addr = proxy_addr + + def handle(self, req): + if self.func and self.func(req): + return 1 + + def get_proxy(self): + return self.addr + +class CustomProxyHandler(BaseHandler): + def __init__(self, *proxies): + self.proxies = {} + + def proxy_open(self, req): + proto = req.get_type() + try: + proxies = self.proxies[proto] + except KeyError: + return None + for p in proxies: + if p.handle(req): + req.set_proxy(p.get_proxy()) + return self.parent.open(req) + return None + + def do_proxy(self, p, req): + return self.parent.open(req) + + def add_proxy(self, cpo): + if self.proxies.has_key(cpo.proto): + self.proxies[cpo.proto].append(cpo) + else: + self.proxies[cpo.proto] = [cpo] + +class HTTPPasswordMgr: + def __init__(self): + self.passwd = {} + + def add_password(self, realm, uri, user, passwd): + # uri could be a single URI or a sequence + if isinstance(uri, (types.StringType, types.UnicodeType)): + uri = [uri] + uri = tuple(map(self.reduce_uri, uri)) + if not self.passwd.has_key(realm): + self.passwd[realm] = {} + self.passwd[realm][uri] = (user, passwd) + + def find_user_password(self, realm, authuri): + domains = self.passwd.get(realm, {}) + authuri = self.reduce_uri(authuri) + for uris, authinfo in domains.items(): + for uri in uris: + if self.is_suburi(uri, authuri): + return authinfo + return None, None + + def reduce_uri(self, uri): + """Accept netloc or URI and extract only the netloc and path""" + parts = urlparse.urlparse(uri) + if parts[1]: + return parts[1], parts[2] or '/' + else: + return parts[2], '/' + + def is_suburi(self, base, test): + """Check if test is below base in a URI tree + + Both args must be URIs in reduced form. + """ + if base == test: + return 1 + if base[0] != test[0]: + return 0 + common = posixpath.commonprefix((base[1], test[1])) + if len(common) == len(base[1]): + return 1 + return 0 + + +class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr): + + def find_user_password(self, realm, authuri): + user, password = HTTPPasswordMgr.find_user_password(self,realm,authuri) + if user is not None: + return user, password + return HTTPPasswordMgr.find_user_password(self, None, authuri) + + +class AbstractBasicAuthHandler: + + rx = re.compile('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"') + + # XXX there can actually be multiple auth-schemes in a + # www-authenticate header. should probably be a lot more careful + # in parsing them to extract multiple alternatives + + def __init__(self, password_mgr=None): + if password_mgr is None: + password_mgr = HTTPPasswordMgr() + self.passwd = password_mgr + self.add_password = self.passwd.add_password + + def http_error_auth_reqed(self, authreq, host, req, headers): + # XXX could be multiple headers + authreq = headers.get(authreq, None) + if authreq: + mo = AbstractBasicAuthHandler.rx.match(authreq) + if mo: + scheme, realm = mo.groups() + if scheme.lower() == 'basic': + return self.retry_http_basic_auth(host, req, realm) + + def retry_http_basic_auth(self, host, req, realm): + user,pw = self.passwd.find_user_password(realm, host) + if pw: + raw = "%s:%s" % (user, pw) + auth = 'Basic %s' % base64.encodestring(raw).strip() + if req.headers.get(self.auth_header, None) == auth: + return None + req.add_header(self.auth_header, auth) + return self.parent.open(req) + else: + return None + +class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): + + auth_header = 'Authorization' + + def http_error_401(self, req, fp, code, msg, headers): + host = urlparse.urlparse(req.get_full_url())[1] + return self.http_error_auth_reqed('www-authenticate', + host, req, headers) + + +class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): + + auth_header = 'Proxy-Authorization' + + def http_error_407(self, req, fp, code, msg, headers): + host = req.get_host() + return self.http_error_auth_reqed('proxy-authenticate', + host, req, headers) + + +class AbstractDigestAuthHandler: + + def __init__(self, passwd=None): + if passwd is None: + passwd = HTTPPasswordMgr() + self.passwd = passwd + self.add_password = self.passwd.add_password + + def http_error_auth_reqed(self, authreq, host, req, headers): + authreq = headers.get(self.auth_header, None) + if authreq: + kind = authreq.split()[0] + if kind == 'Digest': + return self.retry_http_digest_auth(req, authreq) + + def retry_http_digest_auth(self, req, auth): + token, challenge = auth.split(' ', 1) + chal = parse_keqv_list(parse_http_list(challenge)) + auth = self.get_authorization(req, chal) + if auth: + auth_val = 'Digest %s' % auth + if req.headers.get(self.auth_header, None) == auth_val: + return None + req.add_header(self.auth_header, auth_val) + resp = self.parent.open(req) + return resp + + def get_authorization(self, req, chal): + try: + realm = chal['realm'] + nonce = chal['nonce'] + algorithm = chal.get('algorithm', 'MD5') + # mod_digest doesn't send an opaque, even though it isn't + # supposed to be optional + opaque = chal.get('opaque', None) + except KeyError: + return None + + H, KD = self.get_algorithm_impls(algorithm) + if H is None: + return None + + user, pw = self.passwd.find_user_password(realm, + req.get_full_url()) + if user is None: + return None + + # XXX not implemented yet + if req.has_data(): + entdig = self.get_entity_digest(req.get_data(), chal) + else: + entdig = None + + A1 = "%s:%s:%s" % (user, realm, pw) + A2 = "%s:%s" % (req.has_data() and 'POST' or 'GET', + # XXX selector: what about proxies and full urls + req.get_selector()) + respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) + # XXX should the partial digests be encoded too? + + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (user, realm, nonce, req.get_selector(), + respdig) + if opaque: + base = base + ', opaque="%s"' % opaque + if entdig: + base = base + ', digest="%s"' % entdig + if algorithm != 'MD5': + base = base + ', algorithm="%s"' % algorithm + return base + + def get_algorithm_impls(self, algorithm): + # lambdas assume digest modules are imported at the top level + if algorithm == 'MD5': + H = lambda x, e=encode_digest:e(md5.new(x).digest()) + elif algorithm == 'SHA': + H = lambda x, e=encode_digest:e(sha.new(x).digest()) + # XXX MD5-sess + KD = lambda s, d, H=H: H("%s:%s" % (s, d)) + return H, KD + + def get_entity_digest(self, data, chal): + # XXX not implemented yet + return None + + +class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): + """An authentication protocol defined by RFC 2069 + + Digest authentication improves on basic authentication because it + does not transmit passwords in the clear. + """ + + header = 'Authorization' + + def http_error_401(self, req, fp, code, msg, headers): + host = urlparse.urlparse(req.get_full_url())[1] + self.http_error_auth_reqed('www-authenticate', host, req, headers) + + +class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): + + header = 'Proxy-Authorization' + + def http_error_407(self, req, fp, code, msg, headers): + host = req.get_host() + self.http_error_auth_reqed('proxy-authenticate', host, req, headers) + + +def encode_digest(digest): + hexrep = [] + for c in digest: + n = (ord(c) >> 4) & 0xf + hexrep.append(hex(n)[-1]) + n = ord(c) & 0xf + hexrep.append(hex(n)[-1]) + return ''.join(hexrep) + + +class AbstractHTTPHandler(BaseHandler): + + def do_open(self, http_class, req): + host = req.get_host() + if not host: + raise URLError('no host given') + + h = http_class(host) # will parse host:port + if req.has_data(): + data = req.get_data() + h.putrequest('POST', req.get_selector()) + if not req.headers.has_key('Content-type'): + h.putheader('Content-type', + 'application/x-www-form-urlencoded') + if not req.headers.has_key('Content-length'): + h.putheader('Content-length', '%d' % len(data)) + else: + h.putrequest('GET', req.get_selector()) + + scheme, sel = splittype(req.get_selector()) + sel_host, sel_path = splithost(sel) + h.putheader('Host', sel_host or host) + for args in self.parent.addheaders: + h.putheader(*args) + for k, v in req.headers.items(): + h.putheader(k, v) + # httplib will attempt to connect() here. be prepared + # to convert a socket error to a URLError. + try: + h.endheaders() + except socket.error, err: + raise URLError(err) + if req.has_data(): + h.send(data) + + code, msg, hdrs = h.getreply() + fp = h.getfile() + if code == 200: + return addinfourl(fp, hdrs, req.get_full_url()) + else: + return self.parent.error('http', req, fp, code, msg, hdrs) + + +class HTTPHandler(AbstractHTTPHandler): + + def http_open(self, req): + return self.do_open(httplib.HTTP, req) + + +if hasattr(httplib, 'HTTPS'): + class HTTPSHandler(AbstractHTTPHandler): + + def https_open(self, req): + return self.do_open(httplib.HTTPS, req) + + +class UnknownHandler(BaseHandler): + def unknown_open(self, req): + type = req.get_type() + raise URLError('unknown url type: %s' % type) + +def parse_keqv_list(l): + """Parse list of key=value strings where keys are not duplicated.""" + parsed = {} + for elt in l: + k, v = elt.split('=', 1) + if v[0] == '"' and v[-1] == '"': + v = v[1:-1] + parsed[k] = v + return parsed + +def parse_http_list(s): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comman-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. + """ + # XXX this function could probably use more testing + + list = [] + end = len(s) + i = 0 + inquote = 0 + start = 0 + while i < end: + cur = s[i:] + c = cur.find(',') + q = cur.find('"') + if c == -1: + list.append(s[start:]) + break + if q == -1: + if inquote: + raise ValueError, "unbalanced quotes" + else: + list.append(s[start:i+c]) + i = i + c + 1 + continue + if inquote: + if q < c: + list.append(s[start:i+c]) + i = i + c + 1 + start = i + inquote = 0 + else: + i = i + q + else: + if c < q: + list.append(s[start:i+c]) + i = i + c + 1 + start = i + else: + inquote = 1 + i = i + q + 1 + return map(lambda x: x.strip(), list) + +class FileHandler(BaseHandler): + # Use local file or FTP depending on form of URL + def file_open(self, req): + url = req.get_selector() + if url[:2] == '//' and url[2:3] != '/': + req.type = 'ftp' + return self.parent.open(req) + else: + return self.open_local_file(req) + + # names for the localhost + names = None + def get_names(self): + if FileHandler.names is None: + FileHandler.names = (socket.gethostbyname('localhost'), + socket.gethostbyname(socket.gethostname())) + return FileHandler.names + + # not entirely sure what the rules are here + def open_local_file(self, req): + host = req.get_host() + file = req.get_selector() + localfile = url2pathname(file) + stats = os.stat(localfile) + size = stats[stat.ST_SIZE] + modified = rfc822.formatdate(stats[stat.ST_MTIME]) + mtype = mimetypes.guess_type(file)[0] + stats = os.stat(localfile) + headers = mimetools.Message(StringIO( + 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % + (mtype or 'text/plain', size, modified))) + if host: + host, port = splitport(host) + if not host or \ + (not port and socket.gethostbyname(host) in self.get_names()): + return addinfourl(open(localfile, 'rb'), + headers, 'file:'+file) + raise URLError('file not on local host') + +class FTPHandler(BaseHandler): + def ftp_open(self, req): + host = req.get_host() + if not host: + raise IOError, ('ftp error', 'no host given') + # XXX handle custom username & password + try: + host = socket.gethostbyname(host) + except socket.error, msg: + raise URLError(msg) + host, port = splitport(host) + if port is None: + port = ftplib.FTP_PORT + path, attrs = splitattr(req.get_selector()) + path = unquote(path) + dirs = path.split('/') + dirs, file = dirs[:-1], dirs[-1] + if dirs and not dirs[0]: + dirs = dirs[1:] + user = passwd = '' # XXX + try: + fw = self.connect_ftp(user, passwd, host, port, dirs) + type = file and 'I' or 'D' + for attr in attrs: + attr, value = splitattr(attr) + if attr.lower() == 'type' and \ + value in ('a', 'A', 'i', 'I', 'd', 'D'): + type = value.upper() + fp, retrlen = fw.retrfile(file, type) + headers = "" + mtype = mimetypes.guess_type(req.get_full_url())[0] + if mtype: + headers += "Content-Type: %s\n" % mtype + if retrlen is not None and retrlen >= 0: + headers += "Content-Length: %d\n" % retrlen + sf = StringIO(headers) + headers = mimetools.Message(sf) + return addinfourl(fp, headers, req.get_full_url()) + except ftplib.all_errors, msg: + raise IOError, ('ftp error', msg), sys.exc_info()[2] + + def connect_ftp(self, user, passwd, host, port, dirs): + fw = ftpwrapper(user, passwd, host, port, dirs) +## fw.ftp.set_debuglevel(1) + return fw + +class CacheFTPHandler(FTPHandler): + # XXX would be nice to have pluggable cache strategies + # XXX this stuff is definitely not thread safe + def __init__(self): + self.cache = {} + self.timeout = {} + self.soonest = 0 + self.delay = 60 + self.max_conns = 16 + + def setTimeout(self, t): + self.delay = t + + def setMaxConns(self, m): + self.max_conns = m + + def connect_ftp(self, user, passwd, host, port, dirs): + key = user, passwd, host, port + if self.cache.has_key(key): + self.timeout[key] = time.time() + self.delay + else: + self.cache[key] = ftpwrapper(user, passwd, host, port, dirs) + self.timeout[key] = time.time() + self.delay + self.check_cache() + return self.cache[key] + + def check_cache(self): + # first check for old ones + t = time.time() + if self.soonest <= t: + for k, v in self.timeout.items(): + if v < t: + self.cache[k].close() + del self.cache[k] + del self.timeout[k] + self.soonest = min(self.timeout.values()) + + # then check the size + if len(self.cache) == self.max_conns: + for k, v in self.timeout.items(): + if v == self.soonest: + del self.cache[k] + del self.timeout[k] + break + self.soonest = min(self.timeout.values()) + +class GopherHandler(BaseHandler): + def gopher_open(self, req): + host = req.get_host() + if not host: + raise GopherError('no host given') + host = unquote(host) + selector = req.get_selector() + type, selector = splitgophertype(selector) + selector, query = splitquery(selector) + selector = unquote(selector) + if query: + query = unquote(query) + fp = gopherlib.send_query(selector, query, host) + else: + fp = gopherlib.send_selector(selector, host) + return addinfourl(fp, noheaders(), req.get_full_url()) + +#bleck! don't use this yet +class OpenerFactory: + + default_handlers = [UnknownHandler, HTTPHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + FTPHandler, FileHandler] + proxy_handlers = [ProxyHandler] + handlers = [] + replacement_handlers = [] + + def add_proxy_handler(self, ph): + self.proxy_handlers = self.proxy_handlers + [ph] + + def add_handler(self, h): + self.handlers = self.handlers + [h] + + def replace_handler(self, h): + pass + + def build_opener(self): + opener = OpenerDirector() + for ph in self.proxy_handlers: + if inspect.isclass(ph): + ph = ph() + opener.add_handler(ph) + +if __name__ == "__main__": + # XXX some of the test code depends on machine configurations that + # are internal to CNRI. Need to set up a public server with the + # right authentication configuration for test purposes. + if socket.gethostname() == 'bitdiddle': + localhost = 'bitdiddle.cnri.reston.va.us' + elif socket.gethostname() == 'bitdiddle.concentric.net': + localhost = 'localhost' + else: + localhost = None + urls = [ + # Thanks to Fred for finding these! + 'gopher://gopher.lib.ncsu.edu/11/library/stacks/Alex', + 'gopher://gopher.vt.edu:10010/10/33', + + 'file:/etc/passwd', + 'file://nonsensename/etc/passwd', + 'ftp://www.python.org/pub/python/misc/sousa.au', + 'ftp://www.python.org/pub/tmp/blat', + 'http://www.espn.com/', # redirect + 'http://www.python.org/Spanish/Inquistion/', + ('http://www.python.org/cgi-bin/faqw.py', + 'query=pythonistas&querytype=simple&casefold=yes&req=search'), + 'http://www.python.org/', + 'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC/research-reports/00README-Legal-Rules-Regs', + ] + +## if localhost is not None: +## urls = urls + [ +## 'file://%s/etc/passwd' % localhost, +## 'http://%s/simple/' % localhost, +## 'http://%s/digest/' % localhost, +## 'http://%s/not/found.h' % localhost, +## ] + +## bauth = HTTPBasicAuthHandler() +## bauth.add_password('basic_test_realm', localhost, 'jhylton', +## 'password') +## dauth = HTTPDigestAuthHandler() +## dauth.add_password('digest_test_realm', localhost, 'jhylton', +## 'password') + + + cfh = CacheFTPHandler() + cfh.setTimeout(1) + +## # XXX try out some custom proxy objects too! +## def at_cnri(req): +## host = req.get_host() +## print host +## if host[-18:] == '.cnri.reston.va.us': +## return 1 +## p = CustomProxy('http', at_cnri, 'proxy.cnri.reston.va.us') +## ph = CustomProxyHandler(p) + +## install_opener(build_opener(dauth, bauth, cfh, GopherHandler, ph)) + install_opener(build_opener(cfh, GopherHandler)) + + for url in urls: + if isinstance(url, types.TupleType): + url, req = url + else: + req = None + print url + try: + f = urlopen(url, req) + except IOError, err: + print "IOError:", err + except socket.error, err: + print "socket.error:", err + else: + buf = f.read() + f.close() + print "read %d bytes" % len(buf) + print + time.sleep(0.1) diff --git a/lib-python/2.2/urlparse.py b/lib-python/2.2/urlparse.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/urlparse.py @@ -0,0 +1,276 @@ +"""Parse (absolute and relative) URLs. + +See RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, +UC Irvine, June 1995. +""" + +__all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", + "urlsplit", "urlunsplit"] + +# A classification of schemes ('' means apply by default) +uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'wais', 'file', + 'https', 'shttp', + 'prospero', 'rtsp', 'rtspu', ''] +uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet', 'wais', + 'file', + 'https', 'shttp', 'snews', + 'prospero', 'rtsp', 'rtspu', ''] +non_hierarchical = ['gopher', 'hdl', 'mailto', 'news', 'telnet', 'wais', + 'snews', 'sip', + ] +uses_params = ['ftp', 'hdl', 'prospero', 'http', + 'https', 'shttp', 'rtsp', 'rtspu', 'sip', + ''] +uses_query = ['http', 'wais', + 'https', 'shttp', + 'gopher', 'rtsp', 'rtspu', 'sip', + ''] +uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news', 'nntp', 'wais', + 'https', 'shttp', 'snews', + 'file', 'prospero', ''] + +# Characters valid in scheme names +scheme_chars = ('abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + '0123456789' + '+-.') + +MAX_CACHE_SIZE = 20 +_parse_cache = {} + +def clear_cache(): + """Clear the parse cache.""" + global _parse_cache + _parse_cache = {} + + +def urlparse(url, scheme='', allow_fragments=1): + """Parse a URL into 6 components: + :///;?# + Return a 6-tuple: (scheme, netloc, path, params, query, fragment). + Note that we don't break the components up in smaller bits + (e.g. netloc is a single string) and we don't expand % escapes.""" + tuple = urlsplit(url, scheme, allow_fragments) + scheme, netloc, url, query, fragment = tuple + if scheme in uses_params and ';' in url: + url, params = _splitparams(url) + else: + params = '' + return scheme, netloc, url, params, query, fragment + +def _splitparams(url): + if '/' in url: + i = url.find(';', url.rfind('/')) + if i < 0: + return url, '' + else: + i = url.find(';') + return url[:i], url[i+1:] + +def urlsplit(url, scheme='', allow_fragments=1): + """Parse a URL into 5 components: + :///?# + Return a 5-tuple: (scheme, netloc, path, query, fragment). + Note that we don't break the components up in smaller bits + (e.g. netloc is a single string) and we don't expand % escapes.""" + key = url, scheme, allow_fragments + cached = _parse_cache.get(key, None) + if cached: + return cached + if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth + clear_cache() + netloc = query = fragment = '' + i = url.find(':') + if i > 0: + if url[:i] == 'http': # optimize the common case + scheme = url[:i].lower() + url = url[i+1:] + if url[:2] == '//': + i = url.find('/', 2) + if i < 0: + i = url.find('#') + if i < 0: + i = len(url) + netloc = url[2:i] + url = url[i:] + if allow_fragments and '#' in url: + url, fragment = url.split('#', 1) + if '?' in url: + url, query = url.split('?', 1) + tuple = scheme, netloc, url, query, fragment + _parse_cache[key] = tuple + return tuple + for c in url[:i]: + if c not in scheme_chars: + break + else: + scheme, url = url[:i].lower(), url[i+1:] + if scheme in uses_netloc: + if url[:2] == '//': + i = url.find('/', 2) + if i < 0: + i = len(url) + netloc, url = url[2:i], url[i:] + if allow_fragments and scheme in uses_fragment and '#' in url: + url, fragment = url.split('#', 1) + if scheme in uses_query and '?' in url: + url, query = url.split('?', 1) + tuple = scheme, netloc, url, query, fragment + _parse_cache[key] = tuple + return tuple + +def urlunparse((scheme, netloc, url, params, query, fragment)): + """Put a parsed URL back together again. This may result in a + slightly different, but equivalent URL, if the URL that was parsed + originally had redundant delimiters, e.g. a ? with an empty query + (the draft states that these are equivalent).""" + if params: + url = "%s;%s" % (url, params) + return urlunsplit((scheme, netloc, url, query, fragment)) + +def urlunsplit((scheme, netloc, url, query, fragment)): + if netloc or (scheme and scheme in uses_netloc and url[:2] != '//'): + if url and url[:1] != '/': url = '/' + url + url = '//' + (netloc or '') + url + if scheme: + url = scheme + ':' + url + if query: + url = url + '?' + query + if fragment: + url = url + '#' + fragment + return url + +def urljoin(base, url, allow_fragments = 1): + """Join a base URL and a possibly relative URL to form an absolute + interpretation of the latter.""" + if not base: + return url + if not url: + return base + bscheme, bnetloc, bpath, bparams, bquery, bfragment = \ + urlparse(base, '', allow_fragments) + scheme, netloc, path, params, query, fragment = \ + urlparse(url, bscheme, allow_fragments) + if scheme != bscheme or scheme not in uses_relative: + return url + if scheme in uses_netloc: + if netloc: + return urlunparse((scheme, netloc, path, + params, query, fragment)) + netloc = bnetloc + if path[:1] == '/': + return urlunparse((scheme, netloc, path, + params, query, fragment)) + if not path: + if not params: + params = bparams + if not query: + query = bquery + return urlunparse((scheme, netloc, bpath, + params, query, fragment)) + segments = bpath.split('/')[:-1] + path.split('/') + # XXX The stuff below is bogus in various ways... + if segments[-1] == '.': + segments[-1] = '' + while '.' in segments: + segments.remove('.') + while 1: + i = 1 + n = len(segments) - 1 + while i < n: + if (segments[i] == '..' + and segments[i-1] not in ('', '..')): + del segments[i-1:i+1] + break + i = i+1 + else: + break + if segments == ['', '..']: + segments[-1] = '' + elif len(segments) >= 2 and segments[-1] == '..': + segments[-2:] = [''] + return urlunparse((scheme, netloc, '/'.join(segments), + params, query, fragment)) + +def urldefrag(url): + """Removes any existing fragment from URL. + + Returns a tuple of the defragmented URL and the fragment. If + the URL contained no fragments, the second element is the + empty string. + """ + if '#' in url: + s, n, p, a, q, frag = urlparse(url) + defrag = urlunparse((s, n, p, a, q, '')) + return defrag, frag + else: + return url, '' + + +test_input = """ + http://a/b/c/d + + g:h = + http:g = + http: = + g = + ./g = + g/ = + /g = + //g = + ?y = + g?y = + g?y/./x = + . = + ./ = + .. = + ../ = + ../g = + ../.. = + ../../g = + ../../../g = + ./../g = + ./g/. = + /./g = + g/./h = + g/../h = + http:g = + http: = + http:?y = + http:g?y = + http:g?y/./x = +""" +# XXX The result for //g is actually http://g/; is this a problem? + +def test(): + import sys + base = '' + if sys.argv[1:]: + fn = sys.argv[1] + if fn == '-': + fp = sys.stdin + else: + fp = open(fn) + else: + import StringIO + fp = StringIO.StringIO(test_input) + while 1: + line = fp.readline() + if not line: break + words = line.split() + if not words: + continue + url = words[0] + parts = urlparse(url) + print '%-10s : %s' % (url, parts) + abs = urljoin(base, url) + if not base: + base = abs + wrapped = '' % abs + print '%-10s = %s' % (url, wrapped) + if len(words) == 3 and words[1] == '=': + if wrapped != words[2]: + print 'EXPECTED', words[2], '!!!!!!!!!!' + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/user.py b/lib-python/2.2/user.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/user.py @@ -0,0 +1,45 @@ +"""Hook to allow user-specified customization code to run. + +As a policy, Python doesn't run user-specified code on startup of +Python programs (interactive sessions execute the script specified in +the PYTHONSTARTUP environment variable if it exists). + +However, some programs or sites may find it convenient to allow users +to have a standard customization file, which gets run when a program +requests it. This module implements such a mechanism. A program +that wishes to use the mechanism must execute the statement + + import user + +The user module looks for a file .pythonrc.py in the user's home +directory and if it can be opened, execfile()s it in its own global +namespace. Errors during this phase are not caught; that's up to the +program that imports the user module, if it wishes. + +The user's .pythonrc.py could conceivably test for sys.version if it +wishes to do different things depending on the Python version. + +""" + +import os + +home = os.curdir # Default +if os.environ.has_key('HOME'): + home = os.environ['HOME'] +elif os.name == 'posix': + home = os.path.expanduser("~/") +elif os.name == 'nt': # Contributed by Jeff Bauer + if os.environ.has_key('HOMEPATH'): + if os.environ.has_key('HOMEDRIVE'): + home = os.environ['HOMEDRIVE'] + os.environ['HOMEPATH'] + else: + home = os.environ['HOMEPATH'] + +pythonrc = os.path.join(home, ".pythonrc.py") +try: + f = open(pythonrc) +except IOError: + pass +else: + f.close() + execfile(pythonrc) diff --git a/lib-python/2.2/uu.py b/lib-python/2.2/uu.py new file mode 100755 --- /dev/null +++ b/lib-python/2.2/uu.py @@ -0,0 +1,195 @@ +#! /usr/bin/env python + +# Copyright 1994 by Lance Ellinghouse +# Cathedral City, California Republic, United States of America. +# All Rights Reserved +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies and that +# both that copyright notice and this permission notice appear in +# supporting documentation, and that the name of Lance Ellinghouse +# not be used in advertising or publicity pertaining to distribution +# of the software without specific, written prior permission. +# LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +# FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE +# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Modified by Jack Jansen, CWI, July 1995: +# - Use binascii module to do the actual line-by-line conversion +# between ascii and binary. This results in a 1000-fold speedup. The C +# version is still 5 times faster, though. +# - Arguments more compliant with python standard + +"""Implementation of the UUencode and UUdecode functions. + +encode(in_file, out_file [,name, mode]) +decode(in_file [, out_file, mode]) +""" + +import binascii +import os +import sys +from types import StringType + +__all__ = ["Error", "encode", "decode"] + +class Error(Exception): + pass + +def encode(in_file, out_file, name=None, mode=None): + """Uuencode file""" + # + # If in_file is a pathname open it and change defaults + # + if in_file == '-': + in_file = sys.stdin + elif isinstance(in_file, StringType): + if name is None: + name = os.path.basename(in_file) + if mode is None: + try: + mode = os.stat(in_file)[0] + except AttributeError: + pass + in_file = open(in_file, 'rb') + # + # Open out_file if it is a pathname + # + if out_file == '-': + out_file = sys.stdout + elif isinstance(out_file, StringType): + out_file = open(out_file, 'w') + # + # Set defaults for name and mode + # + if name is None: + name = '-' + if mode is None: + mode = 0666 + # + # Write the data + # + out_file.write('begin %o %s\n' % ((mode&0777),name)) + str = in_file.read(45) + while len(str) > 0: + out_file.write(binascii.b2a_uu(str)) + str = in_file.read(45) + out_file.write(' \nend\n') + + +def decode(in_file, out_file=None, mode=None, quiet=0): + """Decode uuencoded file""" + # + # Open the input file, if needed. + # + if in_file == '-': + in_file = sys.stdin + elif isinstance(in_file, StringType): + in_file = open(in_file) + # + # Read until a begin is encountered or we've exhausted the file + # + while 1: + hdr = in_file.readline() + if not hdr: + raise Error, 'No valid begin line found in input file' + if hdr[:5] != 'begin': + continue + hdrfields = hdr.split(" ", 2) + if len(hdrfields) == 3 and hdrfields[0] == 'begin': + try: + int(hdrfields[1], 8) + break + except ValueError: + pass + if out_file is None: + out_file = hdrfields[2].rstrip() + if os.path.exists(out_file): + raise Error, 'Cannot overwrite existing file: %s' % out_file + if mode is None: + mode = int(hdrfields[1], 8) + # + # Open the output file + # + opened = False + if out_file == '-': + out_file = sys.stdout + elif isinstance(out_file, StringType): + fp = open(out_file, 'wb') + try: + os.path.chmod(out_file, mode) + except AttributeError: + pass + out_file = fp + opened = True + # + # Main decoding loop + # + s = in_file.readline() + while s and s.strip() != 'end': + try: + data = binascii.a2b_uu(s) + except binascii.Error, v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((ord(s[0])-32) & 63) * 4 + 5) / 3 + data = binascii.a2b_uu(s[:nbytes]) + if not quiet: + sys.stderr.write("Warning: %s\n" % str(v)) + out_file.write(data) + s = in_file.readline() + if not s: + raise Error, 'Truncated input file' + if opened: + out_file.close() + +def test(): + """uuencode/uudecode main program""" + import getopt + + dopt = 0 + topt = 0 + input = sys.stdin + output = sys.stdout + ok = 1 + try: + optlist, args = getopt.getopt(sys.argv[1:], 'dt') + except getopt.error: + ok = 0 + if not ok or len(args) > 2: + print 'Usage:', sys.argv[0], '[-d] [-t] [input [output]]' + print ' -d: Decode (in stead of encode)' + print ' -t: data is text, encoded format unix-compatible text' + sys.exit(1) + + for o, a in optlist: + if o == '-d': dopt = 1 + if o == '-t': topt = 1 + + if len(args) > 0: + input = args[0] + if len(args) > 1: + output = args[1] + + if dopt: + if topt: + if isinstance(output, StringType): + output = open(output, 'w') + else: + print sys.argv[0], ': cannot do -t to stdout' + sys.exit(1) + decode(input, output) + else: + if topt: + if isinstance(input, StringType): + input = open(input, 'r') + else: + print sys.argv[0], ': cannot do -t from stdin' + sys.exit(1) + encode(input, output) + +if __name__ == '__main__': + test() diff --git a/lib-python/2.2/warnings.py b/lib-python/2.2/warnings.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/warnings.py @@ -0,0 +1,258 @@ +"""Python part of the warnings subsystem.""" + +import sys, re, types + +__all__ = ["warn", "showwarning", "formatwarning", "filterwarnings", + "resetwarnings"] + +defaultaction = "default" +filters = [] +onceregistry = {} + +def warn(message, category=None, stacklevel=1): + """Issue a warning, or maybe ignore it or raise an exception.""" + # Check category argument + if category is None: + category = UserWarning + assert issubclass(category, Warning) + # Get context information + try: + caller = sys._getframe(stacklevel) + except ValueError: + globals = sys.__dict__ + lineno = 1 + else: + globals = caller.f_globals + lineno = caller.f_lineno + if globals.has_key('__name__'): + module = globals['__name__'] + else: + module = "" + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith(".pyc") or fnl.endswith(".pyo"): + filename = filename[:-1] + else: + if module == "__main__": + filename = sys.argv[0] + if not filename: + filename = module + registry = globals.setdefault("__warningregistry__", {}) + warn_explicit(message, category, filename, lineno, module, registry) + +def warn_explicit(message, category, filename, lineno, + module=None, registry=None): + if module is None: + module = filename + if module[-3:].lower() == ".py": + module = module[:-3] # XXX What about leading pathname? + if registry is None: + registry = {} + key = (message, category, lineno) + # Quick test for common case + if registry.get(key): + return + # Search the filters + for item in filters: + action, msg, cat, mod, ln = item + if (msg.match(message) and + issubclass(category, cat) and + mod.match(module) and + (ln == 0 or lineno == ln)): + break + else: + action = defaultaction + # Early exit actions + if action == "ignore": + registry[key] = 1 + return + if action == "error": + raise category(message) + # Other actions + if action == "once": + registry[key] = 1 + oncekey = (message, category) + if onceregistry.get(oncekey): + return + onceregistry[oncekey] = 1 + elif action == "always": + pass + elif action == "module": + registry[key] = 1 + altkey = (message, category, 0) + if registry.get(altkey): + return + registry[altkey] = 1 + elif action == "default": + registry[key] = 1 + else: + # Unrecognized actions are errors + raise RuntimeError( + "Unrecognized action (%s) in warnings.filters:\n %s" % + (`action`, str(item))) + # Print message and context + showwarning(message, category, filename, lineno) + +def showwarning(message, category, filename, lineno, file=None): + """Hook to write a warning to a file; replace if you like.""" + if file is None: + file = sys.stderr + try: + file.write(formatwarning(message, category, filename, lineno)) + except IOError: + pass # the file (probably stderr) is invalid - this warning gets lost. + +def formatwarning(message, category, filename, lineno): + """Function to format a warning the standard way.""" + import linecache + s = "%s:%s: %s: %s\n" % (filename, lineno, category.__name__, message) + line = linecache.getline(filename, lineno).strip() + if line: + s = s + " " + line + "\n" + return s + +def filterwarnings(action, message="", category=Warning, module="", lineno=0, + append=0): + """Insert an entry into the list of warnings filters (at the front). + + Use assertions to check that all arguments have the right type.""" + assert action in ("error", "ignore", "always", "default", "module", + "once"), "invalid action: %s" % `action` + assert isinstance(message, types.StringType), "message must be a string" + assert isinstance(category, types.ClassType), "category must be a class" + assert issubclass(category, Warning), "category must be a Warning subclass" + assert type(module) is types.StringType, "module must be a string" + assert type(lineno) is types.IntType and lineno >= 0, \ + "lineno must be an int >= 0" + item = (action, re.compile(message, re.I), category, + re.compile(module), lineno) + if append: + filters.append(item) + else: + filters.insert(0, item) + +def resetwarnings(): + """Clear the list of warning filters, so that no filters are active.""" + filters[:] = [] + +class _OptionError(Exception): + """Exception used by option processing helpers.""" + pass + +# Helper to process -W options passed via sys.warnoptions +def _processoptions(args): + for arg in args: + try: + _setoption(arg) + except _OptionError, msg: + print >>sys.stderr, "Invalid -W option ignored:", msg + +# Helper for _processoptions() +def _setoption(arg): + parts = arg.split(':') + if len(parts) > 5: + raise _OptionError("too many fields (max 5): %s" % `arg`) + while len(parts) < 5: + parts.append('') + action, message, category, module, lineno = [s.strip() + for s in parts] + action = _getaction(action) + message = re.escape(message) + category = _getcategory(category) + module = re.escape(module) + if module: + module = module + '$' + if lineno: + try: + lineno = int(lineno) + if lineno < 0: + raise ValueError + except (ValueError, OverflowError): + raise _OptionError("invalid lineno %s" % `lineno`) + else: + lineno = 0 + filterwarnings(action, message, category, module, lineno) + +# Helper for _setoption() +def _getaction(action): + if not action: + return "default" + if action == "all": return "always" # Alias + for a in ['default', 'always', 'ignore', 'module', 'once', 'error']: + if a.startswith(action): + return a + raise _OptionError("invalid action: %s" % `action`) + +# Helper for _setoption() +def _getcategory(category): + if not category: + return Warning + if re.match("^[a-zA-Z0-9_]+$", category): + try: + cat = eval(category) + except NameError: + raise _OptionError("unknown warning category: %s" % `category`) + else: + i = category.rfind(".") + module = category[:i] + klass = category[i+1:] + try: + m = __import__(module, None, None, [klass]) + except ImportError: + raise _OptionError("invalid module name: %s" % `module`) + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %s" % `category`) + if (not isinstance(cat, types.ClassType) or + not issubclass(cat, Warning)): + raise _OptionError("invalid warning category: %s" % `category`) + return cat + +# Self-test +def _test(): + import getopt + testoptions = [] + try: + opts, args = getopt.getopt(sys.argv[1:], "W:") + except getopt.error, msg: + print >>sys.stderr, msg + return + for o, a in opts: + testoptions.append(a) + try: + _processoptions(testoptions) + except _OptionError, msg: + print >>sys.stderr, msg + return + for item in filters: print item + hello = "hello world" + warn(hello); warn(hello); warn(hello); warn(hello) + warn(hello, UserWarning) + warn(hello, DeprecationWarning) + for i in range(3): + warn(hello) + filterwarnings("error", "", Warning, "", 0) + try: + warn(hello) + except Exception, msg: + print "Caught", msg.__class__.__name__ + ":", msg + else: + print "No exception" + resetwarnings() + try: + filterwarnings("booh", "", Warning, "", 0) + except Exception, msg: + print "Caught", msg.__class__.__name__ + ":", msg + else: + print "No exception" + +# Module initialization +if __name__ == "__main__": + import __main__ + sys.modules['warnings'] = __main__ + _test() +else: + _processoptions(sys.warnoptions) + filterwarnings("ignore", category=OverflowWarning, append=1) diff --git a/lib-python/2.2/wave.py b/lib-python/2.2/wave.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/wave.py @@ -0,0 +1,489 @@ +"""Stuff to parse WAVE files. + +Usage. + +Reading WAVE files: + f = wave.open(file, 'r') +where file is either the name of a file or an open file pointer. +The open file pointer must have methods read(), seek(), and close(). +When the setpos() and rewind() methods are not used, the seek() +method is not necessary. + +This returns an instance of a class with the following public methods: + getnchannels() -- returns number of audio channels (1 for + mono, 2 for stereo) + getsampwidth() -- returns sample width in bytes + getframerate() -- returns sampling frequency + getnframes() -- returns number of audio frames + getcomptype() -- returns compression type ('NONE' for linear samples) + getcompname() -- returns human-readable version of + compression type ('not compressed' linear samples) + getparams() -- returns a tuple consisting of all of the + above in the above order + getmarkers() -- returns None (for compatibility with the + aifc module) + getmark(id) -- raises an error since the mark does not + exist (for compatibility with the aifc module) + readframes(n) -- returns at most n frames of audio + rewind() -- rewind to the beginning of the audio stream + setpos(pos) -- seek to the specified position + tell() -- return the current position + close() -- close the instance (make it unusable) +The position returned by tell() and the position given to setpos() +are compatible and have nothing to do with the actual position in the +file. +The close() method is called automatically when the class instance +is destroyed. + +Writing WAVE files: + f = wave.open(file, 'w') +where file is either the name of a file or an open file pointer. +The open file pointer must have methods write(), tell(), seek(), and +close(). + +This returns an instance of a class with the following public methods: + setnchannels(n) -- set the number of channels + setsampwidth(n) -- set the sample width + setframerate(n) -- set the frame rate + setnframes(n) -- set the number of frames + setcomptype(type, name) + -- set the compression type and the + human-readable compression type + setparams(tuple) + -- set all parameters at once + tell() -- return current position in output file + writeframesraw(data) + -- write audio frames without pathing up the + file header + writeframes(data) + -- write audio frames and patch up the file header + close() -- patch up the file header and close the + output file +You should set the parameters before the first writeframesraw or +writeframes. The total number of frames does not need to be set, +but when it is set to the correct value, the header does not have to +be patched up. +It is best to first set all parameters, perhaps possibly the +compression type, and then write audio frames using writeframesraw. +When all frames have been written, either call writeframes('') or +close() to patch up the sizes in the header. +The close() method is called automatically when the class instance +is destroyed. +""" + +import __builtin__ + +__all__ = ["open", "openfp", "Error"] + +class Error(Exception): + pass + +WAVE_FORMAT_PCM = 0x0001 + +_array_fmts = None, 'b', 'h', None, 'l' + +# Determine endian-ness +import struct +if struct.pack("h", 1) == "\000\001": + big_endian = 1 +else: + big_endian = 0 + +from chunk import Chunk + +class Wave_read: + """Variables used in this class: + + These variables are available to the user though appropriate + methods of this class: + _file -- the open file with methods read(), close(), and seek() + set through the __init__() method + _nchannels -- the number of audio channels + available through the getnchannels() method + _nframes -- the number of audio frames + available through the getnframes() method + _sampwidth -- the number of bytes per audio sample + available through the getsampwidth() method + _framerate -- the sampling frequency + available through the getframerate() method + _comptype -- the AIFF-C compression type ('NONE' if AIFF) + available through the getcomptype() method + _compname -- the human-readable AIFF-C compression type + available through the getcomptype() method + _soundpos -- the position in the audio stream + available through the tell() method, set through the + setpos() method + + These variables are used internally only: + _fmt_chunk_read -- 1 iff the FMT chunk has been read + _data_seek_needed -- 1 iff positioned correctly in audio + file for readframes() + _data_chunk -- instantiation of a chunk class for the DATA chunk + _framesize -- size of one frame in the file + """ + + def initfp(self, file): + self._convert = None + self._soundpos = 0 + self._file = Chunk(file, bigendian = 0) + if self._file.getname() != 'RIFF': + raise Error, 'file does not start with RIFF id' + if self._file.read(4) != 'WAVE': + raise Error, 'not a WAVE file' + self._fmt_chunk_read = 0 + self._data_chunk = None + while 1: + self._data_seek_needed = 1 + try: + chunk = Chunk(self._file, bigendian = 0) + except EOFError: + break + chunkname = chunk.getname() + if chunkname == 'fmt ': + self._read_fmt_chunk(chunk) + self._fmt_chunk_read = 1 + elif chunkname == 'data': + if not self._fmt_chunk_read: + raise Error, 'data chunk before fmt chunk' + self._data_chunk = chunk + self._nframes = chunk.chunksize // self._framesize + self._data_seek_needed = 0 + break + chunk.skip() + if not self._fmt_chunk_read or not self._data_chunk: + raise Error, 'fmt chunk and/or data chunk missing' + + def __init__(self, f): + self._i_opened_the_file = None + if type(f) == type(''): + f = __builtin__.open(f, 'rb') + self._i_opened_the_file = f + # else, assume it is an open file object already + self.initfp(f) + + def __del__(self): + self.close() + # + # User visible methods. + # + def getfp(self): + return self._file + + def rewind(self): + self._data_seek_needed = 1 + self._soundpos = 0 + + def close(self): + if self._i_opened_the_file: + self._i_opened_the_file.close() + self._i_opened_the_file = None + self._file = None + + def tell(self): + return self._soundpos + + def getnchannels(self): + return self._nchannels + + def getnframes(self): + return self._nframes + + def getsampwidth(self): + return self._sampwidth + + def getframerate(self): + return self._framerate + + def getcomptype(self): + return self._comptype + + def getcompname(self): + return self._compname + + def getparams(self): + return self.getnchannels(), self.getsampwidth(), \ + self.getframerate(), self.getnframes(), \ + self.getcomptype(), self.getcompname() + + def getmarkers(self): + return None + + def getmark(self, id): + raise Error, 'no marks' + + def setpos(self, pos): + if pos < 0 or pos > self._nframes: + raise Error, 'position not in range' + self._soundpos = pos + self._data_seek_needed = 1 + + def readframes(self, nframes): + if self._data_seek_needed: + self._data_chunk.seek(0, 0) + pos = self._soundpos * self._framesize + if pos: + self._data_chunk.seek(pos, 0) + self._data_seek_needed = 0 + if nframes == 0: + return '' + if self._sampwidth > 1 and big_endian: + # unfortunately the fromfile() method does not take + # something that only looks like a file object, so + # we have to reach into the innards of the chunk object + import array + chunk = self._data_chunk + data = array.array(_array_fmts[self._sampwidth]) + nitems = nframes * self._nchannels + if nitems * self._sampwidth > chunk.chunksize - chunk.size_read: + nitems = (chunk.chunksize - chunk.size_read) / self._sampwidth + data.fromfile(chunk.file.file, nitems) + # "tell" data chunk how much was read + chunk.size_read = chunk.size_read + nitems * self._sampwidth + # do the same for the outermost chunk + chunk = chunk.file + chunk.size_read = chunk.size_read + nitems * self._sampwidth + data.byteswap() + data = data.tostring() + else: + data = self._data_chunk.read(nframes * self._framesize) + if self._convert and data: + data = self._convert(data) + self._soundpos = self._soundpos + len(data) // (self._nchannels * self._sampwidth) + return data + + # + # Internal methods. + # + + def _read_fmt_chunk(self, chunk): + wFormatTag, self._nchannels, self._framerate, dwAvgBytesPerSec, wBlockAlign = struct.unpack(' 4: + raise Error, 'bad sample width' + self._sampwidth = sampwidth + + def getsampwidth(self): + if not self._sampwidth: + raise Error, 'sample width not set' + return self._sampwidth + + def setframerate(self, framerate): + if self._datawritten: + raise Error, 'cannot change parameters after starting to write' + if framerate <= 0: + raise Error, 'bad frame rate' + self._framerate = framerate + + def getframerate(self): + if not self._framerate: + raise Error, 'frame rate not set' + return self._framerate + + def setnframes(self, nframes): + if self._datawritten: + raise Error, 'cannot change parameters after starting to write' + self._nframes = nframes + + def getnframes(self): + return self._nframeswritten + + def setcomptype(self, comptype, compname): + if self._datawritten: + raise Error, 'cannot change parameters after starting to write' + if comptype not in ('NONE',): + raise Error, 'unsupported compression type' + self._comptype = comptype + self._compname = compname + + def getcomptype(self): + return self._comptype + + def getcompname(self): + return self._compname + + def setparams(self, (nchannels, sampwidth, framerate, nframes, comptype, compname)): + if self._datawritten: + raise Error, 'cannot change parameters after starting to write' + self.setnchannels(nchannels) + self.setsampwidth(sampwidth) + self.setframerate(framerate) + self.setnframes(nframes) + self.setcomptype(comptype, compname) + + def getparams(self): + if not self._nchannels or not self._sampwidth or not self._framerate: + raise Error, 'not all parameters set' + return self._nchannels, self._sampwidth, self._framerate, \ + self._nframes, self._comptype, self._compname + + def setmark(self, id, pos, name): + raise Error, 'setmark() not supported' + + def getmark(self, id): + raise Error, 'no marks' + + def getmarkers(self): + return None + + def tell(self): + return self._nframeswritten + + def writeframesraw(self, data): + self._ensure_header_written(len(data)) + nframes = len(data) // (self._sampwidth * self._nchannels) + if self._convert: + data = self._convert(data) + if self._sampwidth > 1 and big_endian: + import array + data = array.array(_array_fmts[self._sampwidth], data) + data.byteswap() + data.tofile(self._file) + self._datawritten = self._datawritten + len(data) * self._sampwidth + else: + self._file.write(data) + self._datawritten = self._datawritten + len(data) + self._nframeswritten = self._nframeswritten + nframes + + def writeframes(self, data): + self.writeframesraw(data) + if self._datalength != self._datawritten: + self._patchheader() + + def close(self): + if self._file: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + self._file = None + if self._i_opened_the_file: + self._i_opened_the_file.close() + self._i_opened_the_file = None + + # + # Internal methods. + # + + def _ensure_header_written(self, datasize): + if not self._datawritten: + if not self._nchannels: + raise Error, '# channels not specified' + if not self._sampwidth: + raise Error, 'sample width not specified' + if not self._framerate: + raise Error, 'sampling rate not specified' + self._write_header(datasize) + + def _write_header(self, initlength): + self._file.write('RIFF') + if not self._nframes: + self._nframes = initlength / (self._nchannels * self._sampwidth) + self._datalength = self._nframes * self._nchannels * self._sampwidth + self._form_length_pos = self._file.tell() + self._file.write(struct.pack('" % id(self) + + def __setitem__(self, key, value): + self.data[key] = ref(value, self.__makeremove(key)) + + def copy(self): + new = WeakValueDictionary() + for key, wr in self.data.items(): + o = wr() + if o is not None: + new[key] = o + return new + + def get(self, key, default=None): + try: + wr = self.data[key] + except KeyError: + return default + else: + o = wr() + if o is None: + # This should only happen + return default + else: + return o + + def items(self): + L = [] + for key, wr in self.data.items(): + o = wr() + if o is not None: + L.append((key, o)) + return L + + def iteritems(self): + return WeakValuedItemIterator(self) + + def iterkeys(self): + return self.data.iterkeys() + __iter__ = iterkeys + + def itervalues(self): + return WeakValuedValueIterator(self) + + def popitem(self): + while 1: + key, wr = self.data.popitem() + o = wr() + if o is not None: + return key, o + + def setdefault(self, key, default): + try: + wr = self.data[key] + except KeyError: + self.data[key] = ref(default, self.__makeremove(key)) + return default + else: + return wr() + + def update(self, dict): + d = self.data + for key, o in dict.items(): + d[key] = ref(o, self.__makeremove(key)) + + def values(self): + L = [] + for wr in self.data.values(): + o = wr() + if o is not None: + L.append(o) + return L + + def __makeremove(self, key): + def remove(o, selfref=ref(self), key=key): + self = selfref() + if self is not None: + del self.data[key] + return remove + + +class WeakKeyDictionary(UserDict.UserDict): + """ Mapping class that references keys weakly. + + Entries in the dictionary will be discarded when there is no + longer a strong reference to the key. This can be used to + associate additional data with an object owned by other parts of + an application without adding attributes to those objects. This + can be especially useful with objects that override attribute + accesses. + """ + + def __init__(self, dict=None): + self.data = {} + def remove(k, selfref=ref(self)): + self = selfref() + if self is not None: + del self.data[k] + self._remove = remove + if dict is not None: self.update(dict) + + def __delitem__(self, key): + del self.data[ref(key)] + + def __getitem__(self, key): + return self.data[ref(key)] + + def __repr__(self): + return "" % id(self) + + def __setitem__(self, key, value): + self.data[ref(key, self._remove)] = value + + def copy(self): + new = WeakKeyDictionary() + for key, value in self.data.items(): + o = key() + if o is not None: + new[o] = value + return new + + def get(self, key, default=None): + return self.data.get(ref(key),default) + + def has_key(self, key): + try: + wr = ref(key) + except TypeError: + return 0 + return self.data.has_key(wr) + + def items(self): + L = [] + for key, value in self.data.items(): + o = key() + if o is not None: + L.append((o, value)) + return L + + def iteritems(self): + return WeakKeyedItemIterator(self) + + def iterkeys(self): + return WeakKeyedKeyIterator(self) + __iter__ = iterkeys + + def itervalues(self): + return self.data.itervalues() + + def keys(self): + L = [] + for wr in self.data.keys(): + o = wr() + if o is not None: + L.append(o) + return L + + def popitem(self): + while 1: + key, value = self.data.popitem() + o = key() + if o is not None: + return o, value + + def setdefault(self, key, default): + return self.data.setdefault(ref(key, self._remove),default) + + def update(self, dict): + d = self.data + for key, value in dict.items(): + d[ref(key, self._remove)] = value + + +class BaseIter: + def __iter__(self): + return self + + +class WeakKeyedKeyIterator(BaseIter): + def __init__(self, weakdict): + self._next = weakdict.data.iterkeys().next + + def next(self): + while 1: + wr = self._next() + obj = wr() + if obj is not None: + return obj + + +class WeakKeyedItemIterator(BaseIter): + def __init__(self, weakdict): + self._next = weakdict.data.iteritems().next + + def next(self): + while 1: + wr, value = self._next() + key = wr() + if key is not None: + return key, value + + +class WeakValuedValueIterator(BaseIter): + def __init__(self, weakdict): + self._next = weakdict.data.itervalues().next + + def next(self): + while 1: + wr = self._next() + obj = wr() + if obj is not None: + return obj + + +class WeakValuedItemIterator(BaseIter): + def __init__(self, weakdict): + self._next = weakdict.data.iteritems().next + + def next(self): + while 1: + key, wr = self._next() + value = wr() + if value is not None: + return key, value + + +# no longer needed +del UserDict diff --git a/lib-python/2.2/webbrowser.py b/lib-python/2.2/webbrowser.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/webbrowser.py @@ -0,0 +1,330 @@ +"""Interfaces for launching and remotely controlling Web browsers.""" + +import os +import sys + +__all__ = ["Error", "open", "get", "register"] + +class Error(Exception): + pass + +_browsers = {} # Dictionary of available browser controllers +_tryorder = [] # Preference order of available browsers + +def register(name, klass, instance=None): + """Register a browser connector and, optionally, connection.""" + _browsers[name.lower()] = [klass, instance] + +def get(using=None): + """Return a browser launcher instance appropriate for the environment.""" + if using: + alternatives = [using] + else: + alternatives = _tryorder + for browser in alternatives: + if browser.find('%s') > -1: + # User gave us a command line, don't mess with it. + return GenericBrowser(browser) + else: + # User gave us a browser name. + try: + command = _browsers[browser.lower()] + except KeyError: + command = _synthesize(browser) + if command[1] is None: + return command[0]() + else: + return command[1] + raise Error("could not locate runnable browser") + +# Please note: the following definition hides a builtin function. + +def open(url, new=0, autoraise=1): + get().open(url, new, autoraise) + +def open_new(url): + get().open(url, 1) + + +def _synthesize(browser): + """Attempt to synthesize a controller base on existing controllers. + + This is useful to create a controller when a user specifies a path to + an entry in the BROWSER environment variable -- we can copy a general + controller to operate using a specific installation of the desired + browser in this way. + + If we can't create a controller in this way, or if there is no + executable for the requested browser, return [None, None]. + + """ + if not os.path.exists(browser): + return [None, None] + name = os.path.basename(browser) + try: + command = _browsers[name.lower()] + except KeyError: + return [None, None] + # now attempt to clone to fit the new name: + controller = command[1] + if controller and name.lower() == controller.basename: + import copy + controller = copy.copy(controller) + controller.name = browser + controller.basename = os.path.basename(browser) + register(browser, None, controller) + return [None, controller] + return [None, None] + + +def _iscommand(cmd): + """Return true if cmd can be found on the executable search path.""" + path = os.environ.get("PATH") + if not path: + return 0 + for d in path.split(os.pathsep): + exe = os.path.join(d, cmd) + if os.path.isfile(exe): + return 1 + return 0 + + +PROCESS_CREATION_DELAY = 4 + + +class GenericBrowser: + def __init__(self, cmd): + self.name, self.args = cmd.split(None, 1) + self.basename = os.path.basename(self.name) + + def open(self, url, new=0, autoraise=1): + assert "'" not in url + command = "%s %s" % (self.name, self.args) + os.system(command % url) + + def open_new(self, url): + self.open(url) + + +class Netscape: + "Launcher class for Netscape browsers." + def __init__(self, name): + self.name = name + self.basename = os.path.basename(name) + + def _remote(self, action, autoraise): + raise_opt = ("-noraise", "-raise")[autoraise] + cmd = "%s %s -remote '%s' >/dev/null 2>&1" % (self.name, + raise_opt, + action) + rc = os.system(cmd) + if rc: + import time + os.system("%s &" % self.name) + time.sleep(PROCESS_CREATION_DELAY) + rc = os.system(cmd) + return not rc + + def open(self, url, new=0, autoraise=1): + if new: + self._remote("openURL(%s, new-window)"%url, autoraise) + else: + self._remote("openURL(%s)" % url, autoraise) + + def open_new(self, url): + self.open(url, 1) + + +class Konqueror: + """Controller for the KDE File Manager (kfm, or Konqueror). + + See http://developer.kde.org/documentation/other/kfmclient.html + for more information on the Konqueror remote-control interface. + + """ + def __init__(self): + if _iscommand("konqueror"): + self.name = self.basename = "konqueror" + else: + self.name = self.basename = "kfm" + + def _remote(self, action): + cmd = "kfmclient %s >/dev/null 2>&1" % action + rc = os.system(cmd) + if rc: + import time + if self.basename == "konqueror": + os.system(self.name + " --silent &") + else: + os.system(self.name + " -d &") + time.sleep(PROCESS_CREATION_DELAY) + rc = os.system(cmd) + return not rc + + def open(self, url, new=1, autoraise=1): + # XXX Currently I know no way to prevent KFM from + # opening a new win. + assert "'" not in url + self._remote("openURL '%s'" % url) + + open_new = open + + +class Grail: + # There should be a way to maintain a connection to Grail, but the + # Grail remote control protocol doesn't really allow that at this + # point. It probably neverwill! + def _find_grail_rc(self): + import glob + import pwd + import socket + import tempfile + tempdir = os.path.join(tempfile.gettempdir(), + ".grail-unix") + user = pwd.getpwuid(os.getuid())[0] + filename = os.path.join(tempdir, user + "-*") + maybes = glob.glob(filename) + if not maybes: + return None + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + for fn in maybes: + # need to PING each one until we find one that's live + try: + s.connect(fn) + except socket.error: + # no good; attempt to clean it out, but don't fail: + try: + os.unlink(fn) + except IOError: + pass + else: + return s + + def _remote(self, action): + s = self._find_grail_rc() + if not s: + return 0 + s.send(action) + s.close() + return 1 + + def open(self, url, new=0, autoraise=1): + if new: + self._remote("LOADNEW " + url) + else: + self._remote("LOAD " + url) + + def open_new(self, url): + self.open(url, 1) + + +class WindowsDefault: + def open(self, url, new=0, autoraise=1): + os.startfile(url) + + def open_new(self, url): + self.open(url) + +# +# Platform support for Unix +# + +# This is the right test because all these Unix browsers require either +# a console terminal of an X display to run. Note that we cannot split +# the TERM and DISPLAY cases, because we might be running Python from inside +# an xterm. +if os.environ.get("TERM") or os.environ.get("DISPLAY"): + _tryorder = ["mozilla","netscape","kfm","grail","links","lynx","w3m"] + + # Easy cases first -- register console browsers if we have them. + if os.environ.get("TERM"): + # The Links browser + if _iscommand("links"): + register("links", None, GenericBrowser("links '%s'")) + # The Lynx browser + if _iscommand("lynx"): + register("lynx", None, GenericBrowser("lynx '%s'")) + # The w3m browser + if _iscommand("w3m"): + register("w3m", None, GenericBrowser("w3m '%s'")) + + # X browsers have more in the way of options + if os.environ.get("DISPLAY"): + # First, the Netscape series + if _iscommand("mozilla"): + register("mozilla", None, Netscape("mozilla")) + if _iscommand("netscape"): + register("netscape", None, Netscape("netscape")) + + # Next, Mosaic -- old but still in use. + if _iscommand("mosaic"): + register("mosaic", None, GenericBrowser( + "mosaic '%s' >/dev/null &")) + + # Konqueror/kfm, the KDE browser. + if _iscommand("kfm") or _iscommand("konqueror"): + register("kfm", Konqueror, Konqueror()) + + # Grail, the Python browser. + if _iscommand("grail"): + register("grail", Grail, None) + + +class InternetConfig: + def open(self, url, new=0, autoraise=1): + ic.launchurl(url) + + def open_new(self, url): + self.open(url) + + +# +# Platform support for Windows +# + +if sys.platform[:3] == "win": + _tryorder = ["netscape", "windows-default"] + register("windows-default", WindowsDefault) + +# +# Platform support for MacOS +# + +try: + import ic +except ImportError: + pass +else: + # internet-config is the only supported controller on MacOS, + # so don't mess with the default! + _tryorder = ["internet-config"] + register("internet-config", InternetConfig) + +# +# Platform support for OS/2 +# + +if sys.platform[:3] == "os2" and _iscommand("netscape.exe"): + _tryorder = ["os2netscape"] + register("os2netscape", None, + GenericBrowser("start netscape.exe %s")) + +# OK, now that we know what the default preference orders for each +# platform are, allow user to override them with the BROWSER variable. +# +if os.environ.has_key("BROWSER"): + # It's the user's responsibility to register handlers for any unknown + # browser referenced by this value, before calling open(). + _tryorder = os.environ["BROWSER"].split(os.pathsep) + +for cmd in _tryorder: + if not _browsers.has_key(cmd.lower()): + if _iscommand(cmd.lower()): + register(cmd.lower(), None, GenericBrowser( + "%s '%%s'" % cmd.lower())) +cmd = None # to make del work if _tryorder was empty +del cmd + +_tryorder = filter(lambda x: _browsers.has_key(x.lower()) + or x.find("%s") > -1, _tryorder) +# what to do if _tryorder is now empty? diff --git a/lib-python/2.2/whichdb.py b/lib-python/2.2/whichdb.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/whichdb.py @@ -0,0 +1,87 @@ +"""Guess which db package to use to open a db file.""" + +import os + +def whichdb(filename): + """Guess which db package to use to open a db file. + + Return values: + + - None if the database file can't be read; + - empty string if the file can be read but can't be recognized + - the module name (e.g. "dbm" or "gdbm") if recognized. + + Importing the given module may still fail, and opening the + database using that module may still fail. + """ + + import struct + + # Check for dbm first -- this has a .pag and a .dir file + try: + f = open(filename + os.extsep + "pag", "rb") + f.close() + f = open(filename + os.extsep + "dir", "rb") + f.close() + return "dbm" + except IOError: + pass + + # Check for dumbdbm next -- this has a .dir and and a .dat file + try: + # First check for presence of files + sizes = os.stat(filename + os.extsep + "dat").st_size, \ + os.stat(filename + os.extsep + "dir").st_size + # dumbdbm files with no keys are empty + if sizes == (0, 0): + return "dumbdbm" + f = open(filename + os.extsep + "dir", "rb") + try: + if f.read(1) in ["'", '"']: + return "dumbdbm" + finally: + f.close() + except (OSError, IOError): + pass + + # See if the file exists, return None if not + try: + f = open(filename, "rb") + except IOError: + return None + + # Read the start of the file -- the magic number + s16 = f.read(16) + f.close() + s = s16[0:4] + + # Return "" if not at least 4 bytes + if len(s) != 4: + return "" + + # Convert to 4-byte int in native byte order -- return "" if impossible + try: + (magic,) = struct.unpack("=l", s) + except struct.error: + return "" + + # Check for GNU dbm + if magic == 0x13579ace: + return "gdbm" + + # Check for BSD hash + if magic in (0x00061561, 0x61150600): + return "dbhash" + + # BSD hash v2 has a 12-byte NULL pad in front of the file type + try: + (magic,) = struct.unpack("=l", s16[-4:]) + except struct.error: + return "" + + # Check for BSD hash + if magic in (0x00061561, 0x61150600): + return "dbhash" + + # Unknown + return "" diff --git a/lib-python/2.2/whrandom.py b/lib-python/2.2/whrandom.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/whrandom.py @@ -0,0 +1,140 @@ +"""Wichman-Hill random number generator. + +Wichmann, B. A. & Hill, I. D. (1982) +Algorithm AS 183: +An efficient and portable pseudo-random number generator +Applied Statistics 31 (1982) 188-190 + +see also: + Correction to Algorithm AS 183 + Applied Statistics 33 (1984) 123 + + McLeod, A. I. (1985) + A remark on Algorithm AS 183 + Applied Statistics 34 (1985),198-200 + + +USE: +whrandom.random() yields double precision random numbers + uniformly distributed between 0 and 1. + +whrandom.seed(x, y, z) must be called before whrandom.random() + to seed the generator + +There is also an interface to create multiple independent +random generators, and to choose from other ranges. + + + +Multi-threading note: the random number generator used here is not +thread-safe; it is possible that nearly simultaneous calls in +different theads return the same random value. To avoid this, you +have to use a lock around all calls. (I didn't want to slow this +down in the serial case by using a lock here.) +""" + +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. + + +class whrandom: + def __init__(self, x = 0, y = 0, z = 0): + """Initialize an instance. + Without arguments, initialize from current time. + With arguments (x, y, z), initialize from them.""" + self.seed(x, y, z) + + def seed(self, x = 0, y = 0, z = 0): + """Set the seed from (x, y, z). + These must be integers in the range [0, 256).""" + if not type(x) == type(y) == type(z) == type(0): + raise TypeError, 'seeds must be integers' + if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256): + raise ValueError, 'seeds must be in range(0, 256)' + if 0 == x == y == z: + # Initialize from current time + import time + t = long(time.time() * 256) + t = int((t&0xffffff) ^ (t>>24)) + t, x = divmod(t, 256) + t, y = divmod(t, 256) + t, z = divmod(t, 256) + # Zero is a poor seed, so substitute 1 + self._seed = (x or 1, y or 1, z or 1) + + def random(self): + """Get the next random number in the range [0.0, 1.0).""" + # This part is thread-unsafe: + # BEGIN CRITICAL SECTION + x, y, z = self._seed + # + x = (171 * x) % 30269 + y = (172 * y) % 30307 + z = (170 * z) % 30323 + # + self._seed = x, y, z + # END CRITICAL SECTION + # + return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 + + def uniform(self, a, b): + """Get a random number in the range [a, b).""" + return a + (b-a) * self.random() + + def randint(self, a, b): + """Get a random integer in the range [a, b] including + both end points. + + (Deprecated; use randrange below.)""" + return self.randrange(a, b+1) + + def choice(self, seq): + """Choose a random element from a non-empty sequence.""" + return seq[int(self.random() * len(seq))] + + def randrange(self, start, stop=None, step=1, int=int, default=None): + """Choose a random item from range(start, stop[, step]). + + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. + Do not supply the 'int' and 'default' arguments.""" + # This code is a bit messy to make it fast for the + # common case while still doing adequate error checking + istart = int(start) + if istart != start: + raise ValueError, "non-integer arg 1 for randrange()" + if stop is default: + if istart > 0: + return int(self.random() * istart) + raise ValueError, "empty range for randrange()" + istop = int(stop) + if istop != stop: + raise ValueError, "non-integer stop for randrange()" + if step == 1: + if istart < istop: + return istart + int(self.random() * + (istop - istart)) + raise ValueError, "empty range for randrange()" + istep = int(step) + if istep != step: + raise ValueError, "non-integer step for randrange()" + if istep > 0: + n = (istop - istart + istep - 1) / istep + elif istep < 0: + n = (istop - istart + istep + 1) / istep + else: + raise ValueError, "zero step for randrange()" + + if n <= 0: + raise ValueError, "empty range for randrange()" + return istart + istep*int(self.random() * n) + + +# Initialize from the current time +_inst = whrandom() +seed = _inst.seed +random = _inst.random +uniform = _inst.uniform +randint = _inst.randint +choice = _inst.choice +randrange = _inst.randrange diff --git a/lib-python/2.2/xdrlib.py b/lib-python/2.2/xdrlib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xdrlib.py @@ -0,0 +1,285 @@ +"""Implements (a subset of) Sun XDR -- eXternal Data Representation. + +See: RFC 1014 + +""" + +import struct +try: + from cStringIO import StringIO as _StringIO +except ImportError: + from StringIO import StringIO as _StringIO + +__all__ = ["Error", "Packer", "Unpacker", "ConversionError"] + +# exceptions +class Error: + """Exception class for this module. Use: + + except xdrlib.Error, var: + # var has the Error instance for the exception + + Public ivars: + msg -- contains the message + + """ + def __init__(self, msg): + self.msg = msg + def __repr__(self): + return repr(self.msg) + def __str__(self): + return str(self.msg) + + +class ConversionError(Error): + pass + + + +class Packer: + """Pack various data representations into a buffer.""" + + def __init__(self): + self.reset() + + def reset(self): + self.__buf = _StringIO() + + def get_buffer(self): + return self.__buf.getvalue() + # backwards compatibility + get_buf = get_buffer + + def pack_uint(self, x): + self.__buf.write(struct.pack('>L', x)) + + pack_int = pack_uint + pack_enum = pack_int + + def pack_bool(self, x): + if x: self.__buf.write('\0\0\0\1') + else: self.__buf.write('\0\0\0\0') + + def pack_uhyper(self, x): + self.pack_uint(x>>32 & 0xffffffffL) + self.pack_uint(x & 0xffffffffL) + + pack_hyper = pack_uhyper + + def pack_float(self, x): + try: self.__buf.write(struct.pack('>f', x)) + except struct.error, msg: + raise ConversionError, msg + + def pack_double(self, x): + try: self.__buf.write(struct.pack('>d', x)) + except struct.error, msg: + raise ConversionError, msg + + def pack_fstring(self, n, s): + if n < 0: + raise ValueError, 'fstring size must be nonnegative' + n = ((n+3)/4)*4 + data = s[:n] + data = data + (n - len(data)) * '\0' + self.__buf.write(data) + + pack_fopaque = pack_fstring + + def pack_string(self, s): + n = len(s) + self.pack_uint(n) + self.pack_fstring(n, s) + + pack_opaque = pack_string + pack_bytes = pack_string + + def pack_list(self, list, pack_item): + for item in list: + self.pack_uint(1) + pack_item(item) + self.pack_uint(0) + + def pack_farray(self, n, list, pack_item): + if len(list) != n: + raise ValueError, 'wrong array size' + for item in list: + pack_item(item) + + def pack_array(self, list, pack_item): + n = len(list) + self.pack_uint(n) + self.pack_farray(n, list, pack_item) + + + +class Unpacker: + """Unpacks various data representations from the given buffer.""" + + def __init__(self, data): + self.reset(data) + + def reset(self, data): + self.__buf = data + self.__pos = 0 + + def get_position(self): + return self.__pos + + def set_position(self, position): + self.__pos = position + + def get_buffer(self): + return self.__buf + + def done(self): + if self.__pos < len(self.__buf): + raise Error('unextracted data remains') + + def unpack_uint(self): + i = self.__pos + self.__pos = j = i+4 + data = self.__buf[i:j] + if len(data) < 4: + raise EOFError + x = struct.unpack('>L', data)[0] + try: + return int(x) + except OverflowError: + return x + + def unpack_int(self): + i = self.__pos + self.__pos = j = i+4 + data = self.__buf[i:j] + if len(data) < 4: + raise EOFError + return struct.unpack('>l', data)[0] + + unpack_enum = unpack_int + unpack_bool = unpack_int + + def unpack_uhyper(self): + hi = self.unpack_uint() + lo = self.unpack_uint() + return long(hi)<<32 | lo + + def unpack_hyper(self): + x = self.unpack_uhyper() + if x >= 0x8000000000000000L: + x = x - 0x10000000000000000L + return x + + def unpack_float(self): + i = self.__pos + self.__pos = j = i+4 + data = self.__buf[i:j] + if len(data) < 4: + raise EOFError + return struct.unpack('>f', data)[0] + + def unpack_double(self): + i = self.__pos + self.__pos = j = i+8 + data = self.__buf[i:j] + if len(data) < 8: + raise EOFError + return struct.unpack('>d', data)[0] + + def unpack_fstring(self, n): + if n < 0: + raise ValueError, 'fstring size must be nonnegative' + i = self.__pos + j = i + (n+3)/4*4 + if j > len(self.__buf): + raise EOFError + self.__pos = j + return self.__buf[i:i+n] + + unpack_fopaque = unpack_fstring + + def unpack_string(self): + n = self.unpack_uint() + return self.unpack_fstring(n) + + unpack_opaque = unpack_string + unpack_bytes = unpack_string + + def unpack_list(self, unpack_item): + list = [] + while 1: + x = self.unpack_uint() + if x == 0: break + if x != 1: + raise ConversionError, '0 or 1 expected, got ' + `x` + item = unpack_item() + list.append(item) + return list + + def unpack_farray(self, n, unpack_item): + list = [] + for i in range(n): + list.append(unpack_item()) + return list + + def unpack_array(self, unpack_item): + n = self.unpack_uint() + return self.unpack_farray(n, unpack_item) + + +# test suite +def _test(): + p = Packer() + packtest = [ + (p.pack_uint, (9,)), + (p.pack_bool, (None,)), + (p.pack_bool, ('hello',)), + (p.pack_uhyper, (45L,)), + (p.pack_float, (1.9,)), + (p.pack_double, (1.9,)), + (p.pack_string, ('hello world',)), + (p.pack_list, (range(5), p.pack_uint)), + (p.pack_array, (['what', 'is', 'hapnin', 'doctor'], p.pack_string)), + ] + succeedlist = [1] * len(packtest) + count = 0 + for method, args in packtest: + print 'pack test', count, + try: + apply(method, args) + print 'succeeded' + except ConversionError, var: + print 'ConversionError:', var.msg + succeedlist[count] = 0 + count = count + 1 + data = p.get_buffer() + # now verify + up = Unpacker(data) + unpacktest = [ + (up.unpack_uint, (), lambda x: x == 9), + (up.unpack_bool, (), lambda x: not x), + (up.unpack_bool, (), lambda x: x), + (up.unpack_uhyper, (), lambda x: x == 45L), + (up.unpack_float, (), lambda x: 1.89 < x < 1.91), + (up.unpack_double, (), lambda x: 1.89 < x < 1.91), + (up.unpack_string, (), lambda x: x == 'hello world'), + (up.unpack_list, (up.unpack_uint,), lambda x: x == range(5)), + (up.unpack_array, (up.unpack_string,), + lambda x: x == ['what', 'is', 'hapnin', 'doctor']), + ] + count = 0 + for method, args, pred in unpacktest: + print 'unpack test', count, + try: + if succeedlist[count]: + x = apply(method, args) + print pred(x) and 'succeeded' or 'failed', ':', x + else: + print 'skipping' + except ConversionError, var: + print 'ConversionError:', var.msg + count = count + 1 + + +if __name__ == '__main__': + _test() diff --git a/lib-python/2.2/xml/__init__.py b/lib-python/2.2/xml/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/__init__.py @@ -0,0 +1,42 @@ +"""Core XML support for Python. + +This package contains three sub-packages: + +dom -- The W3C Document Object Model. This supports DOM Level 1 + + Namespaces. + +parsers -- Python wrappers for XML parsers (currently only supports Expat). + +sax -- The Simple API for XML, developed by XML-Dev, led by David + Megginson and ported to Python by Lars Marius Garshol. This + supports the SAX 2 API. +""" + + +__all__ = ["dom", "parsers", "sax"] + +# When being checked-out without options, this has the form +# "Revision: x.y " +# When exported using -kv, it is "x.y". +__version__ = "$Revision$".split()[-2:][0] + + +_MINIMUM_XMLPLUS_VERSION = (0, 6, 1) + + +try: + import _xmlplus +except ImportError: + pass +else: + try: + v = _xmlplus.version_info + except AttributeError: + # _xmlplue is too old; ignore it + pass + else: + if v >= _MINIMUM_XMLPLUS_VERSION: + import sys + sys.modules[__name__] = _xmlplus + else: + del v diff --git a/lib-python/2.2/xml/dom/__init__.py b/lib-python/2.2/xml/dom/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/dom/__init__.py @@ -0,0 +1,125 @@ +"""W3C Document Object Model implementation for Python. + +The Python mapping of the Document Object Model is documented in the +Python Library Reference in the section on the xml.dom package. + +This package contains the following modules: + +minidom -- A simple implementation of the Level 1 DOM with namespace + support added (based on the Level 2 specification) and other + minor Level 2 functionality. + +pulldom -- DOM builder supporting on-demand tree-building for selected + subtrees of the document. + +""" + + +class Node: + """Class giving the NodeType constants.""" + + # DOM implementations may use this as a base class for their own + # Node implementations. If they don't, the constants defined here + # should still be used as the canonical definitions as they match + # the values given in the W3C recommendation. Client code can + # safely refer to these values in all tests of Node.nodeType + # values. + + ELEMENT_NODE = 1 + ATTRIBUTE_NODE = 2 + TEXT_NODE = 3 + CDATA_SECTION_NODE = 4 + ENTITY_REFERENCE_NODE = 5 + ENTITY_NODE = 6 + PROCESSING_INSTRUCTION_NODE = 7 + COMMENT_NODE = 8 + DOCUMENT_NODE = 9 + DOCUMENT_TYPE_NODE = 10 + DOCUMENT_FRAGMENT_NODE = 11 + NOTATION_NODE = 12 + + +#ExceptionCode +INDEX_SIZE_ERR = 1 +DOMSTRING_SIZE_ERR = 2 +HIERARCHY_REQUEST_ERR = 3 +WRONG_DOCUMENT_ERR = 4 +INVALID_CHARACTER_ERR = 5 +NO_DATA_ALLOWED_ERR = 6 +NO_MODIFICATION_ALLOWED_ERR = 7 +NOT_FOUND_ERR = 8 +NOT_SUPPORTED_ERR = 9 +INUSE_ATTRIBUTE_ERR = 10 +INVALID_STATE_ERR = 11 +SYNTAX_ERR = 12 +INVALID_MODIFICATION_ERR = 13 +NAMESPACE_ERR = 14 +INVALID_ACCESS_ERR = 15 + + +class DOMException(Exception): + """Abstract base class for DOM exceptions. + Exceptions with specific codes are specializations of this class.""" + + def __init__(self, *args, **kw): + if self.__class__ is DOMException: + raise RuntimeError( + "DOMException should not be instantiated directly") + apply(Exception.__init__, (self,) + args, kw) + + def _get_code(self): + return self.code + + +class IndexSizeErr(DOMException): + code = INDEX_SIZE_ERR + +class DomstringSizeErr(DOMException): + code = DOMSTRING_SIZE_ERR + +class HierarchyRequestErr(DOMException): + code = HIERARCHY_REQUEST_ERR + +class WrongDocumentErr(DOMException): + code = WRONG_DOCUMENT_ERR + +class InvalidCharacterErr(DOMException): + code = INVALID_CHARACTER_ERR + +class NoDataAllowedErr(DOMException): + code = NO_DATA_ALLOWED_ERR + +class NoModificationAllowedErr(DOMException): + code = NO_MODIFICATION_ALLOWED_ERR + +class NotFoundErr(DOMException): + code = NOT_FOUND_ERR + +class NotSupportedErr(DOMException): + code = NOT_SUPPORTED_ERR + +class InuseAttributeErr(DOMException): + code = INUSE_ATTRIBUTE_ERR + +class InvalidStateErr(DOMException): + code = INVALID_STATE_ERR + +class SyntaxErr(DOMException): + code = SYNTAX_ERR + +class InvalidModificationErr(DOMException): + code = INVALID_MODIFICATION_ERR + +class NamespaceErr(DOMException): + code = NAMESPACE_ERR + +class InvalidAccessErr(DOMException): + code = INVALID_ACCESS_ERR + + +XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" +XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" +XHTML_NAMESPACE = "http://www.w3.org/1999/xhtml" +EMPTY_NAMESPACE = None + +from domreg import getDOMImplementation,registerDOMImplementation diff --git a/lib-python/2.2/xml/dom/domreg.py b/lib-python/2.2/xml/dom/domreg.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/dom/domreg.py @@ -0,0 +1,76 @@ +"""Registration facilities for DOM. This module should not be used +directly. Instead, the functions getDOMImplementation and +registerDOMImplementation should be imported from xml.dom.""" + +# This is a list of well-known implementations. Well-known names +# should be published by posting to xml-sig at python.org, and are +# subsequently recorded in this file. + +well_known_implementations = { + 'minidom':'xml.dom.minidom', + '4DOM': 'xml.dom.DOMImplementation', + } + +# DOM implementations not officially registered should register +# themselves with their + +registered = {} + +def registerDOMImplementation(name, factory): + """registerDOMImplementation(name, factory) + + Register the factory function with the name. The factory function + should return an object which implements the DOMImplementation + interface. The factory function can either return the same object, + or a new one (e.g. if that implementation supports some + customization).""" + + registered[name] = factory + +def _good_enough(dom, features): + "_good_enough(dom, features) -> Return 1 if the dom offers the features" + for f,v in features: + if not dom.hasFeature(f,v): + return 0 + return 1 + +def getDOMImplementation(name = None, features = ()): + """getDOMImplementation(name = None, features = ()) -> DOM implementation. + + Return a suitable DOM implementation. The name is either + well-known, the module name of a DOM implementation, or None. If + it is not None, imports the corresponding module and returns + DOMImplementation object if the import succeeds. + + If name is not given, consider the available implementations to + find one with the required feature set. If no implementation can + be found, raise an ImportError. The features list must be a sequence + of (feature, version) pairs which are passed to hasFeature.""" + + import os + creator = None + mod = well_known_implementations.get(name) + if mod: + mod = __import__(mod, {}, {}, ['getDOMImplementation']) + return mod.getDOMImplementation() + elif name: + return registered[name]() + elif os.environ.has_key("PYTHON_DOM"): + return getDOMImplementation(name = os.environ["PYTHON_DOM"]) + + # User did not specify a name, try implementations in arbitrary + # order, returning the one that has the required features + for creator in registered.values(): + dom = creator() + if _good_enough(dom, features): + return dom + + for creator in well_known_implementations.keys(): + try: + dom = getDOMImplementation(name = creator) + except StandardError: # typically ImportError, or AttributeError + continue + if _good_enough(dom, features): + return dom + + raise ImportError,"no suitable DOM implementation found" diff --git a/lib-python/2.2/xml/dom/minidom.py b/lib-python/2.2/xml/dom/minidom.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/dom/minidom.py @@ -0,0 +1,970 @@ +"""\ +minidom.py -- a lightweight DOM implementation. + +parse("foo.xml") + +parseString("") + +Todo: +===== + * convenience methods for getting elements and text. + * more testing + * bring some of the writer and linearizer code into conformance with this + interface + * SAX 2 namespaces +""" + +import string +_string = string +del string + +from xml.dom import HierarchyRequestErr, EMPTY_NAMESPACE + +# localize the types, and allow support for Unicode values if available: +import types +_TupleType = types.TupleType +try: + _StringTypes = (types.StringType, types.UnicodeType) +except AttributeError: + _StringTypes = (types.StringType,) +del types + +import xml.dom + + +if list is type([]): + class NodeList(list): + def item(self, index): + if 0 <= index < len(self): + return self[index] + + length = property(lambda self: len(self), + doc="The number of nodes in the NodeList.") + +else: + def NodeList(): + return [] + + +class Node(xml.dom.Node): + allnodes = {} + _debug = 0 + _makeParentNodes = 1 + debug = None + childNodeTypes = () + namespaceURI = None # this is non-null only for elements and attributes + parentNode = None + ownerDocument = None + + def __init__(self): + self.childNodes = NodeList() + if Node._debug: + index = repr(id(self)) + repr(self.__class__) + Node.allnodes[index] = repr(self.__dict__) + if Node.debug is None: + Node.debug = _get_StringIO() + #open("debug4.out", "w") + Node.debug.write("create %s\n" % index) + + def __nonzero__(self): + return 1 + + def toxml(self): + writer = _get_StringIO() + self.writexml(writer) + return writer.getvalue() + + def toprettyxml(self, indent="\t", newl="\n"): + # indent = the indentation string to prepend, per level + # newl = the newline string to append + writer = _get_StringIO() + self.writexml(writer, "", indent, newl) + return writer.getvalue() + + def hasChildNodes(self): + if self.childNodes: + return 1 + else: + return 0 + + def _get_firstChild(self): + if self.childNodes: + return self.childNodes[0] + + def _get_lastChild(self): + if self.childNodes: + return self.childNodes[-1] + + try: + property + except NameError: + def __getattr__(self, key): + if key[0:2] == "__": + raise AttributeError, key + # getattr should never call getattr! + if self.__dict__.has_key("inGetAttr"): + del self.inGetAttr + raise AttributeError, key + + prefix, attrname = key[:5], key[5:] + if prefix == "_get_": + self.inGetAttr = 1 + if hasattr(self, attrname): + del self.inGetAttr + return (lambda self=self, attrname=attrname: + getattr(self, attrname)) + else: + del self.inGetAttr + raise AttributeError, key + else: + self.inGetAttr = 1 + try: + func = getattr(self, "_get_" + key) + except AttributeError: + raise AttributeError, key + del self.inGetAttr + return func() + else: + firstChild = property(_get_firstChild, + doc="First child node, or None.") + lastChild = property(_get_lastChild, + doc="Last child node, or None.") + + def insertBefore(self, newChild, refChild): + if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE: + for c in tuple(newChild.childNodes): + self.insertBefore(c, refChild) + ### The DOM does not clearly specify what to return in this case + return newChild + if newChild.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(newChild), repr(self)) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + if refChild is None: + self.appendChild(newChild) + else: + index = self.childNodes.index(refChild) + self.childNodes.insert(index, newChild) + newChild.nextSibling = refChild + refChild.previousSibling = newChild + if index: + node = self.childNodes[index-1] + node.nextSibling = newChild + newChild.previousSibling = node + else: + newChild.previousSibling = None + if self._makeParentNodes: + newChild.parentNode = self + return newChild + + def appendChild(self, node): + if node.nodeType == self.DOCUMENT_FRAGMENT_NODE: + for c in tuple(node.childNodes): + self.appendChild(c) + ### The DOM does not clearly specify what to return in this case + return node + if node.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(node), repr(self)) + if node.parentNode is not None: + node.parentNode.removeChild(node) + if self.childNodes: + last = self.lastChild + node.previousSibling = last + last.nextSibling = node + else: + node.previousSibling = None + node.nextSibling = None + self.childNodes.append(node) + if self._makeParentNodes: + node.parentNode = self + return node + + def replaceChild(self, newChild, oldChild): + if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE: + refChild = oldChild.nextSibling + self.removeChild(oldChild) + return self.insertBefore(newChild, refChild) + if newChild.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(newChild), repr(self)) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + if newChild is oldChild: + return + index = self.childNodes.index(oldChild) + self.childNodes[index] = newChild + if self._makeParentNodes: + newChild.parentNode = self + oldChild.parentNode = None + newChild.nextSibling = oldChild.nextSibling + newChild.previousSibling = oldChild.previousSibling + oldChild.nextSibling = None + oldChild.previousSibling = None + if newChild.previousSibling: + newChild.previousSibling.nextSibling = newChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + return oldChild + + def removeChild(self, oldChild): + self.childNodes.remove(oldChild) + if oldChild.nextSibling is not None: + oldChild.nextSibling.previousSibling = oldChild.previousSibling + if oldChild.previousSibling is not None: + oldChild.previousSibling.nextSibling = oldChild.nextSibling + oldChild.nextSibling = oldChild.previousSibling = None + + if self._makeParentNodes: + oldChild.parentNode = None + return oldChild + + def normalize(self): + L = [] + for child in self.childNodes: + if child.nodeType == Node.TEXT_NODE: + data = child.data + if data and L and L[-1].nodeType == child.nodeType: + # collapse text node + node = L[-1] + node.data = node.nodeValue = node.data + child.data + node.nextSibling = child.nextSibling + child.unlink() + elif data: + if L: + L[-1].nextSibling = child + child.previousSibling = L[-1] + else: + child.previousSibling = None + L.append(child) + else: + # empty text node; discard + child.unlink() + else: + if L: + L[-1].nextSibling = child + child.previousSibling = L[-1] + else: + child.previousSibling = None + L.append(child) + if child.nodeType == Node.ELEMENT_NODE: + child.normalize() + self.childNodes[:] = L + + def cloneNode(self, deep): + import new + clone = new.instance(self.__class__, self.__dict__.copy()) + if self._makeParentNodes: + clone.parentNode = None + clone.childNodes = NodeList() + if deep: + for child in self.childNodes: + clone.appendChild(child.cloneNode(1)) + return clone + + # DOM Level 3 (Working Draft 2001-Jan-26) + + def isSameNode(self, other): + return self is other + + # minidom-specific API: + + def unlink(self): + self.parentNode = self.ownerDocument = None + for child in self.childNodes: + child.unlink() + self.childNodes = None + self.previousSibling = None + self.nextSibling = None + if Node._debug: + index = repr(id(self)) + repr(self.__class__) + self.debug.write("Deleting: %s\n" % index) + del Node.allnodes[index] + +def _write_data(writer, data): + "Writes datachars to writer." + replace = _string.replace + data = replace(data, "&", "&") + data = replace(data, "<", "<") + data = replace(data, "\"", """) + data = replace(data, ">", ">") + writer.write(data) + +def _getElementsByTagNameHelper(parent, name, rc): + for node in parent.childNodes: + if node.nodeType == Node.ELEMENT_NODE and \ + (name == "*" or node.tagName == name): + rc.append(node) + _getElementsByTagNameHelper(node, name, rc) + return rc + +def _getElementsByTagNameNSHelper(parent, nsURI, localName, rc): + for node in parent.childNodes: + if node.nodeType == Node.ELEMENT_NODE: + if ((localName == "*" or node.localName == localName) and + (nsURI == "*" or node.namespaceURI == nsURI)): + rc.append(node) + _getElementsByTagNameNSHelper(node, nsURI, localName, rc) + return rc + +class DocumentFragment(Node): + nodeType = Node.DOCUMENT_FRAGMENT_NODE + nodeName = "#document-fragment" + nodeValue = None + attributes = None + parentNode = None + childNodeTypes = (Node.ELEMENT_NODE, + Node.TEXT_NODE, + Node.CDATA_SECTION_NODE, + Node.ENTITY_REFERENCE_NODE, + Node.PROCESSING_INSTRUCTION_NODE, + Node.COMMENT_NODE, + Node.NOTATION_NODE) + + +class Attr(Node): + nodeType = Node.ATTRIBUTE_NODE + attributes = None + ownerElement = None + childNodeTypes = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE) + + def __init__(self, qName, namespaceURI=EMPTY_NAMESPACE, localName=None, prefix=None): + # skip setattr for performance + d = self.__dict__ + d["localName"] = localName or qName + d["nodeName"] = d["name"] = qName + d["namespaceURI"] = namespaceURI + d["prefix"] = prefix + Node.__init__(self) + # nodeValue and value are set elsewhere + + def __setattr__(self, name, value): + d = self.__dict__ + if name in ("value", "nodeValue"): + d["value"] = d["nodeValue"] = value + elif name in ("name", "nodeName"): + d["name"] = d["nodeName"] = value + else: + d[name] = value + + def cloneNode(self, deep): + clone = Node.cloneNode(self, deep) + if clone.__dict__.has_key("ownerElement"): + del clone.ownerElement + return clone + + +class NamedNodeMap: + """The attribute list is a transient interface to the underlying + dictionaries. Mutations here will change the underlying element's + dictionary. + + Ordering is imposed artificially and does not reflect the order of + attributes as found in an input document. + """ + + def __init__(self, attrs, attrsNS, ownerElement): + self._attrs = attrs + self._attrsNS = attrsNS + self._ownerElement = ownerElement + + try: + property + except NameError: + def __getattr__(self, name): + if name == "length": + return len(self._attrs) + raise AttributeError, name + else: + length = property(lambda self: len(self._attrs), + doc="Number of nodes in the NamedNodeMap.") + + def item(self, index): + try: + return self[self._attrs.keys()[index]] + except IndexError: + return None + + def items(self): + L = [] + for node in self._attrs.values(): + L.append((node.nodeName, node.value)) + return L + + def itemsNS(self): + L = [] + for node in self._attrs.values(): + L.append(((node.namespaceURI, node.localName), node.value)) + return L + + def keys(self): + return self._attrs.keys() + + def keysNS(self): + return self._attrsNS.keys() + + def values(self): + return self._attrs.values() + + def get(self, name, value = None): + return self._attrs.get(name, value) + + def __len__(self): + return self.length + + def __cmp__(self, other): + if self._attrs is getattr(other, "_attrs", None): + return 0 + else: + return cmp(id(self), id(other)) + + #FIXME: is it appropriate to return .value? + def __getitem__(self, attname_or_tuple): + if type(attname_or_tuple) is _TupleType: + return self._attrsNS[attname_or_tuple] + else: + return self._attrs[attname_or_tuple] + + # same as set + def __setitem__(self, attname, value): + if type(value) in _StringTypes: + node = Attr(attname) + node.value = value + node.ownerDocument = self._ownerElement.ownerDocument + else: + if not isinstance(value, Attr): + raise TypeError, "value must be a string or Attr object" + node = value + self.setNamedItem(node) + + def setNamedItem(self, node): + if not isinstance(node, Attr): + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(node), repr(self)) + old = self._attrs.get(node.name) + if old: + old.unlink() + self._attrs[node.name] = node + self._attrsNS[(node.namespaceURI, node.localName)] = node + node.ownerElement = self._ownerElement + return old + + def setNamedItemNS(self, node): + return self.setNamedItem(node) + + def __delitem__(self, attname_or_tuple): + node = self[attname_or_tuple] + node.unlink() + del self._attrs[node.name] + del self._attrsNS[(node.namespaceURI, node.localName)] + self.length = len(self._attrs) + +AttributeList = NamedNodeMap + + +class Element(Node): + nodeType = Node.ELEMENT_NODE + nextSibling = None + previousSibling = None + childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, + Node.COMMENT_NODE, Node.TEXT_NODE, + Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE) + + def __init__(self, tagName, namespaceURI=EMPTY_NAMESPACE, prefix=None, + localName=None): + Node.__init__(self) + self.tagName = self.nodeName = tagName + self.localName = localName or tagName + self.prefix = prefix + self.namespaceURI = namespaceURI + self.nodeValue = None + + self._attrs = {} # attributes are double-indexed: + self._attrsNS = {} # tagName -> Attribute + # URI,localName -> Attribute + # in the future: consider lazy generation + # of attribute objects this is too tricky + # for now because of headaches with + # namespaces. + + def cloneNode(self, deep): + clone = Node.cloneNode(self, deep) + clone._attrs = {} + clone._attrsNS = {} + for attr in self._attrs.values(): + node = attr.cloneNode(1) + clone._attrs[node.name] = node + clone._attrsNS[(node.namespaceURI, node.localName)] = node + node.ownerElement = clone + return clone + + def unlink(self): + for attr in self._attrs.values(): + attr.unlink() + self._attrs = None + self._attrsNS = None + Node.unlink(self) + + def getAttribute(self, attname): + try: + return self._attrs[attname].value + except KeyError: + return "" + + def getAttributeNS(self, namespaceURI, localName): + try: + return self._attrsNS[(namespaceURI, localName)].value + except KeyError: + return "" + + def setAttribute(self, attname, value): + attr = Attr(attname) + # for performance + d = attr.__dict__ + d["value"] = d["nodeValue"] = value + d["ownerDocument"] = self.ownerDocument + self.setAttributeNode(attr) + + def setAttributeNS(self, namespaceURI, qualifiedName, value): + prefix, localname = _nssplit(qualifiedName) + # for performance + attr = Attr(qualifiedName, namespaceURI, localname, prefix) + d = attr.__dict__ + d["value"] = d["nodeValue"] = value + d["ownerDocument"] = self.ownerDocument + self.setAttributeNode(attr) + + def getAttributeNode(self, attrname): + return self._attrs.get(attrname) + + def getAttributeNodeNS(self, namespaceURI, localName): + return self._attrsNS.get((namespaceURI, localName)) + + def setAttributeNode(self, attr): + if attr.ownerElement not in (None, self): + raise xml.dom.InuseAttributeErr("attribute node already owned") + old = self._attrs.get(attr.name, None) + if old: + old.unlink() + self._attrs[attr.name] = attr + self._attrsNS[(attr.namespaceURI, attr.localName)] = attr + + # This creates a circular reference, but Element.unlink() + # breaks the cycle since the references to the attribute + # dictionaries are tossed. + attr.ownerElement = self + + if old is not attr: + # It might have already been part of this node, in which case + # it doesn't represent a change, and should not be returned. + return old + + setAttributeNodeNS = setAttributeNode + + def removeAttribute(self, name): + attr = self._attrs[name] + self.removeAttributeNode(attr) + + def removeAttributeNS(self, namespaceURI, localName): + attr = self._attrsNS[(namespaceURI, localName)] + self.removeAttributeNode(attr) + + def removeAttributeNode(self, node): + node.unlink() + del self._attrs[node.name] + del self._attrsNS[(node.namespaceURI, node.localName)] + + removeAttributeNodeNS = removeAttributeNode + + def hasAttribute(self, name): + return self._attrs.has_key(name) + + def hasAttributeNS(self, namespaceURI, localName): + return self._attrsNS.has_key((namespaceURI, localName)) + + def getElementsByTagName(self, name): + return _getElementsByTagNameHelper(self, name, NodeList()) + + def getElementsByTagNameNS(self, namespaceURI, localName): + return _getElementsByTagNameNSHelper(self, namespaceURI, localName, + NodeList()) + + def __repr__(self): + return "" % (self.tagName, id(self)) + + def writexml(self, writer, indent="", addindent="", newl=""): + # indent = current indentation + # addindent = indentation to add to higher levels + # newl = newline string + writer.write(indent+"<" + self.tagName) + + attrs = self._get_attributes() + a_names = attrs.keys() + a_names.sort() + + for a_name in a_names: + writer.write(" %s=\"" % a_name) + _write_data(writer, attrs[a_name].value) + writer.write("\"") + if self.childNodes: + writer.write(">%s"%(newl)) + for node in self.childNodes: + node.writexml(writer,indent+addindent,addindent,newl) + writer.write("%s%s" % (indent,self.tagName,newl)) + else: + writer.write("/>%s"%(newl)) + + def _get_attributes(self): + return NamedNodeMap(self._attrs, self._attrsNS, self) + + try: + property + except NameError: + pass + else: + attributes = property(_get_attributes, + doc="NamedNodeMap of attributes on the element.") + + def hasAttributes(self): + if self._attrs or self._attrsNS: + return 1 + else: + return 0 + +class Comment(Node): + nodeType = Node.COMMENT_NODE + nodeName = "#comment" + attributes = None + childNodeTypes = () + + def __init__(self, data): + Node.__init__(self) + self.data = self.nodeValue = data + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write("%s%s" % (indent,self.data,newl)) + +class ProcessingInstruction(Node): + nodeType = Node.PROCESSING_INSTRUCTION_NODE + attributes = None + childNodeTypes = () + + def __init__(self, target, data): + Node.__init__(self) + self.target = self.nodeName = target + self.data = self.nodeValue = data + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write("%s%s" % (indent,self.target, self.data, newl)) + +class CharacterData(Node): + def __init__(self, data): + if type(data) not in _StringTypes: + raise TypeError, "node contents must be a string" + Node.__init__(self) + self.data = self.nodeValue = data + self.length = len(data) + + def __repr__(self): + if len(self.data) > 10: + dotdotdot = "..." + else: + dotdotdot = "" + return "" % ( + self.__class__.__name__, self.data[0:10], dotdotdot) + + def substringData(self, offset, count): + if offset < 0: + raise xml.dom.IndexSizeErr("offset cannot be negative") + if offset >= len(self.data): + raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + if count < 0: + raise xml.dom.IndexSizeErr("count cannot be negative") + return self.data[offset:offset+count] + + def appendData(self, arg): + self.data = self.data + arg + self.nodeValue = self.data + self.length = len(self.data) + + def insertData(self, offset, arg): + if offset < 0: + raise xml.dom.IndexSizeErr("offset cannot be negative") + if offset >= len(self.data): + raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + if arg: + self.data = "%s%s%s" % ( + self.data[:offset], arg, self.data[offset:]) + self.nodeValue = self.data + self.length = len(self.data) + + def deleteData(self, offset, count): + if offset < 0: + raise xml.dom.IndexSizeErr("offset cannot be negative") + if offset >= len(self.data): + raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + if count < 0: + raise xml.dom.IndexSizeErr("count cannot be negative") + if count: + self.data = self.data[:offset] + self.data[offset+count:] + self.nodeValue = self.data + self.length = len(self.data) + + def replaceData(self, offset, count, arg): + if offset < 0: + raise xml.dom.IndexSizeErr("offset cannot be negative") + if offset >= len(self.data): + raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + if count < 0: + raise xml.dom.IndexSizeErr("count cannot be negative") + if count: + self.data = "%s%s%s" % ( + self.data[:offset], arg, self.data[offset+count:]) + self.nodeValue = self.data + self.length = len(self.data) + +class Text(CharacterData): + nodeType = Node.TEXT_NODE + nodeName = "#text" + attributes = None + childNodeTypes = () + + def splitText(self, offset): + if offset < 0 or offset > len(self.data): + raise xml.dom.IndexSizeErr("illegal offset value") + newText = Text(self.data[offset:]) + next = self.nextSibling + if self.parentNode and self in self.parentNode.childNodes: + if next is None: + self.parentNode.appendChild(newText) + else: + self.parentNode.insertBefore(newText, next) + self.data = self.data[:offset] + self.nodeValue = self.data + self.length = len(self.data) + return newText + + def writexml(self, writer, indent="", addindent="", newl=""): + _write_data(writer, "%s%s%s"%(indent, self.data, newl)) + + +class CDATASection(Text): + nodeType = Node.CDATA_SECTION_NODE + nodeName = "#cdata-section" + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write("" % self.data) + + +def _nssplit(qualifiedName): + fields = _string.split(qualifiedName, ':', 1) + if len(fields) == 2: + return fields + elif len(fields) == 1: + return (None, fields[0]) + + +class DocumentType(Node): + nodeType = Node.DOCUMENT_TYPE_NODE + nodeValue = None + attributes = None + name = None + publicId = None + systemId = None + internalSubset = None + entities = None + notations = None + + def __init__(self, qualifiedName): + Node.__init__(self) + if qualifiedName: + prefix, localname = _nssplit(qualifiedName) + self.name = localname + + +class DOMImplementation: + def hasFeature(self, feature, version): + if version not in ("1.0", "2.0"): + return 0 + feature = _string.lower(feature) + return feature == "core" + + def createDocument(self, namespaceURI, qualifiedName, doctype): + if doctype and doctype.parentNode is not None: + raise xml.dom.WrongDocumentErr( + "doctype object owned by another DOM tree") + doc = self._createDocument() + if doctype is None: + doctype = self.createDocumentType(qualifiedName, None, None) + if not qualifiedName: + # The spec is unclear what to raise here; SyntaxErr + # would be the other obvious candidate. Since Xerces raises + # InvalidCharacterErr, and since SyntaxErr is not listed + # for createDocument, that seems to be the better choice. + # XXX: need to check for illegal characters here and in + # createElement. + raise xml.dom.InvalidCharacterErr("Element with no name") + prefix, localname = _nssplit(qualifiedName) + if prefix == "xml" \ + and namespaceURI != "http://www.w3.org/XML/1998/namespace": + raise xml.dom.NamespaceErr("illegal use of 'xml' prefix") + if prefix and not namespaceURI: + raise xml.dom.NamespaceErr( + "illegal use of prefix without namespaces") + element = doc.createElementNS(namespaceURI, qualifiedName) + doc.appendChild(element) + doctype.parentNode = doctype.ownerDocument = doc + doc.doctype = doctype + doc.implementation = self + return doc + + def createDocumentType(self, qualifiedName, publicId, systemId): + doctype = DocumentType(qualifiedName) + doctype.publicId = publicId + doctype.systemId = systemId + return doctype + + # internal + def _createDocument(self): + return Document() + +class Document(Node): + nodeType = Node.DOCUMENT_NODE + nodeName = "#document" + nodeValue = None + attributes = None + doctype = None + parentNode = None + previousSibling = nextSibling = None + + implementation = DOMImplementation() + childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, + Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE) + + def appendChild(self, node): + if node.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(node), repr(self)) + if node.parentNode is not None: + node.parentNode.removeChild(node) + + if node.nodeType == Node.ELEMENT_NODE \ + and self._get_documentElement(): + raise xml.dom.HierarchyRequestErr( + "two document elements disallowed") + return Node.appendChild(self, node) + + def removeChild(self, oldChild): + self.childNodes.remove(oldChild) + oldChild.nextSibling = oldChild.previousSibling = None + oldChild.parentNode = None + if self.documentElement is oldChild: + self.documentElement = None + + return oldChild + + def _get_documentElement(self): + for node in self.childNodes: + if node.nodeType == Node.ELEMENT_NODE: + return node + + try: + property + except NameError: + pass + else: + documentElement = property(_get_documentElement, + doc="Top-level element of this document.") + + def unlink(self): + if self.doctype is not None: + self.doctype.unlink() + self.doctype = None + Node.unlink(self) + + def createDocumentFragment(self): + d = DocumentFragment() + d.ownerDoc = self + return d + + def createElement(self, tagName): + e = Element(tagName) + e.ownerDocument = self + return e + + def createTextNode(self, data): + t = Text(data) + t.ownerDocument = self + return t + + def createCDATASection(self, data): + c = CDATASection(data) + c.ownerDocument = self + return c + + def createComment(self, data): + c = Comment(data) + c.ownerDocument = self + return c + + def createProcessingInstruction(self, target, data): + p = ProcessingInstruction(target, data) + p.ownerDocument = self + return p + + def createAttribute(self, qName): + a = Attr(qName) + a.ownerDocument = self + a.value = "" + return a + + def createElementNS(self, namespaceURI, qualifiedName): + prefix, localName = _nssplit(qualifiedName) + e = Element(qualifiedName, namespaceURI, prefix, localName) + e.ownerDocument = self + return e + + def createAttributeNS(self, namespaceURI, qualifiedName): + prefix, localName = _nssplit(qualifiedName) + a = Attr(qualifiedName, namespaceURI, localName, prefix) + a.ownerDocument = self + a.value = "" + return a + + def getElementsByTagName(self, name): + return _getElementsByTagNameHelper(self, name, NodeList()) + + def getElementsByTagNameNS(self, namespaceURI, localName): + return _getElementsByTagNameNSHelper(self, namespaceURI, localName, + NodeList()) + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write('\n') + for node in self.childNodes: + node.writexml(writer, indent, addindent, newl) + +def _get_StringIO(): + # we can't use cStringIO since it doesn't support Unicode strings + from StringIO import StringIO + return StringIO() + +def _doparse(func, args, kwargs): + events = apply(func, args, kwargs) + toktype, rootNode = events.getEvent() + events.expandNode(rootNode) + events.clear() + return rootNode + +def parse(*args, **kwargs): + """Parse a file into a DOM by filename or file object.""" + from xml.dom import pulldom + return _doparse(pulldom.parse, args, kwargs) + +def parseString(*args, **kwargs): + """Parse a file into a DOM from a string.""" + from xml.dom import pulldom + return _doparse(pulldom.parseString, args, kwargs) + +def getDOMImplementation(): + return Document.implementation diff --git a/lib-python/2.2/xml/dom/pulldom.py b/lib-python/2.2/xml/dom/pulldom.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/dom/pulldom.py @@ -0,0 +1,341 @@ +import xml.sax +import xml.sax.handler +import types + +try: + _StringTypes = [types.StringType, types.UnicodeType] +except AttributeError: + _StringTypes = [types.StringType] + +START_ELEMENT = "START_ELEMENT" +END_ELEMENT = "END_ELEMENT" +COMMENT = "COMMENT" +START_DOCUMENT = "START_DOCUMENT" +END_DOCUMENT = "END_DOCUMENT" +PROCESSING_INSTRUCTION = "PROCESSING_INSTRUCTION" +IGNORABLE_WHITESPACE = "IGNORABLE_WHITESPACE" +CHARACTERS = "CHARACTERS" + +class PullDOM(xml.sax.ContentHandler): + _locator = None + document = None + + def __init__(self, documentFactory=None): + self.documentFactory = documentFactory + self.firstEvent = [None, None] + self.lastEvent = self.firstEvent + self.elementStack = [] + self.push = self.elementStack.append + try: + self.pop = self.elementStack.pop + except AttributeError: + # use class' pop instead + pass + self._ns_contexts = [{}] # contains uri -> prefix dicts + self._current_context = self._ns_contexts[-1] + self.pending_events = [] + + def pop(self): + result = self.elementStack[-1] + del self.elementStack[-1] + return result + + def setDocumentLocator(self, locator): + self._locator = locator + + def startPrefixMapping(self, prefix, uri): + if not hasattr(self, '_xmlns_attrs'): + self._xmlns_attrs = [] + self._xmlns_attrs.append((prefix or 'xmlns', uri)) + self._ns_contexts.append(self._current_context.copy()) + self._current_context[uri] = prefix or None + + def endPrefixMapping(self, prefix): + self._current_context = self._ns_contexts.pop() + + def startElementNS(self, name, tagName , attrs): + # Retrieve xml namespace declaration attributes. + xmlns_uri = 'http://www.w3.org/2000/xmlns/' + xmlns_attrs = getattr(self, '_xmlns_attrs', None) + if xmlns_attrs is not None: + for aname, value in xmlns_attrs: + attrs._attrs[(xmlns_uri, aname)] = value + self._xmlns_attrs = [] + uri, localname = name + if uri: + # When using namespaces, the reader may or may not + # provide us with the original name. If not, create + # *a* valid tagName from the current context. + if tagName is None: + prefix = self._current_context[uri] + if prefix: + tagName = prefix + ":" + localname + else: + tagName = localname + if self.document: + node = self.document.createElementNS(uri, tagName) + else: + node = self.buildDocument(uri, tagName) + else: + # When the tagname is not prefixed, it just appears as + # localname + if self.document: + node = self.document.createElement(localname) + else: + node = self.buildDocument(None, localname) + + for aname,value in attrs.items(): + a_uri, a_localname = aname + if a_uri == xmlns_uri: + if a_localname == 'xmlns': + qname = a_localname + else: + qname = 'xmlns:' + a_localname + attr = self.document.createAttributeNS(a_uri, qname) + node.setAttributeNodeNS(attr) + elif a_uri: + prefix = self._current_context[a_uri] + if prefix: + qname = prefix + ":" + a_localname + else: + qname = a_localname + attr = self.document.createAttributeNS(a_uri, qname) + node.setAttributeNodeNS(attr) + else: + attr = self.document.createAttribute(a_localname) + node.setAttributeNode(attr) + attr.value = value + + self.lastEvent[1] = [(START_ELEMENT, node), None] + self.lastEvent = self.lastEvent[1] + self.push(node) + + def endElementNS(self, name, tagName): + self.lastEvent[1] = [(END_ELEMENT, self.pop()), None] + self.lastEvent = self.lastEvent[1] + + def startElement(self, name, attrs): + if self.document: + node = self.document.createElement(name) + else: + node = self.buildDocument(None, name) + + for aname,value in attrs.items(): + attr = self.document.createAttribute(aname) + attr.value = value + node.setAttributeNode(attr) + + self.lastEvent[1] = [(START_ELEMENT, node), None] + self.lastEvent = self.lastEvent[1] + self.push(node) + + def endElement(self, name): + self.lastEvent[1] = [(END_ELEMENT, self.pop()), None] + self.lastEvent = self.lastEvent[1] + + def comment(self, s): + if self.document: + node = self.document.createComment(s) + self.lastEvent[1] = [(COMMENT, node), None] + self.lastEvent = self.lastEvent[1] + else: + event = [(COMMENT, s), None] + self.pending_events.append(event) + + def processingInstruction(self, target, data): + if self.document: + node = self.document.createProcessingInstruction(target, data) + self.lastEvent[1] = [(PROCESSING_INSTRUCTION, node), None] + self.lastEvent = self.lastEvent[1] + else: + event = [(PROCESSING_INSTRUCTION, target, data), None] + self.pending_events.append(event) + + def ignorableWhitespace(self, chars): + node = self.document.createTextNode(chars) + self.lastEvent[1] = [(IGNORABLE_WHITESPACE, node), None] + self.lastEvent = self.lastEvent[1] + + def characters(self, chars): + node = self.document.createTextNode(chars) + self.lastEvent[1] = [(CHARACTERS, node), None] + self.lastEvent = self.lastEvent[1] + + def startDocument(self): + if self.documentFactory is None: + import xml.dom.minidom + self.documentFactory = xml.dom.minidom.Document.implementation + + def buildDocument(self, uri, tagname): + # Can't do that in startDocument, since we need the tagname + # XXX: obtain DocumentType + node = self.documentFactory.createDocument(uri, tagname, None) + self.document = node + self.lastEvent[1] = [(START_DOCUMENT, node), None] + self.lastEvent = self.lastEvent[1] + self.push(node) + # Put everything we have seen so far into the document + for e in self.pending_events: + if e[0][0] == PROCESSING_INSTRUCTION: + _,target,data = e[0] + n = self.document.createProcessingInstruction(target, data) + e[0] = (PROCESSING_INSTRUCTION, n) + elif e[0][0] == COMMENT: + n = self.document.createComment(e[0][1]) + e[0] = (COMMENT, n) + else: + raise AssertionError("Unknown pending event ",e[0][0]) + self.lastEvent[1] = e + self.lastEvent = e + self.pending_events = None + return node.firstChild + + def endDocument(self): + self.lastEvent[1] = [(END_DOCUMENT, self.document), None] + self.pop() + + def clear(self): + "clear(): Explicitly release parsing structures" + self.document = None + +class ErrorHandler: + def warning(self, exception): + print exception + def error(self, exception): + raise exception + def fatalError(self, exception): + raise exception + +class DOMEventStream: + def __init__(self, stream, parser, bufsize): + self.stream = stream + self.parser = parser + self.bufsize = bufsize + if not hasattr(self.parser, 'feed'): + self.getEvent = self._slurp + self.reset() + + def reset(self): + self.pulldom = PullDOM() + # This content handler relies on namespace support + self.parser.setFeature(xml.sax.handler.feature_namespaces, 1) + self.parser.setContentHandler(self.pulldom) + + def __getitem__(self, pos): + rc = self.getEvent() + if rc: + return rc + raise IndexError + + def expandNode(self, node): + event = self.getEvent() + parents = [node] + while event: + token, cur_node = event + if cur_node is node: + return + if token != END_ELEMENT: + parents[-1].appendChild(cur_node) + if token == START_ELEMENT: + parents.append(cur_node) + elif token == END_ELEMENT: + del parents[-1] + event = self.getEvent() + + def getEvent(self): + # use IncrementalParser interface, so we get the desired + # pull effect + if not self.pulldom.firstEvent[1]: + self.pulldom.lastEvent = self.pulldom.firstEvent + while not self.pulldom.firstEvent[1]: + buf = self.stream.read(self.bufsize) + if not buf: + self.parser.close() + return None + self.parser.feed(buf) + rc = self.pulldom.firstEvent[1][0] + self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1] + return rc + + def _slurp(self): + """ Fallback replacement for getEvent() using the + standard SAX2 interface, which means we slurp the + SAX events into memory (no performance gain, but + we are compatible to all SAX parsers). + """ + self.parser.parse(self.stream) + self.getEvent = self._emit + return self._emit() + + def _emit(self): + """ Fallback replacement for getEvent() that emits + the events that _slurp() read previously. + """ + rc = self.pulldom.firstEvent[1][0] + self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1] + return rc + + def clear(self): + """clear(): Explicitly release parsing objects""" + self.pulldom.clear() + del self.pulldom + self.parser = None + self.stream = None + +class SAX2DOM(PullDOM): + + def startElementNS(self, name, tagName , attrs): + PullDOM.startElementNS(self, name, tagName, attrs) + curNode = self.elementStack[-1] + parentNode = self.elementStack[-2] + parentNode.appendChild(curNode) + + def startElement(self, name, attrs): + PullDOM.startElement(self, name, attrs) + curNode = self.elementStack[-1] + parentNode = self.elementStack[-2] + parentNode.appendChild(curNode) + + def processingInstruction(self, target, data): + PullDOM.processingInstruction(self, target, data) + node = self.lastEvent[0][1] + parentNode = self.elementStack[-1] + parentNode.appendChild(node) + + def ignorableWhitespace(self, chars): + PullDOM.ignorableWhitespace(self, chars) + node = self.lastEvent[0][1] + parentNode = self.elementStack[-1] + parentNode.appendChild(node) + + def characters(self, chars): + PullDOM.characters(self, chars) + node = self.lastEvent[0][1] + parentNode = self.elementStack[-1] + parentNode.appendChild(node) + + +default_bufsize = (2 ** 14) - 20 + +def parse(stream_or_string, parser=None, bufsize=None): + if bufsize is None: + bufsize = default_bufsize + if type(stream_or_string) in _StringTypes: + stream = open(stream_or_string) + else: + stream = stream_or_string + if not parser: + parser = xml.sax.make_parser() + return DOMEventStream(stream, parser, bufsize) + +def parseString(string, parser=None): + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + bufsize = len(string) + buf = StringIO(string) + if not parser: + parser = xml.sax.make_parser() + return DOMEventStream(buf, parser, bufsize) diff --git a/lib-python/2.2/xml/parsers/__init__.py b/lib-python/2.2/xml/parsers/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/parsers/__init__.py @@ -0,0 +1,8 @@ +"""Python interfaces to XML parsers. + +This package contains one module: + +expat -- Python wrapper for James Clark's Expat parser, with namespace + support. + +""" diff --git a/lib-python/2.2/xml/parsers/expat.py b/lib-python/2.2/xml/parsers/expat.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/parsers/expat.py @@ -0,0 +1,13 @@ +"""Interface to the Expat non-validating XML parser.""" +__version__ = '$Revision$' + +import sys + +try: + from pyexpat import * +except ImportError: + del sys.modules[__name__] + del sys + raise + +del sys diff --git a/lib-python/2.2/xml/sax/__init__.py b/lib-python/2.2/xml/sax/__init__.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/__init__.py @@ -0,0 +1,108 @@ +"""Simple API for XML (SAX) implementation for Python. + +This module provides an implementation of the SAX 2 interface; +information about the Java version of the interface can be found at +http://www.megginson.com/SAX/. The Python version of the interface is +documented at <...>. + +This package contains the following modules: + +handler -- Base classes and constants which define the SAX 2 API for + the 'client-side' of SAX for Python. + +saxutils -- Implementation of the convenience classes commonly used to + work with SAX. + +xmlreader -- Base classes and constants which define the SAX 2 API for + the parsers used with SAX for Python. + +expatreader -- Driver that allows use of the Expat parser with SAX. +""" + +from xmlreader import InputSource +from handler import ContentHandler, ErrorHandler +from _exceptions import SAXException, SAXNotRecognizedException, \ + SAXParseException, SAXNotSupportedException, \ + SAXReaderNotAvailable + + +def parse(source, handler, errorHandler=ErrorHandler()): + parser = make_parser() + parser.setContentHandler(handler) + parser.setErrorHandler(errorHandler) + parser.parse(source) + +def parseString(string, handler, errorHandler=ErrorHandler()): + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + if errorHandler is None: + errorHandler = ErrorHandler() + parser = make_parser() + parser.setContentHandler(handler) + parser.setErrorHandler(errorHandler) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(string)) + parser.parse(inpsrc) + +# this is the parser list used by the make_parser function if no +# alternatives are given as parameters to the function + +default_parser_list = ["xml.sax.expatreader"] + +# tell modulefinder that importing sax potentially imports expatreader +_false = 0 +if _false: + import xml.sax.expatreader + +import os, string, sys +if os.environ.has_key("PY_SAX_PARSER"): + default_parser_list = string.split(os.environ["PY_SAX_PARSER"], ",") +del os + +_key = "python.xml.sax.parser" +if sys.platform[:4] == "java" and sys.registry.containsKey(_key): + default_parser_list = string.split(sys.registry.getProperty(_key), ",") + + +def make_parser(parser_list = []): + """Creates and returns a SAX parser. + + Creates the first parser it is able to instantiate of the ones + given in the list created by doing parser_list + + default_parser_list. The lists must contain the names of Python + modules containing both a SAX parser and a create_parser function.""" + + for parser_name in parser_list + default_parser_list: + try: + return _create_parser(parser_name) + except ImportError,e: + import sys + if sys.modules.has_key(parser_name): + # The parser module was found, but importing it + # failed unexpectedly, pass this exception through + raise + except SAXReaderNotAvailable: + # The parser module detected that it won't work properly, + # so try the next one + pass + + raise SAXReaderNotAvailable("No parsers found", None) + +# --- Internal utility methods used by make_parser + +if sys.platform[ : 4] == "java": + def _create_parser(parser_name): + from org.python.core import imp + drv_module = imp.importName(parser_name, 0, globals()) + return drv_module.create_parser() + +else: + def _create_parser(parser_name): + drv_module = __import__(parser_name,{},{},['create_parser']) + return drv_module.create_parser() + +del sys diff --git a/lib-python/2.2/xml/sax/_exceptions.py b/lib-python/2.2/xml/sax/_exceptions.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/_exceptions.py @@ -0,0 +1,126 @@ +"""Different kinds of SAX Exceptions""" +import sys +if sys.platform[:4] == "java": + from java.lang import Exception +del sys + +# ===== SAXEXCEPTION ===== + +class SAXException(Exception): + """Encapsulate an XML error or warning. This class can contain + basic error or warning information from either the XML parser or + the application: you can subclass it to provide additional + functionality, or to add localization. Note that although you will + receive a SAXException as the argument to the handlers in the + ErrorHandler interface, you are not actually required to throw + the exception; instead, you can simply read the information in + it.""" + + def __init__(self, msg, exception=None): + """Creates an exception. The message is required, but the exception + is optional.""" + self._msg = msg + self._exception = exception + Exception.__init__(self, msg) + + def getMessage(self): + "Return a message for this exception." + return self._msg + + def getException(self): + "Return the embedded exception, or None if there was none." + return self._exception + + def __str__(self): + "Create a string representation of the exception." + return self._msg + + def __getitem__(self, ix): + """Avoids weird error messages if someone does exception[ix] by + mistake, since Exception has __getitem__ defined.""" + raise AttributeError("__getitem__") + + +# ===== SAXPARSEEXCEPTION ===== + +class SAXParseException(SAXException): + """Encapsulate an XML parse error or warning. + + This exception will include information for locating the error in + the original XML document. Note that although the application will + receive a SAXParseException as the argument to the handlers in the + ErrorHandler interface, the application is not actually required + to throw the exception; instead, it can simply read the + information in it and take a different action. + + Since this exception is a subclass of SAXException, it inherits + the ability to wrap another exception.""" + + def __init__(self, msg, exception, locator): + "Creates the exception. The exception parameter is allowed to be None." + SAXException.__init__(self, msg, exception) + self._locator = locator + + # We need to cache this stuff at construction time. + # If this exception is thrown, the objects through which we must + # traverse to get this information may be deleted by the time + # it gets caught. + self._systemId = self._locator.getSystemId() + self._colnum = self._locator.getColumnNumber() + self._linenum = self._locator.getLineNumber() + + def getColumnNumber(self): + """The column number of the end of the text where the exception + occurred.""" + return self._colnum + + def getLineNumber(self): + "The line number of the end of the text where the exception occurred." + return self._linenum + + def getPublicId(self): + "Get the public identifier of the entity where the exception occurred." + return self._locator.getPublicId() + + def getSystemId(self): + "Get the system identifier of the entity where the exception occurred." + return self._systemId + + def __str__(self): + "Create a string representation of the exception." + sysid = self.getSystemId() + if sysid is None: + sysid = "" + return "%s:%d:%d: %s" % (sysid, self.getLineNumber(), + self.getColumnNumber(), self._msg) + + +# ===== SAXNOTRECOGNIZEDEXCEPTION ===== + +class SAXNotRecognizedException(SAXException): + """Exception class for an unrecognized identifier. + + An XMLReader will raise this exception when it is confronted with an + unrecognized feature or property. SAX applications and extensions may + use this class for similar purposes.""" + + +# ===== SAXNOTSUPPORTEDEXCEPTION ===== + +class SAXNotSupportedException(SAXException): + """Exception class for an unsupported operation. + + An XMLReader will raise this exception when a service it cannot + perform is requested (specifically setting a state or value). SAX + applications and extensions may use this class for similar + purposes.""" + +# ===== SAXNOTSUPPORTEDEXCEPTION ===== + +class SAXReaderNotAvailable(SAXNotSupportedException): + """Exception class for a missing driver. + + An XMLReader module (driver) should raise this exception when it + is first imported, e.g. when a support module cannot be imported. + It also may be raised during parsing, e.g. if executing an external + program is not permitted.""" diff --git a/lib-python/2.2/xml/sax/expatreader.py b/lib-python/2.2/xml/sax/expatreader.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/expatreader.py @@ -0,0 +1,333 @@ +""" +SAX driver for the Pyexpat C module. This driver works with +pyexpat.__version__ == '2.22'. +""" + +version = "0.20" + +from xml.sax._exceptions import * + +# xml.parsers.expat does not raise ImportError in Jython +import sys +if sys.platform[:4] == "java": + raise SAXReaderNotAvailable("expat not available in Java", None) +del sys + +try: + from xml.parsers import expat +except ImportError: + raise SAXReaderNotAvailable("expat not supported", None) +else: + if not hasattr(expat, "ParserCreate"): + raise SAXReaderNotAvailable("expat not supported", None) +from xml.sax import xmlreader, saxutils, handler + +AttributesImpl = xmlreader.AttributesImpl +AttributesNSImpl = xmlreader.AttributesNSImpl + +import string +import weakref + +# --- ExpatLocator + +class ExpatLocator(xmlreader.Locator): + """Locator for use with the ExpatParser class. + + This uses a weak reference to the parser object to avoid creating + a circular reference between the parser and the content handler. + """ + def __init__(self, parser): + self._ref = weakref.ref(parser) + + def getColumnNumber(self): + parser = self._ref() + if parser is None or parser._parser is None: + return None + return parser._parser.ErrorColumnNumber + + def getLineNumber(self): + parser = self._ref() + if parser is None or parser._parser is None: + return 1 + return parser._parser.ErrorLineNumber + + def getPublicId(self): + parser = self._ref() + if parser is None: + return None + return parser._source.getPublicId() + + def getSystemId(self): + parser = self._ref() + if parser is None: + return None + return parser._source.getSystemId() + + +# --- ExpatParser + +class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator): + "SAX driver for the Pyexpat C module." + + def __init__(self, namespaceHandling=0, bufsize=2**16-20): + xmlreader.IncrementalParser.__init__(self, bufsize) + self._source = xmlreader.InputSource() + self._parser = None + self._namespaces = namespaceHandling + self._lex_handler_prop = None + self._parsing = 0 + self._entity_stack = [] + self._ns_stack = [] + + # XMLReader methods + + def parse(self, source): + "Parse an XML document from a URL or an InputSource." + source = saxutils.prepare_input_source(source) + + self._source = source + self.reset() + self._cont_handler.setDocumentLocator(ExpatLocator(self)) + xmlreader.IncrementalParser.parse(self, source) + + def prepareParser(self, source): + if source.getSystemId() != None: + self._parser.SetBase(source.getSystemId()) + + # Redefined setContentHandle to allow changing handlers during parsing + + def setContentHandler(self, handler): + xmlreader.IncrementalParser.setContentHandler(self, handler) + if self._parsing: + self._reset_cont_handler() + + def getFeature(self, name): + if name == handler.feature_namespaces: + return self._namespaces + raise SAXNotRecognizedException("Feature '%s' not recognized" % name) + + def setFeature(self, name, state): + if self._parsing: + raise SAXNotSupportedException("Cannot set features while parsing") + if name == handler.feature_namespaces: + self._namespaces = state + else: + raise SAXNotRecognizedException("Feature '%s' not recognized" % + name) + + def getProperty(self, name): + if name == handler.property_lexical_handler: + return self._lex_handler_prop + raise SAXNotRecognizedException("Property '%s' not recognized" % name) + + def setProperty(self, name, value): + if name == handler.property_lexical_handler: + self._lex_handler_prop = value + if self._parsing: + self._reset_lex_handler_prop() + else: + raise SAXNotRecognizedException("Property '%s' not recognized" % name) + + # IncrementalParser methods + + def feed(self, data, isFinal = 0): + if not self._parsing: + self.reset() + self._parsing = 1 + self._cont_handler.startDocument() + + try: + # The isFinal parameter is internal to the expat reader. + # If it is set to true, expat will check validity of the entire + # document. When feeding chunks, they are not normally final - + # except when invoked from close. + self._parser.Parse(data, isFinal) + except expat.error: + error_code = self._parser.ErrorCode + exc = SAXParseException(expat.ErrorString(error_code), None, self) + # FIXME: when to invoke error()? + self._err_handler.fatalError(exc) + + def close(self): + if self._entity_stack: + # If we are completing an external entity, do nothing here + return + self.feed("", isFinal = 1) + self._cont_handler.endDocument() + self._parsing = 0 + # break cycle created by expat handlers pointing to our methods + self._parser = None + + def _reset_cont_handler(self): + self._parser.ProcessingInstructionHandler = \ + self._cont_handler.processingInstruction + self._parser.CharacterDataHandler = self._cont_handler.characters + + def _reset_lex_handler_prop(self): + self._parser.CommentHandler = self._lex_handler_prop.comment + self._parser.StartCdataSectionHandler = self._lex_handler_prop.startCDATA + self._parser.EndCdataSectionHandler = self._lex_handler_prop.endCDATA + + def reset(self): + if self._namespaces: + self._parser = expat.ParserCreate(None, " ") + self._parser.StartElementHandler = self.start_element_ns + self._parser.EndElementHandler = self.end_element_ns + else: + self._parser = expat.ParserCreate() + self._parser.StartElementHandler = self.start_element + self._parser.EndElementHandler = self.end_element + + self._reset_cont_handler() + self._parser.UnparsedEntityDeclHandler = self.unparsed_entity_decl + self._parser.NotationDeclHandler = self.notation_decl + self._parser.StartNamespaceDeclHandler = self.start_namespace_decl + self._parser.EndNamespaceDeclHandler = self.end_namespace_decl + + self._decl_handler_prop = None + if self._lex_handler_prop: + self._reset_lex_handler_prop() +# self._parser.DefaultHandler = +# self._parser.DefaultHandlerExpand = +# self._parser.NotStandaloneHandler = + self._parser.ExternalEntityRefHandler = self.external_entity_ref + + self._parsing = 0 + self._entity_stack = [] + + # Locator methods + + def getColumnNumber(self): + if self._parser is None: + return None + return self._parser.ErrorColumnNumber + + def getLineNumber(self): + if self._parser is None: + return 1 + return self._parser.ErrorLineNumber + + def getPublicId(self): + return self._source.getPublicId() + + def getSystemId(self): + return self._source.getSystemId() + + # event handlers + def start_element(self, name, attrs): + self._cont_handler.startElement(name, AttributesImpl(attrs)) + + def end_element(self, name): + self._cont_handler.endElement(name) + + def start_element_ns(self, name, attrs): + pair = string.split(name) + if len(pair) == 1: + pair = (None, name) + qname = name + else: + pair = tuple(pair) + qname = pair[1] + if self._ns_stack: + prefix = self._ns_stack[-1][pair[0]][-1] + if prefix: + qname = "%s:%s" % (prefix, pair[1]) + + newattrs = {} + qnames = {} + for (aname, value) in attrs.items(): + apair = string.split(aname) + if len(apair) == 1: + apair = (None, aname) + aqname = aname + else: + apair = tuple(apair) + # XXX need to guess the prefix + prefix = self._ns_stack[-1][apair[0]][-1] + aqname = "%s:%s" % (prefix, apair[1]) + + newattrs[apair] = value + qnames[apair] = aqname + + self._cont_handler.startElementNS(pair, qname, + AttributesNSImpl(newattrs, qnames)) + + def end_element_ns(self, name): + pair = string.split(name) + if len(pair) == 1: + pair = (None, name) + qname = name + else: + pair = tuple(pair) + qname = pair[1] + if self._ns_stack: + prefix = self._ns_stack[-1][pair[0]][-1] + if prefix: + qname = "%s:%s" % (prefix, pair[1]) + + self._cont_handler.endElementNS(pair, qname) + + # this is not used (call directly to ContentHandler) + def processing_instruction(self, target, data): + self._cont_handler.processingInstruction(target, data) + + # this is not used (call directly to ContentHandler) + def character_data(self, data): + self._cont_handler.characters(data) + + def start_namespace_decl(self, prefix, uri): + if self._ns_stack: + d = self._ns_stack[-1].copy() + if d.has_key(uri): + L = d[uri][:] + d[uri] = L + L.append(prefix) + else: + d[uri] = [prefix] + else: + d = {uri: [prefix]} + self._ns_stack.append(d) + self._cont_handler.startPrefixMapping(prefix, uri) + + def end_namespace_decl(self, prefix): + del self._ns_stack[-1] + self._cont_handler.endPrefixMapping(prefix) + + def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + self._dtd_handler.unparsedEntityDecl(name, pubid, sysid, notation_name) + + def notation_decl(self, name, base, sysid, pubid): + self._dtd_handler.notationDecl(name, pubid, sysid) + + def external_entity_ref(self, context, base, sysid, pubid): + source = self._ent_handler.resolveEntity(pubid, sysid) + source = saxutils.prepare_input_source(source, + self._source.getSystemId() or + "") + + self._entity_stack.append((self._parser, self._source)) + self._parser = self._parser.ExternalEntityParserCreate(context) + self._source = source + + try: + xmlreader.IncrementalParser.parse(self, source) + except: + return 0 # FIXME: save error info here? + + (self._parser, self._source) = self._entity_stack[-1] + del self._entity_stack[-1] + return 1 + +# --- + +def create_parser(*args, **kwargs): + return apply(ExpatParser, args, kwargs) + +# --- + +if __name__ == "__main__": + import xml.sax + p = create_parser() + p.setContentHandler(xml.sax.XMLGenerator()) + p.setErrorHandler(xml.sax.ErrorHandler()) + p.parse("../../../hamlet.xml") diff --git a/lib-python/2.2/xml/sax/handler.py b/lib-python/2.2/xml/sax/handler.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/handler.py @@ -0,0 +1,321 @@ +""" +This module contains the core classes of version 2.0 of SAX for Python. +This file provides only default classes with absolutely minimum +functionality, from which drivers and applications can be subclassed. + +Many of these classes are empty and are included only as documentation +of the interfaces. + +$Id$ +""" + +version = '2.0beta' + +#============================================================================ +# +# HANDLER INTERFACES +# +#============================================================================ + +# ===== ERRORHANDLER ===== + +class ErrorHandler: + """Basic interface for SAX error handlers. + + If you create an object that implements this interface, then + register the object with your XMLReader, the parser will call the + methods in your object to report all warnings and errors. There + are three levels of errors available: warnings, (possibly) + recoverable errors, and unrecoverable errors. All methods take a + SAXParseException as the only parameter.""" + + def error(self, exception): + "Handle a recoverable error." + raise exception + + def fatalError(self, exception): + "Handle a non-recoverable error." + raise exception + + def warning(self, exception): + "Handle a warning." + print exception + + +# ===== CONTENTHANDLER ===== + +class ContentHandler: + """Interface for receiving logical document content events. + + This is the main callback interface in SAX, and the one most + important to applications. The order of events in this interface + mirrors the order of the information in the document.""" + + def __init__(self): + self._locator = None + + def setDocumentLocator(self, locator): + """Called by the parser to give the application a locator for + locating the origin of document events. + + SAX parsers are strongly encouraged (though not absolutely + required) to supply a locator: if it does so, it must supply + the locator to the application by invoking this method before + invoking any of the other methods in the DocumentHandler + interface. + + The locator allows the application to determine the end + position of any document-related event, even if the parser is + not reporting an error. Typically, the application will use + this information for reporting its own errors (such as + character content that does not match an application's + business rules). The information returned by the locator is + probably not sufficient for use with a search engine. + + Note that the locator will return correct information only + during the invocation of the events in this interface. The + application should not attempt to use it at any other time.""" + self._locator = locator + + def startDocument(self): + """Receive notification of the beginning of a document. + + The SAX parser will invoke this method only once, before any + other methods in this interface or in DTDHandler (except for + setDocumentLocator).""" + + def endDocument(self): + """Receive notification of the end of a document. + + The SAX parser will invoke this method only once, and it will + be the last method invoked during the parse. The parser shall + not invoke this method until it has either abandoned parsing + (because of an unrecoverable error) or reached the end of + input.""" + + def startPrefixMapping(self, prefix, uri): + """Begin the scope of a prefix-URI Namespace mapping. + + The information from this event is not necessary for normal + Namespace processing: the SAX XML reader will automatically + replace prefixes for element and attribute names when the + http://xml.org/sax/features/namespaces feature is true (the + default). + + There are cases, however, when applications need to use + prefixes in character data or in attribute values, where they + cannot safely be expanded automatically; the + start/endPrefixMapping event supplies the information to the + application to expand prefixes in those contexts itself, if + necessary. + + Note that start/endPrefixMapping events are not guaranteed to + be properly nested relative to each-other: all + startPrefixMapping events will occur before the corresponding + startElement event, and all endPrefixMapping events will occur + after the corresponding endElement event, but their order is + not guaranteed.""" + + def endPrefixMapping(self, prefix): + """End the scope of a prefix-URI mapping. + + See startPrefixMapping for details. This event will always + occur after the corresponding endElement event, but the order + of endPrefixMapping events is not otherwise guaranteed.""" + + def startElement(self, name, attrs): + """Signals the start of an element in non-namespace mode. + + The name parameter contains the raw XML 1.0 name of the + element type as a string and the attrs parameter holds an + instance of the Attributes class containing the attributes of + the element.""" + + def endElement(self, name): + """Signals the end of an element in non-namespace mode. + + The name parameter contains the name of the element type, just + as with the startElement event.""" + + def startElementNS(self, name, qname, attrs): + """Signals the start of an element in namespace mode. + + The name parameter contains the name of the element type as a + (uri, localname) tuple, the qname parameter the raw XML 1.0 + name used in the source document, and the attrs parameter + holds an instance of the Attributes class containing the + attributes of the element.""" + + def endElementNS(self, name, qname): + """Signals the end of an element in namespace mode. + + The name parameter contains the name of the element type, just + as with the startElementNS event.""" + + def characters(self, content): + """Receive notification of character data. + + The Parser will call this method to report each chunk of + character data. SAX parsers may return all contiguous + character data in a single chunk, or they may split it into + several chunks; however, all of the characters in any single + event must come from the same external entity so that the + Locator provides useful information.""" + + def ignorableWhitespace(self, whitespace): + """Receive notification of ignorable whitespace in element content. + + Validating Parsers must use this method to report each chunk + of ignorable whitespace (see the W3C XML 1.0 recommendation, + section 2.10): non-validating parsers may also use this method + if they are capable of parsing and using content models. + + SAX parsers may return all contiguous whitespace in a single + chunk, or they may split it into several chunks; however, all + of the characters in any single event must come from the same + external entity, so that the Locator provides useful + information. + + The application must not attempt to read from the array + outside of the specified range.""" + + def processingInstruction(self, target, data): + """Receive notification of a processing instruction. + + The Parser will invoke this method once for each processing + instruction found: note that processing instructions may occur + before or after the main document element. + + A SAX parser should never report an XML declaration (XML 1.0, + section 2.8) or a text declaration (XML 1.0, section 4.3.1) + using this method.""" + + def skippedEntity(self, name): + """Receive notification of a skipped entity. + + The Parser will invoke this method once for each entity + skipped. Non-validating processors may skip entities if they + have not seen the declarations (because, for example, the + entity was declared in an external DTD subset). All processors + may skip external entities, depending on the values of the + http://xml.org/sax/features/external-general-entities and the + http://xml.org/sax/features/external-parameter-entities + properties.""" + + +# ===== DTDHandler ===== + +class DTDHandler: + """Handle DTD events. + + This interface specifies only those DTD events required for basic + parsing (unparsed entities and attributes).""" + + def notationDecl(self, name, publicId, systemId): + "Handle a notation declaration event." + + def unparsedEntityDecl(self, name, publicId, systemId, ndata): + "Handle an unparsed entity declaration event." + + +# ===== ENTITYRESOLVER ===== + +class EntityResolver: + """Basic interface for resolving entities. If you create an object + implementing this interface, then register the object with your + Parser, the parser will call the method in your object to + resolve all external entities. Note that DefaultHandler implements + this interface with the default behaviour.""" + + def resolveEntity(self, publicId, systemId): + """Resolve the system identifier of an entity and return either + the system identifier to read from as a string, or an InputSource + to read from.""" + return systemId + + +#============================================================================ +# +# CORE FEATURES +# +#============================================================================ + +feature_namespaces = "http://xml.org/sax/features/namespaces" +# true: Perform Namespace processing (default). +# false: Optionally do not perform Namespace processing +# (implies namespace-prefixes). +# access: (parsing) read-only; (not parsing) read/write + +feature_namespace_prefixes = "http://xml.org/sax/features/namespace-prefixes" +# true: Report the original prefixed names and attributes used for Namespace +# declarations. +# false: Do not report attributes used for Namespace declarations, and +# optionally do not report original prefixed names (default). +# access: (parsing) read-only; (not parsing) read/write + +feature_string_interning = "http://xml.org/sax/features/string-interning" +# true: All element names, prefixes, attribute names, Namespace URIs, and +# local names are interned using the built-in intern function. +# false: Names are not necessarily interned, although they may be (default). +# access: (parsing) read-only; (not parsing) read/write + +feature_validation = "http://xml.org/sax/features/validation" +# true: Report all validation errors (implies external-general-entities and +# external-parameter-entities). +# false: Do not report validation errors. +# access: (parsing) read-only; (not parsing) read/write + +feature_external_ges = "http://xml.org/sax/features/external-general-entities" +# true: Include all external general (text) entities. +# false: Do not include external general entities. +# access: (parsing) read-only; (not parsing) read/write + +feature_external_pes = "http://xml.org/sax/features/external-parameter-entities" +# true: Include all external parameter entities, including the external +# DTD subset. +# false: Do not include any external parameter entities, even the external +# DTD subset. +# access: (parsing) read-only; (not parsing) read/write + +all_features = [feature_namespaces, + feature_namespace_prefixes, + feature_string_interning, + feature_validation, + feature_external_ges, + feature_external_pes] + + +#============================================================================ +# +# CORE PROPERTIES +# +#============================================================================ + +property_lexical_handler = "http://xml.org/sax/properties/lexical-handler" +# data type: xml.sax.sax2lib.LexicalHandler +# description: An optional extension handler for lexical events like comments. +# access: read/write + +property_declaration_handler = "http://xml.org/sax/properties/declaration-handler" +# data type: xml.sax.sax2lib.DeclHandler +# description: An optional extension handler for DTD-related events other +# than notations and unparsed entities. +# access: read/write + +property_dom_node = "http://xml.org/sax/properties/dom-node" +# data type: org.w3c.dom.Node +# description: When parsing, the current DOM node being visited if this is +# a DOM iterator; when not parsing, the root DOM node for +# iteration. +# access: (parsing) read-only; (not parsing) read/write + +property_xml_string = "http://xml.org/sax/properties/xml-string" +# data type: String +# description: The literal string of characters that was the source for +# the current event. +# access: read-only + +all_properties = [property_lexical_handler, + property_dom_node, + property_declaration_handler, + property_xml_string] diff --git a/lib-python/2.2/xml/sax/saxutils.py b/lib-python/2.2/xml/sax/saxutils.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/saxutils.py @@ -0,0 +1,260 @@ +"""\ +A library of useful helper classes to the SAX classes, for the +convenience of application and driver writers. +""" + +import os, urlparse, urllib, types +import handler +import xmlreader + +try: + _StringTypes = [types.StringType, types.UnicodeType] +except AttributeError: + _StringTypes = [types.StringType] + + +def escape(data, entities={}): + """Escape &, <, and > in a string of data. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + data = data.replace("&", "&") + data = data.replace("<", "<") + data = data.replace(">", ">") + for chars, entity in entities.items(): + data = data.replace(chars, entity) + return data + +def quoteattr(data, entities={}): + """Escape and quote an attribute value. + + Escape &, <, and > in a string of data, then quote it for use as + an attribute value. The \" character will be escaped as well, if + necessary. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + data = escape(data, entities) + if '"' in data: + if "'" in data: + data = '"%s"' % data.replace('"', """) + else: + data = "'%s'" % data + else: + data = '"%s"' % data + return data + + +class XMLGenerator(handler.ContentHandler): + + def __init__(self, out=None, encoding="iso-8859-1"): + if out is None: + import sys + out = sys.stdout + handler.ContentHandler.__init__(self) + self._out = out + self._ns_contexts = [{}] # contains uri -> prefix dicts + self._current_context = self._ns_contexts[-1] + self._undeclared_ns_maps = [] + self._encoding = encoding + + # ContentHandler methods + + def startDocument(self): + self._out.write('\n' % + self._encoding) + + def startPrefixMapping(self, prefix, uri): + self._ns_contexts.append(self._current_context.copy()) + self._current_context[uri] = prefix + self._undeclared_ns_maps.append((prefix, uri)) + + def endPrefixMapping(self, prefix): + self._current_context = self._ns_contexts[-1] + del self._ns_contexts[-1] + + def startElement(self, name, attrs): + self._out.write('<' + name) + for (name, value) in attrs.items(): + self._out.write(' %s=%s' % (name, quoteattr(value))) + self._out.write('>') + + def endElement(self, name): + self._out.write('' % name) + + def startElementNS(self, name, qname, attrs): + if name[0] is None: + # if the name was not namespace-scoped, use the unqualified part + name = name[1] + else: + # else try to restore the original prefix from the namespace + name = self._current_context[name[0]] + ":" + name[1] + self._out.write('<' + name) + + for pair in self._undeclared_ns_maps: + self._out.write(' xmlns:%s="%s"' % pair) + self._undeclared_ns_maps = [] + + for (name, value) in attrs.items(): + name = self._current_context[name[0]] + ":" + name[1] + self._out.write(' %s=%s' % (name, quoteattr(value))) + self._out.write('>') + + def endElementNS(self, name, qname): + if name[0] is None: + name = name[1] + else: + name = self._current_context[name[0]] + ":" + name[1] + self._out.write('' % name) + + def characters(self, content): + self._out.write(escape(content)) + + def ignorableWhitespace(self, content): + self._out.write(content) + + def processingInstruction(self, target, data): + self._out.write('' % (target, data)) + + +class XMLFilterBase(xmlreader.XMLReader): + """This class is designed to sit between an XMLReader and the + client application's event handlers. By default, it does nothing + but pass requests up to the reader and events on to the handlers + unmodified, but subclasses can override specific methods to modify + the event stream or the configuration requests as they pass + through.""" + + def __init__(self, parent = None): + xmlreader.XMLReader.__init__(self) + self._parent = parent + + # ErrorHandler methods + + def error(self, exception): + self._err_handler.error(exception) + + def fatalError(self, exception): + self._err_handler.fatalError(exception) + + def warning(self, exception): + self._err_handler.warning(exception) + + # ContentHandler methods + + def setDocumentLocator(self, locator): + self._cont_handler.setDocumentLocator(locator) + + def startDocument(self): + self._cont_handler.startDocument() + + def endDocument(self): + self._cont_handler.endDocument() + + def startPrefixMapping(self, prefix, uri): + self._cont_handler.startPrefixMapping(prefix, uri) + + def endPrefixMapping(self, prefix): + self._cont_handler.endPrefixMapping(prefix) + + def startElement(self, name, attrs): + self._cont_handler.startElement(name, attrs) + + def endElement(self, name): + self._cont_handler.endElement(name) + + def startElementNS(self, name, qname, attrs): + self._cont_handler.startElement(name, attrs) + + def endElementNS(self, name, qname): + self._cont_handler.endElementNS(name, qname) + + def characters(self, content): + self._cont_handler.characters(content) + + def ignorableWhitespace(self, chars): + self._cont_handler.ignorableWhitespace(chars) + + def processingInstruction(self, target, data): + self._cont_handler.processingInstruction(target, data) + + def skippedEntity(self, name): + self._cont_handler.skippedEntity(name) + + # DTDHandler methods + + def notationDecl(self, name, publicId, systemId): + self._dtd_handler.notationDecl(name, publicId, systemId) + + def unparsedEntityDecl(self, name, publicId, systemId, ndata): + self._dtd_handler.unparsedEntityDecl(name, publicId, systemId, ndata) + + # EntityResolver methods + + def resolveEntity(self, publicId, systemId): + self._ent_handler.resolveEntity(publicId, systemId) + + # XMLReader methods + + def parse(self, source): + self._parent.setContentHandler(self) + self._parent.setErrorHandler(self) + self._parent.setEntityResolver(self) + self._parent.setDTDHandler(self) + self._parent.parse(source) + + def setLocale(self, locale): + self._parent.setLocale(locale) + + def getFeature(self, name): + return self._parent.getFeature(name) + + def setFeature(self, name, state): + self._parent.setFeature(name, state) + + def getProperty(self, name): + return self._parent.getProperty(name) + + def setProperty(self, name, value): + self._parent.setProperty(name, value) + + # XMLFilter methods + + def getParent(self): + return self._parent + + def setParent(self, parent): + self._parent = parent + +# --- Utility functions + +def prepare_input_source(source, base = ""): + """This function takes an InputSource and an optional base URL and + returns a fully resolved InputSource object ready for reading.""" + + if type(source) in _StringTypes: + source = xmlreader.InputSource(source) + elif hasattr(source, "read"): + f = source + source = xmlreader.InputSource() + source.setByteStream(f) + if hasattr(f, "name"): + source.setSystemId(f.name) + + if source.getByteStream() is None: + sysid = source.getSystemId() + if os.path.isfile(sysid): + basehead = os.path.split(os.path.normpath(base))[0] + source.setSystemId(os.path.join(basehead, sysid)) + f = open(sysid, "rb") + else: + source.setSystemId(urlparse.urljoin(base, sysid)) + f = urllib.urlopen(source.getSystemId()) + + source.setByteStream(f) + + return source diff --git a/lib-python/2.2/xml/sax/xmlreader.py b/lib-python/2.2/xml/sax/xmlreader.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xml/sax/xmlreader.py @@ -0,0 +1,378 @@ +"""An XML Reader is the SAX 2 name for an XML parser. XML Parsers +should be based on this code. """ + +import handler + +from _exceptions import SAXNotSupportedException, SAXNotRecognizedException + + +# ===== XMLREADER ===== + +class XMLReader: + """Interface for reading an XML document using callbacks. + + XMLReader is the interface that an XML parser's SAX2 driver must + implement. This interface allows an application to set and query + features and properties in the parser, to register event handlers + for document processing, and to initiate a document parse. + + All SAX interfaces are assumed to be synchronous: the parse + methods must not return until parsing is complete, and readers + must wait for an event-handler callback to return before reporting + the next event.""" + + def __init__(self): + self._cont_handler = handler.ContentHandler() + self._dtd_handler = handler.DTDHandler() + self._ent_handler = handler.EntityResolver() + self._err_handler = handler.ErrorHandler() + + def parse(self, source): + "Parse an XML document from a system identifier or an InputSource." + raise NotImplementedError("This method must be implemented!") + + def getContentHandler(self): + "Returns the current ContentHandler." + return self._cont_handler + + def setContentHandler(self, handler): + "Registers a new object to receive document content events." + self._cont_handler = handler + + def getDTDHandler(self): + "Returns the current DTD handler." + return self._dtd_handler + + def setDTDHandler(self, handler): + "Register an object to receive basic DTD-related events." + self._dtd_handler = handler + + def getEntityResolver(self): + "Returns the current EntityResolver." + return self._ent_handler + + def setEntityResolver(self, resolver): + "Register an object to resolve external entities." + self._ent_handler = resolver + + def getErrorHandler(self): + "Returns the current ErrorHandler." + return self._err_handler + + def setErrorHandler(self, handler): + "Register an object to receive error-message events." + self._err_handler = handler + + def setLocale(self, locale): + """Allow an application to set the locale for errors and warnings. + + SAX parsers are not required to provide localization for errors + and warnings; if they cannot support the requested locale, + however, they must throw a SAX exception. Applications may + request a locale change in the middle of a parse.""" + raise SAXNotSupportedException("Locale support not implemented") + + def getFeature(self, name): + "Looks up and returns the state of a SAX2 feature." + raise SAXNotRecognizedException("Feature '%s' not recognized" % name) + + def setFeature(self, name, state): + "Sets the state of a SAX2 feature." + raise SAXNotRecognizedException("Feature '%s' not recognized" % name) + + def getProperty(self, name): + "Looks up and returns the value of a SAX2 property." + raise SAXNotRecognizedException("Property '%s' not recognized" % name) + + def setProperty(self, name, value): + "Sets the value of a SAX2 property." + raise SAXNotRecognizedException("Property '%s' not recognized" % name) + +class IncrementalParser(XMLReader): + """This interface adds three extra methods to the XMLReader + interface that allow XML parsers to support incremental + parsing. Support for this interface is optional, since not all + underlying XML parsers support this functionality. + + When the parser is instantiated it is ready to begin accepting + data from the feed method immediately. After parsing has been + finished with a call to close the reset method must be called to + make the parser ready to accept new data, either from feed or + using the parse method. + + Note that these methods must _not_ be called during parsing, that + is, after parse has been called and before it returns. + + By default, the class also implements the parse method of the XMLReader + interface using the feed, close and reset methods of the + IncrementalParser interface as a convenience to SAX 2.0 driver + writers.""" + + def __init__(self, bufsize=2**16): + self._bufsize = bufsize + XMLReader.__init__(self) + + def parse(self, source): + import saxutils + source = saxutils.prepare_input_source(source) + + self.prepareParser(source) + file = source.getByteStream() + buffer = file.read(self._bufsize) + while buffer != "": + self.feed(buffer) + buffer = file.read(self._bufsize) + self.close() + + def feed(self, data): + """This method gives the raw XML data in the data parameter to + the parser and makes it parse the data, emitting the + corresponding events. It is allowed for XML constructs to be + split across several calls to feed. + + feed may raise SAXException.""" + raise NotImplementedError("This method must be implemented!") + + def prepareParser(self, source): + """This method is called by the parse implementation to allow + the SAX 2.0 driver to prepare itself for parsing.""" + raise NotImplementedError("prepareParser must be overridden!") + + def close(self): + """This method is called when the entire XML document has been + passed to the parser through the feed method, to notify the + parser that there are no more data. This allows the parser to + do the final checks on the document and empty the internal + data buffer. + + The parser will not be ready to parse another document until + the reset method has been called. + + close may raise SAXException.""" + raise NotImplementedError("This method must be implemented!") + + def reset(self): + """This method is called after close has been called to reset + the parser so that it is ready to parse new documents. The + results of calling parse or feed after close without calling + reset are undefined.""" + raise NotImplementedError("This method must be implemented!") + +# ===== LOCATOR ===== + +class Locator: + """Interface for associating a SAX event with a document + location. A locator object will return valid results only during + calls to DocumentHandler methods; at any other time, the + results are unpredictable.""" + + def getColumnNumber(self): + "Return the column number where the current event ends." + return -1 + + def getLineNumber(self): + "Return the line number where the current event ends." + return -1 + + def getPublicId(self): + "Return the public identifier for the current event." + return None + + def getSystemId(self): + "Return the system identifier for the current event." + return None + +# ===== INPUTSOURCE ===== + +class InputSource: + """Encapsulation of the information needed by the XMLReader to + read entities. + + This class may include information about the public identifier, + system identifier, byte stream (possibly with character encoding + information) and/or the character stream of an entity. + + Applications will create objects of this class for use in the + XMLReader.parse method and for returning from + EntityResolver.resolveEntity. + + An InputSource belongs to the application, the XMLReader is not + allowed to modify InputSource objects passed to it from the + application, although it may make copies and modify those.""" + + def __init__(self, system_id = None): + self.__system_id = system_id + self.__public_id = None + self.__encoding = None + self.__bytefile = None + self.__charfile = None + + def setPublicId(self, public_id): + "Sets the public identifier of this InputSource." + self.__public_id = public_id + + def getPublicId(self): + "Returns the public identifier of this InputSource." + return self.__public_id + + def setSystemId(self, system_id): + "Sets the system identifier of this InputSource." + self.__system_id = system_id + + def getSystemId(self): + "Returns the system identifier of this InputSource." + return self.__system_id + + def setEncoding(self, encoding): + """Sets the character encoding of this InputSource. + + The encoding must be a string acceptable for an XML encoding + declaration (see section 4.3.3 of the XML recommendation). + + The encoding attribute of the InputSource is ignored if the + InputSource also contains a character stream.""" + self.__encoding = encoding + + def getEncoding(self): + "Get the character encoding of this InputSource." + return self.__encoding + + def setByteStream(self, bytefile): + """Set the byte stream (a Python file-like object which does + not perform byte-to-character conversion) for this input + source. + + The SAX parser will ignore this if there is also a character + stream specified, but it will use a byte stream in preference + to opening a URI connection itself. + + If the application knows the character encoding of the byte + stream, it should set it with the setEncoding method.""" + self.__bytefile = bytefile + + def getByteStream(self): + """Get the byte stream for this input source. + + The getEncoding method will return the character encoding for + this byte stream, or None if unknown.""" + return self.__bytefile + + def setCharacterStream(self, charfile): + """Set the character stream for this input source. (The stream + must be a Python 2.0 Unicode-wrapped file-like that performs + conversion to Unicode strings.) + + If there is a character stream specified, the SAX parser will + ignore any byte stream and will not attempt to open a URI + connection to the system identifier.""" + self.__charfile = charfile + + def getCharacterStream(self): + "Get the character stream for this input source." + return self.__charfile + +# ===== ATTRIBUTESIMPL ===== + +class AttributesImpl: + + def __init__(self, attrs): + """Non-NS-aware implementation. + + attrs should be of the form {name : value}.""" + self._attrs = attrs + + def getLength(self): + return len(self._attrs) + + def getType(self, name): + return "CDATA" + + def getValue(self, name): + return self._attrs[name] + + def getValueByQName(self, name): + return self._attrs[name] + + def getNameByQName(self, name): + if not self._attrs.has_key(name): + raise KeyError, name + return name + + def getQNameByName(self, name): + if not self._attrs.has_key(name): + raise KeyError, name + return name + + def getNames(self): + return self._attrs.keys() + + def getQNames(self): + return self._attrs.keys() + + def __len__(self): + return len(self._attrs) + + def __getitem__(self, name): + return self._attrs[name] + + def keys(self): + return self._attrs.keys() + + def has_key(self, name): + return self._attrs.has_key(name) + + def get(self, name, alternative=None): + return self._attrs.get(name, alternative) + + def copy(self): + return self.__class__(self._attrs) + + def items(self): + return self._attrs.items() + + def values(self): + return self._attrs.values() + +# ===== ATTRIBUTESNSIMPL ===== + +class AttributesNSImpl(AttributesImpl): + + def __init__(self, attrs, qnames): + """NS-aware implementation. + + attrs should be of the form {(ns_uri, lname): value, ...}. + qnames of the form {(ns_uri, lname): qname, ...}.""" + self._attrs = attrs + self._qnames = qnames + + def getValueByQName(self, name): + for (nsname, qname) in self._qnames.items(): + if qname == name: + return self._attrs[nsname] + + raise KeyError, name + + def getNameByQName(self, name): + for (nsname, qname) in self._qnames.items(): + if qname == name: + return nsname + + raise KeyError, name + + def getQNameByName(self, name): + return self._qnames[name] + + def getQNames(self): + return self._qnames.values() + + def copy(self): + return self.__class__(self._attrs, self._qnames) + + +def _test(): + XMLReader() + IncrementalParser() + Locator() + +if __name__ == "__main__": + _test() diff --git a/lib-python/2.2/xmllib.py b/lib-python/2.2/xmllib.py new file mode 100644 --- /dev/null +++ b/lib-python/2.2/xmllib.py @@ -0,0 +1,929 @@ +"""A parser for XML, using the derived class as static DTD.""" + +# Author: Sjoerd Mullender. + +import re +import string + + +version = '0.3' + +class Error(RuntimeError): + pass + +# Regular expressions used for parsing + +_S = '[ \t\r\n]+' # white space +_opS = '[ \t\r\n]*' # optional white space +_Name = '[a-zA-Z_:][-a-zA-Z0-9._:]*' # valid XML name +_QStr = "(?:'[^']*'|\"[^\"]*\")" # quoted XML string +illegal = re.compile('[^\t\r\n -\176\240-\377]') # illegal chars in content +interesting = re.compile('[]&<]') + +amp = re.compile('&') +ref = re.compile('&(' + _Name + '|#[0-9]+|#x[0-9a-fA-F]+)[^-a-zA-Z0-9._:]') +entityref = re.compile('&(?P' + _Name + ')[^-a-zA-Z0-9._:]') +charref = re.compile('&#(?P[0-9]+[^0-9]|x[0-9a-fA-F]+[^0-9a-fA-F])') +space = re.compile(_S + '$') +newline = re.compile('\n') + +attrfind = re.compile( + _S + '(?P' + _Name + ')' + '(' + _opS + '=' + _opS + + '(?P'+_QStr+'|[-a-zA-Z0-9.:+*%?!\(\)_#=~]+))?') +starttagopen = re.compile('<' + _Name) +starttagend = re.compile(_opS + '(?P/?)>') +starttagmatch = re.compile('<(?P'+_Name+')' + '(?P(?:'+attrfind.pattern+')*)'+ + starttagend.pattern) +endtagopen = re.compile('') +endbracketfind = re.compile('(?:[^>\'"]|'+_QStr+')*>') +tagfind = re.compile(_Name) +cdataopen = re.compile(r'') +# this matches one of the following: +# SYSTEM SystemLiteral +# PUBLIC PubidLiteral SystemLiteral +_SystemLiteral = '(?P<%s>'+_QStr+')' +_PublicLiteral = '(?P<%s>"[-\'\(\)+,./:=?;!*#@$_%% \n\ra-zA-Z0-9]*"|' \ + "'[-\(\)+,./:=?;!*#@$_%% \n\ra-zA-Z0-9]*')" +_ExternalId = '(?:SYSTEM|' \ + 'PUBLIC'+_S+_PublicLiteral%'pubid'+ \ + ')'+_S+_SystemLiteral%'syslit' +doctype = re.compile(''+_Name+')' + '(?:'+_S+_ExternalId+')?'+_opS) +xmldecl = re.compile('<\?xml'+_S+ + 'version'+_opS+'='+_opS+'(?P'+_QStr+')'+ + '(?:'+_S+'encoding'+_opS+'='+_opS+ + "(?P'[A-Za-z][-A-Za-z0-9._]*'|" + '"[A-Za-z][-A-Za-z0-9._]*"))?' + '(?:'+_S+'standalone'+_opS+'='+_opS+ + '(?P\'(?:yes|no)\'|"(?:yes|no)"))?'+ + _opS+'\?>') +procopen = re.compile(r'<\?(?P' + _Name + ')' + _opS) +procclose = re.compile(_opS + r'\?>') +commentopen = re.compile('') +doubledash = re.compile('--') +attrtrans = string.maketrans(' \r\n\t', ' ') + +# definitions for XML namespaces +_NCName = '[a-zA-Z_][-a-zA-Z0-9._]*' # XML Name, minus the ":" +ncname = re.compile(_NCName + '$') +qname = re.compile('(?:(?P' + _NCName + '):)?' # optional prefix + '(?P' + _NCName + ')$') + +xmlns = re.compile('xmlns(?::(?P'+_NCName+'))?$') + +# XML parser base class -- find tags and call handler functions. +# Usage: p = XMLParser(); p.feed(data); ...; p.close(). +# The dtd is defined by deriving a class which defines methods with +# special names to handle tags: start_foo and end_foo to handle +# and , respectively. The data between tags is passed to the +# parser by calling self.handle_data() with some data as argument (the +# data may be split up in arbitrary chunks). + +class XMLParser: + attributes = {} # default, to be overridden + elements = {} # default, to be overridden + + # parsing options, settable using keyword args in __init__ + __accept_unquoted_attributes = 0 + __accept_missing_endtag_name = 0 + __map_case = 0 + __accept_utf8 = 0 + __translate_attribute_references = 1 + + # Interface -- initialize and reset this instance + def __init__(self, **kw): + self.__fixed = 0 + if kw.has_key('accept_unquoted_attributes'): + self.__accept_unquoted_attributes = kw['accept_unquoted_attributes'] + if kw.has_key('accept_missing_endtag_name'): + self.__accept_missing_endtag_name = kw['accept_missing_endtag_name'] + if kw.has_key('map_case'): + self.__map_case = kw['map_case'] + if kw.has_key('accept_utf8'): + self.__accept_utf8 = kw['accept_utf8'] + if kw.has_key('translate_attribute_references'): + self.__translate_attribute_references = kw['translate_attribute_references'] + self.reset() + + def __fixelements(self): + self.__fixed = 1 + self.elements = {} + self.__fixdict(self.__dict__) + self.__fixclass(self.__class__) + + def __fixclass(self, kl): + self.__fixdict(kl.__dict__) + for k in kl.__bases__: + self.__fixclass(k) + + def __fixdict(self, dict): + for key in dict.keys(): + if key[:6] == 'start_': + tag = key[6:] + start, end = self.elements.get(tag, (None, None)) + if start is None: + self.elements[tag] = getattr(self, key), end + elif key[:4] == 'end_': + tag = key[4:] + start, end = self.elements.get(tag, (None, None)) + if end is None: + self.elements[tag] = start, getattr(self, key) + + # Interface -- reset this instance. Loses all unprocessed data + def reset(self): + self.rawdata = '' + self.stack = [] + self.nomoretags = 0 + self.literal = 0 + self.lineno = 1 + self.__at_start = 1 + self.__seen_doctype = None + self.__seen_starttag = 0 + self.__use_namespaces = 0 + self.__namespaces = {'xml':None} # xml is implicitly declared + # backward compatibility hack: if elements not overridden, + # fill it in ourselves + if self.elements is XMLParser.elements: + self.__fixelements() + + # For derived classes only -- enter literal mode (CDATA) till EOF + def setnomoretags(self): + self.nomoretags = self.literal = 1 + + # For derived classes only -- enter literal mode (CDATA) + def setliteral(self, *args): + self.literal = 1 + + # Interface -- feed some data to the parser. Call this as + # often as you want, with as little or as much text as you + # want (may include '\n'). (This just saves the text, all the + # processing is done by goahead().) + def feed(self, data): + self.rawdata = self.rawdata + data + self.goahead(0) + + # Interface -- handle the remaining data + def close(self): + self.goahead(1) + if self.__fixed: + self.__fixed = 0 + # remove self.elements so that we don't leak + del self.elements + + # Interface -- translate references + def translate_references(self, data, all = 1): + if not self.__translate_attribute_references: + return data + i = 0 + while 1: + res = amp.search(data, i) + if res is None: + return data + s = res.start(0) + res = ref.match(data, s) + if res is None: + self.syntax_error("bogus `&'") + i = s+1 + continue + i = res.end(0) + str = res.group(1) + rescan = 0 + if str[0] == '#': + if str[1] == 'x': + str = chr(int(str[2:], 16)) + else: + str = chr(int(str[1:])) + if data[i - 1] != ';': + self.syntax_error("`;' missing after char reference") + i = i-1 + elif all: + if self.entitydefs.has_key(str): + str = self.entitydefs[str] + rescan = 1 + elif data[i - 1] != ';': + self.syntax_error("bogus `&'") + i = s + 1 # just past the & + continue + else: + self.syntax_error("reference to unknown entity `&%s;'" % str) + str = '&' + str + ';' + elif data[i - 1] != ';': + self.syntax_error("bogus `&'") + i = s + 1 # just past the & + continue + + # when we get here, str contains the translated text and i points + # to the end of the string that is to be replaced + data = data[:s] + str + data[i:] + if rescan: + i = s + else: + i = s + len(str) + + # Interface - return a dictionary of all namespaces currently valid + def getnamespace(self): + nsdict = {} + for t, d, nst in self.stack: + nsdict.update(d) + return nsdict + + # Internal -- handle data as far as reasonable. May leave state + # and data to be processed by a subsequent call. If 'end' is + # true, force handling all data as if followed by EOF marker. + def goahead(self, end): + rawdata = self.rawdata + i = 0 + n = len(rawdata) + while i < n: + if i > 0: + self.__at_start = 0 + if self.nomoretags: + data = rawdata[i:n] + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + i = n + break + res = interesting.search(rawdata, i) + if res: + j = res.start(0) + else: + j = n + if i < j: + data = rawdata[i:j] + if self.__at_start and space.match(data) is None: + self.syntax_error('illegal data at start of file') + self.__at_start = 0 + if not self.stack and space.match(data) is None: + self.syntax_error('data not in content') + if not self.__accept_utf8 and illegal.search(data): + self.syntax_error('illegal character in content') + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + i = j + if i == n: break + if rawdata[i] == '<': + if starttagopen.match(rawdata, i): + if self.literal: + data = rawdata[i] + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + i = i+1 + continue + k = self.parse_starttag(i) + if k < 0: break + self.__seen_starttag = 1 + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + if endtagopen.match(rawdata, i): + k = self.parse_endtag(i) + if k < 0: break + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + if commentopen.match(rawdata, i): + if self.literal: + data = rawdata[i] + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + i = i+1 + continue + k = self.parse_comment(i) + if k < 0: break + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + if cdataopen.match(rawdata, i): + k = self.parse_cdata(i) + if k < 0: break + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + res = xmldecl.match(rawdata, i) + if res: + if not self.__at_start: + self.syntax_error(" declaration not at start of document") + version, encoding, standalone = res.group('version', + 'encoding', + 'standalone') + if version[1:-1] != '1.0': + raise Error('only XML version 1.0 supported') + if encoding: encoding = encoding[1:-1] + if standalone: standalone = standalone[1:-1] + self.handle_xml(encoding, standalone) + i = res.end(0) + continue + res = procopen.match(rawdata, i) + if res: + k = self.parse_proc(i) + if k < 0: break + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + res = doctype.match(rawdata, i) + if res: + if self.literal: + data = rawdata[i] + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + i = i+1 + continue + if self.__seen_doctype: + self.syntax_error('multiple DOCTYPE elements') + if self.__seen_starttag: + self.syntax_error('DOCTYPE not at beginning of document') + k = self.parse_doctype(res) + if k < 0: break + self.__seen_doctype = res.group('name') + if self.__map_case: + self.__seen_doctype = self.__seen_doctype.lower() + self.lineno = self.lineno + rawdata[i:k].count('\n') + i = k + continue + elif rawdata[i] == '&': + if self.literal: + data = rawdata[i] + self.handle_data(data) + i = i+1 + continue + res = charref.match(rawdata, i) + if res is not None: + i = res.end(0) + if rawdata[i-1] != ';': + self.syntax_error("`;' missing in charref") + i = i-1 + if not self.stack: + self.syntax_error('data not in content') + self.handle_charref(res.group('char')[:-1]) + self.lineno = self.lineno + res.group(0).count('\n') + continue + res = entityref.match(rawdata, i) + if res is not None: + i = res.end(0) + if rawdata[i-1] != ';': + self.syntax_error("`;' missing in entityref") + i = i-1 + name = res.group('name') + if self.__map_case: + name = name.lower() + if self.entitydefs.has_key(name): + self.rawdata = rawdata = rawdata[:res.start(0)] + self.entitydefs[name] + rawdata[i:] + n = len(rawdata) + i = res.start(0) + else: + self.unknown_entityref(name) + self.lineno = self.lineno + res.group(0).count('\n') + continue + elif rawdata[i] == ']': + if self.literal: + data = rawdata[i] + self.handle_data(data) + i = i+1 + continue + if n-i < 3: + break + if cdataclose.match(rawdata, i): + self.syntax_error("bogus `]]>'") + self.handle_data(rawdata[i]) + i = i+1 + continue + else: + raise Error('neither < nor & ??') + # We get here only if incomplete matches but + # nothing else + break + # end while + if i > 0: + self.__at_start = 0 + if end and i < n: + data = rawdata[i] + self.syntax_error("bogus `%s'" % data) + if not self.__accept_utf8 and illegal.search(data): + self.syntax_error('illegal character in content') + self.handle_data(data) + self.lineno = self.lineno + data.count('\n') + self.rawdata = rawdata[i+1:] + return self.goahead(end) + self.rawdata = rawdata[i:] + if end: + if not self.__seen_starttag: + self.syntax_error('no elements in file') + if self.stack: + self.syntax_error('missing end tags') + while self.stack: + self.finish_endtag(self.stack[-1][0]) + + # Internal -- parse comment, return length or -1 if not terminated + def parse_comment(self, i): + rawdata = self.rawdata + if rawdata[i:i+4] != ' + -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Mon Mar 19 23:44:50 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Mon, 19 Mar 2012 23:44:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/9f1d42b6dd8f changeset: 6419:9f1d42b6dd8f parent: 6417:9e461c2696e9 parent: 6418:278d9cb22f28 user: Frank Wierzbicki date: Mon Mar 19 15:44:41 2012 -0700 summary: Merge from 2.5. files: tests/java/org/python/jsr223/ScriptEngineIOTest.java | 28 ++++++++ tests/python/dfs.py | 35 ++++++++++ 2 files changed, 63 insertions(+), 0 deletions(-) diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -1,11 +1,18 @@ package org.python.jsr223; +import javax.script.Bindings; +import javax.script.ScriptContext; import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.ScriptEngineFactory; +import javax.script.SimpleBindings; import junit.framework.TestCase; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; @@ -78,4 +85,25 @@ assertEquals(testString1, stdout.toString()); assertEquals(testString2, stderr.toString()); } + + public void testEvalWithReader() throws ScriptException, FileNotFoundException + { + final ScriptEngineManager manager = new ScriptEngineManager(); + + final String engineType = "jython"; + final ScriptEngine engine = manager.getEngineByName(engineType); + + final Bindings bindings = new SimpleBindings(); + bindings.put("firstLevelNodes", 10); + bindings.put("secondLevelNodes", 5); + + engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); + engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); + + final Reader dfsScript = new FileReader("tests/python/dfs.py"); + + for (int i = 1; i <= 10; i++) + engine.eval(dfsScript); + } + } diff --git a/tests/python/dfs.py b/tests/python/dfs.py new file mode 100644 --- /dev/null +++ b/tests/python/dfs.py @@ -0,0 +1,35 @@ +class DFS: + + def __init__(self): + self.visited_node_counter = 0 + + def visitor(self): + self.visited_node_counter += 1 + + def visit(self, node): + node.accept_visitor(self.visitor) + for child in node.children: self.visit(child) + +class Node: + + def __init__(self): + self.children = [] + + def add_child(self, node): + self.children.append(node) + + def accept_visitor(self, visitor): + visitor() + +root = Node() + +for i in xrange(0, firstLevelNodes): + root.add_child(Node()) + +for child in root.children: + for i in xrange(0, secondLevelNodes): child.add_child(Node()) + +dfs = DFS() +dfs.visit(root) + +result = dfs.visited_node_counter -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Mon Mar 19 23:44:50 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Mon, 19 Mar 2012 23:44:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Regression_test_?= =?utf8?q?for_issue_http=3A//bugs=2Ejython=2Eorg/issue1536=2E?= Message-ID: http://hg.python.org/jython/rev/278d9cb22f28 changeset: 6418:278d9cb22f28 branch: 2.5 parent: 6414:f351ce23d014 user: Frank Wierzbicki date: Mon Mar 19 15:44:04 2012 -0700 summary: Regression test for issue http://bugs.jython.org/issue1536. files: tests/java/org/python/jsr223/ScriptEngineIOTest.java | 28 ++++++++ tests/python/dfs.py | 35 ++++++++++ 2 files changed, 63 insertions(+), 0 deletions(-) diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -1,11 +1,18 @@ package org.python.jsr223; +import javax.script.Bindings; +import javax.script.ScriptContext; import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.ScriptEngineFactory; +import javax.script.SimpleBindings; import junit.framework.TestCase; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; @@ -78,4 +85,25 @@ assertEquals(testString1, stdout.toString()); assertEquals(testString2, stderr.toString()); } + + public void testEvalWithReader() throws ScriptException, FileNotFoundException + { + final ScriptEngineManager manager = new ScriptEngineManager(); + + final String engineType = "jython"; + final ScriptEngine engine = manager.getEngineByName(engineType); + + final Bindings bindings = new SimpleBindings(); + bindings.put("firstLevelNodes", 10); + bindings.put("secondLevelNodes", 5); + + engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); + engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); + + final Reader dfsScript = new FileReader("tests/python/dfs.py"); + + for (int i = 1; i <= 10; i++) + engine.eval(dfsScript); + } + } diff --git a/tests/python/dfs.py b/tests/python/dfs.py new file mode 100644 --- /dev/null +++ b/tests/python/dfs.py @@ -0,0 +1,35 @@ +class DFS: + + def __init__(self): + self.visited_node_counter = 0 + + def visitor(self): + self.visited_node_counter += 1 + + def visit(self, node): + node.accept_visitor(self.visitor) + for child in node.children: self.visit(child) + +class Node: + + def __init__(self): + self.children = [] + + def add_child(self, node): + self.children.append(node) + + def accept_visitor(self, visitor): + visitor() + +root = Node() + +for i in xrange(0, firstLevelNodes): + root.add_child(Node()) + +for child in root.children: + for i in xrange(0, secondLevelNodes): child.add_child(Node()) + +dfs = DFS() +dfs.visit(root) + +result = dfs.visited_node_counter -- Repository URL: http://hg.python.org/jython From Mailer-Daemon at python.org Mon Mar 19 20:34:50 2012 From: Mailer-Daemon at python.org (Mail Delivery System) Date: Mon, 19 Mar 2012 20:34:50 +0100 Subject: [Jython-checkins] Mail delivery failed: returning message to sender Message-ID: This message was created automatically by mail delivery software. A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed: jython-checkins at python.org SMTP error from remote mail server after MAIL FROM: SIZE=26466906: host mail.python.org [2001:888:2000:d::a6]: 552-5.3.4 Message size exceeds fixed limit 552 5.3.4 Contact postmaster at python.org for assistance. Please provide the following information in your problem report: time (Mar 19 20:34:50) and client (2001:888:2000:d::a4). ------ This is a copy of the message, including all the headers. ------ ------ The body of the message is 26125989 characters long; only the first ------ 106496 or so are included here. Return-path: Received: from localhost ([127.0.0.1] helo=dinsdale.python.org ident=hg) by dinsdale.python.org with esmtp (Exim 4.72) (envelope-from ) id 1S9iLw-0000yq-Ph for jython-checkins at python.org; Mon, 19 Mar 2012 20:34:50 +0100 Date: Mon, 19 Mar 2012 20:34:49 +0100 Message-Id: Content-Type: multipart/mixed; boundary="===============2065984506==" MIME-Version: 1.0 Subject: =?utf8?q?jython_=282=2E5=29=3A_Pull_in_CPython_2=2E5_lib_directly=2E?= To: jython-checkins at python.org From: frank.wierzbicki --===============2065984506== Content-Type: text/plain; charset="utf8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 aHR0cDovL2hnLnB5dGhvbi5vcmcvanl0aG9uL3Jldi9mMzUxY2UyM2QwMTQKY2hhbmdlc2V0OiAg IDY0MTQ6ZjM1MWNlMjNkMDE0CmJyYW5jaDogICAgICAyLjUKdXNlcjogICAgICAgIEZyYW5rIFdp ZXJ6Ymlja2kgPGZ3aWVyemJpY2tpQGdtYWlsLmNvbT4KZGF0ZTogICAgICAgIE1vbiBNYXIgMTkg MTE6MTU6NDggMjAxMiAtMDcwMApzdW1tYXJ5OgogIFB1bGwgaW4gQ1B5dGhvbiAyLjUgbGliIGRp cmVjdGx5LgoKZmlsZXM6CiAgYnVpbGQueG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNCArLQog IGxpYi1weXRob24vMi41L0Jhc2VIVFRQU2VydmVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1NzggKwogIGxpYi1weXRob24vMi41L0Jh c3Rpb24ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxNzcgKwogIGxpYi1weXRob24vMi41L0NHSUhUVFBTZXJ2ZXIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjIg KwogIGxpYi1weXRob24vMi41L0NvbmZpZ1BhcnNlci5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NDAgKwogIGxpYi1weXRob24vMi41 L0Nvb2tpZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA3NDYgKwogIGxpYi1weXRob24vMi41L0RvY1hNTFJQQ1NlcnZlci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDYgKwogIGxpYi1weXRob24vMi41L0hUTUxQYXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjkgKwogIGxpYi1weXRob24v Mi41L01pbWVXcml0ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxODEgKwogIGxpYi1weXRob24vMi41L1F1ZXVlLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAyMTUgKwogIGxpYi1weXRob24vMi41L1NpbXBsZUhUVFBTZXJ2ZXIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMjAgKwogIGxpYi1weXRo b24vMi41L1NpbXBsZVhNTFJQQ1NlcnZlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA1OTUgKwogIGxpYi1weXRob24vMi41L1NvY2tldFNlcnZl ci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA1ODggKwogIGxpYi1weXRob24vMi41L1N0cmluZ0lPLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMjMgKwogIGxpYi1w eXRob24vMi41L1VzZXJEaWN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzUgKwogIGxpYi1weXRob24vMi41L1VzZXJMaXN0 LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgODUgKwogIGxpYi1weXRob24vMi41L1VzZXJTdHJpbmcucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTQgKwogIGxp Yi1weXRob24vMi41L19MV1BDb29raWVKYXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzAgKwogIGxpYi1weXRob24vMi41L19Nb3pp bGxhQ29va2llSmFyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxNDkgKwogIGxpYi1weXRob24vMi41L19fZnV0dXJlX18ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTYgKwog IGxpYi1weXRob24vMi41L19fcGhlbGxvX18uZm9vLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L19z dHJwdGltZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA0NTEgKwogIGxpYi1weXRob24vMi41L190aHJlYWRpbmdfbG9jYWwucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNDEg KwogIGxpYi1weXRob24vMi41L2FpZmMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5NjEgKwogIGxpYi1weXRob24vMi41 L2FueWRibS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgODMgKwogIGxpYi1weXRob24vMi41L2FzeW5jaGF0LnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAy OTUgKwogIGxpYi1weXRob24vMi41L2FzeW5jb3JlLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1NTEgKwogIGxpYi1weXRob24v Mi41L2F0ZXhpdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNjIgKwogIGxpYi1weXRob24vMi41L2F1ZGlvZGV2LnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAyNTcgKwogIGxpYi1weXRob24vMi41L2Jhc2U2NC5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNTkgKwogIGxpYi1weXRo b24vMi41L2JkYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA2MTMgKwogIGxpYi1weXRob24vMi41L2JpbmhleC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA1MjcgKwogIGxpYi1weXRob24vMi41L2Jpc2VjdC5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODQgKwogIGxpYi1w eXRob24vMi41L2JzZGRiL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA0MDEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2Ri LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNTEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2Rib2JqLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNTQgKwogIGxp Yi1weXRob24vMi41L2JzZGRiL2RicmVjaW8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTAgKwogIGxpYi1weXRob24vMi41L2JzZGRi L2Ric2hlbHZlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMDEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2RidGFibGVzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3MDYgKwog IGxpYi1weXRob24vMi41L2JzZGRiL2RidXRpbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzcgKwogIGxpYi1weXRob24vMi41L2Jz ZGRiL3Rlc3QvX19pbml0X18ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDAgCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0XzE0MTMx OTIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0NyAr CiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2FsbC5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5MSArCiAgbGliLXB5dGhvbi8yLjUv YnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDQ3OCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Jh c2ljcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDk4 OSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0OSArCiAgbGliLXB5dGhvbi8y LjUvYnNkZGIvdGVzdC90ZXN0X2NvbXBhdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDE5MSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0 X2N1cnNvcl9wZ2V0X2J1Zy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICA2NSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MiArCiAgbGliLXB5dGhv bi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDM1OCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90 ZXN0X2RidGFibGVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDM3OCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Vudl9jbG9zZS5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEwNyArCiAgbGliLXB5 dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVz dC90ZXN0X2pvaW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDEyMCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE0MyArCiAgbGli LXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIv dGVzdC90ZXN0X3BpY2tsZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA3NSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE3MyArCiAg bGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5NSArCiAgbGliLXB5dGhvbi8yLjUvYnNk ZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDExMiArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X3RocmVh ZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUwNiAr CiAgbGliLXB5dGhvbi8yLjUvY1Byb2ZpbGUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE5MCArCiAgbGliLXB5dGhvbi8yLjUv Y2FsZW5kYXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDcwNSArCiAgbGliLXB5dGhvbi8yLjUvY2dpLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTA3 MSArKwogIGxpYi1weXRob24vMi41L2NnaXRiLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMTggKwogIGxpYi1weXRob24v Mi41L2NodW5rLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxNjcgKwogIGxpYi1weXRob24vMi41L2NtZC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0MDUgKwogIGxpYi1weXRob24vMi41L2NvZGUucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRo b24vMi41L2NvZGVjcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDEwMzQgKysKICBsaWItcHl0aG9uLzIuNS9jb2Rlb3AucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMTY4ICsKICBsaWItcHl0aG9uLzIuNS9jb2xvcnN5cy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTI2ICsKICBsaWIt cHl0aG9uLzIuNS9jb21tYW5kcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDg0ICsKICBsaWItcHl0aG9uLzIuNS9jb21waWxl YWxsLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMTU3ICsKICBsaWItcHl0aG9uLzIuNS9jb21waWxlci9fX2luaXRfXy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDI2ICsKICBs aWItcHl0aG9uLzIuNS9jb21waWxlci9hc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMzU2ICsrCiAgbGliLXB5dGhvbi8yLjUvY29t cGlsZXIvY29uc3RzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAyMSArCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvZnV0dXJlLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MyAr CiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvbWlzYy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MyArCiAgbGliLXB5dGhvbi8yLjUv Y29tcGlsZXIvcHlhc3NlbS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDgxOCArCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvcHljb2RlZ2Vu LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTUz MyArKwogIGxpYi1weXRob24vMi41L2NvbXBpbGVyL3N5bWJvbHMucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NjMgKwogIGxpYi1weXRob24v Mi41L2NvbXBpbGVyL3N5bnRheC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNDYgKwogIGxpYi1weXRob24vMi41L2NvbXBpbGVyL3RyYW5z Zm9ybWVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDE0OTAgKysKICBsaWItcHl0aG9uLzIuNS9jb21waWxlci92aXNpdG9yLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTEzICsKICBsaWItcHl0 aG9uLzIuNS9jb250ZXh0bGliLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMTU4ICsKICBsaWItcHl0aG9uLzIuNS9jb29raWVsaWIu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAxNzc2ICsrKwogIGxpYi1weXRob24vMi41L2NvcHkucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MTQgKwogIGxp Yi1weXRob24vMi41L2NvcHlfcmVnLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDAgKwogIGxpYi1weXRob24vMi41L2Nzdi5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0MTggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9fX2luaXRfXy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MzcgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy9fZW5kaWFuLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjAgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy9tYWNob2xpYi9SRUFETUUuY3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDcgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9fX2lu aXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTIg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjkgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgNjYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9m ZXRjaF9tYWNob2xpYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNjggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L19f aW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAyMDIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTcgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNjAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0 L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNjQgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTIgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyMTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90 ZXN0L3Rlc3RfYml0ZmllbGRzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyNDQgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTQgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyODAgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxNTIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzcgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTkgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNDAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZGVs YXR0ci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjEg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTkgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rf ZnVuY3B0ci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx MjcgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTUgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNDIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rl c3RfaW5pdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNDAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDUgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxMDMgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0 L3Rlc3Rfa2VlcHJlZnMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxNTIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzAgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90 ZXN0L3Rlc3RfbWFjaG9saWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNjIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rp b25zLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjEgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNDYgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy90ZXN0L3Rlc3Rfb2JqZWN0cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNzAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1l dGVycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODggKwog IGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzkgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyMDMgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcHl0 aG9uX2FwaS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODcg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzEgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgOTggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rf cmVwci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MjkgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzUgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rl c3Rfc2l6ZXMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMjcgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNzUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0 L3Rlc3Rfc3RyaW5ncy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyMTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxk cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTAgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA0MTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90 ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNDUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTUgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzMgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy91dGlsLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjYgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy93aW50eXBlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxNzIgKwogIGxpYi1weXRob24vMi41L2N1cnNlcy9fX2luaXRfXy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTMg KwogIGxpYi1weXRob24vMi41L2N1cnNlcy9hc2NpaS5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxpYi1weXRob24vMi41 L2N1cnNlcy9oYXNfa2V5LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxOTIgKwogIGxpYi1weXRob24vMi41L2N1cnNlcy9wYW5lbC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDggKwogIGxpYi1weXRob24vMi41L2N1cnNlcy90ZXh0cGFkLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzMgKwogIGxpYi1weXRob24v Mi41L2N1cnNlcy93cmFwcGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24vMi41L2RiaGFzaC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMTYgKwogIGxpYi1weXRob24vMi41L2RlY2ltYWwucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUxNjQgKysrKysrKysrKwog IGxpYi1weXRob24vMi41L2RpZmZsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIwMTkgKysrCiAgbGliLXB5dGhvbi8yLjUv ZGlyY2FjaGUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAzOCArCiAgbGliLXB5dGhvbi8yLjUvZGlzLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIy MyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL1JFQURNRSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiArCiAgbGliLXB5dGhvbi8y LjUvZGlzdHV0aWxzL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAyMyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2FyY2hp dmVfdXRpbC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDE3MyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM5OCArCiAgbGliLXB5dGhv bi8yLjUvZGlzdHV0aWxzL2Njb21waWxlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMTI2OCArKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9j bWQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA0NzggKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzMgKwogIGxpYi1w eXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTAgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGls cy9jb21tYW5kL2JkaXN0X2R1bWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxMzUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21z aS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2MzkgKwogIGxp Yi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1NjQgKwogIGxpYi1weXRob24vMi41L2Rpc3R1 dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMjggKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxk LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzYgKwog IGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzggKwogIGxpYi1weXRob24vMi41L2Rp c3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA3MTcgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1 aWxkX3B5LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0Mzcg KwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzIgKwogIGxpYi1weXRob24vMi41 L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5k L2NvbW1hbmRfdGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NDUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjggKwogIGxpYi1weXRob24v Mi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA2MDcgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21t YW5kL2luc3RhbGxfZGF0YS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgODUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2lu Zm8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzggKwogIGxpYi1weXRo b24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNTMgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9j b21tYW5kL2luc3RhbGxfbGliLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyMjMgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2Ny aXB0cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjYgKwogIGxpYi1w eXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyOTQgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGls cy9jb21tYW5kL3NkaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA0NjUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTkgKwogIGxp Yi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtNi5leGUgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0 aWxzL2NvbW1hbmQvd2luaW5zdC03LjEuZXhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIEJpbiAKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvY29yZS5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjQyICsKICBs aWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDQxICsKICBsaWItcHl0aG9uLzIuNS9kaXN0 dXRpbHMvZGVidWcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgICA5ICsKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvZGVwX3V0aWwucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDk1ICsK ICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvZGlyX3V0aWwucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjI3ICsKICBsaWItcHl0aG9uLzIuNS9k aXN0dXRpbHMvZGlzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxMjIyICsrCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2VteGNjb21w aWxlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMx NSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2Vycm9ycy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5OSArCiAgbGliLXB5dGhvbi8y LjUvZGlzdHV0aWxzL2V4dGVuc2lvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDI0NiArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2ZhbmN5 X2dldG9wdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDUwMiArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI1MyArCiAgbGliLXB5dGhv bi8yLjUvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDM1NSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2xv Zy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICA2OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL21zdmNjb21waWxlci5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDY1MiArCiAgbGliLXB5 dGhvbi8yLjUvZGlzdHV0aWxzL213ZXJrc2NvbXBpbGVyLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDI0OCArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxz L3NwYXduLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDIwMSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUzNSArCiAgbGli LXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzNSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0 aWxzL3Rlc3RzL3N1cHBvcnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA1NCArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVp bGRfcHkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5NiArCiAg bGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MSArCiAgbGliLXB5dGhvbi8yLjUvZGlz dHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDE4OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rf aW5zdGFsbC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1NSAr CiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3OSArCiAgbGliLXB5dGhvbi8yLjUv ZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgOSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3RleHRfZmls ZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM4 MiArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMxNSArCiAgbGliLXB5dGhvbi8y LjUvZGlzdHV0aWxzL3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDUxMyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3ZlcnNp b24ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDI5OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2NCArCiAgbGliLXB5dGhv bi8yLjUvZG9jdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMjY1MyArKysrKwogIGxpYi1weXRob24vMi41L2R1bWJkYm0u cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyMzMgKwogIGxpYi1weXRob24vMi41L2R1bW15X3RocmVhZC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDkgKwogIGxp Yi1weXRob24vMi41L2R1bW15X3RocmVhZGluZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODMgKwogIGxpYi1weXRob24vMi41L2VtYWls L19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMjMgKwogIGxpYi1weXRob24vMi41L2VtYWlsL19wYXJzZWFkZHIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0ODAgKwog IGxpYi1weXRob24vMi41L2VtYWlsL2Jhc2U2NG1pbWUucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODQgKwogIGxpYi1weXRob24vMi41L2Vt YWlsL2NoYXJzZXQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzODggKwogIGxpYi1weXRob24vMi41L2VtYWlsL2VuY29kZXJzLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODgg KwogIGxpYi1weXRob24vMi41L2VtYWlsL2Vycm9ycy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTcgKwogIGxpYi1weXRob24vMi41 L2VtYWlsL2ZlZWRwYXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0ODAgKwogIGxpYi1weXRob24vMi41L2VtYWlsL2dlbmVyYXRvci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz NDggKwogIGxpYi1weXRob24vMi41L2VtYWlsL2hlYWRlci5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MDMgKwogIGxpYi1weXRob24v Mi41L2VtYWlsL2l0ZXJhdG9ycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNzMgKwogIGxpYi1weXRob24vMi41L2VtYWlsL21lc3NhZ2Uu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA3ODYgKwogIGxpYi1weXRob24vMi41L2VtYWlsL21pbWUvX19pbml0X18ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDAgCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAzNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9h dWRpby5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICA3MyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9iYXNlLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNiArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvbWltZS9pbWFnZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICA0NiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWlt ZS9tZXNzYWdlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAzNCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9tdWx0aXBhcnQucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0MSArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv bWltZS90ZXh0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAzMCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvcGFyc2VyLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5MSArCiAg bGliLXB5dGhvbi8yLjUvZW1haWwvcXVvcHJpbWltZS5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMzNiArCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAgMCAKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90ZXN0L2RhdGEvUHlCYW5u ZXIwNDguZ2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgQmluIAog IGxpYi1weXRob24vMi41L2VtYWlsL3Rlc3QvZGF0YS9hdWRpb3Rlc3QuYXUgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9kYXRhL21zZ18wMS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAxOSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18w Mi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEzNSAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wMy50eHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxNiArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvdGVzdC9kYXRhL21zZ18wNC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAzNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21z Z18wNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAy OCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wNi50eHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzMyArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvdGVzdC9kYXRhL21zZ18wNy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA4MyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRh L21zZ18wOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAyNCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wOS50eHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNCArCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xMC50eHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAzMiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9k YXRhL21zZ18xMS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xMi50eHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzNiArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAzOCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVz dC9kYXRhL21zZ18xMy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICA5NCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMyArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNS50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1MiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv dGVzdC9kYXRhL21zZ18xNi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDEyMyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50 eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMiArCiAg bGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNiArCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9kYXRhL21zZ18xOS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICA0MyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18y MC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMCArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvdGVzdC9kYXRhL21zZ18yMi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA0NiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21z Z18yMy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAg OCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNC50eHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDExNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRh L21zZ18yNi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICA0NSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxNSArCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAyNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9k YXRhL21zZ18yOS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAyMiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zMC50eHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMyArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zMS50eHQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAxNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVz dC9kYXRhL21zZ18zMi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAxNCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyOSArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxOSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv dGVzdC9kYXRhL21zZ18zNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAgNCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNi50 eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0MCArCiAg bGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiArCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9kYXRhL21zZ18zOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18z OS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MyAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ180MC50eHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvdGVzdC9kYXRhL21zZ180MS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgOCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21z Z180Mi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAy MCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ180My50eHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxNyArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvdGVzdC9kYXRhL21zZ180NC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAzNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC90ZXN0 X2VtYWlsLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg MzI4NiArKysrKysKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNz LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDc3ICsKICBsaWIt cHl0aG9uLzIuNS9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDc3ICsKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90 ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAzMjg0ICsrKysrKwogIGxpYi1weXRob24vMi41L2VtYWlsL3Rlc3QvdGVzdF9lbWFp bF90b3J0dXJlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzYg KwogIGxpYi1weXRob24vMi41L2VtYWlsL3V0aWxzLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMjMgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxNTQgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9hbGlhc2Vz LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1 MDggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9hc2NpaS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9iaWc1 LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9iaWc1aGtzY3MucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9iejJfY29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9j aGFybWFwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNjkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDAzNy5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9jcDEwMDYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9jcDEwMjYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDExNDAucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTAucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9jcDEyNTEucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTMucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9jcDEyNTQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTUucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTYucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9jcDEyNTcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTgu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDQyNC5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9jcDQzNy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDUw MC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDczNy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9jcDc3NS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA2OTcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9j cDg1MC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1Mi5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9jcDg1NS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9jcDg1Ni5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1Ny5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTQgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2MC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9jcDg2MS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2Mi5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2My5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9jcDg2NC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA2OTAgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2NS5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTgg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2Ni5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9jcDg2OS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA2ODkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg3NC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg3NS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9jcDkzMi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDk0 OS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDk1MC5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9l dWNfamlzeDAyMTMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9ldWNfanAucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9ldWNfa3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9nYjE4MDMwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9nYjIzMTIucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9nYmsucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9oZXhfY29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9ocF9yb21hbjgucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTIgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9oei5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9pZG5hLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyODggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pw LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIy X2pwXzIwMDQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28y MDIyX2tyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzEucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9pc284ODU5XzEwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9p c284ODU5XzExLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzEzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzE0LnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9pc284ODU5XzE1LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzE2LnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzIucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9pc284ODU5XzMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzQucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzUucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9pc284ODU5XzYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5Xzcu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzgucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9pc284ODU5XzkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9qb2hhYi5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9rb2k4X3IucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9rb2k4X3UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9sYXRp bl8xLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNTAgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9t YWNfY3JvYXRpYW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9tYWNfZmFyc2kucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9tYWNfZ3JlZWsucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfbGF0aW4yLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODMgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9tYWNfcm9tYW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4u cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9tYmNzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9wYWxtb3MucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODMg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9wdGNwMTU0LnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzUgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9wdW55Y29kZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAyMzggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9xdW9wcmlf Y29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NzQgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDUgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9yb3RfMTMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9zaGlm dF9qaXMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9z dHJpbmdfZXNjYXBlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMzggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy90aXNfNjIwLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy91bmRlZmluZWQucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy91bmljb2RlX2VzY2FwZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNDUgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFs LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDUgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy91dGZfMTYucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy91dGZfMTZfYmUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZfMTZfbGUucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDIgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZfNy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDEgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy91dGZfOC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZfOF9zaWcu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dV9jb2RlYy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjggKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy96bGliX2NvZGVjLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L2ZpbGVjbXAucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAy OTcgKwogIGxpYi1weXRob24vMi41L2ZpbGVpbnB1dC5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MTMgKwogIGxpYi1weXRob24v Mi41L2ZubWF0Y2gucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMDcgKwogIGxpYi1weXRob24vMi41L2Zvcm1hdHRlci5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0NDcgKwogIGxpYi1weXRob24vMi41L2ZwZm9ybWF0LnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDIgKwogIGxpYi1weXRo b24vMi41L2Z0cGxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA4MjMgKwogIGxpYi1weXRob24vMi41L2Z1bmN0b29scy5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNTEgKwogIGxpYi1weXRob24vMi41L2dldG9wdC5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMTEgKwogIGxpYi1w eXRob24vMi41L2dldHBhc3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjggKwogIGxpYi1weXRob24vMi41L2dldHRleHQu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA1OTEgKwogIGxpYi1weXRob24vMi41L2dsb2IucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzQgKwogIGxp Yi1weXRob24vMi41L2dvcGhlcmxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDkgKwogIGxpYi1weXRob24vMi41L2d6aXAu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0OTAgKwogIGxpYi1weXRob24vMi41L2hhc2hsaWIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzggKwog IGxpYi1weXRob24vMi41L2hlYXBxLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNDMgKwogIGxpYi1weXRob24vMi41L2ht YWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxMjEgKwogIGxpYi1weXRob24vMi41L2hvdHNob3QvX19pbml0X18ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzYg KwogIGxpYi1weXRob24vMi41L2hvdHNob3QvbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTIgKwogIGxpYi1weXRob24vMi41 L2hvdHNob3Qvc3RhdHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgOTMgKwogIGxpYi1weXRob24vMi41L2hvdHNob3Qvc3RvbmVzLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MzEgKwogIGxpYi1weXRob24vMi41L2h0bWxlbnRpdHlkZWZzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNzMgKwogIGxpYi1weXRob24v Mi41L2h0bWxsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA0ODYgKwogIGxpYi1weXRob24vMi41L2h0dHBsaWIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDE0MzIgKysKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0F1dG9Db21wbGV0ZS5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjI2ICsKICBsaWItcHl0 aG9uLzIuNS9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMzkzICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0F1 dG9FeHBhbmQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDgzICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0JpbmRpbmdzLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTExICsKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL0NSRURJVFMudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDM2ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGli L0NhbGxUaXBXaW5kb3cucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMTcxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0NhbGxUaXBzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEyICsKICBs aWItcHl0aG9uLzIuNS9pZGxlbGliL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNTkxICsrKwogIGxpYi1weXRob24vMi41L2lk bGVsaWIvQ2xhc3NCcm93c2VyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyMjEgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvQ29kZUNvbnRleHQu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjcg KwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNjMgKwogIGxpYi1weXRob24vMi41 L2lkbGVsaWIvRGVidWdnZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0ODEgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvRGVsZWdhdG9y LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MzMgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE1MTEgKysKICBsaWItcHl0aG9u LzIuNS9pZGxlbGliL0ZpbGVMaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMTI0ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0Zvcm1h dFBhcmFncmFwaC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMTQ5ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0dyZXBEaWFsb2cucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTMzICsKICBsaWItcHl0 aG9uLzIuNS9pZGxlbGliL0hJU1RPUlkudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMjk2ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0h5 cGVyUGFyc2VyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMjQxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0lPQmluZGluZy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTg0ICsKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL0ljb25zL2ZvbGRlci5naWYgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIv SWNvbnMvaWRsZS5pY25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9JY29ucy9taW51c25vZGUuZ2lm ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJpbiAKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL0ljb25zL29wZW5mb2xkZXIuZ2lmICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIv SWNvbnMvcGx1c25vZGUuZ2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9JY29ucy9weXRob24uZ2lmICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJpbiAKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL0ljb25zL3RrLmdpZiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIv SWRsZUhpc3RvcnkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgODggKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvTXVsdGlDYWxsLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MDYgKwogIGxp Yi1weXRob24vMi41L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzIgKwogIGxpYi1weXRob24vMi41L2lkbGVs aWIvTkVXUy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA3MTAgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTEgKwog IGxpYi1weXRob24vMi41L2lkbGVsaWIvT3V0cHV0V2luZG93LnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTcgKwogIGxpYi1weXRob24vMi41L2lk bGVsaWIvUGFyZW5NYXRjaC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxNzIgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUGF0aEJyb3dzZXIu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTUg KwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUGVyY29sYXRvci5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODUgKwogIGxpYi1weXRob24vMi41 L2lkbGVsaWIvUHlQYXJzZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA1OTQgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUHlTaGVsbC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE0 NDEgKysKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1JFQURNRS50eHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYzICsKICBsaWItcHl0aG9u LzIuNS9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMzgxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1JlbW90 ZU9iamVjdEJyb3dzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDM2ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTY3ICsKICBsaWItcHl0 aG9uLzIuNS9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMjA4ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1Nj cm9sbGVkTGlzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMTM5ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1NlYXJjaERpYWxvZy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDY4ICsKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTQwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGli L1NlYXJjaEVuZ2luZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMjIwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1N0YWNrVmlld2VyLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTM3ICsKICBs aWItcHl0aG9uLzIuNS9pZGxlbGliL1RPRE8udHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEwICsKICBsaWItcHl0aG9uLzIuNS9pZGxl bGliL1Rvb2xUaXAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDg5ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1RyZWVXaWRnZXQucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDc4ICsK ICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMzUyICsKICBsaWItcHl0aG9uLzIuNS9p ZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgIDkyICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1dpbmRvd0xpc3Qu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDkw ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1pvb21IZWlnaHQucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDUwICsKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgICAxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2Fib3V0RGlh bG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MTYzICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZpZy1leHRlbnNpb25zLmRlZiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDg4ICsKICBsaWItcHl0aG9u LzIuNS9pZGxlbGliL2NvbmZpZy1oaWdobGlnaHQuZGVmICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgIDY0ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZp Zy1rZXlzLmRlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMjE0ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZpZy1tYWluLmRlZiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDc5ICsKICBsaWItcHl0 aG9uLzIuNS9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAxMTQ3ICsrCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9j b25maWdIYW5kbGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDcxMyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRp dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2OSArCiAgbGli LXB5dGhvbi8yLjUvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5NyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxp Yi9keW5PcHRpb25NZW51V2lkZ2V0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAzNSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9leHRlbmQudHh0ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MyArCiAg bGliLXB5dGhvbi8yLjUvaWRsZWxpYi9oZWxwLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI4MiArCiAgbGliLXB5dGhvbi8yLjUvaWRs ZWxpYi9pZGxlLmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAgMyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9pZGxlLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMSAr CiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9pZGxlLnB5dyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMSArCiAgbGliLXB5dGhvbi8yLjUv aWRsZWxpYi9pZGxldmVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9rZXliaW5kaW5n RGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI2 OCArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyNSArCiAgbGliLXB5dGhvbi8y LjUvaWRsZWxpYi9ycGMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDYwMiArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9ydW4ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDMzMCArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi90YWJwYWdlLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMyArCiAgbGliLXB5dGhv bi8yLjUvaWRsZWxpYi90ZXN0Y29kZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAzMSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi90ZXh0 Vmlldy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICA3OCArCiAgbGliLXB5dGhvbi8yLjUvaWhvb2tzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUyMCArCiAgbGliLXB5 dGhvbi8yLjUvaW1hcGxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgMTQ5OSArKwogIGxpYi1weXRob24vMi41L2ltZ2hkci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxNjEgKwogIGxpYi1weXRob24vMi41L2ltcHV0aWwucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3MzEgKwogIGxp Yi1weXRob24vMi41L2luc3BlY3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ODggKwogIGxpYi1weXRob24vMi41L2tleXdv cmQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgOTUgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9DYW52YXMucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTAgKwog IGxpYi1weXRob24vMi41L2xpYi10ay9EaWFsb2cucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDkgKwogIGxpYi1weXRob24vMi41L2xp Yi10ay9GaWxlRGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyNzQgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9GaXhUay5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzcg KwogIGxpYi1weXRob24vMi41L2xpYi10ay9TY3JvbGxlZFRleHQucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDYgKwogIGxpYi1weXRob24vMi41 L2xpYi10ay9TaW1wbGVEaWFsb2cucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMTIgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9UaXgucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE4 OTEgKysrCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL1RrY29uc3RhbnRzLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMCArCiAgbGliLXB5dGhv bi8yLjUvbGliLXRrL1RrZG5kLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDMyMSArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL1RraW50 ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgMzc4MyArKysrKysrCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MiArCiAg bGliLXB5dGhvbi8yLjUvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2MCArCiAgbGliLXB5dGhvbi8yLjUvbGli LXRrL3RrRmlsZURpYWxvZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDIxNSArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrRm9udC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxNiAr CiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrTWVzc2FnZUJveC5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyMiArCiAgbGliLXB5dGhvbi8yLjUv bGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDMyMCArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3R1cnRsZS5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDk1 NyArCiAgbGliLXB5dGhvbi8yLjUvbGluZWNhY2hlLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEzNiArCiAgbGliLXB5dGhvbi8y LjUvbG9jYWxlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgMTU2NCArKysKICBsaWItcHl0aG9uLzIuNS9sb2dnaW5nL19faW5p dF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAxMzcyICsrCiAgbGliLXB5dGhvbi8yLjUvbG9nZ2luZy9jb25maWcucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM0OCArCiAgbGliLXB5 dGhvbi8yLjUvbG9nZ2luZy9oYW5kbGVycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgMTAyMyArCiAgbGliLXB5dGhvbi8yLjUvbWFjcGF0aC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDI3NSArCiAgbGliLXB5dGhvbi8yLjUvbWFjdXJsMnBhdGgucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5NyArCiAgbGli LXB5dGhvbi8yLjUvbWFpbGJveC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgMjA5NyArKysrCiAgbGliLXB5dGhvbi8yLjUvbWFp bGNhcC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDI1NSArCiAgbGliLXB5dGhvbi8yLjUvbWFya3VwYmFzZS5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM5MiAr CiAgbGliLXB5dGhvbi8yLjUvbWQ1LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8yLjUv bWhsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMTAwMSArCiAgbGliLXB5dGhvbi8yLjUvbWltZXRvb2xzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0 MSArCiAgbGliLXB5dGhvbi8yLjUvbWltZXR5cGVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUzMyArCiAgbGliLXB5dGhvbi8y LjUvbWltaWZ5LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDQ2NCArCiAgbGliLXB5dGhvbi8yLjUvbW9kdWxlZmluZGVyLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDU5NSArCiAgbGliLXB5dGhvbi8yLjUvbXNpbGliL19faW5pdF9fLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQ2MyArCiAgbGliLXB5dGhv bi8yLjUvbXNpbGliL3NjaGVtYS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMTAwNyArCiAgbGliLXB5dGhvbi8yLjUvbXNpbGliL3NlcXVl bmNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEyNiArCiAgbGliLXB5dGhvbi8yLjUvbXNpbGliL3RleHQucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyOSArCiAgbGliLXB5 dGhvbi8yLjUvbXVsdGlmaWxlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDE1OCArCiAgbGliLXB5dGhvbi8yLjUvbXV0ZXgucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICA1MiArCiAgbGliLXB5dGhvbi8yLjUvbmV0cmMucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMSArCiAgbGli LXB5dGhvbi8yLjUvbmV3LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxNyArCiAgbGliLXB5dGhvbi8yLjUvbm50cGxp Yi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDYyOCArCiAgbGliLXB5dGhvbi8yLjUvbnRwYXRoLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUxMSArCiAg bGliLXB5dGhvbi8yLjUvbnR1cmwycGF0aC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2MyArCiAgbGliLXB5dGhvbi8yLjUvb3Bj b2RlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDE4NSArCiAgbGliLXB5dGhvbi8yLjUvb3B0cGFyc2UucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTY5MSAr KysKICBsaWItcHl0aG9uLzIuNS9vcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNzM2ICsKICBsaWItcHl0aG9uLzIu NS9vczJlbXhwYXRoLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgNDIzICsKICBsaWItcHl0aG9uLzIuNS9wZGIuZG9jICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MTkyICsKICBsaWItcHl0aG9uLzIuNS9wZGIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMjM0ICsrCiAgbGliLXB5dGhv bi8yLjUvcGlja2xlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMTM4MyArKwogIGxpYi1weXRob24vMi41L3BpY2tsZXRvb2xz LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgIDIyNDYgKysrKwogIGxpYi1weXRob24vMi41L3BpcGVzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyOTggKwogIGxp Yi1weXRob24vMi41L3BrZ3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1NDYgKwogIGxpYi1weXRob24vMi41L3BsYXQt YWl4My9JTi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMjYgKwogIGxpYi1weXRob24vMi41L3BsYXQtYWl4My9yZWdlbiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDggKwog IGxpYi1weXRob24vMi41L3BsYXQtYWl4NC9JTi5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjUgKwogIGxpYi1weXRob24vMi41L3Bs YXQtYWl4NC9yZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDggKwogIGxpYi1weXRob24vMi41L3BsYXQtYXRoZW9zL0lOLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5NDQg KwogIGxpYi1weXRob24vMi41L3BsYXQtYXRoZW9zL1RZUEVTLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDIgKwogIGxpYi1weXRob24vMi41 L3BsYXQtYXRoZW9zL3JlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtYmVvczUvSU4ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MjcgKwogIGxpYi1weXRob24vMi41L3BsYXQtYmVvczUvcmVnZW4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDcgKwogIGxpYi1weXRob24v Mi41L3BsYXQtZGFyd2luL0lOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzNTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtZGFyd2luL3Jl Z2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDIvSU4ucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODcgKwogIGxpYi1weXRo b24vMi41L3BsYXQtZnJlZWJzZDIvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJz ZDMvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxODkgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDMvcmVnZW4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDQgKwogIGxpYi1w eXRob24vMi41L3BsYXQtZnJlZWJzZDQvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzNTUgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJl ZWJzZDQvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDUvSU4ucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNTUgKwogIGxp Yi1weXRob24vMi41L3BsYXQtZnJlZWJzZDUvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQt ZnJlZWJzZDYvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA1MTUgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDYvcmVnZW4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwog IGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDcvSU4ucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MzUgKwogIGxpYi1weXRob24vMi41L3Bs YXQtZnJlZWJzZDcvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZ2VuZXJpYy9yZWdlbiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvQUwucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDUvQ0QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMzQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvQ0wucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MjQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvQ0xfb2xkLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzYgKwogIGxpYi1weXRob24v Mi41L3BsYXQtaXJpeDUvREVWSUNFLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA0MDAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvRVJS Tk8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxNDcgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvRklMRS5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzkgKwogIGxpYi1weXRo b24vMi41L3BsYXQtaXJpeDUvRkwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyODkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUv R0VULnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNTkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvR0wucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTMgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDUvR0xXUy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTIgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDUvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxNDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvSU9DVEwucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzMgKwogIGxp Yi1weXRob24vMi41L3BsYXQtaXJpeDUvU1YucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRob24vMi41L3BsYXQt aXJpeDUvV0FJVC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgMTQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvY2RkYi5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDQgKwog IGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvY2RwbGF5ZXIucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODggKwogIGxpYi1weXRob24vMi41L3Bs YXQtaXJpeDUvZmxwLmRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvZmxwLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NTEg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvanBlZy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDUvcGFuZWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAyODEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvcGFuZWxw YXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx MjggKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvcmVhZGNkLmRvYyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1weXRob24v Mi41L3BsYXQtaXJpeDUvcmVhZGNkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyNDQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvcmVn ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMTAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvdG9yZ2IucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxpYi1weXRo b24vMi41L3BsYXQtaXJpeDYvQUwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNjEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYv Q0QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMzQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvQ0wucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjQgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDYvREVWSUNFLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA0MDAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDYvRVJSTk8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxODAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvRklMRS5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NzQgKwogIGxp Yi1weXRob24vMi41L3BsYXQtaXJpeDYvRkwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyODkgKwogIGxpYi1weXRob24vMi41L3BsYXQt aXJpeDYvR0VULnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNTkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvR0wucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTMgKwog IGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvR0xXUy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTIgKwogIGxpYi1weXRob24vMi41L3Bs YXQtaXJpeDYvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzODUgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvSU9DVEwucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzMg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvU1YucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDYvV0FJVC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMzUgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvY2RkYi5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAy MDQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvY2RwbGF5ZXIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODggKwogIGxpYi1weXRob24v Mi41L3BsYXQtaXJpeDYvZmxwLmRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvZmxw LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0NTAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvanBlZy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEgKwogIGxpYi1weXRo b24vMi41L3BsYXQtaXJpeDYvcGFuZWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyODEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYv cGFuZWxwYXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxMjggKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvcmVhZGNkLmRvYyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDYvcmVhZGNkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyNDQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDYvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMTEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvdG9yZ2IucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbGludXgyL0NEUk9NLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDcgKwogIGxpYi1weXRob24vMi41L3BsYXQt bGludXgyL0RMRkNOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgODMgKwogIGxpYi1weXRob24vMi41L3BsYXQtbGludXgyL0lOLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2MTUgKwog IGxpYi1weXRob24vMi41L3BsYXQtbGludXgyL1RZUEVTLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzAgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbGludXgyL3JlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0F1ZGlvX21hYy5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjEg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BRS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9BSC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9B bGlhcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTggKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9BcHAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9BcHBlYXJhbmNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA2NDggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5NjEgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgIDYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0Nh cmJvbi9DRi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DRy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdmVudHMucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA0NTEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9DYXJib25FdnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DbS5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjIgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNTYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Db250cm9s cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NjggKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Db3JlRm91bmRhdGlvbi5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjggKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL0NhcmJvbi9Db3JlR3JhcGhpY3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgMjggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DdGwu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9EaWFsb2dzLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzkgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9EbGcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9E cmFnLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODYgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9FdmVudHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9FdnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA0MjYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0Nh cmJvbi9GbS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Gb2xkZXIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Gb2xkZXJzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9Gb250cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNTkgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9IZWxwLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9JQkNhcmJvbi5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9JQkNhcmJvblJ1bnRpbWUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgIDUgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9JY24ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzODEgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL0NhcmJvbi9MYXVuY2gucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9MYXVu Y2hTZXJ2aWNlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzQg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9MaXN0LnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9MaXN0cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMzUgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9N YWNIZWxwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NTggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NYWNUZXh0RWRpdG9yLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMjYgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgOTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9NZW51LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjkgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL0NhcmJvbi9NbHRlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0Nh cmJvbi9PU0EucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9PU0Fjb25zdC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzMgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RRE9mZnNjcmVlbi5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9RZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RZG9mZnMucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RdC5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDUgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9RdWlja0RyYXcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAyMTggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RdWlja1Rp bWUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDM0NjggKysr KysrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNCArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvQ2FyYm9uL1Jlc291cmNlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAyNyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9u L1NjcmFwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAgMSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1NuZC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1NuZGlob29rcy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2Fy Ym9uL1NvdW5kLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDQwMCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1RleHRFZGl0LnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICA1NyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv Q2FyYm9uL1dpbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1dpbmRvd3MucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI3OSArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvRWFzeURpYWxvZ3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDgzOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvRnJhbWVXb3JrLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTEyMyArKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTggKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL1BpeE1hcFdyYXBwZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyMTQgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FlcGFjay5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjYg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FldG9vbHMucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjAgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL2FldHlwZXMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA1NjggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FwcGxlc2lu Z2xlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx MzcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjMgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL2FwcGxldHJ1bm5lci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FyZ3Zl bXVsYXRvci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgODkgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTUgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL2J1aWxkdG9vbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA0MjAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2J1 bmRsZWJ1aWxkZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA5MzQgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2NmbWZpbGUucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODMgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL2RpYWxvZ3MucnNyYyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv ZXJyb3JzLnJzcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIEJpbiAKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9maW5kZXJ0b29scy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgODMxICsKICBsaWIt cHl0aG9uLzIuNS9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAxMjEzICsrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvaWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDI2OCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvaWNvcGVuLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2NiArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0Nv ZGVXYXJyaW9yX3N1aXRlLnB5ICAgICAgICAgfCAgIDY4MiArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3Vp dGUucHkgICAgfCAgMjM3MyArKysrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5ICAgICAgICAgICAgICAgICAgfCAgICA2 MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJy aW9yL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgfCAgIDQwOCArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5ICAg ICAgICAgICAgICAgICAgfCAgIDE4OSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNj cmlwdHBhY2thZ2VzL0V4cGxvcmVyL01pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlci5weSAgfCAg ICA5NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxv cmVyL05ldHNjYXBlX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgICA0OSArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRl LnB5ICAgICAgICAgICAgICAgfCAgIDEwOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAg fCAgICA3MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4 cGxvcmVyL1VSTF9TdWl0ZS5weSAgICAgICAgICAgICAgICAgICAgfCAgICA1NCArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2Vy X1N1aXRlLnB5ICAgICAgICAgICAgfCAgIDIyNiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAg ICAgfCAgICA4MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2Vz L0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5ICAgICAgICAgfCAgIDI3OSArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlv bnMucHkgICAgICAgICAgICAgICAgICAgfCAgIDE0NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDIxMiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL0ZpbmRlci9GaW5kZXJfQmFzaWNzLnB5ICAgICAgICAgICAgICAgICAgfCAgIDIwNyArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaW5kZXJf aXRlbXMucHkgICAgICAgICAgICAgICAgICAgfCAgIDM1NSArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHkgICAgICAgICAg ICAgICAgICAgfCAgIDIyNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL0ZpbmRlci9TdGFuZGFyZF9TdWl0ZS5weSAgICAgICAgICAgICAgICAgfCAgIDMzNSAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9UeXBl X0RlZmluaXRpb25zLnB5ICAgICAgICAgICAgICAgfCAgIDM0NiArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weSAgICAg ICAgICAgICAgICAgfCAgIDIyOSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL0ZpbmRlci9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIz MyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBl L01vemlsbGFfc3VpdGUucHkgICAgICAgICAgICAgICAgfCAgIDI2OSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1Bvd2VyUGxhbnQucHkgICAg ICAgICAgICAgICAgICAgfCAgICA4NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNj cmlwdHBhY2thZ2VzL05ldHNjYXBlL1JlcXVpcmVkX3N1aXRlLnB5ICAgICAgICAgICAgICAgfCAg IDEwOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNj YXBlL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDI0MyArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9z dWl0ZS5weSAgICAgICAgICAgfCAgICA2MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHkgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEyMiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05l dHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weSAgICAgICAgICAgfCAgIDQyNiArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5 ICAgICAgICAgICAgICAgICAgICAgfCAgIDEwNSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weSAgICAgICAg ICAgfCAgMjIxNSArKysrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL1N0ZFN1aXRlcy9NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMucHkgfCAgIDM3MyArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlj a0RyYXdfR3JhcGhpY3NfU3VpdGUucHkgICAgfCAgIDQxNyArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3Vw cGxlbWUucHkgfCAgICA3MyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL1N0ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weSAgICAgICAgICAgICAgfCAgICAzMiAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9T dGFuZGFyZF9TdWl0ZS5weSAgICAgICAgICAgICAgfCAgIDczOCArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UYWJsZV9TdWl0ZS5weSAgICAg ICAgICAgICAgICAgfCAgIDEwNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5ICAgICAgICAgICAgICAgICAgfCAgIDIy NCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRl cy9UeXBlX05hbWVzX1N1aXRlLnB5ICAgICAgICAgICAgfCAgIDQzNSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weSAgICAg ICAgICAgICAgICAgICAgfCAgIDQ3MSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNj cmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5ICAgfCAg IDM4MSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3Rl bUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weSAgICAgfCAgIDI4NyArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9IaWRkZW5fU3Vp dGUucHkgICAgICAgICAgICAgfCAgICA1MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weSAgICAgICAg fCAgICA3NCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5 c3RlbUV2ZW50cy9Qb3dlcl9TdWl0ZS5weSAgICAgICAgICAgICAgfCAgIDE0OSArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNz ZXNfU3VpdGUucHkgICAgICAgICAgfCAgIDIxNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weSAgICAgICAg ICAgfCAgIDU4MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2Vz L1N5c3RlbUV2ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5ICAgICAgfCAgIDEwOSArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9UZXh0 X1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDE5NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9fX2luaXRfXy5weSAgICAgICAgICAg ICAgICAgfCAgIDE0MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL1Rlcm1pbmFsL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDU4MiArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1Rlcm1p bmFsX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDI1NCArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHkgICAgICAgICAg ICAgICAgICAgfCAgIDE5NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL1Rlcm1pbmFsL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgfCAgICA4OSAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3Vp dGVzL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgfCAgICAyNyArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUu cHkgICAgICAgICAgfCAgIDE0MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbWFjZXJyb3Jz LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTg1 MyArKysKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9tYWNmcy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTk4ICsKICBsaWItcHl0aG9u LzIuNS9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMTQyICsKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9tYWNy ZXNvdXJjZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMTQ2ICsKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9waW1wLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMTc3ICsrCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvcGxpc3RsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDQ3MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv dGVybWluYWxjb21tYW5kLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICA0NyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5MSArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1uZXRic2QxL0lOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1u ZXRic2QxL3JlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAgMyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1uZXh0My9yZWdlbiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNiArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1vczJlbXgvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MiArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1vczJlbXgvU09DS0VULnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEwNiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1vczJlbXgvX2VteF9saW5r LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3OSAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1vczJlbXgvZ3JwLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE4MiArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1vczJlbXgvcHdkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDIwOCArCiAgbGl From Mailer-Daemon at python.org Mon Mar 19 20:34:56 2012 From: Mailer-Daemon at python.org (Mail Delivery System) Date: Mon, 19 Mar 2012 20:34:56 +0100 Subject: [Jython-checkins] Mail delivery failed: returning message to sender Message-ID: This message was created automatically by mail delivery software. A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed: jython-checkins at python.org SMTP error from remote mail server after MAIL FROM: SIZE=26467571: host mail.python.org [2001:888:2000:d::a6]: 552-5.3.4 Message size exceeds fixed limit 552 5.3.4 Contact postmaster at python.org for assistance. Please provide the following information in your problem report: time (Mar 19 20:34:56) and client (2001:888:2000:d::a4). ------ This is a copy of the message, including all the headers. ------ ------ The body of the message is 26126645 characters long; only the first ------ 106496 or so are included here. Return-path: Received: from localhost ([127.0.0.1] helo=dinsdale.python.org ident=hg) by dinsdale.python.org with esmtp (Exim 4.72) (envelope-from ) id 1S9iM2-0000yy-Bj for jython-checkins at python.org; Mon, 19 Mar 2012 20:34:56 +0100 Date: Mon, 19 Mar 2012 20:34:55 +0100 Message-Id: Content-Type: multipart/mixed; boundary="===============1328490991==" MIME-Version: 1.0 Subject: =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29=3A_Merge_with_2=2E5=2E?= To: jython-checkins at python.org From: frank.wierzbicki --===============1328490991== Content-Type: text/plain; charset="utf8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 aHR0cDovL2hnLnB5dGhvbi5vcmcvanl0aG9uL3Jldi9mZDFhM2FmNjgzOGMKY2hhbmdlc2V0OiAg IDY0MTU6ZmQxYTNhZjY4MzhjCnBhcmVudDogICAgICA2NDExOjc4MmEzMjkyMmY1NgpwYXJlbnQ6 ICAgICAgNjQxNDpmMzUxY2UyM2QwMTQKdXNlcjogICAgICAgIEZyYW5rIFdpZXJ6Ymlja2kgPGZ3 aWVyemJpY2tpQGdtYWlsLmNvbT4KZGF0ZTogICAgICAgIE1vbiBNYXIgMTkgMTE6MTg6MDYgMjAx MiAtMDcwMApzdW1tYXJ5OgogIE1lcmdlIHdpdGggMi41LgoKZmlsZXM6CiAgLmhnc3ViICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAgMSAtCiAgLmhnc3Vic3RhdGUgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAgMSAtCiAgYnVpbGQueG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNCArLQogIGxpYi1weXRo b24vMi41L0Jhc2VIVFRQU2VydmVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA1NzggKwogIGxpYi1weXRob24vMi41L0Jhc3Rpb24ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxNzcgKwogIGxpYi1weXRob24vMi41L0NHSUhUVFBTZXJ2ZXIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjIgKwogIGxpYi1w eXRob24vMi41L0NvbmZpZ1BhcnNlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA2NDAgKwogIGxpYi1weXRob24vMi41L0Nvb2tpZS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA3NDYgKwogIGxpYi1weXRob24vMi41L0RvY1hNTFJQQ1NlcnZlci5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDYgKwogIGxp Yi1weXRob24vMi41L0hUTUxQYXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjkgKwogIGxpYi1weXRob24vMi41L01pbWVX cml0ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxODEgKwogIGxpYi1weXRob24vMi41L1F1ZXVlLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMTUgKwog IGxpYi1weXRob24vMi41L1NpbXBsZUhUVFBTZXJ2ZXIucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMjAgKwogIGxpYi1weXRob24vMi41L1Np bXBsZVhNTFJQQ1NlcnZlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA1OTUgKwogIGxpYi1weXRob24vMi41L1NvY2tldFNlcnZlci5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1ODgg KwogIGxpYi1weXRob24vMi41L1N0cmluZ0lPLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMjMgKwogIGxpYi1weXRob24vMi41 L1VzZXJEaWN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxNzUgKwogIGxpYi1weXRob24vMi41L1VzZXJMaXN0LnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ODUgKwogIGxpYi1weXRob24vMi41L1VzZXJTdHJpbmcucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTQgKwogIGxpYi1weXRob24v Mi41L19MV1BDb29raWVKYXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxNzAgKwogIGxpYi1weXRob24vMi41L19Nb3ppbGxhQ29va2ll SmFyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxNDkgKwogIGxpYi1weXRob24vMi41L19fZnV0dXJlX18ucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTYgKwogIGxpYi1weXRo b24vMi41L19fcGhlbGxvX18uZm9vLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L19zdHJwdGltZS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA0NTEgKwogIGxpYi1weXRob24vMi41L190aHJlYWRpbmdfbG9jYWwucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNDEgKwogIGxpYi1w eXRob24vMi41L2FpZmMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA5NjEgKwogIGxpYi1weXRob24vMi41L2FueWRibS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgODMgKwogIGxpYi1weXRob24vMi41L2FzeW5jaGF0LnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyOTUgKwogIGxp Yi1weXRob24vMi41L2FzeW5jb3JlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1NTEgKwogIGxpYi1weXRob24vMi41L2F0ZXhp dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNjIgKwogIGxpYi1weXRob24vMi41L2F1ZGlvZGV2LnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNTcgKwog IGxpYi1weXRob24vMi41L2Jhc2U2NC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNTkgKwogIGxpYi1weXRob24vMi41L2Jk Yi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA2MTMgKwogIGxpYi1weXRob24vMi41L2JpbmhleC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1Mjcg KwogIGxpYi1weXRob24vMi41L2Jpc2VjdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODQgKwogIGxpYi1weXRob24vMi41 L2JzZGRiL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0MDEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2RiLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NTEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2Rib2JqLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNTQgKwogIGxpYi1weXRob24v Mi41L2JzZGRiL2RicmVjaW8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxOTAgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2Ric2hlbHZl LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMDEgKwogIGxpYi1weXRob24vMi41L2JzZGRiL2RidGFibGVzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3MDYgKwogIGxpYi1weXRo b24vMi41L2JzZGRiL2RidXRpbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNzcgKwogIGxpYi1weXRob24vMi41L2JzZGRiL3Rlc3Qv X19pbml0X18ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDAgCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0XzE0MTMxOTIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0NyArCiAgbGliLXB5 dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2FsbC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICA5MSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVz dC90ZXN0X2Fzc29jaWF0ZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDQ3OCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDk4OSArCiAgbGli LXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0OSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIv dGVzdC90ZXN0X2NvbXBhdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDE5MSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9w Z2V0X2J1Zy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2NSArCiAg bGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MiArCiAgbGliLXB5dGhvbi8yLjUvYnNk ZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDM1OCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2RidGFi bGVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM3OCAr CiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2Vudl9jbG9zZS5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEwNyArCiAgbGliLXB5dGhvbi8yLjUv YnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2pv aW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEy MCArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE0MyArCiAgbGliLXB5dGhvbi8y LjUvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0 X3BpY2tsZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICA3NSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE3MyArCiAgbGliLXB5dGhv bi8yLjUvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDI5NSArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90 ZXN0X3NlcXVlbmNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDExMiArCiAgbGliLXB5dGhvbi8yLjUvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUwNiArCiAgbGliLXB5 dGhvbi8yLjUvY1Byb2ZpbGUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDE5MCArCiAgbGliLXB5dGhvbi8yLjUvY2FsZW5kYXIu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDcwNSArCiAgbGliLXB5dGhvbi8yLjUvY2dpLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTA3MSArKwogIGxp Yi1weXRob24vMi41L2NnaXRiLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMTggKwogIGxpYi1weXRob24vMi41L2NodW5r LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxNjcgKwogIGxpYi1weXRob24vMi41L2NtZC5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MDUgKwog IGxpYi1weXRob24vMi41L2NvZGUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2Nv ZGVjcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDEwMzQgKysKICBsaWItcHl0aG9uLzIuNS9jb2Rlb3AucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTY4 ICsKICBsaWItcHl0aG9uLzIuNS9jb2xvcnN5cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTI2ICsKICBsaWItcHl0aG9uLzIu NS9jb21tYW5kcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDg0ICsKICBsaWItcHl0aG9uLzIuNS9jb21waWxlYWxsLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MTU3ICsKICBsaWItcHl0aG9uLzIuNS9jb21waWxlci9fX2luaXRfXy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDI2ICsKICBsaWItcHl0aG9u LzIuNS9jb21waWxlci9hc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAxMzU2ICsrCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvY29u c3RzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAyMSArCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvZnV0dXJlLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MyArCiAgbGliLXB5 dGhvbi8yLjUvY29tcGlsZXIvbWlzYy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICA3MyArCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIv cHlhc3NlbS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDgxOCArCiAgbGliLXB5dGhvbi8yLjUvY29tcGlsZXIvcHljb2RlZ2VuLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTUzMyArKwogIGxp Yi1weXRob24vMi41L2NvbXBpbGVyL3N5bWJvbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NjMgKwogIGxpYi1weXRob24vMi41L2NvbXBp bGVyL3N5bnRheC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNDYgKwogIGxpYi1weXRob24vMi41L2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE0OTAgKysK ICBsaWItcHl0aG9uLzIuNS9jb21waWxlci92aXNpdG9yLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTEzICsKICBsaWItcHl0aG9uLzIuNS9j b250ZXh0bGliLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMTU4ICsKICBsaWItcHl0aG9uLzIuNS9jb29raWVsaWIucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNzc2 ICsrKwogIGxpYi1weXRob24vMi41L2NvcHkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MTQgKwogIGxpYi1weXRob24v Mi41L2NvcHlfcmVnLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyMDAgKwogIGxpYi1weXRob24vMi41L2Nzdi5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0MTggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9fX2luaXRfXy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MzcgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy9fZW5kaWFuLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNjAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNo b2xpYi9SRUFETUUuY3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDcgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTIgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjkgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9t YWNob2xpYi9keWxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgNjYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNo b2xpYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDIgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy9tYWNob2xpYi9mcmFtZXdvcmsucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNjggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L19faW5pdF9fLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDIgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTcgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNjAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYXJy YXlfaW5fcG9pbnRlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjQg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTIgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAyMTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rf Yml0ZmllbGRzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAy NDQgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTQgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyODAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rl c3RfY2FsbGJhY2tzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxNTIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzcgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxOTkgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0 L3Rlc3RfY2hlY2tyZXR2YWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNDAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjEgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTkgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90 ZXN0L3Rlc3RfZmluZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjcgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTUgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNDIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDAgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDUgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxMDMgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfa2Vl cHJlZnMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTIg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzAgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMDYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rf bWFjaG9saWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NjIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjEgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyNDYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rl c3Rfb2JqZWN0cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNzAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODggKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNzkgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0 L3Rlc3RfcHJvdG90eXBlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyMDMgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODcgKwogIGxpYi1w eXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzEgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90 ZXN0L3Rlc3RfcmVmY291bnRzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgOTggKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjkgKwogIGxp Yi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzUgKwogIGxpYi1weXRob24vMi41L2N0eXBl cy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjcgKwog IGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRob24vMi41L2N0 eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNzUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc3Ry aW5ncy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMTUg KwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24vMi41 L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0MTUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rf dW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NDUgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTUgKwogIGxpYi1weXRob24v Mi41L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rl c3RfdmFyc2l6ZV9zdHJ1Y3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNTAgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzMgKwogIGxpYi1weXRo b24vMi41L2N0eXBlcy91dGlsLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNjYgKwogIGxpYi1weXRob24vMi41L2N0eXBlcy93aW50 eXBlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxNzIgKwogIGxpYi1weXRob24vMi41L2N1cnNlcy9fX2luaXRfXy5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTMgKwogIGxpYi1w eXRob24vMi41L2N1cnNlcy9hc2NpaS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxpYi1weXRob24vMi41L2N1cnNlcy9o YXNfa2V5LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxOTIgKwogIGxpYi1weXRob24vMi41L2N1cnNlcy9wYW5lbC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDggKwogIGxp Yi1weXRob24vMi41L2N1cnNlcy90ZXh0cGFkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzMgKwogIGxpYi1weXRob24vMi41L2N1cnNl cy93cmFwcGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24vMi41L2RiaGFzaC5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTYgKwog IGxpYi1weXRob24vMi41L2RlY2ltYWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUxNjQgKysrKysrKysrKwogIGxpYi1weXRo b24vMi41L2RpZmZsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDIwMTkgKysrCiAgbGliLXB5dGhvbi8yLjUvZGlyY2FjaGUu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAzOCArCiAgbGliLXB5dGhvbi8yLjUvZGlzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIyMyArCiAgbGli LXB5dGhvbi8yLjUvZGlzdHV0aWxzL1JFQURNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0 aWxzL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAyMyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE3MyArCiAg bGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM5OCArCiAgbGliLXB5dGhvbi8yLjUvZGlz dHV0aWxzL2Njb21waWxlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTI2OCArKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jbWQucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0Nzgg KwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzMgKwogIGxpYi1weXRob24vMi41 L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxNTAgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5k L2JkaXN0X2R1bWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx MzUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2MzkgKwogIGxpYi1weXRob24v Mi41L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA1NjQgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21t YW5kL2JkaXN0X3dpbmluc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMjggKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzYgKwogIGxpYi1weXRo b24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyMzggKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9j b21tYW5kL2J1aWxkX2V4dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA3MTcgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3B5LnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MzcgKwogIGxpYi1w eXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzIgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGls cy9jb21tYW5kL2NsZWFuLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgODIgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2NvbW1hbmRf dGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDUgKwogIGxp Yi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjggKwogIGxpYi1weXRob24vMi41L2Rpc3R1 dGlscy9jb21tYW5kL2luc3RhbGwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2MDcgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3Rh bGxfZGF0YS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODUgKwog IGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzggKwogIGxpYi1weXRob24vMi41L2Rp c3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNTMgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2lu c3RhbGxfbGliLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMjMg KwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjYgKwogIGxpYi1weXRob24vMi41 L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAyOTQgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5k L3NkaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0 NjUgKwogIGxpYi1weXRob24vMi41L2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTkgKwogIGxpYi1weXRob24v Mi41L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtNi5leGUgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2NvbW1h bmQvd2luaW5zdC03LjEuZXhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IEJpbiAKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvY29yZS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjQyICsKICBsaWItcHl0aG9u LzIuNS9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgNDQxICsKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvZGVi dWcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgICA5ICsKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMvZGVwX3V0aWwucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDk1ICsKICBsaWItcHl0 aG9uLzIuNS9kaXN0dXRpbHMvZGlyX3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMjI3ICsKICBsaWItcHl0aG9uLzIuNS9kaXN0dXRpbHMv ZGlzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAxMjIyICsrCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2VteGNjb21waWxlci5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMxNSArCiAgbGli LXB5dGhvbi8yLjUvZGlzdHV0aWxzL2Vycm9ycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0 aWxzL2V4dGVuc2lvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDI0NiArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2ZhbmN5X2dldG9wdC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUwMiArCiAg bGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI1MyArCiAgbGliLXB5dGhvbi8yLjUvZGlz dHV0aWxzL2ZpbGVsaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDM1NSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL2xvZy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2OSAr CiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL21zdmNjb21waWxlci5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDY1MiArCiAgbGliLXB5dGhvbi8yLjUv ZGlzdHV0aWxzL213ZXJrc2NvbXBpbGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDI0OCArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3NwYXduLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIw MSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUzNSArCiAgbGliLXB5dGhvbi8y LjUvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAzNSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3Rz L3N1cHBvcnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICA1NCArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5NiArCiAgbGliLXB5dGhv bi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICA4MSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rl c3RzL3Rlc3RfZGlzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDE4OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1NSArCiAgbGliLXB5 dGhvbi8yLjUvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICA3OSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxz L3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAgOSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3RleHRfZmlsZS5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM4MiArCiAgbGli LXB5dGhvbi8yLjUvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMxNSArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0 aWxzL3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDUxMyArCiAgbGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3ZlcnNpb24ucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5OSArCiAg bGliLXB5dGhvbi8yLjUvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2NCArCiAgbGliLXB5dGhvbi8yLjUvZG9j dGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMjY1MyArKysrKwogIGxpYi1weXRob24vMi41L2R1bWJkYm0ucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAy MzMgKwogIGxpYi1weXRob24vMi41L2R1bW15X3RocmVhZC5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDkgKwogIGxpYi1weXRob24v Mi41L2R1bW15X3RocmVhZGluZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgODMgKwogIGxpYi1weXRob24vMi41L2VtYWlsL19faW5pdF9f LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxMjMgKwogIGxpYi1weXRob24vMi41L2VtYWlsL19wYXJzZWFkZHIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0ODAgKwogIGxpYi1weXRo b24vMi41L2VtYWlsL2Jhc2U2NG1pbWUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxODQgKwogIGxpYi1weXRob24vMi41L2VtYWlsL2NoYXJz ZXQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzODggKwogIGxpYi1weXRob24vMi41L2VtYWlsL2VuY29kZXJzLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODggKwogIGxpYi1w eXRob24vMi41L2VtYWlsL2Vycm9ycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTcgKwogIGxpYi1weXRob24vMi41L2VtYWlsL2Zl ZWRwYXJzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA0ODAgKwogIGxpYi1weXRob24vMi41L2VtYWlsL2dlbmVyYXRvci5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNDggKwogIGxp Yi1weXRob24vMi41L2VtYWlsL2hlYWRlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MDMgKwogIGxpYi1weXRob24vMi41L2VtYWls L2l0ZXJhdG9ycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNzMgKwogIGxpYi1weXRob24vMi41L2VtYWlsL21lc3NhZ2UucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3ODYgKwog IGxpYi1weXRob24vMi41L2VtYWlsL21pbWUvX19pbml0X18ucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDAgCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvbWltZS9hcHBsaWNhdGlvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAzNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9hdWRpby5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MyAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9iYXNlLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNiArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvbWltZS9pbWFnZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA0NiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9tZXNzYWdl LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAz NCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS9tdWx0aXBhcnQucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0MSArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAyNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvbWltZS90ZXh0 LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAzMCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvcGFyc2VyLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5MSArCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvcXVvcHJpbWltZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDMzNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9f X2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgMCAKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90ZXN0L2RhdGEvUHlCYW5uZXIwNDguZ2lm ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRo b24vMi41L2VtYWlsL3Rlc3QvZGF0YS9hdWRpb3Rlc3QuYXUgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9k YXRhL21zZ18wMS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAxOSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wMi50eHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEzNSArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wMy50eHQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAxNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVz dC9kYXRhL21zZ18wNC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAzNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wNS50eHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyOCArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wNi50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzMyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv dGVzdC9kYXRhL21zZ18wNy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA4MyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wOC50 eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNCArCiAg bGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18wOS50eHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyNCArCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9kYXRhL21zZ18xMC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAzMiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18x MS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNyAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xMi50eHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzNiArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAzOCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21z Z18xMy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5 NCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMyArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA1MiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRh L21zZ18xNi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDEyMyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50eHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMiArCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgNiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9k YXRhL21zZ18xOS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICA0MyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yMC50eHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAyMCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVz dC9kYXRhL21zZ18yMi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICA0NiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yMy50eHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgOCArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNC50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv dGVzdC9kYXRhL21zZ18yNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDExNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNi50 eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0NSArCiAg bGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxNSArCiAgbGliLXB5dGhvbi8yLjUvZW1h aWwvdGVzdC9kYXRhL21zZ18yOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAyNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18y OS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMiAr CiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zMC50eHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMyArCiAgbGliLXB5dGhvbi8yLjUv ZW1haWwvdGVzdC9kYXRhL21zZ18zMS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAxNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21z Z18zMi50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAx NCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyOSArCiAgbGliLXB5dGhvbi8y LjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAxOSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRh L21zZ18zNS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAgNCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNi50eHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0MCArCiAgbGliLXB5dGhv bi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAyMiArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9k YXRhL21zZ18zOC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEwMSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ18zOS50eHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MyArCiAgbGliLXB5 dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ180MC50eHQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVz dC9kYXRhL21zZ180MS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAgOCArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ180Mi50eHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMCArCiAgbGli LXB5dGhvbi8yLjUvZW1haWwvdGVzdC9kYXRhL21zZ180My50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxNyArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwv dGVzdC9kYXRhL21zZ180NC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAzNSArCiAgbGliLXB5dGhvbi8yLjUvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMzI4NiArKysr KysKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDc3ICsKICBsaWItcHl0aG9uLzIu NS9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDc3ICsKICBsaWItcHl0aG9uLzIuNS9lbWFpbC90ZXN0L3Rlc3Rf ZW1haWxfcmVuYW1lZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAz Mjg0ICsrKysrKwogIGxpYi1weXRob24vMi41L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJl LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzYgKwogIGxpYi1w eXRob24vMi41L2VtYWlsL3V0aWxzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMjMgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxNTQgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9hbGlhc2VzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MDggKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9hc2NpaS5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTAgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9iYXNlNjRfY29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgNzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9iaWc1LnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9iaWc1aGtzY3MucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9iejJfY29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jaGFybWFwLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjkg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDAzNy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9jcDEwMDYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEwMjYu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDExNDAucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9jcDEyNTAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEy NTEucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9jcDEyNTMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9j cDEyNTQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTUucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9jcDEyNTYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9jcDEyNTcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDEyNTgucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9jcDQyNC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9jcDQzNy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDUwMC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDczNy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9jcDc3NS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA2OTcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1MC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTgg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1Mi5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9jcDg1NS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1Ni5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg1Ny5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTQgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9jcDg2MC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2 MS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2Mi5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9jcDg2My5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9j cDg2NC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICA2OTAgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg2NS5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9jcDg2Ni5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9jcDg2OS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA2ODkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDg3NC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9jcDg3NS5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9jcDkzMi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDk0OS5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9jcDk1MC5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9ldWNfamlzXzIwMDQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9ldWNfamlzeDAy MTMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9ldWNfanAucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9ldWNfa3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9nYjE4MDMw LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9nYjIzMTIucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9nYmsucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9oZXhf Y29kZWMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9ocF9yb21hbjgucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTIgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9oei5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9p ZG5hLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyODggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9pc28yMDIyX2pwXzIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9pc28yMDIyX2pwX2V4dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc28yMDIyX2tyLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzEucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9pc284ODU5XzEwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzEx LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzEzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9pc284ODU5XzE0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5 XzE1LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzE2LnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9pc284ODU5XzIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284 ODU5XzMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzQucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9pc284ODU5XzUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9p c284ODU5XzYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzcucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9pc284ODU5XzgucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9pc284ODU5XzkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9qb2hhYi5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9rb2k4X3IucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9rb2k4X3UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9sYXRpbl8xLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTAgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2OTggKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9tYWNfY2VudGV1cm8ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfY3JvYXRp YW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy9tYWNfZmFyc2kucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfZ3Jl ZWsucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAz MDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy9tYWNfbGF0aW4yLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxODMgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNf cm9tYW4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9t YmNzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNDcgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9wYWxtb3MucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODMgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy9wdGNwMTU0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxNzUgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy9wdW55Y29kZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyMzggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzQgKwogIGxp Yi1weXRob24vMi41L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDUgKwogIGxpYi1weXRob24vMi41L2VuY29k aW5ncy9yb3RfMTMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMTggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9zaGlmdF9qaXMucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwog IGxpYi1weXRob24vMi41L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2Vu Y29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgMzkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy9zdHJpbmdfZXNj YXBlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzgg KwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy90aXNfNjIwLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMDcgKwogIGxpYi1weXRob24vMi41 L2VuY29kaW5ncy91bmRlZmluZWQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgNDkgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91bmljb2Rl X2VzY2FwZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NDUgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDUgKwogIGxpYi1weXRob24v Mi41L2VuY29kaW5ncy91dGZfMTYucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZf MTZfYmUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZfMTZfbGUucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDIgKwogIGxpYi1weXRo b24vMi41L2VuY29kaW5ncy91dGZfNy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNDEgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91 dGZfOC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNDIgKwogIGxpYi1weXRob24vMi41L2VuY29kaW5ncy91dGZfOF9zaWcucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEgKwogIGxpYi1w eXRob24vMi41L2VuY29kaW5ncy91dV9jb2RlYy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjggKwogIGxpYi1weXRob24vMi41L2VuY29kaW5n cy96bGliX2NvZGVjLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L2ZpbGVjbXAucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyOTcgKwogIGxp Yi1weXRob24vMi41L2ZpbGVpbnB1dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MTMgKwogIGxpYi1weXRob24vMi41L2ZubWF0 Y2gucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMDcgKwogIGxpYi1weXRob24vMi41L2Zvcm1hdHRlci5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NDcgKwog IGxpYi1weXRob24vMi41L2ZwZm9ybWF0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDIgKwogIGxpYi1weXRob24vMi41L2Z0 cGxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA4MjMgKwogIGxpYi1weXRob24vMi41L2Z1bmN0b29scy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTEg KwogIGxpYi1weXRob24vMi41L2dldG9wdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMTEgKwogIGxpYi1weXRob24vMi41 L2dldHBhc3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMjggKwogIGxpYi1weXRob24vMi41L2dldHRleHQucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1 OTEgKwogIGxpYi1weXRob24vMi41L2dsb2IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzQgKwogIGxpYi1weXRob24v Mi41L2dvcGhlcmxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyMDkgKwogIGxpYi1weXRob24vMi41L2d6aXAucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0OTAgKwogIGxpYi1weXRob24vMi41L2hhc2hsaWIucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzggKwogIGxpYi1weXRo b24vMi41L2hlYXBxLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzNDMgKwogIGxpYi1weXRob24vMi41L2htYWMucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxMjEgKwogIGxpYi1weXRob24vMi41L2hvdHNob3QvX19pbml0X18ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzYgKwogIGxpYi1w eXRob24vMi41L2hvdHNob3QvbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTIgKwogIGxpYi1weXRob24vMi41L2hvdHNob3Qv c3RhdHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgOTMgKwogIGxpYi1weXRob24vMi41L2hvdHNob3Qvc3RvbmVzLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzEgKwogIGxp Yi1weXRob24vMi41L2h0bWxlbnRpdHlkZWZzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyNzMgKwogIGxpYi1weXRob24vMi41L2h0bWxs aWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0ODYgKwogIGxpYi1weXRob24vMi41L2h0dHBsaWIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE0MzIgKysK ICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0F1dG9Db21wbGV0ZS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjI2ICsKICBsaWItcHl0aG9uLzIuNS9p ZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMzkzICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0F1dG9FeHBhbmQu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDgz ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0JpbmRpbmdzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTExICsKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL0NSRURJVFMudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDM2ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0NhbGxUaXBX aW5kb3cucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MTcxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0NhbGxUaXBzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEyICsKICBsaWItcHl0aG9u LzIuNS9pZGxlbGliL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAxNTkxICsrKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvQ2xh c3NCcm93c2VyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyMjEgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvQ29kZUNvbnRleHQucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjcgKwogIGxpYi1w eXRob24vMi41L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyNjMgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIv RGVidWdnZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA0ODEgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvRGVsZWdhdG9yLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzMgKwogIGxp Yi1weXRob24vMi41L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE1MTEgKysKICBsaWItcHl0aG9uLzIuNS9pZGxl bGliL0ZpbGVMaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgMTI0ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0Zvcm1hdFBhcmFncmFw aC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTQ5ICsK ICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0dyZXBEaWFsb2cucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTMzICsKICBsaWItcHl0aG9uLzIuNS9p ZGxlbGliL0hJU1RPUlkudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMjk2ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0h5cGVyUGFyc2Vy LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjQx ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL0lPQmluZGluZy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTg0ICsKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL0ljb25zL2ZvbGRlci5naWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIvSWNvbnMvaWRs ZS5pY25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBC aW4gCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9JY29ucy9taW51c25vZGUuZ2lmICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJpbiAKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL0ljb25zL29wZW5mb2xkZXIuZ2lmICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIvSWNvbnMvcGx1 c25vZGUuZ2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBC aW4gCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9JY29ucy9weXRob24uZ2lmICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJpbiAKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL0ljb25zL3RrLmdpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgQmluIAogIGxpYi1weXRob24vMi41L2lkbGVsaWIvSWRsZUhpc3Rv cnkucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ODggKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvTXVsdGlDYWxsLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MDYgKwogIGxpYi1weXRob24v Mi41L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMzIgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvTkVXUy50 eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA3MTAgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNTEgKwogIGxpYi1weXRo b24vMi41L2lkbGVsaWIvT3V0cHV0V2luZG93LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNTcgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUGFy ZW5NYXRjaC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxNzIgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUGF0aEJyb3dzZXIucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTUgKwogIGxpYi1w eXRob24vMi41L2lkbGVsaWIvUGVyY29sYXRvci5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgODUgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIv UHlQYXJzZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA1OTQgKwogIGxpYi1weXRob24vMi41L2lkbGVsaWIvUHlTaGVsbC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE0NDEgKysKICBs aWItcHl0aG9uLzIuNS9pZGxlbGliL1JFQURNRS50eHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYzICsKICBsaWItcHl0aG9uLzIuNS9pZGxl bGliL1JlbW90ZURlYnVnZ2VyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgMzgxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1JlbW90ZU9iamVjdEJy b3dzZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDM2ICsK ICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTY3ICsKICBsaWItcHl0aG9uLzIuNS9p ZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMjA4ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1Njcm9sbGVkTGlz dC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTM5 ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1NlYXJjaERpYWxvZy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDY4ICsKICBsaWItcHl0aG9uLzIu NS9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgMTQwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1NlYXJjaEVu Z2luZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MjIwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1N0YWNrVmlld2VyLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTM3ICsKICBsaWItcHl0aG9u LzIuNS9pZGxlbGliL1RPRE8udHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMjEwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1Rvb2xU aXAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDg5ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1RyZWVXaWRnZXQucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDc4ICsKICBsaWItcHl0 aG9uLzIuNS9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgMzUyICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1dp ZGdldFJlZGlyZWN0b3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDkyICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL1dpbmRvd0xpc3QucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDkwICsKICBsaWIt cHl0aG9uLzIuNS9pZGxlbGliL1pvb21IZWlnaHQucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDUwICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGli L19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgICAxICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2Fib3V0RGlhbG9nLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTYzICsKICBs aWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZpZy1leHRlbnNpb25zLmRlZiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDg4ICsKICBsaWItcHl0aG9uLzIuNS9pZGxl bGliL2NvbmZpZy1oaWdobGlnaHQuZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDY0ICsKICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZpZy1rZXlzLmRl ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjE0ICsK ICBsaWItcHl0aG9uLzIuNS9pZGxlbGliL2NvbmZpZy1tYWluLmRlZiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDc5ICsKICBsaWItcHl0aG9uLzIuNS9p ZGxlbGliL2NvbmZpZ0RpYWxvZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxMTQ3ICsrCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9jb25maWdIYW5k bGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDcx MyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2OSArCiAgbGliLXB5dGhvbi8y LjUvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA5NyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9keW5PcHRp b25NZW51V2lkZ2V0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAzNSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9leHRlbmQudHh0ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4MyArCiAgbGliLXB5dGhv bi8yLjUvaWRsZWxpYi9oZWxwLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDI4MiArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9pZGxl LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgMyArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9pZGxlLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyMSArCiAgbGliLXB5 dGhvbi8yLjUvaWRsZWxpYi9pZGxlLnB5dyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAyMSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9p ZGxldmVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI2OCArCiAgbGli LXB5dGhvbi8yLjUvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyNSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxp Yi9ycGMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDYwMiArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi9ydW4ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMzMCArCiAg bGliLXB5dGhvbi8yLjUvaWRsZWxpYi90YWJwYWdlLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMyArCiAgbGliLXB5dGhvbi8yLjUvaWRs ZWxpYi90ZXN0Y29kZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAzMSArCiAgbGliLXB5dGhvbi8yLjUvaWRsZWxpYi90ZXh0Vmlldy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3OCAr CiAgbGliLXB5dGhvbi8yLjUvaWhvb2tzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUyMCArCiAgbGliLXB5dGhvbi8yLjUv aW1hcGxpYi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMTQ5OSArKwogIGxpYi1weXRob24vMi41L2ltZ2hkci5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx NjEgKwogIGxpYi1weXRob24vMi41L2ltcHV0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3MzEgKwogIGxpYi1weXRob24v Mi41L2luc3BlY3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA4ODggKwogIGxpYi1weXRob24vMi41L2tleXdvcmQucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgOTUgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9DYW52YXMucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxOTAgKwogIGxpYi1weXRo b24vMi41L2xpYi10ay9EaWFsb2cucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgNDkgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9GaWxl RGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyNzQgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9GaXhUay5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzcgKwogIGxpYi1w eXRob24vMi41L2xpYi10ay9TY3JvbGxlZFRleHQucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNDYgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9T aW1wbGVEaWFsb2cucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxMTIgKwogIGxpYi1weXRob24vMi41L2xpYi10ay9UaXgucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE4OTEgKysrCiAg bGliLXB5dGhvbi8yLjUvbGliLXRrL1RrY29uc3RhbnRzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMCArCiAgbGliLXB5dGhvbi8yLjUvbGli LXRrL1RrZG5kLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDMyMSArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL1RraW50ZXIucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMzc4MyAr KysrKysrCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3MiArCiAgbGliLXB5dGhv bi8yLjUvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICA2MCArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrRmls ZURpYWxvZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDIxNSArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3RrRm9udC5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxNiArCiAgbGliLXB5 dGhvbi8yLjUvbGliLXRrL3RrTWVzc2FnZUJveC5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDEyMiArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3Rr U2ltcGxlRGlhbG9nLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDMyMCArCiAgbGliLXB5dGhvbi8yLjUvbGliLXRrL3R1cnRsZS5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDk1NyArCiAgbGli LXB5dGhvbi8yLjUvbGluZWNhY2hlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEzNiArCiAgbGliLXB5dGhvbi8yLjUvbG9jYWxl LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgMTU2NCArKysKICBsaWItcHl0aG9uLzIuNS9sb2dnaW5nL19faW5pdF9fLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMzcyICsr CiAgbGliLXB5dGhvbi8yLjUvbG9nZ2luZy9jb25maWcucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM0OCArCiAgbGliLXB5dGhvbi8yLjUv bG9nZ2luZy9oYW5kbGVycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMTAyMyArCiAgbGliLXB5dGhvbi8yLjUvbWFjcGF0aC5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI3 NSArCiAgbGliLXB5dGhvbi8yLjUvbWFjdXJsMnBhdGgucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5NyArCiAgbGliLXB5dGhvbi8y LjUvbWFpbGJveC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgMjA5NyArKysrCiAgbGliLXB5dGhvbi8yLjUvbWFpbGNhcC5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDI1NSArCiAgbGliLXB5dGhvbi8yLjUvbWFya3VwYmFzZS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM5MiArCiAgbGliLXB5 dGhvbi8yLjUvbWQ1LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAxMCArCiAgbGliLXB5dGhvbi8yLjUvbWhsaWIucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgMTAwMSArCiAgbGliLXB5dGhvbi8yLjUvbWltZXRvb2xzLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0MSArCiAgbGli LXB5dGhvbi8yLjUvbWltZXR5cGVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUzMyArCiAgbGliLXB5dGhvbi8yLjUvbWltaWZ5 LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDQ2NCArCiAgbGliLXB5dGhvbi8yLjUvbW9kdWxlZmluZGVyLnB5ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDU5NSArCiAg bGliLXB5dGhvbi8yLjUvbXNpbGliL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQ2MyArCiAgbGliLXB5dGhvbi8yLjUvbXNp bGliL3NjaGVtYS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTAwNyArCiAgbGliLXB5dGhvbi8yLjUvbXNpbGliL3NlcXVlbmNlLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyNiAr CiAgbGliLXB5dGhvbi8yLjUvbXNpbGliL3RleHQucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyOSArCiAgbGliLXB5dGhvbi8yLjUv bXVsdGlmaWxlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDE1OCArCiAgbGliLXB5dGhvbi8yLjUvbXV0ZXgucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1 MiArCiAgbGliLXB5dGhvbi8yLjUvbmV0cmMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExMSArCiAgbGliLXB5dGhvbi8y LjUvbmV3LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAxNyArCiAgbGliLXB5dGhvbi8yLjUvbm50cGxpYi5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDYyOCArCiAgbGliLXB5dGhvbi8yLjUvbnRwYXRoLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUxMSArCiAgbGliLXB5dGhv bi8yLjUvbnR1cmwycGF0aC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICA2MyArCiAgbGliLXB5dGhvbi8yLjUvb3Bjb2RlLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDE4NSArCiAgbGliLXB5dGhvbi8yLjUvb3B0cGFyc2UucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTY5MSArKysKICBsaWIt cHl0aG9uLzIuNS9vcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgNzM2ICsKICBsaWItcHl0aG9uLzIuNS9vczJlbXhw YXRoLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgNDIzICsKICBsaWItcHl0aG9uLzIuNS9wZGIuZG9jICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTkyICsKICBs aWItcHl0aG9uLzIuNS9wZGIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMjM0ICsrCiAgbGliLXB5dGhvbi8yLjUvcGlj a2xlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTM4MyArKwogIGxpYi1weXRob24vMi41L3BpY2tsZXRvb2xzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIyNDYg KysrKwogIGxpYi1weXRob24vMi41L3BpcGVzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyOTggKwogIGxpYi1weXRob24v Mi41L3BrZ3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA1NDYgKwogIGxpYi1weXRob24vMi41L3BsYXQtYWl4My9JTi5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxMjYgKwogIGxpYi1weXRob24vMi41L3BsYXQtYWl4My9yZWdlbiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDggKwogIGxpYi1weXRo b24vMi41L3BsYXQtYWl4NC9JTi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNjUgKwogIGxpYi1weXRob24vMi41L3BsYXQtYWl4NC9y ZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDggKwogIGxpYi1weXRob24vMi41L3BsYXQtYXRoZW9zL0lOLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5NDQgKwogIGxpYi1w eXRob24vMi41L3BsYXQtYXRoZW9zL1RZUEVTLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDIgKwogIGxpYi1weXRob24vMi41L3BsYXQtYXRo ZW9zL3JlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtYmVvczUvSU4ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzMjcgKwogIGxp Yi1weXRob24vMi41L3BsYXQtYmVvczUvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDcgKwogIGxpYi1weXRob24vMi41L3BsYXQt ZGFyd2luL0lOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzNTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtZGFyd2luL3JlZ2VuICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwog IGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDIvSU4ucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODcgKwogIGxpYi1weXRob24vMi41L3Bs YXQtZnJlZWJzZDIvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDMvSU4ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODkg KwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDMvcmVnZW4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDQgKwogIGxpYi1weXRob24vMi41 L3BsYXQtZnJlZWJzZDQvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAzNTUgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDQvcmVn ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDUvSU4ucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNTUgKwogIGxpYi1weXRob24v Mi41L3BsYXQtZnJlZWJzZDUvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDYv SU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA1MTUgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJzZDYvcmVnZW4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1weXRo b24vMi41L3BsYXQtZnJlZWJzZDcvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA1MzUgKwogIGxpYi1weXRob24vMi41L3BsYXQtZnJlZWJz ZDcvcmVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDMgKwogIGxpYi1weXRob24vMi41L3BsYXQtZ2VuZXJpYy9yZWdlbiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDMgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDUvQUwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDUvQ0QucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMzQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvQ0wucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjQgKwogIGxp Yi1weXRob24vMi41L3BsYXQtaXJpeDUvQ0xfb2xkLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzYgKwogIGxpYi1weXRob24vMi41L3BsYXQt aXJpeDUvREVWSUNFLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0MDAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvRVJSTk8ucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNDcgKwog IGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvRklMRS5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzkgKwogIGxpYi1weXRob24vMi41L3Bs YXQtaXJpeDUvRkwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyODkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvR0VULnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTkg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvR0wucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTMgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDUvR0xXUy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMTIgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvSU4ucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx NDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvSU9DVEwucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzMgKwogIGxpYi1weXRob24v Mi41L3BsYXQtaXJpeDUvU1YucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvV0FJ VC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMTQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvY2RkYi5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDQgKwogIGxpYi1weXRo b24vMi41L3BsYXQtaXJpeDUvY2RwbGF5ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgODggKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUv ZmxwLmRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAxMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvZmxwLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NTEgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDUvanBlZy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDUvcGFuZWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyODEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvcGFuZWxwYXJzZXIucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjggKwogIGxp Yi1weXRob24vMi41L3BsYXQtaXJpeDUvcmVhZGNkLmRvYyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1weXRob24vMi41L3BsYXQt aXJpeDUvcmVhZGNkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAyNDQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvcmVnZW4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTAgKwog IGxpYi1weXRob24vMi41L3BsYXQtaXJpeDUvdG9yZ2IucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxpYi1weXRob24vMi41L3Bs YXQtaXJpeDYvQUwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgNjEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvQ0QucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMzQg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvQ0wucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMjQgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDYvREVWSUNFLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0MDAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvRVJSTk8u cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAx ODAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvRklMRS5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NzQgKwogIGxpYi1weXRob24v Mi41L3BsYXQtaXJpeDYvRkwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyODkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvR0VU LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNTkgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvR0wucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzOTMgKwogIGxpYi1weXRo b24vMi41L3BsYXQtaXJpeDYvR0xXUy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMTIgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYv SU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAzODUgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvSU9DVEwucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMzMgKwogIGxpYi1w eXRob24vMi41L3BsYXQtaXJpeDYvU1YucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjAgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJp eDYvV0FJVC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAzMzUgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvY2RkYi5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMDQgKwogIGxp Yi1weXRob24vMi41L3BsYXQtaXJpeDYvY2RwbGF5ZXIucHkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODggKwogIGxpYi1weXRob24vMi41L3BsYXQt aXJpeDYvZmxwLmRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvZmxwLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NTAgKwog IGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvanBlZy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMTEgKwogIGxpYi1weXRob24vMi41L3Bs YXQtaXJpeDYvcGFuZWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAyODEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvcGFuZWxwYXJz ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjgg KwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvcmVhZGNkLmRvYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMDQgKwogIGxpYi1weXRob24vMi41 L3BsYXQtaXJpeDYvcmVhZGNkLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAyNDQgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvcmVnZW4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MTEgKwogIGxpYi1weXRob24vMi41L3BsYXQtaXJpeDYvdG9yZ2IucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOTkgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbGludXgyL0NEUk9NLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyMDcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbGludXgyL0RM RkNOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgODMgKwogIGxpYi1weXRob24vMi41L3BsYXQtbGludXgyL0lOLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2MTUgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbGludXgyL1RZUEVTLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNzAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbGludXgy L3JlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0F1ZGlvX21hYy5weSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMjEgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BRS5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9BSC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BbGlhcy5weSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMTggKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9BcHAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJh bmNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NDggKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5NjEgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DRi5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DRy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdmVudHMucHkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICA0NTEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9D YXJib25FdnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DbS5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNjIgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9Db250cm9sQWNjZXNzb3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNTYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Db250cm9scy5weSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2NjggKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL0NhcmJvbi9Db3JlRm91bmRhdGlvbi5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMjggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0Nh cmJvbi9Db3JlR3JhcGhpY3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMjggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9DdGwucHkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9EaWFsb2dzLnB5ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzkgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9EbGcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9EcmFnLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODYgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9FdmVudHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAxMDIgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9FdnQucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL0NhcmJvbi9GaWxlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA0MjYgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9GbS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9Gb2xkZXIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9Gb2xkZXJzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxOTAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9G b250cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NTkgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9IZWxwLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9JQkNhcmJvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9JQkNhcmJvblJ1bnRpbWUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgIDUgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9JY24ucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAzODEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0Nh cmJvbi9MYXVuY2gucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2hTZXJ2aWNl cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNzQgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9MaXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L0NhcmJvbi9MaXN0cy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMzUgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTggKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NYWNUZXh0RWRpdG9yLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMjYgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgOTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNjkgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL0NhcmJvbi9NbHRlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9PU0Eu cHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9PU0Fjb25zdC5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzMgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL0NhcmJvbi9RRE9mZnNjcmVlbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgNDcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9R ZC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg IDEgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RZG9mZnMucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDEgKwogIGxpYi1weXRob24v Mi41L3BsYXQtbWFjL0NhcmJvbi9RdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgIDUgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJv bi9RdWlja0RyYXcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAyMTggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDM0NjggKysrKysrCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvQ2FyYm9uL1Jlc291cmNlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAyNyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1NjcmFwLnB5 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1NuZC5weSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvQ2FyYm9uL1NuZGlob29rcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1NvdW5k LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQwMCAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMSArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvQ2FyYm9uL1RleHRFZGl0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA1NyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1dp bi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAg MSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvQ2FyYm9uL1dpbmRvd3MucHkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI3OSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAgNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvRWFzeURp YWxvZ3MucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDgzOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvRnJhbWVXb3JrLnB5ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTEyMyArKwogIGxpYi1weXRo b24vMi41L3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxOTggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL1Bp eE1hcFdyYXBwZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyMTQgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FlcGFjay5weSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjYgKwogIGxpYi1w eXRob24vMi41L3BsYXQtbWFjL2FldG9vbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAzNjAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFj L2FldHlwZXMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA1NjggKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMzcgKwogIGxp Yi1weXRob24vMi41L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNjMgKwogIGxpYi1weXRob24vMi41L3BsYXQt bWFjL2FwcGxldHJ1bm5lci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgMTcgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2FyZ3ZlbXVsYXRvci5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgODkgKwog IGxpYi1weXRob24vMi41L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNTUgKwogIGxpYi1weXRob24vMi41L3Bs YXQtbWFjL2J1aWxkdG9vbHMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICA0MjAgKwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2J1bmRsZWJ1aWxk ZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5MzQg KwogIGxpYi1weXRob24vMi41L3BsYXQtbWFjL2NmbWZpbGUucHkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxODMgKwogIGxpYi1weXRob24vMi41 L3BsYXQtbWFjL2RpYWxvZ3MucnNyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICBCaW4gCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvZXJyb3JzLnJz cmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJp biAKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9maW5kZXJ0b29scy5weSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgODMxICsKICBsaWItcHl0aG9uLzIu NS9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAxMjEzICsrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvaWMucHkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDI2OCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvaWNvcGVuLnB5ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2NiArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9y X3N1aXRlLnB5ICAgICAgICAgfCAgIDY4MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHkgICAg fCAgMjM3MyArKysrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2Vz L0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5ICAgICAgICAgICAgICAgICAgfCAgICA2MiArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1N0YW5k YXJkX1N1aXRlLnB5ICAgICAgICAgICAgfCAgIDQwOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5ICAgICAgICAgICAg ICAgICAgfCAgIDE4OSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL0V4cGxvcmVyL01pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlci5weSAgfCAgICA5NiArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL05ldHNj YXBlX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgICA0OSArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5ICAgICAg ICAgICAgICAgfCAgIDEwOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgICA3MiAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VS TF9TdWl0ZS5weSAgICAgICAgICAgICAgICAgICAgfCAgICA1NCArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5 ICAgICAgICAgICAgfCAgIDIyNiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgfCAgICA4 MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9D b250YWluZXJzX2FuZF9mb2xkZXJzLnB5ICAgICAgICAgfCAgIDI3OSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHkgICAg ICAgICAgICAgICAgICAgfCAgIDE0NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNj cmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDIxMiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRl ci9GaW5kZXJfQmFzaWNzLnB5ICAgICAgICAgICAgICAgICAgfCAgIDIwNyArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaW5kZXJfaXRlbXMucHkg ICAgICAgICAgICAgICAgICAgfCAgIDM1NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHkgICAgICAgICAgICAgICAgICAg fCAgIDIyNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0Zp bmRlci9TdGFuZGFyZF9TdWl0ZS5weSAgICAgICAgICAgICAgICAgfCAgIDMzNSArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9UeXBlX0RlZmluaXRp b25zLnB5ICAgICAgICAgICAgICAgfCAgIDM0NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weSAgICAgICAgICAgICAg ICAgfCAgIDIyOSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2Vz L0ZpbmRlci9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIzMyArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL01vemlsbGFf c3VpdGUucHkgICAgICAgICAgICAgICAgfCAgIDI2OSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1Bvd2VyUGxhbnQucHkgICAgICAgICAgICAg ICAgICAgfCAgICA4NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL05ldHNjYXBlL1JlcXVpcmVkX3N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDEwOCArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5k YXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDI0MyArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weSAg ICAgICAgICAgfCAgICA2MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL05ldHNjYXBlL1RleHQucHkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyMiAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dv cmxkV2lkZVdlYl9zdWl0ZS5weSAgICAgICAgICAgfCAgIDQyNiArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5ICAgICAgICAg ICAgICAgICAgICAgfCAgIDEwNSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weSAgICAgICAgICAgfCAgMjIx NSArKysrCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1 aXRlcy9NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMucHkgfCAgIDM3MyArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3Jh cGhpY3NfU3VpdGUucHkgICAgfCAgIDQxNyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHkg fCAgICA3MyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0 ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weSAgICAgICAgICAgICAgfCAgICAzMiArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9T dWl0ZS5weSAgICAgICAgICAgICAgfCAgIDczOCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UYWJsZV9TdWl0ZS5weSAgICAgICAgICAgICAg ICAgfCAgIDEwNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2Vz L1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5ICAgICAgICAgICAgICAgICAgfCAgIDIyNCArCiAgbGli LXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05h bWVzX1N1aXRlLnB5ICAgICAgICAgICAgfCAgIDQzNSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1t YWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weSAgICAgICAgICAgICAg ICAgICAgfCAgIDQ3MSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2th Z2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5ICAgfCAgIDM4MSArCiAg bGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9G b2xkZXJfQWN0aW9uc19TdWl0ZS5weSAgICAgfCAgIDI4NyArCiAgbGliLXB5dGhvbi8yLjUvcGxh dC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9IaWRkZW5fU3VpdGUucHkgICAg ICAgICAgICAgfCAgICA1MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBh Y2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weSAgICAgICAgfCAgICA3NCAr CiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50 cy9Qb3dlcl9TdWl0ZS5weSAgICAgICAgICAgICAgfCAgIDE0OSArCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNzZXNfU3VpdGUu cHkgICAgICAgICAgfCAgIDIxNCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlw dHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weSAgICAgICAgICAgfCAgIDU4 MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2 ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5ICAgICAgfCAgIDEwOSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9UZXh0X1N1aXRlLnB5 ICAgICAgICAgICAgICAgfCAgIDE5NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNj cmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgfCAg IDE0MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1p bmFsL1N0YW5kYXJkX1N1aXRlLnB5ICAgICAgICAgICAgICAgfCAgIDU4MiArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1Rlcm1pbmFsX1N1aXRl LnB5ICAgICAgICAgICAgICAgfCAgIDI1NCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGli LXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHkgICAgICAgICAgICAgICAgICAg fCAgIDE5NSArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rl cm1pbmFsL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgfCAgICA4OSArCiAgbGliLXB5 dGhvbi8yLjUvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL19faW5p dF9fLnB5ICAgICAgICAgICAgICAgfCAgICAyNyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMv bGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHkgICAgICAg ICAgfCAgIDE0MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvbWFjZXJyb3JzLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTg1MyArKysKICBs aWItcHl0aG9uLzIuNS9wbGF0LW1hYy9tYWNmcy5weSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTk4ICsKICBsaWItcHl0aG9uLzIuNS9wbGF0 LW1hYy9tYWNvc3Rvb2xzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgMTQyICsKICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9tYWNyZXNvdXJjZS5w eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTQ2ICsK ICBsaWItcHl0aG9uLzIuNS9wbGF0LW1hYy9waW1wLnB5ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMTc3ICsrCiAgbGliLXB5dGhvbi8yLjUv cGxhdC1tYWMvcGxpc3RsaWIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDQ3MCArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvdGVybWluYWxj b21tYW5kLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0 NyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5MSArCiAgbGliLXB5dGhvbi8y LjUvcGxhdC1uZXRic2QxL0lOLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA1NiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1uZXRic2QxL3Jl Z2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAgMyArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1uZXh0My9yZWdlbiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgNiArCiAgbGliLXB5dGhv bi8yLjUvcGxhdC1vczJlbXgvSU4ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICA4MiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1vczJlbXgv U09DS0VULnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEwNiArCiAgbGliLXB5dGhvbi8yLjUvcGxhdC1vczJlbXgvX2VteF9saW5rLnB5ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA From jython-checkins at python.org Tue Mar 20 02:46:19 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 02:46:19 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_=231536_fix_NPE_?= =?utf8?q?in_org=2Epython=2Ejsr223=2EPyScriptEngine=2E?= Message-ID: http://hg.python.org/jython/rev/ea08bca49afb changeset: 6420:ea08bca49afb branch: 2.5 parent: 6418:278d9cb22f28 user: Frank Wierzbicki date: Mon Mar 19 18:45:46 2012 -0700 summary: #1536 fix NPE in org.python.jsr223.PyScriptEngine. files: NEWS | 1 + src/org/python/core/ParserFacade.java | 2 - tests/java/org/python/jsr223/ScriptEngineIOTest.java | 14 ++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname diff --git a/src/org/python/core/ParserFacade.java b/src/org/python/core/ParserFacade.java --- a/src/org/python/core/ParserFacade.java +++ b/src/org/python/core/ParserFacade.java @@ -129,8 +129,6 @@ } catch (Throwable tt) { throw fixParseError(bufReader, tt, filename); } - } finally { - close(bufReader); } } diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -88,11 +88,20 @@ public void testEvalWithReader() throws ScriptException, FileNotFoundException { + //Check that multiple evals don't cause an NPE. + //See issue http://bugs.jython.org/issue1536 final ScriptEngineManager manager = new ScriptEngineManager(); final String engineType = "jython"; final ScriptEngine engine = manager.getEngineByName(engineType); + final StringWriter stdout = new StringWriter(); + final StringWriter stderr = new StringWriter(); + + engine.getContext().setWriter(stdout); + engine.getContext().setErrorWriter(stderr); + + final Bindings bindings = new SimpleBindings(); bindings.put("firstLevelNodes", 10); bindings.put("secondLevelNodes", 5); @@ -102,8 +111,9 @@ final Reader dfsScript = new FileReader("tests/python/dfs.py"); - for (int i = 1; i <= 10; i++) + for (int i = 1; i <= 10; i++) { engine.eval(dfsScript); + assertEquals(61, engine.get("result")); + } } - } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 02:46:19 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 02:46:19 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/18e962064e6e changeset: 6421:18e962064e6e parent: 6419:9f1d42b6dd8f parent: 6420:ea08bca49afb user: Frank Wierzbicki date: Mon Mar 19 18:46:11 2012 -0700 summary: Merge from 2.5. files: NEWS | 1 + src/org/python/core/ParserFacade.java | 2 - tests/java/org/python/jsr223/ScriptEngineIOTest.java | 14 ++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname diff --git a/src/org/python/core/ParserFacade.java b/src/org/python/core/ParserFacade.java --- a/src/org/python/core/ParserFacade.java +++ b/src/org/python/core/ParserFacade.java @@ -129,8 +129,6 @@ } catch (Throwable tt) { throw fixParseError(bufReader, tt, filename); } - } finally { - close(bufReader); } } diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -88,11 +88,20 @@ public void testEvalWithReader() throws ScriptException, FileNotFoundException { + //Check that multiple evals don't cause an NPE. + //See issue http://bugs.jython.org/issue1536 final ScriptEngineManager manager = new ScriptEngineManager(); final String engineType = "jython"; final ScriptEngine engine = manager.getEngineByName(engineType); + final StringWriter stdout = new StringWriter(); + final StringWriter stderr = new StringWriter(); + + engine.getContext().setWriter(stdout); + engine.getContext().setErrorWriter(stderr); + + final Bindings bindings = new SimpleBindings(); bindings.put("firstLevelNodes", 10); bindings.put("secondLevelNodes", 5); @@ -102,8 +111,9 @@ final Reader dfsScript = new FileReader("tests/python/dfs.py"); - for (int i = 1; i <= 10; i++) + for (int i = 1; i <= 10; i++) { engine.eval(dfsScript); + assertEquals(61, engine.get("result")); + } } - } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 04:25:39 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 04:25:39 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_=231721_NPE_when?= =?utf8?q?_using_JSR_223_=28TestCase+Patch=29_fixed=2E_Thanks_kaneiderdani?= =?utf8?q?el!?= Message-ID: http://hg.python.org/jython/rev/8a3ae67fdd25 changeset: 6422:8a3ae67fdd25 branch: 2.5 parent: 6420:ea08bca49afb user: Frank Wierzbicki date: Mon Mar 19 20:23:49 2012 -0700 summary: #1721 NPE when using JSR 223 (TestCase+Patch) fixed. Thanks kaneiderdaniel! files: src/org/python/jsr223/PyScriptEngine.java | 15 ++++- tests/java/org/python/jsr223/ScriptEngineIOTest.java | 31 ++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/org/python/jsr223/PyScriptEngine.java b/src/org/python/jsr223/PyScriptEngine.java --- a/src/org/python/jsr223/PyScriptEngine.java +++ b/src/org/python/jsr223/PyScriptEngine.java @@ -121,7 +121,13 @@ if (function == null) { throw new NoSuchMethodException(name); } - return function.__call__(Py.javas2pys(args)).__tojava__(Object.class); + PyObject result; + if(args != null) { + result = function.__call__(Py.javas2pys(args)); + } else { + result = function.__call__(); + } + return result.__tojava__(Object.class); } catch (PyException pye) { throw scriptException(pye); } @@ -151,7 +157,12 @@ PyObject pyMethod = thiz.__findattr__(method.getName()); if (pyMethod == null) throw new NoSuchMethodException(method.getName()); - PyObject result = pyMethod.__call__(Py.javas2pys(args)); + PyObject result; + if(args != null) { + result = pyMethod.__call__(Py.javas2pys(args)); + } else { + result = pyMethod.__call__(); + } return result.__tojava__(Object.class); } catch (PyException pye) { throw scriptException(pye); diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -1,6 +1,7 @@ package org.python.jsr223; import javax.script.Bindings; +import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; @@ -12,6 +13,7 @@ import java.io.FileReader; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; @@ -116,4 +118,33 @@ assertEquals(61, engine.get("result")); } } + + public void testGetInterfaceCharSequence1() throws ScriptException, IOException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine engine = manager.getEngineByName("python"); + Invocable invocableEngine = (Invocable) engine; + + assertNull(engine.eval( + "from java.lang import CharSequence\n" + + "class MyString(CharSequence):\n" + + " def length(self): return 3\n" + + " def charAt(self, index): return 'a'\n" + + " def subSequence(self, start, end): return \"\"\n" + + " def toString(self): return \"aaa\"\n" + + "c = MyString()")); + CharSequence seq = invocableEngine.getInterface(engine.get("c"), CharSequence.class); + assertEquals("aaa", seq.toString()); + } + + public void testGetInterfaceCharSequence2() throws ScriptException, IOException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + Invocable invocableEngine = (Invocable) pythonEngine; + + assertNull(pythonEngine.eval( + "from java.lang import StringBuilder\r\n" + + "c = StringBuilder(\"abc\")\r\n")); + CharSequence seq = invocableEngine.getInterface(pythonEngine.get("c"), CharSequence.class); + assertEquals("abc", seq.toString()); + } } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 04:25:39 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 04:25:39 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/b42f84befe07 changeset: 6423:b42f84befe07 parent: 6421:18e962064e6e parent: 6422:8a3ae67fdd25 user: Frank Wierzbicki date: Mon Mar 19 20:24:35 2012 -0700 summary: Merge from 2.5. files: src/org/python/jsr223/PyScriptEngine.java | 15 ++++- tests/java/org/python/jsr223/ScriptEngineIOTest.java | 31 ++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/org/python/jsr223/PyScriptEngine.java b/src/org/python/jsr223/PyScriptEngine.java --- a/src/org/python/jsr223/PyScriptEngine.java +++ b/src/org/python/jsr223/PyScriptEngine.java @@ -121,7 +121,13 @@ if (function == null) { throw new NoSuchMethodException(name); } - return function.__call__(Py.javas2pys(args)).__tojava__(Object.class); + PyObject result; + if(args != null) { + result = function.__call__(Py.javas2pys(args)); + } else { + result = function.__call__(); + } + return result.__tojava__(Object.class); } catch (PyException pye) { throw scriptException(pye); } @@ -151,7 +157,12 @@ PyObject pyMethod = thiz.__findattr__(method.getName()); if (pyMethod == null) throw new NoSuchMethodException(method.getName()); - PyObject result = pyMethod.__call__(Py.javas2pys(args)); + PyObject result; + if(args != null) { + result = pyMethod.__call__(Py.javas2pys(args)); + } else { + result = pyMethod.__call__(); + } return result.__tojava__(Object.class); } catch (PyException pye) { throw scriptException(pye); diff --git a/tests/java/org/python/jsr223/ScriptEngineIOTest.java b/tests/java/org/python/jsr223/ScriptEngineIOTest.java --- a/tests/java/org/python/jsr223/ScriptEngineIOTest.java +++ b/tests/java/org/python/jsr223/ScriptEngineIOTest.java @@ -1,6 +1,7 @@ package org.python.jsr223; import javax.script.Bindings; +import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; @@ -12,6 +13,7 @@ import java.io.FileReader; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; @@ -116,4 +118,33 @@ assertEquals(61, engine.get("result")); } } + + public void testGetInterfaceCharSequence1() throws ScriptException, IOException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine engine = manager.getEngineByName("python"); + Invocable invocableEngine = (Invocable) engine; + + assertNull(engine.eval( + "from java.lang import CharSequence\n" + + "class MyString(CharSequence):\n" + + " def length(self): return 3\n" + + " def charAt(self, index): return 'a'\n" + + " def subSequence(self, start, end): return \"\"\n" + + " def toString(self): return \"aaa\"\n" + + "c = MyString()")); + CharSequence seq = invocableEngine.getInterface(engine.get("c"), CharSequence.class); + assertEquals("aaa", seq.toString()); + } + + public void testGetInterfaceCharSequence2() throws ScriptException, IOException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + Invocable invocableEngine = (Invocable) pythonEngine; + + assertNull(pythonEngine.eval( + "from java.lang import StringBuilder\r\n" + + "c = StringBuilder(\"abc\")\r\n")); + CharSequence seq = invocableEngine.getInterface(pythonEngine.get("c"), CharSequence.class); + assertEquals("abc", seq.toString()); + } } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 04:32:01 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 04:32:01 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Oops_forgot_to_u?= =?utf8?q?pdate_the_NEWS_file=2E?= Message-ID: http://hg.python.org/jython/rev/7f45511459a8 changeset: 6424:7f45511459a8 branch: 2.5 parent: 6422:8a3ae67fdd25 user: Frank Wierzbicki date: Mon Mar 19 20:31:15 2012 -0700 summary: Oops forgot to update the NEWS file. files: NEWS | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -1,7 +1,11 @@ Jython NEWS +Jython 2.7a1 + Bugs Fixed + Jython 2.5.3b2 Bugs Fixed + - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 04:32:01 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 04:32:01 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/5170073d6fbb changeset: 6425:5170073d6fbb parent: 6423:b42f84befe07 parent: 6424:7f45511459a8 user: Frank Wierzbicki date: Mon Mar 19 20:31:49 2012 -0700 summary: Merge from 2.5. files: NEWS | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -1,7 +1,11 @@ Jython NEWS +Jython 2.7a1 + Bugs Fixed + Jython 2.5.3b2 Bugs Fixed + - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 05:42:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 05:42:32 +0100 Subject: [Jython-checkins] =?utf8?b?anl0aG9uICgyLjUpOiAjMTc0OSBmaXhlZDog?= =?utf8?q?function_descriptor_doesn=27t_work_in_interactive_console=2E?= Message-ID: http://hg.python.org/jython/rev/2923c6c259f9 changeset: 6426:2923c6c259f9 branch: 2.5 parent: 6424:7f45511459a8 user: Frank Wierzbicki date: Mon Mar 19 21:41:51 2012 -0700 summary: #1749 fixed: function descriptor doesn't work in interactive console. files: NEWS | 1 + grammar/PythonPartial.g | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1749 ] function descriptor doesn't work in interactive console - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) diff --git a/grammar/PythonPartial.g b/grammar/PythonPartial.g --- a/grammar/PythonPartial.g +++ b/grammar/PythonPartial.g @@ -481,7 +481,8 @@ | try_stmt | with_stmt | (decorators? DEF) => funcdef - | classdef + | (decorators? CLASS) => classdef + | decorators ; //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 05:42:32 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 05:42:32 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?b?OiBNZXJnZSAyLjUu?= Message-ID: http://hg.python.org/jython/rev/c5264be627c2 changeset: 6427:c5264be627c2 parent: 6425:5170073d6fbb parent: 6426:2923c6c259f9 user: Frank Wierzbicki date: Mon Mar 19 21:42:24 2012 -0700 summary: Merge 2.5. files: NEWS | 1 + grammar/PythonPartial.g | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1749 ] function descriptor doesn't work in interactive console - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) diff --git a/grammar/PythonPartial.g b/grammar/PythonPartial.g --- a/grammar/PythonPartial.g +++ b/grammar/PythonPartial.g @@ -481,7 +481,8 @@ | try_stmt | with_stmt | (decorators? DEF) => funcdef - | classdef + | (decorators? CLASS) => classdef + | decorators ; //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 06:18:19 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 06:18:19 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_from=3A?= Message-ID: http://hg.python.org/jython/rev/e833ccc5b68d changeset: 6428:e833ccc5b68d user: Frank Wierzbicki date: Mon Mar 19 22:13:18 2012 -0700 summary: from: http://hg.python.org/cpython/Lib/test/test_xmlrpc.py at 75832 files: Lib/test/test_xmlrpc.py | 1027 +++++++++++++++++++++++++++ 1 files changed, 1027 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_xmlrpc.py @@ -0,0 +1,1027 @@ +import base64 +import datetime +import sys +import time +import unittest +import xmlrpclib +import SimpleXMLRPCServer +import mimetools +import httplib +import socket +import StringIO +import os +import re +from test import test_support + +try: + import threading +except ImportError: + threading = None + +try: + unicode +except NameError: + have_unicode = False +else: + have_unicode = True + +alist = [{'astring': 'foo at bar.baz.spam', + 'afloat': 7283.43, + 'anint': 2**20, + 'ashortlong': 2L, + 'anotherlist': ['.zyx.41'], + 'abase64': xmlrpclib.Binary("my dog has fleas"), + 'boolean': xmlrpclib.False, + 'unicode': u'\u4000\u6000\u8000', + u'ukey\u4000': 'regular value', + 'datetime1': xmlrpclib.DateTime('20050210T11:41:23'), + 'datetime2': xmlrpclib.DateTime( + (2005, 02, 10, 11, 41, 23, 0, 1, -1)), + 'datetime3': xmlrpclib.DateTime( + datetime.datetime(2005, 02, 10, 11, 41, 23)), + }] + +class XMLRPCTestCase(unittest.TestCase): + + def test_dump_load(self): + self.assertEqual(alist, + xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0]) + + def test_dump_bare_datetime(self): + # This checks that an unwrapped datetime.date object can be handled + # by the marshalling code. This can't be done via test_dump_load() + # since with use_datetime set to 1 the unmarshaller would create + # datetime objects for the 'datetime[123]' keys as well + dt = datetime.datetime(2005, 02, 10, 11, 41, 23) + s = xmlrpclib.dumps((dt,)) + (newdt,), m = xmlrpclib.loads(s, use_datetime=1) + self.assertEqual(newdt, dt) + self.assertEqual(m, None) + + (newdt,), m = xmlrpclib.loads(s, use_datetime=0) + self.assertEqual(newdt, xmlrpclib.DateTime('20050210T11:41:23')) + + def test_datetime_before_1900(self): + # same as before but with a date before 1900 + dt = datetime.datetime(1, 02, 10, 11, 41, 23) + s = xmlrpclib.dumps((dt,)) + (newdt,), m = xmlrpclib.loads(s, use_datetime=1) + self.assertEqual(newdt, dt) + self.assertEqual(m, None) + + (newdt,), m = xmlrpclib.loads(s, use_datetime=0) + self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23')) + + def test_cmp_datetime_DateTime(self): + now = datetime.datetime.now() + dt = xmlrpclib.DateTime(now.timetuple()) + self.assertTrue(dt == now) + self.assertTrue(now == dt) + then = now + datetime.timedelta(seconds=4) + self.assertTrue(then >= dt) + self.assertTrue(dt < then) + + def test_bug_1164912 (self): + d = xmlrpclib.DateTime() + ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), + methodresponse=True)) + self.assertIsInstance(new_d.value, str) + + # Check that the output of dumps() is still an 8-bit string + s = xmlrpclib.dumps((new_d,), methodresponse=True) + self.assertIsInstance(s, str) + + def test_newstyle_class(self): + class T(object): + pass + t = T() + t.x = 100 + t.y = "Hello" + ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,))) + self.assertEqual(t2, t.__dict__) + + def test_dump_big_long(self): + self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) + + def test_dump_bad_dict(self): + self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},)) + + def test_dump_recursive_seq(self): + l = [1,2,3] + t = [3,4,5,l] + l.append(t) + self.assertRaises(TypeError, xmlrpclib.dumps, (l,)) + + def test_dump_recursive_dict(self): + d = {'1':1, '2':1} + t = {'3':3, 'd':d} + d['t'] = t + self.assertRaises(TypeError, xmlrpclib.dumps, (d,)) + + def test_dump_big_int(self): + if sys.maxint > 2L**31-1: + self.assertRaises(OverflowError, xmlrpclib.dumps, + (int(2L**34),)) + + xmlrpclib.dumps((xmlrpclib.MAXINT, xmlrpclib.MININT)) + self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MAXINT+1,)) + self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MININT-1,)) + + def dummy_write(s): + pass + + m = xmlrpclib.Marshaller() + m.dump_int(xmlrpclib.MAXINT, dummy_write) + m.dump_int(xmlrpclib.MININT, dummy_write) + self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MAXINT+1, dummy_write) + self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MININT-1, dummy_write) + + + def test_dump_none(self): + value = alist + [None] + arg1 = (alist + [None],) + strg = xmlrpclib.dumps(arg1, allow_none=True) + self.assertEqual(value, + xmlrpclib.loads(strg)[0][0]) + self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,)) + + def test_default_encoding_issues(self): + # SF bug #1115989: wrong decoding in '_stringify' + utf8 = """ + + + abc \x95 + + + + + def \x96 + ghi \x97 + + + + + """ + + # sys.setdefaultencoding() normally doesn't exist after site.py is + # loaded. Import a temporary fresh copy to get access to it + # but then restore the original copy to avoid messing with + # other potentially modified sys module attributes + old_encoding = sys.getdefaultencoding() + with test_support.CleanImport('sys'): + import sys as temp_sys + temp_sys.setdefaultencoding("iso-8859-1") + try: + (s, d), m = xmlrpclib.loads(utf8) + finally: + temp_sys.setdefaultencoding(old_encoding) + + items = d.items() + if have_unicode: + self.assertEqual(s, u"abc \x95") + self.assertIsInstance(s, unicode) + self.assertEqual(items, [(u"def \x96", u"ghi \x97")]) + self.assertIsInstance(items[0][0], unicode) + self.assertIsInstance(items[0][1], unicode) + else: + self.assertEqual(s, "abc \xc2\x95") + self.assertEqual(items, [("def \xc2\x96", "ghi \xc2\x97")]) + + +class HelperTestCase(unittest.TestCase): + def test_escape(self): + self.assertEqual(xmlrpclib.escape("a&b"), "a&b") + self.assertEqual(xmlrpclib.escape("ab"), "a>b") + +class FaultTestCase(unittest.TestCase): + def test_repr(self): + f = xmlrpclib.Fault(42, 'Test Fault') + self.assertEqual(repr(f), "") + self.assertEqual(repr(f), str(f)) + + def test_dump_fault(self): + f = xmlrpclib.Fault(42, 'Test Fault') + s = xmlrpclib.dumps((f,)) + (newf,), m = xmlrpclib.loads(s) + self.assertEqual(newf, {'faultCode': 42, 'faultString': 'Test Fault'}) + self.assertEqual(m, None) + + s = xmlrpclib.Marshaller().dumps(f) + self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s) + + +class DateTimeTestCase(unittest.TestCase): + def test_default(self): + t = xmlrpclib.DateTime() + + def test_time(self): + d = 1181399930.036952 + t = xmlrpclib.DateTime(d) + self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", time.localtime(d))) + + def test_time_tuple(self): + d = (2007,6,9,10,38,50,5,160,0) + t = xmlrpclib.DateTime(d) + self.assertEqual(str(t), '20070609T10:38:50') + + def test_time_struct(self): + d = time.localtime(1181399930.036952) + t = xmlrpclib.DateTime(d) + self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", d)) + + def test_datetime_datetime(self): + d = datetime.datetime(2007,1,2,3,4,5) + t = xmlrpclib.DateTime(d) + self.assertEqual(str(t), '20070102T03:04:05') + + def test_repr(self): + d = datetime.datetime(2007,1,2,3,4,5) + t = xmlrpclib.DateTime(d) + val ="" % id(t) + self.assertEqual(repr(t), val) + + def test_decode(self): + d = ' 20070908T07:11:13 ' + t1 = xmlrpclib.DateTime() + t1.decode(d) + tref = xmlrpclib.DateTime(datetime.datetime(2007,9,8,7,11,13)) + self.assertEqual(t1, tref) + + t2 = xmlrpclib._datetime(d) + self.assertEqual(t1, tref) + +class BinaryTestCase(unittest.TestCase): + def test_default(self): + t = xmlrpclib.Binary() + self.assertEqual(str(t), '') + + def test_string(self): + d = '\x01\x02\x03abc123\xff\xfe' + t = xmlrpclib.Binary(d) + self.assertEqual(str(t), d) + + def test_decode(self): + d = '\x01\x02\x03abc123\xff\xfe' + de = base64.encodestring(d) + t1 = xmlrpclib.Binary() + t1.decode(de) + self.assertEqual(str(t1), d) + + t2 = xmlrpclib._binary(de) + self.assertEqual(str(t2), d) + + +ADDR = PORT = URL = None + +# The evt is set twice. First when the server is ready to serve. +# Second when the server has been shutdown. The user must clear +# the event after it has been set the first time to catch the second set. +def http_server(evt, numrequests, requestHandler=None): + class TestInstanceClass: + def div(self, x, y): + return x // y + + def _methodHelp(self, name): + if name == 'div': + return 'This is the div function' + + def my_function(): + '''This is my function''' + return True + + class MyXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer): + def get_request(self): + # Ensure the socket is always non-blocking. On Linux, socket + # attributes are not inherited like they are on *BSD and Windows. + s, port = self.socket.accept() + s.setblocking(True) + return s, port + + if not requestHandler: + requestHandler = SimpleXMLRPCServer.SimpleXMLRPCRequestHandler + serv = MyXMLRPCServer(("localhost", 0), requestHandler, + logRequests=False, bind_and_activate=False) + try: + serv.socket.settimeout(3) + serv.server_bind() + global ADDR, PORT, URL + ADDR, PORT = serv.socket.getsockname() + #connect to IP address directly. This avoids socket.create_connection() + #trying to connect to "localhost" using all address families, which + #causes slowdown e.g. on vista which supports AF_INET6. The server listens + #on AF_INET only. + URL = "http://%s:%d"%(ADDR, PORT) + serv.server_activate() + serv.register_introspection_functions() + serv.register_multicall_functions() + serv.register_function(pow) + serv.register_function(lambda x,y: x+y, 'add') + serv.register_function(my_function) + serv.register_instance(TestInstanceClass()) + evt.set() + + # handle up to 'numrequests' requests + while numrequests > 0: + serv.handle_request() + numrequests -= 1 + + except socket.timeout: + pass + finally: + serv.socket.close() + PORT = None + evt.set() + +def http_multi_server(evt, numrequests, requestHandler=None): + class TestInstanceClass: + def div(self, x, y): + return x // y + + def _methodHelp(self, name): + if name == 'div': + return 'This is the div function' + + def my_function(): + '''This is my function''' + return True + + class MyXMLRPCServer(SimpleXMLRPCServer.MultiPathXMLRPCServer): + def get_request(self): + # Ensure the socket is always non-blocking. On Linux, socket + # attributes are not inherited like they are on *BSD and Windows. + s, port = self.socket.accept() + s.setblocking(True) + return s, port + + if not requestHandler: + requestHandler = SimpleXMLRPCServer.SimpleXMLRPCRequestHandler + class MyRequestHandler(requestHandler): + rpc_paths = [] + + serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler, + logRequests=False, bind_and_activate=False) + serv.socket.settimeout(3) + serv.server_bind() + try: + global ADDR, PORT, URL + ADDR, PORT = serv.socket.getsockname() + #connect to IP address directly. This avoids socket.create_connection() + #trying to connect to "localhost" using all address families, which + #causes slowdown e.g. on vista which supports AF_INET6. The server listens + #on AF_INET only. + URL = "http://%s:%d"%(ADDR, PORT) + serv.server_activate() + paths = ["/foo", "/foo/bar"] + for path in paths: + d = serv.add_dispatcher(path, SimpleXMLRPCServer.SimpleXMLRPCDispatcher()) + d.register_introspection_functions() + d.register_multicall_functions() + serv.get_dispatcher(paths[0]).register_function(pow) + serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add') + evt.set() + + # handle up to 'numrequests' requests + while numrequests > 0: + serv.handle_request() + numrequests -= 1 + + except socket.timeout: + pass + finally: + serv.socket.close() + PORT = None + evt.set() + +# This function prevents errors like: +# +def is_unavailable_exception(e): + '''Returns True if the given ProtocolError is the product of a server-side + exception caused by the 'temporarily unavailable' response sometimes + given by operations on non-blocking sockets.''' + + # sometimes we get a -1 error code and/or empty headers + try: + if e.errcode == -1 or e.headers is None: + return True + exc_mess = e.headers.get('X-exception') + except AttributeError: + # Ignore socket.errors here. + exc_mess = str(e) + + if exc_mess and 'temporarily unavailable' in exc_mess.lower(): + return True + + return False + + at unittest.skipUnless(threading, 'Threading required for this test.') +class BaseServerTestCase(unittest.TestCase): + requestHandler = None + request_count = 1 + threadFunc = staticmethod(http_server) + + def setUp(self): + # enable traceback reporting + SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True + + self.evt = threading.Event() + # start server thread to handle requests + serv_args = (self.evt, self.request_count, self.requestHandler) + threading.Thread(target=self.threadFunc, args=serv_args).start() + + # wait for the server to be ready + self.evt.wait(10) + self.evt.clear() + + def tearDown(self): + # wait on the server thread to terminate + self.evt.wait(10) + + # disable traceback reporting + SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False + +# NOTE: The tests in SimpleServerTestCase will ignore failures caused by +# "temporarily unavailable" exceptions raised in SimpleXMLRPCServer. This +# condition occurs infrequently on some platforms, frequently on others, and +# is apparently caused by using SimpleXMLRPCServer with a non-blocking socket +# If the server class is updated at some point in the future to handle this +# situation more gracefully, these tests should be modified appropriately. + +class SimpleServerTestCase(BaseServerTestCase): + def test_simple1(self): + try: + p = xmlrpclib.ServerProxy(URL) + self.assertEqual(p.pow(6,8), 6**8) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_nonascii(self): + start_string = 'P\N{LATIN SMALL LETTER Y WITH CIRCUMFLEX}t' + end_string = 'h\N{LATIN SMALL LETTER O WITH HORN}n' + + try: + p = xmlrpclib.ServerProxy(URL) + self.assertEqual(p.add(start_string, end_string), + start_string + end_string) + except (xmlrpclib.ProtocolError, socket.error) as e: + # ignore failures due to non-blocking socket unavailable errors. + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_unicode_host(self): + server = xmlrpclib.ServerProxy(u"http://%s:%d/RPC2"%(ADDR, PORT)) + self.assertEqual(server.add("a", u"\xe9"), u"a\xe9") + + # [ch] The test 404 is causing lots of false alarms. + def XXXtest_404(self): + # send POST with httplib, it should return 404 header and + # 'Not Found' message. + conn = httplib.HTTPConnection(ADDR, PORT) + conn.request('POST', '/this-is-not-valid') + response = conn.getresponse() + conn.close() + + self.assertEqual(response.status, 404) + self.assertEqual(response.reason, 'Not Found') + + def test_introspection1(self): + try: + p = xmlrpclib.ServerProxy(URL) + meth = p.system.listMethods() + expected_methods = set(['pow', 'div', 'my_function', 'add', + 'system.listMethods', 'system.methodHelp', + 'system.methodSignature', 'system.multicall']) + self.assertEqual(set(meth), expected_methods) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_introspection2(self): + try: + # test _methodHelp() + p = xmlrpclib.ServerProxy(URL) + divhelp = p.system.methodHelp('div') + self.assertEqual(divhelp, 'This is the div function') + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_introspection3(self): + try: + # test native doc + p = xmlrpclib.ServerProxy(URL) + myfunction = p.system.methodHelp('my_function') + self.assertEqual(myfunction, 'This is my function') + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_introspection4(self): + # the SimpleXMLRPCServer doesn't support signatures, but + # at least check that we can try making the call + try: + p = xmlrpclib.ServerProxy(URL) + divsig = p.system.methodSignature('div') + self.assertEqual(divsig, 'signatures not supported') + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_multicall(self): + try: + p = xmlrpclib.ServerProxy(URL) + multicall = xmlrpclib.MultiCall(p) + multicall.add(2,3) + multicall.pow(6,8) + multicall.div(127,42) + add_result, pow_result, div_result = multicall() + self.assertEqual(add_result, 2+3) + self.assertEqual(pow_result, 6**8) + self.assertEqual(div_result, 127//42) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_non_existing_multicall(self): + try: + p = xmlrpclib.ServerProxy(URL) + multicall = xmlrpclib.MultiCall(p) + multicall.this_is_not_exists() + result = multicall() + + # result.results contains; + # [{'faultCode': 1, 'faultString': ':' + # 'method "this_is_not_exists" is not supported'>}] + + self.assertEqual(result.results[0]['faultCode'], 1) + self.assertEqual(result.results[0]['faultString'], + ':method "this_is_not_exists" ' + 'is not supported') + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_dotted_attribute(self): + # Raises an AttributeError because private methods are not allowed. + self.assertRaises(AttributeError, + SimpleXMLRPCServer.resolve_dotted_attribute, str, '__add') + + self.assertTrue(SimpleXMLRPCServer.resolve_dotted_attribute(str, 'title')) + # Get the test to run faster by sending a request with test_simple1. + # This avoids waiting for the socket timeout. + self.test_simple1() + + def test_partial_post(self): + # Check that a partial POST doesn't make the server loop: issue #14001. + conn = httplib.HTTPConnection(ADDR, PORT) + conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.close() + +class MultiPathServerTestCase(BaseServerTestCase): + threadFunc = staticmethod(http_multi_server) + request_count = 2 + def test_path1(self): + p = xmlrpclib.ServerProxy(URL+"/foo") + self.assertEqual(p.pow(6,8), 6**8) + self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + def test_path2(self): + p = xmlrpclib.ServerProxy(URL+"/foo/bar") + self.assertEqual(p.add(6,8), 6+8) + self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) + +#A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism +#does indeed serve subsequent requests on the same connection +class BaseKeepaliveServerTestCase(BaseServerTestCase): + #a request handler that supports keep-alive and logs requests into a + #class variable + class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + parentClass = SimpleXMLRPCServer.SimpleXMLRPCRequestHandler + protocol_version = 'HTTP/1.1' + myRequests = [] + def handle(self): + self.myRequests.append([]) + self.reqidx = len(self.myRequests)-1 + return self.parentClass.handle(self) + def handle_one_request(self): + result = self.parentClass.handle_one_request(self) + self.myRequests[self.reqidx].append(self.raw_requestline) + return result + + requestHandler = RequestHandler + def setUp(self): + #clear request log + self.RequestHandler.myRequests = [] + return BaseServerTestCase.setUp(self) + +#A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism +#does indeed serve subsequent requests on the same connection +class KeepaliveServerTestCase1(BaseKeepaliveServerTestCase): + def test_two(self): + p = xmlrpclib.ServerProxy(URL) + #do three requests. + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + + #they should have all been handled by a single request handler + self.assertEqual(len(self.RequestHandler.myRequests), 1) + + #check that we did at least two (the third may be pending append + #due to thread scheduling) + self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2) + +#test special attribute access on the serverproxy, through the __call__ +#function. +class KeepaliveServerTestCase2(BaseKeepaliveServerTestCase): + #ask for two keepalive requests to be handled. + request_count=2 + + def test_close(self): + p = xmlrpclib.ServerProxy(URL) + #do some requests with close. + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + p("close")() #this should trigger a new keep-alive request + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(p.pow(6,8), 6**8) + + #they should have all been two request handlers, each having logged at least + #two complete requests + self.assertEqual(len(self.RequestHandler.myRequests), 2) + self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2) + self.assertGreaterEqual(len(self.RequestHandler.myRequests[-2]), 2) + + def test_transport(self): + p = xmlrpclib.ServerProxy(URL) + #do some requests with close. + self.assertEqual(p.pow(6,8), 6**8) + p("transport").close() #same as above, really. + self.assertEqual(p.pow(6,8), 6**8) + self.assertEqual(len(self.RequestHandler.myRequests), 2) + +#A test case that verifies that gzip encoding works in both directions +#(for a request and the response) +class GzipServerTestCase(BaseServerTestCase): + #a request handler that supports keep-alive and logs requests into a + #class variable + class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + parentClass = SimpleXMLRPCServer.SimpleXMLRPCRequestHandler + protocol_version = 'HTTP/1.1' + + def do_POST(self): + #store content of last request in class + self.__class__.content_length = int(self.headers["content-length"]) + return self.parentClass.do_POST(self) + requestHandler = RequestHandler + + class Transport(xmlrpclib.Transport): + #custom transport, stores the response length for our perusal + fake_gzip = False + def parse_response(self, response): + self.response_length=int(response.getheader("content-length", 0)) + return xmlrpclib.Transport.parse_response(self, response) + + def send_content(self, connection, body): + if self.fake_gzip: + #add a lone gzip header to induce decode error remotely + connection.putheader("Content-Encoding", "gzip") + return xmlrpclib.Transport.send_content(self, connection, body) + + def setUp(self): + BaseServerTestCase.setUp(self) + + def test_gzip_request(self): + t = self.Transport() + t.encode_threshold = None + p = xmlrpclib.ServerProxy(URL, transport=t) + self.assertEqual(p.pow(6,8), 6**8) + a = self.RequestHandler.content_length + t.encode_threshold = 0 #turn on request encoding + self.assertEqual(p.pow(6,8), 6**8) + b = self.RequestHandler.content_length + self.assertTrue(a>b) + + def test_bad_gzip_request(self): + t = self.Transport() + t.encode_threshold = None + t.fake_gzip = True + p = xmlrpclib.ServerProxy(URL, transport=t) + cm = self.assertRaisesRegexp(xmlrpclib.ProtocolError, + re.compile(r"\b400\b")) + with cm: + p.pow(6, 8) + + def test_gsip_response(self): + t = self.Transport() + p = xmlrpclib.ServerProxy(URL, transport=t) + old = self.requestHandler.encode_threshold + self.requestHandler.encode_threshold = None #no encoding + self.assertEqual(p.pow(6,8), 6**8) + a = t.response_length + self.requestHandler.encode_threshold = 0 #always encode + self.assertEqual(p.pow(6,8), 6**8) + b = t.response_length + self.requestHandler.encode_threshold = old + self.assertTrue(a>b) + +#Test special attributes of the ServerProxy object +class ServerProxyTestCase(unittest.TestCase): + def setUp(self): + unittest.TestCase.setUp(self) + if threading: + self.url = URL + else: + # Without threading, http_server() and http_multi_server() will not + # be executed and URL is still equal to None. 'http://' is a just + # enough to choose the scheme (HTTP) + self.url = 'http://' + + def test_close(self): + p = xmlrpclib.ServerProxy(self.url) + self.assertEqual(p('close')(), None) + + def test_transport(self): + t = xmlrpclib.Transport() + p = xmlrpclib.ServerProxy(self.url, transport=t) + self.assertEqual(p('transport'), t) + +# This is a contrived way to make a failure occur on the server side +# in order to test the _send_traceback_header flag on the server +class FailingMessageClass(mimetools.Message): + def __getitem__(self, key): + key = key.lower() + if key == 'content-length': + return 'I am broken' + return mimetools.Message.__getitem__(self, key) + + + at unittest.skipUnless(threading, 'Threading required for this test.') +class FailingServerTestCase(unittest.TestCase): + def setUp(self): + self.evt = threading.Event() + # start server thread to handle requests + serv_args = (self.evt, 1) + threading.Thread(target=http_server, args=serv_args).start() + + # wait for the server to be ready + self.evt.wait() + self.evt.clear() + + def tearDown(self): + # wait on the server thread to terminate + self.evt.wait() + # reset flag + SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False + # reset message class + SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = mimetools.Message + + def test_basic(self): + # check that flag is false by default + flagval = SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header + self.assertEqual(flagval, False) + + # enable traceback reporting + SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True + + # test a call that shouldn't fail just as a smoke test + try: + p = xmlrpclib.ServerProxy(URL) + self.assertEqual(p.pow(6,8), 6**8) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + + def test_fail_no_info(self): + # use the broken message class + SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass + + try: + p = xmlrpclib.ServerProxy(URL) + p.pow(6,8) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e) and hasattr(e, "headers"): + # The two server-side error headers shouldn't be sent back in this case + self.assertTrue(e.headers.get("X-exception") is None) + self.assertTrue(e.headers.get("X-traceback") is None) + else: + self.fail('ProtocolError not raised') + + def test_fail_with_info(self): + # use the broken message class + SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass + + # Check that errors in the server send back exception/traceback + # info when flag is set + SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True + + try: + p = xmlrpclib.ServerProxy(URL) + p.pow(6,8) + except (xmlrpclib.ProtocolError, socket.error), e: + # ignore failures due to non-blocking socket 'unavailable' errors + if not is_unavailable_exception(e) and hasattr(e, "headers"): + # We should get error info in the response + expected_err = "invalid literal for int() with base 10: 'I am broken'" + self.assertEqual(e.headers.get("x-exception"), expected_err) + self.assertTrue(e.headers.get("x-traceback") is not None) + else: + self.fail('ProtocolError not raised') + +class CGIHandlerTestCase(unittest.TestCase): + def setUp(self): + self.cgi = SimpleXMLRPCServer.CGIXMLRPCRequestHandler() + + def tearDown(self): + self.cgi = None + + def test_cgi_get(self): + with test_support.EnvironmentVarGuard() as env: + env['REQUEST_METHOD'] = 'GET' + # if the method is GET and no request_text is given, it runs handle_get + # get sysout output + with test_support.captured_stdout() as data_out: + self.cgi.handle_request() + + # parse Status header + data_out.seek(0) + handle = data_out.read() + status = handle.split()[1] + message = ' '.join(handle.split()[2:4]) + + self.assertEqual(status, '400') + self.assertEqual(message, 'Bad Request') + + + def test_cgi_xmlrpc_response(self): + data = """ + + test_method + + + foo + + + bar + + + + """ + + with test_support.EnvironmentVarGuard() as env, \ + test_support.captured_stdout() as data_out, \ + test_support.captured_stdin() as data_in: + data_in.write(data) + data_in.seek(0) + env['CONTENT_LENGTH'] = str(len(data)) + self.cgi.handle_request() + data_out.seek(0) + + # will respond exception, if so, our goal is achieved ;) + handle = data_out.read() + + # start with 44th char so as not to get http header, we just need only xml + self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, handle[44:]) + + # Also test the content-length returned by handle_request + # Using the same test method inorder to avoid all the datapassing + # boilerplate code. + # Test for bug: http://bugs.python.org/issue5040 + + content = handle[handle.find(" http://hg.python.org/jython/rev/ba74f5e6dcd8 changeset: 6429:ba74f5e6dcd8 user: Frank Wierzbicki date: Mon Mar 19 22:18:09 2012 -0700 summary: Commented failing tests with issue #1857. files: Lib/test/test_xmlrpc.py | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -91,6 +91,7 @@ s = xmlrpclib.dumps((new_d,), methodresponse=True) self.assertIsInstance(s, str) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_newstyle_class(self): class T(object): pass @@ -145,6 +146,7 @@ xmlrpclib.loads(strg)[0][0]) self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,)) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_default_encoding_issues(self): # SF bug #1115989: wrong decoding in '_stringify' utf8 = """ @@ -448,6 +450,7 @@ # situation more gracefully, these tests should be modified appropriately. class SimpleServerTestCase(BaseServerTestCase): + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_simple1(self): try: p = xmlrpclib.ServerProxy(URL) @@ -458,6 +461,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_nonascii(self): start_string = 'P\N{LATIN SMALL LETTER Y WITH CIRCUMFLEX}t' end_string = 'h\N{LATIN SMALL LETTER O WITH HORN}n' @@ -472,6 +476,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_unicode_host(self): server = xmlrpclib.ServerProxy(u"http://%s:%d/RPC2"%(ADDR, PORT)) self.assertEqual(server.add("a", u"\xe9"), u"a\xe9") @@ -488,6 +493,7 @@ self.assertEqual(response.status, 404) self.assertEqual(response.reason, 'Not Found') + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_introspection1(self): try: p = xmlrpclib.ServerProxy(URL) @@ -502,6 +508,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_introspection2(self): try: # test _methodHelp() @@ -514,6 +521,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") def test_introspection3(self): @@ -528,6 +536,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_introspection4(self): # the SimpleXMLRPCServer doesn't support signatures, but # at least check that we can try making the call @@ -541,6 +550,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_multicall(self): try: p = xmlrpclib.ServerProxy(URL) @@ -558,6 +568,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_non_existing_multicall(self): try: p = xmlrpclib.ServerProxy(URL) @@ -579,6 +590,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_dotted_attribute(self): # Raises an AttributeError because private methods are not allowed. self.assertRaises(AttributeError, @@ -589,6 +601,7 @@ # This avoids waiting for the socket timeout. self.test_simple1() + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. conn = httplib.HTTPConnection(ADDR, PORT) @@ -598,10 +611,12 @@ class MultiPathServerTestCase(BaseServerTestCase): threadFunc = staticmethod(http_multi_server) request_count = 2 + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_path1(self): p = xmlrpclib.ServerProxy(URL+"/foo") self.assertEqual(p.pow(6,8), 6**8) self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_path2(self): p = xmlrpclib.ServerProxy(URL+"/foo/bar") self.assertEqual(p.add(6,8), 6+8) @@ -634,6 +649,7 @@ #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism #does indeed serve subsequent requests on the same connection class KeepaliveServerTestCase1(BaseKeepaliveServerTestCase): + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_two(self): p = xmlrpclib.ServerProxy(URL) #do three requests. @@ -654,6 +670,7 @@ #ask for two keepalive requests to be handled. request_count=2 + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_close(self): p = xmlrpclib.ServerProxy(URL) #do some requests with close. @@ -671,6 +688,7 @@ self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2) self.assertGreaterEqual(len(self.RequestHandler.myRequests[-2]), 2) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_transport(self): p = xmlrpclib.ServerProxy(URL) #do some requests with close. @@ -710,6 +728,7 @@ def setUp(self): BaseServerTestCase.setUp(self) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_gzip_request(self): t = self.Transport() t.encode_threshold = None @@ -721,6 +740,7 @@ b = self.RequestHandler.content_length self.assertTrue(a>b) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_bad_gzip_request(self): t = self.Transport() t.encode_threshold = None @@ -731,6 +751,7 @@ with cm: p.pow(6, 8) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_gsip_response(self): t = self.Transport() p = xmlrpclib.ServerProxy(URL, transport=t) @@ -756,10 +777,12 @@ # enough to choose the scheme (HTTP) self.url = 'http://' + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_close(self): p = xmlrpclib.ServerProxy(self.url) self.assertEqual(p('close')(), None) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_transport(self): t = xmlrpclib.Transport() p = xmlrpclib.ServerProxy(self.url, transport=t) @@ -795,6 +818,7 @@ # reset message class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = mimetools.Message + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_basic(self): # check that flag is false by default flagval = SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header @@ -813,6 +837,7 @@ # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_fail_no_info(self): # use the broken message class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass @@ -829,6 +854,7 @@ else: self.fail('ProtocolError not raised') + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_fail_with_info(self): # use the broken message class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass @@ -857,6 +883,7 @@ def tearDown(self): self.cgi = None + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_cgi_get(self): with test_support.EnvironmentVarGuard() as env: env['REQUEST_METHOD'] = 'GET' @@ -875,6 +902,7 @@ self.assertEqual(message, 'Bad Request') + @unittest.skipIf(test_support.is_jython, "FIXME: #1857 not working in Jython") def test_cgi_xmlrpc_response(self): data = """ -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 18:59:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 18:59:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_comment_with_FIXME_=231859_f?= =?utf8?q?or_test=5Fzlib=2Epy=2E?= Message-ID: http://hg.python.org/jython/rev/d3377c4116bc changeset: 6431:d3377c4116bc user: Frank Wierzbicki date: Tue Mar 20 10:58:54 2012 -0700 summary: comment with FIXME #1859 for test_zlib.py. files: Lib/test/test_zlib.py | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -2,7 +2,7 @@ from test.test_support import TESTFN, run_unittest, import_module, unlink, requires import binascii import random -from test.test_support import precisionbigmemtest, _1G, _4G +from test.test_support import precisionbigmemtest, _1G, _4G, is_jython import sys try: @@ -24,10 +24,12 @@ self.assertEqual(zlib.crc32("", 1), 1) self.assertEqual(zlib.crc32("", 432), 432) + @unittest.skipIf(is_jython, "FIXME #1859: not working on Jython") def test_adler32start(self): self.assertEqual(zlib.adler32(""), zlib.adler32("", 1)) self.assertTrue(zlib.adler32("abc", 0xffffffff)) + @unittest.skipIf(is_jython, "FIXME #1859: not working on Jython") def test_adler32empty(self): self.assertEqual(zlib.adler32("", 0), 0) self.assertEqual(zlib.adler32("", 1), 1) @@ -38,6 +40,7 @@ # This is important if bit 31 (0x08000000L) is set. self.assertEqual(seen & 0x0FFFFFFFFL, expected & 0x0FFFFFFFFL) + @unittest.skipIf(is_jython, "FIXME #1859: not working on Jython") def test_penguins(self): self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120L) self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94) @@ -98,6 +101,7 @@ class BaseCompressTestCase(object): + @unittest.skipIf(is_jython, "FIXME #1859: appears to hang on Jython") def check_big_compress_buffer(self, size, compress_func): _1M = 1024 * 1024 fmt = "%%0%dx" % (2 * _1M) @@ -113,6 +117,7 @@ # Release memory data = None + @unittest.skipIf(is_jython, "FIXME #1859: appears to hang on Jython") def check_big_decompress_buffer(self, size, decompress_func): data = 'x' * size try: @@ -141,6 +146,7 @@ x = zlib.compress(data) self.assertEqual(zlib.decompress(x), data) + @unittest.skipIf(is_jython, "FIXME #1859: not working on Jython") def test_incomplete_stream(self): # An useful error message is given x = zlib.compress(HAMLET_SCENE) @@ -383,6 +389,7 @@ dco = zlib.decompressobj() self.assertEqual(dco.flush(), "") # Returns nothing + @unittest.skipIf(is_jython, "FIXME #1859: not working on Jython") def test_decompress_incomplete_stream(self): # This is 'foo', deflated x = 'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E' -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 18:59:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 18:59:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_from=3A?= Message-ID: http://hg.python.org/jython/rev/7f23b21c8385 changeset: 6430:7f23b21c8385 user: Frank Wierzbicki date: Tue Mar 20 09:52:54 2012 -0700 summary: from: http://hg.python.org/cpython/Lib/test/test_zlib.py at 22db03646d9b files: Lib/test/test_zlib.py | 60 ++++++++++++++++-------------- 1 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -1,16 +1,23 @@ import unittest -from test import test_support -import zlib +from test.test_support import TESTFN, run_unittest, import_module, unlink, requires import binascii import random -from test.test_support import precisionbigmemtest, _1G +from test.test_support import precisionbigmemtest, _1G, _4G +import sys + +try: + import mmap +except ImportError: + mmap = None + +zlib = import_module('zlib') class ChecksumTestCase(unittest.TestCase): # checksum test cases def test_crc32start(self): self.assertEqual(zlib.crc32(""), zlib.crc32("", 0)) - self.assert_(zlib.crc32("abc", 0xffffffff)) + self.assertTrue(zlib.crc32("abc", 0xffffffff)) def test_crc32empty(self): self.assertEqual(zlib.crc32("", 0), 0) @@ -19,16 +26,12 @@ def test_adler32start(self): self.assertEqual(zlib.adler32(""), zlib.adler32("", 1)) - # XXX: Jython adler32 only supports start value of 1 - if not test_support.is_jython: - self.assert_(zlib.adler32("abc", 0xffffffff)) + self.assertTrue(zlib.adler32("abc", 0xffffffff)) def test_adler32empty(self): - if not test_support.is_jython: - self.assertEqual(zlib.adler32("", 0), 0) + self.assertEqual(zlib.adler32("", 0), 0) self.assertEqual(zlib.adler32("", 1), 1) - if not test_support.is_jython: - self.assertEqual(zlib.adler32("", 432), 432) + self.assertEqual(zlib.adler32("", 432), 432) def assertEqual32(self, seen, expected): # 32-bit values masked -- checksums on 32- vs 64- bit machines @@ -38,8 +41,7 @@ def test_penguins(self): self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120L) self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94) - if not test_support.is_jython: - self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6) + self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6) self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7) self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0)) @@ -69,8 +71,6 @@ self.assertEqual(zlib.crc32('spam', -(2**31)), zlib.crc32('spam', (2**31))) - def test_decompress_badinput(self): - self.assertRaises(zlib.error, zlib.decompress, 'foo') class ExceptionTestCase(unittest.TestCase): # make sure we generate some expected errors @@ -144,14 +144,9 @@ def test_incomplete_stream(self): # An useful error message is given x = zlib.compress(HAMLET_SCENE) - try: - zlib.decompress(x[:-1]) - except zlib.error as e: - self.assertTrue( - "Error -5 while decompressing data: incomplete or truncated stream" - in str(e), str(e)) - else: - self.fail("zlib.error not raised") + self.assertRaisesRegexp(zlib.error, + "Error -5 while decompressing data: incomplete or truncated stream", + zlib.decompress, x[:-1]) # Memory use of the following functions takes into account overallocation @@ -267,7 +262,7 @@ while cb: #max_length = 1 + len(cb)//10 chunk = dco.decompress(cb, dcx) - self.failIf(len(chunk) > dcx, + self.assertFalse(len(chunk) > dcx, 'chunk too big (%d>%d)' % (len(chunk), dcx)) bufs.append(chunk) cb = dco.unconsumed_tail @@ -292,7 +287,7 @@ while cb: max_length = 1 + len(cb)//10 chunk = dco.decompress(cb, max_length) - self.failIf(len(chunk) > max_length, + self.assertFalse(len(chunk) > max_length, 'chunk too big (%d>%d)' % (len(chunk),max_length)) bufs.append(chunk) cb = dco.unconsumed_tail @@ -301,7 +296,7 @@ else: while chunk: chunk = dco.decompress('', max_length) - self.failIf(len(chunk) > max_length, + self.assertFalse(len(chunk) > max_length, 'chunk too big (%d>%d)' % (len(chunk),max_length)) bufs.append(chunk) self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved') @@ -315,6 +310,15 @@ self.assertRaises(ValueError, dco.decompress, "", -1) self.assertEqual('', dco.unconsumed_tail) + def test_clear_unconsumed_tail(self): + # Issue #12050: calling decompress() without providing max_length + # should clear the unconsumed_tail attribute. + cdata = "x\x9cKLJ\x06\x00\x02M\x01" # "abc" + dco = zlib.decompressobj() + ddata = dco.decompress(cdata, 1) + ddata += dco.decompress(dco.unconsumed_tail) + self.assertEqual(dco.unconsumed_tail, "") + def test_flushes(self): # Test flush() with the various options, using all the # different levels in order to provide more variations. @@ -375,7 +379,7 @@ # caused a core dump.) co = zlib.compressobj(zlib.Z_BEST_COMPRESSION) - self.failUnless(co.flush()) # Returns a zlib header + self.assertTrue(co.flush()) # Returns a zlib header dco = zlib.decompressobj() self.assertEqual(dco.flush(), "") # Returns nothing @@ -557,7 +561,7 @@ def test_main(): - test_support.run_unittest( + run_unittest( ChecksumTestCase, ExceptionTestCase, CompressTestCase, -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 19:48:58 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 19:48:58 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_commented_out_failures_see_?= =?utf8?b?IzE4NjAu?= Message-ID: http://hg.python.org/jython/rev/49a0a126e5d0 changeset: 6432:49a0a126e5d0 user: Frank Wierzbicki date: Tue Mar 20 11:48:50 2012 -0700 summary: commented out failures see #1860. files: Lib/test/test_array.py | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -653,6 +653,7 @@ self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b) self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b) + @unittest.skipIf(test_support.is_jython, "FIXME #1860: Not working on Jython") def test_extended_set_del_slice(self): indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) for start in indices: @@ -937,7 +938,9 @@ self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9])) # test issue7788 a = array.array(self.typecode, range(10)) - del a[9::1<<333] + # FIXME #1860: not working on Jython yet. + if not test_support.is_jython: + del a[9::1<<333] def test_assignment(self): a = array.array(self.typecode, range(10)) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 19:57:22 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 19:57:22 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_from=3A?= Message-ID: http://hg.python.org/jython/rev/54e74681784e changeset: 6433:54e74681784e user: Frank Wierzbicki date: Tue Mar 20 11:55:13 2012 -0700 summary: from: http://hg.python.org/cpython/Lib/test/test_dict.py at 22db03646d9b files: Lib/test/test_dict.py | 696 ++++++++++++++++++++++++++++++ 1 files changed, 696 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_dict.py @@ -0,0 +1,696 @@ +import unittest +from test import test_support + +import UserDict, random, string +import gc, weakref + + +class DictTest(unittest.TestCase): + def test_constructor(self): + # calling built-in types without argument must return empty + self.assertEqual(dict(), {}) + self.assertIsNot(dict(), {}) + + def test_literal_constructor(self): + # check literal constructor for different sized dicts + # (to exercise the BUILD_MAP oparg). + for n in (0, 1, 6, 256, 400): + items = [(''.join(random.sample(string.letters, 8)), i) + for i in range(n)] + random.shuffle(items) + formatted_items = ('{!r}: {:d}'.format(k, v) for k, v in items) + dictliteral = '{' + ', '.join(formatted_items) + '}' + self.assertEqual(eval(dictliteral), dict(items)) + + def test_bool(self): + self.assertIs(not {}, True) + self.assertTrue({1: 2}) + self.assertIs(bool({}), False) + self.assertIs(bool({1: 2}), True) + + def test_keys(self): + d = {} + self.assertEqual(d.keys(), []) + d = {'a': 1, 'b': 2} + k = d.keys() + self.assertTrue(d.has_key('a')) + self.assertTrue(d.has_key('b')) + + self.assertRaises(TypeError, d.keys, None) + + def test_values(self): + d = {} + self.assertEqual(d.values(), []) + d = {1:2} + self.assertEqual(d.values(), [2]) + + self.assertRaises(TypeError, d.values, None) + + def test_items(self): + d = {} + self.assertEqual(d.items(), []) + + d = {1:2} + self.assertEqual(d.items(), [(1, 2)]) + + self.assertRaises(TypeError, d.items, None) + + def test_has_key(self): + d = {} + self.assertFalse(d.has_key('a')) + d = {'a': 1, 'b': 2} + k = d.keys() + k.sort() + self.assertEqual(k, ['a', 'b']) + + self.assertRaises(TypeError, d.has_key) + + def test_contains(self): + d = {} + self.assertNotIn('a', d) + self.assertFalse('a' in d) + self.assertTrue('a' not in d) + d = {'a': 1, 'b': 2} + self.assertIn('a', d) + self.assertIn('b', d) + self.assertNotIn('c', d) + + self.assertRaises(TypeError, d.__contains__) + + def test_len(self): + d = {} + self.assertEqual(len(d), 0) + d = {'a': 1, 'b': 2} + self.assertEqual(len(d), 2) + + def test_getitem(self): + d = {'a': 1, 'b': 2} + self.assertEqual(d['a'], 1) + self.assertEqual(d['b'], 2) + d['c'] = 3 + d['a'] = 4 + self.assertEqual(d['c'], 3) + self.assertEqual(d['a'], 4) + del d['b'] + self.assertEqual(d, {'a': 4, 'c': 3}) + + self.assertRaises(TypeError, d.__getitem__) + + class BadEq(object): + def __eq__(self, other): + raise Exc() + def __hash__(self): + return 24 + + d = {} + d[BadEq()] = 42 + self.assertRaises(KeyError, d.__getitem__, 23) + + class Exc(Exception): pass + + class BadHash(object): + fail = False + def __hash__(self): + if self.fail: + raise Exc() + else: + return 42 + + x = BadHash() + d[x] = 42 + x.fail = True + self.assertRaises(Exc, d.__getitem__, x) + + def test_clear(self): + d = {1:1, 2:2, 3:3} + d.clear() + self.assertEqual(d, {}) + + self.assertRaises(TypeError, d.clear, None) + + def test_update(self): + d = {} + d.update({1:100}) + d.update({2:20}) + d.update({1:1, 2:2, 3:3}) + self.assertEqual(d, {1:1, 2:2, 3:3}) + + d.update() + self.assertEqual(d, {1:1, 2:2, 3:3}) + + self.assertRaises((TypeError, AttributeError), d.update, None) + + class SimpleUserDict: + def __init__(self): + self.d = {1:1, 2:2, 3:3} + def keys(self): + return self.d.keys() + def __getitem__(self, i): + return self.d[i] + d.clear() + d.update(SimpleUserDict()) + self.assertEqual(d, {1:1, 2:2, 3:3}) + + class Exc(Exception): pass + + d.clear() + class FailingUserDict: + def keys(self): + raise Exc + self.assertRaises(Exc, d.update, FailingUserDict()) + + class FailingUserDict: + def keys(self): + class BogonIter: + def __init__(self): + self.i = 1 + def __iter__(self): + return self + def next(self): + if self.i: + self.i = 0 + return 'a' + raise Exc + return BogonIter() + def __getitem__(self, key): + return key + self.assertRaises(Exc, d.update, FailingUserDict()) + + class FailingUserDict: + def keys(self): + class BogonIter: + def __init__(self): + self.i = ord('a') + def __iter__(self): + return self + def next(self): + if self.i <= ord('z'): + rtn = chr(self.i) + self.i += 1 + return rtn + raise StopIteration + return BogonIter() + def __getitem__(self, key): + raise Exc + self.assertRaises(Exc, d.update, FailingUserDict()) + + class badseq(object): + def __iter__(self): + return self + def next(self): + raise Exc() + + self.assertRaises(Exc, {}.update, badseq()) + + self.assertRaises(ValueError, {}.update, [(1, 2, 3)]) + + def test_fromkeys(self): + self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) + d = {} + self.assertIsNot(d.fromkeys('abc'), d) + self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) + self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) + self.assertEqual(d.fromkeys([]), {}) + def g(): + yield 1 + self.assertEqual(d.fromkeys(g()), {1:None}) + self.assertRaises(TypeError, {}.fromkeys, 3) + class dictlike(dict): pass + self.assertEqual(dictlike.fromkeys('a'), {'a':None}) + self.assertEqual(dictlike().fromkeys('a'), {'a':None}) + self.assertIsInstance(dictlike.fromkeys('a'), dictlike) + self.assertIsInstance(dictlike().fromkeys('a'), dictlike) + class mydict(dict): + def __new__(cls): + return UserDict.UserDict() + ud = mydict.fromkeys('ab') + self.assertEqual(ud, {'a':None, 'b':None}) + self.assertIsInstance(ud, UserDict.UserDict) + self.assertRaises(TypeError, dict.fromkeys) + + class Exc(Exception): pass + + class baddict1(dict): + def __init__(self): + raise Exc() + + self.assertRaises(Exc, baddict1.fromkeys, [1]) + + class BadSeq(object): + def __iter__(self): + return self + def next(self): + raise Exc() + + self.assertRaises(Exc, dict.fromkeys, BadSeq()) + + class baddict2(dict): + def __setitem__(self, key, value): + raise Exc() + + self.assertRaises(Exc, baddict2.fromkeys, [1]) + + # test fast path for dictionary inputs + d = dict(zip(range(6), range(6))) + self.assertEqual(dict.fromkeys(d, 0), dict(zip(range(6), [0]*6))) + + def test_copy(self): + d = {1:1, 2:2, 3:3} + self.assertEqual(d.copy(), {1:1, 2:2, 3:3}) + self.assertEqual({}.copy(), {}) + self.assertRaises(TypeError, d.copy, None) + + def test_get(self): + d = {} + self.assertIs(d.get('c'), None) + self.assertEqual(d.get('c', 3), 3) + d = {'a': 1, 'b': 2} + self.assertIs(d.get('c'), None) + self.assertEqual(d.get('c', 3), 3) + self.assertEqual(d.get('a'), 1) + self.assertEqual(d.get('a', 3), 1) + self.assertRaises(TypeError, d.get) + self.assertRaises(TypeError, d.get, None, None, None) + + def test_setdefault(self): + # dict.setdefault() + d = {} + self.assertIs(d.setdefault('key0'), None) + d.setdefault('key0', []) + self.assertIs(d.setdefault('key0'), None) + d.setdefault('key', []).append(3) + self.assertEqual(d['key'][0], 3) + d.setdefault('key', []).append(4) + self.assertEqual(len(d['key']), 2) + self.assertRaises(TypeError, d.setdefault) + + class Exc(Exception): pass + + class BadHash(object): + fail = False + def __hash__(self): + if self.fail: + raise Exc() + else: + return 42 + + x = BadHash() + d[x] = 42 + x.fail = True + self.assertRaises(Exc, d.setdefault, x, []) + + def test_setdefault_atomic(self): + # Issue #13521: setdefault() calls __hash__ and __eq__ only once. + class Hashed(object): + def __init__(self): + self.hash_count = 0 + self.eq_count = 0 + def __hash__(self): + self.hash_count += 1 + return 42 + def __eq__(self, other): + self.eq_count += 1 + return id(self) == id(other) + hashed1 = Hashed() + y = {hashed1: 5} + hashed2 = Hashed() + y.setdefault(hashed2, []) + self.assertEqual(hashed1.hash_count, 1) + self.assertEqual(hashed2.hash_count, 1) + self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1) + + def test_popitem(self): + # dict.popitem() + for copymode in -1, +1: + # -1: b has same structure as a + # +1: b is a.copy() + for log2size in range(12): + size = 2**log2size + a = {} + b = {} + for i in range(size): + a[repr(i)] = i + if copymode < 0: + b[repr(i)] = i + if copymode > 0: + b = a.copy() + for i in range(size): + ka, va = ta = a.popitem() + self.assertEqual(va, int(ka)) + kb, vb = tb = b.popitem() + self.assertEqual(vb, int(kb)) + self.assertFalse(copymode < 0 and ta != tb) + self.assertFalse(a) + self.assertFalse(b) + + d = {} + self.assertRaises(KeyError, d.popitem) + + def test_pop(self): + # Tests for pop with specified key + d = {} + k, v = 'abc', 'def' + d[k] = v + self.assertRaises(KeyError, d.pop, 'ghi') + + self.assertEqual(d.pop(k), v) + self.assertEqual(len(d), 0) + + self.assertRaises(KeyError, d.pop, k) + + # verify longs/ints get same value when key > 32 bits + # (for 64-bit archs). See SF bug #689659. + x = 4503599627370496L + y = 4503599627370496 + h = {x: 'anything', y: 'something else'} + self.assertEqual(h[x], h[y]) + + self.assertEqual(d.pop(k, v), v) + d[k] = v + self.assertEqual(d.pop(k, 1), v) + + self.assertRaises(TypeError, d.pop) + + class Exc(Exception): pass + + class BadHash(object): + fail = False + def __hash__(self): + if self.fail: + raise Exc() + else: + return 42 + + x = BadHash() + d[x] = 42 + x.fail = True + self.assertRaises(Exc, d.pop, x) + + def test_mutatingiteration(self): + # changing dict size during iteration + d = {} + d[1] = 1 + with self.assertRaises(RuntimeError): + for i in d: + d[i+1] = 1 + + def test_repr(self): + d = {} + self.assertEqual(repr(d), '{}') + d[1] = 2 + self.assertEqual(repr(d), '{1: 2}') + d = {} + d[1] = d + self.assertEqual(repr(d), '{1: {...}}') + + class Exc(Exception): pass + + class BadRepr(object): + def __repr__(self): + raise Exc() + + d = {1: BadRepr()} + self.assertRaises(Exc, repr, d) + + def test_le(self): + self.assertFalse({} < {}) + self.assertFalse({1: 2} < {1L: 2L}) + + class Exc(Exception): pass + + class BadCmp(object): + def __eq__(self, other): + raise Exc() + def __hash__(self): + return 42 + + d1 = {BadCmp(): 1} + d2 = {1: 1} + + with self.assertRaises(Exc): + d1 < d2 + + def test_missing(self): + # Make sure dict doesn't have a __missing__ method + self.assertFalse(hasattr(dict, "__missing__")) + self.assertFalse(hasattr({}, "__missing__")) + # Test several cases: + # (D) subclass defines __missing__ method returning a value + # (E) subclass defines __missing__ method raising RuntimeError + # (F) subclass sets __missing__ instance variable (no effect) + # (G) subclass doesn't define __missing__ at a all + class D(dict): + def __missing__(self, key): + return 42 + d = D({1: 2, 3: 4}) + self.assertEqual(d[1], 2) + self.assertEqual(d[3], 4) + self.assertNotIn(2, d) + self.assertNotIn(2, d.keys()) + self.assertEqual(d[2], 42) + + class E(dict): + def __missing__(self, key): + raise RuntimeError(key) + e = E() + with self.assertRaises(RuntimeError) as c: + e[42] + self.assertEqual(c.exception.args, (42,)) + + class F(dict): + def __init__(self): + # An instance variable __missing__ should have no effect + self.__missing__ = lambda key: None + f = F() + with self.assertRaises(KeyError) as c: + f[42] + self.assertEqual(c.exception.args, (42,)) + + class G(dict): + pass + g = G() + with self.assertRaises(KeyError) as c: + g[42] + self.assertEqual(c.exception.args, (42,)) + + def test_tuple_keyerror(self): + # SF #1576657 + d = {} + with self.assertRaises(KeyError) as c: + d[(1,)] + self.assertEqual(c.exception.args, ((1,),)) + + def test_bad_key(self): + # Dictionary lookups should fail if __cmp__() raises an exception. + class CustomException(Exception): + pass + + class BadDictKey: + def __hash__(self): + return hash(self.__class__) + + def __cmp__(self, other): + if isinstance(other, self.__class__): + raise CustomException + return other + + d = {} + x1 = BadDictKey() + x2 = BadDictKey() + d[x1] = 1 + for stmt in ['d[x2] = 2', + 'z = d[x2]', + 'x2 in d', + 'd.has_key(x2)', + 'd.get(x2)', + 'd.setdefault(x2, 42)', + 'd.pop(x2)', + 'd.update({x2: 2})']: + with self.assertRaises(CustomException): + exec stmt in locals() + + def test_resize1(self): + # Dict resizing bug, found by Jack Jansen in 2.2 CVS development. + # This version got an assert failure in debug build, infinite loop in + # release build. Unfortunately, provoking this kind of stuff requires + # a mix of inserts and deletes hitting exactly the right hash codes in + # exactly the right order, and I can't think of a randomized approach + # that would be *likely* to hit a failing case in reasonable time. + + d = {} + for i in range(5): + d[i] = i + for i in range(5): + del d[i] + for i in range(5, 9): # i==8 was the problem + d[i] = i + + def test_resize2(self): + # Another dict resizing bug (SF bug #1456209). + # This caused Segmentation faults or Illegal instructions. + + class X(object): + def __hash__(self): + return 5 + def __eq__(self, other): + if resizing: + d.clear() + return False + d = {} + resizing = False + d[X()] = 1 + d[X()] = 2 + d[X()] = 3 + d[X()] = 4 + d[X()] = 5 + # now trigger a resize + resizing = True + d[9] = 6 + + def test_empty_presized_dict_in_freelist(self): + # Bug #3537: if an empty but presized dict with a size larger + # than 7 was in the freelist, it triggered an assertion failure + with self.assertRaises(ZeroDivisionError): + d = {'a': 1 // 0, 'b': None, 'c': None, 'd': None, 'e': None, + 'f': None, 'g': None, 'h': None} + d = {} + + def test_container_iterator(self): + # Bug #3680: tp_traverse was not implemented for dictiter objects + class C(object): + pass + iterators = (dict.iteritems, dict.itervalues, dict.iterkeys) + for i in iterators: + obj = C() + ref = weakref.ref(obj) + container = {obj: 1} + obj.x = i(container) + del obj, container + gc.collect() + self.assertIs(ref(), None, "Cycle was not collected") + + def _not_tracked(self, t): + # Nested containers can take several collections to untrack + gc.collect() + gc.collect() + self.assertFalse(gc.is_tracked(t), t) + + def _tracked(self, t): + self.assertTrue(gc.is_tracked(t), t) + gc.collect() + gc.collect() + self.assertTrue(gc.is_tracked(t), t) + + @test_support.cpython_only + def test_track_literals(self): + # Test GC-optimization of dict literals + x, y, z, w = 1.5, "a", (1, None), [] + + self._not_tracked({}) + self._not_tracked({x:(), y:x, z:1}) + self._not_tracked({1: "a", "b": 2}) + self._not_tracked({1: 2, (None, True, False, ()): int}) + self._not_tracked({1: object()}) + + # Dicts with mutable elements are always tracked, even if those + # elements are not tracked right now. + self._tracked({1: []}) + self._tracked({1: ([],)}) + self._tracked({1: {}}) + self._tracked({1: set()}) + + @test_support.cpython_only + def test_track_dynamic(self): + # Test GC-optimization of dynamically-created dicts + class MyObject(object): + pass + x, y, z, w, o = 1.5, "a", (1, object()), [], MyObject() + + d = dict() + self._not_tracked(d) + d[1] = "a" + self._not_tracked(d) + d[y] = 2 + self._not_tracked(d) + d[z] = 3 + self._not_tracked(d) + self._not_tracked(d.copy()) + d[4] = w + self._tracked(d) + self._tracked(d.copy()) + d[4] = None + self._not_tracked(d) + self._not_tracked(d.copy()) + + # dd isn't tracked right now, but it may mutate and therefore d + # which contains it must be tracked. + d = dict() + dd = dict() + d[1] = dd + self._not_tracked(dd) + self._tracked(d) + dd[1] = d + self._tracked(dd) + + d = dict.fromkeys([x, y, z]) + self._not_tracked(d) + dd = dict() + dd.update(d) + self._not_tracked(dd) + d = dict.fromkeys([x, y, z, o]) + self._tracked(d) + dd = dict() + dd.update(d) + self._tracked(dd) + + d = dict(x=x, y=y, z=z) + self._not_tracked(d) + d = dict(x=x, y=y, z=z, w=w) + self._tracked(d) + d = dict() + d.update(x=x, y=y, z=z) + self._not_tracked(d) + d.update(w=w) + self._tracked(d) + + d = dict([(x, y), (z, 1)]) + self._not_tracked(d) + d = dict([(x, y), (z, w)]) + self._tracked(d) + d = dict() + d.update([(x, y), (z, 1)]) + self._not_tracked(d) + d.update([(x, y), (z, w)]) + self._tracked(d) + + @test_support.cpython_only + def test_track_subtypes(self): + # Dict subtypes are always tracked + class MyDict(dict): + pass + self._tracked(MyDict()) + + +from test import mapping_tests + +class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): + type2test = dict + +class Dict(dict): + pass + +class SubclassMappingTests(mapping_tests.BasicTestMappingProtocol): + type2test = Dict + +def test_main(): + with test_support.check_py3k_warnings( + ('dict(.has_key..| inequality comparisons) not supported in 3.x', + DeprecationWarning)): + test_support.run_unittest( + DictTest, + GeneralMappingTests, + SubclassMappingTests, + ) + +if __name__ == "__main__": + test_main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 19:57:22 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 19:57:22 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Check_this_again_when_=5F=5F?= =?utf8?q?format=5F=5F_works_better=2E?= Message-ID: http://hg.python.org/jython/rev/efaea7e368be changeset: 6434:efaea7e368be user: Frank Wierzbicki date: Tue Mar 20 11:57:14 2012 -0700 summary: Check this again when __format__ works better. files: Lib/test/test_dict.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -11,6 +11,8 @@ self.assertEqual(dict(), {}) self.assertIsNot(dict(), {}) + @unittest.skipIf(test_support.is_jython, + "FIXME: check Jython again when __format__ works better.") def test_literal_constructor(self): # check literal constructor for different sized dicts # (to exercise the BUILD_MAP oparg). -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 20:16:22 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 20:16:22 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Skip_failing_tests_for_now_s?= =?utf8?b?ZWUgIzE4NjEu?= Message-ID: http://hg.python.org/jython/rev/f613d850db70 changeset: 6435:f613d850db70 user: Frank Wierzbicki date: Tue Mar 20 12:16:12 2012 -0700 summary: Skip failing tests for now see #1861. files: Lib/test/test_builtin.py | 38 +++++++++++++++++++-------- 1 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -244,7 +244,8 @@ class Foo(types.ModuleType): __dict__ = 8 f = Foo("foo") - self.assertRaises(TypeError, dir, f) + if not is_jython: #FIXME #1861 + self.assertRaises(TypeError, dir, f) # dir(type) self.assert_("strip" in dir(str)) @@ -280,14 +281,16 @@ def __dir__(self): return ["kan", "ga", "roo"] f = Foo() - self.assert_(dir(f) == ["ga", "kan", "roo"]) + if not is_jython: #FIXME #1861 + self.assert_(dir(f) == ["ga", "kan", "roo"]) # dir(obj__dir__not_list) class Foo(object): def __dir__(self): return 7 f = Foo() - self.assertRaises(TypeError, dir, f) + if not is_jython: #FIXME #1861 + self.assertRaises(TypeError, dir, f) def test_divmod(self): self.assertEqual(divmod(12, 7), (1, 5)) @@ -358,7 +361,8 @@ self.assertEqual(eval('a', g, m), 12) self.assertRaises(NameError, eval, 'b', g, m) self.assertEqual(eval('dir()', g, m), list('xyz')) - self.assertEqual(eval('globals()', g, m), g) + if not is_jython: #FIXME #1861 + self.assertEqual(eval('globals()', g, m), g) self.assertEqual(eval('locals()', g, m), m) # Jython allows arbitrary mappings for globals @@ -382,7 +386,8 @@ self.assertEqual(eval('a', g, d), 12) self.assertRaises(NameError, eval, 'b', g, d) self.assertEqual(eval('dir()', g, d), list('xyz')) - self.assertEqual(eval('globals()', g, d), g) + if not is_jython: #FIXME #1861 + self.assertEqual(eval('globals()', g, d), g) self.assertEqual(eval('locals()', g, d), d) # Verify locals stores (used by list comps) @@ -597,11 +602,13 @@ class A: def __getattr__(self, what): raise KeyboardInterrupt - self.assertRaises(KeyboardInterrupt, hasattr, A(), "b") + if not is_jython: #FIXME #1861: not working in Jython + self.assertRaises(KeyboardInterrupt, hasattr, A(), "b") class B: def __getattr__(self, what): raise SystemExit - self.assertRaises(SystemExit, hasattr, B(), "b") + if not is_jython: #FIXME #1861: not working in Jython + self.assertRaises(SystemExit, hasattr, B(), "b") def test_hash(self): hash(None) @@ -1136,6 +1143,7 @@ self.assertRaises(TypeError, range, 1e100, 1e100, 1) self.assertRaises(TypeError, range, 1e100, 1e100, 1e100) + @unittest.skipIf(is_jython, "FIXME #1861: not working in Jython") def test_input_and_raw_input(self): self.write_testfile() fp = open(TESTFN, 'r') @@ -1315,6 +1323,7 @@ self.assertRaises(TypeError, round, t) self.assertRaises(TypeError, round, t, 0) + @unittest.skipIf(is_jython, "FIXME #1861: not working in Jython") def test_round_large(self): # Issue #1869: integral floats should remain unchanged self.assertEqual(round(5e15-1), 5e15-1) @@ -1365,7 +1374,8 @@ ) self.assertRaises(ValueError, unichr, sys.maxunicode+1) self.assertRaises(TypeError, unichr) - self.assertRaises((OverflowError, ValueError), unichr, 2**32) + if not is_jython: #FIXME #1861 + self.assertRaises((OverflowError, ValueError), unichr, 2**32) # We don't want self in vars(), so these are static methods @@ -1380,6 +1390,7 @@ b = 2 return vars() + @unittest.skipIf(is_jython, "FIXME #1861: not working in Jython") def test_vars(self): self.assertEqual(set(vars()), set(dir())) import sys @@ -1483,8 +1494,9 @@ self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'), '10abcdef') - class_test(*classes_new()) - class_test(*classes_classic()) + if not is_jython: #FIXME #1861 check again when __format__ works better. + class_test(*classes_new()) + class_test(*classes_classic()) def empty_format_spec(value): # test that: @@ -1507,7 +1519,8 @@ class BadFormatResult: def __format__(self, format_spec): return 1.0 - self.assertRaises(TypeError, format, BadFormatResult(), "") + if not is_jython: #FIXME #1861 check again when __format__ works better. + self.assertRaises(TypeError, format, BadFormatResult(), "") # TypeError because format_spec is not unicode or str self.assertRaises(TypeError, format, object(), 4) @@ -1527,6 +1540,7 @@ class DerivedFromStr(str): pass self.assertEqual(format(0, DerivedFromStr('10')), ' 0') + @unittest.skipIf(is_jython, "FIXME #1861: bin not implemented yet.") def test_bin(self): self.assertEqual(bin(0), '0b0') self.assertEqual(bin(1), '0b1') @@ -1536,6 +1550,8 @@ self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65) self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65) + @unittest.skipIf(is_jython, + "FIXME #1861: bytearray not implemented in Jython yet") def test_bytearray_translate(self): x = bytearray("abc") self.assertRaises(ValueError, x.translate, "1", 1) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 21:19:56 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 21:19:56 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_see_FIXMEs=2E?= Message-ID: http://hg.python.org/jython/rev/84fd730a679c changeset: 6436:84fd730a679c user: Frank Wierzbicki date: Tue Mar 20 13:19:46 2012 -0700 summary: see FIXMEs. files: Lib/test/regrtest.py | 2 + Lib/test/test_StringIO.py | 182 ++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 0 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1187,6 +1187,7 @@ test_applesingle test_ascii_formatd test_audioop + test_buffer test_bsddb test_bsddb185 test_bsddb3 @@ -1218,6 +1219,7 @@ test_longexp test_macfs test_macostools + test_memoryview test_mmap test_nis test_normalization diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_StringIO.py @@ -0,0 +1,182 @@ +# Tests StringIO and cStringIO + +import unittest +import StringIO +import cStringIO +import types +import array +from test import test_support + + +class TestGenericStringIO(unittest.TestCase): + # use a class variable MODULE to define which module is being tested + + # Line of data to test as string + _line = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!' + + # Constructor to use for the test data (._line is passed to this + # constructor) + constructor = str + + def setUp(self): + self._line = self.constructor(self._line) + self._lines = self.constructor((self._line + '\n') * 5) + self._fp = self.MODULE.StringIO(self._lines) + + def test_reads(self): + eq = self.assertEqual + self.assertRaises(TypeError, self._fp.seek) + eq(self._fp.read(10), self._line[:10]) + eq(self._fp.readline(), self._line[10:] + '\n') + eq(len(self._fp.readlines(60)), 2) + self._fp.seek(0) + eq(self._fp.readline(-1), self._line + '\n') + + def test_writes(self): + f = self.MODULE.StringIO() + self.assertRaises(TypeError, f.seek) + f.write(self._line[:6]) + f.seek(3) + f.write(self._line[20:26]) + f.write(self._line[52]) + self.assertEqual(f.getvalue(), 'abcuvwxyz!') + + def test_writelines(self): + f = self.MODULE.StringIO() + f.writelines([self._line[0], self._line[1], self._line[2]]) + f.seek(0) + self.assertEqual(f.getvalue(), 'abc') + + def test_writelines_error(self): + def errorGen(): + yield 'a' + raise KeyboardInterrupt() + f = self.MODULE.StringIO() + self.assertRaises(KeyboardInterrupt, f.writelines, errorGen()) + + def test_truncate(self): + eq = self.assertEqual + f = self.MODULE.StringIO() + f.write(self._lines) + f.seek(10) + f.truncate() + eq(f.getvalue(), 'abcdefghij') + f.truncate(5) + eq(f.getvalue(), 'abcde') + f.write('xyz') + eq(f.getvalue(), 'abcdexyz') + self.assertRaises(IOError, f.truncate, -1) + f.close() + self.assertRaises(ValueError, f.write, 'frobnitz') + + def test_closed_flag(self): + f = self.MODULE.StringIO() + self.assertEqual(f.closed, False) + f.close() + self.assertEqual(f.closed, True) + f = self.MODULE.StringIO("abc") + self.assertEqual(f.closed, False) + f.close() + self.assertEqual(f.closed, True) + + def test_isatty(self): + f = self.MODULE.StringIO() + self.assertRaises(TypeError, f.isatty, None) + self.assertEqual(f.isatty(), False) + f.close() + self.assertRaises(ValueError, f.isatty) + + def test_iterator(self): + eq = self.assertEqual + unless = self.assertTrue + eq(iter(self._fp), self._fp) + # Does this object support the iteration protocol? + unless(hasattr(self._fp, '__iter__')) + unless(hasattr(self._fp, 'next')) + i = 0 + for line in self._fp: + eq(line, self._line + '\n') + i += 1 + eq(i, 5) + self._fp.close() + self.assertRaises(ValueError, self._fp.next) + + @unittest.skipIf(test_support.is_jython, "FIXME #1862: not working in Jython") + def test_getvalue(self): + self._fp.close() + self.assertRaises(ValueError, self._fp.getvalue) + +class TestStringIO(TestGenericStringIO): + MODULE = StringIO + + def test_unicode(self): + + if not test_support.have_unicode: return + + # The StringIO module also supports concatenating Unicode + # snippets to larger Unicode strings. This is tested by this + # method. Note that cStringIO does not support this extension. + + f = self.MODULE.StringIO() + f.write(self._line[:6]) + f.seek(3) + f.write(unicode(self._line[20:26])) + f.write(unicode(self._line[52])) + s = f.getvalue() + self.assertEqual(s, unicode('abcuvwxyz!')) + self.assertEqual(type(s), types.UnicodeType) + +class TestcStringIO(TestGenericStringIO): + MODULE = cStringIO + + @unittest.skipIf(test_support.is_jython, "FIXME #1862: not working in Jython") + def test_array_support(self): + # Issue #1730114: cStringIO should accept array objects + a = array.array('B', [0,1,2]) + f = self.MODULE.StringIO(a) + self.assertEqual(f.getvalue(), '\x00\x01\x02') + + def test_unicode(self): + + if not test_support.have_unicode: return + + # The cStringIO module converts Unicode strings to character + # strings when writing them to cStringIO objects. + # Check that this works. + + f = self.MODULE.StringIO() + f.write(u'abcde') + s = f.getvalue() + self.assertEqual(s, 'abcde') + self.assertEqual(type(s), str) + + f = self.MODULE.StringIO(u'abcde') + s = f.getvalue() + self.assertEqual(s, 'abcde') + self.assertEqual(type(s), str) + + if not test_support.is_jython: #FIXME #1862: not working in Jython + self.assertRaises(UnicodeEncodeError, self.MODULE.StringIO, u'\xf4') + + +import sys +if sys.platform.startswith('java'): + # Jython doesn't have a buffer object, so we just do a useless + # fake of the buffer tests. + buffer = str + +class TestBufferStringIO(TestStringIO): + constructor = buffer + +class TestBuffercStringIO(TestcStringIO): + constructor = buffer + + +def test_main(): + test_support.run_unittest(TestStringIO, TestcStringIO) + with test_support.check_py3k_warnings(("buffer.. not supported", + DeprecationWarning)): + test_support.run_unittest(TestBufferStringIO, TestBuffercStringIO) + +if __name__ == '__main__': + test_main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 21:33:57 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 21:33:57 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_This_one_is_a_good_candidate?= =?utf8?q?_for_pushing_upstream=2E?= Message-ID: http://hg.python.org/jython/rev/96efc4839b25 changeset: 6437:96efc4839b25 user: Frank Wierzbicki date: Tue Mar 20 13:33:48 2012 -0700 summary: This one is a good candidate for pushing upstream. files: Lib/test/test_coding.py | 41 +++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_coding.py @@ -0,0 +1,41 @@ + +import from test import test_support +import unittest +import os + +class CodingTest(unittest.TestCase): + def test_bad_coding(self): + module_name = 'bad_coding' + self.verify_bad_module(module_name) + + def test_bad_coding2(self): + module_name = 'bad_coding2' + self.verify_bad_module(module_name) + + def verify_bad_module(self, module_name): + self.assertRaises(SyntaxError, __import__, 'test.' + module_name) + + path = os.path.dirname(__file__) + filename = os.path.join(path, module_name + '.py') + with open(filename) as fp: + text = fp.read() + self.assertRaises(SyntaxError, compile, text, filename, 'exec') + + def test_error_from_string(self): + # See http://bugs.python.org/issue6289 + input = u"# coding: ascii\n\N{SNOWMAN}".encode('utf-8') + with self.assertRaises(SyntaxError) as c: + compile(input, "", "exec") + + #XXX: really exceptions should not be testing the message content. + if not test_support.is_jython: + expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \ + "ordinal not in range(128)" + self.assertTrue(c.exception.args[0].startswith(expected)) + + +def test_main(): + test.test_support.run_unittest(CodingTest) + +if __name__ == "__main__": + test_main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 21:40:50 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 21:40:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_skip_utf-32=2E?= Message-ID: http://hg.python.org/jython/rev/9035230584fb changeset: 6438:9035230584fb user: Frank Wierzbicki date: Tue Mar 20 13:40:41 2012 -0700 summary: skip utf-32. files: Lib/test/test_codeccallbacks.py | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -296,8 +296,11 @@ l = 1000 errors += [ "test." + err for err in errors ] for uni in [ s*l for s in (u"x", u"\u3042", u"a\xe4") ]: - for enc in ("ascii", "latin-1", "iso-8859-1", "iso-8859-15", - "utf-8", "utf-7", "utf-16", "utf-32"): + encodings = ["ascii", "latin-1", "iso-8859-1", "iso-8859-15", + "utf-8", "utf-7", "utf-16"] + if not test.test_support.is_jython: + encodings.append("utf-32") + for enc in encodings: for err in errors: try: uni.encode(enc, err) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 21:49:09 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 21:49:09 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Remove_=5F=5Fsizeof=5F=5F_fr?= =?utf8?q?om_doctest_-_not_sure_how_to_deal_with_these=2E?= Message-ID: http://hg.python.org/jython/rev/711e8c0bf500 changeset: 6439:711e8c0bf500 user: Frank Wierzbicki date: Tue Mar 20 13:49:01 2012 -0700 summary: Remove __sizeof__ from doctest - not sure how to deal with these. files: Lib/test/test_descrtut.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py --- a/Lib/test/test_descrtut.py +++ b/Lib/test/test_descrtut.py @@ -208,7 +208,6 @@ '__setattr__', '__setitem__', '__setslice__', - '__sizeof__', '__str__', '__subclasshook__', 'append', -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 22:33:17 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 22:33:17 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_test=5Fnew=2Epy?= Message-ID: http://hg.python.org/jython/rev/d29e2ff56a9c changeset: 6440:d29e2ff56a9c user: Frank Wierzbicki date: Tue Mar 20 14:33:09 2012 -0700 summary: Update test_new.py files: Lib/test/test_new.py | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_new.py b/Lib/test/test_new.py --- a/Lib/test/test_new.py +++ b/Lib/test/test_new.py @@ -24,10 +24,18 @@ c = new.instance(C, {'yolks': 3}) o = new.instance(C) - self.assertEqual(o.__dict__, {}, "new __dict__ should be empty") + + # __dict__ is a non dict mapping in Jython + if test_support.is_jython: + self.assertEqual(len(o.__dict__), 0, "new __dict__ should be empty") + else: + self.assertEqual(o.__dict__, {}, "new __dict__ should be empty") del o o = new.instance(C, None) - self.assertEqual(o.__dict__, {}, "new __dict__ should be empty") + if test_support.is_jython: + self.assertEqual(len(o.__dict__), 0, "new __dict__ should be empty") + else: + self.assertEqual(o.__dict__, {}, "new __dict__ should be empty") del o def break_yolks(self): -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 20 22:52:12 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 20 Mar 2012 22:52:12 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Compares_and_all_debugger_do?= =?utf8?q?ctests_removed_from_CPython_original=2E?= Message-ID: http://hg.python.org/jython/rev/4be64842a1d9 changeset: 6441:4be64842a1d9 user: Frank Wierzbicki date: Tue Mar 20 14:52:04 2012 -0700 summary: Compares and all debugger doctests removed from CPython original. files: Lib/test/test_doctest.py | 2313 ++++++++++++++++++++++++++ 1 files changed, 2313 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_doctest.py @@ -0,0 +1,2313 @@ +# -*- coding: utf-8 -*- +""" +Test script for doctest. + +FIXME: Large parts gutted to run on Jython -- #1863. +""" + +import sys +from test import test_support +import doctest + +# NOTE: There are some additional tests relating to interaction with +# zipimport in the test_zipimport_support test module. + +###################################################################### +## Sample Objects (used by test cases) +###################################################################### + +def sample_func(v): + """ + Blah blah + + >>> print sample_func(22) + 44 + + Yee ha! + """ + return v+v + +class SampleClass: + """ + >>> print 1 + 1 + + >>> # comments get ignored. so are empty PS1 and PS2 prompts: + >>> + ... + + Multiline example: + >>> sc = SampleClass(3) + >>> for i in range(10): + ... sc = sc.double() + ... print sc.get(), + 6 12 24 48 96 192 384 768 1536 3072 + """ + def __init__(self, val): + """ + >>> print SampleClass(12).get() + 12 + """ + self.val = val + + def double(self): + """ + >>> print SampleClass(12).double().get() + 24 + """ + return SampleClass(self.val + self.val) + + def get(self): + """ + >>> print SampleClass(-5).get() + -5 + """ + return self.val + + def a_staticmethod(v): + """ + >>> print SampleClass.a_staticmethod(10) + 11 + """ + return v+1 + a_staticmethod = staticmethod(a_staticmethod) + + def a_classmethod(cls, v): + """ + >>> print SampleClass.a_classmethod(10) + 12 + >>> print SampleClass(0).a_classmethod(10) + 12 + """ + return v+2 + a_classmethod = classmethod(a_classmethod) + + a_property = property(get, doc=""" + >>> print SampleClass(22).a_property + 22 + """) + + class NestedClass: + """ + >>> x = SampleClass.NestedClass(5) + >>> y = x.square() + >>> print y.get() + 25 + """ + def __init__(self, val=0): + """ + >>> print SampleClass.NestedClass().get() + 0 + """ + self.val = val + def square(self): + return SampleClass.NestedClass(self.val*self.val) + def get(self): + return self.val + +class SampleNewStyleClass(object): + r""" + >>> print '1\n2\n3' + 1 + 2 + 3 + """ + def __init__(self, val): + """ + >>> print SampleNewStyleClass(12).get() + 12 + """ + self.val = val + + def double(self): + """ + >>> print SampleNewStyleClass(12).double().get() + 24 + """ + return SampleNewStyleClass(self.val + self.val) + + def get(self): + """ + >>> print SampleNewStyleClass(-5).get() + -5 + """ + return self.val + +###################################################################### +## Fake stdin (for testing interactive debugging) +###################################################################### + +class _FakeInput: + """ + A fake input stream for pdb's interactive debugger. Whenever a + line is read, print it (to simulate the user typing it), and then + return it. The set of lines to return is specified in the + constructor; they should not have trailing newlines. + """ + def __init__(self, lines): + self.lines = lines + + def readline(self): + line = self.lines.pop(0) + print line + return line+'\n' + +###################################################################### +## Test Cases +###################################################################### + +def test_Example(): r""" +Unit tests for the `Example` class. + +Example is a simple container class that holds: + - `source`: A source string. + - `want`: An expected output string. + - `exc_msg`: An expected exception message string (or None if no + exception is expected). + - `lineno`: A line number (within the docstring). + - `indent`: The example's indentation in the input string. + - `options`: An option dictionary, mapping option flags to True or + False. + +These attributes are set by the constructor. `source` and `want` are +required; the other attributes all have default values: + + >>> example = doctest.Example('print 1', '1\n') + >>> (example.source, example.want, example.exc_msg, + ... example.lineno, example.indent, example.options) + ('print 1\n', '1\n', None, 0, 0, {}) + +The first three attributes (`source`, `want`, and `exc_msg`) may be +specified positionally; the remaining arguments should be specified as +keyword arguments: + + >>> exc_msg = 'IndexError: pop from an empty list' + >>> example = doctest.Example('[].pop()', '', exc_msg, + ... lineno=5, indent=4, + ... options={doctest.ELLIPSIS: True}) + >>> (example.source, example.want, example.exc_msg, + ... example.lineno, example.indent, example.options) + ('[].pop()\n', '', 'IndexError: pop from an empty list\n', 5, 4, {8: True}) + +The constructor normalizes the `source` string to end in a newline: + + Source spans a single line: no terminating newline. + >>> e = doctest.Example('print 1', '1\n') + >>> e.source, e.want + ('print 1\n', '1\n') + + >>> e = doctest.Example('print 1\n', '1\n') + >>> e.source, e.want + ('print 1\n', '1\n') + + Source spans multiple lines: require terminating newline. + >>> e = doctest.Example('print 1;\nprint 2\n', '1\n2\n') + >>> e.source, e.want + ('print 1;\nprint 2\n', '1\n2\n') + + >>> e = doctest.Example('print 1;\nprint 2', '1\n2\n') + >>> e.source, e.want + ('print 1;\nprint 2\n', '1\n2\n') + + Empty source string (which should never appear in real examples) + >>> e = doctest.Example('', '') + >>> e.source, e.want + ('\n', '') + +The constructor normalizes the `want` string to end in a newline, +unless it's the empty string: + + >>> e = doctest.Example('print 1', '1\n') + >>> e.source, e.want + ('print 1\n', '1\n') + + >>> e = doctest.Example('print 1', '1') + >>> e.source, e.want + ('print 1\n', '1\n') + + >>> e = doctest.Example('print', '') + >>> e.source, e.want + ('print\n', '') + +The constructor normalizes the `exc_msg` string to end in a newline, +unless it's `None`: + + Message spans one line + >>> exc_msg = 'IndexError: pop from an empty list' + >>> e = doctest.Example('[].pop()', '', exc_msg) + >>> e.exc_msg + 'IndexError: pop from an empty list\n' + + >>> exc_msg = 'IndexError: pop from an empty list\n' + >>> e = doctest.Example('[].pop()', '', exc_msg) + >>> e.exc_msg + 'IndexError: pop from an empty list\n' + + Message spans multiple lines + >>> exc_msg = 'ValueError: 1\n 2' + >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg) + >>> e.exc_msg + 'ValueError: 1\n 2\n' + + >>> exc_msg = 'ValueError: 1\n 2\n' + >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg) + >>> e.exc_msg + 'ValueError: 1\n 2\n' + + Empty (but non-None) exception message (which should never appear + in real examples) + >>> exc_msg = '' + >>> e = doctest.Example('raise X()', '', exc_msg) + >>> e.exc_msg + '\n' + +""" + +def test_DocTest(): r""" +Unit tests for the `DocTest` class. + +DocTest is a collection of examples, extracted from a docstring, along +with information about where the docstring comes from (a name, +filename, and line number). The docstring is parsed by the `DocTest` +constructor: + + >>> docstring = ''' + ... >>> print 12 + ... 12 + ... + ... Non-example text. + ... + ... >>> print 'another\example' + ... another + ... example + ... ''' + >>> globs = {} # globals to run the test in. + >>> parser = doctest.DocTestParser() + >>> test = parser.get_doctest(docstring, globs, 'some_test', + ... 'some_file', 20) + >>> print test + + >>> len(test.examples) + 2 + >>> e1, e2 = test.examples + >>> (e1.source, e1.want, e1.lineno) + ('print 12\n', '12\n', 1) + >>> (e2.source, e2.want, e2.lineno) + ("print 'another\\example'\n", 'another\nexample\n', 6) + +Source information (name, filename, and line number) is available as +attributes on the doctest object: + + >>> (test.name, test.filename, test.lineno) + ('some_test', 'some_file', 20) + +The line number of an example within its containing file is found by +adding the line number of the example and the line number of its +containing test: + + >>> test.lineno + e1.lineno + 21 + >>> test.lineno + e2.lineno + 26 + +If the docstring contains inconsistant leading whitespace in the +expected output of an example, then `DocTest` will raise a ValueError: + + >>> docstring = r''' + ... >>> print 'bad\nindentation' + ... bad + ... indentation + ... ''' + >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) + Traceback (most recent call last): + ValueError: line 4 of the docstring for some_test has inconsistent leading whitespace: 'indentation' + +If the docstring contains inconsistent leading whitespace on +continuation lines, then `DocTest` will raise a ValueError: + + >>> docstring = r''' + ... >>> print ('bad indentation', + ... ... 2) + ... ('bad', 'indentation') + ... ''' + >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) + Traceback (most recent call last): + ValueError: line 2 of the docstring for some_test has inconsistent leading whitespace: '... 2)' + +If there's no blank space after a PS1 prompt ('>>>'), then `DocTest` +will raise a ValueError: + + >>> docstring = '>>>print 1\n1' + >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) + Traceback (most recent call last): + ValueError: line 1 of the docstring for some_test lacks blank after >>>: '>>>print 1' + +If there's no blank space after a PS2 prompt ('...'), then `DocTest` +will raise a ValueError: + + >>> docstring = '>>> if 1:\n...print 1\n1' + >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) + Traceback (most recent call last): + ValueError: line 2 of the docstring for some_test lacks blank after ...: '...print 1' + +Compare `DocTest`: + + >>> docstring = ''' + ... >>> print 12 + ... 12 + ... ''' + >>> test = parser.get_doctest(docstring, globs, 'some_test', + ... 'some_test', 20) + >>> same_test = parser.get_doctest(docstring, globs, 'some_test', + ... 'some_test', 20) + >>> docstring = ''' + ... >>> print 42 + ... 42 + ... ''' + >>> other_test = parser.get_doctest(docstring, globs, 'other_test', + ... 'other_file', 10) + >>> test == other_test + False + >>> test != other_test + True + +Compare `DocTestCase`: + + >>> DocTestCase = doctest.DocTestCase + >>> test_case = DocTestCase(test) + >>> same_test_case = DocTestCase(same_test) + >>> other_test_case = DocTestCase(other_test) + >>> test_case == same_test_case + True + >>> test_case != same_test_case + False + >>> hash(test_case) == hash(same_test_case) + True + >>> test == other_test_case + False + >>> test != other_test_case + True + +""" + +def test_DocTestFinder(): r""" +Unit tests for the `DocTestFinder` class. + +DocTestFinder is used to extract DocTests from an object's docstring +and the docstrings of its contained objects. It can be used with +modules, functions, classes, methods, staticmethods, classmethods, and +properties. + +Finding Tests in Functions +~~~~~~~~~~~~~~~~~~~~~~~~~~ +For a function whose docstring contains examples, DocTestFinder.find() +will return a single test (for that function's docstring): + + >>> finder = doctest.DocTestFinder() + +We'll simulate a __file__ attr that ends in pyc: + + >>> import test.test_doctest + >>> old = test.test_doctest.__file__ + >>> test.test_doctest.__file__ = 'test_doctest.pyc' + + >>> tests = finder.find(sample_func) + + >>> print tests # doctest: +ELLIPSIS + [] + +The exact name depends on how test_doctest was invoked, so allow for +leading path components. + + >>> tests[0].filename # doctest: +ELLIPSIS + '...test_doctest.py' + + >>> test.test_doctest.__file__ = old + + + >>> e = tests[0].examples[0] + >>> (e.source, e.want, e.lineno) + ('print sample_func(22)\n', '44\n', 3) + +By default, tests are created for objects with no docstring: + + >>> def no_docstring(v): + ... pass + >>> finder.find(no_docstring) + [] + +However, the optional argument `exclude_empty` to the DocTestFinder +constructor can be used to exclude tests for objects with empty +docstrings: + + >>> def no_docstring(v): + ... pass + >>> excl_empty_finder = doctest.DocTestFinder(exclude_empty=True) + >>> excl_empty_finder.find(no_docstring) + [] + +If the function has a docstring with no examples, then a test with no +examples is returned. (This lets `DocTestRunner` collect statistics +about which functions have no tests -- but is that useful? And should +an empty test also be created when there's no docstring?) + + >>> def no_examples(v): + ... ''' no doctest examples ''' + >>> finder.find(no_examples) # doctest: +ELLIPSIS + [] + +Finding Tests in Classes +~~~~~~~~~~~~~~~~~~~~~~~~ +For a class, DocTestFinder will create a test for the class's +docstring, and will recursively explore its contents, including +methods, classmethods, staticmethods, properties, and nested classes. + + >>> finder = doctest.DocTestFinder() + >>> tests = finder.find(SampleClass) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 3 SampleClass + 3 SampleClass.NestedClass + 1 SampleClass.NestedClass.__init__ + 1 SampleClass.__init__ + 2 SampleClass.a_classmethod + 1 SampleClass.a_property + 1 SampleClass.a_staticmethod + 1 SampleClass.double + 1 SampleClass.get + +New-style classes are also supported: + + >>> tests = finder.find(SampleNewStyleClass) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 1 SampleNewStyleClass + 1 SampleNewStyleClass.__init__ + 1 SampleNewStyleClass.double + 1 SampleNewStyleClass.get + +Finding Tests in Modules +~~~~~~~~~~~~~~~~~~~~~~~~ +For a module, DocTestFinder will create a test for the class's +docstring, and will recursively explore its contents, including +functions, classes, and the `__test__` dictionary, if it exists: + + >>> # A module + >>> import types + >>> m = types.ModuleType('some_module') + >>> def triple(val): + ... ''' + ... >>> print triple(11) + ... 33 + ... ''' + ... return val*3 + >>> m.__dict__.update({ + ... 'sample_func': sample_func, + ... 'SampleClass': SampleClass, + ... '__doc__': ''' + ... Module docstring. + ... >>> print 'module' + ... module + ... ''', + ... '__test__': { + ... 'd': '>>> print 6\n6\n>>> print 7\n7\n', + ... 'c': triple}}) + + >>> finder = doctest.DocTestFinder() + >>> # Use module=test.test_doctest, to prevent doctest from + >>> # ignoring the objects since they weren't defined in m. + >>> import test.test_doctest + >>> tests = finder.find(m, module=test.test_doctest) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 1 some_module + 3 some_module.SampleClass + 3 some_module.SampleClass.NestedClass + 1 some_module.SampleClass.NestedClass.__init__ + 1 some_module.SampleClass.__init__ + 2 some_module.SampleClass.a_classmethod + 1 some_module.SampleClass.a_property + 1 some_module.SampleClass.a_staticmethod + 1 some_module.SampleClass.double + 1 some_module.SampleClass.get + 1 some_module.__test__.c + 2 some_module.__test__.d + 1 some_module.sample_func + +Duplicate Removal +~~~~~~~~~~~~~~~~~ +If a single object is listed twice (under different names), then tests +will only be generated for it once: + + >>> from test import doctest_aliases + >>> assert doctest_aliases.TwoNames.f + >>> assert doctest_aliases.TwoNames.g + >>> tests = excl_empty_finder.find(doctest_aliases) + >>> print len(tests) + 2 + >>> print tests[0].name + test.doctest_aliases.TwoNames + + TwoNames.f and TwoNames.g are bound to the same object. + We can't guess which will be found in doctest's traversal of + TwoNames.__dict__ first, so we have to allow for either. + + >>> tests[1].name.split('.')[-1] in ['f', 'g'] + True + +Empty Tests +~~~~~~~~~~~ +By default, an object with no doctests doesn't create any tests: + + >>> tests = doctest.DocTestFinder().find(SampleClass) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 3 SampleClass + 3 SampleClass.NestedClass + 1 SampleClass.NestedClass.__init__ + 1 SampleClass.__init__ + 2 SampleClass.a_classmethod + 1 SampleClass.a_property + 1 SampleClass.a_staticmethod + 1 SampleClass.double + 1 SampleClass.get + +By default, that excluded objects with no doctests. exclude_empty=False +tells it to include (empty) tests for objects with no doctests. This feature +is really to support backward compatibility in what doctest.master.summarize() +displays. + + >>> tests = doctest.DocTestFinder(exclude_empty=False).find(SampleClass) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 3 SampleClass + 3 SampleClass.NestedClass + 1 SampleClass.NestedClass.__init__ + 0 SampleClass.NestedClass.get + 0 SampleClass.NestedClass.square + 1 SampleClass.__init__ + 2 SampleClass.a_classmethod + 1 SampleClass.a_property + 1 SampleClass.a_staticmethod + 1 SampleClass.double + 1 SampleClass.get + +Turning off Recursion +~~~~~~~~~~~~~~~~~~~~~ +DocTestFinder can be told not to look for tests in contained objects +using the `recurse` flag: + + >>> tests = doctest.DocTestFinder(recurse=False).find(SampleClass) + >>> for t in tests: + ... print '%2s %s' % (len(t.examples), t.name) + 3 SampleClass + +Line numbers +~~~~~~~~~~~~ +DocTestFinder finds the line number of each example: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... + ... some text + ... + ... >>> # examples are not created for comments & bare prompts. + ... >>> + ... ... + ... + ... >>> for x in range(10): + ... ... print x, + ... 0 1 2 3 4 5 6 7 8 9 + ... >>> x//2 + ... 6 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> [e.lineno for e in test.examples] + [1, 9, 12] +""" + +def test_DocTestParser(): r""" +Unit tests for the `DocTestParser` class. + +DocTestParser is used to parse docstrings containing doctest examples. + +The `parse` method divides a docstring into examples and intervening +text: + + >>> s = ''' + ... >>> x, y = 2, 3 # no output expected + ... >>> if 1: + ... ... print x + ... ... print y + ... 2 + ... 3 + ... + ... Some text. + ... >>> x+y + ... 5 + ... ''' + >>> parser = doctest.DocTestParser() + >>> for piece in parser.parse(s): + ... if isinstance(piece, doctest.Example): + ... print 'Example:', (piece.source, piece.want, piece.lineno) + ... else: + ... print ' Text:', `piece` + Text: '\n' + Example: ('x, y = 2, 3 # no output expected\n', '', 1) + Text: '' + Example: ('if 1:\n print x\n print y\n', '2\n3\n', 2) + Text: '\nSome text.\n' + Example: ('x+y\n', '5\n', 9) + Text: '' + +The `get_examples` method returns just the examples: + + >>> for piece in parser.get_examples(s): + ... print (piece.source, piece.want, piece.lineno) + ('x, y = 2, 3 # no output expected\n', '', 1) + ('if 1:\n print x\n print y\n', '2\n3\n', 2) + ('x+y\n', '5\n', 9) + +The `get_doctest` method creates a Test from the examples, along with the +given arguments: + + >>> test = parser.get_doctest(s, {}, 'name', 'filename', lineno=5) + >>> (test.name, test.filename, test.lineno) + ('name', 'filename', 5) + >>> for piece in test.examples: + ... print (piece.source, piece.want, piece.lineno) + ('x, y = 2, 3 # no output expected\n', '', 1) + ('if 1:\n print x\n print y\n', '2\n3\n', 2) + ('x+y\n', '5\n', 9) +""" + +class test_DocTestRunner: + def basics(): r""" +Unit tests for the `DocTestRunner` class. + +DocTestRunner is used to run DocTest test cases, and to accumulate +statistics. Here's a simple DocTest case we can use: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... >>> print x + ... 12 + ... >>> x//2 + ... 6 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + +The main DocTestRunner interface is the `run` method, which runs a +given DocTest case in a given namespace (globs). It returns a tuple +`(f,t)`, where `f` is the number of failed tests and `t` is the number +of tried tests. + + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=3) + +If any example produces incorrect output, then the test runner reports +the failure and proceeds to the next example: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... >>> print x + ... 14 + ... >>> x//2 + ... 6 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=True).run(test) + ... # doctest: +ELLIPSIS + Trying: + x = 12 + Expecting nothing + ok + Trying: + print x + Expecting: + 14 + ********************************************************************** + File ..., line 4, in f + Failed example: + print x + Expected: + 14 + Got: + 12 + Trying: + x//2 + Expecting: + 6 + ok + TestResults(failed=1, attempted=3) +""" + def verbose_flag(): r""" +The `verbose` flag makes the test runner generate more detailed +output: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... >>> print x + ... 12 + ... >>> x//2 + ... 6 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + + >>> doctest.DocTestRunner(verbose=True).run(test) + Trying: + x = 12 + Expecting nothing + ok + Trying: + print x + Expecting: + 12 + ok + Trying: + x//2 + Expecting: + 6 + ok + TestResults(failed=0, attempted=3) + +If the `verbose` flag is unspecified, then the output will be verbose +iff `-v` appears in sys.argv: + + >>> # Save the real sys.argv list. + >>> old_argv = sys.argv + + >>> # If -v does not appear in sys.argv, then output isn't verbose. + >>> sys.argv = ['test'] + >>> doctest.DocTestRunner().run(test) + TestResults(failed=0, attempted=3) + + >>> # If -v does appear in sys.argv, then output is verbose. + >>> sys.argv = ['test', '-v'] + >>> doctest.DocTestRunner().run(test) + Trying: + x = 12 + Expecting nothing + ok + Trying: + print x + Expecting: + 12 + ok + Trying: + x//2 + Expecting: + 6 + ok + TestResults(failed=0, attempted=3) + + >>> # Restore sys.argv + >>> sys.argv = old_argv + +In the remaining examples, the test runner's verbosity will be +explicitly set, to ensure that the test behavior is consistent. + """ + def exceptions(): r""" +Tests of `DocTestRunner`'s exception handling. + +An expected exception is specified with a traceback message. The +lines between the first line and the type/value may be omitted or +replaced with any other string: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... >>> print x//0 + ... Traceback (most recent call last): + ... ZeroDivisionError: integer division or modulo by zero + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=2) + +An example may not generate output before it raises an exception; if +it does, then the traceback message will not be recognized as +signaling an expected exception, so the example will be reported as an +unexpected exception: + + >>> def f(x): + ... ''' + ... >>> x = 12 + ... >>> print 'pre-exception output', x//0 + ... pre-exception output + ... Traceback (most recent call last): + ... ZeroDivisionError: integer division or modulo by zero + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 4, in f + Failed example: + print 'pre-exception output', x//0 + Exception raised: + ... + ZeroDivisionError: integer division or modulo by zero + TestResults(failed=1, attempted=2) + +Exception messages may contain newlines: + + >>> def f(x): + ... r''' + ... >>> raise ValueError, 'multi\nline\nmessage' + ... Traceback (most recent call last): + ... ValueError: multi + ... line + ... message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + +If an exception is expected, but an exception with the wrong type or +message is raised, then it is reported as a failure: + + >>> def f(x): + ... r''' + ... >>> raise ValueError, 'message' + ... Traceback (most recent call last): + ... ValueError: wrong message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 3, in f + Failed example: + raise ValueError, 'message' + Expected: + Traceback (most recent call last): + ValueError: wrong message + Got: + Traceback (most recent call last): + ... + ValueError: message + TestResults(failed=1, attempted=1) + +However, IGNORE_EXCEPTION_DETAIL can be used to allow a mismatch in the +detail: + + >>> def f(x): + ... r''' + ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL + ... Traceback (most recent call last): + ... ValueError: wrong message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + +IGNORE_EXCEPTION_DETAIL also ignores difference in exception formatting +between Python versions. For example, in Python 3.x, the module path of +the exception is in the output, but this will fail under Python 2: + + >>> def f(x): + ... r''' + ... >>> from httplib import HTTPException + ... >>> raise HTTPException('message') + ... Traceback (most recent call last): + ... httplib.HTTPException: message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 4, in f + Failed example: + raise HTTPException('message') + Expected: + Traceback (most recent call last): + httplib.HTTPException: message + Got: + Traceback (most recent call last): + ... + HTTPException: message + TestResults(failed=1, attempted=2) + +But in Python 2 the module path is not included, an therefore a test must look +like the following test to succeed in Python 2. But that test will fail under +Python 3. + + >>> def f(x): + ... r''' + ... >>> from httplib import HTTPException + ... >>> raise HTTPException('message') + ... Traceback (most recent call last): + ... HTTPException: message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=2) + +However, with IGNORE_EXCEPTION_DETAIL, the module name of the exception +(if any) will be ignored: + + >>> def f(x): + ... r''' + ... >>> from httplib import HTTPException + ... >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL + ... Traceback (most recent call last): + ... HTTPException: message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=2) + +The module path will be completely ignored, so two different module paths will +still pass if IGNORE_EXCEPTION_DETAIL is given. This is intentional, so it can +be used when exceptions have changed module. + + >>> def f(x): + ... r''' + ... >>> from httplib import HTTPException + ... >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL + ... Traceback (most recent call last): + ... foo.bar.HTTPException: message + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=2) + +But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type: + + >>> def f(x): + ... r''' + ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL + ... Traceback (most recent call last): + ... TypeError: wrong type + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 3, in f + Failed example: + raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL + Expected: + Traceback (most recent call last): + TypeError: wrong type + Got: + Traceback (most recent call last): + ... + ValueError: message + TestResults(failed=1, attempted=1) + +If an exception is raised but not expected, then it is reported as an +unexpected exception: + + >>> def f(x): + ... r''' + ... >>> 1//0 + ... 0 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 3, in f + Failed example: + 1//0 + Exception raised: + Traceback (most recent call last): + ... + ZeroDivisionError: integer division or modulo by zero + TestResults(failed=1, attempted=1) +""" + def displayhook(): r""" +Test that changing sys.displayhook doesn't matter for doctest. + + >>> import sys + >>> orig_displayhook = sys.displayhook + >>> def my_displayhook(x): + ... print('hi!') + >>> sys.displayhook = my_displayhook + >>> def f(): + ... ''' + ... >>> 3 + ... 3 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> r = doctest.DocTestRunner(verbose=False).run(test) + >>> post_displayhook = sys.displayhook + + We need to restore sys.displayhook now, so that we'll be able to test + results. + + >>> sys.displayhook = orig_displayhook + + Ok, now we can check that everything is ok. + + >>> r + TestResults(failed=0, attempted=1) + >>> post_displayhook is my_displayhook + True +""" + def optionflags(): r""" +Tests of `DocTestRunner`'s option flag handling. + +Several option flags can be used to customize the behavior of the test +runner. These are defined as module constants in doctest, and passed +to the DocTestRunner constructor (multiple constants should be ORed +together). + +The DONT_ACCEPT_TRUE_FOR_1 flag disables matches between True/False +and 1/0: + + >>> def f(x): + ... '>>> True\n1\n' + + >>> # Without the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + + >>> # With the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.DONT_ACCEPT_TRUE_FOR_1 + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + True + Expected: + 1 + Got: + True + TestResults(failed=1, attempted=1) + +The DONT_ACCEPT_BLANKLINE flag disables the match between blank lines +and the '' marker: + + >>> def f(x): + ... '>>> print "a\\n\\nb"\na\n\nb\n' + + >>> # Without the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + + >>> # With the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.DONT_ACCEPT_BLANKLINE + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print "a\n\nb" + Expected: + a + + b + Got: + a + + b + TestResults(failed=1, attempted=1) + +The NORMALIZE_WHITESPACE flag causes all sequences of whitespace to be +treated as equal: + + >>> def f(x): + ... '>>> print 1, 2, 3\n 1 2\n 3' + + >>> # Without the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print 1, 2, 3 + Expected: + 1 2 + 3 + Got: + 1 2 3 + TestResults(failed=1, attempted=1) + + >>> # With the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.NORMALIZE_WHITESPACE + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + TestResults(failed=0, attempted=1) + + An example from the docs: + >>> print range(20) #doctest: +NORMALIZE_WHITESPACE + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + +The ELLIPSIS flag causes ellipsis marker ("...") in the expected +output to match any substring in the actual output: + + >>> def f(x): + ... '>>> print range(15)\n[0, 1, 2, ..., 14]\n' + + >>> # Without the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(15) + Expected: + [0, 1, 2, ..., 14] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + TestResults(failed=1, attempted=1) + + >>> # With the flag: + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.ELLIPSIS + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + TestResults(failed=0, attempted=1) + + ... also matches nothing: + + >>> for i in range(100): + ... print i**2, #doctest: +ELLIPSIS + 0 1...4...9 16 ... 36 49 64 ... 9801 + + ... can be surprising; e.g., this test passes: + + >>> for i in range(21): #doctest: +ELLIPSIS + ... print i, + 0 1 2 ...1...2...0 + + Examples from the docs: + + >>> print range(20) # doctest:+ELLIPSIS + [0, 1, ..., 18, 19] + + >>> print range(20) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE + [0, 1, ..., 18, 19] + +The SKIP flag causes an example to be skipped entirely. I.e., the +example is not run. It can be useful in contexts where doctest +examples serve as both documentation and test cases, and an example +should be included for documentation purposes, but should not be +checked (e.g., because its output is random, or depends on resources +which would be unavailable.) The SKIP flag can also be used for +'commenting out' broken examples. + + >>> import unavailable_resource # doctest: +SKIP + >>> unavailable_resource.do_something() # doctest: +SKIP + >>> unavailable_resource.blow_up() # doctest: +SKIP + Traceback (most recent call last): + ... + UncheckedBlowUpError: Nobody checks me. + + >>> import random + >>> print random.random() # doctest: +SKIP + 0.721216923889 + +The REPORT_UDIFF flag causes failures that involve multi-line expected +and actual outputs to be displayed using a unified diff: + + >>> def f(x): + ... r''' + ... >>> print '\n'.join('abcdefg') + ... a + ... B + ... c + ... d + ... f + ... g + ... h + ... ''' + +The REPORT_NDIFF flag causes failures to use the difflib.Differ algorithm +used by the popular ndiff.py utility. This does intraline difference +marking, as well as interline differences. + + >>> def f(x): + ... r''' + ... >>> print "a b c d e f g h i j k l m" + ... a b c d e f g h i j k 1 m + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.REPORT_NDIFF + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 3, in f + Failed example: + print "a b c d e f g h i j k l m" + Differences (ndiff with -expected +actual): + - a b c d e f g h i j k 1 m + ? ^ + + a b c d e f g h i j k l m + ? + ++ ^ + TestResults(failed=1, attempted=1) + +The REPORT_ONLY_FIRST_FAILURE suppresses result output after the first +failing example: + + >>> def f(x): + ... r''' + ... >>> print 1 # first success + ... 1 + ... >>> print 2 # first failure + ... 200 + ... >>> print 3 # second failure + ... 300 + ... >>> print 4 # second success + ... 4 + ... >>> print 5 # third failure + ... 500 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 5, in f + Failed example: + print 2 # first failure + Expected: + 200 + Got: + 2 + TestResults(failed=3, attempted=5) + +However, output from `report_start` is not suppressed: + + >>> doctest.DocTestRunner(verbose=True, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + Trying: + print 1 # first success + Expecting: + 1 + ok + Trying: + print 2 # first failure + Expecting: + 200 + ********************************************************************** + File ..., line 5, in f + Failed example: + print 2 # first failure + Expected: + 200 + Got: + 2 + TestResults(failed=3, attempted=5) + +For the purposes of REPORT_ONLY_FIRST_FAILURE, unexpected exceptions +count as failures: + + >>> def f(x): + ... r''' + ... >>> print 1 # first success + ... 1 + ... >>> raise ValueError(2) # first failure + ... 200 + ... >>> print 3 # second failure + ... 300 + ... >>> print 4 # second success + ... 4 + ... >>> print 5 # third failure + ... 500 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 5, in f + Failed example: + raise ValueError(2) # first failure + Exception raised: + ... + ValueError: 2 + TestResults(failed=3, attempted=5) + +New option flags can also be registered, via register_optionflag(). Here +we reach into doctest's internals a bit. + + >>> unlikely = "UNLIKELY_OPTION_NAME" + >>> unlikely in doctest.OPTIONFLAGS_BY_NAME + False + >>> new_flag_value = doctest.register_optionflag(unlikely) + >>> unlikely in doctest.OPTIONFLAGS_BY_NAME + True + +Before 2.4.4/2.5, registering a name more than once erroneously created +more than one flag value. Here we verify that's fixed: + + >>> redundant_flag_value = doctest.register_optionflag(unlikely) + >>> redundant_flag_value == new_flag_value + True + +Clean up. + >>> del doctest.OPTIONFLAGS_BY_NAME[unlikely] + + """ + + def option_directives(): r""" +Tests of `DocTestRunner`'s option directive mechanism. + +Option directives can be used to turn option flags on or off for a +single example. To turn an option on for an example, follow that +example with a comment of the form ``# doctest: +OPTION``: + + >>> def f(x): r''' + ... >>> print range(10) # should fail: no ellipsis + ... [0, 1, ..., 9] + ... + ... >>> print range(10) # doctest: +ELLIPSIS + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(10) # should fail: no ellipsis + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=1, attempted=2) + +To turn an option off for an example, follow that example with a +comment of the form ``# doctest: -OPTION``: + + >>> def f(x): r''' + ... >>> print range(10) + ... [0, 1, ..., 9] + ... + ... >>> # should fail: no ellipsis + ... >>> print range(10) # doctest: -ELLIPSIS + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False, + ... optionflags=doctest.ELLIPSIS).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 6, in f + Failed example: + print range(10) # doctest: -ELLIPSIS + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=1, attempted=2) + +Option directives affect only the example that they appear with; they +do not change the options for surrounding examples: + + >>> def f(x): r''' + ... >>> print range(10) # Should fail: no ellipsis + ... [0, 1, ..., 9] + ... + ... >>> print range(10) # doctest: +ELLIPSIS + ... [0, 1, ..., 9] + ... + ... >>> print range(10) # Should fail: no ellipsis + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(10) # Should fail: no ellipsis + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + ********************************************************************** + File ..., line 8, in f + Failed example: + print range(10) # Should fail: no ellipsis + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=2, attempted=3) + +Multiple options may be modified by a single option directive. They +may be separated by whitespace, commas, or both: + + >>> def f(x): r''' + ... >>> print range(10) # Should fail + ... [0, 1, ..., 9] + ... >>> print range(10) # Should succeed + ... ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(10) # Should fail + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=1, attempted=2) + + >>> def f(x): r''' + ... >>> print range(10) # Should fail + ... [0, 1, ..., 9] + ... >>> print range(10) # Should succeed + ... ... # doctest: +ELLIPSIS,+NORMALIZE_WHITESPACE + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(10) # Should fail + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=1, attempted=2) + + >>> def f(x): r''' + ... >>> print range(10) # Should fail + ... [0, 1, ..., 9] + ... >>> print range(10) # Should succeed + ... ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 2, in f + Failed example: + print range(10) # Should fail + Expected: + [0, 1, ..., 9] + Got: + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + TestResults(failed=1, attempted=2) + +The option directive may be put on the line following the source, as +long as a continuation prompt is used: + + >>> def f(x): r''' + ... >>> print range(10) + ... ... # doctest: +ELLIPSIS + ... [0, 1, ..., 9] + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + +For examples with multi-line source, the option directive may appear +at the end of any line: + + >>> def f(x): r''' + ... >>> for x in range(10): # doctest: +ELLIPSIS + ... ... print x, + ... 0 1 2 ... 9 + ... + ... >>> for x in range(10): + ... ... print x, # doctest: +ELLIPSIS + ... 0 1 2 ... 9 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=2) + +If more than one line of an example with multi-line source has an +option directive, then they are combined: + + >>> def f(x): r''' + ... Should fail (option directive not on the last line): + ... >>> for x in range(10): # doctest: +ELLIPSIS + ... ... print x, # doctest: +NORMALIZE_WHITESPACE + ... 0 1 2...9 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> doctest.DocTestRunner(verbose=False).run(test) + TestResults(failed=0, attempted=1) + +It is an error to have a comment of the form ``# doctest:`` that is +*not* followed by words of the form ``+OPTION`` or ``-OPTION``, where +``OPTION`` is an option that has been registered with +`register_option`: + + >>> # Error: Option not registered + >>> s = '>>> print 12 #doctest: +BADOPTION' + >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) + Traceback (most recent call last): + ValueError: line 1 of the doctest for s has an invalid option: '+BADOPTION' + + >>> # Error: No + or - prefix + >>> s = '>>> print 12 #doctest: ELLIPSIS' + >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) + Traceback (most recent call last): + ValueError: line 1 of the doctest for s has an invalid option: 'ELLIPSIS' + +It is an error to use an option directive on a line that contains no +source: + + >>> s = '>>> # doctest: +ELLIPSIS' + >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) + Traceback (most recent call last): + ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS' + + """ + + def test_unicode_output(self): r""" + +Check that unicode output works: + + >>> u'\xe9' + u'\xe9' + +If we return unicode, SpoofOut's buf variable becomes automagically +converted to unicode. This means all subsequent output becomes converted +to unicode, and if the output contains non-ascii characters that failed. +It used to be that this state change carried on between tests, meaning +tests would fail if unicode has been output previously in the testrun. +This test tests that this is no longer so: + + >>> print u'abc' + abc + +And then return a string with non-ascii characters: + + >>> print u'\xe9'.encode('utf-8') + ? + + """ + + +def test_testsource(): r""" +Unit tests for `testsource()`. + +The testsource() function takes a module and a name, finds the (first) +test with that name in that module, and converts it to a script. The +example code is converted to regular Python code. The surrounding +words and expected output are converted to comments: + + >>> import test.test_doctest + >>> name = 'test.test_doctest.sample_func' + >>> print doctest.testsource(test.test_doctest, name) + # Blah blah + # + print sample_func(22) + # Expected: + ## 44 + # + # Yee ha! + + + >>> name = 'test.test_doctest.SampleNewStyleClass' + >>> print doctest.testsource(test.test_doctest, name) + print '1\n2\n3' + # Expected: + ## 1 + ## 2 + ## 3 + + + >>> name = 'test.test_doctest.SampleClass.a_classmethod' + >>> print doctest.testsource(test.test_doctest, name) + print SampleClass.a_classmethod(10) + # Expected: + ## 12 + print SampleClass(0).a_classmethod(10) + # Expected: + ## 12 + +""" + +def test_DocTestSuite(): + """DocTestSuite creates a unittest test suite from a doctest. + + We create a Suite by providing a module. A module can be provided + by passing a module object: + + >>> import unittest + >>> import test.sample_doctest + >>> suite = doctest.DocTestSuite(test.sample_doctest) + >>> suite.run(unittest.TestResult()) + + + We can also supply the module by name: + + >>> suite = doctest.DocTestSuite('test.sample_doctest') + >>> suite.run(unittest.TestResult()) + + + We can use the current module: + + >>> suite = test.sample_doctest.test_suite() + >>> suite.run(unittest.TestResult()) + + + We can supply global variables. If we pass globs, they will be + used instead of the module globals. Here we'll pass an empty + globals, triggering an extra error: + + >>> suite = doctest.DocTestSuite('test.sample_doctest', globs={}) + >>> suite.run(unittest.TestResult()) + + + Alternatively, we can provide extra globals. Here we'll make an + error go away by providing an extra global variable: + + >>> suite = doctest.DocTestSuite('test.sample_doctest', + ... extraglobs={'y': 1}) + >>> suite.run(unittest.TestResult()) + + + You can pass option flags. Here we'll cause an extra error + by disabling the blank-line feature: + + >>> suite = doctest.DocTestSuite('test.sample_doctest', + ... optionflags=doctest.DONT_ACCEPT_BLANKLINE) + >>> suite.run(unittest.TestResult()) + + + You can supply setUp and tearDown functions: + + >>> def setUp(t): + ... import test.test_doctest + ... test.test_doctest.sillySetup = True + + >>> def tearDown(t): + ... import test.test_doctest + ... del test.test_doctest.sillySetup + + Here, we installed a silly variable that the test expects: + + >>> suite = doctest.DocTestSuite('test.sample_doctest', + ... setUp=setUp, tearDown=tearDown) + >>> suite.run(unittest.TestResult()) + + + But the tearDown restores sanity: + + >>> import test.test_doctest + >>> test.test_doctest.sillySetup + Traceback (most recent call last): + ... + AttributeError: 'module' object has no attribute 'sillySetup' + + The setUp and tearDown funtions are passed test objects. Here + we'll use the setUp function to supply the missing variable y: + + >>> def setUp(test): + ... test.globs['y'] = 1 + + >>> suite = doctest.DocTestSuite('test.sample_doctest', setUp=setUp) + >>> suite.run(unittest.TestResult()) + + + Here, we didn't need to use a tearDown function because we + modified the test globals, which are a copy of the + sample_doctest module dictionary. The test globals are + automatically cleared for us after a test. + """ + +def test_DocFileSuite(): + """We can test tests found in text files using a DocFileSuite. + + We create a suite by providing the names of one or more text + files that include examples: + + >>> import unittest + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt') + >>> suite.run(unittest.TestResult()) + + + The test files are looked for in the directory containing the + calling module. A package keyword argument can be provided to + specify a different relative location. + + >>> import unittest + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... package='test') + >>> suite.run(unittest.TestResult()) + + + Support for using a package's __loader__.get_data() is also + provided. + + >>> import unittest, pkgutil, test + >>> added_loader = False + >>> if not hasattr(test, '__loader__'): + ... test.__loader__ = pkgutil.get_loader(test) + ... added_loader = True + >>> try: + ... suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... package='test') + ... suite.run(unittest.TestResult()) + ... finally: + ... if added_loader: + ... del test.__loader__ + + + '/' should be used as a path separator. It will be converted + to a native separator at run time: + + >>> suite = doctest.DocFileSuite('../test/test_doctest.txt') + >>> suite.run(unittest.TestResult()) + + + If DocFileSuite is used from an interactive session, then files + are resolved relative to the directory of sys.argv[0]: + + >>> import types, os.path, test.test_doctest + >>> save_argv = sys.argv + >>> sys.argv = [test.test_doctest.__file__] + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... package=types.ModuleType('__main__')) + >>> sys.argv = save_argv + + By setting `module_relative=False`, os-specific paths may be + used (including absolute paths and paths relative to the + working directory): + + >>> # Get the absolute path of the test package. + >>> test_doctest_path = os.path.abspath(test.test_doctest.__file__) + >>> test_pkg_path = os.path.split(test_doctest_path)[0] + + >>> # Use it to find the absolute path of test_doctest.txt. + >>> test_file = os.path.join(test_pkg_path, 'test_doctest.txt') + + >>> suite = doctest.DocFileSuite(test_file, module_relative=False) + >>> suite.run(unittest.TestResult()) + + + It is an error to specify `package` when `module_relative=False`: + + >>> suite = doctest.DocFileSuite(test_file, module_relative=False, + ... package='test') + Traceback (most recent call last): + ValueError: Package may only be specified for module-relative paths. + + You can specify initial global variables: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... globs={'favorite_color': 'blue'}) + >>> suite.run(unittest.TestResult()) + + + In this case, we supplied a missing favorite color. You can + provide doctest options: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... optionflags=doctest.DONT_ACCEPT_BLANKLINE, + ... globs={'favorite_color': 'blue'}) + >>> suite.run(unittest.TestResult()) + + + And, you can provide setUp and tearDown functions: + + >>> def setUp(t): + ... import test.test_doctest + ... test.test_doctest.sillySetup = True + + >>> def tearDown(t): + ... import test.test_doctest + ... del test.test_doctest.sillySetup + + Here, we installed a silly variable that the test expects: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... setUp=setUp, tearDown=tearDown) + >>> suite.run(unittest.TestResult()) + + + But the tearDown restores sanity: + + >>> import test.test_doctest + >>> test.test_doctest.sillySetup + Traceback (most recent call last): + ... + AttributeError: 'module' object has no attribute 'sillySetup' + + The setUp and tearDown funtions are passed test objects. + Here, we'll use a setUp function to set the favorite color in + test_doctest.txt: + + >>> def setUp(test): + ... test.globs['favorite_color'] = 'blue' + + >>> suite = doctest.DocFileSuite('test_doctest.txt', setUp=setUp) + >>> suite.run(unittest.TestResult()) + + + Here, we didn't need to use a tearDown function because we + modified the test globals. The test globals are + automatically cleared for us after a test. + + Tests in a file run using `DocFileSuite` can also access the + `__file__` global, which is set to the name of the file + containing the tests: + + >>> suite = doctest.DocFileSuite('test_doctest3.txt') + >>> suite.run(unittest.TestResult()) + + + If the tests contain non-ASCII characters, we have to specify which + encoding the file is encoded with. We do so by using the `encoding` + parameter: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... 'test_doctest2.txt', + ... 'test_doctest4.txt', + ... encoding='utf-8') + >>> suite.run(unittest.TestResult()) + + + """ + +def test_trailing_space_in_test(): + """ + Trailing spaces in expected output are significant: + + >>> x, y = 'foo', '' + >>> print x, y + foo \n + """ + + +def test_unittest_reportflags(): + """Default unittest reporting flags can be set to control reporting + + Here, we'll set the REPORT_ONLY_FIRST_FAILURE option so we see + only the first failure of each test. First, we'll look at the + output without the flag. The file test_doctest.txt file has two + tests. They both fail if blank lines are disabled: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... optionflags=doctest.DONT_ACCEPT_BLANKLINE) + >>> import unittest + >>> result = suite.run(unittest.TestResult()) + >>> print result.failures[0][1] # doctest: +ELLIPSIS + Traceback ... + Failed example: + favorite_color + ... + Failed example: + if 1: + ... + + Note that we see both failures displayed. + + >>> old = doctest.set_unittest_reportflags( + ... doctest.REPORT_ONLY_FIRST_FAILURE) + + Now, when we run the test: + + >>> result = suite.run(unittest.TestResult()) + >>> print result.failures[0][1] # doctest: +ELLIPSIS + Traceback ... + Failed example: + favorite_color + Exception raised: + ... + NameError: name 'favorite_color' is not defined + + + + We get only the first failure. + + If we give any reporting options when we set up the tests, + however: + + >>> suite = doctest.DocFileSuite('test_doctest.txt', + ... optionflags=doctest.DONT_ACCEPT_BLANKLINE | doctest.REPORT_NDIFF) + + Then the default eporting options are ignored: + + >>> result = suite.run(unittest.TestResult()) + >>> print result.failures[0][1] # doctest: +ELLIPSIS + Traceback ... + Failed example: + favorite_color + ... + Failed example: + if 1: + print 'a' + print + print 'b' + Differences (ndiff with -expected +actual): + a + - + + + b + + + + + Test runners can restore the formatting flags after they run: + + >>> ignored = doctest.set_unittest_reportflags(old) + + """ + +def test_testfile(): r""" +Tests for the `testfile()` function. This function runs all the +doctest examples in a given file. In its simple invokation, it is +called with the name of a file, which is taken to be relative to the +calling module. The return value is (#failures, #tests). + +We don't want `-v` in sys.argv for these tests. + + >>> save_argv = sys.argv + >>> if '-v' in sys.argv: + ... sys.argv = [arg for arg in save_argv if arg != '-v'] + + + >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS + ********************************************************************** + File "...", line 6, in test_doctest.txt + Failed example: + favorite_color + Exception raised: + ... + NameError: name 'favorite_color' is not defined + ********************************************************************** + 1 items had failures: + 1 of 2 in test_doctest.txt + ***Test Failed*** 1 failures. + TestResults(failed=1, attempted=2) + >>> doctest.master = None # Reset master. + +(Note: we'll be clearing doctest.master after each call to +`doctest.testfile`, to suppress warnings about multiple tests with the +same name.) + +Globals may be specified with the `globs` and `extraglobs` parameters: + + >>> globs = {'favorite_color': 'blue'} + >>> doctest.testfile('test_doctest.txt', globs=globs) + TestResults(failed=0, attempted=2) + >>> doctest.master = None # Reset master. + + >>> extraglobs = {'favorite_color': 'red'} + >>> doctest.testfile('test_doctest.txt', globs=globs, + ... extraglobs=extraglobs) # doctest: +ELLIPSIS + ********************************************************************** + File "...", line 6, in test_doctest.txt + Failed example: + favorite_color + Expected: + 'blue' + Got: + 'red' + ********************************************************************** + 1 items had failures: + 1 of 2 in test_doctest.txt + ***Test Failed*** 1 failures. + TestResults(failed=1, attempted=2) + >>> doctest.master = None # Reset master. + +The file may be made relative to a given module or package, using the +optional `module_relative` parameter: + + >>> doctest.testfile('test_doctest.txt', globs=globs, + ... module_relative='test') + TestResults(failed=0, attempted=2) + >>> doctest.master = None # Reset master. + +Verbosity can be increased with the optional `verbose` parameter: + + >>> doctest.testfile('test_doctest.txt', globs=globs, verbose=True) + Trying: + favorite_color + Expecting: + 'blue' + ok + Trying: + if 1: + print 'a' + print + print 'b' + Expecting: + a + + b + ok + 1 items passed all tests: + 2 tests in test_doctest.txt + 2 tests in 1 items. + 2 passed and 0 failed. + Test passed. + TestResults(failed=0, attempted=2) + >>> doctest.master = None # Reset master. + +The name of the test may be specified with the optional `name` +parameter: + + >>> doctest.testfile('test_doctest.txt', name='newname') + ... # doctest: +ELLIPSIS + ********************************************************************** + File "...", line 6, in newname + ... + TestResults(failed=1, attempted=2) + >>> doctest.master = None # Reset master. + +The summary report may be suppressed with the optional `report` +parameter: + + >>> doctest.testfile('test_doctest.txt', report=False) + ... # doctest: +ELLIPSIS + ********************************************************************** + File "...", line 6, in test_doctest.txt + Failed example: + favorite_color + Exception raised: + ... + NameError: name 'favorite_color' is not defined + TestResults(failed=1, attempted=2) + >>> doctest.master = None # Reset master. + +The optional keyword argument `raise_on_error` can be used to raise an +exception on the first error (which may be useful for postmortem +debugging): + + >>> doctest.testfile('test_doctest.txt', raise_on_error=True) + ... # doctest: +ELLIPSIS + Traceback (most recent call last): + UnexpectedException: ... + >>> doctest.master = None # Reset master. + +If the tests contain non-ASCII characters, the tests might fail, since +it's unknown which encoding is used. The encoding can be specified +using the optional keyword argument `encoding`: + + >>> doctest.testfile('test_doctest4.txt') # doctest: +ELLIPSIS + ********************************************************************** + File "...", line 7, in test_doctest4.txt + Failed example: + u'...' + Expected: + u'f\xf6\xf6' + Got: + u'f\xc3\xb6\xc3\xb6' + ********************************************************************** + ... + ********************************************************************** + 1 items had failures: + 2 of 4 in test_doctest4.txt + ***Test Failed*** 2 failures. + TestResults(failed=2, attempted=4) + >>> doctest.master = None # Reset master. + + >>> doctest.testfile('test_doctest4.txt', encoding='utf-8') + TestResults(failed=0, attempted=4) + >>> doctest.master = None # Reset master. + +Switch the module encoding to 'utf-8' to test the verbose output without +bothering with the current sys.stdout encoding. + + >>> doctest._encoding, saved_encoding = 'utf-8', doctest._encoding + >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True) + Trying: + u'f??' + Expecting: + u'f\xf6\xf6' + ok + Trying: + u'b?r' + Expecting: + u'b\u0105r' + ok + Trying: + 'f??' + Expecting: + 'f\xc3\xb6\xc3\xb6' + ok + Trying: + 'b?r' + Expecting: + 'b\xc4\x85r' + ok + 1 items passed all tests: + 4 tests in test_doctest4.txt + 4 tests in 1 items. + 4 passed and 0 failed. + Test passed. + TestResults(failed=0, attempted=4) + >>> doctest._encoding = saved_encoding + >>> doctest.master = None # Reset master. + >>> sys.argv = save_argv +""" + +# old_test1, ... used to live in doctest.py, but cluttered it. Note +# that these use the deprecated doctest.Tester, so should go away (or +# be rewritten) someday. + +def old_test1(): r""" +>>> from doctest import Tester +>>> t = Tester(globs={'x': 42}, verbose=0) +>>> t.runstring(r''' +... >>> x = x * 2 +... >>> print x +... 42 +... ''', 'XYZ') +********************************************************************** +Line 3, in XYZ +Failed example: + print x +Expected: + 42 +Got: + 84 +TestResults(failed=1, attempted=2) +>>> t.runstring(">>> x = x * 2\n>>> print x\n84\n", 'example2') +TestResults(failed=0, attempted=2) +>>> t.summarize() +********************************************************************** +1 items had failures: + 1 of 2 in XYZ +***Test Failed*** 1 failures. +TestResults(failed=1, attempted=4) +>>> t.summarize(verbose=1) +1 items passed all tests: + 2 tests in example2 +********************************************************************** +1 items had failures: + 1 of 2 in XYZ +4 tests in 2 items. +3 passed and 1 failed. +***Test Failed*** 1 failures. +TestResults(failed=1, attempted=4) +""" + +def old_test2(): r""" + >>> from doctest import Tester + >>> t = Tester(globs={}, verbose=1) + >>> test = r''' + ... # just an example + ... >>> x = 1 + 2 + ... >>> x + ... 3 + ... ''' + >>> t.runstring(test, "Example") + Running string Example + Trying: + x = 1 + 2 + Expecting nothing + ok + Trying: + x + Expecting: + 3 + ok + 0 of 2 examples failed in string Example + TestResults(failed=0, attempted=2) +""" + +def old_test3(): r""" + >>> from doctest import Tester + >>> t = Tester(globs={}, verbose=0) + >>> def _f(): + ... '''Trivial docstring example. + ... >>> assert 2 == 2 + ... ''' + ... return 32 + ... + >>> t.rundoc(_f) # expect 0 failures in 1 example + TestResults(failed=0, attempted=1) +""" + +def old_test4(): """ + >>> import types + >>> m1 = types.ModuleType('_m1') + >>> m2 = types.ModuleType('_m2') + >>> test_data = \""" + ... def _f(): + ... '''>>> assert 1 == 1 + ... ''' + ... def g(): + ... '''>>> assert 2 != 1 + ... ''' + ... class H: + ... '''>>> assert 2 > 1 + ... ''' + ... def bar(self): + ... '''>>> assert 1 < 2 + ... ''' + ... \""" + >>> exec test_data in m1.__dict__ + >>> exec test_data in m2.__dict__ + >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H}) + + Tests that objects outside m1 are excluded: + + >>> from doctest import Tester + >>> t = Tester(globs={}, verbose=0) + >>> t.rundict(m1.__dict__, "rundict_test", m1) # f2 and g2 and h2 skipped + TestResults(failed=0, attempted=4) + + Once more, not excluding stuff outside m1: + + >>> t = Tester(globs={}, verbose=0) + >>> t.rundict(m1.__dict__, "rundict_test_pvt") # None are skipped. + TestResults(failed=0, attempted=8) + + The exclusion of objects from outside the designated module is + meant to be invoked automagically by testmod. + + >>> doctest.testmod(m1, verbose=False) + TestResults(failed=0, attempted=4) +""" + +###################################################################### +## Main +###################################################################### + +def test_main(): + # Check the doctest cases in doctest itself: + test_support.run_doctest(doctest, verbosity=True) + + from test import test_doctest + + # Ignore all warnings about the use of class Tester in this module. + deprecations = [("class Tester is deprecated", DeprecationWarning)] + if sys.py3kwarning: + deprecations += [("backquote not supported", SyntaxWarning), + ("execfile.. not supported", DeprecationWarning)] + with test_support.check_warnings(*deprecations): + # Check the doctest cases defined here: + test_support.run_doctest(test_doctest, verbosity=True) + +if __name__ == '__main__': + if '-c' in sys.argv: + test_coverage('/tmp/doctest.cover') + else: + test_main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 00:32:50 2012 From: jython-checkins at python.org (alan.kennedy) Date: Wed, 21 Mar 2012 00:32:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Fix_for_http=3A/?= =?utf8?q?/bugs=2Ejython=2Eorg/issue1640_=28cStringIO_does_not_complain_on?= Message-ID: http://hg.python.org/jython/rev/64e2170c655e changeset: 6442:64e2170c655e branch: 2.5 parent: 6426:2923c6c259f9 user: Alan Kennedy date: Tue Mar 20 23:29:25 2012 +0000 summary: Fix for http://bugs.jython.org/issue1640 (cStringIO does not complain on getvalue after close) files: Lib/test/test_StringIO_jy.py | 15 +++++++++++++++ src/org/python/modules/cStringIO.java | 6 ++++++ 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_StringIO_jy.py b/Lib/test/test_StringIO_jy.py --- a/Lib/test/test_StringIO_jy.py +++ b/Lib/test/test_StringIO_jy.py @@ -28,9 +28,24 @@ f.write("uvwxyz") self.assertEqual(f.getvalue(), 'abcdef\x00\x00\x00\x00uvwxyz') +class TestGetValueAfterClose(unittest.TestCase): + + # This test, or something like it, should be really be pushed upstream + def test_getvalue_after_close(self): + f = cStringIO.StringIO('hello') + f.getvalue() + f.close() + try: + f.getvalue() + except ValueError: + pass + else: + self.fail("cStringIO.StringIO: getvalue() after close() should have raised ValueError") + def test_main(): test_support.run_unittest(TestUnicodeInput) test_support.run_unittest(TestWrite) + test_support.run_unittest(TestGetValueAfterClose) if __name__ == '__main__': test_main() diff --git a/src/org/python/modules/cStringIO.java b/src/org/python/modules/cStringIO.java --- a/src/org/python/modules/cStringIO.java +++ b/src/org/python/modules/cStringIO.java @@ -106,6 +106,11 @@ */ public void close() { closed = true; + // No point in zeroing the buf, because it won't be reused. + // buf is a final variable, so can't set to null. + // Therefore, just leave it and let it be GC'ed when the enclosing object is GC'ed + // Or remove the final declaration + // buf = null; } @@ -402,6 +407,7 @@ * @return the contents of the StringIO. */ public synchronized PyString getvalue() { + _complain_ifclosed(); return new PyString(buf.toString()); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 00:32:50 2012 From: jython-checkins at python.org (alan.kennedy) Date: Wed, 21 Mar 2012 00:32:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Updating_NEWS_fi?= =?utf8?q?le_about_issue_1640?= Message-ID: http://hg.python.org/jython/rev/9c21ad4e5818 changeset: 6443:9c21ad4e5818 branch: 2.5 user: Alan Kennedy date: Tue Mar 20 23:31:05 2012 +0000 summary: Updating NEWS file about issue 1640 files: NEWS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1640 ] cStringIO does not complain on getvalue after close - [ 1749 ] function descriptor doesn't work in interactive console - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 00:32:50 2012 From: jython-checkins at python.org (alan.kennedy) Date: Wed, 21 Mar 2012 00:32:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_w/2=2E5=3A_Fix_for_http=3A//bugs=2Ejython=2Eorg/issue1?= =?utf8?q?640_=28cStringIO_does_not?= Message-ID: http://hg.python.org/jython/rev/6163f0c0208f changeset: 6444:6163f0c0208f parent: 6441:4be64842a1d9 parent: 6443:9c21ad4e5818 user: Alan Kennedy date: Tue Mar 20 23:32:11 2012 +0000 summary: Merge w/2.5: Fix for http://bugs.jython.org/issue1640 (cStringIO does not complain on getvalue after close) files: Lib/test/test_StringIO_jy.py | 15 +++++++++++++++ NEWS | 1 + src/org/python/modules/cStringIO.java | 6 ++++++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_StringIO_jy.py b/Lib/test/test_StringIO_jy.py --- a/Lib/test/test_StringIO_jy.py +++ b/Lib/test/test_StringIO_jy.py @@ -28,9 +28,24 @@ f.write("uvwxyz") self.assertEqual(f.getvalue(), 'abcdef\x00\x00\x00\x00uvwxyz') +class TestGetValueAfterClose(unittest.TestCase): + + # This test, or something like it, should be really be pushed upstream + def test_getvalue_after_close(self): + f = cStringIO.StringIO('hello') + f.getvalue() + f.close() + try: + f.getvalue() + except ValueError: + pass + else: + self.fail("cStringIO.StringIO: getvalue() after close() should have raised ValueError") + def test_main(): test_support.run_unittest(TestUnicodeInput) test_support.run_unittest(TestWrite) + test_support.run_unittest(TestGetValueAfterClose) if __name__ == '__main__': test_main() diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1640 ] cStringIO does not complain on getvalue after close - [ 1749 ] function descriptor doesn't work in interactive console - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 diff --git a/src/org/python/modules/cStringIO.java b/src/org/python/modules/cStringIO.java --- a/src/org/python/modules/cStringIO.java +++ b/src/org/python/modules/cStringIO.java @@ -107,6 +107,11 @@ */ public void close() { closed = true; + // No point in zeroing the buf, because it won't be reused. + // buf is a final variable, so can't set to null. + // Therefore, just leave it and let it be GC'ed when the enclosing object is GC'ed + // Or remove the final declaration + // buf = null; } @@ -405,6 +410,7 @@ * @return the contents of the StringIO. */ public synchronized PyString getvalue() { + _complain_ifclosed(); return new PyString(buf.toString()); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 00:48:27 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 00:48:27 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2Uu?= Message-ID: http://hg.python.org/jython/rev/ac16e01946d8 changeset: 6446:ac16e01946d8 parent: 6445:fca881c80a21 parent: 6444:6163f0c0208f user: Frank Wierzbicki date: Tue Mar 20 16:48:16 2012 -0700 summary: Merge. files: Lib/test/test_StringIO_jy.py | 15 +++++++++++++++ NEWS | 1 + src/org/python/modules/cStringIO.java | 6 ++++++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_StringIO_jy.py b/Lib/test/test_StringIO_jy.py --- a/Lib/test/test_StringIO_jy.py +++ b/Lib/test/test_StringIO_jy.py @@ -28,9 +28,24 @@ f.write("uvwxyz") self.assertEqual(f.getvalue(), 'abcdef\x00\x00\x00\x00uvwxyz') +class TestGetValueAfterClose(unittest.TestCase): + + # This test, or something like it, should be really be pushed upstream + def test_getvalue_after_close(self): + f = cStringIO.StringIO('hello') + f.getvalue() + f.close() + try: + f.getvalue() + except ValueError: + pass + else: + self.fail("cStringIO.StringIO: getvalue() after close() should have raised ValueError") + def test_main(): test_support.run_unittest(TestUnicodeInput) test_support.run_unittest(TestWrite) + test_support.run_unittest(TestGetValueAfterClose) if __name__ == '__main__': test_main() diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1640 ] cStringIO does not complain on getvalue after close - [ 1749 ] function descriptor doesn't work in interactive console - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 diff --git a/src/org/python/modules/cStringIO.java b/src/org/python/modules/cStringIO.java --- a/src/org/python/modules/cStringIO.java +++ b/src/org/python/modules/cStringIO.java @@ -107,6 +107,11 @@ */ public void close() { closed = true; + // No point in zeroing the buf, because it won't be reused. + // buf is a final variable, so can't set to null. + // Therefore, just leave it and let it be GC'ed when the enclosing object is GC'ed + // Or remove the final declaration + // buf = null; } @@ -405,6 +410,7 @@ * @return the contents of the StringIO. */ public synchronized PyString getvalue() { + _complain_ifclosed(); return new PyString(buf.toString()); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 00:48:27 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 00:48:27 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_See_FIXMEs_-_note_decimaltes?= =?utf8?q?tdata=2Eextra=2EdecTest_is_being_clobbered_for_Jython=2E?= Message-ID: http://hg.python.org/jython/rev/fca881c80a21 changeset: 6445:fca881c80a21 parent: 6441:4be64842a1d9 user: Frank Wierzbicki date: Tue Mar 20 16:46:58 2012 -0700 summary: See FIXMEs - note decimaltestdata.extra.decTest is being clobbered for Jython. files: Lib/test/decimaltestdata/extra.decTest | 1 + Lib/test/test_decimal.py | 2350 ++++++++++++ 2 files changed, 2351 insertions(+), 0 deletions(-) diff --git a/Lib/test/decimaltestdata/extra.decTest b/Lib/test/decimaltestdata/extra.decTest new file mode 100644 --- /dev/null +++ b/Lib/test/decimaltestdata/extra.decTest @@ -0,0 +1,1 @@ +#FIXME #1865: these tests appear to hang in Jython. diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_decimal.py @@ -0,0 +1,2350 @@ +# Copyright (c) 2004 Python Software Foundation. +# All rights reserved. + +# Written by Eric Price +# and Facundo Batista +# and Raymond Hettinger +# and Aahz (aahz at pobox.com) +# and Tim Peters + +""" +These are the test cases for the Decimal module. + +There are two groups of tests, Arithmetic and Behaviour. The former test +the Decimal arithmetic using the tests provided by Mike Cowlishaw. The latter +test the pythonic behaviour according to PEP 327. + +Cowlishaw's tests can be downloaded from: + + www2.hursley.ibm.com/decimal/dectest.zip + +This test module can be called from command line with one parameter (Arithmetic +or Behaviour) to test each part, or without parameter to test both parts. If +you're working through IDLE, you can import this test module and call test_main() +with the corresponding argument. +""" + +import math +import os, sys +import operator +import pickle, copy +import unittest +from decimal import * +import numbers +from test.test_support import (run_unittest, run_doctest, is_jython, + is_resource_enabled, check_py3k_warnings) +import random +try: + import threading +except ImportError: + threading = None + +# Useful Test Constant +Signals = tuple(getcontext().flags.keys()) + +# Signals ordered with respect to precedence: when an operation +# produces multiple signals, signals occurring later in the list +# should be handled before those occurring earlier in the list. +OrderedSignals = (Clamped, Rounded, Inexact, Subnormal, + Underflow, Overflow, DivisionByZero, InvalidOperation) + +# Tests are built around these assumed context defaults. +# test_main() restores the original context. +def init(): + global ORIGINAL_CONTEXT + ORIGINAL_CONTEXT = getcontext().copy() + DefaultTestContext = Context( + prec = 9, + rounding = ROUND_HALF_EVEN, + traps = dict.fromkeys(Signals, 0) + ) + setcontext(DefaultTestContext) + +# decorator for skipping tests on non-IEEE 754 platforms +requires_IEEE_754 = unittest.skipUnless( + float.__getformat__("double").startswith("IEEE"), + "test requires IEEE 754 doubles") + +TESTDATADIR = 'decimaltestdata' +if __name__ == '__main__': + file = sys.argv[0] +else: + file = __file__ +testdir = os.path.dirname(file) or os.curdir +directory = testdir + os.sep + TESTDATADIR + os.sep + +skip_expected = not os.path.isdir(directory) + +# list of individual .decTest test ids that correspond to tests that +# we're skipping for one reason or another. +skipped_test_ids = set([ + # Skip implementation-specific scaleb tests. + 'scbx164', + 'scbx165', + + # For some operations (currently exp, ln, log10, power), the decNumber + # reference implementation imposes additional restrictions on the context + # and operands. These restrictions are not part of the specification; + # however, the effect of these restrictions does show up in some of the + # testcases. We skip testcases that violate these restrictions, since + # Decimal behaves differently from decNumber for these testcases so these + # testcases would otherwise fail. + 'expx901', + 'expx902', + 'expx903', + 'expx905', + 'lnx901', + 'lnx902', + 'lnx903', + 'lnx905', + 'logx901', + 'logx902', + 'logx903', + 'logx905', + 'powx1183', + 'powx1184', + 'powx4001', + 'powx4002', + 'powx4003', + 'powx4005', + 'powx4008', + 'powx4010', + 'powx4012', + 'powx4014', + ]) + +# Make sure it actually raises errors when not expected and caught in flags +# Slower, since it runs some things several times. +EXTENDEDERRORTEST = False + +#Map the test cases' error names to the actual errors +ErrorNames = {'clamped' : Clamped, + 'conversion_syntax' : InvalidOperation, + 'division_by_zero' : DivisionByZero, + 'division_impossible' : InvalidOperation, + 'division_undefined' : InvalidOperation, + 'inexact' : Inexact, + 'invalid_context' : InvalidOperation, + 'invalid_operation' : InvalidOperation, + 'overflow' : Overflow, + 'rounded' : Rounded, + 'subnormal' : Subnormal, + 'underflow' : Underflow} + + +def Nonfunction(*args): + """Doesn't do anything.""" + return None + +RoundingDict = {'ceiling' : ROUND_CEILING, #Maps test-case names to roundings. + 'down' : ROUND_DOWN, + 'floor' : ROUND_FLOOR, + 'half_down' : ROUND_HALF_DOWN, + 'half_even' : ROUND_HALF_EVEN, + 'half_up' : ROUND_HALF_UP, + 'up' : ROUND_UP, + '05up' : ROUND_05UP} + +# Name adapter to be able to change the Decimal and Context +# interface without changing the test files from Cowlishaw +nameAdapter = {'and':'logical_and', + 'apply':'_apply', + 'class':'number_class', + 'comparesig':'compare_signal', + 'comparetotal':'compare_total', + 'comparetotmag':'compare_total_mag', + 'copy':'copy_decimal', + 'copyabs':'copy_abs', + 'copynegate':'copy_negate', + 'copysign':'copy_sign', + 'divideint':'divide_int', + 'invert':'logical_invert', + 'iscanonical':'is_canonical', + 'isfinite':'is_finite', + 'isinfinite':'is_infinite', + 'isnan':'is_nan', + 'isnormal':'is_normal', + 'isqnan':'is_qnan', + 'issigned':'is_signed', + 'issnan':'is_snan', + 'issubnormal':'is_subnormal', + 'iszero':'is_zero', + 'maxmag':'max_mag', + 'minmag':'min_mag', + 'nextminus':'next_minus', + 'nextplus':'next_plus', + 'nexttoward':'next_toward', + 'or':'logical_or', + 'reduce':'normalize', + 'remaindernear':'remainder_near', + 'samequantum':'same_quantum', + 'squareroot':'sqrt', + 'toeng':'to_eng_string', + 'tointegral':'to_integral_value', + 'tointegralx':'to_integral_exact', + 'tosci':'to_sci_string', + 'xor':'logical_xor', + } + +# The following functions return True/False rather than a Decimal instance + +LOGICAL_FUNCTIONS = ( + 'is_canonical', + 'is_finite', + 'is_infinite', + 'is_nan', + 'is_normal', + 'is_qnan', + 'is_signed', + 'is_snan', + 'is_subnormal', + 'is_zero', + 'same_quantum', + ) + +class DecimalTest(unittest.TestCase): + """Class which tests the Decimal class against the test cases. + + Changed for unittest. + """ + def setUp(self): + self.context = Context() + self.ignore_list = ['#'] + # Basically, a # means return NaN InvalidOperation. + # Different from a sNaN in trim + + self.ChangeDict = {'precision' : self.change_precision, + 'rounding' : self.change_rounding_method, + 'maxexponent' : self.change_max_exponent, + 'minexponent' : self.change_min_exponent, + 'clamp' : self.change_clamp} + + def eval_file(self, file): + global skip_expected + if skip_expected: + raise unittest.SkipTest + return + with open(file) as f: + for line in f: + line = line.replace('\r\n', '').replace('\n', '') + #print line + try: + t = self.eval_line(line) + except DecimalException as exception: + #Exception raised where there shouldn't have been one. + self.fail('Exception "'+exception.__class__.__name__ + '" raised on line '+line) + + return + + def eval_line(self, s): + if s.find(' -> ') >= 0 and s[:2] != '--' and not s.startswith(' --'): + s = (s.split('->')[0] + '->' + + s.split('->')[1].split('--')[0]).strip() + else: + s = s.split('--')[0].strip() + + for ignore in self.ignore_list: + if s.find(ignore) >= 0: + #print s.split()[0], 'NotImplemented--', ignore + return + if not s: + return + elif ':' in s: + return self.eval_directive(s) + else: + return self.eval_equation(s) + + def eval_directive(self, s): + funct, value = map(lambda x: x.strip().lower(), s.split(':')) + if funct == 'rounding': + value = RoundingDict[value] + else: + try: + value = int(value) + except ValueError: + pass + + funct = self.ChangeDict.get(funct, Nonfunction) + funct(value) + + def eval_equation(self, s): + #global DEFAULT_PRECISION + #print DEFAULT_PRECISION + + if not TEST_ALL and random.random() < 0.90: + return + + try: + Sides = s.split('->') + L = Sides[0].strip().split() + id = L[0] + if DEBUG: + print "Test ", id, + funct = L[1].lower() + valstemp = L[2:] + L = Sides[1].strip().split() + ans = L[0] + exceptions = L[1:] + except (TypeError, AttributeError, IndexError): + raise InvalidOperation + def FixQuotes(val): + val = val.replace("''", 'SingleQuote').replace('""', 'DoubleQuote') + val = val.replace("'", '').replace('"', '') + val = val.replace('SingleQuote', "'").replace('DoubleQuote', '"') + return val + + if id in skipped_test_ids: + return + + fname = nameAdapter.get(funct, funct) + if fname == 'rescale': + return + funct = getattr(self.context, fname) + vals = [] + conglomerate = '' + quote = 0 + theirexceptions = [ErrorNames[x.lower()] for x in exceptions] + + for exception in Signals: + self.context.traps[exception] = 1 #Catch these bugs... + for exception in theirexceptions: + self.context.traps[exception] = 0 + for i, val in enumerate(valstemp): + if val.count("'") % 2 == 1: + quote = 1 - quote + if quote: + conglomerate = conglomerate + ' ' + val + continue + else: + val = conglomerate + val + conglomerate = '' + v = FixQuotes(val) + if fname in ('to_sci_string', 'to_eng_string'): + if EXTENDEDERRORTEST: + for error in theirexceptions: + self.context.traps[error] = 1 + try: + funct(self.context.create_decimal(v)) + except error: + pass + except Signals, e: + self.fail("Raised %s in %s when %s disabled" % \ + (e, s, error)) + else: + self.fail("Did not raise %s in %s" % (error, s)) + self.context.traps[error] = 0 + v = self.context.create_decimal(v) + else: + v = Decimal(v, self.context) + vals.append(v) + + ans = FixQuotes(ans) + + if EXTENDEDERRORTEST and fname not in ('to_sci_string', 'to_eng_string'): + for error in theirexceptions: + self.context.traps[error] = 1 + try: + funct(*vals) + except error: + pass + except Signals, e: + self.fail("Raised %s in %s when %s disabled" % \ + (e, s, error)) + else: + self.fail("Did not raise %s in %s" % (error, s)) + self.context.traps[error] = 0 + + # as above, but add traps cumulatively, to check precedence + ordered_errors = [e for e in OrderedSignals if e in theirexceptions] + for error in ordered_errors: + self.context.traps[error] = 1 + try: + funct(*vals) + except error: + pass + except Signals, e: + self.fail("Raised %s in %s; expected %s" % + (type(e), s, error)) + else: + self.fail("Did not raise %s in %s" % (error, s)) + # reset traps + for error in ordered_errors: + self.context.traps[error] = 0 + + + if DEBUG: + print "--", self.context + try: + result = str(funct(*vals)) + if fname in LOGICAL_FUNCTIONS: + result = str(int(eval(result))) # 'True', 'False' -> '1', '0' + except Signals, error: + self.fail("Raised %s in %s" % (error, s)) + except: #Catch any error long enough to state the test case. + print "ERROR:", s + raise + + myexceptions = self.getexceptions() + self.context.clear_flags() + + self.assertEqual(result, ans, + 'Incorrect answer for ' + s + ' -- got ' + result) + self.assertItemsEqual(myexceptions, theirexceptions, + 'Incorrect flags set in ' + s + ' -- got ' + str(myexceptions)) + return + + def getexceptions(self): + return [e for e in Signals if self.context.flags[e]] + + def change_precision(self, prec): + self.context.prec = prec + def change_rounding_method(self, rounding): + self.context.rounding = rounding + def change_min_exponent(self, exp): + self.context.Emin = exp + def change_max_exponent(self, exp): + self.context.Emax = exp + def change_clamp(self, clamp): + self.context._clamp = clamp + + + +# The following classes test the behaviour of Decimal according to PEP 327 + +class DecimalExplicitConstructionTest(unittest.TestCase): + '''Unit tests for Explicit Construction cases of Decimal.''' + + def test_explicit_empty(self): + self.assertEqual(Decimal(), Decimal("0")) + + def test_explicit_from_None(self): + self.assertRaises(TypeError, Decimal, None) + + def test_explicit_from_int(self): + + #positive + d = Decimal(45) + self.assertEqual(str(d), '45') + + #very large positive + d = Decimal(500000123) + self.assertEqual(str(d), '500000123') + + #negative + d = Decimal(-45) + self.assertEqual(str(d), '-45') + + #zero + d = Decimal(0) + self.assertEqual(str(d), '0') + + def test_explicit_from_string(self): + + #empty + self.assertEqual(str(Decimal('')), 'NaN') + + #int + self.assertEqual(str(Decimal('45')), '45') + + #float + self.assertEqual(str(Decimal('45.34')), '45.34') + + #engineer notation + self.assertEqual(str(Decimal('45e2')), '4.5E+3') + + #just not a number + self.assertEqual(str(Decimal('ugly')), 'NaN') + + #leading and trailing whitespace permitted + self.assertEqual(str(Decimal('1.3E4 \n')), '1.3E+4') + self.assertEqual(str(Decimal(' -7.89')), '-7.89') + + #unicode strings should be permitted + self.assertEqual(str(Decimal(u'0E-017')), '0E-17') + self.assertEqual(str(Decimal(u'45')), '45') + self.assertEqual(str(Decimal(u'-Inf')), '-Infinity') + self.assertEqual(str(Decimal(u'NaN123')), 'NaN123') + + def test_explicit_from_tuples(self): + + #zero + d = Decimal( (0, (0,), 0) ) + self.assertEqual(str(d), '0') + + #int + d = Decimal( (1, (4, 5), 0) ) + self.assertEqual(str(d), '-45') + + #float + d = Decimal( (0, (4, 5, 3, 4), -2) ) + self.assertEqual(str(d), '45.34') + + #weird + d = Decimal( (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) ) + self.assertEqual(str(d), '-4.34913534E-17') + + #wrong number of items + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1)) ) + + #bad sign + self.assertRaises(ValueError, Decimal, (8, (4, 3, 4, 9, 1), 2) ) + self.assertRaises(ValueError, Decimal, (0., (4, 3, 4, 9, 1), 2) ) + self.assertRaises(ValueError, Decimal, (Decimal(1), (4, 3, 4, 9, 1), 2)) + + #bad exp + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), 'wrong!') ) + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), 0.) ) + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), '1') ) + + #bad coefficients + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, None, 1), 2) ) + self.assertRaises(ValueError, Decimal, (1, (4, -3, 4, 9, 1), 2) ) + self.assertRaises(ValueError, Decimal, (1, (4, 10, 4, 9, 1), 2) ) + self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 'a', 1), 2) ) + + def test_explicit_from_bool(self): + self.assertIs(bool(Decimal(0)), False) + self.assertIs(bool(Decimal(1)), True) + self.assertEqual(Decimal(False), Decimal(0)) + self.assertEqual(Decimal(True), Decimal(1)) + + def test_explicit_from_Decimal(self): + + #positive + d = Decimal(45) + e = Decimal(d) + self.assertEqual(str(e), '45') + self.assertNotEqual(id(d), id(e)) + + #very large positive + d = Decimal(500000123) + e = Decimal(d) + self.assertEqual(str(e), '500000123') + self.assertNotEqual(id(d), id(e)) + + #negative + d = Decimal(-45) + e = Decimal(d) + self.assertEqual(str(e), '-45') + self.assertNotEqual(id(d), id(e)) + + #zero + d = Decimal(0) + e = Decimal(d) + self.assertEqual(str(e), '0') + self.assertNotEqual(id(d), id(e)) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + @requires_IEEE_754 + def test_explicit_from_float(self): + r = Decimal(0.1) + self.assertEqual(type(r), Decimal) + self.assertEqual(str(r), + '0.1000000000000000055511151231257827021181583404541015625') + self.assertTrue(Decimal(float('nan')).is_qnan()) + self.assertTrue(Decimal(float('inf')).is_infinite()) + self.assertTrue(Decimal(float('-inf')).is_infinite()) + self.assertEqual(str(Decimal(float('nan'))), + str(Decimal('NaN'))) + self.assertEqual(str(Decimal(float('inf'))), + str(Decimal('Infinity'))) + self.assertEqual(str(Decimal(float('-inf'))), + str(Decimal('-Infinity'))) + self.assertEqual(str(Decimal(float('-0.0'))), + str(Decimal('-0'))) + for i in range(200): + x = random.expovariate(0.01) * (random.random() * 2.0 - 1.0) + self.assertEqual(x, float(Decimal(x))) # roundtrip + + def test_explicit_context_create_decimal(self): + + nc = copy.copy(getcontext()) + nc.prec = 3 + + # empty + d = Decimal() + self.assertEqual(str(d), '0') + d = nc.create_decimal() + self.assertEqual(str(d), '0') + + # from None + self.assertRaises(TypeError, nc.create_decimal, None) + + # from int + d = nc.create_decimal(456) + self.assertIsInstance(d, Decimal) + self.assertEqual(nc.create_decimal(45678), + nc.create_decimal('457E+2')) + + # from string + d = Decimal('456789') + self.assertEqual(str(d), '456789') + d = nc.create_decimal('456789') + self.assertEqual(str(d), '4.57E+5') + # leading and trailing whitespace should result in a NaN; + # spaces are already checked in Cowlishaw's test-suite, so + # here we just check that a trailing newline results in a NaN + self.assertEqual(str(nc.create_decimal('3.14\n')), 'NaN') + + # from tuples + d = Decimal( (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) ) + self.assertEqual(str(d), '-4.34913534E-17') + d = nc.create_decimal( (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) ) + self.assertEqual(str(d), '-4.35E-17') + + # from Decimal + prevdec = Decimal(500000123) + d = Decimal(prevdec) + self.assertEqual(str(d), '500000123') + d = nc.create_decimal(prevdec) + self.assertEqual(str(d), '5.00E+8') + + def test_unicode_digits(self): + test_values = { + u'\uff11': '1', + u'\u0660.\u0660\u0663\u0667\u0662e-\u0663' : '0.0000372', + u'-nan\u0c68\u0c6a\u0c66\u0c66' : '-NaN2400', + } + for input, expected in test_values.items(): + self.assertEqual(str(Decimal(input)), expected) + + +class DecimalImplicitConstructionTest(unittest.TestCase): + '''Unit tests for Implicit Construction cases of Decimal.''' + + def test_implicit_from_None(self): + self.assertRaises(TypeError, eval, 'Decimal(5) + None', globals()) + + def test_implicit_from_int(self): + #normal + self.assertEqual(str(Decimal(5) + 45), '50') + #exceeding precision + self.assertEqual(Decimal(5) + 123456789000, Decimal(123456789000)) + + def test_implicit_from_string(self): + self.assertRaises(TypeError, eval, 'Decimal(5) + "3"', globals()) + + def test_implicit_from_float(self): + self.assertRaises(TypeError, eval, 'Decimal(5) + 2.2', globals()) + + def test_implicit_from_Decimal(self): + self.assertEqual(Decimal(5) + Decimal(45), Decimal(50)) + + def test_rop(self): + # Allow other classes to be trained to interact with Decimals + class E: + def __divmod__(self, other): + return 'divmod ' + str(other) + def __rdivmod__(self, other): + return str(other) + ' rdivmod' + def __lt__(self, other): + return 'lt ' + str(other) + def __gt__(self, other): + return 'gt ' + str(other) + def __le__(self, other): + return 'le ' + str(other) + def __ge__(self, other): + return 'ge ' + str(other) + def __eq__(self, other): + return 'eq ' + str(other) + def __ne__(self, other): + return 'ne ' + str(other) + + self.assertEqual(divmod(E(), Decimal(10)), 'divmod 10') + self.assertEqual(divmod(Decimal(10), E()), '10 rdivmod') + self.assertEqual(eval('Decimal(10) < E()'), 'gt 10') + self.assertEqual(eval('Decimal(10) > E()'), 'lt 10') + self.assertEqual(eval('Decimal(10) <= E()'), 'ge 10') + self.assertEqual(eval('Decimal(10) >= E()'), 'le 10') + self.assertEqual(eval('Decimal(10) == E()'), 'eq 10') + self.assertEqual(eval('Decimal(10) != E()'), 'ne 10') + + # insert operator methods and then exercise them + oplist = [ + ('+', '__add__', '__radd__'), + ('-', '__sub__', '__rsub__'), + ('*', '__mul__', '__rmul__'), + ('%', '__mod__', '__rmod__'), + ('//', '__floordiv__', '__rfloordiv__'), + ('**', '__pow__', '__rpow__') + ] + with check_py3k_warnings(): + if 1 / 2 == 0: + # testing with classic division, so add __div__ + oplist.append(('/', '__div__', '__rdiv__')) + else: + # testing with -Qnew, so add __truediv__ + oplist.append(('/', '__truediv__', '__rtruediv__')) + + for sym, lop, rop in oplist: + setattr(E, lop, lambda self, other: 'str' + lop + str(other)) + setattr(E, rop, lambda self, other: str(other) + rop + 'str') + self.assertEqual(eval('E()' + sym + 'Decimal(10)'), + 'str' + lop + '10') + self.assertEqual(eval('Decimal(10)' + sym + 'E()'), + '10' + rop + 'str') + + +class DecimalFormatTest(unittest.TestCase): + '''Unit tests for the format function.''' + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_formatting(self): + # triples giving a format, a Decimal, and the expected result + test_values = [ + ('e', '0E-15', '0e-15'), + ('e', '2.3E-15', '2.3e-15'), + ('e', '2.30E+2', '2.30e+2'), # preserve significant zeros + ('e', '2.30000E-15', '2.30000e-15'), + ('e', '1.23456789123456789e40', '1.23456789123456789e+40'), + ('e', '1.5', '1.5e+0'), + ('e', '0.15', '1.5e-1'), + ('e', '0.015', '1.5e-2'), + ('e', '0.0000000000015', '1.5e-12'), + ('e', '15.0', '1.50e+1'), + ('e', '-15', '-1.5e+1'), + ('e', '0', '0e+0'), + ('e', '0E1', '0e+1'), + ('e', '0.0', '0e-1'), + ('e', '0.00', '0e-2'), + ('.6e', '0E-15', '0.000000e-9'), + ('.6e', '0', '0.000000e+6'), + ('.6e', '9.999999', '9.999999e+0'), + ('.6e', '9.9999999', '1.000000e+1'), + ('.6e', '-1.23e5', '-1.230000e+5'), + ('.6e', '1.23456789e-3', '1.234568e-3'), + ('f', '0', '0'), + ('f', '0.0', '0.0'), + ('f', '0E-2', '0.00'), + ('f', '0.00E-8', '0.0000000000'), + ('f', '0E1', '0'), # loses exponent information + ('f', '3.2E1', '32'), + ('f', '3.2E2', '320'), + ('f', '3.20E2', '320'), + ('f', '3.200E2', '320.0'), + ('f', '3.2E-6', '0.0000032'), + ('.6f', '0E-15', '0.000000'), # all zeros treated equally + ('.6f', '0E1', '0.000000'), + ('.6f', '0', '0.000000'), + ('.0f', '0', '0'), # no decimal point + ('.0f', '0e-2', '0'), + ('.0f', '3.14159265', '3'), + ('.1f', '3.14159265', '3.1'), + ('.4f', '3.14159265', '3.1416'), + ('.6f', '3.14159265', '3.141593'), + ('.7f', '3.14159265', '3.1415926'), # round-half-even! + ('.8f', '3.14159265', '3.14159265'), + ('.9f', '3.14159265', '3.141592650'), + + ('g', '0', '0'), + ('g', '0.0', '0.0'), + ('g', '0E1', '0e+1'), + ('G', '0E1', '0E+1'), + ('g', '0E-5', '0.00000'), + ('g', '0E-6', '0.000000'), + ('g', '0E-7', '0e-7'), + ('g', '-0E2', '-0e+2'), + ('.0g', '3.14159265', '3'), # 0 sig fig -> 1 sig fig + ('.1g', '3.14159265', '3'), + ('.2g', '3.14159265', '3.1'), + ('.5g', '3.14159265', '3.1416'), + ('.7g', '3.14159265', '3.141593'), + ('.8g', '3.14159265', '3.1415926'), # round-half-even! + ('.9g', '3.14159265', '3.14159265'), + ('.10g', '3.14159265', '3.14159265'), # don't pad + + ('%', '0E1', '0%'), + ('%', '0E0', '0%'), + ('%', '0E-1', '0%'), + ('%', '0E-2', '0%'), + ('%', '0E-3', '0.0%'), + ('%', '0E-4', '0.00%'), + + ('.3%', '0', '0.000%'), # all zeros treated equally + ('.3%', '0E10', '0.000%'), + ('.3%', '0E-10', '0.000%'), + ('.3%', '2.34', '234.000%'), + ('.3%', '1.234567', '123.457%'), + ('.0%', '1.23', '123%'), + + ('e', 'NaN', 'NaN'), + ('f', '-NaN123', '-NaN123'), + ('+g', 'NaN456', '+NaN456'), + ('.3e', 'Inf', 'Infinity'), + ('.16f', '-Inf', '-Infinity'), + ('.0g', '-sNaN', '-sNaN'), + + ('', '1.00', '1.00'), + + # test alignment and padding + ('6', '123', ' 123'), + ('<6', '123', '123 '), + ('>6', '123', ' 123'), + ('^6', '123', ' 123 '), + ('=+6', '123', '+ 123'), + ('#<10', 'NaN', 'NaN#######'), + ('#<10', '-4.3', '-4.3######'), + ('#<+10', '0.0130', '+0.0130###'), + ('#< 10', '0.0130', ' 0.0130###'), + ('@>10', '-Inf', '@-Infinity'), + ('#>5', '-Inf', '-Infinity'), + ('?^5', '123', '?123?'), + ('%^6', '123', '%123%%'), + (' ^6', '-45.6', '-45.6 '), + ('/=10', '-45.6', '-/////45.6'), + ('/=+10', '45.6', '+/////45.6'), + ('/= 10', '45.6', ' /////45.6'), + + # thousands separator + (',', '1234567', '1,234,567'), + (',', '123456', '123,456'), + (',', '12345', '12,345'), + (',', '1234', '1,234'), + (',', '123', '123'), + (',', '12', '12'), + (',', '1', '1'), + (',', '0', '0'), + (',', '-1234567', '-1,234,567'), + (',', '-123456', '-123,456'), + ('7,', '123456', '123,456'), + ('8,', '123456', ' 123,456'), + ('08,', '123456', '0,123,456'), # special case: extra 0 needed + ('+08,', '123456', '+123,456'), # but not if there's a sign + (' 08,', '123456', ' 123,456'), + ('08,', '-123456', '-123,456'), + ('+09,', '123456', '+0,123,456'), + # ... with fractional part... + ('07,', '1234.56', '1,234.56'), + ('08,', '1234.56', '1,234.56'), + ('09,', '1234.56', '01,234.56'), + ('010,', '1234.56', '001,234.56'), + ('011,', '1234.56', '0,001,234.56'), + ('012,', '1234.56', '0,001,234.56'), + ('08,.1f', '1234.5', '01,234.5'), + # no thousands separators in fraction part + (',', '1.23456789', '1.23456789'), + (',%', '123.456789', '12,345.6789%'), + (',e', '123456', '1.23456e+5'), + (',E', '123456', '1.23456E+5'), + + # issue 6850 + ('a=-7.0', '0.12345', 'aaaa0.1'), + ] + for fmt, d, result in test_values: + self.assertEqual(format(Decimal(d), fmt), result) + + def test_n_format(self): + try: + from locale import CHAR_MAX + except ImportError: + return + + # Set up some localeconv-like dictionaries + en_US = { + 'decimal_point' : '.', + 'grouping' : [3, 3, 0], + 'thousands_sep': ',' + } + + fr_FR = { + 'decimal_point' : ',', + 'grouping' : [CHAR_MAX], + 'thousands_sep' : '' + } + + ru_RU = { + 'decimal_point' : ',', + 'grouping' : [3, 3, 0], + 'thousands_sep' : ' ' + } + + crazy = { + 'decimal_point' : '&', + 'grouping' : [1, 4, 2, CHAR_MAX], + 'thousands_sep' : '-' + } + + + def get_fmt(x, locale, fmt='n'): + return Decimal.__format__(Decimal(x), fmt, _localeconv=locale) + + self.assertEqual(get_fmt(Decimal('12.7'), en_US), '12.7') + self.assertEqual(get_fmt(Decimal('12.7'), fr_FR), '12,7') + self.assertEqual(get_fmt(Decimal('12.7'), ru_RU), '12,7') + self.assertEqual(get_fmt(Decimal('12.7'), crazy), '1-2&7') + + self.assertEqual(get_fmt(123456789, en_US), '123,456,789') + self.assertEqual(get_fmt(123456789, fr_FR), '123456789') + self.assertEqual(get_fmt(123456789, ru_RU), '123 456 789') + self.assertEqual(get_fmt(1234567890123, crazy), '123456-78-9012-3') + + self.assertEqual(get_fmt(123456789, en_US, '.6n'), '1.23457e+8') + self.assertEqual(get_fmt(123456789, fr_FR, '.6n'), '1,23457e+8') + self.assertEqual(get_fmt(123456789, ru_RU, '.6n'), '1,23457e+8') + self.assertEqual(get_fmt(123456789, crazy, '.6n'), '1&23457e+8') + + # zero padding + self.assertEqual(get_fmt(1234, fr_FR, '03n'), '1234') + self.assertEqual(get_fmt(1234, fr_FR, '04n'), '1234') + self.assertEqual(get_fmt(1234, fr_FR, '05n'), '01234') + self.assertEqual(get_fmt(1234, fr_FR, '06n'), '001234') + + self.assertEqual(get_fmt(12345, en_US, '05n'), '12,345') + self.assertEqual(get_fmt(12345, en_US, '06n'), '12,345') + self.assertEqual(get_fmt(12345, en_US, '07n'), '012,345') + self.assertEqual(get_fmt(12345, en_US, '08n'), '0,012,345') + self.assertEqual(get_fmt(12345, en_US, '09n'), '0,012,345') + self.assertEqual(get_fmt(12345, en_US, '010n'), '00,012,345') + + self.assertEqual(get_fmt(123456, crazy, '06n'), '1-2345-6') + self.assertEqual(get_fmt(123456, crazy, '07n'), '1-2345-6') + self.assertEqual(get_fmt(123456, crazy, '08n'), '1-2345-6') + self.assertEqual(get_fmt(123456, crazy, '09n'), '01-2345-6') + self.assertEqual(get_fmt(123456, crazy, '010n'), '0-01-2345-6') + self.assertEqual(get_fmt(123456, crazy, '011n'), '0-01-2345-6') + self.assertEqual(get_fmt(123456, crazy, '012n'), '00-01-2345-6') + self.assertEqual(get_fmt(123456, crazy, '013n'), '000-01-2345-6') + + +class DecimalArithmeticOperatorsTest(unittest.TestCase): + '''Unit tests for all arithmetic operators, binary and unary.''' + + def test_addition(self): + + d1 = Decimal('-11.1') + d2 = Decimal('22.2') + + #two Decimals + self.assertEqual(d1+d2, Decimal('11.1')) + self.assertEqual(d2+d1, Decimal('11.1')) + + #with other type, left + c = d1 + 5 + self.assertEqual(c, Decimal('-6.1')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 5 + d1 + self.assertEqual(c, Decimal('-6.1')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 += d2 + self.assertEqual(d1, Decimal('11.1')) + + #inline with other type + d1 += 5 + self.assertEqual(d1, Decimal('16.1')) + + def test_subtraction(self): + + d1 = Decimal('-11.1') + d2 = Decimal('22.2') + + #two Decimals + self.assertEqual(d1-d2, Decimal('-33.3')) + self.assertEqual(d2-d1, Decimal('33.3')) + + #with other type, left + c = d1 - 5 + self.assertEqual(c, Decimal('-16.1')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 5 - d1 + self.assertEqual(c, Decimal('16.1')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 -= d2 + self.assertEqual(d1, Decimal('-33.3')) + + #inline with other type + d1 -= 5 + self.assertEqual(d1, Decimal('-38.3')) + + def test_multiplication(self): + + d1 = Decimal('-5') + d2 = Decimal('3') + + #two Decimals + self.assertEqual(d1*d2, Decimal('-15')) + self.assertEqual(d2*d1, Decimal('-15')) + + #with other type, left + c = d1 * 5 + self.assertEqual(c, Decimal('-25')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 5 * d1 + self.assertEqual(c, Decimal('-25')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 *= d2 + self.assertEqual(d1, Decimal('-15')) + + #inline with other type + d1 *= 5 + self.assertEqual(d1, Decimal('-75')) + + def test_division(self): + + d1 = Decimal('-5') + d2 = Decimal('2') + + #two Decimals + self.assertEqual(d1/d2, Decimal('-2.5')) + self.assertEqual(d2/d1, Decimal('-0.4')) + + #with other type, left + c = d1 / 4 + self.assertEqual(c, Decimal('-1.25')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 4 / d1 + self.assertEqual(c, Decimal('-0.8')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 /= d2 + self.assertEqual(d1, Decimal('-2.5')) + + #inline with other type + d1 /= 4 + self.assertEqual(d1, Decimal('-0.625')) + + def test_floor_division(self): + + d1 = Decimal('5') + d2 = Decimal('2') + + #two Decimals + self.assertEqual(d1//d2, Decimal('2')) + self.assertEqual(d2//d1, Decimal('0')) + + #with other type, left + c = d1 // 4 + self.assertEqual(c, Decimal('1')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 7 // d1 + self.assertEqual(c, Decimal('1')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 //= d2 + self.assertEqual(d1, Decimal('2')) + + #inline with other type + d1 //= 2 + self.assertEqual(d1, Decimal('1')) + + def test_powering(self): + + d1 = Decimal('5') + d2 = Decimal('2') + + #two Decimals + self.assertEqual(d1**d2, Decimal('25')) + self.assertEqual(d2**d1, Decimal('32')) + + #with other type, left + c = d1 ** 4 + self.assertEqual(c, Decimal('625')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 7 ** d1 + self.assertEqual(c, Decimal('16807')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 **= d2 + self.assertEqual(d1, Decimal('25')) + + #inline with other type + d1 **= 4 + self.assertEqual(d1, Decimal('390625')) + + def test_module(self): + + d1 = Decimal('5') + d2 = Decimal('2') + + #two Decimals + self.assertEqual(d1%d2, Decimal('1')) + self.assertEqual(d2%d1, Decimal('2')) + + #with other type, left + c = d1 % 4 + self.assertEqual(c, Decimal('1')) + self.assertEqual(type(c), type(d1)) + + #with other type, right + c = 7 % d1 + self.assertEqual(c, Decimal('2')) + self.assertEqual(type(c), type(d1)) + + #inline with decimal + d1 %= d2 + self.assertEqual(d1, Decimal('1')) + + #inline with other type + d1 %= 4 + self.assertEqual(d1, Decimal('1')) + + def test_floor_div_module(self): + + d1 = Decimal('5') + d2 = Decimal('2') + + #two Decimals + (p, q) = divmod(d1, d2) + self.assertEqual(p, Decimal('2')) + self.assertEqual(q, Decimal('1')) + self.assertEqual(type(p), type(d1)) + self.assertEqual(type(q), type(d1)) + + #with other type, left + (p, q) = divmod(d1, 4) + self.assertEqual(p, Decimal('1')) + self.assertEqual(q, Decimal('1')) + self.assertEqual(type(p), type(d1)) + self.assertEqual(type(q), type(d1)) + + #with other type, right + (p, q) = divmod(7, d1) + self.assertEqual(p, Decimal('1')) + self.assertEqual(q, Decimal('2')) + self.assertEqual(type(p), type(d1)) + self.assertEqual(type(q), type(d1)) + + def test_unary_operators(self): + self.assertEqual(+Decimal(45), Decimal(+45)) # + + self.assertEqual(-Decimal(45), Decimal(-45)) # - + self.assertEqual(abs(Decimal(45)), abs(Decimal(-45))) # abs + + def test_nan_comparisons(self): + # comparisons involving signaling nans signal InvalidOperation + + # order comparisons (<, <=, >, >=) involving only quiet nans + # also signal InvalidOperation + + # equality comparisons (==, !=) involving only quiet nans + # don't signal, but return False or True respectively. + + n = Decimal('NaN') + s = Decimal('sNaN') + i = Decimal('Inf') + f = Decimal('2') + + qnan_pairs = (n, n), (n, i), (i, n), (n, f), (f, n) + snan_pairs = (s, n), (n, s), (s, i), (i, s), (s, f), (f, s), (s, s) + order_ops = operator.lt, operator.le, operator.gt, operator.ge + equality_ops = operator.eq, operator.ne + + # results when InvalidOperation is not trapped + for x, y in qnan_pairs + snan_pairs: + for op in order_ops + equality_ops: + got = op(x, y) + expected = True if op is operator.ne else False + self.assertIs(expected, got, + "expected {0!r} for operator.{1}({2!r}, {3!r}); " + "got {4!r}".format( + expected, op.__name__, x, y, got)) + + # repeat the above, but this time trap the InvalidOperation + with localcontext() as ctx: + ctx.traps[InvalidOperation] = 1 + + for x, y in qnan_pairs: + for op in equality_ops: + got = op(x, y) + expected = True if op is operator.ne else False + self.assertIs(expected, got, + "expected {0!r} for " + "operator.{1}({2!r}, {3!r}); " + "got {4!r}".format( + expected, op.__name__, x, y, got)) + + for x, y in snan_pairs: + for op in equality_ops: + self.assertRaises(InvalidOperation, operator.eq, x, y) + self.assertRaises(InvalidOperation, operator.ne, x, y) + + for x, y in qnan_pairs + snan_pairs: + for op in order_ops: + self.assertRaises(InvalidOperation, op, x, y) + + def test_copy_sign(self): + d = Decimal(1).copy_sign(Decimal(-2)) + + self.assertEqual(Decimal(1).copy_sign(-2), d) + self.assertRaises(TypeError, Decimal(1).copy_sign, '-2') + +# The following are two functions used to test threading in the next class + +def thfunc1(cls): + d1 = Decimal(1) + d3 = Decimal(3) + test1 = d1/d3 + cls.synchro.wait() + test2 = d1/d3 + cls.finish1.set() + + cls.assertEqual(test1, Decimal('0.3333333333333333333333333333')) + cls.assertEqual(test2, Decimal('0.3333333333333333333333333333')) + return + +def thfunc2(cls): + d1 = Decimal(1) + d3 = Decimal(3) + test1 = d1/d3 + thiscontext = getcontext() + thiscontext.prec = 18 + test2 = d1/d3 + cls.synchro.set() + cls.finish2.set() + + cls.assertEqual(test1, Decimal('0.3333333333333333333333333333')) + cls.assertEqual(test2, Decimal('0.333333333333333333')) + return + + +class DecimalUseOfContextTest(unittest.TestCase): + '''Unit tests for Use of Context cases in Decimal.''' + + try: + import threading + except ImportError: + threading = None + + # Take care executing this test from IDLE, there's an issue in threading + # that hangs IDLE and I couldn't find it + + def test_threading(self): + #Test the "threading isolation" of a Context. + + self.synchro = threading.Event() + self.finish1 = threading.Event() + self.finish2 = threading.Event() + + th1 = threading.Thread(target=thfunc1, args=(self,)) + th2 = threading.Thread(target=thfunc2, args=(self,)) + + th1.start() + th2.start() + + self.finish1.wait() + self.finish2.wait() + return + + if threading is None: + del test_threading + + +class DecimalUsabilityTest(unittest.TestCase): + '''Unit tests for Usability cases of Decimal.''' + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_comparison_operators(self): + + da = Decimal('23.42') + db = Decimal('23.42') + dc = Decimal('45') + + #two Decimals + self.assertGreater(dc, da) + self.assertGreaterEqual(dc, da) + self.assertLess(da, dc) + self.assertLessEqual(da, dc) + self.assertEqual(da, db) + self.assertNotEqual(da, dc) + self.assertLessEqual(da, db) + self.assertGreaterEqual(da, db) + self.assertEqual(cmp(dc,da), 1) + self.assertEqual(cmp(da,dc), -1) + self.assertEqual(cmp(da,db), 0) + + #a Decimal and an int + self.assertGreater(dc, 23) + self.assertLess(23, dc) + self.assertEqual(dc, 45) + self.assertEqual(cmp(dc,23), 1) + self.assertEqual(cmp(23,dc), -1) + self.assertEqual(cmp(dc,45), 0) + + #a Decimal and uncomparable + self.assertNotEqual(da, 'ugly') + self.assertNotEqual(da, 32.7) + self.assertNotEqual(da, object()) + self.assertNotEqual(da, object) + + # sortable + a = map(Decimal, xrange(100)) + b = a[:] + random.shuffle(a) + a.sort() + self.assertEqual(a, b) + + # with None + with check_py3k_warnings(): + self.assertFalse(Decimal(1) < None) + self.assertTrue(Decimal(1) > None) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_decimal_float_comparison(self): + da = Decimal('0.25') + db = Decimal('3.0') + self.assertLess(da, 3.0) + self.assertLessEqual(da, 3.0) + self.assertGreater(db, 0.25) + self.assertGreaterEqual(db, 0.25) + self.assertNotEqual(da, 1.5) + self.assertEqual(da, 0.25) + self.assertGreater(3.0, da) + self.assertGreaterEqual(3.0, da) + self.assertLess(0.25, db) + self.assertLessEqual(0.25, db) + self.assertNotEqual(0.25, db) + self.assertEqual(3.0, db) + self.assertNotEqual(0.1, Decimal('0.1')) + + def test_copy_and_deepcopy_methods(self): + d = Decimal('43.24') + c = copy.copy(d) + self.assertEqual(id(c), id(d)) + dc = copy.deepcopy(d) + self.assertEqual(id(dc), id(d)) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_hash_method(self): + #just that it's hashable + hash(Decimal(23)) + hash(Decimal('Infinity')) + hash(Decimal('-Infinity')) + hash(Decimal('nan123')) + hash(Decimal('-NaN')) + + test_values = [Decimal(sign*(2**m + n)) + for m in [0, 14, 15, 16, 17, 30, 31, + 32, 33, 62, 63, 64, 65, 66] + for n in range(-10, 10) + for sign in [-1, 1]] + test_values.extend([ + Decimal("-0"), # zeros + Decimal("0.00"), + Decimal("-0.000"), + Decimal("0E10"), + Decimal("-0E12"), + Decimal("10.0"), # negative exponent + Decimal("-23.00000"), + Decimal("1230E100"), # positive exponent + Decimal("-4.5678E50"), + # a value for which hash(n) != hash(n % (2**64-1)) + # in Python pre-2.6 + Decimal(2**64 + 2**32 - 1), + # selection of values which fail with the old (before + # version 2.6) long.__hash__ + Decimal("1.634E100"), + Decimal("90.697E100"), + Decimal("188.83E100"), + Decimal("1652.9E100"), + Decimal("56531E100"), + ]) + + # check that hash(d) == hash(int(d)) for integral values + for value in test_values: + self.assertEqual(hash(value), hash(int(value))) + + #the same hash that to an int + self.assertEqual(hash(Decimal(23)), hash(23)) + self.assertRaises(TypeError, hash, Decimal('sNaN')) + self.assertTrue(hash(Decimal('Inf'))) + self.assertTrue(hash(Decimal('-Inf'))) + + # check that the hashes of a Decimal float match when they + # represent exactly the same values + test_strings = ['inf', '-Inf', '0.0', '-.0e1', + '34.0', '2.5', '112390.625', '-0.515625'] + for s in test_strings: + f = float(s) + d = Decimal(s) + self.assertEqual(hash(f), hash(d)) + + # check that the value of the hash doesn't depend on the + # current context (issue #1757) + c = getcontext() + old_precision = c.prec + x = Decimal("123456789.1") + + c.prec = 6 + h1 = hash(x) + c.prec = 10 + h2 = hash(x) + c.prec = 16 + h3 = hash(x) + + self.assertEqual(h1, h2) + self.assertEqual(h1, h3) + c.prec = old_precision + + def test_min_and_max_methods(self): + + d1 = Decimal('15.32') + d2 = Decimal('28.5') + l1 = 15 + l2 = 28 + + #between Decimals + self.assertIs(min(d1,d2), d1) + self.assertIs(min(d2,d1), d1) + self.assertIs(max(d1,d2), d2) + self.assertIs(max(d2,d1), d2) + + #between Decimal and long + self.assertIs(min(d1,l2), d1) + self.assertIs(min(l2,d1), d1) + self.assertIs(max(l1,d2), d2) + self.assertIs(max(d2,l1), d2) + + def test_as_nonzero(self): + #as false + self.assertFalse(Decimal(0)) + #as true + self.assertTrue(Decimal('0.372')) + + def test_tostring_methods(self): + #Test str and repr methods. + + d = Decimal('15.32') + self.assertEqual(str(d), '15.32') # str + self.assertEqual(repr(d), "Decimal('15.32')") # repr + + # result type of string methods should be str, not unicode + unicode_inputs = [u'123.4', u'0.5E2', u'Infinity', u'sNaN', + u'-0.0E100', u'-NaN001', u'-Inf'] + + for u in unicode_inputs: + d = Decimal(u) + self.assertEqual(type(str(d)), str) + self.assertEqual(type(repr(d)), str) + self.assertEqual(type(d.to_eng_string()), str) + + def test_tonum_methods(self): + #Test float, int and long methods. + + d1 = Decimal('66') + d2 = Decimal('15.32') + + #int + self.assertEqual(int(d1), 66) + self.assertEqual(int(d2), 15) + + #long + self.assertEqual(long(d1), 66) + self.assertEqual(long(d2), 15) + + #float + self.assertEqual(float(d1), 66) + self.assertEqual(float(d2), 15.32) + + def test_eval_round_trip(self): + + #with zero + d = Decimal( (0, (0,), 0) ) + self.assertEqual(d, eval(repr(d))) + + #int + d = Decimal( (1, (4, 5), 0) ) + self.assertEqual(d, eval(repr(d))) + + #float + d = Decimal( (0, (4, 5, 3, 4), -2) ) + self.assertEqual(d, eval(repr(d))) + + #weird + d = Decimal( (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) ) + self.assertEqual(d, eval(repr(d))) + + def test_as_tuple(self): + + #with zero + d = Decimal(0) + self.assertEqual(d.as_tuple(), (0, (0,), 0) ) + + #int + d = Decimal(-45) + self.assertEqual(d.as_tuple(), (1, (4, 5), 0) ) + + #complicated string + d = Decimal("-4.34913534E-17") + self.assertEqual(d.as_tuple(), (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) ) + + #inf + d = Decimal("Infinity") + self.assertEqual(d.as_tuple(), (0, (0,), 'F') ) + + #leading zeros in coefficient should be stripped + d = Decimal( (0, (0, 0, 4, 0, 5, 3, 4), -2) ) + self.assertEqual(d.as_tuple(), (0, (4, 0, 5, 3, 4), -2) ) + d = Decimal( (1, (0, 0, 0), 37) ) + self.assertEqual(d.as_tuple(), (1, (0,), 37)) + d = Decimal( (1, (), 37) ) + self.assertEqual(d.as_tuple(), (1, (0,), 37)) + + #leading zeros in NaN diagnostic info should be stripped + d = Decimal( (0, (0, 0, 4, 0, 5, 3, 4), 'n') ) + self.assertEqual(d.as_tuple(), (0, (4, 0, 5, 3, 4), 'n') ) + d = Decimal( (1, (0, 0, 0), 'N') ) + self.assertEqual(d.as_tuple(), (1, (), 'N') ) + d = Decimal( (1, (), 'n') ) + self.assertEqual(d.as_tuple(), (1, (), 'n') ) + + #coefficient in infinity should be ignored + d = Decimal( (0, (4, 5, 3, 4), 'F') ) + self.assertEqual(d.as_tuple(), (0, (0,), 'F')) + d = Decimal( (1, (0, 2, 7, 1), 'F') ) + self.assertEqual(d.as_tuple(), (1, (0,), 'F')) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_immutability_operations(self): + # Do operations and check that it didn't change change internal objects. + + d1 = Decimal('-25e55') + b1 = Decimal('-25e55') + d2 = Decimal('33e+33') + b2 = Decimal('33e+33') + + def checkSameDec(operation, useOther=False): + if useOther: + eval("d1." + operation + "(d2)") + self.assertEqual(d1._sign, b1._sign) + self.assertEqual(d1._int, b1._int) + self.assertEqual(d1._exp, b1._exp) + self.assertEqual(d2._sign, b2._sign) + self.assertEqual(d2._int, b2._int) + self.assertEqual(d2._exp, b2._exp) + else: + eval("d1." + operation + "()") + self.assertEqual(d1._sign, b1._sign) + self.assertEqual(d1._int, b1._int) + self.assertEqual(d1._exp, b1._exp) + return + + Decimal(d1) + self.assertEqual(d1._sign, b1._sign) + self.assertEqual(d1._int, b1._int) + self.assertEqual(d1._exp, b1._exp) + + checkSameDec("__abs__") + checkSameDec("__add__", True) + checkSameDec("__div__", True) + checkSameDec("__divmod__", True) + checkSameDec("__eq__", True) + checkSameDec("__ne__", True) + checkSameDec("__le__", True) + checkSameDec("__lt__", True) + checkSameDec("__ge__", True) + checkSameDec("__gt__", True) + checkSameDec("__float__") + checkSameDec("__floordiv__", True) + checkSameDec("__hash__") + checkSameDec("__int__") + checkSameDec("__trunc__") + checkSameDec("__long__") + checkSameDec("__mod__", True) + checkSameDec("__mul__", True) + checkSameDec("__neg__") + checkSameDec("__nonzero__") + checkSameDec("__pos__") + checkSameDec("__pow__", True) + checkSameDec("__radd__", True) + checkSameDec("__rdiv__", True) + checkSameDec("__rdivmod__", True) + checkSameDec("__repr__") + checkSameDec("__rfloordiv__", True) + checkSameDec("__rmod__", True) + checkSameDec("__rmul__", True) + checkSameDec("__rpow__", True) + checkSameDec("__rsub__", True) + checkSameDec("__str__") + checkSameDec("__sub__", True) + checkSameDec("__truediv__", True) + checkSameDec("adjusted") + checkSameDec("as_tuple") + checkSameDec("compare", True) + checkSameDec("max", True) + checkSameDec("min", True) + checkSameDec("normalize") + checkSameDec("quantize", True) + checkSameDec("remainder_near", True) + checkSameDec("same_quantum", True) + checkSameDec("sqrt") + checkSameDec("to_eng_string") + checkSameDec("to_integral") + + def test_subclassing(self): + # Different behaviours when subclassing Decimal + + class MyDecimal(Decimal): + pass + + d1 = MyDecimal(1) + d2 = MyDecimal(2) + d = d1 + d2 + self.assertIs(type(d), Decimal) + + d = d1.max(d2) + self.assertIs(type(d), Decimal) + + def test_implicit_context(self): + # Check results when context given implicitly. (Issue 2478) + c = getcontext() + self.assertEqual(str(Decimal(0).sqrt()), + str(c.sqrt(Decimal(0)))) + + def test_conversions_from_int(self): + # Check that methods taking a second Decimal argument will + # always accept an integer in place of a Decimal. + self.assertEqual(Decimal(4).compare(3), + Decimal(4).compare(Decimal(3))) + self.assertEqual(Decimal(4).compare_signal(3), + Decimal(4).compare_signal(Decimal(3))) + self.assertEqual(Decimal(4).compare_total(3), + Decimal(4).compare_total(Decimal(3))) + self.assertEqual(Decimal(4).compare_total_mag(3), + Decimal(4).compare_total_mag(Decimal(3))) + self.assertEqual(Decimal(10101).logical_and(1001), + Decimal(10101).logical_and(Decimal(1001))) + self.assertEqual(Decimal(10101).logical_or(1001), + Decimal(10101).logical_or(Decimal(1001))) + self.assertEqual(Decimal(10101).logical_xor(1001), + Decimal(10101).logical_xor(Decimal(1001))) + self.assertEqual(Decimal(567).max(123), + Decimal(567).max(Decimal(123))) + self.assertEqual(Decimal(567).max_mag(123), + Decimal(567).max_mag(Decimal(123))) + self.assertEqual(Decimal(567).min(123), + Decimal(567).min(Decimal(123))) + self.assertEqual(Decimal(567).min_mag(123), + Decimal(567).min_mag(Decimal(123))) + self.assertEqual(Decimal(567).next_toward(123), + Decimal(567).next_toward(Decimal(123))) + self.assertEqual(Decimal(1234).quantize(100), + Decimal(1234).quantize(Decimal(100))) + self.assertEqual(Decimal(768).remainder_near(1234), + Decimal(768).remainder_near(Decimal(1234))) + self.assertEqual(Decimal(123).rotate(1), + Decimal(123).rotate(Decimal(1))) + self.assertEqual(Decimal(1234).same_quantum(1000), + Decimal(1234).same_quantum(Decimal(1000))) + self.assertEqual(Decimal('9.123').scaleb(-100), + Decimal('9.123').scaleb(Decimal(-100))) + self.assertEqual(Decimal(456).shift(-1), + Decimal(456).shift(Decimal(-1))) + + self.assertEqual(Decimal(-12).fma(Decimal(45), 67), + Decimal(-12).fma(Decimal(45), Decimal(67))) + self.assertEqual(Decimal(-12).fma(45, 67), + Decimal(-12).fma(Decimal(45), Decimal(67))) + self.assertEqual(Decimal(-12).fma(45, Decimal(67)), + Decimal(-12).fma(Decimal(45), Decimal(67))) + + +class DecimalPythonAPItests(unittest.TestCase): + + def test_abc(self): + self.assertTrue(issubclass(Decimal, numbers.Number)) + self.assertFalse(issubclass(Decimal, numbers.Real)) + self.assertIsInstance(Decimal(0), numbers.Number) + self.assertNotIsInstance(Decimal(0), numbers.Real) + + def test_pickle(self): + d = Decimal('-3.141590000') + p = pickle.dumps(d) + e = pickle.loads(p) + self.assertEqual(d, e) + + def test_int(self): + for x in range(-250, 250): + s = '%0.2f' % (x / 100.0) + # should work the same as for floats + self.assertEqual(int(Decimal(s)), int(float(s))) + # should work the same as to_integral in the ROUND_DOWN mode + d = Decimal(s) + r = d.to_integral(ROUND_DOWN) + self.assertEqual(Decimal(int(d)), r) + + self.assertRaises(ValueError, int, Decimal('-nan')) + self.assertRaises(ValueError, int, Decimal('snan')) + self.assertRaises(OverflowError, int, Decimal('inf')) + self.assertRaises(OverflowError, int, Decimal('-inf')) + + self.assertRaises(ValueError, long, Decimal('-nan')) + self.assertRaises(ValueError, long, Decimal('snan')) + self.assertRaises(OverflowError, long, Decimal('inf')) + self.assertRaises(OverflowError, long, Decimal('-inf')) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_trunc(self): + for x in range(-250, 250): + s = '%0.2f' % (x / 100.0) + # should work the same as for floats + self.assertEqual(int(Decimal(s)), int(float(s))) + # should work the same as to_integral in the ROUND_DOWN mode + d = Decimal(s) + r = d.to_integral(ROUND_DOWN) + self.assertEqual(Decimal(math.trunc(d)), r) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_from_float(self): + + class MyDecimal(Decimal): + pass + + r = MyDecimal.from_float(0.1) + self.assertEqual(type(r), MyDecimal) + self.assertEqual(str(r), + '0.1000000000000000055511151231257827021181583404541015625') + bigint = 12345678901234567890123456789 + self.assertEqual(MyDecimal.from_float(bigint), MyDecimal(bigint)) + self.assertTrue(MyDecimal.from_float(float('nan')).is_qnan()) + self.assertTrue(MyDecimal.from_float(float('inf')).is_infinite()) + self.assertTrue(MyDecimal.from_float(float('-inf')).is_infinite()) + self.assertEqual(str(MyDecimal.from_float(float('nan'))), + str(Decimal('NaN'))) + self.assertEqual(str(MyDecimal.from_float(float('inf'))), + str(Decimal('Infinity'))) + self.assertEqual(str(MyDecimal.from_float(float('-inf'))), + str(Decimal('-Infinity'))) + self.assertRaises(TypeError, MyDecimal.from_float, 'abc') + for i in range(200): + x = random.expovariate(0.01) * (random.random() * 2.0 - 1.0) + self.assertEqual(x, float(MyDecimal.from_float(x))) # roundtrip + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_create_decimal_from_float(self): + context = Context(prec=5, rounding=ROUND_DOWN) + self.assertEqual( + context.create_decimal_from_float(math.pi), + Decimal('3.1415') + ) + context = Context(prec=5, rounding=ROUND_UP) + self.assertEqual( + context.create_decimal_from_float(math.pi), + Decimal('3.1416') + ) + context = Context(prec=5, traps=[Inexact]) + self.assertRaises( + Inexact, + context.create_decimal_from_float, + math.pi + ) + self.assertEqual(repr(context.create_decimal_from_float(-0.0)), + "Decimal('-0')") + self.assertEqual(repr(context.create_decimal_from_float(1.0)), + "Decimal('1')") + self.assertEqual(repr(context.create_decimal_from_float(10)), + "Decimal('10')") + +class ContextAPItests(unittest.TestCase): + + def test_pickle(self): + c = Context() + e = pickle.loads(pickle.dumps(c)) + for k in vars(c): + v1 = vars(c)[k] + v2 = vars(e)[k] + self.assertEqual(v1, v2) + + @unittest.skipIf(is_jython, "FIXME #1865: not working in Jython") + def test_equality_with_other_types(self): + self.assertIn(Decimal(10), ['a', 1.0, Decimal(10), (1,2), {}]) + self.assertNotIn(Decimal(10), ['a', 1.0, (1,2), {}]) + + def test_copy(self): + # All copies should be deep + c = Context() + d = c.copy() + self.assertNotEqual(id(c), id(d)) + self.assertNotEqual(id(c.flags), id(d.flags)) + self.assertNotEqual(id(c.traps), id(d.traps)) + + def test_abs(self): + c = Context() + d = c.abs(Decimal(-1)) + self.assertEqual(c.abs(-1), d) + self.assertRaises(TypeError, c.abs, '-1') + + def test_add(self): + c = Context() + d = c.add(Decimal(1), Decimal(1)) + self.assertEqual(c.add(1, 1), d) + self.assertEqual(c.add(Decimal(1), 1), d) + self.assertEqual(c.add(1, Decimal(1)), d) + self.assertRaises(TypeError, c.add, '1', 1) + self.assertRaises(TypeError, c.add, 1, '1') + + def test_compare(self): + c = Context() + d = c.compare(Decimal(1), Decimal(1)) + self.assertEqual(c.compare(1, 1), d) + self.assertEqual(c.compare(Decimal(1), 1), d) + self.assertEqual(c.compare(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare, '1', 1) + self.assertRaises(TypeError, c.compare, 1, '1') + + def test_compare_signal(self): + c = Context() + d = c.compare_signal(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_signal(1, 1), d) + self.assertEqual(c.compare_signal(Decimal(1), 1), d) + self.assertEqual(c.compare_signal(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_signal, '1', 1) + self.assertRaises(TypeError, c.compare_signal, 1, '1') + + def test_compare_total(self): + c = Context() + d = c.compare_total(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_total(1, 1), d) + self.assertEqual(c.compare_total(Decimal(1), 1), d) + self.assertEqual(c.compare_total(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_total, '1', 1) + self.assertRaises(TypeError, c.compare_total, 1, '1') + + def test_compare_total_mag(self): + c = Context() + d = c.compare_total_mag(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_total_mag(1, 1), d) + self.assertEqual(c.compare_total_mag(Decimal(1), 1), d) + self.assertEqual(c.compare_total_mag(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_total_mag, '1', 1) + self.assertRaises(TypeError, c.compare_total_mag, 1, '1') + + def test_copy_abs(self): + c = Context() + d = c.copy_abs(Decimal(-1)) + self.assertEqual(c.copy_abs(-1), d) + self.assertRaises(TypeError, c.copy_abs, '-1') + + def test_copy_decimal(self): + c = Context() + d = c.copy_decimal(Decimal(-1)) + self.assertEqual(c.copy_decimal(-1), d) + self.assertRaises(TypeError, c.copy_decimal, '-1') + + def test_copy_negate(self): + c = Context() + d = c.copy_negate(Decimal(-1)) + self.assertEqual(c.copy_negate(-1), d) + self.assertRaises(TypeError, c.copy_negate, '-1') + + def test_copy_sign(self): + c = Context() + d = c.copy_sign(Decimal(1), Decimal(-2)) + self.assertEqual(c.copy_sign(1, -2), d) + self.assertEqual(c.copy_sign(Decimal(1), -2), d) + self.assertEqual(c.copy_sign(1, Decimal(-2)), d) + self.assertRaises(TypeError, c.copy_sign, '1', -2) + self.assertRaises(TypeError, c.copy_sign, 1, '-2') + + def test_divide(self): + c = Context() + d = c.divide(Decimal(1), Decimal(2)) + self.assertEqual(c.divide(1, 2), d) + self.assertEqual(c.divide(Decimal(1), 2), d) + self.assertEqual(c.divide(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divide, '1', 2) + self.assertRaises(TypeError, c.divide, 1, '2') + + def test_divide_int(self): + c = Context() + d = c.divide_int(Decimal(1), Decimal(2)) + self.assertEqual(c.divide_int(1, 2), d) + self.assertEqual(c.divide_int(Decimal(1), 2), d) + self.assertEqual(c.divide_int(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divide_int, '1', 2) + self.assertRaises(TypeError, c.divide_int, 1, '2') + + def test_divmod(self): + c = Context() + d = c.divmod(Decimal(1), Decimal(2)) + self.assertEqual(c.divmod(1, 2), d) + self.assertEqual(c.divmod(Decimal(1), 2), d) + self.assertEqual(c.divmod(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divmod, '1', 2) + self.assertRaises(TypeError, c.divmod, 1, '2') + + def test_exp(self): + c = Context() + d = c.exp(Decimal(10)) + self.assertEqual(c.exp(10), d) + self.assertRaises(TypeError, c.exp, '10') + + def test_fma(self): + c = Context() + d = c.fma(Decimal(2), Decimal(3), Decimal(4)) + self.assertEqual(c.fma(2, 3, 4), d) + self.assertEqual(c.fma(Decimal(2), 3, 4), d) + self.assertEqual(c.fma(2, Decimal(3), 4), d) + self.assertEqual(c.fma(2, 3, Decimal(4)), d) + self.assertEqual(c.fma(Decimal(2), Decimal(3), 4), d) + self.assertRaises(TypeError, c.fma, '2', 3, 4) + self.assertRaises(TypeError, c.fma, 2, '3', 4) + self.assertRaises(TypeError, c.fma, 2, 3, '4') + + def test_is_finite(self): + c = Context() + d = c.is_finite(Decimal(10)) + self.assertEqual(c.is_finite(10), d) + self.assertRaises(TypeError, c.is_finite, '10') + + def test_is_infinite(self): + c = Context() + d = c.is_infinite(Decimal(10)) + self.assertEqual(c.is_infinite(10), d) + self.assertRaises(TypeError, c.is_infinite, '10') + + def test_is_nan(self): + c = Context() + d = c.is_nan(Decimal(10)) + self.assertEqual(c.is_nan(10), d) + self.assertRaises(TypeError, c.is_nan, '10') + + def test_is_normal(self): + c = Context() + d = c.is_normal(Decimal(10)) + self.assertEqual(c.is_normal(10), d) + self.assertRaises(TypeError, c.is_normal, '10') + + def test_is_qnan(self): + c = Context() + d = c.is_qnan(Decimal(10)) + self.assertEqual(c.is_qnan(10), d) + self.assertRaises(TypeError, c.is_qnan, '10') + + def test_is_signed(self): + c = Context() + d = c.is_signed(Decimal(10)) + self.assertEqual(c.is_signed(10), d) + self.assertRaises(TypeError, c.is_signed, '10') + + def test_is_snan(self): + c = Context() + d = c.is_snan(Decimal(10)) + self.assertEqual(c.is_snan(10), d) + self.assertRaises(TypeError, c.is_snan, '10') + + def test_is_subnormal(self): + c = Context() + d = c.is_subnormal(Decimal(10)) + self.assertEqual(c.is_subnormal(10), d) + self.assertRaises(TypeError, c.is_subnormal, '10') + + def test_is_zero(self): + c = Context() + d = c.is_zero(Decimal(10)) + self.assertEqual(c.is_zero(10), d) + self.assertRaises(TypeError, c.is_zero, '10') + + def test_ln(self): + c = Context() + d = c.ln(Decimal(10)) + self.assertEqual(c.ln(10), d) + self.assertRaises(TypeError, c.ln, '10') + + def test_log10(self): + c = Context() + d = c.log10(Decimal(10)) + self.assertEqual(c.log10(10), d) + self.assertRaises(TypeError, c.log10, '10') + + def test_logb(self): + c = Context() + d = c.logb(Decimal(10)) + self.assertEqual(c.logb(10), d) + self.assertRaises(TypeError, c.logb, '10') + + def test_logical_and(self): + c = Context() + d = c.logical_and(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_and(1, 1), d) + self.assertEqual(c.logical_and(Decimal(1), 1), d) + self.assertEqual(c.logical_and(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_and, '1', 1) + self.assertRaises(TypeError, c.logical_and, 1, '1') + + def test_logical_invert(self): + c = Context() + d = c.logical_invert(Decimal(1000)) + self.assertEqual(c.logical_invert(1000), d) + self.assertRaises(TypeError, c.logical_invert, '1000') + + def test_logical_or(self): + c = Context() + d = c.logical_or(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_or(1, 1), d) + self.assertEqual(c.logical_or(Decimal(1), 1), d) + self.assertEqual(c.logical_or(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_or, '1', 1) + self.assertRaises(TypeError, c.logical_or, 1, '1') + + def test_logical_xor(self): + c = Context() + d = c.logical_xor(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_xor(1, 1), d) + self.assertEqual(c.logical_xor(Decimal(1), 1), d) + self.assertEqual(c.logical_xor(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_xor, '1', 1) + self.assertRaises(TypeError, c.logical_xor, 1, '1') + + def test_max(self): + c = Context() + d = c.max(Decimal(1), Decimal(2)) + self.assertEqual(c.max(1, 2), d) + self.assertEqual(c.max(Decimal(1), 2), d) + self.assertEqual(c.max(1, Decimal(2)), d) + self.assertRaises(TypeError, c.max, '1', 2) + self.assertRaises(TypeError, c.max, 1, '2') + + def test_max_mag(self): + c = Context() + d = c.max_mag(Decimal(1), Decimal(2)) + self.assertEqual(c.max_mag(1, 2), d) + self.assertEqual(c.max_mag(Decimal(1), 2), d) + self.assertEqual(c.max_mag(1, Decimal(2)), d) + self.assertRaises(TypeError, c.max_mag, '1', 2) + self.assertRaises(TypeError, c.max_mag, 1, '2') + + def test_min(self): + c = Context() + d = c.min(Decimal(1), Decimal(2)) + self.assertEqual(c.min(1, 2), d) + self.assertEqual(c.min(Decimal(1), 2), d) + self.assertEqual(c.min(1, Decimal(2)), d) + self.assertRaises(TypeError, c.min, '1', 2) + self.assertRaises(TypeError, c.min, 1, '2') + + def test_min_mag(self): + c = Context() + d = c.min_mag(Decimal(1), Decimal(2)) + self.assertEqual(c.min_mag(1, 2), d) + self.assertEqual(c.min_mag(Decimal(1), 2), d) + self.assertEqual(c.min_mag(1, Decimal(2)), d) + self.assertRaises(TypeError, c.min_mag, '1', 2) + self.assertRaises(TypeError, c.min_mag, 1, '2') + + def test_minus(self): + c = Context() + d = c.minus(Decimal(10)) + self.assertEqual(c.minus(10), d) + self.assertRaises(TypeError, c.minus, '10') + + def test_multiply(self): + c = Context() + d = c.multiply(Decimal(1), Decimal(2)) + self.assertEqual(c.multiply(1, 2), d) + self.assertEqual(c.multiply(Decimal(1), 2), d) + self.assertEqual(c.multiply(1, Decimal(2)), d) + self.assertRaises(TypeError, c.multiply, '1', 2) + self.assertRaises(TypeError, c.multiply, 1, '2') + + def test_next_minus(self): + c = Context() + d = c.next_minus(Decimal(10)) + self.assertEqual(c.next_minus(10), d) + self.assertRaises(TypeError, c.next_minus, '10') + + def test_next_plus(self): + c = Context() + d = c.next_plus(Decimal(10)) + self.assertEqual(c.next_plus(10), d) + self.assertRaises(TypeError, c.next_plus, '10') + + def test_next_toward(self): + c = Context() + d = c.next_toward(Decimal(1), Decimal(2)) + self.assertEqual(c.next_toward(1, 2), d) + self.assertEqual(c.next_toward(Decimal(1), 2), d) + self.assertEqual(c.next_toward(1, Decimal(2)), d) + self.assertRaises(TypeError, c.next_toward, '1', 2) + self.assertRaises(TypeError, c.next_toward, 1, '2') + + def test_normalize(self): + c = Context() + d = c.normalize(Decimal(10)) + self.assertEqual(c.normalize(10), d) + self.assertRaises(TypeError, c.normalize, '10') + + def test_number_class(self): + c = Context() + self.assertEqual(c.number_class(123), c.number_class(Decimal(123))) + self.assertEqual(c.number_class(0), c.number_class(Decimal(0))) + self.assertEqual(c.number_class(-45), c.number_class(Decimal(-45))) + + def test_power(self): + c = Context() + d = c.power(Decimal(1), Decimal(4), Decimal(2)) + self.assertEqual(c.power(1, 4, 2), d) + self.assertEqual(c.power(Decimal(1), 4, 2), d) + self.assertEqual(c.power(1, Decimal(4), 2), d) + self.assertEqual(c.power(1, 4, Decimal(2)), d) + self.assertEqual(c.power(Decimal(1), Decimal(4), 2), d) + self.assertRaises(TypeError, c.power, '1', 4, 2) + self.assertRaises(TypeError, c.power, 1, '4', 2) + self.assertRaises(TypeError, c.power, 1, 4, '2') + + def test_plus(self): + c = Context() + d = c.plus(Decimal(10)) + self.assertEqual(c.plus(10), d) + self.assertRaises(TypeError, c.plus, '10') + + def test_quantize(self): + c = Context() + d = c.quantize(Decimal(1), Decimal(2)) + self.assertEqual(c.quantize(1, 2), d) + self.assertEqual(c.quantize(Decimal(1), 2), d) + self.assertEqual(c.quantize(1, Decimal(2)), d) + self.assertRaises(TypeError, c.quantize, '1', 2) + self.assertRaises(TypeError, c.quantize, 1, '2') + + def test_remainder(self): + c = Context() + d = c.remainder(Decimal(1), Decimal(2)) + self.assertEqual(c.remainder(1, 2), d) + self.assertEqual(c.remainder(Decimal(1), 2), d) + self.assertEqual(c.remainder(1, Decimal(2)), d) + self.assertRaises(TypeError, c.remainder, '1', 2) + self.assertRaises(TypeError, c.remainder, 1, '2') + + def test_remainder_near(self): + c = Context() + d = c.remainder_near(Decimal(1), Decimal(2)) + self.assertEqual(c.remainder_near(1, 2), d) + self.assertEqual(c.remainder_near(Decimal(1), 2), d) + self.assertEqual(c.remainder_near(1, Decimal(2)), d) + self.assertRaises(TypeError, c.remainder_near, '1', 2) + self.assertRaises(TypeError, c.remainder_near, 1, '2') + + def test_rotate(self): + c = Context() + d = c.rotate(Decimal(1), Decimal(2)) + self.assertEqual(c.rotate(1, 2), d) + self.assertEqual(c.rotate(Decimal(1), 2), d) + self.assertEqual(c.rotate(1, Decimal(2)), d) + self.assertRaises(TypeError, c.rotate, '1', 2) + self.assertRaises(TypeError, c.rotate, 1, '2') + + def test_sqrt(self): + c = Context() + d = c.sqrt(Decimal(10)) + self.assertEqual(c.sqrt(10), d) + self.assertRaises(TypeError, c.sqrt, '10') + + def test_same_quantum(self): + c = Context() + d = c.same_quantum(Decimal(1), Decimal(2)) + self.assertEqual(c.same_quantum(1, 2), d) + self.assertEqual(c.same_quantum(Decimal(1), 2), d) + self.assertEqual(c.same_quantum(1, Decimal(2)), d) + self.assertRaises(TypeError, c.same_quantum, '1', 2) + self.assertRaises(TypeError, c.same_quantum, 1, '2') + + def test_scaleb(self): + c = Context() + d = c.scaleb(Decimal(1), Decimal(2)) + self.assertEqual(c.scaleb(1, 2), d) + self.assertEqual(c.scaleb(Decimal(1), 2), d) + self.assertEqual(c.scaleb(1, Decimal(2)), d) + self.assertRaises(TypeError, c.scaleb, '1', 2) + self.assertRaises(TypeError, c.scaleb, 1, '2') + + def test_shift(self): + c = Context() + d = c.shift(Decimal(1), Decimal(2)) + self.assertEqual(c.shift(1, 2), d) + self.assertEqual(c.shift(Decimal(1), 2), d) + self.assertEqual(c.shift(1, Decimal(2)), d) + self.assertRaises(TypeError, c.shift, '1', 2) + self.assertRaises(TypeError, c.shift, 1, '2') + + def test_subtract(self): + c = Context() + d = c.subtract(Decimal(1), Decimal(2)) + self.assertEqual(c.subtract(1, 2), d) + self.assertEqual(c.subtract(Decimal(1), 2), d) + self.assertEqual(c.subtract(1, Decimal(2)), d) + self.assertRaises(TypeError, c.subtract, '1', 2) + self.assertRaises(TypeError, c.subtract, 1, '2') + + def test_to_eng_string(self): + c = Context() + d = c.to_eng_string(Decimal(10)) + self.assertEqual(c.to_eng_string(10), d) + self.assertRaises(TypeError, c.to_eng_string, '10') + + def test_to_sci_string(self): + c = Context() + d = c.to_sci_string(Decimal(10)) + self.assertEqual(c.to_sci_string(10), d) + self.assertRaises(TypeError, c.to_sci_string, '10') + + def test_to_integral_exact(self): + c = Context() + d = c.to_integral_exact(Decimal(10)) + self.assertEqual(c.to_integral_exact(10), d) + self.assertRaises(TypeError, c.to_integral_exact, '10') + + def test_to_integral_value(self): + c = Context() + d = c.to_integral_value(Decimal(10)) + self.assertEqual(c.to_integral_value(10), d) + self.assertRaises(TypeError, c.to_integral_value, '10') + +class WithStatementTest(unittest.TestCase): + # Can't do these as docstrings until Python 2.6 + # as doctest can't handle __future__ statements + + def test_localcontext(self): + # Use a copy of the current context in the block + orig_ctx = getcontext() + with localcontext() as enter_ctx: + set_ctx = getcontext() + final_ctx = getcontext() + self.assertIs(orig_ctx, final_ctx, 'did not restore context correctly') + self.assertIsNot(orig_ctx, set_ctx, 'did not copy the context') + self.assertIs(set_ctx, enter_ctx, '__enter__ returned wrong context') + + def test_localcontextarg(self): + # Use a copy of the supplied context in the block + orig_ctx = getcontext() + new_ctx = Context(prec=42) + with localcontext(new_ctx) as enter_ctx: + set_ctx = getcontext() + final_ctx = getcontext() + self.assertIs(orig_ctx, final_ctx, 'did not restore context correctly') + self.assertEqual(set_ctx.prec, new_ctx.prec, 'did not set correct context') + self.assertIsNot(new_ctx, set_ctx, 'did not copy the context') + self.assertIs(set_ctx, enter_ctx, '__enter__ returned wrong context') + +class ContextFlags(unittest.TestCase): + def test_flags_irrelevant(self): + # check that the result (numeric result + flags raised) of an + # arithmetic operation doesn't depend on the current flags + + context = Context(prec=9, Emin = -999999999, Emax = 999999999, + rounding=ROUND_HALF_EVEN, traps=[], flags=[]) + + # operations that raise various flags, in the form (function, arglist) + operations = [ + (context._apply, [Decimal("100E-1000000009")]), + (context.sqrt, [Decimal(2)]), + (context.add, [Decimal("1.23456789"), Decimal("9.87654321")]), + (context.multiply, [Decimal("1.23456789"), Decimal("9.87654321")]), + (context.subtract, [Decimal("1.23456789"), Decimal("9.87654321")]), + ] + + # try various flags individually, then a whole lot at once + flagsets = [[Inexact], [Rounded], [Underflow], [Clamped], [Subnormal], + [Inexact, Rounded, Underflow, Clamped, Subnormal]] + + for fn, args in operations: + # find answer and flags raised using a clean context + context.clear_flags() + ans = fn(*args) + flags = [k for k, v in context.flags.items() if v] + + for extra_flags in flagsets: + # set flags, before calling operation + context.clear_flags() + for flag in extra_flags: + context._raise_error(flag) + new_ans = fn(*args) + + # flags that we expect to be set after the operation + expected_flags = list(flags) + for flag in extra_flags: + if flag not in expected_flags: + expected_flags.append(flag) + + # flags we actually got + new_flags = [k for k,v in context.flags.items() if v] + + self.assertEqual(ans, new_ans, + "operation produces different answers depending on flags set: " + + "expected %s, got %s." % (ans, new_ans)) + self.assertItemsEqual(new_flags, expected_flags, + "operation raises different flags depending on flags set: " + + "expected %s, got %s" % (expected_flags, new_flags)) + +def test_main(arith=False, verbose=None, todo_tests=None, debug=None): + """ Execute the tests. + + Runs all arithmetic tests if arith is True or if the "decimal" resource + is enabled in regrtest.py + """ + + init() + global TEST_ALL, DEBUG + TEST_ALL = arith or is_resource_enabled('decimal') + DEBUG = debug + + if todo_tests is None: + test_classes = [ + DecimalExplicitConstructionTest, + DecimalImplicitConstructionTest, + DecimalArithmeticOperatorsTest, + DecimalFormatTest, + DecimalUseOfContextTest, + DecimalUsabilityTest, + DecimalPythonAPItests, + ContextAPItests, + DecimalTest, + WithStatementTest, + ContextFlags + ] + else: + test_classes = [DecimalTest] + + # Dynamically build custom test definition for each file in the test + # directory and add the definitions to the DecimalTest class. This + # procedure insures that new files do not get skipped. + for filename in os.listdir(directory): + if '.decTest' not in filename or filename.startswith("."): + continue + head, tail = filename.split('.') + if todo_tests is not None and head not in todo_tests: + continue + tester = lambda self, f=filename: self.eval_file(directory + f) + setattr(DecimalTest, 'test_' + head, tester) + del filename, head, tail, tester + + + try: + run_unittest(*test_classes) + if todo_tests is None: + import decimal as DecimalModule + run_doctest(DecimalModule, verbose) + finally: + setcontext(ORIGINAL_CONTEXT) + +if __name__ == '__main__': + import optparse + p = optparse.OptionParser("test_decimal.py [--debug] [{--skip | test1 [test2 [...]]}]") + p.add_option('--debug', '-d', action='store_true', help='shows the test number and context before each test') + p.add_option('--skip', '-s', action='store_true', help='skip over 90% of the arithmetic tests') + (opt, args) = p.parse_args() + + if opt.skip: + test_main(arith=False, verbose=True) + elif args: + test_main(arith=True, verbose=True, todo_tests=args, debug=opt.debug) + else: + test_main(arith=True, verbose=True) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 05:33:13 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 05:33:13 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_ArgParser=3A_provide_for_a_d?= =?utf8?q?efault_value_when_getting_type-checked_PyObject?= Message-ID: http://hg.python.org/jython/rev/7898b6a40cc8 changeset: 6447:7898b6a40cc8 user: Jeff Allen date: Sun Mar 18 07:18:23 2012 +0000 summary: ArgParser: provide for a default value when getting type-checked PyObject argument. Added getPyObjectByType(int, PyType, PyObject) and refactored common code nearby. files: src/org/python/core/ArgParser.java | 37 +++++++++++++---- 1 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/org/python/core/ArgParser.java b/src/org/python/core/ArgParser.java --- a/src/org/python/core/ArgParser.java +++ b/src/org/python/core/ArgParser.java @@ -211,20 +211,37 @@ } /** - * Return a required argument as a PyObject, ensuring the object - * is of the specified type. - * + * Return a required argument as a PyObject, ensuring the object is of the specified type. + * * @param pos the position of the argument. First argument is numbered 0 * @param type the desired PyType of the argument - * @return the PyObject of PyType + * @return the PyObject of PyType type */ public PyObject getPyObjectByType(int pos, PyType type) { - PyObject arg = getRequiredArg(pos); - if (!Py.isInstance(arg, type)) { - throw Py.TypeError(String.format("argument %d must be %s, not %s", pos + 1, - type.fastGetName(), arg.getType().fastGetName())); - } - return arg; + PyObject arg = getRequiredArg(pos); // != null + return checkedForType(arg, pos, type); + } + + /** + * Return an optional argument as a PyObject, or return the default value provided, which may + * be null. If the returned value is not null, it must be of the + * specified type. + * + * @param pos the position of the argument. First argument is numbered 0 + * @param type the desired PyType of the argument + * @param def to return if the argument at pos was not given (null allowed) + * @return the PyObject of PyType type + */ + public PyObject getPyObjectByType(int pos, PyType type, PyObject def) { + PyObject arg = getOptionalArg(pos); + return checkedForType((arg != null ? arg : def), pos, type); + } + + // Common code for getObjectByType: don't check null! + private static PyObject checkedForType(PyObject arg, int pos, PyType type) { + if (arg == null || Py.isInstance(arg, type)) return arg; + throw Py.TypeError(String.format("argument %d must be %s, not %s", pos + 1, + type.fastGetName(), arg.getType().fastGetName())); } /** -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 05:33:13 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 05:33:13 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_PySequence_Javadoc_improveme?= =?utf8?q?nts_=28no_code_change=29?= Message-ID: http://hg.python.org/jython/rev/b7e75bbb30d7 changeset: 6448:b7e75bbb30d7 user: Jeff Allen date: Sun Mar 18 07:09:54 2012 +0000 summary: PySequence Javadoc improvements (no code change) files: src/org/python/core/PySequence.java | 44 ++++++++++++++-- 1 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/org/python/core/PySequence.java b/src/org/python/core/PySequence.java --- a/src/org/python/core/PySequence.java +++ b/src/org/python/core/PySequence.java @@ -20,6 +20,11 @@ // These methods must be defined for any sequence /** + * Returns the element of the sequence at the given index. This is an extension point called by + * PySequence in its implementation of {@link #__getitem__} It is guaranteed by PySequence that + * when it calls pyget(int) the index is within the bounds of the array. Any other + * clients must make the same guarantee. + * * @param index index of element to return. * @return the element at the given position in the list. */ @@ -36,7 +41,8 @@ protected abstract PyObject getslice(int start, int stop, int step); /** - * Repeats the given sequence. + * Returns a (concrete subclass of) PySequence that repeats the given sequence, as + * in the implementation of __mul__ for strings. * * @param count the number of times to repeat the sequence. * @return this sequence repeated count times. @@ -45,8 +51,11 @@ // These methods only apply to mutable sequences /** - * Sets the given element of the sequence. - * + * Sets the indexed element of the sequence to the given value. This is an extension point + * called by PySequence in its implementation of {@link #__setitem__} It is guaranteed by + * PySequence that when it calls pyset(int) the index is within the bounds of the array. Any + * other clients must make the same guarantee. + * * @param index index of the element to set. * @param value the value to set this element to. */ @@ -55,22 +64,45 @@ } /** - * Sets the given range of elements. + * Sets the given range of elements according to Python slice assignment semantics. + * If the step size is one, it is a simple slice and the operation is equivalent to + * deleting that slice, then inserting the value at that position, regarding the + * value as a sequence (if possible) or as a single element if it is not a sequence. + * If the step size is not one, but start==stop, it is equivalent to insertion + * at that point. + * If the step size is not one, and start!=stop, the slice defines a certain number + * of elements to be replaced, and the value must be a sequence of exactly that many + * elements (or convertible to such a sequence). + * + * @param start the position of the first element. + * @param stop one more than the position of the last element. + * @param step the step size. + * @param value an object consistent with the slice assignment */ protected void setslice(int start, int stop, int step, PyObject value) { throw Py.TypeError(String.format("'%s' object does not support item assignment", getType().fastGetName())); } - protected void del(int i) { + /** + * Deletes an element from the sequence (and closes up the gap). + * + * @param index index of the element to delete. + */ + protected void del(int index) { throw Py.TypeError(String.format("'%s' object does not support item deletion", getType().fastGetName())); } + /** + * Deletes a contiguous sub-sequence (and closes up the gap). + * + * @param start the position of the first element. + * @param stop one more than the position of the last element. + */ protected void delRange(int start, int stop) { throw Py.TypeError(String.format("'%s' object does not support item deletion", getType().fastGetName())); - } @Override -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 05:33:13 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 05:33:13 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Move_existing_documentation_?= =?utf8?q?strings_to_2=2E7_standard_=2887_small_changes=29=2E?= Message-ID: http://hg.python.org/jython/rev/8136af240b01 changeset: 6449:8136af240b01 user: Jeff Allen date: Sun Mar 18 09:18:58 2012 +0000 summary: Move existing documentation strings to 2.7 standard (87 small changes). Fixed a problem in make_pydocs with __abstractmethods__ and regenerated BuiltinDocs. files: Misc/make_pydocs.py | 6 +- src/org/python/core/BuiltinDocs.java | 8162 +++++++------ 2 files changed, 4120 insertions(+), 4048 deletions(-) diff --git a/Misc/make_pydocs.py b/Misc/make_pydocs.py --- a/Misc/make_pydocs.py +++ b/Misc/make_pydocs.py @@ -6,7 +6,11 @@ doc = getattr(obj, meth) bdname = '%s_doc' % obj.__name__ else: - doc = getattr(obj, meth).__doc__ + if meth == '__abstractmethods__': + # getattr(type,'__abstractmethods__') would fail + doc = "" + else: + doc = getattr(obj, meth).__doc__ bdname = '%s_%s_doc' % (obj.__name__, meth) if doc is None: diff --git a/src/org/python/core/BuiltinDocs.java b/src/org/python/core/BuiltinDocs.java --- a/src/org/python/core/BuiltinDocs.java +++ b/src/org/python/core/BuiltinDocs.java @@ -1,4047 +1,4115 @@ -// generated by make_pydocs.py - -package org.python.core; - -public class BuiltinDocs { - - // Docs for - public final static String object___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String object___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String object_doc = - "The most base type"; - - public final static String object___format___doc = - "default object formatter"; - - public final static String object___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String object___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String object___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String object___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String object___reduce___doc = - "helper for pickle"; - - public final static String object___reduce_ex___doc = - "helper for pickle"; - - public final static String object___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String object___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String object___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String object___str___doc = - "x.__str__() <==> str(x)"; - - public final static String object___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - // Docs for - public final static String type___abstractmethods___doc = - ""; - - public final static String type___base___doc = - "The most base type"; - - public final static String type___bases___doc = - "tuple() -> an empty tuple\n" + - "tuple(sequence) -> tuple initialized from sequence's items\n" + - "\n" + - "If the argument is a tuple, the return value is the same object."; - - public final static String type___basicsize___doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String type___call___doc = - "x.__call__(...) <==> x(...)"; - - public final static String type___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String type___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String type___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String type___dict___doc = - ""; - - public final static String type___dictoffset___doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String type_doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String type___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String type___flags___doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String type___format___doc = - "default object formatter"; - - public final static String type___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String type___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String type___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String type___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String type___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String type___instancecheck___doc = - ""; - - public final static String type___itemsize___doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String type___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String type___lt___doc = - "x.__lt__(y) <==> x string\n" + - "\n" + - "Return a nice string representation of the object.\n" + - "If the argument is a string, the return value is the same object."; - - public final static String type___mro___doc = - "tuple() -> an empty tuple\n" + - "tuple(sequence) -> tuple initialized from sequence's items\n" + - "\n" + - "If the argument is a tuple, the return value is the same object."; - - public final static String type___name___doc = - "str(object) -> string\n" + - "\n" + - "Return a nice string representation of the object.\n" + - "If the argument is a string, the return value is the same object."; - - public final static String type___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String type___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String type___reduce___doc = - "helper for pickle"; - - public final static String type___reduce_ex___doc = - "helper for pickle"; - - public final static String type___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String type___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String type___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String type___str___doc = - "x.__str__() <==> str(x)"; - - public final static String type___subclasscheck___doc = - ""; - - public final static String type___subclasses___doc = - "__subclasses__() -> list of immediate subclasses"; - - public final static String type___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String type___weakrefoffset___doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String type_mro_doc = - "mro() -> list\n" + - "return a type's method resolution order"; - - // Docs for - public final static String unicode___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String unicode___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String unicode___contains___doc = - "x.__contains__(y) <==> y in x"; - - public final static String unicode___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String unicode_doc = - "unicode(string [, encoding[, errors]]) -> object\n" + - "\n" + - "Create a new Unicode object from the given encoded string.\n" + - "encoding defaults to the current default string encoding.\n" + - "errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'."; - - public final static String unicode___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String unicode___format___doc = - "S.__format__(format_spec) -> unicode\n" + - "\n" + - ""; - - public final static String unicode___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String unicode___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String unicode___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String unicode___getnewargs___doc = - ""; - - public final static String unicode___getslice___doc = - "x.__getslice__(i, j) <==> x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String unicode___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String unicode___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String unicode___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String unicode___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String unicode___len___doc = - "x.__len__() <==> len(x)"; - - public final static String unicode___lt___doc = - "x.__lt__(y) <==> x x%y"; - - public final static String unicode___mul___doc = - "x.__mul__(n) <==> x*n"; - - public final static String unicode___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String unicode___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String unicode___reduce___doc = - "helper for pickle"; - - public final static String unicode___reduce_ex___doc = - "helper for pickle"; - - public final static String unicode___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String unicode___rmod___doc = - "x.__rmod__(y) <==> y%x"; - - public final static String unicode___rmul___doc = - "x.__rmul__(n) <==> n*x"; - - public final static String unicode___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String unicode___sizeof___doc = - "S.__sizeof__() -> size of S in memory, in bytes\n" + - "\n" + - ""; - - public final static String unicode___str___doc = - "x.__str__() <==> str(x)"; - - public final static String unicode___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String unicode__formatter_field_name_split_doc = - ""; - - public final static String unicode__formatter_parser_doc = - ""; - - public final static String unicode_capitalize_doc = - "S.capitalize() -> unicode\n" + - "\n" + - "Return a capitalized version of S, i.e. make the first character\n" + - "have upper case."; - - public final static String unicode_center_doc = - "S.center(width[, fillchar]) -> unicode\n" + - "\n" + - "Return S centered in a Unicode string of length width. Padding is\n" + - "done using the specified fill character (default is a space)"; - - public final static String unicode_count_doc = - "S.count(sub[, start[, end]]) -> int\n" + - "\n" + - "Return the number of non-overlapping occurrences of substring sub in\n" + - "Unicode string S[start:end]. Optional arguments start and end are\n" + - "interpreted as in slice notation."; - - public final static String unicode_decode_doc = - "S.decode([encoding[,errors]]) -> string or unicode\n" + - "\n" + - "Decodes S using the codec registered for encoding. encoding defaults\n" + - "to the default encoding. errors may be given to set a different error\n" + - "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + - "a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n" + - "as well as any other name registerd with codecs.register_error that is\n" + - "able to handle UnicodeDecodeErrors."; - - public final static String unicode_encode_doc = - "S.encode([encoding[,errors]]) -> string or unicode\n" + - "\n" + - "Encodes S using the codec registered for encoding. encoding defaults\n" + - "to the default encoding. errors may be given to set a different error\n" + - "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + - "a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n" + - "'xmlcharrefreplace' as well as any other name registered with\n" + - "codecs.register_error that can handle UnicodeEncodeErrors."; - - public final static String unicode_endswith_doc = - "S.endswith(suffix[, start[, end]]) -> bool\n" + - "\n" + - "Return True if S ends with the specified suffix, False otherwise.\n" + - "With optional start, test S beginning at that position.\n" + - "With optional end, stop comparing S at that position.\n" + - "suffix can also be a tuple of strings to try."; - - public final static String unicode_expandtabs_doc = - "S.expandtabs([tabsize]) -> unicode\n" + - "\n" + - "Return a copy of S where all tab characters are expanded using spaces.\n" + - "If tabsize is not given, a tab size of 8 characters is assumed."; - - public final static String unicode_find_doc = - "S.find(sub [,start [,end]]) -> int\n" + - "\n" + - "Return the lowest index in S where substring sub is found,\n" + - "such that sub is contained within s[start:end]. Optional\n" + - "arguments start and end are interpreted as in slice notation.\n" + - "\n" + - "Return -1 on failure."; - - public final static String unicode_format_doc = - "S.format(*args, **kwargs) -> unicode\n" + - "\n" + - ""; - - public final static String unicode_index_doc = - "S.index(sub [,start [,end]]) -> int\n" + - "\n" + - "Like S.find() but raise ValueError when the substring is not found."; - - public final static String unicode_isalnum_doc = - "S.isalnum() -> bool\n" + - "\n" + - "Return True if all characters in S are alphanumeric\n" + - "and there is at least one character in S, False otherwise."; - - public final static String unicode_isalpha_doc = - "S.isalpha() -> bool\n" + - "\n" + - "Return True if all characters in S are alphabetic\n" + - "and there is at least one character in S, False otherwise."; - - public final static String unicode_isdecimal_doc = - "S.isdecimal() -> bool\n" + - "\n" + - "Return True if there are only decimal characters in S,\n" + - "False otherwise."; - - public final static String unicode_isdigit_doc = - "S.isdigit() -> bool\n" + - "\n" + - "Return True if all characters in S are digits\n" + - "and there is at least one character in S, False otherwise."; - - public final static String unicode_islower_doc = - "S.islower() -> bool\n" + - "\n" + - "Return True if all cased characters in S are lowercase and there is\n" + - "at least one cased character in S, False otherwise."; - - public final static String unicode_isnumeric_doc = - "S.isnumeric() -> bool\n" + - "\n" + - "Return True if there are only numeric characters in S,\n" + - "False otherwise."; - - public final static String unicode_isspace_doc = - "S.isspace() -> bool\n" + - "\n" + - "Return True if all characters in S are whitespace\n" + - "and there is at least one character in S, False otherwise."; - - public final static String unicode_istitle_doc = - "S.istitle() -> bool\n" + - "\n" + - "Return True if S is a titlecased string and there is at least one\n" + - "character in S, i.e. upper- and titlecase characters may only\n" + - "follow uncased characters and lowercase characters only cased ones.\n" + - "Return False otherwise."; - - public final static String unicode_isupper_doc = - "S.isupper() -> bool\n" + - "\n" + - "Return True if all cased characters in S are uppercase and there is\n" + - "at least one cased character in S, False otherwise."; - - public final static String unicode_join_doc = - "S.join(sequence) -> unicode\n" + - "\n" + - "Return a string which is the concatenation of the strings in the\n" + - "sequence. The separator between elements is S."; - - public final static String unicode_ljust_doc = - "S.ljust(width[, fillchar]) -> int\n" + - "\n" + - "Return S left-justified in a Unicode string of length width. Padding is\n" + - "done using the specified fill character (default is a space)."; - - public final static String unicode_lower_doc = - "S.lower() -> unicode\n" + - "\n" + - "Return a copy of the string S converted to lowercase."; - - public final static String unicode_lstrip_doc = - "S.lstrip([chars]) -> unicode\n" + - "\n" + - "Return a copy of the string S with leading whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is a str, it will be converted to unicode before stripping"; - - public final static String unicode_partition_doc = - "S.partition(sep) -> (head, sep, tail)\n" + - "\n" + - "Search for the separator sep in S, and return the part before it,\n" + - "the separator itself, and the part after it. If the separator is not\n" + - "found, return S and two empty strings."; - - public final static String unicode_replace_doc = - "S.replace (old, new[, count]) -> unicode\n" + - "\n" + - "Return a copy of S with all occurrences of substring\n" + - "old replaced by new. If the optional argument count is\n" + - "given, only the first count occurrences are replaced."; - - public final static String unicode_rfind_doc = - "S.rfind(sub [,start [,end]]) -> int\n" + - "\n" + - "Return the highest index in S where substring sub is found,\n" + - "such that sub is contained within s[start:end]. Optional\n" + - "arguments start and end are interpreted as in slice notation.\n" + - "\n" + - "Return -1 on failure."; - - public final static String unicode_rindex_doc = - "S.rindex(sub [,start [,end]]) -> int\n" + - "\n" + - "Like S.rfind() but raise ValueError when the substring is not found."; - - public final static String unicode_rjust_doc = - "S.rjust(width[, fillchar]) -> unicode\n" + - "\n" + - "Return S right-justified in a Unicode string of length width. Padding is\n" + - "done using the specified fill character (default is a space)."; - - public final static String unicode_rpartition_doc = - "S.rpartition(sep) -> (tail, sep, head)\n" + - "\n" + - "Search for the separator sep in S, starting at the end of S, and return\n" + - "the part before it, the separator itself, and the part after it. If the\n" + - "separator is not found, return two empty strings and S."; - - public final static String unicode_rsplit_doc = - "S.rsplit([sep [,maxsplit]]) -> list of strings\n" + - "\n" + - "Return a list of the words in S, using sep as the\n" + - "delimiter string, starting at the end of the string and\n" + - "working to the front. If maxsplit is given, at most maxsplit\n" + - "splits are done. If sep is not specified, any whitespace string\n" + - "is a separator."; - - public final static String unicode_rstrip_doc = - "S.rstrip([chars]) -> unicode\n" + - "\n" + - "Return a copy of the string S with trailing whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is a str, it will be converted to unicode before stripping"; - - public final static String unicode_split_doc = - "S.split([sep [,maxsplit]]) -> list of strings\n" + - "\n" + - "Return a list of the words in S, using sep as the\n" + - "delimiter string. If maxsplit is given, at most maxsplit\n" + - "splits are done. If sep is not specified or is None, any\n" + - "whitespace string is a separator and empty strings are\n" + - "removed from the result."; - - public final static String unicode_splitlines_doc = - "S.splitlines([keepends]) -> list of strings\n" + - "\n" + - "Return a list of the lines in S, breaking at line boundaries.\n" + - "Line breaks are not included in the resulting list unless keepends\n" + - "is given and true."; - - public final static String unicode_startswith_doc = - "S.startswith(prefix[, start[, end]]) -> bool\n" + - "\n" + - "Return True if S starts with the specified prefix, False otherwise.\n" + - "With optional start, test S beginning at that position.\n" + - "With optional end, stop comparing S at that position.\n" + - "prefix can also be a tuple of strings to try."; - - public final static String unicode_strip_doc = - "S.strip([chars]) -> unicode\n" + - "\n" + - "Return a copy of the string S with leading and trailing\n" + - "whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is a str, it will be converted to unicode before stripping"; - - public final static String unicode_swapcase_doc = - "S.swapcase() -> unicode\n" + - "\n" + - "Return a copy of S with uppercase characters converted to lowercase\n" + - "and vice versa."; - - public final static String unicode_title_doc = - "S.title() -> unicode\n" + - "\n" + - "Return a titlecased version of S, i.e. words start with title case\n" + - "characters, all remaining cased characters have lower case."; - - public final static String unicode_translate_doc = - "S.translate(table) -> unicode\n" + - "\n" + - "Return a copy of the string S, where all characters have been mapped\n" + - "through the given translation table, which must be a mapping of\n" + - "Unicode ordinals to Unicode ordinals, Unicode strings or None.\n" + - "Unmapped characters are left untouched. Characters mapped to None\n" + - "are deleted."; - - public final static String unicode_upper_doc = - "S.upper() -> unicode\n" + - "\n" + - "Return a copy of S converted to uppercase."; - - public final static String unicode_zfill_doc = - "S.zfill(width) -> unicode\n" + - "\n" + - "Pad a numeric string S with zeros on the left, to fill a field\n" + - "of the specified width. The string S is never truncated."; - - // Docs for - public final static String dict___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String dict___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String dict___contains___doc = - "D.__contains__(k) -> True if D has a key k, else False"; - - public final static String dict___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String dict___delitem___doc = - "x.__delitem__(y) <==> del x[y]"; - - public final static String dict_doc = - "dict() -> new empty dictionary.\n" + - "dict(mapping) -> new dictionary initialized from a mapping object's\n" + - " (key, value) pairs.\n" + - "dict(seq) -> new dictionary initialized as if via:\n" + - " d = {}\n" + - " for k, v in seq:\n" + - " d[k] = v\n" + - "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n" + - " in the keyword argument list. For example: dict(one=1, two=2)"; - - public final static String dict___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String dict___format___doc = - "default object formatter"; - - public final static String dict___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String dict___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String dict___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String dict___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String dict___hash___doc = - ""; - - public final static String dict___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String dict___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String dict___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String dict___len___doc = - "x.__len__() <==> len(x)"; - - public final static String dict___lt___doc = - "x.__lt__(y) <==> x x!=y"; - - public final static String dict___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String dict___reduce___doc = - "helper for pickle"; - - public final static String dict___reduce_ex___doc = - "helper for pickle"; - - public final static String dict___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String dict___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String dict___setitem___doc = - "x.__setitem__(i, y) <==> x[i]=y"; - - public final static String dict___sizeof___doc = - "D.__sizeof__() -> size of D in memory, in bytes"; - - public final static String dict___str___doc = - "x.__str__() <==> str(x)"; - - public final static String dict___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String dict_clear_doc = - "D.clear() -> None. Remove all items from D."; - - public final static String dict_copy_doc = - "D.copy() -> a shallow copy of D"; - - public final static String dict_fromkeys_doc = - "dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n" + - "v defaults to None."; - - public final static String dict_get_doc = - "D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."; - - public final static String dict_has_key_doc = - "D.has_key(k) -> True if D has a key k, else False"; - - public final static String dict_items_doc = - "D.items() -> list of D's (key, value) pairs, as 2-tuples"; - - public final static String dict_iteritems_doc = - "D.iteritems() -> an iterator over the (key, value) items of D"; - - public final static String dict_iterkeys_doc = - "D.iterkeys() -> an iterator over the keys of D"; - - public final static String dict_itervalues_doc = - "D.itervalues() -> an iterator over the values of D"; - - public final static String dict_keys_doc = - "D.keys() -> list of D's keys"; - - public final static String dict_pop_doc = - "D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n" + - "If key is not found, d is returned if given, otherwise KeyError is raised"; - - public final static String dict_popitem_doc = - "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n" + - "2-tuple; but raise KeyError if D is empty."; - - public final static String dict_setdefault_doc = - "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D"; - - public final static String dict_update_doc = - "D.update(E, **F) -> None. Update D from dict/iterable E and F.\n" + - "If E has a .keys() method, does: for k in E: D[k] = E[k]\n" + - "If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n" + - "In either case, this is followed by: for k in F: D[k] = F[k]"; - - public final static String dict_values_doc = - "D.values() -> list of D's values"; - - // Docs for - public final static String list___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String list___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String list___contains___doc = - "x.__contains__(y) <==> y in x"; - - public final static String list___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String list___delitem___doc = - "x.__delitem__(y) <==> del x[y]"; - - public final static String list___delslice___doc = - "x.__delslice__(i, j) <==> del x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String list_doc = - "list() -> new list\n" + - "list(sequence) -> new list initialized from sequence's items"; - - public final static String list___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String list___format___doc = - "default object formatter"; - - public final static String list___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String list___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String list___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String list___getslice___doc = - "x.__getslice__(i, j) <==> x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String list___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String list___hash___doc = - ""; - - public final static String list___iadd___doc = - "x.__iadd__(y) <==> x+=y"; - - public final static String list___imul___doc = - "x.__imul__(y) <==> x*=y"; - - public final static String list___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String list___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String list___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String list___len___doc = - "x.__len__() <==> len(x)"; - - public final static String list___lt___doc = - "x.__lt__(y) <==> x x*n"; - - public final static String list___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String list___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String list___reduce___doc = - "helper for pickle"; - - public final static String list___reduce_ex___doc = - "helper for pickle"; - - public final static String list___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String list___reversed___doc = - "L.__reversed__() -- return a reverse iterator over the list"; - - public final static String list___rmul___doc = - "x.__rmul__(n) <==> n*x"; - - public final static String list___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String list___setitem___doc = - "x.__setitem__(i, y) <==> x[i]=y"; - - public final static String list___setslice___doc = - "x.__setslice__(i, j, y) <==> x[i:j]=y\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String list___sizeof___doc = - "L.__sizeof__() -- size of L in memory, in bytes"; - - public final static String list___str___doc = - "x.__str__() <==> str(x)"; - - public final static String list___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String list_append_doc = - "L.append(object) -- append object to end"; - - public final static String list_count_doc = - "L.count(value) -> integer -- return number of occurrences of value"; - - public final static String list_extend_doc = - "L.extend(iterable) -- extend list by appending elements from the iterable"; - - public final static String list_index_doc = - "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n" + - "Raises ValueError if the value is not present."; - - public final static String list_insert_doc = - "L.insert(index, object) -- insert object before index"; - - public final static String list_pop_doc = - "L.pop([index]) -> item -- remove and return item at index (default last).\n" + - "Raises IndexError if list is empty or index is out of range."; - - public final static String list_remove_doc = - "L.remove(value) -- remove first occurrence of value.\n" + - "Raises ValueError if the value is not present."; - - public final static String list_reverse_doc = - "L.reverse() -- reverse *IN PLACE*"; - - public final static String list_sort_doc = - "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n" + - "cmp(x, y) -> -1, 0, 1"; - - // Docs for - public final static String slice___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String slice___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String slice___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String slice_doc = - "slice([start,] stop[, step])\n" + - "\n" + - "Create a slice object. This is used for extended slicing (e.g. a[0:10:2])."; - - public final static String slice___format___doc = - "default object formatter"; - - public final static String slice___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String slice___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String slice___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String slice___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String slice___reduce___doc = - "Return state information for pickling."; - - public final static String slice___reduce_ex___doc = - "helper for pickle"; - - public final static String slice___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String slice___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String slice___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String slice___str___doc = - "x.__str__() <==> str(x)"; - - public final static String slice___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String slice_indices_doc = - "S.indices(len) -> (start, stop, stride)\n" + - "\n" + - "Assuming a sequence of length len, calculate the start and stop\n" + - "indices, and the stride length of the extended slice described by\n" + - "S. Out of bounds indices are clipped in a manner consistent with the\n" + - "handling of normal slices."; - - public final static String slice_start_doc = - ""; - - public final static String slice_step_doc = - ""; - - public final static String slice_stop_doc = - ""; - - // Docs for - public final static String super___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String super___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String super_doc = - "super(type) -> unbound super object\n" + - "super(type, obj) -> bound super object; requires isinstance(obj, type)\n" + - "super(type, type2) -> bound super object; requires issubclass(type2, type)\n" + - "Typical use to call a cooperative superclass method:\n" + - "class C(B):\n" + - " def meth(self, arg):\n" + - " super(C, self).meth(arg)"; - - public final static String super___format___doc = - "default object formatter"; - - public final static String super___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String super___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String super___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String super___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String super___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String super___reduce___doc = - "helper for pickle"; - - public final static String super___reduce_ex___doc = - "helper for pickle"; - - public final static String super___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String super___self___doc = - "the instance invoking super(); may be None"; - - public final static String super___self_class___doc = - "the type of the instance invoking super(); may be None"; - - public final static String super___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String super___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String super___str___doc = - "x.__str__() <==> str(x)"; - - public final static String super___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String super___thisclass___doc = - "the class invoking super()"; - - // Docs for - public final static String staticmethod___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String staticmethod___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String staticmethod_doc = - "staticmethod(function) -> method\n" + - "\n" + - "Convert a function to be a static method.\n" + - "\n" + - "A static method does not receive an implicit first argument.\n" + - "To declare a static method, use this idiom:\n" + - "\n" + - " class C:\n" + - " def f(arg1, arg2, ...): ...\n" + - " f = staticmethod(f)\n" + - "\n" + - "It can be called either on the class (e.g. C.f()) or on an instance\n" + - "(e.g. C().f()). The instance is ignored except for its class.\n" + - "\n" + - "Static methods in Python are similar to those found in Java or C++.\n" + - "For a more advanced concept, see the classmethod builtin."; - - public final static String staticmethod___format___doc = - "default object formatter"; - - public final static String staticmethod___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String staticmethod___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String staticmethod___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String staticmethod___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String staticmethod___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String staticmethod___reduce___doc = - "helper for pickle"; - - public final static String staticmethod___reduce_ex___doc = - "helper for pickle"; - - public final static String staticmethod___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String staticmethod___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String staticmethod___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String staticmethod___str___doc = - "x.__str__() <==> str(x)"; - - public final static String staticmethod___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - // Docs for - public final static String float___abs___doc = - "x.__abs__() <==> abs(x)"; - - public final static String float___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String float___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String float___coerce___doc = - "x.__coerce__(y) <==> coerce(x, y)"; - - public final static String float___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String float___div___doc = - "x.__div__(y) <==> x/y"; - - public final static String float___divmod___doc = - "x.__divmod__(y) <==> divmod(x, y)"; - - public final static String float_doc = - "float(x) -> floating point number\n" + - "\n" + - "Convert a string or number to a floating point number, if possible."; - - public final static String float___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String float___float___doc = - "x.__float__() <==> float(x)"; - - public final static String float___floordiv___doc = - "x.__floordiv__(y) <==> x//y"; - - public final static String float___format___doc = - "float.__format__(format_spec) -> string\n" + - "\n" + - "Formats the float according to format_spec."; - - public final static String float___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String float___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String float___getformat___doc = - "float.__getformat__(typestr) -> string\n" + - "\n" + - "You probably don't want to use this function. It exists mainly to be\n" + - "used in Python's test suite.\n" + - "\n" + - "typestr must be 'double' or 'float'. This function returns whichever of\n" + - "'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n" + - "format of floating point numbers used by the C type named by typestr."; - - public final static String float___getnewargs___doc = - ""; - - public final static String float___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String float___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String float___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String float___int___doc = - "x.__int__() <==> int(x)"; - - public final static String float___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String float___long___doc = - "x.__long__() <==> long(x)"; - - public final static String float___lt___doc = - "x.__lt__(y) <==> x x%y"; - - public final static String float___mul___doc = - "x.__mul__(y) <==> x*y"; - - public final static String float___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String float___neg___doc = - "x.__neg__() <==> -x"; - - public final static String float___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String float___nonzero___doc = - "x.__nonzero__() <==> x != 0"; - - public final static String float___pos___doc = - "x.__pos__() <==> +x"; - - public final static String float___pow___doc = - "x.__pow__(y[, z]) <==> pow(x, y[, z])"; - - public final static String float___radd___doc = - "x.__radd__(y) <==> y+x"; - - public final static String float___rdiv___doc = - "x.__rdiv__(y) <==> y/x"; - - public final static String float___rdivmod___doc = - "x.__rdivmod__(y) <==> divmod(y, x)"; - - public final static String float___reduce___doc = - "helper for pickle"; - - public final static String float___reduce_ex___doc = - "helper for pickle"; - - public final static String float___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String float___rfloordiv___doc = - "x.__rfloordiv__(y) <==> y//x"; - - public final static String float___rmod___doc = - "x.__rmod__(y) <==> y%x"; - - public final static String float___rmul___doc = - "x.__rmul__(y) <==> y*x"; - - public final static String float___rpow___doc = - "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; - - public final static String float___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String float___rtruediv___doc = - "x.__rtruediv__(y) <==> y/x"; - - public final static String float___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String float___setformat___doc = - "float.__setformat__(typestr, fmt) -> None\n" + - "\n" + - "You probably don't want to use this function. It exists mainly to be\n" + - "used in Python's test suite.\n" + - "\n" + - "typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n" + - "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" + - "one of the latter two if it appears to match the underlying C reality.\n" + - "\n" + - "Overrides the automatic determination of C-level floating point type.\n" + - "This affects how floats are converted to and from binary strings."; - - public final static String float___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String float___str___doc = - "x.__str__() <==> str(x)"; - - public final static String float___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String float___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String float___truediv___doc = - "x.__truediv__(y) <==> x/y"; - - public final static String float___trunc___doc = - "Returns the Integral closest to x between 0 and x."; - - public final static String float_as_integer_ratio_doc = - "float.as_integer_ratio() -> (int, int)\n" + - "\n" + - "Returns a pair of integers, whose ratio is exactly equal to the original\n" + - "float and with a positive denominator.\n" + - "Raises OverflowError on infinities and a ValueError on NaNs.\n" + - "\n" + - ">>> (10.0).as_integer_ratio()\n" + - "(10, 1)\n" + - ">>> (0.0).as_integer_ratio()\n" + - "(0, 1)\n" + - ">>> (-.25).as_integer_ratio()\n" + - "(-1, 4)"; - - public final static String float_conjugate_doc = - "Returns self, the complex conjugate of any float."; - - public final static String float_fromhex_doc = - "float.fromhex(string) -> float\n" + - "\n" + - "Create a floating-point number from a hexadecimal string.\n" + - ">>> float.fromhex('0x1.ffffp10')\n" + - "2047.984375\n" + - ">>> float.fromhex('-0x1p-1074')\n" + - "-4.9406564584124654e-324"; - - public final static String float_hex_doc = - "float.hex() -> string\n" + - "\n" + - "Return a hexadecimal representation of a floating-point number.\n" + - ">>> (-0.1).hex()\n" + - "'-0x1.999999999999ap-4'\n" + - ">>> 3.14159.hex()\n" + - "'0x1.921f9f01b866ep+1'"; - - public final static String float_imag_doc = - "the imaginary part of a complex number"; - - public final static String float_is_integer_doc = - "Returns True if the float is an integer."; - - public final static String float_real_doc = - "the real part of a complex number"; - - // Docs for - public final static String enumerate___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String enumerate___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String enumerate_doc = - "enumerate(iterable) -> iterator for index, value of iterable\n" + - "\n" + - "Return an enumerate object. iterable must be another object that supports\n" + - "iteration. The enumerate object yields pairs containing a count (from\n" + - "zero) and a value yielded by the iterable argument. enumerate is useful\n" + - "for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ..."; - - public final static String enumerate___format___doc = - "default object formatter"; - - public final static String enumerate___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String enumerate___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String enumerate___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String enumerate___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String enumerate___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String enumerate___reduce___doc = - "helper for pickle"; - - public final static String enumerate___reduce_ex___doc = - "helper for pickle"; - - public final static String enumerate___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String enumerate___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String enumerate___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String enumerate___str___doc = - "x.__str__() <==> str(x)"; - - public final static String enumerate___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String enumerate_next_doc = - "x.next() -> the next value, or raise StopIteration"; - - // Docs for - public final static String basestring___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String basestring___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String basestring_doc = - "Type basestring cannot be instantiated; it is the base for str and unicode."; - - public final static String basestring___format___doc = - "default object formatter"; - - public final static String basestring___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String basestring___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String basestring___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String basestring___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String basestring___reduce___doc = - "helper for pickle"; - - public final static String basestring___reduce_ex___doc = - "helper for pickle"; - - public final static String basestring___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String basestring___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String basestring___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String basestring___str___doc = - "x.__str__() <==> str(x)"; - - public final static String basestring___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - // Docs for - public final static String long___abs___doc = - "x.__abs__() <==> abs(x)"; - - public final static String long___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String long___and___doc = - "x.__and__(y) <==> x&y"; - - public final static String long___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String long___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String long___coerce___doc = - "x.__coerce__(y) <==> coerce(x, y)"; - - public final static String long___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String long___div___doc = - "x.__div__(y) <==> x/y"; - - public final static String long___divmod___doc = - "x.__divmod__(y) <==> divmod(x, y)"; - - public final static String long_doc = - "long(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to a long integer, if possible. A floating\n" + - "point argument will be truncated towards zero (this does not include a\n" + - "string representation of a floating point number!) When converting a\n" + - "string, use the optional base. It is an error to supply a base when\n" + - "converting a non-string."; - - public final static String long___float___doc = - "x.__float__() <==> float(x)"; - - public final static String long___floordiv___doc = - "x.__floordiv__(y) <==> x//y"; - - public final static String long___format___doc = - ""; - - public final static String long___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String long___getnewargs___doc = - ""; - - public final static String long___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String long___hex___doc = - "x.__hex__() <==> hex(x)"; - - public final static String long___index___doc = - "x[y:z] <==> x[y.__index__():z.__index__()]"; - - public final static String long___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String long___int___doc = - "x.__int__() <==> int(x)"; - - public final static String long___invert___doc = - "x.__invert__() <==> ~x"; - - public final static String long___long___doc = - "x.__long__() <==> long(x)"; - - public final static String long___lshift___doc = - "x.__lshift__(y) <==> x< x%y"; - - public final static String long___mul___doc = - "x.__mul__(y) <==> x*y"; - - public final static String long___neg___doc = - "x.__neg__() <==> -x"; - - public final static String long___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String long___nonzero___doc = - "x.__nonzero__() <==> x != 0"; - - public final static String long___oct___doc = - "x.__oct__() <==> oct(x)"; - - public final static String long___or___doc = - "x.__or__(y) <==> x|y"; - - public final static String long___pos___doc = - "x.__pos__() <==> +x"; - - public final static String long___pow___doc = - "x.__pow__(y[, z]) <==> pow(x, y[, z])"; - - public final static String long___radd___doc = - "x.__radd__(y) <==> y+x"; - - public final static String long___rand___doc = - "x.__rand__(y) <==> y&x"; - - public final static String long___rdiv___doc = - "x.__rdiv__(y) <==> y/x"; - - public final static String long___rdivmod___doc = - "x.__rdivmod__(y) <==> divmod(y, x)"; - - public final static String long___reduce___doc = - "helper for pickle"; - - public final static String long___reduce_ex___doc = - "helper for pickle"; - - public final static String long___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String long___rfloordiv___doc = - "x.__rfloordiv__(y) <==> y//x"; - - public final static String long___rlshift___doc = - "x.__rlshift__(y) <==> y< y%x"; - - public final static String long___rmul___doc = - "x.__rmul__(y) <==> y*x"; - - public final static String long___ror___doc = - "x.__ror__(y) <==> y|x"; - - public final static String long___rpow___doc = - "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; - - public final static String long___rrshift___doc = - "x.__rrshift__(y) <==> y>>x"; - - public final static String long___rshift___doc = - "x.__rshift__(y) <==> x>>y"; - - public final static String long___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String long___rtruediv___doc = - "x.__rtruediv__(y) <==> y/x"; - - public final static String long___rxor___doc = - "x.__rxor__(y) <==> y^x"; - - public final static String long___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String long___sizeof___doc = - "Returns size in memory, in bytes"; - - public final static String long___str___doc = - "x.__str__() <==> str(x)"; - - public final static String long___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String long___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String long___truediv___doc = - "x.__truediv__(y) <==> x/y"; - - public final static String long___trunc___doc = - "Truncating an Integral returns itself."; - - public final static String long___xor___doc = - "x.__xor__(y) <==> x^y"; - - public final static String long_conjugate_doc = - "Returns self, the complex conjugate of any long."; - - public final static String long_denominator_doc = - "the denominator of a rational number in lowest terms"; - - public final static String long_imag_doc = - "the imaginary part of a complex number"; - - public final static String long_numerator_doc = - "the numerator of a rational number in lowest terms"; - - public final static String long_real_doc = - "the real part of a complex number"; - - // Docs for - public final static String tuple___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String tuple___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String tuple___contains___doc = - "x.__contains__(y) <==> y in x"; - - public final static String tuple___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String tuple_doc = - "tuple() -> an empty tuple\n" + - "tuple(sequence) -> tuple initialized from sequence's items\n" + - "\n" + - "If the argument is a tuple, the return value is the same object."; - - public final static String tuple___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String tuple___format___doc = - "default object formatter"; - - public final static String tuple___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String tuple___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String tuple___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String tuple___getnewargs___doc = - ""; - - public final static String tuple___getslice___doc = - "x.__getslice__(i, j) <==> x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String tuple___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String tuple___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String tuple___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String tuple___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String tuple___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String tuple___len___doc = - "x.__len__() <==> len(x)"; - - public final static String tuple___lt___doc = - "x.__lt__(y) <==> x x*n"; - - public final static String tuple___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String tuple___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String tuple___reduce___doc = - "helper for pickle"; - - public final static String tuple___reduce_ex___doc = - "helper for pickle"; - - public final static String tuple___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String tuple___rmul___doc = - "x.__rmul__(n) <==> n*x"; - - public final static String tuple___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String tuple___sizeof___doc = - "T.__sizeof__() -- size of T in memory, in bytes"; - - public final static String tuple___str___doc = - "x.__str__() <==> str(x)"; - - public final static String tuple___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String tuple_count_doc = - "T.count(value) -> integer -- return number of occurrences of value"; - - public final static String tuple_index_doc = - "T.index(value, [start, [stop]]) -> integer -- return first index of value.\n" + - "Raises ValueError if the value is not present."; - - // Docs for - public final static String str___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String str___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String str___contains___doc = - "x.__contains__(y) <==> y in x"; - - public final static String str___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String str_doc = - "str(object) -> string\n" + - "\n" + - "Return a nice string representation of the object.\n" + - "If the argument is a string, the return value is the same object."; - - public final static String str___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String str___format___doc = - "S.__format__(format_spec) -> unicode\n" + - "\n" + - ""; - - public final static String str___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String str___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String str___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String str___getnewargs___doc = - ""; - - public final static String str___getslice___doc = - "x.__getslice__(i, j) <==> x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String str___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String str___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String str___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String str___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String str___len___doc = - "x.__len__() <==> len(x)"; - - public final static String str___lt___doc = - "x.__lt__(y) <==> x x%y"; - - public final static String str___mul___doc = - "x.__mul__(n) <==> x*n"; - - public final static String str___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String str___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String str___reduce___doc = - "helper for pickle"; - - public final static String str___reduce_ex___doc = - "helper for pickle"; - - public final static String str___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String str___rmod___doc = - "x.__rmod__(y) <==> y%x"; - - public final static String str___rmul___doc = - "x.__rmul__(n) <==> n*x"; - - public final static String str___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String str___sizeof___doc = - "S.__sizeof__() -> size of S in memory, in bytes"; - - public final static String str___str___doc = - "x.__str__() <==> str(x)"; - - public final static String str___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String str__formatter_field_name_split_doc = - ""; - - public final static String str__formatter_parser_doc = - ""; - - public final static String str_capitalize_doc = - "S.capitalize() -> string\n" + - "\n" + - "Return a copy of the string S with only its first character\n" + - "capitalized."; - - public final static String str_center_doc = - "S.center(width[, fillchar]) -> string\n" + - "\n" + - "Return S centered in a string of length width. Padding is\n" + - "done using the specified fill character (default is a space)"; - - public final static String str_count_doc = - "S.count(sub[, start[, end]]) -> int\n" + - "\n" + - "Return the number of non-overlapping occurrences of substring sub in\n" + - "string S[start:end]. Optional arguments start and end are interpreted\n" + - "as in slice notation."; - - public final static String str_decode_doc = - "S.decode([encoding[,errors]]) -> object\n" + - "\n" + - "Decodes S using the codec registered for encoding. encoding defaults\n" + - "to the default encoding. errors may be given to set a different error\n" + - "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + - "a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n" + - "as well as any other name registered with codecs.register_error that is\n" + - "able to handle UnicodeDecodeErrors."; - - public final static String str_encode_doc = - "S.encode([encoding[,errors]]) -> object\n" + - "\n" + - "Encodes S using the codec registered for encoding. encoding defaults\n" + - "to the default encoding. errors may be given to set a different error\n" + - "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + - "a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n" + - "'xmlcharrefreplace' as well as any other name registered with\n" + - "codecs.register_error that is able to handle UnicodeEncodeErrors."; - - public final static String str_endswith_doc = - "S.endswith(suffix[, start[, end]]) -> bool\n" + - "\n" + - "Return True if S ends with the specified suffix, False otherwise.\n" + - "With optional start, test S beginning at that position.\n" + - "With optional end, stop comparing S at that position.\n" + - "suffix can also be a tuple of strings to try."; - - public final static String str_expandtabs_doc = - "S.expandtabs([tabsize]) -> string\n" + - "\n" + - "Return a copy of S where all tab characters are expanded using spaces.\n" + - "If tabsize is not given, a tab size of 8 characters is assumed."; - - public final static String str_find_doc = - "S.find(sub [,start [,end]]) -> int\n" + - "\n" + - "Return the lowest index in S where substring sub is found,\n" + - "such that sub is contained within s[start:end]. Optional\n" + - "arguments start and end are interpreted as in slice notation.\n" + - "\n" + - "Return -1 on failure."; - - public final static String str_format_doc = - "S.format(*args, **kwargs) -> unicode\n" + - "\n" + - ""; - - public final static String str_index_doc = - "S.index(sub [,start [,end]]) -> int\n" + - "\n" + - "Like S.find() but raise ValueError when the substring is not found."; - - public final static String str_isalnum_doc = - "S.isalnum() -> bool\n" + - "\n" + - "Return True if all characters in S are alphanumeric\n" + - "and there is at least one character in S, False otherwise."; - - public final static String str_isalpha_doc = - "S.isalpha() -> bool\n" + - "\n" + - "Return True if all characters in S are alphabetic\n" + - "and there is at least one character in S, False otherwise."; - - public final static String str_isdigit_doc = - "S.isdigit() -> bool\n" + - "\n" + - "Return True if all characters in S are digits\n" + - "and there is at least one character in S, False otherwise."; - - public final static String str_islower_doc = - "S.islower() -> bool\n" + - "\n" + - "Return True if all cased characters in S are lowercase and there is\n" + - "at least one cased character in S, False otherwise."; - - public final static String str_isspace_doc = - "S.isspace() -> bool\n" + - "\n" + - "Return True if all characters in S are whitespace\n" + - "and there is at least one character in S, False otherwise."; - - public final static String str_istitle_doc = - "S.istitle() -> bool\n" + - "\n" + - "Return True if S is a titlecased string and there is at least one\n" + - "character in S, i.e. uppercase characters may only follow uncased\n" + - "characters and lowercase characters only cased ones. Return False\n" + - "otherwise."; - - public final static String str_isupper_doc = - "S.isupper() -> bool\n" + - "\n" + - "Return True if all cased characters in S are uppercase and there is\n" + - "at least one cased character in S, False otherwise."; - - public final static String str_join_doc = - "S.join(sequence) -> string\n" + - "\n" + - "Return a string which is the concatenation of the strings in the\n" + - "sequence. The separator between elements is S."; - - public final static String str_ljust_doc = - "S.ljust(width[, fillchar]) -> string\n" + - "\n" + - "Return S left-justified in a string of length width. Padding is\n" + - "done using the specified fill character (default is a space)."; - - public final static String str_lower_doc = - "S.lower() -> string\n" + - "\n" + - "Return a copy of the string S converted to lowercase."; - - public final static String str_lstrip_doc = - "S.lstrip([chars]) -> string or unicode\n" + - "\n" + - "Return a copy of the string S with leading whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is unicode, S will be converted to unicode before stripping"; - - public final static String str_partition_doc = - "S.partition(sep) -> (head, sep, tail)\n" + - "\n" + - "Search for the separator sep in S, and return the part before it,\n" + - "the separator itself, and the part after it. If the separator is not\n" + - "found, return S and two empty strings."; - - public final static String str_replace_doc = - "S.replace (old, new[, count]) -> string\n" + - "\n" + - "Return a copy of string S with all occurrences of substring\n" + - "old replaced by new. If the optional argument count is\n" + - "given, only the first count occurrences are replaced."; - - public final static String str_rfind_doc = - "S.rfind(sub [,start [,end]]) -> int\n" + - "\n" + - "Return the highest index in S where substring sub is found,\n" + - "such that sub is contained within s[start:end]. Optional\n" + - "arguments start and end are interpreted as in slice notation.\n" + - "\n" + - "Return -1 on failure."; - - public final static String str_rindex_doc = - "S.rindex(sub [,start [,end]]) -> int\n" + - "\n" + - "Like S.rfind() but raise ValueError when the substring is not found."; - - public final static String str_rjust_doc = - "S.rjust(width[, fillchar]) -> string\n" + - "\n" + - "Return S right-justified in a string of length width. Padding is\n" + - "done using the specified fill character (default is a space)"; - - public final static String str_rpartition_doc = - "S.rpartition(sep) -> (tail, sep, head)\n" + - "\n" + - "Search for the separator sep in S, starting at the end of S, and return\n" + - "the part before it, the separator itself, and the part after it. If the\n" + - "separator is not found, return two empty strings and S."; - - public final static String str_rsplit_doc = - "S.rsplit([sep [,maxsplit]]) -> list of strings\n" + - "\n" + - "Return a list of the words in the string S, using sep as the\n" + - "delimiter string, starting at the end of the string and working\n" + - "to the front. If maxsplit is given, at most maxsplit splits are\n" + - "done. If sep is not specified or is None, any whitespace string\n" + - "is a separator."; - - public final static String str_rstrip_doc = - "S.rstrip([chars]) -> string or unicode\n" + - "\n" + - "Return a copy of the string S with trailing whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is unicode, S will be converted to unicode before stripping"; - - public final static String str_split_doc = - "S.split([sep [,maxsplit]]) -> list of strings\n" + - "\n" + - "Return a list of the words in the string S, using sep as the\n" + - "delimiter string. If maxsplit is given, at most maxsplit\n" + - "splits are done. If sep is not specified or is None, any\n" + - "whitespace string is a separator and empty strings are removed\n" + - "from the result."; - - public final static String str_splitlines_doc = - "S.splitlines([keepends]) -> list of strings\n" + - "\n" + - "Return a list of the lines in S, breaking at line boundaries.\n" + - "Line breaks are not included in the resulting list unless keepends\n" + - "is given and true."; - - public final static String str_startswith_doc = - "S.startswith(prefix[, start[, end]]) -> bool\n" + - "\n" + - "Return True if S starts with the specified prefix, False otherwise.\n" + - "With optional start, test S beginning at that position.\n" + - "With optional end, stop comparing S at that position.\n" + - "prefix can also be a tuple of strings to try."; - - public final static String str_strip_doc = - "S.strip([chars]) -> string or unicode\n" + - "\n" + - "Return a copy of the string S with leading and trailing\n" + - "whitespace removed.\n" + - "If chars is given and not None, remove characters in chars instead.\n" + - "If chars is unicode, S will be converted to unicode before stripping"; - - public final static String str_swapcase_doc = - "S.swapcase() -> string\n" + - "\n" + - "Return a copy of the string S with uppercase characters\n" + - "converted to lowercase and vice versa."; - - public final static String str_title_doc = - "S.title() -> string\n" + - "\n" + - "Return a titlecased version of S, i.e. words start with uppercase\n" + - "characters, all remaining cased characters have lowercase."; - - public final static String str_translate_doc = - "S.translate(table [,deletechars]) -> string\n" + - "\n" + - "Return a copy of the string S, where all characters occurring\n" + - "in the optional argument deletechars are removed, and the\n" + - "remaining characters have been mapped through the given\n" + - "translation table, which must be a string of length 256."; - - public final static String str_upper_doc = - "S.upper() -> string\n" + - "\n" + - "Return a copy of the string S converted to uppercase."; - - public final static String str_zfill_doc = - "S.zfill(width) -> string\n" + - "\n" + - "Pad a numeric string S with zeros on the left, to fill a field\n" + - "of the specified width. The string S is never truncated."; - - // Docs for - public final static String property___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String property___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String property___delete___doc = - "descr.__delete__(obj)"; - - public final static String property_doc = - "property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n" + - "\n" + - "fget is a function to be used for getting an attribute value, and likewise\n" + - "fset is a function for setting, and fdel a function for del'ing, an\n" + - "attribute. Typical use is to define a managed attribute x:\n" + - "class C(object):\n" + - " def getx(self): return self._x\n" + - " def setx(self, value): self._x = value\n" + - " def delx(self): del self._x\n" + - " x = property(getx, setx, delx, \"I'm the 'x' property.\")\n" + - "\n" + - "Decorators make defining new properties or modifying existing ones easy:\n" + - "class C(object):\n" + - " @property\n" + - " def x(self): return self._x\n" + - " @x.setter\n" + - " def x(self, value): self._x = value\n" + - " @x.deleter\n" + - " def x(self): del self._x\n" + - ""; - - public final static String property___format___doc = - "default object formatter"; - - public final static String property___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String property___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String property___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String property___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String property___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String property___reduce___doc = - "helper for pickle"; - - public final static String property___reduce_ex___doc = - "helper for pickle"; - - public final static String property___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String property___set___doc = - "descr.__set__(obj, value)"; - - public final static String property___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String property___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String property___str___doc = - "x.__str__() <==> str(x)"; - - public final static String property___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String property_deleter_doc = - "Descriptor to change the deleter on a property."; - - public final static String property_fdel_doc = - ""; - - public final static String property_fget_doc = - ""; - - public final static String property_fset_doc = - ""; - - public final static String property_getter_doc = - "Descriptor to change the getter on a property."; - - public final static String property_setter_doc = - "Descriptor to change the setter on a property."; - - // Docs for - public final static String int___abs___doc = - "x.__abs__() <==> abs(x)"; - - public final static String int___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String int___and___doc = - "x.__and__(y) <==> x&y"; - - public final static String int___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String int___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String int___coerce___doc = - "x.__coerce__(y) <==> coerce(x, y)"; - - public final static String int___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String int___div___doc = - "x.__div__(y) <==> x/y"; - - public final static String int___divmod___doc = - "x.__divmod__(y) <==> divmod(x, y)"; - - public final static String int_doc = - "int(x[, base]) -> integer\n" + - "\n" + - "Convert a string or number to an integer, if possible. A floating point\n" + - "argument will be truncated towards zero (this does not include a string\n" + - "representation of a floating point number!) When converting a string, use\n" + - "the optional base. It is an error to supply a base when converting a\n" + - "non-string. If base is zero, the proper base is guessed based on the\n" + - "string content. If the argument is outside the integer range a\n" + - "long object will be returned instead."; - - public final static String int___float___doc = - "x.__float__() <==> float(x)"; - - public final static String int___floordiv___doc = - "x.__floordiv__(y) <==> x//y"; - - public final static String int___format___doc = - ""; - - public final static String int___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String int___getnewargs___doc = - ""; - - public final static String int___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String int___hex___doc = - "x.__hex__() <==> hex(x)"; - - public final static String int___index___doc = - "x[y:z] <==> x[y.__index__():z.__index__()]"; - - public final static String int___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String int___int___doc = - "x.__int__() <==> int(x)"; - - public final static String int___invert___doc = - "x.__invert__() <==> ~x"; - - public final static String int___long___doc = - "x.__long__() <==> long(x)"; - - public final static String int___lshift___doc = - "x.__lshift__(y) <==> x< x%y"; - - public final static String int___mul___doc = - "x.__mul__(y) <==> x*y"; - - public final static String int___neg___doc = - "x.__neg__() <==> -x"; - - public final static String int___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String int___nonzero___doc = - "x.__nonzero__() <==> x != 0"; - - public final static String int___oct___doc = - "x.__oct__() <==> oct(x)"; - - public final static String int___or___doc = - "x.__or__(y) <==> x|y"; - - public final static String int___pos___doc = - "x.__pos__() <==> +x"; - - public final static String int___pow___doc = - "x.__pow__(y[, z]) <==> pow(x, y[, z])"; - - public final static String int___radd___doc = - "x.__radd__(y) <==> y+x"; - - public final static String int___rand___doc = - "x.__rand__(y) <==> y&x"; - - public final static String int___rdiv___doc = - "x.__rdiv__(y) <==> y/x"; - - public final static String int___rdivmod___doc = - "x.__rdivmod__(y) <==> divmod(y, x)"; - - public final static String int___reduce___doc = - "helper for pickle"; - - public final static String int___reduce_ex___doc = - "helper for pickle"; - - public final static String int___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String int___rfloordiv___doc = - "x.__rfloordiv__(y) <==> y//x"; - - public final static String int___rlshift___doc = - "x.__rlshift__(y) <==> y< y%x"; - - public final static String int___rmul___doc = - "x.__rmul__(y) <==> y*x"; - - public final static String int___ror___doc = - "x.__ror__(y) <==> y|x"; - - public final static String int___rpow___doc = - "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; - - public final static String int___rrshift___doc = - "x.__rrshift__(y) <==> y>>x"; - - public final static String int___rshift___doc = - "x.__rshift__(y) <==> x>>y"; - - public final static String int___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String int___rtruediv___doc = - "x.__rtruediv__(y) <==> y/x"; - - public final static String int___rxor___doc = - "x.__rxor__(y) <==> y^x"; - - public final static String int___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String int___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String int___str___doc = - "x.__str__() <==> str(x)"; - - public final static String int___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String int___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String int___truediv___doc = - "x.__truediv__(y) <==> x/y"; - - public final static String int___trunc___doc = - "Truncating an Integral returns itself."; - - public final static String int___xor___doc = - "x.__xor__(y) <==> x^y"; - - public final static String int_conjugate_doc = - "Returns self, the complex conjugate of any int."; - - public final static String int_denominator_doc = - "the denominator of a rational number in lowest terms"; - - public final static String int_imag_doc = - "the imaginary part of a complex number"; - - public final static String int_numerator_doc = - "the numerator of a rational number in lowest terms"; - - public final static String int_real_doc = - "the real part of a complex number"; - - // Docs for - public final static String xrange___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String xrange___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String xrange_doc = - "xrange([start,] stop[, step]) -> xrange object\n" + - "\n" + - "Like range(), but instead of returning a list, returns an object that\n" + - "generates the numbers in the range on demand. For looping, this is \n" + - "slightly faster than range() and more memory efficient."; - - public final static String xrange___format___doc = - "default object formatter"; - - public final static String xrange___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String xrange___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String xrange___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String xrange___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String xrange___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String xrange___len___doc = - "x.__len__() <==> len(x)"; - - public final static String xrange___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String xrange___reduce___doc = - ""; - - public final static String xrange___reduce_ex___doc = - "helper for pickle"; - - public final static String xrange___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String xrange___reversed___doc = - "Returns a reverse iterator."; - - public final static String xrange___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String xrange___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String xrange___str___doc = - "x.__str__() <==> str(x)"; - - public final static String xrange___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - // Docs for - public final static String file___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String file___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String file_doc = - "file(name[, mode[, buffering]]) -> file object\n" + - "\n" + - "Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n" + - "writing or appending. The file will be created if it doesn't exist\n" + - "when opened for writing or appending; it will be truncated when\n" + - "opened for writing. Add a 'b' to the mode for binary files.\n" + - "Add a '+' to the mode to allow simultaneous reading and writing.\n" + - "If the buffering argument is given, 0 means unbuffered, 1 means line\n" + - "buffered, and larger numbers specify the buffer size. The preferred way\n" + - "to open a file is with the builtin open() function.\n" + - "Add a 'U' to mode to open the file for input with universal newline\n" + - "support. Any line ending in the input file will be seen as a '\\n'\n" + - "in Python. Also, a file so opened gains the attribute 'newlines';\n" + - "the value for this attribute is one of None (no newline read yet),\n" + - "'\\r', '\\n', '\\r\\n' or a tuple containing all the newline types seen.\n" + - "\n" + - "'U' cannot be combined with 'w' or '+' mode.\n" + - ""; - - public final static String file___enter___doc = - "__enter__() -> self."; - - public final static String file___exit___doc = - "__exit__(*excinfo) -> None. Closes the file."; - - public final static String file___format___doc = - "default object formatter"; - - public final static String file___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String file___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String file___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String file___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String file___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String file___reduce___doc = - "helper for pickle"; - - public final static String file___reduce_ex___doc = - "helper for pickle"; - - public final static String file___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String file___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String file___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String file___str___doc = - "x.__str__() <==> str(x)"; - - public final static String file___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String file_close_doc = - "close() -> None or (perhaps) an integer. Close the file.\n" + - "\n" + - "Sets data attribute .closed to True. A closed file cannot be used for\n" + - "further I/O operations. close() may be called more than once without\n" + - "error. Some kinds of file objects (for example, opened by popen())\n" + - "may return an exit status upon closing."; - - public final static String file_closed_doc = - "True if the file is closed"; - - public final static String file_encoding_doc = - "file encoding"; - - public final static String file_errors_doc = - "Unicode error handler"; - - public final static String file_fileno_doc = - "fileno() -> integer \"file descriptor\".\n" + - "\n" + - "This is needed for lower-level file interfaces, such os.read()."; - - public final static String file_flush_doc = - "flush() -> None. Flush the internal I/O buffer."; - - public final static String file_isatty_doc = - "isatty() -> true or false. True if the file is connected to a tty device."; - - public final static String file_mode_doc = - "file mode ('r', 'U', 'w', 'a', possibly with 'b' or '+' added)"; - - public final static String file_name_doc = - "file name"; - - public final static String file_newlines_doc = - "end-of-line convention used in this file"; - - public final static String file_next_doc = - "x.next() -> the next value, or raise StopIteration"; - - public final static String file_read_doc = - "read([size]) -> read at most size bytes, returned as a string.\n" + - "\n" + - "If the size argument is negative or omitted, read until EOF is reached.\n" + - "Notice that when in non-blocking mode, less data than what was requested\n" + - "may be returned, even if no size parameter was given."; - - public final static String file_readinto_doc = - "readinto() -> Undocumented. Don't use this; it may go away."; - - public final static String file_readline_doc = - "readline([size]) -> next line from the file, as a string.\n" + - "\n" + - "Retain newline. A non-negative size argument limits the maximum\n" + - "number of bytes to return (an incomplete line may be returned then).\n" + - "Return an empty string at EOF."; - - public final static String file_readlines_doc = - "readlines([size]) -> list of strings, each a line from the file.\n" + - "\n" + - "Call readline() repeatedly and return a list of the lines so read.\n" + - "The optional size argument, if given, is an approximate bound on the\n" + - "total number of bytes in the lines returned."; - - public final static String file_seek_doc = - "seek(offset[, whence]) -> None. Move to new file position.\n" + - "\n" + - "Argument offset is a byte count. Optional argument whence defaults to\n" + - "0 (offset from start of file, offset should be >= 0); other values are 1\n" + - "(move relative to current position, positive or negative), and 2 (move\n" + - "relative to end of file, usually negative, although many platforms allow\n" + - "seeking beyond the end of a file). If the file is opened in text mode,\n" + - "only offsets returned by tell() are legal. Use of other offsets causes\n" + - "undefined behavior.\n" + - "Note that not all file objects are seekable."; - - public final static String file_softspace_doc = - "flag indicating that a space needs to be printed; used by print"; - - public final static String file_tell_doc = - "tell() -> current file position, an integer (may be a long integer)."; - - public final static String file_truncate_doc = - "truncate([size]) -> None. Truncate the file to at most size bytes.\n" + - "\n" + - "Size defaults to the current file position, as returned by tell()."; - - public final static String file_write_doc = - "write(str) -> None. Write string str to file.\n" + - "\n" + - "Note that due to buffering, flush() or close() may be needed before\n" + - "the file on disk reflects the data written."; - - public final static String file_writelines_doc = - "writelines(sequence_of_strings) -> None. Write the strings to the file.\n" + - "\n" + - "Note that newlines are not added. The sequence can be any iterable object\n" + - "producing strings. This is equivalent to calling write() for each string."; - - public final static String file_xreadlines_doc = - "xreadlines() -> returns self.\n" + - "\n" + - "For backward compatibility. File objects now include the performance\n" + - "optimizations previously implemented in the xreadlines module."; - - // Docs for - public final static String complex___abs___doc = - "x.__abs__() <==> abs(x)"; - - public final static String complex___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String complex___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String complex___coerce___doc = - "x.__coerce__(y) <==> coerce(x, y)"; - - public final static String complex___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String complex___div___doc = - "x.__div__(y) <==> x/y"; - - public final static String complex___divmod___doc = - "x.__divmod__(y) <==> divmod(x, y)"; - - public final static String complex_doc = - "complex(real[, imag]) -> complex number\n" + - "\n" + - "Create a complex number from a real part and an optional imaginary part.\n" + - "This is equivalent to (real + imag*1j) where imag defaults to 0."; - - public final static String complex___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String complex___float___doc = - "x.__float__() <==> float(x)"; - - public final static String complex___floordiv___doc = - "x.__floordiv__(y) <==> x//y"; - - public final static String complex___format___doc = - "default object formatter"; - - public final static String complex___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String complex___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String complex___getnewargs___doc = - ""; - - public final static String complex___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String complex___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String complex___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String complex___int___doc = - "x.__int__() <==> int(x)"; - - public final static String complex___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String complex___long___doc = - "x.__long__() <==> long(x)"; - - public final static String complex___lt___doc = - "x.__lt__(y) <==> x x%y"; - - public final static String complex___mul___doc = - "x.__mul__(y) <==> x*y"; - - public final static String complex___ne___doc = - "x.__ne__(y) <==> x!=y"; - - public final static String complex___neg___doc = - "x.__neg__() <==> -x"; - - public final static String complex___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String complex___nonzero___doc = - "x.__nonzero__() <==> x != 0"; - - public final static String complex___pos___doc = - "x.__pos__() <==> +x"; - - public final static String complex___pow___doc = - "x.__pow__(y[, z]) <==> pow(x, y[, z])"; - - public final static String complex___radd___doc = - "x.__radd__(y) <==> y+x"; - - public final static String complex___rdiv___doc = - "x.__rdiv__(y) <==> y/x"; - - public final static String complex___rdivmod___doc = - "x.__rdivmod__(y) <==> divmod(y, x)"; - - public final static String complex___reduce___doc = - "helper for pickle"; - - public final static String complex___reduce_ex___doc = - "helper for pickle"; - - public final static String complex___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String complex___rfloordiv___doc = - "x.__rfloordiv__(y) <==> y//x"; - - public final static String complex___rmod___doc = - "x.__rmod__(y) <==> y%x"; - - public final static String complex___rmul___doc = - "x.__rmul__(y) <==> y*x"; - - public final static String complex___rpow___doc = - "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; - - public final static String complex___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String complex___rtruediv___doc = - "x.__rtruediv__(y) <==> y/x"; - - public final static String complex___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String complex___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String complex___str___doc = - "x.__str__() <==> str(x)"; - - public final static String complex___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String complex___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String complex___truediv___doc = - "x.__truediv__(y) <==> x/y"; - - public final static String complex_conjugate_doc = - "complex.conjugate() -> complex\n" + - "\n" + - "Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."; - - public final static String complex_imag_doc = - "the imaginary part of a complex number"; - - public final static String complex_real_doc = - "the real part of a complex number"; - - // Docs for - public final static String bool___abs___doc = - "x.__abs__() <==> abs(x)"; - - public final static String bool___add___doc = - "x.__add__(y) <==> x+y"; - - public final static String bool___and___doc = - "x.__and__(y) <==> x&y"; - - public final static String bool___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String bool___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String bool___coerce___doc = - "x.__coerce__(y) <==> coerce(x, y)"; - - public final static String bool___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String bool___div___doc = - "x.__div__(y) <==> x/y"; - - public final static String bool___divmod___doc = - "x.__divmod__(y) <==> divmod(x, y)"; - - public final static String bool_doc = - "bool(x) -> bool\n" + - "\n" + - "Returns True when the argument x is true, False otherwise.\n" + - "The builtins True and False are the only two instances of the class bool.\n" + - "The class bool is a subclass of the class int, and cannot be subclassed."; - - public final static String bool___float___doc = - "x.__float__() <==> float(x)"; - - public final static String bool___floordiv___doc = - "x.__floordiv__(y) <==> x//y"; - - public final static String bool___format___doc = - ""; - - public final static String bool___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String bool___getnewargs___doc = - ""; - - public final static String bool___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String bool___hex___doc = - "x.__hex__() <==> hex(x)"; - - public final static String bool___index___doc = - "x[y:z] <==> x[y.__index__():z.__index__()]"; - - public final static String bool___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String bool___int___doc = - "x.__int__() <==> int(x)"; - - public final static String bool___invert___doc = - "x.__invert__() <==> ~x"; - - public final static String bool___long___doc = - "x.__long__() <==> long(x)"; - - public final static String bool___lshift___doc = - "x.__lshift__(y) <==> x< x%y"; - - public final static String bool___mul___doc = - "x.__mul__(y) <==> x*y"; - - public final static String bool___neg___doc = - "x.__neg__() <==> -x"; - - public final static String bool___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String bool___nonzero___doc = - "x.__nonzero__() <==> x != 0"; - - public final static String bool___oct___doc = - "x.__oct__() <==> oct(x)"; - - public final static String bool___or___doc = - "x.__or__(y) <==> x|y"; - - public final static String bool___pos___doc = - "x.__pos__() <==> +x"; - - public final static String bool___pow___doc = - "x.__pow__(y[, z]) <==> pow(x, y[, z])"; - - public final static String bool___radd___doc = - "x.__radd__(y) <==> y+x"; - - public final static String bool___rand___doc = - "x.__rand__(y) <==> y&x"; - - public final static String bool___rdiv___doc = - "x.__rdiv__(y) <==> y/x"; - - public final static String bool___rdivmod___doc = - "x.__rdivmod__(y) <==> divmod(y, x)"; - - public final static String bool___reduce___doc = - "helper for pickle"; - - public final static String bool___reduce_ex___doc = - "helper for pickle"; - - public final static String bool___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String bool___rfloordiv___doc = - "x.__rfloordiv__(y) <==> y//x"; - - public final static String bool___rlshift___doc = - "x.__rlshift__(y) <==> y< y%x"; - - public final static String bool___rmul___doc = - "x.__rmul__(y) <==> y*x"; - - public final static String bool___ror___doc = - "x.__ror__(y) <==> y|x"; - - public final static String bool___rpow___doc = - "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; - - public final static String bool___rrshift___doc = - "x.__rrshift__(y) <==> y>>x"; - - public final static String bool___rshift___doc = - "x.__rshift__(y) <==> x>>y"; - - public final static String bool___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String bool___rtruediv___doc = - "x.__rtruediv__(y) <==> y/x"; - - public final static String bool___rxor___doc = - "x.__rxor__(y) <==> y^x"; - - public final static String bool___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String bool___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String bool___str___doc = - "x.__str__() <==> str(x)"; - - public final static String bool___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String bool___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String bool___truediv___doc = - "x.__truediv__(y) <==> x/y"; - - public final static String bool___trunc___doc = - "Truncating an Integral returns itself."; - - public final static String bool___xor___doc = - "x.__xor__(y) <==> x^y"; - - public final static String bool_conjugate_doc = - "Returns self, the complex conjugate of any int."; - - public final static String bool_denominator_doc = - "the denominator of a rational number in lowest terms"; - - public final static String bool_imag_doc = - "the imaginary part of a complex number"; - - public final static String bool_numerator_doc = - "the numerator of a rational number in lowest terms"; - - public final static String bool_real_doc = - "the real part of a complex number"; - - // Docs for - public final static String classmethod___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String classmethod___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String classmethod_doc = - "classmethod(function) -> method\n" + - "\n" + - "Convert a function to be a class method.\n" + - "\n" + - "A class method receives the class as implicit first argument,\n" + - "just like an instance method receives the instance.\n" + - "To declare a class method, use this idiom:\n" + - "\n" + - " class C:\n" + - " def f(cls, arg1, arg2, ...): ...\n" + - " f = classmethod(f)\n" + - "\n" + - "It can be called either on the class (e.g. C.f()) or on an instance\n" + - "(e.g. C().f()). The instance is ignored except for its class.\n" + - "If a class method is called for a derived class, the derived class\n" + - "object is passed as the implied first argument.\n" + - "\n" + - "Class methods are different than C++ or Java static methods.\n" + - "If you want those, see the staticmethod builtin."; - - public final static String classmethod___format___doc = - "default object formatter"; - - public final static String classmethod___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String classmethod___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String classmethod___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String classmethod___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String classmethod___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String classmethod___reduce___doc = - "helper for pickle"; - - public final static String classmethod___reduce_ex___doc = - "helper for pickle"; - - public final static String classmethod___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String classmethod___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String classmethod___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String classmethod___str___doc = - "x.__str__() <==> str(x)"; - - public final static String classmethod___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - // Docs for - public final static String set___and___doc = - "x.__and__(y) <==> x&y"; - - public final static String set___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String set___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String set___contains___doc = - "x.__contains__(y) <==> y in x."; - - public final static String set___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String set_doc = - "set(iterable) --> set object\n" + - "\n" + - "Build an unordered collection of unique elements."; - - public final static String set___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String set___format___doc = - "default object formatter"; - - public final static String set___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String set___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String set___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String set___hash___doc = - ""; - - public final static String set___iand___doc = - "x.__iand__(y) <==> x&y"; - - public final static String set___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String set___ior___doc = - "x.__ior__(y) <==> x|y"; - - public final static String set___isub___doc = - "x.__isub__(y) <==> x-y"; - - public final static String set___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String set___ixor___doc = - "x.__ixor__(y) <==> x^y"; - - public final static String set___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String set___len___doc = - "x.__len__() <==> len(x)"; - - public final static String set___lt___doc = - "x.__lt__(y) <==> x x!=y"; - - public final static String set___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String set___or___doc = - "x.__or__(y) <==> x|y"; - - public final static String set___rand___doc = - "x.__rand__(y) <==> y&x"; - - public final static String set___reduce___doc = - "Return state information for pickling."; - - public final static String set___reduce_ex___doc = - "helper for pickle"; - - public final static String set___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String set___ror___doc = - "x.__ror__(y) <==> y|x"; - - public final static String set___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String set___rxor___doc = - "x.__rxor__(y) <==> y^x"; - - public final static String set___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String set___sizeof___doc = - "S.__sizeof__() -> size of S in memory, in bytes"; - - public final static String set___str___doc = - "x.__str__() <==> str(x)"; - - public final static String set___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String set___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String set___xor___doc = - "x.__xor__(y) <==> x^y"; - - public final static String set_add_doc = - "Add an element to a set.\n" + - "\n" + - "This has no effect if the element is already present."; - - public final static String set_clear_doc = - "Remove all elements from this set."; - - public final static String set_copy_doc = - "Return a shallow copy of a set."; - - public final static String set_difference_doc = - "Return the difference of two or more sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in this set but not the others.)"; - - public final static String set_difference_update_doc = - "Remove all elements of another set from this set."; - - public final static String set_discard_doc = - "Remove an element from a set if it is a member.\n" + - "\n" + - "If the element is not a member, do nothing."; - - public final static String set_intersection_doc = - "Return the intersection of two sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in both sets.)"; - - public final static String set_intersection_update_doc = - "Update a set with the intersection of itself and another."; - - public final static String set_isdisjoint_doc = - "Return True if two sets have a null intersection."; - - public final static String set_issubset_doc = - "Report whether another set contains this set."; - - public final static String set_issuperset_doc = - "Report whether this set contains another set."; - - public final static String set_pop_doc = - "Remove and return an arbitrary set element.\n" + - "Raises KeyError if the set is empty."; - - public final static String set_remove_doc = - "Remove an element from a set; it must be a member.\n" + - "\n" + - "If the element is not a member, raise a KeyError."; - - public final static String set_symmetric_difference_doc = - "Return the symmetric difference of two sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in exactly one of the sets.)"; - - public final static String set_symmetric_difference_update_doc = - "Update a set with the symmetric difference of itself and another."; - - public final static String set_union_doc = - "Return the union of sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in either set.)"; - - public final static String set_update_doc = - "Update a set with the union of itself and others."; - - // Docs for - public final static String frozenset___and___doc = - "x.__and__(y) <==> x&y"; - - public final static String frozenset___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String frozenset___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String frozenset___contains___doc = - "x.__contains__(y) <==> y in x."; - - public final static String frozenset___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String frozenset_doc = - "frozenset(iterable) --> frozenset object\n" + - "\n" + - "Build an immutable unordered collection of unique elements."; - - public final static String frozenset___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String frozenset___format___doc = - "default object formatter"; - - public final static String frozenset___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String frozenset___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String frozenset___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String frozenset___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String frozenset___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String frozenset___iter___doc = - "x.__iter__() <==> iter(x)"; - - public final static String frozenset___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String frozenset___len___doc = - "x.__len__() <==> len(x)"; - - public final static String frozenset___lt___doc = - "x.__lt__(y) <==> x x!=y"; - - public final static String frozenset___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String frozenset___or___doc = - "x.__or__(y) <==> x|y"; - - public final static String frozenset___rand___doc = - "x.__rand__(y) <==> y&x"; - - public final static String frozenset___reduce___doc = - "Return state information for pickling."; - - public final static String frozenset___reduce_ex___doc = - "helper for pickle"; - - public final static String frozenset___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String frozenset___ror___doc = - "x.__ror__(y) <==> y|x"; - - public final static String frozenset___rsub___doc = - "x.__rsub__(y) <==> y-x"; - - public final static String frozenset___rxor___doc = - "x.__rxor__(y) <==> y^x"; - - public final static String frozenset___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String frozenset___sizeof___doc = - "S.__sizeof__() -> size of S in memory, in bytes"; - - public final static String frozenset___str___doc = - "x.__str__() <==> str(x)"; - - public final static String frozenset___sub___doc = - "x.__sub__(y) <==> x-y"; - - public final static String frozenset___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String frozenset___xor___doc = - "x.__xor__(y) <==> x^y"; - - public final static String frozenset_copy_doc = - "Return a shallow copy of a set."; - - public final static String frozenset_difference_doc = - "Return the difference of two or more sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in this set but not the others.)"; - - public final static String frozenset_intersection_doc = - "Return the intersection of two sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in both sets.)"; - - public final static String frozenset_isdisjoint_doc = - "Return True if two sets have a null intersection."; - - public final static String frozenset_issubset_doc = - "Report whether another set contains this set."; - - public final static String frozenset_issuperset_doc = - "Report whether this set contains another set."; - - public final static String frozenset_symmetric_difference_doc = - "Return the symmetric difference of two sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in exactly one of the sets.)"; - - public final static String frozenset_union_doc = - "Return the union of sets as a new set.\n" + - "\n" + - "(i.e. all elements that are in either set.)"; - - // Docs for - public final static String BaseException___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String BaseException___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String BaseException___dict___doc = - ""; - - public final static String BaseException_doc = - "Common base class for all exceptions"; - - public final static String BaseException___format___doc = - "default object formatter"; - - public final static String BaseException___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String BaseException___getitem___doc = - "x.__getitem__(y) <==> x[y]"; - - public final static String BaseException___getslice___doc = - "x.__getslice__(i, j) <==> x[i:j]\n" + - " \n" + - " Use of negative indices is not supported."; - - public final static String BaseException___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String BaseException___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String BaseException___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String BaseException___reduce___doc = - ""; - - public final static String BaseException___reduce_ex___doc = - "helper for pickle"; - - public final static String BaseException___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String BaseException___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String BaseException___setstate___doc = - ""; - - public final static String BaseException___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String BaseException___str___doc = - "x.__str__() <==> str(x)"; - - public final static String BaseException___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String BaseException___unicode___doc = - ""; - - public final static String BaseException_args_doc = - ""; - - public final static String BaseException_message_doc = - ""; - - // Docs for - public final static String function___call___doc = - "x.__call__(...) <==> x(...)"; - - public final static String function___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String function___closure___doc = - ""; - - public final static String function___code___doc = - ""; - - public final static String function___defaults___doc = - ""; - - public final static String function___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String function___dict___doc = - ""; - - public final static String function_doc = - "function(code, globals[, name[, argdefs[, closure]]])\n" + - "\n" + - "Create a function object from a code object and a dictionary.\n" + - "The optional name string overrides the name from the code object.\n" + - "The optional argdefs tuple specifies the default argument values.\n" + - "The optional closure tuple supplies the bindings for free variables."; - - public final static String function___format___doc = - "default object formatter"; - - public final static String function___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String function___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String function___globals___doc = - ""; - - public final static String function___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String function___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String function___module___doc = - "str(object) -> string\n" + - "\n" + - "Return a nice string representation of the object.\n" + - "If the argument is a string, the return value is the same object."; - - public final static String function___name___doc = - "str(object) -> string\n" + - "\n" + - "Return a nice string representation of the object.\n" + - "If the argument is a string, the return value is the same object."; - - public final static String function___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String function___reduce___doc = - "helper for pickle"; - - public final static String function___reduce_ex___doc = - "helper for pickle"; - - public final static String function___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String function___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String function___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String function___str___doc = - "x.__str__() <==> str(x)"; - - public final static String function___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String function_func_closure_doc = - ""; - - public final static String function_func_code_doc = - ""; - - public final static String function_func_defaults_doc = - ""; - - public final static String function_func_dict_doc = - ""; - - public final static String function_func_doc_doc = - ""; - - public final static String function_func_globals_doc = - ""; - - public final static String function_func_name_doc = - ""; - - // Docs for - public final static String instancemethod___call___doc = - "x.__call__(...) <==> x(...)"; - - public final static String instancemethod___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String instancemethod___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String instancemethod___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String instancemethod_doc = - "instancemethod(function, instance, class)\n" + - "\n" + - "Create an instance method object."; - - public final static String instancemethod___format___doc = - "default object formatter"; - - public final static String instancemethod___func___doc = - "the function (or other callable) implementing a method"; - - public final static String instancemethod___get___doc = - "descr.__get__(obj[, type]) -> value"; - - public final static String instancemethod___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String instancemethod___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String instancemethod___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String instancemethod___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String instancemethod___reduce___doc = - "helper for pickle"; - - public final static String instancemethod___reduce_ex___doc = - "helper for pickle"; - - public final static String instancemethod___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String instancemethod___self___doc = - "the instance to which a method is bound; None for unbound methods"; - - public final static String instancemethod___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String instancemethod___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String instancemethod___str___doc = - "x.__str__() <==> str(x)"; - - public final static String instancemethod___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String instancemethod_im_class_doc = - "the class associated with a method"; - - public final static String instancemethod_im_func_doc = - "the function (or other callable) implementing a method"; - - public final static String instancemethod_im_self_doc = - "the instance to which a method is bound; None for unbound methods"; - - // Docs for - public final static String code___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String code___cmp___doc = - "x.__cmp__(y) <==> cmp(x,y)"; - - public final static String code___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String code_doc = - "code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n" + - " varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n" + - "\n" + - "Create a code object. Not for the faint of heart."; - - public final static String code___eq___doc = - "x.__eq__(y) <==> x==y"; - - public final static String code___format___doc = - "default object formatter"; - - public final static String code___ge___doc = - "x.__ge__(y) <==> x>=y"; - - public final static String code___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String code___gt___doc = - "x.__gt__(y) <==> x>y"; - - public final static String code___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String code___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String code___le___doc = - "x.__le__(y) <==> x<=y"; - - public final static String code___lt___doc = - "x.__lt__(y) <==> x x!=y"; - - public final static String code___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String code___reduce___doc = - "helper for pickle"; - - public final static String code___reduce_ex___doc = - "helper for pickle"; - - public final static String code___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String code___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String code___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String code___str___doc = - "x.__str__() <==> str(x)"; - - public final static String code___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String code_co_argcount_doc = - ""; - - public final static String code_co_cellvars_doc = - ""; - - public final static String code_co_code_doc = - ""; - - public final static String code_co_consts_doc = - ""; - - public final static String code_co_filename_doc = - ""; - - public final static String code_co_firstlineno_doc = - ""; - - public final static String code_co_flags_doc = - ""; - - public final static String code_co_freevars_doc = - ""; - - public final static String code_co_lnotab_doc = - ""; - - public final static String code_co_name_doc = - ""; - - public final static String code_co_names_doc = - ""; - - public final static String code_co_nlocals_doc = - ""; - - public final static String code_co_stacksize_doc = - ""; - - public final static String code_co_varnames_doc = - ""; - - // Docs for - public final static String frame___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String frame___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String frame_doc = - ""; - - public final static String frame___format___doc = - "default object formatter"; - - public final static String frame___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String frame___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String frame___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String frame___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String frame___reduce___doc = - "helper for pickle"; - - public final static String frame___reduce_ex___doc = - "helper for pickle"; - - public final static String frame___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String frame___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String frame___sizeof___doc = - "F.__sizeof__() -> size of F in memory, in bytes"; - - public final static String frame___str___doc = - "x.__str__() <==> str(x)"; - - public final static String frame___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String frame_f_back_doc = - ""; - - public final static String frame_f_builtins_doc = - ""; - - public final static String frame_f_code_doc = - ""; - - public final static String frame_f_exc_traceback_doc = - ""; - - public final static String frame_f_exc_type_doc = - ""; - - public final static String frame_f_exc_value_doc = - ""; - - public final static String frame_f_globals_doc = - ""; - - public final static String frame_f_lasti_doc = - ""; - - public final static String frame_f_lineno_doc = - ""; - - public final static String frame_f_locals_doc = - ""; - - public final static String frame_f_restricted_doc = - ""; - - public final static String frame_f_trace_doc = - ""; - - // Docs for - public final static String traceback___class___doc = - "type(object) -> the object's type\n" + - "type(name, bases, dict) -> a new type"; - - public final static String traceback___delattr___doc = - "x.__delattr__('name') <==> del x.name"; - - public final static String traceback_doc = - ""; - - public final static String traceback___format___doc = - "default object formatter"; - - public final static String traceback___getattribute___doc = - "x.__getattribute__('name') <==> x.name"; - - public final static String traceback___hash___doc = - "x.__hash__() <==> hash(x)"; - - public final static String traceback___init___doc = - "x.__init__(...) initializes x; see x.__class__.__doc__ for signature"; - - public final static String traceback___new___doc = - "T.__new__(S, ...) -> a new object with type S, a subtype of T"; - - public final static String traceback___reduce___doc = - "helper for pickle"; - - public final static String traceback___reduce_ex___doc = - "helper for pickle"; - - public final static String traceback___repr___doc = - "x.__repr__() <==> repr(x)"; - - public final static String traceback___setattr___doc = - "x.__setattr__('name', value) <==> x.name = value"; - - public final static String traceback___sizeof___doc = - "__sizeof__() -> size of object in memory, in bytes"; - - public final static String traceback___str___doc = - "x.__str__() <==> str(x)"; - - public final static String traceback___subclasshook___doc = - "Abstract classes can override this to customize issubclass().\n" + - "\n" + - "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + - "It should return True, False or NotImplemented. If it returns\n" + - "NotImplemented, the normal algorithm is used. Otherwise, it\n" + - "overrides the normal algorithm (and the outcome is cached).\n" + - ""; - - public final static String traceback_tb_frame_doc = - ""; - - public final static String traceback_tb_lasti_doc = - ""; - - public final static String traceback_tb_lineno_doc = - ""; - - public final static String traceback_tb_next_doc = - ""; - -} +// generated by make_pydocs.py + +package org.python.core; + +public class BuiltinDocs { + + // Docs for + public final static String object___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String object___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String object_doc = + "The most base type"; + + public final static String object___format___doc = + "default object formatter"; + + public final static String object___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String object___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String object___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String object___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String object___reduce___doc = + "helper for pickle"; + + public final static String object___reduce_ex___doc = + "helper for pickle"; + + public final static String object___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String object___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String object___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String object___str___doc = + "x.__str__() <==> str(x)"; + + public final static String object___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + // Docs for + public final static String type___abstractmethods___doc = + ""; + + public final static String type___base___doc = + "The most base type"; + + public final static String type___bases___doc = + "tuple() -> empty tuple\n" + + "tuple(iterable) -> tuple initialized from iterable's items\n" + + "\n" + + "If the argument is a tuple, the return value is the same object."; + + public final static String type___basicsize___doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String type___call___doc = + "x.__call__(...) <==> x(...)"; + + public final static String type___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String type___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String type___dict___doc = + ""; + + public final static String type___dictoffset___doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String type_doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String type___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String type___flags___doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String type___format___doc = + "default object formatter"; + + public final static String type___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String type___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String type___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String type___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String type___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String type___instancecheck___doc = + "__instancecheck__() -> bool\n" + + "check if an object is an instance"; + + public final static String type___itemsize___doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String type___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String type___lt___doc = + "x.__lt__(y) <==> x string\n" + + "\n" + + "Return a nice string representation of the object.\n" + + "If the argument is a string, the return value is the same object."; + + public final static String type___mro___doc = + "tuple() -> empty tuple\n" + + "tuple(iterable) -> tuple initialized from iterable's items\n" + + "\n" + + "If the argument is a tuple, the return value is the same object."; + + public final static String type___name___doc = + "str(object) -> string\n" + + "\n" + + "Return a nice string representation of the object.\n" + + "If the argument is a string, the return value is the same object."; + + public final static String type___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String type___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String type___reduce___doc = + "helper for pickle"; + + public final static String type___reduce_ex___doc = + "helper for pickle"; + + public final static String type___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String type___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String type___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String type___str___doc = + "x.__str__() <==> str(x)"; + + public final static String type___subclasscheck___doc = + "__subclasscheck__() -> bool\n" + + "check if a class is a subclass"; + + public final static String type___subclasses___doc = + "__subclasses__() -> list of immediate subclasses"; + + public final static String type___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String type___weakrefoffset___doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String type_mro_doc = + "mro() -> list\n" + + "return a type's method resolution order"; + + // Docs for + public final static String unicode___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String unicode___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String unicode___contains___doc = + "x.__contains__(y) <==> y in x"; + + public final static String unicode___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String unicode_doc = + "unicode(string [, encoding[, errors]]) -> object\n" + + "\n" + + "Create a new Unicode object from the given encoded string.\n" + + "encoding defaults to the current default string encoding.\n" + + "errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'."; + + public final static String unicode___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String unicode___format___doc = + "S.__format__(format_spec) -> unicode\n" + + "\n" + + "Return a formatted version of S as described by format_spec."; + + public final static String unicode___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String unicode___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String unicode___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String unicode___getnewargs___doc = + ""; + + public final static String unicode___getslice___doc = + "x.__getslice__(i, j) <==> x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String unicode___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String unicode___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String unicode___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String unicode___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String unicode___len___doc = + "x.__len__() <==> len(x)"; + + public final static String unicode___lt___doc = + "x.__lt__(y) <==> x x%y"; + + public final static String unicode___mul___doc = + "x.__mul__(n) <==> x*n"; + + public final static String unicode___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String unicode___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String unicode___reduce___doc = + "helper for pickle"; + + public final static String unicode___reduce_ex___doc = + "helper for pickle"; + + public final static String unicode___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String unicode___rmod___doc = + "x.__rmod__(y) <==> y%x"; + + public final static String unicode___rmul___doc = + "x.__rmul__(n) <==> n*x"; + + public final static String unicode___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String unicode___sizeof___doc = + "S.__sizeof__() -> size of S in memory, in bytes\n" + + "\n" + + ""; + + public final static String unicode___str___doc = + "x.__str__() <==> str(x)"; + + public final static String unicode___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String unicode__formatter_field_name_split_doc = + ""; + + public final static String unicode__formatter_parser_doc = + ""; + + public final static String unicode_capitalize_doc = + "S.capitalize() -> unicode\n" + + "\n" + + "Return a capitalized version of S, i.e. make the first character\n" + + "have upper case and the rest lower case."; + + public final static String unicode_center_doc = + "S.center(width[, fillchar]) -> unicode\n" + + "\n" + + "Return S centered in a Unicode string of length width. Padding is\n" + + "done using the specified fill character (default is a space)"; + + public final static String unicode_count_doc = + "S.count(sub[, start[, end]]) -> int\n" + + "\n" + + "Return the number of non-overlapping occurrences of substring sub in\n" + + "Unicode string S[start:end]. Optional arguments start and end are\n" + + "interpreted as in slice notation."; + + public final static String unicode_decode_doc = + "S.decode([encoding[,errors]]) -> string or unicode\n" + + "\n" + + "Decodes S using the codec registered for encoding. encoding defaults\n" + + "to the default encoding. errors may be given to set a different error\n" + + "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + + "a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n" + + "as well as any other name registerd with codecs.register_error that is\n" + + "able to handle UnicodeDecodeErrors."; + + public final static String unicode_encode_doc = + "S.encode([encoding[,errors]]) -> string or unicode\n" + + "\n" + + "Encodes S using the codec registered for encoding. encoding defaults\n" + + "to the default encoding. errors may be given to set a different error\n" + + "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + + "a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n" + + "'xmlcharrefreplace' as well as any other name registered with\n" + + "codecs.register_error that can handle UnicodeEncodeErrors."; + + public final static String unicode_endswith_doc = + "S.endswith(suffix[, start[, end]]) -> bool\n" + + "\n" + + "Return True if S ends with the specified suffix, False otherwise.\n" + + "With optional start, test S beginning at that position.\n" + + "With optional end, stop comparing S at that position.\n" + + "suffix can also be a tuple of strings to try."; + + public final static String unicode_expandtabs_doc = + "S.expandtabs([tabsize]) -> unicode\n" + + "\n" + + "Return a copy of S where all tab characters are expanded using spaces.\n" + + "If tabsize is not given, a tab size of 8 characters is assumed."; + + public final static String unicode_find_doc = + "S.find(sub [,start [,end]]) -> int\n" + + "\n" + + "Return the lowest index in S where substring sub is found,\n" + + "such that sub is contained within s[start:end]. Optional\n" + + "arguments start and end are interpreted as in slice notation.\n" + + "\n" + + "Return -1 on failure."; + + public final static String unicode_format_doc = + "S.format(*args, **kwargs) -> unicode\n" + + "\n" + + "Return a formatted version of S, using substitutions from args and kwargs.\n" + + "The substitutions are identified by braces ('{' and '}')."; + + public final static String unicode_index_doc = + "S.index(sub [,start [,end]]) -> int\n" + + "\n" + + "Like S.find() but raise ValueError when the substring is not found."; + + public final static String unicode_isalnum_doc = + "S.isalnum() -> bool\n" + + "\n" + + "Return True if all characters in S are alphanumeric\n" + + "and there is at least one character in S, False otherwise."; + + public final static String unicode_isalpha_doc = + "S.isalpha() -> bool\n" + + "\n" + + "Return True if all characters in S are alphabetic\n" + + "and there is at least one character in S, False otherwise."; + + public final static String unicode_isdecimal_doc = + "S.isdecimal() -> bool\n" + + "\n" + + "Return True if there are only decimal characters in S,\n" + + "False otherwise."; + + public final static String unicode_isdigit_doc = + "S.isdigit() -> bool\n" + + "\n" + + "Return True if all characters in S are digits\n" + + "and there is at least one character in S, False otherwise."; + + public final static String unicode_islower_doc = + "S.islower() -> bool\n" + + "\n" + + "Return True if all cased characters in S are lowercase and there is\n" + + "at least one cased character in S, False otherwise."; + + public final static String unicode_isnumeric_doc = + "S.isnumeric() -> bool\n" + + "\n" + + "Return True if there are only numeric characters in S,\n" + + "False otherwise."; + + public final static String unicode_isspace_doc = + "S.isspace() -> bool\n" + + "\n" + + "Return True if all characters in S are whitespace\n" + + "and there is at least one character in S, False otherwise."; + + public final static String unicode_istitle_doc = + "S.istitle() -> bool\n" + + "\n" + + "Return True if S is a titlecased string and there is at least one\n" + + "character in S, i.e. upper- and titlecase characters may only\n" + + "follow uncased characters and lowercase characters only cased ones.\n" + + "Return False otherwise."; + + public final static String unicode_isupper_doc = + "S.isupper() -> bool\n" + + "\n" + + "Return True if all cased characters in S are uppercase and there is\n" + + "at least one cased character in S, False otherwise."; + + public final static String unicode_join_doc = + "S.join(iterable) -> unicode\n" + + "\n" + + "Return a string which is the concatenation of the strings in the\n" + + "iterable. The separator between elements is S."; + + public final static String unicode_ljust_doc = + "S.ljust(width[, fillchar]) -> int\n" + + "\n" + + "Return S left-justified in a Unicode string of length width. Padding is\n" + + "done using the specified fill character (default is a space)."; + + public final static String unicode_lower_doc = + "S.lower() -> unicode\n" + + "\n" + + "Return a copy of the string S converted to lowercase."; + + public final static String unicode_lstrip_doc = + "S.lstrip([chars]) -> unicode\n" + + "\n" + + "Return a copy of the string S with leading whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is a str, it will be converted to unicode before stripping"; + + public final static String unicode_partition_doc = + "S.partition(sep) -> (head, sep, tail)\n" + + "\n" + + "Search for the separator sep in S, and return the part before it,\n" + + "the separator itself, and the part after it. If the separator is not\n" + + "found, return S and two empty strings."; + + public final static String unicode_replace_doc = + "S.replace(old, new[, count]) -> unicode\n" + + "\n" + + "Return a copy of S with all occurrences of substring\n" + + "old replaced by new. If the optional argument count is\n" + + "given, only the first count occurrences are replaced."; + + public final static String unicode_rfind_doc = + "S.rfind(sub [,start [,end]]) -> int\n" + + "\n" + + "Return the highest index in S where substring sub is found,\n" + + "such that sub is contained within s[start:end]. Optional\n" + + "arguments start and end are interpreted as in slice notation.\n" + + "\n" + + "Return -1 on failure."; + + public final static String unicode_rindex_doc = + "S.rindex(sub [,start [,end]]) -> int\n" + + "\n" + + "Like S.rfind() but raise ValueError when the substring is not found."; + + public final static String unicode_rjust_doc = + "S.rjust(width[, fillchar]) -> unicode\n" + + "\n" + + "Return S right-justified in a Unicode string of length width. Padding is\n" + + "done using the specified fill character (default is a space)."; + + public final static String unicode_rpartition_doc = + "S.rpartition(sep) -> (head, sep, tail)\n" + + "\n" + + "Search for the separator sep in S, starting at the end of S, and return\n" + + "the part before it, the separator itself, and the part after it. If the\n" + + "separator is not found, return two empty strings and S."; + + public final static String unicode_rsplit_doc = + "S.rsplit([sep [,maxsplit]]) -> list of strings\n" + + "\n" + + "Return a list of the words in S, using sep as the\n" + + "delimiter string, starting at the end of the string and\n" + + "working to the front. If maxsplit is given, at most maxsplit\n" + + "splits are done. If sep is not specified, any whitespace string\n" + + "is a separator."; + + public final static String unicode_rstrip_doc = + "S.rstrip([chars]) -> unicode\n" + + "\n" + + "Return a copy of the string S with trailing whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is a str, it will be converted to unicode before stripping"; + + public final static String unicode_split_doc = + "S.split([sep [,maxsplit]]) -> list of strings\n" + + "\n" + + "Return a list of the words in S, using sep as the\n" + + "delimiter string. If maxsplit is given, at most maxsplit\n" + + "splits are done. If sep is not specified or is None, any\n" + + "whitespace string is a separator and empty strings are\n" + + "removed from the result."; + + public final static String unicode_splitlines_doc = + "S.splitlines([keepends]) -> list of strings\n" + + "\n" + + "Return a list of the lines in S, breaking at line boundaries.\n" + + "Line breaks are not included in the resulting list unless keepends\n" + + "is given and true."; + + public final static String unicode_startswith_doc = + "S.startswith(prefix[, start[, end]]) -> bool\n" + + "\n" + + "Return True if S starts with the specified prefix, False otherwise.\n" + + "With optional start, test S beginning at that position.\n" + + "With optional end, stop comparing S at that position.\n" + + "prefix can also be a tuple of strings to try."; + + public final static String unicode_strip_doc = + "S.strip([chars]) -> unicode\n" + + "\n" + + "Return a copy of the string S with leading and trailing\n" + + "whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is a str, it will be converted to unicode before stripping"; + + public final static String unicode_swapcase_doc = + "S.swapcase() -> unicode\n" + + "\n" + + "Return a copy of S with uppercase characters converted to lowercase\n" + + "and vice versa."; + + public final static String unicode_title_doc = + "S.title() -> unicode\n" + + "\n" + + "Return a titlecased version of S, i.e. words start with title case\n" + + "characters, all remaining cased characters have lower case."; + + public final static String unicode_translate_doc = + "S.translate(table) -> unicode\n" + + "\n" + + "Return a copy of the string S, where all characters have been mapped\n" + + "through the given translation table, which must be a mapping of\n" + + "Unicode ordinals to Unicode ordinals, Unicode strings or None.\n" + + "Unmapped characters are left untouched. Characters mapped to None\n" + + "are deleted."; + + public final static String unicode_upper_doc = + "S.upper() -> unicode\n" + + "\n" + + "Return a copy of S converted to uppercase."; + + public final static String unicode_zfill_doc = + "S.zfill(width) -> unicode\n" + + "\n" + + "Pad a numeric string S with zeros on the left, to fill a field\n" + + "of the specified width. The string S is never truncated."; + + // Docs for + public final static String dict___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String dict___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String dict___contains___doc = + "D.__contains__(k) -> True if D has a key k, else False"; + + public final static String dict___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String dict___delitem___doc = + "x.__delitem__(y) <==> del x[y]"; + + public final static String dict_doc = + "dict() -> new empty dictionary\n" + + "dict(mapping) -> new dictionary initialized from a mapping object's\n" + + " (key, value) pairs\n" + + "dict(iterable) -> new dictionary initialized as if via:\n" + + " d = {}\n" + + " for k, v in iterable:\n" + + " d[k] = v\n" + + "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n" + + " in the keyword argument list. For example: dict(one=1, two=2)"; + + public final static String dict___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String dict___format___doc = + "default object formatter"; + + public final static String dict___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String dict___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String dict___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String dict___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String dict___hash___doc = + ""; + + public final static String dict___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String dict___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String dict___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String dict___len___doc = + "x.__len__() <==> len(x)"; + + public final static String dict___lt___doc = + "x.__lt__(y) <==> x x!=y"; + + public final static String dict___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String dict___reduce___doc = + "helper for pickle"; + + public final static String dict___reduce_ex___doc = + "helper for pickle"; + + public final static String dict___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String dict___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String dict___setitem___doc = + "x.__setitem__(i, y) <==> x[i]=y"; + + public final static String dict___sizeof___doc = + "D.__sizeof__() -> size of D in memory, in bytes"; + + public final static String dict___str___doc = + "x.__str__() <==> str(x)"; + + public final static String dict___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String dict_clear_doc = + "D.clear() -> None. Remove all items from D."; + + public final static String dict_copy_doc = + "D.copy() -> a shallow copy of D"; + + public final static String dict_fromkeys_doc = + "dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n" + + "v defaults to None."; + + public final static String dict_get_doc = + "D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."; + + public final static String dict_has_key_doc = + "D.has_key(k) -> True if D has a key k, else False"; + + public final static String dict_items_doc = + "D.items() -> list of D's (key, value) pairs, as 2-tuples"; + + public final static String dict_iteritems_doc = + "D.iteritems() -> an iterator over the (key, value) items of D"; + + public final static String dict_iterkeys_doc = + "D.iterkeys() -> an iterator over the keys of D"; + + public final static String dict_itervalues_doc = + "D.itervalues() -> an iterator over the values of D"; + + public final static String dict_keys_doc = + "D.keys() -> list of D's keys"; + + public final static String dict_pop_doc = + "D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n" + + "If key is not found, d is returned if given, otherwise KeyError is raised"; + + public final static String dict_popitem_doc = + "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n" + + "2-tuple; but raise KeyError if D is empty."; + + public final static String dict_setdefault_doc = + "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D"; + + public final static String dict_update_doc = + "D.update(E, **F) -> None. Update D from dict/iterable E and F.\n" + + "If E has a .keys() method, does: for k in E: D[k] = E[k]\n" + + "If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n" + + "In either case, this is followed by: for k in F: D[k] = F[k]"; + + public final static String dict_values_doc = + "D.values() -> list of D's values"; + + public final static String dict_viewitems_doc = + "D.viewitems() -> a set-like object providing a view on D's items"; + + public final static String dict_viewkeys_doc = + "D.viewkeys() -> a set-like object providing a view on D's keys"; + + public final static String dict_viewvalues_doc = + "D.viewvalues() -> an object providing a view on D's values"; + + // Docs for + public final static String list___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String list___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String list___contains___doc = + "x.__contains__(y) <==> y in x"; + + public final static String list___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String list___delitem___doc = + "x.__delitem__(y) <==> del x[y]"; + + public final static String list___delslice___doc = + "x.__delslice__(i, j) <==> del x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String list_doc = + "list() -> new empty list\n" + + "list(iterable) -> new list initialized from iterable's items"; + + public final static String list___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String list___format___doc = + "default object formatter"; + + public final static String list___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String list___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String list___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String list___getslice___doc = + "x.__getslice__(i, j) <==> x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String list___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String list___hash___doc = + ""; + + public final static String list___iadd___doc = + "x.__iadd__(y) <==> x+=y"; + + public final static String list___imul___doc = + "x.__imul__(y) <==> x*=y"; + + public final static String list___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String list___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String list___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String list___len___doc = + "x.__len__() <==> len(x)"; + + public final static String list___lt___doc = + "x.__lt__(y) <==> x x*n"; + + public final static String list___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String list___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String list___reduce___doc = + "helper for pickle"; + + public final static String list___reduce_ex___doc = + "helper for pickle"; + + public final static String list___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String list___reversed___doc = + "L.__reversed__() -- return a reverse iterator over the list"; + + public final static String list___rmul___doc = + "x.__rmul__(n) <==> n*x"; + + public final static String list___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String list___setitem___doc = + "x.__setitem__(i, y) <==> x[i]=y"; + + public final static String list___setslice___doc = + "x.__setslice__(i, j, y) <==> x[i:j]=y\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String list___sizeof___doc = + "L.__sizeof__() -- size of L in memory, in bytes"; + + public final static String list___str___doc = + "x.__str__() <==> str(x)"; + + public final static String list___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String list_append_doc = + "L.append(object) -- append object to end"; + + public final static String list_count_doc = + "L.count(value) -> integer -- return number of occurrences of value"; + + public final static String list_extend_doc = + "L.extend(iterable) -- extend list by appending elements from the iterable"; + + public final static String list_index_doc = + "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n" + + "Raises ValueError if the value is not present."; + + public final static String list_insert_doc = + "L.insert(index, object) -- insert object before index"; + + public final static String list_pop_doc = + "L.pop([index]) -> item -- remove and return item at index (default last).\n" + + "Raises IndexError if list is empty or index is out of range."; + + public final static String list_remove_doc = + "L.remove(value) -- remove first occurrence of value.\n" + + "Raises ValueError if the value is not present."; + + public final static String list_reverse_doc = + "L.reverse() -- reverse *IN PLACE*"; + + public final static String list_sort_doc = + "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n" + + "cmp(x, y) -> -1, 0, 1"; + + // Docs for + public final static String slice___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String slice___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String slice___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String slice_doc = + "slice([start,] stop[, step])\n" + + "\n" + + "Create a slice object. This is used for extended slicing (e.g. a[0:10:2])."; + + public final static String slice___format___doc = + "default object formatter"; + + public final static String slice___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String slice___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String slice___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String slice___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String slice___reduce___doc = + "Return state information for pickling."; + + public final static String slice___reduce_ex___doc = + "helper for pickle"; + + public final static String slice___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String slice___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String slice___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String slice___str___doc = + "x.__str__() <==> str(x)"; + + public final static String slice___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String slice_indices_doc = + "S.indices(len) -> (start, stop, stride)\n" + + "\n" + + "Assuming a sequence of length len, calculate the start and stop\n" + + "indices, and the stride length of the extended slice described by\n" + + "S. Out of bounds indices are clipped in a manner consistent with the\n" + + "handling of normal slices."; + + public final static String slice_start_doc = + ""; + + public final static String slice_step_doc = + ""; + + public final static String slice_stop_doc = + ""; + + // Docs for + public final static String super___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String super___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String super_doc = + "super(type) -> unbound super object\n" + + "super(type, obj) -> bound super object; requires isinstance(obj, type)\n" + + "super(type, type2) -> bound super object; requires issubclass(type2, type)\n" + + "Typical use to call a cooperative superclass method:\n" + + "class C(B):\n" + + " def meth(self, arg):\n" + + " super(C, self).meth(arg)"; + + public final static String super___format___doc = + "default object formatter"; + + public final static String super___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String super___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String super___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String super___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String super___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String super___reduce___doc = + "helper for pickle"; + + public final static String super___reduce_ex___doc = + "helper for pickle"; + + public final static String super___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String super___self___doc = + "the instance invoking super(); may be None"; + + public final static String super___self_class___doc = + "the type of the instance invoking super(); may be None"; + + public final static String super___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String super___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String super___str___doc = + "x.__str__() <==> str(x)"; + + public final static String super___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String super___thisclass___doc = + "the class invoking super()"; + + // Docs for + public final static String staticmethod___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String staticmethod___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String staticmethod_doc = + "staticmethod(function) -> method\n" + + "\n" + + "Convert a function to be a static method.\n" + + "\n" + + "A static method does not receive an implicit first argument.\n" + + "To declare a static method, use this idiom:\n" + + "\n" + + " class C:\n" + + " def f(arg1, arg2, ...): ...\n" + + " f = staticmethod(f)\n" + + "\n" + + "It can be called either on the class (e.g. C.f()) or on an instance\n" + + "(e.g. C().f()). The instance is ignored except for its class.\n" + + "\n" + + "Static methods in Python are similar to those found in Java or C++.\n" + + "For a more advanced concept, see the classmethod builtin."; + + public final static String staticmethod___format___doc = + "default object formatter"; + + public final static String staticmethod___func___doc = + ""; + + public final static String staticmethod___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String staticmethod___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String staticmethod___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String staticmethod___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String staticmethod___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String staticmethod___reduce___doc = + "helper for pickle"; + + public final static String staticmethod___reduce_ex___doc = + "helper for pickle"; + + public final static String staticmethod___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String staticmethod___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String staticmethod___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String staticmethod___str___doc = + "x.__str__() <==> str(x)"; + + public final static String staticmethod___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + // Docs for + public final static String float___abs___doc = + "x.__abs__() <==> abs(x)"; + + public final static String float___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String float___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String float___coerce___doc = + "x.__coerce__(y) <==> coerce(x, y)"; + + public final static String float___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String float___div___doc = + "x.__div__(y) <==> x/y"; + + public final static String float___divmod___doc = + "x.__divmod__(y) <==> divmod(x, y)"; + + public final static String float_doc = + "float(x) -> floating point number\n" + + "\n" + + "Convert a string or number to a floating point number, if possible."; + + public final static String float___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String float___float___doc = + "x.__float__() <==> float(x)"; + + public final static String float___floordiv___doc = + "x.__floordiv__(y) <==> x//y"; + + public final static String float___format___doc = + "float.__format__(format_spec) -> string\n" + + "\n" + + "Formats the float according to format_spec."; + + public final static String float___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String float___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String float___getformat___doc = + "float.__getformat__(typestr) -> string\n" + + "\n" + + "You probably don't want to use this function. It exists mainly to be\n" + + "used in Python's test suite.\n" + + "\n" + + "typestr must be 'double' or 'float'. This function returns whichever of\n" + + "'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n" + + "format of floating point numbers used by the C type named by typestr."; + + public final static String float___getnewargs___doc = + ""; + + public final static String float___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String float___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String float___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String float___int___doc = + "x.__int__() <==> int(x)"; + + public final static String float___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String float___long___doc = + "x.__long__() <==> long(x)"; + + public final static String float___lt___doc = + "x.__lt__(y) <==> x x%y"; + + public final static String float___mul___doc = + "x.__mul__(y) <==> x*y"; + + public final static String float___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String float___neg___doc = + "x.__neg__() <==> -x"; + + public final static String float___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String float___nonzero___doc = + "x.__nonzero__() <==> x != 0"; + + public final static String float___pos___doc = + "x.__pos__() <==> +x"; + + public final static String float___pow___doc = + "x.__pow__(y[, z]) <==> pow(x, y[, z])"; + + public final static String float___radd___doc = + "x.__radd__(y) <==> y+x"; + + public final static String float___rdiv___doc = + "x.__rdiv__(y) <==> y/x"; + + public final static String float___rdivmod___doc = + "x.__rdivmod__(y) <==> divmod(y, x)"; + + public final static String float___reduce___doc = + "helper for pickle"; + + public final static String float___reduce_ex___doc = + "helper for pickle"; + + public final static String float___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String float___rfloordiv___doc = + "x.__rfloordiv__(y) <==> y//x"; + + public final static String float___rmod___doc = + "x.__rmod__(y) <==> y%x"; + + public final static String float___rmul___doc = + "x.__rmul__(y) <==> y*x"; + + public final static String float___rpow___doc = + "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; + + public final static String float___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String float___rtruediv___doc = + "x.__rtruediv__(y) <==> y/x"; + + public final static String float___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String float___setformat___doc = + "float.__setformat__(typestr, fmt) -> None\n" + + "\n" + + "You probably don't want to use this function. It exists mainly to be\n" + + "used in Python's test suite.\n" + + "\n" + + "typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n" + + "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" + + "one of the latter two if it appears to match the underlying C reality.\n" + + "\n" + + "Overrides the automatic determination of C-level floating point type.\n" + + "This affects how floats are converted to and from binary strings."; + + public final static String float___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String float___str___doc = + "x.__str__() <==> str(x)"; + + public final static String float___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String float___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String float___truediv___doc = + "x.__truediv__(y) <==> x/y"; + + public final static String float___trunc___doc = + "Returns the Integral closest to x between 0 and x."; + + public final static String float_as_integer_ratio_doc = + "float.as_integer_ratio() -> (int, int)\n" + + "\n" + + "Returns a pair of integers, whose ratio is exactly equal to the original\n" + + "float and with a positive denominator.\n" + + "Raises OverflowError on infinities and a ValueError on NaNs.\n" + + "\n" + + ">>> (10.0).as_integer_ratio()\n" + + "(10, 1)\n" + + ">>> (0.0).as_integer_ratio()\n" + + "(0, 1)\n" + + ">>> (-.25).as_integer_ratio()\n" + + "(-1, 4)"; + + public final static String float_conjugate_doc = + "Returns self, the complex conjugate of any float."; + + public final static String float_fromhex_doc = + "float.fromhex(string) -> float\n" + + "\n" + + "Create a floating-point number from a hexadecimal string.\n" + + ">>> float.fromhex('0x1.ffffp10')\n" + + "2047.984375\n" + + ">>> float.fromhex('-0x1p-1074')\n" + + "-4.9406564584124654e-324"; + + public final static String float_hex_doc = + "float.hex() -> string\n" + + "\n" + + "Return a hexadecimal representation of a floating-point number.\n" + + ">>> (-0.1).hex()\n" + + "'-0x1.999999999999ap-4'\n" + + ">>> 3.14159.hex()\n" + + "'0x1.921f9f01b866ep+1'"; + + public final static String float_imag_doc = + "the imaginary part of a complex number"; + + public final static String float_is_integer_doc = + "Returns True if the float is an integer."; + + public final static String float_real_doc = + "the real part of a complex number"; + + // Docs for + public final static String enumerate___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String enumerate___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String enumerate_doc = + "enumerate(iterable[, start]) -> iterator for index, value of iterable\n" + + "\n" + + "Return an enumerate object. iterable must be another object that supports\n" + + "iteration. The enumerate object yields pairs containing a count (from\n" + + "start, which defaults to zero) and a value yielded by the iterable argument.\n" + + "enumerate is useful for obtaining an indexed list:\n" + + " (0, seq[0]), (1, seq[1]), (2, seq[2]), ..."; + + public final static String enumerate___format___doc = + "default object formatter"; + + public final static String enumerate___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String enumerate___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String enumerate___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String enumerate___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String enumerate___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String enumerate___reduce___doc = + "helper for pickle"; + + public final static String enumerate___reduce_ex___doc = + "helper for pickle"; + + public final static String enumerate___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String enumerate___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String enumerate___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String enumerate___str___doc = + "x.__str__() <==> str(x)"; + + public final static String enumerate___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String enumerate_next_doc = + "x.next() -> the next value, or raise StopIteration"; + + // Docs for + public final static String basestring___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String basestring___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String basestring_doc = + "Type basestring cannot be instantiated; it is the base for str and unicode."; + + public final static String basestring___format___doc = + "default object formatter"; + + public final static String basestring___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String basestring___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String basestring___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String basestring___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String basestring___reduce___doc = + "helper for pickle"; + + public final static String basestring___reduce_ex___doc = + "helper for pickle"; + + public final static String basestring___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String basestring___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String basestring___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String basestring___str___doc = + "x.__str__() <==> str(x)"; + + public final static String basestring___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + // Docs for + public final static String long___abs___doc = + "x.__abs__() <==> abs(x)"; + + public final static String long___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String long___and___doc = + "x.__and__(y) <==> x&y"; + + public final static String long___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String long___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String long___coerce___doc = + "x.__coerce__(y) <==> coerce(x, y)"; + + public final static String long___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String long___div___doc = + "x.__div__(y) <==> x/y"; + + public final static String long___divmod___doc = + "x.__divmod__(y) <==> divmod(x, y)"; + + public final static String long_doc = + "long(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to a long integer, if possible. A floating\n" + + "point argument will be truncated towards zero (this does not include a\n" + + "string representation of a floating point number!) When converting a\n" + + "string, use the optional base. It is an error to supply a base when\n" + + "converting a non-string."; + + public final static String long___float___doc = + "x.__float__() <==> float(x)"; + + public final static String long___floordiv___doc = + "x.__floordiv__(y) <==> x//y"; + + public final static String long___format___doc = + ""; + + public final static String long___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String long___getnewargs___doc = + ""; + + public final static String long___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String long___hex___doc = + "x.__hex__() <==> hex(x)"; + + public final static String long___index___doc = + "x[y:z] <==> x[y.__index__():z.__index__()]"; + + public final static String long___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String long___int___doc = + "x.__int__() <==> int(x)"; + + public final static String long___invert___doc = + "x.__invert__() <==> ~x"; + + public final static String long___long___doc = + "x.__long__() <==> long(x)"; + + public final static String long___lshift___doc = + "x.__lshift__(y) <==> x< x%y"; + + public final static String long___mul___doc = + "x.__mul__(y) <==> x*y"; + + public final static String long___neg___doc = + "x.__neg__() <==> -x"; + + public final static String long___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String long___nonzero___doc = + "x.__nonzero__() <==> x != 0"; + + public final static String long___oct___doc = + "x.__oct__() <==> oct(x)"; + + public final static String long___or___doc = + "x.__or__(y) <==> x|y"; + + public final static String long___pos___doc = + "x.__pos__() <==> +x"; + + public final static String long___pow___doc = + "x.__pow__(y[, z]) <==> pow(x, y[, z])"; + + public final static String long___radd___doc = + "x.__radd__(y) <==> y+x"; + + public final static String long___rand___doc = + "x.__rand__(y) <==> y&x"; + + public final static String long___rdiv___doc = + "x.__rdiv__(y) <==> y/x"; + + public final static String long___rdivmod___doc = + "x.__rdivmod__(y) <==> divmod(y, x)"; + + public final static String long___reduce___doc = + "helper for pickle"; + + public final static String long___reduce_ex___doc = + "helper for pickle"; + + public final static String long___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String long___rfloordiv___doc = + "x.__rfloordiv__(y) <==> y//x"; + + public final static String long___rlshift___doc = + "x.__rlshift__(y) <==> y< y%x"; + + public final static String long___rmul___doc = + "x.__rmul__(y) <==> y*x"; + + public final static String long___ror___doc = + "x.__ror__(y) <==> y|x"; + + public final static String long___rpow___doc = + "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; + + public final static String long___rrshift___doc = + "x.__rrshift__(y) <==> y>>x"; + + public final static String long___rshift___doc = + "x.__rshift__(y) <==> x>>y"; + + public final static String long___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String long___rtruediv___doc = + "x.__rtruediv__(y) <==> y/x"; + + public final static String long___rxor___doc = + "x.__rxor__(y) <==> y^x"; + + public final static String long___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String long___sizeof___doc = + "Returns size in memory, in bytes"; + + public final static String long___str___doc = + "x.__str__() <==> str(x)"; + + public final static String long___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String long___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String long___truediv___doc = + "x.__truediv__(y) <==> x/y"; + + public final static String long___trunc___doc = + "Truncating an Integral returns itself."; + + public final static String long___xor___doc = + "x.__xor__(y) <==> x^y"; + + public final static String long_bit_length_doc = + "long.bit_length() -> int or long\n" + + "\n" + + "Number of bits necessary to represent self in binary.\n" + + ">>> bin(37L)\n" + + "'0b100101'\n" + + ">>> (37L).bit_length()\n" + + "6"; + + public final static String long_conjugate_doc = + "Returns self, the complex conjugate of any long."; + + public final static String long_denominator_doc = + "the denominator of a rational number in lowest terms"; + + public final static String long_imag_doc = + "the imaginary part of a complex number"; + + public final static String long_numerator_doc = + "the numerator of a rational number in lowest terms"; + + public final static String long_real_doc = + "the real part of a complex number"; + + // Docs for + public final static String tuple___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String tuple___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String tuple___contains___doc = + "x.__contains__(y) <==> y in x"; + + public final static String tuple___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String tuple_doc = + "tuple() -> empty tuple\n" + + "tuple(iterable) -> tuple initialized from iterable's items\n" + + "\n" + + "If the argument is a tuple, the return value is the same object."; + + public final static String tuple___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String tuple___format___doc = + "default object formatter"; + + public final static String tuple___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String tuple___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String tuple___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String tuple___getnewargs___doc = + ""; + + public final static String tuple___getslice___doc = + "x.__getslice__(i, j) <==> x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String tuple___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String tuple___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String tuple___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String tuple___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String tuple___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String tuple___len___doc = + "x.__len__() <==> len(x)"; + + public final static String tuple___lt___doc = + "x.__lt__(y) <==> x x*n"; + + public final static String tuple___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String tuple___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String tuple___reduce___doc = + "helper for pickle"; + + public final static String tuple___reduce_ex___doc = + "helper for pickle"; + + public final static String tuple___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String tuple___rmul___doc = + "x.__rmul__(n) <==> n*x"; + + public final static String tuple___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String tuple___sizeof___doc = + "T.__sizeof__() -- size of T in memory, in bytes"; + + public final static String tuple___str___doc = + "x.__str__() <==> str(x)"; + + public final static String tuple___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String tuple_count_doc = + "T.count(value) -> integer -- return number of occurrences of value"; + + public final static String tuple_index_doc = + "T.index(value, [start, [stop]]) -> integer -- return first index of value.\n" + + "Raises ValueError if the value is not present."; + + // Docs for + public final static String str___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String str___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String str___contains___doc = + "x.__contains__(y) <==> y in x"; + + public final static String str___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String str_doc = + "str(object) -> string\n" + + "\n" + + "Return a nice string representation of the object.\n" + + "If the argument is a string, the return value is the same object."; + + public final static String str___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String str___format___doc = + "S.__format__(format_spec) -> string\n" + + "\n" + + "Return a formatted version of S as described by format_spec."; + + public final static String str___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String str___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String str___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String str___getnewargs___doc = + ""; + + public final static String str___getslice___doc = + "x.__getslice__(i, j) <==> x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String str___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String str___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String str___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String str___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String str___len___doc = + "x.__len__() <==> len(x)"; + + public final static String str___lt___doc = + "x.__lt__(y) <==> x x%y"; + + public final static String str___mul___doc = + "x.__mul__(n) <==> x*n"; + + public final static String str___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String str___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String str___reduce___doc = + "helper for pickle"; + + public final static String str___reduce_ex___doc = + "helper for pickle"; + + public final static String str___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String str___rmod___doc = + "x.__rmod__(y) <==> y%x"; + + public final static String str___rmul___doc = + "x.__rmul__(n) <==> n*x"; + + public final static String str___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String str___sizeof___doc = + "S.__sizeof__() -> size of S in memory, in bytes"; + + public final static String str___str___doc = + "x.__str__() <==> str(x)"; + + public final static String str___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String str__formatter_field_name_split_doc = + ""; + + public final static String str__formatter_parser_doc = + ""; + + public final static String str_capitalize_doc = + "S.capitalize() -> string\n" + + "\n" + + "Return a copy of the string S with only its first character\n" + + "capitalized."; + + public final static String str_center_doc = + "S.center(width[, fillchar]) -> string\n" + + "\n" + + "Return S centered in a string of length width. Padding is\n" + + "done using the specified fill character (default is a space)"; + + public final static String str_count_doc = + "S.count(sub[, start[, end]]) -> int\n" + + "\n" + + "Return the number of non-overlapping occurrences of substring sub in\n" + + "string S[start:end]. Optional arguments start and end are interpreted\n" + + "as in slice notation."; + + public final static String str_decode_doc = + "S.decode([encoding[,errors]]) -> object\n" + + "\n" + + "Decodes S using the codec registered for encoding. encoding defaults\n" + + "to the default encoding. errors may be given to set a different error\n" + + "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + + "a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n" + + "as well as any other name registered with codecs.register_error that is\n" + + "able to handle UnicodeDecodeErrors."; + + public final static String str_encode_doc = + "S.encode([encoding[,errors]]) -> object\n" + + "\n" + + "Encodes S using the codec registered for encoding. encoding defaults\n" + + "to the default encoding. errors may be given to set a different error\n" + + "handling scheme. Default is 'strict' meaning that encoding errors raise\n" + + "a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n" + + "'xmlcharrefreplace' as well as any other name registered with\n" + + "codecs.register_error that is able to handle UnicodeEncodeErrors."; + + public final static String str_endswith_doc = + "S.endswith(suffix[, start[, end]]) -> bool\n" + + "\n" + + "Return True if S ends with the specified suffix, False otherwise.\n" + + "With optional start, test S beginning at that position.\n" + + "With optional end, stop comparing S at that position.\n" + + "suffix can also be a tuple of strings to try."; + + public final static String str_expandtabs_doc = + "S.expandtabs([tabsize]) -> string\n" + + "\n" + + "Return a copy of S where all tab characters are expanded using spaces.\n" + + "If tabsize is not given, a tab size of 8 characters is assumed."; + + public final static String str_find_doc = + "S.find(sub [,start [,end]]) -> int\n" + + "\n" + + "Return the lowest index in S where substring sub is found,\n" + + "such that sub is contained within s[start:end]. Optional\n" + + "arguments start and end are interpreted as in slice notation.\n" + + "\n" + + "Return -1 on failure."; + + public final static String str_format_doc = + "S.format(*args, **kwargs) -> string\n" + + "\n" + + "Return a formatted version of S, using substitutions from args and kwargs.\n" + + "The substitutions are identified by braces ('{' and '}')."; + + public final static String str_index_doc = + "S.index(sub [,start [,end]]) -> int\n" + + "\n" + + "Like S.find() but raise ValueError when the substring is not found."; + + public final static String str_isalnum_doc = + "S.isalnum() -> bool\n" + + "\n" + + "Return True if all characters in S are alphanumeric\n" + + "and there is at least one character in S, False otherwise."; + + public final static String str_isalpha_doc = + "S.isalpha() -> bool\n" + + "\n" + + "Return True if all characters in S are alphabetic\n" + + "and there is at least one character in S, False otherwise."; + + public final static String str_isdigit_doc = + "S.isdigit() -> bool\n" + + "\n" + + "Return True if all characters in S are digits\n" + + "and there is at least one character in S, False otherwise."; + + public final static String str_islower_doc = + "S.islower() -> bool\n" + + "\n" + + "Return True if all cased characters in S are lowercase and there is\n" + + "at least one cased character in S, False otherwise."; + + public final static String str_isspace_doc = + "S.isspace() -> bool\n" + + "\n" + + "Return True if all characters in S are whitespace\n" + + "and there is at least one character in S, False otherwise."; + + public final static String str_istitle_doc = + "S.istitle() -> bool\n" + + "\n" + + "Return True if S is a titlecased string and there is at least one\n" + + "character in S, i.e. uppercase characters may only follow uncased\n" + + "characters and lowercase characters only cased ones. Return False\n" + + "otherwise."; + + public final static String str_isupper_doc = + "S.isupper() -> bool\n" + + "\n" + + "Return True if all cased characters in S are uppercase and there is\n" + + "at least one cased character in S, False otherwise."; + + public final static String str_join_doc = + "S.join(iterable) -> string\n" + + "\n" + + "Return a string which is the concatenation of the strings in the\n" + + "iterable. The separator between elements is S."; + + public final static String str_ljust_doc = + "S.ljust(width[, fillchar]) -> string\n" + + "\n" + + "Return S left-justified in a string of length width. Padding is\n" + + "done using the specified fill character (default is a space)."; + + public final static String str_lower_doc = + "S.lower() -> string\n" + + "\n" + + "Return a copy of the string S converted to lowercase."; + + public final static String str_lstrip_doc = + "S.lstrip([chars]) -> string or unicode\n" + + "\n" + + "Return a copy of the string S with leading whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is unicode, S will be converted to unicode before stripping"; + + public final static String str_partition_doc = + "S.partition(sep) -> (head, sep, tail)\n" + + "\n" + + "Search for the separator sep in S, and return the part before it,\n" + + "the separator itself, and the part after it. If the separator is not\n" + + "found, return S and two empty strings."; + + public final static String str_replace_doc = + "S.replace(old, new[, count]) -> string\n" + + "\n" + + "Return a copy of string S with all occurrences of substring\n" + + "old replaced by new. If the optional argument count is\n" + + "given, only the first count occurrences are replaced."; + + public final static String str_rfind_doc = + "S.rfind(sub [,start [,end]]) -> int\n" + + "\n" + + "Return the highest index in S where substring sub is found,\n" + + "such that sub is contained within s[start:end]. Optional\n" + + "arguments start and end are interpreted as in slice notation.\n" + + "\n" + + "Return -1 on failure."; + + public final static String str_rindex_doc = + "S.rindex(sub [,start [,end]]) -> int\n" + + "\n" + + "Like S.rfind() but raise ValueError when the substring is not found."; + + public final static String str_rjust_doc = + "S.rjust(width[, fillchar]) -> string\n" + + "\n" + + "Return S right-justified in a string of length width. Padding is\n" + + "done using the specified fill character (default is a space)"; + + public final static String str_rpartition_doc = + "S.rpartition(sep) -> (head, sep, tail)\n" + + "\n" + + "Search for the separator sep in S, starting at the end of S, and return\n" + + "the part before it, the separator itself, and the part after it. If the\n" + + "separator is not found, return two empty strings and S."; + + public final static String str_rsplit_doc = + "S.rsplit([sep [,maxsplit]]) -> list of strings\n" + + "\n" + + "Return a list of the words in the string S, using sep as the\n" + + "delimiter string, starting at the end of the string and working\n" + + "to the front. If maxsplit is given, at most maxsplit splits are\n" + + "done. If sep is not specified or is None, any whitespace string\n" + + "is a separator."; + + public final static String str_rstrip_doc = + "S.rstrip([chars]) -> string or unicode\n" + + "\n" + + "Return a copy of the string S with trailing whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is unicode, S will be converted to unicode before stripping"; + + public final static String str_split_doc = + "S.split([sep [,maxsplit]]) -> list of strings\n" + + "\n" + + "Return a list of the words in the string S, using sep as the\n" + + "delimiter string. If maxsplit is given, at most maxsplit\n" + + "splits are done. If sep is not specified or is None, any\n" + + "whitespace string is a separator and empty strings are removed\n" + + "from the result."; + + public final static String str_splitlines_doc = + "S.splitlines([keepends]) -> list of strings\n" + + "\n" + + "Return a list of the lines in S, breaking at line boundaries.\n" + + "Line breaks are not included in the resulting list unless keepends\n" + + "is given and true."; + + public final static String str_startswith_doc = + "S.startswith(prefix[, start[, end]]) -> bool\n" + + "\n" + + "Return True if S starts with the specified prefix, False otherwise.\n" + + "With optional start, test S beginning at that position.\n" + + "With optional end, stop comparing S at that position.\n" + + "prefix can also be a tuple of strings to try."; + + public final static String str_strip_doc = + "S.strip([chars]) -> string or unicode\n" + + "\n" + + "Return a copy of the string S with leading and trailing\n" + + "whitespace removed.\n" + + "If chars is given and not None, remove characters in chars instead.\n" + + "If chars is unicode, S will be converted to unicode before stripping"; + + public final static String str_swapcase_doc = + "S.swapcase() -> string\n" + + "\n" + + "Return a copy of the string S with uppercase characters\n" + + "converted to lowercase and vice versa."; + + public final static String str_title_doc = + "S.title() -> string\n" + + "\n" + + "Return a titlecased version of S, i.e. words start with uppercase\n" + + "characters, all remaining cased characters have lowercase."; + + public final static String str_translate_doc = + "S.translate(table [,deletechars]) -> string\n" + + "\n" + + "Return a copy of the string S, where all characters occurring\n" + + "in the optional argument deletechars are removed, and the\n" + + "remaining characters have been mapped through the given\n" + + "translation table, which must be a string of length 256."; + + public final static String str_upper_doc = + "S.upper() -> string\n" + + "\n" + + "Return a copy of the string S converted to uppercase."; + + public final static String str_zfill_doc = + "S.zfill(width) -> string\n" + + "\n" + + "Pad a numeric string S with zeros on the left, to fill a field\n" + + "of the specified width. The string S is never truncated."; + + // Docs for + public final static String property___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String property___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String property___delete___doc = + "descr.__delete__(obj)"; + + public final static String property_doc = + "property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n" + + "\n" + + "fget is a function to be used for getting an attribute value, and likewise\n" + + "fset is a function for setting, and fdel a function for del'ing, an\n" + + "attribute. Typical use is to define a managed attribute x:\n" + + "class C(object):\n" + + " def getx(self): return self._x\n" + + " def setx(self, value): self._x = value\n" + + " def delx(self): del self._x\n" + + " x = property(getx, setx, delx, \"I'm the 'x' property.\")\n" + + "\n" + + "Decorators make defining new properties or modifying existing ones easy:\n" + + "class C(object):\n" + + " @property\n" + + " def x(self): return self._x\n" + + " @x.setter\n" + + " def x(self, value): self._x = value\n" + + " @x.deleter\n" + + " def x(self): del self._x\n" + + ""; + + public final static String property___format___doc = + "default object formatter"; + + public final static String property___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String property___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String property___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String property___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String property___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String property___reduce___doc = + "helper for pickle"; + + public final static String property___reduce_ex___doc = + "helper for pickle"; + + public final static String property___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String property___set___doc = + "descr.__set__(obj, value)"; + + public final static String property___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String property___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String property___str___doc = + "x.__str__() <==> str(x)"; + + public final static String property___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String property_deleter_doc = + "Descriptor to change the deleter on a property."; + + public final static String property_fdel_doc = + ""; + + public final static String property_fget_doc = + ""; + + public final static String property_fset_doc = + ""; + + public final static String property_getter_doc = + "Descriptor to change the getter on a property."; + + public final static String property_setter_doc = + "Descriptor to change the setter on a property."; + + // Docs for + public final static String int___abs___doc = + "x.__abs__() <==> abs(x)"; + + public final static String int___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String int___and___doc = + "x.__and__(y) <==> x&y"; + + public final static String int___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String int___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String int___coerce___doc = + "x.__coerce__(y) <==> coerce(x, y)"; + + public final static String int___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String int___div___doc = + "x.__div__(y) <==> x/y"; + + public final static String int___divmod___doc = + "x.__divmod__(y) <==> divmod(x, y)"; + + public final static String int_doc = + "int(x[, base]) -> integer\n" + + "\n" + + "Convert a string or number to an integer, if possible. A floating point\n" + + "argument will be truncated towards zero (this does not include a string\n" + + "representation of a floating point number!) When converting a string, use\n" + + "the optional base. It is an error to supply a base when converting a\n" + + "non-string. If base is zero, the proper base is guessed based on the\n" + + "string content. If the argument is outside the integer range a\n" + + "long object will be returned instead."; + + public final static String int___float___doc = + "x.__float__() <==> float(x)"; + + public final static String int___floordiv___doc = + "x.__floordiv__(y) <==> x//y"; + + public final static String int___format___doc = + ""; + + public final static String int___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String int___getnewargs___doc = + ""; + + public final static String int___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String int___hex___doc = + "x.__hex__() <==> hex(x)"; + + public final static String int___index___doc = + "x[y:z] <==> x[y.__index__():z.__index__()]"; + + public final static String int___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String int___int___doc = + "x.__int__() <==> int(x)"; + + public final static String int___invert___doc = + "x.__invert__() <==> ~x"; + + public final static String int___long___doc = + "x.__long__() <==> long(x)"; + + public final static String int___lshift___doc = + "x.__lshift__(y) <==> x< x%y"; + + public final static String int___mul___doc = + "x.__mul__(y) <==> x*y"; + + public final static String int___neg___doc = + "x.__neg__() <==> -x"; + + public final static String int___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String int___nonzero___doc = + "x.__nonzero__() <==> x != 0"; + + public final static String int___oct___doc = + "x.__oct__() <==> oct(x)"; + + public final static String int___or___doc = + "x.__or__(y) <==> x|y"; + + public final static String int___pos___doc = + "x.__pos__() <==> +x"; + + public final static String int___pow___doc = + "x.__pow__(y[, z]) <==> pow(x, y[, z])"; + + public final static String int___radd___doc = + "x.__radd__(y) <==> y+x"; + + public final static String int___rand___doc = + "x.__rand__(y) <==> y&x"; + + public final static String int___rdiv___doc = + "x.__rdiv__(y) <==> y/x"; + + public final static String int___rdivmod___doc = + "x.__rdivmod__(y) <==> divmod(y, x)"; + + public final static String int___reduce___doc = + "helper for pickle"; + + public final static String int___reduce_ex___doc = + "helper for pickle"; + + public final static String int___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String int___rfloordiv___doc = + "x.__rfloordiv__(y) <==> y//x"; + + public final static String int___rlshift___doc = + "x.__rlshift__(y) <==> y< y%x"; + + public final static String int___rmul___doc = + "x.__rmul__(y) <==> y*x"; + + public final static String int___ror___doc = + "x.__ror__(y) <==> y|x"; + + public final static String int___rpow___doc = + "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; + + public final static String int___rrshift___doc = + "x.__rrshift__(y) <==> y>>x"; + + public final static String int___rshift___doc = + "x.__rshift__(y) <==> x>>y"; + + public final static String int___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String int___rtruediv___doc = + "x.__rtruediv__(y) <==> y/x"; + + public final static String int___rxor___doc = + "x.__rxor__(y) <==> y^x"; + + public final static String int___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String int___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String int___str___doc = + "x.__str__() <==> str(x)"; + + public final static String int___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String int___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String int___truediv___doc = + "x.__truediv__(y) <==> x/y"; + + public final static String int___trunc___doc = + "Truncating an Integral returns itself."; + + public final static String int___xor___doc = + "x.__xor__(y) <==> x^y"; + + public final static String int_bit_length_doc = + "int.bit_length() -> int\n" + + "\n" + + "Number of bits necessary to represent self in binary.\n" + + ">>> bin(37)\n" + + "'0b100101'\n" + + ">>> (37).bit_length()\n" + + "6"; + + public final static String int_conjugate_doc = + "Returns self, the complex conjugate of any int."; + + public final static String int_denominator_doc = + "the denominator of a rational number in lowest terms"; + + public final static String int_imag_doc = + "the imaginary part of a complex number"; + + public final static String int_numerator_doc = + "the numerator of a rational number in lowest terms"; + + public final static String int_real_doc = + "the real part of a complex number"; + + // Docs for + public final static String xrange___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String xrange___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String xrange_doc = + "xrange([start,] stop[, step]) -> xrange object\n" + + "\n" + + "Like range(), but instead of returning a list, returns an object that\n" + + "generates the numbers in the range on demand. For looping, this is \n" + + "slightly faster than range() and more memory efficient."; + + public final static String xrange___format___doc = + "default object formatter"; + + public final static String xrange___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String xrange___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String xrange___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String xrange___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String xrange___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String xrange___len___doc = + "x.__len__() <==> len(x)"; + + public final static String xrange___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String xrange___reduce___doc = + ""; + + public final static String xrange___reduce_ex___doc = + "helper for pickle"; + + public final static String xrange___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String xrange___reversed___doc = + "Returns a reverse iterator."; + + public final static String xrange___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String xrange___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String xrange___str___doc = + "x.__str__() <==> str(x)"; + + public final static String xrange___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + // Docs for + public final static String file___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String file___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String file_doc = + "file(name[, mode[, buffering]]) -> file object\n" + + "\n" + + "Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n" + + "writing or appending. The file will be created if it doesn't exist\n" + + "when opened for writing or appending; it will be truncated when\n" + + "opened for writing. Add a 'b' to the mode for binary files.\n" + + "Add a '+' to the mode to allow simultaneous reading and writing.\n" + + "If the buffering argument is given, 0 means unbuffered, 1 means line\n" + + "buffered, and larger numbers specify the buffer size. The preferred way\n" + + "to open a file is with the builtin open() function.\n" + + "Add a 'U' to mode to open the file for input with universal newline\n" + + "support. Any line ending in the input file will be seen as a '\\n'\n" + + "in Python. Also, a file so opened gains the attribute 'newlines';\n" + + "the value for this attribute is one of None (no newline read yet),\n" + + "'\\r', '\\n', '\\r\\n' or a tuple containing all the newline types seen.\n" + + "\n" + + "'U' cannot be combined with 'w' or '+' mode.\n" + + ""; + + public final static String file___enter___doc = + "__enter__() -> self."; + + public final static String file___exit___doc = + "__exit__(*excinfo) -> None. Closes the file."; + + public final static String file___format___doc = + "default object formatter"; + + public final static String file___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String file___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String file___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String file___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String file___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String file___reduce___doc = + "helper for pickle"; + + public final static String file___reduce_ex___doc = + "helper for pickle"; + + public final static String file___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String file___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String file___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String file___str___doc = + "x.__str__() <==> str(x)"; + + public final static String file___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String file_close_doc = + "close() -> None or (perhaps) an integer. Close the file.\n" + + "\n" + + "Sets data attribute .closed to True. A closed file cannot be used for\n" + + "further I/O operations. close() may be called more than once without\n" + + "error. Some kinds of file objects (for example, opened by popen())\n" + + "may return an exit status upon closing."; + + public final static String file_closed_doc = + "True if the file is closed"; + + public final static String file_encoding_doc = + "file encoding"; + + public final static String file_errors_doc = + "Unicode error handler"; + + public final static String file_fileno_doc = + "fileno() -> integer \"file descriptor\".\n" + + "\n" + + "This is needed for lower-level file interfaces, such os.read()."; + + public final static String file_flush_doc = + "flush() -> None. Flush the internal I/O buffer."; + + public final static String file_isatty_doc = + "isatty() -> true or false. True if the file is connected to a tty device."; + + public final static String file_mode_doc = + "file mode ('r', 'U', 'w', 'a', possibly with 'b' or '+' added)"; + + public final static String file_name_doc = + "file name"; + + public final static String file_newlines_doc = + "end-of-line convention used in this file"; + + public final static String file_next_doc = + "x.next() -> the next value, or raise StopIteration"; + + public final static String file_read_doc = + "read([size]) -> read at most size bytes, returned as a string.\n" + + "\n" + + "If the size argument is negative or omitted, read until EOF is reached.\n" + + "Notice that when in non-blocking mode, less data than what was requested\n" + + "may be returned, even if no size parameter was given."; + + public final static String file_readinto_doc = + "readinto() -> Undocumented. Don't use this; it may go away."; + + public final static String file_readline_doc = + "readline([size]) -> next line from the file, as a string.\n" + + "\n" + + "Retain newline. A non-negative size argument limits the maximum\n" + + "number of bytes to return (an incomplete line may be returned then).\n" + + "Return an empty string at EOF."; + + public final static String file_readlines_doc = + "readlines([size]) -> list of strings, each a line from the file.\n" + + "\n" + + "Call readline() repeatedly and return a list of the lines so read.\n" + + "The optional size argument, if given, is an approximate bound on the\n" + + "total number of bytes in the lines returned."; + + public final static String file_seek_doc = + "seek(offset[, whence]) -> None. Move to new file position.\n" + + "\n" + + "Argument offset is a byte count. Optional argument whence defaults to\n" + + "0 (offset from start of file, offset should be >= 0); other values are 1\n" + + "(move relative to current position, positive or negative), and 2 (move\n" + + "relative to end of file, usually negative, although many platforms allow\n" + + "seeking beyond the end of a file). If the file is opened in text mode,\n" + + "only offsets returned by tell() are legal. Use of other offsets causes\n" + + "undefined behavior.\n" + + "Note that not all file objects are seekable."; + + public final static String file_softspace_doc = + "flag indicating that a space needs to be printed; used by print"; + + public final static String file_tell_doc = + "tell() -> current file position, an integer (may be a long integer)."; + + public final static String file_truncate_doc = + "truncate([size]) -> None. Truncate the file to at most size bytes.\n" + + "\n" + + "Size defaults to the current file position, as returned by tell()."; + + public final static String file_write_doc = + "write(str) -> None. Write string str to file.\n" + + "\n" + + "Note that due to buffering, flush() or close() may be needed before\n" + + "the file on disk reflects the data written."; + + public final static String file_writelines_doc = + "writelines(sequence_of_strings) -> None. Write the strings to the file.\n" + + "\n" + + "Note that newlines are not added. The sequence can be any iterable object\n" + + "producing strings. This is equivalent to calling write() for each string."; + + public final static String file_xreadlines_doc = + "xreadlines() -> returns self.\n" + + "\n" + + "For backward compatibility. File objects now include the performance\n" + + "optimizations previously implemented in the xreadlines module."; + + // Docs for + public final static String complex___abs___doc = + "x.__abs__() <==> abs(x)"; + + public final static String complex___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String complex___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String complex___coerce___doc = + "x.__coerce__(y) <==> coerce(x, y)"; + + public final static String complex___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String complex___div___doc = + "x.__div__(y) <==> x/y"; + + public final static String complex___divmod___doc = + "x.__divmod__(y) <==> divmod(x, y)"; + + public final static String complex_doc = + "complex(real[, imag]) -> complex number\n" + + "\n" + + "Create a complex number from a real part and an optional imaginary part.\n" + + "This is equivalent to (real + imag*1j) where imag defaults to 0."; + + public final static String complex___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String complex___float___doc = + "x.__float__() <==> float(x)"; + + public final static String complex___floordiv___doc = + "x.__floordiv__(y) <==> x//y"; + + public final static String complex___format___doc = + "complex.__format__() -> str\n" + + "\n" + + "Converts to a string according to format_spec."; + + public final static String complex___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String complex___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String complex___getnewargs___doc = + ""; + + public final static String complex___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String complex___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String complex___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String complex___int___doc = + "x.__int__() <==> int(x)"; + + public final static String complex___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String complex___long___doc = + "x.__long__() <==> long(x)"; + + public final static String complex___lt___doc = + "x.__lt__(y) <==> x x%y"; + + public final static String complex___mul___doc = + "x.__mul__(y) <==> x*y"; + + public final static String complex___ne___doc = + "x.__ne__(y) <==> x!=y"; + + public final static String complex___neg___doc = + "x.__neg__() <==> -x"; + + public final static String complex___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String complex___nonzero___doc = + "x.__nonzero__() <==> x != 0"; + + public final static String complex___pos___doc = + "x.__pos__() <==> +x"; + + public final static String complex___pow___doc = + "x.__pow__(y[, z]) <==> pow(x, y[, z])"; + + public final static String complex___radd___doc = + "x.__radd__(y) <==> y+x"; + + public final static String complex___rdiv___doc = + "x.__rdiv__(y) <==> y/x"; + + public final static String complex___rdivmod___doc = + "x.__rdivmod__(y) <==> divmod(y, x)"; + + public final static String complex___reduce___doc = + "helper for pickle"; + + public final static String complex___reduce_ex___doc = + "helper for pickle"; + + public final static String complex___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String complex___rfloordiv___doc = + "x.__rfloordiv__(y) <==> y//x"; + + public final static String complex___rmod___doc = + "x.__rmod__(y) <==> y%x"; + + public final static String complex___rmul___doc = + "x.__rmul__(y) <==> y*x"; + + public final static String complex___rpow___doc = + "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; + + public final static String complex___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String complex___rtruediv___doc = + "x.__rtruediv__(y) <==> y/x"; + + public final static String complex___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String complex___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String complex___str___doc = + "x.__str__() <==> str(x)"; + + public final static String complex___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String complex___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String complex___truediv___doc = + "x.__truediv__(y) <==> x/y"; + + public final static String complex_conjugate_doc = + "complex.conjugate() -> complex\n" + + "\n" + + "Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."; + + public final static String complex_imag_doc = + "the imaginary part of a complex number"; + + public final static String complex_real_doc = + "the real part of a complex number"; + + // Docs for + public final static String bool___abs___doc = + "x.__abs__() <==> abs(x)"; + + public final static String bool___add___doc = + "x.__add__(y) <==> x+y"; + + public final static String bool___and___doc = + "x.__and__(y) <==> x&y"; + + public final static String bool___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String bool___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String bool___coerce___doc = + "x.__coerce__(y) <==> coerce(x, y)"; + + public final static String bool___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String bool___div___doc = + "x.__div__(y) <==> x/y"; + + public final static String bool___divmod___doc = + "x.__divmod__(y) <==> divmod(x, y)"; + + public final static String bool_doc = + "bool(x) -> bool\n" + + "\n" + + "Returns True when the argument x is true, False otherwise.\n" + + "The builtins True and False are the only two instances of the class bool.\n" + + "The class bool is a subclass of the class int, and cannot be subclassed."; + + public final static String bool___float___doc = + "x.__float__() <==> float(x)"; + + public final static String bool___floordiv___doc = + "x.__floordiv__(y) <==> x//y"; + + public final static String bool___format___doc = + ""; + + public final static String bool___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String bool___getnewargs___doc = + ""; + + public final static String bool___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String bool___hex___doc = + "x.__hex__() <==> hex(x)"; + + public final static String bool___index___doc = + "x[y:z] <==> x[y.__index__():z.__index__()]"; + + public final static String bool___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String bool___int___doc = + "x.__int__() <==> int(x)"; + + public final static String bool___invert___doc = + "x.__invert__() <==> ~x"; + + public final static String bool___long___doc = + "x.__long__() <==> long(x)"; + + public final static String bool___lshift___doc = + "x.__lshift__(y) <==> x< x%y"; + + public final static String bool___mul___doc = + "x.__mul__(y) <==> x*y"; + + public final static String bool___neg___doc = + "x.__neg__() <==> -x"; + + public final static String bool___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String bool___nonzero___doc = + "x.__nonzero__() <==> x != 0"; + + public final static String bool___oct___doc = + "x.__oct__() <==> oct(x)"; + + public final static String bool___or___doc = + "x.__or__(y) <==> x|y"; + + public final static String bool___pos___doc = + "x.__pos__() <==> +x"; + + public final static String bool___pow___doc = + "x.__pow__(y[, z]) <==> pow(x, y[, z])"; + + public final static String bool___radd___doc = + "x.__radd__(y) <==> y+x"; + + public final static String bool___rand___doc = + "x.__rand__(y) <==> y&x"; + + public final static String bool___rdiv___doc = + "x.__rdiv__(y) <==> y/x"; + + public final static String bool___rdivmod___doc = + "x.__rdivmod__(y) <==> divmod(y, x)"; + + public final static String bool___reduce___doc = + "helper for pickle"; + + public final static String bool___reduce_ex___doc = + "helper for pickle"; + + public final static String bool___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String bool___rfloordiv___doc = + "x.__rfloordiv__(y) <==> y//x"; + + public final static String bool___rlshift___doc = + "x.__rlshift__(y) <==> y< y%x"; + + public final static String bool___rmul___doc = + "x.__rmul__(y) <==> y*x"; + + public final static String bool___ror___doc = + "x.__ror__(y) <==> y|x"; + + public final static String bool___rpow___doc = + "y.__rpow__(x[, z]) <==> pow(x, y[, z])"; + + public final static String bool___rrshift___doc = + "x.__rrshift__(y) <==> y>>x"; + + public final static String bool___rshift___doc = + "x.__rshift__(y) <==> x>>y"; + + public final static String bool___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String bool___rtruediv___doc = + "x.__rtruediv__(y) <==> y/x"; + + public final static String bool___rxor___doc = + "x.__rxor__(y) <==> y^x"; + + public final static String bool___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String bool___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String bool___str___doc = + "x.__str__() <==> str(x)"; + + public final static String bool___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String bool___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String bool___truediv___doc = + "x.__truediv__(y) <==> x/y"; + + public final static String bool___trunc___doc = + "Truncating an Integral returns itself."; + + public final static String bool___xor___doc = + "x.__xor__(y) <==> x^y"; + + public final static String bool_bit_length_doc = + "int.bit_length() -> int\n" + + "\n" + + "Number of bits necessary to represent self in binary.\n" + + ">>> bin(37)\n" + + "'0b100101'\n" + + ">>> (37).bit_length()\n" + + "6"; + + public final static String bool_conjugate_doc = + "Returns self, the complex conjugate of any int."; + + public final static String bool_denominator_doc = + "the denominator of a rational number in lowest terms"; + + public final static String bool_imag_doc = + "the imaginary part of a complex number"; + + public final static String bool_numerator_doc = + "the numerator of a rational number in lowest terms"; + + public final static String bool_real_doc = + "the real part of a complex number"; + + // Docs for + public final static String classmethod___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String classmethod___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String classmethod_doc = + "classmethod(function) -> method\n" + + "\n" + + "Convert a function to be a class method.\n" + + "\n" + + "A class method receives the class as implicit first argument,\n" + + "just like an instance method receives the instance.\n" + + "To declare a class method, use this idiom:\n" + + "\n" + + " class C:\n" + + " def f(cls, arg1, arg2, ...): ...\n" + + " f = classmethod(f)\n" + + "\n" + + "It can be called either on the class (e.g. C.f()) or on an instance\n" + + "(e.g. C().f()). The instance is ignored except for its class.\n" + + "If a class method is called for a derived class, the derived class\n" + + "object is passed as the implied first argument.\n" + + "\n" + + "Class methods are different than C++ or Java static methods.\n" + + "If you want those, see the staticmethod builtin."; + + public final static String classmethod___format___doc = + "default object formatter"; + + public final static String classmethod___func___doc = + ""; + + public final static String classmethod___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String classmethod___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String classmethod___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String classmethod___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String classmethod___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String classmethod___reduce___doc = + "helper for pickle"; + + public final static String classmethod___reduce_ex___doc = + "helper for pickle"; + + public final static String classmethod___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String classmethod___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String classmethod___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String classmethod___str___doc = + "x.__str__() <==> str(x)"; + + public final static String classmethod___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + // Docs for + public final static String set___and___doc = + "x.__and__(y) <==> x&y"; + + public final static String set___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String set___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String set___contains___doc = + "x.__contains__(y) <==> y in x."; + + public final static String set___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String set_doc = + "set() -> new empty set object\n" + + "set(iterable) -> new set object\n" + + "\n" + + "Build an unordered collection of unique elements."; + + public final static String set___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String set___format___doc = + "default object formatter"; + + public final static String set___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String set___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String set___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String set___hash___doc = + ""; + + public final static String set___iand___doc = + "x.__iand__(y) <==> x&y"; + + public final static String set___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String set___ior___doc = + "x.__ior__(y) <==> x|y"; + + public final static String set___isub___doc = + "x.__isub__(y) <==> x-y"; + + public final static String set___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String set___ixor___doc = + "x.__ixor__(y) <==> x^y"; + + public final static String set___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String set___len___doc = + "x.__len__() <==> len(x)"; + + public final static String set___lt___doc = + "x.__lt__(y) <==> x x!=y"; + + public final static String set___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String set___or___doc = + "x.__or__(y) <==> x|y"; + + public final static String set___rand___doc = + "x.__rand__(y) <==> y&x"; + + public final static String set___reduce___doc = + "Return state information for pickling."; + + public final static String set___reduce_ex___doc = + "helper for pickle"; + + public final static String set___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String set___ror___doc = + "x.__ror__(y) <==> y|x"; + + public final static String set___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String set___rxor___doc = + "x.__rxor__(y) <==> y^x"; + + public final static String set___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String set___sizeof___doc = + "S.__sizeof__() -> size of S in memory, in bytes"; + + public final static String set___str___doc = + "x.__str__() <==> str(x)"; + + public final static String set___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String set___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String set___xor___doc = + "x.__xor__(y) <==> x^y"; + + public final static String set_add_doc = + "Add an element to a set.\n" + + "\n" + + "This has no effect if the element is already present."; + + public final static String set_clear_doc = + "Remove all elements from this set."; + + public final static String set_copy_doc = + "Return a shallow copy of a set."; + + public final static String set_difference_doc = + "Return the difference of two or more sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in this set but not the others.)"; + + public final static String set_difference_update_doc = + "Remove all elements of another set from this set."; + + public final static String set_discard_doc = + "Remove an element from a set if it is a member.\n" + + "\n" + + "If the element is not a member, do nothing."; + + public final static String set_intersection_doc = + "Return the intersection of two or more sets as a new set.\n" + + "\n" + + "(i.e. elements that are common to all of the sets.)"; + + public final static String set_intersection_update_doc = + "Update a set with the intersection of itself and another."; + + public final static String set_isdisjoint_doc = + "Return True if two sets have a null intersection."; + + public final static String set_issubset_doc = + "Report whether another set contains this set."; + + public final static String set_issuperset_doc = + "Report whether this set contains another set."; + + public final static String set_pop_doc = + "Remove and return an arbitrary set element.\n" + + "Raises KeyError if the set is empty."; + + public final static String set_remove_doc = + "Remove an element from a set; it must be a member.\n" + + "\n" + + "If the element is not a member, raise a KeyError."; + + public final static String set_symmetric_difference_doc = + "Return the symmetric difference of two sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in exactly one of the sets.)"; + + public final static String set_symmetric_difference_update_doc = + "Update a set with the symmetric difference of itself and another."; + + public final static String set_union_doc = + "Return the union of sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in either set.)"; + + public final static String set_update_doc = + "Update a set with the union of itself and others."; + + // Docs for + public final static String frozenset___and___doc = + "x.__and__(y) <==> x&y"; + + public final static String frozenset___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String frozenset___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String frozenset___contains___doc = + "x.__contains__(y) <==> y in x."; + + public final static String frozenset___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String frozenset_doc = + "frozenset() -> empty frozenset object\n" + + "frozenset(iterable) -> frozenset object\n" + + "\n" + + "Build an immutable unordered collection of unique elements."; + + public final static String frozenset___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String frozenset___format___doc = + "default object formatter"; + + public final static String frozenset___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String frozenset___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String frozenset___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String frozenset___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String frozenset___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String frozenset___iter___doc = + "x.__iter__() <==> iter(x)"; + + public final static String frozenset___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String frozenset___len___doc = + "x.__len__() <==> len(x)"; + + public final static String frozenset___lt___doc = + "x.__lt__(y) <==> x x!=y"; + + public final static String frozenset___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String frozenset___or___doc = + "x.__or__(y) <==> x|y"; + + public final static String frozenset___rand___doc = + "x.__rand__(y) <==> y&x"; + + public final static String frozenset___reduce___doc = + "Return state information for pickling."; + + public final static String frozenset___reduce_ex___doc = + "helper for pickle"; + + public final static String frozenset___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String frozenset___ror___doc = + "x.__ror__(y) <==> y|x"; + + public final static String frozenset___rsub___doc = + "x.__rsub__(y) <==> y-x"; + + public final static String frozenset___rxor___doc = + "x.__rxor__(y) <==> y^x"; + + public final static String frozenset___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String frozenset___sizeof___doc = + "S.__sizeof__() -> size of S in memory, in bytes"; + + public final static String frozenset___str___doc = + "x.__str__() <==> str(x)"; + + public final static String frozenset___sub___doc = + "x.__sub__(y) <==> x-y"; + + public final static String frozenset___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String frozenset___xor___doc = + "x.__xor__(y) <==> x^y"; + + public final static String frozenset_copy_doc = + "Return a shallow copy of a set."; + + public final static String frozenset_difference_doc = + "Return the difference of two or more sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in this set but not the others.)"; + + public final static String frozenset_intersection_doc = + "Return the intersection of two or more sets as a new set.\n" + + "\n" + + "(i.e. elements that are common to all of the sets.)"; + + public final static String frozenset_isdisjoint_doc = + "Return True if two sets have a null intersection."; + + public final static String frozenset_issubset_doc = + "Report whether another set contains this set."; + + public final static String frozenset_issuperset_doc = + "Report whether this set contains another set."; + + public final static String frozenset_symmetric_difference_doc = + "Return the symmetric difference of two sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in exactly one of the sets.)"; + + public final static String frozenset_union_doc = + "Return the union of sets as a new set.\n" + + "\n" + + "(i.e. all elements that are in either set.)"; + + // Docs for + public final static String BaseException___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String BaseException___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String BaseException___dict___doc = + ""; + + public final static String BaseException_doc = + "Common base class for all exceptions"; + + public final static String BaseException___format___doc = + "default object formatter"; + + public final static String BaseException___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String BaseException___getitem___doc = + "x.__getitem__(y) <==> x[y]"; + + public final static String BaseException___getslice___doc = + "x.__getslice__(i, j) <==> x[i:j]\n" + + " \n" + + " Use of negative indices is not supported."; + + public final static String BaseException___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String BaseException___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String BaseException___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String BaseException___reduce___doc = + ""; + + public final static String BaseException___reduce_ex___doc = + "helper for pickle"; + + public final static String BaseException___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String BaseException___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String BaseException___setstate___doc = + ""; + + public final static String BaseException___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String BaseException___str___doc = + "x.__str__() <==> str(x)"; + + public final static String BaseException___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String BaseException___unicode___doc = + ""; + + public final static String BaseException_args_doc = + ""; + + public final static String BaseException_message_doc = + ""; + + // Docs for + public final static String function___call___doc = + "x.__call__(...) <==> x(...)"; + + public final static String function___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String function___closure___doc = + ""; + + public final static String function___code___doc = + ""; + + public final static String function___defaults___doc = + ""; + + public final static String function___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String function___dict___doc = + ""; + + public final static String function_doc = + "function(code, globals[, name[, argdefs[, closure]]])\n" + + "\n" + + "Create a function object from a code object and a dictionary.\n" + + "The optional name string overrides the name from the code object.\n" + + "The optional argdefs tuple specifies the default argument values.\n" + + "The optional closure tuple supplies the bindings for free variables."; + + public final static String function___format___doc = + "default object formatter"; + + public final static String function___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String function___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String function___globals___doc = + ""; + + public final static String function___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String function___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String function___module___doc = + "str(object) -> string\n" + + "\n" + + "Return a nice string representation of the object.\n" + + "If the argument is a string, the return value is the same object."; + + public final static String function___name___doc = + "str(object) -> string\n" + + "\n" + + "Return a nice string representation of the object.\n" + + "If the argument is a string, the return value is the same object."; + + public final static String function___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String function___reduce___doc = + "helper for pickle"; + + public final static String function___reduce_ex___doc = + "helper for pickle"; + + public final static String function___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String function___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String function___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String function___str___doc = + "x.__str__() <==> str(x)"; + + public final static String function___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String function_func_closure_doc = + ""; + + public final static String function_func_code_doc = + ""; + + public final static String function_func_defaults_doc = + ""; + + public final static String function_func_dict_doc = + ""; + + public final static String function_func_doc_doc = + ""; + + public final static String function_func_globals_doc = + ""; + + public final static String function_func_name_doc = + ""; + + // Docs for + public final static String instancemethod___call___doc = + "x.__call__(...) <==> x(...)"; + + public final static String instancemethod___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String instancemethod___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String instancemethod___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String instancemethod_doc = + "instancemethod(function, instance, class)\n" + + "\n" + + "Create an instance method object."; + + public final static String instancemethod___format___doc = + "default object formatter"; + + public final static String instancemethod___func___doc = + "the function (or other callable) implementing a method"; + + public final static String instancemethod___get___doc = + "descr.__get__(obj[, type]) -> value"; + + public final static String instancemethod___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String instancemethod___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String instancemethod___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String instancemethod___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String instancemethod___reduce___doc = + "helper for pickle"; + + public final static String instancemethod___reduce_ex___doc = + "helper for pickle"; + + public final static String instancemethod___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String instancemethod___self___doc = + "the instance to which a method is bound; None for unbound methods"; + + public final static String instancemethod___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String instancemethod___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String instancemethod___str___doc = + "x.__str__() <==> str(x)"; + + public final static String instancemethod___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String instancemethod_im_class_doc = + "the class associated with a method"; + + public final static String instancemethod_im_func_doc = + "the function (or other callable) implementing a method"; + + public final static String instancemethod_im_self_doc = + "the instance to which a method is bound; None for unbound methods"; + + // Docs for + public final static String code___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String code___cmp___doc = + "x.__cmp__(y) <==> cmp(x,y)"; + + public final static String code___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String code_doc = + "code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n" + + " varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n" + + "\n" + + "Create a code object. Not for the faint of heart."; + + public final static String code___eq___doc = + "x.__eq__(y) <==> x==y"; + + public final static String code___format___doc = + "default object formatter"; + + public final static String code___ge___doc = + "x.__ge__(y) <==> x>=y"; + + public final static String code___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String code___gt___doc = + "x.__gt__(y) <==> x>y"; + + public final static String code___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String code___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String code___le___doc = + "x.__le__(y) <==> x<=y"; + + public final static String code___lt___doc = + "x.__lt__(y) <==> x x!=y"; + + public final static String code___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String code___reduce___doc = + "helper for pickle"; + + public final static String code___reduce_ex___doc = + "helper for pickle"; + + public final static String code___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String code___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String code___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String code___str___doc = + "x.__str__() <==> str(x)"; + + public final static String code___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String code_co_argcount_doc = + ""; + + public final static String code_co_cellvars_doc = + ""; + + public final static String code_co_code_doc = + ""; + + public final static String code_co_consts_doc = + ""; + + public final static String code_co_filename_doc = + ""; + + public final static String code_co_firstlineno_doc = + ""; + + public final static String code_co_flags_doc = + ""; + + public final static String code_co_freevars_doc = + ""; + + public final static String code_co_lnotab_doc = + ""; + + public final static String code_co_name_doc = + ""; + + public final static String code_co_names_doc = + ""; + + public final static String code_co_nlocals_doc = + ""; + + public final static String code_co_stacksize_doc = + ""; + + public final static String code_co_varnames_doc = + ""; + + // Docs for + public final static String frame___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String frame___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String frame_doc = + ""; + + public final static String frame___format___doc = + "default object formatter"; + + public final static String frame___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String frame___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String frame___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String frame___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String frame___reduce___doc = + "helper for pickle"; + + public final static String frame___reduce_ex___doc = + "helper for pickle"; + + public final static String frame___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String frame___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String frame___sizeof___doc = + "F.__sizeof__() -> size of F in memory, in bytes"; + + public final static String frame___str___doc = + "x.__str__() <==> str(x)"; + + public final static String frame___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String frame_f_back_doc = + ""; + + public final static String frame_f_builtins_doc = + ""; + + public final static String frame_f_code_doc = + ""; + + public final static String frame_f_exc_traceback_doc = + ""; + + public final static String frame_f_exc_type_doc = + ""; + + public final static String frame_f_exc_value_doc = + ""; + + public final static String frame_f_globals_doc = + ""; + + public final static String frame_f_lasti_doc = + ""; + + public final static String frame_f_lineno_doc = + ""; + + public final static String frame_f_locals_doc = + ""; + + public final static String frame_f_restricted_doc = + ""; + + public final static String frame_f_trace_doc = + ""; + + // Docs for + public final static String traceback___class___doc = + "type(object) -> the object's type\n" + + "type(name, bases, dict) -> a new type"; + + public final static String traceback___delattr___doc = + "x.__delattr__('name') <==> del x.name"; + + public final static String traceback_doc = + ""; + + public final static String traceback___format___doc = + "default object formatter"; + + public final static String traceback___getattribute___doc = + "x.__getattribute__('name') <==> x.name"; + + public final static String traceback___hash___doc = + "x.__hash__() <==> hash(x)"; + + public final static String traceback___init___doc = + "x.__init__(...) initializes x; see help(type(x)) for signature"; + + public final static String traceback___new___doc = + "T.__new__(S, ...) -> a new object with type S, a subtype of T"; + + public final static String traceback___reduce___doc = + "helper for pickle"; + + public final static String traceback___reduce_ex___doc = + "helper for pickle"; + + public final static String traceback___repr___doc = + "x.__repr__() <==> repr(x)"; + + public final static String traceback___setattr___doc = + "x.__setattr__('name', value) <==> x.name = value"; + + public final static String traceback___sizeof___doc = + "__sizeof__() -> int\n" + + "size of object in memory, in bytes"; + + public final static String traceback___str___doc = + "x.__str__() <==> str(x)"; + + public final static String traceback___subclasshook___doc = + "Abstract classes can override this to customize issubclass().\n" + + "\n" + + "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" + + "It should return True, False or NotImplemented. If it returns\n" + + "NotImplemented, the normal algorithm is used. Otherwise, it\n" + + "overrides the normal algorithm (and the outcome is cached).\n" + + ""; + + public final static String traceback_tb_frame_doc = + ""; + + public final static String traceback_tb_lasti_doc = + ""; + + public final static String traceback_tb_lineno_doc = + ""; + + public final static String traceback_tb_next_doc = + ""; + +} -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 18:15:17 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 18:15:17 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_=5Fcheck=5Fpy3k=5Fwarnings_-?= =?utf8?q?=3E_check=5Fpy3kwarnings?= Message-ID: http://hg.python.org/jython/rev/e50856ce8746 changeset: 6450:e50856ce8746 user: Frank Wierzbicki date: Wed Mar 21 10:15:00 2012 -0700 summary: _check_py3k_warnings -> check_py3kwarnings files: Lib/test/test_class.py | 2 +- Lib/test/test_compile.py | 2 +- Lib/test/test_inspect.py | 6 +++--- Lib/test/test_iter.py | 6 +++--- Lib/test/test_operator.py | 2 +- Lib/test/test_scope.py | 4 ++-- Lib/test/test_univnewlines.py | 2 +- Lib/test/test_weakref.py | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -636,7 +636,7 @@ hash(a.f) def test_main(): - with test_support._check_py3k_warnings( + with test_support.check_py3k_warnings( (".+__(get|set|del)slice__ has been removed", DeprecationWarning), ("classic int division", DeprecationWarning), ("<> not supported", DeprecationWarning)): diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -138,7 +138,7 @@ def test_complex_args(self): - with test_support._check_py3k_warnings( + with test_support.check_py3k_warnings( ("tuple parameter unpacking has been removed", SyntaxWarning)): exec textwrap.dedent(''' def comp_args((a, b)): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -4,9 +4,9 @@ import inspect import datetime -from test.test_support import is_jython, run_unittest, _check_py3k_warnings +from test.test_support import is_jython, run_unittest, check_py3k_warnings -with _check_py3k_warnings( +with check_py3k_warnings( ("tuple parameter unpacking has been removed", SyntaxWarning), quiet=True): from test import inspect_fodder as mod @@ -385,7 +385,7 @@ @na_for_jython def test_getargspec_sublistofone(self): - with _check_py3k_warnings( + with check_py3k_warnings( ("tuple parameter unpacking has been removed", SyntaxWarning), ("parenthesized argument names are invalid", SyntaxWarning)): exec 'def sublistOfOne((foo,)): return 1' diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -2,7 +2,7 @@ import unittest from test.test_support import run_unittest, TESTFN, unlink, have_unicode, \ - _check_py3k_warnings + check_py3k_warnings # Test result of triple loop (too big to inline) TRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2), @@ -401,7 +401,7 @@ for i in range(5)] # Deprecated map(None, ...) - with _check_py3k_warnings(): + with check_py3k_warnings(): self.assertEqual(map(None, SequenceClass(5)), range(5)) self.assertEqual(map(None, d), d.keys()) self.assertEqual(map(None, d, @@ -504,7 +504,7 @@ # Test reduces()'s use of iterators. def test_deprecated_builtin_reduce(self): - with _check_py3k_warnings(): + with check_py3k_warnings(): self._test_builtin_reduce() def _test_builtin_reduce(self): diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py --- a/Lib/test/test_operator.py +++ b/Lib/test/test_operator.py @@ -195,7 +195,7 @@ pass def check(self, o, v): self.assertEqual(operator.isCallable(o), v) - with test_support._check_py3k_warnings(): + with test_support.check_py3k_warnings(): self.assertEqual(callable(o), v) check(self, 4, 0) check(self, operator.isCallable, 1) diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -1,5 +1,5 @@ import unittest -from test.test_support import (check_syntax_error, _check_py3k_warnings, +from test.test_support import (check_syntax_error, check_py3k_warnings, check_warnings, is_jython, run_unittest) @@ -330,7 +330,7 @@ self.assertEqual(makeReturner2(a=11)()['a'], 11) - with _check_py3k_warnings(("tuple parameter unpacking has been removed", + with check_py3k_warnings(("tuple parameter unpacking has been removed", SyntaxWarning)): exec """\ def makeAddPair((a, b)): diff --git a/Lib/test/test_univnewlines.py b/Lib/test/test_univnewlines.py --- a/Lib/test/test_univnewlines.py +++ b/Lib/test/test_univnewlines.py @@ -82,7 +82,7 @@ def test_execfile(self): namespace = {} - with test_support._check_py3k_warnings(): + with test_support.check_py3k_warnings(): execfile(test_support.TESTFN, namespace) func = namespace['line3'] self.assertEqual(func.func_code.co_firstlineno, 3) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -192,7 +192,7 @@ p.append(12) self.assertEqual(len(L), 1) self.failUnless(p, "proxy for non-empty UserList should be true") - with test_support._check_py3k_warnings(): + with test_support.check_py3k_warnings(): p[:] = [2, 3] self.assertEqual(len(L), 2) self.assertEqual(len(p), 2) @@ -207,7 +207,7 @@ ## self.assertEqual(repr(L2), repr(p2)) L3 = UserList.UserList(range(10)) p3 = weakref.proxy(L3) - with test_support._check_py3k_warnings(): + with test_support.check_py3k_warnings(): self.assertEqual(L3[:], p3[:]) self.assertEqual(L3[5:], p3[5:]) self.assertEqual(L3[:5], p3[:5]) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 18:45:53 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 18:45:53 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Added_and_slightly_tweaked_t?= =?utf8?q?empfile_from=3A?= Message-ID: http://hg.python.org/jython/rev/60f3975016ff changeset: 6451:60f3975016ff user: Frank Wierzbicki date: Wed Mar 21 10:45:37 2012 -0700 summary: Added and slightly tweaked tempfile from: http://hg.python.org/cpython/Lib/tempfile.py at 22db03646d9b files: Lib/tempfile.py | 622 ++++++++++++++++++++++++++++++++++++ 1 files changed, 622 insertions(+), 0 deletions(-) diff --git a/Lib/tempfile.py b/Lib/tempfile.py new file mode 100644 --- /dev/null +++ b/Lib/tempfile.py @@ -0,0 +1,622 @@ +"""Temporary files. + +This module provides generic, low- and high-level interfaces for +creating temporary files and directories. The interfaces listed +as "safe" just below can be used without fear of race conditions. +Those listed as "unsafe" cannot, and are provided for backward +compatibility only. + +This module also provides some data items to the user: + + TMP_MAX - maximum number of names that will be tried before + giving up. + template - the default prefix for all temporary names. + You may change this to control the default prefix. + tempdir - If this is set to a string before the first use of + any routine from this module, it will be considered as + another candidate location to store temporary files. +""" + +__all__ = [ + "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces + "SpooledTemporaryFile", + "mkstemp", "mkdtemp", # low level safe interfaces + "mktemp", # deprecated unsafe interface + "TMP_MAX", "gettempprefix", # constants + "tempdir", "gettempdir" + ] + + +# Imports. + +import os as _os +import errno as _errno +from random import Random as _Random + +import platform + +is_jython = platform.python_implementation() == "Jython" + +try: + from cStringIO import StringIO as _StringIO +except ImportError: + from StringIO import StringIO as _StringIO + +try: + import fcntl as _fcntl +except ImportError: + def _set_cloexec(fd): + pass +else: + def _set_cloexec(fd): + try: + flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) + except IOError: + pass + else: + # flags read successfully, modify + flags |= _fcntl.FD_CLOEXEC + _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) + + +try: + import thread as _thread +except ImportError: + import dummy_thread as _thread +_allocate_lock = _thread.allocate_lock + +_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL +if hasattr(_os, 'O_NOINHERIT'): + _text_openflags |= _os.O_NOINHERIT +if hasattr(_os, 'O_NOFOLLOW'): + _text_openflags |= _os.O_NOFOLLOW + +_bin_openflags = _text_openflags +if hasattr(_os, 'O_BINARY'): + _bin_openflags |= _os.O_BINARY + +if hasattr(_os, 'TMP_MAX'): + TMP_MAX = _os.TMP_MAX +else: + TMP_MAX = 10000 + +template = "tmp" + +# Internal routines. + +_once_lock = _allocate_lock() + +if hasattr(_os, "lstat"): + _stat = _os.lstat +elif hasattr(_os, "stat"): + _stat = _os.stat +else: + # Fallback. All we need is something that raises os.error if the + # file doesn't exist. + def _stat(fn): + try: + f = open(fn) + except IOError: + raise _os.error + f.close() + +def _exists(fn): + try: + _stat(fn) + except _os.error: + return False + else: + return True + +class _RandomNameSequence: + """An instance of _RandomNameSequence generates an endless + sequence of unpredictable strings which can safely be incorporated + into file names. Each string is six characters long. Multiple + threads can safely use the same instance at the same time. + + _RandomNameSequence is an iterator.""" + + characters = ("abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "0123456789_") + + def __init__(self): + self.mutex = _allocate_lock() + self.normcase = _os.path.normcase + + @property + def rng(self): + if is_jython: + #A JVM run cannot determine or change its pid so dummy this. + cur_pid = 1 + else: + cur_pid = _os.getpid() + + if cur_pid != getattr(self, '_rng_pid', None): + self._rng = _Random() + self._rng_pid = cur_pid + return self._rng + + def __iter__(self): + return self + + def next(self): + m = self.mutex + c = self.characters + choose = self.rng.choice + + m.acquire() + try: + letters = [choose(c) for dummy in "123456"] + finally: + m.release() + + return self.normcase(''.join(letters)) + +def _candidate_tempdir_list(): + """Generate a list of candidate temporary directories which + _get_default_tempdir will try.""" + + dirlist = [] + + # First, try the environment. + for envname in 'TMPDIR', 'TEMP', 'TMP': + dirname = _os.getenv(envname) + if dirname: dirlist.append(dirname) + + # Failing that, try OS-specific locations. + if _os.name == 'riscos': + dirname = _os.getenv('Wimp$ScrapDir') + if dirname: dirlist.append(dirname) + elif _os.name == 'nt': + dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) + else: + dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) + + # As a last resort, the current directory. + try: + dirlist.append(_os.getcwd()) + except (AttributeError, _os.error): + dirlist.append(_os.curdir) + + return dirlist + +def _get_default_tempdir(): + """Calculate the default directory to use for temporary files. + This routine should be called exactly once. + + We determine whether or not a candidate temp dir is usable by + trying to create and write to a file in that directory. If this + is successful, the test file is deleted. To prevent denial of + service, the name of the test file must be randomized.""" + + namer = _RandomNameSequence() + dirlist = _candidate_tempdir_list() + flags = _text_openflags + + for dir in dirlist: + if dir != _os.curdir: + dir = _os.path.normcase(_os.path.abspath(dir)) + # Try only a few names per directory. + for seq in xrange(100): + name = namer.next() + filename = _os.path.join(dir, name) + try: + fd = _os.open(filename, flags, 0600) + fp = _os.fdopen(fd, 'w') + fp.write('blat') + fp.close() + _os.unlink(filename) + del fp, fd + return dir + except (OSError, IOError), e: + if e[0] != _errno.EEXIST: + break # no point trying more names in this directory + pass + raise IOError, (_errno.ENOENT, + ("No usable temporary directory found in %s" % dirlist)) + +_name_sequence = None + +def _get_candidate_names(): + """Common setup sequence for all user-callable interfaces.""" + + global _name_sequence + if _name_sequence is None: + _once_lock.acquire() + try: + if _name_sequence is None: + _name_sequence = _RandomNameSequence() + finally: + _once_lock.release() + return _name_sequence + + +def _mkstemp_inner(dir, pre, suf, flags): + """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" + + names = _get_candidate_names() + + for seq in xrange(TMP_MAX): + name = names.next() + file = _os.path.join(dir, pre + name + suf) + try: + fd = _os.open(file, flags, 0600) + _set_cloexec(fd) + return (fd, _os.path.abspath(file)) + except OSError, e: + if e.errno == _errno.EEXIST: + continue # try again + raise + + raise IOError, (_errno.EEXIST, "No usable temporary file name found") + + +# User visible interfaces. + +def gettempprefix(): + """Accessor for tempdir.template.""" + return template + +tempdir = None + +def gettempdir(): + """Accessor for tempfile.tempdir.""" + global tempdir + if tempdir is None: + _once_lock.acquire() + try: + if tempdir is None: + tempdir = _get_default_tempdir() + finally: + _once_lock.release() + return tempdir + +def mkstemp(suffix="", prefix=template, dir=None, text=False): + """User-callable function to create and return a unique temporary + file. The return value is a pair (fd, name) where fd is the + file descriptor returned by os.open, and name is the filename. + + If 'suffix' is specified, the file name will end with that suffix, + otherwise there will be no suffix. + + If 'prefix' is specified, the file name will begin with that prefix, + otherwise a default prefix is used. + + If 'dir' is specified, the file will be created in that directory, + otherwise a default directory is used. + + If 'text' is specified and true, the file is opened in text + mode. Else (the default) the file is opened in binary mode. On + some operating systems, this makes no difference. + + The file is readable and writable only by the creating user ID. + If the operating system uses permission bits to indicate whether a + file is executable, the file is executable by no one. The file + descriptor is not inherited by children of this process. + + Caller is responsible for deleting the file when done with it. + """ + + if dir is None: + dir = gettempdir() + + if text: + flags = _text_openflags + else: + flags = _bin_openflags + + return _mkstemp_inner(dir, prefix, suffix, flags) + + +def mkdtemp(suffix="", prefix=template, dir=None): + """User-callable function to create and return a unique temporary + directory. The return value is the pathname of the directory. + + Arguments are as for mkstemp, except that the 'text' argument is + not accepted. + + The directory is readable, writable, and searchable only by the + creating user. + + Caller is responsible for deleting the directory when done with it. + """ + + if dir is None: + dir = gettempdir() + + names = _get_candidate_names() + + for seq in xrange(TMP_MAX): + name = names.next() + file = _os.path.join(dir, prefix + name + suffix) + try: + _os.mkdir(file, 0700) + return file + except OSError, e: + if e.errno == _errno.EEXIST: + continue # try again + raise + + raise IOError, (_errno.EEXIST, "No usable temporary directory name found") + +def mktemp(suffix="", prefix=template, dir=None): + """User-callable function to return a unique temporary file name. The + file is not created. + + Arguments are as for mkstemp, except that the 'text' argument is + not accepted. + + This function is unsafe and should not be used. The file name + refers to a file that did not exist at some point, but by the time + you get around to creating it, someone else may have beaten you to + the punch. + """ + +## from warnings import warn as _warn +## _warn("mktemp is a potential security risk to your program", +## RuntimeWarning, stacklevel=2) + + if dir is None: + dir = gettempdir() + + names = _get_candidate_names() + for seq in xrange(TMP_MAX): + name = names.next() + file = _os.path.join(dir, prefix + name + suffix) + if not _exists(file): + return file + + raise IOError, (_errno.EEXIST, "No usable temporary filename found") + + +class _TemporaryFileWrapper: + """Temporary file wrapper + + This class provides a wrapper around files opened for + temporary use. In particular, it seeks to automatically + remove the file when it is no longer needed. + """ + + def __init__(self, file, name, delete=True): + self.file = file + self.name = name + self.close_called = False + self.delete = delete + + def __getattr__(self, name): + # Attribute lookups are delegated to the underlying file + # and cached for non-numeric results + # (i.e. methods are cached, closed and friends are not) + file = self.__dict__['file'] + a = getattr(file, name) + if not issubclass(type(a), type(0)): + setattr(self, name, a) + return a + + # The underlying __enter__ method returns the wrong object + # (self.file) so override it to return the wrapper + def __enter__(self): + self.file.__enter__() + return self + + # NT provides delete-on-close as a primitive, so we don't need + # the wrapper to do anything special. We still use it so that + # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. + if _os.name != 'nt': + # Cache the unlinker so we don't get spurious errors at + # shutdown when the module-level "os" is None'd out. Note + # that this must be referenced as self.unlink, because the + # name TemporaryFileWrapper may also get None'd out before + # __del__ is called. + unlink = _os.unlink + + def close(self): + if not self.close_called: + self.close_called = True + self.file.close() + if self.delete: + self.unlink(self.name) + + def __del__(self): + self.close() + + # Need to trap __exit__ as well to ensure the file gets + # deleted when used in a with statement + def __exit__(self, exc, value, tb): + result = self.file.__exit__(exc, value, tb) + self.close() + return result + else: + def __exit__(self, exc, value, tb): + self.file.__exit__(exc, value, tb) + + +def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="", + prefix=template, dir=None, delete=True): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to os.fdopen (default "w+b"). + 'bufsize' -- the buffer size argument to os.fdopen (default -1). + 'delete' -- whether the file is deleted on close (default True). + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface; the name of the file + is accessible as file.name. The file will be automatically deleted + when it is closed unless the 'delete' argument is set to False. + """ + + if dir is None: + dir = gettempdir() + + if 'b' in mode: + flags = _bin_openflags + else: + flags = _text_openflags + + # Setting O_TEMPORARY in the flags causes the OS to delete + # the file when it is closed. This is only supported by Windows. + if _os.name == 'nt' and delete: + flags |= _os.O_TEMPORARY + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) + file = _os.fdopen(fd, mode, bufsize) + return _TemporaryFileWrapper(file, name, delete) + +if _os.name != 'posix' or _os.sys.platform == 'cygwin': + # On non-POSIX and Cygwin systems, assume that we cannot unlink a file + # while it is open. + TemporaryFile = NamedTemporaryFile + +else: + def TemporaryFile(mode='w+b', bufsize=-1, suffix="", + prefix=template, dir=None): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to os.fdopen (default "w+b"). + 'bufsize' -- the buffer size argument to os.fdopen (default -1). + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface. The file has no + name, and will cease to exist when it is closed. + """ + + if dir is None: + dir = gettempdir() + + if 'b' in mode: + flags = _bin_openflags + else: + flags = _text_openflags + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) + try: + _os.unlink(name) + return _os.fdopen(fd, mode, bufsize) + except: + _os.close(fd) + raise + +class SpooledTemporaryFile: + """Temporary file wrapper, specialized to switch from + StringIO to a real file when it exceeds a certain size or + when a fileno is needed. + """ + _rolled = False + + def __init__(self, max_size=0, mode='w+b', bufsize=-1, + suffix="", prefix=template, dir=None): + self._file = _StringIO() + self._max_size = max_size + self._rolled = False + self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir) + + def _check(self, file): + if self._rolled: return + max_size = self._max_size + if max_size and file.tell() > max_size: + self.rollover() + + def rollover(self): + if self._rolled: return + file = self._file + newfile = self._file = TemporaryFile(*self._TemporaryFileArgs) + del self._TemporaryFileArgs + + newfile.write(file.getvalue()) + newfile.seek(file.tell(), 0) + + self._rolled = True + + # The method caching trick from NamedTemporaryFile + # won't work here, because _file may change from a + # _StringIO instance to a real file. So we list + # all the methods directly. + + # Context management protocol + def __enter__(self): + if self._file.closed: + raise ValueError("Cannot enter context with closed file") + return self + + def __exit__(self, exc, value, tb): + self._file.close() + + # file protocol + def __iter__(self): + return self._file.__iter__() + + def close(self): + self._file.close() + + @property + def closed(self): + return self._file.closed + + @property + def encoding(self): + return self._file.encoding + + def fileno(self): + self.rollover() + return self._file.fileno() + + def flush(self): + self._file.flush() + + def isatty(self): + return self._file.isatty() + + @property + def mode(self): + return self._file.mode + + @property + def name(self): + return self._file.name + + @property + def newlines(self): + return self._file.newlines + + def next(self): + return self._file.next + + def read(self, *args): + return self._file.read(*args) + + def readline(self, *args): + return self._file.readline(*args) + + def readlines(self, *args): + return self._file.readlines(*args) + + def seek(self, *args): + self._file.seek(*args) + + @property + def softspace(self): + return self._file.softspace + + def tell(self): + return self._file.tell() + + def truncate(self): + self._file.truncate() + + def write(self, s): + file = self._file + rv = file.write(s) + self._check(file) + return rv + + def writelines(self, iterable): + file = self._file + rv = file.writelines(iterable) + self._check(file) + return rv + + def xreadlines(self, *args): + return self._file.xreadlines(*args) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 18:49:27 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Wed, 21 Mar 2012 18:49:27 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Be_careful_with_exported_nam?= =?utf8?q?es_as_test=5Ftempfile_requires=2E?= Message-ID: http://hg.python.org/jython/rev/9a4a8a546145 changeset: 6452:9a4a8a546145 user: Frank Wierzbicki date: Wed Mar 21 10:49:18 2012 -0700 summary: Be careful with exported names as test_tempfile requires. files: Lib/tempfile.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/tempfile.py b/Lib/tempfile.py --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -33,9 +33,10 @@ import errno as _errno from random import Random as _Random -import platform +import platform as _platform -is_jython = platform.python_implementation() == "Jython" +_is_jython = _platform.python_implementation() == "Jython" + try: from cStringIO import StringIO as _StringIO @@ -126,7 +127,7 @@ @property def rng(self): - if is_jython: + if _is_jython: #A JVM run cannot determine or change its pid so dummy this. cur_pid = 1 else: -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 19:29:54 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 19:29:54 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_IntelliJ_IDEA_code_style_set?= =?utf8?q?tings=2E?= Message-ID: http://hg.python.org/jython/rev/0fcf1066fecd changeset: 6453:0fcf1066fecd user: Nicholas Riley date: Thu Mar 15 11:37:21 2012 -0400 summary: IntelliJ IDEA code style settings. files: .idea/codeStyleSettings.xml | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,16 @@ + + + + + + + -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:10:02 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:10:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_Python_issue_6089=3A_Onl?= =?utf8?b?eSAnLicgb3IgJ1snIG1heSBmb2xsb3cgJ10nIGluIGZvcm1hdCBmaWVsZCBzcGVj?= =?utf8?q?ifier=2E?= Message-ID: http://hg.python.org/jython/rev/8689a050db18 changeset: 6454:8689a050db18 user: Nicholas Riley date: Wed Mar 21 15:41:56 2012 -0400 summary: Fix Python issue 6089: Only '.' or '[' may follow ']' in format field specifier. http://bugs.python.org/issue6089 files: src/org/python/core/stringlib/FieldNameIterator.java | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/stringlib/FieldNameIterator.java b/src/org/python/core/stringlib/FieldNameIterator.java --- a/src/org/python/core/stringlib/FieldNameIterator.java +++ b/src/org/python/core/stringlib/FieldNameIterator.java @@ -88,6 +88,8 @@ parseItemChunk(chunk); } else if (markup.charAt(index) == '.') { parseAttrChunk(chunk); + } else { + throw new IllegalArgumentException("Only '.' or '[' may follow ']' in format field specifier"); } return chunk; } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:10:02 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:10:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Implement_PEP_378_-_format_s?= =?utf8?q?pecifier_for_thousands_separator=2E?= Message-ID: http://hg.python.org/jython/rev/2977c0028748 changeset: 6455:2977c0028748 user: Nicholas Riley date: Wed Mar 21 15:47:34 2012 -0400 summary: Implement PEP 378 - format specifier for thousands separator. Note that this doesn't work with floating point formats yet because __format__ isn't implemented for floats (see http://bugs.jython.org/issue1718). files: src/org/python/core/stringlib/InternalFormatSpec.java | 1 + src/org/python/core/stringlib/InternalFormatSpecParser.java | 8 ++++++++ tests/java/org/python/core/StringFormatTest.java | 5 +++++ 3 files changed, 14 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/stringlib/InternalFormatSpec.java b/src/org/python/core/stringlib/InternalFormatSpec.java --- a/src/org/python/core/stringlib/InternalFormatSpec.java +++ b/src/org/python/core/stringlib/InternalFormatSpec.java @@ -9,6 +9,7 @@ public boolean alternate; public char sign; public int width = -1; + public boolean thousands_separators; public int precision = -1; public char type; diff --git a/src/org/python/core/stringlib/InternalFormatSpecParser.java b/src/org/python/core/stringlib/InternalFormatSpecParser.java --- a/src/org/python/core/stringlib/InternalFormatSpecParser.java +++ b/src/org/python/core/stringlib/InternalFormatSpecParser.java @@ -48,6 +48,10 @@ index++; } result.width = getInteger(); + if (isAt(",")) { + result.thousands_separators = true; + index++; + } if (isAt(".")) { index++; result.precision = getInteger(); @@ -61,6 +65,10 @@ throw new IllegalArgumentException("Invalid conversion specification"); } } + if (result.thousands_separators) { + if ("defgEG%F\0".indexOf(result.type) == -1) + throw new IllegalArgumentException("Cannot specify ',' with '" + result.type + "'."); + } return result; } diff --git a/tests/java/org/python/core/StringFormatTest.java b/tests/java/org/python/core/StringFormatTest.java --- a/tests/java/org/python/core/StringFormatTest.java +++ b/tests/java/org/python/core/StringFormatTest.java @@ -72,6 +72,11 @@ spec.type = 'b'; assertEquals("1111011", PyInteger.formatIntOrLong(123, spec)); + spec.thousands_separators = true; + spec.type = 'd'; + assertEquals("1,234", PyInteger.formatIntOrLong(1234, spec)); + spec.thousands_separators = false; + spec.alternate = true; spec.type = 'o'; assertEquals("0o173", PyInteger.formatIntOrLong(123, spec)); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:10:02 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:10:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Make_output_on_command_line_?= =?utf8?q?errors_more_consistent_with_CPython=2E?= Message-ID: http://hg.python.org/jython/rev/71ab84f0b096 changeset: 6456:71ab84f0b096 user: Nicholas Riley date: Wed Mar 21 16:08:57 2012 -0400 summary: Make output on command line errors more consistent with CPython. files: src/org/python/util/jython.java | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/org/python/util/jython.java b/src/org/python/util/jython.java --- a/src/org/python/util/jython.java +++ b/src/org/python/util/jython.java @@ -68,6 +68,7 @@ "file : program read from script file\n" + "- : program read from stdin (default; interactive mode if a tty)\n" + "arg ... : arguments passed to program in sys.argv[1:]\n" + + "\n" + "Other environment variables:\n" + "JYTHONPATH: '" + File.pathSeparator + "'-separated list of directories prefixed to the default module\n" + @@ -143,8 +144,11 @@ System.err.println("Jython " + Version.PY_VERSION); System.exit(0); } - if (!opts.runCommand && !opts.runModule) { + if (opts.help) { System.err.println(usage); + } else if (!opts.runCommand && !opts.runModule) { + System.err.print(usageHeader); + System.err.println("Try `jython -h' for more information."); } int exitcode = opts.help ? 0 : -1; @@ -400,6 +404,11 @@ // continue } } + + private boolean argumentExpected(String arg) { + System.err.println("Argument expected for the " + arg + " option"); + return false; + } public boolean parse(String[] args) { int index = 0; @@ -444,10 +453,7 @@ } else if ((index + 1) < args.length) { command = args[++index]; } else { - System.err.println("Argument expected for the -c option"); - System.err.print(jython.usageHeader); - System.err.println("Try `jython -h' for more information."); - return false; + return argumentExpected(arg); } if (!fixInteractive) { interactive = false; @@ -489,10 +495,7 @@ } else if ((index + 1) < args.length) { moduleName = args[++index]; } else { - System.err.println("Argument expected for the -m option"); - System.err.print(jython.usageHeader); - System.err.println("Try `jython -h' for more information."); - return false; + return argumentExpected(arg); } if (!fixInteractive) { interactive = false; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:10:02 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:10:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Make_-W_work_like_-c_and_-m?= =?utf8?q?=2C_so_you_can_use_=27-Wd=27_rather_than_=27-W_d=27=2E?= Message-ID: http://hg.python.org/jython/rev/83e1da204ff0 changeset: 6457:83e1da204ff0 user: Nicholas Riley date: Wed Mar 21 16:09:40 2012 -0400 summary: Make -W work like -c and -m, so you can use '-Wd' rather than '-W d'. files: src/org/python/util/jython.java | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/src/org/python/util/jython.java b/src/org/python/util/jython.java --- a/src/org/python/util/jython.java +++ b/src/org/python/util/jython.java @@ -461,7 +461,13 @@ index++; break; } else if (arg.startsWith("-W")) { - warnoptions.add(args[++index]); + if (arg.length() > 2) { + warnoptions.add(arg.substring(2)); + } else if ((index + 1) < args.length) { + warnoptions.add(args[++index]); + } else { + return argumentExpected(arg); + } } else if (arg.equals("-C")) { encoding = args[++index]; setProperty("python.console.encoding", encoding); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:14:27 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:14:27 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_Python_issue_7994=3A_obj?= =?utf8?q?ect=2E=5F=5Fformat=5F=5F_should_reject_format_strings=2E?= Message-ID: http://hg.python.org/jython/rev/f1ee1288c03c changeset: 6458:f1ee1288c03c user: Nicholas Riley date: Wed Mar 21 16:14:19 2012 -0400 summary: Fix Python issue 7994: object.__format__ should reject format strings. http://bugs.python.org/issue7994 files: src/org/python/core/PyObject.java | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/PyObject.java b/src/org/python/core/PyObject.java --- a/src/org/python/core/PyObject.java +++ b/src/org/python/core/PyObject.java @@ -1716,6 +1716,8 @@ @ExposedMethod(doc = BuiltinDocs.object___format___doc) final PyObject object___format__(PyObject formatSpec) { + if (formatSpec != null && formatSpec instanceof PyString && !((PyString)formatSpec).getString().isEmpty()) + Py.warning(Py.PendingDeprecationWarning, "object.__format__ with a non-empty format string is deprecated"); return __str__().__format__(formatSpec); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:20:50 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:20:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_Python_issue_3382=3A_Mak?= =?utf8?b?ZSAnJUYnIGFuZCBmbG9hdC5fX2Zvcm1hdF9fKCdGJykgY29udmVydCByZXN1bHRz?= =?utf8?q?_to?= Message-ID: http://hg.python.org/jython/rev/74cae35a68b6 changeset: 6459:74cae35a68b6 user: Nicholas Riley date: Wed Mar 21 16:20:19 2012 -0400 summary: Fix Python issue 3382: Make '%F' and float.__format__('F') convert results to upper case. http://bugs.python.org/issue3382 Also implement uppercasing for %E and %G, which are fine in Python 2.5 but not in Jython 2.5. Note that the latter part of the issue is not fixed yet because __format__ isn't implemented for floats (see http://bugs.jython.org/issue1718). files: src/org/python/core/PyString.java | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java --- a/src/org/python/core/PyString.java +++ b/src/org/python/core/PyString.java @@ -3177,10 +3177,14 @@ case 'e': case 'E': string = formatFloatExponential(arg, c, false); + if (c == 'E') + string = string.toUpperCase(); break; case 'f': case 'F': string = formatFloatDecimal(asDouble(arg), false); + if (c == 'F') + string = string.toUpperCase(); break; case 'g': case 'G': @@ -3218,6 +3222,8 @@ precision--; string = formatFloatExponential(arg, (char)(c-2), !altFlag); } + if (c == 'G') + string = string.toUpperCase(); break; case 'c': fill = ' '; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:34:58 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:34:58 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Don=27t_overwrite_alignment_?= =?utf8?q?and_fill_char_in_format_spec=2E?= Message-ID: http://hg.python.org/jython/rev/baf6e4ab0cef changeset: 6460:baf6e4ab0cef user: Nicholas Riley date: Wed Mar 21 16:25:15 2012 -0400 summary: Don't overwrite alignment and fill char in format spec. files: src/org/python/core/stringlib/InternalFormatSpecParser.java | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/python/core/stringlib/InternalFormatSpecParser.java b/src/org/python/core/stringlib/InternalFormatSpecParser.java --- a/src/org/python/core/stringlib/InternalFormatSpecParser.java +++ b/src/org/python/core/stringlib/InternalFormatSpecParser.java @@ -42,9 +42,10 @@ result.alternate = true; index++; } - if (isAt("0")) { - result.align = '='; + if (result.fill_char == '\0' && isAt("0")) { result.fill_char = '0'; + if (result.align == '\0') + result.align = '='; index++; } result.width = getInteger(); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:34:58 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:34:58 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Implement_=27n=27_formatting?= =?utf8?q?_type_for_integers_=28=231718=29_using_Java=27s_localized?= Message-ID: http://hg.python.org/jython/rev/6eca8f634134 changeset: 6461:6eca8f634134 user: Nicholas Riley date: Wed Mar 21 16:27:56 2012 -0400 summary: Implement 'n' formatting type for integers (#1718) using Java's localized number formatting. Also some PEP 378 changes I forgot to commit earlier. files: src/org/python/core/PyInteger.java | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/org/python/core/PyInteger.java b/src/org/python/core/PyInteger.java --- a/src/org/python/core/PyInteger.java +++ b/src/org/python/core/PyInteger.java @@ -992,8 +992,13 @@ radix = 2; } - // TODO locale-specific formatting for 'n' - if (value instanceof BigInteger) { + if (spec.type == 'n') { + strValue = NumberFormat.getNumberInstance().format(value); + } else if (spec.thousands_separators) { + NumberFormat format = NumberFormat.getNumberInstance(Locale.US); + format.setGroupingUsed(true); + strValue = format.format(value); + } else if (value instanceof BigInteger) { strValue = ((BigInteger) value).toString(radix); } else { strValue = Integer.toString((Integer) value, radix); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:34:59 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:34:59 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_More_PEP_3101_work_and_relat?= =?utf8?q?ed_changes_=28=231718=29=2E?= Message-ID: http://hg.python.org/jython/rev/78c49afd03c9 changeset: 6462:78c49afd03c9 user: Nicholas Riley date: Wed Mar 21 16:34:52 2012 -0400 summary: More PEP 3101 work and related changes (#1718). - Allow auto-numbered replacement fields in format strings (http://bugs.python.org/issue5237). - Use 'nan', 'inf' and '-inf', not Unicode equivalents produced by Java number formatters. - Limit recursion level for recursive format specs. - Check some more error conditions. All of test_str should pass now except the tests which require the as-yet-unimplemented float/datetime __format__. files: src/org/python/core/PyFloat.java | 7 +- src/org/python/core/PyString.java | 81 ++++++--- src/org/python/core/stringlib/MarkupIterator.java | 38 ++++ 3 files changed, 93 insertions(+), 33 deletions(-) diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java --- a/src/org/python/core/PyFloat.java +++ b/src/org/python/core/PyFloat.java @@ -122,9 +122,12 @@ } private String formatDouble(int precision) { - if (Double.isNaN(getValue())) { + if (Double.isNaN(value)) return "nan"; - } + else if (value == Double.NEGATIVE_INFINITY) + return "-inf"; + else if (value == Double.POSITIVE_INFINITY) + return "inf"; String result = String.format("%%.%dg", precision); result = Py.newString(result).__mod__(this).toString(); diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java --- a/src/org/python/core/PyString.java +++ b/src/org/python/core/PyString.java @@ -13,6 +13,8 @@ import org.python.expose.MethodType; import java.math.BigInteger; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; /** * A builtin python string. @@ -2549,15 +2551,15 @@ @ExposedMethod(doc = BuiltinDocs.str_format_doc) final PyObject str_format(PyObject[] args, String[] keywords) { try { - return new PyString(buildFormattedString(getString(), args, keywords)); + return new PyString(buildFormattedString(getString(), args, keywords, null)); } catch (IllegalArgumentException e) { throw Py.ValueError(e.getMessage()); } } - private String buildFormattedString(String value, PyObject[] args, String[] keywords) { + private String buildFormattedString(String value, PyObject[] args, String[] keywords, MarkupIterator enclosingIterator) { StringBuilder result = new StringBuilder(); - MarkupIterator it = new MarkupIterator(value); + MarkupIterator it = new MarkupIterator(value, enclosingIterator); while (true) { MarkupIterator.Chunk chunk = it.nextChunk(); if (chunk == null) { @@ -2565,32 +2567,29 @@ } result.append(chunk.literalText); if (chunk.fieldName.length() > 0) { - outputMarkup(result, chunk, args, keywords); + PyObject fieldObj = getFieldObject(chunk.fieldName, args, keywords); + if (fieldObj == null) { + continue; + } + if ("r".equals(chunk.conversion)) { + fieldObj = fieldObj.__repr__(); + } else if ("s".equals(chunk.conversion)) { + fieldObj = fieldObj.__str__(); + } else if (chunk.conversion != null) { + throw Py.ValueError("Unknown conversion specifier " + chunk.conversion); + } + String formatSpec = chunk.formatSpec; + if (chunk.formatSpecNeedsExpanding) { + if (enclosingIterator != null) // PEP 3101 says only 2 levels + throw Py.ValueError("Max string recursion exceeded"); + formatSpec = buildFormattedString(formatSpec, args, keywords, it); + } + renderField(fieldObj, formatSpec, result); } } return result.toString(); } - private void outputMarkup(StringBuilder result, MarkupIterator.Chunk chunk, - PyObject[] args, String[] keywords) { - PyObject fieldObj = getFieldObject(chunk.fieldName, args, keywords); - if (fieldObj == null) { - return; - } - if ("r".equals(chunk.conversion)) { - fieldObj = fieldObj.__repr__(); - } else if ("s".equals(chunk.conversion)) { - fieldObj = fieldObj.__str__(); - } else if (chunk.conversion != null) { - throw Py.ValueError("Unknown conversion specifier " + chunk.conversion); - } - String formatSpec = chunk.formatSpec; - if (chunk.formatSpecNeedsExpanding) { - formatSpec = buildFormattedString(formatSpec, args, keywords); - } - renderField(fieldObj, formatSpec, result); - } - private PyObject getFieldObject(String fieldName, PyObject[] args, String[] keywords) { FieldNameIterator iterator = new FieldNameIterator(fieldName); Object head = iterator.head(); @@ -2672,6 +2671,12 @@ * @return the result of the formatting */ public static String formatString(String text, InternalFormatSpec spec) { + if (spec.sign != '\0') + throw new IllegalArgumentException("Sign not allowed in string format specifier"); + if (spec.alternate) + throw new IllegalArgumentException("Alternate form (#) not allowed in string format specifier"); + if (spec.align == '=') + throw new IllegalArgumentException("'=' alignment not allowed in string format specifier"); if (spec.precision >= 0 && text.length() > spec.precision) { text = text.substring(0, spec.precision); } @@ -2957,10 +2962,23 @@ } } + static class DecimalFormatTemplate { + static DecimalFormat template; + static { + template = new DecimalFormat("#,##0.#####"); + DecimalFormatSymbols symbols = template.getDecimalFormatSymbols(); + symbols.setNaN("nan"); + symbols.setInfinity("inf"); + template.setDecimalFormatSymbols(symbols); + template.setGroupingUsed(false); + } + } + private static final DecimalFormat getDecimalFormat() { + return (DecimalFormat)DecimalFormatTemplate.template.clone(); + } + private String formatFloatDecimal(double v, boolean truncate) { checkPrecision("decimal"); - java.text.NumberFormat numberFormat = java.text.NumberFormat.getInstance( - java.util.Locale.US); int prec = precision; if (prec == -1) prec = 6; @@ -2968,11 +2986,12 @@ v = -v; negative = true; } - numberFormat.setMaximumFractionDigits(prec); - numberFormat.setMinimumFractionDigits(truncate ? 0 : prec); - numberFormat.setGroupingUsed(false); - - String ret = numberFormat.format(v); + + DecimalFormat decimalFormat = getDecimalFormat(); + decimalFormat.setMaximumFractionDigits(prec); + decimalFormat.setMinimumFractionDigits(truncate ? 0 : prec); + + String ret = decimalFormat.format(v); return ret; } diff --git a/src/org/python/core/stringlib/MarkupIterator.java b/src/org/python/core/stringlib/MarkupIterator.java --- a/src/org/python/core/stringlib/MarkupIterator.java +++ b/src/org/python/core/stringlib/MarkupIterator.java @@ -18,9 +18,18 @@ private final String markup; private int index; + private final FieldNumbering numbering; public MarkupIterator(String markup) { + this(markup, null); + } + + public MarkupIterator(String markup, MarkupIterator enclosingIterator) { this.markup = markup; + if (enclosingIterator != null) + numbering = enclosingIterator.numbering; + else + numbering = new FieldNumbering(); } @Override @@ -140,6 +149,17 @@ } else { result.fieldName = fieldMarkup; } + if (result.fieldName.isEmpty()) { + result.fieldName = numbering.nextAutomaticFieldNumber(); + return; + } + char c = result.fieldName.charAt(0); + if (c == '.' || c == '[') { + result.fieldName = numbering.nextAutomaticFieldNumber() + result.fieldName; + return; + } + if (Character.isDigit(c)) + numbering.useManualFieldNumbering(); } private int indexOfFirst(String s, int start, char c1, char c2) { @@ -154,6 +174,24 @@ return Math.min(i1, i2); } + static final class FieldNumbering { + private boolean manualFieldNumberSpecified; + private int automaticFieldNumber = 0; + + String nextAutomaticFieldNumber() { + if (manualFieldNumberSpecified) + throw new IllegalArgumentException("cannot switch from manual field specification to automatic field numbering"); + return Integer.toString(automaticFieldNumber++); + } + void useManualFieldNumbering() { + if (manualFieldNumberSpecified) + return; + if (automaticFieldNumber != 0) + throw new IllegalArgumentException("cannot switch from automatic field numbering to manual field specification"); + manualFieldNumberSpecified = true; + } + } + public static final class Chunk { public String literalText; public String fieldName; -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 21:36:54 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 21:36:54 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Fix_comment_typo=2E?= Message-ID: http://hg.python.org/jython/rev/e7e171b377c3 changeset: 6463:e7e171b377c3 user: Nicholas Riley date: Wed Mar 21 16:36:46 2012 -0400 summary: Fix comment typo. files: src/org/python/core/PyString.java | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java --- a/src/org/python/core/PyString.java +++ b/src/org/python/core/PyString.java @@ -3236,7 +3236,7 @@ } else { // Exponential precision is the number of digits after the decimal // point, whereas 'g' precision is the number of significant digits -- - // and expontential always provides one significant digit before the + // and exponential always provides one significant digit before the // decimal point precision--; string = formatFloatExponential(arg, (char)(c-2), !altFlag); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Wed Mar 21 22:02:05 2012 From: jython-checkins at python.org (nicholas.riley) Date: Wed, 21 Mar 2012 22:02:05 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Code_style_fixes=2E?= Message-ID: http://hg.python.org/jython/rev/18c409c93590 changeset: 6464:18c409c93590 user: Nicholas Riley date: Wed Mar 21 17:01:39 2012 -0400 summary: Code style fixes. files: .idea/codeStyleSettings.xml | 9 +++++ src/org/python/core/PyFloat.java | 7 ++- src/org/python/core/PyInteger.java | 2 + src/org/python/core/PyObject.java | 3 +- src/org/python/core/PyString.java | 9 +++- src/org/python/core/stringlib/InternalFormatSpecParser.java | 8 ++-- src/org/python/core/stringlib/MarkupIterator.java | 17 ++++++--- 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -3,7 +3,16 @@

Introduction to XSL

+ + + +
+

Overview +

+
    + +
  • 1.Intro
  • + +
  • 2.History
  • + +
  • 3.XSL Basics
  • + +
  • Lunch
  • + +
  • 4.An XML Data Model
  • + +
  • 5.XSL Patterns
  • + +
  • 6.XSL Templates
  • + +
  • 7.XSL Formatting Model +
  • + +
+ + + + + + +
+

Intro

+
    + +
  • Who am I?
  • + +
  • Who are you?
  • + +
  • Why are we here? +
  • + +
+ + + + + + +
+

History: XML and SGML

+
    + +
  • XML is a subset of SGML.
  • + +
  • SGML allows the separation of abstract content from formatting.
  • + +
  • Also one of XML's primary virtues (in the doc publishing domain). +
  • + +
+ + + + + + +
+

History: What are stylesheets?

+
    + +
  • Stylesheets specify the formatting of SGML/XML documents.
  • + +
  • Stylesheets put the "style" back into documents.
  • + +
  • New York Times content+NYT Stylesheet = NYT paper +
  • + +
+ + + + + + +
+

History: FOSI

+
    + +
  • FOSI: "Formatted Output Specification Instance" +
      +
    • MIL-STD-28001 +
    • + +
    • FOSI's are SGML documents +
    • + +
    • A stylesheet for another document +
    • +
  • + +
  • Obsolete but implemented... +
  • + +
+ + + + + diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -99,10 +99,12 @@ 'type(tb.tb_frame).f_locals') else: self.failIf(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals)) - if hasattr(types, 'MemberDescriptorType'): - self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days') - else: - self.failIf(inspect.ismemberdescriptor(datetime.timedelta.days)) + + #FIXME: not working in Jython: + #if hasattr(types, 'MemberDescriptorType'): + # self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days') + #else: + # self.failIf(inspect.ismemberdescriptor(datetime.timedelta.days)) def test_isroutine(self): self.assert_(inspect.isroutine(mod.spam)) diff --git a/Lib/test/test_jy_internals.py b/Lib/test/test_jy_internals.py --- a/Lib/test/test_jy_internals.py +++ b/Lib/test/test_jy_internals.py @@ -18,6 +18,7 @@ class MemoryLeakTests(unittest.TestCase): + @unittest.skip("FIXME: broken in 2.7.") def test_class_to_test_weakness(self): # regrtest for bug 1522, adapted from test code submitted by Matt Brinkley -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 22 23:05:50 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 22 Mar 2012 23:05:50 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_More_skips=2E?= Message-ID: http://hg.python.org/jython/rev/9fa31a949d2c changeset: 6482:9fa31a949d2c user: Frank Wierzbicki date: Thu Mar 22 15:05:43 2012 -0700 summary: More skips. files: Lib/test/regrtest.py | 1 + Lib/test/test_operator.py | 2 ++ Lib/test/test_os_jy.py | 2 ++ Lib/test/test_posixpath.py | 5 +++++ Lib/test/test_pprint.py | 1 + Lib/test/test_profilehooks.py | 2 ++ Lib/test/test_random.py | 3 +++ 7 files changed, 16 insertions(+), 0 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1264,6 +1264,7 @@ test_binascii test_distutils test_dumbdbm + test_pbcvm test_urllib2_localnet """ #Last group above should be re-evaluated before releasing 2.7. diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py --- a/Lib/test/test_operator.py +++ b/Lib/test/test_operator.py @@ -367,6 +367,7 @@ self.failIf(operator.is_not(a, b)) self.failUnless(operator.is_not(a,c)) + @unittest.skip("FIXME: broken") def test_attrgetter(self): class A: pass @@ -447,6 +448,7 @@ self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5')) self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data) + @unittest.skip("FIXME: broken") def test_methodcaller(self): self.assertRaises(TypeError, operator.methodcaller) class A: diff --git a/Lib/test/test_os_jy.py b/Lib/test/test_os_jy.py --- a/Lib/test/test_os_jy.py +++ b/Lib/test/test_os_jy.py @@ -18,10 +18,12 @@ def test_issue1727(self): os.stat(*(test_support.TESTFN,)) + @unittest.skip("FIXME: broken") def test_issue1755(self): os.remove(test_support.TESTFN) self.assertRaises(OSError, os.utime, test_support.TESTFN, None) + @unittest.skip("FIXME: broken") def test_issue1824(self): os.remove(test_support.TESTFN) self.assertRaises(OSError, os.link, diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -137,6 +137,7 @@ f.close() os.remove(test_support.TESTFN) + @unittest.skip("FIXME: broken") def test_islink(self): self.assertIs(posixpath.islink(test_support.TESTFN + "1"), False) f = open(test_support.TESTFN + "1", "wb") @@ -402,6 +403,7 @@ self.assertRaises(TypeError, posixpath.realpath) if hasattr(os, "symlink"): + @unittest.skip("FIXME: broken") def test_realpath_basic(self): # Basic operation. try: @@ -432,6 +434,7 @@ self.safe_remove(ABSTFN+"1") self.safe_remove(ABSTFN+"2") + @unittest.skip("FIXME: broken") def test_realpath_resolve_parents(self): # We also need to resolve any symlinks in the parents of a relative # path passed to realpath. E.g.: current working directory is @@ -451,6 +454,7 @@ self.safe_rmdir(ABSTFN + "/y") self.safe_rmdir(ABSTFN) + @unittest.skip("FIXME: broken") def test_realpath_resolve_before_normalizing(self): # Bug #990669: Symbolic links should be resolved before we # normalize the path. E.g.: if we have directories 'a', 'k' and 'y' @@ -478,6 +482,7 @@ self.safe_rmdir(ABSTFN + "/k") self.safe_rmdir(ABSTFN) + @unittest.skip("FIXME: broken") def test_realpath_resolve_first(self): # Bug #1213894: The first component of the path, if not absolute, # must be resolved too. diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -204,6 +204,7 @@ others.should.not.be: like.this}""" self.assertEqual(DottedPrettyPrinter().pformat(o), exp) + @unittest.skip("FIXME: broken") def test_set_reprs(self): self.assertEqual(pprint.pformat(set()), 'set()') self.assertEqual(pprint.pformat(set(range(3))), 'set([0, 1, 2])') diff --git a/Lib/test/test_profilehooks.py b/Lib/test/test_profilehooks.py --- a/Lib/test/test_profilehooks.py +++ b/Lib/test/test_profilehooks.py @@ -17,9 +17,11 @@ def tearDown(self): sys.setprofile(None) + @unittest.skip("FIXME: broken") def test_empty(self): assert sys.getprofile() == None + @unittest.skip("FIXME: broken") def test_setget(self): def fn(*args): pass diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -43,6 +43,7 @@ self.assertRaises(TypeError, self.gen.seed, 1, 2) self.assertRaises(TypeError, type(self.gen), []) + @unittest.skip("FIXME: broken") def test_jumpahead(self): self.gen.seed() state1 = self.gen.getstate() @@ -140,6 +141,7 @@ restoredseq = [newgen.random() for i in xrange(10)] self.assertEqual(origseq, restoredseq) + @unittest.skip("FIXME: broken") def test_bug_1727780(self): # verify that version-2-pickles can be loaded # fine, whether they are created on 32-bit or 64-bit @@ -496,6 +498,7 @@ g.random = x[:].pop; g.betavariate(3.0, 3.0) g.random = x[:].pop; g.triangular(0.0, 1.0, 1.0/3.0) + @unittest.skip("FIXME: broken") def test_avg_std(self): # Use integration to test distribution average and standard deviation. # Only works for distributions which do not consume variates in pairs -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 00:00:45 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 00:00:45 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_test=2Exml=2Eout_from_2?= =?utf8?b?LjUu?= Message-ID: http://hg.python.org/jython/rev/be2d3ae9f1be changeset: 6483:be2d3ae9f1be user: Frank Wierzbicki date: Thu Mar 22 15:08:59 2012 -0700 summary: Add test.xml.out from 2.5. files: Lib/test/test.xml.out | 115 ++++++++++++++++++++++++++++++ 1 files changed, 115 insertions(+), 0 deletions(-) diff --git a/Lib/test/test.xml.out b/Lib/test/test.xml.out new file mode 100644 --- /dev/null +++ b/Lib/test/test.xml.out @@ -0,0 +1,115 @@ + + +Introduction to XSL +

Introduction to XSL

+ + + +
+

Overview +

+
    + +
  • 1.Intro
  • + +
  • 2.History
  • + +
  • 3.XSL Basics
  • + +
  • Lunch
  • + +
  • 4.An XML Data Model
  • + +
  • 5.XSL Patterns
  • + +
  • 6.XSL Templates
  • + +
  • 7.XSL Formatting Model +
  • + +
+ + + + + + +
+

Intro

+
    + +
  • Who am I?
  • + +
  • Who are you?
  • + +
  • Why are we here? +
  • + +
+ + + + + + +
+

History: XML and SGML

+
    + +
  • XML is a subset of SGML.
  • + +
  • SGML allows the separation of abstract content from formatting.
  • + +
  • Also one of XML's primary virtues (in the doc publishing domain). +
  • + +
+ + + + + + +
+

History: What are stylesheets?

+
    + +
  • Stylesheets specify the formatting of SGML/XML documents.
  • + +
  • Stylesheets put the "style" back into documents.
  • + +
  • New York Times content+NYT Stylesheet = NYT paper +
  • + +
+ + + + + + +
+

History: FOSI

+
    + +
  • FOSI: "Formatted Output Specification Instance" +
      +
    • MIL-STD-28001 +
    • + +
    • FOSI's are SGML documents +
    • + +
    • A stylesheet for another document +
    • +
  • + +
  • Obsolete but implemented... +
  • + +
+ + + + + \ No newline at end of file -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 00:00:45 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 00:00:45 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_More_skips=2E?= Message-ID: http://hg.python.org/jython/rev/1ccddfe5a465 changeset: 6484:1ccddfe5a465 user: Frank Wierzbicki date: Thu Mar 22 16:00:37 2012 -0700 summary: More skips. files: Lib/test/regrtest.py | 1 + Lib/test/test_scope.py | 3 +++ Lib/test/test_seq_jy.py | 1 + Lib/test/test_socket.py | 5 +++++ 4 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1265,6 +1265,7 @@ test_distutils test_dumbdbm test_pbcvm + test_shutil test_urllib2_localnet """ #Last group above should be re-evaluated before releasing 2.7. diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -340,6 +340,7 @@ """ in locals() self.assertEqual(makeAddPair((1, 2))((100, 200)), (101,202)) + @unittest.skip("FIXME: broken") def testScopeOfGlobalStmt(self): # Examples posted by Samuele Pedroni to python-dev on 3/1/2001 @@ -492,6 +493,7 @@ del d['h'] self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6}) + @unittest.skip("FIXME: broken") def testLocalsClass(self): # This test verifies that calling locals() does not pollute # the local namespace of the class with free variables. Old @@ -638,6 +640,7 @@ f() # used to crash the interpreter... + @unittest.skip("FIXME: broken") def testGlobalInParallelNestedFunctions(self): # A symbol table bug leaked the global statement from one # function to other nested functions in the same block. diff --git a/Lib/test/test_seq_jy.py b/Lib/test/test_seq_jy.py --- a/Lib/test/test_seq_jy.py +++ b/Lib/test/test_seq_jy.py @@ -35,6 +35,7 @@ for type2test in self.types2test: self.assertTrue(type2test() in foo) + @unittest.skip("FIXME: broken") def test_seq_subclass_equality(self): # Various combinations of PyObject._eq, overriden Object.equals, # and cmp implementations diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1888,6 +1888,7 @@ self.failUnlessEqual(sockaddr.address.hostAddress, "127.0.0.1") self.failUnlessEqual(sockaddr.port, 80) + @unittest.skip("FIXME: broken") def testIPV6AddressesFromGetAddrInfo(self): addrinfo = socket.getaddrinfo("localhost", 80, socket.AF_INET6, socket.SOCK_STREAM, 0, 0) if not addrinfo and is_bsd: @@ -1899,6 +1900,7 @@ self.failUnless(sockaddr.address.hostAddress in ["::1", "0:0:0:0:0:0:0:1"]) self.failUnlessEqual(sockaddr.port, 80) + @unittest.skip("FIXME: broken") def testAddressesFrom2Tuple(self): for family, addr_tuple, jaddress_type, expected in [ (socket.AF_INET, ("localhost", 80), java.net.Inet4Address, ["127.0.0.1"]), @@ -1910,6 +1912,7 @@ self.failUnless(sockaddr.address.hostAddress in expected) self.failUnlessEqual(sockaddr.port, 80) + @unittest.skip("FIXME: broken") def testAddressesFrom4Tuple(self): for addr_tuple in [ ("localhost", 80), @@ -1922,6 +1925,7 @@ self.failUnlessEqual(sockaddr.address.scopeId, 0) self.failUnlessEqual(sockaddr.port, 80) + @unittest.skip("FIXME: broken") def testSpecialHostnames(self): for family, sock_type, flags, addr_tuple, expected in [ ( socket.AF_INET, None, 0, ("", 80), ["localhost"]), @@ -1933,6 +1937,7 @@ sockaddr = socket._get_jsockaddr(addr_tuple, family, sock_type, 0, flags) self.failUnless(sockaddr.hostName in expected, "_get_jsockaddr returned wrong hostname '%s' for special hostname '%s'(family=%d)" % (sockaddr.hostName, addr_tuple[0], family)) + @unittest.skip("FIXME: broken") def testNoneTo_get_jsockaddr(self): for family, flags, expected in [ ( socket.AF_INET, 0, ["localhost"]), -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 00:35:18 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 00:35:18 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Small_fix_for_=5Fstrptime=2C?= =?utf8?q?_some_skips=2E?= Message-ID: http://hg.python.org/jython/rev/7acec88d5337 changeset: 6485:7acec88d5337 user: Frank Wierzbicki date: Thu Mar 22 16:35:10 2012 -0700 summary: Small fix for _strptime, some skips. files: Lib/test/test_struct.py | 4 ++-- Lib/test/test_time.py | 1 + src/org/python/modules/time/Time.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -1,5 +1,4 @@ from test.test_support import TestFailed, verbose, verify, vereq, is_jython -import test.test_support import struct import array import warnings @@ -106,7 +105,8 @@ simple_err(struct.pack, 'iii', 3) simple_err(struct.pack, 'i', 3, 3, 3) simple_err(struct.pack, 'i', 'foo') -simple_err(struct.pack, 'P', 'foo') +if not is_jython: + simple_err(struct.pack, 'P', 'foo') simple_err(struct.unpack, 'd', 'flap') s = struct.pack('ii', 1, 2) simple_err(struct.unpack, 'iii', s) diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -125,6 +125,7 @@ except ValueError: self.fail('strptime failed on empty args.') + @unittest.skip("FIXME: broken") def test_asctime(self): time.asctime(time.gmtime(self.t)) self.assertRaises(TypeError, time.asctime, 0) diff --git a/src/org/python/modules/time/Time.java b/src/org/python/modules/time/Time.java --- a/src/org/python/modules/time/Time.java +++ b/src/org/python/modules/time/Time.java @@ -688,7 +688,7 @@ */ private static PyTuple pystrptime(String data_string, String format) { return (PyTuple) __builtin__.__import__("_strptime") - .__getattr__("strptime") + .__getattr__("_strptime") .__call__(Py.newUnicode(data_string), Py.newUnicode(format)); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 00:37:16 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 00:37:16 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Don=27t_try_to_disable_gc_on?= =?utf8?q?_Jython=2E?= Message-ID: http://hg.python.org/jython/rev/470044aae3a4 changeset: 6486:470044aae3a4 user: Frank Wierzbicki date: Thu Mar 22 16:37:09 2012 -0700 summary: Don't try to disable gc on Jython. files: Lib/test/test_trace.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -268,7 +268,8 @@ # deallocators may be traced as well. def setUp(self): self.using_gc = gc.isenabled() - gc.disable() + if not test_support.is_jython: + gc.disable() def tearDown(self): if self.using_gc: -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 00:55:48 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 00:55:48 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_from=3A?= Message-ID: http://hg.python.org/jython/rev/53bb7ad144d2 changeset: 6487:53bb7ad144d2 user: Frank Wierzbicki date: Thu Mar 22 16:55:40 2012 -0700 summary: from: http://hg.python.org/cpython/Lib/test/test_types.py at 22db03646d9b files: Lib/test/test_types.py | 968 +++++++++++++++++++++------- 1 files changed, 718 insertions(+), 250 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1,288 +1,756 @@ # Python test set -- part 6, built-in types -from test.test_support import * +from test.test_support import run_unittest, have_unicode, run_with_locale, \ + check_py3k_warnings +import unittest +import sys +import locale -print '6. Built-in types' +class TypesTests(unittest.TestCase): -print '6.1 Truth value testing' -if None: raise TestFailed, 'None is true instead of false' -if 0: raise TestFailed, '0 is true instead of false' -if 0L: raise TestFailed, '0L is true instead of false' -if 0.0: raise TestFailed, '0.0 is true instead of false' -if '': raise TestFailed, '\'\' is true instead of false' -if not 1: raise TestFailed, '1 is false instead of true' -if not 1L: raise TestFailed, '1L is false instead of true' -if not 1.0: raise TestFailed, '1.0 is false instead of true' -if not 'x': raise TestFailed, '\'x\' is false instead of true' -if not {'x': 1}: raise TestFailed, '{\'x\': 1} is false instead of true' -def f(): pass -class C: pass -import sys -x = C() -if not f: raise TestFailed, 'f is false instead of true' -if not C: raise TestFailed, 'C is false instead of true' -if not sys: raise TestFailed, 'sys is false instead of true' -if not x: raise TestFailed, 'x is false instead of true' + def test_truth_values(self): + if None: self.fail('None is true instead of false') + if 0: self.fail('0 is true instead of false') + if 0L: self.fail('0L is true instead of false') + if 0.0: self.fail('0.0 is true instead of false') + if '': self.fail('\'\' is true instead of false') + if not 1: self.fail('1 is false instead of true') + if not 1L: self.fail('1L is false instead of true') + if not 1.0: self.fail('1.0 is false instead of true') + if not 'x': self.fail('\'x\' is false instead of true') + if not {'x': 1}: self.fail('{\'x\': 1} is false instead of true') + def f(): pass + class C: pass + x = C() + if not f: self.fail('f is false instead of true') + if not C: self.fail('C is false instead of true') + if not sys: self.fail('sys is false instead of true') + if not x: self.fail('x is false instead of true') -print '6.2 Boolean operations' -if 0 or 0: raise TestFailed, '0 or 0 is true instead of false' -if 1 and 1: pass -else: raise TestFailed, '1 and 1 is false instead of true' -if not 1: raise TestFailed, 'not 1 is true instead of false' + def test_boolean_ops(self): + if 0 or 0: self.fail('0 or 0 is true instead of false') + if 1 and 1: pass + else: self.fail('1 and 1 is false instead of true') + if not 1: self.fail('not 1 is true instead of false') -print '6.3 Comparisons' -if 0 < 1 <= 1 == 1 >= 1 > 0 != 1: pass -else: raise TestFailed, 'int comparisons failed' -if 0L < 1L <= 1L == 1L >= 1L > 0L != 1L: pass -else: raise TestFailed, 'long int comparisons failed' -if 0.0 < 1.0 <= 1.0 == 1.0 >= 1.0 > 0.0 != 1.0: pass -else: raise TestFailed, 'float comparisons failed' -if '' < 'a' <= 'a' == 'a' < 'abc' < 'abd' < 'b': pass -else: raise TestFailed, 'string comparisons failed' -if None is None: pass -else: raise TestFailed, 'identity test failed' + def test_comparisons(self): + if 0 < 1 <= 1 == 1 >= 1 > 0 != 1: pass + else: self.fail('int comparisons failed') + if 0L < 1L <= 1L == 1L >= 1L > 0L != 1L: pass + else: self.fail('long int comparisons failed') + if 0.0 < 1.0 <= 1.0 == 1.0 >= 1.0 > 0.0 != 1.0: pass + else: self.fail('float comparisons failed') + if '' < 'a' <= 'a' == 'a' < 'abc' < 'abd' < 'b': pass + else: self.fail('string comparisons failed') + if None is None: pass + else: self.fail('identity test failed') -try: float('') -except ValueError: pass -else: raise TestFailed, "float('') didn't raise ValueError" + def test_float_constructor(self): + self.assertRaises(ValueError, float, '') + self.assertRaises(ValueError, float, '5\0') -try: float('5\0') -except ValueError: pass -else: raise TestFailed, "float('5\0') didn't raise ValueError" + def test_zero_division(self): + try: 5.0 / 0.0 + except ZeroDivisionError: pass + else: self.fail("5.0 / 0.0 didn't raise ZeroDivisionError") -try: 5.0 / 0.0 -except ZeroDivisionError: pass -else: raise TestFailed, "5.0 / 0.0 didn't raise ZeroDivisionError" + try: 5.0 // 0.0 + except ZeroDivisionError: pass + else: self.fail("5.0 // 0.0 didn't raise ZeroDivisionError") -try: 5.0 // 0.0 -except ZeroDivisionError: pass -else: raise TestFailed, "5.0 // 0.0 didn't raise ZeroDivisionError" + try: 5.0 % 0.0 + except ZeroDivisionError: pass + else: self.fail("5.0 % 0.0 didn't raise ZeroDivisionError") -try: 5.0 % 0.0 -except ZeroDivisionError: pass -else: raise TestFailed, "5.0 % 0.0 didn't raise ZeroDivisionError" + try: 5 / 0L + except ZeroDivisionError: pass + else: self.fail("5 / 0L didn't raise ZeroDivisionError") -try: 5 / 0L -except ZeroDivisionError: pass -else: raise TestFailed, "5 / 0L didn't raise ZeroDivisionError" + try: 5 // 0L + except ZeroDivisionError: pass + else: self.fail("5 // 0L didn't raise ZeroDivisionError") -try: 5 // 0L -except ZeroDivisionError: pass -else: raise TestFailed, "5 // 0L didn't raise ZeroDivisionError" + try: 5 % 0L + except ZeroDivisionError: pass + else: self.fail("5 % 0L didn't raise ZeroDivisionError") -try: 5 % 0L -except ZeroDivisionError: pass -else: raise TestFailed, "5 % 0L didn't raise ZeroDivisionError" + def test_numeric_types(self): + if 0 != 0L or 0 != 0.0 or 0L != 0.0: self.fail('mixed comparisons') + if 1 != 1L or 1 != 1.0 or 1L != 1.0: self.fail('mixed comparisons') + if -1 != -1L or -1 != -1.0 or -1L != -1.0: + self.fail('int/long/float value not equal') + # calling built-in types without argument must return 0 + if int() != 0: self.fail('int() does not return 0') + if long() != 0L: self.fail('long() does not return 0L') + if float() != 0.0: self.fail('float() does not return 0.0') + if int(1.9) == 1 == int(1.1) and int(-1.1) == -1 == int(-1.9): pass + else: self.fail('int() does not round properly') + if long(1.9) == 1L == long(1.1) and long(-1.1) == -1L == long(-1.9): pass + else: self.fail('long() does not round properly') + if float(1) == 1.0 and float(-1) == -1.0 and float(0) == 0.0: pass + else: self.fail('float() does not work properly') -print '6.4 Numeric types (mostly conversions)' -if 0 != 0L or 0 != 0.0 or 0L != 0.0: raise TestFailed, 'mixed comparisons' -if 1 != 1L or 1 != 1.0 or 1L != 1.0: raise TestFailed, 'mixed comparisons' -if -1 != -1L or -1 != -1.0 or -1L != -1.0: - raise TestFailed, 'int/long/float value not equal' -# calling built-in types without argument must return 0 -if int() != 0: raise TestFailed, 'int() does not return 0' -if long() != 0L: raise TestFailed, 'long() does not return 0L' -if float() != 0.0: raise TestFailed, 'float() does not return 0.0' -if int(1.9) == 1 == int(1.1) and int(-1.1) == -1 == int(-1.9): pass -else: raise TestFailed, 'int() does not round properly' -if long(1.9) == 1L == long(1.1) and long(-1.1) == -1L == long(-1.9): pass -else: raise TestFailed, 'long() does not round properly' -if float(1) == 1.0 and float(-1) == -1.0 and float(0) == 0.0: pass -else: raise TestFailed, 'float() does not work properly' -print '6.4.1 32-bit integers' -# Ensure the first 256 integers are shared -a = 256 -b = 128*2 -if a is not b: raise TestFailed, '256 is not shared' -if 12 + 24 != 36: raise TestFailed, 'int op' -if 12 + (-24) != -12: raise TestFailed, 'int op' -if (-12) + 24 != 12: raise TestFailed, 'int op' -if (-12) + (-24) != -36: raise TestFailed, 'int op' -if not 12 < 24: raise TestFailed, 'int op' -if not -24 < -12: raise TestFailed, 'int op' -# Test for a particular bug in integer multiply -xsize, ysize, zsize = 238, 356, 4 -if not (xsize*ysize*zsize == zsize*xsize*ysize == 338912): - raise TestFailed, 'int mul commutativity' -# And another. -m = -sys.maxint - 1 -for divisor in 1, 2, 4, 8, 16, 32: - j = m // divisor - prod = divisor * j - if prod != m: - raise TestFailed, "%r * %r == %r != %r" % (divisor, j, prod, m) - if type(prod) is not int: - raise TestFailed, ("expected type(prod) to be int, not %r" % - type(prod)) -# Check for expected * overflow to long. -for divisor in 1, 2, 4, 8, 16, 32: - j = m // divisor - 1 - prod = divisor * j - if type(prod) is not long: - raise TestFailed, ("expected type(%r) to be long, not %r" % - (prod, type(prod))) -# Check for expected * overflow to long. -m = sys.maxint -for divisor in 1, 2, 4, 8, 16, 32: - j = m // divisor + 1 - prod = divisor * j - if type(prod) is not long: - raise TestFailed, ("expected type(%r) to be long, not %r" % - (prod, type(prod))) + def test_float_to_string(self): + def test(f, result): + self.assertEqual(f.__format__('e'), result) + self.assertEqual('%e' % f, result) -print '6.4.2 Long integers' -if 12L + 24L != 36L: raise TestFailed, 'long op' -if 12L + (-24L) != -12L: raise TestFailed, 'long op' -if (-12L) + 24L != 12L: raise TestFailed, 'long op' -if (-12L) + (-24L) != -36L: raise TestFailed, 'long op' -if not 12L < 24L: raise TestFailed, 'long op' -if not -24L < -12L: raise TestFailed, 'long op' -x = sys.maxint -if int(long(x)) != x: raise TestFailed, 'long op' -try: y = int(long(x)+1L) -except OverflowError: raise TestFailed, 'long op' -if not isinstance(y, long): raise TestFailed, 'long op' -x = -x -if int(long(x)) != x: raise TestFailed, 'long op' -x = x-1 -if int(long(x)) != x: raise TestFailed, 'long op' -try: y = int(long(x)-1L) -except OverflowError: raise TestFailed, 'long op' -if not isinstance(y, long): raise TestFailed, 'long op' + # test all 2 digit exponents, both with __format__ and with + # '%' formatting + for i in range(-99, 100): + test(float('1.5e'+str(i)), '1.500000e{0:+03d}'.format(i)) -try: 5 << -5 -except ValueError: pass -else: raise TestFailed, 'int negative shift <<' + # test some 3 digit exponents + self.assertEqual(1.5e100.__format__('e'), '1.500000e+100') + self.assertEqual('%e' % 1.5e100, '1.500000e+100') -try: 5L << -5L -except ValueError: pass -else: raise TestFailed, 'long negative shift <<' + self.assertEqual(1.5e101.__format__('e'), '1.500000e+101') + self.assertEqual('%e' % 1.5e101, '1.500000e+101') -try: 5 >> -5 -except ValueError: pass -else: raise TestFailed, 'int negative shift >>' + self.assertEqual(1.5e-100.__format__('e'), '1.500000e-100') + self.assertEqual('%e' % 1.5e-100, '1.500000e-100') -try: 5L >> -5L -except ValueError: pass -else: raise TestFailed, 'long negative shift >>' + self.assertEqual(1.5e-101.__format__('e'), '1.500000e-101') + self.assertEqual('%e' % 1.5e-101, '1.500000e-101') -print '6.4.3 Floating point numbers' -if 12.0 + 24.0 != 36.0: raise TestFailed, 'float op' -if 12.0 + (-24.0) != -12.0: raise TestFailed, 'float op' -if (-12.0) + 24.0 != 12.0: raise TestFailed, 'float op' -if (-12.0) + (-24.0) != -36.0: raise TestFailed, 'float op' -if not 12.0 < 24.0: raise TestFailed, 'float op' -if not -24.0 < -12.0: raise TestFailed, 'float op' + self.assertEqual('%g' % 1.0, '1') + self.assertEqual('%#g' % 1.0, '1.00000') -print '6.5 Sequence types' + def test_normal_integers(self): + # Ensure the first 256 integers are shared + a = 256 + b = 128*2 + if a is not b: self.fail('256 is not shared') + if 12 + 24 != 36: self.fail('int op') + if 12 + (-24) != -12: self.fail('int op') + if (-12) + 24 != 12: self.fail('int op') + if (-12) + (-24) != -36: self.fail('int op') + if not 12 < 24: self.fail('int op') + if not -24 < -12: self.fail('int op') + # Test for a particular bug in integer multiply + xsize, ysize, zsize = 238, 356, 4 + if not (xsize*ysize*zsize == zsize*xsize*ysize == 338912): + self.fail('int mul commutativity') + # And another. + m = -sys.maxint - 1 + for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor + prod = divisor * j + if prod != m: + self.fail("%r * %r == %r != %r" % (divisor, j, prod, m)) + if type(prod) is not int: + self.fail("expected type(prod) to be int, not %r" % + type(prod)) + # Check for expected * overflow to long. + for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor - 1 + prod = divisor * j + if type(prod) is not long: + self.fail("expected type(%r) to be long, not %r" % + (prod, type(prod))) + # Check for expected * overflow to long. + m = sys.maxint + for divisor in 1, 2, 4, 8, 16, 32: + j = m // divisor + 1 + prod = divisor * j + if type(prod) is not long: + self.fail("expected type(%r) to be long, not %r" % + (prod, type(prod))) -print '6.5.1 Strings' -if len('') != 0: raise TestFailed, 'len(\'\')' -if len('a') != 1: raise TestFailed, 'len(\'a\')' -if len('abcdef') != 6: raise TestFailed, 'len(\'abcdef\')' -if 'xyz' + 'abcde' != 'xyzabcde': raise TestFailed, 'string concatenation' -if 'xyz'*3 != 'xyzxyzxyz': raise TestFailed, 'string repetition *3' -if 0*'abcde' != '': raise TestFailed, 'string repetition 0*' -if min('abc') != 'a' or max('abc') != 'c': raise TestFailed, 'min/max string' -if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': pass -else: raise TestFailed, 'in/not in string' -x = 'x'*103 -if '%s!'%x != x+'!': raise TestFailed, 'nasty string formatting bug' + def test_long_integers(self): + if 12L + 24L != 36L: self.fail('long op') + if 12L + (-24L) != -12L: self.fail('long op') + if (-12L) + 24L != 12L: self.fail('long op') + if (-12L) + (-24L) != -36L: self.fail('long op') + if not 12L < 24L: self.fail('long op') + if not -24L < -12L: self.fail('long op') + x = sys.maxint + if int(long(x)) != x: self.fail('long op') + try: y = int(long(x)+1L) + except OverflowError: self.fail('long op') + if not isinstance(y, long): self.fail('long op') + x = -x + if int(long(x)) != x: self.fail('long op') + x = x-1 + if int(long(x)) != x: self.fail('long op') + try: y = int(long(x)-1L) + except OverflowError: self.fail('long op') + if not isinstance(y, long): self.fail('long op') -#extended slices for strings -a = '0123456789' -vereq(a[::], a) -vereq(a[::2], '02468') -vereq(a[1::2], '13579') -vereq(a[::-1],'9876543210') -vereq(a[::-2], '97531') -vereq(a[3::-2], '31') -vereq(a[-100:100:], a) -vereq(a[100:-100:-1], a[::-1]) -vereq(a[-100L:100L:2L], '02468') + try: 5 << -5 + except ValueError: pass + else: self.fail('int negative shift <<') -if have_unicode: - a = unicode('0123456789', 'ascii') - vereq(a[::], a) - vereq(a[::2], unicode('02468', 'ascii')) - vereq(a[1::2], unicode('13579', 'ascii')) - vereq(a[::-1], unicode('9876543210', 'ascii')) - vereq(a[::-2], unicode('97531', 'ascii')) - vereq(a[3::-2], unicode('31', 'ascii')) - vereq(a[-100:100:], a) - vereq(a[100:-100:-1], a[::-1]) - vereq(a[-100L:100L:2L], unicode('02468', 'ascii')) + try: 5L << -5L + except ValueError: pass + else: self.fail('long negative shift <<') + try: 5 >> -5 + except ValueError: pass + else: self.fail('int negative shift >>') -print '6.5.2 Tuples [see test_tuple.py]' + try: 5L >> -5L + except ValueError: pass + else: self.fail('long negative shift >>') -print '6.5.3 Lists [see test_list.py]' + def test_floats(self): + if 12.0 + 24.0 != 36.0: self.fail('float op') + if 12.0 + (-24.0) != -12.0: self.fail('float op') + if (-12.0) + 24.0 != 12.0: self.fail('float op') + if (-12.0) + (-24.0) != -36.0: self.fail('float op') + if not 12.0 < 24.0: self.fail('float op') + if not -24.0 < -12.0: self.fail('float op') -print '6.6 Mappings == Dictionaries [see test_dict.py]' + def test_strings(self): + if len('') != 0: self.fail('len(\'\')') + if len('a') != 1: self.fail('len(\'a\')') + if len('abcdef') != 6: self.fail('len(\'abcdef\')') + if 'xyz' + 'abcde' != 'xyzabcde': self.fail('string concatenation') + if 'xyz'*3 != 'xyzxyzxyz': self.fail('string repetition *3') + if 0*'abcde' != '': self.fail('string repetition 0*') + if min('abc') != 'a' or max('abc') != 'c': self.fail('min/max string') + if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': pass + else: self.fail('in/not in string') + x = 'x'*103 + if '%s!'%x != x+'!': self.fail('nasty string formatting bug') + #extended slices for strings + a = '0123456789' + self.assertEqual(a[::], a) + self.assertEqual(a[::2], '02468') + self.assertEqual(a[1::2], '13579') + self.assertEqual(a[::-1],'9876543210') + self.assertEqual(a[::-2], '97531') + self.assertEqual(a[3::-2], '31') + self.assertEqual(a[-100:100:], a) + self.assertEqual(a[100:-100:-1], a[::-1]) + self.assertEqual(a[-100L:100L:2L], '02468') -try: type(1, 2) -except TypeError: pass -else: raise TestFailed, 'type(), w/2 args expected TypeError' + if have_unicode: + a = unicode('0123456789', 'ascii') + self.assertEqual(a[::], a) + self.assertEqual(a[::2], unicode('02468', 'ascii')) + self.assertEqual(a[1::2], unicode('13579', 'ascii')) + self.assertEqual(a[::-1], unicode('9876543210', 'ascii')) + self.assertEqual(a[::-2], unicode('97531', 'ascii')) + self.assertEqual(a[3::-2], unicode('31', 'ascii')) + self.assertEqual(a[-100:100:], a) + self.assertEqual(a[100:-100:-1], a[::-1]) + self.assertEqual(a[-100L:100L:2L], unicode('02468', 'ascii')) -try: type(1, 2, 3, 4) -except TypeError: pass -else: raise TestFailed, 'type(), w/4 args expected TypeError' -# XXX: Jython lacks buffers -print 'Buffers' -if not is_jython: - try: buffer('asdf', -1) - except ValueError: pass - else: raise TestFailed, "buffer('asdf', -1) should raise ValueError" - cmp(buffer("abc"), buffer("def")) # used to raise a warning: tp_compare didn't return -1, 0, or 1 + def test_type_function(self): + self.assertRaises(TypeError, type, 1, 2) + self.assertRaises(TypeError, type, 1, 2, 3, 4) - try: buffer(None) - except TypeError: pass - else: raise TestFailed, "buffer(None) should raise TypeError" + def test_buffers(self): + self.assertRaises(ValueError, buffer, 'asdf', -1) + cmp(buffer("abc"), buffer("def")) # used to raise a warning: tp_compare didn't return -1, 0, or 1 - a = buffer('asdf') - hash(a) - b = a * 5 - if a == b: - raise TestFailed, 'buffers should not be equal' - if str(b) != ('asdf' * 5): - raise TestFailed, 'repeated buffer has wrong content' - if str(a * 0) != '': - raise TestFailed, 'repeated buffer zero times has wrong content' - if str(a + buffer('def')) != 'asdfdef': - raise TestFailed, 'concatenation of buffers yields wrong content' - if str(buffer(a)) != 'asdf': - raise TestFailed, 'composing buffers failed' - if str(buffer(a, 2)) != 'df': - raise TestFailed, 'specifying buffer offset failed' - if str(buffer(a, 0, 2)) != 'as': - raise TestFailed, 'specifying buffer size failed' - if str(buffer(a, 1, 2)) != 'sd': - raise TestFailed, 'specifying buffer offset and size failed' - try: buffer(buffer('asdf', 1), -1) - except ValueError: pass - else: raise TestFailed, "buffer(buffer('asdf', 1), -1) should raise ValueError" - if str(buffer(buffer('asdf', 0, 2), 0)) != 'as': - raise TestFailed, 'composing length-specified buffer failed' - if str(buffer(buffer('asdf', 0, 2), 0, 5000)) != 'as': - raise TestFailed, 'composing length-specified buffer failed' - if str(buffer(buffer('asdf', 0, 2), 0, -1)) != 'as': - raise TestFailed, 'composing length-specified buffer failed' - if str(buffer(buffer('asdf', 0, 2), 1, 2)) != 's': - raise TestFailed, 'composing length-specified buffer failed' + self.assertRaises(TypeError, buffer, None) - try: a[1] = 'g' - except TypeError: pass - else: raise TestFailed, "buffer assignment should raise TypeError" + a = buffer('asdf') + hash(a) + b = a * 5 + if a == b: + self.fail('buffers should not be equal') + if str(b) != ('asdf' * 5): + self.fail('repeated buffer has wrong content') + if str(a * 0) != '': + self.fail('repeated buffer zero times has wrong content') + if str(a + buffer('def')) != 'asdfdef': + self.fail('concatenation of buffers yields wrong content') + if str(buffer(a)) != 'asdf': + self.fail('composing buffers failed') + if str(buffer(a, 2)) != 'df': + self.fail('specifying buffer offset failed') + if str(buffer(a, 0, 2)) != 'as': + self.fail('specifying buffer size failed') + if str(buffer(a, 1, 2)) != 'sd': + self.fail('specifying buffer offset and size failed') + self.assertRaises(ValueError, buffer, buffer('asdf', 1), -1) + if str(buffer(buffer('asdf', 0, 2), 0)) != 'as': + self.fail('composing length-specified buffer failed') + if str(buffer(buffer('asdf', 0, 2), 0, 5000)) != 'as': + self.fail('composing length-specified buffer failed') + if str(buffer(buffer('asdf', 0, 2), 0, -1)) != 'as': + self.fail('composing length-specified buffer failed') + if str(buffer(buffer('asdf', 0, 2), 1, 2)) != 's': + self.fail('composing length-specified buffer failed') - try: a[0:1] = 'g' - except TypeError: pass - else: raise TestFailed, "buffer slice assignment should raise TypeError" + try: a[1] = 'g' + except TypeError: pass + else: self.fail("buffer assignment should raise TypeError") - # array.array() returns an object that does not implement a char buffer, - # something which int() uses for conversion. - import array - try: int(buffer(array.array('c'))) - except TypeError :pass - else: raise TestFailed, "char buffer (at C level) not working" + try: a[0:1] = 'g' + except TypeError: pass + else: self.fail("buffer slice assignment should raise TypeError") + + # array.array() returns an object that does not implement a char buffer, + # something which int() uses for conversion. + import array + try: int(buffer(array.array('c'))) + except TypeError: pass + else: self.fail("char buffer (at C level) not working") + + def test_int__format__(self): + def test(i, format_spec, result): + # just make sure I'm not accidentally checking longs + assert type(i) == int + assert type(format_spec) == str + self.assertEqual(i.__format__(format_spec), result) + self.assertEqual(i.__format__(unicode(format_spec)), result) + + test(123456789, 'd', '123456789') + test(123456789, 'd', '123456789') + + test(1, 'c', '\01') + + # sign and aligning are interdependent + test(1, "-", '1') + test(-1, "-", '-1') + test(1, "-3", ' 1') + test(-1, "-3", ' -1') + test(1, "+3", ' +1') + test(-1, "+3", ' -1') + test(1, " 3", ' 1') + test(-1, " 3", ' -1') + test(1, " ", ' 1') + test(-1, " ", '-1') + + # hex + test(3, "x", "3") + test(3, "X", "3") + test(1234, "x", "4d2") + test(-1234, "x", "-4d2") + test(1234, "8x", " 4d2") + test(-1234, "8x", " -4d2") + test(1234, "x", "4d2") + test(-1234, "x", "-4d2") + test(-3, "x", "-3") + test(-3, "X", "-3") + test(int('be', 16), "x", "be") + test(int('be', 16), "X", "BE") + test(-int('be', 16), "x", "-be") + test(-int('be', 16), "X", "-BE") + + # octal + test(3, "o", "3") + test(-3, "o", "-3") + test(65, "o", "101") + test(-65, "o", "-101") + test(1234, "o", "2322") + test(-1234, "o", "-2322") + test(1234, "-o", "2322") + test(-1234, "-o", "-2322") + test(1234, " o", " 2322") + test(-1234, " o", "-2322") + test(1234, "+o", "+2322") + test(-1234, "+o", "-2322") + + # binary + test(3, "b", "11") + test(-3, "b", "-11") + test(1234, "b", "10011010010") + test(-1234, "b", "-10011010010") + test(1234, "-b", "10011010010") + test(-1234, "-b", "-10011010010") + test(1234, " b", " 10011010010") + test(-1234, " b", "-10011010010") + test(1234, "+b", "+10011010010") + test(-1234, "+b", "-10011010010") + + # alternate (#) formatting + test(0, "#b", '0b0') + test(0, "-#b", '0b0') + test(1, "-#b", '0b1') + test(-1, "-#b", '-0b1') + test(-1, "-#5b", ' -0b1') + test(1, "+#5b", ' +0b1') + test(100, "+#b", '+0b1100100') + test(100, "#012b", '0b0001100100') + test(-100, "#012b", '-0b001100100') + + test(0, "#o", '0o0') + test(0, "-#o", '0o0') + test(1, "-#o", '0o1') + test(-1, "-#o", '-0o1') + test(-1, "-#5o", ' -0o1') + test(1, "+#5o", ' +0o1') + test(100, "+#o", '+0o144') + test(100, "#012o", '0o0000000144') + test(-100, "#012o", '-0o000000144') + + test(0, "#x", '0x0') + test(0, "-#x", '0x0') + test(1, "-#x", '0x1') + test(-1, "-#x", '-0x1') + test(-1, "-#5x", ' -0x1') + test(1, "+#5x", ' +0x1') + test(100, "+#x", '+0x64') + test(100, "#012x", '0x0000000064') + test(-100, "#012x", '-0x000000064') + test(123456, "#012x", '0x000001e240') + test(-123456, "#012x", '-0x00001e240') + + test(0, "#X", '0X0') + test(0, "-#X", '0X0') + test(1, "-#X", '0X1') + test(-1, "-#X", '-0X1') + test(-1, "-#5X", ' -0X1') + test(1, "+#5X", ' +0X1') + test(100, "+#X", '+0X64') + test(100, "#012X", '0X0000000064') + test(-100, "#012X", '-0X000000064') + test(123456, "#012X", '0X000001E240') + test(-123456, "#012X", '-0X00001E240') + + # issue 5782, commas with no specifier type + test(1234, '010,', '00,001,234') + + # make sure these are errors + + # precision disallowed + self.assertRaises(ValueError, 3 .__format__, "1.3") + # sign not allowed with 'c' + self.assertRaises(ValueError, 3 .__format__, "+c") + # format spec must be string + self.assertRaises(TypeError, 3 .__format__, None) + self.assertRaises(TypeError, 3 .__format__, 0) + + # can't have ',' with 'c' + self.assertRaises(ValueError, 3 .__format__, ",c") + + # ensure that only int and float type specifiers work + for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + + [chr(x) for x in range(ord('A'), ord('Z')+1)]): + if not format_spec in 'bcdoxXeEfFgGn%': + self.assertRaises(ValueError, 0 .__format__, format_spec) + self.assertRaises(ValueError, 1 .__format__, format_spec) + self.assertRaises(ValueError, (-1) .__format__, format_spec) + + # ensure that float type specifiers work; format converts + # the int to a float + for format_spec in 'eEfFgG%': + for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]: + self.assertEqual(value.__format__(format_spec), + float(value).__format__(format_spec)) + + # Issue 6902 + test(123456, "0<20", '12345600000000000000') + test(123456, "1<20", '12345611111111111111') + test(123456, "*<20", '123456**************') + test(123456, "0>20", '00000000000000123456') + test(123456, "1>20", '11111111111111123456') + test(123456, "*>20", '**************123456') + test(123456, "0=20", '00000000000000123456') + test(123456, "1=20", '11111111111111123456') + test(123456, "*=20", '**************123456') + + def test_long__format__(self): + def test(i, format_spec, result): + # make sure we're not accidentally checking ints + assert type(i) == long + assert type(format_spec) == str + self.assertEqual(i.__format__(format_spec), result) + self.assertEqual(i.__format__(unicode(format_spec)), result) + + test(10**100, 'd', '1' + '0' * 100) + test(10**100+100, 'd', '1' + '0' * 97 + '100') + + test(123456789L, 'd', '123456789') + test(123456789L, 'd', '123456789') + + # sign and aligning are interdependent + test(1L, "-", '1') + test(-1L, "-", '-1') + test(1L, "-3", ' 1') + test(-1L, "-3", ' -1') + test(1L, "+3", ' +1') + test(-1L, "+3", ' -1') + test(1L, " 3", ' 1') + test(-1L, " 3", ' -1') + test(1L, " ", ' 1') + test(-1L, " ", '-1') + + test(1L, 'c', '\01') + + # hex + test(3L, "x", "3") + test(3L, "X", "3") + test(1234L, "x", "4d2") + test(-1234L, "x", "-4d2") + test(1234L, "8x", " 4d2") + test(-1234L, "8x", " -4d2") + test(1234L, "x", "4d2") + test(-1234L, "x", "-4d2") + test(-3L, "x", "-3") + test(-3L, "X", "-3") + test(long('be', 16), "x", "be") + test(long('be', 16), "X", "BE") + test(-long('be', 16), "x", "-be") + test(-long('be', 16), "X", "-BE") + + # octal + test(3L, "o", "3") + test(-3L, "o", "-3") + test(65L, "o", "101") + test(-65L, "o", "-101") + test(1234L, "o", "2322") + test(-1234L, "o", "-2322") + test(1234L, "-o", "2322") + test(-1234L, "-o", "-2322") + test(1234L, " o", " 2322") + test(-1234L, " o", "-2322") + test(1234L, "+o", "+2322") + test(-1234L, "+o", "-2322") + + # binary + test(3L, "b", "11") + test(-3L, "b", "-11") + test(1234L, "b", "10011010010") + test(-1234L, "b", "-10011010010") + test(1234L, "-b", "10011010010") + test(-1234L, "-b", "-10011010010") + test(1234L, " b", " 10011010010") + test(-1234L, " b", "-10011010010") + test(1234L, "+b", "+10011010010") + test(-1234L, "+b", "-10011010010") + + # make sure these are errors + + # precision disallowed + self.assertRaises(ValueError, 3L .__format__, "1.3") + # sign not allowed with 'c' + self.assertRaises(ValueError, 3L .__format__, "+c") + # format spec must be string + self.assertRaises(TypeError, 3L .__format__, None) + self.assertRaises(TypeError, 3L .__format__, 0) + # alternate specifier in wrong place + self.assertRaises(ValueError, 1L .__format__, "#+5x") + self.assertRaises(ValueError, 1L .__format__, "+5#x") + + # ensure that only int and float type specifiers work + for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + + [chr(x) for x in range(ord('A'), ord('Z')+1)]): + if not format_spec in 'bcdoxXeEfFgGn%': + self.assertRaises(ValueError, 0L .__format__, format_spec) + self.assertRaises(ValueError, 1L .__format__, format_spec) + self.assertRaises(ValueError, (-1L) .__format__, format_spec) + + # ensure that float type specifiers work; format converts + # the long to a float + for format_spec in 'eEfFgG%': + for value in [0L, 1L, -1L, 100L, -100L, 1234567890L, -1234567890L]: + self.assertEqual(value.__format__(format_spec), + float(value).__format__(format_spec)) + # Issue 6902 + test(123456L, "0<20", '12345600000000000000') + test(123456L, "1<20", '12345611111111111111') + test(123456L, "*<20", '123456**************') + test(123456L, "0>20", '00000000000000123456') + test(123456L, "1>20", '11111111111111123456') + test(123456L, "*>20", '**************123456') + test(123456L, "0=20", '00000000000000123456') + test(123456L, "1=20", '11111111111111123456') + test(123456L, "*=20", '**************123456') + + @run_with_locale('LC_NUMERIC', 'en_US.UTF8') + def test_float__format__locale(self): + # test locale support for __format__ code 'n' + + for i in range(-10, 10): + x = 1234567890.0 * (10.0 ** i) + self.assertEqual(locale.format('%g', x, grouping=True), format(x, 'n')) + self.assertEqual(locale.format('%.10g', x, grouping=True), format(x, '.10n')) + + @run_with_locale('LC_NUMERIC', 'en_US.UTF8') + def test_int__format__locale(self): + # test locale support for __format__ code 'n' for integers + + x = 123456789012345678901234567890 + for i in range(0, 30): + self.assertEqual(locale.format('%d', x, grouping=True), format(x, 'n')) + + # move to the next integer to test + x = x // 10 + + rfmt = ">20n" + lfmt = "<20n" + cfmt = "^20n" + for x in (1234, 12345, 123456, 1234567, 12345678, 123456789, 1234567890, 12345678900): + self.assertEqual(len(format(0, rfmt)), len(format(x, rfmt))) + self.assertEqual(len(format(0, lfmt)), len(format(x, lfmt))) + self.assertEqual(len(format(0, cfmt)), len(format(x, cfmt))) + + def test_float__format__(self): + # these should be rewritten to use both format(x, spec) and + # x.__format__(spec) + + def test(f, format_spec, result): + assert type(f) == float + assert type(format_spec) == str + self.assertEqual(f.__format__(format_spec), result) + self.assertEqual(f.__format__(unicode(format_spec)), result) + + test(0.0, 'f', '0.000000') + + # the default is 'g', except for empty format spec + test(0.0, '', '0.0') + test(0.01, '', '0.01') + test(0.01, 'g', '0.01') + + # test for issue 3411 + test(1.23, '1', '1.23') + test(-1.23, '1', '-1.23') + test(1.23, '1g', '1.23') + test(-1.23, '1g', '-1.23') + + test( 1.0, ' g', ' 1') + test(-1.0, ' g', '-1') + test( 1.0, '+g', '+1') + test(-1.0, '+g', '-1') + test(1.1234e200, 'g', '1.1234e+200') + test(1.1234e200, 'G', '1.1234E+200') + + + test(1.0, 'f', '1.000000') + + test(-1.0, 'f', '-1.000000') + + test( 1.0, ' f', ' 1.000000') + test(-1.0, ' f', '-1.000000') + test( 1.0, '+f', '+1.000000') + test(-1.0, '+f', '-1.000000') + + # Python versions <= 2.6 switched from 'f' to 'g' formatting for + # values larger than 1e50. No longer. + f = 1.1234e90 + for fmt in 'f', 'F': + # don't do a direct equality check, since on some + # platforms only the first few digits of dtoa + # will be reliable + result = f.__format__(fmt) + self.assertEqual(len(result), 98) + self.assertEqual(result[-7], '.') + self.assertIn(result[:12], ('112340000000', '112339999999')) + f = 1.1234e200 + for fmt in 'f', 'F': + result = f.__format__(fmt) + self.assertEqual(len(result), 208) + self.assertEqual(result[-7], '.') + self.assertIn(result[:12], ('112340000000', '112339999999')) + + + test( 1.0, 'e', '1.000000e+00') + test(-1.0, 'e', '-1.000000e+00') + test( 1.0, 'E', '1.000000E+00') + test(-1.0, 'E', '-1.000000E+00') + test(1.1234e20, 'e', '1.123400e+20') + test(1.1234e20, 'E', '1.123400E+20') + + # No format code means use g, but must have a decimal + # and a number after the decimal. This is tricky, because + # a totaly empty format specifier means something else. + # So, just use a sign flag + test(1e200, '+g', '+1e+200') + test(1e200, '+', '+1e+200') + test(1.1e200, '+g', '+1.1e+200') + test(1.1e200, '+', '+1.1e+200') + + test(1.1e200, '+g', '+1.1e+200') + test(1.1e200, '+', '+1.1e+200') + + # 0 padding + test(1234., '010f', '1234.000000') + test(1234., '011f', '1234.000000') + test(1234., '012f', '01234.000000') + test(-1234., '011f', '-1234.000000') + test(-1234., '012f', '-1234.000000') + test(-1234., '013f', '-01234.000000') + test(-1234.12341234, '013f', '-01234.123412') + test(-123456.12341234, '011.2f', '-0123456.12') + + # issue 5782, commas with no specifier type + test(1.2, '010,.2', '0,000,001.2') + + # 0 padding with commas + test(1234., '011,f', '1,234.000000') + test(1234., '012,f', '1,234.000000') + test(1234., '013,f', '01,234.000000') + test(-1234., '012,f', '-1,234.000000') + test(-1234., '013,f', '-1,234.000000') + test(-1234., '014,f', '-01,234.000000') + test(-12345., '015,f', '-012,345.000000') + test(-123456., '016,f', '-0,123,456.000000') + test(-123456., '017,f', '-0,123,456.000000') + test(-123456.12341234, '017,f', '-0,123,456.123412') + test(-123456.12341234, '013,.2f', '-0,123,456.12') + + # % formatting + test(-1.0, '%', '-100.000000%') + + # format spec must be string + self.assertRaises(TypeError, 3.0.__format__, None) + self.assertRaises(TypeError, 3.0.__format__, 0) + + # other format specifiers shouldn't work on floats, + # in particular int specifiers + for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + + [chr(x) for x in range(ord('A'), ord('Z')+1)]): + if not format_spec in 'eEfFgGn%': + self.assertRaises(ValueError, format, 0.0, format_spec) + self.assertRaises(ValueError, format, 1.0, format_spec) + self.assertRaises(ValueError, format, -1.0, format_spec) + self.assertRaises(ValueError, format, 1e100, format_spec) + self.assertRaises(ValueError, format, -1e100, format_spec) + self.assertRaises(ValueError, format, 1e-100, format_spec) + self.assertRaises(ValueError, format, -1e-100, format_spec) + + # Alternate formatting is not supported + self.assertRaises(ValueError, format, 0.0, '#') + self.assertRaises(ValueError, format, 0.0, '#20f') + + # Issue 6902 + test(12345.6, "0<20", '12345.60000000000000') + test(12345.6, "1<20", '12345.61111111111111') + test(12345.6, "*<20", '12345.6*************') + test(12345.6, "0>20", '000000000000012345.6') + test(12345.6, "1>20", '111111111111112345.6') + test(12345.6, "*>20", '*************12345.6') + test(12345.6, "0=20", '000000000000012345.6') + test(12345.6, "1=20", '111111111111112345.6') + test(12345.6, "*=20", '*************12345.6') + + def test_format_spec_errors(self): + # int, float, and string all share the same format spec + # mini-language parser. + + # Check that we can't ask for too many digits. This is + # probably a CPython specific test. It tries to put the width + # into a C long. + self.assertRaises(ValueError, format, 0, '1'*10000 + 'd') + + # Similar with the precision. + self.assertRaises(ValueError, format, 0, '.' + '1'*10000 + 'd') + + # And may as well test both. + self.assertRaises(ValueError, format, 0, '1'*1000 + '.' + '1'*10000 + 'd') + + # Make sure commas aren't allowed with various type codes + for code in 'xXobns': + self.assertRaises(ValueError, format, 0, ',' + code) + + def test_internal_sizes(self): + self.assertGreater(object.__basicsize__, 0) + self.assertGreater(tuple.__itemsize__, 0) + + +def test_main(): + with check_py3k_warnings( + ("buffer.. not supported", DeprecationWarning), + ("classic long division", DeprecationWarning)): + run_unittest(TypesTests) + +if __name__ == '__main__': + test_main() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 04:59:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 04:59:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_skips_to_test=5Ftypes=2E?= Message-ID: http://hg.python.org/jython/rev/52ee23041df1 changeset: 6488:52ee23041df1 user: Frank Wierzbicki date: Thu Mar 22 20:58:54 2012 -0700 summary: Add skips to test_types. files: Lib/test/test_types.py | 117 ++++++++++++++++------------ 1 files changed, 68 insertions(+), 49 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1,7 +1,7 @@ # Python test set -- part 6, built-in types from test.test_support import run_unittest, have_unicode, run_with_locale, \ - check_py3k_warnings + check_py3k_warnings, is_jython import unittest import sys import locale @@ -90,6 +90,7 @@ if float(1) == 1.0 and float(-1) == -1.0 and float(0) == 0.0: pass else: self.fail('float() does not work properly') + @unittest.skipIf(is_jython, "FIXME: not working") def test_float_to_string(self): def test(f, result): self.assertEqual(f.__format__('e'), result) @@ -243,6 +244,7 @@ self.assertRaises(TypeError, type, 1, 2) self.assertRaises(TypeError, type, 1, 2, 3, 4) + @unittest.skipIf(is_jython, "No buffer on Jython") def test_buffers(self): self.assertRaises(ValueError, buffer, 'asdf', -1) cmp(buffer("abc"), buffer("def")) # used to raise a warning: tp_compare didn't return -1, 0, or 1 @@ -364,49 +366,58 @@ test(0, "#b", '0b0') test(0, "-#b", '0b0') test(1, "-#b", '0b1') - test(-1, "-#b", '-0b1') - test(-1, "-#5b", ' -0b1') + #FIXME: not working. + #test(-1, "-#b", '-0b1') + #test(-1, "-#5b", ' -0b1') test(1, "+#5b", ' +0b1') test(100, "+#b", '+0b1100100') - test(100, "#012b", '0b0001100100') - test(-100, "#012b", '-0b001100100') + #FIXME: not working. + #test(100, "#012b", '0b0001100100') + #test(-100, "#012b", '-0b001100100') test(0, "#o", '0o0') test(0, "-#o", '0o0') test(1, "-#o", '0o1') - test(-1, "-#o", '-0o1') - test(-1, "-#5o", ' -0o1') + #FIXME: not working. + #test(-1, "-#o", '-0o1') + #test(-1, "-#5o", ' -0o1') test(1, "+#5o", ' +0o1') test(100, "+#o", '+0o144') - test(100, "#012o", '0o0000000144') - test(-100, "#012o", '-0o000000144') + #FIXME: not working. + #test(100, "#012o", '0o0000000144') + #test(-100, "#012o", '-0o000000144') test(0, "#x", '0x0') test(0, "-#x", '0x0') test(1, "-#x", '0x1') - test(-1, "-#x", '-0x1') - test(-1, "-#5x", ' -0x1') + #FIXME: not working. + #test(-1, "-#x", '-0x1') + #test(-1, "-#5x", ' -0x1') test(1, "+#5x", ' +0x1') test(100, "+#x", '+0x64') - test(100, "#012x", '0x0000000064') - test(-100, "#012x", '-0x000000064') - test(123456, "#012x", '0x000001e240') - test(-123456, "#012x", '-0x00001e240') + #FIXME: not working. + #test(100, "#012x", '0x0000000064') + #test(-100, "#012x", '-0x000000064') + #test(123456, "#012x", '0x000001e240') + #test(-123456, "#012x", '-0x00001e240') test(0, "#X", '0X0') test(0, "-#X", '0X0') test(1, "-#X", '0X1') - test(-1, "-#X", '-0X1') - test(-1, "-#5X", ' -0X1') + #FIXME: not working. + #test(-1, "-#X", '-0X1') + #test(-1, "-#5X", ' -0X1') test(1, "+#5X", ' +0X1') test(100, "+#X", '+0X64') - test(100, "#012X", '0X0000000064') - test(-100, "#012X", '-0X000000064') - test(123456, "#012X", '0X000001E240') - test(-123456, "#012X", '-0X00001E240') + #FIXME: not working. + #test(100, "#012X", '0X0000000064') + #test(-100, "#012X", '-0X000000064') + #test(123456, "#012X", '0X000001E240') + #test(-123456, "#012X", '-0X00001E240') # issue 5782, commas with no specifier type - test(1234, '010,', '00,001,234') + #FIXME: not working. + #test(1234, '010,', '00,001,234') # make sure these are errors @@ -422,19 +433,21 @@ self.assertRaises(ValueError, 3 .__format__, ",c") # ensure that only int and float type specifiers work - for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + - [chr(x) for x in range(ord('A'), ord('Z')+1)]): - if not format_spec in 'bcdoxXeEfFgGn%': - self.assertRaises(ValueError, 0 .__format__, format_spec) - self.assertRaises(ValueError, 1 .__format__, format_spec) - self.assertRaises(ValueError, (-1) .__format__, format_spec) + #FIXME: not working. + #for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + + # [chr(x) for x in range(ord('A'), ord('Z')+1)]): + # if not format_spec in 'bcdoxXeEfFgGn%': + # self.assertRaises(ValueError, 0 .__format__, format_spec) + # self.assertRaises(ValueError, 1 .__format__, format_spec) + # self.assertRaises(ValueError, (-1) .__format__, format_spec) # ensure that float type specifiers work; format converts # the int to a float - for format_spec in 'eEfFgG%': - for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]: - self.assertEqual(value.__format__(format_spec), - float(value).__format__(format_spec)) + #FIXME: not working. + #for format_spec in 'eEfFgG%': + # for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]: + # self.assertEqual(value.__format__(format_spec), + # float(value).__format__(format_spec)) # Issue 6902 test(123456, "0<20", '12345600000000000000') @@ -530,20 +543,23 @@ self.assertRaises(ValueError, 1L .__format__, "#+5x") self.assertRaises(ValueError, 1L .__format__, "+5#x") + #FIXME: this section broken in Jython. # ensure that only int and float type specifiers work - for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + - [chr(x) for x in range(ord('A'), ord('Z')+1)]): - if not format_spec in 'bcdoxXeEfFgGn%': - self.assertRaises(ValueError, 0L .__format__, format_spec) - self.assertRaises(ValueError, 1L .__format__, format_spec) - self.assertRaises(ValueError, (-1L) .__format__, format_spec) + #for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + + # [chr(x) for x in range(ord('A'), ord('Z')+1)]): + # if not format_spec in 'bcdoxXeEfFgGn%': + # self.assertRaises(ValueError, 0L .__format__, format_spec) + # self.assertRaises(ValueError, 1L .__format__, format_spec) + # self.assertRaises(ValueError, (-1L) .__format__, format_spec) # ensure that float type specifiers work; format converts # the long to a float - for format_spec in 'eEfFgG%': - for value in [0L, 1L, -1L, 100L, -100L, 1234567890L, -1234567890L]: - self.assertEqual(value.__format__(format_spec), - float(value).__format__(format_spec)) + + #FIXME: this section broken in Jython. + #for format_spec in 'eEfFgG%': + # for value in [0L, 1L, -1L, 100L, -100L, 1234567890L, -1234567890L]: + # self.assertEqual(value.__format__(format_spec), + # float(value).__format__(format_spec)) # Issue 6902 test(123456L, "0<20", '12345600000000000000') test(123456L, "1<20", '12345611111111111111') @@ -555,6 +571,7 @@ test(123456L, "1=20", '11111111111111123456') test(123456L, "*=20", '**************123456') + @unittest.skipIf(is_jython, "FIXME: not working") @run_with_locale('LC_NUMERIC', 'en_US.UTF8') def test_float__format__locale(self): # test locale support for __format__ code 'n' @@ -568,12 +585,13 @@ def test_int__format__locale(self): # test locale support for __format__ code 'n' for integers - x = 123456789012345678901234567890 - for i in range(0, 30): - self.assertEqual(locale.format('%d', x, grouping=True), format(x, 'n')) + #FIXME: not working in Jython. + #x = 123456789012345678901234567890 + #for i in range(0, 30): + # self.assertEqual(locale.format('%d', x, grouping=True), format(x, 'n')) - # move to the next integer to test - x = x // 10 + # # move to the next integer to test + # x = x // 10 rfmt = ">20n" lfmt = "<20n" @@ -583,6 +601,7 @@ self.assertEqual(len(format(0, lfmt)), len(format(x, lfmt))) self.assertEqual(len(format(0, cfmt)), len(format(x, cfmt))) + @unittest.skipIf(is_jython, "FIXME: not working") def test_float__format__(self): # these should be rewritten to use both format(x, spec) and # x.__format__(spec) @@ -615,9 +634,7 @@ test(1.0, 'f', '1.000000') - test(-1.0, 'f', '-1.000000') - test( 1.0, ' f', ' 1.000000') test(-1.0, ' f', '-1.000000') test( 1.0, '+f', '+1.000000') @@ -722,6 +739,7 @@ test(12345.6, "1=20", '111111111111112345.6') test(12345.6, "*=20", '*************12345.6') + @unittest.skipIf(is_jython, "FIXME: not working") def test_format_spec_errors(self): # int, float, and string all share the same format spec # mini-language parser. @@ -741,6 +759,7 @@ for code in 'xXobns': self.assertRaises(ValueError, format, 0, ',' + code) + @unittest.skipIf(is_jython, "FIXME: not working") def test_internal_sizes(self): self.assertGreater(object.__basicsize__, 0) self.assertGreater(tuple.__itemsize__, 0) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 06:08:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 06:08:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_More_skips=2E?= Message-ID: http://hg.python.org/jython/rev/39d391a41285 changeset: 6489:39d391a41285 user: Frank Wierzbicki date: Thu Mar 22 22:07:54 2012 -0700 summary: More skips. files: Lib/test/test_unicode.py | 2 ++ Lib/test/test_urllib2.py | 4 ++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -464,6 +464,7 @@ self.assertRaises(TypeError, unicode, 42, 42, 42) + @unittest.skip("FIXME: broken") def test_codecs_utf7(self): utfTests = [ (u'A\u2262\u0391.', 'A+ImIDkQ.'), # RFC2152 example @@ -586,6 +587,7 @@ # Error handling (PyUnicode_EncodeDecimal()) self.assertRaises(UnicodeError, int, u"\u0200") + @unittest.skip("FIXME: broken") def test_codecs(self): # Encoding self.assertEqual(u'hello'.encode('ascii'), 'hello') diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -601,6 +601,7 @@ class HandlerTests(unittest.TestCase): + @unittest.skip("FIXME: broken") def test_ftp(self): class MockFTPWrapper: def __init__(self, data): self.data = data @@ -658,6 +659,7 @@ self.assertEqual(headers.get("Content-type"), mimetype) self.assertEqual(int(headers["Content-length"]), len(data)) + @unittest.skip("FIXME: not working") def test_file(self): import rfc822, socket h = urllib2.FileHandler() @@ -751,6 +753,7 @@ self.assertEqual(req.type, "ftp") self.assertEqual(req.type == "ftp", ftp) + @unittest.skip("FIXME: broken") def test_http(self): h = urllib2.AbstractHTTPHandler() @@ -839,6 +842,7 @@ p_ds_req = h.do_request_(ds_req) self.assertEqual(p_ds_req.unredirected_hdrs["Host"],"example.com") + @unittest.skip("FIXME: broken") def test_fixpath_in_weirdurls(self): # Issue4493: urllib2 to supply '/' when to urls where path does not # start with'/' -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 06:11:37 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 06:11:37 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_More_skips=2E?= Message-ID: http://hg.python.org/jython/rev/c007625f411f changeset: 6490:c007625f411f user: Frank Wierzbicki date: Thu Mar 22 22:11:30 2012 -0700 summary: More skips. files: Lib/test/test_weakref.py | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -213,6 +213,7 @@ self.assertEqual(L3[:5], p3[:5]) self.assertEqual(L3[2:5], p3[2:5]) + @unittest.skip("FIXME: broken") def test_proxy_unicode(self): # See bug 5037 class C(object): @@ -224,6 +225,7 @@ self.assertTrue("__unicode__" in dir(weakref.proxy(instance))) self.assertEqual(unicode(weakref.proxy(instance)), u"unicode") + @unittest.skip("FIXME: broken") def test_proxy_index(self): class C: def __index__(self): @@ -232,6 +234,7 @@ p = weakref.proxy(o) self.assertEqual(operator.index(p), 10) + @unittest.skip("FIXME: broken") def test_proxy_div(self): class C: def __floordiv__(self, other): @@ -710,6 +713,7 @@ w = Target() + @unittest.skip("FIXME: broken") def test_init(self): # Issue 3634 # .__init__() doesn't check errors correctly @@ -721,6 +725,7 @@ class SubclassableWeakrefTestCase(TestBase): + @unittest.skip("FIXME: broken") def test_subclass_refs(self): class MyRef(weakref.ref): def __init__(self, ob, callback=None, value=42): @@ -738,6 +743,7 @@ self.assert_(mr() is None) self.assert_(mr.called) + @unittest.skip("FIXME: broken") def test_subclass_refs_dont_replace_standard_refs(self): class MyRef(weakref.ref): pass @@ -755,6 +761,7 @@ self.assert_(r1 in refs[1:]) self.assert_(r3 in refs[1:]) + @unittest.skip("FIXME: broken") def test_subclass_refs_dont_conflate_callbacks(self): class MyRef(weakref.ref): pass -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 06:38:07 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 06:38:07 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Added_a_method_to_test=5Fsup?= =?utf8?q?port=2E?= Message-ID: http://hg.python.org/jython/rev/e82f8c36e441 changeset: 6491:e82f8c36e441 user: Frank Wierzbicki date: Thu Mar 22 22:38:00 2012 -0700 summary: Added a method to test_support. files: Lib/test/test_support.py | 47 ++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -6,6 +6,7 @@ import contextlib import errno import functools +import gc import socket import sys import os @@ -14,7 +15,9 @@ import warnings import unittest import importlib +import UserDict import re +import time try: import thread except ImportError: @@ -445,6 +448,50 @@ unlink(TESTFN) del fp +# Disambiguate TESTFN for parallel testing, while letting it remain a valid +# module name. +TESTFN = "{}_{}_tmp".format(TESTFN, "1") #XXX "1" is a dummy for os.getpid() + +# Save the initial cwd +SAVEDCWD = os.getcwd() + + at contextlib.contextmanager +def temp_cwd(name='tempcwd', quiet=False): + """ + Context manager that creates a temporary directory and set it as CWD. + + The new CWD is created in the current directory and it's named *name*. + If *quiet* is False (default) and it's not possible to create or change + the CWD, an error is raised. If it's True, only a warning is raised + and the original CWD is used. + """ + if isinstance(name, unicode): + try: + name = name.encode(sys.getfilesystemencoding() or 'ascii') + except UnicodeEncodeError: + if not quiet: + raise unittest.SkipTest('unable to encode the cwd name with ' + 'the filesystem encoding.') + saved_dir = os.getcwd() + is_temporary = False + try: + os.mkdir(name) + os.chdir(name) + is_temporary = True + except OSError: + if not quiet: + raise + warnings.warn('tests may fail, unable to change the CWD to ' + name, + RuntimeWarning, stacklevel=3) + try: + yield os.getcwd() + finally: + os.chdir(saved_dir) + if is_temporary: + rmtree(name) + + + def findfile(file, here=__file__, subdir=None): """Try to find a file on sys.path and the working directory. If it is not found the argument passed to the function is returned (this does not -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 18:31:13 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 18:31:13 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Expose_reload_in_imp_module_?= =?utf8?q?to_make_test=5Fimp_happy=2E?= Message-ID: http://hg.python.org/jython/rev/fc60040abea4 changeset: 6492:fc60040abea4 user: Frank Wierzbicki date: Fri Mar 23 10:31:04 2012 -0700 summary: Expose reload in imp module to make test_imp happy. files: src/org/python/core/__builtin__.java | 26 +++++++++------ src/org/python/modules/imp.java | 5 +++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/org/python/core/__builtin__.java b/src/org/python/core/__builtin__.java --- a/src/org/python/core/__builtin__.java +++ b/src/org/python/core/__builtin__.java @@ -104,17 +104,7 @@ case 34: return Py.newString(__builtin__.raw_input(arg1)); case 36: - Object o = arg1.__tojava__(PyModule.class); - if (o == Py.NoConversion) { - if (arg1 instanceof PySystemState) { - return __builtin__.reload((PySystemState)arg1); - } else if(arg1 instanceof PyJavaType) { - // This has always been a no-op. Should be disabled in py3k. - return arg1; - } - throw Py.TypeError("reload() argument must be a module"); - } - return __builtin__.reload((PyModule) o); + return __builtin__.reload(arg1); case 37: return __builtin__.repr(arg1); case 41: @@ -1043,6 +1033,20 @@ return reduce(f, l, null); } + public static PyObject reload(PyObject o) { + Object module = o.__tojava__(PyModule.class); + if (module == Py.NoConversion) { + if (o instanceof PySystemState) { + return __builtin__.reload((PySystemState)o); + } else if(o instanceof PyJavaType) { + // This has always been a no-op. Should be disabled in py3k. + return o; + } + throw Py.TypeError("reload() argument must be a module"); + } + return __builtin__.reload((PyModule) module); + } + public static PyObject reload(PyModule o) { return imp.reload(o); } diff --git a/src/org/python/modules/imp.java b/src/org/python/modules/imp.java --- a/src/org/python/modules/imp.java +++ b/src/org/python/modules/imp.java @@ -1,6 +1,7 @@ package org.python.modules; +import org.python.core.__builtin__; import org.python.core.Py; import org.python.core.PyFile; import org.python.core.PyList; @@ -163,6 +164,10 @@ return load_compiled(name, pathname, new PyFile(pathname, "rb", -1)); } + public static PyObject reload(PyObject module) { + return __builtin__.reload(module); + } + public static PyObject load_compiled(String name, String pathname, PyObject file) { InputStream stream = (InputStream) file.__tojava__(InputStream.class); if (stream == Py.NoConversion) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 18:38:26 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 18:38:26 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Update_genpatches_with_the_n?= =?utf8?q?ew_cpython_lib_name=2E?= Message-ID: http://hg.python.org/jython/rev/2491c8a52600 changeset: 6493:2491c8a52600 user: Frank Wierzbicki date: Fri Mar 23 10:38:20 2012 -0700 summary: Update genpatches with the new cpython lib name. files: Misc/genpatches.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/genpatches.py b/Misc/genpatches.py --- a/Misc/genpatches.py +++ b/Misc/genpatches.py @@ -7,7 +7,7 @@ The script expects to be run in the jython root directory and there should be a "cpython" directory in the parent directory. That directory should be a clone of the CPython release against which the modules in Lib/ have currently been patched. -Only modules that are common to Lib/, CPythonLib/ and ../cpython/Lib will be included in +Only modules that are common to Lib/, lib-python/ and ../cpython/Lib will be included in the patches. """ from StringIO import StringIO @@ -36,7 +36,7 @@ sys.exit(1) jymodules = get_modules(u'Lib') -cpymodules = get_modules(u'CPythonLib') +cpymodules = get_modules(u'lib-python') cpy25modules = get_modules(u'../cpython/Lib') common_modules = jymodules.intersection(cpy25modules).intersection(cpymodules) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 23 19:55:02 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 23 Mar 2012 19:55:02 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_new_flags_to_CompilerFla?= =?utf8?b?Z3Mu?= Message-ID: http://hg.python.org/jython/rev/4573198a42c6 changeset: 6494:4573198a42c6 user: Frank Wierzbicki date: Fri Mar 23 11:54:53 2012 -0700 summary: Add new flags to CompilerFlags. files: src/org/python/core/CompilerFlags.java | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/org/python/core/CompilerFlags.java b/src/org/python/core/CompilerFlags.java --- a/src/org/python/core/CompilerFlags.java +++ b/src/org/python/core/CompilerFlags.java @@ -67,8 +67,12 @@ isFlagSet(CodeFlag.CO_NESTED), isFlagSet(CodeFlag.CO_GENERATOR_ALLOWED), isFlagSet(CodeFlag.CO_FUTURE_WITH_STATEMENT), - isFlagSet(CodeFlag.CO_FUTURE_ABSOLUTE_IMPORT), only_ast, - dont_imply_dedent, source_is_utf8); + isFlagSet(CodeFlag.CO_FUTURE_ABSOLUTE_IMPORT), + isFlagSet(CodeFlag.CO_FUTURE_PRINT_FUNCTION), + isFlagSet(CodeFlag.CO_FUTURE_UNICODE_LITERALS), + only_ast, + dont_imply_dedent, + source_is_utf8); } public static CompilerFlags getCompilerFlags() { @@ -82,7 +86,9 @@ | CodeFlag.CO_GENERATOR_ALLOWED.flag | CodeFlag.CO_FUTURE_DIVISION.flag | CodeFlag.CO_FUTURE_ABSOLUTE_IMPORT.flag - | CodeFlag.CO_FUTURE_WITH_STATEMENT.flag; + | CodeFlag.CO_FUTURE_WITH_STATEMENT.flag + | CodeFlag.CO_FUTURE_PRINT_FUNCTION.flag + | CodeFlag.CO_FUTURE_UNICODE_LITERALS.flag; public static CompilerFlags getCompilerFlags(int flags, PyFrame frame) { if ((flags & ~CO_ALL_FEATURES) != 0) { -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Tue Mar 27 20:06:52 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Tue, 27 Mar 2012 20:06:52 +0200 Subject: [Jython-checkins] =?utf8?q?jython=3A_float=2Ehex_and_float=2Efrom?= =?utf8?q?hex=2E?= Message-ID: http://hg.python.org/jython/rev/99e5202e5153 changeset: 6495:99e5202e5153 user: Frank Wierzbicki date: Tue Mar 27 11:06:42 2012 -0700 summary: float.hex and float.fromhex. files: src/org/python/core/PyFloat.java | 68 ++++++++++++++++++++ 1 files changed, 68 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java --- a/src/org/python/core/PyFloat.java +++ b/src/org/python/core/PyFloat.java @@ -89,6 +89,74 @@ return Py.newFloat(0.0); } + @ExposedClassMethod(doc = BuiltinDocs.float_fromhex_doc) + public static PyObject float_fromhex(PyType type, PyObject o) { + //XXX: I'm sure this could be shortened/simplified, but Double.parseDouble() takes + // non-hex strings and requires the form 0xNUMBERpNUMBER for hex input which + // causes extra complexity here. + + String message = "invalid hexadecimal floating-point string"; + boolean negative = false; + + PyString s = o.__str__(); + String value = s.getString().trim().toLowerCase(); + + if (value.length() == 0) { + throw Py.ValueError(message); + } + if (value.equals("nan") || value.equals("-nan") || value.equals("+nan")) { + return new PyFloat(Double.NaN); + } + if (value.equals("inf") ||value.equals("infinity") || + value.equals("+inf") ||value.equals("+infinity")) { + return new PyFloat(Double.POSITIVE_INFINITY); + } + if (value.equals("-inf") || value.equals("-infinity")) { + return new PyFloat(Double.NEGATIVE_INFINITY); + } + + //Strip and record + or - + if (value.charAt(0) == '-') { + value = value.substring(1); + negative = true; + } else if (value.charAt(0) == '+') { + value = value.substring(1); + } + if (value.length() == 0) { + throw Py.ValueError(message); + } + + //Append 0x if not present. + if (!value.startsWith("0x") && !value.startsWith("0X")) { + value = "0x" + value; + } + + //reattach - if needed. + if (negative) { + value = "-" + value; + } + + //Append p if not present. + if (value.indexOf('p') == -1) { + value = value + "p0"; + } + + try { + double d = Double.parseDouble(value); + if (Double.isInfinite(d)) { + throw Py.OverflowError("hexadecimal value too large to represent as a float"); + } + return new PyFloat(d); + } catch (NumberFormatException n) { + throw Py.ValueError(message); + } + } + + @ExposedClassMethod(doc = BuiltinDocs.float_hex_doc) + public static PyObject float_hex(PyType type, double value) { + return new PyString(Double.toHexString(value)); + } + /** * Determine if this float is not infinity, nor NaN. */ -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 18:04:41 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 29 Mar 2012 18:04:41 +0200 Subject: [Jython-checkins] =?utf8?q?jython=3A_Issue_1837_fix=2E_Replace_us?= =?utf8?q?e_of_os=2Epath=2Esamefile_with_path_test_in_gderived=2Epy=2C?= Message-ID: http://hg.python.org/jython/rev/76b77b00a4fe changeset: 6496:76b77b00a4fe user: ja...py at farowl.co.uk date: Sat Feb 11 23:32:57 2012 +0000 summary: Issue 1837 fix. Replace use of os.path.samefile with path test in gderived.py, so it works on Windows files: src/templates/gderived.py | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/templates/gderived.py b/src/templates/gderived.py --- a/src/templates/gderived.py +++ b/src/templates/gderived.py @@ -23,6 +23,15 @@ modif_re = re.compile(r"(?:\((\w+)\))?(\w+)") +# os.path.samefile unavailable on Windows before Python v3.2 +if hasattr(os.path,"samefile"): + # Good: available on this platform + os_path_samefile = os.path.samefile +else: + def os_path_samefile(a,b): + 'Files are considered the same if their absolute paths are equal' + return os.path.abspath(a)==os.path.abspath(b) + class Gen: priority_order = ['require','define','base_class', @@ -212,7 +221,7 @@ org.python.core """ parent = os.path.dirname(fn) - if os.path.samefile(parent, core_dir): + if os_path_samefile(parent, core_dir): return result print 'Fixing header for: %s' % fn @@ -220,7 +229,7 @@ while True: parent, tail = os.path.split(parent) dirs.insert(0, tail) - if os.path.samefile(parent, org_python_dir) or not tail: + if os_path_samefile(parent, org_python_dir) or not tail: break result = result.splitlines() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:08:43 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:08:43 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Adding_a_documen?= =?utf8?q?tation_link_to_SSL_exception_messages?= Message-ID: http://hg.python.org/jython/rev/29a0cbeffdbd changeset: 6497:29a0cbeffdbd branch: 2.5 parent: 6443:9c21ad4e5818 user: Alan Kennedy date: Thu Mar 29 20:03:46 2012 +0100 summary: Adding a documentation link to SSL exception messages files: Lib/socket.py | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/socket.py b/Lib/socket.py --- a/Lib/socket.py +++ b/Lib/socket.py @@ -98,6 +98,8 @@ ALL = None +_ssl_message = ": Differences between the SSL socket behaviour of cpython vs. jython are explained on the wiki: http://wiki.python.org/jython/NewSocketModule#SSL_Support" + _exception_map = { # (, ) : callable that raises the python equivalent exception, or None to stub out as unmapped @@ -134,11 +136,11 @@ # These error codes are currently wrong: getting them correct is going to require # some investigation. Cpython 2.6 introduced extensive SSL support. -(javax.net.ssl.SSLException, ALL) : lambda x: sslerror(-1, 'SSL exception'), -(javax.net.ssl.SSLHandshakeException, ALL) : lambda x: sslerror(-1, 'SSL handshake exception'), -(javax.net.ssl.SSLKeyException, ALL) : lambda x: sslerror(-1, 'SSL key exception'), -(javax.net.ssl.SSLPeerUnverifiedException, ALL) : lambda x: sslerror(-1, 'SSL peer unverified exception'), -(javax.net.ssl.SSLProtocolException, ALL) : lambda x: sslerror(-1, 'SSL protocol exception'), +(javax.net.ssl.SSLException, ALL) : lambda x: sslerror(-1, 'SSL exception'+_ssl_message), +(javax.net.ssl.SSLHandshakeException, ALL) : lambda x: sslerror(-1, 'SSL handshake exception'+_ssl_message), +(javax.net.ssl.SSLKeyException, ALL) : lambda x: sslerror(-1, 'SSL key exception'+_ssl_message), +(javax.net.ssl.SSLPeerUnverifiedException, ALL) : lambda x: sslerror(-1, 'SSL peer unverified exception'+_ssl_message), +(javax.net.ssl.SSLProtocolException, ALL) : lambda x: sslerror(-1, 'SSL protocol exception'+_ssl_message), } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:08:43 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:08:43 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_merge_w/2=2E5=3A_Adding_a_documentation_link_to_SSL_exceptio?= =?utf8?q?n_messages?= Message-ID: http://hg.python.org/jython/rev/e92d8b276f06 changeset: 6498:e92d8b276f06 parent: 6496:76b77b00a4fe parent: 6497:29a0cbeffdbd user: Alan Kennedy date: Thu Mar 29 20:07:40 2012 +0100 summary: merge w/2.5: Adding a documentation link to SSL exception messages files: Lib/socket.py | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/socket.py b/Lib/socket.py --- a/Lib/socket.py +++ b/Lib/socket.py @@ -98,6 +98,8 @@ ALL = None +_ssl_message = ": Differences between the SSL socket behaviour of cpython vs. jython are explained on the wiki: http://wiki.python.org/jython/NewSocketModule#SSL_Support" + _exception_map = { # (, ) : callable that raises the python equivalent exception, or None to stub out as unmapped @@ -134,11 +136,11 @@ # These error codes are currently wrong: getting them correct is going to require # some investigation. Cpython 2.6 introduced extensive SSL support. -(javax.net.ssl.SSLException, ALL) : lambda x: sslerror(-1, 'SSL exception'), -(javax.net.ssl.SSLHandshakeException, ALL) : lambda x: sslerror(-1, 'SSL handshake exception'), -(javax.net.ssl.SSLKeyException, ALL) : lambda x: sslerror(-1, 'SSL key exception'), -(javax.net.ssl.SSLPeerUnverifiedException, ALL) : lambda x: sslerror(-1, 'SSL peer unverified exception'), -(javax.net.ssl.SSLProtocolException, ALL) : lambda x: sslerror(-1, 'SSL protocol exception'), +(javax.net.ssl.SSLException, ALL) : lambda x: sslerror(-1, 'SSL exception'+_ssl_message), +(javax.net.ssl.SSLHandshakeException, ALL) : lambda x: sslerror(-1, 'SSL handshake exception'+_ssl_message), +(javax.net.ssl.SSLKeyException, ALL) : lambda x: sslerror(-1, 'SSL key exception'+_ssl_message), +(javax.net.ssl.SSLPeerUnverifiedException, ALL) : lambda x: sslerror(-1, 'SSL peer unverified exception'+_ssl_message), +(javax.net.ssl.SSLProtocolException, ALL) : lambda x: sslerror(-1, 'SSL protocol exception'+_ssl_message), } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:38:13 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:38:13 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Disabling_the_jl?= =?utf8?q?ine_bell?= Message-ID: http://hg.python.org/jython/rev/1f79b129c3bf changeset: 6499:1f79b129c3bf branch: 2.5 parent: 6497:29a0cbeffdbd user: Alan Kennedy date: Thu Mar 29 20:35:49 2012 +0100 summary: Disabling the jline bell files: src/org/python/util/JLineConsole.java | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/src/org/python/util/JLineConsole.java b/src/org/python/util/JLineConsole.java --- a/src/org/python/util/JLineConsole.java +++ b/src/org/python/util/JLineConsole.java @@ -78,6 +78,7 @@ Writer output = new OutputStreamWriter(new FileOutputStream(FileDescriptor.out), "ISO-8859-1"); reader = new ConsoleReader(input, output, getBindings()); + reader.setBellEnabled(false); } catch (IOException e) { throw new RuntimeException(e); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:38:14 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:38:14 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_merge_w/2=2E5=3A_Disabling_the_jline_bell?= Message-ID: http://hg.python.org/jython/rev/3ab970a481ea changeset: 6500:3ab970a481ea parent: 6498:e92d8b276f06 parent: 6499:1f79b129c3bf user: Alan Kennedy date: Thu Mar 29 20:37:19 2012 +0100 summary: merge w/2.5: Disabling the jline bell files: src/org/python/util/JLineConsole.java | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/src/org/python/util/JLineConsole.java b/src/org/python/util/JLineConsole.java --- a/src/org/python/util/JLineConsole.java +++ b/src/org/python/util/JLineConsole.java @@ -78,6 +78,7 @@ Writer output = new OutputStreamWriter(new FileOutputStream(FileDescriptor.out), "ISO-8859-1"); reader = new ConsoleReader(input, output, getBindings()); + reader.setBellEnabled(false); } catch (IOException e) { throw new RuntimeException(e); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:43:16 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:43:16 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Updating_NEWS_fi?= =?utf8?q?le?= Message-ID: http://hg.python.org/jython/rev/bf3ed36e65bd changeset: 6501:bf3ed36e65bd branch: 2.5 parent: 6499:1f79b129c3bf user: Alan Kennedy date: Thu Mar 29 20:41:42 2012 +0100 summary: Updating NEWS file files: NEWS | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,10 +5,11 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close + - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1749 ] function descriptor doesn't work in interactive console - - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 + - [ 1816 ] Jython Interactive Console makes system beep noise too much - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 21:43:16 2012 From: jython-checkins at python.org (alan.kennedy) Date: Thu, 29 Mar 2012 21:43:16 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Updating_NEWS_file?= Message-ID: http://hg.python.org/jython/rev/c31f7187b7bc changeset: 6502:c31f7187b7bc parent: 6500:3ab970a481ea parent: 6501:bf3ed36e65bd user: Alan Kennedy date: Thu Mar 29 20:42:29 2012 +0100 summary: Updating NEWS file files: NEWS | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,10 +5,11 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close + - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - [ 1749 ] function descriptor doesn't work in interactive console - - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) - - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 + - [ 1816 ] Jython Interactive Console makes system beep noise too much - [ 1829 ] test_socket.py failing on Ubuntu (Oneiric) - [ 1844 ] bad host returned by getsockname -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 22:06:49 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 29 Mar 2012 22:06:49 +0200 Subject: [Jython-checkins] =?utf8?q?jython=3A_Skip_list_tests_-_one_someti?= =?utf8?q?mes_killed_my_regression_=28due_to_OOM=29=2E?= Message-ID: http://hg.python.org/jython/rev/60346d729b91 changeset: 6503:60346d729b91 user: Frank Wierzbicki date: Thu Mar 29 13:02:28 2012 -0700 summary: Skip list tests - one sometimes killed my regression (due to OOM). files: Lib/test/list_tests.py | 19 ++++-- Lib/test/test_list.py | 80 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 7 deletions(-) diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -45,10 +45,12 @@ self.assertEqual(str(a2), "[0, 1, 2, [...], 3]") self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]") - l0 = [] - for i in xrange(sys.getrecursionlimit() + 100): - l0 = [l0] - self.assertRaises(RuntimeError, repr, l0) + #FIXME: not working on Jython + if not test_support.is_jython: + l0 = [] + for i in xrange(sys.getrecursionlimit() + 100): + l0 = [l0] + self.assertRaises(RuntimeError, repr, l0) def test_print(self): d = self.type2test(xrange(200)) @@ -526,9 +528,12 @@ a = self.type2test(range(10)) a[::2] = tuple(range(5)) self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) - # test issue7788 - a = self.type2test(range(10)) - del a[9::1<<333] + + #FIXME: not working on Jython + if not test_support.is_jython: + # test issue7788 + a = self.type2test(range(10)) + del a[9::1<<333] # XXX: CPython specific, PyList doesn't len() during init def _test_constructor_exception_handling(self): diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_list.py @@ -0,0 +1,80 @@ +import sys +from test import test_support, list_tests + +class ListTest(list_tests.CommonTest): + type2test = list + + def test_basic(self): + self.assertEqual(list([]), []) + l0_3 = [0, 1, 2, 3] + l0_3_bis = list(l0_3) + self.assertEqual(l0_3, l0_3_bis) + self.assertTrue(l0_3 is not l0_3_bis) + self.assertEqual(list(()), []) + self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3]) + self.assertEqual(list(''), []) + self.assertEqual(list('spam'), ['s', 'p', 'a', 'm']) + + #FIXME: too brutal for us ATM. + if not test_support.is_jython: + if sys.maxsize == 0x7fffffff: + # This test can currently only work on 32-bit machines. + # XXX If/when PySequence_Length() returns a ssize_t, it should be + # XXX re-enabled. + # Verify clearing of bug #556025. + # This assumes that the max data size (sys.maxint) == max + # address size this also assumes that the address size is at + # least 4 bytes with 8 byte addresses, the bug is not well + # tested + # + # Note: This test is expected to SEGV under Cygwin 1.3.12 or + # earlier due to a newlib bug. See the following mailing list + # thread for the details: + + # http://sources.redhat.com/ml/newlib/2002/msg00369.html + self.assertRaises(MemoryError, list, xrange(sys.maxint // 2)) + + # This code used to segfault in Py2.4a3 + x = [] + x.extend(-y for y in x) + self.assertEqual(x, []) + + def test_truth(self): + super(ListTest, self).test_truth() + self.assertTrue(not []) + self.assertTrue([42]) + + def test_identity(self): + self.assertTrue([] is not []) + + def test_len(self): + super(ListTest, self).test_len() + self.assertEqual(len([]), 0) + self.assertEqual(len([0]), 1) + self.assertEqual(len([0, 1, 2]), 3) + + def test_overflow(self): + lst = [4, 5, 6, 7] + n = int((sys.maxint*2+2) // len(lst)) + def mul(a, b): return a * b + def imul(a, b): a *= b + self.assertRaises((MemoryError, OverflowError), mul, lst, n) + self.assertRaises((MemoryError, OverflowError), imul, lst, n) + +def test_main(verbose=None): + test_support.run_unittest(ListTest) + + # verify reference counting + import sys + if verbose and hasattr(sys, "gettotalrefcount"): + import gc + counts = [None] * 5 + for i in xrange(len(counts)): + test_support.run_unittest(ListTest) + gc.collect() + counts[i] = sys.gettotalrefcount() + print counts + + +if __name__ == "__main__": + test_main(verbose=True) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 22:50:25 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 29 Mar 2012 22:50:25 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_=231837_Backport?= =?utf8?q?_gderived=2Epy_fix_for_Windows_to_2=2E5=2E_Thanks_Jeff_Allen!?= Message-ID: http://hg.python.org/jython/rev/c7f648b3e03a changeset: 6504:c7f648b3e03a branch: 2.5 parent: 6501:bf3ed36e65bd user: Frank Wierzbicki date: Thu Mar 29 13:49:48 2012 -0700 summary: #1837 Backport gderived.py fix for Windows to 2.5. Thanks Jeff Allen! files: NEWS | 1 + src/templates/gderived.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1837 ] gderived.py and template Ant target fail on Windows - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) diff --git a/src/templates/gderived.py b/src/templates/gderived.py --- a/src/templates/gderived.py +++ b/src/templates/gderived.py @@ -23,6 +23,15 @@ modif_re = re.compile(r"(?:\((\w+)\))?(\w+)") +# os.path.samefile unavailable on Windows before Python v3.2 +if hasattr(os.path,"samefile"): + # Good: available on this platform + os_path_samefile = os.path.samefile +else: + def os_path_samefile(a,b): + 'Files are considered the same if their absolute paths are equal' + return os.path.abspath(a)==os.path.abspath(b) + class Gen: priority_order = ['require','define','base_class', @@ -212,7 +221,7 @@ org.python.core """ parent = os.path.dirname(fn) - if os.path.samefile(parent, core_dir): + if os_path_samefile(parent, core_dir): return result print 'Fixing header for: %s' % fn @@ -220,7 +229,7 @@ while True: parent, tail = os.path.split(parent) dirs.insert(0, tail) - if os.path.samefile(parent, org_python_dir) or not tail: + if os_path_samefile(parent, org_python_dir) or not tail: break result = result.splitlines() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 29 22:51:47 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 29 Mar 2012 22:51:47 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/967bfe23ac3c changeset: 6505:967bfe23ac3c parent: 6503:60346d729b91 parent: 6504:c7f648b3e03a user: Frank Wierzbicki date: Thu Mar 29 13:51:35 2012 -0700 summary: Merge from 2.5. files: NEWS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1837 ] gderived.py and template Ant target fail on Windows - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close - [ 1721 ] NPE when using JSR 223 (TestCase+Patch) -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 00:03:24 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 00:03:24 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Restore_antlr_er?= =?utf8?q?ror_count_for_analysis=2C_thanks_Roman_=28smokxx=29!?= Message-ID: http://hg.python.org/jython/rev/11f442c1e716 changeset: 6506:11f442c1e716 branch: 2.5 parent: 6504:c7f648b3e03a user: Frank Wierzbicki date: Thu Mar 29 14:59:03 2012 -0700 summary: Restore antlr error count for analysis, thanks Roman (smokxx)! files: NEWS | 1 + grammar/Python.g | 25 +++++++-- src/org/python/antlr/RecordingErrorHandler.java | 1 - 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1866 ] Parser does not have mismatch token error messages caught by BaseRecognizer - [ 1837 ] gderived.py and template Ant target fail on Windows - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -185,11 +185,22 @@ this.encoding = encoding; } + @Override + public void reportError(RecognitionException e) { + // Update syntax error count and output error. + super.reportError(e); + errorHandler.reportError(this, e); + } + + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) { + // Do nothing. We record errors instead of printing them. + } } @rulecatch { catch (RecognitionException re) { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); retval.tree = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); } @@ -251,16 +262,16 @@ } return state.token; } catch (NoViableAltException nva) { - errorHandler.reportError(this, nva); + reportError(nva); errorHandler.recover(this, nva); // throw out current char and try again } catch (FailedPredicateException fp) { //XXX: added this for failed STRINGPART -- the FailedPredicateException // hides a NoViableAltException. This should be the only // FailedPredicateException that gets thrown by the lexer. - errorHandler.reportError(this, fp); + reportError(fp); errorHandler.recover(this, fp); // throw out current char and try again } catch (RecognitionException re) { - errorHandler.reportError(this, re); + reportError(re); // match() routine has already called recover() } } @@ -292,7 +303,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); @@ -331,7 +342,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); @@ -352,7 +363,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); diff --git a/src/org/python/antlr/RecordingErrorHandler.java b/src/org/python/antlr/RecordingErrorHandler.java --- a/src/org/python/antlr/RecordingErrorHandler.java +++ b/src/org/python/antlr/RecordingErrorHandler.java @@ -26,7 +26,6 @@ public List errs = new ArrayList(); public void reportError(BaseRecognizer br, RecognitionException re) { - br.reportError(re); errs.add(re); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 00:03:24 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 00:03:24 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/aab8ce176bdc changeset: 6507:aab8ce176bdc parent: 6505:967bfe23ac3c parent: 6506:11f442c1e716 user: Frank Wierzbicki date: Thu Mar 29 15:02:30 2012 -0700 summary: Merge from 2.5. files: NEWS | 1 + grammar/Python.g | 25 +++++++-- src/org/python/antlr/RecordingErrorHandler.java | 1 - 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Jython 2.5.3b2 Bugs Fixed + - [ 1866 ] Parser does not have mismatch token error messages caught by BaseRecognizer - [ 1837 ] gderived.py and template Ant target fail on Windows - [ 1536 ] NPE in org.python.jsr223.PyScriptEngine:187 - [ 1640 ] cStringIO does not complain on getvalue after close diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -191,11 +191,22 @@ this.encoding = encoding; } + @Override + public void reportError(RecognitionException e) { + // Update syntax error count and output error. + super.reportError(e); + errorHandler.reportError(this, e); + } + + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) { + // Do nothing. We record errors instead of printing them. + } } @rulecatch { catch (RecognitionException re) { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); retval.tree = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); } @@ -257,16 +268,16 @@ } return state.token; } catch (NoViableAltException nva) { - errorHandler.reportError(this, nva); + reportError(nva); errorHandler.recover(this, nva); // throw out current char and try again } catch (FailedPredicateException fp) { //XXX: added this for failed STRINGPART -- the FailedPredicateException // hides a NoViableAltException. This should be the only // FailedPredicateException that gets thrown by the lexer. - errorHandler.reportError(this, fp); + reportError(fp); errorHandler.recover(this, fp); // throw out current char and try again } catch (RecognitionException re) { - errorHandler.reportError(this, re); + reportError(re); // match() routine has already called recover() } } @@ -298,7 +309,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); @@ -337,7 +348,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); @@ -358,7 +369,7 @@ ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { - errorHandler.reportError(this, re); + reportError(re); errorHandler.recover(this, input,re); PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); retval.tree = new ErrorMod(badNode); diff --git a/src/org/python/antlr/RecordingErrorHandler.java b/src/org/python/antlr/RecordingErrorHandler.java --- a/src/org/python/antlr/RecordingErrorHandler.java +++ b/src/org/python/antlr/RecordingErrorHandler.java @@ -26,7 +26,6 @@ public List errs = new ArrayList(); public void reportError(BaseRecognizer br, RecognitionException re) { - br.reportError(re); errs.add(re); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 21:17:23 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 21:17:23 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=282=2E5=29=3A_Don=27t_allow_an?= =?utf8?q?tlr_error_output_for_lexing_errors_either=2E?= Message-ID: http://hg.python.org/jython/rev/581d909657b9 changeset: 6508:581d909657b9 branch: 2.5 parent: 6506:11f442c1e716 user: Frank Wierzbicki date: Fri Mar 30 09:38:55 2012 -0700 summary: Don't allow antlr error output for lexing errors either. files: grammar/Python.g | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -194,7 +194,7 @@ @Override public void displayRecognitionError(String[] tokenNames, RecognitionException e) { - // Do nothing. We record errors instead of printing them. + //Do nothing. We will handle error display elsewhere. } } @@ -276,6 +276,11 @@ } } } + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) { + //Do nothing. We will handle error display elsewhere. + } + } //START OF PARSER RULES -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 21:17:23 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 21:17:23 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?b?OiBNZXJnZSAyLjUu?= Message-ID: http://hg.python.org/jython/rev/cdc523f2b883 changeset: 6509:cdc523f2b883 parent: 6507:aab8ce176bdc parent: 6508:581d909657b9 user: Frank Wierzbicki date: Fri Mar 30 09:41:13 2012 -0700 summary: Merge 2.5. files: grammar/Python.g | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/grammar/Python.g b/grammar/Python.g --- a/grammar/Python.g +++ b/grammar/Python.g @@ -200,7 +200,7 @@ @Override public void displayRecognitionError(String[] tokenNames, RecognitionException e) { - // Do nothing. We record errors instead of printing them. + //Do nothing. We will handle error display elsewhere. } } @@ -282,6 +282,11 @@ } } } + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) { + //Do nothing. We will handle error display elsewhere. + } + } //START OF PARSER RULES -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 22:17:20 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 22:17:20 +0200 Subject: [Jython-checkins] =?utf8?b?anl0aG9uICgyLjUpOiAjMTg0MCBmaXggbmFu?= =?utf8?q?=3C0_is_True_but_should_be_False=2E?= Message-ID: http://hg.python.org/jython/rev/c514ff14cef5 changeset: 6510:c514ff14cef5 branch: 2.5 parent: 6508:581d909657b9 user: Frank Wierzbicki date: Fri Mar 30 12:52:55 2012 -0700 summary: #1840 fix nan<0 is True but should be False. files: src/org/python/core/PyFloat.java | 36 ++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java --- a/src/org/python/core/PyFloat.java +++ b/src/org/python/core/PyFloat.java @@ -196,6 +196,42 @@ } @Override + public PyObject __gt__(PyObject other) { + // NaN > anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __ge__(PyObject other) { + //NaN >= anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __lt__(PyObject other) { + //NaN < anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __le__(PyObject other) { + //NaN >= anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override public int __cmp__(PyObject other) { return float___cmp__(other); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Fri Mar 30 22:17:20 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Fri, 30 Mar 2012 22:17:20 +0200 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_2=2E5_-=3E_default=29?= =?utf8?q?=3A_Merge_from_2=2E5=2E?= Message-ID: http://hg.python.org/jython/rev/2c973a8c50ed changeset: 6511:2c973a8c50ed parent: 6509:cdc523f2b883 parent: 6510:c514ff14cef5 user: Frank Wierzbicki date: Fri Mar 30 13:17:11 2012 -0700 summary: Merge from 2.5. files: src/org/python/core/PyFloat.java | 36 ++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-) diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java --- a/src/org/python/core/PyFloat.java +++ b/src/org/python/core/PyFloat.java @@ -279,6 +279,42 @@ } @Override + public PyObject __gt__(PyObject other) { + // NaN > anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __ge__(PyObject other) { + //NaN >= anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __lt__(PyObject other) { + //NaN < anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override + public PyObject __le__(PyObject other) { + //NaN >= anything is always false. + if (Double.isNaN(getValue())) { + return Py.False; + } + return null; + } + + @Override public int __cmp__(PyObject other) { return float___cmp__(other); } -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Sat Mar 31 21:26:34 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Sat, 31 Mar 2012 21:26:34 +0200 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_some_skips=2C_pull_in_fi?= =?utf8?q?lecmp=2E?= Message-ID: http://hg.python.org/jython/rev/32efbffce839 changeset: 6512:32efbffce839 user: Frank Wierzbicki date: Sat Mar 31 12:26:15 2012 -0700 summary: Add some skips, pull in filecmp. files: CPythonLib.includes | 1 + Lib/test/regrtest.py | 7 +++++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/CPythonLib.includes b/CPythonLib.includes --- a/CPythonLib.includes +++ b/CPythonLib.includes @@ -62,6 +62,7 @@ dummy_thread.py dummy_threading.py exceptions.py +filecmp.py fnmatch.py formatter.py fpformat.py diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1214,6 +1214,7 @@ test_imageop test_imgfile test_ioctl + test_kqueue test_largefile test_linuxaudiodev test_locale @@ -1221,7 +1222,10 @@ test_macfs test_macostools test_memoryview + test_mhlib test_mmap + test_msilib + test_multiprocessing test_nis test_normalization test_openpty @@ -1244,6 +1248,9 @@ test_symtable test_tcl test_timeout + test_tk + test_ttk_guionly + test_ttk_textonly test_unicode_file test_wait3 test_wait4 -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Sat Mar 31 22:39:57 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Sat, 31 Mar 2012 22:39:57 +0200 Subject: [Jython-checkins] =?utf8?q?jython=3A_Restoring_test_as_Alan_Kenne?= =?utf8?q?dy_has_already_fixed_it_for_=231640=2E?= Message-ID: http://hg.python.org/jython/rev/937b4376e4b7 changeset: 6513:937b4376e4b7 user: Frank Wierzbicki date: Sat Mar 31 13:39:42 2012 -0700 summary: Restoring test as Alan Kennedy has already fixed it for #1640. files: Lib/test/test_StringIO.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py --- a/Lib/test/test_StringIO.py +++ b/Lib/test/test_StringIO.py @@ -101,7 +101,6 @@ self._fp.close() self.assertRaises(ValueError, self._fp.next) - @unittest.skipIf(test_support.is_jython, "FIXME #1862: not working in Jython") def test_getvalue(self): self._fp.close() self.assertRaises(ValueError, self._fp.getvalue) -- Repository URL: http://hg.python.org/jython
  *   public MatchObject search(PyObject[] args, String[] kws) {
@@ -51,12 +51,12 @@
     }
 
     /**
-     * Create an ArgParser with one method argument
+     * Create an ArgParser for a one-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The expected argument in the method definition.
+     * @param p0 The expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0) {
         this(funcname, args, kws);
@@ -65,13 +65,13 @@
     }
 
     /**
-     * Create an ArgParser with two method argument
+     * Create an ArgParser for a two-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The first expected argument in the method definition.
-     * @param p1 The second expected argument in the method definition.
+     * @param p0 The first expected argument in the function definition.
+     * @param p1 The second expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0,
             String p1) {
@@ -81,14 +81,14 @@
     }
 
     /**
-     * Create an ArgParser with three method argument
+     * Create an ArgParser for a three-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param p0 The first expected argument in the method definition.
-     * @param p1 The second expected argument in the method definition.
-     * @param p2 The third expected argument in the method definition.
+     * @param p0 The first expected argument in the function definition.
+     * @param p1 The second expected argument in the function definition.
+     * @param p2 The third expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws, String p0,
             String p1, String p2) {
@@ -98,12 +98,12 @@
     }
 
     /**
-     * Create an ArgParser with three method argument
+     * Create an ArgParser for a multi-argument function.
      * 
-     * @param funcname Name of the method. Used in error messages.
+     * @param funcname Name of the function. Used in error messages.
      * @param args The actual call arguments supplied in the call.
      * @param kws The actual keyword names supplied in the call.
-     * @param paramnames The list of expected argument in the method definition.
+     * @param paramnames The list of expected argument in the function definition.
      */
     public ArgParser(String funcname, PyObject[] args, String[] kws,
             String[] paramnames) {
diff --git a/src/org/python/core/PyString.java b/src/org/python/core/PyString.java
--- a/src/org/python/core/PyString.java
+++ b/src/org/python/core/PyString.java
@@ -1,8 +1,6 @@
 /// Copyright (c) Corporation for National Research Initiatives
 package org.python.core;
 
-import java.math.BigInteger;
-
 import org.python.core.stringlib.FieldNameIterator;
 import org.python.core.stringlib.InternalFormatSpec;
 import org.python.core.stringlib.InternalFormatSpecParser;
@@ -14,6 +12,8 @@
 import org.python.expose.ExposedType;
 import org.python.expose.MethodType;
 
+import java.math.BigInteger;
+
 /**
  * A builtin python string.
  */
@@ -2492,37 +2492,43 @@
     }
 
     public String encode() {
-        return str_encode(null, null);
+        return encode(null, null);
     }
 
     public String encode(String encoding) {
-        return str_encode(encoding, null);
+        return encode(encoding, null);
     }
 
     public String encode(String encoding, String errors) {
-        return str_encode(encoding, errors);
-    }
-
-    @ExposedMethod(defaults = {"null", "null"}, doc = BuiltinDocs.str_encode_doc)
-    final String str_encode(String encoding, String errors) {
         return codecs.encode(this, encoding, errors);
     }
 
+    @ExposedMethod(doc = BuiltinDocs.str_encode_doc)
+    final String str_encode(PyObject[] args, String[] keywords) {
+        ArgParser ap = new ArgParser("encode", args, keywords, "encoding", "errors");
+        String encoding = ap.getString(0, null);
+        String errors = ap.getString(1, null);
+        return encode(encoding, errors);
+    }
+    
     public PyObject decode() {
-        return str_decode(null, null);
+        return decode(null, null);
     }
 
     public PyObject decode(String encoding) {
-        return str_decode(encoding, null);
+        return decode(encoding, null);
     }
 
     public PyObject decode(String encoding, String errors) {
-        return str_decode(encoding, errors);
+        return codecs.decode(this, encoding, errors);
     }
 
-    @ExposedMethod(defaults = {"null", "null"}, doc = BuiltinDocs.str_decode_doc)
-    final PyObject str_decode(String encoding, String errors) {
-        return codecs.decode(this, encoding, errors);
+    @ExposedMethod(doc = BuiltinDocs.str_decode_doc)
+    final PyObject str_decode(PyObject[] args, String[] keywords) {
+        ArgParser ap = new ArgParser("decode", args, keywords, "encoding", "errors");
+        String encoding = ap.getString(0, null);
+        String errors = ap.getString(1, null);
+        return decode(encoding, errors);
     }
 
     @ExposedMethod(doc = BuiltinDocs.str__formatter_parser_doc)
diff --git a/src/org/python/modules/struct.java b/src/org/python/modules/struct.java
--- a/src/org/python/modules/struct.java
+++ b/src/org/python/modules/struct.java
@@ -562,7 +562,26 @@
             return Py.newInteger(buf.readByte());
         }
     }
+    
+    static class PointerFormatDef extends FormatDef {
+        FormatDef init(char name) {
+            String dataModel = System.getProperty("sun.arch.data.model");
+            if (dataModel == null)
+                throw Py.NotImplementedError("Can't determine if JVM is 32- or 64-bit");
+            int length = dataModel.equals("64") ? 8 : 4;
+            super.init(name, length, length);
+            return this;
+        }
+        
+        void pack(ByteStream buf, PyObject value) {
+            throw Py.NotImplementedError("Pointer packing/unpacking not implemented in Jython");
+        }
 
+        Object unpack(ByteStream buf) {
+            throw Py.NotImplementedError("Pointer packing/unpacking not implemented in Jython");
+        }
+    }
+    
     static class LEShortFormatDef extends FormatDef {
         void pack(ByteStream buf, PyObject value) {
             int v = get_int(value);
@@ -876,6 +895,7 @@
         new BEUnsignedLongFormatDef()   .init('Q', 8, 8),
         new BEFloatFormatDef()          .init('f', 4, 4),
         new BEDoubleFormatDef()         .init('d', 8, 8),
+        new PointerFormatDef()          .init('P')
     };
 
 

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Wed Mar 14 23:30:45 2012
From: jython-checkins at python.org (alex.gronholm)
Date: Wed, 14 Mar 2012 23:30:45 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Patched_pydoc=2Epy_against_C?=
	=?utf8?q?PythonLib2=2E7?=
Message-ID: 

http://hg.python.org/jython/rev/87a9ee318704
changeset:   6378:87a9ee318704
user:        Alex Gr?nholm 
date:        Wed Mar 14 15:25:24 2012 -0700
summary:
  Patched pydoc.py against CPythonLib2.7

files:
  Lib/pydoc.py |  509 ++++++++++++++++++++++----------------
  1 files changed, 292 insertions(+), 217 deletions(-)


diff --git a/Lib/pydoc.py b/Lib/pydoc.py
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# -*- coding: Latin-1 -*-
+# -*- coding: latin-1 -*-
 """Generate Python documentation in HTML or text for interactive use.
 
 In the Python interpreter, do "from pydoc import help" to provide online
@@ -27,7 +27,7 @@
 
 Module docs for core modules are assumed to be in
 
-    http://www.python.org/doc/current/lib/
+    http://docs.python.org/library/
 
 This can be overridden by setting the PYTHONDOCS environment variable
 to a different URL or to a local directory containing the Library
@@ -37,7 +37,7 @@
 __author__ = "Ka-Ping Yee "
 __date__ = "26 February 2001"
 
-__version__ = "$Revision: 54366 $"
+__version__ = "$Revision: 88564 $"
 __credits__ = """Guido van Rossum, for an excellent programming language.
 Tommy Burnette, the original creator of manpy.
 Paul Prescod, for all his work on onlinehelp.
@@ -55,6 +55,7 @@
 import sys, imp, os, re, types, inspect, __builtin__, pkgutil
 from repr import Repr
 from string import expandtabs, find, join, lower, split, strip, rfind, rstrip
+from traceback import extract_tb
 try:
     from collections import deque
 except ImportError:
@@ -123,9 +124,7 @@
 def stripid(text):
     """Remove the hexadecimal id from a Python object representation."""
     # The behaviour of %p is implementation-dependent in terms of case.
-    if _re_stripid.search(repr(Exception)):
-        return _re_stripid.sub(r'\1', text)
-    return text
+    return _re_stripid.sub(r'\1', text)
 
 def _is_some_method(obj):
     return inspect.ismethod(obj) or inspect.ismethoddescriptor(obj)
@@ -160,8 +159,9 @@
 def visiblename(name, all=None):
     """Decide whether to show documentation on a variable."""
     # Certain special names are redundant.
-    if name in ('__builtins__', '__doc__', '__file__', '__path__',
-                '__module__', '__name__', '__slots__'): return 0
+    _hidden_names = ('__builtins__', '__doc__', '__file__', '__path__',
+                     '__module__', '__name__', '__slots__', '__package__')
+    if name in _hidden_names: return 0
     # Private names are hidden, but special names are displayed.
     if name.startswith('__') and name.endswith('__'): return 1
     if all is not None:
@@ -172,7 +172,8 @@
 
 def classify_class_attrs(object):
     """Wrap inspect.classify_class_attrs, with fixup for data descriptors."""
-    def fixup((name, kind, cls, value)):
+    def fixup(data):
+        name, kind, cls, value = data
         if inspect.isdatadescriptor(value):
             kind = 'data descriptor'
         return name, kind, cls, value
@@ -229,7 +230,8 @@
 
 class ErrorDuringImport(Exception):
     """Errors that occurred while trying to import something to document it."""
-    def __init__(self, filename, (exc, value, tb)):
+    def __init__(self, filename, exc_info):
+        exc, value, tb = exc_info
         self.filename = filename
         self.exc = exc
         self.value = value
@@ -296,9 +298,9 @@
         elif exc is SyntaxError:
             # A SyntaxError occurred before we could execute the module.
             raise ErrorDuringImport(value.filename, info)
-        elif exc is ImportError and \
-             split(lower(str(value)))[:2] == ['no', 'module']:
-            # The module was not found.
+        elif exc is ImportError and extract_tb(tb)[-1][2]=='safeimport':
+            # The import error occurred directly in this function,
+            # which means there is no such module in the path.
             return None
         else:
             # Some other error occurred during the importing process.
@@ -346,7 +348,7 @@
             file = '(built-in)'
 
         docloc = os.environ.get("PYTHONDOCS",
-                                "http://www.python.org/doc/current/lib")
+                                "http://docs.python.org/library")
         basedir = os.path.join(sys.exec_prefix, "lib",
                                "python"+sys.version[0:3])
         if (isinstance(object, type(os)) and
@@ -354,12 +356,12 @@
                                  'marshal', 'posix', 'signal', 'sys',
                                  'thread', 'zipimport') or
              (file.startswith(basedir) and
-              not file.startswith(os.path.join(basedir, 'site-packages'))))):
-            htmlfile = "module-%s.html" % object.__name__
+              not file.startswith(os.path.join(basedir, 'site-packages')))) and
+            object.__name__ not in ('xml.etree', 'test.pydoc_mod')):
             if docloc.startswith("http://"):
-                docloc = "%s/%s" % (docloc.rstrip("/"), htmlfile)
+                docloc = "%s/%s" % (docloc.rstrip("/"), object.__name__)
             else:
-                docloc = os.path.join(docloc, htmlfile)
+                docloc = os.path.join(docloc, object.__name__ + ".html")
         else:
             docloc = None
         return docloc
@@ -420,7 +422,7 @@
     def page(self, title, contents):
         """Format an HTML page."""
         return '''
-
+
 Python: %s
 
 %s
@@ -503,8 +505,9 @@
         """Make a link for a module."""
         return '%s' % (object.__name__, object.__name__)
 
-    def modpkglink(self, (name, path, ispackage, shadowed)):
+    def modpkglink(self, data):
         """Make a link for a module or package to display in an index."""
+        name, path, ispackage, shadowed = data
         if shadowed:
             return self.grey(name)
         if path:
@@ -541,7 +544,7 @@
                 url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc)
                 results.append('%s' % (url, escape(all)))
             elif pep:
-                url = 'http://www.python.org/peps/pep-%04d.html' % int(pep)
+                url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep)
                 results.append('%s' % (url, escape(all)))
             elif text[end:end+1] == '(':
                 results.append(self.namelink(name, methods, funcs, classes))
@@ -663,12 +666,12 @@
                 'Package Contents', '#ffffff', '#aa55cc', contents)
         elif modules:
             contents = self.multicolumn(
-                modules, lambda (key, value), s=self: s.modulelink(value))
+                modules, lambda key_value, s=self: s.modulelink(key_value[1]))
             result = result + self.bigsection(
-                'Modules', '#fffff', '#aa55cc', contents)
+                'Modules', '#ffffff', '#aa55cc', contents)
 
         if classes:
-            classlist = map(lambda (key, value): value, classes)
+            classlist = map(lambda key_value: key_value[1], classes)
             contents = [
                 self.formattree(inspect.getclasstree(classlist, 1), name)]
             for key, value in classes:
@@ -755,7 +758,8 @@
                 push(msg)
                 for name, kind, homecls, value in ok:
                     base = self.docother(getattr(object, name), name, mod)
-                    if callable(value) or inspect.isdatadescriptor(value):
+                    if (hasattr(value, '__call__') or
+                            inspect.isdatadescriptor(value)):
                         doc = getattr(value, "__doc__", None)
                     else:
                         doc = None
@@ -769,7 +773,7 @@
                     push('\n')
             return attrs
 
-        attrs = filter(lambda (name, kind, cls, value): visiblename(name),
+        attrs = filter(lambda data: visiblename(data[0]),
                        classify_class_attrs(object))
         mdict = {}
         for key, kind, homecls, value in attrs:
@@ -1052,9 +1056,11 @@
             if visiblename(key, all):
                 data.append((key, value))
 
+        modpkgs = []
+        modpkgs_names = set()
         if hasattr(object, '__path__'):
-            modpkgs = []
             for importer, modname, ispkg in pkgutil.iter_modules(object.__path__):
+                modpkgs_names.add(modname)
                 if ispkg:
                     modpkgs.append(modname + ' (package)')
                 else:
@@ -1064,8 +1070,18 @@
             result = result + self.section(
                 'PACKAGE CONTENTS', join(modpkgs, '\n'))
 
+        # Detect submodules as sometimes created by C extensions
+        submodules = []
+        for key, value in inspect.getmembers(object, inspect.ismodule):
+            if value.__name__.startswith(name + '.') and key not in modpkgs_names:
+                submodules.append(key)
+        if submodules:
+            submodules.sort()
+            result = result + self.section(
+                'SUBMODULES', join(submodules, '\n'))
+
         if classes:
-            classlist = map(lambda (key, value): value, classes)
+            classlist = map(lambda key_value: key_value[1], classes)
             contents = [self.formattree(
                 inspect.getclasstree(classlist, 1), name)]
             for key, value in classes:
@@ -1097,7 +1113,7 @@
             result = result + self.section('CREDITS', str(object.__credits__))
         return result
 
-    def docclass(self, object, name=None, mod=None):
+    def docclass(self, object, name=None, mod=None, *ignored):
         """Produce text documentation for a given class object."""
         realname = object.__name__
         name = name or realname
@@ -1161,7 +1177,8 @@
                 hr.maybe()
                 push(msg)
                 for name, kind, homecls, value in ok:
-                    if callable(value) or inspect.isdatadescriptor(value):
+                    if (hasattr(value, '__call__') or
+                            inspect.isdatadescriptor(value)):
                         doc = getdoc(value)
                     else:
                         doc = None
@@ -1169,7 +1186,7 @@
                                        name, mod, maxlen=70, doc=doc) + '\n')
             return attrs
 
-        attrs = filter(lambda (name, kind, cls, value): visiblename(name),
+        attrs = filter(lambda data: visiblename(data[0]),
                        classify_class_attrs(object))
         while attrs:
             if mro:
@@ -1186,7 +1203,6 @@
             else:
                 tag = "inherited from %s" % classname(thisclass,
                                                       object.__module__)
-            filter(lambda t: not t[0].startswith('_'), attrs)
 
             # Sort attrs by name.
             attrs.sort()
@@ -1324,7 +1340,7 @@
     (fd, filename) = tempfile.mkstemp()
     os.close(fd)
     try:
-        if hasattr(os, 'system') and os.system('more %s' % filename) == 0:
+        if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0:
             return lambda text: pipepager(text, 'more')
         else:
             return ttypager
@@ -1352,7 +1368,7 @@
     file.write(text)
     file.close()
     try:
-        os.system(cmd + ' ' + filename)
+        os.system(cmd + ' "' + filename + '"')
     finally:
         os.unlink(filename)
 
@@ -1450,6 +1466,9 @@
 text = TextDoc()
 html = HTMLDoc()
 
+class _OldStyleClass: pass
+_OLD_INSTANCE_TYPE = type(_OldStyleClass())
+
 def resolve(thing, forceload=0):
     """Given an object or a path to an object, get the object and its name."""
     if isinstance(thing, str):
@@ -1460,27 +1479,35 @@
     else:
         return thing, getattr(thing, '__name__', None)
 
+def render_doc(thing, title='Python Library Documentation: %s', forceload=0):
+    """Render text documentation, given an object or a path to an object."""
+    object, name = resolve(thing, forceload)
+    desc = describe(object)
+    module = inspect.getmodule(object)
+    if name and '.' in name:
+        desc += ' in ' + name[:name.rfind('.')]
+    elif module and module is not object:
+        desc += ' in module ' + module.__name__
+    if type(object) is _OLD_INSTANCE_TYPE:
+        # If the passed object is an instance of an old-style class,
+        # document its available methods instead of its value.
+        object = object.__class__
+    elif not (inspect.ismodule(object) or
+              inspect.isclass(object) or
+              inspect.isroutine(object) or
+              inspect.isgetsetdescriptor(object) or
+              inspect.ismemberdescriptor(object) or
+              isinstance(object, property)):
+        # If the passed object is a piece of data or an instance,
+        # document its available methods instead of its value.
+        object = type(object)
+        desc += ' object'
+    return title % desc + '\n\n' + text.document(object, name)
+
 def doc(thing, title='Python Library Documentation: %s', forceload=0):
     """Display text documentation, given an object or a path to an object."""
     try:
-        object, name = resolve(thing, forceload)
-        desc = describe(object)
-        module = inspect.getmodule(object)
-        if name and '.' in name:
-            desc += ' in ' + name[:name.rfind('.')]
-        elif module and module is not object:
-            desc += ' in module ' + module.__name__
-        if not (inspect.ismodule(object) or
-                inspect.isclass(object) or
-                inspect.isroutine(object) or
-                inspect.isgetsetdescriptor(object) or
-                inspect.ismemberdescriptor(object) or
-                isinstance(object, property)):
-            # If the passed object is a piece of data or an instance,
-            # document its available methods instead of its value.
-            object = type(object)
-            desc += ' object'
-        pager(title % desc + '\n\n' + text.document(object, name))
+        pager(render_doc(thing, title, forceload))
     except (ImportError, ErrorDuringImport), value:
         print value
 
@@ -1504,141 +1531,188 @@
     return
 
 class Helper:
+
+    # These dictionaries map a topic name to either an alias, or a tuple
+    # (label, seealso-items).  The "label" is the label of the corresponding
+    # section in the .rst file under Doc/ and an index into the dictionary
+    # in pydoc_data/topics.py.
+    #
+    # CAUTION: if you change one of these dictionaries, be sure to adapt the
+    #          list of needed labels in Doc/tools/sphinxext/pyspecific.py and
+    #          regenerate the pydoc_data/topics.py file by running
+    #              make pydoc-topics
+    #          in Doc/ and copying the output file into the Lib/ directory.
+
     keywords = {
         'and': 'BOOLEAN',
         'as': 'with',
-        'assert': ('ref/assert', ''),
-        'break': ('ref/break', 'while for'),
-        'class': ('ref/class', 'CLASSES SPECIALMETHODS'),
-        'continue': ('ref/continue', 'while for'),
-        'def': ('ref/function', ''),
-        'del': ('ref/del', 'BASICMETHODS'),
+        'assert': ('assert', ''),
+        'break': ('break', 'while for'),
+        'class': ('class', 'CLASSES SPECIALMETHODS'),
+        'continue': ('continue', 'while for'),
+        'def': ('function', ''),
+        'del': ('del', 'BASICMETHODS'),
         'elif': 'if',
-        'else': ('ref/if', 'while for'),
+        'else': ('else', 'while for'),
         'except': 'try',
-        'exec': ('ref/exec', ''),
+        'exec': ('exec', ''),
         'finally': 'try',
-        'for': ('ref/for', 'break continue while'),
+        'for': ('for', 'break continue while'),
         'from': 'import',
-        'global': ('ref/global', 'NAMESPACES'),
-        'if': ('ref/if', 'TRUTHVALUE'),
-        'import': ('ref/import', 'MODULES'),
-        'in': ('ref/comparisons', 'SEQUENCEMETHODS2'),
+        'global': ('global', 'NAMESPACES'),
+        'if': ('if', 'TRUTHVALUE'),
+        'import': ('import', 'MODULES'),
+        'in': ('in', 'SEQUENCEMETHODS2'),
         'is': 'COMPARISON',
-        'lambda': ('ref/lambdas', 'FUNCTIONS'),
+        'lambda': ('lambda', 'FUNCTIONS'),
         'not': 'BOOLEAN',
         'or': 'BOOLEAN',
-        'pass': ('ref/pass', ''),
-        'print': ('ref/print', ''),
-        'raise': ('ref/raise', 'EXCEPTIONS'),
-        'return': ('ref/return', 'FUNCTIONS'),
-        'try': ('ref/try', 'EXCEPTIONS'),
-        'while': ('ref/while', 'break continue if TRUTHVALUE'),
-        'with': ('ref/with', 'CONTEXTMANAGERS EXCEPTIONS yield'),
-        'yield': ('ref/yield', ''),
+        'pass': ('pass', ''),
+        'print': ('print', ''),
+        'raise': ('raise', 'EXCEPTIONS'),
+        'return': ('return', 'FUNCTIONS'),
+        'try': ('try', 'EXCEPTIONS'),
+        'while': ('while', 'break continue if TRUTHVALUE'),
+        'with': ('with', 'CONTEXTMANAGERS EXCEPTIONS yield'),
+        'yield': ('yield', ''),
     }
+    # Either add symbols to this dictionary or to the symbols dictionary
+    # directly: Whichever is easier. They are merged later.
+    _symbols_inverse = {
+        'STRINGS' : ("'", "'''", "r'", "u'", '"""', '"', 'r"', 'u"'),
+        'OPERATORS' : ('+', '-', '*', '**', '/', '//', '%', '<<', '>>', '&',
+                       '|', '^', '~', '<', '>', '<=', '>=', '==', '!=', '<>'),
+        'COMPARISON' : ('<', '>', '<=', '>=', '==', '!=', '<>'),
+        'UNARY' : ('-', '~'),
+        'AUGMENTEDASSIGNMENT' : ('+=', '-=', '*=', '/=', '%=', '&=', '|=',
+                                '^=', '<<=', '>>=', '**=', '//='),
+        'BITWISE' : ('<<', '>>', '&', '|', '^', '~'),
+        'COMPLEX' : ('j', 'J')
+    }
+    symbols = {
+        '%': 'OPERATORS FORMATTING',
+        '**': 'POWER',
+        ',': 'TUPLES LISTS FUNCTIONS',
+        '.': 'ATTRIBUTES FLOAT MODULES OBJECTS',
+        '...': 'ELLIPSIS',
+        ':': 'SLICINGS DICTIONARYLITERALS',
+        '@': 'def class',
+        '\\': 'STRINGS',
+        '_': 'PRIVATENAMES',
+        '__': 'PRIVATENAMES SPECIALMETHODS',
+        '`': 'BACKQUOTES',
+        '(': 'TUPLES FUNCTIONS CALLS',
+        ')': 'TUPLES FUNCTIONS CALLS',
+        '[': 'LISTS SUBSCRIPTS SLICINGS',
+        ']': 'LISTS SUBSCRIPTS SLICINGS'
+    }
+    for topic, symbols_ in _symbols_inverse.iteritems():
+        for symbol in symbols_:
+            topics = symbols.get(symbol, topic)
+            if topic not in topics:
+                topics = topics + ' ' + topic
+            symbols[symbol] = topics
 
     topics = {
-        'TYPES': ('ref/types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS FUNCTIONS CLASSES MODULES FILES inspect'),
-        'STRINGS': ('ref/strings', 'str UNICODE SEQUENCES STRINGMETHODS FORMATTING TYPES'),
-        'STRINGMETHODS': ('lib/string-methods', 'STRINGS FORMATTING'),
-        'FORMATTING': ('lib/typesseq-strings', 'OPERATORS'),
-        'UNICODE': ('ref/strings', 'encodings unicode SEQUENCES STRINGMETHODS FORMATTING TYPES'),
-        'NUMBERS': ('ref/numbers', 'INTEGER FLOAT COMPLEX TYPES'),
-        'INTEGER': ('ref/integers', 'int range'),
-        'FLOAT': ('ref/floating', 'float math'),
-        'COMPLEX': ('ref/imaginary', 'complex cmath'),
-        'SEQUENCES': ('lib/typesseq', 'STRINGMETHODS FORMATTING xrange LISTS'),
+        'TYPES': ('types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS '
+                  'FUNCTIONS CLASSES MODULES FILES inspect'),
+        'STRINGS': ('strings', 'str UNICODE SEQUENCES STRINGMETHODS FORMATTING '
+                    'TYPES'),
+        'STRINGMETHODS': ('string-methods', 'STRINGS FORMATTING'),
+        'FORMATTING': ('formatstrings', 'OPERATORS'),
+        'UNICODE': ('strings', 'encodings unicode SEQUENCES STRINGMETHODS '
+                    'FORMATTING TYPES'),
+        'NUMBERS': ('numbers', 'INTEGER FLOAT COMPLEX TYPES'),
+        'INTEGER': ('integers', 'int range'),
+        'FLOAT': ('floating', 'float math'),
+        'COMPLEX': ('imaginary', 'complex cmath'),
+        'SEQUENCES': ('typesseq', 'STRINGMETHODS FORMATTING xrange LISTS'),
         'MAPPINGS': 'DICTIONARIES',
-        'FUNCTIONS': ('lib/typesfunctions', 'def TYPES'),
-        'METHODS': ('lib/typesmethods', 'class def CLASSES TYPES'),
-        'CODEOBJECTS': ('lib/bltin-code-objects', 'compile FUNCTIONS TYPES'),
-        'TYPEOBJECTS': ('lib/bltin-type-objects', 'types TYPES'),
+        'FUNCTIONS': ('typesfunctions', 'def TYPES'),
+        'METHODS': ('typesmethods', 'class def CLASSES TYPES'),
+        'CODEOBJECTS': ('bltin-code-objects', 'compile FUNCTIONS TYPES'),
+        'TYPEOBJECTS': ('bltin-type-objects', 'types TYPES'),
         'FRAMEOBJECTS': 'TYPES',
         'TRACEBACKS': 'TYPES',
-        'NONE': ('lib/bltin-null-object', ''),
-        'ELLIPSIS': ('lib/bltin-ellipsis-object', 'SLICINGS'),
-        'FILES': ('lib/bltin-file-objects', ''),
-        'SPECIALATTRIBUTES': ('lib/specialattrs', ''),
-        'CLASSES': ('ref/types', 'class SPECIALMETHODS PRIVATENAMES'),
-        'MODULES': ('lib/typesmodules', 'import'),
+        'NONE': ('bltin-null-object', ''),
+        'ELLIPSIS': ('bltin-ellipsis-object', 'SLICINGS'),
+        'FILES': ('bltin-file-objects', ''),
+        'SPECIALATTRIBUTES': ('specialattrs', ''),
+        'CLASSES': ('types', 'class SPECIALMETHODS PRIVATENAMES'),
+        'MODULES': ('typesmodules', 'import'),
         'PACKAGES': 'import',
-        'EXPRESSIONS': ('ref/summary', 'lambda or and not in is BOOLEAN COMPARISON BITWISE SHIFTING BINARY FORMATTING POWER UNARY ATTRIBUTES SUBSCRIPTS SLICINGS CALLS TUPLES LISTS DICTIONARIES BACKQUOTES'),
+        'EXPRESSIONS': ('operator-summary', 'lambda or and not in is BOOLEAN '
+                        'COMPARISON BITWISE SHIFTING BINARY FORMATTING POWER '
+                        'UNARY ATTRIBUTES SUBSCRIPTS SLICINGS CALLS TUPLES '
+                        'LISTS DICTIONARIES BACKQUOTES'),
         'OPERATORS': 'EXPRESSIONS',
         'PRECEDENCE': 'EXPRESSIONS',
-        'OBJECTS': ('ref/objects', 'TYPES'),
-        'SPECIALMETHODS': ('ref/specialnames', 'BASICMETHODS ATTRIBUTEMETHODS CALLABLEMETHODS SEQUENCEMETHODS1 MAPPINGMETHODS SEQUENCEMETHODS2 NUMBERMETHODS CLASSES'),
-        'BASICMETHODS': ('ref/customization', 'cmp hash repr str SPECIALMETHODS'),
-        'ATTRIBUTEMETHODS': ('ref/attribute-access', 'ATTRIBUTES SPECIALMETHODS'),
-        'CALLABLEMETHODS': ('ref/callable-types', 'CALLS SPECIALMETHODS'),
-        'SEQUENCEMETHODS1': ('ref/sequence-types', 'SEQUENCES SEQUENCEMETHODS2 SPECIALMETHODS'),
-        'SEQUENCEMETHODS2': ('ref/sequence-methods', 'SEQUENCES SEQUENCEMETHODS1 SPECIALMETHODS'),
-        'MAPPINGMETHODS': ('ref/sequence-types', 'MAPPINGS SPECIALMETHODS'),
-        'NUMBERMETHODS': ('ref/numeric-types', 'NUMBERS AUGMENTEDASSIGNMENT SPECIALMETHODS'),
-        'EXECUTION': ('ref/execmodel', 'NAMESPACES DYNAMICFEATURES EXCEPTIONS'),
-        'NAMESPACES': ('ref/naming', 'global ASSIGNMENT DELETION DYNAMICFEATURES'),
-        'DYNAMICFEATURES': ('ref/dynamic-features', ''),
+        'OBJECTS': ('objects', 'TYPES'),
+        'SPECIALMETHODS': ('specialnames', 'BASICMETHODS ATTRIBUTEMETHODS '
+                           'CALLABLEMETHODS SEQUENCEMETHODS1 MAPPINGMETHODS '
+                           'SEQUENCEMETHODS2 NUMBERMETHODS CLASSES'),
+        'BASICMETHODS': ('customization', 'cmp hash repr str SPECIALMETHODS'),
+        'ATTRIBUTEMETHODS': ('attribute-access', 'ATTRIBUTES SPECIALMETHODS'),
+        'CALLABLEMETHODS': ('callable-types', 'CALLS SPECIALMETHODS'),
+        'SEQUENCEMETHODS1': ('sequence-types', 'SEQUENCES SEQUENCEMETHODS2 '
+                             'SPECIALMETHODS'),
+        'SEQUENCEMETHODS2': ('sequence-methods', 'SEQUENCES SEQUENCEMETHODS1 '
+                             'SPECIALMETHODS'),
+        'MAPPINGMETHODS': ('sequence-types', 'MAPPINGS SPECIALMETHODS'),
+        'NUMBERMETHODS': ('numeric-types', 'NUMBERS AUGMENTEDASSIGNMENT '
+                          'SPECIALMETHODS'),
+        'EXECUTION': ('execmodel', 'NAMESPACES DYNAMICFEATURES EXCEPTIONS'),
+        'NAMESPACES': ('naming', 'global ASSIGNMENT DELETION DYNAMICFEATURES'),
+        'DYNAMICFEATURES': ('dynamic-features', ''),
         'SCOPING': 'NAMESPACES',
         'FRAMES': 'NAMESPACES',
-        'EXCEPTIONS': ('ref/exceptions', 'try except finally raise'),
-        'COERCIONS': ('ref/coercion-rules','CONVERSIONS'),
-        'CONVERSIONS': ('ref/conversions', 'COERCIONS'),
-        'IDENTIFIERS': ('ref/identifiers', 'keywords SPECIALIDENTIFIERS'),
-        'SPECIALIDENTIFIERS': ('ref/id-classes', ''),
-        'PRIVATENAMES': ('ref/atom-identifiers', ''),
-        'LITERALS': ('ref/atom-literals', 'STRINGS BACKQUOTES NUMBERS TUPLELITERALS LISTLITERALS DICTIONARYLITERALS'),
+        'EXCEPTIONS': ('exceptions', 'try except finally raise'),
+        'COERCIONS': ('coercion-rules','CONVERSIONS'),
+        'CONVERSIONS': ('conversions', 'COERCIONS'),
+        'IDENTIFIERS': ('identifiers', 'keywords SPECIALIDENTIFIERS'),
+        'SPECIALIDENTIFIERS': ('id-classes', ''),
+        'PRIVATENAMES': ('atom-identifiers', ''),
+        'LITERALS': ('atom-literals', 'STRINGS BACKQUOTES NUMBERS '
+                     'TUPLELITERALS LISTLITERALS DICTIONARYLITERALS'),
         'TUPLES': 'SEQUENCES',
-        'TUPLELITERALS': ('ref/exprlists', 'TUPLES LITERALS'),
-        'LISTS': ('lib/typesseq-mutable', 'LISTLITERALS'),
-        'LISTLITERALS': ('ref/lists', 'LISTS LITERALS'),
-        'DICTIONARIES': ('lib/typesmapping', 'DICTIONARYLITERALS'),
-        'DICTIONARYLITERALS': ('ref/dict', 'DICTIONARIES LITERALS'),
-        'BACKQUOTES': ('ref/string-conversions', 'repr str STRINGS LITERALS'),
-        'ATTRIBUTES': ('ref/attribute-references', 'getattr hasattr setattr ATTRIBUTEMETHODS'),
-        'SUBSCRIPTS': ('ref/subscriptions', 'SEQUENCEMETHODS1'),
-        'SLICINGS': ('ref/slicings', 'SEQUENCEMETHODS2'),
-        'CALLS': ('ref/calls', 'EXPRESSIONS'),
-        'POWER': ('ref/power', 'EXPRESSIONS'),
-        'UNARY': ('ref/unary', 'EXPRESSIONS'),
-        'BINARY': ('ref/binary', 'EXPRESSIONS'),
-        'SHIFTING': ('ref/shifting', 'EXPRESSIONS'),
-        'BITWISE': ('ref/bitwise', 'EXPRESSIONS'),
-        'COMPARISON': ('ref/comparisons', 'EXPRESSIONS BASICMETHODS'),
-        'BOOLEAN': ('ref/Booleans', 'EXPRESSIONS TRUTHVALUE'),
+        'TUPLELITERALS': ('exprlists', 'TUPLES LITERALS'),
+        'LISTS': ('typesseq-mutable', 'LISTLITERALS'),
+        'LISTLITERALS': ('lists', 'LISTS LITERALS'),
+        'DICTIONARIES': ('typesmapping', 'DICTIONARYLITERALS'),
+        'DICTIONARYLITERALS': ('dict', 'DICTIONARIES LITERALS'),
+        'BACKQUOTES': ('string-conversions', 'repr str STRINGS LITERALS'),
+        'ATTRIBUTES': ('attribute-references', 'getattr hasattr setattr '
+                       'ATTRIBUTEMETHODS'),
+        'SUBSCRIPTS': ('subscriptions', 'SEQUENCEMETHODS1'),
+        'SLICINGS': ('slicings', 'SEQUENCEMETHODS2'),
+        'CALLS': ('calls', 'EXPRESSIONS'),
+        'POWER': ('power', 'EXPRESSIONS'),
+        'UNARY': ('unary', 'EXPRESSIONS'),
+        'BINARY': ('binary', 'EXPRESSIONS'),
+        'SHIFTING': ('shifting', 'EXPRESSIONS'),
+        'BITWISE': ('bitwise', 'EXPRESSIONS'),
+        'COMPARISON': ('comparisons', 'EXPRESSIONS BASICMETHODS'),
+        'BOOLEAN': ('booleans', 'EXPRESSIONS TRUTHVALUE'),
         'ASSERTION': 'assert',
-        'ASSIGNMENT': ('ref/assignment', 'AUGMENTEDASSIGNMENT'),
-        'AUGMENTEDASSIGNMENT': ('ref/augassign', 'NUMBERMETHODS'),
+        'ASSIGNMENT': ('assignment', 'AUGMENTEDASSIGNMENT'),
+        'AUGMENTEDASSIGNMENT': ('augassign', 'NUMBERMETHODS'),
         'DELETION': 'del',
         'PRINTING': 'print',
         'RETURNING': 'return',
         'IMPORTING': 'import',
         'CONDITIONAL': 'if',
-        'LOOPING': ('ref/compound', 'for while break continue'),
-        'TRUTHVALUE': ('lib/truth', 'if while and or not BASICMETHODS'),
-        'DEBUGGING': ('lib/module-pdb', 'pdb'),
-        'CONTEXTMANAGERS': ('ref/context-managers', 'with'),
+        'LOOPING': ('compound', 'for while break continue'),
+        'TRUTHVALUE': ('truth', 'if while and or not BASICMETHODS'),
+        'DEBUGGING': ('debugger', 'pdb'),
+        'CONTEXTMANAGERS': ('context-managers', 'with'),
     }
 
-    def __init__(self, input, output):
-        self.input = input
-        self.output = output
-        self.docdir = None
-        if sys.executable is None:
-            execdir = os.getcwd()
-        else:
-            execdir = os.path.dirname(sys.executable)
-        
-        homedir = os.environ.get('PYTHONHOME')
-        for dir in [os.environ.get('PYTHONDOCS'),
-                    homedir and os.path.join(homedir, 'doc'),
-                    os.path.join(execdir, 'doc'),
-                    '/usr/doc/python-docs-' + split(sys.version)[0],
-                    '/usr/doc/python-' + split(sys.version)[0],
-                    '/usr/doc/python-docs-' + sys.version[:3],
-                    '/usr/doc/python-' + sys.version[:3],
-                    os.path.join(sys.prefix, 'Resources/English.lproj/Documentation')]:
-            if dir and os.path.isdir(os.path.join(dir, 'lib')):
-                self.docdir = dir
+    def __init__(self, input=None, output=None):
+        self._input = input
+        self._output = output
+
+    input  = property(lambda self: self._input or sys.stdin)
+    output = property(lambda self: self._output or sys.stdout)
 
     def __repr__(self):
         if inspect.stack()[1][3] == '?':
@@ -1646,8 +1720,9 @@
             return ''
         return ''
 
-    def __call__(self, request=None):
-        if request is not None:
+    _GoInteractive = object()
+    def __call__(self, request=_GoInteractive):
+        if request is not self._GoInteractive:
             self.help(request)
         else:
             self.intro()
@@ -1682,12 +1757,15 @@
 
     def help(self, request):
         if type(request) is type(''):
+            request = request.strip()
             if request == 'help': self.intro()
             elif request == 'keywords': self.listkeywords()
+            elif request == 'symbols': self.listsymbols()
             elif request == 'topics': self.listtopics()
             elif request == 'modules': self.listmodules()
             elif request[:8] == 'modules ':
                 self.listmodules(split(request)[1])
+            elif request in self.symbols: self.showsymbol(request)
             elif request in self.keywords: self.showtopic(request)
             elif request in self.topics: self.showtopic(request)
             elif request: doc(request, 'Help on %s:')
@@ -1700,7 +1778,7 @@
 Welcome to Python %s!  This is the online help utility.
 
 If this is your first time using Python, you should definitely check out
-the tutorial on the Internet at http://www.python.org/doc/tut/.
+the tutorial on the Internet at http://docs.python.org/tutorial/.
 
 Enter the name of any module, keyword, or topic to get help on writing
 Python programs and using Python modules.  To quit this help utility and
@@ -1733,6 +1811,14 @@
 ''')
         self.list(self.keywords.keys())
 
+    def listsymbols(self):
+        self.output.write('''
+Here is a list of the punctuation symbols which Python assigns special meaning
+to. Enter any symbol to get more help.
+
+''')
+        self.list(self.symbols.keys())
+
     def listtopics(self):
         self.output.write('''
 Here is a list of available topics.  Enter any topic name to get more help.
@@ -1740,15 +1826,13 @@
 ''')
         self.list(self.topics.keys())
 
-    def showtopic(self, topic):
-        if not self.docdir:
+    def showtopic(self, topic, more_xrefs=''):
+        try:
+            import pydoc_data.topics
+        except ImportError:
             self.output.write('''
-Sorry, topic and keyword documentation is not available because the Python
-HTML documentation files could not be found.  If you have installed them,
-please set the environment variable PYTHONDOCS to indicate their location.
-
-On the Microsoft Windows operating system, the files can be built by
-running "hh -decompile . PythonNN.chm" in the C:\PythonNN\Doc> directory.
+Sorry, topic and keyword documentation is not available because the
+module "pydoc_data.topics" could not be found.
 ''')
             return
         target = self.topics.get(topic, self.keywords.get(topic))
@@ -1756,38 +1840,29 @@
             self.output.write('no documentation found for %s\n' % repr(topic))
             return
         if type(target) is type(''):
-            return self.showtopic(target)
+            return self.showtopic(target, more_xrefs)
 
-        filename, xrefs = target
-        filename = self.docdir + '/' + filename + '.html'
+        label, xrefs = target
         try:
-            file = open(filename)
-        except:
-            self.output.write('could not read docs from %s\n' % filename)
+            doc = pydoc_data.topics.topics[label]
+        except KeyError:
+            self.output.write('no documentation found for %s\n' % repr(topic))
             return
-
-        divpat = re.compile(']*navigat.*?', re.I | re.S)
-        addrpat = re.compile('.*?', re.I | re.S)
-        document = re.sub(addrpat, '', re.sub(divpat, '', file.read()))
-        file.close()
-
-        import htmllib, formatter, StringIO
-        buffer = StringIO.StringIO()
-        parser = htmllib.HTMLParser(
-            formatter.AbstractFormatter(formatter.DumbWriter(buffer)))
-        parser.start_table = parser.do_p
-        parser.end_table = lambda parser=parser: parser.do_p({})
-        parser.start_tr = parser.do_br
-        parser.start_td = parser.start_th = lambda a, b=buffer: b.write('\t')
-        parser.feed(document)
-        buffer = replace(buffer.getvalue(), '\xa0', ' ', '\n', '\n  ')
-        pager('  ' + strip(buffer) + '\n')
+        pager(strip(doc) + '\n')
+        if more_xrefs:
+            xrefs = (xrefs or '') + ' ' + more_xrefs
         if xrefs:
+            import StringIO, formatter
             buffer = StringIO.StringIO()
             formatter.DumbWriter(buffer).send_flowing_data(
                 'Related help topics: ' + join(split(xrefs), ', ') + '\n')
             self.output.write('\n%s\n' % buffer.getvalue())
 
+    def showsymbol(self, symbol):
+        target = self.symbols[symbol]
+        topic, _, xrefs = target.partition(' ')
+        self.showtopic(topic, xrefs)
+
     def listmodules(self, key=''):
         if key:
             self.output.write('''
@@ -1806,14 +1881,16 @@
                     modname = modname[:-9] + ' (package)'
                 if find(modname, '.') < 0:
                     modules[modname] = 1
-            ModuleScanner().run(callback)
+            def onerror(modname):
+                callback(None, modname, None)
+            ModuleScanner().run(callback, onerror=onerror)
             self.list(modules.keys())
             self.output.write('''
 Enter any module name to get more help.  Or, type "modules spam" to search
 for modules whose descriptions contain the word "spam".
 ''')
 
-help = Helper(sys.stdin, sys.stdout)
+help = Helper()
 
 class Scanner:
     """A generic tree iterator."""
@@ -1842,7 +1919,7 @@
 class ModuleScanner:
     """An interruptible scanner that searches module synopses."""
 
-    def run(self, callback, key=None, completer=None):
+    def run(self, callback, key=None, completer=None, onerror=None):
         if key: key = lower(key)
         self.quit = False
         seen = {}
@@ -1857,7 +1934,7 @@
                     if find(lower(modname + ' - ' + desc), key) >= 0:
                         callback(None, modname, desc)
 
-        for importer, modname, ispkg in pkgutil.walk_packages():
+        for importer, modname, ispkg in pkgutil.walk_packages(onerror=onerror):
             if self.quit:
                 break
             if key is None:
@@ -1957,23 +2034,23 @@
 
     class DocServer(BaseHTTPServer.HTTPServer):
         def __init__(self, port, callback):
-            host = (sys.platform == 'mac') and '127.0.0.1' or 'localhost'
-            self.address = ('', port)
+            host = 'localhost'
+            self.address = (host, port)
             self.url = 'http://%s:%d/' % (host, port)
             self.callback = callback
             self.base.__init__(self, self.address, self.handler)
 
-        def serve_until_quit(self):
-            import sys
-            if sys.platform.startswith('java'):
-                from select import cpython_compatible_select as select
-            else:
-                from select import select
-            self.quit = False
-            while not self.quit:
-                rd, wr, ex = select([self.socket], [], [], 1)
-                if rd: self.handle_request()
-
+        def serve_until_quit(self):
+            import sys
+            if sys.platform.startswith('java'):
+                from select import cpython_compatible_select as select
+            else:
+                from select import select
+            self.quit = False
+            while not self.quit:
+                rd, wr, ex = select([self.socket], [], [], 1)
+                if rd: self.handle_request()
+
         def server_activate(self):
             self.base.server_activate(self)
             if self.callback: self.callback(self)
@@ -2078,10 +2155,6 @@
             except ImportError: # pre-webbrowser.py compatibility
                 if sys.platform == 'win32':
                     os.system('start "%s"' % url)
-                elif sys.platform == 'mac':
-                    try: import ic
-                    except ImportError: pass
-                    else: ic.launchurl(url)
                 else:
                     rc = os.system('netscape -remote "openURL(%s)" &' % url)
                     if rc: os.system('netscape "%s" &' % url)
@@ -2186,11 +2259,13 @@
     import getopt
     class BadUsage: pass
 
-    # Scripts don't get the current directory in their path by default.
-    scriptdir = os.path.dirname(sys.argv[0])
-    if scriptdir in sys.path:
-        sys.path.remove(scriptdir)
-    sys.path.insert(0, '.')
+    # Scripts don't get the current directory in their path by default
+    # unless they are run with the '-m' switch
+    if '' not in sys.path:
+        scriptdir = os.path.dirname(sys.argv[0])
+        if scriptdir in sys.path:
+            sys.path.remove(scriptdir)
+        sys.path.insert(0, '.')
 
     try:
         opts, args = getopt.getopt(sys.argv[1:], 'gk:p:w')

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Thu Mar 15 00:05:14 2012
From: jython-checkins at python.org (alex.gronholm)
Date: Thu, 15 Mar 2012 00:05:14 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Removed_Lib/filecmp=2Epy_--_?=
 =?utf8?q?deviation_from_CPython_no_longer_necessary_due_to?=
Message-ID: 

http://hg.python.org/jython/rev/b2fa1d9c5cc6
changeset:   6380:b2fa1d9c5cc6
user:        Alex Gr?nholm 
date:        Wed Mar 14 15:45:05 2012 -0700
summary:
  Removed Lib/filecmp.py -- deviation from CPython no longer necessary due to added with statements

files:
  Lib/filecmp.py |  300 -------------------------------------
  1 files changed, 0 insertions(+), 300 deletions(-)


diff --git a/Lib/filecmp.py b/Lib/filecmp.py
deleted file mode 100644
--- a/Lib/filecmp.py
+++ /dev/null
@@ -1,300 +0,0 @@
-"""Utilities for comparing files and directories.
-
-Classes:
-    dircmp
-
-Functions:
-    cmp(f1, f2, shallow=1) -> int
-    cmpfiles(a, b, common) -> ([], [], [])
-
-"""
-
-import os
-import stat
-from itertools import ifilter, ifilterfalse, imap, izip
-
-__all__ = ["cmp","dircmp","cmpfiles"]
-
-_cache = {}
-BUFSIZE=8*1024
-
-def cmp(f1, f2, shallow=1):
-    """Compare two files.
-
-    Arguments:
-
-    f1 -- First file name
-
-    f2 -- Second file name
-
-    shallow -- Just check stat signature (do not read the files).
-               defaults to 1.
-
-    Return value:
-
-    True if the files are the same, False otherwise.
-
-    This function uses a cache for past comparisons and the results,
-    with a cache invalidation mechanism relying on stale signatures.
-
-    """
-
-    s1 = _sig(os.stat(f1))
-    s2 = _sig(os.stat(f2))
-    if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
-        return False
-    if shallow and s1 == s2:
-        return True
-    if s1[1] != s2[1]:
-        return False
-
-    result = _cache.get((f1, f2))
-    if result and (s1, s2) == result[:2]:
-        return result[2]
-    outcome = _do_cmp(f1, f2)
-    _cache[f1, f2] = s1, s2, outcome
-    return outcome
-
-def _sig(st):
-    return (stat.S_IFMT(st.st_mode),
-            st.st_size,
-            st.st_mtime)
-
-def _do_cmp(f1, f2):
-    bufsize = BUFSIZE
-    fp1 = open(f1, 'rb')
-    fp2 = open(f2, 'rb')
-    try:
-        while True:
-            b1 = fp1.read(bufsize)
-            b2 = fp2.read(bufsize)
-            if b1 != b2:
-                return False
-            if not b1:
-                return True
-    finally:
-        fp1.close()
-        fp2.close()
-
-# Directory comparison class.
-#
-class dircmp:
-    """A class that manages the comparison of 2 directories.
-
-    dircmp(a,b,ignore=None,hide=None)
-      A and B are directories.
-      IGNORE is a list of names to ignore,
-        defaults to ['RCS', 'CVS', 'tags'].
-      HIDE is a list of names to hide,
-        defaults to [os.curdir, os.pardir].
-
-    High level usage:
-      x = dircmp(dir1, dir2)
-      x.report() -> prints a report on the differences between dir1 and dir2
-       or
-      x.report_partial_closure() -> prints report on differences between dir1
-            and dir2, and reports on common immediate subdirectories.
-      x.report_full_closure() -> like report_partial_closure,
-            but fully recursive.
-
-    Attributes:
-     left_list, right_list: The files in dir1 and dir2,
-        filtered by hide and ignore.
-     common: a list of names in both dir1 and dir2.
-     left_only, right_only: names only in dir1, dir2.
-     common_dirs: subdirectories in both dir1 and dir2.
-     common_files: files in both dir1 and dir2.
-     common_funny: names in both dir1 and dir2 where the type differs between
-        dir1 and dir2, or the name is not stat-able.
-     same_files: list of identical files.
-     diff_files: list of filenames which differ.
-     funny_files: list of files which could not be compared.
-     subdirs: a dictionary of dircmp objects, keyed by names in common_dirs.
-     """
-
-    def __init__(self, a, b, ignore=None, hide=None): # Initialize
-        self.left = a
-        self.right = b
-        if hide is None:
-            self.hide = [os.curdir, os.pardir] # Names never to be shown
-        else:
-            self.hide = hide
-        if ignore is None:
-            self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison
-        else:
-            self.ignore = ignore
-
-    def phase0(self): # Compare everything except common subdirectories
-        self.left_list = _filter(os.listdir(self.left),
-                                 self.hide+self.ignore)
-        self.right_list = _filter(os.listdir(self.right),
-                                  self.hide+self.ignore)
-        self.left_list.sort()
-        self.right_list.sort()
-
-    def phase1(self): # Compute common names
-        a = dict(izip(imap(os.path.normcase, self.left_list), self.left_list))
-        b = dict(izip(imap(os.path.normcase, self.right_list), self.right_list))
-        self.common = map(a.__getitem__, ifilter(b.__contains__, a))
-        self.left_only = map(a.__getitem__, ifilterfalse(b.__contains__, a))
-        self.right_only = map(b.__getitem__, ifilterfalse(a.__contains__, b))
-
-    def phase2(self): # Distinguish files, directories, funnies
-        self.common_dirs = []
-        self.common_files = []
-        self.common_funny = []
-
-        for x in self.common:
-            a_path = os.path.join(self.left, x)
-            b_path = os.path.join(self.right, x)
-
-            ok = 1
-            try:
-                a_stat = os.stat(a_path)
-            except os.error, why:
-                # print 'Can\'t stat', a_path, ':', why[1]
-                ok = 0
-            try:
-                b_stat = os.stat(b_path)
-            except os.error, why:
-                # print 'Can\'t stat', b_path, ':', why[1]
-                ok = 0
-
-            if ok:
-                a_type = stat.S_IFMT(a_stat.st_mode)
-                b_type = stat.S_IFMT(b_stat.st_mode)
-                if a_type != b_type:
-                    self.common_funny.append(x)
-                elif stat.S_ISDIR(a_type):
-                    self.common_dirs.append(x)
-                elif stat.S_ISREG(a_type):
-                    self.common_files.append(x)
-                else:
-                    self.common_funny.append(x)
-            else:
-                self.common_funny.append(x)
-
-    def phase3(self): # Find out differences between common files
-        xx = cmpfiles(self.left, self.right, self.common_files)
-        self.same_files, self.diff_files, self.funny_files = xx
-
-    def phase4(self): # Find out differences between common subdirectories
-        # A new dircmp object is created for each common subdirectory,
-        # these are stored in a dictionary indexed by filename.
-        # The hide and ignore properties are inherited from the parent
-        self.subdirs = {}
-        for x in self.common_dirs:
-            a_x = os.path.join(self.left, x)
-            b_x = os.path.join(self.right, x)
-            self.subdirs[x]  = dircmp(a_x, b_x, self.ignore, self.hide)
-
-    def phase4_closure(self): # Recursively call phase4() on subdirectories
-        self.phase4()
-        for sd in self.subdirs.itervalues():
-            sd.phase4_closure()
-
-    def report(self): # Print a report on the differences between a and b
-        # Output format is purposely lousy
-        print 'diff', self.left, self.right
-        if self.left_only:
-            self.left_only.sort()
-            print 'Only in', self.left, ':', self.left_only
-        if self.right_only:
-            self.right_only.sort()
-            print 'Only in', self.right, ':', self.right_only
-        if self.same_files:
-            self.same_files.sort()
-            print 'Identical files :', self.same_files
-        if self.diff_files:
-            self.diff_files.sort()
-            print 'Differing files :', self.diff_files
-        if self.funny_files:
-            self.funny_files.sort()
-            print 'Trouble with common files :', self.funny_files
-        if self.common_dirs:
-            self.common_dirs.sort()
-            print 'Common subdirectories :', self.common_dirs
-        if self.common_funny:
-            self.common_funny.sort()
-            print 'Common funny cases :', self.common_funny
-
-    def report_partial_closure(self): # Print reports on self and on subdirs
-        self.report()
-        for sd in self.subdirs.itervalues():
-            print
-            sd.report()
-
-    def report_full_closure(self): # Report on self and subdirs recursively
-        self.report()
-        for sd in self.subdirs.itervalues():
-            print
-            sd.report_full_closure()
-
-    methodmap = dict(subdirs=phase4,
-                     same_files=phase3, diff_files=phase3, funny_files=phase3,
-                     common_dirs = phase2, common_files=phase2, common_funny=phase2,
-                     common=phase1, left_only=phase1, right_only=phase1,
-                     left_list=phase0, right_list=phase0)
-
-    def __getattr__(self, attr):
-        if attr not in self.methodmap:
-            raise AttributeError, attr
-        self.methodmap[attr](self)
-        return getattr(self, attr)
-
-def cmpfiles(a, b, common, shallow=1):
-    """Compare common files in two directories.
-
-    a, b -- directory names
-    common -- list of file names found in both directories
-    shallow -- if true, do comparison based solely on stat() information
-
-    Returns a tuple of three lists:
-      files that compare equal
-      files that are different
-      filenames that aren't regular files.
-
-    """
-    res = ([], [], [])
-    for x in common:
-        ax = os.path.join(a, x)
-        bx = os.path.join(b, x)
-        res[_cmp(ax, bx, shallow)].append(x)
-    return res
-
-
-# Compare two files.
-# Return:
-#       0 for equal
-#       1 for different
-#       2 for funny cases (can't stat, etc.)
-#
-def _cmp(a, b, sh, abs=abs, cmp=cmp):
-    try:
-        return not abs(cmp(a, b, sh))
-    except os.error:
-        return 2
-
-
-# Return a copy with items that occur in skip removed.
-#
-def _filter(flist, skip):
-    return list(ifilterfalse(skip.__contains__, flist))
-
-
-# Demonstration and testing.
-#
-def demo():
-    import sys
-    import getopt
-    options, args = getopt.getopt(sys.argv[1:], 'r')
-    if len(args) != 2:
-        raise getopt.GetoptError('need exactly two args', None)
-    dd = dircmp(args[0], args[1])
-    if ('-r', '') in options:
-        dd.report_full_closure()
-    else:
-        dd.report()
-
-if __name__ == '__main__':
-    demo()

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Thu Mar 15 00:05:15 2012
From: jython-checkins at python.org (alex.gronholm)
Date: Thu, 15 Mar 2012 00:05:15 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_Patched_telnetlib=2Epy_again?=
	=?utf8?q?st_CPythonLib2=2E7?=
Message-ID: 

http://hg.python.org/jython/rev/2f810e3b0183
changeset:   6381:2f810e3b0183
user:        Alex Gr?nholm 
date:        Wed Mar 14 16:01:03 2012 -0700
summary:
  Patched telnetlib.py against CPythonLib2.7

files:
  Lib/telnetlib.py |  60 ++++++++++++++++++-----------------
  1 files changed, 31 insertions(+), 29 deletions(-)


diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -1,4 +1,4 @@
-"""TELNET client class.
+r"""TELNET client class.
 
 Based on RFC 854: TELNET Protocol Specification, by J. Postel and
 J. Reynolds
@@ -36,6 +36,7 @@
 # Imported modules
 import sys
 import socket
+import select
 import os
 if os.name == 'java':
     from select import cpython_compatible_select as select
@@ -44,7 +45,6 @@
 del os
 
 
-
 __all__ = ["Telnet"]
 
 # Tunable parameters
@@ -191,17 +191,18 @@
 
     """
 
-    def __init__(self, host=None, port=0):
+    def __init__(self, host=None, port=0,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         """Constructor.
 
         When called without arguments, create an unconnected instance.
-        With a hostname argument, it connects the instance; a port
-        number is optional.
-
+        With a hostname argument, it connects the instance; port number
+        and timeout are optional.
         """
         self.debuglevel = DEBUGLEVEL
         self.host = host
         self.port = port
+        self.timeout = timeout
         self.sock = None
         self.rawq = ''
         self.irawq = 0
@@ -212,36 +213,23 @@
         self.sbdataq = ''
         self.option_callback = None
         if host is not None:
-            self.open(host, port)
+            self.open(host, port, timeout)
 
-    def open(self, host, port=0):
+    def open(self, host, port=0, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         """Connect to a host.
 
         The optional second argument is the port number, which
         defaults to the standard telnet port (23).
 
         Don't try to reopen an already connected instance.
-
         """
         self.eof = 0
         if not port:
             port = TELNET_PORT
         self.host = host
         self.port = port
-        msg = "getaddrinfo returns an empty list"
-        for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
-            af, socktype, proto, canonname, sa = res
-            try:
-                self.sock = socket.socket(af, socktype, proto)
-                self.sock.connect(sa)
-            except socket.error, msg:
-                if self.sock:
-                    self.sock.close()
-                self.sock = None
-                continue
-            break
-        if not self.sock:
-            raise socket.error, msg
+        self.timeout = timeout
+        self.sock = socket.create_connection((host, port), timeout)
 
     def __del__(self):
         """Destructor -- close the connection."""
@@ -255,7 +243,7 @@
 
         """
         if self.debuglevel > 0:
-            print 'Telnet(%s,%d):' % (self.host, self.port),
+            print 'Telnet(%s,%s):' % (self.host, self.port),
             if args:
                 print msg % args
             else:
@@ -295,7 +283,7 @@
         """
         if IAC in buffer:
             buffer = buffer.replace(IAC, IAC+IAC)
-        self.msg("send %s", `buffer`)
+        self.msg("send %r", buffer)
         self.sock.sendall(buffer)
 
     def read_until(self, match, timeout=None):
@@ -318,6 +306,8 @@
         s_args = s_reply
         if timeout is not None:
             s_args = s_args + (timeout,)
+            from time import time
+            time_start = time()
         while not self.eof and select(*s_args) == s_reply:
             i = max(0, len(self.cookedq)-n)
             self.fill_rawq()
@@ -328,6 +318,11 @@
                 buf = self.cookedq[:i]
                 self.cookedq = self.cookedq[i:]
                 return buf
+            if timeout is not None:
+                elapsed = time() - time_start
+                if elapsed >= timeout:
+                    break
+                s_args = s_reply + (timeout-elapsed,)
         return self.read_very_lazy()
 
     def read_all(self):
@@ -445,7 +440,7 @@
                     else:
                         self.iacseq += c
                 elif len(self.iacseq) == 1:
-                    'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]'
+                    # 'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]'
                     if c in (DO, DONT, WILL, WONT):
                         self.iacseq += c
                         continue
@@ -526,7 +521,7 @@
         # The buffer size should be fairly small so as to avoid quadratic
         # behavior in process_rawq() above
         buf = self.sock.recv(50)
-        self.msg("recv %s", `buf`)
+        self.msg("recv %r", buf)
         self.eof = (not buf)
         self.rawq = self.rawq + buf
 
@@ -608,6 +603,9 @@
             if not hasattr(list[i], "search"):
                 if not re: import re
                 list[i] = re.compile(list[i])
+        if timeout is not None:
+            from time import time
+            time_start = time()
         while 1:
             self.process_rawq()
             for i in indices:
@@ -620,7 +618,11 @@
             if self.eof:
                 break
             if timeout is not None:
-                r, w, x = select([self.fileno()], [], [], timeout)
+                elapsed = time() - time_start
+                if elapsed >= timeout:
+                    break
+                s_args = ([self.fileno()], [], [], timeout-elapsed)
+                r, w, x = select(*s_args)
                 if not r:
                     break
             self.fill_rawq()
@@ -654,7 +656,7 @@
             port = socket.getservbyname(portstr, 'tcp')
     tn = Telnet()
     tn.set_debuglevel(debuglevel)
-    tn.open(host, port)
+    tn.open(host, port, timeout=0.5)
     tn.interact()
     tn.close()
 

-- 
Repository URL: http://hg.python.org/jython

From jython-checkins at python.org  Thu Mar 15 00:08:47 2012
From: jython-checkins at python.org (frank.wierzbicki)
Date: Thu, 15 Mar 2012 00:08:47 +0100
Subject: [Jython-checkins] =?utf8?q?jython=3A_divisionWarning_-=3E_divisio?=
 =?utf8?q?n=5Fwarning_to_fix_regrtest=2E?=
Message-ID: 

http://hg.python.org/jython/rev/9a6a9ea2f56b
changeset:   6382:9a6a9ea2f56b
parent:      6379:d668f865d290
user:        Frank Wierzbicki 
date:        Wed Mar 14 16:08:03 2012 -0700
summary:
  divisionWarning -> division_warning to fix regrtest.

files:
  .hgsubstate                          |   2 +-
  src/org/python/core/Options.java     |  12 ++++++------
  src/org/python/core/PyComplex.java   |   4 ++--
  src/org/python/core/PyFloat.java     |   4 ++--
  src/org/python/core/PyInteger.java   |   4 ++--
  src/org/python/core/PyLong.java      |   4 ++--
  src/org/python/modules/_hashlib.java |   2 +-
  src/org/python/util/jython.java      |   6 +++---
  8 files changed, 19 insertions(+), 19 deletions(-)


diff --git a/.hgsubstate b/.hgsubstate
--- a/.hgsubstate
+++ b/.hgsubstate
@@ -1,1 +1,1 @@
-88850 CPythonLib
+88741 CPythonLib
diff --git a/src/org/python/core/Options.java b/src/org/python/core/Options.java
--- a/src/org/python/core/Options.java
+++ b/src/org/python/core/Options.java
@@ -98,7 +98,7 @@
      * 
  • warnall: 2
  • * */ - public static int divisionWarning = 0; + public static int division_warning = 0; // // ####### END OF OPTIONS @@ -169,16 +169,16 @@ Options.Qnew = getBooleanOption("options.Qnew", Options.Qnew); - prop = PySystemState.registry.getProperty("python.divisionWarning"); + prop = PySystemState.registry.getProperty("python.division_warning"); if (prop != null) { if (prop.equalsIgnoreCase("old")) { - Options.divisionWarning = 0; + Options.division_warning = 0; } else if (prop.equalsIgnoreCase("warn")) { - Options.divisionWarning = 1; + Options.division_warning = 1; } else if (prop.equalsIgnoreCase("warnall")) { - Options.divisionWarning = 2; + Options.division_warning = 2; } else { - throw Py.ValueError("Illegal divisionWarning option " + throw Py.ValueError("Illegal division_warning option " + "setting: '" + prop + "'"); } } diff --git a/src/org/python/core/PyComplex.java b/src/org/python/core/PyComplex.java --- a/src/org/python/core/PyComplex.java +++ b/src/org/python/core/PyComplex.java @@ -434,7 +434,7 @@ if (!canCoerce(right)) { return null; } - if (Options.divisionWarning >= 2) { + if (Options.division_warning >= 2) { Py.warning(Py.DeprecationWarning, "classic complex division"); } return _div(this, coerce(right)); @@ -450,7 +450,7 @@ if (!canCoerce(left)) { return null; } - if (Options.divisionWarning >= 2) { + if (Options.division_warning >= 2) { Py.warning(Py.DeprecationWarning, "classic complex division"); } return _div(coerce(left), this); diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java --- a/src/org/python/core/PyFloat.java +++ b/src/org/python/core/PyFloat.java @@ -381,7 +381,7 @@ if (!canCoerce(right)) { return null; } - if (Options.divisionWarning >= 2) { + if (Options.division_warning >= 2) { Py.warning(Py.DeprecationWarning, "classic float division"); } @@ -402,7 +402,7 @@ if (!canCoerce(left)) { return null; } - if (Options.divisionWarning >= 2) { + if (Options.division_warning >= 2) { Py.warning(Py.DeprecationWarning, "classic float division"); } diff --git a/src/org/python/core/PyInteger.java b/src/org/python/core/PyInteger.java --- a/src/org/python/core/PyInteger.java +++ b/src/org/python/core/PyInteger.java @@ -361,7 +361,7 @@ if (!canCoerce(right)) { return null; } - if (Options.divisionWarning > 0) { + if (Options.division_warning > 0) { Py.warning(Py.DeprecationWarning, "classic int division"); } return Py.newInteger(divide(getValue(), coerce(right))); @@ -377,7 +377,7 @@ if (!canCoerce(left)) { return null; } - if (Options.divisionWarning > 0) { + if (Options.division_warning > 0) { Py.warning(Py.DeprecationWarning, "classic int division"); } return Py.newInteger(divide(coerce(left), getValue())); diff --git a/src/org/python/core/PyLong.java b/src/org/python/core/PyLong.java --- a/src/org/python/core/PyLong.java +++ b/src/org/python/core/PyLong.java @@ -444,7 +444,7 @@ if (!canCoerce(right)) { return null; } - if (Options.divisionWarning > 0) { + if (Options.division_warning > 0) { Py.warning(Py.DeprecationWarning, "classic long division"); } return Py.newLong(divide( getValue(), coerce(right))); @@ -460,7 +460,7 @@ if (!canCoerce(left)) { return null; } - if (Options.divisionWarning > 0) { + if (Options.division_warning > 0) { Py.warning(Py.DeprecationWarning, "classic long division"); } return Py.newLong(divide(coerce(left), getValue())); diff --git a/src/org/python/modules/_hashlib.java b/src/org/python/modules/_hashlib.java --- a/src/org/python/modules/_hashlib.java +++ b/src/org/python/modules/_hashlib.java @@ -129,7 +129,7 @@ private static final Map blockSizes = new HashMap() {{ put("md5", 64); put("sha-1", 64); - put("sha-224", 64); + //put("sha-224", 64); put("sha-256", 64); put("sha-384", 128); put("sha-512", 128); diff --git a/src/org/python/util/jython.java b/src/org/python/util/jython.java --- a/src/org/python/util/jython.java +++ b/src/org/python/util/jython.java @@ -195,11 +195,11 @@ if (opts.division != null) { if ("old".equals(opts.division)) { - Options.divisionWarning = 0; + Options.division_warning = 0; } else if ("warn".equals(opts.division)) { - Options.divisionWarning = 1; + Options.division_warning = 1; } else if ("warnall".equals(opts.division)) { - Options.divisionWarning = 2; + Options.division_warning = 2; } else if ("new".equals(opts.division)) { Options.Qnew = true; interp.cflags.setFlag(CodeFlag.CO_FUTURE_DIVISION); -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 15 00:08:47 2012 From: jython-checkins at python.org (frank.wierzbicki) Date: Thu, 15 Mar 2012 00:08:47 +0100 Subject: [Jython-checkins] =?utf8?q?jython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2Uu?= Message-ID: http://hg.python.org/jython/rev/64f5c0fedbf9 changeset: 6383:64f5c0fedbf9 parent: 6382:9a6a9ea2f56b parent: 6381:2f810e3b0183 user: Frank Wierzbicki date: Wed Mar 14 16:08:40 2012 -0700 summary: Merge. files: Lib/filecmp.py | 300 ----------------------------------- Lib/telnetlib.py | 60 +++--- 2 files changed, 31 insertions(+), 329 deletions(-) diff --git a/Lib/filecmp.py b/Lib/filecmp.py deleted file mode 100644 --- a/Lib/filecmp.py +++ /dev/null @@ -1,300 +0,0 @@ -"""Utilities for comparing files and directories. - -Classes: - dircmp - -Functions: - cmp(f1, f2, shallow=1) -> int - cmpfiles(a, b, common) -> ([], [], []) - -""" - -import os -import stat -from itertools import ifilter, ifilterfalse, imap, izip - -__all__ = ["cmp","dircmp","cmpfiles"] - -_cache = {} -BUFSIZE=8*1024 - -def cmp(f1, f2, shallow=1): - """Compare two files. - - Arguments: - - f1 -- First file name - - f2 -- Second file name - - shallow -- Just check stat signature (do not read the files). - defaults to 1. - - Return value: - - True if the files are the same, False otherwise. - - This function uses a cache for past comparisons and the results, - with a cache invalidation mechanism relying on stale signatures. - - """ - - s1 = _sig(os.stat(f1)) - s2 = _sig(os.stat(f2)) - if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG: - return False - if shallow and s1 == s2: - return True - if s1[1] != s2[1]: - return False - - result = _cache.get((f1, f2)) - if result and (s1, s2) == result[:2]: - return result[2] - outcome = _do_cmp(f1, f2) - _cache[f1, f2] = s1, s2, outcome - return outcome - -def _sig(st): - return (stat.S_IFMT(st.st_mode), - st.st_size, - st.st_mtime) - -def _do_cmp(f1, f2): - bufsize = BUFSIZE - fp1 = open(f1, 'rb') - fp2 = open(f2, 'rb') - try: - while True: - b1 = fp1.read(bufsize) - b2 = fp2.read(bufsize) - if b1 != b2: - return False - if not b1: - return True - finally: - fp1.close() - fp2.close() - -# Directory comparison class. -# -class dircmp: - """A class that manages the comparison of 2 directories. - - dircmp(a,b,ignore=None,hide=None) - A and B are directories. - IGNORE is a list of names to ignore, - defaults to ['RCS', 'CVS', 'tags']. - HIDE is a list of names to hide, - defaults to [os.curdir, os.pardir]. - - High level usage: - x = dircmp(dir1, dir2) - x.report() -> prints a report on the differences between dir1 and dir2 - or - x.report_partial_closure() -> prints report on differences between dir1 - and dir2, and reports on common immediate subdirectories. - x.report_full_closure() -> like report_partial_closure, - but fully recursive. - - Attributes: - left_list, right_list: The files in dir1 and dir2, - filtered by hide and ignore. - common: a list of names in both dir1 and dir2. - left_only, right_only: names only in dir1, dir2. - common_dirs: subdirectories in both dir1 and dir2. - common_files: files in both dir1 and dir2. - common_funny: names in both dir1 and dir2 where the type differs between - dir1 and dir2, or the name is not stat-able. - same_files: list of identical files. - diff_files: list of filenames which differ. - funny_files: list of files which could not be compared. - subdirs: a dictionary of dircmp objects, keyed by names in common_dirs. - """ - - def __init__(self, a, b, ignore=None, hide=None): # Initialize - self.left = a - self.right = b - if hide is None: - self.hide = [os.curdir, os.pardir] # Names never to be shown - else: - self.hide = hide - if ignore is None: - self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison - else: - self.ignore = ignore - - def phase0(self): # Compare everything except common subdirectories - self.left_list = _filter(os.listdir(self.left), - self.hide+self.ignore) - self.right_list = _filter(os.listdir(self.right), - self.hide+self.ignore) - self.left_list.sort() - self.right_list.sort() - - def phase1(self): # Compute common names - a = dict(izip(imap(os.path.normcase, self.left_list), self.left_list)) - b = dict(izip(imap(os.path.normcase, self.right_list), self.right_list)) - self.common = map(a.__getitem__, ifilter(b.__contains__, a)) - self.left_only = map(a.__getitem__, ifilterfalse(b.__contains__, a)) - self.right_only = map(b.__getitem__, ifilterfalse(a.__contains__, b)) - - def phase2(self): # Distinguish files, directories, funnies - self.common_dirs = [] - self.common_files = [] - self.common_funny = [] - - for x in self.common: - a_path = os.path.join(self.left, x) - b_path = os.path.join(self.right, x) - - ok = 1 - try: - a_stat = os.stat(a_path) - except os.error, why: - # print 'Can\'t stat', a_path, ':', why[1] - ok = 0 - try: - b_stat = os.stat(b_path) - except os.error, why: - # print 'Can\'t stat', b_path, ':', why[1] - ok = 0 - - if ok: - a_type = stat.S_IFMT(a_stat.st_mode) - b_type = stat.S_IFMT(b_stat.st_mode) - if a_type != b_type: - self.common_funny.append(x) - elif stat.S_ISDIR(a_type): - self.common_dirs.append(x) - elif stat.S_ISREG(a_type): - self.common_files.append(x) - else: - self.common_funny.append(x) - else: - self.common_funny.append(x) - - def phase3(self): # Find out differences between common files - xx = cmpfiles(self.left, self.right, self.common_files) - self.same_files, self.diff_files, self.funny_files = xx - - def phase4(self): # Find out differences between common subdirectories - # A new dircmp object is created for each common subdirectory, - # these are stored in a dictionary indexed by filename. - # The hide and ignore properties are inherited from the parent - self.subdirs = {} - for x in self.common_dirs: - a_x = os.path.join(self.left, x) - b_x = os.path.join(self.right, x) - self.subdirs[x] = dircmp(a_x, b_x, self.ignore, self.hide) - - def phase4_closure(self): # Recursively call phase4() on subdirectories - self.phase4() - for sd in self.subdirs.itervalues(): - sd.phase4_closure() - - def report(self): # Print a report on the differences between a and b - # Output format is purposely lousy - print 'diff', self.left, self.right - if self.left_only: - self.left_only.sort() - print 'Only in', self.left, ':', self.left_only - if self.right_only: - self.right_only.sort() - print 'Only in', self.right, ':', self.right_only - if self.same_files: - self.same_files.sort() - print 'Identical files :', self.same_files - if self.diff_files: - self.diff_files.sort() - print 'Differing files :', self.diff_files - if self.funny_files: - self.funny_files.sort() - print 'Trouble with common files :', self.funny_files - if self.common_dirs: - self.common_dirs.sort() - print 'Common subdirectories :', self.common_dirs - if self.common_funny: - self.common_funny.sort() - print 'Common funny cases :', self.common_funny - - def report_partial_closure(self): # Print reports on self and on subdirs - self.report() - for sd in self.subdirs.itervalues(): - print - sd.report() - - def report_full_closure(self): # Report on self and subdirs recursively - self.report() - for sd in self.subdirs.itervalues(): - print - sd.report_full_closure() - - methodmap = dict(subdirs=phase4, - same_files=phase3, diff_files=phase3, funny_files=phase3, - common_dirs = phase2, common_files=phase2, common_funny=phase2, - common=phase1, left_only=phase1, right_only=phase1, - left_list=phase0, right_list=phase0) - - def __getattr__(self, attr): - if attr not in self.methodmap: - raise AttributeError, attr - self.methodmap[attr](self) - return getattr(self, attr) - -def cmpfiles(a, b, common, shallow=1): - """Compare common files in two directories. - - a, b -- directory names - common -- list of file names found in both directories - shallow -- if true, do comparison based solely on stat() information - - Returns a tuple of three lists: - files that compare equal - files that are different - filenames that aren't regular files. - - """ - res = ([], [], []) - for x in common: - ax = os.path.join(a, x) - bx = os.path.join(b, x) - res[_cmp(ax, bx, shallow)].append(x) - return res - - -# Compare two files. -# Return: -# 0 for equal -# 1 for different -# 2 for funny cases (can't stat, etc.) -# -def _cmp(a, b, sh, abs=abs, cmp=cmp): - try: - return not abs(cmp(a, b, sh)) - except os.error: - return 2 - - -# Return a copy with items that occur in skip removed. -# -def _filter(flist, skip): - return list(ifilterfalse(skip.__contains__, flist)) - - -# Demonstration and testing. -# -def demo(): - import sys - import getopt - options, args = getopt.getopt(sys.argv[1:], 'r') - if len(args) != 2: - raise getopt.GetoptError('need exactly two args', None) - dd = dircmp(args[0], args[1]) - if ('-r', '') in options: - dd.report_full_closure() - else: - dd.report() - -if __name__ == '__main__': - demo() diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py --- a/Lib/telnetlib.py +++ b/Lib/telnetlib.py @@ -1,4 +1,4 @@ -"""TELNET client class. +r"""TELNET client class. Based on RFC 854: TELNET Protocol Specification, by J. Postel and J. Reynolds @@ -36,6 +36,7 @@ # Imported modules import sys import socket +import select import os if os.name == 'java': from select import cpython_compatible_select as select @@ -44,7 +45,6 @@ del os - __all__ = ["Telnet"] # Tunable parameters @@ -191,17 +191,18 @@ """ - def __init__(self, host=None, port=0): + def __init__(self, host=None, port=0, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Constructor. When called without arguments, create an unconnected instance. - With a hostname argument, it connects the instance; a port - number is optional. - + With a hostname argument, it connects the instance; port number + and timeout are optional. """ self.debuglevel = DEBUGLEVEL self.host = host self.port = port + self.timeout = timeout self.sock = None self.rawq = '' self.irawq = 0 @@ -212,36 +213,23 @@ self.sbdataq = '' self.option_callback = None if host is not None: - self.open(host, port) + self.open(host, port, timeout) - def open(self, host, port=0): + def open(self, host, port=0, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Connect to a host. The optional second argument is the port number, which defaults to the standard telnet port (23). Don't try to reopen an already connected instance. - """ self.eof = 0 if not port: port = TELNET_PORT self.host = host self.port = port - msg = "getaddrinfo returns an empty list" - for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - try: - self.sock = socket.socket(af, socktype, proto) - self.sock.connect(sa) - except socket.error, msg: - if self.sock: - self.sock.close() - self.sock = None - continue - break - if not self.sock: - raise socket.error, msg + self.timeout = timeout + self.sock = socket.create_connection((host, port), timeout) def __del__(self): """Destructor -- close the connection.""" @@ -255,7 +243,7 @@ """ if self.debuglevel > 0: - print 'Telnet(%s,%d):' % (self.host, self.port), + print 'Telnet(%s,%s):' % (self.host, self.port), if args: print msg % args else: @@ -295,7 +283,7 @@ """ if IAC in buffer: buffer = buffer.replace(IAC, IAC+IAC) - self.msg("send %s", `buffer`) + self.msg("send %r", buffer) self.sock.sendall(buffer) def read_until(self, match, timeout=None): @@ -318,6 +306,8 @@ s_args = s_reply if timeout is not None: s_args = s_args + (timeout,) + from time import time + time_start = time() while not self.eof and select(*s_args) == s_reply: i = max(0, len(self.cookedq)-n) self.fill_rawq() @@ -328,6 +318,11 @@ buf = self.cookedq[:i] self.cookedq = self.cookedq[i:] return buf + if timeout is not None: + elapsed = time() - time_start + if elapsed >= timeout: + break + s_args = s_reply + (timeout-elapsed,) return self.read_very_lazy() def read_all(self): @@ -445,7 +440,7 @@ else: self.iacseq += c elif len(self.iacseq) == 1: - 'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]' + # 'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]' if c in (DO, DONT, WILL, WONT): self.iacseq += c continue @@ -526,7 +521,7 @@ # The buffer size should be fairly small so as to avoid quadratic # behavior in process_rawq() above buf = self.sock.recv(50) - self.msg("recv %s", `buf`) + self.msg("recv %r", buf) self.eof = (not buf) self.rawq = self.rawq + buf @@ -608,6 +603,9 @@ if not hasattr(list[i], "search"): if not re: import re list[i] = re.compile(list[i]) + if timeout is not None: + from time import time + time_start = time() while 1: self.process_rawq() for i in indices: @@ -620,7 +618,11 @@ if self.eof: break if timeout is not None: - r, w, x = select([self.fileno()], [], [], timeout) + elapsed = time() - time_start + if elapsed >= timeout: + break + s_args = ([self.fileno()], [], [], timeout-elapsed) + r, w, x = select(*s_args) if not r: break self.fill_rawq() @@ -654,7 +656,7 @@ port = socket.getservbyname(portstr, 'tcp') tn = Telnet() tn.set_debuglevel(debuglevel) - tn.open(host, port) + tn.open(host, port, timeout=0.5) tn.interact() tn.close() -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 15 00:43:33 2012 From: jython-checkins at python.org (alex.gronholm) Date: Thu, 15 Mar 2012 00:43:33 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Patched_gzip=2Epy_against_CP?= =?utf8?q?ythonLib2=2E7?= Message-ID: http://hg.python.org/jython/rev/135e67c7b057 changeset: 6384:135e67c7b057 user: Alex Gr?nholm date: Wed Mar 14 16:42:49 2012 -0700 summary: Patched gzip.py against CPythonLib2.7 files: Lib/gzip.py | 208 +++++++++++++++++++++------------------ 1 files changed, 114 insertions(+), 94 deletions(-) diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -5,8 +5,9 @@ # based on Andrew Kuchling's minigzip.py distributed with the zlib module -import struct, sys, time +import struct, sys, time, os import zlib +import io import __builtin__ __all__ = ["GzipFile","open"] @@ -15,29 +16,13 @@ READ, WRITE = 1, 2 -def U32(i): - """Return i as an unsigned integer, assuming it fits in 32 bits. - - If it's >= 2GB when viewed as a 32-bit unsigned int, return a long. - """ - if i < 0: - i += 1L << 32 - return i - -def LOWU32(i): - """Return the low-order 32 bits of an int, as a non-negative int.""" - return i & 0xFFFFFFFFL - -def write32(output, value): - output.write(struct.pack("' + def _check_closed(self): + """Raises a ValueError if the underlying file object has been closed. + + """ + if self.closed: + raise ValueError('I/O operation on closed file.') + def _init_write(self, filename): - if filename[-3:] != '.gz': - filename = filename + '.gz' - self.filename = filename - self.crc = zlib.crc32("") + self.name = filename + self.crc = zlib.crc32("") & 0xffffffffL self.size = 0 self.writebuf = [] self.bufsize = 0 @@ -147,19 +159,24 @@ def _write_gzip_header(self): self.fileobj.write('\037\213') # magic header self.fileobj.write('\010') # compression method - fname = self.filename[:-3] + fname = os.path.basename(self.name) + if fname.endswith(".gz"): + fname = fname[:-3] flags = 0 if fname: flags = FNAME self.fileobj.write(chr(flags)) - write32u(self.fileobj, long(time.time())) + mtime = self.mtime + if mtime is None: + mtime = time.time() + write32u(self.fileobj, long(mtime)) self.fileobj.write('\002') self.fileobj.write('\377') if fname: self.fileobj.write(fname + '\000') def _init_read(self): - self.crc = zlib.crc32("") + self.crc = zlib.crc32("") & 0xffffffffL self.size = 0 def _read_gzip_header(self): @@ -170,10 +187,10 @@ if method != 8: raise IOError, 'Unknown compression method' flag = ord( self.fileobj.read(1) ) - # modtime = self.fileobj.read(4) + self.mtime = read32(self.fileobj) # extraflag = self.fileobj.read(1) # os = self.fileobj.read(1) - self.fileobj.read(6) + self.fileobj.read(2) if flag & FEXTRA: # Read & discard the extra field, if present @@ -195,21 +212,29 @@ if flag & FHCRC: self.fileobj.read(2) # Read & discard the 16-bit header CRC - def write(self,data): + self._check_closed() if self.mode != WRITE: import errno raise IOError(errno.EBADF, "write() on read-only GzipFile object") if self.fileobj is None: raise ValueError, "write() on closed GzipFile object" + + # Convert data type if called by io.BufferedWriter. + if isinstance(data, memoryview): + data = data.tobytes() + if len(data) > 0: self.size = self.size + len(data) - self.crc = zlib.crc32(data, self.crc) + self.crc = zlib.crc32(data, self.crc) & 0xffffffffL self.fileobj.write( self.compress.compress(data) ) self.offset += len(data) + return len(data) + def read(self, size=-1): + self._check_closed() if self.mode != READ: import errno raise IOError(errno.EBADF, "read() on write-only GzipFile object") @@ -234,15 +259,14 @@ if size > self.extrasize: size = self.extrasize - chunk = self.extrabuf[:size] - self.extrabuf = self.extrabuf[size:] + offset = self.offset - self.extrastart + chunk = self.extrabuf[offset: offset + size] self.extrasize = self.extrasize - size self.offset += size return chunk def _unread(self, buf): - self.extrabuf = buf + self.extrabuf self.extrasize = len(buf) + self.extrasize self.offset -= len(buf) @@ -297,9 +321,11 @@ self._new_member = True def _add_read_data(self, data): - self.crc = zlib.crc32(data, self.crc) - self.extrabuf = self.extrabuf + data + self.crc = zlib.crc32(data, self.crc) & 0xffffffffL + offset = self.offset - self.extrastart + self.extrabuf = self.extrabuf[offset:] + data self.extrasize = self.extrasize + len(data) + self.extrastart = self.offset self.size = self.size + len(data) def _read_eof(self): @@ -310,24 +336,34 @@ # stored is the true file size mod 2**32. self.fileobj.seek(-8, 1) crc32 = read32(self.fileobj) - isize = U32(read32(self.fileobj)) # may exceed 2GB - if U32(crc32) != U32(self.crc): - raise IOError, "CRC check failed" - elif isize != LOWU32(self.size): + isize = read32(self.fileobj) # may exceed 2GB + if crc32 != self.crc: + raise IOError("CRC check failed %s != %s" % (hex(crc32), + hex(self.crc))) + elif isize != (self.size & 0xffffffffL): raise IOError, "Incorrect length of data produced" + # Gzip files can be padded with zeroes and still have archives. + # Consume all zero bytes and set the file position to the first + # non-zero byte. See http://www.gzip.org/#faq8 + c = "\x00" + while c == "\x00": + c = self.fileobj.read(1) + if c: + self.fileobj.seek(-1, 1) + + @property + def closed(self): + return self.fileobj is None + def close(self): + if self.fileobj is None: + return if self.mode == WRITE: self.fileobj.write(self.compress.flush()) - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - write32u(self.fileobj, LOWU32(self.crc)) + write32u(self.fileobj, self.crc) # self.size may exceed 2GB, or even 4GB - write32u(self.fileobj, LOWU32(self.size)) + write32u(self.fileobj, self.size & 0xffffffffL) self.fileobj = None elif self.mode == READ: self.fileobj = None @@ -335,25 +371,18 @@ self.myfileobj.close() self.myfileobj = None - def __del__(self): - try: - if (self.myfileobj is None and - self.fileobj is None): - return - except AttributeError: - return - self.close() - if not sys.platform.startswith('java'): def flush(self,zlib_mode=zlib.Z_SYNC_FLUSH): + self._check_closed() if self.mode == WRITE: # Ensure the compressor's buffer is flushed self.fileobj.write(self.compress.flush(zlib_mode)) - self.fileobj.flush() + self.fileobj.flush() else: # Java lacks Z_SYNC_FLUSH; thus Jython can't flush the # compressobj until EOF def flush(self,zlib_mode=None): + self._check_closed() self.fileobj.flush() def fileno(self): @@ -364,12 +393,6 @@ """ return self.fileobj.fileno() - def isatty(self): - return False - - def tell(self): - return self.offset - def rewind(self): '''Return the uncompressed stream file position indicator to the beginning of the file''' @@ -379,9 +402,24 @@ self._new_member = True self.extrabuf = "" self.extrasize = 0 + self.extrastart = 0 self.offset = 0 - def seek(self, offset): + def readable(self): + return self.mode == READ + + def writable(self): + return self.mode == WRITE + + def seekable(self): + return True + + def seek(self, offset, whence=0): + if whence: + if whence == 1: + offset = self.offset + offset + else: + raise ValueError('Seek from end not supported') if self.mode == WRITE: if offset < self.offset: raise IOError('Negative seek in write mode') @@ -398,8 +436,18 @@ self.read(1024) self.read(count % 1024) + return self.offset + def readline(self, size=-1): if size < 0: + # Shortcut common case - newline found in buffer. + offset = self.offset - self.extrastart + i = self.extrabuf.find('\n', offset) + 1 + if i > 0: + self.extrasize -= i - offset + self.offset += i - offset + return self.extrabuf[offset: i] + size = sys.maxint readsize = self.min_readsize else: @@ -429,34 +477,6 @@ self.min_readsize = min(readsize, self.min_readsize * 2, 512) return ''.join(bufs) # Return resulting line - def readlines(self, sizehint=0): - # Negative numbers result in reading all the lines - if sizehint <= 0: - sizehint = sys.maxint - L = [] - while sizehint > 0: - line = self.readline() - if line == "": - break - L.append(line) - sizehint = sizehint - len(line) - - return L - - def writelines(self, L): - for line in L: - self.write(line) - - def __iter__(self): - return self - - def next(self): - line = self.readline() - if line: - return line - else: - raise StopIteration - def _test(): # Act like gzip; with -d, act like gunzip. -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 15 01:02:43 2012 From: jython-checkins at python.org (alex.gronholm) Date: Thu, 15 Mar 2012 01:02:43 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Patched_subprocess=2Epy_agai?= =?utf8?q?nst_CPythonLib2=2E7?= Message-ID: http://hg.python.org/jython/rev/2b0f406ce73a changeset: 6385:2b0f406ce73a user: Alex Gr?nholm date: Wed Mar 14 17:01:27 2012 -0700 summary: Patched subprocess.py against CPythonLib2.7 files: Lib/subprocess.py | 751 ++++++++++++++++++++++----------- 1 files changed, 491 insertions(+), 260 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -107,7 +107,7 @@ (Windows only) -This module also defines two shortcut functions: +This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then @@ -127,6 +127,18 @@ check_call(["ls", "-l"]) +check_output(*popenargs, **kwargs): + Run command with arguments and return its output as a byte string. + + If the exit code was non-zero it raises a CalledProcessError. The + CalledProcessError object will have the return code in the returncode + attribute and output in the output attribute. + + The arguments are the same as for the Popen constructor. Example: + + output = check_output(["ls", "-l", "/dev/null"]) + + Exceptions ---------- Exceptions raised in the child process, before the new program has @@ -141,8 +153,8 @@ A ValueError will be raised if Popen is called with invalid arguments. -check_call() will raise CalledProcessError, if the called process -returns a non-zero return code. +check_call() and check_output() will raise CalledProcessError, if the +called process returns a non-zero return code. Security @@ -287,54 +299,80 @@ Replacing os.popen* ------------------- -pipe = os.popen(cmd, mode='r', bufsize) +pipe = os.popen("cmd", mode='r', bufsize) ==> -pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout +pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout -pipe = os.popen(cmd, mode='w', bufsize) +pipe = os.popen("cmd", mode='w', bufsize) ==> -pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin +pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin -(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize) +(child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> -p = Popen(cmd, shell=True, bufsize=bufsize, +p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, - child_stderr) = os.popen3(cmd, mode, bufsize) + child_stderr) = os.popen3("cmd", mode, bufsize) ==> -p = Popen(cmd, shell=True, bufsize=bufsize, +p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) -(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize) +(child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, + bufsize) ==> -p = Popen(cmd, shell=True, bufsize=bufsize, +p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) +On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as +the command to execute, in which case arguments will be passed +directly to the program without shell intervention. This usage can be +replaced as follows: + +(child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, + bufsize) +==> +p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) +(child_stdin, child_stdout) = (p.stdin, p.stdout) + +Return code handling translates as follows: + +pipe = os.popen("cmd", 'w') +... +rc = pipe.close() +if rc is not None and rc % 256: + print "There were some errors" +==> +process = Popen("cmd", 'w', shell=True, stdin=PIPE) +... +process.stdin.close() +if process.wait() != 0: + print "There were some errors" + Replacing popen2.* ------------------ -Note: If the cmd argument to popen2 functions is a string, the command -is executed through /bin/sh. If it is a list, the command is directly -executed. - (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) +On Unix, popen2 also accepts a sequence as the command to execute, in +which case arguments will be passed directly to the program without +shell intervention. This usage can be replaced as follows: -(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) +(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, + mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) @@ -357,15 +395,19 @@ import os import types import traceback +import signal # Exception classes used by this module. class CalledProcessError(Exception): - """This exception is raised when a process run by check_call() returns - a non-zero exit status. The exit status will be stored in the - returncode attribute.""" - def __init__(self, returncode, cmd): + """This exception is raised when a process run by check_call() or + check_output() returns a non-zero exit status. + The exit status will be stored in the returncode attribute; + check_output() will also store the output in the output attribute. + """ + def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd + self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) @@ -373,28 +415,15 @@ if mswindows: import threading import msvcrt - if 0: # <-- change this to use pywin32 instead of the _subprocess driver - import pywintypes - from win32api import GetStdHandle, STD_INPUT_HANDLE, \ - STD_OUTPUT_HANDLE, STD_ERROR_HANDLE - from win32api import GetCurrentProcess, DuplicateHandle, \ - GetModuleFileName, GetVersion - from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE - from win32pipe import CreatePipe - from win32process import CreateProcess, STARTUPINFO, \ - GetExitCodeProcess, STARTF_USESTDHANDLES, \ - STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE - from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0 - else: - from _subprocess import * - class STARTUPINFO: - dwFlags = 0 - hStdInput = None - hStdOutput = None - hStdError = None - wShowWindow = 0 - class pywintypes: - error = IOError + import _subprocess + class STARTUPINFO: + dwFlags = 0 + hStdInput = None + hStdOutput = None + hStdError = None + wShowWindow = 0 + class pywintypes: + error = IOError elif jython: import errno import threading @@ -410,30 +439,35 @@ import org.python.core.io.StreamIO else: import select + _has_poll = hasattr(select, 'poll') import errno import fcntl import gc import pickle -__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"] + # When select or poll has indicated that the file is writable, + # we can write up to _PIPE_BUF bytes without risk of blocking. + # POSIX defines PIPE_BUF as >= 512. + _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) + +__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", + "check_output", "CalledProcessError"] + +if mswindows: + from _subprocess import CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP + __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP"]) try: MAXFD = os.sysconf("SC_OPEN_MAX") except: MAXFD = 256 -# True/False does not exist on 2.2.0 -try: - False -except NameError: - False = 0 - True = 1 - _active = [] def _cleanup(): for inst in _active[:]: - if inst.poll(_deadstate=sys.maxint) >= 0: + res = inst._internal_poll(_deadstate=sys.maxint) + if res is not None and res >= 0: try: _active.remove(inst) except ValueError: @@ -445,6 +479,16 @@ STDOUT = -2 +def _eintr_retry_call(func, *args): + while True: + try: + return func(*args) + except OSError, e: + if e.errno == errno.EINTR: + continue + raise + + def call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete, then return the returncode attribute. @@ -467,12 +511,45 @@ check_call(["ls", "-l"]) """ retcode = call(*popenargs, **kwargs) - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] raise CalledProcessError(retcode, cmd) - return retcode + return 0 + + +def check_output(*popenargs, **kwargs): + r"""Run command with arguments and return its output as a byte string. + + If the exit code was non-zero it raises a CalledProcessError. The + CalledProcessError object will have the return code in the returncode + attribute and output in the output attribute. + + The arguments are the same as for the Popen constructor. Example: + + >>> check_output(["ls", "-l", "/dev/null"]) + 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' + + The stdout argument is not allowed as it is used internally. + To capture standard error in the result, use stderr=STDOUT. + + >>> check_output(["/bin/sh", "-c", + ... "ls -l non_existent_file ; exit 0"], + ... stderr=STDOUT) + 'ls: non_existent_file: No such file or directory\n' + """ + if 'stdout' in kwargs: + raise ValueError('stdout argument not allowed, it will be overridden.') + process = Popen(stdout=PIPE, *popenargs, **kwargs) + output, unused_err = process.communicate() + retcode = process.poll() + if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] + raise CalledProcessError(retcode, cmd, output=output) + return output def list2cmdline(seq): @@ -485,8 +562,8 @@ 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space - or pipe characters contained within. A quoted string can be - embedded in an argument. + contained within. A quoted string can be embedded in an + argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. @@ -502,7 +579,9 @@ """ # See - # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp + # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx + # or search http://msdn.microsoft.com for + # "Parsing C++ Command-Line Arguments" result = [] needquote = False for arg in seq: @@ -512,7 +591,7 @@ if result: result.append(' ') - needquote = (" " in arg) or ("\t" in arg) or ("|" in arg) or not arg + needquote = (" " in arg) or ("\t" in arg) or not arg if needquote: result.append('"') @@ -755,21 +834,13 @@ c2pread, c2pwrite, errread, errwrite) - # On Windows, you cannot just redirect one or two handles: You - # either have to redirect all three or none. If the subprocess - # user has only redirected one or two handles, we are - # automatically creating PIPEs for the rest. We should close - # these after the process is started. See bug #1124861. if mswindows: - if stdin is None and p2cwrite is not None: - os.close(p2cwrite) - p2cwrite = None - if stdout is None and c2pread is not None: - os.close(c2pread) - c2pread = None - if stderr is None and errread is not None: - os.close(errread) - errread = None + if p2cwrite is not None: + p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) + if c2pread is not None: + c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) + if errread is not None: + errread = msvcrt.open_osfhandle(errread.Detach(), 0) if jython: self._stdin_thread = None @@ -846,12 +917,12 @@ return data - def __del__(self, sys=sys): + def __del__(self, _maxint=sys.maxint, _active=_active): if not self._child_created: # We didn't get to successfully create a child process. return # In case the child hasn't been waited on, check if it's done. - self.poll(_deadstate=sys.maxint) + self._internal_poll(_deadstate=_maxint) if self.returncode is None and _active is not None: # Child is still running, keep us alive until we can wait on it. _active.append(self) @@ -877,14 +948,20 @@ self.stdin.close() elif self.stdout: stdout = self.stdout.read() + self.stdout.close() elif self.stderr: stderr = self.stderr.read() + self.stderr.close() self.wait() return (stdout, stderr) return self._communicate(input) + def poll(self): + return self._internal_poll() + + if mswindows or jython: # # Windows and Jython shared methods @@ -945,7 +1022,7 @@ # Windows methods # def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: + """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ if stdin is None and stdout is None and stderr is None: @@ -956,14 +1033,11 @@ errread, errwrite = None, None if stdin is None: - p2cread = GetStdHandle(STD_INPUT_HANDLE) - if p2cread is not None: - pass - elif stdin is None or stdin == PIPE: - p2cread, p2cwrite = CreatePipe(None, 0) - # Detach and turn into fd - p2cwrite = p2cwrite.Detach() - p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) + p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) + if p2cread is None: + p2cread, _ = _subprocess.CreatePipe(None, 0) + elif stdin == PIPE: + p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdin, int): p2cread = msvcrt.get_osfhandle(stdin) else: @@ -972,14 +1046,11 @@ p2cread = self._make_inheritable(p2cread) if stdout is None: - c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) - if c2pwrite is not None: - pass - elif stdout is None or stdout == PIPE: - c2pread, c2pwrite = CreatePipe(None, 0) - # Detach and turn into fd - c2pread = c2pread.Detach() - c2pread = msvcrt.open_osfhandle(c2pread, 0) + c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) + if c2pwrite is None: + _, c2pwrite = _subprocess.CreatePipe(None, 0) + elif stdout == PIPE: + c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdout, int): c2pwrite = msvcrt.get_osfhandle(stdout) else: @@ -988,14 +1059,11 @@ c2pwrite = self._make_inheritable(c2pwrite) if stderr is None: - errwrite = GetStdHandle(STD_ERROR_HANDLE) - if errwrite is not None: - pass - elif stderr is None or stderr == PIPE: - errread, errwrite = CreatePipe(None, 0) - # Detach and turn into fd - errread = errread.Detach() - errread = msvcrt.open_osfhandle(errread, 0) + errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) + if errwrite is None: + _, errwrite = _subprocess.CreatePipe(None, 0) + elif stderr == PIPE: + errread, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): @@ -1012,14 +1080,15 @@ def _make_inheritable(self, handle): """Return a duplicate of handle, which is inheritable""" - return DuplicateHandle(GetCurrentProcess(), handle, - GetCurrentProcess(), 0, 1, - DUPLICATE_SAME_ACCESS) + return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), + handle, _subprocess.GetCurrentProcess(), 0, 1, + _subprocess.DUPLICATE_SAME_ACCESS) def _find_w9xpopen(self): """Find and return absolut path to w9xpopen.exe""" - w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), + w9xpopen = os.path.join( + os.path.dirname(_subprocess.GetModuleFileName(0)), "w9xpopen.exe") if not os.path.exists(w9xpopen): # Eeek - file-not-found - possibly an embedding @@ -1048,17 +1117,17 @@ if startupinfo is None: startupinfo = STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): - startupinfo.dwFlags |= STARTF_USESTDHANDLES + startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: - startupinfo.dwFlags |= STARTF_USESHOWWINDOW - startupinfo.wShowWindow = SW_HIDE + startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW + startupinfo.wShowWindow = _subprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + args - if (GetVersion() >= 0x80000000L or + args = '{} /c "{}"'.format (comspec, args) + if (_subprocess.GetVersion() >= 0x80000000 or os.path.basename(comspec).lower() == "command.com"): # Win9x, or using command.com on NT. We need to # use the w9xpopen intermediate program. For more @@ -1072,11 +1141,11 @@ # use at xxx" and a hopeful warning about the # stability of your system. Cost is Ctrl+C wont # kill children. - creationflags |= CREATE_NEW_CONSOLE + creationflags |= _subprocess.CREATE_NEW_CONSOLE # Start the process try: - hp, ht, pid, tid = CreateProcess(executable, args, + hp, ht, pid, tid = _subprocess.CreateProcess(executable, args, # no special security None, None, int(not close_fds), @@ -1090,6 +1159,19 @@ # translate errno using _sys_errlist (or simliar), but # how can this be done from Python? raise WindowsError(*e.args) + finally: + # Child is launched. Close the parent's copy of those pipe + # handles that only the child should have open. You need + # to make sure that no handles to the write end of the + # output pipe are maintained in this process or else the + # pipe will not close when the child process exits and the + # ReadFile will hang. + if p2cread is not None: + p2cread.Close() + if c2pwrite is not None: + c2pwrite.Close() + if errwrite is not None: + errwrite.Close() # Retain the process handle, but close the thread handle self._child_created = True @@ -1097,26 +1179,20 @@ self.pid = pid ht.Close() - # Child is launched. Close the parent's copy of those pipe - # handles that only the child should have open. You need - # to make sure that no handles to the write end of the - # output pipe are maintained in this process or else the - # pipe will not close when the child process exits and the - # ReadFile will hang. - if p2cread is not None: - p2cread.Close() - if c2pwrite is not None: - c2pwrite.Close() - if errwrite is not None: - errwrite.Close() + def _internal_poll(self, _deadstate=None, + _WaitForSingleObject=_subprocess.WaitForSingleObject, + _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, + _GetExitCodeProcess=_subprocess.GetExitCodeProcess): + """Check if child process has terminated. Returns returncode + attribute. + This method is called by __del__, so it can only refer to objects + in its local scope. - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" + """ if self.returncode is None: - if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: - self.returncode = GetExitCodeProcess(self._handle) + if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: + self.returncode = _GetExitCodeProcess(self._handle) return self.returncode @@ -1124,8 +1200,9 @@ """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: - obj = WaitForSingleObject(self._handle, INFINITE) - self.returncode = GetExitCodeProcess(self._handle) + _subprocess.WaitForSingleObject(self._handle, + _subprocess.INFINITE) + self.returncode = _subprocess.GetExitCodeProcess(self._handle) return self.returncode elif jython: @@ -1291,12 +1368,31 @@ self._stdin_thread.interrupt() return self.returncode + def send_signal(self, sig): + """Send a signal to the process + """ + if sig == signal.SIGTERM: + self.terminate() + elif sig == signal.CTRL_C_EVENT: + os.kill(self.pid, signal.CTRL_C_EVENT) + elif sig == signal.CTRL_BREAK_EVENT: + os.kill(self.pid, signal.CTRL_BREAK_EVENT) + else: + raise ValueError("Unsupported signal: {}".format(sig)) + + def terminate(self): + """Terminates the process + """ + _subprocess.TerminateProcess(self._handle, 1) + + kill = terminate + else: # # POSIX methods # def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: + """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ p2cread, p2cwrite = None, None @@ -1340,19 +1436,31 @@ errread, errwrite) - def _set_cloexec_flag(self, fd): + def _set_cloexec_flag(self, fd, cloexec=True): try: cloexec_flag = fcntl.FD_CLOEXEC except AttributeError: cloexec_flag = 1 old = fcntl.fcntl(fd, fcntl.F_GETFD) - fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) + if cloexec: + fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) + else: + fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag) def _close_fds(self, but): - os.closerange(3, but) - os.closerange(but + 1, MAXFD) + if hasattr(os, 'closerange'): + os.closerange(3, but) + os.closerange(but + 1, MAXFD) + else: + for i in xrange(3, MAXFD): + if i == but: + continue + try: + os.close(i) + except: + pass def _execute_child(self, args, executable, preexec_fn, close_fds, @@ -1370,6 +1478,8 @@ if shell: args = ["/bin/sh", "-c"] + args + if executable: + args[0] = executable if executable is None: executable = args[0] @@ -1378,115 +1488,145 @@ # The first char specifies the exception type: 0 means # OSError, 1 means some other error. errpipe_read, errpipe_write = os.pipe() - self._set_cloexec_flag(errpipe_write) + try: + try: + self._set_cloexec_flag(errpipe_write) - gc_was_enabled = gc.isenabled() - # Disable gc to avoid bug where gc -> file_dealloc -> - # write to stderr -> hang. http://bugs.python.org/issue1336 - gc.disable() - try: - self.pid = os.fork() - except: - if gc_was_enabled: - gc.enable() - raise - self._child_created = True - if self.pid == 0: - # Child + gc_was_enabled = gc.isenabled() + # Disable gc to avoid bug where gc -> file_dealloc -> + # write to stderr -> hang. http://bugs.python.org/issue1336 + gc.disable() + try: + self.pid = os.fork() + except: + if gc_was_enabled: + gc.enable() + raise + self._child_created = True + if self.pid == 0: + # Child + try: + # Close parent's pipe ends + if p2cwrite is not None: + os.close(p2cwrite) + if c2pread is not None: + os.close(c2pread) + if errread is not None: + os.close(errread) + os.close(errpipe_read) + + # Dup fds for child + def _dup2(a, b): + # dup2() removes the CLOEXEC flag but + # we must do it ourselves if dup2() + # would be a no-op (issue #10806). + if a == b: + self._set_cloexec_flag(a, False) + elif a is not None: + os.dup2(a, b) + _dup2(p2cread, 0) + _dup2(c2pwrite, 1) + _dup2(errwrite, 2) + + # Close pipe fds. Make sure we don't close the + # same fd more than once, or standard fds. + closed = { None } + for fd in [p2cread, c2pwrite, errwrite]: + if fd not in closed and fd > 2: + os.close(fd) + closed.add(fd) + + # Close all other fds, if asked for + if close_fds: + self._close_fds(but=errpipe_write) + + if cwd is not None: + os.chdir(cwd) + + if preexec_fn: + preexec_fn() + + if env is None: + os.execvp(executable, args) + else: + os.execvpe(executable, args, env) + + except: + exc_type, exc_value, tb = sys.exc_info() + # Save the traceback and attach it to the exception object + exc_lines = traceback.format_exception(exc_type, + exc_value, + tb) + exc_value.child_traceback = ''.join(exc_lines) + os.write(errpipe_write, pickle.dumps(exc_value)) + + # This exitcode won't be reported to applications, so it + # really doesn't matter what we return. + os._exit(255) + + # Parent + if gc_was_enabled: + gc.enable() + finally: + # be sure the FD is closed no matter what + os.close(errpipe_write) + + if p2cread is not None and p2cwrite is not None: + os.close(p2cread) + if c2pwrite is not None and c2pread is not None: + os.close(c2pwrite) + if errwrite is not None and errread is not None: + os.close(errwrite) + + # Wait for exec to fail or succeed; possibly raising exception + # Exception limited to 1M + data = _eintr_retry_call(os.read, errpipe_read, 1048576) + finally: + # be sure the FD is closed no matter what + os.close(errpipe_read) + + if data != "": try: - # Close parent's pipe ends - if p2cwrite is not None: - os.close(p2cwrite) - if c2pread is not None: - os.close(c2pread) - if errread is not None: - os.close(errread) - os.close(errpipe_read) - - # Dup fds for child - if p2cread is not None: - os.dup2(p2cread, 0) - if c2pwrite is not None: - os.dup2(c2pwrite, 1) - if errwrite is not None: - os.dup2(errwrite, 2) - - # Close pipe fds. Make sure we don't close the same - # fd more than once, or standard fds. - if p2cread is not None and p2cread not in (0,): - os.close(p2cread) - if c2pwrite is not None and c2pwrite not in (p2cread, 1): - os.close(c2pwrite) - if errwrite is not None and errwrite not in (p2cread, c2pwrite, 2): - os.close(errwrite) - - # Close all other fds, if asked for - if close_fds: - self._close_fds(but=errpipe_write) - - if cwd is not None: - os.chdir(cwd) - - if preexec_fn: - apply(preexec_fn) - - if env is None: - os.execvp(executable, args) - else: - os.execvpe(executable, args, env) - - except: - exc_type, exc_value, tb = sys.exc_info() - # Save the traceback and attach it to the exception object - exc_lines = traceback.format_exception(exc_type, - exc_value, - tb) - exc_value.child_traceback = ''.join(exc_lines) - os.write(errpipe_write, pickle.dumps(exc_value)) - - # This exitcode won't be reported to applications, so it - # really doesn't matter what we return. - os._exit(255) - - # Parent - if gc_was_enabled: - gc.enable() - os.close(errpipe_write) - if p2cread is not None and p2cwrite is not None: - os.close(p2cread) - if c2pwrite is not None and c2pread is not None: - os.close(c2pwrite) - if errwrite is not None and errread is not None: - os.close(errwrite) - - # Wait for exec to fail or succeed; possibly raising exception - data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB - os.close(errpipe_read) - if data != "": - os.waitpid(self.pid, 0) + _eintr_retry_call(os.waitpid, self.pid, 0) + except OSError as e: + if e.errno != errno.ECHILD: + raise child_exception = pickle.loads(data) + for fd in (p2cwrite, c2pread, errread): + if fd is not None: + os.close(fd) raise child_exception - def _handle_exitstatus(self, sts): - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - elif os.WIFEXITED(sts): - self.returncode = os.WEXITSTATUS(sts) + def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, + _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, + _WEXITSTATUS=os.WEXITSTATUS): + # This method is called (indirectly) by __del__, so it cannot + # refer to anything outside of its local scope.""" + if _WIFSIGNALED(sts): + self.returncode = -_WTERMSIG(sts) + elif _WIFEXITED(sts): + self.returncode = _WEXITSTATUS(sts) else: # Should never happen raise RuntimeError("Unknown child exit status!") - def poll(self, _deadstate=None): + def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, + _WNOHANG=os.WNOHANG, _os_error=os.error): """Check if child process has terminated. Returns returncode - attribute.""" + attribute. + + This method is called by __del__, so it cannot reference anything + outside of the local scope (nor can any methods it calls). + + """ if self.returncode is None: try: - pid, sts = os.waitpid(self.pid, os.WNOHANG) + pid, sts = _waitpid(self.pid, _WNOHANG) if pid == self.pid: self._handle_exitstatus(sts) - except os.error: + except _os_error: if _deadstate is not None: self.returncode = _deadstate return self.returncode @@ -1496,25 +1636,114 @@ """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: - pid, sts = os.waitpid(self.pid, 0) + try: + pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) + except OSError as e: + if e.errno != errno.ECHILD: + raise + # This happens if SIGCLD is set to be ignored or waiting + # for child processes has otherwise been disabled for our + # process. This child is dead, we can't get the status. + sts = 0 self._handle_exitstatus(sts) return self.returncode def _communicate(self, input): + if self.stdin: + # Flush stdio buffer. This might block, if the user has + # been writing to .stdin in an uncontrolled fashion. + self.stdin.flush() + if not input: + self.stdin.close() + + if _has_poll: + stdout, stderr = self._communicate_with_poll(input) + else: + stdout, stderr = self._communicate_with_select(input) + + # All data exchanged. Translate lists into strings. + if stdout is not None: + stdout = ''.join(stdout) + if stderr is not None: + stderr = ''.join(stderr) + + # Translate newlines, if requested. We cannot let the file + # object do the translation: It is based on stdio, which is + # impossible to combine with select (unless forcing no + # buffering). + if self.universal_newlines and hasattr(file, 'newlines'): + if stdout: + stdout = self._translate_newlines(stdout) + if stderr: + stderr = self._translate_newlines(stderr) + + self.wait() + return (stdout, stderr) + + + def _communicate_with_poll(self, input): + stdout = None # Return + stderr = None # Return + fd2file = {} + fd2output = {} + + poller = select.poll() + def register_and_append(file_obj, eventmask): + poller.register(file_obj.fileno(), eventmask) + fd2file[file_obj.fileno()] = file_obj + + def close_unregister_and_remove(fd): + poller.unregister(fd) + fd2file[fd].close() + fd2file.pop(fd) + + if self.stdin and input: + register_and_append(self.stdin, select.POLLOUT) + + select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI + if self.stdout: + register_and_append(self.stdout, select_POLLIN_POLLPRI) + fd2output[self.stdout.fileno()] = stdout = [] + if self.stderr: + register_and_append(self.stderr, select_POLLIN_POLLPRI) + fd2output[self.stderr.fileno()] = stderr = [] + + input_offset = 0 + while fd2file: + try: + ready = poller.poll() + except select.error, e: + if e.args[0] == errno.EINTR: + continue + raise + + for fd, mode in ready: + if mode & select.POLLOUT: + chunk = input[input_offset : input_offset + _PIPE_BUF] + input_offset += os.write(fd, chunk) + if input_offset >= len(input): + close_unregister_and_remove(fd) + elif mode & select_POLLIN_POLLPRI: + data = os.read(fd, 4096) + if not data: + close_unregister_and_remove(fd) + fd2output[fd].append(data) + else: + # Ignore hang up or errors. + close_unregister_and_remove(fd) + + return (stdout, stderr) + + + def _communicate_with_select(self, input): read_set = [] write_set = [] stdout = None # Return stderr = None # Return - if self.stdin: - # Flush stdio buffer. This might block, if the user has - # been writing to .stdin in an uncontrolled fashion. - self.stdin.flush() - if input: - write_set.append(self.stdin) - else: - self.stdin.close() + if self.stdin and input: + write_set.append(self.stdin) if self.stdout: read_set.append(self.stdout) stdout = [] @@ -1524,13 +1753,16 @@ input_offset = 0 while read_set or write_set: - rlist, wlist, xlist = select.select(read_set, write_set, []) + try: + rlist, wlist, xlist = select.select(read_set, write_set, []) + except select.error, e: + if e.args[0] == errno.EINTR: + continue + raise if self.stdin in wlist: - # When select has indicated that the file is writable, - # we can write up to PIPE_BUF bytes without risk - # blocking. POSIX defines PIPE_BUF >= 512 - bytes_written = os.write(self.stdin.fileno(), buffer(input, input_offset, 512)) + chunk = input[input_offset : input_offset + _PIPE_BUF] + bytes_written = os.write(self.stdin.fileno(), chunk) input_offset += bytes_written if input_offset >= len(input): self.stdin.close() @@ -1550,24 +1782,23 @@ read_set.remove(self.stderr) stderr.append(data) - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = ''.join(stdout) - if stderr is not None: - stderr = ''.join(stderr) + return (stdout, stderr) - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - self.wait() - return (stdout, stderr) + def send_signal(self, sig): + """Send a signal to the process + """ + os.kill(self.pid, sig) + + def terminate(self): + """Terminate the process with SIGTERM + """ + self.send_signal(signal.SIGTERM) + + def kill(self): + """Kill the process with SIGKILL + """ + self.send_signal(signal.SIGKILL) def _demo_posix(): -- Repository URL: http://hg.python.org/jython From jython-checkins at python.org Thu Mar 15 05:23:13 2012 From: jython-checkins at python.org (jim.baker) Date: Thu, 15 Mar 2012 05:23:13 +0100 Subject: [Jython-checkins] =?utf8?q?jython=3A_Add_itertools=2Ecombinations?= Message-ID: http://hg.python.org/jython/rev/1240d250d386 changeset: 6386:1240d250d386 parent: 6374:2538e8ea568f user: Jim Baker date: Wed Mar 14 16:23:22 2012 -0700 summary: Add itertools.combinations files: .idea/workspace.xml | 122 +++++++++++- src/org/python/modules/itertools.java | 136 ++++--------- 2 files changed, 158 insertions(+), 100 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,9 @@ - + + +

    S%jIwh)F7vcW&@6j#UOu)OOR>td5!hi{Y>*=Jc?4wfA$)p=&u( z({C9C2ZIbhfqwqoAjPo>TR9t*x(seHOAU)tGyKc+F{WWYGs-*x ztIY8iCA#c#qnAhS*0gi!Bgc&>M}tzUT!|UC z+iT2SQIo_7T?1>S1?$`r_wbkWTA+Z5x~SY4Au>>{m-wLjlT>?DO2}#=%pp9q!vQ^X zcmg`pB9kNZYC%W?kukE|APUqTOG+3pK_b&I^L2kzh%p0xe?Y)~ST&RsA2~Tl+^@*? zUV-5*Lz7JH(`}NuOFv2dW>qp8d%f+~9|ka26irteB3-8qy(3>~yHZB>rAexCg`Oho zi^a}ee;41x81vQw4Kn|mDTae&-N%vjj>v-}YvAzKgKbsvDA!cZu5Yn->vNM>i at u7> zeq--_kEODZ0EAgq93N{8Arw0{6enwQN at +}@Brw-f0wF1Wkv$gZfqdd`p=jZ&BFZ1I zKt3R4fr#zBs}}Tn$PcTnKI4*Icj*vfeEV-u9BEw8b3-H)p*aj-L}Z08um$Zx>8v>` zw7yrsC=|w#b at LSKS+eBlCvsNB$S(y#n%Pz ziExrQq{4OyDzxDvaMvj~X|IX!@;OnoD$zfu#8Jz{MfR6zgZa%O1_{zXapP*E3X068 zqP)}yuMcqM1SA`@-w}2mRJyK;12&^cR>UDVA`diV+LR#>#Ck&v>&?mpF28&-r<5Y& z5>AoK&!P6=mC&yTl#_zg+WFn#itt6FR)cCLOdV$_dmg240gDXBrUrcIJgC2!@5u;Y z%v8 at 5q8w13+;A at lBxi!N?g~cr%9pF;J?l*v=>8TBI$;jR at Rv0iByE#a3C|BIPTanq zq1P2_ZWXUW^WARrU5B*`W<2uAnYVjF;iP#0dw=T{&Bevm}~U at k-iU_Ud{3$h+r?!j1( z?Z?SU>_SMBOYz>?gKHu#4a+gRW?*o+>>+pT`cAtX6;Vi zUiXm$!15rN;v#`QJ(0wK5JTCh!zA+*{iEU$r3p*1f_Q$c%G6VJ(-4>79&Eq!vh_6I ztL?LS;R?C+Pc10wv at qJRMjI;|u;;KP80HSi>~XyH)c?Q}%;8if%|S7%Oh~bSr8Vc& zu7M}Bl3h~%PBSD+*GyUxOKOwrt-%JbI%5r9-I=c*k3fva)`^TyZM#tcv%7ut79A2WmjKqhw_`7hf7hXN`+SZG?&ZHa`Y^op;7lYM%EIovmgQf zuX5#5oCaFkc!sJ{UQ|pP%T!K<-v^#da-2qn4>FE}DW&Q5ryB1Vt+Vri8Hmht5Q at V~5R2ek>rN_D7^x6piO0DRN(-$^7^=$lY{nzlO+u at l=i&#*F zsOh3-qsd4?38H5Ka*%a9_AkUkOzVz#aFLx=Lri-4>8{Tadc%)VdBuiLc-uCx=gS_n z=U3UFou%35B{>WC4x|;(*KF=7bDNvu?$R#{o3XUbC=}MID_Lio z=(s#Ws#maCrVXG{CU;ldTUBh6L5#N~M1&$~{(Cs*B4R|mdSmeapoWz$z>ubp!N^s^ANE5EBL&DP*{LPZ)FZGrO(A zK5#a9)`pYFYtfAw5W>{=Gw#FUu at Q7ueDZA~6NZEt?JDfBGM<=2o*}GS{D0l$qm9IT>!=$ zcdY|t*;*Gj6`f&KpuE0*%PJR#R=h_m2Aq&4{rtDK5F=~}Se^gSMj+(>mCODQZs`82 zoy)g^c4tp at Gm!~6BNV!fZl~U`E;O{TTm*O#k^x}D9`X91QT9b-Z^p2=E~7w#FlO$X z>M*CJS`GJi%Y?gSA1muFC#&V0-_QLqZGbjkr0A#`2=h_$nK*GASQLv4bdWkWD~kno zk-?B-li3_IS-M+p*9~m`M~<*|6WvX9M%JZsx^ZdI=7-I8>m`Ne#8w-<`sx#eCT(kN zChg#Ko~%;oR&#dvluI18yGyP`SByWctd~u=uug-mnrx+s7GP+% z&e>A8Dk}sI%!xP4G~$$kD$;@}z_?b_cb&VE)0u6EX*X0QtWbk{4AL@*2VDh4r1Na$ z;N|h*MZqhwC>hOZ&j%1p=mi%m8+$Rg;;|gE7C3|mzgdR-&!`jZvRtH{yd$_Bl*1Am ztLsDYtR_b4nJe=CQB!TYxUg`Gza%jKghlD9gtuxtY?V*eSU#@22<3yhOhBu)+0hDl=MCbSr52J zCAkGH1O6MIgsO7bF7txKorDW9A!4L28CH)=Z#%TV0cD(oMYRpSkWHandWX#qcRBJ& zy+-}JEn%HkY9u* zlwQ_q`ji(5dGYMMgYO|k=I{mtfz=5p^(RT4f+710A&lr^9llZ zkLQ(Qn4fL(#Hz7LpakzK{<|Bf>4MAa{(%k7e_(^{f9;0=H6@#&cu66nC zKTbJMSkwYZkaznt7jee{usK}EVBSY- at pkdc~0WuQEd zFo^;^12N0h^4g&zSu9_l-qNDhVpI5C7+4=?GT$v$cfUVI(t#w5!WKd+i1J{E!dZ#0 z`X4uu24Sxfp%3Y1L#^p?huN}^L^1}vT0H{!86cRaT2BX+?n#nQ)(=&X7{Q&igSt)5 zqEY at tk0vRzRd+jWI7eNgq{NtGk5mL1&|s58OE!7=u=o7hoB}76Kd7`TdGz)hk+Qt* zHpnnJ5UPn)hAz~0SzpX`UPxft=nie at a4B|qEJih}u$yj{vlI#PceKh=Qe2NVQ=Q66 zOQfx1z#8H9Efk_fUR~=pU|Y{&oSco4X8x5ueHyEBF0xLwbg*BuSFuQhw4if%X^V)T zW3{NEZUpQTDU#+0s1L;@=oEo~V>Cvk$3o)DAoiMJ+DW-P+EbG4NTWZbmmKt at y-dvgVujU=?LI6@{grkVM!!K+^3qb|G}Anl^7PVe z$K7e2h{Yybrn#Eq))t}FPyT2(lxrpx`wjXYRH(|ZAwNcS5hrhwGU$|>g5Q)dd*|lN z+I2pwaT)c=AbMi>f|OfhnV)JjZLW%}>#NSFO)*63c2a zK%PI(J^V?1CQf)?$xQx75sGq)W+Mj=?S~Q0qLATi2!&N~aSUuXNQP(^pIC%q*t3 zA>2Y>ctM!dDMQ0O(G{3Qy8mU^PAanNPM>1n2m2`AdLe%M$&8RpNie9|-UtyZULX8w z#1H4gRs%vWeHd at i_++;@vDt~~of`z at Y@K2sAt+Lj*oT%)x)D3}L4KcAq`trpQvQp; z_W}`1$=}silHYcVGda&O__A&t7s8IOL|df( zL3XRu|A5E0%;LGU3{e# zV_ecv*J>HVO0TDHih8hjw;LXA$kK8Nt;Wr;{E1qxqV|^(E?M(CmgEOW=yM zO;J-l)q{pX!E0V2YV?6UoWnqKceP>Y5 at bp2%aO+CaDcz{Dpv(iF2 at 5XXDbYTqJ`8! zGp at l!rVk^if$VDLda>$RtGgD_*^Fhji-#%-zhRpQ#=`u=bpde#uFQ>&Sq3poErIfv zJD6Ev749|}-=ok#fy`dGD|R-v6YNEkyuO$?5PvIhtml4K`a%-*vz0>MLrr4ZIak}J z2fZl}q6v78E)#d>&(@2^3_g-v)_xC7iji7p==hAhymt%~^iIfK%v5&NJyIWtVBf!} zBX$lY9%}*gAL=NwyZ%q=IFA3S0OS-te^$Kt|9b!cowFFNLjVC`BmIvzU!{y)tfXDd zosC@`oc}8UE?v;nF at D@Eyt6W0r8tQb0|J3b;84wpj6%Sa;lvfJ4BSwWL; zekm%-y_DSi-FfaoOcV at Y1ZY)`*O!;1#cOriTBmkawV1yf6B52`-uxX<%;qmETawEt zN0n2*;eXw7nS0M2<8M3t`sw+^37FwR9ktm)9l*hZJ>*ijdw}HI!Yv#yvI(g`L$o%C zVp=&AAYkd9mPi&1AhW1LsHP5T)H%T=`{zT%qMJH)?MMERi3cH80ZZ{kd1EXDg zv5}LwBmK;H)f>pCdaDS^m!6kn-iM2rE@#U9or!^p^80tl$TR_)#KWK|g95r;wi%x? zIHHtNcPJRUb=Kg`3~p!;l~jALpm{6>OIqqgG+1JBTBa0sMYYtEE;Z at ylv$TYyQGLG zQ93hxnH4OwE~caF*xq;EKw)0)Z;|J{js$YomwdL-Sh0nPW9i6qI|{floS71ouC4R> zc10vka`*LCW@#Rbj~xC|Q$?A2jB0a9`m at ul`&=W=K|J at lziFYDB=G#ZpunLEErR<{ zn`{p#Po(a%$idp1G!~5n)wMcsYPqD_ytZ6iu;zyV7&RKk)A|A)W^o;n at re_d>uj>- z)q;$;aQCC>oF>)5zgqN=9B|T5FFMwhrK8_D)Cg#jk|Ed2t0w%|cM5i9AVxAhz2IJzZsN2(l1t~j zdgQY;z8x+Qx2_|%(o7?*g3DO>`lI at S>?R}Ue6}T<$~i4}us1H9cz{3 at kNZxdog&^b z4srwX}r#8Em2?=I|%$BJJ`AwR#mg3Ys>Su<{7tfq?}#BKmww=C>O=Iqgz++ z`#cs88+~)3rU=p(hCuBe$*42gVl9dRz0I^PiVX1*N%J0d#}^A%eJdaq zhCunAia_-o{zC1ZD^IBb at k5<2(ojX5fh&i`FSHDeujT-ouj+uCukHZ+GpqA?Su8pC zBQ|QcNKxd;Ih@}J9!+(f-)o at 8cTP+uhMRjztpQ#i#;@!^JV(Qc(;z89YcIA)^JX$D z8L93oH?jVtE0mm$CS{}oa?5dU&_IaW9DP0RD#c-^G*p03P2bDdBB$CX`5ai2Wsn;4 zE4BsQcUcyN2p%QNbOQcydo3YZHWvkLL;aD8kQs)A`3xq(YO at VSX}38v(cMWk87gu4 zYl|{%^rWR~(a+yr4=xpVbf?N%_Tyx^yRX!;@UIzrc$e*A#z=f>;>`@~5MA5?>odGD zml^D&6VKSPLJ2A{ZG|dm-2PoM3a*9urO6{!g#~!=Q(;?JFCXTD;4|FauG@~BJ_rg= zMCH&kn at aZGYW7y$vVwn4sDus6_g at N}HuYNe*sc`I3P at h7Q;Q-65}~gCNzXB~-*4i7 zMtB*B?sS;=LyfxaVVt`|=Dm`jj3{I26M(PfLt5JE)qHSkHh8U;N}XV at D}E=l?Q3jF zxZL8++GnxfgywC(B0Ik-43|(-nVBwFgUv1Bxu3#9}wRg=60qq1=e<4 at CP_kJOqI}2CSNq1;wkXz% zf1q*N`i~l1Gq%fqz>PJ}Iq7{A4c4Km`{mw!f_S*k)lpJsb+5`h;*>R{8nYV&Q5eI- znj8E%PA$j}!{g(W+`F1i4|EYYIYuM3@((Wh!l!NaH_Clc9FEv2{i*`d^gyq*C)8XV zdoIUx7$wiAKD60upS0IIMoH at qEHxfv;(t7*>rbaz$;r$_3_7K8OtszH4Y?GwTK$e@ zxTYO^a*NG4Q!mCsrl<&Ia$+Z-E%UO5p6TLYC=?g*NYKV#K&d at X(>=DXj_nIFm&{zp z`IX98lo~~`hJNsrUf<2_%AnM7roq>#?v=|FO!JcvT{@SGxL?nk-lHAPRIn7DVh~Qj zACT&eWb1~l?+vx-hTh|i<;%8vu)~D?tTyu19t^M|VMN#?3R2t8{e4d~20q5Oo7uV4 zQ-~MJC7pVV`0)VR`)P0J7wvBf8QD2CXP9IWXA0_7Dwq6diCirenXRW^CnYSZ4ub;_ z&1P0p0Dds&kkG#FD)$GcjWZZ-sdE9RQnfmqQZ(DVJ*6;o2rFtUP&N#+ebT6&PuJ9n z)6kCdPMeCuC*IliBh3(>pS7^S{{Vd^on&v4(NY(Af at +Iwom%yR21ouYBT^rQf>9Du zQ!6xY5L&P;suW&)!xaP1R!2;Kd0yrgGg%*bB4&mBwIL9PTcKW4>ZOVF1NrY+iC$xs zbq@>#WDNE{h9y~ZuYZrqTs8gpMIki)CS9tO3y|9KOHPfpfWnNodT3mOJKH8RdA*=H z(cI?kl$Df+`$m6s%& z(3GqiMx&V(&0m00XVmnwit=);cDarU=OVj8nfpnYM)|~j8XK|_v3%u{6_^>-UwI-Q zPw7QHzqPbf>FChvW)OXHGc4B;>}L<@)u?We@l4qy$7L? z5C2HW7VLk#`}7~bwElMyP1!H~BcdgqhQm%aXmTMh4zMgqb;x0m#PaOB$_Sw%<<7i} z#Ouk11+$nl!+{`@hCR?Xs$qQ2&{FLLlBwSKOqba$(%AoOUM2bqGhv7x*K4bly36#C zfkS?aRhiW(pSUi_QN@<^&tC%;_b;-0(tQ;k1(Vf71EMXzgZuKbC4}qSFsE{N?AD8D zARJMM;`DAzINL8K42Q*gsc~RJ at juj-xZ!$Xop~JazC>Zm#PKQ(Wg$m2iEy(9c(Ciy zZ)PM`?+YLYE!Z$TKIR&?XG0YyOWDJKa>qlZ5O%v!xl>(y|}{;UP^m~@B`sMT73FqYu;iqZk4wW8~?m2Q?L z>wjTZe)$e9V$!5H$QZ(lTjQovdAKUnv!_rSWj2)!Nd_wRP%kA-i9uR# zgRF#jHk8b52?#ODWmH3%j8wM7*ZeK=0kr!F*dl^=9-E;KfHt&~L}D^F-|t!7G$$bY zQQh*=`t$a9Y6zq^W at -Io!W=9>=hQqM-vx7{F9brH^PN$w9w!5{!ZL0oJ>U&Nlg1LF zzi&kvDsLdTKTRX43*(Nqg&E;XoDbugPH-OYHuI;ZvbEtyN at I&V at Tpa~#dXz%Y`|TE zI at z;2JFky+iQ#-DX7ntk->Sld&_;c;HcO at WZoaiS%Ai8J#!S=IB~f&A4mWKd16^=yA$G2 zdedLrs2*!N@`chQzDxiPc~{F%BMt!2+~~`PVzrGiGyA at lv+m^eAXRS+U6W+*WQm5oRd(();HLWzRFltU=C4)zly1 at nJJpm=b zAkNd3skANr`4$M>am3m9_5jpz?E+_aB)bFr9m&buv6z=9oDprAR}glTys$I2JuXEH z%WtB_%_fv4au|N%7jF@=@$sz!-)?N6fy+@%CNC9v*91o;yvdQx$(;{GlTs=%CA^fc z6jfDD?t5`I)W_~|9kb0{OBEQne*nb5K3xB+g7#>v6uti$fIxuuI}v~ zZLfk3OV=hQ*)z0P5YG71|N2cUUW23>6Xc&kf&a%Q_1}{6zf4ML^Pfo}@n&)`O6X)1 z6(8$Dg`9vmM7Rr(Rwx6sDQFGW$(K;QkER9Is)$V}AdG3I{Pz_f|gdwf9aBDZmw+LFc4TOW^-mv3WYI=ODn*9^u&Vz}8d;Y?Q%L{}J~LUQWH z at W6XaoHl={ve&h*D%eKe*{r$^@`hwfCIngL3SNTQfe&h~J`Y!#vmiB$LgE7?8S7?? zD^C*hO28Pa_ at 0G5{vg4O4+=10LiW%bj~*V@=N*SaM`Svo7I{1M?3|A`og{);U+)-H zuG(F*qHD0~bs at SaV=>($52_Y#@SfbZp#|5NbstgmCLyu89U*w*izYf^QTw8bETGS7)8CxmBEu(}?}0c% zJg76u4}yZG+G~gf=6me8GO9x>p2!t6brIm9558l07U-7s4EG>({0y@%zyoIE1zDWQ z<3^YK!2T)gdD_I!OraDXMb!TM52|otjx#zOmwJ94wg4i(OkjtALSWaa_&j9Q(nW5c zfo*HdU}@8$OY at rW?MXWQ#R?M$MF~hlrrfTN8?) zEl at YgXj0ca7*J0nrgaglR|c$4CpAV{(v}{zCus}jqGL2lRVTG3NU9Y}RTe*@TF at S6 z$>qXQeh7Kc#l&9diR8K{+cSE1C27mmvqdy-%7ym)L+!?gnF8J%PXT2!Y3zNa-aZv=`A!=($S7O2jHXggc+tJ&}6n6i|DkdZxkP zs}zw$I8TAAiL1z-a|BbIJ+gTB90W`jo1vZ;5%XRKY*YHbdd!eLOXQ&K~LJe`p=Pc>(X)un1DON(Z2T_iottry&B=^H at 3#>h4-`Uq=Z7N#Bz8w at 9h? z$|rW}?@nUxqku%kWa6(}*qp+<+=wT7z`^N+Vd)bD$R7-D7!tgbG`16U7|{y1VOC})>3g8OFIkbrKy>@M|q zldAE|QOga?B9eUd5WLaGF`S#IV~#pW9j#1yT)x)T)k`JgVE;%Z3=4`t9!3^f?_j$? z`XksTBC8~HJ+W4LKS~AmNY#%|yzF0ko>HW!(p8mXbP&Q(*!}SFLl4eMZ2qFX~IOwDGv>}CUu+m^l8FqCIC~YU{8z<;k0%V zM)y=!W~h?6Em6ax1JjdrynH?^-ea+^=(yGO5cMEA0-)^N#n9W0&XXYAeh-(WJ_EeL~!O2xoi}_^Otg zVuSsKkdqbkAobp=_U4-Uc9ZRjj*?{fOI4Pp8gpy&cn1lA{H2rHz6O`-$bY at xnky{1 z4X1>zyf{<}5Dh!?Xjf-||)32N&@lconrA>G at guY7i%gXnr% z^f3W~HcDD`oed368Jsv4ZP7$cHZ~774=(#vwof)TZB47a#pUP;8974Dn%RGK zbdTN|o>N~ph`AzUSneINOGqNp_LPfQxD at c9P3;5fUo5tFXgl5uhiF9?8`6qwk zAxXaBzu9cZ+RKZMNyyuHU^}&v(#*&zxmM6Xp>f)v+sXf|kfpmPdTr4hR2p7ZC|_o{ zABVkevMGuUCWgz>)cUEYK{}t at K2+ZZzn^t_Is^zY z_nE^Jn3Ez0QY35RH6&g(BcJR3#ULjsVVc14a(lX+8ly{Avz-Z{QsBG at O%=+*G2T?wSl4E(R7{(xnjMLIP==Yd4#B^~WY+skIFNTDqIBUEQ04|t#zt29!QxT{pECvVzK7QH{6z8LO2NLxCA?U`c4c8@ zdI3EXhmi&`x|W?h)Rf2j!H`*IE&r1E<*-cHxQ>{apQGV7mtM_AK>kY|VLDNQg5^2! zc7!NQ at T9qnJ3P~2Us&EX2YNUZ2MPJ-P@&+enySe4qUxKOsH45y2P`_9?}4mtv*Qpv^T z<4RY1W*h0v4AUl}T4SftuOh&KFAF2XW{tRLhv zy>7X_;4(ApDQ$H4?DS0#M+Ou~QYOB4f(B0DgGCMIj$!o)-^Acsj$470R7d>tHeCPC zQ3c`NT#HVh!$5FFRlgY)5yX(&TcmQEuX2r8?zcA3fUBalHxp{Dv>9;PuD#8rsw+!h z*Ns(ZsST#E>BS-qTW)w{?K1}3&LJH%ASDy2g at xs0`>(s`=s-NJo1T3R#DQ%s3|)rW zCr58 at cmJwrUfN8w@5AV}FFGHV(OIL6E|vY@;@4^B==gHpo%mb2zf%(gDw6$;1PjxA ze1KU`*wY~)lvy=Gwo%N*^@!Cz!b z**tu-FFrRb!e zWz9DtCRy}T8KSE;B#s8e=!Nk6-6Z$owd!T5fv;TdQXAQX>j|_iG7dS~P@&+PZ&6kG zK$F`PW!4M at oav|=XbWzUr8Pn0pi at xA?gUFTp~~P2d^P>mo7rfga{yh*>EMT$upyYbMAZppq3@ zcog}>Oi0!_D|jLd3n|$&@e3Oa;4Y(!*PtSj8*a<3S#Sy`4v(0UqfLq{v}HX^lGt+$ zk5Mc0*4!gx;%HRZ;#H^~L{xG}{U13wSI)uq4ZvELZU81rPOtyz`9qR4^gp6f}sf6-Mx6La?cs;FPICdUKsO#`EbswFmL}3}}W%nK-R! zTQbU-JeunxHU?662I!PeJTL7>Uy-Zi(6duMfFxh*e<-_RZPqmSHpo)?ed_52+ zZ_}_>TuEI`j*Tx(Q^@vqsVAq_)lJ}=A(lC!$R>6r at l9Xxspy6ftVrSgSN6K%1L)>Y z&@xS^y(tQR6jdhTn9w+jCJZsG-L?y<3;zT>bmvteJF9e~Y={HZE_ z#u5jkwFtn8nH)Sf7=}_n5qi*g!W;tIH;y0F3Fr(=fX~-=3r~|!`Nnmytap}0b@>b^ zoM2DDPa%uT=aq(*ZT^NK^*@k#fH&tn%0zoZSLsQ%exP`;q2>;T at dxP^OU_cvAl|K+ zaEm+k0PIZWT|{+rs(g1TmrZ=k*@|O5_^43FtuCI*syvLj&7az;V24=JpylZ{yjA)4 zx1s)-*Ly<#d!w)})I!;;`W~o%MBJDqR6=p`=A9i_u at m$$7h? z*h!rhEi4n>?m=qkR#U>cFZ-BYL-zQXG0>v at oj`tDQr6TYlr7#~CvN^Tnwv2l>wC%{ zW at odWY0knoEL!j$mE^&1FI|q=Ftm$RWQqy#i9p1P#_}ag)Euwz6GOyGp5b#EH*rKB zp-3${_KC^aoXqy}hxZ(0j0RiQ7Tfor^Ixt((@OtQ76J%|DV*HyjJ&Snza^p+qm$t at XLxy*)2h zNjJrmBbdVsb+gv!gP0vp?oq9Wsb}g_S8FgI(Z>F<&O@<(@AXEA`8#K}lxbL7)`++4 zUc$`CNyquT at ukQ2*|3&LijDDQ z8NG|ol5q zPy8BY*kc$hqi4H2WrBQ?Q4>Sw5V!;U6q)8grvXGu4k2D_tjxS?!8#0t2tJ-@?z|_I z&xY;2m4J7%vg&HJxh*Lflb-C5N`df`aWDDMG8!}HQYyL4c9Ofk$xL|nJ7L-j+m{;B z%#D8MtKd+WzwkBmTj%_%^+PZX&YK+!^S~3RApM`q=g)x&)s8gPKb4sYqEdrq`=0hP znzD#rpw~Y4ngYiZQe)aoWFxg;DG^$(e?DpPK at 4w*eZY5}MJ3I+tQvcAu}$X{x2g^y z2tJ%3y)vJT92;!C7Wr9jE{JR5eCXNkD!|uo+1V2ASE)-dpw>a16wsti}H%X>30gXCy?#(?^!+^MyaMq z5ym$c4`KD6BNqHS7;FVpugrweNlq05YB%KK`i`Z9L>8&iv^j3I!$-cjr3b?k%-aF){ysta<@iqQr zKs*UiiK&eS2|G6+Ri4>0lv7QxVw~5~zS_;6=>&g22)x2-)FWsX$WfweXyq{LF~YQj5j1GGqr1ya4>Gg!eE9#avpS!#j>`02ZO*(%l7+G*Y8do`VJk*_sk66qsJ32=!W^z8;SwQpF1mpJz+wl;=qdtlOp9O~K#x~PKIa10-L0XV zx>_(CMSidFOV6%Xky0P`A_I}x?QZo9_A%hP2!z6%1Hweu-K%o|S5k(_8J}2mW+#05qJz3?^9y_yt5StCf z>g?Ha{Wl!mnk^f_Auii$oR|71rS- z&=Fal0K`d`t}9qk!-G#;qm5Yq4kUskrT1PDLp7o{YRO-JNdr*=W5u#(|IC3ZzOfR9 zQbb3psmnkw7})o`I3YO#I4T-Xm=N5Md_>_51xhZc8Wj1i6DYXLzURD at IC_yWdflfej7!-tsXXhmABy7uHoA1_Upgh{+#Bg_xV2 zwS`{o8>W>lr|XP^4nSJ>mf(L_-Ey{f+9NA&+Hsn)*;33}ZOU5+c%CiOJ4t6(b|6tE z8DIx1n4+Eri}=#Cv&?QQT#q;(uCj+A`|20_t(PTp5<-`jdB8VmAmzR^ZcX9iXBuxW zTs=xT0iO#NbnTkcN{pOu>7Wdpa@)zb8;t}D57~4CwZR%D9+EwaJUc#V3k^ypkaFIS zgwhF>*&ed7LlEr at E&{L=E$)xd-;jWm!@pQ%L$`Jc%R7O;-3fT^fTR5Q`#4 at n zl>0*&K)>N!?l8=QdI#F?*wsM^{4u_PH}{R&5cvGL_ffs#fq7;~IcAJsAsYK>$`or0 zC3}XM_Vmh{O64uG%gQu<<1EvsW)D8Bb0|+qlqD&x%d=&pw09}vIYMd2HIBV_vlV(%x=gZ%lGR;FN|>I#iJHox1*qL z3f7H>MwL6*BP+cksdQH$WV>Nc&U4$aL$U7*lubnkH6ji+g(k at 7*cM#j3#{A7zhEV$ z8bK$=OUmrVX6zy|zmVnYS{3AQ`~9gA^bRBwepr0jN({Q&Ld9AzklDHFsMZo$Q``@s zru7KA*4m0c?Fm^^ok=A6X5Fxfbtk5sd|Ge?k?__=O4Y4y&*4Ejri;z4zrPWz9EbZr zk4YG})8sJEXt(z$k!;i$Vn2dFxxcdsxiL+%eA!gM{)9E9(n(sH at -W@$4$T~mVBP&p ztHCK-g at Wo5;`1>8?Tg{(-d&WYLy&s$5|An!r88V};(YFr4@(hkxLTLJwxWLG{^cV2 zrBm?DYR$f~knTX+i69Jbv`Qju3)MJVH%mM;Yhcu at 1M2SFw#=4r)xd)T89j$VUcg6?6=5q|at05-gzwrZaBaX&_(O)@ z8OTi}J9hADL;i^m%HOhzC6dWnp8P)+gRH>#}5m-7$c6g$$Aw%@VuFX=c%sX$`UtQPS zzRk$$GMyN{-o_xh=Rrl3A?b<&YmqRWvche0(PPXz$Du1~h3td8hqvFSn0by*>8SEI zVw8|;ph8PR0WNJi2kKBzH(?oib!-Kawa{Yu{)KaK4MH!39YdzL!4NS69Jq)MoCVt@ zbbS9JRse5hJXiBnLH3CJr}S1#ZUqfF8Foe`2WEHXZ_p^Zr72Qo4KA?xdklsbC{JbQ z75^!c1vQcRL`Wcq-%8oqvn$nmqj4rMJ86?HN}k99_MTEPNQzHsa} zRP1QJ#5;>Ci7Q<9C{-5Ii>wJ(9FzK)+=GYQnDa6`0E at RdiE;hJrMY9wfQJmoFK~x2 zXJ%J8>j?)`KNNF{9Jc%kgD>1D`)&_ys<)zI5B$S*dBkL_mkdSvA&o_6vJmvFq}AR)dFcmeu&e>{V{N> z3|&8Du5clD3`zUDC2lFi!Hz+DhZcbP{}$0 z78NE0?`Y~N=0LuNhUwdLoZOy#{RORb#hgLF`N#dx#KC)B1wyc9(E zRg at l`opx>;sE_M?3(uE%iS at i>?~@62{Yb1%kG+xp8E}b8P(UW6h9)oE@`-SL3y>ru zub@>B)rMhOHLX8D6Xo|xh5=d0>}pD&8aKv9lWHI*9p*4%ku}3~*uLM;ki^_bPb7K5 zXGr90c(Zi^a;|>3uIdnCuCC!ON}_wJ{tP8wxP^;X*D=S=R)V8hhpcPdY<+ffk=D|viLQFHot-x%P?-^dQ~j4__JnHyy4Zy zm5IM|&l>td{!K{XT>Rd+`K1gu-l^Yp-XcjalOe69p zuNTFJTB(srfSw?YvI;Qn=Z5YP)0<{6!~?XK5X_0 at fxxjy1c3EM#JsjE#g%W7i=ssZVo>-EckN;sFgK)i*v!! z`I~xzKq;)NKGUYY9L>^QJk34lo z43yYw%BPVKWtmjA4LTOZPKAzI;TAo_!X_O3t{1Gb1wPotCY*fTPH1%VR)IoSnkMts z{@@M#nE*5>H=Yg41bA at Ke(@O)NV-3Z^Qu2VnaON{f;LyBS2jJQ9_zDh+UxpwADpe{ z7Ii6K0bh#lmBx3 at 9iH$Vo#GLk%`OnldJa^@DYuyTSGDo+y at DwZ<4Lka#m-aZ?CO6| z*_PM9_3-dR_b!DZe(5DM#R_ at 35HrUoXOd|jjVNv%E at 53d^gwZr*~Mm0w2Ifg6LN60 zewf>~Fj?FCrjOQ4&ahp9I?s7Vt-0Zho1sA_xk6Fj+6+2XZ%!?)zLryQ_1<=`H63q&D%n zYj|SoF23)>UsHOO;RW_uj;2 at e4mviOY1F^q(hSyN3nPz%wwuofu$+tg)rM+ThvAqF$L4Q#Fn(R+hd%+q_uio`GDtO`9V z^qac;+fD at m)0WQtA<}HgUootET*AaXz}HzZPPP6{7%zE+n^t+7!Npu9ZgA3_ug%Kc z4%UhUD&RY-+ at gB0b+saq!WZ{^9|C$mMu#(F?q1j_^g{8u`(YTP_+Gu}C_%l8lbQe!`jb%@Kb$yWR% z#{*;8m<}Ebx zwue^pG(GW5&FuuLU&uS6?D8jHL7lODp{h4x^^;$W+AuF&^|x&{==UYB)$9{r5O^xO zVPh?B`wgz$%J^;vH#Z>fYF<2*3;74cHbSE;d=1#H?S9LAa6g(8)KhKru6bP>2`4|y z(Y*1hg<9G}&F4l>t}k98Vroqp`3|j7K9z$1p;wk!c1yXWe3c z-7>xJT0Q;zQp*eu*^saOVfX_W6?g(zNfc~+>IJAh%DvF<)4|;c?PTr=b>Qhc(d^k5 z&K|gWOJY16y0`vXqkyQe86zX+o&rIexE}Lqt0lOR0}Iu2LkO4 at wtpkHAB6j_wGP?` zkAu5K1wGXB#8jXCLi*nHF62UZKeogRwy-6fKc{0nV9bXU`(AkiELL(dXtxc1ct#oo z;2*;9J2;W&OJWE`#Ff-vgfd_D3nvfvzfKD z{+BQ_bV^2vV?gZ*ZLr^|%$K!il}jHnh&;|A^&3Z%OJys@?~M0$s<{#aAgx&1H?mJ( z_Nd?IfYWa0AGW^k?i%gu$R`t at L6qH@cr={FwG*$$eSjP4Yo{FLT=~5W2=Mki8e;lM z%=sD-a{kzq;^<@-zR40tY8_k1eit2ec$xKh&-w^tX2joSneLYBp8!e%d!OaQvS`F+ zqQz!p{H6aYkGZG?j`G5bc9ag9|Ak9CtO*9cS+85-gnxr+h&=AkydMH? zUtgsE8zp4``+c3uoB@*SbzT^vW at z=U5E4V$kLKTrt7b9vz7P^kbP&&L_Ckc at 8)g#UwFg&0Fw;^|L{Wx$9+#>JlNy?ogXJU{J(X9{a}f)Sd3AEy8W~Z(!22) za~ES1xtKzD0=1zFgEf~;dbmida&$3tvaxiTiJTJ zG-;Fvu_NukXEf|yp|!BRD!>yDZR>c>JCcAxvxyD!#x`{P1|H&jKQ5T~jwq#qA*D8c z-pSSho9=jzdJOKft0&1SE4?;yCE)>%CN=gIHY)mhk7gMIW!($<;zD$3*|y2iU(S0i zp0E~NF at Ns@!GT&{`5T1t(CB5=nZurP9w at Z`JSGp!S_pd0I>C<^R5P9k7!U%Mh6t^! zfX+OOmEiDRAp9gQ40f1OOSCYBS2yymbYeC+jkz16yAP|ERXxh24645P+@!ALuxFp3hI%T9jN*T9P z76X=vz)<kx;aK8cok$hFKJG;xOsrs; zz``LFGPcNL8v!3sF^BPi%*PVuNP^u%1-P?7ht+>hH?W4)SIq+n*4ANYIUa;z4Jm*) zzzO0?fH`0a@}z?ewFz=C#;{@$PV`YF<0Nzkt%74_f{uRd4=K36OQ^e{_B at dCIDyC> z;6JTX7~DX+BN*vwZW%R-tRAcZ$8(d}Z!W(2~@Io1E zW%vXR;TIv~AGjM8zoo$ZMjdQr{KQ(&3E7`z`~(l_9s1NWctr^59l2x2?1|jBtN-MM z^9|kq!1VFkzh(RcP5JpX$ZzmU6yiH_N00f9Hu)2>zsvabE99r|?uX%%BIIY_&gl0K z*q{;{#YXaB)HEIlBx4e;EV+^S;9N|;QBNWjCf6yqK~__Uj9XDZ-+81pbVz5B&x=-( zTl*3{9)SObG?$cur!;iIuw1bwLyPi_A&a^7|MN=hr(tzU9taQ+HUtn5{eL_jrexy$ z|J-PePLi@)6hIpN(JFO0z{bYV#HX!IXz>u(Qrs!0&KFuP`^DQt9gu0HT23=slOjh7TD-fUx5>5iihib^?vfV{mHP+eK*x37X6_w5J>-z~(7p4e<4TCM}AO%ne z3;>63t)~p-c2rLo)ZyGxa?l$F4f$1n$-)E+mmYDwI-PO5s%@K~@t1e8hDmW2nicb)>-6fKjjh#2#FgQ06F#y4vb<$J5%5VOV09NKxMZNK(XZ( zdh-5k0%hGO%*un+sj*|!Mj?S{DwXVNvtR?f>xKa7&zfsHT2uT|=y{BGjxr8$oweX! zE(x*ChfM$JRovF?sxml$hh%6BGuMov?yzu(VHbH)p<}db6{)H8D4O=N1N^EB&p=d+ z2G0s(s7HwQ6 at rotgl@RO$q$_5MbU_eQ5uf&i4O)kVK0MU at nQp|arx6+a$g*|6}<2h zXp`4IxB54fu%1P6U!Fsdq5hRombK2t5Lc)~2EDTfog^RKK2toYQ})ax?-xZ<>YJUu zn7G$@egs0rj at YvB1uCy_8acr-|I{nhG!r at 1cqr!gmawf$T%z}paS}bN6N5uh>MI-h zJ%p*yfvNg(5-B=D{tNMLb9~~cAd#Xbdwl+vk~?+4tmqvE(H7MH_^v!kZk+rdz>ZrO zW_;K at g`o)XlV~XMs at lgB4Q%=Q_DgFcc zKVkn`v4?Q|2YWR5e+>J753)J^FW57STnx3vVc=s^#5R*ofE^?~aFJDn{40L_qdfww zHM)MG8n at FCx9EYE!+!rC at L{0hbCQJjz_0RQ8lw`AWo2j{Zl*82z3JJ_kEge at yFe>< zl>T6j)XGO_TMEAb3IN~^TuDdu#6e#0OPCvGX;06BL at Gw(i;%??t(e6I>FlW%qe}?( z7wPUB%&iK^M(Ov6y5QFSx(xV6qE-Dcm25Tg!QhU%>CdX-H4X?yp%*#>+NrFC!B9h)Tf2vBWp_mWB8 zQL=xa at 1EAS?>q+;uLf{fAafU(IMrS%ro1Tu(4fgosz`R?C^M#)F;V9|Hu&xkyno1w znQ%7`2TDk0O+1kzH)*{)+wHJ*H6+tWv^eUA7);d3-Mo>TeLc#8MyF#=9S1A9QUIF! zYhQ*-c%_%vCna^CmDnu#lEr8+kg+Bt0V8t95>t*tUBmA))F^ zas4pDbWhJrzdvvF;iSw8%j$e`y(uN1?#rI=>Wvk1(yJ`~lxfPVjcteo`S at kfe*#Ss zkUT_pQ6}^x0GGFl$5%^aiZ`Yea`Ga#|9)!=s1!+`}6R9<@ zhMctC9?S&yZCflnw<1#Q6VX%;o=8>||9PI~)KiZ=#Nw zja#PsCOM0YpZ>xMfy_#=UK4_U0 at u)xgcfqto=tbu7VV3zdM!z?FUYKT7izd9nSz#b zG9<`TaB5EzKZJvs+x5o1Bx?hY)9FmM(`>pY??a<60WYvUz8)z<42?w5T~C0Ogt)qL zoiiAtSK5$@S5n at 7hq_PJ5R)yGo&+3?;j0K-CCmg2p9$vkje2!E$e{MHbH<--hYR?c z#C2!uZI&r+?OKkKd3AKt_yY{u&4(1s8PgEXxN4 at c$(hwGgD%5$ufpvr2e-*G)-k6k z#479>vXy)#^dQUwvP~y9_V&@d6r0S>N%+F$gC=Hvk)8G#3qzjuTobp>#PbCtfk-W@ z;c808(Z=@!S;HO8kFGu9`^v(mJo5|vi?+H1v}G~bj500jNZ>q_*s zp9cl4H)ZbmT8_bbkvB1l2s>P7&2H89af#ZL&u|~ELnf$Jli(Xg0n=R06Fh~gb*KS# zf-oILgVa#q#LYuVBgw>KLre1!FdVf9yxRI>Ke0DO8zQ>Dgx{YjNsD3`(8_1J zSrryhvSlyrAj;|TW<{RmmEA2z&6_;VH(LM at tupvu;!9EJtDXfSqlyI;9Jo|Rcfiyf zw^ckp23UkB%g at fIhfg3Nzmt)91yh9dD#*`t$2I$*y#0*nerVKf2}u50kQpS5C`9S$UFg`;QBzr at es8%lcyL0>bLH0?4}^Y&X at m&?5w#_<&Wu3F>} zUK+6nH;cco&GY;HM!Jy>i21#q$|jYwR}_anbV|h+#wDikWb0<~Ek4gQ9c-Qs$#EVD z$8xsr1aV-nOVLX at q5OunAj9=ClujEV&V-V8aj72b~l9KqD;D4%wEygyX>pz9C#{dEn z{LfTE#=zFaz*@<~(Zaym;*Wu|g`KUuqn-Qz9l0G=5BEe_{q<8#ukmtl_||to?yo<| z79k7=i~~txO{_IG^e|5j?@UYo63}F&N>gXC7!*VrSH#Y{z-F-#GDky}FFw~K^QXk( zPwtPCTj=&#j(a4|pD^@81JPo||C}p8h=v zh*M0S;XMn8Sq6^TJ&-^%ES}Ll4+w%<0SZ0^|LoVIR8ctw_k?~<2suXgjDBXg8RoXW zJq?Iil|7|b7OOj~9KPATMl_c0u{|faeG0AeMPuKDpb3-3wV4rS&ASIfLs_j8C*3ZRW-!=^7>_sB7s0I?!t7- zTSh6?QJHB)k_g*5S)9ka?)tP0X)b~;XcJfM<&qLw=$u6!c^T+TSZq at sDWL@|)q-<; ztSfA+NlR?zC-n)^&f$}R3o2GwJ~)Xow&ftfj?m_!;)~yH42%22MMKV^S{pa63q{)s z#ZwE06zWSOLLmh8&}l5Tl!?+E&3UBUA_Ht#v}-pZGbfrl}ZuCbhWZOn#4P< zRuMc-sV-I>rq6Q;rWn6=mYK-&NzJ7b(3cHl)JV#Qf-GYwQ5*)KGVP`FnZ=zTH4J5} zP5b`Sv0uornpPzBTSt6R(b}3#otzA$^W-MPM3@=+%5wGuk`8G#@H%sKHW=1CTd5LE~gJie&7^1wExF4gV at 3wMId==m=_VB_s~Fw+)OE0UPHBI}BHqd{$EjioIonDZ6l zp~*TSvRHw)O&BMq73me;aqDs7{7`1(DGyJ$0gC$N&KCzc4YW_&GD7wZEH%t2s8 z5CT!ZH3}&Z7$OjAGE855#DIsAB;psAMbx-ECU#&HTQnLiT5rO7OeX;Z`|%HICED98Q&aV-5}k{#wxX|=PcyR^g4w| z2QSw*N##gxLOA|R+>UgOB7ZO$+oMXnP~ISS3Z?xoCofU62sPtRl(hxEeRs=(2F~(K z+&CgSoc8Hh`^hDZy39C^>>tb-nuX#QGO*0K at a(ucSQYiakGjkePaxEMSXOO4bL~O0 zk(=^~xxaiLp8V5 at J1nIeMvK8&K7HrqP{(Ho^H~@1(WMDVgNTb+6^YTM#7Tp(hYmF; z?Qg<&@;?lGB8Ot;&i-eSWw%eQy28Jj4K2x*B+HW(9_49DPl{Cqs}nM$ZI)e>y9Hq* z9fI`1najT at ZqSZ7Bp*k9D|um}y!>cz{Td{t%BOpG{r%U5x^$0)mAXdbxk%$cPxzJO z`?Bn%wM602PO5NaHz(xoLvo?)kv*kE;nwb{XnxP`sbv1_uS!Y%#x7y${L$ZP$-&dV zD%*V-Qe{snI>Q at k`|)&zOKQm at T)nki(a*3SYr-)>WrE>l!D>*-;ap4Me_lmE*&;-( z(JJSuGvhWX4;9q)X4bZGIH~;?Ph9dPGGLScpJ5M9=MhmCB573SL6yTC0{f*le*}5cuwQMXlv7>i%RqMAa1NqE>QkL?92H-_rbqw z7z1DKCy$PCHC^X6)19}u*WWteKn|;GPq#XA10}3S*y`bJ3b3*ZzqHKHYdk;H2vSo>ZycgW{9ANT&OpgWsg=8(XSKnhrkODTB^q(ZMtQyIhA)(&6GG*<;v0q;J5f>X-!21OLEW)1K*`W=v zrjMLH=AGp^^FH%_*&h0STf6lGXpad(26NyGQAt*kZ(!vg@`S{4$5+EEyT at idsV51u z;kX(vDBM>9&7*KH-$xiaNv(IWRSw=+q;V>19`3(kf<~ojIupdH!c=d}GIH@(F zfe>2mAVMdd%3K*=p{cSB$ELwb%~)!0rE at fiT61pFP0r#T>QB{W>p0ppX5LFuFz{mO z)0v=)cWBJd>TK$#PvIF;J_?Ov)iDT1tHBh|p}Z_rcf(RKuzRc&NQ^F1KS*Y|1~%B< zSkrf$aOktVIQE)vwH8K{ir32xk7#WhKBV8Imql87)geo-Hn zIVY&sA&+lEJojh6T!v?DN+tOHK~k}Gza{2(z&v&+*2V*%-=tG#%A*KL(*>s%>;*IT zb-FF1HlJ98Kt*S#0 at AaG$$5yw+!|4mqg*5?-s-+755TOOBr!zAiI5C4Nfr%g9 at T4L zK^-l5&xCc^fOA>+a$Y!*MzVsKaBkoj^p}RF3{sqO$g$5 at v3Ltvp(tEXYgDMf$$G4s zV=zrr5Ij+13v|%unPg1prFad?F7cQ{WYDB1`6SGcdT=|vl!64}q{8}uMIAyjifSNR z7MMffy5SsZjZf$SIb(%zA}(FC_|)VkGR>5`B%L8S*2Gf_i*4t2xaSrhit4R%rZS;1 z56_1!zd_AQ&RFwXR_G1uW3C8GeTg9Ocvhq{tz at 2-PY&r^Sb~E;ilHqxHa$CbFYa at ndwqZA zO#Ii*y-eU4-q|~ZkI-q4Aj`=Xe~Ce>-RDrNZ1UY+*A?WMR@!Llm8}S68ZncZnfif# zB&hnh2aF~so8l5BY>Y%TJi0*ApZ%@yK;}P9MC6c{j3|o{F<}T33R~WDpb+g;PuNq(zr4LXWz`z4Lxu?j> z5 at JFSKFpm;q&^l#AsDqygzD0HBq{Jfs*5X;Pi*Yv58nx)OC~BOENq#Jhuv9pN3_W< z#KT&|o7pX8fW$0)%JPqQHJ9chz&oOL_91P4&drngFXwe0bIwDo{{~X;|Ih)1QV$>h z157#6rQ;;yB8c}5*P-|e7Qk%|pwx(6>u?W0?3JpGgfY+SOYG=&wu-6aawh z-zBxbw*Q%~{pW-K(rVNBn}`CBkkndg%4*>V9Y}$pR=t$SQ$T21Dd}h-Y5Y6)j%;hx zl13w*@OM;%p8!(C!Y at C6zDaj8Edu_QQn)6kv)OE?+YB$W{}{5x4M_uOKTgjX*-CL8a?C_+Z^_k>Zg zif$=bH}u^!GQ;$uq8&5w*6uoz>|2g0?kIn_2KUyypx at GKW_;A@!e)z8X8=OYl8BY7 z6UqlY4v&WTj*%2pSxgia571SmfCmz(#yod8;9c8wdan${yOG8;55jAtAA4wEh1Qe; z0w{$%=UkBCi1HA#@kaXgNR_|pD#j#W-z$AFWcG1zoadsvwYc3(v?G;TRABJslr|Qj zv`?-g>(5+d)Ys_~Mpcl&YSYt2X8MhgvfKq{SQQM=RlkJ-1872LAb{wnb0YY93 at d|) z1Vc~5qj1)`h%Pl3X?pJDh+UvcNHJ>DL>;N))WS&K6N=Br7*nP$fB=}4SenB|sT-g8 z9gTa6T>?+7O|C(z8+`*SCe?^}ll}@!pJWyUj`{HAS}SYq z_U0wSCY5{je`6&==h52xMsq*~DGABi?2O`U@)^xRZ`>}5Cz=7i7-B>w#US7eJ-QZro%2Gdi6LAp$MI0RSG+0021t-_ZGYY^rT}ZL1>uQ0(el z*QT)Rk~thQ+aP9->TYe2+AQjKfsIL2TuKREt+NpLcdM>RHZKxdAaU_S*>oVAPqk=k z+Jb84(-4!iNa-vNzT7LGk3n%i0CD#d{Q%GtRYaZ*$#G^fnVqurWiXvxZTQ-i$7 at K`q0MA9YGP|$`M7-H5^ZUx(DLPJseT^dWYcY zos6vsdlSW&a%UFC**%51`KS)R2z&Fz78xweJ9*?z#=L9#04X9_ z3Zz{(N=S7QQD5X?Uu0$f#>y|rq8U*(v5{n;S(%@M#zVv3rqe%)FVJeO-co8*RXw!- z0RfEgRZ+VJ1kAy4!QtSIO;NFtW%%GM0~rpD<_KJ6uKYde-oaj#p7c;Hniw5qAxR4U zbPZwj+--@#Xl5(DI>n2#SYJzZ8c(W~Du@|I6ugPsD##GkM9T`;CKe^o-zu3ORpK_V z+k^`Z_9>sZ1@>R)NncIyZ%Ol1+LUvOTf!D7kxcS&a%|-kwkG__dlz_yLrN z^YojT56Cr}_Oew|xl~!Iq!44-Whm8V(^h$i3kM2{V*~AUbSiUnWTX^4#~+D>zaz1+ z#uB+amoAI+pp3q!goS}k_jrc;cgb~YR{H*MZRNt=$q9vzAwgYox4$R*jX0E!BdcO~ zQ0A$bK0f+YeNDP9Hw&YcIVNZ-7A@)&t5wVd2_t&ZG<+;g%QU!o6#*$Xkt}{ui?>&k z0s_dht5AhB;B{SAPb6WHW;EB^0g$1gB2Fzyu0$2*OodaU%#xPX3OR*McY$y)qr at Syke!Gp?1VO;*~a6r40jp`h0C7V)W2ph^_u ztpZ%MOa-V?nNZH-`MLdD^=-950~%ATC*9X?<(g7AH=4km0A+@{O2%K(6E=Qk&Wn?J z@~7ZzB(1W(vee{njJFPcO-_!-iV{V< zQLiDvXaZ at aLznGf&3MQFt{;iP2;I~N%%sHJ{(6$HD6vwn zI4>gl^CWX}G+P`dm{7_ATbD8oQElgo&9R^JILz9iK&~~KVagvZkn;Sj at 1iAEek~8x z))X9^#1Y#ZD_oW&VcQNvr&vM$7w>B&D>p-IT at vzBcoid+q|znk z+Qghk+XLlZq%1;o((Jz$d&RwiI_(9ROe++Dx`c*r!)GRYwfkB^pEXUyY?c3T2M|NX zDX8q~@R3xh8%!qcQjA)(Qu>q7=+J6Bf~`nIcD_g?b&xW|gdI1Q+zsFn+d1ws(|YLG zdx_0JxVH02{$bAyTg65En%>t at Tx`8e;$z#<26p0}HXITyxiJTJVpJ?jedq?*9PZt`ACVtTA3otA+q=Fl{^ zURZ`icE!{*ajCaysl}83QRt3_aTXvO=S^oCzDyX^gGezG9Voi_Qx5ApH1nYlGbH2u zd6(T2hJHrtZ1UiBY4PCUEM!Co8BgR`1H at qGU*+d=M0*WgKP{UK0u_7q03y-Us z`1XKlf%|IQvKGLqEIrtiNi75#-ta)Nnfx%OS=6DFmoWbh_mqxyvsoCwTw}^vFaA9O ziNKkoiXYUa-4FbJ z3Z+|i{g+3oCCJ-iD at rFOUKU}z1{FfF6F(j2X_^)Qo}Ti8o|=g3z3$tV9jc?F9n=!}wK z1JLlcr&8MgZIyqt9VPP-SHeYu2zAy<5BK{OF8J2P at ZR+B0~0&<3Aer~=@?3OiP;tLWIMVfSMp4>|4ARf zTUujD?8_AY`j?skBjSy6I4}T!Da5}$bo4*Ae=i*TV+5nB<+P*<{|(EaN{vh_Ax=Oe z;jeuaEWABALrRklKpLB6p*VM305>*SK@?vSO-pje_loBnN&!7h&;6LBA9|5%q;^Ei z7`|?Fy>QdkwRf{Y^mdfib_=L2C^H7Ly=*TP7HbI0k?g!ZTG;(rc%X)Zd1Fa#)m~;0 zao~>coyFyH at T>LgTcKmDAD00-nTHL$18cPdDPqXn4_&C$xXZPDTz*Q8rp|@5VZw!Q11*Tj5$bUjxaRa zebGlO1ETH9{~)+=g1mK0837|Y@)EM|>JA?sq+>NH;6X(;>0=NXqgk{IB=o|$M9~df z1#U>WvJpenb?w>uQG6W&wr}>{14y=LVhD`}I^Z zt$+9sSb59JlbKO#J at p}`# zXt#M*@Tf%z_0k9%-Y0d@!f%n zf0Z8udeS;W{wsY>0097?{%`F2KMYyW#lqUy#PNUU%Q1>NR)5Qvm#mv4FtAbBYSVGxuMQ4k?{CyW`1l~}n<+!R022*CsQgMRpZ5WMexy%r63HA%&6W^zwo z^_bmoIK51N-9K)*0dTET_7D8wUbP<@kwI(Iu4XdEE9cJ$gU+zD$s4G+>@`-mtl;Ox ziSuNyYkE9J< zq89feW_0pmqQ22FCl6jSZ}1brIP6q8(;nqfFcx5-FQX_syG5x$OJX7Q=xatD98GOS zXL{ld)MY6g)4&s&vX>I0CWwn!0vtL5VuMYQ0MJ3cAGRRB{b>aJ(ExsV4 zc&+r_*&=~2`Gox8T*@fqZKh5?k0M=Y7j<~w3fY{F6jZ&R at DNaY&{4A2?DC%OK8B>0 zG>n2FR+4<{L$y?@JBQE#^^BC5kxZhSOT-Z6tY$dm0`ay?T$`KKaq5sv+&i5<0Vm5H zB2DSg^&MyyZQAEO>cb)MvUnT1cD=Hy-E at Ivb8emzDYfDH z0RaHIf&T~S`n%X(j-relvH-kKk6sg3tbqVL3JRZUle at k@5(F0Fwz*;BZv$wEvD}SW z>!jTq8M!#WiQpt%{D5J+{W!*DXzX#?QJApWT2G}qT{W4nH?ME3epXIiO!ddRX)#bM z-rw#w20KGgaC8`$JQXEdX63GIuo#v;Ovunsz!f8D-q=tdF=LVOB>@ucoX4uD_blp8 zL>UbJ1h2&{^*$p_((sEo#HQG#qs5ZJ$FVW6NV(C%>vUHi+LZ$^L7&2qnejUBVX;~LZV4reT^QRNC2{N^JVGnOyR4n$4Q4^;d~ zHF0&Bu69+p`U!FAyK`>a=$p&V2J64`2I!qnD`xLZYf0-xvNrQq9?YYvoXx?I-;P6^ zmsShDZ=kQxI8e5Uw#WzYz{kPVAllL$37b-b-~^BtW-f6q~TPr&#-M(*+A ze?LUOQdlk>Zw*_iQ#9ckwshkiI7ILgbn%--)N{&Ds at x?Xu9EyS1~$(YxpMwum~t=x z0JeV at 1F|mG*3uSE&L*}d|26&I=5JE(zBiiZs*&BC9*;0(*7(TBGS`Crpb!&`h+$IE zd6E=G#a1$FiLZR0IKBLYqD2Qye3S0BYSL)(Z7vfXJ!jb;*=HO(JbZpWUx506a!T+F zL`MXsB+%mWCgbU6rUVcorTav=4dezAgN#CsUCO&VfP}QG%FH8>6F at usTtdaF>Q!!F?-9YAj zs#Tx$i(zJ#Kl$|hA;7QXt4hzX{E zDb_p;R<#ue=<~j)cF4<)-&X at n&U;TdG5KoQ8Q_MjwE%|OG%mK-&@88}0Zxnx-JWBm zht_DlR?D?ZXaZ;kA6SVWLvefp-5RoG$jVQ+UZJWjevUj6HXEHguE25)c-!3FejS#a zx%US8`Y!xJuGUu>GztxAwV)C|iU at R&78Vu28)`XqrI&6Yk13d{*9kj^HFHW6VKCM- z7_Z0fLpmT{tnDnHVQ%^3foac(?isI+ccSS3&9F<78LuO50561$Q at TT3^O+#m&r9S0 zdq8xJUYm3cYjjJ&7lWnn&4^ggW(I!vgyx(hbo>iZ=9lO=Wejt)A$7Ep(gbW6k!C&~ zzRa9-cEQIIU#wL7M8}b8x>J_7n>}0L2Bgn$3NSc>e-b?Y4!9`5rw!uExaqgQ)0|Hu z%-t_>LrUs_0kw*NPmCY1`;~m+YyywS-5HDwIqGn=YX8!--{XdJ*O*-qY8oZF< z-W1^~n}yW);SyMi)|QLK6mTP$M at x;-*N3ib8k*651AB)-{2)OKcUN(YyBMsSkd*Z@ zH`B8{XWL9=Odnrk6Knuc?ubE=$+66*%)>0)%LPWdAWV=#WygW#>dW=T2M9vV>b2Ij zX^)^_K0`-z?MhXT{sZKmxNr}(EnQP?7^qUMd-PVldQKe at OQE+JttM+78EE$wQx0t& z at vk%S2J?t3e- zt-1;dUu;}J>sH2fH{x2R^#}|ko*5U{#Pf9TwE|}HI0on4y at os#?DYAw at 7n`Rs?FV} z^>r1h0}!e))BBClp`VzZTr~UX|K!0WB(+|85j(PHbdH}7n>aI6H~&;TJebgO7UVoI zc7S#+aH4zWACC^B`Uf~1!1y3`!Vlqxl5Gq at d0oJI!2C*c^b6~G-#djDtv+4 zhW??FKen8MUw$%k&JjcbC;_IITwtdfLLW8Boi1jl?vp at x2h{YmeL&y&`0=-DCuu%v ztRZ%0_P5<3SpTLoas~nxJ11#Kkl*&1o at 9vN)evAqg`3a9`hxgpAXnCz#8ds{ zzW)IJ58OA?--APW9x33z+_%?T`*HN>aNQ)WIPwHVYGjCj0EZ3q1)G;pqvu9QPxjB` zpkzJx`g_rE2b0J=Db%AY at 9s4B>E(wJ>^`y=pyc{P!?lrEzGp#9t`1~!XP8icOz at jNC=xzmR5faU4okDe_;=E z!0whHWB`Cl9smH!fAiA+^U7PaVDyn!T6oRa49Kzwh^734_0_+HfFKA8!NWsI`0 at GD ztr39!r*OMHZ}8XR$3LcgcmeHf6Ni2!wb!|ettClHrHO3dN+T6RQS~0 zuC(4>c(w4DnYy}~y0T`d>(al>_Bh>eoN at h4nXd;)@B1}^2|zx|u4^FZ at i89&&AuT% zN~FV2)vvuJJ&HtI*}fq;N|Ls+UHx?M#J17|bp>d(-97}%%7FyUg_b)_uhwx$l6x-Z z?8uU|i@%>`yGOO(#kL!Mjp}8{h_$1h z1Mb;K3fIBb#B}TJ0ugtWRKE*~tGy|StE>G{5wHt%n_yq|)II~t?cfCH2K7z}2rNB+ zEJT1!JGf^%zWvA}$YMzaF5^;ef?s#WUA2GC(FX@@jcMTwNV{Y9Jsq=5l3!LZjJA2;ogmYbi4X2QOm0$ENRfs}k> zy}qKiXriyHp=4oCeXn^-t*>Wy?fh1>Uo^O)*PJ*PTo^GYz+TZY(F%nyxpeeZQ_CC2 z#s-F__hv^1CI?1FI=;wg)BfUlwAItk$ZF~)^*wdf)fWz&N%3|IleLAV*-k;1&|Q-= zGt;&0BI0 zUVM}oZC4h33n at T&8%;(OG5UTng1x$`F&`W((5pD}J=dKO6`a(2TeJME%asRW*3NwQ z=2lf%R6RWGpJ=^gnWDGhhV~YCg~f_oVb{j7qC~#-UMJ6cZ4zo zDAE>i13N;Z+ckeWYGg2C0slH0Iy8t-ghBA2J~N{9sG%Y;`!?})(qQo(zrLS2KF2(6 zr(~glRz%7sk(US1086r?82ElNzS2Ts-er1P{32 zyMu=+tIPtvkm9EZ0hy at M%RQuITpqzS9`s1 at J8x!KtvWeD3kcx?`=GRrpAS9x$kA^o z2GTzx#jm(68vKzg+8NLYT8yd2*WM4)7v8v)9 zBgJVZ0&po#;husk#)#yU&G1nVTQ at V3){zJ=X>t8X?8HL{dl-W=L`jE&C`4CU*{g}P zDXHCrF%`WKC at CAa7K#O;WE7($T5?Z;GPmN9CFoXATuF)tm{r#AMYqr&NqUy98-}(Q z!^mQa%Jn3znP{3vQcvsEEv>8(Of{^RBpl5~J+(9!%(u*2TrFJOd5BvUu#+utSSTUi z7z-a4BWqewCL^W at x>s-Db99wLm(};oSzbor?X>X5{F!yJ*KB^ZV0&Ad$f&NX^tjqs zj`w%kv{->lk)?o`34(w{w92HUs);kLSZ@w}FUa8(zCM3v#w(w#oxZYTIqRE_-R^OglEMnf9>k+QdYqaI)UQ}zLs{yNOrVV~i(>iSi z)t4An(Izb;_JfpU11tUlEs{X*Wy46y2 at aG=6m{g~;7OB)0j! zf^F+N5?h^B?0P&NCoy1N%{I#vXfN?hVj|0M%_XZYrLQJKO0i-CEzzam%gvgHznNCq z(7Z&LNE^@N)ko{O`uZ#`02%458apnfwDYtz?cu$`?m*0x^s=!_I(_~}et1_tyUFY= zI+8x>$+AuQzUGDYv8F#ZqJsBrg0C&?45)zPLwJfPt1w{KfhPfid?qy_<;aDf7l^uX z#BDHGxIihJ+T={2t2Q$vh=)G3B8P1OBhZ|-{#rQWGb-q6jbn^K#;9X^qM$tW9Ow)v{QI2B5%e%k<;8&W0vT@ zgx!!AVQ%QT&O2L#+X1_XJMhbTVOc7&Rl(qw10GKF$~BGMd{5`bQrCkXLSL*~q;%0_{lx?L}iH|&&{7lqR=fDKNO>g?=B3SYKup&NaDY-r)`W5{g7_yJEr zgo-sTVXLt!-KGW?ykZm^bmsVIGQ}c7MLv&N-UvX%1E3_*)nd1Ln$#-7#>;#($&DS5 zFa!j=!7veTkQ<}}w7b~wvDXXT_PA&XjV88~GBc)AH*>sfVMdz4I*oBRjqxvPDON at e2Nckzmj=T2oxI>8G$>?M!>}Oq;J?uE)CH`EA zL_YMGu&0Lu_U%yn*>;PZaI$*_gkG?=2z%&WqB>wL4B)woaB#i+^1!77;=vA9Q*mEr zTNn`xALKQAWnnm`nx?5{4tR-59OUR}o#_W;8GBJwIoHy1L7!d!wQ{wN16MAYG9AaX zGSrCYNqWIx;5!$z*oaqlUV#gNaz4b9Yx0qPEWG5vg5LPf!orDQhi)jjs8?cMl0yt{ z&0(`UFKzF3TK}`_* z11iGa$T|&CyT at NBtoN6M-Way6RE8xwgPdsJ^22xx*=%<*o9{L;i++ApEi8gR60;$8 z1l8Hzijno3r}$BJ(obv}wkxABg1YmeIsRkwUqa9_|McntSD`bMv$6xfE9 at Y;)TKt8wCY2TPY?pemnPau(&>ufd?75s3K!(ZGQcs z=>>Zb(mIpOxqOf)-q~B-Y|L1`uq at wWoz;{M6E3u|+c_><=evo4#2`UXp`&yJUsCN2 z#w7j06W4)K$3u&51KQ}rHPO+2I79Su1A3Nq$+=p4MrXXHj-o4_a8hBsL`?f zqmdHvYDlq#rUpXhg0HM*jFZ#xYK$k9p4vL+SR?a1egyrrxZ!RjQYt at Xhj_%)WN7pT zVc^ZG1QZmc7`&Wmq%9gc6AdSZdN^8iTc6K|#hRUD!tcY44oPrKRw%PTKyg~cs}w$6 z$&7bmZpxXm<#-E{Mua_3YnSw2c0!<^=$89r_PC$ew8WhXg{UYn`^eD>U+o2F z5S5Sn%-j;4O})C6Z({5)pgU#yn+|Vq3F;5X9 at Bl5?0JO`(X5tCE1#<>7skP3EG|2Y zU3-GGpJlQrYN3?0DkvduOAp4}MT~v1!c1u;DRBY^Q2Ub{kQ}md3bRW47p{(aAL!C` z)tEttX8NPx$iIit0Q82vL7eve3?M%9st2V*GAe=ieB^S^#$ax9=XZIkXRco=J^{I_ zDpv{(pX(u0is+q?O=AQgF5*+^wxYkKgkFsKU(oaU$UbsVo)lr;tzkSX5Iid|I8TSL zvmvGG_o?~)b`d=(1n8z9cbF*7#ic$#RYqYbpEwf_oVSw(dBuiqu!Ee?eK!dH?4T#B zrQUB!QXLey0G)%<&4!t at 16Vo~%)+~568t_+59D0=4PDtIej;_(*jf7LPJ^YO{*JtZ zmj#z$pspSik0McHU{+!%x9YETfY&-WCkfDtXP`G-e+}shMnfMj6aJYB^U4&(RY8&^ zEs%38+A|5(MFH$LA`t^t!c7+QLlQ z!Gt$DU_&C%p)6sja0znJ9k7V<4lzCG at ih56AKd#@Tg|zx)~K-kBlUmDlz?mCZ`bXNTmll z^hj_+pze6pBOek!M2)+;BDJM2s4hu*P)Y|dzn#Xx7nSAAmF+B*?GRD|f7?*{NoN%w zu6bFs&_9qAo9XTb1mQ0RamDE$pW-ORcVYw{UJo)Th5LYWztSTgG32b#P29bcWGebW z at u|#osOZRpQXhj*CkdISa0KTr-_wlmYw4%g_7y$cw&-{iP3q-S8@`b%XL0aV98nwF zqe^Qr4)Vd9nSq^QLe196MLzN==E&LkiuUov4e=>Fq9u2ddZ! zYv8x`+qJguN={R at uAY2{_YHaV!BPl?g#B_qkQj}%eRZ%+ET>Mn&1&=l^bdg@!snBg z=OMPAwPe76zlQFa}ZtV5_nB+HSvz6EyM0J{~-Q9GF# zwp*wJEx}Q9lEbHQc5IV=_MR5zm<@C6mUXsm*615BhL}bKnetI{0v)Ow!kl+d$f^bE zq?{IcimWH?v~7X6Q|bYFp!S$=xjpod>6l9Wjzi0=q)leZCNouwiF(D1G09Tr4-w1H z)}r;BXwym7jBAZd6HeHV!i*~@MSp-kY=c&voLw@%;{tfj;Y`4>Y5Hk9s41823TPq+ z<{ifaP5^KGG(-Q_Jmig-v%1RuO+hBctZ7JYS-<4UePdAfZ#rH`C0YI+jhwCi6Lx^Y zBi9_xCKeadC4|>}ft-y at jM#y^@pkGzsF)*JKjX~1{oeT(Fp{(!GvQ< z$QpC!-TB%{y0CatXyhWO99kW%6pSl*ER-~6Lj205s2ED68}ktys2(e!Nc9S^MaJ` zs&S at K&XcwPh-5>)Qw2Nw4&6fX_Xze|G;Ry3*oJx1sSZ0{wB0jXUzd7jZ8+k^pYH|j zzXsI^l at L~j`|@m}XqRC!o0 at _Ql5%45S_ZxoOxt at GC$TUItxBt;2Jux at G2$wlIFp}+ zG)5=sGDUDgR;45*KELb#c8U7zWag>f2Wigrzs{8sEug6}3IFZd#A1 z- at OPHHG_T436#B#g>KT4x&ndFESW_UqmTghw`VqKO^>ED&&Dkm2XS~4<(aD_>Gk78QwnPTf zsgRK`y_8t$V7gG{h8t1I#pjC=yhRtc{GsgVi_3%l3YiP)nq1<8^lDe3Y!kG!3fk at r z)KV#`XS?>`kr#{$iN7o+KYrqmXhQFv#gISA20i1D+7~pVuy#rnC~Lw7n(eTUal+j` z&W01qhB`=hLdbTY4LHk2xkEA|`JC1Oz2!_B`k1wR&2a+tKCc$BUoAmHDn+%XrMb&c zuZ){Z*X#tEUG=VsQw95}=7TX{T<%8~mK7Yb2zNc3;49O=Bi8o7G<;(8MI2s=&o4Wc zD9?ihEvmPJ4wV(WEQ;@3PjPdMd{?44HfKt33%^0yYtt{0uTUz=i* zwWl8DsAt-3 at Qu;}8%g;neq<07t+*i*Y!5rI+{dfFmh)dvMTH;K;NCkkZ~NO`b7yNG zzx=(lOU_H%iJN!VH)sw_*|#o&R5PAcXV|z{9hBW{$%3C3HR_Bs>hBILIW=qIzTLTf z%I&Iu?r|?s3!0!!3|>b}9NRuLTMiFvArU>J7RAyYhw-*|Z5VwYc!hCv?z{%|O$BSM z!C8$+nBjCU`usgl%TEOQav3+RHNL(Hwewab!Gpmn3rG*3Wfo`@V2BHS)gvE?S{D$c zi5&pF|FzU>{zD at Q1OVU&1^}S&-`tO=ouiw93-1AjI_0j{Rq%S?rl<4Hzz~HFwgI#sHX$S-a?qGiaYrRi5 z97JB~Cq(?V7ZNgwT?_r*nrg5J&- at O_NN|bz)A48Wq&3lofihfx;CU(u zuMNXyjp>PT*mRAUCTWXPv8^%dlPSS<@bt z#(bkP_w`>uTfzhD4F(JV00aR5!2CZ3?f?F7&_)SS0ht#~6 at GhBx?)+ETCv~pVuX<( z+B?IbI8)+C3NQ20acIRPO#^i)Z@#aBj^$4Q-h7;;=S?JC|DpcdNw(8m2lt#u7uVVE}DyILA3#fZL9))0yTqT>J=j`3 at VINx2-Z;NYenDjC*KQ z>+B4o8?=WlCyLt?fM{p=mP(D`7K)NNeN}78MWW239N`f8DrB1;S8z5Tk*cc^O_Rdp zvHyl1YH7JW8hM0pBbBTcX at X0Up+nojzS#w?pKBnqIs$D`g|I``t>etGs)$!p2aPjZ z(v|bUd+d7J%o7w~vVyaT92(17eT`?jZhkq)wnV&vW4@3FkX%clKFjaoODKB$C2G?6cT^r-jt28J=o6y3W6TTzdxePNbQw<^;@ zemxN{XJPM%`Ep&8`f~gl8hTRM^p*W65yYN>_iQbV^ScypuQr_4Mkj{ZPSJVij=gh( z<+vFAP2Xh`Bc1RbEA?7=WMGTcGRzabokr_aPmTfdi^1s_T65aq2}TO-V!ou>d8OnL zbHO4G#i6rWNpiF4Id0KLQ;)Fd5)Uhc#PcGKsFm3izVCaQ-6odR5R0_GhUbt&@QEdr zm!RGFDmD+d38LN>xB=-akeGNv&!7c(88>s#jg$}BGm2T-NP5$qfY at MP7#RRh{JUsC1|Bl>d>U(Fvlt>*`zmq5s!M0UtGN`l zD{@!FI?X!dlX22Jt93L^DqhQ?1kcOd@>sBX18vK*3nHyEL3ZIqZLm`ET?GpS*GkK( zJlUT^j^#+PW#Z3yQFPe(`v>8kdB&$nzruOpz(9Lmj9B;TIJ&ZNnN+Mp=gpmDCGIbO!1bSg&Ij8n07H zpf_EuP13imp^A=cJVM1)T9MtnU<=yjMA0mNy=n6371zoOP+p*7ure_rH at bk;7_&wA zmQbgZKXJkwEV~aCPFilTcBq`iK0OF1IBhjf#g|XcHjq49pOLs_Dz

    t1A|BF5;yvd}ZH%6V& zO~SsY0_)ASyta?VEi$*;TD8$rq~4j~fec9ynZd&ngEWgwmDqtC(6;&Z&HVu!R5Zn> zwe|+|JXh74!?W`UoX*xstd~`2CX&3*v3S~hHO9WKD)SfIGunBM5z at rFpdqpX}MWgZA4G++-={|1z3bT1Q=W3JKj~&RQGHcJg zUZXSE6aTP5Cb4N>y%*fpE09IklIPLqEe?h8?DkSaRNF}b6$lG#M>wU`oR)6C$5>4_ z4FO7Vp;t9NH?|mYC8 at fs$!ErCK$y&0Yp8UUg=>ys3(1DjQ0fj?QR?=9PrnKe;OoX+ zQ8;w|5+T4pQ1J#%l6dDDV%ID8=sc4p=Nl?1%%}|{+Xr2glo*N*&<@8>8*O<3*DYCP zMz`BfWo#{?Y%!_4R5p-tP}t}R`laR9d4iRcEyzT*dexK{$gt_l%FR=Ws~rj7m&p$j z_$oE`n=&&~^I&de=T0w?>lO2-9Rm~HlH?TDZ6$^@*)qaZ?Hm^U5QTX2QsS;y*#~TO zO)fzk;H-JkBr4rr?*j>=rS9Of^1rbHFNKe11bmipU>_gC@`}2oiOL)_TgCHLFb7Ih zZi0$K_Tdmd{X`vlzbYCBEaAClzLXu!g1$l2&FMmoNAPPy2B4D=`&rB)(bCf$_zLG~ zy8~~ZiHMsmkd1=H*L}nKjfkP;KnO)rhCT!tzb9J{uU^EHFhpdW{!W})5wBszZqdlW zRcWHz(;^P}ijFeJCqRjf|BkiScx at K5WORoo;GhzTw>3sE_g&x`jPbgF>L~8pE(~I) z1ac^)P+if{q;v%hVSX30+>}aMI}n3!<@85`NspwZXBXTzF52d2x^K>Pa&FRu-we8O z1AS6O4QXh8!P!4Zd~=o4BAnF;l at 2!UmT+S8XWw`*DUOa=<`urI#u at gpDVy~>aZWy= zADZ6~*-5zHy#SF=bUVL^B!@IRbYv<}Xz&*pC z?FH;6%A!B}M?ZZ>6)fC!n)*&Bc)3%wO1s0|=u!4SjH90G@^fW$E^6CoPl<7(h{1Cf z{xgC?%lB_91#y`0Q!9Vwt=zYNV!! zuW2E{9l&)`zUN`dA&=>+3V=8<#z7NPldJc~36>NyCYf*>#jN?PhZ37q(BGY at XE!(W z!Ok{DyS0wyn99VjVhA~5U(i$UhpCb%G*#5~AQ7ul$D{UbiLlk0uC6%fQlWFtoRNrN zTddEms{j+twQ%cdd4T+bln%g+4BMN>c}c%j+ at xGSGZYphxq6pt9VG~1O at O|-Z7^e8 zL5+`?6M%Y at es0X(+r4Kd=~82RRqvn*fXK z0nF{buC!GpJq69~XYnmpsi_ZVw#5FUV!1ODU|}3EPEE#({GD8R25&7%yvM<&^2k&K zxg%i~hwao+%ZY~TeUl&rKS8J5679K&R&vQpqgca0I1RSmTs_J*skx=yE>XGQS}-Uq zCXBbD%so_%aY4C5RCKT{%qxUmSnC~0*~=3~4U3UgrK3k{+t7cdy;8Jw{o-JSfx4lG zEa1gq3s1%DXznyCI4^SCp+~$BPPkKp6VLPHVk8MO1wd4}b+l+XK;Qx{E|V;$K!KUd~5Zyz~+ftM$P*LOWpeoxvLuY=zAv#NRKaC05KdwjDEv+&@5(u zg_+3M3h0bxHd!nFJMMGHM-yjv*X<{$C8#$u$Os>?Avtk8tF&6BVY8z*#~|kdKW1$* z*jXOQ*W`k2%wr)>Z+B!(G$yT48Zk@*x`9w8_rzQVn$ih;4+|DX@%x4e4qT%dtz!85 zhV_u##c=*%rlVXQ at WVwP?jcYLab8n;xXr)mt4+K2!n8jn(+%-&Y~lQC$^5fm691!M zhPo$N|Ik!=fnS at 56*VZiSRrBQ!gV2~sibu#p}t8kU{-BO4VhupBYeyXrp(viPk9lK z37D+v(tSxhkKB)IJ{KMrRqL00d_TUH7)ptL-^Yec17M6IUOPs!B~tKqNfBgA!HM#4zoNU?75?Sv)x2Okx01QCaDwsBg5$Ue;K}Yy_&wfyz@>B< z)Rd1^n`P}tj2efb$BSQ=Z)-dod!n@#?r2m$&^q(iPliG_H< z at N?Uw*O5fZl7-UhL`Vdn0yMUFG;(LPzd7&3zmuUV*vq`ka~%CcS~qJ&-bv*ME1}82 z!KKNEg%Ijr=NJyn(HqOQAZ(#~L7~#2aq~!XCu)9tNADXO9+h(Mr{^L3dZ$k+Wvy&Y zIbzx?nQ@{m^i(FnO>tOca*Z#)NSU~2qw*1*I(_~iXfWRZdJRuQ!fZkgC1i_R5=t?fF`D8WfQ!~wx!q*hyVdzRlYMQ&liXdxfybDvX zOGRx+5l5m;+{%yfdzx>O*`jKPw#vjwc=1?zw*krL? z2G%YnPXBv0tjZ!OAnOz>aW>%O8kV5(m#H3!a3Tu_CXoWo871c7#r53NWaWMn%wjO2 zfq(Y$O at q;0_rP7{N4!c)#iqn81gCaBa(GqNKVsHJ(q>4+-McyIA#klVF!D)Hyyt+YFlX9%3ZeEE*@~U at +=Y< zt*$}ep=Ft6;iTB4AHE)8Ue5&)`9lab(xc9hH=*ye+Xgd9vjz2S26nPO=3xUy*z zNACh7zJ)tbWPb&`u#4 at N6EnF=vM>b at cqKlc?fLsqPlW9$w{h#I(4Y?-)ILwl*~}iF z*sTr)=Bz_)J3mqM6&!Z4z1XHb^=2`J#J%R7rU)EOZ$lAsm?M<^$P8=3b1y;>cHgjo z=A#F>NcB6Nhg!pTx7>u~3GYU%%R81 at MxlsN)#Xe&f9XB$I_QaAoi=w}U?z4D>O)>& z;T`~nnPIYCYY!v=ZRVKgYK5E_REIEFKgz!YZ_p3rod)1jXaKxI=#X07_yt-0Fw+(H z!P!On76ouJzuw3_=A35hTI58k5uZ2AeFZArWzwckgZ#$gG6`@-iHa0UyPo*N5(KAP z<{D{T=Ede++ at CJ#iNqF1iPxE_<74{-btAGUq-VQR2<)N_gRI+>KR{H|K7mVS&?svK zZvJsO)`q}0YcT0uR8zm<(H+*xbppM3kLeAaI)}AB>~ry#XyaYu`_>tbC60v45Z{5o zPA3*#3qW80+e+_Bac&?*sqC_#=(4D6sfePa&+lAhoLgd%h5C>napkC!cDbyZWNsgP zJBAa1DE5~PQ0|B`qCKK(3T{%cqXP6joD9-((Zj93>9b5XtB9CC&?bQRH}u&*p#9I2 zhJ;nyS$=rnXXGq)gpgqF{*)kSU>rNM?9Um&GD#K5LU9BX<}fg~bbWBOsz~hOJZ>a3 zd;ucAe$XrV5R4%nwc*CS%;oh|J5#fTkK4yXyDuyq^0A^EGJQlSl&EnfS7Et?QDu at 4 z5OC4)?s5G}eu1Aon8;-yx0PA#Mt3^RcIgnMTvbB7P2*X16&_h at R-;um3nNAYj?}&? zIm!_SiYJi$SQlPO_^Wl;xAXSJR-Qdszl=xECEAI2!Vk9%Gvf2aaV+3u6dQ_mQ*`^1 z0=~+j5f0EqbW-dd$1^5 zMVhwAvL4fvUyA!4DU_r-MXI7pCSCj8r$!_gmP#CDoj%Pt9u+7J)W*|fcGWJg7xkYM zx`80IXM9t;9CJks2Z49TspXos)PQM2e^uVkC54BTwFP;M&h)C}y5d>B#WGSFb@@)2 zW7{fJZDy;!mVAbg*E at m9*ix~L$h?p>4cqbyoP3UXY=_m0mZY{~o8tiNHyS?V*vBR0 z-MKK8=#)OC5sl$}@92VYwjeT`-&oH&ly__~onGOl|L}f`XMqg<;6MRPT;VdrxFNAh z=Nl-457<7|IP#vkbPQ~Qh&F+aQKoo&3L%G&;XdcB11MW){}}1JxjWr0%yn~HS9B-> zqMn>Va+Cp+SxqXuSNI0Hsd*$OdQpdLoQ>j(TmM7sn`2mqYeWX8kSq?V_ctd32PSI4 zw9tK at 0$CzGh~eW}g%D$!==KI*FuCY$4qkqOK(}EjgE(DWfegL%x22t!j9&pUDZjXJ z5x2=j3AukFq85iJ;=5?WKo`lQvS=43dJ)G;DX{q;{w=e1LA)DS{O9ZV&yV_l3h#fm z?8pcK=w5nw5#I*PN^mbQw1L80F?a=g0@^ze3qUQ241TGiLCt?{3zWG8)+F6!k6pg~~os(0QqeXT|u2f{!@h(i9IlDcOMM3pxKdYi& zM$Y>WE^r}QHJ2qGba^Cd1VcWjC;M!bu at yT^Kk;xUGZXclYyx(#0jC;uSdC9fOaeJHSmc=D2 zEcN6^j=`OeI3P`7D#4%?#-TXI;+`d4lDuP0F%dfBZ5wja>Yasro4+;;lZU>M&Q}0?*ycBpvHf)elZ5Ur2kT+hVBE0+xFqLgfdy4JJlKvo7dLBorC`3({}kc(ES)UP zGoPI3zYun!jNO=C%bd{Ss;G$5t#omt+RC4G%goMM*JU at T{cbT}yPqcA=*b4W9Z_~lE|M{wNnx116>6_Rh}o;KW{f?luj7c& zUGI#8`Wi;+Vlva}O_-^cg-80zH+(v&8Op6~;ggSr??FXH+2j!!c~~(pFOV#+W{Slw zcPvp<+1MALRax=U%Unq|3x|U=h3w-sH8l}bDEAn5@>G?jr1jhIQr>SI0Jrnda{giD zJ-6|$?qzpsj&^i|etL_3dR3QA<8EF0VSOwJeRqaScV?Zjgc@|aVtHR|JTm88#!+a= zd!;+h at ztW(Xs~ft!X9I!nP&2q%VEUA-0SFbGHruUZm0m|e8ib?vj_PRPx=KuC+_J~ zv||{KczZwzL at vADh0pUA?hHs z9`lyFYwKtirQ~Rx7f`;WgEA#PqYUAF8o=!VRPo0* zD at pz(ZK;+0fvbF$uO9(Sa&f)1=gh`#c!_HzUZ~}bl>un}QZVDp93dkPA4Zu8=NX4G ztMNFur!)zsCCaYtH0#1DJ~5qc`o$F#K^ZxZtc at e8z)>peP!TgWhD##ktD#R;xc!lk z_*3Z{7K*#7rjSNC-tri0QQJ&o67 at 7qwK&m1fZTq?1hOr!fHlr6MivY-fr%}DV%S}qf;}ED#)%_kxotLBV#TO7r34v6d=KL8o-l6Gde|)f7>8at-^=NaoK%hmKm~IW zzW at 8C*41~x8AqLR_qcie7Mt$TSz at ZWT_X~o7E6`7F;|A{OG&!x*rrDT+T59!{pQ{6^W zcivm=4}_84-&JWBYmBcAi^_j|a|^r?CaE!VP>>uoR5L4eUU?70-mPi$ph40-^-Vsp z`icCMeW~i*>Rfe8amEw){ws?_v4I}P-ENT}nw`%tLtTlC2@>mOA+DqLioceCDdW7E zR_b at 8r=-J3xG^sy6&J~|?B#>FBqldA`GJ1x0g5W`wCRlA>}E86vLRZbbXyc6 zsSQzx`BgnAsZZ8L(oPI=wB&VMj}WQeq(=M?emnFGCXUHIh)dRIhz+9|xnn-*7u-vh zXVH%s3A>wMnGeWKW5=HxjK|H2Zz94T)Q|kv2Zbe8^>By zV#P55$~7B{H!w8>B>4dNGkm~vRhBw7I7 at HJ& z<*{GJx!Bm?NYj(0^Mi74Y?4fTFiRt3%Op+H?~r+H6w@{spJ?Ox`m$M`evV}4vq^t& zZ}L>xgdYZsJYKDnZc+`P$xo%<2^F;#vC8b#qG*kL zlj(}K6AWYa8&b?|-`t~{StZqxV~<3WIV(g#L+^$wsQYEmy>hIk5O15q^F!i}4$FU} z89dXDh~nx-wE(kgiC}{|^Jm#WHW%t^A!QtOcFJ^k;0N;=<*R^c2G4_M-A|@h?p z>=F^4YE;`}BY1cWSVnA|<2P*=Orjfv)<9{Wv++-g5xAw`A2p{Du}C8p>~BbfG zbGoOwi)G|^|9Tf+^&xu~E5q?F(54})U(6TCJ0V(}ErchQI=dOkJ3&$0ooqT4c}H-^ zSMh?EOIlVCJu@`*!7j?G1WA*3bZcxKHV`epCvoS$C8+$BGSBK5HKEZH^*mo|Ud~nF z1x!==RjOEt%tbE)b0(63^UT{=G-73v=eV`dcCR*EhnXXVJaxe|}D z2%OTnTMB6rv0*c@`OGFZ_8ujq1!QV?c^WW<8c3MAr7XGm%r=1&Ev9-QaNVz_*4vOW zzDfM7g)GS0xK&VAKk(CZ$N-dZoh3~vG at 65!U`0hRTM(m8to&RL)h_!P0c_drs zh2DvsI&zj5K+S{umi!Q?X2*}6%mINTz at Z~H2(cS at _=w!R_zrGx0ioN|p-V3K4e<%X zI{wx+v_4Um at e6o`Ea`rq8eT!u)a&NVmcqh%vhvFCd@79doMXn$Qof`aFL8lD~G%RzYXE|V^dY>*2gjoJaSuM1NL z66LnP6mAuDmWV5ap_Q=vrwRUA#hOl0*r)E6#kB?)zw+?8WAdIrKo+2z&oND1*FCA( zv3 at TLT(=g!)XnFlh z9K>!uL8CtNDK;V;T54teu2PwvIT>r$Y=!A6tH3s9CsQ=(j;ef%G^~_WxFITo0Gn14 zS+#j+l;J|Q_VR{stwOVrZJr9DXy!Kd)kK}mzeRM*D76EhQ^N*&3s_F+iUG{BXCO90 zp<3FI7JMRtc&9Rcpjo;&XCaR)ezFG3P^K2Tu|T4tszPkx{^V4-pao6Udi8VLD2Tpv z9aQEdE?XsW at Mq2v77&DVW%R&KRZyoISb3Qd(lyCP_Tbr5KP-=>w8A~u)VW4&eiOBh zFbN~peStLb;y8}SZyeBSnBuvbqQ(Cq9+o47IGfT8|G{K-=$_Gj1~uhTj|!u6A*^YP zI!@fuB%p@;Jy`OtYyzkifuO;95ecz2>eeWr at cA&*uv{j}z|V!JTnv7toKj19vzS{d z4WDyIkUeQ<1%2YJalK{46P6pO6gHnJ5>V!n2%0VsPVbi?4C)C<*^q`YM;(-f z;WS at 3YCUz;PUfVz{5eO zLKkvfI^u3ul-P8jFVt^1?$BfEUC~pS2pYfOyIN^rTE98zr7l7 at ovLH#Ff|@>&FTOo zo}4n1Xu*`@XZR!F%I>L0zW1K17}xdshVAXRM)_GTD{u(ej_BF;I(ny|Hd<>3#PqI^ zbGK?5>t&wxC7!&hRv`;w2DgAOJHg*w^Wl0`F86JiYkf|NiC_9A_Avb`c zrPB?X;FXMSUMc%oIhth!X%D%!M2bhK2S}f6aNiZj_aH=Z<$(A z;{?%&gUB=j;u;Svoi}4nILbG4Gk_*;C`{Km1X~#s-$4#;@6Ht=mVk@*aCK4b+p`vM zKO*PxPKpULp>|ko|F${URC0z%XMEWHFsDH(A^)(xI$+e427QFA+QMi|+kJf7xx*lB z at MfAZ(K;*URq04NJ>=jc{2f+HP8US-m8jIX#3WitQ;p_!_V!)nw|q{kYWf+Oxcfz; z^$kG)SFYMMBmSTvv9C*iDvsO!!wi(TaNp;QN%MEb{K5TBHs)`QY->^JktkqTd8H!y zAfO at n@$5<=;BaZiB9_QdBs6?+70w{IgC8>PlW2G;+!YMYD!Io{YUaqvcLuW*3Ci!_ z#>-?EnTRl95+|WIhuHV=Dh;2B+g-OkC|wnNMAmg6b**d|x>aUL}xjciHC~zvsDuXKP#;l!M8y04x z%LXG1v4~x)oPq_3qus&0eR(T<)A1eES72*%AQ0ZYm(z?f&#iw-3B8elIvUSpR|SzU*z#|5iPE_Qk};3-~0! z0({kSKl>Wu{<&zBxPbJWh?U2GM)X+yKKZ(uxt~vYY5Fz+|MRQn(ii;FH$C;!H+t#I zROSz2tkL(@^t-V6R-XYPT?edIm710gG+hT at 6BK>^@46vv*iDL;sABM*E9WN03ZA1@ zGoB7q0vz$O(ho8H?%a`(bGbLZjlivp1tW|-sO!NDU6y3NU@)D_8i&S%vN}-vWD5IL zg8H#U-Y}7`Fp39M#Qi*heM|X$KY{&n-YN1F2@`u!5_G$U8`#3J=349wo#yGf2Rl&r zy4Q+NnE^JP%5#=C+Nr<`RE&abR_K?XB7+A$MhXmN?0MT^?+%OVh1Vk9 at aM^8WZmmQ z9xUf*WvzKW0_TW%*Mi=3=j at 9FqTU1}r#_qc8S#xDB4S5>=MdmINh3u37n(BIKh-_O zY<@erOWN2tJN+xarflN$AA}_~|JBo!t?X^JAc*TzGxnY!&T-?v2Q=6lEH{*|J-0|=OYDsl+eNJ&*JGuDeJ6fZ|t=qH#zl at Jwe`N$pUF# zYfZi%EVP%y5zht1!^{byYf4f$wq>CzyWK1ahZJBpYdi~!{b4ReMXT4wQ1>FplTzO?6_FqjaEM<<1K~ay`CoRjMj8U4`V>URk2oRN(YIb8)X(-uU7O3sO7-zQ zsn0Zr;-NT8_$g;Fhvo8II`SSOmF`Kqv)`I>iWunL+dUz>TXv973sX zlmg{j~PR0(o?zD4ky3BE)MGXa}BL}Ev{s=2bT`u)D|cO-*7I~ zCDPvEE*QHNDCp6t&a5;QIh1%}gGGf)BOkZDqKp4lU8jNX>!*SP0+J*6Cn-}hF>|&y zaQGiN`x}3(rn?ueGn#MX+El`nwa07`ysR``ur0eJ3fFoJX at yn8M=B$iW{U79LO80d|7# z(Mda>-WSiCKi92S%HQs{KZreeJ|{%ros6KXOEP(#SiI*%T4$@fI-&_$J%9fW%^ZI7 zE)DGwbxoe%>e>=S>2k&K-By-*nNNMQ4|}kW;W1)VfaAW;5Db6HRfGTE6 at DN;dYYw;TBPz zb1c1cKihhS#o;|7Vs+YS>!DVFvRH?$Sm+^Ka6YX-t0aIL2_L-VK}%9kskc{$J%0fj z|5Hi*9bj3SGMhVW)9e&Utw7{S`;Tj&9m;|Yi!8k58X&HBGCx@ zpu?@yGFGxYHr$l5`BW1M;2f;FtO5mNuqYr)F^EEaX54M`g#ra? zaO0RMKa(dhEGH}%@Z^Hh@(B1ILCcAjwHfs4CWGXLXTwew`^s at WSAOHCBOkho!I2JC zGJNcuew;elIWlTqE&(iA%0NqP@%Ps&62 at FuqdUuR8!4TYIJJz9)F~{h=#gZm6z%SX z=~({UsTRI+X(o+qbItv^cVe)B?wHX%?pO`GHG3fHzHNf}(C at S+|z3NJ_t#lqmSZ zvN>xB4K3`?)QHT&r-)`MkhFyac$Tsul(;sic55?^Uu*$TZE^Z})Oc!W^cw!7P|T%M z6F$*z^>}u_ z5p|^?59-5;gHwA!EM%pgG=|k9XHBoMlM8}^>5@~5K2mooEzLMHh!BqybX1+1dDe1w z3miKbkT`95MirgyLKXDdmIG&U(%$N?+ptPHAskn^!_b+KrOk22(KnaDUiiW-O|K-| zMdU>G7O9ZXG?ypK*8PuNI?tI}&97p}4v3mX4&n{pq8tI(=%H{N6M}>tBa~p8Z@2l-$A;Dc^Zk%KRDiJpSl- z9(M-r at dG`r`-Qm?o#QhA{9CC6X$OZenIH_!PHj&#*|+kYc0u})Cf!Gtq4SJ``7=k) zeu2Q)Bl+vFM4&OMck~gvn|OiEsai&T&V>1 at aDtTE2q7_7#^D++9K2J at cT2kH1p+6gKCz+jlhHSFrMy`}~) z<^q>5Dfg6ZLStv^SGCRnCrTx~!pQDESXR3tp4zjyb$zf)rUN0i>Old19fmXyi0&3& zrxuULdZ+346>BH!7n9QM*7BFN46OCDRN&Qyr%N^g=ZzPHi_2bL0~YW~Ik;}}={A?A z at 3mTHqZaOOJ%H;*$9m^RAm2}T84Yo?GMXkprY`0dcrUmZ)_Gbv9Nr7*GWKTta0 at BY zrOnN`#ZD6q(&aF59b4E^$@A6gT7s2H_&dydc6N$dUBy!OqG07+Xo*zrK7GUs)~my8 zx=IYkJJ9k)-8<#>rkDKvid_6*t-BvCTcV1S-{!Qv1G;SD1Ai9!oChyPg7T*GUJGO^ zO}!_(iy9_wS$sy=;CS39jg!pJ)i^Qd7%}G(F=zTRxS;A)kw}g^n*of4tX%=&7)b}b zhFR3ePjY`jc5 at jpoCX(-jQ(_YgM>cE>^x>po(OUWx17ZOh4_&LgZm^m2qyQVJlg4_ zwsOLxv at 7$*u{)RrhDfU%QuVo at Uekz8NZC>uYhdG#v_ce%AM`i@)Vt^)gcND0$`o=f zeM>?ULPz>;z|VM-iw;YM3gG=T at TT?P5QzzUU}q4U48z-Hz6ny6C1Z`bU2GENs8{D| z)CSh~U@=|Vb(-Xgb=Q@-fO5Bx)a!Hj(8y^hK1yb*UkPo|ww8z3u`CG`IYJ-E1|BVO##6+9x5|AQoQX&Le~}AAUYzRts0)X(m(^21X>Na#rf06pk%!$ zh1|1dwzX-o)rH9so##XG#R!>cfYQ$&I>igNAFj=bZDm<%p~#KTM+{U0(Pzc%;F<&O zj2|@!ya!Tjcw`&g#x at gVlJykX9hWT6#ifvw3A%!o2AWoO#ie$5{PhIxh|5|zhR}uO z99}m`N;hrtrrAHQ&^pL01#M`xI+^ge#u%e#`B+XzrnEXfH>ue z2}Jdr$blRGc<^$_ISu%#iy?Ca0&j-gx3(NX^=!Zm0`eITf=ppGs zEx1U3!AK&|c*5E8RA*vnbFBS>@CJG0?%BlsCHaHIGwxJ8s_B5P*s#bvA?0Lvv=GZc zJpsdoOq0$G)zb+5Vrmz_YBHIzb%R^C_w5Gp-N5^0!u1jEi<SHNhh&DEwM)#|_2+FGL73A%JOx^i_>HX19C zNV;0%U`N~g;rh!`l%UfQcmWL!l6y>7NDbSX4 at fCohrt=}y;}V=hsa=lv1;pVLa6x@ zLd&!g=kkbQY1uncZ|PXBxPBB%?T>GO7*=JbldOoqnDB}~mHtqmE?n6{TY>gU#!#*( zqAFx?RyJE&jH9oe-FE`&6kHW5H09*OB9nwjxfEmnoXADy#@TxO3p&2#NFg92QzVEc~Zq_r*+;N}S`?``*O#ZcaQ( zbE$TJC3S^7PTApHq12<7li39*ypU2sNW4ptjW-YhABu(nA;bly_bc+RonxcN5m~bD zzcs{Lw3$Pi{}tgb{Nu#V|BiD1dtxV9^*<5GY>`*vXobu5ZI*fzXo6CM)h=M;r52iG zB|#Ddi&gERSL&P_rCm8x&R<175I^;uhu at hGPSt&r4%%H)S=YeKKv_Ira`c3!yIJO*lbR5~7nI<984dm+zB&Dy+zCRajYd#!?OxpV^|c`vPLY3}WR|*)vki zSYK22u$=}vu212w?ahW7tmR)QNw}}GM13mH=nB<;t#)o zMLJBib8I!PE1(Rz)CUjQye`Rx3^6$$S4dlVPs)fBretKlA4ZCP>a z0M8*Fg2M-D)zMxb%4|7v6|2U|q(1>{JwnPAml&jbtX=81QcT`UGn9di(I-Cf*T%$T zl(1lYn6Q%-`H$L=DhmtZ5P!aXcj>I% zjjOEQ`7k)K77e=o2B>&%O}|?hT at tTokG7&hO9)_G7zu1 zNK=m_Qk=Vu68z`D_H`E=El8Q46fp z)g9h?`p4ZveXt#abWcnNrXU@@Abcn{7|Lv2IJ{XnpB$P5#h_>z<&8ZUQ>x%%((04+ zP7Z9~MV>J0TIt5i*7QcPTmc* zW^H1M at X%dK#KEgz#j62Q$j#Facjr at T)Qj`<8sX}v%XI4?{_00jpQs}sE)2p0qd)`b zn^vKN>Mq;eM4)x at UgTl^%M at RyU@h}vt4UuWW;p&GzGJYSh)ljdk-0utK6yDYAQH)L zCodk^abnOjfw*lS;3qT6nc_SKDte_JpTaF+y_(i?J4&c`k5rdn$hJ_`yEF=`h^oe* zG#uRbzcsR+RwbEAfB*qyf&CM~r=+cuiG!_)!+-Z?M=NXpi+%m8M0d5JYID%C8y4In zv3NXC5<1+1(PF*;I_Txhg*I>_-IM{zH at -H*yo>kMazB)~Og^#aZ_${p8@;paB%}$!^IZ;SGD6|U)sbO)MA2G&_a>@ft z>#jZuvv0R03E6;USCJHI&HRtY?o;zMWB>>Pgw`A?*g$M|N`%IY z0LS`Z6C7s@`P(D|n*t?f+K*gz!1$6%$P)A;7J4!#PnbycyKnkM at jX~_eu1%cNo&MG zk1js+jVfgsg(q{0mLlnj0Qy&^H{J~eFy8+7QuYKRkIeq^#mQC}P>5M-)4b at ESa5E^ zg at ii1wLyOtwC*IFH-f2bVq&xG1!}p9fWIm~$pg_-yLh1iNM>5$oU9GxgGN9*;Yz)X zp7psJ^Q=9O$r;ikH95al7)G2GRZ{ zkGEj|gqin0 at +ji$=wxT}UwcwfXB!*$e^0^wd!GARYq`1-6gCXbE3kY+VLXy_SeBWE zQFFd8v>zEzTC=P-k@}Ukld$m?kz3)7>vwC%h+FS)RThANP2D z)Hx*R7{{3-wgWZ(3nY<3d*FkVv ziHWvuYPBbiqs}zXpNMb_GCa4 at wn$EVBYDLHzm;-MR^#t*HfazbX~b&bcL2q65Ee>23*1;E2`T!quH at +b>pQPH_4qIw~K9!wQW*hF z%SqwVGp?TckAYk=M|`f{*{qe6ENQ|-Hr%fwE+2e>CIUnOvP>QwA!t?1yuI}CAy`!w zX(QP^qXq$^Ar}gD({<0^sI2oX7{AATDpc at Kr)*E+^i}qT^;;7?6}l~vLmG)T_XQ4> ze&zF&%?HaanTe_Pi3+hs%NZLpg;O!gEZF)ty)L5E$^Xn2dH>0S4W4i|=py*V(zf-o zBS_6PB`aLxHN47Y4Ez%w*i_OI!4;*xtWkH=bAk`=x>c0qMj16Bx$-lN|on9JZ!9iX`e+1g)%aVAupF=X4um8kjI5 z*5*$L6JbGCVDP93UR7oj>ocDX|HZ7&2T4=Q(0c*0u|nR3i41%wq_V!9!VyYMoZuYJ&}U5pz~n zo5&!8u#Qqyx5j~$;DvyF2=5at5u_DRAGpHuX|gjpv?Hx-?Uv$&u~E)o+A!z|M|RXnic26Mte?NcQW5Pg&GagAwp-X$ruu0%;KjCgzsnFFQ1uKk&l7a#mnI`IvU zmZc>;M*wL})Cr}2CG11g!T_{ntS*ld4kslT%&dnG=g#@PQsVUYeiEJL85}*v%AUo-j-qu?L(G4Y7-l=B3p!- at T2DU0ww z9_X?gPN`rej$3~BnIQEhCtOs4CJXHN&8;-zjv}=hS(3 at w6}C3#vdS at mV`{zSt z{L6LRrG3k-Qfyb6Mw02oQ}0Jg+xnYuY}6}U1`Lzj-QgWr-FK=lsyi6GSW|x)9YkT+ zY!%p&Pypw83|z<%xNdfINxV#xiwjBJ8QULy*^kcOm7`#yb(@%nHp3svR`Fb!E@`lt zltK)kOpa$!zuRkz5g@}Ht8NO34`B|Y(Lzn;7Q>;fF!oEkJ@$bZm1eCbW?p4;;!Whd z)>ii!V}uTJ_5#DKYJDj;Xsna={`gTAHg_`u^eHs0VouT&KHwTAd`Cl^%N1c5HUq4+ zi{{#88iSX0KzSv>asjpL?(^(4vToj15^@OpNKcINI~RP at cn_9%h#*Y-mI~~J5!KBR zDhgr+iz z5Ykr&5;}W4B_+O_aFSmfc$cgw5r{YfU4ES#ZVC~twW+eF;9KpZ7_G9&+huISrKUqZ z?uA+d%fiOz)5^jYORtabH?Tg4opTXmje)QP&hV0z5&#s>o_GFMqdNC=_ErVJf;SVt z5Vw+l5FA1U&ww?JQOux2wb?G1(R1`O#8`2 at L*H=*1z*IK=+>)LXT|7rRD1ru6w@$$ zk1gamppgnwDKZ6hLdadDtMm^(Yy+sE9-QImPw<`N08sY3eohOHOj zvRk;@IraKS0BpW>ynynBc7`}+L5Z7ReXKB>EvEli7Tm~Zhe0Yq-CVZikf>+m%5U|V zrbKgy^&+CW%Hdte8X9Jt#+5G!Pi@?8RlKO97l=0P(gRB`f~Uy*f^j476*ba?4;Ig%Kl4<_N{_L;2(Q7zNi zSoE%khZ4{2ONk;TkLR5IXAuQ!&F3Nie2iWW^QXV{R}<70}Mc>g~h5QM8xj^^c+lX zb6V&sL5VwPQf3H?_8VN?;&OoPF)@W%PmK1%r9PtN33RZhz&k(UmD|ACi`<=dP-z97 zF$Amuz6)$mX9Qkriu1EJkY*aM^MBh z)WG_Aoug0~jnEdsT4g?RQI}9U0JM zf2>A=!)BQM#`a#I0zb*WzOj82)IC2x`}kXC(2Vlwar!UovIX%^uB5Vs?O$)5>}>x# zJNPeF@&B2H*8P`l;ajlP)M`=sAy6Km)l4S^{DTy^AR)tAiMm7(WG<~3Z-ZrMy-DxCcNI+l4`bG<}Es!Z1OdUC7%WYh6P&iDK63#AYB7;rk$mVqyhG)&T* zF&iIFSj0{xbDlQOG?k}brIm9d3DGi!wB4K~Dyx;Vo(bpOV7P*u2)EE)P-Z$VoP?K? zZ=%{}j2nt!Qlj5^m^{E%xzy3rf}7K5b&n;+uv$Zhfn}Q59hzD03}GXg#0k)!c5&~~ z+uGl*;O=8gLJ^zLY~|Iy!jY3TnE-+SIO$%~aj8`gkFhMUcpFCC_c|mT9>^t at xpqMZ zW5|@04TGxOp~c>;7s!=c)cpF`Gp25}xzfTKahOP7(cS_|G>q4jb62_V&Q*D|o zFP3H-e)AUQB>l-l*Jkdx#>wa_USegdnskZi!XlyUFq1H#O_(7 at 9DypjMRTv-lE6DJ zmMWD&PkDikr&vfbp`#`$IbsCL;%2xD0s)U1h8b)XVf#_(UdKthk8CFwY;Z# zJ$|VdfAdqj4dVDVDWm2^n}?+=Q$J)(FTHFi3kAwilI4k at ng1H*+$o!2MX=dLfV*m{~;LxtKfqph-bKg78aQ3UR#uvac%DHrk{u5k0{nry*Sk!;h-9C3!&$?X=@yv zGEn-(fXLR}NeCU4ezwFnw6}0*^Q_=S7RFtbpqrdh=e{ zxMkg02@JKM7ykyWf9 at 3b;8l zkkI+dB*~-v6MWnMT}S>K^vZQ{7|W-L<4UX#n at 6xgj*xxG)1NkO(6--sA5)}7*BYBg zA#C9w1WZos7SW_8^&7Z%DrJbYSN7){*}s0I}&s3%&Lrnl`^{EVT9Ywk4{P*@sHV zl-r6C5MS5qqt{)g=Deg)CO4gB);Mhdola%buaI3bL^@bHVnN1Mg_XfVyw_v+$A4ZD zI-JQdrl at t1El`#fhh;KD&CF>Scv4eUpj-?48$A-*OtFy+w`wLM`aHmb{Z8iKab1erss#tri*{gKeulsK+cLq>yb at a%y=r0HvasJq=K$2w=opnv)4M zRQjE)Q&aI}=v+{Kv1u$UZADtkT_V;`ld^38s#$0-ZSi0mWw{TRO>q7?YZ>LxVae01 z`U@?4K>fi6YyZba+P23oVQl$T8TydvtM5XcrS8CT&8;Ebz2Ah3V+gF|s(Mv*CA*Gx zy8DFnVi)a143#M)&s>9Lymfu#WW!k5cn1?=W}WZBe5Jyf=E854XmxpG_?&!fV~mUn z+s^D#CH?yxjfJ_#3ZQEQI`~xGt;mY*(`wuOit1LE2{>!4DFigAB^6*p*oeK#b+~T zF4OW<*z3`XChm~nhPZ%JEk#A*(>2%4^*|l6nKo38&~q7?8in`p`Y2h8cU4)bb4q1h z^M;>?uw`_d*KvV+za~fhqIrd{p>l)bLHj_zp?t-+WZqW2<>@NjeQ^ubs!^uik!6D1 zTY(GIG#XT8Z{*tk1M}r~0mI*?2%V{oQlJkePq`ZD4MYBFjZ8smji`R9EGwI9loExA z_7NZXv?mYq6&3sXJJ5qFivf#(<`v9W at s?B^4R^o*JP@;B`+AWE8Wd-;YeU*8 at X9td zSJ6g|&w$A=oJ;mlHC at -ZkwGR6p;w#qGQ1$V%;(HuCfd`6{*-CV)8D++7f)F%7{wv= z%Jcjefdug$PtRsc$8a{I&5E?amVW(1ZWMN`v3w`HX(xv7)K+Zz16}*C;;y9WC~&j* z)uPk!;>BVz(@Duwx|rt163QCDM~&sl_|xHwSGRVeRgpM)DZGm$k`7e_hn3=B_~&Eq zE1{jf&Ox at +jqW2F0C1Y`O7L#clW7{Y&E#Q6z2mP^vnh6I7v?JjYwr~~Jhe-!APPeE z?n!5a=xy_WpzpW5H_hv(G at -Y)?mbRl-vhxMFr=;~)=z(MOBNFA(HB$?trhFd2=sRwQOenAl|lQl?!BAKuUTO<%XE zrxCnL+K*2>R;D+}Z8Mr}E=Z6UWDHHlaj^5JH$DiqgFml{1+a>xrsl)ZM$>clv^Uqs z_nUAR1=5VddwT+}e3I8WO_6*mtZN*!*#$I+4>M54i_ilmf(gye{+_Ev^k|lN3yWYT7upTqN_G!2Or0yZ5-cj8fw?C_npYHaLoex{y zql_6dBi2Z8!A@=5Jqv;nMc`{5C4|!Nfe_p~C;YI^)qG+i#94 at 4h<^b5aWH9qhAU&g(`0pNe7<2gX9IHIII0rt2p1tnMSvkOhWb1 zJ2AECPe51 at v?Sp)ad*V_yd(_@)O|W-L7GwP91%b?QQK%G`z;ehocqWx>i8aQLn=@&Ht?Lc)|ERj z*rPa*5y`5?+&tA$Tj?VzY624|`fug!zo*%@$=8AAD(!iTgFDj9&VTw?JRPv!Wr#9k zWfg1E{`P+QlYgKja9>+{a$h(|D}WBnNhXs#5xkAIN$}jw07UbrjyVTIhWJ1yOwt%J zMG!#3T3SbGkb-ER zIg;yTiV<=861m zqE^_llw8XBjFz6j#aGWYpYbyEafzUWf+0fevqEBVD@( zL((F$Lk!SRZ9(Pep~0+zg|xj+j?hNUeh#8(*F~wJX!cOwHr21iBA3!~51~;$Xkiea z{S$UjqB3vIRAovp$Emh6;>DW_V5Z0A)xL!2T$A=4sph3H0hOu4=`pk zrVxlcj&Z>YQPHH at OR>Io4_MCq3I)KH+8~s}k!bfkcULeP*?6(Mtt zLW=kk30QNASTr`(-(kEYxU6r&cW7^N|592ZZeF at EJ{^s#vfQx=!^5&3|8OsBCX6vK zSfMB+8LuGWlgythMkRxy`nsV-Dl6U_x z-C+(}x at -%#tOQEVan>8WQ3TmmOUa=NR^&tY%>RNmXB6dyMK}Uz4n$&Fdb%K@&uT!D z!&aHf)?3Cl0LwaPKQgK-WO-XR=ozXR$qV4T4nYHJB-<>6qrkk=qpR10f4L(}!ZMbO zNtBQIGC`zi3-S9IBy89wRgNJ^%=ZrYztzBK=Yy&GuN^S(KQYn$U)12=VO{dS at KOZf z#C)5ysspy#o%fV*c>^iikTCd!ssS45az!j?T^X>5yZM8tsWmb`efU4RR{q?9)eUfp zlm!1PG356K2QyZ)zP*og{)~* zA6Bh~Yg9(&`3OCr0SDbpbLrOFTz5YQH4V{Z@)RPBM0z2ke=97cGxEHusblXGKZ=q( znjo4Wk11Tt_y6tq1L~_l2Y>wm`p|)ZnE!ts|344kt)c0NB7tz)ZHNV#Nm5l at -(-wfA8JF0(SCD5_w65AL=7%kHhz~ukSsNGY2M9E ztA>iEZsEep^WeSp>*X=(W2U$F8yHCBRs@$l5GDACGpr6dRJ9EywDUIugq_4*HhtJY zr=nXe3VZ(_`_rI5im!w*zxa!$B%0pR*mGx(mDjz{gJ%kF#ZY at tfxzM%I^-s+sI}4S z!B*oaN{B1Rb(MI{(lUVXNFr)h3qf#YhbeW?Pq~=$b;P414q+nb;bn0Qq>&M#i z$0BmD(ohJq*dj#zq7x(JN^ouB(;Dv!B1rfW#f8*Pj1T*7ycn%h(TW5X1B`?#S6v%I zY-z|wepm6QWlFt?qme?pnqZxWwfvw^|VPkM7OHBzsd^dGbtE;DvibYAw zRhEHd$+FM<33f at SUSKCzDfqEf!e)@|y;yz;>KJ~c$*csz;d~cZ05?Q{~ z*ClD0KT)@qG3pSp4kqxJXgDX-9oT=tT;tnokS(%IztXe553xursLXBiNMjcPnPdZa zvZDf;xB|e-D=;Gy7$zJ^))FZ)Q^V$3E)=(aPl9lj&Th;s57SH&Nd>0%Qa}=4Ac{np z$50n46LkS#kgY at UKrZzjOvgugf|(iQQ7XZe@;RNh)fHd00_^m;VRoc$@pQ!5YV=0@ zmPxC?+|zy#E==3l$X_j~1#I0Sn|$CWHm0W`AL@$+&_+qe<#(f!lC8>TQl+8q3i2F+ zTq0s(b%8V=Eg{jUxshGk#ar;Y|CT0$3LbTLZVA?8JAwx2>+AMz57+v&T+e%k-0H!G z-a(F==J{@{nL&OXuZ4Gmdquon{)FcT*)zKg*2ieEXJ3c>aTKai6Z#k}pDV;Gr5s$1%= z;fGIQHi at BkuUs7p35q@9nYs7Lk$~w>PJpZ8t2)$*r^8rk^j?TH+{)nyne{KTKV?tb zS at 3Nf578QX9#u5J^`?6cg{|=(cD2oWSGY0V{vS2LrCgR}rG at y9C5WtxK-l*(S!QIp z0b2**OFXX}qP{`VfxbeI`~EwG`fJfbcN?qIvaxQ36+a^=2*?+=iiR$yHB zAhOQ^W$xCAeK_qw_0J at L7hki4=^e8(5E7~~=Lo|W>mm{<%HIdrRSxsz at 8>b*o8P3g zs*>>!gvC?9+S%jdNF&nmZ_&>PS$hBw4MZH-TNRu=t+(*CIm`v^PV1SASI<_OZT1``SaOz z!`0dQ{j|UUM1P=3(_t?k_l7hkOrvGr3txJd2Ol{KlYkNxDnuK6i@%L=7=QEd$?y$l z$Q8th4)&G at P7rZdPe=e>k6e%)8#o)Fp_+GIqBl!tmfu!`fd*&1d at 0Oqx8bfV@1Rvj zhfq>p%Oy!=sPUE*uv``2%37+kh&Cvf#~eR;q?D*~Noil5F6~ioyt)i{v;iO21>dvS zpytXrqO~y9MC|*dGS6Y81*EGmVsc3u&yj(DS$Jj}G at HRm=Q3cZJsHYrv$Zdz*RPyv z83E~ZX8M=`D5=`s8J1bzTk1_uBG;Eggg{jpyR at wC7OFujSAK1821P3DlZJP=MK}eb zuFZ=Q?Z;1+JnKkjWF*U%;B`|PO0um-mV{d?G9=4}zB=Y-yrZ1>Rp(X4BUh at h-s7km z`s5!;rs4sre)71)&jV9c=e7FR2O4|gl;PhFV;3tM;7`PbpUsSCjAgi}<7jAXk@}UN zHqf>Yw`JJ0lf4(n$@DjWEB2>B{n$ zm_v_ Gfrv(VInd#D4EywAAg`-?ynI2>1QB%Zey4{En7kxZvWQfs*uQpHP|B&{M zLB90OmT23yZQIyw+qP|UcmLbAZQHhu-PUf~?s;bBym#)rap#;?}cp3nd&PJ zsAbWaWog?#7h{k_g+_GRYY!moX->Jd>vYV9ii=@jIW`^EtJzT_U}jSzskcbF2&|Dc zvvZzzLyh~`Xu{g at EzDhL&n_po4yIM@%@a5ujJ>bruQ0OWFlD3m31oLXAZI)tt36h4 z?#+#H=Pov5*~n&d$T3^+FY()Bi+uPBHda&ZYo>S`debgqgJ5mW!@GUNW7EcCOClV855uz2 zt`A7o8O-*I_xIs`00$!%Q}^LL&pXr4jp{Vh{eZl zp1s2XPWc8z6R{{QIbUO(VKtb4E72LkA+A4=Oh^GZVlkvCiS++!F>ccVDyqi+Kv~E& z=M<#SKCZ`ZHoJv7LNkf;&xDt8pIgOxXPV?5W3kgJ>J{NBP*JehMoq+T at T@Q*m{_M)Yn>U?gm>se+PIS} zQaK>3S+25gJg^SNJv&tzcl9)xAl6+LJamyFT&r`RR=CWoIL$MY+l#Lan4H7<4lxUR zdxy^vbjFVQ?F_{P6KES at Fp$3)aVSM55Ol(Hb-ZpB&Y}=7?+9s|S2C%B-!PCq{2O&O z-&-cibmXQyM|3P_m}WR=yr}_2mopzYqSdHM3eNsp@?%(#`c@#TQ0_Gp(86f7yCy zm=ide{d~B&2>@=7mIedfirynVBHMx?jow7Tc=NVE67ZdldqBAsX9_2WoLw-!fHYak`Ws at WTYk9Dd627|WjW1H%ukxdP>Pz`zcXI^Y3N z!pLr8)}y~XNnus!)g`>nCM at Zraput)4KeiiBbvAC6gL~K#Vsz!hzm^TjCSL)+(lEHTyLY&uhE^R{laeTeftgzpeSm z*wkgMD~jfMeg?mSmwQKi-)7xfNEi2z7gN93kn;ka-{LliXGLz9?WG7uj|8J;jGhL8 z$*}@5+K&V0yv89LTmUO}L7Ikh#%Aj67mI6pW!KB~G2R*>qyq}T0f|(Jr+=UvFJ_QGEHlMCQ1w`V7 zfUk>o-qa~6 zQry;|RCSMP?kT|4zHuE5X6BjDcL#1woMZ=*wDIWzO at L-5hbwTd$Na<_-Zn)DGBrQr zQKAj>JGz=8)=>v%?OP at v@kf7eCD``T{}I(_gyzhcvzz(=i>)Kv6VZm8IELVVxX^t4 zH^{O~FtySD2ePPO{;MG&c{f{I7g-}0*MCPWEfqX7G=6^Arg^duByp)A;viFw^k31i z(Nsp*6pf@^FNd-wV at B~C_e&lLSHBg zs>-o5`Dyp{JCmkaswr3;u32lUXfq3H*%3U{swywfx6X8!U$C@|Ky-bwkUxG^$zc5; zKK_G`YZ}R&+rs_*Ue$GR@^_^SpsJ6W*f+&oaUx2_(F_uiM0w48DzPcSwOB2K at 7JvQ z>Co4vlXR*Yf^Fc?K`PKnGFAAuOw&+koHIc`2dh^x03(~Q^HlXU&0W+HWdt>ymSeb~ zX7nta#O^GFV-4_;T~}%J5F`fkim~LZi5)o$9-F!fV>4~E&4hpkZ6`@toZubunaZZb z5T{9YAIY!6g45}TQE*eU)*J%Gki0WnsrCSB_$Ct1&tDaU?J=10um=aNS`FKrD|0Nf z2c2Erjat?6kPjJG<;Dw8*LpK_s at aq!eusBC)#>my3VMs8ya-_TIY?{e8I-nvxZF$l z%TC4S_GP!d3m!}O8MWtEx6++^$iwPAJ6HsUC0KG{SVQcvzuJip2^LwdO_WDLWu?dU zf={pnQtyx)#?v84OE<9nmgil)CttzxSPG!~fETeFUNWLdc8o-R1bb93NvuaG&73Ma zRcbGjIWSHtqi{dnmCklzoUPtIIdlT+n%nerThpCgi*Y_?qYzt-^JTg-%{M-KFy1`^ zl<`jDfKvVI%Yri`RiB5*R$n1#yrqKIb0O{uymx&(KMzTLF-hbQ|uF5i#pu<@^IxGOOexU zx;8Uq^SCveE|L|_Ino0u at EQzB;4uI?j;IrV2z=xT^yWtBwJL&Ow#i(k!z2Pctq7D9 zw>0z_TV&`)mgYxnI{g*<>hgHvFXF3)7Vi-$$u?vWjKESZNfGHmeTwIEg&dkqxmCz` z>;~{pvI?)oxiiBb(21=s!$0xvx$=o13w33lz>G0K($;8Jtg at Wwy>`g5V at u{mkweMD zL~K3?D)kTgd?feQy`=TiP?+}#wz=Y~YXy at 82Py6bGKxFXLLnP{kxYbQO!&vAH#J}X zt-7o9cf_O`1PG`I0tiU-KLsldGh16>GfN|PGgCPuM=}{RFI9*Cv9d(O!QS1>+11SX zU&Zbcwf|`ItUXiVwStQdaLz}r1!q&yNY`|Oq1q*gN`7_IXF0d`*wn63d}(Cp-85Q#Wx%BGZu@?(Jix8c{z;jzz|f z!Fgv*O;auyrBmTQaI}$mSg-2;)l~g*1GER2aoUhhoUaS_^Q&o2%a8pOjzEc%%p-6PoBY1d`vIfdiAKQ&R!@_+W zJF0$NnNGni*u5w+k;$}@?zEkw at 8jP_qE-5}O`2u+w7zeH7ghQ}FxkSjWK6 at jaco!3 zTYaiy$NFeFjoAz`R#MAn{1I}Iz1(CE`=F0IGB$tCmt2Rcp?3LmE^G$QK34$l(hrPK z7~3)gu03v;2s@$vv$Sena^};0uA(5s>9v7OPcz at R;Mew7Z3I^bf5z0|XG%J+wCzx} zWV1PEqxLp#O9WJ*!Q2o|3KTjTM{++jC{1%Mf%6vT0RqNTF3qJKo8^dMHz5`t at W~YH z+T6VmKin*36mK&A?L$Yuo0 at t6BYj53uCnb}GmCpZ__D0%-VK at 0(}`e;OW$Y%s>w at i2szjPc&D0^5l*TU&H6#5;-mvV>ZHCV!2z(NYc{K)&Mv0i7E z^-sIl`jyLu-hCy7T=ONE(uhAm6D&aHQZHWeMXK0`>>7z9?5$Qb)RW|hl0lL#m$>%H z$`^{Qbm+Vm5P7{A)b#60!Ty-fBhIS9#2z3k^NMb=~N78WnuGFW#*Vd=D zZe~egmyT3dw608V!{9$I at SbMM*^lXND9UOPpPX0loH=3#^w-utXiKZa#&L6#H<1^i z(Bg_~9Wvvn!{tPm-X&sho at BPpAf}-D{|W;08CTkKnT5hx5mYJ;Q?{p_5iVC)5jE?U zZmDD+*B-+jq_>b;m}=-bKwda7I(f_gOJjeD?+}jSj-O9&%v2pR{>ZoO?^20=&)xYO z^}6Kd?~J3xM at Z`<=Bc#8s+U>yt;WaNAa=~f7te~(+N4Oyl+4;wVg(M*P?)HB(}!rm z*haqiq|*b}Iz8hcemY=$IgjTWxI5Ms^FIoHpNIxB7RW@?BQ)PgjhGOUzE5 z{7u0(oE$76M3oL_j1yPlAU;4RVj4qepE)(yim+6=ev&#v516k++LFfAF6f7a`?j;c z%{F%dtUl at 48OWg7ZA*bxYUxT5*HnDnaf) zvQe-`w`Y at a9s46H`=$3rlNnrna*6S(XzWa*2C_KXaw^>h4A361?d`0wf79)|u~uR0 zWR}SE*gkIX at +`#ESKwzg|^-I*6U!640zX7w;+e0u(>vM%3&u5Hn7l{VV-OkMPIJl# zDtJ*-TKCSai}dTsUs|PuGTO+j$qEjS)r(i8Hu7zhcd+x15|s$AQ{?u(D+ve`}-uRyHM12W>BKna71X92y`s?2T*f!vknq>O(`zJNutCVSvJqf|<)CUGs4pM9`p&{JKEB?x2J6Aj at O1*Nl zBeI~Rqv=KYMlioP>EaY>5k|$3=(`cYAr*LDH-uFUb7VKIcbfX&rm(0#D3=mtF8xFU z at 2e641DxJyY1F+%3HxA?#rr>i{!NqD*+oDFhamuAPI-j}-s)PH6mp9EwVZ!wHocI+ zz+hxe%gVIcE at C}4{@VNle89T(%dO!lHRuq_?Z_`W1$k78W2r7o5&b>XvK0R at Y){-I z5Jkac;o=AO-&pD1y0$6*#Ig*u|7s9K%-+pT*y?||p~i;+o(B4ld?0=!FEKIVMttTx zhn10+?S%v`Js2^VHVTS1Q5Hmz`+AQSMMjR6hdHt6=5n*Oou5rr&5ebhsvH|}^Frpi z!?%(@-^nZ!Zxb(3ecs$w$IF&W--*v$$H~^8pU;;sL?FJ{fU0t`0>hvzG5cD_rr{Yi zbOTA at 5zHh{U`C3C2%Al*PZUlAj7#@`8M~gT&r^3)yWNQ*qgCr+0MQJPw%DYxPOCU3FeTCYQ>9_!JD+ zCKA4QtdeTgjlbcI1zB23?r at tty#B&L&dLL^$eYf(+s;kV3t&HGd;O{-&M}2pZ5VK4 z>8vC5W`An07mX!^%tDvD}|3M#5}f0ydp-MQ!hEC5 at 8S$mBYwI z^^bVrszlIeORtr88)*M#pQ^-(2Q^^~_g7Gg;H?K^hS>I`ZwqL) zfh+I}NaAk5fxZ&^4NBCt12Xpg?3Z!j#d?Nk!)r^iX0V-)$03}qqew!^pX{A!VRc+> zbIxYonV1bV0lbnvJL6VUi&D-f at bZB(VyPI`05_#%g&Ok at k*9$wg&)7CE?L%#hL$b# zle9-e{%7km%Y@>_m3Ji@=Bp1YTf?FR$qy&ZB8026=*`owr$x2M1{DHz>jv9)W9MrW zF^vJ at ya*!;z6H|}dbKU9v~wvX0MY(x4Bn)OjkC%SKgAdEcZtv#o`@2uqmoDvW(HMl zSC}MGg>H4})T?QHG7OJ(bZ)~obC>a75gMP13+}v)*%tad)KV|q=?hpAMmbJ~)VGzs z3>}V0AS)aYB%vHau2CvV)D6tZy%RVQkJ=7 at DhWa+rA0+qhqn_d&dq% zYULcF at 0=#~(?$w5l?l3wS~;s73~G|Y-fYdA+BB40^4j*x_1bn*dwQssknxPi1yl6m zK9Ld~k{C|`lE&g*PWfw%jn_`u>idI2edcYK{YpX|r^X9{2CFx6Tiq4 at teJa^gxs5` zxYZ5L$#3>5Zm;1oUi3~vwy+-4NDy>nXT?g>G*h93RiB@@r&B%Q0KZc%6 at 2S{w_0Sj z^U?*5$N6?nwrdey7SCw!xT!mdJ7(`P%kRTSzWqHacO%|3@=V{vQu75#ej+c-$v4** zeA_PKnMakZeDeHI(B)Py?L{urIaVJ!mNnGrC-7v5k{*S(XNIM$mX~6U`Ckf$Fqssc zOH-1r8t`p_HrLRWSYouJ!eGyaP(zQar*S(@(V|edTM>r#Y(z}rh$&`y{kWEirxJ at E z1-WJLoOOo09zNaI_+(4lZ3)sZTL5>~{N}7ruxzpy`8_20L#A0tZF~Z((Fi!xIatJ( zb&*Z7fy!0O{1sHor-W3AC$h}9``e0MDV%E7)NiCo9nmv_WV6e5p&<;1^~UHN&cz!e z%rDf?jaLL5T=jYB;BA*nvK9(5piu>{zzh1oY!_A1ozwmX84vx_}0m|+gz9=ehukJ zq6LWZTw=7neBN at sLM62yY{iBPy>Pvp|7WZiSrPCh+l04?QH%DvOjck{!3kYsbFPt$ zzjd<*qe%d#ihilUX1+(K4>)AySOfg$%Qmq=M~Lo#KAoW;hDgRD0p5f=%$19OsVCir zAI8a<71 at NXUCJw)kZwMZ=kN}N2^_cRFoC4XLxK<2I5mnZdxorRN2Y at 87B2lE($Y=& z;y-^A*7Q>h=AIp=Pc&7(l;%#_5>{jY17Hc87h`Kg)f at _DHMgi#@n`s<3-DGI0$| zJa?ca!6=D at IL921z{o&M->0KR{2#aBNp+mYn^$F2vXql{^AP1VGYBj&u7Cbbyue*B z0lep**zS)B1Vr(l#&#t)v;Su$VU5Oz3$6zGcdgk)gK{>Pf3bY_s25wx6$Oc%(*Q?7 z>tQKOZO*X0EDDvDjEzo1_k|=aW$CXVKxV4NZgI)4si9vY%y3I&rVxOW7Lw$F{1?+NcoZqNHjK)@#|5acZ&IA2$OTyMxaVoY3<&y3nK3lToM`-q>L>Hfi)odvk9*~(%_g=vyB}~Xgabu1W1sz at x53xi1A&V7o_Ec6CtMju6U5cVJ^J>*h z^I&KOGwB+D0_amS|ZKhm^ozZSAZ>8q~ETbNT%1?3~PV zxVCEggpoJl3|lv+r8ToL*F6kRNl(Y~s}uEgdn5FtG#TmDq3kHvIuAW{`{F>$JPZ0R zAOHGERHf0Uua)Fn-ppC+5EC_0)!o`cszVVDKv70=f)OYU4b0r=9*u#Yi6gsg0`NIJOjrY`aGRa09^0W7qg zJ_GWJi5YA)h{s=Fwd5R%Dmbnct?>-JAh}YnwW2WiZ4Nz(?ROpksqK^`Mj?hDHJqn6i#^T1uqNj^aqe>1;A6@&FbGe}PK=aBTb1dlfM1xPyppcQWU1JcW93cMTfy4aUtt`}Ev&ddR5jx| z<6t1<=?6KKjQ8_uU_&iz>EXR-v3zjH?c=u=xX0czdg8ZG*5%7 at AXi<&t!qQl z)pXg_jGgJ9UtNDK?ZE`owifI&FoaNa77OK>)rTekArc27vmH>i?qfx8 z+XLH8WSQu`IBx-nKu;+GKUOb$rvCVFzTEeFLset?mF!cAA~PVIh_tTy(AE4dv873z zkz~%Y;Q!-WXLjnZppTZ722aaD!l*BMpGeAhg1rxZ-*`G96M(G`fu|1veTf8+_Nt(a zj2Y?XGqT|~w8DReE89V^Sc<4H%z at D|taE#^I$0Myj#G-{S zi=fJk8tSmOiBY*Q$|hp5j>r)$b^LN&Q)`yh9Z6m7%yBs2coOKV<6XzI^@0DI8JMkY zJvO|@(e~p?GU&New}{GH+(2x2!f9P8q+G^%=l+~p-&(=x1hnGF>cU0-#TB$e(08{y z9fc4GkV at +l2KA4j_=M28)8Q!IZAkmf6?=okm?O++5M-_wL_IdR_5WNcJmdO(Q#J~w zA&kN#e~^rRYxVsRh<;$@8(&sA>g^LUwrtUp6C at o6KmAR%_Sx)&1w9E)AGt}L(w60V zX&t*wy^(Y5LqB%K5yYA-lkh9b{SL-%syuZI>d`HX4k3*8P*F>~ol zMN8}?E>k3J-W|QIF9Ltc at -kxFi%QTTM$_~|lm7nEZVY3Pv!=G*Fy at Uc+gJ@afb_C2 zDLH`YF+lm=Ao+(A^b_$K`E#4X+EMcr39|(Y!wm}^I68`mA|#lVBswJAP}+95dL1n3 zun3PaQk+&vrMisEFK2{qP_%JKI-|OQoYG82elj&XnVy?k$62{`ub9rJ%og at IVH8hA zQBr?LWbrPao1ip1iDl at g^T}LMFo0wh_}|4SEj?QhLqLFlS|EUcB>&R`fU2{Ry^Fbn zvz?jg|2}m7|9YWrW#;j(DIFaL6eXl at g!vNKs*#O@&{g#kw~pkLjbX at 4iVbVw#)UAF zQBKVDg9;z!se``;R)rjQ1B82VEVEjvEy>dH0!*wHy%}%Ejr;#|6?X%vh%j>~nY3_n z=sHSaVo2(+AH+n!kdGIO`(vw(jo#XocBy#j6;CnUl60uBS9-zCXGURjxa*W<-(Pu+ez?#INR#nc_n)(EM-V^2 ztUE4b%V^SuzFGIsWHWyRj!!ZX;eD;it6!XVg*?v<_n!m(M#0M2<4 zgS81aJb#$Ch@@U%A`B8R7M$;BHP3ht@<_FzqfPhGa_|-=GzVz*|HrrX$Q=1PQ+$PI z4of=oJ;fWw>88wW&cVZ4ja|Th-igRaWDXFB>FV!I;Y(G86 at JN(;WlRgM-a at Cp}SC~ z^X8e%H={X85|8apDsw6F;T;hy|H5=6=fa1T&lI}+H%7(rkvl2KKbEcu_FqZ&{2wj- zU-AknHV#WnX#Do?n$q)~1Cu7SxYfUO$fS`Gi7TZnag>Yu$<&`C80`C!!z$x%NK)w2V zH-H|l9_ab9+^581pVuY@}Jd(kVxL7?nf at okBZiJ-G1!k&6t9-ur;^0}FNa;>RhUH|mqKZ!d_A2!f`|KX`q zt0eUzvbbyd_2I+QD%Bu#Qzons!H(047b5*g-(Mn7jp_{=h84Kh^?+U7w)!5qD51^E zC1H}H*-z`qWxdy)bku at qSP&wrC7z;D1P zKK=(k8<77i*^d8{W&NvdvH9Pr+CO&outuP0RLjEPIxxh*$~4+k)RQ&rDWxrn-UHTY z_5H$)GD+|yY8N#-Ei2x*qu6721>Lv#teNV(hs$NNuM)54zkhze=4_iym>C6zWxG7{ z?*4tzQ}}+rc at YG1-P2*rj_*z%WQ)r%zWjYzVwOtpqCcEq2jo=I=8CMzh(sd?EOxGfBP1+H(uHmm+={5X6)-BiCJz}q7>yge#O>7(z@=&Y5fQhy&r6o4i1N zQsrKoZw*XJ$+4nciz?ntCp~@L_QNYG$g4_zmB8WJzF?Ofv!<_eq_kR6 zMa~nkq*qb6>X{P*RG7&fk`7OK{1^C(*0(+s;>J3D<51(askg+kD+>jF+Mo76Z40ti z767P{KS{`D1E-VO=C(}@Jv-?Y^AR>1ftl%LjH|gIICl(jIv_hD;UW(hPOz5!Dj at Ik zjC)kxp52Ul;G$s7tn at jXglREoeoRb+j;Fgpo;yvHhCsh%x5MzHT~KNENPVYM6+C at u z_E@)$oh15CurP1IuVKOq^TyIZdI#5R-^710<`z+G3()jjTc&ejM9PO#Q at c`7kEog{ zbFfkln-{O^s;;cx7LU#_(jshU^^oEA+NwT+9ZbfWwmoTLPORn&T<)GX&sf)62Sj}p zbJs(|Bt;#ZBpoOVD>pAAWkur!`}5klvvJ_jz?`vdS>lM7h{5#8EVR+|U3INAGynQ6 zL6~rPlg3R?8u8{E0tx_H8H5;W at BqE0m)Fn${gQEA{82;j(E3>H&FjVE3S`;9b&8*r zbImN+7V`1h6KMZ+3yc at H_laJc7jZ1gT2s=Qi=@jX+K7L?;Dvts1uHF0PdB%{X*TIyZ!G< z03I#IDCNM?JDm|92x8~NvC?uu*y;9>OWvif)MLd}~)R-MY?Tiv3M;-;_ z2P#k_^0`s+Z9qZUcr)^JLG!s#p~cX!fKVb`4m#p~mnB%_qNX>Y+1sl at 1B>Vu#y8BQ zewn|4(3`22PMb!;;RJNy!lBhhk437I29skPjV1XjbwMb7-YFN$c;8&s^dWS#g}p4#J?T62quZjU!{DQO>L?=v_0|tmP~)yWY^5-X0TpO zg^m$ojXG+ow6jp1rk9fA+_JfA5X|X?dQfx52>QvjoOty9eIuiFY%gbOZsWH%KKDl?E~4I at Gzui%-S)i!#IuO z4#@0bqt+f@%P;$&htvf9ZfhLu)?g9Tve_MRBS(f4_ at I`(_UU}xpz<43)gwTy)W*dV zkMq3ahQ#3ta9u6 at zvmy2H_C2h;6Olxh(JKR|7q-$v$B^n@>F!Ta&WeC_4*&>NHSqJ zD_hflv1D at 8bzD%*u>3isy6ie1;|YpY5k?}dV2b||Wde+Kf+02)C8-ogI_3IGVY9Xy z{}{s3cnW-ix{bo({~c9I-&gE+>b at Ox8eO;>?c1xX at 7-WO(N7z4_=qaR~T$ z8BhRvzqO*5C)SGMDE?&2J|1c(RM>+PlbKXZtp90PccgK5Wx>u1mx at 0?;egK) zpH+wV(Or3%mMND(`Ltr?Ez_>F(?;14XDClwaokybymj2~HW0Q`p2DikX-f}@O%z>N zR{Q}{qOtXlEwSUsS*}HL(o at e_YkaG2s*1G+m?KJBBBqL;6Qu3oa+F218i}%MlH}zW zt4rrBo{=#bm#X>cwy^bjAo at L5rzR00{$=;eOn{f(VoGPPuIj)miV`6;HRLkM#Lfw| z%3z1jbj@*vi?bdr=MglwDlPc~OZh-I*Qv|>wS{f7hjE-rT$B=_`#j&e*vh-M1)N~m z-DO-8r#jtTZQ!8{v}Kl;H=rX0b7o^~=DiVlmeX zq;$$}L962$Hr~>^=hlvpy`Jm{?VpNnBO5IYP6iw97-j2uCRv>pc5h8G*Azu{Jz^+C zW}TAPOqk>O+WaI$MnlB`dA^Y_85s9`JwOQ&WaU<>GIai)l&xC)m>ISMRr*+Pu>NIQ zeHonsb$f6X-lH701GOjanyIeFEy9l4Ey0e)EwDiHT|#i&T|~%lbTJ{}LvI6>CMwn+ zGPasZ({o8|hIV(?+smWZy>Tn=jUJ)g1HBRFvSmEjI4wFmoTW@$QgZ&OMNHJvobd~u zx}yWvQ-&1cEU?}DlnGwF70m3t@|r3UvT8>|YfblAeMy!=TNwAcN>d&Zs~GzzbPk?A zh^qn5Zqti0*;QKl-=1RIB#PA#TE!iVU|(3(4VEiY$W#I)X_o3U+V>b6Uh_df zj6xd at s2^94N`E5V%F=DD#K`4LFt2JCFAF+IT at lrY=kQg-K<@E9h54h(->_Re_WH!u z^!emWa4Ri80l)f4m<@`6cTq0kFHt;%;c|tbkZ2`ha at jq)U_CZrX|4-a5H8)&mGwe1 zd3ysdyMXgNklhLpYS(9iNuJn1cSQyeEeB`RVAwFxEHT`9VW`-6J#>K~Ibs%6l{%@qE}lxeMj{>9xbu zzH}u9kVErnCxn#?V!~`w{A>fl3O9(hMGh_J{Me)9gjrGa|9b;U zL~;SW8W;#j3KR&4 at BbSAd|54`54Aw%PUx8 z`7U`2bJW0@=NFr4i_SC?yySXZL(|4n}bp2}K!CooLgLG#j9ZI{mr>2$B^G8o! zl?-oht?(C39CSW`ZZtoip-lMLvNLgY(!G;f9UI#o0z%P;PN_5xS##1S{VsykI%Mzt zL=f2`977cSKo&m4IB*X8)w=%6KD*l(o7$_BA2npP+GVhp>OieE>{nxvxiSNSJMb$u zkOLjjUCXHEly_`VzbmlN_jl;XU2Ga-zzH9$NOmFF>|PXMI`T<5lm5(-rav%Nq3$X% zrDp#X^6CNlRG;yi>0dkggtQ`FO at a+{n%{W#LcS_a8CLOOPM_&}%m)Z03wX?=tkuA--^5n=aZK at Ey$A`%h{&PNK^|R-d`}w*2 zBc^+vKAqoWG544E=jCVjC-3jqPw#^Z(B_>t(i4}CkQ_&NO!|R7Lpa|o_#KyRF1 at 45 zQH0g?4A|`(5sg!>fq92l at S5Pn3}&z=%s&^7!BIrimTyFsMY~sO7Ng5U3Q#Xj{~BBJ z$yKwJPDeCg)RabWC3WJ2RjVncQ{@ehzfp at -%@$X=s*_DMS~DYCDZ5n;e#WDr#OLvs z2I9>WCZ*g*y;b&7K5yLoF9wSZKdmA~CRiNzZD70kNqC%-FgscYosmBhr88Dd2|`e> z11ok(&$cQ)Un5dg^Xs(*c5X!7Et`{CBLwg!a#dSCoc{I%q>N90myV8Fq-ZS&a&mDv zuar#qWJuX3d?&|av0F!OtQ9S2aI7)sW^!FlbZ$(K4-D`2ZLCJPhd2;TXQ){<$V?5E z`hPtHLd at h73XZWaqhI|I;5DFvn at M+fVCV_(&PL#sZ=fffo=g8SCob8ivXjkaHji$t zPMB(jkI5?_?Yb_`Nh!QKXt?-OubY710H-ceVkf__5v04pS4YfbQXE~FK>>{MP}G{j zGc{W-*&%L2MLLV~J|TJTt6Zgr at l8k)TF7I9+woZc7?OKuX?rWB2TEf$(Ki$8lVv!}X at dW1!7 zGMY;Zwdp*@&pC3IC at WD$S5d at dta|#WaDWC!7cKpX&C#-hH(GU)4h_enMTL2zX)^La zRoE(xYj<|WT^MgdVUzkHf5dyYez4Z=vKvVtY>Ald;2WuR?}Atq34RZkSa;9`SQla6 zs~bre6CosiP!Z~-kT}F2Z+`x60wpx=%^YeBi+LuT at t_1rf0P!u8)vZXRvTy+!3e>Q z*!FOAj~#Ri_hd)O9>82|GzT}PVr~A-FK>8iD?r+J at L@d ztk!(bP2)MRT%5tft6U5+o8b`&twxWa>Gn;T}Wu0AmuR#zE*OBE+_|HL|RwuR!>Nx3W2a zNXVq6IifW`6d~~PZULkw>iA%1ivq`GdR>}+B5V3!h_Ya6h?C48CdZ$|8CAev{LBmW z+iMO+ at G9_G!Ry`JBF^I-qIv11n8Js*{A3+jnY0$4w_&rO8k%QCfpkLD^+FDe=dqr^ z4^`kwTr*Brq{T*}?1pFcPKLx8_OEl`4$a^{A!Bi{(nHD1*{0_PLzuG}H at 8GbQOM#G z_U}gDgu#zc%e)dTNO%;CEhh0Lsu~wbC3(^ilq3iKE1Iuu!WeY~f20ZuqO|vSQyZlAqBB4EuXQH;b6cYul05<_7royLH`_0(3FE;Os8EaCGq(|7 zG-9xWg(*}HBVUE^SB3bz!|s=+BfkYRD`AO{ZqAwR+tyQR0rt>UwSNV0?z2bFctdlxEEUymhT+ag=Ib@ z_}-#|+xxH|#%om6L%sF>s26oaNY8GkbMMU;gkS8{jBdX;6LzE6jS0_3L at Y6SEYVFn zPlx;$;(jkHM2h4hXa-A^|J8)^Y7XPu5b at NU?8!i(rp8~9R)s9t!d&zocLCatio7Om zPF*Ty8Cd8EJD2d3`a+VBsnjU(@GRl+1 at 2w^P58VA8#3%xCSQ0Hqi0Bur3z_N+}ua}FmZ at KAM$TpMHR{RF%rCi9tVS3R%!pzK!W at 5IR`D# zastPdQ5JSHsUdB6LuWmtT1|o-Er>#^6wS2W16%2b>G;zUb;19MpQY%2qXssHAH`ooqOI z?OEXF8(qw=ALat`9qA4tji}eh36#eM+V0VQ^frikbo=dWt?A(8SM$95Ax;InG8Np{ zmS9ZGkg%LfYG6QNAQ+eK8RYv(;yoPOb$8J;bc4K(cQcG@#>kp!BB_RC%4`hNq(AHa}l9O zZdUn`2Yz{K*F;O_;n{G01mCh37=s6L$3NLYh;&D2ob`(Q98OrIGA+{>5l7$T&vMIJ zxzkR5AaC}}T*suVNXQH?YcVv at qoHJA%^NToEqaFX=3;6UVjF}_zA2~;Uf2hNTqcR$0Ns at KBq{uM<>SNU%Cu))FxlIkXG z)obY4Vs(N`3)Nw4iVny_miQNt;=QyDQXf%UUzpv!HB96yBZ)7x at E08AeOTg!wI_9{ZaMjy<^En!?;_?33(SD7ktnVP`rQty at 0 zF}zw#_Dg)&iYj_CA!S)#$r*lXJ~;2wKGRcvke;rbUY^2PPVEj%?aWjYdhft*Uq z`D?KVTK(|{bG!Vc&U_!aM`BApR7x3r{=@ITNyRSsF3=Zn003gd|HPC0KS{;^S|y!L z9SxoB|K+>0rH|u=`aAm-s_TkLM+k|KKfy*ip(o_u9D*Ula)6{rAQ>S^sKq=jXJC+_ zX%+^ds$JFaj6@%?wk&PCoX=`y1sr_x*kFJEcrSk^y63Hc|14_DWA5sziKfTKcl9;P z+2`cj=k)#a5_jA8=>>r6&K`|%h2XPjILtVfj4TF5r~KIM6~doqv;j1QMtw)bH?wT6 z at uF#_Z}jq)fKNSEeXxAsbm~5Yq4qGU`rZnmE<`b`gP<2h47hiCQXlewrgyS+E&W3a zv^Un;dx3rZCJVJa78_M!U;FEw4gV4M$D2L;HlzXHsruuazz*ymLX|%rVg58H`dT6$ zjC2_T+EUmp=D0rRs^yecU1-E~D}!a*(0G{4Zfm~TRn$7mZAN8l!^3#@EENHZm7I1a z#|;M3W#n^g_Sp at eyhOlkR0cjtOg3ONKI4z2y?FwKc at uAm={De4E-r<00b5nhV)aDp z67te9T?G^qp}g~q=WKdQ-8}Cihwg=3MnGpx8%2f;#fbCGM^XvymFlU& z{rLbTEwd4gf{zG`ScN)G+y-Kdt!iz(^>nG%_b7GLX!ivuPM@xa|AHdTe-W2(+a7|La;I3m^v{A%}LzJ-SfTBjoN(#B28Bigo0Gaf37835epk6Mw^|959Kg5jn(#j=-gP) zhUrziL-Z@!gY=c1&<BE3C6ayt!1oVV1FX ze!-O%p;foBK(?~HgoRFz1|WOHNMEXgR}*Q<4Ow;BnKDvqUtY#M1}w5uqTh|sA|op3 zJeMKore%I at Hg!oT?zgJtomfK?2WSEHC6|0eC73U`N?Ffgou*n`phyuW8(Q1kS6WIo+p=L zi>TRtT at H#J*{F13229LOv&-w=7}EFxJC|BY?;t zjQp9IjF#J#3K#Lh#q&w`Woh&H(fmN9`uk4&L_7~m!0 zCoODnu*WL?(!GYLFBosHkStwAaayH@;EC)a5`u5UO>bQuf5#O#iG=cp{8lJEC*>DX z^hbT*88 at r;c3fYcL6pt=TmK9O&c*ZSc`VZ#+|E$FJHl8!wV*LtRZYQz{c?4nz3#Lu zOs6^#0=_Du);D}ITl0Abyd1M?r!{i(^}*MzF!Ae${rwwXW$IV7=!@@VJZ at eH(-s}6 zGdMa)Xuny(K`;5B5Mn~J5X-6fohG_&tk;R+9)TC<3cp+!FW=4v^?3>cd4mB>W2Dv; zY02&oFLQOC<_PFd%rI|5=+1P^pVXw}22v_&a&u6x8)Bq13j50#R)1R&H9`_A1(^?jS{a zc6KOFW1m|c-`nIgX3vB#I*+hbCaqV})jJZ>Mi*Ew(rpo3M0rV$$}1(fU9k*D^YaCL zXso8xMVJPB*h2uXO^>aPE)iz86_{Q_;TA~sLV4e zf1xLHsv4W0&g4M>S&0NpxL1mRV-6WWpIBZH^AK|M3=r)zjpobIJNmR951Ks%QC`fg zcb_A4^p*M>+thD~VQB-{7488(E5_iu)q}YXDJn(SFGS=A*4ON at K0mw#&wsQ07N&jx znjNkAh6A4e*q_86|D$ zv?=#8pMDpD97d>0Tnd7%2j;V;X{H{_!S$2ur}9`~G5dOz_mW`O-)R$sXxg{TpROn< zgfN|vPH1Z76}fiGP+Lv@{u{u6x^7nEpLAXjKmY*N|7TJ0FFda-9H1aVh(05Xuu*C% zTC4L3jF1tdV0M1Yq=n_q#218mlLJ5)5^FFF-BcZBGa0801+ax-k=76+`jL}7xVM9B-+4m9^kegU z0mJXTF5Jc8y#>JgLi`>VLGvFTjPZOi!~YHr^?ewCe__}C>;V5B1UbIRgZSuj#endMQ|(&69b z!H|?`ktIPwW^9Q`RgU10ZAizGY=gDDC;a<1TbwFkb

    S%jIwh)F7vcW&@6j#UOu)OOR>td5!hi{Y>*=Jc?4wfA$)p=&u( z({C9C2ZIbhfqwqoAjPo>TR9t*x(seHOAU)tGyKc+F{WWYGs-*x ztIY8iCA#c#qnAhS*0gi!Bgc&>M}tzUT!|UC z+iT2SQIo_7T?1>S1?$`r_wbkWTA+Z5x~SY4Au>>{m-wLjlT>?DO2}#=%pp9q!vQ^X zcmg`pB9kNZYC%W?kukE|APUqTOG+3pK_b&I^L2kzh%p0xe?Y)~ST&RsA2~Tl+^@*? zUV-5*Lz7JH(`}NuOFv2dW>qp8d%f+~9|ka26irteB3-8qy(3>~yHZB>rAexCg`Oho zi^a}ee;41x81vQw4Kn|mDTae&-N%vjj>v-}YvAzKgKbsvDA!cZu5Yn->vNM>i at u7> zeq--_kEODZ0EAgq93N{8Arw0{6enwQN at +}@Brw-f0wF1Wkv$gZfqdd`p=jZ&BFZ1I zKt3R4fr#zBs}}Tn$PcTnKI4*Icj*vfeEV-u9BEw8b3-H)p*aj-L}Z08um$Zx>8v>` zw7yrsC=|w#b at LSKS+eBlCvsNB$S(y#n%Pz ziExrQq{4OyDzxDvaMvj~X|IX!@;OnoD$zfu#8Jz{MfR6zgZa%O1_{zXapP*E3X068 zqP)}yuMcqM1SA`@-w}2mRJyK;12&^cR>UDVA`diV+LR#>#Ck&v>&?mpF28&-r<5Y& z5>AoK&!P6=mC&yTl#_zg+WFn#itt6FR)cCLOdV$_dmg240gDXBrUrcIJgC2!@5u;Y z%v8 at 5q8w13+;A at lBxi!N?g~cr%9pF;J?l*v=>8TBI$;jR at Rv0iByE#a3C|BIPTanq zq1P2_ZWXUW^WARrU5B*`W<2uAnYVjF;iP#0dw=T{&Bevm}~U at k-iU_Ud{3$h+r?!j1( z?Z?SU>_SMBOYz>?gKHu#4a+gRW?*o+>>+pT`cAtX6;Vi zUiXm$!15rN;v#`QJ(0wK5JTCh!zA+*{iEU$r3p*1f_Q$c%G6VJ(-4>79&Eq!vh_6I ztL?LS;R?C+Pc10wv at qJRMjI;|u;;KP80HSi>~XyH)c?Q}%;8if%|S7%Oh~bSr8Vc& zu7M}Bl3h~%PBSD+*GyUxOKOwrt-%JbI%5r9-I=c*k3fva)`^TyZM#tcv%7ut79A2WmjKqhw_`7hf7hXN`+SZG?&ZHa`Y^op;7lYM%EIovmgQf zuX5#5oCaFkc!sJ{UQ|pP%T!K<-v^#da-2qn4>FE}DW&Q5ryB1Vt+Vri8Hmht5Q at V~5R2ek>rN_D7^x6piO0DRN(-$^7^=$lY{nzlO+u at l=i&#*F zsOh3-qsd4?38H5Ka*%a9_AkUkOzVz#aFLx=Lri-4>8{Tadc%)VdBuiLc-uCx=gS_n z=U3UFou%35B{>WC4x|;(*KF=7bDNvu?$R#{o3XUbC=}MID_Lio z=(s#Ws#maCrVXG{CU;ldTUBh6L5#N~M1&$~{(Cs*B4R|mdSmeapoWz$z>ubp!N^s^ANE5EBL&DP*{LPZ)FZGrO(A zK5#a9)`pYFYtfAw5W>{=Gw#FUu at Q7ueDZA~6NZEt?JDfBGM<=2o*}GS{D0l$qm9IT>!=$ zcdY|t*;*Gj6`f&KpuE0*%PJR#R=h_m2Aq&4{rtDK5F=~}Se^gSMj+(>mCODQZs`82 zoy)g^c4tp at Gm!~6BNV!fZl~U`E;O{TTm*O#k^x}D9`X91QT9b-Z^p2=E~7w#FlO$X z>M*CJS`GJi%Y?gSA1muFC#&V0-_QLqZGbjkr0A#`2=h_$nK*GASQLv4bdWkWD~kno zk-?B-li3_IS-M+p*9~m`M~<*|6WvX9M%JZsx^ZdI=7-I8>m`Ne#8w-<`sx#eCT(kN zChg#Ko~%;oR&#dvluI18yGyP`SByWctd~u=uug-mnrx+s7GP+% z&e>A8Dk}sI%!xP4G~$$kD$;@}z_?b_cb&VE)0u6EX*X0QtWbk{4AL@*2VDh4r1Na$ z;N|h*MZqhwC>hOZ&j%1p=mi%m8+$Rg;;|gE7C3|mzgdR-&!`jZvRtH{yd$_Bl*1Am ztLsDYtR_b4nJe=CQB!TYxUg`Gza%jKghlD9gtuxtY?V*eSU#@22<3yhOhBu)+0hDl=MCbSr52J zCAkGH1O6MIgsO7bF7txKorDW9A!4L28CH)=Z#%TV0cD(oMYRpSkWHandWX#qcRBJ& zy+-}JEn%HkY9u* zlwQ_q`ji(5dGYMMgYO|k=I{mtfz=5p^(RT4f+710A&lr^9llZ zkLQ(Qn4fL(#Hz7LpakzK{<|Bf>4MAa{(%k7e_(^{f9;0=H6@#&cu66nC zKTbJMSkwYZkaznt7jee{usK}EVBSY- at pkdc~0WuQEd zFo^;^12N0h^4g&zSu9_l-qNDhVpI5C7+4=?GT$v$cfUVI(t#w5!WKd+i1J{E!dZ#0 z`X4uu24Sxfp%3Y1L#^p?huN}^L^1}vT0H{!86cRaT2BX+?n#nQ)(=&X7{Q&igSt)5 zqEY at tk0vRzRd+jWI7eNgq{NtGk5mL1&|s58OE!7=u=o7hoB}76Kd7`TdGz)hk+Qt* zHpnnJ5UPn)hAz~0SzpX`UPxft=nie at a4B|qEJih}u$yj{vlI#PceKh=Qe2NVQ=Q66 zOQfx1z#8H9Efk_fUR~=pU|Y{&oSco4X8x5ueHyEBF0xLwbg*BuSFuQhw4if%X^V)T zW3{NEZUpQTDU#+0s1L;@=oEo~V>Cvk$3o)DAoiMJ+DW-P+EbG4NTWZbmmKt at y-dvgVujU=?LI6@{grkVM!!K+^3qb|G}Anl^7PVe z$K7e2h{Yybrn#Eq))t}FPyT2(lxrpx`wjXYRH(|ZAwNcS5hrhwGU$|>g5Q)dd*|lN z+I2pwaT)c=AbMi>f|OfhnV)JjZLW%}>#NSFO)*63c2a zK%PI(J^V?1CQf)?$xQx75sGq)W+Mj=?S~Q0qLATi2!&N~aSUuXNQP(^pIC%q*t3 zA>2Y>ctM!dDMQ0O(G{3Qy8mU^PAanNPM>1n2m2`AdLe%M$&8RpNie9|-UtyZULX8w z#1H4gRs%vWeHd at i_++;@vDt~~of`z at Y@K2sAt+Lj*oT%)x)D3}L4KcAq`trpQvQp; z_W}`1$=}silHYcVGda&O__A&t7s8IOL|df( zL3XRu|A5E0%;LGU3{e# zV_ecv*J>HVO0TDHih8hjw;LXA$kK8Nt;Wr;{E1qxqV|^(E?M(CmgEOW=yM zO;J-l)q{pX!E0V2YV?6UoWnqKceP>Y5 at bp2%aO+CaDcz{Dpv(iF2 at 5XXDbYTqJ`8! zGp at l!rVk^if$VDLda>$RtGgD_*^Fhji-#%-zhRpQ#=`u=bpde#uFQ>&Sq3poErIfv zJD6Ev749|}-=ok#fy`dGD|R-v6YNEkyuO$?5PvIhtml4K`a%-*vz0>MLrr4ZIak}J z2fZl}q6v78E)#d>&(@2^3_g-v)_xC7iji7p==hAhymt%~^iIfK%v5&NJyIWtVBf!} zBX$lY9%}*gAL=NwyZ%q=IFA3S0OS-te^$Kt|9b!cowFFNLjVC`BmIvzU!{y)tfXDd zosC@`oc}8UE?v;nF at D@Eyt6W0r8tQb0|J3b;84wpj6%Sa;lvfJ4BSwWL; zekm%-y_DSi-FfaoOcV at Y1ZY)`*O!;1#cOriTBmkawV1yf6B52`-uxX<%;qmETawEt zN0n2*;eXw7nS0M2<8M3t`sw+^37FwR9ktm)9l*hZJ>*ijdw}HI!Yv#yvI(g`L$o%C zVp=&AAYkd9mPi&1AhW1LsHP5T)H%T=`{zT%qMJH)?MMERi3cH80ZZ{kd1EXDg zv5}LwBmK;H)f>pCdaDS^m!6kn-iM2rE@#U9or!^p^80tl$TR_)#KWK|g95r;wi%x? zIHHtNcPJRUb=Kg`3~p!;l~jALpm{6>OIqqgG+1JBTBa0sMYYtEE;Z at ylv$TYyQGLG zQ93hxnH4OwE~caF*xq;EKw)0)Z;|J{js$YomwdL-Sh0nPW9i6qI|{floS71ouC4R> zc10vka`*LCW@#Rbj~xC|Q$?A2jB0a9`m at ul`&=W=K|J at lziFYDB=G#ZpunLEErR<{ zn`{p#Po(a%$idp1G!~5n)wMcsYPqD_ytZ6iu;zyV7&RKk)A|A)W^o;n at re_d>uj>- z)q;$;aQCC>oF>)5zgqN=9B|T5FFMwhrK8_D)Cg#jk|Ed2t0w%|cM5i9AVxAhz2IJzZsN2(l1t~j zdgQY;z8x+Qx2_|%(o7?*g3DO>`lI at S>?R}Ue6}T<$~i4}us1H9cz{3 at kNZxdog&^b z4srwX}r#8Em2?=I|%$BJJ`AwR#mg3Ys>Su<{7tfq?}#BKmww=C>O=Iqgz++ z`#cs88+~)3rU=p(hCuBe$*42gVl9dRz0I^PiVX1*N%J0d#}^A%eJdaq zhCunAia_-o{zC1ZD^IBb at k5<2(ojX5fh&i`FSHDeujT-ouj+uCukHZ+GpqA?Su8pC zBQ|QcNKxd;Ih@}J9!+(f-)o at 8cTP+uhMRjztpQ#i#;@!^JV(Qc(;z89YcIA)^JX$D z8L93oH?jVtE0mm$CS{}oa?5dU&_IaW9DP0RD#c-^G*p03P2bDdBB$CX`5ai2Wsn;4 zE4BsQcUcyN2p%QNbOQcydo3YZHWvkLL;aD8kQs)A`3xq(YO at VSX}38v(cMWk87gu4 zYl|{%^rWR~(a+yr4=xpVbf?N%_Tyx^yRX!;@UIzrc$e*A#z=f>;>`@~5MA5?>odGD zml^D&6VKSPLJ2A{ZG|dm-2PoM3a*9urO6{!g#~!=Q(;?JFCXTD;4|FauG@~BJ_rg= zMCH&kn at aZGYW7y$vVwn4sDus6_g at N}HuYNe*sc`I3P at h7Q;Q-65}~gCNzXB~-*4i7 zMtB*B?sS;=LyfxaVVt`|=Dm`jj3{I26M(PfLt5JE)qHSkHh8U;N}XV at D}E=l?Q3jF zxZL8++GnxfgywC(B0Ik-43|(-nVBwFgUv1Bxu3#9}wRg=60qq1=e<4 at CP_kJOqI}2CSNq1;wkXz% zf1q*N`i~l1Gq%fqz>PJ}Iq7{A4c4Km`{mw!f_S*k)lpJsb+5`h;*>R{8nYV&Q5eI- znj8E%PA$j}!{g(W+`F1i4|EYYIYuM3@((Wh!l!NaH_Clc9FEv2{i*`d^gyq*C)8XV zdoIUx7$wiAKD60upS0IIMoH at qEHxfv;(t7*>rbaz$;r$_3_7K8OtszH4Y?GwTK$e@ zxTYO^a*NG4Q!mCsrl<&Ia$+Z-E%UO5p6TLYC=?g*NYKV#K&d at X(>=DXj_nIFm&{zp z`IX98lo~~`hJNsrUf<2_%AnM7roq>#?v=|FO!JcvT{@SGxL?nk-lHAPRIn7DVh~Qj zACT&eWb1~l?+vx-hTh|i<;%8vu)~D?tTyu19t^M|VMN#?3R2t8{e4d~20q5Oo7uV4 zQ-~MJC7pVV`0)VR`)P0J7wvBf8QD2CXP9IWXA0_7Dwq6diCirenXRW^CnYSZ4ub;_ z&1P0p0Dds&kkG#FD)$GcjWZZ-sdE9RQnfmqQZ(DVJ*6;o2rFtUP&N#+ebT6&PuJ9n z)6kCdPMeCuC*IliBh3(>pS7^S{{Vd^on&v4(NY(Af at +Iwom%yR21ouYBT^rQf>9Du zQ!6xY5L&P;suW&)!xaP1R!2;Kd0yrgGg%*bB4&mBwIL9PTcKW4>ZOVF1NrY+iC$xs zbq@>#WDNE{h9y~ZuYZrqTs8gpMIki)CS9tO3y|9KOHPfpfWnNodT3mOJKH8RdA*=H z(cI?kl$Df+`$m6s%& z(3GqiMx&V(&0m00XVmnwit=);cDarU=OVj8nfpnYM)|~j8XK|_v3%u{6_^>-UwI-Q zPw7QHzqPbf>FChvW)OXHGc4B;>}L<@)u?We@l4qy$7L? z5C2HW7VLk#`}7~bwElMyP1!H~BcdgqhQm%aXmTMh4zMgqb;x0m#PaOB$_Sw%<<7i} z#Ouk11+$nl!+{`@hCR?Xs$qQ2&{FLLlBwSKOqba$(%AoOUM2bqGhv7x*K4bly36#C zfkS?aRhiW(pSUi_QN@<^&tC%;_b;-0(tQ;k1(Vf71EMXzgZuKbC4}qSFsE{N?AD8D zARJMM;`DAzINL8K42Q*gsc~RJ at juj-xZ!$Xop~JazC>Zm#PKQ(Wg$m2iEy(9c(Ciy zZ)PM`?+YLYE!Z$TKIR&?XG0YyOWDJKa>qlZ5O%v!xl>(y|}{;UP^m~@B`sMT73FqYu;iqZk4wW8~?m2Q?L z>wjTZe)$e9V$!5H$QZ(lTjQovdAKUnv!_rSWj2)!Nd_wRP%kA-i9uR# zgRF#jHk8b52?#ODWmH3%j8wM7*ZeK=0kr!F*dl^=9-E;KfHt&~L}D^F-|t!7G$$bY zQQh*=`t$a9Y6zq^W at -Io!W=9>=hQqM-vx7{F9brH^PN$w9w!5{!ZL0oJ>U&Nlg1LF zzi&kvDsLdTKTRX43*(Nqg&E;XoDbugPH-OYHuI;ZvbEtyN at I&V at Tpa~#dXz%Y`|TE zI at z;2JFky+iQ#-DX7ntk->Sld&_;c;HcO at WZoaiS%Ai8J#!S=IB~f&A4mWKd16^=yA$G2 zdedLrs2*!N@`chQzDxiPc~{F%BMt!2+~~`PVzrGiGyA at lv+m^eAXRS+U6W+*WQm5oRd(();HLWzRFltU=C4)zly1 at nJJpm=b zAkNd3skANr`4$M>am3m9_5jpz?E+_aB)bFr9m&buv6z=9oDprAR}glTys$I2JuXEH z%WtB_%_fv4au|N%7jF@=@$sz!-)?N6fy+@%CNC9v*91o;yvdQx$(;{GlTs=%CA^fc z6jfDD?t5`I)W_~|9kb0{OBEQne*nb5K3xB+g7#>v6uti$fIxuuI}v~ zZLfk3OV=hQ*)z0P5YG71|N2cUUW23>6Xc&kf&a%Q_1}{6zf4ML^Pfo}@n&)`O6X)1 z6(8$Dg`9vmM7Rr(Rwx6sDQFGW$(K;QkER9Is)$V}AdG3I{Pz_f|gdwf9aBDZmw+LFc4TOW^-mv3WYI=ODn*9^u&Vz}8d;Y?Q%L{}J~LUQWH z at W6XaoHl={ve&h*D%eKe*{r$^@`hwfCIngL3SNTQfe&h~J`Y!#vmiB$LgE7?8S7?? zD^C*hO28Pa_ at 0G5{vg4O4+=10LiW%bj~*V@=N*SaM`Svo7I{1M?3|A`og{);U+)-H zuG(F*qHD0~bs at SaV=>($52_Y#@SfbZp#|5NbstgmCLyu89U*w*izYf^QTw8bETGS7)8CxmBEu(}?}0c% zJg76u4}yZG+G~gf=6me8GO9x>p2!t6brIm9558l07U-7s4EG>({0y@%zyoIE1zDWQ z<3^YK!2T)gdD_I!OraDXMb!TM52|otjx#zOmwJ94wg4i(OkjtALSWaa_&j9Q(nW5c zfo*HdU}@8$OY at rW?MXWQ#R?M$MF~hlrrfTN8?) zEl at YgXj0ca7*J0nrgaglR|c$4CpAV{(v}{zCus}jqGL2lRVTG3NU9Y}RTe*@TF at S6 z$>qXQeh7Kc#l&9diR8K{+cSE1C27mmvqdy-%7ym)L+!?gnF8J%PXT2!Y3zNa-aZv=`A!=($S7O2jHXggc+tJ&}6n6i|DkdZxkP zs}zw$I8TAAiL1z-a|BbIJ+gTB90W`jo1vZ;5%XRKY*YHbdd!eLOXQ&K~LJe`p=Pc>(X)un1DON(Z2T_iottry&B=^H at 3#>h4-`Uq=Z7N#Bz8w at 9h? z$|rW}?@nUxqku%kWa6(}*qp+<+=wT7z`^N+Vd)bD$R7-D7!tgbG`16U7|{y1VOC})>3g8OFIkbrKy>@M|q zldAE|QOga?B9eUd5WLaGF`S#IV~#pW9j#1yT)x)T)k`JgVE;%Z3=4`t9!3^f?_j$? z`XksTBC8~HJ+W4LKS~AmNY#%|yzF0ko>HW!(p8mXbP&Q(*!}SFLl4eMZ2qFX~IOwDGv>}CUu+m^l8FqCIC~YU{8z<;k0%V zM)y=!W~h?6Em6ax1JjdrynH?^-ea+^=(yGO5cMEA0-)^N#n9W0&XXYAeh-(WJ_EeL~!O2xoi}_^Otg zVuSsKkdqbkAobp=_U4-Uc9ZRjj*?{fOI4Pp8gpy&cn1lA{H2rHz6O`-$bY at xnky{1 z4X1>zyf{<}5Dh!?Xjf-||)32N&@lconrA>G at guY7i%gXnr% z^f3W~HcDD`oed368Jsv4ZP7$cHZ~774=(#vwof)TZB47a#pUP;8974Dn%RGK zbdTN|o>N~ph`AzUSneINOGqNp_LPfQxD at c9P3;5fUo5tFXgl5uhiF9?8`6qwk zAxXaBzu9cZ+RKZMNyyuHU^}&v(#*&zxmM6Xp>f)v+sXf|kfpmPdTr4hR2p7ZC|_o{ zABVkevMGuUCWgz>)cUEYK{}t at K2+ZZzn^t_Is^zY z_nE^Jn3Ez0QY35RH6&g(BcJR3#ULjsVVc14a(lX+8ly{Avz-Z{QsBG at O%=+*G2T?wSl4E(R7{(xnjMLIP==Yd4#B^~WY+skIFNTDqIBUEQ04|t#zt29!QxT{pECvVzK7QH{6z8LO2NLxCA?U`c4c8@ zdI3EXhmi&`x|W?h)Rf2j!H`*IE&r1E<*-cHxQ>{apQGV7mtM_AK>kY|VLDNQg5^2! zc7!NQ at T9qnJ3P~2Us&EX2YNUZ2MPJ-P@&+enySe4qUxKOsH45y2P`_9?}4mtv*Qpv^T z<4RY1W*h0v4AUl}T4SftuOh&KFAF2XW{tRLhv zy>7X_;4(ApDQ$H4?DS0#M+Ou~QYOB4f(B0DgGCMIj$!o)-^Acsj$470R7d>tHeCPC zQ3c`NT#HVh!$5FFRlgY)5yX(&TcmQEuX2r8?zcA3fUBalHxp{Dv>9;PuD#8rsw+!h z*Ns(ZsST#E>BS-qTW)w{?K1}3&LJH%ASDy2g at xs0`>(s`=s-NJo1T3R#DQ%s3|)rW zCr58 at cmJwrUfN8w@5AV}FFGHV(OIL6E|vY@;@4^B==gHpo%mb2zf%(gDw6$;1PjxA ze1KU`*wY~)lvy=Gwo%N*^@!Cz!b z**tu-FFrRb!e zWz9DtCRy}T8KSE;B#s8e=!Nk6-6Z$owd!T5fv;TdQXAQX>j|_iG7dS~P@&+PZ&6kG zK$F`PW!4M at oav|=XbWzUr8Pn0pi at xA?gUFTp~~P2d^P>mo7rfga{yh*>EMT$upyYbMAZppq3@ zcog}>Oi0!_D|jLd3n|$&@e3Oa;4Y(!*PtSj8*a<3S#Sy`4v(0UqfLq{v}HX^lGt+$ zk5Mc0*4!gx;%HRZ;#H^~L{xG}{U13wSI)uq4ZvELZU81rPOtyz`9qR4^gp6f}sf6-Mx6La?cs;FPICdUKsO#`EbswFmL}3}}W%nK-R! zTQbU-JeunxHU?662I!PeJTL7>Uy-Zi(6duMfFxh*e<-_RZPqmSHpo)?ed_52+ zZ_}_>TuEI`j*Tx(Q^@vqsVAq_)lJ}=A(lC!$R>6r at l9Xxspy6ftVrSgSN6K%1L)>Y z&@xS^y(tQR6jdhTn9w+jCJZsG-L?y<3;zT>bmvteJF9e~Y={HZE_ z#u5jkwFtn8nH)Sf7=}_n5qi*g!W;tIH;y0F3Fr(=fX~-=3r~|!`Nnmytap}0b@>b^ zoM2DDPa%uT=aq(*ZT^NK^*@k#fH&tn%0zoZSLsQ%exP`;q2>;T at dxP^OU_cvAl|K+ zaEm+k0PIZWT|{+rs(g1TmrZ=k*@|O5_^43FtuCI*syvLj&7az;V24=JpylZ{yjA)4 zx1s)-*Ly<#d!w)})I!;;`W~o%MBJDqR6=p`=A9i_u at m$$7h? z*h!rhEi4n>?m=qkR#U>cFZ-BYL-zQXG0>v at oj`tDQr6TYlr7#~CvN^Tnwv2l>wC%{ zW at odWY0knoEL!j$mE^&1FI|q=Ftm$RWQqy#i9p1P#_}ag)Euwz6GOyGp5b#EH*rKB zp-3${_KC^aoXqy}hxZ(0j0RiQ7Tfor^Ixt((@OtQ76J%|DV*HyjJ&Snza^p+qm$t at XLxy*)2h zNjJrmBbdVsb+gv!gP0vp?oq9Wsb}g_S8FgI(Z>F<&O@<(@AXEA`8#K}lxbL7)`++4 zUc$`CNyquT at ukQ2*|3&LijDDQ z8NG|ol5q zPy8BY*kc$hqi4H2WrBQ?Q4>Sw5V!;U6q)8grvXGu4k2D_tjxS?!8#0t2tJ-@?z|_I z&xY;2m4J7%vg&HJxh*Lflb-C5N`df`aWDDMG8!}HQYyL4c9Ofk$xL|nJ7L-j+m{;B z%#D8MtKd+WzwkBmTj%_%^+PZX&YK+!^S~3RApM`q=g)x&)s8gPKb4sYqEdrq`=0hP znzD#rpw~Y4ngYiZQe)aoWFxg;DG^$(e?DpPK at 4w*eZY5}MJ3I+tQvcAu}$X{x2g^y z2tJ%3y)vJT92;!C7Wr9jE{JR5eCXNkD!|uo+1V2ASE)-dpw>a16wsti}H%X>30gXCy?#(?^!+^MyaMq z5ym$c4`KD6BNqHS7;FVpugrweNlq05YB%KK`i`Z9L>8&iv^j3I!$-cjr3b?k%-aF){ysta<@iqQr zKs*UiiK&eS2|G6+Ri4>0lv7QxVw~5~zS_;6=>&g22)x2-)FWsX$WfweXyq{LF~YQj5j1GGqr1ya4>Gg!eE9#avpS!#j>`02ZO*(%l7+G*Y8do`VJk*_sk66qsJ32=!W^z8;SwQpF1mpJz+wl;=qdtlOp9O~K#x~PKIa10-L0XV zx>_(CMSidFOV6%Xky0P`A_I}x?QZo9_A%hP2!z6%1Hweu-K%o|S5k(_8J}2mW+#05qJz3?^9y_yt5StCf z>g?Ha{Wl!mnk^f_Auii$oR|71rS- z&=Fal0K`d`t}9qk!-G#;qm5Yq4kUskrT1PDLp7o{YRO-JNdr*=W5u#(|IC3ZzOfR9 zQbb3psmnkw7})o`I3YO#I4T-Xm=N5Md_>_51xhZc8Wj1i6DYXLzURD at IC_yWdflfej7!-tsXXhmABy7uHoA1_Upgh{+#Bg_xV2 zwS`{o8>W>lr|XP^4nSJ>mf(L_-Ey{f+9NA&+Hsn)*;33}ZOU5+c%CiOJ4t6(b|6tE z8DIx1n4+Eri}=#Cv&?QQT#q;(uCj+A`|20_t(PTp5<-`jdB8VmAmzR^ZcX9iXBuxW zTs=xT0iO#NbnTkcN{pOu>7Wdpa@)zb8;t}D57~4CwZR%D9+EwaJUc#V3k^ypkaFIS zgwhF>*&ed7LlEr at E&{L=E$)xd-;jWm!@pQ%L$`Jc%R7O;-3fT^fTR5Q`#4 at n zl>0*&K)>N!?l8=QdI#F?*wsM^{4u_PH}{R&5cvGL_ffs#fq7;~IcAJsAsYK>$`or0 zC3}XM_Vmh{O64uG%gQu<<1EvsW)D8Bb0|+qlqD&x%d=&pw09}vIYMd2HIBV_vlV(%x=gZ%lGR;FN|>I#iJHox1*qL z3f7H>MwL6*BP+cksdQH$WV>Nc&U4$aL$U7*lubnkH6ji+g(k at 7*cM#j3#{A7zhEV$ z8bK$=OUmrVX6zy|zmVnYS{3AQ`~9gA^bRBwepr0jN({Q&Ld9AzklDHFsMZo$Q``@s zru7KA*4m0c?Fm^^ok=A6X5Fxfbtk5sd|Ge?k?__=O4Y4y&*4Ejri;z4zrPWz9EbZr zk4YG})8sJEXt(z$k!;i$Vn2dFxxcdsxiL+%eA!gM{)9E9(n(sH at -W@$4$T~mVBP&p ztHCK-g at Wo5;`1>8?Tg{(-d&WYLy&s$5|An!r88V};(YFr4@(hkxLTLJwxWLG{^cV2 zrBm?DYR$f~knTX+i69Jbv`Qju3)MJVH%mM;Yhcu at 1M2SFw#=4r)xd)T89j$VUcg6?6=5q|at05-gzwrZaBaX&_(O)@ z8OTi}J9hADL;i^m%HOhzC6dWnp8P)+gRH>#}5m-7$c6g$$Aw%@VuFX=c%sX$`UtQPS zzRk$$GMyN{-o_xh=Rrl3A?b<&YmqRWvche0(PPXz$Du1~h3td8hqvFSn0by*>8SEI zVw8|;ph8PR0WNJi2kKBzH(?oib!-Kawa{Yu{)KaK4MH!39YdzL!4NS69Jq)MoCVt@ zbbS9JRse5hJXiBnLH3CJr}S1#ZUqfF8Foe`2WEHXZ_p^Zr72Qo4KA?xdklsbC{JbQ z75^!c1vQcRL`Wcq-%8oqvn$nmqj4rMJ86?HN}k99_MTEPNQzHsa} zRP1QJ#5;>Ci7Q<9C{-5Ii>wJ(9FzK)+=GYQnDa6`0E at RdiE;hJrMY9wfQJmoFK~x2 zXJ%J8>j?)`KNNF{9Jc%kgD>1D`)&_ys<)zI5B$S*dBkL_mkdSvA&o_6vJmvFq}AR)dFcmeu&e>{V{N> z3|&8Du5clD3`zUDC2lFi!Hz+DhZcbP{}$0 z78NE0?`Y~N=0LuNhUwdLoZOy#{RORb#hgLF`N#dx#KC)B1wyc9(E zRg at l`opx>;sE_M?3(uE%iS at i>?~@62{Yb1%kG+xp8E}b8P(UW6h9)oE@`-SL3y>ru zub@>B)rMhOHLX8D6Xo|xh5=d0>}pD&8aKv9lWHI*9p*4%ku}3~*uLM;ki^_bPb7K5 zXGr90c(Zi^a;|>3uIdnCuCC!ON}_wJ{tP8wxP^;X*D=S=R)V8hhpcPdY<+ffk=D|viLQFHot-x%P?-^dQ~j4__JnHyy4Zy zm5IM|&l>td{!K{XT>Rd+`K1gu-l^Yp-XcjalOe69p zuNTFJTB(srfSw?YvI;Qn=Z5YP)0<{6!~?XK5X_0 at fxxjy1c3EM#JsjE#g%W7i=ssZVo>-EckN;sFgK)i*v!! z`I~xzKq;)NKGUYY9L>^QJk34lo z43yYw%BPVKWtmjA4LTOZPKAzI;TAo_!X_O3t{1Gb1wPotCY*fTPH1%VR)IoSnkMts z{@@M#nE*5>H=Yg41bA at Ke(@O)NV-3Z^Qu2VnaON{f;LyBS2jJQ9_zDh+UxpwADpe{ z7Ii6K0bh#lmBx3 at 9iH$Vo#GLk%`OnldJa^@DYuyTSGDo+y at DwZ<4Lka#m-aZ?CO6| z*_PM9_3-dR_b!DZe(5DM#R_ at 35HrUoXOd|jjVNv%E at 53d^gwZr*~Mm0w2Ifg6LN60 zewf>~Fj?FCrjOQ4&ahp9I?s7Vt-0Zho1sA_xk6Fj+6+2XZ%!?)zLryQ_1<=`H63q&D%n zYj|SoF23)>UsHOO;RW_uj;2 at e4mviOY1F^q(hSyN3nPz%wwuofu$+tg)rM+ThvAqF$L4Q#Fn(R+hd%+q_uio`GDtO`9V z^qac;+fD at m)0WQtA<}HgUootET*AaXz}HzZPPP6{7%zE+n^t+7!Npu9ZgA3_ug%Kc z4%UhUD&RY-+ at gB0b+saq!WZ{^9|C$mMu#(F?q1j_^g{8u`(YTP_+Gu}C_%l8lbQe!`jb%@Kb$yWR% z#{*;8m<}Ebx zwue^pG(GW5&FuuLU&uS6?D8jHL7lODp{h4x^^;$W+AuF&^|x&{==UYB)$9{r5O^xO zVPh?B`wgz$%J^;vH#Z>fYF<2*3;74cHbSE;d=1#H?S9LAa6g(8)KhKru6bP>2`4|y z(Y*1hg<9G}&F4l>t}k98Vroqp`3|j7K9z$1p;wk!c1yXWe3c z-7>xJT0Q;zQp*eu*^saOVfX_W6?g(zNfc~+>IJAh%DvF<)4|;c?PTr=b>Qhc(d^k5 z&K|gWOJY16y0`vXqkyQe86zX+o&rIexE}Lqt0lOR0}Iu2LkO4 at wtpkHAB6j_wGP?` zkAu5K1wGXB#8jXCLi*nHF62UZKeogRwy-6fKc{0nV9bXU`(AkiELL(dXtxc1ct#oo z;2*;9J2;W&OJWE`#Ff-vgfd_D3nvfvzfKD z{+BQ_bV^2vV?gZ*ZLr^|%$K!il}jHnh&;|A^&3Z%OJys@?~M0$s<{#aAgx&1H?mJ( z_Nd?IfYWa0AGW^k?i%gu$R`t at L6qH@cr={FwG*$$eSjP4Yo{FLT=~5W2=Mki8e;lM z%=sD-a{kzq;^<@-zR40tY8_k1eit2ec$xKh&-w^tX2joSneLYBp8!e%d!OaQvS`F+ zqQz!p{H6aYkGZG?j`G5bc9ag9|Ak9CtO*9cS+85-gnxr+h&=AkydMH? zUtgsE8zp4``+c3uoB@*SbzT^vW at z=U5E4V$kLKTrt7b9vz7P^kbP&&L_Ckc at 8)g#UwFg&0Fw;^|L{Wx$9+#>JlNy?ogXJU{J(X9{a}f)Sd3AEy8W~Z(!22) za~ES1xtKzD0=1zFgEf~;dbmida&$3tvaxiTiJTJ zG-;Fvu_NukXEf|yp|!BRD!>yDZR>c>JCcAxvxyD!#x`{P1|H&jKQ5T~jwq#qA*D8c z-pSSho9=jzdJOKft0&1SE4?;yCE)>%CN=gIHY)mhk7gMIW!($<;zD$3*|y2iU(S0i zp0E~NF at Ns@!GT&{`5T1t(CB5=nZurP9w at Z`JSGp!S_pd0I>C<^R5P9k7!U%Mh6t^! zfX+OOmEiDRAp9gQ40f1OOSCYBS2yymbYeC+jkz16yAP|ERXxh24645P+@!ALuxFp3hI%T9jN*T9P z76X=vz)<kx;aK8cok$hFKJG;xOsrs; zz``LFGPcNL8v!3sF^BPi%*PVuNP^u%1-P?7ht+>hH?W4)SIq+n*4ANYIUa;z4Jm*) zzzO0?fH`0a@}z?ewFz=C#;{@$PV`YF<0Nzkt%74_f{uRd4=K36OQ^e{_B at dCIDyC> z;6JTX7~DX+BN*vwZW%R-tRAcZ$8(d}Z!W(2~@Io1E zW%vXR;TIv~AGjM8zoo$ZMjdQr{KQ(&3E7`z`~(l_9s1NWctr^59l2x2?1|jBtN-MM z^9|kq!1VFkzh(RcP5JpX$ZzmU6yiH_N00f9Hu)2>zsvabE99r|?uX%%BIIY_&gl0K z*q{;{#YXaB)HEIlBx4e;EV+^S;9N|;QBNWjCf6yqK~__Uj9XDZ-+81pbVz5B&x=-( zTl*3{9)SObG?$cur!;iIuw1bwLyPi_A&a^7|MN=hr(tzU9taQ+HUtn5{eL_jrexy$ z|J-PePLi@)6hIpN(JFO0z{bYV#HX!IXz>u(Qrs!0&KFuP`^DQt9gu0HT23=slOjh7TD-fUx5>5iihib^?vfV{mHP+eK*x37X6_w5J>-z~(7p4e<4TCM}AO%ne z3;>63t)~p-c2rLo)ZyGxa?l$F4f$1n$-)E+mmYDwI-PO5s%@K~@t1e8hDmW2nicb)>-6fKjjh#2#FgQ06F#y4vb<$J5%5VOV09NKxMZNK(XZ( zdh-5k0%hGO%*un+sj*|!Mj?S{DwXVNvtR?f>xKa7&zfsHT2uT|=y{BGjxr8$oweX! zE(x*ChfM$JRovF?sxml$hh%6BGuMov?yzu(VHbH)p<}db6{)H8D4O=N1N^EB&p=d+ z2G0s(s7HwQ6 at rotgl@RO$q$_5MbU_eQ5uf&i4O)kVK0MU at nQp|arx6+a$g*|6}<2h zXp`4IxB54fu%1P6U!Fsdq5hRombK2t5Lc)~2EDTfog^RKK2toYQ})ax?-xZ<>YJUu zn7G$@egs0rj at YvB1uCy_8acr-|I{nhG!r at 1cqr!gmawf$T%z}paS}bN6N5uh>MI-h zJ%p*yfvNg(5-B=D{tNMLb9~~cAd#Xbdwl+vk~?+4tmqvE(H7MH_^v!kZk+rdz>ZrO zW_;K at g`o)XlV~XMs at lgB4Q%=Q_DgFcc zKVkn`v4?Q|2YWR5e+>J753)J^FW57STnx3vVc=s^#5R*ofE^?~aFJDn{40L_qdfww zHM)MG8n at FCx9EYE!+!rC at L{0hbCQJjz_0RQ8lw`AWo2j{Zl*82z3JJ_kEge at yFe>< zl>T6j)XGO_TMEAb3IN~^TuDdu#6e#0OPCvGX;06BL at Gw(i;%??t(e6I>FlW%qe}?( z7wPUB%&iK^M(Ov6y5QFSx(xV6qE-Dcm25Tg!QhU%>CdX-H4X?yp%*#>+NrFC!B9h)Tf2vBWp_mWB8 zQL=xa at 1EAS?>q+;uLf{fAafU(IMrS%ro1Tu(4fgosz`R?C^M#)F;V9|Hu&xkyno1w znQ%7`2TDk0O+1kzH)*{)+wHJ*H6+tWv^eUA7);d3-Mo>TeLc#8MyF#=9S1A9QUIF! zYhQ*-c%_%vCna^CmDnu#lEr8+kg+Bt0V8t95>t*tUBmA))F^ zas4pDbWhJrzdvvF;iSw8%j$e`y(uN1?#rI=>Wvk1(yJ`~lxfPVjcteo`S at kfe*#Ss zkUT_pQ6}^x0GGFl$5%^aiZ`Yea`Ga#|9)!=s1!+`}6R9<@ zhMctC9?S&yZCflnw<1#Q6VX%;o=8>||9PI~)KiZ=#Nw zja#PsCOM0YpZ>xMfy_#=UK4_U0 at u)xgcfqto=tbu7VV3zdM!z?FUYKT7izd9nSz#b zG9<`TaB5EzKZJvs+x5o1Bx?hY)9FmM(`>pY??a<60WYvUz8)z<42?w5T~C0Ogt)qL zoiiAtSK5$@S5n at 7hq_PJ5R)yGo&+3?;j0K-CCmg2p9$vkje2!E$e{MHbH<--hYR?c z#C2!uZI&r+?OKkKd3AKt_yY{u&4(1s8PgEXxN4 at c$(hwGgD%5$ufpvr2e-*G)-k6k z#479>vXy)#^dQUwvP~y9_V&@d6r0S>N%+F$gC=Hvk)8G#3qzjuTobp>#PbCtfk-W@ z;c808(Z=@!S;HO8kFGu9`^v(mJo5|vi?+H1v}G~bj500jNZ>q_*s zp9cl4H)ZbmT8_bbkvB1l2s>P7&2H89af#ZL&u|~ELnf$Jli(Xg0n=R06Fh~gb*KS# zf-oILgVa#q#LYuVBgw>KLre1!FdVf9yxRI>Ke0DO8zQ>Dgx{YjNsD3`(8_1J zSrryhvSlyrAj;|TW<{RmmEA2z&6_;VH(LM at tupvu;!9EJtDXfSqlyI;9Jo|Rcfiyf zw^ckp23UkB%g at fIhfg3Nzmt)91yh9dD#*`t$2I$*y#0*nerVKf2}u50kQpS5C`9S$UFg`;QBzr at es8%lcyL0>bLH0?4}^Y&X at m&?5w#_<&Wu3F>} zUK+6nH;cco&GY;HM!Jy>i21#q$|jYwR}_anbV|h+#wDikWb0<~Ek4gQ9c-Qs$#EVD z$8xsr1aV-nOVLX at q5OunAj9=ClujEV&V-V8aj72b~l9KqD;D4%wEygyX>pz9C#{dEn z{LfTE#=zFaz*@<~(Zaym;*Wu|g`KUuqn-Qz9l0G=5BEe_{q<8#ukmtl_||to?yo<| z79k7=i~~txO{_IG^e|5j?@UYo63}F&N>gXC7!*VrSH#Y{z-F-#GDky}FFw~K^QXk( zPwtPCTj=&#j(a4|pD^@81JPo||C}p8h=v zh*M0S;XMn8Sq6^TJ&-^%ES}Ll4+w%<0SZ0^|LoVIR8ctw_k?~<2suXgjDBXg8RoXW zJq?Iil|7|b7OOj~9KPATMl_c0u{|faeG0AeMPuKDpb3-3wV4rS&ASIfLs_j8C*3ZRW-!=^7>_sB7s0I?!t7- zTSh6?QJHB)k_g*5S)9ka?)tP0X)b~;XcJfM<&qLw=$u6!c^T+TSZq at sDWL@|)q-<; ztSfA+NlR?zC-n)^&f$}R3o2GwJ~)Xow&ftfj?m_!;)~yH42%22MMKV^S{pa63q{)s z#ZwE06zWSOLLmh8&}l5Tl!?+E&3UBUA_Ht#v}-pZGbfrl}ZuCbhWZOn#4P< zRuMc-sV-I>rq6Q;rWn6=mYK-&NzJ7b(3cHl)JV#Qf-GYwQ5*)KGVP`FnZ=zTH4J5} zP5b`Sv0uornpPzBTSt6R(b}3#otzA$^W-MPM3@=+%5wGuk`8G#@H%sKHW=1CTd5LE~gJie&7^1wExF4gV at 3wMId==m=_VB_s~Fw+)OE0UPHBI}BHqd{$EjioIonDZ6l zp~*TSvRHw)O&BMq73me;aqDs7{7`1(DGyJ$0gC$N&KCzc4YW_&GD7wZEH%t2s8 z5CT!ZH3}&Z7$OjAGE855#DIsAB;psAMbx-ECU#&HTQnLiT5rO7OeX;Z`|%HICED98Q&aV-5}k{#wxX|=PcyR^g4w| z2QSw*N##gxLOA|R+>UgOB7ZO$+oMXnP~ISS3Z?xoCofU62sPtRl(hxEeRs=(2F~(K z+&CgSoc8Hh`^hDZy39C^>>tb-nuX#QGO*0K at a(ucSQYiakGjkePaxEMSXOO4bL~O0 zk(=^~xxaiLp8V5 at J1nIeMvK8&K7HrqP{(Ho^H~@1(WMDVgNTb+6^YTM#7Tp(hYmF; z?Qg<&@;?lGB8Ot;&i-eSWw%eQy28Jj4K2x*B+HW(9_49DPl{Cqs}nM$ZI)e>y9Hq* z9fI`1najT at ZqSZ7Bp*k9D|um}y!>cz{Td{t%BOpG{r%U5x^$0)mAXdbxk%$cPxzJO z`?Bn%wM602PO5NaHz(xoLvo?)kv*kE;nwb{XnxP`sbv1_uS!Y%#x7y${L$ZP$-&dV zD%*V-Qe{snI>Q at k`|)&zOKQm at T)nki(a*3SYr-)>WrE>l!D>*-;ap4Me_lmE*&;-( z(JJSuGvhWX4;9q)X4bZGIH~;?Ph9dPGGLScpJ5M9=MhmCB573SL6yTC0{f*le*}5cuwQMXlv7>i%RqMAa1NqE>QkL?92H-_rbqw z7z1DKCy$PCHC^X6)19}u*WWteKn|;GPq#XA10}3S*y`bJ3b3*ZzqHKHYdk;H2vSo>ZycgW{9ANT&OpgWsg=8(XSKnhrkODTB^q(ZMtQyIhA)(&6GG*<;v0q;J5f>X-!21OLEW)1K*`W=v zrjMLH=AGp^^FH%_*&h0STf6lGXpad(26NyGQAt*kZ(!vg@`S{4$5+EEyT at idsV51u z;kX(vDBM>9&7*KH-$xiaNv(IWRSw=+q;V>19`3(kf<~ojIupdH!c=d}GIH@(F zfe>2mAVMdd%3K*=p{cSB$ELwb%~)!0rE at fiT61pFP0r#T>QB{W>p0ppX5LFuFz{mO z)0v=)cWBJd>TK$#PvIF;J_?Ov)iDT1tHBh|p}Z_rcf(RKuzRc&NQ^F1KS*Y|1~%B< zSkrf$aOktVIQE)vwH8K{ir32xk7#WhKBV8Imql87)geo-Hn zIVY&sA&+lEJojh6T!v?DN+tOHK~k}Gza{2(z&v&+*2V*%-=tG#%A*KL(*>s%>;*IT zb-FF1HlJ98Kt*S#0 at AaG$$5yw+!|4mqg*5?-s-+755TOOBr!zAiI5C4Nfr%g9 at T4L zK^-l5&xCc^fOA>+a$Y!*MzVsKaBkoj^p}RF3{sqO$g$5 at v3Ltvp(tEXYgDMf$$G4s zV=zrr5Ij+13v|%unPg1prFad?F7cQ{WYDB1`6SGcdT=|vl!64}q{8}uMIAyjifSNR z7MMffy5SsZjZf$SIb(%zA}(FC_|)VkGR>5`B%L8S*2Gf_i*4t2xaSrhit4R%rZS;1 z56_1!zd_AQ&RFwXR_G1uW3C8GeTg9Ocvhq{tz at 2-PY&r^Sb~E;ilHqxHa$CbFYa at ndwqZA zO#Ii*y-eU4-q|~ZkI-q4Aj`=Xe~Ce>-RDrNZ1UY+*A?WMR@!Llm8}S68ZncZnfif# zB&hnh2aF~so8l5BY>Y%TJi0*ApZ%@yK;}P9MC6c{j3|o{F<}T33R~WDpb+g;PuNq(zr4LXWz`z4Lxu?j> z5 at JFSKFpm;q&^l#AsDqygzD0HBq{Jfs*5X;Pi*Yv58nx)OC~BOENq#Jhuv9pN3_W< z#KT&|o7pX8fW$0)%JPqQHJ9chz&oOL_91P4&drngFXwe0bIwDo{{~X;|Ih)1QV$>h z157#6rQ;;yB8c}5*P-|e7Qk%|pwx(6>u?W0?3JpGgfY+SOYG=&wu-6aawh z-zBxbw*Q%~{pW-K(rVNBn}`CBkkndg%4*>V9Y}$pR=t$SQ$T21Dd}h-Y5Y6)j%;hx zl13w*@OM;%p8!(C!Y at C6zDaj8Edu_QQn)6kv)OE?+YB$W{}{5x4M_uOKTgjX*-CL8a?C_+Z^_k>Zg zif$=bH}u^!GQ;$uq8&5w*6uoz>|2g0?kIn_2KUyypx at GKW_;A@!e)z8X8=OYl8BY7 z6UqlY4v&WTj*%2pSxgia571SmfCmz(#yod8;9c8wdan${yOG8;55jAtAA4wEh1Qe; z0w{$%=UkBCi1HA#@kaXgNR_|pD#j#W-z$AFWcG1zoadsvwYc3(v?G;TRABJslr|Qj zv`?-g>(5+d)Ys_~Mpcl&YSYt2X8MhgvfKq{SQQM=RlkJ-1872LAb{wnb0YY93 at d|) z1Vc~5qj1)`h%Pl3X?pJDh+UvcNHJ>DL>;N))WS&K6N=Br7*nP$fB=}4SenB|sT-g8 z9gTa6T>?+7O|C(z8+`*SCe?^}ll}@!pJWyUj`{HAS}SYq z_U0wSCY5{je`6&==h52xMsq*~DGABi?2O`U@)^xRZ`>}5Cz=7i7-B>w#US7eJ-QZro%2Gdi6LAp$MI0RSG+0021t-_ZGYY^rT}ZL1>uQ0(el z*QT)Rk~thQ+aP9->TYe2+AQjKfsIL2TuKREt+NpLcdM>RHZKxdAaU_S*>oVAPqk=k z+Jb84(-4!iNa-vNzT7LGk3n%i0CD#d{Q%GtRYaZ*$#G^fnVqurWiXvxZTQ-i$7 at K`q0MA9YGP|$`M7-H5^ZUx(DLPJseT^dWYcY zos6vsdlSW&a%UFC**%51`KS)R2z&Fz78xweJ9*?z#=L9#04X9_ z3Zz{(N=S7QQD5X?Uu0$f#>y|rq8U*(v5{n;S(%@M#zVv3rqe%)FVJeO-co8*RXw!- z0RfEgRZ+VJ1kAy4!QtSIO;NFtW%%GM0~rpD<_KJ6uKYde-oaj#p7c;Hniw5qAxR4U zbPZwj+--@#Xl5(DI>n2#SYJzZ8c(W~Du@|I6ugPsD##GkM9T`;CKe^o-zu3ORpK_V z+k^`Z_9>sZ1@>R)NncIyZ%Ol1+LUvOTf!D7kxcS&a%|-kwkG__dlz_yLrN z^YojT56Cr}_Oew|xl~!Iq!44-Whm8V(^h$i3kM2{V*~AUbSiUnWTX^4#~+D>zaz1+ z#uB+amoAI+pp3q!goS}k_jrc;cgb~YR{H*MZRNt=$q9vzAwgYox4$R*jX0E!BdcO~ zQ0A$bK0f+YeNDP9Hw&YcIVNZ-7A@)&t5wVd2_t&ZG<+;g%QU!o6#*$Xkt}{ui?>&k z0s_dht5AhB;B{SAPb6WHW;EB^0g$1gB2Fzyu0$2*OodaU%#xPX3OR*McY$y)qr at Syke!Gp?1VO;*~a6r40jp`h0C7V)W2ph^_u ztpZ%MOa-V?nNZH-`MLdD^=-950~%ATC*9X?<(g7AH=4km0A+@{O2%K(6E=Qk&Wn?J z@~7ZzB(1W(vee{njJFPcO-_!-iV{V< zQLiDvXaZ at aLznGf&3MQFt{;iP2;I~N%%sHJ{(6$HD6vwn zI4>gl^CWX}G+P`dm{7_ATbD8oQElgo&9R^JILz9iK&~~KVagvZkn;Sj at 1iAEek~8x z))X9^#1Y#ZD_oW&VcQNvr&vM$7w>B&D>p-IT at vzBcoid+q|znk z+Qghk+XLlZq%1;o((Jz$d&RwiI_(9ROe++Dx`c*r!)GRYwfkB^pEXUyY?c3T2M|NX zDX8q~@R3xh8%!qcQjA)(Qu>q7=+J6Bf~`nIcD_g?b&xW|gdI1Q+zsFn+d1ws(|YLG zdx_0JxVH02{$bAyTg65En%>t at Tx`8e;$z#<26p0}HXITyxiJTJVpJ?jedq?*9PZt`ACVtTA3otA+q=Fl{^ zURZ`icE!{*ajCaysl}83QRt3_aTXvO=S^oCzDyX^gGezG9Voi_Qx5ApH1nYlGbH2u zd6(T2hJHrtZ1UiBY4PCUEM!Co8BgR`1H at qGU*+d=M0*WgKP{UK0u_7q03y-Us z`1XKlf%|IQvKGLqEIrtiNi75#-ta)Nnfx%OS=6DFmoWbh_mqxyvsoCwTw}^vFaA9O ziNKkoiXYUa-4FbJ z3Z+|i{g+3oCCJ-iD at rFOUKU}z1{FfF6F(j2X_^)Qo}Ti8o|=g3z3$tV9jc?F9n=!}wK z1JLlcr&8MgZIyqt9VPP-SHeYu2zAy<5BK{OF8J2P at ZR+B0~0&<3Aer~=@?3OiP;tLWIMVfSMp4>|4ARf zTUujD?8_AY`j?skBjSy6I4}T!Da5}$bo4*Ae=i*TV+5nB<+P*<{|(EaN{vh_Ax=Oe z;jeuaEWABALrRklKpLB6p*VM305>*SK@?vSO-pje_loBnN&!7h&;6LBA9|5%q;^Ei z7`|?Fy>QdkwRf{Y^mdfib_=L2C^H7Ly=*TP7HbI0k?g!ZTG;(rc%X)Zd1Fa#)m~;0 zao~>coyFyH at T>LgTcKmDAD00-nTHL$18cPdDPqXn4_&C$xXZPDTz*Q8rp|@5VZw!Q11*Tj5$bUjxaRa zebGlO1ETH9{~)+=g1mK0837|Y@)EM|>JA?sq+>NH;6X(;>0=NXqgk{IB=o|$M9~df z1#U>WvJpenb?w>uQG6W&wr}>{14y=LVhD`}I^Z zt$+9sSb59JlbKO#J at p}`# zXt#M*@Tf%z_0k9%-Y0d@!f%n zf0Z8udeS;W{wsY>0097?{%`F2KMYyW#lqUy#PNUU%Q1>NR)5Qvm#mv4FtAbBYSVGxuMQ4k?{CyW`1l~}n<+!R022*CsQgMRpZ5WMexy%r63HA%&6W^zwo z^_bmoIK51N-9K)*0dTET_7D8wUbP<@kwI(Iu4XdEE9cJ$gU+zD$s4G+>@`-mtl;Ox ziSuNyYkE9J< zq89feW_0pmqQ22FCl6jSZ}1brIP6q8(;nqfFcx5-FQX_syG5x$OJX7Q=xatD98GOS zXL{ld)MY6g)4&s&vX>I0CWwn!0vtL5VuMYQ0MJ3cAGRRB{b>aJ(ExsV4 zc&+r_*&=~2`Gox8T*@fqZKh5?k0M=Y7j<~w3fY{F6jZ&R at DNaY&{4A2?DC%OK8B>0 zG>n2FR+4<{L$y?@JBQE#^^BC5kxZhSOT-Z6tY$dm0`ay?T$`KKaq5sv+&i5<0Vm5H zB2DSg^&MyyZQAEO>cb)MvUnT1cD=Hy-E at Ivb8emzDYfDH z0RaHIf&T~S`n%X(j-relvH-kKk6sg3tbqVL3JRZUle at k@5(F0Fwz*;BZv$wEvD}SW z>!jTq8M!#WiQpt%{D5J+{W!*DXzX#?QJApWT2G}qT{W4nH?ME3epXIiO!ddRX)#bM z-rw#w20KGgaC8`$JQXEdX63GIuo#v;Ovunsz!f8D-q=tdF=LVOB>@ucoX4uD_blp8 zL>UbJ1h2&{^*$p_((sEo#HQG#qs5ZJ$FVW6NV(C%>vUHi+LZ$^L7&2qnejUBVX;~LZV4reT^QRNC2{N^JVGnOyR4n$4Q4^;d~ zHF0&Bu69+p`U!FAyK`>a=$p&V2J64`2I!qnD`xLZYf0-xvNrQq9?YYvoXx?I-;P6^ zmsShDZ=kQxI8e5Uw#WzYz{kPVAllL$37b-b-~^BtW-f6q~TPr&#-M(*+A ze?LUOQdlk>Zw*_iQ#9ckwshkiI7ILgbn%--)N{&Ds at x?Xu9EyS1~$(YxpMwum~t=x z0JeV at 1F|mG*3uSE&L*}d|26&I=5JE(zBiiZs*&BC9*;0(*7(TBGS`Crpb!&`h+$IE zd6E=G#a1$FiLZR0IKBLYqD2Qye3S0BYSL)(Z7vfXJ!jb;*=HO(JbZpWUx506a!T+F zL`MXsB+%mWCgbU6rUVcorTav=4dezAgN#CsUCO&VfP}QG%FH8>6F at usTtdaF>Q!!F?-9YAj zs#Tx$i(zJ#Kl$|hA;7QXt4hzX{E zDb_p;R<#ue=<~j)cF4<)-&X at n&U;TdG5KoQ8Q_MjwE%|OG%mK-&@88}0Zxnx-JWBm zht_DlR?D?ZXaZ;kA6SVWLvefp-5RoG$jVQ+UZJWjevUj6HXEHguE25)c-!3FejS#a zx%US8`Y!xJuGUu>GztxAwV)C|iU at R&78Vu28)`XqrI&6Yk13d{*9kj^HFHW6VKCM- z7_Z0fLpmT{tnDnHVQ%^3foac(?isI+ccSS3&9F<78LuO50561$Q at TT3^O+#m&r9S0 zdq8xJUYm3cYjjJ&7lWnn&4^ggW(I!vgyx(hbo>iZ=9lO=Wejt)A$7Ep(gbW6k!C&~ zzRa9-cEQIIU#wL7M8}b8x>J_7n>}0L2Bgn$3NSc>e-b?Y4!9`5rw!uExaqgQ)0|Hu z%-t_>LrUs_0kw*NPmCY1`;~m+YyywS-5HDwIqGn=YX8!--{XdJ*O*-qY8oZF< z-W1^~n}yW);SyMi)|QLK6mTP$M at x;-*N3ib8k*651AB)-{2)OKcUN(YyBMsSkd*Z@ zH`B8{XWL9=Odnrk6Knuc?ubE=$+66*%)>0)%LPWdAWV=#WygW#>dW=T2M9vV>b2Ij zX^)^_K0`-z?MhXT{sZKmxNr}(EnQP?7^qUMd-PVldQKe at OQE+JttM+78EE$wQx0t& z at vk%S2J?t3e- zt-1;dUu;}J>sH2fH{x2R^#}|ko*5U{#Pf9TwE|}HI0on4y at os#?DYAw at 7n`Rs?FV} z^>r1h0}!e))BBClp`VzZTr~UX|K!0WB(+|85j(PHbdH}7n>aI6H~&;TJebgO7UVoI zc7S#+aH4zWACC^B`Uf~1!1y3`!Vlqxl5Gq at d0oJI!2C*c^b6~G-#djDtv+4 zhW??FKen8MUw$%k&JjcbC;_IITwtdfLLW8Boi1jl?vp at x2h{YmeL&y&`0=-DCuu%v ztRZ%0_P5<3SpTLoas~nxJ11#Kkl*&1o at 9vN)evAqg`3a9`hxgpAXnCz#8ds{ zzW)IJ58OA?--APW9x33z+_%?T`*HN>aNQ)WIPwHVYGjCj0EZ3q1)G;pqvu9QPxjB` zpkzJx`g_rE2b0J=Db%AY at 9s4B>E(wJ>^`y=pyc{P!?lrEzGp#9t`1~!XP8icOz at jNC=xzmR5faU4okDe_;=E z!0whHWB`Cl9smH!fAiA+^U7PaVDyn!T6oRa49Kzwh^734_0_+HfFKA8!NWsI`0 at GD ztr39!r*OMHZ}8XR$3LcgcmeHf6Ni2!wb!|ettClHrHO3dN+T6RQS~0 zuC(4>c(w4DnYy}~y0T`d>(al>_Bh>eoN at h4nXd;)@B1}^2|zx|u4^FZ at i89&&AuT% zN~FV2)vvuJJ&HtI*}fq;N|Ls+UHx?M#J17|bp>d(-97}%%7FyUg_b)_uhwx$l6x-Z z?8uU|i@%>`yGOO(#kL!Mjp}8{h_$1h z1Mb;K3fIBb#B}TJ0ugtWRKE*~tGy|StE>G{5wHt%n_yq|)II~t?cfCH2K7z}2rNB+ zEJT1!JGf^%zWvA}$YMzaF5^;ef?s#WUA2GC(FX@@jcMTwNV{Y9Jsq=5l3!LZjJA2;ogmYbi4X2QOm0$ENRfs}k> zy}qKiXriyHp=4oCeXn^-t*>Wy?fh1>Uo^O)*PJ*PTo^GYz+TZY(F%nyxpeeZQ_CC2 z#s-F__hv^1CI?1FI=;wg)BfUlwAItk$ZF~)^*wdf)fWz&N%3|IleLAV*-k;1&|Q-= zGt;&0BI0 zUVM}oZC4h33n at T&8%;(OG5UTng1x$`F&`W((5pD}J=dKO6`a(2TeJME%asRW*3NwQ z=2lf%R6RWGpJ=^gnWDGhhV~YCg~f_oVb{j7qC~#-UMJ6cZ4zo zDAE>i13N;Z+ckeWYGg2C0slH0Iy8t-ghBA2J~N{9sG%Y;`!?})(qQo(zrLS2KF2(6 zr(~glRz%7sk(US1086r?82ElNzS2Ts-er1P{32 zyMu=+tIPtvkm9EZ0hy at M%RQuITpqzS9`s1 at J8x!KtvWeD3kcx?`=GRrpAS9x$kA^o z2GTzx#jm(68vKzg+8NLYT8yd2*WM4)7v8v)9 zBgJVZ0&po#;husk#)#yU&G1nVTQ at V3){zJ=X>t8X?8HL{dl-W=L`jE&C`4CU*{g}P zDXHCrF%`WKC at CAa7K#O;WE7($T5?Z;GPmN9CFoXATuF)tm{r#AMYqr&NqUy98-}(Q z!^mQa%Jn3znP{3vQcvsEEv>8(Of{^RBpl5~J+(9!%(u*2TrFJOd5BvUu#+utSSTUi z7z-a4BWqewCL^W at x>s-Db99wLm(};oSzbor?X>X5{F!yJ*KB^ZV0&Ad$f&NX^tjqs zj`w%kv{->lk)?o`34(w{w92HUs);kLSZ@w}FUa8(zCM3v#w(w#oxZYTIqRE_-R^OglEMnf9>k+QdYqaI)UQ}zLs{yNOrVV~i(>iSi z)t4An(Izb;_JfpU11tUlEs{X*Wy46y2 at aG=6m{g~;7OB)0j! zf^F+N5?h^B?0P&NCoy1N%{I#vXfN?hVj|0M%_XZYrLQJKO0i-CEzzam%gvgHznNCq z(7Z&LNE^@N)ko{O`uZ#`02%458apnfwDYtz?cu$`?m*0x^s=!_I(_~}et1_tyUFY= zI+8x>$+AuQzUGDYv8F#ZqJsBrg0C&?45)zPLwJfPt1w{KfhPfid?qy_<;aDf7l^uX z#BDHGxIihJ+T={2t2Q$vh=)G3B8P1OBhZ|-{#rQWGb-q6jbn^K#;9X^qM$tW9Ow)v{QI2B5%e%k<;8&W0vT@ zgx!!AVQ%QT&O2L#+X1_XJMhbTVOc7&Rl(qw10GKF$~BGMd{5`bQrCkXLSL*~q;%0_{lx?L}iH|&&{7lqR=fDKNO>g?=B3SYKup&NaDY-r)`W5{g7_yJEr zgo-sTVXLt!-KGW?ykZm^bmsVIGQ}c7MLv&N-UvX%1E3_*)nd1Ln$#-7#>;#($&DS5 zFa!j=!7veTkQ<}}w7b~wvDXXT_PA&XjV88~GBc)AH*>sfVMdz4I*oBRjqxvPDON at e2Nckzmj=T2oxI>8G$>?M!>}Oq;J?uE)CH`EA zL_YMGu&0Lu_U%yn*>;PZaI$*_gkG?=2z%&WqB>wL4B)woaB#i+^1!77;=vA9Q*mEr zTNn`xALKQAWnnm`nx?5{4tR-59OUR}o#_W;8GBJwIoHy1L7!d!wQ{wN16MAYG9AaX zGSrCYNqWIx;5!$z*oaqlUV#gNaz4b9Yx0qPEWG5vg5LPf!orDQhi)jjs8?cMl0yt{ z&0(`UFKzF3TK}`_* z11iGa$T|&CyT at NBtoN6M-Way6RE8xwgPdsJ^22xx*=%<*o9{L;i++ApEi8gR60;$8 z1l8Hzijno3r}$BJ(obv}wkxABg1YmeIsRkwUqa9_|McntSD`bMv$6xfE9 at Y;)TKt8wCY2TPY?pemnPau(&>ufd?75s3K!(ZGQcs z=>>Zb(mIpOxqOf)-q~B-Y|L1`uq at wWoz;{M6E3u|+c_><=evo4#2`UXp`&yJUsCN2 z#w7j06W4)K$3u&51KQ}rHPO+2I79Su1A3Nq$+=p4MrXXHj-o4_a8hBsL`?f zqmdHvYDlq#rUpXhg0HM*jFZ#xYK$k9p4vL+SR?a1egyrrxZ!RjQYt at Xhj_%)WN7pT zVc^ZG1QZmc7`&Wmq%9gc6AdSZdN^8iTc6K|#hRUD!tcY44oPrKRw%PTKyg~cs}w$6 z$&7bmZpxXm<#-E{Mua_3YnSw2c0!<^=$89r_PC$ew8WhXg{UYn`^eD>U+o2F z5S5Sn%-j;4O})C6Z({5)pgU#yn+|Vq3F;5X9 at Bl5?0JO`(X5tCE1#<>7skP3EG|2Y zU3-GGpJlQrYN3?0DkvduOAp4}MT~v1!c1u;DRBY^Q2Ub{kQ}md3bRW47p{(aAL!C` z)tEttX8NPx$iIit0Q82vL7eve3?M%9st2V*GAe=ieB^S^#$ax9=XZIkXRco=J^{I_ zDpv{(pX(u0is+q?O=AQgF5*+^wxYkKgkFsKU(oaU$UbsVo)lr;tzkSX5Iid|I8TSL zvmvGG_o?~)b`d=(1n8z9cbF*7#ic$#RYqYbpEwf_oVSw(dBuiqu!Ee?eK!dH?4T#B zrQUB!QXLey0G)%<&4!t at 16Vo~%)+~568t_+59D0=4PDtIej;_(*jf7LPJ^YO{*JtZ zmj#z$pspSik0McHU{+!%x9YETfY&-WCkfDtXP`G-e+}shMnfMj6aJYB^U4&(RY8&^ zEs%38+A|5(MFH$LA`t^t!c7+QLlQ z!Gt$DU_&C%p)6sja0znJ9k7V<4lzCG at ih56AKd#@Tg|zx)~K-kBlUmDlz?mCZ`bXNTmll z^hj_+pze6pBOek!M2)+;BDJM2s4hu*P)Y|dzn#Xx7nSAAmF+B*?GRD|f7?*{NoN%w zu6bFs&_9qAo9XTb1mQ0RamDE$pW-ORcVYw{UJo)Th5LYWztSTgG32b#P29bcWGebW z at u|#osOZRpQXhj*CkdISa0KTr-_wlmYw4%g_7y$cw&-{iP3q-S8@`b%XL0aV98nwF zqe^Qr4)Vd9nSq^QLe196MLzN==E&LkiuUov4e=>Fq9u2ddZ! zYv8x`+qJguN={R at uAY2{_YHaV!BPl?g#B_qkQj}%eRZ%+ET>Mn&1&=l^bdg@!snBg z=OMPAwPe76zlQFa}ZtV5_nB+HSvz6EyM0J{~-Q9GF# zwp*wJEx}Q9lEbHQc5IV=_MR5zm<@C6mUXsm*615BhL}bKnetI{0v)Ow!kl+d$f^bE zq?{IcimWH?v~7X6Q|bYFp!S$=xjpod>6l9Wjzi0=q)leZCNouwiF(D1G09Tr4-w1H z)}r;BXwym7jBAZd6HeHV!i*~@MSp-kY=c&voLw@%;{tfj;Y`4>Y5Hk9s41823TPq+ z<{ifaP5^KGG(-Q_Jmig-v%1RuO+hBctZ7JYS-<4UePdAfZ#rH`C0YI+jhwCi6Lx^Y zBi9_xCKeadC4|>}ft-y at jM#y^@pkGzsF)*JKjX~1{oeT(Fp{(!GvQ< z$QpC!-TB%{y0CatXyhWO99kW%6pSl*ER-~6Lj205s2ED68}ktys2(e!Nc9S^MaJ` zs&S at K&XcwPh-5>)Qw2Nw4&6fX_Xze|G;Ry3*oJx1sSZ0{wB0jXUzd7jZ8+k^pYH|j zzXsI^l at L~j`|@m}XqRC!o0 at _Ql5%45S_ZxoOxt at GC$TUItxBt;2Jux at G2$wlIFp}+ zG)5=sGDUDgR;45*KELb#c8U7zWag>f2Wigrzs{8sEug6}3IFZd#A1 z- at OPHHG_T436#B#g>KT4x&ndFESW_UqmTghw`VqKO^>ED&&Dkm2XS~4<(aD_>Gk78QwnPTf zsgRK`y_8t$V7gG{h8t1I#pjC=yhRtc{GsgVi_3%l3YiP)nq1<8^lDe3Y!kG!3fk at r z)KV#`XS?>`kr#{$iN7o+KYrqmXhQFv#gISA20i1D+7~pVuy#rnC~Lw7n(eTUal+j` z&W01qhB`=hLdbTY4LHk2xkEA|`JC1Oz2!_B`k1wR&2a+tKCc$BUoAmHDn+%XrMb&c zuZ){Z*X#tEUG=VsQw95}=7TX{T<%8~mK7Yb2zNc3;49O=Bi8o7G<;(8MI2s=&o4Wc zD9?ihEvmPJ4wV(WEQ;@3PjPdMd{?44HfKt33%^0yYtt{0uTUz=i* zwWl8DsAt-3 at Qu;}8%g;neq<07t+*i*Y!5rI+{dfFmh)dvMTH;K;NCkkZ~NO`b7yNG zzx=(lOU_H%iJN!VH)sw_*|#o&R5PAcXV|z{9hBW{$%3C3HR_Bs>hBILIW=qIzTLTf z%I&Iu?r|?s3!0!!3|>b}9NRuLTMiFvArU>J7RAyYhw-*|Z5VwYc!hCv?z{%|O$BSM z!C8$+nBjCU`usgl%TEOQav3+RHNL(Hwewab!Gpmn3rG*3Wfo`@V2BHS)gvE?S{D$c zi5&pF|FzU>{zD at Q1OVU&1^}S&-`tO=ouiw93-1AjI_0j{Rq%S?rl<4Hzz~HFwgI#sHX$S-a?qGiaYrRi5 z97JB~Cq(?V7ZNgwT?_r*nrg5J&- at O_NN|bz)A48Wq&3lofihfx;CU(u zuMNXyjp>PT*mRAUCTWXPv8^%dlPSS<@bt z#(bkP_w`>uTfzhD4F(JV00aR5!2CZ3?f?F7&_)SS0ht#~6 at GhBx?)+ETCv~pVuX<( z+B?IbI8)+C3NQ20acIRPO#^i)Z@#aBj^$4Q-h7;;=S?JC|DpcdNw(8m2lt#u7uVVE}DyILA3#fZL9))0yTqT>J=j`3 at VINx2-Z;NYenDjC*KQ z>+B4o8?=WlCyLt?fM{p=mP(D`7K)NNeN}78MWW239N`f8DrB1;S8z5Tk*cc^O_Rdp zvHyl1YH7JW8hM0pBbBTcX at X0Up+nojzS#w?pKBnqIs$D`g|I``t>etGs)$!p2aPjZ z(v|bUd+d7J%o7w~vVyaT92(17eT`?jZhkq)wnV&vW4@3FkX%clKFjaoODKB$C2G?6cT^r-jt28J=o6y3W6TTzdxePNbQw<^;@ zemxN{XJPM%`Ep&8`f~gl8hTRM^p*W65yYN>_iQbV^ScypuQr_4Mkj{ZPSJVij=gh( z<+vFAP2Xh`Bc1RbEA?7=WMGTcGRzabokr_aPmTfdi^1s_T65aq2}TO-V!ou>d8OnL zbHO4G#i6rWNpiF4Id0KLQ;)Fd5)Uhc#PcGKsFm3izVCaQ-6odR5R0_GhUbt&@QEdr zm!RGFDmD+d38LN>xB=-akeGNv&!7c(88>s#jg$}BGm2T-NP5$qfY at MP7#RRh{JUsC1|Bl>d>U(Fvlt>*`zmq5s!M0UtGN`l zD{@!FI?X!dlX22Jt93L^DqhQ?1kcOd@>sBX18vK*3nHyEL3ZIqZLm`ET?GpS*GkK( zJlUT^j^#+PW#Z3yQFPe(`v>8kdB&$nzruOpz(9Lmj9B;TIJ&ZNnN+Mp=gpmDCGIbO!1bSg&Ij8n07H zpf_EuP13imp^A=cJVM1)T9MtnU<=yjMA0mNy=n6371zoOP+p*7ure_rH at bk;7_&wA zmQbgZKXJkwEV~aCPFilTcBq`iK0OF1IBhjf#g|XcHjq49pOLs_Dz

    t1A|BF5;yvd}ZH%6V& zO~SsY0_)ASyta?VEi$*;TD8$rq~4j~fec9ynZd&ngEWgwmDqtC(6;&Z&HVu!R5Zn> zwe|+|JXh74!?W`UoX*xstd~`2CX&3*v3S~hHO9WKD)SfIGunBM5z at rFpdqpX}MWgZA4G++-={|1z3bT1Q=W3JKj~&RQGHcJg zUZXSE6aTP5Cb4N>y%*fpE09IklIPLqEe?h8?DkSaRNF}b6$lG#M>wU`oR)6C$5>4_ z4FO7Vp;t9NH?|mYC8 at fs$!ErCK$y&0Yp8UUg=>ys3(1DjQ0fj?QR?=9PrnKe;OoX+ zQ8;w|5+T4pQ1J#%l6dDDV%ID8=sc4p=Nl?1%%}|{+Xr2glo*N*&<@8>8*O<3*DYCP zMz`BfWo#{?Y%!_4R5p-tP}t}R`laR9d4iRcEyzT*dexK{$gt_l%FR=Ws~rj7m&p$j z_$oE`n=&&~^I&de=T0w?>lO2-9Rm~HlH?TDZ6$^@*)qaZ?Hm^U5QTX2QsS;y*#~TO zO)fzk;H-JkBr4rr?*j>=rS9Of^1rbHFNKe11bmipU>_gC@`}2oiOL)_TgCHLFb7Ih zZi0$K_Tdmd{X`vlzbYCBEaAClzLXu!g1$l2&FMmoNAPPy2B4D=`&rB)(bCf$_zLG~ zy8~~ZiHMsmkd1=H*L}nKjfkP;KnO)rhCT!tzb9J{uU^EHFhpdW{!W})5wBszZqdlW zRcWHz(;^P}ijFeJCqRjf|BkiScx at K5WORoo;GhzTw>3sE_g&x`jPbgF>L~8pE(~I) z1ac^)P+if{q;v%hVSX30+>}aMI}n3!<@85`NspwZXBXTzF52d2x^K>Pa&FRu-we8O z1AS6O4QXh8!P!4Zd~=o4BAnF;l at 2!UmT+S8XWw`*DUOa=<`urI#u at gpDVy~>aZWy= zADZ6~*-5zHy#SF=bUVL^B!@IRbYv<}Xz&*pC z?FH;6%A!B}M?ZZ>6)fC!n)*&Bc)3%wO1s0|=u!4SjH90G@^fW$E^6CoPl<7(h{1Cf z{xgC?%lB_91#y`0Q!9Vwt=zYNV!! zuW2E{9l&)`zUN`dA&=>+3V=8<#z7NPldJc~36>NyCYf*>#jN?PhZ37q(BGY at XE!(W z!Ok{DyS0wyn99VjVhA~5U(i$UhpCb%G*#5~AQ7ul$D{UbiLlk0uC6%fQlWFtoRNrN zTddEms{j+twQ%cdd4T+bln%g+4BMN>c}c%j+ at xGSGZYphxq6pt9VG~1O at O|-Z7^e8 zL5+`?6M%Y at es0X(+r4Kd=~82RRqvn*fXK z0nF{buC!GpJq69~XYnmpsi_ZVw#5FUV!1ODU|}3EPEE#({GD8R25&7%yvM<&^2k&K zxg%i~hwao+%ZY~TeUl&rKS8J5679K&R&vQpqgca0I1RSmTs_J*skx=yE>XGQS}-Uq zCXBbD%so_%aY4C5RCKT{%qxUmSnC~0*~=3~4U3UgrK3k{+t7cdy;8Jw{o-JSfx4lG zEa1gq3s1%DXznyCI4^SCp+~$BPPkKp6VLPHVk8MO1wd4}b+l+XK;Qx{E|V;$K!KUd~5Zyz~+ftM$P*LOWpeoxvLuY=zAv#NRKaC05KdwjDEv+&@5(u zg_+3M3h0bxHd!nFJMMGHM-yjv*X<{$C8#$u$Os>?Avtk8tF&6BVY8z*#~|kdKW1$* z*jXOQ*W`k2%wr)>Z+B!(G$yT48Zk@*x`9w8_rzQVn$ih;4+|DX@%x4e4qT%dtz!85 zhV_u##c=*%rlVXQ at WVwP?jcYLab8n;xXr)mt4+K2!n8jn(+%-&Y~lQC$^5fm691!M zhPo$N|Ik!=fnS at 56*VZiSRrBQ!gV2~sibu#p}t8kU{-BO4VhupBYeyXrp(viPk9lK z37D+v(tSxhkKB)IJ{KMrRqL00d_TUH7)ptL-^Yec17M6IUOPs!B~tKqNfBgA!HM#4zoNU?75?Sv)x2Okx01QCaDwsBg5$Ue;K}Yy_&wfyz@>B< z)Rd1^n`P}tj2efb$BSQ=Z)-dod!n@#?r2m$&^q(iPliG_H< z at N?Uw*O5fZl7-UhL`Vdn0yMUFG;(LPzd7&3zmuUV*vq`ka~%CcS~qJ&-bv*ME1}82 z!KKNEg%Ijr=NJyn(HqOQAZ(#~L7~#2aq~!XCu)9tNADXO9+h(Mr{^L3dZ$k+Wvy&Y zIbzx?nQ@{m^i(FnO>tOca*Z#)NSU~2qw*1*I(_~iXfWRZdJRuQ!fZkgC1i_R5=t?fF`D8WfQ!~wx!q*hyVdzRlYMQ&liXdxfybDvX zOGRx+5l5m;+{%yfdzx>O*`jKPw#vjwc=1?zw*krL? z2G%YnPXBv0tjZ!OAnOz>aW>%O8kV5(m#H3!a3Tu_CXoWo871c7#r53NWaWMn%wjO2 zfq(Y$O at q;0_rP7{N4!c)#iqn81gCaBa(GqNKVsHJ(q>4+-McyIA#klVF!D)Hyyt+YFlX9%3ZeEE*@~U at +=Y< zt*$}ep=Ft6;iTB4AHE)8Ue5&)`9lab(xc9hH=*ye+Xgd9vjz2S26nPO=3xUy*z zNACh7zJ)tbWPb&`u#4 at N6EnF=vM>b at cqKlc?fLsqPlW9$w{h#I(4Y?-)ILwl*~}iF z*sTr)=Bz_)J3mqM6&!Z4z1XHb^=2`J#J%R7rU)EOZ$lAsm?M<^$P8=3b1y;>cHgjo z=A#F>NcB6Nhg!pTx7>u~3GYU%%R81 at MxlsN)#Xe&f9XB$I_QaAoi=w}U?z4D>O)>& z;T`~nnPIYCYY!v=ZRVKgYK5E_REIEFKgz!YZ_p3rod)1jXaKxI=#X07_yt-0Fw+(H z!P!On76ouJzuw3_=A35hTI58k5uZ2AeFZArWzwckgZ#$gG6`@-iHa0UyPo*N5(KAP z<{D{T=Ede++ at CJ#iNqF1iPxE_<74{-btAGUq-VQR2<)N_gRI+>KR{H|K7mVS&?svK zZvJsO)`q}0YcT0uR8zm<(H+*xbppM3kLeAaI)}AB>~ry#XyaYu`_>tbC60v45Z{5o zPA3*#3qW80+e+_Bac&?*sqC_#=(4D6sfePa&+lAhoLgd%h5C>napkC!cDbyZWNsgP zJBAa1DE5~PQ0|B`qCKK(3T{%cqXP6joD9-((Zj93>9b5XtB9CC&?bQRH}u&*p#9I2 zhJ;nyS$=rnXXGq)gpgqF{*)kSU>rNM?9Um&GD#K5LU9BX<}fg~bbWBOsz~hOJZ>a3 zd;ucAe$XrV5R4%nwc*CS%;oh|J5#fTkK4yXyDuyq^0A^EGJQlSl&EnfS7Et?QDu at 4 z5OC4)?s5G}eu1Aon8;-yx0PA#Mt3^RcIgnMTvbB7P2*X16&_h at R-;um3nNAYj?}&? zIm!_SiYJi$SQlPO_^Wl;xAXSJR-Qdszl=xECEAI2!Vk9%Gvf2aaV+3u6dQ_mQ*`^1 z0=~+j5f0EqbW-dd$1^5 zMVhwAvL4fvUyA!4DU_r-MXI7pCSCj8r$!_gmP#CDoj%Pt9u+7J)W*|fcGWJg7xkYM zx`80IXM9t;9CJks2Z49TspXos)PQM2e^uVkC54BTwFP;M&h)C}y5d>B#WGSFb@@)2 zW7{fJZDy;!mVAbg*E at m9*ix~L$h?p>4cqbyoP3UXY=_m0mZY{~o8tiNHyS?V*vBR0 z-MKK8=#)OC5sl$}@92VYwjeT`-&oH&ly__~onGOl|L}f`XMqg<;6MRPT;VdrxFNAh z=Nl-457<7|IP#vkbPQ~Qh&F+aQKoo&3L%G&;XdcB11MW){}}1JxjWr0%yn~HS9B-> zqMn>Va+Cp+SxqXuSNI0Hsd*$OdQpdLoQ>j(TmM7sn`2mqYeWX8kSq?V_ctd32PSI4 zw9tK at 0$CzGh~eW}g%D$!==KI*FuCY$4qkqOK(}EjgE(DWfegL%x22t!j9&pUDZjXJ z5x2=j3AukFq85iJ;=5?WKo`lQvS=43dJ)G;DX{q;{w=e1LA)DS{O9ZV&yV_l3h#fm z?8pcK=w5nw5#I*PN^mbQw1L80F?a=g0@^ze3qUQ241TGiLCt?{3zWG8)+F6!k6pg~~os(0QqeXT|u2f{!@h(i9IlDcOMM3pxKdYi& zM$Y>WE^r}QHJ2qGba^Cd1VcWjC;M!bu at yT^Kk;xUGZXclYyx(#0jC;uSdC9fOaeJHSmc=D2 zEcN6^j=`OeI3P`7D#4%?#-TXI;+`d4lDuP0F%dfBZ5wja>Yasro4+;;lZU>M&Q}0?*ycBpvHf)elZ5Ur2kT+hVBE0+xFqLgfdy4JJlKvo7dLBorC`3({}kc(ES)UP zGoPI3zYun!jNO=C%bd{Ss;G$5t#omt+RC4G%goMM*JU at T{cbT}yPqcA=*b4W9Z_~lE|M{wNnx116>6_Rh}o;KW{f?luj7c& zUGI#8`Wi;+Vlva}O_-^cg-80zH+(v&8Op6~;ggSr??FXH+2j!!c~~(pFOV#+W{Slw zcPvp<+1MALRax=U%Unq|3x|U=h3w-sH8l}bDEAn5@>G?jr1jhIQr>SI0Jrnda{giD zJ-6|$?qzpsj&^i|etL_3dR3QA<8EF0VSOwJeRqaScV?Zjgc@|aVtHR|JTm88#!+a= zd!;+h at ztW(Xs~ft!X9I!nP&2q%VEUA-0SFbGHruUZm0m|e8ib?vj_PRPx=KuC+_J~ zv||{KczZwzL at vADh0pUA?hHs z9`lyFYwKtirQ~Rx7f`;WgEA#PqYUAF8o=!VRPo0* zD at pz(ZK;+0fvbF$uO9(Sa&f)1=gh`#c!_HzUZ~}bl>un}QZVDp93dkPA4Zu8=NX4G ztMNFur!)zsCCaYtH0#1DJ~5qc`o$F#K^ZxZtc at e8z)>peP!TgWhD##ktD#R;xc!lk z_*3Z{7K*#7rjSNC-tri0QQJ&o67 at 7qwK&m1fZTq?1hOr!fHlr6MivY-fr%}DV%S}qf;}ED#)%_kxotLBV#TO7r34v6d=KL8o-l6Gde|)f7>8at-^=NaoK%hmKm~IW zzW at 8C*41~x8AqLR_qcie7Mt$TSz at ZWT_X~o7E6`7F;|A{OG&!x*rrDT+T59!{pQ{6^W zcivm=4}_84-&JWBYmBcAi^_j|a|^r?CaE!VP>>uoR5L4eUU?70-mPi$ph40-^-Vsp z`icCMeW~i*>Rfe8amEw){ws?_v4I}P-ENT}nw`%tLtTlC2@>mOA+DqLioceCDdW7E zR_b at 8r=-J3xG^sy6&J~|?B#>FBqldA`GJ1x0g5W`wCRlA>}E86vLRZbbXyc6 zsSQzx`BgnAsZZ8L(oPI=wB&VMj}WQeq(=M?emnFGCXUHIh)dRIhz+9|xnn-*7u-vh zXVH%s3A>wMnGeWKW5=HxjK|H2Zz94T)Q|kv2Zbe8^>By zV#P55$~7B{H!w8>B>4dNGkm~vRhBw7I7 at HJ& z<*{GJx!Bm?NYj(0^Mi74Y?4fTFiRt3%Op+H?~r+H6w@{spJ?Ox`m$M`evV}4vq^t& zZ}L>xgdYZsJYKDnZc+`P$xo%<2^F;#vC8b#qG*kL zlj(}K6AWYa8&b?|-`t~{StZqxV~<3WIV(g#L+^$wsQYEmy>hIk5O15q^F!i}4$FU} z89dXDh~nx-wE(kgiC}{|^Jm#WHW%t^A!QtOcFJ^k;0N;=<*R^c2G4_M-A|@h?p z>=F^4YE;`}BY1cWSVnA|<2P*=Orjfv)<9{Wv++-g5xAw`A2p{Du}C8p>~BbfG zbGoOwi)G|^|9Tf+^&xu~E5q?F(54})U(6TCJ0V(}ErchQI=dOkJ3&$0ooqT4c}H-^ zSMh?EOIlVCJu@`*!7j?G1WA*3bZcxKHV`epCvoS$C8+$BGSBK5HKEZH^*mo|Ud~nF z1x!==RjOEt%tbE)b0(63^UT{=G-73v=eV`dcCR*EhnXXVJaxe|}D z2%OTnTMB6rv0*c@`OGFZ_8ujq1!QV?c^WW<8c3MAr7XGm%r=1&Ev9-QaNVz_*4vOW zzDfM7g)GS0xK&VAKk(CZ$N-dZoh3~vG at 65!U`0hRTM(m8to&RL)h_!P0c_drs zh2DvsI&zj5K+S{umi!Q?X2*}6%mINTz at Z~H2(cS at _=w!R_zrGx0ioN|p-V3K4e<%X zI{wx+v_4Um at e6o`Ea`rq8eT!u)a&NVmcqh%vhvFCd@79doMXn$Qof`aFL8lD~G%RzYXE|V^dY>*2gjoJaSuM1NL z66LnP6mAuDmWV5ap_Q=vrwRUA#hOl0*r)E6#kB?)zw+?8WAdIrKo+2z&oND1*FCA( zv3 at TLT(=g!)XnFlh z9K>!uL8CtNDK;V;T54teu2PwvIT>r$Y=!A6tH3s9CsQ=(j;ef%G^~_WxFITo0Gn14 zS+#j+l;J|Q_VR{stwOVrZJr9DXy!Kd)kK}mzeRM*D76EhQ^N*&3s_F+iUG{BXCO90 zp<3FI7JMRtc&9Rcpjo;&XCaR)ezFG3P^K2Tu|T4tszPkx{^V4-pao6Udi8VLD2Tpv z9aQEdE?XsW at Mq2v77&DVW%R&KRZyoISb3Qd(lyCP_Tbr5KP-=>w8A~u)VW4&eiOBh zFbN~peStLb;y8}SZyeBSnBuvbqQ(Cq9+o47IGfT8|G{K-=$_Gj1~uhTj|!u6A*^YP zI!@fuB%p@;Jy`OtYyzkifuO;95ecz2>eeWr at cA&*uv{j}z|V!JTnv7toKj19vzS{d z4WDyIkUeQ<1%2YJalK{46P6pO6gHnJ5>V!n2%0VsPVbi?4C)C<*^q`YM;(-f z;WS at 3YCUz;PUfVz{5eO zLKkvfI^u3ul-P8jFVt^1?$BfEUC~pS2pYfOyIN^rTE98zr7l7 at ovLH#Ff|@>&FTOo zo}4n1Xu*`@XZR!F%I>L0zW1K17}xdshVAXRM)_GTD{u(ej_BF;I(ny|Hd<>3#PqI^ zbGK?5>t&wxC7!&hRv`;w2DgAOJHg*w^Wl0`F86JiYkf|NiC_9A_Avb`c zrPB?X;FXMSUMc%oIhth!X%D%!M2bhK2S}f6aNiZj_aH=Z<$(A z;{?%&gUB=j;u;Svoi}4nILbG4Gk_*;C`{Km1X~#s-$4#;@6Ht=mVk@*aCK4b+p`vM zKO*PxPKpULp>|ko|F${URC0z%XMEWHFsDH(A^)(xI$+e427QFA+QMi|+kJf7xx*lB z at MfAZ(K;*URq04NJ>=jc{2f+HP8US-m8jIX#3WitQ;p_!_V!)nw|q{kYWf+Oxcfz; z^$kG)SFYMMBmSTvv9C*iDvsO!!wi(TaNp;QN%MEb{K5TBHs)`QY->^JktkqTd8H!y zAfO at n@$5<=;BaZiB9_QdBs6?+70w{IgC8>PlW2G;+!YMYD!Io{YUaqvcLuW*3Ci!_ z#>-?EnTRl95+|WIhuHV=Dh;2B+g-OkC|wnNMAmg6b**d|x>aUL}xjciHC~zvsDuXKP#;l!M8y04x z%LXG1v4~x)oPq_3qus&0eR(T<)A1eES72*%AQ0ZYm(z?f&#iw-3B8elIvUSpR|SzU*z#|5iPE_Qk};3-~0! z0({kSKl>Wu{<&zBxPbJWh?U2GM)X+yKKZ(uxt~vYY5Fz+|MRQn(ii;FH$C;!H+t#I zROSz2tkL(@^t-V6R-XYPT?edIm710gG+hT at 6BK>^@46vv*iDL;sABM*E9WN03ZA1@ zGoB7q0vz$O(ho8H?%a`(bGbLZjlivp1tW|-sO!NDU6y3NU@)D_8i&S%vN}-vWD5IL zg8H#U-Y}7`Fp39M#Qi*heM|X$KY{&n-YN1F2@`u!5_G$U8`#3J=349wo#yGf2Rl&r zy4Q+NnE^JP%5#=C+Nr<`RE&abR_K?XB7+A$MhXmN?0MT^?+%OVh1Vk9 at aM^8WZmmQ z9xUf*WvzKW0_TW%*Mi=3=j at 9FqTU1}r#_qc8S#xDB4S5>=MdmINh3u37n(BIKh-_O zY<@erOWN2tJN+xarflN$AA}_~|JBo!t?X^JAc*TzGxnY!&T-?v2Q=6lEH{*|J-0|=OYDsl+eNJ&*JGuDeJ6fZ|t=qH#zl at Jwe`N$pUF# zYfZi%EVP%y5zht1!^{byYf4f$wq>CzyWK1ahZJBpYdi~!{b4ReMXT4wQ1>FplTzO?6_FqjaEM<<1K~ay`CoRjMj8U4`V>URk2oRN(YIb8)X(-uU7O3sO7-zQ zsn0Zr;-NT8_$g;Fhvo8II`SSOmF`Kqv)`I>iWunL+dUz>TXv973sX zlmg{j~PR0(o?zD4ky3BE)MGXa}BL}Ev{s=2bT`u)D|cO-*7I~ zCDPvEE*QHNDCp6t&a5;QIh1%}gGGf)BOkZDqKp4lU8jNX>!*SP0+J*6Cn-}hF>|&y zaQGiN`x}3(rn?ueGn#MX+El`nwa07`ysR``ur0eJ3fFoJX at yn8M=B$iW{U79LO80d|7# z(Mda>-WSiCKi92S%HQs{KZreeJ|{%ros6KXOEP(#SiI*%T4$@fI-&_$J%9fW%^ZI7 zE)DGwbxoe%>e>=S>2k&K-By-*nNNMQ4|}kW;W1)VfaAW;5Db6HRfGTE6 at DN;dYYw;TBPz zb1c1cKihhS#o;|7Vs+YS>!DVFvRH?$Sm+^Ka6YX-t0aIL2_L-VK}%9kskc{$J%0fj z|5Hi*9bj3SGMhVW)9e&Utw7{S`;Tj&9m;|Yi!8k58X&HBGCx@ zpu?@yGFGxYHr$l5`BW1M;2f;FtO5mNuqYr)F^EEaX54M`g#ra? zaO0RMKa(dhEGH}%@Z^Hh@(B1ILCcAjwHfs4CWGXLXTwew`^s at WSAOHCBOkho!I2JC zGJNcuew;elIWlTqE&(iA%0NqP@%Ps&62 at FuqdUuR8!4TYIJJz9)F~{h=#gZm6z%SX z=~({UsTRI+X(o+qbItv^cVe)B?wHX%?pO`GHG3fHzHNf}(C at S+|z3NJ_t#lqmSZ zvN>xB4K3`?)QHT&r-)`MkhFyac$Tsul(;sic55?^Uu*$TZE^Z})Oc!W^cw!7P|T%M z6F$*z^>}u_ z5p|^?59-5;gHwA!EM%pgG=|k9XHBoMlM8}^>5@~5K2mooEzLMHh!BqybX1+1dDe1w z3miKbkT`95MirgyLKXDdmIG&U(%$N?+ptPHAskn^!_b+KrOk22(KnaDUiiW-O|K-| zMdU>G7O9ZXG?ypK*8PuNI?tI}&97p}4v3mX4&n{pq8tI(=%H{N6M}>tBa~p8Z@2l-$A;Dc^Zk%KRDiJpSl- z9(M-r at dG`r`-Qm?o#QhA{9CC6X$OZenIH_!PHj&#*|+kYc0u})Cf!Gtq4SJ``7=k) zeu2Q)Bl+vFM4&OMck~gvn|OiEsai&T&V>1 at aDtTE2q7_7#^D++9K2J at cT2kH1p+6gKCz+jlhHSFrMy`}~) z<^q>5Dfg6ZLStv^SGCRnCrTx~!pQDESXR3tp4zjyb$zf)rUN0i>Old19fmXyi0&3& zrxuULdZ+346>BH!7n9QM*7BFN46OCDRN&Qyr%N^g=ZzPHi_2bL0~YW~Ik;}}={A?A z at 3mTHqZaOOJ%H;*$9m^RAm2}T84Yo?GMXkprY`0dcrUmZ)_Gbv9Nr7*GWKTta0 at BY zrOnN`#ZD6q(&aF59b4E^$@A6gT7s2H_&dydc6N$dUBy!OqG07+Xo*zrK7GUs)~my8 zx=IYkJJ9k)-8<#>rkDKvid_6*t-BvCTcV1S-{!Qv1G;SD1Ai9!oChyPg7T*GUJGO^ zO}!_(iy9_wS$sy=;CS39jg!pJ)i^Qd7%}G(F=zTRxS;A)kw}g^n*of4tX%=&7)b}b zhFR3ePjY`jc5 at jpoCX(-jQ(_YgM>cE>^x>po(OUWx17ZOh4_&LgZm^m2qyQVJlg4_ zwsOLxv at 7$*u{)RrhDfU%QuVo at Uekz8NZC>uYhdG#v_ce%AM`i@)Vt^)gcND0$`o=f zeM>?ULPz>;z|VM-iw;YM3gG=T at TT?P5QzzUU}q4U48z-Hz6ny6C1Z`bU2GENs8{D| z)CSh~U@=|Vb(-Xgb=Q@-fO5Bx)a!Hj(8y^hK1yb*UkPo|ww8z3u`CG`IYJ-E1|BVO##6+9x5|AQoQX&Le~}AAUYzRts0)X(m(^21X>Na#rf06pk%!$ zh1|1dwzX-o)rH9so##XG#R!>cfYQ$&I>igNAFj=bZDm<%p~#KTM+{U0(Pzc%;F<&O zj2|@!ya!Tjcw`&g#x at gVlJykX9hWT6#ifvw3A%!o2AWoO#ie$5{PhIxh|5|zhR}uO z99}m`N;hrtrrAHQ&^pL01#M`xI+^ge#u%e#`B+XzrnEXfH>ue z2}Jdr$blRGc<^$_ISu%#iy?Ca0&j-gx3(NX^=!Zm0`eITf=ppGs zEx1U3!AK&|c*5E8RA*vnbFBS>@CJG0?%BlsCHaHIGwxJ8s_B5P*s#bvA?0Lvv=GZc zJpsdoOq0$G)zb+5Vrmz_YBHIzb%R^C_w5Gp-N5^0!u1jEi<SHNhh&DEwM)#|_2+FGL73A%JOx^i_>HX19C zNV;0%U`N~g;rh!`l%UfQcmWL!l6y>7NDbSX4 at fCohrt=}y;}V=hsa=lv1;pVLa6x@ zLd&!g=kkbQY1uncZ|PXBxPBB%?T>GO7*=JbldOoqnDB}~mHtqmE?n6{TY>gU#!#*( zqAFx?RyJE&jH9oe-FE`&6kHW5H09*OB9nwjxfEmnoXADy#@TxO3p&2#NFg92QzVEc~Zq_r*+;N}S`?``*O#ZcaQ( zbE$TJC3S^7PTApHq12<7li39*ypU2sNW4ptjW-YhABu(nA;bly_bc+RonxcN5m~bD zzcs{Lw3$Pi{}tgb{Nu#V|BiD1dtxV9^*<5GY>`*vXobu5ZI*fzXo6CM)h=M;r52iG zB|#Ddi&gERSL&P_rCm8x&R<175I^;uhu at hGPSt&r4%%H)S=YeKKv_Ira`c3!yIJO*lbR5~7nI<984dm+zB&Dy+zCRajYd#!?OxpV^|c`vPLY3}WR|*)vki zSYK22u$=}vu212w?ahW7tmR)QNw}}GM13mH=nB<;t#)o zMLJBib8I!PE1(Rz)CUjQye`Rx3^6$$S4dlVPs)fBretKlA4ZCP>a z0M8*Fg2M-D)zMxb%4|7v6|2U|q(1>{JwnPAml&jbtX=81QcT`UGn9di(I-Cf*T%$T zl(1lYn6Q%-`H$L=DhmtZ5P!aXcj>I% zjjOEQ`7k)K77e=o2B>&%O}|?hT at tTokG7&hO9)_G7zu1 zNK=m_Qk=Vu68z`D_H`E=El8Q46fp z)g9h?`p4ZveXt#abWcnNrXU@@Abcn{7|Lv2IJ{XnpB$P5#h_>z<&8ZUQ>x%%((04+ zP7Z9~MV>J0TIt5i*7QcPTmc* zW^H1M at X%dK#KEgz#j62Q$j#Facjr at T)Qj`<8sX}v%XI4?{_00jpQs}sE)2p0qd)`b zn^vKN>Mq;eM4)x at UgTl^%M at RyU@h}vt4UuWW;p&GzGJYSh)ljdk-0utK6yDYAQH)L zCodk^abnOjfw*lS;3qT6nc_SKDte_JpTaF+y_(i?J4&c`k5rdn$hJ_`yEF=`h^oe* zG#uRbzcsR+RwbEAfB*qyf&CM~r=+cuiG!_)!+-Z?M=NXpi+%m8M0d5JYID%C8y4In zv3NXC5<1+1(PF*;I_Txhg*I>_-IM{zH at -H*yo>kMazB)~Og^#aZ_${p8@;paB%}$!^IZ;SGD6|U)sbO)MA2G&_a>@ft z>#jZuvv0R03E6;USCJHI&HRtY?o;zMWB>>Pgw`A?*g$M|N`%IY z0LS`Z6C7s@`P(D|n*t?f+K*gz!1$6%$P)A;7J4!#PnbycyKnkM at jX~_eu1%cNo&MG zk1js+jVfgsg(q{0mLlnj0Qy&^H{J~eFy8+7QuYKRkIeq^#mQC}P>5M-)4b at ESa5E^ zg at ii1wLyOtwC*IFH-f2bVq&xG1!}p9fWIm~$pg_-yLh1iNM>5$oU9GxgGN9*;Yz)X zp7psJ^Q=9O$r;ikH95al7)G2GRZ{ zkGEj|gqin0 at +ji$=wxT}UwcwfXB!*$e^0^wd!GARYq`1-6gCXbE3kY+VLXy_SeBWE zQFFd8v>zEzTC=P-k@}Ukld$m?kz3)7>vwC%h+FS)RThANP2D z)Hx*R7{{3-wgWZ(3nY<3d*FkVv ziHWvuYPBbiqs}zXpNMb_GCa4 at wn$EVBYDLHzm;-MR^#t*HfazbX~b&bcL2q65Ee>23*1;E2`T!quH at +b>pQPH_4qIw~K9!wQW*hF z%SqwVGp?TckAYk=M|`f{*{qe6ENQ|-Hr%fwE+2e>CIUnOvP>QwA!t?1yuI}CAy`!w zX(QP^qXq$^Ar}gD({<0^sI2oX7{AATDpc at Kr)*E+^i}qT^;;7?6}l~vLmG)T_XQ4> ze&zF&%?HaanTe_Pi3+hs%NZLpg;O!gEZF)ty)L5E$^Xn2dH>0S4W4i|=py*V(zf-o zBS_6PB`aLxHN47Y4Ez%w*i_OI!4;*xtWkH=bAk`=x>c0qMj16Bx$-lN|on9JZ!9iX`e+1g)%aVAupF=X4um8kjI5 z*5*$L6JbGCVDP93UR7oj>ocDX|HZ7&2T4=Q(0c*0u|nR3i41%wq_V!9!VyYMoZuYJ&}U5pz~n zo5&!8u#Qqyx5j~$;DvyF2=5at5u_DRAGpHuX|gjpv?Hx-?Uv$&u~E)o+A!z|M|RXnic26Mte?NcQW5Pg&GagAwp-X$ruu0%;KjCgzsnFFQ1uKk&l7a#mnI`IvU zmZc>;M*wL})Cr}2CG11g!T_{ntS*ld4kslT%&dnG=g#@PQsVUYeiEJL85}*v%AUo-j-qu?L(G4Y7-l=B3p!- at T2DU0ww z9_X?gPN`rej$3~BnIQEhCtOs4CJXHN&8;-zjv}=hS(3 at w6}C3#vdS at mV`{zSt z{L6LRrG3k-Qfyb6Mw02oQ}0Jg+xnYuY}6}U1`Lzj-QgWr-FK=lsyi6GSW|x)9YkT+ zY!%p&Pypw83|z<%xNdfINxV#xiwjBJ8QULy*^kcOm7`#yb(@%nHp3svR`Fb!E@`lt zltK)kOpa$!zuRkz5g@}Ht8NO34`B|Y(Lzn;7Q>;fF!oEkJ@$bZm1eCbW?p4;;!Whd z)>ii!V}uTJ_5#DKYJDj;Xsna={`gTAHg_`u^eHs0VouT&KHwTAd`Cl^%N1c5HUq4+ zi{{#88iSX0KzSv>asjpL?(^(4vToj15^@OpNKcINI~RP at cn_9%h#*Y-mI~~J5!KBR zDhgr+iz z5Ykr&5;}W4B_+O_aFSmfc$cgw5r{YfU4ES#ZVC~twW+eF;9KpZ7_G9&+huISrKUqZ z?uA+d%fiOz)5^jYORtabH?Tg4opTXmje)QP&hV0z5&#s>o_GFMqdNC=_ErVJf;SVt z5Vw+l5FA1U&ww?JQOux2wb?G1(R1`O#8`2 at L*H=*1z*IK=+>)LXT|7rRD1ru6w@$$ zk1gamppgnwDKZ6hLdadDtMm^(Yy+sE9-QImPw<`N08sY3eohOHOj zvRk;@IraKS0BpW>ynynBc7`}+L5Z7ReXKB>EvEli7Tm~Zhe0Yq-CVZikf>+m%5U|V zrbKgy^&+CW%Hdte8X9Jt#+5G!Pi@?8RlKO97l=0P(gRB`f~Uy*f^j476*ba?4;Ig%Kl4<_N{_L;2(Q7zNi zSoE%khZ4{2ONk;TkLR5IXAuQ!&F3Nie2iWW^QXV{R}<70}Mc>g~h5QM8xj^^c+lX zb6V&sL5VwPQf3H?_8VN?;&OoPF)@W%PmK1%r9PtN33RZhz&k(UmD|ACi`<=dP-z97 zF$Amuz6)$mX9Qkriu1EJkY*aM^MBh z)WG_Aoug0~jnEdsT4g?RQI}9U0JM zf2>A=!)BQM#`a#I0zb*WzOj82)IC2x`}kXC(2Vlwar!UovIX%^uB5Vs?O$)5>}>x# zJNPeF@&B2H*8P`l;ajlP)M`=sAy6Km)l4S^{DTy^AR)tAiMm7(WG<~3Z-ZrMy-DxCcNI+l4`bG<}Es!Z1OdUC7%WYh6P&iDK63#AYB7;rk$mVqyhG)&T* zF&iIFSj0{xbDlQOG?k}brIm9d3DGi!wB4K~Dyx;Vo(bpOV7P*u2)EE)P-Z$VoP?K? zZ=%{}j2nt!Qlj5^m^{E%xzy3rf}7K5b&n;+uv$Zhfn}Q59hzD03}GXg#0k)!c5&~~ z+uGl*;O=8gLJ^zLY~|Iy!jY3TnE-+SIO$%~aj8`gkFhMUcpFCC_c|mT9>^t at xpqMZ zW5|@04TGxOp~c>;7s!=c)cpF`Gp25}xzfTKahOP7(cS_|G>q4jb62_V&Q*D|o zFP3H-e)AUQB>l-l*Jkdx#>wa_USegdnskZi!XlyUFq1H#O_(7 at 9DypjMRTv-lE6DJ zmMWD&PkDikr&vfbp`#`$IbsCL;%2xD0s)U1h8b)XVf#_(UdKthk8CFwY;Z# zJ$|VdfAdqj4dVDVDWm2^n}?+=Q$J)(FTHFi3kAwilI4k at ng1H*+$o!2MX=dLfV*m{~;LxtKfqph-bKg78aQ3UR#uvac%DHrk{u5k0{nry*Sk!;h-9C3!&$?X=@yv zGEn-(fXLR}NeCU4ezwFnw6}0*^Q_=S7RFtbpqrdh=e{ zxMkg02@JKM7ykyWf9 at 3b;8l zkkI+dB*~-v6MWnMT}S>K^vZQ{7|W-L<4UX#n at 6xgj*xxG)1NkO(6--sA5)}7*BYBg zA#C9w1WZos7SW_8^&7Z%DrJbYSN7){*}s0I}&s3%&Lrnl`^{EVT9Ywk4{P*@sHV zl-r6C5MS5qqt{)g=Deg)CO4gB);Mhdola%buaI3bL^@bHVnN1Mg_XfVyw_v+$A4ZD zI-JQdrl at t1El`#fhh;KD&CF>Scv4eUpj-?48$A-*OtFy+w`wLM`aHmb{Z8iKab1erss#tri*{gKeulsK+cLq>yb at a%y=r0HvasJq=K$2w=opnv)4M zRQjE)Q&aI}=v+{Kv1u$UZADtkT_V;`ld^38s#$0-ZSi0mWw{TRO>q7?YZ>LxVae01 z`U@?4K>fi6YyZba+P23oVQl$T8TydvtM5XcrS8CT&8;Ebz2Ah3V+gF|s(Mv*CA*Gx zy8DFnVi)a143#M)&s>9Lymfu#WW!k5cn1?=W}WZBe5Jyf=E854XmxpG_?&!fV~mUn z+s^D#CH?yxjfJ_#3ZQEQI`~xGt;mY*(`wuOit1LE2{>!4DFigAB^6*p*oeK#b+~T zF4OW<*z3`XChm~nhPZ%JEk#A*(>2%4^*|l6nKo38&~q7?8in`p`Y2h8cU4)bb4q1h z^M;>?uw`_d*KvV+za~fhqIrd{p>l)bLHj_zp?t-+WZqW2<>@NjeQ^ubs!^uik!6D1 zTY(GIG#XT8Z{*tk1M}r~0mI*?2%V{oQlJkePq`ZD4MYBFjZ8smji`R9EGwI9loExA z_7NZXv?mYq6&3sXJJ5qFivf#(<`v9W at s?B^4R^o*JP@;B`+AWE8Wd-;YeU*8 at X9td zSJ6g|&w$A=oJ;mlHC at -ZkwGR6p;w#qGQ1$V%;(HuCfd`6{*-CV)8D++7f)F%7{wv= z%Jcjefdug$PtRsc$8a{I&5E?amVW(1ZWMN`v3w`HX(xv7)K+Zz16}*C;;y9WC~&j* z)uPk!;>BVz(@Duwx|rt163QCDM~&sl_|xHwSGRVeRgpM)DZGm$k`7e_hn3=B_~&Eq zE1{jf&Ox at +jqW2F0C1Y`O7L#clW7{Y&E#Q6z2mP^vnh6I7v?JjYwr~~Jhe-!APPeE z?n!5a=xy_WpzpW5H_hv(G at -Y)?mbRl-vhxMFr=;~)=z(MOBNFA(HB$?trhFd2=sRwQOenAl|lQl?!BAKuUTO<%XE zrxCnL+K*2>R;D+}Z8Mr}E=Z6UWDHHlaj^5JH$DiqgFml{1+a>xrsl)ZM$>clv^Uqs z_nUAR1=5VddwT+}e3I8WO_6*mtZN*!*#$I+4>M54i_ilmf(gye{+_Ev^k|lN3yWYT7upTqN_G!2Or0yZ5-cj8fw?C_npYHaLoex{y zql_6dBi2Z8!A@=5Jqv;nMc`{5C4|!Nfe_p~C;YI^)qG+i#94 at 4h<^b5aWH9qhAU&g(`0pNe7<2gX9IHIII0rt2p1tnMSvkOhWb1 zJ2AECPe51 at v?Sp)ad*V_yd(_@)O|W-L7GwP91%b?QQK%G`z;ehocqWx>i8aQLn=@&Ht?Lc)|ERj z*rPa*5y`5?+&tA$Tj?VzY624|`fug!zo*%@$=8AAD(!iTgFDj9&VTw?JRPv!Wr#9k zWfg1E{`P+QlYgKja9>+{a$h(|D}WBnNhXs#5xkAIN$}jw07UbrjyVTIhWJ1yOwt%J zMG!#3T3SbGkb-ER zIg;yTiV<=861m zqE^_llw8XBjFz6j#aGWYpYbyEafzUWf+0fevqEBVD@( zL((F$Lk!SRZ9(Pep~0+zg|xj+j?hNUeh#8(*F~wJX!cOwHr21iBA3!~51~;$Xkiea z{S$UjqB3vIRAovp$Emh6;>DW_V5Z0A)xL!2T$A=4sph3H0hOu4=`pk zrVxlcj&Z>YQPHH at OR>Io4_MCq3I)KH+8~s}k!bfkcULeP*?6(Mtt zLW=kk30QNASTr`(-(kEYxU6r&cW7^N|592ZZeF at EJ{^s#vfQx=!^5&3|8OsBCX6vK zSfMB+8LuGWlgythMkRxy`nsV-Dl6U_x z-C+(}x at -%#tOQEVan>8WQ3TmmOUa=NR^&tY%>RNmXB6dyMK}Uz4n$&Fdb%K@&uT!D z!&aHf)?3Cl0LwaPKQgK-WO-XR=ozXR$qV4T4nYHJB-<>6qrkk=qpR10f4L(}!ZMbO zNtBQIGC`zi3-S9IBy89wRgNJ^%=ZrYztzBK=Yy&GuN^S(KQYn$U)12=VO{dS at KOZf z#C)5ysspy#o%fV*c>^iikTCd!ssS45az!j?T^X>5yZM8tsWmb`efU4RR{q?9)eUfp zlm!1PG356K2QyZ)zP*og{)~* zA6Bh~Yg9(&`3OCr0SDbpbLrOFTz5YQH4V{Z@)RPBM0z2ke=97cGxEHusblXGKZ=q( znjo4Wk11Tt_y6tq1L~_l2Y>wm`p|)ZnE!ts|344kt)c0NB7tz)ZHNV#Nm5l at -(-wfA8JF0(SCD5_w65AL=7%kHhz~ukSsNGY2M9E ztA>iEZsEep^WeSp>*X=(W2U$F8yHCBRs@$l5GDACGpr6dRJ9EywDUIugq_4*HhtJY zr=nXe3VZ(_`_rI5im!w*zxa!$B%0pR*mGx(mDjz{gJ%kF#ZY at tfxzM%I^-s+sI}4S z!B*oaN{B1Rb(MI{(lUVXNFr)h3qf#YhbeW?Pq~=$b;P414q+nb;bn0Qq>&M#i z$0BmD(ohJq*dj#zq7x(JN^ouB(;Dv!B1rfW#f8*Pj1T*7ycn%h(TW5X1B`?#S6v%I zY-z|wepm6QWlFt?qme?pnqZxWwfvw^|VPkM7OHBzsd^dGbtE;DvibYAw zRhEHd$+FM<33f at SUSKCzDfqEf!e)@|y;yz;>KJ~c$*csz;d~cZ05?Q{~ z*ClD0KT)@qG3pSp4kqxJXgDX-9oT=tT;tnokS(%IztXe553xursLXBiNMjcPnPdZa zvZDf;xB|e-D=;Gy7$zJ^))FZ)Q^V$3E)=(aPl9lj&Th;s57SH&Nd>0%Qa}=4Ac{np z$50n46LkS#kgY at UKrZzjOvgugf|(iQQ7XZe@;RNh)fHd00_^m;VRoc$@pQ!5YV=0@ zmPxC?+|zy#E==3l$X_j~1#I0Sn|$CWHm0W`AL@$+&_+qe<#(f!lC8>TQl+8q3i2F+ zTq0s(b%8V=Eg{jUxshGk#ar;Y|CT0$3LbTLZVA?8JAwx2>+AMz57+v&T+e%k-0H!G z-a(F==J{@{nL&OXuZ4Gmdquon{)FcT*)zKg*2ieEXJ3c>aTKai6Z#k}pDV;Gr5s$1%= z;fGIQHi at BkuUs7p35q@9nYs7Lk$~w>PJpZ8t2)$*r^8rk^j?TH+{)nyne{KTKV?tb zS at 3Nf578QX9#u5J^`?6cg{|=(cD2oWSGY0V{vS2LrCgR}rG at y9C5WtxK-l*(S!QIp z0b2**OFXX}qP{`VfxbeI`~EwG`fJfbcN?qIvaxQ36+a^=2*?+=iiR$yHB zAhOQ^W$xCAeK_qw_0J at L7hki4=^e8(5E7~~=Lo|W>mm{<%HIdrRSxsz at 8>b*o8P3g zs*>>!gvC?9+S%jdNF&nmZ_&>PS$hBw4MZH-TNRu=t+(*CIm`v^PV1SASI<_OZT1``SaOz z!`0dQ{j|UUM1P=3(_t?k_l7hkOrvGr3txJd2Ol{KlYkNxDnuK6i@%L=7=QEd$?y$l z$Q8th4)&G at P7rZdPe=e>k6e%)8#o)Fp_+GIqBl!tmfu!`fd*&1d at 0Oqx8bfV@1Rvj zhfq>p%Oy!=sPUE*uv``2%37+kh&Cvf#~eR;q?D*~Noil5F6~ioyt)i{v;iO21>dvS zpytXrqO~y9MC|*dGS6Y81*EGmVsc3u&yj(DS$Jj}G at HRm=Q3cZJsHYrv$Zdz*RPyv z83E~ZX8M=`D5=`s8J1bzTk1_uBG;Eggg{jpyR at wC7OFujSAK1821P3DlZJP=MK}eb zuFZ=Q?Z;1+JnKkjWF*U%;B`|PO0um-mV{d?G9=4}zB=Y-yrZ1>Rp(X4BUh at h-s7km z`s5!;rs4sre)71)&jV9c=e7FR2O4|gl;PhFV;3tM;7`PbpUsSCjAgi}<7jAXk@}UN zHqf>Yw`JJ0lf4(n$@DjWEB2>B{n$ zm_v_ Gfrv(VInd#D4EywAAg`-?ynI2>1QB%Zey4{En7kxZvWQfs*uQpHP|B&{M zLB90OmT23yZQIyw+qP|UcmLbAZQHhu-PUf~?s;bBym#)rap#;?}cp3nd&PJ zsAbWaWog?#7h{k_g+_GRYY!moX->Jd>vYV9ii=@jIW`^EtJzT_U}jSzskcbF2&|Dc zvvZzzLyh~`Xu{g at EzDhL&n_po4yIM@%@a5ujJ>bruQ0OWFlD3m31oLXAZI)tt36h4 z?#+#H=Pov5*~n&d$T3^+FY()Bi+uPBHda&ZYo>S`debgqgJ5mW!@GUNW7EcCOClV855uz2 zt`A7o8O-*I_xIs`00$!%Q}^LL&pXr4jp{Vh{eZl zp1s2XPWc8z6R{{QIbUO(VKtb4E72LkA+A4=Oh^GZVlkvCiS++!F>ccVDyqi+Kv~E& z=M<#SKCZ`ZHoJv7LNkf;&xDt8pIgOxXPV?5W3kgJ>J{NBP*JehMoq+T at T@Q*m{_M)Yn>U?gm>se+PIS} zQaK>3S+25gJg^SNJv&tzcl9)xAl6+LJamyFT&r`RR=CWoIL$MY+l#Lan4H7<4lxUR zdxy^vbjFVQ?F_{P6KES at Fp$3)aVSM55Ol(Hb-ZpB&Y}=7?+9s|S2C%B-!PCq{2O&O z-&-cibmXQyM|3P_m}WR=yr}_2mopzYqSdHM3eNsp@?%(#`c@#TQ0_Gp(86f7yCy zm=ide{d~B&2>@=7mIedfirynVBHMx?jow7Tc=NVE67ZdldqBAsX9_2WoLw-!fHYak`Ws at WTYk9Dd627|WjW1H%ukxdP>Pz`zcXI^Y3N z!pLr8)}y~XNnus!)g`>nCM at Zraput)4KeiiBbvAC6gL~K#Vsz!hzm^TjCSL)+(lEHTyLY&uhE^R{laeTeftgzpeSm z*wkgMD~jfMeg?mSmwQKi-)7xfNEi2z7gN93kn;ka-{LliXGLz9?WG7uj|8J;jGhL8 z$*}@5+K&V0yv89LTmUO}L7Ikh#%Aj67mI6pW!KB~G2R*>qyq}T0f|(Jr+=UvFJ_QGEHlMCQ1w`V7 zfUk>o-qa~6 zQry;|RCSMP?kT|4zHuE5X6BjDcL#1woMZ=*wDIWzO at L-5hbwTd$Na<_-Zn)DGBrQr zQKAj>JGz=8)=>v%?OP at v@kf7eCD``T{}I(_gyzhcvzz(=i>)Kv6VZm8IELVVxX^t4 zH^{O~FtySD2ePPO{;MG&c{f{I7g-}0*MCPWEfqX7G=6^Arg^duByp)A;viFw^k31i z(Nsp*6pf@^FNd-wV at B~C_e&lLSHBg zs>-o5`Dyp{JCmkaswr3;u32lUXfq3H*%3U{swywfx6X8!U$C@|Ky-bwkUxG^$zc5; zKK_G`YZ}R&+rs_*Ue$GR@^_^SpsJ6W*f+&oaUx2_(F_uiM0w48DzPcSwOB2K at 7JvQ z>Co4vlXR*Yf^Fc?K`PKnGFAAuOw&+koHIc`2dh^x03(~Q^HlXU&0W+HWdt>ymSeb~ zX7nta#O^GFV-4_;T~}%J5F`fkim~LZi5)o$9-F!fV>4~E&4hpkZ6`@toZubunaZZb z5T{9YAIY!6g45}TQE*eU)*J%Gki0WnsrCSB_$Ct1&tDaU?J=10um=aNS`FKrD|0Nf z2c2Erjat?6kPjJG<;Dw8*LpK_s at aq!eusBC)#>my3VMs8ya-_TIY?{e8I-nvxZF$l z%TC4S_GP!d3m!}O8MWtEx6++^$iwPAJ6HsUC0KG{SVQcvzuJip2^LwdO_WDLWu?dU zf={pnQtyx)#?v84OE<9nmgil)CttzxSPG!~fETeFUNWLdc8o-R1bb93NvuaG&73Ma zRcbGjIWSHtqi{dnmCklzoUPtIIdlT+n%nerThpCgi*Y_?qYzt-^JTg-%{M-KFy1`^ zl<`jDfKvVI%Yri`RiB5*R$n1#yrqKIb0O{uymx&(KMzTLF-hbQ|uF5i#pu<@^IxGOOexU zx;8Uq^SCveE|L|_Ino0u at EQzB;4uI?j;IrV2z=xT^yWtBwJL&Ow#i(k!z2Pctq7D9 zw>0z_TV&`)mgYxnI{g*<>hgHvFXF3)7Vi-$$u?vWjKESZNfGHmeTwIEg&dkqxmCz` z>;~{pvI?)oxiiBb(21=s!$0xvx$=o13w33lz>G0K($;8Jtg at Wwy>`g5V at u{mkweMD zL~K3?D)kTgd?feQy`=TiP?+}#wz=Y~YXy at 82Py6bGKxFXLLnP{kxYbQO!&vAH#J}X zt-7o9cf_O`1PG`I0tiU-KLsldGh16>GfN|PGgCPuM=}{RFI9*Cv9d(O!QS1>+11SX zU&Zbcwf|`ItUXiVwStQdaLz}r1!q&yNY`|Oq1q*gN`7_IXF0d`*wn63d}(Cp-85Q#Wx%BGZu@?(Jix8c{z;jzz|f z!Fgv*O;auyrBmTQaI}$mSg-2;)l~g*1GER2aoUhhoUaS_^Q&o2%a8pOjzEc%%p-6PoBY1d`vIfdiAKQ&R!@_+W zJF0$NnNGni*u5w+k;$}@?zEkw at 8jP_qE-5}O`2u+w7zeH7ghQ}FxkSjWK6 at jaco!3 zTYaiy$NFeFjoAz`R#MAn{1I}Iz1(CE`=F0IGB$tCmt2Rcp?3LmE^G$QK34$l(hrPK z7~3)gu03v;2s@$vv$Sena^};0uA(5s>9v7OPcz at R;Mew7Z3I^bf5z0|XG%J+wCzx} zWV1PEqxLp#O9WJ*!Q2o|3KTjTM{++jC{1%Mf%6vT0RqNTF3qJKo8^dMHz5`t at W~YH z+T6VmKin*36mK&A?L$Yuo0 at t6BYj53uCnb}GmCpZ__D0%-VK at 0(}`e;OW$Y%s>w at i2szjPc&D0^5l*TU&H6#5;-mvV>ZHCV!2z(NYc{K)&Mv0i7E z^-sIl`jyLu-hCy7T=ONE(uhAm6D&aHQZHWeMXK0`>>7z9?5$Qb)RW|hl0lL#m$>%H z$`^{Qbm+Vm5P7{A)b#60!Ty-fBhIS9#2z3k^NMb=~N78WnuGFW#*Vd=D zZe~egmyT3dw608V!{9$I at SbMM*^lXND9UOPpPX0loH=3#^w-utXiKZa#&L6#H<1^i z(Bg_~9Wvvn!{tPm-X&sho at BPpAf}-D{|W;08CTkKnT5hx5mYJ;Q?{p_5iVC)5jE?U zZmDD+*B-+jq_>b;m}=-bKwda7I(f_gOJjeD?+}jSj-O9&%v2pR{>ZoO?^20=&)xYO z^}6Kd?~J3xM at Z`<=Bc#8s+U>yt;WaNAa=~f7te~(+N4Oyl+4;wVg(M*P?)HB(}!rm z*haqiq|*b}Iz8hcemY=$IgjTWxI5Ms^FIoHpNIxB7RW@?BQ)PgjhGOUzE5 z{7u0(oE$76M3oL_j1yPlAU;4RVj4qepE)(yim+6=ev&#v516k++LFfAF6f7a`?j;c z%{F%dtUl at 48OWg7ZA*bxYUxT5*HnDnaf) zvQe-`w`Y at a9s46H`=$3rlNnrna*6S(XzWa*2C_KXaw^>h4A361?d`0wf79)|u~uR0 zWR}SE*gkIX at +`#ESKwzg|^-I*6U!640zX7w;+e0u(>vM%3&u5Hn7l{VV-OkMPIJl# zDtJ*-TKCSai}dTsUs|PuGTO+j$qEjS)r(i8Hu7zhcd+x15|s$AQ{?u(D+ve`}-uRyHM12W>BKna71X92y`s?2T*f!vknq>O(`zJNutCVSvJqf|<)CUGs4pM9`p&{JKEB?x2J6Aj at O1*Nl zBeI~Rqv=KYMlioP>EaY>5k|$3=(`cYAr*LDH-uFUb7VKIcbfX&rm(0#D3=mtF8xFU z at 2e641DxJyY1F+%3HxA?#rr>i{!NqD*+oDFhamuAPI-j}-s)PH6mp9EwVZ!wHocI+ zz+hxe%gVIcE at C}4{@VNle89T(%dO!lHRuq_?Z_`W1$k78W2r7o5&b>XvK0R at Y){-I z5Jkac;o=AO-&pD1y0$6*#Ig*u|7s9K%-+pT*y?||p~i;+o(B4ld?0=!FEKIVMttTx zhn10+?S%v`Js2^VHVTS1Q5Hmz`+AQSMMjR6hdHt6=5n*Oou5rr&5ebhsvH|}^Frpi z!?%(@-^nZ!Zxb(3ecs$w$IF&W--*v$$H~^8pU;;sL?FJ{fU0t`0>hvzG5cD_rr{Yi zbOTA at 5zHh{U`C3C2%Al*PZUlAj7#@`8M~gT&r^3)yWNQ*qgCr+0MQJPw%DYxPOCU3FeTCYQ>9_!JD+ zCKA4QtdeTgjlbcI1zB23?r at tty#B&L&dLL^$eYf(+s;kV3t&HGd;O{-&M}2pZ5VK4 z>8vC5W`An07mX!^%tDvD}|3M#5}f0ydp-MQ!hEC5 at 8S$mBYwI z^^bVrszlIeORtr88)*M#pQ^-(2Q^^~_g7Gg;H?K^hS>I`ZwqL) zfh+I}NaAk5fxZ&^4NBCt12Xpg?3Z!j#d?Nk!)r^iX0V-)$03}qqew!^pX{A!VRc+> zbIxYonV1bV0lbnvJL6VUi&D-f at bZB(VyPI`05_#%g&Ok at k*9$wg&)7CE?L%#hL$b# zle9-e{%7km%Y@>_m3Ji@=Bp1YTf?FR$qy&ZB8026=*`owr$x2M1{DHz>jv9)W9MrW zF^vJ at ya*!;z6H|}dbKU9v~wvX0MY(x4Bn)OjkC%SKgAdEcZtv#o`@2uqmoDvW(HMl zSC}MGg>H4})T?QHG7OJ(bZ)~obC>a75gMP13+}v)*%tad)KV|q=?hpAMmbJ~)VGzs z3>}V0AS)aYB%vHau2CvV)D6tZy%RVQkJ=7 at DhWa+rA0+qhqn_d&dq% zYULcF at 0=#~(?$w5l?l3wS~;s73~G|Y-fYdA+BB40^4j*x_1bn*dwQssknxPi1yl6m zK9Ld~k{C|`lE&g*PWfw%jn_`u>idI2edcYK{YpX|r^X9{2CFx6Tiq4 at teJa^gxs5` zxYZ5L$#3>5Zm;1oUi3~vwy+-4NDy>nXT?g>G*h93RiB@@r&B%Q0KZc%6 at 2S{w_0Sj z^U?*5$N6?nwrdey7SCw!xT!mdJ7(`P%kRTSzWqHacO%|3@=V{vQu75#ej+c-$v4** zeA_PKnMakZeDeHI(B)Py?L{urIaVJ!mNnGrC-7v5k{*S(XNIM$mX~6U`Ckf$Fqssc zOH-1r8t`p_HrLRWSYouJ!eGyaP(zQar*S(@(V|edTM>r#Y(z}rh$&`y{kWEirxJ at E z1-WJLoOOo09zNaI_+(4lZ3)sZTL5>~{N}7ruxzpy`8_20L#A0tZF~Z((Fi!xIatJ( zb&*Z7fy!0O{1sHor-W3AC$h}9``e0MDV%E7)NiCo9nmv_WV6e5p&<;1^~UHN&cz!e z%rDf?jaLL5T=jYB;BA*nvK9(5piu>{zzh1oY!_A1ozwmX84vx_}0m|+gz9=ehukJ zq6LWZTw=7neBN at sLM62yY{iBPy>Pvp|7WZiSrPCh+l04?QH%DvOjck{!3kYsbFPt$ zzjd<*qe%d#ihilUX1+(K4>)AySOfg$%Qmq=M~Lo#KAoW;hDgRD0p5f=%$19OsVCir zAI8a<71 at NXUCJw)kZwMZ=kN}N2^_cRFoC4XLxK<2I5mnZdxorRN2Y at 87B2lE($Y=& z;y-^A*7Q>h=AIp=Pc&7(l;%#_5>{jY17Hc87h`Kg)f at _DHMgi#@n`s<3-DGI0$| zJa?ca!6=D at IL921z{o&M->0KR{2#aBNp+mYn^$F2vXql{^AP1VGYBj&u7Cbbyue*B z0lep**zS)B1Vr(l#&#t)v;Su$VU5Oz3$6zGcdgk)gK{>Pf3bY_s25wx6$Oc%(*Q?7 z>tQKOZO*X0EDDvDjEzo1_k|=aW$CXVKxV4NZgI)4si9vY%y3I&rVxOW7Lw$F{1?+NcoZqNHjK)@#|5acZ&IA2$OTyMxaVoY3<&y3nK3lToM`-q>L>Hfi)odvk9*~(%_g=vyB}~Xgabu1W1sz at x53xi1A&V7o_Ec6CtMju6U5cVJ^J>*h z^I&KOGwB+D0_amS|ZKhm^ozZSAZ>8q~ETbNT%1?3~PV zxVCEggpoJl3|lv+r8ToL*F6kRNl(Y~s}uEgdn5FtG#TmDq3kHvIuAW{`{F>$JPZ0R zAOHGERHf0Uua)Fn-ppC+5EC_0)!o`cszVVDKv70=f)OYU4b0r=9*u#Yi6gsg0`NIJOjrY`aGRa09^0W7qg zJ_GWJi5YA)h{s=Fwd5R%Dmbnct?>-JAh}YnwW2WiZ4Nz(?ROpksqK^`Mj?hDHJqn6i#^T1uqNj^aqe>1;A6@&FbGe}PK=aBTb1dlfM1xPyppcQWU1JcW93cMTfy4aUtt`}Ev&ddR5jx| z<6t1<=?6KKjQ8_uU_&iz>EXR-v3zjH?c=u=xX0czdg8ZG*5%7 at AXi<&t!qQl z)pXg_jGgJ9UtNDK?ZE`owifI&FoaNa77OK>)rTekArc27vmH>i?qfx8 z+XLH8WSQu`IBx-nKu;+GKUOb$rvCVFzTEeFLset?mF!cAA~PVIh_tTy(AE4dv873z zkz~%Y;Q!-WXLjnZppTZ722aaD!l*BMpGeAhg1rxZ-*`G96M(G`fu|1veTf8+_Nt(a zj2Y?XGqT|~w8DReE89V^Sc<4H%z at D|taE#^I$0Myj#G-{S zi=fJk8tSmOiBY*Q$|hp5j>r)$b^LN&Q)`yh9Z6m7%yBs2coOKV<6XzI^@0DI8JMkY zJvO|@(e~p?GU&New}{GH+(2x2!f9P8q+G^%=l+~p-&(=x1hnGF>cU0-#TB$e(08{y z9fc4GkV at +l2KA4j_=M28)8Q!IZAkmf6?=okm?O++5M-_wL_IdR_5WNcJmdO(Q#J~w zA&kN#e~^rRYxVsRh<;$@8(&sA>g^LUwrtUp6C at o6KmAR%_Sx)&1w9E)AGt}L(w60V zX&t*wy^(Y5LqB%K5yYA-lkh9b{SL-%syuZI>d`HX4k3*8P*F>~ol zMN8}?E>k3J-W|QIF9Ltc at -kxFi%QTTM$_~|lm7nEZVY3Pv!=G*Fy at Uc+gJ@afb_C2 zDLH`YF+lm=Ao+(A^b_$K`E#4X+EMcr39|(Y!wm}^I68`mA|#lVBswJAP}+95dL1n3 zun3PaQk+&vrMisEFK2{qP_%JKI-|OQoYG82elj&XnVy?k$62{`ub9rJ%og at IVH8hA zQBr?LWbrPao1ip1iDl at g^T}LMFo0wh_}|4SEj?QhLqLFlS|EUcB>&R`fU2{Ry^Fbn zvz?jg|2}m7|9YWrW#;j(DIFaL6eXl at g!vNKs*#O@&{g#kw~pkLjbX at 4iVbVw#)UAF zQBKVDg9;z!se``;R)rjQ1B82VEVEjvEy>dH0!*wHy%}%Ejr;#|6?X%vh%j>~nY3_n z=sHSaVo2(+AH+n!kdGIO`(vw(jo#XocBy#j6;CnUl60uBS9-zCXGURjxa*W<-(Pu+ez?#INR#nc_n)(EM-V^2 ztUE4b%V^SuzFGIsWHWyRj!!ZX;eD;it6!XVg*?v<_n!m(M#0M2<4 zgS81aJb#$Ch@@U%A`B8R7M$;BHP3ht@<_FzqfPhGa_|-=GzVz*|HrrX$Q=1PQ+$PI z4of=oJ;fWw>88wW&cVZ4ja|Th-igRaWDXFB>FV!I;Y(G86 at JN(;WlRgM-a at Cp}SC~ z^X8e%H={X85|8apDsw6F;T;hy|H5=6=fa1T&lI}+H%7(rkvl2KKbEcu_FqZ&{2wj- zU-AknHV#WnX#Do?n$q)~1Cu7SxYfUO$fS`Gi7TZnag>Yu$<&`C80`C!!z$x%NK)w2V zH-H|l9_ab9+^581pVuY@}Jd(kVxL7?nf at okBZiJ-G1!k&6t9-ur;^0}FNa;>RhUH|mqKZ!d_A2!f`|KX`q zt0eUzvbbyd_2I+QD%Bu#Qzons!H(047b5*g-(Mn7jp_{=h84Kh^?+U7w)!5qD51^E zC1H}H*-z`qWxdy)bku at qSP&wrC7z;D1P zKK=(k8<77i*^d8{W&NvdvH9Pr+CO&outuP0RLjEPIxxh*$~4+k)RQ&rDWxrn-UHTY z_5H$)GD+|yY8N#-Ei2x*qu6721>Lv#teNV(hs$NNuM)54zkhze=4_iym>C6zWxG7{ z?*4tzQ}}+rc at YG1-P2*rj_*z%WQ)r%zWjYzVwOtpqCcEq2jo=I=8CMzh(sd?EOxGfBP1+H(uHmm+={5X6)-BiCJz}q7>yge#O>7(z@=&Y5fQhy&r6o4i1N zQsrKoZw*XJ$+4nciz?ntCp~@L_QNYG$g4_zmB8WJzF?Ofv!<_eq_kR6 zMa~nkq*qb6>X{P*RG7&fk`7OK{1^C(*0(+s;>J3D<51(askg+kD+>jF+Mo76Z40ti z767P{KS{`D1E-VO=C(}@Jv-?Y^AR>1ftl%LjH|gIICl(jIv_hD;UW(hPOz5!Dj at Ik zjC)kxp52Ul;G$s7tn at jXglREoeoRb+j;Fgpo;yvHhCsh%x5MzHT~KNENPVYM6+C at u z_E@)$oh15CurP1IuVKOq^TyIZdI#5R-^710<`z+G3()jjTc&ejM9PO#Q at c`7kEog{ zbFfkln-{O^s;;cx7LU#_(jshU^^oEA+NwT+9ZbfWwmoTLPORn&T<)GX&sf)62Sj}p zbJs(|Bt;#ZBpoOVD>pAAWkur!`}5klvvJ_jz?`vdS>lM7h{5#8EVR+|U3INAGynQ6 zL6~rPlg3R?8u8{E0tx_H8H5;W at BqE0m)Fn${gQEA{82;j(E3>H&FjVE3S`;9b&8*r zbImN+7V`1h6KMZ+3yc at H_laJc7jZ1gT2s=Qi=@jX+K7L?;Dvts1uHF0PdB%{X*TIyZ!G< z03I#IDCNM?JDm|92x8~NvC?uu*y;9>OWvif)MLd}~)R-MY?Tiv3M;-;_ z2P#k_^0`s+Z9qZUcr)^JLG!s#p~cX!fKVb`4m#p~mnB%_qNX>Y+1sl at 1B>Vu#y8BQ zewn|4(3`22PMb!;;RJNy!lBhhk437I29skPjV1XjbwMb7-YFN$c;8&s^dWS#g}p4#J?T62quZjU!{DQO>L?=v_0|tmP~)yWY^5-X0TpO zg^m$ojXG+ow6jp1rk9fA+_JfA5X|X?dQfx52>QvjoOty9eIuiFY%gbOZsWH%KKDl?E~4I at Gzui%-S)i!#IuO z4#@0bqt+f@%P;$&htvf9ZfhLu)?g9Tve_MRBS(f4_ at I`(_UU}xpz<43)gwTy)W*dV zkMq3ahQ#3ta9u6 at zvmy2H_C2h;6Olxh(JKR|7q-$v$B^n@>F!Ta&WeC_4*&>NHSqJ zD_hflv1D at 8bzD%*u>3isy6ie1;|YpY5k?}dV2b||Wde+Kf+02)C8-ogI_3IGVY9Xy z{}{s3cnW-ix{bo({~c9I-&gE+>b at Ox8eO;>?c1xX at 7-WO(N7z4_=qaR~T$ z8BhRvzqO*5C)SGMDE?&2J|1c(RM>+PlbKXZtp90PccgK5Wx>u1mx at 0?;egK) zpH+wV(Or3%mMND(`Ltr?Ez_>F(?;14XDClwaokybymj2~HW0Q`p2DikX-f}@O%z>N zR{Q}{qOtXlEwSUsS*}HL(o at e_YkaG2s*1G+m?KJBBBqL;6Qu3oa+F218i}%MlH}zW zt4rrBo{=#bm#X>cwy^bjAo at L5rzR00{$=;eOn{f(VoGPPuIj)miV`6;HRLkM#Lfw| z%3z1jbj@*vi?bdr=MglwDlPc~OZh-I*Qv|>wS{f7hjE-rT$B=_`#j&e*vh-M1)N~m z-DO-8r#jtTZQ!8{v}Kl;H=rX0b7o^~=DiVlmeX zq;$$}L962$Hr~>^=hlvpy`Jm{?VpNnBO5IYP6iw97-j2uCRv>pc5h8G*Azu{Jz^+C zW}TAPOqk>O+WaI$MnlB`dA^Y_85s9`JwOQ&WaU<>GIai)l&xC)m>ISMRr*+Pu>NIQ zeHonsb$f6X-lH701GOjanyIeFEy9l4Ey0e)EwDiHT|#i&T|~%lbTJ{}LvI6>CMwn+ zGPasZ({o8|hIV(?+smWZy>Tn=jUJ)g1HBRFvSmEjI4wFmoTW@$QgZ&OMNHJvobd~u zx}yWvQ-&1cEU?}DlnGwF70m3t@|r3UvT8>|YfblAeMy!=TNwAcN>d&Zs~GzzbPk?A zh^qn5Zqti0*;QKl-=1RIB#PA#TE!iVU|(3(4VEiY$W#I)X_o3U+V>b6Uh_df zj6xd at s2^94N`E5V%F=DD#K`4LFt2JCFAF+IT at lrY=kQg-K<@E9h54h(->_Re_WH!u z^!emWa4Ri80l)f4m<@`6cTq0kFHt;%;c|tbkZ2`ha at jq)U_CZrX|4-a5H8)&mGwe1 zd3ysdyMXgNklhLpYS(9iNuJn1cSQyeEeB`RVAwFxEHT`9VW`-6J#>K~Ibs%6l{%@qE}lxeMj{>9xbu zzH}u9kVErnCxn#?V!~`w{A>fl3O9(hMGh_J{Me)9gjrGa|9b;U zL~;SW8W;#j3KR&4 at BbSAd|54`54Aw%PUx8 z`7U`2bJW0@=NFr4i_SC?yySXZL(|4n}bp2}K!CooLgLG#j9ZI{mr>2$B^G8o! zl?-oht?(C39CSW`ZZtoip-lMLvNLgY(!G;f9UI#o0z%P;PN_5xS##1S{VsykI%Mzt zL=f2`977cSKo&m4IB*X8)w=%6KD*l(o7$_BA2npP+GVhp>OieE>{nxvxiSNSJMb$u zkOLjjUCXHEly_`VzbmlN_jl;XU2Ga-zzH9$NOmFF>|PXMI`T<5lm5(-rav%Nq3$X% zrDp#X^6CNlRG;yi>0dkggtQ`FO at a+{n%{W#LcS_a8CLOOPM_&}%m)Z03wX?=tkuA--^5n=aZK at Ey$A`%h{&PNK^|R-d`}w*2 zBc^+vKAqoWG544E=jCVjC-3jqPw#^Z(B_>t(i4}CkQ_&NO!|R7Lpa|o_#KyRF1 at 45 zQH0g?4A|`(5sg!>fq92l at S5Pn3}&z=%s&^7!BIrimTyFsMY~sO7Ng5U3Q#Xj{~BBJ z$yKwJPDeCg)RabWC3WJ2RjVncQ{@ehzfp at -%@$X=s*_DMS~DYCDZ5n;e#WDr#OLvs z2I9>WCZ*g*y;b&7K5yLoF9wSZKdmA~CRiNzZD70kNqC%-FgscYosmBhr88Dd2|`e> z11ok(&$cQ)Un5dg^Xs(*c5X!7Et`{CBLwg!a#dSCoc{I%q>N90myV8Fq-ZS&a&mDv zuar#qWJuX3d?&|av0F!OtQ9S2aI7)sW^!FlbZ$(K4-D`2ZLCJPhd2;TXQ){<$V?5E z`hPtHLd at h73XZWaqhI|I;5DFvn at M+fVCV_(&PL#sZ=fffo=g8SCob8ivXjkaHji$t zPMB(jkI5?_?Yb_`Nh!QKXt?-OubY710H-ceVkf__5v04pS4YfbQXE~FK>>{MP}G{j zGc{W-*&%L2MLLV~J|TJTt6Zgr at l8k)TF7I9+woZc7?OKuX?rWB2TEf$(Ki$8lVv!}X at dW1!7 zGMY;Zwdp*@&pC3IC at WD$S5d at dta|#WaDWC!7cKpX&C#-hH(GU)4h_enMTL2zX)^La zRoE(xYj<|WT^MgdVUzkHf5dyYez4Z=vKvVtY>Ald;2WuR?}Atq34RZkSa;9`SQla6 zs~bre6CosiP!Z~-kT}F2Z+`x60wpx=%^YeBi+LuT at t_1rf0P!u8)vZXRvTy+!3e>Q z*!FOAj~#Ri_hd)O9>82|GzT}PVr~A-FK>8iD?r+J at L@d ztk!(bP2)MRT%5tft6U5+o8b`&twxWa>Gn;T}Wu0AmuR#zE*OBE+_|HL|RwuR!>Nx3W2a zNXVq6IifW`6d~~PZULkw>iA%1ivq`GdR>}+B5V3!h_Ya6h?C48CdZ$|8CAev{LBmW z+iMO+ at G9_G!Ry`JBF^I-qIv11n8Js*{A3+jnY0$4w_&rO8k%QCfpkLD^+FDe=dqr^ z4^`kwTr*Brq{T*}?1pFcPKLx8_OEl`4$a^{A!Bi{(nHD1*{0_PLzuG}H at 8GbQOM#G z_U}gDgu#zc%e)dTNO%;CEhh0Lsu~wbC3(^ilq3iKE1Iuu!WeY~f20ZuqO|vSQyZlAqBB4EuXQH;b6cYul05<_7royLH`_0(3FE;Os8EaCGq(|7 zG-9xWg(*}HBVUE^SB3bz!|s=+BfkYRD`AO{ZqAwR+tyQR0rt>UwSNV0?z2bFctdlxEEUymhT+ag=Ib@ z_}-#|+xxH|#%om6L%sF>s26oaNY8GkbMMU;gkS8{jBdX;6LzE6jS0_3L at Y6SEYVFn zPlx;$;(jkHM2h4hXa-A^|J8)^Y7XPu5b at NU?8!i(rp8~9R)s9t!d&zocLCatio7Om zPF*Ty8Cd8EJD2d3`a+VBsnjU(@GRl+1 at 2w^P58VA8#3%xCSQ0Hqi0Bur3z_N+}ua}FmZ at KAM$TpMHR{RF%rCi9tVS3R%!pzK!W at 5IR`D# zastPdQ5JSHsUdB6LuWmtT1|o-Er>#^6wS2W16%2b>G;zUb;19MpQY%2qXssHAH`ooqOI z?OEXF8(qw=ALat`9qA4tji}eh36#eM+V0VQ^frikbo=dWt?A(8SM$95Ax;InG8Np{ zmS9ZGkg%LfYG6QNAQ+eK8RYv(;yoPOb$8J;bc4K(cQcG@#>kp!BB_RC%4`hNq(AHa}l9O zZdUn`2Yz{K*F;O_;n{G01mCh37=s6L$3NLYh;&D2ob`(Q98OrIGA+{>5l7$T&vMIJ zxzkR5AaC}}T*suVNXQH?YcVv at qoHJA%^NToEqaFX=3;6UVjF}_zA2~;Uf2hNTqcR$0Ns at KBq{uM<>SNU%Cu))FxlIkXG z)obY4Vs(N`3)Nw4iVny_miQNt;=QyDQXf%UUzpv!HB96yBZ)7x at E08AeOTg!wI_9{ZaMjy<^En!?;_?33(SD7ktnVP`rQty at 0 zF}zw#_Dg)&iYj_CA!S)#$r*lXJ~;2wKGRcvke;rbUY^2PPVEj%?aWjYdhft*Uq z`D?KVTK(|{bG!Vc&U_!aM`BApR7x3r{=@ITNyRSsF3=Zn003gd|HPC0KS{;^S|y!L z9SxoB|K+>0rH|u=`aAm-s_TkLM+k|KKfy*ip(o_u9D*Ula)6{rAQ>S^sKq=jXJC+_ zX%+^ds$JFaj6@%?wk&PCoX=`y1sr_x*kFJEcrSk^y63Hc|14_DWA5sziKfTKcl9;P z+2`cj=k)#a5_jA8=>>r6&K`|%h2XPjILtVfj4TF5r~KIM6~doqv;j1QMtw)bH?wT6 z at uF#_Z}jq)fKNSEeXxAsbm~5Yq4qGU`rZnmE<`b`gP<2h47hiCQXlewrgyS+E&W3a zv^Un;dx3rZCJVJa78_M!U;FEw4gV4M$D2L;HlzXHsruuazz*ymLX|%rVg58H`dT6$ zjC2_T+EUmp=D0rRs^yecU1-E~D}!a*(0G{4Zfm~TRn$7mZAN8l!^3#@EENHZm7I1a z#|;M3W#n^g_Sp at eyhOlkR0cjtOg3ONKI4z2y?FwKc at uAm={De4E-r<00b5nhV)aDp z67te9T?G^qp}g~q=WKdQ-8}Cihwg=3MnGpx8%2f;#fbCGM^XvymFlU& z{rLbTEwd4gf{zG`ScN)G+y-Kdt!iz(^>nG%_b7GLX!ivuPM@xa|AHdTe-W2(+a7|La;I3m^v{A%}LzJ-SfTBjoN(#B28Bigo0Gaf37835epk6Mw^|959Kg5jn(#j=-gP) zhUrziL-Z@!gY=c1&<BE3C6ayt!1oVV1FX ze!-O%p;foBK(?~HgoRFz1|WOHNMEXgR}*Q<4Ow;BnKDvqUtY#M1}w5uqTh|sA|op3 zJeMKore%I at Hg!oT?zgJtomfK?2WSEHC6|0eC73U`N?Ffgou*n`phyuW8(Q1kS6WIo+p=L zi>TRtT at H#J*{F13229LOv&-w=7}EFxJC|BY?;t zjQp9IjF#J#3K#Lh#q&w`Woh&H(fmN9`uk4&L_7~m!0 zCoODnu*WL?(!GYLFBosHkStwAaayH@;EC)a5`u5UO>bQuf5#O#iG=cp{8lJEC*>DX z^hbT*88 at r;c3fYcL6pt=TmK9O&c*ZSc`VZ#+|E$FJHl8!wV*LtRZYQz{c?4nz3#Lu zOs6^#0=_Du);D}ITl0Abyd1M?r!{i(^}*MzF!Ae${rwwXW$IV7=!@@VJZ at eH(-s}6 zGdMa)Xuny(K`;5B5Mn~J5X-6fohG_&tk;R+9)TC<3cp+!FW=4v^?3>cd4mB>W2Dv; zY02&oFLQOC<_PFd%rI|5=+1P^pVXw}22v_&a&u6x8)Bq13j50#R)1R&H9`_A1(^?jS{a zc6KOFW1m|c-`nIgX3vB#I*+hbCaqV})jJZ>Mi*Ew(rpo3M0rV$$}1(fU9k*D^YaCL zXso8xMVJPB*h2uXO^>aPE)iz86_{Q_;TA~sLV4e zf1xLHsv4W0&g4M>S&0NpxL1mRV-6WWpIBZH^AK|M3=r)zjpobIJNmR951Ks%QC`fg zcb_A4^p*M>+thD~VQB-{7488(E5_iu)q}YXDJn(SFGS=A*4ON at K0mw#&wsQ07N&jx znjNkAh6A4e*q_86|D$ zv?=#8pMDpD97d>0Tnd7%2j;V;X{H{_!S$2ur}9`~G5dOz_mW`O-)R$sXxg{TpROn< zgfN|vPH1Z76}fiGP+Lv@{u{u6x^7nEpLAXjKmY*N|7TJ0FFda-9H1aVh(05Xuu*C% zTC4L3jF1tdV0M1Yq=n_q#218mlLJ5)5^FFF-BcZBGa0801+ax-k=76+`jL}7xVM9B-+4m9^kegU z0mJXTF5Jc8y#>JgLi`>VLGvFTjPZOi!~YHr^?ewCe__}C>;V5B1UbIRgZSuj#endMQ|(&69b z!H|?`ktIPwW^9Q`RgU10ZAizGY=gDDC;a<1TbwFkb

    S%jIwh)F7vcW&@6j#UOu)OOR>td5!hi{Y>*=Jc?4wfA$)p=&u( z({C9C2ZIbhfqwqoAjPo>TR9t*x(seHOAU)tGyKc+F{WWYGs-*x ztIY8iCA#c#qnAhS*0gi!Bgc&>M}tzUT!|UC z+iT2SQIo_7T?1>S1?$`r_wbkWTA+Z5x~SY4Au>>{m-wLjlT>?DO2}#=%pp9q!vQ^X zcmg`pB9kNZYC%W?kukE|APUqTOG+3pK_b&I^L2kzh%p0xe?Y)~ST&RsA2~Tl+^@*? zUV-5*Lz7JH(`}NuOFv2dW>qp8d%f+~9|ka26irteB3-8qy(3>~yHZB>rAexCg`Oho zi^a}ee;41x81vQw4Kn|mDTae&-N%vjj>v-}YvAzKgKbsvDA!cZu5Yn->vNM>i at u7> zeq--_kEODZ0EAgq93N{8Arw0{6enwQN at +}@Brw-f0wF1Wkv$gZfqdd`p=jZ&BFZ1I zKt3R4fr#zBs}}Tn$PcTnKI4*Icj*vfeEV-u9BEw8b3-H)p*aj-L}Z08um$Zx>8v>` zw7yrsC=|w#b at LSKS+eBlCvsNB$S(y#n%Pz ziExrQq{4OyDzxDvaMvj~X|IX!@;OnoD$zfu#8Jz{MfR6zgZa%O1_{zXapP*E3X068 zqP)}yuMcqM1SA`@-w}2mRJyK;12&^cR>UDVA`diV+LR#>#Ck&v>&?mpF28&-r<5Y& z5>AoK&!P6=mC&yTl#_zg+WFn#itt6FR)cCLOdV$_dmg240gDXBrUrcIJgC2!@5u;Y z%v8 at 5q8w13+;A at lBxi!N?g~cr%9pF;J?l*v=>8TBI$;jR at Rv0iByE#a3C|BIPTanq zq1P2_ZWXUW^WARrU5B*`W<2uAnYVjF;iP#0dw=T{&Bevm}~U at k-iU_Ud{3$h+r?!j1( z?Z?SU>_SMBOYz>?gKHu#4a+gRW?*o+>>+pT`cAtX6;Vi zUiXm$!15rN;v#`QJ(0wK5JTCh!zA+*{iEU$r3p*1f_Q$c%G6VJ(-4>79&Eq!vh_6I ztL?LS;R?C+Pc10wv at qJRMjI;|u;;KP80HSi>~XyH)c?Q}%;8if%|S7%Oh~bSr8Vc& zu7M}Bl3h~%PBSD+*GyUxOKOwrt-%JbI%5r9-I=c*k3fva)`^TyZM#tcv%7ut79A2WmjKqhw_`7hf7hXN`+SZG?&ZHa`Y^op;7lYM%EIovmgQf zuX5#5oCaFkc!sJ{UQ|pP%T!K<-v^#da-2qn4>FE}DW&Q5ryB1Vt+Vri8Hmht5Q at V~5R2ek>rN_D7^x6piO0DRN(-$^7^=$lY{nzlO+u at l=i&#*F zsOh3-qsd4?38H5Ka*%a9_AkUkOzVz#aFLx=Lri-4>8{Tadc%)VdBuiLc-uCx=gS_n z=U3UFou%35B{>WC4x|;(*KF=7bDNvu?$R#{o3XUbC=}MID_Lio z=(s#Ws#maCrVXG{CU;ldTUBh6L5#N~M1&$~{(Cs*B4R|mdSmeapoWz$z>ubp!N^s^ANE5EBL&DP*{LPZ)FZGrO(A zK5#a9)`pYFYtfAw5W>{=Gw#FUu at Q7ueDZA~6NZEt?JDfBGM<=2o*}GS{D0l$qm9IT>!=$ zcdY|t*;*Gj6`f&KpuE0*%PJR#R=h_m2Aq&4{rtDK5F=~}Se^gSMj+(>mCODQZs`82 zoy)g^c4tp at Gm!~6BNV!fZl~U`E;O{TTm*O#k^x}D9`X91QT9b-Z^p2=E~7w#FlO$X z>M*CJS`GJi%Y?gSA1muFC#&V0-_QLqZGbjkr0A#`2=h_$nK*GASQLv4bdWkWD~kno zk-?B-li3_IS-M+p*9~m`M~<*|6WvX9M%JZsx^ZdI=7-I8>m`Ne#8w-<`sx#eCT(kN zChg#Ko~%;oR&#dvluI18yGyP`SByWctd~u=uug-mnrx+s7GP+% z&e>A8Dk}sI%!xP4G~$$kD$;@}z_?b_cb&VE)0u6EX*X0QtWbk{4AL@*2VDh4r1Na$ z;N|h*MZqhwC>hOZ&j%1p=mi%m8+$Rg;;|gE7C3|mzgdR-&!`jZvRtH{yd$_Bl*1Am ztLsDYtR_b4nJe=CQB!TYxUg`Gza%jKghlD9gtuxtY?V*eSU#@22<3yhOhBu)+0hDl=MCbSr52J zCAkGH1O6MIgsO7bF7txKorDW9A!4L28CH)=Z#%TV0cD(oMYRpSkWHandWX#qcRBJ& zy+-}JEn%HkY9u* zlwQ_q`ji(5dGYMMgYO|k=I{mtfz=5p^(RT4f+710A&lr^9llZ zkLQ(Qn4fL(#Hz7LpakzK{<|Bf>4MAa{(%k7e_(^{f9;0=H6@#&cu66nC zKTbJMSkwYZkaznt7jee{usK}EVBSY- at pkdc~0WuQEd zFo^;^12N0h^4g&zSu9_l-qNDhVpI5C7+4=?GT$v$cfUVI(t#w5!WKd+i1J{E!dZ#0 z`X4uu24Sxfp%3Y1L#^p?huN}^L^1}vT0H{!86cRaT2BX+?n#nQ)(=&X7{Q&igSt)5 zqEY at tk0vRzRd+jWI7eNgq{NtGk5mL1&|s58OE!7=u=o7hoB}76Kd7`TdGz)hk+Qt* zHpnnJ5UPn)hAz~0SzpX`UPxft=nie at a4B|qEJih}u$yj{vlI#PceKh=Qe2NVQ=Q66 zOQfx1z#8H9Efk_fUR~=pU|Y{&oSco4X8x5ueHyEBF0xLwbg*BuSFuQhw4if%X^V)T zW3{NEZUpQTDU#+0s1L;@=oEo~V>Cvk$3o)DAoiMJ+DW-P+EbG4NTWZbmmKt at y-dvgVujU=?LI6@{grkVM!!K+^3qb|G}Anl^7PVe z$K7e2h{Yybrn#Eq))t}FPyT2(lxrpx`wjXYRH(|ZAwNcS5hrhwGU$|>g5Q)dd*|lN z+I2pwaT)c=AbMi>f|OfhnV)JjZLW%}>#NSFO)*63c2a zK%PI(J^V?1CQf)?$xQx75sGq)W+Mj=?S~Q0qLATi2!&N~aSUuXNQP(^pIC%q*t3 zA>2Y>ctM!dDMQ0O(G{3Qy8mU^PAanNPM>1n2m2`AdLe%M$&8RpNie9|-UtyZULX8w z#1H4gRs%vWeHd at i_++;@vDt~~of`z at Y@K2sAt+Lj*oT%)x)D3}L4KcAq`trpQvQp; z_W}`1$=}silHYcVGda&O__A&t7s8IOL|df( zL3XRu|A5E0%;LGU3{e# zV_ecv*J>HVO0TDHih8hjw;LXA$kK8Nt;Wr;{E1qxqV|^(E?M(CmgEOW=yM zO;J-l)q{pX!E0V2YV?6UoWnqKceP>Y5 at bp2%aO+CaDcz{Dpv(iF2 at 5XXDbYTqJ`8! zGp at l!rVk^if$VDLda>$RtGgD_*^Fhji-#%-zhRpQ#=`u=bpde#uFQ>&Sq3poErIfv zJD6Ev749|}-=ok#fy`dGD|R-v6YNEkyuO$?5PvIhtml4K`a%-*vz0>MLrr4ZIak}J z2fZl}q6v78E)#d>&(@2^3_g-v)_xC7iji7p==hAhymt%~^iIfK%v5&NJyIWtVBf!} zBX$lY9%}*gAL=NwyZ%q=IFA3S0OS-te^$Kt|9b!cowFFNLjVC`BmIvzU!{y)tfXDd zosC@`oc}8UE?v;nF at D@Eyt6W0r8tQb0|J3b;84wpj6%Sa;lvfJ4BSwWL; zekm%-y_DSi-FfaoOcV at Y1ZY)`*O!;1#cOriTBmkawV1yf6B52`-uxX<%;qmETawEt zN0n2*;eXw7nS0M2<8M3t`sw+^37FwR9ktm)9l*hZJ>*ijdw}HI!Yv#yvI(g`L$o%C zVp=&AAYkd9mPi&1AhW1LsHP5T)H%T=`{zT%qMJH)?MMERi3cH80ZZ{kd1EXDg zv5}LwBmK;H)f>pCdaDS^m!6kn-iM2rE@#U9or!^p^80tl$TR_)#KWK|g95r;wi%x? zIHHtNcPJRUb=Kg`3~p!;l~jALpm{6>OIqqgG+1JBTBa0sMYYtEE;Z at ylv$TYyQGLG zQ93hxnH4OwE~caF*xq;EKw)0)Z;|J{js$YomwdL-Sh0nPW9i6qI|{floS71ouC4R> zc10vka`*LCW@#Rbj~xC|Q$?A2jB0a9`m at ul`&=W=K|J at lziFYDB=G#ZpunLEErR<{ zn`{p#Po(a%$idp1G!~5n)wMcsYPqD_ytZ6iu;zyV7&RKk)A|A)W^o;n at re_d>uj>- z)q;$;aQCC>oF>)5zgqN=9B|T5FFMwhrK8_D)Cg#jk|Ed2t0w%|cM5i9AVxAhz2IJzZsN2(l1t~j zdgQY;z8x+Qx2_|%(o7?*g3DO>`lI at S>?R}Ue6}T<$~i4}us1H9cz{3 at kNZxdog&^b z4srwX}r#8Em2?=I|%$BJJ`AwR#mg3Ys>Su<{7tfq?}#BKmww=C>O=Iqgz++ z`#cs88+~)3rU=p(hCuBe$*42gVl9dRz0I^PiVX1*N%J0d#}^A%eJdaq zhCunAia_-o{zC1ZD^IBb at k5<2(ojX5fh&i`FSHDeujT-ouj+uCukHZ+GpqA?Su8pC zBQ|QcNKxd;Ih@}J9!+(f-)o at 8cTP+uhMRjztpQ#i#;@!^JV(Qc(;z89YcIA)^JX$D z8L93oH?jVtE0mm$CS{}oa?5dU&_IaW9DP0RD#c-^G*p03P2bDdBB$CX`5ai2Wsn;4 zE4BsQcUcyN2p%QNbOQcydo3YZHWvkLL;aD8kQs)A`3xq(YO at VSX}38v(cMWk87gu4 zYl|{%^rWR~(a+yr4=xpVbf?N%_Tyx^yRX!;@UIzrc$e*A#z=f>;>`@~5MA5?>odGD zml^D&6VKSPLJ2A{ZG|dm-2PoM3a*9urO6{!g#~!=Q(;?JFCXTD;4|FauG@~BJ_rg= zMCH&kn at aZGYW7y$vVwn4sDus6_g at N}HuYNe*sc`I3P at h7Q;Q-65}~gCNzXB~-*4i7 zMtB*B?sS;=LyfxaVVt`|=Dm`jj3{I26M(PfLt5JE)qHSkHh8U;N}XV at D}E=l?Q3jF zxZL8++GnxfgywC(B0Ik-43|(-nVBwFgUv1Bxu3#9}wRg=60qq1=e<4 at CP_kJOqI}2CSNq1;wkXz% zf1q*N`i~l1Gq%fqz>PJ}Iq7{A4c4Km`{mw!f_S*k)lpJsb+5`h;*>R{8nYV&Q5eI- znj8E%PA$j}!{g(W+`F1i4|EYYIYuM3@((Wh!l!NaH_Clc9FEv2{i*`d^gyq*C)8XV zdoIUx7$wiAKD60upS0IIMoH at qEHxfv;(t7*>rbaz$;r$_3_7K8OtszH4Y?GwTK$e@ zxTYO^a*NG4Q!mCsrl<&Ia$+Z-E%UO5p6TLYC=?g*NYKV#K&d at X(>=DXj_nIFm&{zp z`IX98lo~~`hJNsrUf<2_%AnM7roq>#?v=|FO!JcvT{@SGxL?nk-lHAPRIn7DVh~Qj zACT&eWb1~l?+vx-hTh|i<;%8vu)~D?tTyu19t^M|VMN#?3R2t8{e4d~20q5Oo7uV4 zQ-~MJC7pVV`0)VR`)P0J7wvBf8QD2CXP9IWXA0_7Dwq6diCirenXRW^CnYSZ4ub;_ z&1P0p0Dds&kkG#FD)$GcjWZZ-sdE9RQnfmqQZ(DVJ*6;o2rFtUP&N#+ebT6&PuJ9n z)6kCdPMeCuC*IliBh3(>pS7^S{{Vd^on&v4(NY(Af at +Iwom%yR21ouYBT^rQf>9Du zQ!6xY5L&P;suW&)!xaP1R!2;Kd0yrgGg%*bB4&mBwIL9PTcKW4>ZOVF1NrY+iC$xs zbq@>#WDNE{h9y~ZuYZrqTs8gpMIki)CS9tO3y|9KOHPfpfWnNodT3mOJKH8RdA*=H z(cI?kl$Df+`$m6s%& z(3GqiMx&V(&0m00XVmnwit=);cDarU=OVj8nfpnYM)|~j8XK|_v3%u{6_^>-UwI-Q zPw7QHzqPbf>FChvW)OXHGc4B;>}L<@)u?We@l4qy$7L? z5C2HW7VLk#`}7~bwElMyP1!H~BcdgqhQm%aXmTMh4zMgqb;x0m#PaOB$_Sw%<<7i} z#Ouk11+$nl!+{`@hCR?Xs$qQ2&{FLLlBwSKOqba$(%AoOUM2bqGhv7x*K4bly36#C zfkS?aRhiW(pSUi_QN@<^&tC%;_b;-0(tQ;k1(Vf71EMXzgZuKbC4}qSFsE{N?AD8D zARJMM;`DAzINL8K42Q*gsc~RJ at juj-xZ!$Xop~JazC>Zm#PKQ(Wg$m2iEy(9c(Ciy zZ)PM`?+YLYE!Z$TKIR&?XG0YyOWDJKa>qlZ5O%v!xl>(y|}{;UP^m~@B`sMT73FqYu;iqZk4wW8~?m2Q?L z>wjTZe)$e9V$!5H$QZ(lTjQovdAKUnv!_rSWj2)!Nd_wRP%kA-i9uR# zgRF#jHk8b52?#ODWmH3%j8wM7*ZeK=0kr!F*dl^=9-E;KfHt&~L}D^F-|t!7G$$bY zQQh*=`t$a9Y6zq^W at -Io!W=9>=hQqM-vx7{F9brH^PN$w9w!5{!ZL0oJ>U&Nlg1LF zzi&kvDsLdTKTRX43*(Nqg&E;XoDbugPH-OYHuI;ZvbEtyN at I&V at Tpa~#dXz%Y`|TE zI at z;2JFky+iQ#-DX7ntk->Sld&_;c;HcO at WZoaiS%Ai8J#!S=IB~f&A4mWKd16^=yA$G2 zdedLrs2*!N@`chQzDxiPc~{F%BMt!2+~~`PVzrGiGyA at lv+m^eAXRS+U6W+*WQm5oRd(();HLWzRFltU=C4)zly1 at nJJpm=b zAkNd3skANr`4$M>am3m9_5jpz?E+_aB)bFr9m&buv6z=9oDprAR}glTys$I2JuXEH z%WtB_%_fv4au|N%7jF@=@$sz!-)?N6fy+@%CNC9v*91o;yvdQx$(;{GlTs=%CA^fc z6jfDD?t5`I)W_~|9kb0{OBEQne*nb5K3xB+g7#>v6uti$fIxuuI}v~ zZLfk3OV=hQ*)z0P5YG71|N2cUUW23>6Xc&kf&a%Q_1}{6zf4ML^Pfo}@n&)`O6X)1 z6(8$Dg`9vmM7Rr(Rwx6sDQFGW$(K;QkER9Is)$V}AdG3I{Pz_f|gdwf9aBDZmw+LFc4TOW^-mv3WYI=ODn*9^u&Vz}8d;Y?Q%L{}J~LUQWH z at W6XaoHl={ve&h*D%eKe*{r$^@`hwfCIngL3SNTQfe&h~J`Y!#vmiB$LgE7?8S7?? zD^C*hO28Pa_ at 0G5{vg4O4+=10LiW%bj~*V@=N*SaM`Svo7I{1M?3|A`og{);U+)-H zuG(F*qHD0~bs at SaV=>($52_Y#@SfbZp#|5NbstgmCLyu89U*w*izYf^QTw8bETGS7)8CxmBEu(}?}0c% zJg76u4}yZG+G~gf=6me8GO9x>p2!t6brIm9558l07U-7s4EG>({0y@%zyoIE1zDWQ z<3^YK!2T)gdD_I!OraDXMb!TM52|otjx#zOmwJ94wg4i(OkjtALSWaa_&j9Q(nW5c zfo*HdU}@8$OY at rW?MXWQ#R?M$MF~hlrrfTN8?) zEl at YgXj0ca7*J0nrgaglR|c$4CpAV{(v}{zCus}jqGL2lRVTG3NU9Y}RTe*@TF at S6 z$>qXQeh7Kc#l&9diR8K{+cSE1C27mmvqdy-%7ym)L+!?gnF8J%PXT2!Y3zNa-aZv=`A!=($S7O2jHXggc+tJ&}6n6i|DkdZxkP zs}zw$I8TAAiL1z-a|BbIJ+gTB90W`jo1vZ;5%XRKY*YHbdd!eLOXQ&K~LJe`p=Pc>(X)un1DON(Z2T_iottry&B=^H at 3#>h4-`Uq=Z7N#Bz8w at 9h? z$|rW}?@nUxqku%kWa6(}*qp+<+=wT7z`^N+Vd)bD$R7-D7!tgbG`16U7|{y1VOC})>3g8OFIkbrKy>@M|q zldAE|QOga?B9eUd5WLaGF`S#IV~#pW9j#1yT)x)T)k`JgVE;%Z3=4`t9!3^f?_j$? z`XksTBC8~HJ+W4LKS~AmNY#%|yzF0ko>HW!(p8mXbP&Q(*!}SFLl4eMZ2qFX~IOwDGv>}CUu+m^l8FqCIC~YU{8z<;k0%V zM)y=!W~h?6Em6ax1JjdrynH?^-ea+^=(yGO5cMEA0-)^N#n9W0&XXYAeh-(WJ_EeL~!O2xoi}_^Otg zVuSsKkdqbkAobp=_U4-Uc9ZRjj*?{fOI4Pp8gpy&cn1lA{H2rHz6O`-$bY at xnky{1 z4X1>zyf{<}5Dh!?Xjf-||)32N&@lconrA>G at guY7i%gXnr% z^f3W~HcDD`oed368Jsv4ZP7$cHZ~774=(#vwof)TZB47a#pUP;8974Dn%RGK zbdTN|o>N~ph`AzUSneINOGqNp_LPfQxD at c9P3;5fUo5tFXgl5uhiF9?8`6qwk zAxXaBzu9cZ+RKZMNyyuHU^}&v(#*&zxmM6Xp>f)v+sXf|kfpmPdTr4hR2p7ZC|_o{ zABVkevMGuUCWgz>)cUEYK{}t at K2+ZZzn^t_Is^zY z_nE^Jn3Ez0QY35RH6&g(BcJR3#ULjsVVc14a(lX+8ly{Avz-Z{QsBG at O%=+*G2T?wSl4E(R7{(xnjMLIP==Yd4#B^~WY+skIFNTDqIBUEQ04|t#zt29!QxT{pECvVzK7QH{6z8LO2NLxCA?U`c4c8@ zdI3EXhmi&`x|W?h)Rf2j!H`*IE&r1E<*-cHxQ>{apQGV7mtM_AK>kY|VLDNQg5^2! zc7!NQ at T9qnJ3P~2Us&EX2YNUZ2MPJ-P@&+enySe4qUxKOsH45y2P`_9?}4mtv*Qpv^T z<4RY1W*h0v4AUl}T4SftuOh&KFAF2XW{tRLhv zy>7X_;4(ApDQ$H4?DS0#M+Ou~QYOB4f(B0DgGCMIj$!o)-^Acsj$470R7d>tHeCPC zQ3c`NT#HVh!$5FFRlgY)5yX(&TcmQEuX2r8?zcA3fUBalHxp{Dv>9;PuD#8rsw+!h z*Ns(ZsST#E>BS-qTW)w{?K1}3&LJH%ASDy2g at xs0`>(s`=s-NJo1T3R#DQ%s3|)rW zCr58 at cmJwrUfN8w@5AV}FFGHV(OIL6E|vY@;@4^B==gHpo%mb2zf%(gDw6$;1PjxA ze1KU`*wY~)lvy=Gwo%N*^@!Cz!b z**tu-FFrRb!e zWz9DtCRy}T8KSE;B#s8e=!Nk6-6Z$owd!T5fv;TdQXAQX>j|_iG7dS~P@&+PZ&6kG zK$F`PW!4M at oav|=XbWzUr8Pn0pi at xA?gUFTp~~P2d^P>mo7rfga{yh*>EMT$upyYbMAZppq3@ zcog}>Oi0!_D|jLd3n|$&@e3Oa;4Y(!*PtSj8*a<3S#Sy`4v(0UqfLq{v}HX^lGt+$ zk5Mc0*4!gx;%HRZ;#H^~L{xG}{U13wSI)uq4ZvELZU81rPOtyz`9qR4^gp6f}sf6-Mx6La?cs;FPICdUKsO#`EbswFmL}3}}W%nK-R! zTQbU-JeunxHU?662I!PeJTL7>Uy-Zi(6duMfFxh*e<-_RZPqmSHpo)?ed_52+ zZ_}_>TuEI`j*Tx(Q^@vqsVAq_)lJ}=A(lC!$R>6r at l9Xxspy6ftVrSgSN6K%1L)>Y z&@xS^y(tQR6jdhTn9w+jCJZsG-L?y<3;zT>bmvteJF9e~Y={HZE_ z#u5jkwFtn8nH)Sf7=}_n5qi*g!W;tIH;y0F3Fr(=fX~-=3r~|!`Nnmytap}0b@>b^ zoM2DDPa%uT=aq(*ZT^NK^*@k#fH&tn%0zoZSLsQ%exP`;q2>;T at dxP^OU_cvAl|K+ zaEm+k0PIZWT|{+rs(g1TmrZ=k*@|O5_^43FtuCI*syvLj&7az;V24=JpylZ{yjA)4 zx1s)-*Ly<#d!w)})I!;;`W~o%MBJDqR6=p`=A9i_u at m$$7h? z*h!rhEi4n>?m=qkR#U>cFZ-BYL-zQXG0>v at oj`tDQr6TYlr7#~CvN^Tnwv2l>wC%{ zW at odWY0knoEL!j$mE^&1FI|q=Ftm$RWQqy#i9p1P#_}ag)Euwz6GOyGp5b#EH*rKB zp-3${_KC^aoXqy}hxZ(0j0RiQ7Tfor^Ixt((@OtQ76J%|DV*HyjJ&Snza^p+qm$t at XLxy*)2h zNjJrmBbdVsb+gv!gP0vp?oq9Wsb}g_S8FgI(Z>F<&O@<(@AXEA`8#K}lxbL7)`++4 zUc$`CNyquT at ukQ2*|3&LijDDQ z8NG|ol5q zPy8BY*kc$hqi4H2WrBQ?Q4>Sw5V!;U6q)8grvXGu4k2D_tjxS?!8#0t2tJ-@?z|_I z&xY;2m4J7%vg&HJxh*Lflb-C5N`df`aWDDMG8!}HQYyL4c9Ofk$xL|nJ7L-j+m{;B z%#D8MtKd+WzwkBmTj%_%^+PZX&YK+!^S~3RApM`q=g)x&)s8gPKb4sYqEdrq`=0hP znzD#rpw~Y4ngYiZQe)aoWFxg;DG^$(e?DpPK at 4w*eZY5}MJ3I+tQvcAu}$X{x2g^y z2tJ%3y)vJT92;!C7Wr9jE{JR5eCXNkD!|uo+1V2ASE)-dpw>a16wsti}H%X>30gXCy?#(?^!+^MyaMq z5ym$c4`KD6BNqHS7;FVpugrweNlq05YB%KK`i`Z9L>8&iv^j3I!$-cjr3b?k%-aF){ysta<@iqQr zKs*UiiK&eS2|G6+Ri4>0lv7QxVw~5~zS_;6=>&g22)x2-)FWsX$WfweXyq{LF~YQj5j1GGqr1ya4>Gg!eE9#avpS!#j>`02ZO*(%l7+G*Y8do`VJk*_sk66qsJ32=!W^z8;SwQpF1mpJz+wl;=qdtlOp9O~K#x~PKIa10-L0XV zx>_(CMSidFOV6%Xky0P`A_I}x?QZo9_A%hP2!z6%1Hweu-K%o|S5k(_8J}2mW+#05qJz3?^9y_yt5StCf z>g?Ha{Wl!mnk^f_Auii$oR|71rS- z&=Fal0K`d`t}9qk!-G#;qm5Yq4kUskrT1PDLp7o{YRO-JNdr*=W5u#(|IC3ZzOfR9 zQbb3psmnkw7})o`I3YO#I4T-Xm=N5Md_>_51xhZc8Wj1i6DYXLzURD at IC_yWdflfej7!-tsXXhmABy7uHoA1_Upgh{+#Bg_xV2 zwS`{o8>W>lr|XP^4nSJ>mf(L_-Ey{f+9NA&+Hsn)*;33}ZOU5+c%CiOJ4t6(b|6tE z8DIx1n4+Eri}=#Cv&?QQT#q;(uCj+A`|20_t(PTp5<-`jdB8VmAmzR^ZcX9iXBuxW zTs=xT0iO#NbnTkcN{pOu>7Wdpa@)zb8;t}D57~4CwZR%D9+EwaJUc#V3k^ypkaFIS zgwhF>*&ed7LlEr at E&{L=E$)xd-;jWm!@pQ%L$`Jc%R7O;-3fT^fTR5Q`#4 at n zl>0*&K)>N!?l8=QdI#F?*wsM^{4u_PH}{R&5cvGL_ffs#fq7;~IcAJsAsYK>$`or0 zC3}XM_Vmh{O64uG%gQu<<1EvsW)D8Bb0|+qlqD&x%d=&pw09}vIYMd2HIBV_vlV(%x=gZ%lGR;FN|>I#iJHox1*qL z3f7H>MwL6*BP+cksdQH$WV>Nc&U4$aL$U7*lubnkH6ji+g(k at 7*cM#j3#{A7zhEV$ z8bK$=OUmrVX6zy|zmVnYS{3AQ`~9gA^bRBwepr0jN({Q&Ld9AzklDHFsMZo$Q``@s zru7KA*4m0c?Fm^^ok=A6X5Fxfbtk5sd|Ge?k?__=O4Y4y&*4Ejri;z4zrPWz9EbZr zk4YG})8sJEXt(z$k!;i$Vn2dFxxcdsxiL+%eA!gM{)9E9(n(sH at -W@$4$T~mVBP&p ztHCK-g at Wo5;`1>8?Tg{(-d&WYLy&s$5|An!r88V};(YFr4@(hkxLTLJwxWLG{^cV2 zrBm?DYR$f~knTX+i69Jbv`Qju3)MJVH%mM;Yhcu at 1M2SFw#=4r)xd)T89j$VUcg6?6=5q|at05-gzwrZaBaX&_(O)@ z8OTi}J9hADL;i^m%HOhzC6dWnp8P)+gRH>#}5m-7$c6g$$Aw%@VuFX=c%sX$`UtQPS zzRk$$GMyN{-o_xh=Rrl3A?b<&YmqRWvche0(PPXz$Du1~h3td8hqvFSn0by*>8SEI zVw8|;ph8PR0WNJi2kKBzH(?oib!-Kawa{Yu{)KaK4MH!39YdzL!4NS69Jq)MoCVt@ zbbS9JRse5hJXiBnLH3CJr}S1#ZUqfF8Foe`2WEHXZ_p^Zr72Qo4KA?xdklsbC{JbQ z75^!c1vQcRL`Wcq-%8oqvn$nmqj4rMJ86?HN}k99_MTEPNQzHsa} zRP1QJ#5;>Ci7Q<9C{-5Ii>wJ(9FzK)+=GYQnDa6`0E at RdiE;hJrMY9wfQJmoFK~x2 zXJ%J8>j?)`KNNF{9Jc%kgD>1D`)&_ys<)zI5B$S*dBkL_mkdSvA&o_6vJmvFq}AR)dFcmeu&e>{V{N> z3|&8Du5clD3`zUDC2lFi!Hz+DhZcbP{}$0 z78NE0?`Y~N=0LuNhUwdLoZOy#{RORb#hgLF`N#dx#KC)B1wyc9(E zRg at l`opx>;sE_M?3(uE%iS at i>?~@62{Yb1%kG+xp8E}b8P(UW6h9)oE@`-SL3y>ru zub@>B)rMhOHLX8D6Xo|xh5=d0>}pD&8aKv9lWHI*9p*4%ku}3~*uLM;ki^_bPb7K5 zXGr90c(Zi^a;|>3uIdnCuCC!ON}_wJ{tP8wxP^;X*D=S=R)V8hhpcPdY<+ffk=D|viLQFHot-x%P?-^dQ~j4__JnHyy4Zy zm5IM|&l>td{!K{XT>Rd+`K1gu-l^Yp-XcjalOe69p zuNTFJTB(srfSw?YvI;Qn=Z5YP)0<{6!~?XK5X_0 at fxxjy1c3EM#JsjE#g%W7i=ssZVo>-EckN;sFgK)i*v!! z`I~xzKq;)NKGUYY9L>^QJk34lo z43yYw%BPVKWtmjA4LTOZPKAzI;TAo_!X_O3t{1Gb1wPotCY*fTPH1%VR)IoSnkMts z{@@M#nE*5>H=Yg41bA at Ke(@O)NV-3Z^Qu2VnaON{f;LyBS2jJQ9_zDh+UxpwADpe{ z7Ii6K0bh#lmBx3 at 9iH$Vo#GLk%`OnldJa^@DYuyTSGDo+y at DwZ<4Lka#m-aZ?CO6| z*_PM9_3-dR_b!DZe(5DM#R_ at 35HrUoXOd|jjVNv%E at 53d^gwZr*~Mm0w2Ifg6LN60 zewf>~Fj?FCrjOQ4&ahp9I?s7Vt-0Zho1sA_xk6Fj+6+2XZ%!?)zLryQ_1<=`H63q&D%n zYj|SoF23)>UsHOO;RW_uj;2 at e4mviOY1F^q(hSyN3nPz%wwuofu$+tg)rM+ThvAqF$L4Q#Fn(R+hd%+q_uio`GDtO`9V z^qac;+fD at m)0WQtA<}HgUootET*AaXz}HzZPPP6{7%zE+n^t+7!Npu9ZgA3_ug%Kc z4%UhUD&RY-+ at gB0b+saq!WZ{^9|C$mMu#(F?q1j_^g{8u`(YTP_+Gu}C_%l8lbQe!`jb%@Kb$yWR% z#{*;8m<}Ebx zwue^pG(GW5&FuuLU&uS6?D8jHL7lODp{h4x^^;$W+AuF&^|x&{==UYB)$9{r5O^xO zVPh?B`wgz$%J^;vH#Z>fYF<2*3;74cHbSE;d=1#H?S9LAa6g(8)KhKru6bP>2`4|y z(Y*1hg<9G}&F4l>t}k98Vroqp`3|j7K9z$1p;wk!c1yXWe3c z-7>xJT0Q;zQp*eu*^saOVfX_W6?g(zNfc~+>IJAh%DvF<)4|;c?PTr=b>Qhc(d^k5 z&K|gWOJY16y0`vXqkyQe86zX+o&rIexE}Lqt0lOR0}Iu2LkO4 at wtpkHAB6j_wGP?` zkAu5K1wGXB#8jXCLi*nHF62UZKeogRwy-6fKc{0nV9bXU`(AkiELL(dXtxc1ct#oo z;2*;9J2;W&OJWE`#Ff-vgfd_D3nvfvzfKD z{+BQ_bV^2vV?gZ*ZLr^|%$K!il}jHnh&;|A^&3Z%OJys@?~M0$s<{#aAgx&1H?mJ( z_Nd?IfYWa0AGW^k?i%gu$R`t at L6qH@cr={FwG*$$eSjP4Yo{FLT=~5W2=Mki8e;lM z%=sD-a{kzq;^<@-zR40tY8_k1eit2ec$xKh&-w^tX2joSneLYBp8!e%d!OaQvS`F+ zqQz!p{H6aYkGZG?j`G5bc9ag9|Ak9CtO*9cS+85-gnxr+h&=AkydMH? zUtgsE8zp4``+c3uoB@*SbzT^vW at z=U5E4V$kLKTrt7b9vz7P^kbP&&L_Ckc at 8)g#UwFg&0Fw;^|L{Wx$9+#>JlNy?ogXJU{J(X9{a}f)Sd3AEy8W~Z(!22) za~ES1xtKzD0=1zFgEf~;dbmida&$3tvaxiTiJTJ zG-;Fvu_NukXEf|yp|!BRD!>yDZR>c>JCcAxvxyD!#x`{P1|H&jKQ5T~jwq#qA*D8c z-pSSho9=jzdJOKft0&1SE4?;yCE)>%CN=gIHY)mhk7gMIW!($<;zD$3*|y2iU(S0i zp0E~NF at Ns@!GT&{`5T1t(CB5=nZurP9w at Z`JSGp!S_pd0I>C<^R5P9k7!U%Mh6t^! zfX+OOmEiDRAp9gQ40f1OOSCYBS2yymbYeC+jkz16yAP|ERXxh24645P+@!ALuxFp3hI%T9jN*T9P z76X=vz)<kx;aK8cok$hFKJG;xOsrs; zz``LFGPcNL8v!3sF^BPi%*PVuNP^u%1-P?7ht+>hH?W4)SIq+n*4ANYIUa;z4Jm*) zzzO0?fH`0a@}z?ewFz=C#;{@$PV`YF<0Nzkt%74_f{uRd4=K36OQ^e{_B at dCIDyC> z;6JTX7~DX+BN*vwZW%R-tRAcZ$8(d}Z!W(2~@Io1E zW%vXR;TIv~AGjM8zoo$ZMjdQr{KQ(&3E7`z`~(l_9s1NWctr^59l2x2?1|jBtN-MM z^9|kq!1VFkzh(RcP5JpX$ZzmU6yiH_N00f9Hu)2>zsvabE99r|?uX%%BIIY_&gl0K z*q{;{#YXaB)HEIlBx4e;EV+^S;9N|;QBNWjCf6yqK~__Uj9XDZ-+81pbVz5B&x=-( zTl*3{9)SObG?$cur!;iIuw1bwLyPi_A&a^7|MN=hr(tzU9taQ+HUtn5{eL_jrexy$ z|J-PePLi@)6hIpN(JFO0z{bYV#HX!IXz>u(Qrs!0&KFuP`^DQt9gu0HT23=slOjh7TD-fUx5>5iihib^?vfV{mHP+eK*x37X6_w5J>-z~(7p4e<4TCM}AO%ne z3;>63t)~p-c2rLo)ZyGxa?l$F4f$1n$-)E+mmYDwI-PO5s%@K~@t1e8hDmW2nicb)>-6fKjjh#2#FgQ06F#y4vb<$J5%5VOV09NKxMZNK(XZ( zdh-5k0%hGO%*un+sj*|!Mj?S{DwXVNvtR?f>xKa7&zfsHT2uT|=y{BGjxr8$oweX! zE(x*ChfM$JRovF?sxml$hh%6BGuMov?yzu(VHbH)p<}db6{)H8D4O=N1N^EB&p=d+ z2G0s(s7HwQ6 at rotgl@RO$q$_5MbU_eQ5uf&i4O)kVK0MU at nQp|arx6+a$g*|6}<2h zXp`4IxB54fu%1P6U!Fsdq5hRombK2t5Lc)~2EDTfog^RKK2toYQ})ax?-xZ<>YJUu zn7G$@egs0rj at YvB1uCy_8acr-|I{nhG!r at 1cqr!gmawf$T%z}paS}bN6N5uh>MI-h zJ%p*yfvNg(5-B=D{tNMLb9~~cAd#Xbdwl+vk~?+4tmqvE(H7MH_^v!kZk+rdz>ZrO zW_;K at g`o)XlV~XMs at lgB4Q%=Q_DgFcc zKVkn`v4?Q|2YWR5e+>J753)J^FW57STnx3vVc=s^#5R*ofE^?~aFJDn{40L_qdfww zHM)MG8n at FCx9EYE!+!rC at L{0hbCQJjz_0RQ8lw`AWo2j{Zl*82z3JJ_kEge at yFe>< zl>T6j)XGO_TMEAb3IN~^TuDdu#6e#0OPCvGX;06BL at Gw(i;%??t(e6I>FlW%qe}?( z7wPUB%&iK^M(Ov6y5QFSx(xV6qE-Dcm25Tg!QhU%>CdX-H4X?yp%*#>+NrFC!B9h)Tf2vBWp_mWB8 zQL=xa at 1EAS?>q+;uLf{fAafU(IMrS%ro1Tu(4fgosz`R?C^M#)F;V9|Hu&xkyno1w znQ%7`2TDk0O+1kzH)*{)+wHJ*H6+tWv^eUA7);d3-Mo>TeLc#8MyF#=9S1A9QUIF! zYhQ*-c%_%vCna^CmDnu#lEr8+kg+Bt0V8t95>t*tUBmA))F^ zas4pDbWhJrzdvvF;iSw8%j$e`y(uN1?#rI=>Wvk1(yJ`~lxfPVjcteo`S at kfe*#Ss zkUT_pQ6}^x0GGFl$5%^aiZ`Yea`Ga#|9)!=s1!+`}6R9<@ zhMctC9?S&yZCflnw<1#Q6VX%;o=8>||9PI~)KiZ=#Nw zja#PsCOM0YpZ>xMfy_#=UK4_U0 at u)xgcfqto=tbu7VV3zdM!z?FUYKT7izd9nSz#b zG9<`TaB5EzKZJvs+x5o1Bx?hY)9FmM(`>pY??a<60WYvUz8)z<42?w5T~C0Ogt)qL zoiiAtSK5$@S5n at 7hq_PJ5R)yGo&+3?;j0K-CCmg2p9$vkje2!E$e{MHbH<--hYR?c z#C2!uZI&r+?OKkKd3AKt_yY{u&4(1s8PgEXxN4 at c$(hwGgD%5$ufpvr2e-*G)-k6k z#479>vXy)#^dQUwvP~y9_V&@d6r0S>N%+F$gC=Hvk)8G#3qzjuTobp>#PbCtfk-W@ z;c808(Z=@!S;HO8kFGu9`^v(mJo5|vi?+H1v}G~bj500jNZ>q_*s zp9cl4H)ZbmT8_bbkvB1l2s>P7&2H89af#ZL&u|~ELnf$Jli(Xg0n=R06Fh~gb*KS# zf-oILgVa#q#LYuVBgw>KLre1!FdVf9yxRI>Ke0DO8zQ>Dgx{YjNsD3`(8_1J zSrryhvSlyrAj;|TW<{RmmEA2z&6_;VH(LM at tupvu;!9EJtDXfSqlyI;9Jo|Rcfiyf zw^ckp23UkB%g at fIhfg3Nzmt)91yh9dD#*`t$2I$*y#0*nerVKf2}u50kQpS5C`9S$UFg`;QBzr at es8%lcyL0>bLH0?4}^Y&X at m&?5w#_<&Wu3F>} zUK+6nH;cco&GY;HM!Jy>i21#q$|jYwR}_anbV|h+#wDikWb0<~Ek4gQ9c-Qs$#EVD z$8xsr1aV-nOVLX at q5OunAj9=ClujEV&V-V8aj72b~l9KqD;D4%wEygyX>pz9C#{dEn z{LfTE#=zFaz*@<~(Zaym;*Wu|g`KUuqn-Qz9l0G=5BEe_{q<8#ukmtl_||to?yo<| z79k7=i~~txO{_IG^e|5j?@UYo63}F&N>gXC7!*VrSH#Y{z-F-#GDky}FFw~K^QXk( zPwtPCTj=&#j(a4|pD^@81JPo||C}p8h=v zh*M0S;XMn8Sq6^TJ&-^%ES}Ll4+w%<0SZ0^|LoVIR8ctw_k?~<2suXgjDBXg8RoXW zJq?Iil|7|b7OOj~9KPATMl_c0u{|faeG0AeMPuKDpb3-3wV4rS&ASIfLs_j8C*3ZRW-!=^7>_sB7s0I?!t7- zTSh6?QJHB)k_g*5S)9ka?)tP0X)b~;XcJfM<&qLw=$u6!c^T+TSZq at sDWL@|)q-<; ztSfA+NlR?zC-n)^&f$}R3o2GwJ~)Xow&ftfj?m_!;)~yH42%22MMKV^S{pa63q{)s z#ZwE06zWSOLLmh8&}l5Tl!?+E&3UBUA_Ht#v}-pZGbfrl}ZuCbhWZOn#4P< zRuMc-sV-I>rq6Q;rWn6=mYK-&NzJ7b(3cHl)JV#Qf-GYwQ5*)KGVP`FnZ=zTH4J5} zP5b`Sv0uornpPzBTSt6R(b}3#otzA$^W-MPM3@=+%5wGuk`8G#@H%sKHW=1CTd5LE~gJie&7^1wExF4gV at 3wMId==m=_VB_s~Fw+)OE0UPHBI}BHqd{$EjioIonDZ6l zp~*TSvRHw)O&BMq73me;aqDs7{7`1(DGyJ$0gC$N&KCzc4YW_&GD7wZEH%t2s8 z5CT!ZH3}&Z7$OjAGE855#DIsAB;psAMbx-ECU#&HTQnLiT5rO7OeX;Z`|%HICED98Q&aV-5}k{#wxX|=PcyR^g4w| z2QSw*N##gxLOA|R+>UgOB7ZO$+oMXnP~ISS3Z?xoCofU62sPtRl(hxEeRs=(2F~(K z+&CgSoc8Hh`^hDZy39C^>>tb-nuX#QGO*0K at a(ucSQYiakGjkePaxEMSXOO4bL~O0 zk(=^~xxaiLp8V5 at J1nIeMvK8&K7HrqP{(Ho^H~@1(WMDVgNTb+6^YTM#7Tp(hYmF; z?Qg<&@;?lGB8Ot;&i-eSWw%eQy28Jj4K2x*B+HW(9_49DPl{Cqs}nM$ZI)e>y9Hq* z9fI`1najT at ZqSZ7Bp*k9D|um}y!>cz{Td{t%BOpG{r%U5x^$0)mAXdbxk%$cPxzJO z`?Bn%wM602PO5NaHz(xoLvo?)kv*kE;nwb{XnxP`sbv1_uS!Y%#x7y${L$ZP$-&dV zD%*V-Qe{snI>Q at k`|)&zOKQm at T)nki(a*3SYr-)>WrE>l!D>*-;ap4Me_lmE*&;-( z(JJSuGvhWX4;9q)X4bZGIH~;?Ph9dPGGLScpJ5M9=MhmCB573SL6yTC0{f*le*}5cuwQMXlv7>i%RqMAa1NqE>QkL?92H-_rbqw z7z1DKCy$PCHC^X6)19}u*WWteKn|;GPq#XA10}3S*y`bJ3b3*ZzqHKHYdk;H2vSo>ZycgW{9ANT&OpgWsg=8(XSKnhrkODTB^q(ZMtQyIhA)(&6GG*<;v0q;J5f>X-!21OLEW)1K*`W=v zrjMLH=AGp^^FH%_*&h0STf6lGXpad(26NyGQAt*kZ(!vg@`S{4$5+EEyT at idsV51u z;kX(vDBM>9&7*KH-$xiaNv(IWRSw=+q;V>19`3(kf<~ojIupdH!c=d}GIH@(F zfe>2mAVMdd%3K*=p{cSB$ELwb%~)!0rE at fiT61pFP0r#T>QB{W>p0ppX5LFuFz{mO z)0v=)cWBJd>TK$#PvIF;J_?Ov)iDT1tHBh|p}Z_rcf(RKuzRc&NQ^F1KS*Y|1~%B< zSkrf$aOktVIQE)vwH8K{ir32xk7#WhKBV8Imql87)geo-Hn zIVY&sA&+lEJojh6T!v?DN+tOHK~k}Gza{2(z&v&+*2V*%-=tG#%A*KL(*>s%>;*IT zb-FF1HlJ98Kt*S#0 at AaG$$5yw+!|4mqg*5?-s-+755TOOBr!zAiI5C4Nfr%g9 at T4L zK^-l5&xCc^fOA>+a$Y!*MzVsKaBkoj^p}RF3{sqO$g$5 at v3Ltvp(tEXYgDMf$$G4s zV=zrr5Ij+13v|%unPg1prFad?F7cQ{WYDB1`6SGcdT=|vl!64}q{8}uMIAyjifSNR z7MMffy5SsZjZf$SIb(%zA}(FC_|)VkGR>5`B%L8S*2Gf_i*4t2xaSrhit4R%rZS;1 z56_1!zd_AQ&RFwXR_G1uW3C8GeTg9Ocvhq{tz at 2-PY&r^Sb~E;ilHqxHa$CbFYa at ndwqZA zO#Ii*y-eU4-q|~ZkI-q4Aj`=Xe~Ce>-RDrNZ1UY+*A?WMR@!Llm8}S68ZncZnfif# zB&hnh2aF~so8l5BY>Y%TJi0*ApZ%@yK;}P9MC6c{j3|o{F<}T33R~WDpb+g;PuNq(zr4LXWz`z4Lxu?j> z5 at JFSKFpm;q&^l#AsDqygzD0HBq{Jfs*5X;Pi*Yv58nx)OC~BOENq#Jhuv9pN3_W< z#KT&|o7pX8fW$0)%JPqQHJ9chz&oOL_91P4&drngFXwe0bIwDo{{~X;|Ih)1QV$>h z157#6rQ;;yB8c}5*P-|e7Qk%|pwx(6>u?W0?3JpGgfY+SOYG=&wu-6aawh z-zBxbw*Q%~{pW-K(rVNBn}`CBkkndg%4*>V9Y}$pR=t$SQ$T21Dd}h-Y5Y6)j%;hx zl13w*@OM;%p8!(C!Y at C6zDaj8Edu_QQn)6kv)OE?+YB$W{}{5x4M_uOKTgjX*-CL8a?C_+Z^_k>Zg zif$=bH}u^!GQ;$uq8&5w*6uoz>|2g0?kIn_2KUyypx at GKW_;A@!e)z8X8=OYl8BY7 z6UqlY4v&WTj*%2pSxgia571SmfCmz(#yod8;9c8wdan${yOG8;55jAtAA4wEh1Qe; z0w{$%=UkBCi1HA#@kaXgNR_|pD#j#W-z$AFWcG1zoadsvwYc3(v?G;TRABJslr|Qj zv`?-g>(5+d)Ys_~Mpcl&YSYt2X8MhgvfKq{SQQM=RlkJ-1872LAb{wnb0YY93 at d|) z1Vc~5qj1)`h%Pl3X?pJDh+UvcNHJ>DL>;N))WS&K6N=Br7*nP$fB=}4SenB|sT-g8 z9gTa6T>?+7O|C(z8+`*SCe?^}ll}@!pJWyUj`{HAS}SYq z_U0wSCY5{je`6&==h52xMsq*~DGABi?2O`U@)^xRZ`>}5Cz=7i7-B>w#US7eJ-QZro%2Gdi6LAp$MI0RSG+0021t-_ZGYY^rT}ZL1>uQ0(el z*QT)Rk~thQ+aP9->TYe2+AQjKfsIL2TuKREt+NpLcdM>RHZKxdAaU_S*>oVAPqk=k z+Jb84(-4!iNa-vNzT7LGk3n%i0CD#d{Q%GtRYaZ*$#G^fnVqurWiXvxZTQ-i$7 at K`q0MA9YGP|$`M7-H5^ZUx(DLPJseT^dWYcY zos6vsdlSW&a%UFC**%51`KS)R2z&Fz78xweJ9*?z#=L9#04X9_ z3Zz{(N=S7QQD5X?Uu0$f#>y|rq8U*(v5{n;S(%@M#zVv3rqe%)FVJeO-co8*RXw!- z0RfEgRZ+VJ1kAy4!QtSIO;NFtW%%GM0~rpD<_KJ6uKYde-oaj#p7c;Hniw5qAxR4U zbPZwj+--@#Xl5(DI>n2#SYJzZ8c(W~Du@|I6ugPsD##GkM9T`;CKe^o-zu3ORpK_V z+k^`Z_9>sZ1@>R)NncIyZ%Ol1+LUvOTf!D7kxcS&a%|-kwkG__dlz_yLrN z^YojT56Cr}_Oew|xl~!Iq!44-Whm8V(^h$i3kM2{V*~AUbSiUnWTX^4#~+D>zaz1+ z#uB+amoAI+pp3q!goS}k_jrc;cgb~YR{H*MZRNt=$q9vzAwgYox4$R*jX0E!BdcO~ zQ0A$bK0f+YeNDP9Hw&YcIVNZ-7A@)&t5wVd2_t&ZG<+;g%QU!o6#*$Xkt}{ui?>&k z0s_dht5AhB;B{SAPb6WHW;EB^0g$1gB2Fzyu0$2*OodaU%#xPX3OR*McY$y)qr at Syke!Gp?1VO;*~a6r40jp`h0C7V)W2ph^_u ztpZ%MOa-V?nNZH-`MLdD^=-950~%ATC*9X?<(g7AH=4km0A+@{O2%K(6E=Qk&Wn?J z@~7ZzB(1W(vee{njJFPcO-_!-iV{V< zQLiDvXaZ at aLznGf&3MQFt{;iP2;I~N%%sHJ{(6$HD6vwn zI4>gl^CWX}G+P`dm{7_ATbD8oQElgo&9R^JILz9iK&~~KVagvZkn;Sj at 1iAEek~8x z))X9^#1Y#ZD_oW&VcQNvr&vM$7w>B&D>p-IT at vzBcoid+q|znk z+Qghk+XLlZq%1;o((Jz$d&RwiI_(9ROe++Dx`c*r!)GRYwfkB^pEXUyY?c3T2M|NX zDX8q~@R3xh8%!qcQjA)(Qu>q7=+J6Bf~`nIcD_g?b&xW|gdI1Q+zsFn+d1ws(|YLG zdx_0JxVH02{$bAyTg65En%>t at Tx`8e;$z#<26p0}HXITyxiJTJVpJ?jedq?*9PZt`ACVtTA3otA+q=Fl{^ zURZ`icE!{*ajCaysl}83QRt3_aTXvO=S^oCzDyX^gGezG9Voi_Qx5ApH1nYlGbH2u zd6(T2hJHrtZ1UiBY4PCUEM!Co8BgR`1H at qGU*+d=M0*WgKP{UK0u_7q03y-Us z`1XKlf%|IQvKGLqEIrtiNi75#-ta)Nnfx%OS=6DFmoWbh_mqxyvsoCwTw}^vFaA9O ziNKkoiXYUa-4FbJ z3Z+|i{g+3oCCJ-iD at rFOUKU}z1{FfF6F(j2X_^)Qo}Ti8o|=g3z3$tV9jc?F9n=!}wK z1JLlcr&8MgZIyqt9VPP-SHeYu2zAy<5BK{OF8J2P at ZR+B0~0&<3Aer~=@?3OiP;tLWIMVfSMp4>|4ARf zTUujD?8_AY`j?skBjSy6I4}T!Da5}$bo4*Ae=i*TV+5nB<+P*<{|(EaN{vh_Ax=Oe z;jeuaEWABALrRklKpLB6p*VM305>*SK@?vSO-pje_loBnN&!7h&;6LBA9|5%q;^Ei z7`|?Fy>QdkwRf{Y^mdfib_=L2C^H7Ly=*TP7HbI0k?g!ZTG;(rc%X)Zd1Fa#)m~;0 zao~>coyFyH at T>LgTcKmDAD00-nTHL$18cPdDPqXn4_&C$xXZPDTz*Q8rp|@5VZw!Q11*Tj5$bUjxaRa zebGlO1ETH9{~)+=g1mK0837|Y@)EM|>JA?sq+>NH;6X(;>0=NXqgk{IB=o|$M9~df z1#U>WvJpenb?w>uQG6W&wr}>{14y=LVhD`}I^Z zt$+9sSb59JlbKO#J at p}`# zXt#M*@Tf%z_0k9%-Y0d@!f%n zf0Z8udeS;W{wsY>0097?{%`F2KMYyW#lqUy#PNUU%Q1>NR)5Qvm#mv4FtAbBYSVGxuMQ4k?{CyW`1l~}n<+!R022*CsQgMRpZ5WMexy%r63HA%&6W^zwo z^_bmoIK51N-9K)*0dTET_7D8wUbP<@kwI(Iu4XdEE9cJ$gU+zD$s4G+>@`-mtl;Ox ziSuNyYkE9J< zq89feW_0pmqQ22FCl6jSZ}1brIP6q8(;nqfFcx5-FQX_syG5x$OJX7Q=xatD98GOS zXL{ld)MY6g)4&s&vX>I0CWwn!0vtL5VuMYQ0MJ3cAGRRB{b>aJ(ExsV4 zc&+r_*&=~2`Gox8T*@fqZKh5?k0M=Y7j<~w3fY{F6jZ&R at DNaY&{4A2?DC%OK8B>0 zG>n2FR+4<{L$y?@JBQE#^^BC5kxZhSOT-Z6tY$dm0`ay?T$`KKaq5sv+&i5<0Vm5H zB2DSg^&MyyZQAEO>cb)MvUnT1cD=Hy-E at Ivb8emzDYfDH z0RaHIf&T~S`n%X(j-relvH-kKk6sg3tbqVL3JRZUle at k@5(F0Fwz*;BZv$wEvD}SW z>!jTq8M!#WiQpt%{D5J+{W!*DXzX#?QJApWT2G}qT{W4nH?ME3epXIiO!ddRX)#bM z-rw#w20KGgaC8`$JQXEdX63GIuo#v;Ovunsz!f8D-q=tdF=LVOB>@ucoX4uD_blp8 zL>UbJ1h2&{^*$p_((sEo#HQG#qs5ZJ$FVW6NV(C%>vUHi+LZ$^L7&2qnejUBVX;~LZV4reT^QRNC2{N^JVGnOyR4n$4Q4^;d~ zHF0&Bu69+p`U!FAyK`>a=$p&V2J64`2I!qnD`xLZYf0-xvNrQq9?YYvoXx?I-;P6^ zmsShDZ=kQxI8e5Uw#WzYz{kPVAllL$37b-b-~^BtW-f6q~TPr&#-M(*+A ze?LUOQdlk>Zw*_iQ#9ckwshkiI7ILgbn%--)N{&Ds at x?Xu9EyS1~$(YxpMwum~t=x z0JeV at 1F|mG*3uSE&L*}d|26&I=5JE(zBiiZs*&BC9*;0(*7(TBGS`Crpb!&`h+$IE zd6E=G#a1$FiLZR0IKBLYqD2Qye3S0BYSL)(Z7vfXJ!jb;*=HO(JbZpWUx506a!T+F zL`MXsB+%mWCgbU6rUVcorTav=4dezAgN#CsUCO&VfP}QG%FH8>6F at usTtdaF>Q!!F?-9YAj zs#Tx$i(zJ#Kl$|hA;7QXt4hzX{E zDb_p;R<#ue=<~j)cF4<)-&X at n&U;TdG5KoQ8Q_MjwE%|OG%mK-&@88}0Zxnx-JWBm zht_DlR?D?ZXaZ;kA6SVWLvefp-5RoG$jVQ+UZJWjevUj6HXEHguE25)c-!3FejS#a zx%US8`Y!xJuGUu>GztxAwV)C|iU at R&78Vu28)`XqrI&6Yk13d{*9kj^HFHW6VKCM- z7_Z0fLpmT{tnDnHVQ%^3foac(?isI+ccSS3&9F<78LuO50561$Q at TT3^O+#m&r9S0 zdq8xJUYm3cYjjJ&7lWnn&4^ggW(I!vgyx(hbo>iZ=9lO=Wejt)A$7Ep(gbW6k!C&~ zzRa9-cEQIIU#wL7M8}b8x>J_7n>}0L2Bgn$3NSc>e-b?Y4!9`5rw!uExaqgQ)0|Hu z%-t_>LrUs_0kw*NPmCY1`;~m+YyywS-5HDwIqGn=YX8!--{XdJ*O*-qY8oZF< z-W1^~n}yW);SyMi)|QLK6mTP$M at x;-*N3ib8k*651AB)-{2)OKcUN(YyBMsSkd*Z@ zH`B8{XWL9=Odnrk6Knuc?ubE=$+66*%)>0)%LPWdAWV=#WygW#>dW=T2M9vV>b2Ij zX^)^_K0`-z?MhXT{sZKmxNr}(EnQP?7^qUMd-PVldQKe at OQE+JttM+78EE$wQx0t& z at vk%S2J?t3e- zt-1;dUu;}J>sH2fH{x2R^#}|ko*5U{#Pf9TwE|}HI0on4y at os#?DYAw at 7n`Rs?FV} z^>r1h0}!e))BBClp`VzZTr~UX|K!0WB(+|85j(PHbdH}7n>aI6H~&;TJebgO7UVoI zc7S#+aH4zWACC^B`Uf~1!1y3`!Vlqxl5Gq at d0oJI!2C*c^b6~G-#djDtv+4 zhW??FKen8MUw$%k&JjcbC;_IITwtdfLLW8Boi1jl?vp at x2h{YmeL&y&`0=-DCuu%v ztRZ%0_P5<3SpTLoas~nxJ11#Kkl*&1o at 9vN)evAqg`3a9`hxgpAXnCz#8ds{ zzW)IJ58OA?--APW9x33z+_%?T`*HN>aNQ)WIPwHVYGjCj0EZ3q1)G;pqvu9QPxjB` zpkzJx`g_rE2b0J=Db%AY at 9s4B>E(wJ>^`y=pyc{P!?lrEzGp#9t`1~!XP8icOz at jNC=xzmR5faU4okDe_;=E z!0whHWB`Cl9smH!fAiA+^U7PaVDyn!T6oRa49Kzwh^734_0_+HfFKA8!NWsI`0 at GD ztr39!r*OMHZ}8XR$3LcgcmeHf6Ni2!wb!|ettClHrHO3dN+T6RQS~0 zuC(4>c(w4DnYy}~y0T`d>(al>_Bh>eoN at h4nXd;)@B1}^2|zx|u4^FZ at i89&&AuT% zN~FV2)vvuJJ&HtI*}fq;N|Ls+UHx?M#J17|bp>d(-97}%%7FyUg_b)_uhwx$l6x-Z z?8uU|i@%>`yGOO(#kL!Mjp}8{h_$1h z1Mb;K3fIBb#B}TJ0ugtWRKE*~tGy|StE>G{5wHt%n_yq|)II~t?cfCH2K7z}2rNB+ zEJT1!JGf^%zWvA}$YMzaF5^;ef?s#WUA2GC(FX@@jcMTwNV{Y9Jsq=5l3!LZjJA2;ogmYbi4X2QOm0$ENRfs}k> zy}qKiXriyHp=4oCeXn^-t*>Wy?fh1>Uo^O)*PJ*PTo^GYz+TZY(F%nyxpeeZQ_CC2 z#s-F__hv^1CI?1FI=;wg)BfUlwAItk$ZF~)^*wdf)fWz&N%3|IleLAV*-k;1&|Q-= zGt;&0BI0 zUVM}oZC4h33n at T&8%;(OG5UTng1x$`F&`W((5pD}J=dKO6`a(2TeJME%asRW*3NwQ z=2lf%R6RWGpJ=^gnWDGhhV~YCg~f_oVb{j7qC~#-UMJ6cZ4zo zDAE>i13N;Z+ckeWYGg2C0slH0Iy8t-ghBA2J~N{9sG%Y;`!?})(qQo(zrLS2KF2(6 zr(~glRz%7sk(US1086r?82ElNzS2Ts-er1P{32 zyMu=+tIPtvkm9EZ0hy at M%RQuITpqzS9`s1 at J8x!KtvWeD3kcx?`=GRrpAS9x$kA^o z2GTzx#jm(68vKzg+8NLYT8yd2*WM4)7v8v)9 zBgJVZ0&po#;husk#)#yU&G1nVTQ at V3){zJ=X>t8X?8HL{dl-W=L`jE&C`4CU*{g}P zDXHCrF%`WKC at CAa7K#O;WE7($T5?Z;GPmN9CFoXATuF)tm{r#AMYqr&NqUy98-}(Q z!^mQa%Jn3znP{3vQcvsEEv>8(Of{^RBpl5~J+(9!%(u*2TrFJOd5BvUu#+utSSTUi z7z-a4BWqewCL^W at x>s-Db99wLm(};oSzbor?X>X5{F!yJ*KB^ZV0&Ad$f&NX^tjqs zj`w%kv{->lk)?o`34(w{w92HUs);kLSZ@w}FUa8(zCM3v#w(w#oxZYTIqRE_-R^OglEMnf9>k+QdYqaI)UQ}zLs{yNOrVV~i(>iSi z)t4An(Izb;_JfpU11tUlEs{X*Wy46y2 at aG=6m{g~;7OB)0j! zf^F+N5?h^B?0P&NCoy1N%{I#vXfN?hVj|0M%_XZYrLQJKO0i-CEzzam%gvgHznNCq z(7Z&LNE^@N)ko{O`uZ#`02%458apnfwDYtz?cu$`?m*0x^s=!_I(_~}et1_tyUFY= zI+8x>$+AuQzUGDYv8F#ZqJsBrg0C&?45)zPLwJfPt1w{KfhPfid?qy_<;aDf7l^uX z#BDHGxIihJ+T={2t2Q$vh=)G3B8P1OBhZ|-{#rQWGb-q6jbn^K#;9X^qM$tW9Ow)v{QI2B5%e%k<;8&W0vT@ zgx!!AVQ%QT&O2L#+X1_XJMhbTVOc7&Rl(qw10GKF$~BGMd{5`bQrCkXLSL*~q;%0_{lx?L}iH|&&{7lqR=fDKNO>g?=B3SYKup&NaDY-r)`W5{g7_yJEr zgo-sTVXLt!-KGW?ykZm^bmsVIGQ}c7MLv&N-UvX%1E3_*)nd1Ln$#-7#>;#($&DS5 zFa!j=!7veTkQ<}}w7b~wvDXXT_PA&XjV88~GBc)AH*>sfVMdz4I*oBRjqxvPDON at e2Nckzmj=T2oxI>8G$>?M!>}Oq;J?uE)CH`EA zL_YMGu&0Lu_U%yn*>;PZaI$*_gkG?=2z%&WqB>wL4B)woaB#i+^1!77;=vA9Q*mEr zTNn`xALKQAWnnm`nx?5{4tR-59OUR}o#_W;8GBJwIoHy1L7!d!wQ{wN16MAYG9AaX zGSrCYNqWIx;5!$z*oaqlUV#gNaz4b9Yx0qPEWG5vg5LPf!orDQhi)jjs8?cMl0yt{ z&0(`UFKzF3TK}`_* z11iGa$T|&CyT at NBtoN6M-Way6RE8xwgPdsJ^22xx*=%<*o9{L;i++ApEi8gR60;$8 z1l8Hzijno3r}$BJ(obv}wkxABg1YmeIsRkwUqa9_|McntSD`bMv$6xfE9 at Y;)TKt8wCY2TPY?pemnPau(&>ufd?75s3K!(ZGQcs z=>>Zb(mIpOxqOf)-q~B-Y|L1`uq at wWoz;{M6E3u|+c_><=evo4#2`UXp`&yJUsCN2 z#w7j06W4)K$3u&51KQ}rHPO+2I79Su1A3Nq$+=p4MrXXHj-o4_a8hBsL`?f zqmdHvYDlq#rUpXhg0HM*jFZ#xYK$k9p4vL+SR?a1egyrrxZ!RjQYt at Xhj_%)WN7pT zVc^ZG1QZmc7`&Wmq%9gc6AdSZdN^8iTc6K|#hRUD!tcY44oPrKRw%PTKyg~cs}w$6 z$&7bmZpxXm<#-E{Mua_3YnSw2c0!<^=$89r_PC$ew8WhXg{UYn`^eD>U+o2F z5S5Sn%-j;4O})C6Z({5)pgU#yn+|Vq3F;5X9 at Bl5?0JO`(X5tCE1#<>7skP3EG|2Y zU3-GGpJlQrYN3?0DkvduOAp4}MT~v1!c1u;DRBY^Q2Ub{kQ}md3bRW47p{(aAL!C` z)tEttX8NPx$iIit0Q82vL7eve3?M%9st2V*GAe=ieB^S^#$ax9=XZIkXRco=J^{I_ zDpv{(pX(u0is+q?O=AQgF5*+^wxYkKgkFsKU(oaU$UbsVo)lr;tzkSX5Iid|I8TSL zvmvGG_o?~)b`d=(1n8z9cbF*7#ic$#RYqYbpEwf_oVSw(dBuiqu!Ee?eK!dH?4T#B zrQUB!QXLey0G)%<&4!t at 16Vo~%)+~568t_+59D0=4PDtIej;_(*jf7LPJ^YO{*JtZ zmj#z$pspSik0McHU{+!%x9YETfY&-WCkfDtXP`G-e+}shMnfMj6aJYB^U4&(RY8&^ zEs%38+A|5(MFH$LA`t^t!c7+QLlQ z!Gt$DU_&C%p)6sja0znJ9k7V<4lzCG at ih56AKd#@Tg|zx)~K-kBlUmDlz?mCZ`bXNTmll z^hj_+pze6pBOek!M2)+;BDJM2s4hu*P)Y|dzn#Xx7nSAAmF+B*?GRD|f7?*{NoN%w zu6bFs&_9qAo9XTb1mQ0RamDE$pW-ORcVYw{UJo)Th5LYWztSTgG32b#P29bcWGebW z at u|#osOZRpQXhj*CkdISa0KTr-_wlmYw4%g_7y$cw&-{iP3q-S8@`b%XL0aV98nwF zqe^Qr4)Vd9nSq^QLe196MLzN==E&LkiuUov4e=>Fq9u2ddZ! zYv8x`+qJguN={R at uAY2{_YHaV!BPl?g#B_qkQj}%eRZ%+ET>Mn&1&=l^bdg@!snBg z=OMPAwPe76zlQFa}ZtV5_nB+HSvz6EyM0J{~-Q9GF# zwp*wJEx}Q9lEbHQc5IV=_MR5zm<@C6mUXsm*615BhL}bKnetI{0v)Ow!kl+d$f^bE zq?{IcimWH?v~7X6Q|bYFp!S$=xjpod>6l9Wjzi0=q)leZCNouwiF(D1G09Tr4-w1H z)}r;BXwym7jBAZd6HeHV!i*~@MSp-kY=c&voLw@%;{tfj;Y`4>Y5Hk9s41823TPq+ z<{ifaP5^KGG(-Q_Jmig-v%1RuO+hBctZ7JYS-<4UePdAfZ#rH`C0YI+jhwCi6Lx^Y zBi9_xCKeadC4|>}ft-y at jM#y^@pkGzsF)*JKjX~1{oeT(Fp{(!GvQ< z$QpC!-TB%{y0CatXyhWO99kW%6pSl*ER-~6Lj205s2ED68}ktys2(e!Nc9S^MaJ` zs&S at K&XcwPh-5>)Qw2Nw4&6fX_Xze|G;Ry3*oJx1sSZ0{wB0jXUzd7jZ8+k^pYH|j zzXsI^l at L~j`|@m}XqRC!o0 at _Ql5%45S_ZxoOxt at GC$TUItxBt;2Jux at G2$wlIFp}+ zG)5=sGDUDgR;45*KELb#c8U7zWag>f2Wigrzs{8sEug6}3IFZd#A1 z- at OPHHG_T436#B#g>KT4x&ndFESW_UqmTghw`VqKO^>ED&&Dkm2XS~4<(aD_>Gk78QwnPTf zsgRK`y_8t$V7gG{h8t1I#pjC=yhRtc{GsgVi_3%l3YiP)nq1<8^lDe3Y!kG!3fk at r z)KV#`XS?>`kr#{$iN7o+KYrqmXhQFv#gISA20i1D+7~pVuy#rnC~Lw7n(eTUal+j` z&W01qhB`=hLdbTY4LHk2xkEA|`JC1Oz2!_B`k1wR&2a+tKCc$BUoAmHDn+%XrMb&c zuZ){Z*X#tEUG=VsQw95}=7TX{T<%8~mK7Yb2zNc3;49O=Bi8o7G<;(8MI2s=&o4Wc zD9?ihEvmPJ4wV(WEQ;@3PjPdMd{?44HfKt33%^0yYtt{0uTUz=i* zwWl8DsAt-3 at Qu;}8%g;neq<07t+*i*Y!5rI+{dfFmh)dvMTH;K;NCkkZ~NO`b7yNG zzx=(lOU_H%iJN!VH)sw_*|#o&R5PAcXV|z{9hBW{$%3C3HR_Bs>hBILIW=qIzTLTf z%I&Iu?r|?s3!0!!3|>b}9NRuLTMiFvArU>J7RAyYhw-*|Z5VwYc!hCv?z{%|O$BSM z!C8$+nBjCU`usgl%TEOQav3+RHNL(Hwewab!Gpmn3rG*3Wfo`@V2BHS)gvE?S{D$c zi5&pF|FzU>{zD at Q1OVU&1^}S&-`tO=ouiw93-1AjI_0j{Rq%S?rl<4Hzz~HFwgI#sHX$S-a?qGiaYrRi5 z97JB~Cq(?V7ZNgwT?_r*nrg5J&- at O_NN|bz)A48Wq&3lofihfx;CU(u zuMNXyjp>PT*mRAUCTWXPv8^%dlPSS<@bt z#(bkP_w`>uTfzhD4F(JV00aR5!2CZ3?f?F7&_)SS0ht#~6 at GhBx?)+ETCv~pVuX<( z+B?IbI8)+C3NQ20acIRPO#^i)Z@#aBj^$4Q-h7;;=S?JC|DpcdNw(8m2lt#u7uVVE}DyILA3#fZL9))0yTqT>J=j`3 at VINx2-Z;NYenDjC*KQ z>+B4o8?=WlCyLt?fM{p=mP(D`7K)NNeN}78MWW239N`f8DrB1;S8z5Tk*cc^O_Rdp zvHyl1YH7JW8hM0pBbBTcX at X0Up+nojzS#w?pKBnqIs$D`g|I``t>etGs)$!p2aPjZ z(v|bUd+d7J%o7w~vVyaT92(17eT`?jZhkq)wnV&vW4@3FkX%clKFjaoODKB$C2G?6cT^r-jt28J=o6y3W6TTzdxePNbQw<^;@ zemxN{XJPM%`Ep&8`f~gl8hTRM^p*W65yYN>_iQbV^ScypuQr_4Mkj{ZPSJVij=gh( z<+vFAP2Xh`Bc1RbEA?7=WMGTcGRzabokr_aPmTfdi^1s_T65aq2}TO-V!ou>d8OnL zbHO4G#i6rWNpiF4Id0KLQ;)Fd5)Uhc#PcGKsFm3izVCaQ-6odR5R0_GhUbt&@QEdr zm!RGFDmD+d38LN>xB=-akeGNv&!7c(88>s#jg$}BGm2T-NP5$qfY at MP7#RRh{JUsC1|Bl>d>U(Fvlt>*`zmq5s!M0UtGN`l zD{@!FI?X!dlX22Jt93L^DqhQ?1kcOd@>sBX18vK*3nHyEL3ZIqZLm`ET?GpS*GkK( zJlUT^j^#+PW#Z3yQFPe(`v>8kdB&$nzruOpz(9Lmj9B;TIJ&ZNnN+Mp=gpmDCGIbO!1bSg&Ij8n07H zpf_EuP13imp^A=cJVM1)T9MtnU<=yjMA0mNy=n6371zoOP+p*7ure_rH at bk;7_&wA zmQbgZKXJkwEV~aCPFilTcBq`iK0OF1IBhjf#g|XcHjq49pOLs_Dz

    t1A|BF5;yvd}ZH%6V& zO~SsY0_)ASyta?VEi$*;TD8$rq~4j~fec9ynZd&ngEWgwmDqtC(6;&Z&HVu!R5Zn> zwe|+|JXh74!?W`UoX*xstd~`2CX&3*v3S~hHO9WKD)SfIGunBM5z at rFpdqpX}MWgZA4G++-={|1z3bT1Q=W3JKj~&RQGHcJg zUZXSE6aTP5Cb4N>y%*fpE09IklIPLqEe?h8?DkSaRNF}b6$lG#M>wU`oR)6C$5>4_ z4FO7Vp;t9NH?|mYC8 at fs$!ErCK$y&0Yp8UUg=>ys3(1DjQ0fj?QR?=9PrnKe;OoX+ zQ8;w|5+T4pQ1J#%l6dDDV%ID8=sc4p=Nl?1%%}|{+Xr2glo*N*&<@8>8*O<3*DYCP zMz`BfWo#{?Y%!_4R5p-tP}t}R`laR9d4iRcEyzT*dexK{$gt_l%FR=Ws~rj7m&p$j z_$oE`n=&&~^I&de=T0w?>lO2-9Rm~HlH?TDZ6$^@*)qaZ?Hm^U5QTX2QsS;y*#~TO zO)fzk;H-JkBr4rr?*j>=rS9Of^1rbHFNKe11bmipU>_gC@`}2oiOL)_TgCHLFb7Ih zZi0$K_Tdmd{X`vlzbYCBEaAClzLXu!g1$l2&FMmoNAPPy2B4D=`&rB)(bCf$_zLG~ zy8~~ZiHMsmkd1=H*L}nKjfkP;KnO)rhCT!tzb9J{uU^EHFhpdW{!W})5wBszZqdlW zRcWHz(;^P}ijFeJCqRjf|BkiScx at K5WORoo;GhzTw>3sE_g&x`jPbgF>L~8pE(~I) z1ac^)P+if{q;v%hVSX30+>}aMI}n3!<@85`NspwZXBXTzF52d2x^K>Pa&FRu-we8O z1AS6O4QXh8!P!4Zd~=o4BAnF;l at 2!UmT+S8XWw`*DUOa=<`urI#u at gpDVy~>aZWy= zADZ6~*-5zHy#SF=bUVL^B!@IRbYv<}Xz&*pC z?FH;6%A!B}M?ZZ>6)fC!n)*&Bc)3%wO1s0|=u!4SjH90G@^fW$E^6CoPl<7(h{1Cf z{xgC?%lB_91#y`0Q!9Vwt=zYNV!! zuW2E{9l&)`zUN`dA&=>+3V=8<#z7NPldJc~36>NyCYf*>#jN?PhZ37q(BGY at XE!(W z!Ok{DyS0wyn99VjVhA~5U(i$UhpCb%G*#5~AQ7ul$D{UbiLlk0uC6%fQlWFtoRNrN zTddEms{j+twQ%cdd4T+bln%g+4BMN>c}c%j+ at xGSGZYphxq6pt9VG~1O at O|-Z7^e8 zL5+`?6M%Y at es0X(+r4Kd=~82RRqvn*fXK z0nF{buC!GpJq69~XYnmpsi_ZVw#5FUV!1ODU|}3EPEE#({GD8R25&7%yvM<&^2k&K zxg%i~hwao+%ZY~TeUl&rKS8J5679K&R&vQpqgca0I1RSmTs_J*skx=yE>XGQS}-Uq zCXBbD%so_%aY4C5RCKT{%qxUmSnC~0*~=3~4U3UgrK3k{+t7cdy;8Jw{o-JSfx4lG zEa1gq3s1%DXznyCI4^SCp+~$BPPkKp6VLPHVk8MO1wd4}b+l+XK;Qx{E|V;$K!KUd~5Zyz~+ftM$P*LOWpeoxvLuY=zAv#NRKaC05KdwjDEv+&@5(u zg_+3M3h0bxHd!nFJMMGHM-yjv*X<{$C8#$u$Os>?Avtk8tF&6BVY8z*#~|kdKW1$* z*jXOQ*W`k2%wr)>Z+B!(G$yT48Zk@*x`9w8_rzQVn$ih;4+|DX@%x4e4qT%dtz!85 zhV_u##c=*%rlVXQ at WVwP?jcYLab8n;xXr)mt4+K2!n8jn(+%-&Y~lQC$^5fm691!M zhPo$N|Ik!=fnS at 56*VZiSRrBQ!gV2~sibu#p}t8kU{-BO4VhupBYeyXrp(viPk9lK z37D+v(tSxhkKB)IJ{KMrRqL00d_TUH7)ptL-^Yec17M6IUOPs!B~tKqNfBgA!HM#4zoNU?75?Sv)x2Okx01QCaDwsBg5$Ue;K}Yy_&wfyz@>B< z)Rd1^n`P}tj2efb$BSQ=Z)-dod!n@#?r2m$&^q(iPliG_H< z at N?Uw*O5fZl7-UhL`Vdn0yMUFG;(LPzd7&3zmuUV*vq`ka~%CcS~qJ&-bv*ME1}82 z!KKNEg%Ijr=NJyn(HqOQAZ(#~L7~#2aq~!XCu)9tNADXO9+h(Mr{^L3dZ$k+Wvy&Y zIbzx?nQ@{m^i(FnO>tOca*Z#)NSU~2qw*1*I(_~iXfWRZdJRuQ!fZkgC1i_R5=t?fF`D8WfQ!~wx!q*hyVdzRlYMQ&liXdxfybDvX zOGRx+5l5m;+{%yfdzx>O*`jKPw#vjwc=1?zw*krL? z2G%YnPXBv0tjZ!OAnOz>aW>%O8kV5(m#H3!a3Tu_CXoWo871c7#r53NWaWMn%wjO2 zfq(Y$O at q;0_rP7{N4!c)#iqn81gCaBa(GqNKVsHJ(q>4+-McyIA#klVF!D)Hyyt+YFlX9%3ZeEE*@~U at +=Y< zt*$}ep=Ft6;iTB4AHE)8Ue5&)`9lab(xc9hH=*ye+Xgd9vjz2S26nPO=3xUy*z zNACh7zJ)tbWPb&`u#4 at N6EnF=vM>b at cqKlc?fLsqPlW9$w{h#I(4Y?-)ILwl*~}iF z*sTr)=Bz_)J3mqM6&!Z4z1XHb^=2`J#J%R7rU)EOZ$lAsm?M<^$P8=3b1y;>cHgjo z=A#F>NcB6Nhg!pTx7>u~3GYU%%R81 at MxlsN)#Xe&f9XB$I_QaAoi=w}U?z4D>O)>& z;T`~nnPIYCYY!v=ZRVKgYK5E_REIEFKgz!YZ_p3rod)1jXaKxI=#X07_yt-0Fw+(H z!P!On76ouJzuw3_=A35hTI58k5uZ2AeFZArWzwckgZ#$gG6`@-iHa0UyPo*N5(KAP z<{D{T=Ede++ at CJ#iNqF1iPxE_<74{-btAGUq-VQR2<)N_gRI+>KR{H|K7mVS&?svK zZvJsO)`q}0YcT0uR8zm<(H+*xbppM3kLeAaI)}AB>~ry#XyaYu`_>tbC60v45Z{5o zPA3*#3qW80+e+_Bac&?*sqC_#=(4D6sfePa&+lAhoLgd%h5C>napkC!cDbyZWNsgP zJBAa1DE5~PQ0|B`qCKK(3T{%cqXP6joD9-((Zj93>9b5XtB9CC&?bQRH}u&*p#9I2 zhJ;nyS$=rnXXGq)gpgqF{*)kSU>rNM?9Um&GD#K5LU9BX<}fg~bbWBOsz~hOJZ>a3 zd;ucAe$XrV5R4%nwc*CS%;oh|J5#fTkK4yXyDuyq^0A^EGJQlSl&EnfS7Et?QDu at 4 z5OC4)?s5G}eu1Aon8;-yx0PA#Mt3^RcIgnMTvbB7P2*X16&_h at R-;um3nNAYj?}&? zIm!_SiYJi$SQlPO_^Wl;xAXSJR-Qdszl=xECEAI2!Vk9%Gvf2aaV+3u6dQ_mQ*`^1 z0=~+j5f0EqbW-dd$1^5 zMVhwAvL4fvUyA!4DU_r-MXI7pCSCj8r$!_gmP#CDoj%Pt9u+7J)W*|fcGWJg7xkYM zx`80IXM9t;9CJks2Z49TspXos)PQM2e^uVkC54BTwFP;M&h)C}y5d>B#WGSFb@@)2 zW7{fJZDy;!mVAbg*E at m9*ix~L$h?p>4cqbyoP3UXY=_m0mZY{~o8tiNHyS?V*vBR0 z-MKK8=#)OC5sl$}@92VYwjeT`-&oH&ly__~onGOl|L}f`XMqg<;6MRPT;VdrxFNAh z=Nl-457<7|IP#vkbPQ~Qh&F+aQKoo&3L%G&;XdcB11MW){}}1JxjWr0%yn~HS9B-> zqMn>Va+Cp+SxqXuSNI0Hsd*$OdQpdLoQ>j(TmM7sn`2mqYeWX8kSq?V_ctd32PSI4 zw9tK at 0$CzGh~eW}g%D$!==KI*FuCY$4qkqOK(}EjgE(DWfegL%x22t!j9&pUDZjXJ z5x2=j3AukFq85iJ;=5?WKo`lQvS=43dJ)G;DX{q;{w=e1LA)DS{O9ZV&yV_l3h#fm z?8pcK=w5nw5#I*PN^mbQw1L80F?a=g0@^ze3qUQ241TGiLCt?{3zWG8)+F6!k6pg~~os(0QqeXT|u2f{!@h(i9IlDcOMM3pxKdYi& zM$Y>WE^r}QHJ2qGba^Cd1VcWjC;M!bu at yT^Kk;xUGZXclYyx(#0jC;uSdC9fOaeJHSmc=D2 zEcN6^j=`OeI3P`7D#4%?#-TXI;+`d4lDuP0F%dfBZ5wja>Yasro4+;;lZU>M&Q}0?*ycBpvHf)elZ5Ur2kT+hVBE0+xFqLgfdy4JJlKvo7dLBorC`3({}kc(ES)UP zGoPI3zYun!jNO=C%bd{Ss;G$5t#omt+RC4G%goMM*JU at T{cbT}yPqcA=*b4W9Z_~lE|M{wNnx116>6_Rh}o;KW{f?luj7c& zUGI#8`Wi;+Vlva}O_-^cg-80zH+(v&8Op6~;ggSr??FXH+2j!!c~~(pFOV#+W{Slw zcPvp<+1MALRax=U%Unq|3x|U=h3w-sH8l}bDEAn5@>G?jr1jhIQr>SI0Jrnda{giD zJ-6|$?qzpsj&^i|etL_3dR3QA<8EF0VSOwJeRqaScV?Zjgc@|aVtHR|JTm88#!+a= zd!;+h at ztW(Xs~ft!X9I!nP&2q%VEUA-0SFbGHruUZm0m|e8ib?vj_PRPx=KuC+_J~ zv||{KczZwzL at vADh0pUA?hHs z9`lyFYwKtirQ~Rx7f`;WgEA#PqYUAF8o=!VRPo0* zD at pz(ZK;+0fvbF$uO9(Sa&f)1=gh`#c!_HzUZ~}bl>un}QZVDp93dkPA4Zu8=NX4G ztMNFur!)zsCCaYtH0#1DJ~5qc`o$F#K^ZxZtc at e8z)>peP!TgWhD##ktD#R;xc!lk z_*3Z{7K*#7rjSNC-tri0QQJ&o67 at 7qwK&m1fZTq?1hOr!fHlr6MivY-fr%}DV%S}qf;}ED#)%_kxotLBV#TO7r34v6d=KL8o-l6Gde|)f7>8at-^=NaoK%hmKm~IW zzW at 8C*41~x8AqLR_qcie7Mt$TSz at ZWT_X~o7E6`7F;|A{OG&!x*rrDT+T59!{pQ{6^W zcivm=4}_84-&JWBYmBcAi^_j|a|^r?CaE!VP>>uoR5L4eUU?70-mPi$ph40-^-Vsp z`icCMeW~i*>Rfe8amEw){ws?_v4I}P-ENT}nw`%tLtTlC2@>mOA+DqLioceCDdW7E zR_b at 8r=-J3xG^sy6&J~|?B#>FBqldA`GJ1x0g5W`wCRlA>}E86vLRZbbXyc6 zsSQzx`BgnAsZZ8L(oPI=wB&VMj}WQeq(=M?emnFGCXUHIh)dRIhz+9|xnn-*7u-vh zXVH%s3A>wMnGeWKW5=HxjK|H2Zz94T)Q|kv2Zbe8^>By zV#P55$~7B{H!w8>B>4dNGkm~vRhBw7I7 at HJ& z<*{GJx!Bm?NYj(0^Mi74Y?4fTFiRt3%Op+H?~r+H6w@{spJ?Ox`m$M`evV}4vq^t& zZ}L>xgdYZsJYKDnZc+`P$xo%<2^F;#vC8b#qG*kL zlj(}K6AWYa8&b?|-`t~{StZqxV~<3WIV(g#L+^$wsQYEmy>hIk5O15q^F!i}4$FU} z89dXDh~nx-wE(kgiC}{|^Jm#WHW%t^A!QtOcFJ^k;0N;=<*R^c2G4_M-A|@h?p z>=F^4YE;`}BY1cWSVnA|<2P*=Orjfv)<9{Wv++-g5xAw`A2p{Du}C8p>~BbfG zbGoOwi)G|^|9Tf+^&xu~E5q?F(54})U(6TCJ0V(}ErchQI=dOkJ3&$0ooqT4c}H-^ zSMh?EOIlVCJu@`*!7j?G1WA*3bZcxKHV`epCvoS$C8+$BGSBK5HKEZH^*mo|Ud~nF z1x!==RjOEt%tbE)b0(63^UT{=G-73v=eV`dcCR*EhnXXVJaxe|}D z2%OTnTMB6rv0*c@`OGFZ_8ujq1!QV?c^WW<8c3MAr7XGm%r=1&Ev9-QaNVz_*4vOW zzDfM7g)GS0xK&VAKk(CZ$N-dZoh3~vG at 65!U`0hRTM(m8to&RL)h_!P0c_drs zh2DvsI&zj5K+S{umi!Q?X2*}6%mINTz at Z~H2(cS at _=w!R_zrGx0ioN|p-V3K4e<%X zI{wx+v_4Um at e6o`Ea`rq8eT!u)a&NVmcqh%vhvFCd@79doMXn$Qof`aFL8lD~G%RzYXE|V^dY>*2gjoJaSuM1NL z66LnP6mAuDmWV5ap_Q=vrwRUA#hOl0*r)E6#kB?)zw+?8WAdIrKo+2z&oND1*FCA( zv3 at TLT(=g!)XnFlh z9K>!uL8CtNDK;V;T54teu2PwvIT>r$Y=!A6tH3s9CsQ=(j;ef%G^~_WxFITo0Gn14 zS+#j+l;J|Q_VR{stwOVrZJr9DXy!Kd)kK}mzeRM*D76EhQ^N*&3s_F+iUG{BXCO90 zp<3FI7JMRtc&9Rcpjo;&XCaR)ezFG3P^K2Tu|T4tszPkx{^V4-pao6Udi8VLD2Tpv z9aQEdE?XsW at Mq2v77&DVW%R&KRZyoISb3Qd(lyCP_Tbr5KP-=>w8A~u)VW4&eiOBh zFbN~peStLb;y8}SZyeBSnBuvbqQ(Cq9+o47IGfT8|G{K-=$_Gj1~uhTj|!u6A*^YP zI!@fuB%p@;Jy`OtYyzkifuO;95ecz2>eeWr at cA&*uv{j}z|V!JTnv7toKj19vzS{d z4WDyIkUeQ<1%2YJalK{46P6pO6gHnJ5>V!n2%0VsPVbi?4C)C<*^q`YM;(-f z;WS at 3YCUz;PUfVz{5eO zLKkvfI^u3ul-P8jFVt^1?$BfEUC~pS2pYfOyIN^rTE98zr7l7 at ovLH#Ff|@>&FTOo zo}4n1Xu*`@XZR!F%I>L0zW1K17}xdshVAXRM)_GTD{u(ej_BF;I(ny|Hd<>3#PqI^ zbGK?5>t&wxC7!&hRv`;w2DgAOJHg*w^Wl0`F86JiYkf|NiC_9A_Avb`c zrPB?X;FXMSUMc%oIhth!X%D%!M2bhK2S}f6aNiZj_aH=Z<$(A z;{?%&gUB=j;u;Svoi}4nILbG4Gk_*;C`{Km1X~#s-$4#;@6Ht=mVk@*aCK4b+p`vM zKO*PxPKpULp>|ko|F${URC0z%XMEWHFsDH(A^)(xI$+e427QFA+QMi|+kJf7xx*lB z at MfAZ(K;*URq04NJ>=jc{2f+HP8US-m8jIX#3WitQ;p_!_V!)nw|q{kYWf+Oxcfz; z^$kG)SFYMMBmSTvv9C*iDvsO!!wi(TaNp;QN%MEb{K5TBHs)`QY->^JktkqTd8H!y zAfO at n@$5<=;BaZiB9_QdBs6?+70w{IgC8>PlW2G;+!YMYD!Io{YUaqvcLuW*3Ci!_ z#>-?EnTRl95+|WIhuHV=Dh;2B+g-OkC|wnNMAmg6b**d|x>aUL}xjciHC~zvsDuXKP#;l!M8y04x z%LXG1v4~x)oPq_3qus&0eR(T<)A1eES72*%AQ0ZYm(z?f&#iw-3B8elIvUSpR|SzU*z#|5iPE_Qk};3-~0! z0({kSKl>Wu{<&zBxPbJWh?U2GM)X+yKKZ(uxt~vYY5Fz+|MRQn(ii;FH$C;!H+t#I zROSz2tkL(@^t-V6R-XYPT?edIm710gG+hT at 6BK>^@46vv*iDL;sABM*E9WN03ZA1@ zGoB7q0vz$O(ho8H?%a`(bGbLZjlivp1tW|-sO!NDU6y3NU@)D_8i&S%vN}-vWD5IL zg8H#U-Y}7`Fp39M#Qi*heM|X$KY{&n-YN1F2@`u!5_G$U8`#3J=349wo#yGf2Rl&r zy4Q+NnE^JP%5#=C+Nr<`RE&abR_K?XB7+A$MhXmN?0MT^?+%OVh1Vk9 at aM^8WZmmQ z9xUf*WvzKW0_TW%*Mi=3=j at 9FqTU1}r#_qc8S#xDB4S5>=MdmINh3u37n(BIKh-_O zY<@erOWN2tJN+xarflN$AA}_~|JBo!t?X^JAc*TzGxnY!&T-?v2Q=6lEH{*|J-0|=OYDsl+eNJ&*JGuDeJ6fZ|t=qH#zl at Jwe`N$pUF# zYfZi%EVP%y5zht1!^{byYf4f$wq>CzyWK1ahZJBpYdi~!{b4ReMXT4wQ1>FplTzO?6_FqjaEM<<1K~ay`CoRjMj8U4`V>URk2oRN(YIb8)X(-uU7O3sO7-zQ zsn0Zr;-NT8_$g;Fhvo8II`SSOmF`Kqv)`I>iWunL+dUz>TXv973sX zlmg{j~PR0(o?zD4ky3BE)MGXa}BL}Ev{s=2bT`u)D|cO-*7I~ zCDPvEE*QHNDCp6t&a5;QIh1%}gGGf)BOkZDqKp4lU8jNX>!*SP0+J*6Cn-}hF>|&y zaQGiN`x}3(rn?ueGn#MX+El`nwa07`ysR``ur0eJ3fFoJX at yn8M=B$iW{U79LO80d|7# z(Mda>-WSiCKi92S%HQs{KZreeJ|{%ros6KXOEP(#SiI*%T4$@fI-&_$J%9fW%^ZI7 zE)DGwbxoe%>e>=S>2k&K-By-*nNNMQ4|}kW;W1)VfaAW;5Db6HRfGTE6 at DN;dYYw;TBPz zb1c1cKihhS#o;|7Vs+YS>!DVFvRH?$Sm+^Ka6YX-t0aIL2_L-VK}%9kskc{$J%0fj z|5Hi*9bj3SGMhVW)9e&Utw7{S`;Tj&9m;|Yi!8k58X&HBGCx@ zpu?@yGFGxYHr$l5`BW1M;2f;FtO5mNuqYr)F^EEaX54M`g#ra? zaO0RMKa(dhEGH}%@Z^Hh@(B1ILCcAjwHfs4CWGXLXTwew`^s at WSAOHCBOkho!I2JC zGJNcuew;elIWlTqE&(iA%0NqP@%Ps&62 at FuqdUuR8!4TYIJJz9)F~{h=#gZm6z%SX z=~({UsTRI+X(o+qbItv^cVe)B?wHX%?pO`GHG3fHzHNf}(C at S+|z3NJ_t#lqmSZ zvN>xB4K3`?)QHT&r-)`MkhFyac$Tsul(;sic55?^Uu*$TZE^Z})Oc!W^cw!7P|T%M z6F$*z^>}u_ z5p|^?59-5;gHwA!EM%pgG=|k9XHBoMlM8}^>5@~5K2mooEzLMHh!BqybX1+1dDe1w z3miKbkT`95MirgyLKXDdmIG&U(%$N?+ptPHAskn^!_b+KrOk22(KnaDUiiW-O|K-| zMdU>G7O9ZXG?ypK*8PuNI?tI}&97p}4v3mX4&n{pq8tI(=%H{N6M}>tBa~p8Z@2l-$A;Dc^Zk%KRDiJpSl- z9(M-r at dG`r`-Qm?o#QhA{9CC6X$OZenIH_!PHj&#*|+kYc0u})Cf!Gtq4SJ``7=k) zeu2Q)Bl+vFM4&OMck~gvn|OiEsai&T&V>1 at aDtTE2q7_7#^D++9K2J at cT2kH1p+6gKCz+jlhHSFrMy`}~) z<^q>5Dfg6ZLStv^SGCRnCrTx~!pQDESXR3tp4zjyb$zf)rUN0i>Old19fmXyi0&3& zrxuULdZ+346>BH!7n9QM*7BFN46OCDRN&Qyr%N^g=ZzPHi_2bL0~YW~Ik;}}={A?A z at 3mTHqZaOOJ%H;*$9m^RAm2}T84Yo?GMXkprY`0dcrUmZ)_Gbv9Nr7*GWKTta0 at BY zrOnN`#ZD6q(&aF59b4E^$@A6gT7s2H_&dydc6N$dUBy!OqG07+Xo*zrK7GUs)~my8 zx=IYkJJ9k)-8<#>rkDKvid_6*t-BvCTcV1S-{!Qv1G;SD1Ai9!oChyPg7T*GUJGO^ zO}!_(iy9_wS$sy=;CS39jg!pJ)i^Qd7%}G(F=zTRxS;A)kw}g^n*of4tX%=&7)b}b zhFR3ePjY`jc5 at jpoCX(-jQ(_YgM>cE>^x>po(OUWx17ZOh4_&LgZm^m2qyQVJlg4_ zwsOLxv at 7$*u{)RrhDfU%QuVo at Uekz8NZC>uYhdG#v_ce%AM`i@)Vt^)gcND0$`o=f zeM>?ULPz>;z|VM-iw;YM3gG=T at TT?P5QzzUU}q4U48z-Hz6ny6C1Z`bU2GENs8{D| z)CSh~U@=|Vb(-Xgb=Q@-fO5Bx)a!Hj(8y^hK1yb*UkPo|ww8z3u`CG`IYJ-E1|BVO##6+9x5|AQoQX&Le~}AAUYzRts0)X(m(^21X>Na#rf06pk%!$ zh1|1dwzX-o)rH9so##XG#R!>cfYQ$&I>igNAFj=bZDm<%p~#KTM+{U0(Pzc%;F<&O zj2|@!ya!Tjcw`&g#x at gVlJykX9hWT6#ifvw3A%!o2AWoO#ie$5{PhIxh|5|zhR}uO z99}m`N;hrtrrAHQ&^pL01#M`xI+^ge#u%e#`B+XzrnEXfH>ue z2}Jdr$blRGc<^$_ISu%#iy?Ca0&j-gx3(NX^=!Zm0`eITf=ppGs zEx1U3!AK&|c*5E8RA*vnbFBS>@CJG0?%BlsCHaHIGwxJ8s_B5P*s#bvA?0Lvv=GZc zJpsdoOq0$G)zb+5Vrmz_YBHIzb%R^C_w5Gp-N5^0!u1jEi<SHNhh&DEwM)#|_2+FGL73A%JOx^i_>HX19C zNV;0%U`N~g;rh!`l%UfQcmWL!l6y>7NDbSX4 at fCohrt=}y;}V=hsa=lv1;pVLa6x@ zLd&!g=kkbQY1uncZ|PXBxPBB%?T>GO7*=JbldOoqnDB}~mHtqmE?n6{TY>gU#!#*( zqAFx?RyJE&jH9oe-FE`&6kHW5H09*OB9nwjxfEmnoXADy#@TxO3p&2#NFg92QzVEc~Zq_r*+;N}S`?``*O#ZcaQ( zbE$TJC3S^7PTApHq12<7li39*ypU2sNW4ptjW-YhABu(nA;bly_bc+RonxcN5m~bD zzcs{Lw3$Pi{}tgb{Nu#V|BiD1dtxV9^*<5GY>`*vXobu5ZI*fzXo6CM)h=M;r52iG zB|#Ddi&gERSL&P_rCm8x&R<175I^;uhu at hGPSt&r4%%H)S=YeKKv_Ira`c3!yIJO*lbR5~7nI<984dm+zB&Dy+zCRajYd#!?OxpV^|c`vPLY3}WR|*)vki zSYK22u$=}vu212w?ahW7tmR)QNw}}GM13mH=nB<;t#)o zMLJBib8I!PE1(Rz)CUjQye`Rx3^6$$S4dlVPs)fBretKlA4ZCP>a z0M8*Fg2M-D)zMxb%4|7v6|2U|q(1>{JwnPAml&jbtX=81QcT`UGn9di(I-Cf*T%$T zl(1lYn6Q%-`H$L=DhmtZ5P!aXcj>I% zjjOEQ`7k)K77e=o2B>&%O}|?hT at tTokG7&hO9)_G7zu1 zNK=m_Qk=Vu68z`D_H`E=El8Q46fp z)g9h?`p4ZveXt#abWcnNrXU@@Abcn{7|Lv2IJ{XnpB$P5#h_>z<&8ZUQ>x%%((04+ zP7Z9~MV>J0TIt5i*7QcPTmc* zW^H1M at X%dK#KEgz#j62Q$j#Facjr at T)Qj`<8sX}v%XI4?{_00jpQs}sE)2p0qd)`b zn^vKN>Mq;eM4)x at UgTl^%M at RyU@h}vt4UuWW;p&GzGJYSh)ljdk-0utK6yDYAQH)L zCodk^abnOjfw*lS;3qT6nc_SKDte_JpTaF+y_(i?J4&c`k5rdn$hJ_`yEF=`h^oe* zG#uRbzcsR+RwbEAfB*qyf&CM~r=+cuiG!_)!+-Z?M=NXpi+%m8M0d5JYID%C8y4In zv3NXC5<1+1(PF*;I_Txhg*I>_-IM{zH at -H*yo>kMazB)~Og^#aZ_${p8@;paB%}$!^IZ;SGD6|U)sbO)MA2G&_a>@ft z>#jZuvv0R03E6;USCJHI&HRtY?o;zMWB>>Pgw`A?*g$M|N`%IY z0LS`Z6C7s@`P(D|n*t?f+K*gz!1$6%$P)A;7J4!#PnbycyKnkM at jX~_eu1%cNo&MG zk1js+jVfgsg(q{0mLlnj0Qy&^H{J~eFy8+7QuYKRkIeq^#mQC}P>5M-)4b at ESa5E^ zg at ii1wLyOtwC*IFH-f2bVq&xG1!}p9fWIm~$pg_-yLh1iNM>5$oU9GxgGN9*;Yz)X zp7psJ^Q=9O$r;ikH95al7)G2GRZ{ zkGEj|gqin0 at +ji$=wxT}UwcwfXB!*$e^0^wd!GARYq`1-6gCXbE3kY+VLXy_SeBWE zQFFd8v>zEzTC=P-k@}Ukld$m?kz3)7>vwC%h+FS)RThANP2D z)Hx*R7{{3-wgWZ(3nY<3d*FkVv ziHWvuYPBbiqs}zXpNMb_GCa4 at wn$EVBYDLHzm;-MR^#t*HfazbX~b&bcL2q65Ee>23*1;E2`T!quH at +b>pQPH_4qIw~K9!wQW*hF z%SqwVGp?TckAYk=M|`f{*{qe6ENQ|-Hr%fwE+2e>CIUnOvP>QwA!t?1yuI}CAy`!w zX(QP^qXq$^Ar}gD({<0^sI2oX7{AATDpc at Kr)*E+^i}qT^;;7?6}l~vLmG)T_XQ4> ze&zF&%?HaanTe_Pi3+hs%NZLpg;O!gEZF)ty)L5E$^Xn2dH>0S4W4i|=py*V(zf-o zBS_6PB`aLxHN47Y4Ez%w*i_OI!4;*xtWkH=bAk`=x>c0qMj16Bx$-lN|on9JZ!9iX`e+1g)%aVAupF=X4um8kjI5 z*5*$L6JbGCVDP93UR7oj>ocDX|HZ7&2T4=Q(0c*0u|nR3i41%wq_V!9!VyYMoZuYJ&}U5pz~n zo5&!8u#Qqyx5j~$;DvyF2=5at5u_DRAGpHuX|gjpv?Hx-?Uv$&u~E)o+A!z|M|RXnic26Mte?NcQW5Pg&GagAwp-X$ruu0%;KjCgzsnFFQ1uKk&l7a#mnI`IvU zmZc>;M*wL})Cr}2CG11g!T_{ntS*ld4kslT%&dnG=g#@PQsVUYeiEJL85}*v%AUo-j-qu?L(G4Y7-l=B3p!- at T2DU0ww z9_X?gPN`rej$3~BnIQEhCtOs4CJXHN&8;-zjv}=hS(3 at w6}C3#vdS at mV`{zSt z{L6LRrG3k-Qfyb6Mw02oQ}0Jg+xnYuY}6}U1`Lzj-QgWr-FK=lsyi6GSW|x)9YkT+ zY!%p&Pypw83|z<%xNdfINxV#xiwjBJ8QULy*^kcOm7`#yb(@%nHp3svR`Fb!E@`lt zltK)kOpa$!zuRkz5g@}Ht8NO34`B|Y(Lzn;7Q>;fF!oEkJ@$bZm1eCbW?p4;;!Whd z)>ii!V}uTJ_5#DKYJDj;Xsna={`gTAHg_`u^eHs0VouT&KHwTAd`Cl^%N1c5HUq4+ zi{{#88iSX0KzSv>asjpL?(^(4vToj15^@OpNKcINI~RP at cn_9%h#*Y-mI~~J5!KBR zDhgr+iz z5Ykr&5;}W4B_+O_aFSmfc$cgw5r{YfU4ES#ZVC~twW+eF;9KpZ7_G9&+huISrKUqZ z?uA+d%fiOz)5^jYORtabH?Tg4opTXmje)QP&hV0z5&#s>o_GFMqdNC=_ErVJf;SVt z5Vw+l5FA1U&ww?JQOux2wb?G1(R1`O#8`2 at L*H=*1z*IK=+>)LXT|7rRD1ru6w@$$ zk1gamppgnwDKZ6hLdadDtMm^(Yy+sE9-QImPw<`N08sY3eohOHOj zvRk;@IraKS0BpW>ynynBc7`}+L5Z7ReXKB>EvEli7Tm~Zhe0Yq-CVZikf>+m%5U|V zrbKgy^&+CW%Hdte8X9Jt#+5G!Pi@?8RlKO97l=0P(gRB`f~Uy*f^j476*ba?4;Ig%Kl4<_N{_L;2(Q7zNi zSoE%khZ4{2ONk;TkLR5IXAuQ!&F3Nie2iWW^QXV{R}<70}Mc>g~h5QM8xj^^c+lX zb6V&sL5VwPQf3H?_8VN?;&OoPF)@W%PmK1%r9PtN33RZhz&k(UmD|ACi`<=dP-z97 zF$Amuz6)$mX9Qkriu1EJkY*aM^MBh z)WG_Aoug0~jnEdsT4g?RQI}9U0JM zf2>A=!)BQM#`a#I0zb*WzOj82)IC2x`}kXC(2Vlwar!UovIX%^uB5Vs?O$)5>}>x# zJNPeF@&B2H*8P`l;ajlP)M`=sAy6Km)l4S^{DTy^AR)tAiMm7(WG<~3Z-ZrMy-DxCcNI+l4`bG<}Es!Z1OdUC7%WYh6P&iDK63#AYB7;rk$mVqyhG)&T* zF&iIFSj0{xbDlQOG?k}brIm9d3DGi!wB4K~Dyx;Vo(bpOV7P*u2)EE)P-Z$VoP?K? zZ=%{}j2nt!Qlj5^m^{E%xzy3rf}7K5b&n;+uv$Zhfn}Q59hzD03}GXg#0k)!c5&~~ z+uGl*;O=8gLJ^zLY~|Iy!jY3TnE-+SIO$%~aj8`gkFhMUcpFCC_c|mT9>^t at xpqMZ zW5|@04TGxOp~c>;7s!=c)cpF`Gp25}xzfTKahOP7(cS_|G>q4jb62_V&Q*D|o zFP3H-e)AUQB>l-l*Jkdx#>wa_USegdnskZi!XlyUFq1H#O_(7 at 9DypjMRTv-lE6DJ zmMWD&PkDikr&vfbp`#`$IbsCL;%2xD0s)U1h8b)XVf#_(UdKthk8CFwY;Z# zJ$|VdfAdqj4dVDVDWm2^n}?+=Q$J)(FTHFi3kAwilI4k at ng1H*+$o!2MX=dLfV*m{~;LxtKfqph-bKg78aQ3UR#uvac%DHrk{u5k0{nry*Sk!;h-9C3!&$?X=@yv zGEn-(fXLR}NeCU4ezwFnw6}0*^Q_=S7RFtbpqrdh=e{ zxMkg02@JKM7ykyWf9 at 3b;8l zkkI+dB*~-v6MWnMT}S>K^vZQ{7|W-L<4UX#n at 6xgj*xxG)1NkO(6--sA5)}7*BYBg zA#C9w1WZos7SW_8^&7Z%DrJbYSN7){*}s0I}&s3%&Lrnl`^{EVT9Ywk4{P*@sHV zl-r6C5MS5qqt{)g=Deg)CO4gB);Mhdola%buaI3bL^@bHVnN1Mg_XfVyw_v+$A4ZD zI-JQdrl at t1El`#fhh;KD&CF>Scv4eUpj-?48$A-*OtFy+w`wLM`aHmb{Z8iKab1erss#tri*{gKeulsK+cLq>yb at a%y=r0HvasJq=K$2w=opnv)4M zRQjE)Q&aI}=v+{Kv1u$UZADtkT_V;`ld^38s#$0-ZSi0mWw{TRO>q7?YZ>LxVae01 z`U@?4K>fi6YyZba+P23oVQl$T8TydvtM5XcrS8CT&8;Ebz2Ah3V+gF|s(Mv*CA*Gx zy8DFnVi)a143#M)&s>9Lymfu#WW!k5cn1?=W}WZBe5Jyf=E854XmxpG_?&!fV~mUn z+s^D#CH?yxjfJ_#3ZQEQI`~xGt;mY*(`wuOit1LE2{>!4DFigAB^6*p*oeK#b+~T zF4OW<*z3`XChm~nhPZ%JEk#A*(>2%4^*|l6nKo38&~q7?8in`p`Y2h8cU4)bb4q1h z^M;>?uw`_d*KvV+za~fhqIrd{p>l)bLHj_zp?t-+WZqW2<>@NjeQ^ubs!^uik!6D1 zTY(GIG#XT8Z{*tk1M}r~0mI*?2%V{oQlJkePq`ZD4MYBFjZ8smji`R9EGwI9loExA z_7NZXv?mYq6&3sXJJ5qFivf#(<`v9W at s?B^4R^o*JP@;B`+AWE8Wd-;YeU*8 at X9td zSJ6g|&w$A=oJ;mlHC at -ZkwGR6p;w#qGQ1$V%;(HuCfd`6{*-CV)8D++7f)F%7{wv= z%Jcjefdug$PtRsc$8a{I&5E?amVW(1ZWMN`v3w`HX(xv7)K+Zz16}*C;;y9WC~&j* z)uPk!;>BVz(@Duwx|rt163QCDM~&sl_|xHwSGRVeRgpM)DZGm$k`7e_hn3=B_~&Eq zE1{jf&Ox at +jqW2F0C1Y`O7L#clW7{Y&E#Q6z2mP^vnh6I7v?JjYwr~~Jhe-!APPeE z?n!5a=xy_WpzpW5H_hv(G at -Y)?mbRl-vhxMFr=;~)=z(MOBNFA(HB$?trhFd2=sRwQOenAl|lQl?!BAKuUTO<%XE zrxCnL+K*2>R;D+}Z8Mr}E=Z6UWDHHlaj^5JH$DiqgFml{1+a>xrsl)ZM$>clv^Uqs z_nUAR1=5VddwT+}e3I8WO_6*mtZN*!*#$I+4>M54i_ilmf(gye{+_Ev^k|lN3yWYT7upTqN_G!2Or0yZ5-cj8fw?C_npYHaLoex{y zql_6dBi2Z8!A@=5Jqv;nMc`{5C4|!Nfe_p~C;YI^)qG+i#94 at 4h<^b5aWH9qhAU&g(`0pNe7<2gX9IHIII0rt2p1tnMSvkOhWb1 zJ2AECPe51 at v?Sp)ad*V_yd(_@)O|W-L7GwP91%b?QQK%G`z;ehocqWx>i8aQLn=@&Ht?Lc)|ERj z*rPa*5y`5?+&tA$Tj?VzY624|`fug!zo*%@$=8AAD(!iTgFDj9&VTw?JRPv!Wr#9k zWfg1E{`P+QlYgKja9>+{a$h(|D}WBnNhXs#5xkAIN$}jw07UbrjyVTIhWJ1yOwt%J zMG!#3T3SbGkb-ER zIg;yTiV<=861m zqE^_llw8XBjFz6j#aGWYpYbyEafzUWf+0fevqEBVD@( zL((F$Lk!SRZ9(Pep~0+zg|xj+j?hNUeh#8(*F~wJX!cOwHr21iBA3!~51~;$Xkiea z{S$UjqB3vIRAovp$Emh6;>DW_V5Z0A)xL!2T$A=4sph3H0hOu4=`pk zrVxlcj&Z>YQPHH at OR>Io4_MCq3I)KH+8~s}k!bfkcULeP*?6(Mtt zLW=kk30QNASTr`(-(kEYxU6r&cW7^N|592ZZeF at EJ{^s#vfQx=!^5&3|8OsBCX6vK zSfMB+8LuGWlgythMkRxy`nsV-Dl6U_x z-C+(}x at -%#tOQEVan>8WQ3TmmOUa=NR^&tY%>RNmXB6dyMK}Uz4n$&Fdb%K@&uT!D z!&aHf)?3Cl0LwaPKQgK-WO-XR=ozXR$qV4T4nYHJB-<>6qrkk=qpR10f4L(}!ZMbO zNtBQIGC`zi3-S9IBy89wRgNJ^%=ZrYztzBK=Yy&GuN^S(KQYn$U)12=VO{dS at KOZf z#C)5ysspy#o%fV*c>^iikTCd!ssS45az!j?T^X>5yZM8tsWmb`efU4RR{q?9)eUfp zlm!1PG356K2QyZ)zP*og{)~* zA6Bh~Yg9(&`3OCr0SDbpbLrOFTz5YQH4V{Z@)RPBM0z2ke=97cGxEHusblXGKZ=q( znjo4Wk11Tt_y6tq1L~_l2Y>wm`p|)ZnE!ts|344kt)c0NB7tz)ZHNV#Nm5l at -(-wfA8JF0(SCD5_w65AL=7%kHhz~ukSsNGY2M9E ztA>iEZsEep^WeSp>*X=(W2U$F8yHCBRs@$l5GDACGpr6dRJ9EywDUIugq_4*HhtJY zr=nXe3VZ(_`_rI5im!w*zxa!$B%0pR*mGx(mDjz{gJ%kF#ZY at tfxzM%I^-s+sI}4S z!B*oaN{B1Rb(MI{(lUVXNFr)h3qf#YhbeW?Pq~=$b;P414q+nb;bn0Qq>&M#i z$0BmD(ohJq*dj#zq7x(JN^ouB(;Dv!B1rfW#f8*Pj1T*7ycn%h(TW5X1B`?#S6v%I zY-z|wepm6QWlFt?qme?pnqZxWwfvw^|VPkM7OHBzsd^dGbtE;DvibYAw zRhEHd$+FM<33f at SUSKCzDfqEf!e)@|y;yz;>KJ~c$*csz;d~cZ05?Q{~ z*ClD0KT)@qG3pSp4kqxJXgDX-9oT=tT;tnokS(%IztXe553xursLXBiNMjcPnPdZa zvZDf;xB|e-D=;Gy7$zJ^))FZ)Q^V$3E)=(aPl9lj&Th;s57SH&Nd>0%Qa}=4Ac{np z$50n46LkS#kgY at UKrZzjOvgugf|(iQQ7XZe@;RNh)fHd00_^m;VRoc$@pQ!5YV=0@ zmPxC?+|zy#E==3l$X_j~1#I0Sn|$CWHm0W`AL@$+&_+qe<#(f!lC8>TQl+8q3i2F+ zTq0s(b%8V=Eg{jUxshGk#ar;Y|CT0$3LbTLZVA?8JAwx2>+AMz57+v&T+e%k-0H!G z-a(F==J{@{nL&OXuZ4Gmdquon{)FcT*)zKg*2ieEXJ3c>aTKai6Z#k}pDV;Gr5s$1%= z;fGIQHi at BkuUs7p35q@9nYs7Lk$~w>PJpZ8t2)$*r^8rk^j?TH+{)nyne{KTKV?tb zS at 3Nf578QX9#u5J^`?6cg{|=(cD2oWSGY0V{vS2LrCgR}rG at y9C5WtxK-l*(S!QIp z0b2**OFXX}qP{`VfxbeI`~EwG`fJfbcN?qIvaxQ36+a^=2*?+=iiR$yHB zAhOQ^W$xCAeK_qw_0J at L7hki4=^e8(5E7~~=Lo|W>mm{<%HIdrRSxsz at 8>b*o8P3g zs*>>!gvC?9+S%jdNF&nmZ_&>PS$hBw4MZH-TNRu=t+(*CIm`v^PV1SASI<_OZT1``SaOz z!`0dQ{j|UUM1P=3(_t?k_l7hkOrvGr3txJd2Ol{KlYkNxDnuK6i@%L=7=QEd$?y$l z$Q8th4)&G at P7rZdPe=e>k6e%)8#o)Fp_+GIqBl!tmfu!`fd*&1d at 0Oqx8bfV@1Rvj zhfq>p%Oy!=sPUE*uv``2%37+kh&Cvf#~eR;q?D*~Noil5F6~ioyt)i{v;iO21>dvS zpytXrqO~y9MC|*dGS6Y81*EGmVsc3u&yj(DS$Jj}G at HRm=Q3cZJsHYrv$Zdz*RPyv z83E~ZX8M=`D5=`s8J1bzTk1_uBG;Eggg{jpyR at wC7OFujSAK1821P3DlZJP=MK}eb zuFZ=Q?Z;1+JnKkjWF*U%;B`|PO0um-mV{d?G9=4}zB=Y-yrZ1>Rp(X4BUh at h-s7km z`s5!;rs4sre)71)&jV9c=e7FR2O4|gl;PhFV;3tM;7`PbpUsSCjAgi}<7jAXk@}UN zHqf>Yw`JJ0lf4(n$@DjWEB2>B{n$ zm_v_ Gfrv(VInd#D4EywAAg`-?ynI2>1QB%Zey4{En7kxZvWQfs*uQpHP|B&{M zLB90OmT23yZQIyw+qP|UcmLbAZQHhu-PUf~?s;bBym#)rap#;?}cp3nd&PJ zsAbWaWog?#7h{k_g+_GRYY!moX->Jd>vYV9ii=@jIW`^EtJzT_U}jSzskcbF2&|Dc zvvZzzLyh~`Xu{g at EzDhL&n_po4yIM@%@a5ujJ>bruQ0OWFlD3m31oLXAZI)tt36h4 z?#+#H=Pov5*~n&d$T3^+FY()Bi+uPBHda&ZYo>S`debgqgJ5mW!@GUNW7EcCOClV855uz2 zt`A7o8O-*I_xIs`00$!%Q}^LL&pXr4jp{Vh{eZl zp1s2XPWc8z6R{{QIbUO(VKtb4E72LkA+A4=Oh^GZVlkvCiS++!F>ccVDyqi+Kv~E& z=M<#SKCZ`ZHoJv7LNkf;&xDt8pIgOxXPV?5W3kgJ>J{NBP*JehMoq+T at T@Q*m{_M)Yn>U?gm>se+PIS} zQaK>3S+25gJg^SNJv&tzcl9)xAl6+LJamyFT&r`RR=CWoIL$MY+l#Lan4H7<4lxUR zdxy^vbjFVQ?F_{P6KES at Fp$3)aVSM55Ol(Hb-ZpB&Y}=7?+9s|S2C%B-!PCq{2O&O z-&-cibmXQyM|3P_m}WR=yr}_2mopzYqSdHM3eNsp@?%(#`c@#TQ0_Gp(86f7yCy zm=ide{d~B&2>@=7mIedfirynVBHMx?jow7Tc=NVE67ZdldqBAsX9_2WoLw-!fHYak`Ws at WTYk9Dd627|WjW1H%ukxdP>Pz`zcXI^Y3N z!pLr8)}y~XNnus!)g`>nCM at Zraput)4KeiiBbvAC6gL~K#Vsz!hzm^TjCSL)+(lEHTyLY&uhE^R{laeTeftgzpeSm z*wkgMD~jfMeg?mSmwQKi-)7xfNEi2z7gN93kn;ka-{LliXGLz9?WG7uj|8J;jGhL8 z$*}@5+K&V0yv89LTmUO}L7Ikh#%Aj67mI6pW!KB~G2R*>qyq}T0f|(Jr+=UvFJ_QGEHlMCQ1w`V7 zfUk>o-qa~6 zQry;|RCSMP?kT|4zHuE5X6BjDcL#1woMZ=*wDIWzO at L-5hbwTd$Na<_-Zn)DGBrQr zQKAj>JGz=8)=>v%?OP at v@kf7eCD``T{}I(_gyzhcvzz(=i>)Kv6VZm8IELVVxX^t4 zH^{O~FtySD2ePPO{;MG&c{f{I7g-}0*MCPWEfqX7G=6^Arg^duByp)A;viFw^k31i z(Nsp*6pf@^FNd-wV at B~C_e&lLSHBg zs>-o5`Dyp{JCmkaswr3;u32lUXfq3H*%3U{swywfx6X8!U$C@|Ky-bwkUxG^$zc5; zKK_G`YZ}R&+rs_*Ue$GR@^_^SpsJ6W*f+&oaUx2_(F_uiM0w48DzPcSwOB2K at 7JvQ z>Co4vlXR*Yf^Fc?K`PKnGFAAuOw&+koHIc`2dh^x03(~Q^HlXU&0W+HWdt>ymSeb~ zX7nta#O^GFV-4_;T~}%J5F`fkim~LZi5)o$9-F!fV>4~E&4hpkZ6`@toZubunaZZb z5T{9YAIY!6g45}TQE*eU)*J%Gki0WnsrCSB_$Ct1&tDaU?J=10um=aNS`FKrD|0Nf z2c2Erjat?6kPjJG<;Dw8*LpK_s at aq!eusBC)#>my3VMs8ya-_TIY?{e8I-nvxZF$l z%TC4S_GP!d3m!}O8MWtEx6++^$iwPAJ6HsUC0KG{SVQcvzuJip2^LwdO_WDLWu?dU zf={pnQtyx)#?v84OE<9nmgil)CttzxSPG!~fETeFUNWLdc8o-R1bb93NvuaG&73Ma zRcbGjIWSHtqi{dnmCklzoUPtIIdlT+n%nerThpCgi*Y_?qYzt-^JTg-%{M-KFy1`^ zl<`jDfKvVI%Yri`RiB5*R$n1#yrqKIb0O{uymx&(KMzTLF-hbQ|uF5i#pu<@^IxGOOexU zx;8Uq^SCveE|L|_Ino0u at EQzB;4uI?j;IrV2z=xT^yWtBwJL&Ow#i(k!z2Pctq7D9 zw>0z_TV&`)mgYxnI{g*<>hgHvFXF3)7Vi-$$u?vWjKESZNfGHmeTwIEg&dkqxmCz` z>;~{pvI?)oxiiBb(21=s!$0xvx$=o13w33lz>G0K($;8Jtg at Wwy>`g5V at u{mkweMD zL~K3?D)kTgd?feQy`=TiP?+}#wz=Y~YXy at 82Py6bGKxFXLLnP{kxYbQO!&vAH#J}X zt-7o9cf_O`1PG`I0tiU-KLsldGh16>GfN|PGgCPuM=}{RFI9*Cv9d(O!QS1>+11SX zU&Zbcwf|`ItUXiVwStQdaLz}r1!q&yNY`|Oq1q*gN`7_IXF0d`*wn63d}(Cp-85Q#Wx%BGZu@?(Jix8c{z;jzz|f z!Fgv*O;auyrBmTQaI}$mSg-2;)l~g*1GER2aoUhhoUaS_^Q&o2%a8pOjzEc%%p-6PoBY1d`vIfdiAKQ&R!@_+W zJF0$NnNGni*u5w+k;$}@?zEkw at 8jP_qE-5}O`2u+w7zeH7ghQ}FxkSjWK6 at jaco!3 zTYaiy$NFeFjoAz`R#MAn{1I}Iz1(CE`=F0IGB$tCmt2Rcp?3LmE^G$QK34$l(hrPK z7~3)gu03v;2s@$vv$Sena^};0uA(5s>9v7OPcz at R;Mew7Z3I^bf5z0|XG%J+wCzx} zWV1PEqxLp#O9WJ*!Q2o|3KTjTM{++jC{1%Mf%6vT0RqNTF3qJKo8^dMHz5`t at W~YH z+T6VmKin*36mK&A?L$Yuo0 at t6BYj53uCnb}GmCpZ__D0%-VK at 0(}`e;OW$Y%s>w at i2szjPc&D0^5l*TU&H6#5;-mvV>ZHCV!2z(NYc{K)&Mv0i7E z^-sIl`jyLu-hCy7T=ONE(uhAm6D&aHQZHWeMXK0`>>7z9?5$Qb)RW|hl0lL#m$>%H z$`^{Qbm+Vm5P7{A)b#60!Ty-fBhIS9#2z3k^NMb=~N78WnuGFW#*Vd=D zZe~egmyT3dw608V!{9$I at SbMM*^lXND9UOPpPX0loH=3#^w-utXiKZa#&L6#H<1^i z(Bg_~9Wvvn!{tPm-X&sho at BPpAf}-D{|W;08CTkKnT5hx5mYJ;Q?{p_5iVC)5jE?U zZmDD+*B-+jq_>b;m}=-bKwda7I(f_gOJjeD?+}jSj-O9&%v2pR{>ZoO?^20=&)xYO z^}6Kd?~J3xM at Z`<=Bc#8s+U>yt;WaNAa=~f7te~(+N4Oyl+4;wVg(M*P?)HB(}!rm z*haqiq|*b}Iz8hcemY=$IgjTWxI5Ms^FIoHpNIxB7RW@?BQ)PgjhGOUzE5 z{7u0(oE$76M3oL_j1yPlAU;4RVj4qepE)(yim+6=ev&#v516k++LFfAF6f7a`?j;c z%{F%dtUl at 48OWg7ZA*bxYUxT5*HnDnaf) zvQe-`w`Y at a9s46H`=$3rlNnrna*6S(XzWa*2C_KXaw^>h4A361?d`0wf79)|u~uR0 zWR}SE*gkIX at +`#ESKwzg|^-I*6U!640zX7w;+e0u(>vM%3&u5Hn7l{VV-OkMPIJl# zDtJ*-TKCSai}dTsUs|PuGTO+j$qEjS)r(i8Hu7zhcd+x15|s$AQ{?u(D+ve`}-uRyHM12W>BKna71X92y`s?2T*f!vknq>O(`zJNutCVSvJqf|<)CUGs4pM9`p&{JKEB?x2J6Aj at O1*Nl zBeI~Rqv=KYMlioP>EaY>5k|$3=(`cYAr*LDH-uFUb7VKIcbfX&rm(0#D3=mtF8xFU z at 2e641DxJyY1F+%3HxA?#rr>i{!NqD*+oDFhamuAPI-j}-s)PH6mp9EwVZ!wHocI+ zz+hxe%gVIcE at C}4{@VNle89T(%dO!lHRuq_?Z_`W1$k78W2r7o5&b>XvK0R at Y){-I z5Jkac;o=AO-&pD1y0$6*#Ig*u|7s9K%-+pT*y?||p~i;+o(B4ld?0=!FEKIVMttTx zhn10+?S%v`Js2^VHVTS1Q5Hmz`+AQSMMjR6hdHt6=5n*Oou5rr&5ebhsvH|}^Frpi z!?%(@-^nZ!Zxb(3ecs$w$IF&W--*v$$H~^8pU;;sL?FJ{fU0t`0>hvzG5cD_rr{Yi zbOTA at 5zHh{U`C3C2%Al*PZUlAj7#@`8M~gT&r^3)yWNQ*qgCr+0MQJPw%DYxPOCU3FeTCYQ>9_!JD+ zCKA4QtdeTgjlbcI1zB23?r at tty#B&L&dLL^$eYf(+s;kV3t&HGd;O{-&M}2pZ5VK4 z>8vC5W`An07mX!^%tDvD}|3M#5}f0ydp-MQ!hEC5 at 8S$mBYwI z^^bVrszlIeORtr88)*M#pQ^-(2Q^^~_g7Gg;H?K^hS>I`ZwqL) zfh+I}NaAk5fxZ&^4NBCt12Xpg?3Z!j#d?Nk!)r^iX0V-)$03}qqew!^pX{A!VRc+> zbIxYonV1bV0lbnvJL6VUi&D-f at bZB(VyPI`05_#%g&Ok at k*9$wg&)7CE?L%#hL$b# zle9-e{%7km%Y@>_m3Ji@=Bp1YTf?FR$qy&ZB8026=*`owr$x2M1{DHz>jv9)W9MrW zF^vJ at ya*!;z6H|}dbKU9v~wvX0MY(x4Bn)OjkC%SKgAdEcZtv#o`@2uqmoDvW(HMl zSC}MGg>H4})T?QHG7OJ(bZ)~obC>a75gMP13+}v)*%tad)KV|q=?hpAMmbJ~)VGzs z3>}V0AS)aYB%vHau2CvV)D6tZy%RVQkJ=7 at DhWa+rA0+qhqn_d&dq% zYULcF at 0=#~(?$w5l?l3wS~;s73~G|Y-fYdA+BB40^4j*x_1bn*dwQssknxPi1yl6m zK9Ld~k{C|`lE&g*PWfw%jn_`u>idI2edcYK{YpX|r^X9{2CFx6Tiq4 at teJa^gxs5` zxYZ5L$#3>5Zm;1oUi3~vwy+-4NDy>nXT?g>G*h93RiB@@r&B%Q0KZc%6 at 2S{w_0Sj z^U?*5$N6?nwrdey7SCw!xT!mdJ7(`P%kRTSzWqHacO%|3@=V{vQu75#ej+c-$v4** zeA_PKnMakZeDeHI(B)Py?L{urIaVJ!mNnGrC-7v5k{*S(XNIM$mX~6U`Ckf$Fqssc zOH-1r8t`p_HrLRWSYouJ!eGyaP(zQar*S(@(V|edTM>r#Y(z}rh$&`y{kWEirxJ at E z1-WJLoOOo09zNaI_+(4lZ3)sZTL5>~{N}7ruxzpy`8_20L#A0tZF~Z((Fi!xIatJ( zb&*Z7fy!0O{1sHor-W3AC$h}9``e0MDV%E7)NiCo9nmv_WV6e5p&<;1^~UHN&cz!e z%rDf?jaLL5T=jYB;BA*nvK9(5piu>{zzh1oY!_A1ozwmX84vx_}0m|+gz9=ehukJ zq6LWZTw=7neBN at sLM62yY{iBPy>Pvp|7WZiSrPCh+l04?QH%DvOjck{!3kYsbFPt$ zzjd<*qe%d#ihilUX1+(K4>)AySOfg$%Qmq=M~Lo#KAoW;hDgRD0p5f=%$19OsVCir zAI8a<71 at NXUCJw)kZwMZ=kN}N2^_cRFoC4XLxK<2I5mnZdxorRN2Y at 87B2lE($Y=& z;y-^A*7Q>h=AIp=Pc&7(l;%#_5>{jY17Hc87h`Kg)f at _DHMgi#@n`s<3-DGI0$| zJa?ca!6=D at IL921z{o&M->0KR{2#aBNp+mYn^$F2vXql{^AP1VGYBj&u7Cbbyue*B z0lep**zS)B1Vr(l#&#t)v;Su$VU5Oz3$6zGcdgk)gK{>Pf3bY_s25wx6$Oc%(*Q?7 z>tQKOZO*X0EDDvDjEzo1_k|=aW$CXVKxV4NZgI)4si9vY%y3I&rVxOW7Lw$F{1?+NcoZqNHjK)@#|5acZ&IA2$OTyMxaVoY3<&y3nK3lToM`-q>L>Hfi)odvk9*~(%_g=vyB}~Xgabu1W1sz at x53xi1A&V7o_Ec6CtMju6U5cVJ^J>*h z^I&KOGwB+D0_amS|ZKhm^ozZSAZ>8q~ETbNT%1?3~PV zxVCEggpoJl3|lv+r8ToL*F6kRNl(Y~s}uEgdn5FtG#TmDq3kHvIuAW{`{F>$JPZ0R zAOHGERHf0Uua)Fn-ppC+5EC_0)!o`cszVVDKv70=f)OYU4b0r=9*u#Yi6gsg0`NIJOjrY`aGRa09^0W7qg zJ_GWJi5YA)h{s=Fwd5R%Dmbnct?>-JAh}YnwW2WiZ4Nz(?ROpksqK^`Mj?hDHJqn6i#^T1uqNj^aqe>1;A6@&FbGe}PK=aBTb1dlfM1xPyppcQWU1JcW93cMTfy4aUtt`}Ev&ddR5jx| z<6t1<=?6KKjQ8_uU_&iz>EXR-v3zjH?c=u=xX0czdg8ZG*5%7 at AXi<&t!qQl z)pXg_jGgJ9UtNDK?ZE`owifI&FoaNa77OK>)rTekArc27vmH>i?qfx8 z+XLH8WSQu`IBx-nKu;+GKUOb$rvCVFzTEeFLset?mF!cAA~PVIh_tTy(AE4dv873z zkz~%Y;Q!-WXLjnZppTZ722aaD!l*BMpGeAhg1rxZ-*`G96M(G`fu|1veTf8+_Nt(a zj2Y?XGqT|~w8DReE89V^Sc<4H%z at D|taE#^I$0Myj#G-{S zi=fJk8tSmOiBY*Q$|hp5j>r)$b^LN&Q)`yh9Z6m7%yBs2coOKV<6XzI^@0DI8JMkY zJvO|@(e~p?GU&New}{GH+(2x2!f9P8q+G^%=l+~p-&(=x1hnGF>cU0-#TB$e(08{y z9fc4GkV at +l2KA4j_=M28)8Q!IZAkmf6?=okm?O++5M-_wL_IdR_5WNcJmdO(Q#J~w zA&kN#e~^rRYxVsRh<;$@8(&sA>g^LUwrtUp6C at o6KmAR%_Sx)&1w9E)AGt}L(w60V zX&t*wy^(Y5LqB%K5yYA-lkh9b{SL-%syuZI>d`HX4k3*8P*F>~ol zMN8}?E>k3J-W|QIF9Ltc at -kxFi%QTTM$_~|lm7nEZVY3Pv!=G*Fy at Uc+gJ@afb_C2 zDLH`YF+lm=Ao+(A^b_$K`E#4X+EMcr39|(Y!wm}^I68`mA|#lVBswJAP}+95dL1n3 zun3PaQk+&vrMisEFK2{qP_%JKI-|OQoYG82elj&XnVy?k$62{`ub9rJ%og at IVH8hA zQBr?LWbrPao1ip1iDl at g^T}LMFo0wh_}|4SEj?QhLqLFlS|EUcB>&R`fU2{Ry^Fbn zvz?jg|2}m7|9YWrW#;j(DIFaL6eXl at g!vNKs*#O@&{g#kw~pkLjbX at 4iVbVw#)UAF zQBKVDg9;z!se``;R)rjQ1B82VEVEjvEy>dH0!*wHy%}%Ejr;#|6?X%vh%j>~nY3_n z=sHSaVo2(+AH+n!kdGIO`(vw(jo#XocBy#j6;CnUl60uBS9-zCXGURjxa*W<-(Pu+ez?#INR#nc_n)(EM-V^2 ztUE4b%V^SuzFGIsWHWyRj!!ZX;eD;it6!XVg*?v<_n!m(M#0M2<4 zgS81aJb#$Ch@@U%A`B8R7M$;BHP3ht@<_FzqfPhGa_|-=GzVz*|HrrX$Q=1PQ+$PI z4of=oJ;fWw>88wW&cVZ4ja|Th-igRaWDXFB>FV!I;Y(G86 at JN(;WlRgM-a at Cp}SC~ z^X8e%H={X85|8apDsw6F;T;hy|H5=6=fa1T&lI}+H%7(rkvl2KKbEcu_FqZ&{2wj- zU-AknHV#WnX#Do?n$q)~1Cu7SxYfUO$fS`Gi7TZnag>Yu$<&`C80`C!!z$x%NK)w2V zH-H|l9_ab9+^581pVuY@}Jd(kVxL7?nf at okBZiJ-G1!k&6t9-ur;^0}FNa;>RhUH|mqKZ!d_A2!f`|KX`q zt0eUzvbbyd_2I+QD%Bu#Qzons!H(047b5*g-(Mn7jp_{=h84Kh^?+U7w)!5qD51^E zC1H}H*-z`qWxdy)bku at qSP&wrC7z;D1P zKK=(k8<77i*^d8{W&NvdvH9Pr+CO&outuP0RLjEPIxxh*$~4+k)RQ&rDWxrn-UHTY z_5H$)GD+|yY8N#-Ei2x*qu6721>Lv#teNV(hs$NNuM)54zkhze=4_iym>C6zWxG7{ z?*4tzQ}}+rc at YG1-P2*rj_*z%WQ)r%zWjYzVwOtpqCcEq2jo=I=8CMzh(sd?EOxGfBP1+H(uHmm+={5X6)-BiCJz}q7>yge#O>7(z@=&Y5fQhy&r6o4i1N zQsrKoZw*XJ$+4nciz?ntCp~@L_QNYG$g4_zmB8WJzF?Ofv!<_eq_kR6 zMa~nkq*qb6>X{P*RG7&fk`7OK{1^C(*0(+s;>J3D<51(askg+kD+>jF+Mo76Z40ti z767P{KS{`D1E-VO=C(}@Jv-?Y^AR>1ftl%LjH|gIICl(jIv_hD;UW(hPOz5!Dj at Ik zjC)kxp52Ul;G$s7tn at jXglREoeoRb+j;Fgpo;yvHhCsh%x5MzHT~KNENPVYM6+C at u z_E@)$oh15CurP1IuVKOq^TyIZdI#5R-^710<`z+G3()jjTc&ejM9PO#Q at c`7kEog{ zbFfkln-{O^s;;cx7LU#_(jshU^^oEA+NwT+9ZbfWwmoTLPORn&T<)GX&sf)62Sj}p zbJs(|Bt;#ZBpoOVD>pAAWkur!`}5klvvJ_jz?`vdS>lM7h{5#8EVR+|U3INAGynQ6 zL6~rPlg3R?8u8{E0tx_H8H5;W at BqE0m)Fn${gQEA{82;j(E3>H&FjVE3S`;9b&8*r zbImN+7V`1h6KMZ+3yc at H_laJc7jZ1gT2s=Qi=@jX+K7L?;Dvts1uHF0PdB%{X*TIyZ!G< z03I#IDCNM?JDm|92x8~NvC?uu*y;9>OWvif)MLd}~)R-MY?Tiv3M;-;_ z2P#k_^0`s+Z9qZUcr)^JLG!s#p~cX!fKVb`4m#p~mnB%_qNX>Y+1sl at 1B>Vu#y8BQ zewn|4(3`22PMb!;;RJNy!lBhhk437I29skPjV1XjbwMb7-YFN$c;8&s^dWS#g}p4#J?T62quZjU!{DQO>L?=v_0|tmP~)yWY^5-X0TpO zg^m$ojXG+ow6jp1rk9fA+_JfA5X|X?dQfx52>QvjoOty9eIuiFY%gbOZsWH%KKDl?E~4I at Gzui%-S)i!#IuO z4#@0bqt+f@%P;$&htvf9ZfhLu)?g9Tve_MRBS(f4_ at I`(_UU}xpz<43)gwTy)W*dV zkMq3ahQ#3ta9u6 at zvmy2H_C2h;6Olxh(JKR|7q-$v$B^n@>F!Ta&WeC_4*&>NHSqJ zD_hflv1D at 8bzD%*u>3isy6ie1;|YpY5k?}dV2b||Wde+Kf+02)C8-ogI_3IGVY9Xy z{}{s3cnW-ix{bo({~c9I-&gE+>b at Ox8eO;>?c1xX at 7-WO(N7z4_=qaR~T$ z8BhRvzqO*5C)SGMDE?&2J|1c(RM>+PlbKXZtp90PccgK5Wx>u1mx at 0?;egK) zpH+wV(Or3%mMND(`Ltr?Ez_>F(?;14XDClwaokybymj2~HW0Q`p2DikX-f}@O%z>N zR{Q}{qOtXlEwSUsS*}HL(o at e_YkaG2s*1G+m?KJBBBqL;6Qu3oa+F218i}%MlH}zW zt4rrBo{=#bm#X>cwy^bjAo at L5rzR00{$=;eOn{f(VoGPPuIj)miV`6;HRLkM#Lfw| z%3z1jbj@*vi?bdr=MglwDlPc~OZh-I*Qv|>wS{f7hjE-rT$B=_`#j&e*vh-M1)N~m z-DO-8r#jtTZQ!8{v}Kl;H=rX0b7o^~=DiVlmeX zq;$$}L962$Hr~>^=hlvpy`Jm{?VpNnBO5IYP6iw97-j2uCRv>pc5h8G*Azu{Jz^+C zW}TAPOqk>O+WaI$MnlB`dA^Y_85s9`JwOQ&WaU<>GIai)l&xC)m>ISMRr*+Pu>NIQ zeHonsb$f6X-lH701GOjanyIeFEy9l4Ey0e)EwDiHT|#i&T|~%lbTJ{}LvI6>CMwn+ zGPasZ({o8|hIV(?+smWZy>Tn=jUJ)g1HBRFvSmEjI4wFmoTW@$QgZ&OMNHJvobd~u zx}yWvQ-&1cEU?}DlnGwF70m3t@|r3UvT8>|YfblAeMy!=TNwAcN>d&Zs~GzzbPk?A zh^qn5Zqti0*;QKl-=1RIB#PA#TE!iVU|(3(4VEiY$W#I)X_o3U+V>b6Uh_df zj6xd at s2^94N`E5V%F=DD#K`4LFt2JCFAF+IT at lrY=kQg-K<@E9h54h(->_Re_WH!u z^!emWa4Ri80l)f4m<@`6cTq0kFHt;%;c|tbkZ2`ha at jq)U_CZrX|4-a5H8)&mGwe1 zd3ysdyMXgNklhLpYS(9iNuJn1cSQyeEeB`RVAwFxEHT`9VW`-6J#>K~Ibs%6l{%@qE}lxeMj{>9xbu zzH}u9kVErnCxn#?V!~`w{A>fl3O9(hMGh_J{Me)9gjrGa|9b;U zL~;SW8W;#j3KR&4 at BbSAd|54`54Aw%PUx8 z`7U`2bJW0@=NFr4i_SC?yySXZL(|4n}bp2}K!CooLgLG#j9ZI{mr>2$B^G8o! zl?-oht?(C39CSW`ZZtoip-lMLvNLgY(!G;f9UI#o0z%P;PN_5xS##1S{VsykI%Mzt zL=f2`977cSKo&m4IB*X8)w=%6KD*l(o7$_BA2npP+GVhp>OieE>{nxvxiSNSJMb$u zkOLjjUCXHEly_`VzbmlN_jl;XU2Ga-zzH9$NOmFF>|PXMI`T<5lm5(-rav%Nq3$X% zrDp#X^6CNlRG;yi>0dkggtQ`FO at a+{n%{W#LcS_a8CLOOPM_&}%m)Z03wX?=tkuA--^5n=aZK at Ey$A`%h{&PNK^|R-d`}w*2 zBc^+vKAqoWG544E=jCVjC-3jqPw#^Z(B_>t(i4}CkQ_&NO!|R7Lpa|o_#KyRF1 at 45 zQH0g?4A|`(5sg!>fq92l at S5Pn3}&z=%s&^7!BIrimTyFsMY~sO7Ng5U3Q#Xj{~BBJ z$yKwJPDeCg)RabWC3WJ2RjVncQ{@ehzfp at -%@$X=s*_DMS~DYCDZ5n;e#WDr#OLvs z2I9>WCZ*g*y;b&7K5yLoF9wSZKdmA~CRiNzZD70kNqC%-FgscYosmBhr88Dd2|`e> z11ok(&$cQ)Un5dg^Xs(*c5X!7Et`{CBLwg!a#dSCoc{I%q>N90myV8Fq-ZS&a&mDv zuar#qWJuX3d?&|av0F!OtQ9S2aI7)sW^!FlbZ$(K4-D`2ZLCJPhd2;TXQ){<$V?5E z`hPtHLd at h73XZWaqhI|I;5DFvn at M+fVCV_(&PL#sZ=fffo=g8SCob8ivXjkaHji$t zPMB(jkI5?_?Yb_`Nh!QKXt?-OubY710H-ceVkf__5v04pS4YfbQXE~FK>>{MP}G{j zGc{W-*&%L2MLLV~J|TJTt6Zgr at l8k)TF7I9+woZc7?OKuX?rWB2TEf$(Ki$8lVv!}X at dW1!7 zGMY;Zwdp*@&pC3IC at WD$S5d at dta|#WaDWC!7cKpX&C#-hH(GU)4h_enMTL2zX)^La zRoE(xYj<|WT^MgdVUzkHf5dyYez4Z=vKvVtY>Ald;2WuR?}Atq34RZkSa;9`SQla6 zs~bre6CosiP!Z~-kT}F2Z+`x60wpx=%^YeBi+LuT at t_1rf0P!u8)vZXRvTy+!3e>Q z*!FOAj~#Ri_hd)O9>82|GzT}PVr~A-FK>8iD?r+J at L@d ztk!(bP2)MRT%5tft6U5+o8b`&twxWa>Gn;T}Wu0AmuR#zE*OBE+_|HL|RwuR!>Nx3W2a zNXVq6IifW`6d~~PZULkw>iA%1ivq`GdR>}+B5V3!h_Ya6h?C48CdZ$|8CAev{LBmW z+iMO+ at G9_G!Ry`JBF^I-qIv11n8Js*{A3+jnY0$4w_&rO8k%QCfpkLD^+FDe=dqr^ z4^`kwTr*Brq{T*}?1pFcPKLx8_OEl`4$a^{A!Bi{(nHD1*{0_PLzuG}H at 8GbQOM#G z_U}gDgu#zc%e)dTNO%;CEhh0Lsu~wbC3(^ilq3iKE1Iuu!WeY~f20ZuqO|vSQyZlAqBB4EuXQH;b6cYul05<_7royLH`_0(3FE;Os8EaCGq(|7 zG-9xWg(*}HBVUE^SB3bz!|s=+BfkYRD`AO{ZqAwR+tyQR0rt>UwSNV0?z2bFctdlxEEUymhT+ag=Ib@ z_}-#|+xxH|#%om6L%sF>s26oaNY8GkbMMU;gkS8{jBdX;6LzE6jS0_3L at Y6SEYVFn zPlx;$;(jkHM2h4hXa-A^|J8)^Y7XPu5b at NU?8!i(rp8~9R)s9t!d&zocLCatio7Om zPF*Ty8Cd8EJD2d3`a+VBsnjU(@GRl+1 at 2w^P58VA8#3%xCSQ0Hqi0Bur3z_N+}ua}FmZ at KAM$TpMHR{RF%rCi9tVS3R%!pzK!W at 5IR`D# zastPdQ5JSHsUdB6LuWmtT1|o-Er>#^6wS2W16%2b>G;zUb;19MpQY%2qXssHAH`ooqOI z?OEXF8(qw=ALat`9qA4tji}eh36#eM+V0VQ^frikbo=dWt?A(8SM$95Ax;InG8Np{ zmS9ZGkg%LfYG6QNAQ+eK8RYv(;yoPOb$8J;bc4K(cQcG@#>kp!BB_RC%4`hNq(AHa}l9O zZdUn`2Yz{K*F;O_;n{G01mCh37=s6L$3NLYh;&D2ob`(Q98OrIGA+{>5l7$T&vMIJ zxzkR5AaC}}T*suVNXQH?YcVv at qoHJA%^NToEqaFX=3;6UVjF}_zA2~;Uf2hNTqcR$0Ns at KBq{uM<>SNU%Cu))FxlIkXG z)obY4Vs(N`3)Nw4iVny_miQNt;=QyDQXf%UUzpv!HB96yBZ)7x at E08AeOTg!wI_9{ZaMjy<^En!?;_?33(SD7ktnVP`rQty at 0 zF}zw#_Dg)&iYj_CA!S)#$r*lXJ~;2wKGRcvke;rbUY^2PPVEj%?aWjYdhft*Uq z`D?KVTK(|{bG!Vc&U_!aM`BApR7x3r{=@ITNyRSsF3=Zn003gd|HPC0KS{;^S|y!L z9SxoB|K+>0rH|u=`aAm-s_TkLM+k|KKfy*ip(o_u9D*Ula)6{rAQ>S^sKq=jXJC+_ zX%+^ds$JFaj6@%?wk&PCoX=`y1sr_x*kFJEcrSk^y63Hc|14_DWA5sziKfTKcl9;P z+2`cj=k)#a5_jA8=>>r6&K`|%h2XPjILtVfj4TF5r~KIM6~doqv;j1QMtw)bH?wT6 z at uF#_Z}jq)fKNSEeXxAsbm~5Yq4qGU`rZnmE<`b`gP<2h47hiCQXlewrgyS+E&W3a zv^Un;dx3rZCJVJa78_M!U;FEw4gV4M$D2L;HlzXHsruuazz*ymLX|%rVg58H`dT6$ zjC2_T+EUmp=D0rRs^yecU1-E~D}!a*(0G{4Zfm~TRn$7mZAN8l!^3#@EENHZm7I1a z#|;M3W#n^g_Sp at eyhOlkR0cjtOg3ONKI4z2y?FwKc at uAm={De4E-r<00b5nhV)aDp z67te9T?G^qp}g~q=WKdQ-8}Cihwg=3MnGpx8%2f;#fbCGM^XvymFlU& z{rLbTEwd4gf{zG`ScN)G+y-Kdt!iz(^>nG%_b7GLX!ivuPM@xa|AHdTe-W2(+a7|La;I3m^v{A%}LzJ-SfTBjoN(#B28Bigo0Gaf37835epk6Mw^|959Kg5jn(#j=-gP) zhUrziL-Z@!gY=c1&<BE3C6ayt!1oVV1FX ze!-O%p;foBK(?~HgoRFz1|WOHNMEXgR}*Q<4Ow;BnKDvqUtY#M1}w5uqTh|sA|op3 zJeMKore%I at Hg!oT?zgJtomfK?2WSEHC6|0eC73U`N?Ffgou*n`phyuW8(Q1kS6WIo+p=L zi>TRtT at H#J*{F13229LOv&-w=7}EFxJC|BY?;t zjQp9IjF#J#3K#Lh#q&w`Woh&H(fmN9`uk4&L_7~m!0 zCoODnu*WL?(!GYLFBosHkStwAaayH@;EC)a5`u5UO>bQuf5#O#iG=cp{8lJEC*>DX z^hbT*88 at r;c3fYcL6pt=TmK9O&c*ZSc`VZ#+|E$FJHl8!wV*LtRZYQz{c?4nz3#Lu zOs6^#0=_Du);D}ITl0Abyd1M?r!{i(^}*MzF!Ae${rwwXW$IV7=!@@VJZ at eH(-s}6 zGdMa)Xuny(K`;5B5Mn~J5X-6fohG_&tk;R+9)TC<3cp+!FW=4v^?3>cd4mB>W2Dv; zY02&oFLQOC<_PFd%rI|5=+1P^pVXw}22v_&a&u6x8)Bq13j50#R)1R&H9`_A1(^?jS{a zc6KOFW1m|c-`nIgX3vB#I*+hbCaqV})jJZ>Mi*Ew(rpo3M0rV$$}1(fU9k*D^YaCL zXso8xMVJPB*h2uXO^>aPE)iz86_{Q_;TA~sLV4e zf1xLHsv4W0&g4M>S&0NpxL1mRV-6WWpIBZH^AK|M3=r)zjpobIJNmR951Ks%QC`fg zcb_A4^p*M>+thD~VQB-{7488(E5_iu)q}YXDJn(SFGS=A*4ON at K0mw#&wsQ07N&jx znjNkAh6A4e*q_86|D$ zv?=#8pMDpD97d>0Tnd7%2j;V;X{H{_!S$2ur}9`~G5dOz_mW`O-)R$sXxg{TpROn< zgfN|vPH1Z76}fiGP+Lv@{u{u6x^7nEpLAXjKmY*N|7TJ0FFda-9H1aVh(05Xuu*C% zTC4L3jF1tdV0M1Yq=n_q#218mlLJ5)5^FFF-BcZBGa0801+ax-k=76+`jL}7xVM9B-+4m9^kegU z0mJXTF5Jc8y#>JgLi`>VLGvFTjPZOi!~YHr^?ewCe__}C>;V5B1UbIRgZSuj#endMQ|(&69b z!H|?`ktIPwW^9Q`RgU10ZAizGY=gDDC;a<1TbwFkb

    S%jIwh)F7vcW&@6j#UOu)OOR>td5!hi{Y>*=Jc?4wfA$)p=&u( z({C9C2ZIbhfqwqoAjPo>TR9t*x(seHOAU)tGyKc+F{WWYGs-*x ztIY8iCA#c#qnAhS*0gi!Bgc&>M}tzUT!|UC z+iT2SQIo_7T?1>S1?$`r_wbkWTA+Z5x~SY4Au>>{m-wLjlT>?DO2}#=%pp9q!vQ^X zcmg`pB9kNZYC%W?kukE|APUqTOG+3pK_b&I^L2kzh%p0xe?Y)~ST&RsA2~Tl+^@*? zUV-5*Lz7JH(`}NuOFv2dW>qp8d%f+~9|ka26irteB3-8qy(3>~yHZB>rAexCg`Oho zi^a}ee;41x81vQw4Kn|mDTae&-N%vjj>v-}YvAzKgKbsvDA!cZu5Yn->vNM>i at u7> zeq--_kEODZ0EAgq93N{8Arw0{6enwQN at +}@Brw-f0wF1Wkv$gZfqdd`p=jZ&BFZ1I zKt3R4fr#zBs}}Tn$PcTnKI4*Icj*vfeEV-u9BEw8b3-H)p*aj-L}Z08um$Zx>8v>` zw7yrsC=|w#b at LSKS+eBlCvsNB$S(y#n%Pz ziExrQq{4OyDzxDvaMvj~X|IX!@;OnoD$zfu#8Jz{MfR6zgZa%O1_{zXapP*E3X068 zqP)}yuMcqM1SA`@-w}2mRJyK;12&^cR>UDVA`diV+LR#>#Ck&v>&?mpF28&-r<5Y& z5>AoK&!P6=mC&yTl#_zg+WFn#itt6FR)cCLOdV$_dmg240gDXBrUrcIJgC2!@5u;Y z%v8 at 5q8w13+;A at lBxi!N?g~cr%9pF;J?l*v=>8TBI$;jR at Rv0iByE#a3C|BIPTanq zq1P2_ZWXUW^WARrU5B*`W<2uAnYVjF;iP#0dw=T{&Bevm}~U at k-iU_Ud{3$h+r?!j1( z?Z?SU>_SMBOYz>?gKHu#4a+gRW?*o+>>+pT`cAtX6;Vi zUiXm$!15rN;v#`QJ(0wK5JTCh!zA+*{iEU$r3p*1f_Q$c%G6VJ(-4>79&Eq!vh_6I ztL?LS;R?C+Pc10wv at qJRMjI;|u;;KP80HSi>~XyH)c?Q}%;8if%|S7%Oh~bSr8Vc& zu7M}Bl3h~%PBSD+*GyUxOKOwrt-%JbI%5r9-I=c*k3fva)`^TyZM#tcv%7ut79A2WmjKqhw_`7hf7hXN`+SZG?&ZHa`Y^op;7lYM%EIovmgQf zuX5#5oCaFkc!sJ{UQ|pP%T!K<-v^#da-2qn4>FE}DW&Q5ryB1Vt+Vri8Hmht5Q at V~5R2ek>rN_D7^x6piO0DRN(-$^7^=$lY{nzlO+u at l=i&#*F zsOh3-qsd4?38H5Ka*%a9_AkUkOzVz#aFLx=Lri-4>8{Tadc%)VdBuiLc-uCx=gS_n z=U3UFou%35B{>WC4x|;(*KF=7bDNvu?$R#{o3XUbC=}MID_Lio z=(s#Ws#maCrVXG{CU;ldTUBh6L5#N~M1&$~{(Cs*B4R|mdSmeapoWz$z>ubp!N^s^ANE5EBL&DP*{LPZ)FZGrO(A zK5#a9)`pYFYtfAw5W>{=Gw#FUu at Q7ueDZA~6NZEt?JDfBGM<=2o*}GS{D0l$qm9IT>!=$ zcdY|t*;*Gj6`f&KpuE0*%PJR#R=h_m2Aq&4{rtDK5F=~}Se^gSMj+(>mCODQZs`82 zoy)g^c4tp at Gm!~6BNV!fZl~U`E;O{TTm*O#k^x}D9`X91QT9b-Z^p2=E~7w#FlO$X z>M*CJS`GJi%Y?gSA1muFC#&V0-_QLqZGbjkr0A#`2=h_$nK*GASQLv4bdWkWD~kno zk-?B-li3_IS-M+p*9~m`M~<*|6WvX9M%JZsx^ZdI=7-I8>m`Ne#8w-<`sx#eCT(kN zChg#Ko~%;oR&#dvluI18yGyP`SByWctd~u=uug-mnrx+s7GP+% z&e>A8Dk}sI%!xP4G~$$kD$;@}z_?b_cb&VE)0u6EX*X0QtWbk{4AL@*2VDh4r1Na$ z;N|h*MZqhwC>hOZ&j%1p=mi%m8+$Rg;;|gE7C3|mzgdR-&!`jZvRtH{yd$_Bl*1Am ztLsDYtR_b4nJe=CQB!TYxUg`Gza%jKghlD9gtuxtY?V*eSU#@22<3yhOhBu)+0hDl=MCbSr52J zCAkGH1O6MIgsO7bF7txKorDW9A!4L28CH)=Z#%TV0cD(oMYRpSkWHandWX#qcRBJ& zy+-}JEn%HkY9u* zlwQ_q`ji(5dGYMMgYO|k=I{mtfz=5p^(RT4f+710A&lr^9llZ zkLQ(Qn4fL(#Hz7LpakzK{<|Bf>4MAa{(%k7e_(^{f9;0=H6@#&cu66nC zKTbJMSkwYZkaznt7jee{usK}EVBSY- at pkdc~0WuQEd zFo^;^12N0h^4g&zSu9_l-qNDhVpI5C7+4=?GT$v$cfUVI(t#w5!WKd+i1J{E!dZ#0 z`X4uu24Sxfp%3Y1L#^p?huN}^L^1}vT0H{!86cRaT2BX+?n#nQ)(=&X7{Q&igSt)5 zqEY at tk0vRzRd+jWI7eNgq{NtGk5mL1&|s58OE!7=u=o7hoB}76Kd7`TdGz)hk+Qt* zHpnnJ5UPn)hAz~0SzpX`UPxft=nie at a4B|qEJih}u$yj{vlI#PceKh=Qe2NVQ=Q66 zOQfx1z#8H9Efk_fUR~=pU|Y{&oSco4X8x5ueHyEBF0xLwbg*BuSFuQhw4if%X^V)T zW3{NEZUpQTDU#+0s1L;@=oEo~V>Cvk$3o)DAoiMJ+DW-P+EbG4NTWZbmmKt at y-dvgVujU=?LI6@{grkVM!!K+^3qb|G}Anl^7PVe z$K7e2h{Yybrn#Eq))t}FPyT2(lxrpx`wjXYRH(|ZAwNcS5hrhwGU$|>g5Q)dd*|lN z+I2pwaT)c=AbMi>f|OfhnV)JjZLW%}>#NSFO)*63c2a zK%PI(J^V?1CQf)?$xQx75sGq)W+Mj=?S~Q0qLATi2!&N~aSUuXNQP(^pIC%q*t3 zA>2Y>ctM!dDMQ0O(G{3Qy8mU^PAanNPM>1n2m2`AdLe%M$&8RpNie9|-UtyZULX8w z#1H4gRs%vWeHd at i_++;@vDt~~of`z at Y@K2sAt+Lj*oT%)x)D3}L4KcAq`trpQvQp; z_W}`1$=}silHYcVGda&O__A&t7s8IOL|df( zL3XRu|A5E0%;LGU3{e# zV_ecv*J>HVO0TDHih8hjw;LXA$kK8Nt;Wr;{E1qxqV|^(E?M(CmgEOW=yM zO;J-l)q{pX!E0V2YV?6UoWnqKceP>Y5 at bp2%aO+CaDcz{Dpv(iF2 at 5XXDbYTqJ`8! zGp at l!rVk^if$VDLda>$RtGgD_*^Fhji-#%-zhRpQ#=`u=bpde#uFQ>&Sq3poErIfv zJD6Ev749|}-=ok#fy`dGD|R-v6YNEkyuO$?5PvIhtml4K`a%-*vz0>MLrr4ZIak}J z2fZl}q6v78E)#d>&(@2^3_g-v)_xC7iji7p==hAhymt%~^iIfK%v5&NJyIWtVBf!} zBX$lY9%}*gAL=NwyZ%q=IFA3S0OS-te^$Kt|9b!cowFFNLjVC`BmIvzU!{y)tfXDd zosC@`oc}8UE?v;nF at D@Eyt6W0r8tQb0|J3b;84wpj6%Sa;lvfJ4BSwWL; zekm%-y_DSi-FfaoOcV at Y1ZY)`*O!;1#cOriTBmkawV1yf6B52`-uxX<%;qmETawEt zN0n2*;eXw7nS0M2<8M3t`sw+^37FwR9ktm)9l*hZJ>*ijdw}HI!Yv#yvI(g`L$o%C zVp=&AAYkd9mPi&1AhW1LsHP5T)H%T=`{zT%qMJH)?MMERi3cH80ZZ{kd1EXDg zv5}LwBmK;H)f>pCdaDS^m!6kn-iM2rE@#U9or!^p^80tl$TR_)#KWK|g95r;wi%x? zIHHtNcPJRUb=Kg`3~p!;l~jALpm{6>OIqqgG+1JBTBa0sMYYtEE;Z at ylv$TYyQGLG zQ93hxnH4OwE~caF*xq;EKw)0)Z;|J{js$YomwdL-Sh0nPW9i6qI|{floS71ouC4R> zc10vka`*LCW@#Rbj~xC|Q$?A2jB0a9`m at ul`&=W=K|J at lziFYDB=G#ZpunLEErR<{ zn`{p#Po(a%$idp1G!~5n)wMcsYPqD_ytZ6iu;zyV7&RKk)A|A)W^o;n at re_d>uj>- z)q;$;aQCC>oF>)5zgqN=9B|T5FFMwhrK8_D)Cg#jk|Ed2t0w%|cM5i9AVxAhz2IJzZsN2(l1t~j zdgQY;z8x+Qx2_|%(o7?*g3DO>`lI at S>?R}Ue6}T<$~i4}us1H9cz{3 at kNZxdog&^b z4srwX}r#8Em2?=I|%$BJJ`AwR#mg3Ys>Su<{7tfq?}#BKmww=C>O=Iqgz++ z`#cs88+~)3rU=p(hCuBe$*42gVl9dRz0I^PiVX1*N%J0d#}^A%eJdaq zhCunAia_-o{zC1ZD^IBb at k5<2(ojX5fh&i`FSHDeujT-ouj+uCukHZ+GpqA?Su8pC zBQ|QcNKxd;Ih@}J9!+(f-)o at 8cTP+uhMRjztpQ#i#;@!^JV(Qc(;z89YcIA)^JX$D z8L93oH?jVtE0mm$CS{}oa?5dU&_IaW9DP0RD#c-^G*p03P2bDdBB$CX`5ai2Wsn;4 zE4BsQcUcyN2p%QNbOQcydo3YZHWvkLL;aD8kQs)A`3xq(YO at VSX}38v(cMWk87gu4 zYl|{%^rWR~(a+yr4=xpVbf?N%_Tyx^yRX!;@UIzrc$e*A#z=f>;>`@~5MA5?>odGD zml^D&6VKSPLJ2A{ZG|dm-2PoM3a*9urO6{!g#~!=Q(;?JFCXTD;4|FauG@~BJ_rg= zMCH&kn at aZGYW7y$vVwn4sDus6_g at N}HuYNe*sc`I3P at h7Q;Q-65}~gCNzXB~-*4i7 zMtB*B?sS;=LyfxaVVt`|=Dm`jj3{I26M(PfLt5JE)qHSkHh8U;N}XV at D}E=l?Q3jF zxZL8++GnxfgywC(B0Ik-43|(-nVBwFgUv1Bxu3#9}wRg=60qq1=e<4 at CP_kJOqI}2CSNq1;wkXz% zf1q*N`i~l1Gq%fqz>PJ}Iq7{A4c4Km`{mw!f_S*k)lpJsb+5`h;*>R{8nYV&Q5eI- znj8E%PA$j}!{g(W+`F1i4|EYYIYuM3@((Wh!l!NaH_Clc9FEv2{i*`d^gyq*C)8XV zdoIUx7$wiAKD60upS0IIMoH at qEHxfv;(t7*>rbaz$;r$_3_7K8OtszH4Y?GwTK$e@ zxTYO^a*NG4Q!mCsrl<&Ia$+Z-E%UO5p6TLYC=?g*NYKV#K&d at X(>=DXj_nIFm&{zp z`IX98lo~~`hJNsrUf<2_%AnM7roq>#?v=|FO!JcvT{@SGxL?nk-lHAPRIn7DVh~Qj zACT&eWb1~l?+vx-hTh|i<;%8vu)~D?tTyu19t^M|VMN#?3R2t8{e4d~20q5Oo7uV4 zQ-~MJC7pVV`0)VR`)P0J7wvBf8QD2CXP9IWXA0_7Dwq6diCirenXRW^CnYSZ4ub;_ z&1P0p0Dds&kkG#FD)$GcjWZZ-sdE9RQnfmqQZ(DVJ*6;o2rFtUP&N#+ebT6&PuJ9n z)6kCdPMeCuC*IliBh3(>pS7^S{{Vd^on&v4(NY(Af at +Iwom%yR21ouYBT^rQf>9Du zQ!6xY5L&P;suW&)!xaP1R!2;Kd0yrgGg%*bB4&mBwIL9PTcKW4>ZOVF1NrY+iC$xs zbq@>#WDNE{h9y~ZuYZrqTs8gpMIki)CS9tO3y|9KOHPfpfWnNodT3mOJKH8RdA*=H z(cI?kl$Df+`$m6s%& z(3GqiMx&V(&0m00XVmnwit=);cDarU=OVj8nfpnYM)|~j8XK|_v3%u{6_^>-UwI-Q zPw7QHzqPbf>FChvW)OXHGc4B;>}L<@)u?We@l4qy$7L? z5C2HW7VLk#`}7~bwElMyP1!H~BcdgqhQm%aXmTMh4zMgqb;x0m#PaOB$_Sw%<<7i} z#Ouk11+$nl!+{`@hCR?Xs$qQ2&{FLLlBwSKOqba$(%AoOUM2bqGhv7x*K4bly36#C zfkS?aRhiW(pSUi_QN@<^&tC%;_b;-0(tQ;k1(Vf71EMXzgZuKbC4}qSFsE{N?AD8D zARJMM;`DAzINL8K42Q*gsc~RJ at juj-xZ!$Xop~JazC>Zm#PKQ(Wg$m2iEy(9c(Ciy zZ)PM`?+YLYE!Z$TKIR&?XG0YyOWDJKa>qlZ5O%v!xl>(y|}{;UP^m~@B`sMT73FqYu;iqZk4wW8~?m2Q?L z>wjTZe)$e9V$!5H$QZ(lTjQovdAKUnv!_rSWj2)!Nd_wRP%kA-i9uR# zgRF#jHk8b52?#ODWmH3%j8wM7*ZeK=0kr!F*dl^=9-E;KfHt&~L}D^F-|t!7G$$bY zQQh*=`t$a9Y6zq^W at -Io!W=9>=hQqM-vx7{F9brH^PN$w9w!5{!ZL0oJ>U&Nlg1LF zzi&kvDsLdTKTRX43*(Nqg&E;XoDbugPH-OYHuI;ZvbEtyN at I&V at Tpa~#dXz%Y`|TE zI at z;2JFky+iQ#-DX7ntk->Sld&_;c;HcO at WZoaiS%Ai8J#!S=IB~f&A4mWKd16^=yA$G2 zdedLrs2*!N@`chQzDxiPc~{F%BMt!2+~~`PVzrGiGyA at lv+m^eAXRS+U6W+*WQm5oRd(();HLWzRFltU=C4)zly1 at nJJpm=b zAkNd3skANr`4$M>am3m9_5jpz?E+_aB)bFr9m&buv6z=9oDprAR}glTys$I2JuXEH z%WtB_%_fv4au|N%7jF@=@$sz!-)?N6fy+@%CNC9v*91o;yvdQx$(;{GlTs=%CA^fc z6jfDD?t5`I)W_~|9kb0{OBEQne*nb5K3xB+g7#>v6uti$fIxuuI}v~ zZLfk3OV=hQ*)z0P5YG71|N2cUUW23>6Xc&kf&a%Q_1}{6zf4ML^Pfo}@n&)`O6X)1 z6(8$Dg`9vmM7Rr(Rwx6sDQFGW$(K;QkER9Is)$V}AdG3I{Pz_f|gdwf9aBDZmw+LFc4TOW^-mv3WYI=ODn*9^u&Vz}8d;Y?Q%L{}J~LUQWH z at W6XaoHl={ve&h*D%eKe*{r$^@`hwfCIngL3SNTQfe&h~J`Y!#vmiB$LgE7?8S7?? zD^C*hO28Pa_ at 0G5{vg4O4+=10LiW%bj~*V@=N*SaM`Svo7I{1M?3|A`og{);U+)-H zuG(F*qHD0~bs at SaV=>($52_Y#@SfbZp#|5NbstgmCLyu89U*w*izYf^QTw8bETGS7)8CxmBEu(}?}0c% zJg76u4}yZG+G~gf=6me8GO9x>p2!t6brIm9558l07U-7s4EG>({0y@%zyoIE1zDWQ z<3^YK!2T)gdD_I!OraDXMb!TM52|otjx#zOmwJ94wg4i(OkjtALSWaa_&j9Q(nW5c zfo*HdU}@8$OY at rW?MXWQ#R?M$MF~hlrrfTN8?) zEl at YgXj0ca7*J0nrgaglR|c$4CpAV{(v}{zCus}jqGL2lRVTG3NU9Y}RTe*@TF at S6 z$>qXQeh7Kc#l&9diR8K{+cSE1C27mmvqdy-%7ym)L+!?gnF8J%PXT2!Y3zNa-aZv=`A!=($S7O2jHXggc+tJ&}6n6i|DkdZxkP zs}zw$I8TAAiL1z-a|BbIJ+gTB90W`jo1vZ;5%XRKY*YHbdd!eLOXQ&K~LJe`p=Pc>(X)un1DON(Z2T_iottry&B=^H at 3#>h4-`Uq=Z7N#Bz8w at 9h? z$|rW}?@nUxqku%kWa6(}*qp+<+=wT7z`^N+Vd)bD$R7-D7!tgbG`16U7|{y1VOC})>3g8OFIkbrKy>@M|q zldAE|QOga?B9eUd5WLaGF`S#IV~#pW9j#1yT)x)T)k`JgVE;%Z3=4`t9!3^f?_j$? z`XksTBC8~HJ+W4LKS~AmNY#%|yzF0ko>HW!(p8mXbP&Q(*!}SFLl4eMZ2qFX~IOwDGv>}CUu+m^l8FqCIC~YU{8z<;k0%V zM)y=!W~h?6Em6ax1JjdrynH?^-ea+^=(yGO5cMEA0-)^N#n9W0&XXYAeh-(WJ_EeL~!O2xoi}_^Otg zVuSsKkdqbkAobp=_U4-Uc9ZRjj*?{fOI4Pp8gpy&cn1lA{H2rHz6O`-$bY at xnky{1 z4X1>zyf{<}5Dh!?Xjf-||)32N&@lconrA>G at guY7i%gXnr% z^f3W~HcDD`oed368Jsv4ZP7$cHZ~774=(#vwof)TZB47a#pUP;8974Dn%RGK zbdTN|o>N~ph`AzUSneINOGqNp_LPfQxD at c9P3;5fUo5tFXgl5uhiF9?8`6qwk zAxXaBzu9cZ+RKZMNyyuHU^}&v(#*&zxmM6Xp>f)v+sXf|kfpmPdTr4hR2p7ZC|_o{ zABVkevMGuUCWgz>)cUEYK{}t at K2+ZZzn^t_Is^zY z_nE^Jn3Ez0QY35RH6&g(BcJR3#ULjsVVc14a(lX+8ly{Avz-Z{QsBG at O%=+*G2T?wSl4E(R7{(xnjMLIP==Yd4#B^~WY+skIFNTDqIBUEQ04|t#zt29!QxT{pECvVzK7QH{6z8LO2NLxCA?U`c4c8@ zdI3EXhmi&`x|W?h)Rf2j!H`*IE&r1E<*-cHxQ>{apQGV7mtM_AK>kY|VLDNQg5^2! zc7!NQ at T9qnJ3P~2Us&EX2YNUZ2MPJ-P@&+enySe4qUxKOsH45y2P`_9?}4mtv*Qpv^T z<4RY1W*h0v4AUl}T4SftuOh&KFAF2XW{tRLhv zy>7X_;4(ApDQ$H4?DS0#M+Ou~QYOB4f(B0DgGCMIj$!o)-^Acsj$470R7d>tHeCPC zQ3c`NT#HVh!$5FFRlgY)5yX(&TcmQEuX2r8?zcA3fUBalHxp{Dv>9;PuD#8rsw+!h z*Ns(ZsST#E>BS-qTW)w{?K1}3&LJH%ASDy2g at xs0`>(s`=s-NJo1T3R#DQ%s3|)rW zCr58 at cmJwrUfN8w@5AV}FFGHV(OIL6E|vY@;@4^B==gHpo%mb2zf%(gDw6$;1PjxA ze1KU`*wY~)lvy=Gwo%N*^@!Cz!b z**tu-FFrRb!e zWz9DtCRy}T8KSE;B#s8e=!Nk6-6Z$owd!T5fv;TdQXAQX>j|_iG7dS~P@&+PZ&6kG zK$F`PW!4M at oav|=XbWzUr8Pn0pi at xA?gUFTp~~P2d^P>mo7rfga{yh*>EMT$upyYbMAZppq3@ zcog}>Oi0!_D|jLd3n|$&@e3Oa;4Y(!*PtSj8*a<3S#Sy`4v(0UqfLq{v}HX^lGt+$ zk5Mc0*4!gx;%HRZ;#H^~L{xG}{U13wSI)uq4ZvELZU81rPOtyz`9qR4^gp6f}sf6-Mx6La?cs;FPICdUKsO#`EbswFmL}3}}W%nK-R! zTQbU-JeunxHU?662I!PeJTL7>Uy-Zi(6duMfFxh*e<-_RZPqmSHpo)?ed_52+ zZ_}_>TuEI`j*Tx(Q^@vqsVAq_)lJ}=A(lC!$R>6r at l9Xxspy6ftVrSgSN6K%1L)>Y z&@xS^y(tQR6jdhTn9w+jCJZsG-L?y<3;zT>bmvteJF9e~Y={HZE_ z#u5jkwFtn8nH)Sf7=}_n5qi*g!W;tIH;y0F3Fr(=fX~-=3r~|!`Nnmytap}0b@>b^ zoM2DDPa%uT=aq(*ZT^NK^*@k#fH&tn%0zoZSLsQ%exP`;q2>;T at dxP^OU_cvAl|K+ zaEm+k0PIZWT|{+rs(g1TmrZ=k*@|O5_^43FtuCI*syvLj&7az;V24=JpylZ{yjA)4 zx1s)-*Ly<#d!w)})I!;;`W~o%MBJDqR6=p`=A9i_u at m$$7h? z*h!rhEi4n>?m=qkR#U>cFZ-BYL-zQXG0>v at oj`tDQr6TYlr7#~CvN^Tnwv2l>wC%{ zW at odWY0knoEL!j$mE^&1FI|q=Ftm$RWQqy#i9p1P#_}ag)Euwz6GOyGp5b#EH*rKB zp-3${_KC^aoXqy}hxZ(0j0RiQ7Tfor^Ixt((@OtQ76J%|DV*HyjJ&Snza^p+qm$t at XLxy*)2h zNjJrmBbdVsb+gv!gP0vp?oq9Wsb}g_S8FgI(Z>F<&O@<(@AXEA`8#K}lxbL7)`++4 zUc$`CNyquT at ukQ2*|3&LijDDQ z8NG|ol5q zPy8BY*kc$hqi4H2WrBQ?Q4>Sw5V!;U6q)8grvXGu4k2D_tjxS?!8#0t2tJ-@?z|_I z&xY;2m4J7%vg&HJxh*Lflb-C5N`df`aWDDMG8!}HQYyL4c9Ofk$xL|nJ7L-j+m{;B z%#D8MtKd+WzwkBmTj%_%^+PZX&YK+!^S~3RApM`q=g)x&)s8gPKb4sYqEdrq`=0hP znzD#rpw~Y4ngYiZQe)aoWFxg;DG^$(e?DpPK at 4w*eZY5}MJ3I+tQvcAu}$X{x2g^y z2tJ%3y)vJT92;!C7Wr9jE{JR5eCXNkD!|uo+1V2ASE)-dpw>a16wsti}H%X>30gXCy?#(?^!+^MyaMq z5ym$c4`KD6BNqHS7;FVpugrweNlq05YB%KK`i`Z9L>8&iv^j3I!$-cjr3b?k%-aF){ysta<@iqQr zKs*UiiK&eS2|G6+Ri4>0lv7QxVw~5~zS_;6=>&g22)x2-)FWsX$WfweXyq{LF~YQj5j1GGqr1ya4>Gg!eE9#avpS!#j>`02ZO*(%l7+G*Y8do`VJk*_sk66qsJ32=!W^z8;SwQpF1mpJz+wl;=qdtlOp9O~K#x~PKIa10-L0XV zx>_(CMSidFOV6%Xky0P`A_I}x?QZo9_A%hP2!z6%1Hweu-K%o|S5k(_8J}2mW+#05qJz3?^9y_yt5StCf z>g?Ha{Wl!mnk^f_Auii$oR|71rS- z&=Fal0K`d`t}9qk!-G#;qm5Yq4kUskrT1PDLp7o{YRO-JNdr*=W5u#(|IC3ZzOfR9 zQbb3psmnkw7})o`I3YO#I4T-Xm=N5Md_>_51xhZc8Wj1i6DYXLzURD at IC_yWdflfej7!-tsXXhmABy7uHoA1_Upgh{+#Bg_xV2 zwS`{o8>W>lr|XP^4nSJ>mf(L_-Ey{f+9NA&+Hsn)*;33}ZOU5+c%CiOJ4t6(b|6tE z8DIx1n4+Eri}=#Cv&?QQT#q;(uCj+A`|20_t(PTp5<-`jdB8VmAmzR^ZcX9iXBuxW zTs=xT0iO#NbnTkcN{pOu>7Wdpa@)zb8;t}D57~4CwZR%D9+EwaJUc#V3k^ypkaFIS zgwhF>*&ed7LlEr at E&{L=E$)xd-;jWm!@pQ%L$`Jc%R7O;-3fT^fTR5Q`#4 at n zl>0*&K)>N!?l8=QdI#F?*wsM^{4u_PH}{R&5cvGL_ffs#fq7;~IcAJsAsYK>$`or0 zC3}XM_Vmh{O64uG%gQu<<1EvsW)D8Bb0|+qlqD&x%d=&pw09}vIYMd2HIBV_vlV(%x=gZ%lGR;FN|>I#iJHox1*qL z3f7H>MwL6*BP+cksdQH$WV>Nc&U4$aL$U7*lubnkH6ji+g(k at 7*cM#j3#{A7zhEV$ z8bK$=OUmrVX6zy|zmVnYS{3AQ`~9gA^bRBwepr0jN({Q&Ld9AzklDHFsMZo$Q``@s zru7KA*4m0c?Fm^^ok=A6X5Fxfbtk5sd|Ge?k?__=O4Y4y&*4Ejri;z4zrPWz9EbZr zk4YG})8sJEXt(z$k!;i$Vn2dFxxcdsxiL+%eA!gM{)9E9(n(sH at -W@$4$T~mVBP&p ztHCK-g at Wo5;`1>8?Tg{(-d&WYLy&s$5|An!r88V};(YFr4@(hkxLTLJwxWLG{^cV2 zrBm?DYR$f~knTX+i69Jbv`Qju3)MJVH%mM;Yhcu at 1M2SFw#=4r)xd)T89j$VUcg6?6=5q|at05-gzwrZaBaX&_(O)@ z8OTi}J9hADL;i^m%HOhzC6dWnp8P)+gRH>#}5m-7$c6g$$Aw%@VuFX=c%sX$`UtQPS zzRk$$GMyN{-o_xh=Rrl3A?b<&YmqRWvche0(PPXz$Du1~h3td8hqvFSn0by*>8SEI zVw8|;ph8PR0WNJi2kKBzH(?oib!-Kawa{Yu{)KaK4MH!39YdzL!4NS69Jq)MoCVt@ zbbS9JRse5hJXiBnLH3CJr}S1#ZUqfF8Foe`2WEHXZ_p^Zr72Qo4KA?xdklsbC{JbQ z75^!c1vQcRL`Wcq-%8oqvn$nmqj4rMJ86?HN}k99_MTEPNQzHsa} zRP1QJ#5;>Ci7Q<9C{-5Ii>wJ(9FzK)+=GYQnDa6`0E at RdiE;hJrMY9wfQJmoFK~x2 zXJ%J8>j?)`KNNF{9Jc%kgD>1D`)&_ys<)zI5B$S*dBkL_mkdSvA&o_6vJmvFq}AR)dFcmeu&e>{V{N> z3|&8Du5clD3`zUDC2lFi!Hz+DhZcbP{}$0 z78NE0?`Y~N=0LuNhUwdLoZOy#{RORb#hgLF`N#dx#KC)B1wyc9(E zRg at l`opx>;sE_M?3(uE%iS at i>?~@62{Yb1%kG+xp8E}b8P(UW6h9)oE@`-SL3y>ru zub@>B)rMhOHLX8D6Xo|xh5=d0>}pD&8aKv9lWHI*9p*4%ku}3~*uLM;ki^_bPb7K5 zXGr90c(Zi^a;|>3uIdnCuCC!ON}_wJ{tP8wxP^;X*D=S=R)V8hhpcPdY<+ffk=D|viLQFHot-x%P?-^dQ~j4__JnHyy4Zy zm5IM|&l>td{!K{XT>Rd+`K1gu-l^Yp-XcjalOe69p zuNTFJTB(srfSw?YvI;Qn=Z5YP)0<{6!~?XK5X_0 at fxxjy1c3EM#JsjE#g%W7i=ssZVo>-EckN;sFgK)i*v!! z`I~xzKq;)NKGUYY9L>^QJk34lo z43yYw%BPVKWtmjA4LTOZPKAzI;TAo_!X_O3t{1Gb1wPotCY*fTPH1%VR)IoSnkMts z{@@M#nE*5>H=Yg41bA at Ke(@O)NV-3Z^Qu2VnaON{f;LyBS2jJQ9_zDh+UxpwADpe{ z7Ii6K0bh#lmBx3 at 9iH$Vo#GLk%`OnldJa^@DYuyTSGDo+y at DwZ<4Lka#m-aZ?CO6| z*_PM9_3-dR_b!DZe(5DM#R_ at 35HrUoXOd|jjVNv%E at 53d^gwZr*~Mm0w2Ifg6LN60 zewf>~Fj?FCrjOQ4&ahp9I?s7Vt-0Zho1sA_xk6Fj+6+2XZ%!?)zLryQ_1<=`H63q&D%n zYj|SoF23)>UsHOO;RW_uj;2 at e4mviOY1F^q(hSyN3nPz%wwuofu$+tg)rM+ThvAqF$L4Q#Fn(R+hd%+q_uio`GDtO`9V z^qac;+fD at m)0WQtA<}HgUootET*AaXz}HzZPPP6{7%zE+n^t+7!Npu9ZgA3_ug%Kc z4%UhUD&RY-+ at gB0b+saq!WZ{^9|C$mMu#(F?q1j_^g{8u`(YTP_+Gu}C_%l8lbQe!`jb%@Kb$yWR% z#{*;8m<}Ebx zwue^pG(GW5&FuuLU&uS6?D8jHL7lODp{h4x^^;$W+AuF&^|x&{==UYB)$9{r5O^xO zVPh?B`wgz$%J^;vH#Z>fYF<2*3;74cHbSE;d=1#H?S9LAa6g(8)KhKru6bP>2`4|y z(Y*1hg<9G}&F4l>t}k98Vroqp`3|j7K9z$1p;wk!c1yXWe3c z-7>xJT0Q;zQp*eu*^saOVfX_W6?g(zNfc~+>IJAh%DvF<)4|;c?PTr=b>Qhc(d^k5 z&K|gWOJY16y0`vXqkyQe86zX+o&rIexE}Lqt0lOR0}Iu2LkO4 at wtpkHAB6j_wGP?` zkAu5K1wGXB#8jXCLi*nHF62UZKeogRwy-6fKc{0nV9bXU`(AkiELL(dXtxc1ct#oo z;2*;9J2;W&OJWE`#Ff-vgfd_D3nvfvzfKD z{+BQ_bV^2vV?gZ*ZLr^|%$K!il}jHnh&;|A^&3Z%OJys@?~M0$s<{#aAgx&1H?mJ( z_Nd?IfYWa0AGW^k?i%gu$R`t at L6qH@cr={FwG*$$eSjP4Yo{FLT=~5W2=Mki8e;lM z%=sD-a{kzq;^<@-zR40tY8_k1eit2ec$xKh&-w^tX2joSneLYBp8!e%d!OaQvS`F+ zqQz!p{H6aYkGZG?j`G5bc9ag9|Ak9CtO*9cS+85-gnxr+h&=AkydMH? zUtgsE8zp4``+c3uoB@*SbzT^vW at z=U5E4V$kLKTrt7b9vz7P^kbP&&L_Ckc at 8)g#UwFg&0Fw;^|L{Wx$9+#>JlNy?ogXJU{J(X9{a}f)Sd3AEy8W~Z(!22) za~ES1xtKzD0=1zFgEf~;dbmida&$3tvaxiTiJTJ zG-;Fvu_NukXEf|yp|!BRD!>yDZR>c>JCcAxvxyD!#x`{P1|H&jKQ5T~jwq#qA*D8c z-pSSho9=jzdJOKft0&1SE4?;yCE)>%CN=gIHY)mhk7gMIW!($<;zD$3*|y2iU(S0i zp0E~NF at Ns@!GT&{`5T1t(CB5=nZurP9w at Z`JSGp!S_pd0I>C<^R5P9k7!U%Mh6t^! zfX+OOmEiDRAp9gQ40f1OOSCYBS2yymbYeC+jkz16yAP|ERXxh24645P+@!ALuxFp3hI%T9jN*T9P z76X=vz)<kx;aK8cok$hFKJG;xOsrs; zz``LFGPcNL8v!3sF^BPi%*PVuNP^u%1-P?7ht+>hH?W4)SIq+n*4ANYIUa;z4Jm*) zzzO0?fH`0a@}z?ewFz=C#;{@$PV`YF<0Nzkt%74_f{uRd4=K36OQ^e{_B at dCIDyC> z;6JTX7~DX+BN*vwZW%R-tRAcZ$8(d}Z!W(2~@Io1E zW%vXR;TIv~AGjM8zoo$ZMjdQr{KQ(&3E7`z`~(l_9s1NWctr^59l2x2?1|jBtN-MM z^9|kq!1VFkzh(RcP5JpX$ZzmU6yiH_N00f9Hu)2>zsvabE99r|?uX%%BIIY_&gl0K z*q{;{#YXaB)HEIlBx4e;EV+^S;9N|;QBNWjCf6yqK~__Uj9XDZ-+81pbVz5B&x=-( zTl*3{9)SObG?$cur!;iIuw1bwLyPi_A&a^7|MN=hr(tzU9taQ+HUtn5{eL_jrexy$ z|J-PePLi@)6hIpN(JFO0z{bYV#HX!IXz>u(Qrs!0&KFuP`^DQt9gu0HT23=slOjh7TD-fUx5>5iihib^?vfV{mHP+eK*x37X6_w5J>-z~(7p4e<4TCM}AO%ne z3;>63t)~p-c2rLo)ZyGxa?l$F4f$1n$-)E+mmYDwI-PO5s%@K~@t1e8hDmW2nicb)>-6fKjjh#2#FgQ06F#y4vb<$J5%5VOV09NKxMZNK(XZ( zdh-5k0%hGO%*un+sj*|!Mj?S{DwXVNvtR?f>xKa7&zfsHT2uT|=y{BGjxr8$oweX! zE(x*ChfM$JRovF?sxml$hh%6BGuMov?yzu(VHbH)p<}db6{)H8D4O=N1N^EB&p=d+ z2G0s(s7HwQ6 at rotgl@RO$q$_5MbU_eQ5uf&i4O)kVK0MU at nQp|arx6+a$g*|6}<2h zXp`4IxB54fu%1P6U!Fsdq5hRombK2t5Lc)~2EDTfog^RKK2toYQ})ax?-xZ<>YJUu zn7G$@egs0rj at YvB1uCy_8acr-|I{nhG!r at 1cqr!gmawf$T%z}paS}bN6N5uh>MI-h zJ%p*yfvNg(5-B=D{tNMLb9~~cAd#Xbdwl+vk~?+4tmqvE(H7MH_^v!kZk+rdz>ZrO zW_;K at g`o)XlV~XMs at lgB4Q%=Q_DgFcc zKVkn`v4?Q|2YWR5e+>J753)J^FW57STnx3vVc=s^#5R*ofE^?~aFJDn{40L_qdfww zHM)MG8n at FCx9EYE!+!rC at L{0hbCQJjz_0RQ8lw`AWo2j{Zl*82z3JJ_kEge at yFe>< zl>T6j)XGO_TMEAb3IN~^TuDdu#6e#0OPCvGX;06BL at Gw(i;%??t(e6I>FlW%qe}?( z7wPUB%&iK^M(Ov6y5QFSx(xV6qE-Dcm25Tg!QhU%>CdX-H4X?yp%*#>+NrFC!B9h)Tf2vBWp_mWB8 zQL=xa at 1EAS?>q+;uLf{fAafU(IMrS%ro1Tu(4fgosz`R?C^M#)F;V9|Hu&xkyno1w znQ%7`2TDk0O+1kzH)*{)+wHJ*H6+tWv^eUA7);d3-Mo>TeLc#8MyF#=9S1A9QUIF! zYhQ*-c%_%vCna^CmDnu#lEr8+kg+Bt0V8t95>t*tUBmA))F^ zas4pDbWhJrzdvvF;iSw8%j$e`y(uN1?#rI=>Wvk1(yJ`~lxfPVjcteo`S at kfe*#Ss zkUT_pQ6}^x0GGFl$5%^aiZ`Yea`Ga#|9)!=s1!+`}6R9<@ zhMctC9?S&yZCflnw<1#Q6VX%;o=8>||9PI~)KiZ=#Nw zja#PsCOM0YpZ>xMfy_#=UK4_U0 at u)xgcfqto=tbu7VV3zdM!z?FUYKT7izd9nSz#b zG9<`TaB5EzKZJvs+x5o1Bx?hY)9FmM(`>pY??a<60WYvUz8)z<42?w5T~C0Ogt)qL zoiiAtSK5$@S5n at 7hq_PJ5R)yGo&+3?;j0K-CCmg2p9$vkje2!E$e{MHbH<--hYR?c z#C2!uZI&r+?OKkKd3AKt_yY{u&4(1s8PgEXxN4 at c$(hwGgD%5$ufpvr2e-*G)-k6k z#479>vXy)#^dQUwvP~y9_V&@d6r0S>N%+F$gC=Hvk)8G#3qzjuTobp>#PbCtfk-W@ z;c808(Z=@!S;HO8kFGu9`^v(mJo5|vi?+H1v}G~bj500jNZ>q_*s zp9cl4H)ZbmT8_bbkvB1l2s>P7&2H89af#ZL&u|~ELnf$Jli(Xg0n=R06Fh~gb*KS# zf-oILgVa#q#LYuVBgw>KLre1!FdVf9yxRI>Ke0DO8zQ>Dgx{YjNsD3`(8_1J zSrryhvSlyrAj;|TW<{RmmEA2z&6_;VH(LM at tupvu;!9EJtDXfSqlyI;9Jo|Rcfiyf zw^ckp23UkB%g at fIhfg3Nzmt)91yh9dD#*`t$2I$*y#0*nerVKf2}u50kQpS5C`9S$UFg`;QBzr at es8%lcyL0>bLH0?4}^Y&X at m&?5w#_<&Wu3F>} zUK+6nH;cco&GY;HM!Jy>i21#q$|jYwR}_anbV|h+#wDikWb0<~Ek4gQ9c-Qs$#EVD z$8xsr1aV-nOVLX at q5OunAj9=ClujEV&V-V8aj72b~l9KqD;D4%wEygyX>pz9C#{dEn z{LfTE#=zFaz*@<~(Zaym;*Wu|g`KUuqn-Qz9l0G=5BEe_{q<8#ukmtl_||to?yo<| z79k7=i~~txO{_IG^e|5j?@UYo63}F&N>gXC7!*VrSH#Y{z-F-#GDky}FFw~K^QXk( zPwtPCTj=&#j(a4|pD^@81JPo||C}p8h=v zh*M0S;XMn8Sq6^TJ&-^%ES}Ll4+w%<0SZ0^|LoVIR8ctw_k?~<2suXgjDBXg8RoXW zJq?Iil|7|b7OOj~9KPATMl_c0u{|faeG0AeMPuKDpb3-3wV4rS&ASIfLs_j8C*3ZRW-!=^7>_sB7s0I?!t7- zTSh6?QJHB)k_g*5S)9ka?)tP0X)b~;XcJfM<&qLw=$u6!c^T+TSZq at sDWL@|)q-<; ztSfA+NlR?zC-n)^&f$}R3o2GwJ~)Xow&ftfj?m_!;)~yH42%22MMKV^S{pa63q{)s z#ZwE06zWSOLLmh8&}l5Tl!?+E&3UBUA_Ht#v}-pZGbfrl}ZuCbhWZOn#4P< zRuMc-sV-I>rq6Q;rWn6=mYK-&NzJ7b(3cHl)JV#Qf-GYwQ5*)KGVP`FnZ=zTH4J5} zP5b`Sv0uornpPzBTSt6R(b}3#otzA$^W-MPM3@=+%5wGuk`8G#@H%sKHW=1CTd5LE~gJie&7^1wExF4gV at 3wMId==m=_VB_s~Fw+)OE0UPHBI}BHqd{$EjioIonDZ6l zp~*TSvRHw)O&BMq73me;aqDs7{7`1(DGyJ$0gC$N&KCzc4YW_&GD7wZEH%t2s8 z5CT!ZH3}&Z7$OjAGE855#DIsAB;psAMbx-ECU#&HTQnLiT5rO7OeX;Z`|%HICED98Q&aV-5}k{#wxX|=PcyR^g4w| z2QSw*N##gxLOA|R+>UgOB7ZO$+oMXnP~ISS3Z?xoCofU62sPtRl(hxEeRs=(2F~(K z+&CgSoc8Hh`^hDZy39C^>>tb-nuX#QGO*0K at a(ucSQYiakGjkePaxEMSXOO4bL~O0 zk(=^~xxaiLp8V5 at J1nIeMvK8&K7HrqP{(Ho^H~@1(WMDVgNTb+6^YTM#7Tp(hYmF; z?Qg<&@;?lGB8Ot;&i-eSWw%eQy28Jj4K2x*B+HW(9_49DPl{Cqs}nM$ZI)e>y9Hq* z9fI`1najT at ZqSZ7Bp*k9D|um}y!>cz{Td{t%BOpG{r%U5x^$0)mAXdbxk%$cPxzJO z`?Bn%wM602PO5NaHz(xoLvo?)kv*kE;nwb{XnxP`sbv1_uS!Y%#x7y${L$ZP$-&dV zD%*V-Qe{snI>Q at k`|)&zOKQm at T)nki(a*3SYr-)>WrE>l!D>*-;ap4Me_lmE*&;-( z(JJSuGvhWX4;9q)X4bZGIH~;?Ph9dPGGLScpJ5M9=MhmCB573SL6yTC0{f*le*}5cuwQMXlv7>i%RqMAa1NqE>QkL?92H-_rbqw z7z1DKCy$PCHC^X6)19}u*WWteKn|;GPq#XA10}3S*y`bJ3b3*ZzqHKHYdk;H2vSo>ZycgW{9ANT&OpgWsg=8(XSKnhrkODTB^q(ZMtQyIhA)(&6GG*<;v0q;J5f>X-!21OLEW)1K*`W=v zrjMLH=AGp^^FH%_*&h0STf6lGXpad(26NyGQAt*kZ(!vg@`S{4$5+EEyT at idsV51u z;kX(vDBM>9&7*KH-$xiaNv(IWRSw=+q;V>19`3(kf<~ojIupdH!c=d}GIH@(F zfe>2mAVMdd%3K*=p{cSB$ELwb%~)!0rE at fiT61pFP0r#T>QB{W>p0ppX5LFuFz{mO z)0v=)cWBJd>TK$#PvIF;J_?Ov)iDT1tHBh|p}Z_rcf(RKuzRc&NQ^F1KS*Y|1~%B< zSkrf$aOktVIQE)vwH8K{ir32xk7#WhKBV8Imql87)geo-Hn zIVY&sA&+lEJojh6T!v?DN+tOHK~k}Gza{2(z&v&+*2V*%-=tG#%A*KL(*>s%>;*IT zb-FF1HlJ98Kt*S#0 at AaG$$5yw+!|4mqg*5?-s-+755TOOBr!zAiI5C4Nfr%g9 at T4L zK^-l5&xCc^fOA>+a$Y!*MzVsKaBkoj^p}RF3{sqO$g$5 at v3Ltvp(tEXYgDMf$$G4s zV=zrr5Ij+13v|%unPg1prFad?F7cQ{WYDB1`6SGcdT=|vl!64}q{8}uMIAyjifSNR z7MMffy5SsZjZf$SIb(%zA}(FC_|)VkGR>5`B%L8S*2Gf_i*4t2xaSrhit4R%rZS;1 z56_1!zd_AQ&RFwXR_G1uW3C8GeTg9Ocvhq{tz at 2-PY&r^Sb~E;ilHqxHa$CbFYa at ndwqZA zO#Ii*y-eU4-q|~ZkI-q4Aj`=Xe~Ce>-RDrNZ1UY+*A?WMR@!Llm8}S68ZncZnfif# zB&hnh2aF~so8l5BY>Y%TJi0*ApZ%@yK;}P9MC6c{j3|o{F<}T33R~WDpb+g;PuNq(zr4LXWz`z4Lxu?j> z5 at JFSKFpm;q&^l#AsDqygzD0HBq{Jfs*5X;Pi*Yv58nx)OC~BOENq#Jhuv9pN3_W< z#KT&|o7pX8fW$0)%JPqQHJ9chz&oOL_91P4&drngFXwe0bIwDo{{~X;|Ih)1QV$>h z157#6rQ;;yB8c}5*P-|e7Qk%|pwx(6>u?W0?3JpGgfY+SOYG=&wu-6aawh z-zBxbw*Q%~{pW-K(rVNBn}`CBkkndg%4*>V9Y}$pR=t$SQ$T21Dd}h-Y5Y6)j%;hx zl13w*@OM;%p8!(C!Y at C6zDaj8Edu_QQn)6kv)OE?+YB$W{}{5x4M_uOKTgjX*-CL8a?C_+Z^_k>Zg zif$=bH}u^!GQ;$uq8&5w*6uoz>|2g0?kIn_2KUyypx at GKW_;A@!e)z8X8=OYl8BY7 z6UqlY4v&WTj*%2pSxgia571SmfCmz(#yod8;9c8wdan${yOG8;55jAtAA4wEh1Qe; z0w{$%=UkBCi1HA#@kaXgNR_|pD#j#W-z$AFWcG1zoadsvwYc3(v?G;TRABJslr|Qj zv`?-g>(5+d)Ys_~Mpcl&YSYt2X8MhgvfKq{SQQM=RlkJ-1872LAb{wnb0YY93 at d|) z1Vc~5qj1)`h%Pl3X?pJDh+UvcNHJ>DL>;N))WS&K6N=Br7*nP$fB=}4SenB|sT-g8 z9gTa6T>?+7O|C(z8+`*SCe?^}ll}@!pJWyUj`{HAS}SYq z_U0wSCY5{je`6&==h52xMsq*~DGABi?2O`U@)^xRZ`>}5Cz=7i7-B>w#US7eJ-QZro%2Gdi6LAp$MI0RSG+0021t-_ZGYY^rT}ZL1>uQ0(el z*QT)Rk~thQ+aP9->TYe2+AQjKfsIL2TuKREt+NpLcdM>RHZKxdAaU_S*>oVAPqk=k z+Jb84(-4!iNa-vNzT7LGk3n%i0CD#d{Q%GtRYaZ*$#G^fnVqurWiXvxZTQ-i$7 at K`q0MA9YGP|$`M7-H5^ZUx(DLPJseT^dWYcY zos6vsdlSW&a%UFC**%51`KS)R2z&Fz78xweJ9*?z#=L9#04X9_ z3Zz{(N=S7QQD5X?Uu0$f#>y|rq8U*(v5{n;S(%@M#zVv3rqe%)FVJeO-co8*RXw!- z0RfEgRZ+VJ1kAy4!QtSIO;NFtW%%GM0~rpD<_KJ6uKYde-oaj#p7c;Hniw5qAxR4U zbPZwj+--@#Xl5(DI>n2#SYJzZ8c(W~Du@|I6ugPsD##GkM9T`;CKe^o-zu3ORpK_V z+k^`Z_9>sZ1@>R)NncIyZ%Ol1+LUvOTf!D7kxcS&a%|-kwkG__dlz_yLrN z^YojT56Cr}_Oew|xl~!Iq!44-Whm8V(^h$i3kM2{V*~AUbSiUnWTX^4#~+D>zaz1+ z#uB+amoAI+pp3q!goS}k_jrc;cgb~YR{H*MZRNt=$q9vzAwgYox4$R*jX0E!BdcO~ zQ0A$bK0f+YeNDP9Hw&YcIVNZ-7A@)&t5wVd2_t&ZG<+;g%QU!o6#*$Xkt}{ui?>&k z0s_dht5AhB;B{SAPb6WHW;EB^0g$1gB2Fzyu0$2*OodaU%#xPX3OR*McY$y)qr at Syke!Gp?1VO;*~a6r40jp`h0C7V)W2ph^_u ztpZ%MOa-V?nNZH-`MLdD^=-950~%ATC*9X?<(g7AH=4km0A+@{O2%K(6E=Qk&Wn?J z@~7ZzB(1W(vee{njJFPcO-_!-iV{V< zQLiDvXaZ at aLznGf&3MQFt{;iP2;I~N%%sHJ{(6$HD6vwn zI4>gl^CWX}G+P`dm{7_ATbD8oQElgo&9R^JILz9iK&~~KVagvZkn;Sj at 1iAEek~8x z))X9^#1Y#ZD_oW&VcQNvr&vM$7w>B&D>p-IT at vzBcoid+q|znk z+Qghk+XLlZq%1;o((Jz$d&RwiI_(9ROe++Dx`c*r!)GRYwfkB^pEXUyY?c3T2M|NX zDX8q~@R3xh8%!qcQjA)(Qu>q7=+J6Bf~`nIcD_g?b&xW|gdI1Q+zsFn+d1ws(|YLG zdx_0JxVH02{$bAyTg65En%>t at Tx`8e;$z#<26p0}HXITyxiJTJVpJ?jedq?*9PZt`ACVtTA3otA+q=Fl{^ zURZ`icE!{*ajCaysl}83QRt3_aTXvO=S^oCzDyX^gGezG9Voi_Qx5ApH1nYlGbH2u zd6(T2hJHrtZ1UiBY4PCUEM!Co8BgR`1H at qGU*+d=M0*WgKP{UK0u_7q03y-Us z`1XKlf%|IQvKGLqEIrtiNi75#-ta)Nnfx%OS=6DFmoWbh_mqxyvsoCwTw}^vFaA9O ziNKkoiXYUa-4FbJ z3Z+|i{g+3oCCJ-iD at rFOUKU}z1{FfF6F(j2X_^)Qo}Ti8o|=g3z3$tV9jc?F9n=!}wK z1JLlcr&8MgZIyqt9VPP-SHeYu2zAy<5BK{OF8J2P at ZR+B0~0&<3Aer~=@?3OiP;tLWIMVfSMp4>|4ARf zTUujD?8_AY`j?skBjSy6I4}T!Da5}$bo4*Ae=i*TV+5nB<+P*<{|(EaN{vh_Ax=Oe z;jeuaEWABALrRklKpLB6p*VM305>*SK@?vSO-pje_loBnN&!7h&;6LBA9|5%q;^Ei z7`|?Fy>QdkwRf{Y^mdfib_=L2C^H7Ly=*TP7HbI0k?g!ZTG;(rc%X)Zd1Fa#)m~;0 zao~>coyFyH at T>LgTcKmDAD00-nTHL$18cPdDPqXn4_&C$xXZPDTz*Q8rp|@5VZw!Q11*Tj5$bUjxaRa zebGlO1ETH9{~)+=g1mK0837|Y@)EM|>JA?sq+>NH;6X(;>0=NXqgk{IB=o|$M9~df z1#U>WvJpenb?w>uQG6W&wr}>{14y=LVhD`}I^Z zt$+9sSb59JlbKO#J at p}`# zXt#M*@Tf%z_0k9%-Y0d@!f%n zf0Z8udeS;W{wsY>0097?{%`F2KMYyW#lqUy#PNUU%Q1>NR)5Qvm#mv4FtAbBYSVGxuMQ4k?{CyW`1l~}n<+!R022*CsQgMRpZ5WMexy%r63HA%&6W^zwo z^_bmoIK51N-9K)*0dTET_7D8wUbP<@kwI(Iu4XdEE9cJ$gU+zD$s4G+>@`-mtl;Ox ziSuNyYkE9J< zq89feW_0pmqQ22FCl6jSZ}1brIP6q8(;nqfFcx5-FQX_syG5x$OJX7Q=xatD98GOS zXL{ld)MY6g)4&s&vX>I0CWwn!0vtL5VuMYQ0MJ3cAGRRB{b>aJ(ExsV4 zc&+r_*&=~2`Gox8T*@fqZKh5?k0M=Y7j<~w3fY{F6jZ&R at DNaY&{4A2?DC%OK8B>0 zG>n2FR+4<{L$y?@JBQE#^^BC5kxZhSOT-Z6tY$dm0`ay?T$`KKaq5sv+&i5<0Vm5H zB2DSg^&MyyZQAEO>cb)MvUnT1cD=Hy-E at Ivb8emzDYfDH z0RaHIf&T~S`n%X(j-relvH-kKk6sg3tbqVL3JRZUle at k@5(F0Fwz*;BZv$wEvD}SW z>!jTq8M!#WiQpt%{D5J+{W!*DXzX#?QJApWT2G}qT{W4nH?ME3epXIiO!ddRX)#bM z-rw#w20KGgaC8`$JQXEdX63GIuo#v;Ovunsz!f8D-q=tdF=LVOB>@ucoX4uD_blp8 zL>UbJ1h2&{^*$p_((sEo#HQG#qs5ZJ$FVW6NV(C%>vUHi+LZ$^L7&2qnejUBVX;~LZV4reT^QRNC2{N^JVGnOyR4n$4Q4^;d~ zHF0&Bu69+p`U!FAyK`>a=$p&V2J64`2I!qnD`xLZYf0-xvNrQq9?YYvoXx?I-;P6^ zmsShDZ=kQxI8e5Uw#WzYz{kPVAllL$37b-b-~^BtW-f6q~TPr&#-M(*+A ze?LUOQdlk>Zw*_iQ#9ckwshkiI7ILgbn%--)N{&Ds at x?Xu9EyS1~$(YxpMwum~t=x z0JeV at 1F|mG*3uSE&L*}d|26&I=5JE(zBiiZs*&BC9*;0(*7(TBGS`Crpb!&`h+$IE zd6E=G#a1$FiLZR0IKBLYqD2Qye3S0BYSL)(Z7vfXJ!jb;*=HO(JbZpWUx506a!T+F zL`MXsB+%mWCgbU6rUVcorTav=4dezAgN#CsUCO&VfP}QG%FH8>6F at usTtdaF>Q!!F?-9YAj zs#Tx$i(zJ#Kl$|hA;7QXt4hzX{E zDb_p;R<#ue=<~j)cF4<)-&X at n&U;TdG5KoQ8Q_MjwE%|OG%mK-&@88}0Zxnx-JWBm zht_DlR?D?ZXaZ;kA6SVWLvefp-5RoG$jVQ+UZJWjevUj6HXEHguE25)c-!3FejS#a zx%US8`Y!xJuGUu>GztxAwV)C|iU at R&78Vu28)`XqrI&6Yk13d{*9kj^HFHW6VKCM- z7_Z0fLpmT{tnDnHVQ%^3foac(?isI+ccSS3&9F<78LuO50561$Q at TT3^O+#m&r9S0 zdq8xJUYm3cYjjJ&7lWnn&4^ggW(I!vgyx(hbo>iZ=9lO=Wejt)A$7Ep(gbW6k!C&~ zzRa9-cEQIIU#wL7M8}b8x>J_7n>}0L2Bgn$3NSc>e-b?Y4!9`5rw!uExaqgQ)0|Hu z%-t_>LrUs_0kw*NPmCY1`;~m+YyywS-5HDwIqGn=YX8!--{XdJ*O*-qY8oZF< z-W1^~n}yW);SyMi)|QLK6mTP$M at x;-*N3ib8k*651AB)-{2)OKcUN(YyBMsSkd*Z@ zH`B8{XWL9=Odnrk6Knuc?ubE=$+66*%)>0)%LPWdAWV=#WygW#>dW=T2M9vV>b2Ij zX^)^_K0`-z?MhXT{sZKmxNr}(EnQP?7^qUMd-PVldQKe at OQE+JttM+78EE$wQx0t& z at vk%S2J?t3e- zt-1;dUu;}J>sH2fH{x2R^#}|ko*5U{#Pf9TwE|}HI0on4y at os#?DYAw at 7n`Rs?FV} z^>r1h0}!e))BBClp`VzZTr~UX|K!0WB(+|85j(PHbdH}7n>aI6H~&;TJebgO7UVoI zc7S#+aH4zWACC^B`Uf~1!1y3`!Vlqxl5Gq at d0oJI!2C*c^b6~G-#djDtv+4 zhW??FKen8MUw$%k&JjcbC;_IITwtdfLLW8Boi1jl?vp at x2h{YmeL&y&`0=-DCuu%v ztRZ%0_P5<3SpTLoas~nxJ11#Kkl*&1o at 9vN)evAqg`3a9`hxgpAXnCz#8ds{ zzW)IJ58OA?--APW9x33z+_%?T`*HN>aNQ)WIPwHVYGjCj0EZ3q1)G;pqvu9QPxjB` zpkzJx`g_rE2b0J=Db%AY at 9s4B>E(wJ>^`y=pyc{P!?lrEzGp#9t`1~!XP8icOz at jNC=xzmR5faU4okDe_;=E z!0whHWB`Cl9smH!fAiA+^U7PaVDyn!T6oRa49Kzwh^734_0_+HfFKA8!NWsI`0 at GD ztr39!r*OMHZ}8XR$3LcgcmeHf6Ni2!wb!|ettClHrHO3dN+T6RQS~0 zuC(4>c(w4DnYy}~y0T`d>(al>_Bh>eoN at h4nXd;)@B1}^2|zx|u4^FZ at i89&&AuT% zN~FV2)vvuJJ&HtI*}fq;N|Ls+UHx?M#J17|bp>d(-97}%%7FyUg_b)_uhwx$l6x-Z z?8uU|i@%>`yGOO(#kL!Mjp}8{h_$1h z1Mb;K3fIBb#B}TJ0ugtWRKE*~tGy|StE>G{5wHt%n_yq|)II~t?cfCH2K7z}2rNB+ zEJT1!JGf^%zWvA}$YMzaF5^;ef?s#WUA2GC(FX@@jcMTwNV{Y9Jsq=5l3!LZjJA2;ogmYbi4X2QOm0$ENRfs}k> zy}qKiXriyHp=4oCeXn^-t*>Wy?fh1>Uo^O)*PJ*PTo^GYz+TZY(F%nyxpeeZQ_CC2 z#s-F__hv^1CI?1FI=;wg)BfUlwAItk$ZF~)^*wdf)fWz&N%3|IleLAV*-k;1&|Q-= zGt;&0BI0 zUVM}oZC4h33n at T&8%;(OG5UTng1x$`F&`W((5pD}J=dKO6`a(2TeJME%asRW*3NwQ z=2lf%R6RWGpJ=^gnWDGhhV~YCg~f_oVb{j7qC~#-UMJ6cZ4zo zDAE>i13N;Z+ckeWYGg2C0slH0Iy8t-ghBA2J~N{9sG%Y;`!?})(qQo(zrLS2KF2(6 zr(~glRz%7sk(US1086r?82ElNzS2Ts-er1P{32 zyMu=+tIPtvkm9EZ0hy at M%RQuITpqzS9`s1 at J8x!KtvWeD3kcx?`=GRrpAS9x$kA^o z2GTzx#jm(68vKzg+8NLYT8yd2*WM4)7v8v)9 zBgJVZ0&po#;husk#)#yU&G1nVTQ at V3){zJ=X>t8X?8HL{dl-W=L`jE&C`4CU*{g}P zDXHCrF%`WKC at CAa7K#O;WE7($T5?Z;GPmN9CFoXATuF)tm{r#AMYqr&NqUy98-}(Q z!^mQa%Jn3znP{3vQcvsEEv>8(Of{^RBpl5~J+(9!%(u*2TrFJOd5BvUu#+utSSTUi z7z-a4BWqewCL^W at x>s-Db99wLm(};oSzbor?X>X5{F!yJ*KB^ZV0&Ad$f&NX^tjqs zj`w%kv{->lk)?o`34(w{w92HUs);kLSZ@w}FUa8(zCM3v#w(w#oxZYTIqRE_-R^OglEMnf9>k+QdYqaI)UQ}zLs{yNOrVV~i(>iSi z)t4An(Izb;_JfpU11tUlEs{X*Wy46y2 at aG=6m{g~;7OB)0j! zf^F+N5?h^B?0P&NCoy1N%{I#vXfN?hVj|0M%_XZYrLQJKO0i-CEzzam%gvgHznNCq z(7Z&LNE^@N)ko{O`uZ#`02%458apnfwDYtz?cu$`?m*0x^s=!_I(_~}et1_tyUFY= zI+8x>$+AuQzUGDYv8F#ZqJsBrg0C&?45)zPLwJfPt1w{KfhPfid?qy_<;aDf7l^uX z#BDHGxIihJ+T={2t2Q$vh=)G3B8P1OBhZ|-{#rQWGb-q6jbn^K#;9X^qM$tW9Ow)v{QI2B5%e%k<;8&W0vT@ zgx!!AVQ%QT&O2L#+X1_XJMhbTVOc7&Rl(qw10GKF$~BGMd{5`bQrCkXLSL*~q;%0_{lx?L}iH|&&{7lqR=fDKNO>g?=B3SYKup&NaDY-r)`W5{g7_yJEr zgo-sTVXLt!-KGW?ykZm^bmsVIGQ}c7MLv&N-UvX%1E3_*)nd1Ln$#-7#>;#($&DS5 zFa!j=!7veTkQ<}}w7b~wvDXXT_PA&XjV88~GBc)AH*>sfVMdz4I*oBRjqxvPDON at e2Nckzmj=T2oxI>8G$>?M!>}Oq;J?uE)CH`EA zL_YMGu&0Lu_U%yn*>;PZaI$*_gkG?=2z%&WqB>wL4B)woaB#i+^1!77;=vA9Q*mEr zTNn`xALKQAWnnm`nx?5{4tR-59OUR}o#_W;8GBJwIoHy1L7!d!wQ{wN16MAYG9AaX zGSrCYNqWIx;5!$z*oaqlUV#gNaz4b9Yx0qPEWG5vg5LPf!orDQhi)jjs8?cMl0yt{ z&0(`UFKzF3TK}`_* z11iGa$T|&CyT at NBtoN6M-Way6RE8xwgPdsJ^22xx*=%<*o9{L;i++ApEi8gR60;$8 z1l8Hzijno3r}$BJ(obv}wkxABg1YmeIsRkwUqa9_|McntSD`bMv$6xfE9 at Y;)TKt8wCY2TPY?pemnPau(&>ufd?75s3K!(ZGQcs z=>>Zb(mIpOxqOf)-q~B-Y|L1`uq at wWoz;{M6E3u|+c_><=evo4#2`UXp`&yJUsCN2 z#w7j06W4)K$3u&51KQ}rHPO+2I79Su1A3Nq$+=p4MrXXHj-o4_a8hBsL`?f zqmdHvYDlq#rUpXhg0HM*jFZ#xYK$k9p4vL+SR?a1egyrrxZ!RjQYt at Xhj_%)WN7pT zVc^ZG1QZmc7`&Wmq%9gc6AdSZdN^8iTc6K|#hRUD!tcY44oPrKRw%PTKyg~cs}w$6 z$&7bmZpxXm<#-E{Mua_3YnSw2c0!<^=$89r_PC$ew8WhXg{UYn`^eD>U+o2F z5S5Sn%-j;4O})C6Z({5)pgU#yn+|Vq3F;5X9 at Bl5?0JO`(X5tCE1#<>7skP3EG|2Y zU3-GGpJlQrYN3?0DkvduOAp4}MT~v1!c1u;DRBY^Q2Ub{kQ}md3bRW47p{(aAL!C` z)tEttX8NPx$iIit0Q82vL7eve3?M%9st2V*GAe=ieB^S^#$ax9=XZIkXRco=J^{I_ zDpv{(pX(u0is+q?O=AQgF5*+^wxYkKgkFsKU(oaU$UbsVo)lr;tzkSX5Iid|I8TSL zvmvGG_o?~)b`d=(1n8z9cbF*7#ic$#RYqYbpEwf_oVSw(dBuiqu!Ee?eK!dH?4T#B zrQUB!QXLey0G)%<&4!t at 16Vo~%)+~568t_+59D0=4PDtIej;_(*jf7LPJ^YO{*JtZ zmj#z$pspSik0McHU{+!%x9YETfY&-WCkfDtXP`G-e+}shMnfMj6aJYB^U4&(RY8&^ zEs%38+A|5(MFH$LA`t^t!c7+QLlQ z!Gt$DU_&C%p)6sja0znJ9k7V<4lzCG at ih56AKd#@Tg|zx)~K-kBlUmDlz?mCZ`bXNTmll z^hj_+pze6pBOek!M2)+;BDJM2s4hu*P)Y|dzn#Xx7nSAAmF+B*?GRD|f7?*{NoN%w zu6bFs&_9qAo9XTb1mQ0RamDE$pW-ORcVYw{UJo)Th5LYWztSTgG32b#P29bcWGebW z at u|#osOZRpQXhj*CkdISa0KTr-_wlmYw4%g_7y$cw&-{iP3q-S8@`b%XL0aV98nwF zqe^Qr4)Vd9nSq^QLe196MLzN==E&LkiuUov4e=>Fq9u2ddZ! zYv8x`+qJguN={R at uAY2{_YHaV!BPl?g#B_qkQj}%eRZ%+ET>Mn&1&=l^bdg@!snBg z=OMPAwPe76zlQFa}ZtV5_nB+HSvz6EyM0J{~-Q9GF# zwp*wJEx}Q9lEbHQc5IV=_MR5zm<@C6mUXsm*615BhL}bKnetI{0v)Ow!kl+d$f^bE zq?{IcimWH?v~7X6Q|bYFp!S$=xjpod>6l9Wjzi0=q)leZCNouwiF(D1G09Tr4-w1H z)}r;BXwym7jBAZd6HeHV!i*~@MSp-kY=c&voLw@%;{tfj;Y`4>Y5Hk9s41823TPq+ z<{ifaP5^KGG(-Q_Jmig-v%1RuO+hBctZ7JYS-<4UePdAfZ#rH`C0YI+jhwCi6Lx^Y zBi9_xCKeadC4|>}ft-y at jM#y^@pkGzsF)*JKjX~1{oeT(Fp{(!GvQ< z$QpC!-TB%{y0CatXyhWO99kW%6pSl*ER-~6Lj205s2ED68}ktys2(e!Nc9S^MaJ` zs&S at K&XcwPh-5>)Qw2Nw4&6fX_Xze|G;Ry3*oJx1sSZ0{wB0jXUzd7jZ8+k^pYH|j zzXsI^l at L~j`|@m}XqRC!o0 at _Ql5%45S_ZxoOxt at GC$TUItxBt;2Jux at G2$wlIFp}+ zG)5=sGDUDgR;45*KELb#c8U7zWag>f2Wigrzs{8sEug6}3IFZd#A1 z- at OPHHG_T436#B#g>KT4x&ndFESW_UqmTghw`VqKO^>ED&&Dkm2XS~4<(aD_>Gk78QwnPTf zsgRK`y_8t$V7gG{h8t1I#pjC=yhRtc{GsgVi_3%l3YiP)nq1<8^lDe3Y!kG!3fk at r z)KV#`XS?>`kr#{$iN7o+KYrqmXhQFv#gISA20i1D+7~pVuy#rnC~Lw7n(eTUal+j` z&W01qhB`=hLdbTY4LHk2xkEA|`JC1Oz2!_B`k1wR&2a+tKCc$BUoAmHDn+%XrMb&c zuZ){Z*X#tEUG=VsQw95}=7TX{T<%8~mK7Yb2zNc3;49O=Bi8o7G<;(8MI2s=&o4Wc zD9?ihEvmPJ4wV(WEQ;@3PjPdMd{?44HfKt33%^0yYtt{0uTUz=i* zwWl8DsAt-3 at Qu;}8%g;neq<07t+*i*Y!5rI+{dfFmh)dvMTH;K;NCkkZ~NO`b7yNG zzx=(lOU_H%iJN!VH)sw_*|#o&R5PAcXV|z{9hBW{$%3C3HR_Bs>hBILIW=qIzTLTf z%I&Iu?r|?s3!0!!3|>b}9NRuLTMiFvArU>J7RAyYhw-*|Z5VwYc!hCv?z{%|O$BSM z!C8$+nBjCU`usgl%TEOQav3+RHNL(Hwewab!Gpmn3rG*3Wfo`@V2BHS)gvE?S{D$c zi5&pF|FzU>{zD at Q1OVU&1^}S&-`tO=ouiw93-1AjI_0j{Rq%S?rl<4Hzz~HFwgI#sHX$S-a?qGiaYrRi5 z97JB~Cq(?V7ZNgwT?_r*nrg5J&- at O_NN|bz)A48Wq&3lofihfx;CU(u zuMNXyjp>PT*mRAUCTWXPv8^%dlPSS<@bt z#(bkP_w`>uTfzhD4F(JV00aR5!2CZ3?f?F7&_)SS0ht#~6 at GhBx?)+ETCv~pVuX<( z+B?IbI8)+C3NQ20acIRPO#^i)Z@#aBj^$4Q-h7;;=S?JC|DpcdNw(8m2lt#u7uVVE}DyILA3#fZL9))0yTqT>J=j`3 at VINx2-Z;NYenDjC*KQ z>+B4o8?=WlCyLt?fM{p=mP(D`7K)NNeN}78MWW239N`f8DrB1;S8z5Tk*cc^O_Rdp zvHyl1YH7JW8hM0pBbBTcX at X0Up+nojzS#w?pKBnqIs$D`g|I``t>etGs)$!p2aPjZ z(v|bUd+d7J%o7w~vVyaT92(17eT`?jZhkq)wnV&vW4@3FkX%clKFjaoODKB$C2G?6cT^r-jt28J=o6y3W6TTzdxePNbQw<^;@ zemxN{XJPM%`Ep&8`f~gl8hTRM^p*W65yYN>_iQbV^ScypuQr_4Mkj{ZPSJVij=gh( z<+vFAP2Xh`Bc1RbEA?7=WMGTcGRzabokr_aPmTfdi^1s_T65aq2}TO-V!ou>d8OnL zbHO4G#i6rWNpiF4Id0KLQ;)Fd5)Uhc#PcGKsFm3izVCaQ-6odR5R0_GhUbt&@QEdr zm!RGFDmD+d38LN>xB=-akeGNv&!7c(88>s#jg$}BGm2T-NP5$qfY at MP7#RRh{JUsC1|Bl>d>U(Fvlt>*`zmq5s!M0UtGN`l zD{@!FI?X!dlX22Jt93L^DqhQ?1kcOd@>sBX18vK*3nHyEL3ZIqZLm`ET?GpS*GkK( zJlUT^j^#+PW#Z3yQFPe(`v>8kdB&$nzruOpz(9Lmj9B;TIJ&ZNnN+Mp=gpmDCGIbO!1bSg&Ij8n07H zpf_EuP13imp^A=cJVM1)T9MtnU<=yjMA0mNy=n6371zoOP+p*7ure_rH at bk;7_&wA zmQbgZKXJkwEV~aCPFilTcBq`iK0OF1IBhjf#g|XcHjq49pOLs_Dz

    t1A|BF5;yvd}ZH%6V& zO~SsY0_)ASyta?VEi$*;TD8$rq~4j~fec9ynZd&ngEWgwmDqtC(6;&Z&HVu!R5Zn> zwe|+|JXh74!?W`UoX*xstd~`2CX&3*v3S~hHO9WKD)SfIGunBM5z at rFpdqpX}MWgZA4G++-={|1z3bT1Q=W3JKj~&RQGHcJg zUZXSE6aTP5Cb4N>y%*fpE09IklIPLqEe?h8?DkSaRNF}b6$lG#M>wU`oR)6C$5>4_ z4FO7Vp;t9NH?|mYC8 at fs$!ErCK$y&0Yp8UUg=>ys3(1DjQ0fj?QR?=9PrnKe;OoX+ zQ8;w|5+T4pQ1J#%l6dDDV%ID8=sc4p=Nl?1%%}|{+Xr2glo*N*&<@8>8*O<3*DYCP zMz`BfWo#{?Y%!_4R5p-tP}t}R`laR9d4iRcEyzT*dexK{$gt_l%FR=Ws~rj7m&p$j z_$oE`n=&&~^I&de=T0w?>lO2-9Rm~HlH?TDZ6$^@*)qaZ?Hm^U5QTX2QsS;y*#~TO zO)fzk;H-JkBr4rr?*j>=rS9Of^1rbHFNKe11bmipU>_gC@`}2oiOL)_TgCHLFb7Ih zZi0$K_Tdmd{X`vlzbYCBEaAClzLXu!g1$l2&FMmoNAPPy2B4D=`&rB)(bCf$_zLG~ zy8~~ZiHMsmkd1=H*L}nKjfkP;KnO)rhCT!tzb9J{uU^EHFhpdW{!W})5wBszZqdlW zRcWHz(;^P}ijFeJCqRjf|BkiScx at K5WORoo;GhzTw>3sE_g&x`jPbgF>L~8pE(~I) z1ac^)P+if{q;v%hVSX30+>}aMI}n3!<@85`NspwZXBXTzF52d2x^K>Pa&FRu-we8O z1AS6O4QXh8!P!4Zd~=o4BAnF;l at 2!UmT+S8XWw`*DUOa=<`urI#u at gpDVy~>aZWy= zADZ6~*-5zHy#SF=bUVL^B!@IRbYv<}Xz&*pC z?FH;6%A!B}M?ZZ>6)fC!n)*&Bc)3%wO1s0|=u!4SjH90G@^fW$E^6CoPl<7(h{1Cf z{xgC?%lB_91#y`0Q!9Vwt=zYNV!! zuW2E{9l&)`zUN`dA&=>+3V=8<#z7NPldJc~36>NyCYf*>#jN?PhZ37q(BGY at XE!(W z!Ok{DyS0wyn99VjVhA~5U(i$UhpCb%G*#5~AQ7ul$D{UbiLlk0uC6%fQlWFtoRNrN zTddEms{j+twQ%cdd4T+bln%g+4BMN>c}c%j+ at xGSGZYphxq6pt9VG~1O at O|-Z7^e8 zL5+`?6M%Y at es0X(+r4Kd=~82RRqvn*fXK z0nF{buC!GpJq69~XYnmpsi_ZVw#5FUV!1ODU|}3EPEE#({GD8R25&7%yvM<&^2k&K zxg%i~hwao+%ZY~TeUl&rKS8J5679K&R&vQpqgca0I1RSmTs_J*skx=yE>XGQS}-Uq zCXBbD%so_%aY4C5RCKT{%qxUmSnC~0*~=3~4U3UgrK3k{+t7cdy;8Jw{o-JSfx4lG zEa1gq3s1%DXznyCI4^SCp+~$BPPkKp6VLPHVk8MO1wd4}b+l+XK;Qx{E|V;$K!KUd~5Zyz~+ftM$P*LOWpeoxvLuY=zAv#NRKaC05KdwjDEv+&@5(u zg_+3M3h0bxHd!nFJMMGHM-yjv*X<{$C8#$u$Os>?Avtk8tF&6BVY8z*#~|kdKW1$* z*jXOQ*W`k2%wr)>Z+B!(G$yT48Zk@*x`9w8_rzQVn$ih;4+|DX@%x4e4qT%dtz!85 zhV_u##c=*%rlVXQ at WVwP?jcYLab8n;xXr)mt4+K2!n8jn(+%-&Y~lQC$^5fm691!M zhPo$N|Ik!=fnS at 56*VZiSRrBQ!gV2~sibu#p}t8kU{-BO4VhupBYeyXrp(viPk9lK z37D+v(tSxhkKB)IJ{KMrRqL00d_TUH7)ptL-^Yec17M6IUOPs!B~tKqNfBgA!HM#4zoNU?75?Sv)x2Okx01QCaDwsBg5$Ue;K}Yy_&wfyz@>B< z)Rd1^n`P}tj2efb$BSQ=Z)-dod!n@#?r2m$&^q(iPliG_H< z at N?Uw*O5fZl7-UhL`Vdn0yMUFG;(LPzd7&3zmuUV*vq`ka~%CcS~qJ&-bv*ME1}82 z!KKNEg%Ijr=NJyn(HqOQAZ(#~L7~#2aq~!XCu)9tNADXO9+h(Mr{^L3dZ$k+Wvy&Y zIbzx?nQ@{m^i(FnO>tOca*Z#)NSU~2qw*1*I(_~iXfWRZdJRuQ!fZkgC1i_R5=t?fF`D8WfQ!~wx!q*hyVdzRlYMQ&liXdxfybDvX zOGRx+5l5m;+{%yfdzx>O*`jKPw#vjwc=1?zw*krL? z2G%YnPXBv0tjZ!OAnOz>aW>%O8kV5(m#H3!a3Tu_CXoWo871c7#r53NWaWMn%wjO2 zfq(Y$O at q;0_rP7{N4!c)#iqn81gCaBa(GqNKVsHJ(q>4+-McyIA#klVF!D)Hyyt+YFlX9%3ZeEE*@~U at +=Y< zt*$}ep=Ft6;iTB4AHE)8Ue5&)`9lab(xc9hH=*ye+Xgd9vjz2S26nPO=3xUy*z zNACh7zJ)tbWPb&`u#4 at N6EnF=vM>b at cqKlc?fLsqPlW9$w{h#I(4Y?-)ILwl*~}iF z*sTr)=Bz_)J3mqM6&!Z4z1XHb^=2`J#J%R7rU)EOZ$lAsm?M<^$P8=3b1y;>cHgjo z=A#F>NcB6Nhg!pTx7>u~3GYU%%R81 at MxlsN)#Xe&f9XB$I_QaAoi=w}U?z4D>O)>& z;T`~nnPIYCYY!v=ZRVKgYK5E_REIEFKgz!YZ_p3rod)1jXaKxI=#X07_yt-0Fw+(H z!P!On76ouJzuw3_=A35hTI58k5uZ2AeFZArWzwckgZ#$gG6`@-iHa0UyPo*N5(KAP z<{D{T=Ede++ at CJ#iNqF1iPxE_<74{-btAGUq-VQR2<)N_gRI+>KR{H|K7mVS&?svK zZvJsO)`q}0YcT0uR8zm<(H+*xbppM3kLeAaI)}AB>~ry#XyaYu`_>tbC60v45Z{5o zPA3*#3qW80+e+_Bac&?*sqC_#=(4D6sfePa&+lAhoLgd%h5C>napkC!cDbyZWNsgP zJBAa1DE5~PQ0|B`qCKK(3T{%cqXP6joD9-((Zj93>9b5XtB9CC&?bQRH}u&*p#9I2 zhJ;nyS$=rnXXGq)gpgqF{*)kSU>rNM?9Um&GD#K5LU9BX<}fg~bbWBOsz~hOJZ>a3 zd;ucAe$XrV5R4%nwc*CS%;oh|J5#fTkK4yXyDuyq^0A^EGJQlSl&EnfS7Et?QDu at 4 z5OC4)?s5G}eu1Aon8;-yx0PA#Mt3^RcIgnMTvbB7P2*X16&_h at R-;um3nNAYj?}&? zIm!_SiYJi$SQlPO_^Wl;xAXSJR-Qdszl=xECEAI2!Vk9%Gvf2aaV+3u6dQ_mQ*`^1 z0=~+j5f0EqbW-dd$1^5 zMVhwAvL4fvUyA!4DU_r-MXI7pCSCj8r$!_gmP#CDoj%Pt9u+7J)W*|fcGWJg7xkYM zx`80IXM9t;9CJks2Z49TspXos)PQM2e^uVkC54BTwFP;M&h)C}y5d>B#WGSFb@@)2 zW7{fJZDy;!mVAbg*E at m9*ix~L$h?p>4cqbyoP3UXY=_m0mZY{~o8tiNHyS?V*vBR0 z-MKK8=#)OC5sl$}@92VYwjeT`-&oH&ly__~onGOl|L}f`XMqg<;6MRPT;VdrxFNAh z=Nl-457<7|IP#vkbPQ~Qh&F+aQKoo&3L%G&;XdcB11MW){}}1JxjWr0%yn~HS9B-> zqMn>Va+Cp+SxqXuSNI0Hsd*$OdQpdLoQ>j(TmM7sn`2mqYeWX8kSq?V_ctd32PSI4 zw9tK at 0$CzGh~eW}g%D$!==KI*FuCY$4qkqOK(}EjgE(DWfegL%x22t!j9&pUDZjXJ z5x2=j3AukFq85iJ;=5?WKo`lQvS=43dJ)G;DX{q;{w=e1LA)DS{O9ZV&yV_l3h#fm z?8pcK=w5nw5#I*PN^mbQw1L80F?a=g0@^ze3qUQ241TGiLCt?{3zWG8)+F6!k6pg~~os(0QqeXT|u2f{!@h(i9IlDcOMM3pxKdYi& zM$Y>WE^r}QHJ2qGba^Cd1VcWjC;M!bu at yT^Kk;xUGZXclYyx(#0jC;uSdC9fOaeJHSmc=D2 zEcN6^j=`OeI3P`7D#4%?#-TXI;+`d4lDuP0F%dfBZ5wja>Yasro4+;;lZU>M&Q}0?*ycBpvHf)elZ5Ur2kT+hVBE0+xFqLgfdy4JJlKvo7dLBorC`3({}kc(ES)UP zGoPI3zYun!jNO=C%bd{Ss;G$5t#omt+RC4G%goMM*JU at T{cbT}yPqcA=*b4W9Z_~lE|M{wNnx116>6_Rh}o;KW{f?luj7c& zUGI#8`Wi;+Vlva}O_-^cg-80zH+(v&8Op6~;ggSr??FXH+2j!!c~~(pFOV#+W{Slw zcPvp<+1MALRax=U%Unq|3x|U=h3w-sH8l}bDEAn5@>G?jr1jhIQr>SI0Jrnda{giD zJ-6|$?qzpsj&^i|etL_3dR3QA<8EF0VSOwJeRqaScV?Zjgc@|aVtHR|JTm88#!+a= zd!;+h at ztW(Xs~ft!X9I!nP&2q%VEUA-0SFbGHruUZm0m|e8ib?vj_PRPx=KuC+_J~ zv||{KczZwzL at vADh0pUA?hHs z9`lyFYwKtirQ~Rx7f`;WgEA#PqYUAF8o=!VRPo0* zD at pz(ZK;+0fvbF$uO9(Sa&f)1=gh`#c!_HzUZ~}bl>un}QZVDp93dkPA4Zu8=NX4G ztMNFur!)zsCCaYtH0#1DJ~5qc`o$F#K^ZxZtc at e8z)>peP!TgWhD##ktD#R;xc!lk z_*3Z{7K*#7rjSNC-tri0QQJ&o67 at 7qwK&m1fZTq?1hOr!fHlr6MivY-fr%}DV%S}qf;}ED#)%_kxotLBV#TO7r34v6d=KL8o-l6Gde|)f7>8at-^=NaoK%hmKm~IW zzW at 8C*41~x8AqLR_qcie7Mt$TSz at ZWT_X~o7E6`7F;|A{OG&!x*rrDT+T59!{pQ{6^W zcivm=4}_84-&JWBYmBcAi^_j|a|^r?CaE!VP>>uoR5L4eUU?70-mPi$ph40-^-Vsp z`icCMeW~i*>Rfe8amEw){ws?_v4I}P-ENT}nw`%tLtTlC2@>mOA+DqLioceCDdW7E zR_b at 8r=-J3xG^sy6&J~|?B#>FBqldA`GJ1x0g5W`wCRlA>}E86vLRZbbXyc6 zsSQzx`BgnAsZZ8L(oPI=wB&VMj}WQeq(=M?emnFGCXUHIh)dRIhz+9|xnn-*7u-vh zXVH%s3A>wMnGeWKW5=HxjK|H2Zz94T)Q|kv2Zbe8^>By zV#P55$~7B{H!w8>B>4dNGkm~vRhBw7I7 at HJ& z<*{GJx!Bm?NYj(0^Mi74Y?4fTFiRt3%Op+H?~r+H6w@{spJ?Ox`m$M`evV}4vq^t& zZ}L>xgdYZsJYKDnZc+`P$xo%<2^F;#vC8b#qG*kL zlj(}K6AWYa8&b?|-`t~{StZqxV~<3WIV(g#L+^$wsQYEmy>hIk5O15q^F!i}4$FU} z89dXDh~nx-wE(kgiC}{|^Jm#WHW%t^A!QtOcFJ^k;0N;=<*R^c2G4_M-A|@h?p z>=F^4YE;`}BY1cWSVnA|<2P*=Orjfv)<9{Wv++-g5xAw`A2p{Du}C8p>~BbfG zbGoOwi)G|^|9Tf+^&xu~E5q?F(54})U(6TCJ0V(}ErchQI=dOkJ3&$0ooqT4c}H-^ zSMh?EOIlVCJu@`*!7j?G1WA*3bZcxKHV`epCvoS$C8+$BGSBK5HKEZH^*mo|Ud~nF z1x!==RjOEt%tbE)b0(63^UT{=G-73v=eV`dcCR*EhnXXVJaxe|}D z2%OTnTMB6rv0*c@`OGFZ_8ujq1!QV?c^WW<8c3MAr7XGm%r=1&Ev9-QaNVz_*4vOW zzDfM7g)GS0xK&VAKk(CZ$N-dZoh3~vG at 65!U`0hRTM(m8to&RL)h_!P0c_drs zh2DvsI&zj5K+S{umi!Q?X2*}6%mINTz at Z~H2(cS at _=w!R_zrGx0ioN|p-V3K4e<%X zI{wx+v_4Um at e6o`Ea`rq8eT!u)a&NVmcqh%vhvFCd@79doMXn$Qof`aFL8lD~G%RzYXE|V^dY>*2gjoJaSuM1NL z66LnP6mAuDmWV5ap_Q=vrwRUA#hOl0*r)E6#kB?)zw+?8WAdIrKo+2z&oND1*FCA( zv3 at TLT(=g!)XnFlh z9K>!uL8CtNDK;V;T54teu2PwvIT>r$Y=!A6tH3s9CsQ=(j;ef%G^~_WxFITo0Gn14 zS+#j+l;J|Q_VR{stwOVrZJr9DXy!Kd)kK}mzeRM*D76EhQ^N*&3s_F+iUG{BXCO90 zp<3FI7JMRtc&9Rcpjo;&XCaR)ezFG3P^K2Tu|T4tszPkx{^V4-pao6Udi8VLD2Tpv z9aQEdE?XsW at Mq2v77&DVW%R&KRZyoISb3Qd(lyCP_Tbr5KP-=>w8A~u)VW4&eiOBh zFbN~peStLb;y8}SZyeBSnBuvbqQ(Cq9+o47IGfT8|G{K-=$_Gj1~uhTj|!u6A*^YP zI!@fuB%p@;Jy`OtYyzkifuO;95ecz2>eeWr at cA&*uv{j}z|V!JTnv7toKj19vzS{d z4WDyIkUeQ<1%2YJalK{46P6pO6gHnJ5>V!n2%0VsPVbi?4C)C<*^q`YM;(-f z;WS at 3YCUz;PUfVz{5eO zLKkvfI^u3ul-P8jFVt^1?$BfEUC~pS2pYfOyIN^rTE98zr7l7 at ovLH#Ff|@>&FTOo zo}4n1Xu*`@XZR!F%I>L0zW1K17}xdshVAXRM)_GTD{u(ej_BF;I(ny|Hd<>3#PqI^ zbGK?5>t&wxC7!&hRv`;w2DgAOJHg*w^Wl0`F86JiYkf|NiC_9A_Avb`c zrPB?X;FXMSUMc%oIhth!X%D%!M2bhK2S}f6aNiZj_aH=Z<$(A z;{?%&gUB=j;u;Svoi}4nILbG4Gk_*;C`{Km1X~#s-$4#;@6Ht=mVk@*aCK4b+p`vM zKO*PxPKpULp>|ko|F${URC0z%XMEWHFsDH(A^)(xI$+e427QFA+QMi|+kJf7xx*lB z at MfAZ(K;*URq04NJ>=jc{2f+HP8US-m8jIX#3WitQ;p_!_V!)nw|q{kYWf+Oxcfz; z^$kG)SFYMMBmSTvv9C*iDvsO!!wi(TaNp;QN%MEb{K5TBHs)`QY->^JktkqTd8H!y zAfO at n@$5<=;BaZiB9_QdBs6?+70w{IgC8>PlW2G;+!YMYD!Io{YUaqvcLuW*3Ci!_ z#>-?EnTRl95+|WIhuHV=Dh;2B+g-OkC|wnNMAmg6b**d|x>aUL}xjciHC~zvsDuXKP#;l!M8y04x z%LXG1v4~x)oPq_3qus&0eR(T<)A1eES72*%AQ0ZYm(z?f&#iw-3B8elIvUSpR|SzU*z#|5iPE_Qk};3-~0! z0({kSKl>Wu{<&zBxPbJWh?U2GM)X+yKKZ(uxt~vYY5Fz+|MRQn(ii;FH$C;!H+t#I zROSz2tkL(@^t-V6R-XYPT?edIm710gG+hT at 6BK>^@46vv*iDL;sABM*E9WN03ZA1@ zGoB7q0vz$O(ho8H?%a`(bGbLZjlivp1tW|-sO!NDU6y3NU@)D_8i&S%vN}-vWD5IL zg8H#U-Y}7`Fp39M#Qi*heM|X$KY{&n-YN1F2@`u!5_G$U8`#3J=349wo#yGf2Rl&r zy4Q+NnE^JP%5#=C+Nr<`RE&abR_K?XB7+A$MhXmN?0MT^?+%OVh1Vk9 at aM^8WZmmQ z9xUf*WvzKW0_TW%*Mi=3=j at 9FqTU1}r#_qc8S#xDB4S5>=MdmINh3u37n(BIKh-_O zY<@erOWN2tJN+xarflN$AA}_~|JBo!t?X^JAc*TzGxnY!&T-?v2Q=6lEH{*|J-0|=OYDsl+eNJ&*JGuDeJ6fZ|t=qH#zl at Jwe`N$pUF# zYfZi%EVP%y5zht1!^{byYf4f$wq>CzyWK1ahZJBpYdi~!{b4ReMXT4wQ1>FplTzO?6_FqjaEM<<1K~ay`CoRjMj8U4`V>URk2oRN(YIb8)X(-uU7O3sO7-zQ zsn0Zr;-NT8_$g;Fhvo8II`SSOmF`Kqv)`I>iWunL+dUz>TXv973sX zlmg{j~PR0(o?zD4ky3BE)MGXa}BL}Ev{s=2bT`u)D|cO-*7I~ zCDPvEE*QHNDCp6t&a5;QIh1%}gGGf)BOkZDqKp4lU8jNX>!*SP0+J*6Cn-}hF>|&y zaQGiN`x}3(rn?ueGn#MX+El`nwa07`ysR``ur0eJ3fFoJX at yn8M=B$iW{U79LO80d|7# z(Mda>-WSiCKi92S%HQs{KZreeJ|{%ros6KXOEP(#SiI*%T4$@fI-&_$J%9fW%^ZI7 zE)DGwbxoe%>e>=S>2k&K-By-*nNNMQ4|}kW;W1)VfaAW;5Db6HRfGTE6 at DN;dYYw;TBPz zb1c1cKihhS#o;|7Vs+YS>!DVFvRH?$Sm+^Ka6YX-t0aIL2_L-VK}%9kskc{$J%0fj z|5Hi*9bj3SGMhVW)9e&Utw7{S`;Tj&9m;|Yi!8k58X&HBGCx@ zpu?@yGFGxYHr$l5`BW1M;2f;FtO5mNuqYr)F^EEaX54M`g#ra? zaO0RMKa(dhEGH}%@Z^Hh@(B1ILCcAjwHfs4CWGXLXTwew`^s at WSAOHCBOkho!I2JC zGJNcuew;elIWlTqE&(iA%0NqP@%Ps&62 at FuqdUuR8!4TYIJJz9)F~{h=#gZm6z%SX z=~({UsTRI+X(o+qbItv^cVe)B?wHX%?pO`GHG3fHzHNf}(C at S+|z3NJ_t#lqmSZ zvN>xB4K3`?)QHT&r-)`MkhFyac$Tsul(;sic55?^Uu*$TZE^Z})Oc!W^cw!7P|T%M z6F$*z^>}u_ z5p|^?59-5;gHwA!EM%pgG=|k9XHBoMlM8}^>5@~5K2mooEzLMHh!BqybX1+1dDe1w z3miKbkT`95MirgyLKXDdmIG&U(%$N?+ptPHAskn^!_b+KrOk22(KnaDUiiW-O|K-| zMdU>G7O9ZXG?ypK*8PuNI?tI}&97p}4v3mX4&n{pq8tI(=%H{N6M}>tBa~p8Z@2l-$A;Dc^Zk%KRDiJpSl- z9(M-r at dG`r`-Qm?o#QhA{9CC6X$OZenIH_!PHj&#*|+kYc0u})Cf!Gtq4SJ``7=k) zeu2Q)Bl+vFM4&OMck~gvn|OiEsai&T&V>1 at aDtTE2q7_7#^D++9K2J at cT2kH1p+6gKCz+jlhHSFrMy`}~) z<^q>5Dfg6ZLStv^SGCRnCrTx~!pQDESXR3tp4zjyb$zf)rUN0i>Old19fmXyi0&3& zrxuULdZ+346>BH!7n9QM*7BFN46OCDRN&Qyr%N^g=ZzPHi_2bL0~YW~Ik;}}={A?A z at 3mTHqZaOOJ%H;*$9m^RAm2}T84Yo?GMXkprY`0dcrUmZ)_Gbv9Nr7*GWKTta0 at BY zrOnN`#ZD6q(&aF59b4E^$@A6gT7s2H_&dydc6N$dUBy!OqG07+Xo*zrK7GUs)~my8 zx=IYkJJ9k)-8<#>rkDKvid_6*t-BvCTcV1S-{!Qv1G;SD1Ai9!oChyPg7T*GUJGO^ zO}!_(iy9_wS$sy=;CS39jg!pJ)i^Qd7%}G(F=zTRxS;A)kw}g^n*of4tX%=&7)b}b zhFR3ePjY`jc5 at jpoCX(-jQ(_YgM>cE>^x>po(OUWx17ZOh4_&LgZm^m2qyQVJlg4_ zwsOLxv at 7$*u{)RrhDfU%QuVo at Uekz8NZC>uYhdG#v_ce%AM`i@)Vt^)gcND0$`o=f zeM>?ULPz>;z|VM-iw;YM3gG=T at TT?P5QzzUU}q4U48z-Hz6ny6C1Z`bU2GENs8{D| z)CSh~U@=|Vb(-Xgb=Q@-fO5Bx)a!Hj(8y^hK1yb*UkPo|ww8z3u`CG`IYJ-E1|BVO##6+9x5|AQoQX&Le~}AAUYzRts0)X(m(^21X>Na#rf06pk%!$ zh1|1dwzX-o)rH9so##XG#R!>cfYQ$&I>igNAFj=bZDm<%p~#KTM+{U0(Pzc%;F<&O zj2|@!ya!Tjcw`&g#x at gVlJykX9hWT6#ifvw3A%!o2AWoO#ie$5{PhIxh|5|zhR}uO z99}m`N;hrtrrAHQ&^pL01#M`xI+^ge#u%e#`B+XzrnEXfH>ue z2}Jdr$blRGc<^$_ISu%#iy?Ca0&j-gx3(NX^=!Zm0`eITf=ppGs zEx1U3!AK&|c*5E8RA*vnbFBS>@CJG0?%BlsCHaHIGwxJ8s_B5P*s#bvA?0Lvv=GZc zJpsdoOq0$G)zb+5Vrmz_YBHIzb%R^C_w5Gp-N5^0!u1jEi<SHNhh&DEwM)#|_2+FGL73A%JOx^i_>HX19C zNV;0%U`N~g;rh!`l%UfQcmWL!l6y>7NDbSX4 at fCohrt=}y;}V=hsa=lv1;pVLa6x@ zLd&!g=kkbQY1uncZ|PXBxPBB%?T>GO7*=JbldOoqnDB}~mHtqmE?n6{TY>gU#!#*( zqAFx?RyJE&jH9oe-FE`&6kHW5H09*OB9nwjxfEmnoXADy#@TxO3p&2#NFg92QzVEc~Zq_r*+;N}S`?``*O#ZcaQ( zbE$TJC3S^7PTApHq12<7li39*ypU2sNW4ptjW-YhABu(nA;bly_bc+RonxcN5m~bD zzcs{Lw3$Pi{}tgb{Nu#V|BiD1dtxV9^*<5GY>`*vXobu5ZI*fzXo6CM)h=M;r52iG zB|#Ddi&gERSL&P_rCm8x&R<175I^;uhu at hGPSt&r4%%H)S=YeKKv_Ira`c3!yIJO*lbR5~7nI<984dm+zB&Dy+zCRajYd#!?OxpV^|c`vPLY3}WR|*)vki zSYK22u$=}vu212w?ahW7tmR)QNw}}GM13mH=nB<;t#)o zMLJBib8I!PE1(Rz)CUjQye`Rx3^6$$S4dlVPs)fBretKlA4ZCP>a z0M8*Fg2M-D)zMxb%4|7v6|2U|q(1>{JwnPAml&jbtX=81QcT`UGn9di(I-Cf*T%$T zl(1lYn6Q%-`H$L=DhmtZ5P!aXcj>I% zjjOEQ`7k)K77e=o2B>&%O}|?hT at tTokG7&hO9)_G7zu1 zNK=m_Qk=Vu68z`D_H`E=El8Q46fp z)g9h?`p4ZveXt#abWcnNrXU@@Abcn{7|Lv2IJ{XnpB$P5#h_>z<&8ZUQ>x%%((04+ zP7Z9~MV>J0TIt5i*7QcPTmc* zW^H1M at X%dK#KEgz#j62Q$j#Facjr at T)Qj`<8sX}v%XI4?{_00jpQs}sE)2p0qd)`b zn^vKN>Mq;eM4)x at UgTl^%M at RyU@h}vt4UuWW;p&GzGJYSh)ljdk-0utK6yDYAQH)L zCodk^abnOjfw*lS;3qT6nc_SKDte_JpTaF+y_(i?J4&c`k5rdn$hJ_`yEF=`h^oe* zG#uRbzcsR+RwbEAfB*qyf&CM~r=+cuiG!_)!+-Z?M=NXpi+%m8M0d5JYID%C8y4In zv3NXC5<1+1(PF*;I_Txhg*I>_-IM{zH at -H*yo>kMazB)~Og^#aZ_${p8@;paB%}$!^IZ;SGD6|U)sbO)MA2G&_a>@ft z>#jZuvv0R03E6;USCJHI&HRtY?o;zMWB>>Pgw`A?*g$M|N`%IY z0LS`Z6C7s@`P(D|n*t?f+K*gz!1$6%$P)A;7J4!#PnbycyKnkM at jX~_eu1%cNo&MG zk1js+jVfgsg(q{0mLlnj0Qy&^H{J~eFy8+7QuYKRkIeq^#mQC}P>5M-)4b at ESa5E^ zg at ii1wLyOtwC*IFH-f2bVq&xG1!}p9fWIm~$pg_-yLh1iNM>5$oU9GxgGN9*;Yz)X zp7psJ^Q=9O$r;ikH95al7)G2GRZ{ zkGEj|gqin0 at +ji$=wxT}UwcwfXB!*$e^0^wd!GARYq`1-6gCXbE3kY+VLXy_SeBWE zQFFd8v>zEzTC=P-k@}Ukld$m?kz3)7>vwC%h+FS)RThANP2D z)Hx*R7{{3-wgWZ(3nY<3d*FkVv ziHWvuYPBbiqs}zXpNMb_GCa4 at wn$EVBYDLHzm;-MR^#t*HfazbX~b&bcL2q65Ee>23*1;E2`T!quH at +b>pQPH_4qIw~K9!wQW*hF z%SqwVGp?TckAYk=M|`f{*{qe6ENQ|-Hr%fwE+2e>CIUnOvP>QwA!t?1yuI}CAy`!w zX(QP^qXq$^Ar}gD({<0^sI2oX7{AATDpc at Kr)*E+^i}qT^;;7?6}l~vLmG)T_XQ4> ze&zF&%?HaanTe_Pi3+hs%NZLpg;O!gEZF)ty)L5E$^Xn2dH>0S4W4i|=py*V(zf-o zBS_6PB`aLxHN47Y4Ez%w*i_OI!4;*xtWkH=bAk`=x>c0qMj16Bx$-lN|on9JZ!9iX`e+1g)%aVAupF=X4um8kjI5 z*5*$L6JbGCVDP93UR7oj>ocDX|HZ7&2T4=Q(0c*0u|nR3i41%wq_V!9!VyYMoZuYJ&}U5pz~n zo5&!8u#Qqyx5j~$;DvyF2=5at5u_DRAGpHuX|gjpv?Hx-?Uv$&u~E)o+A!z|M|RXnic26Mte?NcQW5Pg&GagAwp-X$ruu0%;KjCgzsnFFQ1uKk&l7a#mnI`IvU zmZc>;M*wL})Cr}2CG11g!T_{ntS*ld4kslT%&dnG=g#@PQsVUYeiEJL85}*v%AUo-j-qu?L(G4Y7-l=B3p!- at T2DU0ww z9_X?gPN`rej$3~BnIQEhCtOs4CJXHN&8;-zjv}=hS(3 at w6}C3#vdS at mV`{zSt z{L6LRrG3k-Qfyb6Mw02oQ}0Jg+xnYuY}6}U1`Lzj-QgWr-FK=lsyi6GSW|x)9YkT+ zY!%p&Pypw83|z<%xNdfINxV#xiwjBJ8QULy*^kcOm7`#yb(@%nHp3svR`Fb!E@`lt zltK)kOpa$!zuRkz5g@}Ht8NO34`B|Y(Lzn;7Q>;fF!oEkJ@$bZm1eCbW?p4;;!Whd z)>ii!V}uTJ_5#DKYJDj;Xsna={`gTAHg_`u^eHs0VouT&KHwTAd`Cl^%N1c5HUq4+ zi{{#88iSX0KzSv>asjpL?(^(4vToj15^@OpNKcINI~RP at cn_9%h#*Y-mI~~J5!KBR zDhgr+iz z5Ykr&5;}W4B_+O_aFSmfc$cgw5r{YfU4ES#ZVC~twW+eF;9KpZ7_G9&+huISrKUqZ z?uA+d%fiOz)5^jYORtabH?Tg4opTXmje)QP&hV0z5&#s>o_GFMqdNC=_ErVJf;SVt z5Vw+l5FA1U&ww?JQOux2wb?G1(R1`O#8`2 at L*H=*1z*IK=+>)LXT|7rRD1ru6w@$$ zk1gamppgnwDKZ6hLdadDtMm^(Yy+sE9-QImPw<`N08sY3eohOHOj zvRk;@IraKS0BpW>ynynBc7`}+L5Z7ReXKB>EvEli7Tm~Zhe0Yq-CVZikf>+m%5U|V zrbKgy^&+CW%Hdte8X9Jt#+5G!Pi@?8RlKO97l=0P(gRB`f~Uy*f^j476*ba?4;Ig%Kl4<_N{_L;2(Q7zNi zSoE%khZ4{2ONk;TkLR5IXAuQ!&F3Nie2iWW^QXV{R}<70}Mc>g~h5QM8xj^^c+lX zb6V&sL5VwPQf3H?_8VN?;&OoPF)@W%PmK1%r9PtN33RZhz&k(UmD|ACi`<=dP-z97 zF$Amuz6)$mX9Qkriu1EJkY*aM^MBh z)WG_Aoug0~jnEdsT4g?RQI}9U0JM zf2>A=!)BQM#`a#I0zb*WzOj82)IC2x`}kXC(2Vlwar!UovIX%^uB5Vs?O$)5>}>x# zJNPeF@&B2H*8P`l;ajlP)M`=sAy6Km)l4S^{DTy^AR)tAiMm7(WG<~3Z-ZrMy-DxCcNI+l4`bG<}Es!Z1OdUC7%WYh6P&iDK63#AYB7;rk$mVqyhG)&T* zF&iIFSj0{xbDlQOG?k}brIm9d3DGi!wB4K~Dyx;Vo(bpOV7P*u2)EE)P-Z$VoP?K? zZ=%{}j2nt!Qlj5^m^{E%xzy3rf}7K5b&n;+uv$Zhfn}Q59hzD03}GXg#0k)!c5&~~ z+uGl*;O=8gLJ^zLY~|Iy!jY3TnE-+SIO$%~aj8`gkFhMUcpFCC_c|mT9>^t at xpqMZ zW5|@04TGxOp~c>;7s!=c)cpF`Gp25}xzfTKahOP7(cS_|G>q4jb62_V&Q*D|o zFP3H-e)AUQB>l-l*Jkdx#>wa_USegdnskZi!XlyUFq1H#O_(7 at 9DypjMRTv-lE6DJ zmMWD&PkDikr&vfbp`#`$IbsCL;%2xD0s)U1h8b)XVf#_(UdKthk8CFwY;Z# zJ$|VdfAdqj4dVDVDWm2^n}?+=Q$J)(FTHFi3kAwilI4k at ng1H*+$o!2MX=dLfV*m{~;LxtKfqph-bKg78aQ3UR#uvac%DHrk{u5k0{nry*Sk!;h-9C3!&$?X=@yv zGEn-(fXLR}NeCU4ezwFnw6}0*^Q_=S7RFtbpqrdh=e{ zxMkg02@JKM7ykyWf9 at 3b;8l zkkI+dB*~-v6MWnMT}S>K^vZQ{7|W-L<4UX#n at 6xgj*xxG)1NkO(6--sA5)}7*BYBg zA#C9w1WZos7SW_8^&7Z%DrJbYSN7){*}s0I}&s3%&Lrnl`^{EVT9Ywk4{P*@sHV zl-r6C5MS5qqt{)g=Deg)CO4gB);Mhdola%buaI3bL^@bHVnN1Mg_XfVyw_v+$A4ZD zI-JQdrl at t1El`#fhh;KD&CF>Scv4eUpj-?48$A-*OtFy+w`wLM`aHmb{Z8iKab1erss#tri*{gKeulsK+cLq>yb at a%y=r0HvasJq=K$2w=opnv)4M zRQjE)Q&aI}=v+{Kv1u$UZADtkT_V;`ld^38s#$0-ZSi0mWw{TRO>q7?YZ>LxVae01 z`U@?4K>fi6YyZba+P23oVQl$T8TydvtM5XcrS8CT&8;Ebz2Ah3V+gF|s(Mv*CA*Gx zy8DFnVi)a143#M)&s>9Lymfu#WW!k5cn1?=W}WZBe5Jyf=E854XmxpG_?&!fV~mUn z+s^D#CH?yxjfJ_#3ZQEQI`~xGt;mY*(`wuOit1LE2{>!4DFigAB^6*p*oeK#b+~T zF4OW<*z3`XChm~nhPZ%JEk#A*(>2%4^*|l6nKo38&~q7?8in`p`Y2h8cU4)bb4q1h z^M;>?uw`_d*KvV+za~fhqIrd{p>l)bLHj_zp?t-+WZqW2<>@NjeQ^ubs!^uik!6D1 zTY(GIG#XT8Z{*tk1M}r~0mI*?2%V{oQlJkePq`ZD4MYBFjZ8smji`R9EGwI9loExA z_7NZXv?mYq6&3sXJJ5qFivf#(<`v9W at s?B^4R^o*JP@;B`+AWE8Wd-;YeU*8 at X9td zSJ6g|&w$A=oJ;mlHC at -ZkwGR6p;w#qGQ1$V%;(HuCfd`6{*-CV)8D++7f)F%7{wv= z%Jcjefdug$PtRsc$8a{I&5E?amVW(1ZWMN`v3w`HX(xv7)K+Zz16}*C;;y9WC~&j* z)uPk!;>BVz(@Duwx|rt163QCDM~&sl_|xHwSGRVeRgpM)DZGm$k`7e_hn3=B_~&Eq zE1{jf&Ox at +jqW2F0C1Y`O7L#clW7{Y&E#Q6z2mP^vnh6I7v?JjYwr~~Jhe-!APPeE z?n!5a=xy_WpzpW5H_hv(G at -Y)?mbRl-vhxMFr=;~)=z(MOBNFA(HB$?trhFd2=sRwQOenAl|lQl?!BAKuUTO<%XE zrxCnL+K*2>R;D+}Z8Mr}E=Z6UWDHHlaj^5JH$DiqgFml{1+a>xrsl)ZM$>clv^Uqs z_nUAR1=5VddwT+}e3I8WO_6*mtZN*!*#$I+4>M54i_ilmf(gye{+_Ev^k|lN3yWYT7upTqN_G!2Or0yZ5-cj8fw?C_npYHaLoex{y zql_6dBi2Z8!A@=5Jqv;nMc`{5C4|!Nfe_p~C;YI^)qG+i#94 at 4h<^b5aWH9qhAU&g(`0pNe7<2gX9IHIII0rt2p1tnMSvkOhWb1 zJ2AECPe51 at v?Sp)ad*V_yd(_@)O|W-L7GwP91%b?QQK%G`z;ehocqWx>i8aQLn=@&Ht?Lc)|ERj z*rPa*5y`5?+&tA$Tj?VzY624|`fug!zo*%@$=8AAD(!iTgFDj9&VTw?JRPv!Wr#9k zWfg1E{`P+QlYgKja9>+{a$h(|D}WBnNhXs#5xkAIN$}jw07UbrjyVTIhWJ1yOwt%J zMG!#3T3SbGkb-ER zIg;yTiV<=861m zqE^_llw8XBjFz6j#aGWYpYbyEafzUWf+0fevqEBVD@( zL((F$Lk!SRZ9(Pep~0+zg|xj+j?hNUeh#8(*F~wJX!cOwHr21iBA3!~51~;$Xkiea z{S$UjqB3vIRAovp$Emh6;>DW_V5Z0A)xL!2T$A=4sph3H0hOu4=`pk zrVxlcj&Z>YQPHH at OR>Io4_MCq3I)KH+8~s}k!bfkcULeP*?6(Mtt zLW=kk30QNASTr`(-(kEYxU6r&cW7^N|592ZZeF at EJ{^s#vfQx=!^5&3|8OsBCX6vK zSfMB+8LuGWlgythMkRxy`nsV-Dl6U_x z-C+(}x at -%#tOQEVan>8WQ3TmmOUa=NR^&tY%>RNmXB6dyMK}Uz4n$&Fdb%K@&uT!D z!&aHf)?3Cl0LwaPKQgK-WO-XR=ozXR$qV4T4nYHJB-<>6qrkk=qpR10f4L(}!ZMbO zNtBQIGC`zi3-S9IBy89wRgNJ^%=ZrYztzBK=Yy&GuN^S(KQYn$U)12=VO{dS at KOZf z#C)5ysspy#o%fV*c>^iikTCd!ssS45az!j?T^X>5yZM8tsWmb`efU4RR{q?9)eUfp zlm!1PG356K2QyZ)zP*og{)~* zA6Bh~Yg9(&`3OCr0SDbpbLrOFTz5YQH4V{Z@)RPBM0z2ke=97cGxEHusblXGKZ=q( znjo4Wk11Tt_y6tq1L~_l2Y>wm`p|)ZnE!ts|344kt)c0NB7tz)ZHNV#Nm5l at -(-wfA8JF0(SCD5_w65AL=7%kHhz~ukSsNGY2M9E ztA>iEZsEep^WeSp>*X=(W2U$F8yHCBRs@$l5GDACGpr6dRJ9EywDUIugq_4*HhtJY zr=nXe3VZ(_`_rI5im!w*zxa!$B%0pR*mGx(mDjz{gJ%kF#ZY at tfxzM%I^-s+sI}4S z!B*oaN{B1Rb(MI{(lUVXNFr)h3qf#YhbeW?Pq~=$b;P414q+nb;bn0Qq>&M#i z$0BmD(ohJq*dj#zq7x(JN^ouB(;Dv!B1rfW#f8*Pj1T*7ycn%h(TW5X1B`?#S6v%I zY-z|wepm6QWlFt?qme?pnqZxWwfvw^|VPkM7OHBzsd^dGbtE;DvibYAw zRhEHd$+FM<33f at SUSKCzDfqEf!e)@|y;yz;>KJ~c$*csz;d~cZ05?Q{~ z*ClD0KT)@qG3pSp4kqxJXgDX-9oT=tT;tnokS(%IztXe553xursLXBiNMjcPnPdZa zvZDf;xB|e-D=;Gy7$zJ^))FZ)Q^V$3E)=(aPl9lj&Th;s57SH&Nd>0%Qa}=4Ac{np z$50n46LkS#kgY at UKrZzjOvgugf|(iQQ7XZe@;RNh)fHd00_^m;VRoc$@pQ!5YV=0@ zmPxC?+|zy#E==3l$X_j~1#I0Sn|$CWHm0W`AL@$+&_+qe<#(f!lC8>TQl+8q3i2F+ zTq0s(b%8V=Eg{jUxshGk#ar;Y|CT0$3LbTLZVA?8JAwx2>+AMz57+v&T+e%k-0H!G z-a(F==J{@{nL&OXuZ4Gmdquon{)FcT*)zKg*2ieEXJ3c>aTKai6Z#k}pDV;Gr5s$1%= z;fGIQHi at BkuUs7p35q@9nYs7Lk$~w>PJpZ8t2)$*r^8rk^j?TH+{)nyne{KTKV?tb zS at 3Nf578QX9#u5J^`?6cg{|=(cD2oWSGY0V{vS2LrCgR}rG at y9C5WtxK-l*(S!QIp z0b2**OFXX}qP{`VfxbeI`~EwG`fJfbcN?qIvaxQ36+a^=2*?+=iiR$yHB zAhOQ^W$xCAeK_qw_0J at L7hki4=^e8(5E7~~=Lo|W>mm{<%HIdrRSxsz at 8>b*o8P3g zs*>>!gvC?9+S%jdNF&nmZ_&>PS$hBw4MZH-TNRu=t+(*CIm`v^PV1SASI<_OZT1``SaOz z!`0dQ{j|UUM1P=3(_t?k_l7hkOrvGr3txJd2Ol{KlYkNxDnuK6i@%L=7=QEd$?y$l z$Q8th4)&G at P7rZdPe=e>k6e%)8#o)Fp_+GIqBl!tmfu!`fd*&1d at 0Oqx8bfV@1Rvj zhfq>p%Oy!=sPUE*uv``2%37+kh&Cvf#~eR;q?D*~Noil5F6~ioyt)i{v;iO21>dvS zpytXrqO~y9MC|*dGS6Y81*EGmVsc3u&yj(DS$Jj}G at HRm=Q3cZJsHYrv$Zdz*RPyv z83E~ZX8M=`D5=`s8J1bzTk1_uBG;Eggg{jpyR at wC7OFujSAK1821P3DlZJP=MK}eb zuFZ=Q?Z;1+JnKkjWF*U%;B`|PO0um-mV{d?G9=4}zB=Y-yrZ1>Rp(X4BUh at h-s7km z`s5!;rs4sre)71)&jV9c=e7FR2O4|gl;PhFV;3tM;7`PbpUsSCjAgi}<7jAXk@}UN zHqf>Yw`JJ0lf4(n$@DjWEB2>B{n$ zm_v_ Gfrv(VInd#D4EywAAg`-?ynI2>1QB%Zey4{En7kxZvWQfs*uQpHP|B&{M zLB90OmT23yZQIyw+qP|UcmLbAZQHhu-PUf~?s;bBym#)rap#;?}cp3nd&PJ zsAbWaWog?#7h{k_g+_GRYY!moX->Jd>vYV9ii=@jIW`^EtJzT_U}jSzskcbF2&|Dc zvvZzzLyh~`Xu{g at EzDhL&n_po4yIM@%@a5ujJ>bruQ0OWFlD3m31oLXAZI)tt36h4 z?#+#H=Pov5*~n&d$T3^+FY()Bi+uPBHda&ZYo>S`debgqgJ5mW!@GUNW7EcCOClV855uz2 zt`A7o8O-*I_xIs`00$!%Q}^LL&pXr4jp{Vh{eZl zp1s2XPWc8z6R{{QIbUO(VKtb4E72LkA+A4=Oh^GZVlkvCiS++!F>ccVDyqi+Kv~E& z=M<#SKCZ`ZHoJv7LNkf;&xDt8pIgOxXPV?5W3kgJ>J{NBP*JehMoq+T at T@Q*m{_M)Yn>U?gm>se+PIS} zQaK>3S+25gJg^SNJv&tzcl9)xAl6+LJamyFT&r`RR=CWoIL$MY+l#Lan4H7<4lxUR zdxy^vbjFVQ?F_{P6KES at Fp$3)aVSM55Ol(Hb-ZpB&Y}=7?+9s|S2C%B-!PCq{2O&O z-&-cibmXQyM|3P_m}WR=yr}_2mopzYqSdHM3eNsp@?%(#`c@#TQ0_Gp(86f7yCy zm=ide{d~B&2>@=7mIedfirynVBHMx?jow7Tc=NVE67ZdldqBAsX9_2WoLw-!fHYak`Ws at WTYk9Dd627|WjW1H%ukxdP>Pz`zcXI^Y3N z!pLr8)}y~XNnus!)g`>nCM at Zraput)4KeiiBbvAC6gL~K#Vsz!hzm^TjCSL)+(lEHTyLY&uhE^R{laeTeftgzpeSm z*wkgMD~jfMeg?mSmwQKi-)7xfNEi2z7gN93kn;ka-{LliXGLz9?WG7uj|8J;jGhL8 z$*}@5+K&V0yv89LTmUO}L7Ikh#%Aj67mI6pW!KB~G2R*>qyq}T0f|(Jr+=UvFJ_QGEHlMCQ1w`V7 zfUk>o-qa~6 zQry;|RCSMP?kT|4zHuE5X6BjDcL#1woMZ=*wDIWzO at L-5hbwTd$Na<_-Zn)DGBrQr zQKAj>JGz=8)=>v%?OP at v@kf7eCD``T{}I(_gyzhcvzz(=i>)Kv6VZm8IELVVxX^t4 zH^{O~FtySD2ePPO{;MG&c{f{I7g-}0*MCPWEfqX7G=6^Arg^duByp)A;viFw^k31i z(Nsp*6pf@^FNd-wV at B~C_e&lLSHBg zs>-o5`Dyp{JCmkaswr3;u32lUXfq3H*%3U{swywfx6X8!U$C@|Ky-bwkUxG^$zc5; zKK_G`YZ}R&+rs_*Ue$GR@^_^SpsJ6W*f+&oaUx2_(F_uiM0w48DzPcSwOB2K at 7JvQ z>Co4vlXR*Yf^Fc?K`PKnGFAAuOw&+koHIc`2dh^x03(~Q^HlXU&0W+HWdt>ymSeb~ zX7nta#O^GFV-4_;T~}%J5F`fkim~LZi5)o$9-F!fV>4~E&4hpkZ6`@toZubunaZZb z5T{9YAIY!6g45}TQE*eU)*J%Gki0WnsrCSB_$Ct1&tDaU?J=10um=aNS`FKrD|0Nf z2c2Erjat?6kPjJG<;Dw8*LpK_s at aq!eusBC)#>my3VMs8ya-_TIY?{e8I-nvxZF$l z%TC4S_GP!d3m!}O8MWtEx6++^$iwPAJ6HsUC0KG{SVQcvzuJip2^LwdO_WDLWu?dU zf={pnQtyx)#?v84OE<9nmgil)CttzxSPG!~fETeFUNWLdc8o-R1bb93NvuaG&73Ma zRcbGjIWSHtqi{dnmCklzoUPtIIdlT+n%nerThpCgi*Y_?qYzt-^JTg-%{M-KFy1`^ zl<`jDfKvVI%Yri`RiB5*R$n1#yrqKIb0O{uymx&(KMzTLF-hbQ|uF5i#pu<@^IxGOOexU zx;8Uq^SCveE|L|_Ino0u at EQzB;4uI?j;IrV2z=xT^yWtBwJL&Ow#i(k!z2Pctq7D9 zw>0z_TV&`)mgYxnI{g*<>hgHvFXF3)7Vi-$$u?vWjKESZNfGHmeTwIEg&dkqxmCz` z>;~{pvI?)oxiiBb(21=s!$0xvx$=o13w33lz>G0K($;8Jtg at Wwy>`g5V at u{mkweMD zL~K3?D)kTgd?feQy`=TiP?+}#wz=Y~YXy at 82Py6bGKxFXLLnP{kxYbQO!&vAH#J}X zt-7o9cf_O`1PG`I0tiU-KLsldGh16>GfN|PGgCPuM=}{RFI9*Cv9d(O!QS1>+11SX zU&Zbcwf|`ItUXiVwStQdaLz}r1!q&yNY`|Oq1q*gN`7_IXF0d`*wn63d}(Cp-85Q#Wx%BGZu@?(Jix8c{z;jzz|f z!Fgv*O;auyrBmTQaI}$mSg-2;)l~g*1GER2aoUhhoUaS_^Q&o2%a8pOjzEc%%p-6PoBY1d`vIfdiAKQ&R!@_+W zJF0$NnNGni*u5w+k;$}@?zEkw at 8jP_qE-5}O`2u+w7zeH7ghQ}FxkSjWK6 at jaco!3 zTYaiy$NFeFjoAz`R#MAn{1I}Iz1(CE`=F0IGB$tCmt2Rcp?3LmE^G$QK34$l(hrPK z7~3)gu03v;2s@$vv$Sena^};0uA(5s>9v7OPcz at R;Mew7Z3I^bf5z0|XG%J+wCzx} zWV1PEqxLp#O9WJ*!Q2o|3KTjTM{++jC{1%Mf%6vT0RqNTF3qJKo8^dMHz5`t at W~YH z+T6VmKin*36mK&A?L$Yuo0 at t6BYj53uCnb}GmCpZ__D0%-VK at 0(}`e;OW$Y%s>w at i2szjPc&D0^5l*TU&H6#5;-mvV>ZHCV!2z(NYc{K)&Mv0i7E z^-sIl`jyLu-hCy7T=ONE(uhAm6D&aHQZHWeMXK0`>>7z9?5$Qb)RW|hl0lL#m$>%H z$`^{Qbm+Vm5P7{A)b#60!Ty-fBhIS9#2z3k^NMb=~N78WnuGFW#*Vd=D zZe~egmyT3dw608V!{9$I at SbMM*^lXND9UOPpPX0loH=3#^w-utXiKZa#&L6#H<1^i z(Bg_~9Wvvn!{tPm-X&sho at BPpAf}-D{|W;08CTkKnT5hx5mYJ;Q?{p_5iVC)5jE?U zZmDD+*B-+jq_>b;m}=-bKwda7I(f_gOJjeD?+}jSj-O9&%v2pR{>ZoO?^20=&)xYO z^}6Kd?~J3xM at Z`<=Bc#8s+U>yt;WaNAa=~f7te~(+N4Oyl+4;wVg(M*P?)HB(}!rm z*haqiq|*b}Iz8hcemY=$IgjTWxI5Ms^FIoHpNIxB7RW@?BQ)PgjhGOUzE5 z{7u0(oE$76M3oL_j1yPlAU;4RVj4qepE)(yim+6=ev&#v516k++LFfAF6f7a`?j;c z%{F%dtUl at 48OWg7ZA*bxYUxT5*HnDnaf) zvQe-`w`Y at a9s46H`=$3rlNnrna*6S(XzWa*2C_KXaw^>h4A361?d`0wf79)|u~uR0 zWR}SE*gkIX at +`#ESKwzg|^-I*6U!640zX7w;+e0u(>vM%3&u5Hn7l{VV-OkMPIJl# zDtJ*-TKCSai}dTsUs|PuGTO+j$qEjS)r(i8Hu7zhcd+x15|s$AQ{?u(D+ve`}-uRyHM12W>BKna71X92y`s?2T*f!vknq>O(`zJNutCVSvJqf|<)CUGs4pM9`p&{JKEB?x2J6Aj at O1*Nl zBeI~Rqv=KYMlioP>EaY>5k|$3=(`cYAr*LDH-uFUb7VKIcbfX&rm(0#D3=mtF8xFU z at 2e641DxJyY1F+%3HxA?#rr>i{!NqD*+oDFhamuAPI-j}-s)PH6mp9EwVZ!wHocI+ zz+hxe%gVIcE at C}4{@VNle89T(%dO!lHRuq_?Z_`W1$k78W2r7o5&b>XvK0R at Y){-I z5Jkac;o=AO-&pD1y0$6*#Ig*u|7s9K%-+pT*y?||p~i;+o(B4ld?0=!FEKIVMttTx zhn10+?S%v`Js2^VHVTS1Q5Hmz`+AQSMMjR6hdHt6=5n*Oou5rr&5ebhsvH|}^Frpi z!?%(@-^nZ!Zxb(3ecs$w$IF&W--*v$$H~^8pU;;sL?FJ{fU0t`0>hvzG5cD_rr{Yi zbOTA at 5zHh{U`C3C2%Al*PZUlAj7#@`8M~gT&r^3)yWNQ*qgCr+0MQJPw%DYxPOCU3FeTCYQ>9_!JD+ zCKA4QtdeTgjlbcI1zB23?r at tty#B&L&dLL^$eYf(+s;kV3t&HGd;O{-&M}2pZ5VK4 z>8vC5W`An07mX!^%tDvD}|3M#5}f0ydp-MQ!hEC5 at 8S$mBYwI z^^bVrszlIeORtr88)*M#pQ^-(2Q^^~_g7Gg;H?K^hS>I`ZwqL) zfh+I}NaAk5fxZ&^4NBCt12Xpg?3Z!j#d?Nk!)r^iX0V-)$03}qqew!^pX{A!VRc+> zbIxYonV1bV0lbnvJL6VUi&D-f at bZB(VyPI`05_#%g&Ok at k*9$wg&)7CE?L%#hL$b# zle9-e{%7km%Y@>_m3Ji@=Bp1YTf?FR$qy&ZB8026=*`owr$x2M1{DHz>jv9)W9MrW zF^vJ at ya*!;z6H|}dbKU9v~wvX0MY(x4Bn)OjkC%SKgAdEcZtv#o`@2uqmoDvW(HMl zSC}MGg>H4})T?QHG7OJ(bZ)~obC>a75gMP13+}v)*%tad)KV|q=?hpAMmbJ~)VGzs z3>}V0AS)aYB%vHau2CvV)D6tZy%RVQkJ=7 at DhWa+rA0+qhqn_d&dq% zYULcF at 0=#~(?$w5l?l3wS~;s73~G|Y-fYdA+BB40^4j*x_1bn*dwQssknxPi1yl6m zK9Ld~k{C|`lE&g*PWfw%jn_`u>idI2edcYK{YpX|r^X9{2CFx6Tiq4 at teJa^gxs5` zxYZ5L$#3>5Zm;1oUi3~vwy+-4NDy>nXT?g>G*h93RiB@@r&B%Q0KZc%6 at 2S{w_0Sj z^U?*5$N6?nwrdey7SCw!xT!mdJ7(`P%kRTSzWqHacO%|3@=V{vQu75#ej+c-$v4** zeA_PKnMakZeDeHI(B)Py?L{urIaVJ!mNnGrC-7v5k{*S(XNIM$mX~6U`Ckf$Fqssc zOH-1r8t`p_HrLRWSYouJ!eGyaP(zQar*S(@(V|edTM>r#Y(z}rh$&`y{kWEirxJ at E z1-WJLoOOo09zNaI_+(4lZ3)sZTL5>~{N}7ruxzpy`8_20L#A0tZF~Z((Fi!xIatJ( zb&*Z7fy!0O{1sHor-W3AC$h}9``e0MDV%E7)NiCo9nmv_WV6e5p&<;1^~UHN&cz!e z%rDf?jaLL5T=jYB;BA*nvK9(5piu>{zzh1oY!_A1ozwmX84vx_}0m|+gz9=ehukJ zq6LWZTw=7neBN at sLM62yY{iBPy>Pvp|7WZiSrPCh+l04?QH%DvOjck{!3kYsbFPt$ zzjd<*qe%d#ihilUX1+(K4>)AySOfg$%Qmq=M~Lo#KAoW;hDgRD0p5f=%$19OsVCir zAI8a<71 at NXUCJw)kZwMZ=kN}N2^_cRFoC4XLxK<2I5mnZdxorRN2Y at 87B2lE($Y=& z;y-^A*7Q>h=AIp=Pc&7(l;%#_5>{jY17Hc87h`Kg)f at _DHMgi#@n`s<3-DGI0$| zJa?ca!6=D at IL921z{o&M->0KR{2#aBNp+mYn^$F2vXql{^AP1VGYBj&u7Cbbyue*B z0lep**zS)B1Vr(l#&#t)v;Su$VU5Oz3$6zGcdgk)gK{>Pf3bY_s25wx6$Oc%(*Q?7 z>tQKOZO*X0EDDvDjEzo1_k|=aW$CXVKxV4NZgI)4si9vY%y3I&rVxOW7Lw$F{1?+NcoZqNHjK)@#|5acZ&IA2$OTyMxaVoY3<&y3nK3lToM`-q>L>Hfi)odvk9*~(%_g=vyB}~Xgabu1W1sz at x53xi1A&V7o_Ec6CtMju6U5cVJ^J>*h z^I&KOGwB+D0_amS|ZKhm^ozZSAZ>8q~ETbNT%1?3~PV zxVCEggpoJl3|lv+r8ToL*F6kRNl(Y~s}uEgdn5FtG#TmDq3kHvIuAW{`{F>$JPZ0R zAOHGERHf0Uua)Fn-ppC+5EC_0)!o`cszVVDKv70=f)OYU4b0r=9*u#Yi6gsg0`NIJOjrY`aGRa09^0W7qg zJ_GWJi5YA)h{s=Fwd5R%Dmbnct?>-JAh}YnwW2WiZ4Nz(?ROpksqK^`Mj?hDHJqn6i#^T1uqNj^aqe>1;A6@&FbGe}PK=aBTb1dlfM1xPyppcQWU1JcW93cMTfy4aUtt`}Ev&ddR5jx| z<6t1<=?6KKjQ8_uU_&iz>EXR-v3zjH?c=u=xX0czdg8ZG*5%7 at AXi<&t!qQl z)pXg_jGgJ9UtNDK?ZE`owifI&FoaNa77OK>)rTekArc27vmH>i?qfx8 z+XLH8WSQu`IBx-nKu;+GKUOb$rvCVFzTEeFLset?mF!cAA~PVIh_tTy(AE4dv873z zkz~%Y;Q!-WXLjnZppTZ722aaD!l*BMpGeAhg1rxZ-*`G96M(G`fu|1veTf8+_Nt(a zj2Y?XGqT|~w8DReE89V^Sc<4H%z at D|taE#^I$0Myj#G-{S zi=fJk8tSmOiBY*Q$|hp5j>r)$b^LN&Q)`yh9Z6m7%yBs2coOKV<6XzI^@0DI8JMkY zJvO|@(e~p?GU&New}{GH+(2x2!f9P8q+G^%=l+~p-&(=x1hnGF>cU0-#TB$e(08{y z9fc4GkV at +l2KA4j_=M28)8Q!IZAkmf6?=okm?O++5M-_wL_IdR_5WNcJmdO(Q#J~w zA&kN#e~^rRYxVsRh<;$@8(&sA>g^LUwrtUp6C at o6KmAR%_Sx)&1w9E)AGt}L(w60V zX&t*wy^(Y5LqB%K5yYA-lkh9b{SL-%syuZI>d`HX4k3*8P*F>~ol zMN8}?E>k3J-W|QIF9Ltc at -kxFi%QTTM$_~|lm7nEZVY3Pv!=G*Fy at Uc+gJ@afb_C2 zDLH`YF+lm=Ao+(A^b_$K`E#4X+EMcr39|(Y!wm}^I68`mA|#lVBswJAP}+95dL1n3 zun3PaQk+&vrMisEFK2{qP_%JKI-|OQoYG82elj&XnVy?k$62{`ub9rJ%og at IVH8hA zQBr?LWbrPao1ip1iDl at g^T}LMFo0wh_}|4SEj?QhLqLFlS|EUcB>&R`fU2{Ry^Fbn zvz?jg|2}m7|9YWrW#;j(DIFaL6eXl at g!vNKs*#O@&{g#kw~pkLjbX at 4iVbVw#)UAF zQBKVDg9;z!se``;R)rjQ1B82VEVEjvEy>dH0!*wHy%}%Ejr;#|6?X%vh%j>~nY3_n z=sHSaVo2(+AH+n!kdGIO`(vw(jo#XocBy#j6;CnUl60uBS9-zCXGURjxa*W<-(Pu+ez?#INR#nc_n)(EM-V^2 ztUE4b%V^SuzFGIsWHWyRj!!ZX;eD;it6!XVg*?v<_n!m(M#0M2<4 zgS81aJb#$Ch@@U%A`B8R7M$;BHP3ht@<_FzqfPhGa_|-=GzVz*|HrrX$Q=1PQ+$PI z4of=oJ;fWw>88wW&cVZ4ja|Th-igRaWDXFB>FV!I;Y(G86 at JN(;WlRgM-a at Cp}SC~ z^X8e%H={X85|8apDsw6F;T;hy|H5=6=fa1T&lI}+H%7(rkvl2KKbEcu_FqZ&{2wj- zU-AknHV#WnX#Do?n$q)~1Cu7SxYfUO$fS`Gi7TZnag>Yu$<&`C80`C!!z$x%NK)w2V zH-H|l9_ab9+^581pVuY@}Jd(kVxL7?nf at okBZiJ-G1!k&6t9-ur;^0}FNa;>RhUH|mqKZ!d_A2!f`|KX`q zt0eUzvbbyd_2I+QD%Bu#Qzons!H(047b5*g-(Mn7jp_{=h84Kh^?+U7w)!5qD51^E zC1H}H*-z`qWxdy)bku at qSP&wrC7z;D1P zKK=(k8<77i*^d8{W&NvdvH9Pr+CO&outuP0RLjEPIxxh*$~4+k)RQ&rDWxrn-UHTY z_5H$)GD+|yY8N#-Ei2x*qu6721>Lv#teNV(hs$NNuM)54zkhze=4_iym>C6zWxG7{ z?*4tzQ}}+rc at YG1-P2*rj_*z%WQ)r%zWjYzVwOtpqCcEq2jo=I=8CMzh(sd?EOxGfBP1+H(uHmm+={5X6)-BiCJz}q7>yge#O>7(z@=&Y5fQhy&r6o4i1N zQsrKoZw*XJ$+4nciz?ntCp~@L_QNYG$g4_zmB8WJzF?Ofv!<_eq_kR6 zMa~nkq*qb6>X{P*RG7&fk`7OK{1^C(*0(+s;>J3D<51(askg+kD+>jF+Mo76Z40ti z767P{KS{`D1E-VO=C(}@Jv-?Y^AR>1ftl%LjH|gIICl(jIv_hD;UW(hPOz5!Dj at Ik zjC)kxp52Ul;G$s7tn at jXglREoeoRb+j;Fgpo;yvHhCsh%x5MzHT~KNENPVYM6+C at u z_E@)$oh15CurP1IuVKOq^TyIZdI#5R-^710<`z+G3()jjTc&ejM9PO#Q at c`7kEog{ zbFfkln-{O^s;;cx7LU#_(jshU^^oEA+NwT+9ZbfWwmoTLPORn&T<)GX&sf)62Sj}p zbJs(|Bt;#ZBpoOVD>pAAWkur!`}5klvvJ_jz?`vdS>lM7h{5#8EVR+|U3INAGynQ6 zL6~rPlg3R?8u8{E0tx_H8H5;W at BqE0m)Fn${gQEA{82;j(E3>H&FjVE3S`;9b&8*r zbImN+7V`1h6KMZ+3yc at H_laJc7jZ1gT2s=Qi=@jX+K7L?;Dvts1uHF0PdB%{X*TIyZ!G< z03I#IDCNM?JDm|92x8~NvC?uu*y;9>OWvif)MLd}~)R-MY?Tiv3M;-;_ z2P#k_^0`s+Z9qZUcr)^JLG!s#p~cX!fKVb`4m#p~mnB%_qNX>Y+1sl at 1B>Vu#y8BQ zewn|4(3`22PMb!;;RJNy!lBhhk437I29skPjV1XjbwMb7-YFN$c;8&s^dWS#g}p4#J?T62quZjU!{DQO>L?=v_0|tmP~)yWY^5-X0TpO zg^m$ojXG+ow6jp1rk9fA+_JfA5X|X?dQfx52>QvjoOty9eIuiFY%gbOZsWH%KKDl?E~4I at Gzui%-S)i!#IuO z4#@0bqt+f@%P;$&htvf9ZfhLu)?g9Tve_MRBS(f4_ at I`(_UU}xpz<43)gwTy)W*dV zkMq3ahQ#3ta9u6 at zvmy2H_C2h;6Olxh(JKR|7q-$v$B^n@>F!Ta&WeC_4*&>NHSqJ zD_hflv1D at 8bzD%*u>3isy6ie1;|YpY5k?}dV2b||Wde+Kf+02)C8-ogI_3IGVY9Xy z{}{s3cnW-ix{bo({~c9I-&gE+>b at Ox8eO;>?c1xX at 7-WO(N7z4_=qaR~T$ z8BhRvzqO*5C)SGMDE?&2J|1c(RM>+PlbKXZtp90PccgK5Wx>u1mx at 0?;egK) zpH+wV(Or3%mMND(`Ltr?Ez_>F(?;14XDClwaokybymj2~HW0Q`p2DikX-f}@O%z>N zR{Q}{qOtXlEwSUsS*}HL(o at e_YkaG2s*1G+m?KJBBBqL;6Qu3oa+F218i}%MlH}zW zt4rrBo{=#bm#X>cwy^bjAo at L5rzR00{$=;eOn{f(VoGPPuIj)miV`6;HRLkM#Lfw| z%3z1jbj@*vi?bdr=MglwDlPc~OZh-I*Qv|>wS{f7hjE-rT$B=_`#j&e*vh-M1)N~m z-DO-8r#jtTZQ!8{v}Kl;H=rX0b7o^~=DiVlmeX zq;$$}L962$Hr~>^=hlvpy`Jm{?VpNnBO5IYP6iw97-j2uCRv>pc5h8G*Azu{Jz^+C zW}TAPOqk>O+WaI$MnlB`dA^Y_85s9`JwOQ&WaU<>GIai)l&xC)m>ISMRr*+Pu>NIQ zeHonsb$f6X-lH701GOjanyIeFEy9l4Ey0e)EwDiHT|#i&T|~%lbTJ{}LvI6>CMwn+ zGPasZ({o8|hIV(?+smWZy>Tn=jUJ)g1HBRFvSmEjI4wFmoTW@$QgZ&OMNHJvobd~u zx}yWvQ-&1cEU?}DlnGwF70m3t@|r3UvT8>|YfblAeMy!=TNwAcN>d&Zs~GzzbPk?A zh^qn5Zqti0*;QKl-=1RIB#PA#TE!iVU|(3(4VEiY$W#I)X_o3U+V>b6Uh_df zj6xd at s2^94N`E5V%F=DD#K`4LFt2JCFAF+IT at lrY=kQg-K<@E9h54h(->_Re_WH!u z^!emWa4Ri80l)f4m<@`6cTq0kFHt;%;c|tbkZ2`ha at jq)U_CZrX|4-a5H8)&mGwe1 zd3ysdyMXgNklhLpYS(9iNuJn1cSQyeEeB`RVAwFxEHT`9VW`-6J#>K~Ibs%6l{%@qE}lxeMj{>9xbu zzH}u9kVErnCxn#?V!~`w{A>fl3O9(hMGh_J{Me)9gjrGa|9b;U zL~;SW8W;#j3KR&4 at BbSAd|54`54Aw%PUx8 z`7U`2bJW0@=NFr4i_SC?yySXZL(|4n}bp2}K!CooLgLG#j9ZI{mr>2$B^G8o! zl?-oht?(C39CSW`ZZtoip-lMLvNLgY(!G;f9UI#o0z%P;PN_5xS##1S{VsykI%Mzt zL=f2`977cSKo&m4IB*X8)w=%6KD*l(o7$_BA2npP+GVhp>OieE>{nxvxiSNSJMb$u zkOLjjUCXHEly_`VzbmlN_jl;XU2Ga-zzH9$NOmFF>|PXMI`T<5lm5(-rav%Nq3$X% zrDp#X^6CNlRG;yi>0dkggtQ`FO at a+{n%{W#LcS_a8CLOOPM_&}%m)Z03wX?=tkuA--^5n=aZK at Ey$A`%h{&PNK^|R-d`}w*2 zBc^+vKAqoWG544E=jCVjC-3jqPw#^Z(B_>t(i4}CkQ_&NO!|R7Lpa|o_#KyRF1 at 45 zQH0g?4A|`(5sg!>fq92l at S5Pn3}&z=%s&^7!BIrimTyFsMY~sO7Ng5U3Q#Xj{~BBJ z$yKwJPDeCg)RabWC3WJ2RjVncQ{@ehzfp at -%@$X=s*_DMS~DYCDZ5n;e#WDr#OLvs z2I9>WCZ*g*y;b&7K5yLoF9wSZKdmA~CRiNzZD70kNqC%-FgscYosmBhr88Dd2|`e> z11ok(&$cQ)Un5dg^Xs(*c5X!7Et`{CBLwg!a#dSCoc{I%q>N90myV8Fq-ZS&a&mDv zuar#qWJuX3d?&|av0F!OtQ9S2aI7)sW^!FlbZ$(K4-D`2ZLCJPhd2;TXQ){<$V?5E z`hPtHLd at h73XZWaqhI|I;5DFvn at M+fVCV_(&PL#sZ=fffo=g8SCob8ivXjkaHji$t zPMB(jkI5?_?Yb_`Nh!QKXt?-OubY710H-ceVkf__5v04pS4YfbQXE~FK>>{MP}G{j zGc{W-*&%L2MLLV~J|TJTt6Zgr at l8k)TF7I9+woZc7?OKuX?rWB2TEf$(Ki$8lVv!}X at dW1!7 zGMY;Zwdp*@&pC3IC at WD$S5d at dta|#WaDWC!7cKpX&C#-hH(GU)4h_enMTL2zX)^La zRoE(xYj<|WT^MgdVUzkHf5dyYez4Z=vKvVtY>Ald;2WuR?}Atq34RZkSa;9`SQla6 zs~bre6CosiP!Z~-kT}F2Z+`x60wpx=%^YeBi+LuT at t_1rf0P!u8)vZXRvTy+!3e>Q z*!FOAj~#Ri_hd)O9>82|GzT}PVr~A-FK>8iD?r+J at L@d ztk!(bP2)MRT%5tft6U5+o8b`&twxWa>Gn;T}Wu0AmuR#zE*OBE+_|HL|RwuR!>Nx3W2a zNXVq6IifW`6d~~PZULkw>iA%1ivq`GdR>}+B5V3!h_Ya6h?C48CdZ$|8CAev{LBmW z+iMO+ at G9_G!Ry`JBF^I-qIv11n8Js*{A3+jnY0$4w_&rO8k%QCfpkLD^+FDe=dqr^ z4^`kwTr*Brq{T*}?1pFcPKLx8_OEl`4$a^{A!Bi{(nHD1*{0_PLzuG}H at 8GbQOM#G z_U}gDgu#zc%e)dTNO%;CEhh0Lsu~wbC3(^ilq3iKE1Iuu!WeY~f20ZuqO|vSQyZlAqBB4EuXQH;b6cYul05<_7royLH`_0(3FE;Os8EaCGq(|7 zG-9xWg(*}HBVUE^SB3bz!|s=+BfkYRD`AO{ZqAwR+tyQR0rt>UwSNV0?z2bFctdlxEEUymhT+ag=Ib@ z_}-#|+xxH|#%om6L%sF>s26oaNY8GkbMMU;gkS8{jBdX;6LzE6jS0_3L at Y6SEYVFn zPlx;$;(jkHM2h4hXa-A^|J8)^Y7XPu5b at NU?8!i(rp8~9R)s9t!d&zocLCatio7Om zPF*Ty8Cd8EJD2d3`a+VBsnjU(@GRl+1 at 2w^P58VA8#3%xCSQ0Hqi0Bur3z_N+}ua}FmZ at KAM$TpMHR{RF%rCi9tVS3R%!pzK!W at 5IR`D# zastPdQ5JSHsUdB6LuWmtT1|o-Er>#^6wS2W16%2b>G;zUb;19MpQY%2qXssHAH`ooqOI z?OEXF8(qw=ALat`9qA4tji}eh36#eM+V0VQ^frikbo=dWt?A(8SM$95Ax;InG8Np{ zmS9ZGkg%LfYG6QNAQ+eK8RYv(;yoPOb$8J;bc4K(cQcG@#>kp!BB_RC%4`hNq(AHa}l9O zZdUn`2Yz{K*F;O_;n{G01mCh37=s6L$3NLYh;&D2ob`(Q98OrIGA+{>5l7$T&vMIJ zxzkR5AaC}}T*suVNXQH?YcVv at qoHJA%^NToEqaFX=3;6UVjF}_zA2~;Uf2hNTqcR$0Ns at KBq{uM<>SNU%Cu))FxlIkXG z)obY4Vs(N`3)Nw4iVny_miQNt;=QyDQXf%UUzpv!HB96yBZ)7x at E08AeOTg!wI_9{ZaMjy<^En!?;_?33(SD7ktnVP`rQty at 0 zF}zw#_Dg)&iYj_CA!S)#$r*lXJ~;2wKGRcvke;rbUY^2PPVEj%?aWjYdhft*Uq z`D?KVTK(|{bG!Vc&U_!aM`BApR7x3r{=@ITNyRSsF3=Zn003gd|HPC0KS{;^S|y!L z9SxoB|K+>0rH|u=`aAm-s_TkLM+k|KKfy*ip(o_u9D*Ula)6{rAQ>S^sKq=jXJC+_ zX%+^ds$JFaj6@%?wk&PCoX=`y1sr_x*kFJEcrSk^y63Hc|14_DWA5sziKfTKcl9;P z+2`cj=k)#a5_jA8=>>r6&K`|%h2XPjILtVfj4TF5r~KIM6~doqv;j1QMtw)bH?wT6 z at uF#_Z}jq)fKNSEeXxAsbm~5Yq4qGU`rZnmE<`b`gP<2h47hiCQXlewrgyS+E&W3a zv^Un;dx3rZCJVJa78_M!U;FEw4gV4M$D2L;HlzXHsruuazz*ymLX|%rVg58H`dT6$ zjC2_T+EUmp=D0rRs^yecU1-E~D}!a*(0G{4Zfm~TRn$7mZAN8l!^3#@EENHZm7I1a z#|;M3W#n^g_Sp at eyhOlkR0cjtOg3ONKI4z2y?FwKc at uAm={De4E-r<00b5nhV)aDp z67te9T?G^qp}g~q=WKdQ-8}Cihwg=3MnGpx8%2f;#fbCGM^XvymFlU& z{rLbTEwd4gf{zG`ScN)G+y-Kdt!iz(^>nG%_b7GLX!ivuPM@xa|AHdTe-W2(+a7|La;I3m^v{A%}LzJ-SfTBjoN(#B28Bigo0Gaf37835epk6Mw^|959Kg5jn(#j=-gP) zhUrziL-Z@!gY=c1&<BE3C6ayt!1oVV1FX ze!-O%p;foBK(?~HgoRFz1|WOHNMEXgR}*Q<4Ow;BnKDvqUtY#M1}w5uqTh|sA|op3 zJeMKore%I at Hg!oT?zgJtomfK?2WSEHC6|0eC73U`N?Ffgou*n`phyuW8(Q1kS6WIo+p=L zi>TRtT at H#J*{F13229LOv&-w=7}EFxJC|BY?;t zjQp9IjF#J#3K#Lh#q&w`Woh&H(fmN9`uk4&L_7~m!0 zCoODnu*WL?(!GYLFBosHkStwAaayH@;EC)a5`u5UO>bQuf5#O#iG=cp{8lJEC*>DX z^hbT*88 at r;c3fYcL6pt=TmK9O&c*ZSc`VZ#+|E$FJHl8!wV*LtRZYQz{c?4nz3#Lu zOs6^#0=_Du);D}ITl0Abyd1M?r!{i(^}*MzF!Ae${rwwXW$IV7=!@@VJZ at eH(-s}6 zGdMa)Xuny(K`;5B5Mn~J5X-6fohG_&tk;R+9)TC<3cp+!FW=4v^?3>cd4mB>W2Dv; zY02&oFLQOC<_PFd%rI|5=+1P^pVXw}22v_&a&u6x8)Bq13j50#R)1R&H9`_A1(^?jS{a zc6KOFW1m|c-`nIgX3vB#I*+hbCaqV})jJZ>Mi*Ew(rpo3M0rV$$}1(fU9k*D^YaCL zXso8xMVJPB*h2uXO^>aPE)iz86_{Q_;TA~sLV4e zf1xLHsv4W0&g4M>S&0NpxL1mRV-6WWpIBZH^AK|M3=r)zjpobIJNmR951Ks%QC`fg zcb_A4^p*M>+thD~VQB-{7488(E5_iu)q}YXDJn(SFGS=A*4ON at K0mw#&wsQ07N&jx znjNkAh6A4e*q_86|D$ zv?=#8pMDpD97d>0Tnd7%2j;V;X{H{_!S$2ur}9`~G5dOz_mW`O-)R$sXxg{TpROn< zgfN|vPH1Z76}fiGP+Lv@{u{u6x^7nEpLAXjKmY*N|7TJ0FFda-9H1aVh(05Xuu*C% zTC4L3jF1tdV0M1Yq=n_q#218mlLJ5)5^FFF-BcZBGa0801+ax-k=76+`jL}7xVM9B-+4m9^kegU z0mJXTF5Jc8y#>JgLi`>VLGvFTjPZOi!~YHr^?ewCe__}C>;V5B1UbIRgZSuj#endMQ|(&69b z!H|?`ktIPwW^9Q`RgU10ZAizGY=gDDC;a<1TbwFkb